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

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGitLab Bot <gitlab-bot@gitlab.com>2021-10-20 11:43:02 +0300
committerGitLab Bot <gitlab-bot@gitlab.com>2021-10-20 11:43:02 +0300
commitd9ab72d6080f594d0b3cae15f14b3ef2c6c638cb (patch)
tree2341ef426af70ad1e289c38036737e04b0aa5007
parentd6e514dd13db8947884cd58fe2a9c2a063400a9b (diff)
Add latest changes from gitlab-org/gitlab@14-4-stable-eev14.4.0-rc42
-rw-r--r--.eslintrc.yml4
-rw-r--r--.gitignore5
-rw-r--r--.gitlab-ci.yml5
-rw-r--r--.gitlab/CODEOWNERS35
-rw-r--r--.gitlab/ci/build-images.gitlab-ci.yml3
-rw-r--r--.gitlab/ci/dast.gitlab-ci.yml205
-rw-r--r--.gitlab/ci/docs.gitlab-ci.yml14
-rw-r--r--.gitlab/ci/frontend.gitlab-ci.yml73
-rw-r--r--.gitlab/ci/global.gitlab-ci.yml3
-rw-r--r--.gitlab/ci/memory.gitlab-ci.yml34
-rw-r--r--.gitlab/ci/reports.gitlab-ci.yml35
-rw-r--r--.gitlab/ci/review-apps/dast.gitlab-ci.yml191
-rw-r--r--.gitlab/ci/review-apps/main.gitlab-ci.yml106
-rw-r--r--.gitlab/ci/review-apps/qa.gitlab-ci.yml128
-rw-r--r--.gitlab/ci/review.gitlab-ci.yml230
-rw-r--r--.gitlab/ci/rules.gitlab-ci.yml397
-rw-r--r--.gitlab/ci/setup.gitlab-ci.yml16
-rw-r--r--.gitlab/ci/static-analysis.gitlab-ci.yml11
-rw-r--r--.gitlab/ci/test-metadata.gitlab-ci.yml3
-rw-r--r--.gitlab/issue_templates/Feature Flag Roll Out.md49
-rw-r--r--.gitlab/issue_templates/Geo Replicate a new Git repository type.md2
-rw-r--r--.gitlab/issue_templates/Geo Replicate a new blob type.md2
-rw-r--r--.gitlab/issue_templates/Navigation - Left Sidebar Proposals.md3
-rw-r--r--.gitlab/merge_request_templates/Deprecations.md82
-rw-r--r--.gitpod.yml10
-rw-r--r--.rubocop.yml1
-rw-r--r--.rubocop_manual_todo.yml10
-rw-r--r--.stylelintrc1
-rw-r--r--CHANGELOG.md82
-rw-r--r--GITALY_SERVER_VERSION2
-rw-r--r--GITLAB_ELASTICSEARCH_INDEXER_VERSION2
-rw-r--r--GITLAB_KAS_VERSION2
-rw-r--r--GITLAB_PAGES_VERSION2
-rw-r--r--Gemfile24
-rw-r--r--Gemfile.lock180
-rw-r--r--README.md4
-rw-r--r--app/assets/images/logos/zentao.svg14
-rw-r--r--app/assets/javascripts/access_tokens/index.js2
-rw-r--r--app/assets/javascripts/admin/users/components/actions/delete.vue4
-rw-r--r--app/assets/javascripts/admin/users/components/actions/delete_with_contributions.vue4
-rw-r--r--app/assets/javascripts/admin/users/components/actions/shared/shared_delete_action.vue4
-rw-r--r--app/assets/javascripts/admin/users/components/modals/delete_user_modal.vue18
-rw-r--r--app/assets/javascripts/admin/users/components/user_actions.vue6
-rw-r--r--app/assets/javascripts/analytics/shared/components/projects_dropdown_filter.vue91
-rw-r--r--app/assets/javascripts/analytics/shared/constants.js1
-rw-r--r--app/assets/javascripts/analytics/shared/utils.js62
-rw-r--r--app/assets/javascripts/api.js4
-rw-r--r--app/assets/javascripts/api/bulk_imports_api.js7
-rw-r--r--app/assets/javascripts/artifacts_settings/index.js2
-rw-r--r--app/assets/javascripts/behaviors/markdown/nodes/emoji.js12
-rw-r--r--app/assets/javascripts/behaviors/markdown/nodes/image.js2
-rw-r--r--app/assets/javascripts/behaviors/preview_markdown.js2
-rw-r--r--app/assets/javascripts/behaviors/requires_input.js14
-rw-r--r--app/assets/javascripts/behaviors/shortcuts/keybindings.js7
-rw-r--r--app/assets/javascripts/behaviors/shortcuts/shortcuts_navigation.js14
-rw-r--r--app/assets/javascripts/blob/components/blob_content.vue6
-rw-r--r--app/assets/javascripts/blob/file_template_mediator.js6
-rw-r--r--app/assets/javascripts/boards/boards_util.js7
-rw-r--r--app/assets/javascripts/boards/components/board_add_new_column.vue4
-rw-r--r--app/assets/javascripts/boards/components/board_add_new_column_trigger.vue25
-rw-r--r--app/assets/javascripts/boards/components/board_card_inner.vue4
-rw-r--r--app/assets/javascripts/boards/components/board_content_sidebar.vue64
-rw-r--r--app/assets/javascripts/boards/components/board_list_header.vue4
-rw-r--r--app/assets/javascripts/boards/graphql.js22
-rw-r--r--app/assets/javascripts/boards/graphql/issue.fragment.graphql4
-rw-r--r--app/assets/javascripts/boards/graphql/lists_issues.query.graphql2
-rw-r--r--app/assets/javascripts/boards/index.js21
-rw-r--r--app/assets/javascripts/boards/stores/actions.js17
-rw-r--r--app/assets/javascripts/boards/stores/mutation_types.js1
-rw-r--r--app/assets/javascripts/boards/stores/mutations.js4
-rw-r--r--app/assets/javascripts/boards/stores/state.js1
-rw-r--r--app/assets/javascripts/ci_lint/index.js4
-rw-r--r--app/assets/javascripts/clusters/agents/components/show.vue159
-rw-r--r--app/assets/javascripts/clusters/agents/components/token_table.vue122
-rw-r--r--app/assets/javascripts/clusters/agents/constants.js1
-rw-r--r--app/assets/javascripts/clusters/agents/graphql/fragments/cluster_agent_token.fragment.graphql11
-rw-r--r--app/assets/javascripts/clusters/agents/graphql/queries/get_cluster_agent.query.graphql34
-rw-r--r--app/assets/javascripts/clusters/agents/index.js30
-rw-r--r--app/assets/javascripts/clusters_list/clusters_util.js8
-rw-r--r--app/assets/javascripts/clusters_list/components/agent_empty_state.vue119
-rw-r--r--app/assets/javascripts/clusters_list/components/agent_table.vue152
-rw-r--r--app/assets/javascripts/clusters_list/components/agents.vue156
-rw-r--r--app/assets/javascripts/clusters_list/components/available_agents_dropdown.vue83
-rw-r--r--app/assets/javascripts/clusters_list/components/install_agent_modal.vue259
-rw-r--r--app/assets/javascripts/clusters_list/constants.js85
-rw-r--r--app/assets/javascripts/clusters_list/graphql/mutations/create_agent.mutation.graphql8
-rw-r--r--app/assets/javascripts/clusters_list/graphql/mutations/create_agent_token.mutation.graphql9
-rw-r--r--app/assets/javascripts/clusters_list/graphql/queries/agent_configurations.query.graphql15
-rw-r--r--app/assets/javascripts/clusters_list/graphql/queries/get_agents.query.graphql47
-rw-r--r--app/assets/javascripts/clusters_list/index.js5
-rw-r--r--app/assets/javascripts/clusters_list/load_agents.js44
-rw-r--r--app/assets/javascripts/comment_type_toggle.js71
-rw-r--r--app/assets/javascripts/content_editor/components/top_toolbar.vue9
-rw-r--r--app/assets/javascripts/content_editor/components/wrappers/details.vue33
-rw-r--r--app/assets/javascripts/content_editor/components/wrappers/frontmatter.vue32
-rw-r--r--app/assets/javascripts/content_editor/content_editor.stories.js2
-rw-r--r--app/assets/javascripts/content_editor/extensions/code_block_highlight.js3
-rw-r--r--app/assets/javascripts/content_editor/extensions/color_chip.js73
-rw-r--r--app/assets/javascripts/content_editor/extensions/details.js36
-rw-r--r--app/assets/javascripts/content_editor/extensions/details_content.js25
-rw-r--r--app/assets/javascripts/content_editor/extensions/frontmatter.js20
-rw-r--r--app/assets/javascripts/content_editor/extensions/math_inline.js35
-rw-r--r--app/assets/javascripts/content_editor/extensions/table_of_contents.js51
-rw-r--r--app/assets/javascripts/content_editor/extensions/word_break.js29
-rw-r--r--app/assets/javascripts/content_editor/services/create_content_editor.js14
-rw-r--r--app/assets/javascripts/content_editor/services/markdown_serializer.js40
-rw-r--r--app/assets/javascripts/create_cluster/eks_cluster/components/eks_cluster_configuration_form.vue12
-rw-r--r--app/assets/javascripts/create_cluster/gke_cluster/components/gke_network_dropdown.vue2
-rw-r--r--app/assets/javascripts/create_cluster/gke_cluster/components/gke_subnetwork_dropdown.vue2
-rw-r--r--app/assets/javascripts/create_merge_request_dropdown.js4
-rw-r--r--app/assets/javascripts/cycle_analytics/components/base.vue16
-rw-r--r--app/assets/javascripts/cycle_analytics/components/filter_bar.vue1
-rw-r--r--app/assets/javascripts/cycle_analytics/components/stage_table.vue3
-rw-r--r--app/assets/javascripts/cycle_analytics/constants.js2
-rw-r--r--app/assets/javascripts/cycle_analytics/index.js1
-rw-r--r--app/assets/javascripts/cycle_analytics/store/actions.js20
-rw-r--r--app/assets/javascripts/cycle_analytics/store/getters.js8
-rw-r--r--app/assets/javascripts/cycle_analytics/store/mutation_types.js1
-rw-r--r--app/assets/javascripts/cycle_analytics/store/mutations.js21
-rw-r--r--app/assets/javascripts/cycle_analytics/store/state.js11
-rw-r--r--app/assets/javascripts/cycle_analytics/utils.js30
-rw-r--r--app/assets/javascripts/dependency_proxy.js5
-rw-r--r--app/assets/javascripts/deploy_freeze/components/deploy_freeze_modal.vue2
-rw-r--r--app/assets/javascripts/deprecated_notes.js73
-rw-r--r--app/assets/javascripts/design_management/pages/design/index.vue2
-rw-r--r--app/assets/javascripts/design_management/pages/index.vue2
-rw-r--r--app/assets/javascripts/design_management/utils/cache_update.js2
-rw-r--r--app/assets/javascripts/design_management/utils/error_messages.js72
-rw-r--r--app/assets/javascripts/diffs/components/app.vue15
-rw-r--r--app/assets/javascripts/diffs/components/compare_versions.vue1
-rw-r--r--app/assets/javascripts/diffs/components/diff_row.vue13
-rw-r--r--app/assets/javascripts/diffs/components/tree_list.vue2
-rw-r--r--app/assets/javascripts/diffs/utils/tree_worker_utils.js (renamed from app/assets/javascripts/diffs/utils/workers.js)0
-rw-r--r--app/assets/javascripts/diffs/workers/tree_worker.js2
-rw-r--r--app/assets/javascripts/droplab/drop_lab.js160
-rw-r--r--app/assets/javascripts/droplab/plugins/ajax_filter.js113
-rw-r--r--app/assets/javascripts/editor/extensions/source_editor_ci_schema_ext.js10
-rw-r--r--app/assets/javascripts/editor/schema/NOTICE6
-rw-r--r--app/assets/javascripts/editor/schema/ci.json1444
-rw-r--r--app/assets/javascripts/environments/components/environment_delete.vue28
-rw-r--r--app/assets/javascripts/environments/components/environment_external_url.vue15
-rw-r--r--app/assets/javascripts/environments/components/environment_item.vue98
-rw-r--r--app/assets/javascripts/environments/components/environment_monitoring.vue26
-rw-r--r--app/assets/javascripts/environments/components/environment_pin.vue16
-rw-r--r--app/assets/javascripts/environments/components/environment_rollback.vue18
-rw-r--r--app/assets/javascripts/environments/components/environment_stop.vue19
-rw-r--r--app/assets/javascripts/environments/components/environment_terminal_button.vue26
-rw-r--r--app/assets/javascripts/environments/components/environments_table.vue2
-rw-r--r--app/assets/javascripts/environments/folder/environments_folder_bundle.js2
-rw-r--r--app/assets/javascripts/error_tracking/components/error_details.vue22
-rw-r--r--app/assets/javascripts/error_tracking/queries/details.query.graphql1
-rw-r--r--app/assets/javascripts/error_tracking_settings/components/app.vue31
-rw-r--r--app/assets/javascripts/error_tracking_settings/index.js2
-rw-r--r--app/assets/javascripts/experimentation/utils.js8
-rw-r--r--app/assets/javascripts/feature_flags/components/edit_feature_flag.vue16
-rw-r--r--app/assets/javascripts/feature_flags/components/form.vue2
-rw-r--r--app/assets/javascripts/feature_flags/components/strategies/flexible_rollout.vue2
-rw-r--r--app/assets/javascripts/feature_flags/edit.js2
-rw-r--r--app/assets/javascripts/filtered_search/dropdown_ajax_filter.js2
-rw-r--r--app/assets/javascripts/filtered_search/dropdown_emoji.js4
-rw-r--r--app/assets/javascripts/filtered_search/dropdown_hint.js2
-rw-r--r--app/assets/javascripts/filtered_search/dropdown_non_user.js4
-rw-r--r--app/assets/javascripts/filtered_search/dropdown_operator.js2
-rw-r--r--app/assets/javascripts/filtered_search/droplab/constants.js (renamed from app/assets/javascripts/droplab/constants.js)0
-rw-r--r--app/assets/javascripts/filtered_search/droplab/drop_down.js (renamed from app/assets/javascripts/droplab/drop_down.js)0
-rw-r--r--app/assets/javascripts/filtered_search/droplab/drop_lab_deprecated.js170
-rw-r--r--app/assets/javascripts/filtered_search/droplab/hook.js (renamed from app/assets/javascripts/droplab/hook.js)0
-rw-r--r--app/assets/javascripts/filtered_search/droplab/hook_button.js (renamed from app/assets/javascripts/droplab/hook_button.js)0
-rw-r--r--app/assets/javascripts/filtered_search/droplab/hook_input.js (renamed from app/assets/javascripts/droplab/hook_input.js)0
-rw-r--r--app/assets/javascripts/filtered_search/droplab/keyboard.js (renamed from app/assets/javascripts/droplab/keyboard.js)0
-rw-r--r--app/assets/javascripts/filtered_search/droplab/plugins/ajax.js (renamed from app/assets/javascripts/droplab/plugins/ajax.js)0
-rw-r--r--app/assets/javascripts/filtered_search/droplab/plugins/ajax_filter.js114
-rw-r--r--app/assets/javascripts/filtered_search/droplab/plugins/filter.js (renamed from app/assets/javascripts/droplab/plugins/filter.js)0
-rw-r--r--app/assets/javascripts/filtered_search/droplab/plugins/input_setter.js (renamed from app/assets/javascripts/droplab/plugins/input_setter.js)0
-rw-r--r--app/assets/javascripts/filtered_search/droplab/utils.js (renamed from app/assets/javascripts/droplab/utils.js)0
-rw-r--r--app/assets/javascripts/filtered_search/filtered_search_dropdown_manager.js2
-rw-r--r--app/assets/javascripts/frequent_items/components/frequent_items_list_item.vue7
-rw-r--r--app/assets/javascripts/graphql_shared/fragments/milestone.fragment.graphql6
-rw-r--r--app/assets/javascripts/header_search/components/app.vue15
-rw-r--r--app/assets/javascripts/header_search/components/header_search_autocomplete_items.vue74
-rw-r--r--app/assets/javascripts/header_search/constants.js8
-rw-r--r--app/assets/javascripts/header_search/index.js4
-rw-r--r--app/assets/javascripts/header_search/store/actions.js14
-rw-r--r--app/assets/javascripts/header_search/store/getters.js32
-rw-r--r--app/assets/javascripts/header_search/store/index.js10
-rw-r--r--app/assets/javascripts/header_search/store/mutation_types.js4
-rw-r--r--app/assets/javascripts/header_search/store/mutations.js12
-rw-r--r--app/assets/javascripts/header_search/store/state.js5
-rw-r--r--app/assets/javascripts/ide/components/commit_sidebar/success_message.vue6
-rw-r--r--app/assets/javascripts/ide/components/jobs/detail.vue14
-rw-r--r--app/assets/javascripts/ide/components/preview/navigator.vue2
-rw-r--r--app/assets/javascripts/ide/stores/modules/commit/getters.js9
-rw-r--r--app/assets/javascripts/ide/stores/modules/pipelines/actions.js1
-rw-r--r--app/assets/javascripts/ide/stores/utils.js2
-rw-r--r--app/assets/javascripts/import_entities/components/pagination_bar.vue90
-rw-r--r--app/assets/javascripts/integrations/constants.js23
-rw-r--r--app/assets/javascripts/integrations/edit/components/active_checkbox.vue3
-rw-r--r--app/assets/javascripts/integrations/edit/components/dynamic_field.vue5
-rw-r--r--app/assets/javascripts/integrations/edit/components/integration_form.vue10
-rw-r--r--app/assets/javascripts/integrations/edit/components/jira_issues_fields.vue10
-rw-r--r--app/assets/javascripts/integrations/edit/components/jira_trigger_fields.vue5
-rw-r--r--app/assets/javascripts/integrations/edit/components/override_dropdown.vue2
-rw-r--r--app/assets/javascripts/integrations/edit/constants.js17
-rw-r--r--app/assets/javascripts/integrations/integration_settings_form.js46
-rw-r--r--app/assets/javascripts/integrations/overrides/components/integration_overrides.vue19
-rw-r--r--app/assets/javascripts/invite_members/components/invite_members_modal.vue13
-rw-r--r--app/assets/javascripts/invite_members/utils/response_message_parser.js5
-rw-r--r--app/assets/javascripts/issuable/components/csv_export_modal.vue69
-rw-r--r--app/assets/javascripts/issuable/components/csv_import_export_buttons.vue9
-rw-r--r--app/assets/javascripts/issuable/components/csv_import_modal.vue68
-rw-r--r--app/assets/javascripts/issuable_form.js6
-rw-r--r--app/assets/javascripts/issuable_list/components/issuable_item.vue239
-rw-r--r--app/assets/javascripts/issuable_list/components/issuable_list_root.vue124
-rw-r--r--app/assets/javascripts/issuable_suggestions/components/app.vue2
-rw-r--r--app/assets/javascripts/issuable_suggestions/components/item.vue35
-rw-r--r--app/assets/javascripts/issuable_suggestions/index.js7
-rw-r--r--app/assets/javascripts/issue_show/components/locked_warning.vue37
-rw-r--r--app/assets/javascripts/issues_list/components/issue_card_time_info.vue17
-rw-r--r--app/assets/javascripts/issues_list/components/issues_list_app.vue49
-rw-r--r--app/assets/javascripts/issues_list/components/new_issue_dropdown.vue124
-rw-r--r--app/assets/javascripts/issues_list/index.js6
-rw-r--r--app/assets/javascripts/issues_list/queries/search_projects.query.graphql12
-rw-r--r--app/assets/javascripts/jobs/components/job_app.vue30
-rw-r--r--app/assets/javascripts/jobs/components/job_log_controllers.vue4
-rw-r--r--app/assets/javascripts/jobs/components/log/collapsible_section.vue10
-rw-r--r--app/assets/javascripts/jobs/components/log/log.vue18
-rw-r--r--app/assets/javascripts/jobs/components/table/cells/actions_cell.vue20
-rw-r--r--app/assets/javascripts/jobs/store/actions.js62
-rw-r--r--app/assets/javascripts/jobs/store/getters.js7
-rw-r--r--app/assets/javascripts/jobs/store/mutation_types.js14
-rw-r--r--app/assets/javascripts/jobs/store/mutations.js56
-rw-r--r--app/assets/javascripts/jobs/store/state.js20
-rw-r--r--app/assets/javascripts/jobs/store/utils.js18
-rw-r--r--app/assets/javascripts/jobs/utils.js9
-rw-r--r--app/assets/javascripts/lib/apollo/suppress_network_errors_during_navigation_link.js36
-rw-r--r--app/assets/javascripts/lib/graphql.js2
-rw-r--r--app/assets/javascripts/lib/logger/hello.js29
-rw-r--r--app/assets/javascripts/lib/utils/axios_utils.js8
-rw-r--r--app/assets/javascripts/lib/utils/color_utils.js19
-rw-r--r--app/assets/javascripts/lib/utils/common_utils.js6
-rw-r--r--app/assets/javascripts/lib/utils/constants.js4
-rw-r--r--app/assets/javascripts/lib/utils/datetime/date_format_utility.js29
-rw-r--r--app/assets/javascripts/lib/utils/datetime_range.js12
-rw-r--r--app/assets/javascripts/lib/utils/is_navigating_away.js23
-rw-r--r--app/assets/javascripts/lib/utils/regexp.js8
-rw-r--r--app/assets/javascripts/lib/utils/text_utility.js15
-rw-r--r--app/assets/javascripts/lib/utils/url_utility.js29
-rw-r--r--app/assets/javascripts/logs/components/environment_logs.vue2
-rw-r--r--app/assets/javascripts/logs/stores/state.js2
-rw-r--r--app/assets/javascripts/main.js3
-rw-r--r--app/assets/javascripts/members/components/action_buttons/remove_member_button.vue4
-rw-r--r--app/assets/javascripts/members/components/action_buttons/user_action_buttons.vue11
-rw-r--r--app/assets/javascripts/members/components/modals/leave_modal.vue19
-rw-r--r--app/assets/javascripts/members/components/modals/remove_member_modal.vue24
-rw-r--r--app/assets/javascripts/members/components/table/expires_at.vue66
-rw-r--r--app/assets/javascripts/members/components/table/members_table.vue87
-rw-r--r--app/assets/javascripts/members/constants.js22
-rw-r--r--app/assets/javascripts/merge_conflicts/components/inline_conflict_lines.vue6
-rw-r--r--app/assets/javascripts/merge_conflicts/components/parallel_conflict_lines.vue6
-rw-r--r--app/assets/javascripts/merge_request.js8
-rw-r--r--app/assets/javascripts/mr_popover/index.js7
-rw-r--r--app/assets/javascripts/namespace_select.js58
-rw-r--r--app/assets/javascripts/notebook/cells/markdown.vue9
-rw-r--r--app/assets/javascripts/notes/components/comment_type_dropdown.vue8
-rw-r--r--app/assets/javascripts/notes/components/discussion_notes.vue7
-rw-r--r--app/assets/javascripts/notes/components/note_actions.vue6
-rw-r--r--app/assets/javascripts/notes/components/note_body.vue13
-rw-r--r--app/assets/javascripts/notes/components/note_form.vue1
-rw-r--r--app/assets/javascripts/notes/components/note_header.vue11
-rw-r--r--app/assets/javascripts/notes/components/noteable_discussion.vue6
-rw-r--r--app/assets/javascripts/notes/components/noteable_note.vue15
-rw-r--r--app/assets/javascripts/notes/components/notes_app.vue1
-rw-r--r--app/assets/javascripts/notes/stores/actions.js4
-rw-r--r--app/assets/javascripts/notes/stores/getters.js11
-rw-r--r--app/assets/javascripts/notifications/constants.js2
-rw-r--r--app/assets/javascripts/packages/details/components/additional_metadata.vue94
-rw-r--r--app/assets/javascripts/packages/details/components/app.vue292
-rw-r--r--app/assets/javascripts/packages/details/components/composer_installation.vue65
-rw-r--r--app/assets/javascripts/packages/details/components/conan_installation.vue59
-rw-r--r--app/assets/javascripts/packages/details/components/dependency_row.vue35
-rw-r--r--app/assets/javascripts/packages/details/components/installation_commands.vue55
-rw-r--r--app/assets/javascripts/packages/details/components/installation_title.vue38
-rw-r--r--app/assets/javascripts/packages/details/components/maven_installation.vue153
-rw-r--r--app/assets/javascripts/packages/details/components/npm_installation.vue103
-rw-r--r--app/assets/javascripts/packages/details/components/nuget_installation.vue58
-rw-r--r--app/assets/javascripts/packages/details/components/package_files.vue165
-rw-r--r--app/assets/javascripts/packages/details/components/package_history.vue168
-rw-r--r--app/assets/javascripts/packages/details/components/package_title.vue113
-rw-r--r--app/assets/javascripts/packages/details/components/pypi_installation.vue71
-rw-r--r--app/assets/javascripts/packages/details/constants.js55
-rw-r--r--app/assets/javascripts/packages/details/index.js32
-rw-r--r--app/assets/javascripts/packages/details/store/getters.js140
-rw-r--r--app/assets/javascripts/packages/details/utils.js10
-rw-r--r--app/assets/javascripts/packages/shared/constants.js5
-rw-r--r--app/assets/javascripts/packages_and_registries/dependency_proxy/app.vue105
-rw-r--r--app/assets/javascripts/packages_and_registries/dependency_proxy/graphql/index.js14
-rw-r--r--app/assets/javascripts/packages_and_registries/dependency_proxy/graphql/queries/get_dependency_proxy_details.query.graphql10
-rw-r--r--app/assets/javascripts/packages_and_registries/dependency_proxy/index.js26
-rw-r--r--app/assets/javascripts/packages_and_registries/infrastructure_registry/details/components/app.vue240
-rw-r--r--app/assets/javascripts/packages_and_registries/infrastructure_registry/details/components/details_title.vue (renamed from app/assets/javascripts/packages_and_registries/infrastructure_registry/components/details_title.vue)0
-rw-r--r--app/assets/javascripts/packages_and_registries/infrastructure_registry/details/components/file_sha.vue (renamed from app/assets/javascripts/packages/details/components/file_sha.vue)0
-rw-r--r--app/assets/javascripts/packages_and_registries/infrastructure_registry/details/components/package_files.vue165
-rw-r--r--app/assets/javascripts/packages_and_registries/infrastructure_registry/details/components/package_history.vue165
-rw-r--r--app/assets/javascripts/packages_and_registries/infrastructure_registry/details/components/terraform_installation.vue (renamed from app/assets/javascripts/packages_and_registries/infrastructure_registry/components/terraform_installation.vue)0
-rw-r--r--app/assets/javascripts/packages_and_registries/infrastructure_registry/details/constants.js5
-rw-r--r--app/assets/javascripts/packages_and_registries/infrastructure_registry/details/store/actions.js (renamed from app/assets/javascripts/packages/details/store/actions.js)0
-rw-r--r--app/assets/javascripts/packages_and_registries/infrastructure_registry/details/store/getters.js3
-rw-r--r--app/assets/javascripts/packages_and_registries/infrastructure_registry/details/store/index.js (renamed from app/assets/javascripts/packages/details/store/index.js)0
-rw-r--r--app/assets/javascripts/packages_and_registries/infrastructure_registry/details/store/mutation_types.js (renamed from app/assets/javascripts/packages/details/store/mutation_types.js)0
-rw-r--r--app/assets/javascripts/packages_and_registries/infrastructure_registry/details/store/mutations.js (renamed from app/assets/javascripts/packages/details/store/mutations.js)0
-rw-r--r--app/assets/javascripts/packages_and_registries/infrastructure_registry/details_app_bundle.js4
-rw-r--r--app/assets/javascripts/packages_and_registries/package_registry/components/details/metadata/nuget.vue15
-rw-r--r--app/assets/javascripts/packages_and_registries/package_registry/components/details/npm_installation.vue30
-rw-r--r--app/assets/javascripts/packages_and_registries/package_registry/components/details/package_history.vue19
-rw-r--r--app/assets/javascripts/packages_and_registries/package_registry/components/list/app.vue134
-rw-r--r--app/assets/javascripts/packages_and_registries/package_registry/components/list/package_list_row.vue151
-rw-r--r--app/assets/javascripts/packages_and_registries/package_registry/components/list/package_search.vue81
-rw-r--r--app/assets/javascripts/packages_and_registries/package_registry/components/list/packages_list_app.vue132
-rw-r--r--app/assets/javascripts/packages_and_registries/package_registry/components/list/publish_method.vue61
-rw-r--r--app/assets/javascripts/packages_and_registries/package_registry/constants.js12
-rw-r--r--app/assets/javascripts/packages_and_registries/package_registry/graphql/fragments/package_data.fragment.graphql27
-rw-r--r--app/assets/javascripts/packages_and_registries/package_registry/graphql/queries/get_packages.query.graphql27
-rw-r--r--app/assets/javascripts/packages_and_registries/package_registry/pages/list.js10
-rw-r--r--app/assets/javascripts/packages_and_registries/settings/group/bundle.js1
-rw-r--r--app/assets/javascripts/packages_and_registries/settings/group/components/dependency_proxy_settings.vue110
-rw-r--r--app/assets/javascripts/packages_and_registries/settings/group/components/duplicates_settings.vue2
-rw-r--r--app/assets/javascripts/packages_and_registries/settings/group/components/group_settings_app.vue167
-rw-r--r--app/assets/javascripts/packages_and_registries/settings/group/components/packages_settings.vue139
-rw-r--r--app/assets/javascripts/packages_and_registries/settings/group/constants.js8
-rw-r--r--app/assets/javascripts/packages_and_registries/settings/group/graphql/mutations/update_dependency_proxy_settings.mutation.graphql8
-rw-r--r--app/assets/javascripts/packages_and_registries/settings/group/graphql/queries/get_group_packages_settings.query.graphql3
-rw-r--r--app/assets/javascripts/packages_and_registries/settings/group/graphql/utils/cache_update.js13
-rw-r--r--app/assets/javascripts/packages_and_registries/settings/group/graphql/utils/optimistic_responses.js12
-rw-r--r--app/assets/javascripts/packages_and_registries/settings/project/components/registry_settings_app.vue2
-rw-r--r--app/assets/javascripts/packages_and_registries/settings/project/constants.js1
-rw-r--r--app/assets/javascripts/packages_and_registries/shared/constants.js2
-rw-r--r--app/assets/javascripts/pages/admin/application_settings/metrics_and_profiling/usage_statistics.js2
-rw-r--r--app/assets/javascripts/pages/admin/projects/components/namespace_select.vue143
-rw-r--r--app/assets/javascripts/pages/admin/projects/index.js38
-rw-r--r--app/assets/javascripts/pages/admin/serverless/domains/index.js17
-rw-r--r--app/assets/javascripts/pages/admin/topics/edit/index.js8
-rw-r--r--app/assets/javascripts/pages/admin/topics/new/index.js8
-rw-r--r--app/assets/javascripts/pages/groups/dependency_proxies/index.js14
-rw-r--r--app/assets/javascripts/pages/groups/group_members/index.js2
-rw-r--r--app/assets/javascripts/pages/groups/packages/index/index.js13
-rw-r--r--app/assets/javascripts/pages/import/bulk_imports/history/components/bulk_imports_history_app.vue176
-rw-r--r--app/assets/javascripts/pages/import/bulk_imports/history/index.js15
-rw-r--r--app/assets/javascripts/pages/import/bulk_imports/history/utils/error_messages.js3
-rw-r--r--app/assets/javascripts/pages/profiles/index.js2
-rw-r--r--app/assets/javascripts/pages/profiles/password_prompt/constants.js9
-rw-r--r--app/assets/javascripts/pages/profiles/password_prompt/index.js58
-rw-r--r--app/assets/javascripts/pages/profiles/password_prompt/password_prompt_modal.vue82
-rw-r--r--app/assets/javascripts/pages/projects/cluster_agents/show/index.js3
-rw-r--r--app/assets/javascripts/pages/projects/clusters/index/index.js2
-rw-r--r--app/assets/javascripts/pages/projects/new/components/new_project_url_select.vue98
-rw-r--r--app/assets/javascripts/pages/projects/new/index.js66
-rw-r--r--app/assets/javascripts/pages/projects/packages/packages/index/index.js11
-rw-r--r--app/assets/javascripts/pages/projects/pipeline_schedules/shared/components/timezone_dropdown.js34
-rw-r--r--app/assets/javascripts/pages/projects/project_members/index.js2
-rw-r--r--app/assets/javascripts/pages/projects/wikis/diff/index.js3
-rw-r--r--app/assets/javascripts/pages/projects/wikis/edit/index.js3
-rw-r--r--app/assets/javascripts/pages/projects/wikis/git_access/index.js3
-rw-r--r--app/assets/javascripts/pages/projects/wikis/index.js6
-rw-r--r--app/assets/javascripts/pages/projects/wikis/show/index.js3
-rw-r--r--app/assets/javascripts/pages/sessions/new/oauth_remember_me.js2
-rw-r--r--app/assets/javascripts/pages/shared/mount_runner_instructions.js7
-rw-r--r--app/assets/javascripts/pages/shared/wikis/async_edit.js11
-rw-r--r--app/assets/javascripts/pages/shared/wikis/edit.js88
-rw-r--r--app/assets/javascripts/pages/shared/wikis/index.js92
-rw-r--r--app/assets/javascripts/pages/shared/wikis/wikis.js6
-rw-r--r--app/assets/javascripts/performance_bar/components/performance_bar_app.vue21
-rw-r--r--app/assets/javascripts/persistent_user_callouts.js1
-rw-r--r--app/assets/javascripts/pipeline_editor/components/editor/text_editor.vue15
-rw-r--r--app/assets/javascripts/pipeline_editor/components/header/pipeline_editor_mini_graph.vue49
-rw-r--r--app/assets/javascripts/pipeline_editor/components/header/pipeline_status.vue31
-rw-r--r--app/assets/javascripts/pipeline_editor/components/ui/pipeline_editor_empty_state.vue14
-rw-r--r--app/assets/javascripts/pipeline_editor/graphql/queries/client/pipeline.graphql19
-rw-r--r--app/assets/javascripts/pipeline_editor/pipeline_editor_home.vue7
-rw-r--r--app/assets/javascripts/pipelines/components/graph/job_item.vue12
-rw-r--r--app/assets/javascripts/pipelines/components/pipelines_list/pipeline_multi_actions.vue7
-rw-r--r--app/assets/javascripts/pipelines/components/pipelines_list/pipeline_stop_modal.vue19
-rw-r--r--app/assets/javascripts/pipelines/components/pipelines_list/pipelines_artifacts.vue14
-rw-r--r--app/assets/javascripts/pipelines/components/pipelines_list/tokens/constants.js24
-rw-r--r--app/assets/javascripts/profile/profile.js1
-rw-r--r--app/assets/javascripts/projects/new/components/app.vue (renamed from app/assets/javascripts/pages/projects/new/components/app.vue)0
-rw-r--r--app/assets/javascripts/projects/new/components/new_project_push_tip_popover.vue (renamed from app/assets/javascripts/pages/projects/new/components/new_project_push_tip_popover.vue)0
-rw-r--r--app/assets/javascripts/projects/new/components/new_project_url_select.vue163
-rw-r--r--app/assets/javascripts/projects/new/event_hub.js3
-rw-r--r--app/assets/javascripts/projects/new/index.js66
-rw-r--r--app/assets/javascripts/projects/new/queries/search_namespaces_where_user_can_create_projects.query.graphql (renamed from app/assets/javascripts/pages/projects/new/queries/search_namespaces_where_user_can_create_projects.query.graphql)0
-rw-r--r--app/assets/javascripts/projects/project_new.js58
-rw-r--r--app/assets/javascripts/projects/settings/access_dropdown.js53
-rw-r--r--app/assets/javascripts/projects/settings/api/access_dropdown_api.js45
-rw-r--r--app/assets/javascripts/projects/settings/components/access_dropdown.vue409
-rw-r--r--app/assets/javascripts/projects/settings/init_access_dropdown.js39
-rw-r--r--app/assets/javascripts/prometheus_alerts/components/reset_key.vue36
-rw-r--r--app/assets/javascripts/registry/explorer/components/details_page/tags_list_row.vue45
-rw-r--r--app/assets/javascripts/registry/explorer/constants/common.js3
-rw-r--r--app/assets/javascripts/registry/explorer/constants/details.js6
-rw-r--r--app/assets/javascripts/registry/explorer/constants/list.js2
-rw-r--r--app/assets/javascripts/registry/explorer/index.js4
-rw-r--r--app/assets/javascripts/registry/explorer/pages/list.vue5
-rw-r--r--app/assets/javascripts/related_issues/components/add_issuable_form.vue18
-rw-r--r--app/assets/javascripts/related_issues/components/issue_token.vue15
-rw-r--r--app/assets/javascripts/related_issues/components/related_issuable_input.vue27
-rw-r--r--app/assets/javascripts/related_issues/components/related_issues_block.vue3
-rw-r--r--app/assets/javascripts/related_issues/components/related_issues_list.vue6
-rw-r--r--app/assets/javascripts/related_merge_requests/components/related_merge_requests.vue14
-rw-r--r--app/assets/javascripts/releases/components/release_block.vue10
-rw-r--r--app/assets/javascripts/releases/mount_show.js7
-rw-r--r--app/assets/javascripts/reports/codequality_report/components/codequality_issue_body.vue9
-rw-r--r--app/assets/javascripts/reports/codequality_report/grouped_codequality_reports_app.vue6
-rw-r--r--app/assets/javascripts/reports/codequality_report/store/getters.js34
-rw-r--r--app/assets/javascripts/reports/codequality_report/store/utils/codequality_parser.js10
-rw-r--r--app/assets/javascripts/reports/grouped_test_report/grouped_test_reports_app.vue6
-rw-r--r--app/assets/javascripts/repository/commits_service.js65
-rw-r--r--app/assets/javascripts/repository/components/blob_content_viewer.vue76
-rw-r--r--app/assets/javascripts/repository/components/blob_edit.vue16
-rw-r--r--app/assets/javascripts/repository/components/blob_viewers/index.js9
-rw-r--r--app/assets/javascripts/repository/components/blob_viewers/video_viewer.vue15
-rw-r--r--app/assets/javascripts/repository/components/breadcrumbs.vue45
-rw-r--r--app/assets/javascripts/repository/components/fork_suggestion.vue45
-rw-r--r--app/assets/javascripts/repository/components/new_directory_modal.vue183
-rw-r--r--app/assets/javascripts/repository/components/preview/index.vue11
-rw-r--r--app/assets/javascripts/repository/components/table/index.vue45
-rw-r--r--app/assets/javascripts/repository/components/table/row.vue58
-rw-r--r--app/assets/javascripts/repository/components/tree_content.vue22
-rw-r--r--app/assets/javascripts/repository/components/upload_blob_modal.vue1
-rw-r--r--app/assets/javascripts/repository/constants.js7
-rw-r--r--app/assets/javascripts/repository/index.js1
-rw-r--r--app/assets/javascripts/repository/queries/blob_info.query.graphql5
-rw-r--r--app/assets/javascripts/repository/router.js21
-rw-r--r--app/assets/javascripts/rest_api.js1
-rw-r--r--app/assets/javascripts/right_sidebar.js2
-rw-r--r--app/assets/javascripts/runner/admin_runners/admin_runners_app.vue29
-rw-r--r--app/assets/javascripts/runner/components/cells/runner_actions_cell.vue20
-rw-r--r--app/assets/javascripts/runner/components/cells/runner_name_cell.vue44
-rw-r--r--app/assets/javascripts/runner/components/cells/runner_summary_cell.vue35
-rw-r--r--app/assets/javascripts/runner/components/cells/runner_type_cell.vue25
-rw-r--r--app/assets/javascripts/runner/components/runner_list.vue14
-rw-r--r--app/assets/javascripts/runner/components/runner_name.vue18
-rw-r--r--app/assets/javascripts/runner/components/runner_state_locked_badge.vue25
-rw-r--r--app/assets/javascripts/runner/components/runner_state_paused_badge.vue25
-rw-r--r--app/assets/javascripts/runner/components/runner_type_badge.vue19
-rw-r--r--app/assets/javascripts/runner/components/runner_type_help.vue60
-rw-r--r--app/assets/javascripts/runner/constants.js8
-rw-r--r--app/assets/javascripts/runner/graphql/get_group_runners.query.graphql7
-rw-r--r--app/assets/javascripts/runner/graphql/get_runners.query.graphql1
-rw-r--r--app/assets/javascripts/runner/group_runners/group_runners_app.vue33
-rw-r--r--app/assets/javascripts/search_settings/components/search_settings.vue58
-rw-r--r--app/assets/javascripts/search_settings/constants.js3
-rw-r--r--app/assets/javascripts/security_configuration/components/feature_card.vue1
-rw-r--r--app/assets/javascripts/sidebar/components/assignees/uncollapsed_assignee_list.vue8
-rw-r--r--app/assets/javascripts/sidebar/components/labels/sidebar_labels.vue33
-rw-r--r--app/assets/javascripts/sidebar/components/participants/participants.vue4
-rw-r--r--app/assets/javascripts/sidebar/components/reviewers/reviewer_avatar_link.vue2
-rw-r--r--app/assets/javascripts/sidebar/components/reviewers/uncollapsed_reviewer_list.vue5
-rw-r--r--app/assets/javascripts/sidebar/components/time_tracking/comparison_pane.vue12
-rw-r--r--app/assets/javascripts/sidebar/components/time_tracking/spent_only_pane.vue31
-rw-r--r--app/assets/javascripts/sidebar/components/todo_toggle/todo.vue2
-rw-r--r--app/assets/javascripts/sidebar/constants.js15
-rw-r--r--app/assets/javascripts/sidebar/mount_sidebar.js2
-rw-r--r--app/assets/javascripts/snippets/components/snippet_description_view.vue7
-rw-r--r--app/assets/javascripts/snippets/components/snippet_header.vue70
-rw-r--r--app/assets/javascripts/snippets/index.js2
-rw-r--r--app/assets/javascripts/token_access/index.js2
-rw-r--r--app/assets/javascripts/tracking/constants.js5
-rw-r--r--app/assets/javascripts/tracking/get_standard_context.js4
-rw-r--r--app/assets/javascripts/tracking/tracking.js13
-rw-r--r--app/assets/javascripts/tracking/utils.js8
-rw-r--r--app/assets/javascripts/user_popovers.js1
-rw-r--r--app/assets/javascripts/vue_merge_request_widget/components/approvals/approvals_summary.vue10
-rw-r--r--app/assets/javascripts/vue_merge_request_widget/components/extensions/actions.vue70
-rw-r--r--app/assets/javascripts/vue_merge_request_widget/components/extensions/base.vue137
-rw-r--r--app/assets/javascripts/vue_merge_request_widget/components/extensions/container.js53
-rw-r--r--app/assets/javascripts/vue_merge_request_widget/components/extensions/index.js6
-rw-r--r--app/assets/javascripts/vue_merge_request_widget/components/extensions/status_icon.vue61
-rw-r--r--app/assets/javascripts/vue_merge_request_widget/components/mr_widget_header.vue14
-rw-r--r--app/assets/javascripts/vue_merge_request_widget/components/mr_widget_how_to_merge_modal.vue22
-rw-r--r--app/assets/javascripts/vue_merge_request_widget/components/mr_widget_pipeline_container.vue5
-rw-r--r--app/assets/javascripts/vue_merge_request_widget/components/states/commits_header.vue43
-rw-r--r--app/assets/javascripts/vue_merge_request_widget/components/states/ready_to_merge.vue37
-rw-r--r--app/assets/javascripts/vue_merge_request_widget/components/states/work_in_progress.vue6
-rw-r--r--app/assets/javascripts/vue_merge_request_widget/constants.js97
-rw-r--r--app/assets/javascripts/vue_merge_request_widget/extensions/issues.js29
-rw-r--r--app/assets/javascripts/vue_merge_request_widget/mixins/ready_to_merge.js2
-rw-r--r--app/assets/javascripts/vue_merge_request_widget/mr_widget_options.vue32
-rw-r--r--app/assets/javascripts/vue_merge_request_widget/stores/mr_widget_store.js52
-rw-r--r--app/assets/javascripts/vue_merge_request_widget/stores/state_maps.js10
-rw-r--r--app/assets/javascripts/vue_shared/components/blob_viewers/mixins.js5
-rw-r--r--app/assets/javascripts/vue_shared/components/blob_viewers/simple_viewer.vue15
-rw-r--r--app/assets/javascripts/vue_shared/components/color_picker/color_picker.vue4
-rw-r--r--app/assets/javascripts/vue_shared/components/content_viewer/viewers/markdown_viewer.vue2
-rw-r--r--app/assets/javascripts/vue_shared/components/dismissible_feedback_alert.vue23
-rw-r--r--app/assets/javascripts/vue_shared/components/dropdown_keyboard_navigation.vue81
-rw-r--r--app/assets/javascripts/vue_shared/components/filtered_search_bar/queries/epic.fragment.graphql15
-rw-r--r--app/assets/javascripts/vue_shared/components/filtered_search_bar/queries/search_epics.query.graphql16
-rw-r--r--app/assets/javascripts/vue_shared/components/filtered_search_bar/tokens/base_token.vue29
-rw-r--r--app/assets/javascripts/vue_shared/components/filtered_search_bar/tokens/epic_token.vue138
-rw-r--r--app/assets/javascripts/vue_shared/components/issue/issue_assignees.vue5
-rw-r--r--app/assets/javascripts/vue_shared/components/issue/related_issuable_item.vue13
-rw-r--r--app/assets/javascripts/vue_shared/components/markdown/apply_suggestion.vue18
-rw-r--r--app/assets/javascripts/vue_shared/components/markdown/field.vue2
-rw-r--r--app/assets/javascripts/vue_shared/components/markdown/suggestion_diff.vue4
-rw-r--r--app/assets/javascripts/vue_shared/components/markdown/suggestion_diff_header.vue87
-rw-r--r--app/assets/javascripts/vue_shared/components/markdown/suggestions.vue12
-rw-r--r--app/assets/javascripts/vue_shared/components/notes/placeholder_note.vue13
-rw-r--r--app/assets/javascripts/vue_shared/components/oncall_schedules_list.vue74
-rw-r--r--app/assets/javascripts/vue_shared/components/project_selector/project_list_item.stories.js34
-rw-r--r--app/assets/javascripts/vue_shared/components/project_selector/project_list_item.vue5
-rw-r--r--app/assets/javascripts/vue_shared/components/sidebar/copyable_field.vue2
-rw-r--r--app/assets/javascripts/vue_shared/components/sidebar/labels_select_vue/store/mutations.js9
-rw-r--r--app/assets/javascripts/vue_shared/components/sidebar/labels_select_widget/constants.js2
-rw-r--r--app/assets/javascripts/vue_shared/components/sidebar/labels_select_widget/dropdown_contents.vue114
-rw-r--r--app/assets/javascripts/vue_shared/components/sidebar/labels_select_widget/dropdown_contents_create_view.vue54
-rw-r--r--app/assets/javascripts/vue_shared/components/sidebar/labels_select_widget/dropdown_contents_labels_view.vue137
-rw-r--r--app/assets/javascripts/vue_shared/components/sidebar/labels_select_widget/graphql/epic_labels.query.graphql15
-rw-r--r--app/assets/javascripts/vue_shared/components/sidebar/labels_select_widget/graphql/group_labels.query.graphql12
-rw-r--r--app/assets/javascripts/vue_shared/components/sidebar/labels_select_widget/labels_select_root.vue97
-rw-r--r--app/assets/javascripts/vue_shared/components/sidebar/todo_toggle/todo_button.stories.js2
-rw-r--r--app/assets/javascripts/vue_shared/components/upload_dropzone/upload_dropzone.vue2
-rw-r--r--app/assets/javascripts/vue_shared/components/user_deletion_obstacles/constants.js5
-rw-r--r--app/assets/javascripts/vue_shared/components/user_deletion_obstacles/user_deletion_obstacles_list.stories.js37
-rw-r--r--app/assets/javascripts/vue_shared/components/user_deletion_obstacles/user_deletion_obstacles_list.vue91
-rw-r--r--app/assets/javascripts/vue_shared/components/user_deletion_obstacles/utils.js19
-rw-r--r--app/assets/javascripts/vue_shared/components/user_popover/user_popover.vue22
-rw-r--r--app/assets/javascripts/vue_shared/components/web_ide_link.vue10
-rw-r--r--app/assets/javascripts/vue_shared/directives/validation.js17
-rw-r--r--app/assets/javascripts/vue_shared/security_configuration/components/manage_via_mr.vue1
-rw-r--r--app/assets/javascripts/vue_shared/security_reports/security_reports_app.vue6
-rw-r--r--app/assets/javascripts/vue_shared/security_reports/store/modules/sast/actions.js3
-rw-r--r--app/assets/javascripts/vue_shared/security_reports/store/modules/secret_detection/actions.js3
-rw-r--r--app/assets/stylesheets/_page_specific_files.scss2
-rw-r--r--app/assets/stylesheets/application_dark.scss72
-rw-r--r--app/assets/stylesheets/bootstrap_migration.scss2
-rw-r--r--app/assets/stylesheets/components/batch_comments/review_bar.scss53
-rw-r--r--app/assets/stylesheets/components/content_editor.scss53
-rw-r--r--app/assets/stylesheets/components/design_management/design.scss5
-rw-r--r--app/assets/stylesheets/components/design_management/design_version_dropdown.scss3
-rw-r--r--app/assets/stylesheets/components/project_list_item.scss24
-rw-r--r--app/assets/stylesheets/framework.scss1
-rw-r--r--app/assets/stylesheets/framework/banner.scss40
-rw-r--r--app/assets/stylesheets/framework/blocks.scss66
-rw-r--r--app/assets/stylesheets/framework/buttons.scss23
-rw-r--r--app/assets/stylesheets/framework/common.scss16
-rw-r--r--app/assets/stylesheets/framework/contextual_sidebar.scss2
-rw-r--r--app/assets/stylesheets/framework/diffs.scss23
-rw-r--r--app/assets/stylesheets/framework/dropdowns.scss38
-rw-r--r--app/assets/stylesheets/framework/forms.scss8
-rw-r--r--app/assets/stylesheets/framework/job_log.scss8
-rw-r--r--app/assets/stylesheets/framework/markdown_area.scss4
-rw-r--r--app/assets/stylesheets/framework/media_object.scss4
-rw-r--r--app/assets/stylesheets/framework/mixins.scss10
-rw-r--r--app/assets/stylesheets/framework/modal.scss37
-rw-r--r--app/assets/stylesheets/framework/panels.scss4
-rw-r--r--app/assets/stylesheets/framework/secondary_navigation_elements.scss2
-rw-r--r--app/assets/stylesheets/framework/selects.scss12
-rw-r--r--app/assets/stylesheets/framework/sidebar.scss15
-rw-r--r--app/assets/stylesheets/framework/snippets.scss5
-rw-r--r--app/assets/stylesheets/framework/sortable.scss55
-rw-r--r--app/assets/stylesheets/framework/tables.scss1
-rw-r--r--app/assets/stylesheets/framework/typography.scss20
-rw-r--r--app/assets/stylesheets/framework/variables.scss3
-rw-r--r--app/assets/stylesheets/framework/zen.scss9
-rw-r--r--app/assets/stylesheets/page_bundles/_ide_mixins.scss2
-rw-r--r--app/assets/stylesheets/page_bundles/_ide_theme_overrides.scss9
-rw-r--r--app/assets/stylesheets/page_bundles/build.scss6
-rw-r--r--app/assets/stylesheets/page_bundles/merge_requests.scss9
-rw-r--r--app/assets/stylesheets/page_bundles/pipeline.scss14
-rw-r--r--app/assets/stylesheets/page_bundles/signup.scss8
-rw-r--r--app/assets/stylesheets/page_bundles/wiki.scss2
-rw-r--r--app/assets/stylesheets/pages/ci_projects.scss54
-rw-r--r--app/assets/stylesheets/pages/clusters.scss151
-rw-r--r--app/assets/stylesheets/pages/commits.scss5
-rw-r--r--app/assets/stylesheets/pages/environment_logs.scss4
-rw-r--r--app/assets/stylesheets/pages/issuable.scss147
-rw-r--r--app/assets/stylesheets/pages/issues.scss95
-rw-r--r--app/assets/stylesheets/pages/issues/issue_count_badge.scss10
-rw-r--r--app/assets/stylesheets/pages/login.scss11
-rw-r--r--app/assets/stylesheets/pages/merge_requests.scss49
-rw-r--r--app/assets/stylesheets/pages/note_form.scss6
-rw-r--r--app/assets/stylesheets/pages/notes.scss44
-rw-r--r--app/assets/stylesheets/pages/notifications.scss5
-rw-r--r--app/assets/stylesheets/pages/pages.scss12
-rw-r--r--app/assets/stylesheets/pages/profile.scss48
-rw-r--r--app/assets/stylesheets/pages/profiles/preferences.scss16
-rw-r--r--app/assets/stylesheets/pages/projects.scss16
-rw-r--r--app/assets/stylesheets/pages/prometheus.scss232
-rw-r--r--app/assets/stylesheets/pages/settings.scss31
-rw-r--r--app/assets/stylesheets/pages/tree.scss5
-rw-r--r--app/assets/stylesheets/startup/startup-dark.scss172
-rw-r--r--app/assets/stylesheets/startup/startup-general.scss71
-rw-r--r--app/assets/stylesheets/startup/startup-signin.scss44
-rw-r--r--app/assets/stylesheets/themes/_dark.scss53
-rw-r--r--app/assets/stylesheets/themes/dark_mode_overrides.scss116
-rw-r--r--app/assets/stylesheets/themes/theme_helper.scss4
-rw-r--r--app/controllers/admin/dashboard_controller.rb9
-rw-r--r--app/controllers/admin/instance_review_controller.rb2
-rw-r--r--app/controllers/admin/serverless/domains_controller.rb78
-rw-r--r--app/controllers/admin/topics/avatars_controller.rb14
-rw-r--r--app/controllers/admin/topics_controller.rb57
-rw-r--r--app/controllers/application_controller.rb30
-rw-r--r--app/controllers/concerns/group_tree.rb9
-rw-r--r--app/controllers/concerns/issuable_actions.rb6
-rw-r--r--app/controllers/concerns/notes_actions.rb2
-rw-r--r--app/controllers/concerns/one_trust_csp.rb19
-rw-r--r--app/controllers/concerns/registry/connection_errors_handler.rb38
-rw-r--r--app/controllers/dashboard/projects_controller.rb2
-rw-r--r--app/controllers/graphql_controller.rb8
-rw-r--r--app/controllers/groups/boards_controller.rb1
-rw-r--r--app/controllers/groups/dependency_proxy/application_controller.rb32
-rw-r--r--app/controllers/groups/dependency_proxy_for_containers_controller.rb46
-rw-r--r--app/controllers/groups/group_members_controller.rb22
-rw-r--r--app/controllers/groups/packages_controller.rb4
-rw-r--r--app/controllers/groups/registry/repositories_controller.rb1
-rw-r--r--app/controllers/groups/runners_controller.rb14
-rw-r--r--app/controllers/groups/settings/ci_cd_controller.rb5
-rw-r--r--app/controllers/health_controller.rb2
-rw-r--r--app/controllers/help_controller.rb1
-rw-r--r--app/controllers/import/bulk_imports_controller.rb24
-rw-r--r--app/controllers/import/url_controller.rb20
-rw-r--r--app/controllers/jira_connect/app_descriptor_controller.rb1
-rw-r--r--app/controllers/jira_connect/application_controller.rb4
-rw-r--r--app/controllers/jira_connect/events_controller.rb31
-rw-r--r--app/controllers/metrics_controller.rb1
-rw-r--r--app/controllers/profiles/passwords_controller.rb25
-rw-r--r--app/controllers/profiles/two_factor_auths_controller.rb2
-rw-r--r--app/controllers/profiles_controller.rb3
-rw-r--r--app/controllers/projects/alerting/notifications_controller.rb12
-rw-r--r--app/controllers/projects/badges_controller.rb5
-rw-r--r--app/controllers/projects/blob_controller.rb1
-rw-r--r--app/controllers/projects/boards_controller.rb1
-rw-r--r--app/controllers/projects/branches_controller.rb5
-rw-r--r--app/controllers/projects/ci/daily_build_group_report_results_controller.rb2
-rw-r--r--app/controllers/projects/ci/pipeline_editor_controller.rb3
-rw-r--r--app/controllers/projects/cluster_agents_controller.rb19
-rw-r--r--app/controllers/projects/google_cloud_controller.rb16
-rw-r--r--app/controllers/projects/issues_controller.rb2
-rw-r--r--app/controllers/projects/jobs_controller.rb5
-rw-r--r--app/controllers/projects/merge_requests_controller.rb20
-rw-r--r--app/controllers/projects/packages/packages_controller.rb4
-rw-r--r--app/controllers/projects/project_members_controller.rb22
-rw-r--r--app/controllers/projects/registry/repositories_controller.rb3
-rw-r--r--app/controllers/projects/security/configuration_controller.rb2
-rw-r--r--app/controllers/projects/serverless/functions_controller.rb2
-rw-r--r--app/controllers/projects/settings/ci_cd_controller.rb5
-rw-r--r--app/controllers/projects/tags_controller.rb12
-rw-r--r--app/controllers/projects/tree_controller.rb2
-rw-r--r--app/controllers/projects/usage_quotas_controller.rb1
-rw-r--r--app/controllers/projects_controller.rb15
-rw-r--r--app/controllers/registrations_controller.rb6
-rw-r--r--app/controllers/repositories/git_http_controller.rb7
-rw-r--r--app/controllers/search_controller.rb6
-rw-r--r--app/controllers/sessions_controller.rb1
-rw-r--r--app/controllers/uploads_controller.rb5
-rw-r--r--app/experiments/new_project_sast_enabled_experiment.rb15
-rw-r--r--app/finders/ci/pipelines_for_merge_request_finder.rb17
-rw-r--r--app/finders/clusters/agents_finder.rb28
-rw-r--r--app/finders/concerns/packages/finder_helper.rb6
-rw-r--r--app/finders/error_tracking/errors_finder.rb7
-rw-r--r--app/finders/issuable_finder.rb7
-rw-r--r--app/finders/issuables/label_filter.rb42
-rw-r--r--app/finders/issues_finder.rb13
-rw-r--r--app/finders/members_finder.rb15
-rw-r--r--app/finders/packages/group_packages_finder.rb4
-rw-r--r--app/finders/projects/members/effective_access_level_finder.rb2
-rw-r--r--app/finders/projects/topics_finder.rb29
-rw-r--r--app/finders/projects_finder.rb4
-rw-r--r--app/finders/tags_finder.rb5
-rw-r--r--app/graphql/mutations/ci/runner/delete.rb2
-rw-r--r--app/graphql/mutations/clusters/agent_tokens/create.rb69
-rw-r--r--app/graphql/mutations/clusters/agent_tokens/delete.rb35
-rw-r--r--app/graphql/mutations/clusters/agents/create.rb38
-rw-r--r--app/graphql/mutations/clusters/agents/delete.rb39
-rw-r--r--app/graphql/mutations/customer_relations/contacts/create.rb69
-rw-r--r--app/graphql/mutations/customer_relations/contacts/update.rb61
-rw-r--r--app/graphql/mutations/customer_relations/organizations/create.rb2
-rw-r--r--app/graphql/mutations/customer_relations/organizations/update.rb2
-rw-r--r--app/graphql/mutations/dependency_proxy/group_settings/update.rb49
-rw-r--r--app/graphql/mutations/issues/create.rb5
-rw-r--r--app/graphql/resolvers/board_list_issues_resolver.rb5
-rw-r--r--app/graphql/resolvers/board_list_resolver.rb35
-rw-r--r--app/graphql/resolvers/clusters/agent_tokens_resolver.rb25
-rw-r--r--app/graphql/resolvers/clusters/agents_resolver.rb35
-rw-r--r--app/graphql/resolvers/concerns/issue_resolver_arguments.rb9
-rw-r--r--app/graphql/resolvers/concerns/search_arguments.rb18
-rw-r--r--app/graphql/resolvers/issues_resolver.rb3
-rw-r--r--app/graphql/resolvers/kas/agent_configurations_resolver.rb32
-rw-r--r--app/graphql/resolvers/kas/agent_connections_resolver.rb41
-rw-r--r--app/graphql/resolvers/project_pipeline_resolver.rb17
-rw-r--r--app/graphql/resolvers/project_pipelines_resolver.rb2
-rw-r--r--app/graphql/types/base_field.rb4
-rw-r--r--app/graphql/types/board_list_type.rb15
-rw-r--r--app/graphql/types/ci/runner_status_enum.rb15
-rw-r--r--app/graphql/types/ci/runner_type.rb15
-rw-r--r--app/graphql/types/ci/runner_web_url_edge.rb31
-rw-r--r--app/graphql/types/clusters/agent_token_type.rb52
-rw-r--r--app/graphql/types/clusters/agent_type.rb67
-rw-r--r--app/graphql/types/concerns/find_closest.rb14
-rw-r--r--app/graphql/types/container_expiration_policy_older_than_enum.rb1
-rw-r--r--app/graphql/types/container_repository_details_type.rb6
-rw-r--r--app/graphql/types/container_repository_type.rb6
-rw-r--r--app/graphql/types/customer_relations/contact_type.rb2
-rw-r--r--app/graphql/types/customer_relations/organization_type.rb2
-rw-r--r--app/graphql/types/error_tracking/sentry_detailed_error_type.rb3
-rw-r--r--app/graphql/types/group_type.rb4
-rw-r--r--app/graphql/types/issue_type.rb3
-rw-r--r--app/graphql/types/issues/negated_issue_filter_input_type.rb4
-rw-r--r--app/graphql/types/kas/agent_configuration_type.rb17
-rw-r--r--app/graphql/types/kas/agent_connection_type.rb32
-rw-r--r--app/graphql/types/kas/agent_metadata_type.rb33
-rw-r--r--app/graphql/types/merge_requests/interacts_with_merge_request.rb2
-rw-r--r--app/graphql/types/milestone_wildcard_id_enum.rb2
-rw-r--r--app/graphql/types/mutation_type.rb7
-rw-r--r--app/graphql/types/packages/nuget/metadatum_type.rb6
-rw-r--r--app/graphql/types/packages/package_type.rb7
-rw-r--r--app/graphql/types/permission_types/ci/runner.rb13
-rw-r--r--app/graphql/types/project_type.rb20
-rw-r--r--app/graphql/types/query_type.rb4
-rw-r--r--app/helpers/application_settings_helper.rb15
-rw-r--r--app/helpers/avatars_helper.rb4
-rw-r--r--app/helpers/ci/jobs_helper.rb2
-rw-r--r--app/helpers/ci/runners_helper.rb2
-rw-r--r--app/helpers/commits_helper.rb9
-rw-r--r--app/helpers/feature_flags_helper.rb11
-rw-r--r--app/helpers/groups_helper.rb4
-rw-r--r--app/helpers/hooks_helper.rb9
-rw-r--r--app/helpers/integrations_helper.rb9
-rw-r--r--app/helpers/issuables_helper.rb2
-rw-r--r--app/helpers/issues_helper.rb5
-rw-r--r--app/helpers/one_trust_helper.rb10
-rw-r--r--app/helpers/packages_helper.rb2
-rw-r--r--app/helpers/projects/cluster_agents_helper.rb10
-rw-r--r--app/helpers/projects_helper.rb7
-rw-r--r--app/helpers/routing/pseudonymization_helper.rb7
-rw-r--r--app/helpers/search_helper.rb4
-rw-r--r--app/helpers/startupjs_helper.rb7
-rw-r--r--app/helpers/tab_helper.rb77
-rw-r--r--app/helpers/time_zone_helper.rb2
-rw-r--r--app/helpers/timeboxes_helper.rb13
-rw-r--r--app/helpers/user_callouts_helper.rb6
-rw-r--r--app/helpers/workhorse_helper.rb9
-rw-r--r--app/models/analytics/cycle_analytics/issue_stage_event.rb5
-rw-r--r--app/models/analytics/cycle_analytics/merge_request_stage_event.rb5
-rw-r--r--app/models/application_setting.rb10
-rw-r--r--app/models/application_setting_implementation.rb7
-rw-r--r--app/models/audit_event.rb2
-rw-r--r--app/models/award_emoji.rb2
-rw-r--r--app/models/bulk_import.rb11
-rw-r--r--app/models/bulk_imports/entity.rb14
-rw-r--r--app/models/bulk_imports/export.rb2
-rw-r--r--app/models/bulk_imports/export_status.rb2
-rw-r--r--app/models/bulk_imports/file_transfer/base_config.rb32
-rw-r--r--app/models/bulk_imports/file_transfer/group_config.rb6
-rw-r--r--app/models/bulk_imports/file_transfer/project_config.rb15
-rw-r--r--app/models/bulk_imports/tracker.rb2
-rw-r--r--app/models/ci/bridge.rb2
-rw-r--r--app/models/ci/build.rb72
-rw-r--r--app/models/ci/build_metadata.rb4
-rw-r--r--app/models/ci/build_need.rb2
-rw-r--r--app/models/ci/build_runner_session.rb2
-rw-r--r--app/models/ci/build_trace_chunk.rb2
-rw-r--r--app/models/ci/build_trace_metadata.rb11
-rw-r--r--app/models/ci/job_token/project_scope_link.rb2
-rw-r--r--app/models/ci/job_token/scope.rb11
-rw-r--r--app/models/ci/pipeline.rb31
-rw-r--r--app/models/ci/processable.rb3
-rw-r--r--app/models/ci/resource_group.rb32
-rw-r--r--app/models/ci/runner.rb26
-rw-r--r--app/models/ci/runner_namespace.rb1
-rw-r--r--app/models/ci/runner_project.rb1
-rw-r--r--app/models/ci/stage.rb2
-rw-r--r--app/models/clusters/agents/group_authorization.rb4
-rw-r--r--app/models/clusters/agents/implicit_authorization.rb5
-rw-r--r--app/models/clusters/agents/project_authorization.rb4
-rw-r--r--app/models/clusters/applications/runner.rb2
-rw-r--r--app/models/clusters/integrations/elastic_stack.rb2
-rw-r--r--app/models/clusters/integrations/prometheus.rb2
-rw-r--r--app/models/commit.rb2
-rw-r--r--app/models/commit_status.rb3
-rw-r--r--app/models/concerns/analytics/cycle_analytics/stage.rb3
-rw-r--r--app/models/concerns/analytics/cycle_analytics/stage_event_model.rb54
-rw-r--r--app/models/concerns/avatarable.rb3
-rw-r--r--app/models/concerns/bulk_insert_safe.rb12
-rw-r--r--app/models/concerns/checksummable.rb6
-rw-r--r--app/models/concerns/ci/has_status.rb1
-rw-r--r--app/models/concerns/ci/metadatable.rb1
-rw-r--r--app/models/concerns/enums/ci/commit_status.rb1
-rw-r--r--app/models/concerns/has_repository.rb4
-rw-r--r--app/models/concerns/integrations/has_data_fields.rb1
-rw-r--r--app/models/concerns/issue_available_features.rb3
-rw-r--r--app/models/concerns/packages/debian/distribution.rb10
-rw-r--r--app/models/concerns/restricted_signup.rb42
-rw-r--r--app/models/concerns/routable.rb3
-rw-r--r--app/models/concerns/ttl_expirable.rb20
-rw-r--r--app/models/concerns/vulnerability_finding_helpers.rb9
-rw-r--r--app/models/container_expiration_policy.rb1
-rw-r--r--app/models/custom_emoji.rb2
-rw-r--r--app/models/customer_relations/contact.rb3
-rw-r--r--app/models/customer_relations/organization.rb2
-rw-r--r--app/models/dependency_proxy/blob.rb5
-rw-r--r--app/models/dependency_proxy/image_ttl_group_policy.rb2
-rw-r--r--app/models/dependency_proxy/manifest.rb5
-rw-r--r--app/models/deployment.rb62
-rw-r--r--app/models/environment.rb15
-rw-r--r--app/models/environment_status.rb10
-rw-r--r--app/models/error_tracking/error.rb15
-rw-r--r--app/models/error_tracking/error_event.rb4
-rw-r--r--app/models/error_tracking/project_error_tracking_setting.rb25
-rw-r--r--app/models/group.rb20
-rw-r--r--app/models/instance_configuration.rb12
-rw-r--r--app/models/integrations/open_project.rb20
-rw-r--r--app/models/integrations/open_project_tracker_data.rb18
-rw-r--r--app/models/integrations/unify_circuit.rb11
-rw-r--r--app/models/issue.rb44
-rw-r--r--app/models/lfs_object.rb2
-rw-r--r--app/models/loose_foreign_keys/deleted_record.rb44
-rw-r--r--app/models/member.rb25
-rw-r--r--app/models/members/group_member.rb8
-rw-r--r--app/models/members/project_member.rb14
-rw-r--r--app/models/merge_request.rb32
-rw-r--r--app/models/merge_request_diff.rb2
-rw-r--r--app/models/metrics/dashboard/annotation.rb6
-rw-r--r--app/models/namespace.rb94
-rw-r--r--app/models/namespace/root_storage_statistics.rb2
-rw-r--r--app/models/namespaces/user_namespace.rb2
-rw-r--r--app/models/note.rb4
-rw-r--r--app/models/operations/feature_flag.rb37
-rw-r--r--app/models/operations/feature_flag_scope.rb66
-rw-r--r--app/models/packages/composer/cache_file.rb4
-rw-r--r--app/models/packages/helm/file_metadatum.rb2
-rw-r--r--app/models/pages_domain.rb13
-rw-r--r--app/models/preloaders/merge_requests_preloader.rb19
-rw-r--r--app/models/product_analytics_event.rb2
-rw-r--r--app/models/project.rb83
-rw-r--r--app/models/project_setting.rb4
-rw-r--r--app/models/project_statistics.rb3
-rw-r--r--app/models/projects/project_topic.rb2
-rw-r--r--app/models/projects/topic.rb20
-rw-r--r--app/models/protected_branch.rb2
-rw-r--r--app/models/release.rb1
-rw-r--r--app/models/repository.rb10
-rw-r--r--app/models/upload.rb12
-rw-r--r--app/models/user.rb35
-rw-r--r--app/models/user_callout.rb3
-rw-r--r--app/models/user_detail.rb7
-rw-r--r--app/models/user_highest_role.rb8
-rw-r--r--app/models/user_preference.rb1
-rw-r--r--app/models/users/credit_card_validation.rb13
-rw-r--r--app/policies/ci/resource_group_policy.rb7
-rw-r--r--app/policies/clusters/agent_policy.rb9
-rw-r--r--app/policies/clusters/agent_token_policy.rb9
-rw-r--r--app/policies/group_policy.rb5
-rw-r--r--app/policies/list_policy.rb5
-rw-r--r--app/policies/namespace_policy.rb29
-rw-r--r--app/policies/namespaces/project_namespace_policy.rb9
-rw-r--r--app/policies/namespaces/user_namespace_policy.rb28
-rw-r--r--app/policies/project_policy.rb3
-rw-r--r--app/presenters/README.md95
-rw-r--r--app/presenters/alert_management/alert_presenter.rb6
-rw-r--r--app/presenters/award_emoji_presenter.rb2
-rw-r--r--app/presenters/blob_presenter.rb2
-rw-r--r--app/presenters/blobs/unfold_presenter.rb2
-rw-r--r--app/presenters/board_presenter.rb2
-rw-r--r--app/presenters/ci/bridge_presenter.rb3
-rw-r--r--app/presenters/ci/build_metadata_presenter.rb3
-rw-r--r--app/presenters/ci/build_presenter.rb2
-rw-r--r--app/presenters/ci/group_variable_presenter.rb2
-rw-r--r--app/presenters/ci/legacy_stage_presenter.rb2
-rw-r--r--app/presenters/ci/pipeline_presenter.rb7
-rw-r--r--app/presenters/ci/processable_presenter.rb1
-rw-r--r--app/presenters/ci/runner_presenter.rb5
-rw-r--r--app/presenters/ci/stage_presenter.rb2
-rw-r--r--app/presenters/ci/trigger_presenter.rb3
-rw-r--r--app/presenters/ci/variable_presenter.rb2
-rw-r--r--app/presenters/clusterable_presenter.rb2
-rw-r--r--app/presenters/clusters/cluster_presenter.rb41
-rw-r--r--app/presenters/clusters/integration_presenter.rb2
-rw-r--r--app/presenters/commit_presenter.rb2
-rw-r--r--app/presenters/commit_status_presenter.rb23
-rw-r--r--app/presenters/dev_ops_report/metric_presenter.rb2
-rw-r--r--app/presenters/environment_presenter.rb2
-rw-r--r--app/presenters/event_presenter.rb3
-rw-r--r--app/presenters/gitlab/blame_presenter.rb2
-rw-r--r--app/presenters/group_clusterable_presenter.rb5
-rw-r--r--app/presenters/group_member_presenter.rb2
-rw-r--r--app/presenters/instance_clusterable_presenter.rb5
-rw-r--r--app/presenters/invitation_presenter.rb2
-rw-r--r--app/presenters/issue_presenter.rb3
-rw-r--r--app/presenters/label_presenter.rb4
-rw-r--r--app/presenters/member_presenter.rb2
-rw-r--r--app/presenters/members_presenter.rb2
-rw-r--r--app/presenters/merge_request_presenter.rb6
-rw-r--r--app/presenters/milestone_presenter.rb2
-rw-r--r--app/presenters/pages_domain_presenter.rb4
-rw-r--r--app/presenters/project_clusterable_presenter.rb5
-rw-r--r--app/presenters/project_hook_presenter.rb2
-rw-r--r--app/presenters/project_member_presenter.rb2
-rw-r--r--app/presenters/project_presenter.rb5
-rw-r--r--app/presenters/projects/import_export/project_export_presenter.rb10
-rw-r--r--app/presenters/projects/settings/deploy_keys_presenter.rb2
-rw-r--r--app/presenters/prometheus_alert_presenter.rb2
-rw-r--r--app/presenters/release_presenter.rb6
-rw-r--r--app/presenters/releases/evidence_presenter.rb2
-rw-r--r--app/presenters/search_service_presenter.rb3
-rw-r--r--app/presenters/sentry_error_presenter.rb2
-rw-r--r--app/presenters/service_hook_presenter.rb2
-rw-r--r--app/presenters/snippet_blob_presenter.rb2
-rw-r--r--app/presenters/snippet_presenter.rb5
-rw-r--r--app/presenters/terraform/modules_presenter.rb2
-rw-r--r--app/presenters/todo_presenter.rb2
-rw-r--r--app/presenters/tree_entry_presenter.rb2
-rw-r--r--app/presenters/user_presenter.rb2
-rw-r--r--app/presenters/web_hook_log_presenter.rb2
-rw-r--r--app/serializers/feature_flag_entity.rb4
-rw-r--r--app/serializers/feature_flag_scope_entity.rb12
-rw-r--r--app/serializers/member_entity.rb6
-rw-r--r--app/serializers/merge_request_metrics_helper.rb28
-rw-r--r--app/serializers/merge_request_poll_cached_widget_entity.rb25
-rw-r--r--app/serializers/merge_request_widget_entity.rb5
-rw-r--r--app/services/base_project_service.rb10
-rw-r--r--app/services/boards/issues/list_service.rb2
-rw-r--r--app/services/bulk_import_service.rb70
-rw-r--r--app/services/bulk_imports/create_service.rb83
-rw-r--r--app/services/bulk_imports/file_export_service.rb42
-rw-r--r--app/services/bulk_imports/get_importable_data_service.rb45
-rw-r--r--app/services/bulk_imports/relation_export_service.rb57
-rw-r--r--app/services/bulk_imports/tree_export_service.rb43
-rw-r--r--app/services/bulk_imports/uploads_export_service.rb49
-rw-r--r--app/services/ci/archive_trace_service.rb11
-rw-r--r--app/services/ci/destroy_pipeline_service.rb3
-rw-r--r--app/services/ci/pipelines/add_job_service.rb10
-rw-r--r--app/services/ci/pipelines/hook_service.rb34
-rw-r--r--app/services/ci/process_pipeline_service.rb37
-rw-r--r--app/services/ci/queue/build_queue_service.rb2
-rw-r--r--app/services/ci/register_job_service.rb57
-rw-r--r--app/services/ci/resource_groups/assign_resource_from_resource_group_service.rb2
-rw-r--r--app/services/ci/retry_build_service.rb9
-rw-r--r--app/services/ci/retry_pipeline_service.rb9
-rw-r--r--app/services/ci/stuck_builds/drop_pending_service.rb42
-rw-r--r--app/services/ci/stuck_builds/drop_running_service.rb31
-rw-r--r--app/services/ci/stuck_builds/drop_scheduled_service.rb23
-rw-r--r--app/services/ci/stuck_builds/drop_service.rb62
-rw-r--r--app/services/ci/update_build_state_service.rb2
-rw-r--r--app/services/ci/update_pending_build_service.rb2
-rw-r--r--app/services/clusters/agent_tokens/create_service.rb31
-rw-r--r--app/services/clusters/agents/create_service.rb29
-rw-r--r--app/services/clusters/agents/delete_service.rb23
-rw-r--r--app/services/clusters/agents/refresh_authorization_service.rb2
-rw-r--r--app/services/concerns/rate_limited_service.rb93
-rw-r--r--app/services/container_expiration_policies/cleanup_service.rb6
-rw-r--r--app/services/customer_relations/contacts/base_service.rb17
-rw-r--r--app/services/customer_relations/contacts/create_service.rb41
-rw-r--r--app/services/customer_relations/contacts/update_service.rb24
-rw-r--r--app/services/customer_relations/organizations/base_service.rb2
-rw-r--r--app/services/customer_relations/organizations/create_service.rb4
-rw-r--r--app/services/dependency_proxy/auth_token_service.rb12
-rw-r--r--app/services/dependency_proxy/find_or_create_blob_service.rb4
-rw-r--r--app/services/dependency_proxy/find_or_create_manifest_service.rb10
-rw-r--r--app/services/dependency_proxy/group_settings/update_service.rb37
-rw-r--r--app/services/deployments/older_deployments_drop_service.rb12
-rw-r--r--app/services/error_tracking/list_issues_service.rb9
-rw-r--r--app/services/feature_flags/base_service.rb8
-rw-r--r--app/services/feature_flags/create_service.rb2
-rw-r--r--app/services/feature_flags/destroy_service.rb2
-rw-r--r--app/services/feature_flags/hook_service.rb28
-rw-r--r--app/services/feature_flags/update_service.rb24
-rw-r--r--app/services/groups/transfer_service.rb14
-rw-r--r--app/services/import/validate_remote_git_endpoint_service.rb76
-rw-r--r--app/services/issuable/import_csv/base_service.rb9
-rw-r--r--app/services/issues/clone_service.rb22
-rw-r--r--app/services/issues/close_service.rb19
-rw-r--r--app/services/issues/create_service.rb4
-rw-r--r--app/services/issues/move_service.rb22
-rw-r--r--app/services/issues/relative_position_rebalancing_service.rb6
-rw-r--r--app/services/issues/reopen_service.rb15
-rw-r--r--app/services/merge_requests/mergeability/check_base_service.rb36
-rw-r--r--app/services/merge_requests/mergeability/check_ci_status_service.rb22
-rw-r--r--app/services/merge_requests/mergeability/run_checks_service.rb54
-rw-r--r--app/services/merge_requests/update_service.rb2
-rw-r--r--app/services/metrics/dashboard/annotations/create_service.rb6
-rw-r--r--app/services/metrics/dashboard/annotations/delete_service.rb4
-rw-r--r--app/services/metrics/users_starred_dashboards/create_service.rb4
-rw-r--r--app/services/packages/composer/create_package_service.rb4
-rw-r--r--app/services/projects/after_rename_service.rb8
-rw-r--r--app/services/projects/container_repository/cache_tags_created_at_service.rb70
-rw-r--r--app/services/projects/container_repository/cleanup_tags_service.rb176
-rw-r--r--app/services/projects/create_service.rb6
-rw-r--r--app/services/projects/destroy_service.rb24
-rw-r--r--app/services/projects/group_links/update_service.rb22
-rw-r--r--app/services/projects/import_service.rb23
-rw-r--r--app/services/projects/overwrite_project_service.rb4
-rw-r--r--app/services/projects/participants_service.rb13
-rw-r--r--app/services/projects/transfer_service.rb45
-rw-r--r--app/services/projects/update_pages_service.rb10
-rw-r--r--app/services/projects/update_service.rb33
-rw-r--r--app/services/search/global_service.rb2
-rw-r--r--app/services/security/ci_configuration/base_create_service.rb6
-rw-r--r--app/services/security/ci_configuration/sast_create_service.rb17
-rw-r--r--app/services/service_ping/submit_service.rb2
-rw-r--r--app/services/terraform/remote_state_handler.rb4
-rw-r--r--app/services/user_project_access_changed_service.rb2
-rw-r--r--app/services/users/update_service.rb22
-rw-r--r--app/services/users/upsert_credit_card_validation_service.rb17
-rw-r--r--app/uploaders/dependency_proxy/file_uploader.rb1
-rw-r--r--app/views/admin/application_settings/_abuse.html.haml2
-rw-r--r--app/views/admin/application_settings/_account_and_limit.html.haml18
-rw-r--r--app/views/admin/application_settings/_ci_cd.html.haml7
-rw-r--r--app/views/admin/application_settings/_files_limits.html.haml34
-rw-r--r--app/views/admin/application_settings/_help_page.html.haml13
-rw-r--r--app/views/admin/application_settings/_mailgun.html.haml2
-rw-r--r--app/views/admin/application_settings/_network_rate_limits.html.haml33
-rw-r--r--app/views/admin/application_settings/_package_registry_limits.html.haml32
-rw-r--r--app/views/admin/application_settings/_performance.html.haml17
-rw-r--r--app/views/admin/application_settings/_snowplow.html.haml2
-rw-r--r--app/views/admin/application_settings/_spam.html.haml49
-rw-r--r--app/views/admin/application_settings/_terminal.html.haml2
-rw-r--r--app/views/admin/application_settings/_usage.html.haml22
-rw-r--r--app/views/admin/application_settings/appearances/preview_sign_in.html.haml7
-rw-r--r--app/views/admin/application_settings/general.html.haml3
-rw-r--r--app/views/admin/application_settings/metrics_and_profiling.html.haml2
-rw-r--r--app/views/admin/application_settings/network.html.haml19
-rw-r--r--app/views/admin/application_settings/reporting.html.haml7
-rw-r--r--app/views/admin/dashboard/_security_newsletter_callout.html.haml14
-rw-r--r--app/views/admin/dashboard/index.html.haml1
-rw-r--r--app/views/admin/hook_logs/_index.html.haml40
-rw-r--r--app/views/admin/projects/index.html.haml35
-rw-r--r--app/views/admin/projects/show.html.haml11
-rw-r--r--app/views/admin/runners/show.html.haml2
-rw-r--r--app/views/admin/serverless/domains/_form.html.haml99
-rw-r--r--app/views/admin/serverless/domains/index.html.haml25
-rw-r--r--app/views/admin/sessions/_new_base.html.haml2
-rw-r--r--app/views/admin/topics/_form.html.haml40
-rw-r--r--app/views/admin/topics/_topic.html.haml17
-rw-r--r--app/views/admin/topics/edit.html.haml4
-rw-r--r--app/views/admin/topics/index.html.haml19
-rw-r--r--app/views/admin/topics/new.html.haml4
-rw-r--r--app/views/admin/users/_access_levels.html.haml24
-rw-r--r--app/views/admin/users/_form.html.haml6
-rw-r--r--app/views/admin/users/_head.html.haml17
-rw-r--r--app/views/admin/users/show.html.haml3
-rw-r--r--app/views/authentication/_authenticate.html.haml3
-rw-r--r--app/views/authentication/_register.html.haml4
-rw-r--r--app/views/clusters/clusters/_advanced_settings_tab.html.haml5
-rw-r--r--app/views/clusters/clusters/_details_tab.html.haml5
-rw-r--r--app/views/clusters/clusters/_health_tab.html.haml5
-rw-r--r--app/views/clusters/clusters/_integrations_tab.html.haml8
-rw-r--r--app/views/clusters/clusters/_namespace.html.haml3
-rw-r--r--app/views/clusters/clusters/aws/_new.html.haml4
-rw-r--r--app/views/clusters/clusters/show.html.haml17
-rw-r--r--app/views/dashboard/_activity_head.html.haml14
-rw-r--r--app/views/dashboard/_groups_head.html.haml10
-rw-r--r--app/views/devise/confirmations/almost_there.haml11
-rw-r--r--app/views/devise/mailer/_confirmation_instructions_secondary.text.erb2
-rw-r--r--app/views/devise/passwords/edit.html.haml4
-rw-r--r--app/views/devise/registrations/new.html.haml1
-rw-r--r--app/views/devise/sessions/_new_base.html.haml8
-rw-r--r--app/views/devise/sessions/_new_crowd.html.haml2
-rw-r--r--app/views/devise/sessions/_new_ldap.html.haml2
-rw-r--r--app/views/devise/sessions/new.html.haml1
-rw-r--r--app/views/devise/shared/_omniauth_box.html.haml10
-rw-r--r--app/views/devise/shared/_signup_box.html.haml1
-rw-r--r--app/views/devise/shared/_signup_omniauth_provider_list.haml8
-rw-r--r--app/views/devise/shared/_signup_omniauth_providers.haml2
-rw-r--r--app/views/devise/shared/_signup_omniauth_providers_top.haml2
-rw-r--r--app/views/groups/_group_admin_settings.html.haml2
-rw-r--r--app/views/groups/_home_panel.html.haml12
-rw-r--r--app/views/groups/_import_group_from_another_instance_panel.html.haml13
-rw-r--r--app/views/groups/dependency_proxies/_url.html.haml12
-rw-r--r--app/views/groups/dependency_proxies/show.html.haml31
-rw-r--r--app/views/groups/edit.html.haml7
-rw-r--r--app/views/groups/issues.html.haml2
-rw-r--r--app/views/groups/registry/repositories/index.html.haml3
-rw-r--r--app/views/groups/runners/_runner.html.haml2
-rw-r--r--app/views/groups/settings/_general.html.haml3
-rw-r--r--app/views/groups/settings/_lfs.html.haml4
-rw-r--r--app/views/groups/settings/_permissions.html.haml6
-rw-r--r--app/views/groups/settings/_two_factor_auth.html.haml10
-rw-r--r--app/views/groups/settings/packages_and_registries/show.html.haml5
-rw-r--r--app/views/help/instance_configuration/_gitlab_pages.html.haml2
-rw-r--r--app/views/help/instance_configuration/_rate_limits.html.haml1
-rw-r--r--app/views/import/_githubish_status.html.haml2
-rw-r--r--app/views/import/bitbucket_server/new.html.haml2
-rw-r--r--app/views/import/bulk_imports/history.html.haml6
-rw-r--r--app/views/import/fogbugz/new.html.haml2
-rw-r--r--app/views/import/fogbugz/new_user_map.html.haml2
-rw-r--r--app/views/import/gitea/new.html.haml2
-rw-r--r--app/views/import/github/new.html.haml2
-rw-r--r--app/views/import/gitlab_projects/new.html.haml2
-rw-r--r--app/views/import/manifest/new.html.haml2
-rw-r--r--app/views/import/phabricator/new.html.haml2
-rw-r--r--app/views/layouts/_one_trust.html.haml16
-rw-r--r--app/views/layouts/_page.html.haml1
-rw-r--r--app/views/layouts/_startup_js.html.haml22
-rw-r--r--app/views/layouts/header/_default.html.haml3
-rw-r--r--app/views/layouts/nav/_breadcrumbs.html.haml3
-rw-r--r--app/views/layouts/nav/sidebar/_admin.html.haml13
-rw-r--r--app/views/layouts/nav/sidebar/_profile.html.haml2
-rw-r--r--app/views/profiles/_email_settings.html.haml3
-rw-r--r--app/views/profiles/passwords/edit.html.haml10
-rw-r--r--app/views/profiles/passwords/new.html.haml10
-rw-r--r--app/views/profiles/show.html.haml8
-rw-r--r--app/views/profiles/two_factor_auths/show.html.haml2
-rw-r--r--app/views/projects/_files.html.haml3
-rw-r--r--app/views/projects/_home_panel.html.haml9
-rw-r--r--app/views/projects/_import_project_pane.html.haml2
-rw-r--r--app/views/projects/_new_project_fields.html.haml46
-rw-r--r--app/views/projects/blob/show.html.haml1
-rw-r--r--app/views/projects/branches/index.html.haml24
-rw-r--r--app/views/projects/branches/new.html.haml1
-rw-r--r--app/views/projects/ci/pipeline_editor/show.html.haml2
-rw-r--r--app/views/projects/cluster_agents/show.html.haml4
-rw-r--r--app/views/projects/commits/_commit.html.haml10
-rw-r--r--app/views/projects/deployments/_deployment.html.haml2
-rw-r--r--app/views/projects/feature_flags/edit.html.haml8
-rw-r--r--app/views/projects/google_cloud/index.html.haml83
-rw-r--r--app/views/projects/hook_logs/_index.html.haml42
-rw-r--r--app/views/projects/hook_logs/show.html.haml4
-rw-r--r--app/views/projects/issues/_nav_btns.html.haml5
-rw-r--r--app/views/projects/issues/_related_branches.html.haml4
-rw-r--r--app/views/projects/issues/_related_issues.html.haml1
-rw-r--r--app/views/projects/issues/_related_issues_block.html.haml5
-rw-r--r--app/views/projects/merge_requests/_mr_title.html.haml10
-rw-r--r--app/views/projects/merge_requests/_nav_btns.html.haml6
-rw-r--r--app/views/projects/merge_requests/_widget.html.haml2
-rw-r--r--app/views/projects/merge_requests/conflicts/show.html.haml2
-rw-r--r--app/views/projects/merge_requests/show.html.haml2
-rw-r--r--app/views/projects/mirrors/_mirror_repos.html.haml4
-rw-r--r--app/views/projects/mirrors/_mirror_repos_push.html.haml2
-rw-r--r--app/views/projects/pipelines/_with_tabs.html.haml6
-rw-r--r--app/views/projects/product_analytics/test.html.haml1
-rw-r--r--app/views/projects/registry/repositories/index.html.haml3
-rw-r--r--app/views/projects/settings/operations/_error_tracking.html.haml1
-rw-r--r--app/views/projects/snippets/show.html.haml2
-rw-r--r--app/views/projects/tags/index.html.haml3
-rw-r--r--app/views/projects/tags/new.html.haml1
-rw-r--r--app/views/projects/tree/show.html.haml1
-rw-r--r--app/views/projects/usage_quotas/index.html.haml2
-rw-r--r--app/views/search/results/_issuable.html.haml7
-rw-r--r--app/views/shared/_import_form.html.haml11
-rw-r--r--app/views/shared/_milestones_filter.html.haml28
-rw-r--r--app/views/shared/_web_ide_path.html.haml4
-rw-r--r--app/views/shared/boards/_show.html.haml2
-rw-r--r--app/views/shared/builds/_build_output.html.haml2
-rw-r--r--app/views/shared/builds/_tabs.html.haml41
-rw-r--r--app/views/shared/deploy_tokens/_form.html.haml1
-rw-r--r--app/views/shared/empty_states/_topics.html.haml7
-rw-r--r--app/views/shared/errors/_gitaly_unavailable.html.haml8
-rw-r--r--app/views/shared/hook_logs/_recent_deliveries_table.html.haml34
-rw-r--r--app/views/shared/hook_logs/_status_label.html.haml2
-rw-r--r--app/views/shared/integrations/_tabs.html.haml23
-rw-r--r--app/views/shared/issuable/_nav.html.haml24
-rw-r--r--app/views/shared/issuable/_search_bar.html.haml2
-rw-r--r--app/views/shared/issuable/_sidebar.html.haml11
-rw-r--r--app/views/shared/issuable/nav_links/_all.html.haml5
-rw-r--r--app/views/shared/issue_type/_emoji_block.html.haml2
-rw-r--r--app/views/shared/milestones/_sidebar.html.haml6
-rw-r--r--app/views/shared/notes/_comment_button.html.haml29
-rw-r--r--app/views/shared/notes/_hints.html.haml56
-rw-r--r--app/views/shared/notes/_notes_with_form.html.haml1
-rw-r--r--app/views/shared/topics/_search_form.html.haml7
-rw-r--r--app/views/shared/web_hooks/_hook.html.haml6
-rw-r--r--app/views/shared/wikis/edit.html.haml2
-rw-r--r--app/views/snippets/show.html.haml2
-rw-r--r--app/views/users/show.html.haml10
-rw-r--r--app/workers/all_queues.yml100
-rw-r--r--app/workers/authorized_project_update/project_recalculate_per_user_worker.rb25
-rw-r--r--app/workers/authorized_project_update/project_recalculate_worker.rb4
-rw-r--r--app/workers/authorized_project_update/user_refresh_from_replica_worker.rb2
-rw-r--r--app/workers/authorized_project_update/user_refresh_over_user_range_worker.rb5
-rw-r--r--app/workers/bulk_import_worker.rb2
-rw-r--r--app/workers/bulk_imports/export_request_worker.rb5
-rw-r--r--app/workers/bulk_imports/pipeline_worker.rb32
-rw-r--r--app/workers/ci/build_finished_worker.rb10
-rw-r--r--app/workers/ci/create_downstream_pipeline_worker.rb19
-rw-r--r--app/workers/ci/delete_unit_tests_worker.rb2
-rw-r--r--app/workers/ci/pipeline_artifacts/expire_artifacts_worker.rb2
-rw-r--r--app/workers/ci/stuck_builds/drop_running_worker.rb34
-rw-r--r--app/workers/ci/stuck_builds/drop_scheduled_worker.rb34
-rw-r--r--app/workers/cleanup_container_repository_worker.rb4
-rw-r--r--app/workers/concerns/dependency_proxy/cleanup_worker.rb63
-rw-r--r--app/workers/concerns/gitlab/github_import/object_importer.rb11
-rw-r--r--app/workers/concerns/worker_attributes.rb8
-rw-r--r--app/workers/container_expiration_policies/cleanup_container_repository_worker.rb17
-rw-r--r--app/workers/container_expiration_policy_worker.rb2
-rw-r--r--app/workers/create_note_diff_file_worker.rb6
-rw-r--r--app/workers/database/drop_detached_partitions_worker.rb2
-rw-r--r--app/workers/dependency_proxy/cleanup_blob_worker.rb40
-rw-r--r--app/workers/dependency_proxy/cleanup_manifest_worker.rb40
-rw-r--r--app/workers/dependency_proxy/image_ttl_group_policy_worker.rb70
-rw-r--r--app/workers/expire_build_artifacts_worker.rb2
-rw-r--r--app/workers/expire_build_instance_artifacts_worker.rb2
-rw-r--r--app/workers/expire_job_cache_worker.rb8
-rw-r--r--app/workers/gitlab/github_import/stage/finish_import_worker.rb28
-rw-r--r--app/workers/gitlab/github_import/stage/import_base_data_worker.rb16
-rw-r--r--app/workers/gitlab/github_import/stage/import_pull_requests_worker.rb16
-rw-r--r--app/workers/gitlab/github_import/stage/import_repository_worker.rb11
-rw-r--r--app/workers/issue_placement_worker.rb2
-rw-r--r--app/workers/namespaces/in_product_marketing_emails_worker.rb2
-rw-r--r--app/workers/namespaces/onboarding_issue_created_worker.rb2
-rw-r--r--app/workers/namespaces/onboarding_pipeline_created_worker.rb2
-rw-r--r--app/workers/namespaces/onboarding_progress_worker.rb2
-rw-r--r--app/workers/namespaces/onboarding_user_added_worker.rb2
-rw-r--r--app/workers/packages/composer/cache_cleanup_worker.rb14
-rw-r--r--app/workers/packages/composer/cache_update_worker.rb12
-rw-r--r--app/workers/packages/debian/generate_distribution_worker.rb2
-rw-r--r--app/workers/pages_remove_worker.rb16
-rw-r--r--app/workers/pipeline_hooks_worker.rb7
-rw-r--r--app/workers/pipeline_process_worker.rb2
-rw-r--r--app/workers/run_pipeline_schedule_worker.rb11
-rw-r--r--app/workers/stuck_ci_jobs_worker.rb21
-rwxr-xr-xbin/background_jobs10
-rw-r--r--config/README.md171
-rw-r--r--config/application.rb13
-rw-r--r--config/feature_categories.yml6
-rw-r--r--config/feature_flags/development/add_actor_based_user_to_snowplow_tracking.yml8
-rw-r--r--config/feature_flags/development/advanced_search_multi_project_select.yml2
-rw-r--r--config/feature_flags/development/avoid_cross_joins_environments_in_self_and_descendants.yml8
-rw-r--r--config/feature_flags/development/ci_archived_build_trace_checksum.yml8
-rw-r--r--config/feature_flags/development/ci_create_external_pr_pipeline_async.yml2
-rw-r--r--config/feature_flags/development/ci_idempotent_pipeline_process_worker.yml8
-rw-r--r--config/feature_flags/development/ci_include_rules.yml8
-rw-r--r--config/feature_flags/development/ci_minutes_track_live_consumption.yml8
-rw-r--r--config/feature_flags/development/ci_new_query_for_running_stuck_jobs.yml8
-rw-r--r--config/feature_flags/development/ci_optimize_project_records_destruction.yml8
-rw-r--r--config/feature_flags/development/ci_pipeline_add_job_with_lock.yml8
-rw-r--r--config/feature_flags/development/ci_remove_update_retried_from_process_pipeline.yml8
-rw-r--r--config/feature_flags/development/ci_runner_limits.yml8
-rw-r--r--config/feature_flags/development/ci_scoped_job_token.yml2
-rw-r--r--config/feature_flags/development/container_registry_expiration_policies_caching.yml8
-rw-r--r--config/feature_flags/development/create_vulnerabilities_via_api.yml2
-rw-r--r--config/feature_flags/development/decomposed_ci_query_in_pipelines_for_merge_request_finder.yml8
-rw-r--r--config/feature_flags/development/dependency_proxy_workhorse.yml8
-rw-r--r--config/feature_flags/development/ensure_verified_primary_email_for_2fa.yml8
-rw-r--r--config/feature_flags/development/environment_last_visible_pipeline_disable_joins.yml8
-rw-r--r--config/feature_flags/development/finding_ci_pipeline_disable_joins.yml8
-rw-r--r--config/feature_flags/development/gitaly_tags_finder.yml8
-rw-r--r--config/feature_flags/development/gitaly_user_merge_branch_access_error.yml8
-rw-r--r--config/feature_flags/development/help_page_documentation_redirect.yml8
-rw-r--r--config/feature_flags/development/improved_mergeability_checks.yml8
-rw-r--r--config/feature_flags/development/incubation_5mp_google_cloud.yml8
-rw-r--r--config/feature_flags/development/infinitely_collapsible_sections.yml2
-rw-r--r--config/feature_flags/development/jira_connect_asymmetric_jwt.yml8
-rw-r--r--config/feature_flags/development/lazy_load_commits.yml8
-rw-r--r--config/feature_flags/development/linear_application_setting_ancestor_scopes.yml8
-rw-r--r--config/feature_flags/development/linear_ee_group_ancestor_scopes.yml8
-rw-r--r--config/feature_flags/development/linear_group_ancestor_scopes.yml8
-rw-r--r--config/feature_flags/development/linear_group_plans_preloaded_ancestor_scopes.yml8
-rw-r--r--config/feature_flags/development/linear_group_tree_ancestor_scopes.yml8
-rw-r--r--config/feature_flags/development/linear_members_finder_ancestor_scopes.yml8
-rw-r--r--config/feature_flags/development/linear_participants_service_ancestor_scopes.yml8
-rw-r--r--config/feature_flags/development/merge_request_discussion_cache.yml8
-rw-r--r--config/feature_flags/development/mergeability_caching.yml8
-rw-r--r--config/feature_flags/development/mr_changes_fluid_layout.yml8
-rw-r--r--config/feature_flags/development/new_customersdot_staging_url.yml8
-rw-r--r--config/feature_flags/development/new_dir_modal.yml8
-rw-r--r--config/feature_flags/development/operational_vulnerabilities.yml8
-rw-r--r--config/feature_flags/development/package_list_apollo.yml8
-rw-r--r--config/feature_flags/development/pages_smart_check_outdated_sha.yml8
-rw-r--r--config/feature_flags/development/paginated_tree_graphql_query.yml2
-rw-r--r--config/feature_flags/development/pipeline_editor_drawer.yml8
-rw-r--r--config/feature_flags/development/pipeline_editor_empty_state_action.yml8
-rw-r--r--config/feature_flags/development/pipeline_editor_mini_graph.yml8
-rw-r--r--config/feature_flags/development/rate_limited_service_issues_create.yml8
-rw-r--r--config/feature_flags/development/redirect_to_latest_template_jobs_browser_performance_testing.yml8
-rw-r--r--config/feature_flags/development/redirect_to_latest_template_security_api_fuzzing.yml8
-rw-r--r--config/feature_flags/development/redirect_to_latest_template_security_dast.yml8
-rw-r--r--config/feature_flags/development/redirect_to_latest_template_terraform.yml8
-rw-r--r--config/feature_flags/development/redirect_to_latest_template_verify_browser_performance.yml8
-rw-r--r--config/feature_flags/development/refactor_mr_widgets_extensions.yml8
-rw-r--r--config/feature_flags/development/refactor_mr_widgets_extensions_user.yml8
-rw-r--r--config/feature_flags/development/refactor_text_viewer.yml8
-rw-r--r--config/feature_flags/development/reference_cache_memoization.yml8
-rw-r--r--config/feature_flags/development/remove_composer_v1_cache_code.yml8
-rw-r--r--config/feature_flags/development/request_apdex_counters.yml8
-rw-r--r--config/feature_flags/development/search_blobs_language_aggregation.yml8
-rw-r--r--config/feature_flags/development/security_orchestration_policies_configuration.yml8
-rw-r--r--config/feature_flags/development/security_report_ingestion_framework.yml8
-rw-r--r--config/feature_flags/development/serverless_domain.yml8
-rw-r--r--config/feature_flags/development/show_author_on_note.yml8
-rw-r--r--config/feature_flags/development/sort_by_project_users_by_project_authorizations_user_id.yml8
-rw-r--r--config/feature_flags/development/specialized_worker_for_project_share_update_auth_recalculation.yml8
-rw-r--r--config/feature_flags/development/specialized_worker_for_project_transfer_auth_recalculation.yml8
-rw-r--r--config/feature_flags/development/suppress_apollo_errors_during_navigation.yml8
-rw-r--r--config/feature_flags/development/surface_environment_creation_failure.yml8
-rw-r--r--config/feature_flags/development/surface_environment_creation_failure_override.yml8
-rw-r--r--config/feature_flags/development/tags_finder_gitaly.yml8
-rw-r--r--config/feature_flags/development/track_epic_boards_activity.yml8
-rw-r--r--config/feature_flags/development/track_importer_activity.yml8
-rw-r--r--config/feature_flags/development/update_deployment_after_transaction_commit.yml8
-rw-r--r--config/feature_flags/development/usage_data_i_testing_group_code_coverage_visit_total.yml8
-rw-r--r--config/feature_flags/development/usage_data_i_testing_metrics_report_artifact_uploaders.yml8
-rw-r--r--config/feature_flags/development/usage_data_i_testing_summary_widget_total.yml8
-rw-r--r--config/feature_flags/development/usage_data_i_testing_test_case_parsed.yml8
-rw-r--r--config/feature_flags/development/use_upsert_query_for_mr_metrics.yml2
-rw-r--r--config/feature_flags/development/validate_namespace_parent_type.yml2
-rw-r--r--config/feature_flags/development/variable_inside_variable.yml2
-rw-r--r--config/feature_flags/development/vulnerability_flags.yml8
-rw-r--r--config/feature_flags/development/vulnerability_location_image_filter.yml8
-rw-r--r--config/feature_flags/development/workhorse_use_sidechannel.yml8
-rw-r--r--config/feature_flags/experiment/jobs_to_be_done.yml8
-rw-r--r--config/feature_flags/experiment/new_project_sast_enabled.yml8
-rw-r--r--config/feature_flags/ops/ecomm_instrumentation.yml8
-rw-r--r--config/feature_flags/ops/show_terraform_banner.yml8
-rw-r--r--config/gitlab.yml.example6
-rw-r--r--config/initializers/00_active_record_disable_joins.rb11
-rw-r--r--config/initializers/0_acts_as_taggable.rb4
-rw-r--r--config/initializers/1_settings.rb7
-rw-r--r--config/initializers/7_prometheus_metrics.rb2
-rw-r--r--config/initializers/7_redis.rb8
-rw-r--r--config/initializers/action_cable.rb2
-rw-r--r--config/initializers/backtrace_silencers.rb2
-rw-r--r--config/initializers/batch_loader.rb10
-rw-r--r--config/initializers/carrierwave_patch.rb10
-rw-r--r--config/initializers/database_config.rb10
-rw-r--r--config/initializers/gettext_rails_i18n_patch.rb22
-rw-r--r--config/initializers/grape_validators.rb1
-rw-r--r--config/initializers/load_balancing.rb43
-rw-r--r--config/initializers/mailer_retries.rb40
-rw-r--r--config/initializers/postgres_partitioning.rb3
-rw-r--r--config/initializers/postgresql_cte.rb2
-rw-r--r--config/initializers/sidekiq.rb12
-rw-r--r--config/initializers/zz_metrics.rb130
-rw-r--r--config/initializers_before_autoloader/002_sidekiq.rb4
-rw-r--r--config/initializers_before_autoloader/grape_entity_patch.rb27
-rw-r--r--config/locales/en.yml3
-rw-r--r--config/mail_room.yml1
-rw-r--r--config/metrics/counts_28d/20210216175055_merge_requests.yml2
-rw-r--r--config/metrics/counts_28d/20210216175101_merge_requests_users.yml2
-rw-r--r--config/metrics/counts_28d/20210216175405_clusters_applications_cert_managers.yml3
-rw-r--r--config/metrics/counts_28d/20210216175407_clusters_applications_helm.yml3
-rw-r--r--config/metrics/counts_28d/20210216175409_clusters_applications_ingress.yml3
-rw-r--r--config/metrics/counts_28d/20210216175411_clusters_applications_knative.yml3
-rw-r--r--config/metrics/counts_28d/20210216180958_clusters_applications_prometheus.yml3
-rw-r--r--config/metrics/counts_28d/20210216181951_clusters_applications_runner.yml3
-rw-r--r--config/metrics/counts_28d/20210715094458_releases_with_milestones.yml23
-rw-r--r--config/metrics/counts_28d/20210916080405_promoted_issues.yml2
-rw-r--r--config/metrics/counts_28d/20210916201533_clusters_integrations_prometheus.yml21
-rw-r--r--config/metrics/counts_28d/20210929102434_p_ci_templates_implicit_jobs_build_monthly.yml25
-rw-r--r--config/metrics/counts_28d/20210929102736_p_ci_templates_implicit_jobs_deploy_latest_monthly.yml25
-rw-r--r--config/metrics/counts_28d/20210929103010_p_ci_templates_implicit_jobs_deploy_monthly.yml25
-rw-r--r--config/metrics/counts_28d/20210930125418_github_import_project_start_monthly.yml26
-rw-r--r--config/metrics/counts_28d/20210930130531_github_import_project_success_monthly.yml25
-rw-r--r--config/metrics/counts_28d/20210930163813_github_import_project_failure_monthly.yml25
-rw-r--r--config/metrics/counts_7d/20210916100524_groups_gitlab_slack_application_active.yml23
-rw-r--r--config/metrics/counts_7d/20210916101641_projects_gitlab_slack_application_active.yml23
-rw-r--r--config/metrics/counts_7d/20210916101837_instances_gitlab_slack_application_active.yml23
-rw-r--r--config/metrics/counts_7d/20210916102312_templates_gitlab_slack_application_active.yml23
-rw-r--r--config/metrics/counts_7d/20210917040700_groups_inheriting_gitlab_slack_application_active.yml23
-rw-r--r--config/metrics/counts_7d/20210917040956_projects_inheriting_gitlab_slack_application_active.yml23
-rw-r--r--config/metrics/counts_7d/20210929102429_p_ci_templates_implicit_jobs_build_weekly.yml25
-rw-r--r--config/metrics/counts_7d/20210929102731_p_ci_templates_implicit_jobs_deploy_latest_weekly.yml25
-rw-r--r--config/metrics/counts_7d/20210929103006_p_ci_templates_implicit_jobs_deploy_weekly.yml25
-rw-r--r--config/metrics/counts_7d/20210930125411_github_import_project_start_weekly.yml26
-rw-r--r--config/metrics/counts_7d/20210930130525_github_import_project_success_weekly.yml26
-rw-r--r--config/metrics/counts_7d/20210930163807_github_import_project_failure_weekly.yml25
-rw-r--r--config/metrics/counts_all/20210216175255_clusters_applications_helm.yml3
-rw-r--r--config/metrics/counts_all/20210216175257_clusters_applications_ingress.yml3
-rw-r--r--config/metrics/counts_all/20210216175259_clusters_applications_cert_managers.yml3
-rw-r--r--config/metrics/counts_all/20210216175301_clusters_applications_crossplane.yml3
-rw-r--r--config/metrics/counts_all/20210216175303_clusters_applications_prometheus.yml3
-rw-r--r--config/metrics/counts_all/20210216175305_clusters_applications_runner.yml3
-rw-r--r--config/metrics/counts_all/20210216175307_clusters_applications_knative.yml3
-rw-r--r--config/metrics/counts_all/20210216175309_clusters_applications_elastic_stack.yml3
-rw-r--r--config/metrics/counts_all/20210216175310_clusters_applications_jupyter.yml3
-rw-r--r--config/metrics/counts_all/20210216175312_clusters_applications_cilium.yml3
-rw-r--r--config/metrics/counts_all/20210216175329_clusters_applications_cert_managers.yml3
-rw-r--r--config/metrics/counts_all/20210216175331_clusters_applications_helm.yml3
-rw-r--r--config/metrics/counts_all/20210216175333_clusters_applications_ingress.yml3
-rw-r--r--config/metrics/counts_all/20210216175335_clusters_applications_knative.yml3
-rw-r--r--config/metrics/counts_all/20210216175627_templates_asana_active.yml3
-rw-r--r--config/metrics/counts_all/20210216175638_templates_assembla_active.yml3
-rw-r--r--config/metrics/counts_all/20210216175649_templates_bamboo_active.yml3
-rw-r--r--config/metrics/counts_all/20210216175701_templates_bugzilla_active.yml3
-rw-r--r--config/metrics/counts_all/20210216175712_templates_buildkite_active.yml3
-rw-r--r--config/metrics/counts_all/20210216175723_templates_campfire_active.yml3
-rw-r--r--config/metrics/counts_all/20210216175734_templates_confluence_active.yml3
-rw-r--r--config/metrics/counts_all/20210216175745_templates_custom_issue_tracker_active.yml3
-rw-r--r--config/metrics/counts_all/20210216175756_templates_discord_active.yml3
-rw-r--r--config/metrics/counts_all/20210216175807_templates_drone_ci_active.yml3
-rw-r--r--config/metrics/counts_all/20210216175818_templates_emails_on_push_active.yml3
-rw-r--r--config/metrics/counts_all/20210216175829_templates_external_wiki_active.yml3
-rw-r--r--config/metrics/counts_all/20210216175840_templates_flowdock_active.yml3
-rw-r--r--config/metrics/counts_all/20210216175902_templates_hangouts_chat_active.yml3
-rw-r--r--config/metrics/counts_all/20210216175924_templates_irker_active.yml3
-rw-r--r--config/metrics/counts_all/20210216175935_templates_jenkins_active.yml3
-rw-r--r--config/metrics/counts_all/20210216175946_templates_jira_active.yml3
-rw-r--r--config/metrics/counts_all/20210216175957_templates_mattermost_active.yml3
-rw-r--r--config/metrics/counts_all/20210216180008_templates_mattermost_slash_commands_active.yml3
-rw-r--r--config/metrics/counts_all/20210216180019_templates_microsoft_teams_active.yml3
-rw-r--r--config/metrics/counts_all/20210216180030_templates_packagist_active.yml3
-rw-r--r--config/metrics/counts_all/20210216180041_templates_pipelines_email_active.yml3
-rw-r--r--config/metrics/counts_all/20210216180052_templates_pivotaltracker_active.yml3
-rw-r--r--config/metrics/counts_all/20210216180104_templates_pushover_active.yml3
-rw-r--r--config/metrics/counts_all/20210216180115_templates_redmine_active.yml3
-rw-r--r--config/metrics/counts_all/20210216180126_templates_slack_active.yml3
-rw-r--r--config/metrics/counts_all/20210216180137_templates_slack_slash_commands_active.yml3
-rw-r--r--config/metrics/counts_all/20210216180148_templates_teamcity_active.yml3
-rw-r--r--config/metrics/counts_all/20210216180159_templates_unify_circuit_active.yml3
-rw-r--r--config/metrics/counts_all/20210216180210_templates_webex_teams_active.yml3
-rw-r--r--config/metrics/counts_all/20210216180221_templates_youtrack_active.yml3
-rw-r--r--config/metrics/counts_all/20210216180934_templates_prometheus_active.yml3
-rw-r--r--config/metrics/counts_all/20210216180947_clusters_applications_prometheus.yml3
-rw-r--r--config/metrics/counts_all/20210216181949_clusters_applications_runner.yml3
-rw-r--r--config/metrics/counts_all/20210216182112_sast_jobs.yml21
-rw-r--r--config/metrics/counts_all/20210216182114_secret_detection_jobs.yml21
-rw-r--r--config/metrics/counts_all/20210216182551_templates_datadog_active.yml3
-rw-r--r--config/metrics/counts_all/20210216182618_templates_ewm_active.yml3
-rw-r--r--config/metrics/counts_all/20210216182907_package_events_i_package_container_delete_package.yml3
-rw-r--r--config/metrics/counts_all/20210216182909_package_events_i_package_container_pull_package.yml3
-rw-r--r--config/metrics/counts_all/20210216182911_package_events_i_package_container_push_package.yml3
-rw-r--r--config/metrics/counts_all/20210216182917_package_events_i_package_debian_push_package.yml3
-rw-r--r--config/metrics/counts_all/20210715094459_releases_with_milestones.yml23
-rw-r--r--config/metrics/counts_all/20210915082040_projects_with_expiration_policy_enabled_with_older_than_set_to_60d.yml22
-rw-r--r--config/metrics/counts_all/20210916200930_clusters_integrations_prometheus.yml21
-rw-r--r--config/metrics/counts_all/20210916200931_clusters_integrations_elastic_stack.yml21
-rw-r--r--config/metrics/counts_all/20210916202342_clusters_integrations_prometheus.yml21
-rw-r--r--config/metrics/license/20210204124829_active_user_count.yml1
-rw-r--r--config/redis.cache.yml.example38
-rw-r--r--config/redis.queues.yml.example38
-rw-r--r--config/redis.shared_state.yml.example38
-rw-r--r--config/redis.trace_chunks.yml.example38
-rw-r--r--config/routes.rb2
-rw-r--r--config/routes/admin.rb15
-rw-r--r--config/routes/group.rb2
-rw-r--r--config/routes/import.rb5
-rw-r--r--config/routes/project.rb4
-rw-r--r--config/routes/uploads.rb4
-rw-r--r--config/sidekiq_queues.yml8
-rw-r--r--config/webpack.config.js8
-rw-r--r--danger/database/Dangerfile4
-rw-r--r--danger/pajamas/Dangerfile4
-rw-r--r--danger/plugins/specs.rb10
-rw-r--r--danger/product_intelligence/Dangerfile10
-rw-r--r--danger/roulette/Dangerfile3
-rw-r--r--danger/specs/Dangerfile19
-rw-r--r--data/deprecations/14-0-nfs-fot-git-repository-storage.yml22
-rw-r--r--data/deprecations/14-2-deprecation-task-runner.yml16
-rw-r--r--data/deprecations/14-3-deprecation-release-cli.yml13
-rw-r--r--data/deprecations/14-3-repository-push-audit-events.yml2
-rw-r--r--data/deprecations/distribution_deprecations_14-3.yml8
-rw-r--r--data/deprecations/templates/_deprecation_template.md.erb10
-rw-r--r--data/deprecations/templates/example.yml4
-rw-r--r--db/init_structure.sql11226
-rw-r--r--db/migrate/20181228175414_init_schema.rb2551
-rw-r--r--db/migrate/20190103140724_make_legacy_false_default.rb9
-rw-r--r--db/migrate/20190104182041_cleanup_legacy_artifact_migration.rb34
-rw-r--r--db/migrate/20190107151020_add_services_type_index.rb20
-rw-r--r--db/migrate/20190108192941_remove_partial_index_from_ci_builds_artifacts_file.rb18
-rw-r--r--db/migrate/20190109153125_add_merge_request_external_diffs.rb25
-rw-r--r--db/migrate/20190114172110_add_domain_to_cluster.rb9
-rw-r--r--db/migrate/20190115054216_add_error_notification_sent_to_remote_mirrors.rb11
-rw-r--r--db/migrate/20190115092821_add_columns_project_error_tracking_settings.rb18
-rw-r--r--db/migrate/20190116234221_add_sorting_fields_to_user_preference.rb23
-rw-r--r--db/migrate/20190130091630_add_local_cached_markdown_version.rb11
-rw-r--r--db/migrate/20190206193120_add_index_to_tags.rb18
-rw-r--r--db/migrate/20190211131150_add_state_id_to_issuables.rb17
-rw-r--r--db/migrate/20190215154930_add_merge_pipelines_enabled_to_ci_cd_settings.rb11
-rw-r--r--db/migrate/20190218134158_add_masked_to_ci_variables.rb21
-rw-r--r--db/migrate/20190218134209_add_masked_to_ci_group_variables.rb21
-rw-r--r--db/migrate/20190219201635_add_asset_proxy_settings.rb20
-rw-r--r--db/migrate/20190220142344_add_email_header_and_footer_enabled_flag_to_appearances_table.rb17
-rw-r--r--db/migrate/20190220150130_add_extra_shas_to_ci_pipelines.rb12
-rw-r--r--db/migrate/20190222051615_add_indexes_for_merge_request_diffs_query.rb42
-rw-r--r--db/migrate/20190225152525_add_auto_dev_ops_enabled_to_namespaces.rb9
-rw-r--r--db/migrate/20190225160301_add_runner_tokens_indexes.rb24
-rw-r--r--db/migrate/20190228192410_add_multi_line_attributes_to_suggestion.rb19
-rw-r--r--db/migrate/20190301182457_add_external_hostname_to_ingress_and_knative.rb12
-rw-r--r--db/migrate/20190312071108_add_detected_repository_languages_to_projects.rb12
-rw-r--r--db/migrate/20190312113229_add_remove_at_to_pages_domains.rb10
-rw-r--r--db/migrate/20190312113634_add_remove_at_index_to_pages_domains.rb19
-rw-r--r--db/migrate/20190315191339_create_merge_request_assignees_table.rb22
-rw-r--r--db/migrate/20190320174702_add_lets_encrypt_notification_email_to_application_settings.rb17
-rw-r--r--db/migrate/20190322164830_add_auto_ssl_enabled_to_pages_domain.rb17
-rw-r--r--db/migrate/20190325080727_truncate_user_fullname.rb23
-rw-r--r--db/migrate/20190325105715_add_fields_to_user_preferences.rb24
-rw-r--r--db/migrate/20190325165127_add_managed_to_cluster.rb17
-rw-r--r--db/migrate/20190326164045_import_common_metrics_knative.rb15
-rw-r--r--db/migrate/20190327163904_add_notification_email_to_notification_settings.rb13
-rw-r--r--db/migrate/20190329085614_add_lets_encrypt_terms_of_service_accepted_to_application_settings.rb21
-rw-r--r--db/migrate/20190402150158_backport_enterprise_schema.rb2195
-rw-r--r--db/migrate/20190403161806_update_designs_index.rb21
-rw-r--r--db/migrate/20190408163745_prometheus_knative05_fix.rb18
-rw-r--r--db/migrate/20190409224933_add_name_to_geo_nodes.rb26
-rw-r--r--db/migrate/20190410173409_add_name_index_to_geo_nodes.rb21
-rw-r--r--db/migrate/20190412155659_add_merge_request_blocks.rb25
-rw-r--r--db/migrate/20190412183653_remove_url_index_from_geo_nodes.rb21
-rw-r--r--db/migrate/20190414185432_add_comment_to_vulnerability_feedback.rb17
-rw-r--r--db/migrate/20190415030217_add_variable_type_to_ci_variables.rb17
-rw-r--r--db/migrate/20190415095825_add_packages_size_to_project_statistics.rb11
-rw-r--r--db/migrate/20190415172035_update_insights_foreign_keys.rb25
-rw-r--r--db/migrate/20190416185130_add_merge_train_enabled_to_ci_cd_settings.rb21
-rw-r--r--db/migrate/20190416213556_add_variable_type_to_ci_group_variables.rb17
-rw-r--r--db/migrate/20190416213615_add_variable_type_to_ci_pipeline_variables.rb21
-rw-r--r--db/migrate/20190416213631_add_variable_type_to_ci_pipeline_schedule_variables.rb17
-rw-r--r--db/migrate/20190418132750_add_foreign_key_from_vulnerability_feedback_to_users.rb19
-rw-r--r--db/migrate/20190418182545_create_merge_request_trains_table.rb18
-rw-r--r--db/migrate/20190419121952_add_bridged_pipeline_id_to_bridges.rb15
-rw-r--r--db/migrate/20190419123057_add_bridged_pipeline_id_foreign_key.rb23
-rw-r--r--db/migrate/20190422082247_create_project_metrics_settings.rb14
-rw-r--r--db/migrate/20190423124640_add_index_to_projects_mirror_user_id.rb17
-rw-r--r--db/migrate/20190426180107_add_deployment_events_to_services.rb21
-rw-r--r--db/migrate/20190429082448_create_pages_domain_acme_orders.rb32
-rw-r--r--db/migrate/20190430131225_create_issue_tracker_data.rb25
-rw-r--r--db/migrate/20190430142025_create_jira_tracker_data.rb28
-rw-r--r--db/migrate/20190506135337_add_temporary_indexes_to_state_id.rb34
-rw-r--r--db/migrate/20190513174947_enable_create_incident_issues_by_default.rb19
-rw-r--r--db/migrate/20190514105711_create_ip_restriction.rb20
-rw-r--r--db/migrate/20190515125613_add_application_settings_elasticsearch_shards.rb10
-rw-r--r--db/migrate/20190516011213_add_build_queued_at_index.rb19
-rw-r--r--db/migrate/20190516151857_add_lets_encrypt_private_key_to_application_settings.rb18
-rw-r--r--db/migrate/20190516155724_change_packages_size_defaults_in_project_statistics.rb24
-rw-r--r--db/migrate/20190520200123_add_rule_type_to_approval_merge_request_approval_rules.rb21
-rw-r--r--db/migrate/20190521174505_add_report_type_to_approval_merge_request_rules.rb13
-rw-r--r--db/migrate/20190523112344_limit_milestone_date_years_to_4_digits.rb38
-rw-r--r--db/migrate/20190524062810_generate_lets_encrypt_private_key.rb18
-rw-r--r--db/migrate/20190524071727_add_ssl_valid_period_to_pages_domain.rb16
-rw-r--r--db/migrate/20190527011309_add_required_template_name_to_application_settings.rb17
-rw-r--r--db/migrate/20190527194830_add_wiki_size_to_statistics.rb9
-rw-r--r--db/migrate/20190528173628_add_index_for_code_owner_rule_type_on_approval_merge_request_rules.rb55
-rw-r--r--db/migrate/20190529142545_add_dns_rebinding_protection_enabled_to_application_settings.rb23
-rw-r--r--db/migrate/20190530042141_add_default_git_depth_to_ci_cd_settings.rb11
-rw-r--r--db/migrate/20190530154715_add_index_to_merge_requests_state_and_merge_status.rb21
-rw-r--r--db/migrate/20190531153110_create_namespace_root_storage_statistics.rb22
-rw-r--r--db/migrate/20190602014139_add_repository_type_to_lfs_objects_project.rb11
-rw-r--r--db/migrate/20190603124955_add_index_to_count_pending_mirror_updates.rb17
-rw-r--r--db/migrate/20190604091310_add_ldap_membership_lock.rb20
-rw-r--r--db/migrate/20190604184643_fix_pool_repository_source_project_id.rb19
-rw-r--r--db/migrate/20190605104727_add_default_project_deletion_protection_to_application_settings.rb22
-rw-r--r--db/migrate/20190605184422_create_namespace_aggregation_schedules.rb14
-rw-r--r--db/migrate/20190606014128_add_last_ci_minutes_notification_at_to_namespaces.rb12
-rw-r--r--db/migrate/20190606034427_add_lfs_object_id_index_to_lfs_objects_projects.rb17
-rw-r--r--db/migrate/20190606054649_change_operations_feature_flags_clients_token_not_null.rb11
-rw-r--r--db/migrate/20190606054742_add_token_encrypted_to_operations_feature_flags_clients.rb13
-rw-r--r--db/migrate/20190606054832_add_index_to_operations_feature_flags_clients_token_encrypted.rb18
-rw-r--r--db/migrate/20190606202100_add_name_to_badges.rb11
-rw-r--r--db/migrate/20190607085356_add_source_to_pages_domains.rb21
-rw-r--r--db/migrate/20190607145325_add_pages_domains_ssl_renew_index.rb25
-rw-r--r--db/migrate/20190607190856_add_index_to_users_public_emails.rb23
-rw-r--r--db/migrate/20190607205656_add_wiki_columns_to_index_status.rb12
-rw-r--r--db/migrate/20190610142825_add_index_to_members_invite_email.rb21
-rw-r--r--db/migrate/20190611090827_add_time_tracking_limit_to_hours_to_application_settings.rb23
-rw-r--r--db/migrate/20190611100201_add_geo_container_repository_updated_events_table.rb17
-rw-r--r--db/migrate/20190611100202_add_index_to_geo_event_log.rb17
-rw-r--r--db/migrate/20190611161641_add_target_project_id_to_merge_trains.rb18
-rw-r--r--db/migrate/20190612111201_add_geo_container_repository_counters.rb16
-rw-r--r--db/migrate/20190612111404_add_geo_container_sync_capacity.rb13
-rw-r--r--db/migrate/20190613030606_enable_hashed_storage_by_default.rb15
-rw-r--r--db/migrate/20190613044655_add_username_to_deploy_tokens.rb9
-rw-r--r--db/migrate/20190613073003_create_project_aliases.rb16
-rw-r--r--db/migrate/20190617123615_add_grafana_to_settings.rb18
-rw-r--r--db/migrate/20190620105427_change_null_private_profile_to_false.rb33
-rw-r--r--db/migrate/20190621022810_add_last_ci_minutes_usage_notification_level_to_namespaces.rb9
-rw-r--r--db/migrate/20190621151636_add_merge_request_rebase_jid.rb9
-rw-r--r--db/migrate/20190623212503_add_cluster_id_to_deployments.rb9
-rw-r--r--db/migrate/20190624123615_add_grafana_url_to_settings.rb20
-rw-r--r--db/migrate/20190625115224_add_description_to_services.rb14
-rw-r--r--db/migrate/20190626175626_add_group_creation_level_to_namespaces.rb18
-rw-r--r--db/migrate/20190627051902_add_cluster_id_index_fk_to_deployments.rb21
-rw-r--r--db/migrate/20190627100221_add_mr_productivity_metrics.rb14
-rw-r--r--db/migrate/20190627122264_add_foreign_keys_for_container_repository.rb25
-rw-r--r--db/migrate/20190628145246_add_strategies_to_operations_feature_flag_scopes.rb19
-rw-r--r--db/migrate/20190628185000_add_released_at_to_releases_table.rb11
-rw-r--r--db/migrate/20190628185004_backfill_and_add_not_null_constraint_to_released_at_column_on_releases_table.rb18
-rw-r--r--db/migrate/20190703043358_add_commit_id_to_draft_notes.rb11
-rw-r--r--db/migrate/20190703130053_remove_gitaly_feature_flags.rb48
-rw-r--r--db/migrate/20190703171157_add_sourcing_epic_dates.rb10
-rw-r--r--db/migrate/20190703171555_add_sourcing_epic_dates_fks.rb25
-rw-r--r--db/migrate/20190709204413_add_rule_type_to_approval_project_rules.rb17
-rw-r--r--db/migrate/20190709220014_import_common_metrics_y_axis.rb13
-rw-r--r--db/migrate/20190709220143_add_index_to_issues_relative_position.rb20
-rw-r--r--db/migrate/20190710151229_add_index_to_approval_project_rules_rule_type.rb17
-rw-r--r--db/migrate/20190711124721_create_job_variables.rb27
-rw-r--r--db/migrate/20190711200053_change_deploy_tokens_token_not_null.rb11
-rw-r--r--db/migrate/20190711200508_add_token_encrypted_to_deploy_tokens.rb13
-rw-r--r--db/migrate/20190712040400_add_environment_id_to_clusters_kubernetes_namespaces.rb12
-rw-r--r--db/migrate/20190712040412_index_clusters_kubernetes_namespaces_on_environment_id.rb18
-rw-r--r--db/migrate/20190712064021_add_namespace_per_environment_flag_to_clusters.rb20
-rw-r--r--db/migrate/20190715042813_add_issue_id_to_versions.rb15
-rw-r--r--db/migrate/20190715043954_set_issue_id_for_all_versions.rb19
-rw-r--r--db/migrate/20190715140740_add_event_type_to_design_management_designs_versions.rb26
-rw-r--r--db/migrate/20190715142138_add_raw_blob_request_limit_to_application_settings.rb9
-rw-r--r--db/migrate/20190715173819_add_object_storage_flag_to_geo_node.rb21
-rw-r--r--db/migrate/20190715215532_add_project_emails_disabled.rb9
-rw-r--r--db/migrate/20190715215549_add_group_emails_disabled.rb9
-rw-r--r--db/migrate/20190716144222_create_analytics_cycle_analytics_project_stages.rb36
-rw-r--r--db/migrate/20190719122333_add_login_recaptcha_protection_enabled_to_application_settings.rb12
-rw-r--r--db/migrate/20190719174505_add_index_to_deploy_tokens_token_encrypted.rb17
-rw-r--r--db/migrate/20190722104947_add_static_object_token_to_users.rb22
-rw-r--r--db/migrate/20190722132830_add_static_objects_external_storage_columns_to_application_settings.rb16
-rw-r--r--db/migrate/20190722144316_create_milestone_releases_table.rb20
-rw-r--r--db/migrate/20190723153247_create_allowed_email_domains_for_groups.rb22
-rw-r--r--db/migrate/20190724112147_add_column_for_self_monitoring_project_id.rb16
-rw-r--r--db/migrate/20190725012225_change_outbound_local_requests_whitelist_default.rb30
-rw-r--r--db/migrate/20190725183432_add_index_to_index_on_static_object_token.rb21
-rw-r--r--db/migrate/20190726101050_rename_allow_local_requests_from_hooks_and_services_application_setting.rb17
-rw-r--r--db/migrate/20190726101133_add_allow_local_requests_from_system_hooks_to_application_settings.rb18
-rw-r--r--db/migrate/20190729062536_create_analytics_cycle_analytics_group_stages.rb36
-rw-r--r--db/migrate/20190729090456_add_index_on_environments_with_state.rb17
-rw-r--r--db/migrate/20190729180447_add_merge_requests_require_code_owner_approval_to_protected_branches.rb31
-rw-r--r--db/migrate/20190731084415_add_build_need.rb20
-rw-r--r--db/migrate/20190801060809_delete_kubernetes_services.rb18
-rw-r--r--db/migrate/20190801142441_add_throttle_protected_path_columns.rb27
-rw-r--r--db/migrate/20190801193427_rename_application_settings_snowplow_collector_uri_column.rb17
-rw-r--r--db/migrate/20190802012622_reorder_issues_project_id_relative_position_index.rb24
-rw-r--r--db/migrate/20190802195602_add_timestamps_columns_to_geo_nodes.rb10
-rw-r--r--db/migrate/20190805140353_remove_rendundant_index_from_releases.rb24
-rw-r--r--db/migrate/20190806071559_remove_epic_issues_default_relative_position.rb25
-rw-r--r--db/migrate/20190807023052_design_issue_id_nullable.rb11
-rw-r--r--db/migrate/20190808152507_add_projects_sorting_field_to_user_preferences.rb15
-rw-r--r--db/migrate/20190814205640_import_common_metrics_line_charts.rb13
-rw-r--r--db/migrate/20190815093936_add_index_notes_on_project_id_and_id_and_system_false.rb30
-rw-r--r--db/migrate/20190815093949_remove_index_notes_on_noteable_type.rb29
-rw-r--r--db/migrate/20190816151221_add_active_jobs_limit_to_plans.rb17
-rw-r--r--db/migrate/20190819131155_add_cluster_status_index_to_deployments.rb17
-rw-r--r--db/migrate/20190820163320_add_first_last_name_to_user.rb18
-rw-r--r--db/migrate/20190821040941_create_cluster_providers_aws.rb37
-rw-r--r--db/migrate/20190822175441_rename_epics_state_to_state_id.rb17
-rw-r--r--db/migrate/20190822181528_create_list_user_preferences.rb16
-rw-r--r--db/migrate/20190823055948_change_clusters_namespace_per_environment_default.rb12
-rw-r--r--db/migrate/20190826090628_remove_redundant_deployments_index.rb18
-rw-r--r--db/migrate/20190826100605_add_group_column_to_events.rb19
-rw-r--r--db/migrate/20190827222124_add_sourcegraph_configuration_to_application_settings.rb23
-rw-r--r--db/migrate/20190828083843_add_index_to_ci_job_artifacts_on_project_id_for_security_reports.rb22
-rw-r--r--db/migrate/20190828110802_add_not_null_constraints_to_prometheus_metrics_y_label_and_unit.rb10
-rw-r--r--db/migrate/20190828170945_create_package_metadatum.rb14
-rw-r--r--db/migrate/20190828172831_create_package_tag.rb16
-rw-r--r--db/migrate/20190829131130_create_external_pull_requests.rb27
-rw-r--r--db/migrate/20190830075508_add_external_pull_request_id_to_ci_pipelines.rb15
-rw-r--r--db/migrate/20190830080123_add_index_to_ci_pipelines_external_pull_request.rb17
-rw-r--r--db/migrate/20190830080626_add_foreign_key_to_ci_pipelines_external_pull_request.rb17
-rw-r--r--db/migrate/20190830140240_add_duplicated_to_to_issue.rb27
-rw-r--r--db/migrate/20190901174200_add_max_issue_count_to_list.rb16
-rw-r--r--db/migrate/20190902131045_replace_indexes_for_counting_active_users.rb23
-rw-r--r--db/migrate/20190902152329_add_index_for_ci_builds_metrics.rb19
-rw-r--r--db/migrate/20190903150358_create_analytics_repository_files_table.rb23
-rw-r--r--db/migrate/20190903150435_create_analytics_repository_file_edits_table.rb29
-rw-r--r--db/migrate/20190904173203_add_index_on_users_unconfirmed_email.rb17
-rw-r--r--db/migrate/20190905022045_add_issues_prometheus_alert_event_join_table.rb22
-rw-r--r--db/migrate/20190905074652_index_timestamp_columns_for_issue_metrics.rb29
-rw-r--r--db/migrate/20190905140605_add_cloud_run_to_clusters_providers_gcp.rb17
-rw-r--r--db/migrate/20190905223800_add_interruptible_to_builds_metadata.rb9
-rw-r--r--db/migrate/20190905223900_add_concurrent_index_to_builds_metadata.rb19
-rw-r--r--db/migrate/20190906104555_create_alerts_service_data.rb17
-rw-r--r--db/migrate/20190907184714_add_show_whitespace_in_diffs_to_user_preferences.rb20
-rw-r--r--db/migrate/20190909045845_create_project_pages_metadata.rb14
-rw-r--r--db/migrate/20190910103144_replace_events_index_on_group_id_with_partial_index.rb19
-rw-r--r--db/migrate/20190910114843_exclude_nulls_from_index_on_namespaces_type.rb20
-rw-r--r--db/migrate/20190910125852_create_analytics_language_trend_repository_languages.rb34
-rw-r--r--db/migrate/20190910211526_create_packages_conan_file_metadata.rb20
-rw-r--r--db/migrate/20190910212256_add_any_approver_rule_unique_indexes.rb30
-rw-r--r--db/migrate/20190911115056_add_projects_max_pages_size.rb9
-rw-r--r--db/migrate/20190911115109_add_namespaces_max_pages_size.rb9
-rw-r--r--db/migrate/20190911115207_add_projects_max_artifacts_size.rb9
-rw-r--r--db/migrate/20190911115222_add_namespaces_max_artifacts_size.rb9
-rw-r--r--db/migrate/20190912061145_add_index_to_members_on_expires_at.rb17
-rw-r--r--db/migrate/20190912223232_add_role_to_users.rb12
-rw-r--r--db/migrate/20190913174707_add_spdx_id_to_software_licenses.rb15
-rw-r--r--db/migrate/20190913175827_add_index_to_software_licenses_on_spdx_id.rb17
-rw-r--r--db/migrate/20190914223900_modify_concurrent_index_to_builds_metadata.rb23
-rw-r--r--db/migrate/20190918025618_add_user_and_timestamps_to_design_management_versions.rb16
-rw-r--r--db/migrate/20190918102042_create_grafana_integrations.rb17
-rw-r--r--db/migrate/20190918104212_add_merge_request_metrics_merged_at_index.rb17
-rw-r--r--db/migrate/20190918104731_add_cleanup_status_to_cluster.rb21
-rw-r--r--db/migrate/20190918121135_add_cleanup_status_reason_to_cluster.rb12
-rw-r--r--db/migrate/20190919040324_add_successfull_pages_deploy_partial_index_on_ci_builds.rb23
-rw-r--r--db/migrate/20190919091300_create_evidences.rb14
-rw-r--r--db/migrate/20190919104119_index_timestamp_columns_for_merge_requests_creation_date.rb29
-rw-r--r--db/migrate/20190919162036_add_index_to_clusters_providers_gcp_on_cloud_run.rb17
-rw-r--r--db/migrate/20190919183411_add_index_packages_on_name_trigram_to_packages_packages.rb18
-rw-r--r--db/migrate/20190920122420_add_max_personal_access_token_lifetime_to_application_settings.rb9
-rw-r--r--db/migrate/20190920194925_backfill_releases_table_updated_at_and_add_not_null_constraints_to_timestamps.rb24
-rw-r--r--db/migrate/20190920224341_create_merge_request_context_commits_and_diffs.rb45
-rw-r--r--db/migrate/20190924124627_add_pull_mirror_branch_prefix_to_projects.rb13
-rw-r--r--db/migrate/20190925055714_default_request_access_groups.rb15
-rw-r--r--db/migrate/20190925055902_default_request_access_projects.rb15
-rw-r--r--db/migrate/20190926041216_add_user_indexes_to_design_management_versions.rb19
-rw-r--r--db/migrate/20190926225633_create_x509_signatures.rb43
-rw-r--r--db/migrate/20190927055500_create_description_versions.rb29
-rw-r--r--db/migrate/20190927055540_add_index_to_sytem_note_metadata_description_version_id.rb19
-rw-r--r--db/migrate/20190927074328_add_index_on_snippet_content.rb18
-rw-r--r--db/migrate/20190929180751_create_vulnerabilities.rb41
-rw-r--r--db/migrate/20190929180813_add_reference_from_vulnerability_occurrences_to_occurrences.rb14
-rw-r--r--db/migrate/20190929180827_add_foreign_keys_and_indexes_to_vulnerabilities.rb76
-rw-r--r--db/migrate/20190930025655_add_incident_management_throttle_columns_to_application_setting.rb30
-rw-r--r--db/migrate/20190930063627_add_management_project_id_to_clusters.rb9
-rw-r--r--db/migrate/20190930082942_add_new_release_to_notification_settings.rb9
-rw-r--r--db/migrate/20190930153535_create_zoom_meetings.rb24
-rw-r--r--db/migrate/20191001040549_add_management_project_id_index_fk_to_clusters.rb19
-rw-r--r--db/migrate/20191001170300_create_ci_ref.rb21
-rw-r--r--db/migrate/20191002123516_create_clusters_applications_elastic_stack.rb24
-rw-r--r--db/migrate/20191003015155_add_self_managed_prometheus_alerts.rb22
-rw-r--r--db/migrate/20191003060227_add_push_event_hooks_limit_to_application_settings.rb17
-rw-r--r--db/migrate/20191003064615_create_aws_roles.rb23
-rw-r--r--db/migrate/20191003130045_create_issue_user_mentions.rb19
-rw-r--r--db/migrate/20191003150045_create_merge_request_user_mentions.rb19
-rw-r--r--db/migrate/20191003161031_add_mark_for_deletion_to_projects.rb13
-rw-r--r--db/migrate/20191003161032_add_mark_for_deletion_indexes_to_projects.rb19
-rw-r--r--db/migrate/20191003195218_add_pendo_enabled_to_application_settings.rb17
-rw-r--r--db/migrate/20191003195620_add_pendo_url_to_application_settings.rb13
-rw-r--r--db/migrate/20191003200045_create_epic_user_mentions.rb19
-rw-r--r--db/migrate/20191003250045_create_commit_user_mentions.rb18
-rw-r--r--db/migrate/20191003300045_create_snippet_user_mentions.rb19
-rw-r--r--db/migrate/20191003350045_create_design_user_mentions.rb19
-rw-r--r--db/migrate/20191004080818_add_productivity_analytics_start_date.rb11
-rw-r--r--db/migrate/20191004081520_fill_productivity_analytics_start_date.rb31
-rw-r--r--db/migrate/20191004133612_create_analytics_repository_file_commits.rb19
-rw-r--r--db/migrate/20191004151428_add_auto_stop_in_to_environments.rb9
-rw-r--r--db/migrate/20191008013056_add_push_event_activities_limit_to_application_settings.rb17
-rw-r--r--db/migrate/20191008142331_add_ref_count_to_push_event_payloads.rb11
-rw-r--r--db/migrate/20191008180203_add_issuable_state_id_indexes.rb75
-rw-r--r--db/migrate/20191008200204_add_state_id_default_value.rb24
-rw-r--r--db/migrate/20191009100244_add_geo_design_repository_counters.rb16
-rw-r--r--db/migrate/20191009110124_add_has_exposed_artifacts_to_ci_builds_metadata.rb13
-rw-r--r--db/migrate/20191009110757_add_index_to_ci_builds_metadata_has_exposed_artifacts.rb17
-rw-r--r--db/migrate/20191009222222_add_custom_http_clone_url_root_to_application_settings.rb15
-rw-r--r--db/migrate/20191010174846_add_snowplow_iglu_registry_url_to_application_settings.rb11
-rw-r--r--db/migrate/20191011084019_add_project_deletion_adjourned_period_to_application_settings.rb11
-rw-r--r--db/migrate/20191013100213_add_squash_commit_sha_to_merge_requests.rb9
-rw-r--r--db/migrate/20191014025629_rename_design_management_version_user_to_author.rb17
-rw-r--r--db/migrate/20191014030730_add_author_index_to_design_management_versions.rb17
-rw-r--r--db/migrate/20191014084150_add_index_on_snippets_project_id_and_visibility_level.rb17
-rw-r--r--db/migrate/20191014123159_add_expire_notification_delivered_to_personal_access_tokens.rb17
-rw-r--r--db/migrate/20191014132931_remove_index_on_snippets_project_id.rb20
-rw-r--r--db/migrate/20191016072826_replace_ci_trigger_requests_index.rb32
-rw-r--r--db/migrate/20191016133352_create_ci_subscriptions_projects.rb21
-rw-r--r--db/migrate/20191016220135_add_join_table_for_self_managed_prometheus_alert_issues.rb22
-rw-r--r--db/migrate/20191017001326_create_users_security_dashboard_projects.rb15
-rw-r--r--db/migrate/20191017094449_add_remove_source_branch_after_merge_to_projects.rb17
-rw-r--r--db/migrate/20191017134513_add_deployment_merge_requests.rb33
-rw-r--r--db/migrate/20191017191341_create_clusters_applications_crossplane.rb21
-rw-r--r--db/migrate/20191023093207_add_comment_actions_to_services.rb21
-rw-r--r--db/migrate/20191023132005_add_merge_requests_index_on_target_project_and_branch.rb19
-rw-r--r--db/migrate/20191023152913_add_default_and_free_plans.rb29
-rw-r--r--db/migrate/20191024134020_add_index_to_zoom_meetings.rb17
-rw-r--r--db/migrate/20191025092748_add_secret_token_to_snippet.rb12
-rw-r--r--db/migrate/20191026041447_change_default_value_of_throttle_protected_paths.rb38
-rw-r--r--db/migrate/20191026120008_add_promoted_to_epic_to_issues.rb16
-rw-r--r--db/migrate/20191026120112_add_promoted_to_epic_to_issues_index.rb22
-rw-r--r--db/migrate/20191026124116_set_application_settings_default_project_and_snippet_visibility.rb15
-rw-r--r--db/migrate/20191028130054_add_max_issue_weight_to_list.rb17
-rw-r--r--db/migrate/20191028162543_add_setup_for_company_to_user_preferences.rb9
-rw-r--r--db/migrate/20191028184740_rename_snowplow_site_id_to_snowplow_app_id.rb17
-rw-r--r--db/migrate/20191029125305_create_packages_conan_metadata.rb18
-rw-r--r--db/migrate/20191029191901_add_enabled_to_grafana_integrations.rb23
-rw-r--r--db/migrate/20191030135044_create_plan_limits.rb14
-rw-r--r--db/migrate/20191030152934_move_limits_from_plans.rb17
-rw-r--r--db/migrate/20191031095636_create_project_settings.rb12
-rw-r--r--db/migrate/20191101092917_replace_index_on_metrics_merged_at.rb19
-rw-r--r--db/migrate/20191103202505_add_eks_credentials_to_application_settings.rb18
-rw-r--r--db/migrate/20191104205020_add_license_details_to_application_settings.rb11
-rw-r--r--db/migrate/20191105094558_add_report_type_to_vulnerabilities.rb9
-rw-r--r--db/migrate/20191105134413_create_service_desk_settings.rb20
-rw-r--r--db/migrate/20191105155113_add_secret_to_snippet.rb27
-rw-r--r--db/migrate/20191105193652_add_index_on_deployments_updated_at.rb18
-rw-r--r--db/migrate/20191106144901_add_state_to_merge_trains.rb18
-rw-r--r--db/migrate/20191106150931_add_timelog_spent_at_index.rb20
-rw-r--r--db/migrate/20191107064946_update_oauth_open_id_requests_foreign_keys.rb29
-rw-r--r--db/migrate/20191107173446_add_sourcegraph_admin_and_user_preferences.rb17
-rw-r--r--db/migrate/20191107220314_add_index_to_projects_on_marked_for_deletion.rb17
-rw-r--r--db/migrate/20191108031900_create_package_build_info.rb12
-rw-r--r--db/migrate/20191111115229_add_group_id_to_import_export_uploads.rb9
-rw-r--r--db/migrate/20191111115431_add_group_fk_to_import_export_uploads.rb19
-rw-r--r--db/migrate/20191111121500_default_ci_config_path.rb15
-rw-r--r--db/migrate/20191111165017_add_fixed_pipeline_to_notification_settings.rb9
-rw-r--r--db/migrate/20191111175230_add_index_on_ci_pipelines_updated_at.rb18
-rw-r--r--db/migrate/20191112090226_add_artifacts_to_ci_build_need.rb20
-rw-r--r--db/migrate/20191112105448_add_index_on_personal_access_tokens_user_id_and_expires_at.rb18
-rw-r--r--db/migrate/20191112115247_add_cached_markdown_version_to_vulnerabilities.rb9
-rw-r--r--db/migrate/20191112212815_create_web_authn_table.rb26
-rw-r--r--db/migrate/20191112214305_add_indexes_for_projects_api_default_params.rb19
-rw-r--r--db/migrate/20191112221821_add_indexes_for_projects_api_default_params_authenticated.rb19
-rw-r--r--db/migrate/20191112232338_ensure_no_empty_milestone_titles.rb18
-rw-r--r--db/migrate/20191114132259_add_mentions_disabled_to_namespaces.rb9
-rw-r--r--db/migrate/20191114173508_add_resolved_attributes_to_vulnerabilities.rb15
-rw-r--r--db/migrate/20191114173602_add_foreign_key_on_resolved_by_id_to_vulnerabilities.rb19
-rw-r--r--db/migrate/20191114201118_make_created_at_not_null_in_design_management_versions.rb15
-rw-r--r--db/migrate/20191115001123_add_index_to_mod_sec_ci_variables.rb17
-rw-r--r--db/migrate/20191115001843_add_index_to_mod_sec_ci_pipeline_variables.rb17
-rw-r--r--db/migrate/20191115091425_create_vulnerability_issue_links.rb23
-rw-r--r--db/migrate/20191115114032_add_processed_to_ci_builds.rb9
-rw-r--r--db/migrate/20191118053631_add_group_deletion_schedules.rb28
-rw-r--r--db/migrate/20191118155702_add_index_on_status_to_merge_trains.rb20
-rw-r--r--db/migrate/20191118173522_add_snippet_size_limit_to_application_settings.rb13
-rw-r--r--db/migrate/20191118182722_add_index_to_environments_on_project_id_state_environment_type.rb21
-rw-r--r--db/migrate/20191119023952_add_created_at_index_to_snippets.rb17
-rw-r--r--db/migrate/20191119220425_rename_software_license_policies_approval_status_to_classification.rb17
-rw-r--r--db/migrate/20191119231621_create_container_expiration_policies.rb23
-rw-r--r--db/migrate/20191120084627_add_encrypted_fields_to_application_settings.rb34
-rw-r--r--db/migrate/20191120115530_encrypt_plaintext_attributes_on_application_settings.rb87
-rw-r--r--db/migrate/20191120200015_add_index_to_grafana_integrations.rb17
-rw-r--r--db/migrate/20191121111621_create_packages_dependencies.rb16
-rw-r--r--db/migrate/20191121121947_create_packages_dependency_links.rb15
-rw-r--r--db/migrate/20191121161018_add_project_id_name_version_package_type_index_to_packages_packages.rb22
-rw-r--r--db/migrate/20191121193110_add_issue_links_type.rb17
-rw-r--r--db/migrate/20191122161519_create_sentry_issues_table.rb15
-rw-r--r--db/migrate/20191123062354_add_minimum_password_length_to_application_settings.rb11
-rw-r--r--db/migrate/20191123081456_add_dismissable_to_broadcast_messages.rb9
-rw-r--r--db/migrate/20191124150431_change_label_id_index_to_include_action_on_label_events.rb21
-rw-r--r--db/migrate/20191125114345_add_admin_mode_protected_path.rb54
-rw-r--r--db/migrate/20191125133353_add_target_path_to_broadcast_message.rb11
-rw-r--r--db/migrate/20191125140458_create_import_failures.rb19
-rw-r--r--db/migrate/20191126134210_rename_packages_package_tags.rb9
-rw-r--r--db/migrate/20191127030005_create_serverless_domain_cluster.rb19
-rw-r--r--db/migrate/20191127151619_create_gitlab_subscription_histories.rb28
-rw-r--r--db/migrate/20191127151629_add_trial_starts_on_to_gitlab_subscriptions.rb10
-rw-r--r--db/migrate/20191127163053_add_confidential_to_doorkeeper_application.rb26
-rw-r--r--db/migrate/20191127221608_add_wildcard_and_domain_type_to_pages_domains.rb20
-rw-r--r--db/migrate/20191128145231_add_ci_resource_groups.rb22
-rw-r--r--db/migrate/20191128145232_add_fk_to_ci_resources_build_id.rb17
-rw-r--r--db/migrate/20191128145233_add_fk_to_ci_resource_groups_project_id.rb17
-rw-r--r--db/migrate/20191129134844_add_broadcast_type_to_broadcast_message.rb19
-rw-r--r--db/migrate/20191129144630_add_resource_group_id_to_ci_builds.rb27
-rw-r--r--db/migrate/20191129144631_add_index_to_resource_group_id.rb20
-rw-r--r--db/migrate/20191202181924_add_environment_auto_stop_in_to_ci_builds_metadata.rb15
-rw-r--r--db/migrate/20191203121729_update_group_deletion_schedules_foreign_keys.rb29
-rw-r--r--db/migrate/20191204070713_change_updated_at_index_and_add_index_to_id_on_deployments.rb29
-rw-r--r--db/migrate/20191204093410_add_label_project_group_partial_indexes.rb25
-rw-r--r--db/migrate/20191204192726_add_design_disk_path_to_geo_hashed_storage_migrated_events.rb14
-rw-r--r--db/migrate/20191205060723_add_index_to_keys.rb17
-rw-r--r--db/migrate/20191205094702_add_index_for_cross_projects_dependencies_to_ci_builds.rb19
-rw-r--r--db/migrate/20191205145647_add_index_to_projects_deploy_keys_deploy_key.rb17
-rw-r--r--db/migrate/20191205212923_support_multiple_milestones_for_issues.rb14
-rw-r--r--db/migrate/20191205212924_support_multiple_milestones_for_merge_requests.rb14
-rw-r--r--db/migrate/20191206014412_add_image_to_design_management_designs_versions.rb11
-rw-r--r--db/migrate/20191206022133_add_indexes_to_pages_domains_on_wildcard_and_domain_type.rb19
-rw-r--r--db/migrate/20191206122926_update_index_for_pool_repositories.rb24
-rw-r--r--db/migrate/20191207104000_add_render_whitespace_in_code_to_user_preference.rb17
-rw-r--r--db/migrate/20191208071111_add_fingerprint_sha256_to_key.rb13
-rw-r--r--db/migrate/20191208071112_add_fingerprint_sha256_index_to_key.rb17
-rw-r--r--db/migrate/20191208110214_add_suggestion_commit_message_to_projects.rb13
-rw-r--r--db/migrate/20191209143606_add_deleted_at_to_description_versions.rb9
-rw-r--r--db/migrate/20191210211253_create_resource_weight_event.rb18
-rw-r--r--db/migrate/20191212140117_change_commit_user_mentions_commit_id_column_type.rb38
-rw-r--r--db/migrate/20191213104838_add_service_desk_username.rb11
-rw-r--r--db/migrate/20191213120427_fix_max_pages_size.rb20
-rw-r--r--db/migrate/20191213143656_create_ci_pipelines_config.rb14
-rw-r--r--db/migrate/20191213184609_backfill_operations_feature_flags_active.rb20
-rw-r--r--db/migrate/20191214175727_add_indexes_to_deployments_on_project_id_and_ref.rb20
-rw-r--r--db/migrate/20191216074800_add_epic_date_sourcing_milestone_indexes.rb29
-rw-r--r--db/migrate/20191216074802_add_epic_start_date_sourcing_milestone_id_foreign_key.rb23
-rw-r--r--db/migrate/20191216074803_add_epic_due_date_sourcing_milestone_id_foreign_key.rb23
-rw-r--r--db/migrate/20191216094119_add_id_to_plan_limits.rb13
-rw-r--r--db/migrate/20191216183531_add_project_hooks_to_plan_limits.rb9
-rw-r--r--db/migrate/20191216183532_insert_project_hooks_plan_limits.rb25
-rw-r--r--db/migrate/20191217165641_add_saml_provider_prohibited_outer_forks.rb17
-rw-r--r--db/migrate/20191217212348_add_modsecurity_enabled_to_ingress_application.rb16
-rw-r--r--db/migrate/20191218084115_add_updating_name_disabled_for_users_to_application_settings.rb20
-rw-r--r--db/migrate/20191218122457_add_force_pages_access_control_to_application_settings.rb12
-rw-r--r--db/migrate/20191218124915_add_repository_storage_to_snippets.rb26
-rw-r--r--db/migrate/20191218125015_add_storage_version_to_snippets.rb23
-rw-r--r--db/migrate/20191218190253_add_tab_width_to_user_preferences.rb9
-rw-r--r--db/migrate/20191223124940_add_scheduling_type_to_ci_builds.rb11
-rw-r--r--db/migrate/20191225071320_add_index_to_elasticsearch_indexed_namespaces.rb17
-rw-r--r--db/migrate/20191227140254_update_personal_access_tokens_user_id_foreign_key.rb20
-rw-r--r--db/migrate/20191229140154_drop_index_ci_pipelines_on_project_id.rb20
-rw-r--r--db/migrate/20210629031900_associate_existing_dast_builds_with_variables.rb1
-rw-r--r--db/migrate/20210819185500_create_external_audit_event_destinations_table.rb15
-rw-r--r--db/migrate/20210908195506_add_data_to_vulnerability_finding_evidence.rb7
-rw-r--r--db/migrate/20210910014741_add_dependency_proxy_ttl_group_policy_worker_capacity_to_application_settings.rb11
-rw-r--r--db/migrate/20210910015047_add_app_settings_dep_proxy_ttl_worker_capacity_check_constraint.rb15
-rw-r--r--db/migrate/20210910192921_add_report_type_into_approval_project_rules.rb11
-rw-r--r--db/migrate/20210912034903_add_runner_features_to_ci_builds_metadata.rb9
-rw-r--r--db/migrate/20210913224558_update_dependency_proxy_manifests_uniqueness_constraint.rb18
-rw-r--r--db/migrate/20210914145810_add_throttle_deprecated_api_columns.rb13
-rw-r--r--db/migrate/20210914172202_add_status_index_to_dependency_proxy_tables.rb18
-rw-r--r--db/migrate/20210915000453_add_index_on_clusters_integration_prometheus_enabled.rb15
-rw-r--r--db/migrate/20210915001242_add_index_on_clusters_integration_elastic_stack_enabled.rb15
-rw-r--r--db/migrate/20210915070423_add_avatar_and_description_to_topic.rb15
-rw-r--r--db/migrate/20210916132547_add_process_mode_to_resource_groups.rb15
-rw-r--r--db/migrate/20210917134321_remove_temporary_index_for_project_topics_on_taggings.rb20
-rw-r--r--db/migrate/20210917153645_remove_pipeline_fk_from_packages_build_infos.rb15
-rw-r--r--db/migrate/20210917153905_remove_pipeline_fk_from_packages_package_file_build_infos.rb15
-rw-r--r--db/migrate/20210917224419_add_registration_objective_to_user_detail.rb7
-rw-r--r--db/migrate/20210920104446_add_text_limit_to_topics_description_and_avatar.rb15
-rw-r--r--db/migrate/20210921032008_add_suggest_pipeline_enabled_to_application_settings.rb7
-rw-r--r--db/migrate/20210921063924_index_labels_using_varchar_pattern_ops.rb39
-rw-r--r--db/migrate/20210921191010_add_report_type_index_into_approval_project_rules.rb15
-rw-r--r--db/migrate/20210922172056_add_unique_namespaces_index_on_name_parent_id_and_type.rb15
-rw-r--r--db/migrate/20210922172156_drop_unique_namespaces_index_on_name_and_parent_id.rb15
-rw-r--r--db/migrate/20210922215740_create_issue_customer_relations_contacts.rb14
-rw-r--r--db/migrate/20210922220104_add_issue_customer_relations_contacts_foreign_keys.rb20
-rw-r--r--db/migrate/20210923042323_add_meta_data_to_user_credit_card_validations.rb13
-rw-r--r--db/migrate/20210923042324_limit_holder_name_on_user_credit_card_validations.rb23
-rw-r--r--db/migrate/20210923042325_index_meta_data_on_user_credit_card_validations.rb19
-rw-r--r--db/migrate/20210923151641_change_default_for_integrated_error_tracking.rb11
-rw-r--r--db/migrate/20210928155022_improve_index_for_error_tracking.rb33
-rw-r--r--db/migrate/20210928171122_add_group_id_status_id_index_to_dependency_proxy_tables.rb18
-rw-r--r--db/migrate/20210929025600_add_phone_to_user_details.rb15
-rw-r--r--db/migrate/20210929030834_add_text_limit_to_user_details_phone.rb13
-rw-r--r--db/migrate/20210929031049_add_unique_index_phone_on_user_details.rb15
-rw-r--r--db/migrate/20210929032555_create_verification_codes.rb36
-rw-r--r--db/migrate/20210929115340_add_security_policy_configurations_management_project_id_foreign_key.rb18
-rw-r--r--db/migrate/20210929121516_add_releases_author_id_id_created_at_index.rb14
-rw-r--r--db/migrate/20210930081208_fix_deprecated_api_throttle_defaults.rb8
-rw-r--r--db/migrate/20211001001222_add_source_version_to_bulk_imports.rb7
-rw-r--r--db/migrate/20211004062942_create_coverage_fuzzing_corpuses.rb18
-rw-r--r--db/migrate/20211004075629_add_topics_name_gin_index.rb15
-rw-r--r--db/migrate/20211004081911_add_external_event_destination_limit_to_plan_limits.rb7
-rw-r--r--db/migrate/20211005063519_add_foreign_key_to_corpuses_on_project.rb15
-rw-r--r--db/migrate/20211005063616_add_foreign_key_to_corpuses_on_user.rb15
-rw-r--r--db/migrate/20211005063723_add_foreign_key_to_corpuses_on_package.rb15
-rw-r--r--db/migrate/20211005092428_drop_time_range_partitioned_loose_fk.rb27
-rw-r--r--db/migrate/20211005093558_add_range_partitioned_loose_fk_table.rb29
-rw-r--r--db/migrate/20211005100112_recreate_loose_fk_insert_function.rb40
-rw-r--r--db/migrate/20211006060254_add_topics_total_projects_count_cache.rb11
-rw-r--r--db/migrate/20211006103122_change_helm_channel_length.rb14
-rw-r--r--db/migrate/20211006122010_add_topics_total_projects_count_index.rb15
-rw-r--r--db/migrate/20211007113136_add_status_column_to_security_scans_table.rb7
-rw-r--r--db/migrate/20211008181451_add_shared_runners_duration_to_ci_namespace_monthly_usages.rb9
-rw-r--r--db/migrate/20211008182954_add_shared_runners_duration_to_ci_project_monthly_usages.rb9
-rw-r--r--db/migrate/20211012091822_add_text_limit_to_bulk_imports_source_version.rb13
-rw-r--r--db/post_migrate/20190102152410_delete_inconsistent_internal_id_records2.rb43
-rw-r--r--db/post_migrate/20190115054215_migrate_delete_container_repository_worker.rb15
-rw-r--r--db/post_migrate/20190124200344_migrate_storage_migrator_sidekiq_queue.rb18
-rw-r--r--db/post_migrate/20190131122559_fix_null_type_labels.rb23
-rw-r--r--db/post_migrate/20190204115450_migrate_auto_dev_ops_domain_to_cluster_domain.rb29
-rw-r--r--db/post_migrate/20190214112022_schedule_sync_issuables_state_id.rb58
-rw-r--r--db/post_migrate/20190301081611_migrate_project_migrate_sidekiq_queue.rb15
-rw-r--r--db/post_migrate/20190313092516_clean_up_noteable_id_for_notes_on_commits.rb33
-rw-r--r--db/post_migrate/20190322132835_schedule_populate_merge_request_assignees_table.rb23
-rw-r--r--db/post_migrate/20190325111602_rename_v2_root_namespaces.rb27
-rw-r--r--db/post_migrate/20190404143330_add_unique_constraint_to_approvals_user_id_and_merge_request_id.rb39
-rw-r--r--db/post_migrate/20190404231137_remove_alternate_url_from_geo_nodes.rb21
-rw-r--r--db/post_migrate/20190418132125_populate_project_statistics_packages_size.rb46
-rw-r--r--db/post_migrate/20190424134256_drop_projects_ci_id.rb33
-rw-r--r--db/post_migrate/20190506135400_schedule_sync_issuables_state_id_where_nil.rb63
-rw-r--r--db/post_migrate/20190511144331_remove_users_support_type.rb27
-rw-r--r--db/post_migrate/20190517153211_migrate_k8s_service_integration.rb104
-rw-r--r--db/post_migrate/20190520201748_populate_rule_type_on_approval_merge_request_rules.rb34
-rw-r--r--db/post_migrate/20190522143720_drop_project_auto_devops_domain.rb11
-rw-r--r--db/post_migrate/20190524073827_schedule_fill_valid_time_for_pages_domain_certificates.rb34
-rw-r--r--db/post_migrate/20190527194900_schedule_calculate_wiki_sizes.rb32
-rw-r--r--db/post_migrate/20190528180441_enqueue_reset_merge_status.rb25
-rw-r--r--db/post_migrate/20190606163724_migrate_legacy_managed_clusters_to_unmanaged.rb48
-rw-r--r--db/post_migrate/20190606175050_encrypt_feature_flags_clients_tokens.rb27
-rw-r--r--db/post_migrate/20190611161642_add_index_to_events_and_audit_events_created_at_author_id.rb25
-rw-r--r--db/post_migrate/20190613231640_migrate_managed_clusters_with_no_token_to_unmanaged.rb48
-rw-r--r--db/post_migrate/20190618171120_update_geo_nodes_primary.rb20
-rw-r--r--db/post_migrate/20190619175843_remove_import_columns_from_projects.rb14
-rw-r--r--db/post_migrate/20190620112608_enqueue_reset_merge_status_second_run.rb25
-rw-r--r--db/post_migrate/20190625184066_remove_sentry_from_application_settings.rb40
-rw-r--r--db/post_migrate/20190628191740_schedule_fixing_names_of_user_namespaces.rb48
-rw-r--r--db/post_migrate/20190702173936_populate_remaining_merge_request_assignees.rb20
-rw-r--r--db/post_migrate/20190703185326_fix_wrong_pages_access_level.rb28
-rw-r--r--db/post_migrate/20190711201818_encrypt_deploy_tokens_tokens.rb27
-rw-r--r--db/post_migrate/20190715043944_remove_sha_index_from_versions.rb17
-rw-r--r--db/post_migrate/20190715044501_add_unique_issue_id_sha_index_to_versions.rb17
-rw-r--r--db/post_migrate/20190715114644_drop_project_features_pages_access_level_default.rb12
-rw-r--r--db/post_migrate/20190715193142_migrate_discussion_id_on_promoted_epics.rb62
-rw-r--r--db/post_migrate/20190723105753_add_index_on_identities_lower_extern_uid_and_provider.rb19
-rw-r--r--db/post_migrate/20190725080128_set_not_null_on_users_private_profile.rb26
-rw-r--r--db/post_migrate/20190801114109_cleanup_allow_local_requests_from_hooks_and_services_application_setting_rename.rb17
-rw-r--r--db/post_migrate/20190802091750_cleanup_application_settings_snowplow_collector_uri_rename.rb17
-rw-r--r--db/post_migrate/20190802235445_add_index_on_id_and_type_and_public_to_keys.rb23
-rw-r--r--db/post_migrate/20190809072552_set_self_monitoring_project_alerting_token.rb19
-rw-r--r--db/post_migrate/20190812070645_migrate_private_profile_nulls.rb31
-rw-r--r--db/post_migrate/20190819231552_update_knative_prometheus_query_for_invocation_count.rb13
-rw-r--r--db/post_migrate/20190822185441_cleanup_epics_state_id_rename.rb17
-rw-r--r--db/post_migrate/20190827102026_migrate_code_owner_approval_status_to_protected_branches_in_batches.rb46
-rw-r--r--db/post_migrate/20190902160015_remove_support_bot_column_from_users.rb19
-rw-r--r--db/post_migrate/20190904205212_remove_id_column_from_intermediate_release_milestones.rb9
-rw-r--r--db/post_migrate/20190905091812_schedule_project_any_approval_rule_migration.rb49
-rw-r--r--db/post_migrate/20190905091831_schedule_merge_request_any_approval_rule_migration.rb49
-rw-r--r--db/post_migrate/20190909141517_update_cs_vulnerability_confidence_column.rb32
-rw-r--r--db/post_migrate/20190910000130_add_index_on_application_id_on_oauth_access_tokens.rb17
-rw-r--r--db/post_migrate/20190911251732_sync_issuables_state_id.rb81
-rw-r--r--db/post_migrate/20190917173107_backfill_software_licenses_spdx_identifiers.rb57
-rw-r--r--db/post_migrate/20190918104222_schedule_productivity_analytics_backfill.rb15
-rw-r--r--db/post_migrate/20190924152703_migrate_issue_trackers_data.rb31
-rw-r--r--db/post_migrate/20190926180443_schedule_epic_issues_after_epics_move.rb35
-rw-r--r--db/post_migrate/20191002031332_schedule_pages_metadata_migration.rb30
-rw-r--r--db/post_migrate/20191007163701_populate_remaining_any_approver_rules_for_merge_requests.rb44
-rw-r--r--db/post_migrate/20191007163736_populate_remaining_any_approver_rules_for_projects.rb44
-rw-r--r--db/post_migrate/20191008143850_fix_any_approver_rule_for_projects.rb51
-rw-r--r--db/post_migrate/20191014030134_cleanup_design_management_version_user_to_author_rename.rb17
-rw-r--r--db/post_migrate/20191015154408_drop_merge_requests_require_code_owner_approval_from_projects.rb27
-rw-r--r--db/post_migrate/20191017045817_schedule_fix_gitlab_com_pages_access_level.rb17
-rw-r--r--db/post_migrate/20191017180026_drop_ci_build_trace_sections_id.rb19
-rw-r--r--db/post_migrate/20191021101942_remove_empty_github_service_templates.rb28
-rw-r--r--db/post_migrate/20191022113635_nullify_feature_flag_plaintext_tokens.rb39
-rw-r--r--db/post_migrate/20191029095537_cleanup_application_settings_snowplow_site_id_rename.rb17
-rw-r--r--db/post_migrate/20191030193050_remove_pendo_from_application_settings.rb19
-rw-r--r--db/post_migrate/20191030223057_backfill_version_author_and_created_at.rb67
-rw-r--r--db/post_migrate/20191031112603_remove_limits_from_plans.rb17
-rw-r--r--db/post_migrate/20191104142124_nullify_users_role.rb26
-rw-r--r--db/post_migrate/20191105094625_set_report_type_for_vulnerabilities.rb34
-rw-r--r--db/post_migrate/20191105140942_add_indices_to_abuse_reports.rb17
-rw-r--r--db/post_migrate/20191108202723_add_unique_constraint_to_software_licenses.rb69
-rw-r--r--db/post_migrate/20191112023159_complete_pages_metadata_migration.rb13
-rw-r--r--db/post_migrate/20191112115317_change_vulnerabilities_title_html_to_nullable.rb9
-rw-r--r--db/post_migrate/20191114173624_set_resolved_state_on_vulnerabilities.rb31
-rw-r--r--db/post_migrate/20191114204343_remove_milestone_id_from_epics.rb13
-rw-r--r--db/post_migrate/20191115115043_migrate_epic_mentions_to_db.rb36
-rw-r--r--db/post_migrate/20191115115522_migrate_epic_notes_mentions_to_db.rb45
-rw-r--r--db/post_migrate/20191118211629_migrate_ops_feature_flags_scopes_target_user_ids.rb53
-rw-r--r--db/post_migrate/20191119221041_cleanup_software_license_policies_classification_rename.rb17
-rw-r--r--db/post_migrate/20191121122856_drop_packages_package_metadata_table.rb16
-rw-r--r--db/post_migrate/20191122135327_remove_plaintext_columns_from_application_settings.rb28
-rw-r--r--db/post_migrate/20191125024005_cleanup_deploy_access_levels_for_removed_groups.rb32
-rw-r--r--db/post_migrate/20191128162854_drop_project_ci_cd_settings_merge_trains_enabled.rb19
-rw-r--r--db/post_migrate/20191202031812_drop_operations_feature_flags_clients_token.rb23
-rw-r--r--db/post_migrate/20191204114127_delete_legacy_triggers.rb17
-rw-r--r--db/post_migrate/20191205084057_update_minimum_password_length.rb24
-rw-r--r--db/post_migrate/20191209215316_knative_0_9_prometheus_update.rb13
-rw-r--r--db/post_migrate/20191212162434_change_commit_user_mentions_commit_id_column_type_cleanup.rb25
-rw-r--r--db/post_migrate/20191218225624_add_index_on_project_id_to_ci_pipelines.rb18
-rw-r--r--db/post_migrate/20210906130643_drop_temporary_columns_and_triggers_for_taggings.rb18
-rw-r--r--db/post_migrate/20210907013944_cleanup_bigint_conversion_for_ci_builds_metadata.rb17
-rw-r--r--db/post_migrate/20210910194952_update_report_type_for_existing_approval_project_rules.rb39
-rw-r--r--db/post_migrate/20210915022415_cleanup_bigint_conversion_for_ci_builds.rb16
-rw-r--r--db/post_migrate/20210918201050_remove_old_pending_jobs_for_recalculate_vulnerabilities_occurrences_uuid.rb18
-rw-r--r--db/post_migrate/20210918202855_reschedule_pending_jobs_for_recalculate_vulnerabilities_occurrences_uuid.rb18
-rw-r--r--db/post_migrate/20210920232025_remove_ci_builds_foreign_key_from_terraform_state_versions.rb15
-rw-r--r--db/post_migrate/20210921062820_add_image_location_index_to_vulnerability_occurrences.rb18
-rw-r--r--db/post_migrate/20210922021816_drop_int4_columns_for_ci_job_artifacts.rb10
-rw-r--r--db/post_migrate/20210922025631_drop_int4_column_for_ci_sources_pipelines.rb9
-rw-r--r--db/post_migrate/20210922082019_drop_int4_column_for_events.rb9
-rw-r--r--db/post_migrate/20210922084115_concurrent_index_resource_group_status_commit_id_for_ci_builds.rb22
-rw-r--r--db/post_migrate/20210922091402_drop_int4_column_for_push_event_payloads.rb9
-rw-r--r--db/post_migrate/20210923133143_remove_redundant_taggings_index.rb15
-rw-r--r--db/post_migrate/20210923135909_remove_delayed_project_removal_from_namespaces.rb19
-rw-r--r--db/post_migrate/20210927153807_update_issues_relative_position_indexes.rb24
-rw-r--r--db/post_migrate/20211004110500_add_temporary_index_to_issue_metrics.rb15
-rw-r--r--db/post_migrate/20211004110927_schedule_fix_first_mentioned_in_commit_at_job.rb27
-rw-r--r--db/post_migrate/20211004151202_remove_bio_html_from_user_details.rb10
-rw-r--r--db/post_migrate/20211005010101_rereschedule_delete_orphaned_deployments.rb23
-rw-r--r--db/post_migrate/20211005083015_recreate_index_security_ci_builds_on_name_and_id_parser_features.rb29
-rw-r--r--db/post_migrate/20211006060436_schedule_populate_topics_total_projects_count_cache.rb23
-rw-r--r--db/post_migrate/20211006145004_finalize_indexes_for_ci_job_artifacts_expire_at_unlocked.rb16
-rw-r--r--db/post_migrate/20211006174114_add_namespace_index_on_type_sync.rb20
-rw-r--r--db/post_migrate/20211007093340_remove_analytics_snapshots_segment_id_column.rb17
-rw-r--r--db/post_migrate/20211007155221_schedule_populate_status_column_of_security_scans.rb24
-rw-r--r--db/post_migrate/20211011152701_cleanup_delete_orphaned_deployments_background_migration.rb15
-rw-r--r--db/post_migrate/20211012155931_remove_schedule_and_status_from_pending_alert_escalations.rb29
-rw-r--r--db/schema_migrations/201901021524101
-rw-r--r--db/schema_migrations/201901031407241
-rw-r--r--db/schema_migrations/201901041820411
-rw-r--r--db/schema_migrations/201901071510201
-rw-r--r--db/schema_migrations/201901081929411
-rw-r--r--db/schema_migrations/201901091531251
-rw-r--r--db/schema_migrations/201901141721101
-rw-r--r--db/schema_migrations/201901150542151
-rw-r--r--db/schema_migrations/201901150542161
-rw-r--r--db/schema_migrations/201901150928211
-rw-r--r--db/schema_migrations/201901162342211
-rw-r--r--db/schema_migrations/201901242003441
-rw-r--r--db/schema_migrations/201901300916301
-rw-r--r--db/schema_migrations/201901311225591
-rw-r--r--db/schema_migrations/201902041154501
-rw-r--r--db/schema_migrations/201902061931201
-rw-r--r--db/schema_migrations/201902111311501
-rw-r--r--db/schema_migrations/201902141120221
-rw-r--r--db/schema_migrations/201902151549301
-rw-r--r--db/schema_migrations/201902181341581
-rw-r--r--db/schema_migrations/201902181342091
-rw-r--r--db/schema_migrations/201902192016351
-rw-r--r--db/schema_migrations/201902201423441
-rw-r--r--db/schema_migrations/201902201501301
-rw-r--r--db/schema_migrations/201902220516151
-rw-r--r--db/schema_migrations/201902251525251
-rw-r--r--db/schema_migrations/201902251603011
-rw-r--r--db/schema_migrations/201902281924101
-rw-r--r--db/schema_migrations/201903010816111
-rw-r--r--db/schema_migrations/201903011824571
-rw-r--r--db/schema_migrations/201903120711081
-rw-r--r--db/schema_migrations/201903121132291
-rw-r--r--db/schema_migrations/201903121136341
-rw-r--r--db/schema_migrations/201903130925161
-rw-r--r--db/schema_migrations/201903151913391
-rw-r--r--db/schema_migrations/201903201747021
-rw-r--r--db/schema_migrations/201903221328351
-rw-r--r--db/schema_migrations/201903221648301
-rw-r--r--db/schema_migrations/201903250807271
-rw-r--r--db/schema_migrations/201903251057151
-rw-r--r--db/schema_migrations/201903251116021
-rw-r--r--db/schema_migrations/201903251651271
-rw-r--r--db/schema_migrations/201903261640451
-rw-r--r--db/schema_migrations/201903271639041
-rw-r--r--db/schema_migrations/201903290856141
-rw-r--r--db/schema_migrations/201904021501581
-rw-r--r--db/schema_migrations/201904031618061
-rw-r--r--db/schema_migrations/201904041433301
-rw-r--r--db/schema_migrations/201904042311371
-rw-r--r--db/schema_migrations/201904081637451
-rw-r--r--db/schema_migrations/201904092249331
-rw-r--r--db/schema_migrations/201904101734091
-rw-r--r--db/schema_migrations/201904121556591
-rw-r--r--db/schema_migrations/201904121836531
-rw-r--r--db/schema_migrations/201904141854321
-rw-r--r--db/schema_migrations/201904150302171
-rw-r--r--db/schema_migrations/201904150958251
-rw-r--r--db/schema_migrations/201904151720351
-rw-r--r--db/schema_migrations/201904161851301
-rw-r--r--db/schema_migrations/201904162135561
-rw-r--r--db/schema_migrations/201904162136151
-rw-r--r--db/schema_migrations/201904162136311
-rw-r--r--db/schema_migrations/201904181321251
-rw-r--r--db/schema_migrations/201904181327501
-rw-r--r--db/schema_migrations/201904181825451
-rw-r--r--db/schema_migrations/201904191219521
-rw-r--r--db/schema_migrations/201904191230571
-rw-r--r--db/schema_migrations/201904220822471
-rw-r--r--db/schema_migrations/201904231246401
-rw-r--r--db/schema_migrations/201904241342561
-rw-r--r--db/schema_migrations/201904261801071
-rw-r--r--db/schema_migrations/201904290824481
-rw-r--r--db/schema_migrations/201904301312251
-rw-r--r--db/schema_migrations/201904301420251
-rw-r--r--db/schema_migrations/201905061353371
-rw-r--r--db/schema_migrations/201905061354001
-rw-r--r--db/schema_migrations/201905111443311
-rw-r--r--db/schema_migrations/201905131749471
-rw-r--r--db/schema_migrations/201905141057111
-rw-r--r--db/schema_migrations/201905151256131
-rw-r--r--db/schema_migrations/201905160112131
-rw-r--r--db/schema_migrations/201905161518571
-rw-r--r--db/schema_migrations/201905161557241
-rw-r--r--db/schema_migrations/201905171532111
-rw-r--r--db/schema_migrations/201905202001231
-rw-r--r--db/schema_migrations/201905202017481
-rw-r--r--db/schema_migrations/201905211745051
-rw-r--r--db/schema_migrations/201905221437201
-rw-r--r--db/schema_migrations/201905231123441
-rw-r--r--db/schema_migrations/201905240628101
-rw-r--r--db/schema_migrations/201905240717271
-rw-r--r--db/schema_migrations/201905240738271
-rw-r--r--db/schema_migrations/201905270113091
-rw-r--r--db/schema_migrations/201905271948301
-rw-r--r--db/schema_migrations/201905271949001
-rw-r--r--db/schema_migrations/201905281736281
-rw-r--r--db/schema_migrations/201905281804411
-rw-r--r--db/schema_migrations/201905291425451
-rw-r--r--db/schema_migrations/201905300421411
-rw-r--r--db/schema_migrations/201905301547151
-rw-r--r--db/schema_migrations/201905311531101
-rw-r--r--db/schema_migrations/201906020141391
-rw-r--r--db/schema_migrations/201906031249551
-rw-r--r--db/schema_migrations/201906040913101
-rw-r--r--db/schema_migrations/201906041846431
-rw-r--r--db/schema_migrations/201906051047271
-rw-r--r--db/schema_migrations/201906051844221
-rw-r--r--db/schema_migrations/201906060141281
-rw-r--r--db/schema_migrations/201906060344271
-rw-r--r--db/schema_migrations/201906060546491
-rw-r--r--db/schema_migrations/201906060547421
-rw-r--r--db/schema_migrations/201906060548321
-rw-r--r--db/schema_migrations/201906061637241
-rw-r--r--db/schema_migrations/201906061750501
-rw-r--r--db/schema_migrations/201906062021001
-rw-r--r--db/schema_migrations/201906070853561
-rw-r--r--db/schema_migrations/201906071453251
-rw-r--r--db/schema_migrations/201906071908561
-rw-r--r--db/schema_migrations/201906072056561
-rw-r--r--db/schema_migrations/201906101428251
-rw-r--r--db/schema_migrations/201906110908271
-rw-r--r--db/schema_migrations/201906111002011
-rw-r--r--db/schema_migrations/201906111002021
-rw-r--r--db/schema_migrations/201906111616411
-rw-r--r--db/schema_migrations/201906111616421
-rw-r--r--db/schema_migrations/201906121112011
-rw-r--r--db/schema_migrations/201906121114041
-rw-r--r--db/schema_migrations/201906130306061
-rw-r--r--db/schema_migrations/201906130446551
-rw-r--r--db/schema_migrations/201906130730031
-rw-r--r--db/schema_migrations/201906132316401
-rw-r--r--db/schema_migrations/201906171236151
-rw-r--r--db/schema_migrations/201906181711201
-rw-r--r--db/schema_migrations/201906191758431
-rw-r--r--db/schema_migrations/201906201054271
-rw-r--r--db/schema_migrations/201906201126081
-rw-r--r--db/schema_migrations/201906210228101
-rw-r--r--db/schema_migrations/201906211516361
-rw-r--r--db/schema_migrations/201906232125031
-rw-r--r--db/schema_migrations/201906241236151
-rw-r--r--db/schema_migrations/201906251152241
-rw-r--r--db/schema_migrations/201906251840661
-rw-r--r--db/schema_migrations/201906261756261
-rw-r--r--db/schema_migrations/201906270519021
-rw-r--r--db/schema_migrations/201906271002211
-rw-r--r--db/schema_migrations/201906271222641
-rw-r--r--db/schema_migrations/201906281452461
-rw-r--r--db/schema_migrations/201906281850001
-rw-r--r--db/schema_migrations/201906281850041
-rw-r--r--db/schema_migrations/201906281917401
-rw-r--r--db/schema_migrations/201907021739361
-rw-r--r--db/schema_migrations/201907030433581
-rw-r--r--db/schema_migrations/201907031300531
-rw-r--r--db/schema_migrations/201907031711571
-rw-r--r--db/schema_migrations/201907031715551
-rw-r--r--db/schema_migrations/201907031853261
-rw-r--r--db/schema_migrations/201907092044131
-rw-r--r--db/schema_migrations/201907092200141
-rw-r--r--db/schema_migrations/201907092201431
-rw-r--r--db/schema_migrations/201907101512291
-rw-r--r--db/schema_migrations/201907111247211
-rw-r--r--db/schema_migrations/201907112000531
-rw-r--r--db/schema_migrations/201907112005081
-rw-r--r--db/schema_migrations/201907112018181
-rw-r--r--db/schema_migrations/201907120404001
-rw-r--r--db/schema_migrations/201907120404121
-rw-r--r--db/schema_migrations/201907120640211
-rw-r--r--db/schema_migrations/201907150428131
-rw-r--r--db/schema_migrations/201907150439441
-rw-r--r--db/schema_migrations/201907150439541
-rw-r--r--db/schema_migrations/201907150445011
-rw-r--r--db/schema_migrations/201907151146441
-rw-r--r--db/schema_migrations/201907151407401
-rw-r--r--db/schema_migrations/201907151421381
-rw-r--r--db/schema_migrations/201907151738191
-rw-r--r--db/schema_migrations/201907151931421
-rw-r--r--db/schema_migrations/201907152155321
-rw-r--r--db/schema_migrations/201907152155491
-rw-r--r--db/schema_migrations/201907161442221
-rw-r--r--db/schema_migrations/201907191223331
-rw-r--r--db/schema_migrations/201907191745051
-rw-r--r--db/schema_migrations/201907221049471
-rw-r--r--db/schema_migrations/201907221328301
-rw-r--r--db/schema_migrations/201907221443161
-rw-r--r--db/schema_migrations/201907231057531
-rw-r--r--db/schema_migrations/201907231532471
-rw-r--r--db/schema_migrations/201907241121471
-rw-r--r--db/schema_migrations/201907250122251
-rw-r--r--db/schema_migrations/201907250801281
-rw-r--r--db/schema_migrations/201907251834321
-rw-r--r--db/schema_migrations/201907261010501
-rw-r--r--db/schema_migrations/201907261011331
-rw-r--r--db/schema_migrations/201907290625361
-rw-r--r--db/schema_migrations/201907290904561
-rw-r--r--db/schema_migrations/201907291804471
-rw-r--r--db/schema_migrations/201907310844151
-rw-r--r--db/schema_migrations/201908010608091
-rw-r--r--db/schema_migrations/201908011141091
-rw-r--r--db/schema_migrations/201908011424411
-rw-r--r--db/schema_migrations/201908011934271
-rw-r--r--db/schema_migrations/201908020126221
-rw-r--r--db/schema_migrations/201908020917501
-rw-r--r--db/schema_migrations/201908021956021
-rw-r--r--db/schema_migrations/201908022354451
-rw-r--r--db/schema_migrations/201908051403531
-rw-r--r--db/schema_migrations/201908060715591
-rw-r--r--db/schema_migrations/201908070230521
-rw-r--r--db/schema_migrations/201908081525071
-rw-r--r--db/schema_migrations/201908090725521
-rw-r--r--db/schema_migrations/201908120706451
-rw-r--r--db/schema_migrations/201908142056401
-rw-r--r--db/schema_migrations/201908150939361
-rw-r--r--db/schema_migrations/201908150939491
-rw-r--r--db/schema_migrations/201908161512211
-rw-r--r--db/schema_migrations/201908191311551
-rw-r--r--db/schema_migrations/201908192315521
-rw-r--r--db/schema_migrations/201908201633201
-rw-r--r--db/schema_migrations/201908210409411
-rw-r--r--db/schema_migrations/201908221754411
-rw-r--r--db/schema_migrations/201908221815281
-rw-r--r--db/schema_migrations/201908221854411
-rw-r--r--db/schema_migrations/201908230559481
-rw-r--r--db/schema_migrations/201908260906281
-rw-r--r--db/schema_migrations/201908261006051
-rw-r--r--db/schema_migrations/201908271020261
-rw-r--r--db/schema_migrations/201908272221241
-rw-r--r--db/schema_migrations/201908280838431
-rw-r--r--db/schema_migrations/201908281108021
-rw-r--r--db/schema_migrations/201908281709451
-rw-r--r--db/schema_migrations/201908281728311
-rw-r--r--db/schema_migrations/201908291311301
-rw-r--r--db/schema_migrations/201908300755081
-rw-r--r--db/schema_migrations/201908300801231
-rw-r--r--db/schema_migrations/201908300806261
-rw-r--r--db/schema_migrations/201908301402401
-rw-r--r--db/schema_migrations/201909011742001
-rw-r--r--db/schema_migrations/201909021310451
-rw-r--r--db/schema_migrations/201909021523291
-rw-r--r--db/schema_migrations/201909021600151
-rw-r--r--db/schema_migrations/201909031503581
-rw-r--r--db/schema_migrations/201909031504351
-rw-r--r--db/schema_migrations/201909041732031
-rw-r--r--db/schema_migrations/201909042052121
-rw-r--r--db/schema_migrations/201909050220451
-rw-r--r--db/schema_migrations/201909050746521
-rw-r--r--db/schema_migrations/201909050918121
-rw-r--r--db/schema_migrations/201909050918311
-rw-r--r--db/schema_migrations/201909051406051
-rw-r--r--db/schema_migrations/201909052238001
-rw-r--r--db/schema_migrations/201909052239001
-rw-r--r--db/schema_migrations/201909061045551
-rw-r--r--db/schema_migrations/201909071847141
-rw-r--r--db/schema_migrations/201909090458451
-rw-r--r--db/schema_migrations/201909091415171
-rw-r--r--db/schema_migrations/201909100001301
-rw-r--r--db/schema_migrations/201909101031441
-rw-r--r--db/schema_migrations/201909101148431
-rw-r--r--db/schema_migrations/201909101258521
-rw-r--r--db/schema_migrations/201909102115261
-rw-r--r--db/schema_migrations/201909102122561
-rw-r--r--db/schema_migrations/201909111150561
-rw-r--r--db/schema_migrations/201909111151091
-rw-r--r--db/schema_migrations/201909111152071
-rw-r--r--db/schema_migrations/201909111152221
-rw-r--r--db/schema_migrations/201909112517321
-rw-r--r--db/schema_migrations/201909120611451
-rw-r--r--db/schema_migrations/201909122232321
-rw-r--r--db/schema_migrations/201909131747071
-rw-r--r--db/schema_migrations/201909131758271
-rw-r--r--db/schema_migrations/201909142239001
-rw-r--r--db/schema_migrations/201909171731071
-rw-r--r--db/schema_migrations/201909180256181
-rw-r--r--db/schema_migrations/201909181020421
-rw-r--r--db/schema_migrations/201909181042121
-rw-r--r--db/schema_migrations/201909181042221
-rw-r--r--db/schema_migrations/201909181047311
-rw-r--r--db/schema_migrations/201909181211351
-rw-r--r--db/schema_migrations/201909190403241
-rw-r--r--db/schema_migrations/201909190913001
-rw-r--r--db/schema_migrations/201909191041191
-rw-r--r--db/schema_migrations/201909191620361
-rw-r--r--db/schema_migrations/201909191834111
-rw-r--r--db/schema_migrations/201909201224201
-rw-r--r--db/schema_migrations/201909201949251
-rw-r--r--db/schema_migrations/201909202243411
-rw-r--r--db/schema_migrations/201909241246271
-rw-r--r--db/schema_migrations/201909241527031
-rw-r--r--db/schema_migrations/201909250557141
-rw-r--r--db/schema_migrations/201909250559021
-rw-r--r--db/schema_migrations/201909260412161
-rw-r--r--db/schema_migrations/201909261804431
-rw-r--r--db/schema_migrations/201909262256331
-rw-r--r--db/schema_migrations/201909270555001
-rw-r--r--db/schema_migrations/201909270555401
-rw-r--r--db/schema_migrations/201909270743281
-rw-r--r--db/schema_migrations/201909291807511
-rw-r--r--db/schema_migrations/201909291808131
-rw-r--r--db/schema_migrations/201909291808271
-rw-r--r--db/schema_migrations/201909300256551
-rw-r--r--db/schema_migrations/201909300636271
-rw-r--r--db/schema_migrations/201909300829421
-rw-r--r--db/schema_migrations/201909301535351
-rw-r--r--db/schema_migrations/201910010405491
-rw-r--r--db/schema_migrations/201910011703001
-rw-r--r--db/schema_migrations/201910020313321
-rw-r--r--db/schema_migrations/201910021235161
-rw-r--r--db/schema_migrations/201910030151551
-rw-r--r--db/schema_migrations/201910030602271
-rw-r--r--db/schema_migrations/201910030646151
-rw-r--r--db/schema_migrations/201910031300451
-rw-r--r--db/schema_migrations/201910031500451
-rw-r--r--db/schema_migrations/201910031610311
-rw-r--r--db/schema_migrations/201910031610321
-rw-r--r--db/schema_migrations/201910031952181
-rw-r--r--db/schema_migrations/201910031956201
-rw-r--r--db/schema_migrations/201910032000451
-rw-r--r--db/schema_migrations/201910032500451
-rw-r--r--db/schema_migrations/201910033000451
-rw-r--r--db/schema_migrations/201910033500451
-rw-r--r--db/schema_migrations/201910040808181
-rw-r--r--db/schema_migrations/201910040815201
-rw-r--r--db/schema_migrations/201910041336121
-rw-r--r--db/schema_migrations/201910041514281
-rw-r--r--db/schema_migrations/201910071637011
-rw-r--r--db/schema_migrations/201910071637361
-rw-r--r--db/schema_migrations/201910080130561
-rw-r--r--db/schema_migrations/201910081423311
-rw-r--r--db/schema_migrations/201910081438501
-rw-r--r--db/schema_migrations/201910081802031
-rw-r--r--db/schema_migrations/201910082002041
-rw-r--r--db/schema_migrations/201910091002441
-rw-r--r--db/schema_migrations/201910091101241
-rw-r--r--db/schema_migrations/201910091107571
-rw-r--r--db/schema_migrations/201910092222221
-rw-r--r--db/schema_migrations/201910101748461
-rw-r--r--db/schema_migrations/201910110840191
-rw-r--r--db/schema_migrations/201910131002131
-rw-r--r--db/schema_migrations/201910140256291
-rw-r--r--db/schema_migrations/201910140301341
-rw-r--r--db/schema_migrations/201910140307301
-rw-r--r--db/schema_migrations/201910140841501
-rw-r--r--db/schema_migrations/201910141231591
-rw-r--r--db/schema_migrations/201910141329311
-rw-r--r--db/schema_migrations/201910151544081
-rw-r--r--db/schema_migrations/201910160728261
-rw-r--r--db/schema_migrations/201910161333521
-rw-r--r--db/schema_migrations/201910162201351
-rw-r--r--db/schema_migrations/201910170013261
-rw-r--r--db/schema_migrations/201910170458171
-rw-r--r--db/schema_migrations/201910170944491
-rw-r--r--db/schema_migrations/201910171345131
-rw-r--r--db/schema_migrations/201910171800261
-rw-r--r--db/schema_migrations/201910171913411
-rw-r--r--db/schema_migrations/201910211019421
-rw-r--r--db/schema_migrations/201910221136351
-rw-r--r--db/schema_migrations/201910230932071
-rw-r--r--db/schema_migrations/201910231320051
-rw-r--r--db/schema_migrations/201910231529131
-rw-r--r--db/schema_migrations/201910241340201
-rw-r--r--db/schema_migrations/201910250927481
-rw-r--r--db/schema_migrations/201910260414471
-rw-r--r--db/schema_migrations/201910261200081
-rw-r--r--db/schema_migrations/201910261201121
-rw-r--r--db/schema_migrations/201910261241161
-rw-r--r--db/schema_migrations/201910281300541
-rw-r--r--db/schema_migrations/201910281625431
-rw-r--r--db/schema_migrations/201910281847401
-rw-r--r--db/schema_migrations/201910290955371
-rw-r--r--db/schema_migrations/201910291253051
-rw-r--r--db/schema_migrations/201910291919011
-rw-r--r--db/schema_migrations/201910301350441
-rw-r--r--db/schema_migrations/201910301529341
-rw-r--r--db/schema_migrations/201910301930501
-rw-r--r--db/schema_migrations/201910302230571
-rw-r--r--db/schema_migrations/201910310956361
-rw-r--r--db/schema_migrations/201910311126031
-rw-r--r--db/schema_migrations/201911010929171
-rw-r--r--db/schema_migrations/201911032025051
-rw-r--r--db/schema_migrations/201911041421241
-rw-r--r--db/schema_migrations/201911042050201
-rw-r--r--db/schema_migrations/201911050945581
-rw-r--r--db/schema_migrations/201911050946251
-rw-r--r--db/schema_migrations/201911051344131
-rw-r--r--db/schema_migrations/201911051409421
-rw-r--r--db/schema_migrations/201911051551131
-rw-r--r--db/schema_migrations/201911051936521
-rw-r--r--db/schema_migrations/201911061449011
-rw-r--r--db/schema_migrations/201911061509311
-rw-r--r--db/schema_migrations/201911070649461
-rw-r--r--db/schema_migrations/201911071734461
-rw-r--r--db/schema_migrations/201911072203141
-rw-r--r--db/schema_migrations/201911080319001
-rw-r--r--db/schema_migrations/201911082027231
-rw-r--r--db/schema_migrations/201911111152291
-rw-r--r--db/schema_migrations/201911111154311
-rw-r--r--db/schema_migrations/201911111215001
-rw-r--r--db/schema_migrations/201911111650171
-rw-r--r--db/schema_migrations/201911111752301
-rw-r--r--db/schema_migrations/201911120231591
-rw-r--r--db/schema_migrations/201911120902261
-rw-r--r--db/schema_migrations/201911121054481
-rw-r--r--db/schema_migrations/201911121152471
-rw-r--r--db/schema_migrations/201911121153171
-rw-r--r--db/schema_migrations/201911122128151
-rw-r--r--db/schema_migrations/201911122143051
-rw-r--r--db/schema_migrations/201911122218211
-rw-r--r--db/schema_migrations/201911122323381
-rw-r--r--db/schema_migrations/201911141322591
-rw-r--r--db/schema_migrations/201911141735081
-rw-r--r--db/schema_migrations/201911141736021
-rw-r--r--db/schema_migrations/201911141736241
-rw-r--r--db/schema_migrations/201911142011181
-rw-r--r--db/schema_migrations/201911142043431
-rw-r--r--db/schema_migrations/201911150011231
-rw-r--r--db/schema_migrations/201911150018431
-rw-r--r--db/schema_migrations/201911150914251
-rw-r--r--db/schema_migrations/201911151140321
-rw-r--r--db/schema_migrations/201911151150431
-rw-r--r--db/schema_migrations/201911151155221
-rw-r--r--db/schema_migrations/201911180536311
-rw-r--r--db/schema_migrations/201911181557021
-rw-r--r--db/schema_migrations/201911181735221
-rw-r--r--db/schema_migrations/201911181827221
-rw-r--r--db/schema_migrations/201911182116291
-rw-r--r--db/schema_migrations/201911190239521
-rw-r--r--db/schema_migrations/201911192204251
-rw-r--r--db/schema_migrations/201911192210411
-rw-r--r--db/schema_migrations/201911192316211
-rw-r--r--db/schema_migrations/201911200846271
-rw-r--r--db/schema_migrations/201911201155301
-rw-r--r--db/schema_migrations/201911202000151
-rw-r--r--db/schema_migrations/201911211116211
-rw-r--r--db/schema_migrations/201911211219471
-rw-r--r--db/schema_migrations/201911211228561
-rw-r--r--db/schema_migrations/201911211610181
-rw-r--r--db/schema_migrations/201911211931101
-rw-r--r--db/schema_migrations/201911221353271
-rw-r--r--db/schema_migrations/201911221615191
-rw-r--r--db/schema_migrations/201911230623541
-rw-r--r--db/schema_migrations/201911230814561
-rw-r--r--db/schema_migrations/201911241504311
-rw-r--r--db/schema_migrations/201911250240051
-rw-r--r--db/schema_migrations/201911251143451
-rw-r--r--db/schema_migrations/201911251333531
-rw-r--r--db/schema_migrations/201911251404581
-rw-r--r--db/schema_migrations/201911261342101
-rw-r--r--db/schema_migrations/201911270300051
-rw-r--r--db/schema_migrations/201911271516191
-rw-r--r--db/schema_migrations/201911271516291
-rw-r--r--db/schema_migrations/201911271630531
-rw-r--r--db/schema_migrations/201911272216081
-rw-r--r--db/schema_migrations/201911281452311
-rw-r--r--db/schema_migrations/201911281452321
-rw-r--r--db/schema_migrations/201911281452331
-rw-r--r--db/schema_migrations/201911281628541
-rw-r--r--db/schema_migrations/201911291348441
-rw-r--r--db/schema_migrations/201911291446301
-rw-r--r--db/schema_migrations/201911291446311
-rw-r--r--db/schema_migrations/201912020318121
-rw-r--r--db/schema_migrations/201912021819241
-rw-r--r--db/schema_migrations/201912031217291
-rw-r--r--db/schema_migrations/201912040707131
-rw-r--r--db/schema_migrations/201912040934101
-rw-r--r--db/schema_migrations/201912041141271
-rw-r--r--db/schema_migrations/201912041927261
-rw-r--r--db/schema_migrations/201912050607231
-rw-r--r--db/schema_migrations/201912050840571
-rw-r--r--db/schema_migrations/201912050947021
-rw-r--r--db/schema_migrations/201912051456471
-rw-r--r--db/schema_migrations/201912052129231
-rw-r--r--db/schema_migrations/201912052129241
-rw-r--r--db/schema_migrations/201912060144121
-rw-r--r--db/schema_migrations/201912060221331
-rw-r--r--db/schema_migrations/201912061229261
-rw-r--r--db/schema_migrations/201912071040001
-rw-r--r--db/schema_migrations/201912080711111
-rw-r--r--db/schema_migrations/201912080711121
-rw-r--r--db/schema_migrations/201912081102141
-rw-r--r--db/schema_migrations/201912091436061
-rw-r--r--db/schema_migrations/201912092153161
-rw-r--r--db/schema_migrations/201912102112531
-rw-r--r--db/schema_migrations/201912121401171
-rw-r--r--db/schema_migrations/201912121624341
-rw-r--r--db/schema_migrations/201912131048381
-rw-r--r--db/schema_migrations/201912131204271
-rw-r--r--db/schema_migrations/201912131436561
-rw-r--r--db/schema_migrations/201912131846091
-rw-r--r--db/schema_migrations/201912141757271
-rw-r--r--db/schema_migrations/201912160748001
-rw-r--r--db/schema_migrations/201912160748021
-rw-r--r--db/schema_migrations/201912160748031
-rw-r--r--db/schema_migrations/201912160941191
-rw-r--r--db/schema_migrations/201912161835311
-rw-r--r--db/schema_migrations/201912161835321
-rw-r--r--db/schema_migrations/201912171656411
-rw-r--r--db/schema_migrations/201912172123481
-rw-r--r--db/schema_migrations/201912180841151
-rw-r--r--db/schema_migrations/201912181224571
-rw-r--r--db/schema_migrations/201912181249151
-rw-r--r--db/schema_migrations/201912181250151
-rw-r--r--db/schema_migrations/201912181902531
-rw-r--r--db/schema_migrations/201912182256241
-rw-r--r--db/schema_migrations/201912231249401
-rw-r--r--db/schema_migrations/201912250713201
-rw-r--r--db/schema_migrations/201912271402541
-rw-r--r--db/schema_migrations/201912291401541
-rw-r--r--db/schema_migrations/202108191855001
-rw-r--r--db/schema_migrations/202109061306431
-rw-r--r--db/schema_migrations/202109070139441
-rw-r--r--db/schema_migrations/202109081955061
-rw-r--r--db/schema_migrations/202109100147411
-rw-r--r--db/schema_migrations/202109100150471
-rw-r--r--db/schema_migrations/202109101929211
-rw-r--r--db/schema_migrations/202109101949521
-rw-r--r--db/schema_migrations/202109120349031
-rw-r--r--db/schema_migrations/202109132245581
-rw-r--r--db/schema_migrations/202109141458101
-rw-r--r--db/schema_migrations/202109141722021
-rw-r--r--db/schema_migrations/202109150004531
-rw-r--r--db/schema_migrations/202109150012421
-rw-r--r--db/schema_migrations/202109150224151
-rw-r--r--db/schema_migrations/202109150704231
-rw-r--r--db/schema_migrations/202109161325471
-rw-r--r--db/schema_migrations/202109171343211
-rw-r--r--db/schema_migrations/202109171536451
-rw-r--r--db/schema_migrations/202109171539051
-rw-r--r--db/schema_migrations/202109172244191
-rw-r--r--db/schema_migrations/202109182010501
-rw-r--r--db/schema_migrations/202109182028551
-rw-r--r--db/schema_migrations/202109201044461
-rw-r--r--db/schema_migrations/202109202320251
-rw-r--r--db/schema_migrations/202109210320081
-rw-r--r--db/schema_migrations/202109210628201
-rw-r--r--db/schema_migrations/202109210639241
-rw-r--r--db/schema_migrations/202109211910101
-rw-r--r--db/schema_migrations/202109220218161
-rw-r--r--db/schema_migrations/202109220256311
-rw-r--r--db/schema_migrations/202109220820191
-rw-r--r--db/schema_migrations/202109220841151
-rw-r--r--db/schema_migrations/202109220914021
-rw-r--r--db/schema_migrations/202109221720561
-rw-r--r--db/schema_migrations/202109221721561
-rw-r--r--db/schema_migrations/202109222157401
-rw-r--r--db/schema_migrations/202109222201041
-rw-r--r--db/schema_migrations/202109230423231
-rw-r--r--db/schema_migrations/202109230423241
-rw-r--r--db/schema_migrations/202109230423251
-rw-r--r--db/schema_migrations/202109231331431
-rw-r--r--db/schema_migrations/202109231359091
-rw-r--r--db/schema_migrations/202109231516411
-rw-r--r--db/schema_migrations/202109271538071
-rw-r--r--db/schema_migrations/202109281550221
-rw-r--r--db/schema_migrations/202109281711221
-rw-r--r--db/schema_migrations/202109290256001
-rw-r--r--db/schema_migrations/202109290308341
-rw-r--r--db/schema_migrations/202109290310491
-rw-r--r--db/schema_migrations/202109290325551
-rw-r--r--db/schema_migrations/202109291153401
-rw-r--r--db/schema_migrations/202109291215161
-rw-r--r--db/schema_migrations/202109300812081
-rw-r--r--db/schema_migrations/202110010012221
-rw-r--r--db/schema_migrations/202110040629421
-rw-r--r--db/schema_migrations/202110040756291
-rw-r--r--db/schema_migrations/202110040819111
-rw-r--r--db/schema_migrations/202110041105001
-rw-r--r--db/schema_migrations/202110041109271
-rw-r--r--db/schema_migrations/202110041512021
-rw-r--r--db/schema_migrations/202110050101011
-rw-r--r--db/schema_migrations/202110050635191
-rw-r--r--db/schema_migrations/202110050636161
-rw-r--r--db/schema_migrations/202110050637231
-rw-r--r--db/schema_migrations/202110050830151
-rw-r--r--db/schema_migrations/202110050924281
-rw-r--r--db/schema_migrations/202110050935581
-rw-r--r--db/schema_migrations/202110051001121
-rw-r--r--db/schema_migrations/202110060602541
-rw-r--r--db/schema_migrations/202110060604361
-rw-r--r--db/schema_migrations/202110061031221
-rw-r--r--db/schema_migrations/202110061220101
-rw-r--r--db/schema_migrations/202110061450041
-rw-r--r--db/schema_migrations/202110061741141
-rw-r--r--db/schema_migrations/202110070933401
-rw-r--r--db/schema_migrations/202110071131361
-rw-r--r--db/schema_migrations/202110071552211
-rw-r--r--db/schema_migrations/202110081814511
-rw-r--r--db/schema_migrations/202110081829541
-rw-r--r--db/schema_migrations/202110111527011
-rw-r--r--db/schema_migrations/202110120918221
-rw-r--r--db/schema_migrations/202110121559311
-rw-r--r--db/structure.sql391
-rw-r--r--doc/.vale/gitlab/Acronyms.yml12
-rw-r--r--doc/.vale/gitlab/UnclearAntecedent.yml6
-rw-r--r--doc/.vale/vale-json.tmpl58
-rw-r--r--doc/README.md9
-rw-r--r--doc/administration/audit_events.md2
-rw-r--r--doc/administration/auth/README.md8
-rw-r--r--doc/administration/auth/index.md4
-rw-r--r--doc/administration/auth/ldap/google_secure_ldap.md2
-rw-r--r--doc/administration/auth/ldap/index.md123
-rw-r--r--doc/administration/auth/ldap/ldap-troubleshooting.md28
-rw-r--r--doc/administration/auth/oidc.md3
-rw-r--r--doc/administration/auth/smartcard.md2
-rw-r--r--doc/administration/clusters/kas.md2
-rw-r--r--doc/administration/configure.md36
-rw-r--r--doc/administration/environment_variables.md1
-rw-r--r--doc/administration/external_pipeline_validation.md3
-rw-r--r--doc/administration/feature_flags.md7
-rw-r--r--doc/administration/file_hooks.md20
-rw-r--r--doc/administration/geo/disaster_recovery/planned_failover.md14
-rw-r--r--doc/administration/geo/disaster_recovery/runbooks/planned_failover_multi_node.md3
-rw-r--r--doc/administration/geo/disaster_recovery/runbooks/planned_failover_single_node.md3
-rw-r--r--doc/administration/geo/replication/datatypes.md10
-rw-r--r--doc/administration/geo/replication/geo_validation_tests.md7
-rw-r--r--doc/administration/geo/replication/multiple_servers.md2
-rw-r--r--doc/administration/geo/replication/object_storage.md2
-rw-r--r--doc/administration/geo/replication/security_review.md2
-rw-r--r--doc/administration/geo/replication/troubleshooting.md19
-rw-r--r--doc/administration/geo/replication/version_specific_updates.md40
-rw-r--r--doc/administration/get_started.md6
-rw-r--r--doc/administration/gitaly/faq.md2
-rw-r--r--doc/administration/gitaly/index.md159
-rw-r--r--doc/administration/gitaly/praefect.md66
-rw-r--r--doc/administration/gitaly/troubleshooting.md13
-rw-r--r--doc/administration/index.md2
-rw-r--r--doc/administration/instance_limits.md37
-rw-r--r--doc/administration/instance_review.md2
-rw-r--r--doc/administration/integration/terminal.md6
-rw-r--r--doc/administration/invalidate_markdown_cache.md4
-rw-r--r--doc/administration/job_artifacts.md4
-rw-r--r--doc/administration/job_logs.md4
-rw-r--r--doc/administration/lfs/index.md9
-rw-r--r--doc/administration/logs.md10
-rw-r--r--doc/administration/maintenance_mode/index.md12
-rw-r--r--doc/administration/monitoring/performance/img/performance_bar_v14_0.pngbin13115 -> 0 bytes
-rw-r--r--doc/administration/monitoring/performance/img/performance_bar_v14_4.pngbin0 -> 21858 bytes
-rw-r--r--doc/administration/monitoring/performance/performance_bar.md8
-rw-r--r--doc/administration/monitoring/prometheus/gitlab_metrics.md11
-rw-r--r--doc/administration/monitoring/prometheus/puma_exporter.md27
-rw-r--r--doc/administration/nfs.md46
-rw-r--r--doc/administration/operations/fast_ssh_key_lookup.md14
-rw-r--r--doc/administration/operations/moving_repositories.md2
-rw-r--r--doc/administration/operations/ssh_certificates.md7
-rw-r--r--doc/administration/package_information/defaults.md76
-rw-r--r--doc/administration/package_information/deprecated_os.md2
-rw-r--r--doc/administration/package_information/deprecation_policy.md6
-rw-r--r--doc/administration/package_information/index.md32
-rw-r--r--doc/administration/package_information/licensing.md2
-rw-r--r--doc/administration/package_information/omnibus_packages.md2
-rw-r--r--doc/administration/package_information/postgresql_versions.md2
-rw-r--r--doc/administration/package_information/signed_packages.md4
-rw-r--r--doc/administration/packages/container_registry.md18
-rw-r--r--doc/administration/packages/dependency_proxy.md8
-rw-r--r--doc/administration/packages/img/gitlab-registry-architecture.pngbin31003 -> 9598 bytes
-rw-r--r--doc/administration/packages/index.md6
-rw-r--r--doc/administration/pages/index.md72
-rw-r--r--doc/administration/postgresql/replication_and_failover.md96
-rw-r--r--doc/administration/raketasks/check.md19
-rw-r--r--doc/administration/raketasks/maintenance.md10
-rw-r--r--doc/administration/read_only_gitlab.md2
-rw-r--r--doc/administration/redis/replication_and_failover.md6
-rw-r--r--doc/administration/redis/standalone.md3
-rw-r--r--doc/administration/reference_architectures/10k_users.md507
-rw-r--r--doc/administration/reference_architectures/1k_users.md11
-rw-r--r--doc/administration/reference_architectures/25k_users.md527
-rw-r--r--doc/administration/reference_architectures/2k_users.md14
-rw-r--r--doc/administration/reference_architectures/3k_users.md28
-rw-r--r--doc/administration/reference_architectures/50k_users.md532
-rw-r--r--doc/administration/reference_architectures/5k_users.md28
-rw-r--r--doc/administration/reply_by_email.md2
-rw-r--r--doc/administration/repository_storage_paths.md9
-rw-r--r--doc/administration/sidekiq.md13
-rw-r--r--doc/administration/smime_signing_email.md8
-rw-r--r--doc/administration/timezone.md20
-rw-r--r--doc/administration/troubleshooting/debug.md2
-rw-r--r--doc/administration/troubleshooting/gitlab_rails_cheat_sheet.md74
-rw-r--r--doc/administration/troubleshooting/img/database-query-dialog_v14_3.pngbin0 -> 72494 bytes
-rw-r--r--doc/administration/troubleshooting/img/obtaining-a-session-cookie-for-request_v14_3.pngbin0 -> 113452 bytes
-rw-r--r--doc/administration/troubleshooting/img/paste-request-id-into-progress-bar_v14_3.pngbin0 -> 6495 bytes
-rw-r--r--doc/administration/troubleshooting/img/select-request-id-from-request-selector-drop-down-menu_v14_3.pngbin0 -> 30026 bytes
-rw-r--r--doc/administration/troubleshooting/img/view-pg-details_v14_3.pngbin0 -> 6656 bytes
-rw-r--r--doc/administration/troubleshooting/linux_cheat_sheet.md2
-rw-r--r--doc/administration/troubleshooting/ssl.md4
-rw-r--r--doc/administration/troubleshooting/tracing_correlation_id.md66
-rw-r--r--doc/administration/user_settings.md62
-rw-r--r--doc/api/README.md9
-rw-r--r--doc/api/access_requests.md3
-rw-r--r--doc/api/api_resources.md3
-rw-r--r--doc/api/applications.md4
-rw-r--r--doc/api/commits.md13
-rw-r--r--doc/api/container_registry.md4
-rw-r--r--doc/api/dependencies.md2
-rw-r--r--doc/api/deploy_tokens.md2
-rw-r--r--doc/api/dora/metrics.md4
-rw-r--r--doc/api/dora4_project_analytics.md4
-rw-r--r--doc/api/environments.md14
-rw-r--r--doc/api/error_tracking.md2
-rw-r--r--doc/api/events.md8
-rw-r--r--doc/api/experiments.md2
-rw-r--r--doc/api/freeze_periods.md4
-rw-r--r--doc/api/graphql/reference/index.md332
-rw-r--r--doc/api/group_clusters.md2
-rw-r--r--doc/api/group_import_export.md8
-rw-r--r--doc/api/group_repository_storage_moves.md2
-rw-r--r--doc/api/groups.md2
-rw-r--r--doc/api/instance_clusters.md8
-rw-r--r--doc/api/integrations.md1566
-rw-r--r--doc/api/issues.md107
-rw-r--r--doc/api/members.md9
-rw-r--r--doc/api/merge_request_approvals.md43
-rw-r--r--doc/api/oauth2.md26
-rw-r--r--doc/api/packages/debian.md12
-rw-r--r--doc/api/packages/helm.md2
-rw-r--r--doc/api/pages.md2
-rw-r--r--doc/api/pages_domains.md2
-rw-r--r--doc/api/personal_access_tokens.md2
-rw-r--r--doc/api/pipeline_schedules.md4
-rw-r--r--doc/api/plan_limits.md2
-rw-r--r--doc/api/project_level_variables.md83
-rw-r--r--doc/api/project_relations_export.md111
-rw-r--r--doc/api/project_repository_storage_moves.md2
-rw-r--r--doc/api/project_statistics.md8
-rw-r--r--doc/api/projects.md50
-rw-r--r--doc/api/releases/index.md2
-rw-r--r--doc/api/remote_mirrors.md12
-rw-r--r--doc/api/repositories.md14
-rw-r--r--doc/api/repository_files.md8
-rw-r--r--doc/api/resource_groups.md70
-rw-r--r--doc/api/runners.md29
-rw-r--r--doc/api/search.md4
-rw-r--r--doc/api/services.md1472
-rw-r--r--doc/api/settings.md3
-rw-r--r--doc/api/snippet_repository_storage_moves.md2
-rw-r--r--doc/api/usage_data.md2
-rw-r--r--doc/api/users.md42
-rw-r--r--doc/api/version.md2
-rw-r--r--doc/api/vulnerability_findings.md103
-rw-r--r--doc/architecture/blueprints/composable_codebase_using_rails_engines/index.md12
-rw-r--r--doc/architecture/blueprints/consolidating_groups_and_projects/index.md2
-rw-r--r--doc/ci/README.md9
-rw-r--r--doc/ci/chatops/index.md4
-rw-r--r--doc/ci/ci_cd_for_external_repos/bitbucket_integration.md2
-rw-r--r--doc/ci/ci_cd_for_external_repos/github_integration.md2
-rw-r--r--doc/ci/ci_cd_for_external_repos/index.md2
-rw-r--r--doc/ci/cloud_deployment/index.md3
-rw-r--r--doc/ci/docker/using_docker_build.md2
-rw-r--r--doc/ci/docker/using_docker_images.md19
-rw-r--r--doc/ci/docker/using_kaniko.md10
-rw-r--r--doc/ci/environments/deployment_safety.md2
-rw-r--r--doc/ci/environments/img/environments_list.pngbin17379 -> 0 bytes
-rw-r--r--doc/ci/environments/img/environments_list_v14_3.pngbin0 -> 14885 bytes
-rw-r--r--doc/ci/environments/img/environments_terminal_button_on_index_v13_10.pngbin12536 -> 0 bytes
-rw-r--r--doc/ci/environments/img/environments_terminal_button_on_index_v14_3.pngbin0 -> 14134 bytes
-rw-r--r--doc/ci/environments/index.md73
-rw-r--r--doc/ci/environments/protected_environments.md34
-rw-r--r--doc/ci/examples/README.md9
-rw-r--r--doc/ci/examples/deployment/README.md9
-rw-r--r--doc/ci/examples/deployment/composer-npm-deploy.md2
-rw-r--r--doc/ci/examples/deployment/index.md10
-rw-r--r--doc/ci/examples/end_to_end_testing_webdriverio/index.md6
-rw-r--r--doc/ci/examples/index.md2
-rw-r--r--doc/ci/examples/laravel_with_gitlab_and_envoy/index.md4
-rw-r--r--doc/ci/index.md12
-rw-r--r--doc/ci/jobs/ci_job_token.md102
-rw-r--r--doc/ci/jobs/index.md9
-rw-r--r--doc/ci/lint.md2
-rw-r--r--doc/ci/merge_request_pipelines/index.md9
-rw-r--r--doc/ci/merge_request_pipelines/pipelines_for_merged_results/index.md9
-rw-r--r--doc/ci/merge_request_pipelines/pipelines_for_merged_results/merge_trains/index.md9
-rw-r--r--doc/ci/metrics_reports.md2
-rw-r--r--doc/ci/migration/jenkins.md4
-rw-r--r--doc/ci/multi_project_pipelines.md9
-rw-r--r--doc/ci/parent_child_pipelines.md9
-rw-r--r--doc/ci/pipelines/img/multi_project_pipeline_graph.pngbin10671 -> 0 bytes
-rw-r--r--doc/ci/pipelines/img/multi_project_pipeline_graph_v14_3.pngbin0 -> 30119 bytes
-rw-r--r--doc/ci/pipelines/img/parent_pipeline_graph_expanded_v12_6.pngbin96087 -> 0 bytes
-rw-r--r--doc/ci/pipelines/img/parent_pipeline_graph_expanded_v14_3.pngbin0 -> 40079 bytes
-rw-r--r--doc/ci/pipelines/index.md6
-rw-r--r--doc/ci/pipelines/job_artifacts.md4
-rw-r--r--doc/ci/pipelines/merge_request_pipelines.md2
-rw-r--r--doc/ci/pipelines/merge_trains.md6
-rw-r--r--doc/ci/pipelines/multi_project_pipelines.md8
-rw-r--r--doc/ci/pipelines/parent_child_pipelines.md6
-rw-r--r--doc/ci/pipelines/pipeline_efficiency.md2
-rw-r--r--doc/ci/pipelines/pipelines_for_merged_results.md6
-rw-r--r--doc/ci/pipelines/schedules.md2
-rw-r--r--doc/ci/pipelines/settings.md27
-rw-r--r--doc/ci/quick_start/index.md2
-rw-r--r--doc/ci/resource_groups/index.md203
-rw-r--r--doc/ci/runners/README.md9
-rw-r--r--doc/ci/runners/build_cloud/linux_build_cloud.md6
-rw-r--r--doc/ci/runners/build_cloud/macos/environment.md2
-rw-r--r--doc/ci/runners/build_cloud/macos_build_cloud.md2
-rw-r--r--doc/ci/runners/build_cloud/windows_build_cloud.md4
-rw-r--r--doc/ci/secrets/index.md4
-rw-r--r--doc/ci/ssh_keys/index.md18
-rw-r--r--doc/ci/triggers/README.md9
-rw-r--r--doc/ci/troubleshooting.md11
-rw-r--r--doc/ci/unit_test_reports.md10
-rw-r--r--doc/ci/variables/README.md9
-rw-r--r--doc/ci/variables/index.md12
-rw-r--r--doc/ci/variables/predefined_variables.md1
-rw-r--r--doc/ci/variables/where_variables_can_be_used.md5
-rw-r--r--doc/ci/yaml/README.md9
-rw-r--r--doc/ci/yaml/index.md150
-rw-r--r--doc/development/README.md9
-rw-r--r--doc/development/adding_database_indexes.md3
-rw-r--r--doc/development/application_slis/index.md130
-rw-r--r--doc/development/application_slis/rails_request_apdex.md234
-rw-r--r--doc/development/architecture.md2
-rw-r--r--doc/development/cascading_settings.md4
-rw-r--r--doc/development/changelog.md6
-rw-r--r--doc/development/cicd/index.md2
-rw-r--r--doc/development/cicd/templates.md6
-rw-r--r--doc/development/code_review.md3
-rw-r--r--doc/development/contributing/design.md129
-rw-r--r--doc/development/contributing/issue_workflow.md23
-rw-r--r--doc/development/contributing/merge_request_workflow.md8
-rw-r--r--doc/development/dangerbot.md2
-rw-r--r--doc/development/database/database_migration_pipeline.md2
-rw-r--r--doc/development/database/database_reviewer_guidelines.md1
-rw-r--r--doc/development/database/efficient_in_operator_queries.md61
-rw-r--r--doc/development/database/keyset_pagination.md2
-rw-r--r--doc/development/database/multiple_databases.md118
-rw-r--r--doc/development/database/transaction_guidelines.md58
-rw-r--r--doc/development/database_debugging.md4
-rw-r--r--doc/development/database_review.md13
-rw-r--r--doc/development/distributed_tracing.md2
-rw-r--r--doc/development/documentation/feature_flags.md30
-rw-r--r--doc/development/documentation/img/manual_build_docs_v14_3.png (renamed from doc/development/documentation/img/manual_build_docs.png)bin14855 -> 14855 bytes
-rw-r--r--doc/development/documentation/index.md51
-rw-r--r--doc/development/documentation/redirects.md25
-rw-r--r--doc/development/documentation/review_apps.md2
-rw-r--r--doc/development/documentation/site_architecture/index.md2
-rw-r--r--doc/development/documentation/structure.md2
-rw-r--r--doc/development/documentation/styleguide/img/admin_access_level.pngbin0 -> 9821 bytes
-rw-r--r--doc/development/documentation/styleguide/index.md141
-rw-r--r--doc/development/documentation/styleguide/word_list.md109
-rw-r--r--doc/development/documentation/testing.md1
-rw-r--r--doc/development/documentation/workflow.md24
-rw-r--r--doc/development/ee_features.md2
-rw-r--r--doc/development/elasticsearch.md10
-rw-r--r--doc/development/experiment_guide/index.md2
-rw-r--r--doc/development/fe_guide/accessibility.md2
-rw-r--r--doc/development/fe_guide/content_editor.md20
-rw-r--r--doc/development/fe_guide/droplab/droplab.md281
-rw-r--r--doc/development/fe_guide/droplab/plugins/ajax.md46
-rw-r--r--doc/development/fe_guide/droplab/plugins/filter.md55
-rw-r--r--doc/development/fe_guide/droplab/plugins/index.md14
-rw-r--r--doc/development/fe_guide/droplab/plugins/input_setter.md72
-rw-r--r--doc/development/fe_guide/editor_lite.md9
-rw-r--r--doc/development/fe_guide/haml.md15
-rw-r--r--doc/development/fe_guide/index.md8
-rw-r--r--doc/development/fe_guide/logging.md86
-rw-r--r--doc/development/fe_guide/storybook.md16
-rw-r--r--doc/development/fe_guide/style/scss.md2
-rw-r--r--doc/development/feature_categorization/index.md5
-rw-r--r--doc/development/feature_flags/index.md2
-rw-r--r--doc/development/file_storage.md3
-rw-r--r--doc/development/filtering_by_label.md22
-rw-r--r--doc/development/go_guide/go_upgrade.md187
-rw-r--r--doc/development/go_guide/index.md74
-rw-r--r--doc/development/graphql_guide/pagination.md6
-rw-r--r--doc/development/image_scaling.md6
-rw-r--r--doc/development/import_project.md8
-rw-r--r--doc/development/index.md8
-rw-r--r--doc/development/instrumentation.md161
-rw-r--r--doc/development/integrations/secure.md17
-rw-r--r--doc/development/kubernetes.md2
-rw-r--r--doc/development/merge_request_performance_guidelines.md10
-rw-r--r--doc/development/migration_style_guide.md8
-rw-r--r--doc/development/packages.md8
-rw-r--r--doc/development/pipelines.md631
-rw-r--r--doc/development/profiling.md6
-rw-r--r--doc/development/rails_update.md110
-rw-r--r--doc/development/redis.md7
-rw-r--r--doc/development/redis/new_redis_instance.md132
-rw-r--r--doc/development/repository_mirroring.md2
-rw-r--r--doc/development/reusing_abstractions.md2
-rw-r--r--doc/development/ruby_upgrade.md275
-rw-r--r--doc/development/scalability.md2
-rw-r--r--doc/development/service_ping/dictionary.md2
-rw-r--r--doc/development/service_ping/implement.md8
-rw-r--r--doc/development/service_ping/index.md10
-rw-r--r--doc/development/service_ping/metrics_dictionary.md4
-rw-r--r--doc/development/service_ping/metrics_lifecycle.md5
-rw-r--r--doc/development/service_ping/review_guidelines.md2
-rw-r--r--doc/development/sidekiq_style_guide.md66
-rw-r--r--doc/development/snowplow/dictionary.md44
-rw-r--r--doc/development/snowplow/implementation.md543
-rw-r--r--doc/development/snowplow/index.md723
-rw-r--r--doc/development/snowplow/review_guidelines.md12
-rw-r--r--doc/development/snowplow/schemas.md166
-rw-r--r--doc/development/sql.md2
-rw-r--r--doc/development/stage_group_dashboards.md12
-rw-r--r--doc/development/testing_guide/best_practices.md2
-rw-r--r--doc/development/testing_guide/ci.md46
-rw-r--r--doc/development/testing_guide/end_to_end/best_practices.md38
-rw-r--r--doc/development/testing_guide/end_to_end/dynamic_element_validation.md2
-rw-r--r--doc/development/testing_guide/end_to_end/feature_flags.md2
-rw-r--r--doc/development/testing_guide/end_to_end/index.md2
-rw-r--r--doc/development/testing_guide/end_to_end/page_objects.md2
-rw-r--r--doc/development/testing_guide/end_to_end/rspec_metadata_tests.md3
-rw-r--r--doc/development/testing_guide/end_to_end/running_tests_that_require_special_setup.md12
-rw-r--r--doc/development/testing_guide/flaky_tests.md4
-rw-r--r--doc/development/testing_guide/frontend_testing.md23
-rw-r--r--doc/development/testing_guide/img/review-app-parent-pipeline.pngbin0 -> 136842 bytes
-rw-r--r--doc/development/testing_guide/index.md2
-rw-r--r--doc/development/testing_guide/review_apps.md174
-rw-r--r--doc/development/usage_ping/dictionary.md2
-rw-r--r--doc/development/usage_ping/index.md9
-rw-r--r--doc/development/usage_ping/metrics_dictionary.md9
-rw-r--r--doc/development/usage_ping/metrics_instrumentation.md9
-rw-r--r--doc/development/usage_ping/product_intelligence_review.md9
-rw-r--r--doc/development/usage_ping/review_guidelines.md9
-rw-r--r--doc/development/windows.md6
-rw-r--r--doc/index.md4
-rw-r--r--doc/install/aws/eks_clusters_aws.md7
-rw-r--r--doc/install/aws/gitlab_hybrid_on_aws.md25
-rw-r--r--doc/install/aws/gitlab_sre_for_aws.md68
-rw-r--r--doc/install/aws/index.md2
-rw-r--r--doc/install/aws/manual_install_aws.md26
-rw-r--r--doc/install/azure/index.md2
-rw-r--r--doc/install/docker.md4
-rw-r--r--doc/install/installation.md9
-rw-r--r--doc/install/next_steps.md2
-rw-r--r--doc/install/openshift_and_gitlab/img/add-gitlab-to-project.pngbin14619 -> 0 bytes
-rw-r--r--doc/install/openshift_and_gitlab/img/add-to-project.pngbin8901 -> 0 bytes
-rw-r--r--doc/install/openshift_and_gitlab/img/create-project-ui.pngbin9151 -> 0 bytes
-rw-r--r--doc/install/openshift_and_gitlab/img/gitlab-logs.pngbin26240 -> 0 bytes
-rw-r--r--doc/install/openshift_and_gitlab/img/gitlab-overview.pngbin42908 -> 0 bytes
-rw-r--r--doc/install/openshift_and_gitlab/img/gitlab-running.pngbin42045 -> 0 bytes
-rw-r--r--doc/install/openshift_and_gitlab/img/gitlab-scale.pngbin15002 -> 0 bytes
-rw-r--r--doc/install/openshift_and_gitlab/img/gitlab-settings.pngbin42221 -> 0 bytes
-rw-r--r--doc/install/openshift_and_gitlab/img/no-resources.pngbin12465 -> 0 bytes
-rw-r--r--doc/install/openshift_and_gitlab/img/openshift-infra-project.pngbin37117 -> 0 bytes
-rw-r--r--doc/install/openshift_and_gitlab/img/rc-name.pngbin20571 -> 0 bytes
-rw-r--r--doc/install/openshift_and_gitlab/img/running-pods.pngbin11942 -> 0 bytes
-rw-r--r--doc/install/openshift_and_gitlab/img/web-console.pngbin12717 -> 0 bytes
-rw-r--r--doc/install/openshift_and_gitlab/index.md507
-rw-r--r--doc/install/requirements.md4
-rw-r--r--doc/integration/akismet.md3
-rw-r--r--doc/integration/azure.md2
-rw-r--r--doc/integration/bitbucket.md2
-rw-r--r--doc/integration/cas.md2
-rw-r--r--doc/integration/elasticsearch.md8
-rw-r--r--doc/integration/github.md2
-rw-r--r--doc/integration/gitlab.md28
-rw-r--r--doc/integration/gitpod.md2
-rw-r--r--doc/integration/google.md4
-rw-r--r--doc/integration/index.md2
-rw-r--r--doc/integration/jenkins.md4
-rw-r--r--doc/integration/jenkins_deprecated.md2
-rw-r--r--doc/integration/jira/configure.md4
-rw-r--r--doc/integration/jira/connect-app.md4
-rw-r--r--doc/integration/jira/development_panel.md6
-rw-r--r--doc/integration/jira/index.md8
-rw-r--r--doc/integration/jira/issues.md2
-rw-r--r--doc/integration/kerberos.md5
-rw-r--r--doc/integration/mattermost/img/gitlab-mattermost.pngbin88419 -> 26656 bytes
-rw-r--r--doc/integration/mattermost/index.md5
-rw-r--r--doc/integration/oauth2_generic.md2
-rw-r--r--doc/integration/oauth_provider.md37
-rw-r--r--doc/integration/omniauth.md4
-rw-r--r--doc/integration/recaptcha.md2
-rw-r--r--doc/integration/salesforce.md2
-rw-r--r--doc/integration/saml.md42
-rw-r--r--doc/integration/security_partners/index.md6
-rw-r--r--doc/integration/shibboleth.md9
-rw-r--r--doc/integration/slash_commands.md2
-rw-r--r--doc/integration/twitter.md2
-rw-r--r--doc/integration/vault.md5
-rw-r--r--doc/operations/error_tracking.md44
-rw-r--r--doc/operations/feature_flags.md19
-rw-r--r--doc/operations/img/error_tracking_setting_dsn_v14_4.pngbin0 -> 39249 bytes
-rw-r--r--doc/operations/incident_management/alerts.md11
-rw-r--r--doc/operations/incident_management/escalation_policies.md2
-rw-r--r--doc/operations/incident_management/incidents.md30
-rw-r--r--doc/operations/incident_management/integrations.md91
-rw-r--r--doc/operations/incident_management/oncall_schedules.md4
-rw-r--r--doc/operations/incident_management/status_page.md6
-rw-r--r--doc/operations/index.md6
-rw-r--r--doc/operations/metrics/alerts.md6
-rw-r--r--doc/operations/metrics/dashboards/default.md2
-rw-r--r--doc/operations/metrics/dashboards/panel_types.md2
-rw-r--r--doc/operations/metrics/dashboards/variables.md6
-rw-r--r--doc/operations/metrics/dashboards/yaml.md14
-rw-r--r--doc/operations/metrics/embed.md10
-rw-r--r--doc/operations/metrics/embed_grafana.md2
-rw-r--r--doc/operations/metrics/index.md2
-rw-r--r--doc/operations/product_analytics.md3
-rw-r--r--doc/operations/tracing.md4
-rw-r--r--doc/policy/maintenance.md2
-rw-r--r--doc/public_access/public_access.md20
-rw-r--r--doc/push_rules/push_rules.md12
-rw-r--r--doc/raketasks/backup_restore.md16
-rw-r--r--doc/raketasks/index.md13
-rw-r--r--doc/raketasks/user_management.md2
-rw-r--r--doc/security/README.md9
-rw-r--r--doc/security/asset_proxy.md4
-rw-r--r--doc/security/crime_vulnerability.md4
-rw-r--r--doc/security/index.md4
-rw-r--r--doc/security/information_exclusivity.md6
-rw-r--r--doc/security/project_import_decompressed_archive_size_limits.md4
-rw-r--r--doc/security/rack_attack.md4
-rw-r--r--doc/security/rate_limits.md8
-rw-r--r--doc/security/reset_user_password.md6
-rw-r--r--doc/security/ssh_keys_restrictions.md2
-rw-r--r--doc/security/token_overview.md4
-rw-r--r--doc/security/two_factor_authentication.md4
-rw-r--r--doc/security/unlock_user.md4
-rw-r--r--doc/security/user_email_confirmation.md2
-rw-r--r--doc/security/user_file_uploads.md2
-rw-r--r--doc/security/webhooks.md6
-rw-r--r--doc/ssh/README.md9
-rw-r--r--doc/ssh/index.md6
-rw-r--r--doc/subscriptions/bronze_starter.md18
-rw-r--r--doc/subscriptions/gitlab_com/index.md286
-rw-r--r--doc/subscriptions/quarterly_reconciliation.md22
-rw-r--r--doc/subscriptions/self_managed/index.md5
-rw-r--r--doc/system_hooks/system_hooks.md197
-rw-r--r--doc/topics/application_development_platform/index.md2
-rw-r--r--doc/topics/authentication/index.md2
-rw-r--r--doc/topics/autodevops/customize.md4
-rw-r--r--doc/topics/autodevops/index.md2
-rw-r--r--doc/topics/autodevops/quick_start_guide.md14
-rw-r--r--doc/topics/autodevops/requirements.md7
-rw-r--r--doc/topics/autodevops/stages.md16
-rw-r--r--doc/topics/autodevops/upgrading_auto_deploy_dependencies.md2
-rw-r--r--doc/topics/build_your_application.md2
-rw-r--r--doc/topics/git/troubleshooting_git.md11
-rw-r--r--doc/topics/plan_and_track.md36
-rw-r--r--doc/update/deprecations.md52
-rw-r--r--doc/update/index.md31
-rw-r--r--doc/update/package/downgrade.md2
-rw-r--r--doc/update/package/index.md201
-rw-r--r--doc/update/plan_your_upgrade.md6
-rw-r--r--doc/update/restore_after_failure.md46
-rw-r--r--doc/update/upgrading_from_source.md20
-rw-r--r--doc/update/zero_downtime.md8
-rw-r--r--doc/user/admin_area/analytics/dev_ops_report.md2
-rw-r--r--doc/user/admin_area/appearance.md2
-rw-r--r--doc/user/admin_area/custom_project_templates.md2
-rw-r--r--doc/user/admin_area/geo_nodes.md32
-rw-r--r--doc/user/admin_area/index.md32
-rw-r--r--doc/user/admin_area/license.md8
-rw-r--r--doc/user/admin_area/merge_requests_approvals.md5
-rw-r--r--doc/user/admin_area/moderate_users.md4
-rw-r--r--doc/user/admin_area/monitoring/background_migrations.md102
-rw-r--r--doc/user/admin_area/review_abuse_reports.md6
-rw-r--r--doc/user/admin_area/settings/continuous_integration.md18
-rw-r--r--doc/user/admin_area/settings/deprecated_api_rate_limits.md53
-rw-r--r--doc/user/admin_area/settings/email.md2
-rw-r--r--doc/user/admin_area/settings/external_authorization.md7
-rw-r--r--doc/user/admin_area/settings/files_api_rate_limits.md56
-rw-r--r--doc/user/admin_area/settings/floc.md2
-rw-r--r--doc/user/admin_area/settings/gitaly_timeouts.md2
-rw-r--r--doc/user/admin_area/settings/help_page.md9
-rw-r--r--doc/user/admin_area/settings/img/suggest_pipeline_banner.pngbin0 -> 14544 bytes
-rw-r--r--doc/user/admin_area/settings/index.md2
-rw-r--r--doc/user/admin_area/settings/instance_template_repository.md2
-rw-r--r--doc/user/admin_area/settings/protected_paths.md2
-rw-r--r--doc/user/admin_area/settings/rate_limit_on_issues_creation.md2
-rw-r--r--doc/user/admin_area/settings/sidekiq_job_limits.md6
-rw-r--r--doc/user/admin_area/settings/sign_in_restrictions.md4
-rw-r--r--doc/user/admin_area/settings/sign_up_restrictions.md12
-rw-r--r--doc/user/admin_area/settings/third_party_offers.md2
-rw-r--r--doc/user/admin_area/settings/usage_statistics.md6
-rw-r--r--doc/user/admin_area/settings/user_and_ip_rate_limits.md4
-rw-r--r--doc/user/admin_area/settings/visibility_and_access_controls.md15
-rw-r--r--doc/user/admin_area/user_cohorts.md2
-rw-r--r--doc/user/analytics/ci_cd_analytics.md6
-rw-r--r--doc/user/analytics/img/project_vsa_filter_v14_3.pngbin0 -> 21120 bytes
-rw-r--r--doc/user/analytics/img/project_vsa_stage_table_v14_4.pngbin0 -> 38783 bytes
-rw-r--r--doc/user/analytics/index.md2
-rw-r--r--doc/user/analytics/issue_analytics.md2
-rw-r--r--doc/user/analytics/merge_request_analytics.md2
-rw-r--r--doc/user/analytics/productivity_analytics.md4
-rw-r--r--doc/user/analytics/repository_analytics.md2
-rw-r--r--doc/user/analytics/value_stream_analytics.md47
-rw-r--r--doc/user/application_security/api_fuzzing/create_har_files.md10
-rw-r--r--doc/user/application_security/configuration/index.md2
-rw-r--r--doc/user/application_security/container_scanning/index.md51
-rw-r--r--doc/user/application_security/coverage_fuzzing/index.md25
-rw-r--r--doc/user/application_security/cve_id_request.md79
-rw-r--r--doc/user/application_security/dast/browser_based.md46
-rw-r--r--doc/user/application_security/dast/dast_troubleshooting.md2
-rw-r--r--doc/user/application_security/dast/index.md254
-rw-r--r--doc/user/application_security/dast_api/index.md4
-rw-r--r--doc/user/application_security/dependency_scanning/analyzers.md6
-rw-r--r--doc/user/application_security/dependency_scanning/index.md47
-rw-r--r--doc/user/application_security/img/cve_request_communication.pngbin17386 -> 0 bytes
-rw-r--r--doc/user/application_security/img/cve_request_communication_publication.pngbin24126 -> 0 bytes
-rw-r--r--doc/user/application_security/img/new_cve_request_issue.pngbin36847 -> 60569 bytes
-rw-r--r--doc/user/application_security/policies/index.md53
-rw-r--r--doc/user/application_security/sast/index.md128
-rw-r--r--doc/user/application_security/secret_detection/index.md21
-rw-r--r--doc/user/application_security/vulnerability_report/index.md4
-rw-r--r--doc/user/asciidoc.md21
-rw-r--r--doc/user/award_emojis.md9
-rw-r--r--doc/user/clusters/agent/ci_cd_tunnel.md4
-rw-r--r--doc/user/clusters/agent/index.md140
-rw-r--r--doc/user/clusters/agent/repository.md9
-rw-r--r--doc/user/clusters/applications.md2
-rw-r--r--doc/user/clusters/environments.md2
-rw-r--r--doc/user/clusters/management_project_template.md12
-rw-r--r--doc/user/compliance/compliance_report/index.md6
-rw-r--r--doc/user/compliance/license_compliance/img/policies_maintainer_add_v13_2.pngbin13419 -> 0 bytes
-rw-r--r--doc/user/compliance/license_compliance/img/policies_maintainer_add_v14_3.pngbin0 -> 49418 bytes
-rw-r--r--doc/user/compliance/license_compliance/img/policies_maintainer_edit_v14_2.pngbin9843 -> 0 bytes
-rw-r--r--doc/user/compliance/license_compliance/img/policies_maintainer_edit_v14_3.pngbin0 -> 25383 bytes
-rw-r--r--doc/user/compliance/license_compliance/index.md11
-rw-r--r--doc/user/gitlab_com/index.md4
-rw-r--r--doc/user/group/clusters/index.md19
-rw-r--r--doc/user/group/contribution_analytics/index.md11
-rw-r--r--doc/user/group/custom_project_templates.md6
-rw-r--r--doc/user/group/devops_adoption/index.md8
-rw-r--r--doc/user/group/epics/img/epic_view_roadmap_v12_9.pngbin105562 -> 94195 bytes
-rw-r--r--doc/user/group/import/img/import_panel_v14_1.pngbin42789 -> 17447 bytes
-rw-r--r--doc/user/group/import/img/new_group_navigation_v13_8.pngbin39500 -> 8644 bytes
-rw-r--r--doc/user/group/import/index.md27
-rw-r--r--doc/user/group/index.md50
-rw-r--r--doc/user/group/insights/img/insights_group_configuration.pngbin14125 -> 0 bytes
-rw-r--r--doc/user/group/insights/index.md33
-rw-r--r--doc/user/group/repositories_analytics/index.md34
-rw-r--r--doc/user/group/roadmap/img/roadmap_view_v14_3.pngbin67558 -> 56171 bytes
-rw-r--r--doc/user/group/saml_sso/index.md50
-rw-r--r--doc/user/group/settings/img/import_panel_v14_1.pngbin42789 -> 0 bytes
-rw-r--r--doc/user/group/settings/img/new_group_navigation_v13_1.pngbin39500 -> 0 bytes
-rw-r--r--doc/user/group/settings/import_export.md41
-rw-r--r--doc/user/group/subgroups/img/create_new_group.pngbin18503 -> 0 bytes
-rw-r--r--doc/user/group/subgroups/img/create_subgroup_button_v13_6.pngbin16989 -> 0 bytes
-rw-r--r--doc/user/group/subgroups/img/group_members_13_7.pngbin59689 -> 0 bytes
-rw-r--r--doc/user/group/subgroups/img/group_members_v14_4.pngbin0 -> 70033 bytes
-rw-r--r--doc/user/group/subgroups/index.md58
-rw-r--r--doc/user/group/value_stream_analytics/index.md53
-rw-r--r--doc/user/index.md8
-rw-r--r--doc/user/infrastructure/clusters/connect/index.md35
-rw-r--r--doc/user/infrastructure/clusters/connect/new_gke_cluster.md75
-rw-r--r--doc/user/infrastructure/clusters/index.md66
-rw-r--r--doc/user/infrastructure/clusters/manage/clusters_health.md14
-rw-r--r--doc/user/infrastructure/clusters/manage/img/k8s_cluster_monitoring.png (renamed from doc/user/project/clusters/img/k8s_cluster_monitoring.png)bin43141 -> 43141 bytes
-rw-r--r--doc/user/infrastructure/index.md2
-rw-r--r--doc/user/instance/clusters/index.md4
-rw-r--r--doc/user/markdown.md6
-rw-r--r--doc/user/packages/composer_repository/index.md8
-rw-r--r--doc/user/packages/conan_repository/index.md7
-rw-r--r--doc/user/packages/container_registry/index.md19
-rw-r--r--doc/user/packages/debian_repository/index.md5
-rw-r--r--doc/user/packages/dependency_proxy/index.md63
-rw-r--r--doc/user/packages/go_proxy/index.md6
-rw-r--r--doc/user/packages/helm_repository/index.md23
-rw-r--r--doc/user/packages/index.md39
-rw-r--r--doc/user/packages/npm_registry/index.md22
-rw-r--r--doc/user/packages/nuget_repository/index.md8
-rw-r--r--doc/user/packages/rubygems_registry/index.md5
-rw-r--r--doc/user/permissions.md61
-rw-r--r--doc/user/profile/account/create_accounts.md10
-rw-r--r--doc/user/profile/account/delete_account.md2
-rw-r--r--doc/user/profile/account/two_factor_authentication.md11
-rw-r--r--doc/user/profile/active_sessions.md6
-rw-r--r--doc/user/profile/img/notification_global_settings_v13_12.pngbin9268 -> 0 bytes
-rw-r--r--doc/user/profile/index.md46
-rw-r--r--doc/user/profile/notifications.md254
-rw-r--r--doc/user/project/badges.md29
-rw-r--r--doc/user/project/canary_deployments.md2
-rw-r--r--doc/user/project/clusters/add_eks_clusters.md35
-rw-r--r--doc/user/project/clusters/add_existing_cluster.md2
-rw-r--r--doc/user/project/clusters/add_gke_clusters.md58
-rw-r--r--doc/user/project/clusters/cluster_access.md2
-rw-r--r--doc/user/project/clusters/index.md79
-rw-r--r--doc/user/project/clusters/protect/container_network_security/quick_start_guide.md2
-rw-r--r--doc/user/project/clusters/runbooks/index.md5
-rw-r--r--doc/user/project/clusters/serverless/index.md4
-rw-r--r--doc/user/project/deploy_boards.md2
-rw-r--r--doc/user/project/deploy_keys/index.md90
-rw-r--r--doc/user/project/deploy_tokens/index.md23
-rw-r--r--doc/user/project/file_lock.md2
-rw-r--r--doc/user/project/import/bitbucket_server.md2
-rw-r--r--doc/user/project/import/gitea.md55
-rw-r--r--doc/user/project/import/github.md2
-rw-r--r--doc/user/project/import/index.md2
-rw-r--r--doc/user/project/index.md8
-rw-r--r--doc/user/project/integrations/asana.md6
-rw-r--r--doc/user/project/integrations/github.md2
-rw-r--r--doc/user/project/integrations/img/slack_setup.pngbin65156 -> 23401 bytes
-rw-r--r--doc/user/project/integrations/img/unify_circuit_configuration.pngbin85910 -> 0 bytes
-rw-r--r--doc/user/project/integrations/img/webhook_logs.pngbin38687 -> 29101 bytes
-rw-r--r--doc/user/project/integrations/img/webhook_testing.pngbin55578 -> 96374 bytes
-rw-r--r--doc/user/project/integrations/img/zentao_product_id.pngbin40486 -> 0 bytes
-rw-r--r--doc/user/project/integrations/mattermost_slash_commands.md2
-rw-r--r--doc/user/project/integrations/overview.md24
-rw-r--r--doc/user/project/integrations/pivotal_tracker.md2
-rw-r--r--doc/user/project/integrations/prometheus.md2
-rw-r--r--doc/user/project/integrations/prometheus_library/kubernetes.md2
-rw-r--r--doc/user/project/integrations/prometheus_library/nginx_ingress.md4
-rw-r--r--doc/user/project/integrations/slack_slash_commands.md2
-rw-r--r--doc/user/project/integrations/unify_circuit.md33
-rw-r--r--doc/user/project/integrations/webhook_events.md1669
-rw-r--r--doc/user/project/integrations/webhooks.md1913
-rw-r--r--doc/user/project/integrations/zentao.md40
-rw-r--r--doc/user/project/issue_board.md16
-rw-r--r--doc/user/project/issues/design_management.md111
-rw-r--r--doc/user/project/issues/due_dates.md4
-rw-r--r--doc/user/project/issues/managing_issues.md2
-rw-r--r--doc/user/project/labels.md21
-rw-r--r--doc/user/project/members/img/project_members_filter_direct_v13_9.pngbin25485 -> 0 bytes
-rw-r--r--doc/user/project/members/img/project_members_filter_direct_v14_4.pngbin0 -> 24945 bytes
-rw-r--r--doc/user/project/members/img/project_members_filter_inherited_v13_9.pngbin36770 -> 0 bytes
-rw-r--r--doc/user/project/members/img/project_members_filter_inherited_v14_4.pngbin0 -> 33118 bytes
-rw-r--r--doc/user/project/members/img/project_members_search_v13_9.pngbin24940 -> 0 bytes
-rw-r--r--doc/user/project/members/img/project_members_search_v14_4.pngbin0 -> 23277 bytes
-rw-r--r--doc/user/project/members/img/project_members_sort_v13_9.pngbin48520 -> 0 bytes
-rw-r--r--doc/user/project/members/img/project_members_sort_v14_4.pngbin0 -> 44923 bytes
-rw-r--r--doc/user/project/members/img/project_members_v13_9.pngbin45071 -> 0 bytes
-rw-r--r--doc/user/project/members/img/project_members_v14_4.pngbin0 -> 42356 bytes
-rw-r--r--doc/user/project/members/index.md10
-rw-r--r--doc/user/project/members/share_project_with_groups.md4
-rw-r--r--doc/user/project/merge_requests/approvals/rules.md4
-rw-r--r--doc/user/project/merge_requests/approvals/settings.md24
-rw-r--r--doc/user/project/merge_requests/confidential.md37
-rw-r--r--doc/user/project/merge_requests/getting_started.md11
-rw-r--r--doc/user/project/merge_requests/index.md9
-rw-r--r--doc/user/project/merge_requests/reviews/index.md4
-rw-r--r--doc/user/project/merge_requests/reviews/suggestions.md11
-rw-r--r--doc/user/project/merge_requests/status_checks.md2
-rw-r--r--doc/user/project/merge_requests/test_coverage_visualization.md7
-rw-r--r--doc/user/project/pages/custom_domains_ssl_tls_certification/index.md24
-rw-r--r--doc/user/project/pages/custom_domains_ssl_tls_certification/ssl_tls_concepts.md2
-rw-r--r--doc/user/project/pages/index.md71
-rw-r--r--doc/user/project/pages/introduction.md6
-rw-r--r--doc/user/project/push_options.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/repository/branches/default.md34
-rw-r--r--doc/user/project/repository/branches/index.md5
-rw-r--r--doc/user/project/repository/forking_workflow.md2
-rw-r--r--doc/user/project/repository/img/web_editor_new_branch_dropdown_v14_1.pngbin24244 -> 12116 bytes
-rw-r--r--doc/user/project/repository/img/web_editor_new_branch_from_issue_v14_1.pngbin24768 -> 10160 bytes
-rw-r--r--doc/user/project/repository/img/web_editor_new_directory_dropdown_v14_1.pngbin21934 -> 11169 bytes
-rw-r--r--doc/user/project/repository/img/web_editor_new_file_dropdown_v14_1.pngbin21097 -> 10851 bytes
-rw-r--r--doc/user/project/repository/img/web_editor_template_dropdown_mit_license_v14_1.pngbin41669 -> 31321 bytes
-rw-r--r--doc/user/project/repository/img/web_editor_upload_file_dropdown_v14_1.pngbin23599 -> 11572 bytes
-rw-r--r--doc/user/project/repository/mirror/bidirectional.md171
-rw-r--r--doc/user/project/repository/mirror/img/repository_mirroring_copy_ssh_public_key_button.png (renamed from doc/user/project/repository/img/repository_mirroring_copy_ssh_public_key_button.png)bin11225 -> 11225 bytes
-rw-r--r--doc/user/project/repository/mirror/img/repository_mirroring_force_update.png (renamed from doc/user/project/repository/img/repository_mirroring_force_update.png)bin13586 -> 13586 bytes
-rw-r--r--doc/user/project/repository/mirror/index.md224
-rw-r--r--doc/user/project/repository/mirror/pull.md121
-rw-r--r--doc/user/project/repository/mirror/push.md197
-rw-r--r--doc/user/project/repository/reducing_the_repo_size_using_git.md6
-rw-r--r--doc/user/project/repository/repository_mirroring.md636
-rw-r--r--doc/user/project/requirements/index.md12
-rw-r--r--doc/user/project/settings/import_export.md42
-rw-r--r--doc/user/project/settings/index.md72
-rw-r--r--doc/user/project/web_ide/index.md16
-rw-r--r--doc/user/project/wiki/index.md18
-rw-r--r--doc/user/project/working_with_projects.md12
-rw-r--r--doc/user/reserved_names.md4
-rw-r--r--doc/user/shortcuts.md8
-rw-r--r--doc/user/todos.md4
-rw-r--r--doc/user/usage_quotas.md32
-rw-r--r--doc/user/workspace/index.md27
-rw-r--r--generator_templates/active_record/migration/create_table_migration.rb4
-rw-r--r--haml_lint/inline_javascript.rb6
-rw-r--r--jest.config.base.js5
-rw-r--r--jest_resolver.js17
-rw-r--r--lib/api/api.rb25
-rw-r--r--lib/api/base.rb17
-rw-r--r--lib/api/bulk_imports.rb2
-rw-r--r--lib/api/ci/helpers/runner.rb8
-rw-r--r--lib/api/ci/resource_groups.rb52
-rw-r--r--lib/api/ci/runners.rb30
-rw-r--r--lib/api/composer_packages.rb4
-rw-r--r--lib/api/container_repositories.rb2
-rw-r--r--lib/api/entities/basic_project_details.rb4
-rw-r--r--lib/api/entities/ci/reset_registration_token_result.rb11
-rw-r--r--lib/api/entities/ci/reset_token_result.rb11
-rw-r--r--lib/api/entities/ci/resource_group.rb11
-rw-r--r--lib/api/entities/clusters/agent_authorization.rb2
-rw-r--r--lib/api/entities/environment_basic.rb2
-rw-r--r--lib/api/entities/feature_flag.rb4
-rw-r--r--lib/api/entities/feature_flag/detailed_legacy_scope.rb11
-rw-r--r--lib/api/entities/feature_flag/legacy_scope.rb16
-rw-r--r--lib/api/entities/group_detail.rb4
-rw-r--r--lib/api/entities/issuable_entity.rb2
-rw-r--r--lib/api/entities/namespace_basic.rb2
-rw-r--r--lib/api/entities/project.rb4
-rw-r--r--lib/api/entities/user.rb9
-rw-r--r--lib/api/error_tracking.rb63
-rw-r--r--lib/api/error_tracking/client_keys.rb50
-rw-r--r--lib/api/error_tracking/collector.rb135
-rw-r--r--lib/api/error_tracking/project_settings.rb63
-rw-r--r--lib/api/error_tracking_client_keys.rb50
-rw-r--r--lib/api/error_tracking_collector.rb135
-rw-r--r--lib/api/group_container_repositories.rb1
-rw-r--r--lib/api/group_export.rb2
-rw-r--r--lib/api/groups.rb2
-rw-r--r--lib/api/helm_packages.rb7
-rw-r--r--lib/api/helpers.rb15
-rw-r--r--lib/api/helpers/common_helpers.rb2
-rw-r--r--lib/api/helpers/container_registry_helpers.rb15
-rw-r--r--lib/api/helpers/integrations_helpers.rb4
-rw-r--r--lib/api/integrations.rb178
-rw-r--r--lib/api/internal/base.rb2
-rw-r--r--lib/api/internal/kubernetes.rb19
-rw-r--r--lib/api/issues.rb39
-rw-r--r--lib/api/maven_packages.rb3
-rw-r--r--lib/api/merge_requests.rb3
-rw-r--r--lib/api/notes.rb3
-rw-r--r--lib/api/project_container_repositories.rb2
-rw-r--r--lib/api/project_export.rb48
-rw-r--r--lib/api/project_import.rb1
-rw-r--r--lib/api/projects.rb7
-rw-r--r--lib/api/projects_relation_builder.rb2
-rw-r--r--lib/api/repositories.rb3
-rw-r--r--lib/api/services.rb173
-rw-r--r--lib/api/settings.rb1
-rw-r--r--lib/api/tags.rb2
-rw-r--r--lib/api/unleash.rb2
-rw-r--r--lib/api/users.rb7
-rw-r--r--lib/api/validations/validators/project_portable.rb21
-rw-r--r--lib/atlassian/jira_connect/asymmetric_jwt.rb68
-rw-r--r--lib/atlassian/jira_connect/serializers/environment_entity.rb10
-rw-r--r--lib/backup/gitaly_backup.rb9
-rw-r--r--lib/banzai/filter/front_matter_filter.rb2
-rw-r--r--lib/banzai/filter/references/abstract_reference_filter.rb2
-rw-r--r--lib/banzai/filter/references/milestone_reference_filter.rb14
-rw-r--r--lib/banzai/filter/references/reference_cache.rb11
-rw-r--r--lib/banzai/filter/syntax_highlight_filter.rb5
-rw-r--r--lib/bulk_imports/clients/graphql.rb4
-rw-r--r--lib/bulk_imports/clients/http.rb30
-rw-r--r--lib/bulk_imports/common/extractors/ndjson_extractor.rb2
-rw-r--r--lib/bulk_imports/common/pipelines/boards_pipeline.rb15
-rw-r--r--lib/bulk_imports/common/pipelines/labels_pipeline.rb15
-rw-r--r--lib/bulk_imports/error.rb2
-rw-r--r--lib/bulk_imports/groups/pipelines/boards_pipeline.rb15
-rw-r--r--lib/bulk_imports/groups/pipelines/labels_pipeline.rb15
-rw-r--r--lib/bulk_imports/groups/stage.rb10
-rw-r--r--lib/bulk_imports/ndjson_pipeline.rb6
-rw-r--r--lib/bulk_imports/network_error.rb61
-rw-r--r--lib/bulk_imports/projects/graphql/get_repository_query.rb37
-rw-r--r--lib/bulk_imports/projects/pipelines/issues_pipeline.rb15
-rw-r--r--lib/bulk_imports/projects/pipelines/repository_pipeline.rb34
-rw-r--r--lib/bulk_imports/projects/stage.rb20
-rw-r--r--lib/bulk_imports/stage.rb6
-rw-r--r--lib/container_registry/client.rb9
-rw-r--r--lib/container_registry/tag.rb4
-rw-r--r--lib/error_tracking/sentry_client/issue.rb3
-rw-r--r--lib/gitlab/access.rb6
-rw-r--r--lib/gitlab/analytics/cycle_analytics/stage_events/code_stage_start.rb4
-rw-r--r--lib/gitlab/analytics/cycle_analytics/stage_events/issue_deployed_to_production.rb4
-rw-r--r--lib/gitlab/analytics/cycle_analytics/stage_events/metrics_based_stage_event.rb4
-rw-r--r--lib/gitlab/analytics/cycle_analytics/stage_events/stage_event.rb4
-rw-r--r--lib/gitlab/application_context.rb5
-rw-r--r--lib/gitlab/application_rate_limiter.rb23
-rw-r--r--lib/gitlab/auth/request_authenticator.rb25
-rw-r--r--lib/gitlab/background_migration/fix_first_mentioned_in_commit_at.rb91
-rw-r--r--lib/gitlab/background_migration/populate_finding_uuid_for_vulnerability_feedback.rb2
-rw-r--r--lib/gitlab/background_migration/populate_status_column_of_security_scans.rb13
-rw-r--r--lib/gitlab/background_migration/populate_topics_total_projects_count_cache.rb29
-rw-r--r--lib/gitlab/cache/ci/project_pipeline_status.rb4
-rw-r--r--lib/gitlab/cache/import/caching.rb4
-rw-r--r--lib/gitlab/chat/command.rb3
-rw-r--r--lib/gitlab/checks/matching_merge_request.rb32
-rw-r--r--lib/gitlab/ci/badge/coverage/report.rb5
-rw-r--r--lib/gitlab/ci/badge/coverage/template.rb40
-rw-r--r--lib/gitlab/ci/build/auto_retry.rb3
-rw-r--r--lib/gitlab/ci/config/external/mapper.rb3
-rw-r--r--lib/gitlab/ci/config/external/rules.rb16
-rw-r--r--lib/gitlab/ci/pipeline/chain/validate/external.rb3
-rw-r--r--lib/gitlab/ci/pipeline/metrics.rb15
-rw-r--r--lib/gitlab/ci/pipeline/seed/build.rb11
-rw-r--r--lib/gitlab/ci/reports/security/flag.rb2
-rw-r--r--lib/gitlab/ci/reports/security/vulnerability_reports_comparer.rb2
-rw-r--r--lib/gitlab/ci/status/build/failed.rb3
-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/SAST.gitlab-ci.yml1
-rw-r--r--lib/gitlab/ci/templates/npm.gitlab-ci.yml2
-rw-r--r--lib/gitlab/ci/trace.rb52
-rw-r--r--lib/gitlab/ci/trace/archive.rb77
-rw-r--r--lib/gitlab/ci/trace/metrics.rb23
-rw-r--r--lib/gitlab/ci/trace/remote_checksum.rb75
-rw-r--r--lib/gitlab/content_security_policy/config_loader.rb20
-rw-r--r--lib/gitlab/database.rb33
-rw-r--r--lib/gitlab/database/count.rb12
-rw-r--r--lib/gitlab/database/load_balancing.rb82
-rw-r--r--lib/gitlab/database/load_balancing/action_cable_callbacks.rb2
-rw-r--r--lib/gitlab/database/load_balancing/active_record_proxy.rb15
-rw-r--r--lib/gitlab/database/load_balancing/configuration.rb7
-rw-r--r--lib/gitlab/database/load_balancing/host.rb19
-rw-r--r--lib/gitlab/database/load_balancing/load_balancer.rb34
-rw-r--r--lib/gitlab/database/load_balancing/primary_host.rb24
-rw-r--r--lib/gitlab/database/load_balancing/rack_middleware.rb48
-rw-r--r--lib/gitlab/database/load_balancing/setup.rb61
-rw-r--r--lib/gitlab/database/load_balancing/sidekiq_client_middleware.rb30
-rw-r--r--lib/gitlab/database/load_balancing/sidekiq_server_middleware.rb33
-rw-r--r--lib/gitlab/database/load_balancing/sticking.rb118
-rw-r--r--lib/gitlab/database/migrations/background_migration_helpers.rb2
-rw-r--r--lib/gitlab/database/migrations/instrumentation.rb6
-rw-r--r--lib/gitlab/database/migrations/observers/migration_observer.rb5
-rw-r--r--lib/gitlab/database/migrations/observers/query_details.rb2
-rw-r--r--lib/gitlab/database/migrations/observers/query_log.rb2
-rw-r--r--lib/gitlab/database/migrations/runner.rb92
-rw-r--r--lib/gitlab/database/partitioning.rb4
-rw-r--r--lib/gitlab/database/partitioning/detached_partition_dropper.rb38
-rw-r--r--lib/gitlab/database/partitioning/multi_database_partition_dropper.rb35
-rw-r--r--lib/gitlab/database/shared_model.rb1
-rw-r--r--lib/gitlab/diff/file.rb2
-rw-r--r--lib/gitlab/doctor/secrets.rb2
-rw-r--r--lib/gitlab/email/handler/create_merge_request_handler.rb4
-rw-r--r--lib/gitlab/email/hook/smime_signature_interceptor.rb2
-rw-r--r--lib/gitlab/email/message/in_product_marketing/base.rb4
-rw-r--r--lib/gitlab/email/message/in_product_marketing/helper.rb3
-rw-r--r--lib/gitlab/email/message/in_product_marketing/trial.rb2
-rw-r--r--lib/gitlab/email/smime/certificate.rb58
-rw-r--r--lib/gitlab/endpoint_attributes.rb48
-rw-r--r--lib/gitlab/endpoint_attributes/config.rb81
-rw-r--r--lib/gitlab/error_tracking/detailed_error.rb1
-rw-r--r--lib/gitlab/experimentation.rb4
-rw-r--r--lib/gitlab/feature_categories.rb38
-rw-r--r--lib/gitlab/form_builders/gitlab_ui_form_builder.rb60
-rw-r--r--lib/gitlab/git/keep_around.rb2
-rw-r--r--lib/gitlab/git/repository.rb4
-rw-r--r--lib/gitlab/gitaly_client/operation_service.rb36
-rw-r--r--lib/gitlab/github_import/parallel_importer.rb4
-rw-r--r--lib/gitlab/github_import/parallel_scheduling.rb3
-rw-r--r--lib/gitlab/github_import/representation/diff_note.rb22
-rw-r--r--lib/gitlab/github_import/representation/diff_notes/suggestion_formatter.rb66
-rw-r--r--lib/gitlab/github_import/representation/issue.rb8
-rw-r--r--lib/gitlab/github_import/representation/lfs_object.rb9
-rw-r--r--lib/gitlab/github_import/representation/note.rb12
-rw-r--r--lib/gitlab/github_import/representation/pull_request.rb8
-rw-r--r--lib/gitlab/github_import/representation/pull_request_review.rb11
-rw-r--r--lib/gitlab/github_import/representation/user.rb1
-rw-r--r--lib/gitlab/github_import/sequential_importer.rb29
-rw-r--r--lib/gitlab/gon_helper.rb1
-rw-r--r--lib/gitlab/grape_logging/loggers/context_logger.rb11
-rw-r--r--lib/gitlab/graphql/board/issues_connection_extension.rb15
-rw-r--r--lib/gitlab/graphql/connection_collection_methods.rb2
-rw-r--r--lib/gitlab/health_checks/redis/rate_limiting_check.rb35
-rw-r--r--lib/gitlab/health_checks/redis/redis_check.rb4
-rw-r--r--lib/gitlab/health_checks/redis/sessions_check.rb35
-rw-r--r--lib/gitlab/highlight.rb4
-rw-r--r--lib/gitlab/i18n.rb18
-rw-r--r--lib/gitlab/import/import_failure_service.rb12
-rw-r--r--lib/gitlab/import/metrics.rb47
-rw-r--r--lib/gitlab/import_export/attributes_permitter.rb2
-rw-r--r--lib/gitlab/import_export/base/relation_factory.rb6
-rw-r--r--lib/gitlab/import_export/command_line_util.rb26
-rw-r--r--lib/gitlab/import_export/group/relation_factory.rb4
-rw-r--r--lib/gitlab/import_export/json/streaming_serializer.rb1
-rw-r--r--lib/gitlab/import_export/merge_request_parser.rb4
-rw-r--r--lib/gitlab/import_export/project/import_export.yml140
-rw-r--r--lib/gitlab/import_export/relation_tree_restorer.rb18
-rw-r--r--lib/gitlab/instrumentation/redis.rb4
-rw-r--r--lib/gitlab/instrumentation_helper.rb35
-rw-r--r--lib/gitlab/issuable_sorter.rb2
-rw-r--r--lib/gitlab/kas.rb4
-rw-r--r--lib/gitlab/mail_room.rb3
-rw-r--r--lib/gitlab/merge_requests/mergeability/check_result.rb48
-rw-r--r--lib/gitlab/merge_requests/mergeability/redis_interface.rb23
-rw-r--r--lib/gitlab/merge_requests/mergeability/results_store.rb25
-rw-r--r--lib/gitlab/metrics/dashboard/service_selector.rb2
-rw-r--r--lib/gitlab/metrics/exporter/web_exporter.rb17
-rw-r--r--lib/gitlab/metrics/instrumentation.rb194
-rw-r--r--lib/gitlab/metrics/rails_slis.rb52
-rw-r--r--lib/gitlab/metrics/requests_rack_middleware.rb38
-rw-r--r--lib/gitlab/metrics/sli.rb83
-rw-r--r--lib/gitlab/metrics/subscribers/active_record.rb12
-rw-r--r--lib/gitlab/metrics/subscribers/load_balancing.rb6
-rw-r--r--lib/gitlab/metrics/subscribers/rack_attack.rb3
-rw-r--r--lib/gitlab/metrics/web_transaction.rb11
-rw-r--r--lib/gitlab/middleware/multipart.rb1
-rw-r--r--lib/gitlab/middleware/speedscope.rb18
-rw-r--r--lib/gitlab/optimistic_locking.rb2
-rw-r--r--lib/gitlab/pagination/keyset/in_operator_optimization/query_builder.rb41
-rw-r--r--lib/gitlab/pagination/keyset/in_operator_optimization/strategies/order_values_loader_strategy.rb38
-rw-r--r--lib/gitlab/pagination/keyset/in_operator_optimization/strategies/record_loader_strategy.rb42
-rw-r--r--lib/gitlab/pagination/keyset/iterator.rb15
-rw-r--r--lib/gitlab/pagination/keyset/paginator.rb4
-rw-r--r--lib/gitlab/pagination/keyset/unsupported_scope_order.rb19
-rw-r--r--lib/gitlab/path_regex.rb4
-rw-r--r--lib/gitlab/performance_bar/stats.rb17
-rw-r--r--lib/gitlab/quick_actions/merge_request_actions.rb6
-rw-r--r--lib/gitlab/quick_actions/relate_actions.rb14
-rw-r--r--lib/gitlab/rack_attack/instrumented_cache_store.rb9
-rw-r--r--lib/gitlab/rack_attack/request.rb23
-rw-r--r--lib/gitlab/redis/cache.rb15
-rw-r--r--lib/gitlab/redis/queues.rb9
-rw-r--r--lib/gitlab/redis/rate_limiting.rb16
-rw-r--r--lib/gitlab/redis/sessions.rb12
-rw-r--r--lib/gitlab/redis/shared_state.rb8
-rw-r--r--lib/gitlab/redis/wrapper.rb39
-rw-r--r--lib/gitlab/regex.rb10
-rw-r--r--lib/gitlab/request_endpoints.rb41
-rw-r--r--lib/gitlab/saas.rb8
-rw-r--r--lib/gitlab/sidekiq_config.rb4
-rw-r--r--lib/gitlab/sidekiq_config/dummy_worker.rb19
-rw-r--r--lib/gitlab/sidekiq_enq.rb51
-rw-r--r--lib/gitlab/sidekiq_logging/structured_logger.rb5
-rw-r--r--lib/gitlab/sidekiq_middleware.rb17
-rw-r--r--lib/gitlab/sidekiq_middleware/client_metrics.rb10
-rw-r--r--lib/gitlab/sidekiq_middleware/duplicate_jobs/duplicate_job.rb73
-rw-r--r--lib/gitlab/sidekiq_middleware/duplicate_jobs/strategies/deduplicates_when_scheduling.rb7
-rw-r--r--lib/gitlab/sidekiq_middleware/duplicate_jobs/strategies/until_executed.rb6
-rw-r--r--lib/gitlab/sidekiq_middleware/duplicate_jobs/strategies/until_executing.rb6
-rw-r--r--lib/gitlab/sidekiq_middleware/metrics_helper.rb19
-rw-r--r--lib/gitlab/sidekiq_middleware/server_metrics.rb7
-rw-r--r--lib/gitlab/sidekiq_middleware/worker_context.rb6
-rw-r--r--lib/gitlab/sidekiq_middleware/worker_context/client.rb15
-rw-r--r--lib/gitlab/sidekiq_middleware/worker_context/server.rb2
-rw-r--r--lib/gitlab/sidekiq_versioning.rb18
-rw-r--r--lib/gitlab/sidekiq_versioning/manager.rb14
-rw-r--r--lib/gitlab/stack_prof.rb12
-rw-r--r--lib/gitlab/subscription_portal.rb30
-rw-r--r--lib/gitlab/template/gitlab_ci_yml_template.rb6
-rw-r--r--lib/gitlab/throttle.rb2
-rw-r--r--lib/gitlab/tracking/docs/helper.rb67
-rw-r--r--lib/gitlab/tracking/docs/renderer.rb32
-rw-r--r--lib/gitlab/tracking/docs/templates/default.md.haml35
-rw-r--r--lib/gitlab/tracking/standard_context.rb10
-rw-r--r--lib/gitlab/usage/metric_definition.rb7
-rw-r--r--lib/gitlab/usage/metrics/instrumentations/active_user_count_metric.rb15
-rw-r--r--lib/gitlab/usage/metrics/instrumentations/count_users_associating_milestones_to_releases_metric.rb18
-rw-r--r--lib/gitlab/usage_data.rb66
-rw-r--r--lib/gitlab/usage_data_counters/ci_template_unique_counter.rb28
-rw-r--r--lib/gitlab/usage_data_counters/guest_package_events.yml34
-rw-r--r--lib/gitlab/usage_data_counters/known_events/ci_templates.yml50
-rw-r--r--lib/gitlab/usage_data_counters/known_events/common.yml4
-rw-r--r--lib/gitlab/usage_data_counters/known_events/epic_board_events.yml3
-rw-r--r--lib/gitlab/usage_data_counters/known_events/importer_events.yml17
-rw-r--r--lib/gitlab/utils/delegator_override.rb48
-rw-r--r--lib/gitlab/utils/delegator_override/error.rb23
-rw-r--r--lib/gitlab/utils/delegator_override/validator.rb105
-rw-r--r--lib/gitlab/verify/uploads.rb2
-rw-r--r--lib/gitlab/view/presenter/base.rb14
-rw-r--r--lib/gitlab/view/presenter/delegated.rb11
-rw-r--r--lib/gitlab/with_feature_category.rb50
-rw-r--r--lib/gitlab/workhorse.rb15
-rw-r--r--lib/gitlab/x509/certificate.rb56
-rw-r--r--lib/peek/views/active_record.rb8
-rw-r--r--lib/quality/seeders/issues.rb3
-rw-r--r--lib/sidebars/groups/menus/scope_menu.rb6
-rw-r--r--lib/sidebars/projects/menus/deployments_menu.rb2
-rw-r--r--lib/sidebars/projects/menus/infrastructure_menu.rb17
-rw-r--r--lib/sidebars/projects/menus/scope_menu.rb6
-rw-r--r--lib/system_check/app/git_version_check.rb2
-rw-r--r--lib/tasks/frontend.rake23
-rw-r--r--lib/tasks/gitlab/assets.rake2
-rw-r--r--lib/tasks/gitlab/db.rake35
-rw-r--r--lib/tasks/gitlab/packages/composer.rake20
-rw-r--r--lib/tasks/gitlab/snowplow.rake11
-rw-r--r--lib/tasks/gitlab/usage_data.rake26
-rw-r--r--lib/tasks/import.rake13
-rw-r--r--lib/tasks/lint.rake8
-rw-r--r--lib/tasks/rubocop.rake3
-rw-r--r--locale/am_ET/gitlab.po1731
-rw-r--r--locale/ar_SA/gitlab.po1773
-rw-r--r--locale/as_IN/gitlab.po1729
-rw-r--r--locale/az_AZ/gitlab.po1729
-rw-r--r--locale/ba_RU/gitlab.po1718
-rw-r--r--locale/bg/gitlab.po1729
-rw-r--r--locale/bn_BD/gitlab.po1729
-rw-r--r--locale/bn_IN/gitlab.po1729
-rw-r--r--locale/br_FR/gitlab.po1762
-rw-r--r--locale/bs_BA/gitlab.po1932
-rw-r--r--locale/ca_ES/gitlab.po1729
-rw-r--r--locale/cs_CZ/gitlab.po1751
-rw-r--r--locale/cy_GB/gitlab.po1773
-rw-r--r--locale/da_DK/gitlab.po8847
-rw-r--r--locale/de/gitlab.po1973
-rw-r--r--locale/el_GR/gitlab.po1729
-rw-r--r--locale/eo/gitlab.po1729
-rw-r--r--locale/es/gitlab.po1881
-rw-r--r--locale/et_EE/gitlab.po1729
-rw-r--r--locale/fa_IR/gitlab.po1729
-rw-r--r--locale/fi_FI/gitlab.po1729
-rw-r--r--locale/fil_PH/gitlab.po1729
-rw-r--r--locale/fr/gitlab.po1751
-rw-r--r--locale/gitlab.pot1606
-rw-r--r--locale/gl_ES/gitlab.po1733
-rw-r--r--locale/he_IL/gitlab.po1751
-rw-r--r--locale/hi_IN/gitlab.po1729
-rw-r--r--locale/hr_HR/gitlab.po1740
-rw-r--r--locale/hu_HU/gitlab.po1729
-rw-r--r--locale/hy_AM/gitlab.po1729
-rw-r--r--locale/id_ID/gitlab.po1718
-rw-r--r--locale/ig_NG/gitlab.po1718
-rw-r--r--locale/is_IS/gitlab.po1729
-rw-r--r--locale/it/gitlab.po1735
-rw-r--r--locale/ja/gitlab.po1796
-rw-r--r--locale/ka_GE/gitlab.po1729
-rw-r--r--locale/kab/gitlab.po1729
-rw-r--r--locale/ko/gitlab.po1744
-rw-r--r--locale/ku_TR/gitlab.po1729
-rw-r--r--locale/ky_KG/gitlab.po1729
-rw-r--r--locale/lt_LT/gitlab.po1751
-rw-r--r--locale/mk_MK/gitlab.po1729
-rw-r--r--locale/mn_MN/gitlab.po1729
-rw-r--r--locale/nb_NO/gitlab.po6055
-rw-r--r--locale/nl_NL/gitlab.po1731
-rw-r--r--locale/pa_IN/gitlab.po1729
-rw-r--r--locale/pl_PL/gitlab.po1795
-rw-r--r--locale/pt_BR/gitlab.po2819
-rw-r--r--locale/pt_PT/gitlab.po1733
-rw-r--r--locale/ro_RO/gitlab.po3366
-rw-r--r--locale/ru/gitlab.po1803
-rw-r--r--locale/si_LK/gitlab.po1729
-rw-r--r--locale/sk_SK/gitlab.po1751
-rw-r--r--locale/sl_SI/gitlab.po1751
-rw-r--r--locale/sq_AL/gitlab.po1729
-rw-r--r--locale/sr_CS/gitlab.po1740
-rw-r--r--locale/sr_SP/gitlab.po1740
-rw-r--r--locale/sv_SE/gitlab.po1729
-rw-r--r--locale/sw_KE/gitlab.po1729
-rw-r--r--locale/ta_IN/gitlab.po1729
-rw-r--r--locale/tr_TR/gitlab.po1757
-rw-r--r--locale/uk/gitlab.po2095
-rw-r--r--locale/ur_PK/gitlab.po1729
-rw-r--r--locale/uz_UZ/gitlab.po1729
-rw-r--r--locale/vi_VN/gitlab.po1718
-rw-r--r--locale/zh_CN/gitlab.po2680
-rw-r--r--locale/zh_HK/gitlab.po1722
-rw-r--r--locale/zh_TW/gitlab.po1720
-rw-r--r--package.json44
-rw-r--r--qa/Gemfile8
-rw-r--r--qa/Gemfile.lock54
-rw-r--r--qa/chemlab-library-gitlab.gemspec4
-rw-r--r--qa/lib/gitlab.rb11
-rw-r--r--qa/lib/gitlab/page/admin/dashboard.rb15
-rw-r--r--qa/lib/gitlab/page/admin/dashboard.stub.rb81
-rw-r--r--qa/lib/gitlab/page/admin/subscription.rb13
-rw-r--r--qa/lib/gitlab/page/admin/subscription.stub.rb33
-rw-r--r--qa/lib/gitlab/page/group/settings/usage_quota.stub.rb227
-rw-r--r--qa/lib/gitlab/page/group/settings/usage_quotas.rb27
-rw-r--r--qa/lib/gitlab/page/main/login.rb18
-rw-r--r--qa/lib/gitlab/page/main/login.stub.rb82
-rw-r--r--qa/lib/gitlab/page/main/sign_up.rb36
-rw-r--r--qa/lib/gitlab/page/main/sign_up.stub.rb203
-rw-r--r--qa/lib/gitlab/page/subscriptions/new.rb7
-rw-r--r--qa/qa/page/component/issue_board/show.rb2
-rw-r--r--qa/qa/page/component/snippet.rb11
-rw-r--r--qa/qa/page/component/web_ide/web_terminal_panel.rb63
-rw-r--r--qa/qa/page/group/bulk_import.rb7
-rw-r--r--qa/qa/page/group/dependency_proxy.rb11
-rw-r--r--qa/qa/page/group/settings/package_registries.rb19
-rw-r--r--qa/qa/page/merge_request/new.rb7
-rw-r--r--qa/qa/page/merge_request/show.rb32
-rw-r--r--qa/qa/page/profile/two_factor_auth.rb5
-rw-r--r--qa/qa/page/project/artifact/show.rb6
-rw-r--r--qa/qa/page/project/import/repo_by_url.rb16
-rw-r--r--qa/qa/page/project/new.rb12
-rw-r--r--qa/qa/page/project/packages/show.rb2
-rw-r--r--qa/qa/page/project/registry/show.rb5
-rw-r--r--qa/qa/page/project/secure/configuration_form.rb12
-rw-r--r--qa/qa/page/project/web_ide/edit.rb3
-rw-r--r--qa/qa/resource/api_fabricator.rb34
-rw-r--r--qa/qa/resource/base.rb27
-rw-r--r--qa/qa/resource/fork.rb7
-rw-r--r--qa/qa/resource/group_badge.rb73
-rw-r--r--qa/qa/resource/group_base.rb48
-rw-r--r--qa/qa/resource/merge_request_from_fork.rb13
-rw-r--r--qa/qa/resource/personal_access_token.rb8
-rw-r--r--qa/qa/resource/project.rb54
-rw-r--r--qa/qa/resource/project_imported_from_github.rb4
-rw-r--r--qa/qa/resource/project_snippet.rb2
-rw-r--r--qa/qa/resource/snippet.rb6
-rw-r--r--qa/qa/resource/user.rb30
-rw-r--r--qa/qa/runtime/allure_report.rb32
-rw-r--r--qa/qa/runtime/api/client.rb73
-rw-r--r--qa/qa/service/praefect_manager.rb126
-rw-r--r--qa/qa/service/shellout.rb2
-rw-r--r--qa/qa/specs/features/api/1_manage/bulk_import_group_spec.rb43
-rw-r--r--qa/qa/specs/features/api/1_manage/bulk_import_project_spec.rb79
-rw-r--r--qa/qa/specs/features/api/1_manage/import_large_github_repo_spec.rb18
-rw-r--r--qa/qa/specs/features/api/3_create/gitaly/automatic_failover_and_recovery_spec.rb26
-rw-r--r--qa/qa/specs/features/api/3_create/gitaly/backend_node_recovery_spec.rb8
-rw-r--r--qa/qa/specs/features/api/3_create/repository/project_archive_compare_spec.rb3
-rw-r--r--qa/qa/specs/features/browser_ui/1_manage/group/bulk_import_group_spec.rb4
-rw-r--r--qa/qa/specs/features/browser_ui/1_manage/login/2fa_recovery_spec.rb1
-rw-r--r--qa/qa/specs/features/browser_ui/1_manage/login/2fa_ssh_recovery_spec.rb1
-rw-r--r--qa/qa/specs/features/browser_ui/1_manage/login/log_in_with_2fa_spec.rb1
-rw-r--r--qa/qa/specs/features/browser_ui/1_manage/project/create_project_spec.rb5
-rw-r--r--qa/qa/specs/features/browser_ui/3_create/merge_request/merge_merge_request_from_fork_spec.rb27
-rw-r--r--qa/qa/specs/features/browser_ui/3_create/merge_request/revert/reverting_merge_request_spec.rb8
-rw-r--r--qa/qa/specs/features/browser_ui/3_create/merge_request/suggestions/batch_suggestion_spec.rb4
-rw-r--r--qa/qa/specs/features/browser_ui/3_create/snippet/create_personal_snippet_spec.rb20
-rw-r--r--qa/qa/specs/features/browser_ui/3_create/snippet/create_personal_snippet_with_multiple_files_spec.rb24
-rw-r--r--qa/qa/specs/features/browser_ui/3_create/snippet/create_project_snippet_spec.rb16
-rw-r--r--qa/qa/specs/features/browser_ui/3_create/snippet/create_project_snippet_with_multiple_files_spec.rb16
-rw-r--r--qa/qa/specs/features/browser_ui/3_create/web_ide/web_terminal_spec.rb84
-rw-r--r--qa/qa/specs/features/browser_ui/5_package/dependency_proxy_spec.rb4
-rw-r--r--qa/qa/specs/features/browser_ui/5_package/helm_registry_spec.rb150
-rw-r--r--qa/qa/specs/features/browser_ui/5_package/maven_gradle_repository_spec.rb60
-rw-r--r--qa/qa/specs/features/browser_ui/7_configure/kubernetes/kubernetes_integration_spec.rb2
-rw-r--r--qa/qa/support/api.rb114
-rw-r--r--qa/qa/support/formatters/test_stats_formatter.rb22
-rw-r--r--qa/qa/support/retrier.rb22
-rw-r--r--qa/qa/tools/delete_subgroups.rb28
-rw-r--r--qa/spec/spec_helper.rb1
-rw-r--r--qa/spec/specs/allure_report_spec.rb6
-rw-r--r--qa/spec/support/formatters/test_stats_formatter_spec.rb12
-rw-r--r--qa/spec/support/shared_contexts/packages_registry_shared_context.rb63
-rwxr-xr-xscripts/frontend/start_storybook.sh18
-rwxr-xr-xscripts/frontend/startup_css/startup_css_changed.sh8
-rwxr-xr-xscripts/lint-doc.sh18
-rw-r--r--scripts/prepare_build.sh12
-rwxr-xr-xscripts/rails-update-bisect39
-rwxr-xr-xscripts/review_apps/automated_cleanup.rb49
-rw-r--r--scripts/rspec_helpers.sh14
-rwxr-xr-xscripts/rubocop-max-files-in-cache-check27
-rwxr-xr-xscripts/static-analysis5
-rw-r--r--scripts/utils.sh34
-rwxr-xr-xscripts/verify-tff-mapping8
-rw-r--r--spec/config/grape_entity_patch_spec.rb21
-rw-r--r--spec/controllers/admin/instance_review_controller_spec.rb6
-rw-r--r--spec/controllers/admin/serverless/domains_controller_spec.rb370
-rw-r--r--spec/controllers/admin/topics/avatars_controller_spec.rb20
-rw-r--r--spec/controllers/admin/topics_controller_spec.rb131
-rw-r--r--spec/controllers/application_controller_spec.rb12
-rw-r--r--spec/controllers/boards/issues_controller_spec.rb2
-rw-r--r--spec/controllers/concerns/group_tree_spec.rb112
-rw-r--r--spec/controllers/dashboard/milestones_controller_spec.rb7
-rw-r--r--spec/controllers/every_controller_spec.rb19
-rw-r--r--spec/controllers/graphql_controller_spec.rb8
-rw-r--r--spec/controllers/groups/dependency_proxy_for_containers_controller_spec.rb176
-rw-r--r--spec/controllers/groups/registry/repositories_controller_spec.rb25
-rw-r--r--spec/controllers/help_controller_spec.rb8
-rw-r--r--spec/controllers/import/bulk_imports_controller_spec.rb102
-rw-r--r--spec/controllers/jira_connect/app_descriptor_controller_spec.rb15
-rw-r--r--spec/controllers/jira_connect/events_controller_spec.rb165
-rw-r--r--spec/controllers/metrics_controller_spec.rb6
-rw-r--r--spec/controllers/profiles/two_factor_auths_controller_spec.rb6
-rw-r--r--spec/controllers/profiles_controller_spec.rb5
-rw-r--r--spec/controllers/projects/alerting/notifications_controller_spec.rb112
-rw-r--r--spec/controllers/projects/branches_controller_spec.rb22
-rw-r--r--spec/controllers/projects/compare_controller_spec.rb2
-rw-r--r--spec/controllers/projects/design_management/designs/resized_image_controller_spec.rb2
-rw-r--r--spec/controllers/projects/issues_controller_spec.rb61
-rw-r--r--spec/controllers/projects/merge_requests_controller_spec.rb13
-rw-r--r--spec/controllers/projects/pipeline_schedules_controller_spec.rb2
-rw-r--r--spec/controllers/projects/raw_controller_spec.rb2
-rw-r--r--spec/controllers/projects/registry/repositories_controller_spec.rb13
-rw-r--r--spec/controllers/projects/tags_controller_spec.rb19
-rw-r--r--spec/controllers/projects/usage_quotas_controller_spec.rb20
-rw-r--r--spec/controllers/projects_controller_spec.rb85
-rw-r--r--spec/controllers/registrations_controller_spec.rb16
-rw-r--r--spec/controllers/repositories/git_http_controller_spec.rb25
-rw-r--r--spec/controllers/search_controller_spec.rb12
-rw-r--r--spec/controllers/uploads_controller_spec.rb40
-rw-r--r--spec/db/schema_spec.rb6
-rw-r--r--spec/experiments/new_project_sast_enabled_experiment_spec.rb15
-rw-r--r--spec/factories/bulk_import.rb1
-rw-r--r--spec/factories/ci/pending_builds.rb1
-rw-r--r--spec/factories/ci/pipelines.rb4
-rw-r--r--spec/factories/ci/runner_projects.rb9
-rw-r--r--spec/factories/ci/runners.rb14
-rw-r--r--spec/factories/dependency_proxy.rb12
-rw-r--r--spec/factories/dependency_proxy/group_settings.rb9
-rw-r--r--spec/factories/dependency_proxy/image_ttl_group_policies.rb4
-rw-r--r--spec/factories/design_management/versions.rb2
-rw-r--r--spec/factories/groups.rb16
-rw-r--r--spec/factories/integration_data.rb8
-rw-r--r--spec/factories/integrations.rb20
-rw-r--r--spec/factories/namespaces.rb2
-rw-r--r--spec/factories/namespaces/project_namespaces.rb3
-rw-r--r--spec/factories/namespaces/user_namespaces.rb8
-rw-r--r--spec/factories/packages.rb365
-rw-r--r--spec/factories/packages/build_infos.rb (renamed from spec/factories/packages/build_info.rb)0
-rw-r--r--spec/factories/packages/composer/cache_files.rb20
-rw-r--r--spec/factories/packages/composer/metadata.rb10
-rw-r--r--spec/factories/packages/conan/file_metadata.rb20
-rw-r--r--spec/factories/packages/conan/metadata.rb9
-rw-r--r--spec/factories/packages/dependencies.rb12
-rw-r--r--spec/factories/packages/dependency_links.rb20
-rw-r--r--spec/factories/packages/maven/maven_metadata.rb11
-rw-r--r--spec/factories/packages/nuget/dependency_link_metadata.rb8
-rw-r--r--spec/factories/packages/nuget/metadata.rb11
-rw-r--r--spec/factories/packages/package_files.rb (renamed from spec/factories/packages/package_file.rb)0
-rw-r--r--spec/factories/packages/package_tags.rb8
-rw-r--r--spec/factories/packages/packages.rb252
-rw-r--r--spec/factories/packages/pypi/metadata.rb8
-rw-r--r--spec/factories/pages_domains.rb12
-rw-r--r--spec/factories/project_error_tracking_settings.rb1
-rw-r--r--spec/factories/usage_data.rb14
-rw-r--r--spec/factories/users.rb2
-rw-r--r--spec/factories_spec.rb1
-rw-r--r--spec/features/admin/admin_appearance_spec.rb4
-rw-r--r--spec/features/admin/admin_builds_spec.rb141
-rw-r--r--spec/features/admin/admin_hook_logs_spec.rb4
-rw-r--r--spec/features/admin/admin_jobs_spec.rb141
-rw-r--r--spec/features/admin/admin_mode/login_spec.rb2
-rw-r--r--spec/features/admin/admin_projects_spec.rb2
-rw-r--r--spec/features/admin/admin_serverless_domains_spec.rb89
-rw-r--r--spec/features/admin/admin_settings_spec.rb66
-rw-r--r--spec/features/boards/new_issue_spec.rb22
-rw-r--r--spec/features/boards/reload_boards_on_browser_back_spec.rb4
-rw-r--r--spec/features/boards/sidebar_labels_spec.rb50
-rw-r--r--spec/features/clusters/cluster_detail_page_spec.rb2
-rw-r--r--spec/features/cycle_analytics_spec.rb59
-rw-r--r--spec/features/dashboard/activity_spec.rb6
-rw-r--r--spec/features/dashboard/issuables_counter_spec.rb2
-rw-r--r--spec/features/groups/board_spec.rb2
-rw-r--r--spec/features/groups/container_registry_spec.rb12
-rw-r--r--spec/features/groups/dependency_proxy_for_containers_spec.rb108
-rw-r--r--spec/features/groups/dependency_proxy_spec.rb50
-rw-r--r--spec/features/groups/import_export/connect_instance_spec.rb34
-rw-r--r--spec/features/groups/import_export/migration_history_spec.rb30
-rw-r--r--spec/features/groups/members/manage_groups_spec.rb11
-rw-r--r--spec/features/groups/members/master_adds_member_with_expiration_date_spec.rb15
-rw-r--r--spec/features/groups/milestone_spec.rb8
-rw-r--r--spec/features/groups/packages_spec.rb4
-rw-r--r--spec/features/issues/related_issues_spec.rb98
-rw-r--r--spec/features/markdown/copy_as_gfm_spec.rb9
-rw-r--r--spec/features/markdown/markdown_spec.rb8
-rw-r--r--spec/features/merge_request/user_merges_immediately_spec.rb2
-rw-r--r--spec/features/merge_request/user_resolves_conflicts_spec.rb19
-rw-r--r--spec/features/merge_request/user_sees_deployment_widget_spec.rb32
-rw-r--r--spec/features/merge_request/user_sees_merge_widget_spec.rb12
-rw-r--r--spec/features/merge_request/user_sees_suggest_pipeline_spec.rb11
-rw-r--r--spec/features/merge_request/user_selects_branches_for_new_mr_spec.rb2
-rw-r--r--spec/features/merge_request/user_suggests_changes_on_diff_spec.rb10
-rw-r--r--spec/features/profiles/password_spec.rb10
-rw-r--r--spec/features/profiles/two_factor_auths_spec.rb4
-rw-r--r--spec/features/profiles/user_edit_profile_spec.rb52
-rw-r--r--spec/features/projects/badges/coverage_spec.rb129
-rw-r--r--spec/features/projects/badges/pipeline_badge_spec.rb2
-rw-r--r--spec/features/projects/ci/lint_spec.rb2
-rw-r--r--spec/features/projects/container_registry_spec.rb12
-rw-r--r--spec/features/projects/environments/environments_spec.rb5
-rw-r--r--spec/features/projects/files/user_creates_directory_spec.rb2
-rw-r--r--spec/features/projects/files/user_uploads_files_spec.rb14
-rw-r--r--spec/features/projects/infrastructure_registry_spec.rb6
-rw-r--r--spec/features/projects/jobs/user_browses_jobs_spec.rb282
-rw-r--r--spec/features/projects/jobs_spec.rb8
-rw-r--r--spec/features/projects/members/groups_with_access_list_spec.rb11
-rw-r--r--spec/features/projects/members/invite_group_spec.rb7
-rw-r--r--spec/features/projects/members/master_adds_member_with_expiration_date_spec.rb18
-rw-r--r--spec/features/projects/navbar_spec.rb1
-rw-r--r--spec/features/projects/new_project_spec.rb8
-rw-r--r--spec/features/projects/packages_spec.rb4
-rw-r--r--spec/features/projects/settings/monitor_settings_spec.rb35
-rw-r--r--spec/features/projects/settings/webhooks_settings_spec.rb4
-rw-r--r--spec/features/projects/show/user_uploads_files_spec.rb22
-rw-r--r--spec/features/projects/user_creates_project_spec.rb23
-rw-r--r--spec/features/security/project/internal_access_spec.rb1
-rw-r--r--spec/features/security/project/private_access_spec.rb1
-rw-r--r--spec/features/security/project/public_access_spec.rb1
-rw-r--r--spec/features/snippets/notes_on_personal_snippets_spec.rb4
-rw-r--r--spec/features/users/login_spec.rb18
-rw-r--r--spec/features/users/show_spec.rb19
-rw-r--r--spec/finders/ci/commit_statuses_finder_spec.rb6
-rw-r--r--spec/finders/ci/pipelines_for_merge_request_finder_spec.rb176
-rw-r--r--spec/finders/clusters/agents_finder_spec.rb41
-rw-r--r--spec/finders/error_tracking/errors_finder_spec.rb15
-rw-r--r--spec/finders/issues_finder_spec.rb26
-rw-r--r--spec/finders/members_finder_spec.rb62
-rw-r--r--spec/finders/packages/group_packages_finder_spec.rb13
-rw-r--r--spec/finders/projects/members/effective_access_level_finder_spec.rb20
-rw-r--r--spec/finders/projects/topics_finder_spec.rb45
-rw-r--r--spec/finders/tags_finder_spec.rb79
-rw-r--r--spec/fixtures/api/schemas/entities/member.json6
-rw-r--r--spec/fixtures/api/schemas/external_validation.json3
-rw-r--r--spec/fixtures/api/schemas/graphql/packages/package_details.json10
-rw-r--r--spec/fixtures/api/schemas/public_api/v4/environment.json7
-rw-r--r--spec/fixtures/api/schemas/public_api/v4/integration.json (renamed from spec/fixtures/api/schemas/public_api/v4/service.json)0
-rw-r--r--spec/fixtures/api/schemas/public_api/v4/integrations.json4
-rw-r--r--spec/fixtures/api/schemas/public_api/v4/services.json4
-rw-r--r--spec/fixtures/lib/gitlab/import_export/complex/project.json96
-rw-r--r--spec/fixtures/lib/gitlab/import_export/complex/tree/project.json11
-rw-r--r--spec/fixtures/lib/gitlab/import_export/complex/tree/project/boards.ndjson2
-rw-r--r--spec/fixtures/lib/gitlab/performance_bar/peek_data.json87
-rw-r--r--spec/fixtures/markdown.md.erb9
-rw-r--r--spec/fixtures/ssl/letsencrypt_expired_x3.pem98
-rw-r--r--spec/frontend/.eslintrc.yml8
-rw-r--r--spec/frontend/__helpers__/fixtures.js5
-rw-r--r--spec/frontend/__helpers__/flush_promises.js3
-rw-r--r--spec/frontend/access_tokens/components/projects_token_selector_spec.js5
-rw-r--r--spec/frontend/add_context_commits_modal/components/add_context_commits_modal_spec.js4
-rw-r--r--spec/frontend/add_context_commits_modal/components/review_tab_container_spec.js4
-rw-r--r--spec/frontend/add_context_commits_modal/store/mutations_spec.js4
-rw-r--r--spec/frontend/admin/signup_restrictions/components/signup_form_spec.js122
-rw-r--r--spec/frontend/admin/users/components/actions/actions_spec.js12
-rw-r--r--spec/frontend/admin/users/components/modals/__snapshots__/delete_user_modal_spec.js.snap4
-rw-r--r--spec/frontend/admin/users/components/modals/delete_user_modal_spec.js24
-rw-r--r--spec/frontend/alerts_settings/components/__snapshots__/alerts_form_spec.js.snap2
-rw-r--r--spec/frontend/analytics/shared/components/projects_dropdown_filter_spec.js139
-rw-r--r--spec/frontend/analytics/shared/utils_spec.js156
-rw-r--r--spec/frontend/authentication/two_factor_auth/components/manage_two_factor_form_spec.js2
-rw-r--r--spec/frontend/blob/file_template_mediator_spec.js53
-rw-r--r--spec/frontend/boards/components/board_add_new_column_trigger_spec.js59
-rw-r--r--spec/frontend/boards/stores/actions_spec.js69
-rw-r--r--spec/frontend/clusters/agents/components/show_spec.js195
-rw-r--r--spec/frontend/clusters/agents/components/token_table_spec.js135
-rw-r--r--spec/frontend/clusters/components/__snapshots__/remove_cluster_confirmation_spec.js.snap18
-rw-r--r--spec/frontend/clusters_list/components/agent_empty_state_spec.js77
-rw-r--r--spec/frontend/clusters_list/components/agent_table_spec.js117
-rw-r--r--spec/frontend/clusters_list/components/agents_spec.js246
-rw-r--r--spec/frontend/clusters_list/components/available_agents_dropwdown_spec.js129
-rw-r--r--spec/frontend/clusters_list/components/install_agent_modal_spec.js190
-rw-r--r--spec/frontend/clusters_list/components/mock_data.js12
-rw-r--r--spec/frontend/clusters_list/mocks/apollo.js45
-rw-r--r--spec/frontend/clusters_list/stubs.js14
-rw-r--r--spec/frontend/comment_type_toggle_spec.js169
-rw-r--r--spec/frontend/commit/commit_pipeline_status_component_spec.js4
-rw-r--r--spec/frontend/commit/pipelines/pipelines_table_spec.js4
-rw-r--r--spec/frontend/content_editor/components/__snapshots__/toolbar_link_button_spec.js.snap9
-rw-r--r--spec/frontend/content_editor/components/top_toolbar_spec.js1
-rw-r--r--spec/frontend/content_editor/components/wrappers/details_spec.js40
-rw-r--r--spec/frontend/content_editor/components/wrappers/frontmatter_spec.js43
-rw-r--r--spec/frontend/content_editor/extensions/color_chip_spec.js33
-rw-r--r--spec/frontend/content_editor/extensions/details_content_spec.js76
-rw-r--r--spec/frontend/content_editor/extensions/details_spec.js92
-rw-r--r--spec/frontend/content_editor/extensions/math_inline_spec.js42
-rw-r--r--spec/frontend/content_editor/extensions/table_of_contents_spec.js35
-rw-r--r--spec/frontend/content_editor/markdown_processing_examples.js2
-rw-r--r--spec/frontend/content_editor/services/markdown_serializer_spec.js107
-rw-r--r--spec/frontend/cycle_analytics/base_spec.js8
-rw-r--r--spec/frontend/cycle_analytics/mock_data.js36
-rw-r--r--spec/frontend/cycle_analytics/store/actions_spec.js37
-rw-r--r--spec/frontend/cycle_analytics/store/getters_spec.js27
-rw-r--r--spec/frontend/cycle_analytics/store/mutations_spec.js29
-rw-r--r--spec/frontend/cycle_analytics/utils_spec.js16
-rw-r--r--spec/frontend/deploy_freeze/helpers.js5
-rw-r--r--spec/frontend/deploy_keys/components/action_btn_spec.js2
-rw-r--r--spec/frontend/deploy_keys/components/app_spec.js2
-rw-r--r--spec/frontend/deploy_keys/components/key_spec.js3
-rw-r--r--spec/frontend/deploy_keys/components/keys_panel_spec.js2
-rw-r--r--spec/frontend/deprecated_jquery_dropdown_spec.js3
-rw-r--r--spec/frontend/design_management/components/upload/__snapshots__/design_version_dropdown_spec.js.snap4
-rw-r--r--spec/frontend/design_management/utils/cache_update_spec.js10
-rw-r--r--spec/frontend/design_management/utils/error_messages_spec.js31
-rw-r--r--spec/frontend/diffs/components/app_spec.js22
-rw-r--r--spec/frontend/diffs/components/commit_item_spec.js4
-rw-r--r--spec/frontend/diffs/components/compare_versions_spec.js6
-rw-r--r--spec/frontend/diffs/mock_data/diff_with_commit.js5
-rw-r--r--spec/frontend/diffs/store/actions_spec.js4
-rw-r--r--spec/frontend/diffs/utils/tree_worker_utils_spec.js313
-rw-r--r--spec/frontend/diffs/utils/workers_spec.js309
-rw-r--r--spec/frontend/droplab/constants_spec.js39
-rw-r--r--spec/frontend/droplab/drop_down_spec.js662
-rw-r--r--spec/frontend/droplab/hook_spec.js94
-rw-r--r--spec/frontend/droplab/plugins/ajax_filter_spec.js72
-rw-r--r--spec/frontend/droplab/plugins/ajax_spec.js41
-rw-r--r--spec/frontend/droplab/plugins/input_setter_spec.js259
-rw-r--r--spec/frontend/editor/source_editor_ci_schema_ext_spec.js6
-rw-r--r--spec/frontend/environments/environment_delete_spec.js13
-rw-r--r--spec/frontend/environments/environment_monitoring_spec.js22
-rw-r--r--spec/frontend/environments/environment_pin_spec.js10
-rw-r--r--spec/frontend/environments/environment_rollback_spec.js14
-rw-r--r--spec/frontend/environments/environment_terminal_button_spec.js19
-rw-r--r--spec/frontend/error_tracking/components/error_details_spec.js47
-rw-r--r--spec/frontend/error_tracking_settings/components/app_spec.js43
-rw-r--r--spec/frontend/experimentation/utils_spec.js14
-rw-r--r--spec/frontend/feature_flags/components/edit_feature_flag_spec.js16
-rw-r--r--spec/frontend/filterable_list_spec.js2
-rw-r--r--spec/frontend/filtered_search/dropdown_user_spec.js5
-rw-r--r--spec/frontend/filtered_search/droplab/constants_spec.js39
-rw-r--r--spec/frontend/filtered_search/droplab/drop_down_spec.js662
-rw-r--r--spec/frontend/filtered_search/droplab/hook_spec.js94
-rw-r--r--spec/frontend/filtered_search/droplab/plugins/ajax_filter_spec.js72
-rw-r--r--spec/frontend/filtered_search/droplab/plugins/ajax_spec.js41
-rw-r--r--spec/frontend/filtered_search/droplab/plugins/input_setter_spec.js259
-rw-r--r--spec/frontend/filtered_search/visual_token_value_spec.js8
-rw-r--r--spec/frontend/fixtures/abuse_reports.rb4
-rw-r--r--spec/frontend/fixtures/admin_users.rb4
-rw-r--r--spec/frontend/fixtures/analytics.rb10
-rw-r--r--spec/frontend/fixtures/api_markdown.rb6
-rw-r--r--spec/frontend/fixtures/api_markdown.yml83
-rw-r--r--spec/frontend/fixtures/api_merge_requests.rb4
-rw-r--r--spec/frontend/fixtures/api_projects.rb4
-rw-r--r--spec/frontend/fixtures/application_settings.rb4
-rw-r--r--spec/frontend/fixtures/autocomplete.rb4
-rw-r--r--spec/frontend/fixtures/autocomplete_sources.rb4
-rw-r--r--spec/frontend/fixtures/blob.rb4
-rw-r--r--spec/frontend/fixtures/branches.rb5
-rw-r--r--spec/frontend/fixtures/clusters.rb4
-rw-r--r--spec/frontend/fixtures/commit.rb5
-rw-r--r--spec/frontend/fixtures/deploy_keys.rb4
-rw-r--r--spec/frontend/fixtures/freeze_period.rb4
-rw-r--r--spec/frontend/fixtures/groups.rb4
-rw-r--r--spec/frontend/fixtures/issues.rb4
-rw-r--r--spec/frontend/fixtures/jobs.rb4
-rw-r--r--spec/frontend/fixtures/labels.rb4
-rw-r--r--spec/frontend/fixtures/merge_requests.rb4
-rw-r--r--spec/frontend/fixtures/merge_requests_diffs.rb4
-rw-r--r--spec/frontend/fixtures/metrics_dashboard.rb4
-rw-r--r--spec/frontend/fixtures/pipeline_schedules.rb4
-rw-r--r--spec/frontend/fixtures/pipelines.rb4
-rw-r--r--spec/frontend/fixtures/projects.rb8
-rw-r--r--spec/frontend/fixtures/projects_json.rb4
-rw-r--r--spec/frontend/fixtures/prometheus_service.rb4
-rw-r--r--spec/frontend/fixtures/raw.rb8
-rw-r--r--spec/frontend/fixtures/releases.rb8
-rw-r--r--spec/frontend/fixtures/runner.rb4
-rw-r--r--spec/frontend/fixtures/search.rb4
-rw-r--r--spec/frontend/fixtures/services.rb4
-rw-r--r--spec/frontend/fixtures/sessions.rb4
-rw-r--r--spec/frontend/fixtures/snippet.rb4
-rw-r--r--spec/frontend/fixtures/startup_css.rb8
-rw-r--r--spec/frontend/fixtures/static/oauth_remember_me.html33
-rw-r--r--spec/frontend/fixtures/tags.rb4
-rw-r--r--spec/frontend/fixtures/timezones.rb4
-rw-r--r--spec/frontend/fixtures/todos.rb4
-rw-r--r--spec/frontend/fixtures/u2f.rb4
-rw-r--r--spec/frontend/fixtures/webauthn.rb4
-rw-r--r--spec/frontend/gfm_auto_complete_spec.js4
-rw-r--r--spec/frontend/header_search/components/app_spec.js32
-rw-r--r--spec/frontend/header_search/components/header_search_autocomplete_items_spec.js108
-rw-r--r--spec/frontend/header_search/mock_data.js69
-rw-r--r--spec/frontend/header_search/store/actions_spec.js34
-rw-r--r--spec/frontend/header_search/store/getters_spec.js40
-rw-r--r--spec/frontend/header_search/store/mutations_spec.js29
-rw-r--r--spec/frontend/ide/components/jobs/detail_spec.js24
-rw-r--r--spec/frontend/ide/stores/modules/commit/getters_spec.js2
-rw-r--r--spec/frontend/ide/stores/utils_spec.js2
-rw-r--r--spec/frontend/import_entities/components/pagination_bar_spec.js92
-rw-r--r--spec/frontend/integrations/edit/components/integration_form_spec.js2
-rw-r--r--spec/frontend/integrations/edit/components/jira_issues_fields_spec.js3
-rw-r--r--spec/frontend/integrations/edit/components/override_dropdown_spec.js2
-rw-r--r--spec/frontend/integrations/integration_settings_form_spec.js12
-rw-r--r--spec/frontend/integrations/overrides/components/integration_overrides_spec.js29
-rw-r--r--spec/frontend/invite_members/components/invite_members_modal_spec.js4
-rw-r--r--spec/frontend/invite_members/mock_data/api_responses.js14
-rw-r--r--spec/frontend/invite_members/utils/response_message_parser_spec.js28
-rw-r--r--spec/frontend/issuable/components/csv_export_modal_spec.js5
-rw-r--r--spec/frontend/issuable/components/csv_import_modal_spec.js7
-rw-r--r--spec/frontend/issuable/related_issues/components/add_issuable_form_spec.js7
-rw-r--r--spec/frontend/issuable_form_spec.js19
-rw-r--r--spec/frontend/issuable_list/components/issuable_item_spec.js15
-rw-r--r--spec/frontend/issuable_suggestions/components/item_spec.js63
-rw-r--r--spec/frontend/issues_list/components/issues_list_app_spec.js36
-rw-r--r--spec/frontend/issues_list/components/new_issue_dropdown_spec.js131
-rw-r--r--spec/frontend/issues_list/mock_data.js34
-rw-r--r--spec/frontend/jira_import/components/__snapshots__/jira_import_form_spec.js.snap32
-rw-r--r--spec/frontend/jobs/components/job_app_spec.js35
-rw-r--r--spec/frontend/jobs/components/job_container_item_spec.js2
-rw-r--r--spec/frontend/jobs/components/job_log_controllers_spec.js14
-rw-r--r--spec/frontend/jobs/components/log/collapsible_section_spec.js8
-rw-r--r--spec/frontend/jobs/components/log/log_spec.js12
-rw-r--r--spec/frontend/jobs/mixins/delayed_job_mixin_spec.js2
-rw-r--r--spec/frontend/jobs/store/actions_spec.js112
-rw-r--r--spec/frontend/jobs/store/getters_spec.js8
-rw-r--r--spec/frontend/jobs/store/mutations_spec.js80
-rw-r--r--spec/frontend/jobs/store/utils_spec.js12
-rw-r--r--spec/frontend/lib/apollo/suppress_network_errors_during_navigation_link_spec.js155
-rw-r--r--spec/frontend/lib/logger/__snapshots__/hello_spec.js.snap21
-rw-r--r--spec/frontend/lib/logger/hello_spec.js28
-rw-r--r--spec/frontend/lib/utils/color_utils_spec.js18
-rw-r--r--spec/frontend/lib/utils/datetime/date_format_utility_spec.js15
-rw-r--r--spec/frontend/lib/utils/is_navigating_away_spec.js23
-rw-r--r--spec/frontend/lib/utils/text_utility_spec.js21
-rw-r--r--spec/frontend/lib/utils/url_utility_spec.js35
-rw-r--r--spec/frontend/members/components/action_buttons/remove_member_button_spec.js2
-rw-r--r--spec/frontend/members/components/action_buttons/user_action_buttons_spec.js5
-rw-r--r--spec/frontend/members/components/modals/leave_modal_spec.js29
-rw-r--r--spec/frontend/members/components/modals/remove_member_modal_spec.js33
-rw-r--r--spec/frontend/members/components/table/expires_at_spec.js86
-rw-r--r--spec/frontend/members/components/table/members_table_spec.js88
-rw-r--r--spec/frontend/members/mock_data.js7
-rw-r--r--spec/frontend/monitoring/components/__snapshots__/dashboard_template_spec.js.snap2
-rw-r--r--spec/frontend/monitoring/fixture_data.js6
-rw-r--r--spec/frontend/namespace_select_spec.js65
-rw-r--r--spec/frontend/notebook/cells/code_spec.js5
-rw-r--r--spec/frontend/notebook/cells/markdown_spec.js9
-rw-r--r--spec/frontend/notebook/cells/output/index_spec.js7
-rw-r--r--spec/frontend/notebook/index_spec.js9
-rw-r--r--spec/frontend/notes/components/comment_type_dropdown_spec.js14
-rw-r--r--spec/frontend/notes/components/diff_with_note_spec.js9
-rw-r--r--spec/frontend/notes/components/note_form_spec.js10
-rw-r--r--spec/frontend/notes/components/noteable_discussion_spec.js7
-rw-r--r--spec/frontend/notes/components/noteable_note_spec.js21
-rw-r--r--spec/frontend/notes/stores/getters_spec.js5
-rw-r--r--spec/frontend/oauth_remember_me_spec.js2
-rw-r--r--spec/frontend/packages/details/components/__snapshots__/conan_installation_spec.js.snap36
-rw-r--r--spec/frontend/packages/details/components/__snapshots__/dependency_row_spec.js.snap34
-rw-r--r--spec/frontend/packages/details/components/__snapshots__/maven_installation_spec.js.snap112
-rw-r--r--spec/frontend/packages/details/components/__snapshots__/npm_installation_spec.js.snap36
-rw-r--r--spec/frontend/packages/details/components/__snapshots__/nuget_installation_spec.js.snap36
-rw-r--r--spec/frontend/packages/details/components/__snapshots__/package_title_spec.js.snap168
-rw-r--r--spec/frontend/packages/details/components/__snapshots__/pypi_installation_spec.js.snap45
-rw-r--r--spec/frontend/packages/details/components/additional_metadata_spec.js119
-rw-r--r--spec/frontend/packages/details/components/app_spec.js385
-rw-r--r--spec/frontend/packages/details/components/composer_installation_spec.js133
-rw-r--r--spec/frontend/packages/details/components/conan_installation_spec.js72
-rw-r--r--spec/frontend/packages/details/components/dependency_row_spec.js62
-rw-r--r--spec/frontend/packages/details/components/file_sha_spec.js33
-rw-r--r--spec/frontend/packages/details/components/installation_title_spec.js58
-rw-r--r--spec/frontend/packages/details/components/installations_commands_spec.js61
-rw-r--r--spec/frontend/packages/details/components/maven_installation_spec.js184
-rw-r--r--spec/frontend/packages/details/components/npm_installation_spec.js123
-rw-r--r--spec/frontend/packages/details/components/nuget_installation_spec.js79
-rw-r--r--spec/frontend/packages/details/components/package_files_spec.js259
-rw-r--r--spec/frontend/packages/details/components/package_history_spec.js117
-rw-r--r--spec/frontend/packages/details/components/package_title_spec.js189
-rw-r--r--spec/frontend/packages/details/components/pypi_installation_spec.js72
-rw-r--r--spec/frontend/packages/details/store/actions_spec.js156
-rw-r--r--spec/frontend/packages/details/store/getters_spec.js295
-rw-r--r--spec/frontend/packages/details/store/mutations_spec.js40
-rw-r--r--spec/frontend/packages/shared/components/package_list_row_spec.js14
-rw-r--r--spec/frontend/packages_and_registries/dependency_proxy/app_spec.js173
-rw-r--r--spec/frontend/packages_and_registries/dependency_proxy/mock_data.js21
-rw-r--r--spec/frontend/packages_and_registries/infrastructure_registry/components/details/components/__snapshots__/file_sha_spec.js.snap (renamed from spec/frontend/packages/details/components/__snapshots__/file_sha_spec.js.snap)0
-rw-r--r--spec/frontend/packages_and_registries/infrastructure_registry/components/details/components/__snapshots__/terraform_installation_spec.js.snap (renamed from spec/frontend/packages_and_registries/infrastructure_registry/components/__snapshots__/terraform_installation_spec.js.snap)0
-rw-r--r--spec/frontend/packages_and_registries/infrastructure_registry/components/details/components/app_spec.js321
-rw-r--r--spec/frontend/packages_and_registries/infrastructure_registry/components/details/components/details_title_spec.js93
-rw-r--r--spec/frontend/packages_and_registries/infrastructure_registry/components/details/components/file_sha_spec.js33
-rw-r--r--spec/frontend/packages_and_registries/infrastructure_registry/components/details/components/package_files_spec.js259
-rw-r--r--spec/frontend/packages_and_registries/infrastructure_registry/components/details/components/package_history_spec.js117
-rw-r--r--spec/frontend/packages_and_registries/infrastructure_registry/components/details/components/terraform_installation_spec.js62
-rw-r--r--spec/frontend/packages_and_registries/infrastructure_registry/components/details/mock_data.js (renamed from spec/frontend/packages/details/mock_data.js)0
-rw-r--r--spec/frontend/packages_and_registries/infrastructure_registry/components/details/store/actions_spec.js156
-rw-r--r--spec/frontend/packages_and_registries/infrastructure_registry/components/details/store/getters_spec.js40
-rw-r--r--spec/frontend/packages_and_registries/infrastructure_registry/components/details/store/mutations_spec.js40
-rw-r--r--spec/frontend/packages_and_registries/infrastructure_registry/components/details_title_spec.js93
-rw-r--r--spec/frontend/packages_and_registries/infrastructure_registry/components/terraform_installation_spec.js62
-rw-r--r--spec/frontend/packages_and_registries/package_registry/components/details/__snapshots__/npm_installation_spec.js.snap9
-rw-r--r--spec/frontend/packages_and_registries/package_registry/components/details/metadata/nuget_spec.js29
-rw-r--r--spec/frontend/packages_and_registries/package_registry/components/details/npm_installation_spec.js62
-rw-r--r--spec/frontend/packages_and_registries/package_registry/components/details/package_history_spec.js2
-rw-r--r--spec/frontend/packages_and_registries/package_registry/components/list/__snapshots__/app_spec.js.snap12
-rw-r--r--spec/frontend/packages_and_registries/package_registry/components/list/__snapshots__/package_list_row_spec.js.snap122
-rw-r--r--spec/frontend/packages_and_registries/package_registry/components/list/__snapshots__/packages_list_app_spec.js.snap68
-rw-r--r--spec/frontend/packages_and_registries/package_registry/components/list/__snapshots__/publish_method_spec.js.snap42
-rw-r--r--spec/frontend/packages_and_registries/package_registry/components/list/app_spec.js154
-rw-r--r--spec/frontend/packages_and_registries/package_registry/components/list/package_list_row_spec.js156
-rw-r--r--spec/frontend/packages_and_registries/package_registry/components/list/packages_list_app_spec.js273
-rw-r--r--spec/frontend/packages_and_registries/package_registry/components/list/packages_search_spec.js145
-rw-r--r--spec/frontend/packages_and_registries/package_registry/components/list/publish_method_spec.js47
-rw-r--r--spec/frontend/packages_and_registries/package_registry/mock_data.js34
-rw-r--r--spec/frontend/packages_and_registries/settings/group/components/dependency_proxy_settings_spec.js189
-rw-r--r--spec/frontend/packages_and_registries/settings/group/components/duplicates_settings_spec.js14
-rw-r--r--spec/frontend/packages_and_registries/settings/group/components/group_settings_app_spec.js322
-rw-r--r--spec/frontend/packages_and_registries/settings/group/components/package_settings_spec.js277
-rw-r--r--spec/frontend/packages_and_registries/settings/group/graphl/utils/cache_update_spec.js66
-rw-r--r--spec/frontend/packages_and_registries/settings/group/graphl/utils/optimistic_responses_spec.js23
-rw-r--r--spec/frontend/packages_and_registries/settings/group/mock_data.js50
-rw-r--r--spec/frontend/packages_and_registries/settings/project/settings/__snapshots__/utils_spec.js.snap6
-rw-r--r--spec/frontend/packages_and_registries/settings/project/settings/components/__snapshots__/settings_form_spec.js.snap2
-rw-r--r--spec/frontend/pages/admin/projects/components/namespace_select_spec.js93
-rw-r--r--spec/frontend/pages/import/bulk_imports/history/components/bulk_imports_history_app_spec.js175
-rw-r--r--spec/frontend/pages/profiles/password_prompt/password_prompt_modal_spec.js92
-rw-r--r--spec/frontend/pages/projects/graphs/__snapshots__/code_coverage_spec.js.snap2
-rw-r--r--spec/frontend/pages/projects/new/components/app_spec.js44
-rw-r--r--spec/frontend/pages/projects/new/components/new_project_push_tip_popover_spec.js75
-rw-r--r--spec/frontend/pages/projects/new/components/new_project_url_select_spec.js122
-rw-r--r--spec/frontend/pages/projects/pipeline_schedules/shared/components/timezone_dropdown_spec.js78
-rw-r--r--spec/frontend/pages/sessions/new/preserve_url_fragment_spec.js2
-rw-r--r--spec/frontend/pipeline_editor/components/editor/text_editor_spec.js5
-rw-r--r--spec/frontend/pipeline_editor/components/header/pipeline_status_spec.js51
-rw-r--r--spec/frontend/pipeline_editor/components/header/pipline_editor_mini_graph_spec.js42
-rw-r--r--spec/frontend/pipeline_editor/components/ui/pipeline_editor_empty_state_spec.js21
-rw-r--r--spec/frontend/pipeline_editor/mock_data.js53
-rw-r--r--spec/frontend/pipeline_editor/pipeline_editor_app_spec.js35
-rw-r--r--spec/frontend/pipeline_editor/pipeline_editor_home_spec.js9
-rw-r--r--spec/frontend/pipelines/components/pipelines_list/pipeline_mini_graph_spec.js2
-rw-r--r--spec/frontend/pipelines/components/pipelines_list/pipieline_stop_modal_spec.js27
-rw-r--r--spec/frontend/pipelines/graph/job_item_spec.js60
-rw-r--r--spec/frontend/pipelines/pipeline_multi_actions_spec.js2
-rw-r--r--spec/frontend/pipelines/pipelines_artifacts_spec.js3
-rw-r--r--spec/frontend/pipelines/pipelines_spec.js2
-rw-r--r--spec/frontend/pipelines/pipelines_table_spec.js6
-rw-r--r--spec/frontend/pipelines/test_reports/stores/actions_spec.js3
-rw-r--r--spec/frontend/pipelines/test_reports/stores/getters_spec.js4
-rw-r--r--spec/frontend/pipelines/test_reports/stores/mutations_spec.js4
-rw-r--r--spec/frontend/pipelines/test_reports/test_reports_spec.js4
-rw-r--r--spec/frontend/pipelines/test_reports/test_suite_table_spec.js4
-rw-r--r--spec/frontend/pipelines/test_reports/test_summary_spec.js4
-rw-r--r--spec/frontend/pipelines/test_reports/test_summary_table_spec.js4
-rw-r--r--spec/frontend/projects/new/components/app_spec.js44
-rw-r--r--spec/frontend/projects/new/components/new_project_push_tip_popover_spec.js75
-rw-r--r--spec/frontend/projects/new/components/new_project_url_select_spec.js235
-rw-r--r--spec/frontend/projects/projects_filterable_list_spec.js2
-rw-r--r--spec/frontend/projects/settings/components/new_access_dropdown_spec.js345
-rw-r--r--spec/frontend/ref/components/ref_selector_spec.js11
-rw-r--r--spec/frontend/registry/explorer/components/details_page/tags_list_row_spec.js72
-rw-r--r--spec/frontend/registry/explorer/pages/list_spec.js7
-rw-r--r--spec/frontend/related_merge_requests/components/related_merge_requests_spec.js6
-rw-r--r--spec/frontend/releases/components/app_edit_new_spec.js3
-rw-r--r--spec/frontend/releases/components/app_index_apollo_client_spec.js4
-rw-r--r--spec/frontend/releases/components/app_show_spec.js6
-rw-r--r--spec/frontend/releases/components/asset_links_form_spec.js4
-rw-r--r--spec/frontend/releases/components/evidence_block_spec.js4
-rw-r--r--spec/frontend/releases/components/release_block_assets_spec.js4
-rw-r--r--spec/frontend/releases/components/release_block_footer_spec.js4
-rw-r--r--spec/frontend/releases/components/release_block_header_spec.js4
-rw-r--r--spec/frontend/releases/components/release_block_milestone_info_spec.js4
-rw-r--r--spec/frontend/releases/components/release_block_spec.js4
-rw-r--r--spec/frontend/releases/stores/modules/detail/actions_spec.js6
-rw-r--r--spec/frontend/releases/stores/modules/detail/mutations_spec.js4
-rw-r--r--spec/frontend/releases/stores/modules/list/actions_spec.js6
-rw-r--r--spec/frontend/releases/stores/modules/list/mutations_spec.js8
-rw-r--r--spec/frontend/releases/util_spec.js14
-rw-r--r--spec/frontend/reports/codequality_report/components/codequality_issue_body_spec.js6
-rw-r--r--spec/frontend/reports/codequality_report/grouped_codequality_reports_app_spec.js10
-rw-r--r--spec/frontend/reports/codequality_report/store/getters_spec.js6
-rw-r--r--spec/frontend/reports/codequality_report/store/utils/codequality_parser_spec.js12
-rw-r--r--spec/frontend/reports/components/report_section_spec.js12
-rw-r--r--spec/frontend/reports/grouped_test_report/grouped_test_reports_app_spec.js18
-rw-r--r--spec/frontend/repository/commits_service_spec.js84
-rw-r--r--spec/frontend/repository/components/blob_content_viewer_spec.js109
-rw-r--r--spec/frontend/repository/components/blob_edit_spec.js6
-rw-r--r--spec/frontend/repository/components/blob_viewers/video_viewer_spec.js22
-rw-r--r--spec/frontend/repository/components/breadcrumbs_spec.js38
-rw-r--r--spec/frontend/repository/components/fork_suggestion_spec.js44
-rw-r--r--spec/frontend/repository/components/new_directory_modal_spec.js203
-rw-r--r--spec/frontend/repository/components/table/__snapshots__/row_spec.js.snap75
-rw-r--r--spec/frontend/repository/components/table/index_spec.js33
-rw-r--r--spec/frontend/repository/components/table/row_spec.js34
-rw-r--r--spec/frontend/repository/components/tree_content_spec.js22
-rw-r--r--spec/frontend/repository/router_spec.js28
-rw-r--r--spec/frontend/runner/admin_runners/admin_runners_app_spec.js22
-rw-r--r--spec/frontend/runner/components/cells/runner_actions_cell_spec.js14
-rw-r--r--spec/frontend/runner/components/cells/runner_name_cell_spec.js42
-rw-r--r--spec/frontend/runner/components/cells/runner_summary_cell_spec.js51
-rw-r--r--spec/frontend/runner/components/runner_list_spec.js17
-rw-r--r--spec/frontend/runner/components/runner_state_locked_badge_spec.js45
-rw-r--r--spec/frontend/runner/components/runner_state_paused_badge_spec.js45
-rw-r--r--spec/frontend/runner/components/runner_type_badge_spec.js23
-rw-r--r--spec/frontend/runner/components/runner_type_help_spec.js32
-rw-r--r--spec/frontend/runner/group_runners/group_runners_app_spec.js28
-rw-r--r--spec/frontend/runner/mock_data.js22
-rw-r--r--spec/frontend/search_settings/components/search_settings_spec.js35
-rw-r--r--spec/frontend/sidebar/assignees_spec.js8
-rw-r--r--spec/frontend/sidebar/components/reviewers/uncollapsed_reviewer_list_spec.js20
-rw-r--r--spec/frontend/sidebar/sidebar_labels_spec.js4
-rw-r--r--spec/frontend/sidebar/todo_spec.js2
-rw-r--r--spec/frontend/snippets/components/show_spec.js18
-rw-r--r--spec/frontend/snippets/components/snippet_header_spec.js41
-rw-r--r--spec/frontend/test_setup.js3
-rw-r--r--spec/frontend/tracking/get_standard_context_spec.js29
-rw-r--r--spec/frontend/tracking/tracking_initialization_spec.js140
-rw-r--r--spec/frontend/tracking/tracking_spec.js597
-rw-r--r--spec/frontend/tracking/utils_spec.js99
-rw-r--r--spec/frontend/tracking_spec.js693
-rw-r--r--spec/frontend/users_select/test_helper.js5
-rw-r--r--spec/frontend/vue_mr_widget/components/approvals/approvals_summary_spec.js8
-rw-r--r--spec/frontend/vue_mr_widget/components/extensions/actions_spec.js35
-rw-r--r--spec/frontend/vue_mr_widget/components/extensions/index_spec.js7
-rw-r--r--spec/frontend/vue_mr_widget/components/extensions/status_icon_spec.js36
-rw-r--r--spec/frontend/vue_mr_widget/components/mr_widget_pipeline_container_spec.js25
-rw-r--r--spec/frontend/vue_mr_widget/components/states/mr_widget_commits_header_spec.js4
-rw-r--r--spec/frontend/vue_mr_widget/components/states/mr_widget_ready_to_merge_spec.js10
-rw-r--r--spec/frontend/vue_mr_widget/components/states/mr_widget_wip_spec.js9
-rw-r--r--spec/frontend/vue_mr_widget/mock_data.js2
-rw-r--r--spec/frontend/vue_mr_widget/mr_widget_how_to_merge_modal_spec.js18
-rw-r--r--spec/frontend/vue_mr_widget/mr_widget_options_spec.js51
-rw-r--r--spec/frontend/vue_mr_widget/stores/mr_widget_store_spec.js2
-rw-r--r--spec/frontend/vue_mr_widget/test_extension.js37
-rw-r--r--spec/frontend/vue_shared/components/__snapshots__/clone_dropdown_spec.js.snap4
-rw-r--r--spec/frontend/vue_shared/components/__snapshots__/split_button_spec.js.snap2
-rw-r--r--spec/frontend/vue_shared/components/blob_viewers/simple_viewer_spec.js39
-rw-r--r--spec/frontend/vue_shared/components/color_picker/color_picker_spec.js6
-rw-r--r--spec/frontend/vue_shared/components/dismissible_feedback_alert_spec.js34
-rw-r--r--spec/frontend/vue_shared/components/dropdown_keyboard_navigation_spec.js141
-rw-r--r--spec/frontend/vue_shared/components/filtered_search_bar/mock_data.js57
-rw-r--r--spec/frontend/vue_shared/components/filtered_search_bar/tokens/author_token_spec.js2
-rw-r--r--spec/frontend/vue_shared/components/filtered_search_bar/tokens/base_token_spec.js52
-rw-r--r--spec/frontend/vue_shared/components/filtered_search_bar/tokens/branch_token_spec.js2
-rw-r--r--spec/frontend/vue_shared/components/filtered_search_bar/tokens/emoji_token_spec.js2
-rw-r--r--spec/frontend/vue_shared/components/filtered_search_bar/tokens/epic_token_spec.js97
-rw-r--r--spec/frontend/vue_shared/components/filtered_search_bar/tokens/iteration_token_spec.js2
-rw-r--r--spec/frontend/vue_shared/components/filtered_search_bar/tokens/label_token_spec.js2
-rw-r--r--spec/frontend/vue_shared/components/filtered_search_bar/tokens/milestone_token_spec.js2
-rw-r--r--spec/frontend/vue_shared/components/filtered_search_bar/tokens/weight_token_spec.js2
-rw-r--r--spec/frontend/vue_shared/components/issue/issue_assignees_spec.js4
-rw-r--r--spec/frontend/vue_shared/components/markdown/suggestion_diff_header_spec.js27
-rw-r--r--spec/frontend/vue_shared/components/markdown/suggestion_diff_spec.js2
-rw-r--r--spec/frontend/vue_shared/components/project_selector/project_list_item_spec.js3
-rw-r--r--spec/frontend/vue_shared/components/project_selector/project_selector_spec.js3
-rw-r--r--spec/frontend/vue_shared/components/sidebar/labels_select_vue/store/mutations_spec.js12
-rw-r--r--spec/frontend/vue_shared/components/sidebar/labels_select_widget/dropdown_contents_create_view_spec.js51
-rw-r--r--spec/frontend/vue_shared/components/sidebar/labels_select_widget/dropdown_contents_labels_view_spec.js58
-rw-r--r--spec/frontend/vue_shared/components/sidebar/labels_select_widget/dropdown_contents_spec.js144
-rw-r--r--spec/frontend/vue_shared/components/sidebar/labels_select_widget/labels_select_root_spec.js109
-rw-r--r--spec/frontend/vue_shared/components/sidebar/labels_select_widget/mock_data.js24
-rw-r--r--spec/frontend/vue_shared/components/upload_dropzone/__snapshots__/upload_dropzone_spec.js.snap11
-rw-r--r--spec/frontend/vue_shared/components/user_deletion_obstacles/user_deletion_obstacles_list_spec.js116
-rw-r--r--spec/frontend/vue_shared/components/user_deletion_obstacles/utils_spec.js43
-rw-r--r--spec/frontend/vue_shared/components/user_popover/user_popover_spec.js30
-rw-r--r--spec/frontend/vue_shared/components/web_ide_link_spec.js22
-rw-r--r--spec/frontend/vue_shared/directives/validation_spec.js137
-rw-r--r--spec/frontend/vue_shared/oncall_schedules_list_spec.js87
-rw-r--r--spec/frontend/vue_shared/security_reports/mock_data.js2
-rw-r--r--spec/frontend/vue_shared/security_reports/security_reports_app_spec.js12
-rw-r--r--spec/frontend/vue_shared/security_reports/store/getters_spec.js4
-rw-r--r--spec/frontend_integration/fixture_generators.yml5
-rw-r--r--spec/frontend_integration/test_helpers/mock_server/graphql.js4
-rw-r--r--spec/graphql/mutations/clusters/agent_tokens/create_spec.rb61
-rw-r--r--spec/graphql/mutations/clusters/agent_tokens/delete_spec.rb52
-rw-r--r--spec/graphql/mutations/clusters/agents/create_spec.rb50
-rw-r--r--spec/graphql/mutations/clusters/agents/delete_spec.rb51
-rw-r--r--spec/graphql/mutations/customer_relations/contacts/create_spec.rb101
-rw-r--r--spec/graphql/mutations/customer_relations/contacts/update_spec.rb75
-rw-r--r--spec/graphql/mutations/customer_relations/organizations/create_spec.rb11
-rw-r--r--spec/graphql/mutations/customer_relations/organizations/update_spec.rb23
-rw-r--r--spec/graphql/mutations/dependency_proxy/group_settings/update_spec.rb55
-rw-r--r--spec/graphql/mutations/groups/update_spec.rb4
-rw-r--r--spec/graphql/mutations/issues/create_spec.rb15
-rw-r--r--spec/graphql/resolvers/board_list_issues_resolver_spec.rb14
-rw-r--r--spec/graphql/resolvers/board_list_resolver_spec.rb39
-rw-r--r--spec/graphql/resolvers/clusters/agent_tokens_resolver_spec.rb32
-rw-r--r--spec/graphql/resolvers/clusters/agents_resolver_spec.rb77
-rw-r--r--spec/graphql/resolvers/issues_resolver_spec.rb133
-rw-r--r--spec/graphql/resolvers/kas/agent_configurations_resolver_spec.rb48
-rw-r--r--spec/graphql/resolvers/kas/agent_connections_resolver_spec.rb66
-rw-r--r--spec/graphql/resolvers/project_pipelines_resolver_spec.rb20
-rw-r--r--spec/graphql/types/base_field_spec.rb11
-rw-r--r--spec/graphql/types/board_list_type_spec.rb27
-rw-r--r--spec/graphql/types/ci/pipeline_type_spec.rb2
-rw-r--r--spec/graphql/types/ci/runner_type_spec.rb2
-rw-r--r--spec/graphql/types/clusters/agent_token_type_spec.rb13
-rw-r--r--spec/graphql/types/clusters/agent_type_spec.rb13
-rw-r--r--spec/graphql/types/container_expiration_policy_older_than_enum_spec.rb2
-rw-r--r--spec/graphql/types/error_tracking/sentry_detailed_error_type_spec.rb1
-rw-r--r--spec/graphql/types/issue_type_spec.rb2
-rw-r--r--spec/graphql/types/kas/agent_configuration_type_spec.rb11
-rw-r--r--spec/graphql/types/kas/agent_connection_type_spec.rb22
-rw-r--r--spec/graphql/types/kas/agent_metadata_type_spec.rb13
-rw-r--r--spec/graphql/types/packages/nuget/metadatum_type_spec.rb6
-rw-r--r--spec/graphql/types/packages/package_type_spec.rb2
-rw-r--r--spec/graphql/types/permission_types/ci/runner_spec.rb15
-rw-r--r--spec/graphql/types/project_type_spec.rb144
-rw-r--r--spec/graphql/types/query_type_spec.rb11
-rw-r--r--spec/helpers/application_settings_helper_spec.rb32
-rw-r--r--spec/helpers/avatars_helper_spec.rb14
-rw-r--r--spec/helpers/ci/runners_helper_spec.rb13
-rw-r--r--spec/helpers/container_expiration_policies_helper_spec.rb1
-rw-r--r--spec/helpers/feature_flags_helper_spec.rb23
-rw-r--r--spec/helpers/groups_helper_spec.rb2
-rw-r--r--spec/helpers/hooks_helper_spec.rb23
-rw-r--r--spec/helpers/issuables_helper_spec.rb12
-rw-r--r--spec/helpers/issues_helper_spec.rb4
-rw-r--r--spec/helpers/one_trust_helper_spec.rb48
-rw-r--r--spec/helpers/packages_helper_spec.rb30
-rw-r--r--spec/helpers/projects/cluster_agents_helper_spec.rb21
-rw-r--r--spec/helpers/projects_helper_spec.rb12
-rw-r--r--spec/helpers/routing/pseudonymization_helper_spec.rb30
-rw-r--r--spec/helpers/search_helper_spec.rb4
-rw-r--r--spec/helpers/startupjs_helper_spec.rb22
-rw-r--r--spec/helpers/tab_helper_spec.rb54
-rw-r--r--spec/helpers/time_zone_helper_spec.rb12
-rw-r--r--spec/helpers/user_callouts_helper_spec.rb33
-rw-r--r--spec/initializers/carrierwave_patch_spec.rb21
-rw-r--r--spec/initializers/database_config_spec.rb10
-rw-r--r--spec/initializers/lograge_spec.rb38
-rw-r--r--spec/initializers/zz_metrics_spec.rb20
-rw-r--r--spec/lib/api/base_spec.rb92
-rw-r--r--spec/lib/api/ci/helpers/runner_spec.rb16
-rw-r--r--spec/lib/api/entities/clusters/agent_authorization_spec.rb35
-rw-r--r--spec/lib/api/entities/user_spec.rb13
-rw-r--r--spec/lib/api/every_api_endpoint_spec.rb4
-rw-r--r--spec/lib/api/helpers_spec.rb12
-rw-r--r--spec/lib/api/validations/validators/project_portable_spec.rb33
-rw-r--r--spec/lib/atlassian/jira_connect/asymmetric_jwt_spec.rb99
-rw-r--r--spec/lib/atlassian/jira_connect/serializers/deployment_entity_spec.rb10
-rw-r--r--spec/lib/backup/gitaly_backup_spec.rb40
-rw-r--r--spec/lib/banzai/cross_project_reference_spec.rb2
-rw-r--r--spec/lib/banzai/filter/front_matter_filter_spec.rb10
-rw-r--r--spec/lib/banzai/filter/references/milestone_reference_filter_spec.rb13
-rw-r--r--spec/lib/banzai/filter/references/reference_cache_spec.rb39
-rw-r--r--spec/lib/banzai/filter/syntax_highlight_filter_spec.rb8
-rw-r--r--spec/lib/banzai/pipeline/full_pipeline_spec.rb8
-rw-r--r--spec/lib/banzai/pipeline/pre_process_pipeline_spec.rb2
-rw-r--r--spec/lib/bulk_imports/clients/graphql_spec.rb2
-rw-r--r--spec/lib/bulk_imports/clients/http_spec.rb34
-rw-r--r--spec/lib/bulk_imports/common/pipelines/boards_pipeline_spec.rb98
-rw-r--r--spec/lib/bulk_imports/common/pipelines/labels_pipeline_spec.rb78
-rw-r--r--spec/lib/bulk_imports/groups/pipelines/boards_pipeline_spec.rb49
-rw-r--r--spec/lib/bulk_imports/groups/pipelines/labels_pipeline_spec.rb78
-rw-r--r--spec/lib/bulk_imports/groups/stage_spec.rb18
-rw-r--r--spec/lib/bulk_imports/ndjson_pipeline_spec.rb16
-rw-r--r--spec/lib/bulk_imports/network_error_spec.rb72
-rw-r--r--spec/lib/bulk_imports/projects/graphql/get_repository_query_spec.rb21
-rw-r--r--spec/lib/bulk_imports/projects/pipelines/issues_pipeline_spec.rb168
-rw-r--r--spec/lib/bulk_imports/projects/pipelines/repository_pipeline_spec.rb73
-rw-r--r--spec/lib/bulk_imports/projects/stage_spec.rb16
-rw-r--r--spec/lib/container_registry/client_spec.rb94
-rw-r--r--spec/lib/container_registry/tag_spec.rb20
-rw-r--r--spec/lib/error_tracking/sentry_client/issue_spec.rb4
-rw-r--r--spec/lib/gitlab/analytics/cycle_analytics/stage_events/code_stage_start_spec.rb12
-rw-r--r--spec/lib/gitlab/analytics/cycle_analytics/stage_events/issue_created_spec.rb4
-rw-r--r--spec/lib/gitlab/analytics/cycle_analytics/stage_events/issue_deployed_to_production_spec.rb12
-rw-r--r--spec/lib/gitlab/analytics/cycle_analytics/stage_events/issue_first_mentioned_in_commit_spec.rb5
-rw-r--r--spec/lib/gitlab/analytics/cycle_analytics/stage_events/issue_stage_end_spec.rb5
-rw-r--r--spec/lib/gitlab/analytics/cycle_analytics/stage_events/merge_request_created_spec.rb4
-rw-r--r--spec/lib/gitlab/analytics/cycle_analytics/stage_events/merge_request_first_deployed_to_production_spec.rb5
-rw-r--r--spec/lib/gitlab/analytics/cycle_analytics/stage_events/merge_request_last_build_finished_spec.rb5
-rw-r--r--spec/lib/gitlab/analytics/cycle_analytics/stage_events/merge_request_last_build_started_spec.rb5
-rw-r--r--spec/lib/gitlab/analytics/cycle_analytics/stage_events/merge_request_merged_spec.rb5
-rw-r--r--spec/lib/gitlab/analytics/cycle_analytics/stage_events/plan_stage_start_spec.rb5
-rw-r--r--spec/lib/gitlab/application_rate_limiter_spec.rb10
-rw-r--r--spec/lib/gitlab/auth/request_authenticator_spec.rb109
-rw-r--r--spec/lib/gitlab/background_migration/fix_first_mentioned_in_commit_at_spec.rb140
-rw-r--r--spec/lib/gitlab/background_migration/fix_promoted_epics_discussion_ids_spec.rb2
-rw-r--r--spec/lib/gitlab/background_migration/fix_user_namespace_names_spec.rb2
-rw-r--r--spec/lib/gitlab/background_migration/fix_user_project_route_names_spec.rb2
-rw-r--r--spec/lib/gitlab/background_migration/migrate_null_private_profile_to_false_spec.rb23
-rw-r--r--spec/lib/gitlab/background_migration/migrate_pages_metadata_spec.rb2
-rw-r--r--spec/lib/gitlab/background_migration/populate_merge_request_assignees_table_spec.rb2
-rw-r--r--spec/lib/gitlab/background_migration/populate_topics_total_projects_count_cache_spec.rb35
-rw-r--r--spec/lib/gitlab/backtrace_cleaner_spec.rb3
-rw-r--r--spec/lib/gitlab/cache/import/caching_spec.rb10
-rw-r--r--spec/lib/gitlab/chat/command_spec.rb1
-rw-r--r--spec/lib/gitlab/checks/matching_merge_request_spec.rb41
-rw-r--r--spec/lib/gitlab/ci/build/auto_retry_spec.rb1
-rw-r--r--spec/lib/gitlab/ci/config/entry/retry_spec.rb1
-rw-r--r--spec/lib/gitlab/ci/config/external/mapper_spec.rb22
-rw-r--r--spec/lib/gitlab/ci/config/external/processor_spec.rb12
-rw-r--r--spec/lib/gitlab/ci/config/external/rules_spec.rb20
-rw-r--r--spec/lib/gitlab/ci/pipeline/seed/build_spec.rb31
-rw-r--r--spec/lib/gitlab/ci/reports/security/flag_spec.rb4
-rw-r--r--spec/lib/gitlab/ci/templates/templates_spec.rb7
-rw-r--r--spec/lib/gitlab/ci/trace/archive_spec.rb101
-rw-r--r--spec/lib/gitlab/ci/trace/metrics_spec.rb23
-rw-r--r--spec/lib/gitlab/ci/trace/remote_checksum_spec.rb85
-rw-r--r--spec/lib/gitlab/content_security_policy/config_loader_spec.rb27
-rw-r--r--spec/lib/gitlab/database/bulk_update_spec.rb53
-rw-r--r--spec/lib/gitlab/database/connection_spec.rb10
-rw-r--r--spec/lib/gitlab/database/consistency_spec.rb8
-rw-r--r--spec/lib/gitlab/database/count_spec.rb44
-rw-r--r--spec/lib/gitlab/database/load_balancing/action_cable_callbacks_spec.rb4
-rw-r--r--spec/lib/gitlab/database/load_balancing/active_record_proxy_spec.rb20
-rw-r--r--spec/lib/gitlab/database/load_balancing/configuration_spec.rb8
-rw-r--r--spec/lib/gitlab/database/load_balancing/host_spec.rb8
-rw-r--r--spec/lib/gitlab/database/load_balancing/load_balancer_spec.rb49
-rw-r--r--spec/lib/gitlab/database/load_balancing/primary_host_spec.rb52
-rw-r--r--spec/lib/gitlab/database/load_balancing/rack_middleware_spec.rb124
-rw-r--r--spec/lib/gitlab/database/load_balancing/setup_spec.rb119
-rw-r--r--spec/lib/gitlab/database/load_balancing/sidekiq_client_middleware_spec.rb30
-rw-r--r--spec/lib/gitlab/database/load_balancing/sidekiq_server_middleware_spec.rb87
-rw-r--r--spec/lib/gitlab/database/load_balancing/sticking_spec.rb321
-rw-r--r--spec/lib/gitlab/database/load_balancing_spec.rb205
-rw-r--r--spec/lib/gitlab/database/migration_helpers/loose_foreign_key_helpers_spec.rb9
-rw-r--r--spec/lib/gitlab/database/migration_helpers_spec.rb9
-rw-r--r--spec/lib/gitlab/database/migrations/instrumentation_spec.rb19
-rw-r--r--spec/lib/gitlab/database/migrations/observers/query_details_spec.rb6
-rw-r--r--spec/lib/gitlab/database/migrations/observers/query_log_spec.rb6
-rw-r--r--spec/lib/gitlab/database/migrations/observers/query_statistics_spec.rb2
-rw-r--r--spec/lib/gitlab/database/migrations/observers/total_database_size_change_spec.rb2
-rw-r--r--spec/lib/gitlab/database/migrations/runner_spec.rb109
-rw-r--r--spec/lib/gitlab/database/partitioning/detached_partition_dropper_spec.rb5
-rw-r--r--spec/lib/gitlab/database/partitioning/multi_database_partition_dropper_spec.rb38
-rw-r--r--spec/lib/gitlab/database/partitioning/partition_manager_spec.rb2
-rw-r--r--spec/lib/gitlab/database/partitioning_spec.rb18
-rw-r--r--spec/lib/gitlab/database/postgresql_adapter/force_disconnectable_mixin_spec.rb2
-rw-r--r--spec/lib/gitlab/database/schema_migrations/context_spec.rb18
-rw-r--r--spec/lib/gitlab/database/with_lock_retries_spec.rb2
-rw-r--r--spec/lib/gitlab/database_spec.rb34
-rw-r--r--spec/lib/gitlab/doctor/secrets_spec.rb10
-rw-r--r--spec/lib/gitlab/email/handler/create_issue_handler_spec.rb30
-rw-r--r--spec/lib/gitlab/email/handler/service_desk_handler_spec.rb9
-rw-r--r--spec/lib/gitlab/email/hook/smime_signature_interceptor_spec.rb8
-rw-r--r--spec/lib/gitlab/email/smime/certificate_spec.rb116
-rw-r--r--spec/lib/gitlab/endpoint_attributes_spec.rb133
-rw-r--r--spec/lib/gitlab/etag_caching/router/graphql_spec.rb2
-rw-r--r--spec/lib/gitlab/etag_caching/router/restful_spec.rb2
-rw-r--r--spec/lib/gitlab/feature_categories_spec.rb74
-rw-r--r--spec/lib/gitlab/form_builders/gitlab_ui_form_builder_spec.rb63
-rw-r--r--spec/lib/gitlab/git/repository_spec.rb3
-rw-r--r--spec/lib/gitlab/git/wraps_gitaly_errors_spec.rb1
-rw-r--r--spec/lib/gitlab/gitaly_client/operation_service_spec.rb54
-rw-r--r--spec/lib/gitlab/github_import/importer/diff_notes_importer_spec.rb12
-rw-r--r--spec/lib/gitlab/github_import/parallel_importer_spec.rb12
-rw-r--r--spec/lib/gitlab/github_import/parallel_scheduling_spec.rb6
-rw-r--r--spec/lib/gitlab/github_import/representation/diff_note_spec.rb137
-rw-r--r--spec/lib/gitlab/github_import/representation/diff_notes/suggestion_formatter_spec.rb164
-rw-r--r--spec/lib/gitlab/github_import/representation/issue_spec.rb13
-rw-r--r--spec/lib/gitlab/github_import/representation/lfs_object_spec.rb17
-rw-r--r--spec/lib/gitlab/github_import/representation/note_spec.rb22
-rw-r--r--spec/lib/gitlab/github_import/representation/pull_request_review_spec.rb17
-rw-r--r--spec/lib/gitlab/github_import/representation/pull_request_spec.rb12
-rw-r--r--spec/lib/gitlab/github_import/sequential_importer_spec.rb31
-rw-r--r--spec/lib/gitlab/health_checks/probes/collection_spec.rb3
-rw-r--r--spec/lib/gitlab/health_checks/redis/rate_limiting_check_spec.rb8
-rw-r--r--spec/lib/gitlab/health_checks/redis/sessions_check_spec.rb8
-rw-r--r--spec/lib/gitlab/import/import_failure_service_spec.rb244
-rw-r--r--spec/lib/gitlab/import/metrics_spec.rb108
-rw-r--r--spec/lib/gitlab/import_export/all_models.yml8
-rw-r--r--spec/lib/gitlab/import_export/attributes_permitter_spec.rb52
-rw-r--r--spec/lib/gitlab/import_export/command_line_util_spec.rb34
-rw-r--r--spec/lib/gitlab/import_export/json/streaming_serializer_spec.rb19
-rw-r--r--spec/lib/gitlab/import_export/merge_request_parser_spec.rb36
-rw-r--r--spec/lib/gitlab/import_export/relation_tree_restorer_spec.rb40
-rw-r--r--spec/lib/gitlab/import_export/snippet_repo_restorer_spec.rb3
-rw-r--r--spec/lib/gitlab/instrumentation/redis_spec.rb4
-rw-r--r--spec/lib/gitlab/instrumentation_helper_spec.rb105
-rw-r--r--spec/lib/gitlab/kas_spec.rb42
-rw-r--r--spec/lib/gitlab/mail_room/mail_room_spec.rb3
-rw-r--r--spec/lib/gitlab/merge_requests/mergeability/check_result_spec.rb140
-rw-r--r--spec/lib/gitlab/merge_requests/mergeability/redis_interface_spec.rb29
-rw-r--r--spec/lib/gitlab/merge_requests/mergeability/results_store_spec.rb29
-rw-r--r--spec/lib/gitlab/metrics/exporter/web_exporter_spec.rb9
-rw-r--r--spec/lib/gitlab/metrics/instrumentation_spec.rb342
-rw-r--r--spec/lib/gitlab/metrics/rails_slis_spec.rb58
-rw-r--r--spec/lib/gitlab/metrics/requests_rack_middleware_spec.rb187
-rw-r--r--spec/lib/gitlab/metrics/sli_spec.rb99
-rw-r--r--spec/lib/gitlab/metrics/subscribers/active_record_spec.rb8
-rw-r--r--spec/lib/gitlab/metrics/subscribers/load_balancing_spec.rb4
-rw-r--r--spec/lib/gitlab/metrics/web_transaction_spec.rb15
-rw-r--r--spec/lib/gitlab/middleware/go_spec.rb2
-rw-r--r--spec/lib/gitlab/middleware/multipart/handler_spec.rb1
-rw-r--r--spec/lib/gitlab/middleware/speedscope_spec.rb52
-rw-r--r--spec/lib/gitlab/pagination/keyset/in_operator_optimization/query_builder_spec.rb28
-rw-r--r--spec/lib/gitlab/pagination/keyset/in_operator_optimization/strategies/order_values_loader_strategy_spec.rb34
-rw-r--r--spec/lib/gitlab/pagination/keyset/in_operator_optimization/strategies/record_loader_strategy_spec.rb60
-rw-r--r--spec/lib/gitlab/pagination/keyset/iterator_spec.rb34
-rw-r--r--spec/lib/gitlab/path_regex_spec.rb21
-rw-r--r--spec/lib/gitlab/performance_bar/stats_spec.rb16
-rw-r--r--spec/lib/gitlab/project_authorizations_spec.rb37
-rw-r--r--spec/lib/gitlab/rack_attack/request_spec.rb31
-rw-r--r--spec/lib/gitlab/rate_limit_helpers_spec.rb2
-rw-r--r--spec/lib/gitlab/redis/queues_spec.rb20
-rw-r--r--spec/lib/gitlab/redis/rate_limiting_spec.rb7
-rw-r--r--spec/lib/gitlab/redis/sessions_spec.rb7
-rw-r--r--spec/lib/gitlab/redis/trace_chunks_spec.rb50
-rw-r--r--spec/lib/gitlab/regex_spec.rb28
-rw-r--r--spec/lib/gitlab/request_endpoints_spec.rb24
-rw-r--r--spec/lib/gitlab/sidekiq_logging/structured_logger_spec.rb135
-rw-r--r--spec/lib/gitlab/sidekiq_middleware/client_metrics_spec.rb21
-rw-r--r--spec/lib/gitlab/sidekiq_middleware/duplicate_jobs/duplicate_job_spec.rb20
-rw-r--r--spec/lib/gitlab/sidekiq_middleware/memory_killer_spec.rb2
-rw-r--r--spec/lib/gitlab/sidekiq_middleware/server_metrics_spec.rb114
-rw-r--r--spec/lib/gitlab/sidekiq_middleware/worker_context/client_spec.rb61
-rw-r--r--spec/lib/gitlab/sidekiq_middleware/worker_context/server_spec.rb35
-rw-r--r--spec/lib/gitlab/sidekiq_middleware_spec.rb93
-rw-r--r--spec/lib/gitlab/sidekiq_migrate_jobs_spec.rb13
-rw-r--r--spec/lib/gitlab/sidekiq_versioning/manager_spec.rb25
-rw-r--r--spec/lib/gitlab/sidekiq_versioning_spec.rb6
-rw-r--r--spec/lib/gitlab/slash_commands/issue_move_spec.rb2
-rw-r--r--spec/lib/gitlab/subscription_portal_spec.rb93
-rw-r--r--spec/lib/gitlab/tracking/docs/helper_spec.rb91
-rw-r--r--spec/lib/gitlab/tracking/docs/renderer_spec.rb23
-rw-r--r--spec/lib/gitlab/tracking/standard_context_spec.rb19
-rw-r--r--spec/lib/gitlab/tracking_spec.rb2
-rw-r--r--spec/lib/gitlab/usage/metric_definition_spec.rb31
-rw-r--r--spec/lib/gitlab/usage/metrics/instrumentations/active_user_count_metric_spec.rb13
-rw-r--r--spec/lib/gitlab/usage/metrics/instrumentations/count_users_associating_milestones_to_releases_metric_spec.rb12
-rw-r--r--spec/lib/gitlab/usage_data_counters/ci_template_unique_counter_spec.rb115
-rw-r--r--spec/lib/gitlab/usage_data_counters/hll_redis_counter_spec.rb1
-rw-r--r--spec/lib/gitlab/usage_data_metrics_spec.rb2
-rw-r--r--spec/lib/gitlab/usage_data_spec.rb105
-rw-r--r--spec/lib/gitlab/utils/delegator_override/error_spec.rb13
-rw-r--r--spec/lib/gitlab/utils/delegator_override/validator_spec.rb81
-rw-r--r--spec/lib/gitlab/utils/delegator_override_spec.rb97
-rw-r--r--spec/lib/gitlab/view/presenter/base_spec.rb34
-rw-r--r--spec/lib/gitlab/with_feature_category_spec.rb69
-rw-r--r--spec/lib/gitlab/workhorse_spec.rb44
-rw-r--r--spec/lib/gitlab/x509/certificate_spec.rb116
-rw-r--r--spec/lib/peek/views/active_record_spec.rb202
-rw-r--r--spec/lib/rouge/formatters/html_gitlab_spec.rb2
-rw-r--r--spec/lib/sidebars/groups/menus/scope_menu_spec.rb15
-rw-r--r--spec/lib/sidebars/projects/menus/scope_menu_spec.rb6
-rw-r--r--spec/migrations/20190924152703_migrate_issue_trackers_data_spec.rb64
-rw-r--r--spec/migrations/20191015154408_drop_merge_requests_require_code_owner_approval_from_projects_spec.rb56
-rw-r--r--spec/migrations/20191125114345_add_admin_mode_protected_path_spec.rb49
-rw-r--r--spec/migrations/20191204114127_delete_legacy_triggers_spec.rb23
-rw-r--r--spec/migrations/20210906130643_drop_temporary_columns_and_triggers_for_taggings_spec.rb23
-rw-r--r--spec/migrations/20210907013944_cleanup_bigint_conversion_for_ci_builds_metadata_spec.rb23
-rw-r--r--spec/migrations/20210910194952_update_report_type_for_existing_approval_project_rules_spec.rb48
-rw-r--r--spec/migrations/20210915022415_cleanup_bigint_conversion_for_ci_builds_spec.rb23
-rw-r--r--spec/migrations/20210918201050_remove_old_pending_jobs_for_recalculate_vulnerabilities_occurrences_uuid_spec.rb45
-rw-r--r--spec/migrations/20210918202855_reschedule_pending_jobs_for_recalculate_vulnerabilities_occurrences_uuid_spec.rb30
-rw-r--r--spec/migrations/20210922021816_drop_int4_columns_for_ci_job_artifacts_spec.rb23
-rw-r--r--spec/migrations/20210922025631_drop_int4_column_for_ci_sources_pipelines_spec.rb21
-rw-r--r--spec/migrations/20210922082019_drop_int4_column_for_events_spec.rb21
-rw-r--r--spec/migrations/20210922091402_drop_int4_column_for_push_event_payloads_spec.rb21
-rw-r--r--spec/migrations/20211006060436_schedule_populate_topics_total_projects_count_cache_spec.rb29
-rw-r--r--spec/migrations/add_default_and_free_plans_spec.rb34
-rw-r--r--spec/migrations/add_unique_constraint_to_approvals_user_id_and_merge_request_id_spec.rb57
-rw-r--r--spec/migrations/backfill_and_add_not_null_constraint_to_released_at_column_on_releases_table_spec.rb28
-rw-r--r--spec/migrations/backfill_operations_feature_flags_active_spec.rb52
-rw-r--r--spec/migrations/backfill_releases_table_updated_at_and_add_not_null_constraints_to_timestamps_spec.rb57
-rw-r--r--spec/migrations/backport_enterprise_schema_spec.rb41
-rw-r--r--spec/migrations/change_outbound_local_requests_whitelist_default_spec.rb21
-rw-r--r--spec/migrations/change_packages_size_defaults_in_project_statistics_spec.rb35
-rw-r--r--spec/migrations/clean_up_noteable_id_for_notes_on_commits_spec.rb34
-rw-r--r--spec/migrations/cleanup_legacy_artifact_migration_spec.rb52
-rw-r--r--spec/migrations/drop_project_ci_cd_settings_merge_trains_enabled_spec.rb21
-rw-r--r--spec/migrations/encrypt_feature_flags_clients_tokens_spec.rb36
-rw-r--r--spec/migrations/encrypt_plaintext_attributes_on_application_settings_spec.rb58
-rw-r--r--spec/migrations/enqueue_reset_merge_status_second_run_spec.rb52
-rw-r--r--spec/migrations/enqueue_reset_merge_status_spec.rb52
-rw-r--r--spec/migrations/fill_productivity_analytics_start_date_spec.rb39
-rw-r--r--spec/migrations/fix_max_pages_size_spec.rb19
-rw-r--r--spec/migrations/fix_null_type_labels_spec.rb36
-rw-r--r--spec/migrations/fix_pool_repository_source_project_id_spec.rb29
-rw-r--r--spec/migrations/fix_wrong_pages_access_level_spec.rb99
-rw-r--r--spec/migrations/generate_lets_encrypt_private_key_spec.rb14
-rw-r--r--spec/migrations/insert_project_hooks_plan_limits_spec.rb67
-rw-r--r--spec/migrations/migrate_auto_dev_ops_domain_to_cluster_domain_spec.rb114
-rw-r--r--spec/migrations/migrate_code_owner_approval_status_to_protected_branches_in_batches_spec.rb63
-rw-r--r--spec/migrations/migrate_discussion_id_on_promoted_epics_spec.rb81
-rw-r--r--spec/migrations/migrate_k8s_service_integration_spec.rb162
-rw-r--r--spec/migrations/migrate_legacy_managed_clusters_to_unmanaged_spec.rb55
-rw-r--r--spec/migrations/migrate_managed_clusters_with_no_token_to_unmanaged_spec.rb59
-rw-r--r--spec/migrations/migrate_ops_feature_flags_scopes_target_user_ids_spec.rb135
-rw-r--r--spec/migrations/migrate_storage_migrator_sidekiq_queue_spec.rb43
-rw-r--r--spec/migrations/move_limits_from_plans_spec.rb35
-rw-r--r--spec/migrations/nullify_users_role_spec.rb33
-rw-r--r--spec/migrations/populate_project_statistics_packages_size_spec.rb37
-rw-r--r--spec/migrations/populate_rule_type_on_approval_merge_request_rules_spec.rb39
-rw-r--r--spec/migrations/recreate_index_security_ci_builds_on_name_and_id_parser_features_spec.rb28
-rw-r--r--spec/migrations/remove_empty_github_service_templates_spec.rb55
-rw-r--r--spec/migrations/remove_schedule_and_status_from_pending_alert_escalations_spec.rb37
-rw-r--r--spec/migrations/schedule_fill_valid_time_for_pages_domain_certificates_spec.rb48
-rw-r--r--spec/migrations/schedule_pages_metadata_migration_spec.rb29
-rw-r--r--spec/migrations/schedule_populate_merge_request_assignees_table_spec.rb47
-rw-r--r--spec/migrations/schedule_populate_status_column_of_security_scans_spec.rb48
-rw-r--r--spec/migrations/schedule_sync_issuables_state_id_spec.rb81
-rw-r--r--spec/migrations/schedule_sync_issuables_state_id_where_nil_spec.rb57
-rw-r--r--spec/migrations/set_issue_id_for_all_versions_spec.rb38
-rw-r--r--spec/migrations/sync_issuables_state_id_spec.rb41
-rw-r--r--spec/migrations/truncate_user_fullname_spec.rb23
-rw-r--r--spec/migrations/update_minimum_password_length_spec.rb30
-rw-r--r--spec/models/analytics/cycle_analytics/issue_stage_event_spec.rb2
-rw-r--r--spec/models/analytics/cycle_analytics/merge_request_stage_event_spec.rb2
-rw-r--r--spec/models/application_record_spec.rb2
-rw-r--r--spec/models/application_setting_spec.rb7
-rw-r--r--spec/models/bulk_import_spec.rb14
-rw-r--r--spec/models/bulk_imports/entity_spec.rb40
-rw-r--r--spec/models/bulk_imports/file_transfer/group_config_spec.rb6
-rw-r--r--spec/models/bulk_imports/file_transfer/project_config_spec.rb48
-rw-r--r--spec/models/bulk_imports/tracker_spec.rb3
-rw-r--r--spec/models/ci/bridge_spec.rb6
-rw-r--r--spec/models/ci/build_spec.rb46
-rw-r--r--spec/models/ci/build_trace_metadata_spec.rb29
-rw-r--r--spec/models/ci/pipeline_spec.rb155
-rw-r--r--spec/models/ci/processable_spec.rb9
-rw-r--r--spec/models/ci/resource_group_spec.rb57
-rw-r--r--spec/models/ci/runner_spec.rb23
-rw-r--r--spec/models/clusters/agents/group_authorization_spec.rb6
-rw-r--r--spec/models/clusters/agents/implicit_authorization_spec.rb2
-rw-r--r--spec/models/clusters/agents/project_authorization_spec.rb6
-rw-r--r--spec/models/clusters/applications/runner_spec.rb3
-rw-r--r--spec/models/commit_spec.rb18
-rw-r--r--spec/models/commit_status_spec.rb10
-rw-r--r--spec/models/concerns/bulk_insert_safe_spec.rb42
-rw-r--r--spec/models/concerns/checksummable_spec.rb12
-rw-r--r--spec/models/concerns/ci/has_status_spec.rb12
-rw-r--r--spec/models/concerns/vulnerability_finding_helpers_spec.rb27
-rw-r--r--spec/models/customer_relations/contact_spec.rb1
-rw-r--r--spec/models/dependency_proxy/blob_spec.rb5
-rw-r--r--spec/models/dependency_proxy/image_ttl_group_policy_spec.rb9
-rw-r--r--spec/models/dependency_proxy/manifest_spec.rb5
-rw-r--r--spec/models/deployment_spec.rb167
-rw-r--r--spec/models/environment_spec.rb66
-rw-r--r--spec/models/error_tracking/error_spec.rb9
-rw-r--r--spec/models/error_tracking/project_error_tracking_setting_spec.rb46
-rw-r--r--spec/models/group_spec.rb31
-rw-r--r--spec/models/instance_configuration_spec.rb21
-rw-r--r--spec/models/integration_spec.rb1
-rw-r--r--spec/models/integrations/open_project_spec.rb30
-rw-r--r--spec/models/integrations/open_project_tracker_data_spec.rb19
-rw-r--r--spec/models/issue_spec.rb31
-rw-r--r--spec/models/loose_foreign_keys/deleted_record_spec.rb56
-rw-r--r--spec/models/member_spec.rb83
-rw-r--r--spec/models/members/project_member_spec.rb11
-rw-r--r--spec/models/merge_request_spec.rb81
-rw-r--r--spec/models/namespace/traversal_hierarchy_spec.rb9
-rw-r--r--spec/models/namespace_setting_spec.rb2
-rw-r--r--spec/models/namespace_spec.rb183
-rw-r--r--spec/models/namespaces/user_namespace_spec.rb12
-rw-r--r--spec/models/note_spec.rb28
-rw-r--r--spec/models/operations/feature_flag_spec.rb47
-rw-r--r--spec/models/packages/helm/file_metadatum_spec.rb4
-rw-r--r--spec/models/packages/package_spec.rb2
-rw-r--r--spec/models/pages_domain_spec.rb19
-rw-r--r--spec/models/preloaders/merge_requests_preloader_spec.rb42
-rw-r--r--spec/models/product_analytics_event_spec.rb11
-rw-r--r--spec/models/project_feature_usage_spec.rb4
-rw-r--r--spec/models/project_spec.rb69
-rw-r--r--spec/models/project_statistics_spec.rb4
-rw-r--r--spec/models/projects/topic_spec.rb79
-rw-r--r--spec/models/protected_branch_spec.rb11
-rw-r--r--spec/models/repository_spec.rb2
-rw-r--r--spec/models/snippet_repository_spec.rb1
-rw-r--r--spec/models/upload_spec.rb24
-rw-r--r--spec/models/user_detail_spec.rb1
-rw-r--r--spec/models/user_preference_spec.rb6
-rw-r--r--spec/models/user_spec.rb257
-rw-r--r--spec/models/users/credit_card_validation_spec.rb18
-rw-r--r--spec/policies/clusters/agent_policy_spec.rb28
-rw-r--r--spec/policies/clusters/agent_token_policy_spec.rb31
-rw-r--r--spec/policies/group_policy_spec.rb2
-rw-r--r--spec/policies/namespace_policy_spec.rb77
-rw-r--r--spec/policies/namespaces/project_namespace_policy_spec.rb46
-rw-r--r--spec/policies/namespaces/user_namespace_policy_spec.rb77
-rw-r--r--spec/presenters/clusters/cluster_presenter_spec.rb143
-rw-r--r--spec/presenters/commit_status_presenter_spec.rb19
-rw-r--r--spec/presenters/group_clusterable_presenter_spec.rb6
-rw-r--r--spec/presenters/instance_clusterable_presenter_spec.rb6
-rw-r--r--spec/presenters/project_clusterable_presenter_spec.rb6
-rw-r--r--spec/requests/api/api_spec.rb112
-rw-r--r--spec/requests/api/bulk_imports_spec.rb9
-rw-r--r--spec/requests/api/ci/resource_groups_spec.rb95
-rw-r--r--spec/requests/api/ci/runner/jobs_request_post_spec.rb6
-rw-r--r--spec/requests/api/ci/runner/runners_delete_spec.rb2
-rw-r--r--spec/requests/api/ci/runner/runners_post_spec.rb6
-rw-r--r--spec/requests/api/ci/runner/runners_verify_post_spec.rb2
-rw-r--r--spec/requests/api/ci/runners_reset_registration_token_spec.rb2
-rw-r--r--spec/requests/api/ci/runners_spec.rb98
-rw-r--r--spec/requests/api/ci/triggers_spec.rb6
-rw-r--r--spec/requests/api/container_repositories_spec.rb26
-rw-r--r--spec/requests/api/deployments_spec.rb10
-rw-r--r--spec/requests/api/environments_spec.rb7
-rw-r--r--spec/requests/api/error_tracking/client_keys_spec.rb86
-rw-r--r--spec/requests/api/error_tracking/collector_spec.rb148
-rw-r--r--spec/requests/api/error_tracking/project_settings_spec.rb231
-rw-r--r--spec/requests/api/error_tracking_client_keys_spec.rb86
-rw-r--r--spec/requests/api/error_tracking_collector_spec.rb148
-rw-r--r--spec/requests/api/error_tracking_spec.rb231
-rw-r--r--spec/requests/api/graphql/boards/board_list_issues_query_spec.rb16
-rw-r--r--spec/requests/api/graphql/boards/board_list_query_spec.rb98
-rw-r--r--spec/requests/api/graphql/boards/board_lists_query_spec.rb6
-rw-r--r--spec/requests/api/graphql/ci/runner_spec.rb88
-rw-r--r--spec/requests/api/graphql/ci/runners_spec.rb12
-rw-r--r--spec/requests/api/graphql/container_repository/container_repository_details_spec.rb2
-rw-r--r--spec/requests/api/graphql/group/container_repositories_spec.rb9
-rw-r--r--spec/requests/api/graphql/group/dependency_proxy_group_setting_spec.rb71
-rw-r--r--spec/requests/api/graphql/group/issues_spec.rb123
-rw-r--r--spec/requests/api/graphql/mutations/ci/runners_registration_token/reset_spec.rb2
-rw-r--r--spec/requests/api/graphql/mutations/clusters/agent_tokens/agent_tokens/create_spec.rb52
-rw-r--r--spec/requests/api/graphql/mutations/clusters/agents/create_spec.rb42
-rw-r--r--spec/requests/api/graphql/mutations/clusters/agents/delete_spec.rb43
-rw-r--r--spec/requests/api/graphql/mutations/dependency_proxy/group_settings/update_spec.rb65
-rw-r--r--spec/requests/api/graphql/mutations/merge_requests/set_assignees_spec.rb2
-rw-r--r--spec/requests/api/graphql/namespace/projects_spec.rb8
-rw-r--r--spec/requests/api/graphql/project/cluster_agents_spec.rb108
-rw-r--r--spec/requests/api/graphql/project/container_repositories_spec.rb13
-rw-r--r--spec/requests/api/graphql/project/issues_spec.rb125
-rw-r--r--spec/requests/api/graphql/project/merge_request/pipelines_spec.rb4
-rw-r--r--spec/requests/api/graphql/project/merge_requests_spec.rb8
-rw-r--r--spec/requests/api/graphql/project/releases_spec.rb24
-rw-r--r--spec/requests/api/graphql/users_spec.rb12
-rw-r--r--spec/requests/api/group_container_repositories_spec.rb7
-rw-r--r--spec/requests/api/groups_spec.rb38
-rw-r--r--spec/requests/api/helm_packages_spec.rb18
-rw-r--r--spec/requests/api/integrations_spec.rb363
-rw-r--r--spec/requests/api/internal/base_spec.rb8
-rw-r--r--spec/requests/api/internal/kubernetes_spec.rb90
-rw-r--r--spec/requests/api/issues/issues_spec.rb38
-rw-r--r--spec/requests/api/issues/post_projects_issues_spec.rb157
-rw-r--r--spec/requests/api/maven_packages_spec.rb24
-rw-r--r--spec/requests/api/merge_requests_spec.rb12
-rw-r--r--spec/requests/api/package_files_spec.rb2
-rw-r--r--spec/requests/api/project_container_repositories_spec.rb5
-rw-r--r--spec/requests/api/project_export_spec.rb139
-rw-r--r--spec/requests/api/projects_spec.rb25
-rw-r--r--spec/requests/api/repositories_spec.rb12
-rw-r--r--spec/requests/api/services_spec.rb361
-rw-r--r--spec/requests/api/settings_spec.rb5
-rw-r--r--spec/requests/api/users_spec.rb27
-rw-r--r--spec/requests/groups/registry/repositories_controller_spec.rb1
-rw-r--r--spec/requests/import/url_controller_spec.rb45
-rw-r--r--spec/requests/projects/cluster_agents_controller_spec.rb40
-rw-r--r--spec/requests/projects/google_cloud_controller_spec.rb50
-rw-r--r--spec/requests/projects/merge_requests_discussions_spec.rb12
-rw-r--r--spec/requests/rack_attack_global_spec.rb274
-rw-r--r--spec/routing/admin/serverless/domains_controller_routing_spec.rb22
-rw-r--r--spec/serializers/member_entity_spec.rb26
-rw-r--r--spec/serializers/merge_request_metrics_helper_spec.rb69
-rw-r--r--spec/serializers/merge_request_poll_cached_widget_entity_spec.rb2
-rw-r--r--spec/serializers/merge_request_widget_entity_spec.rb64
-rw-r--r--spec/services/application_settings/update_service_spec.rb26
-rw-r--r--spec/services/boards/issues/list_service_spec.rb21
-rw-r--r--spec/services/bulk_import_service_spec.rb69
-rw-r--r--spec/services/bulk_imports/create_service_spec.rb86
-rw-r--r--spec/services/bulk_imports/file_export_service_spec.rb37
-rw-r--r--spec/services/bulk_imports/get_importable_data_service_spec.rb46
-rw-r--r--spec/services/bulk_imports/relation_export_service_spec.rb18
-rw-r--r--spec/services/bulk_imports/tree_export_service_spec.rb35
-rw-r--r--spec/services/ci/archive_trace_service_spec.rb26
-rw-r--r--spec/services/ci/create_pipeline_service/include_spec.rb22
-rw-r--r--spec/services/ci/drop_pipeline_service_spec.rb3
-rw-r--r--spec/services/ci/pipelines/add_job_service_spec.rb13
-rw-r--r--spec/services/ci/pipelines/hook_service_spec.rb47
-rw-r--r--spec/services/ci/play_bridge_service_spec.rb12
-rw-r--r--spec/services/ci/process_pipeline_service_spec.rb68
-rw-r--r--spec/services/ci/register_job_service_spec.rb50
-rw-r--r--spec/services/ci/resource_groups/assign_resource_from_resource_group_service_spec.rb86
-rw-r--r--spec/services/ci/retry_build_service_spec.rb13
-rw-r--r--spec/services/ci/retry_pipeline_service_spec.rb39
-rw-r--r--spec/services/ci/stuck_builds/drop_pending_service_spec.rb201
-rw-r--r--spec/services/ci/stuck_builds/drop_running_service_spec.rb72
-rw-r--r--spec/services/ci/stuck_builds/drop_scheduled_service_spec.rb53
-rw-r--r--spec/services/ci/stuck_builds/drop_service_spec.rb284
-rw-r--r--spec/services/ci/update_build_state_service_spec.rb52
-rw-r--r--spec/services/ci/update_pending_build_service_spec.rb44
-rw-r--r--spec/services/clusters/agent_tokens/create_service_spec.rb64
-rw-r--r--spec/services/clusters/agents/create_service_spec.rb52
-rw-r--r--spec/services/clusters/agents/delete_service_spec.rb35
-rw-r--r--spec/services/concerns/rate_limited_service_spec.rb196
-rw-r--r--spec/services/container_expiration_policies/cleanup_service_spec.rb6
-rw-r--r--spec/services/customer_relations/contacts/create_service_spec.rb61
-rw-r--r--spec/services/customer_relations/contacts/update_service_spec.rb56
-rw-r--r--spec/services/customer_relations/organizations/create_service_spec.rb10
-rw-r--r--spec/services/customer_relations/organizations/update_service_spec.rb4
-rw-r--r--spec/services/dependency_proxy/auth_token_service_spec.rb75
-rw-r--r--spec/services/dependency_proxy/find_or_create_blob_service_spec.rb28
-rw-r--r--spec/services/dependency_proxy/find_or_create_manifest_service_spec.rb32
-rw-r--r--spec/services/dependency_proxy/group_settings/update_service_spec.rb60
-rw-r--r--spec/services/deployments/older_deployments_drop_service_spec.rb2
-rw-r--r--spec/services/deployments/update_service_spec.rb8
-rw-r--r--spec/services/error_tracking/list_issues_service_spec.rb90
-rw-r--r--spec/services/feature_flags/hook_service_spec.rb31
-rw-r--r--spec/services/groups/transfer_service_spec.rb93
-rw-r--r--spec/services/groups/update_service_spec.rb2
-rw-r--r--spec/services/groups/update_shared_runners_service_spec.rb8
-rw-r--r--spec/services/import/validate_remote_git_endpoint_service_spec.rb96
-rw-r--r--spec/services/issues/close_service_spec.rb14
-rw-r--r--spec/services/issues/create_service_spec.rb19
-rw-r--r--spec/services/issues/relative_position_rebalancing_service_spec.rb15
-rw-r--r--spec/services/issues/reopen_service_spec.rb20
-rw-r--r--spec/services/members/create_service_spec.rb2
-rw-r--r--spec/services/members/invite_service_spec.rb2
-rw-r--r--spec/services/merge_requests/assign_issues_service_spec.rb2
-rw-r--r--spec/services/merge_requests/build_service_spec.rb2
-rw-r--r--spec/services/merge_requests/mergeability/check_base_service_spec.rb40
-rw-r--r--spec/services/merge_requests/mergeability/check_ci_status_service_spec.rb57
-rw-r--r--spec/services/merge_requests/mergeability/run_checks_service_spec.rb104
-rw-r--r--spec/services/merge_requests/push_options_handler_service_spec.rb2
-rw-r--r--spec/services/notes/quick_actions_service_spec.rb2
-rw-r--r--spec/services/notification_service_spec.rb2
-rw-r--r--spec/services/packages/composer/create_package_service_spec.rb25
-rw-r--r--spec/services/packages/debian/process_changes_service_spec.rb2
-rw-r--r--spec/services/projects/container_repository/cache_tags_created_at_service_spec.rb133
-rw-r--r--spec/services/projects/container_repository/cleanup_tags_service_spec.rb541
-rw-r--r--spec/services/projects/create_service_spec.rb40
-rw-r--r--spec/services/projects/destroy_service_spec.rb109
-rw-r--r--spec/services/projects/group_links/update_service_spec.rb90
-rw-r--r--spec/services/projects/import_service_spec.rb6
-rw-r--r--spec/services/projects/move_access_service_spec.rb2
-rw-r--r--spec/services/projects/operations/update_service_spec.rb8
-rw-r--r--spec/services/projects/participants_service_spec.rb146
-rw-r--r--spec/services/projects/transfer_service_spec.rb185
-rw-r--r--spec/services/projects/update_pages_service_spec.rb16
-rw-r--r--spec/services/projects/update_service_spec.rb62
-rw-r--r--spec/services/quick_actions/interpret_service_spec.rb15
-rw-r--r--spec/services/security/ci_configuration/sast_create_service_spec.rb23
-rw-r--r--spec/services/service_ping/submit_service_ping_service_spec.rb24
-rw-r--r--spec/services/user_project_access_changed_service_spec.rb4
-rw-r--r--spec/services/users/activity_service_spec.rb4
-rw-r--r--spec/services/users/update_service_spec.rb70
-rw-r--r--spec/services/users/upsert_credit_card_validation_service_spec.rb36
-rw-r--r--spec/services/web_hook_service_spec.rb2
-rw-r--r--spec/spec_helper.rb4
-rw-r--r--spec/support/before_all_adapter.rb14
-rw-r--r--spec/support/capybara.rb3
-rw-r--r--spec/support/database/cross-database-modification-allowlist.yml1343
-rw-r--r--spec/support/database/cross-join-allowlist.yml151
-rw-r--r--spec/support/database/multiple_databases.rb52
-rw-r--r--spec/support/database/prevent_cross_database_modification.rb24
-rw-r--r--spec/support/database/prevent_cross_joins.rb27
-rw-r--r--spec/support/database_cleaner.rb27
-rw-r--r--spec/support/database_load_balancing.rb30
-rw-r--r--spec/support/db_cleaner.rb75
-rw-r--r--spec/support/helpers/dependency_proxy_helpers.rb14
-rw-r--r--spec/support/helpers/feature_flag_helpers.rb2
-rw-r--r--spec/support/helpers/javascript_fixtures_helpers.rb13
-rw-r--r--spec/support/helpers/navbar_structure_helper.rb8
-rw-r--r--spec/support/helpers/stub_gitlab_calls.rb12
-rw-r--r--spec/support/helpers/usage_data_helpers.rb12
-rw-r--r--spec/support/matchers/be_request_urgency.rb8
-rw-r--r--spec/support/matchers/graphql_matchers.rb28
-rw-r--r--spec/support/matchers/markdown_matchers.rb2
-rw-r--r--spec/support/redis.rb16
-rw-r--r--spec/support/redis/redis_helpers.rb10
-rw-r--r--spec/support/redis/redis_new_instance_shared_examples.rb55
-rw-r--r--spec/support/redis/redis_shared_examples.rb28
-rw-r--r--spec/support/shared_contexts/bulk_imports_requests_shared_context.rb52
-rw-r--r--spec/support/shared_contexts/lib/gitlab/import_export/relation_tree_restorer_shared_context.rb2
-rw-r--r--spec/support/shared_contexts/lib/gitlab/sidekiq_logging/structured_logger_shared_context.rb20
-rw-r--r--spec/support/shared_contexts/lib/gitlab/sidekiq_middleware/server_metrics_shared_context.rb5
-rw-r--r--spec/support/shared_contexts/policies/project_policy_shared_context.rb1
-rw-r--r--spec/support/shared_examples/ci/stuck_builds_shared_examples.rb35
-rw-r--r--spec/support/shared_examples/controllers/wiki_actions_shared_examples.rb2
-rw-r--r--spec/support/shared_examples/features/container_registry_shared_examples.rb9
-rw-r--r--spec/support/shared_examples/features/discussion_comments_shared_example.rb30
-rw-r--r--spec/support/shared_examples/features/project_upload_files_shared_examples.rb50
-rw-r--r--spec/support/shared_examples/graphql/connection_shared_examples.rb2
-rw-r--r--spec/support/shared_examples/graphql/sorted_paginated_query_shared_examples.rb18
-rw-r--r--spec/support/shared_examples/lib/gitlab/ci/ci_trace_shared_examples.rb22
-rw-r--r--spec/support/shared_examples/lib/gitlab/cycle_analytics/event_shared_examples.rb35
-rw-r--r--spec/support/shared_examples/lib/gitlab/import_export/attributes_permitter_shared_examples.rb40
-rw-r--r--spec/support/shared_examples/metrics/active_record_subscriber_shared_examples.rb36
-rw-r--r--spec/support/shared_examples/models/concerns/analytics/cycle_analytics/stage_event_model_examples.rb68
-rw-r--r--spec/support/shared_examples/models/concerns/ttl_expirable_shared_examples.rb51
-rw-r--r--spec/support/shared_examples/models/packages/debian/distribution_shared_examples.rb36
-rw-r--r--spec/support/shared_examples/requests/api/composer_packages_shared_examples.rb11
-rw-r--r--spec/support/shared_examples/requests/api/container_repositories_shared_examples.rb37
-rw-r--r--spec/support/shared_examples/requests/api/graphql/group_and_project_boards_query_shared_examples.rb7
-rw-r--r--spec/support/shared_examples/requests/api/graphql/packages/group_and_project_packages_list_shared_examples.rb10
-rw-r--r--spec/support/shared_examples/requests/api/issuable_search_shared_examples.rb36
-rw-r--r--spec/support/shared_examples/requests/api/logging_application_context_shared_examples.rb16
-rw-r--r--spec/support/shared_examples/requests/rack_attack_shared_examples.rb5
-rw-r--r--spec/support/shared_examples/services/dependency_proxy_settings_shared_examples.rb8
-rw-r--r--spec/support/shared_examples/workers/concerns/dependency_proxy/cleanup_worker_shared_examples.rb53
-rw-r--r--spec/support/shared_examples/workers/concerns/reenqueuer_shared_examples.rb24
-rw-r--r--spec/support_specs/database/multiple_databases_spec.rb59
-rw-r--r--spec/support_specs/database/prevent_cross_joins_spec.rb16
-rw-r--r--spec/tasks/gitlab/db_rake_spec.rb53
-rw-r--r--spec/tasks/gitlab/packages/composer_rake_spec.rb29
-rw-r--r--spec/tooling/danger/product_intelligence_spec.rb10
-rw-r--r--spec/tooling/danger/project_helper_spec.rb16
-rw-r--r--spec/tooling/danger/specs_spec.rb133
-rw-r--r--spec/tooling/quality/test_level_spec.rb18
-rw-r--r--spec/views/layouts/nav/sidebar/_admin.html.haml_spec.rb9
-rw-r--r--spec/views/layouts/nav/sidebar/_project.html.haml_spec.rb17
-rw-r--r--spec/views/projects/branches/index.html.haml_spec.rb43
-rw-r--r--spec/views/projects/commits/_commit.html.haml_spec.rb18
-rw-r--r--spec/views/projects/services/edit.html.haml_spec.rb4
-rw-r--r--spec/views/projects/tags/index.html.haml_spec.rb22
-rw-r--r--spec/workers/authorized_project_update/project_recalculate_per_user_worker_spec.rb70
-rw-r--r--spec/workers/authorized_project_update/user_refresh_from_replica_worker_spec.rb2
-rw-r--r--spec/workers/build_finished_worker_spec.rb28
-rw-r--r--spec/workers/bulk_import_worker_spec.rb6
-rw-r--r--spec/workers/bulk_imports/export_request_worker_spec.rb29
-rw-r--r--spec/workers/bulk_imports/pipeline_worker_spec.rb112
-rw-r--r--spec/workers/ci/create_downstream_pipeline_worker_spec.rb37
-rw-r--r--spec/workers/ci/stuck_builds/drop_running_worker_spec.rb28
-rw-r--r--spec/workers/ci/stuck_builds/drop_scheduled_worker_spec.rb28
-rw-r--r--spec/workers/cleanup_container_repository_worker_spec.rb6
-rw-r--r--spec/workers/concerns/application_worker_spec.rb12
-rw-r--r--spec/workers/concerns/gitlab/github_import/object_importer_spec.rb63
-rw-r--r--spec/workers/concerns/worker_context_spec.rb4
-rw-r--r--spec/workers/container_expiration_policies/cleanup_container_repository_worker_spec.rb55
-rw-r--r--spec/workers/container_expiration_policy_worker_spec.rb2
-rw-r--r--spec/workers/create_note_diff_file_worker_spec.rb18
-rw-r--r--spec/workers/database/drop_detached_partitions_worker_spec.rb7
-rw-r--r--spec/workers/dependency_proxy/cleanup_blob_worker_spec.rb9
-rw-r--r--spec/workers/dependency_proxy/cleanup_manifest_worker_spec.rb9
-rw-r--r--spec/workers/dependency_proxy/image_ttl_group_policy_worker_spec.rb74
-rw-r--r--spec/workers/email_receiver_worker_spec.rb15
-rw-r--r--spec/workers/every_sidekiq_worker_spec.rb25
-rw-r--r--spec/workers/expire_job_cache_worker_spec.rb2
-rw-r--r--spec/workers/gitlab/github_import/stage/finish_import_worker_spec.rb44
-rw-r--r--spec/workers/gitlab/github_import/stage/import_base_data_worker_spec.rb28
-rw-r--r--spec/workers/gitlab/github_import/stage/import_pull_requests_worker_spec.rb27
-rw-r--r--spec/workers/gitlab/github_import/stage/import_repository_worker_spec.rb11
-rw-r--r--spec/workers/issue_placement_worker_spec.rb2
-rw-r--r--spec/workers/packages/composer/cache_cleanup_worker_spec.rb8
-rw-r--r--spec/workers/packages/composer/cache_update_worker_spec.rb8
-rw-r--r--spec/workers/pages_remove_worker_spec.rb11
-rw-r--r--spec/workers/pipeline_hooks_worker_spec.rb8
-rw-r--r--spec/workers/pipeline_process_worker_spec.rb10
-rw-r--r--spec/workers/post_receive_spec.rb2
-rw-r--r--spec/workers/run_pipeline_schedule_worker_spec.rb15
-rw-r--r--spec/workers/stuck_ci_jobs_worker_spec.rb50
-rw-r--r--storybook/config/main.js3
-rw-r--r--storybook/config/preview.js7
-rw-r--r--storybook/config/webpack.config.js21
-rw-r--r--storybook/package.json4
-rw-r--r--storybook/yarn.lock17
-rw-r--r--tooling/danger/product_intelligence.rb3
-rw-r--r--tooling/danger/project_helper.rb9
-rw-r--r--tooling/danger/specs.rb59
-rw-r--r--tooling/deprecations/docs.rb2
-rw-r--r--tooling/graphql/docs/templates/default.md.haml6
-rw-r--r--tooling/lib/tooling/helm3_client.rb2
-rw-r--r--tooling/quality/test_level.rb24
-rw-r--r--vendor/project_templates/cluster_management.tar.gzbin14062 -> 14762 bytes
-rw-r--r--vendor/project_templates/learn_gitlab.tar.gzbin112648 -> 0 bytes
-rw-r--r--vendor/project_templates/learn_gitlab_ultimate_trial.tar.gzbin115097 -> 115092 bytes
-rw-r--r--workhorse/gitaly_integration_test.go2
-rw-r--r--workhorse/gitaly_test.go61
-rw-r--r--workhorse/go.mod12
-rw-r--r--workhorse/go.sum220
-rw-r--r--workhorse/internal/api/api.go2
-rw-r--r--workhorse/internal/artifacts/artifacts_store_test.go16
-rw-r--r--workhorse/internal/artifacts/artifacts_upload_test.go6
-rw-r--r--workhorse/internal/dependencyproxy/dependencyproxy.go123
-rw-r--r--workhorse/internal/dependencyproxy/dependencyproxy_test.go183
-rw-r--r--workhorse/internal/filestore/save_file_opts_test.go8
-rw-r--r--workhorse/internal/git/archive.go4
-rw-r--r--workhorse/internal/git/info-refs.go20
-rw-r--r--workhorse/internal/git/info-refs_test.go42
-rw-r--r--workhorse/internal/git/upload-pack_test.go13
-rw-r--r--workhorse/internal/gitaly/gitaly.go46
-rw-r--r--workhorse/internal/gitaly/gitaly_test.go20
-rw-r--r--workhorse/internal/gitaly/smarthttp.go46
-rw-r--r--workhorse/internal/gitaly/unmarshal_test.go13
-rw-r--r--workhorse/internal/testhelper/gitaly.go47
-rw-r--r--workhorse/internal/upload/uploads_test.go8
-rw-r--r--workhorse/internal/upstream/routes.go19
-rw-r--r--workhorse/internal/upstream/upstream.go18
-rw-r--r--workhorse/internal/upstream/upstream_test.go107
-rw-r--r--workhorse/internal/zipartifacts/open_archive_test.go137
-rw-r--r--workhorse/main.go3
-rw-r--r--workhorse/main_test.go85
-rw-r--r--yarn.lock1827
5026 files changed, 177797 insertions, 107240 deletions
diff --git a/.eslintrc.yml b/.eslintrc.yml
index 6b9a1ce62c0..cd3cd82d4e7 100644
--- a/.eslintrc.yml
+++ b/.eslintrc.yml
@@ -88,7 +88,7 @@ rules:
- pattern: test_fixtures/**
group: internal
alphabetize:
- order: asc
+ order: ignore
overrides:
- files:
- '**/spec/**/*'
@@ -100,6 +100,8 @@ overrides:
- 'scripts/**/*'
- '*.config.js'
- '*.config.*.js'
+ - 'jest_resolver.js'
+ - storybook/config/*.js
rules:
'@gitlab/require-i18n-strings': off
import/no-extraneous-dependencies: off
diff --git a/.gitignore b/.gitignore
index f753a247563..5152ef20575 100644
--- a/.gitignore
+++ b/.gitignore
@@ -40,10 +40,7 @@ eslint-report.html
/config/initializers/smtp_settings.rb
/config/initializers/relative_url.rb
/config/resque.yml
-/config/redis.cache.yml
-/config/redis.queues.yml
-/config/redis.shared_state.yml
-/config/redis.trace_chunks.yml
+/config/redis.*.yml
/config/unicorn.rb
/config/puma.rb
/config/secrets.yml
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 891551cd41e..b72ad359532 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -5,9 +5,7 @@ stages:
- fixtures
- test
- post-test
- - review-prepare
- review
- - dast
- qa
- post-qa
- pages
@@ -89,11 +87,12 @@ variables:
REVIEW_APPS_GCP_REGION: "us-central1"
BUILD_ASSETS_IMAGE: "true" # Set it to "false" to disable assets image building, used in `build-assets-image`
- RSPEC_FAIL_FAST_ENABLED: "true" # Set it to "false" to disable RSpec fail-fast
SIMPLECOV: "true"
# For the default QA image, we use $CI_COMMIT_SHA as tag since it's always available and we override it for specific workflow.rules (see above)
QA_IMAGE: "${CI_REGISTRY}/${CI_PROJECT_PATH}/gitlab-ee-qa:${CI_COMMIT_SHA}"
+ # Default latest tag for particular branch
+ QA_IMAGE_BRANCH: "${CI_REGISTRY}/${CI_PROJECT_PATH}/gitlab-ee-qa:${CI_COMMIT_REF_SLUG}"
# Preparing custom clone path to reduce space used by all random forks
# on GitLab.com's Shared Runners. Our main forks - especially the security
diff --git a/.gitlab/CODEOWNERS b/.gitlab/CODEOWNERS
index 095601ba825..64e74dd12e6 100644
--- a/.gitlab/CODEOWNERS
+++ b/.gitlab/CODEOWNERS
@@ -11,39 +11,40 @@
/doc/.markdownlint @marcel.amirault @eread @aqualls @cnorris
/doc/ @gl-docsteam
/doc/.vale/ @marcel.amirault @eread @aqualls @cnorris
-/doc/administration/geo/ @axil
+/doc/administration/geo/ @marcel.amirault
/doc/administration/gitaly/ @eread
/doc/administration/lfs/ @aqualls
/doc/administration/monitoring/ @ngaskill
-/doc/administration/operations/ @axil @eread @marcia
+/doc/administration/operations/ @marcel.amirault @eread @marcia
/doc/administration/packages/ @ngaskill
-/doc/administration/pages/ @axil @kpaizee
+/doc/administration/pages/ @rdickenson @kpaizee
/doc/administration/postgresql/ @marcia
-/doc/administration/raketasks/ @axil @eread
-/doc/administration/redis/ @axil
-/doc/administration/reference_architectures/ @axil
+/doc/administration/raketasks/ @marcel.amirault @eread
+/doc/administration/redis/ @marcel.amirault
+/doc/administration/reference_architectures/ @marcel.amirault
/doc/administration/snippets/ @aqualls
-/doc/administration/troubleshooting @axil @marcia @eread
+/doc/administration/troubleshooting @marcel.amirault @marcia @eread
/doc/api/graphql/ @msedlakjakubowski @kpaizee
/doc/api/graphql/reference/ @kpaizee
/doc/api/group_activity_analytics.md @msedlakjakubowski
/doc/ci/ @marcel.amirault @sselhorn
-/doc/ci/environments/ @axil
+/doc/ci/environments/ @rdickenson
/doc/ci/services/ @sselhorn
/doc/ci/test_cases/ @msedlakjakubowski
/doc/development/ @marcia
-/doc/development/documentation/ @cnorris
+/doc/development/documentation/ @cnorris @dianalogan
/doc/development/i18n/ @ngaskill
/doc/development/value_stream_analytics.md @msedlakjakubowski
/doc/gitlab-basics/ @aqualls
-/doc/install/ @axil
-/doc/operations/ @ngaskill @axil
+/doc/install/ @marcel.amirault
+/doc/operations/ @ngaskill @rdickenson
/doc/push_rules/ @aqualls
+/doc/security/ @eread
/doc/ssh/ @eread
/doc/subscriptions/ @sselhorn
/doc/topics/autodevops/ @marcia
/doc/topics/git/ @aqualls
-/doc/update/ @axil @marcia
+/doc/update/ @marcel.amirault @marcia
/doc/user/analytics/ @msedlakjakubowski @ngaskill
/doc/user/application_security/ @rdickenson
/doc/user/application_security/container_scanning/ @ngaskill
@@ -62,13 +63,13 @@
/doc/user/packages/infrastructure_registry/ @marcia
/doc/user/packages/terraform_module_registry/ @marcia
/doc/user/profile/ @msedlakjakubowski @eread
-/doc/user/project/ @aqualls @axil @eread @msedlakjakubowski @ngaskill
+/doc/user/project/ @aqualls @rdickenson @eread @msedlakjakubowski @ngaskill
/doc/user/project/clusters/ @marcia
/doc/user/project/import/ @ngaskill @msedlakjakubowski
/doc/user/project/issues/ @msedlakjakubowski
/doc/user/project/merge_requests/ @aqualls @eread
/doc/user/project/milestones/ @msedlakjakubowski
-/doc/user/project/pages/ @axil
+/doc/user/project/pages/ @rdickenson
/doc/user/project/repository/ @aqualls
/doc/user/project/settings/ @aqualls @eread
/doc/user/project/static_site_editor/index.md @aqualls
@@ -151,8 +152,8 @@
/doc/api/invitations.md @kpaizee
/doc/api/experiments.md @kpaizee
/doc/development/experiment_guide/ @kpaizee
-/doc/development/snowplow/ @kpaizee
-/doc/development/service_ping/ @kpaizee
+/doc/development/snowplow/ @fneill
+/doc/development/service_ping/ @fneill
/doc/user/admin_area/license.md @kpaizee
[Frontend]
@@ -241,7 +242,7 @@ Dangerfile @gl-quality/eng-prod
/ee/lib/gitlab/ci/reports/dependency_list/ @gitlab-org/secure/composition-analysis-be
/ee/lib/gitlab/ci/reports/license_scanning/ @gitlab-org/secure/composition-analysis-be
/ee/lib/gitlab/ci/reports/security/ @gitlab-org/secure/composition-analysis-be @gitlab-org/secure/dynamic-analysis-be @gitlab-org/secure/static-analysis-be @gitlab-org/secure/fuzzing-be
-/ee/app/services/ci/run_dast_scan_service.rb @gitlab-org/secure/dynamic-analysis-be
+/ee/app/services/app_sec/dast/ @gitlab-org/secure/dynamic-analysis-be
[Container Security]
/ee/app/views/projects/threat_monitoring/** @gitlab-org/protect/container-security-frontend
diff --git a/.gitlab/ci/build-images.gitlab-ci.yml b/.gitlab/ci/build-images.gitlab-ci.yml
index 0169f017063..6a222d8937f 100644
--- a/.gitlab/ci/build-images.gitlab-ci.yml
+++ b/.gitlab/ci/build-images.gitlab-ci.yml
@@ -28,7 +28,8 @@ build-qa-image:
script:
- !reference [.base-image-build, script]
- echo $QA_IMAGE
- - /kaniko/executor --context=${CI_PROJECT_DIR} --dockerfile=${CI_PROJECT_DIR}/qa/Dockerfile --destination=${QA_IMAGE} --cache=true
+ - echo $QA_IMAGE_BRANCH
+ - /kaniko/executor --context=${CI_PROJECT_DIR} --dockerfile=${CI_PROJECT_DIR}/qa/Dockerfile --destination=${QA_IMAGE} --destination=${QA_IMAGE_BRANCH} --cache=true
# This image is used by:
# - The `CNG` pipelines (via the `review-build-cng` job): https://gitlab.com/gitlab-org/build/CNG/-/blob/cfc67136d711e1c8c409bf8e57427a644393da2f/.gitlab-ci.yml#L335
diff --git a/.gitlab/ci/dast.gitlab-ci.yml b/.gitlab/ci/dast.gitlab-ci.yml
deleted file mode 100644
index 309714f8739..00000000000
--- a/.gitlab/ci/dast.gitlab-ci.yml
+++ /dev/null
@@ -1,205 +0,0 @@
-.dast_conf:
- tags:
- - prm
- # For scheduling dast job
- extends:
- - .reports:rules:schedule-dast
- image:
- name: "registry.gitlab.com/gitlab-org/security-products/dast:$DAST_VERSION"
- resource_group: dast_scan
- variables:
- DAST_USERNAME_FIELD: "user[login]"
- DAST_PASSWORD_FIELD: "user[password]"
- DAST_FULL_SCAN_ENABLED: "true"
- DAST_SPIDER_MINS: 0
- # TBD pin to a version
- DAST_VERSION: 1.22.1
- # -Xmx is used to set the JVM memory to 6GB to prevent DAST OutOfMemoryError.
- DAST_ZAP_CLI_OPTIONS: "-Xmx6144m"
- DAST_RULES: "41,42,43,10027,10032,10041,10042,10045,10047,10052,10053,10057,10061,10096,10097,10104,10106,20012,20014,20015,20016,20017,20018,40019,40020,40021,40024,40025,40027,40029,40032,90001,90019,10109,10026,10028,10029,10030,10031,10033,10034,10035,10036,10038,10039,10043,10044,10048,10050,10051,10058,10062,10095,10107,10108,30003,40013,40022,40023,40028,90021,90023,90024,90025,90027,90028,10003,50003,0,2,3,6,7,10010,10011,10015,10017,10019,10020,10021,10023,10024,10025,10037,10040,10054,10055,10056,10098,10105,10202,20019,30001,30002,40003,40008,40009,40012,40014,40016,40017,40018,50000,50001,90011,90020,90022,90033"
- before_script:
- - 'export DAST_WEBSITE="${DAST_WEBSITE:-$(cat environment_url.txt)}"'
- - 'export DAST_AUTH_URL="${DAST_WEBSITE}/users/sign_in"'
- - 'export DAST_PASSWORD="${REVIEW_APPS_ROOT_PASSWORD}"'
- # Below three lines can be removed once https://gitlab.com/gitlab-org/gitlab/-/issues/230687 is fixed
- - mkdir -p /zap/xml
- - 'sed -i "84 s/true/false/" /zap/xml/config.xml'
- - cat /zap/xml/config.xml
- # Help pages are excluded from scan as they are static pages.
- # profile/two_factor_auth is excluded from scan to prevent 2FA from being turned on from user profile, which will reduce coverage.
- - 'export DAST_AUTH_EXCLUDE_URLS="${DAST_WEBSITE}/help/.*,${DAST_WEBSITE}/profile/two_factor_auth,${DAST_WEBSITE}/users/sign_out"'
- # Exclude the automatically generated monitoring project from being tested due to https://gitlab.com/gitlab-org/gitlab/-/issues/260362
- - 'DAST_AUTH_EXCLUDE_URLS="${DAST_AUTH_EXCLUDE_URLS},https://.*\.gitlab-review\.app/gitlab-instance-(administrators-)?[a-zA-Z0-9]{8}/.*"'
- - enable_rule () { read all_rules; rule=$1; echo $all_rules | sed -r "s/(,)?$rule(,)?/\1-1\2/" ; }
- # Sort ids in DAST_RULES ascendingly, which is required when using DAST_RULES as argument to enable_rule
- - 'DAST_RULES=$(echo $DAST_RULES | tr "," "\n" | sort -n | paste -sd ",")'
- needs: ["review-deploy"]
- stage: dast
- # Default job timeout set to 90m and dast rules needs 2h to so that it won't timeout.
- timeout: 2h
- # Add retry because of intermittent connection problems. See https://gitlab.com/gitlab-org/gitlab/-/issues/244313
- retry: 1
- artifacts:
- paths:
- - gl-dast-report.json # GitLab-specific
- reports:
- dast: gl-dast-report.json
- expire_in: 1 week # GitLab-specific
-
-# DAST scan with a subset of Release scan rules.
-DAST-fullscan-ruleset1:
- extends:
- - .dast_conf
- variables:
- DAST_USERNAME: "user1"
- script:
- - export DAST_EXCLUDE_RULES=$(echo $DAST_RULES | enable_rule 10019 | enable_rule 10020 | enable_rule 10021 | enable_rule 10023 | enable_rule 10024 | enable_rule 10025 | enable_rule 10037 | enable_rule 10040 | enable_rule 10054 | enable_rule 10055 | enable_rule 10056)
- - echo $DAST_EXCLUDE_RULES
- - /analyze -t $DAST_WEBSITE -d
-
-# DAST scan with a subset of Release scan rules.
-DAST-fullscan-ruleset2:
- extends:
- - .dast_conf
- variables:
- DAST_USERNAME: "user2"
- script:
- - export DAST_EXCLUDE_RULES=$(echo $DAST_RULES | enable_rule 90011 | enable_rule 90020 | enable_rule 90022 | enable_rule 90033)
- - echo $DAST_EXCLUDE_RULES
- - /analyze -t $DAST_WEBSITE -d
-
-# DAST scan with a subset of Release scan rules.
-DAST-fullscan-ruleset3:
- extends:
- - .dast_conf
- variables:
- DAST_USERNAME: "user3"
- script:
- - export DAST_EXCLUDE_RULES=$(echo $DAST_RULES | enable_rule 40016 | enable_rule 40017 | enable_rule 50000 | enable_rule 50001)
- - echo $DAST_EXCLUDE_RULES
- - /analyze -t $DAST_WEBSITE -d
-
-# DAST scan with a subset of Release scan rules.
-DAST-fullscan-ruleset4:
- extends:
- - .dast_conf
- variables:
- DAST_USERNAME: "user4"
- script:
- - export DAST_EXCLUDE_RULES=$(echo $DAST_RULES | enable_rule 0 | enable_rule 2 | enable_rule 3 | enable_rule 7 )
- - echo $DAST_EXCLUDE_RULES
- - /analyze -t $DAST_WEBSITE -d
-
-# DAST scan with a subset of Release scan rules.
-DAST-fullscan-ruleset5:
- extends:
- - .dast_conf
- variables:
- DAST_USERNAME: "user5"
- script:
- - export DAST_EXCLUDE_RULES=$(echo $DAST_RULES | enable_rule 10010 | enable_rule 10011 | enable_rule 10017 | enable_rule 10019)
- - echo $DAST_EXCLUDE_RULES
- - /analyze -t $DAST_WEBSITE -d
-
-# DAST scan with a subset of Release scan rules.
-DAST-fullscan-ruleset6:
- extends:
- - .dast_conf
- variables:
- DAST_USERNAME: "user6"
- script:
- - export DAST_EXCLUDE_RULES=$(echo $DAST_RULES | enable_rule 30001 | enable_rule 40009)
- - echo $DAST_EXCLUDE_RULES
- - /analyze -t $DAST_WEBSITE -d
-
-# Enable when https://gitlab.com/gitlab-org/gitlab/-/merge_requests/39749 is fixed
-# DAST scan with a subset of Beta scan rules.
-# DAST-fullscan-ruleset7:
-# extends:
-# - .dast_conf
-# variables:
-# DAST_USERNAME: "user7"
-# script:
-# - export DAST_EXCLUDE_RULES=$(echo $DAST_RULES | enable_rule 10098 | enable_rule 10105 | enable_rule 10202 | enable_rule 30002 | enable_rule 40003 | enable_rule 40008 | enable_rule 40009)
-# - echo $DAST_EXCLUDE_RULES
-# - /analyze -t $DAST_WEBSITE -d
-
-# Enable when https://gitlab.com/gitlab-org/gitlab/-/merge_requests/39749 is fixed
-# Below jobs runs DAST scans with one time consuming scan rule. These scan rules are disabled in above jobs so that those jobs won't timeout.
-# DAST scan with rule - 20019 External Redirect
-# DAST-fullscan-rule-20019:
-# extends:
-# - .dast_conf
-# variables:
-# DAST_USERNAME: "user8"
-# script:
-# - export DAST_EXCLUDE_RULES=$(echo $DAST_RULES | enable_rule 20019)
-# - echo $DAST_EXCLUDE_RULES
-# - /analyze -t $DAST_WEBSITE -d
-
-# Enable when https://gitlab.com/gitlab-org/gitlab/-/merge_requests/39749 is fixed
-# DAST scan with rule - 10107 Httpoxy - Proxy Header Misuse - Active/beta
-# DAST-fullscan-rule-10107:
-# extends:
-# - .dast_conf
-# variables:
-# DAST_USERNAME: "user9"
-# script:
-# - export DAST_EXCLUDE_RULES=$(echo $DAST_RULES | enable_rule 10107)
-# - echo $DAST_EXCLUDE_RULES
-# - /analyze -t $DAST_WEBSITE -d
-
-# DAST scan with rule - 90020 Remote OS Command Injection
-DAST-fullscan-rule-90020:
- extends:
- - .dast_conf
- variables:
- DAST_USERNAME: "user10"
- script:
- - export DAST_EXCLUDE_RULES=$(echo $DAST_RULES | enable_rule 90020)
- - echo $DAST_EXCLUDE_RULES
- - /analyze -t $DAST_WEBSITE -d
-
-# DAST scan with rule - 40018 SQL Injection - Active/release
-DAST-fullscan-rule-40018:
- extends:
- - .dast_conf
- variables:
- DAST_USERNAME: "user11"
- script:
- - export DAST_EXCLUDE_RULES=$(echo $DAST_RULES | enable_rule 40018)
- - echo $DAST_EXCLUDE_RULES
- - /analyze -t $DAST_WEBSITE -d
-
-# DAST scan with rule - 40014 Cross Site Scripting (Persistent) - Active/release
-DAST-fullscan-rule-40014:
- extends:
- - .dast_conf
- variables:
- DAST_USERNAME: "user12"
- script:
- - export DAST_EXCLUDE_RULES=$(echo $DAST_RULES | enable_rule 40014)
- - echo $DAST_EXCLUDE_RULES
- - /analyze -t $DAST_WEBSITE -d
-
-# DAST scan with rule - 6 Path travesal
-DAST-fullscan-rule-6:
- extends:
- - .dast_conf
- variables:
- DAST_USERNAME: "user13"
- script:
- - export DAST_EXCLUDE_RULES=$(echo $DAST_RULES | enable_rule 6)
- - echo $DAST_EXCLUDE_RULES
- - /analyze -t $DAST_WEBSITE -d
-
-# DAST scan with rule - 40012 Cross Site Scripting (Reflected)
-DAST-fullscan-rule-40012:
- extends:
- - .dast_conf
- variables:
- DAST_USERNAME: "user14"
- script:
- - export DAST_EXCLUDE_RULES=$(echo $DAST_RULES | enable_rule 40012)
- - echo $DAST_EXCLUDE_RULES
- - /analyze -t $DAST_WEBSITE -d
diff --git a/.gitlab/ci/docs.gitlab-ci.yml b/.gitlab/ci/docs.gitlab-ci.yml
index c585047f916..f4d8698f22d 100644
--- a/.gitlab/ci/docs.gitlab-ci.yml
+++ b/.gitlab/ci/docs.gitlab-ci.yml
@@ -75,17 +75,3 @@ ui-docs-links lint:
needs: []
script:
- bundle exec haml-lint -i DocumentationLinks
-
-deprecations-doc check:
- variables:
- SETUP_DB: "false"
- extends:
- - .default-retry
- - .rails-cache
- - .default-before_script
- - .docs:rules:deprecations
- stage: test
- needs: []
- script:
- - bundle exec rake gitlab:docs:check_deprecations
- allow_failure: true
diff --git a/.gitlab/ci/frontend.gitlab-ci.yml b/.gitlab/ci/frontend.gitlab-ci.yml
index 48f85219ff4..6974d63a49c 100644
--- a/.gitlab/ci/frontend.gitlab-ci.yml
+++ b/.gitlab/ci/frontend.gitlab-ci.yml
@@ -71,6 +71,12 @@ compile-test-assets as-if-foss:
- .frontend:rules:compile-test-assets-as-if-foss
- .as-if-foss
+compile-test-assets as-if-jh:
+ extends:
+ - compile-test-assets
+ - .frontend:rules:compile-test-assets-as-if-jh
+ needs: ["add-jh-folder"]
+
update-assets-compile-production-cache:
extends:
- compile-production-assets
@@ -112,7 +118,7 @@ update-storybook-yarn-cache:
- .rails-cache
- .use-pg12
stage: fixtures
- needs: ["setup-test-env", "retrieve-tests-metadata", "compile-test-assets"]
+ needs: ["setup-test-env", "retrieve-tests-metadata"]
variables:
WEBPACK_VENDOR_DLL: "true"
script:
@@ -128,23 +134,38 @@ update-storybook-yarn-cache:
- tmp/tests/frontend/
- knapsack/
-rspec frontend_fixture:
+# Builds FOSS, and EE fixtures in the EE project.
+# Builds FOSS fixtures in the FOSS project.
+rspec-all frontend_fixture:
extends:
- .frontend-fixtures-base
- .frontend:rules:default-frontend-jobs
- parallel: 2
+ needs:
+ - !reference [.frontend-fixtures-base, needs]
+ - "compile-test-assets"
+ parallel: 5
-rspec frontend_fixture as-if-foss:
+# Builds FOSS fixtures in the EE project, with the `ee/` folder removed (due to `as-if-foss`).
+rspec-all frontend_fixture as-if-foss:
extends:
- .frontend-fixtures-base
- .frontend:rules:default-frontend-jobs-as-if-foss
- .as-if-foss
+ needs:
+ - !reference [.frontend-fixtures-base, needs]
+ - "compile-test-assets as-if-foss"
-rspec-ee frontend_fixture:
+# Builds FOSS, EE, and JH fixtures in the EE project, with the `jh/` folder added (due to `as-if-jh`).
+rspec-all frontend_fixture as-if-jh:
extends:
- .frontend-fixtures-base
- - .frontend:rules:default-frontend-jobs-ee
- parallel: 3
+ - .frontend:rules:default-frontend-jobs-as-if-jh
+ needs:
+ - !reference [.frontend-fixtures-base, needs]
+ - "compile-test-assets as-if-jh"
+ - "add-jh-folder"
+ script:
+ - echo "This job is currently doing nothing since there's no specific JH fixtures yet. To enable this job, remove this line."
graphql-schema-dump:
variables:
@@ -172,7 +193,9 @@ graphql-schema-dump:
# Disable warnings in browserslist which can break on backports
# https://github.com/browserslist/browserslist/blob/a287ec6/node.js#L367-L384
BROWSERSLIST_IGNORE_OLD_DATA: "true"
+ SETUP_DB: "false"
before_script:
+ - !reference [.default-before_script, before_script]
- *yarn-install
stage: test
@@ -194,11 +217,7 @@ jest:
extends:
- .jest-base
- .frontend:rules:jest
- needs:
- - job: "detect-tests"
- - job: "rspec frontend_fixture"
- - job: "rspec-ee frontend_fixture"
- optional: true
+ needs: ["rspec-all frontend_fixture"]
artifacts:
name: coverage-frontend
expire_in: 31d
@@ -215,6 +234,9 @@ jest minimal:
extends:
- jest
- .frontend:rules:jest:minimal
+ needs:
+ - !reference [jest, needs]
+ - "detect-tests"
script:
- run_timed_command "yarn jest:ci:minimal"
@@ -225,9 +247,7 @@ jest-integration:
script:
- run_timed_command "yarn jest:integration --ci"
needs:
- - job: "rspec frontend_fixture"
- - job: "rspec-ee frontend_fixture"
- optional: true
+ - job: "rspec-all frontend_fixture"
- job: "graphql-schema-dump"
jest-as-if-foss:
@@ -235,9 +255,17 @@ jest-as-if-foss:
- .jest-base
- .frontend:rules:default-frontend-jobs-as-if-foss
- .as-if-foss
- needs: ["rspec frontend_fixture as-if-foss"]
+ needs: ["rspec-all frontend_fixture as-if-foss"]
parallel: 2
+jest-as-if-jh:
+ extends:
+ - .jest-base
+ - .frontend:rules:default-frontend-jobs-as-if-jh
+ needs: ["rspec-all frontend_fixture as-if-jh", "add-jh-folder"]
+ script:
+ - echo "This job is currently doing nothing since there's no specific JH Jest tests yet. To enable this job, remove this line."
+
coverage-frontend:
extends:
- .default-retry
@@ -341,9 +369,7 @@ startup-css-check:
- .frontend:rules:default-frontend-jobs
needs:
- job: "compile-test-assets"
- - job: "rspec frontend_fixture"
- - job: "rspec-ee frontend_fixture"
- optional: true
+ - job: "rspec-all frontend_fixture"
startup-css-check as-if-foss:
extends:
@@ -352,7 +378,7 @@ startup-css-check as-if-foss:
- .frontend:rules:default-frontend-jobs-as-if-foss
needs:
- job: "compile-test-assets as-if-foss"
- - job: "rspec frontend_fixture as-if-foss"
+ - job: "rspec-all frontend_fixture as-if-foss"
.compile-storybook-base:
extends:
@@ -361,11 +387,15 @@ startup-css-check as-if-foss:
script:
- *storybook-yarn-install
- yarn run storybook:build
+ needs: ["graphql-schema-dump"]
compile-storybook:
extends:
- .compile-storybook-base
- .frontend:rules:default-frontend-jobs
+ needs:
+ - !reference [.compile-storybook-base, needs]
+ - job: "rspec-all frontend_fixture"
artifacts:
name: storybook
expire_in: 31d
@@ -378,3 +408,6 @@ compile-storybook as-if-foss:
- .compile-storybook-base
- .as-if-foss
- .frontend:rules:default-frontend-jobs-as-if-foss
+ needs:
+ - !reference [.compile-storybook-base, needs]
+ - job: "rspec-all frontend_fixture as-if-foss"
diff --git a/.gitlab/ci/global.gitlab-ci.yml b/.gitlab/ci/global.gitlab-ci.yml
index d9978a44ffb..d0c26d60066 100644
--- a/.gitlab/ci/global.gitlab-ci.yml
+++ b/.gitlab/ci/global.gitlab-ci.yml
@@ -10,6 +10,7 @@
.default-before_script:
before_script:
+ - echo $FOSS_ONLY
- '[ "$FOSS_ONLY" = "1" ] && rm -rf ee/ qa/spec/ee/ qa/qa/specs/features/ee/ qa/qa/ee/ qa/qa/ee.rb'
- export GOPATH=$CI_PROJECT_DIR/.go
- mkdir -p $GOPATH
@@ -193,10 +194,12 @@
.storybook-yarn-cache:
cache:
+ - *node-modules-cache
- *storybook-node-modules-cache
.storybook-yarn-cache-push:
cache:
+ - *node-modules-cache # We don't push this cache as it's already rebuilt by `update-yarn-cache`
- *storybook-node-modules-cache-push
.use-pg11:
diff --git a/.gitlab/ci/memory.gitlab-ci.yml b/.gitlab/ci/memory.gitlab-ci.yml
index f3ad8f81da5..9234b116ff8 100644
--- a/.gitlab/ci/memory.gitlab-ci.yml
+++ b/.gitlab/ci/memory.gitlab-ci.yml
@@ -4,6 +4,12 @@
- .rails-cache
- .default-before_script
- .memory:rules
+ variables:
+ METRICS_FILE: "metrics.txt"
+ artifacts:
+ reports:
+ metrics: "${METRICS_FILE}"
+ expire_in: 31d
memory-static:
extends: .only-code-memory-job-base
@@ -11,24 +17,25 @@ memory-static:
needs: ["setup-test-env"]
variables:
SETUP_DB: "false"
+ MEMORY_BUNDLE_MEM_FILE: "tmp/memory_bundle_mem.txt"
+ MEMORY_BUNDLE_OBJECTS_FILE: "tmp/memory_bundle_objects.txt"
script:
# Uses two different reports from the 'derailed_benchmars' gem.
# Loads each of gems in the Gemfile and checks how much memory they consume when they are required.
# 'derailed_benchmarks' internally uses 'get_process_mem'
- - bundle exec derailed bundle:mem > tmp/memory_bundle_mem.txt
- - scripts/generate-gems-size-metrics-static tmp/memory_bundle_mem.txt >> 'tmp/memory_metrics.txt'
+ - bundle exec derailed bundle:mem > "${MEMORY_BUNDLE_MEM_FILE}"
+ - scripts/generate-gems-size-metrics-static "${MEMORY_BUNDLE_MEM_FILE}" >> "${METRICS_FILE}"
# Outputs detailed information about objects created while gems are loaded.
# 'derailed_benchmarks' internally uses 'memory_profiler'
- - bundle exec derailed bundle:objects > tmp/memory_bundle_objects.txt
- - scripts/generate-gems-memory-metrics-static tmp/memory_bundle_objects.txt >> 'tmp/memory_metrics.txt'
+ - bundle exec derailed bundle:objects > "${MEMORY_BUNDLE_OBJECTS_FILE}"
+ - scripts/generate-gems-memory-metrics-static "${MEMORY_BUNDLE_OBJECTS_FILE}" >> "${METRICS_FILE}"
artifacts:
paths:
- - tmp/memory_*.txt
- reports:
- metrics: tmp/memory_metrics.txt
- expire_in: 31d
+ - "${METRICS_FILE}"
+ - "${MEMORY_BUNDLE_MEM_FILE}"
+ - "${MEMORY_BUNDLE_OBJECTS_FILE}"
# Show memory usage caused by invoking require per gem.
# Unlike `memory-static`, it hits the app with one request to ensure that any last minute require-s have been called.
@@ -44,12 +51,11 @@ memory-on-boot:
NODE_ENV: "production"
RAILS_ENV: "production"
SETUP_DB: "true"
+ MEMORY_ON_BOOT_FILE: "tmp/memory_on_boot.txt"
script:
- - PATH_TO_HIT="/users/sign_in" CUT_OFF=0.3 bundle exec derailed exec perf:mem >> 'tmp/memory_on_boot.txt'
- - scripts/generate-memory-metrics-on-boot tmp/memory_on_boot.txt >> 'tmp/memory_on_boot_metrics.txt'
+ - PATH_TO_HIT="/users/sign_in" CUT_OFF=0.3 bundle exec derailed exec perf:mem >> "${MEMORY_ON_BOOT_FILE}"
+ - scripts/generate-memory-metrics-on-boot "${MEMORY_ON_BOOT_FILE}" >> "${METRICS_FILE}"
artifacts:
paths:
- - tmp/memory_*.txt
- reports:
- metrics: tmp/memory_on_boot_metrics.txt
- expire_in: 31d
+ - "${METRICS_FILE}"
+ - "${MEMORY_ON_BOOT_FILE}"
diff --git a/.gitlab/ci/reports.gitlab-ci.yml b/.gitlab/ci/reports.gitlab-ci.yml
index a5403073e1b..b581cf83d56 100644
--- a/.gitlab/ci/reports.gitlab-ci.yml
+++ b/.gitlab/ci/reports.gitlab-ci.yml
@@ -1,7 +1,7 @@
include:
- template: Jobs/Code-Quality.gitlab-ci.yml
- - template: Security/SAST.gitlab-ci.yml
- - template: Security/Secret-Detection.gitlab-ci.yml
+ - template: Jobs/SAST.gitlab-ci.yml
+ - template: Jobs/Secret-Detection.gitlab-ci.yml
- template: Security/Dependency-Scanning.gitlab-ci.yml
- template: Security/License-Scanning.gitlab-ci.yml
@@ -13,6 +13,7 @@ code_quality:
paths:
- gl-code-quality-report.json # GitLab-specific
rules: !reference [".reports:rules:code_quality", rules]
+ allow_failure: true
.sast-analyzer:
# We need to re-`extends` from `sast` as the `extends` here overrides the one from the template.
@@ -27,16 +28,13 @@ code_quality:
variables:
SAST_BRAKEMAN_LEVEL: 2 # GitLab-specific
SAST_EXCLUDED_PATHS: "qa, spec, doc, ee/spec, config/gitlab.yml.example, tmp" # GitLab-specific
- SAST_EXCLUDED_ANALYZERS: bandit, flawfinder, phpcs-security-audit, pmd-apex, security-code-scan, spotbugs, eslint
+ SAST_EXCLUDED_ANALYZERS: bandit, flawfinder, phpcs-security-audit, pmd-apex, security-code-scan, spotbugs, eslint, nodejs-scan
brakeman-sast:
- rules: !reference [".reports:rules:sast", rules]
-
-nodejs-scan-sast:
- rules: !reference [".reports:rules:sast", rules]
+ rules: !reference [".reports:rules:brakeman-sast", rules]
semgrep-sast:
- rules: !reference [".reports:rules:sast", rules]
+ rules: !reference [".reports:rules:semgrep-sast", rules]
gosec-sast:
variables:
@@ -52,7 +50,7 @@ gosec-sast:
cache:
paths:
- vendor/go
- rules: !reference [".reports:rules:sast", rules]
+ rules: !reference [".reports:rules:gosec-sast", rules]
.secret-analyzer:
extends: .default-retry
@@ -73,6 +71,7 @@ secret_detection:
needs: []
variables:
DS_EXCLUDED_PATHS: "qa/qa/ee/fixtures/secure_premade_reports, spec, ee/spec, tmp" # GitLab-specific
+ DS_EXCLUDED_ANALYZERS: "gemnasium-maven"
artifacts:
paths:
- gl-dependency-scanning-report.json # GitLab-specific
@@ -82,11 +81,6 @@ gemnasium-dependency_scanning:
before_script:
# git-lfs is needed for auto-remediation
- apk add git-lfs
- after_script:
- # Post-processing
- - apk add jq
- # Lower execa severity based on https://gitlab.com/gitlab-org/gitlab/-/issues/223859#note_452922390
- - jq '(.vulnerabilities[] | select (.cve == "yarn.lock:execa:gemnasium:05cfa2e8-2d0c-42c1-8894-638e2f12ff3d")).severity = "Medium"' gl-dependency-scanning-report.json > temp.json && mv temp.json gl-dependency-scanning-report.json
rules: !reference [".reports:rules:gemnasium-dependency_scanning", rules]
bundler-audit-dependency_scanning:
@@ -101,8 +95,7 @@ gemnasium-python-dependency_scanning:
# Analyze dependencies for malicious behavior
# See https://gitlab.com/gitlab-com/gl-security/security-research/package-hunter
.package_hunter-base:
- extends:
- - .default-retry
+ extends: .default-retry
stage: test
image:
name: registry.gitlab.com/gitlab-com/gl-security/security-research/package-hunter-cli:1.1.0
@@ -116,6 +109,8 @@ gemnasium-python-dependency_scanning:
before_script:
- rm -r spec locale .git app/assets/images doc/
- cd .. && tar -I "gzip --best" -cf gitlab.tgz gitlab/
+ script:
+ - node /usr/src/app/cli.js analyze --format gitlab --manager ${PACKAGE_MANAGER} gitlab.tgz | tee ${CI_PROJECT_DIR}/gl-dependency-scanning-report.json
artifacts:
paths:
- gl-dependency-scanning-report.json
@@ -127,15 +122,15 @@ package_hunter-yarn:
extends:
- .package_hunter-base
- .reports:rules:package_hunter-yarn
- script:
- - node /usr/src/app/cli.js analyze --format gitlab --manager yarn gitlab.tgz | tee $CI_PROJECT_DIR/gl-dependency-scanning-report.json
+ variables:
+ PACKAGE_MANAGER: yarn
package_hunter-bundler:
extends:
- .package_hunter-base
- .reports:rules:package_hunter-bundler
- script:
- - node /usr/src/app/cli.js analyze --format gitlab --manager bundler gitlab.tgz | tee $CI_PROJECT_DIR/gl-dependency-scanning-report.json
+ variables:
+ PACKAGE_MANAGER: bundler
license_scanning:
extends: .default-retry
diff --git a/.gitlab/ci/review-apps/dast.gitlab-ci.yml b/.gitlab/ci/review-apps/dast.gitlab-ci.yml
new file mode 100644
index 00000000000..512c850b7da
--- /dev/null
+++ b/.gitlab/ci/review-apps/dast.gitlab-ci.yml
@@ -0,0 +1,191 @@
+.dast_conf:
+ tags:
+ - prm
+ # For scheduling dast job
+ extends:
+ - .reports:rules:schedule-dast
+ image:
+ name: "registry.gitlab.com/gitlab-org/security-products/dast:$DAST_VERSION"
+ resource_group: dast_scan
+ variables:
+ DAST_USERNAME_FIELD: "user[login]"
+ DAST_PASSWORD_FIELD: "user[password]"
+ DAST_SUBMIT_FIELD: "commit"
+ DAST_FULL_SCAN_ENABLED: "true"
+ DAST_VERSION: 2
+ GIT_STRATEGY: none
+ # -Xmx is used to set the JVM memory to 6GB to prevent DAST OutOfMemoryError.
+ DAST_ZAP_CLI_OPTIONS: "-Xmx6144m"
+ before_script:
+ - 'export DAST_WEBSITE="${DAST_WEBSITE:-$(cat environment_url.txt)}"'
+ - 'export DAST_AUTH_URL="${DAST_WEBSITE}/users/sign_in"'
+ - 'export DAST_PASSWORD="${REVIEW_APPS_ROOT_PASSWORD}"'
+ # Help pages are excluded from scan as they are static pages.
+ # profile/two_factor_auth is excluded from scan to prevent 2FA from being turned on from user profile, which will reduce coverage.
+ - 'DAST_EXCLUDE_URLS="${DAST_WEBSITE}/help/.*,${DAST_WEBSITE}/-/profile/two_factor_auth,${DAST_WEBSITE}/users/sign_out"'
+ # Exclude the automatically generated monitoring project from being tested due to https://gitlab.com/gitlab-org/gitlab/-/issues/260362
+ - 'export DAST_EXCLUDE_URLS="${DAST_EXCLUDE_URLS},${DAST_WEBSITE}/gitlab-instance-.*"'
+ needs: ["review-deploy"]
+ stage: dast
+ # Default job timeout set to 90m and dast rules needs 2h to so that it won't timeout.
+ timeout: 2h
+ # Add retry because of intermittent connection problems. See https://gitlab.com/gitlab-org/gitlab/-/issues/244313
+ retry: 1
+ artifacts:
+ paths:
+ - gl-dast-report.json # GitLab-specific
+ reports:
+ dast: gl-dast-report.json
+ expire_in: 1 week # GitLab-specific
+ allow_failure: true
+
+# DAST scan with a subset of Release scan rules.
+# ZAP rule details can be found at https://www.zaproxy.org/docs/alerts/
+
+# 10019, 10021 Missing security headers
+# 10023, 10024, 10025, 10037 Information Disclosure
+# 10040 Secure Pages Include Mixed Content
+# 10055 CSP
+# 10056 X-Debug-Token Information Leak
+# Duration: 14 minutes 20 seconds
+
+dast:secureHeaders-csp-infoLeak:
+ extends:
+ - .dast_conf
+ variables:
+ DAST_USERNAME: "user1"
+ DAST_ONLY_INCLUDE_RULES: "10019,10021,10023,10024,10025,10037,10040,10055,10056"
+ script:
+ - /analyze
+
+# 90023 XML External Entity Attack
+# Duration: 41 minutes 20 seconds
+# 90019 Server Side Code Injection
+# Duration: 34 minutes 31 seconds
+dast:XXE-SrvSideInj:
+ extends:
+ - .dast_conf
+ variables:
+ DAST_USERNAME: "user2"
+ DAST_ONLY_INCLUDE_RULES: "90023,90019"
+ script:
+ - /analyze
+
+# 0 Directory Browsing
+# 2 Private IP Disclosure
+# 3 Session ID in URL Rewrite
+# 7 Remote File Inclusion
+# Duration: 63 minutes 43 seconds
+# 90034 Cloud Metadata Potentially Exposed
+# Duration: 13 minutes 48 seconds
+# 90022 Application Error Disclosure
+# Duration: 12 minutes 7 seconds
+dast:infoLeak-fileInc-DirBrowsing:
+ extends:
+ - .dast_conf
+ variables:
+ DAST_USERNAME: "user3"
+ DAST_ONLY_INCLUDE_RULES: "0,2,3,7,90034,90022"
+ script:
+ - /analyze
+
+# 10010 Cookie No HttpOnly Flag
+# 10011 Cookie Without Secure Flag
+# 10017 Cross-Domain JavaScript Source File Inclusion
+# 10029 Cookie Poisoning
+# 90033 Loosely Scoped Cookie
+# 10054 Cookie Without SameSite Attribute
+# Duration: 13 minutes 23 seconds
+dast:insecureCookie:
+ extends:
+ - .dast_conf
+ variables:
+ DAST_USERNAME: "user4"
+ DAST_ONLY_INCLUDE_RULES: "10010,10011,10017,10029,90033,10054"
+ script:
+ - /analyze
+
+
+# 20012 Anti-CSRF Tokens Check
+# 10202 Absence of Anti-CSRF Tokens
+# https://gitlab.com/gitlab-com/gl-security/appsec/appsec-team/-/issues/192
+
+# Commented because of lot of FP's
+# dast:csrfTokenCheck:
+# extends:
+# - .dast_conf
+# variables:
+# DAST_USERNAME: "user6"
+# DAST_ONLY_INCLUDE_RULES: "20012,10202"
+# script:
+# - /analyze
+
+# 10098 Cross-Domain Misconfiguration
+# 10105 Weak Authentication Method
+# 40003 CRLF Injection
+# 40008 Parameter Tampering
+# Duration: 71 minutes 15 seconds
+dast:corsMisconfig-weakauth-crlfInj:
+ extends:
+ - .dast_conf
+ variables:
+ DAST_USERNAME: "user5"
+ DAST_ONLY_INCLUDE_RULES: "10098,10105,40003,40008"
+ script:
+ - /analyze
+
+# 20019 External Redirect
+# 20014 HTTP Parameter Pollution
+# Duration: 46 minutes 12 seconds
+dast:extRedirect-paramPollution:
+ extends:
+ - .dast_conf
+ variables:
+ DAST_USERNAME: "user6"
+ DAST_ONLY_INCLUDE_RULES: "20019,20014"
+ script:
+ - /analyze
+
+# 40022 SQL Injection - PostgreSQL
+# Duration: 53 minutes 59 seconds
+dast:sqlInjection:
+ extends:
+ - .dast_conf
+ variables:
+ DAST_USERNAME: "user7"
+ DAST_ONLY_INCLUDE_RULES: "40022"
+ script:
+ - /analyze
+
+# 40014 Cross Site Scripting (Persistent)
+# Duration: 21 minutes 50 seconds
+dast:xss-persistent:
+ extends:
+ - .dast_conf
+ variables:
+ DAST_USERNAME: "user8"
+ DAST_ONLY_INCLUDE_RULES: "40014"
+ script:
+ - /analyze
+
+# 40012 Cross Site Scripting (Reflected)
+# Duration: 73 minutes 15 seconds
+dast:xss-reflected:
+ extends:
+ - .dast_conf
+ variables:
+ DAST_USERNAME: "user9"
+ DAST_ONLY_INCLUDE_RULES: "40012"
+ script:
+ - /analyze
+
+# 40013 Session Fixation
+# Duration: 44 minutes 25 seconds
+dast:sessionFixation:
+ extends:
+ - .dast_conf
+ variables:
+ DAST_USERNAME: "user10"
+ DAST_ONLY_INCLUDE_RULES: "40013"
+ script:
+ - /analyze
diff --git a/.gitlab/ci/review-apps/main.gitlab-ci.yml b/.gitlab/ci/review-apps/main.gitlab-ci.yml
new file mode 100644
index 00000000000..6fe9e39cb82
--- /dev/null
+++ b/.gitlab/ci/review-apps/main.gitlab-ci.yml
@@ -0,0 +1,106 @@
+stages:
+ - prepare
+ - deploy
+ - qa
+ - post-qa
+ - dast
+
+include:
+ - local: .gitlab/ci/global.gitlab-ci.yml
+ - local: .gitlab/ci/rules.gitlab-ci.yml
+ - local: .gitlab/ci/review-apps/qa.gitlab-ci.yml
+ - local: .gitlab/ci/review-apps/dast.gitlab-ci.yml
+
+.base-before_script: &base-before_script
+ - source ./scripts/utils.sh
+ - source ./scripts/review_apps/review-apps.sh
+ - install_api_client_dependencies_with_apk
+
+review-build-cng:
+ extends:
+ - .default-retry
+ - .review:rules:review-build-cng
+ image: ${GITLAB_DEPENDENCY_PROXY}ruby:2.7-alpine3.13
+ stage: prepare
+ variables:
+ CNG_PROJECT_ACCESS_TOKEN: "${CNG_MIRROR_PROJECT_ACCESS_TOKEN}" # "Multi-pipeline (from 'gitlab-org/gitlab' 'review-build-cng' job)" at https://gitlab.com/gitlab-org/build/CNG-mirror/-/settings/access_tokens
+ CNG_PROJECT_PATH: "gitlab-org/build/CNG-mirror"
+ before_script:
+ - source ./scripts/utils.sh
+ - install_gitlab_gem
+ script:
+ - ./scripts/trigger-build cng
+
+.review-workflow-base:
+ extends:
+ - .default-retry
+ image: registry.gitlab.com/gitlab-org/gitlab-build-images:gitlab-helm3.5-kubectl1.17
+ variables:
+ HOST_SUFFIX: "${CI_ENVIRONMENT_SLUG}"
+ DOMAIN: "-${CI_ENVIRONMENT_SLUG}.${REVIEW_APPS_DOMAIN}"
+ GITLAB_HELM_CHART_REF: "v5.2.1"
+ environment:
+ name: review/${CI_COMMIT_REF_SLUG}${FREQUENCY}
+ url: https://gitlab-${CI_ENVIRONMENT_SLUG}.${REVIEW_APPS_DOMAIN}
+ on_stop: review-stop
+ auto_stop_in: 48 hours
+
+review-deploy:
+ extends:
+ - .review-workflow-base
+ - .review:rules:review-deploy
+ stage: deploy
+ needs: ["review-build-cng"]
+ resource_group: "review/${CI_COMMIT_REF_NAME}"
+ before_script:
+ - export GITLAB_SHELL_VERSION=$(<GITLAB_SHELL_VERSION)
+ - export GITALY_VERSION=$(<GITALY_SERVER_VERSION)
+ - export GITLAB_WORKHORSE_VERSION=$(<GITLAB_WORKHORSE_VERSION)
+ - echo "${CI_ENVIRONMENT_URL}" > environment_url.txt
+ - *base-before_script
+ script:
+ - check_kube_domain
+ - download_chart
+ - date
+ - deploy || (display_deployment_debug && exit 1)
+ - verify_deploy || exit 1
+ - disable_sign_ups || (delete_release && 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.
+ - if [ "$DAST_RUN" == "true" ]; then source scripts/review_apps/seed-dast-test-data.sh; TRACE=1 trigger_proj_user_creation; fi
+ artifacts:
+ paths:
+ - environment_url.txt
+ - curl_output.txt
+ expire_in: 7 days
+ when: always
+
+.review-stop-base:
+ extends: .review-workflow-base
+ environment:
+ action: stop
+ dependencies: []
+ variables:
+ # We're cloning the repo instead of downloading the script for now
+ # because some repos are private and CI_JOB_TOKEN cannot access files.
+ # See https://gitlab.com/gitlab-org/gitlab/issues/191273
+ GIT_DEPTH: 1
+ before_script:
+ - *base-before_script
+
+review-delete-deployment:
+ extends:
+ - .review-stop-base
+ - .review:rules:review-delete-deployment
+ stage: prepare
+ script:
+ - delete_release
+
+review-stop:
+ extends:
+ - .review-stop-base
+ - .review:rules:review-stop
+ stage: post-qa
+ script:
+ - delete_k8s_release_namespace
diff --git a/.gitlab/ci/review-apps/qa.gitlab-ci.yml b/.gitlab/ci/review-apps/qa.gitlab-ci.yml
new file mode 100644
index 00000000000..6b9d4feb3c8
--- /dev/null
+++ b/.gitlab/ci/review-apps/qa.gitlab-ci.yml
@@ -0,0 +1,128 @@
+.review-qa-base:
+ extends:
+ - .use-docker-in-docker
+ image:
+ name: ${QA_IMAGE}
+ entrypoint: [""]
+ stage: qa
+ needs: ["review-deploy"]
+ variables:
+ QA_DEBUG: "true"
+ QA_CAN_TEST_GIT_PROTOCOL_V2: "false"
+ QA_GENERATE_ALLURE_REPORT: "true"
+ GITLAB_USERNAME: "root"
+ GITLAB_PASSWORD: "${REVIEW_APPS_ROOT_PASSWORD}"
+ GITLAB_ADMIN_USERNAME: "root"
+ GITLAB_ADMIN_PASSWORD: "${REVIEW_APPS_ROOT_PASSWORD}"
+ GITHUB_ACCESS_TOKEN: "${REVIEW_APPS_QA_GITHUB_ACCESS_TOKEN}"
+ EE_LICENSE: "${REVIEW_APPS_EE_LICENSE}"
+ SIGNUP_DISABLED: "true"
+ before_script:
+ # Use $CI_MERGE_REQUEST_SOURCE_BRANCH_SHA so that GitLab image built in omnibus-gitlab-mirror and QA image are in sync.
+ - if [ -n "$CI_MERGE_REQUEST_SOURCE_BRANCH_SHA" ]; then
+ git checkout -f ${CI_MERGE_REQUEST_SOURCE_BRANCH_SHA};
+ fi
+ - export CI_ENVIRONMENT_URL="$(cat environment_url.txt)"
+ - echo "${CI_ENVIRONMENT_URL}"
+ - cd qa
+ artifacts:
+ paths:
+ - qa/tmp
+ expire_in: 7 days
+ when: always
+
+.allure-report-base:
+ image:
+ name: ${GITLAB_DEPENDENCY_PROXY}andrcuns/allure-report-publisher:0.3.6
+ entrypoint: [""]
+ stage: post-qa
+ variables:
+ GIT_STRATEGY: none
+ STORAGE_CREDENTIALS: $QA_ALLURE_REPORT_GCS_CREDENTIALS
+ GITLAB_AUTH_TOKEN: $GITLAB_QA_MR_ALLURE_REPORT_TOKEN
+ ALLURE_PROJECT_PATH: $CI_PROJECT_PATH
+ ALLURE_MERGE_REQUEST_IID: $CI_MERGE_REQUEST_IID
+ allow_failure: true
+ script:
+ - |
+ allure-report-publisher upload gcs \
+ --results-glob="qa/tmp/allure-results/*" \
+ --bucket="gitlab-qa-allure-reports" \
+ --prefix="$ALLURE_REPORT_PATH_PREFIX/$CI_COMMIT_REF_SLUG" \
+ --update-pr="comment" \
+ --copy-latest \
+ --ignore-missing-results \
+ --color
+
+review-qa-smoke:
+ extends:
+ - .review-qa-base
+ - .review:rules:review-qa-smoke
+ retry: 1 # This is confusing but this means "2 runs at max".
+ variables:
+ QA_RUN_TYPE: review-qa-smoke
+ script:
+ - bin/test Test::Instance::Smoke "${CI_ENVIRONMENT_URL}"
+
+review-qa-all:
+ extends:
+ - .review-qa-base
+ - .review:rules:review-qa-all
+ variables:
+ QA_RUN_TYPE: review-qa-all
+ parallel: 5
+ script:
+ - export KNAPSACK_REPORT_PATH=knapsack/master_report.json
+ - export KNAPSACK_TEST_FILE_PATTERN=qa/specs/features/**/*_spec.rb
+ - |
+ bin/test Test::Instance::All "${CI_ENVIRONMENT_URL}" \
+ -- \
+ --color --format documentation \
+ --format RspecJunitFormatter --out tmp/rspec.xml
+ artifacts:
+ reports:
+ junit: qa/tmp/rspec.xml
+
+review-performance:
+ extends:
+ - .default-retry
+ - .review:rules:review-performance
+ image:
+ name: sitespeedio/sitespeed.io
+ entrypoint: [""]
+ stage: qa
+ needs: ["review-deploy"]
+ before_script:
+ - export CI_ENVIRONMENT_URL="$(cat environment_url.txt)"
+ - echo "${CI_ENVIRONMENT_URL}"
+ - mkdir -p gitlab-exporter
+ - wget -O ./gitlab-exporter/index.js https://gitlab.com/gitlab-org/gl-performance/raw/master/index.js
+ - mkdir -p sitespeed-results
+ script:
+ - /start.sh --plugins.add ./gitlab-exporter --outputFolder sitespeed-results "${CI_ENVIRONMENT_URL}"
+ after_script:
+ - mv sitespeed-results/data/performance.json performance.json
+ artifacts:
+ paths:
+ - sitespeed-results/
+ reports:
+ performance: performance.json
+ expire_in: 31d
+
+allure-report-qa-smoke:
+ extends:
+ - .allure-report-base
+ - .review:rules:review-qa-smoke-report
+ needs: ["review-qa-smoke"]
+ variables:
+ ALLURE_REPORT_PATH_PREFIX: gitlab-review-smoke
+ ALLURE_JOB_NAME: review-qa-smoke
+
+allure-report-qa-all:
+ extends:
+ - .allure-report-base
+ - .review:rules:review-qa-all-report
+ needs: ["review-qa-all"]
+ variables:
+ ALLURE_REPORT_PATH_PREFIX: gitlab-review-all
+ ALLURE_JOB_NAME: review-qa-all
diff --git a/.gitlab/ci/review.gitlab-ci.yml b/.gitlab/ci/review.gitlab-ci.yml
index f20f3276867..b2b8c456ae2 100644
--- a/.gitlab/ci/review.gitlab-ci.yml
+++ b/.gitlab/ci/review.gitlab-ci.yml
@@ -16,225 +16,25 @@ review-cleanup:
- ruby -rrubygems scripts/review_apps/automated_cleanup.rb
- gcp_cleanup
-.base-before_script: &base-before_script
- - source ./scripts/utils.sh
- - source ./scripts/review_apps/review-apps.sh
- - install_api_client_dependencies_with_apk
-
-review-build-cng:
+start-review-app-pipeline:
extends:
- - .default-retry
- - .review:rules:review-build-cng
- image: ${GITLAB_DEPENDENCY_PROXY}ruby:2.7-alpine3.13
- stage: review-prepare
+ - .review:rules:review-app-pipeline
+ stage: review
needs:
- - job: compile-production-assets
+ - job: build-assets-image
artifacts: false
+ - job: build-qa-image
+ artifacts: false
+ # These variables are set in the pipeline schedules.
+ # They need to be explicitly passed on to the child pipeline.
+ # https://docs.gitlab.com/ee/ci/pipelines/multi_project_pipelines.html#pass-cicd-variables-to-a-downstream-pipeline-by-using-the-variables-keyword
variables:
- CNG_PROJECT_ACCESS_TOKEN: "${CNG_MIRROR_PROJECT_ACCESS_TOKEN}" # "Multi-pipeline (from 'gitlab-org/gitlab' 'review-build-cng' job)" at https://gitlab.com/gitlab-org/build/CNG-mirror/-/settings/access_tokens
- CNG_PROJECT_PATH: "gitlab-org/build/CNG-mirror"
- before_script:
- - source ./scripts/utils.sh
- - install_gitlab_gem
- script:
- - ./scripts/trigger-build cng
-
-.review-workflow-base:
- extends:
- - .default-retry
- image: registry.gitlab.com/gitlab-org/gitlab-build-images:gitlab-helm3.5-kubectl1.17
- variables:
- HOST_SUFFIX: "${CI_ENVIRONMENT_SLUG}"
- DOMAIN: "-${CI_ENVIRONMENT_SLUG}.${REVIEW_APPS_DOMAIN}"
- GITLAB_HELM_CHART_REF: "v5.2.1"
- environment:
- name: review/${CI_COMMIT_REF_SLUG}${FREQUENCY}
- url: https://gitlab-${CI_ENVIRONMENT_SLUG}.${REVIEW_APPS_DOMAIN}
- on_stop: review-stop
- auto_stop_in: 48 hours
-
-review-deploy:
- extends:
- - .review-workflow-base
- - .review:rules:review-deploy
- stage: review
- needs: ["review-build-cng"]
- resource_group: "review/${CI_COMMIT_REF_NAME}"
- before_script:
- - export GITLAB_SHELL_VERSION=$(<GITLAB_SHELL_VERSION)
- - export GITALY_VERSION=$(<GITALY_SERVER_VERSION)
- - export GITLAB_WORKHORSE_VERSION=$(<GITLAB_WORKHORSE_VERSION)
- - echo "${CI_ENVIRONMENT_URL}" > environment_url.txt
- - *base-before_script
- script:
- - check_kube_domain
- - download_chart
- - date
- - deploy || (display_deployment_debug && exit 1)
- - verify_deploy || exit 1
- - disable_sign_ups || (delete_release && 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.
- - if [ "$DAST_RUN" == "true" ]; then source scripts/review_apps/seed-dast-test-data.sh; TRACE=1 trigger_proj_user_creation; fi
- artifacts:
- paths:
- - environment_url.txt
- - curl_output.txt
- expire_in: 7 days
- when: always
-
-.review-stop-base:
- extends: .review-workflow-base
- environment:
- action: stop
- dependencies: []
- variables:
- # We're cloning the repo instead of downloading the script for now
- # because some repos are private and CI_JOB_TOKEN cannot access files.
- # See https://gitlab.com/gitlab-org/gitlab/issues/191273
- GIT_DEPTH: 1
- before_script:
- - *base-before_script
-
-review-delete-deployment:
- extends:
- - .review-stop-base
- - .review:rules:review-delete-deployment
- stage: prepare
- script:
- - delete_release
-
-review-stop:
- extends:
- - .review-stop-base
- - .review:rules:review-stop
- stage: post-qa
- script:
- - delete_k8s_release_namespace
-
-.review-qa-base:
- extends:
- - .use-docker-in-docker
- image:
- name: ${QA_IMAGE}
- entrypoint: [""]
- stage: qa
- needs: ["build-qa-image", "review-deploy"]
- variables:
- QA_DEBUG: "true"
- QA_CAN_TEST_GIT_PROTOCOL_V2: "false"
- QA_GENERATE_ALLURE_REPORT: "true"
- GITLAB_USERNAME: "root"
- GITLAB_PASSWORD: "${REVIEW_APPS_ROOT_PASSWORD}"
- GITLAB_ADMIN_USERNAME: "root"
- GITLAB_ADMIN_PASSWORD: "${REVIEW_APPS_ROOT_PASSWORD}"
- GITHUB_ACCESS_TOKEN: "${REVIEW_APPS_QA_GITHUB_ACCESS_TOKEN}"
- EE_LICENSE: "${REVIEW_APPS_EE_LICENSE}"
- SIGNUP_DISABLED: "true"
- before_script:
- # Use $CI_MERGE_REQUEST_SOURCE_BRANCH_SHA so that GitLab image built in omnibus-gitlab-mirror and QA image are in sync.
- - if [ -n "$CI_MERGE_REQUEST_SOURCE_BRANCH_SHA" ]; then
- git checkout -f ${CI_MERGE_REQUEST_SOURCE_BRANCH_SHA};
- fi
- - export CI_ENVIRONMENT_URL="$(cat environment_url.txt)"
- - echo "${CI_ENVIRONMENT_URL}"
- - cd qa
- artifacts:
- paths:
- - qa/tmp
- expire_in: 7 days
- when: always
-
-.allure-report-base:
- image:
- name: ${GITLAB_DEPENDENCY_PROXY}andrcuns/allure-report-publisher:0.3.4
- entrypoint: [""]
- stage: post-qa
- variables:
- GIT_STRATEGY: none
- STORAGE_CREDENTIALS: $QA_ALLURE_REPORT_GCS_CREDENTIALS
- GITLAB_AUTH_TOKEN: $GITLAB_QA_MR_ALLURE_REPORT_TOKEN
- allow_failure: true
- script:
- - |
- allure-report-publisher upload gcs \
- --results-glob="qa/tmp/allure-results/*" \
- --bucket="gitlab-qa-allure-reports" \
- --prefix="$ALLURE_REPORT_PATH_PREFIX/$CI_COMMIT_REF_SLUG" \
- --update-pr="comment" \
- --copy-latest \
- --ignore-missing-results \
- --color
-
-review-qa-smoke:
- extends:
- - .review-qa-base
- - .review:rules:review-qa-smoke
- retry: 1 # This is confusing but this means "2 runs at max".
- script:
- - bin/test Test::Instance::Smoke "${CI_ENVIRONMENT_URL}"
-
-review-qa-all:
- extends:
- - .review-qa-base
- - .review:rules:review-qa-all
- parallel: 5
- script:
- - export KNAPSACK_REPORT_PATH=knapsack/master_report.json
- - export KNAPSACK_TEST_FILE_PATTERN=qa/specs/features/**/*_spec.rb
- - |
- bin/test Test::Instance::All "${CI_ENVIRONMENT_URL}" \
- -- \
- --color --format documentation \
- --format RspecJunitFormatter --out tmp/rspec.xml
- artifacts:
- reports:
- junit: qa/tmp/rspec.xml
-
-review-performance:
- extends:
- - .default-retry
- - .review:rules:review-performance
- image:
- name: sitespeedio/sitespeed.io
- entrypoint: [""]
- stage: qa
- needs: ["review-deploy"]
- before_script:
- - export CI_ENVIRONMENT_URL="$(cat environment_url.txt)"
- - echo "${CI_ENVIRONMENT_URL}"
- - mkdir -p gitlab-exporter
- - wget -O ./gitlab-exporter/index.js https://gitlab.com/gitlab-org/gl-performance/raw/master/index.js
- - mkdir -p sitespeed-results
- script:
- - /start.sh --plugins.add ./gitlab-exporter --outputFolder sitespeed-results "${CI_ENVIRONMENT_URL}"
- after_script:
- - mv sitespeed-results/data/performance.json performance.json
- artifacts:
- paths:
- - sitespeed-results/
- reports:
- performance: performance.json
- expire_in: 31d
-
-allure-report-qa-smoke:
- extends:
- - .allure-report-base
- - .review:rules:review-qa-smoke-report
- needs: ["review-qa-smoke"]
- variables:
- ALLURE_REPORT_PATH_PREFIX: gitlab-review-smoke
- ALLURE_JOB_NAME: review-qa-smoke
-
-allure-report-qa-all:
- extends:
- - .allure-report-base
- - .review:rules:review-qa-all-report
- needs: ["review-qa-all"]
- variables:
- ALLURE_REPORT_PATH_PREFIX: gitlab-review-all
- ALLURE_JOB_NAME: review-qa-all
+ FREQUENCY: $FREQUENCY
+ DAST_RUN: $DAST_RUN
+ trigger:
+ include:
+ - local: .gitlab/ci/review-apps/main.gitlab-ci.yml
+ strategy: depend
danger-review:
extends:
diff --git a/.gitlab/ci/rules.gitlab-ci.yml b/.gitlab/ci/rules.gitlab-ci.yml
index a4a932c7dd0..8ddcf9c2094 100644
--- a/.gitlab/ci/rules.gitlab-ci.yml
+++ b/.gitlab/ci/rules.gitlab-ci.yml
@@ -10,6 +10,9 @@
.if-not-foss: &if-not-foss
if: '$CI_PROJECT_NAME != "gitlab-foss" && $CI_PROJECT_NAME != "gitlab-ce" && $CI_PROJECT_NAME != "gitlabhq"'
+.if-jh: &if-jh
+ if: '$CI_PROJECT_PATH == "gitlab-jh/gitlab"'
+
.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_MERGE_REQUEST_IID || $CI_COMMIT_TAG || $FORCE_GITLAB_CI'
@@ -37,19 +40,22 @@
.if-automated-merge-request: &if-automated-merge-request
if: '$CI_MERGE_REQUEST_SOURCE_BRANCH_NAME == "release-tools/update-gitaly" || $CI_MERGE_REQUEST_TARGET_BRANCH_NAME =~ /stable-ee$/'
-.if-merge-request-title-as-if-foss: &if-merge-request-title-as-if-foss
+.if-merge-request-labels-as-if-foss: &if-merge-request-labels-as-if-foss
if: '$CI_MERGE_REQUEST_LABELS =~ /pipeline:run-as-if-foss/'
-.if-merge-request-title-update-caches: &if-merge-request-title-update-caches
+.if-merge-request-labels-as-if-jh: &if-merge-request-labels-as-if-jh
+ if: '$CI_MERGE_REQUEST_LABELS =~ /pipeline:run-as-if-jh/'
+
+.if-merge-request-labels-update-caches: &if-merge-request-labels-update-caches
if: '$CI_MERGE_REQUEST_LABELS =~ /pipeline:update-cache/'
-.if-merge-request-title-run-all-rspec: &if-merge-request-title-run-all-rspec
+.if-merge-request-labels-run-all-rspec: &if-merge-request-labels-run-all-rspec
if: '$CI_MERGE_REQUEST_LABELS =~ /pipeline:run-all-rspec/'
-.if-merge-request-title-run-all-jest: &if-merge-request-title-run-all-jest
+.if-merge-request-labels-run-all-jest: &if-merge-request-labels-run-all-jest
if: '$CI_MERGE_REQUEST_LABELS =~ /pipeline:run-all-jest/'
-.if-merge-request-run-decomposed: &if-merge-request-run-decomposed
+.if-merge-request-labels-run-decomposed: &if-merge-request-labels-run-decomposed
if: '$CI_MERGE_REQUEST_LABELS =~ /pipeline:run-decomposed/'
.if-security-merge-request: &if-security-merge-request
@@ -67,15 +73,24 @@
.if-dot-com-gitlab-org-schedule: &if-dot-com-gitlab-org-schedule
if: '$CI_SERVER_HOST == "gitlab.com" && $CI_PROJECT_NAMESPACE == "gitlab-org" && $CI_PIPELINE_SOURCE == "schedule"'
+.if-dot-com-gitlab-org-schedule-child-pipeline: &if-dot-com-gitlab-org-schedule-child-pipeline
+ if: '$CI_SERVER_HOST == "gitlab.com" && $CI_PROJECT_NAMESPACE == "gitlab-org" && $CI_PIPELINE_SOURCE == "parent_pipeline" && $FREQUENCY'
+
.if-dot-com-ee-schedule: &if-dot-com-ee-schedule
if: '$CI_SERVER_HOST == "gitlab.com" && $CI_PROJECT_PATH == "gitlab-org/gitlab" && $CI_PIPELINE_SOURCE == "schedule"'
+.if-dot-com-ee-schedule-child-pipeline: &if-dot-com-ee-schedule-child-pipeline
+ if: '$CI_SERVER_HOST == "gitlab.com" && $CI_PROJECT_PATH == "gitlab-org/gitlab" && $CI_PIPELINE_SOURCE == "parent_pipeline" && $FREQUENCY'
+
.if-dot-com-ee-2-hourly-schedule: &if-dot-com-ee-2-hourly-schedule
if: '$CI_SERVER_HOST == "gitlab.com" && $CI_PROJECT_PATH == "gitlab-org/gitlab" && $CI_PIPELINE_SOURCE == "schedule" && $FREQUENCY == "2-hourly"'
.if-dot-com-ee-nightly-schedule: &if-dot-com-ee-nightly-schedule
if: '$CI_SERVER_HOST == "gitlab.com" && $CI_PROJECT_PATH == "gitlab-org/gitlab" && $CI_PIPELINE_SOURCE == "schedule" && $FREQUENCY == "nightly"'
+.if-dot-com-ee-nightly-schedule-child-pipeline: &if-dot-com-ee-nightly-schedule-child-pipeline
+ if: '$CI_SERVER_HOST == "gitlab.com" && $CI_PROJECT_PATH == "gitlab-org/gitlab" && $CI_PIPELINE_SOURCE == "parent_pipeline" && $FREQUENCY == "nightly"'
+
.if-cache-credentials-schedule: &if-cache-credentials-schedule
if: '$CI_REPO_CACHE_CREDENTIALS && $CI_PIPELINE_SOURCE == "schedule"'
@@ -91,13 +106,6 @@
.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-rspec-fail-fast-disabled: &if-rspec-fail-fast-disabled
- if: '$RSPEC_FAIL_FAST_ENABLED != "true"'
-
-.if-rspec-fail-fast-skipped: &if-rspec-fail-fast-skipped
- if: '$CI_MERGE_REQUEST_LABELS =~ /pipeline:skip-rspec-fail-fast/'
-
# For Security merge requests, the gitlab-release-tools-bot triggers a new
# pipeline for the "Pipelines for merged results" feature. If the pipeline
# fails, we notify release managers.
@@ -120,6 +128,7 @@
- ".gitlab/ci/frontend.gitlab-ci.yml"
- ".gitlab/ci/build-images.gitlab-ci.yml"
- ".gitlab/ci/review.gitlab-ci.yml"
+ - ".gitlab/ci/review-apps/**/*"
- "scripts/review_apps/base-config.yaml"
- "scripts/review_apps/review-apps.sh"
- "scripts/trigger-build"
@@ -150,13 +159,6 @@
- ".markdownlint.yml"
- "scripts/lint-doc.sh"
-.docs-deprecations-patterns: &docs-deprecations-patterns
- - "doc/deprecations/index.md"
- - "data/deprecations/*.yml"
- - "data/deprecations/templates/_deprecation_template.md.erb"
- - "lib/tasks/gitlab/docs/compile_deprecations.rake"
- - "tooling/deprecations/docs.rb"
-
.bundler-patterns: &bundler-patterns
- '{Gemfile.lock,*/Gemfile.lock,*/*/Gemfile.lock}'
@@ -368,13 +370,16 @@
- "danger/**/*"
- "tooling/danger/**/*"
+.core-backend-patterns: &core-backend-patterns
+ - "{,jh/}Gemfile{,.lock}"
+ - "{,ee/,jh/}config/**/*.rb"
+
.core-frontend-patterns: &core-frontend-patterns
- "{package.json,yarn.lock}"
- "babel.config.js"
- "jest.config.{base,integration,unit}.js"
- "config/helpers/**/*.js"
- "vendor/assets/javascripts/**/*"
- - "{,ee/,jh/}app/assets/**/*.graphql"
################
# Shared rules #
@@ -383,11 +388,11 @@
rules:
- <<: *if-default-branch-schedule-2-hourly
- <<: *if-security-schedule
- - <<: *if-merge-request-title-update-caches
+ - <<: *if-merge-request-labels-update-caches
.shared:rules:update-gitaly-binaries-cache:
rules:
- - <<: *if-merge-request-title-update-caches
+ - <<: *if-merge-request-labels-update-caches
- changes: *gitaly-patterns
######################
@@ -471,12 +476,6 @@
changes: *docs-patterns
when: on_success
-.docs:rules:deprecations:
- rules:
- - <<: *if-default-refs
- changes: *docs-deprecations-patterns
- when: on_success
-
##################
# GraphQL rules #
##################
@@ -502,35 +501,58 @@
.frontend:rules:compile-test-assets:
rules:
- changes: *code-backstage-qa-patterns
- - <<: *if-merge-request-title-run-all-rspec
+ - <<: *if-merge-request-labels-run-all-rspec
.frontend:rules:compile-test-assets-as-if-foss:
rules:
- <<: *if-not-ee
when: never
+ - <<: *if-merge-request-labels-as-if-foss
+ - <<: *if-merge-request-labels-run-all-rspec
+ - changes: *code-backstage-qa-patterns
+ - changes: *startup-css-patterns
+
+.frontend:rules:compile-test-assets-as-if-jh:
+ rules:
+ - <<: *if-not-ee
+ when: never
+ - <<: *if-jh
+ when: never
+ - <<: *if-merge-request-labels-as-if-jh
+ - <<: *if-merge-request-labels-run-all-rspec
- changes: *code-backstage-qa-patterns
- - <<: *if-merge-request-title-run-all-rspec
+ - changes: *startup-css-patterns
.frontend:rules:default-frontend-jobs:
rules:
- <<: *if-default-refs
changes: *code-backstage-patterns
-.frontend:rules:default-frontend-jobs-ee:
+.frontend:rules:default-frontend-jobs-as-if-foss:
rules:
- <<: *if-not-ee
when: never
- - <<: *if-default-refs
+ - <<: *if-jh
+ when: never
+ - <<: *if-security-merge-request
changes: *code-backstage-patterns
+ - <<: *if-merge-request-labels-as-if-foss
+ - <<: *if-merge-request-labels-run-all-rspec
+ - <<: *if-merge-request
+ changes: *startup-css-patterns
+ - <<: *if-merge-request
+ changes: *ci-patterns
-.frontend:rules:default-frontend-jobs-as-if-foss:
+.frontend:rules:default-frontend-jobs-as-if-jh:
rules:
- <<: *if-not-ee
when: never
+ - <<: *if-jh
+ when: never
- <<: *if-security-merge-request
changes: *code-backstage-patterns
- - <<: *if-merge-request-title-as-if-foss
- - <<: *if-merge-request-title-run-all-rspec
+ - <<: *if-merge-request-labels-as-if-jh
+ - <<: *if-merge-request-labels-run-all-rspec
- <<: *if-merge-request
changes: *startup-css-patterns
- <<: *if-merge-request
@@ -538,7 +560,7 @@
.frontend:rules:jest:
rules:
- - <<: *if-merge-request-title-run-all-jest
+ - <<: *if-merge-request-labels-run-all-jest
- <<: *if-default-refs
changes: *core-frontend-patterns
- <<: *if-merge-request
@@ -558,7 +580,7 @@
when: never
- <<: *if-automated-merge-request
when: never
- - <<: *if-merge-request-title-run-all-jest
+ - <<: *if-merge-request-labels-run-all-jest
when: never
- <<: *if-default-refs
changes: *core-frontend-patterns
@@ -576,7 +598,10 @@
rules:
- <<: *if-not-ee
when: never
- - <<: *if-merge-request-title-as-if-foss
+ - <<: *if-jh
+ when: never
+ # We already have `static-analysis as-if-foss` which already runs `lint:eslint:all` if the `pipeline:run-as-if-foss` label is set.
+ - <<: *if-merge-request-labels-as-if-foss
when: never
- <<: *if-merge-request
changes: *frontend-patterns
@@ -644,10 +669,12 @@
rules:
- <<: *if-not-ee
when: never
+ - <<: *if-jh
+ when: never
- <<: *if-security-merge-request
changes: *code-qa-patterns
- - <<: *if-merge-request-title-as-if-foss
- - <<: *if-merge-request-title-run-all-rspec
+ - <<: *if-merge-request-labels-as-if-foss
+ - <<: *if-merge-request-labels-run-all-rspec
- <<: *if-merge-request
changes: *ci-patterns
@@ -673,12 +700,13 @@
###############
.rails:rules:decomposed-databases:
rules:
- - <<: *if-merge-request-run-decomposed
- allow_failure: true
+ - <<: *if-merge-request-labels-run-decomposed
.rails:rules:ee-and-foss-migration:
rules:
- - <<: *if-merge-request-title-run-all-rspec
+ - <<: *if-merge-request-labels-run-all-rspec
+ - <<: *if-merge-request
+ changes: *core-backend-patterns
- <<: *if-merge-request
changes: *ci-patterns
- <<: *if-merge-request
@@ -695,7 +723,10 @@
when: never
- <<: *if-automated-merge-request
when: never
- - <<: *if-merge-request-title-run-all-rspec
+ - <<: *if-merge-request-labels-run-all-rspec
+ when: never
+ - <<: *if-merge-request
+ changes: *core-backend-patterns
when: never
- <<: *if-merge-request
changes: *ci-patterns
@@ -708,7 +739,7 @@
rules:
- <<: *if-merge-request
changes: *db-patterns
- - <<: *if-merge-request-title-run-all-rspec
+ - <<: *if-merge-request-labels-run-all-rspec
.rails:rules:db:gitlabcom-database-testing:
rules:
@@ -720,7 +751,9 @@
.rails:rules:ee-and-foss-unit:
rules:
- - <<: *if-merge-request-title-run-all-rspec
+ - <<: *if-merge-request-labels-run-all-rspec
+ - <<: *if-merge-request
+ changes: *core-backend-patterns
- <<: *if-merge-request
changes: *ci-patterns
- <<: *if-automated-merge-request
@@ -735,7 +768,10 @@
when: never
- <<: *if-automated-merge-request
when: never
- - <<: *if-merge-request-title-run-all-rspec
+ - <<: *if-merge-request-labels-run-all-rspec
+ when: never
+ - <<: *if-merge-request
+ changes: *core-backend-patterns
when: never
- <<: *if-merge-request
changes: *ci-patterns
@@ -745,7 +781,9 @@
.rails:rules:ee-and-foss-integration:
rules:
- - <<: *if-merge-request-title-run-all-rspec
+ - <<: *if-merge-request-labels-run-all-rspec
+ - <<: *if-merge-request
+ changes: *core-backend-patterns
- <<: *if-merge-request
changes: *ci-patterns
- <<: *if-automated-merge-request
@@ -760,7 +798,10 @@
when: never
- <<: *if-automated-merge-request
when: never
- - <<: *if-merge-request-title-run-all-rspec
+ - <<: *if-merge-request-labels-run-all-rspec
+ when: never
+ - <<: *if-merge-request
+ changes: *core-backend-patterns
when: never
- <<: *if-merge-request
changes: *ci-patterns
@@ -770,7 +811,9 @@
.rails:rules:ee-and-foss-system:
rules:
- - <<: *if-merge-request-title-run-all-rspec
+ - <<: *if-merge-request-labels-run-all-rspec
+ - <<: *if-merge-request
+ changes: *core-backend-patterns
- <<: *if-merge-request
changes: *ci-patterns
- <<: *if-automated-merge-request
@@ -785,7 +828,10 @@
when: never
- <<: *if-automated-merge-request
when: never
- - <<: *if-merge-request-title-run-all-rspec
+ - <<: *if-merge-request-labels-run-all-rspec
+ when: never
+ - <<: *if-merge-request
+ changes: *core-backend-patterns
when: never
- <<: *if-merge-request
changes: *ci-patterns
@@ -795,7 +841,9 @@
.rails:rules:ee-and-foss-fast_spec_helper:
rules:
- - <<: *if-merge-request-title-run-all-rspec
+ - <<: *if-merge-request-labels-run-all-rspec
+ - <<: *if-merge-request
+ changes: *core-backend-patterns
- <<: *if-merge-request
changes: *ci-patterns
- <<: *if-automated-merge-request
@@ -810,7 +858,10 @@
when: never
- <<: *if-automated-merge-request
when: never
- - <<: *if-merge-request-title-run-all-rspec
+ - <<: *if-merge-request-labels-run-all-rspec
+ when: never
+ - <<: *if-merge-request
+ changes: *core-backend-patterns
when: never
- <<: *if-merge-request
changes: *ci-patterns
@@ -821,13 +872,15 @@
.rails:rules:code-backstage-qa:
rules:
- changes: *code-backstage-qa-patterns
- - <<: *if-merge-request-title-run-all-rspec
+ - <<: *if-merge-request-labels-run-all-rspec
.rails:rules:ee-only-migration:
rules:
- <<: *if-not-ee
when: never
- - <<: *if-merge-request-title-run-all-rspec
+ - <<: *if-merge-request-labels-run-all-rspec
+ - <<: *if-merge-request
+ changes: *core-backend-patterns
- <<: *if-merge-request
changes: *ci-patterns
- <<: *if-merge-request
@@ -846,7 +899,10 @@
when: never
- <<: *if-automated-merge-request
when: never
- - <<: *if-merge-request-title-run-all-rspec
+ - <<: *if-merge-request-labels-run-all-rspec
+ when: never
+ - <<: *if-merge-request
+ changes: *core-backend-patterns
when: never
- <<: *if-merge-request
changes: *ci-patterns
@@ -859,7 +915,9 @@
rules:
- <<: *if-not-ee
when: never
- - <<: *if-merge-request-title-run-all-rspec
+ - <<: *if-merge-request-labels-run-all-rspec
+ - <<: *if-merge-request
+ changes: *core-backend-patterns
- <<: *if-merge-request
changes: *ci-patterns
- <<: *if-automated-merge-request
@@ -876,7 +934,10 @@
when: never
- <<: *if-automated-merge-request
when: never
- - <<: *if-merge-request-title-run-all-rspec
+ - <<: *if-merge-request-labels-run-all-rspec
+ when: never
+ - <<: *if-merge-request
+ changes: *core-backend-patterns
when: never
- <<: *if-merge-request
changes: *ci-patterns
@@ -888,7 +949,9 @@
rules:
- <<: *if-not-ee
when: never
- - <<: *if-merge-request-title-run-all-rspec
+ - <<: *if-merge-request-labels-run-all-rspec
+ - <<: *if-merge-request
+ changes: *core-backend-patterns
- <<: *if-merge-request
changes: *ci-patterns
- <<: *if-automated-merge-request
@@ -905,7 +968,10 @@
when: never
- <<: *if-automated-merge-request
when: never
- - <<: *if-merge-request-title-run-all-rspec
+ - <<: *if-merge-request-labels-run-all-rspec
+ when: never
+ - <<: *if-merge-request
+ changes: *core-backend-patterns
when: never
- <<: *if-merge-request
changes: *ci-patterns
@@ -917,7 +983,9 @@
rules:
- <<: *if-not-ee
when: never
- - <<: *if-merge-request-title-run-all-rspec
+ - <<: *if-merge-request-labels-run-all-rspec
+ - <<: *if-merge-request
+ changes: *core-backend-patterns
- <<: *if-merge-request
changes: *ci-patterns
- <<: *if-automated-merge-request
@@ -934,7 +1002,10 @@
when: never
- <<: *if-automated-merge-request
when: never
- - <<: *if-merge-request-title-run-all-rspec
+ - <<: *if-merge-request-labels-run-all-rspec
+ when: never
+ - <<: *if-merge-request
+ changes: *core-backend-patterns
when: never
- <<: *if-merge-request
changes: *ci-patterns
@@ -946,12 +1017,14 @@
rules:
- <<: *if-not-ee
when: never
- - <<: *if-merge-request-title-run-all-rspec
+ - <<: *if-merge-request-labels-run-all-rspec
+ - <<: *if-merge-request
+ changes: *core-backend-patterns
- <<: *if-merge-request
changes: *ci-patterns
- <<: *if-security-merge-request
changes: *db-patterns
- - <<: *if-merge-request-title-as-if-foss
+ - <<: *if-merge-request-labels-as-if-foss
changes: *db-patterns
- <<: *if-automated-merge-request
changes: *db-patterns
@@ -967,12 +1040,15 @@
- <<: *if-automated-merge-request
when: never
- <<: *if-merge-request
+ changes: *core-backend-patterns
+ when: never
+ - <<: *if-merge-request
changes: *ci-patterns
when: never
- <<: *if-security-merge-request
changes: *db-patterns
when: never
- - <<: *if-merge-request-title-as-if-foss
+ - <<: *if-merge-request-labels-as-if-foss
changes: *db-patterns
when: never
@@ -980,7 +1056,9 @@
rules:
- <<: *if-not-ee
when: never
- - <<: *if-merge-request-title-run-all-rspec
+ - <<: *if-merge-request-labels-run-all-rspec
+ - <<: *if-merge-request
+ changes: *core-backend-patterns
- <<: *if-merge-request
changes: *ci-patterns
- <<: *if-automated-merge-request
@@ -989,7 +1067,7 @@
when: never
- <<: *if-security-merge-request
changes: *backend-patterns
- - <<: *if-merge-request-title-as-if-foss
+ - <<: *if-merge-request-labels-as-if-foss
changes: *backend-patterns
.rails:rules:as-if-foss-unit:minimal:
@@ -1001,18 +1079,23 @@
- <<: *if-automated-merge-request
when: never
- <<: *if-merge-request
+ changes: *core-backend-patterns
+ when: never
+ - <<: *if-merge-request
changes: *ci-patterns
when: never
- <<: *if-security-merge-request
changes: *backend-patterns
- - <<: *if-merge-request-title-as-if-foss
+ - <<: *if-merge-request-labels-as-if-foss
changes: *backend-patterns
.rails:rules:as-if-foss-integration:
rules:
- <<: *if-not-ee
when: never
- - <<: *if-merge-request-title-run-all-rspec
+ - <<: *if-merge-request-labels-run-all-rspec
+ - <<: *if-merge-request
+ changes: *core-backend-patterns
- <<: *if-merge-request
changes: *ci-patterns
- <<: *if-automated-merge-request
@@ -1021,7 +1104,7 @@
when: never
- <<: *if-security-merge-request
changes: *backend-patterns
- - <<: *if-merge-request-title-as-if-foss
+ - <<: *if-merge-request-labels-as-if-foss
changes: *backend-patterns
.rails:rules:as-if-foss-integration:minimal:
@@ -1033,18 +1116,23 @@
- <<: *if-automated-merge-request
when: never
- <<: *if-merge-request
+ changes: *core-backend-patterns
+ when: never
+ - <<: *if-merge-request
changes: *ci-patterns
when: never
- <<: *if-security-merge-request
changes: *backend-patterns
- - <<: *if-merge-request-title-as-if-foss
+ - <<: *if-merge-request-labels-as-if-foss
changes: *backend-patterns
.rails:rules:as-if-foss-system:
rules:
- <<: *if-not-ee
when: never
- - <<: *if-merge-request-title-run-all-rspec
+ - <<: *if-merge-request-labels-run-all-rspec
+ - <<: *if-merge-request
+ changes: *core-backend-patterns
- <<: *if-merge-request
changes: *ci-patterns
- <<: *if-automated-merge-request
@@ -1053,7 +1141,7 @@
when: never
- <<: *if-security-merge-request
changes: *code-backstage-patterns
- - <<: *if-merge-request-title-as-if-foss
+ - <<: *if-merge-request-labels-as-if-foss
changes: *code-backstage-patterns
.rails:rules:as-if-foss-system:minimal:
@@ -1065,23 +1153,26 @@
- <<: *if-automated-merge-request
when: never
- <<: *if-merge-request
+ changes: *core-backend-patterns
+ when: never
+ - <<: *if-merge-request
changes: *ci-patterns
when: never
- <<: *if-security-merge-request
changes: *code-backstage-patterns
- - <<: *if-merge-request-title-as-if-foss
+ - <<: *if-merge-request-labels-as-if-foss
changes: *code-backstage-patterns
.rails:rules:ee-and-foss-db-library-code:
rules:
- changes: *db-library-patterns
- - <<: *if-merge-request-title-run-all-rspec
+ - <<: *if-merge-request-labels-run-all-rspec
.rails:rules:ee-mr-and-default-branch-only:
rules:
- <<: *if-not-ee
when: never
- - <<: *if-merge-request-title-run-all-rspec
+ - <<: *if-merge-request-labels-run-all-rspec
- <<: *if-merge-request
changes: *code-backstage-patterns
- <<: *if-default-branch-refs
@@ -1090,13 +1181,13 @@
.rails:rules:detect-tests:
rules:
- changes: *code-backstage-patterns
- - <<: *if-merge-request-title-run-all-rspec
+ - <<: *if-merge-request-labels-run-all-rspec
.rails:rules:rspec-foss-impact:
rules:
- <<: *if-not-ee
when: never
- - <<: *if-merge-request-title-as-if-foss
+ - <<: *if-merge-request-labels-as-if-foss
when: never
- <<: *if-security-merge-request
changes: *code-backstage-patterns
@@ -1105,10 +1196,6 @@
.rails:rules:rspec fail-fast:
rules:
- - <<: *if-rspec-fail-fast-disabled
- when: never
- - <<: *if-rspec-fail-fast-skipped
- when: never
- <<: *if-not-ee
when: never
- <<: *if-security-merge-request
@@ -1118,10 +1205,6 @@
.rails:rules:fail-pipeline-early:
rules:
- - <<: *if-rspec-fail-fast-disabled
- when: never
- - <<: *if-rspec-fail-fast-skipped
- when: never
- <<: *if-not-ee
when: never
- <<: *if-security-merge-request
@@ -1136,7 +1219,7 @@
- <<: *if-not-ee
when: never
- <<: *if-default-branch-schedule-nightly
- - <<: *if-merge-request-title-run-all-rspec
+ - <<: *if-merge-request-labels-run-all-rspec
.rails:rules:rspec-coverage:
rules:
@@ -1146,7 +1229,7 @@
changes: *code-backstage-patterns
when: always
- <<: *if-default-branch-schedule-2-hourly
- - <<: *if-merge-request-title-run-all-rspec
+ - <<: *if-merge-request-labels-run-all-rspec
when: always
.rails:rules:default-branch-schedule-nightly--code-backstage:
@@ -1181,7 +1264,7 @@
rules:
- <<: *if-not-ee
when: never
- - <<: *if-merge-request-title-as-if-foss
+ - <<: *if-merge-request-labels-as-if-foss
changes: *code-backstage-qa-patterns
- <<: *if-security-merge-request
changes: *code-backstage-qa-patterns
@@ -1196,7 +1279,7 @@
rules:
- <<: *if-merge-request
changes: ["vendor/gems/mail-smtp_pool/**/*"]
- - <<: *if-merge-request-title-run-all-rspec
+ - <<: *if-merge-request-labels-run-all-rspec
##################
# Releases rules #
@@ -1222,75 +1305,76 @@
when: never
- <<: *if-default-refs
changes: *code-backstage-patterns
- allow_failure: true
-.reports:rules:sast:
+.reports:rules:brakeman-sast:
rules:
- - if: '$SAST_DISABLED || $GITLAB_FEATURES !~ /\bsast\b/'
+ - if: $SAST_DISABLED
when: never
- - <<: *if-default-refs
- changes: *code-backstage-qa-patterns
- allow_failure: true
+ - if: $SAST_EXCLUDED_ANALYZERS =~ /brakeman/
+ when: never
+ - changes:
+ - '**/*.rb'
+ - '**/Gemfile'
+
+.reports:rules:gosec-sast:
+ rules:
+ - if: $SAST_DISABLED
+ when: never
+ - if: $SAST_EXCLUDED_ANALYZERS =~ /gosec/
+ when: never
+ - changes:
+ - '**/*.go'
+
+.reports:rules:semgrep-sast:
+ rules:
+ - if: $SAST_DISABLED
+ when: never
+ - if: $SAST_EXCLUDED_ANALYZERS =~ /semgrep/
+ when: never
+ - changes:
+ - '**/*.py'
+ - '**/*.js'
+ - '**/*.jsx'
+ - '**/*.ts'
+ - '**/*.tsx'
+ - '**/*.c'
+ - '**/*.go'
.reports:rules:secret_detection:
rules:
- if: '$SECRET_DETECTION_DISABLED'
when: never
- - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH' # The Secret-Detection template already has a `secret_detection_default_branch` job
- when: never
- changes: *code-backstage-qa-patterns
- allow_failure: true
.reports:rules:gemnasium-dependency_scanning:
rules:
- - if: '$DEPENDENCY_SCANNING_DISABLED || $GITLAB_FEATURES !~ /\bdependency_scanning\b/ || $DS_EXCLUDED_ANALYZERS =~ /gemnasium([^-]|$)/'
+ - if: '$DEPENDENCY_SCANNING_DISABLED || $GITLAB_FEATURES !~ /\bdependency_scanning\b/ || $DS_EXCLUDED_ANALYZERS =~ /gemnasium([^-]|$)/ || $DS_DEFAULT_ANALYZERS !~ /gemnasium([^-]|$)/'
when: never
- - <<: *if-default-refs
- changes: *dependency-patterns
- allow_failure: true
+ - changes: *dependency-patterns
.reports:rules:bundler-audit-dependency_scanning:
rules:
- - if: '$DEPENDENCY_SCANNING_DISABLED || $GITLAB_FEATURES !~ /\bdependency_scanning\b/ || $DS_EXCLUDED_ANALYZERS =~ /bundler-audit/'
+ - if: '$DEPENDENCY_SCANNING_DISABLED || $GITLAB_FEATURES !~ /\bdependency_scanning\b/ || $DS_EXCLUDED_ANALYZERS =~ /bundler-audit/ || $DS_DEFAULT_ANALYZERS !~ /bundler-audit/'
when: never
- - <<: *if-default-refs
- changes: *bundler-patterns
- allow_failure: true
+ - changes: *bundler-patterns
.reports:rules:retire-js-dependency_scanning:
rules:
- - if: '$DEPENDENCY_SCANNING_DISABLED || $GITLAB_FEATURES !~ /\bdependency_scanning\b/ || $DS_EXCLUDED_ANALYZERS =~ /retire.js/'
+ - if: '$DEPENDENCY_SCANNING_DISABLED || $GITLAB_FEATURES !~ /\bdependency_scanning\b/ || $DS_EXCLUDED_ANALYZERS =~ /retire.js/ || $DS_DEFAULT_ANALYZERS !~ /retire.js/'
when: never
- - <<: *if-default-refs
- changes: *nodejs-patterns
- allow_failure: true
+ - changes: *nodejs-patterns
.reports:rules:gemnasium-python-dependency_scanning:
rules:
- - if: '$DEPENDENCY_SCANNING_DISABLED || $GITLAB_FEATURES !~ /\bdependency_scanning\b/ || $DS_EXCLUDED_ANALYZERS =~ /gemnasium-python/'
+ - if: '$DEPENDENCY_SCANNING_DISABLED || $GITLAB_FEATURES !~ /\bdependency_scanning\b/ || $DS_EXCLUDED_ANALYZERS =~ /gemnasium-python/ || $DS_DEFAULT_ANALYZERS !~ /gemnasium-python/'
when: never
- - <<: *if-default-refs
- changes: *python-patterns
- allow_failure: true
-
-.reports:rules:dast:
- rules:
- - if: '$DAST_DISABLED || $GITLAB_FEATURES !~ /\bdast\b/'
- when: never
- - <<: *if-dot-com-gitlab-org-merge-request
- changes: *frontend-patterns
- allow_failure: true
- - <<: *if-dot-com-gitlab-org-merge-request
- changes: *code-qa-patterns
- when: manual
- allow_failure: true
+ - changes: *python-patterns
.reports:rules:schedule-dast:
rules:
- if: '$DAST_DISABLED || $GITLAB_FEATURES !~ /\bdast\b/'
when: never
- - <<: *if-dot-com-ee-nightly-schedule
- allow_failure: true
+ - <<: *if-dot-com-ee-nightly-schedule-child-pipeline
.reports:rules:package_hunter-yarn:
rules:
@@ -1310,16 +1394,14 @@
.reports:rules:license_scanning:
rules:
- - if: '$LICENSE_SCANNING_DISABLED || $GITLAB_FEATURES !~ /\blicense_scanning\b/'
+ - if: '$LICENSE_MANAGEMENT_DISABLED || $GITLAB_FEATURES !~ /\blicense_scanning\b/'
when: never
- - <<: *if-default-refs
- changes: *code-backstage-qa-patterns
- allow_failure: true
+ - changes: *code-backstage-qa-patterns
################
# Review rules #
################
-.review:rules:review-build-cng:
+.review:rules:review-app-pipeline:
rules:
- <<: *if-not-ee
when: never
@@ -1336,6 +1418,22 @@
allow_failure: true
- <<: *if-dot-com-gitlab-org-schedule
+.review:rules:review-build-cng:
+ rules:
+ - <<: *if-not-ee
+ when: never
+ - <<: *if-dot-com-gitlab-org-merge-request
+ changes: *ci-review-patterns
+ - <<: *if-dot-com-gitlab-org-merge-request
+ changes: *frontend-patterns
+ - <<: *if-dot-com-gitlab-org-merge-request
+ changes: *code-patterns
+ allow_failure: true
+ - <<: *if-dot-com-gitlab-org-merge-request
+ changes: *qa-patterns
+ allow_failure: true
+ - <<: *if-dot-com-gitlab-org-schedule-child-pipeline
+
.review:rules:review-deploy:
rules:
- <<: *if-not-ee
@@ -1351,7 +1449,7 @@
- <<: *if-dot-com-gitlab-org-merge-request
changes: *qa-patterns
allow_failure: true
- - <<: *if-dot-com-gitlab-org-schedule
+ - <<: *if-dot-com-gitlab-org-schedule-child-pipeline
allow_failure: true
.review:rules:review-performance:
@@ -1368,7 +1466,7 @@
- <<: *if-dot-com-gitlab-org-merge-request
changes: *code-qa-patterns
allow_failure: true
- - <<: *if-dot-com-gitlab-org-schedule
+ - <<: *if-dot-com-gitlab-org-schedule-child-pipeline
allow_failure: true
.review:rules:review-delete-deployment:
@@ -1390,7 +1488,7 @@
- <<: *if-dot-com-gitlab-org-merge-request
changes: *code-qa-patterns
allow_failure: true
- - <<: *if-dot-com-ee-schedule
+ - <<: *if-dot-com-ee-schedule-child-pipeline
allow_failure: true
# The rule needs to be duplicated between `on_success` and `on_failure`
@@ -1418,9 +1516,9 @@
- <<: *if-dot-com-gitlab-org-merge-request
changes: *code-qa-patterns
when: on_failure
- - <<: *if-dot-com-ee-schedule
+ - <<: *if-dot-com-ee-schedule-child-pipeline
when: on_success
- - <<: *if-dot-com-ee-schedule
+ - <<: *if-dot-com-ee-schedule-child-pipeline
when: on_failure
.review:rules:review-qa-all:
@@ -1434,7 +1532,7 @@
- <<: *if-dot-com-gitlab-org-merge-request
changes: *qa-patterns
allow_failure: true
- - <<: *if-dot-com-ee-nightly-schedule
+ - <<: *if-dot-com-ee-nightly-schedule-child-pipeline
allow_failure: true
# The rule needs to be duplicated between `on_success` and `on_failure`
@@ -1456,10 +1554,10 @@
changes: *qa-patterns
when: on_failure
allow_failure: true
- - <<: *if-dot-com-ee-nightly-schedule
+ - <<: *if-dot-com-ee-nightly-schedule-child-pipeline
when: on_success
allow_failure: true
- - <<: *if-dot-com-ee-nightly-schedule
+ - <<: *if-dot-com-ee-nightly-schedule-child-pipeline
when: on_failure
allow_failure: true
@@ -1471,7 +1569,7 @@
changes: *code-qa-patterns
when: manual
allow_failure: true
- - <<: *if-dot-com-gitlab-org-schedule
+ - <<: *if-dot-com-gitlab-org-schedule-child-pipeline
allow_failure: true
.review:rules:review-stop:
@@ -1534,6 +1632,17 @@
changes: *code-backstage-patterns
when: on_success
+.setup:rules:add-jh-folder:
+ rules:
+ - <<: *if-not-ee
+ when: never
+ - <<: *if-jh
+ when: never
+ - <<: *if-merge-request-labels-as-if-jh
+ - <<: *if-merge-request-labels-run-all-rspec
+ - changes: *code-backstage-qa-patterns
+ - changes: *startup-css-patterns
+
#######################
# Test metadata rules #
#######################
@@ -1541,7 +1650,7 @@
rules:
- changes: *code-backstage-patterns
when: on_success
- - <<: *if-merge-request-title-run-all-rspec
+ - <<: *if-merge-request-labels-run-all-rspec
.test-metadata:rules:update-tests-metadata:
rules:
diff --git a/.gitlab/ci/setup.gitlab-ci.yml b/.gitlab/ci/setup.gitlab-ci.yml
index 60a1ad54cff..eb7a5afad3d 100644
--- a/.gitlab/ci/setup.gitlab-ci.yml
+++ b/.gitlab/ci/setup.gitlab-ci.yml
@@ -101,3 +101,19 @@ detect-tests as-if-foss:
MATCHED_TESTS_FILE: tmp/matching_foss_tests.txt
before_script:
- '[ "$FOSS_ONLY" = "1" ] && rm -rf ee/ qa/spec/ee/ qa/qa/specs/features/ee/ qa/qa/ee/ qa/qa/ee.rb'
+
+add-jh-folder:
+ extends: .setup:rules:add-jh-folder
+ image: ${GITLAB_DEPENDENCY_PROXY}alpine:edge
+ stage: prepare
+ before_script:
+ - apk add --no-cache --update curl bash
+ script:
+ - curl --location -o "jh-folder.tar.gz" "https://gitlab.com/gitlab-jh/gitlab/-/archive/main-jh/gitlab-main-jh.tar.gz?path=jh"
+ - tar -xf "jh-folder.tar.gz"
+ - mv gitlab-main-jh-jh/jh/ ./
+ - ls -l jh/
+ artifacts:
+ expire_in: 2d
+ paths:
+ - jh/
diff --git a/.gitlab/ci/static-analysis.gitlab-ci.yml b/.gitlab/ci/static-analysis.gitlab-ci.yml
index 1394085b6e4..85df68e9030 100644
--- a/.gitlab/ci/static-analysis.gitlab-ci.yml
+++ b/.gitlab/ci/static-analysis.gitlab-ci.yml
@@ -35,6 +35,17 @@ static-analysis:
paths:
- tmp/feature_flags/
+static-analysis-with-database:
+ extends:
+ - .static-analysis-base
+ - .static-analysis:rules:ee-and-foss
+ - .use-pg12
+ stage: test
+ script:
+ - bundle exec rake lint:static_verification_with_database
+ variables:
+ SETUP_DB: "true"
+
static-analysis as-if-foss:
extends:
- static-analysis
diff --git a/.gitlab/ci/test-metadata.gitlab-ci.yml b/.gitlab/ci/test-metadata.gitlab-ci.yml
index ac719977975..2d96fb6d4b0 100644
--- a/.gitlab/ci/test-metadata.gitlab-ci.yml
+++ b/.gitlab/ci/test-metadata.gitlab-ci.yml
@@ -29,8 +29,7 @@ update-tests-metadata:
- retrieve-tests-metadata
- setup-test-env
- rspec migration pg12
- - rspec frontend_fixture
- - rspec-ee frontend_fixture
+ - rspec-all frontend_fixture
- rspec unit pg12
- rspec integration pg12
- rspec system pg12
diff --git a/.gitlab/issue_templates/Feature Flag Roll Out.md b/.gitlab/issue_templates/Feature Flag Roll Out.md
index 1576f6e8f53..00b396bac4e 100644
--- a/.gitlab/issue_templates/Feature Flag Roll Out.md
+++ b/.gitlab/issue_templates/Feature Flag Roll Out.md
@@ -24,26 +24,6 @@ Are there any other stages or teams involved that need to be kept in the loop?
- The Delivery Team
-->
-## The Rollout Plan
-
-- Partial Rollout on GitLab.com with testing groups
-- Rollout on GitLab.com for a certain period (How long)
-- Percentage Rollout on GitLab.com
-- Rollout Feature for everyone as soon as it's ready
-
-<!-- Which dashboards from https://dashboards.gitlab.net are most relevant? Sentry errors reports can also be useful to review -->
-
-## Testing Groups/Projects/Users
-
-<!-- If applicable, any groups/projects that are happy to have this feature turned on early. Some organizations may wish to test big changes they are interested in with a small subset of users ahead of time for example. -->
-
-- `gitlab-org/gitlab` project
-- `gitlab-org/gitlab-foss` project
-- `gitlab-com/www-gitlab-com` project
-- `gitlab-org`/`gitlab-com` groups
-- ...
-
-
## Expectations
### What are we expecting to happen?
@@ -62,17 +42,30 @@ Are there any other stages or teams involved that need to be kept in the loop?
### Rollout on non-production environments
-- [ ] Ensure that the feature MRs have been deployed to non-production environments.
+- Ensure that the feature MRs have been deployed to non-production environments.
- [ ] `/chatops run auto_deploy status <merge-commit-of-your-feature>`
- [ ] Enable the feature globally on non-production environments.
- [ ] `/chatops run feature set <feature-flag-name> true --dev`
- [ ] `/chatops run feature set <feature-flag-name> true --staging`
- [ ] Verify that the feature works as expected. Posting the QA result in this issue is preferable.
-### Preparation before production rollout
+### Specific rollout on production
-- [ ] Ensure that the feature MRs have been deployed to both production and canary.
+- Ensure that the feature MRs have been deployed to both production and canary.
- [ ] `/chatops run auto_deploy status <merge-commit-of-your-feature>`
+- If you're using [project-actor](https://docs.gitlab.com/ee/development/feature_flags/#feature-actors), you must enable the feature on these entries:
+ - [ ] `/chatops run feature set --project=gitlab-org/gitlab <feature-flag-name> true`
+ - [ ] `/chatops run feature set --project=gitlab-org/gitlab-foss <feature-flag-name> true`
+ - [ ] `/chatops run feature set --project=gitlab-com/www-gitlab-com <feature-flag-name> true`
+- If you're using [group-actor](https://docs.gitlab.com/ee/development/feature_flags/#feature-actors), you must enable the feature on these entries:
+ - [ ] `/chatops run feature set --group=gitlab-org <feature-flag-name> true`
+ - [ ] `/chatops run feature set --group=gitlab-com <feature-flag-name> true`
+- If you're using [user-actor](https://docs.gitlab.com/ee/development/feature_flags/#feature-actors), you must enable the feature on these entries:
+ - [ ] `/chatops run feature set --user=<your-username> <feature-flag-name> true`
+- [ ] Verify that the feature works on the specific entries. Posting the QA result in this issue is preferable.
+
+### Preparation before global rollout
+
- [ ] Check if the feature flag change needs to be accompanied with a
[change management issue](https://about.gitlab.com/handbook/engineering/infrastructure/change-management/#feature-flags-and-the-change-management-process).
Cross link the issue here if it does.
@@ -86,19 +79,13 @@ Are there any other stages or teams involved that need to be kept in the loop?
All `/chatops` commands that target production should be done in the `#production` slack channel for visibility.
-- [ ] Confirm the feature flag is enabled on `staging` without incident
-- [ ] Roll out the feature to targeted testing projects/groups first
- - [ ] `/chatops run feature set --project=gitlab-org/gitlab <feature-flag-name> true`
- - [ ] `/chatops run feature set --project=gitlab-org/gitlab-foss <feature-flag-name> true`
- - [ ] `/chatops run feature set --project=gitlab-com/www-gitlab-com <feature-flag-name> true`
-
- [ ] [Incrementally roll out](https://docs.gitlab.com/ee/development/feature_flags/controls.html#process) the feature.
- 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>`
-- [ ] Verify the change has the desired outcome with the limited rollout before enabling the feature globally on production.
-- [ ] Enable the feature globally on production environment. `/chatops run feature set <feature-flag-name> true`
+ - Enable the feature globally on production environment.
+ - [ ] `/chatops run feature set <feature-flag-name> true`
- [ ] Announce on [the feature issue](ISSUE LINK) that the feature has been globally enabled.
- [ ] 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 476ee14a632..0d822945798 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
@@ -109,7 +109,7 @@ Geo secondary sites have a [Geo tracking database](https://gitlab.com/gitlab-org
bin/rake geo:db:migrate
```
-- [ ] Be sure to commit the relevant changes in `ee/db/geo/schema.rb`
+- [ ] Be sure to commit the relevant changes in `ee/db/geo/structure.sql`
### Add verification state fields on the Geo primary site
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 aef983f6495..00a71fa406e 100644
--- a/.gitlab/issue_templates/Geo Replicate a new blob type.md
+++ b/.gitlab/issue_templates/Geo Replicate a new blob type.md
@@ -110,7 +110,7 @@ Geo secondary sites have a [Geo tracking database](https://gitlab.com/gitlab-org
bin/rake geo:db:migrate
```
-- [ ] Be sure to commit the relevant changes in `ee/db/geo/schema.rb`
+- [ ] Be sure to commit the relevant changes in `ee/db/geo/structure.sql`
### Add verification state fields on the Geo primary site
diff --git a/.gitlab/issue_templates/Navigation - Left Sidebar Proposals.md b/.gitlab/issue_templates/Navigation - Left Sidebar Proposals.md
index 57d6d12267c..e9e510da11e 100644
--- a/.gitlab/issue_templates/Navigation - Left Sidebar Proposals.md
+++ b/.gitlab/issue_templates/Navigation - Left Sidebar Proposals.md
@@ -8,8 +8,7 @@
- [ ] If your proposal includes changes to the top-level menu items within the left sidebar, engage the [Foundations Product Design Manager](https://about.gitlab.com/handbook/product/categories/#foundations-group) for approval. The Foundations DRI will work with UX partners in product design, research, and technical writing, as applicable.
- [ ] Follow the [product development workflow](https://about.gitlab.com/handbook/product-development-flow/#validation-phase-2-problem-validation) validation process to ensure you are solving a well understood problem and that the proposed change is understandable and non-disruptive to users. Navigation-specific research is strongly encouraged.
-- [ ] Engage the [Editor](https://about.gitlab.com/handbook/engineering/development/dev/create-editor/) team to ensure your proposal is in alignment with holistic changes happening to the left side bar.
+- [ ] Engage the [Foundations](https://about.gitlab.com/handbook/product/categories/#foundations-group) team to ensure your proposal is in alignment with holistic changes happening to the left side bar.
- [ ] Consider whether you need to communicate the change somehow, or if you will have an interim period in the UI where your nav item will live in more than one place.
-- [ ] Once implemented, update this [navigation map in Mural](https://app.mural.co/t/gitlab2474/m/gitlab2474/1589571490215/261462d0beb3043979374623710d3f2d6cfec1cb) with your navigation change.
/label ~UX ~"UI text" ~"documentation" ~"documentation" ~"Category:Navigation & Settings" ~"Category:Foundations" ~navigation
diff --git a/.gitlab/merge_request_templates/Deprecations.md b/.gitlab/merge_request_templates/Deprecations.md
new file mode 100644
index 00000000000..8431e9ca393
--- /dev/null
+++ b/.gitlab/merge_request_templates/Deprecations.md
@@ -0,0 +1,82 @@
+<!-- Set the correct label and milestone using autocomplete for guidance. Please @mention only the DRI(s) for each stage or group rather than an entire department. -->
+
+/label ~"release post" ~"release post item" ~"Technical Writing" ~"devops::" ~"group::"
+/milestone %
+/assign `@PM`
+
+**Be sure to link this MR to the relevant deprecation issue(s).**
+
+**By the 10th**: Assign this MR to these team members as Reviewer and for Approval (optional unless noted as required):
+
+- Product Marketing: `@PMM`
+- Product Designer(s): `@ProductDesigners`
+- Group Manager or Director: `@manager`
+- Engineering Manager: `@EM` - Required
+
+**By 8:00 AM PDT 15th**: PM will assign this MR to the TW reviewer: `@PM`
+
+**By 11:59 PM PDT 15th**: TW Reviewer will perform final review and merge this MR to Master: `@TW`
+
+---
+
+Please review the [guidelines for deprecations](https://about.gitlab.com/handbook/marketing/blog/release-posts/#deprecations),
+as well as the process for [creating a deprecation entry](https://about.gitlab.com/handbook/marketing/blog/release-posts/#creating-a-deprecation-entry).
+They are frequently updated, and everyone should make sure they are aware of the current standards (PM, PMM, EM, and TW).
+
+## Links
+
+- Deprecation Issue:
+- Deprecation MR (optional):
+
+## PM release post item checklist
+
+- [ ] Set yourself as the Assignee.
+- [ ] Follow the process to [create a deprecation YAML file](https://about.gitlab.com/handbook/marketing/blog/release-posts/#creating-a-deprecation-entry).
+- [ ] Add reviewers by the 10th
+- [ ] When ready to be merged and not later than the 15th, add the ~ready label and @ message the TW for final review and merge.
+
+## Reviewers
+
+When the content is ready for review, it must be reviewed by Technical Writer and Engineering Manager, but can also be reviewed by
+Product Marketing, Product Design, and the Product Leaders for this area. Please use the
+[Reviewers for Merge Requests](https://docs.gitlab.com/ee/user/project/merge_requests/getting_started#reviewer)
+feature for all reviews. Reviewers will then `approve` the MR and remove themselves from Reviewers when their review is complete.
+
+- [ ] (Recommended) PMM
+- [ ] (Optional) Product Designer
+- [ ] (Optional) Group Manager or Director
+- [ ] Required review and approval: [Technical Writer designated to the corresponding DevOps stage/group](https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments).
+
+### Tech writer review
+
+After being added as a Reviewer to this merge request, the TW performs their review
+according to the criteria described below.
+
+Review deprecation MRs with a similar process as regular docs MRs. Add suggestions
+as needed, @ message the PM to inform them the first review is complete, and remove
+yourself as a reviewer if it's not ready for merge yet.
+
+<details>
+<summary>Expand for Details </summary>
+
+- [ ] Title:
+ - Length limit: 7 words (not including articles or prepositions).
+ - Capitalization: ensure the title is [sentence cased](https://design.gitlab.com/content/punctuation#case).
+ - No Markdown `` `code` `` formatting in the title, as it doesn't render correctly in the release post.
+- [ ] Consistency:
+ - Ensure that all resources (docs, deprecation, etc.) refer to the feature with the same term / feature name.
+- [ ] Content:
+ - Make sure the deprecation is accurate based on your understanding. Look for typos or grammar mistakes. Work with PM and PMM to ensure a consistent GitLab style and tone for messaging, based on other features and deprecations.
+ - Review use of whitespace and bullet lists. Will the deprecation item be easily scannable when published? Consider adding line breaks or breaking content into bullets if you have more than a few sentences.
+ - Make sure there aren't acronyms readers may not understand per <https://about.gitlab.com/handbook/communication/#writing-style-guidelines>.
+- [ ] Links:
+ - All links must be full URLs, as the deprecation YAML files are used in two different projects. Do not use relative links. The generated doc is an exception to the relative link rule and currently uses absolute links only.
+ - Make sure all links and anchors are correct. Do not link to the H1 (top) anchor on a docs page.
+- [ ] Code. Make sure any included code is wrapped in code blocks.
+- [ ] Capitalization. Make sure to capitalize feature names. Stay consistent with the Documentation Style Guidance on [Capitalization](https://docs.gitlab.com/ee/development/documentation/styleguide.html#capitalization).
+- [ ] Blank spaces. Remove unnecessary spaces (end of line spaces, double spaces, extra blank lines, and lines with only spaces).
+
+</details>
+
+When the PM indicates it is ready for merge, all issues have been addressed merge this MR.
+ - You must merge this MR by the 15th so the Release Post TW lead can run the [deprecations in Docs rake task](https://about.gitlab.com/handbook/marketing/blog/release-posts/#update-the-deprecations-doc) on the 16th
diff --git a/.gitpod.yml b/.gitpod.yml
index e9cc798ed19..d546cc7f64a 100644
--- a/.gitpod.yml
+++ b/.gitpod.yml
@@ -16,8 +16,7 @@ tasks:
# GitLab
[[ -d /workspace/gitlab ]] && ln -fs /workspace/gitlab /workspace/gitlab-development-kit/gitlab
mv /workspace/gitlab-development-kit/secrets.yml /workspace/gitlab-development-kit/gitlab/config
- # update gdk.yml
- gdk config set gitlab.rails.hostname $(gp url 3000 | sed -e 's+^http[s]*://++')
+ # ensure gdk.yml has correct instance settings
gdk config set gitlab.rails.port 443
gdk config set gitlab.rails.https.enabled true
# reconfigure GDK
@@ -42,6 +41,13 @@ tasks:
echo "$(date) – Updating GDK" | tee -a /workspace/startup.log
gdk update
fi
+ # ensure gdk.yml has correct instance settings
+ gdk config set gitlab.rails.hostname $(gp url 3000 | sed -e 's+^http[s]*://++')
+ gdk config set gitlab.rails.port 443
+ gdk config set gitlab.rails.https.enabled true
+ # reconfigure GDK
+ echo "$(date) – Reconfiguring GDK" | tee -a /workspace/startup.log
+ gdk reconfigure
# start GDK
echo "$(date) – Starting GDK" | tee -a /workspace/startup.log
export DEV_SERVER_PUBLIC_ADDR=$(gp url 3808)
diff --git a/.rubocop.yml b/.rubocop.yml
index 141ba874b21..4bf2392867d 100644
--- a/.rubocop.yml
+++ b/.rubocop.yml
@@ -28,7 +28,6 @@ AllCops:
- 'node_modules/**/*'
- 'db/fixtures/**/*'
- 'db/schema.rb'
- - 'ee/db/geo/schema.rb'
- 'tmp/**/*'
- 'bin/**/*'
- 'generator_templates/**/*'
diff --git a/.rubocop_manual_todo.yml b/.rubocop_manual_todo.yml
index 2cbfeec1048..a646f6ec950 100644
--- a/.rubocop_manual_todo.yml
+++ b/.rubocop_manual_todo.yml
@@ -296,7 +296,6 @@ Rails/TimeZone:
- 'spec/lib/gitlab/graphql_logger_spec.rb'
- 'spec/lib/gitlab/graphs/commits_spec.rb'
- 'spec/lib/gitlab/import_export/project/relation_factory_spec.rb'
- - 'spec/lib/gitlab/instrumentation_helper_spec.rb'
- 'spec/lib/gitlab/json_logger_spec.rb'
- 'spec/lib/gitlab/lfs_token_spec.rb'
- 'spec/lib/gitlab/log_timestamp_formatter_spec.rb'
@@ -384,10 +383,8 @@ RSpec/TimecopFreeze:
- 'spec/lib/gitlab/checks/timed_logger_spec.rb'
- 'spec/lib/gitlab/cycle_analytics/stage_summary_spec.rb'
- 'spec/lib/gitlab/cycle_analytics/usage_data_spec.rb'
- - 'spec/lib/gitlab/instrumentation_helper_spec.rb'
- 'spec/lib/gitlab/omniauth_logging/json_formatter_spec.rb'
- 'spec/lib/gitlab/puma_logging/json_formatter_spec.rb'
- - 'spec/lib/gitlab/sidekiq_logging/structured_logger_spec.rb'
- 'spec/lib/json_web_token/hmac_token_spec.rb'
- 'spec/tooling/rspec_flaky/flaky_example_spec.rb'
- 'spec/tooling/rspec_flaky/listener_spec.rb'
@@ -744,7 +741,6 @@ RSpec/AnyInstanceOf:
- 'spec/policies/ci/pipeline_policy_spec.rb'
- 'spec/presenters/gitlab/blame_presenter_spec.rb'
- 'spec/presenters/merge_request_presenter_spec.rb'
- - 'spec/requests/api/api_spec.rb'
- 'spec/requests/api/ci/runner/jobs_artifacts_spec.rb'
- 'spec/requests/api/ci/runner/jobs_put_spec.rb'
- 'spec/requests/api/ci/runner/jobs_request_post_spec.rb'
@@ -1769,7 +1765,6 @@ Gitlab/NamespacedClass:
- 'app/workers/pages_domain_ssl_renewal_worker.rb'
- 'app/workers/pages_domain_verification_cron_worker.rb'
- 'app/workers/pages_domain_verification_worker.rb'
- - 'app/workers/pages_remove_worker.rb'
- 'app/workers/pages_transfer_worker.rb'
- 'app/workers/pages_update_configuration_worker.rb'
- 'app/workers/pages_worker.rb'
@@ -2589,13 +2584,9 @@ Rails/IncludeUrlHelper:
- 'app/models/integrations/youtrack.rb'
- 'app/presenters/alert_management/alert_presenter.rb'
- 'app/presenters/ci/pipeline_presenter.rb'
- - 'app/presenters/clusters/cluster_presenter.rb'
- 'app/presenters/environment_presenter.rb'
- 'app/presenters/gitlab/blame_presenter.rb'
- - 'app/presenters/group_clusterable_presenter.rb'
- - 'app/presenters/instance_clusterable_presenter.rb'
- 'app/presenters/merge_request_presenter.rb'
- - 'app/presenters/project_clusterable_presenter.rb'
- 'app/presenters/project_presenter.rb'
- 'app/presenters/prometheus_alert_presenter.rb'
- 'app/presenters/release_presenter.rb'
@@ -2607,7 +2598,6 @@ Rails/IncludeUrlHelper:
- 'ee/spec/lib/banzai/filter/cross_project_issuable_information_filter_spec.rb'
- 'ee/spec/lib/banzai/filter/issuable_state_filter_spec.rb'
- 'lib/gitlab/ci/badge/metadata.rb'
- - 'lib/gitlab/email/message/in_product_marketing/helper.rb'
- 'spec/helpers/merge_requests_helper_spec.rb'
- 'spec/helpers/nav/top_nav_helper_spec.rb'
- 'spec/helpers/notify_helper_spec.rb'
diff --git a/.stylelintrc b/.stylelintrc
index a4331811eb3..488e34dd7d4 100644
--- a/.stylelintrc
+++ b/.stylelintrc
@@ -13,6 +13,7 @@
"./scripts/frontend/stylelint/stylelint-utility-classes.js",
],
"rules":{
+ "at-rule-disallowed-list": ["extend"],
"max-nesting-depth": [
3,
{
diff --git a/CHANGELOG.md b/CHANGELOG.md
index cf05ea999dc..362ebae3c91 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -550,6 +550,39 @@ entry.
- [Remove the FF ci_reset_bridge_with_subsequent_jobs](gitlab-org/gitlab@a4a75095b9b0250d0b1bdadea90c8a4cd24449b2) ([merge request](gitlab-org/gitlab!68295))
- [Removes ci_same_stage_job_needs ff](gitlab-org/gitlab@5e509cf7aa90041a541b19dda563120a359f0bf9) ([merge request](gitlab-org/gitlab!68041))
+## 14.2.5 (2021-09-30)
+
+### Security (28 changes)
+
+- [Require password param for 2FA changes](gitlab-org/security/gitlab@5693760a3edf82774a4e19b9bb561be87316be54) ([merge request](gitlab-org/security/gitlab!1815))
+- [Fix permissions check on project members import](gitlab-org/security/gitlab@f9b4200427833e370638aa63851d6801a40c404c) ([merge request](gitlab-org/security/gitlab!1859))
+- [Respect disabled import sources when initiating import via API](gitlab-org/security/gitlab@3c9af055ece281fcaab0b8dcc277e0ce9133ad31) ([merge request](gitlab-org/security/gitlab!1847))
+- [Return 404 if model id wasn't passed to UploadsController](gitlab-org/security/gitlab@dd4616362040d2b812d69ff2ecf78e70ff4b9ae3) ([merge request](gitlab-org/security/gitlab!1844))
+- [Scrub artifacts signed URL in SendEntry logs](gitlab-org/security/gitlab@41d275bb73943ba6f970d6678b49c9336194af35) ([merge request](gitlab-org/security/gitlab!1841))
+- [Prevent double-impersonation and impersonation breakout](gitlab-org/security/gitlab@c0ab498adda057f4d87969d74c32a3ea95df297c) ([merge request](gitlab-org/security/gitlab!1835))
+- [Clear session access tokens when starting/stopping impersonation](gitlab-org/security/gitlab@fd39d88b348d525818820d2496afe08612420023) ([merge request](gitlab-org/security/gitlab!1832))
+- [Use validated URL when sending request to Gitea Importer](gitlab-org/security/gitlab@328e3c726c693b32666e0fb32eda0b7a6f22d8ad) ([merge request](gitlab-org/security/gitlab!1821))
+- [Fix XSS in Jira link](gitlab-org/security/gitlab@868d8b9c4a1e9e9019a7ff51da11f75051e452c3) ([merge request](gitlab-org/security/gitlab!1817)) **GitLab Enterprise Edition**
+- [Fix fogbugz importer DNS Rebind SSRF](gitlab-org/security/gitlab@4f4b5a15a3508084f921442b3a7f42ba0448f1bb) ([merge request](gitlab-org/security/gitlab!1681))
+- [Remove related project access tokens when a project is deleted](gitlab-org/security/gitlab@282e81198f80f1fda912da5bc6f671d778b19ca9) ([merge request](gitlab-org/security/gitlab!1811))
+- [Require group admin access to list pending invites](gitlab-org/security/gitlab@1ce85345787025222c915fe5fa314bad8994b6ba) ([merge request](gitlab-org/security/gitlab!1720))
+- [Do not export and import repository_size_limit](gitlab-org/security/gitlab@359f14e41dfc355a13041cdf1dbcd082c254200c) ([merge request](gitlab-org/security/gitlab!1769))
+- [Escapes MR approval rule names correctly](gitlab-org/security/gitlab@d84739982599197ff337d69d818634544270e142) ([merge request](gitlab-org/security/gitlab!1808))
+- [Filter shared groups autocomplete by permitted](gitlab-org/security/gitlab@3a2b4c7ff1eb2ba3e84840ba2800c13d6491d726) ([merge request](gitlab-org/security/gitlab!1805)) **GitLab Enterprise Edition**
+- [Require access token for git when 2fa is required](gitlab-org/security/gitlab@deb4e7e5f941c82450d382c1b85f6325e367394f) ([merge request](gitlab-org/security/gitlab!1795))
+- [Disable exporting pipeline triggers on project export](gitlab-org/security/gitlab@417761bb2f67f03bfe803163bad97da7b9fa088b) ([merge request](gitlab-org/security/gitlab!1789))
+- [Add pagination to dependencies API](gitlab-org/security/gitlab@2f84755ba54580df126054a561d8cc4731f936d3) ([merge request](gitlab-org/security/gitlab!1724)) **GitLab Enterprise Edition**
+- [Permission check issuable template API data](gitlab-org/security/gitlab@a90614e2efc813ca5f13a9aa9b51f13f0e8934aa) ([merge request](gitlab-org/security/gitlab!1786)) **GitLab Enterprise Edition**
+- [Apply account locking to password reset page](gitlab-org/security/gitlab@6bbd77c0748e59eacff51edb6264d6099ee14a38) ([merge request](gitlab-org/security/gitlab!1783))
+- [Enforce configured scopes for Oauth applications](gitlab-org/security/gitlab@a9f44bb19cbfc460cd05627a80ef17c39cdde86b) ([merge request](gitlab-org/security/gitlab!1780))
+- [Verify state before using errors from OAuth2 OmniAuth providers](gitlab-org/security/gitlab@6f70292d0fa3efbe99c44748a463df189830cc35) ([merge request](gitlab-org/security/gitlab!1777))
+- [Prevent moving epic issues to different group hierarchy](gitlab-org/security/gitlab@979d40003794014d5930709a257e9a5c75df10e6) ([merge request](gitlab-org/security/gitlab!1773)) **GitLab Enterprise Edition**
+- [Prevent showing not allowed subgroup epics](gitlab-org/security/gitlab@2f72e4062f6cd7256ffff31172b00c012a5910e1) ([merge request](gitlab-org/security/gitlab!1765)) **GitLab Enterprise Edition**
+- [Do not allow status checks to exist with external protected branches](gitlab-org/security/gitlab@dd08837d054c574f94f80e806cc7b49de342cc57) ([merge request](gitlab-org/security/gitlab!1762)) **GitLab Enterprise Edition**
+- [Fix GFM autocomplete xss](gitlab-org/security/gitlab@5afba618ef89fdce544f498a30e7366e3f6cb788) ([merge request](gitlab-org/security/gitlab!1747))
+- [Prohibit anonymous access for specific user API endpoint](gitlab-org/security/gitlab@a813bd8a8f07ffa0477efd3a3936b436e5ec6b17) ([merge request](gitlab-org/security/gitlab!1736))
+- [Fix denial-of-service attack in Markdown parser](gitlab-org/security/gitlab@f618ad9c104882ac5f707b162e8119805252019e) ([merge request](gitlab-org/security/gitlab!1729))
+
## 14.2.4 (2021-09-17)
### Fixed (2 changes)
@@ -1141,6 +1174,45 @@ entry.
- [Add helpful text to URL group validation and limit text](gitlab-org/gitlab@59a5a6266cb0d5434596170ffa36e4e74b8d2c2c) ([merge request](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/65369)) **GitLab Enterprise Edition**
- [Refactor external storage admin area configuration UI and docs](gitlab-org/gitlab@497ba4fc8f4ec1d234c9f5f1ec5c69712b8c7cb3) ([merge request](gitlab-org/gitlab!66219))
+## 14.1.7 (2021-09-30)
+
+### Security (28 changes)
+
+- [Require password param for 2FA changes](gitlab-org/security/gitlab@4e16401a77264ef3127f0bb314fa0abab11216c7) ([merge request](gitlab-org/security/gitlab!1816))
+- [Fix permissions check on project members import](gitlab-org/security/gitlab@be54b3f4890fa89d58cb02be79c65025f606bd6c) ([merge request](gitlab-org/security/gitlab!1860))
+- [Respect disabled import sources when initiating import via API](gitlab-org/security/gitlab@b76b6229c93447954efc5719e6dd61eb601afdc4) ([merge request](gitlab-org/security/gitlab!1848))
+- [Return 404 if model id wasn't passed to UploadsController](gitlab-org/security/gitlab@8ab1cfaafba21a9e90ef41677993af2afdcd920a) ([merge request](gitlab-org/security/gitlab!1845))
+- [Scrub artifacts signed URL in SendEntry logs](gitlab-org/security/gitlab@5bae93b2f085d5dac58e411bffb5ca518fe7df98) ([merge request](gitlab-org/security/gitlab!1842))
+- [Prevent double-impersonation and impersonation breakout](gitlab-org/security/gitlab@7c82d0f2a1dbfb0a23d6a5cdaee448307ffc6972) ([merge request](gitlab-org/security/gitlab!1836))
+- [Clear session access tokens when starting/stopping impersonation](gitlab-org/security/gitlab@a4d529eb7c8eeb3e9c42ae3d81514d79a905cdb7) ([merge request](gitlab-org/security/gitlab!1833))
+- [Use validated URL when sending request to Gitea Importer](gitlab-org/security/gitlab@b30536e6c9aa969c76bcd167f00db5a0e07ace7a) ([merge request](gitlab-org/security/gitlab!1820))
+- [Fix XSS in Jira link](gitlab-org/security/gitlab@9ace10c46744ee220c649d2da0eeb3e99216ee7d) ([merge request](gitlab-org/security/gitlab!1625)) **GitLab Enterprise Edition**
+- [Fix fogbugz importer DNS Rebind SSRF](gitlab-org/security/gitlab@9d7107665d6ed931ef4b2feeb0287bc71b89232c) ([merge request](gitlab-org/security/gitlab!1682))
+- [Remove related project access tokens when a project is deleted](gitlab-org/security/gitlab@b86096865949f07f6a2020603959117d9c84877b) ([merge request](gitlab-org/security/gitlab!1812))
+- [Require group admin access to list pending invites](gitlab-org/security/gitlab@404b344edd61b2f13c3498cd545c2b40165ee536) ([merge request](gitlab-org/security/gitlab!1721))
+- [Do not export and import repository_size_limit](gitlab-org/security/gitlab@56f563980f944f1a5e3935ad82070e6719cd5a0c) ([merge request](gitlab-org/security/gitlab!1768))
+- [Escapes MR approval rule names correctly](gitlab-org/security/gitlab@ea64f981ce70a0e1e6ee58e64a6007e82f48e071) ([merge request](gitlab-org/security/gitlab!1809))
+- [Filter shared groups autocomplete by permitted](gitlab-org/security/gitlab@59999ab27cba402589b27d204cf29678100e948b) ([merge request](gitlab-org/security/gitlab!1806)) **GitLab Enterprise Edition**
+- [Require access token for git when 2fa is required](gitlab-org/security/gitlab@6a4a75efd7685a69ffa7cc4c027c7058013cca45) ([merge request](gitlab-org/security/gitlab!1796))
+- [Disable exporting pipeline triggers on project export](gitlab-org/security/gitlab@8a8c78ed054def210013a849195939d7888fcf65) ([merge request](gitlab-org/security/gitlab!1790))
+- [Add pagination to dependencies API](gitlab-org/security/gitlab@2a963ad670c60d1f3078fdf446ea755c5862fa26) ([merge request](gitlab-org/security/gitlab!1725)) **GitLab Enterprise Edition**
+- [Permission check issuable template API data](gitlab-org/security/gitlab@9d95d13bc714e46b5e3697288c4b398cb5aee88b) ([merge request](gitlab-org/security/gitlab!1787)) **GitLab Enterprise Edition**
+- [Apply account locking to password reset page](gitlab-org/security/gitlab@47ee79b1983de886f5ebe04b2975c2e37aa938ce) ([merge request](gitlab-org/security/gitlab!1784))
+- [Enforce configured scopes for Oauth applications](gitlab-org/security/gitlab@acf2d894c91aa7fb72ea32b10e50e94441885399) ([merge request](gitlab-org/security/gitlab!1781))
+- [Verify state before using errors from OAuth2 OmniAuth providers](gitlab-org/security/gitlab@20073576508aa239e52d8ff911c1dfd3df8af670) ([merge request](gitlab-org/security/gitlab!1778))
+- [Prevent moving epic issues to different group hierarchy](gitlab-org/security/gitlab@93c6ec69b7bc6c9124a2a5350cebebb57f63a28f) ([merge request](gitlab-org/security/gitlab!1774)) **GitLab Enterprise Edition**
+- [Prevent showing not allowed subgroup epics](gitlab-org/security/gitlab@72a11e72425a033f3464d6ff12b4d06e12ec9faf) ([merge request](gitlab-org/security/gitlab!1766)) **GitLab Enterprise Edition**
+- [Do not allow status checks to exist with external protected branches](gitlab-org/security/gitlab@8f96c013ccbbe9c52b3f03fb0d247debb1b157a8) ([merge request](gitlab-org/security/gitlab!1763)) **GitLab Enterprise Edition**
+- [Fix GFM autocomplete xss](gitlab-org/security/gitlab@fd92dabddff5ae5d67a98aef5d858438520a2f06) ([merge request](gitlab-org/security/gitlab!1748))
+- [Prohibit anonymous access for specific user API endpoint](gitlab-org/security/gitlab@2e8a386430309a931dbbd47fba7540a53399ad64) ([merge request](gitlab-org/security/gitlab!1737))
+- [Fix denial-of-service attack in Markdown parser](gitlab-org/security/gitlab@5b6ed5212f880e2397dbea9ffc74cf0a35bd4411) ([merge request](gitlab-org/security/gitlab!1728))
+
+## 14.1.6 (2021-09-27)
+
+### Fixed (1 change)
+
+- [Fix Elastic::MigrationWorker current_migration (2nd attempt)](gitlab-org/gitlab@f07c7a5f173a2fc053247664f21c03d29df543a4) ([merge request](gitlab-org/gitlab!71187)) **GitLab Enterprise Edition**
+
## 14.1.5 (2021-09-02)
### Fixed (1 change)
@@ -1778,6 +1850,12 @@ entry.
- [Remove diffs gradual load feature flag](gitlab-org/gitlab@027d7c4327b5b6205a84281239027273517bf81b) ([merge request](gitlab-org/gitlab!55478))
- [Remove partial index for Hashed Storage migration](gitlab-org/gitlab@3ed017a1023d7b0941a7606b69e6caee8d22f15c) ([merge request](gitlab-org/gitlab!62920))
+## 14.0.11 (2021-09-23)
+
+### Fixed (1 change)
+
+- [Fix Elastic::MigrationWorker current_migration](gitlab-org/gitlab@0b72aace30bff0fda7a114862ec1e389ddaa5ead) ([merge request](gitlab-org/gitlab!71101)) **GitLab Enterprise Edition**
+
## 14.0.10 (2021-09-02)
No changes.
@@ -2543,6 +2621,10 @@ No changes.
- [Add missing metrics information](gitlab-org/gitlab@89cd7fe3b95323e635b2d73e08549b2e6153dc4d) ([merge request](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/61772/edit))
- [Track usage of the resolve UI](gitlab-org/gitlab@35c8e30fce288cecefcf2f7c0077d4608e696519) ([merge request](gitlab-org/gitlab!61654))
+## 13.12.12 (2021-09-21)
+
+No changes.
+
## 13.12.11 (2021-09-02)
No changes.
diff --git a/GITALY_SERVER_VERSION b/GITALY_SERVER_VERSION
index 8d8581ff18c..c98aa0f5258 100644
--- a/GITALY_SERVER_VERSION
+++ b/GITALY_SERVER_VERSION
@@ -1 +1 @@
-14.3.3 \ No newline at end of file
+4f0a07ba39f14adacf7d482128a5de2bb84f0eac
diff --git a/GITLAB_ELASTICSEARCH_INDEXER_VERSION b/GITLAB_ELASTICSEARCH_INDEXER_VERSION
index fb2c0766b7c..75249069675 100644
--- a/GITLAB_ELASTICSEARCH_INDEXER_VERSION
+++ b/GITLAB_ELASTICSEARCH_INDEXER_VERSION
@@ -1 +1 @@
-2.13.0
+2.16.0
diff --git a/GITLAB_KAS_VERSION b/GITLAB_KAS_VERSION
index 839845e0b6c..72f51351fcd 100644
--- a/GITLAB_KAS_VERSION
+++ b/GITLAB_KAS_VERSION
@@ -1 +1 @@
-14.3.3
+14.4.0
diff --git a/GITLAB_PAGES_VERSION b/GITLAB_PAGES_VERSION
index 372cf402c73..0a3db35b241 100644
--- a/GITLAB_PAGES_VERSION
+++ b/GITLAB_PAGES_VERSION
@@ -1 +1 @@
-1.44.0
+1.46.0
diff --git a/Gemfile b/Gemfile
index 39e61564968..1e6648df48b 100644
--- a/Gemfile
+++ b/Gemfile
@@ -2,7 +2,7 @@
source 'https://rubygems.org'
-gem 'rails', '~> 6.1.3.2'
+gem 'rails', '~> 6.1.4.1'
gem 'bootsnap', '~> 1.4.6'
@@ -92,7 +92,7 @@ gem 'net-ldap', '~> 0.16.3'
# API
gem 'grape', '~> 1.5.2'
-gem 'grape-entity', '~> 0.9.0'
+gem 'grape-entity', '~> 0.10.0'
gem 'rack-cors', '~> 1.0.6', require: 'rack/cors'
# GraphQL API
@@ -129,7 +129,7 @@ gem 'fog-local', '~> 0.6'
gem 'fog-openstack', '~> 1.0'
gem 'fog-rackspace', '~> 0.1.1'
gem 'fog-aliyun', '~> 0.3'
-gem 'gitlab-fog-azure-rm', '~> 1.1.1', require: false
+gem 'gitlab-fog-azure-rm', '~> 1.2.0', require: false
# for Google storage
gem 'google-api-client', '~> 0.33'
@@ -154,7 +154,7 @@ gem 'html-pipeline', '~> 2.13.2'
gem 'deckar01-task_list', '2.3.1'
gem 'gitlab-markup', '~> 1.7.1'
gem 'github-markup', '~> 1.7.0', require: 'github/markup'
-gem 'commonmarker', '~> 0.21'
+gem 'commonmarker', '~> 0.23.2'
gem 'kramdown', '~> 2.3.1'
gem 'RedCloth', '~> 4.3.2'
gem 'rdoc', '~> 6.3.2'
@@ -165,7 +165,7 @@ gem 'asciidoctor', '~> 2.0.10'
gem 'asciidoctor-include-ext', '~> 0.3.1', require: false
gem 'asciidoctor-plantuml', '~> 0.0.12'
gem 'asciidoctor-kroki', '~> 0.5.0', require: false
-gem 'rouge', '~> 3.26.0'
+gem 'rouge', '~> 3.26.1'
gem 'truncato', '~> 0.7.11'
gem 'bootstrap_form', '~> 4.2.0'
gem 'nokogiri', '~> 1.11.4'
@@ -195,10 +195,10 @@ gem 'state_machines-activerecord', '~> 0.8.0'
gem 'acts-as-taggable-on', '~> 7.0'
# Background jobs
-gem 'sidekiq', '~> 5.2.7'
+gem 'sidekiq', '~> 6.2.2'
gem 'sidekiq-cron', '~> 1.0'
gem 'redis-namespace', '~> 1.8.1'
-gem 'gitlab-sidekiq-fetcher', '0.5.6', require: 'sidekiq-reliable-fetch'
+gem 'gitlab-sidekiq-fetcher', '0.8.0', require: 'sidekiq-reliable-fetch'
# Cron Parser
gem 'fugit', '~> 1.2.1'
@@ -229,7 +229,7 @@ gem 'js_regex', '~> 3.7'
gem 'device_detector'
# Redis
-gem 'redis', '~> 4.1.4'
+gem 'redis', '~> 4.4.0'
gem 'connection_pool', '~> 2.0'
# Redis session store
@@ -341,7 +341,7 @@ group :development do
gem 'lefthook', '~> 0.7.0', require: false
gem 'solargraph', '~> 0.43', require: false
- gem 'letter_opener_web', '~> 1.4.0'
+ gem 'letter_opener_web', '~> 1.4.1'
# Better errors handler
gem 'better_errors', '~> 2.9.0'
@@ -355,7 +355,7 @@ group :development, :test do
gem 'bullet', '~> 6.1.3'
gem 'pry-byebug'
gem 'pry-rails', '~> 0.3.9'
- gem 'pry-shell', '~> 0.4.0'
+ gem 'pry-shell', '~> 0.5.0'
gem 'awesome_print', require: false
@@ -424,7 +424,7 @@ group :test do
gem 'webmock', '~> 3.9.1'
gem 'rails-controller-testing'
gem 'concurrent-ruby', '~> 1.1'
- gem 'test-prof', '~> 0.12.0'
+ gem 'test-prof', '~> 1.0.7'
gem 'rspec_junit_formatter'
gem 'guard-rspec'
@@ -474,7 +474,7 @@ end
gem 'spamcheck', '~> 0.1.0'
# Gitaly GRPC protocol definitions
-gem 'gitaly', '~> 14.3.0.pre.rc1'
+gem 'gitaly', '~> 14.3.0.pre.rc2'
# KAS GRPC protocol definitions
gem 'kas-grpc', '~> 0.0.2'
diff --git a/Gemfile.lock b/Gemfile.lock
index d62e948e636..a6b7f598ec6 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -11,63 +11,63 @@ GEM
RedCloth (4.3.2)
acme-client (2.0.6)
faraday (>= 0.17, < 2.0.0)
- actioncable (6.1.3.2)
- actionpack (= 6.1.3.2)
- activesupport (= 6.1.3.2)
+ actioncable (6.1.4.1)
+ actionpack (= 6.1.4.1)
+ activesupport (= 6.1.4.1)
nio4r (~> 2.0)
websocket-driver (>= 0.6.1)
- actionmailbox (6.1.3.2)
- actionpack (= 6.1.3.2)
- activejob (= 6.1.3.2)
- activerecord (= 6.1.3.2)
- activestorage (= 6.1.3.2)
- activesupport (= 6.1.3.2)
+ actionmailbox (6.1.4.1)
+ actionpack (= 6.1.4.1)
+ activejob (= 6.1.4.1)
+ activerecord (= 6.1.4.1)
+ activestorage (= 6.1.4.1)
+ activesupport (= 6.1.4.1)
mail (>= 2.7.1)
- actionmailer (6.1.3.2)
- actionpack (= 6.1.3.2)
- actionview (= 6.1.3.2)
- activejob (= 6.1.3.2)
- activesupport (= 6.1.3.2)
+ actionmailer (6.1.4.1)
+ actionpack (= 6.1.4.1)
+ actionview (= 6.1.4.1)
+ activejob (= 6.1.4.1)
+ activesupport (= 6.1.4.1)
mail (~> 2.5, >= 2.5.4)
rails-dom-testing (~> 2.0)
- actionpack (6.1.3.2)
- actionview (= 6.1.3.2)
- activesupport (= 6.1.3.2)
+ actionpack (6.1.4.1)
+ actionview (= 6.1.4.1)
+ activesupport (= 6.1.4.1)
rack (~> 2.0, >= 2.0.9)
rack-test (>= 0.6.3)
rails-dom-testing (~> 2.0)
rails-html-sanitizer (~> 1.0, >= 1.2.0)
- actiontext (6.1.3.2)
- actionpack (= 6.1.3.2)
- activerecord (= 6.1.3.2)
- activestorage (= 6.1.3.2)
- activesupport (= 6.1.3.2)
+ actiontext (6.1.4.1)
+ actionpack (= 6.1.4.1)
+ activerecord (= 6.1.4.1)
+ activestorage (= 6.1.4.1)
+ activesupport (= 6.1.4.1)
nokogiri (>= 1.8.5)
- actionview (6.1.3.2)
- activesupport (= 6.1.3.2)
+ actionview (6.1.4.1)
+ activesupport (= 6.1.4.1)
builder (~> 3.1)
erubi (~> 1.4)
rails-dom-testing (~> 2.0)
rails-html-sanitizer (~> 1.1, >= 1.2.0)
- activejob (6.1.3.2)
- activesupport (= 6.1.3.2)
+ activejob (6.1.4.1)
+ activesupport (= 6.1.4.1)
globalid (>= 0.3.6)
- activemodel (6.1.3.2)
- activesupport (= 6.1.3.2)
- activerecord (6.1.3.2)
- activemodel (= 6.1.3.2)
- activesupport (= 6.1.3.2)
+ activemodel (6.1.4.1)
+ activesupport (= 6.1.4.1)
+ activerecord (6.1.4.1)
+ activemodel (= 6.1.4.1)
+ activesupport (= 6.1.4.1)
activerecord-explain-analyze (0.1.0)
activerecord (>= 4)
pg
- activestorage (6.1.3.2)
- actionpack (= 6.1.3.2)
- activejob (= 6.1.3.2)
- activerecord (= 6.1.3.2)
- activesupport (= 6.1.3.2)
+ activestorage (6.1.4.1)
+ actionpack (= 6.1.4.1)
+ activejob (= 6.1.4.1)
+ activerecord (= 6.1.4.1)
+ activesupport (= 6.1.4.1)
marcel (~> 1.0.0)
- mini_mime (~> 1.0.2)
- activesupport (6.1.3.2)
+ mini_mime (>= 1.1.0)
+ activesupport (6.1.4.1)
concurrent-ruby (~> 1.0, >= 1.0.2)
i18n (>= 1.6, < 2)
minitest (>= 5.1)
@@ -200,8 +200,7 @@ GEM
open4 (~> 1.3)
coderay (1.1.3)
colored2 (3.1.2)
- commonmarker (0.21.0)
- ruby-enum (~> 0.5)
+ commonmarker (0.23.2)
concurrent-ruby (1.1.9)
connection_pool (2.2.2)
contracts (0.11.0)
@@ -453,7 +452,7 @@ GEM
rails (>= 3.2.0)
git (1.7.0)
rchardet (~> 1.8)
- gitaly (14.3.0.pre.rc1)
+ gitaly (14.3.0.pre.rc2)
grpc (~> 1.0)
github-markup (1.7.0)
gitlab (4.16.1)
@@ -468,7 +467,7 @@ GEM
activesupport (>= 3.0)
request_store (>= 1.0)
scientist (~> 1.6, >= 1.6.0)
- gitlab-fog-azure-rm (1.1.1)
+ gitlab-fog-azure-rm (1.2.0)
azure-storage-blob (~> 2.0)
azure-storage-common (~> 2.0)
fog-core (= 2.1.0)
@@ -491,8 +490,8 @@ GEM
addressable (~> 2.7)
omniauth (~> 1.9)
openid_connect (~> 1.2)
- gitlab-sidekiq-fetcher (0.5.6)
- sidekiq (~> 5)
+ gitlab-sidekiq-fetcher (0.8.0)
+ sidekiq (~> 6.1)
gitlab-styles (6.3.0)
rubocop (~> 0.91, >= 0.91.1)
rubocop-gitlab-security (~> 0.1.1)
@@ -506,8 +505,8 @@ GEM
omniauth (~> 1.3)
pyu-ruby-sasl (>= 0.0.3.3, < 0.1)
rubyntlm (~> 0.5)
- globalid (0.4.2)
- activesupport (>= 4.2.0)
+ globalid (0.5.2)
+ activesupport (>= 5.0)
gon (6.4.0)
actionpack (>= 3.0.20)
i18n (>= 0.7)
@@ -543,7 +542,7 @@ GEM
mustermann-grape (~> 1.0.0)
rack (>= 1.3.0)
rack-accept
- grape-entity (0.9.0)
+ grape-entity (0.10.0)
activesupport (>= 3.0.0)
multi_json (>= 1.3.2)
grape-path-helpers (1.7.0)
@@ -700,7 +699,7 @@ GEM
lefthook (0.7.5)
letter_opener (1.7.0)
launchy (~> 2.2)
- letter_opener_web (1.4.0)
+ letter_opener_web (1.4.1)
actionmailer (>= 3.2)
letter_opener (~> 1.0)
railties (>= 3.2)
@@ -747,7 +746,7 @@ GEM
mime-types-data (3.2020.0512)
mini_histogram (0.3.1)
mini_magick (4.10.1)
- mini_mime (1.0.2)
+ mini_mime (1.1.1)
mini_portile2 (2.5.3)
minitest (5.11.3)
mixlib-cli (2.1.8)
@@ -784,7 +783,7 @@ GEM
net-ssh (>= 2.6.5, < 7.0.0)
net-ssh (6.0.0)
netrc (0.11.0)
- nio4r (2.5.4)
+ nio4r (2.5.8)
no_proxy_fix (0.1.2)
nokogiri (1.11.7)
mini_portile2 (~> 2.5.0)
@@ -908,7 +907,7 @@ GEM
peek (1.1.0)
railties (>= 4.0.0)
pg (1.2.3)
- pg_query (2.1.0)
+ pg_query (2.1.1)
google-protobuf (>= 3.17.1)
plist (3.6.0)
png_quantizator (0.2.1)
@@ -934,7 +933,7 @@ GEM
pry (~> 0.13.0)
pry-rails (0.3.9)
pry (>= 0.10.4)
- pry-shell (0.4.1)
+ pry-shell (0.5.0)
pry (~> 0.13.0)
tty-markdown
tty-prompt
@@ -960,27 +959,25 @@ GEM
httpclient
json-jwt (>= 1.11.0)
rack (>= 2.1.0)
- rack-protection (2.0.5)
- rack
rack-proxy (0.6.0)
rack
rack-test (1.1.0)
rack (>= 1.0, < 3)
rack-timeout (0.5.2)
- rails (6.1.3.2)
- actioncable (= 6.1.3.2)
- actionmailbox (= 6.1.3.2)
- actionmailer (= 6.1.3.2)
- actionpack (= 6.1.3.2)
- actiontext (= 6.1.3.2)
- actionview (= 6.1.3.2)
- activejob (= 6.1.3.2)
- activemodel (= 6.1.3.2)
- activerecord (= 6.1.3.2)
- activestorage (= 6.1.3.2)
- activesupport (= 6.1.3.2)
+ rails (6.1.4.1)
+ actioncable (= 6.1.4.1)
+ actionmailbox (= 6.1.4.1)
+ actionmailer (= 6.1.4.1)
+ actionpack (= 6.1.4.1)
+ actiontext (= 6.1.4.1)
+ actionview (= 6.1.4.1)
+ activejob (= 6.1.4.1)
+ activemodel (= 6.1.4.1)
+ activerecord (= 6.1.4.1)
+ activestorage (= 6.1.4.1)
+ activesupport (= 6.1.4.1)
bundler (>= 1.15.0)
- railties (= 6.1.3.2)
+ railties (= 6.1.4.1)
sprockets-rails (>= 2.0.0)
rails-controller-testing (1.0.5)
actionpack (>= 5.0.1.rc1)
@@ -994,11 +991,11 @@ GEM
rails-i18n (6.0.0)
i18n (>= 0.7, < 2)
railties (>= 6.0.0, < 7)
- railties (6.1.3.2)
- actionpack (= 6.1.3.2)
- activesupport (= 6.1.3.2)
+ railties (6.1.4.1)
+ actionpack (= 6.1.4.1)
+ activesupport (= 6.1.4.1)
method_source
- rake (>= 0.8.7)
+ rake (>= 0.13)
thor (~> 1.0)
rainbow (3.0.0)
rake (13.0.6)
@@ -1018,7 +1015,7 @@ GEM
recaptcha (4.13.1)
json
recursive-open-struct (1.1.3)
- redis (4.1.4)
+ redis (4.4.0)
redis-actionpack (5.2.0)
actionpack (>= 5, < 7)
redis-rack (>= 2.1.0, < 3)
@@ -1052,7 +1049,7 @@ GEM
rexml (3.2.5)
rinku (2.0.0)
rotp (6.2.0)
- rouge (3.26.0)
+ rouge (3.26.1)
rqrcode (0.7.0)
chunky_png
rqrcode-rails3 (0.1.7)
@@ -1116,8 +1113,6 @@ GEM
rubocop-rspec (1.44.1)
rubocop (~> 0.87)
rubocop-ast (>= 0.7.1)
- ruby-enum (0.8.0)
- i18n
ruby-fogbugz (0.2.1)
crack (~> 0.4)
ruby-magic (0.4.0)
@@ -1175,11 +1170,10 @@ GEM
shellany (0.0.1)
shoulda-matchers (4.0.1)
activesupport (>= 4.2.0)
- sidekiq (5.2.9)
- connection_pool (~> 2.2, >= 2.2.2)
+ sidekiq (6.2.2)
+ connection_pool (>= 2.2.2)
rack (~> 2.0)
- rack-protection (>= 1.5.0)
- redis (>= 3.3.5, < 4.2)
+ redis (>= 4.2.0)
sidekiq-cron (1.0.4)
fugit (~> 1.1)
sidekiq (>= 4.2.1)
@@ -1257,7 +1251,7 @@ GEM
unicode-display_width (~> 1.1, >= 1.1.1)
terser (1.0.2)
execjs (>= 0.3.0, < 3)
- test-prof (0.12.0)
+ test-prof (1.0.7)
test_file_finder (0.1.4)
faraday (~> 1.0)
text (1.3.1)
@@ -1357,7 +1351,7 @@ GEM
crack (>= 0.3.2)
hashdiff (>= 0.4.0, < 2.0.0)
webrick (1.6.1)
- websocket-driver (0.7.3)
+ websocket-driver (0.7.5)
websocket-extensions (>= 0.1.0)
websocket-extensions (0.1.5)
wikicloth (0.8.1)
@@ -1414,7 +1408,7 @@ DEPENDENCIES
capybara-screenshot (~> 1.0.22)
carrierwave (~> 1.3)
charlock_holmes (~> 0.7.7)
- commonmarker (~> 0.21)
+ commonmarker (~> 0.23.2)
concurrent-ruby (~> 1.1)
connection_pool (~> 2.0)
countries (~> 3.0)
@@ -1464,19 +1458,19 @@ DEPENDENCIES
gettext (~> 3.3)
gettext_i18n_rails (~> 1.8.0)
gettext_i18n_rails_js (~> 1.3)
- gitaly (~> 14.3.0.pre.rc1)
+ gitaly (~> 14.3.0.pre.rc2)
github-markup (~> 1.7.0)
gitlab-chronic (~> 0.10.5)
gitlab-dangerfiles (~> 2.3.0)
gitlab-experiment (~> 0.6.4)
- gitlab-fog-azure-rm (~> 1.1.1)
+ gitlab-fog-azure-rm (~> 1.2.0)
gitlab-labkit (~> 0.21.1)
gitlab-license (~> 2.0)
gitlab-mail_room (~> 0.0.9)
gitlab-markup (~> 1.7.1)
gitlab-net-dns (~> 0.9.1)
gitlab-omniauth-openid-connect (~> 0.8.0)
- gitlab-sidekiq-fetcher (= 0.5.6)
+ gitlab-sidekiq-fetcher (= 0.8.0)
gitlab-styles (~> 6.3.0)
gitlab_chronic_duration (~> 0.10.6.2)
gitlab_omniauth-ldap (~> 2.1.1)
@@ -1485,7 +1479,7 @@ DEPENDENCIES
google-protobuf (~> 3.17.1)
gpgme (~> 2.0.19)
grape (~> 1.5.2)
- grape-entity (~> 0.9.0)
+ grape-entity (~> 0.10.0)
grape-path-helpers (~> 1.7.0)
grape_logging (~> 1.7)
graphiql-rails (~> 1.4.10)
@@ -1518,7 +1512,7 @@ DEPENDENCIES
kramdown (~> 2.3.1)
kubeclient (~> 4.9.2)
lefthook (~> 0.7.0)
- letter_opener_web (~> 1.4.0)
+ letter_opener_web (~> 1.4.1)
license_finder (~> 6.0)
licensee (~> 9.14.1)
lockbox (~> 0.6.2)
@@ -1570,7 +1564,7 @@ DEPENDENCIES
prometheus-client-mmap (~> 0.15.0)
pry-byebug
pry-rails (~> 0.3.9)
- pry-shell (~> 0.4.0)
+ pry-shell (~> 0.5.0)
puma (~> 5.3.1)
puma_worker_killer (~> 0.3.1)
rack (~> 2.2.3)
@@ -1579,7 +1573,7 @@ DEPENDENCIES
rack-oauth2 (~> 1.16.0)
rack-proxy (~> 0.6.0)
rack-timeout (~> 0.5.1)
- rails (~> 6.1.3.2)
+ rails (~> 6.1.4.1)
rails-controller-testing
rails-i18n (~> 6.0)
rainbow (~> 3.0)
@@ -1588,14 +1582,14 @@ DEPENDENCIES
rdoc (~> 6.3.2)
re2 (~> 1.2.0)
recaptcha (~> 4.11)
- redis (~> 4.1.4)
+ redis (~> 4.4.0)
redis-actionpack (~> 5.2.0)
redis-namespace (~> 1.8.1)
request_store (~> 1.5)
responders (~> 3.0)
retriable (~> 3.1.2)
rexml (~> 3.2.5)
- rouge (~> 3.26.0)
+ rouge (~> 3.26.1)
rqrcode-rails3 (~> 0.1.7)
rspec-parameterized
rspec-rails (~> 5.0.1)
@@ -1617,7 +1611,7 @@ DEPENDENCIES
sentry-raven (~> 3.1)
settingslogic (~> 2.0.9)
shoulda-matchers (~> 4.0.1)
- sidekiq (~> 5.2.7)
+ sidekiq (~> 6.2.2)
sidekiq-cron (~> 1.0)
simple_po_parser (~> 1.1.2)
simplecov (~> 0.18.5)
@@ -1634,7 +1628,7 @@ DEPENDENCIES
state_machines-activerecord (~> 0.8.0)
sys-filesystem (~> 1.1.6)
terser (= 1.0.2)
- test-prof (~> 0.12.0)
+ test-prof (~> 1.0.7)
test_file_finder (~> 0.1.3)
thin (~> 1.8.0)
thrift (>= 0.14.0)
diff --git a/README.md b/README.md
index ee7eef9aa2d..f5ec329cd9e 100644
--- a/README.md
+++ b/README.md
@@ -68,7 +68,7 @@ GitLab is an open source project and we are very happy to accept community contr
## Install a development environment
To work on GitLab itself, we recommend setting up your development environment with [the GitLab Development Kit](https://gitlab.com/gitlab-org/gitlab-development-kit).
-If you do not use the GitLab Development Kit you need to install and setup all the dependencies yourself, this is a lot of work and error prone.
+If you do not use the GitLab Development Kit you need to install and configure all the dependencies yourself, this is a lot of work and error prone.
One small thing you also have to do when installing it yourself is to copy the example development Puma configuration file:
cp config/puma.rb.example.development config/puma.rb
@@ -81,7 +81,7 @@ GitLab is a Ruby on Rails application that runs on the following software:
- Ubuntu/Debian/CentOS/RHEL/OpenSUSE
- Ruby (MRI) 2.7.4
-- Git 2.31+
+- Git 2.33+
- Redis 5.0+
- PostgreSQL 12+
diff --git a/app/assets/images/logos/zentao.svg b/app/assets/images/logos/zentao.svg
new file mode 100644
index 00000000000..d2115b72aee
--- /dev/null
+++ b/app/assets/images/logos/zentao.svg
@@ -0,0 +1,14 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="16px" height="16px" fill="none">
+ <path fill="url(#SVGID_1_)" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1L8,1z M11.3,8.2C9.8,7.7,7.9,6.1,5.8,7.6
+ C4,8.9,4.8,11.1,6,11.8c0.9,0.6,2.3,0.7,3,0.1C9.7,11.4,10,10,9,9.5C8.6,9.4,7.9,9.3,7.5,9.8c-0.5,0.6-0.3,1.4,0.4,1.7
+ c0,0-1.2-0.1-1.4-1.3C6.2,7.9,9,7.6,10.3,8.4c2.4,1.5,1.5,4.8-2,5.4c-1.8,0.3-4.8-0.3-5.9-2.7c-0.4-0.9-0.3-0.7-0.3-0.7
+ c0.1,0.1,0.3,0.3,0.4,0.4c0.8,0.6,1.6,0.1,1.4-0.8C3.3,7.2,4.4,6.7,5.1,6.2s0.4-1.5-0.9-1.3c-1.9,0.3-2.4,3-2.4,3s-0.3-4.6,3.7-5
+ c4.1-0.4,4.7,3.2,6.5,3.7c2.5,0.8,1.3-2.6,1.3-2.6s1.1,1.7,0.6,3.2C13.5,8.2,12.3,8.5,11.3,8.2z" />
+ <defs>
+ <linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="8" y1="-271.1102" x2="8" y2="-257.1102"
+ gradientTransform="matrix(1 0 0 -1 0 -256.1102)">
+ <stop offset="0" style="stop-color:#445470" />
+ <stop offset="1" style="stop-color:#7A869A" />
+ </linearGradient>
+ </defs>
+</svg>
diff --git a/app/assets/javascripts/access_tokens/index.js b/app/assets/javascripts/access_tokens/index.js
index 7f5f0403de6..2cd3a8f12ee 100644
--- a/app/assets/javascripts/access_tokens/index.js
+++ b/app/assets/javascripts/access_tokens/index.js
@@ -49,7 +49,7 @@ export const initProjectsField = () => {
{ default: createDefaultClient },
]) => {
const apolloProvider = new VueApollo({
- defaultClient: createDefaultClient(),
+ defaultClient: createDefaultClient({}, { assumeImmutableResults: true }),
});
Vue.use(VueApollo);
diff --git a/app/assets/javascripts/admin/users/components/actions/delete.vue b/app/assets/javascripts/admin/users/components/actions/delete.vue
index a0f4a4bf382..e6dde5898e7 100644
--- a/app/assets/javascripts/admin/users/components/actions/delete.vue
+++ b/app/assets/javascripts/admin/users/components/actions/delete.vue
@@ -14,7 +14,7 @@ export default {
type: Object,
required: true,
},
- oncallSchedules: {
+ userDeletionObstacles: {
type: Array,
required: false,
default: () => [],
@@ -29,7 +29,7 @@ export default {
:username="username"
:paths="paths"
:delete-path="paths.delete"
- :oncall-schedules="oncallSchedules"
+ :user-deletion-obstacles="userDeletionObstacles"
>
<slot></slot>
</shared-delete-action>
diff --git a/app/assets/javascripts/admin/users/components/actions/delete_with_contributions.vue b/app/assets/javascripts/admin/users/components/actions/delete_with_contributions.vue
index 02fd3efafa1..bd920a91516 100644
--- a/app/assets/javascripts/admin/users/components/actions/delete_with_contributions.vue
+++ b/app/assets/javascripts/admin/users/components/actions/delete_with_contributions.vue
@@ -14,7 +14,7 @@ export default {
type: Object,
required: true,
},
- oncallSchedules: {
+ userDeletionObstacles: {
type: Array,
required: false,
default: () => [],
@@ -29,7 +29,7 @@ export default {
:username="username"
:paths="paths"
:delete-path="paths.deleteWithContributions"
- :oncall-schedules="oncallSchedules"
+ :user-deletion-obstacles="userDeletionObstacles"
>
<slot></slot>
</shared-delete-action>
diff --git a/app/assets/javascripts/admin/users/components/actions/shared/shared_delete_action.vue b/app/assets/javascripts/admin/users/components/actions/shared/shared_delete_action.vue
index a1589c9d46d..c9f29b55dbf 100644
--- a/app/assets/javascripts/admin/users/components/actions/shared/shared_delete_action.vue
+++ b/app/assets/javascripts/admin/users/components/actions/shared/shared_delete_action.vue
@@ -22,7 +22,7 @@ export default {
type: String,
required: true,
},
- oncallSchedules: {
+ userDeletionObstacles: {
type: Array,
required: true,
},
@@ -34,7 +34,7 @@ export default {
'data-delete-user-url': this.deletePath,
'data-gl-modal-action': this.modalType,
'data-username': this.username,
- 'data-oncall-schedules': JSON.stringify(this.oncallSchedules),
+ 'data-user-deletion-obstacles': JSON.stringify(this.userDeletionObstacles),
};
},
},
diff --git a/app/assets/javascripts/admin/users/components/modals/delete_user_modal.vue b/app/assets/javascripts/admin/users/components/modals/delete_user_modal.vue
index 413163c8536..ed90343777d 100644
--- a/app/assets/javascripts/admin/users/components/modals/delete_user_modal.vue
+++ b/app/assets/javascripts/admin/users/components/modals/delete_user_modal.vue
@@ -2,7 +2,7 @@
import { GlModal, GlButton, GlFormInput, GlSprintf } from '@gitlab/ui';
import * as Sentry from '@sentry/browser';
import { s__, sprintf } from '~/locale';
-import OncallSchedulesList from '~/vue_shared/components/oncall_schedules_list.vue';
+import UserDeletionObstaclesList from '~/vue_shared/components/user_deletion_obstacles/user_deletion_obstacles_list.vue';
export default {
components: {
@@ -10,7 +10,7 @@ export default {
GlButton,
GlFormInput,
GlSprintf,
- OncallSchedulesList,
+ UserDeletionObstaclesList,
},
props: {
title: {
@@ -45,7 +45,7 @@ export default {
type: String,
required: true,
},
- oncallSchedules: {
+ userDeletionObstacles: {
type: String,
required: false,
default: '[]',
@@ -66,9 +66,9 @@ export default {
canSubmit() {
return this.enteredUsername === this.username;
},
- schedules() {
+ obstacles() {
try {
- return JSON.parse(this.oncallSchedules);
+ return JSON.parse(this.userDeletionObstacles);
} catch (e) {
Sentry.captureException(e);
}
@@ -112,12 +112,16 @@ export default {
</gl-sprintf>
</p>
- <oncall-schedules-list v-if="schedules.length" :schedules="schedules" :user-name="username" />
+ <user-deletion-obstacles-list
+ v-if="obstacles.length"
+ :obstacles="obstacles"
+ :user-name="username"
+ />
<p>
<gl-sprintf :message="s__('AdminUsers|To confirm, type %{username}')">
<template #username>
- <code>{{ username }}</code>
+ <code class="gl-white-space-pre-wrap">{{ username }}</code>
</template>
</gl-sprintf>
</p>
diff --git a/app/assets/javascripts/admin/users/components/user_actions.vue b/app/assets/javascripts/admin/users/components/user_actions.vue
index c076e0bedf0..4f4e2947341 100644
--- a/app/assets/javascripts/admin/users/components/user_actions.vue
+++ b/app/assets/javascripts/admin/users/components/user_actions.vue
@@ -9,6 +9,7 @@ import {
} from '@gitlab/ui';
import { convertArrayToCamelCase } from '~/lib/utils/common_utils';
import { capitalizeFirstCharacter } from '~/lib/utils/text_utility';
+import { parseUserDeletionObstacles } from '~/vue_shared/components/user_deletion_obstacles/utils';
import { I18N_USER_ACTIONS } from '../constants';
import { generateUserPaths } from '../utils';
import Actions from './actions';
@@ -72,6 +73,9 @@ export default {
href: this.userPaths.edit,
};
},
+ obstaclesForUserDeletion() {
+ return parseUserDeletionObstacles(this.user);
+ },
},
methods: {
isLdapAction(action) {
@@ -141,7 +145,7 @@ export default {
:key="action"
:paths="userPaths"
:username="user.name"
- :oncall-schedules="user.oncallSchedules"
+ :user-deletion-obstacles="obstaclesForUserDeletion"
:data-testid="`delete-${action}`"
>
{{ $options.i18n[action] }}
diff --git a/app/assets/javascripts/analytics/shared/components/projects_dropdown_filter.vue b/app/assets/javascripts/analytics/shared/components/projects_dropdown_filter.vue
index a490111e13b..0bdb45d35c9 100644
--- a/app/assets/javascripts/analytics/shared/components/projects_dropdown_filter.vue
+++ b/app/assets/javascripts/analytics/shared/components/projects_dropdown_filter.vue
@@ -15,6 +15,8 @@ import { DEFAULT_DEBOUNCE_AND_THROTTLE_MS } from '~/lib/utils/constants';
import { n__, s__, __ } from '~/locale';
import getProjects from '../graphql/projects.query.graphql';
+const sortByProjectName = (projects = []) => projects.sort((a, b) => a.name.localeCompare(b.name));
+
export default {
name: 'ProjectsDropdownFilter',
components: {
@@ -88,6 +90,9 @@ export default {
selectedProjectIds() {
return this.selectedProjects.map((p) => p.id);
},
+ hasSelectedProjects() {
+ return Boolean(this.selectedProjects.length);
+ },
availableProjects() {
return filterBySearchTerm(this.projects, this.searchTerm);
},
@@ -95,6 +100,12 @@ export default {
const { loading, availableProjects } = this;
return !loading && !availableProjects.length;
},
+ selectedItems() {
+ return sortByProjectName(this.selectedProjects);
+ },
+ unselectedItems() {
+ return this.availableProjects.filter(({ id }) => !this.selectedProjectIds.includes(id));
+ },
},
watch: {
searchTerm() {
@@ -105,44 +116,53 @@ export default {
this.search();
},
methods: {
+ handleUpdatedSelectedProjects() {
+ this.$emit('selected', this.selectedProjects);
+ },
search: debounce(function debouncedSearch() {
this.fetchData();
}, DEFAULT_DEBOUNCE_AND_THROTTLE_MS),
- getSelectedProjects(selectedProject, isMarking) {
- return isMarking
+ getSelectedProjects(selectedProject, isSelected) {
+ return isSelected
? this.selectedProjects.concat([selectedProject])
: this.selectedProjects.filter((project) => project.id !== selectedProject.id);
},
singleSelectedProject(selectedObj, isMarking) {
return isMarking ? [selectedObj] : [];
},
- setSelectedProjects(selectedObj, isMarking) {
+ setSelectedProjects(project) {
this.selectedProjects = this.multiSelect
- ? this.getSelectedProjects(selectedObj, isMarking)
- : this.singleSelectedProject(selectedObj, isMarking);
+ ? this.getSelectedProjects(project, !this.isProjectSelected(project))
+ : this.singleSelectedProject(project, !this.isProjectSelected(project));
},
- onClick({ project, isSelected }) {
- this.setSelectedProjects(project, !isSelected);
- this.$emit('selected', this.selectedProjects);
+ onClick(project) {
+ this.setSelectedProjects(project);
+ this.handleUpdatedSelectedProjects();
},
- onMultiSelectClick({ project, isSelected }) {
- this.setSelectedProjects(project, !isSelected);
+ onMultiSelectClick(project) {
+ this.setSelectedProjects(project);
this.isDirty = true;
},
- onSelected(ev) {
+ onSelected(project) {
if (this.multiSelect) {
- this.onMultiSelectClick(ev);
+ this.onMultiSelectClick(project);
} else {
- this.onClick(ev);
+ this.onClick(project);
}
},
onHide() {
if (this.multiSelect && this.isDirty) {
- this.$emit('selected', this.selectedProjects);
+ this.handleUpdatedSelectedProjects();
}
this.searchTerm = '';
this.isDirty = false;
},
+ onClearAll() {
+ if (this.hasSelectedProjects) {
+ this.isDirty = true;
+ }
+ this.selectedProjects = [];
+ },
fetchData() {
this.loading = true;
@@ -168,8 +188,8 @@ export default {
this.projects = nodes;
});
},
- isProjectSelected(id) {
- return this.selectedProjects ? this.selectedProjectIds.includes(id) : false;
+ isProjectSelected(project) {
+ return this.selectedProjectIds.includes(project.id);
},
getEntityId(project) {
return getIdFromGraphQLId(project.id);
@@ -182,6 +202,10 @@ export default {
ref="projectsDropdown"
class="dropdown dropdown-projects"
toggle-class="gl-shadow-none"
+ :show-clear-all="hasSelectedProjects"
+ show-highlighted-items-title
+ highlighted-items-title-class="gl-p-3"
+ @clear-all.stop="onClearAll"
@hide="onHide"
>
<template #button-content>
@@ -204,14 +228,37 @@ export default {
<gl-dropdown-section-header>{{ __('Projects') }}</gl-dropdown-section-header>
<gl-search-box-by-type v-model.trim="searchTerm" />
</template>
+ <template #highlighted-items>
+ <gl-dropdown-item
+ v-for="project in selectedItems"
+ :key="project.id"
+ is-check-item
+ :is-checked="isProjectSelected(project)"
+ @click.native.capture.stop="onSelected(project)"
+ >
+ <div class="gl-display-flex">
+ <gl-avatar
+ class="gl-mr-2 gl-vertical-align-middle"
+ :alt="project.name"
+ :size="16"
+ :entity-id="getEntityId(project)"
+ :entity-name="project.name"
+ :src="project.avatarUrl"
+ shape="rect"
+ />
+ <div>
+ <div data-testid="project-name">{{ project.name }}</div>
+ <div class="gl-text-gray-500" data-testid="project-full-path">
+ {{ project.fullPath }}
+ </div>
+ </div>
+ </div>
+ </gl-dropdown-item>
+ </template>
<gl-dropdown-item
- v-for="project in availableProjects"
+ v-for="project in unselectedItems"
:key="project.id"
- :is-check-item="true"
- :is-checked="isProjectSelected(project.id)"
- @click.native.capture.stop="
- onSelected({ project, isSelected: isProjectSelected(project.id) })
- "
+ @click.native.capture.stop="onSelected(project)"
>
<div class="gl-display-flex">
<gl-avatar
diff --git a/app/assets/javascripts/analytics/shared/constants.js b/app/assets/javascripts/analytics/shared/constants.js
index 44d9b4b4262..c06bd34f86f 100644
--- a/app/assets/javascripts/analytics/shared/constants.js
+++ b/app/assets/javascripts/analytics/shared/constants.js
@@ -9,4 +9,5 @@ export const dateFormats = {
isoDate,
defaultDate: mediumDate,
defaultDateTime: 'mmm d, yyyy h:MMtt',
+ month: 'mmmm',
};
diff --git a/app/assets/javascripts/analytics/shared/utils.js b/app/assets/javascripts/analytics/shared/utils.js
index 52901d4c5bb..f55ef99964e 100644
--- a/app/assets/javascripts/analytics/shared/utils.js
+++ b/app/assets/javascripts/analytics/shared/utils.js
@@ -1,4 +1,5 @@
import dateFormat from 'dateformat';
+import { urlQueryToFilter } from '~/vue_shared/components/filtered_search_bar/filtered_search_utils';
import { dateFormats } from './constants';
export const filterBySearchTerm = (data = [], searchTerm = '', filterByKey = 'name') => {
@@ -7,3 +8,64 @@ export const filterBySearchTerm = (data = [], searchTerm = '', filterByKey = 'na
};
export const toYmd = (date) => dateFormat(date, dateFormats.isoDate);
+
+/**
+ * Takes a url and extracts query parameters used for the shared
+ * filter bar
+ *
+ * @param {string} url The URL to extract query parameters from
+ * @returns {Object}
+ */
+export const extractFilterQueryParameters = (url = '') => {
+ const {
+ source_branch_name = null,
+ target_branch_name = null,
+ author_username = null,
+ milestone_title = null,
+ assignee_username = [],
+ label_name = [],
+ } = urlQueryToFilter(url);
+
+ return {
+ selectedSourceBranch: source_branch_name,
+ selectedTargetBranch: target_branch_name,
+ selectedAuthor: author_username,
+ selectedMilestone: milestone_title,
+ selectedAssigneeList: assignee_username,
+ selectedLabelList: label_name,
+ };
+};
+
+/**
+ * Takes a url and extracts sorting and pagination query parameters into an object
+ *
+ * @param {string} url The URL to extract query parameters from
+ * @returns {Object}
+ */
+export const extractPaginationQueryParameters = (url = '') => {
+ const { sort, direction, page } = urlQueryToFilter(url);
+ return {
+ sort: sort?.value || null,
+ direction: direction?.value || null,
+ page: page?.value || null,
+ };
+};
+
+export const getDataZoomOption = ({
+ totalItems = 0,
+ maxItemsPerPage = 40,
+ dataZoom = [{ type: 'slider', bottom: 10, start: 0 }],
+}) => {
+ if (totalItems <= maxItemsPerPage) {
+ return {};
+ }
+
+ const intervalEnd = Math.ceil((maxItemsPerPage / totalItems) * 100);
+
+ return dataZoom.map((item) => {
+ return {
+ ...item,
+ end: intervalEnd,
+ };
+ });
+};
diff --git a/app/assets/javascripts/api.js b/app/assets/javascripts/api.js
index 01e463c1965..adf3e122a64 100644
--- a/app/assets/javascripts/api.js
+++ b/app/assets/javascripts/api.js
@@ -499,10 +499,10 @@ const Api = {
return axios.put(url, params);
},
- applySuggestionBatch(ids) {
+ applySuggestionBatch(ids, message) {
const url = Api.buildUrl(Api.applySuggestionBatchPath);
- return axios.put(url, { ids });
+ return axios.put(url, { ids, commit_message: message });
},
commitPipelines(projectId, sha) {
diff --git a/app/assets/javascripts/api/bulk_imports_api.js b/app/assets/javascripts/api/bulk_imports_api.js
new file mode 100644
index 00000000000..d636cfdff0b
--- /dev/null
+++ b/app/assets/javascripts/api/bulk_imports_api.js
@@ -0,0 +1,7 @@
+import { buildApiUrl } from '~/api/api_utils';
+import axios from '~/lib/utils/axios_utils';
+
+const BULK_IMPORT_ENTITIES_PATH = '/api/:version/bulk_imports/entities';
+
+export const getBulkImportsHistory = (params) =>
+ axios.get(buildApiUrl(BULK_IMPORT_ENTITIES_PATH), { params });
diff --git a/app/assets/javascripts/artifacts_settings/index.js b/app/assets/javascripts/artifacts_settings/index.js
index 531b42bc185..5c9f1c3129c 100644
--- a/app/assets/javascripts/artifacts_settings/index.js
+++ b/app/assets/javascripts/artifacts_settings/index.js
@@ -6,7 +6,7 @@ import createDefaultClient from '~/lib/graphql';
Vue.use(VueApollo);
const apolloProvider = new VueApollo({
- defaultClient: createDefaultClient(),
+ defaultClient: createDefaultClient({}, { assumeImmutableResults: true }),
});
export default (containerId = 'js-artifacts-settings-app') => {
diff --git a/app/assets/javascripts/behaviors/markdown/nodes/emoji.js b/app/assets/javascripts/behaviors/markdown/nodes/emoji.js
index 367a06ad3c1..9d0890aa1b4 100644
--- a/app/assets/javascripts/behaviors/markdown/nodes/emoji.js
+++ b/app/assets/javascripts/behaviors/markdown/nodes/emoji.js
@@ -26,6 +26,18 @@ export default class Emoji extends Node {
moji: el.textContent,
}),
},
+ {
+ tag: 'img.emoji',
+ getAttrs: (el) => {
+ const name = el.getAttribute('title').replace(/^:|:$/g, '');
+
+ return {
+ name,
+ title: name,
+ moji: name,
+ };
+ },
+ },
],
toDOM: (node) => [
'gl-emoji',
diff --git a/app/assets/javascripts/behaviors/markdown/nodes/image.js b/app/assets/javascripts/behaviors/markdown/nodes/image.js
index ade5839d10b..4cc28c45739 100644
--- a/app/assets/javascripts/behaviors/markdown/nodes/image.js
+++ b/app/assets/javascripts/behaviors/markdown/nodes/image.js
@@ -29,7 +29,7 @@ export default class Image extends BaseImage {
},
// Matches HTML generated by Banzai::Filter::ImageLazyLoadFilter
{
- tag: 'img[src]',
+ tag: 'img[src]:not(.emoji)',
getAttrs: (el) => {
const imageSrc = el.src;
const imageUrl =
diff --git a/app/assets/javascripts/behaviors/preview_markdown.js b/app/assets/javascripts/behaviors/preview_markdown.js
index a1911585f80..a548b283142 100644
--- a/app/assets/javascripts/behaviors/preview_markdown.js
+++ b/app/assets/javascripts/behaviors/preview_markdown.js
@@ -81,7 +81,7 @@ MarkdownPreview.prototype.fetchMarkdownPreview = function (text, url, success) {
})
.catch(() =>
createFlash({
- message: __('An error occurred while fetching markdown preview'),
+ message: __('An error occurred while fetching Markdown preview'),
}),
);
};
diff --git a/app/assets/javascripts/behaviors/requires_input.js b/app/assets/javascripts/behaviors/requires_input.js
index b1227fb3533..59905035257 100644
--- a/app/assets/javascripts/behaviors/requires_input.js
+++ b/app/assets/javascripts/behaviors/requires_input.js
@@ -38,23 +38,9 @@ $.fn.requiresInput = function requiresInput() {
$form.on('change input', fieldSelector, requireInput);
};
-// Hide or Show the help block when creating a new project
-// based on the option selected
-function hideOrShowHelpBlock(form) {
- const selected = $('.js-select-namespace option:selected');
- if (selected.length && selected.data('optionsParent') === 'groups') {
- form.find('.form-text.text-muted').hide();
- } else if (selected.length) {
- form.find('.form-text.text-muted').show();
- }
-}
-
$(() => {
$('form.js-requires-input').each((i, el) => {
const $form = $(el);
-
$form.requiresInput();
- hideOrShowHelpBlock($form);
- $('.select2.js-select-namespace').change(() => hideOrShowHelpBlock($form));
});
});
diff --git a/app/assets/javascripts/behaviors/shortcuts/keybindings.js b/app/assets/javascripts/behaviors/shortcuts/keybindings.js
index ebf2ab0381e..b27dccabdf8 100644
--- a/app/assets/javascripts/behaviors/shortcuts/keybindings.js
+++ b/app/assets/javascripts/behaviors/shortcuts/keybindings.js
@@ -306,6 +306,12 @@ export const GO_TO_PROJECT_WIKI = {
defaultKeys: ['g w'], // eslint-disable-line @gitlab/require-i18n-strings
};
+export const GO_TO_PROJECT_WEBIDE = {
+ id: 'project.goToWebIDE',
+ description: __('Open in Web IDE'),
+ defaultKeys: ['.'],
+};
+
export const PROJECT_FILES_MOVE_SELECTION_UP = {
id: 'projectFiles.moveSelectionUp',
description: __('Move selection up'),
@@ -549,6 +555,7 @@ export const PROJECT_SHORTCUTS_GROUP = {
GO_TO_PROJECT_KUBERNETES,
GO_TO_PROJECT_SNIPPETS,
GO_TO_PROJECT_WIKI,
+ GO_TO_PROJECT_WEBIDE,
],
};
diff --git a/app/assets/javascripts/behaviors/shortcuts/shortcuts_navigation.js b/app/assets/javascripts/behaviors/shortcuts/shortcuts_navigation.js
index b188d3b0ec3..7d8e4dd490c 100644
--- a/app/assets/javascripts/behaviors/shortcuts/shortcuts_navigation.js
+++ b/app/assets/javascripts/behaviors/shortcuts/shortcuts_navigation.js
@@ -1,4 +1,5 @@
import Mousetrap from 'mousetrap';
+import { visitUrl, constructWebIDEPath } from '~/lib/utils/url_utility';
import findAndFollowLink from '../../lib/utils/navigation_utility';
import {
keysFor,
@@ -18,6 +19,7 @@ import {
GO_TO_PROJECT_KUBERNETES,
GO_TO_PROJECT_ENVIRONMENTS,
GO_TO_PROJECT_METRICS,
+ GO_TO_PROJECT_WEBIDE,
NEW_ISSUE,
} from './keybindings';
import Shortcuts from './shortcuts';
@@ -58,6 +60,18 @@ export default class ShortcutsNavigation extends Shortcuts {
findAndFollowLink('.shortcuts-environments'),
);
Mousetrap.bind(keysFor(GO_TO_PROJECT_METRICS), () => findAndFollowLink('.shortcuts-metrics'));
+ Mousetrap.bind(keysFor(GO_TO_PROJECT_WEBIDE), ShortcutsNavigation.navigateToWebIDE);
Mousetrap.bind(keysFor(NEW_ISSUE), () => findAndFollowLink('.shortcuts-new-issue'));
}
+
+ static navigateToWebIDE() {
+ const path = constructWebIDEPath({
+ sourceProjectFullPath: window.gl.mrWidgetData?.source_project_full_path,
+ targetProjectFullPath: window.gl.mrWidgetData?.target_project_full_path,
+ iid: window.gl.mrWidgetData?.iid,
+ });
+ if (path) {
+ visitUrl(path);
+ }
+ }
}
diff --git a/app/assets/javascripts/blob/components/blob_content.vue b/app/assets/javascripts/blob/components/blob_content.vue
index 1a74675100b..213e026c41f 100644
--- a/app/assets/javascripts/blob/components/blob_content.vue
+++ b/app/assets/javascripts/blob/components/blob_content.vue
@@ -41,6 +41,11 @@ export default {
type: Object,
required: true,
},
+ hideLineNumbers: {
+ type: Boolean,
+ required: false,
+ default: false,
+ },
},
computed: {
viewer() {
@@ -80,6 +85,7 @@ export default {
:is-raw-content="isRawContent"
:file-name="blob.name"
:type="activeViewer.fileType"
+ :hide-line-numbers="hideLineNumbers"
data-qa-selector="file_content"
/>
</template>
diff --git a/app/assets/javascripts/blob/file_template_mediator.js b/app/assets/javascripts/blob/file_template_mediator.js
index 136457c115d..991f98c89e7 100644
--- a/app/assets/javascripts/blob/file_template_mediator.js
+++ b/app/assets/javascripts/blob/file_template_mediator.js
@@ -247,7 +247,11 @@ export default class FileTemplateMediator {
}
setFilename(name) {
- this.$filenameInput.val(name).trigger('change');
+ const input = this.$filenameInput.get(0);
+ if (name !== undefined && input.value !== name) {
+ input.value = name;
+ input.dispatchEvent(new Event('change'));
+ }
}
getSelected() {
diff --git a/app/assets/javascripts/boards/boards_util.js b/app/assets/javascripts/boards/boards_util.js
index d113a1d39d8..c10241d00d7 100644
--- a/app/assets/javascripts/boards/boards_util.js
+++ b/app/assets/javascripts/boards/boards_util.js
@@ -43,7 +43,9 @@ export function formatListIssues(listIssues) {
let sortedIssues = list.issues.edges.map((issueNode) => ({
...issueNode.node,
}));
- sortedIssues = sortBy(sortedIssues, 'relativePosition');
+ if (list.listType !== ListType.closed) {
+ sortedIssues = sortBy(sortedIssues, 'relativePosition');
+ }
return {
...map,
@@ -146,7 +148,8 @@ export function getMoveData(state, params) {
}
export function moveItemListHelper(item, fromList, toList) {
- const updatedItem = item;
+ const updatedItem = cloneDeep(item);
+
if (
toList.listType === ListType.label &&
!updatedItem.labels.find((label) => label.id === toList.label.id)
diff --git a/app/assets/javascripts/boards/components/board_add_new_column.vue b/app/assets/javascripts/boards/components/board_add_new_column.vue
index 22ad619e76b..c5411ec313a 100644
--- a/app/assets/javascripts/boards/components/board_add_new_column.vue
+++ b/app/assets/javascripts/boards/components/board_add_new_column.vue
@@ -52,6 +52,8 @@ export default {
},
setSelectedItem(selectedId) {
+ this.selectedId = selectedId;
+
const label = this.labels.find(({ id }) => id === selectedId);
if (!selectedId || !label) {
this.selectedLabel = null;
@@ -87,8 +89,8 @@ export default {
<template #items>
<gl-form-radio-group
v-if="labels.length > 0"
- v-model="selectedId"
class="gl-overflow-y-auto gl-px-5 gl-pt-3"
+ :checked="selectedId"
@change="setSelectedItem"
>
<label
diff --git a/app/assets/javascripts/boards/components/board_add_new_column_trigger.vue b/app/assets/javascripts/boards/components/board_add_new_column_trigger.vue
index 2aee84b805f..14c84d3c4e5 100644
--- a/app/assets/javascripts/boards/components/board_add_new_column_trigger.vue
+++ b/app/assets/javascripts/boards/components/board_add_new_column_trigger.vue
@@ -1,13 +1,23 @@
<script>
-import { GlButton } from '@gitlab/ui';
-import { mapActions } from 'vuex';
+import { GlButton, GlTooltipDirective } from '@gitlab/ui';
+import { mapActions, mapState } from 'vuex';
+import { __ } from '~/locale';
import Tracking from '~/tracking';
export default {
components: {
GlButton,
},
+ directives: {
+ GlTooltip: GlTooltipDirective,
+ },
mixins: [Tracking.mixin()],
+ computed: {
+ ...mapState({ isNewListShowing: ({ addColumnForm }) => addColumnForm.visible }),
+ tooltip() {
+ return this.isNewListShowing ? __('The list creation wizard is already open') : '';
+ },
+ },
methods: {
...mapActions(['setAddColumnFormVisibility']),
handleClick() {
@@ -19,7 +29,14 @@ export default {
</script>
<template>
- <div class="gl-ml-3 gl-display-flex gl-align-items-center" data-testid="boards-create-list">
- <gl-button variant="confirm" @click="handleClick">{{ __('Create list') }} </gl-button>
+ <div
+ v-gl-tooltip="tooltip"
+ :tabindex="isNewListShowing ? '0' : undefined"
+ class="gl-ml-3 gl-display-flex gl-align-items-center"
+ data-testid="boards-create-list"
+ >
+ <gl-button :disabled="isNewListShowing" variant="confirm" @click="handleClick"
+ >{{ __('Create list') }}
+ </gl-button>
</div>
</template>
diff --git a/app/assets/javascripts/boards/components/board_card_inner.vue b/app/assets/javascripts/boards/components/board_card_inner.vue
index db80d48239b..b6ccc6a00fe 100644
--- a/app/assets/javascripts/boards/components/board_card_inner.vue
+++ b/app/assets/javascripts/boards/components/board_card_inner.vue
@@ -316,7 +316,7 @@ export default {
</p>
</gl-tooltip>
- <span ref="countBadge" class="issue-count-badge board-card-info gl-mr-0 gl-pr-0">
+ <span ref="countBadge" class="board-card-info gl-mr-0 gl-pr-0 gl-pl-3">
<span v-if="allowSubEpics" class="gl-mr-3">
<gl-icon name="epic" />
{{ totalEpicsCount }}
@@ -334,7 +334,7 @@ export default {
<span
v-if="shouldRenderEpicProgress"
ref="progressBadge"
- class="issue-count-badge board-card-info gl-pl-0"
+ class="board-card-info gl-pl-0"
>
<span class="gl-mr-3" data-testid="epic-progress">
<gl-icon name="progress" />
diff --git a/app/assets/javascripts/boards/components/board_content_sidebar.vue b/app/assets/javascripts/boards/components/board_content_sidebar.vue
index e0105d63d99..9bbb8a1a1b2 100644
--- a/app/assets/javascripts/boards/components/board_content_sidebar.vue
+++ b/app/assets/javascripts/boards/components/board_content_sidebar.vue
@@ -3,15 +3,18 @@ import { GlDrawer } from '@gitlab/ui';
import { MountingPortal } from 'portal-vue';
import { mapState, mapActions, mapGetters } from 'vuex';
import SidebarDropdownWidget from 'ee_else_ce/sidebar/components/sidebar_dropdown_widget.vue';
+import { __, sprintf } from '~/locale';
import BoardSidebarLabelsSelect from '~/boards/components/sidebar/board_sidebar_labels_select.vue';
import BoardSidebarTimeTracker from '~/boards/components/sidebar/board_sidebar_time_tracker.vue';
import BoardSidebarTitle from '~/boards/components/sidebar/board_sidebar_title.vue';
import { ISSUABLE } from '~/boards/constants';
+import { 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';
import SidebarDateWidget from '~/sidebar/components/date/sidebar_date_widget.vue';
import SidebarSubscriptionsWidget from '~/sidebar/components/subscriptions/sidebar_subscriptions_widget.vue';
import SidebarTodoWidget from '~/sidebar/components/todo_toggle/sidebar_todo_widget.vue';
+import SidebarLabelsWidget from '~/vue_shared/components/sidebar/labels_select_widget/labels_select_root.vue';
import glFeatureFlagMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
export default {
@@ -23,6 +26,7 @@ export default {
SidebarConfidentialityWidget,
BoardSidebarTimeTracker,
BoardSidebarLabelsSelect,
+ SidebarLabelsWidget,
SidebarSubscriptionsWidget,
SidebarDropdownWidget,
SidebarTodoWidget,
@@ -46,16 +50,20 @@ export default {
weightFeatureAvailable: {
default: false,
},
+ allowLabelEdit: {
+ default: false,
+ },
},
inheritAttrs: false,
computed: {
...mapGetters([
+ 'isGroupBoard',
'isSidebarOpen',
'activeBoardItem',
'groupPathForActiveIssue',
'projectPathForActiveIssue',
]),
- ...mapState(['sidebarType', 'issuableType']),
+ ...mapState(['sidebarType', 'issuableType', 'isSettingLabels']),
isIssuableSidebar() {
return this.sidebarType === ISSUABLE;
},
@@ -65,17 +73,48 @@ export default {
fullPath() {
return this.activeBoardItem?.referencePath?.split('#')[0] || '';
},
+ createLabelTitle() {
+ return sprintf(__('Create %{workspace} label'), {
+ workspace: this.isGroupBoard ? 'group' : 'project',
+ });
+ },
+ manageLabelTitle() {
+ return sprintf(__('Manage %{workspace} labels'), {
+ workspace: this.isGroupBoard ? 'group' : 'project',
+ });
+ },
+ attrWorkspacePath() {
+ return this.isGroupBoard ? this.groupPathForActiveIssue : undefined;
+ },
},
methods: {
...mapActions([
'toggleBoardItem',
'setAssignees',
'setActiveItemConfidential',
+ 'setActiveBoardItemLabels',
'setActiveItemWeight',
]),
handleClose() {
this.toggleBoardItem({ boardItem: this.activeBoardItem, sidebarType: this.sidebarType });
},
+ handleUpdateSelectedLabels(input) {
+ this.setActiveBoardItemLabels({
+ iid: this.activeBoardItem.iid,
+ projectPath: this.projectPathForActiveIssue,
+ addLabelIds: input.map((label) => getIdFromGraphQLId(label.id)),
+ removeLabelIds: this.activeBoardItem.labels
+ .filter((label) => !input.find((selected) => selected.id === label.id))
+ .map((label) => label.id),
+ });
+ },
+ handleLabelRemove(input) {
+ this.setActiveBoardItemLabels({
+ iid: this.activeBoardItem.iid,
+ projectPath: this.projectPathForActiveIssue,
+ removeLabelIds: [input],
+ });
+ },
},
};
</script>
@@ -160,7 +199,28 @@ export default {
:issuable-type="issuableType"
data-testid="sidebar-due-date"
/>
- <board-sidebar-labels-select class="block labels" />
+ <sidebar-labels-widget
+ v-if="glFeatures.labelsWidget"
+ class="block labels"
+ data-testid="sidebar-labels"
+ :iid="activeBoardItem.iid"
+ :full-path="projectPathForActiveIssue"
+ :allow-label-remove="allowLabelEdit"
+ :allow-multiselect="true"
+ :selected-labels="activeBoardItem.labels"
+ :labels-select-in-progress="isSettingLabels"
+ :footer-create-label-title="createLabelTitle"
+ :footer-manage-label-title="manageLabelTitle"
+ :labels-create-title="createLabelTitle"
+ :labels-filter-base-path="projectPathForActiveIssue"
+ :attr-workspace-path="attrWorkspacePath"
+ :issuable-type="issuableType"
+ @onLabelRemove="handleLabelRemove"
+ @updateSelectedLabels="handleUpdateSelectedLabels"
+ >
+ {{ __('None') }}
+ </sidebar-labels-widget>
+ <board-sidebar-labels-select v-else class="block labels" />
<sidebar-weight-widget
v-if="weightFeatureAvailable"
:iid="activeBoardItem.iid"
diff --git a/app/assets/javascripts/boards/components/board_list_header.vue b/app/assets/javascripts/boards/components/board_list_header.vue
index dc5313b1bf6..a8d71ab7a35 100644
--- a/app/assets/javascripts/boards/components/board_list_header.vue
+++ b/app/assets/javascripts/boards/components/board_list_header.vue
@@ -365,7 +365,7 @@ export default {
>
<span class="gl-display-inline-flex">
<gl-tooltip :target="() => $refs.itemCount" :title="itemsTooltipLabel" />
- <span ref="itemCount" class="issue-count-badge-count">
+ <span ref="itemCount" class="gl-display-inline-flex gl-align-items-center">
<gl-icon class="gl-mr-2" :name="countIcon" />
<item-count :items-size="itemsCount" :max-issue-count="list.maxIssueCount" />
</span>
@@ -388,7 +388,7 @@ export default {
v-gl-tooltip.hover
:aria-label="$options.i18n.newIssue"
:title="$options.i18n.newIssue"
- class="issue-count-badge-add-button no-drag"
+ class="no-drag"
icon="plus"
@click="showNewIssueForm"
/>
diff --git a/app/assets/javascripts/boards/graphql.js b/app/assets/javascripts/boards/graphql.js
new file mode 100644
index 00000000000..d8d16184936
--- /dev/null
+++ b/app/assets/javascripts/boards/graphql.js
@@ -0,0 +1,22 @@
+import { IntrospectionFragmentMatcher, defaultDataIdFromObject } from 'apollo-cache-inmemory';
+import createDefaultClient from '~/lib/graphql';
+import introspectionQueryResultData from '~/sidebar/fragmentTypes.json';
+
+const fragmentMatcher = new IntrospectionFragmentMatcher({
+ introspectionQueryResultData,
+});
+
+export const gqlClient = createDefaultClient(
+ {},
+ {
+ cacheConfig: {
+ dataIdFromObject: (object) => {
+ // eslint-disable-next-line no-underscore-dangle
+ return object.__typename === 'BoardList' ? object.iid : defaultDataIdFromObject(object);
+ },
+
+ fragmentMatcher,
+ },
+ assumeImmutableResults: true,
+ },
+);
diff --git a/app/assets/javascripts/boards/graphql/issue.fragment.graphql b/app/assets/javascripts/boards/graphql/issue.fragment.graphql
index 1b14396fb5c..314faae89f8 100644
--- a/app/assets/javascripts/boards/graphql/issue.fragment.graphql
+++ b/app/assets/javascripts/boards/graphql/issue.fragment.graphql
@@ -1,3 +1,4 @@
+#import "~/graphql_shared/fragments/milestone.fragment.graphql"
#import "~/graphql_shared/fragments/user.fragment.graphql"
fragment IssueNode on Issue {
@@ -15,6 +16,9 @@ fragment IssueNode on Issue {
hidden
webUrl
relativePosition
+ milestone {
+ ...MilestoneFragment
+ }
assignees {
nodes {
...User
diff --git a/app/assets/javascripts/boards/graphql/lists_issues.query.graphql b/app/assets/javascripts/boards/graphql/lists_issues.query.graphql
index d1cb1ecf834..787dd77b901 100644
--- a/app/assets/javascripts/boards/graphql/lists_issues.query.graphql
+++ b/app/assets/javascripts/boards/graphql/lists_issues.query.graphql
@@ -16,6 +16,7 @@ query ListIssues(
nodes {
id
issuesCount
+ listType
issues(first: $first, filters: $filters, after: $after) {
edges {
node {
@@ -37,6 +38,7 @@ query ListIssues(
nodes {
id
issuesCount
+ listType
issues(first: $first, filters: $filters, after: $after) {
edges {
node {
diff --git a/app/assets/javascripts/boards/index.js b/app/assets/javascripts/boards/index.js
index 21c1bb23dc6..b6b1094fb3a 100644
--- a/app/assets/javascripts/boards/index.js
+++ b/app/assets/javascripts/boards/index.js
@@ -1,4 +1,3 @@
-import { IntrospectionFragmentMatcher } from 'apollo-cache-inmemory';
import PortalVue from 'portal-vue';
import Vue from 'vue';
import VueApollo from 'vue-apollo';
@@ -14,30 +13,17 @@ import FilteredSearchBoards from '~/boards/filtered_search_boards';
import initBoardsFilteredSearch from '~/boards/mount_filtered_search_issue_boards';
import store from '~/boards/stores';
import toggleFocusMode from '~/boards/toggle_focus';
-import createDefaultClient from '~/lib/graphql';
import { NavigationType, parseBoolean } from '~/lib/utils/common_utils';
-import introspectionQueryResultData from '~/sidebar/fragmentTypes.json';
import { fullBoardId } from './boards_util';
import boardConfigToggle from './config_toggle';
+import { gqlClient } from './graphql';
import mountMultipleBoardsSwitcher from './mount_multiple_boards_switcher';
Vue.use(VueApollo);
Vue.use(PortalVue);
-const fragmentMatcher = new IntrospectionFragmentMatcher({
- introspectionQueryResultData,
-});
-
const apolloProvider = new VueApollo({
- defaultClient: createDefaultClient(
- {},
- {
- cacheConfig: {
- fragmentMatcher,
- },
- assumeImmutableResults: true,
- },
- ),
+ defaultClient: gqlClient,
});
function mountBoardApp(el) {
@@ -101,6 +87,9 @@ function mountBoardApp(el) {
iterationListsAvailable: parseBoolean(el.dataset.iterationListsAvailable),
issuableType: issuableTypes.issue,
emailsDisabled: parseBoolean(el.dataset.emailsDisabled),
+ allowLabelCreate: parseBoolean(el.dataset.canUpdate),
+ allowLabelEdit: parseBoolean(el.dataset.canUpdate),
+ allowScopedLabels: parseBoolean(el.dataset.scopedLabels),
},
render: (createComponent) => createComponent(BoardApp),
});
diff --git a/app/assets/javascripts/boards/stores/actions.js b/app/assets/javascripts/boards/stores/actions.js
index dc06b62cebb..ca993e75cf9 100644
--- a/app/assets/javascripts/boards/stores/actions.js
+++ b/app/assets/javascripts/boards/stores/actions.js
@@ -19,7 +19,6 @@ import {
import createBoardListMutation from 'ee_else_ce/boards/graphql/board_list_create.mutation.graphql';
import issueMoveListMutation from 'ee_else_ce/boards/graphql/issue_move_list.mutation.graphql';
import { getIdFromGraphQLId } from '~/graphql_shared/utils';
-import createGqClient, { fetchPolicies } from '~/lib/graphql';
import { convertObjectPropsToCamelCase } from '~/lib/utils/common_utils';
import { queryToObject } from '~/lib/utils/url_utility';
import { s__ } from '~/locale';
@@ -35,6 +34,7 @@ import {
FiltersInfo,
filterVariables,
} from '../boards_util';
+import { gqlClient } from '../graphql';
import boardLabelsQuery from '../graphql/board_labels.query.graphql';
import groupBoardIterationsQuery from '../graphql/group_board_iterations.query.graphql';
import groupBoardMilestonesQuery from '../graphql/group_board_milestones.query.graphql';
@@ -47,13 +47,6 @@ import projectBoardMilestonesQuery from '../graphql/project_board_milestones.que
import * as types from './mutation_types';
-export const gqlClient = createGqClient(
- {},
- {
- fetchPolicy: fetchPolicies.NO_CACHE,
- },
-);
-
export default {
setInitialBoardData: ({ commit }, data) => {
commit(types.SET_INITIAL_BOARD_DATA, data);
@@ -603,7 +596,7 @@ export default {
});
},
- addListItem: ({ commit }, { list, item, position, inProgress = false }) => {
+ addListItem: ({ commit, dispatch }, { list, item, position, inProgress = false }) => {
commit(types.ADD_BOARD_ITEM_TO_LIST, {
listId: list.id,
itemId: item.id,
@@ -611,6 +604,9 @@ export default {
inProgress,
});
commit(types.UPDATE_BOARD_ITEM, item);
+ if (!inProgress) {
+ dispatch('setActiveId', { id: item.id, sidebarType: ISSUABLE });
+ }
},
removeListItem: ({ commit }, { listId, itemId }) => {
@@ -660,6 +656,7 @@ export default {
},
setActiveIssueLabels: async ({ commit, getters }, input) => {
+ commit(types.SET_LABELS_LOADING, true);
const { activeBoardItem } = getters;
const { data } = await gqlClient.mutate({
mutation: issueSetLabelsMutation,
@@ -673,6 +670,8 @@ export default {
},
});
+ commit(types.SET_LABELS_LOADING, false);
+
if (data.updateIssue?.errors?.length > 0) {
throw new Error(data.updateIssue.errors);
}
diff --git a/app/assets/javascripts/boards/stores/mutation_types.js b/app/assets/javascripts/boards/stores/mutation_types.js
index 928cece19f7..26b785932bb 100644
--- a/app/assets/javascripts/boards/stores/mutation_types.js
+++ b/app/assets/javascripts/boards/stores/mutation_types.js
@@ -28,6 +28,7 @@ export const ADD_BOARD_ITEM_TO_LIST = 'ADD_BOARD_ITEM_TO_LIST';
export const REMOVE_BOARD_ITEM_FROM_LIST = 'REMOVE_BOARD_ITEM_FROM_LIST';
export const SET_ACTIVE_ID = 'SET_ACTIVE_ID';
export const UPDATE_BOARD_ITEM_BY_ID = 'UPDATE_BOARD_ITEM_BY_ID';
+export const SET_LABELS_LOADING = 'SET_LABELS_LOADING';
export const SET_ASSIGNEE_LOADING = 'SET_ASSIGNEE_LOADING';
export const RESET_ISSUES = 'RESET_ISSUES';
export const REQUEST_GROUP_PROJECTS = 'REQUEST_GROUP_PROJECTS';
diff --git a/app/assets/javascripts/boards/stores/mutations.js b/app/assets/javascripts/boards/stores/mutations.js
index ef5b84b4575..d381c076c19 100644
--- a/app/assets/javascripts/boards/stores/mutations.js
+++ b/app/assets/javascripts/boards/stores/mutations.js
@@ -195,6 +195,10 @@ export default {
Vue.set(state.boardItems[itemId], prop, value);
},
+ [mutationTypes.SET_LABELS_LOADING](state, isLoading) {
+ state.isSettingLabels = isLoading;
+ },
+
[mutationTypes.SET_ASSIGNEE_LOADING](state, isLoading) {
state.isSettingAssignees = isLoading;
},
diff --git a/app/assets/javascripts/boards/stores/state.js b/app/assets/javascripts/boards/stores/state.js
index 80c51c966d2..2a6605e687b 100644
--- a/app/assets/javascripts/boards/stores/state.js
+++ b/app/assets/javascripts/boards/stores/state.js
@@ -12,6 +12,7 @@ export default () => ({
listsFlags: {},
boardItemsByListId: {},
backupItemsList: [],
+ isSettingLabels: false,
isSettingAssignees: false,
pageInfoByListId: {},
boardItems: {},
diff --git a/app/assets/javascripts/ci_lint/index.js b/app/assets/javascripts/ci_lint/index.js
index 274aab45deb..f97590ec5db 100644
--- a/app/assets/javascripts/ci_lint/index.js
+++ b/app/assets/javascripts/ci_lint/index.js
@@ -8,7 +8,9 @@ import CiLint from './components/ci_lint.vue';
Vue.use(VueApollo);
const apolloProvider = new VueApollo({
- defaultClient: createDefaultClient(resolvers),
+ defaultClient: createDefaultClient(resolvers, {
+ assumeImmutableResults: true,
+ }),
});
export default (containerId = '#js-ci-lint') => {
diff --git a/app/assets/javascripts/clusters/agents/components/show.vue b/app/assets/javascripts/clusters/agents/components/show.vue
new file mode 100644
index 00000000000..5c672d288c5
--- /dev/null
+++ b/app/assets/javascripts/clusters/agents/components/show.vue
@@ -0,0 +1,159 @@
+<script>
+import {
+ GlAlert,
+ GlBadge,
+ GlKeysetPagination,
+ GlLoadingIcon,
+ GlSprintf,
+ GlTab,
+ GlTabs,
+} from '@gitlab/ui';
+import { s__ } from '~/locale';
+import TimeAgoTooltip from '~/vue_shared/components/time_ago_tooltip.vue';
+import { MAX_LIST_COUNT } from '../constants';
+import getClusterAgentQuery from '../graphql/queries/get_cluster_agent.query.graphql';
+import TokenTable from './token_table.vue';
+
+export default {
+ i18n: {
+ installedInfo: s__('ClusterAgents|Created by %{name} %{time}'),
+ loadingError: s__('ClusterAgents|An error occurred while loading your agent'),
+ tokens: s__('ClusterAgents|Access tokens'),
+ unknownUser: s__('ClusterAgents|Unknown user'),
+ },
+ apollo: {
+ clusterAgent: {
+ query: getClusterAgentQuery,
+ variables() {
+ return {
+ agentName: this.agentName,
+ projectPath: this.projectPath,
+ ...this.cursor,
+ };
+ },
+ update: (data) => data?.project?.clusterAgent,
+ error() {
+ this.clusterAgent = null;
+ },
+ },
+ },
+ components: {
+ GlAlert,
+ GlBadge,
+ GlKeysetPagination,
+ GlLoadingIcon,
+ GlSprintf,
+ GlTab,
+ GlTabs,
+ TimeAgoTooltip,
+ TokenTable,
+ },
+ props: {
+ agentName: {
+ required: true,
+ type: String,
+ },
+ projectPath: {
+ required: true,
+ type: String,
+ },
+ },
+ data() {
+ return {
+ cursor: {
+ first: MAX_LIST_COUNT,
+ last: null,
+ },
+ };
+ },
+ computed: {
+ createdAt() {
+ return this.clusterAgent?.createdAt;
+ },
+ createdBy() {
+ return this.clusterAgent?.createdByUser?.name || this.$options.i18n.unknownUser;
+ },
+ isLoading() {
+ return this.$apollo.queries.clusterAgent.loading;
+ },
+ showPagination() {
+ return this.tokenPageInfo.hasPreviousPage || this.tokenPageInfo.hasNextPage;
+ },
+ tokenCount() {
+ return this.clusterAgent?.tokens?.count;
+ },
+ tokenPageInfo() {
+ return this.clusterAgent?.tokens?.pageInfo || {};
+ },
+ tokens() {
+ return this.clusterAgent?.tokens?.nodes || [];
+ },
+ },
+ methods: {
+ nextPage() {
+ this.cursor = {
+ first: MAX_LIST_COUNT,
+ last: null,
+ afterToken: this.tokenPageInfo.endCursor,
+ };
+ },
+ prevPage() {
+ this.cursor = {
+ first: null,
+ last: MAX_LIST_COUNT,
+ beforeToken: this.tokenPageInfo.startCursor,
+ };
+ },
+ },
+};
+</script>
+
+<template>
+ <section>
+ <h2>{{ agentName }}</h2>
+
+ <gl-loading-icon v-if="isLoading && clusterAgent == null" size="lg" class="gl-m-3" />
+
+ <div v-else-if="clusterAgent">
+ <p data-testid="cluster-agent-create-info">
+ <gl-sprintf :message="$options.i18n.installedInfo">
+ <template #name>
+ {{ createdBy }}
+ </template>
+
+ <template #time>
+ <time-ago-tooltip :time="createdAt" />
+ </template>
+ </gl-sprintf>
+ </p>
+
+ <gl-tabs>
+ <gl-tab>
+ <template #title>
+ <span data-testid="cluster-agent-token-count">
+ {{ $options.i18n.tokens }}
+
+ <gl-badge v-if="tokenCount" size="sm" class="gl-tab-counter-badge">{{
+ tokenCount
+ }}</gl-badge>
+ </span>
+ </template>
+
+ <gl-loading-icon v-if="isLoading" size="md" class="gl-m-3" />
+
+ <div v-else>
+ <TokenTable :tokens="tokens" />
+
+ <div v-if="showPagination" class="gl-display-flex gl-justify-content-center gl-mt-5">
+ <gl-keyset-pagination v-bind="tokenPageInfo" @prev="prevPage" @next="nextPage" />
+ </div>
+ </div>
+ </gl-tab>
+ </gl-tabs>
+ </div>
+
+ <gl-alert v-else variant="danger" :dismissible="false">
+ {{ $options.i18n.loadingError }}
+ </gl-alert>
+ </section>
+</template>
diff --git a/app/assets/javascripts/clusters/agents/components/token_table.vue b/app/assets/javascripts/clusters/agents/components/token_table.vue
new file mode 100644
index 00000000000..70ed2566134
--- /dev/null
+++ b/app/assets/javascripts/clusters/agents/components/token_table.vue
@@ -0,0 +1,122 @@
+<script>
+import { GlEmptyState, GlLink, GlTable, GlTooltip, GlTruncate } from '@gitlab/ui';
+import { helpPagePath } from '~/helpers/help_page_helper';
+import { s__ } from '~/locale';
+import TimeAgoTooltip from '~/vue_shared/components/time_ago_tooltip.vue';
+
+export default {
+ components: {
+ GlEmptyState,
+ GlLink,
+ GlTable,
+ GlTooltip,
+ GlTruncate,
+ TimeAgoTooltip,
+ },
+ i18n: {
+ createdBy: s__('ClusterAgents|Created by'),
+ createToken: s__('ClusterAgents|You will need to create a token to connect to your agent'),
+ dateCreated: s__('ClusterAgents|Date created'),
+ description: s__('ClusterAgents|Description'),
+ lastUsed: s__('ClusterAgents|Last contact'),
+ learnMore: s__('ClusterAgents|Learn how to create an agent access token'),
+ name: s__('ClusterAgents|Name'),
+ neverUsed: s__('ClusterAgents|Never'),
+ noTokens: s__('ClusterAgents|This agent has no tokens'),
+ unknownUser: s__('ClusterAgents|Unknown user'),
+ },
+ props: {
+ tokens: {
+ required: true,
+ type: Array,
+ },
+ },
+ computed: {
+ fields() {
+ return [
+ {
+ key: 'name',
+ label: this.$options.i18n.name,
+ tdAttr: { 'data-testid': 'agent-token-name' },
+ },
+ {
+ key: 'lastUsed',
+ label: this.$options.i18n.lastUsed,
+ tdAttr: { 'data-testid': 'agent-token-used' },
+ },
+ {
+ key: 'createdAt',
+ label: this.$options.i18n.dateCreated,
+ tdAttr: { 'data-testid': 'agent-token-created-time' },
+ },
+ {
+ key: 'createdBy',
+ label: this.$options.i18n.createdBy,
+ tdAttr: { 'data-testid': 'agent-token-created-user' },
+ },
+ {
+ key: 'description',
+ label: this.$options.i18n.description,
+ tdAttr: { 'data-testid': 'agent-token-description' },
+ },
+ ];
+ },
+ learnMoreUrl() {
+ return helpPagePath('user/clusters/agent/index.md', {
+ anchor: 'create-an-agent-record-in-gitlab',
+ });
+ },
+ },
+ methods: {
+ createdByName(token) {
+ return token?.createdByUser?.name || this.$options.i18n.unknownUser;
+ },
+ },
+};
+</script>
+
+<template>
+ <div v-if="tokens.length">
+ <div class="gl-text-right gl-my-5">
+ <gl-link target="_blank" :href="learnMoreUrl">
+ {{ $options.i18n.learnMore }}
+ </gl-link>
+ </div>
+
+ <gl-table :items="tokens" :fields="fields" fixed stacked="md">
+ <template #cell(lastUsed)="{ item }">
+ <time-ago-tooltip v-if="item.lastUsedAt" :time="item.lastUsedAt" />
+ <span v-else>{{ $options.i18n.neverUsed }}</span>
+ </template>
+
+ <template #cell(createdAt)="{ item }">
+ <time-ago-tooltip :time="item.createdAt" />
+ </template>
+
+ <template #cell(createdBy)="{ item }">
+ <span>{{ createdByName(item) }}</span>
+ </template>
+
+ <template #cell(description)="{ item }">
+ <div v-if="item.description" :id="`tooltip-description-container-${item.id}`">
+ <gl-truncate :id="`tooltip-description-${item.id}`" :text="item.description" />
+
+ <gl-tooltip
+ :container="`tooltip-description-container-${item.id}`"
+ :target="`tooltip-description-${item.id}`"
+ placement="top"
+ >
+ {{ item.description }}
+ </gl-tooltip>
+ </div>
+ </template>
+ </gl-table>
+ </div>
+
+ <gl-empty-state
+ v-else
+ :title="$options.i18n.noTokens"
+ :primary-button-link="learnMoreUrl"
+ :primary-button-text="$options.i18n.learnMore"
+ />
+</template>
diff --git a/app/assets/javascripts/clusters/agents/constants.js b/app/assets/javascripts/clusters/agents/constants.js
new file mode 100644
index 00000000000..bbc4630f83b
--- /dev/null
+++ b/app/assets/javascripts/clusters/agents/constants.js
@@ -0,0 +1 @@
+export const MAX_LIST_COUNT = 25;
diff --git a/app/assets/javascripts/clusters/agents/graphql/fragments/cluster_agent_token.fragment.graphql b/app/assets/javascripts/clusters/agents/graphql/fragments/cluster_agent_token.fragment.graphql
new file mode 100644
index 00000000000..1e9187e8ad1
--- /dev/null
+++ b/app/assets/javascripts/clusters/agents/graphql/fragments/cluster_agent_token.fragment.graphql
@@ -0,0 +1,11 @@
+fragment Token on ClusterAgentToken {
+ id
+ createdAt
+ description
+ lastUsedAt
+ name
+
+ createdByUser {
+ name
+ }
+}
diff --git a/app/assets/javascripts/clusters/agents/graphql/queries/get_cluster_agent.query.graphql b/app/assets/javascripts/clusters/agents/graphql/queries/get_cluster_agent.query.graphql
new file mode 100644
index 00000000000..d01db8f0a6a
--- /dev/null
+++ b/app/assets/javascripts/clusters/agents/graphql/queries/get_cluster_agent.query.graphql
@@ -0,0 +1,34 @@
+#import "~/graphql_shared/fragments/pageInfo.fragment.graphql"
+#import "../fragments/cluster_agent_token.fragment.graphql"
+
+query getClusterAgent(
+ $projectPath: ID!
+ $agentName: String!
+ $first: Int
+ $last: Int
+ $afterToken: String
+ $beforeToken: String
+) {
+ project(fullPath: $projectPath) {
+ clusterAgent(name: $agentName) {
+ id
+ createdAt
+
+ createdByUser {
+ name
+ }
+
+ tokens(first: $first, last: $last, before: $beforeToken, after: $afterToken) {
+ count
+
+ nodes {
+ ...Token
+ }
+
+ pageInfo {
+ ...PageInfo
+ }
+ }
+ }
+ }
+}
diff --git a/app/assets/javascripts/clusters/agents/index.js b/app/assets/javascripts/clusters/agents/index.js
new file mode 100644
index 00000000000..bcb5b271203
--- /dev/null
+++ b/app/assets/javascripts/clusters/agents/index.js
@@ -0,0 +1,30 @@
+import Vue from 'vue';
+import VueApollo from 'vue-apollo';
+import createDefaultClient from '~/lib/graphql';
+import AgentShowPage from './components/show.vue';
+
+Vue.use(VueApollo);
+
+export default () => {
+ const el = document.querySelector('#js-cluster-agent-details');
+
+ if (!el) {
+ return null;
+ }
+
+ const defaultClient = createDefaultClient();
+ const { agentName, projectPath } = el.dataset;
+
+ return new Vue({
+ el,
+ apolloProvider: new VueApollo({ defaultClient }),
+ render(createElement) {
+ return createElement(AgentShowPage, {
+ props: {
+ agentName,
+ projectPath,
+ },
+ });
+ },
+ });
+};
diff --git a/app/assets/javascripts/clusters_list/clusters_util.js b/app/assets/javascripts/clusters_list/clusters_util.js
new file mode 100644
index 00000000000..9b870134512
--- /dev/null
+++ b/app/assets/javascripts/clusters_list/clusters_util.js
@@ -0,0 +1,8 @@
+export function generateAgentRegistrationCommand(agentToken, kasAddress) {
+ return `docker run --pull=always --rm \\
+ registry.gitlab.com/gitlab-org/cluster-integration/gitlab-agent/cli:stable generate \\
+ --agent-token=${agentToken} \\
+ --kas-address=${kasAddress} \\
+ --agent-version stable \\
+ --namespace gitlab-kubernetes-agent | kubectl apply -f -`;
+}
diff --git a/app/assets/javascripts/clusters_list/components/agent_empty_state.vue b/app/assets/javascripts/clusters_list/components/agent_empty_state.vue
new file mode 100644
index 00000000000..405339b3d36
--- /dev/null
+++ b/app/assets/javascripts/clusters_list/components/agent_empty_state.vue
@@ -0,0 +1,119 @@
+<script>
+import { GlButton, GlEmptyState, GlLink, GlSprintf, GlAlert, GlModalDirective } from '@gitlab/ui';
+import { INSTALL_AGENT_MODAL_ID } from '../constants';
+
+export default {
+ modalId: INSTALL_AGENT_MODAL_ID,
+ components: {
+ GlButton,
+ GlEmptyState,
+ GlLink,
+ GlSprintf,
+ GlAlert,
+ },
+ directives: {
+ GlModalDirective,
+ },
+ inject: [
+ 'emptyStateImage',
+ 'projectPath',
+ 'agentDocsUrl',
+ 'installDocsUrl',
+ 'getStartedDocsUrl',
+ 'integrationDocsUrl',
+ ],
+ props: {
+ hasConfigurations: {
+ type: Boolean,
+ required: true,
+ },
+ },
+ computed: {
+ repositoryPath() {
+ return `/${this.projectPath}`;
+ },
+ },
+};
+</script>
+
+<template>
+ <gl-empty-state
+ :svg-path="emptyStateImage"
+ :title="s__('ClusterAgents|Integrate Kubernetes with a GitLab Agent')"
+ class="empty-state--agent"
+ >
+ <template #description>
+ <p class="mw-460 gl-mx-auto">
+ <gl-sprintf
+ :message="
+ s__(
+ 'ClusterAgents|The GitLab Kubernetes Agent allows an Infrastructure as Code, GitOps approach to integrating Kubernetes clusters with GitLab. %{linkStart}Learn more.%{linkEnd}',
+ )
+ "
+ >
+ <template #link="{ content }">
+ <gl-link :href="agentDocsUrl" target="_blank" data-testid="agent-docs-link">
+ {{ content }}
+ </gl-link>
+ </template>
+ </gl-sprintf>
+ </p>
+
+ <p class="mw-460 gl-mx-auto">
+ <gl-sprintf
+ :message="
+ s__(
+ 'ClusterAgents|The GitLab Agent also requires %{linkStart}enabling the Agent Server%{linkEnd}',
+ )
+ "
+ >
+ <template #link="{ content }">
+ <gl-link :href="installDocsUrl" target="_blank" data-testid="install-docs-link">
+ {{ content }}
+ </gl-link>
+ </template>
+ </gl-sprintf>
+ </p>
+
+ <gl-alert
+ v-if="!hasConfigurations"
+ variant="warning"
+ class="gl-mb-5 text-left"
+ :dismissible="false"
+ >
+ {{
+ s__(
+ 'ClusterAgents|To install an Agent you should create an agent directory in the Repository first. We recommend that you add the Agent configuration to the directory before you start the installation process.',
+ )
+ }}
+
+ <template #actions>
+ <gl-button
+ category="primary"
+ variant="info"
+ :href="getStartedDocsUrl"
+ target="_blank"
+ class="gl-ml-0!"
+ >
+ {{ s__('ClusterAgents|Read more about getting started') }}
+ </gl-button>
+ <gl-button category="secondary" variant="info" :href="repositoryPath">
+ {{ s__('ClusterAgents|Go to the repository') }}
+ </gl-button>
+ </template>
+ </gl-alert>
+ </template>
+
+ <template #actions>
+ <gl-button
+ v-gl-modal-directive="$options.modalId"
+ :disabled="!hasConfigurations"
+ data-testid="integration-primary-button"
+ category="primary"
+ variant="success"
+ >
+ {{ s__('ClusterAgents|Integrate with the GitLab Agent') }}
+ </gl-button>
+ </template>
+ </gl-empty-state>
+</template>
diff --git a/app/assets/javascripts/clusters_list/components/agent_table.vue b/app/assets/javascripts/clusters_list/components/agent_table.vue
new file mode 100644
index 00000000000..487e512c06d
--- /dev/null
+++ b/app/assets/javascripts/clusters_list/components/agent_table.vue
@@ -0,0 +1,152 @@
+<script>
+import {
+ GlButton,
+ GlLink,
+ GlModalDirective,
+ GlTable,
+ GlIcon,
+ GlSprintf,
+ GlTooltip,
+ GlPopover,
+} from '@gitlab/ui';
+import { s__ } from '~/locale';
+import TimeAgoTooltip from '~/vue_shared/components/time_ago_tooltip.vue';
+import timeagoMixin from '~/vue_shared/mixins/timeago';
+import { INSTALL_AGENT_MODAL_ID, AGENT_STATUSES, TROUBLESHOOTING_LINK } from '../constants';
+
+export default {
+ components: {
+ GlButton,
+ GlLink,
+ GlTable,
+ GlIcon,
+ GlSprintf,
+ GlTooltip,
+ GlPopover,
+ TimeAgoTooltip,
+ },
+ directives: {
+ GlModalDirective,
+ },
+ mixins: [timeagoMixin],
+ inject: ['integrationDocsUrl'],
+ INSTALL_AGENT_MODAL_ID,
+ AGENT_STATUSES,
+ TROUBLESHOOTING_LINK,
+ props: {
+ agents: {
+ required: true,
+ type: Array,
+ },
+ },
+ computed: {
+ fields() {
+ return [
+ {
+ key: 'name',
+ label: s__('ClusterAgents|Name'),
+ },
+ {
+ key: 'status',
+ label: s__('ClusterAgents|Connection status'),
+ },
+ {
+ key: 'lastContact',
+ label: s__('ClusterAgents|Last contact'),
+ },
+ {
+ key: 'configuration',
+ label: s__('ClusterAgents|Configuration'),
+ },
+ ];
+ },
+ },
+};
+</script>
+
+<template>
+ <div>
+ <div class="gl-display-block gl-text-right gl-my-3">
+ <gl-button
+ v-gl-modal-directive="$options.INSTALL_AGENT_MODAL_ID"
+ variant="confirm"
+ category="primary"
+ >{{ s__('ClusterAgents|Install a new GitLab Agent') }}
+ </gl-button>
+ </div>
+
+ <gl-table
+ :items="agents"
+ :fields="fields"
+ stacked="md"
+ head-variant="white"
+ thead-class="gl-border-b-solid gl-border-b-1 gl-border-b-gray-100"
+ data-testid="cluster-agent-list-table"
+ >
+ <template #cell(name)="{ item }">
+ <gl-link :href="item.webPath" data-testid="cluster-agent-name-link">
+ {{ item.name }}
+ </gl-link>
+ </template>
+
+ <template #cell(status)="{ item }">
+ <span
+ :id="`connection-status-${item.name}`"
+ class="gl-pr-5"
+ data-testid="cluster-agent-connection-status"
+ >
+ <span :class="$options.AGENT_STATUSES[item.status].class" class="gl-mr-3">
+ <gl-icon :name="$options.AGENT_STATUSES[item.status].icon" :size="12" /></span
+ >{{ $options.AGENT_STATUSES[item.status].name }}
+ </span>
+ <gl-tooltip
+ v-if="item.status === 'active'"
+ :target="`connection-status-${item.name}`"
+ placement="right"
+ >
+ <gl-sprintf :message="$options.AGENT_STATUSES[item.status].tooltip.title"
+ ><template #timeAgo>{{ timeFormatted(item.lastContact) }}</template>
+ </gl-sprintf>
+ </gl-tooltip>
+ <gl-popover
+ v-else
+ :target="`connection-status-${item.name}`"
+ :title="$options.AGENT_STATUSES[item.status].tooltip.title"
+ placement="right"
+ container="viewport"
+ >
+ <p>
+ <gl-sprintf :message="$options.AGENT_STATUSES[item.status].tooltip.body"
+ ><template #timeAgo>{{ timeFormatted(item.lastContact) }}</template></gl-sprintf
+ >
+ </p>
+ <p class="gl-mb-0">
+ {{ s__('ClusterAgents|For more troubleshooting information go to') }}
+ <gl-link :href="$options.TROUBLESHOOTING_LINK" target="_blank" class="gl-font-sm">
+ {{ $options.TROUBLESHOOTING_LINK }}</gl-link
+ >
+ </p>
+ </gl-popover>
+ </template>
+
+ <template #cell(lastContact)="{ item }">
+ <span data-testid="cluster-agent-last-contact">
+ <time-ago-tooltip v-if="item.lastContact" :time="item.lastContact" />
+ <span v-else>{{ s__('ClusterAgents|Never') }}</span>
+ </span>
+ </template>
+
+ <template #cell(configuration)="{ item }">
+ <span data-testid="cluster-agent-configuration-link">
+ <!-- eslint-disable @gitlab/vue-require-i18n-strings -->
+ <gl-link v-if="item.configFolder" :href="item.configFolder.webPath">
+ .gitlab/agents/{{ item.name }}
+ </gl-link>
+
+ <span v-else>.gitlab/agents/{{ item.name }}</span>
+ <!-- eslint-enable @gitlab/vue-require-i18n-strings -->
+ </span>
+ </template>
+ </gl-table>
+ </div>
+</template>
diff --git a/app/assets/javascripts/clusters_list/components/agents.vue b/app/assets/javascripts/clusters_list/components/agents.vue
new file mode 100644
index 00000000000..ed44c1f5fa7
--- /dev/null
+++ b/app/assets/javascripts/clusters_list/components/agents.vue
@@ -0,0 +1,156 @@
+<script>
+import { GlAlert, GlKeysetPagination, GlLoadingIcon } from '@gitlab/ui';
+import { MAX_LIST_COUNT, ACTIVE_CONNECTION_TIME } from '../constants';
+import getAgentsQuery from '../graphql/queries/get_agents.query.graphql';
+import AgentEmptyState from './agent_empty_state.vue';
+import AgentTable from './agent_table.vue';
+import InstallAgentModal from './install_agent_modal.vue';
+
+export default {
+ apollo: {
+ agents: {
+ query: getAgentsQuery,
+ variables() {
+ return {
+ defaultBranchName: this.defaultBranchName,
+ projectPath: this.projectPath,
+ ...this.cursor,
+ };
+ },
+ update(data) {
+ this.updateTreeList(data);
+ return data;
+ },
+ },
+ },
+ components: {
+ AgentEmptyState,
+ AgentTable,
+ InstallAgentModal,
+ GlAlert,
+ GlKeysetPagination,
+ GlLoadingIcon,
+ },
+ inject: ['projectPath'],
+ props: {
+ defaultBranchName: {
+ default: '.noBranch',
+ required: false,
+ type: String,
+ },
+ },
+ data() {
+ return {
+ cursor: {
+ first: MAX_LIST_COUNT,
+ last: null,
+ },
+ folderList: {},
+ };
+ },
+ computed: {
+ agentList() {
+ let list = this.agents?.project?.clusterAgents?.nodes;
+
+ if (list) {
+ list = list.map((agent) => {
+ const configFolder = this.folderList[agent.name];
+ const lastContact = this.getLastContact(agent);
+ const status = this.getStatus(lastContact);
+ return { ...agent, configFolder, lastContact, status };
+ });
+ }
+
+ return list;
+ },
+ agentPageInfo() {
+ return this.agents?.project?.clusterAgents?.pageInfo || {};
+ },
+ isLoading() {
+ return this.$apollo.queries.agents.loading;
+ },
+ showPagination() {
+ return this.agentPageInfo.hasPreviousPage || this.agentPageInfo.hasNextPage;
+ },
+ treePageInfo() {
+ return this.agents?.project?.repository?.tree?.trees?.pageInfo || {};
+ },
+ hasConfigurations() {
+ return Boolean(this.agents?.project?.repository?.tree?.trees?.nodes?.length);
+ },
+ },
+ methods: {
+ reloadAgents() {
+ this.$apollo.queries.agents.refetch();
+ },
+ nextPage() {
+ this.cursor = {
+ first: MAX_LIST_COUNT,
+ last: null,
+ afterAgent: this.agentPageInfo.endCursor,
+ afterTree: this.treePageInfo.endCursor,
+ };
+ },
+ prevPage() {
+ this.cursor = {
+ first: null,
+ last: MAX_LIST_COUNT,
+ beforeAgent: this.agentPageInfo.startCursor,
+ beforeTree: this.treePageInfo.endCursor,
+ };
+ },
+ updateTreeList(data) {
+ const configFolders = data?.project?.repository?.tree?.trees?.nodes;
+
+ if (configFolders) {
+ configFolders.forEach((folder) => {
+ this.folderList[folder.name] = folder;
+ });
+ }
+ },
+ getLastContact(agent) {
+ const tokens = agent?.tokens?.nodes;
+ let lastContact = null;
+ if (tokens?.length) {
+ tokens.forEach((token) => {
+ const lastContactToDate = new Date(token.lastUsedAt).getTime();
+ if (lastContactToDate > lastContact) {
+ lastContact = lastContactToDate;
+ }
+ });
+ }
+ return lastContact;
+ },
+ getStatus(lastContact) {
+ if (lastContact) {
+ const now = new Date().getTime();
+ const diff = now - lastContact;
+
+ return diff > ACTIVE_CONNECTION_TIME ? 'inactive' : 'active';
+ }
+ return 'unused';
+ },
+ },
+};
+</script>
+
+<template>
+ <gl-loading-icon v-if="isLoading" size="md" class="gl-mt-3" />
+
+ <section v-else-if="agentList" class="gl-mt-3">
+ <div v-if="agentList.length">
+ <AgentTable :agents="agentList" />
+
+ <div v-if="showPagination" class="gl-display-flex gl-justify-content-center gl-mt-5">
+ <gl-keyset-pagination v-bind="agentPageInfo" @prev="prevPage" @next="nextPage" />
+ </div>
+ </div>
+
+ <AgentEmptyState v-else :has-configurations="hasConfigurations" />
+ <InstallAgentModal @agentRegistered="reloadAgents" />
+ </section>
+
+ <gl-alert v-else variant="danger" :dismissible="false">
+ {{ s__('ClusterAgents|An error occurred while loading your GitLab Agents') }}
+ </gl-alert>
+</template>
diff --git a/app/assets/javascripts/clusters_list/components/available_agents_dropdown.vue b/app/assets/javascripts/clusters_list/components/available_agents_dropdown.vue
new file mode 100644
index 00000000000..9fb020d2f4f
--- /dev/null
+++ b/app/assets/javascripts/clusters_list/components/available_agents_dropdown.vue
@@ -0,0 +1,83 @@
+<script>
+import { GlDropdown, GlDropdownItem } from '@gitlab/ui';
+import { I18N_AVAILABLE_AGENTS_DROPDOWN } from '../constants';
+import agentConfigurations from '../graphql/queries/agent_configurations.query.graphql';
+
+export default {
+ name: 'AvailableAgentsDropdown',
+ i18n: I18N_AVAILABLE_AGENTS_DROPDOWN,
+ components: {
+ GlDropdown,
+ GlDropdownItem,
+ },
+ inject: ['projectPath'],
+ props: {
+ isRegistering: {
+ required: true,
+ type: Boolean,
+ },
+ },
+ apollo: {
+ agents: {
+ query: agentConfigurations,
+ variables() {
+ return {
+ projectPath: this.projectPath,
+ };
+ },
+ update(data) {
+ this.populateAvailableAgents(data);
+ },
+ },
+ },
+ data() {
+ return {
+ availableAgents: [],
+ selectedAgent: null,
+ };
+ },
+ computed: {
+ isLoading() {
+ return this.$apollo.queries.agents.loading;
+ },
+ dropdownText() {
+ if (this.isRegistering) {
+ return this.$options.i18n.registeringAgent;
+ } else if (this.selectedAgent === null) {
+ return this.$options.i18n.selectAgent;
+ }
+
+ return this.selectedAgent;
+ },
+ },
+ methods: {
+ selectAgent(agent) {
+ this.$emit('agentSelected', agent);
+ this.selectedAgent = agent;
+ },
+ isSelected(agent) {
+ return this.selectedAgent === agent;
+ },
+ populateAvailableAgents(data) {
+ const installedAgents = data?.project?.clusterAgents?.nodes.map((agent) => agent.name) ?? [];
+ const configuredAgents =
+ data?.project?.agentConfigurations?.nodes.map((config) => config.agentName) ?? [];
+
+ this.availableAgents = configuredAgents.filter((agent) => !installedAgents.includes(agent));
+ },
+ },
+};
+</script>
+<template>
+ <gl-dropdown :text="dropdownText" :loading="isLoading || isRegistering">
+ <gl-dropdown-item
+ v-for="agent in availableAgents"
+ :key="agent"
+ :is-checked="isSelected(agent)"
+ is-check-item
+ @click="selectAgent(agent)"
+ >
+ {{ agent }}
+ </gl-dropdown-item>
+ </gl-dropdown>
+</template>
diff --git a/app/assets/javascripts/clusters_list/components/install_agent_modal.vue b/app/assets/javascripts/clusters_list/components/install_agent_modal.vue
new file mode 100644
index 00000000000..5f192fe4d5a
--- /dev/null
+++ b/app/assets/javascripts/clusters_list/components/install_agent_modal.vue
@@ -0,0 +1,259 @@
+<script>
+import {
+ GlAlert,
+ GlButton,
+ GlFormGroup,
+ GlFormInputGroup,
+ GlLink,
+ GlModal,
+ GlSprintf,
+} from '@gitlab/ui';
+import { helpPagePath } from '~/helpers/help_page_helper';
+import ClipboardButton from '~/vue_shared/components/clipboard_button.vue';
+import CodeBlock from '~/vue_shared/components/code_block.vue';
+import { generateAgentRegistrationCommand } from '../clusters_util';
+import { INSTALL_AGENT_MODAL_ID, I18N_INSTALL_AGENT_MODAL } from '../constants';
+import createAgent from '../graphql/mutations/create_agent.mutation.graphql';
+import createAgentToken from '../graphql/mutations/create_agent_token.mutation.graphql';
+import AvailableAgentsDropdown from './available_agents_dropdown.vue';
+
+export default {
+ modalId: INSTALL_AGENT_MODAL_ID,
+ i18n: I18N_INSTALL_AGENT_MODAL,
+ components: {
+ AvailableAgentsDropdown,
+ ClipboardButton,
+ CodeBlock,
+ GlAlert,
+ GlButton,
+ GlFormGroup,
+ GlFormInputGroup,
+ GlLink,
+ GlModal,
+ GlSprintf,
+ },
+ inject: ['projectPath', 'kasAddress'],
+ data() {
+ return {
+ registering: false,
+ agentName: null,
+ agentToken: null,
+ error: null,
+ };
+ },
+ computed: {
+ registered() {
+ return Boolean(this.agentToken);
+ },
+ nextButtonDisabled() {
+ return !this.registering && this.agentName !== null;
+ },
+ canCancel() {
+ return !this.registered && !this.registering;
+ },
+ agentRegistrationCommand() {
+ return generateAgentRegistrationCommand(this.agentToken, this.kasAddress);
+ },
+ basicInstallPath() {
+ return helpPagePath('user/clusters/agent/index', {
+ anchor: 'install-the-agent-into-the-cluster',
+ });
+ },
+ advancedInstallPath() {
+ return helpPagePath('user/clusters/agent/index', { anchor: 'advanced-installation' });
+ },
+ },
+ methods: {
+ setAgentName(name) {
+ this.agentName = name;
+ },
+ cancelClicked() {
+ this.$refs.modal.hide();
+ },
+ doneClicked() {
+ this.$emit('agentRegistered');
+ this.$refs.modal.hide();
+ },
+ resetModal() {
+ this.registering = null;
+ this.agentName = null;
+ this.agentToken = null;
+ this.error = null;
+ },
+ createAgentMutation() {
+ return this.$apollo
+ .mutate({
+ mutation: createAgent,
+ variables: {
+ input: {
+ name: this.agentName,
+ projectPath: this.projectPath,
+ },
+ },
+ })
+ .then(({ data: { createClusterAgent } }) => createClusterAgent);
+ },
+ createAgentTokenMutation(agendId) {
+ return this.$apollo
+ .mutate({
+ mutation: createAgentToken,
+ variables: {
+ input: {
+ clusterAgentId: agendId,
+ name: this.agentName,
+ },
+ },
+ })
+ .then(({ data: { clusterAgentTokenCreate } }) => clusterAgentTokenCreate);
+ },
+ async registerAgent() {
+ this.registering = true;
+ this.error = null;
+
+ try {
+ const { errors: agentErrors, clusterAgent } = await this.createAgentMutation();
+
+ if (agentErrors?.length > 0) {
+ throw new Error(agentErrors[0]);
+ }
+
+ const { errors: tokenErrors, secret } = await this.createAgentTokenMutation(
+ clusterAgent.id,
+ );
+
+ if (tokenErrors?.length > 0) {
+ throw new Error(tokenErrors[0]);
+ }
+
+ this.agentToken = secret;
+ } catch (error) {
+ if (error) {
+ this.error = error.message;
+ } else {
+ this.error = this.$options.i18n.unknownError;
+ }
+ } finally {
+ this.registering = false;
+ }
+ },
+ },
+};
+</script>
+
+<template>
+ <gl-modal
+ ref="modal"
+ :modal-id="$options.modalId"
+ :title="$options.i18n.modalTitle"
+ static
+ lazy
+ @hidden="resetModal"
+ >
+ <template v-if="!registered">
+ <p>
+ <strong>{{ $options.i18n.selectAgentTitle }}</strong>
+ </p>
+
+ <p>
+ <gl-sprintf :message="$options.i18n.selectAgentBody">
+ <template #link="{ content }">
+ <gl-link :href="basicInstallPath" target="_blank"> {{ content }}</gl-link>
+ </template>
+ </gl-sprintf>
+ </p>
+
+ <form>
+ <gl-form-group label-for="agent-name">
+ <available-agents-dropdown
+ class="gl-w-70p"
+ :is-registering="registering"
+ @agentSelected="setAgentName"
+ />
+ </gl-form-group>
+ </form>
+
+ <p v-if="error">
+ <gl-alert
+ :title="$options.i18n.registrationErrorTitle"
+ variant="danger"
+ :dismissible="false"
+ >
+ {{ error }}
+ </gl-alert>
+ </p>
+ </template>
+
+ <template v-else>
+ <p>
+ <strong>{{ $options.i18n.tokenTitle }}</strong>
+ </p>
+
+ <p>
+ <gl-sprintf :message="$options.i18n.tokenBody">
+ <template #link="{ content }">
+ <gl-link :href="basicInstallPath" target="_blank"> {{ content }}</gl-link>
+ </template>
+ </gl-sprintf>
+ </p>
+
+ <p>
+ <gl-alert
+ :title="$options.i18n.tokenSingleUseWarningTitle"
+ variant="warning"
+ :dismissible="false"
+ >
+ {{ $options.i18n.tokenSingleUseWarningBody }}
+ </gl-alert>
+ </p>
+
+ <p>
+ <gl-form-input-group readonly :value="agentToken" :select-on-click="true">
+ <template #append>
+ <clipboard-button :text="agentToken" :title="$options.i18n.copyToken" />
+ </template>
+ </gl-form-input-group>
+ </p>
+
+ <p>
+ <strong>{{ $options.i18n.basicInstallTitle }}</strong>
+ </p>
+
+ <p>
+ {{ $options.i18n.basicInstallBody }}
+ </p>
+
+ <p>
+ <code-block :code="agentRegistrationCommand" />
+ </p>
+
+ <p>
+ <strong>{{ $options.i18n.advancedInstallTitle }}</strong>
+ </p>
+
+ <p>
+ <gl-sprintf :message="$options.i18n.advancedInstallBody">
+ <template #link="{ content }">
+ <gl-link :href="advancedInstallPath" target="_blank"> {{ content }}</gl-link>
+ </template>
+ </gl-sprintf>
+ </p>
+ </template>
+
+ <template #modal-footer>
+ <gl-button v-if="canCancel" @click="cancelClicked">{{ $options.i18n.cancel }} </gl-button>
+
+ <gl-button v-if="registered" variant="confirm" category="primary" @click="doneClicked"
+ >{{ $options.i18n.done }}
+ </gl-button>
+
+ <gl-button
+ v-else
+ :disabled="!nextButtonDisabled"
+ variant="confirm"
+ category="primary"
+ @click="registerAgent"
+ >{{ $options.i18n.next }}
+ </gl-button>
+ </template>
+ </gl-modal>
+</template>
diff --git a/app/assets/javascripts/clusters_list/constants.js b/app/assets/javascripts/clusters_list/constants.js
index f39678b73dc..0bade1fc281 100644
--- a/app/assets/javascripts/clusters_list/constants.js
+++ b/app/assets/javascripts/clusters_list/constants.js
@@ -1,4 +1,10 @@
-import { __, s__ } from '~/locale';
+import { __, s__, sprintf } from '~/locale';
+
+export const MAX_LIST_COUNT = 25;
+export const INSTALL_AGENT_MODAL_ID = 'install-agent';
+export const ACTIVE_CONNECTION_TIME = 480000;
+export const TROUBLESHOOTING_LINK =
+ 'https://docs.gitlab.com/ee/user/clusters/agent/#troubleshooting';
export const CLUSTER_ERRORS = {
default: {
@@ -58,3 +64,80 @@ export const STATUSES = {
deleting: { title: __('Deleting') },
creating: { title: __('Creating') },
};
+
+export const I18N_INSTALL_AGENT_MODAL = {
+ next: __('Next'),
+ done: __('Done'),
+ cancel: __('Cancel'),
+
+ modalTitle: s__('ClusterAgents|Install new Agent'),
+
+ selectAgentTitle: s__('ClusterAgents|Select which Agent you want to install'),
+ selectAgentBody: s__(
+ `ClusterAgents|Select the Agent you want to register with GitLab and install on your cluster. To learn more about the Kubernetes Agent registration process %{linkStart}go to the documentation%{linkEnd}.`,
+ ),
+
+ copyToken: s__('ClusterAgents|Copy token'),
+ tokenTitle: s__('ClusterAgents|Registration token'),
+ tokenBody: s__(
+ `ClusterAgents|The registration token will be used to connect the Agent on your cluster to GitLab. To learn more about the registration tokens and how they are used %{linkStart}go to the documentation%{linkEnd}.`,
+ ),
+
+ tokenSingleUseWarningTitle: s__(
+ 'ClusterAgents|The token value will not be shown again after you close this window.',
+ ),
+ tokenSingleUseWarningBody: s__(
+ `ClusterAgents|The recommended installation method provided below includes the token. If you want to follow the alternative installation method provided in the docs make sure you save the token value before you close the window.`,
+ ),
+
+ basicInstallTitle: s__('ClusterAgents|Recommended installation method'),
+ basicInstallBody: s__(
+ `Open a CLI and connect to the cluster you want to install the Agent in. Use this installation method to minimize any manual steps. The token is already included in the command.`,
+ ),
+
+ advancedInstallTitle: s__('ClusterAgents|Alternative installation methods'),
+ advancedInstallBody: s__(
+ 'ClusterAgents|For alternative installation methods %{linkStart}go to the documentation%{linkEnd}.',
+ ),
+
+ registrationErrorTitle: s__('Failed to register Agent'),
+ unknownError: s__('ClusterAgents|An unknown error occurred. Please try again.'),
+};
+
+export const I18N_AVAILABLE_AGENTS_DROPDOWN = {
+ selectAgent: s__('ClusterAgents|Select an Agent'),
+ registeringAgent: s__('ClusterAgents|Registering Agent'),
+};
+
+export const AGENT_STATUSES = {
+ active: {
+ name: s__('ClusterAgents|Connected'),
+ icon: 'status-success',
+ class: 'text-success-500',
+ tooltip: {
+ title: sprintf(s__('ClusterAgents|Last connected %{timeAgo}.')),
+ },
+ },
+ inactive: {
+ name: s__('ClusterAgents|Not connected'),
+ icon: 'severity-critical',
+ class: 'text-danger-800',
+ tooltip: {
+ title: s__('ClusterAgents|Agent might not be connected to GitLab'),
+ body: sprintf(
+ s__(
+ 'ClusterAgents|The Agent has not been connected in a long time. There might be a connectivity issue. Last contact was %{timeAgo}.',
+ ),
+ ),
+ },
+ },
+ unused: {
+ name: s__('ClusterAgents|Never connected'),
+ icon: 'status-neutral',
+ class: 'text-secondary-400',
+ tooltip: {
+ title: s__('ClusterAgents|Agent never connected to GitLab'),
+ body: s__('ClusterAgents|Make sure you are using a valid token.'),
+ },
+ },
+};
diff --git a/app/assets/javascripts/clusters_list/graphql/mutations/create_agent.mutation.graphql b/app/assets/javascripts/clusters_list/graphql/mutations/create_agent.mutation.graphql
new file mode 100644
index 00000000000..c29756159f5
--- /dev/null
+++ b/app/assets/javascripts/clusters_list/graphql/mutations/create_agent.mutation.graphql
@@ -0,0 +1,8 @@
+mutation createClusterAgent($input: CreateClusterAgentInput!) {
+ createClusterAgent(input: $input) {
+ clusterAgent {
+ id
+ }
+ errors
+ }
+}
diff --git a/app/assets/javascripts/clusters_list/graphql/mutations/create_agent_token.mutation.graphql b/app/assets/javascripts/clusters_list/graphql/mutations/create_agent_token.mutation.graphql
new file mode 100644
index 00000000000..e93580cf416
--- /dev/null
+++ b/app/assets/javascripts/clusters_list/graphql/mutations/create_agent_token.mutation.graphql
@@ -0,0 +1,9 @@
+mutation createClusterAgentToken($input: ClusterAgentTokenCreateInput!) {
+ clusterAgentTokenCreate(input: $input) {
+ secret
+ token {
+ id
+ }
+ errors
+ }
+}
diff --git a/app/assets/javascripts/clusters_list/graphql/queries/agent_configurations.query.graphql b/app/assets/javascripts/clusters_list/graphql/queries/agent_configurations.query.graphql
new file mode 100644
index 00000000000..40b61337024
--- /dev/null
+++ b/app/assets/javascripts/clusters_list/graphql/queries/agent_configurations.query.graphql
@@ -0,0 +1,15 @@
+query agentConfigurations($projectPath: ID!) {
+ project(fullPath: $projectPath) {
+ agentConfigurations {
+ nodes {
+ agentName
+ }
+ }
+
+ clusterAgents {
+ nodes {
+ name
+ }
+ }
+ }
+}
diff --git a/app/assets/javascripts/clusters_list/graphql/queries/get_agents.query.graphql b/app/assets/javascripts/clusters_list/graphql/queries/get_agents.query.graphql
new file mode 100644
index 00000000000..61989e00d9e
--- /dev/null
+++ b/app/assets/javascripts/clusters_list/graphql/queries/get_agents.query.graphql
@@ -0,0 +1,47 @@
+#import "~/graphql_shared/fragments/pageInfo.fragment.graphql"
+
+query getAgents(
+ $defaultBranchName: String!
+ $projectPath: ID!
+ $first: Int
+ $last: Int
+ $afterAgent: String
+ $afterTree: String
+ $beforeAgent: String
+ $beforeTree: String
+) {
+ project(fullPath: $projectPath) {
+ clusterAgents(first: $first, last: $last, before: $beforeAgent, after: $afterAgent) {
+ nodes {
+ id
+ name
+ webPath
+ tokens {
+ nodes {
+ lastUsedAt
+ }
+ }
+ }
+
+ pageInfo {
+ ...PageInfo
+ }
+ }
+
+ repository {
+ tree(path: ".gitlab/agents", ref: $defaultBranchName) {
+ trees(first: $first, last: $last, after: $afterTree, before: $beforeTree) {
+ nodes {
+ name
+ path
+ webPath
+ }
+
+ pageInfo {
+ ...PageInfo
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/app/assets/javascripts/clusters_list/index.js b/app/assets/javascripts/clusters_list/index.js
index daa82892773..de18965abbd 100644
--- a/app/assets/javascripts/clusters_list/index.js
+++ b/app/assets/javascripts/clusters_list/index.js
@@ -1,6 +1,11 @@
import Vue from 'vue';
+import VueApollo from 'vue-apollo';
import loadClusters from './load_clusters';
+import loadAgents from './load_agents';
+
+Vue.use(VueApollo);
export default () => {
loadClusters(Vue);
+ loadAgents(Vue, VueApollo);
};
diff --git a/app/assets/javascripts/clusters_list/load_agents.js b/app/assets/javascripts/clusters_list/load_agents.js
new file mode 100644
index 00000000000..b77d386df20
--- /dev/null
+++ b/app/assets/javascripts/clusters_list/load_agents.js
@@ -0,0 +1,44 @@
+import createDefaultClient from '~/lib/graphql';
+import Agents from './components/agents.vue';
+
+export default (Vue, VueApollo) => {
+ const el = document.querySelector('#js-cluster-agents-list');
+
+ if (!el) {
+ return null;
+ }
+
+ const defaultClient = createDefaultClient({}, { assumeImmutableResults: true });
+
+ const {
+ emptyStateImage,
+ defaultBranchName,
+ projectPath,
+ agentDocsUrl,
+ installDocsUrl,
+ getStartedDocsUrl,
+ integrationDocsUrl,
+ kasAddress,
+ } = el.dataset;
+
+ return new Vue({
+ el,
+ apolloProvider: new VueApollo({ defaultClient }),
+ provide: {
+ emptyStateImage,
+ projectPath,
+ agentDocsUrl,
+ installDocsUrl,
+ getStartedDocsUrl,
+ integrationDocsUrl,
+ kasAddress,
+ },
+ render(createElement) {
+ return createElement(Agents, {
+ props: {
+ defaultBranchName,
+ },
+ });
+ },
+ });
+};
diff --git a/app/assets/javascripts/comment_type_toggle.js b/app/assets/javascripts/comment_type_toggle.js
deleted file mode 100644
index 2fcd40a901d..00000000000
--- a/app/assets/javascripts/comment_type_toggle.js
+++ /dev/null
@@ -1,71 +0,0 @@
-import DropLab from './droplab/drop_lab';
-import ISetter from './droplab/plugins/input_setter';
-
-// Todo: Remove this when fixing issue in input_setter plugin
-const InputSetter = { ...ISetter };
-
-class CommentTypeToggle {
- constructor(opts = {}) {
- this.dropdownTrigger = opts.dropdownTrigger;
- this.dropdownList = opts.dropdownList;
- this.noteTypeInput = opts.noteTypeInput;
- this.submitButton = opts.submitButton;
- this.closeButton = opts.closeButton;
- this.reopenButton = opts.reopenButton;
- }
-
- initDroplab() {
- this.droplab = new DropLab();
-
- const config = this.setConfig();
-
- this.droplab.init(this.dropdownTrigger, this.dropdownList, [InputSetter], config);
- }
-
- setConfig() {
- const config = {
- InputSetter: [
- {
- input: this.noteTypeInput,
- valueAttribute: 'data-value',
- },
- {
- input: this.submitButton,
- valueAttribute: 'data-submit-text',
- },
- ],
- };
-
- if (this.closeButton) {
- config.InputSetter.push(
- {
- input: this.closeButton,
- valueAttribute: 'data-close-text',
- },
- {
- input: this.closeButton,
- valueAttribute: 'data-close-text',
- inputAttribute: 'data-alternative-text',
- },
- );
- }
-
- if (this.reopenButton) {
- config.InputSetter.push(
- {
- input: this.reopenButton,
- valueAttribute: 'data-reopen-text',
- },
- {
- input: this.reopenButton,
- valueAttribute: 'data-reopen-text',
- inputAttribute: 'data-alternative-text',
- },
- );
- }
-
- return config;
- }
-}
-
-export default CommentTypeToggle;
diff --git a/app/assets/javascripts/content_editor/components/top_toolbar.vue b/app/assets/javascripts/content_editor/components/top_toolbar.vue
index 82a449ae6af..89182b3a09f 100644
--- a/app/assets/javascripts/content_editor/components/top_toolbar.vue
+++ b/app/assets/javascripts/content_editor/components/top_toolbar.vue
@@ -112,6 +112,15 @@ export default {
@execute="trackToolbarControlExecution"
/>
<toolbar-button
+ data-testid="details"
+ content-type="details"
+ icon-name="details-block"
+ class="gl-mx-2"
+ editor-command="toggleDetails"
+ :label="__('Add a collapsible section')"
+ @execute="trackToolbarControlExecution"
+ />
+ <toolbar-button
data-testid="horizontal-rule"
content-type="horizontalRule"
icon-name="dash"
diff --git a/app/assets/javascripts/content_editor/components/wrappers/details.vue b/app/assets/javascripts/content_editor/components/wrappers/details.vue
new file mode 100644
index 00000000000..aff15ac3e53
--- /dev/null
+++ b/app/assets/javascripts/content_editor/components/wrappers/details.vue
@@ -0,0 +1,33 @@
+<script>
+import { NodeViewWrapper, NodeViewContent } from '@tiptap/vue-2';
+
+export default {
+ name: 'DetailsWrapper',
+ components: {
+ NodeViewWrapper,
+ NodeViewContent,
+ },
+ props: {
+ node: {
+ type: Object,
+ required: true,
+ },
+ },
+ data() {
+ return {
+ open: true,
+ };
+ },
+};
+</script>
+<template>
+ <node-view-wrapper class="gl-display-flex">
+ <div
+ class="details-toggle-icon"
+ data-testid="details-toggle-icon"
+ :class="{ 'is-open': open }"
+ @click="open = !open"
+ ></div>
+ <node-view-content as="ul" class="details-content" :class="{ 'is-open': open }" />
+ </node-view-wrapper>
+</template>
diff --git a/app/assets/javascripts/content_editor/components/wrappers/frontmatter.vue b/app/assets/javascripts/content_editor/components/wrappers/frontmatter.vue
new file mode 100644
index 00000000000..97b69afd12e
--- /dev/null
+++ b/app/assets/javascripts/content_editor/components/wrappers/frontmatter.vue
@@ -0,0 +1,32 @@
+<script>
+import { NodeViewWrapper, NodeViewContent } from '@tiptap/vue-2';
+import { __ } from '~/locale';
+
+export default {
+ name: 'FrontMatter',
+ components: {
+ NodeViewWrapper,
+ NodeViewContent,
+ },
+ props: {
+ node: {
+ type: Object,
+ required: true,
+ },
+ },
+ i18n: {
+ frontmatter: __('frontmatter'),
+ },
+};
+</script>
+<template>
+ <node-view-wrapper class="gl-relative code highlight" as="pre">
+ <span
+ data-testid="frontmatter-label"
+ class="gl-absolute gl-top-0 gl-right-3"
+ contenteditable="false"
+ >{{ $options.i18n.frontmatter }}:{{ node.attrs.language }}</span
+ >
+ <node-view-content as="code" />
+ </node-view-wrapper>
+</template>
diff --git a/app/assets/javascripts/content_editor/content_editor.stories.js b/app/assets/javascripts/content_editor/content_editor.stories.js
index 8f2ce8feb5d..9329bbcb2c7 100644
--- a/app/assets/javascripts/content_editor/content_editor.stories.js
+++ b/app/assets/javascripts/content_editor/content_editor.stories.js
@@ -2,7 +2,7 @@ import { ContentEditor } from './index';
export default {
component: ContentEditor,
- title: 'Components/Content Editor',
+ title: 'content_editor/components/content_editor',
};
const Template = (_, { argTypes }) => ({
diff --git a/app/assets/javascripts/content_editor/extensions/code_block_highlight.js b/app/assets/javascripts/content_editor/extensions/code_block_highlight.js
index 25f5837d2a6..1ed1ab0315f 100644
--- a/app/assets/javascripts/content_editor/extensions/code_block_highlight.js
+++ b/app/assets/javascripts/content_editor/extensions/code_block_highlight.js
@@ -11,7 +11,8 @@ export default CodeBlockLowlight.extend({
parseHTML: (element) => extractLanguage(element),
},
class: {
- default: 'code highlight js-syntax-highlight',
+ // eslint-disable-next-line @gitlab/require-i18n-strings
+ default: 'code highlight',
},
};
},
diff --git a/app/assets/javascripts/content_editor/extensions/color_chip.js b/app/assets/javascripts/content_editor/extensions/color_chip.js
new file mode 100644
index 00000000000..deb5029a1f0
--- /dev/null
+++ b/app/assets/javascripts/content_editor/extensions/color_chip.js
@@ -0,0 +1,73 @@
+import { Node } from '@tiptap/core';
+import { Plugin, PluginKey } from 'prosemirror-state';
+import { Decoration, DecorationSet } from 'prosemirror-view';
+import { isValidColorExpression } from '~/lib/utils/color_utils';
+import { PARSE_HTML_PRIORITY_HIGHEST } from '../constants';
+
+const colorExpressionTypes = ['#', 'hsl', 'rgb'];
+
+const isValidColor = (color) => {
+ if (!colorExpressionTypes.some((type) => color.toLowerCase().startsWith(type))) {
+ return false;
+ }
+
+ return isValidColorExpression(color);
+};
+
+const highlightColors = (doc) => {
+ const decorations = [];
+
+ doc.descendants((node, position) => {
+ const { text, marks } = node;
+
+ if (!text || marks.length === 0 || marks[0].type.name !== 'code' || !isValidColor(text)) {
+ return;
+ }
+
+ const from = position;
+ const to = from + text.length;
+ const decoration = Decoration.inline(from, to, {
+ class: 'gl-display-inline-flex gl-align-items-center content-editor-color-chip',
+ style: `--gl-color-chip-color: ${text}`,
+ });
+
+ decorations.push(decoration);
+ });
+
+ return DecorationSet.create(doc, decorations);
+};
+
+export const colorDecoratorPlugin = new Plugin({
+ key: new PluginKey('colorDecorator'),
+ state: {
+ init(_, { doc }) {
+ return highlightColors(doc);
+ },
+ apply(transaction, oldState) {
+ return transaction.docChanged ? highlightColors(transaction.doc) : oldState;
+ },
+ },
+ props: {
+ decorations(state) {
+ return this.getState(state);
+ },
+ },
+});
+
+export default Node.create({
+ name: 'colorChip',
+
+ parseHTML() {
+ return [
+ {
+ tag: '.gfm-color_chip',
+ ignore: true,
+ priority: PARSE_HTML_PRIORITY_HIGHEST,
+ },
+ ];
+ },
+
+ addProseMirrorPlugins() {
+ return [colorDecoratorPlugin];
+ },
+});
diff --git a/app/assets/javascripts/content_editor/extensions/details.js b/app/assets/javascripts/content_editor/extensions/details.js
new file mode 100644
index 00000000000..e3d54ed01fd
--- /dev/null
+++ b/app/assets/javascripts/content_editor/extensions/details.js
@@ -0,0 +1,36 @@
+import { Node } from '@tiptap/core';
+import { VueNodeViewRenderer } from '@tiptap/vue-2';
+import { wrappingInputRule } from 'prosemirror-inputrules';
+import DetailsWrapper from '../components/wrappers/details.vue';
+
+export const inputRegex = /^\s*(<details>)$/;
+
+export default Node.create({
+ name: 'details',
+ content: 'detailsContent+',
+ // eslint-disable-next-line @gitlab/require-i18n-strings
+ group: 'block list',
+
+ parseHTML() {
+ return [{ tag: 'details' }];
+ },
+
+ renderHTML({ HTMLAttributes }) {
+ return ['ul', HTMLAttributes, 0];
+ },
+
+ addNodeView() {
+ return VueNodeViewRenderer(DetailsWrapper);
+ },
+
+ addInputRules() {
+ return [wrappingInputRule(inputRegex, this.type)];
+ },
+
+ addCommands() {
+ return {
+ setDetails: () => ({ commands }) => commands.wrapInList('details'),
+ toggleDetails: () => ({ commands }) => commands.toggleList('details', 'detailsContent'),
+ };
+ },
+});
diff --git a/app/assets/javascripts/content_editor/extensions/details_content.js b/app/assets/javascripts/content_editor/extensions/details_content.js
new file mode 100644
index 00000000000..fb6c49d91aa
--- /dev/null
+++ b/app/assets/javascripts/content_editor/extensions/details_content.js
@@ -0,0 +1,25 @@
+import { Node } from '@tiptap/core';
+import { PARSE_HTML_PRIORITY_HIGHEST } from '../constants';
+
+export default Node.create({
+ name: 'detailsContent',
+ content: 'block+',
+ defining: true,
+
+ parseHTML() {
+ return [
+ { tag: '*', consuming: false, context: 'details/', priority: PARSE_HTML_PRIORITY_HIGHEST },
+ ];
+ },
+
+ renderHTML({ HTMLAttributes }) {
+ return ['li', HTMLAttributes, 0];
+ },
+
+ addKeyboardShortcuts() {
+ return {
+ Enter: () => this.editor.commands.splitListItem('detailsContent'),
+ 'Shift-Tab': () => this.editor.commands.liftListItem('detailsContent'),
+ };
+ },
+});
diff --git a/app/assets/javascripts/content_editor/extensions/frontmatter.js b/app/assets/javascripts/content_editor/extensions/frontmatter.js
new file mode 100644
index 00000000000..64c84fe046b
--- /dev/null
+++ b/app/assets/javascripts/content_editor/extensions/frontmatter.js
@@ -0,0 +1,20 @@
+import { VueNodeViewRenderer } from '@tiptap/vue-2';
+import { PARSE_HTML_PRIORITY_HIGHEST } from '../constants';
+import FrontmatterWrapper from '../components/wrappers/frontmatter.vue';
+import CodeBlockHighlight from './code_block_highlight';
+
+export default CodeBlockHighlight.extend({
+ name: 'frontmatter',
+ parseHTML() {
+ return [
+ {
+ tag: 'pre[data-lang-params="frontmatter"]',
+ preserveWhitespace: 'full',
+ priority: PARSE_HTML_PRIORITY_HIGHEST,
+ },
+ ];
+ },
+ addNodeView() {
+ return new VueNodeViewRenderer(FrontmatterWrapper);
+ },
+});
diff --git a/app/assets/javascripts/content_editor/extensions/math_inline.js b/app/assets/javascripts/content_editor/extensions/math_inline.js
new file mode 100644
index 00000000000..60f5288dcf6
--- /dev/null
+++ b/app/assets/javascripts/content_editor/extensions/math_inline.js
@@ -0,0 +1,35 @@
+import { Mark, markInputRule } from '@tiptap/core';
+import { __ } from '~/locale';
+import { PARSE_HTML_PRIORITY_HIGHEST } from '../constants';
+
+export const inputRegex = /(?:^|\s)\$`([^`]+)`\$$/gm;
+
+export default Mark.create({
+ name: 'mathInline',
+
+ parseHTML() {
+ return [
+ {
+ tag: 'code.math[data-math-style=inline]',
+ priority: PARSE_HTML_PRIORITY_HIGHEST,
+ },
+ ];
+ },
+
+ renderHTML({ HTMLAttributes }) {
+ return [
+ 'code',
+ {
+ title: __('Inline math'),
+ 'data-toggle': 'tooltip',
+ class: 'gl-inset-border-1-gray-400',
+ ...HTMLAttributes,
+ },
+ 0,
+ ];
+ },
+
+ addInputRules() {
+ return [markInputRule(inputRegex, this.type)];
+ },
+});
diff --git a/app/assets/javascripts/content_editor/extensions/table_of_contents.js b/app/assets/javascripts/content_editor/extensions/table_of_contents.js
new file mode 100644
index 00000000000..9e31158837e
--- /dev/null
+++ b/app/assets/javascripts/content_editor/extensions/table_of_contents.js
@@ -0,0 +1,51 @@
+import { Node } from '@tiptap/core';
+import { InputRule } from 'prosemirror-inputrules';
+import { s__ } from '~/locale';
+import { PARSE_HTML_PRIORITY_HIGHEST } from '../constants';
+
+export const inputRuleRegExps = [/^\[\[_TOC_\]\]$/, /^\[TOC\]$/];
+
+export default Node.create({
+ name: 'tableOfContents',
+
+ inline: false,
+
+ group: 'block',
+
+ parseHTML() {
+ return [
+ {
+ tag: 'ul.section-nav',
+ priority: PARSE_HTML_PRIORITY_HIGHEST,
+ },
+ ];
+ },
+
+ renderHTML() {
+ return [
+ 'div',
+ {
+ class:
+ 'table-of-contents gl-border-1 gl-border-solid gl-text-center gl-border-gray-100 gl-mb-5',
+ },
+ s__('ContentEditor|Table of Contents'),
+ ];
+ },
+
+ addInputRules() {
+ const { type } = this;
+
+ return inputRuleRegExps.map(
+ (regex) =>
+ new InputRule(regex, (state, match, start, end) => {
+ const { tr } = state;
+
+ if (match) {
+ tr.replaceWith(start - 1, end, type.create());
+ }
+
+ return tr;
+ }),
+ );
+ },
+});
diff --git a/app/assets/javascripts/content_editor/extensions/word_break.js b/app/assets/javascripts/content_editor/extensions/word_break.js
new file mode 100644
index 00000000000..93b42466850
--- /dev/null
+++ b/app/assets/javascripts/content_editor/extensions/word_break.js
@@ -0,0 +1,29 @@
+import { Node, mergeAttributes, nodeInputRule } from '@tiptap/core';
+
+export const inputRegex = /^<wbr>$/;
+
+export default Node.create({
+ name: 'wordBreak',
+ inline: true,
+ group: 'inline',
+ selectable: false,
+ atom: true,
+
+ defaultOptions: {
+ HTMLAttributes: {
+ class: 'gl-display-inline-flex gl-px-1 gl-bg-blue-100 gl-rounded-base gl-font-sm',
+ },
+ },
+
+ parseHTML() {
+ return [{ tag: 'wbr' }];
+ },
+
+ renderHTML({ HTMLAttributes }) {
+ return ['span', mergeAttributes(this.options.HTMLAttributes, HTMLAttributes), '-'];
+ },
+
+ addInputRules() {
+ return [nodeInputRule(inputRegex, this.type)];
+ },
+});
diff --git a/app/assets/javascripts/content_editor/services/create_content_editor.js b/app/assets/javascripts/content_editor/services/create_content_editor.js
index 9b2d4c9a062..385f1c63801 100644
--- a/app/assets/javascripts/content_editor/services/create_content_editor.js
+++ b/app/assets/javascripts/content_editor/services/create_content_editor.js
@@ -8,14 +8,18 @@ import Bold from '../extensions/bold';
import BulletList from '../extensions/bullet_list';
import Code from '../extensions/code';
import CodeBlockHighlight from '../extensions/code_block_highlight';
+import ColorChip from '../extensions/color_chip';
import DescriptionItem from '../extensions/description_item';
import DescriptionList from '../extensions/description_list';
+import Details from '../extensions/details';
+import DetailsContent from '../extensions/details_content';
import Division from '../extensions/division';
import Document from '../extensions/document';
import Dropcursor from '../extensions/dropcursor';
import Emoji from '../extensions/emoji';
import Figure from '../extensions/figure';
import FigureCaption from '../extensions/figure_caption';
+import Frontmatter from '../extensions/frontmatter';
import Gapcursor from '../extensions/gapcursor';
import HardBreak from '../extensions/hard_break';
import Heading from '../extensions/heading';
@@ -28,6 +32,7 @@ import Italic from '../extensions/italic';
import Link from '../extensions/link';
import ListItem from '../extensions/list_item';
import Loading from '../extensions/loading';
+import MathInline from '../extensions/math_inline';
import OrderedList from '../extensions/ordered_list';
import Paragraph from '../extensions/paragraph';
import Reference from '../extensions/reference';
@@ -37,11 +42,13 @@ import Superscript from '../extensions/superscript';
import Table from '../extensions/table';
import TableCell from '../extensions/table_cell';
import TableHeader from '../extensions/table_header';
+import TableOfContents from '../extensions/table_of_contents';
import TableRow from '../extensions/table_row';
import TaskItem from '../extensions/task_item';
import TaskList from '../extensions/task_list';
import Text from '../extensions/text';
import Video from '../extensions/video';
+import WordBreak from '../extensions/word_break';
import { ContentEditor } from './content_editor';
import createMarkdownSerializer from './markdown_serializer';
import trackInputRulesAndShortcuts from './track_input_rules_and_shortcuts';
@@ -75,15 +82,19 @@ export const createContentEditor = ({
Bold,
BulletList,
Code,
+ ColorChip,
CodeBlockHighlight,
DescriptionItem,
DescriptionList,
+ Details,
+ DetailsContent,
Document,
Division,
Dropcursor,
Emoji,
Figure,
FigureCaption,
+ Frontmatter,
Gapcursor,
HardBreak,
Heading,
@@ -96,6 +107,7 @@ export const createContentEditor = ({
Link,
ListItem,
Loading,
+ MathInline,
OrderedList,
Paragraph,
Reference,
@@ -104,12 +116,14 @@ export const createContentEditor = ({
Superscript,
TableCell,
TableHeader,
+ TableOfContents,
TableRow,
Table,
TaskItem,
TaskList,
Text,
Video,
+ WordBreak,
];
const allExtensions = [...builtInContentEditorExtensions, ...extensions];
diff --git a/app/assets/javascripts/content_editor/services/markdown_serializer.js b/app/assets/javascripts/content_editor/services/markdown_serializer.js
index bc6d98511f9..0dd3cb5b73f 100644
--- a/app/assets/javascripts/content_editor/services/markdown_serializer.js
+++ b/app/assets/javascripts/content_editor/services/markdown_serializer.js
@@ -11,10 +11,13 @@ import Code from '../extensions/code';
import CodeBlockHighlight from '../extensions/code_block_highlight';
import DescriptionItem from '../extensions/description_item';
import DescriptionList from '../extensions/description_list';
+import Details from '../extensions/details';
+import DetailsContent from '../extensions/details_content';
import Division from '../extensions/division';
import Emoji from '../extensions/emoji';
import Figure from '../extensions/figure';
import FigureCaption from '../extensions/figure_caption';
+import Frontmatter from '../extensions/frontmatter';
import HardBreak from '../extensions/hard_break';
import Heading from '../extensions/heading';
import HorizontalRule from '../extensions/horizontal_rule';
@@ -24,6 +27,7 @@ import InlineDiff from '../extensions/inline_diff';
import Italic from '../extensions/italic';
import Link from '../extensions/link';
import ListItem from '../extensions/list_item';
+import MathInline from '../extensions/math_inline';
import OrderedList from '../extensions/ordered_list';
import Paragraph from '../extensions/paragraph';
import Reference from '../extensions/reference';
@@ -33,11 +37,13 @@ import Superscript from '../extensions/superscript';
import Table from '../extensions/table';
import TableCell from '../extensions/table_cell';
import TableHeader from '../extensions/table_header';
+import TableOfContents from '../extensions/table_of_contents';
import TableRow from '../extensions/table_row';
import TaskItem from '../extensions/task_item';
import TaskList from '../extensions/task_list';
import Text from '../extensions/text';
import Video from '../extensions/video';
+import WordBreak from '../extensions/word_break';
import {
isPlainURL,
renderHardBreak,
@@ -50,6 +56,7 @@ import {
renderImage,
renderPlayable,
renderHTMLNode,
+ renderContent,
} from './serialization_helpers';
const defaultSerializerConfig = {
@@ -80,6 +87,11 @@ const defaultSerializerConfig = {
: `](${state.esc(href)}${mark.attrs.title ? ` ${state.quote(mark.attrs.title)}` : ''})`;
},
},
+ [MathInline.name]: {
+ open: (...args) => `$${defaultMarkdownSerializer.marks.code.open(...args)}`,
+ close: (...args) => `${defaultMarkdownSerializer.marks.code.close(...args)}$`,
+ escape: false,
+ },
[Strike.name]: {
open: '~~',
close: '~~',
@@ -130,11 +142,34 @@ const defaultSerializerConfig = {
renderHTMLNode(node.attrs.isTerm ? 'dt' : 'dd')(state, node);
if (index === parent.childCount - 1) state.ensureNewLine();
},
+ [Details.name]: renderHTMLNode('details', true),
+ [DetailsContent.name]: (state, node, parent, index) => {
+ if (!index) renderHTMLNode('summary')(state, node);
+ else {
+ if (index === 1) state.ensureNewLine();
+ renderContent(state, node);
+ if (index === parent.childCount - 1) state.ensureNewLine();
+ }
+ },
[Emoji.name]: (state, node) => {
const { name } = node.attrs;
state.write(`:${name}:`);
},
+ [Frontmatter.name]: (state, node) => {
+ const { language } = node.attrs;
+ const syntax = {
+ toml: '+++',
+ json: ';;;',
+ yaml: '---',
+ }[language];
+
+ state.write(`${syntax}\n`);
+ state.text(node.textContent, false);
+ state.ensureNewLine();
+ state.write(syntax);
+ state.closeBlock(node);
+ },
[Figure.name]: renderHTMLNode('figure'),
[FigureCaption.name]: renderHTMLNode('figcaption'),
[HardBreak.name]: renderHardBreak,
@@ -147,6 +182,10 @@ const defaultSerializerConfig = {
[Reference.name]: (state, node) => {
state.write(node.attrs.originalText || node.attrs.text);
},
+ [TableOfContents.name]: (state, node) => {
+ state.write('[[_TOC_]]');
+ state.closeBlock(node);
+ },
[Table.name]: renderTable,
[TableCell.name]: renderTableCell,
[TableHeader.name]: renderTableCell,
@@ -161,6 +200,7 @@ const defaultSerializerConfig = {
},
[Text.name]: defaultMarkdownSerializer.nodes.text,
[Video.name]: renderPlayable,
+ [WordBreak.name]: (state) => state.write('<wbr>'),
},
};
diff --git a/app/assets/javascripts/create_cluster/eks_cluster/components/eks_cluster_configuration_form.vue b/app/assets/javascripts/create_cluster/eks_cluster/components/eks_cluster_configuration_form.vue
index 4aee02e45c8..9d4eddc510a 100644
--- a/app/assets/javascripts/create_cluster/eks_cluster/components/eks_cluster_configuration_form.vue
+++ b/app/assets/javascripts/create_cluster/eks_cluster/components/eks_cluster_configuration_form.vue
@@ -293,7 +293,7 @@ export default {
:items="roles"
:loading="isLoadingRoles"
:loading-text="s__('ClusterIntegration|Loading IAM Roles')"
- :placeholder="s__('ClusterIntergation|Select service role')"
+ :placeholder="s__('ClusterIntegration|Select service role')"
:search-field-placeholder="s__('ClusterIntegration|Search IAM Roles')"
:empty-text="s__('ClusterIntegration|No IAM Roles found')"
:has-errors="Boolean(loadingRolesError)"
@@ -330,7 +330,7 @@ export default {
:disabled-text="s__('ClusterIntegration|Select a region to choose a Key Pair')"
:loading="isLoadingKeyPairs"
:loading-text="s__('ClusterIntegration|Loading Key Pairs')"
- :placeholder="s__('ClusterIntergation|Select key pair')"
+ :placeholder="s__('ClusterIntegration|Select key pair')"
:search-field-placeholder="s__('ClusterIntegration|Search Key Pairs')"
:empty-text="s__('ClusterIntegration|No Key Pairs found')"
:has-errors="Boolean(loadingKeyPairsError)"
@@ -359,7 +359,7 @@ export default {
:disabled="vpcDropdownDisabled"
:disabled-text="s__('ClusterIntegration|Select a region to choose a VPC')"
:loading-text="s__('ClusterIntegration|Loading VPCs')"
- :placeholder="s__('ClusterIntergation|Select a VPC')"
+ :placeholder="s__('ClusterIntegration|Select a VPC')"
:search-field-placeholder="s__('ClusterIntegration|Search VPCs')"
:empty-text="s__('ClusterIntegration|No VPCs found')"
:has-errors="Boolean(loadingVpcsError)"
@@ -389,7 +389,7 @@ export default {
:disabled="subnetDropdownDisabled"
:disabled-text="s__('ClusterIntegration|Select a VPC to choose a subnet')"
:loading-text="s__('ClusterIntegration|Loading subnets')"
- :placeholder="s__('ClusterIntergation|Select a subnet')"
+ :placeholder="s__('ClusterIntegration|Select a subnet')"
:search-field-placeholder="s__('ClusterIntegration|Search subnets')"
:empty-text="s__('ClusterIntegration|No subnet found')"
:has-errors="displaySubnetError"
@@ -420,7 +420,7 @@ export default {
:disabled="securityGroupDropdownDisabled"
:disabled-text="s__('ClusterIntegration|Select a VPC to choose a security group')"
:loading-text="s__('ClusterIntegration|Loading security groups')"
- :placeholder="s__('ClusterIntergation|Select a security group')"
+ :placeholder="s__('ClusterIntegration|Select a security group')"
:search-field-placeholder="s__('ClusterIntegration|Search security groups')"
:empty-text="s__('ClusterIntegration|No security group found')"
:has-errors="Boolean(loadingSecurityGroupsError)"
@@ -451,7 +451,7 @@ export default {
:items="instanceTypes"
:loading="isLoadingInstanceTypes"
:loading-text="s__('ClusterIntegration|Loading instance types')"
- :placeholder="s__('ClusterIntergation|Select an instance type')"
+ :placeholder="s__('ClusterIntegration|Select an instance type')"
:search-field-placeholder="s__('ClusterIntegration|Search instance types')"
:empty-text="s__('ClusterIntegration|No instance type found')"
:has-errors="Boolean(loadingInstanceTypesError)"
diff --git a/app/assets/javascripts/create_cluster/gke_cluster/components/gke_network_dropdown.vue b/app/assets/javascripts/create_cluster/gke_cluster/components/gke_network_dropdown.vue
index 12b6070a79a..8f18ac29c0f 100644
--- a/app/assets/javascripts/create_cluster/gke_cluster/components/gke_network_dropdown.vue
+++ b/app/assets/javascripts/create_cluster/gke_cluster/components/gke_network_dropdown.vue
@@ -43,7 +43,7 @@ export default {
:loading="isLoadingItems"
:has-errors="Boolean(loadingItemsError)"
:loading-text="s__('ClusterIntegration|Loading networks')"
- :placeholder="s__('ClusterIntergation|Select a network')"
+ :placeholder="s__('ClusterIntegration|Select a network')"
:search-field-placeholder="s__('ClusterIntegration|Search networks')"
:empty-text="s__('ClusterIntegration|No networks found')"
:error-message="s__('ClusterIntegration|Could not load networks')"
diff --git a/app/assets/javascripts/create_cluster/gke_cluster/components/gke_subnetwork_dropdown.vue b/app/assets/javascripts/create_cluster/gke_cluster/components/gke_subnetwork_dropdown.vue
index ec7889e2907..dab4adc3789 100644
--- a/app/assets/javascripts/create_cluster/gke_cluster/components/gke_subnetwork_dropdown.vue
+++ b/app/assets/javascripts/create_cluster/gke_cluster/components/gke_subnetwork_dropdown.vue
@@ -34,7 +34,7 @@ export default {
:loading="isLoadingItems"
:has-errors="Boolean(loadingItemsError)"
:loading-text="s__('ClusterIntegration|Loading subnetworks')"
- :placeholder="s__('ClusterIntergation|Select a subnetwork')"
+ :placeholder="s__('ClusterIntegration|Select a subnetwork')"
:search-field-placeholder="s__('ClusterIntegration|Search subnetworks')"
:empty-text="s__('ClusterIntegration|No subnetworks found')"
:error-message="s__('ClusterIntegration|Could not load subnetworks')"
diff --git a/app/assets/javascripts/create_merge_request_dropdown.js b/app/assets/javascripts/create_merge_request_dropdown.js
index 1c0dab11392..f4a27dc7d1f 100644
--- a/app/assets/javascripts/create_merge_request_dropdown.js
+++ b/app/assets/javascripts/create_merge_request_dropdown.js
@@ -5,8 +5,8 @@ import {
canCreateConfidentialMergeRequest,
} from './confidential_merge_request';
import confidentialMergeRequestState from './confidential_merge_request/state';
-import DropLab from './droplab/drop_lab';
-import ISetter from './droplab/plugins/input_setter';
+import DropLab from './filtered_search/droplab/drop_lab_deprecated';
+import ISetter from './filtered_search/droplab/plugins/input_setter';
import createFlash from './flash';
import axios from './lib/utils/axios_utils';
import { __, sprintf } from './locale';
diff --git a/app/assets/javascripts/cycle_analytics/components/base.vue b/app/assets/javascripts/cycle_analytics/components/base.vue
index ae78ce33263..1d98a42ce58 100644
--- a/app/assets/javascripts/cycle_analytics/components/base.vue
+++ b/app/assets/javascripts/cycle_analytics/components/base.vue
@@ -51,6 +51,7 @@ export default {
'features',
'createdBefore',
'createdAfter',
+ 'pagination',
]),
...mapGetters(['pathNavigationData', 'filterParams']),
displayStageEvents() {
@@ -99,7 +100,12 @@ export default {
},
},
methods: {
- ...mapActions(['fetchStageData', 'setSelectedStage', 'setDateRange']),
+ ...mapActions([
+ 'fetchStageData',
+ 'setSelectedStage',
+ 'setDateRange',
+ 'updateStageTablePagination',
+ ]),
onSetDateRange({ startDate, endDate }) {
this.setDateRange({
createdAfter: new Date(startDate),
@@ -108,6 +114,7 @@ export default {
},
onSelectStage(stage) {
this.setSelectedStage(stage);
+ this.updateStageTablePagination({ ...this.pagination, page: 1 });
},
dismissOverviewDialog() {
this.isOverviewDialogDismissed = true;
@@ -117,6 +124,9 @@ export default {
const { permissions } = this;
return Boolean(permissions?.[id]);
},
+ onHandleUpdatePagination(data) {
+ this.updateStageTablePagination(data);
+ },
},
dayRangeOptions: [7, 30, 90],
i18n: {
@@ -163,8 +173,8 @@ export default {
:empty-state-title="emptyStageTitle"
:empty-state-message="emptyStageText"
:no-data-svg-path="noDataSvgPath"
- :pagination="null"
- :sortable="false"
+ :pagination="pagination"
+ @handleUpdatePagination="onHandleUpdatePagination"
/>
</div>
</template>
diff --git a/app/assets/javascripts/cycle_analytics/components/filter_bar.vue b/app/assets/javascripts/cycle_analytics/components/filter_bar.vue
index 5140b05e189..016fea354fe 100644
--- a/app/assets/javascripts/cycle_analytics/components/filter_bar.vue
+++ b/app/assets/javascripts/cycle_analytics/components/filter_bar.vue
@@ -79,7 +79,6 @@ export default {
title: __('Assignees'),
type: 'assignees',
token: AuthorToken,
- defaultAuthors: [],
initialAuthors: this.assigneesData,
unique: false,
operators: OPERATOR_IS_ONLY,
diff --git a/app/assets/javascripts/cycle_analytics/components/stage_table.vue b/app/assets/javascripts/cycle_analytics/components/stage_table.vue
index 8a2667a4ab1..fc4dfafb809 100644
--- a/app/assets/javascripts/cycle_analytics/components/stage_table.vue
+++ b/app/assets/javascripts/cycle_analytics/components/stage_table.vue
@@ -194,6 +194,9 @@ export default {
><formatted-stage-count :stage-count="stageCount"
/></gl-badge>
</template>
+ <template #head(duration)="data">
+ <span data-testid="vsa-stage-header-duration">{{ data.label }}</span>
+ </template>
<template #cell(end_event)="{ item }">
<div data-testid="vsa-stage-event">
<div v-if="item.id" data-testid="vsa-stage-content">
diff --git a/app/assets/javascripts/cycle_analytics/constants.js b/app/assets/javascripts/cycle_analytics/constants.js
index c1be2ce7096..c205aa1e831 100644
--- a/app/assets/javascripts/cycle_analytics/constants.js
+++ b/app/assets/javascripts/cycle_analytics/constants.js
@@ -44,7 +44,7 @@ export const METRICS_POPOVER_CONTENT = {
},
'cycle-time': {
description: s__(
- 'ValueStreamAnalytics|Median time from issue first merge request created to issue closed.',
+ "ValueStreamAnalytics|Median time from the earliest commit of a linked issue's merge request to when that issue is closed.",
),
},
'new-issue': { description: s__('ValueStreamAnalytics|Number of new issues created.') },
diff --git a/app/assets/javascripts/cycle_analytics/index.js b/app/assets/javascripts/cycle_analytics/index.js
index 620da0104e0..34ef03409b8 100644
--- a/app/assets/javascripts/cycle_analytics/index.js
+++ b/app/assets/javascripts/cycle_analytics/index.js
@@ -45,6 +45,7 @@ export default () => {
new Vue({
el,
name: 'CycleAnalytics',
+ apolloProvider: {},
store,
render: (createElement) =>
createElement(CycleAnalytics, {
diff --git a/app/assets/javascripts/cycle_analytics/store/actions.js b/app/assets/javascripts/cycle_analytics/store/actions.js
index e39cd224199..24b62849db7 100644
--- a/app/assets/javascripts/cycle_analytics/store/actions.js
+++ b/app/assets/javascripts/cycle_analytics/store/actions.js
@@ -6,6 +6,7 @@ import {
getValueStreamStageRecords,
getValueStreamStageCounts,
} from '~/api/analytics_api';
+import { normalizeHeaders, parseIntPagination } from '~/lib/utils/common_utils';
import createFlash from '~/flash';
import { __ } from '~/locale';
import { DEFAULT_VALUE_STREAM, I18N_VSA_ERROR_STAGE_MEDIAN } from '../constants';
@@ -72,16 +73,21 @@ export const fetchCycleAnalyticsData = ({
});
};
-export const fetchStageData = ({ getters: { requestParams, filterParams }, commit }) => {
+export const fetchStageData = ({
+ getters: { requestParams, filterParams, paginationParams },
+ commit,
+}) => {
commit(types.REQUEST_STAGE_DATA);
- return getValueStreamStageRecords(requestParams, filterParams)
- .then(({ data }) => {
+ return getValueStreamStageRecords(requestParams, { ...filterParams, ...paginationParams })
+ .then(({ data, headers }) => {
// when there's a query timeout, the request succeeds but the error is encoded in the response data
if (data?.error) {
commit(types.RECEIVE_STAGE_DATA_ERROR, data.error);
} else {
commit(types.RECEIVE_STAGE_DATA_SUCCESS, data);
+ const { page = null, nextPage = null } = parseIntPagination(normalizeHeaders(headers));
+ commit(types.SET_PAGINATION, { ...paginationParams, page, hasNextPage: Boolean(nextPage) });
}
})
.catch(() => commit(types.RECEIVE_STAGE_DATA_ERROR));
@@ -176,6 +182,14 @@ export const setDateRange = ({ dispatch, commit }, { createdAfter, createdBefore
return refetchStageData(dispatch);
};
+export const updateStageTablePagination = (
+ { commit, dispatch, state: { selectedStage } },
+ paginationParams,
+) => {
+ commit(types.SET_PAGINATION, paginationParams);
+ return dispatch('fetchStageData', selectedStage.id);
+};
+
export const initializeVsa = ({ commit, dispatch }, initialData = {}) => {
commit(types.INITIALIZE_VSA, initialData);
diff --git a/app/assets/javascripts/cycle_analytics/store/getters.js b/app/assets/javascripts/cycle_analytics/store/getters.js
index 77c285f5ce0..962e1d50d12 100644
--- a/app/assets/javascripts/cycle_analytics/store/getters.js
+++ b/app/assets/javascripts/cycle_analytics/store/getters.js
@@ -1,6 +1,7 @@
import dateFormat from 'dateformat';
import { dateFormats } from '~/analytics/shared/constants';
import { filterToQueryObject } from '~/vue_shared/components/filtered_search_bar/filtered_search_utils';
+import { PAGINATION_TYPE } from '../constants';
import { transformStagesForPathNavigation, filterStagesByHiddenStatus } from '../utils';
export const pathNavigationData = ({ stages, medians, stageCounts, selectedStage }) => {
@@ -21,6 +22,13 @@ export const requestParams = (state) => {
return { requestPath: fullPath, valueStreamId, stageId };
};
+export const paginationParams = ({ pagination: { page, sort, direction } }) => ({
+ pagination: PAGINATION_TYPE,
+ sort,
+ direction,
+ page,
+});
+
const filterBarParams = ({ filters }) => {
const {
authors: { selected: selectedAuthor },
diff --git a/app/assets/javascripts/cycle_analytics/store/mutation_types.js b/app/assets/javascripts/cycle_analytics/store/mutation_types.js
index 0d94aad2ca5..0ad67d4e6bd 100644
--- a/app/assets/javascripts/cycle_analytics/store/mutation_types.js
+++ b/app/assets/javascripts/cycle_analytics/store/mutation_types.js
@@ -4,6 +4,7 @@ export const SET_LOADING = 'SET_LOADING';
export const SET_SELECTED_VALUE_STREAM = 'SET_SELECTED_VALUE_STREAM';
export const SET_SELECTED_STAGE = 'SET_SELECTED_STAGE';
export const SET_DATE_RANGE = 'SET_DATE_RANGE';
+export const SET_PAGINATION = 'SET_PAGINATION';
export const REQUEST_VALUE_STREAMS = 'REQUEST_VALUE_STREAMS';
export const RECEIVE_VALUE_STREAMS_SUCCESS = 'RECEIVE_VALUE_STREAMS_SUCCESS';
diff --git a/app/assets/javascripts/cycle_analytics/store/mutations.js b/app/assets/javascripts/cycle_analytics/store/mutations.js
index 301e7d95f8c..64930a5b51f 100644
--- a/app/assets/javascripts/cycle_analytics/store/mutations.js
+++ b/app/assets/javascripts/cycle_analytics/store/mutations.js
@@ -1,13 +1,24 @@
+import Vue from 'vue';
import { convertObjectPropsToCamelCase } from '~/lib/utils/common_utils';
+import { PAGINATION_SORT_FIELD_END_EVENT, PAGINATION_SORT_DIRECTION_DESC } from '../constants';
import { formatMedianValues } from '../utils';
import * as types from './mutation_types';
export default {
- [types.INITIALIZE_VSA](state, { endpoints, features, createdBefore, createdAfter }) {
+ [types.INITIALIZE_VSA](
+ state,
+ { endpoints, features, createdBefore, createdAfter, pagination = {} },
+ ) {
state.endpoints = endpoints;
state.createdBefore = createdBefore;
state.createdAfter = createdAfter;
state.features = features;
+
+ Vue.set(state, 'pagination', {
+ page: pagination.page ?? state.pagination.page,
+ sort: pagination.sort ?? state.pagination.sort,
+ direction: pagination.direction ?? state.pagination.direction,
+ });
},
[types.SET_LOADING](state, loadingState) {
state.isLoading = loadingState;
@@ -22,6 +33,14 @@ export default {
state.createdBefore = createdBefore;
state.createdAfter = createdAfter;
},
+ [types.SET_PAGINATION](state, { page, hasNextPage, sort, direction }) {
+ Vue.set(state, 'pagination', {
+ page,
+ hasNextPage,
+ sort: sort || PAGINATION_SORT_FIELD_END_EVENT,
+ direction: direction || PAGINATION_SORT_DIRECTION_DESC,
+ });
+ },
[types.REQUEST_VALUE_STREAMS](state) {
state.valueStreams = [];
},
diff --git a/app/assets/javascripts/cycle_analytics/store/state.js b/app/assets/javascripts/cycle_analytics/store/state.js
index 0882db51218..52bc01cafa4 100644
--- a/app/assets/javascripts/cycle_analytics/store/state.js
+++ b/app/assets/javascripts/cycle_analytics/store/state.js
@@ -1,3 +1,8 @@
+import {
+ PAGINATION_SORT_FIELD_END_EVENT,
+ PAGINATION_SORT_DIRECTION_DESC,
+} from '~/cycle_analytics/constants';
+
export default () => ({
id: null,
features: {},
@@ -20,4 +25,10 @@ export default () => ({
isLoadingStage: false,
isEmptyStage: false,
permissions: {},
+ pagination: {
+ page: null,
+ hasNextPage: false,
+ sort: PAGINATION_SORT_FIELD_END_EVENT,
+ direction: PAGINATION_SORT_DIRECTION_DESC,
+ },
});
diff --git a/app/assets/javascripts/cycle_analytics/utils.js b/app/assets/javascripts/cycle_analytics/utils.js
index fa02fdf914a..3c6267bac06 100644
--- a/app/assets/javascripts/cycle_analytics/utils.js
+++ b/app/assets/javascripts/cycle_analytics/utils.js
@@ -1,13 +1,10 @@
import dateFormat from 'dateformat';
-import { unescape } from 'lodash';
import { dateFormats } from '~/analytics/shared/constants';
import { hideFlash } from '~/flash';
-import { sanitize } from '~/lib/dompurify';
-import { roundToNearestHalf } from '~/lib/utils/common_utils';
import { getDateInPast } from '~/lib/utils/datetime/date_calculation_utility';
import { parseSeconds } from '~/lib/utils/datetime_utility';
+import { formatTimeAsSummary } from '~/lib/utils/datetime/date_format_utility';
import { slugify } from '~/lib/utils/text_utility';
-import { s__, sprintf } from '../locale';
export const removeFlash = (type = 'alert') => {
const flashEl = document.querySelector(`.flash-${type}`);
@@ -45,29 +42,6 @@ export const transformStagesForPathNavigation = ({
return formattedStages;
};
-export const timeSummaryForPathNavigation = ({ seconds, hours, days, minutes, weeks, months }) => {
- if (months) {
- return sprintf(s__('ValueStreamAnalytics|%{value}M'), {
- value: roundToNearestHalf(months),
- });
- } else if (weeks) {
- return sprintf(s__('ValueStreamAnalytics|%{value}w'), {
- value: roundToNearestHalf(weeks),
- });
- } else if (days) {
- return sprintf(s__('ValueStreamAnalytics|%{value}d'), {
- value: roundToNearestHalf(days),
- });
- } else if (hours) {
- return sprintf(s__('ValueStreamAnalytics|%{value}h'), { value: hours });
- } else if (minutes) {
- return sprintf(s__('ValueStreamAnalytics|%{value}m'), { value: minutes });
- } else if (seconds) {
- return unescape(sanitize(s__('ValueStreamAnalytics|&lt;1m'), { ALLOWED_TAGS: [] }));
- }
- return '-';
-};
-
/**
* Takes a raw median value in seconds and converts it to a string representation
* ie. converts 172800 => 2d (2 days)
@@ -76,7 +50,7 @@ export const timeSummaryForPathNavigation = ({ seconds, hours, days, minutes, we
* @returns {String} String representation ie 2w
*/
export const medianTimeToParsedSeconds = (value) =>
- timeSummaryForPathNavigation({
+ formatTimeAsSummary({
...parseSeconds(value, { daysPerWeek: 7, hoursPerDay: 24 }),
seconds: value,
});
diff --git a/app/assets/javascripts/dependency_proxy.js b/app/assets/javascripts/dependency_proxy.js
deleted file mode 100644
index ddf5703b28f..00000000000
--- a/app/assets/javascripts/dependency_proxy.js
+++ /dev/null
@@ -1,5 +0,0 @@
-import setupToggleButtons from '~/toggle_buttons';
-
-export default () => {
- setupToggleButtons(document.querySelector('.js-dependency-proxy-toggle-area'));
-};
diff --git a/app/assets/javascripts/deploy_freeze/components/deploy_freeze_modal.vue b/app/assets/javascripts/deploy_freeze/components/deploy_freeze_modal.vue
index 051ab710e5f..7acb5549273 100644
--- a/app/assets/javascripts/deploy_freeze/components/deploy_freeze_modal.vue
+++ b/app/assets/javascripts/deploy_freeze/components/deploy_freeze_modal.vue
@@ -25,7 +25,7 @@ export default {
lazy: true,
},
translations: {
- cronPlaceholder: __('* * * * *'),
+ cronPlaceholder: '* * * * *',
cronSyntaxInstructions: __(
'Define a custom deploy freeze pattern with %{cronSyntaxStart}cron syntax%{cronSyntaxEnd}',
),
diff --git a/app/assets/javascripts/deprecated_notes.js b/app/assets/javascripts/deprecated_notes.js
index a42b50edb8a..4ab3f140b61 100644
--- a/app/assets/javascripts/deprecated_notes.js
+++ b/app/assets/javascripts/deprecated_notes.js
@@ -19,9 +19,10 @@ import Vue from 'vue';
import '~/lib/utils/jquery_at_who';
import AjaxCache from '~/lib/utils/ajax_cache';
import syntaxHighlight from '~/syntax_highlight';
+import CommentTypeDropdown from '~/notes/components/comment_type_dropdown.vue';
+import * as constants from '~/notes/constants';
import Autosave from './autosave';
import loadAwardsHandler from './awards_handler';
-import CommentTypeToggle from './comment_type_toggle';
import createFlash from './flash';
import { defaultAutocompleteConfig } from './gfm_auto_complete';
import GLForm from './gl_form';
@@ -128,7 +129,13 @@ export default class Notes {
this.$wrapperEl.on('click', '.js-note-edit', this.showEditForm.bind(this));
this.$wrapperEl.on('click', '.note-edit-cancel', this.cancelEdit);
// Reopen and close actions for Issue/MR combined with note form submit
- this.$wrapperEl.on('click', '.js-comment-submit-button', this.postComment);
+ this.$wrapperEl.on(
+ 'click',
+ // this oddly written selector needs to match the old style (input with class) as
+ // well as the new DOM styling from the Vue-based note form
+ 'input.js-comment-submit-button, .js-comment-submit-button > button:first-child',
+ this.postComment,
+ );
this.$wrapperEl.on('click', '.js-comment-save-button', this.updateComment);
this.$wrapperEl.on('keyup input', '.js-note-text', this.updateTargetButtons);
// resolve a discussion
@@ -201,23 +208,39 @@ export default class Notes {
}
static initCommentTypeToggle(form) {
- const dropdownTrigger = form.querySelector('.js-comment-type-dropdown .dropdown-toggle');
- const dropdownList = form.querySelector('.js-comment-type-dropdown .dropdown-menu');
+ const el = form.querySelector('.js-comment-type-dropdown');
+ const { noteableName } = el.dataset;
const noteTypeInput = form.querySelector('#note_type');
- const submitButton = form.querySelector('.js-comment-type-dropdown .js-comment-submit-button');
- const closeButton = form.querySelector('.js-note-target-close');
- const reopenButton = form.querySelector('.js-note-target-reopen');
-
- const commentTypeToggle = new CommentTypeToggle({
- dropdownTrigger,
- dropdownList,
- noteTypeInput,
- submitButton,
- closeButton,
- reopenButton,
- });
+ const formHasContent = form.querySelector('.js-note-text').value.trim().length > 0;
- commentTypeToggle.initDroplab();
+ form.commentTypeComponent = new Vue({
+ el,
+ data() {
+ return {
+ noteType: constants.COMMENT,
+ disabled: !formHasContent,
+ };
+ },
+ render(createElement) {
+ return createElement(CommentTypeDropdown, {
+ props: {
+ noteType: this.noteType,
+ noteableDisplayName: noteableName,
+ disabled: this.disabled,
+ },
+ on: {
+ change: (arg) => {
+ this.noteType = arg;
+ if (this.noteType === constants.DISCUSSION) {
+ noteTypeInput.value = constants.DISCUSSION_NOTE;
+ } else {
+ noteTypeInput.value = '';
+ }
+ },
+ },
+ });
+ },
+ });
}
keydownNoteText(e) {
@@ -1107,6 +1130,7 @@ export default class Notes {
const form = textarea.parents('form');
const reopenbtn = form.find('.js-note-target-reopen');
const closebtn = form.find('.js-note-target-close');
+ const commentTypeComponent = form.get(0)?.commentTypeComponent;
if (textarea.val().trim().length > 0) {
reopentext = reopenbtn.attr('data-alternative-text');
@@ -1123,6 +1147,9 @@ export default class Notes {
if (closebtn.is(':not(.btn-comment-and-close)')) {
closebtn.addClass('btn-comment-and-close');
}
+ if (commentTypeComponent) {
+ commentTypeComponent.disabled = false;
+ }
} else {
reopentext = reopenbtn.data('originalText');
closetext = closebtn.data('originalText');
@@ -1138,6 +1165,9 @@ export default class Notes {
if (closebtn.is('.btn-comment-and-close')) {
closebtn.removeClass('btn-comment-and-close');
}
+ if (commentTypeComponent) {
+ commentTypeComponent.disabled = true;
+ }
}
}
@@ -1308,9 +1338,6 @@ export default class Notes {
}
cleanForm($form) {
- // Remove JS classes that are not needed here
- $form.find('.js-comment-type-dropdown').removeClass('btn-group');
-
// Remove dropdown
$form.find('.dropdown-menu').remove();
@@ -1505,6 +1532,8 @@ export default class Notes {
const $submitBtn = $(e.target);
$submitBtn.prop('disabled', true);
let $form = $submitBtn.parents('form');
+ const commentTypeComponent = $form.get(0)?.commentTypeComponent;
+ if (commentTypeComponent) commentTypeComponent.disabled = true;
const $closeBtn = $form.find('.js-note-target-close');
const isDiscussionNote =
$submitBtn.parent().find('li.droplab-item-selected').attr('id') === 'discussion';
@@ -1584,6 +1613,8 @@ export default class Notes {
const note = res.data;
$submitBtn.prop('disabled', false);
+ if (commentTypeComponent) commentTypeComponent.disabled = false;
+
// Submission successful! remove placeholder
$notesContainer.find(`#${noteUniqueId}`).remove();
@@ -1662,6 +1693,8 @@ export default class Notes {
// Submission failed, remove placeholder note and show Flash error message
$notesContainer.find(`#${noteUniqueId}`).remove();
$submitBtn.prop('disabled', false);
+ if (commentTypeComponent) commentTypeComponent.disabled = false;
+
const blurEvent = new CustomEvent('blur.imageDiff', {
detail: e,
});
diff --git a/app/assets/javascripts/design_management/pages/design/index.vue b/app/assets/javascripts/design_management/pages/design/index.vue
index 38ea5406c02..837320b9423 100644
--- a/app/assets/javascripts/design_management/pages/design/index.vue
+++ b/app/assets/javascripts/design_management/pages/design/index.vue
@@ -273,7 +273,7 @@ export default {
this.onError(UPDATE_IMAGE_DIFF_NOTE_ERROR, e);
},
onDesignDeleteError(e) {
- this.onError(designDeletionError({ singular: true }), e);
+ this.onError(designDeletionError(), e);
},
onResolveDiscussionError(e) {
this.onError(UPDATE_IMAGE_DIFF_NOTE_ERROR, e);
diff --git a/app/assets/javascripts/design_management/pages/index.vue b/app/assets/javascripts/design_management/pages/index.vue
index e66ae822a34..5092c30aa60 100644
--- a/app/assets/javascripts/design_management/pages/index.vue
+++ b/app/assets/javascripts/design_management/pages/index.vue
@@ -255,7 +255,7 @@ export default {
if (this.$route.query.version) this.$router.push({ name: DESIGNS_ROUTE_NAME });
},
onDesignDeleteError() {
- const errorMessage = designDeletionError({ singular: this.selectedDesigns.length === 1 });
+ const errorMessage = designDeletionError(this.selectedDesigns.length);
createFlash({ message: errorMessage });
},
onDesignDropzoneError() {
diff --git a/app/assets/javascripts/design_management/utils/cache_update.js b/app/assets/javascripts/design_management/utils/cache_update.js
index 33c4fd5a7d9..c8f445bfb88 100644
--- a/app/assets/javascripts/design_management/utils/cache_update.js
+++ b/app/assets/javascripts/design_management/utils/cache_update.js
@@ -250,7 +250,7 @@ export const hasErrors = ({ errors = [] }) => errors?.length;
*/
export const updateStoreAfterDesignsDelete = (store, data, query, designs) => {
if (hasErrors(data)) {
- onError(data, designDeletionError({ singular: designs.length === 1 }));
+ onError(data, designDeletionError(designs.length));
} else {
deleteDesignsFromStore(store, query, designs);
addNewVersionToStore(store, query, data.version);
diff --git a/app/assets/javascripts/design_management/utils/error_messages.js b/app/assets/javascripts/design_management/utils/error_messages.js
index afee7e81791..981b50329b2 100644
--- a/app/assets/javascripts/design_management/utils/error_messages.js
+++ b/app/assets/javascripts/design_management/utils/error_messages.js
@@ -1,4 +1,3 @@
-/* eslint-disable @gitlab/require-string-literal-i18n-helpers */
import { __, s__, n__, sprintf } from '~/locale';
export const ADD_DISCUSSION_COMMENT_ERROR = s__(
@@ -27,12 +26,6 @@ export const DESIGN_NOT_FOUND_ERROR = __('Could not find design.');
export const DESIGN_VERSION_NOT_EXIST_ERROR = __('Requested design version does not exist.');
-const DESIGN_UPLOAD_SKIPPED_MESSAGE = s__('DesignManagement|Upload skipped.');
-
-const ALL_DESIGNS_SKIPPED_MESSAGE = `${DESIGN_UPLOAD_SKIPPED_MESSAGE} ${s__(
- 'The designs you tried uploading did not change.',
-)}`;
-
export const EXISTING_DESIGN_DROP_MANY_FILES_MESSAGE = __(
'You can only upload one design when dropping onto an existing design.',
);
@@ -53,12 +46,9 @@ export const DELETE_DESIGN_TODO_ERROR = __('Failed to remove a to-do item for th
export const TOGGLE_TODO_ERROR = __('Failed to toggle the to-do status for the design.');
-const MAX_SKIPPED_FILES_LISTINGS = 5;
+const DESIGN_UPLOAD_SKIPPED_MESSAGE = s__('DesignManagement|Upload skipped. %{reason}');
-const oneDesignSkippedMessage = (filename) =>
- `${DESIGN_UPLOAD_SKIPPED_MESSAGE} ${sprintf(s__('DesignManagement|%{filename} did not change.'), {
- filename,
- })}`;
+const MAX_SKIPPED_FILES_LISTINGS = 5;
/**
* Return warning message indicating that some (but not all) uploaded
@@ -66,25 +56,40 @@ const oneDesignSkippedMessage = (filename) =>
* @param {Array<{ filename }>} skippedFiles
*/
const someDesignsSkippedMessage = (skippedFiles) => {
- const designsSkippedMessage = `${DESIGN_UPLOAD_SKIPPED_MESSAGE} ${s__(
- 'Some of the designs you tried uploading did not change:',
- )}`;
-
- const moreText = sprintf(s__(`DesignManagement|and %{moreCount} more.`), {
- moreCount: skippedFiles.length - MAX_SKIPPED_FILES_LISTINGS,
- });
-
- return `${designsSkippedMessage} ${skippedFiles
+ const skippedFilesList = skippedFiles
.slice(0, MAX_SKIPPED_FILES_LISTINGS)
.map(({ filename }) => filename)
- .join(', ')}${skippedFiles.length > MAX_SKIPPED_FILES_LISTINGS ? `, ${moreText}` : '.'}`;
+ .join(', ');
+
+ const uploadSkippedReason =
+ skippedFiles.length > MAX_SKIPPED_FILES_LISTINGS
+ ? sprintf(
+ s__(
+ 'DesignManagement|Some of the designs you tried uploading did not change: %{skippedFiles} and %{moreCount} more.',
+ ),
+ {
+ skippedFiles: skippedFilesList,
+ moreCount: skippedFiles.length - MAX_SKIPPED_FILES_LISTINGS,
+ },
+ )
+ : sprintf(
+ s__(
+ 'DesignManagement|Some of the designs you tried uploading did not change: %{skippedFiles}.',
+ ),
+ { skippedFiles: skippedFilesList },
+ );
+
+ return sprintf(DESIGN_UPLOAD_SKIPPED_MESSAGE, {
+ reason: uploadSkippedReason,
+ });
};
-export const designDeletionError = ({ singular = true } = {}) => {
- const design = singular ? __('a design') : __('designs');
- return sprintf(s__('Could not archive %{design}. Please try again.'), {
- design,
- });
+export const designDeletionError = (designsCount = 1) => {
+ return n__(
+ 'Failed to archive a design. Please try again.',
+ 'Failed to archive designs. Please try again.',
+ designsCount,
+ );
};
/**
@@ -101,7 +106,18 @@ export const designUploadSkippedWarning = (uploadedDesigns, skippedFiles) => {
if (skippedFiles.length === uploadedDesigns.length) {
const { filename } = skippedFiles[0];
- return n__(oneDesignSkippedMessage(filename), ALL_DESIGNS_SKIPPED_MESSAGE, skippedFiles.length);
+ const uploadSkippedReason = sprintf(
+ n__(
+ 'DesignManagement|%{filename} did not change.',
+ 'DesignManagement|The designs you tried uploading did not change.',
+ skippedFiles.length,
+ ),
+ { filename },
+ );
+
+ return sprintf(DESIGN_UPLOAD_SKIPPED_MESSAGE, {
+ reason: uploadSkippedReason,
+ });
}
return someDesignsSkippedMessage(skippedFiles);
diff --git a/app/assets/javascripts/diffs/components/app.vue b/app/assets/javascripts/diffs/components/app.vue
index a2ea42e963c..465f9836140 100644
--- a/app/assets/javascripts/diffs/components/app.vue
+++ b/app/assets/javascripts/diffs/components/app.vue
@@ -19,6 +19,7 @@ import { updateHistory } from '~/lib/utils/url_utility';
import { __ } from '~/locale';
import MrWidgetHowToMergeModal from '~/vue_merge_request_widget/components/mr_widget_how_to_merge_modal.vue';
import PanelResizer from '~/vue_shared/components/panel_resizer.vue';
+import glFeatureFlagsMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
import notesEventHub from '../../notes/event_hub';
import {
@@ -79,6 +80,7 @@ export default {
MrWidgetHowToMergeModal,
GlAlert,
},
+ mixins: [glFeatureFlagsMixin()],
alerts: {
ALERT_OVERFLOW_HIDDEN,
ALERT_MERGE_CONFLICT,
@@ -252,6 +254,10 @@ export default {
return this.treeWidth <= TREE_HIDE_STATS_WIDTH;
},
isLimitedContainer() {
+ if (this.glFeatures.mrChangesFluidLayout) {
+ return false;
+ }
+
return !this.renderFileTree && !this.isParallelView && !this.isFluidLayout;
},
isFullChangeset() {
@@ -386,6 +392,8 @@ export default {
diffsApp.instrument();
},
created() {
+ this.mergeRequestContainers = document.querySelectorAll('.merge-request-container');
+
this.adjustView();
this.subscribeToEvents();
@@ -513,6 +521,13 @@ export default {
} else {
this.removeEventListeners();
}
+
+ if (!this.isFluidLayout && this.glFeatures.mrChangesFluidLayout) {
+ this.mergeRequestContainers.forEach((el) => {
+ el.classList.toggle('limit-container-width', !this.shouldShow);
+ el.classList.toggle('container-limited', !this.shouldShow);
+ });
+ }
},
setEventListeners() {
Mousetrap.bind(keysFor(MR_PREVIOUS_FILE_IN_DIFF), () => this.jumpToFile(-1));
diff --git a/app/assets/javascripts/diffs/components/compare_versions.vue b/app/assets/javascripts/diffs/components/compare_versions.vue
index f098d20afd1..da918947cc5 100644
--- a/app/assets/javascripts/diffs/components/compare_versions.vue
+++ b/app/assets/javascripts/diffs/components/compare_versions.vue
@@ -100,6 +100,7 @@ export default {
variant="default"
icon="file-tree"
class="gl-mr-3 js-toggle-tree-list btn-icon"
+ data-qa-selector="file_tree_button"
:title="toggleFileBrowserTitle"
:aria-label="toggleFileBrowserTitle"
:selected="showTreeList"
diff --git a/app/assets/javascripts/diffs/components/diff_row.vue b/app/assets/javascripts/diffs/components/diff_row.vue
index 737c4d8f33c..4e33a02ca0e 100644
--- a/app/assets/javascripts/diffs/components/diff_row.vue
+++ b/app/assets/javascripts/diffs/components/diff_row.vue
@@ -1,4 +1,9 @@
<script>
+/* eslint-disable vue/no-v-html */
+/**
+NOTE: This file uses v-html over v-safe-html for performance reasons, see:
+https://gitlab.com/gitlab-org/gitlab/-/merge_requests/57842
+* */
import { memoize } from 'lodash';
import { isLoggedIn } from '~/lib/utils/common_utils';
import {
@@ -267,7 +272,9 @@ export default {
]"
class="diff-td line_content with-coverage left-side"
data-testid="left-content"
- v-html="$options.lineContent(props.line.left) /* eslint-disable-line vue/no-v-html */"
+ v-html="
+ $options.lineContent(props.line.left) /* v-html for performance, see top of file */
+ "
></div>
</template>
<template
@@ -389,7 +396,9 @@ export default {
},
]"
class="diff-td line_content with-coverage right-side parallel"
- v-html="$options.lineContent(props.line.right) /* eslint-disable-line vue/no-v-html */"
+ v-html="
+ $options.lineContent(props.line.right) /* v-html for performance, see top of file */
+ "
></div>
</template>
<template v-else>
diff --git a/app/assets/javascripts/diffs/components/tree_list.vue b/app/assets/javascripts/diffs/components/tree_list.vue
index 39ce849fc03..41d885d3dc1 100644
--- a/app/assets/javascripts/diffs/components/tree_list.vue
+++ b/app/assets/javascripts/diffs/components/tree_list.vue
@@ -62,7 +62,7 @@ export default {
</script>
<template>
- <div class="tree-list-holder d-flex flex-column">
+ <div class="tree-list-holder d-flex flex-column" data-qa-selector="file_tree_container">
<div class="gl-mb-3 position-relative tree-list-search d-flex">
<div class="flex-fill d-flex">
<gl-icon name="search" class="position-absolute tree-list-icon" />
diff --git a/app/assets/javascripts/diffs/utils/workers.js b/app/assets/javascripts/diffs/utils/tree_worker_utils.js
index 985e75d1a17..985e75d1a17 100644
--- a/app/assets/javascripts/diffs/utils/workers.js
+++ b/app/assets/javascripts/diffs/utils/tree_worker_utils.js
diff --git a/app/assets/javascripts/diffs/workers/tree_worker.js b/app/assets/javascripts/diffs/workers/tree_worker.js
index 6d1bc78ba1c..04010a99b52 100644
--- a/app/assets/javascripts/diffs/workers/tree_worker.js
+++ b/app/assets/javascripts/diffs/workers/tree_worker.js
@@ -1,5 +1,5 @@
import { sortTree } from '~/ide/stores/utils';
-import { generateTreeList } from '../utils/workers';
+import { generateTreeList } from '../utils/tree_worker_utils';
// eslint-disable-next-line no-restricted-globals
self.addEventListener('message', (e) => {
diff --git a/app/assets/javascripts/droplab/drop_lab.js b/app/assets/javascripts/droplab/drop_lab.js
deleted file mode 100644
index 6f068aaa800..00000000000
--- a/app/assets/javascripts/droplab/drop_lab.js
+++ /dev/null
@@ -1,160 +0,0 @@
-import { DATA_TRIGGER } from './constants';
-import HookButton from './hook_button';
-import HookInput from './hook_input';
-import Keyboard from './keyboard';
-import utils from './utils';
-
-class DropLab {
- constructor() {
- this.ready = false;
- this.hooks = [];
- this.queuedData = [];
- this.config = {};
-
- this.eventWrapper = {};
- }
-
- loadStatic() {
- const dropdownTriggers = [].slice.apply(document.querySelectorAll(`[${DATA_TRIGGER}]`));
- this.addHooks(dropdownTriggers);
- }
-
- addData(...args) {
- this.applyArgs(args, 'processAddData');
- }
-
- setData(...args) {
- this.applyArgs(args, 'processSetData');
- }
-
- destroy() {
- this.hooks.forEach((hook) => hook.destroy());
- this.hooks = [];
- this.removeEvents();
- }
-
- applyArgs(args, methodName) {
- if (this.ready) return this[methodName](...args);
-
- this.queuedData = this.queuedData || [];
- this.queuedData.push(args);
-
- return this.ready;
- }
-
- processAddData(trigger, data) {
- this.processData(trigger, data, 'addData');
- }
-
- processSetData(trigger, data) {
- this.processData(trigger, data, 'setData');
- }
-
- processData(trigger, data, methodName) {
- this.hooks.forEach((hook) => {
- if (Array.isArray(trigger)) hook.list[methodName](trigger);
-
- if (hook.trigger.id === trigger) hook.list[methodName](data);
- });
- }
-
- addEvents() {
- this.eventWrapper.documentClicked = this.documentClicked.bind(this);
- document.addEventListener('click', this.eventWrapper.documentClicked);
- }
-
- documentClicked(e) {
- if (e.defaultPrevented) return;
-
- if (utils.isDropDownParts(e.target)) return;
-
- if (e.target.tagName !== 'UL') {
- const closestUl = utils.closest(e.target, 'UL');
- if (utils.isDropDownParts(closestUl)) return;
- }
-
- this.hooks.forEach((hook) => hook.list.hide());
- }
-
- removeEvents() {
- document.removeEventListener('click', this.eventWrapper.documentClicked);
- }
-
- changeHookList(trigger, list, plugins, config) {
- const availableTrigger =
- typeof trigger === 'string' ? document.getElementById(trigger) : trigger;
-
- this.hooks.forEach((hook, i) => {
- const aHook = hook;
-
- aHook.list.list.dataset.dropdownActive = false;
-
- if (aHook.trigger !== availableTrigger) return;
-
- aHook.destroy();
- this.hooks.splice(i, 1);
- this.addHook(availableTrigger, list, plugins, config);
- });
- }
-
- addHook(hook, list, plugins, config) {
- const availableHook = typeof hook === 'string' ? document.querySelector(hook) : hook;
- let availableList;
-
- if (typeof list === 'string') {
- availableList = document.querySelector(list);
- } else if (list instanceof Element) {
- availableList = list;
- } else {
- availableList = document.querySelector(hook.dataset[utils.toCamelCase(DATA_TRIGGER)]);
- }
-
- availableList.dataset.dropdownActive = true;
-
- const HookObject = availableHook.tagName === 'INPUT' ? HookInput : HookButton;
- this.hooks.push(new HookObject(availableHook, availableList, plugins, config));
-
- return this;
- }
-
- addHooks(hooks, plugins, config) {
- hooks.forEach((hook) => this.addHook(hook, null, plugins, config));
- return this;
- }
-
- setConfig(obj) {
- this.config = obj;
- }
-
- fireReady() {
- const readyEvent = new CustomEvent('ready.dl', {
- detail: {
- dropdown: this,
- },
- });
- document.dispatchEvent(readyEvent);
-
- this.ready = true;
- }
-
- init(hook, list, plugins, config) {
- if (hook) {
- this.addHook(hook, list, plugins, config);
- } else {
- this.loadStatic();
- }
-
- this.addEvents();
-
- Keyboard();
-
- this.fireReady();
-
- this.queuedData.forEach((data) => this.addData(data));
- this.queuedData = [];
-
- return this;
- }
-}
-
-export default DropLab;
diff --git a/app/assets/javascripts/droplab/plugins/ajax_filter.js b/app/assets/javascripts/droplab/plugins/ajax_filter.js
deleted file mode 100644
index ac4d44adc17..00000000000
--- a/app/assets/javascripts/droplab/plugins/ajax_filter.js
+++ /dev/null
@@ -1,113 +0,0 @@
-/* eslint-disable */
-import AjaxCache from '../../lib/utils/ajax_cache';
-
-const AjaxFilter = {
- init: function (hook) {
- this.destroyed = false;
- this.hook = hook;
- this.notLoading();
-
- this.eventWrapper = {};
- this.eventWrapper.debounceTrigger = this.debounceTrigger.bind(this);
- this.hook.trigger.addEventListener('keydown.dl', this.eventWrapper.debounceTrigger);
- this.hook.trigger.addEventListener('focus', this.eventWrapper.debounceTrigger);
-
- this.trigger(true);
- },
-
- notLoading: function notLoading() {
- this.loading = false;
- },
-
- debounceTrigger: function debounceTrigger(e) {
- var NON_CHARACTER_KEYS = [16, 17, 18, 20, 37, 38, 39, 40, 91, 93];
- var invalidKeyPressed = NON_CHARACTER_KEYS.indexOf(e.detail.which || e.detail.keyCode) > -1;
- var focusEvent = e.type === 'focus';
- if (invalidKeyPressed || this.loading) {
- return;
- }
- if (this.timeout) {
- clearTimeout(this.timeout);
- }
- this.timeout = setTimeout(this.trigger.bind(this, focusEvent), 200);
- },
-
- trigger: function trigger(getEntireList) {
- var config = this.hook.config.AjaxFilter;
- var searchValue = this.trigger.value;
- if (!config || !config.endpoint || !config.searchKey) {
- return;
- }
- if (config.searchValueFunction) {
- searchValue = config.searchValueFunction();
- }
- if (
- (config.loadingTemplate && this.hook.list.data === undefined) ||
- this.hook.list.data.length === 0
- ) {
- var dynamicList = this.hook.list.list.querySelector('[data-dynamic]');
- var loadingTemplate = document.createElement('div');
- loadingTemplate.innerHTML = config.loadingTemplate;
- loadingTemplate.setAttribute('data-loading-template', true);
- this.listTemplate = dynamicList.outerHTML;
- dynamicList.outerHTML = loadingTemplate.outerHTML;
- }
- if (getEntireList) {
- searchValue = '';
- }
- if (config.searchKey === searchValue) {
- return this.list.show();
- }
- this.loading = true;
- var params = config.params || {};
- params[config.searchKey] = searchValue;
- var url = config.endpoint + this.buildParams(params);
- return AjaxCache.retrieve(url)
- .then((data) => {
- this._loadData(data, config);
- if (config.onLoadingFinished) {
- config.onLoadingFinished(data);
- }
- })
- .catch(config.onError);
- },
-
- _loadData(data, config) {
- const list = this.hook.list;
- if ((config.loadingTemplate && list.data === undefined) || list.data.length === 0) {
- const dataLoadingTemplate = list.list.querySelector('[data-loading-template]');
- if (dataLoadingTemplate) {
- dataLoadingTemplate.outerHTML = this.listTemplate;
- }
- }
- if (!this.destroyed) {
- var hookListChildren = list.list.children;
- var onlyDynamicList =
- hookListChildren.length === 1 && hookListChildren[0].hasAttribute('data-dynamic');
- if (onlyDynamicList && data.length === 0) {
- list.hide();
- }
- list.setData.call(list, data);
- }
- this.notLoading();
- list.currentIndex = 0;
- },
-
- buildParams: function (params) {
- if (!params) return '';
- var paramsArray = Object.keys(params).map(function (param) {
- return param + '=' + (params[param] || '');
- });
- return '?' + paramsArray.join('&');
- },
-
- destroy: function destroy() {
- if (this.timeout) clearTimeout(this.timeout);
- this.destroyed = true;
-
- this.hook.trigger.removeEventListener('keydown.dl', this.eventWrapper.debounceTrigger);
- this.hook.trigger.removeEventListener('focus', this.eventWrapper.debounceTrigger);
- },
-};
-
-export default AjaxFilter;
diff --git a/app/assets/javascripts/editor/extensions/source_editor_ci_schema_ext.js b/app/assets/javascripts/editor/extensions/source_editor_ci_schema_ext.js
index 410aaed86a7..7069568275d 100644
--- a/app/assets/javascripts/editor/extensions/source_editor_ci_schema_ext.js
+++ b/app/assets/javascripts/editor/extensions/source_editor_ci_schema_ext.js
@@ -1,6 +1,5 @@
-import Api from '~/api';
+import ciSchemaPath from '~/editor/schema/ci.json';
import { registerSchema } from '~/ide/utils';
-import { EXTENSION_CI_SCHEMA_FILE_NAME_MATCH } from '../constants';
import { SourceEditorExtension } from './source_editor_extension_base';
export class CiSchemaExtension extends SourceEditorExtension {
@@ -16,12 +15,7 @@ export class CiSchemaExtension extends SourceEditorExtension {
* @param {String} opts.projectPath
* @param {String?} opts.ref - Current ref. Defaults to main
*/
- registerCiSchema({ projectNamespace, projectPath, ref } = {}) {
- const ciSchemaPath = Api.buildUrl(Api.projectFileSchemaPath)
- .replace(':namespace_path', projectNamespace)
- .replace(':project_path', projectPath)
- .replace(':ref', ref)
- .replace(':filename', EXTENSION_CI_SCHEMA_FILE_NAME_MATCH);
+ registerCiSchema() {
// In order for workers loaded from `data://` as the
// ones loaded by monaco editor, we use absolute URLs
// to fetch schema files, hence the `gon.gitlab_url`
diff --git a/app/assets/javascripts/editor/schema/NOTICE b/app/assets/javascripts/editor/schema/NOTICE
new file mode 100644
index 00000000000..60a7a81f082
--- /dev/null
+++ b/app/assets/javascripts/editor/schema/NOTICE
@@ -0,0 +1,6 @@
+Copyright (c) 2015-present Mads Kristensen
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+http://www.apache.org/licenses/LICENSE-2.0
diff --git a/app/assets/javascripts/editor/schema/ci.json b/app/assets/javascripts/editor/schema/ci.json
new file mode 100644
index 00000000000..0052bc00406
--- /dev/null
+++ b/app/assets/javascripts/editor/schema/ci.json
@@ -0,0 +1,1444 @@
+{
+ "$schema": "http://json-schema.org/draft-07/schema#",
+ "$id": "https://gitlab.com/.gitlab-ci.yml",
+ "title": "Gitlab CI configuration",
+ "description": "Gitlab has a built-in solution for doing CI called Gitlab CI. It is configured by supplying a file called `.gitlab-ci.yml`, which will list all the jobs that are going to run for the project. A full list of all options can be found at https://docs.gitlab.com/ee/ci/yaml/. You can read more about Gitlab CI at https://docs.gitlab.com/ee/ci/README.html.",
+ "type": "object",
+ "properties": {
+ "$schema": {
+ "type": "string",
+ "format": "uri"
+ },
+ "image": { "$ref": "#/definitions/image" },
+ "services": { "$ref": "#/definitions/services" },
+ "before_script": { "$ref": "#/definitions/before_script" },
+ "after_script": { "$ref": "#/definitions/after_script" },
+ "variables": { "$ref": "#/definitions/globalVariables" },
+ "cache": { "$ref": "#/definitions/cache" },
+ "default": {
+ "type": "object",
+ "properties": {
+ "after_script": { "$ref": "#/definitions/after_script" },
+ "artifacts": { "$ref": "#/definitions/artifacts" },
+ "before_script": { "$ref": "#/definitions/before_script" },
+ "cache": { "$ref": "#/definitions/cache" },
+ "image": { "$ref": "#/definitions/image" },
+ "interruptible": { "$ref": "#/definitions/interruptible" },
+ "retry": { "$ref": "#/definitions/retry" },
+ "services": { "$ref": "#/definitions/services" },
+ "tags": { "$ref": "#/definitions/tags" },
+ "timeout": { "$ref": "#/definitions/timeout" }
+ },
+ "additionalProperties": false
+ },
+ "stages": {
+ "type": "array",
+ "description": "Groups jobs into stages. All jobs in one stage must complete before next stage is executed. Defaults to ['build', 'test', 'deploy'].",
+ "default": ["build", "test", "deploy"],
+ "items": {
+ "type": "string"
+ },
+ "uniqueItems": true,
+ "minItems": 1
+ },
+ "include": {
+ "description": "Can be `IncludeItem` or `IncludeItem[]`. Each `IncludeItem` will be a string, or an object with properties for the method if including external YAML file. The external content will be fetched, included and evaluated along the `.gitlab-ci.yml`.",
+ "oneOf": [
+ { "$ref": "#/definitions/include_item" },
+ {
+ "type": "array",
+ "items": { "$ref": "#/definitions/include_item" }
+ }
+ ]
+ },
+ "pages": {
+ "$ref": "#/definitions/job",
+ "description": "A special job used to upload static sites to Gitlab pages. Requires a `public/` directory with `artifacts.path` pointing to it."
+ },
+ "workflow": {
+ "type": "object",
+ "properties": {
+ "rules": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "properties": {
+ "if": {
+ "type": "string"
+ },
+ "variables": { "$ref": "#/definitions/variables" },
+ "when": {
+ "type": "string",
+ "enum": ["always", "never"]
+ }
+ },
+ "additionalProperties": false
+ }
+ }
+ }
+ }
+ },
+ "patternProperties": {
+ "^[.]": {
+ "description": "Hidden keys.",
+ "anyOf": [
+ { "$ref": "#/definitions/job_template" },
+ { "description": "Arbitrary YAML anchor." }
+ ]
+ }
+ },
+ "additionalProperties": {
+ "$ref": "#/definitions/job"
+ },
+ "definitions": {
+ "artifacts": {
+ "type": "object",
+ "description": "Used to specify a list of files and directories that should be attached to the job if it succeeds. Artifacts are sent to Gitlab where they can be downloaded.",
+ "additionalProperties": false,
+ "properties": {
+ "paths": {
+ "type": "array",
+ "description": "A list of paths to files/folders that should be included in the artifact.",
+ "items": {
+ "type": "string"
+ },
+ "minItems": 1
+ },
+ "exclude": {
+ "type": "array",
+ "description": "A list of paths to files/folders that should be excluded in the artifact.",
+ "items": {
+ "type": "string"
+ },
+ "minItems": 1
+ },
+ "expose_as": {
+ "type": "string",
+ "description": "Can be used to expose job artifacts in the merge request UI. GitLab will add a link <expose_as> to the relevant merge request that points to the artifact."
+ },
+ "name": {
+ "type": "string",
+ "description": "Name for the archive created on job success. Can use variables in the name, e.g. '$CI_JOB_NAME'"
+ },
+ "untracked": {
+ "type": "boolean",
+ "description": "Whether to add all untracked files (along with 'artifacts.paths') to the artifact.",
+ "default": false
+ },
+ "when": {
+ "description": "Configure when artifacts are uploaded depended on job status.",
+ "default": "on_success",
+ "oneOf": [
+ {
+ "enum": ["on_success"],
+ "description": "Upload artifacts only when the job succeeds (this is the default)."
+ },
+ {
+ "enum": ["on_failure"],
+ "description": "Upload artifacts only when the job fails."
+ },
+ {
+ "enum": ["always"],
+ "description": "Upload artifacts regardless of job status."
+ }
+ ]
+ },
+ "expire_in": {
+ "type": "string",
+ "description": "How long artifacts should be kept. They are saved 30 days by default. Artifacts that have expired are removed periodically via cron job. Supports a wide variety of formats, e.g. '1 week', '3 mins 4 sec', '2 hrs 20 min', '2h20min', '6 mos 1 day', '47 yrs 6 mos and 4d', '3 weeks and 2 days'.",
+ "default": "30 days"
+ },
+ "reports": {
+ "type": "object",
+ "description": "Reports will be uploaded as artifacts, and often displayed in the Gitlab UI, such as in Merge Requests.",
+ "additionalProperties": false,
+ "properties": {
+ "junit": {
+ "description": "Path for file(s) that should be parsed as JUnit XML result",
+ "oneOf": [
+ {
+ "type": "string",
+ "description": "Path to a single XML file"
+ },
+ {
+ "type": "array",
+ "description": "A list of paths to XML files that will automatically be concatenated into a single file",
+ "items": {
+ "type": "string"
+ },
+ "minItems": 1
+ }
+ ]
+ },
+ "cobertura": {
+ "description": "Path for file(s) that should be parsed as Cobertura XML coverage report",
+ "oneOf": [
+ {
+ "type": "string",
+ "description": "Path to a single XML file"
+ },
+ {
+ "type": "array",
+ "description": "A list of paths to XML files that will automatically be merged into one report",
+ "items": {
+ "type": "string"
+ },
+ "minItems": 1
+ }
+ ]
+ },
+ "codequality": {
+ "$ref": "#/definitions/string_file_list",
+ "description": "Path to file or list of files with code quality report(s) (such as Code Climate)."
+ },
+ "dotenv": {
+ "$ref": "#/definitions/string_file_list",
+ "description": "Path to file or list of files containing runtime-created variables for this job."
+ },
+ "lsif": {
+ "$ref": "#/definitions/string_file_list",
+ "description": "Path to file or list of files containing code intelligence (Language Server Index Format)."
+ },
+ "sast": {
+ "$ref": "#/definitions/string_file_list",
+ "description": "Path to file or list of files with SAST vulnerabilities report(s)."
+ },
+ "dependency_scanning": {
+ "$ref": "#/definitions/string_file_list",
+ "description": "Path to file or list of files with Dependency scanning vulnerabilities report(s)."
+ },
+ "container_scanning": {
+ "$ref": "#/definitions/string_file_list",
+ "description": "Path to file or list of files with Container scanning vulnerabilities report(s)."
+ },
+ "dast": {
+ "$ref": "#/definitions/string_file_list",
+ "description": "Path to file or list of files with DAST vulnerabilities report(s)."
+ },
+ "license_management": {
+ "$ref": "#/definitions/string_file_list",
+ "description": "Deprecated in 12.8: Path to file or list of files with license report(s)."
+ },
+ "license_scanning": {
+ "$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)."
+ },
+ "secret_detection": {
+ "$ref": "#/definitions/string_file_list",
+ "description": "Path to file or list of files with secret detection report(s)."
+ },
+ "metrics": {
+ "$ref": "#/definitions/string_file_list",
+ "description": "Path to file or list of files with custom metrics report(s)."
+ },
+ "terraform": {
+ "$ref": "#/definitions/string_file_list",
+ "description": "Path to file or list of files with terraform plan(s)."
+ }
+ }
+ }
+ }
+ },
+ "string_file_list": {
+ "oneOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ }
+ ]
+ },
+ "include_item": {
+ "oneOf": [
+ {
+ "description": "Will infer the method based on the value. E.g. `https://...` strings will be of type `include:remote`, and `/templates/...` will be of type `include:local`.",
+ "type": "string",
+ "format": "uri-reference",
+ "pattern": "^(https?://|/).+\\.ya?ml$"
+ },
+ {
+ "type": "object",
+ "additionalProperties": false,
+ "properties": {
+ "local": {
+ "description": "Relative path from local repository root (`/`) to the `yaml`/`yml` file template. The file must be on the same branch, and does not work across git submodules.",
+ "type": "string",
+ "format": "uri-reference",
+ "pattern": "\\.ya?ml$"
+ },
+ "rules": { "$ref": "#/definitions/rules" }
+ },
+ "required": ["local"]
+ },
+ {
+ "type": "object",
+ "additionalProperties": false,
+ "properties": {
+ "project": {
+ "description": "Path to the project, e.g. `group/project`, or `group/sub-group/project`.",
+ "type": "string",
+ "pattern": "\\S/\\S"
+ },
+ "ref": {
+ "description": "Branch/Tag/Commit-hash for the target project.",
+ "type": "string"
+ },
+ "file": {
+ "oneOf": [
+ {
+ "description": "Relative path from project root (`/`) to the `yaml`/`yml` file template.",
+ "type": "string",
+ "pattern": "\\.ya?ml$"
+ },
+ {
+ "description": "List of files by relative path from project root (`/`) to the `yaml`/`yml` file template.",
+ "type": "array",
+ "items": {
+ "type": "string",
+ "pattern": "\\.ya?ml$"
+ }
+ }
+ ]
+ }
+ },
+ "required": ["project", "file"]
+ },
+ {
+ "type": "object",
+ "additionalProperties": false,
+ "properties": {
+ "template": {
+ "description": "Use a `.gitlab-ci.yml` template as a base, e.g. `Nodejs.gitlab-ci.yml`.",
+ "type": "string",
+ "format": "uri-reference",
+ "pattern": "\\.ya?ml$"
+ }
+ },
+ "required": ["template"]
+ },
+ {
+ "type": "object",
+ "additionalProperties": false,
+ "properties": {
+ "remote": {
+ "description": "URL to a `yaml`/`yml` template file using HTTP/HTTPS.",
+ "type": "string",
+ "format": "uri-reference",
+ "pattern": "^https?://.+\\.ya?ml$"
+ }
+ },
+ "required": ["remote"]
+ }
+ ]
+ },
+ "image": {
+ "oneOf": [
+ {
+ "type": "string",
+ "minLength": 1,
+ "description": "Full name of the image that should be used. It should contain the Registry part if needed."
+ },
+ {
+ "type": "object",
+ "description": "Specifies the docker image to use for the job or globally for all jobs. Job configuration takes precedence over global setting. Requires a certain kind of Gitlab runner executor.",
+ "additionalProperties": false,
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "description": "Full name of the image that should be used. It should contain the Registry part if needed."
+ },
+ "entrypoint": {
+ "type": "array",
+ "description": "Command or script that should be executed as the container's entrypoint. It will be translated to Docker's --entrypoint option while creating the container. The syntax is similar to Dockerfile's ENTRYPOINT directive, where each shell token is a separate string in the array.",
+ "minItems": 1
+ }
+ },
+ "required": ["name"]
+ }
+ ],
+ "description": "Specifies the docker image to use for the job or globally for all jobs. Job configuration takes precedence over global setting. Requires a certain kind of Gitlab runner executor."
+ },
+ "services": {
+ "type": "array",
+ "description": "Similar to `image` property, but will link the specified services to the `image` container.",
+ "items": {
+ "oneOf": [
+ {
+ "type": "string",
+ "minLength": 1,
+ "description": "Full name of the image that should be used. It should contain the Registry part if needed."
+ },
+ {
+ "type": "object",
+ "description": "",
+ "additionalProperties": false,
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Full name of the image that should be used. It should contain the Registry part if needed.",
+ "minLength": 1
+ },
+ "entrypoint": {
+ "type": "array",
+ "description": "Command or script that should be executed as the container's entrypoint. It will be translated to Docker's --entrypoint option while creating the container. The syntax is similar to Dockerfile's ENTRYPOINT directive, where each shell token is a separate string in the array.",
+ "minItems": 1,
+ "items": {
+ "type": "string"
+ }
+ },
+ "command": {
+ "type": "array",
+ "description": "Command or script that should be used as the container's command. It will be translated to arguments passed to Docker after the image's name. The syntax is similar to Dockerfile's CMD directive, where each shell token is a separate string in the array.",
+ "minItems": 1,
+ "items": {
+ "type": "string"
+ }
+ },
+ "alias": {
+ "type": "string",
+ "description": "Additional alias that can be used to access the service from the job's container. Read Accessing the services for more information.",
+ "minLength": 1
+ }
+ },
+ "required": ["name"]
+ }
+ ]
+ }
+ },
+ "secrets": {
+ "type": "object",
+ "description": "Defines secrets to be injected as environment variables",
+ "additionalProperties": {
+ "type": "object",
+ "additionalProperties": {
+ "type": "object",
+ "description": "Environment variable name",
+ "properties": {
+ "vault": {
+ "oneOf": [
+ {
+ "type": "string",
+ "description": "The secret to be fetched from Vault (e.g. 'production/db/password@ops' translates to secret 'ops/data/production/db', field `password`)"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "engine": {
+ "type": "object",
+ "properties": {
+ "name": { "type": "string" },
+ "path": { "type": "string" }
+ },
+ "required": ["name", "path"]
+ },
+ "path": { "type": "string" },
+ "field": { "type": "string" }
+ },
+ "required": ["engine", "path", "field"]
+ }
+ ]
+ }
+ },
+ "required": ["vault"]
+ }
+ }
+ },
+ "before_script": {
+ "type": "array",
+ "description": "Defines scripts that should run *before* the job. Can be set globally or per job.",
+ "items": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ }
+ ]
+ }
+ },
+ "after_script": {
+ "type": "array",
+ "description": "Defines scripts that should run *after* the job. Can be set globally or per job.",
+ "items": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ }
+ ]
+ }
+ },
+ "rules": {
+ "type": "array",
+ "description": "Rules allows for an array of individual rule objects to be evaluated in order, until one matches and dynamically provides attributes to the job.",
+ "items": {
+ "type": "object",
+ "additionalProperties": false,
+ "properties": {
+ "if": {
+ "type": "string",
+ "description": "Expression to evaluate whether additional attributes should be provided to the job"
+ },
+ "changes": {
+ "type": "array",
+ "description": "Additional attributes will be provided to job if any of the provided paths matches a modified file",
+ "items": {
+ "type": "string"
+ }
+ },
+ "exists": {
+ "type": "array",
+ "description": "Additional attributes will be provided to job if any of the provided paths matches an existing file in the repository",
+ "items": {
+ "type": "string"
+ }
+ },
+ "variables": { "$ref": "#/definitions/variables" },
+ "when": { "$ref": "#/definitions/when" },
+ "start_in": { "$ref": "#/definitions/start_in" },
+ "allow_failure": { "$ref": "#/definitions/allow_failure" }
+ }
+ }
+ },
+ "globalVariables": {
+ "description": "Defines environment variables globally. Job level property overrides global variables. If a job sets `variables: {}`, all global variables are turned off. You can use the value and description keywords to define variables that are prefilled when running a pipeline manually.",
+ "type": "object",
+ "additionalProperties": {
+ "anyOf": [
+ {"type": ["string", "integer"]},
+ {
+ "type": "object",
+ "properties": {
+ "value": { "type": "string" },
+ "description": {
+ "type": "string",
+ "description": "Explains what the variable is used for, what the acceptable values are."
+ }
+ }
+ }
+ ]
+ }
+ },
+ "variables": {
+ "type": "object",
+ "description": "Defines environment variables for specific jobs. Job level property overrides global variables. If a job sets `variables: {}`, all global variables are turned off.",
+ "additionalProperties": {
+ "type": ["string", "integer"]
+ }
+ },
+ "timeout": {
+ "type": "string",
+ "description": "Allows you to configure a timeout for a specific job (e.g. `1 minute`, `1h 30m 12s`). Read more: https://docs.gitlab.com/ee/ci/yaml/README.html#timeout",
+ "minLength": 1
+ },
+ "start_in": {
+ "type": "string",
+ "description": "Used in conjunction with 'when: delayed' to set how long to delay before starting a job.",
+ "minLength": 1
+ },
+ "allow_failure": {
+ "description": "Allow job to fail. A failed job does not cause the pipeline to fail.",
+ "oneOf": [
+ {
+ "description": "Setting this option to true will allow the job to fail while still letting the pipeline pass.",
+ "type": "boolean",
+ "default": false
+ },
+ {
+ "description": "Exit code that are not considered failure. The job fails for any other exit code.",
+ "type": "object",
+ "additionalProperties": false,
+ "required": ["exit_codes"],
+ "properties": {
+ "exit_codes": {
+ "type": "integer"
+ }
+ }
+ },
+ {
+ "description": "You can list which exit codes are not considered failures. The job fails for any other exit code.",
+ "type": "object",
+ "additionalProperties": false,
+ "required": ["exit_codes"],
+ "properties": {
+ "exit_codes": {
+ "type": "array",
+ "minItems": 1,
+ "uniqueItems": true,
+ "items": {
+ "type": "integer"
+ }
+ }
+ }
+ }
+ ]
+ },
+ "when": {
+ "description": "Describes the conditions for when to run the job. Defaults to 'on_success'.",
+ "default": "on_success",
+ "oneOf": [
+ {
+ "enum": ["on_success"],
+ "description": "Execute job only when all jobs from prior stages succeed."
+ },
+ {
+ "enum": ["on_failure"],
+ "description": "Execute job when at least one job from prior stages fails."
+ },
+ {
+ "enum": ["always"],
+ "description": "Execute job regardless of the status from prior stages."
+ },
+ {
+ "enum": ["manual"],
+ "description": "Execute the job manually from Gitlab UI or API. Read more: https://docs.gitlab.com/ee/ci/yaml/#when-manual"
+ },
+ {
+ "enum": ["delayed"],
+ "description": "Execute a job after the time limit in 'start_in' expires. Read more: https://docs.gitlab.com/ee/ci/yaml/#when-delayed"
+ },
+ {
+ "enum": ["never"],
+ "description": "Never execute the job."
+ }
+ ]
+ },
+ "cache": {
+ "properties": {
+ "when": {
+ "description": "Defines when to save the cache, based on the status of the job.",
+ "default": "on_success",
+ "oneOf": [
+ {
+ "enum": ["on_success"],
+ "description": "Save the cache only when the job succeeds."
+ },
+ {
+ "enum": ["on_failure"],
+ "description": "Save the cache only when the job fails. "
+ },
+ {
+ "enum": ["always"],
+ "description": "Always save the cache. "
+ }
+ ]
+ }
+ }
+ },
+ "cache_entry": {
+ "type": "object",
+ "description": "Specify files or directories to cache between jobs. Can be set globally or per job.",
+ "additionalProperties": false,
+ "properties": {
+ "paths": {
+ "type": "array",
+ "description": "List of files or paths to cache.",
+ "items": {
+ "type": "string"
+ }
+ },
+ "key": {
+ "oneOf": [
+ {
+ "type": "string",
+ "description": "Unique cache ID, to allow e.g. specific branch or job cache. Environment variables can be used to set up unique keys (e.g. \"$CI_COMMIT_REF_SLUG\" for per branch cache)."
+ },
+ {
+ "type": "object",
+ "description": "When you include cache:key:files, you must also list the project files that will be used to generate the key, up to a maximum of two files. The cache key will be a SHA checksum computed from the most recent commits (up to two, if two files are listed) that changed the given files.",
+ "properties": {
+ "files": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ },
+ "minItems": 1,
+ "maxItems": 2
+ }
+ }
+ }
+ ]
+ },
+ "untracked": {
+ "type": "boolean",
+ "description": "Set to `true` to cache untracked files.",
+ "default": false
+ },
+ "policy": {
+ "type": "string",
+ "description": "Determines the strategy for downloading and updating the cache.",
+ "default": "pull-push",
+ "oneOf": [
+ {
+ "enum": ["pull"],
+ "description": "Pull will download cache but skip uploading after job completes."
+ },
+ {
+ "enum": ["push"],
+ "description": "Push will skip downloading cache and always recreate cache after job completes."
+ },
+ {
+ "enum": ["pull-push"],
+ "description": "Pull-push will both download cache at job start and upload cache on job success."
+ }
+ ]
+ }
+ }
+ },
+ "filter_refs": {
+ "type": "array",
+ "description": "Filter job by different keywords that determine origin or state, or by supplying string/regex to check against branch/tag names.",
+ "items": {
+ "anyOf": [
+ {
+ "oneOf": [
+ {
+ "enum": ["branches"],
+ "description": "When a branch is pushed."
+ },
+ {
+ "enum": ["tags"],
+ "description": "When a tag is pushed."
+ },
+ {
+ "enum": ["api"],
+ "description": "When a pipeline has been triggered by a second pipelines API (not triggers API)."
+ },
+ {
+ "enum": ["external"],
+ "description": "When using CI services other than Gitlab"
+ },
+ {
+ "enum": ["pipelines"],
+ "description": "For multi-project triggers, created using the API with 'CI_JOB_TOKEN'."
+ },
+ {
+ "enum": ["pushes"],
+ "description": "Pipeline is triggered by a `git push` by the user"
+ },
+ {
+ "enum": ["schedules"],
+ "description": "For scheduled pipelines."
+ },
+ {
+ "enum": ["triggers"],
+ "description": "For pipelines created using a trigger token."
+ },
+ {
+ "enum": ["web"],
+ "description": "For pipelines created using *Run pipeline* button in Gitlab UI (under your project's *Pipelines*)."
+ }
+ ]
+ },
+ {
+ "type": "string",
+ "description": "String or regular expression to match against tag or branch names."
+ }
+ ]
+ }
+ },
+ "filter": {
+ "oneOf": [
+ {
+ "$ref": "#/definitions/filter_refs"
+ },
+ {
+ "type": "object",
+ "additionalProperties": false,
+ "properties": {
+ "refs": {
+ "$ref": "#/definitions/filter_refs"
+ },
+ "kubernetes": {
+ "enum": ["active"],
+ "description": "Filter job based on if Kubernetes integration is active."
+ },
+ "variables": {
+ "type": "array",
+ "description": "Filter job by checking comparing values of environment variables. Read more about variable expressions: https://docs.gitlab.com/ee/ci/variables/README.html#variables-expressions",
+ "items": {
+ "type": "string"
+ }
+ },
+ "changes": {
+ "type": "array",
+ "description": "Filter job creation based on files that were modified in a git push.",
+ "items": {
+ "type": "string"
+ }
+ }
+ }
+ }
+ ]
+ },
+ "retry": {
+ "description": "Retry a job if it fails. Can be a simple integer or object definition.",
+ "oneOf": [
+ { "$ref": "#/definitions/retry_max" },
+ {
+ "type": "object",
+ "additionalProperties": false,
+ "properties": {
+ "max": { "$ref": "#/definitions/retry_max" },
+ "when": {
+ "description": "Either a single or array of error types to trigger job retry.",
+ "oneOf": [
+ { "$ref": "#/definitions/retry_errors" },
+ {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/retry_errors"
+ }
+ }
+ ]
+ }
+ }
+ }
+ ]
+ },
+ "retry_max": {
+ "type": "integer",
+ "description": "The number of times the job will be retried if it fails. Defaults to 0 and can max be retried 2 times (3 times total).",
+ "default": 0,
+ "minimum": 0,
+ "maximum": 2
+ },
+ "retry_errors": {
+ "oneOf": [
+ {
+ "const": "always",
+ "description": "Retry on any failure (default)."
+ },
+ {
+ "const": "unknown_failure",
+ "description": "Retry when the failure reason is unknown."
+ },
+ {
+ "const": "script_failure",
+ "description": "Retry when the script failed."
+ },
+ {
+ "const": "api_failure",
+ "description": "Retry on API failure."
+ },
+ {
+ "const": "stuck_or_timeout_failure",
+ "description": "Retry when the job got stuck or timed out."
+ },
+ {
+ "const": "runner_system_failure",
+ "description": "Retry if there is a runner system failure (for example, job setup failed)."
+ },
+ {
+ "const": "runner_unsupported",
+ "description": "Retry if the runner is unsupported."
+ },
+ {
+ "const": "stale_schedule",
+ "description": "Retry if a delayed job could not be executed."
+ },
+ {
+ "const": "job_execution_timeout",
+ "description": "Retry if the script exceeded the maximum execution time set for the job."
+ },
+ {
+ "const": "archived_failure",
+ "description": "Retry if the job is archived and can’t be run."
+ },
+ {
+ "const": "unmet_prerequisites",
+ "description": "Retry if the job failed to complete prerequisite tasks."
+ },
+ {
+ "const": "scheduler_failure",
+ "description": "Retry if the scheduler failed to assign the job to a runner."
+ },
+ {
+ "const": "data_integrity_failure",
+ "description": "Retry if there is a structural integrity problem detected."
+ }
+ ]
+ },
+ "interruptible": {
+ "type": "boolean",
+ "description": "Interruptible is used to indicate that a job should be canceled if made redundant by a newer pipeline run.",
+ "default": false
+ },
+ "job": {
+ "allOf": [
+ { "$ref": "#/definitions/job_template" },
+ {
+ "anyOf": [
+ { "required": ["script"] },
+ { "required": ["extends"] },
+ { "required": ["trigger"] }
+ ]
+ }
+ ]
+ },
+ "job_template": {
+ "type": "object",
+ "additionalProperties": false,
+ "properties": {
+ "image": { "$ref": "#/definitions/image" },
+ "services": { "$ref": "#/definitions/services" },
+ "before_script": { "$ref": "#/definitions/before_script" },
+ "after_script": { "$ref": "#/definitions/after_script" },
+ "rules": { "$ref": "#/definitions/rules" },
+ "variables": { "$ref": "#/definitions/variables" },
+ "cache": { "$ref": "#/definitions/cache" },
+ "secrets": { "$ref": "#/definitions/secrets" },
+ "script": {
+ "description": "Shell scripts executed by the Runner. The only required property of jobs. Be careful with special characters (e.g. `:`, `{`, `}`, `&`) and use single or double quotes to avoid issues.",
+ "oneOf": [
+ {
+ "type": "string",
+ "minLength": 1
+ },
+ {
+ "type": "array",
+ "items": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ }
+ ]
+ },
+ "minItems": 1
+ }
+ ]
+ },
+ "stage": {
+ "type": "string",
+ "description": "Define what stage the job will run in.",
+ "default": "test"
+ },
+ "only": {
+ "$ref": "#/definitions/filter",
+ "description": "Job will run *only* when these filtering options match."
+ },
+ "extends": {
+ "description": "The name of one or more jobs to inherit configuration from.",
+ "oneOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "array",
+ "items": {
+ "type": "string"
+ },
+ "minItems": 1
+ }
+ ]
+ },
+ "needs": {
+ "description": "The list of jobs in previous stages whose sole completion is needed to start the current job.",
+ "type": "array",
+ "items": {
+ "oneOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "object",
+ "additionalProperties": false,
+ "properties": {
+ "job": {
+ "type": "string"
+ },
+ "artifacts": {
+ "type": "boolean"
+ },
+ "optional": {
+ "type": "boolean"
+ }
+ },
+ "required": ["job"]
+ },
+ {
+ "type": "object",
+ "additionalProperties": false,
+ "properties": {
+ "pipeline": {
+ "type": "string"
+ },
+ "job": {
+ "type": "string"
+ },
+ "artifacts": {
+ "type": "boolean"
+ }
+ },
+ "required": ["job", "pipeline"]
+ },
+ {
+ "type": "object",
+ "additionalProperties": false,
+ "properties": {
+ "job": {
+ "type": "string"
+ },
+ "project": {
+ "type": "string"
+ },
+ "ref": {
+ "type": "string"
+ },
+ "artifacts": {
+ "type": "boolean"
+ }
+ },
+ "required": ["job", "project", "ref"]
+ }
+ ]
+ }
+ },
+ "except": {
+ "$ref": "#/definitions/filter",
+ "description": "Job will run *except* for when these filtering options match."
+ },
+ "tags": {
+ "$ref": "#/definitions/tags"
+ },
+ "allow_failure": {
+ "$ref": "#/definitions/allow_failure"
+ },
+ "timeout": {
+ "$ref": "#/definitions/timeout"
+ },
+ "when": {
+ "$ref": "#/definitions/when"
+ },
+ "start_in": {
+ "$ref": "#/definitions/start_in"
+ },
+ "dependencies": {
+ "type": "array",
+ "description": "Specify a list of job names from earlier stages from which artifacts should be loaded. By default, all previous artifacts are passed. Use an empty array to skip downloading artifacts.",
+ "items": {
+ "type": "string"
+ }
+ },
+ "artifacts": {
+ "$ref": "#/definitions/artifacts"
+ },
+ "environment": {
+ "description": "Used to associate environment metadata with a deploy. Environment can have a name and URL attached to it, and will be displayed under /environments under the project.",
+ "oneOf": [
+ { "type": "string" },
+ {
+ "type": "object",
+ "additionalProperties": false,
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "The name of the environment, e.g. 'qa', 'staging', 'production'.",
+ "minLength": 1
+ },
+ "url": {
+ "type": "string",
+ "description": "When set, this will expose buttons in various places for the current environment in Gitlab, that will take you to the defined URL.",
+ "format": "uri",
+ "pattern": "^(https?://.+|\\$[A-Za-z]+)"
+ },
+ "on_stop": {
+ "type": "string",
+ "description": "The name of a job to execute when the environment is about to be stopped."
+ },
+ "action": {
+ "enum": ["start", "prepare", "stop"],
+ "description": "Specifies what this job will do. 'start' (default) indicates the job will start the deployment. 'prepare' indicates this will not affect the deployment. 'stop' indicates this will stop the deployment.",
+ "default": "start"
+ },
+ "auto_stop_in": {
+ "type": "string",
+ "description": "The amount of time it should take before Gitlab will automatically stop the environment. Supports a wide variety of formats, e.g. '1 week', '3 mins 4 sec', '2 hrs 20 min', '2h20min', '6 mos 1 day', '47 yrs 6 mos and 4d', '3 weeks and 2 days'."
+ },
+ "kubernetes": {
+ "type": "object",
+ "description": "Used to configure the kubernetes deployment for this environment. This is currently not supported for kubernetes clusters that are managed by Gitlab.",
+ "properties": {
+ "namespace": {
+ "type": "string",
+ "description": "The kubernetes namespace where this environment should be deployed to.",
+ "minLength": 1
+ }
+ }
+ },
+ "deployment_tier": {
+ "type": "string",
+ "description": "Explicitly specifies the tier of the deployment environment if non-standard environment name is used.",
+ "enum": [
+ "production",
+ "staging",
+ "testing",
+ "development",
+ "other"
+ ]
+ }
+ },
+ "required": ["name"]
+ }
+ ]
+ },
+ "release": {
+ "type": "object",
+ "description": "Indicates that the job creates a Release.",
+ "additionalProperties": false,
+ "properties": {
+ "tag_name": {
+ "type": "string",
+ "description": "The tag_name must be specified. It can refer to an existing Git tag or can be specified by the user.",
+ "minLength": 1
+ },
+ "description": {
+ "type": "string",
+ "description": "Specifies the longer description of the Release.",
+ "minLength": 1
+ },
+ "name": {
+ "type": "string",
+ "description": "The Release name. If omitted, it is populated with the value of release: tag_name."
+ },
+ "ref": {
+ "type": "string",
+ "description": "If the release: tag_name doesn’t exist yet, the release is created from ref. ref can be a commit SHA, another tag name, or a branch name."
+ },
+ "milestones": {
+ "type": "array",
+ "description": "The title of each milestone the release is associated with.",
+ "items": {
+ "type": "string"
+ }
+ },
+ "released_at": {
+ "type": "string",
+ "description": "The date and time when the release is ready. Defaults to the current date and time if not defined. Should be enclosed in quotes and expressed in ISO 8601 format.",
+ "format": "date-time",
+ "pattern": "^(?:[1-9]\\d{3}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1\\d|2[0-8])|(?:0[13-9]|1[0-2])-(?:29|30)|(?:0[13578]|1[02])-31)|(?:[1-9]\\d(?:0[48]|[2468][048]|[13579][26])|(?:[2468][048]|[13579][26])00)-02-29)T(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:Z|[+-][01]\\d:[0-5]\\d)$"
+ },
+ "assets": {
+ "type": "object",
+ "additionalProperties": false,
+ "properties": {
+ "links": {
+ "type": "array",
+ "description": "Include asset links in the release.",
+ "items": {
+ "type": "object",
+ "additionalProperties": false,
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "The name of the link.",
+ "minLength": 1
+ },
+ "url": {
+ "type": "string",
+ "description": "The URL to download a file.",
+ "minLength": 1
+ },
+ "filepath": {
+ "type": "string",
+ "description": "The redirect link to the url."
+ },
+ "link_type": {
+ "type": "string",
+ "description": "The content kind of what users can download via url.",
+ "enum": [
+ "runbook",
+ "package",
+ "image",
+ "other"
+ ]
+ }
+ },
+ "required": ["name", "url"]
+ },
+ "minItems": 1
+ }
+ },
+ "required": ["links"]
+ }
+ },
+ "required": ["tag_name", "description"]
+ },
+ "coverage": {
+ "type": "string",
+ "description": "Must be a regular expression, optionally but recommended to be quoted, and must be surrounded with '/'. Example: '/Code coverage: \\d+\\.\\d+/'",
+ "format": "regex",
+ "pattern": "^/.+/$"
+ },
+ "retry": {
+ "$ref": "#/definitions/retry"
+ },
+ "parallel": {
+ "description": "Parallel will split up a single job into several, and provide `CI_NODE_INDEX` and `CI_NODE_TOTAL` environment variables for the running jobs.",
+ "oneOf": [
+ {
+ "type": "integer",
+ "description": "Creates N instances of the same job that run in parallel.",
+ "default": 0,
+ "minimum": 2,
+ "maximum": 50
+ },
+ {
+ "type": "object",
+ "properties": {
+ "matrix": {
+ "type": "array",
+ "description": "Defines different variables for jobs that are running in parallel.",
+ "items": {
+ "type": "object",
+ "description": "Defines environment variables for specific job.",
+ "additionalProperties": {
+ "type": ["string", "number", "array"]
+ }
+ },
+ "maxItems": 50
+ }
+ },
+ "additionalProperties": false,
+ "required": ["matrix"]
+ }
+ ]
+ },
+ "interruptible": {
+ "$ref": "#/definitions/interruptible"
+ },
+ "resource_group": {
+ "type": "string",
+ "description": "Limit job concurrency. Can be used to ensure that the Runner will not run certain jobs simultaneously."
+ },
+ "trigger": {
+ "description": "Trigger allows you to define downstream pipeline trigger. When a job created from trigger definition is started by GitLab, a downstream pipeline gets created. Read more: https://docs.gitlab.com/ee/ci/yaml/README.html#trigger",
+ "oneOf": [
+ {
+ "type": "object",
+ "description": "Trigger a multi-project pipeline. Read more: https://docs.gitlab.com/ee/ci/yaml/README.html#simple-trigger-syntax-for-multi-project-pipelines",
+ "additionalProperties": false,
+ "properties": {
+ "project": {
+ "description": "Path to the project, e.g. `group/project`, or `group/sub-group/project`.",
+ "type": "string",
+ "pattern": "\\S/\\S"
+ },
+ "branch": {
+ "description": "The branch name that a downstream pipeline will use",
+ "type": "string"
+ },
+ "strategy": {
+ "description": "You can mirror the pipeline status from the triggered pipeline to the source bridge job by using strategy: depend",
+ "type": "string",
+ "enum": ["depend"]
+ }
+ },
+ "required": ["project"],
+ "dependencies": {
+ "branch": ["project"]
+ }
+ },
+ {
+ "type": "object",
+ "description": "Trigger a child pipeline. Read more: https://docs.gitlab.com/ee/ci/yaml/README.html#trigger-syntax-for-child-pipeline",
+ "additionalProperties": false,
+ "properties": {
+ "include": {
+ "oneOf": [
+ {
+ "description": "Relative path from local repository root (`/`) to the local YAML file to define the pipeline configuration.",
+ "type": "string",
+ "format": "uri-reference",
+ "pattern": "\\.ya?ml$"
+ },
+ {
+ "type": "array",
+ "description": "References a local file or an artifact from another job to define the pipeline configuration.",
+ "maxItems": 3,
+ "items": {
+ "oneOf": [
+ {
+ "type": "object",
+ "additionalProperties": false,
+ "properties": {
+ "local": {
+ "description": "Relative path from local repository root (`/`) to the local YAML file to define the pipeline configuration.",
+ "type": "string",
+ "format": "uri-reference",
+ "pattern": "\\.ya?ml$"
+ }
+ }
+ },
+ {
+ "type": "object",
+ "additionalProperties": false,
+ "properties": {
+ "template": {
+ "description": "Name of the template YAML file to use in the pipeline configuration.",
+ "type": "string",
+ "format": "uri-reference",
+ "pattern": "\\.ya?ml$"
+ }
+ }
+ },
+ {
+ "type": "object",
+ "additionalProperties": false,
+ "properties": {
+ "artifact": {
+ "description": "Relative path to the generated YAML file which is extracted from the artifacts and used as the configuration for triggering the child pipeline.",
+ "type": "string",
+ "format": "uri-reference",
+ "pattern": "\\.ya?ml$"
+ },
+ "job": {
+ "description": "Job name which generates the artifact",
+ "type": "string"
+ }
+ },
+ "required": ["artifact", "job"]
+ },
+ {
+ "type": "object",
+ "additionalProperties": false,
+ "properties": {
+ "project": {
+ "description": "Path to another private project under the same GitLab instance, like `group/project` or `group/sub-group/project`.",
+ "type": "string",
+ "pattern": "\\S/\\S"
+ },
+ "ref": {
+ "description": "Branch/Tag/Commit hash for the target project.",
+ "minLength": 1,
+ "type": "string"
+ },
+ "file": {
+ "description": "Relative path from repository root (`/`) to the pipeline configuration YAML file.",
+ "type": "string",
+ "format": "uri-reference",
+ "pattern": "\\.ya?ml$"
+ }
+ },
+ "required": ["project", "file"]
+ }
+ ]
+ }
+ }
+ ]
+ },
+ "strategy": {
+ "description": "You can mirror the pipeline status from the triggered pipeline to the source bridge job by using strategy: depend",
+ "type": "string",
+ "enum": ["depend"]
+ }
+ }
+ },
+ {
+ "description": "Path to the project, e.g. `group/project`, or `group/sub-group/project`.",
+ "type": "string",
+ "pattern": "\\S/\\S"
+ }
+ ]
+ },
+ "inherit": {
+ "type": "object",
+ "description": "Controls inheritance of globally-defined defaults and variables. Boolean values control inheritance of all default: or variables: keywords. To inherit only a subset of default: or variables: keywords, specify what you wish to inherit. Anything not listed is not inherited.",
+ "properties": {
+ "default": {
+ "description": "Whether to inherit all globally-defined defaults or not. Or subset of inherited defaults",
+ "oneOf": [
+ {
+ "type": "boolean"
+ },
+ {
+ "type": "array",
+ "items": {
+ "type": "string",
+ "enum": [
+ "after_script",
+ "artifacts",
+ "before_script",
+ "cache",
+ "image",
+ "interruptible",
+ "retry",
+ "services",
+ "tags",
+ "timeout"
+ ]
+ }
+ }
+ ]
+ },
+ "variables": {
+ "description": "Whether to inherit all globally-defined variables or not. Or subset of inherited variables",
+ "oneOf": [
+ { "type": "boolean" },
+ {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ }
+ ]
+ }
+ },
+ "additionalProperties": false
+ }
+ },
+ "oneOf": [
+ {
+ "properties": {
+ "when": { "enum": ["delayed"] }
+ },
+ "required": ["when", "start_in"]
+ },
+ {
+ "properties": {
+ "when": {
+ "not": {
+ "enum": ["delayed"]
+ }
+ }
+ }
+ }
+ ]
+ },
+ "tags": {
+ "type": "array",
+ "description": "Used to select runners from the list of available runners. A runner must have all tags listed here to run the job.",
+ "items": {
+ "type": "string"
+ }
+ }
+ }
+}
diff --git a/app/assets/javascripts/environments/components/environment_delete.vue b/app/assets/javascripts/environments/components/environment_delete.vue
index 4b7917b4572..8609503e486 100644
--- a/app/assets/javascripts/environments/components/environment_delete.vue
+++ b/app/assets/javascripts/environments/components/environment_delete.vue
@@ -4,17 +4,15 @@
* Used in the environments table.
*/
-import { GlTooltipDirective, GlButton, GlModalDirective } from '@gitlab/ui';
-import { BV_HIDE_TOOLTIP } from '~/lib/utils/constants';
+import { GlDropdownItem, GlModalDirective } from '@gitlab/ui';
import { s__ } from '~/locale';
import eventHub from '../event_hub';
export default {
components: {
- GlButton,
+ GlDropdownItem,
},
directives: {
- GlTooltip: GlTooltipDirective,
GlModalDirective,
},
props: {
@@ -28,10 +26,8 @@ export default {
isLoading: false,
};
},
- computed: {
- title() {
- return s__('Environments|Delete environment');
- },
+ i18n: {
+ title: s__('Environments|Delete environment'),
},
mounted() {
eventHub.$on('deleteEnvironment', this.onDeleteEnvironment);
@@ -41,7 +37,6 @@ export default {
},
methods: {
onClick() {
- this.$root.$emit(BV_HIDE_TOOLTIP, this.$options.deleteEnvironmentTooltipId);
eventHub.$emit('requestDeleteEnvironment', this.environment);
},
onDeleteEnvironment(environment) {
@@ -50,20 +45,15 @@ export default {
}
},
},
- deleteEnvironmentTooltipId: 'delete-environment-button-tooltip',
};
</script>
<template>
- <gl-button
- v-gl-tooltip="{ id: $options.deleteEnvironmentTooltipId }"
- v-gl-modal-directive="'delete-environment-modal'"
+ <gl-dropdown-item
+ v-gl-modal-directive.delete-environment-modal
:loading="isLoading"
- :title="title"
- :aria-label="title"
- class="gl-display-none gl-md-display-block"
variant="danger"
- category="primary"
- icon="remove"
@click="onClick"
- />
+ >
+ {{ $options.i18n.title }}
+ </gl-dropdown-item>
</template>
diff --git a/app/assets/javascripts/environments/components/environment_external_url.vue b/app/assets/javascripts/environments/components/environment_external_url.vue
index 793f7bf0681..b8def676e7d 100644
--- a/app/assets/javascripts/environments/components/environment_external_url.vue
+++ b/app/assets/javascripts/environments/components/environment_external_url.vue
@@ -18,22 +18,23 @@ export default {
required: true,
},
},
- computed: {
- title() {
- return s__('Environments|Open live environment');
- },
+ i18n: {
+ title: s__('Environments|Open live environment'),
+ open: s__('Environments|Open'),
},
};
</script>
<template>
<gl-button
v-gl-tooltip
- :title="title"
- :aria-label="title"
+ :title="$options.i18n.title"
+ :aria-label="$options.i18n.title"
:href="externalUrl"
class="external-url"
target="_blank"
icon="external-link"
rel="noopener noreferrer nofollow"
- />
+ >
+ {{ $options.i18n.open }}
+ </gl-button>
</template>
diff --git a/app/assets/javascripts/environments/components/environment_item.vue b/app/assets/javascripts/environments/components/environment_item.vue
index d12863ee742..db01d455b2b 100644
--- a/app/assets/javascripts/environments/components/environment_item.vue
+++ b/app/assets/javascripts/environments/components/environment_item.vue
@@ -1,5 +1,5 @@
<script>
-import { GlTooltipDirective, GlIcon, GlLink, GlSprintf } from '@gitlab/ui';
+import { GlDropdown, GlTooltipDirective, GlIcon, GlLink, GlSprintf } from '@gitlab/ui';
import { isEmpty } from 'lodash';
import { convertObjectPropsToCamelCase } from '~/lib/utils/common_utils';
import { __, s__, sprintf } from '~/locale';
@@ -29,6 +29,7 @@ export default {
ActionsComponent,
CommitComponent,
ExternalUrlComponent,
+ GlDropdown,
GlIcon,
GlLink,
GlSprintf,
@@ -521,6 +522,10 @@ export default {
return this.model.metrics_path || '';
},
+ terminalPath() {
+ return this.model?.terminal_path ?? '';
+ },
+
autoStopUrl() {
return this.model.cancel_auto_stop_path || '';
},
@@ -549,6 +554,15 @@ export default {
tableNameSpacingClass() {
return this.isFolder ? 'section-100' : this.tableData.name.spacing;
},
+ hasExtraActions() {
+ return Boolean(
+ this.canRetry ||
+ this.canShowAutoStopDate ||
+ this.monitoringUrl ||
+ this.terminalPath ||
+ this.canDeleteEnvironment,
+ );
+ },
},
methods: {
@@ -776,13 +790,6 @@ export default {
role="gridcell"
>
<div class="btn-group table-action-buttons" role="group">
- <pin-component
- v-if="canShowAutoStopDate"
- :auto-stop-url="autoStopUrl"
- data-track-action="click_button"
- data-track-label="environment_pin"
- />
-
<external-url-component
v-if="externalURL"
:external-url="externalURL"
@@ -790,13 +797,6 @@ export default {
data-track-label="environment_url"
/>
- <monitoring-button-component
- v-if="monitoringUrl"
- :monitoring-url="monitoringUrl"
- data-track-action="click_button"
- data-track-label="environment_monitoring"
- />
-
<actions-component
v-if="actions.length > 0"
:actions="actions"
@@ -804,35 +804,59 @@ export default {
data-track-label="environment_actions"
/>
- <terminal-button-component
- v-if="model && model.terminal_path"
- :terminal-path="model.terminal_path"
- data-track-action="click_button"
- data-track-label="environment_terminal"
- />
-
- <rollback-component
- v-if="canRetry"
- :environment="model"
- :is-last-deployment="isLastDeployment"
- :retry-url="retryUrl"
- data-track-action="click_button"
- data-track-label="environment_rollback"
- />
-
<stop-component
v-if="canStopEnvironment"
:environment="model"
+ class="gl-z-index-2"
data-track-action="click_button"
data-track-label="environment_stop"
/>
- <delete-component
- v-if="canDeleteEnvironment"
- :environment="model"
- data-track-action="click_button"
- data-track-label="environment_delete"
- />
+ <gl-dropdown
+ v-if="hasExtraActions"
+ icon="ellipsis_v"
+ text-sr-only
+ :text="__('More actions')"
+ category="secondary"
+ no-caret
+ >
+ <rollback-component
+ v-if="canRetry"
+ :environment="model"
+ :is-last-deployment="isLastDeployment"
+ :retry-url="retryUrl"
+ data-track-action="click_button"
+ data-track-label="environment_rollback"
+ />
+
+ <pin-component
+ v-if="canShowAutoStopDate"
+ :auto-stop-url="autoStopUrl"
+ data-track-action="click_button"
+ data-track-label="environment_pin"
+ />
+
+ <monitoring-button-component
+ v-if="monitoringUrl"
+ :monitoring-url="monitoringUrl"
+ data-track-action="click_button"
+ data-track-label="environment_monitoring"
+ />
+
+ <terminal-button-component
+ v-if="terminalPath"
+ :terminal-path="terminalPath"
+ data-track-action="click_button"
+ data-track-label="environment_terminal"
+ />
+
+ <delete-component
+ v-if="canDeleteEnvironment"
+ :environment="model"
+ data-track-action="click_button"
+ data-track-label="environment_delete"
+ />
+ </gl-dropdown>
</div>
</div>
</div>
diff --git a/app/assets/javascripts/environments/components/environment_monitoring.vue b/app/assets/javascripts/environments/components/environment_monitoring.vue
index 7f70433776d..06c7f10223a 100644
--- a/app/assets/javascripts/environments/components/environment_monitoring.vue
+++ b/app/assets/javascripts/environments/components/environment_monitoring.vue
@@ -1,15 +1,12 @@
<script>
-import { GlButton, GlTooltipDirective } from '@gitlab/ui';
+import { GlDropdownItem } from '@gitlab/ui';
import { __ } from '~/locale';
/**
* Renders the Monitoring (Metrics) link in environments table.
*/
export default {
components: {
- GlButton,
- },
- directives: {
- GlTooltip: GlTooltipDirective,
+ GlDropdownItem,
},
props: {
monitoringUrl: {
@@ -17,22 +14,11 @@ export default {
required: true,
},
},
- computed: {
- title() {
- return __('Monitoring');
- },
- },
+ title: __('Monitoring'),
};
</script>
<template>
- <gl-button
- v-gl-tooltip
- :href="monitoringUrl"
- :title="title"
- :aria-label="title"
- class="monitoring-url gl-display-none gl-sm-display-none gl-md-display-block"
- icon="chart"
- rel="noopener noreferrer nofollow"
- variant="default"
- />
+ <gl-dropdown-item :href="monitoringUrl" rel="noopener noreferrer nofollow" target="_blank">
+ {{ $options.title }}
+ </gl-dropdown-item>
</template>
diff --git a/app/assets/javascripts/environments/components/environment_pin.vue b/app/assets/javascripts/environments/components/environment_pin.vue
index 52ac7725bde..0b753d53ee3 100644
--- a/app/assets/javascripts/environments/components/environment_pin.vue
+++ b/app/assets/javascripts/environments/components/environment_pin.vue
@@ -3,17 +3,13 @@
* Renders a prevent auto-stop button.
* Used in environments table.
*/
-import { GlButton, GlTooltipDirective, GlIcon } from '@gitlab/ui';
+import { GlDropdownItem } from '@gitlab/ui';
import { __ } from '~/locale';
import eventHub from '../event_hub';
export default {
components: {
- GlIcon,
- GlButton,
- },
- directives: {
- GlTooltip: GlTooltipDirective,
+ GlDropdownItem,
},
props: {
autoStopUrl: {
@@ -26,11 +22,11 @@ export default {
eventHub.$emit('cancelAutoStop', this.autoStopUrl);
},
},
- title: __('Prevent environment from auto-stopping'),
+ title: __('Prevent auto-stopping'),
};
</script>
<template>
- <gl-button v-gl-tooltip :title="$options.title" :aria-label="$options.title" @click="onPinClick">
- <gl-icon name="thumbtack" />
- </gl-button>
+ <gl-dropdown-item @click="onPinClick">
+ {{ $options.title }}
+ </gl-dropdown-item>
</template>
diff --git a/app/assets/javascripts/environments/components/environment_rollback.vue b/app/assets/javascripts/environments/components/environment_rollback.vue
index c0b4e96cea2..00497b3c683 100644
--- a/app/assets/javascripts/environments/components/environment_rollback.vue
+++ b/app/assets/javascripts/environments/components/environment_rollback.vue
@@ -5,16 +5,15 @@
*
* Makes a post request when the button is clicked.
*/
-import { GlTooltipDirective, GlModalDirective, GlButton } from '@gitlab/ui';
+import { GlModalDirective, GlDropdownItem } from '@gitlab/ui';
import { s__ } from '~/locale';
import eventHub from '../event_hub';
export default {
components: {
- GlButton,
+ GlDropdownItem,
},
directives: {
- GlTooltip: GlTooltipDirective,
GlModal: GlModalDirective,
},
props: {
@@ -65,14 +64,7 @@ export default {
};
</script>
<template>
- <gl-button
- v-gl-tooltip
- v-gl-modal.confirm-rollback-modal
- class="gl-display-none gl-md-display-block text-secondary"
- :loading="isLoading"
- :title="title"
- :aria-label="title"
- :icon="isLastDeployment ? 'repeat' : 'redo'"
- @click="onClick"
- />
+ <gl-dropdown-item v-gl-modal.confirm-rollback-modal @click="onClick">
+ {{ title }}
+ </gl-dropdown-item>
</template>
diff --git a/app/assets/javascripts/environments/components/environment_stop.vue b/app/assets/javascripts/environments/components/environment_stop.vue
index dceaf3cacf1..0d4a1e76eb8 100644
--- a/app/assets/javascripts/environments/components/environment_stop.vue
+++ b/app/assets/javascripts/environments/components/environment_stop.vue
@@ -23,16 +23,15 @@ export default {
required: true,
},
},
+ i18n: {
+ title: s__('Environments|Stop environment'),
+ stop: s__('Environments|Stop'),
+ },
data() {
return {
isLoading: false,
};
},
- computed: {
- title() {
- return s__('Environments|Stop environment');
- },
- },
mounted() {
eventHub.$on('stopEnvironment', this.onStopEnvironment);
},
@@ -58,11 +57,13 @@ export default {
v-gl-tooltip="{ id: $options.stopEnvironmentTooltipId }"
v-gl-modal-directive="'stop-environment-modal'"
:loading="isLoading"
- :title="title"
- :aria-label="title"
+ :title="$options.i18n.title"
+ :aria-label="$options.i18n.title"
icon="stop"
- category="primary"
+ category="secondary"
variant="danger"
@click="onClick"
- />
+ >
+ {{ $options.i18n.stop }}
+ </gl-button>
</template>
diff --git a/app/assets/javascripts/environments/components/environment_terminal_button.vue b/app/assets/javascripts/environments/components/environment_terminal_button.vue
index 4750b8ef01b..0df07f0457f 100644
--- a/app/assets/javascripts/environments/components/environment_terminal_button.vue
+++ b/app/assets/javascripts/environments/components/environment_terminal_button.vue
@@ -3,15 +3,12 @@
* Renders a terminal button to open a web terminal.
* Used in environments table.
*/
-import { GlTooltipDirective, GlIcon } from '@gitlab/ui';
+import { GlDropdownItem } from '@gitlab/ui';
import { __ } from '~/locale';
export default {
components: {
- GlIcon,
- },
- directives: {
- GlTooltip: GlTooltipDirective,
+ GlDropdownItem,
},
props: {
terminalPath: {
@@ -25,22 +22,11 @@ export default {
default: false,
},
},
- computed: {
- title() {
- return __('Terminal');
- },
- },
+ title: __('Terminal'),
};
</script>
<template>
- <a
- v-gl-tooltip
- :title="title"
- :aria-label="title"
- :href="terminalPath"
- :class="{ disabled: disabled }"
- class="btn terminal-button d-none d-md-block text-secondary"
- >
- <gl-icon name="terminal" />
- </a>
+ <gl-dropdown-item :href="terminalPath" :disabled="disabled">
+ {{ $options.title }}
+ </gl-dropdown-item>
</template>
diff --git a/app/assets/javascripts/environments/components/environments_table.vue b/app/assets/javascripts/environments/components/environments_table.vue
index f1c728b84fd..7b8b756487b 100644
--- a/app/assets/javascripts/environments/components/environments_table.vue
+++ b/app/assets/javascripts/environments/components/environments_table.vue
@@ -67,7 +67,7 @@ export default {
spacing: 'section-10',
},
autoStop: {
- title: s__('Environments|Auto stop in'),
+ title: s__('Environments|Auto stop'),
spacing: 'section-10',
},
actions: {
diff --git a/app/assets/javascripts/environments/folder/environments_folder_bundle.js b/app/assets/javascripts/environments/folder/environments_folder_bundle.js
index 206381e0b7e..f248e9ec079 100644
--- a/app/assets/javascripts/environments/folder/environments_folder_bundle.js
+++ b/app/assets/javascripts/environments/folder/environments_folder_bundle.js
@@ -8,7 +8,7 @@ Vue.use(Translate);
Vue.use(VueApollo);
const apolloProvider = new VueApollo({
- defaultClient: createDefaultClient(),
+ defaultClient: createDefaultClient({}, { assumeImmutableResults: true }),
});
export default () => {
diff --git a/app/assets/javascripts/error_tracking/components/error_details.vue b/app/assets/javascripts/error_tracking/components/error_details.vue
index 0a15cb56447..4adbf5362b7 100644
--- a/app/assets/javascripts/error_tracking/components/error_details.vue
+++ b/app/assets/javascripts/error_tracking/components/error_details.vue
@@ -128,6 +128,12 @@ export default {
lastReleaseLink() {
return `${this.error.externalBaseUrl}/releases/${this.error.lastReleaseVersion}`;
},
+ firstCommitLink() {
+ return `${this.error.externalBaseUrl}/-/commit/${this.error.firstReleaseVersion}`;
+ },
+ lastCommitLink() {
+ return `${this.error.externalBaseUrl}/-/commit/${this.error.lastReleaseVersion}`;
+ },
showStacktrace() {
return Boolean(this.stacktrace?.length);
},
@@ -394,7 +400,7 @@ export default {
<span>{{ error.gitlabIssuePath }}</span>
</gl-link>
</li>
- <li>
+ <li v-if="!error.integrated">
<strong class="bold">{{ __('Sentry event') }}:</strong>
<gl-link
v-track-event="trackClickErrorLinkToSentryOptions(error.externalUrl)"
@@ -409,15 +415,21 @@ export default {
<li v-if="error.firstReleaseVersion">
<strong class="bold">{{ __('First seen') }}:</strong>
<time-ago-tooltip :time="error.firstSeen" />
- <gl-link :href="firstReleaseLink" target="_blank">
- <span>{{ __('Release') }}: {{ error.firstReleaseVersion }}</span>
+ <gl-link v-if="error.integrated" :href="firstCommitLink">
+ {{ __('GitLab commit') }}: {{ error.firstReleaseVersion }}
+ </gl-link>
+ <gl-link v-else :href="firstReleaseLink" target="_blank">
+ {{ __('Release') }}: {{ error.firstReleaseVersion }}
</gl-link>
</li>
<li v-if="error.lastReleaseVersion">
<strong class="bold">{{ __('Last seen') }}:</strong>
<time-ago-tooltip :time="error.lastSeen" />
- <gl-link :href="lastReleaseLink" target="_blank">
- <span>{{ __('Release') }}: {{ error.lastReleaseVersion }}</span>
+ <gl-link v-if="error.integrated" :href="lastCommitLink">
+ {{ __('GitLab commit') }}: {{ error.lastReleaseVersion }}
+ </gl-link>
+ <gl-link v-else :href="lastReleaseLink" target="_blank">
+ {{ __('Release') }}: {{ error.lastReleaseVersion }}
</gl-link>
</li>
<li>
diff --git a/app/assets/javascripts/error_tracking/queries/details.query.graphql b/app/assets/javascripts/error_tracking/queries/details.query.graphql
index 593cbf2ae52..af386528f00 100644
--- a/app/assets/javascripts/error_tracking/queries/details.query.graphql
+++ b/app/assets/javascripts/error_tracking/queries/details.query.graphql
@@ -23,6 +23,7 @@ query errorDetails($fullPath: ID!, $errorId: ID!) {
gitlabCommit
gitlabCommitPath
gitlabIssuePath
+ integrated
}
}
}
diff --git a/app/assets/javascripts/error_tracking_settings/components/app.vue b/app/assets/javascripts/error_tracking_settings/components/app.vue
index e12d9cc2b07..4808cd1d1c0 100644
--- a/app/assets/javascripts/error_tracking_settings/components/app.vue
+++ b/app/assets/javascripts/error_tracking_settings/components/app.vue
@@ -1,6 +1,14 @@
<script>
-import { GlButton, GlFormGroup, GlFormCheckbox, GlFormRadioGroup, GlFormRadio } from '@gitlab/ui';
+import {
+ GlButton,
+ GlFormGroup,
+ GlFormCheckbox,
+ GlFormRadioGroup,
+ GlFormRadio,
+ GlFormInputGroup,
+} from '@gitlab/ui';
import { mapActions, mapGetters, mapState } from 'vuex';
+import ClipboardButton from '~/vue_shared/components/clipboard_button.vue';
import ErrorTrackingForm from './error_tracking_form.vue';
import ProjectDropdown from './project_dropdown.vue';
@@ -12,7 +20,9 @@ export default {
GlFormGroup,
GlFormRadioGroup,
GlFormRadio,
+ GlFormInputGroup,
ProjectDropdown,
+ ClipboardButton,
},
props: {
initialApiHost: {
@@ -46,6 +56,11 @@ export default {
type: String,
required: true,
},
+ gitlabDsn: {
+ type: String,
+ required: false,
+ default: null,
+ },
},
computed: {
...mapGetters([
@@ -63,6 +78,9 @@ export default {
'settingsLoading',
'token',
]),
+ showGitlabDsnSetting() {
+ return this.integrated && this.enabled && this.gitlabDsn;
+ },
},
created() {
this.setInitialState({
@@ -119,6 +137,17 @@ export default {
</gl-form-radio>
</gl-form-radio-group>
</gl-form-group>
+ <gl-form-group
+ v-if="showGitlabDsnSetting"
+ :label="__('Paste this DSN into your Sentry SDK')"
+ data-testid="gitlab-dsn-setting-form"
+ >
+ <gl-form-input-group readonly :value="gitlabDsn">
+ <template #append>
+ <clipboard-button :text="gitlabDsn" :title="__('Copy')" />
+ </template>
+ </gl-form-input-group>
+ </gl-form-group>
<div v-if="!integrated" class="js-sentry-setting-form" data-testid="sentry-setting-form">
<error-tracking-form />
<div class="form-group">
diff --git a/app/assets/javascripts/error_tracking_settings/index.js b/app/assets/javascripts/error_tracking_settings/index.js
index 324b3292834..69388329e1c 100644
--- a/app/assets/javascripts/error_tracking_settings/index.js
+++ b/app/assets/javascripts/error_tracking_settings/index.js
@@ -13,6 +13,7 @@ export default () => {
token,
listProjectsEndpoint,
operationsSettingsEndpoint,
+ gitlabDsn,
},
} = formContainerEl;
@@ -29,6 +30,7 @@ export default () => {
initialToken: token,
listProjectsEndpoint,
operationsSettingsEndpoint,
+ gitlabDsn,
},
});
},
diff --git a/app/assets/javascripts/experimentation/utils.js b/app/assets/javascripts/experimentation/utils.js
index 9079c238169..624a04fd7c2 100644
--- a/app/assets/javascripts/experimentation/utils.js
+++ b/app/assets/javascripts/experimentation/utils.js
@@ -1,5 +1,5 @@
// This file only applies to use of experiments through https://gitlab.com/gitlab-org/gitlab-experiment
-import { get, pick } from 'lodash';
+import { get } from 'lodash';
import { DEFAULT_VARIANT, CANDIDATE_VARIANT, TRACKING_CONTEXT_SCHEMA } from './constants';
function getExperimentsData() {
@@ -14,12 +14,6 @@ export function getExperimentData(experimentName) {
return getExperimentsData()[experimentName];
}
-export function getExperimentContexts(...experimentNames) {
- return Object.values(pick(getExperimentsData(), experimentNames)).map(
- convertExperimentDataToExperimentContext,
- );
-}
-
export function getAllExperimentContexts() {
return Object.values(getExperimentsData()).map(convertExperimentDataToExperimentContext);
}
diff --git a/app/assets/javascripts/feature_flags/components/edit_feature_flag.vue b/app/assets/javascripts/feature_flags/components/edit_feature_flag.vue
index 05d557db942..2bdc95e798c 100644
--- a/app/assets/javascripts/feature_flags/components/edit_feature_flag.vue
+++ b/app/assets/javascripts/feature_flags/components/edit_feature_flag.vue
@@ -1,7 +1,7 @@
<script>
import { GlAlert, GlLoadingIcon, GlToggle } from '@gitlab/ui';
import { mapState, mapActions } from 'vuex';
-import { sprintf, s__ } from '~/locale';
+import { sprintf, __ } from '~/locale';
import glFeatureFlagMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
import FeatureFlagForm from './form.vue';
@@ -10,6 +10,7 @@ export default {
GlAlert,
GlLoadingIcon,
GlToggle,
+ FeatureFlagActions: () => import('ee_component/feature_flags/components/actions.vue'),
FeatureFlagForm,
},
mixins: [glFeatureFlagMixin()],
@@ -28,7 +29,7 @@ export default {
title() {
return this.iid
? `^${this.iid} ${this.name}`
- : sprintf(s__('Edit %{name}'), { name: this.name });
+ : sprintf(this.$options.i18n.editTitle, { name: this.name });
},
},
created() {
@@ -37,6 +38,11 @@ export default {
methods: {
...mapActions(['updateFeatureFlag', 'fetchFeatureFlag', 'toggleActive']),
},
+ i18n: {
+ editTitle: __('Edit %{name}'),
+ toggleLabel: __('Feature flag status'),
+ submit: __('Save changes'),
+ },
};
</script>
<template>
@@ -51,11 +57,13 @@ export default {
data-track-action="click_button"
data-track-label="feature_flag_toggle"
class="gl-mr-4"
- :label="__('Feature flag status')"
+ :label="$options.i18n.toggleLabel"
label-position="hidden"
@change="toggleActive"
/>
<h3 class="page-title gl-m-0">{{ title }}</h3>
+
+ <feature-flag-actions class="gl-ml-auto" />
</div>
<gl-alert v-if="error.length" variant="warning" class="gl-mb-5" :dismissible="false">
@@ -67,7 +75,7 @@ export default {
:description="description"
:strategies="strategies"
:cancel-path="path"
- :submit-text="__('Save changes')"
+ :submit-text="$options.i18n.submit"
:active="active"
@handleSubmit="(data) => updateFeatureFlag(data)"
/>
diff --git a/app/assets/javascripts/feature_flags/components/form.vue b/app/assets/javascripts/feature_flags/components/form.vue
index f7ad2c1f106..29e82289107 100644
--- a/app/assets/javascripts/feature_flags/components/form.vue
+++ b/app/assets/javascripts/feature_flags/components/form.vue
@@ -95,7 +95,7 @@ export default {
return this.formStrategies.filter((s) => !s.shouldBeDestroyed);
},
showRelatedIssues() {
- return this.featureFlagIssuesEndpoint.length > 0;
+ return Boolean(this.featureFlagIssuesEndpoint);
},
},
methods: {
diff --git a/app/assets/javascripts/feature_flags/components/strategies/flexible_rollout.vue b/app/assets/javascripts/feature_flags/components/strategies/flexible_rollout.vue
index 858c30649bb..1a470d74b59 100644
--- a/app/assets/javascripts/feature_flags/components/strategies/flexible_rollout.vue
+++ b/app/assets/javascripts/feature_flags/components/strategies/flexible_rollout.vue
@@ -17,7 +17,7 @@ export default {
},
},
i18n: {
- percentageDescription: __('Enter an integer number number between 0 and 100'),
+ percentageDescription: __('Enter an integer number between 0 and 100'),
percentageInvalid: __('Percent rollout must be an integer number between 0 and 100'),
percentageLabel: __('Percentage'),
stickinessDescription: __('Consistency guarantee method'),
diff --git a/app/assets/javascripts/feature_flags/edit.js b/app/assets/javascripts/feature_flags/edit.js
index 98dee7c7e97..55dad87ea5b 100644
--- a/app/assets/javascripts/feature_flags/edit.js
+++ b/app/assets/javascripts/feature_flags/edit.js
@@ -15,6 +15,7 @@ export default () => {
environmentsEndpoint,
projectId,
featureFlagIssuesEndpoint,
+ searchPath,
} = el.dataset;
return new Vue({
@@ -26,6 +27,7 @@ export default () => {
environmentsEndpoint,
projectId,
featureFlagIssuesEndpoint,
+ searchPath,
},
render(createElement) {
return createElement(EditFeatureFlag);
diff --git a/app/assets/javascripts/filtered_search/dropdown_ajax_filter.js b/app/assets/javascripts/filtered_search/dropdown_ajax_filter.js
index 545719ee681..9726b2164b7 100644
--- a/app/assets/javascripts/filtered_search/dropdown_ajax_filter.js
+++ b/app/assets/javascripts/filtered_search/dropdown_ajax_filter.js
@@ -1,6 +1,6 @@
import createFlash from '~/flash';
import { __ } from '~/locale';
-import AjaxFilter from '../droplab/plugins/ajax_filter';
+import AjaxFilter from './droplab/plugins/ajax_filter';
import DropdownUtils from './dropdown_utils';
import FilteredSearchDropdown from './filtered_search_dropdown';
import FilteredSearchTokenizer from './filtered_search_tokenizer';
diff --git a/app/assets/javascripts/filtered_search/dropdown_emoji.js b/app/assets/javascripts/filtered_search/dropdown_emoji.js
index a7648a3c463..5adc074b3ce 100644
--- a/app/assets/javascripts/filtered_search/dropdown_emoji.js
+++ b/app/assets/javascripts/filtered_search/dropdown_emoji.js
@@ -1,7 +1,7 @@
import createFlash from '~/flash';
import { __ } from '~/locale';
-import Ajax from '../droplab/plugins/ajax';
-import Filter from '../droplab/plugins/filter';
+import Ajax from './droplab/plugins/ajax';
+import Filter from './droplab/plugins/filter';
import DropdownUtils from './dropdown_utils';
import FilteredSearchDropdown from './filtered_search_dropdown';
diff --git a/app/assets/javascripts/filtered_search/dropdown_hint.js b/app/assets/javascripts/filtered_search/dropdown_hint.js
index 47f350dc6a2..9d29782c9a7 100644
--- a/app/assets/javascripts/filtered_search/dropdown_hint.js
+++ b/app/assets/javascripts/filtered_search/dropdown_hint.js
@@ -1,5 +1,5 @@
-import Filter from '~/droplab/plugins/filter';
import { __ } from '~/locale';
+import Filter from './droplab/plugins/filter';
import DropdownUtils from './dropdown_utils';
import FilteredSearchDropdown from './filtered_search_dropdown';
import FilteredSearchDropdownManager from './filtered_search_dropdown_manager';
diff --git a/app/assets/javascripts/filtered_search/dropdown_non_user.js b/app/assets/javascripts/filtered_search/dropdown_non_user.js
index f78644a3893..ddc3c06a9d1 100644
--- a/app/assets/javascripts/filtered_search/dropdown_non_user.js
+++ b/app/assets/javascripts/filtered_search/dropdown_non_user.js
@@ -1,7 +1,7 @@
import createFlash from '~/flash';
import { __ } from '~/locale';
-import Ajax from '../droplab/plugins/ajax';
-import Filter from '../droplab/plugins/filter';
+import Ajax from './droplab/plugins/ajax';
+import Filter from './droplab/plugins/filter';
import DropdownUtils from './dropdown_utils';
import FilteredSearchDropdown from './filtered_search_dropdown';
diff --git a/app/assets/javascripts/filtered_search/dropdown_operator.js b/app/assets/javascripts/filtered_search/dropdown_operator.js
index f933338514a..fb9f25a8c45 100644
--- a/app/assets/javascripts/filtered_search/dropdown_operator.js
+++ b/app/assets/javascripts/filtered_search/dropdown_operator.js
@@ -1,5 +1,5 @@
-import Filter from '~/droplab/plugins/filter';
import { __ } from '~/locale';
+import Filter from './droplab/plugins/filter';
import DropdownUtils from './dropdown_utils';
import FilteredSearchDropdown from './filtered_search_dropdown';
import FilteredSearchDropdownManager from './filtered_search_dropdown_manager';
diff --git a/app/assets/javascripts/droplab/constants.js b/app/assets/javascripts/filtered_search/droplab/constants.js
index 6451af49d36..6451af49d36 100644
--- a/app/assets/javascripts/droplab/constants.js
+++ b/app/assets/javascripts/filtered_search/droplab/constants.js
diff --git a/app/assets/javascripts/droplab/drop_down.js b/app/assets/javascripts/filtered_search/droplab/drop_down.js
index 05b741af191..05b741af191 100644
--- a/app/assets/javascripts/droplab/drop_down.js
+++ b/app/assets/javascripts/filtered_search/droplab/drop_down.js
diff --git a/app/assets/javascripts/filtered_search/droplab/drop_lab_deprecated.js b/app/assets/javascripts/filtered_search/droplab/drop_lab_deprecated.js
new file mode 100644
index 00000000000..15c4a4b7c6b
--- /dev/null
+++ b/app/assets/javascripts/filtered_search/droplab/drop_lab_deprecated.js
@@ -0,0 +1,170 @@
+/**
+ * This library is deprecated and scheduled to be removed once the
+ * filtered_search component is replaced with GitLab's new Pajamas
+ * filter vue component.
+ *
+ * The documentation has been removed from the gitlab codebase but
+ * can still be found in the commit history here:
+ * https://gitlab.com/gitlab-org/gitlab/-/blob/28f20e28/doc/development/fe_guide/droplab/droplab.md
+ */
+
+import { DATA_TRIGGER } from './constants';
+import HookButton from './hook_button';
+import HookInput from './hook_input';
+import Keyboard from './keyboard';
+import utils from './utils';
+
+class DropLab {
+ constructor() {
+ this.ready = false;
+ this.hooks = [];
+ this.queuedData = [];
+ this.config = {};
+
+ this.eventWrapper = {};
+ }
+
+ loadStatic() {
+ const dropdownTriggers = [].slice.apply(document.querySelectorAll(`[${DATA_TRIGGER}]`));
+ this.addHooks(dropdownTriggers);
+ }
+
+ addData(...args) {
+ this.applyArgs(args, 'processAddData');
+ }
+
+ setData(...args) {
+ this.applyArgs(args, 'processSetData');
+ }
+
+ destroy() {
+ this.hooks.forEach((hook) => hook.destroy());
+ this.hooks = [];
+ this.removeEvents();
+ }
+
+ applyArgs(args, methodName) {
+ if (this.ready) return this[methodName](...args);
+
+ this.queuedData = this.queuedData || [];
+ this.queuedData.push(args);
+
+ return this.ready;
+ }
+
+ processAddData(trigger, data) {
+ this.processData(trigger, data, 'addData');
+ }
+
+ processSetData(trigger, data) {
+ this.processData(trigger, data, 'setData');
+ }
+
+ processData(trigger, data, methodName) {
+ this.hooks.forEach((hook) => {
+ if (Array.isArray(trigger)) hook.list[methodName](trigger);
+
+ if (hook.trigger.id === trigger) hook.list[methodName](data);
+ });
+ }
+
+ addEvents() {
+ this.eventWrapper.documentClicked = this.documentClicked.bind(this);
+ document.addEventListener('click', this.eventWrapper.documentClicked);
+ }
+
+ documentClicked(e) {
+ if (e.defaultPrevented) return;
+
+ if (utils.isDropDownParts(e.target)) return;
+
+ if (e.target.tagName !== 'UL') {
+ const closestUl = utils.closest(e.target, 'UL');
+ if (utils.isDropDownParts(closestUl)) return;
+ }
+
+ this.hooks.forEach((hook) => hook.list.hide());
+ }
+
+ removeEvents() {
+ document.removeEventListener('click', this.eventWrapper.documentClicked);
+ }
+
+ changeHookList(trigger, list, plugins, config) {
+ const availableTrigger =
+ typeof trigger === 'string' ? document.getElementById(trigger) : trigger;
+
+ this.hooks.forEach((hook, i) => {
+ const aHook = hook;
+
+ aHook.list.list.dataset.dropdownActive = false;
+
+ if (aHook.trigger !== availableTrigger) return;
+
+ aHook.destroy();
+ this.hooks.splice(i, 1);
+ this.addHook(availableTrigger, list, plugins, config);
+ });
+ }
+
+ addHook(hook, list, plugins, config) {
+ const availableHook = typeof hook === 'string' ? document.querySelector(hook) : hook;
+ let availableList;
+
+ if (typeof list === 'string') {
+ availableList = document.querySelector(list);
+ } else if (list instanceof Element) {
+ availableList = list;
+ } else {
+ availableList = document.querySelector(hook.dataset[utils.toCamelCase(DATA_TRIGGER)]);
+ }
+
+ availableList.dataset.dropdownActive = true;
+
+ const HookObject = availableHook.tagName === 'INPUT' ? HookInput : HookButton;
+ this.hooks.push(new HookObject(availableHook, availableList, plugins, config));
+
+ return this;
+ }
+
+ addHooks(hooks, plugins, config) {
+ hooks.forEach((hook) => this.addHook(hook, null, plugins, config));
+ return this;
+ }
+
+ setConfig(obj) {
+ this.config = obj;
+ }
+
+ fireReady() {
+ const readyEvent = new CustomEvent('ready.dl', {
+ detail: {
+ dropdown: this,
+ },
+ });
+ document.dispatchEvent(readyEvent);
+
+ this.ready = true;
+ }
+
+ init(hook, list, plugins, config) {
+ if (hook) {
+ this.addHook(hook, list, plugins, config);
+ } else {
+ this.loadStatic();
+ }
+
+ this.addEvents();
+
+ Keyboard();
+
+ this.fireReady();
+
+ this.queuedData.forEach((data) => this.addData(data));
+ this.queuedData = [];
+
+ return this;
+ }
+}
+
+export default DropLab;
diff --git a/app/assets/javascripts/droplab/hook.js b/app/assets/javascripts/filtered_search/droplab/hook.js
index 8a8dcde9f88..8a8dcde9f88 100644
--- a/app/assets/javascripts/droplab/hook.js
+++ b/app/assets/javascripts/filtered_search/droplab/hook.js
diff --git a/app/assets/javascripts/droplab/hook_button.js b/app/assets/javascripts/filtered_search/droplab/hook_button.js
index c51d6167fa3..c51d6167fa3 100644
--- a/app/assets/javascripts/droplab/hook_button.js
+++ b/app/assets/javascripts/filtered_search/droplab/hook_button.js
diff --git a/app/assets/javascripts/droplab/hook_input.js b/app/assets/javascripts/filtered_search/droplab/hook_input.js
index c523dae347f..c523dae347f 100644
--- a/app/assets/javascripts/droplab/hook_input.js
+++ b/app/assets/javascripts/filtered_search/droplab/hook_input.js
diff --git a/app/assets/javascripts/droplab/keyboard.js b/app/assets/javascripts/filtered_search/droplab/keyboard.js
index fe1ea2fa6b0..fe1ea2fa6b0 100644
--- a/app/assets/javascripts/droplab/keyboard.js
+++ b/app/assets/javascripts/filtered_search/droplab/keyboard.js
diff --git a/app/assets/javascripts/droplab/plugins/ajax.js b/app/assets/javascripts/filtered_search/droplab/plugins/ajax.js
index 77d60454d1a..77d60454d1a 100644
--- a/app/assets/javascripts/droplab/plugins/ajax.js
+++ b/app/assets/javascripts/filtered_search/droplab/plugins/ajax.js
diff --git a/app/assets/javascripts/filtered_search/droplab/plugins/ajax_filter.js b/app/assets/javascripts/filtered_search/droplab/plugins/ajax_filter.js
new file mode 100644
index 00000000000..d0f2d205bb6
--- /dev/null
+++ b/app/assets/javascripts/filtered_search/droplab/plugins/ajax_filter.js
@@ -0,0 +1,114 @@
+/* eslint-disable */
+
+import AjaxCache from '~/lib/utils/ajax_cache';
+
+const AjaxFilter = {
+ init: function (hook) {
+ this.destroyed = false;
+ this.hook = hook;
+ this.notLoading();
+
+ this.eventWrapper = {};
+ this.eventWrapper.debounceTrigger = this.debounceTrigger.bind(this);
+ this.hook.trigger.addEventListener('keydown.dl', this.eventWrapper.debounceTrigger);
+ this.hook.trigger.addEventListener('focus', this.eventWrapper.debounceTrigger);
+
+ this.trigger(true);
+ },
+
+ notLoading: function notLoading() {
+ this.loading = false;
+ },
+
+ debounceTrigger: function debounceTrigger(e) {
+ var NON_CHARACTER_KEYS = [16, 17, 18, 20, 37, 38, 39, 40, 91, 93];
+ var invalidKeyPressed = NON_CHARACTER_KEYS.indexOf(e.detail.which || e.detail.keyCode) > -1;
+ var focusEvent = e.type === 'focus';
+ if (invalidKeyPressed || this.loading) {
+ return;
+ }
+ if (this.timeout) {
+ clearTimeout(this.timeout);
+ }
+ this.timeout = setTimeout(this.trigger.bind(this, focusEvent), 200);
+ },
+
+ trigger: function trigger(getEntireList) {
+ var config = this.hook.config.AjaxFilter;
+ var searchValue = this.trigger.value;
+ if (!config || !config.endpoint || !config.searchKey) {
+ return;
+ }
+ if (config.searchValueFunction) {
+ searchValue = config.searchValueFunction();
+ }
+ if (
+ (config.loadingTemplate && this.hook.list.data === undefined) ||
+ this.hook.list.data.length === 0
+ ) {
+ var dynamicList = this.hook.list.list.querySelector('[data-dynamic]');
+ var loadingTemplate = document.createElement('div');
+ loadingTemplate.innerHTML = config.loadingTemplate;
+ loadingTemplate.setAttribute('data-loading-template', true);
+ this.listTemplate = dynamicList.outerHTML;
+ dynamicList.outerHTML = loadingTemplate.outerHTML;
+ }
+ if (getEntireList) {
+ searchValue = '';
+ }
+ if (config.searchKey === searchValue) {
+ return this.list.show();
+ }
+ this.loading = true;
+ var params = config.params || {};
+ params[config.searchKey] = searchValue;
+ var url = config.endpoint + this.buildParams(params);
+ return AjaxCache.retrieve(url)
+ .then((data) => {
+ this._loadData(data, config);
+ if (config.onLoadingFinished) {
+ config.onLoadingFinished(data);
+ }
+ })
+ .catch(config.onError);
+ },
+
+ _loadData(data, config) {
+ const list = this.hook.list;
+ if ((config.loadingTemplate && list.data === undefined) || list.data.length === 0) {
+ const dataLoadingTemplate = list.list.querySelector('[data-loading-template]');
+ if (dataLoadingTemplate) {
+ dataLoadingTemplate.outerHTML = this.listTemplate;
+ }
+ }
+ if (!this.destroyed) {
+ var hookListChildren = list.list.children;
+ var onlyDynamicList =
+ hookListChildren.length === 1 && hookListChildren[0].hasAttribute('data-dynamic');
+ if (onlyDynamicList && data.length === 0) {
+ list.hide();
+ }
+ list.setData.call(list, data);
+ }
+ this.notLoading();
+ list.currentIndex = 0;
+ },
+
+ buildParams: function (params) {
+ if (!params) return '';
+ var paramsArray = Object.keys(params).map(function (param) {
+ return param + '=' + (params[param] || '');
+ });
+ return '?' + paramsArray.join('&');
+ },
+
+ destroy: function destroy() {
+ if (this.timeout) clearTimeout(this.timeout);
+ this.destroyed = true;
+
+ this.hook.trigger.removeEventListener('keydown.dl', this.eventWrapper.debounceTrigger);
+ this.hook.trigger.removeEventListener('focus', this.eventWrapper.debounceTrigger);
+ },
+};
+
+export default AjaxFilter;
diff --git a/app/assets/javascripts/droplab/plugins/filter.js b/app/assets/javascripts/filtered_search/droplab/plugins/filter.js
index 06391668928..06391668928 100644
--- a/app/assets/javascripts/droplab/plugins/filter.js
+++ b/app/assets/javascripts/filtered_search/droplab/plugins/filter.js
diff --git a/app/assets/javascripts/droplab/plugins/input_setter.js b/app/assets/javascripts/filtered_search/droplab/plugins/input_setter.js
index 148d9a35b81..148d9a35b81 100644
--- a/app/assets/javascripts/droplab/plugins/input_setter.js
+++ b/app/assets/javascripts/filtered_search/droplab/plugins/input_setter.js
diff --git a/app/assets/javascripts/droplab/utils.js b/app/assets/javascripts/filtered_search/droplab/utils.js
index d7f49bf19d8..d7f49bf19d8 100644
--- a/app/assets/javascripts/droplab/utils.js
+++ b/app/assets/javascripts/filtered_search/droplab/utils.js
diff --git a/app/assets/javascripts/filtered_search/filtered_search_dropdown_manager.js b/app/assets/javascripts/filtered_search/filtered_search_dropdown_manager.js
index ebaa3ef98b1..e467e97dda9 100644
--- a/app/assets/javascripts/filtered_search/filtered_search_dropdown_manager.js
+++ b/app/assets/javascripts/filtered_search/filtered_search_dropdown_manager.js
@@ -1,6 +1,6 @@
import { last } from 'lodash';
import AvailableDropdownMappings from 'ee_else_ce/filtered_search/available_dropdown_mappings';
-import DropLab from '~/droplab/drop_lab';
+import DropLab from './droplab/drop_lab_deprecated';
import { DROPDOWN_TYPE } from './constants';
import FilteredSearchContainer from './container';
import DropdownUtils from './dropdown_utils';
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 2f451e8353b..5dac315d345 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,6 +1,6 @@
<script>
/* eslint-disable vue/require-default-prop */
-import { GlButton } from '@gitlab/ui';
+import { GlButton, GlSafeHtmlDirective } from '@gitlab/ui';
import highlight from '~/lib/utils/highlight';
import { truncateNamespace } from '~/lib/utils/text_utility';
import { mapVuexModuleState } from '~/lib/utils/vuex_module_mappers';
@@ -14,6 +14,9 @@ export default {
GlButton,
ProjectAvatar,
},
+ directives: {
+ SafeHtml: GlSafeHtmlDirective,
+ },
mixins: [trackingMixin],
inject: ['vuexModule'],
props: {
@@ -73,9 +76,9 @@ export default {
<div ref="frequentItemsItemMetadataContainer" class="frequent-items-item-metadata-container">
<div
ref="frequentItemsItemTitle"
+ v-safe-html="highlightedItemName"
:title="itemName"
class="frequent-items-item-title"
- v-html="highlightedItemName /* eslint-disable-line vue/no-v-html */"
></div>
<div
v-if="namespace"
diff --git a/app/assets/javascripts/graphql_shared/fragments/milestone.fragment.graphql b/app/assets/javascripts/graphql_shared/fragments/milestone.fragment.graphql
new file mode 100644
index 00000000000..760d78be20d
--- /dev/null
+++ b/app/assets/javascripts/graphql_shared/fragments/milestone.fragment.graphql
@@ -0,0 +1,6 @@
+fragment MilestoneFragment on Milestone {
+ expired
+ id
+ state
+ title
+}
diff --git a/app/assets/javascripts/header_search/components/app.vue b/app/assets/javascripts/header_search/components/app.vue
index 580c27f6c61..c6590fd8eb3 100644
--- a/app/assets/javascripts/header_search/components/app.vue
+++ b/app/assets/javascripts/header_search/components/app.vue
@@ -3,6 +3,7 @@ import { GlSearchBoxByType, GlOutsideDirective as Outside } from '@gitlab/ui';
import { mapState, mapActions, mapGetters } from 'vuex';
import { visitUrl } from '~/lib/utils/url_utility';
import { __ } from '~/locale';
+import HeaderSearchAutocompleteItems from './header_search_autocomplete_items.vue';
import HeaderSearchDefaultItems from './header_search_default_items.vue';
import HeaderSearchScopedItems from './header_search_scoped_items.vue';
@@ -16,6 +17,7 @@ export default {
GlSearchBoxByType,
HeaderSearchDefaultItems,
HeaderSearchScopedItems,
+ HeaderSearchAutocompleteItems,
},
data() {
return {
@@ -41,7 +43,7 @@ export default {
},
},
methods: {
- ...mapActions(['setSearch']),
+ ...mapActions(['setSearch', 'fetchAutocompleteOptions']),
openDropdown() {
this.showDropdown = true;
},
@@ -51,6 +53,13 @@ export default {
submitSearch() {
return visitUrl(this.searchQuery);
},
+ getAutocompleteOptions(searchTerm) {
+ if (!searchTerm) {
+ return;
+ }
+
+ this.fetchAutocompleteOptions();
+ },
},
};
</script>
@@ -64,18 +73,20 @@ export default {
:placeholder="$options.i18n.searchPlaceholder"
@focus="openDropdown"
@click="openDropdown"
+ @input="getAutocompleteOptions"
@keydown.enter="submitSearch"
@keydown.esc="closeDropdown"
/>
<div
v-if="showSearchDropdown"
data-testid="header-search-dropdown-menu"
- class="header-search-dropdown-menu gl-overflow-y-auto gl-absolute gl-left-0 gl-z-index-1 gl-w-full gl-bg-white gl-border-1 gl-rounded-base gl-border-solid gl-border-gray-200 gl-shadow-x0-y2-b4-s0"
+ class="header-search-dropdown-menu gl-absolute gl-w-full gl-bg-white gl-border-1 gl-rounded-base gl-border-solid gl-border-gray-200 gl-shadow-x0-y2-b4-s0"
>
<div class="header-search-dropdown-content gl-overflow-y-auto gl-py-2">
<header-search-default-items v-if="showDefaultItems" />
<template v-else>
<header-search-scoped-items />
+ <header-search-autocomplete-items />
</template>
</div>
</div>
diff --git a/app/assets/javascripts/header_search/components/header_search_autocomplete_items.vue b/app/assets/javascripts/header_search/components/header_search_autocomplete_items.vue
new file mode 100644
index 00000000000..9bea2b280f7
--- /dev/null
+++ b/app/assets/javascripts/header_search/components/header_search_autocomplete_items.vue
@@ -0,0 +1,74 @@
+<script>
+import {
+ GlDropdownItem,
+ GlDropdownSectionHeader,
+ GlDropdownDivider,
+ GlAvatar,
+ GlLoadingIcon,
+ GlSafeHtmlDirective as SafeHtml,
+} from '@gitlab/ui';
+import { mapState, mapGetters } from 'vuex';
+import highlight from '~/lib/utils/highlight';
+import { GROUPS_CATEGORY, PROJECTS_CATEGORY, LARGE_AVATAR_PX, SMALL_AVATAR_PX } from '../constants';
+
+export default {
+ name: 'HeaderSearchAutocompleteItems',
+ components: {
+ GlDropdownItem,
+ GlDropdownSectionHeader,
+ GlDropdownDivider,
+ GlAvatar,
+ GlLoadingIcon,
+ },
+ directives: {
+ SafeHtml,
+ },
+ computed: {
+ ...mapState(['search', 'loading']),
+ ...mapGetters(['autocompleteGroupedSearchOptions']),
+ },
+ methods: {
+ highlightedName(val) {
+ return highlight(val, this.search);
+ },
+ avatarSize(data) {
+ if (data.category === GROUPS_CATEGORY || data.category === PROJECTS_CATEGORY) {
+ return LARGE_AVATAR_PX;
+ }
+
+ return SMALL_AVATAR_PX;
+ },
+ },
+};
+</script>
+
+<template>
+ <div>
+ <template v-if="!loading">
+ <div v-for="option in autocompleteGroupedSearchOptions" :key="option.category">
+ <gl-dropdown-divider />
+ <gl-dropdown-section-header>{{ option.category }}</gl-dropdown-section-header>
+ <gl-dropdown-item
+ v-for="(data, index) in option.data"
+ :id="`autocomplete-${option.category}-${index}`"
+ :key="index"
+ tabindex="-1"
+ :href="data.url"
+ >
+ <div class="gl-display-flex gl-align-items-center">
+ <gl-avatar
+ v-if="data.avatar_url !== undefined"
+ :src="data.avatar_url"
+ :entity-id="data.id"
+ :entity-name="data.label"
+ :size="avatarSize(data)"
+ shape="square"
+ />
+ <span v-safe-html="highlightedName(data.label)"></span>
+ </div>
+ </gl-dropdown-item>
+ </div>
+ </template>
+ <gl-loading-icon v-else size="lg" class="my-4" />
+ </div>
+</template>
diff --git a/app/assets/javascripts/header_search/constants.js b/app/assets/javascripts/header_search/constants.js
index fffed7bcbdb..2fadb1bd1ee 100644
--- a/app/assets/javascripts/header_search/constants.js
+++ b/app/assets/javascripts/header_search/constants.js
@@ -15,3 +15,11 @@ export const MSG_IN_ALL_GITLAB = __('in all GitLab');
export const MSG_IN_GROUP = __('in group');
export const MSG_IN_PROJECT = __('in project');
+
+export const GROUPS_CATEGORY = 'Groups';
+
+export const PROJECTS_CATEGORY = 'Projects';
+
+export const LARGE_AVATAR_PX = 32;
+
+export const SMALL_AVATAR_PX = 16;
diff --git a/app/assets/javascripts/header_search/index.js b/app/assets/javascripts/header_search/index.js
index 2d37ee137fc..d7e21f55ea5 100644
--- a/app/assets/javascripts/header_search/index.js
+++ b/app/assets/javascripts/header_search/index.js
@@ -12,13 +12,13 @@ export const initHeaderSearchApp = () => {
return false;
}
- const { searchPath, issuesPath, mrPath } = el.dataset;
+ const { searchPath, issuesPath, mrPath, autocompletePath } = el.dataset;
let { searchContext } = el.dataset;
searchContext = JSON.parse(searchContext);
return new Vue({
el,
- store: createStore({ searchPath, issuesPath, mrPath, searchContext }),
+ store: createStore({ searchPath, issuesPath, mrPath, autocompletePath, searchContext }),
render(createElement) {
return createElement(HeaderSearchApp);
},
diff --git a/app/assets/javascripts/header_search/store/actions.js b/app/assets/javascripts/header_search/store/actions.js
index 841aee04029..2c3b1bd4c0f 100644
--- a/app/assets/javascripts/header_search/store/actions.js
+++ b/app/assets/javascripts/header_search/store/actions.js
@@ -1,5 +1,19 @@
+import createFlash from '~/flash';
+import axios from '~/lib/utils/axios_utils';
+import { __ } from '~/locale';
import * as types from './mutation_types';
+export const fetchAutocompleteOptions = ({ commit, getters }) => {
+ commit(types.REQUEST_AUTOCOMPLETE);
+ return axios
+ .get(getters.autocompleteQuery)
+ .then(({ data }) => commit(types.RECEIVE_AUTOCOMPLETE_SUCCESS, data))
+ .catch(() => {
+ commit(types.RECEIVE_AUTOCOMPLETE_ERROR);
+ createFlash({ message: __('There was an error fetching search autocomplete suggestions') });
+ });
+};
+
export const setSearch = ({ commit }, value) => {
commit(types.SET_SEARCH, value);
};
diff --git a/app/assets/javascripts/header_search/store/getters.js b/app/assets/javascripts/header_search/store/getters.js
index d1e1fc8ad73..3f4e231ca55 100644
--- a/app/assets/javascripts/header_search/store/getters.js
+++ b/app/assets/javascripts/header_search/store/getters.js
@@ -23,6 +23,16 @@ export const searchQuery = (state) => {
return `${state.searchPath}?${objectToQuery(query)}`;
};
+export const autocompleteQuery = (state) => {
+ const query = {
+ term: state.search,
+ project_id: state.searchContext.project?.id,
+ project_ref: state.searchContext.ref,
+ };
+
+ return `${state.autocompletePath}?${objectToQuery(query)}`;
+};
+
export const scopedIssuesPath = (state) => {
return (
state.searchContext.project_metadata?.issues_path ||
@@ -133,3 +143,25 @@ export const scopedSearchOptions = (state, getters) => {
return options;
};
+
+export const autocompleteGroupedSearchOptions = (state) => {
+ const groupedOptions = {};
+ const results = [];
+
+ state.autocompleteOptions.forEach((option) => {
+ const category = groupedOptions[option.category];
+
+ if (category) {
+ category.data.push(option);
+ } else {
+ groupedOptions[option.category] = {
+ category: option.category,
+ data: [option],
+ };
+
+ results.push(groupedOptions[option.category]);
+ }
+ });
+
+ return results;
+};
diff --git a/app/assets/javascripts/header_search/store/index.js b/app/assets/javascripts/header_search/store/index.js
index 8b74f8662a5..06cca4be8a7 100644
--- a/app/assets/javascripts/header_search/store/index.js
+++ b/app/assets/javascripts/header_search/store/index.js
@@ -7,11 +7,17 @@ import createState from './state';
Vue.use(Vuex);
-export const getStoreConfig = ({ searchPath, issuesPath, mrPath, searchContext }) => ({
+export const getStoreConfig = ({
+ searchPath,
+ issuesPath,
+ mrPath,
+ autocompletePath,
+ searchContext,
+}) => ({
actions,
getters,
mutations,
- state: createState({ searchPath, issuesPath, mrPath, searchContext }),
+ state: createState({ searchPath, issuesPath, mrPath, autocompletePath, searchContext }),
});
const createStore = (config) => new Vuex.Store(getStoreConfig(config));
diff --git a/app/assets/javascripts/header_search/store/mutation_types.js b/app/assets/javascripts/header_search/store/mutation_types.js
index 0bc94ae055f..a2358621ce6 100644
--- a/app/assets/javascripts/header_search/store/mutation_types.js
+++ b/app/assets/javascripts/header_search/store/mutation_types.js
@@ -1 +1,5 @@
+export const REQUEST_AUTOCOMPLETE = 'REQUEST_AUTOCOMPLETE';
+export const RECEIVE_AUTOCOMPLETE_SUCCESS = 'RECEIVE_AUTOCOMPLETE_SUCCESS';
+export const RECEIVE_AUTOCOMPLETE_ERROR = 'RECEIVE_AUTOCOMPLETE_ERROR';
+
export const SET_SEARCH = 'SET_SEARCH';
diff --git a/app/assets/javascripts/header_search/store/mutations.js b/app/assets/javascripts/header_search/store/mutations.js
index 5b1438929d4..175b5406540 100644
--- a/app/assets/javascripts/header_search/store/mutations.js
+++ b/app/assets/javascripts/header_search/store/mutations.js
@@ -1,6 +1,18 @@
import * as types from './mutation_types';
export default {
+ [types.REQUEST_AUTOCOMPLETE](state) {
+ state.loading = true;
+ state.autocompleteOptions = [];
+ },
+ [types.RECEIVE_AUTOCOMPLETE_SUCCESS](state, data) {
+ state.loading = false;
+ state.autocompleteOptions = data;
+ },
+ [types.RECEIVE_AUTOCOMPLETE_ERROR](state) {
+ state.loading = false;
+ state.autocompleteOptions = [];
+ },
[types.SET_SEARCH](state, value) {
state.search = value;
},
diff --git a/app/assets/javascripts/header_search/store/state.js b/app/assets/javascripts/header_search/store/state.js
index fb2c83dbbe3..3d4073f0583 100644
--- a/app/assets/javascripts/header_search/store/state.js
+++ b/app/assets/javascripts/header_search/store/state.js
@@ -1,8 +1,11 @@
-const createState = ({ searchPath, issuesPath, mrPath, searchContext }) => ({
+const createState = ({ searchPath, issuesPath, mrPath, autocompletePath, searchContext }) => ({
searchPath,
issuesPath,
mrPath,
+ autocompletePath,
searchContext,
search: '',
+ autocompleteOptions: [],
+ loading: false,
});
export default createState;
diff --git a/app/assets/javascripts/ide/components/commit_sidebar/success_message.vue b/app/assets/javascripts/ide/components/commit_sidebar/success_message.vue
index 5a7d7917f8a..5272c4310d8 100644
--- a/app/assets/javascripts/ide/components/commit_sidebar/success_message.vue
+++ b/app/assets/javascripts/ide/components/commit_sidebar/success_message.vue
@@ -1,7 +1,11 @@
<script>
+import { GlSafeHtmlDirective as SafeHtml } from '@gitlab/ui';
import { mapState } from 'vuex';
export default {
+ directives: {
+ SafeHtml,
+ },
computed: {
...mapState(['lastCommitMsg', 'committedStateSvgPath']),
},
@@ -16,7 +20,7 @@ export default {
<div class="gl-mr-3 gl-ml-3">
<div class="text-content text-center">
<h4>{{ __('All changes are committed') }}</h4>
- <p v-html="lastCommitMsg /* eslint-disable-line vue/no-v-html */"></p>
+ <p v-safe-html="lastCommitMsg"></p>
</div>
</div>
</div>
diff --git a/app/assets/javascripts/ide/components/jobs/detail.vue b/app/assets/javascripts/ide/components/jobs/detail.vue
index c142992a9d1..96cb4f3d495 100644
--- a/app/assets/javascripts/ide/components/jobs/detail.vue
+++ b/app/assets/javascripts/ide/components/jobs/detail.vue
@@ -44,18 +44,18 @@ export default {
methods: {
...mapActions('pipelines', ['fetchJobLogs', 'setDetailJob']),
scrollDown() {
- if (this.$refs.buildTrace) {
- this.$refs.buildTrace.scrollTo(0, this.$refs.buildTrace.scrollHeight);
+ if (this.$refs.buildJobLog) {
+ this.$refs.buildJobLog.scrollTo(0, this.$refs.buildJobLog.scrollHeight);
}
},
scrollUp() {
- if (this.$refs.buildTrace) {
- this.$refs.buildTrace.scrollTo(0, 0);
+ if (this.$refs.buildJobLog) {
+ this.$refs.buildJobLog.scrollTo(0, 0);
}
},
scrollBuildLog: throttle(function buildLogScrollDebounce() {
- const { scrollTop } = this.$refs.buildTrace;
- const { offsetHeight, scrollHeight } = this.$refs.buildTrace;
+ const { scrollTop } = this.$refs.buildJobLog;
+ const { offsetHeight, scrollHeight } = this.$refs.buildJobLog;
if (scrollTop + offsetHeight === scrollHeight) {
this.scrollPos = scrollPositions.bottom;
@@ -97,7 +97,7 @@ export default {
<scroll-button :disabled="isScrolledToBottom" direction="down" @click="scrollDown" />
</div>
</div>
- <pre ref="buildTrace" class="build-trace mb-0 h-100 mr-3" @scroll="scrollBuildLog">
+ <pre ref="buildJobLog" class="build-log mb-0 h-100 mr-3" @scroll="scrollBuildLog">
<code
v-show="!detailJob.isLoading"
class="bash"
diff --git a/app/assets/javascripts/ide/components/preview/navigator.vue b/app/assets/javascripts/ide/components/preview/navigator.vue
index 838c363a6a3..96f9a85c23f 100644
--- a/app/assets/javascripts/ide/components/preview/navigator.vue
+++ b/app/assets/javascripts/ide/components/preview/navigator.vue
@@ -117,7 +117,7 @@ export default {
class="ide-navigator-btn d-flex align-items-center d-transparent border-0 bg-transparent"
@click="refresh"
>
- <gl-icon :size="18" name="retry" use-deprecated-sizes class="m-auto" />
+ <gl-icon :size="16" name="retry" class="m-auto" />
</button>
<div class="position-relative w-100 gl-ml-2">
<input
diff --git a/app/assets/javascripts/ide/stores/modules/commit/getters.js b/app/assets/javascripts/ide/stores/modules/commit/getters.js
index f5e367e16f5..05e3601f381 100644
--- a/app/assets/javascripts/ide/stores/modules/commit/getters.js
+++ b/app/assets/javascripts/ide/stores/modules/commit/getters.js
@@ -1,14 +1,13 @@
-import { sprintf, n__, __ } from '../../../../locale';
+import { __ } from '../../../../locale';
import { COMMIT_TO_NEW_BRANCH } from './constants';
const BRANCH_SUFFIX_COUNT = 5;
const createTranslatedTextForFiles = (files, text) => {
if (!files.length) return null;
- return sprintf(n__('%{text} %{files}', '%{text} %{files} files', files.length), {
- files: files.reduce((acc, val) => acc.concat(val.path), []).join(', '),
- text,
- });
+ const filesPart = files.reduce((acc, val) => acc.concat(val.path), []).join(', ');
+
+ return `${text} ${filesPart}`;
};
export const discardDraftButtonDisabled = (state) =>
diff --git a/app/assets/javascripts/ide/stores/modules/pipelines/actions.js b/app/assets/javascripts/ide/stores/modules/pipelines/actions.js
index 60561292c9d..9cf8d5a360e 100644
--- a/app/assets/javascripts/ide/stores/modules/pipelines/actions.js
+++ b/app/assets/javascripts/ide/stores/modules/pipelines/actions.js
@@ -139,6 +139,7 @@ export const receiveJobLogsSuccess = ({ commit }, data) =>
export const fetchJobLogs = ({ dispatch, state }) => {
dispatch('requestJobLogs');
+ // update trace endpoint once BE compeletes trace re-naming in #340626
return axios
.get(`${state.detailJob.path}/trace`, { params: { format: 'json' } })
.then(({ data }) => dispatch('receiveJobLogsSuccess', data))
diff --git a/app/assets/javascripts/ide/stores/utils.js b/app/assets/javascripts/ide/stores/utils.js
index 0cef3b98e61..ec661fdb0d6 100644
--- a/app/assets/javascripts/ide/stores/utils.js
+++ b/app/assets/javascripts/ide/stores/utils.js
@@ -117,7 +117,7 @@ export const createCommitPayload = ({
action: commitActionForFile(f),
file_path: f.path,
previous_path: f.prevPath || undefined,
- content: f.prevPath && !f.changed ? null : content || undefined,
+ content: content || undefined,
encoding: isBlob ? 'base64' : 'text',
last_commit_id: newBranch || f.deleted || f.prevPath ? undefined : f.lastCommitSha,
};
diff --git a/app/assets/javascripts/import_entities/components/pagination_bar.vue b/app/assets/javascripts/import_entities/components/pagination_bar.vue
new file mode 100644
index 00000000000..33bd3e08bb1
--- /dev/null
+++ b/app/assets/javascripts/import_entities/components/pagination_bar.vue
@@ -0,0 +1,90 @@
+<script>
+import { GlDropdown, GlDropdownItem, GlIcon, GlSprintf } from '@gitlab/ui';
+import { __ } from '~/locale';
+import PaginationLinks from '~/vue_shared/components/pagination_links.vue';
+
+const DEFAULT_PAGE_SIZES = [20, 50, 100];
+
+export default {
+ components: {
+ PaginationLinks,
+ GlDropdown,
+ GlDropdownItem,
+ GlIcon,
+ GlSprintf,
+ },
+ props: {
+ pageInfo: {
+ required: true,
+ type: Object,
+ },
+ pageSizes: {
+ required: false,
+ type: Array,
+ default: () => DEFAULT_PAGE_SIZES,
+ },
+ itemsCount: {
+ required: true,
+ type: Number,
+ },
+ },
+
+ computed: {
+ humanizedTotal() {
+ return this.pageInfo.total >= 1000 ? __('1000+') : this.pageInfo.total;
+ },
+
+ paginationInfo() {
+ const { page, perPage } = this.pageInfo;
+ const start = (page - 1) * perPage + 1;
+ const end = start + this.itemsCount - 1;
+
+ return { start, end };
+ },
+ },
+
+ methods: {
+ setPage(page) {
+ this.$emit('set-page', page);
+ },
+ },
+};
+</script>
+
+<template>
+ <div class="gl-display-flex gl-align-items-center">
+ <pagination-links :change="setPage" :page-info="pageInfo" class="gl-m-0" />
+ <gl-dropdown category="tertiary" class="gl-ml-auto">
+ <template #button-content>
+ <span class="gl-font-weight-bold">
+ <gl-sprintf :message="__('%{count} items per page')">
+ <template #count>
+ {{ pageInfo.perPage }}
+ </template>
+ </gl-sprintf>
+ </span>
+ <gl-icon class="gl-button-icon dropdown-chevron" name="chevron-down" />
+ </template>
+ <gl-dropdown-item v-for="size in pageSizes" :key="size" @click="$emit('set-page-size', size)">
+ <gl-sprintf :message="__('%{count} items per page')">
+ <template #count>
+ {{ size }}
+ </template>
+ </gl-sprintf>
+ </gl-dropdown-item>
+ </gl-dropdown>
+ <div class="gl-ml-2" data-testid="information">
+ <gl-sprintf :message="s__('BulkImport|Showing %{start}-%{end} of %{total}')">
+ <template #start>
+ {{ paginationInfo.start }}
+ </template>
+ <template #end>
+ {{ paginationInfo.end }}
+ </template>
+ <template #total>
+ {{ humanizedTotal }}
+ </template>
+ </gl-sprintf>
+ </div>
+ </div>
+</template>
diff --git a/app/assets/javascripts/integrations/constants.js b/app/assets/javascripts/integrations/constants.js
new file mode 100644
index 00000000000..8a8d38b295c
--- /dev/null
+++ b/app/assets/javascripts/integrations/constants.js
@@ -0,0 +1,23 @@
+import { s__ } from '~/locale';
+
+export const TEST_INTEGRATION_EVENT = 'testIntegration';
+export const SAVE_INTEGRATION_EVENT = 'saveIntegration';
+export const GET_JIRA_ISSUE_TYPES_EVENT = 'getJiraIssueTypes';
+export const TOGGLE_INTEGRATION_EVENT = 'toggleIntegration';
+export const VALIDATE_INTEGRATION_FORM_EVENT = 'validateIntegrationForm';
+
+export const integrationLevels = {
+ GROUP: 'group',
+ INSTANCE: 'instance',
+};
+
+export const defaultIntegrationLevel = integrationLevels.INSTANCE;
+
+export const overrideDropdownDescriptions = {
+ [integrationLevels.GROUP]: s__(
+ 'Integrations|Default settings are inherited from the group level.',
+ ),
+ [integrationLevels.INSTANCE]: s__(
+ 'Integrations|Default settings are inherited from the instance level.',
+ ),
+};
diff --git a/app/assets/javascripts/integrations/edit/components/active_checkbox.vue b/app/assets/javascripts/integrations/edit/components/active_checkbox.vue
index f7d7f4aa010..9804a9e15f6 100644
--- a/app/assets/javascripts/integrations/edit/components/active_checkbox.vue
+++ b/app/assets/javascripts/integrations/edit/components/active_checkbox.vue
@@ -1,6 +1,7 @@
<script>
import { GlFormGroup, GlFormCheckbox } from '@gitlab/ui';
import { mapGetters } from 'vuex';
+import { TOGGLE_INTEGRATION_EVENT } from '~/integrations/constants';
import eventHub from '../event_hub';
export default {
@@ -26,7 +27,7 @@ export default {
},
methods: {
onChange(e) {
- eventHub.$emit('toggle', e);
+ eventHub.$emit(TOGGLE_INTEGRATION_EVENT, e);
},
},
};
diff --git a/app/assets/javascripts/integrations/edit/components/dynamic_field.vue b/app/assets/javascripts/integrations/edit/components/dynamic_field.vue
index 1fd4083b920..f30298676df 100644
--- a/app/assets/javascripts/integrations/edit/components/dynamic_field.vue
+++ b/app/assets/javascripts/integrations/edit/components/dynamic_field.vue
@@ -9,6 +9,7 @@ import {
} from '@gitlab/ui';
import { capitalize, lowerCase, isEmpty } from 'lodash';
import { mapGetters } from 'vuex';
+import { VALIDATE_INTEGRATION_FORM_EVENT } from '~/integrations/constants';
import eventHub from '../event_hub';
export default {
@@ -121,10 +122,10 @@ export default {
if (this.isNonEmptyPassword) {
this.model = null;
}
- eventHub.$on('validateForm', this.validateForm);
+ eventHub.$on(VALIDATE_INTEGRATION_FORM_EVENT, this.validateForm);
},
beforeDestroy() {
- eventHub.$off('validateForm', this.validateForm);
+ eventHub.$off(VALIDATE_INTEGRATION_FORM_EVENT, this.validateForm);
},
methods: {
validateForm() {
diff --git a/app/assets/javascripts/integrations/edit/components/integration_form.vue b/app/assets/javascripts/integrations/edit/components/integration_form.vue
index 63f007170d0..ba1aeb28616 100644
--- a/app/assets/javascripts/integrations/edit/components/integration_form.vue
+++ b/app/assets/javascripts/integrations/edit/components/integration_form.vue
@@ -2,7 +2,11 @@
import { GlButton, GlModalDirective, GlSafeHtmlDirective as SafeHtml } from '@gitlab/ui';
import { mapState, mapActions, mapGetters } from 'vuex';
import glFeatureFlagsMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
-import { integrationLevels } from '../constants';
+import {
+ TEST_INTEGRATION_EVENT,
+ SAVE_INTEGRATION_EVENT,
+ integrationLevels,
+} from '~/integrations/constants';
import eventHub from '../event_hub';
import ActiveCheckbox from './active_checkbox.vue';
@@ -75,11 +79,11 @@ export default {
]),
onSaveClick() {
this.setIsSaving(true);
- eventHub.$emit('saveIntegration');
+ eventHub.$emit(SAVE_INTEGRATION_EVENT);
},
onTestClick() {
this.setIsTesting(true);
- eventHub.$emit('testIntegration');
+ eventHub.$emit(TEST_INTEGRATION_EVENT);
},
onResetClick() {
this.fetchResetIntegration();
diff --git a/app/assets/javascripts/integrations/edit/components/jira_issues_fields.vue b/app/assets/javascripts/integrations/edit/components/jira_issues_fields.vue
index 1242493fb57..0521e1eeea5 100644
--- a/app/assets/javascripts/integrations/edit/components/jira_issues_fields.vue
+++ b/app/assets/javascripts/integrations/edit/components/jira_issues_fields.vue
@@ -1,6 +1,10 @@
<script>
import { GlFormGroup, GlFormCheckbox, GlFormInput, GlSprintf, GlLink } from '@gitlab/ui';
import { mapGetters } from 'vuex';
+import {
+ VALIDATE_INTEGRATION_FORM_EVENT,
+ GET_JIRA_ISSUE_TYPES_EVENT,
+} from '~/integrations/constants';
import eventHub from '../event_hub';
import JiraUpgradeCta from './jira_upgrade_cta.vue';
@@ -77,17 +81,17 @@ export default {
},
},
created() {
- eventHub.$on('validateForm', this.validateForm);
+ eventHub.$on(VALIDATE_INTEGRATION_FORM_EVENT, this.validateForm);
},
beforeDestroy() {
- eventHub.$off('validateForm', this.validateForm);
+ eventHub.$off(VALIDATE_INTEGRATION_FORM_EVENT, this.validateForm);
},
methods: {
validateForm() {
this.validated = true;
},
getJiraIssueTypes() {
- eventHub.$emit('getJiraIssueTypes');
+ eventHub.$emit(GET_JIRA_ISSUE_TYPES_EVENT);
},
},
};
diff --git a/app/assets/javascripts/integrations/edit/components/jira_trigger_fields.vue b/app/assets/javascripts/integrations/edit/components/jira_trigger_fields.vue
index 1cc5a185f03..249a3e105b1 100644
--- a/app/assets/javascripts/integrations/edit/components/jira_trigger_fields.vue
+++ b/app/assets/javascripts/integrations/edit/components/jira_trigger_fields.vue
@@ -9,6 +9,7 @@ import {
} from '@gitlab/ui';
import { mapGetters } from 'vuex';
import { helpPagePath } from '~/helpers/help_page_helper';
+import { VALIDATE_INTEGRATION_FORM_EVENT } from '~/integrations/constants';
import { s__ } from '~/locale';
import eventHub from '../event_hub';
@@ -118,10 +119,10 @@ export default {
},
},
created() {
- eventHub.$on('validateForm', this.validateForm);
+ eventHub.$on(VALIDATE_INTEGRATION_FORM_EVENT, this.validateForm);
},
beforeDestroy() {
- eventHub.$off('validateForm', this.validateForm);
+ eventHub.$off(VALIDATE_INTEGRATION_FORM_EVENT, this.validateForm);
},
methods: {
validateForm() {
diff --git a/app/assets/javascripts/integrations/edit/components/override_dropdown.vue b/app/assets/javascripts/integrations/edit/components/override_dropdown.vue
index 7b3a067b186..63650400bb7 100644
--- a/app/assets/javascripts/integrations/edit/components/override_dropdown.vue
+++ b/app/assets/javascripts/integrations/edit/components/override_dropdown.vue
@@ -2,7 +2,7 @@
import { GlDropdown, GlDropdownItem, GlLink } from '@gitlab/ui';
import { mapState } from 'vuex';
import { s__ } from '~/locale';
-import { defaultIntegrationLevel, overrideDropdownDescriptions } from '../constants';
+import { defaultIntegrationLevel, overrideDropdownDescriptions } from '~/integrations/constants';
const dropdownOptions = [
{
diff --git a/app/assets/javascripts/integrations/edit/constants.js b/app/assets/javascripts/integrations/edit/constants.js
deleted file mode 100644
index b74ae209eb7..00000000000
--- a/app/assets/javascripts/integrations/edit/constants.js
+++ /dev/null
@@ -1,17 +0,0 @@
-import { s__ } from '~/locale';
-
-export const integrationLevels = {
- GROUP: 'group',
- INSTANCE: 'instance',
-};
-
-export const defaultIntegrationLevel = integrationLevels.INSTANCE;
-
-export const overrideDropdownDescriptions = {
- [integrationLevels.GROUP]: s__(
- 'Integrations|Default settings are inherited from the group level.',
- ),
- [integrationLevels.INSTANCE]: s__(
- 'Integrations|Default settings are inherited from the instance level.',
- ),
-};
diff --git a/app/assets/javascripts/integrations/integration_settings_form.js b/app/assets/javascripts/integrations/integration_settings_form.js
index 801cf3ed27e..f33364d5545 100644
--- a/app/assets/javascripts/integrations/integration_settings_form.js
+++ b/app/assets/javascripts/integrations/integration_settings_form.js
@@ -1,20 +1,26 @@
-import $ from 'jquery';
import { delay } from 'lodash';
import { __, s__ } from '~/locale';
import toast from '~/vue_shared/plugins/global_toast';
import axios from '../lib/utils/axios_utils';
import initForm from './edit';
import eventHub from './edit/event_hub';
+import {
+ TEST_INTEGRATION_EVENT,
+ SAVE_INTEGRATION_EVENT,
+ GET_JIRA_ISSUE_TYPES_EVENT,
+ TOGGLE_INTEGRATION_EVENT,
+ VALIDATE_INTEGRATION_FORM_EVENT,
+} from './constants';
export default class IntegrationSettingsForm {
constructor(formSelector) {
- this.$form = $(formSelector);
+ this.$form = document.querySelector(formSelector);
this.formActive = false;
this.vue = null;
// Form Metadata
- this.testEndPoint = this.$form.data('testUrl');
+ this.testEndPoint = this.$form.dataset.testUrl;
}
init() {
@@ -23,22 +29,19 @@ export default class IntegrationSettingsForm {
document.querySelector('.js-vue-integration-settings'),
document.querySelector('.js-vue-default-integration-settings'),
);
- eventHub.$on('toggle', (active) => {
+ eventHub.$on(TOGGLE_INTEGRATION_EVENT, (active) => {
this.formActive = active;
this.toggleServiceState();
});
- eventHub.$on('testIntegration', () => {
+ eventHub.$on(TEST_INTEGRATION_EVENT, () => {
this.testIntegration();
});
- eventHub.$on('saveIntegration', () => {
+ eventHub.$on(SAVE_INTEGRATION_EVENT, () => {
this.saveIntegration();
});
- eventHub.$on('getJiraIssueTypes', () => {
- // eslint-disable-next-line no-jquery/no-serialize
- this.getJiraIssueTypes(this.$form.serialize());
+ eventHub.$on(GET_JIRA_ISSUE_TYPES_EVENT, () => {
+ this.getJiraIssueTypes(new FormData(this.$form));
});
-
- eventHub.$emit('formInitialized');
}
saveIntegration() {
@@ -47,14 +50,14 @@ export default class IntegrationSettingsForm {
// 2) If this service can be saved
// If both conditions are true, we override form submission
// and save the service using provided configuration.
- const formValid = this.$form.get(0).checkValidity() || this.formActive === false;
+ const formValid = this.$form.checkValidity() || this.formActive === false;
if (formValid) {
delay(() => {
- this.$form.trigger('submit');
+ this.$form.submit();
}, 100);
} else {
- eventHub.$emit('validateForm');
+ eventHub.$emit(VALIDATE_INTEGRATION_FORM_EVENT);
this.vue.$store.dispatch('setIsSaving', false);
}
}
@@ -65,11 +68,10 @@ export default class IntegrationSettingsForm {
// 2) If this service can be tested
// If both conditions are true, we override form submission
// and test the service using provided configuration.
- if (this.$form.get(0).checkValidity()) {
- // eslint-disable-next-line no-jquery/no-serialize
- this.testSettings(this.$form.serialize());
+ if (this.$form.checkValidity()) {
+ this.testSettings(new FormData(this.$form));
} else {
- eventHub.$emit('validateForm');
+ eventHub.$emit(VALIDATE_INTEGRATION_FORM_EVENT);
this.vue.$store.dispatch('setIsTesting', false);
}
}
@@ -79,9 +81,9 @@ export default class IntegrationSettingsForm {
*/
toggleServiceState() {
if (this.formActive) {
- this.$form.removeAttr('novalidate');
- } else if (!this.$form.attr('novalidate')) {
- this.$form.attr('novalidate', 'novalidate');
+ this.$form.removeAttribute('novalidate');
+ } else if (!this.$form.getAttribute('novalidate')) {
+ this.$form.setAttribute('novalidate', 'novalidate');
}
}
@@ -109,7 +111,7 @@ export default class IntegrationSettingsForm {
},
}) => {
if (error || !issuetypes?.length) {
- eventHub.$emit('validateForm');
+ eventHub.$emit(VALIDATE_INTEGRATION_FORM_EVENT);
throw new Error(message);
}
diff --git a/app/assets/javascripts/integrations/overrides/components/integration_overrides.vue b/app/assets/javascripts/integrations/overrides/components/integration_overrides.vue
index 707ac946b98..85018f133cb 100644
--- a/app/assets/javascripts/integrations/overrides/components/integration_overrides.vue
+++ b/app/assets/javascripts/integrations/overrides/components/integration_overrides.vue
@@ -1,8 +1,8 @@
<script>
-import { GlLink, GlLoadingIcon, GlPagination, GlTable } from '@gitlab/ui';
+import { GlLink, GlLoadingIcon, GlPagination, GlTable, GlAlert } from '@gitlab/ui';
+import * as Sentry from '@sentry/browser';
import { DEFAULT_PER_PAGE } from '~/api';
-import createFlash from '~/flash';
import { fetchOverrides } from '~/integrations/overrides/api';
import { parseIntPagination, normalizeHeaders } from '~/lib/utils/common_utils';
import { truncateNamespace } from '~/lib/utils/text_utility';
@@ -16,6 +16,7 @@ export default {
GlLoadingIcon,
GlPagination,
GlTable,
+ GlAlert,
ProjectAvatar,
},
props: {
@@ -36,6 +37,7 @@ export default {
overrides: [],
page: 1,
totalItems: 0,
+ errorMessage: null,
};
},
computed: {
@@ -49,6 +51,7 @@ export default {
methods: {
loadOverrides(page = this.page) {
this.isLoading = true;
+ this.errorMessage = null;
fetchOverrides(this.overridesPath, {
page,
@@ -61,11 +64,9 @@ export default {
this.overrides = data;
})
.catch((error) => {
- createFlash({
- message: this.$options.i18n.defaultErrorMessage,
- error,
- captureError: true,
- });
+ this.errorMessage = this.$options.i18n.defaultErrorMessage;
+
+ Sentry.captureException(error);
})
.finally(() => {
this.isLoading = false;
@@ -85,7 +86,11 @@ export default {
<template>
<div>
+ <gl-alert v-if="errorMessage" variant="danger" :dismissible="false">
+ {{ errorMessage }}
+ </gl-alert>
<gl-table
+ v-else
:items="overrides"
:fields="$options.fields"
:busy="isLoading"
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 ab42e8cdfeb..cd0b413265b 100644
--- a/app/assets/javascripts/invite_members/components/invite_members_modal.vue
+++ b/app/assets/javascripts/invite_members/components/invite_members_modal.vue
@@ -11,9 +11,10 @@ import {
GlFormInput,
GlFormCheckboxGroup,
} from '@gitlab/ui';
-import { partition, isString } from 'lodash';
+import { partition, isString, unescape } from 'lodash';
import Api from '~/api';
import ExperimentTracking from '~/experimentation/experiment_tracking';
+import { sanitize } from '~/lib/dompurify';
import { BV_SHOW_MODAL } from '~/lib/utils/constants';
import { s__, sprintf } from '~/locale';
import {
@@ -293,7 +294,7 @@ export default {
};
},
conditionallyShowToastSuccess(response) {
- const message = responseMessageFromSuccess(response);
+ const message = this.unescapeMsg(responseMessageFromSuccess(response));
if (message === '') {
this.showToastMessageSuccess();
@@ -309,13 +310,17 @@ export default {
this.closeModal();
},
showInvalidFeedbackMessage(response) {
+ const message = this.unescapeMsg(responseMessageFromError(response));
+
this.isLoading = false;
- this.invalidFeedbackMessage =
- responseMessageFromError(response) || this.$options.labels.invalidFeedbackMessageDefault;
+ this.invalidFeedbackMessage = message || this.$options.labels.invalidFeedbackMessageDefault;
},
handleMembersTokenSelectClear() {
this.invalidFeedbackMessage = '';
},
+ unescapeMsg(message) {
+ return unescape(sanitize(message, { ALLOWED_TAGS: [] }));
+ },
},
labels: {
members: {
diff --git a/app/assets/javascripts/invite_members/utils/response_message_parser.js b/app/assets/javascripts/invite_members/utils/response_message_parser.js
index b7bc9ea5652..52ec3be3205 100644
--- a/app/assets/javascripts/invite_members/utils/response_message_parser.js
+++ b/app/assets/javascripts/invite_members/utils/response_message_parser.js
@@ -18,7 +18,10 @@ function responseMessageStringForMultiple(message) {
return message.includes(':');
}
function responseMessageStringFirstPart(message) {
- return message.split(' and ')[0];
+ const firstPart = message.split(':')[1];
+ const firstMsg = firstPart.split(/ and [\w-]*$/)[0].trim();
+
+ return firstMsg;
}
export function responseMessageFromError(response) {
diff --git a/app/assets/javascripts/issuable/components/csv_export_modal.vue b/app/assets/javascripts/issuable/components/csv_export_modal.vue
index 1c88f8dfdca..b0af3612e05 100644
--- a/app/assets/javascripts/issuable/components/csv_export_modal.vue
+++ b/app/assets/javascripts/issuable/components/csv_export_modal.vue
@@ -1,9 +1,14 @@
<script>
import { GlButton, GlModal, GlSprintf, GlIcon } from '@gitlab/ui';
+import { __, n__ } from '~/locale';
import { ISSUABLE_TYPE } from '../constants';
export default {
- name: 'CsvExportModal',
+ i18n: {
+ exportText: __(
+ 'The CSV export will be created in the background. Once finished, it will be sent to %{email} in an attachment.',
+ ),
+ },
components: {
GlButton,
GlModal,
@@ -32,53 +37,39 @@ export default {
required: true,
},
},
- data() {
- return {
- // eslint-disable-next-line @gitlab/require-i18n-strings
- issuableName: this.issuableType === ISSUABLE_TYPE.issues ? 'issues' : 'merge requests',
- };
+ computed: {
+ isIssue() {
+ return this.issuableType === ISSUABLE_TYPE.issues;
+ },
+ exportText() {
+ return this.isIssue ? __('Export issues') : __('Export merge requests');
+ },
+ issuableCountText() {
+ return this.isIssue
+ ? n__('1 issue selected', '%d issues selected', this.issuableCount)
+ : n__('1 merge request selected', '%d merge requests selected', this.issuableCount);
+ },
},
- issueableType: ISSUABLE_TYPE,
};
</script>
<template>
- <gl-modal :modal-id="modalId" body-class="gl-p-0!" data-qa-selector="export_issuable_modal">
- <template #modal-title>
- <gl-sprintf :message="__('Export %{name}')">
- <template #name>{{ issuableName }}</template>
- </gl-sprintf>
- </template>
+ <gl-modal
+ :modal-id="modalId"
+ body-class="gl-p-0!"
+ :title="exportText"
+ data-qa-selector="export_issuable_modal"
+ >
<div
- v-if="issuableCount > -1"
class="gl-justify-content-start gl-align-items-center gl-p-4 gl-border-b-solid gl-border-1 gl-border-gray-50"
>
<gl-icon name="check" class="gl-color-green-400" />
- <strong class="gl-m-3">
- <gl-sprintf
- v-if="issuableType === $options.issueableType.issues"
- :message="n__('1 issue selected', '%d issues selected', issuableCount)"
- >
- <template #issuableCount>{{ issuableCount }}</template>
- </gl-sprintf>
- <gl-sprintf
- v-else
- :message="n__('1 merge request selected', '%d merge requests selected', issuableCount)"
- >
- <template #issuableCount>{{ issuableCount }}</template>
- </gl-sprintf>
- </strong>
+ <strong class="gl-m-3">{{ issuableCountText }}</strong>
</div>
<div class="modal-text gl-px-4 gl-py-5">
- <gl-sprintf
- :message="
- __(
- `The CSV export will be created in the background. Once finished, it will be sent to %{strongStart}${email}%{strongEnd} in an attachment.`,
- )
- "
- >
- <template #strong="{ content }">
- <strong>{{ content }}</strong>
+ <gl-sprintf :message="$options.i18n.exportText">
+ <template #email>
+ <strong>{{ email }}</strong>
</template>
</gl-sprintf>
</div>
@@ -92,9 +83,7 @@ export default {
data-track-action="click_button"
:data-track-label="`export_${issuableType}_csv`"
>
- <gl-sprintf :message="__('Export %{name}')">
- <template #name>{{ issuableName }}</template>
- </gl-sprintf>
+ {{ exportText }}
</gl-button>
</template>
</gl-modal>
diff --git a/app/assets/javascripts/issuable/components/csv_import_export_buttons.vue b/app/assets/javascripts/issuable/components/csv_import_export_buttons.vue
index 4fdd094072c..269f720bac9 100644
--- a/app/assets/javascripts/issuable/components/csv_import_export_buttons.vue
+++ b/app/assets/javascripts/issuable/components/csv_import_export_buttons.vue
@@ -15,6 +15,8 @@ import CsvImportModal from './csv_import_modal.vue';
export default {
i18n: {
exportAsCsvButtonText: __('Export as CSV'),
+ importCsvText: __('Import CSV'),
+ importFromJiraText: __('Import from Jira'),
importIssuesText: __('Import issues'),
},
name: 'CsvImportExportButtons',
@@ -101,13 +103,16 @@ export default {
:text-sr-only="!showLabel"
:icon="importButtonIcon"
>
- <gl-dropdown-item v-gl-modal="importModalId">{{ __('Import CSV') }}</gl-dropdown-item>
+ <gl-dropdown-item v-gl-modal="importModalId">
+ {{ $options.i18n.importCsvText }}
+ </gl-dropdown-item>
<gl-dropdown-item
v-if="canEdit"
:href="projectImportJiraPath"
data-qa-selector="import_from_jira_link"
- >{{ __('Import from Jira') }}</gl-dropdown-item
>
+ {{ $options.i18n.importFromJiraText }}
+ </gl-dropdown-item>
</gl-dropdown>
</gl-button-group>
<csv-export-modal
diff --git a/app/assets/javascripts/issuable/components/csv_import_modal.vue b/app/assets/javascripts/issuable/components/csv_import_modal.vue
index c85efd60b8b..b72abe14ee1 100644
--- a/app/assets/javascripts/issuable/components/csv_import_modal.vue
+++ b/app/assets/javascripts/issuable/components/csv_import_modal.vue
@@ -1,23 +1,28 @@
<script>
-import { GlModal, GlSprintf, GlFormGroup, GlButton } from '@gitlab/ui';
+import { GlModal, GlFormGroup } from '@gitlab/ui';
import csrf from '~/lib/utils/csrf';
-import { ISSUABLE_TYPE } from '../constants';
+import { __, sprintf } from '~/locale';
export default {
- name: 'CsvImportModal',
+ i18n: {
+ maximumFileSizeText: __('The maximum file size allowed is %{size}.'),
+ importIssuesText: __('Import issues'),
+ uploadCsvFileText: __('Upload CSV file'),
+ mainText: __(
+ "Your issues will be imported in the background. Once finished, you'll get a confirmation email.",
+ ),
+ helpText: __(
+ 'It must have a header row and at least two columns: the first column is the issue title and the second column is the issue description. The separator is automatically detected.',
+ ),
+ },
+ actionPrimary: {
+ text: __('Import issues'),
+ },
components: {
GlModal,
- GlSprintf,
GlFormGroup,
- GlButton,
},
inject: {
- issuableType: {
- default: '',
- },
- exportCsvPath: {
- default: '',
- },
importCsvIssuesPath: {
default: '',
},
@@ -31,11 +36,10 @@ export default {
required: true,
},
},
- data() {
- return {
- // eslint-disable-next-line @gitlab/require-i18n-strings
- issuableName: this.issuableType === ISSUABLE_TYPE.issues ? 'issues' : 'merge requests',
- };
+ computed: {
+ maxFileSizeText() {
+ return sprintf(this.$options.i18n.maximumFileSizeText, { size: this.maxAttachmentSize });
+ },
},
methods: {
submitForm() {
@@ -47,34 +51,22 @@ export default {
</script>
<template>
- <gl-modal :modal-id="modalId" :title="__('Import issues')">
+ <gl-modal
+ :modal-id="modalId"
+ :title="$options.i18n.importIssuesText"
+ :action-primary="$options.actionPrimary"
+ @primary="submitForm"
+ >
<form ref="form" :action="importCsvIssuesPath" enctype="multipart/form-data" method="post">
<input :value="$options.csrf.token" type="hidden" name="authenticity_token" />
- <p>
- {{
- __(
- "Your issues will be imported in the background. Once finished, you'll get a confirmation email.",
- )
- }}
- </p>
- <gl-form-group :label="__('Upload CSV file')" label-for="file">
+ <p>{{ $options.i18n.mainText }}</p>
+ <gl-form-group :label="$options.i18n.uploadCsvFileText" label-for="file">
<input id="file" type="file" name="file" accept=".csv,text/csv" />
</gl-form-group>
<p class="text-secondary">
- {{
- __(
- 'It must have a header row and at least two columns: the first column is the issue title and the second column is the issue description. The separator is automatically detected.',
- )
- }}
- <gl-sprintf :message="__('The maximum file size allowed is %{size}.')"
- ><template #size>{{ maxAttachmentSize }}</template></gl-sprintf
- >
+ {{ $options.i18n.helpText }}
+ {{ maxFileSizeText }}
</p>
</form>
- <template #modal-footer>
- <gl-button category="primary" variant="confirm" @click="submitForm">{{
- __('Import issues')
- }}</gl-button>
- </template>
</gl-modal>
</template>
diff --git a/app/assets/javascripts/issuable_form.js b/app/assets/javascripts/issuable_form.js
index 5dc49d3ae15..bafc26befda 100644
--- a/app/assets/javascripts/issuable_form.js
+++ b/app/assets/javascripts/issuable_form.js
@@ -50,20 +50,16 @@ export default class IssuableForm {
this.renderWipExplanation = this.renderWipExplanation.bind(this);
this.resetAutosave = this.resetAutosave.bind(this);
this.handleSubmit = this.handleSubmit.bind(this);
- /* eslint-disable @gitlab/require-i18n-strings */
// prettier-ignore
this.draftRegex = new RegExp(
'^\\s*(' + // Line start, then any amount of leading whitespace
- 'draft\\s-\\s' + // Draft_-_ where "_" are *exactly* one whitespace
- '|\\[draft\\]\\s*' + // [Draft] and any following whitespace
+ '\\[draft\\]\\s*' + // [Draft] and any following whitespace
'|draft:\\s*' + // Draft: and any following whitespace
- '|draft\\s+' + // Draft_ where "_" is at least one whitespace
'|\\(draft\\)\\s*' + // (Draft) and any following whitespace
')+' + // At least one repeated match of the preceding parenthetical
'\\s*', // Any amount of trailing whitespace
'i', // Match any case(s)
);
- /* eslint-enable @gitlab/require-i18n-strings */
this.gfmAutoComplete = new GfmAutoComplete(
gl.GfmAutoComplete && gl.GfmAutoComplete.dataSources,
diff --git a/app/assets/javascripts/issuable_list/components/issuable_item.vue b/app/assets/javascripts/issuable_list/components/issuable_item.vue
index df9d5c86a4b..ab04c6a38a5 100644
--- a/app/assets/javascripts/issuable_list/components/issuable_item.vue
+++ b/app/assets/javascripts/issuable_list/components/issuable_item.vue
@@ -1,5 +1,5 @@
<script>
-import { GlLink, GlIcon, GlLabel, GlFormCheckbox, GlTooltipDirective } from '@gitlab/ui';
+import { GlLink, GlIcon, GlLabel, GlFormCheckbox, GlSprintf, GlTooltipDirective } from '@gitlab/ui';
import { getIdFromGraphQLId } from '~/graphql_shared/utils';
import { isScopedLabel } from '~/lib/utils/common_utils';
@@ -15,6 +15,7 @@ export default {
GlIcon,
GlLabel,
GlFormCheckbox,
+ GlSprintf,
IssuableAssignees,
},
directives: {
@@ -82,9 +83,7 @@ export default {
return this.issuable.assignees?.nodes || this.issuable.assignees || [];
},
createdAt() {
- return sprintf(__('created %{timeAgo}'), {
- timeAgo: getTimeago().format(this.issuable.createdAt),
- });
+ return getTimeago().format(this.issuable.createdAt);
},
updatedAt() {
return sprintf(__('updated %{timeAgo}'), {
@@ -164,132 +163,132 @@ export default {
<template>
<li
:id="`issuable_${issuableId}`"
- class="issue gl-px-5!"
+ class="issue gl-display-flex! gl-px-5!"
:class="{ closed: issuable.closedAt, today: createdInPastDay }"
:data-labels="labelIdsString"
>
- <div class="issuable-info-container">
- <div v-if="showCheckbox" class="issue-check">
- <gl-form-checkbox
- class="gl-mr-0"
- :checked="checked"
- :data-id="issuableId"
- @input="$emit('checked-input', $event)"
+ <gl-form-checkbox
+ v-if="showCheckbox"
+ class="issue-check gl-mr-0"
+ :checked="checked"
+ :data-id="issuableId"
+ @input="$emit('checked-input', $event)"
+ >
+ <span class="gl-sr-only">{{ issuable.title }}</span>
+ </gl-form-checkbox>
+ <div class="issuable-main-info">
+ <div data-testid="issuable-title" class="issue-title title">
+ <gl-icon
+ v-if="issuable.confidential"
+ v-gl-tooltip
+ name="eye-slash"
+ :title="__('Confidential')"
+ :aria-label="__('Confidential')"
+ />
+ <gl-link class="issue-title-text" dir="auto" :href="webUrl" v-bind="issuableTitleProps">
+ {{ issuable.title }}
+ <gl-icon v-if="isIssuableUrlExternal" name="external-link" class="gl-ml-2" />
+ </gl-link>
+ <span
+ v-if="taskStatus"
+ class="task-status gl-display-none gl-sm-display-inline-block! gl-ml-3"
+ data-testid="task-status"
>
- <span class="gl-sr-only">{{ issuable.title }}</span>
- </gl-form-checkbox>
+ {{ taskStatus }}
+ </span>
</div>
- <div class="issuable-main-info">
- <div data-testid="issuable-title" class="issue-title title">
- <span class="issue-title-text" dir="auto">
- <gl-icon
- v-if="issuable.confidential"
- v-gl-tooltip
- name="eye-slash"
- :title="__('Confidential')"
- :aria-label="__('Confidential')"
- />
- <gl-link :href="webUrl" v-bind="issuableTitleProps">
- {{ issuable.title
- }}<gl-icon v-if="isIssuableUrlExternal" name="external-link" class="gl-ml-2"
- /></gl-link>
- </span>
- <span
- v-if="taskStatus"
- class="task-status gl-display-none gl-sm-display-inline-block! gl-ml-3"
- data-testid="task-status"
- >
- {{ taskStatus }}
- </span>
- </div>
- <div class="issuable-info">
- <slot v-if="hasSlotContents('reference')" name="reference"></slot>
- <span v-else data-testid="issuable-reference" class="issuable-reference">
- {{ reference }}
- </span>
- <span class="issuable-authored gl-display-none gl-sm-display-inline-block! gl-mr-3">
- <span aria-hidden="true">&middot;</span>
- <span
- v-gl-tooltip:tooltipcontainer.bottom
- data-testid="issuable-created-at"
- :title="tooltipTitle(issuable.createdAt)"
- >{{ createdAt }}</span
- >
- {{ __('by') }}
- <slot v-if="hasSlotContents('author')" name="author"></slot>
- <gl-link
- v-else
- :data-user-id="authorId"
- :data-username="author.username"
- :data-name="author.name"
- :data-avatar-url="author.avatarUrl"
- :href="author.webUrl"
- data-testid="issuable-author"
- class="author-link js-user-link"
- >
- <span class="author">{{ author.name }}</span>
- </gl-link>
+ <div class="issuable-info">
+ <slot v-if="hasSlotContents('reference')" name="reference"></slot>
+ <span v-else data-testid="issuable-reference" class="issuable-reference">
+ {{ reference }}
+ </span>
+ <span class="gl-display-none gl-sm-display-inline-block">
+ <span aria-hidden="true">&middot;</span>
+ <span class="issuable-authored gl-mr-3">
+ <gl-sprintf :message="__('created %{timeAgo} by %{author}')">
+ <template #timeAgo>
+ <span
+ v-gl-tooltip.bottom
+ :title="tooltipTitle(issuable.createdAt)"
+ data-testid="issuable-created-at"
+ >
+ {{ createdAt }}
+ </span>
+ </template>
+ <template #author>
+ <slot v-if="hasSlotContents('author')" name="author"></slot>
+ <gl-link
+ v-else
+ :data-user-id="authorId"
+ :data-username="author.username"
+ :data-name="author.name"
+ :data-avatar-url="author.avatarUrl"
+ :href="author.webUrl"
+ data-testid="issuable-author"
+ class="author-link js-user-link"
+ >
+ <span class="author">{{ author.name }}</span>
+ </gl-link>
+ </template>
+ </gl-sprintf>
</span>
<slot name="timeframe"></slot>
- &nbsp;
- <span v-if="labels.length" role="group" :aria-label="__('Labels')">
- <gl-label
- v-for="(label, index) in labels"
- :key="index"
- :background-color="label.color"
- :title="labelTitle(label)"
- :description="label.description"
- :scoped="scopedLabel(label)"
- :target="labelTarget(label)"
- :class="{ 'gl-ml-2': index }"
- size="sm"
- />
- </span>
- </div>
+ </span>
+ &nbsp;
+ <span v-if="labels.length" role="group" :aria-label="__('Labels')">
+ <gl-label
+ v-for="(label, index) in labels"
+ :key="index"
+ :background-color="label.color"
+ :title="labelTitle(label)"
+ :description="label.description"
+ :scoped="scopedLabel(label)"
+ :target="labelTarget(label)"
+ :class="{ 'gl-ml-2': index }"
+ size="sm"
+ />
+ </span>
</div>
- <div class="issuable-meta">
- <ul v-if="showIssuableMeta" class="controls">
- <li v-if="hasSlotContents('status')" class="issuable-status">
- <slot name="status"></slot>
- </li>
- <li v-if="assignees.length" class="gl-display-flex">
- <issuable-assignees
- :assignees="assignees"
- :icon-size="16"
- :max-visible="4"
- img-css-classes="gl-mr-2!"
- class="gl-align-items-center gl-display-flex gl-ml-3"
- />
- </li>
- <slot name="statistics"></slot>
- <li
- v-if="showDiscussions"
- data-testid="issuable-discussions"
- class="issuable-comments gl-display-none gl-sm-display-block"
- >
- <gl-link
- v-gl-tooltip:tooltipcontainer.top
- :title="__('Comments')"
- :href="issuableNotesLink"
- :class="{ 'no-comments': !notesCount }"
- class="gl-reset-color!"
- >
- <gl-icon name="comments" />
- {{ notesCount }}
- </gl-link>
- </li>
- </ul>
- <div
- data-testid="issuable-updated-at"
- class="float-right issuable-updated-at gl-display-none gl-sm-display-inline-block"
+ </div>
+ <div class="issuable-meta">
+ <ul v-if="showIssuableMeta" class="controls">
+ <li v-if="hasSlotContents('status')" class="issuable-status">
+ <slot name="status"></slot>
+ </li>
+ <li v-if="assignees.length">
+ <issuable-assignees
+ :assignees="assignees"
+ :icon-size="16"
+ :max-visible="4"
+ img-css-classes="gl-mr-2!"
+ class="gl-align-items-center gl-display-flex gl-ml-3"
+ />
+ </li>
+ <slot name="statistics"></slot>
+ <li
+ v-if="showDiscussions"
+ data-testid="issuable-discussions"
+ class="issuable-comments gl-display-none gl-sm-display-block"
>
- <span
- v-gl-tooltip:tooltipcontainer.bottom
- :title="tooltipTitle(issuable.updatedAt)"
- class="issuable-updated-at"
- >{{ updatedAt }}</span
+ <gl-link
+ v-gl-tooltip.top
+ :title="__('Comments')"
+ :href="issuableNotesLink"
+ :class="{ 'no-comments': !notesCount }"
+ class="gl-reset-color!"
>
- </div>
+ <gl-icon name="comments" />
+ {{ notesCount }}
+ </gl-link>
+ </li>
+ </ul>
+ <div
+ v-gl-tooltip.bottom
+ class="gl-text-gray-500 gl-display-none gl-sm-display-inline-block"
+ :title="tooltipTitle(issuable.updatedAt)"
+ data-testid="issuable-updated-at"
+ >
+ {{ updatedAt }}
</div>
</div>
</li>
diff --git a/app/assets/javascripts/issuable_list/components/issuable_list_root.vue b/app/assets/javascripts/issuable_list/components/issuable_list_root.vue
index 87066a0a0b6..c1082987146 100644
--- a/app/assets/javascripts/issuable_list/components/issuable_list_root.vue
+++ b/app/assets/javascripts/issuable_list/components/issuable_list_root.vue
@@ -284,72 +284,70 @@ export default {
<slot name="sidebar-items" :checked-issuables="bulkEditIssuables"></slot>
</template>
</issuable-bulk-edit-sidebar>
- <div class="issuables-holder">
- <ul v-if="issuablesLoading" class="content-list">
- <li v-for="n in skeletonItemCount" :key="n" class="issue gl-px-5! gl-py-5!">
- <gl-skeleton-loading />
- </li>
- </ul>
- <template v-else>
- <component
- :is="issuablesWrapper"
- v-if="issuables.length > 0"
- class="content-list issuable-list issues-list"
- :class="{ 'manual-ordering': isManualOrdering }"
- v-bind="$options.vueDraggableAttributes"
- @update="handleVueDraggableUpdate"
+ <ul v-if="issuablesLoading" class="content-list">
+ <li v-for="n in skeletonItemCount" :key="n" class="issue gl-px-5! gl-py-5!">
+ <gl-skeleton-loading />
+ </li>
+ </ul>
+ <template v-else>
+ <component
+ :is="issuablesWrapper"
+ v-if="issuables.length > 0"
+ class="content-list issuable-list issues-list"
+ :class="{ 'manual-ordering': isManualOrdering }"
+ v-bind="$options.vueDraggableAttributes"
+ @update="handleVueDraggableUpdate"
+ >
+ <issuable-item
+ v-for="issuable in issuables"
+ :key="issuableId(issuable)"
+ :class="{ 'gl-cursor-grab': isManualOrdering }"
+ :issuable-symbol="issuableSymbol"
+ :issuable="issuable"
+ :enable-label-permalinks="enableLabelPermalinks"
+ :label-filter-param="labelFilterParam"
+ :show-checkbox="showBulkEditSidebar"
+ :checked="issuableChecked(issuable)"
+ @checked-input="handleIssuableCheckedInput(issuable, $event)"
>
- <issuable-item
- v-for="issuable in issuables"
- :key="issuableId(issuable)"
- :class="{ 'gl-cursor-grab': isManualOrdering }"
- :issuable-symbol="issuableSymbol"
- :issuable="issuable"
- :enable-label-permalinks="enableLabelPermalinks"
- :label-filter-param="labelFilterParam"
- :show-checkbox="showBulkEditSidebar"
- :checked="issuableChecked(issuable)"
- @checked-input="handleIssuableCheckedInput(issuable, $event)"
- >
- <template #reference>
- <slot name="reference" :issuable="issuable"></slot>
- </template>
- <template #author>
- <slot name="author" :author="issuable.author"></slot>
- </template>
- <template #timeframe>
- <slot name="timeframe" :issuable="issuable"></slot>
- </template>
- <template #status>
- <slot name="status" :issuable="issuable"></slot>
- </template>
- <template #statistics>
- <slot name="statistics" :issuable="issuable"></slot>
- </template>
- </issuable-item>
- </component>
- <slot v-else name="empty-state"></slot>
- </template>
+ <template #reference>
+ <slot name="reference" :issuable="issuable"></slot>
+ </template>
+ <template #author>
+ <slot name="author" :author="issuable.author"></slot>
+ </template>
+ <template #timeframe>
+ <slot name="timeframe" :issuable="issuable"></slot>
+ </template>
+ <template #status>
+ <slot name="status" :issuable="issuable"></slot>
+ </template>
+ <template #statistics>
+ <slot name="statistics" :issuable="issuable"></slot>
+ </template>
+ </issuable-item>
+ </component>
+ <slot v-else name="empty-state"></slot>
+ </template>
- <div v-if="showPaginationControls && useKeysetPagination" class="gl-text-center gl-mt-3">
- <gl-keyset-pagination
- :has-next-page="hasNextPage"
- :has-previous-page="hasPreviousPage"
- @next="$emit('next-page')"
- @prev="$emit('previous-page')"
- />
- </div>
- <gl-pagination
- v-else-if="showPaginationControls"
- :per-page="defaultPageSize"
- :total-items="totalItems"
- :value="currentPage"
- :prev-page="previousPage"
- :next-page="nextPage"
- align="center"
- class="gl-pagination gl-mt-3"
- @input="$emit('page-change', $event)"
+ <div v-if="showPaginationControls && useKeysetPagination" class="gl-text-center gl-mt-3">
+ <gl-keyset-pagination
+ :has-next-page="hasNextPage"
+ :has-previous-page="hasPreviousPage"
+ @next="$emit('next-page')"
+ @prev="$emit('previous-page')"
/>
</div>
+ <gl-pagination
+ v-else-if="showPaginationControls"
+ :per-page="defaultPageSize"
+ :total-items="totalItems"
+ :value="currentPage"
+ :prev-page="previousPage"
+ :next-page="nextPage"
+ align="center"
+ class="gl-pagination gl-mt-3"
+ @input="$emit('page-change', $event)"
+ />
</div>
</template>
diff --git a/app/assets/javascripts/issuable_suggestions/components/app.vue b/app/assets/javascripts/issuable_suggestions/components/app.vue
index d0642b64e7e..48a5e220abf 100644
--- a/app/assets/javascripts/issuable_suggestions/components/app.vue
+++ b/app/assets/javascripts/issuable_suggestions/components/app.vue
@@ -74,7 +74,7 @@ export default {
:title="$options.helpText"
:aria-label="$options.helpText"
name="question-o"
- class="text-secondary suggestion-help-hover"
+ class="text-secondary gl-cursor-help"
/>
</div>
<div class="col-sm-10">
diff --git a/app/assets/javascripts/issuable_suggestions/components/item.vue b/app/assets/javascripts/issuable_suggestions/components/item.vue
index dea7608685a..a01f4f747b9 100644
--- a/app/assets/javascripts/issuable_suggestions/components/item.vue
+++ b/app/assets/javascripts/issuable_suggestions/components/item.vue
@@ -1,5 +1,4 @@
<script>
-/* eslint-disable @gitlab/vue-require-i18n-strings */
import { GlLink, GlTooltip, GlTooltipDirective, GlIcon } from '@gitlab/ui';
import { uniqueId } from 'lodash';
import { __ } from '~/locale';
@@ -26,12 +25,6 @@ export default {
},
},
computed: {
- isOpen() {
- return this.suggestion.state === 'opened';
- },
- isClosed() {
- return this.suggestion.state === 'closed';
- },
counts() {
return [
{
@@ -48,7 +41,13 @@ export default {
},
].filter(({ count }) => count);
},
- stateIcon() {
+ isClosed() {
+ return this.suggestion.state === 'closed';
+ },
+ stateIconClass() {
+ return this.isClosed ? 'gl-text-blue-500' : 'gl-text-green-500';
+ },
+ stateIconName() {
return this.isClosed ? 'issue-close' : 'issue-open-m';
},
stateTitle() {
@@ -72,7 +71,7 @@ export default {
v-gl-tooltip.bottom
:title="__('Confidential')"
name="eye-slash"
- class="suggestion-help-hover mr-1 suggestion-confidential"
+ class="gl-cursor-help gl-mr-2 gl-text-orange-500"
/>
<gl-link
:href="suggestion.webUrl"
@@ -83,15 +82,7 @@ export default {
</gl-link>
</div>
<div class="text-secondary suggestion-footer">
- <gl-icon
- ref="state"
- :name="stateIcon"
- :class="{
- 'suggestion-state-open': isOpen,
- 'suggestion-state-closed': isClosed,
- }"
- class="suggestion-help-hover"
- />
+ <gl-icon ref="state" :name="stateIconName" :class="stateIconClass" class="gl-cursor-help" />
<gl-tooltip :target="() => $refs.state" placement="bottom">
<span class="d-block">
<span class="bold"> {{ stateTitle }} </span> {{ timeFormatted(closedOrCreatedDate) }}
@@ -102,9 +93,9 @@ export default {
<timeago-tooltip
:time="suggestion.createdAt"
tooltip-placement="bottom"
- class="suggestion-help-hover"
+ class="gl-cursor-help"
/>
- by
+ {{ __('by') }}
<gl-link :href="suggestion.author.webUrl">
<user-avatar-image
:img-src="suggestion.author.avatarUrl"
@@ -122,7 +113,7 @@ export default {
<timeago-tooltip
:time="suggestion.updatedAt"
tooltip-placement="bottom"
- class="suggestion-help-hover"
+ class="gl-cursor-help"
/>
</template>
<span class="suggestion-counts">
@@ -131,7 +122,7 @@ export default {
:key="id"
v-gl-tooltip.bottom
:title="tooltipTitle"
- class="suggestion-help-hover gl-ml-3 text-tertiary"
+ class="gl-cursor-help gl-ml-3 text-tertiary"
>
<gl-icon :name="icon" /> {{ count }}
</span>
diff --git a/app/assets/javascripts/issuable_suggestions/index.js b/app/assets/javascripts/issuable_suggestions/index.js
index 8f7f317d6b4..22a99a17741 100644
--- a/app/assets/javascripts/issuable_suggestions/index.js
+++ b/app/assets/javascripts/issuable_suggestions/index.js
@@ -10,7 +10,12 @@ export default function initIssuableSuggestions() {
const issueTitle = document.getElementById('issue_title');
const { projectPath } = el.dataset;
const apolloProvider = new VueApollo({
- defaultClient: createDefaultClient(),
+ defaultClient: createDefaultClient(
+ {},
+ {
+ assumeImmutableResults: true,
+ },
+ ),
});
return new Vue({
diff --git a/app/assets/javascripts/issue_show/components/locked_warning.vue b/app/assets/javascripts/issue_show/components/locked_warning.vue
index f3c2a31bd5b..4b99888ae73 100644
--- a/app/assets/javascripts/issue_show/components/locked_warning.vue
+++ b/app/assets/javascripts/issue_show/components/locked_warning.vue
@@ -1,30 +1,33 @@
<script>
-import { __, sprintf } from '~/locale';
+import { GlSprintf, GlLink } from '@gitlab/ui';
+import { __ } from '~/locale';
+
+const alertMessage = __(
+ 'Someone edited the issue at the same time you did. Please check out %{linkStart}the issue%{linkEnd} and make sure your changes will not unintentionally remove theirs.',
+);
export default {
+ alertMessage,
+ components: {
+ GlSprintf,
+ GlLink,
+ },
computed: {
currentPath() {
return window.location.pathname;
},
- alertMessage() {
- return sprintf(
- __(
- 'Someone edited the issue at the same time you did. Please check out %{linkStart}the issue%{linkEnd} and make sure your changes will not unintentionally remove theirs.',
- ),
- {
- linkStart: `<a href="${this.currentPath}" target="_blank" rel="nofollow">`,
- linkEnd: `</a>`,
- },
- false,
- );
- },
},
};
</script>
<template>
- <div
- class="alert alert-danger"
- v-html="alertMessage /* eslint-disable-line vue/no-v-html */"
- ></div>
+ <div class="alert alert-danger">
+ <gl-sprintf :message="$options.alertMessage">
+ <template #link="{ content }">
+ <gl-link :href="currentPath" target="_blank" rel="nofollow">
+ {{ content }}
+ </gl-link>
+ </template>
+ </gl-sprintf>
+ </div>
</template>
diff --git a/app/assets/javascripts/issues_list/components/issue_card_time_info.vue b/app/assets/javascripts/issues_list/components/issue_card_time_info.vue
index a687a58a6ad..4a2f7861492 100644
--- a/app/assets/javascripts/issues_list/components/issue_card_time_info.vue
+++ b/app/assets/javascripts/issues_list/components/issue_card_time_info.vue
@@ -85,7 +85,7 @@ export default {
<span>
<span
v-if="issue.milestone"
- class="issuable-milestone gl-display-none gl-sm-display-inline-block! gl-mr-3"
+ class="issuable-milestone gl-mr-3"
data-testid="issuable-milestone"
>
<gl-link v-gl-tooltip :href="milestoneLink" :title="milestoneDate">
@@ -96,7 +96,7 @@ export default {
<span
v-if="issue.dueDate"
v-gl-tooltip
- class="issuable-due-date gl-display-none gl-sm-display-inline-block! gl-mr-3"
+ class="issuable-due-date gl-mr-3"
:class="{ 'gl-text-red-500': showDueDateInRed }"
:title="__('Due date')"
data-testid="issuable-due-date"
@@ -107,21 +107,14 @@ export default {
<span
v-if="timeEstimate"
v-gl-tooltip
- class="gl-display-none gl-sm-display-inline-block! gl-mr-3"
+ class="gl-mr-3"
:title="__('Estimate')"
data-testid="time-estimate"
>
<gl-icon name="timer" />
{{ timeEstimate }}
</span>
- <weight-count
- class="issuable-weight gl-display-none gl-sm-display-inline-block gl-mr-3"
- :weight="issue.weight"
- />
- <issue-health-status
- v-if="showHealthStatus"
- class="gl-display-none gl-sm-display-inline-block"
- :health-status="healthStatus"
- />
+ <weight-count class="issuable-weight gl-mr-3" :weight="issue.weight" />
+ <issue-health-status v-if="showHealthStatus" :health-status="healthStatus" />
</span>
</template>
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 8e37339fca6..7b51f6ee46a 100644
--- a/app/assets/javascripts/issues_list/components/issues_list_app.vue
+++ b/app/assets/javascripts/issues_list/components/issues_list_app.vue
@@ -68,13 +68,6 @@ import {
TOKEN_TITLE_TYPE,
TOKEN_TITLE_WEIGHT,
} from '~/vue_shared/components/filtered_search_bar/constants';
-import AuthorToken from '~/vue_shared/components/filtered_search_bar/tokens/author_token.vue';
-import EmojiToken from '~/vue_shared/components/filtered_search_bar/tokens/emoji_token.vue';
-import EpicToken from '~/vue_shared/components/filtered_search_bar/tokens/epic_token.vue';
-import IterationToken from '~/vue_shared/components/filtered_search_bar/tokens/iteration_token.vue';
-import LabelToken from '~/vue_shared/components/filtered_search_bar/tokens/label_token.vue';
-import MilestoneToken from '~/vue_shared/components/filtered_search_bar/tokens/milestone_token.vue';
-import WeightToken from '~/vue_shared/components/filtered_search_bar/tokens/weight_token.vue';
import eventHub from '../eventhub';
import reorderIssuesMutation from '../queries/reorder_issues.mutation.graphql';
import searchIterationsQuery from '../queries/search_iterations.query.graphql';
@@ -82,6 +75,21 @@ import searchLabelsQuery from '../queries/search_labels.query.graphql';
import searchMilestonesQuery from '../queries/search_milestones.query.graphql';
import searchUsersQuery from '../queries/search_users.query.graphql';
import IssueCardTimeInfo from './issue_card_time_info.vue';
+import NewIssueDropdown from './new_issue_dropdown.vue';
+
+const AuthorToken = () =>
+ import('~/vue_shared/components/filtered_search_bar/tokens/author_token.vue');
+const EmojiToken = () =>
+ import('~/vue_shared/components/filtered_search_bar/tokens/emoji_token.vue');
+const EpicToken = () => import('~/vue_shared/components/filtered_search_bar/tokens/epic_token.vue');
+const IterationToken = () =>
+ import('~/vue_shared/components/filtered_search_bar/tokens/iteration_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');
+const WeightToken = () =>
+ import('~/vue_shared/components/filtered_search_bar/tokens/weight_token.vue');
export default {
i18n,
@@ -96,6 +104,7 @@ export default {
IssuableByEmail,
IssuableList,
IssueCardTimeInfo,
+ NewIssueDropdown,
BlockingIssuesCount: () => import('ee_component/issues/components/blocking_issues_count.vue'),
},
directives: {
@@ -120,12 +129,15 @@ export default {
fullPath: {
default: '',
},
- groupEpicsPath: {
+ groupPath: {
default: '',
},
hasAnyIssues: {
default: false,
},
+ hasAnyProjects: {
+ default: false,
+ },
hasBlockedIssuesFeature: {
default: false,
},
@@ -253,6 +265,9 @@ export default {
showCsvButtons() {
return this.isProject && this.isSignedIn;
},
+ showNewIssueDropdown() {
+ return !this.isProject && this.hasAnyProjects;
+ },
apiFilterParams() {
return convertToApiParams(this.filterTokens);
},
@@ -363,16 +378,18 @@ export default {
});
}
- if (this.groupEpicsPath) {
+ if (this.groupPath) {
tokens.push({
type: TOKEN_TYPE_EPIC,
title: TOKEN_TITLE_EPIC,
icon: 'epic',
token: EpicToken,
unique: true,
+ symbol: '&',
idProperty: 'id',
useIdValue: true,
- fetchEpics: this.fetchEpics,
+ recentSuggestionsStorageKey: `${this.fullPath}-issues-recent-tokens-epic_id`,
+ fullPath: this.groupPath,
});
}
@@ -442,16 +459,6 @@ export default {
fetchEmojis(search) {
return this.fetchWithCache(this.autocompleteAwardEmojisPath, 'emojis', 'name', search);
},
- async fetchEpics({ search }) {
- const epics = await this.fetchWithCache(this.groupEpicsPath, 'epics');
- if (!search) {
- return epics.slice(0, MAX_LIST_SIZE);
- }
- const number = Number(search);
- return Number.isNaN(number)
- ? fuzzaldrinPlus.filter(epics, search, { key: 'title' })
- : epics.filter((epic) => epic.id === number);
- },
fetchLabels(search) {
return this.$apollo
.query({
@@ -662,6 +669,7 @@ export default {
<gl-button v-if="showNewIssueLink" :href="newIssuePath" variant="confirm">
{{ $options.i18n.newIssueLabel }}
</gl-button>
+ <new-issue-dropdown v-if="showNewIssueDropdown" />
</template>
<template #timeframe="{ issuable = {} }">
@@ -765,6 +773,7 @@ export default {
:export-csv-path="exportCsvPathWithQuery"
:issuable-count="currentTabCount"
/>
+ <new-issue-dropdown v-if="showNewIssueDropdown" />
</template>
</gl-empty-state>
<hr />
diff --git a/app/assets/javascripts/issues_list/components/new_issue_dropdown.vue b/app/assets/javascripts/issues_list/components/new_issue_dropdown.vue
new file mode 100644
index 00000000000..037fd9be542
--- /dev/null
+++ b/app/assets/javascripts/issues_list/components/new_issue_dropdown.vue
@@ -0,0 +1,124 @@
+<script>
+import {
+ GlDropdown,
+ GlDropdownItem,
+ GlDropdownText,
+ GlLoadingIcon,
+ GlSearchBoxByType,
+} from '@gitlab/ui';
+import createFlash from '~/flash';
+import searchProjectsQuery from '~/issues_list/queries/search_projects.query.graphql';
+import { DASH_SCOPE, joinPaths } from '~/lib/utils/url_utility';
+import { __, sprintf } from '~/locale';
+import { DEBOUNCE_DELAY } from '~/vue_shared/components/filtered_search_bar/constants';
+
+export default {
+ i18n: {
+ defaultDropdownText: __('Select project to create issue'),
+ noMatchesFound: __('No matches found'),
+ toggleButtonLabel: __('Toggle project select'),
+ },
+ components: {
+ GlDropdown,
+ GlDropdownItem,
+ GlDropdownText,
+ GlLoadingIcon,
+ GlSearchBoxByType,
+ },
+ inject: ['fullPath'],
+ data() {
+ return {
+ projects: [],
+ search: '',
+ selectedProject: {},
+ shouldSkipQuery: true,
+ };
+ },
+ apollo: {
+ projects: {
+ query: searchProjectsQuery,
+ variables() {
+ return {
+ fullPath: this.fullPath,
+ search: this.search,
+ };
+ },
+ update: ({ group }) => group.projects.nodes ?? [],
+ error(error) {
+ createFlash({
+ message: __('An error occurred while loading projects.'),
+ captureError: true,
+ error,
+ });
+ },
+ skip() {
+ return this.shouldSkipQuery;
+ },
+ debounce: DEBOUNCE_DELAY,
+ },
+ },
+ computed: {
+ dropdownHref() {
+ return this.hasSelectedProject
+ ? joinPaths(this.selectedProject.webUrl, DASH_SCOPE, 'issues/new')
+ : undefined;
+ },
+ dropdownText() {
+ return this.hasSelectedProject
+ ? sprintf(__('New issue in %{project}'), { project: this.selectedProject.name })
+ : this.$options.i18n.defaultDropdownText;
+ },
+ hasSelectedProject() {
+ return this.selectedProject.id;
+ },
+ showNoSearchResultsText() {
+ return !this.projects.length && this.search;
+ },
+ },
+ methods: {
+ handleDropdownClick() {
+ if (!this.dropdownHref) {
+ this.$refs.dropdown.show();
+ }
+ },
+ handleDropdownShown() {
+ if (this.shouldSkipQuery) {
+ this.shouldSkipQuery = false;
+ }
+ this.$refs.search.focusInput();
+ },
+ selectProject(project) {
+ this.selectedProject = project;
+ },
+ },
+};
+</script>
+
+<template>
+ <gl-dropdown
+ ref="dropdown"
+ right
+ split
+ :split-href="dropdownHref"
+ :text="dropdownText"
+ :toggle-text="$options.i18n.toggleButtonLabel"
+ variant="confirm"
+ @click="handleDropdownClick"
+ @shown="handleDropdownShown"
+ >
+ <gl-search-box-by-type ref="search" v-model.trim="search" />
+ <gl-loading-icon v-if="$apollo.queries.projects.loading" />
+ <template v-else>
+ <gl-dropdown-item
+ v-for="project of projects"
+ :key="project.id"
+ @click="selectProject(project)"
+ >
+ {{ project.nameWithNamespace }}
+ </gl-dropdown-item>
+ <gl-dropdown-text v-if="showNoSearchResultsText">
+ {{ $options.i18n.noMatchesFound }}
+ </gl-dropdown-text>
+ </template>
+ </gl-dropdown>
+</template>
diff --git a/app/assets/javascripts/issues_list/index.js b/app/assets/javascripts/issues_list/index.js
index e89e3e8e681..47af20f5271 100644
--- a/app/assets/javascripts/issues_list/index.js
+++ b/app/assets/javascripts/issues_list/index.js
@@ -119,8 +119,9 @@ export function mountIssuesListApp() {
emptyStateSvgPath,
exportCsvPath,
fullPath,
- groupEpicsPath,
+ groupPath,
hasAnyIssues,
+ hasAnyProjects,
hasBlockedIssuesFeature,
hasIssuableHealthStatusFeature,
hasIssueWeightsFeature,
@@ -151,8 +152,9 @@ export function mountIssuesListApp() {
canBulkUpdate: parseBoolean(canBulkUpdate),
emptyStateSvgPath,
fullPath,
- groupEpicsPath,
+ groupPath,
hasAnyIssues: parseBoolean(hasAnyIssues),
+ hasAnyProjects: parseBoolean(hasAnyProjects),
hasBlockedIssuesFeature: parseBoolean(hasBlockedIssuesFeature),
hasIssuableHealthStatusFeature: parseBoolean(hasIssuableHealthStatusFeature),
hasIssueWeightsFeature: parseBoolean(hasIssueWeightsFeature),
diff --git a/app/assets/javascripts/issues_list/queries/search_projects.query.graphql b/app/assets/javascripts/issues_list/queries/search_projects.query.graphql
new file mode 100644
index 00000000000..df1f330139a
--- /dev/null
+++ b/app/assets/javascripts/issues_list/queries/search_projects.query.graphql
@@ -0,0 +1,12 @@
+query searchProjects($fullPath: ID!, $search: String) {
+ group(fullPath: $fullPath) {
+ projects(search: $search, includeSubgroups: true) {
+ nodes {
+ id
+ name
+ nameWithNamespace
+ webUrl
+ }
+ }
+ }
+}
diff --git a/app/assets/javascripts/jobs/components/job_app.vue b/app/assets/javascripts/jobs/components/job_app.vue
index 059772e8cb9..fe4158a1bd1 100644
--- a/app/assets/javascripts/jobs/components/job_app.vue
+++ b/app/assets/javascripts/jobs/components/job_app.vue
@@ -80,13 +80,13 @@ export default {
'isLoading',
'job',
'isSidebarOpen',
- 'trace',
- 'isTraceComplete',
- 'traceSize',
- 'isTraceSizeVisible',
+ 'jobLog',
+ 'isJobLogComplete',
+ 'jobLogSize',
+ 'isJobLogSizeVisible',
'isScrollBottomDisabled',
'isScrollTopDisabled',
- 'isScrolledToBottomBeforeReceivingTrace',
+ 'isScrolledToBottomBeforeReceivingJobLog',
'hasError',
'selectedStage',
]),
@@ -97,7 +97,7 @@ export default {
'shouldRenderTriggeredLabel',
'hasEnvironment',
'shouldRenderSharedRunnerLimitWarning',
- 'hasTrace',
+ 'hasJobLog',
'emptyStateIllustration',
'isScrollingDown',
'emptyStateAction',
@@ -155,7 +155,7 @@ export default {
this.updateSidebar();
},
beforeDestroy() {
- this.stopPollingTrace();
+ this.stopPollingJobLog();
this.stopPolling();
window.removeEventListener('resize', this.onResize);
window.removeEventListener('scroll', this.updateScroll);
@@ -168,7 +168,7 @@ export default {
'toggleSidebar',
'scrollBottom',
'scrollTop',
- 'stopPollingTrace',
+ 'stopPollingJobLog',
'stopPolling',
'toggleScrollButtons',
'toggleScrollAnimation',
@@ -270,7 +270,7 @@ export default {
<div
v-if="job.archived"
class="gl-mt-3 gl-py-2 gl-px-3 gl-align-items-center gl-z-index-1 gl-m-auto archived-job"
- :class="{ 'sticky-top gl-border-bottom-0': hasTrace }"
+ :class="{ 'sticky-top gl-border-bottom-0': hasJobLog }"
data-testid="archived-job"
>
<gl-icon name="lock" class="gl-vertical-align-bottom" />
@@ -278,8 +278,8 @@ export default {
</div>
<!-- job log -->
<div
- v-if="hasTrace"
- class="build-trace-container gl-relative"
+ v-if="hasJobLog"
+ class="build-log-container gl-relative"
:class="{ 'gl-mt-3': !job.archived }"
>
<log-top-bar
@@ -289,22 +289,22 @@ export default {
'has-archived-block': job.archived,
}"
:erase-path="job.erase_path"
- :size="traceSize"
+ :size="jobLogSize"
:raw-path="job.raw_path"
:is-scroll-bottom-disabled="isScrollBottomDisabled"
:is-scroll-top-disabled="isScrollTopDisabled"
- :is-trace-size-visible="isTraceSizeVisible"
+ :is-job-log-size-visible="isJobLogSizeVisible"
:is-scrolling-down="isScrollingDown"
@scrollJobLogTop="scrollTop"
@scrollJobLogBottom="scrollBottom"
/>
- <log :trace="trace" :is-complete="isTraceComplete" />
+ <log :job-log="jobLog" :is-complete="isJobLogComplete" />
</div>
<!-- EO job log -->
<!-- empty state -->
<empty-state
- v-if="!hasTrace"
+ v-if="!hasJobLog"
:illustration-path="emptyStateIllustration.image"
:illustration-size-class="emptyStateIllustration.size"
:title="emptyStateTitle"
diff --git a/app/assets/javascripts/jobs/components/job_log_controllers.vue b/app/assets/javascripts/jobs/components/job_log_controllers.vue
index 957e8243f33..6105299e15c 100644
--- a/app/assets/javascripts/jobs/components/job_log_controllers.vue
+++ b/app/assets/javascripts/jobs/components/job_log_controllers.vue
@@ -44,7 +44,7 @@ export default {
type: Boolean,
required: true,
},
- isTraceSizeVisible: {
+ isJobLogSizeVisible: {
type: Boolean,
required: true,
},
@@ -73,7 +73,7 @@ export default {
class="truncated-info gl-display-none gl-sm-display-block gl-float-left"
data-testid="log-truncated-info"
>
- <template v-if="isTraceSizeVisible">
+ <template v-if="isJobLogSizeVisible">
{{ jobLogSize }}
<gl-link
v-if="rawPath"
diff --git a/app/assets/javascripts/jobs/components/log/collapsible_section.vue b/app/assets/javascripts/jobs/components/log/collapsible_section.vue
index c0d5fac0e8d..757b2e458e9 100644
--- a/app/assets/javascripts/jobs/components/log/collapsible_section.vue
+++ b/app/assets/javascripts/jobs/components/log/collapsible_section.vue
@@ -17,7 +17,7 @@ export default {
type: Object,
required: true,
},
- traceEndpoint: {
+ jobLogEndpoint: {
type: String,
required: true,
},
@@ -42,7 +42,7 @@ export default {
<log-line-header
:line="section.line"
:duration="badgeDuration"
- :path="traceEndpoint"
+ :path="jobLogEndpoint"
:is-closed="section.isClosed"
@toggleLine="handleOnClickCollapsibleLine(section)"
/>
@@ -53,10 +53,10 @@ export default {
v-if="line.isHeader"
:key="line.line.offset"
:section="line"
- :trace-endpoint="traceEndpoint"
+ :job-log-endpoint="jobLogEndpoint"
@onClickCollapsibleLine="handleOnClickCollapsibleLine"
/>
- <log-line v-else :key="line.offset" :line="line" :path="traceEndpoint" />
+ <log-line v-else :key="line.offset" :line="line" :path="jobLogEndpoint" />
</template>
</template>
<template v-else>
@@ -64,7 +64,7 @@ export default {
v-for="line in section.lines"
:key="line.offset"
:line="line"
- :path="traceEndpoint"
+ :path="jobLogEndpoint"
/>
</template>
</template>
diff --git a/app/assets/javascripts/jobs/components/log/log.vue b/app/assets/javascripts/jobs/components/log/log.vue
index 0134e5dafe8..ef95d79b8ab 100644
--- a/app/assets/javascripts/jobs/components/log/log.vue
+++ b/app/assets/javascripts/jobs/components/log/log.vue
@@ -10,10 +10,10 @@ export default {
},
computed: {
...mapState([
- 'traceEndpoint',
- 'trace',
- 'isTraceComplete',
- 'isScrolledToBottomBeforeReceivingTrace',
+ 'jobLogEndpoint',
+ 'jobLog',
+ 'isJobLogComplete',
+ 'isScrolledToBottomBeforeReceivingJobLog',
]),
},
updated() {
@@ -39,7 +39,7 @@ export default {
* In order to scroll the page down after `v-html` has finished, we need to use setTimeout
*/
handleScrollDown() {
- if (this.isScrolledToBottomBeforeReceivingTrace) {
+ if (this.isScrolledToBottomBeforeReceivingJobLog) {
setTimeout(() => {
this.scrollBottom();
}, 0);
@@ -50,18 +50,18 @@ export default {
</script>
<template>
<code class="job-log d-block" data-qa-selector="job_log_content">
- <template v-for="(section, index) in trace">
+ <template v-for="(section, index) in jobLog">
<collapsible-log-section
v-if="section.isHeader"
:key="`collapsible-${index}`"
:section="section"
- :trace-endpoint="traceEndpoint"
+ :job-log-endpoint="jobLogEndpoint"
@onClickCollapsibleLine="handleOnClickCollapsibleLine"
/>
- <log-line v-else :key="section.offset" :line="section" :path="traceEndpoint" />
+ <log-line v-else :key="section.offset" :line="section" :path="jobLogEndpoint" />
</template>
- <div v-if="!isTraceComplete" class="js-log-animation loader-animation pt-3 pl-3">
+ <div v-if="!isJobLogComplete" class="js-log-animation loader-animation pt-3 pl-3">
<div class="dot"></div>
<div class="dot"></div>
<div class="dot"></div>
diff --git a/app/assets/javascripts/jobs/components/table/cells/actions_cell.vue b/app/assets/javascripts/jobs/components/table/cells/actions_cell.vue
index 6b3a4424a5b..51251c0cacc 100644
--- a/app/assets/javascripts/jobs/components/table/cells/actions_cell.vue
+++ b/app/assets/javascripts/jobs/components/table/cells/actions_cell.vue
@@ -18,6 +18,7 @@ import cancelJobMutation from '../graphql/mutations/job_cancel.mutation.graphql'
import playJobMutation from '../graphql/mutations/job_play.mutation.graphql';
import retryJobMutation from '../graphql/mutations/job_retry.mutation.graphql';
import unscheduleJobMutation from '../graphql/mutations/job_unschedule.mutation.graphql';
+import { reportMessageToSentry } from '../../../utils';
export default {
ACTIONS_DOWNLOAD_ARTIFACTS,
@@ -34,6 +35,7 @@ export default {
jobPlay: 'jobPlay',
jobUnschedule: 'jobUnschedule',
playJobModalId: 'play-job-modal',
+ name: 'JobActionsCell',
components: {
GlButton,
GlButtonGroup,
@@ -99,15 +101,17 @@ export default {
variables: { id: this.job.id },
});
if (errors.length > 0) {
- this.reportFailure();
+ reportMessageToSentry(this.$options.name, errors.join(', '), {});
+ this.showToastMessage();
} else {
eventHub.$emit('jobActionPerformed');
}
- } catch {
- this.reportFailure();
+ } catch (failure) {
+ reportMessageToSentry(this.$options.name, failure, {});
+ this.showToastMessage();
}
},
- reportFailure() {
+ showToastMessage() {
const toastProps = {
text: this.$options.GENERIC_ERROR,
variant: 'danger',
@@ -136,7 +140,13 @@ export default {
<template>
<gl-button-group>
<template v-if="canReadJob">
- <gl-button v-if="isActive" icon="cancel" :title="$options.CANCEL" @click="cancelJob()" />
+ <gl-button
+ v-if="isActive"
+ data-testid="cancel-button"
+ icon="cancel"
+ :title="$options.CANCEL"
+ @click="cancelJob()"
+ />
<template v-else-if="isScheduled">
<gl-button icon="planning" disabled data-testid="countdown">
<gl-countdown :end-date-string="scheduledAt" />
diff --git a/app/assets/javascripts/jobs/store/actions.js b/app/assets/javascripts/jobs/store/actions.js
index 53e3dbbad0d..927ba7c7e1e 100644
--- a/app/assets/javascripts/jobs/store/actions.js
+++ b/app/assets/javascripts/jobs/store/actions.js
@@ -18,16 +18,16 @@ import * as types from './mutation_types';
export const init = ({ dispatch }, { endpoint, logState, pagePath }) => {
dispatch('setJobEndpoint', endpoint);
- dispatch('setTraceOptions', {
+ dispatch('setJobLogOptions', {
logState,
pagePath,
});
- return Promise.all([dispatch('fetchJob'), dispatch('fetchTrace')]);
+ return Promise.all([dispatch('fetchJob'), dispatch('fetchJobLog')]);
};
export const setJobEndpoint = ({ commit }, endpoint) => commit(types.SET_JOB_ENDPOINT, endpoint);
-export const setTraceOptions = ({ commit }, options) => commit(types.SET_TRACE_OPTIONS, options);
+export const setJobLogOptions = ({ commit }, options) => commit(types.SET_JOB_LOG_OPTIONS, options);
export const hideSidebar = ({ commit }) => commit(types.HIDE_SIDEBAR);
export const showSidebar = ({ commit }) => commit(types.SHOW_SIDEBAR);
@@ -107,7 +107,7 @@ export const receiveJobError = ({ commit }) => {
};
/**
- * Job's Trace
+ * Job Log
*/
export const scrollTop = ({ dispatch }) => {
scrollUp();
@@ -156,59 +156,62 @@ export const toggleScrollAnimation = ({ commit }, toggle) =>
* Responsible to handle automatic scroll
*/
export const toggleScrollisInBottom = ({ commit }, toggle) => {
- commit(types.TOGGLE_IS_SCROLL_IN_BOTTOM_BEFORE_UPDATING_TRACE, toggle);
+ commit(types.TOGGLE_IS_SCROLL_IN_BOTTOM_BEFORE_UPDATING_JOB_LOG, toggle);
};
-export const requestTrace = ({ commit }) => commit(types.REQUEST_TRACE);
+export const requestJobLog = ({ commit }) => commit(types.REQUEST_JOB_LOG);
-export const fetchTrace = ({ dispatch, state }) =>
+export const fetchJobLog = ({ dispatch, state }) =>
+ // update trace endpoint once BE compeletes trace re-naming in #340626
axios
- .get(`${state.traceEndpoint}/trace.json`, {
- params: { state: state.traceState },
+ .get(`${state.jobLogEndpoint}/trace.json`, {
+ params: { state: state.jobLogState },
})
.then(({ data }) => {
dispatch('toggleScrollisInBottom', isScrolledToBottom());
- dispatch('receiveTraceSuccess', data);
+ dispatch('receiveJobLogSuccess', data);
if (data.complete) {
- dispatch('stopPollingTrace');
- } else if (!state.traceTimeout) {
- dispatch('startPollingTrace');
+ dispatch('stopPollingJobLog');
+ } else if (!state.jobLogTimeout) {
+ dispatch('startPollingJobLog');
}
})
.catch((e) => {
if (e.response.status === httpStatusCodes.FORBIDDEN) {
- dispatch('receiveTraceUnauthorizedError');
+ dispatch('receiveJobLogUnauthorizedError');
} else {
reportToSentry('job_actions', e);
- dispatch('receiveTraceError');
+ dispatch('receiveJobLogError');
}
});
-export const startPollingTrace = ({ dispatch, commit }) => {
- const traceTimeout = setTimeout(() => {
- commit(types.SET_TRACE_TIMEOUT, 0);
- dispatch('fetchTrace');
+export const startPollingJobLog = ({ dispatch, commit }) => {
+ const jobLogTimeout = setTimeout(() => {
+ commit(types.SET_JOB_LOG_TIMEOUT, 0);
+ dispatch('fetchJobLog');
}, 4000);
- commit(types.SET_TRACE_TIMEOUT, traceTimeout);
+ commit(types.SET_JOB_LOG_TIMEOUT, jobLogTimeout);
};
-export const stopPollingTrace = ({ state, commit }) => {
- clearTimeout(state.traceTimeout);
- commit(types.SET_TRACE_TIMEOUT, 0);
- commit(types.STOP_POLLING_TRACE);
+export const stopPollingJobLog = ({ state, commit }) => {
+ clearTimeout(state.jobLogTimeout);
+ commit(types.SET_JOB_LOG_TIMEOUT, 0);
+ commit(types.STOP_POLLING_JOB_LOG);
};
-export const receiveTraceSuccess = ({ commit }, log) => commit(types.RECEIVE_TRACE_SUCCESS, log);
-export const receiveTraceError = ({ dispatch }) => {
- dispatch('stopPollingTrace');
+export const receiveJobLogSuccess = ({ commit }, log) => commit(types.RECEIVE_JOB_LOG_SUCCESS, log);
+
+export const receiveJobLogError = ({ dispatch }) => {
+ dispatch('stopPollingJobLog');
createFlash({
message: __('An error occurred while fetching the job log.'),
});
};
-export const receiveTraceUnauthorizedError = ({ dispatch }) => {
- dispatch('stopPollingTrace');
+
+export const receiveJobLogUnauthorizedError = ({ dispatch }) => {
+ dispatch('stopPollingJobLog');
createFlash({
message: __('The current user is not authorized to access the job log.'),
});
@@ -248,6 +251,7 @@ export const fetchJobsForStage = ({ dispatch }, stage = {}) => {
};
export const receiveJobsForStageSuccess = ({ commit }, data) =>
commit(types.RECEIVE_JOBS_FOR_STAGE_SUCCESS, data);
+
export const receiveJobsForStageError = ({ commit }) => {
commit(types.RECEIVE_JOBS_FOR_STAGE_ERROR);
createFlash({
diff --git a/app/assets/javascripts/jobs/store/getters.js b/app/assets/javascripts/jobs/store/getters.js
index 6cb96bee07d..9d255822250 100644
--- a/app/assets/javascripts/jobs/store/getters.js
+++ b/app/assets/javascripts/jobs/store/getters.js
@@ -21,11 +21,12 @@ export const shouldRenderTriggeredLabel = (state) => isString(state.job.started)
export const hasEnvironment = (state) => !isEmpty(state.job.deployment_status);
/**
- * Checks if it the job has trace.
+ * Checks if it the job has a log.
* Used to check if it should render the job log or the empty state
* @returns {Boolean}
*/
-export const hasTrace = (state) =>
+export const hasJobLog = (state) =>
+ // update has_trace once BE compeletes trace re-naming in #340626
state.job.has_trace || (!isEmpty(state.job.status) && state.job.status.group === 'running');
export const emptyStateIllustration = (state) => state?.job?.status?.illustration || {};
@@ -43,7 +44,7 @@ export const shouldRenderSharedRunnerLimitWarning = (state) =>
!isEmpty(state.job.runners.quota) &&
state.job.runners.quota.used >= state.job.runners.quota.limit;
-export const isScrollingDown = (state) => isScrolledToBottom() && !state.isTraceComplete;
+export const isScrollingDown = (state) => isScrolledToBottom() && !state.isJobLogComplete;
export const hasRunnersForProject = (state) =>
state?.job?.runners?.available && !state?.job?.runners?.online;
diff --git a/app/assets/javascripts/jobs/store/mutation_types.js b/app/assets/javascripts/jobs/store/mutation_types.js
index 6c4f1b5a191..4915a826b84 100644
--- a/app/assets/javascripts/jobs/store/mutation_types.js
+++ b/app/assets/javascripts/jobs/store/mutation_types.js
@@ -1,5 +1,5 @@
export const SET_JOB_ENDPOINT = 'SET_JOB_ENDPOINT';
-export const SET_TRACE_OPTIONS = 'SET_TRACE_OPTIONS';
+export const SET_JOB_LOG_OPTIONS = 'SET_JOB_LOG_OPTIONS';
export const HIDE_SIDEBAR = 'HIDE_SIDEBAR';
export const SHOW_SIDEBAR = 'SHOW_SIDEBAR';
@@ -12,17 +12,17 @@ export const ENABLE_SCROLL_BOTTOM = 'ENABLE_SCROLL_BOTTOM';
export const ENABLE_SCROLL_TOP = 'ENABLE_SCROLL_TOP';
export const TOGGLE_SCROLL_ANIMATION = 'TOGGLE_SCROLL_ANIMATION';
-export const TOGGLE_IS_SCROLL_IN_BOTTOM_BEFORE_UPDATING_TRACE = 'TOGGLE_IS_SCROLL_IN_BOTTOM';
+export const TOGGLE_IS_SCROLL_IN_BOTTOM_BEFORE_UPDATING_JOB_LOG = 'TOGGLE_IS_SCROLL_IN_BOTTOM';
export const REQUEST_JOB = 'REQUEST_JOB';
export const RECEIVE_JOB_SUCCESS = 'RECEIVE_JOB_SUCCESS';
export const RECEIVE_JOB_ERROR = 'RECEIVE_JOB_ERROR';
-export const REQUEST_TRACE = 'REQUEST_TRACE';
-export const SET_TRACE_TIMEOUT = 'SET_TRACE_TIMEOUT';
-export const STOP_POLLING_TRACE = 'STOP_POLLING_TRACE';
-export const RECEIVE_TRACE_SUCCESS = 'RECEIVE_TRACE_SUCCESS';
-export const RECEIVE_TRACE_ERROR = 'RECEIVE_TRACE_ERROR';
+export const REQUEST_JOB_LOG = 'REQUEST_JOB_LOG';
+export const SET_JOB_LOG_TIMEOUT = 'SET_JOB_LOG_TIMEOUT';
+export const STOP_POLLING_JOB_LOG = 'STOP_POLLING_JOB_LOG';
+export const RECEIVE_JOB_LOG_SUCCESS = 'RECEIVE_JOB_LOG_SUCCESS';
+export const RECEIVE_JOB_LOG_ERROR = 'RECEIVE_JOB_LOG_ERROR';
export const TOGGLE_COLLAPSIBLE_LINE = 'TOGGLE_COLLAPSIBLE_LINE';
export const SET_SELECTED_STAGE = 'SET_SELECTED_STAGE';
diff --git a/app/assets/javascripts/jobs/store/mutations.js b/app/assets/javascripts/jobs/store/mutations.js
index 4045d8a0c16..eda2ee0349a 100644
--- a/app/assets/javascripts/jobs/store/mutations.js
+++ b/app/assets/javascripts/jobs/store/mutations.js
@@ -1,16 +1,16 @@
import Vue from 'vue';
import { INFINITELY_NESTED_COLLAPSIBLE_SECTIONS_FF } from '../constants';
import * as types from './mutation_types';
-import { logLinesParser, logLinesParserLegacy, updateIncrementalTrace } from './utils';
+import { logLinesParser, logLinesParserLegacy, updateIncrementalJobLog } from './utils';
export default {
[types.SET_JOB_ENDPOINT](state, endpoint) {
state.jobEndpoint = endpoint;
},
- [types.SET_TRACE_OPTIONS](state, options = {}) {
- state.traceEndpoint = options.pagePath;
- state.traceState = options.logState;
+ [types.SET_JOB_LOG_OPTIONS](state, options = {}) {
+ state.jobLogEndpoint = options.pagePath;
+ state.jobLogState = options.logState;
},
[types.HIDE_SIDEBAR](state) {
@@ -20,11 +20,11 @@ export default {
state.isSidebarOpen = true;
},
- [types.RECEIVE_TRACE_SUCCESS](state, log = {}) {
+ [types.RECEIVE_JOB_LOG_SUCCESS](state, log = {}) {
const infinitelyCollapsibleSectionsFlag =
gon.features?.[INFINITELY_NESTED_COLLAPSIBLE_SECTIONS_FF];
if (log.state) {
- state.traceState = log.state;
+ state.jobLogState = log.state;
}
if (log.append) {
@@ -32,52 +32,52 @@ export default {
if (log.lines) {
const parsedResult = logLinesParser(
log.lines,
- state.auxiliaryPartialTraceHelpers,
- state.trace,
+ state.auxiliaryPartialJobLogHelpers,
+ state.jobLog,
);
- state.trace = parsedResult.parsedLines;
- state.auxiliaryPartialTraceHelpers = parsedResult.auxiliaryPartialTraceHelpers;
+ state.jobLog = parsedResult.parsedLines;
+ state.auxiliaryPartialJobLogHelpers = parsedResult.auxiliaryPartialJobLogHelpers;
}
} else {
- state.trace = log.lines ? updateIncrementalTrace(log.lines, state.trace) : state.trace;
+ state.jobLog = log.lines ? updateIncrementalJobLog(log.lines, state.jobLog) : state.jobLog;
}
- state.traceSize += log.size;
+ state.jobLogSize += log.size;
} else {
- // When the job still does not have a trace
- // the trace response will not have a defined
+ // When the job still does not have a log
+ // the job log response will not have a defined
// html or size. We keep the old value otherwise these
// will be set to `null`
if (infinitelyCollapsibleSectionsFlag) {
const parsedResult = logLinesParser(log.lines);
- state.trace = parsedResult.parsedLines;
- state.auxiliaryPartialTraceHelpers = parsedResult.auxiliaryPartialTraceHelpers;
+ state.jobLog = parsedResult.parsedLines;
+ state.auxiliaryPartialJobLogHelpers = parsedResult.auxiliaryPartialJobLogHelpers;
} else {
- state.trace = log.lines ? logLinesParserLegacy(log.lines) : state.trace;
+ state.jobLog = log.lines ? logLinesParserLegacy(log.lines) : state.jobLog;
}
- state.traceSize = log.size || state.traceSize;
+ state.jobLogSize = log.size || state.jobLogSize;
}
- if (state.traceSize < log.total) {
- state.isTraceSizeVisible = true;
+ if (state.jobLogSize < log.total) {
+ state.isJobLogSizeVisible = true;
} else {
- state.isTraceSizeVisible = false;
+ state.isJobLogSizeVisible = false;
}
- state.isTraceComplete = log.complete || state.isTraceComplete;
+ state.isJobLogComplete = log.complete || state.isJobLogComplete;
},
- [types.SET_TRACE_TIMEOUT](state, id) {
- state.traceTimeout = id;
+ [types.SET_JOB_LOG_TIMEOUT](state, id) {
+ state.jobLogTimeout = id;
},
/**
* Will remove loading animation
*/
- [types.STOP_POLLING_TRACE](state) {
- state.isTraceComplete = true;
+ [types.STOP_POLLING_JOB_LOG](state) {
+ state.isJobLogComplete = true;
},
/**
@@ -137,8 +137,8 @@ export default {
state.isScrollingDown = toggle;
},
- [types.TOGGLE_IS_SCROLL_IN_BOTTOM_BEFORE_UPDATING_TRACE](state, toggle) {
- state.isScrolledToBottomBeforeReceivingTrace = toggle;
+ [types.TOGGLE_IS_SCROLL_IN_BOTTOM_BEFORE_UPDATING_JOB_LOG](state, toggle) {
+ state.isScrolledToBottomBeforeReceivingJobLog = toggle;
},
[types.REQUEST_JOBS_FOR_STAGE](state, stage = {}) {
diff --git a/app/assets/javascripts/jobs/store/state.js b/app/assets/javascripts/jobs/store/state.js
index 718324c8bad..a1ba64aa71e 100644
--- a/app/assets/javascripts/jobs/store/state.js
+++ b/app/assets/javascripts/jobs/store/state.js
@@ -1,6 +1,6 @@
export default () => ({
jobEndpoint: null,
- traceEndpoint: null,
+ jobLogEndpoint: null,
// sidebar
isSidebarOpen: true,
@@ -14,16 +14,16 @@ export default () => ({
isScrollTopDisabled: true,
// Used to check if we should keep the automatic scroll
- isScrolledToBottomBeforeReceivingTrace: true,
+ isScrolledToBottomBeforeReceivingJobLog: true,
- trace: [],
- isTraceComplete: false,
- traceSize: 0,
- isTraceSizeVisible: false,
- traceTimeout: 0,
+ jobLog: [],
+ isJobLogComplete: false,
+ jobLogSize: 0,
+ isJobLogSizeVisible: false,
+ jobLogTimeout: 0,
- // used as a query parameter to fetch the trace
- traceState: null,
+ // used as a query parameter to fetch the job log
+ jobLogState: null,
// sidebar dropdown & list of jobs
isLoadingJobs: false,
@@ -32,5 +32,5 @@ export default () => ({
jobs: [],
// to parse partial logs
- auxiliaryPartialTraceHelpers: {},
+ auxiliaryPartialJobLogHelpers: {},
});
diff --git a/app/assets/javascripts/jobs/store/utils.js b/app/assets/javascripts/jobs/store/utils.js
index b64734e29f6..8bca448ee11 100644
--- a/app/assets/javascripts/jobs/store/utils.js
+++ b/app/assets/javascripts/jobs/store/utils.js
@@ -131,17 +131,17 @@ export const logLinesParserLegacy = (lines = [], accumulator = []) =>
[...accumulator],
);
-export const logLinesParser = (lines = [], previousTraceState = {}, prevParsedLines = []) => {
- let currentLineCount = previousTraceState?.prevLineCount ?? 0;
- let currentHeader = previousTraceState?.currentHeader;
- let isPreviousLineHeader = previousTraceState?.isPreviousLineHeader ?? false;
+export const logLinesParser = (lines = [], previousJobLogState = {}, prevParsedLines = []) => {
+ let currentLineCount = previousJobLogState?.prevLineCount ?? 0;
+ let currentHeader = previousJobLogState?.currentHeader;
+ let isPreviousLineHeader = previousJobLogState?.isPreviousLineHeader ?? false;
const parsedLines = prevParsedLines.length > 0 ? prevParsedLines : [];
- const sectionsQueue = previousTraceState?.sectionsQueue ?? [];
+ const sectionsQueue = previousJobLogState?.sectionsQueue ?? [];
for (let i = 0; i < lines.length; i += 1) {
const line = lines[i];
// First run we can use the current index, later runs we have to retrieve the last number of lines
- currentLineCount = previousTraceState?.prevLineCount ? currentLineCount + 1 : i + 1;
+ currentLineCount = previousJobLogState?.prevLineCount ? currentLineCount + 1 : i + 1;
if (line.section_header && !isPreviousLineHeader) {
// If there's no previous line header that means we're at the root of the log
@@ -198,7 +198,7 @@ export const logLinesParser = (lines = [], previousTraceState = {}, prevParsedLi
return {
parsedLines,
- auxiliaryPartialTraceHelpers: {
+ auxiliaryPartialJobLogHelpers: {
isPreviousLineHeader,
currentHeader,
sectionsQueue,
@@ -241,7 +241,7 @@ export const findOffsetAndRemove = (newLog = [], oldParsed = []) => {
};
/**
- * When the trace is not complete, backend may send the last received line
+ * When the job log is not complete, backend may send the last received line
* in the new response.
*
* We need to check if that is the case by looking for the offset property
@@ -250,7 +250,7 @@ export const findOffsetAndRemove = (newLog = [], oldParsed = []) => {
* @param array oldLog
* @param array newLog
*/
-export const updateIncrementalTrace = (newLog = [], oldParsed = []) => {
+export const updateIncrementalJobLog = (newLog = [], oldParsed = []) => {
const parsedLog = findOffsetAndRemove(newLog, oldParsed);
return logLinesParserLegacy(newLog, parsedLog);
diff --git a/app/assets/javascripts/jobs/utils.js b/app/assets/javascripts/jobs/utils.js
index bb27658369f..a4e695518f1 100644
--- a/app/assets/javascripts/jobs/utils.js
+++ b/app/assets/javascripts/jobs/utils.js
@@ -19,3 +19,12 @@ export const reportToSentry = (component, failureType) => {
Sentry.captureException(failureType);
});
};
+
+export const reportMessageToSentry = (component, message, context) => {
+ Sentry.withScope((scope) => {
+ // eslint-disable-next-line @gitlab/require-i18n-strings
+ scope.setContext('Vue data', context);
+ scope.setTag('component', component);
+ Sentry.captureMessage(message);
+ });
+};
diff --git a/app/assets/javascripts/lib/apollo/suppress_network_errors_during_navigation_link.js b/app/assets/javascripts/lib/apollo/suppress_network_errors_during_navigation_link.js
new file mode 100644
index 00000000000..ad92bd4de42
--- /dev/null
+++ b/app/assets/javascripts/lib/apollo/suppress_network_errors_during_navigation_link.js
@@ -0,0 +1,36 @@
+import { Observable } from 'apollo-link';
+import { onError } from 'apollo-link-error';
+import { isNavigatingAway } from '~/lib/utils/is_navigating_away';
+
+/**
+ * Returns an ApolloLink (or null if not enabled) which supresses network
+ * errors when the browser is navigating away.
+ *
+ * @returns {ApolloLink|null}
+ */
+export const getSuppressNetworkErrorsDuringNavigationLink = () => {
+ if (!gon.features?.suppressApolloErrorsDuringNavigation) {
+ return null;
+ }
+
+ return onError(({ networkError }) => {
+ if (networkError && isNavigatingAway()) {
+ // Return an observable that will never notify any subscribers with any
+ // values, errors, or completions. This ensures that requests aborted due
+ // to navigating away do not trigger any failure behaviour.
+ //
+ // See '../utils/suppress_ajax_errors_during_navigation.js' for an axios
+ // interceptor that performs a similar role.
+ return new Observable(() => {});
+ }
+
+ // We aren't suppressing anything here, so simply do nothing.
+ // The onError helper will forward all values/errors/completions from the
+ // underlying request observable to the next link if you return a falsey
+ // value.
+ //
+ // Note that this return statement is technically redundant, but is kept
+ // for explicitness.
+ return undefined;
+ });
+};
diff --git a/app/assets/javascripts/lib/graphql.js b/app/assets/javascripts/lib/graphql.js
index b96a55fe116..39bf804b54e 100644
--- a/app/assets/javascripts/lib/graphql.js
+++ b/app/assets/javascripts/lib/graphql.js
@@ -11,6 +11,7 @@ import csrf from '~/lib/utils/csrf';
import { objectToQuery, queryToObject } from '~/lib/utils/url_utility';
import PerformanceBarService from '~/performance_bar/services/performance_bar_service';
import { getInstrumentationLink } from './apollo/instrumentation_link';
+import { getSuppressNetworkErrorsDuringNavigationLink } from './apollo/suppress_network_errors_during_navigation_link';
export const fetchPolicies = {
CACHE_FIRST: 'cache-first',
@@ -143,6 +144,7 @@ export default (resolvers = {}, config = {}) => {
new ActionCableLink(),
ApolloLink.from(
[
+ getSuppressNetworkErrorsDuringNavigationLink(),
getInstrumentationLink(),
requestCounterLink,
performanceBarLink,
diff --git a/app/assets/javascripts/lib/logger/hello.js b/app/assets/javascripts/lib/logger/hello.js
index 18fa35ab55b..ccfdfe91e60 100644
--- a/app/assets/javascripts/lib/logger/hello.js
+++ b/app/assets/javascripts/lib/logger/hello.js
@@ -1,15 +1,36 @@
+import { s__, sprintf } from '~/locale';
+
const HANDSHAKE = String.fromCodePoint(0x1f91d);
const MAG = String.fromCodePoint(0x1f50e);
+const ROCKET = String.fromCodePoint(0x1f680);
export const logHello = () => {
// eslint-disable-next-line no-console
console.log(
- `%cWelcome to GitLab!%c
+ `%c${s__('HelloMessage|Welcome to GitLab!')}%c
-Does this page need fixes or improvements? Open an issue or contribute a merge request to help make GitLab more lovable. At GitLab, everyone can contribute!
+${s__(
+ 'HelloMessage|Does this page need fixes or improvements? Open an issue or contribute a merge request to help make GitLab more lovable. At GitLab, everyone can contribute!',
+)}
-${HANDSHAKE} Contribute to GitLab: https://about.gitlab.com/community/contribute/
-${MAG} Create a new GitLab issue: https://gitlab.com/gitlab-org/gitlab/-/issues/new`,
+${sprintf(s__('HelloMessage|%{handshake_emoji} Contribute to GitLab: %{contribute_link}'), {
+ handshake_emoji: `${HANDSHAKE}`,
+ contribute_link: 'https://about.gitlab.com/community/contribute/',
+})}
+${sprintf(s__('HelloMessage|%{magnifier_emoji} Create a new GitLab issue: %{new_issue_link}'), {
+ magnifier_emoji: `${MAG}`,
+ new_issue_link: 'https://gitlab.com/gitlab-org/gitlab/-/issues/new',
+})}
+${
+ window.gon?.dot_com
+ ? `${sprintf(
+ s__(
+ 'HelloMessage|%{rocket_emoji} We like your curiosity! Help us improve GitLab by joining the team: %{jobs_page_link}',
+ ),
+ { rocket_emoji: `${ROCKET}`, jobs_page_link: 'https://about.gitlab.com/jobs/' },
+ )}`
+ : ''
+}`,
`padding-top: 0.5em; font-size: 2em;`,
'padding-bottom: 0.5em;',
);
diff --git a/app/assets/javascripts/lib/utils/axios_utils.js b/app/assets/javascripts/lib/utils/axios_utils.js
index 0a26f78e253..de6d85b8a18 100644
--- a/app/assets/javascripts/lib/utils/axios_utils.js
+++ b/app/assets/javascripts/lib/utils/axios_utils.js
@@ -2,6 +2,7 @@ import axios from 'axios';
import { registerCaptchaModalInterceptor } from '~/captcha/captcha_modal_axios_interceptor';
import setupAxiosStartupCalls from './axios_startup_calls';
import csrf from './csrf';
+import { isNavigatingAway } from './is_navigating_away';
import suppressAjaxErrorsDuringNavigation from './suppress_ajax_errors_during_navigation';
axios.defaults.headers.common[csrf.headerKey] = csrf.token;
@@ -30,16 +31,11 @@ axios.interceptors.response.use(
},
);
-let isUserNavigating = false;
-window.addEventListener('beforeunload', () => {
- isUserNavigating = true;
-});
-
// Ignore AJAX errors caused by requests
// being cancelled due to browser navigation
axios.interceptors.response.use(
(response) => response,
- (err) => suppressAjaxErrorsDuringNavigation(err, isUserNavigating),
+ (err) => suppressAjaxErrorsDuringNavigation(err, isNavigatingAway()),
);
registerCaptchaModalInterceptor(axios);
diff --git a/app/assets/javascripts/lib/utils/color_utils.js b/app/assets/javascripts/lib/utils/color_utils.js
index da2c10076b1..66d52051905 100644
--- a/app/assets/javascripts/lib/utils/color_utils.js
+++ b/app/assets/javascripts/lib/utils/color_utils.js
@@ -1,3 +1,22 @@
+const colorValidatorEl = document.createElement('div');
+
+/**
+ * Validates whether the specified color expression
+ * is supported by the browser’s DOM API and has a valid form.
+ *
+ * This utility assigns the color expression to a detached DOM
+ * element’s color property. If the color expression is valid,
+ * the DOM API will accept the value.
+ *
+ * @param {String} color color expression rgba, hex, hsla, etc.
+ */
+export const isValidColorExpression = (colorExpression) => {
+ colorValidatorEl.style.color = '';
+ colorValidatorEl.style.color = colorExpression;
+
+ return colorValidatorEl.style.color.length > 0;
+};
+
/**
* Convert hex color to rgb array
*
diff --git a/app/assets/javascripts/lib/utils/common_utils.js b/app/assets/javascripts/lib/utils/common_utils.js
index fd9629499b0..813fd3dbb1e 100644
--- a/app/assets/javascripts/lib/utils/common_utils.js
+++ b/app/assets/javascripts/lib/utils/common_utils.js
@@ -6,6 +6,7 @@ import { GlBreakpointInstance as breakpointInstance } from '@gitlab/ui/dist/util
import $ from 'jquery';
import Cookies from 'js-cookie';
import { isFunction, defer } from 'lodash';
+import { SCOPED_LABEL_DELIMITER } from '~/vue_shared/components/sidebar/labels_select_widget/constants';
import { convertToCamelCase, convertToSnakeCase } from './text_utility';
import { isObject } from './type_utility';
import { getLocationHash } from './url_utility';
@@ -685,7 +686,7 @@ export const searchBy = (query = '', searchSpace = {}) => {
* @param {Object} label
* @returns Boolean
*/
-export const isScopedLabel = ({ title = '' } = {}) => title.indexOf('::') !== -1;
+export const isScopedLabel = ({ title = '' } = {}) => title.includes(SCOPED_LABEL_DELIMITER);
/**
* Returns the base value of the scoped label
@@ -696,7 +697,8 @@ export const isScopedLabel = ({ title = '' } = {}) => title.indexOf('::') !== -1
* @param {Object} label
* @returns String
*/
-export const scopedLabelKey = ({ title = '' }) => isScopedLabel({ title }) && title.split('::')[0];
+export const scopedLabelKey = ({ title = '' }) =>
+ isScopedLabel({ title }) && title.split(SCOPED_LABEL_DELIMITER)[0];
// Methods to set and get Cookie
export const setCookie = (name, value) => Cookies.set(name, value, { expires: 365 });
diff --git a/app/assets/javascripts/lib/utils/constants.js b/app/assets/javascripts/lib/utils/constants.js
index e41de72ded4..0e5a23a5cbb 100644
--- a/app/assets/javascripts/lib/utils/constants.js
+++ b/app/assets/javascripts/lib/utils/constants.js
@@ -20,3 +20,7 @@ export const BV_DROPDOWN_HIDE = 'bv::dropdown::hide';
export const DEFAULT_TH_CLASSES =
'gl-bg-transparent! gl-border-b-solid! gl-border-b-gray-100! gl-p-5! gl-border-b-1!';
+
+// We set the drawer's z-index to 252 to clear flash messages that might
+// be displayed in the page and that have a z-index of 251.
+export const DRAWER_Z_INDEX = 252;
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 0a35efb0ac8..3c446c21865 100644
--- a/app/assets/javascripts/lib/utils/datetime/date_format_utility.js
+++ b/app/assets/javascripts/lib/utils/datetime/date_format_utility.js
@@ -1,6 +1,8 @@
import dateFormat from 'dateformat';
-import { isString, mapValues, reduce, isDate } from 'lodash';
-import { s__, n__, __ } from '../../../locale';
+import { isString, mapValues, reduce, isDate, unescape } from 'lodash';
+import { roundToNearestHalf } from '~/lib/utils/common_utils';
+import { sanitize } from '~/lib/dompurify';
+import { s__, n__, __, sprintf } from '../../../locale';
/**
* Returns i18n month names array.
@@ -361,3 +363,26 @@ export const dateToTimeInputValue = (date) => {
hour12: false,
});
};
+
+export const formatTimeAsSummary = ({ seconds, hours, days, minutes, weeks, months }) => {
+ if (months) {
+ return sprintf(s__('ValueStreamAnalytics|%{value}M'), {
+ value: roundToNearestHalf(months),
+ });
+ } else if (weeks) {
+ return sprintf(s__('ValueStreamAnalytics|%{value}w'), {
+ value: roundToNearestHalf(weeks),
+ });
+ } else if (days) {
+ return sprintf(s__('ValueStreamAnalytics|%{value}d'), {
+ value: roundToNearestHalf(days),
+ });
+ } else if (hours) {
+ return sprintf(s__('ValueStreamAnalytics|%{value}h'), { value: hours });
+ } else if (minutes) {
+ return sprintf(s__('ValueStreamAnalytics|%{value}m'), { value: minutes });
+ } else if (seconds) {
+ return unescape(sanitize(s__('ValueStreamAnalytics|&lt;1m'), { ALLOWED_TAGS: [] }));
+ }
+ return '-';
+};
diff --git a/app/assets/javascripts/lib/utils/datetime_range.js b/app/assets/javascripts/lib/utils/datetime_range.js
index a2b161d1446..840cc4600fe 100644
--- a/app/assets/javascripts/lib/utils/datetime_range.js
+++ b/app/assets/javascripts/lib/utils/datetime_range.js
@@ -26,7 +26,17 @@ const isValidDateString = (dateString) => {
return false;
}
- return !Number.isNaN(Date.parse(dateformat(dateString, 'isoUtcDateTime')));
+ let isoFormatted;
+ try {
+ isoFormatted = dateformat(dateString, 'isoUtcDateTime');
+ } catch (e) {
+ if (e instanceof TypeError) {
+ // not a valid date string
+ return false;
+ }
+ throw e;
+ }
+ return !Number.isNaN(Date.parse(isoFormatted));
};
const handleRangeDirection = ({ direction = DEFAULT_DIRECTION, anchorDate, minDate, maxDate }) => {
diff --git a/app/assets/javascripts/lib/utils/is_navigating_away.js b/app/assets/javascripts/lib/utils/is_navigating_away.js
new file mode 100644
index 00000000000..7df00b45379
--- /dev/null
+++ b/app/assets/javascripts/lib/utils/is_navigating_away.js
@@ -0,0 +1,23 @@
+let navigating = false;
+
+window.addEventListener('beforeunload', () => {
+ navigating = true;
+});
+
+/**
+ * To only be used for testing purposes. Allows the navigating state to be set
+ * to a given value.
+ *
+ * @param {boolean} value The value to set the navigating flag to.
+ */
+export const setNavigatingForTestsOnly = (value) => {
+ navigating = value;
+};
+
+/**
+ * Returns a boolean indicating whether the browser is in the process of
+ * navigating away from the current page.
+ *
+ * @returns {boolean}
+ */
+export const isNavigatingAway = () => navigating;
diff --git a/app/assets/javascripts/lib/utils/regexp.js b/app/assets/javascripts/lib/utils/regexp.js
index 25b60dcd14a..f212bf80bd7 100644
--- a/app/assets/javascripts/lib/utils/regexp.js
+++ b/app/assets/javascripts/lib/utils/regexp.js
@@ -1,6 +1,5 @@
/**
* Regexp utility for the convenience of working with regular expressions.
- *
*/
// Inspired by https://github.com/mishoo/UglifyJS/blob/2bc1d02363db3798d5df41fb5059a19edca9b7eb/lib/parse-js.js#L203
@@ -8,4 +7,9 @@
const unicodeLetters =
'\\u0041-\\u005A\\u0061-\\u007A\\u00AA\\u00B5\\u00BA\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02C1\\u02C6-\\u02D1\\u02E0-\\u02E4\\u02EC\\u02EE\\u0370-\\u0374\\u0376\\u0377\\u037A-\\u037D\\u0386\\u0388-\\u038A\\u038C\\u038E-\\u03A1\\u03A3-\\u03F5\\u03F7-\\u0481\\u048A-\\u0527\\u0531-\\u0556\\u0559\\u0561-\\u0587\\u05D0-\\u05EA\\u05F0-\\u05F2\\u0620-\\u064A\\u066E\\u066F\\u0671-\\u06D3\\u06D5\\u06E5\\u06E6\\u06EE\\u06EF\\u06FA-\\u06FC\\u06FF\\u0710\\u0712-\\u072F\\u074D-\\u07A5\\u07B1\\u07CA-\\u07EA\\u07F4\\u07F5\\u07FA\\u0800-\\u0815\\u081A\\u0824\\u0828\\u0840-\\u0858\\u08A0\\u08A2-\\u08AC\\u0904-\\u0939\\u093D\\u0950\\u0958-\\u0961\\u0971-\\u0977\\u0979-\\u097F\\u0985-\\u098C\\u098F\\u0990\\u0993-\\u09A8\\u09AA-\\u09B0\\u09B2\\u09B6-\\u09B9\\u09BD\\u09CE\\u09DC\\u09DD\\u09DF-\\u09E1\\u09F0\\u09F1\\u0A05-\\u0A0A\\u0A0F\\u0A10\\u0A13-\\u0A28\\u0A2A-\\u0A30\\u0A32\\u0A33\\u0A35\\u0A36\\u0A38\\u0A39\\u0A59-\\u0A5C\\u0A5E\\u0A72-\\u0A74\\u0A85-\\u0A8D\\u0A8F-\\u0A91\\u0A93-\\u0AA8\\u0AAA-\\u0AB0\\u0AB2\\u0AB3\\u0AB5-\\u0AB9\\u0ABD\\u0AD0\\u0AE0\\u0AE1\\u0B05-\\u0B0C\\u0B0F\\u0B10\\u0B13-\\u0B28\\u0B2A-\\u0B30\\u0B32\\u0B33\\u0B35-\\u0B39\\u0B3D\\u0B5C\\u0B5D\\u0B5F-\\u0B61\\u0B71\\u0B83\\u0B85-\\u0B8A\\u0B8E-\\u0B90\\u0B92-\\u0B95\\u0B99\\u0B9A\\u0B9C\\u0B9E\\u0B9F\\u0BA3\\u0BA4\\u0BA8-\\u0BAA\\u0BAE-\\u0BB9\\u0BD0\\u0C05-\\u0C0C\\u0C0E-\\u0C10\\u0C12-\\u0C28\\u0C2A-\\u0C33\\u0C35-\\u0C39\\u0C3D\\u0C58\\u0C59\\u0C60\\u0C61\\u0C85-\\u0C8C\\u0C8E-\\u0C90\\u0C92-\\u0CA8\\u0CAA-\\u0CB3\\u0CB5-\\u0CB9\\u0CBD\\u0CDE\\u0CE0\\u0CE1\\u0CF1\\u0CF2\\u0D05-\\u0D0C\\u0D0E-\\u0D10\\u0D12-\\u0D3A\\u0D3D\\u0D4E\\u0D60\\u0D61\\u0D7A-\\u0D7F\\u0D85-\\u0D96\\u0D9A-\\u0DB1\\u0DB3-\\u0DBB\\u0DBD\\u0DC0-\\u0DC6\\u0E01-\\u0E30\\u0E32\\u0E33\\u0E40-\\u0E46\\u0E81\\u0E82\\u0E84\\u0E87\\u0E88\\u0E8A\\u0E8D\\u0E94-\\u0E97\\u0E99-\\u0E9F\\u0EA1-\\u0EA3\\u0EA5\\u0EA7\\u0EAA\\u0EAB\\u0EAD-\\u0EB0\\u0EB2\\u0EB3\\u0EBD\\u0EC0-\\u0EC4\\u0EC6\\u0EDC-\\u0EDF\\u0F00\\u0F40-\\u0F47\\u0F49-\\u0F6C\\u0F88-\\u0F8C\\u1000-\\u102A\\u103F\\u1050-\\u1055\\u105A-\\u105D\\u1061\\u1065\\u1066\\u106E-\\u1070\\u1075-\\u1081\\u108E\\u10A0-\\u10C5\\u10C7\\u10CD\\u10D0-\\u10FA\\u10FC-\\u1248\\u124A-\\u124D\\u1250-\\u1256\\u1258\\u125A-\\u125D\\u1260-\\u1288\\u128A-\\u128D\\u1290-\\u12B0\\u12B2-\\u12B5\\u12B8-\\u12BE\\u12C0\\u12C2-\\u12C5\\u12C8-\\u12D6\\u12D8-\\u1310\\u1312-\\u1315\\u1318-\\u135A\\u1380-\\u138F\\u13A0-\\u13F4\\u1401-\\u166C\\u166F-\\u167F\\u1681-\\u169A\\u16A0-\\u16EA\\u16EE-\\u16F0\\u1700-\\u170C\\u170E-\\u1711\\u1720-\\u1731\\u1740-\\u1751\\u1760-\\u176C\\u176E-\\u1770\\u1780-\\u17B3\\u17D7\\u17DC\\u1820-\\u1877\\u1880-\\u18A8\\u18AA\\u18B0-\\u18F5\\u1900-\\u191C\\u1950-\\u196D\\u1970-\\u1974\\u1980-\\u19AB\\u19C1-\\u19C7\\u1A00-\\u1A16\\u1A20-\\u1A54\\u1AA7\\u1B05-\\u1B33\\u1B45-\\u1B4B\\u1B83-\\u1BA0\\u1BAE\\u1BAF\\u1BBA-\\u1BE5\\u1C00-\\u1C23\\u1C4D-\\u1C4F\\u1C5A-\\u1C7D\\u1CE9-\\u1CEC\\u1CEE-\\u1CF1\\u1CF5\\u1CF6\\u1D00-\\u1DBF\\u1E00-\\u1F15\\u1F18-\\u1F1D\\u1F20-\\u1F45\\u1F48-\\u1F4D\\u1F50-\\u1F57\\u1F59\\u1F5B\\u1F5D\\u1F5F-\\u1F7D\\u1F80-\\u1FB4\\u1FB6-\\u1FBC\\u1FBE\\u1FC2-\\u1FC4\\u1FC6-\\u1FCC\\u1FD0-\\u1FD3\\u1FD6-\\u1FDB\\u1FE0-\\u1FEC\\u1FF2-\\u1FF4\\u1FF6-\\u1FFC\\u2071\\u207F\\u2090-\\u209C\\u2102\\u2107\\u210A-\\u2113\\u2115\\u2119-\\u211D\\u2124\\u2126\\u2128\\u212A-\\u212D\\u212F-\\u2139\\u213C-\\u213F\\u2145-\\u2149\\u214E\\u2160-\\u2188\\u2C00-\\u2C2E\\u2C30-\\u2C5E\\u2C60-\\u2CE4\\u2CEB-\\u2CEE\\u2CF2\\u2CF3\\u2D00-\\u2D25\\u2D27\\u2D2D\\u2D30-\\u2D67\\u2D6F\\u2D80-\\u2D96\\u2DA0-\\u2DA6\\u2DA8-\\u2DAE\\u2DB0-\\u2DB6\\u2DB8-\\u2DBE\\u2DC0-\\u2DC6\\u2DC8-\\u2DCE\\u2DD0-\\u2DD6\\u2DD8-\\u2DDE\\u2E2F\\u3005-\\u3007\\u3021-\\u3029\\u3031-\\u3035\\u3038-\\u303C\\u3041-\\u3096\\u309D-\\u309F\\u30A1-\\u30FA\\u30FC-\\u30FF\\u3105-\\u312D\\u3131-\\u318E\\u31A0-\\u31BA\\u31F0-\\u31FF\\u3400-\\u4DB5\\u4E00-\\u9FCC\\uA000-\\uA48C\\uA4D0-\\uA4FD\\uA500-\\uA60C\\uA610-\\uA61F\\uA62A\\uA62B\\uA640-\\uA66E\\uA67F-\\uA697\\uA6A0-\\uA6EF\\uA717-\\uA71F\\uA722-\\uA788\\uA78B-\\uA78E\\uA790-\\uA793\\uA7A0-\\uA7AA\\uA7F8-\\uA801\\uA803-\\uA805\\uA807-\\uA80A\\uA80C-\\uA822\\uA840-\\uA873\\uA882-\\uA8B3\\uA8F2-\\uA8F7\\uA8FB\\uA90A-\\uA925\\uA930-\\uA946\\uA960-\\uA97C\\uA984-\\uA9B2\\uA9CF\\uAA00-\\uAA28\\uAA40-\\uAA42\\uAA44-\\uAA4B\\uAA60-\\uAA76\\uAA7A\\uAA80-\\uAAAF\\uAAB1\\uAAB5\\uAAB6\\uAAB9-\\uAABD\\uAAC0\\uAAC2\\uAADB-\\uAADD\\uAAE0-\\uAAEA\\uAAF2-\\uAAF4\\uAB01-\\uAB06\\uAB09-\\uAB0E\\uAB11-\\uAB16\\uAB20-\\uAB26\\uAB28-\\uAB2E\\uABC0-\\uABE2\\uAC00-\\uD7A3\\uD7B0-\\uD7C6\\uD7CB-\\uD7FB\\uF900-\\uFA6D\\uFA70-\\uFAD9\\uFB00-\\uFB06\\uFB13-\\uFB17\\uFB1D\\uFB1F-\\uFB28\\uFB2A-\\uFB36\\uFB38-\\uFB3C\\uFB3E\\uFB40\\uFB41\\uFB43\\uFB44\\uFB46-\\uFBB1\\uFBD3-\\uFD3D\\uFD50-\\uFD8F\\uFD92-\\uFDC7\\uFDF0-\\uFDFB\\uFE70-\\uFE74\\uFE76-\\uFEFC\\uFF21-\\uFF3A\\uFF41-\\uFF5A\\uFF66-\\uFFBE\\uFFC2-\\uFFC7\\uFFCA-\\uFFCF\\uFFD2-\\uFFD7\\uFFDA-\\uFFDC';
-export default { unicodeLetters };
+/**
+ * A regex that matches all single quotes in a string
+ */
+export const allSingleQuotes = /'/g;
+
+export default { unicodeLetters, allSingleQuotes };
diff --git a/app/assets/javascripts/lib/utils/text_utility.js b/app/assets/javascripts/lib/utils/text_utility.js
index 5ee00464a8b..419afa0a0a9 100644
--- a/app/assets/javascripts/lib/utils/text_utility.js
+++ b/app/assets/javascripts/lib/utils/text_utility.js
@@ -4,6 +4,7 @@ import {
TRUNCATE_WIDTH_DEFAULT_WIDTH,
TRUNCATE_WIDTH_DEFAULT_FONT_SIZE,
} from '~/lib/utils/constants';
+import { allSingleQuotes } from '~/lib/utils/regexp';
/**
* Adds a , to a string composed by numbers, at every 3 chars.
@@ -479,3 +480,17 @@ export const markdownConfig = {
ALLOWED_ATTR: ['class', 'style', 'href', 'src'],
ALLOW_DATA_ATTR: false,
};
+
+/**
+ * Escapes a string into a shell string, for example
+ * when you want to give a user the command to checkout
+ * a branch.
+ *
+ * It replaces all single-quotes with an escaped "'\''"
+ * that is interpreted by shell as a single-quote. It also
+ * encapsulates the string in single-quotes.
+ *
+ * If the branch is `fix-'bug-behavior'`, that should be
+ * escaped to `'fix-'\''bug-behavior'\'''`.
+ */
+export const escapeShellString = (str) => `'${str.replace(allSingleQuotes, () => "'\\''")}'`;
diff --git a/app/assets/javascripts/lib/utils/url_utility.js b/app/assets/javascripts/lib/utils/url_utility.js
index bca0e45d98d..1c22d21a313 100644
--- a/app/assets/javascripts/lib/utils/url_utility.js
+++ b/app/assets/javascripts/lib/utils/url_utility.js
@@ -1,3 +1,5 @@
+export const DASH_SCOPE = '-';
+
const PATH_SEPARATOR = '/';
const PATH_SEPARATOR_LEADING_REGEX = new RegExp(`^${PATH_SEPARATOR}+`);
const PATH_SEPARATOR_ENDING_REGEX = new RegExp(`${PATH_SEPARATOR}+$`);
@@ -588,3 +590,30 @@ export function isSameOriginUrl(url) {
return false;
}
}
+
+/**
+ * Returns a URL to WebIDE considering the current user's position in
+ * repository's tree. If not MR `iid` has been passed, the URL is fetched
+ * from the global `gl.webIDEPath`.
+ *
+ * @param sourceProjectFullPath Source project's full path. Used in MRs
+ * @param targetProjectFullPath Target project's full path. Used in MRs
+ * @param iid MR iid
+ * @returns {string}
+ */
+
+export function constructWebIDEPath({
+ sourceProjectFullPath,
+ targetProjectFullPath = '',
+ iid,
+} = {}) {
+ if (!iid || !sourceProjectFullPath) {
+ return window.gl?.webIDEPath;
+ }
+ return mergeUrlParams(
+ {
+ target_project: sourceProjectFullPath !== targetProjectFullPath ? targetProjectFullPath : '',
+ },
+ webIDEUrl(`/${sourceProjectFullPath}/merge_requests/${iid}`),
+ );
+}
diff --git a/app/assets/javascripts/logs/components/environment_logs.vue b/app/assets/javascripts/logs/components/environment_logs.vue
index 3db9fa01629..2a60825a427 100644
--- a/app/assets/javascripts/logs/components/environment_logs.vue
+++ b/app/assets/javascripts/logs/components/environment_logs.vue
@@ -214,7 +214,7 @@ export default {
<template #items>
<pre
ref="logTrace"
- class="build-trace"
+ class="build-log"
><code class="bash js-build-output"><div v-if="showLoader" class="build-loader-animation js-build-loader-animation">
<div class="dot"></div>
<div class="dot"></div>
diff --git a/app/assets/javascripts/logs/stores/state.js b/app/assets/javascripts/logs/stores/state.js
index 83080589362..ee17e8ecef2 100644
--- a/app/assets/javascripts/logs/stores/state.js
+++ b/app/assets/javascripts/logs/stores/state.js
@@ -31,7 +31,7 @@ export default () => ({
},
/**
- * Logs including trace
+ * Jobs with logs
*/
logs: {
lines: [],
diff --git a/app/assets/javascripts/main.js b/app/assets/javascripts/main.js
index b96a2607552..e422d9b1a32 100644
--- a/app/assets/javascripts/main.js
+++ b/app/assets/javascripts/main.js
@@ -1,5 +1,4 @@
/* global $ */
-/* eslint-disable import/order */
import jQuery from 'jquery';
import Cookies from 'js-cookie';
@@ -15,6 +14,7 @@ import { GlBreakpointInstance as bp } from '@gitlab/ui/dist/utils';
import { initRails } from '~/lib/utils/rails_ujs';
import * as popovers from '~/popovers';
import * as tooltips from '~/tooltips';
+import { initHeaderSearchApp } from '~/header_search';
import initAlertHandler from './alert_handler';
import { removeFlashClickListener } from './flash';
import initTodoToggle from './header';
@@ -36,7 +36,6 @@ import GlFieldErrors from './gl_field_errors';
import initUserPopovers from './user_popovers';
import initBroadcastNotifications from './broadcast_notification';
import { initTopNav } from './nav';
-import { initHeaderSearchApp } from '~/header_search';
import 'ee_else_ce/main_ee';
import 'jh_else_ce/main_jh';
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 665e8ee69f7..69137ce615b 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
@@ -42,7 +42,7 @@ export default {
required: false,
default: false,
},
- oncallSchedules: {
+ userDeletionObstacles: {
type: Object,
required: false,
default: () => ({}),
@@ -61,7 +61,7 @@ export default {
memberPath: this.memberPath.replace(':id', this.memberId),
memberType: this.memberType,
message: this.message,
- oncallSchedules: this.oncallSchedules,
+ userDeletionObstacles: this.userDeletionObstacles,
};
},
},
diff --git a/app/assets/javascripts/members/components/action_buttons/user_action_buttons.vue b/app/assets/javascripts/members/components/action_buttons/user_action_buttons.vue
index 0c20f935d50..44d658c90a0 100644
--- a/app/assets/javascripts/members/components/action_buttons/user_action_buttons.vue
+++ b/app/assets/javascripts/members/components/action_buttons/user_action_buttons.vue
@@ -1,5 +1,6 @@
<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';
@@ -49,9 +50,11 @@ export default {
},
);
},
- oncallScheduleUserData() {
- const { user: { name, oncallSchedules: schedules } = {} } = this.member;
- return { name, schedules };
+ userDeletionObstaclesUserData() {
+ return {
+ name: this.member.user?.name,
+ obstacles: parseUserDeletionObstacles(this.member.user),
+ };
},
},
};
@@ -65,7 +68,7 @@ export default {
v-else
:member-id="member.id"
:member-type="member.type"
- :oncall-schedules="oncallScheduleUserData"
+ :user-deletion-obstacles="userDeletionObstaclesUserData"
:message="message"
:title="s__('Member|Remove member')"
/>
diff --git a/app/assets/javascripts/members/components/modals/leave_modal.vue b/app/assets/javascripts/members/components/modals/leave_modal.vue
index 44178981136..e39669e17dd 100644
--- a/app/assets/javascripts/members/components/modals/leave_modal.vue
+++ b/app/assets/javascripts/members/components/modals/leave_modal.vue
@@ -3,7 +3,8 @@ import { GlModal, GlForm, GlSprintf, GlTooltipDirective } from '@gitlab/ui';
import { mapState } from 'vuex';
import csrf from '~/lib/utils/csrf';
import { __, s__, sprintf } from '~/locale';
-import OncallSchedulesList from '~/vue_shared/components/oncall_schedules_list.vue';
+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';
export default {
@@ -20,7 +21,7 @@ export default {
csrf,
modalId: LEAVE_MODAL_ID,
modalContent: s__('Members|Are you sure you want to leave "%{source}"?'),
- components: { GlModal, GlForm, GlSprintf, OncallSchedulesList },
+ components: { GlModal, GlForm, GlSprintf, UserDeletionObstaclesList },
directives: {
GlTooltip: GlTooltipDirective,
},
@@ -43,11 +44,11 @@ export default {
modalTitle() {
return sprintf(s__('Members|Leave "%{source}"'), { source: this.member.source.fullName });
},
- schedules() {
- return this.member.user?.oncallSchedules;
+ obstacles() {
+ return parseUserDeletionObstacles(this.member.user);
},
- isPartOfOnCallSchedules() {
- return this.schedules?.length;
+ hasObstaclesToUserDeletion() {
+ return this.obstacles?.length;
},
},
methods: {
@@ -74,9 +75,9 @@ export default {
</gl-sprintf>
</p>
- <oncall-schedules-list
- v-if="isPartOfOnCallSchedules"
- :schedules="schedules"
+ <user-deletion-obstacles-list
+ v-if="hasObstaclesToUserDeletion"
+ :obstacles="obstacles"
:is-current-user="true"
/>
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 00b6ebf9a73..b82fb0030ff 100644
--- a/app/assets/javascripts/members/components/modals/remove_member_modal.vue
+++ b/app/assets/javascripts/members/components/modals/remove_member_modal.vue
@@ -3,7 +3,7 @@ import { GlFormCheckbox, GlModal } from '@gitlab/ui';
import { mapActions, mapState } from 'vuex';
import csrf from '~/lib/utils/csrf';
import { s__, __ } from '~/locale';
-import OncallSchedulesList from '~/vue_shared/components/oncall_schedules_list.vue';
+import UserDeletionObstaclesList from '~/vue_shared/components/user_deletion_obstacles/user_deletion_obstacles_list.vue';
export default {
actionCancel: {
@@ -13,7 +13,7 @@ export default {
components: {
GlFormCheckbox,
GlModal,
- OncallSchedulesList,
+ UserDeletionObstaclesList,
},
inject: ['namespace'],
computed: {
@@ -33,8 +33,8 @@ export default {
message(state) {
return state[this.namespace].removeMemberModalData.message;
},
- oncallSchedules(state) {
- return state[this.namespace].removeMemberModalData.oncallSchedules ?? {};
+ userDeletionObstacles(state) {
+ return state[this.namespace].removeMemberModalData.userDeletionObstacles ?? {};
},
removeMemberModalVisible(state) {
return state[this.namespace].removeMemberModalVisible;
@@ -60,11 +60,11 @@ export default {
},
};
},
- showUnassignIssuablesCheckbox() {
+ hasWorkspaceAccess() {
return !this.isAccessRequest && !this.isInvite;
},
- isPartOfOncallSchedules() {
- return !this.isAccessRequest && this.oncallSchedules.schedules?.length;
+ hasObstaclesToUserDeletion() {
+ return this.hasWorkspaceAccess && this.userDeletionObstacles.obstacles?.length;
},
},
methods: {
@@ -95,10 +95,10 @@ export default {
<form ref="form" :action="memberPath" method="post">
<p>{{ message }}</p>
- <oncall-schedules-list
- v-if="isPartOfOncallSchedules"
- :schedules="oncallSchedules.schedules"
- :user-name="oncallSchedules.name"
+ <user-deletion-obstacles-list
+ v-if="hasObstaclesToUserDeletion"
+ :obstacles="userDeletionObstacles.obstacles"
+ :user-name="userDeletionObstacles.name"
/>
<input ref="method" type="hidden" name="_method" value="delete" />
@@ -106,7 +106,7 @@ export default {
<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="showUnassignIssuablesCheckbox" name="unassign_issuables">
+ <gl-form-checkbox v-if="hasWorkspaceAccess" name="unassign_issuables">
{{ __('Also unassign this user from related issues and merge requests') }}
</gl-form-checkbox>
</form>
diff --git a/app/assets/javascripts/members/components/table/expires_at.vue b/app/assets/javascripts/members/components/table/expires_at.vue
deleted file mode 100644
index c91de061b50..00000000000
--- a/app/assets/javascripts/members/components/table/expires_at.vue
+++ /dev/null
@@ -1,66 +0,0 @@
-<script>
-import { GlSprintf, GlTooltipDirective } from '@gitlab/ui';
-import {
- approximateDuration,
- differenceInSeconds,
- formatDate,
- getDayDifference,
-} from '~/lib/utils/datetime_utility';
-import { DAYS_TO_EXPIRE_SOON } from '../../constants';
-
-export default {
- name: 'ExpiresAt',
- components: { GlSprintf },
- directives: {
- GlTooltip: GlTooltipDirective,
- },
- props: {
- date: {
- type: String,
- required: false,
- default: null,
- },
- },
- computed: {
- noExpirationSet() {
- return this.date === null;
- },
- parsed() {
- return new Date(this.date);
- },
- differenceInSeconds() {
- return differenceInSeconds(new Date(), this.parsed);
- },
- isExpired() {
- return this.differenceInSeconds <= 0;
- },
- inWords() {
- return approximateDuration(this.differenceInSeconds);
- },
- formatted() {
- return formatDate(this.parsed);
- },
- expiresSoon() {
- return getDayDifference(new Date(), this.parsed) < DAYS_TO_EXPIRE_SOON;
- },
- cssClass() {
- return {
- 'gl-text-red-500': this.isExpired,
- 'gl-text-orange-500': this.expiresSoon,
- };
- },
- },
-};
-</script>
-
-<template>
- <span v-if="noExpirationSet">{{ s__('Members|No expiration set') }}</span>
- <span v-else v-gl-tooltip.hover :title="formatted" :class="cssClass">
- <template v-if="isExpired">{{ s__('Members|Expired') }}</template>
- <gl-sprintf v-else :message="s__('Members|in %{time}')">
- <template #time>
- {{ inWords }}
- </template>
- </gl-sprintf>
- </span>
-</template>
diff --git a/app/assets/javascripts/members/components/table/members_table.vue b/app/assets/javascripts/members/components/table/members_table.vue
index debc3fc31f6..202f3aa89e1 100644
--- a/app/assets/javascripts/members/components/table/members_table.vue
+++ b/app/assets/javascripts/members/components/table/members_table.vue
@@ -5,12 +5,17 @@ import MembersTableCell from 'ee_else_ce/members/components/table/members_table_
import { canOverride, canRemove, canResend, canUpdate } from 'ee_else_ce/members/utils';
import { mergeUrlParams } from '~/lib/utils/url_utility';
import initUserPopovers from '~/user_popovers';
-import { FIELDS, ACTIVE_TAB_QUERY_PARAM_NAME } from '../../constants';
+import {
+ FIELDS,
+ ACTIVE_TAB_QUERY_PARAM_NAME,
+ MEMBER_STATE_AWAITING,
+ USER_STATE_BLOCKED_PENDING_APPROVAL,
+ BADGE_LABELS_PENDING_OWNER_APPROVAL,
+} from '../../constants';
import RemoveGroupLinkModal from '../modals/remove_group_link_modal.vue';
import RemoveMemberModal from '../modals/remove_member_modal.vue';
import CreatedAt from './created_at.vue';
import ExpirationDatepicker from './expiration_datepicker.vue';
-import ExpiresAt from './expires_at.vue';
import MemberActionButtons from './member_action_buttons.vue';
import MemberAvatar from './member_avatar.vue';
import MemberSource from './member_source.vue';
@@ -24,7 +29,6 @@ export default {
GlPagination,
MemberAvatar,
CreatedAt,
- ExpiresAt,
MembersTableCell,
MemberSource,
MemberActionButtons,
@@ -131,6 +135,74 @@ export default {
window.location.href,
);
},
+ /**
+ * Returns whether it's a new or existing user
+ *
+ * If memberInviteMetadata doesn't exist, it means we're adding an existing user
+ * to the Group/Project, so `isNewUser` should be false.
+ * If memberInviteMetadata exists but `userState` has content,
+ * the user has registered but is awaiting root approval
+ *
+ * @param {object} memberInviteMetadata - MemberEntity.invite
+ * @see {@link ~/app/serializers/member_entity.rb}
+ * @returns {boolean}
+ */
+ isNewUser(memberInviteMetadata) {
+ return memberInviteMetadata && !memberInviteMetadata.userState;
+ },
+ /**
+ * Returns whether the user is awaiting root approval
+ *
+ * This checks User.state exposed via MemberEntity
+ *
+ * @param {object} memberInviteMetadata - MemberEntity.invite
+ * @see {@link ~/app/serializers/member_entity.rb}
+ * @returns {boolean}
+ */
+ isUserPendingRootApproval(memberInviteMetadata) {
+ return memberInviteMetadata?.userState === USER_STATE_BLOCKED_PENDING_APPROVAL;
+ },
+ /**
+ * Returns whether the member is awaiting owner approval
+ *
+ * This checks Member.state exposed via MemberEntity
+ *
+ * @param {Number} memberState - Member.state exposed via MemberEntity.state
+ * @see {@link ~/ee/app/models/ee/member.rb}
+ * @see {@link ~/app/serializers/member_entity.rb}
+ * @returns {boolean}
+ */
+ isMemberPendingOwnerApproval(memberState) {
+ return memberState === MEMBER_STATE_AWAITING;
+ },
+ isUserAwaiting(memberInviteMetadata, memberState) {
+ return (
+ this.isUserPendingRootApproval(memberInviteMetadata) ||
+ this.isMemberPendingOwnerApproval(memberState)
+ );
+ },
+ shouldAddPendingOwnerApprovalBadge(memberInviteMetadata, memberState) {
+ return (
+ this.isUserAwaiting(memberInviteMetadata, memberState) &&
+ !this.isNewUser(memberInviteMetadata)
+ );
+ },
+ /**
+ * Returns the string to be used in the invite badge
+ *
+ * @param {object} memberInviteMetadata - MemberEntity.invite
+ * @see {@link ~/app/serializers/member_entity.rb}
+ * @param {Number} memberState - Member.state exposed via MemberEntity.state
+ * @see {@link ~/ee/app/models/ee/member.rb}
+ * @returns {string}
+ */
+ inviteBadge(memberInviteMetadata, memberState) {
+ if (this.shouldAddPendingOwnerApprovalBadge(memberInviteMetadata, memberState)) {
+ return BADGE_LABELS_PENDING_OWNER_APPROVAL;
+ }
+
+ return '';
+ },
},
};
</script>
@@ -174,18 +246,17 @@ export default {
<created-at :date="createdAt" :created-by="createdBy" />
</template>
- <template #cell(invited)="{ item: { createdAt, createdBy } }">
+ <template #cell(invited)="{ item: { createdAt, createdBy, invite, state } }">
<created-at :date="createdAt" :created-by="createdBy" />
+ <gl-badge v-if="inviteBadge(invite, state)" data-testid="invited-badge">{{
+ inviteBadge(invite, state)
+ }}</gl-badge>
</template>
<template #cell(requested)="{ item: { createdAt } }">
<created-at :date="createdAt" />
</template>
- <template #cell(expires)="{ item: { expiresAt } }">
- <expires-at :date="expiresAt" />
- </template>
-
<template #cell(maxRole)="{ item: member }">
<members-table-cell #default="{ permissions }" :member="member">
<role-dropdown v-if="permissions.canUpdate" :permissions="permissions" :member="member" />
diff --git a/app/assets/javascripts/members/constants.js b/app/assets/javascripts/members/constants.js
index 6f465245d20..f5ca881ab0d 100644
--- a/app/assets/javascripts/members/constants.js
+++ b/app/assets/javascripts/members/constants.js
@@ -38,12 +38,6 @@ export const FIELDS = [
tdClass: 'col-meta',
},
{
- key: 'expires',
- label: __('Access expires'),
- thClass: 'col-meta',
- tdClass: 'col-meta',
- },
- {
key: 'maxRole',
label: __('Max role'),
thClass: 'col-max-role',
@@ -95,6 +89,22 @@ export const TAB_QUERY_PARAM_VALUES = {
accessRequest: 'access_requests',
};
+/**
+ * This user state value comes from the User model
+ * see the state machine in app/models/user.rb
+ */
+export const USER_STATE_BLOCKED_PENDING_APPROVAL = 'blocked_pending_approval';
+
+/**
+ * This and following member state constants' values
+ * come from ee/app/models/ee/member.rb
+ */
+export const MEMBER_STATE_CREATED = 0;
+export const MEMBER_STATE_AWAITING = 1;
+export const MEMBER_STATE_ACTIVE = 2;
+
+export const BADGE_LABELS_PENDING_OWNER_APPROVAL = __('Pending owner approval');
+
export const DAYS_TO_EXPIRE_SOON = 7;
export const LEAVE_MODAL_ID = 'member-leave-modal';
diff --git a/app/assets/javascripts/merge_conflicts/components/inline_conflict_lines.vue b/app/assets/javascripts/merge_conflicts/components/inline_conflict_lines.vue
index a856d38c089..87eeb272659 100644
--- a/app/assets/javascripts/merge_conflicts/components/inline_conflict_lines.vue
+++ b/app/assets/javascripts/merge_conflicts/components/inline_conflict_lines.vue
@@ -35,7 +35,11 @@ export default {
<td :class="lineCssClass(line)" class="diff-line-num header"></td>
<td :class="lineCssClass(line)" class="line_content header">
<strong>{{ line.richText }}</strong>
- <button type="button" @click="handleSelected({ file, line })">
+ <button
+ type="button"
+ class="gl-border-1 gl-border-solid"
+ @click="handleSelected({ file, line })"
+ >
{{ line.buttonTitle }}
</button>
</td>
diff --git a/app/assets/javascripts/merge_conflicts/components/parallel_conflict_lines.vue b/app/assets/javascripts/merge_conflicts/components/parallel_conflict_lines.vue
index 2c89b614c87..2c59e7bfa2f 100644
--- a/app/assets/javascripts/merge_conflicts/components/parallel_conflict_lines.vue
+++ b/app/assets/javascripts/merge_conflicts/components/parallel_conflict_lines.vue
@@ -35,7 +35,11 @@ export default {
<td class="diff-line-num header" :class="lineCssClass(line)"></td>
<td class="line_content header" :class="lineCssClass(line)">
<strong>{{ line.richText }}</strong>
- <button type="button" @click="handleSelected({ file, line })">
+ <button
+ type="button"
+ class="gl-border-1 gl-border-solid"
+ @click="handleSelected({ file, line })"
+ >
{{ line.buttonTitle }}
</button>
</td>
diff --git a/app/assets/javascripts/merge_request.js b/app/assets/javascripts/merge_request.js
index ed32f26583e..244cf1e150a 100644
--- a/app/assets/javascripts/merge_request.js
+++ b/app/assets/javascripts/merge_request.js
@@ -2,6 +2,7 @@
import $ from 'jquery';
import createFlash from '~/flash';
+import toast from '~/vue_shared/plugins/global_toast';
import { __ } from '~/locale';
import eventHub from '~/vue_merge_request_widget/event_hub';
import axios from './lib/utils/axios_utils';
@@ -136,10 +137,9 @@ MergeRequest.hideCloseButton = function () {
MergeRequest.toggleDraftStatus = function (title, isReady) {
if (isReady) {
- createFlash({
- message: __('Marked as ready. Merging is now allowed.'),
- type: 'notice',
- });
+ toast(__('Marked as ready. Merging is now allowed.'));
+ } else {
+ toast(__('Marked as draft. Can only be merged when marked as ready.'));
}
const titleEl = document.querySelector('.merge-request .detail-page-description .title');
diff --git a/app/assets/javascripts/mr_popover/index.js b/app/assets/javascripts/mr_popover/index.js
index 714cf67e0bd..6e46c5d3c1f 100644
--- a/app/assets/javascripts/mr_popover/index.js
+++ b/app/assets/javascripts/mr_popover/index.js
@@ -48,7 +48,12 @@ export default (elements) => {
Vue.use(VueApollo);
const apolloProvider = new VueApollo({
- defaultClient: createDefaultClient(),
+ defaultClient: createDefaultClient(
+ {},
+ {
+ assumeImmutableResults: true,
+ },
+ ),
});
const listenerAddedAttr = 'data-mr-listener-added';
diff --git a/app/assets/javascripts/namespace_select.js b/app/assets/javascripts/namespace_select.js
deleted file mode 100644
index af7a600d1ad..00000000000
--- a/app/assets/javascripts/namespace_select.js
+++ /dev/null
@@ -1,58 +0,0 @@
-import $ from 'jquery';
-import initDeprecatedJQueryDropdown from '~/deprecated_jquery_dropdown';
-import { parseBoolean } from '~/lib/utils/common_utils';
-import Api from './api';
-import { mergeUrlParams } from './lib/utils/url_utility';
-import { __ } from './locale';
-
-export default class NamespaceSelect {
- constructor(opts) {
- const isFilter = parseBoolean(opts.dropdown.dataset.isFilter);
- const fieldName = opts.dropdown.dataset.fieldName || 'namespace_id';
-
- initDeprecatedJQueryDropdown($(opts.dropdown), {
- filterable: true,
- selectable: true,
- filterRemote: true,
- search: {
- fields: ['path'],
- },
- fieldName,
- toggleLabel(selected) {
- if (selected.id == null) {
- return selected.text;
- }
- return `${selected.kind}: ${selected.full_path}`;
- },
- data(term, dataCallback) {
- return Api.namespaces(term, (namespaces) => {
- if (isFilter) {
- const anyNamespace = {
- text: __('Any namespace'),
- id: null,
- };
- namespaces.unshift(anyNamespace);
- namespaces.splice(1, 0, { type: 'divider' });
- }
- return dataCallback(namespaces);
- });
- },
- text(namespace) {
- if (namespace.id == null) {
- return namespace.text;
- }
- return `${namespace.kind}: ${namespace.full_path}`;
- },
- renderRow: this.renderRow,
- clicked(options) {
- if (!isFilter) {
- const { e } = options;
- e.preventDefault();
- }
- },
- url(namespace) {
- return mergeUrlParams({ [fieldName]: namespace.id }, window.location.href);
- },
- });
- }
-}
diff --git a/app/assets/javascripts/notebook/cells/markdown.vue b/app/assets/javascripts/notebook/cells/markdown.vue
index 1384c9c40b3..073b27605bb 100644
--- a/app/assets/javascripts/notebook/cells/markdown.vue
+++ b/app/assets/javascripts/notebook/cells/markdown.vue
@@ -1,6 +1,7 @@
<script>
import katex from 'katex';
import marked from 'marked';
+import { GlSafeHtmlDirective as SafeHtml } from '@gitlab/ui';
import { sanitize } from '~/lib/dompurify';
import { hasContent, markdownConfig } from '~/lib/utils/text_utility';
import Prompt from './prompt.vue';
@@ -138,6 +139,9 @@ export default {
components: {
prompt: Prompt,
},
+ directives: {
+ SafeHtml,
+ },
inject: ['relativeRawPath'],
props: {
cell: {
@@ -150,16 +154,17 @@ export default {
renderer.attachments = this.cell.attachments;
renderer.relativeRawPath = this.relativeRawPath;
- return sanitize(marked(this.cell.source.join('').replace(/\\/g, '\\\\')), markdownConfig);
+ return marked(this.cell.source.join('').replace(/\\/g, '\\\\'));
},
},
+ markdownConfig,
};
</script>
<template>
<div class="cell text-cell">
<prompt />
- <div class="markdown" v-html="markdown /* eslint-disable-line vue/no-v-html */"></div>
+ <div v-safe-html:[$options.markdownConfig]="markdown" class="markdown"></div>
</div>
</template>
diff --git a/app/assets/javascripts/notes/components/comment_type_dropdown.vue b/app/assets/javascripts/notes/components/comment_type_dropdown.vue
index 663a912999d..30ea5d3532e 100644
--- a/app/assets/javascripts/notes/components/comment_type_dropdown.vue
+++ b/app/assets/javascripts/notes/components/comment_type_dropdown.vue
@@ -96,7 +96,11 @@ export default {
data-track-action="click_button"
@click="$emit('click')"
>
- <gl-dropdown-item is-check-item :is-checked="isNoteTypeComment" @click="setNoteTypeToComment">
+ <gl-dropdown-item
+ is-check-item
+ :is-checked="isNoteTypeComment"
+ @click.stop.prevent="setNoteTypeToComment"
+ >
<strong>{{ $options.i18n.submitButton.comment }}</strong>
<p class="gl-m-0">{{ commentDescription }}</p>
</gl-dropdown-item>
@@ -105,7 +109,7 @@ export default {
is-check-item
:is-checked="isNoteTypeDiscussion"
data-qa-selector="discussion_menu_item"
- @click="setNoteTypeToDiscussion"
+ @click.stop.prevent="setNoteTypeToDiscussion"
>
<strong>{{ $options.i18n.submitButton.startThread }}</strong>
<p class="gl-m-0">{{ startDiscussionDescription }}</p>
diff --git a/app/assets/javascripts/notes/components/discussion_notes.vue b/app/assets/javascripts/notes/components/discussion_notes.vue
index 0892276ff3b..6fcfa66ea49 100644
--- a/app/assets/javascripts/notes/components/discussion_notes.vue
+++ b/app/assets/javascripts/notes/components/discussion_notes.vue
@@ -47,6 +47,11 @@ export default {
required: false,
default: '',
},
+ isOverviewTab: {
+ type: Boolean,
+ required: false,
+ default: false,
+ },
},
computed: {
...mapGetters(['userCanReply']),
@@ -127,6 +132,7 @@ export default {
:show-reply-button="userCanReply"
:discussion-root="true"
:discussion-resolve-path="discussion.resolve_path"
+ :is-overview-tab="isOverviewTab"
@handleDeleteNote="$emit('deleteNote')"
@startReplying="$emit('startReplying')"
>
@@ -176,6 +182,7 @@ export default {
:line="diffLine"
:discussion-root="index === 0"
:discussion-resolve-path="discussion.resolve_path"
+ :is-overview-tab="isOverviewTab"
@handleDeleteNote="$emit('deleteNote')"
>
<template #avatar-badge>
diff --git a/app/assets/javascripts/notes/components/note_actions.vue b/app/assets/javascripts/notes/components/note_actions.vue
index 44d0c741d5a..e2a2edd7344 100644
--- a/app/assets/javascripts/notes/components/note_actions.vue
+++ b/app/assets/javascripts/notes/components/note_actions.vue
@@ -257,7 +257,7 @@ export default {
<user-access-role-badge
v-if="isAuthor"
v-gl-tooltip
- class="gl-mx-3 d-none d-md-inline-block"
+ class="gl-mr-3 d-none d-md-inline-block"
:title="displayAuthorBadgeText"
>
{{ __('Author') }}
@@ -265,7 +265,7 @@ export default {
<user-access-role-badge
v-if="accessLevel"
v-gl-tooltip
- class="gl-mx-3"
+ class="gl-mr-3"
:title="displayMemberBadgeText"
>
{{ accessLevel }}
@@ -273,7 +273,7 @@ export default {
<user-access-role-badge
v-else-if="isContributor"
v-gl-tooltip
- class="gl-mx-3"
+ class="gl-mr-3"
:title="displayContributorBadgeText"
>
{{ __('Contributor') }}
diff --git a/app/assets/javascripts/notes/components/note_body.vue b/app/assets/javascripts/notes/components/note_body.vue
index 93f71276120..1ce1696e332 100644
--- a/app/assets/javascripts/notes/components/note_body.vue
+++ b/app/assets/javascripts/notes/components/note_body.vue
@@ -51,7 +51,7 @@ export default {
},
},
computed: {
- ...mapGetters(['getDiscussion', 'suggestionsCount']),
+ ...mapGetters(['getDiscussion', 'suggestionsCount', 'getSuggestionsFilePaths']),
...mapGetters('diffs', ['suggestionCommitMessage']),
discussion() {
if (!this.note.isDraft) return {};
@@ -74,9 +74,10 @@ export default {
// Please see this issue comment for why these
// are hard-coded to 1:
// https://gitlab.com/gitlab-org/gitlab/-/issues/291027#note_468308022
- const suggestionsCount = 1;
- const filesCount = 1;
- const filePaths = this.file ? [this.file.file_path] : [];
+ const suggestionsCount = this.batchSuggestionsInfo.length || 1;
+ const batchFilePaths = this.getSuggestionsFilePaths();
+ const filePaths = batchFilePaths.length ? batchFilePaths : [this.file.file_path];
+ const filesCount = filePaths.length;
const suggestion = this.suggestionCommitMessage({
file_paths: filePaths.join(', '),
suggestions_count: suggestionsCount,
@@ -131,8 +132,8 @@ export default {
message,
}).then(callback);
},
- applySuggestionBatch({ flashContainer }) {
- return this.submitSuggestionBatch({ flashContainer });
+ applySuggestionBatch({ message, flashContainer }) {
+ return this.submitSuggestionBatch({ message, flashContainer });
},
addSuggestionToBatch(suggestionId) {
const { discussion_id: discussionId, id: noteId } = this.note;
diff --git a/app/assets/javascripts/notes/components/note_form.vue b/app/assets/javascripts/notes/components/note_form.vue
index a4f06a8d9f5..b05643e5e13 100644
--- a/app/assets/javascripts/notes/components/note_form.vue
+++ b/app/assets/javascripts/notes/components/note_form.vue
@@ -348,6 +348,7 @@ export default {
id="note_note"
ref="textarea"
v-model="updatedNoteBody"
+ :disabled="isSubmitting"
:data-supports-quick-actions="!isEditing && !glFeatures.tributeAutocomplete"
name="note[note]"
class="note-textarea js-gfm-input js-note-text js-autosize markdown-area js-vue-issue-note-form"
diff --git a/app/assets/javascripts/notes/components/note_header.vue b/app/assets/javascripts/notes/components/note_header.vue
index 4e686ce8719..0925195d4bb 100644
--- a/app/assets/javascripts/notes/components/note_header.vue
+++ b/app/assets/javascripts/notes/components/note_header.vue
@@ -1,10 +1,16 @@
<script>
-import { GlIcon, GlLoadingIcon, GlTooltipDirective } from '@gitlab/ui';
+import {
+ GlIcon,
+ GlLoadingIcon,
+ GlTooltipDirective,
+ GlSafeHtmlDirective as SafeHtml,
+} from '@gitlab/ui';
import { mapActions } from 'vuex';
import timeAgoTooltip from '~/vue_shared/components/time_ago_tooltip.vue';
import UserNameWithStatus from '../../sidebar/components/assignees/user_name_with_status.vue';
export default {
+ safeHtmlConfig: { ADD_TAGS: ['gl-emoji'] },
components: {
timeAgoTooltip,
GitlabTeamMemberBadge: () =>
@@ -14,6 +20,7 @@ export default {
UserNameWithStatus,
},
directives: {
+ SafeHtml,
GlTooltip: GlTooltipDirective,
},
props: {
@@ -165,10 +172,10 @@ export default {
<span
v-if="authorStatus"
ref="authorStatus"
+ v-safe-html:[$options.safeHtmlConfig]="authorStatus"
v-on="
authorStatusHasTooltip ? { mouseenter: removeEmojiTitle, mouseleave: addEmojiTitle } : {}
"
- v-html="authorStatus /* eslint-disable-line vue/no-v-html */"
></span>
<span class="text-nowrap author-username">
<a
diff --git a/app/assets/javascripts/notes/components/noteable_discussion.vue b/app/assets/javascripts/notes/components/noteable_discussion.vue
index b99579fb9a7..77f796fe8b0 100644
--- a/app/assets/javascripts/notes/components/noteable_discussion.vue
+++ b/app/assets/javascripts/notes/components/noteable_discussion.vue
@@ -66,6 +66,11 @@ export default {
required: false,
default: '',
},
+ isOverviewTab: {
+ type: Boolean,
+ required: false,
+ default: false,
+ },
},
data() {
return {
@@ -263,6 +268,7 @@ export default {
:is-expanded="isExpanded"
:line="line"
:should-group-replies="shouldGroupReplies"
+ :is-overview-tab="isOverviewTab"
@startReplying="showReplyForm"
@deleteNote="deleteNoteHandler"
>
diff --git a/app/assets/javascripts/notes/components/noteable_note.vue b/app/assets/javascripts/notes/components/noteable_note.vue
index 3c6ed0a8aac..e35d8d94289 100644
--- a/app/assets/javascripts/notes/components/noteable_note.vue
+++ b/app/assets/javascripts/notes/components/noteable_note.vue
@@ -84,6 +84,11 @@ export default {
required: false,
default: '',
},
+ isOverviewTab: {
+ type: Boolean,
+ required: false,
+ default: false,
+ },
},
data() {
return {
@@ -186,6 +191,14 @@ export default {
return fileResolvedFromAvailableSource || null;
},
+ avatarSize() {
+ // Use a different size if shown on a Merge Request Diff
+ if (this.line && !this.isOverviewTab) {
+ return 24;
+ }
+
+ return 40;
+ },
},
created() {
const line = this.note.position?.line_range?.start || this.line;
@@ -391,7 +404,7 @@ export default {
:link-href="author.path"
:img-src="author.avatar_url"
:img-alt="author.name"
- :img-size="40"
+ :img-size="avatarSize"
lazy
>
<template #avatar-badge>
diff --git a/app/assets/javascripts/notes/components/notes_app.vue b/app/assets/javascripts/notes/components/notes_app.vue
index 29c60b96d8a..58570e76795 100644
--- a/app/assets/javascripts/notes/components/notes_app.vue
+++ b/app/assets/javascripts/notes/components/notes_app.vue
@@ -317,6 +317,7 @@ export default {
:key="discussion.id"
:discussion="discussion"
:render-diff-file="true"
+ is-overview-tab
:help-page-path="helpPagePath"
/>
</template>
diff --git a/app/assets/javascripts/notes/stores/actions.js b/app/assets/javascripts/notes/stores/actions.js
index 656591e0c32..7eb10f647a0 100644
--- a/app/assets/javascripts/notes/stores/actions.js
+++ b/app/assets/javascripts/notes/stores/actions.js
@@ -631,7 +631,7 @@ export const submitSuggestion = (
});
};
-export const submitSuggestionBatch = ({ commit, dispatch, state }, { flashContainer }) => {
+export const submitSuggestionBatch = ({ commit, dispatch, state }, { message, flashContainer }) => {
const suggestionIds = state.batchSuggestionsInfo.map(({ suggestionId }) => suggestionId);
const resolveAllDiscussions = () =>
@@ -644,7 +644,7 @@ export const submitSuggestionBatch = ({ commit, dispatch, state }, { flashContai
commit(types.SET_RESOLVING_DISCUSSION, true);
dispatch('stopPolling');
- return Api.applySuggestionBatch(suggestionIds)
+ return Api.applySuggestionBatch(suggestionIds, message)
.then(() => Promise.all(resolveAllDiscussions()))
.then(() => commit(types.CLEAR_SUGGESTION_BATCH))
.catch((err) => {
diff --git a/app/assets/javascripts/notes/stores/getters.js b/app/assets/javascripts/notes/stores/getters.js
index 956221d69ae..a710ac0ccf5 100644
--- a/app/assets/javascripts/notes/stores/getters.js
+++ b/app/assets/javascripts/notes/stores/getters.js
@@ -283,3 +283,14 @@ export const suggestionsCount = (state, getters) =>
export const hasDrafts = (state, getters, rootState, rootGetters) =>
Boolean(rootGetters['batchComments/hasDrafts']);
+
+export const getSuggestionsFilePaths = (state) => () =>
+ state.batchSuggestionsInfo.reduce((acc, suggestion) => {
+ const discussion = state.discussions.find((d) => d.id === suggestion.discussionId);
+
+ if (acc.indexOf(discussion?.diff_file?.file_path) === -1) {
+ acc.push(discussion.diff_file.file_path);
+ }
+
+ return acc;
+ }, []);
diff --git a/app/assets/javascripts/notifications/constants.js b/app/assets/javascripts/notifications/constants.js
index 4f875977d78..f5891c9acb5 100644
--- a/app/assets/javascripts/notifications/constants.js
+++ b/app/assets/javascripts/notifications/constants.js
@@ -31,7 +31,7 @@ export const i18n = {
title: __('Custom notification events'),
bodyTitle: __('Notification events'),
bodyMessage: __(
- 'Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notificationLinkStart} notification emails%{notificationLinkEnd}.',
+ 'Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notificationLinkStart}notification emails%{notificationLinkEnd}.',
),
},
eventNames: {
diff --git a/app/assets/javascripts/packages/details/components/additional_metadata.vue b/app/assets/javascripts/packages/details/components/additional_metadata.vue
deleted file mode 100644
index 4e99099b0a1..00000000000
--- a/app/assets/javascripts/packages/details/components/additional_metadata.vue
+++ /dev/null
@@ -1,94 +0,0 @@
-<script>
-import { GlLink, GlSprintf } from '@gitlab/ui';
-import { s__ } from '~/locale';
-import DetailsRow from '~/vue_shared/components/registry/details_row.vue';
-import { PackageType } from '../../shared/constants';
-
-export default {
- i18n: {
- sourceText: s__('PackageRegistry|Source project located at %{link}'),
- licenseText: s__('PackageRegistry|License information located at %{link}'),
- recipeText: s__('PackageRegistry|Recipe: %{recipe}'),
- appGroup: s__('PackageRegistry|App group: %{group}'),
- appName: s__('PackageRegistry|App name: %{name}'),
- },
- components: {
- DetailsRow,
- GlLink,
- GlSprintf,
- },
- props: {
- packageEntity: {
- type: Object,
- required: true,
- },
- },
- computed: {
- showMetadata() {
- const visibilityConditions = {
- [PackageType.NUGET]: this.packageEntity.nuget_metadatum,
- [PackageType.CONAN]: this.packageEntity.conan_metadatum,
- [PackageType.MAVEN]: this.packageEntity.maven_metadatum,
- };
- return visibilityConditions[this.packageEntity.package_type];
- },
- },
-};
-</script>
-
-<template>
- <div v-if="showMetadata">
- <h3 class="gl-font-lg" data-testid="title">{{ __('Additional Metadata') }}</h3>
-
- <div class="gl-bg-gray-50 gl-inset-border-1-gray-100 gl-rounded-base" data-testid="main">
- <template v-if="packageEntity.nuget_metadatum">
- <details-row icon="project" padding="gl-p-4" dashed data-testid="nuget-source">
- <gl-sprintf :message="$options.i18n.sourceText">
- <template #link>
- <gl-link :href="packageEntity.nuget_metadatum.project_url" target="_blank">{{
- packageEntity.nuget_metadatum.project_url
- }}</gl-link>
- </template>
- </gl-sprintf>
- </details-row>
- <details-row icon="license" padding="gl-p-4" data-testid="nuget-license">
- <gl-sprintf :message="$options.i18n.licenseText">
- <template #link>
- <gl-link :href="packageEntity.nuget_metadatum.license_url" target="_blank">{{
- packageEntity.nuget_metadatum.license_url
- }}</gl-link>
- </template>
- </gl-sprintf>
- </details-row>
- </template>
-
- <details-row
- v-else-if="packageEntity.conan_metadatum"
- icon="information-o"
- padding="gl-p-4"
- data-testid="conan-recipe"
- >
- <gl-sprintf :message="$options.i18n.recipeText">
- <template #recipe>{{ packageEntity.name }}</template>
- </gl-sprintf>
- </details-row>
-
- <template v-else-if="packageEntity.maven_metadatum">
- <details-row icon="information-o" padding="gl-p-4" dashed data-testid="maven-app">
- <gl-sprintf :message="$options.i18n.appName">
- <template #name>
- <strong>{{ packageEntity.maven_metadatum.app_name }}</strong>
- </template>
- </gl-sprintf>
- </details-row>
- <details-row icon="information-o" padding="gl-p-4" data-testid="maven-group">
- <gl-sprintf :message="$options.i18n.appGroup">
- <template #group>
- <strong>{{ packageEntity.maven_metadatum.app_group }}</strong>
- </template>
- </gl-sprintf>
- </details-row>
- </template>
- </div>
- </div>
-</template>
diff --git a/app/assets/javascripts/packages/details/components/app.vue b/app/assets/javascripts/packages/details/components/app.vue
deleted file mode 100644
index 59da32e6666..00000000000
--- a/app/assets/javascripts/packages/details/components/app.vue
+++ /dev/null
@@ -1,292 +0,0 @@
-<script>
-import {
- GlBadge,
- GlButton,
- GlModal,
- GlModalDirective,
- GlTooltipDirective,
- GlEmptyState,
- GlTab,
- GlTabs,
- GlSprintf,
-} from '@gitlab/ui';
-import { mapActions, mapState } from 'vuex';
-import { numberToHumanSize } from '~/lib/utils/number_utils';
-import { objectToQuery } from '~/lib/utils/url_utility';
-import { s__, __ } from '~/locale';
-import Tracking from '~/tracking';
-import PackageListRow from '../../shared/components/package_list_row.vue';
-import PackagesListLoader from '../../shared/components/packages_list_loader.vue';
-import { PackageType, TrackingActions, SHOW_DELETE_SUCCESS_ALERT } from '../../shared/constants';
-import { packageTypeToTrackCategory } from '../../shared/utils';
-import AdditionalMetadata from './additional_metadata.vue';
-import DependencyRow from './dependency_row.vue';
-import InstallationCommands from './installation_commands.vue';
-import PackageFiles from './package_files.vue';
-import PackageHistory from './package_history.vue';
-
-export default {
- name: 'PackagesApp',
- components: {
- GlBadge,
- GlButton,
- GlEmptyState,
- GlModal,
- GlTab,
- GlTabs,
- GlSprintf,
- PackageTitle: () => import('./package_title.vue'),
- TerraformTitle: () =>
- import('~/packages_and_registries/infrastructure_registry/components/details_title.vue'),
- PackagesListLoader,
- PackageListRow,
- DependencyRow,
- PackageHistory,
- AdditionalMetadata,
- InstallationCommands,
- PackageFiles,
- },
- directives: {
- GlTooltip: GlTooltipDirective,
- GlModal: GlModalDirective,
- },
- mixins: [Tracking.mixin()],
- inject: {
- titleComponent: {
- default: 'PackageTitle',
- from: 'titleComponent',
- },
- },
- trackingActions: { ...TrackingActions },
- data() {
- return {
- fileToDelete: null,
- };
- },
- computed: {
- ...mapState([
- 'projectName',
- 'packageEntity',
- 'packageFiles',
- 'isLoading',
- 'canDelete',
- 'svgPath',
- 'npmPath',
- 'npmHelpPath',
- 'projectListUrl',
- 'groupListUrl',
- ]),
- isValidPackage() {
- return Boolean(this.packageEntity.name);
- },
- tracking() {
- return {
- category: packageTypeToTrackCategory(this.packageEntity.package_type),
- };
- },
- hasVersions() {
- return this.packageEntity.versions?.length > 0;
- },
- packageDependencies() {
- return this.packageEntity.dependency_links || [];
- },
- showDependencies() {
- return this.packageEntity.package_type === PackageType.NUGET;
- },
- showFiles() {
- return this.packageEntity?.package_type !== PackageType.COMPOSER;
- },
- },
- methods: {
- ...mapActions(['deletePackage', 'fetchPackageVersions', 'deletePackageFile']),
- formatSize(size) {
- return numberToHumanSize(size);
- },
- getPackageVersions() {
- if (!this.packageEntity.versions) {
- this.fetchPackageVersions();
- }
- },
- async confirmPackageDeletion() {
- this.track(TrackingActions.DELETE_PACKAGE);
- await this.deletePackage();
- const returnTo =
- !this.groupListUrl || document.referrer.includes(this.projectName)
- ? this.projectListUrl
- : this.groupListUrl; // to avoid security issue url are supplied from backend
- const modalQuery = objectToQuery({ [SHOW_DELETE_SUCCESS_ALERT]: true });
- window.location.replace(`${returnTo}?${modalQuery}`);
- },
- handleFileDelete(file) {
- this.track(TrackingActions.REQUEST_DELETE_PACKAGE_FILE);
- this.fileToDelete = { ...file };
- this.$refs.deleteFileModal.show();
- },
- confirmFileDelete() {
- this.track(TrackingActions.DELETE_PACKAGE_FILE);
- this.deletePackageFile(this.fileToDelete.id);
- this.fileToDelete = null;
- },
- },
- i18n: {
- deleteModalTitle: s__(`PackageRegistry|Delete Package Version`),
- deleteModalContent: s__(
- `PackageRegistry|You are about to delete version %{version} of %{name}. Are you sure?`,
- ),
- deleteFileModalTitle: s__(`PackageRegistry|Delete Package File`),
- deleteFileModalContent: s__(
- `PackageRegistry|You are about to delete %{filename}. This is a destructive action that may render your package unusable. Are you sure?`,
- ),
- },
- modal: {
- packageDeletePrimaryAction: {
- text: __('Delete'),
- attributes: [
- { variant: 'danger' },
- { category: 'primary' },
- { 'data-qa-selector': 'delete_modal_button' },
- ],
- },
- fileDeletePrimaryAction: {
- text: __('Delete'),
- attributes: [{ variant: 'danger' }, { category: 'primary' }],
- },
- cancelAction: {
- text: __('Cancel'),
- },
- },
-};
-</script>
-
-<template>
- <gl-empty-state
- v-if="!isValidPackage"
- :title="s__('PackageRegistry|Unable to load package')"
- :description="s__('PackageRegistry|There was a problem fetching the details for this package.')"
- :svg-path="svgPath"
- />
-
- <div v-else class="packages-app">
- <component :is="titleComponent">
- <template #delete-button>
- <gl-button
- v-if="canDelete"
- v-gl-modal="'delete-modal'"
- class="js-delete-button"
- variant="danger"
- category="primary"
- data-qa-selector="delete_button"
- >
- {{ __('Delete') }}
- </gl-button>
- </template>
- </component>
-
- <gl-tabs>
- <gl-tab :title="__('Detail')">
- <div data-qa-selector="package_information_content">
- <package-history :package-entity="packageEntity" :project-name="projectName" />
-
- <installation-commands
- :package-entity="packageEntity"
- :npm-path="npmPath"
- :npm-help-path="npmHelpPath"
- />
-
- <additional-metadata :package-entity="packageEntity" />
- </div>
-
- <package-files
- v-if="showFiles"
- :package-files="packageFiles"
- :can-delete="canDelete"
- @download-file="track($options.trackingActions.PULL_PACKAGE)"
- @delete-file="handleFileDelete"
- />
- </gl-tab>
-
- <gl-tab v-if="showDependencies" title-item-class="js-dependencies-tab">
- <template #title>
- <span>{{ __('Dependencies') }}</span>
- <gl-badge size="sm" data-testid="dependencies-badge">{{
- packageDependencies.length
- }}</gl-badge>
- </template>
-
- <template v-if="packageDependencies.length > 0">
- <dependency-row
- v-for="(dep, index) in packageDependencies"
- :key="index"
- :dependency="dep"
- />
- </template>
-
- <p v-else class="gl-mt-3" data-testid="no-dependencies-message">
- {{ s__('PackageRegistry|This NuGet package has no dependencies.') }}
- </p>
- </gl-tab>
-
- <gl-tab
- :title="__('Other versions')"
- title-item-class="js-versions-tab"
- @click="getPackageVersions"
- >
- <template v-if="isLoading && !hasVersions">
- <packages-list-loader />
- </template>
-
- <template v-else-if="hasVersions">
- <package-list-row
- v-for="v in packageEntity.versions"
- :key="v.id"
- :package-entity="{ name: packageEntity.name, ...v }"
- :package-link="v.id.toString()"
- :disable-delete="true"
- :show-package-type="false"
- />
- </template>
-
- <p v-else class="gl-mt-3" data-testid="no-versions-message">
- {{ s__('PackageRegistry|There are no other versions of this package.') }}
- </p>
- </gl-tab>
- </gl-tabs>
-
- <gl-modal
- ref="deleteModal"
- class="js-delete-modal"
- modal-id="delete-modal"
- :action-primary="$options.modal.packageDeletePrimaryAction"
- :action-cancel="$options.modal.cancelAction"
- @primary="confirmPackageDeletion"
- @canceled="track($options.trackingActions.CANCEL_DELETE_PACKAGE)"
- >
- <template #modal-title>{{ $options.i18n.deleteModalTitle }}</template>
- <gl-sprintf :message="$options.i18n.deleteModalContent">
- <template #version>
- <strong>{{ packageEntity.version }}</strong>
- </template>
-
- <template #name>
- <strong>{{ packageEntity.name }}</strong>
- </template>
- </gl-sprintf>
- </gl-modal>
-
- <gl-modal
- ref="deleteFileModal"
- modal-id="delete-file-modal"
- :action-primary="$options.modal.fileDeletePrimaryAction"
- :action-cancel="$options.modal.cancelAction"
- @primary="confirmFileDelete"
- @canceled="track($options.trackingActions.CANCEL_DELETE_PACKAGE_FILE)"
- >
- <template #modal-title>{{ $options.i18n.deleteFileModalTitle }}</template>
- <gl-sprintf v-if="fileToDelete" :message="$options.i18n.deleteFileModalContent">
- <template #filename>
- <strong>{{ fileToDelete.file_name }}</strong>
- </template>
- </gl-sprintf>
- </gl-modal>
- </div>
-</template>
diff --git a/app/assets/javascripts/packages/details/components/composer_installation.vue b/app/assets/javascripts/packages/details/components/composer_installation.vue
deleted file mode 100644
index bf1e5083e12..00000000000
--- a/app/assets/javascripts/packages/details/components/composer_installation.vue
+++ /dev/null
@@ -1,65 +0,0 @@
-<script>
-import { GlLink, GlSprintf } from '@gitlab/ui';
-import { mapGetters, mapState } from 'vuex';
-import { s__ } from '~/locale';
-import InstallationTitle from '~/packages/details/components/installation_title.vue';
-import CodeInstruction from '~/vue_shared/components/registry/code_instruction.vue';
-import { TrackingActions, TrackingLabels } from '../constants';
-
-export default {
- name: 'ComposerInstallation',
- components: {
- InstallationTitle,
- CodeInstruction,
- GlLink,
- GlSprintf,
- },
- computed: {
- ...mapState(['composerHelpPath']),
- ...mapGetters(['composerRegistryInclude', 'composerPackageInclude', 'groupExists']),
- },
- i18n: {
- registryInclude: s__('PackageRegistry|Add composer registry'),
- copyRegistryInclude: s__('PackageRegistry|Copy registry include'),
- packageInclude: s__('PackageRegistry|Install package version'),
- copyPackageInclude: s__('PackageRegistry|Copy require package include'),
- infoLine: s__(
- 'PackageRegistry|For more information on Composer packages in GitLab, %{linkStart}see the documentation.%{linkEnd}',
- ),
- },
- trackingActions: { ...TrackingActions },
- TrackingLabels,
- installOptions: [{ value: 'composer', label: s__('PackageRegistry|Show Composer commands') }],
-};
-</script>
-
-<template>
- <div v-if="groupExists" data-testid="root-node">
- <installation-title package-type="composer" :options="$options.installOptions" />
-
- <code-instruction
- :label="$options.i18n.registryInclude"
- :instruction="composerRegistryInclude"
- :copy-text="$options.i18n.copyRegistryInclude"
- :tracking-action="$options.trackingActions.COPY_COMPOSER_REGISTRY_INCLUDE_COMMAND"
- :tracking-label="$options.TrackingLabels.CODE_INSTRUCTION"
- data-testid="registry-include"
- />
-
- <code-instruction
- :label="$options.i18n.packageInclude"
- :instruction="composerPackageInclude"
- :copy-text="$options.i18n.copyPackageInclude"
- :tracking-action="$options.trackingActions.COPY_COMPOSER_PACKAGE_INCLUDE_COMMAND"
- :tracking-label="$options.TrackingLabels.CODE_INSTRUCTION"
- data-testid="package-include"
- />
- <span data-testid="help-text">
- <gl-sprintf :message="$options.i18n.infoLine">
- <template #link="{ content }">
- <gl-link :href="composerHelpPath" target="_blank">{{ content }}</gl-link>
- </template>
- </gl-sprintf>
- </span>
- </div>
-</template>
diff --git a/app/assets/javascripts/packages/details/components/conan_installation.vue b/app/assets/javascripts/packages/details/components/conan_installation.vue
deleted file mode 100644
index 1d855f6cf3e..00000000000
--- a/app/assets/javascripts/packages/details/components/conan_installation.vue
+++ /dev/null
@@ -1,59 +0,0 @@
-<script>
-import { GlLink, GlSprintf } from '@gitlab/ui';
-import { mapGetters, mapState } from 'vuex';
-import { s__ } from '~/locale';
-import InstallationTitle from '~/packages/details/components/installation_title.vue';
-import CodeInstruction from '~/vue_shared/components/registry/code_instruction.vue';
-import { TrackingActions, TrackingLabels } from '../constants';
-
-export default {
- name: 'ConanInstallation',
- components: {
- InstallationTitle,
- CodeInstruction,
- GlLink,
- GlSprintf,
- },
- computed: {
- ...mapState(['conanHelpPath']),
- ...mapGetters(['conanInstallationCommand', 'conanSetupCommand']),
- },
- i18n: {
- helpText: s__(
- 'PackageRegistry|For more information on the Conan registry, %{linkStart}see the documentation%{linkEnd}.',
- ),
- },
- trackingActions: { ...TrackingActions },
- TrackingLabels,
- installOptions: [{ value: 'conan', label: s__('PackageRegistry|Show Conan commands') }],
-};
-</script>
-
-<template>
- <div>
- <installation-title package-type="conan" :options="$options.installOptions" />
-
- <code-instruction
- :label="s__('PackageRegistry|Conan Command')"
- :instruction="conanInstallationCommand"
- :copy-text="s__('PackageRegistry|Copy Conan Command')"
- :tracking-action="$options.trackingActions.COPY_CONAN_COMMAND"
- :tracking-label="$options.TrackingLabels.CODE_INSTRUCTION"
- />
-
- <h3 class="gl-font-lg">{{ __('Registry setup') }}</h3>
-
- <code-instruction
- :label="s__('PackageRegistry|Add Conan Remote')"
- :instruction="conanSetupCommand"
- :copy-text="s__('PackageRegistry|Copy Conan Setup Command')"
- :tracking-action="$options.trackingActions.COPY_CONAN_SETUP_COMMAND"
- :tracking-label="$options.TrackingLabels.CODE_INSTRUCTION"
- />
- <gl-sprintf :message="$options.i18n.helpText">
- <template #link="{ content }">
- <gl-link :href="conanHelpPath" target="_blank">{{ content }}</gl-link>
- </template>
- </gl-sprintf>
- </div>
-</template>
diff --git a/app/assets/javascripts/packages/details/components/dependency_row.vue b/app/assets/javascripts/packages/details/components/dependency_row.vue
deleted file mode 100644
index 1a2202b23c8..00000000000
--- a/app/assets/javascripts/packages/details/components/dependency_row.vue
+++ /dev/null
@@ -1,35 +0,0 @@
-<script>
-export default {
- name: 'DependencyRow',
- props: {
- dependency: {
- type: Object,
- required: true,
- },
- },
- computed: {
- showVersion() {
- return Boolean(this.dependency.version_pattern);
- },
- },
-};
-</script>
-
-<template>
- <div class="gl-responsive-table-row">
- <div class="table-section section-50">
- <strong class="gl-text-body">{{ dependency.name }}</strong>
- <span v-if="dependency.target_framework" data-testid="target-framework"
- >({{ dependency.target_framework }})</span
- >
- </div>
-
- <div
- v-if="showVersion"
- class="table-section section-50 gl-display-flex gl-md-justify-content-end"
- data-testid="version-pattern"
- >
- <span class="gl-text-body">{{ dependency.version_pattern }}</span>
- </div>
- </div>
-</template>
diff --git a/app/assets/javascripts/packages/details/components/installation_commands.vue b/app/assets/javascripts/packages/details/components/installation_commands.vue
deleted file mode 100644
index ed55d7fe782..00000000000
--- a/app/assets/javascripts/packages/details/components/installation_commands.vue
+++ /dev/null
@@ -1,55 +0,0 @@
-<script>
-import TerraformInstallation from '~/packages_and_registries/infrastructure_registry/components/terraform_installation.vue';
-import { PackageType, TERRAFORM_PACKAGE_TYPE } from '../../shared/constants';
-import ComposerInstallation from './composer_installation.vue';
-import ConanInstallation from './conan_installation.vue';
-import MavenInstallation from './maven_installation.vue';
-import NpmInstallation from './npm_installation.vue';
-import NugetInstallation from './nuget_installation.vue';
-import PypiInstallation from './pypi_installation.vue';
-
-export default {
- name: 'InstallationCommands',
- components: {
- [PackageType.CONAN]: ConanInstallation,
- [PackageType.MAVEN]: MavenInstallation,
- [PackageType.NPM]: NpmInstallation,
- [PackageType.NUGET]: NugetInstallation,
- [PackageType.PYPI]: PypiInstallation,
- [PackageType.COMPOSER]: ComposerInstallation,
- [TERRAFORM_PACKAGE_TYPE]: TerraformInstallation,
- },
- props: {
- packageEntity: {
- type: Object,
- required: true,
- },
- npmPath: {
- type: String,
- required: false,
- default: '',
- },
- npmHelpPath: {
- type: String,
- required: false,
- default: '',
- },
- },
- computed: {
- installationComponent() {
- return this.$options.components[this.packageEntity.package_type];
- },
- },
-};
-</script>
-
-<template>
- <div v-if="installationComponent">
- <component
- :is="installationComponent"
- :name="packageEntity.name"
- :registry-url="npmPath"
- :help-url="npmHelpPath"
- />
- </div>
-</template>
diff --git a/app/assets/javascripts/packages/details/components/installation_title.vue b/app/assets/javascripts/packages/details/components/installation_title.vue
deleted file mode 100644
index 43133bf7825..00000000000
--- a/app/assets/javascripts/packages/details/components/installation_title.vue
+++ /dev/null
@@ -1,38 +0,0 @@
-<script>
-import PersistedDropdownSelection from '~/vue_shared/components/registry/persisted_dropdown_selection.vue';
-
-export default {
- name: 'InstallationTitle',
- components: {
- PersistedDropdownSelection,
- },
- props: {
- packageType: {
- type: String,
- required: true,
- },
- options: {
- type: Array,
- required: true,
- },
- },
- computed: {
- storageKey() {
- return `package_${this.packageType}_installation_instructions`;
- },
- },
-};
-</script>
-
-<template>
- <div class="gl-display-flex gl-justify-content-space-between gl-align-items-center">
- <h3 class="gl-font-lg">{{ __('Installation') }}</h3>
- <div>
- <persisted-dropdown-selection
- :storage-key="storageKey"
- :options="options"
- @change="$emit('change', $event)"
- />
- </div>
- </div>
-</template>
diff --git a/app/assets/javascripts/packages/details/components/maven_installation.vue b/app/assets/javascripts/packages/details/components/maven_installation.vue
deleted file mode 100644
index 6974de99344..00000000000
--- a/app/assets/javascripts/packages/details/components/maven_installation.vue
+++ /dev/null
@@ -1,153 +0,0 @@
-<script>
-import { GlLink, GlSprintf } from '@gitlab/ui';
-import { mapGetters, mapState } from 'vuex';
-import { s__ } from '~/locale';
-import InstallationTitle from '~/packages/details/components/installation_title.vue';
-import CodeInstruction from '~/vue_shared/components/registry/code_instruction.vue';
-
-import { TrackingActions, TrackingLabels } from '../constants';
-
-export default {
- name: 'MavenInstallation',
- components: {
- InstallationTitle,
- CodeInstruction,
- GlLink,
- GlSprintf,
- },
- data() {
- return {
- instructionType: 'maven',
- };
- },
- computed: {
- ...mapState(['mavenHelpPath']),
- ...mapGetters([
- 'mavenInstallationXml',
- 'mavenInstallationCommand',
- 'mavenSetupXml',
- 'gradleGroovyInstalCommand',
- 'gradleGroovyAddSourceCommand',
- 'gradleKotlinInstalCommand',
- 'gradleKotlinAddSourceCommand',
- ]),
- showMaven() {
- return this.instructionType === 'maven';
- },
- showGroovy() {
- return this.instructionType === 'groovy';
- },
- },
- i18n: {
- xmlText: s__(
- `PackageRegistry|Copy and paste this inside your %{codeStart}pom.xml%{codeEnd} %{codeStart}dependencies%{codeEnd} block.`,
- ),
- setupText: s__(
- `PackageRegistry|If you haven't already done so, you will need to add the below to your %{codeStart}pom.xml%{codeEnd} file.`,
- ),
- helpText: s__(
- 'PackageRegistry|For more information on the Maven registry, %{linkStart}see the documentation%{linkEnd}.',
- ),
- },
- trackingActions: { ...TrackingActions },
- TrackingLabels,
- installOptions: [
- { value: 'maven', label: s__('PackageRegistry|Maven XML') },
- { value: 'groovy', label: s__('PackageRegistry|Gradle Groovy DSL') },
- { value: 'kotlin', label: s__('PackageRegistry|Gradle Kotlin DSL') },
- ],
-};
-</script>
-
-<template>
- <div>
- <installation-title
- package-type="maven"
- :options="$options.installOptions"
- @change="instructionType = $event"
- />
-
- <template v-if="showMaven">
- <p>
- <gl-sprintf :message="$options.i18n.xmlText">
- <template #code="{ content }">
- <code>{{ content }}</code>
- </template>
- </gl-sprintf>
- </p>
-
- <code-instruction
- :instruction="mavenInstallationXml"
- :copy-text="s__('PackageRegistry|Copy Maven XML')"
- :tracking-action="$options.trackingActions.COPY_MAVEN_XML"
- :tracking-label="$options.TrackingLabels.CODE_INSTRUCTION"
- multiline
- />
-
- <code-instruction
- :label="s__('PackageRegistry|Maven Command')"
- :instruction="mavenInstallationCommand"
- :copy-text="s__('PackageRegistry|Copy Maven command')"
- :tracking-action="$options.trackingActions.COPY_MAVEN_COMMAND"
- :tracking-label="$options.TrackingLabels.CODE_INSTRUCTION"
- />
-
- <h3 class="gl-font-lg">{{ s__('PackageRegistry|Registry setup') }}</h3>
- <p>
- <gl-sprintf :message="$options.i18n.setupText">
- <template #code="{ content }">
- <code>{{ content }}</code>
- </template>
- </gl-sprintf>
- </p>
- <code-instruction
- :instruction="mavenSetupXml"
- :copy-text="s__('PackageRegistry|Copy Maven registry XML')"
- :tracking-action="$options.trackingActions.COPY_MAVEN_SETUP"
- :tracking-label="$options.TrackingLabels.CODE_INSTRUCTION"
- multiline
- />
- <gl-sprintf :message="$options.i18n.helpText">
- <template #link="{ content }">
- <gl-link :href="mavenHelpPath" target="_blank">{{ content }}</gl-link>
- </template>
- </gl-sprintf>
- </template>
- <template v-else-if="showGroovy">
- <code-instruction
- class="gl-mb-5"
- :label="s__('PackageRegistry|Gradle Groovy DSL install command')"
- :instruction="gradleGroovyInstalCommand"
- :copy-text="s__('PackageRegistry|Copy Gradle Groovy DSL install command')"
- :tracking-action="$options.trackingActions.COPY_GRADLE_INSTALL_COMMAND"
- :tracking-label="$options.TrackingLabels.CODE_INSTRUCTION"
- />
- <code-instruction
- :label="s__('PackageRegistry|Add Gradle Groovy DSL repository command')"
- :instruction="gradleGroovyAddSourceCommand"
- :copy-text="s__('PackageRegistry|Copy add Gradle Groovy DSL repository command')"
- :tracking-action="$options.trackingActions.COPY_GRADLE_ADD_TO_SOURCE_COMMAND"
- :tracking-label="$options.TrackingLabels.CODE_INSTRUCTION"
- multiline
- />
- </template>
- <template v-else>
- <code-instruction
- class="gl-mb-5"
- :label="s__('PackageRegistry|Gradle Kotlin DSL install command')"
- :instruction="gradleKotlinInstalCommand"
- :copy-text="s__('PackageRegistry|Copy Gradle Kotlin DSL install command')"
- :tracking-action="$options.trackingActions.COPY_KOTLIN_INSTALL_COMMAND"
- :tracking-label="$options.TrackingLabels.CODE_INSTRUCTION"
- />
- <code-instruction
- :label="s__('PackageRegistry|Add Gradle Kotlin DSL repository command')"
- :instruction="gradleKotlinAddSourceCommand"
- :copy-text="s__('PackageRegistry|Copy add Gradle Kotlin DSL repository command')"
- :tracking-action="$options.trackingActions.COPY_KOTLIN_ADD_TO_SOURCE_COMMAND"
- :tracking-label="$options.TrackingLabels.CODE_INSTRUCTION"
- multiline
- />
- </template>
- </div>
-</template>
diff --git a/app/assets/javascripts/packages/details/components/npm_installation.vue b/app/assets/javascripts/packages/details/components/npm_installation.vue
deleted file mode 100644
index 6b0fcf5e4fe..00000000000
--- a/app/assets/javascripts/packages/details/components/npm_installation.vue
+++ /dev/null
@@ -1,103 +0,0 @@
-<script>
-import { GlLink, GlSprintf } from '@gitlab/ui';
-import { mapGetters, mapState } from 'vuex';
-import { s__ } from '~/locale';
-import InstallationTitle from '~/packages/details/components/installation_title.vue';
-import CodeInstruction from '~/vue_shared/components/registry/code_instruction.vue';
-import { NpmManager, TrackingActions, TrackingLabels } from '../constants';
-
-export default {
- name: 'NpmInstallation',
- components: {
- InstallationTitle,
- CodeInstruction,
- GlLink,
- GlSprintf,
- },
- data() {
- return {
- instructionType: 'npm',
- };
- },
- computed: {
- ...mapState(['npmHelpPath']),
- ...mapGetters(['npmInstallationCommand', 'npmSetupCommand']),
- npmCommand() {
- return this.npmInstallationCommand(NpmManager.NPM);
- },
- npmSetup() {
- return this.npmSetupCommand(NpmManager.NPM);
- },
- yarnCommand() {
- return this.npmInstallationCommand(NpmManager.YARN);
- },
- yarnSetupCommand() {
- return this.npmSetupCommand(NpmManager.YARN);
- },
- showNpm() {
- return this.instructionType === 'npm';
- },
- },
- i18n: {
- helpText: s__(
- 'PackageRegistry|You may also need to setup authentication using an auth token. %{linkStart}See the documentation%{linkEnd} to find out more.',
- ),
- },
- trackingActions: { ...TrackingActions },
- TrackingLabels,
- installOptions: [
- { value: 'npm', label: s__('PackageRegistry|Show NPM commands') },
- { value: 'yarn', label: s__('PackageRegistry|Show Yarn commands') },
- ],
-};
-</script>
-
-<template>
- <div>
- <installation-title
- package-type="npm"
- :options="$options.installOptions"
- @change="instructionType = $event"
- />
-
- <code-instruction
- v-if="showNpm"
- :instruction="npmCommand"
- :copy-text="s__('PackageRegistry|Copy npm command')"
- :tracking-action="$options.trackingActions.COPY_NPM_INSTALL_COMMAND"
- :tracking-label="$options.TrackingLabels.CODE_INSTRUCTION"
- />
-
- <code-instruction
- v-else
- :instruction="yarnCommand"
- :copy-text="s__('PackageRegistry|Copy yarn command')"
- :tracking-action="$options.trackingActions.COPY_YARN_INSTALL_COMMAND"
- :tracking-label="$options.TrackingLabels.CODE_INSTRUCTION"
- />
-
- <h3 class="gl-font-lg">{{ __('Registry setup') }}</h3>
-
- <code-instruction
- v-if="showNpm"
- :instruction="npmSetup"
- :copy-text="s__('PackageRegistry|Copy npm setup command')"
- :tracking-action="$options.trackingActions.COPY_NPM_SETUP_COMMAND"
- :tracking-label="$options.TrackingLabels.CODE_INSTRUCTION"
- />
-
- <code-instruction
- v-else
- :instruction="yarnSetupCommand"
- :copy-text="s__('PackageRegistry|Copy yarn setup command')"
- :tracking-action="$options.trackingActions.COPY_YARN_SETUP_COMMAND"
- :tracking-label="$options.TrackingLabels.CODE_INSTRUCTION"
- />
-
- <gl-sprintf :message="$options.i18n.helpText">
- <template #link="{ content }">
- <gl-link :href="npmHelpPath" target="_blank">{{ content }}</gl-link>
- </template>
- </gl-sprintf>
- </div>
-</template>
diff --git a/app/assets/javascripts/packages/details/components/nuget_installation.vue b/app/assets/javascripts/packages/details/components/nuget_installation.vue
deleted file mode 100644
index d5e64722f24..00000000000
--- a/app/assets/javascripts/packages/details/components/nuget_installation.vue
+++ /dev/null
@@ -1,58 +0,0 @@
-<script>
-import { GlLink, GlSprintf } from '@gitlab/ui';
-import { mapGetters, mapState } from 'vuex';
-import { s__ } from '~/locale';
-import InstallationTitle from '~/packages/details/components/installation_title.vue';
-import CodeInstruction from '~/vue_shared/components/registry/code_instruction.vue';
-import { TrackingActions, TrackingLabels } from '../constants';
-
-export default {
- name: 'NugetInstallation',
- components: {
- InstallationTitle,
- CodeInstruction,
- GlLink,
- GlSprintf,
- },
- computed: {
- ...mapState(['nugetHelpPath']),
- ...mapGetters(['nugetInstallationCommand', 'nugetSetupCommand']),
- },
- i18n: {
- helpText: s__(
- 'PackageRegistry|For more information on the NuGet registry, %{linkStart}see the documentation%{linkEnd}.',
- ),
- },
- trackingActions: { ...TrackingActions },
- TrackingLabels,
- installOptions: [{ value: 'nuget', label: s__('PackageRegistry|Show Nuget commands') }],
-};
-</script>
-
-<template>
- <div>
- <installation-title package-type="nuget" :options="$options.installOptions" />
-
- <code-instruction
- :label="s__('PackageRegistry|NuGet Command')"
- :instruction="nugetInstallationCommand"
- :copy-text="s__('PackageRegistry|Copy NuGet Command')"
- :tracking-action="$options.trackingActions.COPY_NUGET_INSTALL_COMMAND"
- :tracking-label="$options.TrackingLabels.CODE_INSTRUCTION"
- />
- <h3 class="gl-font-lg">{{ __('Registry setup') }}</h3>
-
- <code-instruction
- :label="s__('PackageRegistry|Add NuGet Source')"
- :instruction="nugetSetupCommand"
- :copy-text="s__('PackageRegistry|Copy NuGet Setup Command')"
- :tracking-action="$options.trackingActions.COPY_NUGET_SETUP_COMMAND"
- :tracking-label="$options.TrackingLabels.CODE_INSTRUCTION"
- />
- <gl-sprintf :message="$options.i18n.helpText">
- <template #link="{ content }">
- <gl-link :href="nugetHelpPath" target="_blank">{{ content }}</gl-link>
- </template>
- </gl-sprintf>
- </div>
-</template>
diff --git a/app/assets/javascripts/packages/details/components/package_files.vue b/app/assets/javascripts/packages/details/components/package_files.vue
deleted file mode 100644
index 0563b612d04..00000000000
--- a/app/assets/javascripts/packages/details/components/package_files.vue
+++ /dev/null
@@ -1,165 +0,0 @@
-<script>
-import { GlLink, GlTable, GlDropdownItem, GlDropdown, GlIcon, GlButton } from '@gitlab/ui';
-import { last } from 'lodash';
-import { numberToHumanSize } from '~/lib/utils/number_utils';
-import { __ } from '~/locale';
-import FileSha from '~/packages/details/components/file_sha.vue';
-import Tracking from '~/tracking';
-import FileIcon from '~/vue_shared/components/file_icon.vue';
-import TimeAgoTooltip from '~/vue_shared/components/time_ago_tooltip.vue';
-
-export default {
- name: 'PackageFiles',
- components: {
- GlLink,
- GlTable,
- GlIcon,
- GlDropdown,
- GlDropdownItem,
- GlButton,
- FileIcon,
- TimeAgoTooltip,
- FileSha,
- },
- mixins: [Tracking.mixin()],
- props: {
- packageFiles: {
- type: Array,
- required: false,
- default: () => [],
- },
- canDelete: {
- type: Boolean,
- default: false,
- required: false,
- },
- },
- computed: {
- filesTableRows() {
- return this.packageFiles.map((pf) => ({
- ...pf,
- size: this.formatSize(pf.size),
- pipeline: last(pf.pipelines),
- }));
- },
- showCommitColumn() {
- return this.filesTableRows.some((row) => Boolean(row.pipeline?.id));
- },
- filesTableHeaderFields() {
- return [
- {
- key: 'name',
- label: __('Name'),
- },
- {
- key: 'commit',
- label: __('Commit'),
- hide: !this.showCommitColumn,
- },
- {
- key: 'size',
- label: __('Size'),
- },
- {
- key: 'created',
- label: __('Created'),
- class: 'gl-text-right',
- },
- {
- key: 'actions',
- label: '',
- hide: !this.canDelete,
- class: 'gl-text-right',
- tdClass: 'gl-w-4',
- },
- ].filter((c) => !c.hide);
- },
- },
- methods: {
- formatSize(size) {
- return numberToHumanSize(size);
- },
- hasDetails(item) {
- return item.file_sha256 || item.file_md5 || item.file_sha1;
- },
- },
- i18n: {
- deleteFile: __('Delete file'),
- },
-};
-</script>
-
-<template>
- <div>
- <h3 class="gl-font-lg gl-mt-5">{{ __('Files') }}</h3>
- <gl-table
- :fields="filesTableHeaderFields"
- :items="filesTableRows"
- :tbody-tr-attr="{ 'data-testid': 'file-row' }"
- >
- <template #cell(name)="{ item, toggleDetails, detailsShowing }">
- <gl-button
- v-if="hasDetails(item)"
- :icon="detailsShowing ? 'angle-up' : 'angle-down'"
- :aria-label="detailsShowing ? __('Collapse') : __('Expand')"
- category="tertiary"
- size="small"
- @click="toggleDetails"
- />
- <gl-link
- :href="item.download_path"
- class="gl-text-gray-500"
- data-testid="download-link"
- @click="$emit('download-file')"
- >
- <file-icon
- :file-name="item.file_name"
- css-classes="gl-relative file-icon"
- class="gl-mr-1 gl-relative"
- />
- <span>{{ item.file_name }}</span>
- </gl-link>
- </template>
-
- <template #cell(commit)="{ item }">
- <gl-link
- v-if="item.pipeline && item.pipeline.project"
- :href="item.pipeline.project.commit_url"
- class="gl-text-gray-500"
- data-testid="commit-link"
- >{{ item.pipeline.git_commit_message }}</gl-link
- >
- </template>
-
- <template #cell(created)="{ item }">
- <time-ago-tooltip :time="item.created_at" />
- </template>
-
- <template #cell(actions)="{ item }">
- <gl-dropdown category="tertiary" right>
- <template #button-content>
- <gl-icon name="ellipsis_v" />
- </template>
- <gl-dropdown-item data-testid="delete-file" @click="$emit('delete-file', item)">
- {{ $options.i18n.deleteFile }}
- </gl-dropdown-item>
- </gl-dropdown>
- </template>
-
- <template #row-details="{ item }">
- <div
- class="gl-display-flex gl-flex-direction-column gl-flex-grow-1 gl-bg-gray-10 gl-rounded-base gl-inset-border-1-gray-100"
- >
- <file-sha
- v-if="item.file_sha256"
- data-testid="sha-256"
- title="SHA-256"
- :sha="item.file_sha256"
- />
- <file-sha v-if="item.file_md5" data-testid="md5" title="MD5" :sha="item.file_md5" />
- <file-sha v-if="item.file_sha1" data-testid="sha-1" title="SHA-1" :sha="item.file_sha1" />
- </div>
- </template>
- </gl-table>
- </div>
-</template>
diff --git a/app/assets/javascripts/packages/details/components/package_history.vue b/app/assets/javascripts/packages/details/components/package_history.vue
deleted file mode 100644
index 27d2f208a42..00000000000
--- a/app/assets/javascripts/packages/details/components/package_history.vue
+++ /dev/null
@@ -1,168 +0,0 @@
-<script>
-/* eslint-disable @gitlab/require-string-literal-i18n-helpers */
-import { GlLink, GlSprintf } from '@gitlab/ui';
-import { first } from 'lodash';
-import { truncateSha } from '~/lib/utils/text_utility';
-import { s__, n__ } from '~/locale';
-import { HISTORY_PIPELINES_LIMIT } from '~/packages/details/constants';
-import HistoryItem from '~/vue_shared/components/registry/history_item.vue';
-import TimeAgoTooltip from '~/vue_shared/components/time_ago_tooltip.vue';
-
-export default {
- name: 'PackageHistory',
- i18n: {
- createdOn: s__('PackageRegistry|%{name} version %{version} was first created %{datetime}'),
- createdByCommitText: s__('PackageRegistry|Created by commit %{link} on branch %{branch}'),
- createdByPipelineText: s__(
- 'PackageRegistry|Built by pipeline %{link} triggered %{datetime} by %{author}',
- ),
- publishText: s__('PackageRegistry|Published to the %{project} Package Registry %{datetime}'),
- combinedUpdateText: s__(
- 'PackageRegistry|Package updated by commit %{link} on branch %{branch}, built by pipeline %{pipeline}, and published to the registry %{datetime}',
- ),
- archivedPipelineMessageSingular: s__('PackageRegistry|Package has %{number} archived update'),
- archivedPipelineMessagePlural: s__('PackageRegistry|Package has %{number} archived updates'),
- },
- components: {
- GlLink,
- GlSprintf,
- HistoryItem,
- TimeAgoTooltip,
- },
- props: {
- packageEntity: {
- type: Object,
- required: true,
- },
- projectName: {
- type: String,
- required: true,
- },
- },
- data() {
- return {
- showDescription: false,
- };
- },
- computed: {
- pipelines() {
- return this.packageEntity.pipelines || [];
- },
- firstPipeline() {
- return first(this.pipelines);
- },
- lastPipelines() {
- return this.pipelines.slice(1).slice(-HISTORY_PIPELINES_LIMIT);
- },
- showPipelinesInfo() {
- return Boolean(this.firstPipeline?.id);
- },
- archiviedLines() {
- return Math.max(this.pipelines.length - HISTORY_PIPELINES_LIMIT - 1, 0);
- },
- archivedPipelineMessage() {
- return n__(
- this.$options.i18n.archivedPipelineMessageSingular,
- this.$options.i18n.archivedPipelineMessagePlural,
- this.archiviedLines,
- );
- },
- },
- methods: {
- truncate(value) {
- return truncateSha(value);
- },
- },
-};
-</script>
-
-<template>
- <div class="issuable-discussion">
- <h3 class="gl-font-lg" data-testid="title">{{ __('History') }}</h3>
- <ul class="timeline main-notes-list notes gl-mb-4" data-testid="timeline">
- <history-item icon="clock" data-testid="created-on">
- <gl-sprintf :message="$options.i18n.createdOn">
- <template #name>
- <strong>{{ packageEntity.name }}</strong>
- </template>
- <template #version>
- <strong>{{ packageEntity.version }}</strong>
- </template>
- <template #datetime>
- <time-ago-tooltip :time="packageEntity.created_at" />
- </template>
- </gl-sprintf>
- </history-item>
-
- <template v-if="showPipelinesInfo">
- <!-- FIRST PIPELINE BLOCK -->
- <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
- >
- </template>
- <template #branch>
- <strong>{{ firstPipeline.ref }}</strong>
- </template>
- </gl-sprintf>
- </history-item>
- <history-item icon="pipeline" data-testid="first-pipeline-pipeline">
- <gl-sprintf :message="$options.i18n.createdByPipelineText">
- <template #link>
- <gl-link :href="firstPipeline.project.pipeline_url">#{{ firstPipeline.id }}</gl-link>
- </template>
- <template #datetime>
- <time-ago-tooltip :time="firstPipeline.created_at" />
- </template>
- <template #author>{{ firstPipeline.user.name }}</template>
- </gl-sprintf>
- </history-item>
- </template>
-
- <!-- PUBLISHED LINE -->
- <history-item icon="package" data-testid="published">
- <gl-sprintf :message="$options.i18n.publishText">
- <template #project>
- <strong>{{ projectName }}</strong>
- </template>
- <template #datetime>
- <time-ago-tooltip :time="packageEntity.created_at" />
- </template>
- </gl-sprintf>
- </history-item>
-
- <history-item v-if="archiviedLines" icon="history" data-testid="archived">
- <gl-sprintf :message="archivedPipelineMessage">
- <template #number>
- <strong>{{ archiviedLines }}</strong>
- </template>
- </gl-sprintf>
- </history-item>
-
- <!-- PIPELINES LIST ENTRIES -->
- <history-item
- v-for="pipeline in lastPipelines"
- :key="pipeline.id"
- icon="pencil"
- data-testid="pipeline-entry"
- >
- <gl-sprintf :message="$options.i18n.combinedUpdateText">
- <template #link>
- <gl-link :href="pipeline.project.commit_url">#{{ truncate(pipeline.sha) }}</gl-link>
- </template>
- <template #branch>
- <strong>{{ pipeline.ref }}</strong>
- </template>
- <template #pipeline>
- <gl-link :href="pipeline.project.pipeline_url">#{{ pipeline.id }}</gl-link>
- </template>
- <template #datetime>
- <time-ago-tooltip :time="pipeline.created_at" />
- </template>
- </gl-sprintf>
- </history-item>
- </ul>
- </div>
-</template>
diff --git a/app/assets/javascripts/packages/details/components/package_title.vue b/app/assets/javascripts/packages/details/components/package_title.vue
deleted file mode 100644
index d02a7b3ec27..00000000000
--- a/app/assets/javascripts/packages/details/components/package_title.vue
+++ /dev/null
@@ -1,113 +0,0 @@
-<script>
-/* eslint-disable vue/v-slot-style */
-import { GlIcon, GlSprintf, GlTooltipDirective, GlBadge } from '@gitlab/ui';
-import { GlBreakpointInstance } from '@gitlab/ui/dist/utils';
-import { mapState, mapGetters } from 'vuex';
-import { numberToHumanSize } from '~/lib/utils/number_utils';
-import { __ } from '~/locale';
-import MetadataItem from '~/vue_shared/components/registry/metadata_item.vue';
-import TitleArea from '~/vue_shared/components/registry/title_area.vue';
-import timeagoMixin from '~/vue_shared/mixins/timeago';
-import PackageTags from '../../shared/components/package_tags.vue';
-
-export default {
- name: 'PackageTitle',
- components: {
- TitleArea,
- GlIcon,
- GlSprintf,
- PackageTags,
- MetadataItem,
- GlBadge,
- },
- directives: {
- GlTooltip: GlTooltipDirective,
- },
- mixins: [timeagoMixin],
- i18n: {
- packageInfo: __('v%{version} published %{timeAgo}'),
- },
- data() {
- return {
- isDesktop: true,
- };
- },
- computed: {
- ...mapState(['packageEntity', 'packageFiles']),
- ...mapGetters(['packageTypeDisplay', 'packagePipeline', 'packageIcon']),
- hasTagsToDisplay() {
- return Boolean(this.packageEntity.tags && this.packageEntity.tags.length);
- },
- totalSize() {
- return numberToHumanSize(this.packageFiles.reduce((acc, p) => acc + p.size, 0));
- },
- },
- mounted() {
- this.isDesktop = GlBreakpointInstance.isDesktop();
- },
- methods: {
- dynamicSlotName(index) {
- return `metadata-tag${index}`;
- },
- },
-};
-</script>
-
-<template>
- <title-area :title="packageEntity.name" :avatar="packageIcon" data-qa-selector="package_title">
- <template #sub-header>
- <gl-icon name="eye" class="gl-mr-3" />
- <gl-sprintf :message="$options.i18n.packageInfo">
- <template #version>
- {{ packageEntity.version }}
- </template>
-
- <template #timeAgo>
- <span v-gl-tooltip :title="tooltipTitle(packageEntity.created_at)">
- &nbsp;{{ timeFormatted(packageEntity.created_at) }}
- </span>
- </template>
- </gl-sprintf>
- </template>
-
- <template v-if="packageTypeDisplay" #metadata-type>
- <metadata-item data-testid="package-type" icon="package" :text="packageTypeDisplay" />
- </template>
-
- <template #metadata-size>
- <metadata-item data-testid="package-size" icon="disk" :text="totalSize" />
- </template>
-
- <template v-if="packagePipeline" #metadata-pipeline>
- <metadata-item
- data-testid="pipeline-project"
- icon="review-list"
- :text="packagePipeline.project.name"
- :link="packagePipeline.project.web_url"
- />
- </template>
-
- <template v-if="packagePipeline" #metadata-ref>
- <metadata-item data-testid="package-ref" icon="branch" :text="packagePipeline.ref" />
- </template>
-
- <template v-if="isDesktop && hasTagsToDisplay" #metadata-tags>
- <package-tags :tag-display-limit="2" :tags="packageEntity.tags" hide-label />
- </template>
-
- <!-- we need to duplicate the package tags on mobile to ensure proper styling inside the flex wrap -->
- <template
- v-for="(tag, index) in packageEntity.tags"
- v-else-if="hasTagsToDisplay"
- v-slot:[dynamicSlotName(index)]
- >
- <gl-badge :key="index" class="gl-my-1" data-testid="tag-badge" variant="info" size="sm">
- {{ tag.name }}
- </gl-badge>
- </template>
-
- <template #right-actions>
- <slot name="delete-button"></slot>
- </template>
- </title-area>
-</template>
diff --git a/app/assets/javascripts/packages/details/components/pypi_installation.vue b/app/assets/javascripts/packages/details/components/pypi_installation.vue
deleted file mode 100644
index fe4709d5feb..00000000000
--- a/app/assets/javascripts/packages/details/components/pypi_installation.vue
+++ /dev/null
@@ -1,71 +0,0 @@
-<script>
-import { GlLink, GlSprintf } from '@gitlab/ui';
-import { mapGetters, mapState } from 'vuex';
-import { s__ } from '~/locale';
-import InstallationTitle from '~/packages/details/components/installation_title.vue';
-import CodeInstruction from '~/vue_shared/components/registry/code_instruction.vue';
-import { TrackingActions, TrackingLabels } from '../constants';
-
-export default {
- name: 'PyPiInstallation',
- components: {
- InstallationTitle,
- CodeInstruction,
- GlLink,
- GlSprintf,
- },
- computed: {
- ...mapState(['pypiHelpPath']),
- ...mapGetters(['pypiPipCommand', 'pypiSetupCommand']),
- },
- i18n: {
- setupText: s__(
- `PackageRegistry|If you haven't already done so, you will need to add the below to your %{codeStart}.pypirc%{codeEnd} file.`,
- ),
- helpText: s__(
- 'PackageRegistry|For more information on the PyPi registry, %{linkStart}see the documentation%{linkEnd}.',
- ),
- },
- trackingActions: { ...TrackingActions },
- TrackingLabels,
- installOptions: [{ value: 'pypi', label: s__('PackageRegistry|Show PyPi commands') }],
-};
-</script>
-
-<template>
- <div>
- <installation-title package-type="pypi" :options="$options.installOptions" />
-
- <code-instruction
- :label="s__('PackageRegistry|Pip Command')"
- :instruction="pypiPipCommand"
- :copy-text="s__('PackageRegistry|Copy Pip command')"
- data-testid="pip-command"
- :tracking-action="$options.trackingActions.COPY_PIP_INSTALL_COMMAND"
- :tracking-label="$options.TrackingLabels.CODE_INSTRUCTION"
- />
-
- <h3 class="gl-font-lg">{{ __('Registry setup') }}</h3>
- <p>
- <gl-sprintf :message="$options.i18n.setupText">
- <template #code="{ content }">
- <code>{{ content }}</code>
- </template>
- </gl-sprintf>
- </p>
-
- <code-instruction
- :instruction="pypiSetupCommand"
- :copy-text="s__('PackageRegistry|Copy .pypirc content')"
- data-testid="pypi-setup-content"
- multiline
- :tracking-action="$options.trackingActions.COPY_PYPI_SETUP_COMMAND"
- :tracking-label="$options.TrackingLabels.CODE_INSTRUCTION"
- />
- <gl-sprintf :message="$options.i18n.helpText">
- <template #link="{ content }">
- <gl-link :href="pypiHelpPath" target="_blank">{{ content }}</gl-link>
- </template>
- </gl-sprintf>
- </div>
-</template>
diff --git a/app/assets/javascripts/packages/details/constants.js b/app/assets/javascripts/packages/details/constants.js
deleted file mode 100644
index cd34b1ad45a..00000000000
--- a/app/assets/javascripts/packages/details/constants.js
+++ /dev/null
@@ -1,55 +0,0 @@
-import { s__ } from '~/locale';
-
-export const TrackingLabels = {
- CODE_INSTRUCTION: 'code_instruction',
- CONAN_INSTALLATION: 'conan_installation',
- MAVEN_INSTALLATION: 'maven_installation',
- NPM_INSTALLATION: 'npm_installation',
- NUGET_INSTALLATION: 'nuget_installation',
- PYPI_INSTALLATION: 'pypi_installation',
- COMPOSER_INSTALLATION: 'composer_installation',
-};
-
-export const TrackingActions = {
- INSTALLATION: 'installation',
- REGISTRY_SETUP: 'registry_setup',
-
- COPY_CONAN_COMMAND: 'copy_conan_command',
- COPY_CONAN_SETUP_COMMAND: 'copy_conan_setup_command',
-
- COPY_MAVEN_XML: 'copy_maven_xml',
- COPY_MAVEN_COMMAND: 'copy_maven_command',
- COPY_MAVEN_SETUP: 'copy_maven_setup_xml',
-
- COPY_NPM_INSTALL_COMMAND: 'copy_npm_install_command',
- COPY_NPM_SETUP_COMMAND: 'copy_npm_setup_command',
-
- COPY_YARN_INSTALL_COMMAND: 'copy_yarn_install_command',
- COPY_YARN_SETUP_COMMAND: 'copy_yarn_setup_command',
-
- COPY_NUGET_INSTALL_COMMAND: 'copy_nuget_install_command',
- COPY_NUGET_SETUP_COMMAND: 'copy_nuget_setup_command',
-
- COPY_PIP_INSTALL_COMMAND: 'copy_pip_install_command',
- COPY_PYPI_SETUP_COMMAND: 'copy_pypi_setup_command',
-
- COPY_COMPOSER_REGISTRY_INCLUDE_COMMAND: 'copy_composer_registry_include_command',
- COPY_COMPOSER_PACKAGE_INCLUDE_COMMAND: 'copy_composer_package_include_command',
-
- COPY_GRADLE_INSTALL_COMMAND: 'copy_gradle_install_command',
- COPY_GRADLE_ADD_TO_SOURCE_COMMAND: 'copy_gradle_add_to_source_command',
-
- COPY_KOTLIN_INSTALL_COMMAND: 'copy_kotlin_install_command',
- COPY_KOTLIN_ADD_TO_SOURCE_COMMAND: 'copy_kotlin_add_to_source_command',
-};
-
-export const NpmManager = {
- NPM: 'npm',
- YARN: 'yarn',
-};
-
-export const FETCH_PACKAGE_VERSIONS_ERROR = s__(
- 'PackageRegistry|Unable to fetch package version information.',
-);
-
-export const HISTORY_PIPELINES_LIMIT = 5;
diff --git a/app/assets/javascripts/packages/details/index.js b/app/assets/javascripts/packages/details/index.js
deleted file mode 100644
index 5b9d58a3860..00000000000
--- a/app/assets/javascripts/packages/details/index.js
+++ /dev/null
@@ -1,32 +0,0 @@
-import Vue from 'vue';
-import Translate from '~/vue_shared/translate';
-import PackagesApp from './components/app.vue';
-import createStore from './store';
-
-Vue.use(Translate);
-
-export default () => {
- const el = document.querySelector('#js-vue-packages-detail');
- const { package: packageJson, canDelete: canDeleteStr, ...rest } = el.dataset;
- const packageEntity = JSON.parse(packageJson);
- const canDelete = canDeleteStr === 'true';
-
- const store = createStore({
- packageEntity,
- packageFiles: packageEntity.package_files,
- canDelete,
- ...rest,
- });
-
- // eslint-disable-next-line no-new
- new Vue({
- el,
- components: {
- PackagesApp,
- },
- store,
- render(createElement) {
- return createElement('packages-app');
- },
- });
-};
diff --git a/app/assets/javascripts/packages/details/store/getters.js b/app/assets/javascripts/packages/details/store/getters.js
deleted file mode 100644
index ae273e26d6a..00000000000
--- a/app/assets/javascripts/packages/details/store/getters.js
+++ /dev/null
@@ -1,140 +0,0 @@
-import { PackageType } from '../../shared/constants';
-import { getPackageTypeLabel } from '../../shared/utils';
-import { NpmManager } from '../constants';
-
-export const packagePipeline = ({ packageEntity }) => {
- return packageEntity?.pipeline || null;
-};
-
-export const packageTypeDisplay = ({ packageEntity }) => {
- return getPackageTypeLabel(packageEntity.package_type);
-};
-
-export const packageIcon = ({ packageEntity }) => {
- if (packageEntity.package_type === PackageType.NUGET) {
- return packageEntity.nuget_metadatum?.icon_url || null;
- }
-
- return null;
-};
-
-export const conanInstallationCommand = ({ packageEntity }) => {
- // eslint-disable-next-line @gitlab/require-i18n-strings
- return `conan install ${packageEntity.name} --remote=gitlab`;
-};
-
-export const conanSetupCommand = ({ conanPath }) =>
- // eslint-disable-next-line @gitlab/require-i18n-strings
- `conan remote add gitlab ${conanPath}`;
-
-export const mavenInstallationXml = ({ packageEntity = {} }) => {
- const {
- app_group: appGroup = '',
- app_name: appName = '',
- app_version: appVersion = '',
- } = packageEntity.maven_metadatum;
-
- return `<dependency>
- <groupId>${appGroup}</groupId>
- <artifactId>${appName}</artifactId>
- <version>${appVersion}</version>
-</dependency>`;
-};
-
-export const mavenInstallationCommand = ({ packageEntity = {} }) => {
- const {
- app_group: group = '',
- app_name: name = '',
- app_version: version = '',
- } = packageEntity.maven_metadatum;
-
- return `mvn dependency:get -Dartifact=${group}:${name}:${version}`;
-};
-
-export const mavenSetupXml = ({ mavenPath }) => `<repositories>
- <repository>
- <id>gitlab-maven</id>
- <url>${mavenPath}</url>
- </repository>
-</repositories>
-
-<distributionManagement>
- <repository>
- <id>gitlab-maven</id>
- <url>${mavenPath}</url>
- </repository>
-
- <snapshotRepository>
- <id>gitlab-maven</id>
- <url>${mavenPath}</url>
- </snapshotRepository>
-</distributionManagement>`;
-
-export const npmInstallationCommand = ({ packageEntity }) => (type = NpmManager.NPM) => {
- // eslint-disable-next-line @gitlab/require-i18n-strings
- const instruction = type === NpmManager.NPM ? 'npm i' : 'yarn add';
-
- return `${instruction} ${packageEntity.name}`;
-};
-
-export const npmSetupCommand = ({ packageEntity, npmPath }) => (type = NpmManager.NPM) => {
- const scope = packageEntity.name.substring(0, packageEntity.name.indexOf('/'));
-
- if (type === NpmManager.NPM) {
- return `echo ${scope}:registry=${npmPath}/ >> .npmrc`;
- }
-
- return `echo \\"${scope}:registry\\" \\"${npmPath}/\\" >> .yarnrc`;
-};
-
-export const nugetInstallationCommand = ({ packageEntity }) =>
- `nuget install ${packageEntity.name} -Source "GitLab"`;
-
-export const nugetSetupCommand = ({ nugetPath }) =>
- `nuget source Add -Name "GitLab" -Source "${nugetPath}" -UserName <your_username> -Password <your_token>`;
-
-export const pypiPipCommand = ({ pypiPath, packageEntity }) =>
- // eslint-disable-next-line @gitlab/require-i18n-strings
- `pip install ${packageEntity.name} --extra-index-url ${pypiPath}`;
-
-export const pypiSetupCommand = ({ pypiSetupPath }) => `[gitlab]
-repository = ${pypiSetupPath}
-username = __token__
-password = <your personal access token>`;
-
-export const composerRegistryInclude = ({ composerPath, composerConfigRepositoryName }) =>
- // eslint-disable-next-line @gitlab/require-i18n-strings
- `composer config repositories.${composerConfigRepositoryName} '{"type": "composer", "url": "${composerPath}"}'`;
-
-export const composerPackageInclude = ({ packageEntity }) =>
- // eslint-disable-next-line @gitlab/require-i18n-strings
- `composer req ${[packageEntity.name]}:${packageEntity.version}`;
-
-export const gradleGroovyInstalCommand = ({ packageEntity }) => {
- const {
- app_group: group = '',
- app_name: name = '',
- app_version: version = '',
- } = packageEntity.maven_metadatum;
- // eslint-disable-next-line @gitlab/require-i18n-strings
- return `implementation '${group}:${name}:${version}'`;
-};
-
-export const gradleGroovyAddSourceCommand = ({ mavenPath }) =>
- // eslint-disable-next-line @gitlab/require-i18n-strings
- `maven {
- url '${mavenPath}'
-}`;
-
-export const gradleKotlinInstalCommand = ({ packageEntity }) => {
- const {
- app_group: group = '',
- app_name: name = '',
- app_version: version = '',
- } = packageEntity.maven_metadatum;
- return `implementation("${group}:${name}:${version}")`;
-};
-
-export const gradleKotlinAddSourceCommand = ({ mavenPath }) => `maven("${mavenPath}")`;
-
-export const groupExists = ({ groupListUrl }) => groupListUrl.length > 0;
diff --git a/app/assets/javascripts/packages/details/utils.js b/app/assets/javascripts/packages/details/utils.js
deleted file mode 100644
index 27cc95566d3..00000000000
--- a/app/assets/javascripts/packages/details/utils.js
+++ /dev/null
@@ -1,10 +0,0 @@
-import { TrackingActions } from './constants';
-
-export const trackInstallationTabChange = {
- methods: {
- trackInstallationTabChange(tabIndex) {
- const action = tabIndex === 0 ? TrackingActions.INSTALLATION : TrackingActions.REGISTRY_SETUP;
- this.track(action, { label: this.trackingLabel });
- },
- },
-};
diff --git a/app/assets/javascripts/packages/shared/constants.js b/app/assets/javascripts/packages/shared/constants.js
index f15c31b85c1..c284b8358b4 100644
--- a/app/assets/javascripts/packages/shared/constants.js
+++ b/app/assets/javascripts/packages/shared/constants.js
@@ -1,5 +1,4 @@
-/* eslint-disable @gitlab/require-string-literal-i18n-helpers */
-import { __, s__ } from '~/locale';
+import { s__ } from '~/locale';
export const PackageType = {
CONAN: 'conan',
@@ -38,7 +37,7 @@ export const DELETE_PACKAGE_ERROR_MESSAGE = s__(
'PackageRegistry|Something went wrong while deleting the package.',
);
export const DELETE_PACKAGE_FILE_ERROR_MESSAGE = s__(
- __('PackageRegistry|Something went wrong while deleting the package file.'),
+ 'PackageRegistry|Something went wrong while deleting the package file.',
);
export const DELETE_PACKAGE_FILE_SUCCESS_MESSAGE = s__(
'PackageRegistry|Package file deleted successfully',
diff --git a/app/assets/javascripts/packages_and_registries/dependency_proxy/app.vue b/app/assets/javascripts/packages_and_registries/dependency_proxy/app.vue
new file mode 100644
index 00000000000..73fb3656af1
--- /dev/null
+++ b/app/assets/javascripts/packages_and_registries/dependency_proxy/app.vue
@@ -0,0 +1,105 @@
+<script>
+import { GlAlert, GlFormGroup, GlFormInputGroup, GlSkeletonLoader, GlSprintf } from '@gitlab/ui';
+import { __ } from '~/locale';
+import ClipboardButton from '~/vue_shared/components/clipboard_button.vue';
+import TitleArea from '~/vue_shared/components/registry/title_area.vue';
+import {
+ DEPENDENCY_PROXY_SETTINGS_DESCRIPTION,
+ DEPENDENCY_PROXY_DOCS_PATH,
+} from '~/packages_and_registries/settings/group/constants';
+
+import getDependencyProxyDetailsQuery from '~/packages_and_registries/dependency_proxy/graphql/queries/get_dependency_proxy_details.query.graphql';
+
+export default {
+ components: {
+ GlFormGroup,
+ GlAlert,
+ GlFormInputGroup,
+ GlSprintf,
+ ClipboardButton,
+ TitleArea,
+ GlSkeletonLoader,
+ },
+ inject: ['groupPath', 'dependencyProxyAvailable'],
+ i18n: {
+ proxyNotAvailableText: __('Dependency Proxy feature is limited to public groups for now.'),
+ proxyDisabledText: __('Dependency Proxy disabled. To enable it, contact the group owner.'),
+ proxyImagePrefix: __('Dependency Proxy image prefix'),
+ copyImagePrefixText: __('Copy prefix'),
+ blobCountAndSize: __('Contains %{count} blobs of images (%{size})'),
+ },
+ data() {
+ return {
+ group: {},
+ };
+ },
+ apollo: {
+ group: {
+ query: getDependencyProxyDetailsQuery,
+ skip() {
+ return !this.dependencyProxyAvailable;
+ },
+ variables() {
+ return { fullPath: this.groupPath };
+ },
+ },
+ },
+ computed: {
+ infoMessages() {
+ return [
+ {
+ text: DEPENDENCY_PROXY_SETTINGS_DESCRIPTION,
+ link: DEPENDENCY_PROXY_DOCS_PATH,
+ },
+ ];
+ },
+ dependencyProxyEnabled() {
+ return this.group?.dependencyProxySetting?.enabled;
+ },
+ },
+};
+</script>
+
+<template>
+ <div>
+ <title-area :title="__('Dependency Proxy')" :info-messages="infoMessages" />
+ <gl-alert
+ v-if="!dependencyProxyAvailable"
+ :dismissible="false"
+ data-testid="proxy-not-available"
+ >
+ {{ $options.i18n.proxyNotAvailableText }}
+ </gl-alert>
+
+ <gl-skeleton-loader v-else-if="$apollo.queries.group.loading" />
+
+ <div v-else-if="dependencyProxyEnabled" data-testid="main-area">
+ <gl-form-group :label="$options.i18n.proxyImagePrefix">
+ <gl-form-input-group
+ readonly
+ :value="group.dependencyProxyImagePrefix"
+ class="gl-layout-w-limited"
+ data-testid="proxy-url"
+ >
+ <template #append>
+ <clipboard-button
+ :text="group.dependencyProxyImagePrefix"
+ :title="$options.i18n.copyImagePrefixText"
+ />
+ </template>
+ </gl-form-input-group>
+ <template #description>
+ <span data-qa-selector="dependency_proxy_count" data-testid="proxy-count">
+ <gl-sprintf :message="$options.i18n.blobCountAndSize">
+ <template #count>{{ group.dependencyProxyBlobCount }}</template>
+ <template #size>{{ group.dependencyProxyTotalSize }}</template>
+ </gl-sprintf>
+ </span>
+ </template>
+ </gl-form-group>
+ </div>
+ <gl-alert v-else :dismissible="false" data-testid="proxy-disabled">
+ {{ $options.i18n.proxyDisabledText }}
+ </gl-alert>
+ </div>
+</template>
diff --git a/app/assets/javascripts/packages_and_registries/dependency_proxy/graphql/index.js b/app/assets/javascripts/packages_and_registries/dependency_proxy/graphql/index.js
new file mode 100644
index 00000000000..16152eb81f6
--- /dev/null
+++ b/app/assets/javascripts/packages_and_registries/dependency_proxy/graphql/index.js
@@ -0,0 +1,14 @@
+import Vue from 'vue';
+import VueApollo from 'vue-apollo';
+import createDefaultClient from '~/lib/graphql';
+
+Vue.use(VueApollo);
+
+export const apolloProvider = new VueApollo({
+ defaultClient: createDefaultClient(
+ {},
+ {
+ assumeImmutableResults: true,
+ },
+ ),
+});
diff --git a/app/assets/javascripts/packages_and_registries/dependency_proxy/graphql/queries/get_dependency_proxy_details.query.graphql b/app/assets/javascripts/packages_and_registries/dependency_proxy/graphql/queries/get_dependency_proxy_details.query.graphql
new file mode 100644
index 00000000000..9058d349bf3
--- /dev/null
+++ b/app/assets/javascripts/packages_and_registries/dependency_proxy/graphql/queries/get_dependency_proxy_details.query.graphql
@@ -0,0 +1,10 @@
+query getDependencyProxyDetails($fullPath: ID!) {
+ group(fullPath: $fullPath) {
+ dependencyProxyBlobCount
+ dependencyProxyTotalSize
+ dependencyProxyImagePrefix
+ dependencyProxySetting {
+ enabled
+ }
+ }
+}
diff --git a/app/assets/javascripts/packages_and_registries/dependency_proxy/index.js b/app/assets/javascripts/packages_and_registries/dependency_proxy/index.js
new file mode 100644
index 00000000000..dc73470e07d
--- /dev/null
+++ b/app/assets/javascripts/packages_and_registries/dependency_proxy/index.js
@@ -0,0 +1,26 @@
+import Vue from 'vue';
+import { parseBoolean } from '~/lib/utils/common_utils';
+import app from '~/packages_and_registries/dependency_proxy/app.vue';
+import { apolloProvider } from '~/packages_and_registries/dependency_proxy/graphql';
+import Translate from '~/vue_shared/translate';
+
+Vue.use(Translate);
+
+export const initDependencyProxyApp = () => {
+ const el = document.getElementById('js-dependency-proxy');
+ if (!el) {
+ return null;
+ }
+ const { dependencyProxyAvailable, ...dataset } = el.dataset;
+ return new Vue({
+ el,
+ apolloProvider,
+ provide: {
+ dependencyProxyAvailable: parseBoolean(dependencyProxyAvailable),
+ ...dataset,
+ },
+ render(createElement) {
+ return createElement(app);
+ },
+ });
+};
diff --git a/app/assets/javascripts/packages_and_registries/infrastructure_registry/details/components/app.vue b/app/assets/javascripts/packages_and_registries/infrastructure_registry/details/components/app.vue
new file mode 100644
index 00000000000..6016757c1b9
--- /dev/null
+++ b/app/assets/javascripts/packages_and_registries/infrastructure_registry/details/components/app.vue
@@ -0,0 +1,240 @@
+<script>
+import {
+ GlButton,
+ GlModal,
+ GlModalDirective,
+ GlTooltipDirective,
+ GlEmptyState,
+ GlTab,
+ GlTabs,
+ GlSprintf,
+} from '@gitlab/ui';
+import { mapActions, mapState } from 'vuex';
+import { numberToHumanSize } from '~/lib/utils/number_utils';
+import { objectToQuery } from '~/lib/utils/url_utility';
+import { s__, __ } from '~/locale';
+import TerraformTitle from '~/packages_and_registries/infrastructure_registry/details/components/details_title.vue';
+import TerraformInstallation from '~/packages_and_registries/infrastructure_registry/details/components/terraform_installation.vue';
+import Tracking from '~/tracking';
+import PackageListRow from '~/packages/shared/components/package_list_row.vue';
+import PackagesListLoader from '~/packages/shared/components/packages_list_loader.vue';
+import { TrackingActions, SHOW_DELETE_SUCCESS_ALERT } from '~/packages/shared/constants';
+import { packageTypeToTrackCategory } from '~/packages/shared/utils';
+import PackageFiles from './package_files.vue';
+import PackageHistory from './package_history.vue';
+
+export default {
+ name: 'PackagesApp',
+ components: {
+ GlButton,
+ GlEmptyState,
+ GlModal,
+ GlTab,
+ GlTabs,
+ GlSprintf,
+ TerraformTitle,
+ PackagesListLoader,
+ PackageListRow,
+ PackageHistory,
+ TerraformInstallation,
+ PackageFiles,
+ },
+ directives: {
+ GlTooltip: GlTooltipDirective,
+ GlModal: GlModalDirective,
+ },
+ mixins: [Tracking.mixin()],
+ trackingActions: { ...TrackingActions },
+ data() {
+ return {
+ fileToDelete: null,
+ };
+ },
+ computed: {
+ ...mapState([
+ 'projectName',
+ 'packageEntity',
+ 'packageFiles',
+ 'isLoading',
+ 'canDelete',
+ 'svgPath',
+ 'npmPath',
+ 'npmHelpPath',
+ 'projectListUrl',
+ 'groupListUrl',
+ ]),
+ isValidPackage() {
+ return Boolean(this.packageEntity.name);
+ },
+ tracking() {
+ return {
+ category: packageTypeToTrackCategory(this.packageEntity.package_type),
+ };
+ },
+ hasVersions() {
+ return this.packageEntity.versions?.length > 0;
+ },
+ },
+ methods: {
+ ...mapActions(['deletePackage', 'fetchPackageVersions', 'deletePackageFile']),
+ formatSize(size) {
+ return numberToHumanSize(size);
+ },
+ getPackageVersions() {
+ if (!this.packageEntity.versions) {
+ this.fetchPackageVersions();
+ }
+ },
+ async confirmPackageDeletion() {
+ this.track(TrackingActions.DELETE_PACKAGE);
+ await this.deletePackage();
+ const returnTo =
+ !this.groupListUrl || document.referrer.includes(this.projectName)
+ ? this.projectListUrl
+ : this.groupListUrl; // to avoid security issue url are supplied from backend
+ const modalQuery = objectToQuery({ [SHOW_DELETE_SUCCESS_ALERT]: true });
+ window.location.replace(`${returnTo}?${modalQuery}`);
+ },
+ handleFileDelete(file) {
+ this.track(TrackingActions.REQUEST_DELETE_PACKAGE_FILE);
+ this.fileToDelete = { ...file };
+ this.$refs.deleteFileModal.show();
+ },
+ confirmFileDelete() {
+ this.track(TrackingActions.DELETE_PACKAGE_FILE);
+ this.deletePackageFile(this.fileToDelete.id);
+ this.fileToDelete = null;
+ },
+ },
+ i18n: {
+ deleteModalTitle: s__(`PackageRegistry|Delete Package Version`),
+ deleteModalContent: s__(
+ `PackageRegistry|You are about to delete version %{version} of %{name}. Are you sure?`,
+ ),
+ deleteFileModalTitle: s__(`PackageRegistry|Delete Package File`),
+ deleteFileModalContent: s__(
+ `PackageRegistry|You are about to delete %{filename}. This is a destructive action that may render your package unusable. Are you sure?`,
+ ),
+ },
+ modal: {
+ packageDeletePrimaryAction: {
+ text: __('Delete'),
+ attributes: [
+ { variant: 'danger' },
+ { category: 'primary' },
+ { 'data-qa-selector': 'delete_modal_button' },
+ ],
+ },
+ fileDeletePrimaryAction: {
+ text: __('Delete'),
+ attributes: [{ variant: 'danger' }, { category: 'primary' }],
+ },
+ cancelAction: {
+ text: __('Cancel'),
+ },
+ },
+};
+</script>
+
+<template>
+ <gl-empty-state
+ v-if="!isValidPackage"
+ :title="s__('PackageRegistry|Unable to load package')"
+ :description="s__('PackageRegistry|There was a problem fetching the details for this package.')"
+ :svg-path="svgPath"
+ />
+
+ <div v-else class="packages-app">
+ <terraform-title>
+ <template #delete-button>
+ <gl-button
+ v-if="canDelete"
+ v-gl-modal="'delete-modal'"
+ class="js-delete-button"
+ variant="danger"
+ category="primary"
+ data-qa-selector="delete_button"
+ >
+ {{ __('Delete') }}
+ </gl-button>
+ </template>
+ </terraform-title>
+
+ <gl-tabs>
+ <gl-tab :title="__('Detail')">
+ <div data-qa-selector="package_information_content">
+ <package-history :package-entity="packageEntity" :project-name="projectName" />
+ <terraform-installation />
+ </div>
+
+ <package-files
+ :package-files="packageFiles"
+ :can-delete="canDelete"
+ @download-file="track($options.trackingActions.PULL_PACKAGE)"
+ @delete-file="handleFileDelete"
+ />
+ </gl-tab>
+
+ <gl-tab
+ :title="__('Other versions')"
+ title-item-class="js-versions-tab"
+ @click="getPackageVersions"
+ >
+ <template v-if="isLoading && !hasVersions">
+ <packages-list-loader />
+ </template>
+
+ <template v-else-if="hasVersions">
+ <package-list-row
+ v-for="v in packageEntity.versions"
+ :key="v.id"
+ :package-entity="{ name: packageEntity.name, ...v }"
+ :package-link="v.id.toString()"
+ :disable-delete="true"
+ :show-package-type="false"
+ />
+ </template>
+
+ <p v-else class="gl-mt-3" data-testid="no-versions-message">
+ {{ s__('PackageRegistry|There are no other versions of this package.') }}
+ </p>
+ </gl-tab>
+ </gl-tabs>
+
+ <gl-modal
+ ref="deleteModal"
+ modal-id="delete-modal"
+ :action-primary="$options.modal.packageDeletePrimaryAction"
+ :action-cancel="$options.modal.cancelAction"
+ @primary="confirmPackageDeletion"
+ @canceled="track($options.trackingActions.CANCEL_DELETE_PACKAGE)"
+ >
+ <template #modal-title>{{ $options.i18n.deleteModalTitle }}</template>
+ <gl-sprintf :message="$options.i18n.deleteModalContent">
+ <template #version>
+ <strong>{{ packageEntity.version }}</strong>
+ </template>
+
+ <template #name>
+ <strong>{{ packageEntity.name }}</strong>
+ </template>
+ </gl-sprintf>
+ </gl-modal>
+
+ <gl-modal
+ ref="deleteFileModal"
+ modal-id="delete-file-modal"
+ :action-primary="$options.modal.fileDeletePrimaryAction"
+ :action-cancel="$options.modal.cancelAction"
+ @primary="confirmFileDelete"
+ @canceled="track($options.trackingActions.CANCEL_DELETE_PACKAGE_FILE)"
+ >
+ <template #modal-title>{{ $options.i18n.deleteFileModalTitle }}</template>
+ <gl-sprintf v-if="fileToDelete" :message="$options.i18n.deleteFileModalContent">
+ <template #filename>
+ <strong>{{ fileToDelete.file_name }}</strong>
+ </template>
+ </gl-sprintf>
+ </gl-modal>
+ </div>
+</template>
diff --git a/app/assets/javascripts/packages_and_registries/infrastructure_registry/components/details_title.vue b/app/assets/javascripts/packages_and_registries/infrastructure_registry/details/components/details_title.vue
index 3e551706ed0..3e551706ed0 100644
--- a/app/assets/javascripts/packages_and_registries/infrastructure_registry/components/details_title.vue
+++ b/app/assets/javascripts/packages_and_registries/infrastructure_registry/details/components/details_title.vue
diff --git a/app/assets/javascripts/packages/details/components/file_sha.vue b/app/assets/javascripts/packages_and_registries/infrastructure_registry/details/components/file_sha.vue
index a25839be7e1..a25839be7e1 100644
--- a/app/assets/javascripts/packages/details/components/file_sha.vue
+++ b/app/assets/javascripts/packages_and_registries/infrastructure_registry/details/components/file_sha.vue
diff --git a/app/assets/javascripts/packages_and_registries/infrastructure_registry/details/components/package_files.vue b/app/assets/javascripts/packages_and_registries/infrastructure_registry/details/components/package_files.vue
new file mode 100644
index 00000000000..ab4cfccd023
--- /dev/null
+++ b/app/assets/javascripts/packages_and_registries/infrastructure_registry/details/components/package_files.vue
@@ -0,0 +1,165 @@
+<script>
+import { GlLink, GlTable, GlDropdownItem, GlDropdown, GlIcon, GlButton } from '@gitlab/ui';
+import { last } from 'lodash';
+import { numberToHumanSize } from '~/lib/utils/number_utils';
+import { __ } from '~/locale';
+import Tracking from '~/tracking';
+import FileIcon from '~/vue_shared/components/file_icon.vue';
+import TimeAgoTooltip from '~/vue_shared/components/time_ago_tooltip.vue';
+import FileSha from './file_sha.vue';
+
+export default {
+ name: 'PackageFiles',
+ components: {
+ GlLink,
+ GlTable,
+ GlIcon,
+ GlDropdown,
+ GlDropdownItem,
+ GlButton,
+ FileIcon,
+ TimeAgoTooltip,
+ FileSha,
+ },
+ mixins: [Tracking.mixin()],
+ props: {
+ packageFiles: {
+ type: Array,
+ required: false,
+ default: () => [],
+ },
+ canDelete: {
+ type: Boolean,
+ default: false,
+ required: false,
+ },
+ },
+ computed: {
+ filesTableRows() {
+ return this.packageFiles.map((pf) => ({
+ ...pf,
+ size: this.formatSize(pf.size),
+ pipeline: last(pf.pipelines),
+ }));
+ },
+ showCommitColumn() {
+ return this.filesTableRows.some((row) => Boolean(row.pipeline?.id));
+ },
+ filesTableHeaderFields() {
+ return [
+ {
+ key: 'name',
+ label: __('Name'),
+ },
+ {
+ key: 'commit',
+ label: __('Commit'),
+ hide: !this.showCommitColumn,
+ },
+ {
+ key: 'size',
+ label: __('Size'),
+ },
+ {
+ key: 'created',
+ label: __('Created'),
+ class: 'gl-text-right',
+ },
+ {
+ key: 'actions',
+ label: '',
+ hide: !this.canDelete,
+ class: 'gl-text-right',
+ tdClass: 'gl-w-4',
+ },
+ ].filter((c) => !c.hide);
+ },
+ },
+ methods: {
+ formatSize(size) {
+ return numberToHumanSize(size);
+ },
+ hasDetails(item) {
+ return item.file_sha256 || item.file_md5 || item.file_sha1;
+ },
+ },
+ i18n: {
+ deleteFile: __('Delete file'),
+ },
+};
+</script>
+
+<template>
+ <div>
+ <h3 class="gl-font-lg gl-mt-5">{{ __('Files') }}</h3>
+ <gl-table
+ :fields="filesTableHeaderFields"
+ :items="filesTableRows"
+ :tbody-tr-attr="{ 'data-testid': 'file-row' }"
+ >
+ <template #cell(name)="{ item, toggleDetails, detailsShowing }">
+ <gl-button
+ v-if="hasDetails(item)"
+ :icon="detailsShowing ? 'angle-up' : 'angle-down'"
+ :aria-label="detailsShowing ? __('Collapse') : __('Expand')"
+ category="tertiary"
+ size="small"
+ @click="toggleDetails"
+ />
+ <gl-link
+ :href="item.download_path"
+ class="gl-text-gray-500"
+ data-testid="download-link"
+ @click="$emit('download-file')"
+ >
+ <file-icon
+ :file-name="item.file_name"
+ css-classes="gl-relative file-icon"
+ class="gl-mr-1 gl-relative"
+ />
+ <span>{{ item.file_name }}</span>
+ </gl-link>
+ </template>
+
+ <template #cell(commit)="{ item }">
+ <gl-link
+ v-if="item.pipeline && item.pipeline.project"
+ :href="item.pipeline.project.commit_url"
+ class="gl-text-gray-500"
+ data-testid="commit-link"
+ >{{ item.pipeline.git_commit_message }}</gl-link
+ >
+ </template>
+
+ <template #cell(created)="{ item }">
+ <time-ago-tooltip :time="item.created_at" />
+ </template>
+
+ <template #cell(actions)="{ item }">
+ <gl-dropdown category="tertiary" right>
+ <template #button-content>
+ <gl-icon name="ellipsis_v" />
+ </template>
+ <gl-dropdown-item data-testid="delete-file" @click="$emit('delete-file', item)">
+ {{ $options.i18n.deleteFile }}
+ </gl-dropdown-item>
+ </gl-dropdown>
+ </template>
+
+ <template #row-details="{ item }">
+ <div
+ class="gl-display-flex gl-flex-direction-column gl-flex-grow-1 gl-bg-gray-10 gl-rounded-base gl-inset-border-1-gray-100"
+ >
+ <file-sha
+ v-if="item.file_sha256"
+ data-testid="sha-256"
+ title="SHA-256"
+ :sha="item.file_sha256"
+ />
+ <file-sha v-if="item.file_md5" data-testid="md5" title="MD5" :sha="item.file_md5" />
+ <file-sha v-if="item.file_sha1" data-testid="sha-1" title="SHA-1" :sha="item.file_sha1" />
+ </div>
+ </template>
+ </gl-table>
+ </div>
+</template>
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
new file mode 100644
index 00000000000..e5be98b87f7
--- /dev/null
+++ b/app/assets/javascripts/packages_and_registries/infrastructure_registry/details/components/package_history.vue
@@ -0,0 +1,165 @@
+<script>
+import { GlLink, GlSprintf } from '@gitlab/ui';
+import { first } from 'lodash';
+import { truncateSha } from '~/lib/utils/text_utility';
+import { s__, n__ } from '~/locale';
+import { HISTORY_PIPELINES_LIMIT } from '~/packages_and_registries/shared/constants';
+import HistoryItem from '~/vue_shared/components/registry/history_item.vue';
+import TimeAgoTooltip from '~/vue_shared/components/time_ago_tooltip.vue';
+
+export default {
+ name: 'PackageHistory',
+ i18n: {
+ createdOn: s__('PackageRegistry|%{name} version %{version} was first created %{datetime}'),
+ createdByCommitText: s__('PackageRegistry|Created by commit %{link} on branch %{branch}'),
+ createdByPipelineText: s__(
+ 'PackageRegistry|Built by pipeline %{link} triggered %{datetime} by %{author}',
+ ),
+ publishText: s__('PackageRegistry|Published to the %{project} Package Registry %{datetime}'),
+ combinedUpdateText: s__(
+ 'PackageRegistry|Package updated by commit %{link} on branch %{branch}, built by pipeline %{pipeline}, and published to the registry %{datetime}',
+ ),
+ },
+ components: {
+ GlLink,
+ GlSprintf,
+ HistoryItem,
+ TimeAgoTooltip,
+ },
+ props: {
+ packageEntity: {
+ type: Object,
+ required: true,
+ },
+ projectName: {
+ type: String,
+ required: true,
+ },
+ },
+ data() {
+ return {
+ showDescription: false,
+ };
+ },
+ computed: {
+ pipelines() {
+ return this.packageEntity.pipelines || [];
+ },
+ firstPipeline() {
+ return first(this.pipelines);
+ },
+ lastPipelines() {
+ return this.pipelines.slice(1).slice(-HISTORY_PIPELINES_LIMIT);
+ },
+ showPipelinesInfo() {
+ return Boolean(this.firstPipeline?.id);
+ },
+ archivedLines() {
+ return Math.max(this.pipelines.length - HISTORY_PIPELINES_LIMIT - 1, 0);
+ },
+ archivedPipelineMessage() {
+ return n__(
+ 'PackageRegistry|Package has %{updatesCount} archived update',
+ 'PackageRegistry|Package has %{updatesCount} archived updates',
+ this.archivedLines,
+ );
+ },
+ },
+ methods: {
+ truncate(value) {
+ return truncateSha(value);
+ },
+ },
+};
+</script>
+
+<template>
+ <div class="issuable-discussion">
+ <h3 class="gl-font-lg" data-testid="title">{{ __('History') }}</h3>
+ <ul class="timeline main-notes-list notes gl-mb-4" data-testid="timeline">
+ <history-item icon="clock" data-testid="created-on">
+ <gl-sprintf :message="$options.i18n.createdOn">
+ <template #name>
+ <strong>{{ packageEntity.name }}</strong>
+ </template>
+ <template #version>
+ <strong>{{ packageEntity.version }}</strong>
+ </template>
+ <template #datetime>
+ <time-ago-tooltip :time="packageEntity.created_at" />
+ </template>
+ </gl-sprintf>
+ </history-item>
+
+ <template v-if="showPipelinesInfo">
+ <!-- FIRST PIPELINE BLOCK -->
+ <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
+ >
+ </template>
+ <template #branch>
+ <strong>{{ firstPipeline.ref }}</strong>
+ </template>
+ </gl-sprintf>
+ </history-item>
+ <history-item icon="pipeline" data-testid="first-pipeline-pipeline">
+ <gl-sprintf :message="$options.i18n.createdByPipelineText">
+ <template #link>
+ <gl-link :href="firstPipeline.project.pipeline_url">#{{ firstPipeline.id }}</gl-link>
+ </template>
+ <template #datetime>
+ <time-ago-tooltip :time="firstPipeline.created_at" />
+ </template>
+ <template #author>{{ firstPipeline.user.name }}</template>
+ </gl-sprintf>
+ </history-item>
+ </template>
+
+ <!-- PUBLISHED LINE -->
+ <history-item icon="package" data-testid="published">
+ <gl-sprintf :message="$options.i18n.publishText">
+ <template #project>
+ <strong>{{ projectName }}</strong>
+ </template>
+ <template #datetime>
+ <time-ago-tooltip :time="packageEntity.created_at" />
+ </template>
+ </gl-sprintf>
+ </history-item>
+
+ <history-item v-if="archivedLines" icon="history" data-testid="archived">
+ <gl-sprintf :message="archivedPipelineMessage">
+ <template #updatesCount>
+ <strong>{{ archivedLines }}</strong>
+ </template>
+ </gl-sprintf>
+ </history-item>
+
+ <!-- PIPELINES LIST ENTRIES -->
+ <history-item
+ v-for="pipeline in lastPipelines"
+ :key="pipeline.id"
+ icon="pencil"
+ data-testid="pipeline-entry"
+ >
+ <gl-sprintf :message="$options.i18n.combinedUpdateText">
+ <template #link>
+ <gl-link :href="pipeline.project.commit_url">#{{ truncate(pipeline.sha) }}</gl-link>
+ </template>
+ <template #branch>
+ <strong>{{ pipeline.ref }}</strong>
+ </template>
+ <template #pipeline>
+ <gl-link :href="pipeline.project.pipeline_url">#{{ pipeline.id }}</gl-link>
+ </template>
+ <template #datetime>
+ <time-ago-tooltip :time="pipeline.created_at" />
+ </template>
+ </gl-sprintf>
+ </history-item>
+ </ul>
+ </div>
+</template>
diff --git a/app/assets/javascripts/packages_and_registries/infrastructure_registry/components/terraform_installation.vue b/app/assets/javascripts/packages_and_registries/infrastructure_registry/details/components/terraform_installation.vue
index c62bf7fb722..c62bf7fb722 100644
--- a/app/assets/javascripts/packages_and_registries/infrastructure_registry/components/terraform_installation.vue
+++ b/app/assets/javascripts/packages_and_registries/infrastructure_registry/details/components/terraform_installation.vue
diff --git a/app/assets/javascripts/packages_and_registries/infrastructure_registry/details/constants.js b/app/assets/javascripts/packages_and_registries/infrastructure_registry/details/constants.js
new file mode 100644
index 00000000000..c0c67faffba
--- /dev/null
+++ b/app/assets/javascripts/packages_and_registries/infrastructure_registry/details/constants.js
@@ -0,0 +1,5 @@
+import { s__ } from '~/locale';
+
+export const FETCH_PACKAGE_VERSIONS_ERROR = s__(
+ 'PackageRegistry|Unable to fetch package version information.',
+);
diff --git a/app/assets/javascripts/packages/details/store/actions.js b/app/assets/javascripts/packages_and_registries/infrastructure_registry/details/store/actions.js
index a03fa8d9d63..a03fa8d9d63 100644
--- a/app/assets/javascripts/packages/details/store/actions.js
+++ b/app/assets/javascripts/packages_and_registries/infrastructure_registry/details/store/actions.js
diff --git a/app/assets/javascripts/packages_and_registries/infrastructure_registry/details/store/getters.js b/app/assets/javascripts/packages_and_registries/infrastructure_registry/details/store/getters.js
new file mode 100644
index 00000000000..6a17e7aa6d6
--- /dev/null
+++ b/app/assets/javascripts/packages_and_registries/infrastructure_registry/details/store/getters.js
@@ -0,0 +1,3 @@
+export const packagePipeline = ({ packageEntity }) => {
+ return packageEntity?.pipeline || null;
+};
diff --git a/app/assets/javascripts/packages/details/store/index.js b/app/assets/javascripts/packages_and_registries/infrastructure_registry/details/store/index.js
index 15e17bcfaac..15e17bcfaac 100644
--- a/app/assets/javascripts/packages/details/store/index.js
+++ b/app/assets/javascripts/packages_and_registries/infrastructure_registry/details/store/index.js
diff --git a/app/assets/javascripts/packages/details/store/mutation_types.js b/app/assets/javascripts/packages_and_registries/infrastructure_registry/details/store/mutation_types.js
index 590f2d9f970..590f2d9f970 100644
--- a/app/assets/javascripts/packages/details/store/mutation_types.js
+++ b/app/assets/javascripts/packages_and_registries/infrastructure_registry/details/store/mutation_types.js
diff --git a/app/assets/javascripts/packages/details/store/mutations.js b/app/assets/javascripts/packages_and_registries/infrastructure_registry/details/store/mutations.js
index 762fd5a4040..762fd5a4040 100644
--- a/app/assets/javascripts/packages/details/store/mutations.js
+++ b/app/assets/javascripts/packages_and_registries/infrastructure_registry/details/store/mutations.js
diff --git a/app/assets/javascripts/packages_and_registries/infrastructure_registry/details_app_bundle.js b/app/assets/javascripts/packages_and_registries/infrastructure_registry/details_app_bundle.js
index 98942b1e578..32fbc9382fd 100644
--- a/app/assets/javascripts/packages_and_registries/infrastructure_registry/details_app_bundle.js
+++ b/app/assets/javascripts/packages_and_registries/infrastructure_registry/details_app_bundle.js
@@ -1,7 +1,7 @@
import Vue from 'vue';
import { parseBoolean } from '~/lib/utils/common_utils';
-import PackagesApp from '~/packages/details/components/app.vue';
-import createStore from '~/packages/details/store';
+import PackagesApp from '~/packages_and_registries/infrastructure_registry/details/components/app.vue';
+import createStore from '~/packages_and_registries/infrastructure_registry/details/store';
import Translate from '~/vue_shared/translate';
Vue.use(Translate);
diff --git a/app/assets/javascripts/packages_and_registries/package_registry/components/details/metadata/nuget.vue b/app/assets/javascripts/packages_and_registries/package_registry/components/details/metadata/nuget.vue
index f0da7db6c91..1360b03856f 100644
--- a/app/assets/javascripts/packages_and_registries/package_registry/components/details/metadata/nuget.vue
+++ b/app/assets/javascripts/packages_and_registries/package_registry/components/details/metadata/nuget.vue
@@ -24,7 +24,13 @@ export default {
<template>
<div>
- <details-row icon="project" padding="gl-p-4" dashed data-testid="nuget-source">
+ <details-row
+ v-if="packageEntity.metadata.projectUrl"
+ icon="project"
+ padding="gl-p-4"
+ dashed
+ data-testid="nuget-source"
+ >
<gl-sprintf :message="$options.i18n.sourceText">
<template #link>
<gl-link :href="packageEntity.metadata.projectUrl" target="_blank">{{
@@ -33,7 +39,12 @@ export default {
</template>
</gl-sprintf>
</details-row>
- <details-row icon="license" padding="gl-p-4" data-testid="nuget-license">
+ <details-row
+ v-if="packageEntity.metadata.licenseUrl"
+ icon="license"
+ padding="gl-p-4"
+ data-testid="nuget-license"
+ >
<gl-sprintf :message="$options.i18n.licenseText">
<template #link>
<gl-link :href="packageEntity.metadata.licenseUrl" target="_blank">{{
diff --git a/app/assets/javascripts/packages_and_registries/package_registry/components/details/npm_installation.vue b/app/assets/javascripts/packages_and_registries/package_registry/components/details/npm_installation.vue
index 47081e23318..2448324549e 100644
--- a/app/assets/javascripts/packages_and_registries/package_registry/components/details/npm_installation.vue
+++ b/app/assets/javascripts/packages_and_registries/package_registry/components/details/npm_installation.vue
@@ -1,5 +1,5 @@
<script>
-import { GlLink, GlSprintf } from '@gitlab/ui';
+import { GlLink, GlSprintf, GlFormRadioGroup } from '@gitlab/ui';
import { s__ } from '~/locale';
import InstallationTitle from '~/packages_and_registries/package_registry/components/details/installation_title.vue';
@@ -11,6 +11,8 @@ import {
TRACKING_LABEL_CODE_INSTRUCTION,
NPM_PACKAGE_MANAGER,
YARN_PACKAGE_MANAGER,
+ PROJECT_PACKAGE_ENDPOINT_TYPE,
+ INSTANCE_PACKAGE_ENDPOINT_TYPE,
} from '~/packages_and_registries/package_registry/constants';
import CodeInstruction from '~/vue_shared/components/registry/code_instruction.vue';
@@ -21,8 +23,9 @@ export default {
CodeInstruction,
GlLink,
GlSprintf,
+ GlFormRadioGroup,
},
- inject: ['npmHelpPath', 'npmPath'],
+ inject: ['npmHelpPath', 'npmPath', 'npmProjectPath'],
props: {
packageEntity: {
type: Object,
@@ -32,6 +35,7 @@ export default {
data() {
return {
instructionType: NPM_PACKAGE_MANAGER,
+ packageEndpointType: INSTANCE_PACKAGE_ENDPOINT_TYPE,
};
},
computed: {
@@ -39,13 +43,13 @@ export default {
return this.npmInstallationCommand(NPM_PACKAGE_MANAGER);
},
npmSetup() {
- return this.npmSetupCommand(NPM_PACKAGE_MANAGER);
+ return this.npmSetupCommand(NPM_PACKAGE_MANAGER, this.packageEndpointType);
},
yarnCommand() {
return this.npmInstallationCommand(YARN_PACKAGE_MANAGER);
},
yarnSetupCommand() {
- return this.npmSetupCommand(YARN_PACKAGE_MANAGER);
+ return this.npmSetupCommand(YARN_PACKAGE_MANAGER, this.packageEndpointType);
},
showNpm() {
return this.instructionType === NPM_PACKAGE_MANAGER;
@@ -58,14 +62,16 @@ export default {
return `${instruction} ${this.packageEntity.name}`;
},
- npmSetupCommand(type) {
+ npmSetupCommand(type, endpointType) {
const scope = this.packageEntity.name.substring(0, this.packageEntity.name.indexOf('/'));
+ const npmPathForEndpoint =
+ endpointType === INSTANCE_PACKAGE_ENDPOINT_TYPE ? this.npmPath : this.npmProjectPath;
if (type === NPM_PACKAGE_MANAGER) {
- return `echo ${scope}:registry=${this.npmPath}/ >> .npmrc`;
+ return `echo ${scope}:registry=${npmPathForEndpoint}/ >> .npmrc`;
}
- return `echo \\"${scope}:registry\\" \\"${this.npmPath}/\\" >> .yarnrc`;
+ return `echo \\"${scope}:registry\\" \\"${npmPathForEndpoint}/\\" >> .yarnrc`;
},
},
packageManagers: {
@@ -87,6 +93,10 @@ export default {
{ value: NPM_PACKAGE_MANAGER, label: s__('PackageRegistry|Show NPM commands') },
{ value: YARN_PACKAGE_MANAGER, label: s__('PackageRegistry|Show Yarn commands') },
],
+ packageEndpointTypeOptions: [
+ { value: INSTANCE_PACKAGE_ENDPOINT_TYPE, text: s__('PackageRegistry|Instance-level') },
+ { value: PROJECT_PACKAGE_ENDPOINT_TYPE, text: s__('PackageRegistry|Project-level') },
+ ],
};
</script>
@@ -116,6 +126,12 @@ export default {
<h3 class="gl-font-lg">{{ __('Registry setup') }}</h3>
+ <gl-form-radio-group
+ :options="$options.packageEndpointTypeOptions"
+ :checked="packageEndpointType"
+ @change="packageEndpointType = $event"
+ />
+
<code-instruction
v-if="showNpm"
:instruction="npmSetup"
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 408bd2e3dfe..af6bd7079ba 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
@@ -1,11 +1,10 @@
<script>
-/* eslint-disable @gitlab/require-string-literal-i18n-helpers */
import { GlLink, GlSprintf } from '@gitlab/ui';
import { first } from 'lodash';
import { getIdFromGraphQLId } from '~/graphql_shared/utils';
import { truncateSha } from '~/lib/utils/text_utility';
import { s__, n__ } from '~/locale';
-import { HISTORY_PIPELINES_LIMIT } from '~/packages/details/constants';
+import { HISTORY_PIPELINES_LIMIT } from '~/packages_and_registries/shared/constants';
import HistoryItem from '~/vue_shared/components/registry/history_item.vue';
import TimeAgoTooltip from '~/vue_shared/components/time_ago_tooltip.vue';
@@ -21,8 +20,6 @@ export default {
combinedUpdateText: s__(
'PackageRegistry|Package updated by commit %{link} on branch %{branch}, built by pipeline %{pipeline}, and published to the registry %{datetime}',
),
- archivedPipelineMessageSingular: s__('PackageRegistry|Package has %{number} archived update'),
- archivedPipelineMessagePlural: s__('PackageRegistry|Package has %{number} archived updates'),
},
components: {
GlLink,
@@ -58,14 +55,14 @@ export default {
showPipelinesInfo() {
return Boolean(this.firstPipeline?.id);
},
- archiviedLines() {
+ archivedLines() {
return Math.max(this.pipelines.length - HISTORY_PIPELINES_LIMIT - 1, 0);
},
archivedPipelineMessage() {
return n__(
- this.$options.i18n.archivedPipelineMessageSingular,
- this.$options.i18n.archivedPipelineMessagePlural,
- this.archiviedLines,
+ 'PackageRegistry|Package has %{updatesCount} archived update',
+ 'PackageRegistry|Package has %{updatesCount} archived updates',
+ this.archivedLines,
);
},
},
@@ -135,10 +132,10 @@ export default {
</gl-sprintf>
</history-item>
- <history-item v-if="archiviedLines" icon="history" data-testid="archived">
+ <history-item v-if="archivedLines" icon="history" data-testid="archived">
<gl-sprintf :message="archivedPipelineMessage">
- <template #number>
- <strong>{{ archiviedLines }}</strong>
+ <template #updatesCount>
+ <strong>{{ archivedLines }}</strong>
</template>
</gl-sprintf>
</history-item>
diff --git a/app/assets/javascripts/packages_and_registries/package_registry/components/list/app.vue b/app/assets/javascripts/packages_and_registries/package_registry/components/list/app.vue
new file mode 100644
index 00000000000..08481ac5655
--- /dev/null
+++ b/app/assets/javascripts/packages_and_registries/package_registry/components/list/app.vue
@@ -0,0 +1,134 @@
+<script>
+/*
+ * The following component has several commented lines, this is because we are refactoring them piece by piece on several mrs
+ * For a complete overview of the plan please check: https://gitlab.com/gitlab-org/gitlab/-/issues/330846
+ * This work is behind feature flag: https://gitlab.com/gitlab-org/gitlab/-/issues/341136
+ */
+// import { GlEmptyState, GlLink, GlSprintf } from '@gitlab/ui';
+import createFlash from '~/flash';
+import { historyReplaceState } from '~/lib/utils/common_utils';
+import { s__ } from '~/locale';
+import { DELETE_PACKAGE_SUCCESS_MESSAGE } from '~/packages/list/constants';
+import { SHOW_DELETE_SUCCESS_ALERT } from '~/packages/shared/constants';
+import getPackagesQuery from '~/packages_and_registries/package_registry/graphql/queries/get_packages.query.graphql';
+import {
+ PROJECT_RESOURCE_TYPE,
+ GROUP_RESOURCE_TYPE,
+ LIST_QUERY_DEBOUNCE_TIME,
+} from '~/packages_and_registries/package_registry/constants';
+import PackageTitle from './package_title.vue';
+import PackageSearch from './package_search.vue';
+// import PackageList from './packages_list.vue';
+
+export default {
+ components: {
+ // GlEmptyState,
+ // GlLink,
+ // GlSprintf,
+ // PackageList,
+ PackageTitle,
+ PackageSearch,
+ },
+ inject: [
+ 'packageHelpUrl',
+ 'emptyListIllustration',
+ 'emptyListHelpUrl',
+ 'isGroupPage',
+ 'fullPath',
+ ],
+ data() {
+ return {
+ packages: {},
+ sort: '',
+ filters: {},
+ };
+ },
+ apollo: {
+ packages: {
+ query: getPackagesQuery,
+ variables() {
+ return this.queryVariables;
+ },
+ update(data) {
+ return data[this.graphqlResource].packages;
+ },
+ debounce: LIST_QUERY_DEBOUNCE_TIME,
+ },
+ },
+ computed: {
+ queryVariables() {
+ return {
+ isGroupPage: this.isGroupPage,
+ fullPath: this.fullPath,
+ sort: this.isGroupPage ? undefined : this.sort,
+ groupSort: this.isGroupPage ? this.sort : undefined,
+ packageName: this.filters?.packageName,
+ packageType: this.filters?.packageType,
+ };
+ },
+ graphqlResource() {
+ return this.isGroupPage ? GROUP_RESOURCE_TYPE : PROJECT_RESOURCE_TYPE;
+ },
+ packagesCount() {
+ return this.packages?.count;
+ },
+ hasFilters() {
+ return this.filters.packageName && this.filters.packageType;
+ },
+ emptyStateTitle() {
+ return this.emptySearch
+ ? this.$options.i18n.emptyPageTitle
+ : this.$options.i18n.noResultsTitle;
+ },
+ },
+ mounted() {
+ this.checkDeleteAlert();
+ },
+ methods: {
+ checkDeleteAlert() {
+ const urlParams = new URLSearchParams(window.location.search);
+ const showAlert = urlParams.get(SHOW_DELETE_SUCCESS_ALERT);
+ if (showAlert) {
+ // to be refactored to use gl-alert
+ createFlash({ message: DELETE_PACKAGE_SUCCESS_MESSAGE, type: 'notice' });
+ const cleanUrl = window.location.href.split('?')[0];
+ historyReplaceState(cleanUrl);
+ }
+ },
+ handleSearchUpdate({ sort, filters }) {
+ this.sort = sort;
+ this.filters = { ...filters };
+ },
+ },
+ i18n: {
+ widenFilters: s__('PackageRegistry|To widen your search, change or remove the filters above.'),
+ emptyPageTitle: s__('PackageRegistry|There are no packages yet'),
+ noResultsTitle: s__('PackageRegistry|Sorry, your filter produced no results'),
+ noResultsText: s__(
+ 'PackageRegistry|Learn how to %{noPackagesLinkStart}publish and share your packages%{noPackagesLinkEnd} with GitLab.',
+ ),
+ },
+};
+</script>
+
+<template>
+ <div>
+ <package-title :help-url="packageHelpUrl" :count="packagesCount" />
+ <package-search @update="handleSearchUpdate" />
+
+ <!-- <package-list @page:changed="onPageChanged" @package:delete="onPackageDeleteRequest">
+ <template #empty-state>
+ <gl-empty-state :title="emptyStateTitle" :svg-path="emptyListIllustration">
+ <template #description>
+ <gl-sprintf v-if="hasFilters" :message="$options.i18n.widenFilters" />
+ <gl-sprintf v-else :message="$options.i18n.noResultsText">
+ <template #noPackagesLink="{ content }">
+ <gl-link :href="emptyListHelpUrl" target="_blank">{{ content }}</gl-link>
+ </template>
+ </gl-sprintf>
+ </template>
+ </gl-empty-state>
+ </template>
+ </package-list> -->
+ </div>
+</template>
diff --git a/app/assets/javascripts/packages_and_registries/package_registry/components/list/package_list_row.vue b/app/assets/javascripts/packages_and_registries/package_registry/components/list/package_list_row.vue
new file mode 100644
index 00000000000..195ff7af583
--- /dev/null
+++ b/app/assets/javascripts/packages_and_registries/package_registry/components/list/package_list_row.vue
@@ -0,0 +1,151 @@
+<script>
+import { GlButton, GlLink, GlSprintf, GlTooltipDirective, GlTruncate } from '@gitlab/ui';
+import { s__ } from '~/locale';
+import ListItem from '~/vue_shared/components/registry/list_item.vue';
+import {
+ PACKAGE_ERROR_STATUS,
+ PACKAGE_DEFAULT_STATUS,
+} from '~/packages_and_registries/package_registry/constants';
+import { getPackageTypeLabel } from '~/packages/shared/utils';
+import PackagePath from '~/packages/shared/components/package_path.vue';
+import PackageTags from '~/packages/shared/components/package_tags.vue';
+import PublishMethod from '~/packages_and_registries/package_registry/components/list/publish_method.vue';
+import PackageIconAndName from '~/packages/shared/components/package_icon_and_name.vue';
+import { getIdFromGraphQLId } from '~/graphql_shared/utils';
+import TimeagoTooltip from '~/vue_shared/components/time_ago_tooltip.vue';
+
+export default {
+ name: 'PackageListRow',
+ components: {
+ GlButton,
+ GlLink,
+ GlSprintf,
+ GlTruncate,
+ PackageTags,
+ PackagePath,
+ PublishMethod,
+ ListItem,
+ PackageIconAndName,
+ TimeagoTooltip,
+ },
+ directives: {
+ GlTooltip: GlTooltipDirective,
+ },
+ inject: ['isGroupPage'],
+ props: {
+ packageEntity: {
+ type: Object,
+ required: true,
+ },
+ },
+ computed: {
+ packageType() {
+ return getPackageTypeLabel(this.packageEntity.packageType.toLowerCase());
+ },
+ packageLink() {
+ const { project, id } = this.packageEntity;
+ return `${project?.webUrl}/-/packages/${getIdFromGraphQLId(id)}`;
+ },
+ pipeline() {
+ return this.packageEntity?.pipelines?.nodes[0];
+ },
+ pipelineUser() {
+ return this.pipeline?.user?.name;
+ },
+ showWarningIcon() {
+ return this.packageEntity.status === PACKAGE_ERROR_STATUS;
+ },
+ showTags() {
+ return Boolean(this.packageEntity.tags?.nodes?.length);
+ },
+ disabledRow() {
+ return this.packageEntity.status && this.packageEntity.status !== PACKAGE_DEFAULT_STATUS;
+ },
+ },
+ i18n: {
+ erroredPackageText: s__('PackageRegistry|Invalid Package: failed metadata extraction'),
+ },
+};
+</script>
+
+<template>
+ <list-item data-qa-selector="package_row" :disabled="disabledRow">
+ <template #left-primary>
+ <div class="gl-display-flex gl-align-items-center gl-mr-3 gl-min-w-0">
+ <gl-link
+ :href="packageLink"
+ class="gl-text-body gl-min-w-0"
+ data-qa-selector="package_link"
+ :disabled="disabledRow"
+ >
+ <gl-truncate :text="packageEntity.name" />
+ </gl-link>
+
+ <gl-button
+ v-if="showWarningIcon"
+ v-gl-tooltip="{ title: $options.i18n.erroredPackageText }"
+ class="gl-hover-bg-transparent!"
+ icon="warning"
+ category="tertiary"
+ data-testid="warning-icon"
+ :aria-label="__('Warning')"
+ />
+
+ <package-tags
+ v-if="showTags"
+ class="gl-ml-3"
+ :tags="packageEntity.tags.nodes"
+ hide-label
+ :tag-display-limit="1"
+ />
+ </div>
+ </template>
+ <template #left-secondary>
+ <div class="gl-display-flex" data-testid="left-secondary-infos">
+ <span>{{ packageEntity.version }}</span>
+
+ <div v-if="pipelineUser" class="gl-display-none gl-sm-display-flex gl-ml-2">
+ <gl-sprintf :message="s__('PackageRegistry|published by %{author}')">
+ <template #author>{{ pipelineUser }}</template>
+ </gl-sprintf>
+ </div>
+
+ <package-icon-and-name>
+ {{ packageType }}
+ </package-icon-and-name>
+
+ <package-path
+ v-if="isGroupPage"
+ :path="packageEntity.project.fullPath"
+ :disabled="disabledRow"
+ />
+ </div>
+ </template>
+
+ <template #right-primary>
+ <publish-method :pipeline="pipeline" />
+ </template>
+
+ <template #right-secondary>
+ <span>
+ <gl-sprintf :message="__('Created %{timestamp}')">
+ <template #timestamp>
+ <timeago-tooltip :time="packageEntity.createdAt" />
+ </template>
+ </gl-sprintf>
+ </span>
+ </template>
+
+ <template v-if="!disabledRow" #right-action>
+ <gl-button
+ data-testid="action-delete"
+ icon="remove"
+ category="secondary"
+ variant="danger"
+ :title="s__('PackageRegistry|Remove package')"
+ :aria-label="s__('PackageRegistry|Remove package')"
+ @click="$emit('packageToDelete', packageEntity)"
+ />
+ </template>
+ </list-item>
+</template>
diff --git a/app/assets/javascripts/packages_and_registries/package_registry/components/list/package_search.vue b/app/assets/javascripts/packages_and_registries/package_registry/components/list/package_search.vue
index 280d292ce0b..836df59ca58 100644
--- a/app/assets/javascripts/packages_and_registries/package_registry/components/list/package_search.vue
+++ b/app/assets/javascripts/packages_and_registries/package_registry/components/list/package_search.vue
@@ -1,10 +1,14 @@
<script>
-import { mapState, mapActions } from 'vuex';
import { s__ } from '~/locale';
import { sortableFields } from '~/packages/list/utils';
import { OPERATOR_IS_ONLY } from '~/vue_shared/components/filtered_search_bar/constants';
import RegistrySearch from '~/vue_shared/components/registry/registry_search.vue';
import UrlSync from '~/vue_shared/components/url_sync.vue';
+import { getQueryParams, extractFilterAndSorting } from '~/packages_and_registries/shared/utils';
+import {
+ FILTERED_SEARCH_TERM,
+ FILTERED_SEARCH_TYPE,
+} from '~/packages_and_registries/shared/constants';
import PackageTypeToken from './tokens/package_type_token.vue';
export default {
@@ -19,21 +23,71 @@ export default {
},
],
components: { RegistrySearch, UrlSync },
+ inject: ['isGroupPage'],
+ data() {
+ return {
+ filters: [],
+ sorting: {
+ orderBy: 'name',
+ sort: 'desc',
+ },
+ mountRegistrySearch: false,
+ };
+ },
computed: {
- ...mapState({
- isGroupPage: (state) => state.config.isGroupPage,
- sorting: (state) => state.sorting,
- filter: (state) => state.filter,
- }),
sortableFields() {
return sortableFields(this.isGroupPage);
},
+ parsedSorting() {
+ const cleanOrderBy = this.sorting?.orderBy.replace('_at', '');
+ return `${cleanOrderBy}_${this.sorting?.sort}`.toUpperCase();
+ },
+ parsedFilters() {
+ const parsed = {
+ packageName: '',
+ packageType: undefined,
+ };
+
+ return this.filters.reduce((acc, filter) => {
+ if (filter.type === FILTERED_SEARCH_TYPE && filter.value?.data) {
+ return {
+ ...acc,
+ packageType: filter.value.data.toUpperCase(),
+ };
+ }
+
+ if (filter.type === FILTERED_SEARCH_TERM) {
+ return {
+ ...acc,
+ packageName: `${acc.packageName} ${filter.value.data}`.trim(),
+ };
+ }
+
+ return acc;
+ }, parsed);
+ },
+ },
+ mounted() {
+ const queryParams = getQueryParams(window.document.location.search);
+ const { sorting, filters } = extractFilterAndSorting(queryParams);
+ this.updateSorting(sorting);
+ this.updateFilters(filters);
+ this.mountRegistrySearch = true;
+ this.emitUpdate();
},
methods: {
- ...mapActions(['setSorting', 'setFilter']),
+ updateFilters(newValue) {
+ this.filters = newValue;
+ },
updateSorting(newValue) {
- this.setSorting(newValue);
- this.$emit('update');
+ this.sorting = { ...this.sorting, ...newValue };
+ },
+ updateSortingAndEmitUpdate(newValue) {
+ this.updateSorting(newValue);
+ this.emitUpdate();
+ },
+ emitUpdate() {
+ this.$emit('update', { sort: this.parsedSorting, filters: this.parsedFilters });
},
},
};
@@ -43,13 +97,14 @@ export default {
<url-sync>
<template #default="{ updateQuery }">
<registry-search
- :filter="filter"
+ v-if="mountRegistrySearch"
+ :filter="filters"
:sorting="sorting"
:tokens="$options.tokens"
:sortable-fields="sortableFields"
- @sorting:changed="updateSorting"
- @filter:changed="setFilter"
- @filter:submit="$emit('update')"
+ @sorting:changed="updateSortingAndEmitUpdate"
+ @filter:changed="updateFilters"
+ @filter:submit="emitUpdate"
@query:changed="updateQuery"
/>
</template>
diff --git a/app/assets/javascripts/packages_and_registries/package_registry/components/list/packages_list_app.vue b/app/assets/javascripts/packages_and_registries/package_registry/components/list/packages_list_app.vue
deleted file mode 100644
index 75fbdb80192..00000000000
--- a/app/assets/javascripts/packages_and_registries/package_registry/components/list/packages_list_app.vue
+++ /dev/null
@@ -1,132 +0,0 @@
-<script>
-import { GlEmptyState, GlLink, GlSprintf } from '@gitlab/ui';
-import { mapActions, mapState } from 'vuex';
-import createFlash from '~/flash';
-import { historyReplaceState } from '~/lib/utils/common_utils';
-import { s__ } from '~/locale';
-import { DELETE_PACKAGE_SUCCESS_MESSAGE } from '~/packages/list/constants';
-import { SHOW_DELETE_SUCCESS_ALERT } from '~/packages/shared/constants';
-import { FILTERED_SEARCH_TERM } from '~/packages_and_registries/shared/constants';
-import { getQueryParams, extractFilterAndSorting } from '~/packages_and_registries/shared/utils';
-import PackageList from './packages_list.vue';
-
-export default {
- components: {
- GlEmptyState,
- GlLink,
- GlSprintf,
- PackageList,
- PackageTitle: () =>
- import(/* webpackChunkName: 'package_registry_components' */ './package_title.vue'),
- PackageSearch: () =>
- import(/* webpackChunkName: 'package_registry_components' */ './package_search.vue'),
- InfrastructureTitle: () =>
- import(
- /* webpackChunkName: 'infrastructure_registry_components' */ '~/packages_and_registries/infrastructure_registry/components/infrastructure_title.vue'
- ),
- InfrastructureSearch: () =>
- import(
- /* webpackChunkName: 'infrastructure_registry_components' */ '~/packages_and_registries/infrastructure_registry/components/infrastructure_search.vue'
- ),
- },
- inject: {
- titleComponent: {
- from: 'titleComponent',
- default: 'PackageTitle',
- },
- searchComponent: {
- from: 'searchComponent',
- default: 'PackageSearch',
- },
- emptyPageTitle: {
- from: 'emptyPageTitle',
- default: s__('PackageRegistry|There are no packages yet'),
- },
- noResultsText: {
- from: 'noResultsText',
- default: s__(
- 'PackageRegistry|Learn how to %{noPackagesLinkStart}publish and share your packages%{noPackagesLinkEnd} with GitLab.',
- ),
- },
- },
- computed: {
- ...mapState({
- emptyListIllustration: (state) => state.config.emptyListIllustration,
- emptyListHelpUrl: (state) => state.config.emptyListHelpUrl,
- filter: (state) => state.filter,
- selectedType: (state) => state.selectedType,
- packageHelpUrl: (state) => state.config.packageHelpUrl,
- packagesCount: (state) => state.pagination?.total,
- }),
- emptySearch() {
- return (
- this.filter.filter((f) => f.type !== FILTERED_SEARCH_TERM || f.value?.data).length === 0
- );
- },
-
- emptyStateTitle() {
- return this.emptySearch
- ? this.emptyPageTitle
- : s__('PackageRegistry|Sorry, your filter produced no results');
- },
- },
- mounted() {
- const queryParams = getQueryParams(window.document.location.search);
- const { sorting, filters } = extractFilterAndSorting(queryParams);
- this.setSorting(sorting);
- this.setFilter(filters);
- this.requestPackagesList();
- this.checkDeleteAlert();
- },
- methods: {
- ...mapActions([
- 'requestPackagesList',
- 'requestDeletePackage',
- 'setSelectedType',
- 'setSorting',
- 'setFilter',
- ]),
- onPageChanged(page) {
- return this.requestPackagesList({ page });
- },
- onPackageDeleteRequest(item) {
- return this.requestDeletePackage(item);
- },
- checkDeleteAlert() {
- const urlParams = new URLSearchParams(window.location.search);
- const showAlert = urlParams.get(SHOW_DELETE_SUCCESS_ALERT);
- if (showAlert) {
- // to be refactored to use gl-alert
- createFlash({ message: DELETE_PACKAGE_SUCCESS_MESSAGE, type: 'notice' });
- const cleanUrl = window.location.href.split('?')[0];
- historyReplaceState(cleanUrl);
- }
- },
- },
- i18n: {
- widenFilters: s__('PackageRegistry|To widen your search, change or remove the filters above.'),
- },
-};
-</script>
-
-<template>
- <div>
- <component :is="titleComponent" :help-url="packageHelpUrl" :count="packagesCount" />
- <component :is="searchComponent" @update="requestPackagesList" />
-
- <package-list @page:changed="onPageChanged" @package:delete="onPackageDeleteRequest">
- <template #empty-state>
- <gl-empty-state :title="emptyStateTitle" :svg-path="emptyListIllustration">
- <template #description>
- <gl-sprintf v-if="!emptySearch" :message="$options.i18n.widenFilters" />
- <gl-sprintf v-else :message="noResultsText">
- <template #noPackagesLink="{ content }">
- <gl-link :href="emptyListHelpUrl" target="_blank">{{ content }}</gl-link>
- </template>
- </gl-sprintf>
- </template>
- </gl-empty-state>
- </template>
- </package-list>
- </div>
-</template>
diff --git a/app/assets/javascripts/packages_and_registries/package_registry/components/list/publish_method.vue b/app/assets/javascripts/packages_and_registries/package_registry/components/list/publish_method.vue
new file mode 100644
index 00000000000..8ecf433f3ab
--- /dev/null
+++ b/app/assets/javascripts/packages_and_registries/package_registry/components/list/publish_method.vue
@@ -0,0 +1,61 @@
+<script>
+import { GlIcon, GlLink } from '@gitlab/ui';
+import { __, s__ } from '~/locale';
+import ClipboardButton from '~/vue_shared/components/clipboard_button.vue';
+
+export default {
+ name: 'PublishMethod',
+ components: {
+ ClipboardButton,
+ GlIcon,
+ GlLink,
+ },
+ props: {
+ pipeline: {
+ type: Object,
+ required: false,
+ default: null,
+ },
+ },
+ computed: {
+ hasPipeline() {
+ return Boolean(this.pipeline);
+ },
+ packageShaShort() {
+ return this.pipeline?.sha?.substring(0, 8);
+ },
+ },
+ i18n: {
+ COPY_COMMIT_SHA: __('Copy commit SHA'),
+ MANUALLY_PUBLISHED: s__('PackageRegistry|Manually Published'),
+ },
+};
+</script>
+
+<template>
+ <div class="gl-display-flex gl-align-items-center">
+ <template v-if="hasPipeline">
+ <gl-icon name="git-merge" class="gl-mr-2" />
+ <span data-testid="pipeline-ref" class="gl-mr-2">{{ pipeline.ref }}</span>
+
+ <gl-icon name="commit" class="gl-mr-2" />
+ <gl-link data-testid="pipeline-sha" :href="pipeline.commitPath" class="gl-mr-2">{{
+ packageShaShort
+ }}</gl-link>
+
+ <clipboard-button
+ :text="pipeline.sha"
+ :title="$options.i18n.COPY_COMMIT_SHA"
+ category="tertiary"
+ size="small"
+ />
+ </template>
+
+ <template v-else>
+ <gl-icon name="upload" class="gl-mr-2" />
+ <span data-testid="manually-published">
+ {{ $options.i18n.MANUALLY_PUBLISHED }}
+ </span>
+ </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 f023b4481a0..6a88880fa90 100644
--- a/app/assets/javascripts/packages_and_registries/package_registry/constants.js
+++ b/app/assets/javascripts/packages_and_registries/package_registry/constants.js
@@ -1,5 +1,4 @@
-/* eslint-disable @gitlab/require-string-literal-i18n-helpers */
-import { __, s__ } from '~/locale';
+import { s__ } from '~/locale';
export const PACKAGE_TYPE_CONAN = 'CONAN';
export const PACKAGE_TYPE_MAVEN = 'MAVEN';
@@ -71,7 +70,7 @@ export const DELETE_PACKAGE_ERROR_MESSAGE = s__(
'PackageRegistry|Something went wrong while deleting the package.',
);
export const DELETE_PACKAGE_FILE_ERROR_MESSAGE = s__(
- __('PackageRegistry|Something went wrong while deleting the package file.'),
+ 'PackageRegistry|Something went wrong while deleting the package file.',
);
export const DELETE_PACKAGE_FILE_SUCCESS_MESSAGE = s__(
'PackageRegistry|Package file deleted successfully',
@@ -87,3 +86,10 @@ export const PACKAGE_PROCESSING_STATUS = 'PROCESSING';
export const NPM_PACKAGE_MANAGER = 'npm';
export const YARN_PACKAGE_MANAGER = 'yarn';
+
+export const PROJECT_PACKAGE_ENDPOINT_TYPE = 'project';
+export const INSTANCE_PACKAGE_ENDPOINT_TYPE = 'instance';
+
+export const PROJECT_RESOURCE_TYPE = 'project';
+export const GROUP_RESOURCE_TYPE = 'group';
+export const LIST_QUERY_DEBOUNCE_TIME = 50;
diff --git a/app/assets/javascripts/packages_and_registries/package_registry/graphql/fragments/package_data.fragment.graphql b/app/assets/javascripts/packages_and_registries/package_registry/graphql/fragments/package_data.fragment.graphql
new file mode 100644
index 00000000000..aaf0eb54aff
--- /dev/null
+++ b/app/assets/javascripts/packages_and_registries/package_registry/graphql/fragments/package_data.fragment.graphql
@@ -0,0 +1,27 @@
+fragment PackageData on Package {
+ id
+ name
+ version
+ packageType
+ createdAt
+ status
+ tags {
+ nodes {
+ name
+ }
+ }
+ pipelines {
+ nodes {
+ sha
+ ref
+ commitPath
+ user {
+ name
+ }
+ }
+ }
+ project {
+ fullPath
+ webUrl
+ }
+}
diff --git a/app/assets/javascripts/packages_and_registries/package_registry/graphql/queries/get_packages.query.graphql b/app/assets/javascripts/packages_and_registries/package_registry/graphql/queries/get_packages.query.graphql
new file mode 100644
index 00000000000..74e6de87866
--- /dev/null
+++ b/app/assets/javascripts/packages_and_registries/package_registry/graphql/queries/get_packages.query.graphql
@@ -0,0 +1,27 @@
+#import "~/packages_and_registries/package_registry/graphql/fragments/package_data.fragment.graphql"
+
+query getPackages(
+ $fullPath: ID!
+ $isGroupPage: Boolean!
+ $sort: PackageSort
+ $groupSort: PackageGroupSort
+ $packageName: String
+ $packageType: PackageTypeEnum
+) {
+ project(fullPath: $fullPath) @skip(if: $isGroupPage) {
+ packages(sort: $sort, packageName: $packageName, packageType: $packageType) {
+ count
+ nodes {
+ ...PackageData
+ }
+ }
+ }
+ group(fullPath: $fullPath) @include(if: $isGroupPage) {
+ packages(sort: $groupSort, packageName: $packageName, packageType: $packageType) {
+ count
+ nodes {
+ ...PackageData
+ }
+ }
+ }
+}
diff --git a/app/assets/javascripts/packages_and_registries/package_registry/pages/list.js b/app/assets/javascripts/packages_and_registries/package_registry/pages/list.js
index 1e01b75aabc..d797a0a5327 100644
--- a/app/assets/javascripts/packages_and_registries/package_registry/pages/list.js
+++ b/app/assets/javascripts/packages_and_registries/package_registry/pages/list.js
@@ -1,14 +1,22 @@
import Vue from 'vue';
import Translate from '~/vue_shared/translate';
-import PackagesListApp from '../components/list/packages_list_app.vue';
+import { apolloProvider } from '~/packages_and_registries/package_registry/graphql/index';
+import PackagesListApp from '../components/list/app.vue';
Vue.use(Translate);
export default () => {
const el = document.getElementById('js-vue-packages-list');
+ const isGroupPage = el.dataset.pageType === 'groups';
+
return new Vue({
el,
+ apolloProvider,
+ provide: {
+ ...el.dataset,
+ isGroupPage,
+ },
render(createElement) {
return createElement(PackagesListApp);
},
diff --git a/app/assets/javascripts/packages_and_registries/settings/group/bundle.js b/app/assets/javascripts/packages_and_registries/settings/group/bundle.js
index 5cd8261ac23..9b5a0d221b8 100644
--- a/app/assets/javascripts/packages_and_registries/settings/group/bundle.js
+++ b/app/assets/javascripts/packages_and_registries/settings/group/bundle.js
@@ -19,6 +19,7 @@ export default () => {
apolloProvider,
provide: {
defaultExpanded: parseBoolean(el.dataset.defaultExpanded),
+ dependencyProxyAvailable: parseBoolean(el.dataset.dependencyProxyAvailable),
groupPath: el.dataset.groupPath,
},
render(createElement) {
diff --git a/app/assets/javascripts/packages_and_registries/settings/group/components/dependency_proxy_settings.vue b/app/assets/javascripts/packages_and_registries/settings/group/components/dependency_proxy_settings.vue
new file mode 100644
index 00000000000..2dbe36def0e
--- /dev/null
+++ b/app/assets/javascripts/packages_and_registries/settings/group/components/dependency_proxy_settings.vue
@@ -0,0 +1,110 @@
+<script>
+import { GlToggle, GlSprintf, GlLink } from '@gitlab/ui';
+import { s__ } from '~/locale';
+import SettingsBlock from '~/vue_shared/components/settings/settings_block.vue';
+import updateDependencyProxySettings from '~/packages_and_registries/settings/group/graphql/mutations/update_dependency_proxy_settings.mutation.graphql';
+import { updateGroupPackageSettings } from '~/packages_and_registries/settings/group/graphql/utils/cache_update';
+import { updateGroupDependencyProxySettingsOptimisticResponse } from '~/packages_and_registries/settings/group/graphql/utils/optimistic_responses';
+
+import {
+ DEPENDENCY_PROXY_HEADER,
+ DEPENDENCY_PROXY_SETTINGS_DESCRIPTION,
+ DEPENDENCY_PROXY_DOCS_PATH,
+} from '~/packages_and_registries/settings/group/constants';
+
+export default {
+ name: 'DependencyProxySettings',
+ components: {
+ GlToggle,
+ GlSprintf,
+ GlLink,
+ SettingsBlock,
+ },
+ i18n: {
+ DEPENDENCY_PROXY_HEADER,
+ DEPENDENCY_PROXY_SETTINGS_DESCRIPTION,
+ label: s__('DependencyProxy|Enable Proxy'),
+ },
+ links: {
+ DEPENDENCY_PROXY_DOCS_PATH,
+ },
+ inject: ['defaultExpanded', 'groupPath'],
+ props: {
+ dependencyProxySettings: {
+ type: Object,
+ required: true,
+ },
+ isLoading: {
+ type: Boolean,
+ required: false,
+ default: false,
+ },
+ },
+ computed: {
+ enabled: {
+ get() {
+ return this.dependencyProxySettings.enabled;
+ },
+ set(enabled) {
+ this.updateSettings({ enabled });
+ },
+ },
+ },
+ methods: {
+ async updateSettings(payload) {
+ try {
+ const { data } = await this.$apollo.mutate({
+ mutation: updateDependencyProxySettings,
+ variables: {
+ input: {
+ groupPath: this.groupPath,
+ ...payload,
+ },
+ },
+ update: updateGroupPackageSettings(this.groupPath),
+ optimisticResponse: updateGroupDependencyProxySettingsOptimisticResponse({
+ ...this.dependencyProxySettings,
+ ...payload,
+ }),
+ });
+
+ if (data.updateDependencyProxySettings?.errors?.length > 0) {
+ throw new Error();
+ } else {
+ this.$emit('success');
+ }
+ } catch {
+ this.$emit('error');
+ }
+ },
+ },
+};
+</script>
+
+<template>
+ <settings-block
+ :default-expanded="defaultExpanded"
+ data-qa-selector="dependency_proxy_settings_content"
+ >
+ <template #title> {{ $options.i18n.DEPENDENCY_PROXY_HEADER }} </template>
+ <template #description>
+ <span data-testid="description">
+ <gl-sprintf :message="$options.i18n.DEPENDENCY_PROXY_SETTINGS_DESCRIPTION">
+ <template #docLink="{ content }">
+ <gl-link :href="$options.links.DEPENDENCY_PROXY_DOCS_PATH">{{ content }}</gl-link>
+ </template>
+ </gl-sprintf>
+ </span>
+ </template>
+ <template #default>
+ <div>
+ <gl-toggle
+ v-model="enabled"
+ :disabled="isLoading"
+ :label="$options.i18n.label"
+ data-qa-selector="dependency_proxy_setting_toggle"
+ />
+ </div>
+ </template>
+ </settings-block>
+</template>
diff --git a/app/assets/javascripts/packages_and_registries/settings/group/components/duplicates_settings.vue b/app/assets/javascripts/packages_and_registries/settings/group/components/duplicates_settings.vue
index d66a30e7e81..b0088838acc 100644
--- a/app/assets/javascripts/packages_and_registries/settings/group/components/duplicates_settings.vue
+++ b/app/assets/javascripts/packages_and_registries/settings/group/components/duplicates_settings.vue
@@ -86,6 +86,7 @@ export default {
:label="$options.i18n.DUPLICATES_TOGGLE_LABEL"
label-position="hidden"
:value="duplicatesAllowed"
+ :disabled="loading"
@change="update(modelNames.allowed, $event)"
/>
<div class="gl-ml-5">
@@ -108,6 +109,7 @@ export default {
>
<gl-form-input
id="maven-duplicated-settings-regex-input"
+ :disabled="loading"
:value="duplicateExceptionRegex"
@change="update(modelNames.exception, $event)"
/>
diff --git a/app/assets/javascripts/packages_and_registries/settings/group/components/group_settings_app.vue b/app/assets/javascripts/packages_and_registries/settings/group/components/group_settings_app.vue
index ec3be43196c..b45cedcdd66 100644
--- a/app/assets/javascripts/packages_and_registries/settings/group/components/group_settings_app.vue
+++ b/app/assets/javascripts/packages_and_registries/settings/group/components/group_settings_app.vue
@@ -1,108 +1,66 @@
<script>
-import { GlSprintf, GlLink, GlAlert } from '@gitlab/ui';
-import DuplicatesSettings from '~/packages_and_registries/settings/group/components/duplicates_settings.vue';
-import GenericSettings from '~/packages_and_registries/settings/group/components/generic_settings.vue';
-import MavenSettings from '~/packages_and_registries/settings/group/components/maven_settings.vue';
-import {
- PACKAGE_SETTINGS_HEADER,
- PACKAGE_SETTINGS_DESCRIPTION,
- PACKAGES_DOCS_PATH,
- ERROR_UPDATING_SETTINGS,
- SUCCESS_UPDATING_SETTINGS,
-} from '~/packages_and_registries/settings/group/constants';
-import updateNamespacePackageSettings from '~/packages_and_registries/settings/group/graphql/mutations/update_group_packages_settings.mutation.graphql';
+import { GlAlert } from '@gitlab/ui';
+import { n__ } from '~/locale';
+import PackagesSettings from '~/packages_and_registries/settings/group/components/packages_settings.vue';
+import DependencyProxySettings from '~/packages_and_registries/settings/group/components/dependency_proxy_settings.vue';
+
import getGroupPackagesSettingsQuery from '~/packages_and_registries/settings/group/graphql/queries/get_group_packages_settings.query.graphql';
-import { updateGroupPackageSettings } from '~/packages_and_registries/settings/group/graphql/utils/cache_update';
-import { updateGroupPackagesSettingsOptimisticResponse } from '~/packages_and_registries/settings/group/graphql/utils/optimistic_responses';
-import SettingsBlock from '~/vue_shared/components/settings/settings_block.vue';
export default {
name: 'GroupSettingsApp',
- i18n: {
- PACKAGE_SETTINGS_HEADER,
- PACKAGE_SETTINGS_DESCRIPTION,
- },
- links: {
- PACKAGES_DOCS_PATH,
- },
components: {
GlAlert,
- GlSprintf,
- GlLink,
- SettingsBlock,
- MavenSettings,
- GenericSettings,
- DuplicatesSettings,
+ PackagesSettings,
+ DependencyProxySettings,
},
- inject: ['defaultExpanded', 'groupPath'],
+ inject: ['groupPath', 'dependencyProxyAvailable'],
apollo: {
- packageSettings: {
+ group: {
query: getGroupPackagesSettingsQuery,
variables() {
return {
fullPath: this.groupPath,
};
},
- update(data) {
- return data.group?.packageSettings;
- },
},
},
data() {
return {
- packageSettings: {},
- errors: {},
+ group: {},
alertMessage: null,
};
},
computed: {
+ packageSettings() {
+ return this.group?.packageSettings || {};
+ },
+ dependencyProxySettings() {
+ return this.group?.dependencyProxySetting || {};
+ },
isLoading() {
- return this.$apollo.queries.packageSettings.loading;
+ return this.$apollo.queries.group.loading;
},
},
methods: {
dismissAlert() {
this.alertMessage = null;
},
- updateSettings(payload) {
- this.errors = {};
- return this.$apollo
- .mutate({
- mutation: updateNamespacePackageSettings,
- variables: {
- input: {
- namespacePath: this.groupPath,
- ...payload,
- },
- },
- update: updateGroupPackageSettings(this.groupPath),
- optimisticResponse: updateGroupPackagesSettingsOptimisticResponse({
- ...this.packageSettings,
- ...payload,
- }),
- })
- .then(({ data }) => {
- if (data.updateNamespacePackageSettings?.errors?.length > 0) {
- this.alertMessage = ERROR_UPDATING_SETTINGS;
- } else {
- this.dismissAlert();
- this.$toast.show(SUCCESS_UPDATING_SETTINGS);
- }
- })
- .catch((e) => {
- if (e.graphQLErrors) {
- e.graphQLErrors.forEach((error) => {
- const [
- {
- path: [key],
- message,
- },
- ] = error.extensions.problems;
- this.errors = { ...this.errors, [key]: message };
- });
- }
- this.alertMessage = ERROR_UPDATING_SETTINGS;
- });
+ handleSuccess(amount = 1) {
+ const successMessage = n__(
+ 'Setting saved successfully',
+ 'Settings saved successfully',
+ amount,
+ );
+ this.$toast.show(successMessage);
+ this.dismissAlert();
+ },
+ handleError(amount = 1) {
+ const errorMessage = n__(
+ 'An error occurred while saving the setting',
+ 'An error occurred while saving the settings',
+ amount,
+ );
+ this.alertMessage = errorMessage;
},
},
};
@@ -114,50 +72,19 @@ export default {
{{ alertMessage }}
</gl-alert>
- <settings-block
- :default-expanded="defaultExpanded"
- data-qa-selector="package_registry_settings_content"
- >
- <template #title> {{ $options.i18n.PACKAGE_SETTINGS_HEADER }}</template>
- <template #description>
- <span data-testid="description">
- <gl-sprintf :message="$options.i18n.PACKAGE_SETTINGS_DESCRIPTION">
- <template #link="{ content }">
- <gl-link :href="$options.links.PACKAGES_DOCS_PATH" target="_blank">{{
- content
- }}</gl-link>
- </template>
- </gl-sprintf>
- </span>
- </template>
- <template #default>
- <maven-settings data-testid="maven-settings">
- <template #default="{ modelNames }">
- <duplicates-settings
- :duplicates-allowed="packageSettings.mavenDuplicatesAllowed"
- :duplicate-exception-regex="packageSettings.mavenDuplicateExceptionRegex"
- :duplicate-exception-regex-error="errors.mavenDuplicateExceptionRegex"
- :model-names="modelNames"
- :loading="isLoading"
- toggle-qa-selector="allow_duplicates_toggle"
- label-qa-selector="allow_duplicates_label"
- @update="updateSettings"
- />
- </template>
- </maven-settings>
- <generic-settings class="gl-mt-6" data-testid="generic-settings">
- <template #default="{ modelNames }">
- <duplicates-settings
- :duplicates-allowed="packageSettings.genericDuplicatesAllowed"
- :duplicate-exception-regex="packageSettings.genericDuplicateExceptionRegex"
- :duplicate-exception-regex-error="errors.genericDuplicateExceptionRegex"
- :model-names="modelNames"
- :loading="isLoading"
- @update="updateSettings"
- />
- </template>
- </generic-settings>
- </template>
- </settings-block>
+ <packages-settings
+ :package-settings="packageSettings"
+ :is-loading="isLoading"
+ @success="handleSuccess(2)"
+ @error="handleError(2)"
+ />
+
+ <dependency-proxy-settings
+ v-if="dependencyProxyAvailable"
+ :dependency-proxy-settings="dependencyProxySettings"
+ :is-loading="isLoading"
+ @success="handleSuccess"
+ @error="handleError"
+ />
</div>
</template>
diff --git a/app/assets/javascripts/packages_and_registries/settings/group/components/packages_settings.vue b/app/assets/javascripts/packages_and_registries/settings/group/components/packages_settings.vue
new file mode 100644
index 00000000000..b7e88945dbd
--- /dev/null
+++ b/app/assets/javascripts/packages_and_registries/settings/group/components/packages_settings.vue
@@ -0,0 +1,139 @@
+<script>
+import { GlSprintf, GlLink } from '@gitlab/ui';
+import DuplicatesSettings from '~/packages_and_registries/settings/group/components/duplicates_settings.vue';
+import GenericSettings from '~/packages_and_registries/settings/group/components/generic_settings.vue';
+import MavenSettings from '~/packages_and_registries/settings/group/components/maven_settings.vue';
+import {
+ PACKAGE_SETTINGS_HEADER,
+ PACKAGE_SETTINGS_DESCRIPTION,
+ PACKAGES_DOCS_PATH,
+} from '~/packages_and_registries/settings/group/constants';
+import updateNamespacePackageSettings from '~/packages_and_registries/settings/group/graphql/mutations/update_group_packages_settings.mutation.graphql';
+import { updateGroupPackageSettings } from '~/packages_and_registries/settings/group/graphql/utils/cache_update';
+import { updateGroupPackagesSettingsOptimisticResponse } from '~/packages_and_registries/settings/group/graphql/utils/optimistic_responses';
+import SettingsBlock from '~/vue_shared/components/settings/settings_block.vue';
+
+export default {
+ name: 'PackageSettings',
+ i18n: {
+ PACKAGE_SETTINGS_HEADER,
+ PACKAGE_SETTINGS_DESCRIPTION,
+ },
+ links: {
+ PACKAGES_DOCS_PATH,
+ },
+ components: {
+ GlSprintf,
+ GlLink,
+ SettingsBlock,
+ MavenSettings,
+ GenericSettings,
+ DuplicatesSettings,
+ },
+ inject: ['defaultExpanded', 'groupPath'],
+ props: {
+ packageSettings: {
+ type: Object,
+ required: true,
+ },
+ isLoading: {
+ type: Boolean,
+ required: false,
+ default: false,
+ },
+ },
+ data() {
+ return {
+ errors: {},
+ };
+ },
+ methods: {
+ async updateSettings(payload) {
+ this.errors = {};
+ try {
+ const { data } = await this.$apollo.mutate({
+ mutation: updateNamespacePackageSettings,
+ variables: {
+ input: {
+ namespacePath: this.groupPath,
+ ...payload,
+ },
+ },
+ update: updateGroupPackageSettings(this.groupPath),
+ optimisticResponse: updateGroupPackagesSettingsOptimisticResponse({
+ ...this.packageSettings,
+ ...payload,
+ }),
+ });
+
+ if (data.updateNamespacePackageSettings?.errors?.length > 0) {
+ throw new Error();
+ } else {
+ this.$emit('success');
+ }
+ } catch (e) {
+ if (e.graphQLErrors) {
+ e.graphQLErrors.forEach((error) => {
+ const [
+ {
+ path: [key],
+ message,
+ },
+ ] = error.extensions.problems;
+ this.errors = { ...this.errors, [key]: message };
+ });
+ }
+ this.$emit('error');
+ }
+ },
+ },
+};
+</script>
+
+<template>
+ <settings-block
+ :default-expanded="defaultExpanded"
+ data-qa-selector="package_registry_settings_content"
+ >
+ <template #title> {{ $options.i18n.PACKAGE_SETTINGS_HEADER }}</template>
+ <template #description>
+ <span data-testid="description">
+ <gl-sprintf :message="$options.i18n.PACKAGE_SETTINGS_DESCRIPTION">
+ <template #link="{ content }">
+ <gl-link :href="$options.links.PACKAGES_DOCS_PATH" target="_blank">{{
+ content
+ }}</gl-link>
+ </template>
+ </gl-sprintf>
+ </span>
+ </template>
+ <template #default>
+ <maven-settings data-testid="maven-settings">
+ <template #default="{ modelNames }">
+ <duplicates-settings
+ :duplicates-allowed="packageSettings.mavenDuplicatesAllowed"
+ :duplicate-exception-regex="packageSettings.mavenDuplicateExceptionRegex"
+ :duplicate-exception-regex-error="errors.mavenDuplicateExceptionRegex"
+ :model-names="modelNames"
+ :loading="isLoading"
+ toggle-qa-selector="allow_duplicates_toggle"
+ label-qa-selector="allow_duplicates_label"
+ @update="updateSettings"
+ />
+ </template>
+ </maven-settings>
+ <generic-settings class="gl-mt-6" data-testid="generic-settings">
+ <template #default="{ modelNames }">
+ <duplicates-settings
+ :duplicates-allowed="packageSettings.genericDuplicatesAllowed"
+ :duplicate-exception-regex="packageSettings.genericDuplicateExceptionRegex"
+ :duplicate-exception-regex-error="errors.genericDuplicateExceptionRegex"
+ :model-names="modelNames"
+ :loading="isLoading"
+ @update="updateSettings"
+ />
+ </template>
+ </generic-settings>
+ </template>
+ </settings-block>
+</template>
diff --git a/app/assets/javascripts/packages_and_registries/settings/group/constants.js b/app/assets/javascripts/packages_and_registries/settings/group/constants.js
index d29489a0b33..ee922457993 100644
--- a/app/assets/javascripts/packages_and_registries/settings/group/constants.js
+++ b/app/assets/javascripts/packages_and_registries/settings/group/constants.js
@@ -18,9 +18,9 @@ export const DUPLICATES_SETTINGS_EXCEPTION_LEGEND = s__(
'PackageRegistry|Publish packages if their name or version matches this regex.',
);
-export const SUCCESS_UPDATING_SETTINGS = s__('PackageRegistry|Settings saved successfully');
-export const ERROR_UPDATING_SETTINGS = s__(
- 'PackageRegistry|An error occurred while saving the settings',
+export const DEPENDENCY_PROXY_HEADER = s__('DependencyProxy|Dependency Proxy');
+export const DEPENDENCY_PROXY_SETTINGS_DESCRIPTION = s__(
+ 'DependencyProxy|Create a local proxy for storing frequently used upstream images. %{docLinkStart}Learn more%{docLinkEnd} about dependency proxies.',
);
// Parameters
@@ -28,3 +28,5 @@ export const ERROR_UPDATING_SETTINGS = s__(
export const PACKAGES_DOCS_PATH = helpPagePath('user/packages');
export const MAVEN_DUPLICATES_ALLOWED = 'mavenDuplicatesAllowed';
export const MAVEN_DUPLICATE_EXCEPTION_REGEX = 'mavenDuplicateExceptionRegex';
+
+export const DEPENDENCY_PROXY_DOCS_PATH = helpPagePath('user/packages/dependency_proxy/index');
diff --git a/app/assets/javascripts/packages_and_registries/settings/group/graphql/mutations/update_dependency_proxy_settings.mutation.graphql b/app/assets/javascripts/packages_and_registries/settings/group/graphql/mutations/update_dependency_proxy_settings.mutation.graphql
new file mode 100644
index 00000000000..d24a645fecb
--- /dev/null
+++ b/app/assets/javascripts/packages_and_registries/settings/group/graphql/mutations/update_dependency_proxy_settings.mutation.graphql
@@ -0,0 +1,8 @@
+mutation updateDependencyProxySettings($input: UpdateDependencyProxySettingsInput!) {
+ updateDependencyProxySettings(input: $input) {
+ dependencyProxySetting {
+ enabled
+ }
+ errors
+ }
+}
diff --git a/app/assets/javascripts/packages_and_registries/settings/group/graphql/queries/get_group_packages_settings.query.graphql b/app/assets/javascripts/packages_and_registries/settings/group/graphql/queries/get_group_packages_settings.query.graphql
index a1c01300893..d3edebfbe20 100644
--- a/app/assets/javascripts/packages_and_registries/settings/group/graphql/queries/get_group_packages_settings.query.graphql
+++ b/app/assets/javascripts/packages_and_registries/settings/group/graphql/queries/get_group_packages_settings.query.graphql
@@ -1,5 +1,8 @@
query getGroupPackagesSettings($fullPath: ID!) {
group(fullPath: $fullPath) {
+ dependencyProxySetting {
+ enabled
+ }
packageSettings {
mavenDuplicatesAllowed
mavenDuplicateExceptionRegex
diff --git a/app/assets/javascripts/packages_and_registries/settings/group/graphql/utils/cache_update.js b/app/assets/javascripts/packages_and_registries/settings/group/graphql/utils/cache_update.js
index fb06f557d66..fe94203f51b 100644
--- a/app/assets/javascripts/packages_and_registries/settings/group/graphql/utils/cache_update.js
+++ b/app/assets/javascripts/packages_and_registries/settings/group/graphql/utils/cache_update.js
@@ -9,9 +9,16 @@ export const updateGroupPackageSettings = (fullPath) => (client, { data: updated
const sourceData = client.readQuery(queryAndParams);
const data = produce(sourceData, (draftState) => {
- draftState.group.packageSettings = {
- ...updatedData.updateNamespacePackageSettings.packageSettings,
- };
+ if (updatedData.updateNamespacePackageSettings) {
+ draftState.group.packageSettings = {
+ ...updatedData.updateNamespacePackageSettings.packageSettings,
+ };
+ }
+ if (updatedData.updateDependencyProxySettings) {
+ draftState.group.dependencyProxySetting = {
+ ...updatedData.updateDependencyProxySettings.dependencyProxySetting,
+ };
+ }
});
client.writeQuery({
diff --git a/app/assets/javascripts/packages_and_registries/settings/group/graphql/utils/optimistic_responses.js b/app/assets/javascripts/packages_and_registries/settings/group/graphql/utils/optimistic_responses.js
index f2c8de85bf8..a30d8ca0b81 100644
--- a/app/assets/javascripts/packages_and_registries/settings/group/graphql/utils/optimistic_responses.js
+++ b/app/assets/javascripts/packages_and_registries/settings/group/graphql/utils/optimistic_responses.js
@@ -9,3 +9,15 @@ export const updateGroupPackagesSettingsOptimisticResponse = (changes) => ({
},
},
});
+
+export const updateGroupDependencyProxySettingsOptimisticResponse = (changes) => ({
+ // eslint-disable-next-line @gitlab/require-i18n-strings
+ __typename: 'Mutation',
+ updateDependencyProxySettings: {
+ __typename: 'UpdateDependencyProxySettingsPayload',
+ errors: [],
+ dependencyProxySetting: {
+ ...changes,
+ },
+ },
+});
diff --git a/app/assets/javascripts/packages_and_registries/settings/project/components/registry_settings_app.vue b/app/assets/javascripts/packages_and_registries/settings/project/components/registry_settings_app.vue
index bf286c84d5f..7be3bba7cae 100644
--- a/app/assets/javascripts/packages_and_registries/settings/project/components/registry_settings_app.vue
+++ b/app/assets/javascripts/packages_and_registries/settings/project/components/registry_settings_app.vue
@@ -95,7 +95,7 @@ export default {
<gl-sprintf
:message="
__(
- 'Save space and find images in the container Registry. remove unneeded tags and keep only the ones you want. %{linkStart}How does cleanup work?%{linkEnd}',
+ 'Save storage space by automatically deleting tags from the container registry and keeping the ones you want. %{linkStart}How does cleanup work?%{linkEnd}',
)
"
>
diff --git a/app/assets/javascripts/packages_and_registries/settings/project/constants.js b/app/assets/javascripts/packages_and_registries/settings/project/constants.js
index 165c4aae3cb..4d477fbd05d 100644
--- a/app/assets/javascripts/packages_and_registries/settings/project/constants.js
+++ b/app/assets/javascripts/packages_and_registries/settings/project/constants.js
@@ -73,6 +73,7 @@ export const OLDER_THAN_OPTIONS = [
{ key: 'SEVEN_DAYS', variable: 7, default: false },
{ key: 'FOURTEEN_DAYS', variable: 14, default: false },
{ key: 'THIRTY_DAYS', variable: 30, default: false },
+ { key: 'SIXTY_DAYS', variable: 60, default: false },
{ key: 'NINETY_DAYS', variable: 90, default: true },
];
diff --git a/app/assets/javascripts/packages_and_registries/shared/constants.js b/app/assets/javascripts/packages_and_registries/shared/constants.js
index 55b5816cc5a..7d2971bd8c7 100644
--- a/app/assets/javascripts/packages_and_registries/shared/constants.js
+++ b/app/assets/javascripts/packages_and_registries/shared/constants.js
@@ -1 +1,3 @@
export const FILTERED_SEARCH_TERM = 'filtered-search-term';
+export const FILTERED_SEARCH_TYPE = 'type';
+export const HISTORY_PIPELINES_LIMIT = 5;
diff --git a/app/assets/javascripts/pages/admin/application_settings/metrics_and_profiling/usage_statistics.js b/app/assets/javascripts/pages/admin/application_settings/metrics_and_profiling/usage_statistics.js
index 4c312a008cb..68849857d0f 100644
--- a/app/assets/javascripts/pages/admin/application_settings/metrics_and_profiling/usage_statistics.js
+++ b/app/assets/javascripts/pages/admin/application_settings/metrics_and_profiling/usage_statistics.js
@@ -1,7 +1,7 @@
import { __ } from '~/locale';
export const HELPER_TEXT_SERVICE_PING_DISABLED = __(
- 'To enable Registration Features, make sure "Enable service ping" is checked.',
+ 'To enable Registration Features, first enable Service Ping.',
);
export const HELPER_TEXT_SERVICE_PING_ENABLED = __(
diff --git a/app/assets/javascripts/pages/admin/projects/components/namespace_select.vue b/app/assets/javascripts/pages/admin/projects/components/namespace_select.vue
new file mode 100644
index 00000000000..c75c031b0b1
--- /dev/null
+++ b/app/assets/javascripts/pages/admin/projects/components/namespace_select.vue
@@ -0,0 +1,143 @@
+<script>
+import {
+ GlDropdown,
+ GlDropdownItem,
+ GlDropdownDivider,
+ GlSearchBoxByType,
+ GlLoadingIcon,
+} from '@gitlab/ui';
+import Api from '~/api';
+import { __ } from '~/locale';
+
+export default {
+ i18n: {
+ dropdownHeader: __('Namespaces'),
+ searchPlaceholder: __('Search for Namespace'),
+ anyNamespace: __('Any namespace'),
+ },
+ components: {
+ GlDropdown,
+ GlDropdownItem,
+ GlDropdownDivider,
+ GlLoadingIcon,
+ GlSearchBoxByType,
+ },
+ props: {
+ showAny: {
+ type: Boolean,
+ required: false,
+ default: false,
+ },
+ placeholder: {
+ type: String,
+ required: false,
+ default: __('Namespace'),
+ },
+ fieldName: {
+ type: String,
+ required: false,
+ default: null,
+ },
+ },
+ data() {
+ return {
+ namespaceOptions: [],
+ selectedNamespaceId: null,
+ selectedNamespace: null,
+ searchTerm: '',
+ isLoading: false,
+ };
+ },
+ computed: {
+ selectedNamespaceName() {
+ if (this.selectedNamespaceId === null) {
+ return this.placeholder;
+ }
+ return this.selectedNamespace;
+ },
+ },
+ watch: {
+ searchTerm() {
+ this.fetchNamespaces(this.searchTerm);
+ },
+ },
+ mounted() {
+ this.fetchNamespaces();
+ },
+ methods: {
+ fetchNamespaces(filter) {
+ this.isLoading = true;
+ this.namespaceOptions = [];
+ return Api.namespaces(filter, (namespaces) => {
+ this.namespaceOptions = namespaces;
+ this.isLoading = false;
+ });
+ },
+ selectNamespace(key) {
+ this.selectedNamespaceId = this.namespaceOptions[key].id;
+ this.selectedNamespace = this.getNamespaceString(this.namespaceOptions[key]);
+ this.$emit('setNamespace', this.selectedNamespaceId);
+ },
+ selectAnyNamespace() {
+ this.selectedNamespaceId = null;
+ this.selectedNamespace = null;
+ this.$emit('setNamespace', null);
+ },
+ getNamespaceString(namespace) {
+ return `${namespace.kind}: ${namespace.full_path}`;
+ },
+ },
+};
+</script>
+
+<template>
+ <div class="gl-display-flex">
+ <input
+ v-if="fieldName"
+ :name="fieldName"
+ :value="selectedNamespaceId"
+ type="hidden"
+ data-testid="hidden-input"
+ />
+ <gl-dropdown
+ :text="selectedNamespaceName"
+ :header-text="$options.i18n.dropdownHeader"
+ toggle-class="dropdown-menu-toggle large"
+ data-testid="namespace-dropdown"
+ :right="true"
+ >
+ <template #header>
+ <gl-search-box-by-type
+ v-model.trim="searchTerm"
+ class="namespace-search-box"
+ debounce="250"
+ :placeholder="$options.i18n.searchPlaceholder"
+ />
+ </template>
+
+ <template v-if="showAny">
+ <gl-dropdown-item @click="selectAnyNamespace">
+ {{ $options.i18n.anyNamespace }}
+ </gl-dropdown-item>
+ <gl-dropdown-divider />
+ </template>
+
+ <gl-loading-icon v-if="isLoading" />
+
+ <gl-dropdown-item
+ v-for="(namespace, key) in namespaceOptions"
+ :key="namespace.id"
+ @click="selectNamespace(key)"
+ >
+ {{ getNamespaceString(namespace) }}
+ </gl-dropdown-item>
+ </gl-dropdown>
+ </div>
+</template>
+
+<style scoped>
+/* workaround position: relative imposed by .top-area .nav-controls */
+.namespace-search-box >>> input {
+ position: static;
+}
+</style>
diff --git a/app/assets/javascripts/pages/admin/projects/index.js b/app/assets/javascripts/pages/admin/projects/index.js
index b07ca815f13..3098d06510b 100644
--- a/app/assets/javascripts/pages/admin/projects/index.js
+++ b/app/assets/javascripts/pages/admin/projects/index.js
@@ -1,8 +1,38 @@
-import NamespaceSelect from '~/namespace_select';
+import Vue from 'vue';
+import { parseBoolean } from '~/lib/utils/common_utils';
+import { mergeUrlParams } from '~/lib/utils/url_utility';
import ProjectsList from '~/projects_list';
+import NamespaceSelect from './components/namespace_select.vue';
new ProjectsList(); // eslint-disable-line no-new
-document
- .querySelectorAll('.js-namespace-select')
- .forEach((dropdown) => new NamespaceSelect({ dropdown }));
+function mountNamespaceSelect() {
+ const el = document.querySelector('.js-namespace-select');
+ if (!el) {
+ return false;
+ }
+
+ const { showAny, fieldName, placeholder, updateLocation } = el.dataset;
+
+ return new Vue({
+ el,
+ render(createComponent) {
+ return createComponent(NamespaceSelect, {
+ props: {
+ showAny: parseBoolean(showAny),
+ fieldName,
+ placeholder,
+ },
+ on: {
+ setNamespace(newNamespace) {
+ if (fieldName && updateLocation) {
+ window.location = mergeUrlParams({ [fieldName]: newNamespace }, window.location.href);
+ }
+ },
+ },
+ });
+ },
+ });
+}
+
+mountNamespaceSelect();
diff --git a/app/assets/javascripts/pages/admin/serverless/domains/index.js b/app/assets/javascripts/pages/admin/serverless/domains/index.js
deleted file mode 100644
index 4fab7a1d9cb..00000000000
--- a/app/assets/javascripts/pages/admin/serverless/domains/index.js
+++ /dev/null
@@ -1,17 +0,0 @@
-import initSettingsPanels from '~/settings_panels';
-
-// Initialize expandable settings panels
-initSettingsPanels();
-
-const domainCard = document.querySelector('.js-domain-cert-show');
-const domainForm = document.querySelector('.js-domain-cert-inputs');
-const domainReplaceButton = document.querySelector('.js-domain-cert-replace-btn');
-const domainSubmitButton = document.querySelector('.js-serverless-domain-submit');
-
-if (domainReplaceButton && domainCard && domainForm) {
- domainReplaceButton.addEventListener('click', () => {
- domainCard.classList.add('hidden');
- domainForm.classList.remove('hidden');
- domainSubmitButton.removeAttribute('disabled');
- });
-}
diff --git a/app/assets/javascripts/pages/admin/topics/edit/index.js b/app/assets/javascripts/pages/admin/topics/edit/index.js
new file mode 100644
index 00000000000..c4e05bbd092
--- /dev/null
+++ b/app/assets/javascripts/pages/admin/topics/edit/index.js
@@ -0,0 +1,8 @@
+import $ from 'jquery';
+import GLForm from '~/gl_form';
+import initFilePickers from '~/file_pickers';
+import ZenMode from '~/zen_mode';
+
+new GLForm($('.js-project-topic-form')); // eslint-disable-line no-new
+initFilePickers();
+new ZenMode(); // eslint-disable-line no-new
diff --git a/app/assets/javascripts/pages/admin/topics/new/index.js b/app/assets/javascripts/pages/admin/topics/new/index.js
new file mode 100644
index 00000000000..c4e05bbd092
--- /dev/null
+++ b/app/assets/javascripts/pages/admin/topics/new/index.js
@@ -0,0 +1,8 @@
+import $ from 'jquery';
+import GLForm from '~/gl_form';
+import initFilePickers from '~/file_pickers';
+import ZenMode from '~/zen_mode';
+
+new GLForm($('.js-project-topic-form')); // eslint-disable-line no-new
+initFilePickers();
+new ZenMode(); // eslint-disable-line no-new
diff --git a/app/assets/javascripts/pages/groups/dependency_proxies/index.js b/app/assets/javascripts/pages/groups/dependency_proxies/index.js
index 77c885d3858..862ba468296 100644
--- a/app/assets/javascripts/pages/groups/dependency_proxies/index.js
+++ b/app/assets/javascripts/pages/groups/dependency_proxies/index.js
@@ -1,13 +1,3 @@
-import $ from 'jquery';
-import initDependencyProxy from '~/dependency_proxy';
+import { initDependencyProxyApp } from '~/packages_and_registries/dependency_proxy/';
-initDependencyProxy();
-
-const form = document.querySelector('form.edit_dependency_proxy_group_setting');
-const toggleInput = $('input.js-project-feature-toggle-input');
-
-if (form && toggleInput) {
- toggleInput.on('trigger-change', () => {
- form.submit();
- });
-}
+initDependencyProxyApp();
diff --git a/app/assets/javascripts/pages/groups/group_members/index.js b/app/assets/javascripts/pages/groups/group_members/index.js
index 0137ff87979..01a371920f8 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 { MEMBER_TYPES } from '~/members/constants';
import { groupLinkRequestFormatter } from '~/members/utils';
import UsersSelect from '~/users_select';
-const SHARED_FIELDS = ['account', 'expires', 'maxRole', 'expiration', 'actions'];
+const SHARED_FIELDS = ['account', 'maxRole', 'expiration', 'actions'];
initMembersApp(document.querySelector('.js-group-members-list-app'), {
[MEMBER_TYPES.user]: {
diff --git a/app/assets/javascripts/pages/groups/packages/index/index.js b/app/assets/javascripts/pages/groups/packages/index/index.js
index 1c4a10fd653..95522573b53 100644
--- a/app/assets/javascripts/pages/groups/packages/index/index.js
+++ b/app/assets/javascripts/pages/groups/packages/index/index.js
@@ -1,5 +1,10 @@
-import initPackageList from '~/packages/list/packages_list_app_bundle';
+(async function packageApp() {
+ if (window.gon.features.packageListApollo) {
+ const newPackageList = await import('~/packages_and_registries/package_registry/pages/list');
-if (document.getElementById('js-vue-packages-list')) {
- initPackageList();
-}
+ newPackageList.default();
+ } else {
+ const packageList = await import('~/packages/list/packages_list_app_bundle');
+ packageList.default();
+ }
+})();
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
new file mode 100644
index 00000000000..ec3cf4a8a92
--- /dev/null
+++ b/app/assets/javascripts/pages/import/bulk_imports/history/components/bulk_imports_history_app.vue
@@ -0,0 +1,176 @@
+<script>
+import { GlButton, GlEmptyState, GlLink, GlLoadingIcon, GlTable } from '@gitlab/ui';
+
+import { s__, __ } from '~/locale';
+import createFlash from '~/flash';
+import { parseIntPagination, normalizeHeaders } from '~/lib/utils/common_utils';
+import { joinPaths } from '~/lib/utils/url_utility';
+import { getBulkImportsHistory } from '~/rest_api';
+import ImportStatus from '~/import_entities/components/import_status.vue';
+import PaginationBar from '~/import_entities/components/pagination_bar.vue';
+import TimeAgo from '~/vue_shared/components/time_ago_tooltip.vue';
+
+import { DEFAULT_ERROR } from '../utils/error_messages';
+
+const DEFAULT_PER_PAGE = 20;
+const DEFAULT_TH_CLASSES =
+ 'gl-bg-transparent! gl-border-b-solid! gl-border-b-gray-200! gl-border-b-1! gl-p-5!';
+
+const tableCell = (config) => ({
+ thClass: `${DEFAULT_TH_CLASSES}`,
+ tdClass: (value, key, item) => {
+ return {
+ // eslint-disable-next-line no-underscore-dangle
+ 'gl-border-b-0!': item._showDetails,
+ };
+ },
+ ...config,
+});
+
+export default {
+ components: {
+ GlButton,
+ GlEmptyState,
+ GlLink,
+ GlLoadingIcon,
+ GlTable,
+ PaginationBar,
+ ImportStatus,
+ TimeAgo,
+ },
+
+ data() {
+ return {
+ loading: true,
+ historyItems: [],
+ paginationConfig: {
+ page: 1,
+ perPage: DEFAULT_PER_PAGE,
+ },
+ pageInfo: {},
+ };
+ },
+
+ fields: [
+ tableCell({
+ key: 'source_full_path',
+ label: s__('BulkImport|Source group'),
+ thClass: `${DEFAULT_TH_CLASSES} gl-w-30p`,
+ }),
+ tableCell({
+ key: 'destination_name',
+ label: s__('BulkImport|New group'),
+ thClass: `${DEFAULT_TH_CLASSES} gl-w-40p`,
+ }),
+ tableCell({
+ key: 'created_at',
+ label: __('Date'),
+ }),
+ tableCell({
+ key: 'status',
+ label: __('Status'),
+ tdAttr: { 'data-qa-selector': 'import_status_indicator' },
+ }),
+ ],
+
+ computed: {
+ hasHistoryItems() {
+ return this.historyItems.length > 0;
+ },
+ },
+
+ watch: {
+ paginationConfig: {
+ handler() {
+ this.loadHistoryItems();
+ },
+ deep: true,
+ immediate: true,
+ },
+ },
+
+ methods: {
+ async loadHistoryItems() {
+ try {
+ this.loading = true;
+ const { data: historyItems, headers } = await getBulkImportsHistory({
+ page: this.paginationConfig.page,
+ per_page: this.paginationConfig.perPage,
+ });
+ this.pageInfo = parseIntPagination(normalizeHeaders(headers));
+ this.historyItems = historyItems;
+ } catch (e) {
+ createFlash({ message: DEFAULT_ERROR, captureError: true, error: e });
+ } finally {
+ this.loading = false;
+ }
+ },
+
+ getDestinationUrl({ destination_name: name, destination_namespace: namespace }) {
+ return [namespace, name].filter(Boolean).join('/');
+ },
+
+ getFullDestinationUrl(params) {
+ return joinPaths(gon.relative_url_root || '', this.getDestinationUrl(params));
+ },
+ },
+
+ gitlabLogo: window.gon.gitlab_logo,
+};
+</script>
+
+<template>
+ <div>
+ <div
+ class="gl-border-solid gl-border-gray-200 gl-border-0 gl-border-b-1 gl-display-flex gl-align-items-center"
+ >
+ <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') }}
+ </h1>
+ </div>
+ <gl-loading-icon v-if="loading" size="md" 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.')"
+ />
+ <template v-else>
+ <gl-table
+ :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>
+ <template #cell(created_at)="{ value }">
+ <time-ago :time="value" />
+ </template>
+ <template #cell(status)="{ value, item, toggleDetails, detailsShowing }">
+ <import-status :status="value" class="gl-display-inline-block gl-w-13" />
+ <gl-button
+ v-if="item.failures.length"
+ class="gl-ml-3"
+ :selected="detailsShowing"
+ @click="toggleDetails"
+ >{{ __('Details') }}</gl-button
+ >
+ </template>
+ <template #row-details="{ item }">
+ <pre>{{ item.failures }}</pre>
+ </template>
+ </gl-table>
+ <pagination-bar
+ :page-info="pageInfo"
+ :items-count="historyItems.length"
+ class="gl-m-0 gl-mt-3"
+ @set-page="paginationConfig.page = $event"
+ @set-page-size="paginationConfig.perPage = $event"
+ />
+ </template>
+ </div>
+</template>
diff --git a/app/assets/javascripts/pages/import/bulk_imports/history/index.js b/app/assets/javascripts/pages/import/bulk_imports/history/index.js
new file mode 100644
index 00000000000..5a67aa99baa
--- /dev/null
+++ b/app/assets/javascripts/pages/import/bulk_imports/history/index.js
@@ -0,0 +1,15 @@
+import Vue from 'vue';
+import BulkImportHistoryApp from './components/bulk_imports_history_app.vue';
+
+function mountImportHistoryApp(mountElement) {
+ if (!mountElement) return undefined;
+
+ return new Vue({
+ el: mountElement,
+ render(createElement) {
+ return createElement(BulkImportHistoryApp);
+ },
+ });
+}
+
+mountImportHistoryApp(document.querySelector('#import-history-mount-element'));
diff --git a/app/assets/javascripts/pages/import/bulk_imports/history/utils/error_messages.js b/app/assets/javascripts/pages/import/bulk_imports/history/utils/error_messages.js
new file mode 100644
index 00000000000..24669e22ade
--- /dev/null
+++ b/app/assets/javascripts/pages/import/bulk_imports/history/utils/error_messages.js
@@ -0,0 +1,3 @@
+import { __ } from '~/locale';
+
+export const DEFAULT_ERROR = __('Something went wrong on our end.');
diff --git a/app/assets/javascripts/pages/profiles/index.js b/app/assets/javascripts/pages/profiles/index.js
index 80bc32dd43f..6afb3636998 100644
--- a/app/assets/javascripts/pages/profiles/index.js
+++ b/app/assets/javascripts/pages/profiles/index.js
@@ -2,6 +2,7 @@ import $ from 'jquery';
import '~/profile/gl_crop';
import Profile from '~/profile/profile';
import initSearchSettings from '~/search_settings';
+import initPasswordPrompt from './password_prompt';
// eslint-disable-next-line func-names
$(document).on('input.ssh_key', '#key_key', function () {
@@ -19,3 +20,4 @@ $(document).on('input.ssh_key', '#key_key', function () {
new Profile(); // eslint-disable-line no-new
initSearchSettings();
+initPasswordPrompt();
diff --git a/app/assets/javascripts/pages/profiles/password_prompt/constants.js b/app/assets/javascripts/pages/profiles/password_prompt/constants.js
new file mode 100644
index 00000000000..99b8442c928
--- /dev/null
+++ b/app/assets/javascripts/pages/profiles/password_prompt/constants.js
@@ -0,0 +1,9 @@
+import { __, s__ } from '~/locale';
+
+export const I18N_PASSWORD_PROMPT_TITLE = s__('PasswordPrompt|Confirm password to continue');
+export const I18N_PASSWORD_PROMPT_FORM_LABEL = s__(
+ 'PasswordPrompt|Please enter your password to confirm',
+);
+export const I18N_PASSWORD_PROMPT_ERROR_MESSAGE = s__('PasswordPrompt|Password is required');
+export const I18N_PASSWORD_PROMPT_CONFIRM_BUTTON = s__('PasswordPrompt|Confirm password');
+export const I18N_PASSWORD_PROMPT_CANCEL_BUTTON = __('Cancel');
diff --git a/app/assets/javascripts/pages/profiles/password_prompt/index.js b/app/assets/javascripts/pages/profiles/password_prompt/index.js
new file mode 100644
index 00000000000..20645112893
--- /dev/null
+++ b/app/assets/javascripts/pages/profiles/password_prompt/index.js
@@ -0,0 +1,58 @@
+import Vue from 'vue';
+import Translate from '~/vue_shared/translate';
+import PasswordPromptModal from './password_prompt_modal.vue';
+
+Vue.use(Translate);
+
+const emailFieldSelector = '#user_email';
+const editFormSelector = '.js-password-prompt-form';
+const passwordPromptFieldSelector = '.js-password-prompt-field';
+const passwordPromptBtnSelector = '.js-password-prompt-btn';
+
+const passwordPromptModalId = 'password-prompt-modal';
+
+const getEmailValue = () => document.querySelector(emailFieldSelector).value.trim();
+const passwordPromptButton = document.querySelector(passwordPromptBtnSelector);
+const field = document.querySelector(passwordPromptFieldSelector);
+const form = document.querySelector(editFormSelector);
+
+const handleConfirmPassword = (pw) => {
+ // update the validation_password field
+ field.value = pw;
+ // submit the form
+ form.submit();
+};
+
+export default () => {
+ const passwordPromptModalEl = document.getElementById(passwordPromptModalId);
+
+ if (passwordPromptModalEl && field) {
+ return new Vue({
+ el: passwordPromptModalEl,
+ data() {
+ return {
+ initialEmail: '',
+ };
+ },
+ mounted() {
+ this.initialEmail = getEmailValue();
+ passwordPromptButton.addEventListener('click', this.handleSettingsUpdate);
+ },
+ methods: {
+ handleSettingsUpdate(ev) {
+ const email = getEmailValue();
+ if (email !== this.initialEmail) {
+ ev.preventDefault();
+ this.$root.$emit('bv::show::modal', passwordPromptModalId, passwordPromptBtnSelector);
+ }
+ },
+ },
+ render(createElement) {
+ return createElement(PasswordPromptModal, {
+ props: { handleConfirmPassword },
+ });
+ },
+ });
+ }
+ return null;
+};
diff --git a/app/assets/javascripts/pages/profiles/password_prompt/password_prompt_modal.vue b/app/assets/javascripts/pages/profiles/password_prompt/password_prompt_modal.vue
new file mode 100644
index 00000000000..44728ea9cdf
--- /dev/null
+++ b/app/assets/javascripts/pages/profiles/password_prompt/password_prompt_modal.vue
@@ -0,0 +1,82 @@
+<script>
+import { GlModal, GlForm, GlFormGroup, GlFormInput } from '@gitlab/ui';
+import {
+ I18N_PASSWORD_PROMPT_TITLE,
+ I18N_PASSWORD_PROMPT_FORM_LABEL,
+ I18N_PASSWORD_PROMPT_ERROR_MESSAGE,
+ I18N_PASSWORD_PROMPT_CANCEL_BUTTON,
+ I18N_PASSWORD_PROMPT_CONFIRM_BUTTON,
+} from './constants';
+
+export default {
+ components: {
+ GlModal,
+ GlForm,
+ GlFormGroup,
+ GlFormInput,
+ },
+ props: {
+ handleConfirmPassword: {
+ type: Function,
+ required: true,
+ },
+ },
+ data() {
+ return {
+ passwordCheck: '',
+ };
+ },
+ computed: {
+ isValid() {
+ return Boolean(this.passwordCheck.length);
+ },
+ primaryProps() {
+ return {
+ text: I18N_PASSWORD_PROMPT_CONFIRM_BUTTON,
+ attributes: [{ variant: 'danger' }, { category: 'primary' }, { disabled: !this.isValid }],
+ };
+ },
+ },
+ methods: {
+ onConfirmPassword() {
+ this.handleConfirmPassword(this.passwordCheck);
+ },
+ },
+ cancelProps: {
+ text: I18N_PASSWORD_PROMPT_CANCEL_BUTTON,
+ },
+ i18n: {
+ title: I18N_PASSWORD_PROMPT_TITLE,
+ formLabel: I18N_PASSWORD_PROMPT_FORM_LABEL,
+ errorMessage: I18N_PASSWORD_PROMPT_ERROR_MESSAGE,
+ },
+};
+</script>
+
+<template>
+ <gl-modal
+ data-testid="password-prompt-modal"
+ modal-id="password-prompt-modal"
+ :title="$options.i18n.title"
+ :action-primary="primaryProps"
+ :action-cancel="$options.cancelProps"
+ @primary="onConfirmPassword"
+ >
+ <gl-form @submit.prevent="onConfirmPassword">
+ <gl-form-group
+ :label="$options.i18n.formLabel"
+ label-for="password-prompt-confirmation"
+ :invalid-feedback="$options.i18n.errorMessage"
+ :state="isValid"
+ >
+ <gl-form-input
+ id="password-prompt-confirmation"
+ v-model="passwordCheck"
+ name="password-confirmation"
+ type="password"
+ data-testid="password-prompt-field"
+ />
+ </gl-form-group>
+ </gl-form>
+ </gl-modal>
+</template>
diff --git a/app/assets/javascripts/pages/projects/cluster_agents/show/index.js b/app/assets/javascripts/pages/projects/cluster_agents/show/index.js
new file mode 100644
index 00000000000..4ed3e2f7bea
--- /dev/null
+++ b/app/assets/javascripts/pages/projects/cluster_agents/show/index.js
@@ -0,0 +1,3 @@
+import loadClusterAgentVues from '~/clusters/agents';
+
+loadClusterAgentVues();
diff --git a/app/assets/javascripts/pages/projects/clusters/index/index.js b/app/assets/javascripts/pages/projects/clusters/index/index.js
index 2b5451bd18b..a1ba920b322 100644
--- a/app/assets/javascripts/pages/projects/clusters/index/index.js
+++ b/app/assets/javascripts/pages/projects/clusters/index/index.js
@@ -1,4 +1,4 @@
-import initClustersListApp from 'ee_else_ce/clusters_list';
+import initClustersListApp from '~/clusters_list';
import PersistentUserCallout from '~/persistent_user_callout';
const callout = document.querySelector('.gcp-signup-offer');
diff --git a/app/assets/javascripts/pages/projects/new/components/new_project_url_select.vue b/app/assets/javascripts/pages/projects/new/components/new_project_url_select.vue
deleted file mode 100644
index ba8858c985a..00000000000
--- a/app/assets/javascripts/pages/projects/new/components/new_project_url_select.vue
+++ /dev/null
@@ -1,98 +0,0 @@
-<script>
-import {
- GlButton,
- GlButtonGroup,
- GlDropdown,
- GlDropdownItem,
- GlDropdownSectionHeader,
- GlLoadingIcon,
- GlSearchBoxByType,
-} from '@gitlab/ui';
-import { MINIMUM_SEARCH_LENGTH } from '~/graphql_shared/constants';
-import { getIdFromGraphQLId } from '~/graphql_shared/utils';
-import Tracking from '~/tracking';
-import { DEBOUNCE_DELAY } from '~/vue_shared/components/filtered_search_bar/constants';
-import searchNamespacesWhereUserCanCreateProjectsQuery from '../queries/search_namespaces_where_user_can_create_projects.query.graphql';
-
-export default {
- components: {
- GlButton,
- GlButtonGroup,
- GlDropdown,
- GlDropdownItem,
- GlDropdownSectionHeader,
- GlLoadingIcon,
- GlSearchBoxByType,
- },
- mixins: [Tracking.mixin()],
- apollo: {
- currentUser: {
- query: searchNamespacesWhereUserCanCreateProjectsQuery,
- variables() {
- return {
- search: this.search,
- };
- },
- skip() {
- return this.search.length > 0 && this.search.length < MINIMUM_SEARCH_LENGTH;
- },
- debounce: DEBOUNCE_DELAY,
- },
- },
- inject: ['namespaceFullPath', 'namespaceId', 'rootUrl', 'trackLabel'],
- data() {
- return {
- currentUser: {},
- search: '',
- selectedNamespace: {
- id: this.namespaceId,
- fullPath: this.namespaceFullPath,
- },
- };
- },
- computed: {
- userGroups() {
- return this.currentUser.groups?.nodes || [];
- },
- userNamespace() {
- return this.currentUser.namespace || {};
- },
- },
- methods: {
- handleClick({ id, fullPath }) {
- this.selectedNamespace = {
- id: getIdFromGraphQLId(id),
- fullPath,
- };
- },
- },
-};
-</script>
-
-<template>
- <gl-button-group class="gl-w-full">
- <gl-button label>{{ rootUrl }}</gl-button>
- <gl-dropdown
- class="gl-w-full"
- :text="selectedNamespace.fullPath"
- toggle-class="gl-rounded-top-right-base! gl-rounded-bottom-right-base!"
- data-qa-selector="select_namespace_dropdown"
- @show="track('activate_form_input', { label: trackLabel, property: 'project_path' })"
- >
- <gl-search-box-by-type v-model.trim="search" />
- <gl-loading-icon v-if="$apollo.queries.currentUser.loading" />
- <template v-else>
- <gl-dropdown-section-header>{{ __('Groups') }}</gl-dropdown-section-header>
- <gl-dropdown-item v-for="group of userGroups" :key="group.id" @click="handleClick(group)">
- {{ group.fullPath }}
- </gl-dropdown-item>
- <gl-dropdown-section-header>{{ __('Users') }}</gl-dropdown-section-header>
- <gl-dropdown-item @click="handleClick(userNamespace)">
- {{ userNamespace.fullPath }}
- </gl-dropdown-item>
- </template>
- </gl-dropdown>
-
- <input type="hidden" name="project[namespace_id]" :value="selectedNamespace.id" />
- </gl-button-group>
-</template>
diff --git a/app/assets/javascripts/pages/projects/new/index.js b/app/assets/javascripts/pages/projects/new/index.js
index ed816e3be95..d89b4d0e0a3 100644
--- a/app/assets/javascripts/pages/projects/new/index.js
+++ b/app/assets/javascripts/pages/projects/new/index.js
@@ -1,66 +1,6 @@
-import Vue from 'vue';
-import VueApollo from 'vue-apollo';
-import createDefaultClient from '~/lib/graphql';
-import { parseBoolean } from '~/lib/utils/common_utils';
-import initProjectVisibilitySelector from '../../../project_visibility';
-import initProjectNew from '../../../projects/project_new';
-import NewProjectCreationApp from './components/app.vue';
-import NewProjectUrlSelect from './components/new_project_url_select.vue';
-
-function initNewProjectCreation() {
- const el = document.querySelector('.js-new-project-creation');
-
- const {
- pushToCreateProjectCommand,
- workingWithProjectsHelpPath,
- newProjectGuidelines,
- hasErrors,
- isCiCdAvailable,
- } = el.dataset;
-
- const props = {
- hasErrors: parseBoolean(hasErrors),
- isCiCdAvailable: parseBoolean(isCiCdAvailable),
- newProjectGuidelines,
- };
-
- const provide = {
- workingWithProjectsHelpPath,
- pushToCreateProjectCommand,
- };
-
- return new Vue({
- el,
- provide,
- render(h) {
- return h(NewProjectCreationApp, { props });
- },
- });
-}
-
-function initNewProjectUrlSelect() {
- const el = document.querySelector('.js-vue-new-project-url-select');
-
- if (!el) {
- return undefined;
- }
-
- Vue.use(VueApollo);
-
- return new Vue({
- el,
- apolloProvider: new VueApollo({
- defaultClient: createDefaultClient({}, { assumeImmutableResults: true }),
- }),
- provide: {
- namespaceFullPath: el.dataset.namespaceFullPath,
- namespaceId: el.dataset.namespaceId,
- rootUrl: el.dataset.rootUrl,
- trackLabel: el.dataset.trackLabel,
- },
- render: (createElement) => createElement(NewProjectUrlSelect),
- });
-}
+import { initNewProjectCreation, initNewProjectUrlSelect } from '~/projects/new';
+import initProjectVisibilitySelector from '~/project_visibility';
+import initProjectNew from '~/projects/project_new';
initProjectVisibilitySelector();
initProjectNew.bindEvents();
diff --git a/app/assets/javascripts/pages/projects/packages/packages/index/index.js b/app/assets/javascripts/pages/projects/packages/packages/index/index.js
index c94782fdf1b..95522573b53 100644
--- a/app/assets/javascripts/pages/projects/packages/packages/index/index.js
+++ b/app/assets/javascripts/pages/projects/packages/packages/index/index.js
@@ -1,3 +1,10 @@
-import initPackageList from '~/packages/list/packages_list_app_bundle';
+(async function packageApp() {
+ if (window.gon.features.packageListApollo) {
+ const newPackageList = await import('~/packages_and_registries/package_registry/pages/list');
-initPackageList();
+ newPackageList.default();
+ } else {
+ const packageList = await import('~/packages/list/packages_list_app_bundle');
+ packageList.default();
+ }
+})();
diff --git a/app/assets/javascripts/pages/projects/pipeline_schedules/shared/components/timezone_dropdown.js b/app/assets/javascripts/pages/projects/pipeline_schedules/shared/components/timezone_dropdown.js
index 16c4a6191b2..e92b9b30fa4 100644
--- a/app/assets/javascripts/pages/projects/pipeline_schedules/shared/components/timezone_dropdown.js
+++ b/app/assets/javascripts/pages/projects/pipeline_schedules/shared/components/timezone_dropdown.js
@@ -27,19 +27,22 @@ export const findTimezoneByIdentifier = (tzList = [], identifier = null) => {
};
export default class TimezoneDropdown {
- constructor({ $dropdownEl, $inputEl, onSelectTimezone, displayFormat } = defaults) {
+ constructor({
+ $dropdownEl,
+ $inputEl,
+ onSelectTimezone,
+ displayFormat,
+ allowEmpty = false,
+ } = defaults) {
this.$dropdown = $dropdownEl;
this.$dropdownToggle = this.$dropdown.find('.dropdown-toggle-text');
this.$input = $inputEl;
- this.timezoneData = this.$dropdown.data('data');
+ this.timezoneData = this.$dropdown.data('data') || [];
this.onSelectTimezone = onSelectTimezone;
this.displayFormat = displayFormat || defaults.displayFormat;
+ this.allowEmpty = allowEmpty;
- this.initialTimezone =
- findTimezoneByIdentifier(this.timezoneData, this.$input.val()) || defaultTimezone;
-
- this.initDefaultTimezone();
this.initDropdown();
}
@@ -52,24 +55,25 @@ export default class TimezoneDropdown {
search: {
fields: ['name'],
},
- clicked: (cfg) => this.updateInputValue(cfg),
+ clicked: (cfg) => this.handleDropdownChange(cfg),
text: (item) => formatTimezone(item),
});
- this.setDropdownToggle(this.displayFormat(this.initialTimezone));
- }
+ const initialTimezone = findTimezoneByIdentifier(this.timezoneData, this.$input.val());
- initDefaultTimezone() {
- if (!this.$input.val()) {
- this.$input.val(defaultTimezone.name);
+ if (initialTimezone !== null) {
+ this.setDropdownValue(initialTimezone);
+ } else if (!this.allowEmpty) {
+ this.setDropdownValue(defaultTimezone);
}
}
- setDropdownToggle(dropdownText) {
- this.$dropdownToggle.text(dropdownText);
+ setDropdownValue(timezone) {
+ this.$dropdownToggle.text(this.displayFormat(timezone));
+ this.$input.val(timezone.name);
}
- updateInputValue({ selectedObj, e }) {
+ handleDropdownChange({ selectedObj, e }) {
e.preventDefault();
this.$input.val(selectedObj.identifier);
if (this.onSelectTimezone) {
diff --git a/app/assets/javascripts/pages/projects/project_members/index.js b/app/assets/javascripts/pages/projects/project_members/index.js
index 0b662c945c6..947bbdacf2c 100644
--- a/app/assets/javascripts/pages/projects/project_members/index.js
+++ b/app/assets/javascripts/pages/projects/project_members/index.js
@@ -26,7 +26,7 @@ initInviteMembersForm();
new UsersSelect(); // eslint-disable-line no-new
-const SHARED_FIELDS = ['account', 'expires', 'maxRole', 'expiration', 'actions'];
+const SHARED_FIELDS = ['account', 'maxRole', 'expiration', 'actions'];
initMembersApp(document.querySelector('.js-project-members-list-app'), {
[MEMBER_TYPES.user]: {
tableFields: SHARED_FIELDS.concat(['source', 'granted']),
diff --git a/app/assets/javascripts/pages/projects/wikis/diff/index.js b/app/assets/javascripts/pages/projects/wikis/diff/index.js
new file mode 100644
index 00000000000..73440db761f
--- /dev/null
+++ b/app/assets/javascripts/pages/projects/wikis/diff/index.js
@@ -0,0 +1,3 @@
+import { initDiffStatsDropdown } from '~/init_diff_stats_dropdown';
+
+initDiffStatsDropdown();
diff --git a/app/assets/javascripts/pages/projects/wikis/edit/index.js b/app/assets/javascripts/pages/projects/wikis/edit/index.js
new file mode 100644
index 00000000000..b2288c2655c
--- /dev/null
+++ b/app/assets/javascripts/pages/projects/wikis/edit/index.js
@@ -0,0 +1,3 @@
+import { mountApplications } from '~/pages/shared/wikis/edit';
+
+mountApplications();
diff --git a/app/assets/javascripts/pages/projects/wikis/git_access/index.js b/app/assets/javascripts/pages/projects/wikis/git_access/index.js
new file mode 100644
index 00000000000..b1f3006bc1a
--- /dev/null
+++ b/app/assets/javascripts/pages/projects/wikis/git_access/index.js
@@ -0,0 +1,3 @@
+import initClonePanel from '~/clone_panel';
+
+initClonePanel();
diff --git a/app/assets/javascripts/pages/projects/wikis/index.js b/app/assets/javascripts/pages/projects/wikis/index.js
index 2c1f9e634ab..83fcd348ddf 100644
--- a/app/assets/javascripts/pages/projects/wikis/index.js
+++ b/app/assets/javascripts/pages/projects/wikis/index.js
@@ -1,5 +1,3 @@
-import { initDiffStatsDropdown } from '~/init_diff_stats_dropdown';
-import initWikis from '~/pages/shared/wikis';
+import Wikis from '~/pages/shared/wikis/wikis';
-initWikis();
-initDiffStatsDropdown();
+export default new Wikis();
diff --git a/app/assets/javascripts/pages/projects/wikis/show/index.js b/app/assets/javascripts/pages/projects/wikis/show/index.js
new file mode 100644
index 00000000000..c08a10122b6
--- /dev/null
+++ b/app/assets/javascripts/pages/projects/wikis/show/index.js
@@ -0,0 +1,3 @@
+import { mountApplications as mountEditApplications } from '~/pages/shared/wikis/async_edit';
+
+mountEditApplications();
diff --git a/app/assets/javascripts/pages/sessions/new/oauth_remember_me.js b/app/assets/javascripts/pages/sessions/new/oauth_remember_me.js
index 8d2d5d41f6a..ee48543f0d2 100644
--- a/app/assets/javascripts/pages/sessions/new/oauth_remember_me.js
+++ b/app/assets/javascripts/pages/sessions/new/oauth_remember_me.js
@@ -20,7 +20,7 @@ export default class OAuthRememberMe {
toggleRememberMe(event) {
const rememberMe = $(event.target).is(':checked');
- $('.oauth-login', this.container).each((i, element) => {
+ $('.js-oauth-login', this.container).each((i, element) => {
const $form = $(element).parent('form');
const href = $form.attr('action');
diff --git a/app/assets/javascripts/pages/shared/mount_runner_instructions.js b/app/assets/javascripts/pages/shared/mount_runner_instructions.js
index e83c73edfde..1cb7259be64 100644
--- a/app/assets/javascripts/pages/shared/mount_runner_instructions.js
+++ b/app/assets/javascripts/pages/shared/mount_runner_instructions.js
@@ -9,7 +9,12 @@ export function initInstallRunner(componentId = 'js-install-runner') {
const installRunnerEl = document.getElementById(componentId);
if (installRunnerEl) {
- const defaultClient = createDefaultClient();
+ const defaultClient = createDefaultClient(
+ {},
+ {
+ assumeImmutableResults: true,
+ },
+ );
const apolloProvider = new VueApollo({
defaultClient,
diff --git a/app/assets/javascripts/pages/shared/wikis/async_edit.js b/app/assets/javascripts/pages/shared/wikis/async_edit.js
new file mode 100644
index 00000000000..4536a076568
--- /dev/null
+++ b/app/assets/javascripts/pages/shared/wikis/async_edit.js
@@ -0,0 +1,11 @@
+export const mountApplications = async () => {
+ const el = document.querySelector('.js-wiki-edit-page');
+
+ if (el) {
+ const { mountApplications: mountEditApplications } = await import(
+ /* webpackChunkName: 'wiki_edit' */ './edit'
+ );
+
+ mountEditApplications();
+ }
+};
diff --git a/app/assets/javascripts/pages/shared/wikis/edit.js b/app/assets/javascripts/pages/shared/wikis/edit.js
new file mode 100644
index 00000000000..beeabfde1a6
--- /dev/null
+++ b/app/assets/javascripts/pages/shared/wikis/edit.js
@@ -0,0 +1,88 @@
+import $ from 'jquery';
+import Vue from 'vue';
+import { convertObjectPropsToCamelCase } from '~/lib/utils/common_utils';
+import csrf from '~/lib/utils/csrf';
+import Translate from '~/vue_shared/translate';
+import GLForm from '../../../gl_form';
+import ZenMode from '../../../zen_mode';
+import deleteWikiModal from './components/delete_wiki_modal.vue';
+import wikiAlert from './components/wiki_alert.vue';
+import wikiForm from './components/wiki_form.vue';
+
+const createModalVueApp = () => {
+ const deleteWikiModalWrapperEl = document.getElementById('delete-wiki-modal-wrapper');
+
+ if (deleteWikiModalWrapperEl) {
+ Vue.use(Translate);
+
+ const { deleteWikiUrl, pageTitle } = deleteWikiModalWrapperEl.dataset;
+
+ // eslint-disable-next-line no-new
+ new Vue({
+ el: deleteWikiModalWrapperEl,
+ data() {
+ return {
+ deleteWikiUrl: '',
+ };
+ },
+ render(createElement) {
+ return createElement(deleteWikiModal, {
+ props: {
+ pageTitle,
+ deleteWikiUrl,
+ csrfToken: csrf.token,
+ },
+ });
+ },
+ });
+ }
+};
+
+const createAlertVueApp = () => {
+ const el = document.getElementById('js-wiki-error');
+ if (el) {
+ const { error, wikiPagePath } = el.dataset;
+
+ // eslint-disable-next-line no-new
+ new Vue({
+ el,
+ render(createElement) {
+ return createElement(wikiAlert, {
+ props: {
+ error,
+ wikiPagePath,
+ },
+ });
+ },
+ });
+ }
+};
+
+const createWikiFormApp = () => {
+ const el = document.getElementById('js-wiki-form');
+
+ if (el) {
+ const { pageInfo, formatOptions } = el.dataset;
+
+ // eslint-disable-next-line no-new
+ new Vue({
+ el,
+ provide: {
+ formatOptions: JSON.parse(formatOptions),
+ pageInfo: convertObjectPropsToCamelCase(JSON.parse(pageInfo)),
+ },
+ render(createElement) {
+ return createElement(wikiForm);
+ },
+ });
+ }
+};
+
+export const mountApplications = () => {
+ new ZenMode(); // eslint-disable-line no-new
+ new GLForm($('.wiki-form')); // eslint-disable-line no-new
+
+ createModalVueApp();
+ createAlertVueApp();
+ createWikiFormApp();
+};
diff --git a/app/assets/javascripts/pages/shared/wikis/index.js b/app/assets/javascripts/pages/shared/wikis/index.js
deleted file mode 100644
index 42aefe81325..00000000000
--- a/app/assets/javascripts/pages/shared/wikis/index.js
+++ /dev/null
@@ -1,92 +0,0 @@
-import $ from 'jquery';
-import Vue from 'vue';
-import ShortcutsWiki from '~/behaviors/shortcuts/shortcuts_wiki';
-import { convertObjectPropsToCamelCase } from '~/lib/utils/common_utils';
-import csrf from '~/lib/utils/csrf';
-import Translate from '~/vue_shared/translate';
-import GLForm from '../../../gl_form';
-import ZenMode from '../../../zen_mode';
-import deleteWikiModal from './components/delete_wiki_modal.vue';
-import wikiAlert from './components/wiki_alert.vue';
-import wikiForm from './components/wiki_form.vue';
-import Wikis from './wikis';
-
-const createModalVueApp = () => {
- new Wikis(); // eslint-disable-line no-new
- new ShortcutsWiki(); // eslint-disable-line no-new
- new ZenMode(); // eslint-disable-line no-new
- new GLForm($('.wiki-form')); // eslint-disable-line no-new
-
- const deleteWikiModalWrapperEl = document.getElementById('delete-wiki-modal-wrapper');
-
- if (deleteWikiModalWrapperEl) {
- Vue.use(Translate);
-
- const { deleteWikiUrl, pageTitle } = deleteWikiModalWrapperEl.dataset;
-
- // eslint-disable-next-line no-new
- new Vue({
- el: deleteWikiModalWrapperEl,
- data() {
- return {
- deleteWikiUrl: '',
- };
- },
- render(createElement) {
- return createElement(deleteWikiModal, {
- props: {
- pageTitle,
- deleteWikiUrl,
- csrfToken: csrf.token,
- },
- });
- },
- });
- }
-};
-
-const createAlertVueApp = () => {
- const el = document.getElementById('js-wiki-error');
- if (el) {
- const { error, wikiPagePath } = el.dataset;
-
- // eslint-disable-next-line no-new
- new Vue({
- el,
- render(createElement) {
- return createElement(wikiAlert, {
- props: {
- error,
- wikiPagePath,
- },
- });
- },
- });
- }
-};
-
-const createWikiFormApp = () => {
- const el = document.getElementById('js-wiki-form');
-
- if (el) {
- const { pageInfo, formatOptions } = el.dataset;
-
- // eslint-disable-next-line no-new
- new Vue({
- el,
- provide: {
- formatOptions: JSON.parse(formatOptions),
- pageInfo: convertObjectPropsToCamelCase(JSON.parse(pageInfo)),
- },
- render(createElement) {
- return createElement(wikiForm);
- },
- });
- }
-};
-
-export default () => {
- createModalVueApp();
- createAlertVueApp();
- createWikiFormApp();
-};
diff --git a/app/assets/javascripts/pages/shared/wikis/wikis.js b/app/assets/javascripts/pages/shared/wikis/wikis.js
index 7d0b0c90c8d..8d0105bc681 100644
--- a/app/assets/javascripts/pages/shared/wikis/wikis.js
+++ b/app/assets/javascripts/pages/shared/wikis/wikis.js
@@ -1,6 +1,7 @@
import { GlBreakpointInstance as bp } from '@gitlab/ui/dist/utils';
import Tracking from '~/tracking';
import showToast from '~/vue_shared/plugins/global_toast';
+import ShortcutsWiki from '~/behaviors/shortcuts/shortcuts_wiki';
const TRACKING_EVENT_NAME = 'view_wiki_page';
const TRACKING_CONTEXT_SCHEMA = 'iglu:com.gitlab/wiki_page_context/jsonschema/1-0-1';
@@ -20,6 +21,7 @@ export default class Wikis {
Wikis.trackPageView();
Wikis.showToasts();
+ Wikis.initShortcuts();
}
handleToggleSidebar(e) {
@@ -64,4 +66,8 @@ export default class Wikis {
const toasts = document.querySelectorAll('.js-toast-message');
toasts.forEach((toast) => showToast(toast.dataset.message));
}
+
+ static initShortcuts() {
+ new ShortcutsWiki(); // eslint-disable-line no-new
+ }
}
diff --git a/app/assets/javascripts/performance_bar/components/performance_bar_app.vue b/app/assets/javascripts/performance_bar/components/performance_bar_app.vue
index f204f0ebfaa..ed30198244f 100644
--- a/app/assets/javascripts/performance_bar/components/performance_bar_app.vue
+++ b/app/assets/javascripts/performance_bar/components/performance_bar_app.vue
@@ -1,6 +1,7 @@
<script>
import { GlSafeHtmlDirective } from '@gitlab/ui';
import { glEmojiTag } from '~/emoji';
+import { mergeUrlParams } from '~/lib/utils/url_utility';
import { s__ } from '~/locale';
import AddRequest from './add_request.vue';
@@ -131,6 +132,12 @@ export default {
changeCurrentRequest(newRequestId) {
this.currentRequest = newRequestId;
},
+ flamegraphPath(mode) {
+ return mergeUrlParams(
+ { performance_bar: 'flamegraph', stackprof_mode: mode },
+ window.location.href,
+ );
+ },
},
safeHtmlConfig: { ADD_TAGS: ['gl-emoji'] },
};
@@ -175,6 +182,20 @@ export default {
s__('PerformanceBar|Download')
}}</a>
</div>
+ <div v-if="currentRequest.details" id="peek-flamegraph" class="view">
+ <span class="gl-text-white-200">{{ s__('PerformanceBar|Flamegraph with mode:') }}</span>
+ <a class="gl-text-blue-200" :href="flamegraphPath('wall')">{{
+ s__('PerformanceBar|wall')
+ }}</a>
+ /
+ <a class="gl-text-blue-200" :href="flamegraphPath('cpu')">{{
+ s__('PerformanceBar|cpu')
+ }}</a>
+ /
+ <a class="gl-text-blue-200" :href="flamegraphPath('object')">{{
+ s__('PerformanceBar|object')
+ }}</a>
+ </div>
<a v-if="statsUrl" class="gl-text-blue-200 view" :href="statsUrl">{{
s__('PerformanceBar|Stats')
}}</a>
diff --git a/app/assets/javascripts/persistent_user_callouts.js b/app/assets/javascripts/persistent_user_callouts.js
index 8170a1f8443..a7f8704b559 100644
--- a/app/assets/javascripts/persistent_user_callouts.js
+++ b/app/assets/javascripts/persistent_user_callouts.js
@@ -9,6 +9,7 @@ const PERSISTENT_USER_CALLOUTS = [
'.js-registration-enabled-callout',
'.js-new-user-signups-cap-reached',
'.js-eoa-bronze-plan-banner',
+ '.js-security-newsletter-callout',
];
const initCallouts = () => {
diff --git a/app/assets/javascripts/pipeline_editor/components/editor/text_editor.vue b/app/assets/javascripts/pipeline_editor/components/editor/text_editor.vue
index f2a0f474bc4..7b8e97b573e 100644
--- a/app/assets/javascripts/pipeline_editor/components/editor/text_editor.vue
+++ b/app/assets/javascripts/pipeline_editor/components/editor/text_editor.vue
@@ -9,15 +9,8 @@ export default {
SourceEditor,
},
mixins: [glFeatureFlagMixin()],
- inject: ['ciConfigPath', 'projectPath', 'projectNamespace', 'defaultBranch'],
+ inject: ['ciConfigPath'],
inheritAttrs: false,
- props: {
- commitSha: {
- type: String,
- required: false,
- default: '',
- },
- },
methods: {
onCiConfigUpdate(content) {
this.$emit('updateCiConfig', content);
@@ -27,11 +20,7 @@ export default {
const editorInstance = this.$refs.editor.getEditor();
editorInstance.use(new CiSchemaExtension({ instance: editorInstance }));
- editorInstance.registerCiSchema({
- projectPath: this.projectPath,
- projectNamespace: this.projectNamespace,
- ref: this.commitSha || this.defaultBranch,
- });
+ editorInstance.registerCiSchema();
}
},
},
diff --git a/app/assets/javascripts/pipeline_editor/components/header/pipeline_editor_mini_graph.vue b/app/assets/javascripts/pipeline_editor/components/header/pipeline_editor_mini_graph.vue
new file mode 100644
index 00000000000..75b1398a3c2
--- /dev/null
+++ b/app/assets/javascripts/pipeline_editor/components/header/pipeline_editor_mini_graph.vue
@@ -0,0 +1,49 @@
+<script>
+import PipelineMiniGraph from '~/pipelines/components/pipelines_list/pipeline_mini_graph.vue';
+
+export default {
+ components: {
+ PipelineMiniGraph,
+ },
+ props: {
+ pipeline: {
+ type: Object,
+ required: true,
+ },
+ },
+ computed: {
+ pipelinePath() {
+ return this.pipeline.detailedStatus?.detailsPath || '';
+ },
+ pipelineStages() {
+ const stages = this.pipeline.stages?.edges;
+ if (!stages) {
+ return [];
+ }
+
+ return stages.map(({ node }) => {
+ const { name, detailedStatus } = node;
+ return {
+ // TODO: fetch dropdown_path from graphql when available
+ // see https://gitlab.com/gitlab-org/gitlab/-/issues/342585
+ dropdown_path: `${this.pipelinePath}/stage.json?stage=${name}`,
+ name,
+ path: `${this.pipelinePath}#${name}`,
+ status: {
+ details_path: `${this.pipelinePath}#${name}`,
+ has_details: detailedStatus.hasDetails,
+ ...detailedStatus,
+ },
+ title: `${name}: ${detailedStatus.text}`,
+ };
+ });
+ },
+ },
+};
+</script>
+
+<template>
+ <div v-if="pipelineStages.length > 0" class="stage-cell gl-mr-5">
+ <pipeline-mini-graph class="gl-display-inline" :stages="pipelineStages" />
+ </div>
+</template>
diff --git a/app/assets/javascripts/pipeline_editor/components/header/pipeline_status.vue b/app/assets/javascripts/pipeline_editor/components/header/pipeline_status.vue
index ec240854be5..a1fa2147994 100644
--- a/app/assets/javascripts/pipeline_editor/components/header/pipeline_status.vue
+++ b/app/assets/javascripts/pipeline_editor/components/header/pipeline_status.vue
@@ -10,6 +10,8 @@ import {
toggleQueryPollingByVisibility,
} from '~/pipelines/components/graph/utils';
import CiIcon from '~/vue_shared/components/ci_icon.vue';
+import glFeatureFlagMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
+import PipelineEditorMiniGraph from './pipeline_editor_mini_graph.vue';
const POLL_INTERVAL = 10000;
export const i18n = {
@@ -30,7 +32,9 @@ export default {
GlLink,
GlLoadingIcon,
GlSprintf,
+ PipelineEditorMiniGraph,
},
+ mixins: [glFeatureFlagMixin()],
inject: ['projectFullPath'],
props: {
commitSha: {
@@ -55,12 +59,15 @@ export default {
};
},
update(data) {
- const { id, commitPath = '', detailedStatus = {} } = data.project?.pipeline || {};
+ const { id, commitPath = '', detailedStatus = {}, stages, status } =
+ data.project?.pipeline || {};
return {
id,
commitPath,
detailedStatus,
+ stages,
+ status,
};
},
result(res) {
@@ -111,9 +118,7 @@ export default {
</script>
<template>
- <div
- class="gl-display-flex gl-justify-content-space-between gl-align-items-center gl-white-space-nowrap gl-max-w-full"
- >
+ <div class="gl-display-flex gl-justify-content-space-between gl-align-items-center gl-flex-wrap">
<template v-if="showLoadingState">
<div>
<gl-loading-icon class="gl-mr-auto gl-display-inline-block" size="sm" />
@@ -129,19 +134,12 @@ export default {
<template v-else>
<div>
<a :href="status.detailsPath" class="gl-mr-auto">
- <ci-icon :status="status" :size="16" />
+ <ci-icon :status="status" :size="16" data-testid="pipeline-status-icon" />
</a>
<span class="gl-font-weight-bold">
<gl-sprintf :message="$options.i18n.pipelineInfo">
<template #id="{ content }">
- <gl-link
- :href="status.detailsPath"
- class="pipeline-id gl-font-weight-normal pipeline-number"
- target="_blank"
- data-testid="pipeline-id"
- >
- {{ content }}{{ pipelineId }}</gl-link
- >
+ <span data-testid="pipeline-id"> {{ content }}{{ pipelineId }} </span>
</template>
<template #status>{{ status.text }}</template>
<template #commit>
@@ -157,8 +155,13 @@ export default {
</gl-sprintf>
</span>
</div>
- <div>
+ <div class="gl-display-flex gl-flex-wrap">
+ <pipeline-editor-mini-graph
+ v-if="glFeatures.pipelineEditorMiniGraph"
+ :pipeline="pipeline"
+ />
<gl-button
+ class="gl-mt-2 gl-md-mt-0"
target="_blank"
category="secondary"
variant="confirm"
diff --git a/app/assets/javascripts/pipeline_editor/components/ui/pipeline_editor_empty_state.vue b/app/assets/javascripts/pipeline_editor/components/ui/pipeline_editor_empty_state.vue
index fbb66231f16..dcd08c9de8d 100644
--- a/app/assets/javascripts/pipeline_editor/components/ui/pipeline_editor_empty_state.vue
+++ b/app/assets/javascripts/pipeline_editor/components/ui/pipeline_editor_empty_state.vue
@@ -2,7 +2,6 @@
import { GlButton, GlSprintf } from '@gitlab/ui';
import { __ } from '~/locale';
import PipelineEditorFileNav from '~/pipeline_editor/components/file_nav/pipeline_editor_file_nav.vue';
-import glFeatureFlagsMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
export default {
components: {
@@ -17,17 +16,11 @@ export default {
),
btnText: __('Create new CI/CD pipeline'),
},
- mixins: [glFeatureFlagsMixin()],
inject: {
emptyStateIllustrationPath: {
default: '',
},
},
- computed: {
- showCTAButton() {
- return this.glFeatures.pipelineEditorEmptyStateAction;
- },
- },
methods: {
createEmptyConfigFile() {
this.$emit('createEmptyConfigFile');
@@ -48,12 +41,7 @@ export default {
</template>
</gl-sprintf>
</p>
- <gl-button
- v-if="showCTAButton"
- variant="confirm"
- class="gl-mt-3"
- @click="createEmptyConfigFile"
- >
+ <gl-button variant="confirm" class="gl-mt-3" @click="createEmptyConfigFile">
{{ $options.i18n.btnText }}
</gl-button>
</div>
diff --git a/app/assets/javascripts/pipeline_editor/graphql/queries/client/pipeline.graphql b/app/assets/javascripts/pipeline_editor/graphql/queries/client/pipeline.graphql
index d3a7387ad2d..0c3653a2880 100644
--- a/app/assets/javascripts/pipeline_editor/graphql/queries/client/pipeline.graphql
+++ b/app/assets/javascripts/pipeline_editor/graphql/queries/client/pipeline.graphql
@@ -11,6 +11,25 @@ query getPipeline($fullPath: ID!, $sha: String!) {
group
text
}
+ stages {
+ edges {
+ node {
+ id
+ name
+ status
+ detailedStatus {
+ detailsPath
+ group
+ hasDetails
+ icon
+ id
+ label
+ text
+ tooltip
+ }
+ }
+ }
+ }
}
}
}
diff --git a/app/assets/javascripts/pipeline_editor/pipeline_editor_home.vue b/app/assets/javascripts/pipeline_editor/pipeline_editor_home.vue
index 4324c64ab3b..ba567023946 100644
--- a/app/assets/javascripts/pipeline_editor/pipeline_editor_home.vue
+++ b/app/assets/javascripts/pipeline_editor/pipeline_editor_home.vue
@@ -1,5 +1,4 @@
<script>
-import glFeatureFlagMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
import CommitSection from './components/commit/commit_section.vue';
import PipelineEditorDrawer from './components/drawer/pipeline_editor_drawer.vue';
import PipelineEditorFileNav from './components/file_nav/pipeline_editor_file_nav.vue';
@@ -15,7 +14,6 @@ export default {
PipelineEditorHeader,
PipelineEditorTabs,
},
- mixins: [glFeatureFlagMixin()],
props: {
ciConfigData: {
type: Object,
@@ -44,9 +42,6 @@ export default {
showCommitForm() {
return TABS_WITH_COMMIT_FORM.includes(this.currentTab);
},
- showPipelineDrawer() {
- return this.glFeatures.pipelineEditorDrawer;
- },
},
methods: {
setCurrentTab(tabName) {
@@ -77,6 +72,6 @@ export default {
:commit-sha="commitSha"
v-on="$listeners"
/>
- <pipeline-editor-drawer v-if="showPipelineDrawer" />
+ <pipeline-editor-drawer />
</div>
</template>
diff --git a/app/assets/javascripts/pipelines/components/graph/job_item.vue b/app/assets/javascripts/pipelines/components/graph/job_item.vue
index fd40ca0b9c9..0216b2717ed 100644
--- a/app/assets/javascripts/pipelines/components/graph/job_item.vue
+++ b/app/assets/javascripts/pipelines/components/graph/job_item.vue
@@ -52,7 +52,7 @@ export default {
required: true,
},
cssClassJobName: {
- type: [String, Array],
+ type: [String, Array, Object],
required: false,
default: '',
},
@@ -167,9 +167,13 @@ export default {
return this.job.name === this.pipelineExpanded.jobName && this.pipelineExpanded.expanded;
},
jobClasses() {
- return this.relatedDownstreamHovered || this.relatedDownstreamExpanded
- ? `${this.$options.hoverClass} ${this.cssClassJobName}`
- : this.cssClassJobName;
+ return [
+ {
+ [this.$options.hoverClass]:
+ this.relatedDownstreamHovered || this.relatedDownstreamExpanded,
+ },
+ this.cssClassJobName,
+ ];
},
},
errorCaptured(err, _vm, info) {
diff --git a/app/assets/javascripts/pipelines/components/pipelines_list/pipeline_multi_actions.vue b/app/assets/javascripts/pipelines/components/pipelines_list/pipeline_multi_actions.vue
index 3470c963ade..b778fe28e59 100644
--- a/app/assets/javascripts/pipelines/components/pipelines_list/pipeline_multi_actions.vue
+++ b/app/assets/javascripts/pipelines/components/pipelines_list/pipeline_multi_actions.vue
@@ -5,7 +5,6 @@ import {
GlDropdownItem,
GlDropdownSectionHeader,
GlLoadingIcon,
- GlSprintf,
GlTooltipDirective,
} from '@gitlab/ui';
import axios from '~/lib/utils/axios_utils';
@@ -13,7 +12,6 @@ import { __, s__ } from '~/locale';
export const i18n = {
artifacts: __('Artifacts'),
- downloadArtifact: __('Download %{name} artifact'),
artifactSectionHeader: __('Download artifacts'),
artifactsFetchErrorMessage: s__('Pipelines|Could not load artifacts.'),
emptyArtifactsMessage: __('No artifacts found'),
@@ -30,7 +28,6 @@ export default {
GlDropdownItem,
GlDropdownSectionHeader,
GlLoadingIcon,
- GlSprintf,
},
inject: {
artifactsEndpoint: {
@@ -113,9 +110,7 @@ export default {
class="gl-word-break-word"
data-testid="artifact-item"
>
- <gl-sprintf :message="$options.i18n.downloadArtifact">
- <template #name>{{ artifact.name }}</template>
- </gl-sprintf>
+ {{ artifact.name }}
</gl-dropdown-item>
</gl-dropdown>
</template>
diff --git a/app/assets/javascripts/pipelines/components/pipelines_list/pipeline_stop_modal.vue b/app/assets/javascripts/pipelines/components/pipelines_list/pipeline_stop_modal.vue
index 3bd149fc782..ef21673115e 100644
--- a/app/assets/javascripts/pipelines/components/pipelines_list/pipeline_stop_modal.vue
+++ b/app/assets/javascripts/pipelines/components/pipelines_list/pipeline_stop_modal.vue
@@ -1,5 +1,5 @@
<script>
-import { GlLink, GlModal } from '@gitlab/ui';
+import { GlLink, GlModal, GlSprintf } from '@gitlab/ui';
import { isEmpty } from 'lodash';
import { __, s__, sprintf } from '~/locale';
import CiIcon from '~/vue_shared/components/ci_icon.vue';
@@ -13,6 +13,7 @@ export default {
components: {
GlModal,
GlLink,
+ GlSprintf,
CiIcon,
},
props: {
@@ -33,13 +34,7 @@ export default {
);
},
modalText() {
- return sprintf(
- s__(`Pipeline|You’re about to stop pipeline %{pipelineId}.`),
- {
- pipelineId: `<strong>#${this.pipeline.id}</strong>`,
- },
- false,
- );
+ return s__(`Pipeline|You’re about to stop pipeline #%{pipelineId}.`);
},
hasRef() {
return !isEmpty(this.pipeline.ref);
@@ -71,7 +66,13 @@ export default {
:action-cancel="cancelProps"
@primary="emitSubmit($event)"
>
- <p v-html="modalText /* eslint-disable-line vue/no-v-html */"></p>
+ <p>
+ <gl-sprintf :message="modalText">
+ <template #pipelineId>
+ <strong>{{ pipeline.id }}</strong>
+ </template>
+ </gl-sprintf>
+ </p>
<p v-if="pipeline">
<ci-icon
diff --git a/app/assets/javascripts/pipelines/components/pipelines_list/pipelines_artifacts.vue b/app/assets/javascripts/pipelines/components/pipelines_list/pipelines_artifacts.vue
index 36629d9f1f1..1c7c4d7c704 100644
--- a/app/assets/javascripts/pipelines/components/pipelines_list/pipelines_artifacts.vue
+++ b/app/assets/javascripts/pipelines/components/pipelines_list/pipelines_artifacts.vue
@@ -3,8 +3,8 @@ import {
GlAlert,
GlDropdown,
GlDropdownItem,
+ GlDropdownSectionHeader,
GlLoadingIcon,
- GlSprintf,
GlTooltipDirective,
} from '@gitlab/ui';
import axios from '~/lib/utils/axios_utils';
@@ -12,7 +12,6 @@ import { __, s__ } from '~/locale';
export const i18n = {
artifacts: __('Artifacts'),
- downloadArtifact: __('Download %{name} artifact'),
artifactSectionHeader: __('Download artifacts'),
artifactsFetchErrorMessage: s__('Pipelines|Could not load artifacts.'),
noArtifacts: s__('Pipelines|No artifacts available'),
@@ -27,8 +26,8 @@ export default {
GlAlert,
GlDropdown,
GlDropdownItem,
+ GlDropdownSectionHeader,
GlLoadingIcon,
- GlSprintf,
},
inject: {
artifactsEndpoint: {
@@ -92,6 +91,10 @@ export default {
text-sr-only
@show.once="fetchArtifacts"
>
+ <gl-dropdown-section-header>{{
+ $options.i18n.artifactSectionHeader
+ }}</gl-dropdown-section-header>
+
<gl-alert v-if="hasError" variant="danger" :dismissible="false">
{{ $options.i18n.artifactsFetchErrorMessage }}
</gl-alert>
@@ -108,10 +111,9 @@ export default {
:href="artifact.path"
rel="nofollow"
download
+ class="gl-word-break-word"
>
- <gl-sprintf :message="$options.i18n.downloadArtifact">
- <template #name>{{ artifact.name }}</template>
- </gl-sprintf>
+ {{ artifact.name }}
</gl-dropdown-item>
</gl-dropdown>
</template>
diff --git a/app/assets/javascripts/pipelines/components/pipelines_list/tokens/constants.js b/app/assets/javascripts/pipelines/components/pipelines_list/tokens/constants.js
index 02baa76f627..d8f15cfde91 100644
--- a/app/assets/javascripts/pipelines/components/pipelines_list/tokens/constants.js
+++ b/app/assets/javascripts/pipelines/components/pipelines_list/tokens/constants.js
@@ -2,51 +2,51 @@ import { s__ } from '~/locale';
export const PIPELINE_SOURCES = [
{
- text: s__('Pipeline|Source|Push'),
+ text: s__('PipelineSource|Push'),
value: 'push',
},
{
- text: s__('Pipeline|Source|Web'),
+ text: s__('PipelineSource|Web'),
value: 'web',
},
{
- text: s__('Pipeline|Source|Trigger'),
+ text: s__('PipelineSource|Trigger'),
value: 'trigger',
},
{
- text: s__('Pipeline|Source|Schedule'),
+ text: s__('PipelineSource|Schedule'),
value: 'schedule',
},
{
- text: s__('Pipeline|Source|API'),
+ text: s__('PipelineSource|API'),
value: 'api',
},
{
- text: s__('Pipeline|Source|External'),
+ text: s__('PipelineSource|External'),
value: 'external',
},
{
- text: s__('Pipeline|Source|Pipeline'),
+ text: s__('PipelineSource|Pipeline'),
value: 'pipeline',
},
{
- text: s__('Pipeline|Source|Chat'),
+ text: s__('PipelineSource|Chat'),
value: 'chat',
},
{
- text: s__('Pipeline|Source|Web IDE'),
+ text: s__('PipelineSource|Web IDE'),
value: 'webide',
},
{
- text: s__('Pipeline|Source|Merge Request'),
+ text: s__('PipelineSource|Merge Request'),
value: 'merge_request_event',
},
{
- text: s__('Pipeline|Source|External Pull Request'),
+ text: s__('PipelineSource|External Pull Request'),
value: 'external_pull_request_event',
},
{
- text: s__('Pipeline|Source|Parent Pipeline'),
+ text: s__('PipelineSource|Parent Pipeline'),
value: 'parent_pipeline',
},
];
diff --git a/app/assets/javascripts/profile/profile.js b/app/assets/javascripts/profile/profile.js
index c49ade2bbb8..ff9b47cdcd6 100644
--- a/app/assets/javascripts/profile/profile.js
+++ b/app/assets/javascripts/profile/profile.js
@@ -21,6 +21,7 @@ export default class Profile {
$inputEl: this.$inputEl,
$dropdownEl: $('.js-timezone-dropdown'),
displayFormat: (selectedItem) => formatTimezone(selectedItem),
+ allowEmpty: true,
});
}
diff --git a/app/assets/javascripts/pages/projects/new/components/app.vue b/app/assets/javascripts/projects/new/components/app.vue
index 6e9efc50be8..6e9efc50be8 100644
--- a/app/assets/javascripts/pages/projects/new/components/app.vue
+++ b/app/assets/javascripts/projects/new/components/app.vue
diff --git a/app/assets/javascripts/pages/projects/new/components/new_project_push_tip_popover.vue b/app/assets/javascripts/projects/new/components/new_project_push_tip_popover.vue
index e42d9154866..e42d9154866 100644
--- a/app/assets/javascripts/pages/projects/new/components/new_project_push_tip_popover.vue
+++ b/app/assets/javascripts/projects/new/components/new_project_push_tip_popover.vue
diff --git a/app/assets/javascripts/projects/new/components/new_project_url_select.vue b/app/assets/javascripts/projects/new/components/new_project_url_select.vue
new file mode 100644
index 00000000000..bf44ff70562
--- /dev/null
+++ b/app/assets/javascripts/projects/new/components/new_project_url_select.vue
@@ -0,0 +1,163 @@
+<script>
+import {
+ GlButton,
+ GlButtonGroup,
+ GlDropdown,
+ GlDropdownItem,
+ GlDropdownText,
+ GlDropdownSectionHeader,
+ GlLoadingIcon,
+ GlSearchBoxByType,
+} from '@gitlab/ui';
+import { MINIMUM_SEARCH_LENGTH } from '~/graphql_shared/constants';
+import { getIdFromGraphQLId } from '~/graphql_shared/utils';
+import Tracking from '~/tracking';
+import { DEBOUNCE_DELAY } from '~/vue_shared/components/filtered_search_bar/constants';
+import searchNamespacesWhereUserCanCreateProjectsQuery from '../queries/search_namespaces_where_user_can_create_projects.query.graphql';
+import eventHub from '../event_hub';
+
+export default {
+ components: {
+ GlButton,
+ GlButtonGroup,
+ GlDropdown,
+ GlDropdownItem,
+ GlDropdownText,
+ GlDropdownSectionHeader,
+ GlLoadingIcon,
+ GlSearchBoxByType,
+ },
+ mixins: [Tracking.mixin()],
+ apollo: {
+ currentUser: {
+ query: searchNamespacesWhereUserCanCreateProjectsQuery,
+ variables() {
+ return {
+ search: this.search,
+ };
+ },
+ skip() {
+ return this.search.length > 0 && this.search.length < MINIMUM_SEARCH_LENGTH;
+ },
+ debounce: DEBOUNCE_DELAY,
+ },
+ },
+ inject: [
+ 'namespaceFullPath',
+ 'namespaceId',
+ 'rootUrl',
+ 'trackLabel',
+ 'userNamespaceFullPath',
+ 'userNamespaceId',
+ ],
+ data() {
+ return {
+ currentUser: {},
+ groupToFilterBy: undefined,
+ search: '',
+ selectedNamespace: this.namespaceId
+ ? {
+ id: this.namespaceId,
+ fullPath: this.namespaceFullPath,
+ }
+ : {
+ id: this.userNamespaceId,
+ fullPath: this.userNamespaceFullPath,
+ },
+ };
+ },
+ computed: {
+ userGroups() {
+ return this.currentUser.groups?.nodes || [];
+ },
+ userNamespace() {
+ return this.currentUser.namespace || {};
+ },
+ filteredGroups() {
+ return this.groupToFilterBy
+ ? this.userGroups.filter((group) =>
+ group.fullPath.startsWith(this.groupToFilterBy.fullPath),
+ )
+ : this.userGroups;
+ },
+ hasGroupMatches() {
+ return this.filteredGroups.length;
+ },
+ hasNamespaceMatches() {
+ return (
+ this.userNamespace.fullPath?.toLowerCase().includes(this.search.toLowerCase()) &&
+ !this.groupToFilterBy
+ );
+ },
+ hasNoMatches() {
+ return !this.hasGroupMatches && !this.hasNamespaceMatches;
+ },
+ },
+ created() {
+ eventHub.$on('select-template', this.handleSelectTemplate);
+ },
+ beforeDestroy() {
+ eventHub.$off('select-template', this.handleSelectTemplate);
+ },
+ methods: {
+ focusInput() {
+ this.$refs.search.focusInput();
+ },
+ handleSelectTemplate(groupId) {
+ this.groupToFilterBy = this.userGroups.find(
+ (group) => getIdFromGraphQLId(group.id) === groupId,
+ );
+ if (this.groupToFilterBy) {
+ this.setNamespace(this.groupToFilterBy);
+ }
+ },
+ setNamespace({ id, fullPath }) {
+ this.selectedNamespace = {
+ id: getIdFromGraphQLId(id),
+ fullPath,
+ };
+ },
+ },
+};
+</script>
+
+<template>
+ <gl-button-group class="input-lg">
+ <gl-button class="gl-text-truncate" label :title="rootUrl">{{ rootUrl }}</gl-button>
+ <gl-dropdown
+ :text="selectedNamespace.fullPath"
+ toggle-class="gl-rounded-top-right-base! gl-rounded-bottom-right-base! gl-w-20"
+ data-qa-selector="select_namespace_dropdown"
+ @show="track('activate_form_input', { label: trackLabel, property: 'project_path' })"
+ @shown="focusInput"
+ >
+ <gl-search-box-by-type
+ ref="search"
+ v-model.trim="search"
+ data-qa-selector="select_namespace_dropdown_search_field"
+ />
+ <gl-loading-icon v-if="$apollo.queries.currentUser.loading" />
+ <template v-else>
+ <template v-if="hasGroupMatches">
+ <gl-dropdown-section-header>{{ __('Groups') }}</gl-dropdown-section-header>
+ <gl-dropdown-item
+ v-for="group of filteredGroups"
+ :key="group.id"
+ @click="setNamespace(group)"
+ >
+ {{ group.fullPath }}
+ </gl-dropdown-item>
+ </template>
+ <template v-if="hasNamespaceMatches">
+ <gl-dropdown-section-header>{{ __('Users') }}</gl-dropdown-section-header>
+ <gl-dropdown-item @click="setNamespace(userNamespace)">
+ {{ userNamespace.fullPath }}
+ </gl-dropdown-item>
+ </template>
+ <gl-dropdown-text v-if="hasNoMatches">{{ __('No matches found') }}</gl-dropdown-text>
+ </template>
+ </gl-dropdown>
+
+ <input type="hidden" name="project[namespace_id]" :value="selectedNamespace.id" />
+ </gl-button-group>
+</template>
diff --git a/app/assets/javascripts/projects/new/event_hub.js b/app/assets/javascripts/projects/new/event_hub.js
new file mode 100644
index 00000000000..e31806ad199
--- /dev/null
+++ b/app/assets/javascripts/projects/new/event_hub.js
@@ -0,0 +1,3 @@
+import createEventHub from '~/helpers/event_hub_factory';
+
+export default createEventHub();
diff --git a/app/assets/javascripts/projects/new/index.js b/app/assets/javascripts/projects/new/index.js
new file mode 100644
index 00000000000..572d3276e4f
--- /dev/null
+++ b/app/assets/javascripts/projects/new/index.js
@@ -0,0 +1,66 @@
+import Vue from 'vue';
+import VueApollo from 'vue-apollo';
+import createDefaultClient from '~/lib/graphql';
+import { parseBoolean } from '~/lib/utils/common_utils';
+import NewProjectCreationApp from './components/app.vue';
+import NewProjectUrlSelect from './components/new_project_url_select.vue';
+
+export function initNewProjectCreation() {
+ const el = document.querySelector('.js-new-project-creation');
+
+ const {
+ pushToCreateProjectCommand,
+ workingWithProjectsHelpPath,
+ newProjectGuidelines,
+ hasErrors,
+ isCiCdAvailable,
+ } = el.dataset;
+
+ const props = {
+ hasErrors: parseBoolean(hasErrors),
+ isCiCdAvailable: parseBoolean(isCiCdAvailable),
+ newProjectGuidelines,
+ };
+
+ const provide = {
+ workingWithProjectsHelpPath,
+ pushToCreateProjectCommand,
+ };
+
+ return new Vue({
+ el,
+ provide,
+ render(h) {
+ return h(NewProjectCreationApp, { props });
+ },
+ });
+}
+
+export function initNewProjectUrlSelect() {
+ const elements = document.querySelectorAll('.js-vue-new-project-url-select');
+
+ if (!elements.length) {
+ return;
+ }
+
+ Vue.use(VueApollo);
+
+ elements.forEach(
+ (el) =>
+ new Vue({
+ el,
+ apolloProvider: new VueApollo({
+ defaultClient: createDefaultClient({}, { assumeImmutableResults: true }),
+ }),
+ provide: {
+ namespaceFullPath: el.dataset.namespaceFullPath,
+ namespaceId: el.dataset.namespaceId,
+ rootUrl: el.dataset.rootUrl,
+ trackLabel: el.dataset.trackLabel,
+ userNamespaceFullPath: el.dataset.userNamespaceFullPath,
+ userNamespaceId: el.dataset.userNamespaceId,
+ },
+ render: (createElement) => createElement(NewProjectUrlSelect),
+ }),
+ );
+}
diff --git a/app/assets/javascripts/pages/projects/new/queries/search_namespaces_where_user_can_create_projects.query.graphql b/app/assets/javascripts/projects/new/queries/search_namespaces_where_user_can_create_projects.query.graphql
index e16fe5dde49..e16fe5dde49 100644
--- a/app/assets/javascripts/pages/projects/new/queries/search_namespaces_where_user_can_create_projects.query.graphql
+++ b/app/assets/javascripts/projects/new/queries/search_namespaces_where_user_can_create_projects.query.graphql
diff --git a/app/assets/javascripts/projects/project_new.js b/app/assets/javascripts/projects/project_new.js
index ebd20583a1c..b350db0c838 100644
--- a/app/assets/javascripts/projects/project_new.js
+++ b/app/assets/javascripts/projects/project_new.js
@@ -1,5 +1,7 @@
import $ from 'jquery';
+import { debounce } from 'lodash';
import DEFAULT_PROJECT_TEMPLATES from 'ee_else_ce/projects/default_project_templates';
+import axios from '../lib/utils/axios_utils';
import {
convertToTitleCase,
humanize,
@@ -9,6 +11,23 @@ import {
let hasUserDefinedProjectPath = false;
let hasUserDefinedProjectName = false;
+const invalidInputClass = 'gl-field-error-outline';
+
+const validateImportCredentials = (url, user, password) => {
+ const endpoint = `${gon.relative_url_root}/import/url/validate`;
+ return axios
+ .post(endpoint, {
+ url,
+ user,
+ password,
+ })
+ .then(({ data }) => data)
+ .catch(() => ({
+ // intentionally reporting success in case of validation error
+ // we do not want to block users from trying import in case of validation exception
+ success: true,
+ }));
+};
const onProjectNameChange = ($projectNameInput, $projectPathInput) => {
const slug = slugify(convertUnicodeToAscii($projectNameInput.val()));
@@ -85,7 +104,10 @@ const bindHowToImport = () => {
const bindEvents = () => {
const $newProjectForm = $('#new_project');
const $projectImportUrl = $('#project_import_url');
- const $projectImportUrlWarning = $('.js-import-url-warning');
+ const $projectImportUrlUser = $('#project_import_url_user');
+ const $projectImportUrlPassword = $('#project_import_url_password');
+ const $projectImportUrlError = $('.js-import-url-error');
+ const $projectImportForm = $('.project-import form');
const $projectPath = $('.tab-pane.active #project_path');
const $useTemplateBtn = $('.template-button > input');
const $projectFieldsForm = $('.project-fields-form');
@@ -139,12 +161,15 @@ const bindEvents = () => {
$projectPath.val($projectPath.val().trim());
});
- function updateUrlPathWarningVisibility() {
- const url = $projectImportUrl.val();
- const URL_PATTERN = /(?:git|https?):\/\/.*\/.*\.git$/;
- const isUrlValid = URL_PATTERN.test(url);
- $projectImportUrlWarning.toggleClass('hide', isUrlValid);
- }
+ const updateUrlPathWarningVisibility = debounce(async () => {
+ const { success: isUrlValid } = await validateImportCredentials(
+ $projectImportUrl.val(),
+ $projectImportUrlUser.val(),
+ $projectImportUrlPassword.val(),
+ );
+ $projectImportUrl.toggleClass(invalidInputClass, !isUrlValid);
+ $projectImportUrlError.toggleClass('hide', isUrlValid);
+ }, 500);
let isProjectImportUrlDirty = false;
$projectImportUrl.on('blur', () => {
@@ -153,9 +178,22 @@ const bindEvents = () => {
});
$projectImportUrl.on('keyup', () => {
deriveProjectPathFromUrl($projectImportUrl);
- // defer error message till first input blur
- if (isProjectImportUrlDirty) {
- updateUrlPathWarningVisibility();
+ });
+
+ [$projectImportUrl, $projectImportUrlUser, $projectImportUrlPassword].forEach(($f) => {
+ $f.on('input', () => {
+ if (isProjectImportUrlDirty) {
+ updateUrlPathWarningVisibility();
+ }
+ });
+ });
+
+ $projectImportForm.on('submit', (e) => {
+ const $invalidFields = $projectImportForm.find(`.${invalidInputClass}`);
+ if ($invalidFields.length > 0) {
+ $invalidFields[0].focus();
+ e.preventDefault();
+ e.stopPropagation();
}
});
diff --git a/app/assets/javascripts/projects/settings/access_dropdown.js b/app/assets/javascripts/projects/settings/access_dropdown.js
index a5e53ee3927..7fb7a416dca 100644
--- a/app/assets/javascripts/projects/settings/access_dropdown.js
+++ b/app/assets/javascripts/projects/settings/access_dropdown.js
@@ -2,8 +2,8 @@
import { escape, find, countBy } from 'lodash';
import initDeprecatedJQueryDropdown from '~/deprecated_jquery_dropdown';
import createFlash from '~/flash';
-import axios from '~/lib/utils/axios_utils';
import { n__, s__, __, sprintf } from '~/locale';
+import { getUsers, getGroups, getDeployKeys } from './api/access_dropdown_api';
import { LEVEL_TYPES, LEVEL_ID_PROP, ACCESS_LEVELS, ACCESS_LEVEL_NONE } from './constants';
export default class AccessDropdown {
@@ -16,9 +16,6 @@ export default class AccessDropdown {
this.accessLevelsData = accessLevelsData.roles;
this.$dropdown = $dropdown;
this.$wrap = this.$dropdown.closest(`.${this.accessLevel}-container`);
- this.usersPath = '/-/autocomplete/users.json';
- this.groupsPath = '/-/autocomplete/project_groups.json';
- this.deployKeysPath = '/-/autocomplete/deploy_keys_with_owners.json';
this.defaultLabel = this.$dropdown.data('defaultLabel');
this.setSelectedItems([]);
@@ -318,9 +315,9 @@ export default class AccessDropdown {
getData(query, callback) {
if (this.hasLicense) {
Promise.all([
- this.getDeployKeys(query),
- this.getUsers(query),
- this.groupsData ? Promise.resolve(this.groupsData) : this.getGroups(),
+ getDeployKeys(query),
+ getUsers(query),
+ this.groupsData ? Promise.resolve(this.groupsData) : getGroups(),
])
.then(([deployKeysResponse, usersResponse, groupsResponse]) => {
this.groupsData = groupsResponse;
@@ -332,7 +329,7 @@ export default class AccessDropdown {
createFlash({ message: __('Failed to load groups, users and deploy keys.') });
});
} else {
- this.getDeployKeys(query)
+ getDeployKeys(query)
.then((deployKeysResponse) => callback(this.consolidateData(deployKeysResponse.data)))
.catch(() => createFlash({ message: __('Failed to load deploy keys.') }));
}
@@ -473,46 +470,6 @@ export default class AccessDropdown {
return consolidatedData;
}
- getUsers(query) {
- return axios.get(this.buildUrl(gon.relative_url_root, this.usersPath), {
- params: {
- search: query,
- per_page: 20,
- active: true,
- project_id: gon.current_project_id,
- push_code: true,
- },
- });
- }
-
- getGroups() {
- return axios.get(this.buildUrl(gon.relative_url_root, this.groupsPath), {
- params: {
- project_id: gon.current_project_id,
- },
- });
- }
-
- getDeployKeys(query) {
- return axios.get(this.buildUrl(gon.relative_url_root, this.deployKeysPath), {
- params: {
- search: query,
- per_page: 20,
- active: true,
- project_id: gon.current_project_id,
- push_code: true,
- },
- });
- }
-
- buildUrl(urlRoot, url) {
- let newUrl;
- if (urlRoot != null) {
- newUrl = urlRoot.replace(/\/$/, '') + url;
- }
- return newUrl;
- }
-
renderRow(item) {
let criteria = {};
let groupRowEl;
diff --git a/app/assets/javascripts/projects/settings/api/access_dropdown_api.js b/app/assets/javascripts/projects/settings/api/access_dropdown_api.js
new file mode 100644
index 00000000000..10f6c28a7bf
--- /dev/null
+++ b/app/assets/javascripts/projects/settings/api/access_dropdown_api.js
@@ -0,0 +1,45 @@
+import axios from '~/lib/utils/axios_utils';
+
+const USERS_PATH = '/-/autocomplete/users.json';
+const GROUPS_PATH = '/-/autocomplete/project_groups.json';
+const DEPLOY_KEYS_PATH = '/-/autocomplete/deploy_keys_with_owners.json';
+
+const buildUrl = (urlRoot, url) => {
+ let newUrl;
+ if (urlRoot != null) {
+ newUrl = urlRoot.replace(/\/$/, '') + url;
+ }
+ return newUrl;
+};
+
+export const getUsers = (query) => {
+ return axios.get(buildUrl(gon.relative_url_root || '', USERS_PATH), {
+ params: {
+ search: query,
+ per_page: 20,
+ active: true,
+ project_id: gon.current_project_id,
+ push_code: true,
+ },
+ });
+};
+
+export const getGroups = () => {
+ return axios.get(buildUrl(gon.relative_url_root || '', GROUPS_PATH), {
+ params: {
+ project_id: gon.current_project_id,
+ },
+ });
+};
+
+export const getDeployKeys = (query) => {
+ return axios.get(buildUrl(gon.relative_url_root || '', DEPLOY_KEYS_PATH), {
+ params: {
+ search: query,
+ per_page: 20,
+ active: true,
+ project_id: gon.current_project_id,
+ push_code: true,
+ },
+ });
+};
diff --git a/app/assets/javascripts/projects/settings/components/access_dropdown.vue b/app/assets/javascripts/projects/settings/components/access_dropdown.vue
new file mode 100644
index 00000000000..9823b0229a0
--- /dev/null
+++ b/app/assets/javascripts/projects/settings/components/access_dropdown.vue
@@ -0,0 +1,409 @@
+<script>
+import {
+ GlDropdown,
+ GlDropdownItem,
+ GlDropdownSectionHeader,
+ GlDropdownDivider,
+ GlSearchBoxByType,
+ GlAvatar,
+ GlSprintf,
+} from '@gitlab/ui';
+import { debounce, intersectionWith, groupBy, differenceBy, intersectionBy } from 'lodash';
+import createFlash from '~/flash';
+import { __, s__, n__ } from '~/locale';
+import { getUsers, getGroups, getDeployKeys } from '../api/access_dropdown_api';
+import { LEVEL_TYPES, ACCESS_LEVELS } from '../constants';
+
+export const i18n = {
+ selectUsers: s__('ProtectedEnvironment|Select users'),
+ rolesSectionHeader: s__('AccessDropdown|Roles'),
+ groupsSectionHeader: s__('AccessDropdown|Groups'),
+ usersSectionHeader: s__('AccessDropdown|Users'),
+ deployKeysSectionHeader: s__('AccessDropdown|Deploy Keys'),
+ ownedBy: __('Owned by %{image_tag}'),
+};
+
+export default {
+ i18n,
+ components: {
+ GlDropdown,
+ GlDropdownItem,
+ GlDropdownSectionHeader,
+ GlDropdownDivider,
+ GlSearchBoxByType,
+ GlAvatar,
+ GlSprintf,
+ },
+ props: {
+ accessLevelsData: {
+ type: Array,
+ required: true,
+ },
+ accessLevel: {
+ required: true,
+ type: String,
+ },
+ hasLicense: {
+ required: false,
+ type: Boolean,
+ default: true,
+ },
+ label: {
+ type: String,
+ required: false,
+ default: i18n.selectUsers,
+ },
+ disabled: {
+ type: Boolean,
+ required: false,
+ default: false,
+ },
+ preselectedItems: {
+ type: Array,
+ required: false,
+ default: () => [],
+ },
+ },
+ data() {
+ return {
+ loading: false,
+ initialLoading: false,
+ query: '',
+ users: [],
+ groups: [],
+ roles: [],
+ deployKeys: [],
+ selected: {
+ [LEVEL_TYPES.GROUP]: [],
+ [LEVEL_TYPES.USER]: [],
+ [LEVEL_TYPES.ROLE]: [],
+ [LEVEL_TYPES.DEPLOY_KEY]: [],
+ },
+ };
+ },
+ computed: {
+ preselected() {
+ return groupBy(this.preselectedItems, 'type');
+ },
+ showDeployKeys() {
+ return this.accessLevel === ACCESS_LEVELS.PUSH && this.deployKeys.length;
+ },
+ toggleLabel() {
+ const counts = Object.entries(this.selected).reduce((acc, [key, value]) => {
+ acc[key] = value.length;
+ return acc;
+ }, {});
+
+ const isOnlyRoleSelected =
+ counts[LEVEL_TYPES.ROLE] === 1 &&
+ [counts[LEVEL_TYPES.USER], counts[LEVEL_TYPES.GROUP], counts[LEVEL_TYPES.DEPLOY_KEY]].every(
+ (count) => count === 0,
+ );
+
+ if (isOnlyRoleSelected) {
+ return this.selected[LEVEL_TYPES.ROLE][0].text;
+ }
+
+ const labelPieces = [];
+
+ if (counts[LEVEL_TYPES.ROLE] > 0) {
+ labelPieces.push(n__('1 role', '%d roles', counts[LEVEL_TYPES.ROLE]));
+ }
+
+ if (counts[LEVEL_TYPES.USER] > 0) {
+ labelPieces.push(n__('1 user', '%d users', counts[LEVEL_TYPES.USER]));
+ }
+
+ if (counts[LEVEL_TYPES.DEPLOY_KEY] > 0) {
+ labelPieces.push(n__('1 deploy key', '%d deploy keys', counts[LEVEL_TYPES.DEPLOY_KEY]));
+ }
+
+ if (counts[LEVEL_TYPES.GROUP] > 0) {
+ labelPieces.push(n__('1 group', '%d groups', counts[LEVEL_TYPES.GROUP]));
+ }
+
+ return labelPieces.join(', ') || this.label;
+ },
+ toggleClass() {
+ return this.toggleLabel === this.label ? 'gl-text-gray-500!' : '';
+ },
+ selection() {
+ return [
+ ...this.getDataForSave(LEVEL_TYPES.ROLE, 'access_level'),
+ ...this.getDataForSave(LEVEL_TYPES.GROUP, 'group_id'),
+ ...this.getDataForSave(LEVEL_TYPES.USER, 'user_id'),
+ ...this.getDataForSave(LEVEL_TYPES.DEPLOY_KEY, 'deploy_key_id'),
+ ];
+ },
+ },
+ watch: {
+ query: debounce(function debouncedSearch() {
+ return this.getData();
+ }, 500),
+ },
+ created() {
+ this.getData({ initial: true });
+ },
+ methods: {
+ focusInput() {
+ this.$refs.search.focusInput();
+ },
+ getData({ initial = false } = {}) {
+ this.initialLoading = initial;
+ this.loading = true;
+
+ if (this.hasLicense) {
+ Promise.all([
+ getDeployKeys(this.query),
+ getUsers(this.query),
+ this.groups.length ? Promise.resolve({ data: this.groups }) : getGroups(),
+ ])
+ .then(([deployKeysResponse, usersResponse, groupsResponse]) => {
+ this.consolidateData(deployKeysResponse.data, usersResponse.data, groupsResponse.data);
+ this.setSelected({ initial });
+ })
+ .catch(() =>
+ createFlash({ message: __('Failed to load groups, users and deploy keys.') }),
+ )
+ .finally(() => {
+ this.initialLoading = false;
+ this.loading = false;
+ });
+ } else {
+ getDeployKeys(this.query)
+ .then((deployKeysResponse) => {
+ this.consolidateData(deployKeysResponse.data);
+ this.setSelected({ initial });
+ })
+ .catch(() => createFlash({ message: __('Failed to load deploy keys.') }))
+ .finally(() => {
+ this.initialLoading = false;
+ this.loading = false;
+ });
+ }
+ },
+ consolidateData(deployKeysResponse, usersResponse = [], groupsResponse = []) {
+ // This re-assignment is intentional as level.type property is being used for comparision,
+ // and accessLevelsData is provided by gon.create_access_levels which doesn't have `type` included.
+ // See this discussion https://gitlab.com/gitlab-org/gitlab/merge_requests/1629#note_31285823
+ this.roles = this.accessLevelsData.map((role) => ({ ...role, type: LEVEL_TYPES.ROLE }));
+
+ if (this.hasLicense) {
+ this.groups = groupsResponse.map((group) => ({ ...group, type: LEVEL_TYPES.GROUP }));
+ this.users = usersResponse.map(({ id, name, username, avatar_url }) => ({
+ id,
+ name,
+ username,
+ avatar_url,
+ type: LEVEL_TYPES.USER,
+ }));
+ }
+
+ this.deployKeys = deployKeysResponse.map((response) => {
+ const {
+ id,
+ fingerprint,
+ title,
+ owner: { avatar_url, name, username },
+ } = response;
+
+ const shortFingerprint = `(${fingerprint.substring(0, 14)}...)`;
+
+ return {
+ id,
+ title: title.concat(' ', shortFingerprint),
+ avatar_url,
+ fullname: name,
+ username,
+ type: LEVEL_TYPES.DEPLOY_KEY,
+ };
+ });
+ },
+ setSelected({ initial } = {}) {
+ if (initial) {
+ // as all available groups && roles are always visible in the dropdown, we set local selected by looking
+ // for intersection in all roles/groups and initial selected (returned from BE).
+ // It is different for the users - not all the users will be returned on the first data load (another set
+ // will be returned on search, only first 20 are displayed initially).
+ // That is why we set ALL initial selected users (returned from BE) as local selected (not looking
+ // for the intersection with all users data) and later if the selected happens to be in the users list
+ // we filter it out from the list so that not to have duplicates
+ // TODO: we'll need to get back to how to handle deploy keys here but they are out of scope
+ // and will be checked when migrating protected branches access dropdown to the current component
+ // related issue - https://gitlab.com/gitlab-org/gitlab/-/issues/284784
+ const selectedRoles = intersectionWith(
+ this.roles,
+ this.preselectedItems,
+ (role, selected) => {
+ return selected.type === LEVEL_TYPES.ROLE && role.id === selected.access_level;
+ },
+ );
+ this.selected[LEVEL_TYPES.ROLE] = selectedRoles;
+
+ const selectedGroups = intersectionWith(
+ this.groups,
+ this.preselectedItems,
+ (group, selected) => {
+ return selected.type === LEVEL_TYPES.GROUP && group.id === selected.group_id;
+ },
+ );
+ this.selected[LEVEL_TYPES.GROUP] = selectedGroups;
+
+ const selectedDeployKeys = intersectionWith(
+ this.deployKeys,
+ this.preselectedItems,
+ (key, selected) => {
+ return selected.type === LEVEL_TYPES.DEPLOY_KEY && key.id === selected.deploy_key_id;
+ },
+ );
+ this.selected[LEVEL_TYPES.DEPLOY_KEY] = selectedDeployKeys;
+
+ const selectedUsers = this.preselectedItems
+ .filter(({ type }) => type === LEVEL_TYPES.USER)
+ .map(({ user_id, name, username, avatar_url, type }) => ({
+ id: user_id,
+ name,
+ username,
+ avatar_url,
+ type,
+ }));
+
+ this.selected[LEVEL_TYPES.USER] = selectedUsers;
+ }
+
+ this.users = this.users.filter(
+ (user) => !this.selected[LEVEL_TYPES.USER].some((selected) => selected.id === user.id),
+ );
+ this.users.unshift(...this.selected[LEVEL_TYPES.USER]);
+ },
+ getDataForSave(accessType, key) {
+ const selected = this.selected[accessType].map(({ id }) => ({ [key]: id }));
+ const preselected = this.preselected[accessType];
+ const added = differenceBy(selected, preselected, key);
+ const preserved = intersectionBy(preselected, selected, key).map(({ id, [key]: keyId }) => ({
+ id,
+ [key]: keyId,
+ }));
+ const removed = differenceBy(preselected, selected, key).map(({ id, [key]: keyId }) => ({
+ id,
+ [key]: keyId,
+ _destroy: true,
+ }));
+ return [...added, ...removed, ...preserved];
+ },
+ onItemClick(item) {
+ this.toggleSelection(this.selected[item.type], item);
+ this.emitUpdate();
+ },
+ toggleSelection(arr, item) {
+ const itemIndex = arr.findIndex(({ id }) => id === item.id);
+ if (itemIndex > -1) {
+ arr.splice(itemIndex, 1);
+ } else arr.push(item);
+ },
+ isSelected(item) {
+ return this.selected[item.type].some((selected) => selected.id === item.id);
+ },
+ emitUpdate() {
+ this.$emit('select', this.selection);
+ },
+ onHide() {
+ this.$emit('hidden', this.selection);
+ },
+ },
+};
+</script>
+
+<template>
+ <gl-dropdown
+ :disabled="disabled || initialLoading"
+ :text="toggleLabel"
+ class="gl-min-w-20"
+ :toggle-class="toggleClass"
+ aria-labelledby="allowed-users-label"
+ @shown="focusInput"
+ @hidden="onHide"
+ >
+ <template #header>
+ <gl-search-box-by-type ref="search" v-model.trim="query" :is-loading="loading" />
+ </template>
+ <template v-if="roles.length">
+ <gl-dropdown-section-header>{{
+ $options.i18n.rolesSectionHeader
+ }}</gl-dropdown-section-header>
+ <gl-dropdown-item
+ v-for="role in roles"
+ :key="`${role.id}${role.text}`"
+ data-testid="role-dropdown-item"
+ is-check-item
+ :is-checked="isSelected(role)"
+ @click.native.capture.stop="onItemClick(role)"
+ >
+ {{ role.text }}
+ </gl-dropdown-item>
+ <gl-dropdown-divider v-if="groups.length || users.length || showDeployKeys" />
+ </template>
+
+ <template v-if="groups.length">
+ <gl-dropdown-section-header>{{
+ $options.i18n.groupsSectionHeader
+ }}</gl-dropdown-section-header>
+ <gl-dropdown-item
+ v-for="group in groups"
+ :key="`${group.id}${group.name}`"
+ fingerprint
+ data-testid="group-dropdown-item"
+ :avatar-url="group.avatar_url"
+ is-check-item
+ :is-checked="isSelected(group)"
+ @click.native.capture.stop="onItemClick(group)"
+ >
+ {{ group.name }}
+ </gl-dropdown-item>
+ <gl-dropdown-divider v-if="users.length || showDeployKeys" />
+ </template>
+
+ <template v-if="users.length">
+ <gl-dropdown-section-header>{{
+ $options.i18n.usersSectionHeader
+ }}</gl-dropdown-section-header>
+ <gl-dropdown-item
+ v-for="user in users"
+ :key="`${user.id}${user.username}`"
+ data-testid="user-dropdown-item"
+ :avatar-url="user.avatar_url"
+ :secondary-text="user.username"
+ is-check-item
+ :is-checked="isSelected(user)"
+ @click.native.capture.stop="onItemClick(user)"
+ >
+ {{ user.name }}
+ </gl-dropdown-item>
+ <gl-dropdown-divider v-if="showDeployKeys" />
+ </template>
+
+ <template v-if="showDeployKeys">
+ <gl-dropdown-section-header>{{
+ $options.i18n.deployKeysSectionHeader
+ }}</gl-dropdown-section-header>
+ <gl-dropdown-item
+ v-for="key in deployKeys"
+ :key="`${key.id}${key.fingerprint}`"
+ data-testid="deploy_key-dropdown-item"
+ is-check-item
+ :is-checked="isSelected(key)"
+ class="gl-text-truncate"
+ @click.native.capture.stop="onItemClick(key)"
+ >
+ <div class="gl-text-truncate gl-font-weight-bold">{{ key.title }}</div>
+ <div class="gl-text-gray-700 gl-text-truncate">
+ <gl-sprintf :message="$options.i18n.ownedBy">
+ <template #image_tag>
+ <gl-avatar :src="key.avatar_url" :size="24" />
+ </template> </gl-sprintf
+ >{{ key.fullname }} ({{ key.username }})
+ </div>
+ </gl-dropdown-item>
+ </template>
+ </gl-dropdown>
+</template>
diff --git a/app/assets/javascripts/projects/settings/init_access_dropdown.js b/app/assets/javascripts/projects/settings/init_access_dropdown.js
new file mode 100644
index 00000000000..11272652b63
--- /dev/null
+++ b/app/assets/javascripts/projects/settings/init_access_dropdown.js
@@ -0,0 +1,39 @@
+import * as Sentry from '@sentry/browser';
+import Vue from 'vue';
+import AccessDropdown from './components/access_dropdown.vue';
+
+export const initAccessDropdown = (el, options) => {
+ if (!el) {
+ return false;
+ }
+
+ const { accessLevelsData, accessLevel } = options;
+ const { label, disabled, preselectedItems } = el.dataset;
+ let preselected = [];
+ try {
+ preselected = JSON.parse(preselectedItems);
+ } catch (e) {
+ Sentry.captureException(e);
+ }
+
+ return new Vue({
+ el,
+ render(createElement) {
+ const vm = this;
+ return createElement(AccessDropdown, {
+ props: {
+ accessLevel,
+ accessLevelsData: accessLevelsData.roles,
+ preselectedItems: preselected,
+ label,
+ disabled,
+ },
+ on: {
+ select(selected) {
+ vm.$emit('select', selected);
+ },
+ },
+ });
+ },
+ });
+};
diff --git a/app/assets/javascripts/prometheus_alerts/components/reset_key.vue b/app/assets/javascripts/prometheus_alerts/components/reset_key.vue
index eecb3573046..befbca48736 100644
--- a/app/assets/javascripts/prometheus_alerts/components/reset_key.vue
+++ b/app/assets/javascripts/prometheus_alerts/components/reset_key.vue
@@ -1,8 +1,16 @@
<script>
-import { GlButton, GlFormGroup, GlFormInput, GlModal, GlModalDirective } from '@gitlab/ui';
+import {
+ GlButton,
+ GlFormGroup,
+ GlFormInput,
+ GlModal,
+ GlModalDirective,
+ GlSprintf,
+ GlLink,
+} from '@gitlab/ui';
import createFlash from '~/flash';
import axios from '~/lib/utils/axios_utils';
-import { __, sprintf } from '~/locale';
+import { __ } from '~/locale';
import ClipboardButton from '~/vue_shared/components/clipboard_button.vue';
export default {
@@ -13,6 +21,8 @@ export default {
GlFormInput,
GlModal,
ClipboardButton,
+ GlSprintf,
+ GlLink,
},
directives: {
'gl-modal': GlModalDirective,
@@ -44,16 +54,6 @@ export default {
data() {
return {
authorizationKey: this.initialAuthorizationKey,
- sectionDescription: sprintf(
- __(
- 'To receive alerts from manually configured Prometheus services, add the following URL and Authorization key to your Prometheus webhook config file. Learn more about %{linkStart}configuring Prometheus%{linkEnd} to send alerts to GitLab.',
- ),
- {
- linkStart: `<a href="${this.learnMoreUrl}" target="_blank" rel="noopener noreferrer">`,
- linkEnd: '</a>',
- },
- false,
- ),
};
},
methods: {
@@ -84,7 +84,17 @@ export default {
</p>
</div>
<div class="col-lg-9">
- <p v-html="sectionDescription /* eslint-disable-line vue/no-v-html */"></p>
+ <gl-sprintf
+ :message="
+ __(
+ 'To receive alerts from manually configured Prometheus services, add the following URL and Authorization key to your Prometheus webhook config file. Learn more about %{linkStart}configuring Prometheus%{linkEnd} to send alerts to GitLab.',
+ )
+ "
+ >
+ <template #link="{ content }">
+ <gl-link :href="learnMoreUrl" target="_blank">{{ content }}</gl-link>
+ </template>
+ </gl-sprintf>
<gl-form-group :label="__('URL')" label-for="notify-url" label-class="label-bold">
<div class="input-group">
<gl-form-input id="notify-url" :readonly="true" :value="notifyUrl" />
diff --git a/app/assets/javascripts/registry/explorer/components/details_page/tags_list_row.vue b/app/assets/javascripts/registry/explorer/components/details_page/tags_list_row.vue
index 45eb2ce51e4..0556fd298aa 100644
--- a/app/assets/javascripts/registry/explorer/components/details_page/tags_list_row.vue
+++ b/app/assets/javascripts/registry/explorer/components/details_page/tags_list_row.vue
@@ -1,5 +1,12 @@
<script>
-import { GlFormCheckbox, GlTooltipDirective, GlSprintf, GlIcon } from '@gitlab/ui';
+import {
+ GlFormCheckbox,
+ GlTooltipDirective,
+ GlSprintf,
+ GlIcon,
+ GlDropdown,
+ GlDropdownItem,
+} from '@gitlab/ui';
import { formatDate } from '~/lib/utils/datetime_utility';
import { numberToHumanSize } from '~/lib/utils/number_utils';
import { n__ } from '~/locale';
@@ -11,22 +18,22 @@ import {
REMOVE_TAG_BUTTON_TITLE,
DIGEST_LABEL,
CREATED_AT_LABEL,
- REMOVE_TAG_BUTTON_DISABLE_TOOLTIP,
PUBLISHED_DETAILS_ROW_TEXT,
MANIFEST_DETAILS_ROW_TEST,
CONFIGURATION_DETAILS_ROW_TEST,
MISSING_MANIFEST_WARNING_TOOLTIP,
NOT_AVAILABLE_TEXT,
NOT_AVAILABLE_SIZE,
+ MORE_ACTIONS_TEXT,
} from '../../constants/index';
-import DeleteButton from '../delete_button.vue';
export default {
components: {
GlSprintf,
GlFormCheckbox,
GlIcon,
- DeleteButton,
+ GlDropdown,
+ GlDropdownItem,
ListItem,
ClipboardButton,
TimeAgoTooltip,
@@ -60,11 +67,11 @@ export default {
REMOVE_TAG_BUTTON_TITLE,
DIGEST_LABEL,
CREATED_AT_LABEL,
- REMOVE_TAG_BUTTON_DISABLE_TOOLTIP,
PUBLISHED_DETAILS_ROW_TEXT,
MANIFEST_DETAILS_ROW_TEST,
CONFIGURATION_DETAILS_ROW_TEST,
MISSING_MANIFEST_WARNING_TOOLTIP,
+ MORE_ACTIONS_TEXT,
},
computed: {
formattedSize() {
@@ -173,15 +180,27 @@ export default {
</span>
</template>
<template #right-action>
- <delete-button
+ <gl-dropdown
:disabled="isDeleteDisabled"
- :title="$options.i18n.REMOVE_TAG_BUTTON_TITLE"
- :tooltip-title="$options.i18n.REMOVE_TAG_BUTTON_DISABLE_TOOLTIP"
- :tooltip-disabled="tag.canDelete"
- data-qa-selector="tag_delete_button"
- data-testid="single-delete-button"
- @delete="$emit('delete')"
- />
+ icon="ellipsis_v"
+ :text="$options.i18n.MORE_ACTIONS_TEXT"
+ :text-sr-only="true"
+ category="tertiary"
+ no-caret
+ right
+ :class="{ 'gl-opacity-0 gl-pointer-events-none': isDeleteDisabled }"
+ data-testid="additional-actions"
+ data-qa-selector="more_actions_menu"
+ >
+ <gl-dropdown-item
+ variant="danger"
+ data-testid="single-delete-button"
+ data-qa-selector="tag_delete_button"
+ @click="$emit('delete')"
+ >
+ {{ $options.i18n.REMOVE_TAG_BUTTON_TITLE }}
+ </gl-dropdown-item>
+ </gl-dropdown>
</template>
<template v-if="!isInvalidTag" #details-published>
diff --git a/app/assets/javascripts/registry/explorer/constants/common.js b/app/assets/javascripts/registry/explorer/constants/common.js
index dc71ef8450b..f7beec2c935 100644
--- a/app/assets/javascripts/registry/explorer/constants/common.js
+++ b/app/assets/javascripts/registry/explorer/constants/common.js
@@ -1,3 +1,4 @@
-import { s__ } from '~/locale';
+import { s__, __ } from '~/locale';
export const ROOT_IMAGE_TEXT = s__('ContainerRegistry|Root image');
+export const MORE_ACTIONS_TEXT = __('More actions');
diff --git a/app/assets/javascripts/registry/explorer/constants/details.js b/app/assets/javascripts/registry/explorer/constants/details.js
index 0836260b71e..19e1a75fb2f 100644
--- a/app/assets/javascripts/registry/explorer/constants/details.js
+++ b/app/assets/javascripts/registry/explorer/constants/details.js
@@ -30,7 +30,7 @@ export const CONFIGURATION_DETAILS_ROW_TEST = s__(
'ContainerRegistry|Configuration digest: %{digest}',
);
-export const REMOVE_TAG_BUTTON_TITLE = s__('ContainerRegistry|Remove tag');
+export const REMOVE_TAG_BUTTON_TITLE = s__('ContainerRegistry|Delete tag');
export const REMOVE_TAGS_BUTTON_TITLE = s__('ContainerRegistry|Delete selected tags');
export const REMOVE_TAG_CONFIRMATION_TEXT = s__(
@@ -61,10 +61,6 @@ export const ADMIN_GARBAGE_COLLECTION_TIP = s__(
'ContainerRegistry|Remember to run %{docLinkStart}garbage collection%{docLinkEnd} to remove the stale data from storage.',
);
-export const REMOVE_TAG_BUTTON_DISABLE_TOOLTIP = s__(
- 'ContainerRegistry|Deletion disabled due to missing or insufficient permissions.',
-);
-
export const MISSING_MANIFEST_WARNING_TOOLTIP = s__(
'ContainerRegistry|Invalid tag: missing manifest digest',
);
diff --git a/app/assets/javascripts/registry/explorer/constants/list.js b/app/assets/javascripts/registry/explorer/constants/list.js
index f59b9d7a9f5..d21a154d1b8 100644
--- a/app/assets/javascripts/registry/explorer/constants/list.js
+++ b/app/assets/javascripts/registry/explorer/constants/list.js
@@ -5,7 +5,7 @@ import { s__, __ } from '~/locale';
export const CONTAINER_REGISTRY_TITLE = s__('ContainerRegistry|Container Registry');
export const CONNECTION_ERROR_TITLE = s__('ContainerRegistry|Docker connection error');
export const CONNECTION_ERROR_MESSAGE = s__(
- `ContainerRegistry|We are having trouble connecting to the Registry, which could be due to an issue with your project name or path. %{docLinkStart}More information%{docLinkEnd}`,
+ `ContainerRegistry|We are having trouble connecting to the Container Registry. Please try refreshing the page. If this error persists, please review %{docLinkStart}the troubleshooting documentation%{docLinkEnd}.`,
);
export const LIST_INTRO_TEXT = s__(
`ContainerRegistry|With the GitLab Container Registry, every project can have its own space to store images. %{docLinkStart}More information%{docLinkEnd}`,
diff --git a/app/assets/javascripts/registry/explorer/index.js b/app/assets/javascripts/registry/explorer/index.js
index 1f82fd7f238..246a6768593 100644
--- a/app/assets/javascripts/registry/explorer/index.js
+++ b/app/assets/javascripts/registry/explorer/index.js
@@ -36,6 +36,8 @@ export default () => {
isAdmin,
showCleanupPolicyOnAlert,
showUnfinishedTagCleanupCallout,
+ connectionError,
+ invalidPathError,
...config
} = el.dataset;
@@ -67,6 +69,8 @@ export default () => {
isAdmin: parseBoolean(isAdmin),
showCleanupPolicyOnAlert: parseBoolean(showCleanupPolicyOnAlert),
showUnfinishedTagCleanupCallout: parseBoolean(showUnfinishedTagCleanupCallout),
+ connectionError: parseBoolean(connectionError),
+ invalidPathError: parseBoolean(invalidPathError),
},
/* eslint-disable @gitlab/require-i18n-strings */
dockerBuildCommand: `docker build -t ${config.repositoryUrl} .`,
diff --git a/app/assets/javascripts/registry/explorer/pages/list.vue b/app/assets/javascripts/registry/explorer/pages/list.vue
index 3c8790fa6e5..73b957f42f2 100644
--- a/app/assets/javascripts/registry/explorer/pages/list.vue
+++ b/app/assets/javascripts/registry/explorer/pages/list.vue
@@ -171,6 +171,9 @@ export default {
showDeleteAlert() {
return this.deleteAlertType && this.itemToDelete?.path;
},
+ showConnectionError() {
+ return this.config.connectionError || this.config.invalidPathError;
+ },
deleteImageAlertMessage() {
return this.deleteAlertType === 'success'
? DELETE_IMAGE_SUCCESS_MESSAGE
@@ -292,7 +295,7 @@ export default {
/>
<gl-empty-state
- v-if="config.characterError"
+ v-if="showConnectionError"
:title="$options.i18n.CONNECTION_ERROR_TITLE"
:svg-path="config.containersErrorImage"
>
diff --git a/app/assets/javascripts/related_issues/components/add_issuable_form.vue b/app/assets/javascripts/related_issues/components/add_issuable_form.vue
index 02929062cee..f936c03c5d3 100644
--- a/app/assets/javascripts/related_issues/components/add_issuable_form.vue
+++ b/app/assets/javascripts/related_issues/components/add_issuable_form.vue
@@ -74,6 +74,16 @@ export default {
required: false,
default: false,
},
+ autoCompleteEpics: {
+ type: Boolean,
+ required: false,
+ default: true,
+ },
+ autoCompleteIssues: {
+ type: Boolean,
+ required: false,
+ default: true,
+ },
},
data() {
return {
@@ -177,7 +187,7 @@ export default {
:path-id-separator="pathIdSeparator"
:input-value="inputValue"
:auto-complete-sources="transformedAutocompleteSources"
- :auto-complete-options="{ issues: true, epics: true }"
+ :auto-complete-options="{ issues: autoCompleteIssues, epics: autoCompleteEpics }"
:issuable-type="issuableType"
@pendingIssuableRemoveRequest="onPendingIssuableRemoveRequest"
@formCancel="onFormCancel"
@@ -187,15 +197,15 @@ export default {
<p v-if="hasError" class="gl-field-error">
{{ addRelatedErrorMessage }}
</p>
- <div class="add-issuable-form-actions clearfix">
+ <div class="gl-mt-5 gl-clearfix">
<gl-button
ref="addButton"
category="primary"
- variant="success"
+ variant="confirm"
:disabled="isSubmitButtonDisabled"
:loading="isSubmitting"
type="submit"
- class="js-add-issuable-form-add-button float-left"
+ class="float-left"
data-qa-selector="add_issue_button"
>
{{ __('Add') }}
diff --git a/app/assets/javascripts/related_issues/components/issue_token.vue b/app/assets/javascripts/related_issues/components/issue_token.vue
index 9665ed173b9..abbd612d3ec 100644
--- a/app/assets/javascripts/related_issues/components/issue_token.vue
+++ b/app/assets/javascripts/related_issues/components/issue_token.vue
@@ -48,7 +48,7 @@ export default {
<template>
<div
:class="{
- 'issue-token': isCondensed,
+ 'issue-token gl-display-inline-flex gl-align-items-stretch gl-max-w-full gl-line-height-24 gl-white-space-nowrap': isCondensed,
'flex-row issuable-info-container': !isCondensed,
}"
>
@@ -57,7 +57,7 @@ export default {
ref="link"
v-gl-tooltip
:class="{
- 'issue-token-link': isCondensed,
+ 'issue-token-link gl-display-inline-flex gl-min-w-0 gl-text-gray-500': isCondensed,
'issuable-main-info': !isCondensed,
}"
:href="computedPath"
@@ -69,19 +69,19 @@ export default {
v-if="hasTitle"
ref="title"
:class="{
- 'issue-token-title issue-token-end': isCondensed,
+ 'issue-token-title issue-token-end gl-overflow-hidden gl-display-flex gl-align-items-baseline gl-text-gray-500 gl-pl-3': isCondensed,
'issue-title block-truncated': !isCondensed,
- 'issue-token-title-standalone': !canRemove,
+ 'gl-rounded-top-right-small gl-rounded-bottom-right-small gl-pr-3': !canRemove,
}"
class="js-issue-token-title"
>
- <span class="issue-token-title-text">{{ title }}</span>
+ <span class="gl-text-truncate">{{ title }}</span>
</component>
<component
:is="innerComponentType"
ref="reference"
:class="{
- 'issue-token-reference': isCondensed,
+ 'issue-token-reference gl-display-flex gl-align-items-center gl-rounded-top-left-small gl-rounded-bottom-left-small gl-px-3': isCondensed,
'issuable-info': !isCondensed,
}"
>
@@ -103,7 +103,7 @@ export default {
ref="removeButton"
v-gl-tooltip
:class="{
- 'issue-token-remove-button': isCondensed,
+ 'issue-token-remove-button gl-display-flex gl-align-items-center gl-px-3 gl-border-0 gl-rounded-top-right-small gl-rounded-bottom-right-small gl-text-gray-500': isCondensed,
'btn btn-default': !isCondensed,
}"
:title="removeButtonLabel"
@@ -111,7 +111,6 @@ export default {
:disabled="removeDisabled"
data-testid="removeBtn"
type="button"
- class="js-issue-token-remove-button"
@click="onRemoveRequest"
>
<gl-icon name="close" />
diff --git a/app/assets/javascripts/related_issues/components/related_issuable_input.vue b/app/assets/javascripts/related_issues/components/related_issuable_input.vue
index 46b97370d66..270d4632a54 100644
--- a/app/assets/javascripts/related_issues/components/related_issuable_input.vue
+++ b/app/assets/javascripts/related_issues/components/related_issuable_input.vue
@@ -107,9 +107,6 @@ export default {
onAutoCompleteToggled(isOpen) {
this.isAutoCompleteOpen = isOpen;
},
- onInputWrapperClick() {
- this.$refs.input.focus();
- },
onInput() {
const { value } = this.$refs.input;
const caretPos = this.$refs.input.selectionStart;
@@ -185,26 +182,23 @@ export default {
<div
ref="issuableFormWrapper"
:class="{ focus: isInputFocused }"
- class="add-issuable-form-input-wrapper form-control gl-field-error-outline"
+ class="add-issuable-form-input-wrapper form-control gl-field-error-outline gl-h-auto gl-p-3 gl-pb-2"
role="button"
@click="onIssuableFormWrapperClick"
>
- <ul class="add-issuable-form-input-token-list">
- <!--
- We need to ensure this key changes any time the pendingReferences array is updated
- else two consecutive pending ref strings in an array with the same name will collide
- and cause odd behavior when one is removed.
- -->
+ <ul
+ class="gl-display-flex gl-flex-wrap gl-align-items-baseline gl-list-style-none gl-m-0 gl-p-0"
+ >
<li
v-for="(reference, index) in references"
- :key="`related-issues-token-${reference}`"
- class="js-add-issuable-form-token-list-item add-issuable-form-token-list-item"
+ :key="reference"
+ class="gl-max-w-full gl-mb-2 gl-mr-2"
>
<issue-token
:id-key="index"
:display-reference="reference.text || reference"
- :can-remove="true"
- :is-condensed="true"
+ can-remove
+ is-condensed
:path-id-separator="pathIdSeparator"
event-namespace="pendingIssuable"
@pendingIssuableRemoveRequest="
@@ -214,14 +208,15 @@ export default {
"
/>
</li>
- <li class="add-issuable-form-input-list-item">
+ <li class="gl-mb-2 gl-flex-grow-1">
<input
:id="inputId"
ref="input"
:value="inputValue"
:placeholder="inputPlaceholder"
+ :aria-label="inputPlaceholder"
type="text"
- class="js-add-issuable-form-input add-issuable-form-input"
+ class="gl-w-full gl-border-none gl-outline-0"
data-qa-selector="add_issue_field"
autocomplete="off"
@input="onInput"
diff --git a/app/assets/javascripts/related_issues/components/related_issues_block.vue b/app/assets/javascripts/related_issues/components/related_issues_block.vue
index c042f0eef5f..94535e1b8c9 100644
--- a/app/assets/javascripts/related_issues/components/related_issues_block.vue
+++ b/app/assets/javascripts/related_issues/components/related_issues_block.vue
@@ -123,7 +123,7 @@ export default {
</script>
<template>
- <div id="related-issues" class="related-issues-block">
+ <div id="related-issues" class="related-issues-block gl-mt-5">
<div class="card card-slim gl-overflow-hidden">
<div
:class="{ 'panel-empty-heading border-bottom-0': !hasBody }"
@@ -162,7 +162,6 @@ export default {
icon="plus"
:aria-label="__('Add a related issue')"
:class="qaClass"
- class="js-issue-count-badge-add-button"
@click="$emit('toggleAddRelatedIssuesForm', $event)"
/>
</div>
diff --git a/app/assets/javascripts/related_issues/components/related_issues_list.vue b/app/assets/javascripts/related_issues/components/related_issues_list.vue
index 8f486fb1b07..a21e294a34a 100644
--- a/app/assets/javascripts/related_issues/components/related_issues_list.vue
+++ b/app/assets/javascripts/related_issues/components/related_issues_list.vue
@@ -97,11 +97,7 @@ export default {
class="related-issues-token-body bordered-box bg-white"
:class="{ 'sortable-container': canReorder }"
>
- <div
- v-if="isFetching"
- class="related-issues-loading-icon"
- data-qa-selector="related_issues_loading_placeholder"
- >
+ <div v-if="isFetching" class="gl-mb-2" data-qa-selector="related_issues_loading_placeholder">
<gl-loading-icon
ref="loadingIcon"
size="sm"
diff --git a/app/assets/javascripts/related_merge_requests/components/related_merge_requests.vue b/app/assets/javascripts/related_merge_requests/components/related_merge_requests.vue
index 6fb1d1ed365..05858c7469d 100644
--- a/app/assets/javascripts/related_merge_requests/components/related_merge_requests.vue
+++ b/app/assets/javascripts/related_merge_requests/components/related_merge_requests.vue
@@ -81,13 +81,13 @@ export default {
{{ __('Related merge requests') }}
</span>
<div v-if="totalCount" class="d-inline-flex lh-100 align-middle">
- <div class="mr-count-badge gl-display-inline-flex">
- <div class="mr-count-badge-count">
- <svg class="s16 mr-1 text-secondary">
- <gl-icon name="merge-request" class="mr-1 text-secondary" />
- </svg>
- <span class="js-items-count">{{ totalCount }}</span>
- </div>
+ <div
+ class="mr-count-badge gl-display-inline-flex gl-align-items-center gl-py-2 gl-px-3"
+ >
+ <svg class="s16 mr-1 text-secondary">
+ <gl-icon name="merge-request" class="mr-1 text-secondary" />
+ </svg>
+ <span class="js-items-count">{{ totalCount }}</span>
</div>
</div>
</div>
diff --git a/app/assets/javascripts/releases/components/release_block.vue b/app/assets/javascripts/releases/components/release_block.vue
index 3201ca1f443..b2bd405574f 100644
--- a/app/assets/javascripts/releases/components/release_block.vue
+++ b/app/assets/javascripts/releases/components/release_block.vue
@@ -1,4 +1,5 @@
<script>
+import { GlSafeHtmlDirective as SafeHtml } from '@gitlab/ui';
import $ from 'jquery';
import { isEmpty } from 'lodash';
import { scrollToElement } from '~/lib/utils/common_utils';
@@ -21,6 +22,9 @@ export default {
ReleaseBlockHeader,
ReleaseBlockMilestoneInfo,
},
+ directives: {
+ SafeHtml,
+ },
mixins: [glFeatureFlagsMixin()],
props: {
release: {
@@ -79,6 +83,7 @@ export default {
$(this.$refs['gfm-content']).renderGFM();
},
},
+ safeHtmlConfig: { ADD_TAGS: ['gl-emoji'] },
};
</script>
<template>
@@ -102,10 +107,7 @@ export default {
<evidence-block v-if="hasEvidence" :release="release" />
<div ref="gfm-content" class="card-text gl-mt-3">
- <div
- class="md"
- v-html="release.descriptionHtml /* eslint-disable-line vue/no-v-html */"
- ></div>
+ <div v-safe-html:[$options.safeHtmlConfig]="release.descriptionHtml" class="md"></div>
</div>
</div>
diff --git a/app/assets/javascripts/releases/mount_show.js b/app/assets/javascripts/releases/mount_show.js
index 7272880197a..686f9e294b7 100644
--- a/app/assets/javascripts/releases/mount_show.js
+++ b/app/assets/javascripts/releases/mount_show.js
@@ -6,7 +6,12 @@ import ReleaseShowApp from './components/app_show.vue';
Vue.use(VueApollo);
const apolloProvider = new VueApollo({
- defaultClient: createDefaultClient(),
+ defaultClient: createDefaultClient(
+ {},
+ {
+ assumeImmutableResults: true,
+ },
+ ),
});
export default () => {
diff --git a/app/assets/javascripts/reports/codequality_report/components/codequality_issue_body.vue b/app/assets/javascripts/reports/codequality_report/components/codequality_issue_body.vue
index 736c8668a34..59bd54eab60 100644
--- a/app/assets/javascripts/reports/codequality_report/components/codequality_issue_body.vue
+++ b/app/assets/javascripts/reports/codequality_report/components/codequality_issue_body.vue
@@ -33,17 +33,20 @@ export default {
issueName() {
return `${this.severityLabel} - ${this.issue.name}`;
},
+ issueSeverity() {
+ return this.issue.severity.toLowerCase();
+ },
isStatusSuccess() {
return this.status === STATUS_SUCCESS;
},
severityClass() {
- return SEVERITY_CLASSES[this.issue.severity] || SEVERITY_CLASSES.unknown;
+ return SEVERITY_CLASSES[this.issueSeverity] || SEVERITY_CLASSES.unknown;
},
severityIcon() {
- return SEVERITY_ICONS[this.issue.severity] || SEVERITY_ICONS.unknown;
+ return SEVERITY_ICONS[this.issueSeverity] || SEVERITY_ICONS.unknown;
},
severityLabel() {
- return this.$options.severityText[this.issue.severity] || this.$options.severityText.unknown;
+ return this.$options.severityText[this.issueSeverity] || this.$options.severityText.unknown;
},
},
severityText: {
diff --git a/app/assets/javascripts/reports/codequality_report/grouped_codequality_reports_app.vue b/app/assets/javascripts/reports/codequality_report/grouped_codequality_reports_app.vue
index 0e18d0992cd..599e8d35708 100644
--- a/app/assets/javascripts/reports/codequality_report/grouped_codequality_reports_app.vue
+++ b/app/assets/javascripts/reports/codequality_report/grouped_codequality_reports_app.vue
@@ -55,10 +55,12 @@ export default {
...mapActions(['fetchReports', 'setPaths']),
},
loadingText: sprintf(s__('ciReport|Loading %{reportName} report'), {
- reportName: 'codeclimate',
+ // eslint-disable-next-line @gitlab/require-i18n-strings
+ reportName: 'Code quality',
}),
errorText: sprintf(s__('ciReport|Failed to load %{reportName} report'), {
- reportName: 'codeclimate',
+ // eslint-disable-next-line @gitlab/require-i18n-strings
+ reportName: 'Code quality',
}),
};
</script>
diff --git a/app/assets/javascripts/reports/codequality_report/store/getters.js b/app/assets/javascripts/reports/codequality_report/store/getters.js
index 3fb8c5be351..4712f8cbefe 100644
--- a/app/assets/javascripts/reports/codequality_report/store/getters.js
+++ b/app/assets/javascripts/reports/codequality_report/store/getters.js
@@ -1,5 +1,5 @@
import { spriteIcon } from '~/lib/utils/common_utils';
-import { sprintf, __, s__, n__ } from '~/locale';
+import { sprintf, s__ } from '~/locale';
import { LOADING, ERROR, SUCCESS, STATUS_NOT_FOUND } from '../../constants';
export const hasCodequalityIssues = (state) =>
@@ -18,27 +18,23 @@ export const codequalityStatus = (state) => {
export const codequalityText = (state) => {
const { newIssues, resolvedIssues } = state;
- const text = [];
-
+ let text;
if (!newIssues.length && !resolvedIssues.length) {
- text.push(s__('ciReport|No changes to code quality'));
- } else {
- text.push(s__('ciReport|Code quality'));
-
- if (resolvedIssues.length) {
- text.push(n__(' improved on %d point', ' improved on %d points', resolvedIssues.length));
- }
-
- if (newIssues.length && resolvedIssues.length) {
- text.push(__(' and'));
- }
-
- if (newIssues.length) {
- text.push(n__(' degraded on %d point', ' degraded on %d points', newIssues.length));
- }
+ text = s__('ciReport|No changes to code quality');
+ } else if (newIssues.length && resolvedIssues.length) {
+ text = sprintf(
+ s__(`ciReport|Code quality scanning detected %{issueCount} changes in merged results`),
+ {
+ issueCount: newIssues.length + resolvedIssues.length,
+ },
+ );
+ } else if (resolvedIssues.length) {
+ text = s__(`ciReport|Code quality improved`);
+ } else if (newIssues.length) {
+ text = s__(`ciReport|Code quality degraded`);
}
- return text.join('');
+ return text;
};
export const codequalityPopover = (state) => {
diff --git a/app/assets/javascripts/reports/codequality_report/store/utils/codequality_parser.js b/app/assets/javascripts/reports/codequality_report/store/utils/codequality_parser.js
index a794f5f0577..417297df43c 100644
--- a/app/assets/javascripts/reports/codequality_report/store/utils/codequality_parser.js
+++ b/app/assets/javascripts/reports/codequality_report/store/utils/codequality_parser.js
@@ -1,14 +1,16 @@
-export const parseCodeclimateMetrics = (issues = [], path = '') => {
+export const parseCodeclimateMetrics = (issues = [], blobPath = '') => {
return issues.map((issue) => {
+ // the `file_path` attribute from the artifact is returned as `file` by GraphQL
+ const issuePath = issue.file_path || issue.path;
const parsedIssue = {
name: issue.description,
- path: issue.file_path,
- urlPath: `${path}/${issue.file_path}#L${issue.line}`,
+ path: issuePath,
+ urlPath: `${blobPath}/${issuePath}#L${issue.line}`,
...issue,
};
if (issue?.location?.path) {
- let parseCodeQualityUrl = `${path}/${issue.location.path}`;
+ let parseCodeQualityUrl = `${blobPath}/${issue.location.path}`;
parsedIssue.path = issue.location.path;
if (issue?.location?.lines?.begin) {
diff --git a/app/assets/javascripts/reports/grouped_test_report/grouped_test_reports_app.vue b/app/assets/javascripts/reports/grouped_test_report/grouped_test_reports_app.vue
index 82806793401..be49a03a9a5 100644
--- a/app/assets/javascripts/reports/grouped_test_report/grouped_test_reports_app.vue
+++ b/app/assets/javascripts/reports/grouped_test_report/grouped_test_reports_app.vue
@@ -3,7 +3,6 @@ import { GlButton, GlIcon } from '@gitlab/ui';
import { mapActions, mapGetters, mapState } from 'vuex';
import api from '~/api';
import { sprintf, s__ } from '~/locale';
-import glFeatureFlagsMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
import GroupedIssuesList from '../components/grouped_issues_list.vue';
import { componentNames } from '../components/issue_body';
import ReportSection from '../components/report_section.vue';
@@ -28,7 +27,6 @@ export default {
GlButton,
GlIcon,
},
- mixins: [glFeatureFlagsMixin()],
props: {
endpoint: {
type: String,
@@ -82,9 +80,7 @@ export default {
methods: {
...mapActions(['setPaths', 'fetchReports', 'closeModal']),
handleToggleEvent() {
- if (this.glFeatures.usageDataITestingSummaryWidgetTotal) {
- api.trackRedisHllUserEvent(this.$options.expandEvent);
- }
+ api.trackRedisHllUserEvent(this.$options.expandEvent);
},
reportText(report) {
const { name, summary } = report || {};
diff --git a/app/assets/javascripts/repository/commits_service.js b/app/assets/javascripts/repository/commits_service.js
new file mode 100644
index 00000000000..504efaea8cc
--- /dev/null
+++ b/app/assets/javascripts/repository/commits_service.js
@@ -0,0 +1,65 @@
+import axios from '~/lib/utils/axios_utils';
+import { joinPaths } from '~/lib/utils/url_utility';
+import { normalizeData } from 'ee_else_ce/repository/utils/commit';
+import createFlash from '~/flash';
+import { COMMIT_BATCH_SIZE, I18N_COMMIT_DATA_FETCH_ERROR } from './constants';
+
+let requestedOffsets = [];
+let fetchedBatches = [];
+
+export const isRequested = (offset) => requestedOffsets.includes(offset);
+
+export const resetRequestedCommits = () => {
+ requestedOffsets = [];
+ fetchedBatches = [];
+};
+
+const addRequestedOffset = (offset) => {
+ if (isRequested(offset) || offset < 0) {
+ return;
+ }
+
+ requestedOffsets.push(offset);
+};
+
+const removeLeadingSlash = (path) => path.replace(/^\//, '');
+
+const fetchData = (projectPath, path, ref, offset) => {
+ if (fetchedBatches.includes(offset) || offset < 0) {
+ return [];
+ }
+
+ fetchedBatches.push(offset);
+
+ const url = joinPaths(
+ gon.relative_url_root || '/',
+ projectPath,
+ '/-/refs/',
+ ref,
+ '/logs_tree/',
+ encodeURIComponent(removeLeadingSlash(path)),
+ );
+
+ return axios
+ .get(url, { params: { format: 'json', offset } })
+ .then(({ data }) => normalizeData(data, path))
+ .catch(() => createFlash({ message: I18N_COMMIT_DATA_FETCH_ERROR }));
+};
+
+export const loadCommits = async (projectPath, path, ref, offset) => {
+ if (isRequested(offset)) {
+ return [];
+ }
+
+ // We fetch in batches of 25, so this ensures we don't refetch
+ Array.from(Array(COMMIT_BATCH_SIZE)).forEach((_, i) => {
+ addRequestedOffset(offset - i);
+ addRequestedOffset(offset + i);
+ });
+
+ // Since a user could scroll either up or down, we want to support lazy loading in both directions
+ const commitsBatchUp = await fetchData(projectPath, path, ref, offset - COMMIT_BATCH_SIZE);
+ const commitsBatchDown = await fetchData(projectPath, path, ref, offset);
+
+ return commitsBatchUp.concat(commitsBatchDown);
+};
diff --git a/app/assets/javascripts/repository/components/blob_content_viewer.vue b/app/assets/javascripts/repository/components/blob_content_viewer.vue
index 1d79818cbe8..7ad9fb56972 100644
--- a/app/assets/javascripts/repository/components/blob_content_viewer.vue
+++ b/app/assets/javascripts/repository/components/blob_content_viewer.vue
@@ -8,10 +8,12 @@ import createFlash from '~/flash';
import axios from '~/lib/utils/axios_utils';
import { isLoggedIn } from '~/lib/utils/common_utils';
import { __ } from '~/locale';
+import { redirectTo } from '~/lib/utils/url_utility';
import getRefMixin from '../mixins/get_ref';
import blobInfoQuery from '../queries/blob_info.query.graphql';
import BlobButtonGroup from './blob_button_group.vue';
import BlobEdit from './blob_edit.vue';
+import ForkSuggestion from './fork_suggestion.vue';
import { loadViewer, viewerProps } from './blob_viewers';
export default {
@@ -21,6 +23,7 @@ export default {
BlobButtonGroup,
BlobContent,
GlLoadingIcon,
+ ForkSuggestion,
},
mixins: [getRefMixin],
inject: {
@@ -42,9 +45,6 @@ export default {
this.switchViewer(
this.hasRichViewer && !window.location.hash ? RICH_BLOB_VIEWER : SIMPLE_BLOB_VIEWER,
);
- if (this.hasRichViewer && !this.blobViewer) {
- this.loadLegacyViewer();
- }
},
error() {
this.displayError();
@@ -68,7 +68,9 @@ export default {
},
data() {
return {
+ forkTarget: null,
legacyRichViewer: null,
+ legacySimpleViewer: null,
isBinary: false,
isLoadingLegacyViewer: false,
activeViewerType: SIMPLE_BLOB_VIEWER,
@@ -76,6 +78,8 @@ export default {
userPermissions: {
pushCode: false,
downloadCode: false,
+ createMergeRequestIn: false,
+ forkProject: false,
},
pathLocks: {
nodes: [],
@@ -94,12 +98,14 @@ export default {
path: '',
editBlobPath: '',
ideEditPath: '',
+ forkAndEditPath: '',
+ ideForkAndEditPath: '',
storedExternally: false,
+ canModifyBlob: false,
rawPath: '',
externalStorageUrl: '',
replacePath: '',
deletePath: '',
- forkPath: '',
simpleViewer: {},
richViewer: null,
webPath: '',
@@ -115,7 +121,7 @@ export default {
return isLoggedIn();
},
isLoading() {
- return this.$apollo.queries.project.loading || this.isLoadingLegacyViewer;
+ return this.$apollo.queries.project.loading;
},
isBinaryFileType() {
return this.isBinary || this.blobInfo.simpleViewer?.fileType !== 'text';
@@ -151,24 +157,66 @@ export default {
isLocked() {
return this.project.pathLocks.nodes.some((node) => node.path === this.path);
},
+ showForkSuggestion() {
+ const { createMergeRequestIn, forkProject } = this.project.userPermissions;
+ const { canModifyBlob } = this.blobInfo;
+
+ return this.isLoggedIn && !canModifyBlob && createMergeRequestIn && forkProject;
+ },
+ forkPath() {
+ return this.forkTarget === 'ide'
+ ? this.blobInfo.ideForkAndEditPath
+ : this.blobInfo.forkAndEditPath;
+ },
},
methods: {
- loadLegacyViewer() {
+ loadLegacyViewer(type) {
+ if (this.legacyViewerLoaded(type)) {
+ return;
+ }
+
this.isLoadingLegacyViewer = true;
axios
- .get(`${this.blobInfo.webPath}?format=json&viewer=rich`)
+ .get(`${this.blobInfo.webPath}?format=json&viewer=${type}`)
.then(({ data: { html, binary } }) => {
- this.legacyRichViewer = html;
+ if (type === 'simple') {
+ this.legacySimpleViewer = html;
+ } else {
+ this.legacyRichViewer = html;
+ }
+
this.isBinary = binary;
this.isLoadingLegacyViewer = false;
})
.catch(() => this.displayError());
},
+ legacyViewerLoaded(type) {
+ return (
+ (type === SIMPLE_BLOB_VIEWER && this.legacySimpleViewer) ||
+ (type === RICH_BLOB_VIEWER && this.legacyRichViewer)
+ );
+ },
displayError() {
createFlash({ message: __('An error occurred while loading the file. Please try again.') });
},
switchViewer(newViewer) {
this.activeViewerType = newViewer || SIMPLE_BLOB_VIEWER;
+
+ if (!this.blobViewer) {
+ this.loadLegacyViewer(this.activeViewerType);
+ }
+ },
+ editBlob(target) {
+ if (this.showForkSuggestion) {
+ this.setForkTarget(target);
+ return;
+ }
+
+ const { ideEditPath, editBlobPath } = this.blobInfo;
+ redirectTo(target === 'ide' ? ideEditPath : editBlobPath);
+ },
+ setForkTarget(target) {
+ this.forkTarget = target;
},
},
};
@@ -191,6 +239,8 @@ export default {
:show-edit-button="!isBinaryFileType"
:edit-path="blobInfo.editBlobPath"
:web-ide-path="blobInfo.ideEditPath"
+ :needs-to-fork="showForkSuggestion"
+ @edit="editBlob"
/>
<blob-button-group
v-if="isLoggedIn"
@@ -206,14 +256,20 @@ export default {
/>
</template>
</blob-header>
+ <fork-suggestion
+ v-if="forkTarget && showForkSuggestion"
+ :fork-path="forkPath"
+ @cancel="setForkTarget(null)"
+ />
<blob-content
v-if="!blobViewer"
:rich-viewer="legacyRichViewer"
:blob="blobInfo"
- :content="blobInfo.rawTextBlob"
+ :content="legacySimpleViewer"
:is-raw-content="true"
:active-viewer="viewer"
- :loading="false"
+ :hide-line-numbers="true"
+ :loading="isLoadingLegacyViewer"
/>
<component :is="blobViewer" v-else v-bind="viewerProps" class="blob-viewer" />
</div>
diff --git a/app/assets/javascripts/repository/components/blob_edit.vue b/app/assets/javascripts/repository/components/blob_edit.vue
index 30ed4cd57f1..fd377ba1b81 100644
--- a/app/assets/javascripts/repository/components/blob_edit.vue
+++ b/app/assets/javascripts/repository/components/blob_edit.vue
@@ -27,6 +27,16 @@ export default {
type: String,
required: true,
},
+ needsToFork: {
+ type: Boolean,
+ required: false,
+ default: false,
+ },
+ },
+ methods: {
+ onEdit(target) {
+ this.$emit('edit', target);
+ },
},
};
</script>
@@ -38,7 +48,9 @@ export default {
class="gl-mr-3"
:edit-url="editPath"
:web-ide-url="webIdePath"
+ :needs-to-fork="needsToFork"
:is-blob="true"
+ @edit="onEdit"
/>
<div v-else>
<gl-button
@@ -46,8 +58,8 @@ export default {
class="gl-mr-2"
category="primary"
variant="confirm"
- :href="editPath"
data-testid="edit"
+ @click="onEdit('simple')"
>
{{ $options.i18n.edit }}
</gl-button>
@@ -56,8 +68,8 @@ export default {
class="gl-mr-3"
category="primary"
variant="confirm"
- :href="webIdePath"
data-testid="web-ide"
+ @click="onEdit('ide')"
>
{{ $options.i18n.webIde }}
</gl-button>
diff --git a/app/assets/javascripts/repository/components/blob_viewers/index.js b/app/assets/javascripts/repository/components/blob_viewers/index.js
index 3b4f4eb51fe..c5209d97abb 100644
--- a/app/assets/javascripts/repository/components/blob_viewers/index.js
+++ b/app/assets/javascripts/repository/components/blob_viewers/index.js
@@ -3,11 +3,15 @@ export const loadViewer = (type) => {
case 'empty':
return () => import(/* webpackChunkName: 'blob_empty_viewer' */ './empty_viewer.vue');
case 'text':
- return () => import(/* webpackChunkName: 'blob_text_viewer' */ './text_viewer.vue');
+ return gon.features.refactorTextViewer
+ ? () => import(/* webpackChunkName: 'blob_text_viewer' */ './text_viewer.vue')
+ : null;
case 'download':
return () => import(/* webpackChunkName: 'blob_download_viewer' */ './download_viewer.vue');
case 'image':
return () => import(/* webpackChunkName: 'blob_image_viewer' */ './image_viewer.vue');
+ case 'video':
+ return () => import(/* webpackChunkName: 'blob_video_viewer' */ './video_viewer.vue');
default:
return null;
}
@@ -29,5 +33,8 @@ export const viewerProps = (type, blob) => {
url: blob.rawPath,
alt: blob.name,
},
+ video: {
+ url: blob.rawPath,
+ },
}[type];
};
diff --git a/app/assets/javascripts/repository/components/blob_viewers/video_viewer.vue b/app/assets/javascripts/repository/components/blob_viewers/video_viewer.vue
new file mode 100644
index 00000000000..dec0c4802ca
--- /dev/null
+++ b/app/assets/javascripts/repository/components/blob_viewers/video_viewer.vue
@@ -0,0 +1,15 @@
+<script>
+export default {
+ props: {
+ url: {
+ type: String,
+ required: true,
+ },
+ },
+};
+</script>
+<template>
+ <div class="gl-text-center gl-p-7 gl-bg-gray-50">
+ <video :src="url" controls data-testid="video" class="gl-max-w-full"></video>
+ </div>
+</template>
diff --git a/app/assets/javascripts/repository/components/breadcrumbs.vue b/app/assets/javascripts/repository/components/breadcrumbs.vue
index db84e2b5912..d3717f10ec7 100644
--- a/app/assets/javascripts/repository/components/breadcrumbs.vue
+++ b/app/assets/javascripts/repository/components/breadcrumbs.vue
@@ -9,11 +9,13 @@ import {
} from '@gitlab/ui';
import permissionsQuery from 'shared_queries/repository/permissions.query.graphql';
import { joinPaths, escapeFileUrl } from '~/lib/utils/url_utility';
+import glFeatureFlagsMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
import { __ } from '../../locale';
import getRefMixin from '../mixins/get_ref';
import projectPathQuery from '../queries/project_path.query.graphql';
import projectShortPathQuery from '../queries/project_short_path.query.graphql';
import UploadBlobModal from './upload_blob_modal.vue';
+import NewDirectoryModal from './new_directory_modal.vue';
const ROW_TYPES = {
header: 'header',
@@ -21,6 +23,7 @@ const ROW_TYPES = {
};
const UPLOAD_BLOB_MODAL_ID = 'modal-upload-blob';
+const NEW_DIRECTORY_MODAL_ID = 'modal-new-directory';
export default {
components: {
@@ -30,6 +33,7 @@ export default {
GlDropdownItem,
GlIcon,
UploadBlobModal,
+ NewDirectoryModal,
},
apollo: {
projectShortPath: {
@@ -54,7 +58,7 @@ export default {
directives: {
GlModal: GlModalDirective,
},
- mixins: [getRefMixin],
+ mixins: [getRefMixin, glFeatureFlagsMixin()],
props: {
currentPath: {
type: String,
@@ -121,8 +125,14 @@ export default {
required: false,
default: '',
},
+ newDirPath: {
+ type: String,
+ required: false,
+ default: '',
+ },
},
uploadBlobModalId: UPLOAD_BLOB_MODAL_ID,
+ newDirectoryModalId: NEW_DIRECTORY_MODAL_ID,
data() {
return {
projectShortPath: '',
@@ -160,6 +170,13 @@ export default {
showUploadModal() {
return this.canEditTree && !this.$apollo.queries.userPermissions.loading;
},
+ showNewDirectoryModal() {
+ return (
+ this.glFeatures.newDirModal &&
+ this.canEditTree &&
+ !this.$apollo.queries.userPermissions.loading
+ );
+ },
dropdownItems() {
const items = [];
@@ -185,15 +202,26 @@ export default {
text: __('Upload file'),
modalId: UPLOAD_BLOB_MODAL_ID,
},
- {
+ );
+
+ if (this.glFeatures.newDirModal) {
+ items.push({
+ attrs: {
+ href: '#modal-create-new-dir',
+ },
+ text: __('New directory'),
+ modalId: NEW_DIRECTORY_MODAL_ID,
+ });
+ } else {
+ items.push({
attrs: {
href: '#modal-create-new-dir',
'data-target': '#modal-create-new-dir',
'data-toggle': 'modal',
},
text: __('New directory'),
- },
- );
+ });
+ }
} else if (this.canCreateMrFromFork) {
items.push(
{
@@ -306,5 +334,14 @@ export default {
:can-push-code="canPushCode"
:path="uploadPath"
/>
+ <new-directory-modal
+ v-if="showNewDirectoryModal"
+ :can-push-code="canPushCode"
+ :modal-id="$options.newDirectoryModalId"
+ :commit-message="__('Add new directory')"
+ :target-branch="selectedBranch"
+ :original-branch="originalBranch"
+ :path="newDirPath"
+ />
</nav>
</template>
diff --git a/app/assets/javascripts/repository/components/fork_suggestion.vue b/app/assets/javascripts/repository/components/fork_suggestion.vue
new file mode 100644
index 00000000000..c266bea319b
--- /dev/null
+++ b/app/assets/javascripts/repository/components/fork_suggestion.vue
@@ -0,0 +1,45 @@
+<script>
+import { GlButton } from '@gitlab/ui';
+import { __ } from '~/locale';
+
+export default {
+ i18n: {
+ message: __(
+ 'You can’t edit files directly in this project. Fork this project and submit a merge request with your changes.',
+ ),
+ fork: __('Fork'),
+ cancel: __('Cancel'),
+ },
+ components: {
+ GlButton,
+ },
+ props: {
+ forkPath: {
+ type: String,
+ required: true,
+ },
+ },
+};
+</script>
+
+<template>
+ <div
+ class="gl-display-flex gl-justify-content-end gl-align-items-center gl-bg-gray-10 gl-px-5 gl-py-2 gl-border-1 gl-border-b-solid gl-border-gray-100"
+ >
+ <span class="gl-mr-6" data-testid="message">{{ $options.i18n.message }}</span>
+
+ <gl-button
+ class="gl-mr-3"
+ category="secondary"
+ variant="confirm"
+ :href="forkPath"
+ data-testid="fork"
+ >
+ {{ $options.i18n.fork }}
+ </gl-button>
+
+ <gl-button data-testid="cancel" @click="$emit('cancel')">
+ {{ $options.i18n.cancel }}
+ </gl-button>
+ </div>
+</template>
diff --git a/app/assets/javascripts/repository/components/new_directory_modal.vue b/app/assets/javascripts/repository/components/new_directory_modal.vue
new file mode 100644
index 00000000000..6c5797bf5b2
--- /dev/null
+++ b/app/assets/javascripts/repository/components/new_directory_modal.vue
@@ -0,0 +1,183 @@
+<script>
+import {
+ GlAlert,
+ GlForm,
+ GlModal,
+ GlFormGroup,
+ GlFormInput,
+ GlFormTextarea,
+ GlToggle,
+} from '@gitlab/ui';
+import createFlash from '~/flash';
+import axios from '~/lib/utils/axios_utils';
+import { visitUrl } from '~/lib/utils/url_utility';
+import { __ } from '~/locale';
+import {
+ SECONDARY_OPTIONS_TEXT,
+ COMMIT_LABEL,
+ TARGET_BRANCH_LABEL,
+ TOGGLE_CREATE_MR_LABEL,
+ NEW_BRANCH_IN_FORK,
+} from '../constants';
+
+const MODAL_TITLE = __('Create New Directory');
+const PRIMARY_OPTIONS_TEXT = __('Create directory');
+const DIR_LABEL = __('Directory name');
+const ERROR_MESSAGE = __('Error creating new directory. Please try again.');
+
+export default {
+ components: {
+ GlAlert,
+ GlModal,
+ GlForm,
+ GlFormGroup,
+ GlFormInput,
+ GlFormTextarea,
+ GlToggle,
+ },
+ i18n: {
+ DIR_LABEL,
+ COMMIT_LABEL,
+ TARGET_BRANCH_LABEL,
+ TOGGLE_CREATE_MR_LABEL,
+ NEW_BRANCH_IN_FORK,
+ PRIMARY_OPTIONS_TEXT,
+ ERROR_MESSAGE,
+ },
+ props: {
+ modalTitle: {
+ type: String,
+ default: MODAL_TITLE,
+ required: false,
+ },
+ modalId: {
+ type: String,
+ required: true,
+ },
+ primaryBtnText: {
+ type: String,
+ default: PRIMARY_OPTIONS_TEXT,
+ required: false,
+ },
+ commitMessage: {
+ type: String,
+ required: true,
+ },
+ targetBranch: {
+ type: String,
+ required: true,
+ },
+ originalBranch: {
+ type: String,
+ required: true,
+ },
+ path: {
+ type: String,
+ required: true,
+ },
+ canPushCode: {
+ type: Boolean,
+ required: true,
+ },
+ },
+ data() {
+ return {
+ dir: null,
+ commit: this.commitMessage,
+ target: this.targetBranch,
+ createNewMr: true,
+ loading: false,
+ };
+ },
+ computed: {
+ primaryOptions() {
+ return {
+ text: this.primaryBtnText,
+ attributes: [
+ {
+ variant: 'confirm',
+ loading: this.loading,
+ disabled: !this.formCompleted || this.loading,
+ },
+ ],
+ };
+ },
+ cancelOptions() {
+ return {
+ text: SECONDARY_OPTIONS_TEXT,
+ attributes: [
+ {
+ disabled: this.loading,
+ },
+ ],
+ };
+ },
+ showCreateNewMrToggle() {
+ return this.canPushCode;
+ },
+ formCompleted() {
+ return this.dir && this.commit && this.target;
+ },
+ },
+ methods: {
+ submitForm() {
+ this.loading = true;
+
+ const formData = new FormData();
+ formData.append('dir_name', this.dir);
+ formData.append('commit_message', this.commit);
+ formData.append('branch_name', this.target);
+ formData.append('original_branch', this.originalBranch);
+
+ if (this.createNewMr) {
+ formData.append('create_merge_request', this.createNewMr);
+ }
+
+ return axios
+ .post(this.path, formData)
+ .then((response) => {
+ visitUrl(response.data.filePath);
+ })
+ .catch(() => {
+ this.loading = false;
+ createFlash({ message: ERROR_MESSAGE });
+ });
+ },
+ },
+};
+</script>
+
+<template>
+ <gl-form>
+ <gl-modal
+ :modal-id="modalId"
+ :title="modalTitle"
+ :action-primary="primaryOptions"
+ :action-cancel="cancelOptions"
+ @primary.prevent="submitForm"
+ >
+ <gl-form-group :label="$options.i18n.DIR_LABEL" label-for="dir_name">
+ <gl-form-input v-model="dir" :disabled="loading" name="dir_name" />
+ </gl-form-group>
+ <gl-form-group :label="$options.i18n.COMMIT_LABEL" label-for="commit_message">
+ <gl-form-textarea v-model="commit" name="commit_message" :disabled="loading" />
+ </gl-form-group>
+ <gl-form-group
+ v-if="canPushCode"
+ :label="$options.i18n.TARGET_BRANCH_LABEL"
+ label-for="branch_name"
+ >
+ <gl-form-input v-model="target" :disabled="loading" name="branch_name" />
+ </gl-form-group>
+ <gl-toggle
+ v-if="showCreateNewMrToggle"
+ v-model="createNewMr"
+ :disabled="loading"
+ :label="$options.i18n.TOGGLE_CREATE_MR_LABEL"
+ />
+ <gl-alert v-if="!canPushCode" variant="info" :dismissible="false" class="gl-mt-3">
+ {{ $options.i18n.NEW_BRANCH_IN_FORK }}
+ </gl-alert>
+ </gl-modal>
+ </gl-form>
+</template>
diff --git a/app/assets/javascripts/repository/components/preview/index.vue b/app/assets/javascripts/repository/components/preview/index.vue
index 54e67c5ab5c..c6e461b10e0 100644
--- a/app/assets/javascripts/repository/components/preview/index.vue
+++ b/app/assets/javascripts/repository/components/preview/index.vue
@@ -1,5 +1,5 @@
<script>
-import { GlIcon, GlLink, GlLoadingIcon } from '@gitlab/ui';
+import { GlIcon, GlLink, GlLoadingIcon, GlSafeHtmlDirective as SafeHtml } from '@gitlab/ui';
import $ from 'jquery';
import '~/behaviors/markdown/render_gfm';
import { handleLocationHash } from '~/lib/utils/common_utils';
@@ -22,6 +22,9 @@ export default {
GlLink,
GlLoadingIcon,
},
+ directives: {
+ SafeHtml,
+ },
props: {
blob: {
type: Object,
@@ -59,11 +62,7 @@ export default {
</div>
<div class="blob-viewer" data-qa-selector="blob_viewer_content" itemprop="about">
<gl-loading-icon v-if="loading > 0" size="md" color="dark" class="my-4 mx-auto" />
- <div
- v-else-if="readme"
- ref="readme"
- v-html="readme.html /* eslint-disable-line vue/no-v-html */"
- ></div>
+ <div v-else-if="readme" ref="readme" v-safe-html="readme.html"></div>
</div>
</article>
</template>
diff --git a/app/assets/javascripts/repository/components/table/index.vue b/app/assets/javascripts/repository/components/table/index.vue
index 10a30bd44b1..0a2ed753e38 100644
--- a/app/assets/javascripts/repository/components/table/index.vue
+++ b/app/assets/javascripts/repository/components/table/index.vue
@@ -1,5 +1,6 @@
<script>
import { GlDeprecatedSkeletonLoading as GlSkeletonLoading, GlButton } from '@gitlab/ui';
+import glFeatureFlagMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
import { sprintf, __ } from '../../../locale';
import getRefMixin from '../../mixins/get_ref';
import projectPathQuery from '../../queries/project_path.query.graphql';
@@ -15,13 +16,18 @@ export default {
ParentRow,
GlButton,
},
- mixins: [getRefMixin],
+ mixins: [getRefMixin, glFeatureFlagMixin()],
apollo: {
projectPath: {
query: projectPathQuery,
},
},
props: {
+ commits: {
+ type: Array,
+ required: false,
+ default: () => [],
+ },
path: {
type: String,
required: true,
@@ -48,6 +54,7 @@ export default {
data() {
return {
projectPath: '',
+ rowNumbers: {},
};
},
computed: {
@@ -73,10 +80,38 @@ export default {
return ['', '/'].indexOf(this.path) === -1;
},
},
+ watch: {
+ $route: function routeChange() {
+ this.$options.totalRowsLoaded = -1;
+ },
+ },
+ totalRowsLoaded: -1,
methods: {
showMore() {
this.$emit('showMore');
},
+ generateRowNumber(path, id, index) {
+ const key = `${path}-${id}-${index}`;
+ if (!this.glFeatures.lazyLoadCommits) {
+ return 0;
+ }
+
+ if (!this.rowNumbers[key] && this.rowNumbers[key] !== 0) {
+ this.$options.totalRowsLoaded += 1;
+ this.rowNumbers[key] = this.$options.totalRowsLoaded;
+ }
+
+ return this.rowNumbers[key];
+ },
+ getCommit(fileName, type) {
+ if (!this.glFeatures.lazyLoadCommits) {
+ return {};
+ }
+
+ return this.commits.find(
+ (commitEntry) => commitEntry.fileName === fileName && commitEntry.type === type,
+ );
+ },
},
};
</script>
@@ -87,6 +122,7 @@ export default {
<table
:aria-label="tableCaption"
class="table tree-table"
+ :class="{ 'gl-table-layout-fixed': !showParentRow }"
aria-live="polite"
data-qa-selector="file_tree_table"
>
@@ -115,12 +151,17 @@ export default {
:lfs-oid="entry.lfsOid"
:loading-path="loadingPath"
:total-entries="totalEntries"
+ :row-number="generateRowNumber(entry.flatPath, entry.id, index)"
+ :commit-info="getCommit(entry.name, entry.type)"
+ v-on="$listeners"
/>
</template>
<template v-if="isLoading">
<tr v-for="i in 5" :key="i" aria-hidden="true">
<td><gl-skeleton-loading :lines="1" class="h-auto" /></td>
- <td><gl-skeleton-loading :lines="1" class="h-auto" /></td>
+ <td class="gl-display-none gl-sm-display-block">
+ <gl-skeleton-loading :lines="1" class="h-auto" />
+ </td>
<td><gl-skeleton-loading :lines="1" class="ml-auto h-auto w-50" /></td>
</tr>
</template>
diff --git a/app/assets/javascripts/repository/components/table/row.vue b/app/assets/javascripts/repository/components/table/row.vue
index 009dd19b4a5..5010d60f374 100644
--- a/app/assets/javascripts/repository/components/table/row.vue
+++ b/app/assets/javascripts/repository/components/table/row.vue
@@ -7,6 +7,8 @@ import {
GlLoadingIcon,
GlIcon,
GlHoverLoadDirective,
+ GlSafeHtmlDirective,
+ GlIntersectionObserver,
} from '@gitlab/ui';
import { escapeRegExp } from 'lodash';
import filesQuery from 'shared_queries/repository/files.query.graphql';
@@ -29,10 +31,12 @@ export default {
GlIcon,
TimeagoTooltip,
FileIcon,
+ GlIntersectionObserver,
},
directives: {
GlTooltip: GlTooltipDirective,
GlHoverLoad: GlHoverLoadDirective,
+ SafeHtml: GlSafeHtmlDirective,
},
apollo: {
commit: {
@@ -46,10 +50,23 @@ export default {
maxOffset: this.totalEntries,
};
},
+ skip() {
+ return this.glFeatures.lazyLoadCommits;
+ },
},
},
mixins: [getRefMixin, glFeatureFlagMixin()],
props: {
+ commitInfo: {
+ type: Object,
+ required: false,
+ default: null,
+ },
+ rowNumber: {
+ type: Number,
+ required: false,
+ default: null,
+ },
totalEntries: {
type: Number,
required: true,
@@ -111,9 +128,13 @@ export default {
data() {
return {
commit: null,
+ hasRowAppeared: false,
};
},
computed: {
+ commitData() {
+ return this.glFeatures.lazyLoadCommits ? this.commitInfo : this.commit;
+ },
refactorBlobViewerEnabled() {
return this.glFeatures.refactorBlobViewer;
},
@@ -146,7 +167,10 @@ export default {
return this.sha.slice(0, 8);
},
hasLockLabel() {
- return this.commit && this.commit.lockLabel;
+ return this.commitData && this.commitData.lockLabel;
+ },
+ showSkeletonLoader() {
+ return !this.commitData && this.hasRowAppeared;
},
},
methods: {
@@ -177,7 +201,21 @@ export default {
apolloQuery(query, variables) {
this.$apollo.query({ query, variables });
},
+ rowAppeared() {
+ this.hasRowAppeared = true;
+
+ if (this.glFeatures.lazyLoadCommits) {
+ this.$emit('row-appear', {
+ rowNumber: this.rowNumber,
+ hasCommit: Boolean(this.commitInfo),
+ });
+ }
+ },
+ rowDisappeared() {
+ this.hasRowAppeared = false;
+ },
},
+ safeHtmlConfig: { ADD_TAGS: ['gl-emoji'] },
};
</script>
@@ -219,7 +257,7 @@ export default {
<gl-icon
v-if="hasLockLabel"
v-gl-tooltip
- :title="commit.lockLabel"
+ :title="commitData.lockLabel"
name="lock"
:size="12"
class="ml-1"
@@ -227,17 +265,19 @@ export default {
</td>
<td class="d-none d-sm-table-cell tree-commit cursor-default">
<gl-link
- v-if="commit"
- :href="commit.commitPath"
- :title="commit.message"
+ v-if="commitData"
+ v-safe-html:[$options.safeHtmlConfig]="commitData.titleHtml"
+ :href="commitData.commitPath"
+ :title="commitData.message"
class="str-truncated-100 tree-commit-link"
- v-html="commit.titleHtml /* eslint-disable-line vue/no-v-html */"
/>
- <gl-skeleton-loading v-else :lines="1" class="h-auto" />
+ <gl-intersection-observer @appear="rowAppeared" @disappear="rowDisappeared">
+ <gl-skeleton-loading v-if="showSkeletonLoader" :lines="1" class="h-auto" />
+ </gl-intersection-observer>
</td>
<td class="tree-time-ago text-right cursor-default">
- <timeago-tooltip v-if="commit" :time="commit.committedDate" />
- <gl-skeleton-loading v-else :lines="1" class="ml-auto h-auto w-50" />
+ <timeago-tooltip v-if="commitData" :time="commitData.committedDate" />
+ <gl-skeleton-loading v-if="showSkeletonLoader" :lines="1" class="ml-auto h-auto w-50" />
</td>
</tr>
</template>
diff --git a/app/assets/javascripts/repository/components/tree_content.vue b/app/assets/javascripts/repository/components/tree_content.vue
index 5a8ead9ae8f..16dfe3cfb14 100644
--- a/app/assets/javascripts/repository/components/tree_content.vue
+++ b/app/assets/javascripts/repository/components/tree_content.vue
@@ -8,6 +8,7 @@ import { TREE_PAGE_SIZE, TREE_INITIAL_FETCH_COUNT, TREE_PAGE_LIMIT } from '../co
import getRefMixin from '../mixins/get_ref';
import projectPathQuery from '../queries/project_path.query.graphql';
import { readmeFile } from '../utils/readme';
+import { loadCommits, isRequested, resetRequestedCommits } from '../commits_service';
import FilePreview from './preview/index.vue';
import FileTable from './table/index.vue';
@@ -36,6 +37,7 @@ export default {
},
data() {
return {
+ commits: [],
projectPath: '',
nextPageCursor: '',
pagesLoaded: 1,
@@ -81,12 +83,16 @@ export default {
this.entries.submodules = [];
this.entries.blobs = [];
this.nextPageCursor = '';
+ resetRequestedCommits();
this.fetchFiles();
},
},
mounted() {
// We need to wait for `ref` and `projectPath` to be set
- this.$nextTick(() => this.fetchFiles());
+ this.$nextTick(() => {
+ resetRequestedCommits();
+ this.fetchFiles();
+ });
},
methods: {
fetchFiles() {
@@ -152,6 +158,18 @@ export default {
.concat(data.trees.pageInfo, data.submodules.pageInfo, data.blobs.pageInfo)
.find(({ hasNextPage }) => hasNextPage);
},
+ loadCommitData({ rowNumber = 0, hasCommit } = {}) {
+ if (!this.glFeatures.lazyLoadCommits || hasCommit || isRequested(rowNumber)) {
+ return;
+ }
+
+ loadCommits(this.projectPath, this.path, this.ref, rowNumber)
+ .then(this.setCommitData)
+ .catch(() => {});
+ },
+ setCommitData(data) {
+ this.commits = this.commits.concat(data);
+ },
handleShowMore() {
this.clickedShowMore = true;
this.pagesLoaded += 1;
@@ -169,7 +187,9 @@ export default {
:is-loading="isLoadingFiles"
:loading-path="loadingPath"
:has-more="hasShowMore"
+ :commits="commits"
@showMore="handleShowMore"
+ @row-appear="loadCommitData"
/>
<file-preview v-if="readme" :blob="readme" />
</div>
diff --git a/app/assets/javascripts/repository/components/upload_blob_modal.vue b/app/assets/javascripts/repository/components/upload_blob_modal.vue
index df5a5ea6163..0199b893453 100644
--- a/app/assets/javascripts/repository/components/upload_blob_modal.vue
+++ b/app/assets/javascripts/repository/components/upload_blob_modal.vue
@@ -220,6 +220,7 @@ export default {
class="gl-h-200! gl-mb-4"
single-file-selection
:valid-file-mimetypes="$options.validFileMimetypes"
+ :is-file-valid="() => true"
@change="setFile"
>
<div
diff --git a/app/assets/javascripts/repository/constants.js b/app/assets/javascripts/repository/constants.js
index 93032bf17e2..152fabbd7cc 100644
--- a/app/assets/javascripts/repository/constants.js
+++ b/app/assets/javascripts/repository/constants.js
@@ -4,12 +4,19 @@ export const TREE_PAGE_LIMIT = 1000; // the maximum amount of items per page
export const TREE_PAGE_SIZE = 100; // the amount of items to be fetched per (batch) request
export const TREE_INITIAL_FETCH_COUNT = TREE_PAGE_LIMIT / TREE_PAGE_SIZE; // the amount of (batch) requests to make
+export const COMMIT_BATCH_SIZE = 25; // we request commit data in batches of 25
+
export const SECONDARY_OPTIONS_TEXT = __('Cancel');
export const COMMIT_LABEL = __('Commit message');
export const TARGET_BRANCH_LABEL = __('Target branch');
export const TOGGLE_CREATE_MR_LABEL = __('Start a new merge request with these changes');
+export const NEW_BRANCH_IN_FORK = __(
+ 'A new branch will be created in your fork and a new merge request will be started.',
+);
export const COMMIT_MESSAGE_SUBJECT_MAX_LENGTH = 52;
export const COMMIT_MESSAGE_BODY_MAX_LENGTH = 72;
export const LIMITED_CONTAINER_WIDTH_CLASS = 'limit-container-width';
+
+export const I18N_COMMIT_DATA_FETCH_ERROR = __('An error occurred while fetching commit data.');
diff --git a/app/assets/javascripts/repository/index.js b/app/assets/javascripts/repository/index.js
index 60a1a0443f7..45e026ad695 100644
--- a/app/assets/javascripts/repository/index.js
+++ b/app/assets/javascripts/repository/index.js
@@ -120,6 +120,7 @@ export default function setupVueRepositoryList() {
forkNewDirectoryPath,
forkUploadBlobPath,
uploadPath,
+ newDirPath,
},
});
},
diff --git a/app/assets/javascripts/repository/queries/blob_info.query.graphql b/app/assets/javascripts/repository/queries/blob_info.query.graphql
index 45f07f7dc58..8e0b5e21ca3 100644
--- a/app/assets/javascripts/repository/queries/blob_info.query.graphql
+++ b/app/assets/javascripts/repository/queries/blob_info.query.graphql
@@ -4,6 +4,8 @@ query getBlobInfo($projectPath: ID!, $filePath: String!, $ref: String!) {
userPermissions {
pushCode
downloadCode
+ createMergeRequestIn
+ forkProject
}
pathLocks {
nodes {
@@ -23,6 +25,9 @@ query getBlobInfo($projectPath: ID!, $filePath: String!, $ref: String!) {
path
editBlobPath
ideEditPath
+ forkAndEditPath
+ ideForkAndEditPath
+ canModifyBlob
storedExternally
rawPath
replacePath
diff --git a/app/assets/javascripts/repository/router.js b/app/assets/javascripts/repository/router.js
index 6637d03a7a4..0a675e14eb5 100644
--- a/app/assets/javascripts/repository/router.js
+++ b/app/assets/javascripts/repository/router.js
@@ -1,7 +1,7 @@
import { escapeRegExp } from 'lodash';
import Vue from 'vue';
import VueRouter from 'vue-router';
-import { joinPaths } from '../lib/utils/url_utility';
+import { joinPaths, webIDEUrl } from '~/lib/utils/url_utility';
import BlobPage from './pages/blob.vue';
import IndexPage from './pages/index.vue';
import TreePage from './pages/tree.vue';
@@ -24,7 +24,7 @@ export default function createRouter(base, baseRef) {
}),
};
- return new VueRouter({
+ const router = new VueRouter({
mode: 'history',
base: joinPaths(gon.relative_url_root || '', base),
routes: [
@@ -59,4 +59,21 @@ export default function createRouter(base, baseRef) {
},
],
});
+
+ router.afterEach((to) => {
+ const needsClosingSlash = !to.name.includes('blobPath');
+ window.gl.webIDEPath = webIDEUrl(
+ joinPaths(
+ '/',
+ base,
+ 'edit',
+ decodeURI(baseRef),
+ '-',
+ to.params.path || '',
+ needsClosingSlash && '/',
+ ),
+ );
+ });
+
+ return router;
}
diff --git a/app/assets/javascripts/rest_api.js b/app/assets/javascripts/rest_api.js
index 61fe89f4f7e..29642b6633f 100644
--- a/app/assets/javascripts/rest_api.js
+++ b/app/assets/javascripts/rest_api.js
@@ -2,6 +2,7 @@ export * from './api/groups_api';
export * from './api/projects_api';
export * from './api/user_api';
export * from './api/markdown_api';
+export * from './api/bulk_imports_api';
// Note: It's not possible to spy on methods imported from this file in
// Jest tests.
diff --git a/app/assets/javascripts/right_sidebar.js b/app/assets/javascripts/right_sidebar.js
index 23254fcc2eb..381421cdc23 100644
--- a/app/assets/javascripts/right_sidebar.js
+++ b/app/assets/javascripts/right_sidebar.js
@@ -111,7 +111,7 @@ Sidebar.prototype.toggleTodo = function (e) {
};
Sidebar.prototype.sidebarCollapseClicked = function (e) {
- if ($(e.currentTarget).hasClass('dont-change-state')) {
+ if ($(e.currentTarget).hasClass('js-dont-change-state')) {
return;
}
const sidebar = e.data;
diff --git a/app/assets/javascripts/runner/admin_runners/admin_runners_app.vue b/app/assets/javascripts/runner/admin_runners/admin_runners_app.vue
index fedd2519958..c8513a0b803 100644
--- a/app/assets/javascripts/runner/admin_runners/admin_runners_app.vue
+++ b/app/assets/javascripts/runner/admin_runners/admin_runners_app.vue
@@ -1,4 +1,5 @@
<script>
+import { GlLink } from '@gitlab/ui';
import createFlash from '~/flash';
import { fetchPolicies } from '~/lib/graphql';
import { updateHistory } from '~/lib/utils/url_utility';
@@ -6,8 +7,8 @@ import { formatNumber, sprintf, __ } from '~/locale';
import RunnerFilteredSearchBar from '../components/runner_filtered_search_bar.vue';
import RunnerList from '../components/runner_list.vue';
import RunnerManualSetupHelp from '../components/runner_manual_setup_help.vue';
+import RunnerName from '../components/runner_name.vue';
import RunnerPagination from '../components/runner_pagination.vue';
-import RunnerTypeHelp from '../components/runner_type_help.vue';
import { statusTokenConfig } from '../components/search_tokens/status_token_config';
import { tagTokenConfig } from '../components/search_tokens/tag_token_config';
import { typeTokenConfig } from '../components/search_tokens/type_token_config';
@@ -23,10 +24,11 @@ import { captureException } from '../sentry_utils';
export default {
name: 'AdminRunnersApp',
components: {
+ GlLink,
RunnerFilteredSearchBar,
RunnerList,
RunnerManualSetupHelp,
- RunnerTypeHelp,
+ RunnerName,
RunnerPagination,
},
props: {
@@ -124,17 +126,10 @@ export default {
</script>
<template>
<div>
- <div class="row">
- <div class="col-sm-6">
- <runner-type-help />
- </div>
- <div class="col-sm-6">
- <runner-manual-setup-help
- :registration-token="registrationToken"
- :type="$options.INSTANCE_TYPE"
- />
- </div>
- </div>
+ <runner-manual-setup-help
+ :registration-token="registrationToken"
+ :type="$options.INSTANCE_TYPE"
+ />
<runner-filtered-search-bar
v-model="search"
@@ -150,7 +145,13 @@ export default {
{{ __('No runners found') }}
</div>
<template v-else>
- <runner-list :runners="runners.items" :loading="runnersLoading" />
+ <runner-list :runners="runners.items" :loading="runnersLoading">
+ <template #runner-name="{ runner }">
+ <gl-link :href="runner.adminUrl">
+ <runner-name :runner="runner" />
+ </gl-link>
+ </template>
+ </runner-list>
<runner-pagination v-model="search.pagination" :page-info="runners.pageInfo" />
</template>
</div>
diff --git a/app/assets/javascripts/runner/components/cells/runner_actions_cell.vue b/app/assets/javascripts/runner/components/cells/runner_actions_cell.vue
index 863f0ab995f..e26bdbf1aea 100644
--- a/app/assets/javascripts/runner/components/cells/runner_actions_cell.vue
+++ b/app/assets/javascripts/runner/components/cells/runner_actions_cell.vue
@@ -1,7 +1,6 @@
<script>
import { GlButton, GlButtonGroup, GlTooltipDirective } from '@gitlab/ui';
import createFlash from '~/flash';
-import { getIdFromGraphQLId } from '~/graphql_shared/utils';
import { __, s__ } from '~/locale';
import runnerDeleteMutation from '~/runner/graphql/runner_delete.mutation.graphql';
import runnerUpdateMutation from '~/runner/graphql/runner_update.mutation.graphql';
@@ -37,13 +36,6 @@ export default {
};
},
computed: {
- runnerNumericalId() {
- return getIdFromGraphQLId(this.runner.id);
- },
- runnerUrl() {
- // TODO implement using webUrl from the API
- return `${gon.gitlab_url || ''}/admin/runners/${this.runnerNumericalId}`;
- },
isActive() {
return this.runner.active;
},
@@ -119,7 +111,7 @@ export default {
},
},
awaitRefetchQueries: true,
- refetchQueries: ['getRunners'],
+ refetchQueries: ['getRunners', 'getGroupRunners'],
});
if (errors && errors.length) {
throw new Error(errors.join(' '));
@@ -147,12 +139,20 @@ export default {
<template>
<gl-button-group>
+ <!--
+ This button appears for administratos: those with
+ access to the adminUrl. More advanced permissions policies
+ will allow more granular permissions.
+
+ See https://gitlab.com/gitlab-org/gitlab/-/issues/334802
+ -->
<gl-button
+ v-if="runner.adminUrl"
v-gl-tooltip.hover.viewport
+ :href="runner.adminUrl"
:title="$options.i18n.I18N_EDIT"
:aria-label="$options.i18n.I18N_EDIT"
icon="pencil"
- :href="runnerUrl"
data-testid="edit-runner"
/>
<gl-button
diff --git a/app/assets/javascripts/runner/components/cells/runner_name_cell.vue b/app/assets/javascripts/runner/components/cells/runner_name_cell.vue
deleted file mode 100644
index 797a3359147..00000000000
--- a/app/assets/javascripts/runner/components/cells/runner_name_cell.vue
+++ /dev/null
@@ -1,44 +0,0 @@
-<script>
-import { GlLink } from '@gitlab/ui';
-import { getIdFromGraphQLId } from '~/graphql_shared/utils';
-import TooltipOnTruncate from '~/vue_shared/components/tooltip_on_truncate.vue';
-
-export default {
- components: {
- GlLink,
- TooltipOnTruncate,
- },
- props: {
- runner: {
- type: Object,
- required: true,
- },
- },
- computed: {
- runnerNumericalId() {
- return getIdFromGraphQLId(this.runner.id);
- },
- runnerUrl() {
- // TODO implement using webUrl from the API
- return `${gon.gitlab_url || ''}/admin/runners/${this.runnerNumericalId}`;
- },
- description() {
- return this.runner.description;
- },
- shortSha() {
- return this.runner.shortSha;
- },
- },
-};
-</script>
-
-<template>
- <div>
- <gl-link :href="runnerUrl"> #{{ runnerNumericalId }} ({{ shortSha }})</gl-link>
- <tooltip-on-truncate class="gl-display-block" :title="description" truncate-target="child">
- <div class="gl-text-truncate">
- {{ description }}
- </div>
- </tooltip-on-truncate>
- </div>
-</template>
diff --git a/app/assets/javascripts/runner/components/cells/runner_summary_cell.vue b/app/assets/javascripts/runner/components/cells/runner_summary_cell.vue
new file mode 100644
index 00000000000..886b5cb29fc
--- /dev/null
+++ b/app/assets/javascripts/runner/components/cells/runner_summary_cell.vue
@@ -0,0 +1,35 @@
+<script>
+import TooltipOnTruncate from '~/vue_shared/components/tooltip_on_truncate.vue';
+import RunnerName from '../runner_name.vue';
+
+export default {
+ components: {
+ TooltipOnTruncate,
+ RunnerName,
+ },
+ props: {
+ runner: {
+ type: Object,
+ required: true,
+ },
+ },
+ computed: {
+ description() {
+ return this.runner.description;
+ },
+ },
+};
+</script>
+
+<template>
+ <div>
+ <slot :runner="runner" name="runner-name">
+ <runner-name :runner="runner" />
+ </slot>
+ <tooltip-on-truncate class="gl-display-block" :title="description" truncate-target="child">
+ <div class="gl-text-truncate">
+ {{ description }}
+ </div>
+ </tooltip-on-truncate>
+ </div>
+</template>
diff --git a/app/assets/javascripts/runner/components/cells/runner_type_cell.vue b/app/assets/javascripts/runner/components/cells/runner_type_cell.vue
index f186a8daf72..c8cb0bf6088 100644
--- a/app/assets/javascripts/runner/components/cells/runner_type_cell.vue
+++ b/app/assets/javascripts/runner/components/cells/runner_type_cell.vue
@@ -1,11 +1,18 @@
<script>
-import { GlBadge } from '@gitlab/ui';
+import { GlTooltipDirective } from '@gitlab/ui';
import RunnerTypeBadge from '../runner_type_badge.vue';
+import RunnerStateLockedBadge from '../runner_state_locked_badge.vue';
+import RunnerStatePausedBadge from '../runner_state_paused_badge.vue';
+import { I18N_LOCKED_RUNNER_DESCRIPTION, I18N_PAUSED_RUNNER_DESCRIPTION } from '../../constants';
export default {
components: {
- GlBadge,
RunnerTypeBadge,
+ RunnerStateLockedBadge,
+ RunnerStatePausedBadge,
+ },
+ directives: {
+ GlTooltip: GlTooltipDirective,
},
props: {
runner: {
@@ -24,19 +31,17 @@ export default {
return !this.runner.active;
},
},
+ i18n: {
+ I18N_LOCKED_RUNNER_DESCRIPTION,
+ I18N_PAUSED_RUNNER_DESCRIPTION,
+ },
};
</script>
<template>
<div>
<runner-type-badge :type="runnerType" size="sm" />
-
- <gl-badge v-if="locked" variant="warning" size="sm">
- {{ s__('Runners|locked') }}
- </gl-badge>
-
- <gl-badge v-if="paused" variant="danger" size="sm">
- {{ s__('Runners|paused') }}
- </gl-badge>
+ <runner-state-locked-badge v-if="locked" size="sm" />
+ <runner-state-paused-badge v-if="paused" size="sm" />
</div>
</template>
diff --git a/app/assets/javascripts/runner/components/runner_list.vue b/app/assets/javascripts/runner/components/runner_list.vue
index 69a1f106ca8..3f6ea389288 100644
--- a/app/assets/javascripts/runner/components/runner_list.vue
+++ b/app/assets/javascripts/runner/components/runner_list.vue
@@ -5,7 +5,7 @@ import { formatNumber, __, s__ } from '~/locale';
import TimeAgo from '~/vue_shared/components/time_ago_tooltip.vue';
import { RUNNER_JOB_COUNT_LIMIT } from '../constants';
import RunnerActionsCell from './cells/runner_actions_cell.vue';
-import RunnerNameCell from './cells/runner_name_cell.vue';
+import RunnerSummaryCell from './cells/runner_summary_cell.vue';
import RunnerTypeCell from './cells/runner_type_cell.vue';
import RunnerTags from './runner_tags.vue';
@@ -35,7 +35,7 @@ export default {
GlSkeletonLoader,
TimeAgo,
RunnerActionsCell,
- RunnerNameCell,
+ RunnerSummaryCell,
RunnerTags,
RunnerTypeCell,
},
@@ -77,7 +77,7 @@ export default {
},
fields: [
tableField({ key: 'type', label: __('Type/State') }),
- tableField({ key: 'name', label: s__('Runners|Runner'), width: 30 }),
+ tableField({ key: 'summary', label: s__('Runners|Runner'), width: 30 }),
tableField({ key: 'version', label: __('Version') }),
tableField({ key: 'ipAddress', label: __('IP Address') }),
tableField({ key: 'projectCount', label: __('Projects'), width: 5 }),
@@ -107,8 +107,12 @@ export default {
<runner-type-cell :runner="item" />
</template>
- <template #cell(name)="{ item }">
- <runner-name-cell :runner="item" />
+ <template #cell(summary)="{ item, index }">
+ <runner-summary-cell :runner="item">
+ <template #runner-name="{ runner }">
+ <slot name="runner-name" :runner="runner" :index="index"></slot>
+ </template>
+ </runner-summary-cell>
</template>
<template #cell(version)="{ item: { version } }">
diff --git a/app/assets/javascripts/runner/components/runner_name.vue b/app/assets/javascripts/runner/components/runner_name.vue
new file mode 100644
index 00000000000..8e495125e03
--- /dev/null
+++ b/app/assets/javascripts/runner/components/runner_name.vue
@@ -0,0 +1,18 @@
+<script>
+import { getIdFromGraphQLId } from '~/graphql_shared/utils';
+
+export default {
+ props: {
+ runner: {
+ type: Object,
+ required: true,
+ },
+ },
+ methods: {
+ getIdFromGraphQLId,
+ },
+};
+</script>
+<template>
+ <span>#{{ getIdFromGraphQLId(runner.id) }} ({{ runner.shortSha }})</span>
+</template>
diff --git a/app/assets/javascripts/runner/components/runner_state_locked_badge.vue b/app/assets/javascripts/runner/components/runner_state_locked_badge.vue
new file mode 100644
index 00000000000..458526010bc
--- /dev/null
+++ b/app/assets/javascripts/runner/components/runner_state_locked_badge.vue
@@ -0,0 +1,25 @@
+<script>
+import { GlBadge, GlTooltipDirective } from '@gitlab/ui';
+import { I18N_LOCKED_RUNNER_DESCRIPTION } from '../constants';
+
+export default {
+ components: {
+ GlBadge,
+ },
+ directives: {
+ GlTooltip: GlTooltipDirective,
+ },
+ i18n: {
+ I18N_LOCKED_RUNNER_DESCRIPTION,
+ },
+};
+</script>
+<template>
+ <gl-badge
+ v-gl-tooltip="$options.i18n.I18N_LOCKED_RUNNER_DESCRIPTION"
+ variant="warning"
+ v-bind="$attrs"
+ >
+ {{ s__('Runners|locked') }}
+ </gl-badge>
+</template>
diff --git a/app/assets/javascripts/runner/components/runner_state_paused_badge.vue b/app/assets/javascripts/runner/components/runner_state_paused_badge.vue
new file mode 100644
index 00000000000..d1e6fa05e4d
--- /dev/null
+++ b/app/assets/javascripts/runner/components/runner_state_paused_badge.vue
@@ -0,0 +1,25 @@
+<script>
+import { GlBadge, GlTooltipDirective } from '@gitlab/ui';
+import { I18N_PAUSED_RUNNER_DESCRIPTION } from '../constants';
+
+export default {
+ components: {
+ GlBadge,
+ },
+ directives: {
+ GlTooltip: GlTooltipDirective,
+ },
+ i18n: {
+ I18N_PAUSED_RUNNER_DESCRIPTION,
+ },
+};
+</script>
+<template>
+ <gl-badge
+ v-gl-tooltip="$options.i18n.I18N_PAUSED_RUNNER_DESCRIPTION"
+ variant="danger"
+ v-bind="$attrs"
+ >
+ {{ s__('Runners|paused') }}
+ </gl-badge>
+</template>
diff --git a/app/assets/javascripts/runner/components/runner_type_badge.vue b/app/assets/javascripts/runner/components/runner_type_badge.vue
index c2f43daa899..1a61b80184b 100644
--- a/app/assets/javascripts/runner/components/runner_type_badge.vue
+++ b/app/assets/javascripts/runner/components/runner_type_badge.vue
@@ -1,20 +1,30 @@
<script>
-import { GlBadge } from '@gitlab/ui';
+import { GlBadge, GlTooltipDirective } from '@gitlab/ui';
import { s__ } from '~/locale';
-import { INSTANCE_TYPE, GROUP_TYPE, PROJECT_TYPE } from '../constants';
+import {
+ INSTANCE_TYPE,
+ GROUP_TYPE,
+ PROJECT_TYPE,
+ I18N_INSTANCE_RUNNER_DESCRIPTION,
+ I18N_GROUP_RUNNER_DESCRIPTION,
+ I18N_PROJECT_RUNNER_DESCRIPTION,
+} from '../constants';
const BADGE_DATA = {
[INSTANCE_TYPE]: {
variant: 'success',
text: s__('Runners|shared'),
+ tooltip: I18N_INSTANCE_RUNNER_DESCRIPTION,
},
[GROUP_TYPE]: {
variant: 'success',
text: s__('Runners|group'),
+ tooltip: I18N_GROUP_RUNNER_DESCRIPTION,
},
[PROJECT_TYPE]: {
variant: 'info',
text: s__('Runners|specific'),
+ tooltip: I18N_PROJECT_RUNNER_DESCRIPTION,
},
};
@@ -22,6 +32,9 @@ export default {
components: {
GlBadge,
},
+ directives: {
+ GlTooltip: GlTooltipDirective,
+ },
props: {
type: {
type: String,
@@ -40,7 +53,7 @@ export default {
};
</script>
<template>
- <gl-badge v-if="badge" :variant="badge.variant" v-bind="$attrs">
+ <gl-badge v-if="badge" v-gl-tooltip="badge.tooltip" :variant="badge.variant" v-bind="$attrs">
{{ badge.text }}
</gl-badge>
</template>
diff --git a/app/assets/javascripts/runner/components/runner_type_help.vue b/app/assets/javascripts/runner/components/runner_type_help.vue
deleted file mode 100644
index 70456b3ab65..00000000000
--- a/app/assets/javascripts/runner/components/runner_type_help.vue
+++ /dev/null
@@ -1,60 +0,0 @@
-<script>
-import { GlBadge } from '@gitlab/ui';
-import { INSTANCE_TYPE, GROUP_TYPE, PROJECT_TYPE } from '../constants';
-import RunnerTypeBadge from './runner_type_badge.vue';
-
-export default {
- components: {
- GlBadge,
- RunnerTypeBadge,
- },
- runnerTypes: {
- INSTANCE_TYPE,
- GROUP_TYPE,
- PROJECT_TYPE,
- },
-};
-</script>
-
-<template>
- <div class="bs-callout">
- <p>{{ __('Runners are processes that pick up and execute CI/CD jobs for GitLab.') }}</p>
- <p>
- {{
- __(
- 'You can register runners as separate users, on separate servers, and on your local machine. Register as many runners as you want.',
- )
- }}
- </p>
-
- <div>
- <span> {{ __('Runners can be:') }}</span>
- <ul>
- <li>
- <runner-type-badge :type="$options.runnerTypes.INSTANCE_TYPE" size="sm" />
- - {{ __('Runs jobs from all unassigned projects.') }}
- </li>
- <li>
- <runner-type-badge :type="$options.runnerTypes.GROUP_TYPE" size="sm" />
- - {{ __('Runs jobs from all unassigned projects in its group.') }}
- </li>
- <li>
- <runner-type-badge :type="$options.runnerTypes.PROJECT_TYPE" size="sm" />
- - {{ __('Runs jobs from assigned projects.') }}
- </li>
- <li>
- <gl-badge variant="warning" size="sm">
- {{ s__('Runners|locked') }}
- </gl-badge>
- - {{ __('Cannot be assigned to other projects.') }}
- </li>
- <li>
- <gl-badge variant="danger" size="sm">
- {{ s__('Runners|paused') }}
- </gl-badge>
- - {{ __('Not available to run jobs.') }}
- </li>
- </ul>
- </div>
- </div>
-</template>
diff --git a/app/assets/javascripts/runner/constants.js b/app/assets/javascripts/runner/constants.js
index 46e55b322c7..a2fb9d9efd8 100644
--- a/app/assets/javascripts/runner/constants.js
+++ b/app/assets/javascripts/runner/constants.js
@@ -7,6 +7,14 @@ export const GROUP_RUNNER_COUNT_LIMIT = 1000;
export const I18N_FETCH_ERROR = s__('Runners|Something went wrong while fetching runner data.');
export const I18N_DETAILS_TITLE = s__('Runners|Runner #%{runner_id}');
+export const I18N_INSTANCE_RUNNER_DESCRIPTION = s__('Runners|Available to all projects');
+export const I18N_GROUP_RUNNER_DESCRIPTION = s__(
+ 'Runners|Available to all projects and subgroups in the group',
+);
+export const I18N_PROJECT_RUNNER_DESCRIPTION = s__('Runners|Associated with one or more projects');
+export const I18N_LOCKED_RUNNER_DESCRIPTION = s__('Runners|You cannot assign to other projects');
+export const I18N_PAUSED_RUNNER_DESCRIPTION = s__('Runners|Not available to run jobs');
+
export const RUNNER_TAG_BADGE_VARIANT = 'info';
export const RUNNER_TAG_BG_CLASS = 'gl-bg-blue-100';
diff --git a/app/assets/javascripts/runner/graphql/get_group_runners.query.graphql b/app/assets/javascripts/runner/graphql/get_group_runners.query.graphql
index a601ee8d611..3e5109b1ac4 100644
--- a/app/assets/javascripts/runner/graphql/get_group_runners.query.graphql
+++ b/app/assets/javascripts/runner/graphql/get_group_runners.query.graphql
@@ -24,8 +24,11 @@ query getGroupRunners(
search: $search
sort: $sort
) {
- nodes {
- ...RunnerNode
+ edges {
+ webUrl
+ node {
+ ...RunnerNode
+ }
}
pageInfo {
...PageInfo
diff --git a/app/assets/javascripts/runner/graphql/get_runners.query.graphql b/app/assets/javascripts/runner/graphql/get_runners.query.graphql
index 9f837197558..51a91b9eb96 100644
--- a/app/assets/javascripts/runner/graphql/get_runners.query.graphql
+++ b/app/assets/javascripts/runner/graphql/get_runners.query.graphql
@@ -25,6 +25,7 @@ query getRunners(
) {
nodes {
...RunnerNode
+ adminUrl
}
pageInfo {
...PageInfo
diff --git a/app/assets/javascripts/runner/group_runners/group_runners_app.vue b/app/assets/javascripts/runner/group_runners/group_runners_app.vue
index 42e1a9e1de9..4bb28796dfa 100644
--- a/app/assets/javascripts/runner/group_runners/group_runners_app.vue
+++ b/app/assets/javascripts/runner/group_runners/group_runners_app.vue
@@ -1,13 +1,16 @@
<script>
+import { GlLink } from '@gitlab/ui';
import createFlash from '~/flash';
import { fetchPolicies } from '~/lib/graphql';
import { updateHistory } from '~/lib/utils/url_utility';
import { formatNumber, sprintf, s__ } from '~/locale';
+
import RunnerFilteredSearchBar from '../components/runner_filtered_search_bar.vue';
import RunnerList from '../components/runner_list.vue';
import RunnerManualSetupHelp from '../components/runner_manual_setup_help.vue';
+import RunnerName from '../components/runner_name.vue';
import RunnerPagination from '../components/runner_pagination.vue';
-import RunnerTypeHelp from '../components/runner_type_help.vue';
+
import { statusTokenConfig } from '../components/search_tokens/status_token_config';
import { typeTokenConfig } from '../components/search_tokens/type_token_config';
import {
@@ -27,10 +30,11 @@ import { captureException } from '../sentry_utils';
export default {
name: 'GroupRunnersApp',
components: {
+ GlLink,
RunnerFilteredSearchBar,
RunnerList,
RunnerManualSetupHelp,
- RunnerTypeHelp,
+ RunnerName,
RunnerPagination,
},
props: {
@@ -51,6 +55,7 @@ export default {
return {
search: fromUrlQueryToSearch(),
runners: {
+ webUrls: [],
items: [],
pageInfo: {},
},
@@ -68,8 +73,10 @@ export default {
},
update(data) {
const { runners } = data?.group || {};
+
return {
- items: runners?.nodes || [],
+ webUrls: runners?.edges.map(({ webUrl }) => webUrl) || [],
+ items: runners?.edges.map(({ node }) => node) || [],
pageInfo: runners?.pageInfo || {},
};
},
@@ -137,17 +144,7 @@ export default {
<template>
<div>
- <div class="row">
- <div class="col-sm-6">
- <runner-type-help />
- </div>
- <div class="col-sm-6">
- <runner-manual-setup-help
- :registration-token="registrationToken"
- :type="$options.GROUP_TYPE"
- />
- </div>
- </div>
+ <runner-manual-setup-help :registration-token="registrationToken" :type="$options.GROUP_TYPE" />
<runner-filtered-search-bar
v-model="search"
@@ -163,7 +160,13 @@ export default {
{{ __('No runners found') }}
</div>
<template v-else>
- <runner-list :runners="runners.items" :loading="runnersLoading" />
+ <runner-list :runners="runners.items" :loading="runnersLoading">
+ <template #runner-name="{ runner, index }">
+ <gl-link :href="runners.webUrls[index]">
+ <runner-name :runner="runner" />
+ </gl-link>
+ </template>
+ </runner-list>
<runner-pagination v-model="search.pagination" :page-info="runners.pageInfo" />
</template>
</div>
diff --git a/app/assets/javascripts/search_settings/components/search_settings.vue b/app/assets/javascripts/search_settings/components/search_settings.vue
index 116967a62c8..3e23b8a3435 100644
--- a/app/assets/javascripts/search_settings/components/search_settings.vue
+++ b/app/assets/javascripts/search_settings/components/search_settings.vue
@@ -1,7 +1,13 @@
<script>
import { GlSearchBoxByType } from '@gitlab/ui';
-import { uniq } from 'lodash';
-import { EXCLUDED_NODES, HIDE_CLASS, HIGHLIGHT_CLASS, TYPING_DELAY } from '../constants';
+import { uniq, escapeRegExp } from 'lodash';
+import {
+ EXCLUDED_NODES,
+ HIDE_CLASS,
+ HIGHLIGHT_CLASS,
+ NONE_PADDING_CLASS,
+ TYPING_DELAY,
+} from '../constants';
const origExpansions = new Map();
@@ -37,9 +43,13 @@ const resetSections = ({ sectionSelector }) => {
};
const clearHighlights = () => {
- document
- .querySelectorAll(`.${HIGHLIGHT_CLASS}`)
- .forEach((element) => element.classList.remove(HIGHLIGHT_CLASS));
+ document.querySelectorAll(`.${HIGHLIGHT_CLASS}`).forEach((element) => {
+ const { parentNode } = element;
+ const textNode = document.createTextNode(element.textContent);
+ parentNode.replaceChild(textNode, element);
+
+ parentNode.normalize();
+ });
};
const hideSectionsExcept = (sectionSelector, visibleSections) => {
@@ -50,17 +60,41 @@ const hideSectionsExcept = (sectionSelector, visibleSections) => {
});
};
-const highlightElements = (elements = []) => {
- elements.forEach((element) => element.classList.add(HIGHLIGHT_CLASS));
+const transformMatchElement = (element, searchTerm) => {
+ const textStr = element.textContent;
+ const escapedSearchTerm = new RegExp(`(${escapeRegExp(searchTerm)})`, 'gi');
+
+ const textList = textStr.split(escapedSearchTerm);
+ const replaceFragment = document.createDocumentFragment();
+ textList.forEach((text) => {
+ let addElement = document.createTextNode(text);
+ if (escapedSearchTerm.test(text)) {
+ addElement = document.createElement('mark');
+ addElement.className = `${HIGHLIGHT_CLASS} ${NONE_PADDING_CLASS}`;
+ addElement.textContent = text;
+ escapedSearchTerm.lastIndex = 0;
+ }
+ replaceFragment.appendChild(addElement);
+ });
+
+ return replaceFragment;
+};
+
+const highlightElements = (elements = [], searchTerm) => {
+ elements.forEach((element) => {
+ const replaceFragment = transformMatchElement(element, searchTerm);
+ element.innerHTML = '';
+ element.appendChild(replaceFragment);
+ });
};
-const displayResults = ({ sectionSelector, expandSection }, matches) => {
+const displayResults = ({ sectionSelector, expandSection, searchTerm }, matches) => {
const elements = matches.map((match) => match.parentElement);
const sections = uniq(elements.map((element) => findSettingsSection(sectionSelector, element)));
hideSectionsExcept(sectionSelector, sections);
sections.forEach(expandSection);
- highlightElements(elements);
+ highlightElements(elements, searchTerm);
};
const clearResults = (params) => {
@@ -116,21 +150,21 @@ export default {
},
methods: {
search(value) {
+ this.searchTerm = value;
const displayOptions = {
sectionSelector: this.sectionSelector,
expandSection: this.expandSection,
collapseSection: this.collapseSection,
isExpanded: this.isExpandedFn,
+ searchTerm: this.searchTerm,
};
- this.searchTerm = value;
-
clearResults(displayOptions);
if (value.length) {
saveExpansionState(document.querySelectorAll(this.sectionSelector), displayOptions);
- displayResults(displayOptions, search(this.searchRoot, value));
+ displayResults(displayOptions, search(this.searchRoot, this.searchTerm));
} else {
restoreExpansionState(displayOptions);
}
diff --git a/app/assets/javascripts/search_settings/constants.js b/app/assets/javascripts/search_settings/constants.js
index 9452d149122..a49351dc7b0 100644
--- a/app/assets/javascripts/search_settings/constants.js
+++ b/app/assets/javascripts/search_settings/constants.js
@@ -7,5 +7,8 @@ export const HIDE_CLASS = 'gl-display-none';
// used to highlight the text that matches the * search term
export const HIGHLIGHT_CLASS = 'gl-bg-orange-100';
+// used to remove padding for text that matches the * search term
+export const NONE_PADDING_CLASS = 'gl-p-0';
+
// How many seconds to wait until the user * stops typing
export const TYPING_DELAY = 400;
diff --git a/app/assets/javascripts/security_configuration/components/feature_card.vue b/app/assets/javascripts/security_configuration/components/feature_card.vue
index 0ecfdf420db..86afdbfeb8c 100644
--- a/app/assets/javascripts/security_configuration/components/feature_card.vue
+++ b/app/assets/javascripts/security_configuration/components/feature_card.vue
@@ -128,6 +128,7 @@ export default {
variant="confirm"
category="primary"
class="gl-mt-5"
+ :data-qa-selector="`${feature.type}_mr_button`"
/>
<gl-button
diff --git a/app/assets/javascripts/sidebar/components/assignees/uncollapsed_assignee_list.vue b/app/assets/javascripts/sidebar/components/assignees/uncollapsed_assignee_list.vue
index b7080bb05b8..c2ca87af9ce 100644
--- a/app/assets/javascripts/sidebar/components/assignees/uncollapsed_assignee_list.vue
+++ b/app/assets/javascripts/sidebar/components/assignees/uncollapsed_assignee_list.vue
@@ -82,8 +82,12 @@ export default {
</div>
</assignee-avatar-link>
<div v-else>
- <div class="user-list">
- <div v-for="user in uncollapsedUsers" :key="user.id" class="user-item">
+ <div class="gl-display-flex gl-flex-wrap">
+ <div
+ v-for="user in uncollapsedUsers"
+ :key="user.id"
+ class="user-item gl-display-inline-block"
+ >
<assignee-avatar-link :user="user" :issuable-type="issuableType" />
</div>
</div>
diff --git a/app/assets/javascripts/sidebar/components/labels/sidebar_labels.vue b/app/assets/javascripts/sidebar/components/labels/sidebar_labels.vue
index 9fdf941579d..d5647619ea3 100644
--- a/app/assets/javascripts/sidebar/components/labels/sidebar_labels.vue
+++ b/app/assets/javascripts/sidebar/components/labels/sidebar_labels.vue
@@ -36,6 +36,7 @@ export default {
'allowLabelEdit',
'allowScopedLabels',
'iid',
+ 'fullPath',
'initiallySelectedLabels',
'issuableType',
'labelsFetchPath',
@@ -53,30 +54,32 @@ export default {
handleDropdownClose() {
$(this.$el).trigger('hidden.gl.dropdown');
},
- getUpdateVariables(dropdownLabels) {
- const currentLabelIds = this.selectedLabels.map((label) => label.id);
- const dropdownLabelIds = dropdownLabels.map((label) => label.id);
- const userAddedLabelIds = this.glFeatures.labelsWidget
- ? difference(dropdownLabelIds, currentLabelIds)
- : dropdownLabels.filter((label) => label.set).map((label) => label.id);
- const userRemovedLabelIds = this.glFeatures.labelsWidget
- ? difference(currentLabelIds, dropdownLabelIds)
- : dropdownLabels.filter((label) => !label.set).map((label) => label.id);
+ getUpdateVariables(labels) {
+ let labelIds = [];
- const labelIds = difference(union(currentLabelIds, userAddedLabelIds), userRemovedLabelIds);
+ if (this.glFeatures.labelsWidget) {
+ labelIds = labels.map(({ id }) => toLabelGid(id));
+ } else {
+ const currentLabelIds = this.selectedLabels.map((label) => label.id);
+ const userAddedLabelIds = labels.filter((label) => label.set).map((label) => label.id);
+ const userRemovedLabelIds = labels.filter((label) => !label.set).map((label) => label.id);
+
+ labelIds = difference(union(currentLabelIds, userAddedLabelIds), userRemovedLabelIds).map(
+ toLabelGid,
+ );
+ }
switch (this.issuableType) {
case IssuableType.Issue:
return {
- addLabelIds: userAddedLabelIds,
iid: this.iid,
projectPath: this.projectPath,
- removeLabelIds: userRemovedLabelIds,
+ labelIds,
};
case IssuableType.MergeRequest:
return {
iid: this.iid,
- labelIds: labelIds.map(toLabelGid),
+ labelIds,
operationMode: MutationOperationMode.Replace,
projectPath: this.projectPath,
};
@@ -143,6 +146,8 @@ export default {
<labels-select-widget
v-if="glFeatures.labelsWidget"
class="block labels js-labels-block"
+ :iid="iid"
+ :full-path="fullPath"
:allow-label-remove="allowLabelEdit"
:allow-multiselect="true"
:footer-create-label-title="__('Create project label')"
@@ -152,8 +157,8 @@ export default {
:labels-select-in-progress="isLabelsSelectInProgress"
:selected-labels="selectedLabels"
:variant="$options.variant"
+ :issuable-type="issuableType"
data-qa-selector="labels_block"
- @onDropdownClose="handleDropdownClose"
@onLabelRemove="handleLabelRemove"
@updateSelectedLabels="handleUpdateSelectedLabels"
>
diff --git a/app/assets/javascripts/sidebar/components/participants/participants.vue b/app/assets/javascripts/sidebar/components/participants/participants.vue
index ad4bfe5b665..4a255a3b916 100644
--- a/app/assets/javascripts/sidebar/components/participants/participants.vue
+++ b/app/assets/javascripts/sidebar/components/participants/participants.vue
@@ -104,11 +104,11 @@ export default {
<gl-loading-icon v-if="loading" size="sm" :inline="true" />
{{ participantLabel }}
</div>
- <div class="participants-list hide-collapsed">
+ <div class="hide-collapsed gl-display-flex gl-flex-wrap">
<div
v-for="participant in visibleParticipants"
:key="participant.id"
- class="participants-author"
+ class="participants-author gl-display-inline-block gl-pr-3 gl-pb-3"
>
<a :href="participant.web_url || participant.webUrl" class="author-link">
<user-avatar-image
diff --git a/app/assets/javascripts/sidebar/components/reviewers/reviewer_avatar_link.vue b/app/assets/javascripts/sidebar/components/reviewers/reviewer_avatar_link.vue
index 87780888c2f..361a082def6 100644
--- a/app/assets/javascripts/sidebar/components/reviewers/reviewer_avatar_link.vue
+++ b/app/assets/javascripts/sidebar/components/reviewers/reviewer_avatar_link.vue
@@ -77,7 +77,7 @@ export default {
>
<!-- use d-flex so that slot can be appropriately styled -->
<span class="gl-display-flex gl-align-items-center">
- <reviewer-avatar :user="user" :img-size="24" :issuable-type="issuableType" />
+ <reviewer-avatar :user="user" :img-size="32" :issuable-type="issuableType" />
<slot :user="user"></slot>
</span>
</gl-link>
diff --git a/app/assets/javascripts/sidebar/components/reviewers/uncollapsed_reviewer_list.vue b/app/assets/javascripts/sidebar/components/reviewers/uncollapsed_reviewer_list.vue
index c6fef86c6ff..2922008cfb2 100644
--- a/app/assets/javascripts/sidebar/components/reviewers/uncollapsed_reviewer_list.vue
+++ b/app/assets/javascripts/sidebar/components/reviewers/uncollapsed_reviewer_list.vue
@@ -91,7 +91,10 @@ export default {
data-testid="reviewer"
>
<reviewer-avatar-link :user="user" :root-path="rootPath" :issuable-type="issuableType">
- <div class="gl-ml-3">@{{ user.username }}</div>
+ <div class="gl-ml-3 gl-line-height-normal gl-display-grid">
+ <span>{{ user.name }}</span>
+ <span>@{{ user.username }}</span>
+ </div>
</reviewer-avatar-link>
<gl-icon
v-if="user.approved"
diff --git a/app/assets/javascripts/sidebar/components/time_tracking/comparison_pane.vue b/app/assets/javascripts/sidebar/components/time_tracking/comparison_pane.vue
index 3705d725a15..7b4be659330 100644
--- a/app/assets/javascripts/sidebar/components/time_tracking/comparison_pane.vue
+++ b/app/assets/javascripts/sidebar/components/time_tracking/comparison_pane.vue
@@ -83,13 +83,15 @@ export default {
:value="timeRemainingPercent"
:variant="progressBarVariant"
/>
- <div class="compare-display-container">
- <div class="compare-display float-left">
- <span class="compare-label">{{ s__('TimeTracking|Spent') }}</span>
+ <div
+ class="compare-display-container gl-display-flex gl-justify-content-space-between gl-mt-2"
+ >
+ <div class="gl-float-left">
+ <span class="gl-text-gray-400">{{ s__('TimeTracking|Spent') }}</span>
<span class="compare-value spent">{{ timeSpentHumanReadable }}</span>
</div>
- <div class="compare-display estimated float-right">
- <span class="compare-label">{{ s__('TimeTrackingEstimated|Est') }}</span>
+ <div class="estimated gl-float-right">
+ <span class="gl-text-gray-400">{{ s__('TimeTrackingEstimated|Est') }}</span>
<span class="compare-value">{{ timeEstimateHumanReadable }}</span>
</div>
</div>
diff --git a/app/assets/javascripts/sidebar/components/time_tracking/spent_only_pane.vue b/app/assets/javascripts/sidebar/components/time_tracking/spent_only_pane.vue
index db2197ec65e..4564a48fa2d 100644
--- a/app/assets/javascripts/sidebar/components/time_tracking/spent_only_pane.vue
+++ b/app/assets/javascripts/sidebar/components/time_tracking/spent_only_pane.vue
@@ -1,30 +1,31 @@
<script>
-import { sprintf, s__ } from '~/locale';
+import { GlSprintf } from '@gitlab/ui';
+import { s__ } from '~/locale';
+
+const timeSpent = s__('TimeTracking|%{spentStart}Spent: %{spentEnd}');
export default {
name: 'TimeTrackingSpentOnlyPane',
+ timeSpent,
+ components: {
+ GlSprintf,
+ },
props: {
timeSpentHumanReadable: {
type: String,
required: true,
},
},
- computed: {
- timeSpent() {
- return sprintf(
- s__('TimeTracking|%{startTag}Spent: %{endTag}%{timeSpentHumanReadable}'),
- {
- startTag: '<span class="gl-font-weight-bold">',
- endTag: '</span>',
- timeSpentHumanReadable: this.timeSpentHumanReadable,
- },
- false,
- );
- },
- },
};
</script>
<template>
- <div data-testid="spentOnlyPane" v-html="timeSpent /* eslint-disable-line vue/no-v-html */"></div>
+ <div data-testid="spentOnlyPane">
+ <gl-sprintf :message="$options.timeSpent">
+ <template #spent="{ content }">
+ <span class="gl-font-weight-bold">{{ content }}</span
+ >{{ timeSpentHumanReadable }}
+ </template>
+ </gl-sprintf>
+ </div>
</template>
diff --git a/app/assets/javascripts/sidebar/components/todo_toggle/todo.vue b/app/assets/javascripts/sidebar/components/todo_toggle/todo.vue
index f7e76cc2b7f..d5782e4b371 100644
--- a/app/assets/javascripts/sidebar/components/todo_toggle/todo.vue
+++ b/app/assets/javascripts/sidebar/components/todo_toggle/todo.vue
@@ -41,7 +41,7 @@ export default {
computed: {
buttonClasses() {
return this.collapsed
- ? 'btn-blank btn-todo sidebar-collapsed-icon dont-change-state'
+ ? 'btn-blank btn-todo sidebar-collapsed-icon js-dont-change-state'
: 'gl-button btn btn-default btn-todo issuable-header-btn float-right';
},
buttonLabel() {
diff --git a/app/assets/javascripts/sidebar/constants.js b/app/assets/javascripts/sidebar/constants.js
index fd43fb80b7f..e593973da82 100644
--- a/app/assets/javascripts/sidebar/constants.js
+++ b/app/assets/javascripts/sidebar/constants.js
@@ -31,6 +31,10 @@ import updateIssueSubscriptionMutation from '~/sidebar/queries/update_issue_subs
import mergeRequestMilestoneMutation from '~/sidebar/queries/update_merge_request_milestone.mutation.graphql';
import updateMergeRequestSubscriptionMutation from '~/sidebar/queries/update_merge_request_subscription.mutation.graphql';
import updateAlertAssigneesMutation from '~/vue_shared/alert_details/graphql/mutations/alert_set_assignees.mutation.graphql';
+import epicLabelsQuery from '~/vue_shared/components/sidebar/labels_select_widget/graphql/epic_labels.query.graphql';
+import groupLabelsQuery from '~/vue_shared/components/sidebar/labels_select_widget/graphql/group_labels.query.graphql';
+import issueLabelsQuery from '~/vue_shared/components/sidebar/labels_select_widget/graphql/issue_labels.query.graphql';
+import projectLabelsQuery from '~/vue_shared/components/sidebar/labels_select_widget/graphql/project_labels.query.graphql';
import getAlertAssignees from '~/vue_shared/components/sidebar/queries/get_alert_assignees.query.graphql';
import getIssueAssignees from '~/vue_shared/components/sidebar/queries/get_issue_assignees.query.graphql';
import issueParticipantsQuery from '~/vue_shared/components/sidebar/queries/get_issue_participants.query.graphql';
@@ -105,6 +109,17 @@ export const referenceQueries = {
},
};
+export const labelsQueries = {
+ [IssuableType.Issue]: {
+ issuableQuery: issueLabelsQuery,
+ workspaceQuery: projectLabelsQuery,
+ },
+ [IssuableType.Epic]: {
+ issuableQuery: epicLabelsQuery,
+ workspaceQuery: groupLabelsQuery,
+ },
+};
+
export const dateTypes = {
start: 'startDate',
due: 'dueDate',
diff --git a/app/assets/javascripts/sidebar/mount_sidebar.js b/app/assets/javascripts/sidebar/mount_sidebar.js
index 10ab80f4ec2..9f5a2f4ebb0 100644
--- a/app/assets/javascripts/sidebar/mount_sidebar.js
+++ b/app/assets/javascripts/sidebar/mount_sidebar.js
@@ -241,6 +241,7 @@ function mountMilestoneSelect() {
export function mountSidebarLabels() {
const el = document.querySelector('.js-sidebar-labels');
+ const { fullPath } = getSidebarOptions();
if (!el) {
return false;
@@ -251,6 +252,7 @@ export function mountSidebarLabels() {
apolloProvider,
provide: {
...el.dataset,
+ fullPath,
allowLabelCreate: parseBoolean(el.dataset.allowLabelCreate),
allowLabelEdit: parseBoolean(el.dataset.canEdit),
allowScopedLabels: parseBoolean(el.dataset.allowScopedLabels),
diff --git a/app/assets/javascripts/snippets/components/snippet_description_view.vue b/app/assets/javascripts/snippets/components/snippet_description_view.vue
index 62d95a650da..737a131ce7c 100644
--- a/app/assets/javascripts/snippets/components/snippet_description_view.vue
+++ b/app/assets/javascripts/snippets/components/snippet_description_view.vue
@@ -1,10 +1,14 @@
<script>
+import { GlSafeHtmlDirective as SafeHtml } from '@gitlab/ui';
import MarkdownFieldView from '~/vue_shared/components/markdown/field_view.vue';
export default {
components: {
MarkdownFieldView,
},
+ directives: {
+ SafeHtml,
+ },
props: {
description: {
type: String,
@@ -12,13 +16,14 @@ export default {
default: '',
},
},
+ safeHtmlConfig: { ADD_TAGS: ['gl-emoji'] },
};
</script>
<template>
<markdown-field-view class="snippet-description" data-qa-selector="snippet_description_content">
<div
+ v-safe-html:[$options.safeHtmlConfig]="description"
class="md js-snippet-description"
- v-html="description /* eslint-disable-line vue/no-v-html */"
></div>
</markdown-field-view>
</template>
diff --git a/app/assets/javascripts/snippets/components/snippet_header.vue b/app/assets/javascripts/snippets/components/snippet_header.vue
index 466b273cae4..a5c98a7ad90 100644
--- a/app/assets/javascripts/snippets/components/snippet_header.vue
+++ b/app/assets/javascripts/snippets/components/snippet_header.vue
@@ -11,15 +11,26 @@ import {
GlButton,
GlTooltipDirective,
} from '@gitlab/ui';
+import { isEmpty } from 'lodash';
import CanCreateProjectSnippet from 'shared_queries/snippet/project_permissions.query.graphql';
import CanCreatePersonalSnippet from 'shared_queries/snippet/user_permissions.query.graphql';
import { fetchPolicies } from '~/lib/graphql';
+import axios from '~/lib/utils/axios_utils';
import { joinPaths } from '~/lib/utils/url_utility';
-import { __ } from '~/locale';
+import { __, s__, sprintf } from '~/locale';
import TimeAgoTooltip from '~/vue_shared/components/time_ago_tooltip.vue';
+import createFlash, { FLASH_TYPES } from '~/flash';
import DeleteSnippetMutation from '../mutations/deleteSnippet.mutation.graphql';
+export const i18n = {
+ snippetSpamSuccess: sprintf(
+ s__('Snippets|%{spammable_titlecase} was submitted to Akismet successfully.'),
+ { spammable_titlecase: __('Snippet') },
+ ),
+ snippetSpamFailure: s__('Snippets|Error with Akismet. Please check the logs for more info.'),
+};
+
export default {
components: {
GlAvatar,
@@ -54,7 +65,7 @@ export default {
},
},
},
- inject: ['reportAbusePath'],
+ inject: ['reportAbusePath', 'canReportSpam'],
props: {
snippet: {
type: Object,
@@ -63,7 +74,8 @@ export default {
},
data() {
return {
- isDeleting: false,
+ isLoading: false,
+ isSubmittingSpam: false,
errorMessage: '',
canCreateSnippet: false,
};
@@ -105,10 +117,11 @@ export default {
category: 'secondary',
},
{
- condition: this.reportAbusePath,
+ condition: this.canReportSpam && !isEmpty(this.reportAbusePath),
text: __('Submit as spam'),
- href: this.reportAbusePath,
+ click: this.submitAsSpam,
title: __('Submit as spam'),
+ loading: this.isSubmittingSpam,
},
];
},
@@ -157,7 +170,7 @@ export default {
this.$refs.deleteModal.show();
},
deleteSnippet() {
- this.isDeleting = true;
+ this.isLoading = true;
this.$apollo
.mutate({
mutation: DeleteSnippetMutation,
@@ -167,17 +180,34 @@ export default {
if (data?.destroySnippet?.errors.length) {
throw new Error(data?.destroySnippet?.errors[0]);
}
- this.isDeleting = false;
this.errorMessage = undefined;
this.closeDeleteModal();
this.redirectToSnippets();
})
.catch((err) => {
- this.isDeleting = false;
+ this.isLoading = false;
this.errorMessage = err.message;
+ })
+ .finally(() => {
+ this.isLoading = false;
+ });
+ },
+ async submitAsSpam() {
+ try {
+ this.isSubmittingSpam = true;
+ await axios.post(this.reportAbusePath);
+ createFlash({
+ message: this.$options.i18n.snippetSpamSuccess,
+ type: FLASH_TYPES.SUCCESS,
});
+ } catch (error) {
+ createFlash({ message: this.$options.i18n.snippetSpamFailure });
+ } finally {
+ this.isSubmittingSpam = false;
+ }
},
},
+ i18n,
};
</script>
<template>
@@ -189,9 +219,7 @@ export default {
:title="snippetVisibilityLevelDescription"
data-container="body"
>
- <span class="sr-only">
- {{ s__(`VisibilityLevel|${visibility}`) }}
- </span>
+ <span class="sr-only">{{ s__(`VisibilityLevel|${visibility}`) }}</span>
<gl-icon :name="visibilityLevelIcon" :size="14" />
</div>
<div class="creator" data-testid="authored-message">
@@ -233,6 +261,7 @@ export default {
>
<gl-button
:disabled="action.disabled"
+ :loading="action.loading"
:variant="action.variant"
:category="action.category"
:class="action.cssClass"
@@ -240,9 +269,8 @@ export default {
data-qa-selector="snippet_action_button"
:data-qa-action="action.text"
@click="action.click ? action.click() : undefined"
+ >{{ action.text }}</gl-button
>
- {{ action.text }}
- </gl-button>
</div>
</template>
</div>
@@ -266,14 +294,14 @@ export default {
<gl-modal ref="deleteModal" modal-id="delete-modal" title="Example title">
<template #modal-title>{{ __('Delete snippet?') }}</template>
- <gl-alert v-if="errorMessage" variant="danger" class="mb-2" @dismiss="errorMessage = ''">{{
- errorMessage
- }}</gl-alert>
+ <gl-alert v-if="errorMessage" variant="danger" class="mb-2" @dismiss="errorMessage = ''">
+ {{ errorMessage }}
+ </gl-alert>
<gl-sprintf :message="__('Are you sure you want to delete %{name}?')">
- <template #name
- ><strong>{{ snippet.title }}</strong></template
- >
+ <template #name>
+ <strong>{{ snippet.title }}</strong>
+ </template>
</gl-sprintf>
<template #modal-footer>
@@ -281,11 +309,11 @@ export default {
<gl-button
variant="danger"
category="primary"
- :disabled="isDeleting"
+ :disabled="isLoading"
data-qa-selector="delete_snippet_button"
@click="deleteSnippet"
>
- <gl-loading-icon v-if="isDeleting" size="sm" inline />
+ <gl-loading-icon v-if="isLoading" size="sm" inline />
{{ __('Delete snippet') }}
</gl-button>
</template>
diff --git a/app/assets/javascripts/snippets/index.js b/app/assets/javascripts/snippets/index.js
index dec8dcec179..8e7368ef804 100644
--- a/app/assets/javascripts/snippets/index.js
+++ b/app/assets/javascripts/snippets/index.js
@@ -27,6 +27,7 @@ export default function appFactory(el, Component) {
visibilityLevels = '[]',
selectedLevel,
multipleLevelsRestricted,
+ canReportSpam,
reportAbusePath,
...restDataset
} = el.dataset;
@@ -39,6 +40,7 @@ export default function appFactory(el, Component) {
selectedLevel: SNIPPET_LEVELS_MAP[selectedLevel] ?? SNIPPET_VISIBILITY_PRIVATE,
multipleLevelsRestricted: 'multipleLevelsRestricted' in el.dataset,
reportAbusePath,
+ canReportSpam,
},
render(createElement) {
return createElement(Component, {
diff --git a/app/assets/javascripts/token_access/index.js b/app/assets/javascripts/token_access/index.js
index 6a29883290a..8d29a65d705 100644
--- a/app/assets/javascripts/token_access/index.js
+++ b/app/assets/javascripts/token_access/index.js
@@ -6,7 +6,7 @@ import TokenAccess from './components/token_access.vue';
Vue.use(VueApollo);
const apolloProvider = new VueApollo({
- defaultClient: createDefaultClient(),
+ defaultClient: createDefaultClient({}, { assumeImmutableResults: true }),
});
export const initTokenAccess = (containerId = 'js-ci-token-access-app') => {
diff --git a/app/assets/javascripts/tracking/constants.js b/app/assets/javascripts/tracking/constants.js
index 062a3404355..2593fbe6ed1 100644
--- a/app/assets/javascripts/tracking/constants.js
+++ b/app/assets/javascripts/tracking/constants.js
@@ -22,9 +22,8 @@ export const DEFAULT_SNOWPLOW_OPTIONS = {
export const ACTION_ATTR_SELECTOR = '[data-track-action]';
export const LOAD_ACTION_ATTR_SELECTOR = '[data-track-action="render"]';
-export const DEPRECATED_EVENT_ATTR_SELECTOR = '[data-track-event]';
-export const DEPRECATED_LOAD_EVENT_ATTR_SELECTOR = '[data-track-event="render"]';
-
export const URLS_CACHE_STORAGE_KEY = 'gl-snowplow-pseudonymized-urls';
export const REFERRER_TTL = 24 * 60 * 60 * 1000;
+
+export const GOOGLE_ANALYTICS_ID_COOKIE_NAME = '_ga';
diff --git a/app/assets/javascripts/tracking/get_standard_context.js b/app/assets/javascripts/tracking/get_standard_context.js
index c318029323d..6014f1ba3ee 100644
--- a/app/assets/javascripts/tracking/get_standard_context.js
+++ b/app/assets/javascripts/tracking/get_standard_context.js
@@ -1,4 +1,5 @@
-import { SNOWPLOW_JS_SOURCE } from './constants';
+import { getCookie } from '~/lib/utils/common_utils';
+import { SNOWPLOW_JS_SOURCE, GOOGLE_ANALYTICS_ID_COOKIE_NAME } from './constants';
export default function getStandardContext({ extra = {} } = {}) {
const { schema, data = {} } = { ...window.gl?.snowplowStandardContext };
@@ -8,6 +9,7 @@ export default function getStandardContext({ extra = {} } = {}) {
data: {
...data,
source: SNOWPLOW_JS_SOURCE,
+ google_analytics_id: getCookie(GOOGLE_ANALYTICS_ID_COOKIE_NAME) ?? '',
extra: extra || data.extra,
},
};
diff --git a/app/assets/javascripts/tracking/tracking.js b/app/assets/javascripts/tracking/tracking.js
index 657e0a79911..c26abc261ed 100644
--- a/app/assets/javascripts/tracking/tracking.js
+++ b/app/assets/javascripts/tracking/tracking.js
@@ -1,4 +1,4 @@
-import { LOAD_ACTION_ATTR_SELECTOR, DEPRECATED_LOAD_EVENT_ATTR_SELECTOR } from './constants';
+import { LOAD_ACTION_ATTR_SELECTOR } from './constants';
import { dispatchSnowplowEvent } from './dispatch_snowplow_event';
import getStandardContext from './get_standard_context';
import {
@@ -105,9 +105,7 @@ export default class Tracking {
return [];
}
- const loadEvents = parent.querySelectorAll(
- `${LOAD_ACTION_ATTR_SELECTOR}, ${DEPRECATED_LOAD_EVENT_ATTR_SELECTOR}`,
- );
+ const loadEvents = parent.querySelectorAll(LOAD_ACTION_ATTR_SELECTOR);
loadEvents.forEach((element) => {
const { action, data } = createEventPayload(element);
@@ -179,9 +177,12 @@ export default class Tracking {
}
const referrers = getReferrersCache();
- const pageLinks = Object.seal({ url: '', referrer: '', originalUrl: window.location.href });
+ const pageLinks = Object.seal({
+ url: pageUrl,
+ referrer: '',
+ originalUrl: window.location.href,
+ });
- pageLinks.url = `${pageUrl}${window.location.hash}`;
window.snowplow('setCustomUrl', pageLinks.url);
if (document.referrer) {
diff --git a/app/assets/javascripts/tracking/utils.js b/app/assets/javascripts/tracking/utils.js
index 3507872b511..cc0d7e7a44a 100644
--- a/app/assets/javascripts/tracking/utils.js
+++ b/app/assets/javascripts/tracking/utils.js
@@ -4,8 +4,6 @@ import { getExperimentData } from '~/experimentation/utils';
import {
ACTION_ATTR_SELECTOR,
LOAD_ACTION_ATTR_SELECTOR,
- DEPRECATED_EVENT_ATTR_SELECTOR,
- DEPRECATED_LOAD_EVENT_ATTR_SELECTOR,
URLS_CACHE_STORAGE_KEY,
REFERRER_TTL,
} from './constants';
@@ -27,7 +25,6 @@ export const addExperimentContext = (opts) => {
export const createEventPayload = (el, { suffix = '' } = {}) => {
const {
trackAction,
- trackEvent,
trackValue,
trackExtra,
trackExperiment,
@@ -36,7 +33,7 @@ export const createEventPayload = (el, { suffix = '' } = {}) => {
trackProperty,
} = el?.dataset || {};
- const action = (trackAction || trackEvent) + (suffix || '');
+ const action = `${trackAction}${suffix || ''}`;
let value = trackValue || el.value || undefined;
if (el.type === 'checkbox' && !el.checked) {
@@ -74,8 +71,7 @@ export const createEventPayload = (el, { suffix = '' } = {}) => {
export const eventHandler = (e, func, opts = {}) => {
const actionSelector = `${ACTION_ATTR_SELECTOR}:not(${LOAD_ACTION_ATTR_SELECTOR})`;
- const deprecatedEventSelector = `${DEPRECATED_EVENT_ATTR_SELECTOR}:not(${DEPRECATED_LOAD_EVENT_ATTR_SELECTOR})`;
- const el = e.target.closest(`${actionSelector}, ${deprecatedEventSelector}`);
+ const el = e.target.closest(actionSelector);
if (!el) {
return;
diff --git a/app/assets/javascripts/user_popovers.js b/app/assets/javascripts/user_popovers.js
index 7a7518bcf83..4544373d8aa 100644
--- a/app/assets/javascripts/user_popovers.js
+++ b/app/assets/javascripts/user_popovers.js
@@ -41,6 +41,7 @@ const populateUserInfo = (user) => {
workInformation: userData.work_information,
websiteUrl: userData.website_url,
pronouns: userData.pronouns,
+ localTime: userData.local_time,
loaded: true,
});
}
diff --git a/app/assets/javascripts/vue_merge_request_widget/components/approvals/approvals_summary.vue b/app/assets/javascripts/vue_merge_request_widget/components/approvals/approvals_summary.vue
index ea73ab416de..0c4a5ee35d9 100644
--- a/app/assets/javascripts/vue_merge_request_widget/components/approvals/approvals_summary.vue
+++ b/app/assets/javascripts/vue_merge_request_widget/components/approvals/approvals_summary.vue
@@ -35,13 +35,17 @@ export default {
}
if (!this.rulesLeft.length) {
- return n__('Requires approval.', 'Requires %d more approvals.', this.approvalsLeft);
+ return n__(
+ 'Requires %d approval from eligible users.',
+ 'Requires %d approvals from eligible users.',
+ this.approvalsLeft,
+ );
}
return sprintf(
n__(
- 'Requires approval from %{names}.',
- 'Requires %{count} more approvals from %{names}.',
+ 'Requires %{count} approval from %{names}.',
+ 'Requires %{count} approvals from %{names}.',
this.approvalsLeft,
),
{
diff --git a/app/assets/javascripts/vue_merge_request_widget/components/extensions/actions.vue b/app/assets/javascripts/vue_merge_request_widget/components/extensions/actions.vue
new file mode 100644
index 00000000000..023367a794e
--- /dev/null
+++ b/app/assets/javascripts/vue_merge_request_widget/components/extensions/actions.vue
@@ -0,0 +1,70 @@
+<script>
+import { GlButton, GlDropdown, GlDropdownItem } from '@gitlab/ui';
+import { sprintf, __ } from '~/locale';
+
+export default {
+ components: {
+ GlButton,
+ GlDropdown,
+ GlDropdownItem,
+ },
+ props: {
+ widget: {
+ type: String,
+ required: true,
+ },
+ tertiaryButtons: {
+ type: Array,
+ required: false,
+ default: () => [],
+ },
+ },
+ computed: {
+ dropdownLabel() {
+ return sprintf(__('%{widget} options'), { widget: this.widget });
+ },
+ },
+};
+</script>
+
+<template>
+ <div>
+ <gl-dropdown
+ v-if="tertiaryButtons"
+ :text="dropdownLabel"
+ icon="ellipsis_v"
+ no-caret
+ category="tertiary"
+ right
+ lazy
+ text-sr-only
+ size="small"
+ toggle-class="gl-p-2!"
+ class="gl-display-block gl-md-display-none!"
+ >
+ <gl-dropdown-item
+ v-for="(btn, index) in tertiaryButtons"
+ :key="index"
+ :href="btn.href"
+ :target="btn.target"
+ >
+ {{ btn.text }}
+ </gl-dropdown-item>
+ </gl-dropdown>
+ <template v-if="tertiaryButtons.length">
+ <gl-button
+ v-for="(btn, index) in tertiaryButtons"
+ :key="index"
+ :href="btn.href"
+ :target="btn.target"
+ :class="{ 'gl-mr-3': index > 1 }"
+ category="tertiary"
+ variant="confirm"
+ size="small"
+ class="gl-display-none gl-md-display-block"
+ >
+ {{ btn.text }}
+ </gl-button>
+ </template>
+ </div>
+</template>
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 0ac98f6c982..298f7c7ad8c 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
@@ -1,7 +1,18 @@
<script>
-import { GlButton, GlLoadingIcon, GlIcon, GlLink, GlBadge, GlSafeHtmlDirective } from '@gitlab/ui';
+import {
+ GlButton,
+ GlLoadingIcon,
+ GlLink,
+ GlBadge,
+ GlSafeHtmlDirective,
+ GlTooltipDirective,
+ GlIntersectionObserver,
+} from '@gitlab/ui';
+import { sprintf, s__, __ } from '~/locale';
import SmartVirtualList from '~/vue_shared/components/smart_virtual_list.vue';
-import StatusIcon from '../mr_widget_status_icon.vue';
+import { EXTENSION_ICON_CLASS } from '../../constants';
+import StatusIcon from './status_icon.vue';
+import Actions from './actions.vue';
export const LOADING_STATES = {
collapsedLoading: 'collapsedLoading',
@@ -13,14 +24,16 @@ export default {
components: {
GlButton,
GlLoadingIcon,
- GlIcon,
GlLink,
GlBadge,
+ GlIntersectionObserver,
SmartVirtualList,
StatusIcon,
+ Actions,
},
directives: {
SafeHtml: GlSafeHtmlDirective,
+ GlTooltip: GlTooltipDirective,
},
data() {
return {
@@ -28,9 +41,16 @@ export default {
collapsedData: null,
fullData: null,
isCollapsed: true,
+ showFade: false,
};
},
computed: {
+ widgetLabel() {
+ return this.$options.i18n?.label || this.$options.name;
+ },
+ widgetLoadingText() {
+ return this.$options.i18n?.loading || __('Loading...');
+ },
isLoadingSummary() {
return this.loadingState === LOADING_STATES.collapsedLoading;
},
@@ -44,17 +64,22 @@ export default {
return true;
},
+ collapseButtonLabel() {
+ return sprintf(
+ this.isCollapsed
+ ? s__('mrWidget|Show %{widget} details')
+ : s__('mrWidget|Hide %{widget} details'),
+ { widget: this.widgetLabel },
+ );
+ },
statusIconName() {
- if (this.isLoadingSummary) {
- return 'loading';
- }
-
- if (this.loadingState === LOADING_STATES.collapsedError) {
- return 'warning';
- }
+ if (this.isLoadingSummary) return null;
return this.statusIcon(this.collapsedData);
},
+ tertiaryActionsButtons() {
+ return this.tertiaryButtons ? this.tertiaryButtons() : undefined;
+ },
},
watch: {
isCollapsed(newVal) {
@@ -95,32 +120,59 @@ export default {
throw e;
});
},
+ appear(index) {
+ if (index === this.fullData.length - 1) {
+ this.showFade = false;
+ }
+ },
+ disappear(index) {
+ if (index === this.fullData.length - 1) {
+ this.showFade = true;
+ }
+ },
},
+ EXTENSION_ICON_CLASS,
};
</script>
<template>
- <section class="media-section mr-widget-border-top">
+ <section class="media-section" data-testid="widget-extension">
<div class="media gl-p-5">
- <status-icon :status="statusIconName" class="align-self-center" />
- <div class="media-body d-flex flex-align-self-center align-items-center">
- <div class="code-text">
- <template v-if="isLoadingSummary">
- {{ __('Loading...') }}
- </template>
+ <status-icon
+ :name="$options.label || $options.name"
+ :is-loading="isLoadingSummary"
+ :icon-name="statusIconName"
+ />
+ <div class="media-body gl-display-flex gl-flex-direction-row!">
+ <div class="gl-flex-grow-1">
+ <template v-if="isLoadingSummary">{{ widgetLoadingText }}</template>
<div v-else v-safe-html="summary(collapsedData)"></div>
</div>
- <gl-button
- v-if="isCollapsible"
- size="small"
- class="float-right align-self-center"
- @click="toggleCollapsed"
- >
- {{ isCollapsed ? __('Expand') : __('Collapse') }}
- </gl-button>
+ <actions
+ :widget="$options.label || $options.name"
+ :tertiary-buttons="tertiaryActionsButtons"
+ />
+ <div class="gl-border-l-1 gl-border-l-solid gl-border-gray-100 gl-ml-3 gl-pl-3 gl-h-6">
+ <gl-button
+ v-if="isCollapsible"
+ v-gl-tooltip
+ :title="collapseButtonLabel"
+ :aria-expanded="`${!isCollapsed}`"
+ :aria-label="collapseButtonLabel"
+ :icon="isCollapsed ? 'chevron-lg-down' : 'chevron-lg-up'"
+ category="tertiary"
+ data-testid="toggle-button"
+ size="small"
+ @click="toggleCollapsed"
+ />
+ </div>
</div>
</div>
- <div v-if="!isCollapsed" class="mr-widget-grouped-section">
+ <div
+ v-if="!isCollapsed"
+ class="mr-widget-grouped-section gl-relative"
+ data-testid="widget-extension-collapsed-section"
+ >
<div v-if="isLoadingExpanded" class="report-block-container">
<gl-loading-icon size="sm" inline /> {{ __('Loading...') }}
</div>
@@ -131,27 +183,38 @@ export default {
:size="32"
wtag="ul"
wclass="report-block-list"
- class="report-block-container"
+ class="report-block-container gl-px-5 gl-py-0"
>
- <li v-for="data in fullData" :key="data.id" class="d-flex align-items-center">
- <div v-if="data.icon" :class="data.icon.class" class="d-flex">
- <gl-icon :name="data.icon.name" :size="24" />
- </div>
- <div
- class="gl-mt-2 gl-mb-2 align-content-around align-items-start flex-wrap align-self-center d-flex"
+ <li
+ v-for="(data, index) in fullData"
+ :key="data.id"
+ :class="{
+ 'gl-border-b-solid gl-border-b-1 gl-border-gray-100': index !== fullData.length - 1,
+ }"
+ class="gl-display-flex gl-align-items-center gl-py-3 gl-pl-7"
+ data-testid="extension-list-item"
+ >
+ <status-icon v-if="data.icon" :icon-name="data.icon.name" :size="12" />
+ <gl-intersection-observer
+ :options="{ rootMargin: '100px', thresholds: 0.1 }"
+ class="gl-flex-wrap gl-align-self-center gl-display-flex"
+ @appear="appear(index)"
+ @disappear="disappear(index)"
>
- <div class="gl-mr-4">
- {{ data.text }}
- </div>
+ <div v-safe-html="data.text" class="gl-mr-4"></div>
<div v-if="data.link">
<gl-link :href="data.link.href">{{ data.link.text }}</gl-link>
</div>
<gl-badge v-if="data.badge" :variant="data.badge.variant || 'info'">
{{ data.badge.text }}
</gl-badge>
- </div>
+ </gl-intersection-observer>
</li>
</smart-virtual-list>
+ <div
+ :class="{ show: showFade }"
+ class="fade mr-extenson-scrim gl-absolute gl-left-0 gl-bottom-0 gl-w-full gl-h-7"
+ ></div>
</div>
</section>
</template>
diff --git a/app/assets/javascripts/vue_merge_request_widget/components/extensions/container.js b/app/assets/javascripts/vue_merge_request_widget/components/extensions/container.js
index 529160de6a7..b9dfd3bd41e 100644
--- a/app/assets/javascripts/vue_merge_request_widget/components/extensions/container.js
+++ b/app/assets/javascripts/vue_merge_request_widget/components/extensions/container.js
@@ -1,4 +1,5 @@
-import { extensions } from './index';
+import { __ } from '~/locale';
+import { registeredExtensions } from './index';
export default {
props: {
@@ -8,20 +9,46 @@ export default {
},
},
render(h) {
+ const { extensions } = registeredExtensions;
+
+ if (extensions.length === 0) return null;
+
return h(
'div',
- {},
- extensions.map((extension) =>
- h(extension, {
- props: extensions[0].props.reduce(
- (acc, key) => ({
- ...acc,
- [key]: this.mr[key],
- }),
- {},
- ),
- }),
- ),
+ {
+ attrs: {
+ role: 'region',
+ 'aria-label': __('Merge request reports'),
+ },
+ },
+ [
+ h(
+ 'ul',
+ {
+ class: 'gl-p-0 gl-m-0 gl-list-style-none',
+ },
+ [
+ ...extensions.map((extension, index) =>
+ h('li', { attrs: { class: index > 0 && 'mr-widget-border-top' } }, [
+ h(
+ { ...extension },
+ {
+ props: {
+ ...extension.props.reduce(
+ (acc, key) => ({
+ ...acc,
+ [key]: this.mr[key],
+ }),
+ {},
+ ),
+ },
+ },
+ ),
+ ]),
+ ),
+ ],
+ ),
+ ],
);
},
};
diff --git a/app/assets/javascripts/vue_merge_request_widget/components/extensions/index.js b/app/assets/javascripts/vue_merge_request_widget/components/extensions/index.js
index 9796bb44939..4ca0b660696 100644
--- a/app/assets/javascripts/vue_merge_request_widget/components/extensions/index.js
+++ b/app/assets/javascripts/vue_merge_request_widget/components/extensions/index.js
@@ -1,15 +1,17 @@
+import Vue from 'vue';
import ExtensionBase from './base.vue';
// Holds all the currently registered extensions
-export const extensions = [];
+export const registeredExtensions = Vue.observable({ extensions: [] });
export const registerExtension = (extension) => {
// Pushes into the extenions array a dynamically created Vue component
// that gets exteneded from `base.vue`
- extensions.push({
+ registeredExtensions.extensions.push({
extends: ExtensionBase,
name: extension.name,
props: extension.props,
+ i18n: extension.i18n,
computed: {
...Object.keys(extension.computed).reduce(
(acc, computedKey) => ({
diff --git a/app/assets/javascripts/vue_merge_request_widget/components/extensions/status_icon.vue b/app/assets/javascripts/vue_merge_request_widget/components/extensions/status_icon.vue
new file mode 100644
index 00000000000..01d8de132e7
--- /dev/null
+++ b/app/assets/javascripts/vue_merge_request_widget/components/extensions/status_icon.vue
@@ -0,0 +1,61 @@
+<script>
+import { GlLoadingIcon, GlIcon } from '@gitlab/ui';
+import { capitalizeFirstCharacter } from '~/lib/utils/text_utility';
+import { EXTENSION_ICON_CLASS, EXTENSION_ICON_NAMES } from '../../constants';
+
+export default {
+ components: {
+ GlLoadingIcon,
+ GlIcon,
+ },
+ props: {
+ name: {
+ type: String,
+ required: false,
+ default: '',
+ },
+ isLoading: {
+ type: Boolean,
+ required: false,
+ default: false,
+ },
+ iconName: {
+ type: String,
+ required: false,
+ default: null,
+ },
+ size: {
+ type: Number,
+ required: false,
+ default: 16,
+ },
+ },
+ computed: {
+ iconAriaLabel() {
+ return `${capitalizeFirstCharacter(this.iconName)} ${this.name}`;
+ },
+ },
+ EXTENSION_ICON_NAMES,
+ EXTENSION_ICON_CLASS,
+};
+</script>
+
+<template>
+ <div
+ :class="[
+ $options.EXTENSION_ICON_CLASS[iconName],
+ { 'mr-widget-extension-icon': !isLoading && size === 16 },
+ { 'gl-p-2': isLoading || size === 16 },
+ ]"
+ class="gl-rounded-full gl-mr-3 gl-relative gl-p-2"
+ >
+ <gl-loading-icon v-if="isLoading" size="md" inline class="gl-display-block" />
+ <gl-icon
+ v-else
+ :name="$options.EXTENSION_ICON_NAMES[iconName]"
+ :size="size"
+ :aria-label="iconAriaLabel"
+ class="gl-display-block"
+ />
+ </div>
+</template>
diff --git a/app/assets/javascripts/vue_merge_request_widget/components/mr_widget_header.vue b/app/assets/javascripts/vue_merge_request_widget/components/mr_widget_header.vue
index 966262944ad..5c67b9c7ab5 100644
--- a/app/assets/javascripts/vue_merge_request_widget/components/mr_widget_header.vue
+++ b/app/assets/javascripts/vue_merge_request_widget/components/mr_widget_header.vue
@@ -10,7 +10,7 @@ import {
GlSafeHtmlDirective as SafeHtml,
GlSprintf,
} from '@gitlab/ui';
-import { mergeUrlParams, webIDEUrl } from '~/lib/utils/url_utility';
+import { constructWebIDEPath } from '~/lib/utils/url_utility';
import { s__ } from '~/locale';
import clipboardButton from '~/vue_shared/components/clipboard_button.vue';
import TooltipOnTruncate from '~/vue_shared/components/tooltip_on_truncate.vue';
@@ -58,15 +58,7 @@ export default {
});
},
webIdePath() {
- return mergeUrlParams(
- {
- target_project:
- this.mr.sourceProjectFullPath !== this.mr.targetProjectFullPath
- ? this.mr.targetProjectFullPath
- : '',
- },
- webIDEUrl(`/${this.mr.sourceProjectFullPath}/merge_requests/${this.mr.iid}`),
- );
+ return constructWebIDEPath(this.mr);
},
isFork() {
return this.mr.sourceProjectFullPath !== this.mr.targetProjectFullPath;
@@ -79,7 +71,7 @@ export default {
};
</script>
<template>
- <div class="d-flex mr-source-target gl-mb-3">
+ <div class="gl-display-flex mr-source-target">
<mr-widget-icon name="git-merge" />
<div class="git-merge-container d-flex">
<div class="normal">
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 7532eabee8a..68cff1368af 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
@@ -1,6 +1,7 @@
<script>
/* eslint-disable @gitlab/require-i18n-strings */
import { GlModal, GlLink, GlSprintf } from '@gitlab/ui';
+import { escapeShellString } from '~/lib/utils/text_utility';
import { __ } from '~/locale';
import ClipboardButton from '~/vue_shared/components/clipboard_button.vue';
@@ -75,20 +76,31 @@ export default {
},
computed: {
mergeInfo1() {
+ const escapedOriginBranch = escapeShellString(`origin/${this.sourceBranch}`);
+
return this.isFork
- ? `git fetch "${this.sourceProjectDefaultUrl}" ${this.sourceBranch}\ngit checkout -b "${this.sourceProjectPath}-${this.sourceBranch}" FETCH_HEAD`
- : `git fetch origin\ngit checkout -b "${this.sourceBranch}" "origin/${this.sourceBranch}"`;
+ ? `git fetch "${this.sourceProjectDefaultUrl}" ${this.escapedSourceBranch}\ngit checkout -b ${this.escapedForkBranch} FETCH_HEAD`
+ : `git fetch origin\ngit checkout -b ${this.escapedSourceBranch} ${escapedOriginBranch}`;
},
mergeInfo2() {
return this.isFork
- ? `git fetch origin\ngit checkout "${this.targetBranch}"\ngit merge --no-ff "${this.sourceProjectPath}-${this.sourceBranch}"`
- : `git fetch origin\ngit checkout "${this.targetBranch}"\ngit merge --no-ff "${this.sourceBranch}"`;
+ ? `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.targetBranch}"`
+ ? `git push origin ${this.escapedTargetBranch}`
: __('Note that pushing to GitLab requires write access to this repository.');
},
+ escapedForkBranch() {
+ return escapeShellString(`${this.sourceProjectPath}-${this.sourceBranch}`);
+ },
+ escapedTargetBranch() {
+ return escapeShellString(this.targetBranch);
+ },
+ escapedSourceBranch() {
+ return escapeShellString(this.sourceBranch);
+ },
},
};
</script>
diff --git a/app/assets/javascripts/vue_merge_request_widget/components/mr_widget_pipeline_container.vue b/app/assets/javascripts/vue_merge_request_widget/components/mr_widget_pipeline_container.vue
index a8272002f16..a05e8747a43 100644
--- a/app/assets/javascripts/vue_merge_request_widget/components/mr_widget_pipeline_container.vue
+++ b/app/assets/javascripts/vue_merge_request_widget/components/mr_widget_pipeline_container.vue
@@ -88,6 +88,9 @@ export default {
return this.mr.preferredAutoMergeStrategy;
},
+ ciStatus() {
+ return this.isPostMerge ? this.mr?.mergePipeline?.details?.status?.text : this.mr.ciStatus;
+ },
},
};
</script>
@@ -97,7 +100,7 @@ export default {
:pipeline="pipeline"
:pipeline-coverage-delta="mr.pipelineCoverageDelta"
:builds-with-coverage="mr.buildsWithCoverage"
- :ci-status="mr.ciStatus"
+ :ci-status="ciStatus"
:has-ci="mr.hasCI"
:pipeline-must-succeed="mr.onlyAllowMergeIfPipelineSucceeds"
:source-branch="branch"
diff --git a/app/assets/javascripts/vue_merge_request_widget/components/states/commits_header.vue b/app/assets/javascripts/vue_merge_request_widget/components/states/commits_header.vue
index a55dba92e16..3ca193514f1 100644
--- a/app/assets/javascripts/vue_merge_request_widget/components/states/commits_header.vue
+++ b/app/assets/javascripts/vue_merge_request_widget/components/states/commits_header.vue
@@ -1,12 +1,15 @@
<script>
-/* eslint-disable @gitlab/require-string-literal-i18n-helpers */
-import { GlButton } from '@gitlab/ui';
+import { GlButton, GlSprintf } from '@gitlab/ui';
import { escape } from 'lodash';
-import { __, n__, sprintf, s__ } from '~/locale';
+import { __, n__, s__ } from '~/locale';
+
+const mergeCommitCount = s__('mrWidgetCommitsAdded|1 merge commit');
export default {
+ mergeCommitCount,
components: {
GlButton,
+ GlSprintf,
},
props: {
isSquashEnabled: {
@@ -37,7 +40,7 @@ export default {
return this.expanded ? 'chevron-down' : 'chevron-right';
},
commitsCountMessage() {
- return n__(__('%d commit'), __('%d commits'), this.isSquashEnabled ? 1 : this.commitsCount);
+ return n__('%d commit', '%d commits', this.isSquashEnabled ? 1 : this.commitsCount);
},
modifyLinkMessage() {
if (this.isFastForwardEnabled) return __('Modify commit message');
@@ -47,22 +50,15 @@ export default {
ariaLabel() {
return this.expanded ? __('Collapse') : __('Expand');
},
+ targetBranchEscaped() {
+ return escape(this.targetBranch);
+ },
message() {
- const message = this.isFastForwardEnabled
+ return this.isFastForwardEnabled
? s__('mrWidgetCommitsAdded|%{commitCount} will be added to %{targetBranch}.')
: s__(
'mrWidgetCommitsAdded|%{commitCount} and %{mergeCommitCount} will be added to %{targetBranch}.',
);
-
- return sprintf(
- message,
- {
- commitCount: `<strong class="commits-count-message">${this.commitsCountMessage}</strong>`,
- mergeCommitCount: `<strong>${s__('mrWidgetCommitsAdded|1 merge commit')}</strong>`,
- targetBranch: `<span class="label-branch">${escape(this.targetBranch)}</span>`,
- },
- false,
- );
},
},
methods: {
@@ -89,10 +85,19 @@ export default {
/>
<span v-if="expanded">{{ __('Collapse') }}</span>
<span v-else>
- <span
- class="vertical-align-middle"
- v-html="message /* eslint-disable-line vue/no-v-html */"
- ></span>
+ <span class="vertical-align-middle">
+ <gl-sprintf :message="message">
+ <template #commitCount>
+ <strong class="commits-count-message">{{ commitsCountMessage }}</strong>
+ </template>
+ <template #mergeCommitCount>
+ <strong>{{ $options.mergeCommitCount }}</strong>
+ </template>
+ <template #targetBranch>
+ <span class="label-branch">{{ targetBranchEscaped }}</span>
+ </template>
+ </gl-sprintf>
+ </span>
<gl-button variant="link" class="modify-message-button">
{{ modifyLinkMessage }}
</gl-button>
diff --git a/app/assets/javascripts/vue_merge_request_widget/components/states/ready_to_merge.vue b/app/assets/javascripts/vue_merge_request_widget/components/states/ready_to_merge.vue
index 7df65e995a5..7d4bd4cf1bf 100644
--- a/app/assets/javascripts/vue_merge_request_widget/components/states/ready_to_merge.vue
+++ b/app/assets/javascripts/vue_merge_request_widget/components/states/ready_to_merge.vue
@@ -29,6 +29,7 @@ import {
WARNING,
MT_MERGE_STRATEGY,
PIPELINE_FAILED_STATE,
+ STATE_MACHINE,
} from '../../constants';
import eventHub from '../../event_hub';
import mergeRequestQueryVariablesMixin from '../../mixins/merge_request_query_variables';
@@ -47,6 +48,9 @@ const MERGE_FAILED_STATUS = 'failed';
const MERGE_SUCCESS_STATUS = 'success';
const MERGE_HOOK_VALIDATION_ERROR_STATUS = 'hook_validation_error';
+const { transitions } = STATE_MACHINE;
+const { MERGE, MERGED, MERGE_FAILURE, AUTO_MERGE } = transitions;
+
export default {
name: 'ReadyToMerge',
apollo: {
@@ -99,8 +103,8 @@ export default {
GlDropdownItem,
GlFormCheckbox,
GlSkeletonLoader,
- MergeTrainHelperText: () =>
- import('ee_component/vue_merge_request_widget/components/merge_train_helper_text.vue'),
+ MergeTrainHelperIcon: () =>
+ import('ee_component/vue_merge_request_widget/components/merge_train_helper_icon.vue'),
MergeImmediatelyConfirmationDialog: () =>
import(
'ee_component/vue_merge_request_widget/components/merge_immediately_confirmation_dialog.vue'
@@ -234,7 +238,7 @@ export default {
return CONFIRM;
},
iconClass() {
- if (this.shouldRenderMergeTrainHelperText && !this.mr.preventMerge) {
+ if (this.shouldRenderMergeTrainHelperIcon && !this.mr.preventMerge) {
return PIPELINE_RUNNING_STATE;
}
@@ -361,6 +365,11 @@ export default {
}
this.isMakingRequest = true;
+
+ if (!useAutoMerge) {
+ this.mr.transitionStateMachine({ transition: MERGE });
+ }
+
this.service
.merge(options)
.then((res) => res.data)
@@ -371,10 +380,12 @@ export default {
if (AUTO_MERGE_STRATEGIES.includes(data.status)) {
eventHub.$emit('MRWidgetUpdateRequested');
+ this.mr.transitionStateMachine({ transition: AUTO_MERGE });
} else if (data.status === MERGE_SUCCESS_STATUS) {
this.initiateMergePolling();
} else if (hasError) {
eventHub.$emit('FailedToMerge', data.merge_error);
+ this.mr.transitionStateMachine({ transition: MERGE_FAILURE });
}
if (this.glFeatures.mergeRequestWidgetGraphql) {
@@ -383,6 +394,7 @@ export default {
})
.catch(() => {
this.isMakingRequest = false;
+ this.mr.transitionStateMachine({ transition: MERGE_FAILURE });
createFlash({
message: __('Something went wrong. Please try again.'),
});
@@ -417,6 +429,7 @@ export default {
eventHub.$emit('FetchActionsContent');
MergeRequest.hideCloseButton();
MergeRequest.decreaseCounter();
+ this.mr.transitionStateMachine({ transition: MERGED });
stopPolling();
refreshUserMergeRequestCounts();
@@ -428,6 +441,7 @@ export default {
}
} else if (data.merge_error) {
eventHub.$emit('FailedToMerge', data.merge_error);
+ this.mr.transitionStateMachine({ transition: MERGE_FAILURE });
stopPolling();
} else {
// MR is not merged yet, continue polling until the state becomes 'merged'
@@ -438,6 +452,7 @@ export default {
createFlash({
message: __('Something went wrong while merging this merge request. Please try again.'),
});
+ this.mr.transitionStateMachine({ transition: MERGE_FAILURE });
stopPolling();
});
},
@@ -489,7 +504,7 @@ export default {
</div>
</div>
<template v-else>
- <div class="mr-widget-body media" :class="{ 'gl-pb-3': shouldRenderMergeTrainHelperText }">
+ <div class="mr-widget-body media">
<status-icon :status="iconClass" />
<div class="media-body">
<div class="mr-widget-body-controls gl-display-flex gl-align-items-center">
@@ -560,6 +575,13 @@ export default {
:is-disabled="isSquashReadOnly"
class="gl-mx-3"
/>
+
+ <merge-train-helper-icon
+ v-if="shouldRenderMergeTrainHelperIcon"
+ :merge-train-when-pipeline-succeeds-docs-path="
+ mr.mergeTrainWhenPipelineSucceedsDocsPath
+ "
+ />
</div>
<template v-else>
<div class="bold js-resolve-mr-widget-items-message gl-ml-3">
@@ -590,13 +612,6 @@ export default {
</div>
</div>
</div>
- <merge-train-helper-text
- v-if="shouldRenderMergeTrainHelperText"
- :pipeline-id="pipelineId"
- :pipeline-link="pipeline.path"
- :merge-train-length="stateData.mergeTrainsCount"
- :merge-train-when-pipeline-succeeds-docs-path="mr.mergeTrainWhenPipelineSucceedsDocsPath"
- />
<template v-if="shouldShowMergeControls">
<div
v-if="!shouldShowMergeEdit"
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 393c599c7e8..790870ee4c6 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
@@ -3,6 +3,7 @@ import { GlButton } from '@gitlab/ui';
import { produce } from 'immer';
import $ from 'jquery';
import createFlash from '~/flash';
+import toast from '~/vue_shared/plugins/global_toast';
import { __ } from '~/locale';
import MergeRequest from '~/merge_request';
import glFeatureFlagMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
@@ -123,10 +124,7 @@ export default {
},
},
}) => {
- createFlash({
- message: __('Marked as ready. Merging is now allowed.'),
- type: 'notice',
- });
+ toast(__('Marked as ready. Merging is now allowed.'));
$('.merge-request .detail-page-description .title').text(title);
},
)
diff --git a/app/assets/javascripts/vue_merge_request_widget/constants.js b/app/assets/javascripts/vue_merge_request_widget/constants.js
index f5710f46b7e..b88e83ccb0f 100644
--- a/app/assets/javascripts/vue_merge_request_widget/constants.js
+++ b/app/assets/javascripts/vue_merge_request_widget/constants.js
@@ -1,4 +1,5 @@
import { s__ } from '~/locale';
+import { stateToComponentMap as classStateMap, stateKey } from './stores/state_maps';
export const SUCCESS = 'success';
export const WARNING = 'warning';
@@ -52,3 +53,99 @@ export const MERGE_ACTIVE_STATUS_PHRASES = [
emoji: 'heart_eyes',
},
];
+
+const STATE_MACHINE = {
+ states: {
+ IDLE: 'IDLE',
+ MERGING: 'MERGING',
+ AUTO_MERGE: 'AUTO_MERGE',
+ },
+ transitions: {
+ MERGE: 'start-merge',
+ AUTO_MERGE: 'start-auto-merge',
+ MERGE_FAILURE: 'merge-failed',
+ MERGED: 'merge-done',
+ },
+};
+const { states, transitions } = STATE_MACHINE;
+
+STATE_MACHINE.definition = {
+ initial: states.IDLE,
+ states: {
+ [states.IDLE]: {
+ on: {
+ [transitions.MERGE]: states.MERGING,
+ [transitions.AUTO_MERGE]: states.AUTO_MERGE,
+ },
+ },
+ [states.MERGING]: {
+ on: {
+ [transitions.MERGED]: states.IDLE,
+ [transitions.MERGE_FAILURE]: states.IDLE,
+ },
+ },
+ [states.AUTO_MERGE]: {
+ on: {
+ [transitions.MERGED]: states.IDLE,
+ [transitions.MERGE_FAILURE]: states.IDLE,
+ },
+ },
+ },
+};
+
+export const stateToTransitionMap = {
+ [stateKey.merging]: transitions.MERGE,
+ [stateKey.merged]: transitions.MERGED,
+ [stateKey.autoMergeEnabled]: transitions.AUTO_MERGE,
+};
+export const stateToComponentMap = {
+ [states.MERGING]: classStateMap[stateKey.merging],
+ [states.AUTO_MERGE]: classStateMap[stateKey.autoMergeEnabled],
+};
+
+export const EXTENSION_ICONS = {
+ failed: 'failed',
+ warning: 'warning',
+ success: 'success',
+ neutral: 'neutral',
+ error: 'error',
+ notice: 'notice',
+ severityCritical: 'severityCritical',
+ severityHigh: 'severityHigh',
+ severityMedium: 'severityMedium',
+ severityLow: 'severityLow',
+ severityInfo: 'severityInfo',
+ severityUnknown: 'severityUnknown',
+};
+
+export const EXTENSION_ICON_NAMES = {
+ failed: 'status-failed',
+ warning: 'status-alert',
+ success: 'status-success',
+ neutral: 'status-neutral',
+ error: 'status-alert',
+ notice: 'status-alert',
+ severityCritical: 'severity-critical',
+ severityHigh: 'severity-high',
+ severityMedium: 'severity-medium',
+ severityLow: 'severity-low',
+ severityInfo: 'severity-info',
+ severityUnknown: 'severity-unknown',
+};
+
+export const EXTENSION_ICON_CLASS = {
+ failed: 'gl-text-red-500',
+ warning: 'gl-text-orange-500',
+ success: 'gl-text-green-500',
+ neutral: 'gl-text-gray-400',
+ error: 'gl-text-red-500',
+ notice: 'gl-text-gray-500',
+ severityCritical: 'gl-text-red-800',
+ severityHigh: 'gl-text-red-600',
+ severityMedium: 'gl-text-orange-400',
+ severityLow: 'gl-text-orange-300',
+ severityInfo: 'gl-text-blue-400',
+ severityUnknown: 'gl-text-gray-400',
+};
+
+export { STATE_MACHINE };
diff --git a/app/assets/javascripts/vue_merge_request_widget/extensions/issues.js b/app/assets/javascripts/vue_merge_request_widget/extensions/issues.js
index 6c6f5e7fc73..349e9d29355 100644
--- a/app/assets/javascripts/vue_merge_request_widget/extensions/issues.js
+++ b/app/assets/javascripts/vue_merge_request_widget/extensions/issues.js
@@ -1,4 +1,5 @@
/* eslint-disable */
+import { EXTENSION_ICONS } from '../constants';
import issuesCollapsedQuery from './issues_collapsed.query.graphql';
import issuesQuery from './issues.query.graphql';
@@ -6,20 +7,29 @@ export default {
// Give the extension a name
// Make it easier to track in Vue dev tools
name: 'WidgetIssues',
+ i18n: {
+ label: 'Issues',
+ loading: 'Loading issues...',
+ },
// Add an array of props
// These then get mapped to values stored in the MR Widget store
- props: ['targetProjectFullPath'],
+ props: ['targetProjectFullPath', 'conflictsDocsPath'],
// Add any extra computed props in here
computed: {
// Small summary text to be displayed in the collapsed state
// Receives the collapsed data as an argument
summary(count) {
- return `<strong>${count}</strong> open issue`;
+ return 'Summary text<br/>Second line';
},
// Status icon to be used next to the summary text
// Receives the collapsed data as an argument
statusIcon(count) {
- return count > 0 ? 'warning' : 'success';
+ return EXTENSION_ICONS.warning;
+ },
+ // Tertiary action buttons that will take the user elsewhere
+ // in the GitLab app
+ tertiaryButtons() {
+ return [{ text: 'Full report', href: this.conflictsDocsPath, target: '_blank' }];
},
},
methods: {
@@ -44,16 +54,13 @@ export default {
// Icon to get rendered on the side of each row
icon: {
// Required: Name maps to an icon in GitLabs SVG
- name:
- issue.state === 'closed' ? 'status_failed_borderless' : 'status_success_borderless',
- // Optional: An extra class to be added to the icon for additional styling
- class: issue.state === 'closed' ? 'text-danger' : 'text-success',
+ name: issue.state === 'closed' ? EXTENSION_ICONS.error : EXTENSION_ICONS.success,
},
// Badges get rendered next to the text on each row
- badge: issue.state === 'closed' && {
- text: 'Closed', // Required: Text to be used inside of the badge
- // variant: 'info', // Optional: The variant of the badge, maps to GitLab UI variants
- },
+ // badge: issue.state === 'closed' && {
+ // text: 'Closed', // Required: Text to be used inside of the badge
+ // // variant: 'info', // Optional: The variant of the badge, maps to GitLab UI variants
+ // },
// Each row can have its own link that will take the user elsewhere
// link: {
// href: 'https://google.com', // Required: href for the link
diff --git a/app/assets/javascripts/vue_merge_request_widget/mixins/ready_to_merge.js b/app/assets/javascripts/vue_merge_request_widget/mixins/ready_to_merge.js
index 9d8e5d12d58..cf6472f2c8c 100644
--- a/app/assets/javascripts/vue_merge_request_widget/mixins/ready_to_merge.js
+++ b/app/assets/javascripts/vue_merge_request_widget/mixins/ready_to_merge.js
@@ -32,7 +32,7 @@ export default {
isMergeImmediatelyDangerous() {
return false;
},
- shouldRenderMergeTrainHelperText() {
+ shouldRenderMergeTrainHelperIcon() {
return false;
},
pipelineId() {
diff --git a/app/assets/javascripts/vue_merge_request_widget/mr_widget_options.vue b/app/assets/javascripts/vue_merge_request_widget/mr_widget_options.vue
index 78aa3941bfe..3ac1e881658 100644
--- a/app/assets/javascripts/vue_merge_request_widget/mr_widget_options.vue
+++ b/app/assets/javascripts/vue_merge_request_widget/mr_widget_options.vue
@@ -4,7 +4,7 @@ import { isEmpty } from 'lodash';
import MrWidgetApprovals from 'ee_else_ce/vue_merge_request_widget/components/approvals/approvals.vue';
import MRWidgetService from 'ee_else_ce/vue_merge_request_widget/services/mr_widget_service';
import MRWidgetStore from 'ee_else_ce/vue_merge_request_widget/stores/mr_widget_store';
-import stateMaps from 'ee_else_ce/vue_merge_request_widget/stores/state_maps';
+import { stateToComponentMap as classState } from 'ee_else_ce/vue_merge_request_widget/stores/state_maps';
import createFlash from '~/flash';
import { secondsToMilliseconds } from '~/lib/utils/datetime_utility';
import notify from '~/lib/utils/notify';
@@ -38,7 +38,8 @@ import ReadyToMergeState from './components/states/ready_to_merge.vue';
import ShaMismatch from './components/states/sha_mismatch.vue';
import UnresolvedDiscussionsState from './components/states/unresolved_discussions.vue';
import WorkInProgressState from './components/states/work_in_progress.vue';
-// import ExtensionsContainer from './components/extensions/container';
+import ExtensionsContainer from './components/extensions/container';
+import { STATE_MACHINE, stateToComponentMap } from './constants';
import eventHub from './event_hub';
import mergeRequestQueryVariablesMixin from './mixins/merge_request_query_variables';
import getStateQuery from './queries/get_state.query.graphql';
@@ -52,7 +53,7 @@ export default {
},
components: {
Loading,
- // ExtensionsContainer,
+ ExtensionsContainer,
'mr-widget-header': WidgetHeader,
'mr-widget-suggest-pipeline': WidgetSuggestPipeline,
MrWidgetPipelineContainer,
@@ -124,7 +125,9 @@ export default {
mr: store,
state: store && store.state,
service: store && this.createService(store),
+ machineState: store?.machineValue || STATE_MACHINE.definition.initial,
loading: true,
+ recomputeComponentName: 0,
};
},
computed: {
@@ -139,7 +142,7 @@ export default {
return this.mr.state !== 'nothingToMerge';
},
componentName() {
- return stateMaps.stateToComponentMap[this.mr.state];
+ return stateToComponentMap[this.machineState] || classState[this.mr.state];
},
hasPipelineMustSucceedConflict() {
return !this.mr.hasCI && this.mr.onlyAllowMergeIfPipelineSucceeds;
@@ -148,9 +151,9 @@ export default {
return this.mr.hasCI || this.hasPipelineMustSucceedConflict;
},
shouldSuggestPipelines() {
- return (
- !this.mr.hasCI && this.mr.mergeRequestAddCiConfigPath && !this.mr.isDismissedSuggestPipeline
- );
+ const { hasCI, mergeRequestAddCiConfigPath, isDismissedSuggestPipeline } = this.mr;
+
+ return !hasCI && mergeRequestAddCiConfigPath && !isDismissedSuggestPipeline;
},
shouldRenderCodeQuality() {
return this.mr?.codequalityReportsPath;
@@ -204,8 +207,19 @@ export default {
hasAlerts() {
return this.mr.mergeError || this.showMergePipelineForkWarning;
},
+ shouldShowExtension() {
+ return (
+ window.gon?.features?.refactorMrWidgetsExtensions ||
+ window.gon?.features?.refactorMrWidgetsExtensionsUser
+ );
+ },
},
watch: {
+ 'mr.machineValue': {
+ handler(newValue) {
+ this.machineState = newValue;
+ },
+ },
state(newVal, oldVal) {
if (newVal !== oldVal && this.shouldRenderMergedPipeline) {
// init polling
@@ -247,6 +261,8 @@ export default {
this.mr = new MRWidgetStore({ ...window.gl.mrWidgetData, ...data });
}
+ this.machineState = this.mr.machineValue;
+
if (!this.state) {
this.state = this.mr.state;
}
@@ -496,7 +512,7 @@ export default {
</template>
</mr-widget-alert-message>
</div>
- <!-- <extensions-container :mr="mr" /> -->
+ <extensions-container :mr="mr" />
<grouped-codequality-reports-app
v-if="shouldRenderCodeQuality"
:head-blob-path="mr.headBlobPath"
diff --git a/app/assets/javascripts/vue_merge_request_widget/stores/mr_widget_store.js b/app/assets/javascripts/vue_merge_request_widget/stores/mr_widget_store.js
index 29e0c867f6b..6628225cd46 100644
--- a/app/assets/javascripts/vue_merge_request_widget/stores/mr_widget_store.js
+++ b/app/assets/javascripts/vue_merge_request_widget/stores/mr_widget_store.js
@@ -1,11 +1,21 @@
import getStateKey from 'ee_else_ce/vue_merge_request_widget/stores/get_state_key';
import { statusBoxState } from '~/issuable/components/status_box.vue';
import { formatDate, getTimeago } from '~/lib/utils/datetime_utility';
-import { MTWPS_MERGE_STRATEGY, MT_MERGE_STRATEGY, MWPS_MERGE_STRATEGY } from '../constants';
+import { machine } from '~/lib/utils/finite_state_machine';
+import {
+ MTWPS_MERGE_STRATEGY,
+ MT_MERGE_STRATEGY,
+ MWPS_MERGE_STRATEGY,
+ STATE_MACHINE,
+ stateToTransitionMap,
+} from '../constants';
import { stateKey } from './state_maps';
const { format } = getTimeago();
+const { states } = STATE_MACHINE;
+const { IDLE } = states;
+
export default class MergeRequestStore {
constructor(data) {
this.sha = data.diff_head_sha;
@@ -16,6 +26,9 @@ export default class MergeRequestStore {
this.apiUnapprovePath = data.api_unapprove_path;
this.hasApprovalsAvailable = data.has_approvals_available;
+ this.stateMachine = machine(STATE_MACHINE.definition);
+ this.machineValue = this.stateMachine.value;
+
this.setPaths(data);
this.setData(data);
@@ -215,10 +228,7 @@ export default class MergeRequestStore {
setState() {
if (this.mergeOngoing) {
this.state = 'merging';
- return;
- }
-
- if (this.isOpen) {
+ } else if (this.isOpen) {
this.state = getStateKey.call(this);
} else {
switch (this.mergeRequestState) {
@@ -232,6 +242,8 @@ export default class MergeRequestStore {
this.state = null;
}
}
+
+ this.translateStateToMachine();
}
setPaths(data) {
@@ -277,7 +289,7 @@ export default class MergeRequestStore {
// Security reports
this.sastComparisonPath = data.sast_comparison_path;
- this.secretScanningComparisonPath = data.secret_scanning_comparison_path;
+ this.secretDetectionComparisonPath = data.secret_detection_comparison_path;
}
get isNothingToMergeState() {
@@ -356,4 +368,32 @@ export default class MergeRequestStore {
(this.onlyAllowMergeIfPipelineSucceeds && this.isPipelineFailed)
);
}
+
+ // Because the state machine doesn't yet handle every state and transition,
+ // some use-cases will need to force a state that can't be reached by
+ // a known transition. This is undesirable long-term (as it subverts
+ // the intent of a state machine), but is necessary until the machine
+ // can handle all possible combinations. (unsafeForce)
+ transitionStateMachine({ transition, state, unsafeForce = false } = {}) {
+ if (unsafeForce && state) {
+ this.stateMachine.value = state;
+ } else {
+ this.stateMachine.send(transition);
+ }
+
+ this.machineValue = this.stateMachine.value;
+ }
+ translateStateToMachine() {
+ const transition = stateToTransitionMap[this.state];
+ let transitionOptions = {
+ state: IDLE,
+ unsafeForce: true,
+ };
+
+ if (transition) {
+ transitionOptions = { transition };
+ }
+
+ this.transitionStateMachine(transitionOptions);
+ }
}
diff --git a/app/assets/javascripts/vue_merge_request_widget/stores/state_maps.js b/app/assets/javascripts/vue_merge_request_widget/stores/state_maps.js
index 04454882666..4cb23407a74 100644
--- a/app/assets/javascripts/vue_merge_request_widget/stores/state_maps.js
+++ b/app/assets/javascripts/vue_merge_request_widget/stores/state_maps.js
@@ -1,4 +1,4 @@
-const stateToComponentMap = {
+export const stateToComponentMap = {
merged: 'mr-widget-merged',
closed: 'mr-widget-closed',
merging: 'mr-widget-merging',
@@ -21,7 +21,7 @@ const stateToComponentMap = {
mergeChecksFailed: 'mergeChecksFailed',
};
-const statesToShowHelpWidget = [
+export const statesToShowHelpWidget = [
'merging',
'conflicts',
'workInProgress',
@@ -50,11 +50,7 @@ export const stateKey = {
notAllowedToMerge: 'notAllowedToMerge',
readyToMerge: 'readyToMerge',
rebase: 'rebase',
+ merging: 'merging',
merged: 'merged',
mergeChecksFailed: 'mergeChecksFailed',
};
-
-export default {
- stateToComponentMap,
- statesToShowHelpWidget,
-};
diff --git a/app/assets/javascripts/vue_shared/components/blob_viewers/mixins.js b/app/assets/javascripts/vue_shared/components/blob_viewers/mixins.js
index 0c1d55ae707..4cab5e964de 100644
--- a/app/assets/javascripts/vue_shared/components/blob_viewers/mixins.js
+++ b/app/assets/javascripts/vue_shared/components/blob_viewers/mixins.js
@@ -27,6 +27,11 @@ export default {
required: false,
default: '',
},
+ hideLineNumbers: {
+ type: Boolean,
+ required: false,
+ default: false,
+ },
},
mounted() {
eventHub.$emit(SNIPPET_MEASURE_BLOBS_CONTENT);
diff --git a/app/assets/javascripts/vue_shared/components/blob_viewers/simple_viewer.vue b/app/assets/javascripts/vue_shared/components/blob_viewers/simple_viewer.vue
index 84770dbac6f..40044e518c3 100644
--- a/app/assets/javascripts/vue_shared/components/blob_viewers/simple_viewer.vue
+++ b/app/assets/javascripts/vue_shared/components/blob_viewers/simple_viewer.vue
@@ -8,8 +8,6 @@ export default {
name: 'SimpleViewer',
components: {
GlIcon,
- SourceEditor: () =>
- import(/* webpackChunkName: 'SourceEditor' */ '~/vue_shared/components/source_editor.vue'),
},
mixins: [ViewerMixin, glFeatureFlagsMixin()],
inject: ['blobHash'],
@@ -22,9 +20,6 @@ export default {
lineNumbers() {
return this.content.split('\n').length;
},
- refactorBlobViewerEnabled() {
- return this.glFeatures.refactorBlobViewer;
- },
},
mounted() {
const { hash } = window.location;
@@ -52,14 +47,8 @@ export default {
</script>
<template>
<div>
- <source-editor
- v-if="isRawContent && refactorBlobViewerEnabled"
- :value="content"
- :file-name="fileName"
- :editor-options="{ readOnly: true }"
- />
- <div v-else class="file-content code js-syntax-highlight" :class="$options.userColorScheme">
- <div class="line-numbers">
+ <div class="file-content code js-syntax-highlight" :class="$options.userColorScheme">
+ <div v-if="!hideLineNumbers" class="line-numbers">
<a
v-for="line in lineNumbers"
:id="`L${line}`"
diff --git a/app/assets/javascripts/vue_shared/components/color_picker/color_picker.vue b/app/assets/javascripts/vue_shared/components/color_picker/color_picker.vue
index 3c21b14894b..7563c35dfc8 100644
--- a/app/assets/javascripts/vue_shared/components/color_picker/color_picker.vue
+++ b/app/assets/javascripts/vue_shared/components/color_picker/color_picker.vue
@@ -81,8 +81,8 @@ export default {
},
},
i18n: {
- fullDescription: __('Choose any color. Or you can choose one of the suggested colors below'),
- shortDescription: __('Choose any color'),
+ fullDescription: __('Enter any color or choose one of the suggested colors below.'),
+ shortDescription: __('Enter any color.'),
},
};
</script>
diff --git a/app/assets/javascripts/vue_shared/components/content_viewer/viewers/markdown_viewer.vue b/app/assets/javascripts/vue_shared/components/content_viewer/viewers/markdown_viewer.vue
index 7b88b36aa0f..ea507017caa 100644
--- a/app/assets/javascripts/vue_shared/components/content_viewer/viewers/markdown_viewer.vue
+++ b/app/assets/javascripts/vue_shared/components/content_viewer/viewers/markdown_viewer.vue
@@ -97,7 +97,7 @@ export default {
});
})
.catch(() => {
- this.previewContent = __('An error occurred while fetching markdown preview');
+ this.previewContent = __('An error occurred while fetching Markdown preview');
this.isLoading = false;
});
}
diff --git a/app/assets/javascripts/vue_shared/components/dismissible_feedback_alert.vue b/app/assets/javascripts/vue_shared/components/dismissible_feedback_alert.vue
index c4dfcf93a18..014276c7e36 100644
--- a/app/assets/javascripts/vue_shared/components/dismissible_feedback_alert.vue
+++ b/app/assets/javascripts/vue_shared/components/dismissible_feedback_alert.vue
@@ -1,13 +1,11 @@
<script>
-import { GlAlert, GlSprintf, GlLink } from '@gitlab/ui';
+import { GlAlert } from '@gitlab/ui';
import { slugifyWithUnderscore } from '~/lib/utils/text_utility';
import LocalStorageSync from '~/vue_shared/components/local_storage_sync.vue';
export default {
components: {
GlAlert,
- GlSprintf,
- GlLink,
LocalStorageSync,
},
props: {
@@ -15,10 +13,6 @@ export default {
type: String,
required: true,
},
- feedbackLink: {
- type: String,
- required: true,
- },
},
data() {
return {
@@ -44,19 +38,8 @@ export default {
<template>
<div v-show="showAlert">
<local-storage-sync v-model="isDismissed" :storage-key="storageKey" as-json />
- <gl-alert v-if="showAlert" class="gl-mt-5" @dismiss="dismissFeedbackAlert">
- <gl-sprintf
- :message="
- __(
- 'Please share your feedback about %{featureName} %{linkStart}in this issue%{linkEnd} to help us improve the experience.',
- )
- "
- >
- <template #featureName>{{ featureName }}</template>
- <template #link="{ content }">
- <gl-link :href="feedbackLink" target="_blank">{{ content }}</gl-link>
- </template>
- </gl-sprintf>
+ <gl-alert v-if="showAlert" @dismiss="dismissFeedbackAlert">
+ <slot></slot>
</gl-alert>
</div>
</template>
diff --git a/app/assets/javascripts/vue_shared/components/dropdown_keyboard_navigation.vue b/app/assets/javascripts/vue_shared/components/dropdown_keyboard_navigation.vue
new file mode 100644
index 00000000000..5d0ed8b0821
--- /dev/null
+++ b/app/assets/javascripts/vue_shared/components/dropdown_keyboard_navigation.vue
@@ -0,0 +1,81 @@
+<script>
+import { UP_KEY_CODE, DOWN_KEY_CODE, TAB_KEY_CODE } from '~/lib/utils/keycodes';
+
+export default {
+ model: {
+ prop: 'index',
+ event: 'change',
+ },
+ props: {
+ /* v-model property to manage location in list */
+ index: {
+ type: Number,
+ required: true,
+ },
+ /* Highest index that can be navigated to */
+ max: {
+ type: Number,
+ required: true,
+ },
+ /* Lowest index that can be navigated to */
+ min: {
+ type: Number,
+ required: true,
+ },
+ /* Which index to set v-model to on init */
+ defaultIndex: {
+ type: Number,
+ required: true,
+ },
+ },
+ watch: {
+ max() {
+ // If the max index (list length) changes, reset the index
+ this.$emit('change', this.defaultIndex);
+ },
+ },
+ created() {
+ this.$emit('change', this.defaultIndex);
+ document.addEventListener('keydown', this.handleKeydown);
+ },
+ beforeDestroy() {
+ document.removeEventListener('keydown', this.handleKeydown);
+ },
+ methods: {
+ handleKeydown(event) {
+ if (event.keyCode === DOWN_KEY_CODE) {
+ // Prevents moving scrollbar
+ event.preventDefault();
+ event.stopPropagation();
+ // Moves to next index
+ this.increment(1);
+ } else if (event.keyCode === UP_KEY_CODE) {
+ // Prevents moving scrollbar
+ event.preventDefault();
+ event.stopPropagation();
+ // Moves to previous index
+ this.increment(-1);
+ } else if (event.keyCode === TAB_KEY_CODE) {
+ this.$emit('tab');
+ }
+ },
+ increment(val) {
+ if (this.max === 0) {
+ return;
+ }
+
+ const nextIndex = Math.max(this.min, Math.min(this.index + val, this.max));
+
+ // Return if the index didn't change
+ if (nextIndex === this.index) {
+ return;
+ }
+
+ this.$emit('change', nextIndex);
+ },
+ },
+ render() {
+ return this.$slots.default;
+ },
+};
+</script>
diff --git a/app/assets/javascripts/vue_shared/components/filtered_search_bar/queries/epic.fragment.graphql b/app/assets/javascripts/vue_shared/components/filtered_search_bar/queries/epic.fragment.graphql
new file mode 100644
index 00000000000..9e9bda8ad3e
--- /dev/null
+++ b/app/assets/javascripts/vue_shared/components/filtered_search_bar/queries/epic.fragment.graphql
@@ -0,0 +1,15 @@
+fragment EpicNode on Epic {
+ id
+ iid
+ group {
+ fullPath
+ }
+ title
+ state
+ reference
+ referencePath: reference(full: true)
+ webPath
+ webUrl
+ createdAt
+ closedAt
+}
diff --git a/app/assets/javascripts/vue_shared/components/filtered_search_bar/queries/search_epics.query.graphql b/app/assets/javascripts/vue_shared/components/filtered_search_bar/queries/search_epics.query.graphql
new file mode 100644
index 00000000000..4bb4b586fc9
--- /dev/null
+++ b/app/assets/javascripts/vue_shared/components/filtered_search_bar/queries/search_epics.query.graphql
@@ -0,0 +1,16 @@
+#import "./epic.fragment.graphql"
+
+query searchEpics($fullPath: ID!, $search: String, $state: EpicState) {
+ group(fullPath: $fullPath) {
+ epics(
+ search: $search
+ state: $state
+ includeAncestorGroups: true
+ includeDescendantGroups: false
+ ) {
+ nodes {
+ ...EpicNode
+ }
+ }
+ }
+}
diff --git a/app/assets/javascripts/vue_shared/components/filtered_search_bar/tokens/base_token.vue b/app/assets/javascripts/vue_shared/components/filtered_search_bar/tokens/base_token.vue
index d1326e96794..cee7c40aa83 100644
--- a/app/assets/javascripts/vue_shared/components/filtered_search_bar/tokens/base_token.vue
+++ b/app/assets/javascripts/vue_shared/components/filtered_search_bar/tokens/base_token.vue
@@ -67,6 +67,11 @@ export default {
required: false,
default: 'id',
},
+ searchBy: {
+ type: String,
+ required: false,
+ default: undefined,
+ },
},
data() {
return {
@@ -112,16 +117,18 @@ export default {
);
},
showDefaultSuggestions() {
- return this.availableDefaultSuggestions.length;
+ return this.availableDefaultSuggestions.length > 0;
},
showRecentSuggestions() {
- return this.isRecentSuggestionsEnabled && this.recentSuggestions.length && !this.searchKey;
+ return (
+ this.isRecentSuggestionsEnabled && this.recentSuggestions.length > 0 && !this.searchKey
+ );
},
showPreloadedSuggestions() {
- return this.preloadedSuggestions.length && !this.searchKey;
+ return this.preloadedSuggestions.length > 0 && !this.searchKey;
},
showAvailableSuggestions() {
- return this.availableSuggestions.length;
+ return this.availableSuggestions.length > 0;
},
showSuggestions() {
// These conditions must match the template under `#suggestions` slot
@@ -134,13 +141,19 @@ export default {
this.showAvailableSuggestions
);
},
+ searchTerm() {
+ return this.searchBy && this.activeTokenValue
+ ? this.activeTokenValue[this.searchBy]
+ : undefined;
+ },
},
watch: {
active: {
immediate: true,
handler(newValue) {
if (!newValue && !this.suggestions.length) {
- this.$emit('fetch-suggestions', this.value.data);
+ const search = this.searchTerm ? this.searchTerm : this.value.data;
+ this.$emit('fetch-suggestions', search);
}
},
},
@@ -148,8 +161,10 @@ export default {
methods: {
handleInput: debounce(function debouncedSearch({ data }) {
this.searchKey = data;
- if (!this.suggestionsLoading) {
- this.$emit('fetch-suggestions', data);
+
+ if (!this.suggestionsLoading && !this.activeTokenValue) {
+ const search = this.searchTerm ? this.searchTerm : data;
+ this.$emit('fetch-suggestions', search);
}
}, DEBOUNCE_DELAY),
handleTokenValueSelected(activeTokenValue) {
diff --git a/app/assets/javascripts/vue_shared/components/filtered_search_bar/tokens/epic_token.vue b/app/assets/javascripts/vue_shared/components/filtered_search_bar/tokens/epic_token.vue
index 9f68308808e..9c2f5306654 100644
--- a/app/assets/javascripts/vue_shared/components/filtered_search_bar/tokens/epic_token.vue
+++ b/app/assets/javascripts/vue_shared/components/filtered_search_bar/tokens/epic_token.vue
@@ -1,22 +1,19 @@
<script>
-import {
- GlDropdownDivider,
- GlFilteredSearchSuggestion,
- GlFilteredSearchToken,
- GlLoadingIcon,
-} from '@gitlab/ui';
-import { debounce } from 'lodash';
+import { GlFilteredSearchSuggestion } from '@gitlab/ui';
import createFlash from '~/flash';
+import { getIdFromGraphQLId } from '~/graphql_shared/utils';
import { __ } from '~/locale';
-import { DEBOUNCE_DELAY, DEFAULT_NONE_ANY, FILTER_NONE_ANY, OPERATOR_IS_NOT } from '../constants';
+import { DEFAULT_NONE_ANY, FILTER_NONE_ANY, OPERATOR_IS_NOT } from '../constants';
+import searchEpicsQuery from '../queries/search_epics.query.graphql';
+
+import BaseToken from './base_token.vue';
export default {
- separator: '::&',
+ prefix: '&',
+ separator: '::',
components: {
- GlDropdownDivider,
- GlFilteredSearchToken,
+ BaseToken,
GlFilteredSearchSuggestion,
- GlLoadingIcon,
},
props: {
config: {
@@ -27,11 +24,15 @@ export default {
type: Object,
required: true,
},
+ active: {
+ type: Boolean,
+ required: true,
+ },
},
data() {
return {
epics: this.config.initialEpics || [],
- loading: true,
+ loading: false,
};
},
computed: {
@@ -56,98 +57,73 @@ export default {
}
return this.defaultEpics;
},
- activeEpic() {
- if (this.currentValue && this.epics.length) {
- // Check if current value is an epic ID.
- if (typeof this.currentValue === 'number') {
- return this.epics.find((epic) => epic[this.idProperty] === this.currentValue);
- }
-
- // Current value is a string.
- const [groupPath, idProperty] = this.currentValue?.split(this.$options.separator);
- return this.epics.find(
- (epic) =>
- epic.group_full_path === groupPath &&
- epic[this.idProperty] === parseInt(idProperty, 10),
- );
- }
- return null;
- },
- displayText() {
- return `${this.activeEpic?.title}${this.$options.separator}${this.activeEpic?.iid}`;
- },
- },
- watch: {
- active: {
- immediate: true,
- handler(newValue) {
- if (!newValue && !this.epics.length) {
- this.searchEpics({ data: this.currentValue });
- }
- },
- },
},
methods: {
- fetchEpicsBySearchTerm({ epicPath = '', search = '' }) {
+ fetchEpics(search = '') {
+ return this.$apollo
+ .query({
+ query: searchEpicsQuery,
+ variables: { fullPath: this.config.fullPath, search },
+ })
+ .then(({ data }) => data.group?.epics.nodes);
+ },
+ fetchEpicsBySearchTerm(search) {
this.loading = true;
- this.config
- .fetchEpics({ epicPath, search })
+ this.fetchEpics(search)
.then((response) => {
- this.epics = Array.isArray(response) ? response : response.data;
+ this.epics = Array.isArray(response) ? response : response?.data;
})
.catch(() => createFlash({ message: __('There was a problem fetching epics.') }))
.finally(() => {
this.loading = false;
});
},
- searchEpics: debounce(function debouncedSearch({ data }) {
- let epicPath = this.activeEpic?.web_url;
-
- // When user visits the page with token value already included in filters
- // We don't have any information about selected token except for its
- // group path and iid joined by separator, so we need to manually
- // compose epic path from it.
- if (data.includes?.(this.$options.separator)) {
- const [groupPath, epicIid] = data.split(this.$options.separator);
- epicPath = `/groups/${groupPath}/-/epics/${epicIid}`;
+ getActiveEpic(epics, data) {
+ if (data && epics.length) {
+ return epics.find((epic) => this.getValue(epic) === data);
}
- this.fetchEpicsBySearchTerm({ epicPath, search: data });
- }, DEBOUNCE_DELAY),
-
+ return undefined;
+ },
getValue(epic) {
- return this.config.useIdValue
- ? String(epic[this.idProperty])
- : `${epic.group_full_path}${this.$options.separator}${epic[this.idProperty]}`;
+ return this.getEpicIdProperty(epic).toString();
+ },
+ displayValue(epic) {
+ return `${this.$options.prefix}${this.getEpicIdProperty(epic)}${this.$options.separator}${
+ epic?.title
+ }`;
+ },
+ getEpicIdProperty(epic) {
+ return getIdFromGraphQLId(epic[this.idProperty]);
},
},
};
</script>
<template>
- <gl-filtered-search-token
+ <base-token
:config="config"
- v-bind="{ ...$props, ...$attrs }"
+ :value="value"
+ :active="active"
+ :suggestions-loading="loading"
+ :suggestions="epics"
+ :get-active-token-value="getActiveEpic"
+ :default-suggestions="availableDefaultEpics"
+ :recent-suggestions-storage-key="config.recentSuggestionsStorageKey"
+ search-by="title"
+ @fetch-suggestions="fetchEpicsBySearchTerm"
v-on="$listeners"
- @input="searchEpics"
>
- <template #view="{ inputValue }">
- {{ activeEpic ? displayText : inputValue }}
+ <template #view="{ viewTokenProps: { inputValue, activeTokenValue } }">
+ {{ activeTokenValue ? displayValue(activeTokenValue) : inputValue }}
</template>
- <template #suggestions>
+ <template #suggestions-list="{ suggestions }">
<gl-filtered-search-suggestion
- v-for="epic in availableDefaultEpics"
- :key="epic.value"
- :value="epic.value"
+ v-for="epic in suggestions"
+ :key="epic.id"
+ :value="getValue(epic)"
>
- {{ epic.text }}
+ {{ epic.title }}
</gl-filtered-search-suggestion>
- <gl-dropdown-divider v-if="availableDefaultEpics.length" />
- <gl-loading-icon v-if="loading" size="sm" />
- <template v-else>
- <gl-filtered-search-suggestion v-for="epic in epics" :key="epic.id" :value="getValue(epic)">
- {{ epic.title }}
- </gl-filtered-search-suggestion>
- </template>
</template>
- </gl-filtered-search-token>
+ </base-token>
</template>
diff --git a/app/assets/javascripts/vue_shared/components/issue/issue_assignees.vue b/app/assets/javascripts/vue_shared/components/issue/issue_assignees.vue
index b2f077f5329..5955f31fc70 100644
--- a/app/assets/javascripts/vue_shared/components/issue/issue_assignees.vue
+++ b/app/assets/javascripts/vue_shared/components/issue/issue_assignees.vue
@@ -77,7 +77,7 @@ export default {
};
</script>
<template>
- <div class="issue-assignees">
+ <div>
<user-avatar-link
v-for="assignee in assigneesToShow"
:key="assignee.id"
@@ -97,10 +97,9 @@ export default {
</user-avatar-link>
<span
v-if="numHiddenAssignees > 0"
- v-gl-tooltip
+ v-gl-tooltip.bottom
:title="assigneesCounterTooltip"
class="avatar-counter"
- data-placement="bottom"
data-qa-selector="avatar_counter_content"
>{{ assigneeCounterLabel }}</span
>
diff --git a/app/assets/javascripts/vue_shared/components/issue/related_issuable_item.vue b/app/assets/javascripts/vue_shared/components/issue/related_issuable_item.vue
index 095d1854c8b..8aeff9257a5 100644
--- a/app/assets/javascripts/vue_shared/components/issue/related_issuable_item.vue
+++ b/app/assets/javascripts/vue_shared/components/issue/related_issuable_item.vue
@@ -1,6 +1,12 @@
<script>
import '~/commons/bootstrap';
-import { GlIcon, GlTooltip, GlTooltipDirective, GlButton } from '@gitlab/ui';
+import {
+ GlIcon,
+ GlTooltip,
+ GlTooltipDirective,
+ GlButton,
+ GlSafeHtmlDirective as SafeHtml,
+} from '@gitlab/ui';
import IssueDueDate from '~/boards/components/issue_due_date.vue';
import { sprintf } from '~/locale';
import relatedIssuableMixin from '../../mixins/related_issuable_mixin';
@@ -22,6 +28,7 @@ export default {
},
directives: {
GlTooltip: GlTooltipDirective,
+ SafeHtml,
},
mixins: [relatedIssuableMixin],
props: {
@@ -84,7 +91,7 @@ export default {
/>
</div>
<gl-tooltip :target="() => $refs.iconElementXL">
- <span v-html="stateTitle /* eslint-disable-line vue/no-v-html */"></span>
+ <span v-safe-html="stateTitle"></span>
</gl-tooltip>
<gl-icon
v-if="confidential"
@@ -110,7 +117,7 @@ export default {
class="item-path-area item-path-id d-flex align-items-center mr-2 mt-2 mt-xl-0 ml-xl-2"
>
<gl-tooltip :target="() => this.$refs.iconElement">
- <span v-html="stateTitle /* eslint-disable-line vue/no-v-html */"></span>
+ <span v-safe-html="stateTitle"></span>
</gl-tooltip>
<span v-gl-tooltip :title="itemPath" class="path-id-text d-inline-block">{{
itemPath
diff --git a/app/assets/javascripts/vue_shared/components/markdown/apply_suggestion.vue b/app/assets/javascripts/vue_shared/components/markdown/apply_suggestion.vue
index d6a20984ad1..ce7cbafb97d 100644
--- a/app/assets/javascripts/vue_shared/components/markdown/apply_suggestion.vue
+++ b/app/assets/javascripts/vue_shared/components/markdown/apply_suggestion.vue
@@ -1,5 +1,6 @@
<script>
import { GlDropdown, GlDropdownForm, GlFormTextarea, GlButton } from '@gitlab/ui';
+import { __, n__ } from '~/locale';
export default {
components: { GlDropdown, GlDropdownForm, GlFormTextarea, GlButton },
@@ -13,12 +14,26 @@ export default {
type: String,
required: true,
},
+ batchSuggestionsCount: {
+ type: Number,
+ required: false,
+ default: 0,
+ },
},
data() {
return {
message: null,
};
},
+ computed: {
+ dropdownText() {
+ if (this.batchSuggestionsCount <= 1) {
+ return __('Apply suggestion');
+ }
+
+ return n__('Apply %d suggestion', 'Apply %d suggestions', this.batchSuggestionsCount);
+ },
+ },
methods: {
onApply() {
this.$emit('apply', this.message);
@@ -29,10 +44,11 @@ export default {
<template>
<gl-dropdown
- :text="__('Apply suggestion')"
+ :text="dropdownText"
:disabled="disabled"
boundary="window"
right
+ lazy
menu-class="gl-w-full!"
data-qa-selector="apply_suggestion_dropdown"
@shown="$refs.commitMessage.$el.focus()"
diff --git a/app/assets/javascripts/vue_shared/components/markdown/field.vue b/app/assets/javascripts/vue_shared/components/markdown/field.vue
index 77730ada9bb..86f04c78ebe 100644
--- a/app/assets/javascripts/vue_shared/components/markdown/field.vue
+++ b/app/assets/javascripts/vue_shared/components/markdown/field.vue
@@ -254,7 +254,7 @@ export default {
.then(() => $(this.$refs['markdown-preview']).renderGFM())
.catch(() =>
createFlash({
- message: __('Error rendering markdown preview'),
+ message: __('Error rendering Markdown preview'),
}),
);
},
diff --git a/app/assets/javascripts/vue_shared/components/markdown/suggestion_diff.vue b/app/assets/javascripts/vue_shared/components/markdown/suggestion_diff.vue
index 9c954fce322..7d8d8c0b90e 100644
--- a/app/assets/javascripts/vue_shared/components/markdown/suggestion_diff.vue
+++ b/app/assets/javascripts/vue_shared/components/markdown/suggestion_diff.vue
@@ -54,8 +54,8 @@ export default {
applySuggestion(callback, message) {
this.$emit('apply', { suggestionId: this.suggestion.id, callback, message });
},
- applySuggestionBatch() {
- this.$emit('applyBatch');
+ applySuggestionBatch(message) {
+ this.$emit('applyBatch', message);
},
addSuggestionToBatch() {
this.$emit('addToBatch', this.suggestion.id);
diff --git a/app/assets/javascripts/vue_shared/components/markdown/suggestion_diff_header.vue b/app/assets/javascripts/vue_shared/components/markdown/suggestion_diff_header.vue
index 5fdef0b1a23..f9ae59567b2 100644
--- a/app/assets/javascripts/vue_shared/components/markdown/suggestion_diff_header.vue
+++ b/app/assets/javascripts/vue_shared/components/markdown/suggestion_diff_header.vue
@@ -58,12 +58,19 @@ export default {
isApplyingSingle: false,
};
},
+
computed: {
isApplying() {
return this.isApplyingSingle || this.isApplyingBatch;
},
tooltipMessage() {
- return this.canApply ? __('This also resolves this thread') : this.inapplicableReason;
+ if (!this.canApply) {
+ return this.inapplicableReason;
+ }
+
+ return this.batchSuggestionsCount > 1
+ ? __('This also resolves all related threads')
+ : __('This also resolves this thread');
},
isDisableButton() {
return this.isApplying || !this.canApply;
@@ -72,13 +79,30 @@ export default {
if (this.isApplyingSingle || this.batchSuggestionsCount < 2) {
return __('Applying suggestion...');
}
+
return __('Applying suggestions...');
},
isLoggedIn() {
return isLoggedIn();
},
+ showApplySuggestion() {
+ if (!this.isLoggedIn) return false;
+
+ if (this.batchSuggestionsCount >= 1 && !this.isBatched) {
+ return false;
+ }
+
+ return true;
+ },
},
methods: {
+ apply(message) {
+ if (this.batchSuggestionsCount > 1) {
+ this.applySuggestionBatch(message);
+ } else {
+ this.applySuggestion(message);
+ }
+ },
applySuggestion(message) {
if (!this.canApply) return;
this.isApplyingSingle = true;
@@ -88,9 +112,9 @@ export default {
applySuggestionCallback() {
this.isApplyingSingle = false;
},
- applySuggestionBatch() {
+ applySuggestionBatch(message) {
if (!this.canApply) return;
- this.$emit('applyBatch');
+ this.$emit('applyBatch', message);
},
addSuggestionToBatch() {
this.$emit('addToBatch');
@@ -115,45 +139,34 @@ export default {
<gl-loading-icon size="sm" class="d-flex-center mr-2" />
<span>{{ applyingSuggestionsMessage }}</span>
</div>
- <div v-else-if="canApply && isBatched" class="d-flex align-items-center">
- <gl-button
- class="btn-inverted js-remove-from-batch-btn btn-grouped"
- :disabled="isApplying"
- @click="removeSuggestionFromBatch"
- >
- {{ __('Remove from batch') }}
- </gl-button>
- <gl-button
- v-gl-tooltip.viewport="__('This also resolves all related threads')"
- class="btn-inverted js-apply-batch-btn btn-grouped"
- data-qa-selector="apply_suggestions_batch_button"
- :disabled="isApplying"
- variant="success"
- @click="applySuggestionBatch"
- >
- {{ __('Apply suggestions') }}
- <span class="badge badge-pill badge-pill-success">
- {{ batchSuggestionsCount }}
- </span>
- </gl-button>
- </div>
- <div v-else class="d-flex align-items-center">
- <gl-button
- v-if="suggestionsCount > 1 && !isDisableButton"
- class="btn-inverted js-add-to-batch-btn btn-grouped"
- data-qa-selector="add_suggestion_batch_button"
- :disabled="isDisableButton"
- @click="addSuggestionToBatch"
- >
- {{ __('Add suggestion to batch') }}
- </gl-button>
+ <div v-else-if="isLoggedIn" class="d-flex align-items-center">
+ <div v-if="isBatched">
+ <gl-button
+ class="btn-inverted js-remove-from-batch-btn btn-grouped"
+ :disabled="isApplying"
+ @click="removeSuggestionFromBatch"
+ >
+ {{ __('Remove from batch') }}
+ </gl-button>
+ </div>
+ <div v-else-if="!isDisableButton && suggestionsCount > 1">
+ <gl-button
+ class="btn-inverted js-add-to-batch-btn btn-grouped"
+ data-qa-selector="add_suggestion_batch_button"
+ :disabled="isDisableButton"
+ @click="addSuggestionToBatch"
+ >
+ {{ __('Add suggestion to batch') }}
+ </gl-button>
+ </div>
<apply-suggestion
- v-if="isLoggedIn"
+ v-if="showApplySuggestion"
v-gl-tooltip.viewport="tooltipMessage"
:disabled="isDisableButton"
:default-commit-message="defaultCommitMessage"
+ :batch-suggestions-count="batchSuggestionsCount"
class="gl-ml-3"
- @apply="applySuggestion"
+ @apply="apply"
/>
</div>
</div>
diff --git a/app/assets/javascripts/vue_shared/components/markdown/suggestions.vue b/app/assets/javascripts/vue_shared/components/markdown/suggestions.vue
index 63774c6c498..e36cfb3b275 100644
--- a/app/assets/javascripts/vue_shared/components/markdown/suggestions.vue
+++ b/app/assets/javascripts/vue_shared/components/markdown/suggestions.vue
@@ -68,6 +68,10 @@ export default {
if (this.suggestionsWatch) {
this.suggestionsWatch();
}
+
+ if (this.defaultCommitMessageWatch) {
+ this.defaultCommitMessageWatch();
+ }
},
methods: {
renderSuggestions() {
@@ -123,12 +127,16 @@ export default {
suggestionDiff.suggestionsCount = this.suggestionsCount;
});
+ this.defaultCommitMessageWatch = this.$watch('defaultCommitMessage', () => {
+ suggestionDiff.defaultCommitMessage = this.defaultCommitMessage;
+ });
+
suggestionDiff.$on('apply', ({ suggestionId, callback, message }) => {
this.$emit('apply', { suggestionId, callback, flashContainer: this.$el, message });
});
- suggestionDiff.$on('applyBatch', () => {
- this.$emit('applyBatch', { flashContainer: this.$el });
+ suggestionDiff.$on('applyBatch', (message) => {
+ this.$emit('applyBatch', { message, flashContainer: this.$el });
});
suggestionDiff.$on('addToBatch', (suggestionId) => {
diff --git a/app/assets/javascripts/vue_shared/components/notes/placeholder_note.vue b/app/assets/javascripts/vue_shared/components/notes/placeholder_note.vue
index d6501a37a35..9ea14ed506c 100644
--- a/app/assets/javascripts/vue_shared/components/notes/placeholder_note.vue
+++ b/app/assets/javascripts/vue_shared/components/notes/placeholder_note.vue
@@ -34,12 +34,23 @@ export default {
type: Object,
required: true,
},
+ line: {
+ type: Object,
+ required: false,
+ default: null,
+ },
},
computed: {
...mapGetters(['getUserData']),
renderedNote() {
return renderMarkdown(this.note.body);
},
+ avatarSize() {
+ if (this.line) {
+ return 16;
+ }
+ return 40;
+ },
},
};
</script>
@@ -50,7 +61,7 @@ export default {
<user-avatar-link
:link-href="getUserData.path"
:img-src="getUserData.avatar_url"
- :img-size="40"
+ :img-size="avatarSize"
/>
</div>
<div ref="note" :class="{ discussion: !note.individual_note }" class="timeline-content">
diff --git a/app/assets/javascripts/vue_shared/components/oncall_schedules_list.vue b/app/assets/javascripts/vue_shared/components/oncall_schedules_list.vue
deleted file mode 100644
index e37a663ace3..00000000000
--- a/app/assets/javascripts/vue_shared/components/oncall_schedules_list.vue
+++ /dev/null
@@ -1,74 +0,0 @@
-<script>
-import { GlSprintf, GlLink } from '@gitlab/ui';
-import { sprintf, s__ } from '~/locale';
-
-export default {
- components: {
- GlSprintf,
- GlLink,
- },
- props: {
- schedules: {
- type: Array,
- required: true,
- },
- userName: {
- type: String,
- required: false,
- default: null,
- },
- isCurrentUser: {
- type: Boolean,
- required: false,
- default: false,
- },
- },
- computed: {
- title() {
- return this.isCurrentUser
- ? s__('OnCallSchedules|You are currently a part of:')
- : sprintf(
- s__('OnCallSchedules|User %{name} is currently part of:'),
- {
- name: this.userName,
- },
- false,
- );
- },
- footer() {
- return this.isCurrentUser
- ? s__(
- 'OnCallSchedules|Removing yourself may put your on-call team at risk of missing a notification.',
- )
- : s__(
- 'OnCallSchedules|Removing this user may put their on-call team at risk of missing a notification.',
- );
- },
- },
-};
-</script>
-
-<template>
- <div>
- <p data-testid="title">{{ title }}</p>
-
- <ul data-testid="schedules-list">
- <li v-for="(schedule, index) in schedules" :key="`${schedule.name}-${index}`">
- <gl-sprintf
- :message="s__('OnCallSchedules|On-call schedule %{schedule} in Project %{project}')"
- >
- <template #schedule>
- <gl-link :href="schedule.scheduleUrl" target="_blank">{{ schedule.name }}</gl-link>
- </template>
- <template #project>
- <gl-link :href="schedule.projectUrl" target="_blank">{{
- schedule.projectName
- }}</gl-link>
- </template>
- </gl-sprintf>
- </li>
- </ul>
-
- <p data-testid="footer">{{ footer }}</p>
- </div>
-</template>
diff --git a/app/assets/javascripts/vue_shared/components/project_selector/project_list_item.stories.js b/app/assets/javascripts/vue_shared/components/project_selector/project_list_item.stories.js
new file mode 100644
index 00000000000..9700117a3da
--- /dev/null
+++ b/app/assets/javascripts/vue_shared/components/project_selector/project_list_item.stories.js
@@ -0,0 +1,34 @@
+import ProjectListItem from './project_list_item.vue';
+
+export default {
+ component: ProjectListItem,
+ title: 'vue_shared/components/project_selector/project_list_item',
+};
+
+const Template = (args, { argTypes }) => ({
+ components: { ProjectListItem },
+ props: Object.keys(argTypes),
+ template: '<project-list-item v-bind="$props" />',
+});
+
+export const Default = Template.bind({});
+Default.args = {
+ project: {
+ id: '1',
+ name: 'MyProject',
+ name_with_namespace: 'path / to / MyProject',
+ },
+ selected: false,
+};
+
+export const SelectedProject = Template.bind({});
+SelectedProject.args = {
+ ...Default.args,
+ selected: true,
+};
+
+export const MatchedProject = Template.bind({});
+MatchedProject.args = {
+ ...Default.args,
+ matcher: 'proj',
+};
diff --git a/app/assets/javascripts/vue_shared/components/project_selector/project_list_item.vue b/app/assets/javascripts/vue_shared/components/project_selector/project_list_item.vue
index 36d3696ec36..0bd57c84018 100644
--- a/app/assets/javascripts/vue_shared/components/project_selector/project_list_item.vue
+++ b/app/assets/javascripts/vue_shared/components/project_selector/project_list_item.vue
@@ -1,5 +1,5 @@
<script>
-import { GlButton, GlIcon } from '@gitlab/ui';
+import { GlButton, GlIcon, GlSafeHtmlDirective as SafeHtml } from '@gitlab/ui';
import { isString } from 'lodash';
import highlight from '~/lib/utils/highlight';
import { truncateNamespace } from '~/lib/utils/text_utility';
@@ -8,6 +8,7 @@ import ProjectAvatar from '~/vue_shared/components/deprecated_project_avatar/def
export default {
name: 'ProjectListItem',
components: { GlIcon, ProjectAvatar, GlButton },
+ directives: { SafeHtml },
props: {
project: {
type: Object,
@@ -58,9 +59,9 @@ export default {
<span v-if="truncatedNamespace" class="text-secondary">/&nbsp;</span>
</div>
<div
+ v-safe-html="highlightedProjectName"
:title="project.name"
class="js-project-name text-truncate"
- v-html="highlightedProjectName /* eslint-disable-line vue/no-v-html */"
></div>
</div>
</gl-button>
diff --git a/app/assets/javascripts/vue_shared/components/sidebar/copyable_field.vue b/app/assets/javascripts/vue_shared/components/sidebar/copyable_field.vue
index 5c3a6852219..6538de085b0 100644
--- a/app/assets/javascripts/vue_shared/components/sidebar/copyable_field.vue
+++ b/app/assets/javascripts/vue_shared/components/sidebar/copyable_field.vue
@@ -62,7 +62,7 @@ export default {
<div>
<clipboard-button
v-if="!isLoading"
- css-class="sidebar-collapsed-icon dont-change-state gl-rounded-0! gl-hover-bg-transparent"
+ css-class="sidebar-collapsed-icon js-dont-change-state gl-rounded-0! gl-hover-bg-transparent"
v-bind="clipboardProps"
/>
diff --git a/app/assets/javascripts/vue_shared/components/sidebar/labels_select_vue/store/mutations.js b/app/assets/javascripts/vue_shared/components/sidebar/labels_select_vue/store/mutations.js
index 8853dc8b9e3..0ea22eb7aea 100644
--- a/app/assets/javascripts/vue_shared/components/sidebar/labels_select_vue/store/mutations.js
+++ b/app/assets/javascripts/vue_shared/components/sidebar/labels_select_vue/store/mutations.js
@@ -1,4 +1,5 @@
import { isScopedLabel, scopedLabelKey } from '~/lib/utils/common_utils';
+import { SCOPED_LABEL_DELIMITER } from '~/vue_shared/components/sidebar/labels_select_widget/constants';
import { DropdownVariant } from '../constants';
import * as types from './mutation_types';
@@ -66,10 +67,10 @@ export default {
}
if (isScopedLabel(candidateLabel)) {
- const scopedBase = scopedLabelKey(candidateLabel);
- const currentActiveScopedLabel = state.labels.find(({ title }) => {
- return title.startsWith(scopedBase) && title !== '' && title !== candidateLabel.title;
- });
+ const scopedKeyWithDelimiter = `${scopedLabelKey(candidateLabel)}${SCOPED_LABEL_DELIMITER}`;
+ const currentActiveScopedLabel = state.labels.find(
+ ({ title }) => title.startsWith(scopedKeyWithDelimiter) && title !== candidateLabel.title,
+ );
if (currentActiveScopedLabel) {
currentActiveScopedLabel.set = false;
diff --git a/app/assets/javascripts/vue_shared/components/sidebar/labels_select_widget/constants.js b/app/assets/javascripts/vue_shared/components/sidebar/labels_select_widget/constants.js
index 00c54313292..389eb174c0e 100644
--- a/app/assets/javascripts/vue_shared/components/sidebar/labels_select_widget/constants.js
+++ b/app/assets/javascripts/vue_shared/components/sidebar/labels_select_widget/constants.js
@@ -1,3 +1,5 @@
+export const SCOPED_LABEL_DELIMITER = '::';
+
export const DropdownVariant = {
Sidebar: 'sidebar',
Standalone: 'standalone',
diff --git a/app/assets/javascripts/vue_shared/components/sidebar/labels_select_widget/dropdown_contents.vue b/app/assets/javascripts/vue_shared/components/sidebar/labels_select_widget/dropdown_contents.vue
index 0fcc67c0ffa..3ee0baf8812 100644
--- a/app/assets/javascripts/vue_shared/components/sidebar/labels_select_widget/dropdown_contents.vue
+++ b/app/assets/javascripts/vue_shared/components/sidebar/labels_select_widget/dropdown_contents.vue
@@ -1,9 +1,9 @@
<script>
import { GlButton, GlDropdown, GlDropdownItem, GlLink } from '@gitlab/ui';
-
+import { __, s__, sprintf } from '~/locale';
import DropdownContentsCreateView from './dropdown_contents_create_view.vue';
import DropdownContentsLabelsView from './dropdown_contents_labels_view.vue';
-import { isDropdownVariantSidebar, isDropdownVariantEmbedded } from './utils';
+import { isDropdownVariantStandalone, isDropdownVariantSidebar } from './utils';
export default {
components: {
@@ -48,10 +48,30 @@ export default {
type: String,
required: true,
},
+ issuableType: {
+ type: String,
+ required: true,
+ },
+ isVisible: {
+ type: Boolean,
+ required: false,
+ default: false,
+ },
+ fullPath: {
+ type: String,
+ required: true,
+ },
+ attrWorkspacePath: {
+ type: String,
+ required: false,
+ default: undefined,
+ },
},
data() {
return {
showDropdownContentsCreateView: false,
+ localSelectedLabels: [...this.selectedLabels],
+ isDirty: false,
};
},
computed: {
@@ -64,28 +84,66 @@ export default {
dropdownTitle() {
return this.showDropdownContentsCreateView ? this.labelsCreateTitle : this.labelsListTitle;
},
+ buttonText() {
+ if (!this.localSelectedLabels.length) {
+ return this.dropdownButtonText || __('Label');
+ } else if (this.localSelectedLabels.length > 1) {
+ return sprintf(s__('LabelSelect|%{firstLabelName} +%{remainingLabelCount} more'), {
+ firstLabelName: this.localSelectedLabels[0].title,
+ remainingLabelCount: this.localSelectedLabels.length - 1,
+ });
+ }
+ return this.localSelectedLabels[0].title;
+ },
showDropdownFooter() {
- return (
- !this.showDropdownContentsCreateView &&
- (this.isDropdownVariantSidebar(this.variant) ||
- this.isDropdownVariantEmbedded(this.variant))
- );
+ return !this.showDropdownContentsCreateView && !this.isStandalone;
+ },
+ isStandalone() {
+ return isDropdownVariantStandalone(this.variant);
},
},
- methods: {
- showDropdown() {
- this.$refs.dropdown.show();
+ watch: {
+ localSelectedLabels: {
+ handler() {
+ this.isDirty = true;
+ },
+ deep: true,
+ },
+ isVisible(newVal) {
+ if (newVal) {
+ this.$refs.dropdown.show();
+ this.isDirty = false;
+ } else {
+ this.$refs.dropdown.hide();
+ this.setLabels();
+ }
},
+ selectedLabels(newVal) {
+ this.localSelectedLabels = newVal;
+ },
+ },
+ methods: {
toggleDropdownContentsCreateView() {
this.showDropdownContentsCreateView = !this.showDropdownContentsCreateView;
},
toggleDropdownContent() {
this.toggleDropdownContentsCreateView();
// Required to recalculate dropdown position as its size changes
- this.$refs.dropdown.$refs.dropdown.$_popper.scheduleUpdate();
+ if (this.$refs.dropdown?.$refs.dropdown) {
+ this.$refs.dropdown.$refs.dropdown.$_popper.scheduleUpdate();
+ }
+ },
+ setLabels() {
+ if (!this.isDirty) {
+ return;
+ }
+ this.$emit('setLabels', this.localSelectedLabels);
+ },
+ handleDropdownHide() {
+ if (!isDropdownVariantSidebar(this.variant)) {
+ this.setLabels();
+ }
},
- isDropdownVariantSidebar,
- isDropdownVariantEmbedded,
},
};
</script>
@@ -93,14 +151,16 @@ export default {
<template>
<gl-dropdown
ref="dropdown"
- :text="dropdownButtonText"
+ :text="buttonText"
class="gl-w-full gl-mt-2"
data-qa-selector="labels_dropdown_content"
+ @hide="handleDropdownHide"
>
<template #header>
<div
- v-if="isDropdownVariantSidebar(variant) || isDropdownVariantEmbedded(variant)"
+ v-if="!isStandalone"
class="dropdown-title gl-display-flex gl-align-items-center gl-pt-0 gl-pb-3!"
+ data-testid="dropdown-header"
>
<gl-button
v-if="showDropdownContentsCreateView"
@@ -119,27 +179,33 @@ export default {
size="small"
class="dropdown-header-button gl-p-0!"
icon="close"
+ data-testid="close-button"
@click="$emit('closeDropdown')"
/>
</div>
</template>
- <component
- :is="dropdownContentsView"
- :selected-labels="selectedLabels"
- :allow-multiselect="allowMultiselect"
- @hideCreateView="toggleDropdownContentsCreateView"
- @setLabels="$emit('setLabels', $event)"
- />
+ <template #default>
+ <component
+ :is="dropdownContentsView"
+ v-model="localSelectedLabels"
+ :selected-labels="selectedLabels"
+ :allow-multiselect="allowMultiselect"
+ :issuable-type="issuableType"
+ :full-path="fullPath"
+ :attr-workspace-path="attrWorkspacePath"
+ @hideCreateView="toggleDropdownContentsCreateView"
+ />
+ </template>
<template #footer>
<div v-if="showDropdownFooter" data-testid="dropdown-footer">
<gl-dropdown-item
v-if="allowLabelCreate"
data-testid="create-label-button"
- @click.native.capture.stop="toggleDropdownContent"
+ @click.capture.native.stop="toggleDropdownContent"
>
{{ footerCreateLabelTitle }}
</gl-dropdown-item>
- <gl-dropdown-item :href="labelsManagePath" @click.native.capture.stop>
+ <gl-dropdown-item :href="labelsManagePath" @click.capture.native.stop>
{{ footerManageLabelTitle }}
</gl-dropdown-item>
</div>
diff --git a/app/assets/javascripts/vue_shared/components/sidebar/labels_select_widget/dropdown_contents_create_view.vue b/app/assets/javascripts/vue_shared/components/sidebar/labels_select_widget/dropdown_contents_create_view.vue
index 2e31b386fdd..a2ed08e6b28 100644
--- a/app/assets/javascripts/vue_shared/components/sidebar/labels_select_widget/dropdown_contents_create_view.vue
+++ b/app/assets/javascripts/vue_shared/components/sidebar/labels_select_widget/dropdown_contents_create_view.vue
@@ -2,9 +2,10 @@
import { GlTooltipDirective, GlButton, GlFormInput, GlLink, GlLoadingIcon } from '@gitlab/ui';
import produce from 'immer';
import createFlash from '~/flash';
+import { IssuableType } from '~/issue_show/constants';
import { __ } from '~/locale';
+import { labelsQueries } from '~/sidebar/constants';
import createLabelMutation from './graphql/create_label.mutation.graphql';
-import projectLabelsQuery from './graphql/project_labels.query.graphql';
const errorMessage = __('Error creating label.');
@@ -18,9 +19,19 @@ export default {
directives: {
GlTooltip: GlTooltipDirective,
},
- inject: {
- projectPath: {
- default: '',
+ props: {
+ issuableType: {
+ type: String,
+ required: true,
+ },
+ fullPath: {
+ type: String,
+ required: true,
+ },
+ attrWorkspacePath: {
+ type: String,
+ required: false,
+ default: undefined,
},
},
data() {
@@ -38,6 +49,27 @@ export default {
const colorsMap = gon.suggested_label_colors;
return Object.keys(colorsMap).map((color) => ({ [color]: colorsMap[color] }));
},
+ mutationVariables() {
+ if (this.issuableType === IssuableType.Epic) {
+ return {
+ title: this.labelTitle,
+ color: this.selectedColor,
+ groupPath: this.fullPath,
+ };
+ }
+
+ return this.attrWorkspacePath !== undefined
+ ? {
+ title: this.labelTitle,
+ color: this.selectedColor,
+ groupPath: this.attrWorkspacePath,
+ }
+ : {
+ title: this.labelTitle,
+ color: this.selectedColor,
+ projectPath: this.fullPath,
+ };
+ },
},
methods: {
getColorCode(color) {
@@ -51,8 +83,8 @@ export default {
},
updateLabelsInCache(store, label) {
const sourceData = store.readQuery({
- query: projectLabelsQuery,
- variables: { fullPath: this.projectPath, searchTerm: '' },
+ query: labelsQueries[this.issuableType].workspaceQuery,
+ variables: { fullPath: this.fullPath, searchTerm: '' },
});
const collator = new Intl.Collator('en');
@@ -63,8 +95,8 @@ export default {
});
store.writeQuery({
- query: projectLabelsQuery,
- variables: { fullPath: this.projectPath, searchTerm: '' },
+ query: labelsQueries[this.issuableType].workspaceQuery,
+ variables: { fullPath: this.fullPath, searchTerm: '' },
data,
});
},
@@ -75,11 +107,7 @@ export default {
data: { labelCreate },
} = await this.$apollo.mutate({
mutation: createLabelMutation,
- variables: {
- title: this.labelTitle,
- color: this.selectedColor,
- projectPath: this.projectPath,
- },
+ variables: this.mutationVariables,
update: (
store,
{
diff --git a/app/assets/javascripts/vue_shared/components/sidebar/labels_select_widget/dropdown_contents_labels_view.vue b/app/assets/javascripts/vue_shared/components/sidebar/labels_select_widget/dropdown_contents_labels_view.vue
index 857367a0721..e6a25362ff0 100644
--- a/app/assets/javascripts/vue_shared/components/sidebar/labels_select_widget/dropdown_contents_labels_view.vue
+++ b/app/assets/javascripts/vue_shared/components/sidebar/labels_select_widget/dropdown_contents_labels_view.vue
@@ -1,12 +1,18 @@
<script>
-import { GlDropdownForm, GlDropdownItem, GlLoadingIcon, GlSearchBoxByType } from '@gitlab/ui';
+import {
+ GlDropdownForm,
+ GlDropdownItem,
+ GlLoadingIcon,
+ GlSearchBoxByType,
+ GlIntersectionObserver,
+} from '@gitlab/ui';
import fuzzaldrinPlus from 'fuzzaldrin-plus';
import { debounce } from 'lodash';
import createFlash from '~/flash';
import { getIdFromGraphQLId } from '~/graphql_shared/utils';
import { DEFAULT_DEBOUNCE_AND_THROTTLE_MS } from '~/lib/utils/constants';
import { __ } from '~/locale';
-import projectLabelsQuery from './graphql/project_labels.query.graphql';
+import { labelsQueries } from '~/sidebar/constants';
import LabelItem from './label_item.vue';
export default {
@@ -15,9 +21,12 @@ export default {
GlDropdownItem,
GlLoadingIcon,
GlSearchBoxByType,
+ GlIntersectionObserver,
LabelItem,
},
- inject: ['projectPath'],
+ model: {
+ prop: 'localSelectedLabels',
+ },
props: {
selectedLabels: {
type: Array,
@@ -27,30 +36,44 @@ export default {
type: Boolean,
required: true,
},
+ issuableType: {
+ type: String,
+ required: true,
+ },
+ localSelectedLabels: {
+ type: Array,
+ required: true,
+ },
+ fullPath: {
+ type: String,
+ required: true,
+ },
},
data() {
return {
searchKey: '',
labels: [],
- localSelectedLabels: [...this.selectedLabels],
+ isVisible: false,
};
},
apollo: {
labels: {
- query: projectLabelsQuery,
+ query() {
+ return labelsQueries[this.issuableType].workspaceQuery;
+ },
variables() {
return {
- fullPath: this.projectPath,
+ fullPath: this.fullPath,
searchTerm: this.searchKey,
};
},
skip() {
- return this.searchKey.length === 1;
+ return this.searchKey.length === 1 || !this.isVisible;
},
update: (data) => data.workspace?.labels?.nodes || [],
async result() {
if (this.$refs.searchInput) {
- await this.$nextTick();
+ await this.$nextTick;
this.$refs.searchInput.focusInput();
}
},
@@ -64,7 +87,7 @@ export default {
return this.$apollo.queries.labels.loading;
},
localSelectedLabelsIds() {
- return this.localSelectedLabels.map((label) => label.id);
+ return this.localSelectedLabels.map((label) => getIdFromGraphQLId(label.id));
},
visibleLabels() {
if (this.searchKey) {
@@ -82,7 +105,6 @@ export default {
this.debouncedSearchKeyUpdate = debounce(this.setSearchKey, DEFAULT_DEBOUNCE_AND_THROTTLE_MS);
},
beforeDestroy() {
- this.$emit('setLabels', this.localSelectedLabels);
this.debouncedSearchKeyUpdate.cancel();
},
methods: {
@@ -109,16 +131,21 @@ export default {
}
},
updateSelectedLabels(label) {
+ let labels;
if (this.isLabelSelected(label)) {
- this.localSelectedLabels = this.localSelectedLabels.filter(
- ({ id }) => id !== getIdFromGraphQLId(label.id),
+ labels = this.localSelectedLabels.filter(
+ ({ id }) => id !== getIdFromGraphQLId(label.id) && id !== label.id,
);
} else {
- this.localSelectedLabels.push({
- ...label,
- id: getIdFromGraphQLId(label.id),
- });
+ labels = [
+ ...this.localSelectedLabels,
+ {
+ ...label,
+ id: getIdFromGraphQLId(label.id),
+ },
+ ];
}
+ this.$emit('input', labels);
},
handleLabelClick(label) {
this.updateSelectedLabels(label);
@@ -129,46 +156,52 @@ export default {
setSearchKey(value) {
this.searchKey = value;
},
+ onDropdownAppear() {
+ this.isVisible = true;
+ this.$refs.searchInput.focusInput();
+ },
},
};
</script>
<template>
- <gl-dropdown-form class="labels-select-contents-list js-labels-list">
- <gl-search-box-by-type
- ref="searchInput"
- :value="searchKey"
- :disabled="labelsFetchInProgress"
- data-qa-selector="dropdown_input_field"
- data-testid="dropdown-input-field"
- @input="debouncedSearchKeyUpdate"
- />
- <div ref="labelsListContainer" data-testid="dropdown-content">
- <gl-loading-icon
- v-if="labelsFetchInProgress"
- class="labels-fetch-loading gl-align-items-center gl-w-full gl-h-full"
- size="md"
+ <gl-intersection-observer @appear="onDropdownAppear">
+ <gl-dropdown-form class="labels-select-contents-list js-labels-list">
+ <gl-search-box-by-type
+ ref="searchInput"
+ :value="searchKey"
+ :disabled="labelsFetchInProgress"
+ data-qa-selector="dropdown_input_field"
+ data-testid="dropdown-input-field"
+ @input="debouncedSearchKeyUpdate"
/>
- <template v-else>
- <gl-dropdown-item
- v-for="label in visibleLabels"
- :key="label.id"
- :is-checked="isLabelSelected(label)"
- :is-check-centered="true"
- :is-check-item="true"
- data-testid="labels-list"
- @click.native.capture.stop="handleLabelClick(label)"
- >
- <label-item :label="label" />
- </gl-dropdown-item>
- <gl-dropdown-item
- v-show="showNoMatchingResultsMessage"
- class="gl-p-3 gl-text-center"
- data-testid="no-results"
- >
- {{ __('No matching results') }}
- </gl-dropdown-item>
- </template>
- </div>
- </gl-dropdown-form>
+ <div ref="labelsListContainer" data-testid="dropdown-content">
+ <gl-loading-icon
+ v-if="labelsFetchInProgress"
+ class="labels-fetch-loading gl-align-items-center gl-w-full gl-h-full gl-mb-3"
+ size="md"
+ />
+ <template v-else>
+ <gl-dropdown-item
+ v-for="label in visibleLabels"
+ :key="label.id"
+ :is-checked="isLabelSelected(label)"
+ :is-check-centered="true"
+ :is-check-item="true"
+ data-testid="labels-list"
+ @click.native.capture.stop="handleLabelClick(label)"
+ >
+ <label-item :label="label" />
+ </gl-dropdown-item>
+ <gl-dropdown-item
+ v-show="showNoMatchingResultsMessage"
+ class="gl-p-3 gl-text-center"
+ data-testid="no-results"
+ >
+ {{ __('No matching results') }}
+ </gl-dropdown-item>
+ </template>
+ </div>
+ </gl-dropdown-form>
+ </gl-intersection-observer>
</template>
diff --git a/app/assets/javascripts/vue_shared/components/sidebar/labels_select_widget/graphql/epic_labels.query.graphql b/app/assets/javascripts/vue_shared/components/sidebar/labels_select_widget/graphql/epic_labels.query.graphql
new file mode 100644
index 00000000000..a2e8579486f
--- /dev/null
+++ b/app/assets/javascripts/vue_shared/components/sidebar/labels_select_widget/graphql/epic_labels.query.graphql
@@ -0,0 +1,15 @@
+query epicLabels($fullPath: ID!, $iid: ID) {
+ workspace: group(fullPath: $fullPath) {
+ issuable: epic(iid: $iid) {
+ id
+ labels {
+ nodes {
+ id
+ title
+ color
+ description
+ }
+ }
+ }
+ }
+}
diff --git a/app/assets/javascripts/vue_shared/components/sidebar/labels_select_widget/graphql/group_labels.query.graphql b/app/assets/javascripts/vue_shared/components/sidebar/labels_select_widget/graphql/group_labels.query.graphql
new file mode 100644
index 00000000000..acc9bcd2015
--- /dev/null
+++ b/app/assets/javascripts/vue_shared/components/sidebar/labels_select_widget/graphql/group_labels.query.graphql
@@ -0,0 +1,12 @@
+query groupLabels($fullPath: ID!, $searchTerm: String) {
+ workspace: group(fullPath: $fullPath) {
+ labels(searchTerm: $searchTerm, onlyGroupLabels: true) {
+ nodes {
+ id
+ title
+ color
+ description
+ }
+ }
+ }
+}
diff --git a/app/assets/javascripts/vue_shared/components/sidebar/labels_select_widget/labels_select_root.vue b/app/assets/javascripts/vue_shared/components/sidebar/labels_select_widget/labels_select_root.vue
index 3c834770563..6bd43da2203 100644
--- a/app/assets/javascripts/vue_shared/components/sidebar/labels_select_widget/labels_select_root.vue
+++ b/app/assets/javascripts/vue_shared/components/sidebar/labels_select_widget/labels_select_root.vue
@@ -1,21 +1,18 @@
<script>
-import Vue from 'vue';
-import Vuex from 'vuex';
+import createFlash from '~/flash';
import { __ } from '~/locale';
import SidebarEditableItem from '~/sidebar/components/sidebar_editable_item.vue';
+import { labelsQueries } from '~/sidebar/constants';
import { DropdownVariant } from './constants';
import DropdownContents from './dropdown_contents.vue';
import DropdownValue from './dropdown_value.vue';
import DropdownValueCollapsed from './dropdown_value_collapsed.vue';
-import issueLabelsQuery from './graphql/issue_labels.query.graphql';
import {
isDropdownVariantSidebar,
isDropdownVariantStandalone,
isDropdownVariantEmbedded,
} from './utils';
-Vue.use(Vuex);
-
export default {
components: {
DropdownValue,
@@ -23,8 +20,21 @@ export default {
DropdownValueCollapsed,
SidebarEditableItem,
},
- inject: ['iid', 'projectPath', 'allowLabelEdit'],
+ inject: {
+ allowLabelEdit: {
+ default: false,
+ },
+ },
props: {
+ iid: {
+ type: String,
+ required: false,
+ default: '',
+ },
+ fullPath: {
+ type: String,
+ required: true,
+ },
allowLabelRemove: {
type: Boolean,
required: false,
@@ -90,43 +100,60 @@ export default {
required: false,
default: false,
},
+ issuableType: {
+ type: String,
+ required: true,
+ },
+ attrWorkspacePath: {
+ type: String,
+ required: false,
+ default: undefined,
+ },
},
data() {
return {
contentIsOnViewport: true,
- issueLabels: [],
+ issuableLabels: [],
};
},
+ computed: {
+ isLoading() {
+ return this.labelsSelectInProgress || this.$apollo.queries.issuableLabels.loading;
+ },
+ },
apollo: {
- issueLabels: {
- query: issueLabelsQuery,
+ issuableLabels: {
+ query() {
+ return labelsQueries[this.issuableType].issuableQuery;
+ },
+ skip() {
+ return !isDropdownVariantSidebar(this.variant);
+ },
variables() {
return {
iid: this.iid,
- fullPath: this.projectPath,
+ fullPath: this.fullPath,
};
},
update(data) {
return data.workspace?.issuable?.labels.nodes || [];
},
+ error() {
+ createFlash({ message: __('Error fetching labels.') });
+ },
},
},
methods: {
handleDropdownClose(labels) {
- if (labels.length) this.$emit('updateSelectedLabels', labels);
- this.$emit('onDropdownClose');
+ this.$emit('updateSelectedLabels', labels);
+ this.collapseEditableItem();
},
- collapseDropdown() {
- this.$refs.editable.collapse();
+ collapseEditableItem() {
+ this.$refs.editable?.collapse();
},
handleCollapsedValueClick() {
this.$emit('toggleCollapse');
},
- showDropdown() {
- this.$nextTick(() => {
- this.$refs.dropdownContents.showDropdown();
- });
- },
isDropdownVariantSidebar,
isDropdownVariantStandalone,
isDropdownVariantEmbedded,
@@ -145,20 +172,19 @@ export default {
<template v-if="isDropdownVariantSidebar(variant)">
<dropdown-value-collapsed
ref="dropdownButtonCollapsed"
- :labels="issueLabels"
+ :labels="issuableLabels"
@onValueClick="handleCollapsedValueClick"
/>
<sidebar-editable-item
ref="editable"
:title="__('Labels')"
- :loading="labelsSelectInProgress"
+ :loading="isLoading"
:can-edit="allowLabelEdit"
- @open="showDropdown"
>
<template #collapsed>
<dropdown-value
:disable-labels="labelsSelectInProgress"
- :selected-labels="issueLabels"
+ :selected-labels="issuableLabels"
:allow-label-remove="allowLabelRemove"
:labels-filter-base-path="labelsFilterBasePath"
:labels-filter-param="labelsFilterParam"
@@ -170,7 +196,7 @@ export default {
<template #default="{ edit }">
<dropdown-value
:disable-labels="labelsSelectInProgress"
- :selected-labels="issueLabels"
+ :selected-labels="issuableLabels"
:allow-label-remove="allowLabelRemove"
:labels-filter-base-path="labelsFilterBasePath"
:labels-filter-param="labelsFilterParam"
@@ -180,8 +206,6 @@ export default {
<slot></slot>
</dropdown-value>
<dropdown-contents
- v-if="edit"
- ref="dropdownContents"
:dropdown-button-text="dropdownButtonText"
:allow-multiselect="allowMultiselect"
:labels-list-title="labelsListTitle"
@@ -190,11 +214,30 @@ export default {
:labels-create-title="labelsCreateTitle"
:selected-labels="selectedLabels"
:variant="variant"
- @closeDropdown="collapseDropdown"
+ :issuable-type="issuableType"
+ :is-visible="edit"
+ :full-path="fullPath"
+ :attr-workspace-path="attrWorkspacePath"
@setLabels="handleDropdownClose"
+ @closeDropdown="collapseEditableItem"
/>
</template>
</sidebar-editable-item>
</template>
+ <dropdown-contents
+ v-else
+ ref="dropdownContents"
+ :allow-multiselect="allowMultiselect"
+ :dropdown-button-text="dropdownButtonText"
+ :labels-list-title="labelsListTitle"
+ :footer-create-label-title="footerCreateLabelTitle"
+ :footer-manage-label-title="footerManageLabelTitle"
+ :labels-create-title="labelsCreateTitle"
+ :selected-labels="selectedLabels"
+ :variant="variant"
+ :issuable-type="issuableType"
+ :full-path="fullPath"
+ @setLabels="handleDropdownClose"
+ />
</div>
</template>
diff --git a/app/assets/javascripts/vue_shared/components/sidebar/todo_toggle/todo_button.stories.js b/app/assets/javascripts/vue_shared/components/sidebar/todo_toggle/todo_button.stories.js
index d2afc02233e..294e5bd9f90 100644
--- a/app/assets/javascripts/vue_shared/components/sidebar/todo_toggle/todo_button.stories.js
+++ b/app/assets/javascripts/vue_shared/components/sidebar/todo_toggle/todo_button.stories.js
@@ -4,7 +4,7 @@ import TodoButton from './todo_button.vue';
export default {
component: TodoButton,
- title: 'vue_shared/components/todo_toggle/todo_button',
+ title: 'vue_shared/components/sidebar/todo_toggle/todo_button',
};
const Template = (args, { argTypes }) => ({
diff --git a/app/assets/javascripts/vue_shared/components/upload_dropzone/upload_dropzone.vue b/app/assets/javascripts/vue_shared/components/upload_dropzone/upload_dropzone.vue
index afb1ea702fa..0a7a22ed3a8 100644
--- a/app/assets/javascripts/vue_shared/components/upload_dropzone/upload_dropzone.vue
+++ b/app/assets/javascripts/vue_shared/components/upload_dropzone/upload_dropzone.vue
@@ -45,7 +45,7 @@ export default {
data() {
return {
dragCounter: 0,
- isDragDataValid: false,
+ isDragDataValid: true,
};
},
computed: {
diff --git a/app/assets/javascripts/vue_shared/components/user_deletion_obstacles/constants.js b/app/assets/javascripts/vue_shared/components/user_deletion_obstacles/constants.js
new file mode 100644
index 00000000000..256db2ea1ce
--- /dev/null
+++ b/app/assets/javascripts/vue_shared/components/user_deletion_obstacles/constants.js
@@ -0,0 +1,5 @@
+// Types of obstacles to user deletion
+export const OBSTACLE_TYPES = Object.freeze({
+ oncallSchedules: 'ONCALL_SCHEDULE',
+ escalationPolicies: 'ESCALATION_POLICY',
+});
diff --git a/app/assets/javascripts/vue_shared/components/user_deletion_obstacles/user_deletion_obstacles_list.stories.js b/app/assets/javascripts/vue_shared/components/user_deletion_obstacles/user_deletion_obstacles_list.stories.js
new file mode 100644
index 00000000000..d2030c14029
--- /dev/null
+++ b/app/assets/javascripts/vue_shared/components/user_deletion_obstacles/user_deletion_obstacles_list.stories.js
@@ -0,0 +1,37 @@
+/* eslint-disable @gitlab/require-i18n-strings */
+
+import { OBSTACLE_TYPES } from './constants';
+import UserDeletionObstaclesList from './user_deletion_obstacles_list.vue';
+
+export default {
+ component: UserDeletionObstaclesList,
+ title: 'vue_shared/components/user_deletion_obstacles/user_deletion_obstacles_list',
+};
+
+const Template = (args, { argTypes }) => ({
+ components: { UserDeletionObstaclesList },
+ props: Object.keys(argTypes),
+ template: '<user-deletion-obstacles-list v-bind="$props" v-on="$props" />',
+});
+
+export const Default = Template.bind({});
+Default.args = {
+ obstacles: [
+ {
+ type: OBSTACLE_TYPES.oncallSchedules,
+ name: 'APAC',
+ url: 'https://domain.com/group/main-application/oncall_schedules',
+ projectName: 'main-application',
+ projectUrl: 'https://domain.com/group/main-application',
+ },
+ {
+ type: OBSTACLE_TYPES.escalationPolicies,
+ name: 'Engineering On-call',
+ url: 'https://domain.com/group/microservice-backend/escalation_policies',
+ projectName: 'Microservice Backend',
+ projectUrl: 'https://domain.com/group/microservice-backend',
+ },
+ ],
+ userName: 'Thomspon Smith',
+ isCurrentUser: false,
+};
diff --git a/app/assets/javascripts/vue_shared/components/user_deletion_obstacles/user_deletion_obstacles_list.vue b/app/assets/javascripts/vue_shared/components/user_deletion_obstacles/user_deletion_obstacles_list.vue
new file mode 100644
index 00000000000..1eea660d527
--- /dev/null
+++ b/app/assets/javascripts/vue_shared/components/user_deletion_obstacles/user_deletion_obstacles_list.vue
@@ -0,0 +1,91 @@
+<script>
+import { GlSprintf, GlLink } from '@gitlab/ui';
+import { sprintf, s__ } from '~/locale';
+import { OBSTACLE_TYPES } from './constants';
+
+const OBSTACLE_TEXT = {
+ [OBSTACLE_TYPES.oncallSchedules]: s__(
+ 'OnCallSchedules|On-call schedule %{obstacle} in Project %{project}',
+ ),
+ [OBSTACLE_TYPES.escalationPolicies]: s__(
+ 'EscalationPolicies|Escalation policy %{obstacle} in Project %{project}',
+ ),
+};
+
+export default {
+ components: {
+ GlSprintf,
+ GlLink,
+ },
+ props: {
+ obstacles: {
+ type: Array,
+ required: true,
+ },
+ userName: {
+ type: String,
+ required: false,
+ default: null,
+ },
+ isCurrentUser: {
+ type: Boolean,
+ required: false,
+ default: false,
+ },
+ },
+ computed: {
+ title() {
+ return this.isCurrentUser
+ ? s__('OnCallSchedules|You are currently a part of:')
+ : sprintf(
+ s__('OnCallSchedules|User %{name} is currently part of:'),
+ {
+ name: this.userName,
+ },
+ false,
+ );
+ },
+ footer() {
+ return this.isCurrentUser
+ ? s__(
+ 'OnCallSchedules|Removing yourself may put your on-call team at risk of missing a notification.',
+ )
+ : s__(
+ 'OnCallSchedules|Removing this user may put their on-call team at risk of missing a notification.',
+ );
+ },
+ },
+ methods: {
+ textForObstacle(obstacle) {
+ return OBSTACLE_TEXT[obstacle.type];
+ },
+ urlForObstacle(obstacle) {
+ // Fallback to scheduleUrl for backwards compatibility
+ return obstacle.url || obstacle.scheduleUrl;
+ },
+ },
+};
+</script>
+
+<template>
+ <div>
+ <p data-testid="title">{{ title }}</p>
+
+ <ul data-testid="obstacles-list">
+ <li v-for="(obstacle, index) in obstacles" :key="`${obstacle.name}-${index}`">
+ <gl-sprintf :message="textForObstacle(obstacle)">
+ <template #obstacle>
+ <gl-link :href="urlForObstacle(obstacle)" target="_blank">{{ obstacle.name }}</gl-link>
+ </template>
+ <template #project>
+ <gl-link :href="obstacle.projectUrl" target="_blank">{{
+ obstacle.projectName
+ }}</gl-link>
+ </template>
+ </gl-sprintf>
+ </li>
+ </ul>
+
+ <p data-testid="footer">{{ footer }}</p>
+ </div>
+</template>
diff --git a/app/assets/javascripts/vue_shared/components/user_deletion_obstacles/utils.js b/app/assets/javascripts/vue_shared/components/user_deletion_obstacles/utils.js
new file mode 100644
index 00000000000..502302a1ef2
--- /dev/null
+++ b/app/assets/javascripts/vue_shared/components/user_deletion_obstacles/utils.js
@@ -0,0 +1,19 @@
+import { OBSTACLE_TYPES } from './constants';
+
+const addTypeToObstacles = (obstacles, type) => {
+ if (!obstacles) return [];
+
+ return obstacles?.map((obstacle) => ({ type, ...obstacle }));
+};
+
+// For use with user objects formatted via internal REST API.
+// If the removal/deletion of a user could cause critical
+// problems, return a single array containing all affected
+// associations including their type.
+export const parseUserDeletionObstacles = (user) => {
+ if (!user) return [];
+
+ return Object.keys(OBSTACLE_TYPES).flatMap((type) => {
+ return addTypeToObstacles(user[type], OBSTACLE_TYPES[type]);
+ });
+};
diff --git a/app/assets/javascripts/vue_shared/components/user_popover/user_popover.vue b/app/assets/javascripts/vue_shared/components/user_popover/user_popover.vue
index 74616763f8f..05e0c3b0be3 100644
--- a/app/assets/javascripts/vue_shared/components/user_popover/user_popover.vue
+++ b/app/assets/javascripts/vue_shared/components/user_popover/user_popover.vue
@@ -93,19 +93,27 @@ export default {
</div>
<div class="gl-text-gray-500">
<div v-if="user.bio" class="gl-display-flex gl-mb-2">
- <gl-icon name="profile" class="gl-text-gray-400 gl-flex-shrink-0" />
+ <gl-icon name="profile" class="gl-flex-shrink-0" />
<span ref="bio" class="gl-ml-2 gl-overflow-hidden">{{ user.bio }}</span>
</div>
<div v-if="user.workInformation" class="gl-display-flex gl-mb-2">
- <gl-icon name="work" class="gl-text-gray-400 gl-flex-shrink-0" />
+ <gl-icon name="work" class="gl-flex-shrink-0" />
<span ref="workInformation" class="gl-ml-2">{{ user.workInformation }}</span>
</div>
+ <div v-if="user.location" class="gl-display-flex gl-mb-2">
+ <gl-icon name="location" class="gl-flex-shrink-0" />
+ <span class="gl-ml-2">{{ user.location }}</span>
+ </div>
+ <div
+ v-if="user.localTime && !user.bot"
+ class="gl-display-flex gl-mb-2"
+ data-testid="user-popover-local-time"
+ >
+ <gl-icon name="clock" class="gl-flex-shrink-0" />
+ <span class="gl-ml-2">{{ user.localTime }}</span>
+ </div>
</div>
- <div v-if="user.location" class="js-location gl-text-gray-500 gl-display-flex">
- <gl-icon name="location" class="gl-text-gray-400 flex-shrink-0" />
- <span class="gl-ml-2">{{ user.location }}</span>
- </div>
- <div v-if="statusHtml" class="js-user-status gl-mt-3">
+ <div v-if="statusHtml" class="gl-mb-2" data-testid="user-popover-status">
<span v-safe-html:[$options.safeHtmlConfig]="statusHtml"></span>
</div>
<div v-if="user.bot" class="gl-text-blue-500">
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 df0981aea7a..6da2d39a95a 100644
--- a/app/assets/javascripts/vue_shared/components/web_ide_link.vue
+++ b/app/assets/javascripts/vue_shared/components/web_ide_link.vue
@@ -92,7 +92,10 @@ export default {
const handleOptions = this.needsToFork
? {
href: '#modal-confirm-fork-edit',
- handle: () => this.showModal('#modal-confirm-fork-edit'),
+ handle: () => {
+ this.$emit('edit', 'simple');
+ this.showModal('#modal-confirm-fork-edit');
+ },
}
: { href: this.editUrl };
@@ -128,7 +131,10 @@ export default {
const handleOptions = this.needsToFork
? {
href: '#modal-confirm-fork-webide',
- handle: () => this.showModal('#modal-confirm-fork-webide'),
+ handle: () => {
+ this.$emit('edit', 'ide');
+ this.showModal('#modal-confirm-fork-webide');
+ },
}
: { href: this.webIdeUrl };
diff --git a/app/assets/javascripts/vue_shared/directives/validation.js b/app/assets/javascripts/vue_shared/directives/validation.js
index 692f2769b88..779b04dc2bd 100644
--- a/app/assets/javascripts/vue_shared/directives/validation.js
+++ b/app/assets/javascripts/vue_shared/directives/validation.js
@@ -1,4 +1,3 @@
-import { merge } from 'lodash';
import { s__ } from '~/locale';
/**
@@ -21,8 +20,15 @@ const defaultFeedbackMap = {
},
};
-const getFeedbackForElement = (feedbackMap, el) =>
- Object.values(feedbackMap).find((f) => f.isInvalid(el))?.message || el.validationMessage;
+const getFeedbackForElement = (feedbackMap, el) => {
+ const field = Object.values(feedbackMap).find((f) => f.isInvalid(el));
+ let elMessage = null;
+ if (field) {
+ elMessage = el.getAttribute('validation-message');
+ }
+
+ return field?.message || elMessage || el.validationMessage;
+};
const focusFirstInvalidInput = (e) => {
const { target: formEl } = e;
@@ -68,6 +74,7 @@ const createValidator = (context, feedbackMap) => ({ el, reportInvalidInput = fa
/**
* Takes an object that allows to add or change custom feedback messages.
+ * See possibilities here: https://developer.mozilla.org/en-US/docs/Web/API/ValidityState
*
* The passed in object will be merged with the built-in feedback
* so it is possible to override a built-in message.
@@ -75,7 +82,7 @@ const createValidator = (context, feedbackMap) => ({ el, reportInvalidInput = fa
* @example
* validate({
* tooLong: {
- * check: el => el.validity.tooLong === true,
+ * isInvalid: el => el.validity.tooLong === true,
* message: 'Your custom feedback'
* }
* })
@@ -91,7 +98,7 @@ const createValidator = (context, feedbackMap) => ({ el, reportInvalidInput = fa
* @returns {{ inserted: function, update: function }} validateDirective
*/
export default function initValidation(customFeedbackMap = {}) {
- const feedbackMap = merge(defaultFeedbackMap, customFeedbackMap);
+ const feedbackMap = { ...defaultFeedbackMap, ...customFeedbackMap };
const elDataMap = new WeakMap();
return {
diff --git a/app/assets/javascripts/vue_shared/security_configuration/components/manage_via_mr.vue b/app/assets/javascripts/vue_shared/security_configuration/components/manage_via_mr.vue
index 0ff858e6afc..42272c222fc 100644
--- a/app/assets/javascripts/vue_shared/security_configuration/components/manage_via_mr.vue
+++ b/app/assets/javascripts/vue_shared/security_configuration/components/manage_via_mr.vue
@@ -100,6 +100,7 @@ export default {
:loading="isLoading"
:variant="variant"
:category="category"
+ :data-qa-selector="`${feature.type}_mr_button`"
@click="mutate"
>{{ $options.i18n.buttonLabel }}</gl-button
>
diff --git a/app/assets/javascripts/vue_shared/security_reports/security_reports_app.vue b/app/assets/javascripts/vue_shared/security_reports/security_reports_app.vue
index ad40ea6a964..12f2bc71505 100644
--- a/app/assets/javascripts/vue_shared/security_reports/security_reports_app.vue
+++ b/app/assets/javascripts/vue_shared/security_reports/security_reports_app.vue
@@ -50,7 +50,7 @@ export default {
required: false,
default: '',
},
- secretScanningComparisonPath: {
+ secretDetectionComparisonPath: {
type: String,
required: false,
default: '',
@@ -149,8 +149,8 @@ export default {
this.canShowCounts = true;
}
- if (this.secretScanningComparisonPath && this.hasSecretDetectionReports) {
- this.setSecretDetectionDiffEndpoint(this.secretScanningComparisonPath);
+ if (this.secretDetectionComparisonPath && this.hasSecretDetectionReports) {
+ this.setSecretDetectionDiffEndpoint(this.secretDetectionComparisonPath);
this.fetchSecretDetectionDiff();
this.canShowCounts = true;
}
diff --git a/app/assets/javascripts/vue_shared/security_reports/store/modules/sast/actions.js b/app/assets/javascripts/vue_shared/security_reports/store/modules/sast/actions.js
index 4f92e181f9f..62a51abe038 100644
--- a/app/assets/javascripts/vue_shared/security_reports/store/modules/sast/actions.js
+++ b/app/assets/javascripts/vue_shared/security_reports/store/modules/sast/actions.js
@@ -1,3 +1,4 @@
+import { REPORT_TYPE_SAST } from '~/vue_shared/security_reports/constants';
import { fetchDiffData } from '../../utils';
import * as types from './mutation_types';
@@ -14,7 +15,7 @@ export const receiveDiffError = ({ commit }, response) =>
export const fetchDiff = ({ state, rootState, dispatch }) => {
dispatch('requestDiff');
- return fetchDiffData(rootState, state.paths.diffEndpoint, 'sast')
+ return fetchDiffData(rootState, state.paths.diffEndpoint, REPORT_TYPE_SAST)
.then((data) => {
dispatch('receiveDiffSuccess', data);
})
diff --git a/app/assets/javascripts/vue_shared/security_reports/store/modules/secret_detection/actions.js b/app/assets/javascripts/vue_shared/security_reports/store/modules/secret_detection/actions.js
index e3ae5435f5d..722dcce3075 100644
--- a/app/assets/javascripts/vue_shared/security_reports/store/modules/secret_detection/actions.js
+++ b/app/assets/javascripts/vue_shared/security_reports/store/modules/secret_detection/actions.js
@@ -1,3 +1,4 @@
+import { REPORT_TYPE_SECRET_DETECTION } from '~/vue_shared/security_reports/constants';
import { fetchDiffData } from '../../utils';
import * as types from './mutation_types';
@@ -14,7 +15,7 @@ export const receiveDiffError = ({ commit }, response) =>
export const fetchDiff = ({ state, rootState, dispatch }) => {
dispatch('requestDiff');
- return fetchDiffData(rootState, state.paths.diffEndpoint, 'secret_detection')
+ return fetchDiffData(rootState, state.paths.diffEndpoint, REPORT_TYPE_SECRET_DETECTION)
.then((data) => {
dispatch('receiveDiffSuccess', data);
})
diff --git a/app/assets/stylesheets/_page_specific_files.scss b/app/assets/stylesheets/_page_specific_files.scss
index fa5ab590232..8f3b5b3b7cc 100644
--- a/app/assets/stylesheets/_page_specific_files.scss
+++ b/app/assets/stylesheets/_page_specific_files.scss
@@ -1,5 +1,4 @@
@import './pages/branches';
-@import './pages/ci_projects';
@import './pages/clusters';
@import './pages/commits';
@import './pages/deploy_keys';
@@ -10,7 +9,6 @@
@import './pages/groups';
@import './pages/help';
@import './pages/issuable';
-@import './pages/issues/issue_count_badge';
@import './pages/issues';
@import './pages/labels';
@import './pages/login';
diff --git a/app/assets/stylesheets/application_dark.scss b/app/assets/stylesheets/application_dark.scss
index dae0cd72a8f..f1d7df8c5ed 100644
--- a/app/assets/stylesheets/application_dark.scss
+++ b/app/assets/stylesheets/application_dark.scss
@@ -2,74 +2,4 @@
@import './application';
-@import './themes/theme_helper';
-
-body.gl-dark {
- @include gitlab-theme(
- $gray-900,
- $gray-400,
- $gray-500,
- $gray-800,
- $gray-900,
- $white
- );
-
- .logo-text svg {
- fill: var(--gl-text-color);
- }
-
- .navbar-gitlab {
- background-color: var(--gray-50);
- box-shadow: 0 1px 0 0 var(--gray-100);
-
- .navbar-sub-nav,
- .navbar-nav {
- li {
- > a:hover,
- > a:focus,
- > button:hover,
- > button:focus {
- color: var(--gl-text-color);
- background-color: var(--gray-200);
- }
- }
-
- li.active,
- li.dropdown.show {
- > a,
- > button {
- color: var(--gl-text-color);
- background-color: var(--gray-200);
- }
- }
- }
-
- .header-search {
- background-color: var(--gray-100) !important;
- box-shadow: inset 0 0 0 1px var(--border-color) !important;
-
- &:active,
- &:hover {
- background-color: var(--gray-100) !important;
- box-shadow: inset 0 0 0 1px var(--blue-200) !important;
- }
- }
-
- .search {
- form {
- background-color: var(--gray-100);
- box-shadow: inset 0 0 0 1px var(--border-color);
-
- &:active,
- &:hover {
- background-color: var(--gray-100);
- box-shadow: inset 0 0 0 1px var(--blue-200);
- }
- }
- }
- }
-
- .md :not(pre.code) > code {
- background-color: $gray-200;
- }
-}
+@import './themes/dark_mode_overrides';
diff --git a/app/assets/stylesheets/bootstrap_migration.scss b/app/assets/stylesheets/bootstrap_migration.scss
index c4f292dd05d..27ddff181c5 100644
--- a/app/assets/stylesheets/bootstrap_migration.scss
+++ b/app/assets/stylesheets/bootstrap_migration.scss
@@ -112,7 +112,7 @@ code {
border-radius: $border-radius-default;
.code > &,
- .build-trace & {
+ .build-log & {
background-color: inherit;
padding: unset;
}
diff --git a/app/assets/stylesheets/components/batch_comments/review_bar.scss b/app/assets/stylesheets/components/batch_comments/review_bar.scss
index bcd06974813..6f5c5c5a080 100644
--- a/app/assets/stylesheets/components/batch_comments/review_bar.scss
+++ b/app/assets/stylesheets/components/batch_comments/review_bar.scss
@@ -38,59 +38,6 @@
margin: 0 auto;
}
-.review-preview-dropdown {
- .review-preview-item.menu-item {
- display: flex;
- flex-wrap: wrap;
- padding: 8px 16px;
- cursor: pointer;
-
- &:not(.is-last) {
- border-bottom: 1px solid $list-border;
- }
- }
-
- .dropdown-menu {
- top: auto;
- bottom: 36px;
-
- &.show {
- max-height: 400px;
-
- @include media-breakpoint-down(xs) {
- width: calc(100vw - 32px);
- }
- }
- }
-
- .dropdown-content {
- max-height: 300px;
- }
-
- .dropdown-title {
- padding: $grid-size 25px $gl-padding;
- margin-bottom: 0;
- }
-
- .dropdown-footer {
- margin-top: 0;
- }
-
- .dropdown-menu-close {
- top: 6px;
- }
-}
-
-.review-preview-dropdown-toggle {
- svg.s16 {
- width: 15px;
- height: 15px;
- margin-top: -1px;
- top: 3px;
- margin-left: 4px;
- }
-}
-
.review-preview-item-header {
display: flex;
align-items: center;
diff --git a/app/assets/stylesheets/components/content_editor.scss b/app/assets/stylesheets/components/content_editor.scss
index a013d971efb..7f498b79d33 100644
--- a/app/assets/stylesheets/components/content_editor.scss
+++ b/app/assets/stylesheets/components/content_editor.scss
@@ -1,9 +1,13 @@
.ProseMirror {
+ max-height: 55vh;
+ overflow-y: auto;
+
td,
th,
li,
dd,
- dt {
+ dt,
+ summary {
:first-child {
margin-bottom: 0 !important;
}
@@ -37,6 +41,7 @@
}
}
+
.dl-content {
width: 100%;
@@ -50,6 +55,38 @@
}
}
}
+
+ .details-toggle-icon {
+ cursor: pointer;
+ z-index: 1;
+
+ &::before {
+ content: 'â–¶';
+ display: inline-block;
+ width: $gl-spacing-scale-4;
+ }
+
+ &.is-open::before {
+ content: 'â–¼';
+ }
+ }
+
+ .details-content {
+ width: calc(100% - #{$gl-spacing-scale-4});
+
+ > li {
+ list-style-type: none;
+ margin-left: $gl-spacing-scale-2;
+ }
+
+ > :not(:first-child) {
+ display: none;
+ }
+
+ &.is-open > :not(:first-child) {
+ display: inherit;
+ }
+ }
}
.table-creator-grid-item {
@@ -70,3 +107,17 @@
@include gl-white-space-nowrap;
}
+
+
+.content-editor-color-chip::after {
+ content: ' ';
+ display: inline-block;
+ align-items: center;
+ width: 11px;
+ height: 11px;
+ border-radius: 3px;
+ margin-left: 4px;
+ margin-top: -2px;
+ border: 1px solid $black-transparent;
+ background-color: var(--gl-color-chip-color);
+}
diff --git a/app/assets/stylesheets/components/design_management/design.scss b/app/assets/stylesheets/components/design_management/design.scss
index 579a86a94a4..a3cbdb9ae86 100644
--- a/app/assets/stylesheets/components/design_management/design.scss
+++ b/app/assets/stylesheets/components/design_management/design.scss
@@ -70,11 +70,6 @@ $t-gray-a-16-design-pin: rgba($black, 0.16);
}
}
-.design-presentation-wrapper {
- top: 0;
- left: 0;
-}
-
.design-scaler-wrapper {
bottom: 0;
left: 50%;
diff --git a/app/assets/stylesheets/components/design_management/design_version_dropdown.scss b/app/assets/stylesheets/components/design_management/design_version_dropdown.scss
deleted file mode 100644
index f79d672e238..00000000000
--- a/app/assets/stylesheets/components/design_management/design_version_dropdown.scss
+++ /dev/null
@@ -1,3 +0,0 @@
-.design-version-dropdown > button {
- background: inherit;
-}
diff --git a/app/assets/stylesheets/components/project_list_item.scss b/app/assets/stylesheets/components/project_list_item.scss
deleted file mode 100644
index 8e7c2c4398c..00000000000
--- a/app/assets/stylesheets/components/project_list_item.scss
+++ /dev/null
@@ -1,24 +0,0 @@
-.project-list-item {
- &:not(:disabled):not(.disabled) {
- &:focus,
- &:active,
- &:focus:active {
- outline: none;
- box-shadow: none;
- }
- }
-}
-
-// When housed inside a modal, the edge of each item
-// should extend to the edge of the modal.
-.modal-body {
- .project-list-item {
- border-radius: 0;
- margin-left: -$gl-padding;
- margin-right: -$gl-padding;
-
- .project-namespace-name-container {
- overflow: hidden;
- }
- }
-}
diff --git a/app/assets/stylesheets/framework.scss b/app/assets/stylesheets/framework.scss
index 804cc205279..06a8694eb3d 100644
--- a/app/assets/stylesheets/framework.scss
+++ b/app/assets/stylesheets/framework.scss
@@ -9,7 +9,6 @@
@import 'framework/animations';
@import 'framework/vue_transitions';
-@import 'framework/banner';
@import 'framework/blocks';
@import 'framework/buttons';
@import 'framework/badges';
diff --git a/app/assets/stylesheets/framework/banner.scss b/app/assets/stylesheets/framework/banner.scss
deleted file mode 100644
index 71bbab2065d..00000000000
--- a/app/assets/stylesheets/framework/banner.scss
+++ /dev/null
@@ -1,40 +0,0 @@
-.banner-callout {
- display: flex;
- position: relative;
- align-items: start;
-
- .banner-close {
- position: absolute;
- top: 10px;
- right: 10px;
- opacity: 1;
-
- .dismiss-icon {
- color: $gl-text-color;
- font-size: $gl-font-size;
- }
- }
-
- .banner-graphic {
- margin: 0 $gl-padding $gl-padding 0;
- }
-
- &.banner-non-empty-state {
- border-bottom: 1px solid $border-color;
- }
-
- @include media-breakpoint-down(xs) {
- justify-content: center;
- flex-direction: column;
- align-items: center;
-
- .banner-title,
- .banner-buttons {
- text-align: center;
- }
-
- .banner-graphic {
- margin-left: $gl-padding;
- }
- }
-}
diff --git a/app/assets/stylesheets/framework/blocks.scss b/app/assets/stylesheets/framework/blocks.scss
index a0682eabf01..549289450a4 100644
--- a/app/assets/stylesheets/framework/blocks.scss
+++ b/app/assets/stylesheets/framework/blocks.scss
@@ -1,9 +1,3 @@
-.centered-light-block {
- text-align: center;
- color: $gl-text-color;
- margin: 20px;
-}
-
.nothing-here-block {
text-align: center;
padding: 16px;
@@ -83,22 +77,6 @@
> p:last-child {
margin-bottom: 0;
}
-
- .block-controls {
- display: flex;
- justify-content: flex-end;
- flex: 1;
-
- .control {
- float: left;
- margin-left: 10px;
- }
- }
-
- &.build-content {
- background-color: $white;
- border-top: 0;
- }
}
.sub-header-block {
@@ -169,31 +147,6 @@
}
}
- &.groups-cover-block {
- background: $white;
- border-bottom: 1px solid $border-color;
- text-align: left;
- padding: 24px 0;
-
- .group-info {
- .cover-title {
- margin-top: 9px;
- }
-
- p {
- margin-bottom: 0;
- }
- }
-
- @include media-breakpoint-down(xs) {
- text-align: center;
-
- .avatar {
- float: none;
- }
- }
- }
-
&.user-cover-block {
padding: 24px 0 0;
@@ -214,19 +167,6 @@
margin-right: auto;
}
}
-
- .group-info {
- h1 {
- display: inline;
- font-weight: $gl-font-weight-normal;
- font-size: 24px;
- color: $gl-text-color;
- }
- }
-}
-
-.block-connector {
- margin-top: -1px;
}
.content-block {
@@ -322,7 +262,7 @@
display: inline-block;
}
- .btn {
+ .btn:not(.split-content-button):not(.dropdown-toggle-split) {
margin: $gl-padding-8 $gl-padding-4;
@include media-breakpoint-down(xs) {
@@ -332,10 +272,6 @@
}
}
-.flex-right {
- margin-left: auto;
-}
-
.code-block {
white-space: pre;
overflow-x: auto;
diff --git a/app/assets/stylesheets/framework/buttons.scss b/app/assets/stylesheets/framework/buttons.scss
index ceccec8c5cb..e458dfd5316 100644
--- a/app/assets/stylesheets/framework/buttons.scss
+++ b/app/assets/stylesheets/framework/buttons.scss
@@ -247,13 +247,6 @@
}
}
-.btn-terminal {
- svg {
- height: 14px;
- width: $default-icon-size;
- }
-}
-
.btn-lg {
padding: 12px 20px;
}
@@ -281,12 +274,6 @@
}
}
-.btn-align-content {
- display: flex;
- justify-content: center;
- align-items: center;
-}
-
.btn-group {
&.btn-grouped {
@include btn-with-margin;
@@ -347,16 +334,6 @@
}
}
-.btn-static {
- background-color: $gray-light !important;
- border: 1px solid $border-gray-normal;
- cursor: default;
-
- &:active {
- box-shadow: inset 0 0 0 $white;
- }
-}
-
.btn-inverted {
&-secondary {
@include btn-outline($white, $blue-500, $blue-500, $blue-100, $blue-700, $blue-500, $blue-200, $blue-600, $blue-800);
diff --git a/app/assets/stylesheets/framework/common.scss b/app/assets/stylesheets/framework/common.scss
index a7ce19ffc69..354d2737894 100644
--- a/app/assets/stylesheets/framework/common.scss
+++ b/app/assets/stylesheets/framework/common.scss
@@ -175,10 +175,6 @@ p.time {
text-shadow: none;
}
-.thin-area {
- height: 150px;
-}
-
// Fix issue with notes & lists creating a bunch of bottom borders.
li.note {
img { max-width: 100%; }
@@ -298,10 +294,6 @@ img.emoji {
margin: 0;
}
-.space-right {
- margin-right: 10px;
-}
-
.alert {
margin-bottom: $gl-padding;
}
@@ -363,14 +355,6 @@ img.emoji {
}
}
-.outline-0 {
- outline: 0;
-
- &:focus {
- outline: 0;
- }
-}
-
/** COMMON CLASSES **/
/**
🚨 Do not use these classes — they are deprecated and being removed. 🚨
diff --git a/app/assets/stylesheets/framework/contextual_sidebar.scss b/app/assets/stylesheets/framework/contextual_sidebar.scss
index f5002a342b6..fa1892903a3 100644
--- a/app/assets/stylesheets/framework/contextual_sidebar.scss
+++ b/app/assets/stylesheets/framework/contextual_sidebar.scss
@@ -140,7 +140,7 @@
@include gl-border-none;
.avatar.s32 {
- @extend .rect-avatar.s32;
+ border-radius: $border-radius-default;
box-shadow: $avatar-box-shadow;
}
}
diff --git a/app/assets/stylesheets/framework/diffs.scss b/app/assets/stylesheets/framework/diffs.scss
index 568182ad796..23dc16b7e7f 100644
--- a/app/assets/stylesheets/framework/diffs.scss
+++ b/app/assets/stylesheets/framework/diffs.scss
@@ -1007,6 +1007,27 @@ table.code {
}
}
+// Notes tweaks for the Changes tab ONLY
+.diff-tr {
+ .timeline-discussion-body {
+ clear: left;
+
+ .note-body {
+ margin-top: 0 !important;
+ }
+ }
+
+ .timeline-entry img.avatar {
+ margin-top: -2px;
+ margin-right: $gl-padding-8;
+ }
+
+ // tiny adjustment to vertical align with the note header text
+ .discussion-collapsible .timeline-icon {
+ padding-top: 2px;
+ }
+}
+
.files:not([data-can-create-note]) .frame {
cursor: auto;
}
@@ -1125,7 +1146,7 @@ table.code {
}
.discussion-collapsible {
- margin: 0 $gl-padding $gl-padding 71px;
+ margin: 0 $gl-padding $gl-padding;
.notes {
border-radius: $border-radius-default;
diff --git a/app/assets/stylesheets/framework/dropdowns.scss b/app/assets/stylesheets/framework/dropdowns.scss
index b05fbfaae6c..7f960e3da51 100644
--- a/app/assets/stylesheets/framework/dropdowns.scss
+++ b/app/assets/stylesheets/framework/dropdowns.scss
@@ -76,6 +76,7 @@
}
.dropdown-toggle,
+.dropdown-menu-toggle,
.confidential-merge-request-fork-group .dropdown-toggle {
padding: 6px 8px 6px 10px;
background-color: $white;
@@ -131,7 +132,6 @@
// This is double classed to solve a specificity issue with the gitlab ui buttons
.dropdown-menu-toggle.dropdown-menu-toggle {
- @extend .dropdown-toggle;
justify-content: flex-start;
overflow: hidden;
padding-right: 25px;
@@ -425,21 +425,10 @@
}
}
-.dropdown-menu-drop-up {
- top: auto;
- bottom: 100%;
-}
-
.dropdown-menu-large {
width: 340px;
}
-.dropdown-menu-no-wrap {
- a {
- white-space: normal;
- }
-}
-
.dropdown-menu-full-width {
width: 100%;
}
@@ -662,13 +651,6 @@
padding-right: 10px;
}
-.dropdown-due-date-footer {
- padding-top: 0;
- margin-left: 10px;
- margin-right: 10px;
- border-top: 0;
-}
-
.dropdown-footer-list {
font-size: 14px;
@@ -742,24 +724,6 @@
}
}
-.dropdown-menu-due-date {
- .dropdown-content {
- max-height: 230px;
- }
-
- .pika-single {
- position: relative !important;
- top: 0 !important;
- border: 0;
- box-shadow: none;
- }
-
- .pika-lendar {
- margin-top: -5px;
- margin-bottom: 0;
- }
-}
-
.dropdown-menu-inner-title {
display: block;
color: $gl-text-color;
diff --git a/app/assets/stylesheets/framework/forms.scss b/app/assets/stylesheets/framework/forms.scss
index c366bf80093..2a46e50f0da 100644
--- a/app/assets/stylesheets/framework/forms.scss
+++ b/app/assets/stylesheets/framework/forms.scss
@@ -196,14 +196,6 @@ label {
}
}
-@include media-breakpoint-down(xs) {
- .remember-me {
- .remember-me-checkbox {
- margin-top: 0;
- }
- }
-}
-
.input-icon-wrapper,
.select-wrapper {
position: relative;
diff --git a/app/assets/stylesheets/framework/job_log.scss b/app/assets/stylesheets/framework/job_log.scss
index d48a5116677..f77f64f1d76 100644
--- a/app/assets/stylesheets/framework/job_log.scss
+++ b/app/assets/stylesheets/framework/job_log.scss
@@ -5,10 +5,10 @@
font-size: 13px;
word-break: break-all;
word-wrap: break-word;
- color: color-yiq($builds-trace-bg);
+ color: color-yiq($builds-log-bg);
border-radius: $border-radius-small;
min-height: 42px;
- background-color: $builds-trace-bg;
+ background-color: $builds-log-bg;
}
.log-line {
@@ -42,10 +42,6 @@
}
}
-.log-duration-badge {
- background: $gray-300;
-}
-
.loader-animation {
@include build-loader-animation;
}
diff --git a/app/assets/stylesheets/framework/markdown_area.scss b/app/assets/stylesheets/framework/markdown_area.scss
index 7315bce1ed9..ef294635641 100644
--- a/app/assets/stylesheets/framework/markdown_area.scss
+++ b/app/assets/stylesheets/framework/markdown_area.scss
@@ -153,6 +153,10 @@
vertical-align: middle;
margin-bottom: 3px;
}
+
+ .dropdown-chevron {
+ margin-bottom: 0;
+ }
}
@include media-breakpoint-down(xs) {
diff --git a/app/assets/stylesheets/framework/media_object.scss b/app/assets/stylesheets/framework/media_object.scss
index 89c561479cc..b573052c14a 100644
--- a/app/assets/stylesheets/framework/media_object.scss
+++ b/app/assets/stylesheets/framework/media_object.scss
@@ -6,7 +6,3 @@
.media-body {
flex: 1;
}
-
-.media-body-wrap {
- flex-grow: 1;
-}
diff --git a/app/assets/stylesheets/framework/mixins.scss b/app/assets/stylesheets/framework/mixins.scss
index fcf86680bb3..33f7aa4dba1 100644
--- a/app/assets/stylesheets/framework/mixins.scss
+++ b/app/assets/stylesheets/framework/mixins.scss
@@ -239,7 +239,7 @@
/*
* Mixin that handles the container for the job logs (CI/CD and kubernetes pod logs)
*/
-@mixin build-trace($background: $black) {
+@mixin build-log($background: $black) {
background: $background;
color: $gray-darkest;
white-space: pre;
@@ -253,13 +253,13 @@
display: block;
}
- &.build-trace-rounded {
+ &.build-log-rounded {
border-radius: $gl-border-radius-base;
}
}
// Used in EE for Web Terminal
-@mixin build-trace-bar($height) {
+@mixin build-log-bar($height) {
height: $height;
min-height: $height;
background: var(--gray-50, $gray-50);
@@ -268,8 +268,8 @@
padding: $grid-size;
}
-@mixin build-trace-top-bar($height) {
- @include build-trace-bar($height);
+@mixin build-log-top-bar($height) {
+ @include build-log-bar($height);
position: -webkit-sticky;
position: sticky;
diff --git a/app/assets/stylesheets/framework/modal.scss b/app/assets/stylesheets/framework/modal.scss
index 48a18e0d145..c9b17f5d5c4 100644
--- a/app/assets/stylesheets/framework/modal.scss
+++ b/app/assets/stylesheets/framework/modal.scss
@@ -1,13 +1,3 @@
-.modal-xl {
- max-width: 98%;
-}
-
-.modal-1040 {
- @include media-breakpoint-up(xl) {
- max-width: 1040px;
- }
-}
-
.modal-header {
background-color: $modal-body-bg;
@@ -111,30 +101,3 @@ body.modal-open {
}
}
}
-
-.recaptcha-modal .recaptcha-form {
- display: inline-block;
-
- .recaptcha {
- margin: 0;
- }
-}
-
-.issues-import-modal,
-.issuable-export-modal {
- .modal-body {
- padding: 0;
-
- .modal-subheader {
- justify-content: flex-start;
- align-items: center;
- border-bottom: 1px solid $modal-border-color;
- padding: 14px;
- }
-
- .modal-text {
- padding: $gl-padding-24 $gl-padding;
- min-height: $modal-body-height;
- }
- }
-}
diff --git a/app/assets/stylesheets/framework/panels.scss b/app/assets/stylesheets/framework/panels.scss
index d9c93fed1c4..e5b2b853363 100644
--- a/app/assets/stylesheets/framework/panels.scss
+++ b/app/assets/stylesheets/framework/panels.scss
@@ -39,10 +39,6 @@
}
}
-.card-empty-heading {
- border-bottom: 0;
-}
-
.card-body {
padding: $gl-padding;
diff --git a/app/assets/stylesheets/framework/secondary_navigation_elements.scss b/app/assets/stylesheets/framework/secondary_navigation_elements.scss
index 06eebb95438..685f1f413e6 100644
--- a/app/assets/stylesheets/framework/secondary_navigation_elements.scss
+++ b/app/assets/stylesheets/framework/secondary_navigation_elements.scss
@@ -1,6 +1,6 @@
// For tabbed navigation links, scrolling tabs, etc. For all top/main navigation,
// please check nav.scss
-.nav-links:not(.quick-links) {
+.nav-links {
display: flex;
padding: 0;
margin: 0;
diff --git a/app/assets/stylesheets/framework/selects.scss b/app/assets/stylesheets/framework/selects.scss
index d8ce6826fc1..900cf9fa4db 100644
--- a/app/assets/stylesheets/framework/selects.scss
+++ b/app/assets/stylesheets/framework/selects.scss
@@ -50,18 +50,6 @@
}
}
-.namespace-result {
- .namespace-kind {
- color: $gray-300;
- font-weight: $gl-font-weight-normal;
- }
-
- .namespace-path {
- margin-left: 10px;
- font-weight: $gl-font-weight-bold;
- }
-}
-
.ajax-users-dropdown {
min-width: 250px !important;
}
diff --git a/app/assets/stylesheets/framework/sidebar.scss b/app/assets/stylesheets/framework/sidebar.scss
index 6b3201ba2b0..6c7fc25f2d9 100644
--- a/app/assets/stylesheets/framework/sidebar.scss
+++ b/app/assets/stylesheets/framework/sidebar.scss
@@ -16,21 +16,6 @@
transition: padding $sidebar-transition-duration;
}
-.nav-header-btn {
- padding: 10px $gl-sidebar-padding;
- color: inherit;
- transition-duration: 0.3s;
- position: absolute;
- top: 0;
- cursor: pointer;
-
- &:hover,
- &:focus {
- color: $white;
- text-decoration: none;
- }
-}
-
.right-sidebar-collapsed {
padding-right: 0;
diff --git a/app/assets/stylesheets/framework/snippets.scss b/app/assets/stylesheets/framework/snippets.scss
index 47184804353..c59e70c80df 100644
--- a/app/assets/stylesheets/framework/snippets.scss
+++ b/app/assets/stylesheets/framework/snippets.scss
@@ -4,11 +4,6 @@
font-weight: $gl-font-weight-bold;
}
- .snippet-filename {
- color: $gl-text-color-secondary;
- font-weight: normal;
- }
-
.snippet-info {
color: $gl-text-color-secondary;
}
diff --git a/app/assets/stylesheets/framework/sortable.scss b/app/assets/stylesheets/framework/sortable.scss
index 25868061d04..953c42219a9 100644
--- a/app/assets/stylesheets/framework/sortable.scss
+++ b/app/assets/stylesheets/framework/sortable.scss
@@ -36,61 +36,6 @@
}
}
-.related-issues-list-item {
- .card-body,
- .issuable-info-container {
- padding: $gl-padding-4 $gl-padding-4 $gl-padding-4 $gl-padding;
-
- .block-truncated {
- padding: $gl-padding-8 0;
- line-height: $gl-btn-line-height;
- }
-
- @include media-breakpoint-down(md) {
- padding-left: $gl-padding;
-
- .block-truncated {
- flex-direction: column-reverse;
- padding: $gl-padding-4 0;
-
- .text-secondary {
- margin-top: $gl-padding-4;
- }
-
- .issue-token-title-text {
- display: block;
- }
- }
-
- .issue-item-remove-button {
- align-self: baseline;
- }
- }
-
- @include media-breakpoint-only(md) {
- .block-truncated .issue-token-title-text {
- white-space: nowrap;
- }
-
- .issue-item-remove-button {
- align-self: center;
- }
- }
-
- @include media-breakpoint-down(sm) {
- padding-left: $gl-padding-8;
-
- .block-truncated .issue-token-title-text {
- white-space: normal;
- }
- }
- }
-
- &.is-dragging {
- padding: 0;
- }
-}
-
.is-dragging {
// Important because plugin sets inline CSS
opacity: 1 !important;
diff --git a/app/assets/stylesheets/framework/tables.scss b/app/assets/stylesheets/framework/tables.scss
index 92405c00c5e..c6bc8fa0eac 100644
--- a/app/assets/stylesheets/framework/tables.scss
+++ b/app/assets/stylesheets/framework/tables.scss
@@ -23,6 +23,7 @@ table {
@include gl-text-gray-500;
}
+ .md &:not(.code),
&.table {
margin-bottom: $gl-padding;
diff --git a/app/assets/stylesheets/framework/typography.scss b/app/assets/stylesheets/framework/typography.scss
index aeb3bb2286f..cb36c4e5767 100644
--- a/app/assets/stylesheets/framework/typography.scss
+++ b/app/assets/stylesheets/framework/typography.scss
@@ -75,6 +75,15 @@
details {
margin-bottom: $gl-padding;
+
+ > *:not(summary) {
+ margin-left: $gl-spacing-scale-5;
+ }
+ }
+
+ summary > * {
+ display: inline-block;
+ margin-bottom: 0;
}
// Single code lines should wrap
@@ -160,8 +169,6 @@
}
table:not(.code) {
- @extend .table;
- @extend .table-bordered;
margin: 16px 0;
color: $gl-text-color;
border: 0;
@@ -172,9 +179,11 @@
tbody {
background-color: $white;
- td {
- border-color: $gray-100;
- }
+ }
+
+ td,
+ th {
+ border: 1px solid $border-color;
}
tr {
@@ -478,6 +487,7 @@
font-size: larger;
}
+ figcaption,
.small {
font-size: smaller;
}
diff --git a/app/assets/stylesheets/framework/variables.scss b/app/assets/stylesheets/framework/variables.scss
index 099dfa28b9f..026aeeb1e8e 100644
--- a/app/assets/stylesheets/framework/variables.scss
+++ b/app/assets/stylesheets/framework/variables.scss
@@ -697,7 +697,7 @@ $blame-blue: #254e77;
/*
* Builds
*/
-$builds-trace-bg: #111;
+$builds-log-bg: #111;
$job-log-highlight-height: 18px;
$job-log-line-padding: 55px;
$job-line-number-width: 50px;
@@ -759,7 +759,6 @@ $help-shortcut-header-color: #333;
*/
$issues-today-bg: #f3fff2 !default;
$issues-today-border: #e1e8d5 !default;
-$compare-display-color: #888;
/*
* Label
diff --git a/app/assets/stylesheets/framework/zen.scss b/app/assets/stylesheets/framework/zen.scss
index 62abf4a7683..10df532e334 100644
--- a/app/assets/stylesheets/framework/zen.scss
+++ b/app/assets/stylesheets/framework/zen.scss
@@ -40,15 +40,6 @@
border: 0;
}
-.zen-control-full {
- color: $gl-text-color-secondary;
-
- &:hover {
- color: $blue-600;
- text-decoration: none;
- }
-}
-
.zen-control-leave {
display: none;
color: $gl-text-color;
diff --git a/app/assets/stylesheets/page_bundles/_ide_mixins.scss b/app/assets/stylesheets/page_bundles/_ide_mixins.scss
index 48b8a7230b1..bbc47c5cd5d 100644
--- a/app/assets/stylesheets/page_bundles/_ide_mixins.scss
+++ b/app/assets/stylesheets/page_bundles/_ide_mixins.scss
@@ -4,7 +4,7 @@
height: 100%;
.top-bar {
- @include build-trace-bar(35px);
+ @include build-log-bar(35px);
top: 0;
font-size: 12px;
diff --git a/app/assets/stylesheets/page_bundles/_ide_theme_overrides.scss b/app/assets/stylesheets/page_bundles/_ide_theme_overrides.scss
index 7336d555f79..25a565ce2ba 100644
--- a/app/assets/stylesheets/page_bundles/_ide_theme_overrides.scss
+++ b/app/assets/stylesheets/page_bundles/_ide_theme_overrides.scss
@@ -44,7 +44,7 @@
background-color: var(--ide-background, $badge-bg);
}
- .nav-links:not(.quick-links) li:not(.md-header-toolbar) a,
+ .nav-links li:not(.md-header-toolbar) a,
.gl-tabs-nav li a,
.dropdown-menu-inner-content,
.file-row .file-row-icon svg,
@@ -52,7 +52,7 @@
color: var(--ide-text-color-secondary, $gl-text-color-secondary);
}
- .nav-links:not(.quick-links) li:not(.md-header-toolbar),
+ .nav-links li:not(.md-header-toolbar),
.gl-tabs-nav li {
&:hover a,
&.active a,
@@ -148,7 +148,7 @@
.md blockquote,
.md table:not(.code) tbody td,
.md table:not(.code) tr th,
- .nav-links:not(.quick-links),
+ .nav-links,
.gl-tabs-nav,
.common-note-form .md-area.is-focused .nav-links {
border-color: var(--ide-border-color-alt, $white-dark);
@@ -259,6 +259,7 @@
.dropdown-menu-toggle {
border-color: var(--ide-btn-default-border, $gray-darkest);
+ background-color: var(--ide-input-background, transparent);
&:hover,
&:focus {
@@ -310,7 +311,7 @@
border-color: var(--ide-background, $border-color);
background-color: var(--ide-dropdown-background, $white);
- .nav-links:not(.quick-links) {
+ .nav-links {
background-color: var(--ide-dropdown-hover-background, $white);
border-color: var(--ide-dropdown-hover-background, $border-color);
}
diff --git a/app/assets/stylesheets/page_bundles/build.scss b/app/assets/stylesheets/page_bundles/build.scss
index ec41909beec..ed62e055427 100644
--- a/app/assets/stylesheets/page_bundles/build.scss
+++ b/app/assets/stylesheets/page_bundles/build.scss
@@ -1,8 +1,8 @@
@import 'mixins_and_variables_and_functions';
.build-page {
- .build-trace {
- @include build-trace();
+ .build-log {
+ @include build-log();
}
.archived-job {
@@ -18,7 +18,7 @@
}
.top-bar {
- @include build-trace-top-bar(50px);
+ @include build-log-top-bar(50px);
&.has-archived-block {
top: $header-height + 28px;
diff --git a/app/assets/stylesheets/page_bundles/merge_requests.scss b/app/assets/stylesheets/page_bundles/merge_requests.scss
index 28354b83856..7d1230b0225 100644
--- a/app/assets/stylesheets/page_bundles/merge_requests.scss
+++ b/app/assets/stylesheets/page_bundles/merge_requests.scss
@@ -109,3 +109,12 @@
}
}
}
+
+// TODO: Move to GitLab UI
+.mr-extenson-scrim {
+ background: linear-gradient(to bottom, rgba($gray-light, 0), rgba($gray-light, 1));
+
+ .gl-dark & {
+ background: linear-gradient(to bottom, rgba(#333, 0), rgba(#333, 1));
+ }
+}
diff --git a/app/assets/stylesheets/page_bundles/pipeline.scss b/app/assets/stylesheets/page_bundles/pipeline.scss
index 206c2eb09d0..c8b1b6cf9aa 100644
--- a/app/assets/stylesheets/page_bundles/pipeline.scss
+++ b/app/assets/stylesheets/page_bundles/pipeline.scss
@@ -44,14 +44,14 @@
line-height: initial;
}
- .build-trace-row td {
+ .build-log-row td {
border-top: 0;
border-bottom-width: 1px;
border-bottom-style: solid;
padding-top: 0;
}
- .build-trace {
+ .build-log {
width: 100%;
text-align: left;
margin-top: $gl-padding;
@@ -93,7 +93,7 @@
}
.build-state,
- .build-trace-row {
+ .build-log-row {
> td:last-child {
padding-right: 0;
}
@@ -108,12 +108,12 @@
margin-top: 2 * $gl-padding;
}
- .build-trace-container {
+ .build-log-container {
padding-top: $gl-padding;
padding-bottom: $gl-padding;
}
- .build-trace {
+ .build-log {
margin-bottom: 0;
margin-top: 0;
}
@@ -221,8 +221,8 @@
}
.test-reports-table {
- .build-trace {
- @include build-trace();
+ .build-log {
+ @include build-log();
}
}
diff --git a/app/assets/stylesheets/page_bundles/signup.scss b/app/assets/stylesheets/page_bundles/signup.scss
index 57e5d2411d1..4fc671dace8 100644
--- a/app/assets/stylesheets/page_bundles/signup.scss
+++ b/app/assets/stylesheets/page_bundles/signup.scss
@@ -26,14 +26,6 @@
}
}
- .omniauth-btn {
- width: 48%;
-
- @include media-breakpoint-down(md) {
- width: 100%;
- }
- }
-
.decline-page {
width: 350px;
}
diff --git a/app/assets/stylesheets/page_bundles/wiki.scss b/app/assets/stylesheets/page_bundles/wiki.scss
index 1e6567189be..c64e159c648 100644
--- a/app/assets/stylesheets/page_bundles/wiki.scss
+++ b/app/assets/stylesheets/page_bundles/wiki.scss
@@ -152,5 +152,5 @@ ul.wiki-pages-list.content-list {
}
.wiki-form .markdown-area {
- max-height: none;
+ max-height: 55vh;
}
diff --git a/app/assets/stylesheets/pages/ci_projects.scss b/app/assets/stylesheets/pages/ci_projects.scss
deleted file mode 100644
index fbe1f3081a0..00000000000
--- a/app/assets/stylesheets/pages/ci_projects.scss
+++ /dev/null
@@ -1,54 +0,0 @@
-.ci-body {
- .project-title {
- margin: 0;
- color: $common-gray-dark;
- font-size: 20px;
- line-height: 1.5;
- }
-
- .builds,
- .projects-table {
- .light {
- border-color: $border-color;
- }
-
- th,
- td {
- padding: 10px $gl-padding;
- }
-
- td {
- color: $gl-text-color;
- vertical-align: middle !important;
-
- a {
- font-weight: $gl-font-weight-normal;
- text-decoration: none;
- }
- }
- }
-
- .commit-info {
- .attr-name {
- margin-right: 5px;
- }
-
- pre.commit-message {
- background: none;
- padding: 0;
- border: 0;
- margin: 20px 0;
- border-radius: 0;
- }
- }
-
- .loading {
- font-size: 20px;
- }
-
- .ci-charts {
- fieldset {
- margin-bottom: 16px;
- }
- }
-}
diff --git a/app/assets/stylesheets/pages/clusters.scss b/app/assets/stylesheets/pages/clusters.scss
index d233adbf3d2..de27ca2e5e8 100644
--- a/app/assets/stylesheets/pages/clusters.scss
+++ b/app/assets/stylesheets/pages/clusters.scss
@@ -1,88 +1,4 @@
-.edit-cluster-form {
- .clipboard-addon {
- background-color: $white;
- }
-}
-
-.cluster-application-row {
- background: $gray-lighter;
-
- &.cluster-application-installed {
- background: none;
- }
-
- .settings-message {
- padding: $gl-vert-padding $gl-padding-8;
- }
-}
-
-@media (min-width: map-get($grid-breakpoints, md)) {
- .cluster-application-list {
- border: 1px solid $border-color;
- border-radius: $border-radius-default;
- }
-
- .cluster-application-row {
- border-bottom: 1px solid $border-color;
- padding: $gl-padding;
-
- &:last-child {
- border-bottom: 0;
- border-bottom-left-radius: calc(#{$border-radius-default} - 1px);
- border-bottom-right-radius: calc(#{$border-radius-default} - 1px);
- }
- }
-}
-
-.cluster-application-logo {
- border: 3px solid $white;
- box-shadow: 0 0 0 1px $gray-normal;
-
- &.avatar:hover {
- border-color: $white;
- }
-}
-
-.cluster-application-warning {
- font-weight: bold;
- text-align: center;
- padding: $gl-padding;
- border-bottom: 1px solid $white-normal;
-
- .svg-container {
- display: inline-block;
- vertical-align: middle;
- margin-right: $gl-padding-8;
- width: 40px;
- height: 40px;
- }
-}
-
-.cluster-application-description {
- flex: 1;
-}
-
-.cluster-application-disabled {
- opacity: 0.5;
-}
-
-.clusters-dropdown-menu {
- max-width: 100%;
-}
-
-.clusters-error-alert {
- width: 100%;
-}
-
.clusters-container {
- .nav-bar-right {
- padding: $gl-padding-top $gl-padding;
- }
-
- .card {
- margin-bottom: $gl-vert-padding;
- }
-
.empty-state .svg-content img {
width: 145px;
}
@@ -100,71 +16,4 @@
@include gl-flex-wrap;
}
}
-
- .top-area .nav-controls > .btn.btn-add-cluster {
- margin-right: 0;
- }
-
- .clusters-table {
- background-color: $gray-light;
- padding: $gl-padding-8;
- }
-
- .badge-light {
- background-color: $white-normal;
- }
-
- .gl-responsive-table-row {
- padding: $gl-padding;
- border: 0;
-
- &.table-row-header {
- // stylelint-disable-next-line
- background-color: none;
- border: 0;
- font-weight: bold;
- color: $gray-500;
- }
- }
-}
-
-.cluster-warning {
- @include alert-variant(theme-color-level('warning', $alert-bg-level), theme-color-level('warning', $alert-border-level), theme-color-level('warning', $alert-color-level));
-}
-
-.gcp-signup-offer {
- border-left-color: $blue-500;
-
- svg {
- fill: $blue-500;
- vertical-align: middle;
- }
-
- .gcp-signup-offer--content {
- display: flex;
-
- h4 {
- font-size: 16px;
- line-height: 24px;
- }
-
- .gcp-signup-offer--icon {
- align-self: flex-start;
- }
- }
-}
-
-.cluster-deployments-warning {
- color: $orange-500;
-}
-
-.badge.pods-badge {
- color: $black;
- font-weight: $gl-font-weight-bold;
-}
-
-.cluster-status-indicator {
- &.disabled {
- background-color: $gray-400;
- }
}
diff --git a/app/assets/stylesheets/pages/commits.scss b/app/assets/stylesheets/pages/commits.scss
index bc4dbf695cf..7f35b8fab43 100644
--- a/app/assets/stylesheets/pages/commits.scss
+++ b/app/assets/stylesheets/pages/commits.scss
@@ -82,11 +82,6 @@
}
}
-.commits-compare-switch {
- float: left;
- margin-right: 9px;
-}
-
.commit-header {
padding: 5px 10px;
background-color: $gray-light;
diff --git a/app/assets/stylesheets/pages/environment_logs.scss b/app/assets/stylesheets/pages/environment_logs.scss
index 03993e5321d..f8f40076142 100644
--- a/app/assets/stylesheets/pages/environment_logs.scss
+++ b/app/assets/stylesheets/pages/environment_logs.scss
@@ -40,8 +40,8 @@
height: 100%;
}
- .build-trace {
- @include build-trace($black);
+ .build-log {
+ @include build-log($black);
}
.gl-infinite-scroll-legend {
diff --git a/app/assets/stylesheets/pages/issuable.scss b/app/assets/stylesheets/pages/issuable.scss
index 94912b1c641..c597d2dd8da 100644
--- a/app/assets/stylesheets/pages/issuable.scss
+++ b/app/assets/stylesheets/pages/issuable.scss
@@ -220,21 +220,12 @@
}
.cross-project-reference {
- color: inherit;
-
span {
- white-space: nowrap;
width: 85%;
- overflow: hidden;
- position: relative;
- display: inline-block;
- text-overflow: ellipsis;
}
button {
- float: right;
padding: 1px 5px;
- background-color: $gray-light;
}
}
@@ -563,35 +554,17 @@
}
}
-.participants-list {
- display: flex;
- flex-wrap: wrap;
-}
-
-.user-list {
- display: flex;
- flex-wrap: wrap;
-}
-
.participants-author {
- display: inline-block;
- padding: 0 $gl-padding-8 $gl-padding-8 0;
-
&:nth-of-type(7n) {
padding-right: 0;
}
- .author-link {
- display: block;
- }
-
.avatar.avatar-inline {
margin: 0;
}
}
.user-item {
- display: inline-block;
padding: 5px;
flex-basis: 20%;
@@ -673,40 +646,40 @@
.issuable-info-container {
flex: 1;
display: flex;
+ }
- .issuable-main-info {
- flex: 1 auto;
- margin-right: 10px;
- min-width: 0;
+ .issuable-main-info {
+ flex: 1 auto;
+ margin-right: 10px;
+ min-width: 0;
- .issue-weight-icon,
- .issue-estimate-icon {
- vertical-align: sub;
- }
+ .issue-weight-icon,
+ .issue-estimate-icon {
+ vertical-align: sub;
}
+ }
- .issuable-meta {
- display: flex;
- flex-direction: column;
- align-items: flex-end;
- flex: 1 0 auto;
-
- .controls {
- margin-bottom: 2px;
- line-height: 20px;
- padding: 0;
- }
+ .issuable-meta {
+ display: flex;
+ flex-direction: column;
+ align-items: flex-end;
+ flex: 1 0 auto;
- .issue-updated-at {
- line-height: 20px;
- }
+ .controls {
+ margin-bottom: 2px;
+ line-height: 20px;
+ padding: 0;
}
- @include media-breakpoint-down(xs) {
- .issuable-meta {
- .controls li {
- margin-right: 0;
- }
+ .issue-updated-at {
+ line-height: 20px;
+ }
+ }
+
+ @include media-breakpoint-down(xs) {
+ .issuable-meta {
+ .controls li {
+ margin-right: 0;
}
}
}
@@ -773,38 +746,15 @@
}
}
-.add-issuable-form-input-token-list {
- display: flex;
- flex-wrap: wrap;
- align-items: baseline;
- list-style: none;
- margin-bottom: 0;
- padding-left: 0;
-}
-
-.add-issuable-form-token-list-item {
- max-width: 100%;
- margin-bottom: $gl-vert-padding;
- margin-right: 5px;
-}
-
-.add-issuable-form-input-list-item {
- flex: 1;
- min-width: 200px;
- margin-bottom: $gl-vert-padding;
-}
-
-.add-issuable-form-input {
- width: 100%;
- border: 0;
-
- &:focus {
- outline: none;
+.add-issuable-form-input-wrapper {
+ &.focus {
+ border-color: $blue-300;
+ box-shadow: 0 0 4px $dropdown-input-focus-shadow;
}
-}
-.add-issuable-form-actions {
- margin-top: $gl-padding;
+ .gl-show-field-errors &.form-control:not(textarea) {
+ height: auto;
+ }
}
.time-tracker {
@@ -839,18 +789,7 @@
}
.compare-display-container {
- display: flex;
- justify-content: space-between;
- margin-top: 5px;
-
- .compare-display {
- font-size: 13px;
- color: $compare-display-color;
-
- .compare-value {
- color: $gl-text-color;
- }
- }
+ font-size: 13px;
}
.time-tracking-help-state {
@@ -938,22 +877,6 @@
vertical-align: sub;
}
-.suggestion-confidential {
- color: $orange-500;
-}
-
-.suggestion-state-open {
- color: $green-500;
-}
-
-.suggestion-state-closed {
- color: $blue-500;
-}
-
-.suggestion-help-hover {
- cursor: help;
-}
-
.suggestion-footer {
font-size: 12px;
line-height: 15px;
diff --git a/app/assets/stylesheets/pages/issues.scss b/app/assets/stylesheets/pages/issues.scss
index 461d6a29b3a..880231f5644 100644
--- a/app/assets/stylesheets/pages/issues.scss
+++ b/app/assets/stylesheets/pages/issues.scss
@@ -1,42 +1,62 @@
-.issue-realtime-pre-pulse {
- opacity: 0;
-}
+.issue-token-link {
+ &[href] {
+ color: $blue-600;
+ }
-.issue-realtime-trigger-pulse {
- transition: opacity $fade-in-duration linear;
- opacity: 1;
+ &:hover,
+ &:focus {
+ outline: none;
+ text-decoration: none;
+ }
}
-.check-all-holder {
- line-height: 36px;
- float: left;
- margin-right: 15px;
-}
+.issue-token-reference {
+ margin-right: 1px;
+ background-color: $gray-lighter;
+ transition: background $general-hover-transition-duration $general-hover-transition-curve, color $general-hover-transition-duration $general-hover-transition-curve;
-form.edit-issue {
- margin: 0;
+ .issue-token:hover &,
+ .issue-token-link:focus > & {
+ background-color: $gray-normal;
+ color: $blue-800;
+ text-decoration: none;
+ }
}
-ul.related-merge-requests > li {
- display: flex;
- align-items: center;
+.issue-token-title {
+ background-color: $gray-normal;
+ transition: background $general-hover-transition-duration $general-hover-transition-curve;
- .merge-request-id {
- flex-shrink: 0;
+ .issue-token:hover &,
+ .issue-token-link:focus > & {
+ background-color: $border-gray-normal;
}
+}
- .merge-request-info {
- margin-left: 5px;
- }
+.issue-token-remove-button {
+ background-color: $gray-normal;
+ transition: background $general-hover-transition-duration $general-hover-transition-curve;
- gl-emoji {
- font-size: 1em;
+ &:hover,
+ &:focus,
+ .issue-token:hover &,
+ .issue-token-link:focus + & {
+ background-color: $border-gray-normal;
+ outline: none;
}
}
-.related-branches-title {
- font-size: 16px;
- font-weight: $gl-font-weight-bold;
+.issue-realtime-pre-pulse {
+ opacity: 0;
+}
+
+.issue-realtime-trigger-pulse {
+ transition: opacity $fade-in-duration linear;
+ opacity: 1;
+}
+
+ul.related-merge-requests > li gl-emoji {
+ font-size: 1em;
}
.merge-request-status {
@@ -92,35 +112,12 @@ ul.related-merge-requests > li {
}
}
-.issues-footer {
- padding-top: $gl-padding;
- padding-bottom: 37px;
-}
-
-.issues-nav-controls,
-.new-branch-col {
- font-size: 0;
-}
-
.issues-nav-controls {
.btn-group:empty {
display: none;
}
}
-.email-modal-input-group {
- margin-bottom: 10px;
-
- .form-control {
- background-color: $white;
- }
-
- .btn {
- background-color: $gray-light;
- border: 1px solid $border-gray-normal;
- }
-}
-
.recaptcha {
margin-bottom: 30px;
}
diff --git a/app/assets/stylesheets/pages/issues/issue_count_badge.scss b/app/assets/stylesheets/pages/issues/issue_count_badge.scss
deleted file mode 100644
index f2283e02ad2..00000000000
--- a/app/assets/stylesheets/pages/issues/issue_count_badge.scss
+++ /dev/null
@@ -1,10 +0,0 @@
-.issue-count-badge,
-.mr-count-badge {
- padding: 5px $gl-padding-8;
-}
-
-.issue-count-badge-count,
-.mr-count-badge-count {
- display: inline-flex;
- align-items: center;
-}
diff --git a/app/assets/stylesheets/pages/login.scss b/app/assets/stylesheets/pages/login.scss
index 773935f4c76..71ddbf175e9 100644
--- a/app/assets/stylesheets/pages/login.scss
+++ b/app/assets/stylesheets/pages/login.scss
@@ -99,11 +99,6 @@
padding: 0;
border: 0;
background: none;
- margin-bottom: $gl-padding;
- }
-
- .omniauth-btn {
- width: 100%;
}
}
@@ -206,6 +201,12 @@
padding: 0;
height: 100%;
+ &.with-system-header {
+ .login-page-broadcast {
+ margin-top: $system-header-height + $header-height;
+ }
+ }
+
// Fixes footer container to bottom of viewport
body {
// offset height of fixed header + 1 to avoid scroll
diff --git a/app/assets/stylesheets/pages/merge_requests.scss b/app/assets/stylesheets/pages/merge_requests.scss
index 071a5be073f..cec8d8a29cc 100644
--- a/app/assets/stylesheets/pages/merge_requests.scss
+++ b/app/assets/stylesheets/pages/merge_requests.scss
@@ -474,31 +474,6 @@ $tabs-holder-z-index: 250;
}
}
}
-
- .merge-request-labels {
- display: inline-block;
- }
-}
-
-.merge-request-angle {
- text-align: center;
- margin: 0 auto;
- font-size: 2em;
- line-height: 1.1;
-}
-
-// hide mr close link for inline diff comment form
-.diff-file .close-mr-link,
-.diff-file .reopen-mr-link {
- display: none;
-}
-
-.mr-links {
- padding-left: $gl-padding-8 + $status-icon-size + $gl-btn-padding;
-
- &:last-child {
- padding-bottom: $gl-padding;
- }
}
.mr-info-list {
@@ -649,10 +624,6 @@ $tabs-holder-z-index: 250;
}
}
-.target-branch-select-dropdown-container {
- position: relative;
-}
-
.assign-to-me-link {
padding-left: 12px;
white-space: nowrap;
@@ -667,12 +638,6 @@ $tabs-holder-z-index: 250;
}
}
-.merged-buttons {
- .btn {
- float: left;
- }
-}
-
.mr-version-controls {
position: relative;
z-index: $tabs-holder-z-index + 10;
@@ -1040,3 +1005,17 @@ $tabs-holder-z-index: 250;
margin-bottom: 1px;
}
}
+
+.mr-widget-extension-icon::before {
+ @include gl-content-empty;
+ @include gl-absolute;
+ @include gl-left-0;
+ @include gl-top-0;
+ @include gl-opacity-3;
+ @include gl-border-solid;
+ @include gl-border-4;
+ @include gl-rounded-full;
+
+ width: 24px;
+ height: 24px;
+}
diff --git a/app/assets/stylesheets/pages/note_form.scss b/app/assets/stylesheets/pages/note_form.scss
index 3c0f10eb5cb..1c408f6d985 100644
--- a/app/assets/stylesheets/pages/note_form.scss
+++ b/app/assets/stylesheets/pages/note_form.scss
@@ -24,12 +24,6 @@
margin: $gl-padding 0 0;
}
- .note-preview-holder {
- > p {
- overflow-x: auto;
- }
- }
-
img {
max-width: 100%;
}
diff --git a/app/assets/stylesheets/pages/notes.scss b/app/assets/stylesheets/pages/notes.scss
index 17bc40b4dec..04da75b586f 100644
--- a/app/assets/stylesheets/pages/notes.scss
+++ b/app/assets/stylesheets/pages/notes.scss
@@ -125,18 +125,17 @@ $system-note-svg-size: 16px;
}
}
+ .timeline-discussion-body {
+ margin-top: -$gl-padding-8;
+ }
+
.discussion {
display: block;
position: relative;
.timeline-discussion-body {
- margin-top: -$gl-padding-8;
overflow-x: auto;
overflow-y: hidden;
-
- .note-body {
- margin-top: $gl-padding-8;
- }
}
.diff-content {
@@ -586,17 +585,47 @@ $system-note-svg-size: 16px;
.note-header {
display: flex;
justify-content: space-between;
+ flex-wrap: wrap;
+
+ > .note-header-info,
+ > .note-actions {
+ flex-grow: 1;
+ flex-shrink: 1;
+ }
+}
+
+.note {
+ @include notes-media('max', map-get($grid-breakpoints, sm) - 1) {
+ .note-header {
+ .note-actions {
+ flex-wrap: wrap;
+ margin-bottom: $gl-padding-12;
+
+ > :first-child {
+ margin-left: 0;
+ }
+ }
+ }
+
+ .note-header-author-name {
+ display: block;
+ }
+ }
}
.note-header-info {
min-width: 0;
- padding-bottom: $gl-padding-8;
&.discussion {
padding-bottom: 0;
}
}
+.note-header-info,
+.note-actions {
+ padding-bottom: $gl-padding-8;
+}
+
.system-note .note-header-info {
padding-bottom: 0;
}
@@ -667,7 +696,8 @@ $system-note-svg-size: 16px;
.note-actions {
align-self: flex-start;
- flex-shrink: 0;
+ justify-content: flex-end;
+ flex-shrink: 1;
display: inline-flex;
align-items: center;
margin-left: 10px;
diff --git a/app/assets/stylesheets/pages/notifications.scss b/app/assets/stylesheets/pages/notifications.scss
index 298de33888d..2fd2757cf08 100644
--- a/app/assets/stylesheets/pages/notifications.scss
+++ b/app/assets/stylesheets/pages/notifications.scss
@@ -4,11 +4,6 @@
width: 100%;
}
- .notification-form {
- display: block;
- }
-
- .notifications-btn,
.btn-group {
width: 100%;
}
diff --git a/app/assets/stylesheets/pages/pages.scss b/app/assets/stylesheets/pages/pages.scss
index 93caa345f8a..ebaf875ad8f 100644
--- a/app/assets/stylesheets/pages/pages.scss
+++ b/app/assets/stylesheets/pages/pages.scss
@@ -55,16 +55,4 @@
border-bottom-right-radius: $border-radius-default;
border-top-right-radius: $border-radius-default;
}
-
- &.floating-status-badge {
- position: absolute;
- right: $gl-padding-24;
- bottom: $gl-padding-4;
- margin-bottom: 0;
- }
-}
-
-.form-control.has-floating-status-badge {
- position: relative;
- padding-right: 120px;
}
diff --git a/app/assets/stylesheets/pages/profile.scss b/app/assets/stylesheets/pages/profile.scss
index de9e0c6f705..af9f10c9a26 100644
--- a/app/assets/stylesheets/pages/profile.scss
+++ b/app/assets/stylesheets/pages/profile.scss
@@ -1,9 +1,3 @@
-.profile-avatar-form-option {
- hr {
- margin: 10px 0;
- }
-}
-
.avatar-image {
margin-bottom: $grid-size;
@@ -23,41 +17,6 @@
display: inline-block;
}
-.private-tokens-reset div.reset-action:not(:first-child) {
- padding-top: 15px;
-}
-
-.oauth-buttons {
- .btn-group {
- margin-right: 10px;
- }
-
- .btn {
- line-height: 40px;
- height: 42px;
- padding: 0 12px;
-
- img {
- width: 32px;
- height: 32px;
- }
- }
-}
-
-// Profile > Account > Two Factor Authentication
-.two-factor-new {
- .manual-instructions {
- h3 {
- margin-top: 0;
- }
-
- // Slightly increase the size of the details so they're easier to read
- dl {
- font-size: 1.1em;
- }
- }
-}
-
.account-well {
padding: 10px;
background-color: $gray-light;
@@ -191,10 +150,6 @@
}
}
-.personal-access-tokens-never-expires-label {
- color: $note-disabled-comment-color;
-}
-
.created-personal-access-token-container {
.btn-clipboard {
border: 1px solid $border-color;
@@ -266,8 +221,7 @@
}
}
-table.u2f-registrations,
-.webauthn-registrations {
+table.u2f-registrations {
th:not(:last-child),
td:not(:last-child) {
border-right: solid 1px transparent;
diff --git a/app/assets/stylesheets/pages/profiles/preferences.scss b/app/assets/stylesheets/pages/profiles/preferences.scss
index 12386fa66ec..b583d40de79 100644
--- a/app/assets/stylesheets/pages/profiles/preferences.scss
+++ b/app/assets/stylesheets/pages/profiles/preferences.scss
@@ -1,19 +1,3 @@
-.multi-file-editor-options {
- label {
- margin-right: 20px;
- text-align: center;
- }
-
- .preview {
- font-size: 0;
-
- img {
- border: 1px solid $border-color-settings;
- border-radius: 4px;
- }
- }
-}
-
.application-theme {
$ui-dark-bg: #2e2e2e;
$ui-light-bg: #dfdfdf;
diff --git a/app/assets/stylesheets/pages/projects.scss b/app/assets/stylesheets/pages/projects.scss
index c330e0709a6..6b4d7c2520c 100644
--- a/app/assets/stylesheets/pages/projects.scss
+++ b/app/assets/stylesheets/pages/projects.scss
@@ -622,12 +622,6 @@ pre.light-well {
}
}
- .star-button {
- .icon {
- top: 0;
- }
- }
-
.icon-container {
@include media-breakpoint-down(xs) {
margin-right: $gl-padding-8;
@@ -938,16 +932,6 @@ pre.light-well {
}
}
-.project-ci-linter {
- .ci-editor {
- height: 400px;
- }
-
- .ci-template pre {
- white-space: pre-wrap;
- }
-}
-
.project-badge {
opacity: 0.9;
diff --git a/app/assets/stylesheets/pages/prometheus.scss b/app/assets/stylesheets/pages/prometheus.scss
index a3b6cbdff25..71cbd7d9613 100644
--- a/app/assets/stylesheets/pages/prometheus.scss
+++ b/app/assets/stylesheets/pages/prometheus.scss
@@ -96,11 +96,6 @@
padding: $gl-padding-8;
}
-.prometheus-graph-embed {
- border: 1px solid $border-color;
- border-radius: $border-radius-default;
-}
-
.alert-current-setting {
max-width: 240px;
@@ -110,233 +105,6 @@
}
}
-.prometheus-graph-cursor {
- position: absolute;
- background: $gray-400;
- width: 1px;
-}
-
-.prometheus-graph-flag {
- display: block;
- min-width: 160px;
- border: 0;
- box-shadow: 0 1px 4px 0 $black-transparent;
-
- h5 {
- padding: 0;
- margin: 0;
- font-size: 14px;
- line-height: 1.2;
- }
-
- .deploy-meta-content {
- border-bottom: 1px solid $white-dark;
-
- svg {
- height: 15px;
- vertical-align: bottom;
- }
- }
-
- &.popover {
- padding: 0;
-
- &.left {
- left: auto;
- right: 0;
- margin-right: 10px;
-
- > .arrow {
- right: -14px;
- border-left-color: $border-color;
- }
-
- > .arrow::after {
- border-top: 6px solid transparent;
- border-bottom: 6px solid transparent;
- border-left: 4px solid $gray-10;
- }
-
- .arrow-shadow {
- right: -3px;
- box-shadow: 1px 0 9px 0 $black-transparent;
- }
- }
-
- &.right {
- left: 0;
- right: auto;
- margin-left: 10px;
-
- > .arrow {
- left: -7px;
- border-right-color: $border-color;
- }
-
- > .arrow::after {
- border-top: 6px solid transparent;
- border-bottom: 6px solid transparent;
- border-right: 4px solid $gray-10;
- }
-
- .arrow-shadow {
- left: -3px;
- box-shadow: 1px 0 8px 0 $black-transparent;
- }
- }
-
- > .arrow {
- top: 10px;
- margin: 0;
- }
-
- .arrow-shadow {
- content: '';
- position: absolute;
- width: 7px;
- height: 7px;
- background-color: transparent;
- transform: rotate(45deg);
- top: 13px;
- }
-
- > .popover-title,
- > .popover-content,
- > .popover-header,
- > .popover-body {
- padding: 8px;
- white-space: nowrap;
- position: relative;
- }
-
- > .popover-title {
- background-color: $gray-10;
- border-radius: $border-radius-default $border-radius-default 0 0;
- }
- }
-
- strong {
- font-weight: 600;
- }
-}
-
-.prometheus-table {
- border-collapse: collapse;
- padding: 0;
- margin: 0;
-
- td {
- vertical-align: middle;
-
- + td {
- padding-left: 8px;
- vertical-align: top;
- }
- }
-
- .legend-metric-title {
- font-size: 12px;
- vertical-align: middle;
- }
-}
-
-.prometheus-svg-container {
- position: relative;
- height: 0;
- width: 100%;
- padding: 0;
- padding-bottom: 100%;
-
- .text-metric-usage {
- fill: $black;
- font-weight: $gl-font-weight-normal;
- font-size: 12px;
- }
-
- > svg {
- position: absolute;
- height: 100%;
- width: 100%;
- left: 0;
- top: 0;
-
- text {
- fill: $gl-text-color;
- stroke-width: 0;
- }
-
- .text-metric-bold {
- font-weight: $gl-font-weight-bold;
- }
-
- .label-axis-text {
- fill: $black;
- font-weight: $gl-font-weight-normal;
- font-size: 10px;
- }
-
- .legend-axis-text {
- fill: $black;
- }
-
- .tick {
- > line {
- stroke: $gray-darker;
- }
-
- > text {
- fill: $gray-400;
- font-size: 10px;
- }
- }
-
- .y-label-text,
- .x-label-text {
- fill: $gray-darkest;
- }
-
- .axis-tick {
- stroke: $gray-darker;
- }
-
- .deploy-info-text {
- dominant-baseline: text-before-edge;
- font-size: 12px;
- }
-
- .deploy-info-text-link {
- font-family: $monospace-font;
- fill: $blue-600;
-
- &:hover {
- fill: $blue-800;
- }
- }
-
- @include media-breakpoint-down(sm) {
- .label-axis-text,
- .text-metric-usage,
- .legend-axis-text {
- font-size: 8px;
- }
-
- .tick > text {
- font-size: 8px;
- }
- }
- }
-}
-
-.prometheus-table-row-highlight {
- background-color: $gray-100;
-}
-
-.prometheus-graph-overlay {
- fill: none;
- opacity: 0;
- pointer-events: all;
-}
-
.prometheus-panel-builder {
.preview-date-time-picker {
// same as in .dropdown-menu-toggle
diff --git a/app/assets/stylesheets/pages/settings.scss b/app/assets/stylesheets/pages/settings.scss
index aa9ebfe2968..37e272cfff7 100644
--- a/app/assets/stylesheets/pages/settings.scss
+++ b/app/assets/stylesheets/pages/settings.scss
@@ -154,17 +154,6 @@
}
}
-.token-token-container {
- #impersonation-token-token {
- width: 80%;
- display: inline;
- }
-
- .btn-clipboard {
- margin-left: 5px;
- }
-}
-
.visibility-level-setting {
.form-check {
margin-bottom: 10px;
@@ -203,22 +192,6 @@
}
}
-.initialize-with-readme-setting {
- .form-check {
- margin-bottom: 10px;
-
- .option-title {
- font-weight: $gl-font-weight-normal;
- display: inline-block;
- color: $gl-text-color;
- }
-
- .option-description {
- color: $project-option-descr-color;
- }
- }
-}
-
.nested-settings {
padding-left: 20px;
}
@@ -326,10 +299,6 @@
}
}
-.personal-access-tokens-never-expires-label {
- color: $note-disabled-comment-color;
-}
-
.created-deploy-token-container {
.deploy-token-field {
width: 90%;
diff --git a/app/assets/stylesheets/pages/tree.scss b/app/assets/stylesheets/pages/tree.scss
index 5765156f26c..33c66648718 100644
--- a/app/assets/stylesheets/pages/tree.scss
+++ b/app/assets/stylesheets/pages/tree.scss
@@ -223,11 +223,6 @@
min-height: 200px;
}
-.upload-link {
- font-weight: $gl-font-weight-normal;
- color: $blue-600;
-}
-
.repo-charts {
.sub-header {
margin: 20px 0;
diff --git a/app/assets/stylesheets/startup/startup-dark.scss b/app/assets/stylesheets/startup/startup-dark.scss
index b7958cdf4a3..d436c328921 100644
--- a/app/assets/stylesheets/startup/startup-dark.scss
+++ b/app/assets/stylesheets/startup/startup-dark.scss
@@ -5,20 +5,17 @@
body.gl-dark {
--gray-50: #303030;
--gray-100: #404040;
+ --gray-900: #fafafa;
--gray-950: #fff;
--green-100: #0d532a;
--green-400: #108548;
--green-700: #91d4a8;
--blue-400: #1f75cb;
--orange-400: #ab6100;
- --purple-100: #2f2a6b;
--gl-text-color: #fafafa;
--border-color: #4f4f4f;
--black: #fff;
}
-.nav-sidebar li.active {
- box-shadow: none;
-}
:root {
--white: #333;
}
@@ -198,22 +195,6 @@ h1 {
.dropdown {
position: relative;
}
-.dropdown-menu-toggle {
- white-space: nowrap;
-}
-.dropdown-menu-toggle::after {
- display: inline-block;
- margin-left: 0.255em;
- vertical-align: 0.255em;
- content: "";
- border-top: 0.3em solid;
- border-right: 0.3em solid transparent;
- border-bottom: 0;
- border-left: 0.3em solid transparent;
-}
-.dropdown-menu-toggle:empty::after {
- margin-left: 0;
-}
.dropdown-menu {
position: absolute;
top: 100%;
@@ -331,6 +312,9 @@ h1 {
padding-left: 0.6em;
border-radius: 10rem;
}
+.bg-transparent {
+ background-color: transparent !important;
+}
.rounded-circle {
border-radius: 50% !important;
}
@@ -375,6 +359,20 @@ h1 {
.m-auto {
margin: auto !important;
}
+.gl-badge {
+ display: inline-flex;
+ align-items: center;
+ font-size: 0.75rem;
+ font-weight: 400;
+ line-height: 1rem;
+ padding-top: 0.25rem;
+ padding-bottom: 0.25rem;
+ padding-left: 0.5rem;
+ padding-right: 0.5rem;
+}
+.gl-button .gl-badge {
+ top: 0;
+}
.gl-form-input,
.gl-form-input.form-control {
background-color: #333;
@@ -466,9 +464,6 @@ a {
.hide {
display: none;
}
-.dropdown-menu-toggle::after {
- display: none;
-}
.badge:not(.gl-badge) {
padding: 4px 5px;
font-size: 12px;
@@ -548,7 +543,7 @@ body {
border-radius: 0.25rem;
white-space: nowrap;
}
-.no-outline.dropdown-menu-toggle {
+.dropdown-menu-toggle.no-outline {
outline: 0;
}
.dropdown-menu-toggle.dropdown-menu-toggle {
@@ -875,6 +870,12 @@ input {
.navbar-nav .badge.badge-pill:not(.merge-request-badge).todos-count {
background-color: var(--blue-400, #1f75cb);
}
+.title-container .canary-badge .badge,
+.navbar-nav .canary-badge .badge {
+ font-size: 12px;
+ line-height: 16px;
+ padding: 0 0.5rem;
+}
@media (max-width: 575.98px) {
.navbar-gitlab .container-fluid {
font-size: 18px;
@@ -1280,6 +1281,7 @@ input {
a
.avatar-container.rect-avatar
.avatar.s32 {
+ border-radius: 4px;
box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.08);
}
.sidebar-top-level-items {
@@ -1304,6 +1306,7 @@ input {
a
.avatar-container.rect-avatar
.avatar.s32 {
+ border-radius: 4px;
box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.08);
}
.sidebar-top-level-items > li .badge.badge-pill {
@@ -1601,19 +1604,98 @@ svg.s16 {
.rect-avatar.s16 {
border-radius: 2px;
}
-.rect-avatar.s32,
-.nav-sidebar-inner-scroll
- > div.context-header
- a
- .avatar-container.rect-avatar
- .avatar.s32,
-.sidebar-top-level-items
- .context-header
- a
- .avatar-container.rect-avatar
- .avatar.s32 {
+.rect-avatar.s32 {
border-radius: 4px;
}
+body.gl-dark {
+ --gray-10: #1f1f1f;
+ --gray-50: #303030;
+ --gray-100: #404040;
+ --gray-200: #525252;
+ --gray-300: #5e5e5e;
+ --gray-400: #868686;
+ --gray-500: #999;
+ --gray-600: #bfbfbf;
+ --gray-700: #dbdbdb;
+ --gray-800: #f0f0f0;
+ --gray-900: #fafafa;
+ --gray-950: #fff;
+ --green-50: #0a4020;
+ --green-100: #0d532a;
+ --green-200: #24663b;
+ --green-300: #217645;
+ --green-400: #108548;
+ --green-500: #2da160;
+ --green-600: #52b87a;
+ --green-700: #91d4a8;
+ --green-800: #c3e6cd;
+ --green-900: #ecf4ee;
+ --green-950: #f1fdf6;
+ --blue-50: #033464;
+ --blue-100: #064787;
+ --blue-200: #0b5cad;
+ --blue-300: #1068bf;
+ --blue-400: #1f75cb;
+ --blue-500: #428fdc;
+ --blue-600: #63a6e9;
+ --blue-700: #9dc7f1;
+ --blue-800: #cbe2f9;
+ --blue-900: #e9f3fc;
+ --blue-950: #f2f9ff;
+ --orange-50: #5c2900;
+ --orange-100: #703800;
+ --orange-200: #8f4700;
+ --orange-300: #9e5400;
+ --orange-400: #ab6100;
+ --orange-500: #c17d10;
+ --orange-600: #d99530;
+ --orange-700: #e9be74;
+ --orange-800: #f5d9a8;
+ --orange-900: #fdf1dd;
+ --orange-950: #fff4e1;
+ --red-50: #660e00;
+ --red-100: #8d1300;
+ --red-200: #ae1800;
+ --red-300: #c91c00;
+ --red-400: #dd2b0e;
+ --red-500: #ec5941;
+ --red-600: #f57f6c;
+ --red-700: #fcb5aa;
+ --red-800: #fdd4cd;
+ --red-900: #fcf1ef;
+ --red-950: #fff4f3;
+ --indigo-50: #1a1a40;
+ --indigo-100: #292961;
+ --indigo-200: #393982;
+ --indigo-300: #4b4ba3;
+ --indigo-400: #5b5bbd;
+ --indigo-500: #6666c4;
+ --indigo-600: #7c7ccc;
+ --indigo-700: #a6a6de;
+ --indigo-800: #d1d1f0;
+ --indigo-900: #ebebfa;
+ --indigo-950: #f7f7ff;
+ --indigo-900-alpha-008: rgba(235, 235, 250, 0.08);
+ --purple-50: #232150;
+ --purple-100: #2f2a6b;
+ --purple-200: #453894;
+ --purple-300: #5943b6;
+ --purple-400: #694cc0;
+ --purple-500: #7b58cf;
+ --purple-600: #9475db;
+ --purple-700: #ac93e6;
+ --purple-800: #cbbbf2;
+ --purple-900: #e1d8f9;
+ --purple-950: #f4f0ff;
+ --gl-text-color: #fafafa;
+ --border-color: #4f4f4f;
+ --white: #333;
+ --black: #fff;
+ --svg-status-bg: #333;
+}
+.nav-sidebar li.active {
+ box-shadow: none;
+}
body.gl-dark .navbar-gitlab {
background-color: #fafafa;
}
@@ -1703,8 +1785,8 @@ body.gl-dark .nav-sidebar li.active > a {
body.gl-dark .nav-sidebar .fly-out-top-item a,
body.gl-dark .nav-sidebar .fly-out-top-item.active a,
body.gl-dark .nav-sidebar .fly-out-top-item .fly-out-top-item-container {
- background-color: var(--purple-100, #e1d8f9);
- color: var(--black, #333);
+ background-color: var(--gray-100, #303030);
+ color: var(--gray-900, #fafafa);
}
body.gl-dark .logo-text svg {
fill: var(--gl-text-color);
@@ -1823,9 +1905,6 @@ body.gl-dark {
--black: #fff;
--svg-status-bg: #333;
}
-.nav-sidebar li.active {
- box-shadow: none;
-}
.tab-width-8 {
-moz-tab-size: 8;
tab-size: 8;
@@ -1841,9 +1920,18 @@ body.gl-dark {
white-space: nowrap;
width: 1px;
}
+.gl-bg-green-500 {
+ background-color: #2da160;
+}
.gl-border-none\! {
border-style: none !important;
}
+.gl-rounded-pill {
+ border-radius: 0.75rem;
+}
+.gl-text-white {
+ color: #333;
+}
.gl-display-none {
display: none;
}
@@ -1862,6 +1950,10 @@ body.gl-dark {
.gl-pr-2 {
padding-right: 0.25rem;
}
+.gl-py-1 {
+ padding-top: 0.125rem;
+ padding-bottom: 0.125rem;
+}
.gl-ml-3 {
margin-left: 0.5rem;
}
diff --git a/app/assets/stylesheets/startup/startup-general.scss b/app/assets/stylesheets/startup/startup-general.scss
index 2c79b819899..40026c95a15 100644
--- a/app/assets/stylesheets/startup/startup-general.scss
+++ b/app/assets/stylesheets/startup/startup-general.scss
@@ -178,22 +178,6 @@ h1 {
.dropdown {
position: relative;
}
-.dropdown-menu-toggle {
- white-space: nowrap;
-}
-.dropdown-menu-toggle::after {
- display: inline-block;
- margin-left: 0.255em;
- vertical-align: 0.255em;
- content: "";
- border-top: 0.3em solid;
- border-right: 0.3em solid transparent;
- border-bottom: 0;
- border-left: 0.3em solid transparent;
-}
-.dropdown-menu-toggle:empty::after {
- margin-left: 0;
-}
.dropdown-menu {
position: absolute;
top: 100%;
@@ -311,6 +295,9 @@ h1 {
padding-left: 0.6em;
border-radius: 10rem;
}
+.bg-transparent {
+ background-color: transparent !important;
+}
.rounded-circle {
border-radius: 50% !important;
}
@@ -355,6 +342,20 @@ h1 {
.m-auto {
margin: auto !important;
}
+.gl-badge {
+ display: inline-flex;
+ align-items: center;
+ font-size: 0.75rem;
+ font-weight: 400;
+ line-height: 1rem;
+ padding-top: 0.25rem;
+ padding-bottom: 0.25rem;
+ padding-left: 0.5rem;
+ padding-right: 0.5rem;
+}
+.gl-button .gl-badge {
+ top: 0;
+}
.gl-form-input,
.gl-form-input.form-control {
background-color: #fff;
@@ -446,9 +447,6 @@ a {
.hide {
display: none;
}
-.dropdown-menu-toggle::after {
- display: none;
-}
.badge:not(.gl-badge) {
padding: 4px 5px;
font-size: 12px;
@@ -528,7 +526,7 @@ body {
border-radius: 0.25rem;
white-space: nowrap;
}
-.no-outline.dropdown-menu-toggle {
+.dropdown-menu-toggle.no-outline {
outline: 0;
}
.dropdown-menu-toggle.dropdown-menu-toggle {
@@ -855,6 +853,12 @@ input {
.navbar-nav .badge.badge-pill:not(.merge-request-badge).todos-count {
background-color: var(--blue-400, #428fdc);
}
+.title-container .canary-badge .badge,
+.navbar-nav .canary-badge .badge {
+ font-size: 12px;
+ line-height: 16px;
+ padding: 0 0.5rem;
+}
@media (max-width: 575.98px) {
.navbar-gitlab .container-fluid {
font-size: 18px;
@@ -1260,6 +1264,7 @@ input {
a
.avatar-container.rect-avatar
.avatar.s32 {
+ border-radius: 4px;
box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.08);
}
.sidebar-top-level-items {
@@ -1284,6 +1289,7 @@ input {
a
.avatar-container.rect-avatar
.avatar.s32 {
+ border-radius: 4px;
box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.08);
}
.sidebar-top-level-items > li .badge.badge-pill {
@@ -1581,17 +1587,7 @@ svg.s16 {
.rect-avatar.s16 {
border-radius: 2px;
}
-.rect-avatar.s32,
-.nav-sidebar-inner-scroll
- > div.context-header
- a
- .avatar-container.rect-avatar
- .avatar.s32,
-.sidebar-top-level-items
- .context-header
- a
- .avatar-container.rect-avatar
- .avatar.s32 {
+.rect-avatar.s32 {
border-radius: 4px;
}
@@ -1610,9 +1606,18 @@ svg.s16 {
white-space: nowrap;
width: 1px;
}
+.gl-bg-green-500 {
+ background-color: #108548;
+}
.gl-border-none\! {
border-style: none !important;
}
+.gl-rounded-pill {
+ border-radius: 0.75rem;
+}
+.gl-text-white {
+ color: #fff;
+}
.gl-display-none {
display: none;
}
@@ -1631,6 +1636,10 @@ svg.s16 {
.gl-pr-2 {
padding-right: 0.25rem;
}
+.gl-py-1 {
+ padding-top: 0.125rem;
+ padding-bottom: 0.125rem;
+}
.gl-ml-3 {
margin-left: 0.5rem;
}
diff --git a/app/assets/stylesheets/startup/startup-signin.scss b/app/assets/stylesheets/startup/startup-signin.scss
index 013ad3fac87..8d7531d6c9c 100644
--- a/app/assets/stylesheets/startup/startup-signin.scss
+++ b/app/assets/stylesheets/startup/startup-signin.scss
@@ -258,21 +258,6 @@ fieldset:disabled a.btn {
align-items: center;
justify-content: space-between;
}
-.d-block {
- display: block !important;
-}
-.d-flex {
- display: flex !important;
-}
-.flex-wrap {
- flex-wrap: wrap !important;
-}
-.justify-content-between {
- justify-content: space-between !important;
-}
-.align-items-center {
- align-items: center !important;
-}
.fixed-top {
position: fixed;
top: 0;
@@ -280,9 +265,6 @@ fieldset:disabled a.btn {
left: 0;
z-index: 1030;
}
-.ml-2 {
- margin-left: 0.5rem !important;
-}
.mt-3 {
margin-top: 1rem !important;
}
@@ -349,6 +331,15 @@ fieldset:disabled a.btn {
font-size: 0.875rem;
border-radius: 0.25rem;
}
+.gl-button.gl-button .gl-button-text {
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ padding-top: 1px;
+ padding-bottom: 1px;
+ margin-top: -1px;
+ margin-bottom: -1px;
+}
.gl-button.gl-button .gl-button-icon {
height: 1rem;
width: 1rem;
@@ -637,10 +628,6 @@ svg {
padding: 0;
border: 0;
background: none;
- margin-bottom: 16px;
-}
-.login-page .omniauth-container .omniauth-btn {
- width: 100%;
}
.login-page .new-session-tabs {
display: flex;
@@ -771,21 +758,18 @@ svg {
.gl-align-items-center {
align-items: center;
}
+.gl-flex-wrap {
+ flex-wrap: wrap;
+}
.gl-w-full {
width: 100%;
}
-.gl-p-2 {
- padding: 0.25rem;
-}
.gl-p-4 {
padding: 0.75rem;
}
.gl-mt-2 {
margin-top: 0.25rem;
}
-.gl-mb-2 {
- margin-bottom: 0.25rem;
-}
.gl-mb-3 {
margin-bottom: 0.5rem;
}
@@ -797,8 +781,8 @@ svg {
margin-top: 0;
}
}
-.gl-text-left {
- text-align: left;
+.gl-font-weight-bold {
+ font-weight: 600;
}
@import "startup/cloaking";
diff --git a/app/assets/stylesheets/themes/_dark.scss b/app/assets/stylesheets/themes/_dark.scss
index f12b2ee2591..c79816e3579 100644
--- a/app/assets/stylesheets/themes/_dark.scss
+++ b/app/assets/stylesheets/themes/_dark.scss
@@ -202,7 +202,8 @@ body.gl-dark {
&.btn-info,
&.btn-success,
&.btn-danger,
- &.btn-warning {
+ &.btn-warning,
+ &.btn-confirm {
&-tertiary {
mix-blend-mode: screen;
}
@@ -256,53 +257,3 @@ $line-removed-dark: $red-200;
$well-expand-item: $gray-200;
$well-inner-border: $gray-200;
-
-// Misc component overrides that should live elsewhere
-.gl-label {
- filter: brightness(0.9) contrast(1.1);
-
- // This applies to the gl-label markups
- // rendered and cached in the backend (labels_helper.rb)
- &.gl-label-scoped {
- .gl-label-text-scoped,
- .gl-label-close {
- color: $gray-900;
- }
- }
-}
-
-// white-ish text for light labels
-.gl-label-text-light.gl-label-text-light {
- color: $gray-900;
-}
-
-.gl-label-text-dark.gl-label-text-dark {
- color: $gray-10;
-}
-
-// This applies to "gl-labels" from "gitlab-ui"
-.gl-label.gl-label-scoped.gl-label-text-dark,
-.gl-label.gl-label-scoped.gl-label-text-light {
- .gl-label-text-scoped,
- .gl-label-close {
- color: $gray-900;
- }
-}
-
-// duplicated class as the original .atwho-view style is added later
-.atwho-view.atwho-view {
- background-color: $white;
- color: $gray-900;
- border-color: $gray-800;
-}
-
-.nav-sidebar {
- li.active {
- box-shadow: none;
- }
-
- .sidebar-sub-level-items.fly-out-list {
- box-shadow: none;
- border: 1px solid $border-color;
- }
-}
diff --git a/app/assets/stylesheets/themes/dark_mode_overrides.scss b/app/assets/stylesheets/themes/dark_mode_overrides.scss
new file mode 100644
index 00000000000..b77048174c9
--- /dev/null
+++ b/app/assets/stylesheets/themes/dark_mode_overrides.scss
@@ -0,0 +1,116 @@
+@import './themes/dark';
+@import 'page_bundles/mixins_and_variables_and_functions';
+@import './themes/theme_helper';
+
+// Some hacks and overrides for things that don't properly support dark mode
+.gl-label {
+ filter: brightness(0.9) contrast(1.1);
+
+ // This applies to the gl-label markups
+ // rendered and cached in the backend (labels_helper.rb)
+ &.gl-label-scoped {
+ .gl-label-text-scoped,
+ .gl-label-close {
+ color: $gray-900;
+ }
+ }
+}
+
+// white-ish text for light labels
+.gl-label-text-light.gl-label-text-light {
+ color: $gray-900;
+}
+
+.gl-label-text-dark.gl-label-text-dark {
+ color: $gray-10;
+}
+
+// This applies to "gl-labels" from "gitlab-ui"
+.gl-label.gl-label-scoped.gl-label-text-dark,
+.gl-label.gl-label-scoped.gl-label-text-light {
+ .gl-label-text-scoped,
+ .gl-label-close {
+ color: $gray-900;
+ }
+}
+
+// duplicated class as the original .atwho-view style is added later
+.atwho-view.atwho-view {
+ background-color: $white;
+ color: $gray-900;
+ border-color: $gray-800;
+}
+
+.nav-sidebar {
+ li.active {
+ box-shadow: none;
+ }
+
+ .sidebar-sub-level-items.fly-out-list {
+ box-shadow: none;
+ border: 1px solid $border-color;
+ }
+}
+
+body.gl-dark {
+ @include gitlab-theme($gray-900, $gray-400, $gray-500, $gray-800, $gray-900, $white);
+
+ .logo-text svg {
+ fill: var(--gl-text-color);
+ }
+
+ .navbar-gitlab {
+ background-color: var(--gray-50);
+ box-shadow: 0 1px 0 0 var(--gray-100);
+
+ .navbar-sub-nav,
+ .navbar-nav {
+ li {
+ > a:hover,
+ > a:focus,
+ > button:hover,
+ > button:focus {
+ color: var(--gl-text-color);
+ background-color: var(--gray-200);
+ }
+ }
+
+ li.active,
+ li.dropdown.show {
+ > a,
+ > button {
+ color: var(--gl-text-color);
+ background-color: var(--gray-200);
+ }
+ }
+ }
+
+ .header-search {
+ background-color: var(--gray-100) !important;
+ box-shadow: inset 0 0 0 1px var(--border-color) !important;
+
+ &:active,
+ &:hover {
+ background-color: var(--gray-100) !important;
+ box-shadow: inset 0 0 0 1px var(--blue-200) !important;
+ }
+ }
+
+ .search {
+ form {
+ background-color: var(--gray-100);
+ box-shadow: inset 0 0 0 1px var(--border-color);
+
+ &:active,
+ &:hover {
+ background-color: var(--gray-100);
+ box-shadow: inset 0 0 0 1px var(--blue-200);
+ }
+ }
+ }
+ }
+
+ .md :not(pre.code) > code {
+ background-color: $gray-200;
+ }
+}
diff --git a/app/assets/stylesheets/themes/theme_helper.scss b/app/assets/stylesheets/themes/theme_helper.scss
index a9e8b238d78..1332686a906 100644
--- a/app/assets/stylesheets/themes/theme_helper.scss
+++ b/app/assets/stylesheets/themes/theme_helper.scss
@@ -212,8 +212,8 @@
a:hover,
&.active a,
.fly-out-top-item-container {
- background-color: var(--purple-100, $purple-900);
- color: var(--black, $white);
+ background-color: var(--gray-100, $gray-50);
+ color: var(--gray-900, $gray-900);
}
}
}
diff --git a/app/controllers/admin/dashboard_controller.rb b/app/controllers/admin/dashboard_controller.rb
index ba24e3e619b..d12ccfc7423 100644
--- a/app/controllers/admin/dashboard_controller.rb
+++ b/app/controllers/admin/dashboard_controller.rb
@@ -15,7 +15,14 @@ class Admin::DashboardController < Admin::ApplicationController
@groups = Group.order_id_desc.with_route.limit(10)
@notices = Gitlab::ConfigChecker::PumaRuggedChecker.check
@notices += Gitlab::ConfigChecker::ExternalDatabaseChecker.check
- @redis_versions = [Gitlab::Redis::Queues, Gitlab::Redis::SharedState, Gitlab::Redis::Cache, Gitlab::Redis::TraceChunks].map(&:version).uniq
+ @redis_versions = [
+ Gitlab::Redis::Queues,
+ Gitlab::Redis::SharedState,
+ Gitlab::Redis::Cache,
+ Gitlab::Redis::TraceChunks,
+ Gitlab::Redis::RateLimiting,
+ Gitlab::Redis::Sessions
+ ].map(&:version).uniq
end
# rubocop: enable CodeReuse/ActiveRecord
diff --git a/app/controllers/admin/instance_review_controller.rb b/app/controllers/admin/instance_review_controller.rb
index 88ca2c88aab..5567ffbdc84 100644
--- a/app/controllers/admin/instance_review_controller.rb
+++ b/app/controllers/admin/instance_review_controller.rb
@@ -3,7 +3,7 @@ class Admin::InstanceReviewController < Admin::ApplicationController
feature_category :devops_reports
def index
- redirect_to("#{::Gitlab::SubscriptionPortal::SUBSCRIPTIONS_URL}/instance_review?#{instance_review_params}")
+ redirect_to("#{Gitlab::SubscriptionPortal.subscriptions_instance_review_url}?#{instance_review_params}")
end
def instance_review_params
diff --git a/app/controllers/admin/serverless/domains_controller.rb b/app/controllers/admin/serverless/domains_controller.rb
deleted file mode 100644
index 49cd9f7a36d..00000000000
--- a/app/controllers/admin/serverless/domains_controller.rb
+++ /dev/null
@@ -1,78 +0,0 @@
-# frozen_string_literal: true
-
-class Admin::Serverless::DomainsController < Admin::ApplicationController
- before_action :check_feature_flag
- before_action :domain, only: [:update, :verify, :destroy]
-
- feature_category :serverless
-
- def index
- @domain = PagesDomain.instance_serverless.first_or_initialize
- end
-
- def create
- if PagesDomain.instance_serverless.exists?
- return redirect_to admin_serverless_domains_path, notice: _('An instance-level serverless domain already exists.')
- end
-
- @domain = PagesDomain.instance_serverless.create(create_params)
-
- if @domain.persisted?
- redirect_to admin_serverless_domains_path, notice: _('Domain was successfully created.')
- else
- render 'index'
- end
- end
-
- def update
- if domain.update(update_params)
- redirect_to admin_serverless_domains_path, notice: _('Domain was successfully updated.')
- else
- render 'index'
- end
- end
-
- def destroy
- if domain.serverless_domain_clusters.exists?
- return redirect_to admin_serverless_domains_path,
- status: :conflict,
- notice: _('Domain cannot be deleted while associated to one or more clusters.')
- end
-
- domain.destroy!
-
- redirect_to admin_serverless_domains_path,
- status: :found,
- notice: _('Domain was successfully deleted.')
- end
-
- def verify
- result = VerifyPagesDomainService.new(domain).execute
-
- if result[:status] == :success
- flash[:notice] = _('Successfully verified domain ownership')
- else
- flash[:alert] = _('Failed to verify domain ownership')
- end
-
- redirect_to admin_serverless_domains_path
- end
-
- private
-
- def domain
- @domain = PagesDomain.instance_serverless.find(params[:id])
- end
-
- def check_feature_flag
- render_404 unless Feature.enabled?(:serverless_domain)
- end
-
- def update_params
- params.require(:pages_domain).permit(:user_provided_certificate, :user_provided_key)
- end
-
- def create_params
- params.require(:pages_domain).permit(:domain, :user_provided_certificate, :user_provided_key)
- end
-end
diff --git a/app/controllers/admin/topics/avatars_controller.rb b/app/controllers/admin/topics/avatars_controller.rb
new file mode 100644
index 00000000000..7acdec424b4
--- /dev/null
+++ b/app/controllers/admin/topics/avatars_controller.rb
@@ -0,0 +1,14 @@
+# frozen_string_literal: true
+
+class Admin::Topics::AvatarsController < Admin::ApplicationController
+ feature_category :projects
+
+ def destroy
+ @topic = Projects::Topic.find(params[:topic_id])
+
+ @topic.remove_avatar!
+ @topic.save
+
+ redirect_to edit_admin_topic_path(@topic), status: :found
+ end
+end
diff --git a/app/controllers/admin/topics_controller.rb b/app/controllers/admin/topics_controller.rb
new file mode 100644
index 00000000000..ccc38ba7cd5
--- /dev/null
+++ b/app/controllers/admin/topics_controller.rb
@@ -0,0 +1,57 @@
+# frozen_string_literal: true
+
+class Admin::TopicsController < Admin::ApplicationController
+ include SendFileUpload
+ include PreviewMarkdown
+
+ before_action :topic, only: [:edit, :update]
+
+ feature_category :projects
+
+ def index
+ @topics = Projects::TopicsFinder.new(params: params.permit(:search)).execute.page(params[:page]).without_count
+ end
+
+ def new
+ @topic = Projects::Topic.new
+ end
+
+ def edit
+ end
+
+ def create
+ @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 }
+ else
+ render "new"
+ end
+ end
+
+ def update
+ if @topic.update(topic_params)
+ redirect_to edit_admin_topic_path(@topic), notice: _('Topic was successfully updated.')
+ else
+ render "edit"
+ end
+ end
+
+ private
+
+ def topic
+ @topic ||= Projects::Topic.find(params[:id])
+ end
+
+ def topic_params
+ params.require(:projects_topic).permit(allowed_topic_params)
+ end
+
+ def allowed_topic_params
+ [
+ :avatar,
+ :description,
+ :name
+ ]
+ end
+end
diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb
index a83458f3260..b22167a3952 100644
--- a/app/controllers/application_controller.rb
+++ b/app/controllers/application_controller.rb
@@ -21,7 +21,7 @@ class ApplicationController < ActionController::Base
include Impersonation
include Gitlab::Logging::CloudflareHelper
include Gitlab::Utils::StrongMemoize
- include ::Gitlab::WithFeatureCategory
+ include ::Gitlab::EndpointAttributes
include FlocOptOut
before_action :authenticate_user!, except: [:route_not_found]
@@ -70,6 +70,10 @@ class ApplicationController < ActionController::Base
# concerns due to caching private data.
DEFAULT_GITLAB_CACHE_CONTROL = "#{ActionDispatch::Http::Cache::Response::DEFAULT_CACHE_CONTROL}, no-store"
+ def self.endpoint_id_for_action(action_name)
+ "#{self.name}##{action_name}"
+ end
+
rescue_from Encoding::CompatibilityError do |exception|
log_exception(exception)
render "errors/encoding", layout: "errors", status: :internal_server_error
@@ -104,6 +108,12 @@ class ApplicationController < ActionController::Base
head :forbidden, retry_after: Gitlab::Auth::UniqueIpsLimiter.config.unique_ips_limit_time_window
end
+ rescue_from RateLimitedService::RateLimitedError do |e|
+ e.log_request(request, current_user)
+ response.headers.merge!(e.headers)
+ render plain: e.message, status: :too_many_requests
+ end
+
def redirect_back_or_default(default: root_path, options: {})
redirect_back(fallback_location: default, **options)
end
@@ -131,6 +141,14 @@ class ApplicationController < ActionController::Base
end
end
+ def feature_category
+ self.class.feature_category_for_action(action_name).to_s
+ end
+
+ def urgency
+ self.class.urgency_for_action(action_name)
+ end
+
protected
def workhorse_excluded_content_types
@@ -457,7 +475,7 @@ class ApplicationController < ActionController::Base
user: -> { context_user },
project: -> { @project if @project&.persisted? },
namespace: -> { @group if @group&.persisted? },
- caller_id: caller_id,
+ caller_id: self.class.endpoint_id_for_action(action_name),
remote_ip: request.ip,
feature_category: feature_category
)
@@ -543,14 +561,6 @@ class ApplicationController < ActionController::Base
auth_user if strong_memoized?(:auth_user)
end
- def caller_id
- "#{self.class.name}##{action_name}"
- end
-
- def feature_category
- self.class.feature_category_for_action(action_name).to_s
- end
-
def required_signup_info
return unless current_user
return unless current_user.role_required?
diff --git a/app/controllers/concerns/group_tree.rb b/app/controllers/concerns/group_tree.rb
index d076c62c707..35c1f358a77 100644
--- a/app/controllers/concerns/group_tree.rb
+++ b/app/controllers/concerns/group_tree.rb
@@ -38,8 +38,13 @@ module GroupTree
#
# Pagination needs to be applied before loading the ancestors to
# make sure ancestors are not cut off by pagination.
- Gitlab::ObjectHierarchy.new(Group.where(id: filtered_groups.select(:id)))
- .base_and_ancestors
+ filtered_groups_relation = Group.where(id: filtered_groups.select(:id))
+
+ if Feature.enabled?(:linear_group_tree_ancestor_scopes, current_user, default_enabled: :yaml)
+ filtered_groups_relation.self_and_ancestors
+ else
+ Gitlab::ObjectHierarchy.new(filtered_groups_relation).base_and_ancestors
+ end
end
# rubocop: enable CodeReuse/ActiveRecord
end
diff --git a/app/controllers/concerns/issuable_actions.rb b/app/controllers/concerns/issuable_actions.rb
index 7ee680db7f9..e1e662a1968 100644
--- a/app/controllers/concerns/issuable_actions.rb
+++ b/app/controllers/concerns/issuable_actions.rb
@@ -158,8 +158,10 @@ module IssuableActions
discussions = Discussion.build_collection(notes, issuable)
- if issuable.is_a?(MergeRequest) && Feature.enabled?(:merge_request_discussion_cache, issuable.target_project, default_enabled: :yaml)
- render_cached(discussions, with: discussion_serializer, context: self)
+ if issuable.is_a?(MergeRequest)
+ cache_context = [current_user&.cache_key, project.team.human_max_access(current_user&.id)].join(':')
+
+ render_cached(discussions, with: discussion_serializer, cache_context: -> (_) { cache_context }, context: self)
else
render json: discussion_serializer.represent(discussions, context: self)
end
diff --git a/app/controllers/concerns/notes_actions.rb b/app/controllers/concerns/notes_actions.rb
index 2d8168af2e3..c2ee735a2b5 100644
--- a/app/controllers/concerns/notes_actions.rb
+++ b/app/controllers/concerns/notes_actions.rb
@@ -62,7 +62,7 @@ module NotesActions
json.merge!(note_json(@note))
end
- if @note.errors.present? && @note.errors.keys != [:commands_only]
+ if @note.errors.present? && @note.errors.attribute_names != [:commands_only]
render json: json, status: :unprocessable_entity
else
render json: json
diff --git a/app/controllers/concerns/one_trust_csp.rb b/app/controllers/concerns/one_trust_csp.rb
new file mode 100644
index 00000000000..4e98ec586ca
--- /dev/null
+++ b/app/controllers/concerns/one_trust_csp.rb
@@ -0,0 +1,19 @@
+# frozen_string_literal: true
+
+module OneTrustCSP
+ extend ActiveSupport::Concern
+
+ included do
+ content_security_policy do |policy|
+ next if policy.directives.blank?
+
+ default_script_src = policy.directives['script-src'] || policy.directives['default-src']
+ script_src_values = Array.wrap(default_script_src) | ["'unsafe-eval'", 'https://cdn.cookielaw.org https://*.onetrust.com']
+ policy.script_src(*script_src_values)
+
+ default_connect_src = policy.directives['connect-src'] || policy.directives['default-src']
+ connect_src_values = Array.wrap(default_connect_src) | ['https://cdn.cookielaw.org']
+ policy.connect_src(*connect_src_values)
+ end
+ end
+end
diff --git a/app/controllers/concerns/registry/connection_errors_handler.rb b/app/controllers/concerns/registry/connection_errors_handler.rb
new file mode 100644
index 00000000000..2b24f3b5b31
--- /dev/null
+++ b/app/controllers/concerns/registry/connection_errors_handler.rb
@@ -0,0 +1,38 @@
+# frozen_string_literal: true
+
+module Registry
+ module ConnectionErrorsHandler
+ extend ActiveSupport::Concern
+
+ included do
+ rescue_from ContainerRegistry::Path::InvalidRegistryPathError, with: :invalid_registry_path
+ rescue_from Faraday::Error, with: :connection_error
+
+ before_action :ping_container_registry
+ end
+
+ private
+
+ # rubocop:disable Gitlab/ModuleWithInstanceVariables
+ # These instance variables are only read by a view helper to pass
+ # them to the frontend
+ # See app/views/projects/registry/repositories/index.html.haml
+ # app/views/groups/registry/repositories/index.html.haml
+ def invalid_registry_path
+ @invalid_path_error = true
+
+ render :index
+ end
+
+ def connection_error
+ @connection_error = true
+
+ render :index
+ end
+ # rubocop:enable Gitlab/ModuleWithInstanceVariables
+
+ def ping_container_registry
+ ContainerRegistry::Client.registry_info
+ end
+ end
+end
diff --git a/app/controllers/dashboard/projects_controller.rb b/app/controllers/dashboard/projects_controller.rb
index 74ad78ff4c1..d861ef646f8 100644
--- a/app/controllers/dashboard/projects_controller.rb
+++ b/app/controllers/dashboard/projects_controller.rb
@@ -36,7 +36,7 @@ class Dashboard::ProjectsController < Dashboard::ApplicationController
# rubocop: disable CodeReuse/ActiveRecord
def starred
@projects = load_projects(params.merge(starred: true))
- .includes(:forked_from_project, :topics, :topics_acts_as_taggable)
+ .includes(:forked_from_project, :topics)
@groups = []
diff --git a/app/controllers/graphql_controller.rb b/app/controllers/graphql_controller.rb
index 515fbd7b482..0722a712b5c 100644
--- a/app/controllers/graphql_controller.rb
+++ b/app/controllers/graphql_controller.rb
@@ -1,6 +1,8 @@
# frozen_string_literal: true
class GraphqlController < ApplicationController
+ extend ::Gitlab::Utils::Override
+
# Unauthenticated users have access to the API for public data
skip_before_action :authenticate_user!
@@ -35,6 +37,7 @@ class GraphqlController < ApplicationController
# callback execution order here
around_action :sessionless_bypass_admin_mode!, if: :sessionless_user?
+ # The default feature category is overridden to read from request
feature_category :not_owned
def execute
@@ -64,6 +67,11 @@ class GraphqlController < ApplicationController
render_error(exception.message, status: :unprocessable_entity)
end
+ override :feature_category
+ def feature_category
+ ::Gitlab::FeatureCategories.default.from_request(request) || super
+ end
+
private
def disallow_mutations_for_get
diff --git a/app/controllers/groups/boards_controller.rb b/app/controllers/groups/boards_controller.rb
index 60708c13b85..e8e6a7e5c1a 100644
--- a/app/controllers/groups/boards_controller.rb
+++ b/app/controllers/groups/boards_controller.rb
@@ -11,6 +11,7 @@ class Groups::BoardsController < Groups::ApplicationController
push_frontend_feature_flag(:board_multi_select, group, default_enabled: :yaml)
push_frontend_feature_flag(:swimlanes_buffered_rendering, group, default_enabled: :yaml)
push_frontend_feature_flag(:iteration_cadences, group, default_enabled: :yaml)
+ push_frontend_feature_flag(:labels_widget, group, default_enabled: :yaml)
end
feature_category :boards
diff --git a/app/controllers/groups/dependency_proxy/application_controller.rb b/app/controllers/groups/dependency_proxy/application_controller.rb
index fd9db41f748..18a6ff93e15 100644
--- a/app/controllers/groups/dependency_proxy/application_controller.rb
+++ b/app/controllers/groups/dependency_proxy/application_controller.rb
@@ -21,8 +21,14 @@ module Groups
authenticate_with_http_token do |token, _|
@authentication_result = EMPTY_AUTH_RESULT
- found_user = user_from_token(token)
- sign_in(found_user) if found_user.is_a?(User)
+ user_or_deploy_token = ::DependencyProxy::AuthTokenService.user_or_deploy_token_from_jwt(token)
+
+ if user_or_deploy_token.is_a?(User)
+ @authentication_result = Gitlab::Auth::Result.new(user_or_deploy_token, nil, :user, [])
+ sign_in(user_or_deploy_token)
+ elsif user_or_deploy_token.is_a?(DeployToken)
+ @authentication_result = Gitlab::Auth::Result.new(user_or_deploy_token, nil, :deploy_token, [])
+ end
end
request_bearer_token! unless authenticated_user
@@ -39,28 +45,6 @@ module Groups
response.headers['WWW-Authenticate'] = ::DependencyProxy::Registry.authenticate_header
render plain: '', status: :unauthorized
end
-
- def user_from_token(token)
- token_payload = ::DependencyProxy::AuthTokenService.decoded_token_payload(token)
-
- if token_payload['user_id']
- token_user = User.find(token_payload['user_id'])
- return unless token_user
-
- @authentication_result = Gitlab::Auth::Result.new(token_user, nil, :user, [])
- return token_user
- elsif token_payload['deploy_token']
- deploy_token = DeployToken.active.find_by_token(token_payload['deploy_token'])
- return unless deploy_token
-
- @authentication_result = Gitlab::Auth::Result.new(deploy_token, nil, :deploy_token, [])
- return deploy_token
- end
-
- nil
- rescue JWT::DecodeError, JWT::ExpiredSignature, JWT::ImmatureSignature
- nil
- end
end
end
end
diff --git a/app/controllers/groups/dependency_proxy_for_containers_controller.rb b/app/controllers/groups/dependency_proxy_for_containers_controller.rb
index f7dc552bd3e..e19b8ae35f8 100644
--- a/app/controllers/groups/dependency_proxy_for_containers_controller.rb
+++ b/app/controllers/groups/dependency_proxy_for_containers_controller.rb
@@ -5,11 +5,15 @@ class Groups::DependencyProxyForContainersController < ::Groups::DependencyProxy
include DependencyProxy::GroupAccess
include SendFileUpload
include ::PackagesHelper # for event tracking
+ include WorkhorseRequest
before_action :ensure_group
- before_action :ensure_token_granted!
+ before_action :ensure_token_granted!, only: [:blob, :manifest]
before_action :ensure_feature_enabled!
+ before_action :verify_workhorse_api!, only: [:authorize_upload_blob, :upload_blob]
+ skip_before_action :verify_authenticity_token, only: [:authorize_upload_blob, :upload_blob]
+
attr_reader :token
feature_category :dependency_proxy
@@ -38,6 +42,8 @@ class Groups::DependencyProxyForContainersController < ::Groups::DependencyProxy
end
def blob
+ return blob_via_workhorse if Feature.enabled?(:dependency_proxy_workhorse, group, default_enabled: :yaml)
+
result = DependencyProxy::FindOrCreateBlobService
.new(group, image, token, params[:sha]).execute
@@ -50,11 +56,47 @@ class Groups::DependencyProxyForContainersController < ::Groups::DependencyProxy
end
end
+ def authorize_upload_blob
+ set_workhorse_internal_api_content_type
+
+ render json: DependencyProxy::FileUploader.workhorse_authorize(has_length: false)
+ end
+
+ def upload_blob
+ @group.dependency_proxy_blobs.create!(
+ file_name: blob_file_name,
+ file: params[:file],
+ size: params[:file].size
+ )
+
+ event_name = tracking_event_name(object_type: :blob, from_cache: false)
+ track_package_event(event_name, :dependency_proxy, namespace: group, user: auth_user)
+
+ head :ok
+ end
+
private
+ def blob_via_workhorse
+ blob = @group.dependency_proxy_blobs.find_by_file_name(blob_file_name)
+
+ if blob.present?
+ event_name = tracking_event_name(object_type: :blob, from_cache: true)
+ track_package_event(event_name, :dependency_proxy, namespace: group, user: auth_user)
+
+ send_upload(blob.file)
+ else
+ send_dependency(token, DependencyProxy::Registry.blob_url(image, params[:sha]), blob_file_name)
+ end
+ end
+
+ def blob_file_name
+ @blob_file_name ||= params[:sha].sub('sha256:', '') + '.gz'
+ end
+
def group
strong_memoize(:group) do
- Group.find_by_full_path(params[:group_id], follow_redirects: request.get?)
+ Group.find_by_full_path(params[:group_id], follow_redirects: true)
end
end
diff --git a/app/controllers/groups/group_members_controller.rb b/app/controllers/groups/group_members_controller.rb
index 9b8d5cfe476..6e59f159636 100644
--- a/app/controllers/groups/group_members_controller.rb
+++ b/app/controllers/groups/group_members_controller.rb
@@ -25,19 +25,15 @@ class Groups::GroupMembersController < Groups::ApplicationController
def index
@sort = params[:sort].presence || sort_value_name
- @members = GroupMembersFinder
- .new(@group, current_user, params: filter_params)
- .execute(include_relations: requested_relations)
-
if can?(current_user, :admin_group_member, @group)
@skip_groups = @group.related_group_ids
- @invited_members = @members.invite
+ @invited_members = invited_members
@invited_members = @invited_members.search_invite_email(params[:search_invited]) if params[:search_invited].present?
@invited_members = present_invited_members(@invited_members)
end
- @members = present_group_members(@members.non_invite)
+ @members = present_group_members(non_invited_members)
@requesters = present_members(
AccessRequestsFinder.new(@group).execute(current_user)
@@ -51,6 +47,20 @@ class Groups::GroupMembersController < Groups::ApplicationController
private
+ def group_members
+ @group_members ||= GroupMembersFinder
+ .new(@group, current_user, params: filter_params)
+ .execute(include_relations: requested_relations)
+ end
+
+ def invited_members
+ group_members.invite.with_invited_user_state
+ end
+
+ def non_invited_members
+ group_members.non_invite
+ end
+
def present_invited_members(invited_members)
present_members(invited_members
.page(params[:invited_members_page])
diff --git a/app/controllers/groups/packages_controller.rb b/app/controllers/groups/packages_controller.rb
index 47f1816cc4c..d02a8262948 100644
--- a/app/controllers/groups/packages_controller.rb
+++ b/app/controllers/groups/packages_controller.rb
@@ -6,6 +6,10 @@ module Groups
feature_category :package_registry
+ before_action do
+ push_frontend_feature_flag(:package_list_apollo, default_enabled: :yaml)
+ end
+
private
def verify_packages_enabled!
diff --git a/app/controllers/groups/registry/repositories_controller.rb b/app/controllers/groups/registry/repositories_controller.rb
index 3aaaf6ade6b..549a148bfb8 100644
--- a/app/controllers/groups/registry/repositories_controller.rb
+++ b/app/controllers/groups/registry/repositories_controller.rb
@@ -3,6 +3,7 @@ module Groups
module Registry
class RepositoriesController < Groups::ApplicationController
include PackagesHelper
+ include ::Registry::ConnectionErrorsHandler
before_action :verify_container_registry_enabled!
before_action :authorize_read_container_image!
diff --git a/app/controllers/groups/runners_controller.rb b/app/controllers/groups/runners_controller.rb
index f37c08da22a..5c21c7b023c 100644
--- a/app/controllers/groups/runners_controller.rb
+++ b/app/controllers/groups/runners_controller.rb
@@ -10,8 +10,10 @@ class Groups::RunnersController < Groups::ApplicationController
feature_category :runner
def index
- finder = Ci::RunnersFinder.new(current_user: current_user, params: { group: @group })
- @group_runners_limited_count = finder.execute.except(:limit, :offset).page.total_count_with_limit(:all, limit: 1000)
+ ::Gitlab::Database.allow_cross_joins_across_databases(url: 'https://gitlab.com/gitlab-org/gitlab/-/issues/336433') do
+ finder = Ci::RunnersFinder.new(current_user: current_user, params: { group: @group })
+ @group_runners_limited_count = finder.execute.except(:limit, :offset).page.total_count_with_limit(:all, limit: 1000)
+ end
end
def runner_list_group_view_vue_ui_enabled
@@ -61,9 +63,11 @@ class Groups::RunnersController < Groups::ApplicationController
private
def runner
- @runner ||= Ci::RunnersFinder.new(current_user: current_user, params: { group: @group }).execute
- .except(:limit, :offset)
- .find(params[:id])
+ ::Gitlab::Database.allow_cross_joins_across_databases(url: 'https://gitlab.com/gitlab-org/gitlab/-/issues/336433') do
+ @runner ||= Ci::RunnersFinder.new(current_user: current_user, params: { group: @group }).execute
+ .except(:limit, :offset)
+ .find(params[:id])
+ end
end
def runner_params
diff --git a/app/controllers/groups/settings/ci_cd_controller.rb b/app/controllers/groups/settings/ci_cd_controller.rb
index a290ef9b5e7..e125385f841 100644
--- a/app/controllers/groups/settings/ci_cd_controller.rb
+++ b/app/controllers/groups/settings/ci_cd_controller.rb
@@ -23,6 +23,11 @@ module Groups
@group_runners = runners_finder.execute.page(params[:page]).per(NUMBER_OF_RUNNERS_PER_PAGE)
@sort = runners_finder.sort_key
+
+ # Allow sql generated by the two relations above, @all_group_runners and @group_runners
+ ::Gitlab::Database.allow_cross_joins_across_databases(url: 'https://gitlab.com/gitlab-org/gitlab/-/issues/336433') do
+ render
+ end
end
def update
diff --git a/app/controllers/health_controller.rb b/app/controllers/health_controller.rb
index 99b0b775217..071378f266e 100644
--- a/app/controllers/health_controller.rb
+++ b/app/controllers/health_controller.rb
@@ -16,6 +16,8 @@ class HealthController < ActionController::Base
Gitlab::HealthChecks::Redis::QueuesCheck,
Gitlab::HealthChecks::Redis::SharedStateCheck,
Gitlab::HealthChecks::Redis::TraceChunksCheck,
+ Gitlab::HealthChecks::Redis::RateLimitingCheck,
+ Gitlab::HealthChecks::Redis::SessionsCheck,
Gitlab::HealthChecks::GitalyCheck
].freeze
diff --git a/app/controllers/help_controller.rb b/app/controllers/help_controller.rb
index a1fb74cf277..0ad7478584f 100644
--- a/app/controllers/help_controller.rb
+++ b/app/controllers/help_controller.rb
@@ -72,7 +72,6 @@ class HelpController < ApplicationController
end
def redirect_to_documentation_website?
- return false unless Feature.enabled?(:help_page_documentation_redirect)
return false unless Gitlab::UrlSanitizer.valid_web?(documentation_url)
true
diff --git a/app/controllers/import/bulk_imports_controller.rb b/app/controllers/import/bulk_imports_controller.rb
index da936215ad4..bec26cb547d 100644
--- a/app/controllers/import/bulk_imports_controller.rb
+++ b/app/controllers/import/bulk_imports_controller.rb
@@ -22,13 +22,16 @@ class Import::BulkImportsController < ApplicationController
def status
respond_to do |format|
format.json do
- data = importable_data
+ data = ::BulkImports::GetImportableDataService.new(params, query_params, credentials).execute
pagination_headers.each do |header|
- response.set_header(header, data.headers[header])
+ response.set_header(header, data[:response].headers[header])
end
- render json: { importable_data: serialized_data(data.parsed_response) }
+ json_response = { importable_data: serialized_data(data[:response].parsed_response) }
+ json_response[:version_validation] = data[:version_validation]
+
+ render json: json_response
end
format.html do
@source_url = session[url_key]
@@ -37,7 +40,7 @@ class Import::BulkImportsController < ApplicationController
end
def create
- response = BulkImportService.new(current_user, create_params, credentials).execute
+ response = ::BulkImports::CreateService.new(current_user, create_params, credentials).execute
if response.success?
render json: response.payload.to_json(only: [:id])
@@ -66,10 +69,6 @@ class Import::BulkImportsController < ApplicationController
@serializer ||= BaseSerializer.new(current_user: current_user)
end
- def importable_data
- client.get('groups', query_params)
- end
-
# Default query string params used to fetch groups from GitLab source instance
#
# top_level_only: fetch only top level groups (subgroups are fetched during import itself)
@@ -85,15 +84,6 @@ class Import::BulkImportsController < ApplicationController
query_params
end
- def client
- @client ||= BulkImports::Clients::HTTP.new(
- url: session[url_key],
- token: session[access_token_key],
- per_page: params[:per_page],
- page: params[:page]
- )
- end
-
def configure_params
params.permit(access_token_key, url_key)
end
diff --git a/app/controllers/import/url_controller.rb b/app/controllers/import/url_controller.rb
new file mode 100644
index 00000000000..4e4b6ad125e
--- /dev/null
+++ b/app/controllers/import/url_controller.rb
@@ -0,0 +1,20 @@
+# frozen_string_literal: true
+
+class Import::UrlController < ApplicationController
+ feature_category :importers
+
+ def validate
+ result = Import::ValidateRemoteGitEndpointService.new(validate_params).execute
+ if result.success?
+ render json: { success: true }
+ else
+ render json: { success: false, message: result.message }
+ end
+ end
+
+ private
+
+ def validate_params
+ params.permit(:user, :password, :url)
+ end
+end
diff --git a/app/controllers/jira_connect/app_descriptor_controller.rb b/app/controllers/jira_connect/app_descriptor_controller.rb
index 74fac6ff9bb..e96242c7052 100644
--- a/app/controllers/jira_connect/app_descriptor_controller.rb
+++ b/app/controllers/jira_connect/app_descriptor_controller.rb
@@ -32,6 +32,7 @@ class JiraConnect::AppDescriptorController < JiraConnect::ApplicationController
apiVersion: 1,
apiMigrations: {
'context-qsh': true,
+ 'signed-install': signed_install_active?,
gdpr: true
}
}
diff --git a/app/controllers/jira_connect/application_controller.rb b/app/controllers/jira_connect/application_controller.rb
index 352e78d6255..ecb23c326fe 100644
--- a/app/controllers/jira_connect/application_controller.rb
+++ b/app/controllers/jira_connect/application_controller.rb
@@ -74,4 +74,8 @@ class JiraConnect::ApplicationController < ApplicationController
params[:jwt] || request.headers['Authorization']&.split(' ', 2)&.last
end
end
+
+ def signed_install_active?
+ Feature.enabled?(:jira_connect_asymmetric_jwt)
+ end
end
diff --git a/app/controllers/jira_connect/events_controller.rb b/app/controllers/jira_connect/events_controller.rb
index fe66e742c44..76ac15f7631 100644
--- a/app/controllers/jira_connect/events_controller.rb
+++ b/app/controllers/jira_connect/events_controller.rb
@@ -3,13 +3,18 @@
class JiraConnect::EventsController < JiraConnect::ApplicationController
# See https://developer.atlassian.com/cloud/jira/software/app-descriptor/#lifecycle
- skip_before_action :verify_atlassian_jwt!, only: :installed
- before_action :verify_qsh_claim!, only: :uninstalled
+ skip_before_action :verify_atlassian_jwt!
+ before_action :verify_asymmetric_atlassian_jwt!, if: :signed_install_active?
+
+ before_action :verify_atlassian_jwt!, only: :uninstalled, unless: :signed_install_active?
+ before_action :verify_qsh_claim!, only: :uninstalled, unless: :signed_install_active?
def installed
- return head :ok if atlassian_jwt_valid?
+ return head :ok if !signed_install_active? && atlassian_jwt_valid?
+
+ return head :ok if current_jira_installation
- installation = JiraConnectInstallation.new(install_params)
+ installation = JiraConnectInstallation.new(event_params)
if installation.save
head :ok
@@ -28,7 +33,23 @@ class JiraConnect::EventsController < JiraConnect::ApplicationController
private
- def install_params
+ def event_params
params.permit(:clientKey, :sharedSecret, :baseUrl).transform_keys(&:underscore)
end
+
+ def verify_asymmetric_atlassian_jwt!
+ asymmetric_jwt = Atlassian::JiraConnect::AsymmetricJwt.new(auth_token, jwt_verification_claims)
+
+ return head :unauthorized unless asymmetric_jwt.valid?
+
+ @current_jira_installation = JiraConnectInstallation.find_by_client_key(asymmetric_jwt.iss_claim)
+ end
+
+ def jwt_verification_claims
+ {
+ aud: jira_connect_base_url(protocol: 'https'),
+ iss: event_params[:client_key],
+ qsh: Atlassian::Jwt.create_query_string_hash(request.url, request.method, jira_connect_base_url)
+ }
+ end
end
diff --git a/app/controllers/metrics_controller.rb b/app/controllers/metrics_controller.rb
index a0c307a0a03..d3dea2ce159 100644
--- a/app/controllers/metrics_controller.rb
+++ b/app/controllers/metrics_controller.rb
@@ -7,6 +7,7 @@ class MetricsController < ActionController::Base
def index
response = if Gitlab::Metrics.prometheus_metrics_enabled?
+ Gitlab::Metrics::RailsSlis.initialize_request_slis_if_needed!
metrics_service.metrics_text
else
help_page = help_page_url('administration/monitoring/prometheus/gitlab_metrics',
diff --git a/app/controllers/profiles/passwords_controller.rb b/app/controllers/profiles/passwords_controller.rb
index c8c2dd1c7d6..5eb0f80ddc9 100644
--- a/app/controllers/profiles/passwords_controller.rb
+++ b/app/controllers/profiles/passwords_controller.rb
@@ -15,17 +15,11 @@ class Profiles::PasswordsController < Profiles::ApplicationController
end
def create
- unless @user.password_automatically_set || @user.valid_password?(user_params[:current_password])
+ unless @user.password_automatically_set || @user.valid_password?(user_params[:password])
redirect_to new_profile_password_path, alert: _('You must provide a valid current password')
return
end
- password_attributes = {
- password: user_params[:password],
- password_confirmation: user_params[:password_confirmation],
- password_automatically_set: false
- }
-
result = Users::UpdateService.new(current_user, password_attributes.merge(user: @user)).execute
if result[:status] == :success
@@ -41,12 +35,7 @@ class Profiles::PasswordsController < Profiles::ApplicationController
end
def update
- password_attributes = user_params.select do |key, value|
- %w(password password_confirmation).include?(key.to_s)
- end
- password_attributes[:password_automatically_set] = false
-
- unless @user.password_automatically_set || @user.valid_password?(user_params[:current_password])
+ unless @user.password_automatically_set || @user.valid_password?(user_params[:password])
handle_invalid_current_password_attempt!
redirect_to edit_profile_password_path, alert: _('You must provide a valid current password')
@@ -94,6 +83,14 @@ class Profiles::PasswordsController < Profiles::ApplicationController
end
def user_params
- params.require(:user).permit(:current_password, :password, :password_confirmation)
+ params.require(:user).permit(:password, :new_password, :password_confirmation)
+ end
+
+ def password_attributes
+ {
+ password: user_params[:new_password],
+ password_confirmation: user_params[:password_confirmation],
+ password_automatically_set: false
+ }
end
end
diff --git a/app/controllers/profiles/two_factor_auths_controller.rb b/app/controllers/profiles/two_factor_auths_controller.rb
index de22a0e47d5..e0b5d6be155 100644
--- a/app/controllers/profiles/two_factor_auths_controller.rb
+++ b/app/controllers/profiles/two_factor_auths_controller.rb
@@ -237,8 +237,6 @@ class Profiles::TwoFactorAuthsController < Profiles::ApplicationController
end
def ensure_verified_primary_email
- return unless Feature.enabled?(:ensure_verified_primary_email_for_2fa, default_enabled: :yaml)
-
unless current_user.two_factor_enabled? || current_user.primary_email_verified?
redirect_to profile_emails_path, notice: s_('You need to verify your primary email first before enabling Two-Factor Authentication.')
end
diff --git a/app/controllers/profiles_controller.rb b/app/controllers/profiles_controller.rb
index 29ae268ef67..69257081cc9 100644
--- a/app/controllers/profiles_controller.rb
+++ b/app/controllers/profiles_controller.rb
@@ -18,7 +18,7 @@ class ProfilesController < Profiles::ApplicationController
def update
respond_to do |format|
- result = Users::UpdateService.new(current_user, user_params.merge(user: @user)).execute
+ result = Users::UpdateService.new(current_user, user_params.merge(user: @user)).execute(check_password: true)
if result[:status] == :success
message = s_("Profiles|Profile was successfully updated")
@@ -129,6 +129,7 @@ class ProfilesController < Profiles::ApplicationController
:job_title,
:pronouns,
:pronunciation,
+ :validation_password,
status: [:emoji, :message, :availability]
]
end
diff --git a/app/controllers/projects/alerting/notifications_controller.rb b/app/controllers/projects/alerting/notifications_controller.rb
index db5d91308db..95b403faf55 100644
--- a/app/controllers/projects/alerting/notifications_controller.rb
+++ b/app/controllers/projects/alerting/notifications_controller.rb
@@ -3,6 +3,8 @@
module Projects
module Alerting
class NotificationsController < Projects::ApplicationController
+ include ActionController::HttpAuthentication::Basic
+
respond_to :json
skip_before_action :verify_authenticity_token
@@ -27,9 +29,19 @@ module Projects
end
def extract_alert_manager_token(request)
+ extract_bearer_token(request) || extract_basic_auth_token(request)
+ end
+
+ def extract_bearer_token(request)
Doorkeeper::OAuth::Token.from_bearer_authorization(request)
end
+ def extract_basic_auth_token(request)
+ _username, token = user_name_and_password(request)
+
+ token
+ end
+
def notify_service
notify_service_class.new(project, notification_payload)
end
diff --git a/app/controllers/projects/badges_controller.rb b/app/controllers/projects/badges_controller.rb
index f75ab5cdbf2..0cd59c136e5 100644
--- a/app/controllers/projects/badges_controller.rb
+++ b/app/controllers/projects/badges_controller.rb
@@ -24,7 +24,10 @@ class Projects::BadgesController < Projects::ApplicationController
.new(project, params[:ref], opts: {
job: params[:job],
key_text: params[:key_text],
- key_width: params[:key_width]
+ key_width: params[:key_width],
+ min_good: params[:min_good],
+ min_acceptable: params[:min_acceptable],
+ min_medium: params[:min_medium]
})
render_badge coverage_report
diff --git a/app/controllers/projects/blob_controller.rb b/app/controllers/projects/blob_controller.rb
index acf6b6116b8..17fd28ee06a 100644
--- a/app/controllers/projects/blob_controller.rb
+++ b/app/controllers/projects/blob_controller.rb
@@ -43,6 +43,7 @@ class Projects::BlobController < Projects::ApplicationController
before_action do
push_frontend_feature_flag(:refactor_blob_viewer, @project, default_enabled: :yaml)
+ push_frontend_feature_flag(:refactor_text_viewer, @project, default_enabled: :yaml)
push_frontend_feature_flag(:consolidated_edit_button, @project, default_enabled: :yaml)
push_licensed_feature(:file_locks) if @project.licensed_feature_available?(:file_locks)
end
diff --git a/app/controllers/projects/boards_controller.rb b/app/controllers/projects/boards_controller.rb
index 316582f3994..834e4baa7dd 100644
--- a/app/controllers/projects/boards_controller.rb
+++ b/app/controllers/projects/boards_controller.rb
@@ -11,6 +11,7 @@ class Projects::BoardsController < Projects::ApplicationController
push_frontend_feature_flag(:issue_boards_filtered_search, project, default_enabled: :yaml)
push_frontend_feature_flag(:board_multi_select, project, default_enabled: :yaml)
push_frontend_feature_flag(:iteration_cadences, project&.group, default_enabled: :yaml)
+ push_frontend_feature_flag(:labels_widget, project, default_enabled: :yaml)
end
feature_category :boards
diff --git a/app/controllers/projects/branches_controller.rb b/app/controllers/projects/branches_controller.rb
index 3be10559e80..b75effc52d1 100644
--- a/app/controllers/projects/branches_controller.rb
+++ b/app/controllers/projects/branches_controller.rb
@@ -33,6 +33,11 @@ class Projects::BranchesController < Projects::ApplicationController
Gitlab::GitalyClient.allow_n_plus_1_calls do
render
end
+ rescue Gitlab::Git::CommandError => e
+ Gitlab::ErrorTracking.track_exception(e)
+
+ @gitaly_unavailable = true
+ render
end
format.json do
branches = BranchesFinder.new(@repository, params).execute
diff --git a/app/controllers/projects/ci/daily_build_group_report_results_controller.rb b/app/controllers/projects/ci/daily_build_group_report_results_controller.rb
index fee216da492..b2b5e096105 100644
--- a/app/controllers/projects/ci/daily_build_group_report_results_controller.rb
+++ b/app/controllers/projects/ci/daily_build_group_report_results_controller.rb
@@ -4,7 +4,7 @@ class Projects::Ci::DailyBuildGroupReportResultsController < Projects::Applicati
before_action :authorize_read_build_report_results!
before_action :validate_param_type!
- feature_category :continuous_integration
+ feature_category :code_testing
def index
respond_to do |format|
diff --git a/app/controllers/projects/ci/pipeline_editor_controller.rb b/app/controllers/projects/ci/pipeline_editor_controller.rb
index 550877548e1..22cd247644d 100644
--- a/app/controllers/projects/ci/pipeline_editor_controller.rb
+++ b/app/controllers/projects/ci/pipeline_editor_controller.rb
@@ -3,8 +3,7 @@
class Projects::Ci::PipelineEditorController < Projects::ApplicationController
before_action :check_can_collaborate!
before_action do
- push_frontend_feature_flag(:pipeline_editor_empty_state_action, @project, default_enabled: :yaml)
- push_frontend_feature_flag(:pipeline_editor_drawer, @project, default_enabled: :yaml)
+ push_frontend_feature_flag(:pipeline_editor_mini_graph, @project, default_enabled: :yaml)
push_frontend_feature_flag(:schema_linting, @project, default_enabled: :yaml)
end
diff --git a/app/controllers/projects/cluster_agents_controller.rb b/app/controllers/projects/cluster_agents_controller.rb
new file mode 100644
index 00000000000..e7fbe93131d
--- /dev/null
+++ b/app/controllers/projects/cluster_agents_controller.rb
@@ -0,0 +1,19 @@
+# frozen_string_literal: true
+
+class Projects::ClusterAgentsController < Projects::ApplicationController
+ before_action :authorize_can_read_cluster_agent!
+
+ feature_category :kubernetes_management
+
+ def show
+ @agent_name = params[:name]
+ end
+
+ private
+
+ def authorize_can_read_cluster_agent!
+ return if can?(current_user, :admin_cluster, project)
+
+ access_denied!
+ end
+end
diff --git a/app/controllers/projects/google_cloud_controller.rb b/app/controllers/projects/google_cloud_controller.rb
new file mode 100644
index 00000000000..d185457aeb3
--- /dev/null
+++ b/app/controllers/projects/google_cloud_controller.rb
@@ -0,0 +1,16 @@
+# frozen_string_literal: true
+
+class Projects::GoogleCloudController < Projects::ApplicationController
+ before_action :authorize_can_manage_google_cloud_deployments!
+
+ feature_category :release_orchestration
+
+ def index
+ end
+
+ private
+
+ def authorize_can_manage_google_cloud_deployments!
+ access_denied! unless can?(current_user, :manage_project_google_cloud, project)
+ end
+end
diff --git a/app/controllers/projects/issues_controller.rb b/app/controllers/projects/issues_controller.rb
index f885ff9b45b..fd508d5f127 100644
--- a/app/controllers/projects/issues_controller.rb
+++ b/app/controllers/projects/issues_controller.rb
@@ -37,7 +37,7 @@ class Projects::IssuesController < Projects::ApplicationController
before_action :authorize_download_code!, only: [:related_branches]
# Limit the amount of issues created per minute
- before_action :create_rate_limit, only: [:create]
+ before_action :create_rate_limit, only: [:create], if: -> { Feature.disabled?('rate_limited_service_issues_create', project, default_enabled: :yaml) }
before_action do
push_frontend_feature_flag(:tribute_autocomplete, @project)
diff --git a/app/controllers/projects/jobs_controller.rb b/app/controllers/projects/jobs_controller.rb
index 778623a05c6..994be5c2b5c 100644
--- a/app/controllers/projects/jobs_controller.rb
+++ b/app/controllers/projects/jobs_controller.rb
@@ -44,7 +44,7 @@ class Projects::JobsController < Projects::ApplicationController
render json: BuildSerializer
.new(project: @project, current_user: @current_user)
- .represent(@build, {}, BuildDetailsEntity)
+ .represent(@build.present(current_user: current_user), {}, BuildDetailsEntity)
end
end
end
@@ -120,7 +120,7 @@ class Projects::JobsController < Projects::ApplicationController
def status
render json: BuildSerializer
.new(project: @project, current_user: @current_user)
- .represent_status(@build)
+ .represent_status(@build.present(current_user: current_user))
end
def erase
@@ -225,7 +225,6 @@ class Projects::JobsController < Projects::ApplicationController
def find_job_as_build
@build = project.builds.find(params[:id])
- .present(current_user: current_user)
end
def find_job_as_processable
diff --git a/app/controllers/projects/merge_requests_controller.rb b/app/controllers/projects/merge_requests_controller.rb
index cb68aaf4583..46df514abcb 100644
--- a/app/controllers/projects/merge_requests_controller.rb
+++ b/app/controllers/projects/merge_requests_controller.rb
@@ -37,10 +37,10 @@ class Projects::MergeRequestsController < Projects::MergeRequests::ApplicationCo
push_frontend_feature_flag(:core_security_mr_widget_counts, @project)
push_frontend_feature_flag(:paginated_notes, @project, default_enabled: :yaml)
push_frontend_feature_flag(:confidential_notes, @project, default_enabled: :yaml)
- push_frontend_feature_flag(:usage_data_i_testing_summary_widget_total, @project, default_enabled: :yaml)
push_frontend_feature_flag(:improved_emoji_picker, project, default_enabled: :yaml)
push_frontend_feature_flag(:diffs_virtual_scrolling, project, default_enabled: :yaml)
push_frontend_feature_flag(:restructured_mr_widget, project, default_enabled: :yaml)
+ push_frontend_feature_flag(:mr_changes_fluid_layout, project, default_enabled: :yaml)
# Usage data feature flags
push_frontend_feature_flag(:users_expanding_widgets_usage_data, @project, default_enabled: :yaml)
@@ -192,15 +192,17 @@ class Projects::MergeRequestsController < Projects::MergeRequests::ApplicationCo
Gitlab::PollingInterval.set_header(response, interval: 10_000)
- render json: {
- pipelines: PipelineSerializer
- .new(project: @project, current_user: @current_user)
- .with_pagination(request, response)
- .represent(@pipelines),
- count: {
- all: @pipelines.count
+ ::Gitlab::Database.allow_cross_joins_across_databases(url: 'https://gitlab.com/gitlab-org/gitlab/-/issues/336891') do
+ render json: {
+ pipelines: PipelineSerializer
+ .new(project: @project, current_user: @current_user)
+ .with_pagination(request, response)
+ .represent(@pipelines),
+ count: {
+ all: @pipelines.count
+ }
}
- }
+ end
end
def sast_reports
diff --git a/app/controllers/projects/packages/packages_controller.rb b/app/controllers/projects/packages/packages_controller.rb
index 5de71466c10..dd7c2ad3cbd 100644
--- a/app/controllers/projects/packages/packages_controller.rb
+++ b/app/controllers/projects/packages/packages_controller.rb
@@ -7,6 +7,10 @@ module Projects
feature_category :package_registry
+ before_action do
+ push_frontend_feature_flag(:package_list_apollo, default_enabled: :yaml)
+ end
+
def show
@package = project.packages.find(params[:id])
end
diff --git a/app/controllers/projects/project_members_controller.rb b/app/controllers/projects/project_members_controller.rb
index b979276437c..e8074f7d793 100644
--- a/app/controllers/projects/project_members_controller.rb
+++ b/app/controllers/projects/project_members_controller.rb
@@ -19,16 +19,12 @@ class Projects::ProjectMembersController < Projects::ApplicationController
@group_links = @project.project_group_links
@group_links = @group_links.search(params[:search_groups]) if params[:search_groups].present?
- project_members = MembersFinder
- .new(@project, current_user, params: filter_params)
- .execute(include_relations: requested_relations)
-
if can?(current_user, :admin_project_member, @project)
- @invited_members = present_members(project_members.invite)
+ @invited_members = present_members(invited_members)
@requesters = present_members(AccessRequestsFinder.new(@project).execute(current_user))
end
- @project_members = present_members(project_members.non_invite.page(params[:page]))
+ @project_members = present_members(non_invited_members.page(params[:page]))
@project_member = @project.project_members.new
end
@@ -55,6 +51,20 @@ class Projects::ProjectMembersController < Projects::ApplicationController
private
+ def members
+ @members ||= MembersFinder
+ .new(@project, current_user, params: filter_params)
+ .execute(include_relations: requested_relations)
+ end
+
+ def invited_members
+ members.invite.with_invited_user_state
+ end
+
+ def non_invited_members
+ members.non_invite
+ end
+
def filter_params
params.permit(:search).merge(sort: @sort)
end
diff --git a/app/controllers/projects/registry/repositories_controller.rb b/app/controllers/projects/registry/repositories_controller.rb
index 8acebd89033..ad3b2bc98e7 100644
--- a/app/controllers/projects/registry/repositories_controller.rb
+++ b/app/controllers/projects/registry/repositories_controller.rb
@@ -4,6 +4,7 @@ module Projects
module Registry
class RepositoriesController < ::Projects::Registry::ApplicationController
include PackagesHelper
+ include ::Registry::ConnectionErrorsHandler
before_action :authorize_update_container_image!, only: [:destroy]
@@ -48,8 +49,6 @@ module Projects
repository.save! if repository.has_tags?
end
end
- rescue ContainerRegistry::Path::InvalidRegistryPathError
- @character_error = true
end
end
end
diff --git a/app/controllers/projects/security/configuration_controller.rb b/app/controllers/projects/security/configuration_controller.rb
index 19de157357a..444f4783a19 100644
--- a/app/controllers/projects/security/configuration_controller.rb
+++ b/app/controllers/projects/security/configuration_controller.rb
@@ -5,7 +5,7 @@ module Projects
class ConfigurationController < Projects::ApplicationController
include SecurityAndCompliancePermissions
- feature_category :static_application_security_testing
+ feature_category :static_application_security_testing, [:show]
def show
render_403 unless can?(current_user, :read_security_configuration, project)
diff --git a/app/controllers/projects/serverless/functions_controller.rb b/app/controllers/projects/serverless/functions_controller.rb
index 4168880001c..3fc379a135a 100644
--- a/app/controllers/projects/serverless/functions_controller.rb
+++ b/app/controllers/projects/serverless/functions_controller.rb
@@ -5,7 +5,7 @@ module Projects
class FunctionsController < Projects::ApplicationController
before_action :authorize_read_cluster!
- feature_category :serverless
+ feature_category :not_owned
def index
respond_to do |format|
diff --git a/app/controllers/projects/settings/ci_cd_controller.rb b/app/controllers/projects/settings/ci_cd_controller.rb
index 960c0beb244..3033dac8246 100644
--- a/app/controllers/projects/settings/ci_cd_controller.rb
+++ b/app/controllers/projects/settings/ci_cd_controller.rb
@@ -25,6 +25,11 @@ module Projects
@project.triggers, current_user: current_user, project: @project
).to_json
end
+
+ # @assignable_runners is using ci_owned_runners
+ ::Gitlab::Database.allow_cross_joins_across_databases(url: 'https://gitlab.com/gitlab-org/gitlab/-/issues/336436') do
+ render
+ end
end
def update
diff --git a/app/controllers/projects/tags_controller.rb b/app/controllers/projects/tags_controller.rb
index 94b0473e1f3..02d36c3353d 100644
--- a/app/controllers/projects/tags_controller.rb
+++ b/app/controllers/projects/tags_controller.rb
@@ -18,17 +18,21 @@ class Projects::TagsController < Projects::ApplicationController
params[:sort] = params[:sort].presence || sort_value_recently_updated
@sort = params[:sort]
- @tags = TagsFinder.new(@repository, params).execute
- @tags = Kaminari.paginate_array(@tags).page(params[:page])
+ @tags, @tags_loading_error = TagsFinder.new(@repository, params).execute
+
+ @tags = Kaminari.paginate_array(@tags).page(params[:page])
tag_names = @tags.map(&:name)
@tags_pipelines = @project.ci_pipelines.latest_successful_for_refs(tag_names)
+
@releases = project.releases.where(tag: tag_names)
@tag_pipeline_statuses = Ci::CommitStatusesFinder.new(@project, @repository, current_user, @tags).execute
respond_to do |format|
- format.html
- format.atom { render layout: 'xml.atom' }
+ status = @tags_loading_error ? :service_unavailable : :ok
+
+ format.html { render status: status }
+ format.atom { render layout: 'xml.atom', status: status }
end
end
# rubocop: enable CodeReuse/ActiveRecord
diff --git a/app/controllers/projects/tree_controller.rb b/app/controllers/projects/tree_controller.rb
index 6fd4c632dd3..a76d45411dd 100644
--- a/app/controllers/projects/tree_controller.rb
+++ b/app/controllers/projects/tree_controller.rb
@@ -16,7 +16,9 @@ class Projects::TreeController < Projects::ApplicationController
before_action :authorize_edit_tree!, only: [:create_dir]
before_action do
+ push_frontend_feature_flag(:lazy_load_commits, @project, default_enabled: :yaml)
push_frontend_feature_flag(:paginated_tree_graphql_query, @project, default_enabled: :yaml)
+ push_frontend_feature_flag(:new_dir_modal, @project, default_enabled: :yaml)
end
feature_category :source_code_management
diff --git a/app/controllers/projects/usage_quotas_controller.rb b/app/controllers/projects/usage_quotas_controller.rb
index 179c7fc8db1..103e1cc596a 100644
--- a/app/controllers/projects/usage_quotas_controller.rb
+++ b/app/controllers/projects/usage_quotas_controller.rb
@@ -9,6 +9,7 @@ class Projects::UsageQuotasController < Projects::ApplicationController
feature_category :utilization
def index
+ @hide_search_settings = true
@storage_app_data = {
project_path: @project.full_path,
usage_quotas_help_page_path: help_page_path('user/usage_quotas'),
diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb
index de4e51a3a2f..26da0436dd8 100644
--- a/app/controllers/projects_controller.rb
+++ b/app/controllers/projects_controller.rb
@@ -33,9 +33,12 @@ class ProjectsController < Projects::ApplicationController
before_action :export_rate_limit, only: [:export, :download_export, :generate_new_export]
before_action do
+ push_frontend_feature_flag(:lazy_load_commits, @project, default_enabled: :yaml)
push_frontend_feature_flag(:refactor_blob_viewer, @project, default_enabled: :yaml)
+ push_frontend_feature_flag(:refactor_text_viewer, @project, default_enabled: :yaml)
push_frontend_feature_flag(:increase_page_size_exponentially, @project, default_enabled: :yaml)
push_frontend_feature_flag(:paginated_tree_graphql_query, @project, default_enabled: :yaml)
+ push_frontend_feature_flag(:new_dir_modal, @project, default_enabled: :yaml)
end
layout :determine_layout
@@ -72,6 +75,13 @@ class ProjectsController < Projects::ApplicationController
@project = ::Projects::CreateService.new(current_user, project_params(attributes: project_params_create_attributes)).execute
if @project.saved?
+ experiment(:new_project_sast_enabled, user: current_user).track(:created,
+ property: active_new_project_tab,
+ checked: Gitlab::Utils.to_boolean(project_params[:initialize_with_sast]),
+ project: @project,
+ namespace: @project.namespace
+ )
+
redirect_to(
project_path(@project, custom_import_params),
notice: _("Project '%{project_name}' was successfully created.") % { project_name: @project.name }
@@ -283,9 +293,9 @@ class ProjectsController < Projects::ApplicationController
end
if find_tags && @repository.tag_count.nonzero?
- tags = TagsFinder.new(@repository, params).execute.take(100).map(&:name)
+ tags, _ = TagsFinder.new(@repository, params).execute
- options['Tags'] = tags
+ options['Tags'] = tags.take(100).map(&:name)
end
# If reference is commit id - we should add it to branch/tag selectbox
@@ -435,6 +445,7 @@ class ProjectsController < Projects::ApplicationController
:template_name,
:template_project_id,
:merge_method,
+ :initialize_with_sast,
:initialize_with_readme,
:autoclose_referenced_issues,
:suggestion_commit_message,
diff --git a/app/controllers/registrations_controller.rb b/app/controllers/registrations_controller.rb
index fe800de5dd8..450c12a233b 100644
--- a/app/controllers/registrations_controller.rb
+++ b/app/controllers/registrations_controller.rb
@@ -5,6 +5,7 @@ class RegistrationsController < Devise::RegistrationsController
include AcceptsPendingInvitations
include RecaptchaHelper
include InvisibleCaptchaOnSignup
+ include OneTrustCSP
layout 'devise'
@@ -45,6 +46,11 @@ class RegistrationsController < Devise::RegistrationsController
end
def destroy
+ if current_user.required_terms_not_accepted?
+ redirect_to profile_account_path, status: :see_other, alert: s_('Profiles|You must accept the Terms of Service in order to perform this action.')
+ return
+ end
+
if destroy_confirmation_valid?
current_user.delete_async(deleted_by: current_user)
session.try(:destroy)
diff --git a/app/controllers/repositories/git_http_controller.rb b/app/controllers/repositories/git_http_controller.rb
index e51bfe6a37e..c3c6a51239d 100644
--- a/app/controllers/repositories/git_http_controller.rb
+++ b/app/controllers/repositories/git_http_controller.rb
@@ -11,6 +11,9 @@ module Repositories
rescue_from Gitlab::GitAccess::NotFoundError, with: :render_404_with_exception
rescue_from Gitlab::GitAccessProject::CreationError, with: :render_422_with_exception
rescue_from Gitlab::GitAccess::TimeoutError, with: :render_503_with_exception
+ rescue_from GRPC::Unavailable do |e|
+ render_503_with_exception(e, message: 'The git server, Gitaly, is not available at this time. Please contact your administrator.')
+ end
# GET /foo/bar.git/info/refs?service=git-upload-pack (git pull)
# GET /foo/bar.git/info/refs?service=git-receive-pack (git push)
@@ -71,8 +74,8 @@ module Repositories
render plain: exception.message, status: :unprocessable_entity
end
- def render_503_with_exception(exception)
- render plain: exception.message, status: :service_unavailable
+ def render_503_with_exception(exception, message: nil)
+ render plain: message || exception.message, status: :service_unavailable
end
def update_fetch_statistics
diff --git a/app/controllers/search_controller.rb b/app/controllers/search_controller.rb
index 5f1b3750e41..0a18559fc81 100644
--- a/app/controllers/search_controller.rb
+++ b/app/controllers/search_controller.rb
@@ -12,6 +12,7 @@ class SearchController < ApplicationController
around_action :allow_gitaly_ref_name_caching
before_action :block_anonymous_global_searches, :check_scope_global_search_enabled, except: :opensearch
+ before_action :strip_surrounding_whitespace_from_search, except: :opensearch
skip_before_action :authenticate_user!
requires_cross_project_access if: -> do
search_term_present = params[:search].present? || params[:term].present?
@@ -23,6 +24,7 @@ class SearchController < ApplicationController
layout 'search'
feature_category :global_search
+ urgency :high, [:opensearch]
def show
@project = search_service.project
@@ -196,6 +198,10 @@ class SearchController < ApplicationController
def count_action_name?
action_name.to_sym == :count
end
+
+ def strip_surrounding_whitespace_from_search
+ %i(term search).each { |param| params[param]&.strip! }
+ end
end
SearchController.prepend_mod_with('SearchController')
diff --git a/app/controllers/sessions_controller.rb b/app/controllers/sessions_controller.rb
index 4fcf82c605b..bbd7e5d5725 100644
--- a/app/controllers/sessions_controller.rb
+++ b/app/controllers/sessions_controller.rb
@@ -9,6 +9,7 @@ class SessionsController < Devise::SessionsController
include RendersLdapServers
include KnownSignIn
include Gitlab::Utils::StrongMemoize
+ include OneTrustCSP
skip_before_action :check_two_factor_requirement, only: [:destroy]
skip_before_action :check_password_expiration, only: [:destroy]
diff --git a/app/controllers/uploads_controller.rb b/app/controllers/uploads_controller.rb
index d040ac7f76c..d7eb3ccd274 100644
--- a/app/controllers/uploads_controller.rb
+++ b/app/controllers/uploads_controller.rb
@@ -13,6 +13,7 @@ class UploadsController < ApplicationController
"group" => Group,
"appearance" => Appearance,
"personal_snippet" => PersonalSnippet,
+ "projects/topic" => Projects::Topic,
nil => PersonalSnippet
}.freeze
@@ -54,6 +55,8 @@ class UploadsController < ApplicationController
!secret? || can?(current_user, :update_user, model)
when Appearance
true
+ when Projects::Topic
+ true
else
permission = "read_#{model.class.underscore}".to_sym
@@ -85,7 +88,7 @@ class UploadsController < ApplicationController
def cache_settings
case model
- when User, Appearance
+ when User, Appearance, Projects::Topic
[5.minutes, { public: true, must_revalidate: false }]
when Project, Group
[5.minutes, { private: true, must_revalidate: true }]
diff --git a/app/experiments/new_project_sast_enabled_experiment.rb b/app/experiments/new_project_sast_enabled_experiment.rb
new file mode 100644
index 00000000000..1ab86d70134
--- /dev/null
+++ b/app/experiments/new_project_sast_enabled_experiment.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+class NewProjectSastEnabledExperiment < ApplicationExperiment # rubocop:disable Gitlab/NamespacedClass
+ def publish(_result = nil)
+ super
+
+ publish_to_database
+ end
+
+ def candidate_behavior
+ end
+
+ def free_indicator_behavior
+ end
+end
diff --git a/app/finders/ci/pipelines_for_merge_request_finder.rb b/app/finders/ci/pipelines_for_merge_request_finder.rb
index 5d794c0903a..9476c30f525 100644
--- a/app/finders/ci/pipelines_for_merge_request_finder.rb
+++ b/app/finders/ci/pipelines_for_merge_request_finder.rb
@@ -5,6 +5,8 @@ module Ci
class PipelinesForMergeRequestFinder
include Gitlab::Utils::StrongMemoize
+ COMMITS_LIMIT = 100
+
def initialize(merge_request, current_user)
@merge_request = merge_request
@current_user = current_user
@@ -12,7 +14,7 @@ module Ci
attr_reader :merge_request, :current_user
- delegate :commit_shas, :target_project, :source_project, :source_branch, to: :merge_request
+ delegate :recent_diff_head_shas, :commit_shas, :target_project, :source_project, :source_branch, to: :merge_request
# Fetch all pipelines that the user can read.
def execute
@@ -35,7 +37,7 @@ module Ci
pipelines =
if merge_request.persisted?
- pipelines_using_cte
+ all_pipelines_for_merge_request
else
triggered_for_branch.for_sha(commit_shas)
end
@@ -79,6 +81,17 @@ module Ci
pipelines.joins(shas_table) # rubocop: disable CodeReuse/ActiveRecord
end
+ def all_pipelines_for_merge_request
+ if Feature.enabled?(:decomposed_ci_query_in_pipelines_for_merge_request_finder, target_project, default_enabled: :yaml)
+ pipelines_for_merge_request = triggered_by_merge_request
+ pipelines_for_branch = triggered_for_branch.for_sha(recent_diff_head_shas(COMMITS_LIMIT))
+
+ Ci::Pipeline.from_union([pipelines_for_merge_request, pipelines_for_branch])
+ else
+ pipelines_using_cte
+ end
+ end
+
# NOTE: this method returns only parent merge request pipelines.
# Child merge request pipelines have a different source.
def triggered_by_merge_request
diff --git a/app/finders/clusters/agents_finder.rb b/app/finders/clusters/agents_finder.rb
new file mode 100644
index 00000000000..136bbf16981
--- /dev/null
+++ b/app/finders/clusters/agents_finder.rb
@@ -0,0 +1,28 @@
+# frozen_string_literal: true
+
+module Clusters
+ class AgentsFinder
+ def initialize(project, current_user, params: {})
+ @project = project
+ @current_user = current_user
+ @params = params
+ end
+
+ def execute
+ return ::Clusters::Agent.none unless can_read_cluster_agents?
+
+ agents = project.cluster_agents
+ agents = agents.with_name(params[:name]) if params[:name].present?
+
+ agents.ordered_by_name
+ end
+
+ private
+
+ attr_reader :project, :current_user, :params
+
+ def can_read_cluster_agents?
+ current_user.can?(:read_cluster, project)
+ end
+ end
+end
diff --git a/app/finders/concerns/packages/finder_helper.rb b/app/finders/concerns/packages/finder_helper.rb
index d2784a1d270..0ae99782cd3 100644
--- a/app/finders/concerns/packages/finder_helper.rb
+++ b/app/finders/concerns/packages/finder_helper.rb
@@ -54,6 +54,12 @@ module Packages
packages.search_by_name(params[:package_name])
end
+ def filter_by_exact_package_name(packages)
+ return packages unless params[:package_name].present?
+
+ packages.with_name(params[:package_name])
+ end
+
def filter_by_package_version(packages)
return packages unless params[:package_version].present?
diff --git a/app/finders/error_tracking/errors_finder.rb b/app/finders/error_tracking/errors_finder.rb
index d83a0c487e6..c361d6e2fc2 100644
--- a/app/finders/error_tracking/errors_finder.rb
+++ b/app/finders/error_tracking/errors_finder.rb
@@ -15,8 +15,7 @@ module ErrorTracking
collection = by_status(collection)
collection = sort(collection)
- # Limit collection until pagination implemented.
- limit(collection)
+ collection.keyset_paginate(cursor: params[:cursor], per_page: limit)
end
private
@@ -39,9 +38,9 @@ module ErrorTracking
params[:sort] ? collection.sort_by_attribute(params[:sort]) : collection.order_id_desc
end
- def limit(collection)
+ def limit
# Restrict the maximum limit at 100 records.
- collection.limit([(params[:limit] || 20).to_i, 100].min)
+ [(params[:limit] || 20).to_i, 100].min
end
end
end
diff --git a/app/finders/issuable_finder.rb b/app/finders/issuable_finder.rb
index cf706a8f98e..7b0cd17a761 100644
--- a/app/finders/issuable_finder.rb
+++ b/app/finders/issuable_finder.rb
@@ -194,8 +194,7 @@ class IssuableFinder
def use_cte_for_search?
strong_memoize(:use_cte_for_search) do
next false unless search
- # Only simple unsorted & simple sorts can use CTE
- next false if params[:sort].present? && !params[:sort].in?(klass.simple_sorts.keys)
+ next false unless default_or_simple_sort?
attempt_group_search_optimizations? || attempt_project_search_optimizations?
end
@@ -244,6 +243,10 @@ class IssuableFinder
klass.all
end
+ def default_or_simple_sort?
+ params[:sort].blank? || params[:sort].to_s.in?(klass.simple_sorts.keys)
+ end
+
def attempt_group_search_optimizations?
params[:attempt_group_search_optimizations]
end
diff --git a/app/finders/issuables/label_filter.rb b/app/finders/issuables/label_filter.rb
index 2bbc963aa90..f4712fa6879 100644
--- a/app/finders/issuables/label_filter.rb
+++ b/app/finders/issuables/label_filter.rb
@@ -89,17 +89,25 @@ module Issuables
end
# rubocop: enable CodeReuse/ActiveRecord
- # rubocop: disable CodeReuse/ActiveRecord
def find_label_ids(label_names)
- group_labels = Label
- .where(project_id: nil)
- .where(title: label_names)
- .where(group_id: root_namespace.self_and_descendant_ids)
+ find_label_ids_uncached(label_names)
+ end
+ # Avoid repeating label queries times when the finder is instantiated multiple times during the request.
+ request_cache(:find_label_ids) { root_namespace.id }
- project_labels = Label
- .where(group_id: nil)
- .where(title: label_names)
- .where(project_id: Project.select(:id).where(namespace_id: root_namespace.self_and_descendant_ids))
+ # This returns an array of label IDs per label name. It is possible for a label name
+ # to have multiple IDs because we allow labels with the same name if they are on a different
+ # project or group.
+ #
+ # For example, if we pass in `['bug', 'feature']`, this will return something like:
+ # `[ [1, 2], [3] ]`
+ #
+ # rubocop: disable CodeReuse/ActiveRecord
+ def find_label_ids_uncached(label_names)
+ return [] if label_names.empty?
+
+ group_labels = group_labels_for_root_namespace.where(title: label_names)
+ project_labels = project_labels_for_root_namespace.where(title: label_names)
Label
.from_union([group_labels, project_labels], remove_duplicates: false)
@@ -109,8 +117,18 @@ module Issuables
.values
.map { |labels| labels.map(&:last) }
end
- # Avoid repeating label queries times when the finder is instantiated multiple times during the request.
- request_cache(:find_label_ids) { root_namespace.id }
+ # rubocop: enable CodeReuse/ActiveRecord
+
+ # rubocop: disable CodeReuse/ActiveRecord
+ def group_labels_for_root_namespace
+ Label.where(project_id: nil).where(group_id: root_namespace.self_and_descendant_ids)
+ end
+ # rubocop: enable CodeReuse/ActiveRecord
+
+ # rubocop: disable CodeReuse/ActiveRecord
+ def project_labels_for_root_namespace
+ Label.where(group_id: nil).where(project_id: Project.select(:id).where(namespace_id: root_namespace.self_and_descendant_ids))
+ end
# rubocop: enable CodeReuse/ActiveRecord
# rubocop: disable CodeReuse/ActiveRecord
@@ -153,3 +171,5 @@ module Issuables
end
end
end
+
+Issuables::LabelFilter.prepend_mod
diff --git a/app/finders/issues_finder.rb b/app/finders/issues_finder.rb
index abf0c180d6b..21a19aa22a1 100644
--- a/app/finders/issues_finder.rb
+++ b/app/finders/issues_finder.rb
@@ -91,6 +91,12 @@ class IssuesFinder < IssuableFinder
by_issue_types(issues)
end
+ # Negates all params found in `negatable_params`
+ def filter_negated_items(items)
+ issues = super
+ by_negated_issue_types(issues)
+ end
+
def by_confidential(items)
return items if params[:confidential].nil?
@@ -122,6 +128,13 @@ class IssuesFinder < IssuableFinder
items.with_issue_type(params[:issue_types])
end
+
+ def by_negated_issue_types(items)
+ issue_type_params = Array(not_params[:issue_types]).map(&:to_s) & WorkItem::Type.base_types.keys
+ return items if issue_type_params.blank?
+
+ items.without_issue_type(issue_type_params)
+ end
end
IssuesFinder.prepend_mod_with('IssuesFinder')
diff --git a/app/finders/members_finder.rb b/app/finders/members_finder.rb
index ea101cf1dcd..0faafa6df9c 100644
--- a/app/finders/members_finder.rb
+++ b/app/finders/members_finder.rb
@@ -70,11 +70,16 @@ class MembersFinder
end
def project_invited_groups
- invited_groups_ids_including_ancestors = Gitlab::ObjectHierarchy
- .new(project.invited_groups)
- .base_and_ancestors
- .public_or_visible_to_user(current_user)
- .select(:id)
+ invited_groups_and_ancestors = if ::Feature.enabled?(:linear_members_finder_ancestor_scopes, current_user, default_enabled: :yaml)
+ project.invited_groups
+ .self_and_ancestors
+ else
+ Gitlab::ObjectHierarchy
+ .new(project.invited_groups)
+ .base_and_ancestors
+ end
+
+ invited_groups_ids_including_ancestors = invited_groups_and_ancestors.public_or_visible_to_user(current_user).select(:id)
GroupMember.with_source_id(invited_groups_ids_including_ancestors).non_minimal_access
end
diff --git a/app/finders/packages/group_packages_finder.rb b/app/finders/packages/group_packages_finder.rb
index e753fa4d455..3ac5f00d518 100644
--- a/app/finders/packages/group_packages_finder.rb
+++ b/app/finders/packages/group_packages_finder.rb
@@ -4,7 +4,7 @@ module Packages
class GroupPackagesFinder
include ::Packages::FinderHelper
- def initialize(current_user, group, params = { exclude_subgroups: false, order_by: 'created_at', sort: 'asc' })
+ def initialize(current_user, group, params = { exclude_subgroups: false, exact_name: false, order_by: 'created_at', sort: 'asc' })
@current_user = current_user
@group = group
@params = params
@@ -30,7 +30,7 @@ module Packages
packages = filter_with_version(packages)
packages = filter_by_package_type(packages)
- packages = filter_by_package_name(packages)
+ packages = (params[:exact_name] ? filter_by_exact_package_name(packages) : filter_by_package_name(packages))
packages = filter_by_package_version(packages)
installable_only ? packages.installable : filter_by_status(packages)
end
diff --git a/app/finders/projects/members/effective_access_level_finder.rb b/app/finders/projects/members/effective_access_level_finder.rb
index c1e3842a9e4..d238679f2fb 100644
--- a/app/finders/projects/members/effective_access_level_finder.rb
+++ b/app/finders/projects/members/effective_access_level_finder.rb
@@ -99,7 +99,7 @@ module Projects
end
def include_membership_from_project_group_shares?
- project.allowed_to_share_with_group? && project.project_group_links.any?
+ !project.namespace.share_with_group_lock && project.project_group_links.any?
end
# methods for `select` options
diff --git a/app/finders/projects/topics_finder.rb b/app/finders/projects/topics_finder.rb
new file mode 100644
index 00000000000..7c3abc27cf7
--- /dev/null
+++ b/app/finders/projects/topics_finder.rb
@@ -0,0 +1,29 @@
+# frozen_string_literal: true
+
+# Used to filter project topics by a set of params
+#
+# Arguments:
+# params:
+# search: string
+module Projects
+ class TopicsFinder
+ def initialize(params: {})
+ @params = params
+ end
+
+ def execute
+ topics = Projects::Topic.order_by_total_projects_count
+ by_search(topics)
+ end
+
+ private
+
+ attr_reader :current_user, :params
+
+ def by_search(topics)
+ return topics unless params[:search].present?
+
+ topics.search(params[:search]).reorder_by_similarity(params[:search])
+ end
+ end
+end
diff --git a/app/finders/projects_finder.rb b/app/finders/projects_finder.rb
index 5537058cc79..7245bb36ac9 100644
--- a/app/finders/projects_finder.rb
+++ b/app/finders/projects_finder.rb
@@ -182,8 +182,8 @@ class ProjectsFinder < UnionFinder
def by_topics(items)
return items unless params[:topic].present?
- topics = params[:topic].instance_of?(String) ? params[:topic].strip.split(/\s*,\s*/) : params[:topic]
- topics.each do |topic|
+ topics = params[:topic].instance_of?(String) ? params[:topic].split(',') : params[:topic]
+ topics.map(&:strip).uniq.reject(&:empty?).each do |topic|
items = items.with_topic(topic)
end
diff --git a/app/finders/tags_finder.rb b/app/finders/tags_finder.rb
index d9848d027cf..0ccbbdc1b87 100644
--- a/app/finders/tags_finder.rb
+++ b/app/finders/tags_finder.rb
@@ -7,6 +7,9 @@ class TagsFinder < GitRefsFinder
def execute
tags = repository.tags_sorted_by(sort)
- by_search(tags)
+
+ [by_search(tags), nil]
+ rescue Gitlab::Git::CommandError => e
+ [[], e]
end
end
diff --git a/app/graphql/mutations/ci/runner/delete.rb b/app/graphql/mutations/ci/runner/delete.rb
index 8d9a5f15505..88dc426398b 100644
--- a/app/graphql/mutations/ci/runner/delete.rb
+++ b/app/graphql/mutations/ci/runner/delete.rb
@@ -28,7 +28,7 @@ module Mutations
def authenticate_delete_runner!(runner)
return if current_user.can_admin_all_resources?
- "Runner #{runner.to_global_id} associated with more than one project" if runner.projects.count > 1
+ "Runner #{runner.to_global_id} associated with more than one project" if runner.runner_projects.count > 1
end
def find_object(id)
diff --git a/app/graphql/mutations/clusters/agent_tokens/create.rb b/app/graphql/mutations/clusters/agent_tokens/create.rb
new file mode 100644
index 00000000000..07bf2536065
--- /dev/null
+++ b/app/graphql/mutations/clusters/agent_tokens/create.rb
@@ -0,0 +1,69 @@
+# frozen_string_literal: true
+
+module Mutations
+ module Clusters
+ module AgentTokens
+ class Create < BaseMutation
+ graphql_name 'ClusterAgentTokenCreate'
+
+ authorize :create_cluster
+
+ ClusterAgentID = ::Types::GlobalIDType[::Clusters::Agent]
+
+ argument :cluster_agent_id,
+ ClusterAgentID,
+ required: true,
+ description: 'Global ID of the cluster agent that will be associated with the new token.'
+
+ argument :description,
+ GraphQL::Types::String,
+ required: false,
+ description: 'Description of the token.'
+
+ argument :name,
+ GraphQL::Types::String,
+ required: true,
+ description: 'Name of the token.'
+
+ field :secret,
+ GraphQL::Types::String,
+ null: true,
+ description: "Token secret value. Make sure you save it - you won't be able to access it again."
+
+ field :token,
+ Types::Clusters::AgentTokenType,
+ null: true,
+ description: 'Token created after mutation.'
+
+ def resolve(args)
+ cluster_agent = authorized_find!(id: args[:cluster_agent_id])
+
+ result = ::Clusters::AgentTokens::CreateService
+ .new(
+ container: cluster_agent.project,
+ current_user: current_user,
+ params: args.merge(agent_id: cluster_agent.id)
+ )
+ .execute
+
+ payload = result.payload
+
+ {
+ secret: payload[:secret],
+ token: payload[:token],
+ errors: Array.wrap(result.message)
+ }
+ end
+
+ private
+
+ def find_object(id:)
+ # TODO: remove this line when the compatibility layer is removed
+ # See: https://gitlab.com/gitlab-org/gitlab/-/issues/257883
+ id = ClusterAgentID.coerce_isolated_input(id)
+ GitlabSchema.find_by_gid(id)
+ end
+ end
+ end
+ end
+end
diff --git a/app/graphql/mutations/clusters/agent_tokens/delete.rb b/app/graphql/mutations/clusters/agent_tokens/delete.rb
new file mode 100644
index 00000000000..603b6b30910
--- /dev/null
+++ b/app/graphql/mutations/clusters/agent_tokens/delete.rb
@@ -0,0 +1,35 @@
+# frozen_string_literal: true
+
+module Mutations
+ module Clusters
+ module AgentTokens
+ class Delete < BaseMutation
+ graphql_name 'ClusterAgentTokenDelete'
+
+ authorize :admin_cluster
+
+ TokenID = ::Types::GlobalIDType[::Clusters::AgentToken]
+
+ argument :id, TokenID,
+ required: true,
+ description: 'Global ID of the cluster agent token that will be deleted.'
+
+ def resolve(id:)
+ token = authorized_find!(id: id)
+ token.destroy
+
+ { errors: errors_on_object(token) }
+ end
+
+ private
+
+ def find_object(id:)
+ # TODO: remove this line when the compatibility layer is removed
+ # See: https://gitlab.com/gitlab-org/gitlab/-/issues/257883
+ id = TokenID.coerce_isolated_input(id)
+ GitlabSchema.find_by_gid(id)
+ end
+ end
+ end
+ end
+end
diff --git a/app/graphql/mutations/clusters/agents/create.rb b/app/graphql/mutations/clusters/agents/create.rb
new file mode 100644
index 00000000000..0896cc7b203
--- /dev/null
+++ b/app/graphql/mutations/clusters/agents/create.rb
@@ -0,0 +1,38 @@
+# frozen_string_literal: true
+
+module Mutations
+ module Clusters
+ module Agents
+ class Create < BaseMutation
+ include FindsProject
+
+ authorize :create_cluster
+
+ graphql_name 'CreateClusterAgent'
+
+ argument :project_path, GraphQL::Types::ID,
+ required: true,
+ description: 'Full path of the associated project for this cluster agent.'
+
+ argument :name, GraphQL::Types::String,
+ required: true,
+ description: 'Name of the cluster agent.'
+
+ field :cluster_agent,
+ Types::Clusters::AgentType,
+ null: true,
+ description: 'Cluster agent created after mutation.'
+
+ def resolve(project_path:, name:)
+ project = authorized_find!(project_path)
+ result = ::Clusters::Agents::CreateService.new(project, current_user).execute(name: name)
+
+ {
+ cluster_agent: result[:cluster_agent],
+ errors: Array.wrap(result[:message])
+ }
+ end
+ end
+ end
+ end
+end
diff --git a/app/graphql/mutations/clusters/agents/delete.rb b/app/graphql/mutations/clusters/agents/delete.rb
new file mode 100644
index 00000000000..9ada1f31f60
--- /dev/null
+++ b/app/graphql/mutations/clusters/agents/delete.rb
@@ -0,0 +1,39 @@
+# frozen_string_literal: true
+
+module Mutations
+ module Clusters
+ module Agents
+ class Delete < BaseMutation
+ graphql_name 'ClusterAgentDelete'
+
+ authorize :admin_cluster
+
+ AgentID = ::Types::GlobalIDType[::Clusters::Agent]
+
+ argument :id, AgentID,
+ required: true,
+ description: 'Global ID of the cluster agent that will be deleted.'
+
+ def resolve(id:)
+ cluster_agent = authorized_find!(id: id)
+ result = ::Clusters::Agents::DeleteService
+ .new(container: cluster_agent.project, current_user: current_user)
+ .execute(cluster_agent)
+
+ {
+ errors: Array.wrap(result.message)
+ }
+ end
+
+ private
+
+ def find_object(id:)
+ # TODO: remove this line when the compatibility layer is removed
+ # See: https://gitlab.com/gitlab-org/gitlab/-/issues/257883
+ id = AgentID.coerce_isolated_input(id)
+ GitlabSchema.find_by_gid(id)
+ end
+ end
+ end
+ end
+end
diff --git a/app/graphql/mutations/customer_relations/contacts/create.rb b/app/graphql/mutations/customer_relations/contacts/create.rb
new file mode 100644
index 00000000000..77b4864468b
--- /dev/null
+++ b/app/graphql/mutations/customer_relations/contacts/create.rb
@@ -0,0 +1,69 @@
+# frozen_string_literal: true
+
+module Mutations
+ module CustomerRelations
+ module Contacts
+ class Create < BaseMutation
+ include ResolvesIds
+ include Gitlab::Graphql::Authorize::AuthorizeResource
+
+ graphql_name 'CustomerRelationsContactCreate'
+
+ field :contact,
+ Types::CustomerRelations::ContactType,
+ null: true,
+ description: 'Contact after the mutation.'
+
+ argument :group_id, ::Types::GlobalIDType[::Group],
+ required: true,
+ description: 'Group for the contact.'
+
+ argument :organization_id, ::Types::GlobalIDType[::CustomerRelations::Organization],
+ required: false,
+ description: 'Organization for the contact.'
+
+ argument :first_name, GraphQL::Types::String,
+ required: true,
+ description: 'First name of the contact.'
+
+ argument :last_name, GraphQL::Types::String,
+ required: true,
+ description: 'Last name of the contact.'
+
+ argument :phone, GraphQL::Types::String,
+ required: false,
+ description: 'Phone number of the contact.'
+
+ argument :email, GraphQL::Types::String,
+ required: false,
+ description: 'Email address of the contact.'
+
+ argument :description, GraphQL::Types::String,
+ required: false,
+ description: 'Description of or notes for the contact.'
+
+ authorize :admin_contact
+
+ def resolve(args)
+ group = authorized_find!(id: args[:group_id])
+
+ raise Gitlab::Graphql::Errors::ResourceNotAvailable, 'Feature disabled' unless Feature.enabled?(:customer_relations, group, default_enabled: :yaml)
+
+ set_organization!(args)
+ result = ::CustomerRelations::Contacts::CreateService.new(group: group, current_user: current_user, params: args).execute
+ { contact: result.payload, errors: result.errors }
+ end
+
+ def find_object(id:)
+ GitlabSchema.object_from_id(id, expected_type: ::Group)
+ end
+
+ def set_organization!(args)
+ return unless args[:organization_id]
+
+ args[:organization_id] = resolve_ids(args[:organization_id], ::Types::GlobalIDType[::CustomerRelations::Organization])[0]
+ end
+ end
+ end
+ end
+end
diff --git a/app/graphql/mutations/customer_relations/contacts/update.rb b/app/graphql/mutations/customer_relations/contacts/update.rb
new file mode 100644
index 00000000000..e9e7c9b6abd
--- /dev/null
+++ b/app/graphql/mutations/customer_relations/contacts/update.rb
@@ -0,0 +1,61 @@
+# frozen_string_literal: true
+
+module Mutations
+ module CustomerRelations
+ module Contacts
+ class Update < Mutations::BaseMutation
+ include ResolvesIds
+
+ graphql_name 'CustomerRelationsContactUpdate'
+
+ authorize :admin_contact
+
+ field :contact,
+ Types::CustomerRelations::ContactType,
+ null: true,
+ description: 'Contact after the mutation.'
+
+ argument :id, ::Types::GlobalIDType[::CustomerRelations::Contact],
+ required: true,
+ description: 'Global ID of the contact.'
+
+ argument :organization_id, ::Types::GlobalIDType[::CustomerRelations::Organization],
+ required: false,
+ description: 'Organization of the contact.'
+
+ argument :first_name, GraphQL::Types::String,
+ required: false,
+ description: 'First name of the contact.'
+
+ argument :last_name, GraphQL::Types::String,
+ required: false,
+ description: 'Last name of the contact.'
+
+ argument :phone, GraphQL::Types::String,
+ required: false,
+ description: 'Phone number of the contact.'
+
+ argument :email, GraphQL::Types::String,
+ required: false,
+ description: 'Email address of the contact.'
+
+ argument :description, GraphQL::Types::String,
+ required: false,
+ description: 'Description of or notes for the contact.'
+
+ def resolve(args)
+ contact = ::Gitlab::Graphql::Lazy.force(GitlabSchema.object_from_id(args.delete(:id), expected_type: ::CustomerRelations::Contact))
+ raise_resource_not_available_error! unless contact
+
+ group = contact.group
+ raise Gitlab::Graphql::Errors::ResourceNotAvailable, 'Feature disabled' unless Feature.enabled?(:customer_relations, group, default_enabled: :yaml)
+
+ authorize!(group)
+
+ result = ::CustomerRelations::Contacts::UpdateService.new(group: group, current_user: current_user, params: args).execute(contact)
+ { contact: result.payload, errors: result.errors }
+ end
+ end
+ end
+ end
+end
diff --git a/app/graphql/mutations/customer_relations/organizations/create.rb b/app/graphql/mutations/customer_relations/organizations/create.rb
index 3fa7b0327ca..bb02e1f7346 100644
--- a/app/graphql/mutations/customer_relations/organizations/create.rb
+++ b/app/graphql/mutations/customer_relations/organizations/create.rb
@@ -31,7 +31,7 @@ module Mutations
argument :description,
GraphQL::Types::String,
required: false,
- description: 'Description or notes for the organization.'
+ description: 'Description of or notes for the organization.'
authorize :admin_organization
diff --git a/app/graphql/mutations/customer_relations/organizations/update.rb b/app/graphql/mutations/customer_relations/organizations/update.rb
index c6ae62193f9..d8eb55d77e9 100644
--- a/app/graphql/mutations/customer_relations/organizations/update.rb
+++ b/app/graphql/mutations/customer_relations/organizations/update.rb
@@ -32,7 +32,7 @@ module Mutations
argument :description,
GraphQL::Types::String,
required: false,
- description: 'Description or notes for the organization.'
+ description: 'Description of or notes for the organization.'
def resolve(args)
organization = ::Gitlab::Graphql::Lazy.force(GitlabSchema.object_from_id(args.delete(:id), expected_type: ::CustomerRelations::Organization))
diff --git a/app/graphql/mutations/dependency_proxy/group_settings/update.rb b/app/graphql/mutations/dependency_proxy/group_settings/update.rb
new file mode 100644
index 00000000000..d10e43cde29
--- /dev/null
+++ b/app/graphql/mutations/dependency_proxy/group_settings/update.rb
@@ -0,0 +1,49 @@
+# frozen_string_literal: true
+
+module Mutations
+ module DependencyProxy
+ module GroupSettings
+ class Update < Mutations::BaseMutation
+ include Mutations::ResolvesGroup
+
+ graphql_name 'UpdateDependencyProxySettings'
+
+ authorize :admin_dependency_proxy
+
+ argument :group_path,
+ GraphQL::Types::ID,
+ required: true,
+ description: 'Group path for the group dependency proxy.'
+
+ argument :enabled,
+ GraphQL::Types::Boolean,
+ required: false,
+ description: copy_field_description(Types::DependencyProxy::ImageTtlGroupPolicyType, :enabled)
+
+ field :dependency_proxy_setting,
+ Types::DependencyProxy::GroupSettingType,
+ null: true,
+ description: 'Group dependency proxy settings after mutation.'
+
+ def resolve(group_path:, **args)
+ group = authorized_find!(group_path: group_path)
+
+ result = ::DependencyProxy::GroupSettings::UpdateService
+ .new(container: group, current_user: current_user, params: args)
+ .execute
+
+ {
+ dependency_proxy_setting: result.payload[:dependency_proxy_setting],
+ errors: result.errors
+ }
+ end
+
+ private
+
+ def find_object(group_path:)
+ resolve_group(full_path: group_path)
+ end
+ end
+ end
+ end
+end
diff --git a/app/graphql/mutations/issues/create.rb b/app/graphql/mutations/issues/create.rb
index 32f96f1bfe6..70a8f539ccf 100644
--- a/app/graphql/mutations/issues/create.rb
+++ b/app/graphql/mutations/issues/create.rb
@@ -71,7 +71,7 @@ module Mutations
def resolve(project_path:, **attributes)
project = authorized_find!(project_path)
- params = build_create_issue_params(attributes.merge(author_id: current_user.id))
+ params = build_create_issue_params(attributes.merge(author_id: current_user.id), project)
spam_params = ::Spam::SpamParams.new_from_request(request: context[:request])
issue = ::Issues::CreateService.new(project: project, current_user: current_user, params: params, spam_params: spam_params).execute
@@ -88,7 +88,8 @@ module Mutations
private
- def build_create_issue_params(params)
+ # _project argument is unused here, but it is necessary on the EE version of the method
+ def build_create_issue_params(params, _project)
params[:milestone_id] &&= params[:milestone_id]&.model_id
params[:assignee_ids] &&= params[:assignee_ids].map { |assignee_id| assignee_id&.model_id }
params[:label_ids] &&= params[:label_ids].map { |label_id| label_id&.model_id }
diff --git a/app/graphql/resolvers/board_list_issues_resolver.rb b/app/graphql/resolvers/board_list_issues_resolver.rb
index 7c85dd8fb9b..d70acdf7ca0 100644
--- a/app/graphql/resolvers/board_list_issues_resolver.rb
+++ b/app/graphql/resolvers/board_list_issues_resolver.rb
@@ -18,11 +18,8 @@ module Resolvers
filter_params = filters.merge(board_id: list.board.id, id: list.id)
service = ::Boards::Issues::ListService.new(list.board.resource_parent, context[:current_user], filter_params)
- pagination_connections = Gitlab::Graphql::Pagination::Keyset::Connection.new(service.execute)
- ::Boards::Issues::ListService.initialize_relative_positions(list.board, current_user, pagination_connections.items)
-
- pagination_connections
+ service.execute
end
# https://gitlab.com/gitlab-org/gitlab/-/issues/235681
diff --git a/app/graphql/resolvers/board_list_resolver.rb b/app/graphql/resolvers/board_list_resolver.rb
new file mode 100644
index 00000000000..d853846b674
--- /dev/null
+++ b/app/graphql/resolvers/board_list_resolver.rb
@@ -0,0 +1,35 @@
+# frozen_string_literal: true
+
+module Resolvers
+ class BoardListResolver < BaseResolver.single
+ include Gitlab::Graphql::Authorize::AuthorizeResource
+ include BoardItemFilterable
+
+ type Types::BoardListType, null: true
+ description 'Find an issue board list.'
+
+ authorize :read_issue_board_list
+
+ argument :id, Types::GlobalIDType[List],
+ required: true,
+ description: 'Global ID of the list.'
+
+ argument :issue_filters, Types::Boards::BoardIssueInputType,
+ required: false,
+ description: 'Filters applied when getting issue metadata in the board list.'
+
+ def resolve(id: nil, issue_filters: {})
+ context.scoped_set!(:issue_filters, item_filters(issue_filters))
+
+ Gitlab::Graphql::Lazy.with_value(find_list(id: id)) do |list|
+ list if authorized_resource?(list)
+ end
+ end
+
+ private
+
+ def find_list(id:)
+ GitlabSchema.object_from_id(id, expected_type: ::List)
+ end
+ end
+end
diff --git a/app/graphql/resolvers/clusters/agent_tokens_resolver.rb b/app/graphql/resolvers/clusters/agent_tokens_resolver.rb
new file mode 100644
index 00000000000..5ae19700fd5
--- /dev/null
+++ b/app/graphql/resolvers/clusters/agent_tokens_resolver.rb
@@ -0,0 +1,25 @@
+# frozen_string_literal: true
+
+module Resolvers
+ module Clusters
+ class AgentTokensResolver < BaseResolver
+ type Types::Clusters::AgentTokenType, null: true
+
+ alias_method :agent, :object
+
+ delegate :project, to: :agent
+
+ def resolve(**args)
+ return ::Clusters::AgentToken.none unless can_read_agent_tokens?
+
+ agent.last_used_agent_tokens
+ end
+
+ private
+
+ def can_read_agent_tokens?
+ current_user.can?(:admin_cluster, project)
+ end
+ end
+ end
+end
diff --git a/app/graphql/resolvers/clusters/agents_resolver.rb b/app/graphql/resolvers/clusters/agents_resolver.rb
new file mode 100644
index 00000000000..9b8cea52e3b
--- /dev/null
+++ b/app/graphql/resolvers/clusters/agents_resolver.rb
@@ -0,0 +1,35 @@
+# frozen_string_literal: true
+
+module Resolvers
+ module Clusters
+ class AgentsResolver < BaseResolver
+ include LooksAhead
+
+ type Types::Clusters::AgentType.connection_type, null: true
+
+ extras [:lookahead]
+
+ when_single do
+ argument :name, GraphQL::Types::String,
+ required: true,
+ description: 'Name of the cluster agent.'
+ end
+
+ alias_method :project, :object
+
+ def resolve_with_lookahead(**args)
+ apply_lookahead(
+ ::Clusters::AgentsFinder
+ .new(project, current_user, params: args)
+ .execute
+ )
+ end
+
+ private
+
+ def preloads
+ { tokens: :last_used_agent_tokens }
+ end
+ end
+ end
+end
diff --git a/app/graphql/resolvers/concerns/issue_resolver_arguments.rb b/app/graphql/resolvers/concerns/issue_resolver_arguments.rb
index 9de36b5b7d1..855877110e5 100644
--- a/app/graphql/resolvers/concerns/issue_resolver_arguments.rb
+++ b/app/graphql/resolvers/concerns/issue_resolver_arguments.rb
@@ -4,6 +4,7 @@ module IssueResolverArguments
extend ActiveSupport::Concern
prepended do
+ include SearchArguments
include LooksAhead
argument :iid, GraphQL::Types::String,
@@ -49,9 +50,6 @@ module IssueResolverArguments
argument :closed_after, Types::TimeType,
required: false,
description: 'Issues closed after this date.'
- argument :search, GraphQL::Types::String,
- required: false,
- description: 'Search query for issue title or description.'
argument :types, [Types::IssueTypeEnum],
as: :issue_types,
description: 'Filter issues by the given issue types.',
@@ -62,6 +60,10 @@ module IssueResolverArguments
argument :my_reaction_emoji, GraphQL::Types::String,
required: false,
description: 'Filter by reaction emoji applied by the current user. Wildcard values "NONE" and "ANY" are supported.'
+ argument :confidential,
+ GraphQL::Types::Boolean,
+ required: false,
+ description: 'Filter for confidential issues. If "false", excludes confidential issues. If "true", returns only confidential issues.'
argument :not, Types::Issues::NegatedIssueFilterInputType,
description: 'Negated arguments.',
prepare: ->(negated_args, ctx) { negated_args.to_h },
@@ -91,6 +93,7 @@ module IssueResolverArguments
params_not_mutually_exclusive(args, mutually_exclusive_assignee_username_args)
params_not_mutually_exclusive(args, mutually_exclusive_milestone_args)
params_not_mutually_exclusive(args.fetch(:not, {}), mutually_exclusive_milestone_args)
+ validate_anonymous_search_access! if args[:search].present?
super
end
diff --git a/app/graphql/resolvers/concerns/search_arguments.rb b/app/graphql/resolvers/concerns/search_arguments.rb
new file mode 100644
index 00000000000..7f480f9d0b6
--- /dev/null
+++ b/app/graphql/resolvers/concerns/search_arguments.rb
@@ -0,0 +1,18 @@
+# frozen_string_literal: true
+
+module SearchArguments
+ extend ActiveSupport::Concern
+
+ included do
+ argument :search, GraphQL::Types::String,
+ required: false,
+ description: 'Search query for title or description.'
+ end
+
+ def validate_anonymous_search_access!
+ return if current_user.present? || Feature.disabled?(:disable_anonymous_search, type: :ops)
+
+ raise ::Gitlab::Graphql::Errors::ArgumentError,
+ "User must be authenticated to include the `search` argument."
+ end
+end
diff --git a/app/graphql/resolvers/issues_resolver.rb b/app/graphql/resolvers/issues_resolver.rb
index 47e4e3c0b32..b556964ae0c 100644
--- a/app/graphql/resolvers/issues_resolver.rb
+++ b/app/graphql/resolvers/issues_resolver.rb
@@ -47,7 +47,8 @@ module Resolvers
alert_management_alert: [:alert_management_alert],
labels: [:labels],
assignees: [:assignees],
- timelogs: [:timelogs]
+ timelogs: [:timelogs],
+ customer_relations_contacts: { customer_relations_contacts: [:group] }
}
end
diff --git a/app/graphql/resolvers/kas/agent_configurations_resolver.rb b/app/graphql/resolvers/kas/agent_configurations_resolver.rb
new file mode 100644
index 00000000000..238dae0bf12
--- /dev/null
+++ b/app/graphql/resolvers/kas/agent_configurations_resolver.rb
@@ -0,0 +1,32 @@
+# frozen_string_literal: true
+
+module Resolvers
+ module Kas
+ class AgentConfigurationsResolver < BaseResolver
+ type Types::Kas::AgentConfigurationType, null: true
+
+ # Calls Gitaly via KAS
+ calls_gitaly!
+
+ alias_method :project, :object
+
+ def resolve
+ return [] unless can_read_agent_configuration?
+
+ kas_client.list_agent_config_files(project: project)
+ rescue GRPC::BadStatus => e
+ raise Gitlab::Graphql::Errors::ResourceNotAvailable, e.class.name
+ end
+
+ private
+
+ def can_read_agent_configuration?
+ current_user.can?(:admin_cluster, project)
+ end
+
+ def kas_client
+ @kas_client ||= Gitlab::Kas::Client.new
+ end
+ end
+ end
+end
diff --git a/app/graphql/resolvers/kas/agent_connections_resolver.rb b/app/graphql/resolvers/kas/agent_connections_resolver.rb
new file mode 100644
index 00000000000..8b7c4003598
--- /dev/null
+++ b/app/graphql/resolvers/kas/agent_connections_resolver.rb
@@ -0,0 +1,41 @@
+# frozen_string_literal: true
+
+module Resolvers
+ module Kas
+ class AgentConnectionsResolver < BaseResolver
+ type Types::Kas::AgentConnectionType, null: true
+
+ alias_method :agent, :object
+
+ delegate :project, to: :agent
+
+ def resolve
+ return [] unless can_read_connected_agents?
+
+ BatchLoader::GraphQL.for(agent.id).batch(key: project, default_value: []) do |agent_ids, loader|
+ agents = get_connected_agents.group_by(&:agent_id).slice(*agent_ids)
+
+ agents.each do |agent_id, connections|
+ loader.call(agent_id, connections)
+ end
+ end
+ end
+
+ private
+
+ def can_read_connected_agents?
+ current_user.can?(:admin_cluster, project)
+ end
+
+ def get_connected_agents
+ kas_client.get_connected_agents(project: project)
+ rescue GRPC::BadStatus => e
+ raise Gitlab::Graphql::Errors::ResourceNotAvailable, e.class.name
+ end
+
+ def kas_client
+ @kas_client ||= Gitlab::Kas::Client.new
+ end
+ end
+ end
+end
diff --git a/app/graphql/resolvers/project_pipeline_resolver.rb b/app/graphql/resolvers/project_pipeline_resolver.rb
index ce4b6ac6b0c..5acd7f95606 100644
--- a/app/graphql/resolvers/project_pipeline_resolver.rb
+++ b/app/graphql/resolvers/project_pipeline_resolver.rb
@@ -2,6 +2,8 @@
module Resolvers
class ProjectPipelineResolver < BaseResolver
+ include LooksAhead
+
type ::Types::Ci::PipelineType, null: true
alias_method :project, :object
@@ -14,7 +16,7 @@ module Resolvers
required: false,
description: 'SHA of the Pipeline. For example, "dyd0f15ay83993f5ab66k927w28673882x99100b".'
- def ready?(iid: nil, sha: nil)
+ def ready?(iid: nil, sha: nil, **args)
unless iid.present? ^ sha.present?
raise Gitlab::Graphql::Errors::ArgumentError, 'Provide one of an IID or SHA'
end
@@ -22,18 +24,21 @@ module Resolvers
super
end
- def resolve(iid: nil, sha: nil)
+ # the preloads are defined on ee/app/graphql/ee/resolvers/project_pipeline_resolver.rb
+ def resolve(iid: nil, sha: nil, **args)
+ self.lookahead = args.delete(:lookahead)
+
if iid
- BatchLoader::GraphQL.for(iid).batch(key: project) do |iids, loader, args|
+ BatchLoader::GraphQL.for(iid).batch(key: project) do |iids, loader|
finder = ::Ci::PipelinesFinder.new(project, current_user, iids: iids)
- finder.execute.each { |pipeline| loader.call(pipeline.iid.to_s, pipeline) }
+ apply_lookahead(finder.execute).each { |pipeline| loader.call(pipeline.iid.to_s, pipeline) }
end
else
- BatchLoader::GraphQL.for(sha).batch(key: project) do |shas, loader, args|
+ BatchLoader::GraphQL.for(sha).batch(key: project) do |shas, loader|
finder = ::Ci::PipelinesFinder.new(project, current_user, sha: shas)
- finder.execute.each { |pipeline| loader.call(pipeline.sha.to_s, pipeline) }
+ apply_lookahead(finder.execute).each { |pipeline| loader.call(pipeline.sha.to_s, pipeline) }
end
end
end
diff --git a/app/graphql/resolvers/project_pipelines_resolver.rb b/app/graphql/resolvers/project_pipelines_resolver.rb
index 0171473a77f..5a1e92efc96 100644
--- a/app/graphql/resolvers/project_pipelines_resolver.rb
+++ b/app/graphql/resolvers/project_pipelines_resolver.rb
@@ -26,3 +26,5 @@ module Resolvers
end
end
# rubocop: enable Graphql/ResolverType
+
+Resolvers::ProjectPipelinesResolver.prepend_mod
diff --git a/app/graphql/types/base_field.rb b/app/graphql/types/base_field.rb
index 9c27f0f8138..93e17ea6dfc 100644
--- a/app/graphql/types/base_field.rb
+++ b/app/graphql/types/base_field.rb
@@ -9,7 +9,6 @@ module Types
DEFAULT_COMPLEXITY = 1
attr_reader :deprecation, :doc_reference
- attr_writer :max_page_size # Can be removed with :performance_roadmap feature flag: https://gitlab.com/gitlab-org/gitlab/-/issues/337198
def initialize(**kwargs, &block)
@calls_gitaly = !!kwargs.delete(:calls_gitaly)
@@ -21,6 +20,7 @@ module Types
@feature_flag = kwargs[:feature_flag]
kwargs = check_feature_flag(kwargs)
@deprecation = gitlab_deprecation(kwargs)
+ after_connection_extensions = kwargs.delete(:late_extensions) || []
super(**kwargs, &block)
@@ -28,6 +28,8 @@ module Types
extension ::Gitlab::Graphql::CallsGitaly::FieldExtension if Gitlab.dev_or_test_env?
extension ::Gitlab::Graphql::Present::FieldExtension
extension ::Gitlab::Graphql::Authorize::ConnectionFilterExtension
+
+ after_connection_extensions.each { extension _1 } if after_connection_extensions.any?
end
def may_call_gitaly?
diff --git a/app/graphql/types/board_list_type.rb b/app/graphql/types/board_list_type.rb
index 762e03973d9..8c67803e39e 100644
--- a/app/graphql/types/board_list_type.rb
+++ b/app/graphql/types/board_list_type.rb
@@ -10,8 +10,10 @@ module Types
alias_method :list, :object
- field :id, GraphQL::Types::ID, null: false,
+ field :id, GraphQL::Types::ID,
+ null: false,
description: 'ID (global ID) of the list.'
+
field :title, GraphQL::Types::String, null: false,
description: 'Title of the list.'
field :list_type, GraphQL::Types::String, null: false,
@@ -27,6 +29,7 @@ module Types
field :issues, ::Types::IssueType.connection_type, null: true,
description: 'Board issues.',
+ late_extensions: [Gitlab::Graphql::Board::IssuesConnectionExtension],
resolver: ::Resolvers::BoardListIssuesResolver
def issues_count
@@ -46,6 +49,16 @@ module Types
.metadata
end
end
+
+ # board lists have a data dependency on label - so we batch load them here
+ def title
+ BatchLoader::GraphQL.for(object).batch do |lists, callback|
+ ActiveRecord::Associations::Preloader.new.preload(lists, :label) # rubocop: disable CodeReuse/ActiveRecord
+
+ # all list titles are preloaded at this point
+ lists.each { |list| callback.call(list, list.title) }
+ end
+ end
end
# rubocop: enable Graphql/AuthorizeTypes
end
diff --git a/app/graphql/types/ci/runner_status_enum.rb b/app/graphql/types/ci/runner_status_enum.rb
index ad69175e44a..8501ce20204 100644
--- a/app/graphql/types/ci/runner_status_enum.rb
+++ b/app/graphql/types/ci/runner_status_enum.rb
@@ -6,8 +6,21 @@ module Types
graphql_name 'CiRunnerStatus'
::Ci::Runner::AVAILABLE_STATUSES.each do |status|
+ description = case status
+ when 'active'
+ "A runner that is not paused."
+ when 'online'
+ "A runner that contacted this instance within the last #{::Ci::Runner::ONLINE_CONTACT_TIMEOUT.inspect}."
+ when 'offline'
+ "A runner that has not contacted this instance within the last #{::Ci::Runner::ONLINE_CONTACT_TIMEOUT.inspect}."
+ when 'not_connected'
+ "A runner that has never contacted this instance."
+ else
+ "A runner that is #{status.to_s.tr('_', ' ')}."
+ end
+
value status.to_s.upcase,
- description: "A runner that is #{status.to_s.tr('_', ' ')}.",
+ description: description,
value: status.to_sym
end
end
diff --git a/app/graphql/types/ci/runner_type.rb b/app/graphql/types/ci/runner_type.rb
index e2c8070af0c..9bf98aa7e86 100644
--- a/app/graphql/types/ci/runner_type.rb
+++ b/app/graphql/types/ci/runner_type.rb
@@ -3,10 +3,13 @@
module Types
module Ci
class RunnerType < BaseObject
+ edge_type_class(RunnerWebUrlEdge)
graphql_name 'CiRunner'
authorize :read_runner
present_using ::Ci::RunnerPresenter
+ expose_permissions Types::PermissionTypes::Ci::Runner
+
JOB_COUNT_LIMIT = 1000
alias_method :runner, :object
@@ -46,12 +49,18 @@ module Types
description: 'Number of projects that the runner is associated with.'
field :job_count, GraphQL::Types::Int, null: true,
description: "Number of jobs processed by the runner (limited to #{JOB_COUNT_LIMIT}, plus one to indicate that more items exist)."
+ field :admin_url, GraphQL::Types::String, null: true,
+ description: 'Admin URL of the runner. Only available for adminstrators.'
def job_count
# We limit to 1 above the JOB_COUNT_LIMIT to indicate that more items exist after JOB_COUNT_LIMIT
runner.builds.limit(JOB_COUNT_LIMIT + 1).count
end
+ def admin_url
+ Gitlab::Routing.url_helpers.admin_runner_url(runner) if can_admin_runners?
+ end
+
# rubocop: disable CodeReuse/ActiveRecord
def project_count
BatchLoader::GraphQL.for(runner.id).batch(key: :runner_project_count) do |ids, loader, args|
@@ -68,6 +77,12 @@ module Types
end
end
# rubocop: enable CodeReuse/ActiveRecord
+
+ private
+
+ def can_admin_runners?
+ context[:current_user]&.can_admin_all_resources?
+ end
end
end
end
diff --git a/app/graphql/types/ci/runner_web_url_edge.rb b/app/graphql/types/ci/runner_web_url_edge.rb
new file mode 100644
index 00000000000..3b9fdfd1571
--- /dev/null
+++ b/app/graphql/types/ci/runner_web_url_edge.rb
@@ -0,0 +1,31 @@
+# frozen_string_literal: true
+
+module Types
+ module Ci
+ # rubocop: disable Graphql/AuthorizeTypes
+ class RunnerWebUrlEdge < GraphQL::Types::Relay::BaseEdge
+ include FindClosest
+
+ field :web_url, GraphQL::Types::String, null: true,
+ description: 'Web URL of the runner. The value depends on where you put this field in the query. You can use it for projects or groups.',
+ extras: [:parent]
+
+ def initialize(node, connection)
+ super
+
+ @runner = node.node
+ end
+
+ def web_url(parent:)
+ owner = closest_parent([::Types::ProjectType, ::Types::GroupType], parent)
+
+ case owner
+ when ::Group
+ Gitlab::Routing.url_helpers.group_runner_url(owner, @runner)
+ when ::Project
+ Gitlab::Routing.url_helpers.project_runner_url(owner, @runner)
+ end
+ end
+ end
+ end
+end
diff --git a/app/graphql/types/clusters/agent_token_type.rb b/app/graphql/types/clusters/agent_token_type.rb
new file mode 100644
index 00000000000..94c5fc46a5d
--- /dev/null
+++ b/app/graphql/types/clusters/agent_token_type.rb
@@ -0,0 +1,52 @@
+# frozen_string_literal: true
+
+module Types
+ module Clusters
+ class AgentTokenType < BaseObject
+ graphql_name 'ClusterAgentToken'
+
+ authorize :admin_cluster
+
+ connection_type_class(Types::CountableConnectionType)
+
+ field :cluster_agent,
+ Types::Clusters::AgentType,
+ description: 'Cluster agent this token is associated with.',
+ null: true
+
+ field :created_at,
+ Types::TimeType,
+ null: true,
+ description: 'Timestamp the token was created.'
+
+ field :created_by_user,
+ Types::UserType,
+ null: true,
+ description: 'User who created the token.'
+
+ field :description,
+ GraphQL::Types::String,
+ null: true,
+ description: 'Description of the token.'
+
+ field :last_used_at,
+ Types::TimeType,
+ null: true,
+ description: 'Timestamp the token was last used.'
+
+ field :id,
+ ::Types::GlobalIDType[::Clusters::AgentToken],
+ null: false,
+ description: 'Global ID of the token.'
+
+ field :name,
+ GraphQL::Types::String,
+ null: true,
+ description: 'Name given to the token.'
+
+ def cluster_agent
+ Gitlab::Graphql::Loaders::BatchModelLoader.new(::Clusters::Agent, object.agent_id).find
+ end
+ end
+ end
+end
diff --git a/app/graphql/types/clusters/agent_type.rb b/app/graphql/types/clusters/agent_type.rb
new file mode 100644
index 00000000000..ce748f6e8ae
--- /dev/null
+++ b/app/graphql/types/clusters/agent_type.rb
@@ -0,0 +1,67 @@
+# frozen_string_literal: true
+
+module Types
+ module Clusters
+ class AgentType < BaseObject
+ graphql_name 'ClusterAgent'
+
+ authorize :admin_cluster
+
+ connection_type_class(Types::CountableConnectionType)
+
+ field :created_at,
+ Types::TimeType,
+ null: true,
+ description: 'Timestamp the cluster agent was created.'
+
+ field :created_by_user,
+ Types::UserType,
+ null: true,
+ description: 'User object, containing information about the person who created the agent.'
+
+ field :id, GraphQL::Types::ID,
+ null: false,
+ description: 'ID of the cluster agent.'
+
+ field :name,
+ GraphQL::Types::String,
+ null: true,
+ description: 'Name of the cluster agent.'
+
+ field :project, Types::ProjectType,
+ description: 'Project this cluster agent is associated with.',
+ null: true,
+ authorize: :read_project
+
+ field :tokens, Types::Clusters::AgentTokenType.connection_type,
+ description: 'Tokens associated with the cluster agent.',
+ null: true,
+ resolver: ::Resolvers::Clusters::AgentTokensResolver
+
+ field :updated_at,
+ Types::TimeType,
+ null: true,
+ description: 'Timestamp the cluster agent was updated.'
+
+ field :web_path,
+ GraphQL::Types::String,
+ null: true,
+ description: 'Web path of the cluster agent.'
+
+ field :connections,
+ Types::Kas::AgentConnectionType.connection_type,
+ null: true,
+ description: 'Active connections for the cluster agent',
+ complexity: 5,
+ resolver: ::Resolvers::Kas::AgentConnectionsResolver
+
+ def project
+ Gitlab::Graphql::Loaders::BatchModelLoader.new(Project, object.project_id).find
+ end
+
+ def web_path
+ ::Gitlab::Routing.url_helpers.project_cluster_agent_path(object.project, object.name)
+ end
+ end
+ end
+end
diff --git a/app/graphql/types/concerns/find_closest.rb b/app/graphql/types/concerns/find_closest.rb
index 1d76e872364..3064db19ea0 100644
--- a/app/graphql/types/concerns/find_closest.rb
+++ b/app/graphql/types/concerns/find_closest.rb
@@ -1,11 +1,15 @@
# frozen_string_literal: true
module FindClosest
- # Find the closest node of a given type above this node, and return the domain object
- def closest_parent(type, parent)
- parent = parent.try(:parent) while parent && parent.object.class != type
- return unless parent
+ # Find the closest node which has any of the given types above this node, and return the domain object
+ def closest_parent(types, parent)
+ while parent
- parent.object.object
+ if types.any? {|type| parent.object.instance_of? type}
+ return parent.object.object
+ else
+ parent = parent.try(:parent)
+ end
+ end
end
end
diff --git a/app/graphql/types/container_expiration_policy_older_than_enum.rb b/app/graphql/types/container_expiration_policy_older_than_enum.rb
index 7364910f8cd..9c32d767caf 100644
--- a/app/graphql/types/container_expiration_policy_older_than_enum.rb
+++ b/app/graphql/types/container_expiration_policy_older_than_enum.rb
@@ -6,6 +6,7 @@ module Types
'7d': 'SEVEN_DAYS',
'14d': 'FOURTEEN_DAYS',
'30d': 'THIRTY_DAYS',
+ '60d': 'SIXTY_DAYS',
'90d': 'NINETY_DAYS'
}.freeze
diff --git a/app/graphql/types/container_repository_details_type.rb b/app/graphql/types/container_repository_details_type.rb
index 1a9f57e701f..8190cc9bc25 100644
--- a/app/graphql/types/container_repository_details_type.rb
+++ b/app/graphql/types/container_repository_details_type.rb
@@ -17,5 +17,11 @@ module Types
def can_delete
Ability.allowed?(current_user, :destroy_container_image, object)
end
+
+ def tags
+ object.tags
+ rescue Faraday::Error
+ raise ::Gitlab::Graphql::Errors::ResourceNotAvailable, 'We are having trouble connecting to the Container Registry. If this error persists, please review the troubleshooting documentation.'
+ end
end
end
diff --git a/app/graphql/types/container_repository_type.rb b/app/graphql/types/container_repository_type.rb
index 67093f57862..1fe5cf112f0 100644
--- a/app/graphql/types/container_repository_type.rb
+++ b/app/graphql/types/container_repository_type.rb
@@ -28,5 +28,11 @@ module Types
def project
Gitlab::Graphql::Loaders::BatchModelLoader.new(Project, object.project_id).find
end
+
+ def tags_count
+ object.tags_count
+ rescue Faraday::Error
+ raise ::Gitlab::Graphql::Errors::ResourceNotAvailable, 'We are having trouble connecting to the Container Registry. If this error persists, please review the troubleshooting documentation.'
+ end
end
end
diff --git a/app/graphql/types/customer_relations/contact_type.rb b/app/graphql/types/customer_relations/contact_type.rb
index 35b5bf45698..b5224a3e239 100644
--- a/app/graphql/types/customer_relations/contact_type.rb
+++ b/app/graphql/types/customer_relations/contact_type.rb
@@ -39,7 +39,7 @@ module Types
field :description,
GraphQL::Types::String,
null: true,
- description: 'Description or notes for the contact.'
+ description: 'Description of or notes for the contact.'
field :created_at,
Types::TimeType,
diff --git a/app/graphql/types/customer_relations/organization_type.rb b/app/graphql/types/customer_relations/organization_type.rb
index 0e091d4a9a3..9b22fa35b11 100644
--- a/app/graphql/types/customer_relations/organization_type.rb
+++ b/app/graphql/types/customer_relations/organization_type.rb
@@ -25,7 +25,7 @@ module Types
field :description,
GraphQL::Types::String,
null: true,
- description: 'Description or notes for the organization.'
+ description: 'Description of or notes for the organization.'
field :created_at,
Types::TimeType,
diff --git a/app/graphql/types/error_tracking/sentry_detailed_error_type.rb b/app/graphql/types/error_tracking/sentry_detailed_error_type.rb
index 79e789d3f8b..826ae61a1a3 100644
--- a/app/graphql/types/error_tracking/sentry_detailed_error_type.rb
+++ b/app/graphql/types/error_tracking/sentry_detailed_error_type.rb
@@ -13,6 +13,9 @@ module Types
field :id, GraphQL::Types::ID,
null: false,
description: 'ID (global ID) of the error.'
+ field :integrated, GraphQL::Types::Boolean,
+ null: true,
+ description: 'Error tracking backend.'
field :sentry_id, GraphQL::Types::String,
method: :id,
null: false,
diff --git a/app/graphql/types/group_type.rb b/app/graphql/types/group_type.rb
index 8fe4ba557ea..b1bbabcdaed 100644
--- a/app/graphql/types/group_type.rb
+++ b/app/graphql/types/group_type.rb
@@ -234,6 +234,10 @@ module Types
)
end
+ def dependency_proxy_setting
+ group.dependency_proxy_setting || group.create_dependency_proxy_setting
+ end
+
private
def group
diff --git a/app/graphql/types/issue_type.rb b/app/graphql/types/issue_type.rb
index c8db2b84ff2..3b0f93d8dc1 100644
--- a/app/graphql/types/issue_type.rb
+++ b/app/graphql/types/issue_type.rb
@@ -136,6 +136,9 @@ module Types
field :project_id, GraphQL::Types::Int, null: false, method: :project_id,
description: 'ID of the issue project.'
+ field :customer_relations_contacts, Types::CustomerRelations::ContactType.connection_type, null: true,
+ description: 'Customer relations contacts of the issue.'
+
def author
Gitlab::Graphql::Loaders::BatchModelLoader.new(User, object.author_id).find
end
diff --git a/app/graphql/types/issues/negated_issue_filter_input_type.rb b/app/graphql/types/issues/negated_issue_filter_input_type.rb
index 4f620a5b3d9..c8b7cdaa68e 100644
--- a/app/graphql/types/issues/negated_issue_filter_input_type.rb
+++ b/app/graphql/types/issues/negated_issue_filter_input_type.rb
@@ -29,6 +29,10 @@ module Types
argument :my_reaction_emoji, GraphQL::Types::String,
required: false,
description: 'Filter by reaction emoji applied by the current user.'
+ argument :types, [Types::IssueTypeEnum],
+ as: :issue_types,
+ description: 'Filters out issues by the given issue types.',
+ required: false
end
end
end
diff --git a/app/graphql/types/kas/agent_configuration_type.rb b/app/graphql/types/kas/agent_configuration_type.rb
new file mode 100644
index 00000000000..397a5739671
--- /dev/null
+++ b/app/graphql/types/kas/agent_configuration_type.rb
@@ -0,0 +1,17 @@
+# frozen_string_literal: true
+
+module Types
+ module Kas
+ # rubocop: disable Graphql/AuthorizeTypes
+ class AgentConfigurationType < BaseObject
+ graphql_name 'AgentConfiguration'
+ description 'Configuration details for an Agent'
+
+ field :agent_name,
+ GraphQL::Types::String,
+ null: true,
+ description: 'Name of the agent.'
+ end
+ # rubocop: enable Graphql/AuthorizeTypes
+ end
+end
diff --git a/app/graphql/types/kas/agent_connection_type.rb b/app/graphql/types/kas/agent_connection_type.rb
new file mode 100644
index 00000000000..9c6321bece9
--- /dev/null
+++ b/app/graphql/types/kas/agent_connection_type.rb
@@ -0,0 +1,32 @@
+# frozen_string_literal: true
+
+module Types
+ module Kas
+ # rubocop: disable Graphql/AuthorizeTypes
+ class AgentConnectionType < BaseObject
+ graphql_name 'ConnectedAgent'
+ description 'Connection details for an Agent'
+
+ field :connected_at,
+ Types::TimeType,
+ null: true,
+ description: 'When the connection was established.'
+
+ field :connection_id,
+ GraphQL::Types::BigInt,
+ null: true,
+ description: 'ID of the connection.'
+
+ field :metadata,
+ Types::Kas::AgentMetadataType,
+ method: :agent_meta,
+ null: true,
+ description: 'Information about the Agent.'
+
+ def connected_at
+ Time.at(object.connected_at.seconds)
+ end
+ end
+ # rubocop: enable Graphql/AuthorizeTypes
+ end
+end
diff --git a/app/graphql/types/kas/agent_metadata_type.rb b/app/graphql/types/kas/agent_metadata_type.rb
new file mode 100644
index 00000000000..4a3bb09b9e1
--- /dev/null
+++ b/app/graphql/types/kas/agent_metadata_type.rb
@@ -0,0 +1,33 @@
+# frozen_string_literal: true
+
+module Types
+ module Kas
+ # rubocop: disable Graphql/AuthorizeTypes
+ class AgentMetadataType < BaseObject
+ graphql_name 'AgentMetadata'
+ description 'Information about a connected Agent'
+
+ field :version,
+ GraphQL::Types::String,
+ null: true,
+ description: 'Agent version tag.'
+
+ field :commit,
+ GraphQL::Types::String,
+ method: :commit_id,
+ null: true,
+ description: 'Agent version commit.'
+
+ field :pod_namespace,
+ GraphQL::Types::String,
+ null: true,
+ description: 'Namespace of the pod running the Agent.'
+
+ field :pod_name,
+ GraphQL::Types::String,
+ null: true,
+ description: 'Name of the pod running the Agent.'
+ end
+ # rubocop: enable Graphql/AuthorizeTypes
+ 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 d685ac4d3c9..d4a1f2faa8d 100644
--- a/app/graphql/types/merge_requests/interacts_with_merge_request.rb
+++ b/app/graphql/types/merge_requests/interacts_with_merge_request.rb
@@ -14,7 +14,7 @@ module Types
end
def merge_request_interaction(parent:)
- merge_request = closest_parent(::Types::MergeRequestType, parent)
+ merge_request = closest_parent([::Types::MergeRequestType], parent)
return unless merge_request
Users::MergeRequestInteraction.new(user: object, merge_request: merge_request)
diff --git a/app/graphql/types/milestone_wildcard_id_enum.rb b/app/graphql/types/milestone_wildcard_id_enum.rb
index 12e8e07fb05..ad9651a26dc 100644
--- a/app/graphql/types/milestone_wildcard_id_enum.rb
+++ b/app/graphql/types/milestone_wildcard_id_enum.rb
@@ -8,6 +8,6 @@ module Types
value 'NONE', 'No milestone is assigned.'
value 'ANY', 'Milestone is assigned.'
value 'STARTED', 'Milestone assigned is open and started (start date <= today).'
- value 'UPCOMING', 'Milestone assigned is due closest in the future (due date > today).'
+ value 'UPCOMING', 'Milestone assigned is due in the future (due date > today).'
end
end
diff --git a/app/graphql/types/mutation_type.rb b/app/graphql/types/mutation_type.rb
index ea50af1c554..cd4c45d2942 100644
--- a/app/graphql/types/mutation_type.rb
+++ b/app/graphql/types/mutation_type.rb
@@ -31,13 +31,20 @@ module Types
mount_mutation Mutations::Boards::Lists::Update
mount_mutation Mutations::Boards::Lists::Destroy
mount_mutation Mutations::Branches::Create, calls_gitaly: true
+ mount_mutation Mutations::Clusters::Agents::Create
+ mount_mutation Mutations::Clusters::Agents::Delete
+ mount_mutation Mutations::Clusters::AgentTokens::Create
+ mount_mutation Mutations::Clusters::AgentTokens::Delete
mount_mutation Mutations::Commits::Create, calls_gitaly: true
mount_mutation Mutations::CustomEmoji::Create, feature_flag: :custom_emoji
mount_mutation Mutations::CustomEmoji::Destroy, feature_flag: :custom_emoji
+ mount_mutation Mutations::CustomerRelations::Contacts::Create
+ mount_mutation Mutations::CustomerRelations::Contacts::Update
mount_mutation Mutations::CustomerRelations::Organizations::Create
mount_mutation Mutations::CustomerRelations::Organizations::Update
mount_mutation Mutations::Discussions::ToggleResolve
mount_mutation Mutations::DependencyProxy::ImageTtlGroupPolicy::Update
+ mount_mutation Mutations::DependencyProxy::GroupSettings::Update
mount_mutation Mutations::Environments::CanaryIngress::Update
mount_mutation Mutations::Issues::Create
mount_mutation Mutations::Issues::SetAssignees
diff --git a/app/graphql/types/packages/nuget/metadatum_type.rb b/app/graphql/types/packages/nuget/metadatum_type.rb
index ed9d97724af..b58fd954a74 100644
--- a/app/graphql/types/packages/nuget/metadatum_type.rb
+++ b/app/graphql/types/packages/nuget/metadatum_type.rb
@@ -10,9 +10,9 @@ module Types
authorize :read_package
field :id, ::Types::GlobalIDType[::Packages::Nuget::Metadatum], null: false, description: 'ID of the metadatum.'
- field :license_url, GraphQL::Types::String, null: false, description: 'License URL of the Nuget package.'
- field :project_url, GraphQL::Types::String, null: false, description: 'Project URL of the Nuget package.'
- field :icon_url, GraphQL::Types::String, null: false, description: 'Icon URL of the Nuget package.'
+ field :license_url, GraphQL::Types::String, null: true, description: 'License URL of the Nuget package.'
+ field :project_url, GraphQL::Types::String, null: true, description: 'Project URL of the Nuget package.'
+ field :icon_url, GraphQL::Types::String, null: true, description: 'Icon URL of the Nuget package.'
end
end
end
diff --git a/app/graphql/types/packages/package_type.rb b/app/graphql/types/packages/package_type.rb
index f3fa79cc08c..9851c6aec7e 100644
--- a/app/graphql/types/packages/package_type.rb
+++ b/app/graphql/types/packages/package_type.rb
@@ -6,6 +6,8 @@ module Types
graphql_name 'Package'
description 'Represents a package in the Package Registry. Note that this type is in beta and susceptible to changes'
+ connection_type_class(Types::CountableConnectionType)
+
authorize :read_package
field :id, ::Types::GlobalIDType[::Packages::Package], null: false,
@@ -26,6 +28,7 @@ module Types
description: 'Other versions of the package.',
deprecated: { reason: 'This field is now only returned in the PackageDetailsType', milestone: '13.11' }
field :status, Types::Packages::PackageStatusEnum, null: false, description: 'Package status.'
+ field :can_destroy, GraphQL::Types::Boolean, null: false, description: 'Whether the user can destroy the package.'
def project
Gitlab::Graphql::Loaders::BatchModelLoader.new(Project, object.project_id).find
@@ -35,6 +38,10 @@ module Types
[]
end
+ def can_destroy
+ Ability.allowed?(current_user, :destroy_package, object)
+ end
+
# NOTE: This method must be kept in sync with the union
# type: `Types::Packages::MetadataType`.
#
diff --git a/app/graphql/types/permission_types/ci/runner.rb b/app/graphql/types/permission_types/ci/runner.rb
new file mode 100644
index 00000000000..2e92a4011e9
--- /dev/null
+++ b/app/graphql/types/permission_types/ci/runner.rb
@@ -0,0 +1,13 @@
+# frozen_string_literal: true
+
+module Types
+ module PermissionTypes
+ module Ci
+ class Runner < BasePermissionType
+ graphql_name 'RunnerPermissions'
+
+ abilities :read_runner, :update_runner, :delete_runner
+ end
+ end
+ end
+end
diff --git a/app/graphql/types/project_type.rb b/app/graphql/types/project_type.rb
index aef46a05a2f..791875242df 100644
--- a/app/graphql/types/project_type.rb
+++ b/app/graphql/types/project_type.rb
@@ -208,6 +208,7 @@ module Types
Types::Ci::PipelineType,
null: true,
description: 'Build pipeline of the project.',
+ extras: [:lookahead],
resolver: Resolvers::ProjectPipelineResolver
field :ci_cd_settings,
@@ -361,6 +362,25 @@ module Types
complexity: 5,
resolver: ::Resolvers::TimelogResolver
+ field :agent_configurations,
+ ::Types::Kas::AgentConfigurationType.connection_type,
+ null: true,
+ description: 'Agent configurations defined by the project',
+ resolver: ::Resolvers::Kas::AgentConfigurationsResolver
+
+ field :cluster_agent,
+ ::Types::Clusters::AgentType,
+ null: true,
+ description: 'Find a single cluster agent by name.',
+ resolver: ::Resolvers::Clusters::AgentsResolver.single
+
+ field :cluster_agents,
+ ::Types::Clusters::AgentType.connection_type,
+ extras: [:lookahead],
+ null: true,
+ description: 'Cluster agents associated with the project.',
+ resolver: ::Resolvers::Clusters::AgentsResolver
+
def label(title:)
BatchLoader::GraphQL.for(title).batch(key: project) do |titles, loader, args|
LabelsFinder
diff --git a/app/graphql/types/query_type.rb b/app/graphql/types/query_type.rb
index e02191fbf3e..ed4ddbb982b 100644
--- a/app/graphql/types/query_type.rb
+++ b/app/graphql/types/query_type.rb
@@ -136,6 +136,10 @@ module Types
complexity: 5,
resolver: ::Resolvers::TimelogResolver
+ field :board_list, ::Types::BoardListType,
+ null: true,
+ resolver: Resolvers::BoardListResolver
+
def design_management
DesignManagementObject.new(nil)
end
diff --git a/app/helpers/application_settings_helper.rb b/app/helpers/application_settings_helper.rb
index cf15433f2e5..2103a37180f 100644
--- a/app/helpers/application_settings_helper.rb
+++ b/app/helpers/application_settings_helper.rb
@@ -333,6 +333,9 @@ module ApplicationSettingsHelper
:throttle_authenticated_files_api_enabled,
:throttle_authenticated_files_api_period_in_seconds,
:throttle_authenticated_files_api_requests_per_period,
+ :throttle_authenticated_deprecated_api_enabled,
+ :throttle_authenticated_deprecated_api_period_in_seconds,
+ :throttle_authenticated_deprecated_api_requests_per_period,
:throttle_unauthenticated_api_enabled,
:throttle_unauthenticated_api_period_in_seconds,
:throttle_unauthenticated_api_requests_per_period,
@@ -345,6 +348,9 @@ module ApplicationSettingsHelper
:throttle_unauthenticated_files_api_enabled,
:throttle_unauthenticated_files_api_period_in_seconds,
:throttle_unauthenticated_files_api_requests_per_period,
+ :throttle_unauthenticated_deprecated_api_enabled,
+ :throttle_unauthenticated_deprecated_api_period_in_seconds,
+ :throttle_unauthenticated_deprecated_api_requests_per_period,
:throttle_protected_paths_enabled,
:throttle_protected_paths_period_in_seconds,
:throttle_protected_paths_requests_per_period,
@@ -400,7 +406,8 @@ module ApplicationSettingsHelper
:user_deactivation_emails_enabled,
:sidekiq_job_limiter_mode,
:sidekiq_job_limiter_compression_threshold_bytes,
- :sidekiq_job_limiter_limit_bytes
+ :sidekiq_job_limiter_limit_bytes,
+ :suggest_pipeline_enabled
].tap do |settings|
settings << :deactivate_dormant_users unless Gitlab.com?
end
@@ -464,10 +471,6 @@ module ApplicationSettingsHelper
}
end
- def show_documentation_base_url_field?
- Feature.enabled?(:help_page_documentation_redirect)
- end
-
def valid_runner_registrars
Gitlab::CurrentSettings.valid_runner_registrars
end
@@ -477,8 +480,6 @@ module ApplicationSettingsHelper
end
def pending_user_count
- return 0 if Gitlab::CurrentSettings.new_user_signups_cap.blank?
-
User.blocked_pending_approval.count
end
end
diff --git a/app/helpers/avatars_helper.rb b/app/helpers/avatars_helper.rb
index 4cfa1528d9b..dd852a68682 100644
--- a/app/helpers/avatars_helper.rb
+++ b/app/helpers/avatars_helper.rb
@@ -9,6 +9,10 @@ module AvatarsHelper
source_icon(group, options)
end
+ def topic_icon(topic, options = {})
+ source_icon(topic, options)
+ end
+
# Takes both user and email and returns the avatar_icon by
# user (preferred) or email.
def avatar_icon_for(user = nil, email = nil, size = nil, scale = 2, only_path: true)
diff --git a/app/helpers/ci/jobs_helper.rb b/app/helpers/ci/jobs_helper.rb
index 882302f05ad..d02fe3f20b0 100644
--- a/app/helpers/ci/jobs_helper.rb
+++ b/app/helpers/ci/jobs_helper.rb
@@ -7,7 +7,7 @@ module Ci
"endpoint" => project_job_path(@project, @build, format: :json),
"project_path" => @project.full_path,
"artifact_help_url" => help_page_path('user/gitlab_com/index.html', anchor: 'gitlab-cicd'),
- "deployment_help_url" => help_page_path('user/project/clusters/index.html', anchor: 'troubleshooting'),
+ "deployment_help_url" => help_page_path('user/project/clusters/deploy_to_cluster.html', anchor: 'troubleshooting'),
"runner_settings_url" => project_runners_path(@build.project, anchor: 'js-runners-settings'),
"page_path" => project_job_path(@project, @build),
"build_status" => @build.status,
diff --git a/app/helpers/ci/runners_helper.rb b/app/helpers/ci/runners_helper.rb
index c9231a4eff3..ec10610714b 100644
--- a/app/helpers/ci/runners_helper.rb
+++ b/app/helpers/ci/runners_helper.rb
@@ -77,7 +77,7 @@ module Ci
def toggle_shared_runners_settings_data(project)
{
is_enabled: "#{project.shared_runners_enabled?}",
- is_disabled_and_unoverridable: "#{project.group&.shared_runners_setting == 'disabled_and_unoverridable'}",
+ is_disabled_and_unoverridable: "#{project.group&.shared_runners_setting == Namespace::SR_DISABLED_AND_UNOVERRIDABLE}",
update_path: toggle_shared_runners_project_runners_path(project)
}
end
diff --git a/app/helpers/commits_helper.rb b/app/helpers/commits_helper.rb
index 53017beee85..ee5f4bb364a 100644
--- a/app/helpers/commits_helper.rb
+++ b/app/helpers/commits_helper.rb
@@ -17,6 +17,15 @@ module CommitsHelper
commit_person_link(commit, options.merge(source: :committer))
end
+ def commit_committer_avatar(committer, options = {})
+ user_avatar(options.merge({
+ user: committer,
+ user_name: committer.name,
+ user_email: committer.email,
+ css_class: 'd-none d-sm-inline-block float-none gl-mr-0! gl-vertical-align-text-bottom'
+ }))
+ end
+
def commit_to_html(commit, ref, project)
render 'projects/commits/commit.html',
commit: commit,
diff --git a/app/helpers/feature_flags_helper.rb b/app/helpers/feature_flags_helper.rb
index 2b8804bc07e..e12c6c605d2 100644
--- a/app/helpers/feature_flags_helper.rb
+++ b/app/helpers/feature_flags_helper.rb
@@ -11,8 +11,15 @@ module FeatureFlagsHelper
project.feature_flags_client_token
end
- def feature_flag_issues_links_endpoint(_project, _feature_flag, _user)
- ''
+ def edit_feature_flag_data
+ {
+ endpoint: project_feature_flag_path(@project, @feature_flag),
+ project_id: @project.id,
+ 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')
+ }
end
end
diff --git a/app/helpers/groups_helper.rb b/app/helpers/groups_helper.rb
index a24776eb2e4..30aaa0a5acc 100644
--- a/app/helpers/groups_helper.rb
+++ b/app/helpers/groups_helper.rb
@@ -109,7 +109,7 @@ module GroupsHelper
end
def prevent_sharing_groups_outside_hierarchy_help_text(group)
- s_("GroupSettings|This setting is only available on the top-level group and it applies to all subgroups. Groups that have already been shared with a group outside %{group} will still be shared, and this access will have to be revoked manually.").html_safe % { group: link_to_group(group) }
+ s_("GroupSettings|Available only on the top-level group. Applies to all subgroups. Groups already shared with a group outside %{group} are still shared unless removed manually.").html_safe % { group: link_to_group(group) }
end
def parent_group_options(current_group)
@@ -178,7 +178,7 @@ module GroupsHelper
end
def default_help
- s_("GroupSettings|This setting will be applied to all subgroups unless overridden by a group owner. Groups that already have access to the project will continue to have access unless removed manually.")
+ s_("GroupSettings|Applied to all subgroups unless overridden by a group owner. Groups already added to the project lose access.")
end
def ancestor_locked_but_you_can_override(group)
diff --git a/app/helpers/hooks_helper.rb b/app/helpers/hooks_helper.rb
index 2725d28c47c..c1dfd2b2cda 100644
--- a/app/helpers/hooks_helper.rb
+++ b/app/helpers/hooks_helper.rb
@@ -36,6 +36,15 @@ module HooksHelper
admin_hook_path(hook)
end
end
+
+ def hook_log_path(hook, hook_log)
+ case hook
+ when ProjectHook
+ hook_log.present.details_path
+ when SystemHook
+ admin_hook_hook_log_path(hook, hook_log)
+ end
+ end
end
HooksHelper.prepend_mod_with('HooksHelper')
diff --git a/app/helpers/integrations_helper.rb b/app/helpers/integrations_helper.rb
index 904508867d3..8819aa9e9cc 100644
--- a/app/helpers/integrations_helper.rb
+++ b/app/helpers/integrations_helper.rb
@@ -125,15 +125,6 @@ module IntegrationsHelper
!Gitlab.com?
end
- def integration_tabs(integration:)
- [
- { key: 'edit', text: _('Settings'), href: scoped_edit_integration_path(integration) },
- (
- { key: 'overrides', text: s_('Integrations|Projects using custom settings'), href: scoped_overrides_integration_path(integration) } if integration.instance_level?
- )
- ].compact
- end
-
def jira_issue_breadcrumb_link(issue_reference)
link_to '', { class: 'gl-display-flex gl-align-items-center gl-white-space-nowrap' } do
icon = image_tag image_path('illustrations/logos/jira.svg'), width: 15, height: 15, class: 'gl-mr-2'
diff --git a/app/helpers/issuables_helper.rb b/app/helpers/issuables_helper.rb
index f3cc46216e5..24c6ef8cd68 100644
--- a/app/helpers/issuables_helper.rb
+++ b/app/helpers/issuables_helper.rb
@@ -198,7 +198,7 @@ module IssuablesHelper
if count != -1
html << " " << content_tag(:span,
format_count(issuable_type, count, Gitlab::IssuablesCountForState::THRESHOLD),
- class: 'badge badge-muted badge-pill gl-badge gl-tab-counter-badge sm'
+ class: 'badge badge-muted badge-pill gl-badge gl-tab-counter-badge sm gl-display-none gl-sm-display-inline-flex'
)
end
diff --git a/app/helpers/issues_helper.rb b/app/helpers/issues_helper.rb
index 40e86b4623c..49f7d9aeef1 100644
--- a/app/helpers/issues_helper.rb
+++ b/app/helpers/issues_helper.rb
@@ -238,9 +238,10 @@ module IssuesHelper
)
end
- def group_issues_list_data(group, current_user, issues)
+ def group_issues_list_data(group, current_user, issues, projects)
common_issues_list_data(group, current_user).merge(
- has_any_issues: issues.to_a.any?.to_s
+ has_any_issues: issues.to_a.any?.to_s,
+ has_any_projects: any_projects?(projects).to_s
)
end
diff --git a/app/helpers/one_trust_helper.rb b/app/helpers/one_trust_helper.rb
new file mode 100644
index 00000000000..9f92a73a4d4
--- /dev/null
+++ b/app/helpers/one_trust_helper.rb
@@ -0,0 +1,10 @@
+# frozen_string_literal: true
+
+module OneTrustHelper
+ def one_trust_enabled?
+ Feature.enabled?(:ecomm_instrumentation, type: :ops) &&
+ Gitlab.config.extra.has_key?('one_trust_id') &&
+ Gitlab.config.extra.one_trust_id.present? &&
+ !current_user
+ end
+end
diff --git a/app/helpers/packages_helper.rb b/app/helpers/packages_helper.rb
index ebf30fb3538..c69d9eb1326 100644
--- a/app/helpers/packages_helper.rb
+++ b/app/helpers/packages_helper.rb
@@ -41,6 +41,7 @@ module PackagesHelper
def packages_list_data(type, resource)
{
resource_id: resource.id,
+ full_path: resource.full_path,
page_type: type,
empty_list_help_url: help_page_path('user/packages/package_registry/index'),
empty_list_illustration: image_path('illustrations/no-packages.svg'),
@@ -70,6 +71,7 @@ module PackagesHelper
can_delete: can?(current_user, :destroy_package, project).to_s,
svg_path: image_path('illustrations/no-packages.svg'),
npm_path: package_registry_instance_url(:npm),
+ npm_project_path: package_registry_project_url(project.id, :npm),
npm_help_path: help_page_path('user/packages/npm_registry/index'),
maven_path: package_registry_project_url(project.id, :maven),
maven_help_path: help_page_path('user/packages/maven_repository/index'),
diff --git a/app/helpers/projects/cluster_agents_helper.rb b/app/helpers/projects/cluster_agents_helper.rb
new file mode 100644
index 00000000000..20fa721cc3b
--- /dev/null
+++ b/app/helpers/projects/cluster_agents_helper.rb
@@ -0,0 +1,10 @@
+# frozen_string_literal: true
+
+module Projects::ClusterAgentsHelper
+ def js_cluster_agent_details_data(agent_name, project)
+ {
+ agent_name: agent_name,
+ project_path: project.full_path
+ }
+ end
+end
diff --git a/app/helpers/projects_helper.rb b/app/helpers/projects_helper.rb
index d7f1cd505e9..03e7fb5ffc4 100644
--- a/app/helpers/projects_helper.rb
+++ b/app/helpers/projects_helper.rb
@@ -20,16 +20,15 @@ module ProjectsHelper
end
def link_to_member_avatar(author, opts = {})
- default_opts = { size: 16, lazy_load: false }
+ default_opts = { size: 16 }
opts = default_opts.merge(opts)
classes = %W[avatar avatar-inline s#{opts[:size]}]
classes << opts[:avatar_class] if opts[:avatar_class]
avatar = avatar_icon_for_user(author, opts[:size])
- src = opts[:lazy_load] ? nil : avatar
- image_tag(src, width: opts[:size], class: classes, alt: '', "data-src" => avatar)
+ image_tag(avatar, width: opts[:size], class: classes, alt: '')
end
def author_content_tag(author, opts = {})
@@ -351,7 +350,7 @@ module ProjectsHelper
end
def show_terraform_banner?(project)
- project.repository_languages.with_programming_language('HCL').exists? && project.terraform_states.empty?
+ Feature.enabled?(:show_terraform_banner, type: :ops, default_enabled: true) && project.repository_languages.with_programming_language('HCL').exists? && project.terraform_states.empty?
end
def project_permissions_panel_data(project)
diff --git a/app/helpers/routing/pseudonymization_helper.rb b/app/helpers/routing/pseudonymization_helper.rb
index 1d9320f0106..b73e49803ae 100644
--- a/app/helpers/routing/pseudonymization_helper.rb
+++ b/app/helpers/routing/pseudonymization_helper.rb
@@ -6,7 +6,8 @@ module Routing
return unless Feature.enabled?(:mask_page_urls, type: :ops)
mask_params(Rails.application.routes.recognize_path(request.original_fullpath))
- rescue ActionController::RoutingError, URI::InvalidURIError
+ rescue ActionController::RoutingError, URI::InvalidURIError => e
+ Gitlab::ErrorTracking.track_exception(e, url: request.original_fullpath)
nil
end
@@ -27,7 +28,7 @@ module Routing
when 'groups'
"/namespace:#{group.id}"
when 'projects'
- "/namespace:#{project.namespace.id}/project:#{project.id}"
+ "/namespace:#{project.namespace_id}/project:#{project.id}"
when 'root'
''
else
@@ -43,7 +44,7 @@ module Routing
masked_url = "#{request.protocol}#{request.host_with_port}"
if request_params.has_key?(:project_id)
- masked_url += "/namespace:#{project.namespace.id}/project:#{project.id}/-/#{namespace_type}"
+ masked_url += "/namespace:#{project.namespace_id}/project:#{project.id}/-/#{namespace_type}"
end
if request_params.has_key?(:id)
diff --git a/app/helpers/search_helper.rb b/app/helpers/search_helper.rb
index b8e58e3afb1..cb28025c900 100644
--- a/app/helpers/search_helper.rb
+++ b/app/helpers/search_helper.rb
@@ -87,9 +87,9 @@ module SearchHelper
def search_entries_info_template(collection)
if collection.total_pages > 1
- s_("SearchResults|Showing %{from} - %{to} of %{count} %{scope} for%{term_element}").html_safe
+ s_("SearchResults|Showing %{from} - %{to} of %{count} %{scope} for %{term_element}").html_safe
else
- s_("SearchResults|Showing %{count} %{scope} for%{term_element}").html_safe
+ s_("SearchResults|Showing %{count} %{scope} for %{term_element}").html_safe
end
end
diff --git a/app/helpers/startupjs_helper.rb b/app/helpers/startupjs_helper.rb
index b595590c7c9..2e8f0cb7dbe 100644
--- a/app/helpers/startupjs_helper.rb
+++ b/app/helpers/startupjs_helper.rb
@@ -5,6 +5,13 @@ module StartupjsHelper
@graphql_startup_calls
end
+ def page_startup_graphql_headers
+ {
+ 'X-CSRF-Token' => form_authenticity_token,
+ 'x-gitlab-feature-category' => ::Gitlab::ApplicationContext.current_context_attribute(:feature_category).presence || ''
+ }
+ end
+
def add_page_startup_graphql_call(query, variables = {})
@graphql_startup_calls ||= []
file_location = File.join(Rails.root, "app/graphql/queries/#{query}.query.graphql")
diff --git a/app/helpers/tab_helper.rb b/app/helpers/tab_helper.rb
index e64e1c935dd..a6bb2f3b246 100644
--- a/app/helpers/tab_helper.rb
+++ b/app/helpers/tab_helper.rb
@@ -1,6 +1,67 @@
# frozen_string_literal: true
module TabHelper
+ # Navigation tabs helper
+
+ # Create a <gl-tabs> container
+ #
+ # Returns a `ul` element with classes that correspond to
+ # the <gl-tabs/> component. Can be populated by
+ # gl_tab_link_to elements.
+ #
+ # See more at: https://gitlab-org.gitlab.io/gitlab-ui/?path=/story/base-tabs-tab--default
+ def gl_tabs_nav(html_options = {}, &block)
+ gl_tabs_classes = %w[nav gl-tabs-nav]
+
+ html_options = html_options.merge(
+ class: [*html_options[:class], gl_tabs_classes].join(' '),
+ role: 'tablist'
+ )
+
+ content = capture(&block) if block_given?
+ content_tag(:ul, content, html_options)
+ end
+
+ # Create a <gl-tab> link
+ #
+ # When a tab is active it gets highlighted to indicate this is currently viewed tab.
+ # Internally `current_page?` is called to determine if this is the current tab.
+ #
+ # Usage is the same as "link_to", with the following additional options:
+ #
+ # html_options - The html_options hash (default: {})
+ # :item_active - Overrides the default state focing the "active" css classes (optional).
+ #
+ def gl_tab_link_to(name = nil, options = {}, html_options = {}, &block)
+ tab_class = 'nav-item'
+ link_classes = %w[nav-link gl-tab-nav-item]
+ active_link_classes = %w[active gl-tab-nav-item-active gl-tab-nav-item-active-indigo]
+
+ if block_given?
+ # Shift params to skip the omitted "name" param
+ html_options = options
+ options = name
+ end
+
+ html_options = html_options.merge(
+ class: [*html_options[:class], link_classes].join(' ')
+ )
+
+ if gl_tab_link_to_active?(options, html_options)
+ html_options[:class] = [*html_options[:class], active_link_classes].join(' ')
+ end
+
+ html_options = html_options.except(:item_active)
+
+ content_tag(:li, class: tab_class, role: 'presentation') do
+ if block_given?
+ link_to(options, html_options, &block)
+ else
+ link_to(name, options, html_options)
+ end
+ end
+ end
+
# Navigation link helper
#
# Returns an `li` element with an 'active' class if the supplied
@@ -12,7 +73,6 @@ module TabHelper
# :action - One or more action names to check (optional).
# :path - A shorthand path, such as 'dashboard#index', to check (optional).
# :html_options - Extra options to be passed to the list element (optional).
- # :unless - Callable object to skip rendering the 'active' class on `li` element (optional).
# block - An optional block that will become the contents of the returned
# `li` element.
#
@@ -57,11 +117,6 @@ module TabHelper
# nav_link(path: 'admin/appearances#show') { "Hello"}
# # => '<li class="active">Hello</li>'
#
- # # Shorthand path + unless
- # # Add `active` class when TreeController is requested, except the `index` action.
- # nav_link(controller: 'tree', unless: -> { action_name?('index') }) { "Hello" }
- # # => '<li class="active">Hello</li>'
- #
# # When `TreeController#index` is requested
# # => '<li>Hello</li>'
#
@@ -90,8 +145,6 @@ module TabHelper
end
def active_nav_link?(options)
- return false if options[:unless]&.call
-
controller = options.delete(:controller)
action = options.delete(:action)
@@ -148,4 +201,12 @@ module TabHelper
current_controller?(*controller) || current_action?(*action)
end
end
+
+ def gl_tab_link_to_active?(options, html_options)
+ if html_options.has_key?(:item_active)
+ return html_options[:item_active]
+ end
+
+ current_page?(options)
+ end
end
diff --git a/app/helpers/time_zone_helper.rb b/app/helpers/time_zone_helper.rb
index f92e32ff9b6..a0d9c8403e8 100644
--- a/app/helpers/time_zone_helper.rb
+++ b/app/helpers/time_zone_helper.rb
@@ -33,6 +33,8 @@ module TimeZoneHelper
end
def local_time(timezone)
+ return if timezone.blank?
+
time_zone_instance = ActiveSupport::TimeZone.new(timezone) || Time.zone
time_zone_instance.now.strftime("%-l:%M %p")
end
diff --git a/app/helpers/timeboxes_helper.rb b/app/helpers/timeboxes_helper.rb
index 0993e210f42..eca40572735 100644
--- a/app/helpers/timeboxes_helper.rb
+++ b/app/helpers/timeboxes_helper.rb
@@ -78,19 +78,6 @@ module TimeboxesHelper
end
# rubocop: enable CodeReuse/ActiveRecord
- # Show 'active' class if provided GET param matches check
- # `or_blank` allows the function to return 'active' when given an empty param
- # Could be refactored to be simpler but that may make it harder to read
- def milestone_class_for_state(param, check, match_blank_param = false)
- if match_blank_param
- 'active' if param.blank? || param == check
- elsif param == check
- 'active'
- else
- check
- end
- end
-
def milestone_progress_tooltip_text(milestone)
has_issues = milestone.total_issues_count > 0
diff --git a/app/helpers/user_callouts_helper.rb b/app/helpers/user_callouts_helper.rb
index 2c3dc243d85..1c67ca983fa 100644
--- a/app/helpers/user_callouts_helper.rb
+++ b/app/helpers/user_callouts_helper.rb
@@ -10,6 +10,7 @@ module UserCalloutsHelper
REGISTRATION_ENABLED_CALLOUT = 'registration_enabled_callout'
UNFINISHED_TAG_CLEANUP_CALLOUT = 'unfinished_tag_cleanup_callout'
INVITE_MEMBERS_BANNER = 'invite_members_banner'
+ SECURITY_NEWSLETTER_CALLOUT = 'security_newsletter_callout'
def show_gke_cluster_integration_callout?(project)
active_nav_link?(controller: sidebar_operations_paths) &&
@@ -64,6 +65,11 @@ module UserCalloutsHelper
!multiple_members?(group)
end
+ def show_security_newsletter_user_callout?
+ current_user&.admin? &&
+ !user_dismissed?(SECURITY_NEWSLETTER_CALLOUT)
+ end
+
private
def user_dismissed?(feature_name, ignore_dismissal_earlier_than = nil)
diff --git a/app/helpers/workhorse_helper.rb b/app/helpers/workhorse_helper.rb
index 8785c4cdcbb..4862282bc73 100644
--- a/app/helpers/workhorse_helper.rb
+++ b/app/helpers/workhorse_helper.rb
@@ -41,6 +41,15 @@ module WorkhorseHelper
head :ok
end
+ def send_dependency(token, url, filename)
+ headers.store(*Gitlab::Workhorse.send_dependency(token, url))
+ headers['Content-Disposition'] =
+ ActionDispatch::Http::ContentDisposition.format(disposition: 'attachment', filename: filename)
+ headers['Content-Type'] = 'application/gzip'
+
+ head :ok
+ end
+
def set_workhorse_internal_api_content_type
headers['Content-Type'] = Gitlab::Workhorse::INTERNAL_API_CONTENT_TYPE
end
diff --git a/app/models/analytics/cycle_analytics/issue_stage_event.rb b/app/models/analytics/cycle_analytics/issue_stage_event.rb
index 1da8973ff21..3e6ed86d534 100644
--- a/app/models/analytics/cycle_analytics/issue_stage_event.rb
+++ b/app/models/analytics/cycle_analytics/issue_stage_event.rb
@@ -3,9 +3,14 @@
module Analytics
module CycleAnalytics
class IssueStageEvent < ApplicationRecord
+ include StageEventModel
extend SuppressCompositePrimaryKeyWarning
validates(*%i[stage_event_hash_id issue_id group_id project_id start_event_timestamp], presence: true)
+
+ def self.issuable_id_column
+ :issue_id
+ end
end
end
end
diff --git a/app/models/analytics/cycle_analytics/merge_request_stage_event.rb b/app/models/analytics/cycle_analytics/merge_request_stage_event.rb
index d2f899ae933..d0ec3c4e8b9 100644
--- a/app/models/analytics/cycle_analytics/merge_request_stage_event.rb
+++ b/app/models/analytics/cycle_analytics/merge_request_stage_event.rb
@@ -3,9 +3,14 @@
module Analytics
module CycleAnalytics
class MergeRequestStageEvent < ApplicationRecord
+ include StageEventModel
extend SuppressCompositePrimaryKeyWarning
validates(*%i[stage_event_hash_id merge_request_id group_id project_id start_event_timestamp], presence: true)
+
+ def self.issuable_id_column
+ :merge_request_id
+ end
end
end
end
diff --git a/app/models/application_setting.rb b/app/models/application_setting.rb
index 5f16b990d01..5a8cbd8d71c 100644
--- a/app/models/application_setting.rb
+++ b/app/models/application_setting.rb
@@ -9,8 +9,6 @@ class ApplicationSetting < ApplicationRecord
include Sanitizable
ignore_columns %i[elasticsearch_shards elasticsearch_replicas], remove_with: '14.4', remove_after: '2021-09-22'
- ignore_column :seat_link_enabled, remove_with: '14.4', remove_after: '2021-09-22'
- ignore_column :cloud_license_enabled, remove_with: '14.4', remove_after: '2021-09-22'
INSTANCE_REVIEW_MIN_USERS = 50
GRAFANA_URL_ERROR_MESSAGE = 'Please check your Grafana URL setting in ' \
@@ -366,6 +364,10 @@ class ApplicationSetting < ApplicationRecord
validates :container_registry_expiration_policies_worker_capacity,
numericality: { only_integer: true, greater_than_or_equal_to: 0 }
+ validates :dependency_proxy_ttl_group_policy_worker_capacity,
+ allow_nil: false,
+ numericality: { only_integer: true, greater_than_or_equal_to: 0 }
+
validates :invisible_captcha_enabled,
inclusion: { in: [true, false], message: _('must be a boolean value') }
@@ -481,6 +483,8 @@ class ApplicationSetting < ApplicationRecord
validates :throttle_unauthenticated_packages_api_period_in_seconds
validates :throttle_unauthenticated_files_api_requests_per_period
validates :throttle_unauthenticated_files_api_period_in_seconds
+ validates :throttle_unauthenticated_deprecated_api_requests_per_period
+ validates :throttle_unauthenticated_deprecated_api_period_in_seconds
validates :throttle_authenticated_api_requests_per_period
validates :throttle_authenticated_api_period_in_seconds
validates :throttle_authenticated_git_lfs_requests_per_period
@@ -491,6 +495,8 @@ class ApplicationSetting < ApplicationRecord
validates :throttle_authenticated_packages_api_period_in_seconds
validates :throttle_authenticated_files_api_requests_per_period
validates :throttle_authenticated_files_api_period_in_seconds
+ validates :throttle_authenticated_deprecated_api_requests_per_period
+ validates :throttle_authenticated_deprecated_api_period_in_seconds
validates :throttle_protected_paths_requests_per_period
validates :throttle_protected_paths_period_in_seconds
end
diff --git a/app/models/application_setting_implementation.rb b/app/models/application_setting_implementation.rb
index 612fda158d3..7bdea36bb8a 100644
--- a/app/models/application_setting_implementation.rb
+++ b/app/models/application_setting_implementation.rb
@@ -159,6 +159,7 @@ module ApplicationSettingImplementation
spam_check_endpoint_enabled: false,
spam_check_endpoint_url: nil,
spam_check_api_key: nil,
+ suggest_pipeline_enabled: true,
terminal_max_session_time: 0,
throttle_authenticated_api_enabled: false,
throttle_authenticated_api_period_in_seconds: 3600,
@@ -175,6 +176,9 @@ module ApplicationSettingImplementation
throttle_authenticated_files_api_enabled: false,
throttle_authenticated_files_api_period_in_seconds: 15,
throttle_authenticated_files_api_requests_per_period: 500,
+ throttle_authenticated_deprecated_api_enabled: false,
+ throttle_authenticated_deprecated_api_period_in_seconds: 3600,
+ throttle_authenticated_deprecated_api_requests_per_period: 3600,
throttle_incident_management_notification_enabled: false,
throttle_incident_management_notification_per_period: 3600,
throttle_incident_management_notification_period_in_seconds: 3600,
@@ -193,6 +197,9 @@ module ApplicationSettingImplementation
throttle_unauthenticated_files_api_enabled: false,
throttle_unauthenticated_files_api_period_in_seconds: 15,
throttle_unauthenticated_files_api_requests_per_period: 125,
+ throttle_unauthenticated_deprecated_api_enabled: false,
+ throttle_unauthenticated_deprecated_api_period_in_seconds: 3600,
+ throttle_unauthenticated_deprecated_api_requests_per_period: 1800,
time_tracking_limit_to_hours: false,
two_factor_grace_period: 48,
unique_ips_limit_enabled: false,
diff --git a/app/models/audit_event.rb b/app/models/audit_event.rb
index f17fff742fe..a1c6793607f 100644
--- a/app/models/audit_event.rb
+++ b/app/models/audit_event.rb
@@ -71,7 +71,7 @@ class AuditEvent < ApplicationRecord
end
def lazy_author
- BatchLoader.for(author_id).batch(replace_methods: false) do |author_ids, loader|
+ BatchLoader.for(author_id).batch do |author_ids, loader|
User.select(:id, :name, :username).where(id: author_ids).find_each do |user|
loader.call(user.id, user)
end
diff --git a/app/models/award_emoji.rb b/app/models/award_emoji.rb
index d251b0adbd3..c8f6b9aaedb 100644
--- a/app/models/award_emoji.rb
+++ b/app/models/award_emoji.rb
@@ -66,5 +66,3 @@ class AwardEmoji < ApplicationRecord
awardable.try(:update_upvotes_count) if upvote?
end
end
-
-AwardEmoji.prepend_mod_with('AwardEmoji')
diff --git a/app/models/bulk_import.rb b/app/models/bulk_import.rb
index dee55675304..818ae04ba29 100644
--- a/app/models/bulk_import.rb
+++ b/app/models/bulk_import.rb
@@ -4,7 +4,8 @@
# projects to a GitLab instance. It associates the import with the responsible
# user.
class BulkImport < ApplicationRecord
- MINIMUM_GITLAB_MAJOR_VERSION = 14
+ MIN_MAJOR_VERSION = 14
+ MIN_MINOR_VERSION_FOR_PROJECT = 4
belongs_to :user, optional: false
@@ -34,6 +35,14 @@ class BulkImport < ApplicationRecord
end
end
+ def source_version_info
+ Gitlab::VersionInfo.parse(source_version)
+ end
+
+ def self.min_gl_version_for_project_migration
+ Gitlab::VersionInfo.new(MIN_MAJOR_VERSION, MIN_MINOR_VERSION_FOR_PROJECT)
+ end
+
def self.all_human_statuses
state_machine.states.map(&:human_name)
end
diff --git a/app/models/bulk_imports/entity.rb b/app/models/bulk_imports/entity.rb
index ab5d248ff8c..ecac4ab95f4 100644
--- a/app/models/bulk_imports/entity.rb
+++ b/app/models/bulk_imports/entity.rb
@@ -20,6 +20,8 @@
class BulkImports::Entity < ApplicationRecord
self.table_name = 'bulk_import_entities'
+ EXPORT_RELATIONS_URL = '/%{resource}/%{full_path}/export_relations'
+
belongs_to :bulk_import, optional: false
belongs_to :parent, class_name: 'BulkImports::Entity', optional: true
@@ -81,9 +83,9 @@ class BulkImports::Entity < ApplicationRecord
def pipelines
@pipelines ||= case source_type
when 'group_entity'
- BulkImports::Groups::Stage.pipelines
+ BulkImports::Groups::Stage.new(bulk_import).pipelines
when 'project_entity'
- BulkImports::Projects::Stage.pipelines
+ BulkImports::Projects::Stage.new(bulk_import).pipelines
end
end
@@ -102,6 +104,14 @@ class BulkImports::Entity < ApplicationRecord
end
end
+ def pluralized_name
+ source_type.gsub('_entity', '').pluralize
+ end
+
+ def export_relations_url_path
+ @export_relations_url_path ||= EXPORT_RELATIONS_URL % { resource: pluralized_name, full_path: encoded_source_full_path }
+ end
+
private
def validate_parent_is_a_group
diff --git a/app/models/bulk_imports/export.rb b/app/models/bulk_imports/export.rb
index 371b58dea03..8d4d31ee92d 100644
--- a/app/models/bulk_imports/export.rb
+++ b/app/models/bulk_imports/export.rb
@@ -53,7 +53,7 @@ module BulkImports
end
def relation_definition
- config.portable_tree[:include].find { |include| include[relation.to_sym] }
+ config.relation_definition_for(relation)
end
def config
diff --git a/app/models/bulk_imports/export_status.rb b/app/models/bulk_imports/export_status.rb
index ff165830cf1..abf064adaae 100644
--- a/app/models/bulk_imports/export_status.rb
+++ b/app/models/bulk_imports/export_status.rb
@@ -41,7 +41,7 @@ module BulkImports
end
def status_endpoint
- "/groups/#{entity.encoded_source_full_path}/export_relations/status"
+ File.join(entity.export_relations_url_path, 'status')
end
end
end
diff --git a/app/models/bulk_imports/file_transfer/base_config.rb b/app/models/bulk_imports/file_transfer/base_config.rb
index ddea7c3f64c..4d370315ad5 100644
--- a/app/models/bulk_imports/file_transfer/base_config.rb
+++ b/app/models/bulk_imports/file_transfer/base_config.rb
@@ -22,15 +22,25 @@ module BulkImports
end
def export_path
- strong_memoize(:export_path) do
- relative_path = File.join(base_export_path, SecureRandom.hex)
-
- ::Gitlab::ImportExport.export_path(relative_path: relative_path)
- end
+ @export_path ||= Dir.mktmpdir('bulk_imports')
end
def portable_relations
- import_export_config.dig(:tree, portable_class_sym).keys.map(&:to_s) - skipped_relations
+ tree_relations + file_relations - skipped_relations
+ end
+
+ def tree_relation?(relation)
+ tree_relations.include?(relation)
+ end
+
+ def file_relation?(relation)
+ file_relations.include?(relation)
+ end
+
+ def tree_relation_definition_for(relation)
+ return unless tree_relation?(relation)
+
+ portable_tree[:include].find { |include| include[relation.to_sym] }
end
private
@@ -44,7 +54,7 @@ module BulkImports
end
def import_export_config
- ::Gitlab::ImportExport::Config.new(config: import_export_yaml).to_h
+ @config ||= ::Gitlab::ImportExport::Config.new(config: import_export_yaml).to_h
end
def portable_class
@@ -63,8 +73,12 @@ module BulkImports
raise NotImplementedError
end
- def base_export_path
- raise NotImplementedError
+ def tree_relations
+ import_export_config.dig(:tree, portable_class_sym).keys.map(&:to_s)
+ end
+
+ def file_relations
+ []
end
def skipped_relations
diff --git a/app/models/bulk_imports/file_transfer/group_config.rb b/app/models/bulk_imports/file_transfer/group_config.rb
index 2266cbb484f..6766c00246b 100644
--- a/app/models/bulk_imports/file_transfer/group_config.rb
+++ b/app/models/bulk_imports/file_transfer/group_config.rb
@@ -3,16 +3,14 @@
module BulkImports
module FileTransfer
class GroupConfig < BaseConfig
- def base_export_path
- portable.full_path
- end
+ SKIPPED_RELATIONS = %w(members).freeze
def import_export_yaml
::Gitlab::ImportExport.group_config_file
end
def skipped_relations
- @skipped_relations ||= %w(members)
+ SKIPPED_RELATIONS
end
end
end
diff --git a/app/models/bulk_imports/file_transfer/project_config.rb b/app/models/bulk_imports/file_transfer/project_config.rb
index 8a57f51c1c5..9a0434da08a 100644
--- a/app/models/bulk_imports/file_transfer/project_config.rb
+++ b/app/models/bulk_imports/file_transfer/project_config.rb
@@ -3,16 +3,23 @@
module BulkImports
module FileTransfer
class ProjectConfig < BaseConfig
- def base_export_path
- portable.disk_path
- end
+ UPLOADS_RELATION = 'uploads'
+
+ SKIPPED_RELATIONS = %w(
+ project_members
+ group_members
+ ).freeze
def import_export_yaml
::Gitlab::ImportExport.config_file
end
+ def file_relations
+ [UPLOADS_RELATION]
+ end
+
def skipped_relations
- @skipped_relations ||= %w(project_members group_members)
+ SKIPPED_RELATIONS
end
end
end
diff --git a/app/models/bulk_imports/tracker.rb b/app/models/bulk_imports/tracker.rb
index c185470b1c2..9de3239ee0f 100644
--- a/app/models/bulk_imports/tracker.rb
+++ b/app/models/bulk_imports/tracker.rb
@@ -50,6 +50,8 @@ class BulkImports::Tracker < ApplicationRecord
event :start do
transition created: :started
+ # To avoid errors when re-starting a pipeline in case of network errors
+ transition started: :started
end
event :finish do
diff --git a/app/models/ci/bridge.rb b/app/models/ci/bridge.rb
index 97fb8233d34..50bda64d537 100644
--- a/app/models/ci/bridge.rb
+++ b/app/models/ci/bridge.rb
@@ -31,7 +31,7 @@ module Ci
next unless bridge.triggers_downstream_pipeline?
bridge.run_after_commit do
- ::Ci::CreateCrossProjectPipelineWorker.perform_async(bridge.id)
+ ::Ci::CreateDownstreamPipelineWorker.perform_async(bridge.id)
end
end
diff --git a/app/models/ci/build.rb b/app/models/ci/build.rb
index e2e24247679..990ef71a457 100644
--- a/app/models/ci/build.rb
+++ b/app/models/ci/build.rb
@@ -42,6 +42,10 @@ module Ci
has_many :trace_chunks, class_name: 'Ci::BuildTraceChunk', foreign_key: :build_id, inverse_of: :build
has_many :report_results, class_name: 'Ci::BuildReportResult', inverse_of: :build
+ # Projects::DestroyService destroys Ci::Pipelines, which use_fast_destroy on :job_artifacts
+ # before we delete builds. By doing this, the relation should be empty and not fire any
+ # DELETE queries when the Ci::Build is destroyed. The next step is to remove `dependent: :destroy`.
+ # Details: https://gitlab.com/gitlab-org/gitlab/-/issues/24644#note_689472685
has_many :job_artifacts, class_name: 'Ci::JobArtifact', foreign_key: :job_id, dependent: :destroy, inverse_of: :job # rubocop:disable Cop/ActiveRecordDependent
has_many :job_variables, class_name: 'Ci::JobVariable', foreign_key: :job_id
has_many :sourced_pipelines, class_name: 'Ci::Sources::Pipeline', foreign_key: :source_job_id
@@ -55,6 +59,8 @@ module Ci
has_one :runner_session, class_name: 'Ci::BuildRunnerSession', validate: true, inverse_of: :build
has_one :trace_metadata, class_name: 'Ci::BuildTraceMetadata', inverse_of: :build
+ has_many :terraform_state_versions, class_name: 'Terraform::StateVersion', dependent: :nullify, inverse_of: :build, foreign_key: :ci_build_id # rubocop:disable Cop/ActiveRecordDependent
+
accepts_nested_attributes_for :runner_session, update_only: true
accepts_nested_attributes_for :job_variables
@@ -64,8 +70,8 @@ module Ci
delegate :gitlab_deploy_token, to: :project
delegate :trigger_short_token, to: :trigger_request, allow_nil: true
- ignore_columns :id_convert_to_bigint, remove_with: '14.1', remove_after: '2021-07-22'
- ignore_columns :stage_id_convert_to_bigint, remove_with: '14.1', remove_after: '2021-07-22'
+ ignore_columns :id_convert_to_bigint, remove_with: '14.5', remove_after: '2021-10-22'
+ ignore_columns :stage_id_convert_to_bigint, remove_with: '14.5', remove_after: '2021-10-22'
##
# Since Gitlab 11.5, deployments records started being created right after
@@ -192,7 +198,6 @@ module Ci
add_authentication_token_field :token, encrypted: :required
before_save :ensure_token
- before_destroy { unscoped_project }
after_save :stick_build_if_status_changed
@@ -308,8 +313,10 @@ module Ci
end
after_transition pending: :running do |build|
- Gitlab::Database.allow_cross_database_modification_within_transaction(url: 'https://gitlab.com/gitlab-org/gitlab/-/issues/338867') do
- build.deployment&.run
+ unless build.update_deployment_after_transaction_commit?
+ Gitlab::Database.allow_cross_database_modification_within_transaction(url: 'https://gitlab.com/gitlab-org/gitlab/-/issues/338867') do
+ build.deployment&.run
+ end
end
build.run_after_commit do
@@ -332,8 +339,10 @@ module Ci
end
after_transition any => [:success] do |build|
- Gitlab::Database.allow_cross_database_modification_within_transaction(url: 'https://gitlab.com/gitlab-org/gitlab/-/issues/338867') do
- build.deployment&.succeed
+ unless build.update_deployment_after_transaction_commit?
+ Gitlab::Database.allow_cross_database_modification_within_transaction(url: 'https://gitlab.com/gitlab-org/gitlab/-/issues/338867') do
+ build.deployment&.succeed
+ end
end
build.run_after_commit do
@@ -346,12 +355,14 @@ module Ci
next unless build.project
next unless build.deployment
- begin
- Gitlab::Database.allow_cross_database_modification_within_transaction(url: 'https://gitlab.com/gitlab-org/gitlab/-/issues/338867') do
- build.deployment.drop!
+ unless build.update_deployment_after_transaction_commit?
+ begin
+ Gitlab::Database.allow_cross_database_modification_within_transaction(url: 'https://gitlab.com/gitlab-org/gitlab/-/issues/338867') do
+ build.deployment.drop!
+ end
+ rescue StandardError => e
+ Gitlab::ErrorTracking.track_and_raise_for_dev_exception(e, build_id: build.id)
end
- rescue StandardError => e
- Gitlab::ErrorTracking.track_and_raise_for_dev_exception(e, build_id: build.id)
end
true
@@ -370,14 +381,29 @@ module Ci
end
after_transition any => [:skipped, :canceled] do |build, transition|
- Gitlab::Database.allow_cross_database_modification_within_transaction(url: 'https://gitlab.com/gitlab-org/gitlab/-/issues/338867') do
- if transition.to_name == :skipped
- build.deployment&.skip
- else
- build.deployment&.cancel
+ unless build.update_deployment_after_transaction_commit?
+ Gitlab::Database.allow_cross_database_modification_within_transaction(url: 'https://gitlab.com/gitlab-org/gitlab/-/issues/338867') do
+ if transition.to_name == :skipped
+ build.deployment&.skip
+ else
+ build.deployment&.cancel
+ end
end
end
end
+
+ # Synchronize Deployment Status
+ # Please note that the data integirty is not assured because we can't use
+ # a database transaction due to DB decomposition.
+ after_transition do |build, transition|
+ next if transition.loopback?
+ next unless build.project
+ next unless build.update_deployment_after_transaction_commit?
+
+ build.run_after_commit do
+ build.deployment&.sync_status_with(build)
+ end
+ end
end
def self.build_matchers(project)
@@ -1094,6 +1120,12 @@ module Ci
runner&.instance_type?
end
+ def update_deployment_after_transaction_commit?
+ strong_memoize(:update_deployment_after_transaction_commit) do
+ Feature.enabled?(:update_deployment_after_transaction_commit, project, default_enabled: :yaml)
+ end
+ end
+
protected
def run_status_commit_hooks!
@@ -1108,7 +1140,7 @@ module Ci
return unless saved_change_to_status?
return unless running?
- ::Gitlab::Database::LoadBalancing::Sticking.stick(:build, id)
+ self.class.sticking.stick(:build, id)
end
def status_commit_hooks
@@ -1154,10 +1186,6 @@ module Ci
self.update(erased_by: user, erased_at: Time.current, artifacts_expire_at: nil)
end
- def unscoped_project
- @unscoped_project ||= Project.unscoped.find_by(id: project_id)
- end
-
def environment_url
options&.dig(:environment, :url) || persisted_environment&.external_url
end
diff --git a/app/models/ci/build_metadata.rb b/app/models/ci/build_metadata.rb
index 90237a4be52..0d6d6f7a6a5 100644
--- a/app/models/ci/build_metadata.rb
+++ b/app/models/ci/build_metadata.rb
@@ -37,8 +37,8 @@ module Ci
job_timeout_source: 4
}
- ignore_column :build_id_convert_to_bigint, remove_with: '14.2', remove_after: '2021-08-22'
- ignore_columns :id_convert_to_bigint, remove_with: '14.3', remove_after: '2021-09-22'
+ ignore_column :build_id_convert_to_bigint, remove_with: '14.5', remove_after: '2021-10-22'
+ ignore_columns :id_convert_to_bigint, remove_with: '14.5', remove_after: '2021-10-22'
def update_timeout_state
timeout = timeout_with_highest_precedence
diff --git a/app/models/ci/build_need.rb b/app/models/ci/build_need.rb
index 003659570b3..bf1470ca20f 100644
--- a/app/models/ci/build_need.rb
+++ b/app/models/ci/build_need.rb
@@ -5,8 +5,6 @@ module Ci
include BulkInsertSafe
include IgnorableColumns
- ignore_columns :build_id_convert_to_bigint, remove_with: '14.1', remove_after: '2021-07-22'
-
belongs_to :build, class_name: "Ci::Processable", foreign_key: :build_id, inverse_of: :needs
validates :build, presence: true
diff --git a/app/models/ci/build_runner_session.rb b/app/models/ci/build_runner_session.rb
index 45de47116cd..e12c0f82c99 100644
--- a/app/models/ci/build_runner_session.rb
+++ b/app/models/ci/build_runner_session.rb
@@ -6,8 +6,6 @@ module Ci
class BuildRunnerSession < Ci::ApplicationRecord
include IgnorableColumns
- ignore_columns :build_id_convert_to_bigint, remove_with: '14.1', remove_after: '2021-07-22'
-
TERMINAL_SUBPROTOCOL = 'terminal.gitlab.com'
DEFAULT_SERVICE_NAME = 'build'
DEFAULT_PORT_NAME = 'default_port'
diff --git a/app/models/ci/build_trace_chunk.rb b/app/models/ci/build_trace_chunk.rb
index 7a15d7ba940..6edb5ef4579 100644
--- a/app/models/ci/build_trace_chunk.rb
+++ b/app/models/ci/build_trace_chunk.rb
@@ -9,8 +9,6 @@ module Ci
include ::Gitlab::OptimisticLocking
include IgnorableColumns
- ignore_columns :build_id_convert_to_bigint, remove_with: '14.1', remove_after: '2021-07-22'
-
belongs_to :build, class_name: "Ci::Build", foreign_key: :build_id
default_value_for :data_store, :redis_trace_chunks
diff --git a/app/models/ci/build_trace_metadata.rb b/app/models/ci/build_trace_metadata.rb
index 901b84ceec6..1ffa0e31f99 100644
--- a/app/models/ci/build_trace_metadata.rb
+++ b/app/models/ci/build_trace_metadata.rb
@@ -37,8 +37,10 @@ module Ci
increment!(:archival_attempts, touch: :last_archival_attempt_at)
end
- def track_archival!(trace_artifact_id)
- update!(trace_artifact_id: trace_artifact_id, archived_at: Time.current)
+ def track_archival!(trace_artifact_id, checksum)
+ update!(trace_artifact_id: trace_artifact_id,
+ checksum: checksum,
+ archived_at: Time.current)
end
def archival_attempts_message
@@ -49,6 +51,11 @@ module Ci
end
end
+ def remote_checksum_valid?
+ checksum.present? &&
+ checksum == remote_checksum
+ end
+
private
def backoff
diff --git a/app/models/ci/job_token/project_scope_link.rb b/app/models/ci/job_token/project_scope_link.rb
index 99118f8090b..c2ab8ca0929 100644
--- a/app/models/ci/job_token/project_scope_link.rb
+++ b/app/models/ci/job_token/project_scope_link.rb
@@ -5,7 +5,7 @@
module Ci
module JobToken
- class ProjectScopeLink < ApplicationRecord
+ class ProjectScopeLink < Ci::ApplicationRecord
self.table_name = 'ci_job_token_project_scope_links'
belongs_to :source_project, class_name: 'Project'
diff --git a/app/models/ci/job_token/scope.rb b/app/models/ci/job_token/scope.rb
index 42cfdc21d66..3a5765aa00c 100644
--- a/app/models/ci/job_token/scope.rb
+++ b/app/models/ci/job_token/scope.rb
@@ -32,12 +32,15 @@ module Ci
def all_projects
Project.from_union([
Project.id_in(source_project),
- Project.where_exists(
- Ci::JobToken::ProjectScopeLink
- .from_project(source_project)
- .where('projects.id = ci_job_token_project_scope_links.target_project_id'))
+ Project.id_in(target_project_ids)
], remove_duplicates: false)
end
+
+ private
+
+ def target_project_ids
+ Ci::JobToken::ProjectScopeLink.from_project(source_project).pluck(:target_project_id)
+ end
end
end
end
diff --git a/app/models/ci/pipeline.rb b/app/models/ci/pipeline.rb
index 1a0cec3c935..0041ec5135c 100644
--- a/app/models/ci/pipeline.rb
+++ b/app/models/ci/pipeline.rb
@@ -82,7 +82,8 @@ module Ci
# Merge requests for which the current pipeline is running against
# the merge request's latest commit.
has_many :merge_requests_as_head_pipeline, foreign_key: "head_pipeline_id", class_name: 'MergeRequest'
-
+ has_many :package_build_infos, class_name: 'Packages::BuildInfo', dependent: :nullify, inverse_of: :pipeline # rubocop:disable Cop/ActiveRecordDependent
+ has_many :package_file_build_infos, class_name: 'Packages::PackageFileBuildInfo', dependent: :nullify, inverse_of: :pipeline # rubocop:disable Cop/ActiveRecordDependent
has_many :pending_builds, -> { pending }, foreign_key: :commit_id, class_name: 'Ci::Build', inverse_of: :pipeline
has_many :failed_builds, -> { latest.failed }, foreign_key: :commit_id, class_name: 'Ci::Build', inverse_of: :pipeline
has_many :retryable_builds, -> { latest.failed_or_canceled.includes(:project) }, foreign_key: :commit_id, class_name: 'Ci::Build', inverse_of: :pipeline
@@ -861,11 +862,6 @@ module Ci
self.duration = Gitlab::Ci::Pipeline::Duration.from_pipeline(self)
end
- def execute_hooks
- project.execute_hooks(pipeline_data, :pipeline_hooks) if project.has_active_hooks?(:pipeline_hooks)
- project.execute_integrations(pipeline_data, :pipeline_hooks) if project.has_active_integrations?(:pipeline_hooks)
- end
-
# All the merge requests for which the current pipeline runs/ran against
def all_merge_requests
@all_merge_requests ||=
@@ -929,9 +925,22 @@ module Ci
end
def environments_in_self_and_descendants
- environment_ids = self_and_descendants.joins(:deployments).select(:'deployments.environment_id')
+ if ::Feature.enabled?(:avoid_cross_joins_environments_in_self_and_descendants, default_enabled: :yaml)
+ # We limit to 100 unique environments for application safety.
+ # See: https://gitlab.com/gitlab-org/gitlab/-/issues/340781#note_699114700
+ expanded_environment_names =
+ builds_in_self_and_descendants.joins(:metadata)
+ .where.not('ci_builds_metadata.expanded_environment_name' => nil)
+ .distinct('ci_builds_metadata.expanded_environment_name')
+ .limit(100)
+ .pluck(:expanded_environment_name)
+
+ Environment.where(project: project, name: expanded_environment_names)
+ else
+ environment_ids = self_and_descendants.joins(:deployments).select(:'deployments.environment_id')
- Environment.where(id: environment_ids)
+ Environment.where(id: environment_ids)
+ end
end
# With multi-project and parent-child pipelines
@@ -1251,12 +1260,6 @@ module Ci
messages.build(severity: severity, content: content)
end
- def pipeline_data
- strong_memoize(:pipeline_data) do
- Gitlab::DataBuilder::Pipeline.build(self)
- end
- end
-
def merge_request_diff_sha
return unless merge_request?
diff --git a/app/models/ci/processable.rb b/app/models/ci/processable.rb
index 30d335fd7d5..372df8cc264 100644
--- a/app/models/ci/processable.rb
+++ b/app/models/ci/processable.rb
@@ -58,7 +58,8 @@ module Ci
after_transition any => ::Ci::Processable.completed_statuses do |processable|
next unless processable.with_resource_group?
- next unless processable.resource_group.release_resource_from(processable)
+
+ processable.resource_group.release_resource_from(processable)
processable.run_after_commit do
Ci::ResourceGroups::AssignResourceFromResourceGroupWorker
diff --git a/app/models/ci/resource_group.rb b/app/models/ci/resource_group.rb
index 8a7456041e6..6d25f747a9d 100644
--- a/app/models/ci/resource_group.rb
+++ b/app/models/ci/resource_group.rb
@@ -14,6 +14,12 @@ module Ci
before_create :ensure_resource
+ enum process_mode: {
+ unordered: 0,
+ oldest_first: 1,
+ newest_first: 2
+ }
+
##
# NOTE: This is concurrency-safe method that the subquery in the `UPDATE`
# works as explicit locking.
@@ -25,8 +31,34 @@ module Ci
resources.retained_by(processable).update_all(build_id: nil) > 0
end
+ def upcoming_processables
+ if unordered?
+ processables.waiting_for_resource
+ elsif oldest_first?
+ processables.waiting_for_resource_or_upcoming
+ .order(Arel.sql("commit_id ASC, #{sort_by_job_status}"))
+ elsif newest_first?
+ processables.waiting_for_resource_or_upcoming
+ .order(Arel.sql("commit_id DESC, #{sort_by_job_status}"))
+ else
+ Ci::Processable.none
+ end
+ end
+
private
+ # In order to avoid deadlock, we do NOT specify the job execution order in the same pipeline.
+ # The system processes wherever ready to transition to `pending` status from `waiting_for_resource`.
+ # See https://gitlab.com/gitlab-org/gitlab/-/issues/202186 for more information.
+ def sort_by_job_status
+ <<~SQL
+ CASE status
+ WHEN 'waiting_for_resource' THEN 0
+ ELSE 1
+ END ASC
+ SQL
+ end
+
def ensure_resource
# Currently we only support one resource per group, which means
# maximum one build can be set to the resource group, thus builds
diff --git a/app/models/ci/runner.rb b/app/models/ci/runner.rb
index 4aa232ad26b..2f718ad7582 100644
--- a/app/models/ci/runner.rb
+++ b/app/models/ci/runner.rb
@@ -51,7 +51,7 @@ module Ci
has_many :runner_projects, inverse_of: :runner, autosave: true, dependent: :destroy # rubocop:disable Cop/ActiveRecordDependent
has_many :projects, through: :runner_projects
has_many :runner_namespaces, inverse_of: :runner, autosave: true
- has_many :groups, through: :runner_namespaces
+ has_many :groups, through: :runner_namespaces, disable_joins: true
has_one :last_build, -> { order('id DESC') }, class_name: 'Ci::Build'
@@ -246,7 +246,7 @@ module Ci
begin
transaction do
- self.projects << project
+ self.runner_projects << ::Ci::RunnerProject.new(project: project, runner: self)
self.save!
end
rescue ActiveRecord::RecordInvalid => e
@@ -280,7 +280,7 @@ module Ci
end
def belongs_to_more_than_one_project?
- self.projects.limit(2).count(:all) > 1
+ runner_projects.limit(2).count(:all) > 1
end
def assigned_to_group?
@@ -309,7 +309,9 @@ module Ci
end
def only_for?(project)
- projects == [project]
+ ::Gitlab::Database.allow_cross_joins_across_databases(url: 'https://gitlab.com/gitlab-org/gitlab/-/issues/338659') do
+ projects == [project]
+ end
end
def short_sha
@@ -344,7 +346,7 @@ module Ci
# intention here is not to execute `Ci::RegisterJobService#execute` on
# the primary database.
#
- ::Gitlab::Database::LoadBalancing::Sticking.stick(:runner, id)
+ ::Ci::Runner.sticking.stick(:runner, id)
SecureRandom.hex.tap do |new_update|
::Gitlab::Workhorse.set_key_and_notify(runner_queue_key, new_update,
@@ -428,10 +430,8 @@ module Ci
end
def no_projects
- ::Gitlab::Database.allow_cross_joins_across_databases(url: 'https://gitlab.com/gitlab-org/gitlab/-/issues/338659') do
- if projects.any?
- errors.add(:runner, 'cannot have projects assigned')
- end
+ if runner_projects.any?
+ errors.add(:runner, 'cannot have projects assigned')
end
end
@@ -444,14 +444,16 @@ module Ci
end
def any_project
- unless projects.any?
+ unless runner_projects.any?
errors.add(:runner, 'needs to be assigned to at least one project')
end
end
def exactly_one_group
- unless groups.one?
- errors.add(:runner, 'needs to be assigned to exactly one group')
+ ::Gitlab::Database.allow_cross_joins_across_databases(url: 'https://gitlab.com/gitlab-org/gitlab/-/issues/338659') do
+ unless groups.one?
+ errors.add(:runner, 'needs to be assigned to exactly one group')
+ end
end
end
diff --git a/app/models/ci/runner_namespace.rb b/app/models/ci/runner_namespace.rb
index d1353b97ed9..52a31863fb2 100644
--- a/app/models/ci/runner_namespace.rb
+++ b/app/models/ci/runner_namespace.rb
@@ -7,7 +7,6 @@ module Ci
self.limit_name = 'ci_registered_group_runners'
self.limit_scope = :group
self.limit_relation = :recent_runners
- self.limit_feature_flag = :ci_runner_limits
self.limit_feature_flag_for_override = :ci_runner_limits_override
belongs_to :runner, inverse_of: :runner_namespaces
diff --git a/app/models/ci/runner_project.rb b/app/models/ci/runner_project.rb
index e1c435e9b1f..148a29a0f8b 100644
--- a/app/models/ci/runner_project.rb
+++ b/app/models/ci/runner_project.rb
@@ -7,7 +7,6 @@ module Ci
self.limit_name = 'ci_registered_project_runners'
self.limit_scope = :project
self.limit_relation = :recent_runners
- self.limit_feature_flag = :ci_runner_limits
self.limit_feature_flag_for_override = :ci_runner_limits_override
belongs_to :runner, inverse_of: :runner_projects
diff --git a/app/models/ci/stage.rb b/app/models/ci/stage.rb
index 39e26bf2785..131e18adf62 100644
--- a/app/models/ci/stage.rb
+++ b/app/models/ci/stage.rb
@@ -8,8 +8,6 @@ module Ci
include Presentable
include IgnorableColumns
- ignore_column :id_convert_to_bigint, remove_with: '14.2', remove_after: '2021-08-22'
-
enum status: Ci::HasStatus::STATUSES_ENUM
belongs_to :project
diff --git a/app/models/clusters/agents/group_authorization.rb b/app/models/clusters/agents/group_authorization.rb
index 74c0cec3b7e..28a711aaf17 100644
--- a/app/models/clusters/agents/group_authorization.rb
+++ b/app/models/clusters/agents/group_authorization.rb
@@ -10,7 +10,9 @@ module Clusters
validates :config, json_schema: { filename: 'cluster_agent_authorization_configuration' }
- delegate :project, to: :agent
+ def config_project
+ agent.project
+ end
end
end
end
diff --git a/app/models/clusters/agents/implicit_authorization.rb b/app/models/clusters/agents/implicit_authorization.rb
index 967cc686045..9f7f653ed65 100644
--- a/app/models/clusters/agents/implicit_authorization.rb
+++ b/app/models/clusters/agents/implicit_authorization.rb
@@ -6,12 +6,15 @@ module Clusters
attr_reader :agent
delegate :id, to: :agent, prefix: true
- delegate :project, to: :agent
def initialize(agent:)
@agent = agent
end
+ def config_project
+ agent.project
+ end
+
def config
nil
end
diff --git a/app/models/clusters/agents/project_authorization.rb b/app/models/clusters/agents/project_authorization.rb
index 1c71a0a432a..f6d19086751 100644
--- a/app/models/clusters/agents/project_authorization.rb
+++ b/app/models/clusters/agents/project_authorization.rb
@@ -9,6 +9,10 @@ module Clusters
belongs_to :project, class_name: '::Project', optional: false
validates :config, json_schema: { filename: 'cluster_agent_authorization_configuration' }
+
+ def config_project
+ agent.project
+ end
end
end
end
diff --git a/app/models/clusters/applications/runner.rb b/app/models/clusters/applications/runner.rb
index 993ccb33655..7cef92ce81a 100644
--- a/app/models/clusters/applications/runner.rb
+++ b/app/models/clusters/applications/runner.rb
@@ -72,7 +72,7 @@ module Clusters
if cluster.group_type?
attributes[:groups] = [group]
elsif cluster.project_type?
- attributes[:projects] = [project]
+ attributes[:runner_projects] = [::Ci::RunnerProject.new(project: project)]
end
attributes
diff --git a/app/models/clusters/integrations/elastic_stack.rb b/app/models/clusters/integrations/elastic_stack.rb
index 565d268259a..97d73d252b9 100644
--- a/app/models/clusters/integrations/elastic_stack.rb
+++ b/app/models/clusters/integrations/elastic_stack.rb
@@ -14,6 +14,8 @@ module Clusters
validates :cluster, presence: true
validates :enabled, inclusion: { in: [true, false] }
+ scope :enabled, -> { where(enabled: true) }
+
def available?
enabled
end
diff --git a/app/models/clusters/integrations/prometheus.rb b/app/models/clusters/integrations/prometheus.rb
index 3f2c47d48e6..d745a49afc1 100644
--- a/app/models/clusters/integrations/prometheus.rb
+++ b/app/models/clusters/integrations/prometheus.rb
@@ -21,6 +21,8 @@ module Clusters
default_value_for(:alert_manager_token) { SecureRandom.hex }
+ scope :enabled, -> { where(enabled: true) }
+
after_destroy do
run_after_commit do
deactivate_project_integrations
diff --git a/app/models/commit.rb b/app/models/commit.rb
index 6c8b4ae1139..553681ee960 100644
--- a/app/models/commit.rb
+++ b/app/models/commit.rb
@@ -133,7 +133,7 @@ class Commit
end
def lazy(container, oid)
- BatchLoader.for({ container: container, oid: oid }).batch(replace_methods: false) do |items, loader|
+ BatchLoader.for({ container: container, oid: oid }).batch do |items, loader|
items_by_container = items.group_by { |i| i[:container] }
items_by_container.each do |container, commit_ids|
diff --git a/app/models/commit_status.rb b/app/models/commit_status.rb
index 8cba3d04502..43427e2ebc7 100644
--- a/app/models/commit_status.rb
+++ b/app/models/commit_status.rb
@@ -62,6 +62,9 @@ class CommitStatus < Ci::ApplicationRecord
scope :updated_before, ->(lookback:, timeout:) {
where('(ci_builds.created_at BETWEEN ? AND ?) AND (ci_builds.updated_at BETWEEN ? AND ?)', lookback, timeout, lookback, timeout)
}
+ scope :scheduled_at_before, ->(date) {
+ where('ci_builds.scheduled_at IS NOT NULL AND ci_builds.scheduled_at < ?', date)
+ }
# 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/stage.rb b/app/models/concerns/analytics/cycle_analytics/stage.rb
index 7bb6004ca83..d9e6756ab86 100644
--- a/app/models/concerns/analytics/cycle_analytics/stage.rb
+++ b/app/models/concerns/analytics/cycle_analytics/stage.rb
@@ -27,7 +27,8 @@ module Analytics
alias_attribute :custom_stage?, :custom
scope :default_stages, -> { where(custom: false) }
scope :ordered, -> { order(:relative_position, :id) }
- scope :for_list, -> { includes(:start_event_label, :end_event_label).ordered }
+ 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
diff --git a/app/models/concerns/analytics/cycle_analytics/stage_event_model.rb b/app/models/concerns/analytics/cycle_analytics/stage_event_model.rb
new file mode 100644
index 00000000000..7462e1e828b
--- /dev/null
+++ b/app/models/concerns/analytics/cycle_analytics/stage_event_model.rb
@@ -0,0 +1,54 @@
+# frozen_string_literal: true
+
+module Analytics
+ module CycleAnalytics
+ module StageEventModel
+ extend ActiveSupport::Concern
+
+ class_methods do
+ def upsert_data(data)
+ upsert_values = data.map do |row|
+ row.values_at(
+ :stage_event_hash_id,
+ :issuable_id,
+ :group_id,
+ :project_id,
+ :author_id,
+ :milestone_id,
+ :start_event_timestamp,
+ :end_event_timestamp
+ )
+ end
+
+ value_list = Arel::Nodes::ValuesList.new(upsert_values).to_sql
+
+ query = <<~SQL
+ INSERT INTO #{quoted_table_name}
+ (
+ stage_event_hash_id,
+ #{connection.quote_column_name(issuable_id_column)},
+ group_id,
+ project_id,
+ milestone_id,
+ author_id,
+ start_event_timestamp,
+ end_event_timestamp
+ )
+ #{value_list}
+ ON CONFLICT(stage_event_hash_id, #{issuable_id_column})
+ DO UPDATE SET
+ group_id = excluded.group_id,
+ project_id = excluded.project_id,
+ start_event_timestamp = excluded.start_event_timestamp,
+ end_event_timestamp = excluded.end_event_timestamp,
+ milestone_id = excluded.milestone_id,
+ author_id = excluded.author_id
+ SQL
+
+ result = connection.execute(query)
+ result.cmd_tuples
+ end
+ end
+ end
+ end
+end
diff --git a/app/models/concerns/avatarable.rb b/app/models/concerns/avatarable.rb
index 84a74386ff7..b32502c3ee2 100644
--- a/app/models/concerns/avatarable.rb
+++ b/app/models/concerns/avatarable.rb
@@ -18,6 +18,7 @@ module Avatarable
prepend ShadowMethods
include ObjectStorage::BackgroundMove
include Gitlab::Utils::StrongMemoize
+ include ApplicationHelper
validate :avatar_type, if: ->(user) { user.avatar.present? && user.avatar_changed? }
validates :avatar, file_size: { maximum: MAXIMUM_FILE_SIZE }, if: :avatar_changed?
@@ -110,7 +111,7 @@ module Avatarable
def retrieve_upload_from_batch(identifier)
BatchLoader.for(identifier: identifier, model: self)
- .batch(key: self.class, cache: true, replace_methods: false) do |upload_params, loader, args|
+ .batch(key: self.class) do |upload_params, loader, args|
model_class = args[:key]
paths = upload_params.flat_map do |params|
params[:model].upload_paths(params[:identifier])
diff --git a/app/models/concerns/bulk_insert_safe.rb b/app/models/concerns/bulk_insert_safe.rb
index 908f0b6a7e2..6c3093ca916 100644
--- a/app/models/concerns/bulk_insert_safe.rb
+++ b/app/models/concerns/bulk_insert_safe.rb
@@ -51,6 +51,12 @@ module BulkInsertSafe
PrimaryKeySetError = Class.new(StandardError)
class_methods do
+ def insert_all_proxy_class
+ @insert_all_proxy_class ||= Class.new(self) do
+ attr_readonly :created_at
+ end
+ end
+
def set_callback(name, *args)
unless _bulk_insert_callback_allowed?(name, args)
raise MethodNotAllowedError,
@@ -138,7 +144,7 @@ module BulkInsertSafe
when nil
false
else
- raise ArgumentError, "returns needs to be :ids or nil"
+ returns
end
# Handle insertions for tables with a composite primary key
@@ -153,9 +159,9 @@ module BulkInsertSafe
item_batch, validate, &handle_attributes)
ActiveRecord::InsertAll
- .new(self, attributes, on_duplicate: on_duplicate, returning: returning, unique_by: unique_by)
+ .new(insert_all_proxy_class, attributes, on_duplicate: on_duplicate, returning: returning, unique_by: unique_by)
.execute
- .pluck(primary_key)
+ .cast_values(insert_all_proxy_class.attribute_types).to_a
end
end
end
diff --git a/app/models/concerns/checksummable.rb b/app/models/concerns/checksummable.rb
index 056abafd0ce..9812c62fcc4 100644
--- a/app/models/concerns/checksummable.rb
+++ b/app/models/concerns/checksummable.rb
@@ -8,8 +8,12 @@ module Checksummable
Zlib.crc32(data)
end
- def hexdigest(path)
+ def sha256_hexdigest(path)
::Digest::SHA256.file(path).hexdigest
end
+
+ def md5_hexdigest(path)
+ ::Digest::MD5.file(path).hexdigest
+ end
end
end
diff --git a/app/models/concerns/ci/has_status.rb b/app/models/concerns/ci/has_status.rb
index c1299e3d468..8d715279da8 100644
--- a/app/models/concerns/ci/has_status.rb
+++ b/app/models/concerns/ci/has_status.rb
@@ -95,6 +95,7 @@ module Ci
scope :failed_or_canceled, -> { with_status(:failed, :canceled) }
scope :complete, -> { with_status(completed_statuses) }
scope :incomplete, -> { without_statuses(completed_statuses) }
+ scope :waiting_for_resource_or_upcoming, -> { with_status(:created, :scheduled, :waiting_for_resource) }
scope :cancelable, -> do
where(status: [:running, :waiting_for_resource, :preparing, :pending, :created, :scheduled])
diff --git a/app/models/concerns/ci/metadatable.rb b/app/models/concerns/ci/metadatable.rb
index ec86746ae54..344f5aa4cd5 100644
--- a/app/models/concerns/ci/metadatable.rb
+++ b/app/models/concerns/ci/metadatable.rb
@@ -20,6 +20,7 @@ module Ci
delegate :interruptible, to: :metadata, prefix: false, allow_nil: true
delegate :has_exposed_artifacts?, to: :metadata, prefix: false, allow_nil: true
delegate :environment_auto_stop_in, to: :metadata, prefix: false, allow_nil: true
+ delegate :runner_features, to: :metadata, prefix: false, allow_nil: false
before_create :ensure_metadata
end
diff --git a/app/models/concerns/enums/ci/commit_status.rb b/app/models/concerns/enums/ci/commit_status.rb
index 7f46e44697e..1b4cc14f4a2 100644
--- a/app/models/concerns/enums/ci/commit_status.rb
+++ b/app/models/concerns/enums/ci/commit_status.rb
@@ -27,6 +27,7 @@ module Enums
no_matching_runner: 18, # not used anymore, but cannot be deleted because of old data
trace_size_exceeded: 19,
builds_disabled: 20,
+ environment_creation_failure: 21,
insufficient_bridge_permissions: 1_001,
downstream_bridge_project_not_found: 1_002,
invalid_bridge_trigger: 1_003,
diff --git a/app/models/concerns/has_repository.rb b/app/models/concerns/has_repository.rb
index 9218ba47d20..d614d6c4584 100644
--- a/app/models/concerns/has_repository.rb
+++ b/app/models/concerns/has_repository.rb
@@ -72,12 +72,10 @@ module HasRepository
end
def default_branch
- @default_branch ||= repository.root_ref || default_branch_from_preferences
+ @default_branch ||= repository.empty? ? default_branch_from_preferences : repository.root_ref
end
def default_branch_from_preferences
- return unless empty_repo?
-
(default_branch_from_group_preferences || Gitlab::CurrentSettings.default_branch_name).presence
end
diff --git a/app/models/concerns/integrations/has_data_fields.rb b/app/models/concerns/integrations/has_data_fields.rb
index 1709b56080e..25a1d855119 100644
--- a/app/models/concerns/integrations/has_data_fields.rb
+++ b/app/models/concerns/integrations/has_data_fields.rb
@@ -45,7 +45,6 @@ module Integrations
included do
has_one :issue_tracker_data, autosave: true, inverse_of: :integration, foreign_key: :service_id, class_name: 'Integrations::IssueTrackerData'
has_one :jira_tracker_data, autosave: true, inverse_of: :integration, foreign_key: :service_id, class_name: 'Integrations::JiraTrackerData'
- has_one :open_project_tracker_data, autosave: true, inverse_of: :integration, foreign_key: :service_id, class_name: 'Integrations::OpenProjectTrackerData'
has_one :zentao_tracker_data, autosave: true, inverse_of: :integration, foreign_key: :integration_id, class_name: 'Integrations::ZentaoTrackerData'
def data_fields
diff --git a/app/models/concerns/issue_available_features.rb b/app/models/concerns/issue_available_features.rb
index 933e8b5f687..209456f8b67 100644
--- a/app/models/concerns/issue_available_features.rb
+++ b/app/models/concerns/issue_available_features.rb
@@ -12,7 +12,8 @@ module IssueAvailableFeatures
{
assignee: %w(issue incident),
confidentiality: %w(issue incident),
- time_tracking: %w(issue incident)
+ time_tracking: %w(issue incident),
+ move_and_clone: %w(issue incident)
}.with_indifferent_access
end
end
diff --git a/app/models/concerns/packages/debian/distribution.rb b/app/models/concerns/packages/debian/distribution.rb
index 196bec04be6..ff52769fce8 100644
--- a/app/models/concerns/packages/debian/distribution.rb
+++ b/app/models/concerns/packages/debian/distribution.rb
@@ -96,18 +96,8 @@ module Packages
architectures.pluck(:name).sort
end
- def needs_update?
- !file.exists? || time_duration_expired?
- end
-
private
- def time_duration_expired?
- return false unless valid_time_duration_seconds.present?
-
- updated_at + valid_time_duration_seconds.seconds + 6.hours < Time.current
- end
-
def unique_codename_and_suite
errors.add(:codename, _('has already been taken as Suite')) if codename_exists_as_suite?
errors.add(:suite, _('has already been taken as Codename')) if suite_exists_as_codename?
diff --git a/app/models/concerns/restricted_signup.rb b/app/models/concerns/restricted_signup.rb
index 587f8c35ff7..cf97be21165 100644
--- a/app/models/concerns/restricted_signup.rb
+++ b/app/models/concerns/restricted_signup.rb
@@ -7,15 +7,49 @@ module RestrictedSignup
def validate_admin_signup_restrictions(email)
return if allowed_domain?(email)
+ error_type = fetch_error_type(email)
+
+ return unless error_type.present?
+
+ [
+ signup_email_invalid_message,
+ error_message[created_by_key][error_type]
+ ].join(' ')
+ end
+
+ def fetch_error_type(email)
if allowlist_present?
- return _('domain is not authorized for sign-up.')
+ :allowlist
elsif denied_domain?(email)
- return _('is not from an allowed domain.')
+ :denylist
elsif restricted_email?(email)
- return _('is not allowed. Try again with a different email address, or contact your GitLab admin.')
+ :restricted
end
+ end
+
+ def error_message
+ {
+ admin: {
+ allowlist: html_escape_once(_("Go to the 'Admin area &gt; Sign-up restrictions', and check 'Allowed domains for sign-ups'.")).html_safe,
+ denylist: html_escape_once(_("Go to the 'Admin area &gt; Sign-up restrictions', and check the 'Domain denylist'.")).html_safe,
+ restricted: html_escape_once(_("Go to the 'Admin area &gt; Sign-up restrictions', and check 'Email restrictions for sign-ups'.")).html_safe,
+ group_setting: html_escape_once(_("Go to the group’s 'Settings &gt; General' page, and check 'Restrict membership by email domain'.")).html_safe
+ },
+ nonadmin: {
+ allowlist: error_nonadmin,
+ denylist: error_nonadmin,
+ restricted: error_nonadmin,
+ group_setting: error_nonadmin
+ }
+ }
+ end
+
+ def error_nonadmin
+ _("Check with your administrator.")
+ end
- nil
+ def created_by_key
+ created_by&.can_admin_all_resources? ? :admin : :nonadmin
end
def denied_domain?(email)
diff --git a/app/models/concerns/routable.rb b/app/models/concerns/routable.rb
index 847abdc1b6d..f382b3624ed 100644
--- a/app/models/concerns/routable.rb
+++ b/app/models/concerns/routable.rb
@@ -41,7 +41,7 @@ module Routable
has_one :route, as: :source, autosave: true, dependent: :destroy, inverse_of: :source # rubocop:disable Cop/ActiveRecordDependent
has_many :redirect_routes, as: :source, autosave: true, dependent: :destroy # rubocop:disable Cop/ActiveRecordDependent
- validates :route, presence: true
+ validates :route, presence: true, unless: -> { is_a?(Namespaces::ProjectNamespace) }
scope :with_route, -> { includes(:route) }
@@ -185,6 +185,7 @@ module Routable
def prepare_route
return unless full_path_changed? || full_name_changed?
+ return if is_a?(Namespaces::ProjectNamespace)
route || build_route(source: self)
route.path = build_full_path
diff --git a/app/models/concerns/ttl_expirable.rb b/app/models/concerns/ttl_expirable.rb
new file mode 100644
index 00000000000..00abe0a06e6
--- /dev/null
+++ b/app/models/concerns/ttl_expirable.rb
@@ -0,0 +1,20 @@
+# frozen_string_literal: true
+
+module TtlExpirable
+ extend ActiveSupport::Concern
+
+ included do
+ validates :status, presence: true
+
+ enum status: { default: 0, expired: 1, processing: 2, error: 3 }
+
+ scope :updated_before, ->(number_of_days) { where("updated_at <= ?", Time.zone.now - number_of_days.days) }
+ scope :active, -> { where(status: :default) }
+
+ scope :lock_next_by, ->(sort) do
+ order(sort)
+ .limit(1)
+ .lock('FOR UPDATE SKIP LOCKED')
+ end
+ end
+end
diff --git a/app/models/concerns/vulnerability_finding_helpers.rb b/app/models/concerns/vulnerability_finding_helpers.rb
index a656856487d..7f96b3901f1 100644
--- a/app/models/concerns/vulnerability_finding_helpers.rb
+++ b/app/models/concerns/vulnerability_finding_helpers.rb
@@ -2,6 +2,15 @@
module VulnerabilityFindingHelpers
extend ActiveSupport::Concern
+
+ # Manually resolvable report types cannot be considered fixed once removed from the
+ # target branch due to requiring active triage, such as rotation of an exposed token.
+ REPORT_TYPES_REQUIRING_MANUAL_RESOLUTION = %w[secret_detection].freeze
+
+ def requires_manual_resolution?
+ REPORT_TYPES_REQUIRING_MANUAL_RESOLUTION.include?(report_type)
+ end
+
def matches_signatures(other_signatures, other_uuid)
other_signature_types = other_signatures.index_by(&:algorithm_type)
diff --git a/app/models/container_expiration_policy.rb b/app/models/container_expiration_policy.rb
index 9bacd9a0edf..aecb47f7a03 100644
--- a/app/models/container_expiration_policy.rb
+++ b/app/models/container_expiration_policy.rb
@@ -74,6 +74,7 @@ class ContainerExpirationPolicy < ApplicationRecord
'7d': _('%{days} days until tags are automatically removed') % { days: 7 },
'14d': _('%{days} days until tags are automatically removed') % { days: 14 },
'30d': _('%{days} days until tags are automatically removed') % { days: 30 },
+ '60d': _('%{days} days until tags are automatically removed') % { days: 60 },
'90d': _('%{days} days until tags are automatically removed') % { days: 90 }
}
end
diff --git a/app/models/custom_emoji.rb b/app/models/custom_emoji.rb
index aea48a5ec20..ecdac64b31b 100644
--- a/app/models/custom_emoji.rb
+++ b/app/models/custom_emoji.rb
@@ -5,7 +5,7 @@ class CustomEmoji < ApplicationRecord
belongs_to :namespace, inverse_of: :custom_emoji
- belongs_to :group, -> { where(type: 'Group') }, foreign_key: 'namespace_id'
+ belongs_to :group, -> { where(type: Group.sti_name) }, foreign_key: 'namespace_id'
belongs_to :creator, class_name: "User", inverse_of: :created_custom_emoji
# For now only external emoji are supported. See https://gitlab.com/gitlab-org/gitlab/-/issues/230467
diff --git a/app/models/customer_relations/contact.rb b/app/models/customer_relations/contact.rb
index aaa7e2ae175..c632f8e2efa 100644
--- a/app/models/customer_relations/contact.rb
+++ b/app/models/customer_relations/contact.rb
@@ -5,8 +5,9 @@ class CustomerRelations::Contact < ApplicationRecord
self.table_name = "customer_relations_contacts"
- belongs_to :group, -> { where(type: 'Group') }, foreign_key: 'group_id'
+ belongs_to :group, -> { where(type: Group.sti_name) }, foreign_key: 'group_id'
belongs_to :organization, optional: true
+ has_and_belongs_to_many :issues, join_table: :issue_customer_relations_contacts # rubocop: disable Rails/HasAndBelongsToMany
strip_attributes! :phone, :first_name, :last_name
diff --git a/app/models/customer_relations/organization.rb b/app/models/customer_relations/organization.rb
index a18d3ab8148..c206d1e05f5 100644
--- a/app/models/customer_relations/organization.rb
+++ b/app/models/customer_relations/organization.rb
@@ -5,7 +5,7 @@ class CustomerRelations::Organization < ApplicationRecord
self.table_name = "customer_relations_organizations"
- belongs_to :group, -> { where(type: 'Group') }, foreign_key: 'group_id'
+ belongs_to :group, -> { where(type: Group.sti_name) }, foreign_key: 'group_id'
strip_attributes! :name
diff --git a/app/models/dependency_proxy/blob.rb b/app/models/dependency_proxy/blob.rb
index 5de6b1cf28f..7ca15652586 100644
--- a/app/models/dependency_proxy/blob.rb
+++ b/app/models/dependency_proxy/blob.rb
@@ -2,15 +2,14 @@
class DependencyProxy::Blob < ApplicationRecord
include FileStoreMounter
+ include TtlExpirable
+ include EachBatch
belongs_to :group
validates :group, presence: true
validates :file, presence: true
validates :file_name, presence: true
- validates :status, presence: true
-
- enum status: { default: 0, expired: 1 }
mount_file_store_uploader DependencyProxy::FileUploader
diff --git a/app/models/dependency_proxy/image_ttl_group_policy.rb b/app/models/dependency_proxy/image_ttl_group_policy.rb
index 5a1b8cb8f1f..0dfb298a39e 100644
--- a/app/models/dependency_proxy/image_ttl_group_policy.rb
+++ b/app/models/dependency_proxy/image_ttl_group_policy.rb
@@ -8,4 +8,6 @@ class DependencyProxy::ImageTtlGroupPolicy < ApplicationRecord
validates :group, presence: true
validates :enabled, inclusion: { in: [true, false] }
validates :ttl, numericality: { greater_than: 0 }, allow_nil: true
+
+ scope :enabled, -> { where(enabled: true) }
end
diff --git a/app/models/dependency_proxy/manifest.rb b/app/models/dependency_proxy/manifest.rb
index 15e5137b50a..b83047efe54 100644
--- a/app/models/dependency_proxy/manifest.rb
+++ b/app/models/dependency_proxy/manifest.rb
@@ -2,6 +2,8 @@
class DependencyProxy::Manifest < ApplicationRecord
include FileStoreMounter
+ include TtlExpirable
+ include EachBatch
belongs_to :group
@@ -9,9 +11,6 @@ class DependencyProxy::Manifest < ApplicationRecord
validates :file, presence: true
validates :file_name, presence: true
validates :digest, presence: true
- validates :status, presence: true
-
- enum status: { default: 0, expired: 1 }
mount_file_store_uploader DependencyProxy::FileUploader
diff --git a/app/models/deployment.rb b/app/models/deployment.rb
index 4a690ccc67e..f91700f764b 100644
--- a/app/models/deployment.rb
+++ b/app/models/deployment.rb
@@ -10,7 +10,8 @@ class Deployment < ApplicationRecord
include FastDestroyAll
include IgnorableColumns
- ignore_column :deployable_id_convert_to_bigint, remove_with: '14.2', remove_after: '2021-08-22'
+ StatusUpdateError = Class.new(StandardError)
+ StatusSyncError = Class.new(StandardError)
belongs_to :project, required: true
belongs_to :environment, required: true
@@ -48,7 +49,6 @@ class Deployment < ApplicationRecord
scope :stoppable, -> { where.not(on_stop: nil).where.not(deployable_id: nil).success }
scope :active, -> { where(status: %i[created running]) }
scope :older_than, -> (deployment) { where('deployments.id < ?', deployment.id) }
- scope :with_deployable, -> { joins('INNER JOIN ci_builds ON ci_builds.id = deployments.deployable_id').preload(:deployable) }
scope :with_api_entity_associations, -> { preload({ deployable: { runner: [], tags: [], user: [], job_artifacts_archive: [] } }) }
scope :finished_after, ->(date) { where('finished_at >= ?', date) }
@@ -150,6 +150,16 @@ class Deployment < ApplicationRecord
success.find_by!(iid: iid)
end
+ # It should be used with caution especially on chaining.
+ # Fetching any unbounded or large intermediate dataset could lead to loading too many IDs into memory.
+ # See: https://docs.gitlab.com/ee/development/database/multiple_databases.html#use-disable_joins-for-has_one-or-has_many-through-relations
+ # For safety we default limit to fetch not more than 1000 records.
+ def self.builds(limit = 1000)
+ deployable_ids = where.not(deployable_id: nil).limit(limit).pluck(:deployable_id)
+
+ Ci::Build.where(id: deployable_ids)
+ end
+
class << self
##
# FastDestroyAll concerns
@@ -305,20 +315,23 @@ class Deployment < ApplicationRecord
# Changes the status of a deployment and triggers the corresponding state
# machine events.
def update_status(status)
- case status
- when 'running'
- run
- when 'success'
- succeed
- when 'failed'
- drop
- when 'canceled'
- cancel
- when 'skipped'
- skip
- else
- raise ArgumentError, "The status #{status.inspect} is invalid"
- end
+ update_status!(status)
+ rescue StandardError => e
+ Gitlab::ErrorTracking.track_exception(
+ StatusUpdateError.new(e.message), deployment_id: self.id)
+
+ false
+ end
+
+ def sync_status_with(build)
+ return false unless ::Deployment.statuses.include?(build.status)
+
+ update_status!(build.status)
+ rescue StandardError => e
+ Gitlab::ErrorTracking.track_exception(
+ StatusSyncError.new(e.message), deployment_id: self.id, build_id: build.id)
+
+ false
end
def valid_sha
@@ -346,6 +359,23 @@ class Deployment < ApplicationRecord
private
+ def update_status!(status)
+ case status
+ when 'running'
+ run!
+ when 'success'
+ succeed!
+ when 'failed'
+ drop!
+ when 'canceled'
+ cancel!
+ when 'skipped'
+ skip!
+ else
+ raise ArgumentError, "The status #{status.inspect} is invalid"
+ end
+ end
+
def legacy_finished_at
self.created_at if success? && !read_attribute(:finished_at)
end
diff --git a/app/models/environment.rb b/app/models/environment.rb
index 48522a23068..31ab426728b 100644
--- a/app/models/environment.rb
+++ b/app/models/environment.rb
@@ -28,8 +28,8 @@ class Environment < ApplicationRecord
has_one :last_deployment, -> { success.distinct_on_environment }, class_name: 'Deployment', inverse_of: :environment
has_one :last_visible_deployment, -> { visible.distinct_on_environment }, inverse_of: :environment, class_name: 'Deployment'
- has_one :last_visible_deployable, through: :last_visible_deployment, source: 'deployable', source_type: 'CommitStatus', disable_joins: -> { ::Feature.enabled?(:environment_last_visible_pipeline_disable_joins, default_enabled: :yaml) }
- has_one :last_visible_pipeline, through: :last_visible_deployable, source: 'pipeline', disable_joins: -> { ::Feature.enabled?(:environment_last_visible_pipeline_disable_joins, default_enabled: :yaml) }
+ has_one :last_visible_deployable, through: :last_visible_deployment, source: 'deployable', source_type: 'CommitStatus', disable_joins: true
+ has_one :last_visible_pipeline, through: :last_visible_deployable, source: 'pipeline', disable_joins: true
has_one :upcoming_deployment, -> { running.distinct_on_environment }, class_name: 'Deployment', inverse_of: :environment
has_one :latest_opened_most_severe_alert, -> { order_severity_with_open_prometheus_alert }, class_name: 'AlertManagement::Alert', inverse_of: :environment
@@ -198,14 +198,14 @@ class Environment < ApplicationRecord
# Overriding association
def last_visible_deployable
- return super if association_cached?(:last_visible_deployable) || ::Feature.disabled?(:environment_last_visible_pipeline_disable_joins, default_enabled: :yaml)
+ return super if association_cached?(:last_visible_deployable)
last_visible_deployment&.deployable
end
# Overriding association
def last_visible_pipeline
- return super if association_cached?(:last_visible_pipeline) || ::Feature.disabled?(:environment_last_visible_pipeline_disable_joins, default_enabled: :yaml)
+ return super if association_cached?(:last_visible_pipeline)
last_visible_deployable&.pipeline
end
@@ -260,10 +260,9 @@ class Environment < ApplicationRecord
end
def cancel_deployment_jobs!
- jobs = active_deployments.with_deployable
- jobs.each do |deployment|
- Gitlab::OptimisticLocking.retry_lock(deployment.deployable, name: 'environment_cancel_deployment_jobs') do |deployable|
- deployable.cancel! if deployable&.cancelable?
+ active_deployments.builds.each do |build|
+ Gitlab::OptimisticLocking.retry_lock(build, name: 'environment_cancel_deployment_jobs') do |build|
+ build.cancel! if build&.cancelable?
end
rescue StandardError => e
Gitlab::ErrorTracking.track_exception(e, environment_id: id, deployment_id: deployment.id)
diff --git a/app/models/environment_status.rb b/app/models/environment_status.rb
index 3be7af2e4bf..07c0983f239 100644
--- a/app/models/environment_status.rb
+++ b/app/models/environment_status.rb
@@ -100,13 +100,11 @@ class EnvironmentStatus
def self.build_environments_status(mr, user, pipeline)
return [] unless pipeline
- ::Gitlab::Database.allow_cross_joins_across_databases(url: 'https://gitlab.com/gitlab-org/gitlab/-/issues/340781') do
- pipeline.environments_in_self_and_descendants.includes(:project).available.map do |environment|
- next unless Ability.allowed?(user, :read_environment, environment)
+ pipeline.environments_in_self_and_descendants.includes(:project).available.map do |environment|
+ next unless Ability.allowed?(user, :read_environment, environment)
- EnvironmentStatus.new(pipeline.project, environment, mr, pipeline.sha)
- end.compact
- end
+ EnvironmentStatus.new(pipeline.project, environment, mr, pipeline.sha)
+ end.compact
end
private_class_method :build_environments_status
end
diff --git a/app/models/error_tracking/error.rb b/app/models/error_tracking/error.rb
index 39ecc487806..2d6a4694def 100644
--- a/app/models/error_tracking/error.rb
+++ b/app/models/error_tracking/error.rb
@@ -7,6 +7,14 @@ class ErrorTracking::Error < ApplicationRecord
has_many :events, class_name: 'ErrorTracking::ErrorEvent'
+ has_one :first_event,
+ -> { order(id: :asc) },
+ class_name: 'ErrorTracking::ErrorEvent'
+
+ has_one :last_event,
+ -> { order(id: :desc) },
+ class_name: 'ErrorTracking::ErrorEvent'
+
scope :for_status, -> (status) { where(status: status) }
validates :project, presence: true
@@ -90,7 +98,10 @@ class ErrorTracking::Error < ApplicationRecord
status: status,
tags: { level: nil, logger: nil },
external_url: external_url,
- external_base_url: external_base_url
+ external_base_url: external_base_url,
+ integrated: true,
+ first_release_version: first_event&.release,
+ last_release_version: last_event&.release
)
end
@@ -106,6 +117,6 @@ class ErrorTracking::Error < ApplicationRecord
# For compatibility with sentry integration
def external_base_url
- Gitlab::Routing.url_helpers.root_url
+ Gitlab::Routing.url_helpers.project_url(project)
end
end
diff --git a/app/models/error_tracking/error_event.rb b/app/models/error_tracking/error_event.rb
index 4de13de7e2e..686518a39fb 100644
--- a/app/models/error_tracking/error_event.rb
+++ b/app/models/error_tracking/error_event.rb
@@ -22,6 +22,10 @@ class ErrorTracking::ErrorEvent < ApplicationRecord
)
end
+ def release
+ payload.dig('release')
+ end
+
private
def build_stacktrace
diff --git a/app/models/error_tracking/project_error_tracking_setting.rb b/app/models/error_tracking/project_error_tracking_setting.rb
index dd5ce9f7387..25f812645b1 100644
--- a/app/models/error_tracking/project_error_tracking_setting.rb
+++ b/app/models/error_tracking/project_error_tracking_setting.rb
@@ -46,6 +46,11 @@ module ErrorTracking
after_save :clear_reactive_cache!
+ # When a user enables the integrated error tracking
+ # we want to immediately provide them with a first
+ # working client key so they have a DSN for Sentry SDK.
+ after_save :create_client_key!
+
def sentry_enabled
enabled && !integrated_client?
end
@@ -54,6 +59,12 @@ module ErrorTracking
integrated
end
+ def gitlab_dsn
+ strong_memoize(:gitlab_dsn) do
+ client_key&.sentry_dsn
+ end
+ end
+
def api_url=(value)
super
clear_memoization(:api_url_slugs)
@@ -236,5 +247,19 @@ module ErrorTracking
errors.add(:project, 'is a required field')
end
end
+
+ def client_key
+ # Project can have multiple client keys.
+ # However for UI simplicity we render the first active one for user.
+ # In future we should make it possible to manage client keys from UI.
+ # Issue https://gitlab.com/gitlab-org/gitlab/-/issues/329596
+ project.error_tracking_client_keys.active.first
+ end
+
+ def create_client_key!
+ if enabled? && integrated_client? && !client_key
+ project.error_tracking_client_keys.create!
+ end
+ end
end
end
diff --git a/app/models/group.rb b/app/models/group.rb
index a667a908707..c5e119451e3 100644
--- a/app/models/group.rb
+++ b/app/models/group.rb
@@ -192,9 +192,15 @@ class Group < Namespace
# Returns the ids of the passed group models where the `emails_disabled`
# column is set to true anywhere in the ancestor hierarchy.
def ids_with_disabled_email(groups)
- innner_query = Gitlab::ObjectHierarchy
- .new(Group.where('id = namespaces_with_emails_disabled.id'))
- .base_and_ancestors
+ inner_groups = Group.where('id = namespaces_with_emails_disabled.id')
+
+ inner_ancestors = if Feature.enabled?(:linear_group_ancestor_scopes, default_enabled: :yaml)
+ inner_groups.self_and_ancestors
+ else
+ Gitlab::ObjectHierarchy.new(inner_groups).base_and_ancestors
+ end
+
+ inner_query = inner_ancestors
.where(emails_disabled: true)
.select('1')
.limit(1)
@@ -202,7 +208,7 @@ class Group < Namespace
group_ids = Namespace
.from('(SELECT * FROM namespaces) as namespaces_with_emails_disabled')
.where(namespaces_with_emails_disabled: { id: groups })
- .where('EXISTS (?)', innner_query)
+ .where('EXISTS (?)', inner_query)
.pluck(:id)
Set.new(group_ids)
@@ -701,9 +707,9 @@ class Group < Namespace
raise ArgumentError unless SHARED_RUNNERS_SETTINGS.include?(state)
case state
- when 'disabled_and_unoverridable' then disable_shared_runners! # also disallows override
- when 'disabled_with_override' then disable_shared_runners_and_allow_override!
- when 'enabled' then enable_shared_runners! # set both to true
+ 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_ENABLED then enable_shared_runners! # set both to true
end
end
diff --git a/app/models/instance_configuration.rb b/app/models/instance_configuration.rb
index 9565dae08b5..0bf9e805aa8 100644
--- a/app/models/instance_configuration.rb
+++ b/app/models/instance_configuration.rb
@@ -22,7 +22,12 @@ class InstanceConfiguration
private
def ssh_algorithms_hashes
- SSH_ALGORITHMS.map { |algo| ssh_algorithm_hashes(algo) }.compact
+ SSH_ALGORITHMS.select { |algo| ssh_algorithm_enabled?(algo) }.map { |algo| ssh_algorithm_hashes(algo) }.compact
+ end
+
+ def ssh_algorithm_enabled?(algorithm)
+ algorithm_key_restriction = application_settings["#{algorithm.downcase}_key_restriction"]
+ algorithm_key_restriction.nil? || algorithm_key_restriction != ApplicationSetting::FORBIDDEN_KEY_VALUE
end
def host
@@ -98,6 +103,11 @@ class InstanceConfiguration
requests_per_period: application_settings[:throttle_authenticated_packages_api_requests_per_period],
period_in_seconds: application_settings[:throttle_authenticated_packages_api_period_in_seconds]
},
+ authenticated_git_lfs_api: {
+ enabled: application_settings[:throttle_authenticated_git_lfs_enabled],
+ requests_per_period: application_settings[:throttle_authenticated_git_lfs_requests_per_period],
+ period_in_seconds: application_settings[:throttle_authenticated_git_lfs_period_in_seconds]
+ },
issue_creation: application_setting_limit_per_minute(:issues_create_limit),
note_creation: application_setting_limit_per_minute(:notes_create_limit),
project_export: application_setting_limit_per_minute(:project_export_limit),
diff --git a/app/models/integrations/open_project.rb b/app/models/integrations/open_project.rb
deleted file mode 100644
index e4cfb24151a..00000000000
--- a/app/models/integrations/open_project.rb
+++ /dev/null
@@ -1,20 +0,0 @@
-# frozen_string_literal: true
-
-module Integrations
- class OpenProject < BaseIssueTracker
- validates :url, public_url: true, presence: true, if: :activated?
- validates :api_url, public_url: true, allow_blank: true, if: :activated?
- validates :token, presence: true, if: :activated?
- validates :project_identifier_code, presence: true, if: :activated?
-
- data_field :url, :api_url, :token, :closed_status_id, :project_identifier_code
-
- def data_fields
- open_project_tracker_data || self.build_open_project_tracker_data
- end
-
- def self.to_param
- 'open_project'
- end
- end
-end
diff --git a/app/models/integrations/open_project_tracker_data.rb b/app/models/integrations/open_project_tracker_data.rb
deleted file mode 100644
index b3f2618b94f..00000000000
--- a/app/models/integrations/open_project_tracker_data.rb
+++ /dev/null
@@ -1,18 +0,0 @@
-# frozen_string_literal: true
-
-module Integrations
- class OpenProjectTrackerData < ApplicationRecord
- include BaseDataFields
-
- # When the Open Project is fresh installed, the default closed status id is "13" based on current version: v8.
- DEFAULT_CLOSED_STATUS_ID = "13"
-
- attr_encrypted :url, encryption_options
- attr_encrypted :api_url, encryption_options
- attr_encrypted :token, encryption_options
-
- def closed_status_id
- super || DEFAULT_CLOSED_STATUS_ID
- end
- end
-end
diff --git a/app/models/integrations/unify_circuit.rb b/app/models/integrations/unify_circuit.rb
index ad6a9164d00..e3e180ae959 100644
--- a/app/models/integrations/unify_circuit.rb
+++ b/app/models/integrations/unify_circuit.rb
@@ -15,13 +15,8 @@ module Integrations
end
def help
- 'This service sends notifications about projects events to a Unify Circuit conversation.<br />
- To set up this service:
- <ol>
- <li><a href="https://www.circuit.com/unifyportalfaqdetail?articleId=164448" target="_blank" rel="noopener noreferrer">Set up an incoming webhook for your conversation</a>. All notifications will come to this conversation.</li>
- <li>Paste the <strong>Webhook URL</strong> into the field below.</li>
- <li>Select events below to enable notifications.</li>
- </ol>'
+ docs_link = ActionController::Base.helpers.link_to _('How do I set up this service?'), Rails.application.routes.url_helpers.help_page_url('user/project/integrations/unify_circuit'), target: '_blank', rel: 'noopener noreferrer'
+ s_('Integrations|Send notifications about project events to a Unify Circuit conversation. %{docs_link}').html_safe % { docs_link: docs_link.html_safe }
end
def event_field(event)
@@ -37,7 +32,7 @@ module Integrations
def default_fields
[
- { type: 'text', name: 'webhook', placeholder: "e.g. https://circuit.com/rest/v2/webhooks/incoming/…", required: true },
+ { type: 'text', name: 'webhook', placeholder: "https://yourcircuit.com/rest/v2/webhooks/incoming/…", required: true },
{ type: 'checkbox', name: 'notify_only_broken_pipelines' },
{ type: 'select', name: 'branches_to_be_notified', choices: branch_choices }
]
diff --git a/app/models/issue.rb b/app/models/issue.rb
index e0b0c352c22..9c568414ec2 100644
--- a/app/models/issue.rb
+++ b/app/models/issue.rb
@@ -81,6 +81,7 @@ class Issue < ApplicationRecord
has_and_belongs_to_many :self_managed_prometheus_alert_events, join_table: :issues_self_managed_prometheus_alert_events # rubocop: disable Rails/HasAndBelongsToMany
has_and_belongs_to_many :prometheus_alert_events, join_table: :issues_prometheus_alert_events # rubocop: disable Rails/HasAndBelongsToMany
has_many :prometheus_alerts, through: :prometheus_alert_events
+ has_and_belongs_to_many :customer_relations_contacts, join_table: :issue_customer_relations_contacts, class_name: 'CustomerRelations::Contact' # rubocop: disable Rails/HasAndBelongsToMany
accepts_nested_attributes_for :issuable_severity, update_only: true
accepts_nested_attributes_for :sentry_issue
@@ -107,8 +108,6 @@ class Issue < ApplicationRecord
scope :order_due_date_asc, -> { reorder(::Gitlab::Database.nulls_last_order('due_date', 'ASC')) }
scope :order_due_date_desc, -> { reorder(::Gitlab::Database.nulls_last_order('due_date', 'DESC')) }
scope :order_closest_future_date, -> { reorder(Arel.sql('CASE WHEN issues.due_date >= CURRENT_DATE THEN 0 ELSE 1 END ASC, ABS(CURRENT_DATE - issues.due_date) ASC')) }
- scope :order_relative_position_asc, -> { reorder(::Gitlab::Database.nulls_last_order('relative_position', 'ASC')) }
- scope :order_relative_position_desc, -> { reorder(::Gitlab::Database.nulls_first_order('relative_position', 'DESC')) }
scope :order_closed_date_desc, -> { reorder(closed_at: :desc) }
scope :order_created_at_desc, -> { reorder(created_at: :desc) }
scope :order_severity_asc, -> { includes(:issuable_severity).order('issuable_severities.severity ASC NULLS FIRST') }
@@ -127,6 +126,7 @@ class Issue < ApplicationRecord
project: [:route, { namespace: :route }])
}
scope :with_issue_type, ->(types) { where(issue_type: types) }
+ scope :without_issue_type, ->(types) { where.not(issue_type: types) }
scope :public_only, -> {
without_hidden.where(confidential: false)
@@ -166,6 +166,8 @@ class Issue < ApplicationRecord
scope :by_project_id_and_iid, ->(composites) do
where_composite(%i[project_id iid], composites)
end
+ scope :with_null_relative_position, -> { where(relative_position: nil) }
+ scope :with_non_null_relative_position, -> { where.not(relative_position: nil) }
after_commit :expire_etag_cache, unless: :importing?
after_save :ensure_metrics, unless: :importing?
@@ -266,8 +268,8 @@ class Issue < ApplicationRecord
'due_date' => -> { order_due_date_asc.with_order_id_desc },
'due_date_asc' => -> { order_due_date_asc.with_order_id_desc },
'due_date_desc' => -> { order_due_date_desc.with_order_id_desc },
- 'relative_position' => -> { order_relative_position_asc.with_order_id_desc },
- 'relative_position_asc' => -> { order_relative_position_asc.with_order_id_desc }
+ 'relative_position' => -> { order_by_relative_position },
+ 'relative_position_asc' => -> { order_by_relative_position }
}
)
end
@@ -277,7 +279,7 @@ class Issue < ApplicationRecord
when 'closest_future_date', 'closest_future_date_asc' then order_closest_future_date
when 'due_date', 'due_date_asc' then order_due_date_asc.with_order_id_desc
when 'due_date_desc' then order_due_date_desc.with_order_id_desc
- when 'relative_position', 'relative_position_asc' then order_relative_position_asc.with_order_id_desc
+ when 'relative_position', 'relative_position_asc' then order_by_relative_position
when 'severity_asc' then order_severity_asc.with_order_id_desc
when 'severity_desc' then order_severity_desc.with_order_id_desc
else
@@ -285,13 +287,8 @@ class Issue < ApplicationRecord
end
end
- # `with_cte` argument allows sorting when using CTE queries and prevents
- # errors in postgres when using CTE search optimisation
- def self.order_by_position_and_priority(with_cte: false)
- order = Gitlab::Pagination::Keyset::Order.build([column_order_relative_position, column_order_highest_priority, column_order_id_desc])
-
- order_labels_priority(with_cte: with_cte)
- .reorder(order)
+ def self.order_by_relative_position
+ reorder(Gitlab::Pagination::Keyset::Order.build([column_order_relative_position, column_order_id_asc]))
end
def self.column_order_relative_position
@@ -306,25 +303,6 @@ class Issue < ApplicationRecord
)
end
- def self.column_order_highest_priority
- Gitlab::Pagination::Keyset::ColumnOrderDefinition.new(
- attribute_name: 'highest_priority',
- column_expression: Arel.sql('highest_priorities.label_priority'),
- order_expression: Gitlab::Database.nulls_last_order('highest_priorities.label_priority', 'ASC'),
- reversed_order_expression: Gitlab::Database.nulls_last_order('highest_priorities.label_priority', 'DESC'),
- order_direction: :asc,
- nullable: :nulls_last,
- distinct: false
- )
- end
-
- def self.column_order_id_desc
- Gitlab::Pagination::Keyset::ColumnOrderDefinition.new(
- attribute_name: 'id',
- order_expression: arel_table[:id].desc
- )
- end
-
def self.column_order_id_asc
Gitlab::Pagination::Keyset::ColumnOrderDefinition.new(
attribute_name: 'id',
@@ -541,6 +519,10 @@ class Issue < ApplicationRecord
issue_type_supports?(:time_tracking)
end
+ def supports_move_and_clone?
+ issue_type_supports?(:move_and_clone)
+ end
+
def email_participants_emails
issue_email_participants.pluck(:email)
end
diff --git a/app/models/lfs_object.rb b/app/models/lfs_object.rb
index 53e7d52c558..9765ac6f2e9 100644
--- a/app/models/lfs_object.rb
+++ b/app/models/lfs_object.rb
@@ -49,7 +49,7 @@ class LfsObject < ApplicationRecord
end
def self.calculate_oid(path)
- self.hexdigest(path)
+ self.sha256_hexdigest(path)
end
end
diff --git a/app/models/loose_foreign_keys/deleted_record.rb b/app/models/loose_foreign_keys/deleted_record.rb
index a39d88b2e49..ca5a2800a03 100644
--- a/app/models/loose_foreign_keys/deleted_record.rb
+++ b/app/models/loose_foreign_keys/deleted_record.rb
@@ -2,48 +2,4 @@
class LooseForeignKeys::DeletedRecord < ApplicationRecord
extend SuppressCompositePrimaryKeyWarning
- include PartitionedTable
-
- partitioned_by :created_at, strategy: :monthly, retain_for: 3.months, retain_non_empty_partitions: true
-
- scope :ordered_by_primary_keys, -> { order(:created_at, :deleted_table_name, :deleted_table_primary_key_value) }
-
- def self.load_batch(batch_size)
- ordered_by_primary_keys
- .limit(batch_size)
- .to_a
- end
-
- # Because the table has composite primary keys, the delete_all or delete methods are not going to work.
- # This method implements deletion that benefits from the primary key index, example:
- #
- # > DELETE
- # > FROM "loose_foreign_keys_deleted_records"
- # > WHERE (created_at,
- # > deleted_table_name,
- # > deleted_table_primary_key_value) IN
- # > (SELECT created_at::TIMESTAMP WITH TIME ZONE,
- # > deleted_table_name,
- # > deleted_table_primary_key_value
- # > FROM (VALUES (LIST_OF_VALUES)) AS primary_key_values (created_at, deleted_table_name, deleted_table_primary_key_value))
- def self.delete_records(records)
- values = records.pluck(:created_at, :deleted_table_name, :deleted_table_primary_key_value)
-
- primary_keys = connection.primary_keys(table_name).join(', ')
-
- primary_keys_with_type_cast = [
- Arel.sql('created_at::timestamp with time zone'),
- Arel.sql('deleted_table_name'),
- Arel.sql('deleted_table_primary_key_value')
- ]
-
- value_list = Arel::Nodes::ValuesList.new(values)
-
- # (SELECT primary keys FROM VALUES)
- inner_query = Arel::SelectManager.new
- inner_query.from("#{Arel::Nodes::Grouping.new([value_list]).as('primary_key_values').to_sql} (#{primary_keys})")
- inner_query.projections = primary_keys_with_type_cast
-
- where(Arel::Nodes::Grouping.new([Arel.sql(primary_keys)]).in(inner_query)).delete_all
- end
end
diff --git a/app/models/member.rb b/app/models/member.rb
index beb4c05f2a6..21fd4aebd7b 100644
--- a/app/models/member.rb
+++ b/app/models/member.rb
@@ -50,6 +50,11 @@ class Member < ApplicationRecord
},
if: :project_bot?
+ scope :with_invited_user_state, -> do
+ joins('LEFT JOIN users as invited_user ON invited_user.email = members.invite_email')
+ .select('members.*', 'invited_user.state as invited_user_state')
+ end
+
scope :in_hierarchy, ->(source) do
groups = source.root_ancestor.self_and_descendants
group_members = Member.default_scoped.where(source: groups)
@@ -178,7 +183,13 @@ class Member < ApplicationRecord
after_destroy :post_destroy_hook, unless: :pending?, if: :hook_prerequisites_met?
after_save :log_invitation_token_cleanup
- after_commit :refresh_member_authorized_projects, unless: :importing?
+ after_commit on: [:create, :update], unless: :importing? do
+ refresh_member_authorized_projects(blocking: true)
+ end
+
+ after_commit on: [:destroy], unless: :importing? do
+ refresh_member_authorized_projects(blocking: false)
+ end
default_value_for :notification_level, NotificationSetting.levels[:global]
@@ -395,8 +406,8 @@ class Member < ApplicationRecord
# transaction has been committed, resulting in the job either throwing an
# error or not doing any meaningful work.
# rubocop: disable CodeReuse/ServiceClass
- def refresh_member_authorized_projects
- UserProjectAccessChangedService.new(user_id).execute
+ def refresh_member_authorized_projects(blocking:)
+ UserProjectAccessChangedService.new(user_id).execute(blocking: blocking)
end
# rubocop: enable CodeReuse/ServiceClass
@@ -442,6 +453,14 @@ class Member < ApplicationRecord
errors.add(:user, error) if error
end
+ def signup_email_invalid_message
+ if source_type == 'Project'
+ _("is not allowed for this project.")
+ else
+ _("is not allowed for this group.")
+ end
+ end
+
def update_highest_role?
return unless user_id.present?
diff --git a/app/models/members/group_member.rb b/app/models/members/group_member.rb
index a13133c90e9..9062a405218 100644
--- a/app/models/members/group_member.rb
+++ b/app/models/members/group_member.rb
@@ -43,15 +43,17 @@ class GroupMember < Member
# Because source_type is `Namespace`...
def real_source_type
- 'Group'
+ Group.sti_name
end
def notifiable_options
{ group: group }
end
+ private
+
override :refresh_member_authorized_projects
- def refresh_member_authorized_projects
+ def refresh_member_authorized_projects(blocking:)
# Here, `destroyed_by_association` will be present if the
# GroupMember is being destroyed due to the `dependent: :destroy`
# callback on Group. In this case, there is no need to refresh the
@@ -63,8 +65,6 @@ class GroupMember < Member
super
end
- private
-
def access_level_inclusion
return if access_level.in?(Gitlab::Access.all_values)
diff --git a/app/models/members/project_member.rb b/app/models/members/project_member.rb
index 72cb831cc88..eec46b3493e 100644
--- a/app/models/members/project_member.rb
+++ b/app/models/members/project_member.rb
@@ -90,24 +90,28 @@ class ProjectMember < Member
{ project: project }
end
+ private
+
override :refresh_member_authorized_projects
- def refresh_member_authorized_projects
+ def refresh_member_authorized_projects(blocking:)
return super unless Feature.enabled?(:specialized_service_for_project_member_auth_refresh)
return unless user
# rubocop:disable CodeReuse/ServiceClass
- AuthorizedProjectUpdate::ProjectRecalculatePerUserService.new(project, user).execute
+ if blocking
+ AuthorizedProjectUpdate::ProjectRecalculatePerUserService.new(project, user).execute
+ else
+ AuthorizedProjectUpdate::ProjectRecalculatePerUserWorker.perform_async(project.id, user.id)
+ end
# Until we compare the inconsistency rates of the new, specialized service and
# the old approach, we still run AuthorizedProjectsWorker
# but with some delay and lower urgency as a safety net.
UserProjectAccessChangedService.new(user_id)
- .execute(blocking: false, priority: UserProjectAccessChangedService::LOW_PRIORITY)
+ .execute(blocking: false, priority: UserProjectAccessChangedService::LOW_PRIORITY)
# rubocop:enable CodeReuse/ServiceClass
end
- private
-
def send_invite
run_after_commit_or_now { notification_service.invite_project_member(self, @raw_invite_token) }
diff --git a/app/models/merge_request.rb b/app/models/merge_request.rb
index db49ec6f412..15862fb2bfa 100644
--- a/app/models/merge_request.rb
+++ b/app/models/merge_request.rb
@@ -1111,15 +1111,23 @@ class MergeRequest < ApplicationRecord
can_be_merged? && !should_be_rebased?
end
+ # rubocop: disable CodeReuse/ServiceClass
def mergeable_state?(skip_ci_check: false, skip_discussions_check: false)
return false unless open?
return false if work_in_progress?
return false if broken?
- return false unless skip_ci_check || mergeable_ci_state?
return false unless skip_discussions_check || mergeable_discussions_state?
- true
+ if Feature.enabled?(:improved_mergeability_checks, self.project, default_enabled: :yaml)
+ additional_checks = MergeRequests::Mergeability::RunChecksService.new(merge_request: self, params: { skip_ci_check: skip_ci_check })
+ additional_checks.execute.all?(&:success?)
+ else
+ return false unless skip_ci_check || mergeable_ci_state?
+
+ true
+ end
end
+ # rubocop: enable CodeReuse/ServiceClass
def ff_merge_possible?
project.repository.ancestor?(target_branch_sha, diff_head_sha)
@@ -1658,6 +1666,10 @@ class MergeRequest < ApplicationRecord
service_class.new(project, current_user, id: id, report_type: report_type).execute(comparison_base_pipeline(identifier), actual_head_pipeline)
end
+ def recent_diff_head_shas(limit = 100)
+ merge_request_diffs.recent(limit).pluck(:head_commit_sha)
+ end
+
def all_commits
MergeRequestDiffCommit
.where(merge_request_diff: merge_request_diffs.recent)
@@ -1857,7 +1869,7 @@ class MergeRequest < ApplicationRecord
override :ensure_metrics
def ensure_metrics
- if Feature.enabled?(:use_upsert_query_for_mr_metrics)
+ if Feature.enabled?(:use_upsert_query_for_mr_metrics, default_enabled: :yaml)
MergeRequest::Metrics.record!(self)
else
# Backward compatibility: some merge request metrics records will not have target_project_id filled in.
@@ -1918,20 +1930,6 @@ class MergeRequest < ApplicationRecord
end
end
- def lazy_upvotes_count
- BatchLoader.for(id).batch(default_value: 0) do |ids, loader|
- counts = AwardEmoji
- .where(awardable_id: ids)
- .upvotes
- .group(:awardable_id)
- .count
-
- counts.each do |id, count|
- loader.call(id, count)
- end
- end
- end
-
private
def set_draft_status
diff --git a/app/models/merge_request_diff.rb b/app/models/merge_request_diff.rb
index d2b3ca753b1..bd94c0ad30e 100644
--- a/app/models/merge_request_diff.rb
+++ b/app/models/merge_request_diff.rb
@@ -66,7 +66,7 @@ class MergeRequestDiff < ApplicationRecord
joins(:merge_request).where(merge_requests: { target_project_id: project_id })
end
- scope :recent, -> { order(id: :desc).limit(100) }
+ scope :recent, -> (limit = 100) { order(id: :desc).limit(limit) }
scope :files_in_database, -> do
where(stored_externally: [false, nil]).where(arel_table[:files_count].gt(0))
diff --git a/app/models/metrics/dashboard/annotation.rb b/app/models/metrics/dashboard/annotation.rb
index 3383dda20c9..d3d3f973398 100644
--- a/app/models/metrics/dashboard/annotation.rb
+++ b/app/models/metrics/dashboard/annotation.rb
@@ -32,19 +32,19 @@ module Metrics
def ending_at_after_starting_at
return if ending_at.blank? || starting_at.blank? || starting_at <= ending_at
- errors.add(:ending_at, s_("Metrics::Dashboard::Annotation|can't be before starting_at time"))
+ errors.add(:ending_at, s_("MetricsDashboardAnnotation|can't be before starting_at time"))
end
def single_ownership
return if cluster.nil? ^ environment.nil?
- errors.add(:base, s_("Metrics::Dashboard::Annotation|Annotation can't belong to both a cluster and an environment at the same time"))
+ errors.add(:base, s_("MetricsDashboardAnnotation|Annotation can't belong to both a cluster and an environment at the same time"))
end
def orphaned_annotation
return if cluster.present? || environment.present?
- errors.add(:base, s_("Metrics::Dashboard::Annotation|Annotation must belong to a cluster or an environment"))
+ errors.add(:base, s_("MetricsDashboardAnnotation|Annotation must belong to a cluster or an environment"))
end
end
end
diff --git a/app/models/namespace.rb b/app/models/namespace.rb
index 0c160cedb4d..e6406293c66 100644
--- a/app/models/namespace.rb
+++ b/app/models/namespace.rb
@@ -28,7 +28,10 @@ class Namespace < ApplicationRecord
# Android repo (15) + some extra backup.
NUMBER_OF_ANCESTORS_ALLOWED = 20
- SHARED_RUNNERS_SETTINGS = %w[disabled_and_unoverridable disabled_with_override enabled].freeze
+ SR_DISABLED_AND_UNOVERRIDABLE = 'disabled_and_unoverridable'
+ SR_DISABLED_WITH_OVERRIDE = 'disabled_with_override'
+ SR_ENABLED = 'enabled'
+ SHARED_RUNNERS_SETTINGS = [SR_DISABLED_AND_UNOVERRIDABLE, SR_DISABLED_WITH_OVERRIDE, SR_ENABLED].freeze
URL_MAX_LENGTH = 255
cache_markdown_field :description, pipeline: :description
@@ -44,6 +47,8 @@ class Namespace < ApplicationRecord
# This should _not_ be `inverse_of: :namespace`, because that would also set
# `user.namespace` when this user creates a group with themselves as `owner`.
+ # TODO: can this be moved into the UserNamespace class?
+ # evaluate in issue https://gitlab.com/gitlab-org/gitlab/-/issues/341070
belongs_to :owner, class_name: "User"
belongs_to :parent, class_name: "Namespace"
@@ -63,21 +68,31 @@ class Namespace < ApplicationRecord
length: { maximum: 255 }
validates :description, length: { maximum: 255 }
+
validates :path,
presence: true,
- length: { maximum: URL_MAX_LENGTH },
- namespace_path: true
+ length: { maximum: URL_MAX_LENGTH }
+
+ validates :path, namespace_path: true, if: ->(n) { !n.project_namespace? }
+ # Project path validator is used for project namespaces for now to assure
+ # compatibility with project paths
+ # Issue: https://gitlab.com/gitlab-org/gitlab/-/issues/341764
+ validates :path, project_path: true, if: ->(n) { n.project_namespace? }
# Introduce minimal path length of 2 characters.
# Allow change of other attributes without forcing users to
# rename their user or group. At the same time prevent changing
# the path without complying with new 2 chars requirement.
# Issue https://gitlab.com/gitlab-org/gitlab/-/issues/225214
- validates :path, length: { minimum: 2 }, if: :path_changed?
+ #
+ # For ProjectNamespace we don't check minimal path length to keep
+ # compatibility with existing project restrictions.
+ # Issue: https://gitlab.com/gitlab-org/gitlab/-/issues/341764
+ validates :path, length: { minimum: 2 }, if: :enforce_minimum_path_length?
validates :max_artifacts_size, numericality: { only_integer: true, greater_than: 0, allow_nil: true }
- validate :validate_parent_type, if: -> { Feature.enabled?(:validate_namespace_parent_type) }
+ validate :validate_parent_type, if: -> { Feature.enabled?(:validate_namespace_parent_type, default_enabled: :yaml) }
validate :nesting_level_allowed
validate :changing_shared_runners_enabled_is_allowed
validate :changing_allow_descendants_override_disabled_shared_runners_is_allowed
@@ -93,7 +108,7 @@ class Namespace < ApplicationRecord
# Legacy Storage specific hooks
- after_update :move_dir, if: :saved_change_to_path_or_parent?
+ after_update :move_dir, if: :saved_change_to_path_or_parent?, unless: -> { is_a?(Namespaces::ProjectNamespace) }
before_destroy(prepend: true) { prepare_for_destroy }
after_destroy :rm_dir
after_commit :expire_child_caches, on: :update, if: -> {
@@ -101,7 +116,12 @@ class Namespace < ApplicationRecord
saved_change_to_name? || saved_change_to_path? || saved_change_to_parent_id?
}
- scope :for_user, -> { where(type: nil) }
+ # TODO: change to `type: Namespaces::UserNamespace.sti_name` when
+ # working on issue https://gitlab.com/gitlab-org/gitlab/-/issues/341070
+ scope :user_namespaces, -> { where(type: [nil, Namespaces::UserNamespace.sti_name]) }
+ # TODO: this can be simplified with `type != 'Project'` when working on issue
+ # https://gitlab.com/gitlab-org/gitlab/-/issues/341070
+ scope :without_project_namespaces, -> { where("type IS DISTINCT FROM ?", Namespaces::ProjectNamespace.sti_name) }
scope :sort_by_type, -> { order(Gitlab::Database.nulls_first_order(:type)) }
scope :include_route, -> { includes(:route) }
scope :by_parent, -> (parent) { where(parent_id: parent) }
@@ -138,14 +158,12 @@ class Namespace < ApplicationRecord
class << self
def sti_class_for(type_name)
case type_name
- when 'Group'
+ when Group.sti_name
Group
- when 'Project'
+ when Namespaces::ProjectNamespace.sti_name
Namespaces::ProjectNamespace
- when 'User'
- # TODO: We create a normal Namespace until
- # https://gitlab.com/gitlab-org/gitlab/-/merge_requests/68894 is ready
- Namespace
+ when Namespaces::UserNamespace.sti_name
+ Namespaces::UserNamespace
else
Namespace
end
@@ -247,27 +265,27 @@ class Namespace < ApplicationRecord
end
def kind
- return 'group' if group?
- return 'project' if project?
+ return 'group' if group_namespace?
+ return 'project' if project_namespace?
'user' # defaults to user
end
- def group?
+ def group_namespace?
type == Group.sti_name
end
- def project?
+ def project_namespace?
type == Namespaces::ProjectNamespace.sti_name
end
- def user?
+ def user_namespace?
# That last bit ensures we're considered a user namespace as a default
- type.nil? || type == Namespaces::UserNamespace.sti_name || !(group? || project?)
+ type.nil? || type == Namespaces::UserNamespace.sti_name || !(group_namespace? || project_namespace?)
end
def owner_required?
- user?
+ user_namespace?
end
def find_fork_of(project)
@@ -314,7 +332,7 @@ class Namespace < ApplicationRecord
# that belongs to this namespace
def all_projects
if Feature.enabled?(:recursive_approach_for_all_projects, default_enabled: :yaml)
- namespace = user? ? self : self_and_descendant_ids
+ namespace = user_namespace? ? self : self_and_descendant_ids
Project.where(namespace: namespace)
else
Project.inside_path(full_path)
@@ -416,7 +434,7 @@ class Namespace < ApplicationRecord
def changing_shared_runners_enabled_is_allowed
return unless new_record? || changes.has_key?(:shared_runners_enabled)
- if shared_runners_enabled && has_parent? && parent.shared_runners_setting == 'disabled_and_unoverridable'
+ if shared_runners_enabled && has_parent? && parent.shared_runners_setting == SR_DISABLED_AND_UNOVERRIDABLE
errors.add(:shared_runners_enabled, _('cannot be enabled because parent group has shared Runners disabled'))
end
end
@@ -428,30 +446,30 @@ class Namespace < ApplicationRecord
errors.add(:allow_descendants_override_disabled_shared_runners, _('cannot be changed if shared runners are enabled'))
end
- if allow_descendants_override_disabled_shared_runners && has_parent? && parent.shared_runners_setting == 'disabled_and_unoverridable'
+ if allow_descendants_override_disabled_shared_runners && has_parent? && parent.shared_runners_setting == SR_DISABLED_AND_UNOVERRIDABLE
errors.add(:allow_descendants_override_disabled_shared_runners, _('cannot be enabled because parent group does not allow it'))
end
end
def shared_runners_setting
if shared_runners_enabled
- 'enabled'
+ SR_ENABLED
else
if allow_descendants_override_disabled_shared_runners
- 'disabled_with_override'
+ SR_DISABLED_WITH_OVERRIDE
else
- 'disabled_and_unoverridable'
+ SR_DISABLED_AND_UNOVERRIDABLE
end
end
end
def shared_runners_setting_higher_than?(other_setting)
- if other_setting == 'enabled'
+ if other_setting == SR_ENABLED
false
- elsif other_setting == 'disabled_with_override'
- shared_runners_setting == 'enabled'
- elsif other_setting == 'disabled_and_unoverridable'
- shared_runners_setting == 'enabled' || shared_runners_setting == 'disabled_with_override'
+ elsif other_setting == SR_DISABLED_WITH_OVERRIDE
+ shared_runners_setting == SR_ENABLED
+ elsif other_setting == SR_DISABLED_AND_UNOVERRIDABLE
+ shared_runners_setting == SR_ENABLED || shared_runners_setting == SR_DISABLED_WITH_OVERRIDE
else
raise ArgumentError
end
@@ -536,21 +554,21 @@ class Namespace < ApplicationRecord
def validate_parent_type
unless has_parent?
- if project?
+ if project_namespace?
errors.add(:parent_id, _('must be set for a project namespace'))
end
return
end
- if parent.project?
+ if parent.project_namespace?
errors.add(:parent_id, _('project namespace cannot be the parent of another namespace'))
end
- if user?
+ if user_namespace?
errors.add(:parent_id, _('cannot not be used for user namespace'))
- elsif group?
- errors.add(:parent_id, _('user namespace cannot be the parent of another namespace')) if parent.user?
+ elsif group_namespace?
+ errors.add(:parent_id, _('user namespace cannot be the parent of another namespace')) if parent.user_namespace?
end
end
@@ -575,6 +593,10 @@ class Namespace < ApplicationRecord
project.track_project_repository
end
end
+
+ def enforce_minimum_path_length?
+ path_changed? && !project_namespace?
+ end
end
Namespace.prepend_mod_with('Namespace')
diff --git a/app/models/namespace/root_storage_statistics.rb b/app/models/namespace/root_storage_statistics.rb
index 73061b78637..99e32537595 100644
--- a/app/models/namespace/root_storage_statistics.rb
+++ b/app/models/namespace/root_storage_statistics.rb
@@ -57,7 +57,7 @@ class Namespace::RootStorageStatistics < ApplicationRecord
end
def attributes_from_personal_snippets
- return {} unless namespace.user?
+ return {} unless namespace.user_namespace?
from_personal_snippets.take.slice(SNIPPETS_SIZE_STAT_NAME)
end
diff --git a/app/models/namespaces/user_namespace.rb b/app/models/namespaces/user_namespace.rb
index 517d68b118d..22b7a0a3b2b 100644
--- a/app/models/namespaces/user_namespace.rb
+++ b/app/models/namespaces/user_namespace.rb
@@ -1,7 +1,7 @@
# frozen_string_literal: true
# TODO: currently not created/mapped in the database, will be done in another issue
-# https://gitlab.com/gitlab-org/gitlab/-/issues/337102
+# https://gitlab.com/gitlab-org/gitlab/-/issues/341070
module Namespaces
class UserNamespace < Namespace
def self.sti_name
diff --git a/app/models/note.rb b/app/models/note.rb
index a8f5c305d9b..37473518892 100644
--- a/app/models/note.rb
+++ b/app/models/note.rb
@@ -149,7 +149,7 @@ class Note < ApplicationRecord
scope :like_note_or_capitalized_note, ->(text) { where('(note LIKE ? OR note LIKE ?)', text, text.capitalize) }
before_validation :nullify_blank_type, :nullify_blank_line_code
- after_save :keep_around_commit, if: :for_project_noteable?, unless: :importing?
+ after_save :keep_around_commit, if: :for_project_noteable?, unless: -> { importing? || skip_keep_around_commits }
after_save :expire_etag_cache, unless: :importing?
after_save :touch_noteable, unless: :importing?
after_destroy :expire_etag_cache
@@ -355,8 +355,6 @@ class Note < ApplicationRecord
end
def noteable_author?(noteable)
- return false unless ::Feature.enabled?(:show_author_on_note, project)
-
noteable.author == self.author
end
diff --git a/app/models/operations/feature_flag.rb b/app/models/operations/feature_flag.rb
index 46810749b18..7db396bcad5 100644
--- a/app/models/operations/feature_flag.rb
+++ b/app/models/operations/feature_flag.rb
@@ -19,13 +19,10 @@ module Operations
default_value_for :active, true
default_value_for :version, :new_version_flag
- # scopes exists only for the first version
- has_many :scopes, class_name: 'Operations::FeatureFlagScope'
# strategies exists only for the second version
has_many :strategies, class_name: 'Operations::FeatureFlags::Strategy'
has_many :feature_flag_issues
has_many :issues, through: :feature_flag_issues
- has_one :default_scope, -> { where(environment_scope: '*') }, class_name: 'Operations::FeatureFlagScope'
validates :project, presence: true
validates :name,
@@ -37,10 +34,7 @@ module Operations
}
validates :name, uniqueness: { scope: :project_id }
validates :description, allow_blank: true, length: 0..255
- validate :first_default_scope, on: :create, if: :has_scopes?
- validate :version_associations
- accepts_nested_attributes_for :scopes, allow_destroy: true
accepts_nested_attributes_for :strategies, allow_destroy: true
scope :ordered, -> { order(:name) }
@@ -56,7 +50,7 @@ module Operations
class << self
def preload_relations
- preload(:scopes, strategies: :scopes)
+ preload(strategies: :scopes)
end
def for_unleash_client(project, environment)
@@ -104,13 +98,6 @@ module Operations
Ability.issues_readable_by_user(issues, current_user)
end
- def execute_hooks(current_user)
- run_after_commit do
- feature_flag_data = Gitlab::DataBuilder::FeatureFlag.build(self, current_user)
- project.execute_hooks(feature_flag_data, :feature_flag_hooks)
- end
- end
-
def hook_attrs
{
id: id,
@@ -119,27 +106,5 @@ module Operations
active: active
}
end
-
- private
-
- def version_associations
- if new_version_flag? && scopes.any?
- errors.add(:version_associations, 'version 2 feature flags may not have scopes')
- end
- end
-
- def first_default_scope
- unless scopes.first.environment_scope == '*'
- errors.add(:default_scope, 'has to be the first element')
- end
- end
-
- def build_default_scope
- scopes.build(environment_scope: '*', active: self.active)
- end
-
- def has_scopes?
- scopes.any?
- end
end
end
diff --git a/app/models/operations/feature_flag_scope.rb b/app/models/operations/feature_flag_scope.rb
deleted file mode 100644
index 9068ca0f588..00000000000
--- a/app/models/operations/feature_flag_scope.rb
+++ /dev/null
@@ -1,66 +0,0 @@
-# frozen_string_literal: true
-
-# All of the legacy flags have been removed in 14.1, including all of the
-# `operations_feature_flag_scopes` rows. Therefore, this model and the database
-# table are unused and should be removed.
-
-module Operations
- class FeatureFlagScope < ApplicationRecord
- prepend HasEnvironmentScope
- include Gitlab::Utils::StrongMemoize
-
- self.table_name = 'operations_feature_flag_scopes'
-
- belongs_to :feature_flag
-
- validates :environment_scope, uniqueness: {
- scope: :feature_flag,
- message: "(%{value}) has already been taken"
- }
-
- validates :environment_scope,
- if: :default_scope?, on: :update,
- inclusion: { in: %w(*), message: 'cannot be changed from default scope' }
-
- validates :strategies, feature_flag_strategies: true
-
- before_destroy :prevent_destroy_default_scope, if: :default_scope?
-
- scope :ordered, -> { order(:id) }
- scope :enabled, -> { where(active: true) }
- scope :disabled, -> { where(active: false) }
-
- def self.with_name_and_description
- joins(:feature_flag)
- .select(FeatureFlag.arel_table[:name], FeatureFlag.arel_table[:description])
- end
-
- def self.for_unleash_client(project, environment)
- select_columns = [
- 'DISTINCT ON (operations_feature_flag_scopes.feature_flag_id) operations_feature_flag_scopes.id',
- '(operations_feature_flags.active AND operations_feature_flag_scopes.active) AS active',
- 'operations_feature_flag_scopes.strategies',
- 'operations_feature_flag_scopes.environment_scope',
- 'operations_feature_flag_scopes.created_at',
- 'operations_feature_flag_scopes.updated_at'
- ]
-
- select(select_columns)
- .with_name_and_description
- .where(feature_flag_id: project.operations_feature_flags.select(:id))
- .order(:feature_flag_id)
- .on_environment(environment)
- .reverse_order
- end
-
- private
-
- def default_scope?
- environment_scope_was == '*'
- end
-
- def prevent_destroy_default_scope
- raise ActiveRecord::ReadOnlyRecord, "default scope cannot be destroyed"
- end
- end
-end
diff --git a/app/models/packages/composer/cache_file.rb b/app/models/packages/composer/cache_file.rb
index ecd7596b989..5222101d171 100644
--- a/app/models/packages/composer/cache_file.rb
+++ b/app/models/packages/composer/cache_file.rb
@@ -9,15 +9,13 @@ module Packages
mount_file_store_uploader Packages::Composer::CacheUploader
- belongs_to :group, -> { where(type: 'Group') }, foreign_key: 'namespace_id'
+ belongs_to :group, -> { where(type: Group.sti_name) }, foreign_key: 'namespace_id'
belongs_to :namespace
validates :namespace, presence: true
scope :with_namespace, ->(namespace) { where(namespace: namespace) }
scope :with_sha, ->(sha) { where(file_sha256: sha) }
- scope :expired, -> { where("delete_at <= ?", Time.current) }
- scope :without_namespace, -> { where(namespace_id: nil) }
end
end
end
diff --git a/app/models/packages/helm/file_metadatum.rb b/app/models/packages/helm/file_metadatum.rb
index 1771003d1f9..dfa4ab6df82 100644
--- a/app/models/packages/helm/file_metadatum.rb
+++ b/app/models/packages/helm/file_metadatum.rb
@@ -12,7 +12,7 @@ module Packages
validates :channel,
presence: true,
- length: { maximum: 63 },
+ length: { maximum: 255 },
format: { with: Gitlab::Regex.helm_channel_regex }
validates :metadata,
diff --git a/app/models/pages_domain.rb b/app/models/pages_domain.rb
index c932d0bf800..0c5a155d48a 100644
--- a/app/models/pages_domain.rb
+++ b/app/models/pages_domain.rb
@@ -129,18 +129,15 @@ class PagesDomain < ApplicationRecord
store = OpenSSL::X509::Store.new
store.set_default_paths
- # This forces to load all intermediate certificates stored in `certificate`
- Tempfile.open('certificate_chain') do |f|
- f.write(certificate)
- f.flush
- store.add_file(f.path)
- end
-
- store.verify(x509)
+ store.verify(x509, untrusted_ca_certs_bundle)
rescue OpenSSL::X509::StoreError
false
end
+ def untrusted_ca_certs_bundle
+ ::Gitlab::X509::Certificate.load_ca_certs_bundle(certificate)
+ end
+
def expired?
return false unless x509
diff --git a/app/models/preloaders/merge_requests_preloader.rb b/app/models/preloaders/merge_requests_preloader.rb
deleted file mode 100644
index cefe8408cab..00000000000
--- a/app/models/preloaders/merge_requests_preloader.rb
+++ /dev/null
@@ -1,19 +0,0 @@
-# frozen_string_literal: true
-
-module Preloaders
- class MergeRequestsPreloader
- attr_reader :merge_requests
-
- def initialize(merge_requests)
- @merge_requests = merge_requests
- end
-
- def execute
- preloader = ActiveRecord::Associations::Preloader.new
- preloader.preload(merge_requests, { target_project: [:project_feature] })
- merge_requests.each do |merge_request|
- merge_request.lazy_upvotes_count
- end
- end
- end
-end
diff --git a/app/models/product_analytics_event.rb b/app/models/product_analytics_event.rb
index d2026d3b333..52baa3be6c4 100644
--- a/app/models/product_analytics_event.rb
+++ b/app/models/product_analytics_event.rb
@@ -20,8 +20,6 @@ class ProductAnalyticsEvent < ApplicationRecord
where('collector_tstamp BETWEEN ? AND ? ', today - duration + 1, today + 1)
}
- scope :by_category_and_action, ->(category, action) { where(se_category: category, se_action: action) }
-
def self.count_by_graph(graph, days)
group(graph).timerange(days).count
end
diff --git a/app/models/project.rb b/app/models/project.rb
index 74ffeef797e..6eb19b4462c 100644
--- a/app/models/project.rb
+++ b/app/models/project.rb
@@ -98,6 +98,7 @@ class Project < ApplicationRecord
before_validation :mark_remote_mirrors_for_removal, if: -> { RemoteMirror.table_exists? }
before_save :ensure_runners_token
+ before_save :ensure_project_namespace_in_sync
after_save :update_project_statistics, if: :saved_change_to_namespace_id?
@@ -128,26 +129,9 @@ class Project < ApplicationRecord
after_initialize :use_hashed_storage
after_create :check_repository_absence!
- # Required during the `ActsAsTaggableOn::Tag -> Topic` migration
- # TODO: remove 'acts_as_ordered_taggable_on' and ':topics_acts_as_taggable' in the further process of the migration
- # https://gitlab.com/gitlab-org/gitlab/-/issues/335946
- acts_as_ordered_taggable_on :topics
- has_many :topics_acts_as_taggable, -> { order("#{ActsAsTaggableOn::Tagging.table_name}.id") },
- class_name: 'ActsAsTaggableOn::Tag',
- through: :topic_taggings,
- source: :tag
-
has_many :project_topics, -> { order(:id) }, class_name: 'Projects::ProjectTopic'
has_many :topics, through: :project_topics, class_name: 'Projects::Topic'
- # Required during the `ActsAsTaggableOn::Tag -> Topic` migration
- # TODO: remove 'topics' in the further process of the migration
- # https://gitlab.com/gitlab-org/gitlab/-/issues/335946
- alias_method :topics_new, :topics
- def topics
- self.topics_acts_as_taggable + self.topics_new
- end
-
attr_accessor :old_path_with_namespace
attr_accessor :template_name
attr_writer :pipeline_status
@@ -159,11 +143,11 @@ class Project < ApplicationRecord
# Relations
belongs_to :pool_repository
belongs_to :creator, class_name: 'User'
- belongs_to :group, -> { where(type: 'Group') }, foreign_key: 'namespace_id'
+ belongs_to :group, -> { where(type: Group.sti_name) }, foreign_key: 'namespace_id'
belongs_to :namespace
# Sync deletion via DB Trigger to ensure we do not have
# a project without a project_namespace (or vice-versa)
- belongs_to :project_namespace, class_name: 'Namespaces::ProjectNamespace', foreign_key: 'project_namespace_id', inverse_of: :project
+ belongs_to :project_namespace, autosave: true, class_name: 'Namespaces::ProjectNamespace', foreign_key: 'project_namespace_id', inverse_of: :project
alias_method :parent, :namespace
alias_attribute :parent_id, :namespace_id
@@ -233,6 +217,7 @@ class Project < ApplicationRecord
has_one :import_state, autosave: true, class_name: 'ProjectImportState', inverse_of: :project
has_one :import_export_upload, dependent: :destroy # rubocop:disable Cop/ActiveRecordDependent
has_many :export_jobs, class_name: 'ProjectExportJob'
+ has_many :bulk_import_exports, class_name: 'BulkImports::Export', inverse_of: :project
has_one :project_repository, inverse_of: :project
has_one :tracing_setting, class_name: 'ProjectTracingSetting'
has_one :incident_management_setting, inverse_of: :project, class_name: 'IncidentManagement::ProjectIncidentManagementSetting'
@@ -652,15 +637,8 @@ class Project < ApplicationRecord
scope :with_topic, ->(topic_name) do
topic = Projects::Topic.find_by_name(topic_name)
- acts_as_taggable_on_topic = ActsAsTaggableOn::Tag.find_by_name(topic_name)
-
- return none unless topic || acts_as_taggable_on_topic
-
- relations = []
- relations << where(id: topic.project_topics.select(:project_id)) if topic
- relations << where(id: acts_as_taggable_on_topic.taggings.select(:taggable_id)) if acts_as_taggable_on_topic
- Project.from_union(relations)
+ topic ? where(id: topic.project_topics.select(:project_id)) : none
end
enum auto_cancel_pending_pipelines: { disabled: 0, enabled: 1 }
@@ -678,7 +656,7 @@ class Project < ApplicationRecord
mount_uploader :bfg_object_map, AttachmentUploader
def self.with_api_entity_associations
- preload(:project_feature, :route, :topics, :topics_acts_as_taggable, :group, :timelogs, namespace: [:route, :owner])
+ preload(:project_feature, :route, :topics, :group, :timelogs, namespace: [:route, :owner])
end
def self.with_web_entity_associations
@@ -851,7 +829,7 @@ class Project < ApplicationRecord
end
def group_ids
- joins(:namespace).where(namespaces: { type: 'Group' }).select(:namespace_id)
+ joins(:namespace).where(namespaces: { type: Group.sti_name }).select(:namespace_id)
end
# Returns ids of projects with issuables available for given user
@@ -1200,7 +1178,7 @@ class Project < ApplicationRecord
end
def import?
- external_import? || forked? || gitlab_project_import? || jira_import? || bare_repository_import?
+ external_import? || forked? || gitlab_project_import? || jira_import? || bare_repository_import? || gitlab_project_migration?
end
def external_import?
@@ -1223,6 +1201,10 @@ class Project < ApplicationRecord
import_type == 'gitlab_project'
end
+ def gitlab_project_migration?
+ import_type == 'gitlab_project_migration'
+ end
+
def gitea_import?
import_type == 'gitea'
end
@@ -1327,11 +1309,21 @@ class Project < ApplicationRecord
def changing_shared_runners_enabled_is_allowed
return unless new_record? || changes.has_key?(:shared_runners_enabled)
- if shared_runners_enabled && group && group.shared_runners_setting == 'disabled_and_unoverridable'
+ if shared_runners_setting_conflicting_with_group?
errors.add(:shared_runners_enabled, _('cannot be enabled because parent group does not allow it'))
end
end
+ def shared_runners_setting_conflicting_with_group?
+ shared_runners_enabled && group&.shared_runners_setting == Namespace::SR_DISABLED_AND_UNOVERRIDABLE
+ end
+
+ def reconcile_shared_runners_setting!
+ if shared_runners_setting_conflicting_with_group?
+ self.shared_runners_enabled = false
+ end
+ end
+
def to_param
if persisted? && errors.include?(:path)
path_was
@@ -1814,7 +1806,7 @@ class Project < ApplicationRecord
def open_issues_count(current_user = nil)
return Projects::OpenIssuesCountService.new(self, current_user).count unless current_user.nil?
- BatchLoader.for(self).batch(replace_methods: false) do |projects, loader|
+ BatchLoader.for(self).batch do |projects, loader|
issues_count_per_project = ::Projects::BatchOpenIssuesCountService.new(projects).refresh_cache_and_retrieve_data
issues_count_per_project.each do |project, count|
@@ -2279,7 +2271,7 @@ class Project < ApplicationRecord
# rubocop: disable CodeReuse/ServiceClass
def forks_count
- BatchLoader.for(self).batch(replace_methods: false) do |projects, loader|
+ BatchLoader.for(self).batch do |projects, loader|
fork_count_per_project = ::Projects::BatchForksCountService.new(projects).refresh_cache_and_retrieve_data
fork_count_per_project.each do |project, count|
@@ -2418,7 +2410,7 @@ class Project < ApplicationRecord
end
def mark_primary_write_location
- ::Gitlab::Database::LoadBalancing::Sticking.mark_primary_write_location(:project, self.id)
+ self.class.sticking.mark_primary_write_location(:project, self.id)
end
def toggle_ci_cd_settings!(settings_attribute)
@@ -2677,10 +2669,6 @@ class Project < ApplicationRecord
ProjectStatistics.increment_statistic(self, statistic, delta)
end
- def merge_requests_author_approval
- !!read_attribute(:merge_requests_author_approval)
- end
-
def ci_forward_deployment_enabled?
return false unless ci_cd_settings
@@ -2734,15 +2722,9 @@ class Project < ApplicationRecord
@topic_list = @topic_list.split(',') if @topic_list.instance_of?(String)
@topic_list = @topic_list.map(&:strip).uniq.reject(&:empty?)
- if @topic_list != self.topic_list || self.topics_acts_as_taggable.any?
- self.topics_new.delete_all
+ if @topic_list != self.topic_list
+ self.topics.delete_all
self.topics = @topic_list.map { |topic| Projects::Topic.find_or_create_by(name: topic) }
-
- # Remove old topics (ActsAsTaggableOn::Tag)
- # Required during the `ActsAsTaggableOn::Tag -> Topic` migration
- # TODO: remove in the further process of the migration
- # https://gitlab.com/gitlab-org/gitlab/-/issues/335946
- self.topic_taggings.clear
end
@topic_list = nil
@@ -2912,6 +2894,15 @@ class Project < ApplicationRecord
def online_runners_with_tags
@online_runners_with_tags ||= active_runners.with_tags.online
end
+
+ def ensure_project_namespace_in_sync
+ if changes.keys & [:name, :path, :namespace_id, :visibility_level] && project_namespace.present?
+ project_namespace.name = name
+ project_namespace.path = path
+ project_namespace.parent = namespace
+ project_namespace.visibility_level = visibility_level
+ end
+ end
end
Project.prepend_mod_with('Project')
diff --git a/app/models/project_setting.rb b/app/models/project_setting.rb
index b2559636f32..24d892290a6 100644
--- a/app/models/project_setting.rb
+++ b/app/models/project_setting.rb
@@ -1,10 +1,6 @@
# frozen_string_literal: true
class ProjectSetting < ApplicationRecord
- include IgnorableColumns
-
- ignore_column :allow_editing_commit_messages, remove_with: '14.4', remove_after: '2021-09-10'
-
belongs_to :project, inverse_of: :project_setting
enum squash_option: {
diff --git a/app/models/project_statistics.rb b/app/models/project_statistics.rb
index 387732cf151..99cec647a98 100644
--- a/app/models/project_statistics.rb
+++ b/app/models/project_statistics.rb
@@ -31,7 +31,6 @@ class ProjectStatistics < ApplicationRecord
scope :for_project_ids, ->(project_ids) { where(project_id: project_ids) }
scope :for_namespaces, -> (namespaces) { where(namespace: namespaces) }
- scope :with_any_ci_minutes_used, -> { where.not(shared_runners_seconds: 0) }
def total_repository_size
repository_size + lfs_objects_size
@@ -70,7 +69,7 @@ class ProjectStatistics < ApplicationRecord
end
def update_lfs_objects_size
- self.lfs_objects_size = project.lfs_objects.sum(:size)
+ self.lfs_objects_size = LfsObject.joins(:lfs_objects_projects).where(lfs_objects_projects: { project_id: project.id }).sum(:size)
end
def update_uploads_size
diff --git a/app/models/projects/project_topic.rb b/app/models/projects/project_topic.rb
index d4b456ef482..7021a48646a 100644
--- a/app/models/projects/project_topic.rb
+++ b/app/models/projects/project_topic.rb
@@ -3,6 +3,6 @@
module Projects
class ProjectTopic < ApplicationRecord
belongs_to :project
- belongs_to :topic
+ belongs_to :topic, counter_cache: :total_projects_count
end
end
diff --git a/app/models/projects/topic.rb b/app/models/projects/topic.rb
index a17aa550edb..f3352ecc5ee 100644
--- a/app/models/projects/topic.rb
+++ b/app/models/projects/topic.rb
@@ -1,10 +1,30 @@
# frozen_string_literal: true
+require 'carrierwave/orm/activerecord'
+
module Projects
class Topic < ApplicationRecord
+ include Avatarable
+ include Gitlab::SQL::Pattern
+
validates :name, presence: true, uniqueness: true, length: { maximum: 255 }
+ validates :description, length: { maximum: 1024 }
has_many :project_topics, class_name: 'Projects::ProjectTopic'
has_many :projects, through: :project_topics
+
+ scope :order_by_total_projects_count, -> { order(total_projects_count: :desc).order(id: :asc) }
+ scope :reorder_by_similarity, -> (search) do
+ order_expression = Gitlab::Database::SimilarityScore.build_expression(search: search, rules: [
+ { column: arel_table['name'] }
+ ])
+ reorder(order_expression.desc, arel_table['total_projects_count'].desc, arel_table['id'])
+ end
+
+ class << self
+ def search(query)
+ fuzzy_search(query, [:name])
+ end
+ end
end
end
diff --git a/app/models/protected_branch.rb b/app/models/protected_branch.rb
index 3d32144e0f8..b4e2d17c3e5 100644
--- a/app/models/protected_branch.rb
+++ b/app/models/protected_branch.rb
@@ -10,6 +10,8 @@ class ProtectedBranch < ApplicationRecord
scope :allowing_force_push,
-> { where(allow_force_push: true) }
+ scope :get_ids_by_name, -> (name) { where(name: name).pluck(:id) }
+
protected_ref_access_levels :merge, :push
def self.protected_ref_accessible_to?(ref, user, project:, action:, protected_refs: nil)
diff --git a/app/models/release.rb b/app/models/release.rb
index 0dd71c6ebfb..eac6346cc60 100644
--- a/app/models/release.rb
+++ b/app/models/release.rb
@@ -33,6 +33,7 @@ class Release < ApplicationRecord
includes(:author, :evidences, :milestones, :links, :sorted_links,
project: [:project_feature, :route, { namespace: :route }])
}
+ scope :with_milestones, -> { joins(:milestone_releases) }
scope :recent, -> { sorted.limit(MAX_NUMBER_TO_DISPLAY) }
scope :without_evidence, -> { left_joins(:evidences).where(::Releases::Evidence.arel_table[:id].eq(nil)) }
scope :released_within_2hrs, -> { where(released_at: Time.zone.now - 1.hour..Time.zone.now + 1.hour) }
diff --git a/app/models/repository.rb b/app/models/repository.rb
index f20b306c806..119d874a6e1 100644
--- a/app/models/repository.rb
+++ b/app/models/repository.rb
@@ -732,7 +732,7 @@ class Repository
end
def tags_sorted_by(value)
- return raw_repository.tags(sort_by: value) if Feature.enabled?(:gitaly_tags_finder, project, default_enabled: :yaml)
+ return raw_repository.tags(sort_by: value) if Feature.enabled?(:tags_finder_gitaly, project, default_enabled: :yaml)
tags_ruby_sort(value)
end
@@ -1054,10 +1054,10 @@ class Repository
end
def squash(user, merge_request, message)
- raw.squash(user, merge_request.id, start_sha: merge_request.diff_start_sha,
- end_sha: merge_request.diff_head_sha,
- author: merge_request.author,
- message: message)
+ raw.squash(user, start_sha: merge_request.diff_start_sha,
+ end_sha: merge_request.diff_head_sha,
+ author: merge_request.author,
+ message: message)
end
def submodule_links
diff --git a/app/models/upload.rb b/app/models/upload.rb
index 0a4acdfc7e3..c1a3df82457 100644
--- a/app/models/upload.rb
+++ b/app/models/upload.rb
@@ -18,6 +18,8 @@ class Upload < ApplicationRecord
before_save :calculate_checksum!, if: :foreground_checksummable?
after_commit :schedule_checksum, if: :needs_checksum?
+ after_commit :update_project_statistics, on: [:create, :destroy], if: :project?
+
# as the FileUploader is not mounted, the default CarrierWave ActiveRecord
# hooks are not executed and the file will not be deleted
after_destroy :delete_file!, if: -> { uploader_class <= FileUploader }
@@ -67,7 +69,7 @@ class Upload < ApplicationRecord
self.checksum = nil
return unless needs_checksum?
- self.checksum = self.class.hexdigest(absolute_path)
+ self.checksum = self.class.sha256_hexdigest(absolute_path)
end
# Initialize the associated Uploader class with current model
@@ -161,6 +163,14 @@ class Upload < ApplicationRecord
def mount_point
super&.to_sym
end
+
+ def project?
+ model_type == "Project"
+ end
+
+ def update_project_statistics
+ ProjectCacheWorker.perform_async(model_id, [], [:uploads_size])
+ end
end
Upload.prepend_mod_with('Upload')
diff --git a/app/models/user.rb b/app/models/user.rb
index a4c8d606911..25a2588a6a7 100644
--- a/app/models/user.rb
+++ b/app/models/user.rb
@@ -112,7 +112,14 @@ class User < ApplicationRecord
#
# Namespace for personal projects
- has_one :namespace, -> { where(type: nil) }, dependent: :destroy, foreign_key: :owner_id, inverse_of: :owner, autosave: true # rubocop:disable Cop/ActiveRecordDependent
+ # TODO: change to `:namespace, -> { where(type: Namespaces::UserNamespace.sti_name}, class_name: 'Namespaces::UserNamespace'...`
+ # when working on issue https://gitlab.com/gitlab-org/gitlab/-/issues/341070
+ has_one :namespace,
+ -> { where(type: [nil, Namespaces::UserNamespace.sti_name]) },
+ dependent: :destroy, # rubocop:disable Cop/ActiveRecordDependent
+ foreign_key: :owner_id,
+ inverse_of: :owner,
+ autosave: true # rubocop:disable Cop/ActiveRecordDependent
# Profile
has_many :keys, -> { regular_keys }, dependent: :destroy # rubocop:disable Cop/ActiveRecordDependent
@@ -229,9 +236,9 @@ class User < ApplicationRecord
validates :first_name, length: { maximum: 127 }
validates :last_name, length: { maximum: 127 }
validates :email, confirmation: true
- validates :notification_email, devise_email: true, allow_blank: true, if: ->(user) { user.notification_email != user.email }
+ validates :notification_email, devise_email: true, allow_blank: true
validates :public_email, uniqueness: true, devise_email: true, allow_blank: true
- validates :commit_email, devise_email: true, allow_blank: true, if: ->(user) { user.commit_email != user.email && user.commit_email != Gitlab::PrivateCommitEmail::TOKEN }
+ validates :commit_email, devise_email: true, allow_blank: true, unless: ->(user) { user.commit_email == Gitlab::PrivateCommitEmail::TOKEN }
validates :projects_limit,
presence: true,
numericality: { greater_than_or_equal_to: 0, less_than_or_equal_to: Gitlab::Database::MAX_INT_VALUE }
@@ -316,6 +323,7 @@ class User < ApplicationRecord
delegate :webauthn_xid, :webauthn_xid=, to: :user_detail, allow_nil: true
delegate :pronouns, :pronouns=, to: :user_detail, allow_nil: true
delegate :pronunciation, :pronunciation=, to: :user_detail, allow_nil: true
+ delegate :registration_objective, :registration_objective=, to: :user_detail, allow_nil: true
accepts_nested_attributes_for :user_preference, update_only: true
accepts_nested_attributes_for :user_detail, update_only: true
@@ -449,11 +457,12 @@ class User < ApplicationRecord
scope :dormant, -> { active.where('last_activity_on <= ?', MINIMUM_INACTIVE_DAYS.day.ago.to_date) }
scope :with_no_activity, -> { active.where(last_activity_on: nil) }
scope :by_provider_and_extern_uid, ->(provider, extern_uid) { joins(:identities).merge(Identity.with_extern_uid(provider, extern_uid)) }
+ scope :get_ids_by_username, -> (username) { where(username: username).pluck(:id) }
def preferred_language
read_attribute('preferred_language') ||
I18n.default_locale.to_s.presence_in(Gitlab::I18n.available_locales) ||
- 'en'
+ default_preferred_language
end
def active_for_authentication?
@@ -728,7 +737,7 @@ class User < ApplicationRecord
end
def find_by_full_path(path, follow_redirects: false)
- namespace = Namespace.for_user.find_by_full_path(path, follow_redirects: follow_redirects)
+ namespace = Namespace.user_namespaces.find_by_full_path(path, follow_redirects: follow_redirects)
namespace&.owner
end
@@ -1434,7 +1443,10 @@ class User < ApplicationRecord
namespace.path = username if username_changed?
namespace.name = name if name_changed?
else
- namespace = build_namespace(path: username, name: name)
+ # TODO: we should no longer need the `type` parameter once we can make the
+ # the `has_one :namespace` association use the correct class.
+ # issue https://gitlab.com/gitlab-org/gitlab/-/issues/341070
+ namespace = build_namespace(path: username, name: name, type: ::Namespaces::UserNamespace.sti_name)
namespace.build_namespace_settings
end
end
@@ -2003,6 +2015,11 @@ class User < ApplicationRecord
private
+ # To enable JiHu repository to modify the default language options
+ def default_preferred_language
+ 'en'
+ end
+
def notification_email_verified
return if notification_email.blank? || temp_oauth_email?
@@ -2094,10 +2111,14 @@ class User < ApplicationRecord
errors.add(:email, error) if error
end
+ def signup_email_invalid_message
+ _('is not allowed for sign-up.')
+ end
+
def check_username_format
return if username.blank? || Mime::EXTENSION_LOOKUP.keys.none? { |type| username.end_with?(".#{type}") }
- errors.add(:username, _('ending with a file extension is not allowed.'))
+ errors.add(:username, _('ending with a reserved file extension is not allowed.'))
end
def groups_with_developer_maintainer_project_access
diff --git a/app/models/user_callout.rb b/app/models/user_callout.rb
index 04bc29755f8..b990aedd4f8 100644
--- a/app/models/user_callout.rb
+++ b/app/models/user_callout.rb
@@ -36,7 +36,8 @@ class UserCallout < ApplicationRecord
trial_status_reminder_d3: 35, # EE-only
security_configuration_devops_alert: 36, # EE-only
profile_personal_access_token_expiry: 37, # EE-only
- terraform_notification_dismissed: 38
+ terraform_notification_dismissed: 38,
+ security_newsletter_callout: 39
}
validates :feature_name,
diff --git a/app/models/user_detail.rb b/app/models/user_detail.rb
index c41cff67864..6b0ed89c683 100644
--- a/app/models/user_detail.rb
+++ b/app/models/user_detail.rb
@@ -3,7 +3,10 @@
class UserDetail < ApplicationRecord
extend ::Gitlab::Utils::Override
include IgnorableColumns
- ignore_columns %i[bio_html cached_markdown_version], remove_with: '13.6', remove_after: '2021-10-22'
+
+ ignore_columns %i[bio_html cached_markdown_version], remove_with: '14.5', remove_after: '2021-10-22'
+
+ REGISTRATION_OBJECTIVE_PAIRS = { basics: 0, move_repository: 1, code_storage: 2, exploring: 3, ci: 4, other: 5, joining_team: 6 }.freeze
belongs_to :user
@@ -14,6 +17,8 @@ class UserDetail < ApplicationRecord
before_save :prevent_nil_bio
+ enum registration_objective: REGISTRATION_OBJECTIVE_PAIRS, _suffix: true
+
private
def prevent_nil_bio
diff --git a/app/models/user_highest_role.rb b/app/models/user_highest_role.rb
index 4853fc3d248..dd5c85a5a87 100644
--- a/app/models/user_highest_role.rb
+++ b/app/models/user_highest_role.rb
@@ -3,7 +3,13 @@
class UserHighestRole < ApplicationRecord
belongs_to :user, optional: false
- validates :highest_access_level, allow_nil: true, inclusion: { in: Gitlab::Access.all_values }
+ validates :highest_access_level, allow_nil: true, inclusion: { in: ->(_) { self.allowed_values } }
scope :with_highest_access_level, -> (highest_access_level) { where(highest_access_level: highest_access_level) }
+
+ def self.allowed_values
+ Gitlab::Access.all_values
+ end
end
+
+UserHighestRole.prepend_mod
diff --git a/app/models/user_preference.rb b/app/models/user_preference.rb
index 337ae7125f3..7687430cfd1 100644
--- a/app/models/user_preference.rb
+++ b/app/models/user_preference.rb
@@ -23,7 +23,6 @@ class UserPreference < ApplicationRecord
ignore_columns :experience_level, remove_with: '14.10', remove_after: '2021-03-22'
default_value_for :tab_width, value: Gitlab::TabWidth::DEFAULT, allows_nil: false
- default_value_for :timezone, value: Time.zone.tzinfo.name, allows_nil: false
default_value_for :time_display_relative, value: true, allows_nil: false
default_value_for :time_format_in_24h, value: false, allows_nil: false
default_value_for :render_whitespace_in_code, value: false, allows_nil: false
diff --git a/app/models/users/credit_card_validation.rb b/app/models/users/credit_card_validation.rb
index 5e255acd882..a4cc43d1f13 100644
--- a/app/models/users/credit_card_validation.rb
+++ b/app/models/users/credit_card_validation.rb
@@ -7,5 +7,18 @@ module Users
self.table_name = 'user_credit_card_validations'
belongs_to :user
+
+ validates :holder_name, length: { maximum: 26 }
+ validates :last_digits, allow_nil: true, numericality: {
+ greater_than_or_equal_to: 0, less_than_or_equal_to: 9999
+ }
+
+ def similar_records
+ self.class.where(
+ expiration_date: expiration_date,
+ last_digits: last_digits,
+ holder_name: holder_name
+ ).order(credit_card_validated_at: :desc).includes(:user)
+ end
end
end
diff --git a/app/policies/ci/resource_group_policy.rb b/app/policies/ci/resource_group_policy.rb
new file mode 100644
index 00000000000..ef384265b11
--- /dev/null
+++ b/app/policies/ci/resource_group_policy.rb
@@ -0,0 +1,7 @@
+# frozen_string_literal: true
+
+module Ci
+ class ResourceGroupPolicy < BasePolicy
+ delegate { @subject.project }
+ end
+end
diff --git a/app/policies/clusters/agent_policy.rb b/app/policies/clusters/agent_policy.rb
new file mode 100644
index 00000000000..25e78c84802
--- /dev/null
+++ b/app/policies/clusters/agent_policy.rb
@@ -0,0 +1,9 @@
+# frozen_string_literal: true
+
+module Clusters
+ class AgentPolicy < BasePolicy
+ alias_method :cluster_agent, :subject
+
+ delegate { cluster_agent.project }
+ end
+end
diff --git a/app/policies/clusters/agent_token_policy.rb b/app/policies/clusters/agent_token_policy.rb
new file mode 100644
index 00000000000..e876ecfac26
--- /dev/null
+++ b/app/policies/clusters/agent_token_policy.rb
@@ -0,0 +1,9 @@
+# frozen_string_literal: true
+
+module Clusters
+ class AgentTokenPolicy < BasePolicy
+ alias_method :token, :subject
+
+ delegate { token.agent }
+ end
+end
diff --git a/app/policies/group_policy.rb b/app/policies/group_policy.rb
index 7abffd2c352..64395f69c42 100644
--- a/app/policies/group_policy.rb
+++ b/app/policies/group_policy.rb
@@ -134,6 +134,8 @@ class GroupPolicy < BasePolicy
enable :create_package
enable :create_package_settings
enable :developer_access
+ enable :admin_organization
+ enable :admin_contact
end
rule { reporter }.policy do
@@ -147,7 +149,6 @@ class GroupPolicy < BasePolicy
enable :read_prometheus
enable :read_package
enable :read_package_settings
- enable :admin_organization
end
rule { maintainer }.policy do
@@ -162,7 +163,6 @@ class GroupPolicy < BasePolicy
enable :admin_cluster
enable :read_deploy_token
enable :create_jira_connect_subscription
- enable :update_runners_registration_token
enable :maintainer_access
end
@@ -179,6 +179,7 @@ class GroupPolicy < BasePolicy
enable :update_default_branch_protection
enable :create_deploy_token
enable :destroy_deploy_token
+ enable :update_runners_registration_token
enable :owner_access
end
diff --git a/app/policies/list_policy.rb b/app/policies/list_policy.rb
new file mode 100644
index 00000000000..97845746546
--- /dev/null
+++ b/app/policies/list_policy.rb
@@ -0,0 +1,5 @@
+# frozen_string_literal: true
+
+class ListPolicy < BasePolicy # rubocop:disable Gitlab/NamespacedClass
+ delegate { @subject.board.resource_parent }
+end
diff --git a/app/policies/namespace_policy.rb b/app/policies/namespace_policy.rb
index dcbeda9f5d3..0cf1bcb9737 100644
--- a/app/policies/namespace_policy.rb
+++ b/app/policies/namespace_policy.rb
@@ -1,26 +1,9 @@
# frozen_string_literal: true
-class NamespacePolicy < BasePolicy
- rule { anonymous }.prevent_all
-
- condition(:personal_project, scope: :subject) { @subject.kind == 'user' }
- condition(:can_create_personal_project, scope: :user) { @user.can_create_project? }
- condition(:owner) { @subject.owner == @user }
-
- rule { owner | admin }.policy do
- enable :owner_access
- enable :create_projects
- enable :admin_namespace
- enable :read_namespace
- enable :read_statistics
- enable :create_jira_connect_subscription
- enable :create_package_settings
- enable :read_package_settings
- end
-
- rule { personal_project & ~can_create_personal_project }.prevent :create_projects
-
- rule { (owner | admin) & can?(:create_projects) }.enable :transfer_projects
+class NamespacePolicy < ::Namespaces::UserNamespacePolicy
+ # NamespacePolicy has been traditionally for user namespaces.
+ # So these policies have been moved into Namespaces::UserNamespacePolicy.
+ # Once the user namespace conversion is complete, we can look at
+ # either removing this file or locating common namespace policy items
+ # here.
end
-
-NamespacePolicy.prepend_mod_with('NamespacePolicy')
diff --git a/app/policies/namespaces/project_namespace_policy.rb b/app/policies/namespaces/project_namespace_policy.rb
new file mode 100644
index 00000000000..bc08a7a45ed
--- /dev/null
+++ b/app/policies/namespaces/project_namespace_policy.rb
@@ -0,0 +1,9 @@
+# frozen_string_literal: true
+
+module Namespaces
+ class ProjectNamespacePolicy < BasePolicy
+ # For now users are not granted any permissions on project namespace
+ # as it's completely hidden to them. When we start using project
+ # namespaces in queries, we will have to extend this policy.
+ end
+end
diff --git a/app/policies/namespaces/user_namespace_policy.rb b/app/policies/namespaces/user_namespace_policy.rb
new file mode 100644
index 00000000000..f8b285e5312
--- /dev/null
+++ b/app/policies/namespaces/user_namespace_policy.rb
@@ -0,0 +1,28 @@
+# frozen_string_literal: true
+
+module Namespaces
+ class UserNamespacePolicy < BasePolicy
+ rule { anonymous }.prevent_all
+
+ condition(:personal_project, scope: :subject) { @subject.kind == 'user' }
+ condition(:can_create_personal_project, scope: :user) { @user.can_create_project? }
+ condition(:owner) { @subject.owner == @user }
+
+ rule { owner | admin }.policy do
+ enable :owner_access
+ enable :create_projects
+ enable :admin_namespace
+ enable :read_namespace
+ enable :read_statistics
+ enable :create_jira_connect_subscription
+ enable :create_package_settings
+ enable :read_package_settings
+ end
+
+ rule { personal_project & ~can_create_personal_project }.prevent :create_projects
+
+ rule { (owner | admin) & can?(:create_projects) }.enable :transfer_projects
+ end
+end
+
+Namespaces::UserNamespacePolicy.prepend_mod_with('Namespaces::UserNamespacePolicy')
diff --git a/app/policies/project_policy.rb b/app/policies/project_policy.rb
index 54b11ea6041..59aa47beff9 100644
--- a/app/policies/project_policy.rb
+++ b/app/policies/project_policy.rb
@@ -357,6 +357,8 @@ class ProjectPolicy < BasePolicy
enable :update_commit_status
enable :create_build
enable :update_build
+ enable :read_resource_group
+ enable :update_resource_group
enable :create_merge_request_from
enable :create_wiki
enable :push_code
@@ -436,6 +438,7 @@ class ProjectPolicy < BasePolicy
enable :destroy_freeze_period
enable :admin_feature_flags_client
enable :update_runners_registration_token
+ enable :manage_project_google_cloud
end
rule { public_project & metrics_dashboard_allowed }.policy do
diff --git a/app/presenters/README.md b/app/presenters/README.md
index 62aec4fc8a2..dfd1818f97d 100644
--- a/app/presenters/README.md
+++ b/app/presenters/README.md
@@ -66,14 +66,15 @@ we gain the following benefits:
### Presenter definition
-Every presenter should inherit from `Gitlab::View::Presenter::Simple`, which
-provides a `.presents` the method which allows you to define an accessor for the
+If you need a presenter class that has only necessary interfaces for the view-related context,
+inherit from `Gitlab::View::Presenter::Simple`.
+It provides a `.presents` the method which allows you to define an accessor for the
presented object. It also includes common helpers like `Gitlab::Routing` and
`Gitlab::Allowable`.
```ruby
class LabelPresenter < Gitlab::View::Presenter::Simple
- presents :label
+ presents ::Label, as: :label
def text_color
label.color.to_s
@@ -85,13 +86,14 @@ class LabelPresenter < Gitlab::View::Presenter::Simple
end
```
-In some cases, it can be more practical to transparently delegate all missing
-method calls to the presented object, in these cases, you can make your
-presenter inherit from `Gitlab::View::Presenter::Delegated`:
+If you need a presenter class that delegates missing method calls to the presented object,
+inherit from `Gitlab::View::Presenter::Delegated`.
+This is more like an "extension" in the sense that the produced object is going to have
+all of interfaces of the presented object **AND** all of the interfaces in the presenter class:
```ruby
class LabelPresenter < Gitlab::View::Presenter::Delegated
- presents :label
+ presents ::Label, as: :label
def text_color
# color is delegated to label
@@ -152,3 +154,82 @@ You can also present the model in the view:
%div{ class: label.text_color }
= render partial: label, label: label
```
+
+### Validate accidental overrides
+
+We use presenters in many places, such as Controller, Haml, GraphQL/Rest API,
+it's very handy to extend the core/backend logic of Active Record models,
+however, there is a risk that it accidentally overrides important logic.
+
+For example, [this production incident](https://gitlab.com/gitlab-com/gl-infra/production/-/issues/5498)
+was caused by [including `ActionView::Helpers::UrlHelper` in a presenter](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/69537/diffs#4b581cff00ef3cc9780efd23682af383de302e7d_3_3).
+The `tag` accesor in `Ci::Build` was accidentally overridden by `ActionView::Helpers::TagHelper#tag`,
+and as a conseuqence, a wrong `tag` value was persited into database.
+
+Starting from GitLab 14.4, we validate the presenters (specifically all of the subclasses of `Gitlab::View::Presenter::Delegated`)
+that they do not accidentally override core/backend logic. In such case, a pipeline in merge requests fails with an error message,
+here is an example:
+
+```plaintext
+We've detected that a presetner is overriding a specific method(s) on a subject model.
+There is a risk that it accidentally modifies the backend/core logic that leads to production incident.
+Please follow https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/presenters/README.md#validate-accidental-overrides
+to resolve this error with caution.
+
+Here are the conflict details.
+
+- Ci::PipelinePresenter#tag is overriding Ci::Pipeline#tag. delegator_location: /devkitkat/services/rails/cache/ruby/2.7.0/gems/actionview-6.1.3.2/lib/action_view/helpers/tag_helper.rb:271 original_location: /devkitkat/services/rails/cache/ruby/2.7.0/gems/activemodel-6.1.3.2/lib/active_model/attribute_methods.rb:254
+```
+
+Here are the potential solutions:
+
+- If the conflict happens on an instance method in the presenter:
+ - If you intend to override the core/backend logic, define `delegator_override <method-name>` on top of the conflicted method.
+ This explicitly adds the method to an allowlist.
+ - If you do NOT intend to override the core/backend logic, rename the method name in the presenter.
+- If the conflict happens on an included module in the presenter, remove the module from the presenter and find a workaround.
+
+### How to use the `Gitlab::Utils::DelegatorOverride` validator
+
+If a presenter class inhertis from `Gitlab::View::Presenter::Delegated`,
+you should define what object class is presented:
+
+```ruby
+class WebHookLogPresenter < Gitlab::View::Presenter::Delegated
+ presents ::WebHookLog, as: :web_hook_log # This defines that the presenter presents `WebHookLog` Active Record model.
+```
+
+These presenters are validated not to accidentaly override the methods in the presented object.
+You can run the validation locally with:
+
+```shell
+bundle exec rake lint:static_verification
+```
+
+To add a method to an allowlist, use `delegator_override`. For example:
+
+```ruby
+class VulnerabilityPresenter < Gitlab::View::Presenter::Delegated
+ presents ::Vulnerability, as: :vulnerability
+
+ delegator_override :description # This adds the `description` method to an allowlist that the override is intentional.
+ def description
+ vulnerability.description || finding.description
+ end
+```
+
+To add methods of a module to an allowlist, use `delegator_override_with`. For example:
+
+```ruby
+module Ci
+ class PipelinePresenter < Gitlab::View::Presenter::Delegated
+ include Gitlab::Utils::StrongMemoize
+ include ActionView::Helpers::UrlHelper
+
+ delegator_override_with Gitlab::Utils::StrongMemoize # TODO: Remove `Gitlab::Utils::StrongMemoize` inclusion as it's duplicate
+ delegator_override_with ActionView::Helpers::TagHelper # TODO: Remove `ActionView::Helpers::UrlHelper` inclusion as it overrides `Ci::Pipeline#tag`
+```
+
+Keep in mind that if you use `delegator_override_with`,
+there is a high chance that you're doing **something wrong**.
+Read the [Validate Accidental Overrides](#validate-accidental-overrides) for more information.
diff --git a/app/presenters/alert_management/alert_presenter.rb b/app/presenters/alert_management/alert_presenter.rb
index c6c6fe837a0..86fe9859271 100644
--- a/app/presenters/alert_management/alert_presenter.rb
+++ b/app/presenters/alert_management/alert_presenter.rb
@@ -2,10 +2,12 @@
module AlertManagement
class AlertPresenter < Gitlab::View::Presenter::Delegated
- include Gitlab::Utils::StrongMemoize
include IncidentManagement::Settings
include ActionView::Helpers::UrlHelper
+ presents ::AlertManagement::Alert
+ delegator_override_with Gitlab::Utils::StrongMemoize # TODO: Remove `Gitlab::Utils::StrongMemoize` inclusion as it's duplicate
+
MARKDOWN_LINE_BREAK = " \n"
HORIZONTAL_LINE = "\n\n---\n\n"
@@ -30,6 +32,7 @@ module AlertManagement
started_at&.strftime('%d %B %Y, %-l:%M%p (%Z)')
end
+ delegator_override :details_url
def details_url
details_project_alert_management_url(project, alert.iid)
end
@@ -65,6 +68,7 @@ module AlertManagement
private
attr_reader :alert, :project
+
delegate :alert_markdown, :full_query, to: :parsed_payload
def issue_summary_markdown
diff --git a/app/presenters/award_emoji_presenter.rb b/app/presenters/award_emoji_presenter.rb
index 98713855d35..8a7b58e0aba 100644
--- a/app/presenters/award_emoji_presenter.rb
+++ b/app/presenters/award_emoji_presenter.rb
@@ -1,7 +1,7 @@
# frozen_string_literal: true
class AwardEmojiPresenter < Gitlab::View::Presenter::Delegated
- presents :award_emoji
+ presents ::AwardEmoji, as: :award_emoji
def description
as_emoji['description']
diff --git a/app/presenters/blob_presenter.rb b/app/presenters/blob_presenter.rb
index ecc16e2840c..c198859aa4c 100644
--- a/app/presenters/blob_presenter.rb
+++ b/app/presenters/blob_presenter.rb
@@ -7,7 +7,7 @@ class BlobPresenter < Gitlab::View::Presenter::Delegated
include TreeHelper
include ChecksCollaboration
- presents :blob
+ presents ::Blob, as: :blob
def highlight(to: nil, plain: nil)
load_all_blob_data
diff --git a/app/presenters/blobs/unfold_presenter.rb b/app/presenters/blobs/unfold_presenter.rb
index 487c6fe0757..b921b5bf670 100644
--- a/app/presenters/blobs/unfold_presenter.rb
+++ b/app/presenters/blobs/unfold_presenter.rb
@@ -6,6 +6,8 @@ module Blobs
include ActiveModel::AttributeAssignment
include Gitlab::Utils::StrongMemoize
+ presents ::Blob
+
attribute :full, :boolean, default: false
attribute :since, :integer, default: 1
attribute :to, :integer, default: 1
diff --git a/app/presenters/board_presenter.rb b/app/presenters/board_presenter.rb
index d7cecd44dd7..bb3e96b8faf 100644
--- a/app/presenters/board_presenter.rb
+++ b/app/presenters/board_presenter.rb
@@ -1,5 +1,5 @@
# frozen_string_literal: true
class BoardPresenter < Gitlab::View::Presenter::Delegated
- presents :board
+ presents ::Board, as: :board
end
diff --git a/app/presenters/ci/bridge_presenter.rb b/app/presenters/ci/bridge_presenter.rb
index 724e10c26c3..a62d7cdbbd4 100644
--- a/app/presenters/ci/bridge_presenter.rb
+++ b/app/presenters/ci/bridge_presenter.rb
@@ -2,6 +2,9 @@
module Ci
class BridgePresenter < ProcessablePresenter
+ presents ::Ci::Bridge
+
+ delegator_override :detailed_status
def detailed_status
@detailed_status ||= subject.detailed_status(user)
end
diff --git a/app/presenters/ci/build_metadata_presenter.rb b/app/presenters/ci/build_metadata_presenter.rb
index 4871bb3a919..2f559adf77d 100644
--- a/app/presenters/ci/build_metadata_presenter.rb
+++ b/app/presenters/ci/build_metadata_presenter.rb
@@ -9,8 +9,9 @@ module Ci
job_timeout_source: 'job'
}.freeze
- presents :metadata
+ presents ::Ci::BuildMetadata, as: :metadata
+ delegator_override :timeout_source
def timeout_source
return unless metadata.timeout_source?
diff --git a/app/presenters/ci/build_presenter.rb b/app/presenters/ci/build_presenter.rb
index 06ed6791bb7..65e1c80085f 100644
--- a/app/presenters/ci/build_presenter.rb
+++ b/app/presenters/ci/build_presenter.rb
@@ -2,6 +2,8 @@
module Ci
class BuildPresenter < ProcessablePresenter
+ presents ::Ci::Build
+
def erased_by_user?
# Build can be erased through API, therefore it does not have
# `erased_by` user assigned in that case.
diff --git a/app/presenters/ci/group_variable_presenter.rb b/app/presenters/ci/group_variable_presenter.rb
index 99011150c84..dea9a42b622 100644
--- a/app/presenters/ci/group_variable_presenter.rb
+++ b/app/presenters/ci/group_variable_presenter.rb
@@ -2,7 +2,7 @@
module Ci
class GroupVariablePresenter < Gitlab::View::Presenter::Delegated
- presents :variable
+ presents ::Ci::GroupVariable, as: :variable
def placeholder
'GROUP_VARIABLE'
diff --git a/app/presenters/ci/legacy_stage_presenter.rb b/app/presenters/ci/legacy_stage_presenter.rb
index d5c21baba28..c803abfab6a 100644
--- a/app/presenters/ci/legacy_stage_presenter.rb
+++ b/app/presenters/ci/legacy_stage_presenter.rb
@@ -2,7 +2,7 @@
module Ci
class LegacyStagePresenter < Gitlab::View::Presenter::Delegated
- presents :legacy_stage
+ presents ::Ci::LegacyStage, as: :legacy_stage
def latest_ordered_statuses
preload_statuses(legacy_stage.statuses.latest_ordered)
diff --git a/app/presenters/ci/pipeline_presenter.rb b/app/presenters/ci/pipeline_presenter.rb
index 82f00f74692..e0cb899c9d3 100644
--- a/app/presenters/ci/pipeline_presenter.rb
+++ b/app/presenters/ci/pipeline_presenter.rb
@@ -5,6 +5,9 @@ module Ci
include Gitlab::Utils::StrongMemoize
include ActionView::Helpers::UrlHelper
+ delegator_override_with Gitlab::Utils::StrongMemoize # TODO: Remove `Gitlab::Utils::StrongMemoize` inclusion as it's duplicate
+ delegator_override_with ActionView::Helpers::TagHelper # TODO: Remove `ActionView::Helpers::UrlHelper` inclusion as it overrides `Ci::Pipeline#tag`
+
# We use a class method here instead of a constant, allowing EE to redefine
# the returned `Hash` more easily.
def self.failure_reasons
@@ -20,8 +23,9 @@ module Ci
user_blocked: 'The user who created this pipeline is blocked.' }
end
- presents :pipeline
+ presents ::Ci::Pipeline, as: :pipeline
+ delegator_override :failed_builds
def failed_builds
return [] unless can?(current_user, :read_build, pipeline)
@@ -30,6 +34,7 @@ module Ci
end
end
+ delegator_override :failure_reason
def failure_reason
return unless pipeline.failure_reason?
diff --git a/app/presenters/ci/processable_presenter.rb b/app/presenters/ci/processable_presenter.rb
index 5a8a6649071..9f3a83a00f3 100644
--- a/app/presenters/ci/processable_presenter.rb
+++ b/app/presenters/ci/processable_presenter.rb
@@ -2,5 +2,6 @@
module Ci
class ProcessablePresenter < CommitStatusPresenter
+ presents ::Ci::Processable
end
end
diff --git a/app/presenters/ci/runner_presenter.rb b/app/presenters/ci/runner_presenter.rb
index 273328afc53..ad889d444f8 100644
--- a/app/presenters/ci/runner_presenter.rb
+++ b/app/presenters/ci/runner_presenter.rb
@@ -2,11 +2,14 @@
module Ci
class RunnerPresenter < Gitlab::View::Presenter::Delegated
- presents :runner
+ presents ::Ci::Runner, as: :runner
+ delegator_override :locked?
def locked?
read_attribute(:locked) && project_type?
end
+
+ delegator_override :locked
alias_method :locked, :locked?
end
end
diff --git a/app/presenters/ci/stage_presenter.rb b/app/presenters/ci/stage_presenter.rb
index 21bda86cded..bd5bf08abbc 100644
--- a/app/presenters/ci/stage_presenter.rb
+++ b/app/presenters/ci/stage_presenter.rb
@@ -2,7 +2,7 @@
module Ci
class StagePresenter < Gitlab::View::Presenter::Delegated
- presents :stage
+ presents ::Ci::Stage, as: :stage
PRELOADED_RELATIONS = [:pipeline, :metadata, :tags, :job_artifacts_archive, :downstream_pipeline].freeze
diff --git a/app/presenters/ci/trigger_presenter.rb b/app/presenters/ci/trigger_presenter.rb
index 605c8f328a4..5f0bd4b3a8b 100644
--- a/app/presenters/ci/trigger_presenter.rb
+++ b/app/presenters/ci/trigger_presenter.rb
@@ -2,12 +2,13 @@
module Ci
class TriggerPresenter < Gitlab::View::Presenter::Delegated
- presents :trigger
+ presents ::Ci::Trigger, as: :trigger
def has_token_exposed?
can?(current_user, :admin_trigger, trigger)
end
+ delegator_override :token
def token
if has_token_exposed?
trigger.token
diff --git a/app/presenters/ci/variable_presenter.rb b/app/presenters/ci/variable_presenter.rb
index f027f3aa560..ec04dd5e9ff 100644
--- a/app/presenters/ci/variable_presenter.rb
+++ b/app/presenters/ci/variable_presenter.rb
@@ -2,7 +2,7 @@
module Ci
class VariablePresenter < Gitlab::View::Presenter::Delegated
- presents :variable
+ presents ::Ci::Variable, as: :variable
def placeholder
'PROJECT_VARIABLE'
diff --git a/app/presenters/clusterable_presenter.rb b/app/presenters/clusterable_presenter.rb
index 03e26b92922..4b645510b51 100644
--- a/app/presenters/clusterable_presenter.rb
+++ b/app/presenters/clusterable_presenter.rb
@@ -1,7 +1,7 @@
# frozen_string_literal: true
class ClusterablePresenter < Gitlab::View::Presenter::Delegated
- presents :clusterable
+ presents ::Project, ::Group, ::Clusters::Instance, as: :clusterable
def self.fabricate(clusterable, **attributes)
presenter_class = "#{clusterable.class.name}ClusterablePresenter".constantize
diff --git a/app/presenters/clusters/cluster_presenter.rb b/app/presenters/clusters/cluster_presenter.rb
index eb4bd8532af..ce060476cfd 100644
--- a/app/presenters/clusters/cluster_presenter.rb
+++ b/app/presenters/clusters/cluster_presenter.rb
@@ -3,21 +3,10 @@
module Clusters
class ClusterPresenter < Gitlab::View::Presenter::Delegated
include ::Gitlab::Utils::StrongMemoize
- include ActionView::Helpers::SanitizeHelper
- include ActionView::Helpers::UrlHelper
- include IconsHelper
- presents :cluster
+ delegator_override_with ::Gitlab::Utils::StrongMemoize # TODO: Remove `::Gitlab::Utils::StrongMemoize` inclusion as it's duplicate
- # We do not want to show the group path for clusters belonging to the
- # clusterable, only for the ancestor clusters.
- def item_link(clusterable_presenter, *html_options)
- if cluster.group_type? && clusterable != clusterable_presenter.subject
- contracted_group_name(cluster.group) + ' / ' + link_to_cluster
- else
- link_to_cluster(*html_options)
- end
- end
+ presents ::Clusters::Cluster, as: :cluster
def provider_label
if aws?
@@ -39,16 +28,6 @@ module Clusters
can?(current_user, :read_cluster, cluster)
end
- def cluster_type_description
- if cluster.project_type?
- s_("ClusterIntegration|Project cluster")
- elsif cluster.group_type?
- s_("ClusterIntegration|Group cluster")
- elsif cluster.instance_type?
- s_("ClusterIntegration|Instance cluster")
- end
- end
-
def show_path(params: {})
if cluster.project_type?
project_cluster_path(project, cluster, params)
@@ -107,7 +86,7 @@ module Clusters
private
def image_path(path)
- ActionController::Base.helpers.image_path(path)
+ ApplicationController.helpers.image_path(path)
end
# currently log explorer is only available in the scope of the project
@@ -127,20 +106,6 @@ module Clusters
cluster.project
end
end
-
- def contracted_group_name(group)
- sanitize(group.full_name)
- .sub(%r{\/.*\/}, "/ #{contracted_icon} /")
- .html_safe
- end
-
- def contracted_icon
- sprite_icon('ellipsis_h', size: 12, css_class: 'vertical-align-middle')
- end
-
- def link_to_cluster(html_options: {})
- link_to_if(can_read_cluster?, cluster.name, show_path, html_options)
- end
end
end
diff --git a/app/presenters/clusters/integration_presenter.rb b/app/presenters/clusters/integration_presenter.rb
index 57608be29b1..f7be59f00f3 100644
--- a/app/presenters/clusters/integration_presenter.rb
+++ b/app/presenters/clusters/integration_presenter.rb
@@ -2,7 +2,7 @@
module Clusters
class IntegrationPresenter < Gitlab::View::Presenter::Delegated
- presents :integration
+ presents ::Clusters::Integrations::Prometheus, ::Clusters::Integrations::ElasticStack, as: :integration
def application_type
integration.class.name.demodulize.underscore
diff --git a/app/presenters/commit_presenter.rb b/app/presenters/commit_presenter.rb
index c14dcab6000..7df45ca03bb 100644
--- a/app/presenters/commit_presenter.rb
+++ b/app/presenters/commit_presenter.rb
@@ -3,7 +3,7 @@
class CommitPresenter < Gitlab::View::Presenter::Delegated
include GlobalID::Identification
- presents :commit
+ presents ::Commit, as: :commit
def status_for(ref)
return unless can?(current_user, :read_commit_status, commit.project)
diff --git a/app/presenters/commit_status_presenter.rb b/app/presenters/commit_status_presenter.rb
index 3c39470b730..7919e501bf0 100644
--- a/app/presenters/commit_status_presenter.rb
+++ b/app/presenters/commit_status_presenter.rb
@@ -28,19 +28,36 @@ class CommitStatusPresenter < Gitlab::View::Presenter::Delegated
ci_quota_exceeded: 'No more CI minutes available',
no_matching_runner: 'No matching runner available',
trace_size_exceeded: 'The job log size limit was reached',
- builds_disabled: 'The CI/CD is disabled for this project'
+ builds_disabled: 'The CI/CD is disabled for this project',
+ environment_creation_failure: 'This job could not be executed because it would create an environment with an invalid parameter.'
+ }.freeze
+
+ TROUBLESHOOTING_DOC = {
+ environment_creation_failure: { path: 'ci/environments/index', anchor: 'a-deployment-job-failed-with-this-job-could-not-be-executed-because-it-would-create-an-environment-with-an-invalid-parameter-error' }
}.freeze
private_constant :CALLOUT_FAILURE_MESSAGES
- presents :build
+ presents ::CommitStatus, as: :build
def self.callout_failure_messages
CALLOUT_FAILURE_MESSAGES
end
def callout_failure_message
- self.class.callout_failure_messages.fetch(failure_reason.to_sym)
+ message = self.class.callout_failure_messages.fetch(failure_reason.to_sym)
+
+ if doc = TROUBLESHOOTING_DOC[failure_reason.to_sym]
+ message += " #{help_page_link(doc[:path], doc[:anchor])}"
+ end
+
+ message
+ end
+
+ private
+
+ def help_page_link(path, anchor)
+ ActionController::Base.helpers.link_to('How do I fix it?', help_page_path(path, anchor: anchor))
end
end
diff --git a/app/presenters/dev_ops_report/metric_presenter.rb b/app/presenters/dev_ops_report/metric_presenter.rb
index 4d7ac1cd3ec..55326f8f678 100644
--- a/app/presenters/dev_ops_report/metric_presenter.rb
+++ b/app/presenters/dev_ops_report/metric_presenter.rb
@@ -2,6 +2,8 @@
module DevOpsReport
class MetricPresenter < Gitlab::View::Presenter::Simple
+ presents ::DevOpsReport::Metric
+
delegate :created_at, to: :subject
def cards
diff --git a/app/presenters/environment_presenter.rb b/app/presenters/environment_presenter.rb
index 6f67bbe2a5a..6c8da86187c 100644
--- a/app/presenters/environment_presenter.rb
+++ b/app/presenters/environment_presenter.rb
@@ -3,7 +3,7 @@
class EnvironmentPresenter < Gitlab::View::Presenter::Delegated
include ActionView::Helpers::UrlHelper
- presents :environment
+ presents ::Environment, as: :environment
def path
project_environment_path(project, self)
diff --git a/app/presenters/event_presenter.rb b/app/presenters/event_presenter.rb
index c37721f7213..4c787b88e20 100644
--- a/app/presenters/event_presenter.rb
+++ b/app/presenters/event_presenter.rb
@@ -1,7 +1,7 @@
# frozen_string_literal: true
class EventPresenter < Gitlab::View::Presenter::Delegated
- presents :event
+ presents ::Event, as: :event
def initialize(subject, **attributes)
super
@@ -10,6 +10,7 @@ class EventPresenter < Gitlab::View::Presenter::Delegated
end
# Caching `visible_to_user?` method in the presenter beause it might be called multiple times.
+ delegator_override :visible_to_user?
def visible_to_user?(user = nil)
@visible_to_user_cache.fetch(user&.id) { super(user) }
end
diff --git a/app/presenters/gitlab/blame_presenter.rb b/app/presenters/gitlab/blame_presenter.rb
index 1f2445b04a1..e9340a42e51 100644
--- a/app/presenters/gitlab/blame_presenter.rb
+++ b/app/presenters/gitlab/blame_presenter.rb
@@ -12,7 +12,7 @@ module Gitlab
include TreeHelper
include IconsHelper
- presents :blame
+ presents nil, as: :blame
CommitData = Struct.new(
:author_avatar,
diff --git a/app/presenters/group_clusterable_presenter.rb b/app/presenters/group_clusterable_presenter.rb
index 34e7084ab02..c51cd415029 100644
--- a/app/presenters/group_clusterable_presenter.rb
+++ b/app/presenters/group_clusterable_presenter.rb
@@ -2,7 +2,8 @@
class GroupClusterablePresenter < ClusterablePresenter
extend ::Gitlab::Utils::Override
- include ActionView::Helpers::UrlHelper
+
+ presents ::Group
override :cluster_status_cluster_path
def cluster_status_cluster_path(cluster, params = {})
@@ -31,7 +32,7 @@ class GroupClusterablePresenter < ClusterablePresenter
override :learn_more_link
def learn_more_link
- link_to(s_('ClusterIntegration|Learn more about group Kubernetes clusters'), help_page_path('user/group/clusters/index'), target: '_blank', rel: 'noopener noreferrer')
+ ApplicationController.helpers.link_to(s_('ClusterIntegration|Learn more about group Kubernetes clusters'), help_page_path('user/group/clusters/index'), target: '_blank', rel: 'noopener noreferrer')
end
def metrics_dashboard_path(cluster)
diff --git a/app/presenters/group_member_presenter.rb b/app/presenters/group_member_presenter.rb
index 5ab4b51f472..88facc3608d 100644
--- a/app/presenters/group_member_presenter.rb
+++ b/app/presenters/group_member_presenter.rb
@@ -1,6 +1,8 @@
# frozen_string_literal: true
class GroupMemberPresenter < MemberPresenter
+ presents ::GroupMember
+
private
def admin_member_permission
diff --git a/app/presenters/instance_clusterable_presenter.rb b/app/presenters/instance_clusterable_presenter.rb
index 56d91f90b2e..f2550eb17e3 100644
--- a/app/presenters/instance_clusterable_presenter.rb
+++ b/app/presenters/instance_clusterable_presenter.rb
@@ -2,7 +2,8 @@
class InstanceClusterablePresenter < ClusterablePresenter
extend ::Gitlab::Utils::Override
- include ActionView::Helpers::UrlHelper
+
+ presents ::Clusters::Instance
def self.fabricate(clusterable, **attributes)
attributes_with_presenter_class = attributes.merge(presenter_class: InstanceClusterablePresenter)
@@ -69,7 +70,7 @@ class InstanceClusterablePresenter < ClusterablePresenter
override :learn_more_link
def learn_more_link
- link_to(s_('ClusterIntegration|Learn more about instance Kubernetes clusters'), help_page_path('user/instance/clusters/index'), target: '_blank', rel: 'noopener noreferrer')
+ ApplicationController.helpers.link_to(s_('ClusterIntegration|Learn more about instance Kubernetes clusters'), help_page_path('user/instance/clusters/index'), target: '_blank', rel: 'noopener noreferrer')
end
def metrics_dashboard_path(cluster)
diff --git a/app/presenters/invitation_presenter.rb b/app/presenters/invitation_presenter.rb
index d8c07f327dd..ada8227a477 100644
--- a/app/presenters/invitation_presenter.rb
+++ b/app/presenters/invitation_presenter.rb
@@ -1,5 +1,5 @@
# frozen_string_literal: true
class InvitationPresenter < Gitlab::View::Presenter::Delegated
- presents :invitation
+ presents nil, as: :invitation
end
diff --git a/app/presenters/issue_presenter.rb b/app/presenters/issue_presenter.rb
index b7f4ac0555d..72fe14d224d 100644
--- a/app/presenters/issue_presenter.rb
+++ b/app/presenters/issue_presenter.rb
@@ -1,12 +1,13 @@
# frozen_string_literal: true
class IssuePresenter < Gitlab::View::Presenter::Delegated
- presents :issue
+ presents ::Issue, as: :issue
def issue_path
url_builder.build(issue, only_path: true)
end
+ delegator_override :subscribed?
def subscribed?
issue.subscribed?(current_user, issue.project)
end
diff --git a/app/presenters/label_presenter.rb b/app/presenters/label_presenter.rb
index 9e51e6fa4ba..fafade2828f 100644
--- a/app/presenters/label_presenter.rb
+++ b/app/presenters/label_presenter.rb
@@ -1,9 +1,11 @@
# frozen_string_literal: true
class LabelPresenter < Gitlab::View::Presenter::Delegated
- presents :label
+ presents ::Label, as: :label
delegate :name, :full_name, to: :label_subject, prefix: :subject
+ delegator_override :subject # TODO: Fix `Gitlab::View::Presenter::Delegated#subject` not to override `Label#subject`.
+
def edit_path
case label
when GroupLabel then edit_group_label_path(label.group, label)
diff --git a/app/presenters/member_presenter.rb b/app/presenters/member_presenter.rb
index b37a43bf251..67d044dd01c 100644
--- a/app/presenters/member_presenter.rb
+++ b/app/presenters/member_presenter.rb
@@ -1,7 +1,7 @@
# frozen_string_literal: true
class MemberPresenter < Gitlab::View::Presenter::Delegated
- presents :member
+ presents ::Member, as: :member
def access_level_roles
member.class.access_level_roles
diff --git a/app/presenters/members_presenter.rb b/app/presenters/members_presenter.rb
index 03ebea36d49..b572cf96235 100644
--- a/app/presenters/members_presenter.rb
+++ b/app/presenters/members_presenter.rb
@@ -3,7 +3,7 @@
class MembersPresenter < Gitlab::View::Presenter::Delegated
include Enumerable
- presents :members
+ presents nil, as: :members
def to_ary
to_a
diff --git a/app/presenters/merge_request_presenter.rb b/app/presenters/merge_request_presenter.rb
index fc8a290f5f7..d19d4964524 100644
--- a/app/presenters/merge_request_presenter.rb
+++ b/app/presenters/merge_request_presenter.rb
@@ -8,9 +8,11 @@ class MergeRequestPresenter < Gitlab::View::Presenter::Delegated
include ChecksCollaboration
include Gitlab::Utils::StrongMemoize
+ delegator_override_with Gitlab::Utils::StrongMemoize # TODO: Remove `Gitlab::Utils::StrongMemoize` inclusion as it's duplicate
+
APPROVALS_WIDGET_BASE_TYPE = 'base'
- presents :merge_request
+ presents ::MergeRequest, as: :merge_request
def ci_status
if pipeline
@@ -183,6 +185,7 @@ class MergeRequestPresenter < Gitlab::View::Presenter::Delegated
.can_push_to_branch?(source_branch)
end
+ delegator_override :can_remove_source_branch?
def can_remove_source_branch?
source_branch_exists? && merge_request.can_remove_source_branch?(current_user)
end
@@ -202,6 +205,7 @@ class MergeRequestPresenter < Gitlab::View::Presenter::Delegated
end
end
+ delegator_override :subscribed?
def subscribed?
merge_request.subscribed?(current_user, merge_request.target_project)
end
diff --git a/app/presenters/milestone_presenter.rb b/app/presenters/milestone_presenter.rb
index 6bf8203702f..4084c8740f0 100644
--- a/app/presenters/milestone_presenter.rb
+++ b/app/presenters/milestone_presenter.rb
@@ -1,7 +1,7 @@
# frozen_string_literal: true
class MilestonePresenter < Gitlab::View::Presenter::Delegated
- presents :milestone
+ presents ::Milestone, as: :milestone
def milestone_path
url_builder.build(milestone, only_path: true)
diff --git a/app/presenters/pages_domain_presenter.rb b/app/presenters/pages_domain_presenter.rb
index 6ef89760bec..0523f702416 100644
--- a/app/presenters/pages_domain_presenter.rb
+++ b/app/presenters/pages_domain_presenter.rb
@@ -1,7 +1,9 @@
# frozen_string_literal: true
class PagesDomainPresenter < Gitlab::View::Presenter::Delegated
- presents :pages_domain
+ presents ::PagesDomain, as: :pages_domain
+
+ delegator_override :subject # TODO: Fix `Gitlab::View::Presenter::Delegated#subject` not to override `PagesDomain#subject`.
def needs_verification?
Gitlab::CurrentSettings.pages_domain_verification_enabled? && unverified?
diff --git a/app/presenters/project_clusterable_presenter.rb b/app/presenters/project_clusterable_presenter.rb
index 920304e743e..6c4d1143c0f 100644
--- a/app/presenters/project_clusterable_presenter.rb
+++ b/app/presenters/project_clusterable_presenter.rb
@@ -2,7 +2,8 @@
class ProjectClusterablePresenter < ClusterablePresenter
extend ::Gitlab::Utils::Override
- include ActionView::Helpers::UrlHelper
+
+ presents ::Project
override :cluster_status_cluster_path
def cluster_status_cluster_path(cluster, params = {})
@@ -26,7 +27,7 @@ class ProjectClusterablePresenter < ClusterablePresenter
override :learn_more_link
def learn_more_link
- link_to(s_('ClusterIntegration|Learn more about Kubernetes'), help_page_path('user/project/clusters/index'), target: '_blank', rel: 'noopener noreferrer')
+ ApplicationController.helpers.link_to(s_('ClusterIntegration|Learn more about Kubernetes'), help_page_path('user/project/clusters/index'), target: '_blank', rel: 'noopener noreferrer')
end
def metrics_dashboard_path(cluster)
diff --git a/app/presenters/project_hook_presenter.rb b/app/presenters/project_hook_presenter.rb
index a65c7221b5a..a696e9fd0ec 100644
--- a/app/presenters/project_hook_presenter.rb
+++ b/app/presenters/project_hook_presenter.rb
@@ -1,7 +1,7 @@
# frozen_string_literal: true
class ProjectHookPresenter < Gitlab::View::Presenter::Delegated
- presents :project_hook
+ presents ::ProjectHook, as: :project_hook
def logs_details_path(log)
project_hook_hook_log_path(project, self, log)
diff --git a/app/presenters/project_member_presenter.rb b/app/presenters/project_member_presenter.rb
index 17947266ed7..91d3ae96877 100644
--- a/app/presenters/project_member_presenter.rb
+++ b/app/presenters/project_member_presenter.rb
@@ -1,6 +1,8 @@
# frozen_string_literal: true
class ProjectMemberPresenter < MemberPresenter
+ presents ::ProjectMember
+
private
def admin_member_permission
diff --git a/app/presenters/project_presenter.rb b/app/presenters/project_presenter.rb
index 066f4786cff..bbd8c715f5c 100644
--- a/app/presenters/project_presenter.rb
+++ b/app/presenters/project_presenter.rb
@@ -12,7 +12,10 @@ class ProjectPresenter < Gitlab::View::Presenter::Delegated
include Gitlab::Utils::StrongMemoize
include Gitlab::Experiment::Dsl
- presents :project
+ delegator_override_with GitlabRoutingHelper # TODO: Remove `GitlabRoutingHelper` inclusion as it's duplicate
+ delegator_override_with Gitlab::Utils::StrongMemoize # TODO: Remove `Gitlab::Utils::StrongMemoize` inclusion as it's duplicate
+
+ presents ::Project, as: :project
AnchorData = Struct.new(:is_link, :label, :link, :class_modifier, :icon, :itemprop, :data)
MAX_TOPICS_TO_SHOW = 3
diff --git a/app/presenters/projects/import_export/project_export_presenter.rb b/app/presenters/projects/import_export/project_export_presenter.rb
index f56760b55df..7b2ffb6d755 100644
--- a/app/presenters/projects/import_export/project_export_presenter.rb
+++ b/app/presenters/projects/import_export/project_export_presenter.rb
@@ -5,16 +5,24 @@ module Projects
class ProjectExportPresenter < Gitlab::View::Presenter::Delegated
include ActiveModel::Serializers::JSON
- presents :project
+ presents ::Project, as: :project
+ # TODO: Remove `ActiveModel::Serializers::JSON` inclusion as it's duplicate
+ delegator_override_with ActiveModel::Serializers::JSON
+ delegator_override_with ActiveModel::Naming
+ delegator_override :include_root_in_json, :include_root_in_json?
+
+ delegator_override :project_members
def project_members
super + converted_group_members
end
+ delegator_override :description
def description
self.respond_to?(:override_description) ? override_description : super
end
+ delegator_override :protected_branches
def protected_branches
project.exported_protected_branches
end
diff --git a/app/presenters/projects/settings/deploy_keys_presenter.rb b/app/presenters/projects/settings/deploy_keys_presenter.rb
index 13290a8e632..e3323b75188 100644
--- a/app/presenters/projects/settings/deploy_keys_presenter.rb
+++ b/app/presenters/projects/settings/deploy_keys_presenter.rb
@@ -5,7 +5,7 @@ module Projects
class DeployKeysPresenter < Gitlab::View::Presenter::Simple
include Gitlab::Utils::StrongMemoize
- presents :project
+ presents ::Project, as: :project
delegate :size, to: :enabled_keys, prefix: true
delegate :size, to: :available_project_keys, prefix: true
delegate :size, to: :available_public_keys, prefix: true
diff --git a/app/presenters/prometheus_alert_presenter.rb b/app/presenters/prometheus_alert_presenter.rb
index 99e24bdcdb9..714329ede71 100644
--- a/app/presenters/prometheus_alert_presenter.rb
+++ b/app/presenters/prometheus_alert_presenter.rb
@@ -3,7 +3,7 @@
class PrometheusAlertPresenter < Gitlab::View::Presenter::Delegated
include ActionView::Helpers::UrlHelper
- presents :prometheus_alert
+ presents ::PrometheusAlert, as: :prometheus_alert
def humanized_text
operator_text =
diff --git a/app/presenters/release_presenter.rb b/app/presenters/release_presenter.rb
index ac27e997b41..c919c7f4c60 100644
--- a/app/presenters/release_presenter.rb
+++ b/app/presenters/release_presenter.rb
@@ -3,8 +3,10 @@
class ReleasePresenter < Gitlab::View::Presenter::Delegated
include ActionView::Helpers::UrlHelper
- presents :release
+ presents ::Release, as: :release
+ # TODO: Remove `delegate` as it's redundant due to SimpleDelegator.
+ delegator_override :tag, :project
delegate :project, :tag, to: :release
def commit_path
@@ -51,6 +53,7 @@ class ReleasePresenter < Gitlab::View::Presenter::Delegated
edit_project_release_url(project, release)
end
+ delegator_override :assets_count
def assets_count
if can_download_code?
release.assets_count
@@ -59,6 +62,7 @@ class ReleasePresenter < Gitlab::View::Presenter::Delegated
end
end
+ delegator_override :name
def name
can_download_code? ? release.name : "Release-#{release.id}"
end
diff --git a/app/presenters/releases/evidence_presenter.rb b/app/presenters/releases/evidence_presenter.rb
index a00cbacb7d8..bdc053a303b 100644
--- a/app/presenters/releases/evidence_presenter.rb
+++ b/app/presenters/releases/evidence_presenter.rb
@@ -4,7 +4,7 @@ module Releases
class EvidencePresenter < Gitlab::View::Presenter::Delegated
include ActionView::Helpers::UrlHelper
- presents :evidence
+ presents ::Releases::Evidence, as: :evidence
def filepath
release = evidence.release
diff --git a/app/presenters/search_service_presenter.rb b/app/presenters/search_service_presenter.rb
index ab43800b9f2..72f967b8beb 100644
--- a/app/presenters/search_service_presenter.rb
+++ b/app/presenters/search_service_presenter.rb
@@ -3,7 +3,7 @@
class SearchServicePresenter < Gitlab::View::Presenter::Delegated
include RendersCommits
- presents :search_service
+ presents ::SearchService, as: :search_service
SCOPE_PRELOAD_METHOD = {
projects: :with_web_entity_associations,
@@ -18,6 +18,7 @@ class SearchServicePresenter < Gitlab::View::Presenter::Delegated
SORT_ENABLED_SCOPES = %w(issues merge_requests epics).freeze
+ delegator_override :search_objects
def search_objects
@search_objects ||= begin
objects = search_service.search_objects(SCOPE_PRELOAD_METHOD[scope.to_sym])
diff --git a/app/presenters/sentry_error_presenter.rb b/app/presenters/sentry_error_presenter.rb
index 669bcb68b7c..5862e54dfc7 100644
--- a/app/presenters/sentry_error_presenter.rb
+++ b/app/presenters/sentry_error_presenter.rb
@@ -1,7 +1,7 @@
# frozen_string_literal: true
class SentryErrorPresenter < Gitlab::View::Presenter::Delegated
- presents :error
+ presents nil, as: :error
FrequencyStruct = Struct.new(:time, :count, keyword_init: true)
diff --git a/app/presenters/service_hook_presenter.rb b/app/presenters/service_hook_presenter.rb
index 8f2ba1a905f..91911eb3dff 100644
--- a/app/presenters/service_hook_presenter.rb
+++ b/app/presenters/service_hook_presenter.rb
@@ -1,7 +1,7 @@
# frozen_string_literal: true
class ServiceHookPresenter < Gitlab::View::Presenter::Delegated
- presents :service_hook
+ presents ::ServiceHook, as: :service_hook
def logs_details_path(log)
project_service_hook_log_path(integration.project, integration, log)
diff --git a/app/presenters/snippet_blob_presenter.rb b/app/presenters/snippet_blob_presenter.rb
index ab8fc0f905b..4072696eb89 100644
--- a/app/presenters/snippet_blob_presenter.rb
+++ b/app/presenters/snippet_blob_presenter.rb
@@ -3,6 +3,8 @@
class SnippetBlobPresenter < BlobPresenter
include GitlabRoutingHelper
+ presents ::SnippetBlob
+
def rich_data
return unless blob.rich_viewer
diff --git a/app/presenters/snippet_presenter.rb b/app/presenters/snippet_presenter.rb
index 695aa266e2c..8badbe7f54a 100644
--- a/app/presenters/snippet_presenter.rb
+++ b/app/presenters/snippet_presenter.rb
@@ -1,16 +1,18 @@
# frozen_string_literal: true
class SnippetPresenter < Gitlab::View::Presenter::Delegated
- presents :snippet
+ presents ::Snippet, as: :snippet
def raw_url
url_builder.build(snippet, raw: true)
end
+ delegator_override :ssh_url_to_repo
def ssh_url_to_repo
snippet.ssh_url_to_repo if snippet.repository_exists?
end
+ delegator_override :http_url_to_repo
def http_url_to_repo
snippet.http_url_to_repo if snippet.repository_exists?
end
@@ -31,6 +33,7 @@ class SnippetPresenter < Gitlab::View::Presenter::Delegated
snippet.submittable_as_spam_by?(current_user)
end
+ delegator_override :blob
def blob
return snippet.blob if snippet.empty_repo?
diff --git a/app/presenters/terraform/modules_presenter.rb b/app/presenters/terraform/modules_presenter.rb
index 608f69e2019..9e9c6a5cd2b 100644
--- a/app/presenters/terraform/modules_presenter.rb
+++ b/app/presenters/terraform/modules_presenter.rb
@@ -4,7 +4,7 @@ module Terraform
class ModulesPresenter < Gitlab::View::Presenter::Simple
attr_accessor :packages, :system
- presents :modules
+ presents nil, as: :modules
def initialize(packages, system)
@packages = packages
diff --git a/app/presenters/todo_presenter.rb b/app/presenters/todo_presenter.rb
index 291be7848e2..cb8d37be22d 100644
--- a/app/presenters/todo_presenter.rb
+++ b/app/presenters/todo_presenter.rb
@@ -1,5 +1,5 @@
# frozen_string_literal: true
class TodoPresenter < Gitlab::View::Presenter::Delegated
- presents :todo
+ presents ::Todo, as: :todo
end
diff --git a/app/presenters/tree_entry_presenter.rb b/app/presenters/tree_entry_presenter.rb
index 216b3b0d4c9..0b313d81360 100644
--- a/app/presenters/tree_entry_presenter.rb
+++ b/app/presenters/tree_entry_presenter.rb
@@ -1,7 +1,7 @@
# frozen_string_literal: true
class TreeEntryPresenter < Gitlab::View::Presenter::Delegated
- presents :tree
+ presents nil, as: :tree
def web_url
Gitlab::Routing.url_helpers.project_tree_url(tree.repository.project, File.join(tree.commit_id, tree.path))
diff --git a/app/presenters/user_presenter.rb b/app/presenters/user_presenter.rb
index 7cd94082bac..5a99f10b6e7 100644
--- a/app/presenters/user_presenter.rb
+++ b/app/presenters/user_presenter.rb
@@ -1,7 +1,7 @@
# frozen_string_literal: true
class UserPresenter < Gitlab::View::Presenter::Delegated
- presents :user
+ presents ::User, as: :user
def group_memberships
should_be_private? ? GroupMember.none : user.group_members
diff --git a/app/presenters/web_hook_log_presenter.rb b/app/presenters/web_hook_log_presenter.rb
index fca03ddb5d7..a5166589073 100644
--- a/app/presenters/web_hook_log_presenter.rb
+++ b/app/presenters/web_hook_log_presenter.rb
@@ -1,7 +1,7 @@
# frozen_string_literal: true
class WebHookLogPresenter < Gitlab::View::Presenter::Delegated
- presents :web_hook_log
+ presents ::WebHookLog, as: :web_hook_log
def details_path
web_hook.present.logs_details_path(self)
diff --git a/app/serializers/feature_flag_entity.rb b/app/serializers/feature_flag_entity.rb
index 80cf869a389..196a4cd504f 100644
--- a/app/serializers/feature_flag_entity.rb
+++ b/app/serializers/feature_flag_entity.rb
@@ -24,8 +24,8 @@ class FeatureFlagEntity < Grape::Entity
project_feature_flag_path(feature_flag.project, feature_flag)
end
- expose :scopes, with: FeatureFlagScopeEntity do |feature_flag|
- feature_flag.scopes.sort_by(&:id)
+ expose :scopes do |_ff|
+ []
end
expose :strategies, with: FeatureFlags::StrategyEntity do |feature_flag|
diff --git a/app/serializers/feature_flag_scope_entity.rb b/app/serializers/feature_flag_scope_entity.rb
deleted file mode 100644
index 0450797a545..00000000000
--- a/app/serializers/feature_flag_scope_entity.rb
+++ /dev/null
@@ -1,12 +0,0 @@
-# frozen_string_literal: true
-
-class FeatureFlagScopeEntity < Grape::Entity
- include RequestAwareEntity
-
- expose :id
- expose :active
- expose :environment_scope
- expose :created_at
- expose :updated_at
- expose :strategies
-end
diff --git a/app/serializers/member_entity.rb b/app/serializers/member_entity.rb
index 5100a41638e..d7221109ecb 100644
--- a/app/serializers/member_entity.rb
+++ b/app/serializers/member_entity.rb
@@ -44,6 +44,8 @@ class MemberEntity < Grape::Entity
MemberUserEntity.represent(member.user, source: options[:source])
end
+ expose :state
+
expose :invite, if: -> (member) { member.invite? } do
expose :email do |member|
member.invite_email
@@ -56,6 +58,10 @@ class MemberEntity < Grape::Entity
expose :can_resend do |member|
member.can_resend_invite?
end
+
+ expose :user_state do |member|
+ member.respond_to?(:invited_user_state) ? member.invited_user_state : ""
+ end
end
end
diff --git a/app/serializers/merge_request_metrics_helper.rb b/app/serializers/merge_request_metrics_helper.rb
new file mode 100644
index 00000000000..fb1769d0aa6
--- /dev/null
+++ b/app/serializers/merge_request_metrics_helper.rb
@@ -0,0 +1,28 @@
+# frozen_string_literal: true
+
+module MergeRequestMetricsHelper
+ # There are cases where where metrics object doesn't exist and it needs to be rebuilt.
+ # TODO: Once https://gitlab.com/gitlab-org/gitlab/-/issues/342508 has been resolved and
+ # all merge requests have metrics we can remove this helper method.
+ def build_metrics(merge_request)
+ # There's no need to query and serialize metrics data for merge requests that are not
+ # merged or closed.
+ return unless merge_request.merged? || merge_request.closed?
+ return merge_request.metrics if merge_request.merged? && merge_request.metrics&.merged_by_id
+ return merge_request.metrics if merge_request.closed? && merge_request.metrics&.latest_closed_by_id
+
+ build_metrics_from_events(merge_request)
+ end
+
+ private
+
+ def build_metrics_from_events(merge_request)
+ closed_event = merge_request.closed_event
+ merge_event = merge_request.merge_event
+
+ MergeRequest::Metrics.new(latest_closed_at: closed_event&.updated_at,
+ latest_closed_by: closed_event&.author,
+ merged_at: merge_event&.updated_at,
+ merged_by: merge_event&.author)
+ end
+end
diff --git a/app/serializers/merge_request_poll_cached_widget_entity.rb b/app/serializers/merge_request_poll_cached_widget_entity.rb
index 7fba52cbe17..8b0f3c8eb74 100644
--- a/app/serializers/merge_request_poll_cached_widget_entity.rb
+++ b/app/serializers/merge_request_poll_cached_widget_entity.rb
@@ -1,6 +1,8 @@
# frozen_string_literal: true
class MergeRequestPollCachedWidgetEntity < IssuableEntity
+ include MergeRequestMetricsHelper
+
expose :auto_merge_enabled
expose :state
expose :merged_commit_sha
@@ -158,29 +160,6 @@ class MergeRequestPollCachedWidgetEntity < IssuableEntity
@presenters ||= {}
@presenters[merge_request] ||= MergeRequestPresenter.new(merge_request, current_user: current_user) # rubocop: disable CodeReuse/Presenter
end
-
- # Once SchedulePopulateMergeRequestMetricsWithEventsData fully runs,
- # we can remove this method and just serialize MergeRequest#metrics
- # instead. See https://gitlab.com/gitlab-org/gitlab-foss/issues/41587
- def build_metrics(merge_request)
- # There's no need to query and serialize metrics data for merge requests that are not
- # merged or closed.
- return unless merge_request.merged? || merge_request.closed?
- return merge_request.metrics if merge_request.merged? && merge_request.metrics&.merged_by_id
- return merge_request.metrics if merge_request.closed? && merge_request.metrics&.latest_closed_by_id
-
- build_metrics_from_events(merge_request)
- end
-
- def build_metrics_from_events(merge_request)
- closed_event = merge_request.closed_event
- merge_event = merge_request.merge_event
-
- MergeRequest::Metrics.new(latest_closed_at: closed_event&.updated_at,
- latest_closed_by: closed_event&.author,
- merged_at: merge_event&.updated_at,
- merged_by: merge_event&.author)
- end
end
MergeRequestPollCachedWidgetEntity.prepend_mod_with('MergeRequestPollCachedWidgetEntity')
diff --git a/app/serializers/merge_request_widget_entity.rb b/app/serializers/merge_request_widget_entity.rb
index 1c033dee5ff..1e4289ce774 100644
--- a/app/serializers/merge_request_widget_entity.rb
+++ b/app/serializers/merge_request_widget_entity.rb
@@ -83,7 +83,10 @@ class MergeRequestWidgetEntity < Grape::Entity
end
expose :is_dismissed_suggest_pipeline do |_merge_request|
- current_user && current_user.dismissed_callout?(feature_name: SUGGEST_PIPELINE)
+ next true unless current_user
+ next true unless Gitlab::CurrentSettings.suggest_pipeline_enabled?
+
+ current_user.dismissed_callout?(feature_name: SUGGEST_PIPELINE)
end
expose :human_access do |merge_request|
diff --git a/app/services/base_project_service.rb b/app/services/base_project_service.rb
index fb466e61673..1bf4a235a79 100644
--- a/app/services/base_project_service.rb
+++ b/app/services/base_project_service.rb
@@ -2,6 +2,8 @@
# Base class, scoped by project
class BaseProjectService < ::BaseContainerService
+ include ::Gitlab::Utils::StrongMemoize
+
attr_accessor :project
def initialize(project:, current_user: nil, params: {})
@@ -11,4 +13,12 @@ class BaseProjectService < ::BaseContainerService
end
delegate :repository, to: :project
+
+ private
+
+ def project_group
+ strong_memoize(:project_group) do
+ project.group
+ end
+ end
end
diff --git a/app/services/boards/issues/list_service.rb b/app/services/boards/issues/list_service.rb
index 9a3e3bc3bdb..6021d634f86 100644
--- a/app/services/boards/issues/list_service.rb
+++ b/app/services/boards/issues/list_service.rb
@@ -22,7 +22,7 @@ module Boards
def order(items)
return items.order_closed_date_desc if list&.closed?
- items.order_by_position_and_priority(with_cte: params[:search].present?)
+ items.order_by_relative_position
end
def finder
diff --git a/app/services/bulk_import_service.rb b/app/services/bulk_import_service.rb
deleted file mode 100644
index 4e13e967dbd..00000000000
--- a/app/services/bulk_import_service.rb
+++ /dev/null
@@ -1,70 +0,0 @@
-# frozen_string_literal: true
-
-# Entry point of the BulkImport feature.
-# This service receives a Gitlab Instance connection params
-# and a list of groups to be imported.
-#
-# Process topography:
-#
-# sync | async
-# |
-# User +--> P1 +----> Pn +---+
-# | ^ | Enqueue new job
-# | +-----+
-#
-# P1 (sync)
-#
-# - Create a BulkImport record
-# - Create a BulkImport::Entity for each group to be imported
-# - Enqueue a BulkImportWorker job (P2) to import the given groups (entities)
-#
-# Pn (async)
-#
-# - For each group to be imported (BulkImport::Entity.with_status(:created))
-# - Import the group data
-# - Create entities for each subgroup of the imported group
-# - Enqueue a BulkImportService job (Pn) to import the new entities (subgroups)
-#
-class BulkImportService
- attr_reader :current_user, :params, :credentials
-
- def initialize(current_user, params, credentials)
- @current_user = current_user
- @params = params
- @credentials = credentials
- end
-
- def execute
- bulk_import = create_bulk_import
-
- BulkImportWorker.perform_async(bulk_import.id)
-
- ServiceResponse.success(payload: bulk_import)
- rescue ActiveRecord::RecordInvalid => e
- ServiceResponse.error(
- message: e.message,
- http_status: :unprocessable_entity
- )
- end
-
- private
-
- def create_bulk_import
- BulkImport.transaction do
- bulk_import = BulkImport.create!(user: current_user, source_type: 'gitlab')
- bulk_import.create_configuration!(credentials.slice(:url, :access_token))
-
- params.each do |entity|
- BulkImports::Entity.create!(
- bulk_import: bulk_import,
- source_type: entity[:source_type],
- source_full_path: entity[:source_full_path],
- destination_name: entity[:destination_name],
- destination_namespace: entity[:destination_namespace]
- )
- end
-
- bulk_import
- end
- end
-end
diff --git a/app/services/bulk_imports/create_service.rb b/app/services/bulk_imports/create_service.rb
new file mode 100644
index 00000000000..c1becbb5609
--- /dev/null
+++ b/app/services/bulk_imports/create_service.rb
@@ -0,0 +1,83 @@
+# frozen_string_literal: true
+
+# Entry point of the BulkImport feature.
+# This service receives a Gitlab Instance connection params
+# and a list of groups to be imported.
+#
+# Process topography:
+#
+# sync | async
+# |
+# User +--> P1 +----> Pn +---+
+# | ^ | Enqueue new job
+# | +-----+
+#
+# P1 (sync)
+#
+# - Create a BulkImport record
+# - Create a BulkImport::Entity for each group to be imported
+# - Enqueue a BulkImportWorker job (P2) to import the given groups (entities)
+#
+# Pn (async)
+#
+# - For each group to be imported (BulkImport::Entity.with_status(:created))
+# - Import the group data
+# - Create entities for each subgroup of the imported group
+# - Enqueue a BulkImports::CreateService job (Pn) to import the new entities (subgroups)
+#
+module BulkImports
+ class CreateService
+ attr_reader :current_user, :params, :credentials
+
+ def initialize(current_user, params, credentials)
+ @current_user = current_user
+ @params = params
+ @credentials = credentials
+ end
+
+ def execute
+ bulk_import = create_bulk_import
+
+ BulkImportWorker.perform_async(bulk_import.id)
+
+ ServiceResponse.success(payload: bulk_import)
+ rescue ActiveRecord::RecordInvalid => e
+ ServiceResponse.error(
+ message: e.message,
+ http_status: :unprocessable_entity
+ )
+ end
+
+ private
+
+ def create_bulk_import
+ BulkImport.transaction do
+ bulk_import = BulkImport.create!(
+ user: current_user,
+ source_type: 'gitlab',
+ source_version: client.instance_version
+ )
+ bulk_import.create_configuration!(credentials.slice(:url, :access_token))
+
+ params.each do |entity|
+ BulkImports::Entity.create!(
+ bulk_import: bulk_import,
+ source_type: entity[:source_type],
+ source_full_path: entity[:source_full_path],
+ destination_name: entity[:destination_name],
+ destination_namespace: entity[:destination_namespace]
+ )
+ end
+
+ bulk_import
+ end
+ end
+
+ def client
+ @client ||= BulkImports::Clients::HTTP.new(
+ url: @credentials[:url],
+ token: @credentials[:access_token]
+ )
+ end
+ end
+end
diff --git a/app/services/bulk_imports/file_export_service.rb b/app/services/bulk_imports/file_export_service.rb
new file mode 100644
index 00000000000..a7e0f998666
--- /dev/null
+++ b/app/services/bulk_imports/file_export_service.rb
@@ -0,0 +1,42 @@
+# frozen_string_literal: true
+
+module BulkImports
+ class FileExportService
+ include Gitlab::ImportExport::CommandLineUtil
+
+ def initialize(portable, export_path, relation)
+ @portable = portable
+ @export_path = export_path
+ @relation = relation
+ end
+
+ def execute
+ export_service.execute
+
+ archive_exported_data
+ end
+
+ def exported_filename
+ "#{relation}.tar"
+ end
+
+ private
+
+ attr_reader :export_path, :portable, :relation
+
+ def export_service
+ case relation
+ when FileTransfer::ProjectConfig::UPLOADS_RELATION
+ UploadsExportService.new(portable, export_path)
+ else
+ raise BulkImports::Error, 'Unsupported relation export type'
+ end
+ end
+
+ def archive_exported_data
+ archive_file = File.join(export_path, exported_filename)
+
+ tar_cf(archive: archive_file, dir: export_path)
+ end
+ end
+end
diff --git a/app/services/bulk_imports/get_importable_data_service.rb b/app/services/bulk_imports/get_importable_data_service.rb
new file mode 100644
index 00000000000..07e0b3976a1
--- /dev/null
+++ b/app/services/bulk_imports/get_importable_data_service.rb
@@ -0,0 +1,45 @@
+# frozen_string_literal: true
+
+module BulkImports
+ class GetImportableDataService
+ def initialize(params, query_params, credentials)
+ @params = params
+ @query_params = query_params
+ @credentials = credentials
+ end
+
+ def execute
+ {
+ version_validation: version_validation,
+ response: importables
+ }
+ end
+
+ private
+
+ def importables
+ client.get('groups', @query_params)
+ end
+
+ def version_validation
+ {
+ features: {
+ project_migration: {
+ available: client.compatible_for_project_migration?,
+ min_version: BulkImport.min_gl_version_for_project_migration.to_s
+ },
+ source_instance_version: client.instance_version.to_s
+ }
+ }
+ end
+
+ def client
+ @client ||= BulkImports::Clients::HTTP.new(
+ url: @credentials[:url],
+ token: @credentials[:access_token],
+ per_page: @params[:per_page],
+ page: @params[:page]
+ )
+ end
+ end
+end
diff --git a/app/services/bulk_imports/relation_export_service.rb b/app/services/bulk_imports/relation_export_service.rb
index 055f9cafd10..4718b3914b2 100644
--- a/app/services/bulk_imports/relation_export_service.rb
+++ b/app/services/bulk_imports/relation_export_service.rb
@@ -9,20 +9,23 @@ module BulkImports
@portable = portable
@relation = relation
@jid = jid
+ @config = FileTransfer.config_for(portable)
end
def execute
find_or_create_export! do |export|
remove_existing_export_file!(export)
- serialize_relation_to_file(export.relation_definition)
+ export_service.execute
compress_exported_relation
upload_compressed_file(export)
end
+ ensure
+ FileUtils.remove_entry(config.export_path)
end
private
- attr_reader :user, :portable, :relation, :jid
+ attr_reader :user, :portable, :relation, :jid, :config
def find_or_create_export!
validate_user_permissions!
@@ -55,52 +58,28 @@ module BulkImports
upload.save!
end
- def serialize_relation_to_file(relation_definition)
- serializer.serialize_relation(relation_definition)
- end
-
- def compress_exported_relation
- gzip(dir: export_path, filename: ndjson_filename)
+ def export_service
+ @export_service ||= if config.tree_relation?(relation)
+ TreeExportService.new(portable, config.export_path, relation)
+ elsif config.file_relation?(relation)
+ FileExportService.new(portable, config.export_path, relation)
+ else
+ raise BulkImports::Error, 'Unsupported export relation'
+ end
end
def upload_compressed_file(export)
- compressed_filename = File.join(export_path, "#{ndjson_filename}.gz")
+ compressed_file = File.join(config.export_path, "#{export_service.exported_filename}.gz")
+
upload = ExportUpload.find_or_initialize_by(export_id: export.id) # rubocop: disable CodeReuse/ActiveRecord
- File.open(compressed_filename) { |file| upload.export_file = file }
+ File.open(compressed_file) { |file| upload.export_file = file }
upload.save!
end
- def config
- @config ||= FileTransfer.config_for(portable)
- end
-
- def export_path
- @export_path ||= config.export_path
- end
-
- def portable_tree
- @portable_tree ||= config.portable_tree
- end
-
- # rubocop: disable CodeReuse/Serializer
- def serializer
- @serializer ||= ::Gitlab::ImportExport::Json::StreamingSerializer.new(
- portable,
- portable_tree,
- json_writer,
- exportable_path: ''
- )
- end
- # rubocop: enable CodeReuse/Serializer
-
- def json_writer
- @json_writer ||= ::Gitlab::ImportExport::Json::NdjsonWriter.new(export_path)
- end
-
- def ndjson_filename
- @ndjson_filename ||= "#{relation}.ndjson"
+ def compress_exported_relation
+ gzip(dir: config.export_path, filename: export_service.exported_filename)
end
end
end
diff --git a/app/services/bulk_imports/tree_export_service.rb b/app/services/bulk_imports/tree_export_service.rb
new file mode 100644
index 00000000000..b8e7ac4574b
--- /dev/null
+++ b/app/services/bulk_imports/tree_export_service.rb
@@ -0,0 +1,43 @@
+# frozen_string_literal: true
+
+module BulkImports
+ class TreeExportService
+ def initialize(portable, export_path, relation)
+ @portable = portable
+ @export_path = export_path
+ @relation = relation
+ @config = FileTransfer.config_for(portable)
+ end
+
+ def execute
+ relation_definition = config.tree_relation_definition_for(relation)
+
+ raise BulkImports::Error, 'Unsupported relation export type' unless relation_definition
+
+ serializer.serialize_relation(relation_definition)
+ end
+
+ def exported_filename
+ "#{relation}.ndjson"
+ end
+
+ private
+
+ attr_reader :export_path, :portable, :relation, :config
+
+ # rubocop: disable CodeReuse/Serializer
+ def serializer
+ ::Gitlab::ImportExport::Json::StreamingSerializer.new(
+ portable,
+ config.portable_tree,
+ json_writer,
+ exportable_path: ''
+ )
+ end
+ # rubocop: enable CodeReuse/Serializer
+
+ def json_writer
+ ::Gitlab::ImportExport::Json::NdjsonWriter.new(export_path)
+ end
+ end
+end
diff --git a/app/services/bulk_imports/uploads_export_service.rb b/app/services/bulk_imports/uploads_export_service.rb
new file mode 100644
index 00000000000..32cc48c152c
--- /dev/null
+++ b/app/services/bulk_imports/uploads_export_service.rb
@@ -0,0 +1,49 @@
+# frozen_string_literal: true
+
+module BulkImports
+ class UploadsExportService
+ include Gitlab::ImportExport::CommandLineUtil
+
+ BATCH_SIZE = 100
+
+ def initialize(portable, export_path)
+ @portable = portable
+ @export_path = export_path
+ end
+
+ def execute
+ portable.uploads.find_each(batch_size: BATCH_SIZE) do |upload| # rubocop: disable CodeReuse/ActiveRecord
+ uploader = upload.retrieve_uploader
+
+ next unless upload.exist?
+ next unless uploader.file
+
+ subdir_path = export_subdir_path(upload)
+ mkdir_p(subdir_path)
+ download_or_copy_upload(uploader, File.join(subdir_path, uploader.filename))
+ rescue Errno::ENAMETOOLONG => e
+ # Do not fail entire export process if downloaded file has filename that exceeds 255 characters.
+ # Ignore raised exception, skip such upload, log the error and keep going with the export instead.
+ Gitlab::ErrorTracking.log_exception(e, portable_id: portable.id, portable_class: portable.class.name, upload_id: upload.id)
+ end
+ end
+
+ private
+
+ attr_reader :portable, :export_path
+
+ def export_subdir_path(upload)
+ subdir = if upload.path == avatar_path
+ 'avatar'
+ else
+ upload.try(:secret).to_s
+ end
+
+ File.join(export_path, subdir)
+ end
+
+ def avatar_path
+ @avatar_path ||= portable.avatar&.upload&.path
+ end
+ end
+end
diff --git a/app/services/ci/archive_trace_service.rb b/app/services/ci/archive_trace_service.rb
index 995b58c6882..17cac38ace2 100644
--- a/app/services/ci/archive_trace_service.rb
+++ b/app/services/ci/archive_trace_service.rb
@@ -3,10 +3,15 @@
module Ci
class ArchiveTraceService
def execute(job, worker_name:)
+ unless job.trace.archival_attempts_available?
+ Sidekiq.logger.warn(class: worker_name, message: 'The job is out of archival attempts.', job_id: job.id)
+
+ job.trace.attempt_archive_cleanup!
+ return
+ end
+
unless job.trace.can_attempt_archival_now?
- Sidekiq.logger.warn(class: worker_name,
- message: job.trace.archival_attempts_message,
- job_id: job.id)
+ Sidekiq.logger.warn(class: worker_name, message: 'The job can not be archived right now.', job_id: job.id)
return
end
diff --git a/app/services/ci/destroy_pipeline_service.rb b/app/services/ci/destroy_pipeline_service.rb
index dd5c8e0379f..476c7523d60 100644
--- a/app/services/ci/destroy_pipeline_service.rb
+++ b/app/services/ci/destroy_pipeline_service.rb
@@ -9,6 +9,9 @@ module Ci
pipeline.cancel_running if pipeline.cancelable?
+ # Ci::Pipeline#destroy triggers `use_fast_destroy :job_artifacts` and
+ # ci_builds has ON DELETE CASCADE to ci_pipelines. The pipeline, the builds,
+ # job and pipeline artifacts all get destroyed here.
pipeline.reset.destroy!
ServiceResponse.success(message: 'Pipeline not found')
diff --git a/app/services/ci/pipelines/add_job_service.rb b/app/services/ci/pipelines/add_job_service.rb
index 53536b6fdf9..703bb22fb5d 100644
--- a/app/services/ci/pipelines/add_job_service.rb
+++ b/app/services/ci/pipelines/add_job_service.rb
@@ -16,15 +16,7 @@ module Ci
def execute!(job, &block)
assign_pipeline_attributes(job)
- if Feature.enabled?(:ci_pipeline_add_job_with_lock, pipeline.project, default_enabled: :yaml)
- in_lock("ci:pipelines:#{pipeline.id}:add-job", ttl: LOCK_TIMEOUT, sleep_sec: LOCK_SLEEP, retries: LOCK_RETRIES) do
- Ci::Pipeline.transaction do
- yield(job)
-
- job.update_older_statuses_retried!
- end
- end
- else
+ in_lock("ci:pipelines:#{pipeline.id}:add-job", ttl: LOCK_TIMEOUT, sleep_sec: LOCK_SLEEP, retries: LOCK_RETRIES) do
Ci::Pipeline.transaction do
yield(job)
diff --git a/app/services/ci/pipelines/hook_service.rb b/app/services/ci/pipelines/hook_service.rb
new file mode 100644
index 00000000000..629ed7e1ebd
--- /dev/null
+++ b/app/services/ci/pipelines/hook_service.rb
@@ -0,0 +1,34 @@
+# frozen_string_literal: true
+
+module Ci
+ module Pipelines
+ class HookService
+ include Gitlab::Utils::StrongMemoize
+
+ HOOK_NAME = :pipeline_hooks
+
+ def initialize(pipeline)
+ @pipeline = pipeline
+ end
+
+ def execute
+ project.execute_hooks(hook_data, HOOK_NAME) if project.has_active_hooks?(HOOK_NAME)
+ project.execute_integrations(hook_data, HOOK_NAME) if project.has_active_integrations?(HOOK_NAME)
+ end
+
+ private
+
+ attr_reader :pipeline
+
+ def project
+ @project ||= pipeline.project
+ end
+
+ def hook_data
+ strong_memoize(:hook_data) do
+ Gitlab::DataBuilder::Pipeline.build(pipeline)
+ end
+ end
+ end
+ end
+end
diff --git a/app/services/ci/process_pipeline_service.rb b/app/services/ci/process_pipeline_service.rb
index fb26d5d3356..664915c5e2f 100644
--- a/app/services/ci/process_pipeline_service.rb
+++ b/app/services/ci/process_pipeline_service.rb
@@ -11,8 +11,6 @@ module Ci
def execute
increment_processing_counter
- update_retried
-
Ci::PipelineProcessing::AtomicProcessingService
.new(pipeline)
.execute
@@ -24,41 +22,6 @@ module Ci
private
- # This method is for compatibility and data consistency and should be removed with 9.3 version of GitLab
- # This replicates what is db/post_migrate/20170416103934_upate_retried_for_ci_build.rb
- # and ensures that functionality will not be broken before migration is run
- # this updates only when there are data that needs to be updated, there are two groups with no retried flag
- # rubocop: disable CodeReuse/ActiveRecord
- def update_retried
- return if Feature.enabled?(:ci_remove_update_retried_from_process_pipeline, pipeline.project, default_enabled: :yaml)
-
- # find the latest builds for each name
- latest_statuses = pipeline.latest_statuses
- .group(:name)
- .having('count(*) > 1')
- .pluck(Arel.sql('MAX(id)'), 'name')
-
- # mark builds that are retried
- if latest_statuses.any?
- updated_count = pipeline.latest_statuses
- .where(name: latest_statuses.map(&:second))
- .where.not(id: latest_statuses.map(&:first))
- .update_all(retried: true)
-
- # This counter is temporary. It will be used to check whether if we still use this method or not
- # after setting correct value of `GenericCommitStatus#retried`.
- # More info: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/50465#note_491657115
- if updated_count > 0
- Gitlab::AppJsonLogger.info(event: 'update_retried_is_used',
- project_id: pipeline.project.id,
- pipeline_id: pipeline.id)
-
- metrics.legacy_update_jobs_counter.increment
- end
- end
- end
- # rubocop: enable CodeReuse/ActiveRecord
-
def increment_processing_counter
metrics.pipeline_processing_events_counter.increment
end
diff --git a/app/services/ci/queue/build_queue_service.rb b/app/services/ci/queue/build_queue_service.rb
index 3276c427923..3c886cb023f 100644
--- a/app/services/ci/queue/build_queue_service.rb
+++ b/app/services/ci/queue/build_queue_service.rb
@@ -90,7 +90,7 @@ module Ci
def runner_projects_relation
if ::Feature.enabled?(:ci_pending_builds_project_runners_decoupling, runner, default_enabled: :yaml)
- runner.runner_projects.select(:project_id)
+ runner.runner_projects.select('"ci_runner_projects"."project_id"::bigint')
else
runner.projects.without_deleted.with_builds_enabled
end
diff --git a/app/services/ci/register_job_service.rb b/app/services/ci/register_job_service.rb
index c46ddd22558..67ef4f10709 100644
--- a/app/services/ci/register_job_service.rb
+++ b/app/services/ci/register_job_service.rb
@@ -22,7 +22,8 @@ module Ci
end
def execute(params = {})
- db_all_caught_up = ::Gitlab::Database::LoadBalancing::Sticking.all_caught_up?(:runner, runner.id)
+ db_all_caught_up =
+ ::Ci::Runner.sticking.all_caught_up?(:runner, runner.id)
@metrics.increment_queue_operation(:queue_attempt)
@@ -103,42 +104,40 @@ module Ci
# rubocop: disable CodeReuse/ActiveRecord
def each_build(params, &blk)
- ::Gitlab::Database.allow_cross_joins_across_databases(url: 'https://gitlab.com/gitlab-org/gitlab/-/issues/339429') do
- queue = ::Ci::Queue::BuildQueueService.new(runner)
-
- builds = begin
- if runner.instance_type?
- queue.builds_for_shared_runner
- elsif runner.group_type?
- queue.builds_for_group_runner
- else
- queue.builds_for_project_runner
- end
- end
+ queue = ::Ci::Queue::BuildQueueService.new(runner)
- if runner.ref_protected?
- builds = queue.builds_for_protected_runner(builds)
+ builds = begin
+ if runner.instance_type?
+ queue.builds_for_shared_runner
+ elsif runner.group_type?
+ queue.builds_for_group_runner
+ else
+ queue.builds_for_project_runner
end
+ end
- # pick builds that does not have other tags than runner's one
- builds = queue.builds_matching_tag_ids(builds, runner.tags.ids)
+ if runner.ref_protected?
+ builds = queue.builds_for_protected_runner(builds)
+ end
- # pick builds that have at least one tag
- unless runner.run_untagged?
- builds = queue.builds_with_any_tags(builds)
- end
+ # pick builds that does not have other tags than runner's one
+ builds = queue.builds_matching_tag_ids(builds, runner.tags.ids)
- # pick builds that older than specified age
- if params.key?(:job_age)
- builds = queue.builds_queued_before(builds, params[:job_age].seconds.ago)
- end
+ # pick builds that have at least one tag
+ unless runner.run_untagged?
+ builds = queue.builds_with_any_tags(builds)
+ end
- build_ids = retrieve_queue(-> { queue.execute(builds) })
+ # pick builds that older than specified age
+ if params.key?(:job_age)
+ builds = queue.builds_queued_before(builds, params[:job_age].seconds.ago)
+ end
- @metrics.observe_queue_size(-> { build_ids.size }, @runner.runner_type)
+ build_ids = retrieve_queue(-> { queue.execute(builds) })
- build_ids.each { |build_id| yield Ci::Build.find(build_id) }
- end
+ @metrics.observe_queue_size(-> { build_ids.size }, @runner.runner_type)
+
+ build_ids.each { |build_id| yield Ci::Build.find(build_id) }
end
# rubocop: enable CodeReuse/ActiveRecord
diff --git a/app/services/ci/resource_groups/assign_resource_from_resource_group_service.rb b/app/services/ci/resource_groups/assign_resource_from_resource_group_service.rb
index 1d329fe7b53..dfd97498fc8 100644
--- a/app/services/ci/resource_groups/assign_resource_from_resource_group_service.rb
+++ b/app/services/ci/resource_groups/assign_resource_from_resource_group_service.rb
@@ -9,7 +9,7 @@ module Ci
free_resources = resource_group.resources.free.count
- resource_group.processables.waiting_for_resource.take(free_resources).each do |processable|
+ resource_group.upcoming_processables.take(free_resources).each do |processable|
processable.enqueue_waiting_for_resource
end
end
diff --git a/app/services/ci/retry_build_service.rb b/app/services/ci/retry_build_service.rb
index 08520c9514c..07cfbb9ce3c 100644
--- a/app/services/ci/retry_build_service.rb
+++ b/app/services/ci/retry_build_service.rb
@@ -17,7 +17,7 @@ module Ci
def execute(build)
build.ensure_scheduling_type!
- reprocess!(build).tap do |new_build|
+ clone!(build).tap do |new_build|
check_assignable_runners!(new_build)
next if new_build.failed?
@@ -31,7 +31,12 @@ module Ci
end
# rubocop: disable CodeReuse/ActiveRecord
- def reprocess!(build)
+ def clone!(build)
+ # Cloning a build requires a strict type check to ensure
+ # the attributes being used for the clone are taken straight
+ # from the model and not overridden by other abstractions.
+ raise TypeError unless build.instance_of?(Ci::Build)
+
check_access!(build)
new_build = clone_build(build)
diff --git a/app/services/ci/retry_pipeline_service.rb b/app/services/ci/retry_pipeline_service.rb
index 02ee40d2cf6..9ad46ca7585 100644
--- a/app/services/ci/retry_pipeline_service.rb
+++ b/app/services/ci/retry_pipeline_service.rb
@@ -9,20 +9,15 @@ module Ci
raise Gitlab::Access::AccessDeniedError
end
- needs = Set.new
-
pipeline.ensure_scheduling_type!
builds_relation(pipeline).find_each do |build|
next unless can_be_retried?(build)
- Ci::RetryBuildService.new(project, current_user)
- .reprocess!(build)
-
- needs += build.needs.map(&:name)
+ Ci::RetryBuildService.new(project, current_user).clone!(build)
end
- pipeline.builds.latest.skipped.find_each do |skipped|
+ pipeline.processables.latest.skipped.find_each do |skipped|
retry_optimistic_lock(skipped, name: 'ci_retry_pipeline') { |build| build.process(current_user) }
end
diff --git a/app/services/ci/stuck_builds/drop_pending_service.rb b/app/services/ci/stuck_builds/drop_pending_service.rb
new file mode 100644
index 00000000000..4653e701973
--- /dev/null
+++ b/app/services/ci/stuck_builds/drop_pending_service.rb
@@ -0,0 +1,42 @@
+# frozen_string_literal: true
+
+module Ci
+ module StuckBuilds
+ class DropPendingService
+ include DropHelpers
+
+ BUILD_PENDING_OUTDATED_TIMEOUT = 1.day
+ BUILD_PENDING_STUCK_TIMEOUT = 1.hour
+ BUILD_LOOKBACK = 5.days
+
+ def execute
+ Gitlab::AppLogger.info "#{self.class}: Cleaning pending timed-out builds"
+
+ drop(
+ pending_builds(BUILD_PENDING_OUTDATED_TIMEOUT.ago),
+ failure_reason: :stuck_or_timeout_failure
+ )
+
+ drop_stuck(
+ pending_builds(BUILD_PENDING_STUCK_TIMEOUT.ago),
+ failure_reason: :stuck_or_timeout_failure
+ )
+ end
+
+ private
+
+ # rubocop: disable CodeReuse/ActiveRecord
+ # We're adding the ordering clause by `created_at` and `project_id`
+ # because we want to force the query planner to use the
+ # `ci_builds_gitlab_monitor_metrics` index all the time.
+ def pending_builds(timeout)
+ if Feature.enabled?(:ci_new_query_for_pending_stuck_jobs)
+ Ci::Build.pending.created_at_before(timeout).updated_at_before(timeout).order(created_at: :asc, project_id: :asc)
+ else
+ Ci::Build.pending.updated_before(lookback: BUILD_LOOKBACK.ago, timeout: timeout)
+ end
+ end
+ # rubocop: enable CodeReuse/ActiveRecord
+ end
+ end
+end
diff --git a/app/services/ci/stuck_builds/drop_running_service.rb b/app/services/ci/stuck_builds/drop_running_service.rb
new file mode 100644
index 00000000000..a79224cc231
--- /dev/null
+++ b/app/services/ci/stuck_builds/drop_running_service.rb
@@ -0,0 +1,31 @@
+# frozen_string_literal: true
+
+module Ci
+ module StuckBuilds
+ class DropRunningService
+ include DropHelpers
+
+ BUILD_RUNNING_OUTDATED_TIMEOUT = 1.hour
+
+ def execute
+ Gitlab::AppLogger.info "#{self.class}: Cleaning running, timed-out builds"
+
+ drop(running_timed_out_builds, failure_reason: :stuck_or_timeout_failure)
+ end
+
+ private
+
+ def running_timed_out_builds
+ if Feature.enabled?(:ci_new_query_for_running_stuck_jobs, default_enabled: :yaml)
+ Ci::Build
+ .running
+ .created_at_before(BUILD_RUNNING_OUTDATED_TIMEOUT.ago)
+ .updated_at_before(BUILD_RUNNING_OUTDATED_TIMEOUT.ago)
+ .order(created_at: :asc, project_id: :asc) # rubocop:disable CodeReuse/ActiveRecord
+ else
+ Ci::Build.running.updated_at_before(BUILD_RUNNING_OUTDATED_TIMEOUT.ago)
+ end
+ end
+ end
+ end
+end
diff --git a/app/services/ci/stuck_builds/drop_scheduled_service.rb b/app/services/ci/stuck_builds/drop_scheduled_service.rb
new file mode 100644
index 00000000000..d4f4252c2c0
--- /dev/null
+++ b/app/services/ci/stuck_builds/drop_scheduled_service.rb
@@ -0,0 +1,23 @@
+# frozen_string_literal: true
+
+module Ci
+ module StuckBuilds
+ class DropScheduledService
+ include DropHelpers
+
+ BUILD_SCHEDULED_OUTDATED_TIMEOUT = 1.hour
+
+ def execute
+ Gitlab::AppLogger.info "#{self.class}: Cleaning scheduled, timed-out builds"
+
+ drop(scheduled_timed_out_builds, failure_reason: :stale_schedule)
+ end
+
+ private
+
+ def scheduled_timed_out_builds
+ Ci::Build.scheduled.scheduled_at_before(BUILD_SCHEDULED_OUTDATED_TIMEOUT.ago)
+ end
+ end
+ end
+end
diff --git a/app/services/ci/stuck_builds/drop_service.rb b/app/services/ci/stuck_builds/drop_service.rb
deleted file mode 100644
index 3fee9a94381..00000000000
--- a/app/services/ci/stuck_builds/drop_service.rb
+++ /dev/null
@@ -1,62 +0,0 @@
-# frozen_string_literal: true
-
-module Ci
- module StuckBuilds
- class DropService
- include DropHelpers
-
- BUILD_RUNNING_OUTDATED_TIMEOUT = 1.hour
- BUILD_PENDING_OUTDATED_TIMEOUT = 1.day
- BUILD_SCHEDULED_OUTDATED_TIMEOUT = 1.hour
- BUILD_PENDING_STUCK_TIMEOUT = 1.hour
- BUILD_LOOKBACK = 5.days
-
- def execute
- Gitlab::AppLogger.info "#{self.class}: Cleaning stuck builds"
-
- drop(running_timed_out_builds, failure_reason: :stuck_or_timeout_failure)
-
- drop(
- pending_builds(BUILD_PENDING_OUTDATED_TIMEOUT.ago),
- failure_reason: :stuck_or_timeout_failure
- )
-
- drop(scheduled_timed_out_builds, failure_reason: :stale_schedule)
-
- drop_stuck(
- pending_builds(BUILD_PENDING_STUCK_TIMEOUT.ago),
- failure_reason: :stuck_or_timeout_failure
- )
- end
-
- private
-
- # rubocop: disable CodeReuse/ActiveRecord
- # We're adding the ordering clause by `created_at` and `project_id`
- # because we want to force the query planner to use the
- # `ci_builds_gitlab_monitor_metrics` index all the time.
- def pending_builds(timeout)
- if Feature.enabled?(:ci_new_query_for_pending_stuck_jobs)
- Ci::Build.pending.created_at_before(timeout).updated_at_before(timeout).order(created_at: :asc, project_id: :asc)
- else
- Ci::Build.pending.updated_before(lookback: BUILD_LOOKBACK.ago, timeout: timeout)
- end
- end
- # rubocop: enable CodeReuse/ActiveRecord
-
- def scheduled_timed_out_builds
- Ci::Build.where(status: :scheduled).where( # rubocop: disable CodeReuse/ActiveRecord
- 'ci_builds.scheduled_at IS NOT NULL AND ci_builds.scheduled_at < ?',
- BUILD_SCHEDULED_OUTDATED_TIMEOUT.ago
- )
- end
-
- def running_timed_out_builds
- Ci::Build.running.where( # rubocop: disable CodeReuse/ActiveRecord
- 'ci_builds.updated_at < ?',
- BUILD_RUNNING_OUTDATED_TIMEOUT.ago
- )
- end
- end
- end
-end
diff --git a/app/services/ci/update_build_state_service.rb b/app/services/ci/update_build_state_service.rb
index abd50d2f110..3b403f92486 100644
--- a/app/services/ci/update_build_state_service.rb
+++ b/app/services/ci/update_build_state_service.rb
@@ -73,9 +73,11 @@ module Ci
::Gitlab::Ci::Trace::Checksum.new(build).then do |checksum|
unless checksum.valid?
metrics.increment_trace_operation(operation: :invalid)
+ metrics.increment_error_counter(type: :chunks_invalid_checksum)
if checksum.corrupted?
metrics.increment_trace_operation(operation: :corrupted)
+ metrics.increment_error_counter(type: :chunks_invalid_size)
end
next unless log_invalid_chunks?
diff --git a/app/services/ci/update_pending_build_service.rb b/app/services/ci/update_pending_build_service.rb
index dcba06e60bf..d546dbcfe3d 100644
--- a/app/services/ci/update_pending_build_service.rb
+++ b/app/services/ci/update_pending_build_service.rb
@@ -2,7 +2,7 @@
module Ci
class UpdatePendingBuildService
- VALID_PARAMS = %i[instance_runners_enabled].freeze
+ VALID_PARAMS = %i[instance_runners_enabled namespace_id namespace_traversal_ids].freeze
InvalidParamsError = Class.new(StandardError)
InvalidModelError = Class.new(StandardError)
diff --git a/app/services/clusters/agent_tokens/create_service.rb b/app/services/clusters/agent_tokens/create_service.rb
new file mode 100644
index 00000000000..ae2617f510b
--- /dev/null
+++ b/app/services/clusters/agent_tokens/create_service.rb
@@ -0,0 +1,31 @@
+# frozen_string_literal: true
+
+module Clusters
+ module AgentTokens
+ class CreateService < ::BaseContainerService
+ ALLOWED_PARAMS = %i[agent_id description name].freeze
+
+ def execute
+ return error_no_permissions unless current_user.can?(:create_cluster, container)
+
+ token = ::Clusters::AgentToken.new(filtered_params.merge(created_by_user: current_user))
+
+ if token.save
+ ServiceResponse.success(payload: { secret: token.token, token: token })
+ else
+ ServiceResponse.error(message: token.errors.full_messages)
+ end
+ end
+
+ private
+
+ def error_no_permissions
+ ServiceResponse.error(message: s_('ClusterAgent|User has insufficient permissions to create a token for this project'))
+ end
+
+ def filtered_params
+ params.slice(*ALLOWED_PARAMS)
+ end
+ end
+ end
+end
diff --git a/app/services/clusters/agents/create_service.rb b/app/services/clusters/agents/create_service.rb
new file mode 100644
index 00000000000..568f168d63b
--- /dev/null
+++ b/app/services/clusters/agents/create_service.rb
@@ -0,0 +1,29 @@
+# frozen_string_literal: true
+
+module Clusters
+ module Agents
+ class CreateService < BaseService
+ def execute(name:)
+ return error_no_permissions unless cluster_agent_permissions?
+
+ agent = ::Clusters::Agent.new(name: name, project: project, created_by_user: current_user)
+
+ if agent.save
+ success.merge(cluster_agent: agent)
+ else
+ error(agent.errors.full_messages)
+ end
+ end
+
+ private
+
+ def cluster_agent_permissions?
+ current_user.can?(:admin_pipeline, project) && current_user.can?(:create_cluster, project)
+ end
+
+ def error_no_permissions
+ error(s_('ClusterAgent|You have insufficient permissions to create a cluster agent for this project'))
+ end
+ end
+ end
+end
diff --git a/app/services/clusters/agents/delete_service.rb b/app/services/clusters/agents/delete_service.rb
new file mode 100644
index 00000000000..2132dffa606
--- /dev/null
+++ b/app/services/clusters/agents/delete_service.rb
@@ -0,0 +1,23 @@
+# frozen_string_literal: true
+
+module Clusters
+ module Agents
+ class DeleteService < ::BaseContainerService
+ def execute(cluster_agent)
+ return error_no_permissions unless current_user.can?(:admin_cluster, cluster_agent)
+
+ if cluster_agent.destroy
+ ServiceResponse.success
+ else
+ ServiceResponse.error(message: cluster_agent.errors.full_messages)
+ end
+ end
+
+ private
+
+ def error_no_permissions
+ ServiceResponse.error(message: s_('ClusterAgent|You have insufficient permissions to delete this cluster agent'))
+ end
+ end
+ end
+end
diff --git a/app/services/clusters/agents/refresh_authorization_service.rb b/app/services/clusters/agents/refresh_authorization_service.rb
index a9e3340dbf5..7f401eef720 100644
--- a/app/services/clusters/agents/refresh_authorization_service.rb
+++ b/app/services/clusters/agents/refresh_authorization_service.rb
@@ -99,7 +99,7 @@ module Clusters
end
def group_root_ancestor?
- root_ancestor.group?
+ root_ancestor.group_namespace?
end
end
end
diff --git a/app/services/concerns/rate_limited_service.rb b/app/services/concerns/rate_limited_service.rb
new file mode 100644
index 00000000000..87cba7814fe
--- /dev/null
+++ b/app/services/concerns/rate_limited_service.rb
@@ -0,0 +1,93 @@
+# frozen_string_literal: true
+
+module RateLimitedService
+ extend ActiveSupport::Concern
+
+ RateLimitedNotSetupError = Class.new(StandardError)
+
+ class RateLimitedError < StandardError
+ def initialize(key:, rate_limiter:)
+ @key = key
+ @rate_limiter = rate_limiter
+ end
+
+ def headers
+ # TODO: This will be fleshed out in https://gitlab.com/gitlab-org/gitlab/-/issues/342370
+ {}
+ end
+
+ def log_request(request, current_user)
+ rate_limiter.class.log_request(request, "#{key}_request_limit".to_sym, current_user)
+ end
+
+ private
+
+ attr_reader :key, :rate_limiter
+ end
+
+ class RateLimiterScopedAndKeyed
+ attr_reader :key, :opts, :rate_limiter_klass
+
+ def initialize(key:, opts:, rate_limiter_klass:)
+ @key = key
+ @opts = opts
+ @rate_limiter_klass = rate_limiter_klass
+ end
+
+ def rate_limit!(service)
+ evaluated_scope = evaluated_scope_for(service)
+ return if feature_flag_disabled?(evaluated_scope[:project])
+
+ rate_limiter = new_rate_limiter(evaluated_scope)
+ if rate_limiter.throttled?
+ raise RateLimitedError.new(key: key, rate_limiter: rate_limiter), _('This endpoint has been requested too many times. Try again later.')
+ end
+ end
+
+ private
+
+ def users_allowlist
+ @users_allowlist ||= opts[:users_allowlist] ? opts[:users_allowlist].call : []
+ end
+
+ def evaluated_scope_for(service)
+ opts[:scope].each_with_object({}) do |var, all|
+ all[var] = service.public_send(var) # rubocop: disable GitlabSecurity/PublicSend
+ end
+ end
+
+ def feature_flag_disabled?(project)
+ Feature.disabled?("rate_limited_service_#{key}", project, default_enabled: :yaml)
+ end
+
+ def new_rate_limiter(evaluated_scope)
+ rate_limiter_klass.new(key, **opts.merge(scope: evaluated_scope.values, users_allowlist: users_allowlist))
+ end
+ end
+
+ prepended do
+ attr_accessor :rate_limiter_bypassed
+ cattr_accessor :rate_limiter_scoped_and_keyed
+
+ def self.rate_limit(key:, opts:, rate_limiter_klass: ::Gitlab::ApplicationRateLimiter)
+ self.rate_limiter_scoped_and_keyed = RateLimiterScopedAndKeyed.new(key: key,
+ opts: opts,
+ rate_limiter_klass: rate_limiter_klass)
+ end
+ end
+
+ def execute_without_rate_limiting(*args, **kwargs)
+ self.rate_limiter_bypassed = true
+ execute(*args, **kwargs)
+ ensure
+ self.rate_limiter_bypassed = false
+ end
+
+ def execute(*args, **kwargs)
+ raise RateLimitedNotSetupError if rate_limiter_scoped_and_keyed.nil?
+
+ rate_limiter_scoped_and_keyed.rate_limit!(self) unless rate_limiter_bypassed
+
+ super
+ end
+end
diff --git a/app/services/container_expiration_policies/cleanup_service.rb b/app/services/container_expiration_policies/cleanup_service.rb
index cd988cdc5fe..0da5e552c48 100644
--- a/app/services/container_expiration_policies/cleanup_service.rb
+++ b/app/services/container_expiration_policies/cleanup_service.rb
@@ -4,7 +4,7 @@ module ContainerExpirationPolicies
class CleanupService
attr_reader :repository
- SERVICE_RESULT_FIELDS = %i[original_size before_truncate_size after_truncate_size before_delete_size deleted_size].freeze
+ SERVICE_RESULT_FIELDS = %i[original_size before_truncate_size after_truncate_size before_delete_size deleted_size cached_tags_count].freeze
def initialize(repository)
@repository = repository
@@ -24,8 +24,8 @@ module ContainerExpirationPolicies
begin
service_result = Projects::ContainerRepository::CleanupTagsService
- .new(project, nil, policy_params.merge('container_expiration_policy' => true))
- .execute(repository)
+ .new(repository, nil, policy_params.merge('container_expiration_policy' => true))
+ .execute
rescue StandardError
repository.cleanup_unfinished!
diff --git a/app/services/customer_relations/contacts/base_service.rb b/app/services/customer_relations/contacts/base_service.rb
new file mode 100644
index 00000000000..89f6f2c3f1f
--- /dev/null
+++ b/app/services/customer_relations/contacts/base_service.rb
@@ -0,0 +1,17 @@
+# frozen_string_literal: true
+
+module CustomerRelations
+ module Contacts
+ class BaseService < ::BaseGroupService
+ private
+
+ def allowed?
+ current_user&.can?(:admin_contact, group)
+ end
+
+ def error(message)
+ ServiceResponse.error(message: Array(message))
+ end
+ end
+ end
+end
diff --git a/app/services/customer_relations/contacts/create_service.rb b/app/services/customer_relations/contacts/create_service.rb
new file mode 100644
index 00000000000..7ff8b731e0d
--- /dev/null
+++ b/app/services/customer_relations/contacts/create_service.rb
@@ -0,0 +1,41 @@
+# frozen_string_literal: true
+
+module CustomerRelations
+ module Contacts
+ class CreateService < BaseService
+ def execute
+ return error_no_permissions unless allowed?
+ return error_organization_invalid unless organization_valid?
+
+ contact = Contact.create(params.merge(group_id: group.id))
+
+ return error_creating(contact) unless contact.persisted?
+
+ ServiceResponse.success(payload: contact)
+ end
+
+ private
+
+ def organization_valid?
+ return true unless params[:organization_id]
+
+ organization = Organization.find(params[:organization_id])
+ organization.group_id == group.id
+ rescue ActiveRecord::RecordNotFound
+ false
+ end
+
+ def error_organization_invalid
+ error('The specified organization was not found or does not belong to this group')
+ end
+
+ def error_no_permissions
+ error('You have insufficient permissions to create a contact for this group')
+ end
+
+ def error_creating(contact)
+ error(contact&.errors&.full_messages || 'Failed to create contact')
+ end
+ end
+ end
+end
diff --git a/app/services/customer_relations/contacts/update_service.rb b/app/services/customer_relations/contacts/update_service.rb
new file mode 100644
index 00000000000..473a80be262
--- /dev/null
+++ b/app/services/customer_relations/contacts/update_service.rb
@@ -0,0 +1,24 @@
+# frozen_string_literal: true
+
+module CustomerRelations
+ module Contacts
+ class UpdateService < BaseService
+ def execute(contact)
+ return error_no_permissions unless allowed?
+ return error_updating(contact) unless contact.update(params)
+
+ ServiceResponse.success(payload: contact)
+ end
+
+ private
+
+ def error_no_permissions
+ error('You have insufficient permissions to update a contact for this group')
+ end
+
+ def error_updating(contact)
+ error(contact&.errors&.full_messages || 'Failed to update contact')
+ end
+ end
+ end
+end
diff --git a/app/services/customer_relations/organizations/base_service.rb b/app/services/customer_relations/organizations/base_service.rb
index 63261534b37..8f8480d697c 100644
--- a/app/services/customer_relations/organizations/base_service.rb
+++ b/app/services/customer_relations/organizations/base_service.rb
@@ -10,7 +10,7 @@ module CustomerRelations
end
def error(message)
- ServiceResponse.error(message: message)
+ ServiceResponse.error(message: Array(message))
end
end
end
diff --git a/app/services/customer_relations/organizations/create_service.rb b/app/services/customer_relations/organizations/create_service.rb
index 9c223796eaf..aad1b7e2ca4 100644
--- a/app/services/customer_relations/organizations/create_service.rb
+++ b/app/services/customer_relations/organizations/create_service.rb
@@ -7,9 +7,7 @@ module CustomerRelations
def execute
return error_no_permissions unless allowed?
- params[:group_id] = group.id
-
- organization = Organization.create(params)
+ organization = Organization.create(params.merge(group_id: group.id))
return error_creating(organization) unless organization.persisted?
diff --git a/app/services/dependency_proxy/auth_token_service.rb b/app/services/dependency_proxy/auth_token_service.rb
index 16279ed12b0..c6c9eb534bb 100644
--- a/app/services/dependency_proxy/auth_token_service.rb
+++ b/app/services/dependency_proxy/auth_token_service.rb
@@ -12,10 +12,16 @@ module DependencyProxy
JSONWebToken::HMACToken.decode(token, ::Auth::DependencyProxyAuthenticationService.secret).first
end
- class << self
- def decoded_token_payload(token)
- self.new(token).execute
+ def self.user_or_deploy_token_from_jwt(raw_jwt)
+ token_payload = self.new(raw_jwt).execute
+
+ if token_payload['user_id']
+ User.find(token_payload['user_id'])
+ elsif token_payload['deploy_token']
+ DeployToken.active.find_by_token(token_payload['deploy_token'])
end
+ rescue JWT::DecodeError, JWT::ExpiredSignature, JWT::ImmatureSignature
+ nil
end
end
end
diff --git a/app/services/dependency_proxy/find_or_create_blob_service.rb b/app/services/dependency_proxy/find_or_create_blob_service.rb
index f3dbf31dcdb..0a6db6e3d34 100644
--- a/app/services/dependency_proxy/find_or_create_blob_service.rb
+++ b/app/services/dependency_proxy/find_or_create_blob_service.rb
@@ -12,7 +12,7 @@ module DependencyProxy
def execute
from_cache = true
file_name = @blob_sha.sub('sha256:', '') + '.gz'
- blob = @group.dependency_proxy_blobs.find_or_build(file_name)
+ blob = @group.dependency_proxy_blobs.active.find_or_build(file_name)
unless blob.persisted?
from_cache = false
@@ -30,6 +30,8 @@ module DependencyProxy
blob.save!
end
+ # Technical debt: change to read_at https://gitlab.com/gitlab-org/gitlab/-/issues/341536
+ blob.touch if from_cache
success(blob: blob, from_cache: from_cache)
end
diff --git a/app/services/dependency_proxy/find_or_create_manifest_service.rb b/app/services/dependency_proxy/find_or_create_manifest_service.rb
index 0eb990ab7f8..1976d4d47f4 100644
--- a/app/services/dependency_proxy/find_or_create_manifest_service.rb
+++ b/app/services/dependency_proxy/find_or_create_manifest_service.rb
@@ -13,11 +13,16 @@ module DependencyProxy
def execute
@manifest = @group.dependency_proxy_manifests
+ .active
.find_or_initialize_by_file_name_or_digest(file_name: @file_name, digest: @tag)
head_result = DependencyProxy::HeadManifestService.new(@image, @tag, @token).execute
- return success(manifest: @manifest, from_cache: true) if cached_manifest_matches?(head_result)
+ if cached_manifest_matches?(head_result)
+ @manifest.touch
+
+ return success(manifest: @manifest, from_cache: true)
+ end
pull_new_manifest
respond(from_cache: false)
@@ -46,6 +51,9 @@ module DependencyProxy
def respond(from_cache: true)
if @manifest.persisted?
+ # Technical debt: change to read_at https://gitlab.com/gitlab-org/gitlab/-/issues/341536
+ @manifest.touch if from_cache
+
success(manifest: @manifest, from_cache: from_cache)
else
error('Failed to download the manifest from the external registry', 503)
diff --git a/app/services/dependency_proxy/group_settings/update_service.rb b/app/services/dependency_proxy/group_settings/update_service.rb
new file mode 100644
index 00000000000..ba43452def3
--- /dev/null
+++ b/app/services/dependency_proxy/group_settings/update_service.rb
@@ -0,0 +1,37 @@
+# frozen_string_literal: true
+
+module DependencyProxy
+ module GroupSettings
+ class UpdateService < BaseContainerService
+ ALLOWED_ATTRIBUTES = %i[enabled].freeze
+
+ def execute
+ return ServiceResponse.error(message: 'Access Denied', http_status: 403) unless allowed?
+ return ServiceResponse.error(message: 'Dependency proxy setting not found', http_status: 404) unless dependency_proxy_setting
+
+ if dependency_proxy_setting.update(dependency_proxy_setting_params)
+ ServiceResponse.success(payload: { dependency_proxy_setting: dependency_proxy_setting })
+ else
+ ServiceResponse.error(
+ message: dependency_proxy_setting.errors.full_messages.to_sentence || 'Bad request',
+ http_status: 400
+ )
+ end
+ end
+
+ private
+
+ def dependency_proxy_setting
+ container.dependency_proxy_setting
+ end
+
+ def allowed?
+ Ability.allowed?(current_user, :admin_dependency_proxy, container)
+ end
+
+ def dependency_proxy_setting_params
+ params.slice(*ALLOWED_ATTRIBUTES)
+ end
+ end
+ end
+end
diff --git a/app/services/deployments/older_deployments_drop_service.rb b/app/services/deployments/older_deployments_drop_service.rb
index 100d1267848..504b55b99ac 100644
--- a/app/services/deployments/older_deployments_drop_service.rb
+++ b/app/services/deployments/older_deployments_drop_service.rb
@@ -11,23 +11,23 @@ module Deployments
def execute
return unless @deployment&.running?
- older_deployments.find_each do |older_deployment|
- Gitlab::OptimisticLocking.retry_lock(older_deployment.deployable, name: 'older_deployments_drop') do |deployable|
- deployable.drop(:forward_deployment_failure)
+ older_deployments_builds.each do |build|
+ Gitlab::OptimisticLocking.retry_lock(build, name: 'older_deployments_drop') do |build|
+ build.drop(:forward_deployment_failure)
end
rescue StandardError => e
- Gitlab::ErrorTracking.track_exception(e, subject_id: @deployment.id, deployment_id: older_deployment.id)
+ Gitlab::ErrorTracking.track_exception(e, subject_id: @deployment.id, build_id: build.id)
end
end
private
- def older_deployments
+ def older_deployments_builds
@deployment
.environment
.active_deployments
.older_than(@deployment)
- .with_deployable
+ .builds
end
end
end
diff --git a/app/services/error_tracking/list_issues_service.rb b/app/services/error_tracking/list_issues_service.rb
index 86c7791e759..1979816b88d 100644
--- a/app/services/error_tracking/list_issues_service.rb
+++ b/app/services/error_tracking/list_issues_service.rb
@@ -76,16 +76,21 @@ module ErrorTracking
filter_opts = {
status: opts[:issue_status],
sort: opts[:sort],
- limit: opts[:limit]
+ limit: opts[:limit],
+ cursor: opts[:cursor]
}
errors = ErrorTracking::ErrorsFinder.new(current_user, project, filter_opts).execute
+ pagination = {}
+ pagination[:next] = { cursor: errors.cursor_for_next_page } if errors.has_next_page?
+ pagination[:previous] = { cursor: errors.cursor_for_previous_page } if errors.has_previous_page?
+
# We use the same response format as project_error_tracking_setting
# method below for compatibility with existing code.
{
issues: errors.map(&:to_sentry_error),
- pagination: {}
+ pagination: pagination
}
else
project_error_tracking_setting.list_sentry_issues(**opts)
diff --git a/app/services/feature_flags/base_service.rb b/app/services/feature_flags/base_service.rb
index 9ae9ab4de63..ca0b6b89199 100644
--- a/app/services/feature_flags/base_service.rb
+++ b/app/services/feature_flags/base_service.rb
@@ -7,6 +7,8 @@ module FeatureFlags
AUDITABLE_ATTRIBUTES = %w(name description active).freeze
def success(**args)
+ audit_event = args.fetch(:audit_event) { audit_event(args[:feature_flag]) }
+ save_audit_event(audit_event)
sync_to_jira(args[:feature_flag])
super
end
@@ -66,5 +68,11 @@ module FeatureFlags
feature_flag_by_name.scopes.find_by_environment_scope(params[:environment_scope])
end
end
+
+ private
+
+ def audit_message(feature_flag)
+ raise NotImplementedError, "This method should be overriden by subclasses"
+ end
end
end
diff --git a/app/services/feature_flags/create_service.rb b/app/services/feature_flags/create_service.rb
index 65f8f8e33f6..ebbe71f39c7 100644
--- a/app/services/feature_flags/create_service.rb
+++ b/app/services/feature_flags/create_service.rb
@@ -10,8 +10,6 @@ module FeatureFlags
feature_flag = project.operations_feature_flags.new(params)
if feature_flag.save
- save_audit_event(audit_event(feature_flag))
-
success(feature_flag: feature_flag)
else
error(feature_flag.errors.full_messages, 400)
diff --git a/app/services/feature_flags/destroy_service.rb b/app/services/feature_flags/destroy_service.rb
index 986fe004db6..817a80940c0 100644
--- a/app/services/feature_flags/destroy_service.rb
+++ b/app/services/feature_flags/destroy_service.rb
@@ -13,8 +13,6 @@ module FeatureFlags
ApplicationRecord.transaction do
if feature_flag.destroy
- save_audit_event(audit_event(feature_flag))
-
success(feature_flag: feature_flag)
else
error(feature_flag.errors.full_messages)
diff --git a/app/services/feature_flags/hook_service.rb b/app/services/feature_flags/hook_service.rb
new file mode 100644
index 00000000000..6f77a70bd09
--- /dev/null
+++ b/app/services/feature_flags/hook_service.rb
@@ -0,0 +1,28 @@
+# frozen_string_literal: true
+
+module FeatureFlags
+ class HookService
+ HOOK_NAME = :feature_flag_hooks
+
+ def initialize(feature_flag, current_user)
+ @feature_flag = feature_flag
+ @current_user = current_user
+ end
+
+ def execute
+ project.execute_hooks(hook_data, HOOK_NAME)
+ end
+
+ private
+
+ attr_reader :feature_flag, :current_user
+
+ def project
+ @project ||= feature_flag.project
+ end
+
+ def hook_data
+ Gitlab::DataBuilder::FeatureFlag.build(feature_flag, current_user)
+ end
+ end
+end
diff --git a/app/services/feature_flags/update_service.rb b/app/services/feature_flags/update_service.rb
index ccfd1b57d44..bcfd2c15189 100644
--- a/app/services/feature_flags/update_service.rb
+++ b/app/services/feature_flags/update_service.rb
@@ -7,6 +7,11 @@ module FeatureFlags
'parameters' => 'parameters'
}.freeze
+ def success(**args)
+ execute_hooks_after_commit(args[:feature_flag])
+ super
+ end
+
def execute(feature_flag)
return error('Access Denied', 403) unless can_update?(feature_flag)
return error('Not Found', 404) unless valid_user_list_ids?(feature_flag, user_list_ids(params))
@@ -20,16 +25,11 @@ module FeatureFlags
end
end
+ # We generate the audit event before the feature flag is saved as #changed_strategies_messages depends on the strategies' states before save
audit_event = audit_event(feature_flag)
- if feature_flag.active_changed?
- feature_flag.execute_hooks(current_user)
- end
-
if feature_flag.save
- save_audit_event(audit_event)
-
- success(feature_flag: feature_flag)
+ success(feature_flag: feature_flag, audit_event: audit_event)
else
error(feature_flag.errors.full_messages, :bad_request)
end
@@ -38,6 +38,16 @@ module FeatureFlags
private
+ def execute_hooks_after_commit(feature_flag)
+ return unless feature_flag.active_previously_changed?
+
+ # The `current_user` method (defined in `BaseService`) is not available within the `run_after_commit` block
+ user = current_user
+ feature_flag.run_after_commit do
+ HookService.new(feature_flag, user).execute
+ end
+ end
+
def audit_message(feature_flag)
changes = changed_attributes_messages(feature_flag)
changes += changed_strategies_messages(feature_flag)
diff --git a/app/services/groups/transfer_service.rb b/app/services/groups/transfer_service.rb
index b7eae06b963..774f81b0a5e 100644
--- a/app/services/groups/transfer_service.rb
+++ b/app/services/groups/transfer_service.rb
@@ -29,6 +29,7 @@ module Groups
update_group_attributes
ensure_ownership
update_integrations
+ update_pending_builds!
end
post_update_hooks(@updated_project_ids)
@@ -139,6 +140,10 @@ module Groups
# these records again.
@updated_project_ids = projects_to_update.pluck(:id)
+ Namespaces::ProjectNamespace
+ .where(id: projects_to_update.select(:project_namespace_id))
+ .update_all(visibility_level: @new_parent_group.visibility_level)
+
projects_to_update
.update_all(visibility_level: @new_parent_group.visibility_level)
end
@@ -217,6 +222,15 @@ module Groups
PropagateIntegrationWorker.perform_async(integration.id)
end
end
+
+ def update_pending_builds!
+ update_params = {
+ namespace_traversal_ids: group.traversal_ids,
+ namespace_id: group.id
+ }
+
+ ::Ci::UpdatePendingBuildService.new(group, update_params).execute
+ end
end
end
diff --git a/app/services/import/validate_remote_git_endpoint_service.rb b/app/services/import/validate_remote_git_endpoint_service.rb
new file mode 100644
index 00000000000..afccb5373a9
--- /dev/null
+++ b/app/services/import/validate_remote_git_endpoint_service.rb
@@ -0,0 +1,76 @@
+# frozen_string_literal: true
+
+module Import
+ class ValidateRemoteGitEndpointService
+ # Validates if the remote endpoint is a valid GIT repository
+ # Only smart protocol is supported
+ # Validation rules are taken from https://git-scm.com/docs/http-protocol#_smart_clients
+
+ GIT_SERVICE_NAME = "git-upload-pack"
+ GIT_EXPECTED_FIRST_PACKET_LINE = "# service=#{GIT_SERVICE_NAME}"
+ GIT_BODY_MESSAGE_REGEXP = /^[0-9a-f]{4}#{GIT_EXPECTED_FIRST_PACKET_LINE}/.freeze
+ # https://github.com/git/git/blob/master/Documentation/technical/protocol-common.txt#L56-L59
+ GIT_PROTOCOL_PKT_LEN = 4
+ GIT_MINIMUM_RESPONSE_LENGTH = GIT_PROTOCOL_PKT_LEN + GIT_EXPECTED_FIRST_PACKET_LINE.length
+ EXPECTED_CONTENT_TYPE = "application/x-#{GIT_SERVICE_NAME}-advertisement"
+
+ def initialize(params)
+ @params = params
+ end
+
+ def execute
+ uri = Gitlab::Utils.parse_url(@params[:url])
+
+ return ServiceResponse.error(message: "#{@params[:url]} is not a valid URL") unless uri
+
+ uri.fragment = nil
+ url = Gitlab::Utils.append_path(uri.to_s, "/info/refs?service=#{GIT_SERVICE_NAME}")
+
+ response_body = ''
+ result = nil
+ Gitlab::HTTP.try_get(url, stream_body: true, follow_redirects: false, basic_auth: auth) do |fragment|
+ response_body += fragment
+ next if response_body.length < GIT_MINIMUM_RESPONSE_LENGTH
+
+ result = if status_code_is_valid(fragment) && content_type_is_valid(fragment) && response_body_is_valid(response_body)
+ :success
+ else
+ :error
+ end
+
+ # We are interested only in the first chunks of the response
+ # So we're using stream_body: true and breaking when receive enough body
+ break
+ end
+
+ if result == :success
+ ServiceResponse.success
+ else
+ ServiceResponse.error(message: "#{uri} is not a valid HTTP Git repository")
+ end
+ end
+
+ private
+
+ def auth
+ unless @params[:user].to_s.blank?
+ {
+ username: @params[:user],
+ password: @params[:password]
+ }
+ end
+ end
+
+ def status_code_is_valid(fragment)
+ fragment.http_response.code == '200'
+ end
+
+ def content_type_is_valid(fragment)
+ fragment.http_response['content-type'] == EXPECTED_CONTENT_TYPE
+ end
+
+ def response_body_is_valid(response_body)
+ response_body.match?(GIT_BODY_MESSAGE_REGEXP)
+ end
+ end
+end
diff --git a/app/services/issuable/import_csv/base_service.rb b/app/services/issuable/import_csv/base_service.rb
index 4a6b7540ded..4a2078a4e60 100644
--- a/app/services/issuable/import_csv/base_service.rb
+++ b/app/services/issuable/import_csv/base_service.rb
@@ -71,7 +71,14 @@ module Issuable
# NOTE: CSV imports are performed by workers, so we do not have a request context in order
# to create a SpamParams object to pass to the issuable create service.
spam_params = nil
- create_issuable_class.new(project: @project, current_user: @user, params: attributes, spam_params: spam_params).execute
+ create_service = create_issuable_class.new(project: @project, current_user: @user, params: attributes, spam_params: spam_params)
+
+ # For now, if create_issuable_class prepends RateLimitedService let's bypass rate limiting
+ if create_issuable_class < RateLimitedService
+ create_service.execute_without_rate_limiting
+ else
+ create_service.execute
+ end
end
def email_results_to_user
diff --git a/app/services/issues/clone_service.rb b/app/services/issues/clone_service.rb
index cb42334fe32..c675f957cd7 100644
--- a/app/services/issues/clone_service.rb
+++ b/app/services/issues/clone_service.rb
@@ -8,13 +8,7 @@ module Issues
@target_project = target_project
@with_notes = with_notes
- unless issue.can_clone?(current_user, target_project)
- raise CloneError, s_('CloneIssue|Cannot clone issue due to insufficient permissions!')
- end
-
- if target_project.pending_delete?
- raise CloneError, s_('CloneIssue|Cannot clone issue to target project as it is pending deletion.')
- end
+ verify_can_clone_issue!(issue, target_project)
super(issue, target_project)
@@ -30,6 +24,20 @@ module Issues
attr_reader :target_project
attr_reader :with_notes
+ def verify_can_clone_issue!(issue, target_project)
+ unless issue.supports_move_and_clone?
+ raise CloneError, s_('CloneIssue|Cannot clone issues of \'%{issue_type}\' type.') % { issue_type: issue.issue_type }
+ end
+
+ unless issue.can_clone?(current_user, target_project)
+ raise CloneError, s_('CloneIssue|Cannot clone issue due to insufficient permissions!')
+ end
+
+ if target_project.pending_delete?
+ raise CloneError, s_('CloneIssue|Cannot clone issue to target project as it is pending deletion.')
+ end
+ end
+
def update_new_entity
# we don't call `super` because we want to be able to decide whether or not to copy all comments over.
update_new_entity_description
diff --git a/app/services/issues/close_service.rb b/app/services/issues/close_service.rb
index ea64239dd99..ac846c769a3 100644
--- a/app/services/issues/close_service.rb
+++ b/app/services/issues/close_service.rb
@@ -3,8 +3,8 @@
module Issues
class CloseService < Issues::BaseService
# Closes the supplied issue if the current user is able to do so.
- def execute(issue, commit: nil, notifications: true, system_note: true)
- return issue unless can?(current_user, :update_issue, issue) || issue.is_a?(ExternalIssue)
+ def execute(issue, commit: nil, notifications: true, system_note: true, skip_authorization: false)
+ return issue unless can_close?(issue, skip_authorization: skip_authorization)
close_issue(issue,
closed_via: commit,
@@ -24,7 +24,7 @@ module Issues
return issue
end
- if project.issues_enabled? && issue.close(current_user)
+ if perform_close(issue)
event_service.close_issue(issue, current_user)
create_note(issue, closed_via) if system_note
@@ -51,6 +51,15 @@ module Issues
private
+ # Overridden on EE
+ def perform_close(issue)
+ issue.close(current_user)
+ end
+
+ def can_close?(issue, skip_authorization: false)
+ skip_authorization || can?(current_user, :update_issue, issue) || issue.is_a?(ExternalIssue)
+ end
+
def perform_incident_management_actions(issue)
resolve_alert(issue)
end
@@ -82,11 +91,11 @@ module Issues
end
end
- def store_first_mentioned_in_commit_at(issue, merge_request)
+ def store_first_mentioned_in_commit_at(issue, merge_request, max_commit_lookup: 100)
metrics = issue.metrics
return if metrics.nil? || metrics.first_mentioned_in_commit_at
- first_commit_timestamp = merge_request.commits(limit: 1).first.try(:authored_date)
+ first_commit_timestamp = merge_request.commits(limit: max_commit_lookup).last.try(:authored_date)
return unless first_commit_timestamp
metrics.update!(first_mentioned_in_commit_at: first_commit_timestamp)
diff --git a/app/services/issues/create_service.rb b/app/services/issues/create_service.rb
index b15b3e49c9a..fcedd1c1c8d 100644
--- a/app/services/issues/create_service.rb
+++ b/app/services/issues/create_service.rb
@@ -3,6 +3,10 @@
module Issues
class CreateService < Issues::BaseService
include ResolveDiscussions
+ prepend RateLimitedService
+
+ rate_limit key: :issues_create,
+ opts: { scope: [:project, :current_user], users_allowlist: -> { [User.support_bot.username] } }
# NOTE: For Issues::CreateService, we require the spam_params and do not default it to nil, because
# spam_checking is likely to be necessary. However, if there is not a request available in scope
diff --git a/app/services/issues/move_service.rb b/app/services/issues/move_service.rb
index ff78221c941..4418b4eb2bf 100644
--- a/app/services/issues/move_service.rb
+++ b/app/services/issues/move_service.rb
@@ -7,13 +7,7 @@ module Issues
def execute(issue, target_project)
@target_project = target_project
- unless issue.can_move?(current_user, @target_project)
- raise MoveError, s_('MoveIssue|Cannot move issue due to insufficient permissions!')
- end
-
- if @project == @target_project
- raise MoveError, s_('MoveIssue|Cannot move issue to project it originates from!')
- end
+ verify_can_move_issue!(issue, target_project)
super
@@ -32,6 +26,20 @@ module Issues
attr_reader :target_project
+ def verify_can_move_issue!(issue, target_project)
+ unless issue.supports_move_and_clone?
+ raise MoveError, s_('MoveIssue|Cannot move issues of \'%{issue_type}\' type.') % { issue_type: issue.issue_type }
+ end
+
+ unless issue.can_move?(current_user, @target_project)
+ raise MoveError, s_('MoveIssue|Cannot move issue due to insufficient permissions!')
+ end
+
+ if @project == @target_project
+ raise MoveError, s_('MoveIssue|Cannot move issue to project it originates from!')
+ end
+ end
+
def update_service_desk_sent_notifications
return unless original_entity.from_service_desk?
diff --git a/app/services/issues/relative_position_rebalancing_service.rb b/app/services/issues/relative_position_rebalancing_service.rb
index 7d199f99a24..23bb409f3cd 100644
--- a/app/services/issues/relative_position_rebalancing_service.rb
+++ b/app/services/issues/relative_position_rebalancing_service.rb
@@ -82,7 +82,7 @@ module Issues
collection.each do |project|
caching.cache_current_project_id(project.id)
index += 1
- scope = Issue.in_projects(project).reorder(custom_reorder).select(:id, :relative_position)
+ scope = Issue.in_projects(project).order_by_relative_position.with_non_null_relative_position.select(:id, :relative_position)
with_retry(PREFETCH_ISSUES_BATCH_SIZE, 100) do |batch_size|
Gitlab::Pagination::Keyset::Iterator.new(scope: scope).each_batch(of: batch_size) do |batch|
@@ -166,10 +166,6 @@ module Issues
@start_position ||= (RelativePositioning::START_POSITION - (gaps / 2) * gap_size).to_i
end
- def custom_reorder
- ::Gitlab::Pagination::Keyset::Order.build([Issue.column_order_relative_position, Issue.column_order_id_asc])
- end
-
def with_retry(initial_batch_size, exit_batch_size)
retries = 0
batch_size = initial_batch_size
diff --git a/app/services/issues/reopen_service.rb b/app/services/issues/reopen_service.rb
index 977b924ed72..4abd1dfbf4e 100644
--- a/app/services/issues/reopen_service.rb
+++ b/app/services/issues/reopen_service.rb
@@ -2,10 +2,10 @@
module Issues
class ReopenService < Issues::BaseService
- def execute(issue)
- return issue unless can?(current_user, :reopen_issue, issue)
+ def execute(issue, skip_authorization: false)
+ return issue unless can_reopen?(issue, skip_authorization: skip_authorization)
- if issue.reopen
+ if perform_reopen(issue)
event_service.reopen_issue(issue, current_user)
create_note(issue, 'reopened')
notification_service.async.reopen_issue(issue, current_user)
@@ -22,6 +22,15 @@ module Issues
private
+ # Overriden on EE
+ def perform_reopen(issue)
+ issue.reopen
+ end
+
+ def can_reopen?(issue, skip_authorization: false)
+ skip_authorization || can?(current_user, :reopen_issue, issue)
+ end
+
def perform_incident_management_actions(issue)
end
diff --git a/app/services/merge_requests/mergeability/check_base_service.rb b/app/services/merge_requests/mergeability/check_base_service.rb
new file mode 100644
index 00000000000..d5ddcb4b828
--- /dev/null
+++ b/app/services/merge_requests/mergeability/check_base_service.rb
@@ -0,0 +1,36 @@
+# frozen_string_literal: true
+module MergeRequests
+ module Mergeability
+ class CheckBaseService
+ attr_reader :merge_request, :params
+
+ def initialize(merge_request:, params:)
+ @merge_request = merge_request
+ @params = params
+ end
+
+ def skip?
+ raise NotImplementedError
+ end
+
+ # When this method is true, we need to implement a cache_key
+ def cacheable?
+ raise NotImplementedError
+ end
+
+ def cache_key
+ raise NotImplementedError
+ end
+
+ private
+
+ def success(*args)
+ Gitlab::MergeRequests::Mergeability::CheckResult.success(*args)
+ end
+
+ def failure(*args)
+ Gitlab::MergeRequests::Mergeability::CheckResult.failed(*args)
+ end
+ end
+ end
+end
diff --git a/app/services/merge_requests/mergeability/check_ci_status_service.rb b/app/services/merge_requests/mergeability/check_ci_status_service.rb
new file mode 100644
index 00000000000..c0ef5ba1c30
--- /dev/null
+++ b/app/services/merge_requests/mergeability/check_ci_status_service.rb
@@ -0,0 +1,22 @@
+# frozen_string_literal: true
+module MergeRequests
+ module Mergeability
+ class CheckCiStatusService < CheckBaseService
+ def execute
+ if merge_request.mergeable_ci_state?
+ success
+ else
+ failure
+ end
+ end
+
+ def skip?
+ params[:skip_ci_check].present?
+ end
+
+ def cacheable?
+ false
+ end
+ end
+ end
+end
diff --git a/app/services/merge_requests/mergeability/run_checks_service.rb b/app/services/merge_requests/mergeability/run_checks_service.rb
new file mode 100644
index 00000000000..c1d65fb65cc
--- /dev/null
+++ b/app/services/merge_requests/mergeability/run_checks_service.rb
@@ -0,0 +1,54 @@
+# frozen_string_literal: true
+module MergeRequests
+ module Mergeability
+ class RunChecksService
+ include Gitlab::Utils::StrongMemoize
+
+ # We want to have the cheapest checks first in the list,
+ # that way we can fail fast before running the more expensive ones
+ CHECKS = [
+ CheckCiStatusService
+ ].freeze
+
+ def initialize(merge_request:, params:)
+ @merge_request = merge_request
+ @params = params
+ end
+
+ def execute
+ CHECKS.each_with_object([]) do |check_class, results|
+ check = check_class.new(merge_request: merge_request, params: params)
+
+ next if check.skip?
+
+ check_result = run_check(check)
+ results << check_result
+
+ break results if check_result.failed?
+ end
+ end
+
+ private
+
+ attr_reader :merge_request, :params
+
+ def run_check(check)
+ return check.execute unless Feature.enabled?(:mergeability_caching, merge_request.project, default_enabled: :yaml)
+ return check.execute unless check.cacheable?
+
+ cached_result = results.read(merge_check: check)
+ return cached_result if cached_result.respond_to?(:status)
+
+ check.execute.tap do |result|
+ results.write(merge_check: check, result_hash: result.to_hash)
+ end
+ end
+
+ def results
+ strong_memoize(:results) do
+ Gitlab::MergeRequests::Mergeability::ResultsStore.new(merge_request: merge_request)
+ end
+ end
+ end
+ end
+end
diff --git a/app/services/merge_requests/update_service.rb b/app/services/merge_requests/update_service.rb
index af041de5596..c5395138902 100644
--- a/app/services/merge_requests/update_service.rb
+++ b/app/services/merge_requests/update_service.rb
@@ -248,7 +248,7 @@ module MergeRequests
def merge_from_quick_action(merge_request)
last_diff_sha = params.delete(:merge)
- MergeRequests::MergeOrchestrationService
+ ::MergeRequests::MergeOrchestrationService
.new(project, current_user, { sha: last_diff_sha })
.execute(merge_request)
end
diff --git a/app/services/metrics/dashboard/annotations/create_service.rb b/app/services/metrics/dashboard/annotations/create_service.rb
index 54f4e96378c..b86fa82a5e8 100644
--- a/app/services/metrics/dashboard/annotations/create_service.rb
+++ b/app/services/metrics/dashboard/annotations/create_service.rb
@@ -30,7 +30,7 @@ module Metrics
options[:environment] = environment
success(options)
else
- error(s_('Metrics::Dashboard::Annotation|You are not authorized to create annotation for selected environment'))
+ error(s_('MetricsDashboardAnnotation|You are not authorized to create annotation for selected environment'))
end
end
@@ -39,7 +39,7 @@ module Metrics
options[:cluster] = cluster
success(options)
else
- error(s_('Metrics::Dashboard::Annotation|You are not authorized to create annotation for selected cluster'))
+ error(s_('MetricsDashboardAnnotation|You are not authorized to create annotation for selected cluster'))
end
end
@@ -51,7 +51,7 @@ module Metrics
success(options)
rescue Gitlab::Template::Finders::RepoTemplateFinder::FileNotFoundError
- error(s_('Metrics::Dashboard::Annotation|Dashboard with requested path can not be found'))
+ error(s_('MetricsDashboardAnnotation|Dashboard with requested path can not be found'))
end
def create(options)
diff --git a/app/services/metrics/dashboard/annotations/delete_service.rb b/app/services/metrics/dashboard/annotations/delete_service.rb
index 3efe6924a9b..3cb22f8d3da 100644
--- a/app/services/metrics/dashboard/annotations/delete_service.rb
+++ b/app/services/metrics/dashboard/annotations/delete_service.rb
@@ -27,7 +27,7 @@ module Metrics
if Ability.allowed?(user, :delete_metrics_dashboard_annotation, annotation)
success
else
- error(s_('Metrics::Dashboard::Annotation|You are not authorized to delete this annotation'))
+ error(s_('MetricsDashboardAnnotation|You are not authorized to delete this annotation'))
end
end
@@ -35,7 +35,7 @@ module Metrics
if annotation.destroy
success
else
- error(s_('Metrics::Dashboard::Annotation|Annotation has not been deleted'))
+ error(s_('MetricsDashboardAnnotation|Annotation has not been deleted'))
end
end
end
diff --git a/app/services/metrics/users_starred_dashboards/create_service.rb b/app/services/metrics/users_starred_dashboards/create_service.rb
index 9642df87861..0d028f120d3 100644
--- a/app/services/metrics/users_starred_dashboards/create_service.rb
+++ b/app/services/metrics/users_starred_dashboards/create_service.rb
@@ -35,7 +35,7 @@ module Metrics
if Ability.allowed?(user, :create_metrics_user_starred_dashboard, project)
success(user: user, project: project)
else
- error(s_('Metrics::UsersStarredDashboards|You are not authorized to add star to this dashboard'))
+ error(s_('MetricsUsersStarredDashboards|You are not authorized to add star to this dashboard'))
end
end
@@ -44,7 +44,7 @@ module Metrics
options[:dashboard_path] = dashboard_path
success(options)
else
- error(s_('Metrics::UsersStarredDashboards|Dashboard with requested path can not be found'))
+ error(s_('MetricsUsersStarredDashboards|Dashboard with requested path can not be found'))
end
end
diff --git a/app/services/packages/composer/create_package_service.rb b/app/services/packages/composer/create_package_service.rb
index 8215a3385a4..0f5429f667e 100644
--- a/app/services/packages/composer/create_package_service.rb
+++ b/app/services/packages/composer/create_package_service.rb
@@ -17,10 +17,6 @@ module Packages
})
end
- unless Feature.enabled?(:remove_composer_v1_cache_code, project)
- ::Packages::Composer::CacheUpdateWorker.perform_async(created_package.project_id, created_package.name, nil)
- end
-
created_package
end
diff --git a/app/services/projects/after_rename_service.rb b/app/services/projects/after_rename_service.rb
index 953b386b754..a3d54bc6b58 100644
--- a/app/services/projects/after_rename_service.rb
+++ b/app/services/projects/after_rename_service.rb
@@ -12,6 +12,8 @@ module Projects
#
# Projects::AfterRenameService.new(project).execute
class AfterRenameService
+ include BaseServiceUtility
+
# @return [String] The Project being renamed.
attr_reader :project
@@ -78,7 +80,7 @@ module Projects
def execute_system_hooks
project.old_path_with_namespace = full_path_before
- SystemHooksService.new.execute_hooks_for(project, :rename)
+ system_hook_service.execute_hooks_for(project, :rename)
end
def update_repository_configuration
@@ -110,7 +112,7 @@ module Projects
end
def log_completion
- Gitlab::AppLogger.info(
+ log_info(
"Project #{project.id} has been renamed from " \
"#{full_path_before} to #{full_path_after}"
)
@@ -140,7 +142,7 @@ module Projects
def rename_failed!
error = "Repository #{full_path_before} could not be renamed to #{full_path_after}"
- Gitlab::AppLogger.error(error)
+ log_error(error)
raise RenameFailedError, error
end
diff --git a/app/services/projects/container_repository/cache_tags_created_at_service.rb b/app/services/projects/container_repository/cache_tags_created_at_service.rb
new file mode 100644
index 00000000000..3a5346d7a23
--- /dev/null
+++ b/app/services/projects/container_repository/cache_tags_created_at_service.rb
@@ -0,0 +1,70 @@
+# frozen_string_literal: true
+
+module Projects
+ module ContainerRepository
+ class CacheTagsCreatedAtService
+ def initialize(container_repository)
+ @container_repository = container_repository
+ @cached_tag_names = Set.new
+ end
+
+ def populate(tags)
+ return if tags.empty?
+
+ # This will load all tags in one Redis roundtrip
+ # the maximum number of tags is configurable and is set to 200 by default.
+ # https://gitlab.com/gitlab-org/gitlab/blob/master/doc/user/packages/container_registry/index.md#set-cleanup-limits-to-conserve-resources
+ keys = tags.map(&method(:cache_key))
+ cached_tags_count = 0
+
+ ::Gitlab::Redis::Cache.with do |redis|
+ tags.zip(redis.mget(keys)).each do |tag, created_at|
+ next unless created_at
+
+ tag.created_at = DateTime.rfc3339(created_at)
+ @cached_tag_names << tag.name
+ cached_tags_count += 1
+ end
+ end
+
+ cached_tags_count
+ end
+
+ def insert(tags, max_ttl_in_seconds)
+ return unless max_ttl_in_seconds
+ return if tags.empty?
+
+ # tags with nil created_at are not cacheable
+ # tags already cached don't need to be cached again
+ cacheable_tags = tags.select do |tag|
+ tag.created_at.present? && !tag.name.in?(@cached_tag_names)
+ end
+
+ return if cacheable_tags.empty?
+
+ now = Time.zone.now
+
+ ::Gitlab::Redis::Cache.with do |redis|
+ # we use a pipeline instead of a MSET because each tag has
+ # a specific ttl
+ redis.pipelined do
+ cacheable_tags.each do |tag|
+ created_at = tag.created_at
+ # ttl is the max_ttl_in_seconds reduced by the number
+ # of seconds that the tag has already existed
+ ttl = max_ttl_in_seconds - (now - created_at).seconds
+ ttl = ttl.to_i
+ redis.set(cache_key(tag), created_at.rfc3339, ex: ttl) if ttl > 0
+ end
+ end
+ end
+ end
+
+ private
+
+ def cache_key(tag)
+ "container_repository:{#{@container_repository.id}}:tag:#{tag.name}:created_at"
+ end
+ end
+ end
+end
diff --git a/app/services/projects/container_repository/cleanup_tags_service.rb b/app/services/projects/container_repository/cleanup_tags_service.rb
index 793d2fec033..3a60de0f1ee 100644
--- a/app/services/projects/container_repository/cleanup_tags_service.rb
+++ b/app/services/projects/container_repository/cleanup_tags_service.rb
@@ -2,116 +2,152 @@
module Projects
module ContainerRepository
- class CleanupTagsService < BaseService
- def execute(container_repository)
+ class CleanupTagsService
+ include BaseServiceUtility
+ include ::Gitlab::Utils::StrongMemoize
+
+ def initialize(container_repository, user = nil, params = {})
+ @container_repository = container_repository
+ @current_user = user
+ @params = params.dup
+
+ @project = container_repository.project
+ @tags = container_repository.tags
+ tags_size = @tags.size
+ @counts = {
+ original_size: tags_size,
+ cached_tags_count: 0
+ }
+ end
+
+ def execute
return error('access denied') unless can_destroy?
return error('invalid regex') unless valid_regex?
- tags = container_repository.tags
- original_size = tags.size
+ filter_out_latest
+ filter_by_name
- tags = without_latest(tags)
- tags = filter_by_name(tags)
+ truncate
+ populate_from_cache
- before_truncate_size = tags.size
- tags = truncate(tags)
- after_truncate_size = tags.size
+ filter_keep_n
+ filter_by_older_than
- tags = filter_keep_n(tags)
- tags = filter_by_older_than(tags)
-
- delete_tags(container_repository, tags).tap do |result|
- result[:original_size] = original_size
- result[:before_truncate_size] = before_truncate_size
- result[:after_truncate_size] = after_truncate_size
- result[:before_delete_size] = tags.size
+ delete_tags.merge(@counts).tap do |result|
+ result[:before_delete_size] = @tags.size
result[:deleted_size] = result[:deleted]&.size
- result[:status] = :error if before_truncate_size != after_truncate_size
+ result[:status] = :error if @counts[:before_truncate_size] != @counts[:after_truncate_size]
end
end
private
- def delete_tags(container_repository, tags)
- return success(deleted: []) unless tags.any?
-
- tag_names = tags.map(&:name)
+ def delete_tags
+ return success(deleted: []) unless @tags.any?
service = Projects::ContainerRepository::DeleteTagsService.new(
- container_repository.project,
- current_user,
- tags: tag_names,
- container_expiration_policy: params['container_expiration_policy']
+ @project,
+ @current_user,
+ tags: @tags.map(&:name),
+ container_expiration_policy: container_expiration_policy
)
- service.execute(container_repository)
+ service.execute(@container_repository)
end
- def without_latest(tags)
- tags.reject(&:latest?)
+ def filter_out_latest
+ @tags.reject!(&:latest?)
end
- def order_by_date(tags)
+ def order_by_date
now = DateTime.current
- tags.sort_by { |tag| tag.created_at || now }.reverse
+ @tags.sort_by! { |tag| tag.created_at || now }
+ .reverse!
end
- def filter_by_name(tags)
- regex_delete = ::Gitlab::UntrustedRegexp.new("\\A#{params['name_regex_delete'] || params['name_regex']}\\z")
- regex_retain = ::Gitlab::UntrustedRegexp.new("\\A#{params['name_regex_keep']}\\z")
+ def filter_by_name
+ regex_delete = ::Gitlab::UntrustedRegexp.new("\\A#{name_regex_delete || name_regex}\\z")
+ regex_retain = ::Gitlab::UntrustedRegexp.new("\\A#{name_regex_keep}\\z")
- tags.select do |tag|
+ @tags.select! do |tag|
# regex_retain will override any overlapping matches by regex_delete
regex_delete.match?(tag.name) && !regex_retain.match?(tag.name)
end
end
- def filter_keep_n(tags)
- return tags unless params['keep_n']
+ def filter_keep_n
+ return unless keep_n
- tags = order_by_date(tags)
- tags.drop(keep_n)
+ order_by_date
+ cache_tags(@tags.first(keep_n_as_integer))
+ @tags = @tags.drop(keep_n_as_integer)
end
- def filter_by_older_than(tags)
- return tags unless params['older_than']
+ def filter_by_older_than
+ return unless older_than
- older_than = ChronicDuration.parse(params['older_than']).seconds.ago
+ older_than_timestamp = older_than_in_seconds.ago
- tags.select do |tag|
- tag.created_at && tag.created_at < older_than
+ @tags, tags_to_keep = @tags.partition do |tag|
+ tag.created_at && tag.created_at < older_than_timestamp
end
+
+ cache_tags(tags_to_keep)
end
def can_destroy?
- return true if params['container_expiration_policy']
+ return true if container_expiration_policy
- can?(current_user, :destroy_container_image, project)
+ can?(@current_user, :destroy_container_image, @project)
end
def valid_regex?
%w(name_regex_delete name_regex name_regex_keep).each do |param_name|
- regex = params[param_name]
+ regex = @params[param_name]
::Gitlab::UntrustedRegexp.new(regex) unless regex.blank?
end
true
rescue RegexpError => e
- ::Gitlab::ErrorTracking.log_exception(e, project_id: project.id)
+ ::Gitlab::ErrorTracking.log_exception(e, project_id: @project.id)
false
end
- def truncate(tags)
- return tags unless throttling_enabled?
- return tags if max_list_size == 0
+ def truncate
+ @counts[:before_truncate_size] = @tags.size
+ @counts[:after_truncate_size] = @tags.size
+
+ return unless throttling_enabled?
+ return if max_list_size == 0
# truncate the list to make sure that after the #filter_keep_n
# execution, the resulting list will be max_list_size
- truncated_size = max_list_size + keep_n
+ truncated_size = max_list_size + keep_n_as_integer
- return tags if tags.size <= truncated_size
+ return if @tags.size <= truncated_size
+
+ @tags = @tags.sample(truncated_size)
+ @counts[:after_truncate_size] = @tags.size
+ end
+
+ def populate_from_cache
+ @counts[:cached_tags_count] = cache.populate(@tags) if caching_enabled?
+ end
+
+ def cache_tags(tags)
+ cache.insert(tags, older_than_in_seconds) if caching_enabled?
+ end
+
+ def cache
+ strong_memoize(:cache) do
+ ::Projects::ContainerRepository::CacheTagsCreatedAtService.new(@container_repository)
+ end
+ end
- tags.sample(truncated_size)
+ def caching_enabled?
+ container_expiration_policy &&
+ older_than.present? &&
+ Feature.enabled?(:container_registry_expiration_policies_caching, @project)
end
def throttling_enabled?
@@ -123,7 +159,37 @@ module Projects
end
def keep_n
- params['keep_n'].to_i
+ @params['keep_n']
+ end
+
+ def keep_n_as_integer
+ keep_n.to_i
+ end
+
+ def older_than_in_seconds
+ strong_memoize(:older_than_in_seconds) do
+ ChronicDuration.parse(older_than).seconds
+ end
+ end
+
+ def older_than
+ @params['older_than']
+ end
+
+ def name_regex_delete
+ @params['name_regex_delete']
+ end
+
+ def name_regex
+ @params['name_regex']
+ end
+
+ def name_regex_keep
+ @params['name_regex_keep']
+ end
+
+ def container_expiration_policy
+ @params['container_expiration_policy']
end
end
end
diff --git a/app/services/projects/create_service.rb b/app/services/projects/create_service.rb
index e717491b19d..1536f0a22b8 100644
--- a/app/services/projects/create_service.rb
+++ b/app/services/projects/create_service.rb
@@ -8,6 +8,7 @@ module Projects
@current_user = user
@params = params.dup
@skip_wiki = @params.delete(:skip_wiki)
+ @initialize_with_sast = Gitlab::Utils.to_boolean(@params.delete(:initialize_with_sast))
@initialize_with_readme = Gitlab::Utils.to_boolean(@params.delete(:initialize_with_readme))
@import_data = @params.delete(:import_data)
@relations_block = @params.delete(:relations_block)
@@ -118,6 +119,7 @@ module Projects
Projects::PostCreationWorker.perform_async(@project.id)
create_readme if @initialize_with_readme
+ create_sast_commit if @initialize_with_sast
end
# Add an authorization for the current user authorizations inline
@@ -160,6 +162,10 @@ module Projects
Files::CreateService.new(@project, current_user, commit_attrs).execute
end
+ def create_sast_commit
+ ::Security::CiConfiguration::SastCreateService.new(@project, current_user, {}, commit_on_default: true).execute
+ end
+
def readme_content
@readme_template.presence || experiment(:new_project_readme_content, namespace: @project.namespace).run_with(@project)
end
diff --git a/app/services/projects/destroy_service.rb b/app/services/projects/destroy_service.rb
index afa8de04fca..27f813f4661 100644
--- a/app/services/projects/destroy_service.rb
+++ b/app/services/projects/destroy_service.rb
@@ -5,6 +5,7 @@ module Projects
include Gitlab::ShellAdapter
DestroyError = Class.new(StandardError)
+ BATCH_SIZE = 100
def async_execute
project.update_attribute(:pending_delete, true)
@@ -119,6 +120,12 @@ module Projects
destroy_web_hooks!
destroy_project_bots!
+ if ::Feature.enabled?(:ci_optimize_project_records_destruction, project, default_enabled: :yaml) &&
+ Feature.enabled?(:abort_deleted_project_pipelines, default_enabled: :yaml)
+
+ destroy_ci_records!
+ end
+
# Rails attempts to load all related records into memory before
# destroying: https://github.com/rails/rails/issues/22510
# This ensures we delete records in batches.
@@ -133,6 +140,23 @@ module Projects
log_info("Attempting to destroy #{project.full_path} (#{project.id})")
end
+ def destroy_ci_records!
+ project.all_pipelines.find_each(batch_size: BATCH_SIZE) do |pipeline| # rubocop: disable CodeReuse/ActiveRecord
+ # Destroy artifacts, then builds, then pipelines
+ # All builds have already been dropped by Ci::AbortPipelinesService,
+ # so no Ci::Build-instantiating cancellations happen here.
+ # https://gitlab.com/gitlab-org/gitlab/-/merge_requests/71342#note_691523196
+
+ ::Ci::DestroyPipelineService.new(project, current_user).execute(pipeline)
+ end
+
+ deleted_count = project.commit_statuses.delete_all
+
+ if deleted_count > 0
+ Gitlab::AppLogger.info "Projects::DestroyService - Project #{project.id} - #{deleted_count} leftover commit statuses"
+ end
+ end
+
# The project can have multiple webhooks with hundreds of thousands of web_hook_logs.
# By default, they are removed with "DELETE CASCADE" option defined via foreign_key.
# But such queries can exceed the statement_timeout limit and fail to delete the project.
diff --git a/app/services/projects/group_links/update_service.rb b/app/services/projects/group_links/update_service.rb
index 475ab17f1a1..a836b96cac3 100644
--- a/app/services/projects/group_links/update_service.rb
+++ b/app/services/projects/group_links/update_service.rb
@@ -20,19 +20,15 @@ module Projects
attr_reader :group_link
def refresh_authorizations
- if Feature.enabled?(:specialized_worker_for_project_share_update_auth_recalculation)
- AuthorizedProjectUpdate::ProjectRecalculateWorker.perform_async(project.id)
-
- # Until we compare the inconsistency rates of the new specialized worker and
- # the old approach, we still run AuthorizedProjectsWorker
- # but with some delay and lower urgency as a safety net.
- group_link.group.refresh_members_authorized_projects(
- blocking: false,
- priority: UserProjectAccessChangedService::LOW_PRIORITY
- )
- else
- group_link.group.refresh_members_authorized_projects
- end
+ AuthorizedProjectUpdate::ProjectRecalculateWorker.perform_async(project.id)
+
+ # Until we compare the inconsistency rates of the new specialized worker and
+ # the old approach, we still run AuthorizedProjectsWorker
+ # but with some delay and lower urgency as a safety net.
+ group_link.group.refresh_members_authorized_projects(
+ blocking: false,
+ priority: UserProjectAccessChangedService::LOW_PRIORITY
+ )
end
def requires_authorization_refresh?(params)
diff --git a/app/services/projects/import_service.rb b/app/services/projects/import_service.rb
index b5288aad6f0..4979af6dfe1 100644
--- a/app/services/projects/import_service.rb
+++ b/app/services/projects/import_service.rb
@@ -16,6 +16,8 @@ module Projects
end
def execute
+ track_start_import
+
add_repository_to_project
download_lfs_objects
@@ -25,16 +27,17 @@ module Projects
after_execute_hook
success
- rescue Gitlab::UrlBlocker::BlockedUrlError => e
- Gitlab::ErrorTracking.track_exception(e, project_path: project.full_path, importer: project.import_type)
+ rescue Gitlab::UrlBlocker::BlockedUrlError, StandardError => e
+ Gitlab::Import::ImportFailureService.track(
+ project_id: project.id,
+ error_source: self.class.name,
+ exception: e,
+ metrics: true
+ )
- error(s_("ImportProjects|Error importing repository %{project_safe_import_url} into %{project_full_path} - %{message}") % { project_safe_import_url: project.safe_import_url, project_full_path: project.full_path, message: e.message })
- rescue StandardError => e
message = Projects::ImportErrorFilter.filter_message(e.message)
-
- Gitlab::ErrorTracking.track_exception(e, project_path: project.full_path, importer: project.import_type)
-
- error(s_("ImportProjects|Error importing repository %{project_safe_import_url} into %{project_full_path} - %{message}") % { project_safe_import_url: project.safe_import_url, project_full_path: project.full_path, message: message })
+ error(s_("ImportProjects|Error importing repository %{project_safe_import_url} into %{project_full_path} - %{message}") %
+ { project_safe_import_url: project.safe_import_url, project_full_path: project.full_path, message: message })
end
protected
@@ -54,6 +57,10 @@ module Projects
# Defined in EE::Projects::ImportService
end
+ def track_start_import
+ has_importer? && importer_class.try(:track_start_import, project)
+ end
+
def add_repository_to_project
if project.external_import? && !unknown_url?
begin
diff --git a/app/services/projects/overwrite_project_service.rb b/app/services/projects/overwrite_project_service.rb
index f35370c427f..2612001eb95 100644
--- a/app/services/projects/overwrite_project_service.rb
+++ b/app/services/projects/overwrite_project_service.rb
@@ -3,7 +3,7 @@
module Projects
class OverwriteProjectService < BaseService
def execute(source_project)
- return unless source_project && source_project.namespace == @project.namespace
+ return unless source_project && source_project.namespace_id == @project.namespace_id
start_time = ::Gitlab::Metrics::System.monotonic_time
@@ -40,7 +40,7 @@ module Projects
duration = ::Gitlab::Metrics::System.monotonic_time - start_time
Gitlab::AppJsonLogger.info(class: self.class.name,
- namespace_id: source_project.namespace.id,
+ namespace_id: source_project.namespace_id,
project_id: source_project.id,
duration_s: duration.to_f,
error: exception.class.name)
diff --git a/app/services/projects/participants_service.rb b/app/services/projects/participants_service.rb
index 228115d72b8..1616a8a4062 100644
--- a/app/services/projects/participants_service.rb
+++ b/app/services/projects/participants_service.rb
@@ -36,14 +36,17 @@ module Projects
private
def project_members_through_invited_groups
- groups_with_ancestors_ids = Gitlab::ObjectHierarchy
- .new(visible_groups)
- .base_and_ancestors
- .pluck_primary_key
+ groups_with_ancestors = if ::Feature.enabled?(:linear_participants_service_ancestor_scopes, current_user, default_enabled: :yaml)
+ visible_groups.self_and_ancestors
+ else
+ Gitlab::ObjectHierarchy
+ .new(visible_groups)
+ .base_and_ancestors
+ end
GroupMember
.active_without_invites_and_requests
- .with_source_id(groups_with_ancestors_ids)
+ .with_source_id(groups_with_ancestors.pluck_primary_key)
end
def visible_groups
diff --git a/app/services/projects/transfer_service.rb b/app/services/projects/transfer_service.rb
index 27376173f07..a69e6488ebc 100644
--- a/app/services/projects/transfer_service.rb
+++ b/app/services/projects/transfer_service.rb
@@ -81,7 +81,7 @@ module Projects
# Apply changes to the project
update_namespace_and_visibility(@new_namespace)
- update_shared_runners_settings
+ project.reconcile_shared_runners_setting!
project.save!
# Notifications
@@ -104,6 +104,8 @@ module Projects
update_repository_configuration(@new_path)
execute_system_hooks
+
+ update_pending_builds!
end
post_update_hooks(project)
@@ -154,19 +156,15 @@ module Projects
user_ids = @old_namespace.user_ids_for_project_authorizations |
@new_namespace.user_ids_for_project_authorizations
- if Feature.enabled?(:specialized_worker_for_project_transfer_auth_recalculation)
- AuthorizedProjectUpdate::ProjectRecalculateWorker.perform_async(project.id)
-
- # Until we compare the inconsistency rates of the new specialized worker and
- # the old approach, we still run AuthorizedProjectsWorker
- # but with some delay and lower urgency as a safety net.
- UserProjectAccessChangedService.new(user_ids).execute(
- blocking: false,
- priority: UserProjectAccessChangedService::LOW_PRIORITY
- )
- else
- UserProjectAccessChangedService.new(user_ids).execute
- end
+ AuthorizedProjectUpdate::ProjectRecalculateWorker.perform_async(project.id)
+
+ # Until we compare the inconsistency rates of the new specialized worker and
+ # the old approach, we still run AuthorizedProjectsWorker
+ # but with some delay and lower urgency as a safety net.
+ UserProjectAccessChangedService.new(user_ids).execute(
+ blocking: false,
+ priority: UserProjectAccessChangedService::LOW_PRIORITY
+ )
end
def rollback_side_effects
@@ -189,7 +187,7 @@ module Projects
end
def execute_system_hooks
- SystemHooksService.new.execute_hooks_for(project, :transfer)
+ system_hook_service.execute_hooks_for(project, :transfer)
end
def move_project_folders(project)
@@ -241,18 +239,19 @@ module Projects
"#{new_path}#{::Gitlab::GlRepository::DESIGN.path_suffix}"
end
- def update_shared_runners_settings
- # If a project is being transferred to another group it means it can already
- # have shared runners enabled but we need to check whether the new group allows that.
- if project.group && project.group.shared_runners_setting == 'disabled_and_unoverridable'
- project.shared_runners_enabled = false
- end
- end
-
def update_integrations
project.integrations.with_default_settings.delete_all
Integration.create_from_active_default_integrations(project, :project_id)
end
+
+ def update_pending_builds!
+ update_params = {
+ namespace_id: new_namespace.id,
+ namespace_traversal_ids: new_namespace.traversal_ids
+ }
+
+ ::Ci::UpdatePendingBuildService.new(project, update_params).execute
+ end
end
end
diff --git a/app/services/projects/update_pages_service.rb b/app/services/projects/update_pages_service.rb
index dc75fe1014a..0000e713cb4 100644
--- a/app/services/projects/update_pages_service.rb
+++ b/app/services/projects/update_pages_service.rb
@@ -136,13 +136,11 @@ module Projects
def validate_outdated_sha!
return if latest?
- if Feature.enabled?(:pages_smart_check_outdated_sha, project, default_enabled: :yaml)
- # use pipeline_id in case the build is retried
- last_deployed_pipeline_id = project.pages_metadatum&.pages_deployment&.ci_build&.pipeline_id
+ # use pipeline_id in case the build is retried
+ last_deployed_pipeline_id = project.pages_metadatum&.pages_deployment&.ci_build&.pipeline_id
- return unless last_deployed_pipeline_id
- return if last_deployed_pipeline_id <= build.pipeline_id
- end
+ return unless last_deployed_pipeline_id
+ return if last_deployed_pipeline_id <= build.pipeline_id
raise InvalidStateError, 'build SHA is outdated for this ref'
end
diff --git a/app/services/projects/update_service.rb b/app/services/projects/update_service.rb
index b87564fcaef..a32e80af4b1 100644
--- a/app/services/projects/update_service.rb
+++ b/app/services/projects/update_service.rb
@@ -105,7 +105,7 @@ module Projects
end
update_pages_config if changing_pages_related_config?
- update_pending_builds if shared_runners_toggled?
+ update_pending_builds if runners_settings_toggled?
end
def after_rename_service(project)
@@ -181,13 +181,36 @@ module Projects
end
def update_pending_builds
- update_params = { instance_runners_enabled: project.shared_runners_enabled }
+ update_params = {
+ instance_runners_enabled: project.shared_runners_enabled?,
+ namespace_traversal_ids: group_runner_traversal_ids
+ }
- ::Ci::UpdatePendingBuildService.new(project, update_params).execute
+ ::Ci::UpdatePendingBuildService
+ .new(project, update_params)
+ .execute
end
- def shared_runners_toggled?
- project.previous_changes.include?('shared_runners_enabled')
+ def shared_runners_settings_toggled?
+ project.previous_changes.include?(:shared_runners_enabled)
+ end
+
+ def group_runners_settings_toggled?
+ return false unless project.ci_cd_settings.present?
+
+ project.ci_cd_settings.previous_changes.include?(:group_runners_enabled)
+ end
+
+ def runners_settings_toggled?
+ shared_runners_settings_toggled? || group_runners_settings_toggled?
+ end
+
+ def group_runner_traversal_ids
+ if project.group_runners_enabled?
+ project.namespace.traversal_ids
+ else
+ []
+ end
end
end
end
diff --git a/app/services/search/global_service.rb b/app/services/search/global_service.rb
index 33faf2d6698..cee59360b4b 100644
--- a/app/services/search/global_service.rb
+++ b/app/services/search/global_service.rb
@@ -24,7 +24,7 @@ module Search
# rubocop: disable CodeReuse/ActiveRecord
def projects
- @projects ||= ProjectsFinder.new(params: { non_archived: true }, current_user: current_user).execute.preload(:topics, :taggings)
+ @projects ||= ProjectsFinder.new(params: { non_archived: true }, current_user: current_user).execute.preload(:topics, :project_topics)
end
def allowed_scopes
diff --git a/app/services/security/ci_configuration/base_create_service.rb b/app/services/security/ci_configuration/base_create_service.rb
index adb45244adb..ea77cd98ba3 100644
--- a/app/services/security/ci_configuration/base_create_service.rb
+++ b/app/services/security/ci_configuration/base_create_service.rb
@@ -25,7 +25,7 @@ module Security
rescue Gitlab::Git::PreReceiveError => e
ServiceResponse.error(message: e.message)
rescue StandardError
- project.repository.rm_branch(current_user, branch_name) if project.repository.branch_exists?(branch_name)
+ remove_branch_on_exception
raise
end
@@ -50,6 +50,10 @@ module Security
Gitlab::Routing.url_helpers.project_new_merge_request_url(project, merge_request: merge_request_params)
end
+ def remove_branch_on_exception
+ project.repository.rm_branch(current_user, branch_name) if project.repository.branch_exists?(branch_name)
+ end
+
def track_event(attributes_for_commit)
action = attributes_for_commit[:actions].first
diff --git a/app/services/security/ci_configuration/sast_create_service.rb b/app/services/security/ci_configuration/sast_create_service.rb
index f495cac18f8..47e01847b17 100644
--- a/app/services/security/ci_configuration/sast_create_service.rb
+++ b/app/services/security/ci_configuration/sast_create_service.rb
@@ -5,15 +5,28 @@ module Security
class SastCreateService < ::Security::CiConfiguration::BaseCreateService
attr_reader :params
- def initialize(project, current_user, params)
+ def initialize(project, current_user, params, commit_on_default: false)
super(project, current_user)
@params = params
+
+ @commit_on_default = commit_on_default
+ @branch_name = project.default_branch if @commit_on_default
end
private
+ def remove_branch_on_exception
+ super unless @commit_on_default
+ end
+
def action
- Security::CiConfiguration::SastBuildAction.new(project.auto_devops_enabled?, params, existing_gitlab_ci_content).generate
+ 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).generate
end
def next_branch
diff --git a/app/services/service_ping/submit_service.rb b/app/services/service_ping/submit_service.rb
index 3417ce4f583..63e01603d47 100644
--- a/app/services/service_ping/submit_service.rb
+++ b/app/services/service_ping/submit_service.rb
@@ -78,7 +78,7 @@ module ServicePing
def store_metrics(response)
metrics = response['conv_index'] || response['dev_ops_score'] # leaving dev_ops_score here, as the response data comes from the gitlab-version-com
- return unless metrics.present?
+ return unless metrics.except('usage_data_id').present?
DevOpsReport::Metric.create!(
metrics.slice(*METRICS)
diff --git a/app/services/terraform/remote_state_handler.rb b/app/services/terraform/remote_state_handler.rb
index e9a13cee764..f13477b8b34 100644
--- a/app/services/terraform/remote_state_handler.rb
+++ b/app/services/terraform/remote_state_handler.rb
@@ -2,8 +2,6 @@
module Terraform
class RemoteStateHandler < BaseService
- include Gitlab::OptimisticLocking
-
StateLockedError = Class.new(StandardError)
UnauthorizedError = Class.new(StandardError)
@@ -60,7 +58,7 @@ module Terraform
private
def retrieve_with_lock(find_only: false)
- create_or_find!(find_only: find_only).tap { |state| retry_optimistic_lock(state, name: 'terraform_remote_state_handler_retrieve') { |state| yield state } }
+ create_or_find!(find_only: find_only).tap { |state| state.with_lock { yield state } }
end
def create_or_find!(find_only:)
diff --git a/app/services/user_project_access_changed_service.rb b/app/services/user_project_access_changed_service.rb
index 5f48f410bf7..5bba986f4ad 100644
--- a/app/services/user_project_access_changed_service.rb
+++ b/app/services/user_project_access_changed_service.rb
@@ -30,7 +30,7 @@ class UserProjectAccessChangedService
end
end
- ::Gitlab::Database::LoadBalancing::Sticking.bulk_stick(:user, @user_ids)
+ ::User.sticking.bulk_stick(:user, @user_ids)
result
end
diff --git a/app/services/users/update_service.rb b/app/services/users/update_service.rb
index 23c67231a29..c3df9b153a1 100644
--- a/app/services/users/update_service.rb
+++ b/app/services/users/update_service.rb
@@ -5,15 +5,18 @@ module Users
include NewUserNotifier
attr_reader :user, :identity_params
+ ATTRS_REQUIRING_PASSWORD_CHECK = %w[email].freeze
+
def initialize(current_user, params = {})
@current_user = current_user
+ @validation_password = params.delete(:validation_password)
@user = params.delete(:user)
@status_params = params.delete(:status)
@identity_params = params.slice(*identity_attributes)
@params = params.dup
end
- def execute(validate: true, &block)
+ def execute(validate: true, check_password: false, &block)
yield(@user) if block_given?
user_exists = @user.persisted?
@@ -21,6 +24,11 @@ module Users
discard_read_only_attributes
assign_attributes
+
+ if check_password && require_password_check? && !@user.valid_password?(@validation_password)
+ return error(s_("Profiles|Invalid password"))
+ end
+
assign_identity
build_canonical_email
@@ -32,8 +40,8 @@ module Users
end
end
- def execute!(*args, &block)
- result = execute(*args, &block)
+ def execute!(*args, **kargs, &block)
+ result = execute(*args, **kargs, &block)
raise ActiveRecord::RecordInvalid, @user unless result[:status] == :success
@@ -42,6 +50,14 @@ module Users
private
+ def require_password_check?
+ return false unless @user.persisted?
+ return false if @user.password_automatically_set?
+
+ changes = @user.changed
+ ATTRS_REQUIRING_PASSWORD_CHECK.any? { |param| changes.include?(param) }
+ end
+
def build_canonical_email
return unless @user.email_changed?
diff --git a/app/services/users/upsert_credit_card_validation_service.rb b/app/services/users/upsert_credit_card_validation_service.rb
index 70a96b3ec6b..86b5b923418 100644
--- a/app/services/users/upsert_credit_card_validation_service.rb
+++ b/app/services/users/upsert_credit_card_validation_service.rb
@@ -7,6 +7,14 @@ module Users
end
def execute
+ @params = {
+ user_id: params.fetch(:user_id),
+ credit_card_validated_at: params.fetch(:credit_card_validated_at),
+ expiration_date: get_expiration_date(params),
+ last_digits: Integer(params.fetch(:credit_card_mask_number), 10),
+ holder_name: params.fetch(:credit_card_holder_name)
+ }
+
::Users::CreditCardValidation.upsert(@params)
ServiceResponse.success(message: 'CreditCardValidation was set')
@@ -16,5 +24,14 @@ module Users
Gitlab::ErrorTracking.track_exception(e, params: @params, class: self.class.to_s)
ServiceResponse.error(message: "Could not set CreditCardValidation: #{e.message}")
end
+
+ private
+
+ def get_expiration_date(params)
+ year = params.fetch(:credit_card_expiration_year)
+ month = params.fetch(:credit_card_expiration_month)
+
+ Date.new(year, month, -1) # last day of the month
+ end
end
end
diff --git a/app/uploaders/dependency_proxy/file_uploader.rb b/app/uploaders/dependency_proxy/file_uploader.rb
index 5154f180454..f0222d4cf06 100644
--- a/app/uploaders/dependency_proxy/file_uploader.rb
+++ b/app/uploaders/dependency_proxy/file_uploader.rb
@@ -1,6 +1,7 @@
# frozen_string_literal: true
class DependencyProxy::FileUploader < GitlabUploader
+ extend Workhorse::UploadPath
include ObjectStorage::Concern
before :cache, :set_content_type
diff --git a/app/views/admin/application_settings/_abuse.html.haml b/app/views/admin/application_settings/_abuse.html.haml
index fab3ce584f0..96fb848b568 100644
--- a/app/views/admin/application_settings/_abuse.html.haml
+++ b/app/views/admin/application_settings/_abuse.html.haml
@@ -5,7 +5,5 @@
.form-group
= f.label :abuse_notification_email, _('Abuse reports notification email'), class: 'label-bold'
= f.text_field :abuse_notification_email, class: 'form-control gl-form-input'
- .form-text.text-muted
- = _('Abuse reports will be sent to this address if it is set. Abuse reports are always available in the admin area.')
= f.submit _('Save changes'), class: "gl-button btn btn-confirm"
diff --git a/app/views/admin/application_settings/_account_and_limit.html.haml b/app/views/admin/application_settings/_account_and_limit.html.haml
index eb30efabb98..19c38d7be62 100644
--- a/app/views/admin/application_settings/_account_and_limit.html.haml
+++ b/app/views/admin/application_settings/_account_and_limit.html.haml
@@ -23,11 +23,11 @@
.form-group
= f.label :max_import_size, _('Maximum import size (MB)'), class: 'label-light'
= f.number_field :max_import_size, class: 'form-control gl-form-input qa-receive-max-import-size-field', title: _('Maximum size of import files.'), data: { toggle: 'tooltip', container: 'body' }
- %span.form-text.text-muted= _('0 for unlimited, only effective with remote storage enabled.')
+ %span.form-text.text-muted= _('Only effective when remote storage is enabled. Set to 0 for no size limit.')
.form-group
= f.label :session_expire_delay, _('Session duration (minutes)'), class: 'label-light'
= f.number_field :session_expire_delay, class: 'form-control gl-form-input', title: _('Maximum duration of a session.'), data: { toggle: 'tooltip', container: 'body' }
- %span.form-text.text-muted#session_expire_delay_help_block= _('GitLab restart is required to apply changes.')
+ %span.form-text.text-muted#session_expire_delay_help_block= _('Restart GitLab to apply changes.')
= render_if_exists 'admin/application_settings/git_two_factor_session_expiry', form: f
= render_if_exists 'admin/application_settings/personal_access_token_expiration_policy', form: f
@@ -45,13 +45,13 @@
.form-check
= f.check_box :user_default_external, class: 'form-check-input'
= f.label :user_default_external, class: 'form-check-label' do
- = _('Newly registered users will by default be external')
+ = _('Newly-registered users are external by default')
.gl-mt-3
= _('Internal users')
= f.text_field :user_default_internal_regex, placeholder: _('Regex pattern'), class: 'form-control gl-form-input gl-mt-2'
.help-block
- = _('Specify an e-mail address regex pattern to identify default internal users.')
- = link_to _('More information'), help_page_path('user/permissions', anchor: 'setting-new-users-to-external'),
+ = _('Specify an email address regex pattern to identify default internal users.')
+ = link_to _('Learn more'), help_page_path('user/permissions', anchor: 'setting-new-users-to-external'),
target: '_blank'
- unless Gitlab.com?
.form-group
@@ -59,11 +59,13 @@
.form-check
= f.check_box :deactivate_dormant_users, class: 'form-check-input'
= f.label :deactivate_dormant_users, class: 'form-check-label' do
- = _('Deactivate dormant users after 90 days of inactivity. Users can return to active status by signing in to their account. While inactive, a user is not counted as an active user in the instance.')
- = link_to _('More information'), help_page_path('user/admin_area/moderate_users', anchor: 'automatically-deactivate-dormant-users'), target: '_blank'
+ = _('Deactivate dormant users after 90 days of inactivity')
+ .help-block
+ = _('Users can reactivate their account by signing in.')
+ = link_to _('Learn more'), help_page_path('user/admin_area/moderate_users', anchor: 'automatically-deactivate-dormant-users'), target: '_blank'
.form-group
= f.label :personal_access_token_prefix, _('Personal Access Token prefix'), class: 'label-light'
- = f.text_field :personal_access_token_prefix, placeholder: _('Max 20 characters'), class: 'form-control gl-form-input'
+ = f.text_field :personal_access_token_prefix, placeholder: _('Maximum 20 characters'), class: 'form-control gl-form-input'
.form-group
= f.label :user_show_add_ssh_key_message, _('Prompt users to upload SSH keys'), class: 'label-bold'
.form-check
diff --git a/app/views/admin/application_settings/_ci_cd.html.haml b/app/views/admin/application_settings/_ci_cd.html.haml
index fea116bd419..8026ec4702b 100644
--- a/app/views/admin/application_settings/_ci_cd.html.haml
+++ b/app/views/admin/application_settings/_ci_cd.html.haml
@@ -69,5 +69,12 @@
%p.form-text.text-muted
= _("The default CI/CD configuration file and path for new projects.").html_safe
= link_to sprite_icon('question-o'), help_page_path('ci/pipelines/settings', anchor: 'specify-a-custom-cicd-configuration-file'), target: '_blank'
+ .form-group
+ .form-check
+ = f.check_box :suggest_pipeline_enabled, class: 'form-check-input'
+ = f.label :suggest_pipeline_enabled, class: 'form-check-label' do
+ = s_('AdminSettings|Enable pipeline suggestion banner')
+ .form-text.text-muted
+ = s_('AdminSettings|Display a banner on merge requests in projects with no pipelines to initiate steps to add a .gitlab-ci.yml file.')
= f.submit _('Save changes'), class: "gl-button btn btn-confirm"
diff --git a/app/views/admin/application_settings/_files_limits.html.haml b/app/views/admin/application_settings/_files_limits.html.haml
deleted file mode 100644
index 9cd12fa1caa..00000000000
--- a/app/views/admin/application_settings/_files_limits.html.haml
+++ /dev/null
@@ -1,34 +0,0 @@
-= gitlab_ui_form_for @application_setting, url: network_admin_application_settings_path(anchor: 'js-files-limits-settings'), html: { class: 'fieldset-form' } do |f|
- = form_errors(@application_setting)
-
- %fieldset
- %legend.h5.gl-border-none
- = _('Unauthenticated API request rate limit')
- .form-group
- = f.gitlab_ui_checkbox_component :throttle_unauthenticated_files_api_enabled,
- _('Enable unauthenticated API request rate limit'),
- help_text: _('Helps reduce request volume (e.g. from crawlers or abusive bots)'),
- checkbox_options: { data: { qa_selector: 'throttle_unauthenticated_files_api_checkbox' } }
- .form-group
- = f.label :throttle_unauthenticated_files_api_requests_per_period, 'Max unauthenticated API requests per period per IP', class: 'label-bold'
- = f.number_field :throttle_unauthenticated_files_api_requests_per_period, class: 'form-control gl-form-input'
- .form-group
- = f.label :throttle_unauthenticated_files_api_period_in_seconds, 'Unauthenticated API rate limit period in seconds', class: 'label-bold'
- = f.number_field :throttle_unauthenticated_files_api_period_in_seconds, class: 'form-control gl-form-input'
-
- %fieldset
- %legend.h5.gl-border-none
- = _('Authenticated API request rate limit')
- .form-group
- = f.gitlab_ui_checkbox_component :throttle_authenticated_files_api_enabled,
- _('Enable authenticated API request rate limit'),
- help_text: _('Helps reduce request volume (e.g. from crawlers or abusive bots)'),
- checkbox_options: { data: { qa_selector: 'throttle_authenticated_files_api_checkbox' } }
- .form-group
- = f.label :throttle_authenticated_files_api_requests_per_period, 'Max authenticated API requests per period per user', class: 'label-bold'
- = f.number_field :throttle_authenticated_files_api_requests_per_period, class: 'form-control gl-form-input'
- .form-group
- = f.label :throttle_authenticated_files_api_period_in_seconds, 'Authenticated API rate limit period in seconds', class: 'label-bold'
- = f.number_field :throttle_authenticated_files_api_period_in_seconds, class: 'form-control gl-form-input'
-
- = f.submit 'Save changes', class: "gl-button btn btn-confirm", data: { qa_selector: 'save_changes_button' }
diff --git a/app/views/admin/application_settings/_help_page.html.haml b/app/views/admin/application_settings/_help_page.html.haml
index ecf3203df9a..cd7eaa1896a 100644
--- a/app/views/admin/application_settings/_help_page.html.haml
+++ b/app/views/admin/application_settings/_help_page.html.haml
@@ -18,11 +18,10 @@
= f.text_field :help_page_support_url, class: 'form-control gl-form-input', placeholder: 'https://company.example.com/getting-help', :'aria-describedby' => 'support_help_block'
%span.form-text.text-muted#support_help_block= _('Alternate support URL for Help page and Help dropdown.')
- - if show_documentation_base_url_field?
- .form-group
- = f.label :help_page_documentation_base_url, _('Documentation pages URL'), class: 'label-bold'
- = f.text_field :help_page_documentation_base_url, class: 'form-control gl-form-input', placeholder: 'https://docs.gitlab.com'
- - docs_link_url = help_page_path('user/admin_area/settings/help_page', anchor: 'destination-requirements')
- - docs_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: docs_link_url }
- %span.form-text.text-muted#support_help_block= html_escape(_('Requests for pages at %{code_start}%{help_text_url}%{code_end} redirect to the URL. The destination must meet certain requirements. %{docs_link_start}Learn more.%{docs_link_end}')) % { code_start: '<code>'.html_safe, help_text_url: help_url, code_end: '</code>'.html_safe, docs_link_start: docs_link_start, docs_link_end: '</a>'.html_safe }
+ .form-group
+ = f.label :help_page_documentation_base_url, _('Documentation pages URL'), class: 'gl-font-weight-bold'
+ = f.text_field :help_page_documentation_base_url, class: 'form-control gl-form-input', placeholder: 'https://docs.gitlab.com'
+ - docs_link_url = help_page_path('user/admin_area/settings/help_page', anchor: 'destination-requirements')
+ - docs_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: docs_link_url }
+ %span.form-text.text-muted#support_help_block= html_escape(_('Requests for pages at %{code_start}%{help_text_url}%{code_end} redirect to the URL. The destination must meet certain requirements. %{docs_link_start}Learn more.%{docs_link_end}')) % { code_start: '<code>'.html_safe, help_text_url: help_url, code_end: '</code>'.html_safe, docs_link_start: docs_link_start, docs_link_end: '</a>'.html_safe }
= f.submit _('Save changes'), class: "gl-button btn btn-confirm"
diff --git a/app/views/admin/application_settings/_mailgun.html.haml b/app/views/admin/application_settings/_mailgun.html.haml
index 40b4d5cac6d..ad9e84ffdab 100644
--- a/app/views/admin/application_settings/_mailgun.html.haml
+++ b/app/views/admin/application_settings/_mailgun.html.haml
@@ -6,7 +6,7 @@
%button.btn.gl-button.btn-default.js-settings-toggle{ type: 'button' }
= expanded ? _('Collapse') : _('Expand')
%p
- = _('Configure the %{link} integration.').html_safe % { link: link_to(_('Mailgun events'), 'https://documentation.mailgun.com/en/latest/user_manual.html#webhooks', target: '_blank') }
+ = _('Configure the %{link} integration.').html_safe % { link: link_to(_('Mailgun events'), 'https://documentation.mailgun.com/en/latest/user_manual.html#webhooks', target: '_blank', rel: 'noopener noreferrer') }
.settings-content
= form_for @application_setting, url: general_admin_application_settings_path(anchor: 'js-mailgun-settings'), html: { class: 'fieldset-form', id: 'mailgun-settings' } do |f|
= form_errors(@application_setting) if expanded
diff --git a/app/views/admin/application_settings/_network_rate_limits.html.haml b/app/views/admin/application_settings/_network_rate_limits.html.haml
new file mode 100644
index 00000000000..f1857a9749a
--- /dev/null
+++ b/app/views/admin/application_settings/_network_rate_limits.html.haml
@@ -0,0 +1,33 @@
+= gitlab_ui_form_for @application_setting, url: network_admin_application_settings_path(anchor: anchor), html: { class: 'fieldset-form' } do |f|
+ = form_errors(@application_setting)
+
+ %fieldset
+ = _("Rate limits can help reduce request volume (like from crawlers or abusive bots).")
+
+ %fieldset
+ .form-group
+ = f.gitlab_ui_checkbox_component :"throttle_unauthenticated_#{setting_fragment}_enabled",
+ _('Enable unauthenticated API request rate limit'),
+ checkbox_options: { data: { qa_selector: "throttle_unauthenticated_#{setting_fragment}_checkbox" } },
+ label_options: { class: 'label-bold' }
+ .form-group
+ = f.label :"throttle_unauthenticated_#{setting_fragment}_requests_per_period", _('Maximum unauthenticated API requests per rate limit period per IP'), class: 'label-bold'
+ = f.number_field :"throttle_unauthenticated_#{setting_fragment}_requests_per_period", class: 'form-control gl-form-input'
+ .form-group
+ = f.label :"throttle_unauthenticated_#{setting_fragment}_period_in_seconds", _('Unauthenticated API rate limit period in seconds'), class: 'label-bold'
+ = f.number_field :"throttle_unauthenticated_#{setting_fragment}_period_in_seconds", class: 'form-control gl-form-input'
+
+ %fieldset
+ .form-group
+ = f.gitlab_ui_checkbox_component :"throttle_authenticated_#{setting_fragment}_enabled",
+ _('Enable authenticated API request rate limit'),
+ checkbox_options: { data: { qa_selector: "throttle_authenticated_#{setting_fragment}_checkbox" } },
+ label_options: { class: 'label-bold' }
+ .form-group
+ = f.label :"throttle_authenticated_#{setting_fragment}_requests_per_period", _('Maximum authenticated API requests per rate limit period per user'), class: 'label-bold'
+ = f.number_field :"throttle_authenticated_#{setting_fragment}_requests_per_period", class: 'form-control gl-form-input'
+ .form-group
+ = f.label :"throttle_authenticated_#{setting_fragment}_period_in_seconds", _('Authenticated API rate limit period in seconds'), class: 'label-bold'
+ = f.number_field :"throttle_authenticated_#{setting_fragment}_period_in_seconds", class: 'form-control gl-form-input'
+
+ = f.submit _('Save changes'), class: "gl-button btn btn-confirm", data: { qa_selector: 'save_changes_button' }
diff --git a/app/views/admin/application_settings/_package_registry_limits.html.haml b/app/views/admin/application_settings/_package_registry_limits.html.haml
deleted file mode 100644
index 8769171c9e0..00000000000
--- a/app/views/admin/application_settings/_package_registry_limits.html.haml
+++ /dev/null
@@ -1,32 +0,0 @@
-= form_for @application_setting, url: network_admin_application_settings_path(anchor: 'js-packages-limits-settings'), html: { class: 'fieldset-form' } do |f|
- = form_errors(@application_setting)
-
- %fieldset
- = _("The package registry rate limits can help reduce request volume (like from crawlers or abusive bots).")
-
- %fieldset
- .form-group
- .form-check
- = f.check_box :throttle_unauthenticated_packages_api_enabled, class: 'form-check-input', data: { qa_selector: 'throttle_unauthenticated_packages_api_checkbox' }
- = f.label :throttle_unauthenticated_packages_api_enabled, class: 'form-check-label label-bold' do
- = _('Enable unauthenticated API request rate limit')
- .form-group
- = f.label :throttle_unauthenticated_packages_api_requests_per_period, _('Maximum unauthenticated API requests per rate limit period per IP'), class: 'label-bold'
- = f.number_field :throttle_unauthenticated_packages_api_requests_per_period, class: 'form-control gl-form-input'
- .form-group
- = f.label :throttle_unauthenticated_packages_api_period_in_seconds, _('Unauthenticated API rate limit period in seconds'), class: 'label-bold'
- = f.number_field :throttle_unauthenticated_packages_api_period_in_seconds, class: 'form-control gl-form-input'
- %hr
- .form-group
- .form-check
- = f.check_box :throttle_authenticated_packages_api_enabled, class: 'form-check-input', data: { qa_selector: 'throttle_authenticated_packages_api_checkbox' }
- = f.label :throttle_authenticated_packages_api_enabled, class: 'form-check-label label-bold' do
- = _('Enable authenticated API request rate limit')
- .form-group
- = f.label :throttle_authenticated_packages_api_requests_per_period, _('Maximum authenticated API requests per rate limit period per user'), class: 'label-bold'
- = f.number_field :throttle_authenticated_packages_api_requests_per_period, class: 'form-control gl-form-input'
- .form-group
- = f.label :throttle_authenticated_packages_api_period_in_seconds, _('Authenticated API rate limit period in seconds'), class: 'label-bold'
- = f.number_field :throttle_authenticated_packages_api_period_in_seconds, class: 'form-control gl-form-input'
-
- = f.submit _('Save changes'), class: "gl-button btn btn-confirm", data: { qa_selector: 'save_changes_button' }
diff --git a/app/views/admin/application_settings/_performance.html.haml b/app/views/admin/application_settings/_performance.html.haml
index 50fc11ec7f3..82e56cf8b81 100644
--- a/app/views/admin/application_settings/_performance.html.haml
+++ b/app/views/admin/application_settings/_performance.html.haml
@@ -6,29 +6,24 @@
.form-check
= f.check_box :authorized_keys_enabled, class: 'form-check-input'
= f.label :authorized_keys_enabled, class: 'form-check-label' do
- = _('Write to "authorized_keys" file')
+ = _('Use authorized_keys file to authenticate SSH keys')
.form-text.text-muted
- By default, we write to the "authorized_keys" file to support Git
- over SSH without additional configuration. GitLab can be optimized
- to authenticate SSH keys via the database file. Only uncheck this
- if you have configured your OpenSSH server to use the
- AuthorizedKeysCommand. Click on the help icon for more details.
- = link_to sprite_icon('question-o'), help_page_path('administration/operations/fast_ssh_key_lookup')
-
+ = _('Authenticate user SSH keys without requiring additional configuration. Performance of GitLab can be improved by using the GitLab database instead.')
+ = link_to _('How do I configure authentication using the GitLab database?'), help_page_path('administration/operations/fast_ssh_key_lookup'), target: '_blank', rel: 'noopener noreferrer'
.form-group
= f.label :raw_blob_request_limit, _('Raw blob request rate limit per minute'), class: 'label-bold'
= f.number_field :raw_blob_request_limit, class: 'form-control gl-form-input'
.form-text.text-muted
- = _('Highest number of requests per minute for each raw path, default to 300. To disable throttling set to 0.')
+ = _('Maximum number of requests per minute for each raw path (default is 300). Set to 0 to disable throttling.')
.form-group
= f.label :push_event_hooks_limit, class: 'label-bold'
= f.number_field :push_event_hooks_limit, class: 'form-control gl-form-input'
.form-text.text-muted
- = _("Number of changes (branches or tags) in a single push to determine whether webhooks and services will be fired or not. Webhooks and services won't be submitted if it surpasses that value.")
+ = _('Maximum number of changes (branches or tags) in a single push for which webhooks and services trigger (default is 3).')
.form-group
= f.label :push_event_activities_limit, class: 'label-bold'
= f.number_field :push_event_activities_limit, class: 'form-control gl-form-input'
.form-text.text-muted
- = _('Number of changes (branches or tags) in a single push to determine whether individual push events or bulk push event will be created. Bulk push event will be created if it surpasses that value.')
+ = _('Threshold number of changes (branches or tags) in a single push above which a bulk push event is created (default is 3).')
= f.submit _('Save changes'), class: "gl-button btn btn-confirm"
diff --git a/app/views/admin/application_settings/_snowplow.html.haml b/app/views/admin/application_settings/_snowplow.html.haml
index 8c98778147e..756c0e770a6 100644
--- a/app/views/admin/application_settings/_snowplow.html.haml
+++ b/app/views/admin/application_settings/_snowplow.html.haml
@@ -7,7 +7,7 @@
= expanded ? _('Collapse') : _('Expand')
%p
- link_start = '<a href="%{url}">'.html_safe % { url: help_page_path('development/snowplow/index') }
- = html_escape(_('Configure %{link} to track events. %{link_start}Learn more.%{link_end}')) % { link: link_to('Snowplow', 'https://snowplowanalytics.com/', target: '_blank').html_safe, link_start: link_start, link_end: '</a>'.html_safe }
+ = html_escape(_('Configure %{link} to track events. %{link_start}Learn more.%{link_end}')) % { link: link_to('Snowplow', 'https://snowplowanalytics.com/', target: '_blank', rel: 'noopener noreferrer').html_safe, link_start: link_start, link_end: '</a>'.html_safe }
.settings-content
= form_for @application_setting, url: general_admin_application_settings_path(anchor: 'js-snowplow-settings'), html: { class: 'fieldset-form', id: 'snowplow-settings' } do |f|
= form_errors(@application_setting) if expanded
diff --git a/app/views/admin/application_settings/_spam.html.haml b/app/views/admin/application_settings/_spam.html.haml
index 011bce3ca99..53ca4d4aa79 100644
--- a/app/views/admin/application_settings/_spam.html.haml
+++ b/app/views/admin/application_settings/_spam.html.haml
@@ -2,6 +2,11 @@
= form_errors(@application_setting)
%fieldset
+ %h5
+ = _('reCAPTCHA')
+ %p
+ = _('reCAPTCHA helps prevent credential stuffing.')
+ = link_to _('Only reCAPTCHA v2 is supported:'), 'https://developers.google.com/recaptcha/docs/versions', target: '_blank', rel: 'noopener noreferrer'
.form-group
.form-check
= f.check_box :recaptcha_enabled, class: 'form-check-input'
@@ -9,25 +14,31 @@
= _("Enable reCAPTCHA")
%span.form-text.text-muted#recaptcha_help_block
= _('Helps prevent bots from creating accounts.')
+ = link_to _('How do I configure it?'), help_page_path('integration/recaptcha.md'), target: '_blank', rel: 'noopener noreferrer'
.form-group
.form-check
= f.check_box :login_recaptcha_protection_enabled, class: 'form-check-input'
= f.label :login_recaptcha_protection_enabled, class: 'form-check-label' do
- = _("Enable reCAPTCHA for login")
+ = _('Enable reCAPTCHA for login.')
%span.form-text.text-muted#recaptcha_help_block
= _('Helps prevent bots from brute-force attacks.')
.form-group
- = f.label :recaptcha_site_key, _('reCAPTCHA Site Key'), class: 'label-bold'
+ = f.label :recaptcha_site_key, _('reCAPTCHA site key'), class: 'label-bold'
= f.text_field :recaptcha_site_key, class: 'form-control gl-form-input'
.form-text.text-muted
= _("Generate site and private keys at")
%a{ href: 'http://www.google.com/recaptcha', target: 'blank' } http://www.google.com/recaptcha
.form-group
- = f.label :recaptcha_private_key, _('reCAPTCHA Private Key'), class: 'label-bold'
- .form-group
+ = f.label :recaptcha_private_key, _('reCAPTCHA private key'), class: 'label-bold'
= f.text_field :recaptcha_private_key, class: 'form-control gl-form-input'
+ %h5
+ = _('Invisible Captcha')
+ %p
+ = _('Invisible Captcha helps prevent the creation of spam accounts. It adds a honeypot field and time-sensitive form submission to the account signup form.')
+ = link_to _('Read their documentation.'), 'https://github.com/markets/invisible_captcha', target: '_blank', rel: 'noopener noreferrer'
+
.form-group
.form-check
= f.check_box :invisible_captcha_enabled, class: 'form-check-input'
@@ -36,12 +47,18 @@
%span.form-text.text-muted
= _('Helps prevent bots from creating accounts.')
+ %h5
+ = _('Akismet')
+ %p
+ = _('Akismet helps prevent the creation of spam issues in public projects.')
+ = link_to _('How do I configure Akismet?'), help_page_path('integration/akismet.md'), target: '_blank', rel: 'noopener noreferrer'
+
.form-group
.form-check
= f.check_box :akismet_enabled, class: 'form-check-input'
= f.label :akismet_enabled, class: 'form-check-label' do
Enable Akismet
- %span.form-text.text-muted#akismet_help_block= _("Helps prevent bots from creating issues")
+ %span.form-text.text-muted#akismet_help_block= _("Helps prevent bots from creating issues.")
.form-group
= f.label :akismet_api_key, _('Akismet API Key'), class: 'label-bold'
@@ -50,25 +67,31 @@
Generate API key at
%a{ href: 'http://www.akismet.com', target: 'blank' } http://www.akismet.com
+ %h5
+ = _('IP address restrictions')
+
.form-group
.form-check
= f.check_box :unique_ips_limit_enabled, class: 'form-check-input'
= f.label :unique_ips_limit_enabled, class: 'form-check-label' do
- = _("Limit sign in from multiple ips")
+ = _("Limit sign in from multiple IP addresses")
%span.form-text.text-muted#unique_ip_help_block
- = _("Helps prevent malicious users hide their activity")
+ = _("Helps prevent malicious users hide their activity.")
.form-group
- = f.label :unique_ips_limit_per_user, _('IPs per user'), class: 'label-bold'
+ = f.label :unique_ips_limit_per_user, _('IP addresses per user'), class: 'label-bold'
= f.number_field :unique_ips_limit_per_user, class: 'form-control gl-form-input'
.form-text.text-muted
- = _("Maximum number of unique IPs per user")
+ = _("Maximum number of unique IP addresses per user.")
.form-group
- = f.label :unique_ips_limit_time_window, _('IP expiration time'), class: 'label-bold'
+ = f.label :unique_ips_limit_time_window, _('IP address expiration time'), class: 'label-bold'
= f.number_field :unique_ips_limit_time_window, class: 'form-control gl-form-input'
.form-text.text-muted
- = _("How many seconds an IP will be counted towards the limit")
+ = _("How many seconds an IP counts toward the IP address limit.")
+
+ %h5
+ = _('Spam Check')
.form-group
.form-check
@@ -79,8 +102,8 @@
= f.label :spam_check_endpoint_url, _('URL of the external Spam Check endpoint'), class: 'label-bold'
= f.text_field :spam_check_endpoint_url, class: 'form-control gl-form-input'
.form-group
- = f.label :spam_check_api_key, _('Spam Check API Key'), class: 'gl-font-weight-bold'
+ = f.label :spam_check_api_key, _('Spam Check API key'), class: 'gl-font-weight-bold'
= f.text_field :spam_check_api_key, class: 'form-control gl-form-input'
- .form-text.text-muted= _('The API key used by GitLab for accessing the Spam Check service endpoint')
+ .form-text.text-muted= _('The API key used by GitLab for accessing the Spam Check service endpoint.')
= f.submit _('Save changes'), class: "gl-button btn btn-confirm"
diff --git a/app/views/admin/application_settings/_terminal.html.haml b/app/views/admin/application_settings/_terminal.html.haml
index d6e31a24cf6..c53f63e124b 100644
--- a/app/views/admin/application_settings/_terminal.html.haml
+++ b/app/views/admin/application_settings/_terminal.html.haml
@@ -6,5 +6,5 @@
= f.label :terminal_max_session_time, _('Max session time'), class: 'label-bold'
= f.number_field :terminal_max_session_time, class: 'form-control gl-form-input'
.form-text.text-muted
- = _('Maximum time for web terminal websocket connection (in seconds). 0 for unlimited.')
+ = _('Maximum time, in seconds, for a web terminal websocket connection. 0 for unlimited.')
= f.submit _('Save changes'), class: "gl-button btn btn-confirm"
diff --git a/app/views/admin/application_settings/_usage.html.haml b/app/views/admin/application_settings/_usage.html.haml
index ddd0abb4c34..5bdad50c161 100644
--- a/app/views/admin/application_settings/_usage.html.haml
+++ b/app/views/admin/application_settings/_usage.html.haml
@@ -10,21 +10,21 @@
= f.label :version_check_enabled, class: 'form-check-label' do
= _("Enable version check")
.form-text.text-muted
- = _("GitLab will inform you if a new version is available.")
- = _("%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc.").html_safe % { link_start: "<a href='#{help_page_path("user/admin_area/settings/usage_statistics", anchor: "version-check")}'>".html_safe, link_end: '</a>'.html_safe }
+ = _("GitLab informs you if a new version is available.")
+ = _("%{link_start}What information does GitLab Inc. collect?%{link_end}").html_safe % { link_start: "<a href='#{help_page_path("user/admin_area/settings/usage_statistics", anchor: "version-check")}'>".html_safe, link_end: '</a>'.html_safe }
.form-group
- can_be_configured = @application_setting.usage_ping_can_be_configured?
.form-check
= f.check_box :usage_ping_enabled, disabled: !can_be_configured, class: 'form-check-input'
= f.label :usage_ping_enabled, class: 'form-check-label' do
- = _('Enable service ping')
+ = _('Enable Service Ping')
.form-text.text-muted
- if can_be_configured
- %p.mb-2= _('To help improve GitLab and its user experience, GitLab will periodically collect usage information.')
+ %p.mb-2= _('To help improve GitLab and its user experience, GitLab periodically collects usage information.')
- - service_ping_path = help_page_path('user/admin_area/settings/usage_statistics', anchor: 'service-ping')
+ - service_ping_path = help_page_path('development/service_ping/index.md')
- service_ping_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: service_ping_path }
- %p.mb-2= s_('%{service_ping_link_start}Learn more%{service_ping_link_end} about what information is shared with GitLab Inc.').html_safe % { service_ping_link_start: service_ping_link_start, service_ping_link_end: '</a>'.html_safe }
+ %p.mb-2= s_('%{service_ping_link_start}What information is shared with GitLab Inc.?%{service_ping_link_end}').html_safe % { service_ping_link_start: service_ping_link_start, service_ping_link_end: '</a>'.html_safe }
%button.gl-button.btn.btn-default.js-payload-preview-trigger{ type: 'button', data: { payload_selector: ".#{payload_class}" } }
.gl-spinner.js-spinner.gl-display-none.gl-mr-2
@@ -46,15 +46,23 @@
- if usage_ping_enabled
%p.gl-mb-3.text-muted{ id: 'service_ping_features_helper_text' }= _('You can enable Registration Features because Service Ping is enabled. To continue using Registration Features in the future, you will also need to register with GitLab via a new cloud licensing service.')
- else
- %p.gl-mb-3.text-muted{ id: 'service_ping_features_helper_text' }= _('To enable Registration Features, make sure "Enable service ping" is checked.')
+ %p.gl-mb-3.text-muted{ id: 'service_ping_features_helper_text' }= _('To enable Registration Features, first enable Service Ping.')
%p.gl-mb-3.text-muted= _('Registration Features include:')
.form-text
- email_from_gitlab_path = help_page_path('tools/email.md')
+ - repo_size_limit_path = help_page_path('user/admin_area/settings/account_and_limit_settings.md', anchor: 'repository-size-limit')
+ - restrict_ip_path = help_page_path('user/group/index.md', anchor: 'restrict-group-access-by-ip-address')
- link_end = '</a>'.html_safe
- email_from_gitlab_link = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: email_from_gitlab_path }
+ - repo_size_limit_link = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: repo_size_limit_path }
+ - restrict_ip_link = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: restrict_ip_path }
%ul
%li
= _('Email from GitLab - email users right from the Admin Area. %{link_start}Learn more%{link_end}.').html_safe % { link_start: email_from_gitlab_link, link_end: link_end }
+ %li
+ = _('Limit project size at a global, group, and project level. %{link_start}Learn more%{link_end}.').html_safe % { link_start: repo_size_limit_link, link_end: link_end }
+ %li
+ = _('Restrict group access by IP address. %{link_start}Learn more%{link_end}.').html_safe % { link_start: restrict_ip_link, link_end: link_end }
= f.submit _('Save changes'), class: "gl-button btn btn-confirm"
diff --git a/app/views/admin/application_settings/appearances/preview_sign_in.html.haml b/app/views/admin/application_settings/appearances/preview_sign_in.html.haml
index 77c37abbeef..2e4ab714048 100644
--- a/app/views/admin/application_settings/appearances/preview_sign_in.html.haml
+++ b/app/views/admin/application_settings/appearances/preview_sign_in.html.haml
@@ -1,12 +1,13 @@
= render 'devise/shared/tab_single', tab_title: _('Sign in preview')
.login-box
%form.gl-show-field-errors
+ - title = _('This form is disabled in preview')
.form-group
= label_tag :login
- = text_field_tag :login, nil, class: "form-control gl-form-input top", title: _('Please provide your username or email address.')
+ = text_field_tag :login, nil, disabled: true, class: "form-control gl-form-input top", title: title
.form-group
= label_tag :password
- = password_field_tag :password, nil, class: "form-control gl-form-input bottom", title: _('This field is required.')
+ = password_field_tag :password, nil, disabled: true, class: "form-control gl-form-input bottom", title: title
.form-group
- = button_tag _("Sign in"), class: "btn gl-button btn-confirm", type: "button"
+ = button_tag _("Sign in"), disabled: true, class: "btn gl-button btn-confirm", type: "button", title: title
diff --git a/app/views/admin/application_settings/general.html.haml b/app/views/admin/application_settings/general.html.haml
index 9102769cc6e..a72c96bb577 100644
--- a/app/views/admin/application_settings/general.html.haml
+++ b/app/views/admin/application_settings/general.html.haml
@@ -79,7 +79,8 @@
%button.btn.gl-button.btn-default.js-settings-toggle{ type: 'button' }
= expanded_by_default? ? _('Collapse') : _('Expand')
%p
- = _('Set max session time for web terminal.')
+ = _('Set the maximum session time for a web terminal.')
+ = link_to _('How do I use a web terminal?'), help_page_path('ci/environments/index.md', anchor: 'web-terminals'), target: '_blank', rel: 'noopener noreferrer'
.settings-content
= render 'terminal'
diff --git a/app/views/admin/application_settings/metrics_and_profiling.html.haml b/app/views/admin/application_settings/metrics_and_profiling.html.haml
index f1e37c76130..6087551d7c7 100644
--- a/app/views/admin/application_settings/metrics_and_profiling.html.haml
+++ b/app/views/admin/application_settings/metrics_and_profiling.html.haml
@@ -49,7 +49,7 @@
%button.btn.gl-button.btn-default.js-settings-toggle{ type: 'button' }
= expanded_by_default? ? _('Collapse') : _('Expand')
%p
- = _('Enable or disable version check and service ping.')
+ = _('Enable or disable version check and Service Ping.')
.settings-content
= render 'usage'
diff --git a/app/views/admin/application_settings/network.html.haml b/app/views/admin/application_settings/network.html.haml
index 8dff2bc36cb..58e3f3f1136 100644
--- a/app/views/admin/application_settings/network.html.haml
+++ b/app/views/admin/application_settings/network.html.haml
@@ -35,9 +35,10 @@
= _('Set rate limits for package registry API requests that supersede the general user and IP rate limits.')
= link_to _('Learn more.'), help_page_path('user/admin_area/settings/package_registry_rate_limits.md'), target: '_blank', rel: 'noopener noreferrer'
.settings-content
- = render 'package_registry_limits'
+ = render partial: 'network_rate_limits', locals: { anchor: 'js-packages-limits-settings', setting_fragment: 'packages_api' }
+
- if Feature.enabled?(:files_api_throttling, default_enabled: :yaml)
- %section.settings.as-files-limits.no-animate#js-files-limits-settings{ class: ('expanded' if expanded_by_default?), data: { testid: 'files-limits-settings' } }
+ %section.settings.as-files-limits.no-animate#js-files-limits-settings{ class: ('expanded' if expanded_by_default?) }
.settings-header
%h4
= _('Files API Rate Limits')
@@ -46,7 +47,19 @@
%p
= _('Configure specific limits for Files API requests that supersede the general user and IP rate limits.')
.settings-content
- = render 'files_limits'
+ = render partial: 'network_rate_limits', locals: { anchor: 'js-files-limits-settings', setting_fragment: 'files_api' }
+
+%section.settings.as-deprecated-limits.no-animate#js-deprecated-limits-settings{ class: ('expanded' if expanded_by_default?) }
+ .settings-header
+ %h4
+ = _('Deprecated API rate limits')
+ %button.btn.gl-button.btn-default.js-settings-toggle{ type: 'button' }
+ = expanded_by_default? ? _('Collapse') : _('Expand')
+ %p
+ = _('Configure specific limits for deprecated API requests that supersede the general user and IP rate limits.')
+ = link_to _('Which API requests are affected?'), help_page_path('user/admin_area/settings/deprecated_api_rate_limits.md'), target: '_blank', rel: 'noopener noreferrer'
+ .settings-content
+ = render partial: 'network_rate_limits', locals: { anchor: 'js-deprecated-limits-settings', setting_fragment: 'deprecated_api' }
%section.settings.as-git-lfs-limits.no-animate#js-git-lfs-limits-settings{ class: ('expanded' if expanded_by_default?), data: { qa_selector: 'git_lfs_limits_content' } }
.settings-header
diff --git a/app/views/admin/application_settings/reporting.html.haml b/app/views/admin/application_settings/reporting.html.haml
index 914a09ff5db..d2e118f0624 100644
--- a/app/views/admin/application_settings/reporting.html.haml
+++ b/app/views/admin/application_settings/reporting.html.haml
@@ -9,9 +9,7 @@
%button.btn.gl-button.btn-default.js-settings-toggle{ type: 'button' }
= expanded_by_default? ? _('Collapse') : _('Expand')
%p
- - recaptcha_v2_link_url = 'https://developers.google.com/recaptcha/docs/versions'
- - recaptcha_v2_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: recaptcha_v2_link_url }
- = _('Enable reCAPTCHA, Invisible Captcha, Akismet and set IP limits. For reCAPTCHA, we currently only support %{recaptcha_v2_link_start}v2%{recaptcha_v2_link_end}').html_safe % { recaptcha_v2_link_start: recaptcha_v2_link_start, recaptcha_v2_link_end: '</a>'.html_safe }
+ = _('Configure CAPTCHAs, IP address limits, and other anti-spam measures.')
.settings-content
= render 'spam'
@@ -22,6 +20,7 @@
%button.btn.gl-button.btn-default.js-settings-toggle{ type: 'button' }
= expanded_by_default? ? _('Collapse') : _('Expand')
%p
- = _('Set notification email for abuse reports.')
+ = _('Receive notification of abuse reports by email.')
+ = link_to _('Learn more.'), help_page_path('user/admin_area/review_abuse_reports.md'), target: '_blank', rel: 'noopener noreferrer'
.settings-content
= render 'abuse'
diff --git a/app/views/admin/dashboard/_security_newsletter_callout.html.haml b/app/views/admin/dashboard/_security_newsletter_callout.html.haml
new file mode 100644
index 00000000000..ece0f7ca4d9
--- /dev/null
+++ b/app/views/admin/dashboard/_security_newsletter_callout.html.haml
@@ -0,0 +1,14 @@
+- return unless show_security_newsletter_user_callout?
+
+= render 'shared/global_alert',
+ title: s_('AdminArea|Get security updates from GitLab and stay up to date'),
+ variant: :tip,
+ alert_class: 'js-security-newsletter-callout',
+ is_contained: true,
+ alert_data: { feature_id: UserCalloutsHelper::SECURITY_NEWSLETTER_CALLOUT, dismiss_endpoint: user_callouts_path, defer_links: 'true' },
+ close_button_data: { testid: 'close-security-newsletter-callout' } do
+ .gl-alert-body
+ = s_('AdminArea|Sign up for the GitLab Security Newsletter to get notified for security updates.')
+ .gl-alert-actions
+ = link_to 'https://about.gitlab.com/company/preference-center/', target: '_blank', rel: 'noreferrer noopener', class: 'deferred-link gl-alert-action btn-confirm btn-md gl-button' do
+ = s_('AdminArea|Sign up for the GitLab newsletter')
diff --git a/app/views/admin/dashboard/index.html.haml b/app/views/admin/dashboard/index.html.haml
index 97b3a757a3f..681e7ccb613 100644
--- a/app/views/admin/dashboard/index.html.haml
+++ b/app/views/admin/dashboard/index.html.haml
@@ -4,6 +4,7 @@
- billable_users_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer nofollow">'.html_safe % { url: billable_users_url }
= render_if_exists 'shared/qrtly_reconciliation_alert'
+= render 'admin/dashboard/security_newsletter_callout'
- if @notices
- @notices.each do |notice|
diff --git a/app/views/admin/hook_logs/_index.html.haml b/app/views/admin/hook_logs/_index.html.haml
index a7f947f96ea..6a46b0b3510 100644
--- a/app/views/admin/hook_logs/_index.html.haml
+++ b/app/views/admin/hook_logs/_index.html.haml
@@ -1,37 +1,11 @@
+- docs_link_url = help_page_path('user/project/integrations/webhooks', anchor: 'troubleshoot-webhooks')
+- link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: docs_link_url }
+- link_end = '</a>'.html_safe
+
.row.gl-mt-3.gl-mb-3
.col-lg-3
%h4.gl-mt-0
- = _('Recent Deliveries')
- %p= _('When an event in GitLab triggers a webhook, you can use the request details to figure out if something went wrong.')
+ = _('Recent events')
+ %p= _('GitLab events trigger webhooks. Use the request details of a webhook to help troubleshoot problems. %{link_start}How do I troubleshoot?%{link_end}').html_safe % { link_start: link_start, link_end: link_end }
.col-lg-9
- - if hook_logs.present?
- %table.table
- %thead
- %tr
- %th= _('Status')
- %th= _('Trigger')
- %th= _('URL')
- %th= _('Elapsed time')
- %th= _('Request time')
- %th
- - hook_logs.each do |hook_log|
- %tr
- %td
- = render partial: 'shared/hook_logs/status_label', locals: { hook_log: hook_log }
- %td.d-none.d-sm-block
- %span.badge.badge-gray.deploy-project-label
- = hook_log.trigger.singularize.titleize
- %td
- = truncate(hook_log.url, length: 50)
- %td.light
- #{number_with_precision(hook_log.execution_duration, precision: 2)} sec
- %td.light
- = time_ago_with_tooltip(hook_log.created_at)
- %td
- = link_to _('View details'), admin_hook_hook_log_path(hook, hook_log)
-
- = paginate hook_logs, theme: 'gitlab'
-
- - else
- .settings-message.text-center
- = _("You don't have any webhooks deliveries")
+ = render partial: 'shared/hook_logs/recent_deliveries_table', locals: { hook: hook, hook_logs: hook_logs }
diff --git a/app/views/admin/projects/index.html.haml b/app/views/admin/projects/index.html.haml
index 5ebfd296e2b..f947e174990 100644
--- a/app/views/admin/projects/index.html.haml
+++ b/app/views/admin/projects/index.html.haml
@@ -1,33 +1,24 @@
- page_title _('Projects')
- params[:visibility_level] ||= []
-- active_tab_classes = 'active gl-tab-nav-item-active gl-tab-nav-item-active-indigo'
.top-area.scrolling-tabs-container.inner-page-scroll-tabs
- %ul.nav.gl-tabs-nav.gl-overflow-x-auto.gl-display-flex.gl-flex-grow-1.gl-flex-shrink-1.gl-border-b-0.gl-flex-nowrap.gl-webkit-scrollbar-display-none
- = nav_link(html_options: { class: "nav-item" } ) do
- = link_to _('All'), admin_projects_path, class: "nav-link gl-tab-nav-item #{active_tab_classes if params[:visibility_level].empty?}"
- = nav_link(html_options: { class: "nav-item" } ) do
- = link_to _('Private'), admin_projects_path(visibility_level: Gitlab::VisibilityLevel::PRIVATE), class: "nav-link gl-tab-nav-item #{active_tab_classes if params[:visibility_level] == Gitlab::VisibilityLevel::PRIVATE.to_s}"
- = nav_link(html_options: { class: "nav-item" } ) do
- = link_to _('Internal'), admin_projects_path(visibility_level: Gitlab::VisibilityLevel::INTERNAL), class: "nav-link gl-tab-nav-item #{active_tab_classes if params[:visibility_level] == Gitlab::VisibilityLevel::INTERNAL.to_s}"
- = nav_link(html_options: { class: "nav-item" } ) do
- = link_to _('Public'), admin_projects_path(visibility_level: Gitlab::VisibilityLevel::PUBLIC), class: "nav-link gl-tab-nav-item #{active_tab_classes if params[:visibility_level] == Gitlab::VisibilityLevel::PUBLIC.to_s}"
+ = gl_tabs_nav({ class: 'gl-border-b-0 gl-overflow-x-auto gl-flex-grow-1 gl-flex-nowrap gl-webkit-scrollbar-display-none' }) do
+ = gl_tab_link_to _('All'), admin_projects_path(visibility_level: nil), { item_active: params[:visibility_level].empty? }
+ = gl_tab_link_to _('Private'), admin_projects_path(visibility_level: Gitlab::VisibilityLevel::PRIVATE)
+ = gl_tab_link_to _('Internal'), admin_projects_path(visibility_level: Gitlab::VisibilityLevel::INTERNAL)
+ = gl_tab_link_to _('Public'), admin_projects_path(visibility_level: Gitlab::VisibilityLevel::PUBLIC)
.nav-controls
.search-holder
= render 'shared/projects/search_form', autofocus: true, admin_view: true
- .dropdown
- - toggle_text = _('Namespace')
- - if params[:namespace_id].present?
- = hidden_field_tag :namespace_id, params[:namespace_id]
- - namespace = Namespace.find(params[:namespace_id])
- - toggle_text = "#{namespace.kind}: #{namespace.full_path}"
- = dropdown_toggle(toggle_text, { toggle: 'dropdown', is_filter: 'true' }, { toggle_class: 'js-namespace-select large' })
- .dropdown-menu.dropdown-select.dropdown-menu-right
- = dropdown_title(_('Namespaces'))
- = dropdown_filter(_("Search for Namespace"))
- = dropdown_content
- = dropdown_loading
+ - current_namespace = _('Namespace')
+ - if params[:namespace_id].present?
+ - namespace = Namespace.find(params[:namespace_id])
+ - current_namespace = "#{namespace.kind}: #{namespace.full_path}"
+ %button.dropdown-menu-toggle.btn.btn-default.btn-md.gl-button.js-namespace-select{ data: { show_any: 'true', field_name: 'namespace_id', placeholder: current_namespace, update_location: 'true' }, type: 'button' }
+ %span.gl-new-dropdown-button-text
+ = current_namespace
+
= render 'shared/projects/dropdown'
= link_to new_project_path, class: 'gl-button btn btn-confirm' do
= _('New Project')
diff --git a/app/views/admin/projects/show.html.haml b/app/views/admin/projects/show.html.haml
index 1a87b21351c..3069aab2710 100644
--- a/app/views/admin/projects/show.html.haml
+++ b/app/views/admin/projects/show.html.haml
@@ -143,13 +143,10 @@
.col-sm-3.col-form-label
= f.label :new_namespace_id, _("Namespace")
.col-sm-9
- .dropdown
- = dropdown_toggle(_('Search for Namespace'), { toggle: 'dropdown', field_name: 'new_namespace_id' }, { toggle_class: 'js-namespace-select large' })
- .dropdown-menu.dropdown-select
- = dropdown_title(_('Namespaces'))
- = dropdown_filter(_('Search for Namespace'))
- = dropdown_content
- = dropdown_loading
+ - placeholder = _('Search for Namespace')
+ %button.dropdown-menu-toggle.btn.btn-default.btn-md.gl-button.js-namespace-select{ data: { field_name: 'new_namespace_id', placeholder: placeholder }, type: 'button' }
+ %span.gl-new-dropdown-button-text
+ = placeholder
.form-group.row
.offset-sm-3.col-sm-9
diff --git a/app/views/admin/runners/show.html.haml b/app/views/admin/runners/show.html.haml
index 59523ed3a0c..808b2bb4f8e 100644
--- a/app/views/admin/runners/show.html.haml
+++ b/app/views/admin/runners/show.html.haml
@@ -9,7 +9,7 @@
.row
.col-md-6
%h4= _('Restrict projects for this runner')
- - if @runner.projects.any?
+ - if @runner.runner_projects.any?
%table.table{ data: { testid: 'assigned-projects' } }
%thead
%tr
diff --git a/app/views/admin/serverless/domains/_form.html.haml b/app/views/admin/serverless/domains/_form.html.haml
deleted file mode 100644
index a3e1ccc5d4a..00000000000
--- a/app/views/admin/serverless/domains/_form.html.haml
+++ /dev/null
@@ -1,99 +0,0 @@
-- form_name = 'js-serverless-domain-settings'
-- form_url = @domain.persisted? ? admin_serverless_domain_path(@domain.id, anchor: form_name) : admin_serverless_domains_path(anchor: form_name)
-- show_certificate_card = @domain.persisted? && @domain.errors.blank?
-= form_for @domain, url: form_url, html: { class: 'fieldset-form' } do |f|
- = form_errors(@domain)
-
- %fieldset
- - if @domain.persisted?
- - dns_record = "*.#{@domain.domain} CNAME #{Settings.pages.host}."
- - verification_record = "#{@domain.verification_domain} TXT #{@domain.keyed_verification_code}"
- .form-group.row
- .col-sm-6.position-relative
- = f.label :domain, _('Domain'), class: 'label-bold'
- = f.text_field :domain, class: 'form-control has-floating-status-badge', readonly: true
- .status-badge.floating-status-badge
- - text, status = @domain.unverified? ? [_('Unverified'), 'badge-danger'] : [_('Verified'), 'badge-success']
- .badge{ class: status }
- = text
- = link_to sprite_icon("redo"), verify_admin_serverless_domain_path(@domain.id), method: :post, class: "gl-button btn has-tooltip", title: _("Retry verification")
-
- .col-sm-6
- = f.label :serverless_domain_dns, _('DNS'), class: 'label-bold'
- .input-group
- = text_field_tag :serverless_domain_dns, dns_record , class: "monospace js-select-on-focus form-control", readonly: true
- .input-group-append
- = clipboard_button(target: '#serverless_domain_dns', class: 'btn-default input-group-text d-none d-sm-block')
-
- .col-sm-12.form-text.text-muted
- = _("To access this domain create a new DNS record")
-
- .form-group
- = f.label :serverless_domain_verification, _('Verification status'), class: 'label-bold'
- .input-group
- = text_field_tag :serverless_domain_verification, verification_record, class: "monospace js-select-on-focus form-control", readonly: true
- .input-group-append
- = clipboard_button(target: '#serverless_domain_verification', class: 'btn-default d-none d-sm-block')
- %p.form-text.text-muted
- - link_to_help = link_to(_('verify ownership'), help_page_path('user/project/pages/custom_domains_ssl_tls_certification/index.md', anchor: '4-verify-the-domains-ownership'))
- = _("To %{link_to_help} of your domain, add the above key to a TXT record within your DNS configuration.").html_safe % { link_to_help: link_to_help }
-
- - else
- .form-group
- = f.label :domain, _('Domain'), class: 'label-bold'
- = f.text_field :domain, class: 'form-control'
-
- - if show_certificate_card
- .card.js-domain-cert-show
- .card-header
- = _('Certificate')
- .d-flex.justify-content-between.align-items-center.p-3
- %span
- = @domain.subject || _('missing')
- %button.gl-button.btn.btn-danger.btn-sm.js-domain-cert-replace-btn{ type: 'button' }
- = _('Replace')
-
- .js-domain-cert-inputs{ class: ('hidden' if show_certificate_card) }
- .form-group
- = f.label :user_provided_certificate, _('Certificate (PEM)'), class: 'label-bold'
- = f.text_area :user_provided_certificate, rows: 5, class: 'form-control', value: ''
- %span.form-text.text-muted
- = _("Upload a certificate for your domain with all intermediates")
- .form-group
- = f.label :user_provided_key, _('Key (PEM)'), class: 'label-bold'
- = f.text_area :user_provided_key, rows: 5, class: 'form-control', value: ''
- %span.form-text.text-muted
- = _("Upload a private key for your certificate")
-
- = f.submit @domain.persisted? ? _('Save changes') : _('Add domain'), class: "gl-button btn btn-confirm js-serverless-domain-submit", disabled: @domain.persisted?
- - if @domain.persisted?
- %button.gl-button.btn.btn-danger{ type: 'button', data: { toggle: 'modal', target: "#modal-delete-domain" } }
- = _('Delete domain')
-
--# haml-lint:disable NoPlainNodes
-- if @domain.persisted?
- - domain_attached = @domain.serverless_domain_clusters.count > 0
- .modal{ id: "modal-delete-domain", tabindex: -1 }
- .modal-dialog
- .modal-content
- .modal-header
- %h3.page-title= _('Delete serverless domain?')
- %button.close{ type: "button", "data-dismiss": "modal", "aria-label" => _('Close') }
- %span{ "aria-hidden": "true" } &times;
-
- .modal-body
- - if domain_attached
- = _("You must disassociate %{domain} from all clusters it is attached to before deletion.").html_safe % { domain: "<code>#{@domain.domain}</code>".html_safe }
- - else
- = _("You are about to delete %{domain} from your instance. This domain will no longer be available to any Knative application.").html_safe % { domain: "<code>#{@domain.domain}</code>".html_safe }
-
- .modal-footer
- %a{ href: '#', data: { dismiss: 'modal' }, class: 'gl-button btn btn-default' }
- = _('Cancel')
-
- = link_to _('Delete domain'),
- admin_serverless_domain_path(@domain.id),
- title: _('Delete'),
- method: :delete,
- class: "gl-button btn btn-danger",
- disabled: domain_attached
diff --git a/app/views/admin/serverless/domains/index.html.haml b/app/views/admin/serverless/domains/index.html.haml
deleted file mode 100644
index c2b6baed4de..00000000000
--- a/app/views/admin/serverless/domains/index.html.haml
+++ /dev/null
@@ -1,25 +0,0 @@
-- breadcrumb_title _("Operations")
-- page_title _("Operations")
-- @content_class = "limit-container-width" unless fluid_layout
-
--# normally expanded_by_default? is used here, but since this is the only panel
--# in this settings page, let's leave it always open by default
-- expanded = true
-
-%section.settings.as-serverless-domain.no-animate#js-serverless-domain-settings{ class: ('expanded' if expanded) }
- .settings-header
- %h4
- = _('Serverless domain')
- %button.gl-button.btn.btn-default.js-settings-toggle{ type: 'button' }
- = expanded ? _('Collapse') : _('Expand')
- %p
- = _('Set an instance-wide domain that will be available to all clusters when installing Knative.')
- .settings-content
- - if Gitlab.config.pages.enabled
- = render 'form'
- - else
- .card
- .card-header
- = s_('GitLabPages|Domains')
- .nothing-here-block
- = s_("GitLabPages|Support for domains and certificates is disabled. Ask your system's administrator to enable it.")
diff --git a/app/views/admin/sessions/_new_base.html.haml b/app/views/admin/sessions/_new_base.html.haml
index 47ef4f26889..c9b002a4dd2 100644
--- a/app/views/admin/sessions/_new_base.html.haml
+++ b/app/views/admin/sessions/_new_base.html.haml
@@ -1,7 +1,7 @@
= form_tag(admin_session_path, method: :post, class: 'new_user gl-show-field-errors', 'aria-live': 'assertive') do
.form-group
= label_tag :user_password, _('Password'), class: 'label-bold'
- = password_field_tag 'user[password]', nil, class: 'form-control', required: true, title: _('This field is required.'), data: { qa_selector: 'password_field' }
+ = password_field_tag 'user[password]', nil, class: 'form-control', autocomplete: 'current-password', required: true, title: _('This field is required.'), data: { qa_selector: 'password_field' }
.submit-container.move-submit-down
= submit_tag _('Enter Admin Mode'), class: 'gl-button btn btn-success', data: { qa_selector: 'enter_admin_mode_button' }
diff --git a/app/views/admin/topics/_form.html.haml b/app/views/admin/topics/_form.html.haml
new file mode 100644
index 00000000000..21a1d74a8c6
--- /dev/null
+++ b/app/views/admin/topics/_form.html.haml
@@ -0,0 +1,40 @@
+= gitlab_ui_form_for @topic, url: url, html: { multipart: true, class: 'js-project-topic-form gl-show-field-errors common-note-form js-quick-submit js-requires-input' }, authenticity_token: true do |f|
+ = form_errors(@topic)
+
+ .form-group
+ = f.label :name do
+ = _("Topic name")
+ = f.text_field :name, placeholder: _('My topic'), class: 'form-control input-lg', data: { qa_selector: 'topic_name_field' },
+ required: true,
+ title: _('Please fill in a name for your topic.'),
+ autofocus: true
+
+ .form-group
+ = f.label :description, _("Description")
+ = render layout: 'shared/md_preview', locals: { url: preview_markdown_admin_topics_path, referenced_users: false } do
+ = render 'shared/zen', f: f, attr: :description,
+ classes: 'note-textarea',
+ placeholder: _('Write a description…'),
+ supports_quick_actions: false,
+ supports_autocomplete: false,
+ qa_selector: 'topic_form_description'
+ = render 'shared/notes/hints', supports_file_upload: false
+
+ .form-group.gl-mt-3.gl-mb-3
+ = f.label :avatar, _('Topic avatar'), class: 'gl-display-block'
+ - if @topic.avatar?
+ .avatar-container.rect-avatar.s90
+ = topic_icon(@topic, alt: _('Topic avatar'), class: 'avatar topic-avatar s90')
+ = render 'shared/choose_avatar_button', f: f
+ - if @topic.avatar?
+ = link_to _('Remove avatar'), admin_topic_avatar_path(@topic), data: { confirm: _('Avatar will be removed. Are you sure?')}, method: :delete, class: 'gl-button btn btn-danger-secondary gl-mt-2'
+
+ - if @topic.new_record?
+ .form-actions
+ = f.submit _('Create topic'), class: "gl-button btn btn-confirm"
+ = link_to _('Cancel'), admin_topics_path, class: "gl-button btn btn-default btn-cancel"
+
+ - else
+ .form-actions
+ = f.submit _('Save changes'), class: "gl-button btn btn-confirm", data: { qa_selector: 'save_changes_button' }
+ = link_to _('Cancel'), admin_topics_path, class: "gl-button btn btn-cancel"
diff --git a/app/views/admin/topics/_topic.html.haml b/app/views/admin/topics/_topic.html.haml
new file mode 100644
index 00000000000..abf3cffa422
--- /dev/null
+++ b/app/views/admin/topics/_topic.html.haml
@@ -0,0 +1,17 @@
+- topic = local_assigns.fetch(:topic)
+
+%li.topic-row.gl-py-3.gl-align-items-center{ class: 'gl-display-flex!', data: { qa_selector: 'topic_row_content' } }
+ .avatar-container.rect-avatar.s40.gl-flex-shrink-0
+ = topic_icon(topic, class: "avatar s40")
+
+ .gl-min-w-0.gl-flex-grow-1
+ .title
+ = topic.name
+
+ .stats.gl-text-gray-500.gl-flex-shrink-0.gl-display-none.gl-sm-display-flex
+ %span.gl-ml-5.has-tooltip{ title: n_('%d project', '%d projects', topic.total_projects_count) % topic.total_projects_count }
+ = sprite_icon('bookmark', css_class: 'gl-vertical-align-text-bottom')
+ = number_with_delimiter(topic.total_projects_count)
+
+ .controls.gl-flex-shrink-0.gl-ml-5
+ = link_to _('Edit'), edit_admin_topic_path(topic), id: "edit_#{dom_id(topic)}", class: 'btn gl-button btn-default'
diff --git a/app/views/admin/topics/edit.html.haml b/app/views/admin/topics/edit.html.haml
new file mode 100644
index 00000000000..4416bb0fe18
--- /dev/null
+++ b/app/views/admin/topics/edit.html.haml
@@ -0,0 +1,4 @@
+- page_title _("Edit"), @topic.name, _("Topics")
+%h3.page-title= _('Edit topic: %{topic_name}') % { topic_name: @topic.name }
+%hr
+= render 'form', url: admin_topic_path(@topic)
diff --git a/app/views/admin/topics/index.html.haml b/app/views/admin/topics/index.html.haml
new file mode 100644
index 00000000000..6485b8aa411
--- /dev/null
+++ b/app/views/admin/topics/index.html.haml
@@ -0,0 +1,19 @@
+- page_title _("Topics")
+
+= form_tag admin_topics_path, method: :get do |f|
+ .gl-py-3.gl-display-flex.gl-flex-direction-column-reverse.gl-md-flex-direction-row.gl-border-b-solid.gl-border-gray-100.gl-border-b-1
+ .gl-flex-grow-1.gl-mt-3.gl-md-mt-0
+ .inline.gl-w-full.gl-md-w-auto
+ - search = params.fetch(:search, nil)
+ .search-field-holder
+ = search_field_tag :search, search, class: "form-control gl-form-input search-text-input js-search-input", autofocus: true, spellcheck: false, placeholder: _('Search by name'), data: { qa_selector: 'topic_search_field' }
+ = sprite_icon('search', css_class: 'search-icon')
+ .nav-controls
+ = link_to new_admin_topic_path, class: "gl-button btn btn-confirm gl-w-full gl-md-w-auto" do
+ = _('New topic')
+%ul.content-list
+ = render partial: 'topic', collection: @topics
+
+= paginate_collection @topics
+- if @topics.empty?
+ = render 'shared/empty_states/topics'
diff --git a/app/views/admin/topics/new.html.haml b/app/views/admin/topics/new.html.haml
new file mode 100644
index 00000000000..8b4a8ac269e
--- /dev/null
+++ b/app/views/admin/topics/new.html.haml
@@ -0,0 +1,4 @@
+- page_title _("New topic")
+%h3.page-title= _('New topic')
+%hr
+= render 'form', url: admin_topics_path(@topic)
diff --git a/app/views/admin/users/_access_levels.html.haml b/app/views/admin/users/_access_levels.html.haml
index aeb274fe2cb..6a5f07dd2db 100644
--- a/app/views/admin/users/_access_levels.html.haml
+++ b/app/views/admin/users/_access_levels.html.haml
@@ -19,22 +19,20 @@
.col-sm-10
- editing_current_user = (current_user == @user)
- = f.radio_button :access_level, :regular, disabled: editing_current_user
- = f.label :access_level_regular, class: 'font-weight-bold' do
- = s_('AdminUsers|Regular')
- %p.light
- = s_('AdminUsers|Regular users have access to their groups and projects')
+ = f.gitlab_ui_radio_component :access_level, :regular,
+ s_('AdminUsers|Regular'),
+ radio_options: { disabled: editing_current_user },
+ help_text: s_('AdminUsers|Regular users have access to their groups and projects.')
= render_if_exists 'admin/users/auditor_access_level_radio', f: f, disabled: editing_current_user
- = f.radio_button :access_level, :admin, disabled: editing_current_user
- = f.label :access_level_admin, class: 'font-weight-bold' do
- = s_('AdminUsers|Admin')
- %p.light
- = s_('AdminUsers|Administrators have access to all groups, projects and users and can manage all features in this installation')
- - if editing_current_user
- %p.light
- = s_('AdminUsers|You cannot remove your own admin rights.')
+ - help_text = s_('AdminUsers|Administrators have access to all groups, projects and users and can manage all features in this installation.')
+ - help_text += ' ' + s_('AdminUsers|You cannot remove your own admin rights.') if editing_current_user
+ = f.gitlab_ui_radio_component :access_level, :admin,
+ s_('AdminUsers|Admin'),
+ radio_options: { disabled: editing_current_user },
+ help_text: help_text
+
.form-group.row
.col-sm-2.col-form-label.gl-pt-0
diff --git a/app/views/admin/users/_form.html.haml b/app/views/admin/users/_form.html.haml
index 9d62c19e2fc..3869a2b6dcd 100644
--- a/app/views/admin/users/_form.html.haml
+++ b/app/views/admin/users/_form.html.haml
@@ -1,5 +1,5 @@
.user_new
- = form_for [:admin, @user], html: { class: 'fieldset-form' } do |f|
+ = gitlab_ui_form_for [:admin, @user], html: { class: 'fieldset-form' } do |f|
= form_errors(@user)
%fieldset
@@ -39,12 +39,12 @@
.col-sm-2.col-form-label
= f.label :password
.col-sm-10
- = f.password_field :password, disabled: f.object.force_random_password, class: 'form-control gl-form-input'
+ = f.password_field :password, disabled: f.object.force_random_password, autocomplete: 'new-password', class: 'form-control gl-form-input'
.form-group.row
.col-sm-2.col-form-label
= f.label :password_confirmation
.col-sm-10
- = f.password_field :password_confirmation, disabled: f.object.force_random_password, class: 'form-control gl-form-input'
+ = f.password_field :password_confirmation, disabled: f.object.force_random_password, autocomplete: 'new-password', class: 'form-control gl-form-input'
= render partial: 'access_levels', locals: { f: f }
diff --git a/app/views/admin/users/_head.html.haml b/app/views/admin/users/_head.html.haml
index f4b1a2853f1..bafb2085589 100644
--- a/app/views/admin/users/_head.html.haml
+++ b/app/views/admin/users/_head.html.haml
@@ -33,16 +33,11 @@
- if can_force_email_confirmation?(@user)
%button.btn.gl-button.btn-info.js-confirm-modal-button{ data: confirm_user_data(@user) }
= _('Confirm user')
-%ul.nav-links.nav.nav-tabs
- = nav_link(path: 'users#show') do
- = link_to _("Account"), admin_user_path(@user)
- = nav_link(path: 'users#projects') do
- = link_to _("Groups and projects"), projects_admin_user_path(@user)
- = nav_link(path: 'users#keys') do
- = link_to _("SSH keys"), keys_admin_user_path(@user)
- = nav_link(controller: :identities) do
- = link_to _("Identities"), admin_user_identities_path(@user)
+= gl_tabs_nav do
+ = gl_tab_link_to _("Account"), admin_user_path(@user)
+ = gl_tab_link_to _("Groups and projects"), projects_admin_user_path(@user)
+ = gl_tab_link_to _("SSH keys"), keys_admin_user_path(@user)
+ = gl_tab_link_to _("Identities"), admin_user_identities_path(@user)
- if impersonation_enabled?
- = nav_link(controller: :impersonation_tokens) do
- = link_to _("Impersonation Tokens"), admin_user_impersonation_tokens_path(@user)
+ = gl_tab_link_to _("Impersonation Tokens"), admin_user_impersonation_tokens_path(@user)
.gl-mb-3
diff --git a/app/views/admin/users/show.html.haml b/app/views/admin/users/show.html.haml
index ad8d9d1f04f..2a9b4694e7b 100644
--- a/app/views/admin/users/show.html.haml
+++ b/app/views/admin/users/show.html.haml
@@ -61,7 +61,6 @@
= _('Disabled')
= render_if_exists 'admin/namespace_plan_info', namespace: @user.namespace
- = render_if_exists 'admin/users/credit_card_info', user: @user
%li
%span.light= _('External User:')
@@ -139,6 +138,8 @@
= render_if_exists 'namespaces/shared_runner_status', namespace: @user.namespace
+ = render_if_exists 'admin/users/credit_card_info', user: @user, link_to_match_page: true
+
= render 'shared/custom_attributes', custom_attributes: @user.custom_attributes
-# Rendered on desktop only so order of cards can be different on desktop vs mobile
diff --git a/app/views/authentication/_authenticate.html.haml b/app/views/authentication/_authenticate.html.haml
index 5a2ae3f44c2..7dcec50573f 100644
--- a/app/views/authentication/_authenticate.html.haml
+++ b/app/views/authentication/_authenticate.html.haml
@@ -1,14 +1,17 @@
#js-authenticate-token-2fa
%a.gl-button.btn.btn-block.btn-confirm#js-login-2fa-device{ href: '#' }= _("Sign in via 2FA code")
+-# haml-lint:disable InlineJavaScript
%script#js-authenticate-token-2fa-in-progress{ type: "text/template" }
%p= _("Trying to communicate with your device. Plug it in (if you haven't already) and press the button on the device now.")
+-# haml-lint:disable InlineJavaScript
%script#js-authenticate-token-2fa-error{ type: "text/template" }
%div
%p <%= error_message %> (<%= error_name %>)
%a.btn.btn-default.gl-button.btn-block#js-token-2fa-try-again= _("Try again?")
+-# haml-lint:disable InlineJavaScript
%script#js-authenticate-token-2fa-authenticated{ type: "text/template" }
%div
%p= _("We heard back from your device. You have been authenticated.")
diff --git a/app/views/authentication/_register.html.haml b/app/views/authentication/_register.html.haml
index 678fd3c8e8c..5eed969ed35 100644
--- a/app/views/authentication/_register.html.haml
+++ b/app/views/authentication/_register.html.haml
@@ -1,8 +1,10 @@
#js-register-token-2fa
+-# haml-lint:disable InlineJavaScript
%script#js-register-2fa-message{ type: "text/template" }
%p <%= message %>
+-# haml-lint:disable InlineJavaScript
%script#js-register-token-2fa-setup{ type: "text/template" }
- if current_user.two_factor_otp_enabled?
.row.gl-mb-3
@@ -17,12 +19,14 @@
.col-md-8
%p= _("You need to register a two-factor authentication app before you can set up a device.")
+-# haml-lint:disable InlineJavaScript
%script#js-register-token-2fa-error{ type: "text/template" }
%div
%p
%span <%= error_message %> (<%= error_name %>)
%a.btn.btn-default.gl-button#js-token-2fa-try-again= _("Try again?")
+-# haml-lint:disable InlineJavaScript
%script#js-register-token-2fa-registered{ type: "text/template" }
.row.gl-mb-3
.col-md-12
diff --git a/app/views/clusters/clusters/_advanced_settings_tab.html.haml b/app/views/clusters/clusters/_advanced_settings_tab.html.haml
index b491a64e43d..8c9d98604dd 100644
--- a/app/views/clusters/clusters/_advanced_settings_tab.html.haml
+++ b/app/views/clusters/clusters/_advanced_settings_tab.html.haml
@@ -1,6 +1,5 @@
- active = params[:tab] == 'settings'
- if can_admin_cluster?(current_user, @cluster)
- %li.nav-item{ role: 'presentation' }
- %a#cluster-settings-tab.nav-link{ class: active_when(active), href: clusterable.cluster_path(@cluster.id, params: {tab: 'settings'}) }
- %span= _('Advanced Settings')
+ = gl_tab_link_to clusterable.cluster_path(@cluster.id, params: { tab: 'settings' }), { item_active: active } do
+ = _('Advanced Settings')
diff --git a/app/views/clusters/clusters/_details_tab.html.haml b/app/views/clusters/clusters/_details_tab.html.haml
index 564c5103d34..734910686e7 100644
--- a/app/views/clusters/clusters/_details_tab.html.haml
+++ b/app/views/clusters/clusters/_details_tab.html.haml
@@ -1,5 +1,4 @@
- active = params[:tab] == 'details' || !params[:tab].present?
-%li.nav-item{ role: 'presentation' }
- %a#cluster-details-tab.nav-link.qa-details{ class: active_when(active), href: clusterable.cluster_path(@cluster.id, params: {tab: 'details'}) }
- %span= _('Details')
+= gl_tab_link_to clusterable.cluster_path(@cluster.id, params: { tab: 'details' }), { item_active: active } do
+ = _('Details')
diff --git a/app/views/clusters/clusters/_health_tab.html.haml b/app/views/clusters/clusters/_health_tab.html.haml
index fda392693f6..4292066cc6f 100644
--- a/app/views/clusters/clusters/_health_tab.html.haml
+++ b/app/views/clusters/clusters/_health_tab.html.haml
@@ -1,5 +1,4 @@
- active = params[:tab] == 'health'
-%li.nav-item{ role: 'presentation' }
- %a#cluster-health-tab.nav-link.qa-health{ class: active_when(active), href: clusterable.cluster_path(@cluster.id, params: {tab: 'health'}) }
- %span= _('Health')
+= gl_tab_link_to clusterable.cluster_path(@cluster.id, params: { tab: 'health' }), { item_active: active, data: { testid: 'cluster-health-tab' } } do
+ = _('Health')
diff --git a/app/views/clusters/clusters/_integrations_tab.html.haml b/app/views/clusters/clusters/_integrations_tab.html.haml
index 77b8b6ca3e6..e229c1fbe1e 100644
--- a/app/views/clusters/clusters/_integrations_tab.html.haml
+++ b/app/views/clusters/clusters/_integrations_tab.html.haml
@@ -1,6 +1,4 @@
-- tab_name = 'integrations'
-- active = params[:tab] == tab_name
+- active = params[:tab] == 'integrations'
-%li.nav-item{ role: 'presentation' }
- %a#cluster-apps-tab.nav-link{ class: active_when(active), href: clusterable.cluster_path(@cluster.id, params: {tab: tab_name}) }
- %span= _('Integrations')
+= gl_tab_link_to clusterable.cluster_path(@cluster.id, params: { tab: 'integrations' }), { item_active: active } do
+ = _('Integrations')
diff --git a/app/views/clusters/clusters/_namespace.html.haml b/app/views/clusters/clusters/_namespace.html.haml
index 9b728e7a89b..6412972e195 100644
--- a/app/views/clusters/clusters/_namespace.html.haml
+++ b/app/views/clusters/clusters/_namespace.html.haml
@@ -1,7 +1,6 @@
- managed_namespace_help_text = s_('ClusterIntegration|Set a prefix for your namespaces. If not set, defaults to your project path. If modified, existing environments will use their current namespaces until the cluster cache is cleared.')
- non_managed_namespace_help_text = s_('ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, logs, and Web terminals.')
-- managed_namespace_help_link = link_to _('More information'), help_page_path('user/project/clusters/index.md',
- anchor: 'gitlab-managed-clusters'), target: '_blank'
+- managed_namespace_help_link = link_to _('More information'), help_page_path('user/project/clusters/gitlab_managed_clusters.md'), target: '_blank'
.js-namespace-prefixed
= platform_field.text_field :namespace,
diff --git a/app/views/clusters/clusters/aws/_new.html.haml b/app/views/clusters/clusters/aws/_new.html.haml
index 93db7db06b3..f6d50410e9a 100644
--- a/app/views/clusters/clusters/aws/_new.html.haml
+++ b/app/views/clusters/clusters/aws/_new.html.haml
@@ -12,6 +12,6 @@
'role-arn' => @aws_role.role_arn,
'instance-types' => @instance_types,
'kubernetes-integration-help-path' => help_page_path('user/project/clusters/index'),
- 'account-and-external-ids-help-path' => help_page_path('user/project/clusters/add_eks_clusters.md', anchor: 'create-a-new-certificate-based-eks-cluster'),
- 'create-role-arn-help-path' => help_page_path('user/project/clusters/add_eks_clusters.md', anchor: 'create-a-new-certificate-based-eks-cluster'),
+ 'account-and-external-ids-help-path' => help_page_path('user/project/clusters/add_eks_clusters.md', anchor: 'how-to-create-a-new-cluster-on-eks-through-cluster-certificates-deprecated'),
+ 'create-role-arn-help-path' => help_page_path('user/project/clusters/add_eks_clusters.md', anchor: 'how-to-create-a-new-cluster-on-eks-through-cluster-certificates-deprecated'),
'external-link-icon' => sprite_icon('external-link') } }
diff --git a/app/views/clusters/clusters/show.html.haml b/app/views/clusters/clusters/show.html.haml
index 0a482f1eb01..2a09d8d8cc0 100644
--- a/app/views/clusters/clusters/show.html.haml
+++ b/app/views/clusters/clusters/show.html.haml
@@ -15,7 +15,7 @@
provider_type: @cluster.provider_type,
help_path: help_page_path('user/project/clusters/index.md'),
environments_help_path: help_page_path('ci/environments/index.md', anchor: 'create-a-static-environment'),
- clusters_help_path: help_page_path('user/project/clusters/index.md', anchor: 'deploying-to-a-kubernetes-cluster'),
+ clusters_help_path: help_page_path('user/project/clusters/deploy_to_cluster.md'),
deploy_boards_help_path: help_page_path('user/project/deploy_boards.md', anchor: 'enabling-deploy-boards'),
cluster_id: @cluster.id } }
@@ -24,11 +24,10 @@
.js-serverless-survey-banner{ data: { user_name: current_user.name, user_email: current_user.email } }
- .d-flex.my-3
- %p.badge.badge-light.p-2.mr-2
+ %h4.gl-my-5
+ = @cluster.name
+ %span.badge.badge-info.badge-pill.gl-badge.md.gl-vertical-align-middle
= cluster_type_label(@cluster.cluster_type)
- %h4.m-0
- = @cluster.name
= render 'banner'
@@ -42,12 +41,12 @@
- if cluster_created?(@cluster)
.js-toggle-container
- %ul.nav-links.mobile-separator.nav.nav-tabs{ role: 'tablist' }
- = render 'details_tab'
+ = gl_tabs_nav do
+ = render 'clusters/clusters/details_tab'
= render_if_exists 'clusters/clusters/environments_tab'
= render 'clusters/clusters/health_tab'
- = render 'integrations_tab'
- = render 'advanced_settings_tab'
+ = render 'clusters/clusters/integrations_tab'
+ = render 'clusters/clusters/advanced_settings_tab'
.tab-content.py-3
.tab-pane.active{ role: 'tabpanel' }
diff --git a/app/views/dashboard/_activity_head.html.haml b/app/views/dashboard/_activity_head.html.haml
index 0daadd20f54..c65b947d1ba 100644
--- a/app/views/dashboard/_activity_head.html.haml
+++ b/app/views/dashboard/_activity_head.html.haml
@@ -2,13 +2,7 @@
%h1.page-title= _('Activity')
.top-area
- %ul.nav-links.nav.nav-tabs
- %li{ class: active_when(params[:filter].nil?) }>
- = link_to activity_dashboard_path, class: 'shortcuts-activity', data: {placement: 'right'} do
- = _('Your projects')
- %li{ class: active_when(params[:filter] == 'starred') }>
- = link_to activity_dashboard_path(filter: 'starred'), data: {placement: 'right'} do
- = _('Starred projects')
- %li{ class: active_when(params[:filter] == 'followed') }>
- = link_to activity_dashboard_path(filter: 'followed'), data: {placement: 'right'} do
- = _('Followed users')
+ = gl_tabs_nav({ class: 'gl-border-b-0', data: { testid: 'dashboard-activity-tabs' } }) do
+ = gl_tab_link_to _("Your projects"), activity_dashboard_path, { item_active: params[:filter].nil? }
+ = gl_tab_link_to _("Starred projects"), activity_dashboard_path(filter: 'starred')
+ = gl_tab_link_to _("Followed users"), activity_dashboard_path(filter: 'followed')
diff --git a/app/views/dashboard/_groups_head.html.haml b/app/views/dashboard/_groups_head.html.haml
index b92f35c108c..7b1d25b9b43 100644
--- a/app/views/dashboard/_groups_head.html.haml
+++ b/app/views/dashboard/_groups_head.html.haml
@@ -6,13 +6,9 @@
= link_to _("New group"), new_group_path, class: "gl-button btn btn-confirm", data: { testid: "new-group-button" }
.top-area
- %ul.nav-links.mobile-separator.nav.nav-tabs
- = nav_link(page: dashboard_groups_path) do
- = link_to dashboard_groups_path, title: _("Your groups") do
- Your groups
- = nav_link(page: explore_groups_path) do
- = link_to explore_groups_path, title: _("Explore public groups") do
- Explore public groups
+ = gl_tabs_nav({ class: 'gl-flex-grow-1 gl-border-0' }) do
+ = gl_tab_link_to _("Your groups"), dashboard_groups_path
+ = gl_tab_link_to _("Explore public groups"), explore_groups_path
.nav-controls
= render 'shared/groups/search_form'
= render 'shared/groups/dropdown'
diff --git a/app/views/devise/confirmations/almost_there.haml b/app/views/devise/confirmations/almost_there.haml
index 037b2f247c1..9fb0fb734f9 100644
--- a/app/views/devise/confirmations/almost_there.haml
+++ b/app/views/devise/confirmations/almost_there.haml
@@ -1,16 +1,15 @@
- user_email = "(#{params[:email]})" if params[:email].present?
+- request_link_start = '<a href="%{new_user_confirmation_path}">'.html_safe % { new_user_confirmation_path: new_user_confirmation_path }
+- request_link_end = '</a>'.html_safe
.well-confirmation.gl-text-center.gl-mb-6
%h1.gl-mt-0
= _("Almost there...")
- %p.lead.gl-mb-6
+ %p{ class: 'gl-mb-6 gl-font-lg!' }
= _('Please check your email %{email} to confirm your account') % { email: user_email }
%hr
- if Gitlab::CurrentSettings.after_sign_up_text.present?
.well-confirmation.gl-text-center
= markdown_field(Gitlab::CurrentSettings, :after_sign_up_text)
-%p.text-center
- = _("No confirmation email received? Please check your spam folder or")
-.gl-mb-6.prepend-top-20.gl-text-center
- %a.gl-link{ href: new_user_confirmation_path }
- = _("Request new confirmation email")
+%p.gl-text-center
+ = _("No confirmation email received? Check your spam folder or %{request_link_start}request new confirmation email%{request_link_end}.").html_safe % { request_link_start: request_link_start, request_link_end: request_link_end }
diff --git a/app/views/devise/mailer/_confirmation_instructions_secondary.text.erb b/app/views/devise/mailer/_confirmation_instructions_secondary.text.erb
index ab46aaaca1a..32e88047a9c 100644
--- a/app/views/devise/mailer/_confirmation_instructions_secondary.text.erb
+++ b/app/views/devise/mailer/_confirmation_instructions_secondary.text.erb
@@ -1,4 +1,4 @@
-<%= _(" %{name}, confirm your email address now! ") % { name: @resource.user.name } %>
+<%= _("%{name}, confirm your email address now!") % { name: @resource.user.name } %>
<%= _("Use the link below to confirm your email address (%{email})") % { email: @resource.email } %>
diff --git a/app/views/devise/passwords/edit.html.haml b/app/views/devise/passwords/edit.html.haml
index 10c04423589..56bd30fac73 100644
--- a/app/views/devise/passwords/edit.html.haml
+++ b/app/views/devise/passwords/edit.html.haml
@@ -7,10 +7,10 @@
= f.hidden_field :reset_password_token
.form-group
= f.label _('New password'), for: "user_password"
- = f.password_field :password, class: "form-control gl-form-input top", required: true, title: _('This field is required.'), data: { qa_selector: 'password_field'}
+ = f.password_field :password, autocomplete: 'new-password', class: "form-control gl-form-input top", required: true, title: _('This field is required.'), data: { qa_selector: 'password_field'}
.form-group
= f.label _('Confirm new password'), for: "user_password_confirmation"
- = f.password_field :password_confirmation, class: "form-control gl-form-input bottom", title: _('This field is required.'), data: { qa_selector: 'password_confirmation_field' }, required: true
+ = f.password_field :password_confirmation, autocomplete: 'new-password', class: "form-control gl-form-input bottom", title: _('This field is required.'), data: { qa_selector: 'password_confirmation_field' }, required: true
.clearfix
= f.submit _("Change your password"), class: "gl-button btn btn-confirm", data: { qa_selector: 'change_password_button' }
diff --git a/app/views/devise/registrations/new.html.haml b/app/views/devise/registrations/new.html.haml
index 4ec3fcde337..87108c8ea78 100644
--- a/app/views/devise/registrations/new.html.haml
+++ b/app/views/devise/registrations/new.html.haml
@@ -2,6 +2,7 @@
- add_page_specific_style 'page_bundles/signup'
- content_for :page_specific_javascripts do
= render "layouts/google_tag_manager_head"
+ = render "layouts/one_trust"
= render "layouts/google_tag_manager_body"
.signup-page
diff --git a/app/views/devise/sessions/_new_base.html.haml b/app/views/devise/sessions/_new_base.html.haml
index 82c0df354d4..b40373ecc37 100644
--- a/app/views/devise/sessions/_new_base.html.haml
+++ b/app/views/devise/sessions/_new_base.html.haml
@@ -4,12 +4,12 @@
= f.text_field :login, value: @invite_email, class: 'form-control gl-form-input top', autofocus: 'autofocus', autocapitalize: 'off', autocorrect: 'off', required: true, title: _('This field is required.'), data: { qa_selector: 'login_field' }
.form-group
= f.label :password, class: 'label-bold'
- = f.password_field :password, class: 'form-control gl-form-input bottom', required: true, title: _('This field is required.'), data: { qa_selector: 'password_field' }
+ = f.password_field :password, class: 'form-control gl-form-input bottom', autocomplete: 'current-password', required: true, title: _('This field is required.'), data: { qa_selector: 'password_field' }
- if devise_mapping.rememberable?
- .remember-me
+ %div
%label{ for: 'user_remember_me' }
- = f.check_box :remember_me, class: 'remember-me-checkbox'
- %span Remember me
+ = f.check_box :remember_me
+ %span= _('Remember me')
.float-right
- if unconfirmed_email?
= link_to _('Resend confirmation email'), new_user_confirmation_path
diff --git a/app/views/devise/sessions/_new_crowd.html.haml b/app/views/devise/sessions/_new_crowd.html.haml
index 769268748f4..fb4c011dd49 100644
--- a/app/views/devise/sessions/_new_crowd.html.haml
+++ b/app/views/devise/sessions/_new_crowd.html.haml
@@ -4,7 +4,7 @@
= text_field_tag :username, nil, { class: "form-control top", title: _("This field is required."), autofocus: "autofocus", required: true }
.form-group
= label_tag :password
- = password_field_tag :password, nil, { class: "form-control bottom", title: _("This field is required."), required: true }
+ = password_field_tag :password, nil, { autocomplete: 'current-password', class: "form-control bottom", title: _("This field is required."), required: true }
- if devise_mapping.rememberable?
.remember-me
%label{ for: "remember_me" }
diff --git a/app/views/devise/sessions/_new_ldap.html.haml b/app/views/devise/sessions/_new_ldap.html.haml
index f599a652b71..fea58779c17 100644
--- a/app/views/devise/sessions/_new_ldap.html.haml
+++ b/app/views/devise/sessions/_new_ldap.html.haml
@@ -8,7 +8,7 @@
= text_field_tag :username, nil, { class: "form-control gl-form-input top", title: _("This field is required."), autofocus: "autofocus", data: { qa_selector: 'username_field' }, required: true }
.form-group
= label_tag :password
- = password_field_tag :password, nil, { class: "form-control gl-form-input bottom", title: _("This field is required."), data: { qa_selector: 'password_field' }, required: true }
+ = password_field_tag :password, nil, { autocomplete: 'current-password', class: "form-control gl-form-input bottom", title: _("This field is required."), data: { qa_selector: 'password_field' }, required: true }
- if !hide_remember_me && devise_mapping.rememberable?
.remember-me
%label{ for: "remember_me" }
diff --git a/app/views/devise/sessions/new.html.haml b/app/views/devise/sessions/new.html.haml
index 74f3e3e7e34..da6232b2a2b 100644
--- a/app/views/devise/sessions/new.html.haml
+++ b/app/views/devise/sessions/new.html.haml
@@ -1,6 +1,7 @@
- page_title _("Sign in")
- content_for :page_specific_javascripts do
= render "layouts/google_tag_manager_head"
+ = render "layouts/one_trust"
= render "layouts/google_tag_manager_body"
#signin-container
diff --git a/app/views/devise/shared/_omniauth_box.html.haml b/app/views/devise/shared/_omniauth_box.html.haml
index 1752a43b032..bd7fe41ae8d 100644
--- a/app/views/devise/shared/_omniauth_box.html.haml
+++ b/app/views/devise/shared/_omniauth_box.html.haml
@@ -1,20 +1,20 @@
- hide_remember_me = local_assigns.fetch(:hide_remember_me, false)
.omniauth-container.gl-mt-5
- %label.label-bold.d-block
+ %label.gl-font-weight-bold
= _('Sign in with')
- providers = enabled_button_based_providers
- .d-flex.justify-content-between.flex-wrap
+ .gl-display-flex.gl-justify-content-between.gl-flex-wrap
- providers.each do |provider|
- has_icon = provider_has_icon?(provider)
- = button_to omniauth_authorize_path(:user, provider), id: "oauth-login-#{provider}", class: "btn gl-button btn-default omniauth-btn oauth-login #{qa_class_for_provider(provider)}", form: { class: 'gl-w-full' } do
+ = button_to omniauth_authorize_path(:user, provider), id: "oauth-login-#{provider}", class: "btn gl-button btn-default gl-w-full js-oauth-login #{qa_class_for_provider(provider)}", form: { class: 'gl-w-full gl-mb-3' } do
- if has_icon
= provider_image_tag(provider)
%span.gl-button-text
= label_for_provider(provider)
- unless hide_remember_me
- %fieldset.remember-me
+ %fieldset
%label
- = check_box_tag :remember_me, nil, false, class: 'remember-me-checkbox'
+ = check_box_tag :remember_me, nil, false
%span
= _('Remember me')
diff --git a/app/views/devise/shared/_signup_box.html.haml b/app/views/devise/shared/_signup_box.html.haml
index f9649875538..15143684b8b 100644
--- a/app/views/devise/shared/_signup_box.html.haml
+++ b/app/views/devise/shared/_signup_box.html.haml
@@ -53,6 +53,7 @@
= f.password_field :password,
class: 'form-control gl-form-input bottom',
data: { qa_selector: 'new_user_password_field' },
+ autocomplete: 'new-password',
required: true,
pattern: ".{#{@minimum_password_length},}",
title: s_('SignUp|Minimum length is %{minimum_password_length} characters.') % { minimum_password_length: @minimum_password_length }
diff --git a/app/views/devise/shared/_signup_omniauth_provider_list.haml b/app/views/devise/shared/_signup_omniauth_provider_list.haml
index 43e0802ee2a..c24e8770f05 100644
--- a/app/views/devise/shared/_signup_omniauth_provider_list.haml
+++ b/app/views/devise/shared/_signup_omniauth_provider_list.haml
@@ -1,9 +1,9 @@
-%label.label-bold.d-block
+%label.gl-font-weight-bold
= _("Create an account using:")
-.d-flex.justify-content-between.flex-wrap
+.gl-display-flex.gl-justify-content-between.gl-flex-wrap
- providers.each do |provider|
- = link_to omniauth_authorize_path(:user, provider), method: :post, class: "btn gl-button btn-default gl-display-flex gl-align-items-center gl-text-left gl-mb-2 gl-p-2 omniauth-btn oauth-login #{qa_class_for_provider(provider)}", id: "oauth-login-#{provider}" do
+ = link_to omniauth_authorize_path(:user, provider), method: :post, class: "btn gl-button btn-default gl-w-full gl-mb-3 js-oauth-login #{qa_class_for_provider(provider)}", id: "oauth-login-#{provider}" do
- if provider_has_icon?(provider)
= provider_image_tag(provider)
- %span.ml-2
+ %span.gl-button-text
= label_for_provider(provider)
diff --git a/app/views/devise/shared/_signup_omniauth_providers.haml b/app/views/devise/shared/_signup_omniauth_providers.haml
index a653d44d694..30a54ab86a6 100644
--- a/app/views/devise/shared/_signup_omniauth_providers.haml
+++ b/app/views/devise/shared/_signup_omniauth_providers.haml
@@ -1,3 +1,3 @@
-.omniauth-divider.d-flex.align-items-center.text-center
+.omniauth-divider.gl-display-flex.gl-align-items-center
= _("or")
= render 'devise/shared/signup_omniauth_provider_list', providers: enabled_button_based_providers
diff --git a/app/views/devise/shared/_signup_omniauth_providers_top.haml b/app/views/devise/shared/_signup_omniauth_providers_top.haml
index 9a2629443ed..8eb22c0b023 100644
--- a/app/views/devise/shared/_signup_omniauth_providers_top.haml
+++ b/app/views/devise/shared/_signup_omniauth_providers_top.haml
@@ -1,3 +1,3 @@
= render 'devise/shared/signup_omniauth_provider_list', providers: popular_enabled_button_based_providers
-.omniauth-divider.d-flex.align-items-center.text-center
+.omniauth-divider.gl-display-flex.gl-align-items-center
= _("or")
diff --git a/app/views/groups/_group_admin_settings.html.haml b/app/views/groups/_group_admin_settings.html.haml
index ea191449fe3..ab6861b5f24 100644
--- a/app/views/groups/_group_admin_settings.html.haml
+++ b/app/views/groups/_group_admin_settings.html.haml
@@ -36,4 +36,4 @@
.offset-sm-2.col-sm-10
.form-check
= f.text_field :two_factor_grace_period, class: 'form-control'
- .form-text.text-muted= _("Amount of time (in hours) that users are allowed to skip forced configuration of two-factor authentication")
+ .form-text.text-muted= _("Time (in hours) that users are allowed to skip forced configuration of two-factor authentication.")
diff --git a/app/views/groups/_home_panel.html.haml b/app/views/groups/_home_panel.html.haml
index 0352f366f5d..e530d9c60b6 100644
--- a/app/views/groups/_home_panel.html.haml
+++ b/app/views/groups/_home_panel.html.haml
@@ -5,17 +5,19 @@
.group-home-panel
.row.mb-3
.home-panel-title-row.col-md-12.col-lg-6.d-flex
- .avatar-container.rect-avatar.s64.home-panel-avatar.gl-mr-3.float-none
+ .avatar-container.rect-avatar.s64.home-panel-avatar.gl-flex-shrink-0.float-none{ class: 'gl-mr-3!' }
= group_icon(@group, class: 'avatar avatar-tile s64', width: 64, height: 64, itemprop: 'logo')
.d-flex.flex-column.flex-wrap.align-items-baseline
.d-inline-flex.align-items-baseline
- %h1.home-panel-title.gl-mt-3.gl-mb-2{ itemprop: 'name' }
+ %h1.home-panel-title.gl-mt-3.gl-mb-2.gl-ml-3{ itemprop: 'name' }
= @group.name
%span.visibility-icon.text-secondary.gl-ml-2.has-tooltip{ data: { container: 'body' }, title: visibility_icon_description(@group) }
= visibility_level_icon(@group.visibility_level, options: {class: 'icon'})
- .home-panel-metadata.text-secondary
- %span
- = _("Group ID: %{group_id}") % { group_id: @group.id }
+ .home-panel-metadata.text-secondary.gl-font-base.gl-font-weight-normal.gl-line-height-normal
+ - if can?(current_user, :read_group, @group)
+ - button_class = "btn gl-button btn-sm btn-tertiary btn-default-tertiary home-panel-metadata"
+ - button_text = s_('GroupPage|Group ID: %{group_id}') % { group_id: @group.id }
+ = clipboard_button(title: s_('GroupPage|Copy group ID'), text: @group.id, hide_button_icon: true, button_text: button_text, class: button_class, qa_selector: 'group_id_content', itemprop: 'identifier')
- if current_user
%span.gl-ml-3
= render 'shared/members/access_request_links', source: @group
diff --git a/app/views/groups/_import_group_from_another_instance_panel.html.haml b/app/views/groups/_import_group_from_another_instance_panel.html.haml
index 2b9277c67e9..06a86c2465f 100644
--- a/app/views/groups/_import_group_from_another_instance_panel.html.haml
+++ b/app/views/groups/_import_group_from_another_instance_panel.html.haml
@@ -1,16 +1,15 @@
= form_with url: configure_import_bulk_imports_path, class: 'group-form gl-show-field-errors' do |f|
.gl-border-l-solid.gl-border-r-solid.gl-border-gray-100.gl-border-1.gl-p-5
- %h4.gl-display-flex
- = s_('GroupsNew|Import groups from another instance of GitLab')
- %span.badge.badge-info.badge-pill.gl-badge.md.gl-ml-3
- = _('Beta')
+ .gl-display-flex.gl-align-items-center
+ %h4.gl-display-flex
+ = s_('GroupsNew|Import groups from another instance of GitLab')
+ = link_to _('History'), history_import_bulk_imports_path, class: 'gl-link gl-ml-auto'
.gl-alert.gl-alert-warning{ role: 'alert' }
= sprite_icon('warning', css_class: 'gl-icon s16 gl-alert-icon gl-alert-icon-no-title')
.gl-alert-body
- docs_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: help_page_path('user/group/import/index.md') }
- - feedback_link_start = '<a href="https://gitlab.com/gitlab-org/gitlab/-/issues/284495" target="_blank" rel="noopener noreferrer">'.html_safe
- - link_end = '</a>'.html_safe
- = s_('GroupsNew|Not all related objects are migrated, as %{docs_link_start}described here%{docs_link_end}. Please %{feedback_link_start}leave feedback%{feedback_link_end} on this feature.').html_safe % { docs_link_start: docs_link_start, docs_link_end: link_end, feedback_link_start: feedback_link_start, feedback_link_end: link_end }
+ - docs_link_end = '</a>'.html_safe
+ = s_('GroupsNew|Not all related objects are migrated. %{docs_link_start}More info%{docs_link_end}.').html_safe % { docs_link_start: docs_link_start, docs_link_end: docs_link_end }
%p.gl-mt-3
= s_('GroupsNew|Provide credentials for another instance of GitLab to import your groups directly.')
.form-group.gl-display-flex.gl-flex-direction-column
diff --git a/app/views/groups/dependency_proxies/_url.html.haml b/app/views/groups/dependency_proxies/_url.html.haml
deleted file mode 100644
index 9a76da63a72..00000000000
--- a/app/views/groups/dependency_proxies/_url.html.haml
+++ /dev/null
@@ -1,12 +0,0 @@
-- proxy_url = @group.dependency_proxy_image_prefix
-
-%h5.prepend-top-20= _('Dependency proxy image prefix')
-
-.row
- .col-lg-8.col-md-12.input-group
- = text_field_tag :url, "#{proxy_url}", class: 'js-dependency-proxy-url form-control', readonly: true
- = clipboard_button(text: "#{proxy_url}", title: _("Copy %{proxy_url}") % { proxy_url: proxy_url })
-
-.row
- .col-12.help-block.gl-mt-3{ data: { qa_selector: 'dependency_proxy_count' } }
- = _('Contains %{count} blobs of images (%{size})') % { count: @blobs_count, size: number_to_human_size(@blobs_total_size) }
diff --git a/app/views/groups/dependency_proxies/show.html.haml b/app/views/groups/dependency_proxies/show.html.haml
index 177018af830..8936c4dcbb4 100644
--- a/app/views/groups/dependency_proxies/show.html.haml
+++ b/app/views/groups/dependency_proxies/show.html.haml
@@ -1,30 +1,5 @@
- page_title _("Dependency Proxy")
+- dependency_proxy_available = Feature.enabled?(:dependency_proxy_for_private_groups, default_enabled: true) || @group.public?
-.settings-header
- %h4= _('Dependency proxy')
-
- %p
- - link_start = '<a href="%{url}">'.html_safe % { url: help_page_path('user/packages/dependency_proxy/index') }
- = _('Create a local proxy for storing frequently used upstream images. %{link_start}Learn more%{link_end} about dependency proxies.').html_safe % { link_start: link_start, link_end: '</a>'.html_safe }
-
-- if Feature.enabled?(:dependency_proxy_for_private_groups, default_enabled: true) || @group.public?
- - if can?(current_user, :admin_dependency_proxy, @group)
- = form_for(@dependency_proxy, method: :put, url: group_dependency_proxy_path(@group)) do |f|
- .form-group
- %h5.prepend-top-20= _('Enable proxy')
- .js-dependency-proxy-toggle-area
- = render "shared/buttons/project_feature_toggle", is_checked: @dependency_proxy.enabled?, label: s_("DependencyProxy|Toggle Dependency Proxy"), data: { qa_selector: 'dependency_proxy_setting_toggle' } do
- = f.hidden_field :enabled, { class: 'js-project-feature-toggle-input'}
-
- - if @dependency_proxy.enabled
- = render 'groups/dependency_proxies/url'
-
- - else
- - if @dependency_proxy.enabled
- = render 'groups/dependency_proxies/url'
-- else
- .gl-alert.gl-alert-info
- .gl-alert-container
- = sprite_icon('information-o', size: 16, css_class: 'gl-icon gl-alert-icon gl-alert-icon-no-title')
- .gl-alert-content
- = _('Dependency proxy feature is limited to public groups for now.')
+#js-dependency-proxy{ data: { group_path: @group.full_path,
+ dependency_proxy_available: dependency_proxy_available.to_s } }
diff --git a/app/views/groups/edit.html.haml b/app/views/groups/edit.html.haml
index 6e355d31204..420771257c9 100644
--- a/app/views/groups/edit.html.haml
+++ b/app/views/groups/edit.html.haml
@@ -1,5 +1,5 @@
-- breadcrumb_title _("General Settings")
-- page_title _("General Settings")
+- breadcrumb_title _("General settings")
+- page_title _("General settings")
- @content_class = "limit-container-width" unless fluid_layout
- expanded = expanded_by_default?
@@ -13,6 +13,7 @@
= _('Collapse')
%p
= _('Update your group name, description, avatar, and visibility.')
+ = link_to s_('Learn more about groups.'), help_page_path('user/group/index')
.settings-content
= render 'groups/settings/general'
@@ -23,7 +24,7 @@
%button.btn.gl-button.js-settings-toggle{ type: 'button' }
= expanded ? _('Collapse') : _('Expand')
%p
- = _('Advanced permissions, Large File Storage and Two-Factor authentication settings.')
+ = _('Configure advanced permissions, Large File Storage, and two-factor authentication settings.')
.settings-content
= render 'groups/settings/permissions'
diff --git a/app/views/groups/issues.html.haml b/app/views/groups/issues.html.haml
index 1f746484b7d..0c6776a6038 100644
--- a/app/views/groups/issues.html.haml
+++ b/app/views/groups/issues.html.haml
@@ -6,7 +6,7 @@
= auto_discovery_link_tag(:atom, safe_params.merge(rss_url_options).to_h, title: "#{@group.name} issues")
- if Feature.enabled?(:vue_issues_list, @group, default_enabled: :yaml)
- .js-issues-list{ data: group_issues_list_data(@group, current_user, @issues) }
+ .js-issues-list{ data: group_issues_list_data(@group, current_user, @issues, @projects) }
- if @can_bulk_update
= render_if_exists 'shared/issuable/group_bulk_update_sidebar', group: @group, type: :issues
- else
diff --git a/app/views/groups/registry/repositories/index.html.haml b/app/views/groups/registry/repositories/index.html.haml
index fa6bd021e45..2901c8fa46b 100644
--- a/app/views/groups/registry/repositories/index.html.haml
+++ b/app/views/groups/registry/repositories/index.html.haml
@@ -16,7 +16,8 @@
is_group_page: "true",
"group_path": @group.full_path,
"gid_prefix": container_repository_gid_prefix,
- character_error: @character_error.to_s,
+ connection_error: (!!@connection_error).to_s,
+ invalid_path_error: (!!@invalid_path_error).to_s,
user_callouts_path: user_callouts_path,
user_callout_id: UserCalloutsHelper::UNFINISHED_TAG_CLEANUP_CALLOUT,
show_unfinished_tag_cleanup_callout: show_unfinished_tag_cleanup_callout?.to_s } }
diff --git a/app/views/groups/runners/_runner.html.haml b/app/views/groups/runners/_runner.html.haml
index 66ffef98553..a76701ea5d2 100644
--- a/app/views/groups/runners/_runner.html.haml
+++ b/app/views/groups/runners/_runner.html.haml
@@ -39,7 +39,7 @@
- if runner.group_type?
= _('n/a')
- else
- = runner.projects.count(:all)
+ = runner.runner_projects.count(:all)
.table-section.section-5
.table-mobile-header{ role: 'rowheader' }= _('Jobs')
diff --git a/app/views/groups/settings/_general.html.haml b/app/views/groups/settings/_general.html.haml
index 7a2d5c91af6..ed76a9fe253 100644
--- a/app/views/groups/settings/_general.html.haml
+++ b/app/views/groups/settings/_general.html.haml
@@ -14,8 +14,9 @@
.row.gl-mt-3
.form-group.col-md-9
- = f.label :description, _('Group description (optional)'), class: 'label-bold'
+ = f.label :description, _('Group description'), class: 'label-bold'
= f.text_area :description, class: 'form-control', rows: 3, maxlength: 250
+ .form-text.text-muted= _('Optional.')
= render_if_exists 'shared/repository_size_limit_setting', form: f, type: :group
diff --git a/app/views/groups/settings/_lfs.html.haml b/app/views/groups/settings/_lfs.html.haml
index 1255a2901ea..9f04b579a97 100644
--- a/app/views/groups/settings/_lfs.html.haml
+++ b/app/views/groups/settings/_lfs.html.haml
@@ -3,10 +3,10 @@
%h5= _('Large File Storage')
-%p= s_('Check the %{docs_link_start}documentation%{docs_link_end}.').html_safe % { docs_link_start: docs_link_start, docs_link_end: '</a>'.html_safe }
+%p= s_('%{docs_link_start}What is Large File Storage?%{docs_link_end}').html_safe % { docs_link_start: docs_link_start, docs_link_end: '</a>'.html_safe }
.form-group.gl-mb-3
= f.gitlab_ui_checkbox_component :lfs_enabled,
_('Allow projects within this group to use Git LFS'),
- help_text: _('This setting can be overridden in each project.'),
+ help_text: _('Can be overridden in each project.'),
checkbox_options: { checked: @group.lfs_enabled?, data: { qa_selector: 'lfs_checkbox' } }
diff --git a/app/views/groups/settings/_permissions.html.haml b/app/views/groups/settings/_permissions.html.haml
index 8f428909e60..eb38aa43881 100644
--- a/app/views/groups/settings/_permissions.html.haml
+++ b/app/views/groups/settings/_permissions.html.haml
@@ -7,7 +7,7 @@
- if @group.root?
.form-group.gl-mb-3
= f.gitlab_ui_checkbox_component :prevent_sharing_groups_outside_hierarchy,
- s_('GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups.').html_safe % { group: link_to_group(@group) },
+ s_('GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups').html_safe % { group: link_to_group(@group) },
help_text: prevent_sharing_groups_outside_hierarchy_help_text(@group),
checkbox_options: { disabled: !can_change_prevent_sharing_groups_outside_hierarchy?(@group) }
@@ -21,13 +21,13 @@
= f.gitlab_ui_checkbox_component :emails_disabled,
s_('GroupSettings|Disable email notifications'),
checkbox_options: { checked: @group.emails_disabled?, disabled: !can_disable_group_emails?(@group) },
- help_text: s_('GroupSettings|This setting will override user notification preferences for all members of the group, subgroups, and projects.')
+ help_text: s_('GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects.')
.form-group.gl-mb-3
= f.gitlab_ui_checkbox_component :mentions_disabled,
s_('GroupSettings|Disable group mentions'),
checkbox_options: { checked: @group.mentions_disabled? },
- help_text: s_('GroupSettings|This setting will prevent group members from being notified if the group is mentioned.')
+ help_text: s_('GroupSettings|Prevents group members from being notified if the group is mentioned.')
= render 'groups/settings/project_access_token_creation', f: f, group: @group
= render_if_exists 'groups/settings/delayed_project_removal', f: f, group: @group
diff --git a/app/views/groups/settings/_two_factor_auth.html.haml b/app/views/groups/settings/_two_factor_auth.html.haml
index 8204cafcb44..f86bcb24e63 100644
--- a/app/views/groups/settings/_two_factor_auth.html.haml
+++ b/app/views/groups/settings/_two_factor_auth.html.haml
@@ -4,16 +4,16 @@
%h5= _('Two-factor authentication')
-%p= s_('Check the %{docs_link_start}documentation%{docs_link_end}.').html_safe % { docs_link_start: docs_link_start, docs_link_end: '</a>'.html_safe }
+%p= s_('%{docs_link_start}What is two-factor authentication?%{docs_link_end}').html_safe % { docs_link_start: docs_link_start, docs_link_end: '</a>'.html_safe }
.form-group
= f.gitlab_ui_checkbox_component :require_two_factor_authentication,
- _('Require all users in this group to setup two-factor authentication'),
+ _('Require all users in this group to set up two-factor authentication'),
checkbox_options: { data: { qa_selector: 'require_2fa_checkbox' } }
.form-group
- = f.label :two_factor_grace_period, _('Time before enforced'), class: 'label-bold'
- = f.text_field :two_factor_grace_period, class: 'form-control form-control-sm w-auto'
- .form-text.text-muted= _('Amount of time (in hours) that users are allowed to skip forced configuration of two-factor authentication')
+ = f.label :two_factor_grace_period, _('Time before enforced')
+ = f.text_field :two_factor_grace_period, class: 'form-control form-control-sm w-auto gl-form-input gl-mb-3'
+ .form-text.text-muted= _('Time (in hours) that users are allowed to skip forced configuration of two-factor authentication.')
- unless group.has_parent?
.form-group
= f.gitlab_ui_checkbox_component :allow_mfa_for_subgroups,
diff --git a/app/views/groups/settings/packages_and_registries/show.html.haml b/app/views/groups/settings/packages_and_registries/show.html.haml
index 1a12ad4902b..7be6dc73c49 100644
--- a/app/views/groups/settings/packages_and_registries/show.html.haml
+++ b/app/views/groups/settings/packages_and_registries/show.html.haml
@@ -1,5 +1,8 @@
- breadcrumb_title _('Packages & Registries')
- page_title _('Packages & Registries')
- @content_class = 'limit-container-width' unless fluid_layout
+- dependency_proxy_available = Feature.enabled?(:dependency_proxy_for_private_groups, default_enabled: true) || @group.public?
-%section#js-packages-and-registries-settings{ data: { default_expanded: expanded_by_default?.to_s, group_path: @group.full_path } }
+%section#js-packages-and-registries-settings{ data: { default_expanded: expanded_by_default?.to_s,
+ group_path: @group.full_path,
+ dependency_proxy_available: dependency_proxy_available.to_s } }
diff --git a/app/views/help/instance_configuration/_gitlab_pages.html.haml b/app/views/help/instance_configuration/_gitlab_pages.html.haml
index 51835c202d6..1d8958c93e8 100644
--- a/app/views/help/instance_configuration/_gitlab_pages.html.haml
+++ b/app/views/help/instance_configuration/_gitlab_pages.html.haml
@@ -7,7 +7,7 @@
= _('GitLab Pages')
%p
- - link_to_gitlab_pages = link_to(_('GitLab Pages'), gitlab_pages[:url], target: '_blank')
+ - link_to_gitlab_pages = link_to(_('GitLab Pages'), gitlab_pages[:url], target: '_blank', rel: 'noopener noreferrer')
= _('Below are the settings for %{link_to_gitlab_pages}.').html_safe % { link_to_gitlab_pages: link_to_gitlab_pages }
.table-responsive
%table
diff --git a/app/views/help/instance_configuration/_rate_limits.html.haml b/app/views/help/instance_configuration/_rate_limits.html.haml
index d72bd845c5b..ed71b5a609c 100644
--- a/app/views/help/instance_configuration/_rate_limits.html.haml
+++ b/app/views/help/instance_configuration/_rate_limits.html.haml
@@ -24,6 +24,7 @@
= render 'help/instance_configuration/rate_limit_row', title: _('Protected Paths: requests'), rate_limit: rate_limits[:protected_paths]
= render 'help/instance_configuration/rate_limit_row', title: _('Package Registry: unauthenticated API requests'), rate_limit: rate_limits[:unauthenticated_packages_api], public_visible: true
= render 'help/instance_configuration/rate_limit_row', title: _('Package Registry: authenticated API requests'), rate_limit: rate_limits[:authenticated_packages_api]
+ = render 'help/instance_configuration/rate_limit_row', title: _('Authenticated Git LFS requests'), rate_limit: rate_limits[:authenticated_git_lfs_api]
= render 'help/instance_configuration/rate_limit_row', title: _('Issue creation requests'), rate_limit: rate_limits[:issue_creation]
= render 'help/instance_configuration/rate_limit_row', title: _('Note creation requests'), rate_limit: rate_limits[:note_creation]
= render 'help/instance_configuration/rate_limit_row', title: _('Project export requests'), rate_limit: rate_limits[:project_export]
diff --git a/app/views/import/_githubish_status.html.haml b/app/views/import/_githubish_status.html.haml
index 02a8f3142c6..8f18d68fd55 100644
--- a/app/views/import/_githubish_status.html.haml
+++ b/app/views/import/_githubish_status.html.haml
@@ -6,7 +6,7 @@
- provider_title = Gitlab::ImportSources.title(provider)
- header_title _("New project"), new_project_path
-- add_to_breadcrumbs s_('ProjectsNew|Import project'), new_projects_path(anchor: 'import_project')
+- add_to_breadcrumbs s_('ProjectsNew|Import project'), new_project_path(anchor: 'import_project')
#import-projects-mount-element{ data: { provider: provider, provider_title: provider_title,
can_select_namespace: current_user.can_select_namespace?.to_s,
diff --git a/app/views/import/bitbucket_server/new.html.haml b/app/views/import/bitbucket_server/new.html.haml
index ce6bdd7a2fb..721447186a6 100644
--- a/app/views/import/bitbucket_server/new.html.haml
+++ b/app/views/import/bitbucket_server/new.html.haml
@@ -1,6 +1,6 @@
- page_title _('Bitbucket Server Import')
- header_title _("New project"), new_project_path
-- add_to_breadcrumbs s_('ProjectsNew|Import project'), new_projects_path(anchor: 'import_project')
+- add_to_breadcrumbs s_('ProjectsNew|Import project'), new_project_path(anchor: 'import_project')
%h3.page-title.d-flex
.gl-display-flex.gl-align-items-center.gl-justify-content-center
diff --git a/app/views/import/bulk_imports/history.html.haml b/app/views/import/bulk_imports/history.html.haml
new file mode 100644
index 00000000000..80eb0c7a764
--- /dev/null
+++ b/app/views/import/bulk_imports/history.html.haml
@@ -0,0 +1,6 @@
+- add_to_breadcrumbs _('New group'), new_group_path
+- add_to_breadcrumbs _('Import group'), new_group_path(anchor: 'import-group-pane')
+- add_page_specific_style 'page_bundles/import'
+- page_title _('Import history')
+
+#import-history-mount-element
diff --git a/app/views/import/fogbugz/new.html.haml b/app/views/import/fogbugz/new.html.haml
index 51156797270..d716d08529c 100644
--- a/app/views/import/fogbugz/new.html.haml
+++ b/app/views/import/fogbugz/new.html.haml
@@ -1,6 +1,6 @@
- page_title _("FogBugz Import")
- header_title _("New project"), new_project_path
-- add_to_breadcrumbs s_('ProjectsNew|Import project'), new_projects_path(anchor: 'import_project')
+- add_to_breadcrumbs s_('ProjectsNew|Import project'), new_project_path(anchor: 'import_project')
%h3.page-title.d-flex
.gl-display-flex.gl-align-items-center.gl-justify-content-center
diff --git a/app/views/import/fogbugz/new_user_map.html.haml b/app/views/import/fogbugz/new_user_map.html.haml
index 4281d77e833..93572e14a65 100644
--- a/app/views/import/fogbugz/new_user_map.html.haml
+++ b/app/views/import/fogbugz/new_user_map.html.haml
@@ -1,6 +1,6 @@
- page_title _('User map'), _('FogBugz import')
- header_title _("New project"), new_project_path
-- add_to_breadcrumbs s_('ProjectsNew|Import project'), new_projects_path(anchor: 'import_project')
+- add_to_breadcrumbs s_('ProjectsNew|Import project'), new_project_path(anchor: 'import_project')
%h3.page-title.d-flex
.gl-display-flex.gl-align-items-center.gl-justify-content-center
diff --git a/app/views/import/gitea/new.html.haml b/app/views/import/gitea/new.html.haml
index 288ae5f1cec..de717ce87eb 100644
--- a/app/views/import/gitea/new.html.haml
+++ b/app/views/import/gitea/new.html.haml
@@ -1,6 +1,6 @@
- page_title _("Gitea Import")
- header_title _("New project"), new_project_path
-- add_to_breadcrumbs s_('ProjectsNew|Import project'), new_projects_path(anchor: 'import_project')
+- add_to_breadcrumbs s_('ProjectsNew|Import project'), new_project_path(anchor: 'import_project')
%h3.page-title
= custom_icon('gitea_logo')
diff --git a/app/views/import/github/new.html.haml b/app/views/import/github/new.html.haml
index 3407f9202bf..3f7f929f766 100644
--- a/app/views/import/github/new.html.haml
+++ b/app/views/import/github/new.html.haml
@@ -1,7 +1,7 @@
- title = _('Authenticate with GitHub')
- page_title title
- header_title _("New project"), new_project_path
-- add_to_breadcrumbs s_('ProjectsNew|Import project'), new_projects_path(anchor: 'import_project')
+- add_to_breadcrumbs s_('ProjectsNew|Import project'), new_project_path(anchor: 'import_project')
%h3.page-title
= title
diff --git a/app/views/import/gitlab_projects/new.html.haml b/app/views/import/gitlab_projects/new.html.haml
index 028268482cd..533d0d13be3 100644
--- a/app/views/import/gitlab_projects/new.html.haml
+++ b/app/views/import/gitlab_projects/new.html.haml
@@ -1,6 +1,6 @@
- page_title _("GitLab Import")
- header_title _("New project"), new_project_path
-- add_to_breadcrumbs s_('ProjectsNew|Import project'), new_projects_path(anchor: 'import_project')
+- add_to_breadcrumbs s_('ProjectsNew|Import project'), new_project_path(anchor: 'import_project')
%h3.page-title.d-flex
.gl-display-flex.gl-align-items-center.gl-justify-content-center
diff --git a/app/views/import/manifest/new.html.haml b/app/views/import/manifest/new.html.haml
index bfaff3bb300..a949e14e273 100644
--- a/app/views/import/manifest/new.html.haml
+++ b/app/views/import/manifest/new.html.haml
@@ -1,6 +1,6 @@
- page_title _("Manifest file import")
- header_title _("New project"), new_project_path
-- add_to_breadcrumbs s_('ProjectsNew|Import project'), new_projects_path(anchor: 'import_project')
+- add_to_breadcrumbs s_('ProjectsNew|Import project'), new_project_path(anchor: 'import_project')
%h3.page-title
diff --git a/app/views/import/phabricator/new.html.haml b/app/views/import/phabricator/new.html.haml
index 9596fdb615a..0249dc446e4 100644
--- a/app/views/import/phabricator/new.html.haml
+++ b/app/views/import/phabricator/new.html.haml
@@ -1,6 +1,6 @@
- page_title _('Phabricator Server Import')
- header_title _("New project"), new_project_path
-- add_to_breadcrumbs s_('ProjectsNew|Import project'), new_projects_path(anchor: 'import_project')
+- add_to_breadcrumbs s_('ProjectsNew|Import project'), new_project_path(anchor: 'import_project')
%h3.page-title.d-flex
.gl-display-flex.gl-align-items-center.gl-justify-content-center
diff --git a/app/views/layouts/_one_trust.html.haml b/app/views/layouts/_one_trust.html.haml
new file mode 100644
index 00000000000..4fab017d273
--- /dev/null
+++ b/app/views/layouts/_one_trust.html.haml
@@ -0,0 +1,16 @@
+- if one_trust_enabled?
+ - one_trust_id = sanitize(extra_config.one_trust_id, scrubber: Rails::Html::TextOnlyScrubber.new)
+
+ <!-- OneTrust -->
+ = javascript_include_tag "https://cdn.cookielaw.org/consent/#{one_trust_id}/OtAutoBlock.js"
+ = javascript_tag nonce: content_security_policy_nonce do
+ :plain
+ const oneTrustScript = document.createElement('script');
+ oneTrustScript.src = 'https://cdn.cookielaw.org/scripttemplates/otSDKStub.js';
+ oneTrustScript.dataset.domainScript = '#{one_trust_id}';
+ oneTrustScript.nonce = '#{content_security_policy_nonce}'
+ oneTrustScript.charset = 'UTF-8';
+ oneTrustScript.defer = true;
+ document.head.appendChild(oneTrustScript);
+
+ function OptanonWrapper() { }
diff --git a/app/views/layouts/_page.html.haml b/app/views/layouts/_page.html.haml
index ec2904245d3..dff1b5e3d04 100644
--- a/app/views/layouts/_page.html.haml
+++ b/app/views/layouts/_page.html.haml
@@ -17,6 +17,7 @@
= render_two_factor_auth_recovery_settings_check
= render_if_exists "layouts/header/ee_subscribable_banner"
= render_if_exists "shared/namespace_storage_limit_alert"
+ = render_if_exists "shared/namespace_user_cap_reached_alert"
= render_if_exists "shared/new_user_signups_cap_reached_alert"
= yield :page_level_alert
= yield :customize_homepage_banner
diff --git a/app/views/layouts/_startup_js.html.haml b/app/views/layouts/_startup_js.html.haml
index 35cd191c600..0bf9c16b0d2 100644
--- a/app/views/layouts/_startup_js.html.haml
+++ b/app/views/layouts/_startup_js.html.haml
@@ -8,20 +8,30 @@
if (gl.startup_calls && window.fetch) {
Object.keys(gl.startup_calls).forEach(apiCall => {
- // fetch won’t send cookies in older browsers, unless you set the credentials init option.
- // We set to `same-origin` which is default value in modern browsers.
- // See https://github.com/whatwg/fetch/pull/585 for more information.
- gl.startup_calls[apiCall] = {
- fetchCall: fetch(apiCall, { credentials: 'same-origin' })
+ gl.startup_calls[apiCall] = {
+ fetchCall: fetch(apiCall, {
+ // Emulate XHR for Rails AJAX request checks
+ headers: {
+ 'X-Requested-With': 'XMLHttpRequest'
+ },
+ // fetch won’t send cookies in older browsers, unless you set the credentials init option.
+ // We set to `same-origin` which is default value in modern browsers.
+ // See https://github.com/whatwg/fetch/pull/585 for more information.
+ credentials: 'same-origin'
+ })
};
});
}
if (gl.startup_graphql_calls && window.fetch) {
+ const headers = #{page_startup_graphql_headers.to_json};
const url = `#{api_graphql_url}`
const opts = {
method: "POST",
- headers: { "Content-Type": "application/json", 'X-CSRF-Token': "#{form_authenticity_token}" },
+ headers: {
+ "Content-Type": "application/json",
+ ...headers,
+ }
};
gl.startup_graphql_calls = gl.startup_graphql_calls.map(call => ({
diff --git a/app/views/layouts/header/_default.html.haml b/app/views/layouts/header/_default.html.haml
index 3e7155b2c0e..8d28823bfa4 100644
--- a/app/views/layouts/header/_default.html.haml
+++ b/app/views/layouts/header/_default.html.haml
@@ -34,7 +34,8 @@
#js-header-search.header-search{ data: { 'search-context' => search_context.to_json,
'search-path' => search_path,
'issues-path' => issues_dashboard_path,
- 'mr-path' => merge_requests_dashboard_path } }
+ 'mr-path' => merge_requests_dashboard_path,
+ 'autocomplete-path' => search_autocomplete_path } }
%input{ type: "text", placeholder: _('Search or jump to...'), class: 'form-control gl-form-input' }
- else
= render 'layouts/search'
diff --git a/app/views/layouts/nav/_breadcrumbs.html.haml b/app/views/layouts/nav/_breadcrumbs.html.haml
index c111714f552..02a37dac158 100644
--- a/app/views/layouts/nav/_breadcrumbs.html.haml
+++ b/app/views/layouts/nav/_breadcrumbs.html.haml
@@ -19,8 +19,9 @@
= render "layouts/nav/breadcrumbs/collapsed_dropdown", location: :after
- unless @skip_current_level_breadcrumb
%li
- %h2.breadcrumbs-sub-title
+ %h2.breadcrumbs-sub-title{ data: { qa_selector: 'breadcrumb_sub_title_content' } }
= link_to @breadcrumb_title, breadcrumb_title_link
+ -# haml-lint:disable InlineJavaScript
%script{ type: 'application/ld+json' }
:plain
#{schema_breadcrumb_json}
diff --git a/app/views/layouts/nav/sidebar/_admin.html.haml b/app/views/layouts/nav/sidebar/_admin.html.haml
index d0b73a3364a..842fb23d24a 100644
--- a/app/views/layouts/nav/sidebar/_admin.html.haml
+++ b/app/views/layouts/nav/sidebar/_admin.html.haml
@@ -1,13 +1,13 @@
%aside.nav-sidebar.qa-admin-sidebar{ class: ("sidebar-collapsed-desktop" if collapsed_sidebar?), 'aria-label': _('Admin navigation') }
.nav-sidebar-inner-scroll
.context-header
- = link_to admin_root_path, title: _('Admin Overview') do
+ = link_to admin_root_path, title: _('Admin Overview'), class: 'has-tooltip', data: { container: 'body', placement: 'right' } do
%span{ class: ['avatar-container', 'settings-avatar', 'rect-avatar', 's32'] }
= sprite_icon('admin', size: 18)
%span.sidebar-context-title
= _('Admin Area')
%ul.sidebar-top-level-items{ data: { qa_selector: 'admin_sidebar_overview_submenu_content' } }
- = nav_link(controller: %w(dashboard admin admin/projects users groups jobs runners gitaly_servers cohorts), html_options: {class: 'home'}) do
+ = nav_link(controller: %w(dashboard admin admin/projects users groups admin/topics jobs runners gitaly_servers cohorts), html_options: {class: 'home'}) do
= link_to admin_root_path, class: 'has-sub-items' do
.nav-icon-container
= sprite_icon('overview')
@@ -35,6 +35,10 @@
= link_to admin_groups_path, title: _('Groups'), data: { qa_selector: 'groups_overview_link' } do
%span
= _('Groups')
+ = nav_link(controller: [:admin, 'admin/topics']) do
+ = link_to admin_topics_path, title: _('Topics'), data: { qa_selector: 'topics_overview_link' } do
+ %span
+ = _('Topics')
= nav_link path: 'jobs#index' do
= link_to admin_jobs_path, title: _('Jobs') do
%span
@@ -257,11 +261,6 @@
= link_to ci_cd_admin_application_settings_path, title: _('CI/CD') do
%span
= _('CI/CD')
- - if Feature.enabled?(:serverless_domain)
- = nav_link(path: 'application_settings#operations') do
- = link_to admin_serverless_domains_path, title: _('Operations') do
- %span
- = _('Operations')
= nav_link(path: 'application_settings#reporting') do
= link_to reporting_admin_application_settings_path, title: _('Reporting') do
%span
diff --git a/app/views/layouts/nav/sidebar/_profile.html.haml b/app/views/layouts/nav/sidebar/_profile.html.haml
index 4db1e532ba5..16c0c00ad3f 100644
--- a/app/views/layouts/nav/sidebar/_profile.html.haml
+++ b/app/views/layouts/nav/sidebar/_profile.html.haml
@@ -1,7 +1,7 @@
%aside.nav-sidebar{ class: ("sidebar-collapsed-desktop" if collapsed_sidebar?), **sidebar_tracking_attributes_by_object(current_user), 'aria-label': _('User settings') }
.nav-sidebar-inner-scroll
.context-header
- = link_to profile_path, title: _('Profile Settings') do
+ = link_to profile_path, title: _('Profile Settings'), class: 'has-tooltip', data: { container: 'body', placement: 'right' } do
%span{ class: ['avatar-container', 'settings-avatar', 's32'] }
= image_tag avatar_icon_for_user(current_user, 32), class: ['avatar', 'avatar-tile', 'js-sidebar-user-avatar', 's32'], alt: current_user.name, data: { testid: 'sidebar-user-avatar' }
%span.sidebar-context-title= _('User Settings')
diff --git a/app/views/profiles/_email_settings.html.haml b/app/views/profiles/_email_settings.html.haml
index bc678c2c429..1057e96f442 100644
--- a/app/views/profiles/_email_settings.html.haml
+++ b/app/views/profiles/_email_settings.html.haml
@@ -3,8 +3,11 @@
- email_change_disabled = local_assigns.fetch(:email_change_disabled, nil)
- read_only_help_text = readonly ? s_("Profiles|Your email address was automatically set based on your %{provider_label} account") % { provider_label: attribute_provider_label(:email) } : user_email_help_text(@user)
- help_text = email_change_disabled ? s_("Your account uses dedicated credentials for the \"%{group_name}\" group and can only be updated through SSO.") % { group_name: @user.managing_group.name } : read_only_help_text
+- password_automatically_set = @user.password_automatically_set?
= form.text_field :email, required: true, class: 'input-lg gl-form-input', value: (@user.email unless @user.temp_oauth_email?), help: help_text.html_safe, readonly: readonly || email_change_disabled
+- unless password_automatically_set
+ = hidden_field_tag 'user[validation_password]', :validation_password, class: 'js-password-prompt-field', help: s_("Profiles|Enter your password to confirm the email change")
= form.select :public_email, options_for_select(@user.public_verified_emails, selected: @user.public_email),
{ help: s_("Profiles|This email will be displayed on your public profile"), include_blank: s_("Profiles|Do not show on profile") },
control_class: 'select2 input-lg', disabled: email_change_disabled
diff --git a/app/views/profiles/passwords/edit.html.haml b/app/views/profiles/passwords/edit.html.haml
index 2cc919fc70e..5d3e0720176 100644
--- a/app/views/profiles/passwords/edit.html.haml
+++ b/app/views/profiles/passwords/edit.html.haml
@@ -19,16 +19,16 @@
- unless @user.password_automatically_set?
.form-group
- = f.label :current_password, _('Current password'), class: 'label-bold'
- = f.password_field :current_password, required: true, class: 'form-control gl-form-input', data: { qa_selector: 'current_password_field' }
+ = f.label :password, _('Current password'), class: 'label-bold'
+ = f.password_field :password, required: true, autocomplete: 'current-password', class: 'form-control gl-form-input', data: { qa_selector: 'current_password_field' }
%p.form-text.text-muted
= _('You must provide your current password in order to change it.')
.form-group
- = f.label :password, _('New password'), class: 'label-bold'
- = f.password_field :password, required: true, class: 'form-control gl-form-input', data: { qa_selector: 'new_password_field' }
+ = f.label :new_password, _('New password'), class: 'label-bold'
+ = f.password_field :new_password, required: true, autocomplete: 'new-password', class: 'form-control gl-form-input', data: { qa_selector: 'new_password_field' }
.form-group
= f.label :password_confirmation, _('Password confirmation'), class: 'label-bold'
- = f.password_field :password_confirmation, required: true, class: 'form-control gl-form-input', data: { qa_selector: 'confirm_password_field' }
+ = f.password_field :password_confirmation, required: true, autocomplete: 'new-password', class: 'form-control gl-form-input', data: { qa_selector: 'confirm_password_field' }
.gl-mt-3.gl-mb-3
= f.submit _('Save password'), class: "gl-button btn btn-confirm gl-mr-3", data: { qa_selector: 'save_password_button' }
- unless @user.password_automatically_set?
diff --git a/app/views/profiles/passwords/new.html.haml b/app/views/profiles/passwords/new.html.haml
index 7780ffe0cb4..9154c94abb6 100644
--- a/app/views/profiles/passwords/new.html.haml
+++ b/app/views/profiles/passwords/new.html.haml
@@ -14,18 +14,18 @@
- unless @user.password_automatically_set?
.form-group.row
.col-sm-2.col-form-label
- = f.label :current_password, _('Current password')
+ = f.label :password, _('Current password')
.col-sm-10
- = f.password_field :current_password, required: true, class: 'form-control gl-form-input', data: { qa_selector: 'current_password_field' }
+ = f.password_field :password, required: true, autocomplete: 'current-password', class: 'form-control gl-form-input', data: { qa_selector: 'current_password_field' }
.form-group.row
.col-sm-2.col-form-label
- = f.label :password, _('New password')
+ = f.label :new_password, _('New password')
.col-sm-10
- = f.password_field :password, required: true, class: 'form-control gl-form-input', data: { qa_selector: 'new_password_field' }
+ = f.password_field :new_password, required: true, autocomplete: 'new-password', class: 'form-control gl-form-input', data: { qa_selector: 'new_password_field' }
.form-group.row
.col-sm-2.col-form-label
= f.label :password_confirmation, _('Password confirmation')
.col-sm-10
- = f.password_field :password_confirmation, required: true, class: 'form-control gl-form-input', data: { qa_selector: 'confirm_password_field' }
+ = f.password_field :password_confirmation, required: true, autocomplete: 'new-password', class: 'form-control gl-form-input', data: { qa_selector: 'confirm_password_field' }
.form-actions
= f.submit _('Set new password'), class: 'gl-button btn btn-confirm', data: { qa_selector: 'set_new_password_button' }
diff --git a/app/views/profiles/show.html.haml b/app/views/profiles/show.html.haml
index 0bb4859dd1e..3e41f107e04 100644
--- a/app/views/profiles/show.html.haml
+++ b/app/views/profiles/show.html.haml
@@ -5,7 +5,7 @@
- availability = availability_values
- custom_emoji = show_status_emoji?(@user.status)
-= bootstrap_form_for @user, url: profile_path, method: :put, html: { multipart: true, class: 'edit-user gl-mt-3 js-quick-submit gl-show-field-errors' }, authenticity_token: true do |f|
+= bootstrap_form_for @user, url: profile_path, method: :put, html: { multipart: true, class: 'edit-user gl-mt-3 js-quick-submit gl-show-field-errors js-password-prompt-form', remote: true }, authenticity_token: true do |f|
= form_errors(@user)
.row.js-search-settings-section
@@ -80,7 +80,7 @@
%p= s_("Profiles|Set your local time zone")
.col-lg-8
%h5= _("Time zone")
- = dropdown_tag(_("Select a time zone"), options: { toggle_class: 'gl-button btn js-timezone-dropdown input-lg', title: _("Select a time zone"), filter: true, placeholder: s_("OfSearchInADropdown|Filter"), data: { data: timezone_data } } )
+ = dropdown_tag(_("Select a time zone"), options: { toggle_class: 'gl-button btn js-timezone-dropdown input-lg gl-w-full!', title: _("Select a time zone"), filter: true, placeholder: s_("OfSearchInADropdown|Filter"), data: { data: timezone_data } } )
%input.hidden{ :type => 'hidden', :id => 'user_timezone', :name => 'user[timezone]', value: @user.timezone }
.col-lg-12
%hr
@@ -124,9 +124,11 @@
.help-block
= s_("Profiles|Choose to show contributions of private projects on your public profile without any project, repository or organization information")
%hr
- = f.submit s_("Profiles|Update profile settings"), class: 'gl-button btn btn-confirm gl-mr-3'
+ = f.submit s_("Profiles|Update profile settings"), class: 'gl-button btn btn-confirm gl-mr-3 js-password-prompt-btn'
= link_to _("Cancel"), user_path(current_user), class: 'gl-button btn btn-default btn-cancel'
+#password-prompt-modal
+
.modal.modal-profile-crop{ data: { cropper_css_path: ActionController::Base.helpers.stylesheet_path('lazy_bundles/cropper.css') } }
.modal-dialog
.modal-content
diff --git a/app/views/profiles/two_factor_auths/show.html.haml b/app/views/profiles/two_factor_auths/show.html.haml
index bd3cb7e60f0..00df8608957 100644
--- a/app/views/profiles/two_factor_auths/show.html.haml
+++ b/app/views/profiles/two_factor_auths/show.html.haml
@@ -50,7 +50,7 @@
- if current_password_required?
.form-group
= label_tag :current_password, _('Current password'), class: 'label-bold'
- = password_field_tag :current_password, nil, required: true, class: 'form-control gl-form-input', data: { qa_selector: 'current_password_field' }
+ = password_field_tag :current_password, nil, autocomplete: 'current-password', required: true, class: 'form-control gl-form-input', data: { qa_selector: 'current_password_field' }
%p.form-text.text-muted
= _('Your current password is required to register a two-factor authenticator app.')
.gl-mt-3
diff --git a/app/views/projects/_files.html.haml b/app/views/projects/_files.html.haml
index 597a22bf34a..cdcc98552f9 100644
--- a/app/views/projects/_files.html.haml
+++ b/app/views/projects/_files.html.haml
@@ -20,5 +20,6 @@
= render 'stat_anchor_list', anchors: @project.statistics_buttons(show_auto_devops_callout: show_auto_devops_callout), project_buttons: true
#js-tree-list{ data: vue_file_list_data(project, ref) }
- - if can_edit_tree?
+ - if !Feature.enabled?(:new_dir_modal, default_enabled: :yaml) && can_edit_tree?
= render 'projects/blob/new_dir'
+
diff --git a/app/views/projects/_home_panel.html.haml b/app/views/projects/_home_panel.html.haml
index f2cee618849..1f2c16324fb 100644
--- a/app/views/projects/_home_panel.html.haml
+++ b/app/views/projects/_home_panel.html.haml
@@ -45,11 +45,10 @@
- if can?(current_user, :download_code, @project)
= cache_if(cache_enabled, [@project, :download_code], expires_in: 1.minute) do
%nav.project-stats
- .nav-links.quick-links
- - if @project.empty_repo?
- = render 'stat_anchor_list', anchors: @project.empty_repo_statistics_anchors
- - else
- = render 'stat_anchor_list', anchors: @project.statistics_anchors(show_auto_devops_callout: show_auto_devops_callout)
+ - if @project.empty_repo?
+ = render 'stat_anchor_list', anchors: @project.empty_repo_statistics_anchors
+ - else
+ = render 'stat_anchor_list', anchors: @project.statistics_anchors(show_auto_devops_callout: show_auto_devops_callout)
.home-panel-home-desc.mt-1
- if @project.description.present?
diff --git a/app/views/projects/_import_project_pane.html.haml b/app/views/projects/_import_project_pane.html.haml
index 815a3cf6966..81d9726fcdc 100644
--- a/app/views/projects/_import_project_pane.html.haml
+++ b/app/views/projects/_import_project_pane.html.haml
@@ -83,7 +83,7 @@
.js-toggle-content.toggle-import-form{ class: ('hide' if active_tab != 'import') }
- = form_for @project, html: { class: 'new_project' } do |f|
+ = form_for @project, html: { class: 'new_project gl-show-field-errors' } do |f|
%hr
= render "shared/import_form", f: f
= render 'projects/new_project_fields', f: f, project_name_id: "import-url-name", hide_init_with_readme: true, track_label: track_label
diff --git a/app/views/projects/_new_project_fields.html.haml b/app/views/projects/_new_project_fields.html.haml
index fb7a7ef8985..256c3ebad0a 100644
--- a/app/views/projects/_new_project_fields.html.haml
+++ b/app/views/projects/_new_project_fields.html.haml
@@ -16,7 +16,12 @@
- if current_user.can_select_namespace?
- namespace_id = namespace_id_from(params)
- if Feature.enabled?(:paginatable_namespace_drop_down_for_project_creation, current_user, default_enabled: :yaml)
- .js-vue-new-project-url-select{ data: { namespace_full_path: GroupFinder.new(current_user).execute(id: namespace_id)&.full_path, namespace_id: namespace_id, root_url: root_url, track_label: track_label } }
+ .js-vue-new-project-url-select{ data: { namespace_full_path: GroupFinder.new(current_user).execute(id: namespace_id)&.full_path,
+ namespace_id: namespace_id,
+ root_url: root_url,
+ track_label: track_label,
+ user_namespace_full_path: current_user.namespace.full_path,
+ user_namespace_id: current_user.namespace.id } }
- else
.input-group-prepend.flex-shrink-0.has-tooltip{ title: root_url }
.input-group-text
@@ -53,15 +58,36 @@
= render 'shared/visibility_level', f: f, visibility_level: visibility_level.to_i, can_change_visibility_level: true, form_model: @project, with_label: false
- if !hide_init_with_readme
- .form-group.row.initialize-with-readme-setting
- %div{ :class => "col-sm-12" }
- .form-check
- = check_box_tag 'project[initialize_with_readme]', '1', true, class: 'form-check-input', data: { qa_selector: "initialize_with_readme_checkbox", track_label: "#{track_label}", track_action: "activate_form_input", track_property: "init_with_readme", track_value: "" }
- = label_tag 'project[initialize_with_readme]', class: 'form-check-label' do
- .option-title
- %strong= s_('ProjectsNew|Initialize repository with a README')
- .option-description
- = s_('ProjectsNew|Allows you to immediately clone this project’s repository. Skip this if you plan to push up an existing repository.')
+ = f.label :project_configuration, class: 'label-bold' do
+ = s_('ProjectsNew|Project Configuration')
+
+ .form-group
+ .form-check.gl-mb-3
+ = check_box_tag 'project[initialize_with_readme]', '1', true, class: 'form-check-input', data: { qa_selector: 'initialize_with_readme_checkbox', track_label: track_label, track_action: 'activate_form_input', track_property: 'init_with_readme' }
+ = label_tag 'project[initialize_with_readme]', s_('ProjectsNew|Initialize repository with a README'), class: 'form-check-label'
+ .form-text.text-muted
+ = s_('ProjectsNew|Allows you to immediately clone this project’s repository. Skip this if you plan to push up an existing repository.')
+
+ - experiment(:new_project_sast_enabled, user: current_user) do |e|
+ - e.try do
+ .form-group
+ .form-check.gl-mb-3
+ = check_box_tag 'project[initialize_with_sast]', '1', true, class: 'form-check-input', data: { track_experiment: e.name, track_label: track_label, track_action: 'activate_form_input', track_property: 'init_with_sast' }
+ = label_tag 'project[initialize_with_sast]', class: 'form-check-label' do
+ = s_('ProjectsNew|Enable Static Application Security Testing (SAST)')
+ .form-text.text-muted
+ = s_('ProjectsNew|Analyze your source code for known security vulnerabilities.')
+ = link_to _('Learn more.'), help_page_path('user/application_security/sast/index'), target: '_blank', rel: 'noopener noreferrer', data: { track_action: 'followed', track_experiment: e.name }
+ - e.try(:free_indicator) do
+ .form-group
+ .form-check.gl-mb-3
+ = check_box_tag 'project[initialize_with_sast]', '1', true, class: 'form-check-input', data: { track_experiment: e.name, track_label: track_label, track_action: 'activate_form_input', track_property: 'init_with_sast' }
+ = label_tag 'project[initialize_with_sast]', class: 'form-check-label' do
+ = s_('ProjectsNew|Enable Static Application Security Testing (SAST)')
+ %span.badge.badge-info.badge-pill.gl-badge.sm= _('Free')
+ .form-text.text-muted
+ = s_('ProjectsNew|Analyze your source code for known security vulnerabilities.')
+ = link_to _('Learn more.'), help_page_path('user/application_security/sast/index'), target: '_blank', rel: 'noopener noreferrer', data: { track_action: 'followed', track_experiment: e.name }
= f.submit _('Create project'), class: "btn gl-button btn-confirm", data: { track_label: "#{track_label}", track_action: "click_button", track_property: "create_project", track_value: "" }
= link_to _('Cancel'), dashboard_projects_path, class: 'btn gl-button btn-default btn-cancel', data: { track_label: "#{track_label}", track_action: "click_button", track_property: "cancel", track_value: "" }
diff --git a/app/views/projects/blob/show.html.haml b/app/views/projects/blob/show.html.haml
index 66e9badbafb..168b240c657 100644
--- a/app/views/projects/blob/show.html.haml
+++ b/app/views/projects/blob/show.html.haml
@@ -18,3 +18,4 @@
= render 'projects/blob/upload', title: title, placeholder: title, button_title: 'Replace file', form_path: project_update_blob_path(@project, @id), method: :put
= render partial: 'pipeline_tour_success' if show_suggest_pipeline_creation_celebration?
+= render 'shared/web_ide_path'
diff --git a/app/views/projects/branches/index.html.haml b/app/views/projects/branches/index.html.haml
index b1d465d0e75..6733db69c34 100644
--- a/app/views/projects/branches/index.html.haml
+++ b/app/views/projects/branches/index.html.haml
@@ -1,19 +1,12 @@
- page_title _('Branches')
- add_to_breadcrumbs(_('Repository'), project_tree_path(@project))
-.top-area.adjust
- %ul.nav-links.issues-state-filters.nav.nav-tabs
- %li{ class: active_when(@mode == 'overview') }>
- = link_to s_('Branches|Overview'), project_branches_path(@project), title: s_('Branches|Show overview of the branches')
-
- %li{ class: active_when(@mode == 'active') }>
- = link_to s_('Branches|Active'), project_branches_filtered_path(@project, state: 'active'), title: s_('Branches|Show active branches')
-
- %li{ class: active_when(@mode == 'stale') }>
- = link_to s_('Branches|Stale'), project_branches_filtered_path(@project, state: 'stale'), title: s_('Branches|Show stale branches')
-
- %li{ class: active_when(!%w[overview active stale].include?(@mode)) }>
- = link_to s_('Branches|All'), project_branches_filtered_path(@project, state: 'all'), title: s_('Branches|Show all branches')
+.top-area.gl-border-0
+ = gl_tabs_nav({ class: 'gl-flex-grow-1 gl-border-b-0' }) do
+ = gl_tab_link_to s_('Branches|Overview'), project_branches_path(@project), { item_active: @mode == 'overview', title: s_('Branches|Show overview of the branches') }
+ = gl_tab_link_to s_('Branches|Active'), project_branches_filtered_path(@project, state: 'active'), { title: s_('Branches|Show active branches') }
+ = gl_tab_link_to s_('Branches|Stale'), project_branches_filtered_path(@project, state: 'stale'), { title: s_('Branches|Show stale branches') }
+ = gl_tab_link_to s_('Branches|All'), project_branches_filtered_path(@project, state: 'all'), { item_active: !%w[overview active stale].include?(@mode), title: s_('Branches|Show all branches') }
.nav-controls
#js-branches-sort-dropdown{ data: { project_branches_filtered_path: project_branches_path(@project, state: 'all'), sort_options: branches_sort_options_hash.to_json, mode: @mode } }
@@ -38,7 +31,10 @@
%h5
= s_('Branches|Protected branches can be managed in %{project_settings_link}.').html_safe % { project_settings_link: project_settings_link }
-- if @mode == 'overview' && (@active_branches.any? || @stale_branches.any?)
+- if @gitaly_unavailable
+ = render 'shared/errors/gitaly_unavailable', reason: s_('Branches|Unable to load branches')
+
+- elsif @mode == 'overview' && (@active_branches.any? || @stale_branches.any?)
= render "projects/branches/panel", branches: @active_branches, state: 'active', panel_title: s_('Branches|Active branches'), show_more_text: s_('Branches|Show more active branches'), project: @project, overview_max_branches: @overview_max_branches
= render "projects/branches/panel", branches: @stale_branches, state: 'stale', panel_title: s_('Branches|Stale branches'), show_more_text: s_('Branches|Show more stale branches'), project: @project, overview_max_branches: @overview_max_branches
diff --git a/app/views/projects/branches/new.html.haml b/app/views/projects/branches/new.html.haml
index 27858932e5e..8ee7910de4b 100644
--- a/app/views/projects/branches/new.html.haml
+++ b/app/views/projects/branches/new.html.haml
@@ -31,4 +31,5 @@
.form-actions
= button_tag 'Create branch', class: 'gl-button btn btn-confirm'
= link_to _('Cancel'), project_branches_path(@project), class: 'gl-button btn btn-default btn-cancel'
+-# haml-lint:disable InlineJavaScript
%script#availableRefs{ type: "application/json" }= @project.repository.ref_names.to_json.html_safe
diff --git a/app/views/projects/ci/pipeline_editor/show.html.haml b/app/views/projects/ci/pipeline_editor/show.html.haml
index 674765e9f89..ce6f7553ab4 100644
--- a/app/views/projects/ci/pipeline_editor/show.html.haml
+++ b/app/views/projects/ci/pipeline_editor/show.html.haml
@@ -1,3 +1,5 @@
+- add_page_specific_style 'page_bundles/pipelines'
+
- page_title s_('Pipelines|Pipeline Editor')
- content_for :prefetch_asset_tags do
- webpack_preload_asset_tag('monaco')
diff --git a/app/views/projects/cluster_agents/show.html.haml b/app/views/projects/cluster_agents/show.html.haml
new file mode 100644
index 00000000000..a2d3426d99c
--- /dev/null
+++ b/app/views/projects/cluster_agents/show.html.haml
@@ -0,0 +1,4 @@
+- add_to_breadcrumbs _('Kubernetes'), project_clusters_path(@project)
+- page_title @agent_name
+
+#js-cluster-agent-details{ data: js_cluster_agent_details_data(@agent_name, @project) }
diff --git a/app/views/projects/commits/_commit.html.haml b/app/views/projects/commits/_commit.html.haml
index bc0d14743b9..62ed50f5a0c 100644
--- a/app/views/projects/commits/_commit.html.haml
+++ b/app/views/projects/commits/_commit.html.haml
@@ -39,8 +39,14 @@
.committer
- commit_author_link = commit_author_link(commit, avatar: false, size: 24)
- - commit_timeago = time_ago_with_tooltip(commit.authored_date, placement: 'bottom')
- - commit_text = _('%{commit_author_link} authored %{commit_timeago}') % { commit_author_link: commit_author_link, commit_timeago: commit_timeago }
+ - commit_authored_timeago = time_ago_with_tooltip(commit.authored_date, placement: 'bottom')
+ - if commit.different_committer? && commit.committer
+ - commit_committer_link = commit_committer_link(commit)
+ - commit_committer_timeago = time_ago_with_tooltip(commit.committed_date, placement: 'bottom')
+ - commit_committer_avatar = commit_committer_avatar(commit.committer, size: 18, has_tooltip: false)
+ - commit_text = _('%{commit_author_link} authored %{commit_authored_timeago} and %{commit_committer_avatar} %{commit_committer_link} committed %{commit_committer_timeago}') % { commit_author_link: commit_author_link, commit_authored_timeago: commit_authored_timeago, commit_committer_avatar: commit_committer_avatar, commit_committer_link: commit_committer_link, commit_committer_timeago: commit_committer_timeago }
+ - else
+ - commit_text = _('%{commit_author_link} authored %{commit_authored_timeago}') % { commit_author_link: commit_author_link, commit_authored_timeago: commit_authored_timeago }
#{ commit_text.html_safe }
= render_if_exists 'projects/commits/project_namespace', show_project_name: show_project_name, project: project
diff --git a/app/views/projects/deployments/_deployment.html.haml b/app/views/projects/deployments/_deployment.html.haml
index 8270477ed3f..57dfcb8cf4a 100644
--- a/app/views/projects/deployments/_deployment.html.haml
+++ b/app/views/projects/deployments/_deployment.html.haml
@@ -27,7 +27,7 @@
= link_to deployment_path(deployment), class: 'build-link' do
#{deployment.deployable.name} (##{deployment.deployable.id})
- else
- .badge.badge-info.suggestion-help-hover{ title: s_('Deployment|This deployment was created using the API') }
+ .badge.badge-info.gl-cursor-help{ title: s_('Deployment|This deployment was created using the API') }
= s_('Deployment|API')
.table-section.section-10{ role: 'gridcell' }
diff --git a/app/views/projects/feature_flags/edit.html.haml b/app/views/projects/feature_flags/edit.html.haml
index c1c9f58265d..ac8c0575077 100644
--- a/app/views/projects/feature_flags/edit.html.haml
+++ b/app/views/projects/feature_flags/edit.html.haml
@@ -4,10 +4,4 @@
- breadcrumb_title @feature_flag.name
- page_title s_('FeatureFlags|Edit Feature Flag')
-#js-edit-feature-flag{ data: { endpoint: project_feature_flag_path(@project, @feature_flag),
- project_id: @project.id,
- 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'),
- feature_flag_issues_endpoint: feature_flag_issues_links_endpoint(@project, @feature_flag, current_user) } }
+#js-edit-feature-flag{ data: edit_feature_flag_data }
diff --git a/app/views/projects/google_cloud/index.html.haml b/app/views/projects/google_cloud/index.html.haml
new file mode 100644
index 00000000000..4fc66e17810
--- /dev/null
+++ b/app/views/projects/google_cloud/index.html.haml
@@ -0,0 +1,83 @@
+- breadcrumb_title _('Google Cloud')
+- page_title _('Google Cloud')
+
+- @content_class = "limit-container-width" unless fluid_layout
+
+#js-google-cloud
+
+ %h1.gl-font-size-h1 Google Cloud
+
+ %section#js-section-google-cloud-service-accounts
+
+ %h2.gl-font-size-h2 Service Accounts
+
+ %p= _('Service Accounts keys are required to authorize GitLab to deploy your Google Cloud project.')
+
+ %table.table.b-table.gl-table
+
+ %thead
+ %tr
+ %th Environment
+ %th GCP Project ID
+ %th Service Account Key
+
+ %tbody
+
+ %tr
+ %td *
+ %td serving-salutes-453
+ %td .....
+
+ %tr
+ %td production
+ %td crimson-corey-234
+ %td .....
+
+ %tr
+ %td review/*
+ %td roving-river-379
+ %td .....
+
+ %a.gl-button.btn.btn-primary= _('Add new service account')
+
+ %br
+
+ %section#js-section-google-cloud-deployments
+
+ .row.row-fluid
+
+ .col-lg-4
+ %h2.gl-font-size-h2 Deployments
+ %p= _('Google Cloud offers several deployment targets. Select the one most suitable for your project.')
+ %p
+ = _('Deployments to Google Kubernetes Engine can be ')
+ %a{ href: '#' }= _('managed')
+ = _('in Infrastructure :: Kubernetes clusters')
+
+ .col-lg-8
+
+ %br
+
+ .gl-card.gl-mb-6
+ .gl-card-body
+ .gl-display-flex.gl-align-items-baseline
+ %strong.gl-font-lg App Engine
+ .gl-ml-auto.gl-text-gray-500 Disabled
+ %p= _('App Engine description and apps that are suitable for this deployment target')
+ %button.gl-button.btn.btn-default= _('Configure via Merge Request')
+
+ .gl-card.gl-mb-6
+ .gl-card-body
+ .gl-display-flex.gl-align-items-baseline
+ %strong.gl-font-lg Cloud Functions
+ .gl-ml-auto.gl-text-gray-500 Disabled
+ %p= _('Cloud Functions description and apps that are suitable for this deployment target')
+ %button.gl-button.btn.btn-default= _('Configure via Merge Request')
+
+ .gl-card.gl-mb-6
+ .gl-card-body
+ .gl-display-flex.gl-align-items-baseline
+ %strong.gl-font-lg Cloud Run
+ .gl-ml-auto.gl-text-gray-500 Disabled
+ %p= _('Cloud Run description and apps that are suitable for this deployment target')
+ %button.gl-button.btn.btn-default= _('Configure via Merge Request')
diff --git a/app/views/projects/hook_logs/_index.html.haml b/app/views/projects/hook_logs/_index.html.haml
index ee4dbf5c05c..6a46b0b3510 100644
--- a/app/views/projects/hook_logs/_index.html.haml
+++ b/app/views/projects/hook_logs/_index.html.haml
@@ -1,37 +1,11 @@
-.row.gl-mt-7.gl-mb-3
+- docs_link_url = help_page_path('user/project/integrations/webhooks', anchor: 'troubleshoot-webhooks')
+- link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: docs_link_url }
+- link_end = '</a>'.html_safe
+
+.row.gl-mt-3.gl-mb-3
.col-lg-3
%h4.gl-mt-0
- Recent Deliveries
- %p When an event in GitLab triggers a webhook, you can use the request details to figure out if something went wrong.
+ = _('Recent events')
+ %p= _('GitLab events trigger webhooks. Use the request details of a webhook to help troubleshoot problems. %{link_start}How do I troubleshoot?%{link_end}').html_safe % { link_start: link_start, link_end: link_end }
.col-lg-9
- - if hook_logs.present?
- %table.table
- %thead
- %tr
- %th Status
- %th Trigger
- %th URL
- %th Elapsed time
- %th Request time
- %th
- - hook_logs.each do |hook_log|
- %tr
- %td
- = render partial: 'shared/hook_logs/status_label', locals: { hook_log: hook_log }
- %td.d-none.d-sm-block
- %span.badge.badge-gray.deploy-project-label
- = hook_log.trigger.singularize.titleize
- %td
- = truncate(hook_log.url, length: 50)
- %td.light
- #{number_with_precision(hook_log.execution_duration, precision: 2)} sec
- %td.light
- = time_ago_with_tooltip(hook_log.created_at)
- %td
- = link_to 'View details', hook_log.present.details_path
-
- = paginate hook_logs, theme: 'gitlab'
-
- - else
- .settings-message.text-center
- You don't have any webhooks deliveries
+ = render partial: 'shared/hook_logs/recent_deliveries_table', locals: { hook: hook, hook_logs: hook_logs }
diff --git a/app/views/projects/hook_logs/show.html.haml b/app/views/projects/hook_logs/show.html.haml
index ebe179c3454..86dfa1929d6 100644
--- a/app/views/projects/hook_logs/show.html.haml
+++ b/app/views/projects/hook_logs/show.html.haml
@@ -5,8 +5,8 @@
.row.gl-mt-3.gl-mb-3
.col-lg-3
%h4.gl-mt-0
- Request details
+ = _("Request details")
.col-lg-9
- = link_to 'Resend Request', @hook_log.present.retry_path, method: :post, class: "btn gl-button btn-default float-right gl-ml-3"
+ = link_to _('Resend Request'), @hook_log.present.retry_path, method: :post, class: "btn gl-button btn-default float-right gl-ml-3"
= render partial: 'shared/hook_logs/content', locals: { hook_log: @hook_log }
diff --git a/app/views/projects/issues/_nav_btns.html.haml b/app/views/projects/issues/_nav_btns.html.haml
index 0d69f6f69aa..8d16c3d978f 100644
--- a/app/views/projects/issues/_nav_btns.html.haml
+++ b/app/views/projects/issues/_nav_btns.html.haml
@@ -5,11 +5,11 @@
- can_edit = can?(current_user, :admin_project, @project)
- notification_email = @current_user.present? ? @current_user.notification_email_or_default : nil
-.nav-controls.issues-nav-controls
+.nav-controls.issues-nav-controls.gl-font-size-0
- if show_feed_buttons
= render 'shared/issuable/feed_buttons'
- .js-csv-import-export-buttons{ data: { show_export_button: show_export_button.to_s, show_import_button: show_import_button.to_s, issuable_type: issuable_type, issuable_count: issuables_count_for_state(issuable_type.to_sym, params[:state]), email: notification_email, export_csv_path: export_csv_project_issues_path(@project, request.query_parameters), import_csv_issues_path: import_csv_namespace_project_issues_path, container_class: 'gl-mr-3', can_edit: can_edit.to_s, project_import_jira_path: project_import_jira_path(@project) } }
+ .js-csv-import-export-buttons{ data: { show_export_button: show_export_button.to_s, show_import_button: show_import_button.to_s, issuable_type: issuable_type, issuable_count: issuables_count_for_state(issuable_type.to_sym, params[:state]), email: notification_email, export_csv_path: export_csv_project_issues_path(@project, request.query_parameters), import_csv_issues_path: import_csv_namespace_project_issues_path, container_class: 'gl-mr-3', can_edit: can_edit.to_s, project_import_jira_path: project_import_jira_path(@project), max_attachment_size: number_to_human_size(Gitlab::CurrentSettings.max_attachment_size.megabytes) } }
- if @can_bulk_update
= button_tag _("Edit issues"), class: "gl-button btn btn-default gl-mr-3 js-bulk-update-toggle"
@@ -18,4 +18,3 @@
issue: { milestone_id: finder.milestones.first.try(:id) }),
class: "gl-button btn btn-confirm",
id: "new_issue_link"
-
diff --git a/app/views/projects/issues/_related_branches.html.haml b/app/views/projects/issues/_related_branches.html.haml
index 0604e89be6e..c47257eec4a 100644
--- a/app/views/projects/issues/_related_branches.html.haml
+++ b/app/views/projects/issues/_related_branches.html.haml
@@ -1,9 +1,9 @@
- if @related_branches.any?
- %h2.related-branches-title
+ %h2.gl-font-lg
= pluralize(@related_branches.size, 'Related Branch')
%ul.unstyled-list.related-merge-requests
- @related_branches.each do |branch|
- %li
+ %li.gl-display-flex.gl-align-items-center
- if branch[:pipeline_status].present?
%span.related-branch-ci-status
= render 'ci/status/icon', status: branch[:pipeline_status]
diff --git a/app/views/projects/issues/_related_issues.html.haml b/app/views/projects/issues/_related_issues.html.haml
index d131d20f079..bab37609c20 100644
--- a/app/views/projects/issues/_related_issues.html.haml
+++ b/app/views/projects/issues/_related_issues.html.haml
@@ -3,4 +3,3 @@
can_add_related_issues: "#{can?(current_user, :admin_issue_link, @issue)}",
help_path: help_page_path('user/project/issues/related_issues'),
show_categorized_issues: "false" } }
- - render('projects/issues/related_issues_block')
diff --git a/app/views/projects/issues/_related_issues_block.html.haml b/app/views/projects/issues/_related_issues_block.html.haml
deleted file mode 100644
index 8d986b64b1d..00000000000
--- a/app/views/projects/issues/_related_issues_block.html.haml
+++ /dev/null
@@ -1,5 +0,0 @@
-.related-issues-block
- .card.card-slim
- .card-header.panel-empty-heading.border-bottom-0
- %h3.card-title.mt-0.mb-0.h5
- = _('Linked issues')
diff --git a/app/views/projects/merge_requests/_mr_title.html.haml b/app/views/projects/merge_requests/_mr_title.html.haml
index 5a983fb5565..0e8de3c2bb8 100644
--- a/app/views/projects/merge_requests/_mr_title.html.haml
+++ b/app/views/projects/merge_requests/_mr_title.html.haml
@@ -32,20 +32,20 @@
.dropdown-menu.dropdown-menu-right
%ul
- if can_update_merge_request
- %li= link_to 'Edit', edit_namespace_project_merge_request_path(@project.namespace, @project, @merge_request)
+ %li= link_to _('Edit'), edit_namespace_project_merge_request_path(@project.namespace, @project, @merge_request)
- if @merge_request.opened?
%li
= link_to @merge_request.work_in_progress? ? _('Mark as ready') : _('Mark as draft'), toggle_draft_merge_request_path(@merge_request), method: :put, class: "js-draft-toggle-button"
%li{ class: [merge_request_button_visibility(@merge_request, true), 'js-close-item'] }
- = link_to 'Close', merge_request_path(@merge_request, merge_request: { state_event: :close }), method: :put, title: 'Close merge request'
+ = link_to _('Close'), merge_request_path(@merge_request, merge_request: { state_event: :close }), method: :put, title: 'Close merge request'
- if can_reopen_merge_request
%li{ class: merge_request_button_visibility(@merge_request, false) }
- = link_to 'Reopen', merge_request_path(@merge_request, merge_request: { state_event: :reopen }), method: :put, title: 'Reopen merge request'
+ = link_to _('Reopen'), merge_request_path(@merge_request, merge_request: { state_event: :reopen }), method: :put, title: 'Reopen merge request'
- unless @merge_request.merged? || current_user == @merge_request.author
- %li= link_to 'Report abuse', new_abuse_report_path(user_id: @merge_request.author.id, ref_url: merge_request_url(@merge_request))
+ %li= link_to _('Report abuse'), new_abuse_report_path(user_id: @merge_request.author.id, ref_url: merge_request_url(@merge_request))
- if can_update_merge_request
- = link_to 'Edit', edit_project_merge_request_path(@project, @merge_request), class: "d-none d-md-block btn gl-button btn-default btn-grouped js-issuable-edit", data: { qa_selector: "edit_button" }
+ = link_to _('Edit'), edit_project_merge_request_path(@project, @merge_request), class: "d-none d-md-block btn gl-button btn-default btn-grouped js-issuable-edit", data: { qa_selector: "edit_button" }
- if can_update_merge_request && !are_close_and_open_buttons_hidden
= render 'projects/merge_requests/close_reopen_draft_report_toggle'
diff --git a/app/views/projects/merge_requests/_nav_btns.html.haml b/app/views/projects/merge_requests/_nav_btns.html.haml
index b34cf23634c..00d12423eb9 100644
--- a/app/views/projects/merge_requests/_nav_btns.html.haml
+++ b/app/views/projects/merge_requests/_nav_btns.html.haml
@@ -5,7 +5,7 @@
.js-csv-import-export-buttons{ data: { show_export_button: "true", issuable_type: issuable_type, issuable_count: issuables_count_for_state(issuable_type.to_sym, params[:state]), email: notification_email, export_csv_path: export_csv_project_merge_requests_path(@project, request.query_parameters), container_class: 'gl-mr-3' } }
- if @can_bulk_update
- = button_tag "Edit merge requests", class: "gl-button btn btn-default gl-mr-3 js-bulk-update-toggle"
+ = button_tag _("Edit merge requests"), class: "gl-button btn btn-default gl-mr-3 js-bulk-update-toggle"
- if merge_project
- = link_to new_merge_request_path, class: "gl-button btn btn-confirm", title: "New merge request" do
- New merge request
+ = link_to new_merge_request_path, class: "gl-button btn btn-confirm", title: _("New merge request") do
+ = _('New merge request')
diff --git a/app/views/projects/merge_requests/_widget.html.haml b/app/views/projects/merge_requests/_widget.html.haml
index 47a0d05fc65..459742c3b81 100644
--- a/app/views/projects/merge_requests/_widget.html.haml
+++ b/app/views/projects/merge_requests/_widget.html.haml
@@ -19,6 +19,6 @@
window.gl.mrWidgetData.pipelines_empty_svg_path = '#{image_path('illustrations/pipelines_empty.svg')}';
window.gl.mrWidgetData.codequality_help_path = '#{help_page_path("user/project/merge_requests/code_quality", anchor: "code-quality-reports")}';
window.gl.mrWidgetData.false_positive_doc_url = '#{help_page_path('user/application_security/vulnerabilities/index')}';
- window.gl.mrWidgetData.can_view_false_positive = '#{(Feature.enabled?(:vulnerability_flags, default_enabled: :yaml) && @merge_request.project.licensed_feature_available?(:sast_fp_reduction)).to_s}';
+ window.gl.mrWidgetData.can_view_false_positive = '#{@merge_request.project.licensed_feature_available?(:sast_fp_reduction).to_s}';
#js-vue-mr-widget.mr-widget
diff --git a/app/views/projects/merge_requests/conflicts/show.html.haml b/app/views/projects/merge_requests/conflicts/show.html.haml
index ee296258d04..5ba42ca7610 100644
--- a/app/views/projects/merge_requests/conflicts/show.html.haml
+++ b/app/views/projects/merge_requests/conflicts/show.html.haml
@@ -6,7 +6,7 @@
.merge-request-details.issuable-details
= render "projects/merge_requests/mr_box"
-= render 'shared/issuable/sidebar', issuable_sidebar: @issuable_sidebar, assignees: @merge_request.assignees, source_branch: @merge_request.source_branch
+= render 'shared/issuable/sidebar', issuable_sidebar: @issuable_sidebar, assignees: @merge_request.assignees, reviewers: @merge_request.reviewers, source_branch: @merge_request.source_branch
#conflicts{ data: { conflicts_path: conflicts_project_merge_request_path(@merge_request.project, @merge_request, format: :json),
resolve_conflicts_path: resolve_conflicts_project_merge_request_path(@merge_request.project, @merge_request),
diff --git a/app/views/projects/merge_requests/show.html.haml b/app/views/projects/merge_requests/show.html.haml
index 7e260a03c5d..2154ef6b596 100644
--- a/app/views/projects/merge_requests/show.html.haml
+++ b/app/views/projects/merge_requests/show.html.haml
@@ -49,6 +49,7 @@
= render "projects/merge_requests/tabs/pane", id: "notes", class: "notes voting_notes" do
.row
%section.col-md-12
+ -# haml-lint:disable InlineJavaScript
%script.js-notes-data{ type: "application/json" }= initial_notes_data(true).to_json.html_safe
.issuable-discussion.js-vue-notes-event
- if @merge_request.description.present?
@@ -98,3 +99,4 @@
= render 'projects/invite_members_modal', project: @project
- if Gitlab::CurrentSettings.gitpod_enabled && !current_user&.gitpod_enabled
= render 'shared/gitpod/enable_gitpod_modal'
+= render 'shared/web_ide_path'
diff --git a/app/views/projects/mirrors/_mirror_repos.html.haml b/app/views/projects/mirrors/_mirror_repos.html.haml
index b89aa9d402e..d253ab8e32b 100644
--- a/app/views/projects/mirrors/_mirror_repos.html.haml
+++ b/app/views/projects/mirrors/_mirror_repos.html.haml
@@ -10,7 +10,7 @@
= expanded ? _('Collapse') : _('Expand')
%p
= _('Set up your project to automatically push and/or pull changes to/from another repository. Branches, tags, and commits will be synced automatically.')
- = link_to _('How do I mirror repositories?'), help_page_path('user/project/repository/repository_mirroring'), target: '_blank', rel: 'noopener noreferrer'
+ = link_to _('How do I mirror repositories?'), help_page_path('user/project/repository/mirror/index.md'), target: '_blank', rel: 'noopener noreferrer'
.settings-content
- if mirror_settings_enabled
@@ -32,7 +32,7 @@
= label_tag :only_protected_branches, _('Mirror only protected branches'), class: 'form-check-label'
.form-text.text-muted
= _('If enabled, only protected branches will be mirrored.')
- = link_to _('Learn more.'), help_page_path('user/project/repository/repository_mirroring', anchor: 'mirror-only-protected-branches'), target: '_blank', rel: 'noopener noreferrer'
+ = link_to _('Learn more.'), help_page_path('user/project/repository/mirror/index.md', anchor: 'mirror-only-protected-branches'), target: '_blank', rel: 'noopener noreferrer'
.panel-footer
= f.submit _('Mirror repository'), class: 'gl-button btn btn-confirm js-mirror-submit qa-mirror-repository-button', name: :update_remote_mirror
diff --git a/app/views/projects/mirrors/_mirror_repos_push.html.haml b/app/views/projects/mirrors/_mirror_repos_push.html.haml
index b3e0f71bf19..339c5d82919 100644
--- a/app/views/projects/mirrors/_mirror_repos_push.html.haml
+++ b/app/views/projects/mirrors/_mirror_repos_push.html.haml
@@ -12,4 +12,4 @@
= label_tag :keep_divergent_refs, _('Keep divergent refs'), class: 'form-check-label'
.form-text.text-muted
- link_opening_tag = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe
- = html_escape(_('Do not force push over diverged refs. After the mirror is created, this setting can only be modified using the API. %{mirroring_docs_link_start}Learn more about this option%{link_closing_tag} and %{mirroring_api_docs_link_start}the API.%{link_closing_tag}')) % { mirroring_docs_link_start: link_opening_tag % {url: help_page_path('user/project/repository/repository_mirroring', anchor: 'keep-divergent-refs')}, mirroring_api_docs_link_start: link_opening_tag % {url: help_page_path('api/remote_mirrors')}, link_closing_tag: '</a>'.html_safe }
+ = html_escape(_('Do not force push over diverged refs. After the mirror is created, this setting can only be modified using the API. %{mirroring_docs_link_start}Learn more about this option%{link_closing_tag} and %{mirroring_api_docs_link_start}the API.%{link_closing_tag}')) % { mirroring_docs_link_start: link_opening_tag % {url: help_page_path('user/project/repository/mirror/push.md', anchor: 'keep-divergent-refs')}, mirroring_api_docs_link_start: link_opening_tag % {url: help_page_path('api/remote_mirrors')}, link_closing_tag: '</a>'.html_safe }
diff --git a/app/views/projects/pipelines/_with_tabs.html.haml b/app/views/projects/pipelines/_with_tabs.html.haml
index 23606e24563..93afddce779 100644
--- a/app/views/projects/pipelines/_with_tabs.html.haml
+++ b/app/views/projects/pipelines/_with_tabs.html.haml
@@ -70,10 +70,10 @@
= link_to retry_project_job_path(build.project, build, return_to: request.original_url), method: :post, title: _('Retry'), class: 'gl-button btn btn-default btn-icon' do
= sprite_icon('repeat', css_class: 'gl-icon')
- if can?(current_user, :read_build, job)
- %tr.build-trace-row.responsive-table-border-end
+ %tr.build-log-row.responsive-table-border-end
%td
- %td.responsive-table-cell.build-trace-container{ colspan: 4 }
- %pre.build-trace.build-trace-rounded
+ %td.responsive-table-cell.build-log-container{ colspan: 4 }
+ %pre.build-log.build-log-rounded
%code.bash.js-build-output
= build_summary(build)
diff --git a/app/views/projects/product_analytics/test.html.haml b/app/views/projects/product_analytics/test.html.haml
index 60d897ee138..3204cd5fbbe 100644
--- a/app/views/projects/product_analytics/test.html.haml
+++ b/app/views/projects/product_analytics/test.html.haml
@@ -12,5 +12,6 @@
%code
= @event.as_json_wo_empty
+-# haml-lint:disable InlineJavaScript
:javascript
#{render 'tracker'}
diff --git a/app/views/projects/registry/repositories/index.html.haml b/app/views/projects/registry/repositories/index.html.haml
index bdb5f021b70..cfdbf3410b1 100644
--- a/app/views/projects/registry/repositories/index.html.haml
+++ b/app/views/projects/registry/repositories/index.html.haml
@@ -20,7 +20,8 @@
"is_admin": current_user&.admin.to_s,
"show_cleanup_policy_on_alert": show_cleanup_policy_on_alert(@project).to_s,
"cleanup_policies_settings_path": project_settings_packages_and_registries_path(@project),
- character_error: @character_error.to_s,
+ connection_error: (!!@connection_error).to_s,
+ invalid_path_error: (!!@invalid_path_error).to_s,
user_callouts_path: user_callouts_path,
user_callout_id: UserCalloutsHelper::UNFINISHED_TAG_CLEANUP_CALLOUT,
show_unfinished_tag_cleanup_callout: show_unfinished_tag_cleanup_callout?.to_s, } }
diff --git a/app/views/projects/settings/operations/_error_tracking.html.haml b/app/views/projects/settings/operations/_error_tracking.html.haml
index 6b2a1468eec..23b1ec4dea3 100644
--- a/app/views/projects/settings/operations/_error_tracking.html.haml
+++ b/app/views/projects/settings/operations/_error_tracking.html.haml
@@ -18,4 +18,5 @@
api_host: setting.api_host,
enabled: setting.enabled.to_json,
integrated: setting.integrated.to_json,
+ gitlab_dsn: setting.gitlab_dsn,
token: setting.token.present? ? '*' * 12 : nil } }
diff --git a/app/views/projects/snippets/show.html.haml b/app/views/projects/snippets/show.html.haml
index 8ef53c40b11..3e6acdb130a 100644
--- a/app/views/projects/snippets/show.html.haml
+++ b/app/views/projects/snippets/show.html.haml
@@ -3,7 +3,7 @@
- breadcrumb_title @snippet.to_reference
- page_title "#{@snippet.title} (#{@snippet.to_reference})", _("Snippets")
-#js-snippet-view{ data: {'qa-selector': 'snippet_view', 'snippet-gid': @snippet.to_global_id, 'report-abuse-path': snippet_report_abuse_path(@snippet) } }
+#js-snippet-view{ data: {'qa-selector': 'snippet_view', 'snippet-gid': @snippet.to_global_id, 'report-abuse-path': snippet_report_abuse_path(@snippet), 'can-report-spam': @snippet.submittable_as_spam_by?(current_user).to_s } }
.row-content-block.top-block.content-component-block
= render 'award_emoji/awards_block', awardable: @snippet, inline: true, api_awards_path: project_snippets_award_api_path(@snippet)
diff --git a/app/views/projects/tags/index.html.haml b/app/views/projects/tags/index.html.haml
index 79205a51d71..d3cc409df1d 100644
--- a/app/views/projects/tags/index.html.haml
+++ b/app/views/projects/tags/index.html.haml
@@ -18,6 +18,9 @@
= render_if_exists 'projects/commits/mirror_status'
+ - if @tags_loading_error
+ = render 'shared/errors/gitaly_unavailable', reason: s_('TagsPage|Unable to load tags')
+
.tags
- if @tags.any?
%ul.flex-list.content-list
diff --git a/app/views/projects/tags/new.html.haml b/app/views/projects/tags/new.html.haml
index fe00772d1d6..4281152225a 100644
--- a/app/views/projects/tags/new.html.haml
+++ b/app/views/projects/tags/new.html.haml
@@ -54,4 +54,5 @@
.form-actions.gl-display-flex
= button_tag s_('TagsPage|Create tag'), class: 'gl-button btn btn-confirm gl-mr-3', data: { qa_selector: "create_tag_button" }
= link_to s_('TagsPage|Cancel'), project_tags_path(@project), class: 'gl-button btn btn-default btn-cancel'
+-# haml-lint:disable InlineJavaScript
%script#availableRefs{ type: "application/json" }= @project.repository.ref_names.to_json.html_safe
diff --git a/app/views/projects/tree/show.html.haml b/app/views/projects/tree/show.html.haml
index 2d0c4cc20a0..1553eda1cfb 100644
--- a/app/views/projects/tree/show.html.haml
+++ b/app/views/projects/tree/show.html.haml
@@ -11,3 +11,4 @@
= render 'projects/last_push'
= render 'projects/files', commit: @last_commit, project: @project, ref: @ref, content_url: project_tree_path(@project, @id)
+= render 'shared/web_ide_path'
diff --git a/app/views/projects/usage_quotas/index.html.haml b/app/views/projects/usage_quotas/index.html.haml
index dfd46af0499..6c7cccfb9b1 100644
--- a/app/views/projects/usage_quotas/index.html.haml
+++ b/app/views/projects/usage_quotas/index.html.haml
@@ -6,7 +6,7 @@
.row
.col-sm-12
= s_('UsageQuota|Usage of project resources across the %{strong_start}%{project_name}%{strong_end} project').html_safe % { strong_start: '<strong>'.html_safe, strong_end: '</strong>'.html_safe, project_name: @project.name } + '.'
- %a{ href: help_page_path('user/usage_quotas.md') }
+ %a{ href: help_page_path('user/usage_quotas.md'), target: '_blank', rel: 'noopener noreferrer' }
= s_('UsageQuota|Learn more about usage quotas') + '.'
.top-area.scrolling-tabs-container.inner-page-scroll-tabs
diff --git a/app/views/search/results/_issuable.html.haml b/app/views/search/results/_issuable.html.haml
index 5645fbfb238..41058034d6f 100644
--- a/app/views/search/results/_issuable.html.haml
+++ b/app/views/search/results/_issuable.html.haml
@@ -13,7 +13,8 @@
= highlight_and_truncate_issuable(issuable, @search_term, @search_highlight)
.col-sm-3.gl-mt-3.gl-sm-mt-0.gl-text-right
- if issuable.respond_to?(:upvotes_count) && issuable.upvotes_count > 0
- %li.issuable-upvotes.gl-list-style-none.has-tooltip{ title: _('Upvotes') }
- = sprite_icon('thumb-up', css_class: "gl-vertical-align-middle")
- = issuable.upvotes_count
+ %li.issuable-upvotes.gl-list-style-none
+ %span.has-tooltip{ title: _('Upvotes') }
+ = sprite_icon('thumb-up', css_class: "gl-vertical-align-middle")
+ = issuable.upvotes_count
%span.gl-text-gray-500= sprintf(s_('updated %{time_ago}'), { time_ago: time_ago_with_tooltip(issuable.updated_at, placement: 'bottom') }).html_safe
diff --git a/app/views/shared/_import_form.html.haml b/app/views/shared/_import_form.html.haml
index f03314563cb..3ab2b969b75 100644
--- a/app/views/shared/_import_form.html.haml
+++ b/app/views/shared/_import_form.html.haml
@@ -9,17 +9,12 @@
= f.text_field :import_url, value: import_url.sanitized_url,
autocomplete: 'off', class: 'form-control gl-form-input', placeholder: 'https://gitlab.company.com/group/project.git', required: true
= render 'shared/global_alert',
- variant: :warning,
- alert_class: 'gl-mt-3 js-import-url-warning hide',
+ variant: :danger,
+ alert_class: 'gl-mt-3 js-import-url-error hide',
dismissible: false,
close_button_class: 'js-close-2fa-enabled-success-alert' do
.gl-alert-body
- = s_('Import|A repository URL usually ends in a .git suffix, although this is not required. Double check to make sure your repository URL is correct.')
-
- .gl-alert.gl-alert-not-dismissible.gl-alert-warning.gl-mt-3.hide#project_import_url_warning
- .gl-alert-container
- = sprite_icon('warning-solid', css_class: 'gl-icon s16 gl-alert-icon gl-alert-icon-no-title')
- .gl-alert-content{ role: 'alert' }
+ = s_('Import|There is not a valid Git repository at this URL. If your HTTP repository is not publicly accessible, verify your credentials.')
.row
.form-group.col-md-6
= f.label :import_url_user, class: 'label-bold' do
diff --git a/app/views/shared/_milestones_filter.html.haml b/app/views/shared/_milestones_filter.html.haml
index eb50960202a..117ed212fd9 100644
--- a/app/views/shared/_milestones_filter.html.haml
+++ b/app/views/shared/_milestones_filter.html.haml
@@ -1,13 +1,15 @@
-%ul.nav-links.mobile-separator.nav.nav-tabs
- %li{ class: milestone_class_for_state(params[:state], 'opened', true) }>
- = link_to milestones_filter_path(state: 'opened') do
- = _('Open')
- %span.badge.badge-pill= counts[:opened]
- %li{ class: milestone_class_for_state(params[:state], 'closed') }>
- = link_to milestones_filter_path(state: 'closed', sort: 'due_date_desc') do
- = _('Closed')
- %span.badge.badge-pill= counts[:closed]
- %li{ class: milestone_class_for_state(params[:state], 'all') }>
- = link_to milestones_filter_path(state: 'all', sort: 'due_date_desc') do
- = _('All')
- %span.badge.badge-pill= counts[:all]
+- count_badge_classes = 'badge badge-muted badge-pill gl-badge gl-tab-counter-badge sm gl-display-none gl-sm-display-inline-flex'
+
+= gl_tabs_nav( {class: 'gl-border-b-0 gl-flex-grow-1', data: { testid: 'milestones-filter' } } ) do
+ = gl_tab_link_to milestones_filter_path(state: 'opened'), { item_active: params[:state].blank? || params[:state] == 'opened' } do
+ = _('Open')
+ %span{ class: count_badge_classes }
+ = counts[:opened]
+ = gl_tab_link_to milestones_filter_path(state: 'closed', sort: 'due_date_desc'), { item_active: params[:state] == 'closed' } do
+ = _('Closed')
+ %span{ class: count_badge_classes }
+ = counts[:closed]
+ = gl_tab_link_to milestones_filter_path(state: 'all', sort: 'due_date_desc'), { item_active: params[:state] == 'all' } do
+ = _('All')
+ %span{ class: count_badge_classes }
+ = counts[:all]
diff --git a/app/views/shared/_web_ide_path.html.haml b/app/views/shared/_web_ide_path.html.haml
new file mode 100644
index 00000000000..73d00bcd408
--- /dev/null
+++ b/app/views/shared/_web_ide_path.html.haml
@@ -0,0 +1,4 @@
+= javascript_tag do
+ :plain
+ window.gl = window.gl || {};
+ window.gl.webIDEPath = '#{web_ide_url}'
diff --git a/app/views/shared/boards/_show.html.haml b/app/views/shared/boards/_show.html.haml
index 98752345074..165564c5666 100644
--- a/app/views/shared/boards/_show.html.haml
+++ b/app/views/shared/boards/_show.html.haml
@@ -2,7 +2,7 @@
- @no_breadcrumb_container = true
- @no_container = true
- @content_wrapper_class = "#{@content_wrapper_class} gl-relative"
-- @content_class = "issue-boards-content js-focus-mode-board"
+- @content_class = "js-focus-mode-board"
- is_epic_board = board.to_type == "EpicBoard"
- if is_epic_board
- breadcrumb_title _("Epic Boards")
diff --git a/app/views/shared/builds/_build_output.html.haml b/app/views/shared/builds/_build_output.html.haml
index 380fac4d0e4..a3b7d4926f8 100644
--- a/app/views/shared/builds/_build_output.html.haml
+++ b/app/views/shared/builds/_build_output.html.haml
@@ -1,4 +1,4 @@
-%pre.build-trace#build-trace
+%pre.build-log
%code.bash.js-build-output
.build-loader-animation.js-build-refresh
.dot
diff --git a/app/views/shared/builds/_tabs.html.haml b/app/views/shared/builds/_tabs.html.haml
index 4973309edf5..498e9cc33ce 100644
--- a/app/views/shared/builds/_tabs.html.haml
+++ b/app/views/shared/builds/_tabs.html.haml
@@ -1,24 +1,19 @@
-%ul.nav-links.mobile-separator.nav.nav-tabs
- %li{ class: active_when(scope.nil?) }>
- = link_to build_path_proc.call(nil) do
- All
- %span.badge.gl-tab-counter-badge.badge-muted.badge-pill.gl-badge.sm.js-totalbuilds-count
- = limited_counter_with_delimiter(all_builds)
+- count_badge_classes = 'badge badge-muted badge-pill gl-badge gl-tab-counter-badge sm gl-display-none gl-sm-display-inline-flex'
- %li{ class: active_when(scope == 'pending') }>
- = link_to build_path_proc.call('pending') do
- Pending
- %span.badge.gl-tab-counter-badge.badge-muted.badge-pill.gl-badge.sm
- = limited_counter_with_delimiter(all_builds.pending)
-
- %li{ class: active_when(scope == 'running') }>
- = link_to build_path_proc.call('running') do
- Running
- %span.badge.gl-tab-counter-badge.badge-muted.badge-pill.gl-badge.sm
- = limited_counter_with_delimiter(all_builds.running)
-
- %li{ class: active_when(scope == 'finished') }>
- = link_to build_path_proc.call('finished') do
- Finished
- %span.badge.gl-tab-counter-badge.badge-muted.badge-pill.gl-badge.sm
- = limited_counter_with_delimiter(all_builds.finished)
+= gl_tabs_nav( {class: 'gl-border-b-0 gl-flex-grow-1', data: { testid: 'jobs-tabs' } } ) do
+ = gl_tab_link_to build_path_proc.call(nil), { item_active: scope.nil? } do
+ = _('All')
+ %span{ class: count_badge_classes }
+ = limited_counter_with_delimiter(all_builds)
+ = gl_tab_link_to build_path_proc.call('pending'), { item_active: scope == 'pending' } do
+ = _('Pending')
+ %span{ class: count_badge_classes }
+ = limited_counter_with_delimiter(all_builds.pending)
+ = gl_tab_link_to build_path_proc.call('running'), { item_active: scope == 'running' } do
+ = _('Running')
+ %span{ class: count_badge_classes }
+ = limited_counter_with_delimiter(all_builds.running)
+ = gl_tab_link_to build_path_proc.call('finished'), { item_active: scope == 'finished' } do
+ = _('Finished')
+ %span{ class: count_badge_classes }
+ = limited_counter_with_delimiter(all_builds.finished)
diff --git a/app/views/shared/deploy_tokens/_form.html.haml b/app/views/shared/deploy_tokens/_form.html.haml
index 652da4b396a..e049afbc40b 100644
--- a/app/views/shared/deploy_tokens/_form.html.haml
+++ b/app/views/shared/deploy_tokens/_form.html.haml
@@ -4,7 +4,6 @@
= s_('DeployTokens|Create a new deploy token for all projects in this group. %{link_start}What are deploy tokens?%{link_end}').html_safe % { link_start: group_deploy_tokens_help_link_start, link_end: '</a>'.html_safe }
= form_for token, url: create_deploy_token_path(group_or_project, anchor: 'js-deploy-tokens'), method: :post, remote: Feature.enabled?(:ajax_new_deploy_token, group_or_project) do |f|
- = form_errors(token)
.form-group
= f.label :name, class: 'label-bold'
diff --git a/app/views/shared/empty_states/_topics.html.haml b/app/views/shared/empty_states/_topics.html.haml
new file mode 100644
index 00000000000..fd82a853037
--- /dev/null
+++ b/app/views/shared/empty_states/_topics.html.haml
@@ -0,0 +1,7 @@
+.row.empty-state
+ .col-12
+ .svg-content
+ = image_tag 'illustrations/labels.svg', data: { qa_selector: 'svg_content' }
+ .text-content.gl-text-center.gl-pt-0!
+ %h4= _('There are no topics to show.')
+ %p= _('Add topics to projects to help users find them.')
diff --git a/app/views/shared/errors/_gitaly_unavailable.html.haml b/app/views/shared/errors/_gitaly_unavailable.html.haml
new file mode 100644
index 00000000000..96a68cbcdc6
--- /dev/null
+++ b/app/views/shared/errors/_gitaly_unavailable.html.haml
@@ -0,0 +1,8 @@
+.gl-alert.gl-alert-danger.gl-mb-5.gl-mt-5
+ .gl-alert-container
+ = sprite_icon('error', size: 16, css_class: 'gl-icon gl-alert-icon gl-alert-icon-no-title')
+ .gl-alert-content
+ .gl-alert-title
+ = reason
+ .gl-alert-body
+ = s_('The git server, Gitaly, is not available at this time. Please contact your administrator.')
diff --git a/app/views/shared/hook_logs/_recent_deliveries_table.html.haml b/app/views/shared/hook_logs/_recent_deliveries_table.html.haml
new file mode 100644
index 00000000000..31ef8560781
--- /dev/null
+++ b/app/views/shared/hook_logs/_recent_deliveries_table.html.haml
@@ -0,0 +1,34 @@
+%table.gl-table.gl-w-full
+ %thead
+ %tr
+ %th= _('Status')
+ %th.d-none.d-sm-table-cell= _('Trigger')
+ %th= _('Elapsed time')
+ %th= _('Request time')
+ %th
+
+ - if hook_logs.present?
+ - hook_logs.each do |hook_log|
+ %tr
+ %td
+ = render partial: 'shared/hook_logs/status_label', locals: { hook_log: hook_log }
+ %td.d-none.d-sm-table-cell
+ %span.badge.badge-pill.gl-badge.badge-muted.sm
+ = hook_log.trigger.singularize.titleize
+ %td
+ #{number_with_precision(hook_log.execution_duration, precision: 2)} sec
+ %td
+ = time_ago_with_tooltip(hook_log.created_at)
+ %td
+ = link_to _('View details'), hook_log_path(hook, hook_log)
+
+
+- if hook_logs.present?
+ = paginate hook_logs, theme: 'gitlab'
+- else
+ .gl-text-center.gl-mt-7
+ %h4= _('No webhook events')
+ %p
+ %span.gl-display-block= _('Webhook events will be displayed here.')
+ %span= _('Use the %{strongStart}Test%{strongEnd} option above to create an event.').html_safe % { strongStart: '<strong>'.html_safe, strongEnd: '</strong>'.html_safe }
+
diff --git a/app/views/shared/hook_logs/_status_label.html.haml b/app/views/shared/hook_logs/_status_label.html.haml
index dfa5ecee448..b930074303c 100644
--- a/app/views/shared/hook_logs/_status_label.html.haml
+++ b/app/views/shared/hook_logs/_status_label.html.haml
@@ -1,3 +1,3 @@
- label_status = hook_log.success? ? 'badge-success' : 'badge-danger'
-%span{ class: "badge #{label_status}" }
+%span{ class: "badge badge-pill gl-badge sm #{label_status}" }
= hook_log.internal_error? ? _('Error') : hook_log.response_status
diff --git a/app/views/shared/integrations/_tabs.html.haml b/app/views/shared/integrations/_tabs.html.haml
index 553401e47bd..d6ca0bd7d1e 100644
--- a/app/views/shared/integrations/_tabs.html.haml
+++ b/app/views/shared/integrations/_tabs.html.haml
@@ -1,18 +1,11 @@
-- active_tab = local_assigns.fetch(:active_tab, 'edit')
-- active_classes = 'gl-tab-nav-item-active gl-tab-nav-item-active-indigo active'
-- tabs = integration_tabs(integration: integration)
-
-- if tabs.length <= 1
- = yield
-- else
+- if integration.instance_level?
.tabs.gl-tabs
%div
- %ul.nav.gl-tabs-nav{ role: 'tablist' }
- - tabs.each do |tab|
- %li.nav-item{ role: 'presentation' }
- %a.nav-link.gl-tab-nav-item{ role: 'tab', class: (active_classes if tab[:key] == active_tab), href: tab[:href] }
- = tab[:text]
+ = gl_tabs_nav({ class: 'gl-mb-5' }) do
+ = gl_tab_link_to _('Settings'), scoped_edit_integration_path(integration)
+ = gl_tab_link_to s_('Integrations|Projects using custom settings'), scoped_overrides_integration_path(integration)
- .tab-content.gl-tab-content
- .tab-pane.gl-pt-3.active{ role: 'tabpanel' }
- = yield
+ = yield
+
+- else
+ = yield
diff --git a/app/views/shared/issuable/_nav.html.haml b/app/views/shared/issuable/_nav.html.haml
index cff50eef88b..4a33f625347 100644
--- a/app/views/shared/issuable/_nav.html.haml
+++ b/app/views/shared/issuable/_nav.html.haml
@@ -2,22 +2,16 @@
- page_context_word = type.to_s.humanize(capitalize: false)
- display_count = local_assigns.fetch(:display_count, true)
-%ul.nav-links.issues-state-filters.mobile-separator.nav.nav-tabs
- %li{ class: active_when(params[:state] == 'opened') }>
- = link_to page_filter_path(state: 'opened'), id: 'state-opened', title: _("Filter by %{page_context_word} that are currently open.") % { page_context_word: page_context_word }, data: { state: 'opened' } do
- #{issuables_state_counter_text(type, :opened, display_count)}
-
+= gl_tabs_nav({ class: 'issues-state-filters gl-border-b-0 gl-flex-grow-1' }) do
+ = gl_tab_link_to page_filter_path(state: 'opened'), { item_active: params[:state] == 'opened', id: 'state-opened', title: _("Filter by %{page_context_word} that are currently open.") % { page_context_word: page_context_word }, data: { state: 'opened' } } do
+ #{issuables_state_counter_text(type, :opened, display_count)}
- if type == :merge_requests
- %li{ class: active_when(params[:state] == 'merged') }>
- = link_to page_filter_path(state: 'merged'), id: 'state-merged', title: _('Filter by merge requests that are currently merged.'), data: { state: 'merged' } do
- #{issuables_state_counter_text(type, :merged, display_count)}
-
- %li{ class: active_when(params[:state] == 'closed') }>
- = link_to page_filter_path(state: 'closed'), id: 'state-closed', title: _('Filter by merge requests that are currently closed and unmerged.'), data: { state: 'closed' } do
- #{issuables_state_counter_text(type, :closed, display_count)}
+ = gl_tab_link_to page_filter_path(state: 'merged'), item_active: params[:state] == 'merged', id: 'state-merged', title: _('Filter by merge requests that are currently merged.'), data: { state: 'merged' } do
+ #{issuables_state_counter_text(type, :merged, display_count)}
+ = gl_tab_link_to page_filter_path(state: 'closed'), item_active: params[:state] == 'closed', id: 'state-closed', title: _('Filter by merge requests that are currently closed and unmerged.'), data: { state: 'closed' } do
+ #{issuables_state_counter_text(type, :closed, display_count)}
- else
- %li{ class: active_when(params[:state] == 'closed') }>
- = link_to page_filter_path(state: 'closed'), id: 'state-closed', title: _('Filter by issues that are currently closed.'), data: { state: 'closed', qa_selector: 'closed_issues_link' } do
- #{issuables_state_counter_text(type, :closed, display_count)}
+ = gl_tab_link_to page_filter_path(state: 'closed'), item_active: params[:state] == 'closed', id: 'state-closed', title: _('Filter by issues that are currently closed.'), data: { state: 'closed', qa_selector: 'closed_issues_link' } do
+ #{issuables_state_counter_text(type, :closed, display_count)}
= render 'shared/issuable/nav_links/all', page_context_word: page_context_word, counter: issuables_state_counter_text(type, :all, display_count)
diff --git a/app/views/shared/issuable/_search_bar.html.haml b/app/views/shared/issuable/_search_bar.html.haml
index e6c4b3f4814..81a7581d392 100644
--- a/app/views/shared/issuable/_search_bar.html.haml
+++ b/app/views/shared/issuable/_search_bar.html.haml
@@ -19,7 +19,7 @@
- if params[:search].present?
= hidden_field_tag :search, params[:search]
- if @can_bulk_update
- .check-all-holder.d-none.d-sm-block.hidden
+ .check-all-holder.gl-display-none.gl-sm-display-block.hidden.gl-float-left.gl-mr-5.gl-line-height-36
- checkbox_id = 'check-all-issues'
%label.gl-sr-only{ for: checkbox_id }= _('Select all')
= check_box_tag checkbox_id, nil, false, class: "check-all-issues left"
diff --git a/app/views/shared/issuable/_sidebar.html.haml b/app/views/shared/issuable/_sidebar.html.haml
index 1e8724c3448..62539bfeffd 100644
--- a/app/views/shared/issuable/_sidebar.html.haml
+++ b/app/views/shared/issuable/_sidebar.html.haml
@@ -7,6 +7,7 @@
- can_edit_issuable = issuable_sidebar.dig(:current_user, :can_edit)
- add_page_startup_api_call "#{issuable_sidebar[:issuable_json_path]}?serializer=sidebar_extras"
- reviewers = local_assigns.fetch(:reviewers, nil)
+- in_group_context_with_iterations = @project.group.present? && issuable_sidebar[:supports_iterations]
%aside.right-sidebar.js-right-sidebar.js-issuable-sidebar{ data: { signed: { in: signed_in }, issuable_type: issuable_type }, class: sidebar_gutter_collapsed_class, 'aria-live' => 'polite', 'aria-label': issuable_type }
.issuable-sidebar
@@ -28,11 +29,11 @@
= render_if_exists 'shared/issuable/sidebar_item_epic', issuable_sidebar: issuable_sidebar, group_path: @project.group.full_path, project_path: issuable_sidebar[:project_full_path], issue_iid: issuable_sidebar[:iid], issuable_type: issuable_type
- if issuable_sidebar[:supports_milestone]
- .block.milestone{ :class => ("gl-border-b-0!" if issuable_sidebar[:supports_iterations]), data: { qa_selector: 'milestone_block' } }
+ .block.milestone{ :class => ("gl-border-b-0!" if in_group_context_with_iterations), data: { qa_selector: 'milestone_block' } }
.js-milestone-select{ data: { can_edit: can_edit_issuable.to_s, project_path: issuable_sidebar[:project_full_path], issue_iid: issuable_sidebar[:iid] } }
- - if @project.group.present? && issuable_sidebar[:supports_iterations]
- .block{ class: 'gl-pt-0!', data: { qa_selector: 'iteration_container' } }
+ - if in_group_context_with_iterations
+ .block{ class: 'gl-pt-0! gl-collapse-empty', data: { qa_selector: 'iteration_container', testid: 'iteration_container' } }<
= render_if_exists 'shared/issuable/iteration_select', can_edit: can_edit_issuable.to_s, group_path: @project.group.full_path, project_path: issuable_sidebar[:project_full_path], issue_iid: issuable_sidebar[:iid], issuable_type: issuable_type
- if issuable_sidebar[:supports_time_tracking]
@@ -55,11 +56,13 @@
.js-sidebar-status-entry-point{ data: sidebar_status_data(issuable_sidebar, @project) }
- if issuable_sidebar.has_key?(:confidential)
+ -# haml-lint:disable InlineJavaScript
%script#js-confidential-issue-data{ type: "application/json" }= { is_confidential: issuable_sidebar[:confidential], is_editable: can_edit_issuable }.to_json.html_safe
#js-confidential-entry-point
= render_if_exists 'shared/issuable/sidebar_cve_id_request', issuable_sidebar: issuable_sidebar
+ -# haml-lint:disable InlineJavaScript
%script#js-lock-issue-data{ type: "application/json" }= { is_locked: !!issuable_sidebar[:discussion_locked], is_editable: can_edit_issuable }.to_json.html_safe
#js-lock-entry-point
@@ -72,7 +75,7 @@
#js-reference-entry-point
- if issuable_type == 'merge_request'
.sub-block.js-sidebar-source-branch
- .sidebar-collapsed-icon.dont-change-state
+ .sidebar-collapsed-icon.js-dont-change-state
= clipboard_button(text: source_branch, title: _('Copy branch name'), placement: "left", boundary: 'viewport')
.gl-display-flex.gl-align-items-center.gl-justify-content-space-between.gl-mb-2.hide-collapsed
%span.gl-overflow-hidden.gl-text-overflow-ellipsis.gl-white-space-nowrap
diff --git a/app/views/shared/issuable/nav_links/_all.html.haml b/app/views/shared/issuable/nav_links/_all.html.haml
index c92a50bcb70..7afa194d5db 100644
--- a/app/views/shared/issuable/nav_links/_all.html.haml
+++ b/app/views/shared/issuable/nav_links/_all.html.haml
@@ -1,6 +1,5 @@
- page_context_word = local_assigns.fetch(:page_context_word)
- counter = local_assigns.fetch(:counter)
-%li{ class: active_when(params[:state] == 'all') }>
- = link_to page_filter_path(state: 'all'), id: 'state-all', title: "Show all #{page_context_word}.", data: { state: 'all' } do
- #{counter}
+= gl_tab_link_to page_filter_path(state: 'all'), item_active: params[:state] == 'all', id: 'state-all', title: _("Show all %{issuable_type}.") % { issuable_type: page_context_word }, data: { state: 'all' } do
+ #{counter}
diff --git a/app/views/shared/issue_type/_emoji_block.html.haml b/app/views/shared/issue_type/_emoji_block.html.haml
index 26d30341999..d2c851a4e49 100644
--- a/app/views/shared/issue_type/_emoji_block.html.haml
+++ b/app/views/shared/issue_type/_emoji_block.html.haml
@@ -4,7 +4,7 @@
.row.gl-m-0.gl-justify-content-space-between
.js-noteable-awards
= render 'award_emoji/awards_block', awardable: issuable, inline: true, api_awards_path: api_awards_path
- .new-branch-col.gl-my-2
+ .new-branch-col.gl-my-2.gl-font-size-0
= render_if_exists "projects/issues/timeline_toggle", issuable: issuable
#js-vue-sort-issue-discussions
#js-vue-discussion-filter{ data: { default_filter: current_user&.notes_filter_for(issuable), notes_filters: UserPreference.notes_filters.to_json } }
diff --git a/app/views/shared/milestones/_sidebar.html.haml b/app/views/shared/milestones/_sidebar.html.haml
index 56b2b0d5801..c66ba5ba2e1 100644
--- a/app/views/shared/milestones/_sidebar.html.haml
+++ b/app/views/shared/milestones/_sidebar.html.haml
@@ -161,11 +161,11 @@
- milestone_ref = milestone.try(:to_reference, full: true)
- if milestone_ref.present?
.block.reference
- .sidebar-collapsed-icon.dont-change-state
+ .sidebar-collapsed-icon.js-dont-change-state
= clipboard_button(text: milestone_ref, title: s_('MilestoneSidebar|Copy reference'), placement: "left", boundary: 'viewport')
.cross-project-reference.hide-collapsed
- %span
+ %span.gl-display-inline-block.gl-text-truncate
= s_('MilestoneSidebar|Reference:')
%span{ title: milestone_ref }
= milestone_ref
- = clipboard_button(text: milestone_ref, title: s_('MilestoneSidebar|Copy reference'), placement: "left", boundary: 'viewport')
+ = clipboard_button(text: milestone_ref, title: s_('MilestoneSidebar|Copy reference'), placement: "left", boundary: 'viewport', class: 'btn-clipboard btn-transparent gl-float-right gl-bg-gray-10')
diff --git a/app/views/shared/notes/_comment_button.html.haml b/app/views/shared/notes/_comment_button.html.haml
index d0a2d97df0f..3e880a36e29 100644
--- a/app/views/shared/notes/_comment_button.html.haml
+++ b/app/views/shared/notes/_comment_button.html.haml
@@ -1,31 +1,4 @@
- noteable_name = @note.noteable.human_class_name
-.float-left.btn-group.gl-sm-mr-3.droplab-dropdown.comment-type-dropdown.js-comment-type-dropdown
+.js-comment-type-dropdown.float-left.gl-sm-mr-3{ data: { noteable_name: noteable_name } }
%input.btn.gl-button.btn-confirm.js-comment-button.js-comment-submit-button{ type: 'submit', value: _('Comment'), data: { qa_selector: 'comment_button' } }
-
- - if @note.can_be_discussion_note?
- = button_tag type: 'button', class: 'gl-button btn dropdown-toggle btn-confirm js-note-new-discussion js-disable-on-submit', data: { 'dropdown-trigger' => '#resolvable-comment-menu' }, 'aria-label' => _('Open comment type dropdown') do
- = sprite_icon('chevron-down')
-
- %ul#resolvable-comment-menu.dropdown-menu.dropdown-open-top{ data: { dropdown: true } }
- %li#comment.droplab-item-selected{ data: { value: '', 'submit-text' => _('Comment'), 'close-text' => _("Comment & close %{noteable_name}") % { noteable_name: noteable_name }, 'reopen-text' => _("Comment & reopen %{noteable_name}") % { noteable_name: noteable_name } } }
- %button.btn.gl-button.btn-default-tertiary
- = sprite_icon('check', css_class: 'icon')
- .description
- %strong= _("Comment")
- %p
- = _("Add a general comment to this %{noteable_name}.") % { noteable_name: noteable_name }
-
- %li.divider.droplab-item-ignore
-
- %li#discussion{ data: { value: 'DiscussionNote', 'submit-text' => _('Start thread'), 'close-text' => _("Start thread & close %{noteable_name}") % { noteable_name: noteable_name }, 'reopen-text' => _("Start thread & reopen %{noteable_name}") % { noteable_name: noteable_name } } }
- %button.btn.gl-button.btn-default-tertiary
- = sprite_icon('check', css_class: 'icon')
- .description
- %strong= _("Start thread")
- %p
- = succeed '.' do
- - if @note.noteable.supports_resolvable_notes?
- = _('Discuss a specific suggestion or question that needs to be resolved')
- - else
- = _('Discuss a specific suggestion or question')
diff --git a/app/views/shared/notes/_hints.html.haml b/app/views/shared/notes/_hints.html.haml
index a03e8446f5d..6231f817704 100644
--- a/app/views/shared/notes/_hints.html.haml
+++ b/app/views/shared/notes/_hints.html.haml
@@ -1,4 +1,5 @@
- supports_quick_actions = local_assigns.fetch(:supports_quick_actions, false)
+- supports_file_upload = local_assigns.fetch(:supports_file_upload, true)
.comment-toolbar.clearfix
.toolbar-text
= link_to _('Markdown'), help_page_path('user/markdown'), target: '_blank'
@@ -10,33 +11,34 @@
is
supported
- %span.uploading-container
- %span.uploading-progress-container.hide
- = sprite_icon('media', css_class: 'gl-icon gl-vertical-align-text-bottom')
- %span.attaching-file-message
- -# Populated by app/assets/javascripts/dropzone_input.js
- %span.uploading-progress 0%
- = loading_icon(css_class: 'align-text-bottom gl-mr-2')
-
- %span.uploading-error-container.hide
- %span.uploading-error-icon
+ - if supports_file_upload
+ %span.uploading-container
+ %span.uploading-progress-container.hide
= sprite_icon('media', css_class: 'gl-icon gl-vertical-align-text-bottom')
- %span.uploading-error-message
- -# Populated by app/assets/javascripts/dropzone_input.js
- %button.btn.gl-button.btn-link.gl-vertical-align-baseline.retry-uploading-link
- %span.gl-button-text
- = _("Try again")
- = _("or")
- %button.btn.gl-button.btn-link.attach-new-file.markdown-selector.gl-vertical-align-baseline
- %span.gl-button-text
- = _("attach a new file")
- = _(".")
+ %span.attaching-file-message
+ -# Populated by app/assets/javascripts/dropzone_input.js
+ %span.uploading-progress 0%
+ = loading_icon(css_class: 'align-text-bottom gl-mr-2')
- %button.btn.gl-button.btn-link.button-attach-file.markdown-selector.button-attach-file.gl-vertical-align-text-bottom
- = sprite_icon('media')
- %span.gl-button-text
- = _("Attach a file")
+ %span.uploading-error-container.hide
+ %span.uploading-error-icon
+ = sprite_icon('media', css_class: 'gl-icon gl-vertical-align-text-bottom')
+ %span.uploading-error-message
+ -# Populated by app/assets/javascripts/dropzone_input.js
+ %button.btn.gl-button.btn-link.gl-vertical-align-baseline.retry-uploading-link
+ %span.gl-button-text
+ = _("Try again")
+ = _("or")
+ %button.btn.gl-button.btn-link.attach-new-file.markdown-selector.gl-vertical-align-baseline
+ %span.gl-button-text
+ = _("attach a new file")
+ = _(".")
- %button.btn.gl-button.btn-link.button-cancel-uploading-files.gl-vertical-align-baseline.hide
- %span.gl-button-text
- = _("Cancel")
+ %button.btn.gl-button.btn-link.button-attach-file.markdown-selector.button-attach-file.gl-vertical-align-text-bottom
+ = sprite_icon('media')
+ %span.gl-button-text
+ = _("Attach a file")
+
+ %button.btn.gl-button.btn-link.button-cancel-uploading-files.gl-vertical-align-baseline.hide
+ %span.gl-button-text
+ = _("Cancel")
diff --git a/app/views/shared/notes/_notes_with_form.html.haml b/app/views/shared/notes/_notes_with_form.html.haml
index f7f5c02370d..e34f412baa4 100644
--- a/app/views/shared/notes/_notes_with_form.html.haml
+++ b/app/views/shared/notes/_notes_with_form.html.haml
@@ -25,4 +25,5 @@
= sprite_icon('lock', css_class: 'icon')
%span
= html_escape(_("This %{issuable} is locked. Only %{strong_open}project members%{strong_close} can comment.")) % { issuable: issuable.class.to_s.titleize.downcase, strong_open: '<strong>'.html_safe, strong_close: '</strong>'.html_safe }
+-# haml-lint:disable InlineJavaScript
%script.js-notes-data{ type: "application/json" }= initial_notes_data(autocomplete).to_json.html_safe
diff --git a/app/views/shared/topics/_search_form.html.haml b/app/views/shared/topics/_search_form.html.haml
new file mode 100644
index 00000000000..97343983b3c
--- /dev/null
+++ b/app/views/shared/topics/_search_form.html.haml
@@ -0,0 +1,7 @@
+= form_tag page_filter_path, method: :get, class: "topic-filter-form js-topic-filter-form", id: 'topic-filter-form' do |f|
+ = search_field_tag :search, params[:search],
+ placeholder: s_('Filter by name'),
+ class: 'topic-filter-form-field form-control input-short',
+ spellcheck: false,
+ id: 'topic-filter-form-field',
+ autofocus: local_assigns[:autofocus]
diff --git a/app/views/shared/web_hooks/_hook.html.haml b/app/views/shared/web_hooks/_hook.html.haml
index abe23d0be78..fd124c2967d 100644
--- a/app/views/shared/web_hooks/_hook.html.haml
+++ b/app/views/shared/web_hooks/_hook.html.haml
@@ -5,12 +5,12 @@
%div
- hook.class.triggers.each_value do |trigger|
- if hook.public_send(trigger)
- %span.gl-badge.gl-bg-gray-10.gl-mt-2.rounded.deploy-project-label= trigger.to_s.titleize
- %span.gl-badge.gl-bg-gray-10.gl-mt-2.rounded
+ %span.gl-badge.badge-muted.badge-pill.sm.gl-mt-2.deploy-project-label= trigger.to_s.titleize
+ %span.gl-badge.badge-muted.badge-pill.sm.gl-mt-2
= _('SSL Verification:')
= hook.enable_ssl_verification ? _('enabled') : _('disabled')
.col-md-4.col-lg-5.text-right-md.gl-mt-2
%span>= render 'shared/web_hooks/test_button', hook: hook, button_class: 'btn-sm btn-default gl-mr-3'
%span>= link_to _('Edit'), edit_hook_path(hook), class: 'btn gl-button btn-default btn-sm gl-mr-3'
- = link_to _('Delete'), destroy_hook_path(hook), data: { confirm: _('Are you sure?') }, method: :delete, class: 'btn gl-button btn-default btn-sm'
+ = link_to _('Delete'), destroy_hook_path(hook), data: { confirm: _('Are you sure?') }, method: :delete, class: 'btn gl-button btn-secondary btn-danger-secondary btn-sm'
diff --git a/app/views/shared/wikis/edit.html.haml b/app/views/shared/wikis/edit.html.haml
index 15710f0df49..e0860bc473d 100644
--- a/app/views/shared/wikis/edit.html.haml
+++ b/app/views/shared/wikis/edit.html.haml
@@ -4,7 +4,7 @@
- if @error
#js-wiki-error{ data: { error: @error, wiki_page_path: wiki_page_path(@wiki, @page) } }
-.wiki-page-header.top-area.has-sidebar-toggle.flex-column.flex-lg-row
+.js-wiki-edit-page.wiki-page-header.top-area.has-sidebar-toggle.flex-column.flex-lg-row
= wiki_sidebar_toggle_button
%h3.page-title.gl-flex-grow-1
diff --git a/app/views/snippets/show.html.haml b/app/views/snippets/show.html.haml
index ca52a1f8f46..f1093a3b730 100644
--- a/app/views/snippets/show.html.haml
+++ b/app/views/snippets/show.html.haml
@@ -12,7 +12,7 @@
- content_for :prefetch_asset_tags do
- webpack_preload_asset_tag('monaco', prefetch: true)
-#js-snippet-view{ data: {'qa-selector': 'snippet_view', 'snippet-gid': @snippet.to_global_id, 'report-abuse-path': snippet_report_abuse_path(@snippet) } }
+#js-snippet-view{ data: {'qa-selector': 'snippet_view', 'snippet-gid': @snippet.to_global_id, 'report-abuse-path': snippet_report_abuse_path(@snippet), 'can-report-spam': @snippet.submittable_as_spam_by?(current_user).to_s } }
.row-content-block.top-block.content-component-block
= render 'award_emoji/awards_block', awardable: @snippet, inline: true
diff --git a/app/views/users/show.html.haml b/app/views/users/show.html.haml
index 20cbe08225e..522f0f771cd 100644
--- a/app/views/users/show.html.haml
+++ b/app/views/users/show.html.haml
@@ -84,10 +84,12 @@
= sprite_icon('location', css_class: 'fgray')
%span{ itemprop: 'addressLocality' }
= @user.location
- = render 'middle_dot_divider', stacking: true do
- = sprite_icon('clock', css_class: 'fgray')
- %span
- = local_time(@user.timezone)
+ - user_local_time = local_time(@user.timezone)
+ - unless user_local_time.nil?
+ = render 'middle_dot_divider', stacking: true, data: { testid: 'user-local-time' } do
+ = sprite_icon('clock', css_class: 'fgray')
+ %span
+ = user_local_time
- unless work_information(@user).blank?
= render 'middle_dot_divider', stacking: true do
= sprite_icon('work', css_class: 'fgray')
diff --git a/app/workers/all_queues.yml b/app/workers/all_queues.yml
index 955674b52a4..c7ce2eb8d00 100644
--- a/app/workers/all_queues.yml
+++ b/app/workers/all_queues.yml
@@ -30,6 +30,15 @@
:weight: 1
:idempotent: true
:tags: []
+- :name: authorized_project_update:authorized_project_update_project_recalculate_per_user
+ :worker_name: AuthorizedProjectUpdate::ProjectRecalculatePerUserWorker
+ :feature_category: :authentication_and_authorization
+ :has_external_dependencies:
+ :urgency: :high
+ :resource_boundary: :unknown
+ :weight: 1
+ :idempotent: true
+ :tags: []
- :name: authorized_project_update:authorized_project_update_user_refresh_from_replica
:worker_name: AuthorizedProjectUpdate::UserRefreshFromReplicaWorker
:feature_category: :authentication_and_authorization
@@ -46,7 +55,7 @@
:urgency: :low
:resource_boundary: :unknown
:weight: 1
- :idempotent:
+ :idempotent: true
:tags: []
- :name: authorized_project_update:authorized_project_update_user_refresh_with_low_urgency
:worker_name: AuthorizedProjectUpdate::UserRefreshWithLowUrgencyWorker
@@ -185,7 +194,7 @@
:tags: []
- :name: cronjob:ci_delete_unit_tests
:worker_name: Ci::DeleteUnitTestsWorker
- :feature_category: :continuous_integration
+ :feature_category: :code_testing
:has_external_dependencies:
:urgency: :low
:resource_boundary: :unknown
@@ -194,7 +203,7 @@
:tags: []
- :name: cronjob:ci_pipeline_artifacts_expire_artifacts
:worker_name: Ci::PipelineArtifacts::ExpireArtifactsWorker
- :feature_category: :continuous_integration
+ :feature_category: :build_artifacts
:has_external_dependencies:
:urgency: :low
:resource_boundary: :unknown
@@ -219,6 +228,24 @@
:weight: 1
:idempotent: true
:tags: []
+- :name: cronjob:ci_stuck_builds_drop_running
+ :worker_name: Ci::StuckBuilds::DropRunningWorker
+ :feature_category: :continuous_integration
+ :has_external_dependencies:
+ :urgency: :low
+ :resource_boundary: :unknown
+ :weight: 1
+ :idempotent: true
+ :tags: []
+- :name: cronjob:ci_stuck_builds_drop_scheduled
+ :worker_name: Ci::StuckBuilds::DropScheduledWorker
+ :feature_category: :continuous_integration
+ :has_external_dependencies:
+ :urgency: :low
+ :resource_boundary: :unknown
+ :weight: 1
+ :idempotent: true
+ :tags: []
- :name: cronjob:container_expiration_policy
:worker_name: ContainerExpirationPolicyWorker
:feature_category: :container_registry
@@ -255,6 +282,15 @@
:weight: 1
:idempotent: true
:tags: []
+- :name: cronjob:dependency_proxy_image_ttl_group_policy
+ :worker_name: DependencyProxy::ImageTtlGroupPolicyWorker
+ :feature_category: :dependency_proxy
+ :has_external_dependencies:
+ :urgency: :low
+ :resource_boundary: :unknown
+ :weight: 1
+ :idempotent:
+ :tags: []
- :name: cronjob:environments_auto_delete_cron
:worker_name: Environments::AutoDeleteCronWorker
:feature_category: :continuous_delivery
@@ -275,7 +311,7 @@
:tags: []
- :name: cronjob:expire_build_artifacts
:worker_name: ExpireBuildArtifactsWorker
- :feature_category: :continuous_integration
+ :feature_category: :build_artifacts
:has_external_dependencies:
:urgency: :low
:resource_boundary: :unknown
@@ -347,7 +383,7 @@
:tags: []
- :name: cronjob:namespaces_in_product_marketing_emails
:worker_name: Namespaces::InProductMarketingEmailsWorker
- :feature_category: :subgroups
+ :feature_category: :experimentation_activation
:has_external_dependencies:
:urgency: :low
:resource_boundary: :unknown
@@ -557,7 +593,7 @@
:feature_category: :continuous_integration
:has_external_dependencies:
:urgency: :low
- :resource_boundary: :cpu
+ :resource_boundary: :unknown
:weight: 1
:idempotent:
:tags: []
@@ -642,6 +678,24 @@
:weight: 1
:idempotent: true
:tags: []
+- :name: dependency_proxy_blob:dependency_proxy_cleanup_blob
+ :worker_name: DependencyProxy::CleanupBlobWorker
+ :feature_category: :dependency_proxy
+ :has_external_dependencies:
+ :urgency: :low
+ :resource_boundary: :unknown
+ :weight: 1
+ :idempotent: true
+ :tags: []
+- :name: dependency_proxy_manifest:dependency_proxy_cleanup_manifest
+ :worker_name: DependencyProxy::CleanupManifestWorker
+ :feature_category: :dependency_proxy
+ :has_external_dependencies:
+ :urgency: :low
+ :resource_boundary: :unknown
+ :weight: 1
+ :idempotent: true
+ :tags: []
- :name: deployment:deployments_drop_older_deployments
:worker_name: Deployments::DropOlderDeploymentsWorker
:feature_category: :continuous_delivery
@@ -1418,7 +1472,7 @@
:urgency: :high
:resource_boundary: :unknown
:weight: 3
- :idempotent:
+ :idempotent: true
:tags: []
- :name: pipeline_cache:expire_pipeline_cache
:worker_name: ExpirePipelineCacheWorker
@@ -1474,6 +1528,15 @@
:weight: 3
:idempotent:
:tags: []
+- :name: pipeline_default:ci_create_downstream_pipeline
+ :worker_name: Ci::CreateDownstreamPipelineWorker
+ :feature_category: :continuous_integration
+ :has_external_dependencies:
+ :urgency: :low
+ :resource_boundary: :cpu
+ :weight: 3
+ :idempotent:
+ :tags: []
- :name: pipeline_default:ci_drop_pipeline
:worker_name: Ci::DropPipelineWorker
:feature_category: :continuous_integration
@@ -1890,7 +1953,7 @@
:tags: []
- :name: default
:worker_name:
- :feature_category:
+ :feature_category: :not_owned
:has_external_dependencies:
:urgency:
:resource_boundary:
@@ -2044,7 +2107,7 @@
:tags: []
- :name: expire_build_instance_artifacts
:worker_name: ExpireBuildInstanceArtifactsWorker
- :feature_category: :continuous_integration
+ :feature_category: :build_artifacts
:has_external_dependencies:
:urgency: :low
:resource_boundary: :unknown
@@ -2215,7 +2278,7 @@
:tags: []
- :name: mailers
:worker_name: ActionMailer::MailDeliveryJob
- :feature_category: :issue_tracking
+ :feature_category: :not_owned
:has_external_dependencies:
:urgency: low
:resource_boundary:
@@ -2314,7 +2377,7 @@
:tags: []
- :name: namespaces_onboarding_issue_created
:worker_name: Namespaces::OnboardingIssueCreatedWorker
- :feature_category: :issue_tracking
+ :feature_category: :onboarding
:has_external_dependencies:
:urgency: :low
:resource_boundary: :unknown
@@ -2323,7 +2386,7 @@
:tags: []
- :name: namespaces_onboarding_pipeline_created
:worker_name: Namespaces::OnboardingPipelineCreatedWorker
- :feature_category: :subgroups
+ :feature_category: :onboarding
:has_external_dependencies:
:urgency: :low
:resource_boundary: :unknown
@@ -2332,7 +2395,7 @@
:tags: []
- :name: namespaces_onboarding_progress
:worker_name: Namespaces::OnboardingProgressWorker
- :feature_category: :product_analytics
+ :feature_category: :onboarding
:has_external_dependencies:
:urgency: :low
:resource_boundary: :cpu
@@ -2341,7 +2404,7 @@
:tags: []
- :name: namespaces_onboarding_user_added
:worker_name: Namespaces::OnboardingUserAddedWorker
- :feature_category: :users
+ :feature_category: :onboarding
:has_external_dependencies:
:urgency: :low
:resource_boundary: :unknown
@@ -2411,15 +2474,6 @@
:weight: 1
:idempotent:
:tags: []
-- :name: pages_remove
- :worker_name: PagesRemoveWorker
- :feature_category: :pages
- :has_external_dependencies:
- :urgency: :low
- :resource_boundary: :unknown
- :weight: 1
- :idempotent:
- :tags: []
- :name: pages_transfer
:worker_name: PagesTransferWorker
:feature_category: :pages
diff --git a/app/workers/authorized_project_update/project_recalculate_per_user_worker.rb b/app/workers/authorized_project_update/project_recalculate_per_user_worker.rb
new file mode 100644
index 00000000000..352c82e5021
--- /dev/null
+++ b/app/workers/authorized_project_update/project_recalculate_per_user_worker.rb
@@ -0,0 +1,25 @@
+# frozen_string_literal: true
+
+module AuthorizedProjectUpdate
+ class ProjectRecalculatePerUserWorker < ProjectRecalculateWorker
+ data_consistency :always
+
+ feature_category :authentication_and_authorization
+ urgency :high
+ queue_namespace :authorized_project_update
+
+ deduplicate :until_executing, including_scheduled: true
+ idempotent!
+
+ def perform(project_id, user_id)
+ project = Project.find_by_id(project_id)
+ user = User.find_by_id(user_id)
+
+ return unless project && user
+
+ in_lock(lock_key(project), ttl: 10.seconds) do
+ AuthorizedProjectUpdate::ProjectRecalculatePerUserService.new(project, user).execute
+ end
+ end
+ end
+end
diff --git a/app/workers/authorized_project_update/project_recalculate_worker.rb b/app/workers/authorized_project_update/project_recalculate_worker.rb
index 4d350d95e7e..3d073f18622 100644
--- a/app/workers/authorized_project_update/project_recalculate_worker.rb
+++ b/app/workers/authorized_project_update/project_recalculate_worker.rb
@@ -26,7 +26,9 @@ module AuthorizedProjectUpdate
private
def lock_key(project)
- "#{self.class.name.underscore}/projects/#{project.id}"
+ # The self.class.name.underscore value is hardcoded here as the prefix, so that the same
+ # lock_key for this superclass will be used by the ProjectRecalculatePerUserWorker subclass.
+ "authorized_project_update/project_recalculate_worker/projects/#{project.id}"
end
end
end
diff --git a/app/workers/authorized_project_update/user_refresh_from_replica_worker.rb b/app/workers/authorized_project_update/user_refresh_from_replica_worker.rb
index 48e3d0837c7..daebb23baae 100644
--- a/app/workers/authorized_project_update/user_refresh_from_replica_worker.rb
+++ b/app/workers/authorized_project_update/user_refresh_from_replica_worker.rb
@@ -30,8 +30,6 @@ module AuthorizedProjectUpdate
# does not allow us to deduplicate these jobs.
# https://gitlab.com/gitlab-org/gitlab/-/issues/325291
def use_replica_if_available(&block)
- return yield unless ::Gitlab::Database::LoadBalancing.enable?
-
::Gitlab::Database::LoadBalancing::Session.current.use_replicas_for_read_queries(&block)
end
diff --git a/app/workers/authorized_project_update/user_refresh_over_user_range_worker.rb b/app/workers/authorized_project_update/user_refresh_over_user_range_worker.rb
index ab4d9c13422..f5327449242 100644
--- a/app/workers/authorized_project_update/user_refresh_over_user_range_worker.rb
+++ b/app/workers/authorized_project_update/user_refresh_over_user_range_worker.rb
@@ -19,11 +19,10 @@ module AuthorizedProjectUpdate
feature_category :authentication_and_authorization
urgency :low
queue_namespace :authorized_project_update
- # This job will not be deduplicated since it is marked with
- # `data_consistency :delayed` and not `idempotent!`
- # See https://gitlab.com/gitlab-org/gitlab/-/issues/325291
+
deduplicate :until_executing, including_scheduled: true
data_consistency :delayed
+ idempotent!
def perform(start_user_id, end_user_id)
User.where(id: start_user_id..end_user_id).find_each do |user| # rubocop: disable CodeReuse/ActiveRecord
diff --git a/app/workers/bulk_import_worker.rb b/app/workers/bulk_import_worker.rb
index fa255d064cc..d560ebcc6e6 100644
--- a/app/workers/bulk_import_worker.rb
+++ b/app/workers/bulk_import_worker.rb
@@ -26,7 +26,7 @@ class BulkImportWorker # rubocop:disable Scalability/IdempotentWorker
created_entities.first(next_batch_size).each do |entity|
entity.create_pipeline_trackers!
- BulkImports::ExportRequestWorker.perform_async(entity.id) if entity.group_entity?
+ BulkImports::ExportRequestWorker.perform_async(entity.id)
BulkImports::EntityWorker.perform_async(entity.id)
entity.start!
diff --git a/app/workers/bulk_imports/export_request_worker.rb b/app/workers/bulk_imports/export_request_worker.rb
index d5f7215b08a..8bc0acc9b22 100644
--- a/app/workers/bulk_imports/export_request_worker.rb
+++ b/app/workers/bulk_imports/export_request_worker.rb
@@ -10,8 +10,6 @@ module BulkImports
worker_has_external_dependencies!
feature_category :importers
- GROUP_EXPORTED_URL_PATH = "/groups/%s/export_relations"
-
def perform(entity_id)
entity = BulkImports::Entity.find(entity_id)
@@ -21,8 +19,7 @@ module BulkImports
private
def request_export(entity)
- http_client(entity.bulk_import.configuration)
- .post(GROUP_EXPORTED_URL_PATH % entity.encoded_source_full_path)
+ http_client(entity.bulk_import.configuration).post(entity.export_relations_url_path)
end
def http_client(configuration)
diff --git a/app/workers/bulk_imports/pipeline_worker.rb b/app/workers/bulk_imports/pipeline_worker.rb
index 760a309a381..35633b55489 100644
--- a/app/workers/bulk_imports/pipeline_worker.rb
+++ b/app/workers/bulk_imports/pipeline_worker.rb
@@ -16,7 +16,7 @@ module BulkImports
def perform(pipeline_tracker_id, stage, entity_id)
pipeline_tracker = ::BulkImports::Tracker
- .with_status(:created)
+ .with_status(:created, :started)
.find_by_id(pipeline_tracker_id)
if pipeline_tracker.present?
@@ -59,18 +59,35 @@ module BulkImports
pipeline_tracker.pipeline_class.new(context).run
pipeline_tracker.finish!
+ rescue BulkImports::NetworkError => e
+ if e.retriable?(pipeline_tracker)
+ logger.error(
+ worker: self.class.name,
+ entity_id: pipeline_tracker.entity.id,
+ pipeline_name: pipeline_tracker.pipeline_name,
+ message: "Retrying error: #{e.message}"
+ )
+
+ reenqueue(pipeline_tracker, delay: e.retry_delay)
+ else
+ fail_tracker(pipeline_tracker, e)
+ end
rescue StandardError => e
+ fail_tracker(pipeline_tracker, e)
+ end
+
+ def fail_tracker(pipeline_tracker, exception)
pipeline_tracker.update!(status_event: 'fail_op', jid: jid)
logger.error(
worker: self.class.name,
entity_id: pipeline_tracker.entity.id,
pipeline_name: pipeline_tracker.pipeline_name,
- message: e.message
+ message: exception.message
)
Gitlab::ErrorTracking.track_exception(
- e,
+ exception,
entity_id: pipeline_tracker.entity.id,
pipeline_name: pipeline_tracker.pipeline_name
)
@@ -88,8 +105,13 @@ module BulkImports
(Time.zone.now - pipeline_tracker.entity.created_at) > Pipeline::NDJSON_EXPORT_TIMEOUT
end
- def reenqueue(pipeline_tracker)
- self.class.perform_in(NDJSON_PIPELINE_PERFORM_DELAY, pipeline_tracker.id, pipeline_tracker.stage, pipeline_tracker.entity.id)
+ def reenqueue(pipeline_tracker, delay: NDJSON_PIPELINE_PERFORM_DELAY)
+ self.class.perform_in(
+ delay,
+ pipeline_tracker.id,
+ pipeline_tracker.stage,
+ pipeline_tracker.entity.id
+ )
end
end
end
diff --git a/app/workers/ci/build_finished_worker.rb b/app/workers/ci/build_finished_worker.rb
index 3bca3015988..f047ba8fde5 100644
--- a/app/workers/ci/build_finished_worker.rb
+++ b/app/workers/ci/build_finished_worker.rb
@@ -15,13 +15,13 @@ module Ci
ARCHIVE_TRACES_IN = 2.minutes.freeze
- # rubocop: disable CodeReuse/ActiveRecord
def perform(build_id)
- Ci::Build.find_by(id: build_id).try do |build|
- process_build(build)
- end
+ return unless build = Ci::Build.find_by(id: build_id) # rubocop: disable CodeReuse/ActiveRecord
+ return unless build.project
+ return if build.project.pending_delete?
+
+ process_build(build)
end
- # rubocop: enable CodeReuse/ActiveRecord
private
diff --git a/app/workers/ci/create_downstream_pipeline_worker.rb b/app/workers/ci/create_downstream_pipeline_worker.rb
new file mode 100644
index 00000000000..6d4cd2539c1
--- /dev/null
+++ b/app/workers/ci/create_downstream_pipeline_worker.rb
@@ -0,0 +1,19 @@
+# frozen_string_literal: true
+
+module Ci
+ class CreateDownstreamPipelineWorker # rubocop:disable Scalability/IdempotentWorker
+ include ::ApplicationWorker
+ include ::PipelineQueue
+
+ sidekiq_options retry: 3
+ worker_resource_boundary :cpu
+
+ def perform(bridge_id)
+ ::Ci::Bridge.find_by_id(bridge_id).try do |bridge|
+ ::Ci::CreateDownstreamPipelineService
+ .new(bridge.project, bridge.user)
+ .execute(bridge)
+ end
+ end
+ end
+end
diff --git a/app/workers/ci/delete_unit_tests_worker.rb b/app/workers/ci/delete_unit_tests_worker.rb
index d5bb72ce80c..01d909773d2 100644
--- a/app/workers/ci/delete_unit_tests_worker.rb
+++ b/app/workers/ci/delete_unit_tests_worker.rb
@@ -10,7 +10,7 @@ module Ci
include CronjobQueue
# rubocop:enable Scalability/CronWorkerContext
- feature_category :continuous_integration
+ feature_category :code_testing
idempotent!
def perform
diff --git a/app/workers/ci/pipeline_artifacts/expire_artifacts_worker.rb b/app/workers/ci/pipeline_artifacts/expire_artifacts_worker.rb
index 2af07cf6f93..cde3d71286e 100644
--- a/app/workers/ci/pipeline_artifacts/expire_artifacts_worker.rb
+++ b/app/workers/ci/pipeline_artifacts/expire_artifacts_worker.rb
@@ -14,7 +14,7 @@ module Ci
deduplicate :until_executed, including_scheduled: true
idempotent!
- feature_category :continuous_integration
+ feature_category :build_artifacts
def perform
service = ::Ci::PipelineArtifacts::DestroyAllExpiredService.new
diff --git a/app/workers/ci/stuck_builds/drop_running_worker.rb b/app/workers/ci/stuck_builds/drop_running_worker.rb
new file mode 100644
index 00000000000..db571fdc38d
--- /dev/null
+++ b/app/workers/ci/stuck_builds/drop_running_worker.rb
@@ -0,0 +1,34 @@
+# frozen_string_literal: true
+
+module Ci
+ module StuckBuilds
+ class DropRunningWorker
+ include ApplicationWorker
+ include ExclusiveLeaseGuard
+
+ idempotent!
+
+ # rubocop:disable Scalability/CronWorkerContext
+ # This is an instance-wide cleanup query, so there's no meaningful
+ # scope to consider this in the context of.
+ include CronjobQueue
+ # rubocop:enable Scalability/CronWorkerContext
+
+ data_consistency :always
+
+ feature_category :continuous_integration
+
+ def perform
+ try_obtain_lease do
+ Ci::StuckBuilds::DropRunningService.new.execute
+ end
+ end
+
+ private
+
+ def lease_timeout
+ 30.minutes
+ end
+ end
+ end
+end
diff --git a/app/workers/ci/stuck_builds/drop_scheduled_worker.rb b/app/workers/ci/stuck_builds/drop_scheduled_worker.rb
new file mode 100644
index 00000000000..923841771cf
--- /dev/null
+++ b/app/workers/ci/stuck_builds/drop_scheduled_worker.rb
@@ -0,0 +1,34 @@
+# frozen_string_literal: true
+
+module Ci
+ module StuckBuilds
+ class DropScheduledWorker
+ include ApplicationWorker
+ include ExclusiveLeaseGuard
+
+ idempotent!
+
+ # rubocop:disable Scalability/CronWorkerContext
+ # This is an instance-wide cleanup query, so there's no meaningful
+ # scope to consider this in the context of.
+ include CronjobQueue
+ # rubocop:enable Scalability/CronWorkerContext
+
+ data_consistency :always
+
+ feature_category :continuous_integration
+
+ def perform
+ try_obtain_lease do
+ Ci::StuckBuilds::DropScheduledService.new.execute
+ end
+ end
+
+ private
+
+ def lease_timeout
+ 30.minutes
+ end
+ end
+ end
+end
diff --git a/app/workers/cleanup_container_repository_worker.rb b/app/workers/cleanup_container_repository_worker.rb
index 9adc026ced2..7274ecf62f9 100644
--- a/app/workers/cleanup_container_repository_worker.rb
+++ b/app/workers/cleanup_container_repository_worker.rb
@@ -28,8 +28,8 @@ class CleanupContainerRepositoryWorker
end
result = Projects::ContainerRepository::CleanupTagsService
- .new(project, current_user, params)
- .execute(container_repository)
+ .new(container_repository, current_user, params)
+ .execute
if run_by_container_expiration_policy? && result[:status] == :success
container_repository.reset_expiration_policy_started_at!
diff --git a/app/workers/concerns/dependency_proxy/cleanup_worker.rb b/app/workers/concerns/dependency_proxy/cleanup_worker.rb
new file mode 100644
index 00000000000..b668634f233
--- /dev/null
+++ b/app/workers/concerns/dependency_proxy/cleanup_worker.rb
@@ -0,0 +1,63 @@
+# frozen_string_literal: true
+
+module DependencyProxy
+ module CleanupWorker
+ extend ActiveSupport::Concern
+ include Gitlab::Utils::StrongMemoize
+
+ def perform_work
+ return unless artifact
+
+ log_metadata(artifact)
+
+ artifact.destroy!
+ rescue StandardError
+ artifact&.error!
+ end
+
+ def max_running_jobs
+ ::Gitlab::CurrentSettings.dependency_proxy_ttl_group_policy_worker_capacity
+ end
+
+ def remaining_work_count
+ expired_artifacts.limit(max_running_jobs + 1).count
+ end
+
+ private
+
+ def model
+ raise NotImplementedError
+ end
+
+ def log_metadata
+ raise NotImplementedError
+ end
+
+ def log_cleanup_item
+ raise NotImplementedError
+ end
+
+ def artifact
+ strong_memoize(:artifact) do
+ model.transaction do
+ to_delete = next_item
+
+ if to_delete
+ to_delete.processing!
+ log_cleanup_item(to_delete)
+ end
+
+ to_delete
+ end
+ end
+ end
+
+ def expired_artifacts
+ model.expired
+ end
+
+ def next_item
+ expired_artifacts.lock_next_by(:updated_at).first
+ end
+ end
+end
diff --git a/app/workers/concerns/gitlab/github_import/object_importer.rb b/app/workers/concerns/gitlab/github_import/object_importer.rb
index a377b7a2000..e1f404b250d 100644
--- a/app/workers/concerns/gitlab/github_import/object_importer.rb
+++ b/app/workers/concerns/gitlab/github_import/object_importer.rb
@@ -26,8 +26,7 @@ module Gitlab
object = representation_class.from_json_hash(hash)
# To better express in the logs what object is being imported.
- self.github_id = object.attributes.fetch(:github_id)
-
+ self.github_identifiers = object.github_identifiers
info(project.id, message: 'starting importer')
importer_class.new(object, project, client).execute
@@ -35,10 +34,10 @@ module Gitlab
Gitlab::GithubImport::ObjectCounter.increment(project, object_type, :imported)
info(project.id, message: 'importer finished')
- rescue KeyError => e
+ rescue NoMethodError => e
# This exception will be more useful in development when a new
# Representation is created but the developer forgot to add a
- # `:github_id` field.
+ # `:github_identifiers` field.
Gitlab::Import::ImportFailureService.track(
project_id: project.id,
error_source: importer_class.name,
@@ -72,7 +71,7 @@ module Gitlab
private
- attr_accessor :github_id
+ attr_accessor :github_identifiers
def info(project_id, extra = {})
Logger.info(log_attributes(project_id, extra))
@@ -82,7 +81,7 @@ module Gitlab
extra.merge(
project_id: project_id,
importer: importer_class.name,
- github_id: github_id
+ github_identifiers: github_identifiers
)
end
end
diff --git a/app/workers/concerns/worker_attributes.rb b/app/workers/concerns/worker_attributes.rb
index eebea30655c..6f91418e38c 100644
--- a/app/workers/concerns/worker_attributes.rb
+++ b/app/workers/concerns/worker_attributes.rb
@@ -46,8 +46,14 @@ module WorkerAttributes
set_class_attribute(:feature_category, :not_owned)
end
+ # Special case: if a worker is not owned, get the feature category
+ # (if present) from the calling context.
def get_feature_category
- get_class_attribute(:feature_category)
+ feature_category = get_class_attribute(:feature_category)
+
+ return feature_category unless feature_category == :not_owned
+
+ Gitlab::ApplicationContext.current_context_attribute('meta.feature_category') || feature_category
end
def feature_category_not_owned?
diff --git a/app/workers/container_expiration_policies/cleanup_container_repository_worker.rb b/app/workers/container_expiration_policies/cleanup_container_repository_worker.rb
index 433ed5e0ea4..69f5906f54c 100644
--- a/app/workers/container_expiration_policies/cleanup_container_repository_worker.rb
+++ b/app/workers/container_expiration_policies/cleanup_container_repository_worker.rb
@@ -21,6 +21,7 @@ module ContainerExpirationPolicies
cleanup_tags_service_original_size
cleanup_tags_service_before_truncate_size
cleanup_tags_service_after_truncate_size
+ cleanup_tags_service_cached_tags_count
cleanup_tags_service_before_delete_size
cleanup_tags_service_deleted_size
].freeze
@@ -147,13 +148,27 @@ module ContainerExpirationPolicies
log_extra_metadata_on_done(field, value)
end
+ log_truncate(result)
+ log_cache_ratio(result)
+ log_extra_metadata_on_done(:running_jobs_count, running_jobs_count)
+ end
+
+ def log_cache_ratio(result)
+ tags_count = result.payload[:cleanup_tags_service_after_truncate_size]
+ cached_tags_count = result.payload[:cleanup_tags_service_cached_tags_count]
+
+ return unless tags_count && cached_tags_count && tags_count != 0
+
+ log_extra_metadata_on_done(:cleanup_tags_service_cache_hit_ratio, cached_tags_count / tags_count.to_f)
+ end
+
+ def log_truncate(result)
before_truncate_size = result.payload[:cleanup_tags_service_before_truncate_size]
after_truncate_size = result.payload[:cleanup_tags_service_after_truncate_size]
truncated = before_truncate_size &&
after_truncate_size &&
before_truncate_size != after_truncate_size
log_extra_metadata_on_done(:cleanup_tags_service_truncated, !!truncated)
- log_extra_metadata_on_done(:running_jobs_count, running_jobs_count)
end
def policy
diff --git a/app/workers/container_expiration_policy_worker.rb b/app/workers/container_expiration_policy_worker.rb
index a791fe5d350..5fcbd74ddad 100644
--- a/app/workers/container_expiration_policy_worker.rb
+++ b/app/workers/container_expiration_policy_worker.rb
@@ -45,8 +45,6 @@ class ContainerExpirationPolicyWorker # rubocop:disable Scalability/IdempotentWo
# not perfomed with a delay
# https://gitlab.com/gitlab-org/gitlab/-/merge_requests/63635#note_603771207
def use_replica_if_available(&blk)
- return yield unless ::Gitlab::Database::LoadBalancing.enable?
-
::Gitlab::Database::LoadBalancing::Session.current.use_replicas_for_read_queries(&blk)
end
diff --git a/app/workers/create_note_diff_file_worker.rb b/app/workers/create_note_diff_file_worker.rb
index 4bea4fc872e..8481fd0a2ab 100644
--- a/app/workers/create_note_diff_file_worker.rb
+++ b/app/workers/create_note_diff_file_worker.rb
@@ -10,8 +10,10 @@ class CreateNoteDiffFileWorker # rubocop:disable Scalability/IdempotentWorker
feature_category :code_review
def perform(diff_note_id)
- diff_note = DiffNote.find(diff_note_id)
+ return unless diff_note_id.present?
- diff_note.create_diff_file
+ diff_note = DiffNote.find_by_id(diff_note_id) # rubocop: disable CodeReuse/ActiveRecord
+
+ diff_note&.create_diff_file
end
end
diff --git a/app/workers/database/drop_detached_partitions_worker.rb b/app/workers/database/drop_detached_partitions_worker.rb
index f9c8ce57a36..1e4dc20a0d2 100644
--- a/app/workers/database/drop_detached_partitions_worker.rb
+++ b/app/workers/database/drop_detached_partitions_worker.rb
@@ -10,7 +10,7 @@ module Database
idempotent!
def perform
- Gitlab::Database::Partitioning::DetachedPartitionDropper.new.perform
+ Gitlab::Database::Partitioning.drop_detached_partitions
ensure
Gitlab::Database::Partitioning::PartitionMonitoring.new.report_metrics
end
diff --git a/app/workers/dependency_proxy/cleanup_blob_worker.rb b/app/workers/dependency_proxy/cleanup_blob_worker.rb
new file mode 100644
index 00000000000..054bc5854a3
--- /dev/null
+++ b/app/workers/dependency_proxy/cleanup_blob_worker.rb
@@ -0,0 +1,40 @@
+# frozen_string_literal: true
+
+module DependencyProxy
+ class CleanupBlobWorker
+ include ApplicationWorker
+ include LimitedCapacity::Worker
+ include Gitlab::Utils::StrongMemoize
+ include DependencyProxy::CleanupWorker
+
+ data_consistency :always
+
+ sidekiq_options retry: 3
+
+ queue_namespace :dependency_proxy_blob
+ feature_category :dependency_proxy
+ urgency :low
+ worker_resource_boundary :unknown
+ idempotent!
+
+ private
+
+ def model
+ DependencyProxy::Blob
+ end
+
+ def log_metadata(blob)
+ log_extra_metadata_on_done(:dependency_proxy_blob_id, blob.id)
+ log_extra_metadata_on_done(:group_id, blob.group_id)
+ end
+
+ def log_cleanup_item(blob)
+ logger.info(
+ structured_payload(
+ group_id: blob.group_id,
+ dependency_proxy_blob_id: blob.id
+ )
+ )
+ end
+ end
+end
diff --git a/app/workers/dependency_proxy/cleanup_manifest_worker.rb b/app/workers/dependency_proxy/cleanup_manifest_worker.rb
new file mode 100644
index 00000000000..1186efa2034
--- /dev/null
+++ b/app/workers/dependency_proxy/cleanup_manifest_worker.rb
@@ -0,0 +1,40 @@
+# frozen_string_literal: true
+
+module DependencyProxy
+ class CleanupManifestWorker
+ include ApplicationWorker
+ include LimitedCapacity::Worker
+ include Gitlab::Utils::StrongMemoize
+ include DependencyProxy::CleanupWorker
+
+ data_consistency :always
+
+ sidekiq_options retry: 3
+
+ queue_namespace :dependency_proxy_manifest
+ feature_category :dependency_proxy
+ urgency :low
+ worker_resource_boundary :unknown
+ idempotent!
+
+ private
+
+ def model
+ DependencyProxy::Manifest
+ end
+
+ def log_metadata(manifest)
+ log_extra_metadata_on_done(:dependency_proxy_manifest_id, manifest.id)
+ log_extra_metadata_on_done(:group_id, manifest.group_id)
+ end
+
+ def log_cleanup_item(manifest)
+ logger.info(
+ structured_payload(
+ group_id: manifest.group_id,
+ dependency_proxy_manifest_id: manifest.id
+ )
+ )
+ end
+ end
+end
diff --git a/app/workers/dependency_proxy/image_ttl_group_policy_worker.rb b/app/workers/dependency_proxy/image_ttl_group_policy_worker.rb
new file mode 100644
index 00000000000..fed469e6dc8
--- /dev/null
+++ b/app/workers/dependency_proxy/image_ttl_group_policy_worker.rb
@@ -0,0 +1,70 @@
+# frozen_string_literal: true
+
+module DependencyProxy
+ class ImageTtlGroupPolicyWorker # rubocop:disable Scalability/IdempotentWorker
+ include ApplicationWorker
+ include CronjobQueue # rubocop:disable Scalability/CronWorkerContext
+
+ data_consistency :always
+
+ feature_category :dependency_proxy
+
+ UPDATE_BATCH_SIZE = 100
+
+ def perform
+ DependencyProxy::ImageTtlGroupPolicy.enabled.each do |policy|
+ # Technical Debt: change to read_before https://gitlab.com/gitlab-org/gitlab/-/issues/341536
+ qualified_blobs = policy.group.dependency_proxy_blobs.active.updated_before(policy.ttl)
+ qualified_manifests = policy.group.dependency_proxy_manifests.active.updated_before(policy.ttl)
+
+ enqueue_blob_cleanup_job if expire_artifacts(qualified_blobs, DependencyProxy::Blob)
+ enqueue_manifest_cleanup_job if expire_artifacts(qualified_manifests, DependencyProxy::Manifest)
+ end
+
+ log_counts
+ end
+
+ private
+
+ def expire_artifacts(artifacts, model)
+ rows_updated = false
+
+ artifacts.each_batch(of: UPDATE_BATCH_SIZE) do |batch|
+ rows = batch.update_all(status: :expired)
+ rows_updated ||= rows > 0
+ end
+
+ rows_updated
+ end
+
+ def enqueue_blob_cleanup_job
+ DependencyProxy::CleanupBlobWorker.perform_with_capacity
+ end
+
+ def enqueue_manifest_cleanup_job
+ DependencyProxy::CleanupManifestWorker.perform_with_capacity
+ end
+
+ def log_counts
+ use_replica_if_available do
+ expired_blob_count = DependencyProxy::Blob.expired.count
+ expired_manifest_count = DependencyProxy::Manifest.expired.count
+ processing_blob_count = DependencyProxy::Blob.processing.count
+ processing_manifest_count = DependencyProxy::Manifest.processing.count
+ error_blob_count = DependencyProxy::Blob.error.count
+ error_manifest_count = DependencyProxy::Manifest.error.count
+
+ log_extra_metadata_on_done(:expired_dependency_proxy_blob_count, expired_blob_count)
+ log_extra_metadata_on_done(:expired_dependency_proxy_manifest_count, expired_manifest_count)
+ log_extra_metadata_on_done(:processing_dependency_proxy_blob_count, processing_blob_count)
+ log_extra_metadata_on_done(:processing_dependency_proxy_manifest_count, processing_manifest_count)
+ log_extra_metadata_on_done(:error_dependency_proxy_blob_count, error_blob_count)
+ log_extra_metadata_on_done(:error_dependency_proxy_manifest_count, error_manifest_count)
+ end
+ end
+
+ def use_replica_if_available(&block)
+ ::Gitlab::Database::LoadBalancing::Session.current.use_replicas_for_read_queries(&block)
+ end
+ end
+end
diff --git a/app/workers/expire_build_artifacts_worker.rb b/app/workers/expire_build_artifacts_worker.rb
index 65d387f73ed..295703cc1c3 100644
--- a/app/workers/expire_build_artifacts_worker.rb
+++ b/app/workers/expire_build_artifacts_worker.rb
@@ -10,7 +10,7 @@ class ExpireBuildArtifactsWorker # rubocop:disable Scalability/IdempotentWorker
include CronjobQueue
# rubocop:enable Scalability/CronWorkerContext
- feature_category :continuous_integration
+ feature_category :build_artifacts
def perform
service = Ci::JobArtifacts::DestroyAllExpiredService.new
diff --git a/app/workers/expire_build_instance_artifacts_worker.rb b/app/workers/expire_build_instance_artifacts_worker.rb
index 96378acca08..77b8f59e365 100644
--- a/app/workers/expire_build_instance_artifacts_worker.rb
+++ b/app/workers/expire_build_instance_artifacts_worker.rb
@@ -7,7 +7,7 @@ class ExpireBuildInstanceArtifactsWorker # rubocop:disable Scalability/Idempoten
sidekiq_options retry: 3
- feature_category :continuous_integration
+ feature_category :build_artifacts
# rubocop: disable CodeReuse/ActiveRecord
def perform(build_id)
diff --git a/app/workers/expire_job_cache_worker.rb b/app/workers/expire_job_cache_worker.rb
index 401fe1dc1e5..7374f650546 100644
--- a/app/workers/expire_job_cache_worker.rb
+++ b/app/workers/expire_job_cache_worker.rb
@@ -10,11 +10,9 @@ class ExpireJobCacheWorker # rubocop:disable Scalability/IdempotentWorker
queue_namespace :pipeline_cache
urgency :high
- # This worker should be idempotent, but we're switching to data_consistency
- # :sticky and there is an ongoing incompatibility, so it needs to be disabled for
- # now. The following line can be uncommented and this comment removed once
- # https://gitlab.com/gitlab-org/gitlab/-/issues/325291 is resolved.
- # idempotent!
+
+ deduplicate :until_executing, including_scheduled: true
+ idempotent!
# rubocop: disable CodeReuse/ActiveRecord
def perform(job_id)
diff --git a/app/workers/gitlab/github_import/stage/finish_import_worker.rb b/app/workers/gitlab/github_import/stage/finish_import_worker.rb
index 006b79dbff4..5197c1e1e88 100644
--- a/app/workers/gitlab/github_import/stage/finish_import_worker.rb
+++ b/app/workers/gitlab/github_import/stage/finish_import_worker.rb
@@ -18,36 +18,28 @@ module Gitlab
# project - An instance of Project.
def import(_, project)
+ @project = project
project.after_import
- report_import_time(project)
+ report_import_time
end
- def report_import_time(project)
- duration = Time.zone.now - project.created_at
+ private
- histogram.observe({ project: project.full_path }, duration)
- counter.increment
+ attr_reader :project
+
+ def report_import_time
+ metrics.track_finished_import
info(
project.id,
message: "GitHub project import finished",
- duration_s: duration.round(2),
+ duration_s: metrics.duration.round(2),
object_counts: ::Gitlab::GithubImport::ObjectCounter.summary(project)
)
end
- def histogram
- @histogram ||= Gitlab::Metrics.histogram(
- :github_importer_total_duration_seconds,
- 'Total time spent importing GitHub projects, in seconds'
- )
- end
-
- def counter
- @counter ||= Gitlab::Metrics.counter(
- :github_importer_imported_projects,
- 'The number of imported GitHub projects'
- )
+ def metrics
+ @metrics ||= Gitlab::Import::Metrics.new(:github_importer, project)
end
end
end
diff --git a/app/workers/gitlab/github_import/stage/import_base_data_worker.rb b/app/workers/gitlab/github_import/stage/import_base_data_worker.rb
index 715c39caf42..cc6a2255160 100644
--- a/app/workers/gitlab/github_import/stage/import_base_data_worker.rb
+++ b/app/workers/gitlab/github_import/stage/import_base_data_worker.rb
@@ -31,6 +31,22 @@ module Gitlab
project.import_state.refresh_jid_expiration
ImportPullRequestsWorker.perform_async(project.id)
+ rescue StandardError => e
+ Gitlab::Import::ImportFailureService.track(
+ project_id: project.id,
+ error_source: self.class.name,
+ exception: e,
+ fail_import: abort_on_failure,
+ metrics: true
+ )
+
+ raise(e)
+ end
+
+ private
+
+ def abort_on_failure
+ true
end
end
end
diff --git a/app/workers/gitlab/github_import/stage/import_pull_requests_worker.rb b/app/workers/gitlab/github_import/stage/import_pull_requests_worker.rb
index d76d36531d1..71d0247bae0 100644
--- a/app/workers/gitlab/github_import/stage/import_pull_requests_worker.rb
+++ b/app/workers/gitlab/github_import/stage/import_pull_requests_worker.rb
@@ -27,6 +27,22 @@ module Gitlab
{ waiter.key => waiter.jobs_remaining },
:pull_requests_merged_by
)
+ rescue StandardError => e
+ Gitlab::Import::ImportFailureService.track(
+ project_id: project.id,
+ error_source: self.class.name,
+ exception: e,
+ fail_import: abort_on_failure,
+ metrics: true
+ )
+
+ raise(e)
+ end
+
+ private
+
+ def abort_on_failure
+ true
end
end
end
diff --git a/app/workers/gitlab/github_import/stage/import_repository_worker.rb b/app/workers/gitlab/github_import/stage/import_repository_worker.rb
index 227b7c304b0..3e914cc7590 100644
--- a/app/workers/gitlab/github_import/stage/import_repository_worker.rb
+++ b/app/workers/gitlab/github_import/stage/import_repository_worker.rb
@@ -33,6 +33,17 @@ module Gitlab
counter.increment
ImportBaseDataWorker.perform_async(project.id)
+
+ rescue StandardError => e
+ Gitlab::Import::ImportFailureService.track(
+ project_id: project.id,
+ error_source: self.class.name,
+ exception: e,
+ fail_import: abort_on_failure,
+ metrics: true
+ )
+
+ raise(e)
end
def counter
diff --git a/app/workers/issue_placement_worker.rb b/app/workers/issue_placement_worker.rb
index e0c4502ed1a..22e2a8e95f4 100644
--- a/app/workers/issue_placement_worker.rb
+++ b/app/workers/issue_placement_worker.rb
@@ -31,7 +31,7 @@ class IssuePlacementWorker
# while preserving creation order.
to_place = Issue
.relative_positioning_query_base(issue)
- .where(relative_position: nil)
+ .with_null_relative_position
.order({ created_at: :asc }, { id: :asc })
.limit(QUERY_LIMIT + 1)
.to_a
diff --git a/app/workers/namespaces/in_product_marketing_emails_worker.rb b/app/workers/namespaces/in_product_marketing_emails_worker.rb
index 49e65d59e83..470fba1227d 100644
--- a/app/workers/namespaces/in_product_marketing_emails_worker.rb
+++ b/app/workers/namespaces/in_product_marketing_emails_worker.rb
@@ -8,7 +8,7 @@ module Namespaces
include CronjobQueue # rubocop:disable Scalability/CronWorkerContext
- feature_category :subgroups
+ feature_category :experimentation_activation
urgency :low
def perform
diff --git a/app/workers/namespaces/onboarding_issue_created_worker.rb b/app/workers/namespaces/onboarding_issue_created_worker.rb
index 81d105ab19c..aab5767e0f1 100644
--- a/app/workers/namespaces/onboarding_issue_created_worker.rb
+++ b/app/workers/namespaces/onboarding_issue_created_worker.rb
@@ -8,7 +8,7 @@ module Namespaces
sidekiq_options retry: 3
- feature_category :issue_tracking
+ feature_category :onboarding
urgency :low
deduplicate :until_executing
diff --git a/app/workers/namespaces/onboarding_pipeline_created_worker.rb b/app/workers/namespaces/onboarding_pipeline_created_worker.rb
index f9a6b734586..4172e286474 100644
--- a/app/workers/namespaces/onboarding_pipeline_created_worker.rb
+++ b/app/workers/namespaces/onboarding_pipeline_created_worker.rb
@@ -8,7 +8,7 @@ module Namespaces
sidekiq_options retry: 3
- feature_category :subgroups
+ feature_category :onboarding
urgency :low
deduplicate :until_executing
diff --git a/app/workers/namespaces/onboarding_progress_worker.rb b/app/workers/namespaces/onboarding_progress_worker.rb
index b77db1aec5e..77a31d85a9a 100644
--- a/app/workers/namespaces/onboarding_progress_worker.rb
+++ b/app/workers/namespaces/onboarding_progress_worker.rb
@@ -8,7 +8,7 @@ module Namespaces
sidekiq_options retry: 3
- feature_category :product_analytics
+ feature_category :onboarding
worker_resource_boundary :cpu
urgency :low
diff --git a/app/workers/namespaces/onboarding_user_added_worker.rb b/app/workers/namespaces/onboarding_user_added_worker.rb
index 6a189e81b95..4d17cf9a6e2 100644
--- a/app/workers/namespaces/onboarding_user_added_worker.rb
+++ b/app/workers/namespaces/onboarding_user_added_worker.rb
@@ -8,7 +8,7 @@ module Namespaces
sidekiq_options retry: 3
- feature_category :users
+ feature_category :onboarding
urgency :low
idempotent!
diff --git a/app/workers/packages/composer/cache_cleanup_worker.rb b/app/workers/packages/composer/cache_cleanup_worker.rb
index 19babf63967..c80d6ea45d8 100644
--- a/app/workers/packages/composer/cache_cleanup_worker.rb
+++ b/app/workers/packages/composer/cache_cleanup_worker.rb
@@ -14,19 +14,7 @@ module Packages
idempotent!
def perform
- ::Packages::Composer::CacheFile.without_namespace.find_in_batches do |cache_files|
- cache_files.each(&:destroy)
- rescue ActiveRecord::RecordNotFound
- # ignore. likely due to object already being deleted.
- end
-
- ::Packages::Composer::CacheFile.expired.find_in_batches do |cache_files|
- cache_files.each(&:destroy)
- rescue ActiveRecord::RecordNotFound
- # ignore. likely due to object already being deleted.
- end
- rescue StandardError => e
- Gitlab::ErrorTracking.log_exception(e)
+ # no-op: to be removed after 14.5 https://gitlab.com/gitlab-org/gitlab/-/issues/333694
end
end
end
diff --git a/app/workers/packages/composer/cache_update_worker.rb b/app/workers/packages/composer/cache_update_worker.rb
index 874993a1325..5600af6ce24 100644
--- a/app/workers/packages/composer/cache_update_worker.rb
+++ b/app/workers/packages/composer/cache_update_worker.rb
@@ -7,20 +7,14 @@ module Packages
data_consistency :always
- sidekiq_options retry: 3
+ sidekiq_options retry: false
feature_category :package_registry
idempotent!
- def perform(project_id, package_name, last_page_sha)
- project = Project.find_by_id(project_id)
-
- return unless project
-
- Gitlab::Composer::Cache.new(project: project, name: package_name, last_page_sha: last_page_sha).execute
- rescue StandardError => e
- Gitlab::ErrorTracking.log_exception(e, project_id: project_id)
+ def perform(*args)
+ # no-op: to be removed after 14.5 https://gitlab.com/gitlab-org/gitlab/-/issues/333694
end
end
end
diff --git a/app/workers/packages/debian/generate_distribution_worker.rb b/app/workers/packages/debian/generate_distribution_worker.rb
index b9b157d25d2..1eff3ea02dd 100644
--- a/app/workers/packages/debian/generate_distribution_worker.rb
+++ b/app/workers/packages/debian/generate_distribution_worker.rb
@@ -2,7 +2,7 @@
module Packages
module Debian
- class GenerateDistributionWorker # rubocop:disable Scalability/IdempotentWorker
+ class GenerateDistributionWorker
include ApplicationWorker
data_consistency :always
diff --git a/app/workers/pages_remove_worker.rb b/app/workers/pages_remove_worker.rb
deleted file mode 100644
index 4de99b8654d..00000000000
--- a/app/workers/pages_remove_worker.rb
+++ /dev/null
@@ -1,16 +0,0 @@
-# frozen_string_literal: true
-
-# TODO: remove this worker https://gitlab.com/gitlab-org/gitlab/-/issues/340641
-class PagesRemoveWorker # rubocop:disable Scalability/IdempotentWorker
- include ApplicationWorker
-
- data_consistency :always
-
- sidekiq_options retry: 3
- feature_category :pages
- loggable_arguments 0
-
- def perform(project_id)
- # no-op
- end
-end
diff --git a/app/workers/pipeline_hooks_worker.rb b/app/workers/pipeline_hooks_worker.rb
index 322f92d376b..c67f3860a50 100644
--- a/app/workers/pipeline_hooks_worker.rb
+++ b/app/workers/pipeline_hooks_worker.rb
@@ -12,9 +12,10 @@ class PipelineHooksWorker # rubocop:disable Scalability/IdempotentWorker
# rubocop: disable CodeReuse/ActiveRecord
def perform(pipeline_id)
- Ci::Pipeline
- .find_by(id: pipeline_id)
- .try(:execute_hooks)
+ pipeline = Ci::Pipeline.find_by(id: pipeline_id)
+ return unless pipeline
+
+ Ci::Pipelines::HookService.new(pipeline).execute
end
# rubocop: enable CodeReuse/ActiveRecord
end
diff --git a/app/workers/pipeline_process_worker.rb b/app/workers/pipeline_process_worker.rb
index 9cd471a5ab6..9370b361068 100644
--- a/app/workers/pipeline_process_worker.rb
+++ b/app/workers/pipeline_process_worker.rb
@@ -14,7 +14,7 @@ class PipelineProcessWorker
loggable_arguments 1
idempotent!
- deduplicate :until_executing, feature_flag: :ci_idempotent_pipeline_process_worker
+ deduplicate :until_executing
# rubocop: disable CodeReuse/ActiveRecord
def perform(pipeline_id)
diff --git a/app/workers/run_pipeline_schedule_worker.rb b/app/workers/run_pipeline_schedule_worker.rb
index dd0f14a5cab..12042ebc4f0 100644
--- a/app/workers/run_pipeline_schedule_worker.rb
+++ b/app/workers/run_pipeline_schedule_worker.rb
@@ -27,8 +27,9 @@ class RunPipelineScheduleWorker # rubocop:disable Scalability/IdempotentWorker
user,
ref: schedule.ref)
.execute!(:schedule, ignore_skip_ci: true, save_on_errors: false, schedule: schedule)
- rescue Ci::CreatePipelineService::CreateError
- # no-op. This is a user operation error such as corrupted .gitlab-ci.yml.
+ rescue Ci::CreatePipelineService::CreateError => e
+ # This is a user operation error such as corrupted .gitlab-ci.yml. Log the error for debugging purpose.
+ log_extra_metadata_on_done(:pipeline_creation_error, e)
rescue StandardError => e
error(schedule, e)
end
@@ -37,10 +38,16 @@ class RunPipelineScheduleWorker # rubocop:disable Scalability/IdempotentWorker
def error(schedule, error)
failed_creation_counter.increment
+ log_error(schedule, error)
+ track_error(schedule, error)
+ end
+ def log_error(schedule, error)
Gitlab::AppLogger.error "Failed to create a scheduled pipeline. " \
"schedule_id: #{schedule.id} message: #{error.message}"
+ end
+ def track_error(schedule, error)
Gitlab::ErrorTracking
.track_and_raise_for_dev_exception(error,
issue_url: 'https://gitlab.com/gitlab-org/gitlab-foss/issues/41231',
diff --git a/app/workers/stuck_ci_jobs_worker.rb b/app/workers/stuck_ci_jobs_worker.rb
index a2b2686c8d5..72004f7568c 100644
--- a/app/workers/stuck_ci_jobs_worker.rb
+++ b/app/workers/stuck_ci_jobs_worker.rb
@@ -2,6 +2,7 @@
class StuckCiJobsWorker # rubocop:disable Scalability/IdempotentWorker
include ApplicationWorker
+ include ExclusiveLeaseGuard
# rubocop:disable Scalability/CronWorkerContext
# This is an instance-wide cleanup query, so there's no meaningful
@@ -12,25 +13,19 @@ class StuckCiJobsWorker # rubocop:disable Scalability/IdempotentWorker
data_consistency :always
feature_category :continuous_integration
- worker_resource_boundary :cpu
-
- EXCLUSIVE_LEASE_KEY = 'stuck_ci_builds_worker_lease'
def perform
- return unless try_obtain_lease
-
- Ci::StuckBuilds::DropService.new.execute
+ Ci::StuckBuilds::DropRunningWorker.perform_in(20.minutes)
+ Ci::StuckBuilds::DropScheduledWorker.perform_in(40.minutes)
- remove_lease
+ try_obtain_lease do
+ Ci::StuckBuilds::DropPendingService.new.execute
+ end
end
private
- def try_obtain_lease
- @uuid = Gitlab::ExclusiveLease.new(EXCLUSIVE_LEASE_KEY, timeout: 30.minutes).try_obtain
- end
-
- def remove_lease
- Gitlab::ExclusiveLease.cancel(EXCLUSIVE_LEASE_KEY, @uuid)
+ def lease_timeout
+ 30.minutes
end
end
diff --git a/bin/background_jobs b/bin/background_jobs
index 6aebc8126c6..f9b42b97e06 100755
--- a/bin/background_jobs
+++ b/bin/background_jobs
@@ -3,6 +3,7 @@
cd $(dirname $0)/..
app_root=$(pwd)
sidekiq_workers=${SIDEKIQ_WORKERS:-1}
+sidekiq_queues=${SIDEKIQ_QUEUES:-*} # Queues to listen to; default to `*` (all)
sidekiq_pidfile="$app_root/tmp/pids/sidekiq-cluster.pid"
sidekiq_logfile="$app_root/log/sidekiq.log"
gitlab_user=$(ls -l config.ru | awk '{print $3}')
@@ -37,8 +38,7 @@ restart()
stop
fi
- warn "Sidekiq output will be written to $sidekiq_logfile"
- start_sidekiq "$@" >> $sidekiq_logfile 2>&1
+ start_sidekiq "$@"
}
start_sidekiq()
@@ -50,13 +50,13 @@ start_sidekiq()
cmd="${cmd} ${chpst} -P"
fi
- # sidekiq-cluster expects '*' '*' arguments (one wildcard for each process).
+ # sidekiq-cluster expects an argument per process.
for (( i=1; i<=$sidekiq_workers; i++ ))
do
- processes_args+=("*")
+ processes_args+=("${sidekiq_queues}")
done
- ${cmd} bin/sidekiq-cluster "${processes_args[@]}" -P $sidekiq_pidfile -e $RAILS_ENV "$@"
+ ${cmd} bin/sidekiq-cluster "${processes_args[@]}" -P $sidekiq_pidfile -e $RAILS_ENV "$@" 2>&1 | tee -a $sidekiq_logfile
}
action="$1"
diff --git a/config/README.md b/config/README.md
index be5bd442fd8..f04758fcaeb 100644
--- a/config/README.md
+++ b/config/README.md
@@ -1,13 +1,13 @@
# Configuration files Documentation
Note that most configuration files (`config/*.*`) committed into
-[gitlab-ce](https://gitlab.com/gitlab-org/gitlab-foss) **will not be used** for
+[gitlab-foss](https://gitlab.com/gitlab-org/gitlab-foss) **will not be used** for
[omnibus-gitlab](https://gitlab.com/gitlab-org/omnibus-gitlab). Configuration
-files committed into gitlab-ce are only used for development.
+files committed into gitlab-foss are only used for development.
## gitlab.yml
-You can find most of GitLab configuration settings here.
+You can find most of the GitLab configuration settings here.
## mail_room.yml
@@ -21,7 +21,7 @@ This file is called `resque.yml` for historical reasons. We are **NOT**
using Resque at the moment. It is used to specify Redis configuration
values when a single database instance of Redis is desired.
-# Advanced Redis configuration files
+## Advanced Redis configuration files
In more advanced configurations of Redis key-value storage, it is desirable
to separate the keys by lifecycle and intended use to ease provisioning and
@@ -40,7 +40,7 @@ If desired, the routing URL provided by these settings can be used with:
2. TCP port number for each Redis instance desired
3. `database number` for each Redis instance desired
-## Example URL attribute formats for GitLab Redis `.yml` configuration files
+### Example URL attribute formats for GitLab Redis `.yml` configuration files
* Unix Socket, default Redis database (0)
* `url: unix:/path/to/redis.sock`
* `url: unix:/path/to/redis.sock?db=`
@@ -52,129 +52,38 @@ If desired, the routing URL provided by these settings can be used with:
* TCP Socket for Redis on remote host `myserver`, port 6379, database 33
* `url: redis://:mynewpassword@myserver:6379/33`
-## redis.cache.yml
-
-If configured, `redis.cache.yml` overrides the
-`resque.yml` settings to configure the Redis database instance
-used for `Rails.cache` and other volatile non-persistent data which enhances
-the performance of GitLab.
-Settings here can be overridden by the environment variable
-`GITLAB_REDIS_CACHE_CONFIG_FILE` which provides
-an alternate location for configuration settings.
-
-The order of precedence for the URL used to connect to the Redis instance
-used for `cache` is:
-1. URL from a configuration file pointed to by the
-`GITLAB_REDIS_CACHE_CONFIG_FILE` environment variable
-2. URL from `redis.cache.yml`
-3. URL from a configuration file pointed to by the
-`GITLAB_REDIS_CONFIG_FILE` environment variable
-4. URL from `resque.yml`
-5. `redis://localhost:6380`
-
-The order of precedence for all other configuration settings for `cache`
-are selected from only the first of the following files found (if a setting
-is not provided in an earlier file, the remainder of the files are not
-searched):
-1. the configuration file pointed to by the
-`GITLAB_REDIS_CACHE_CONFIG_FILE` environment variable
-2. the configuration file `redis.cache.yml`
-3. the configuration file pointed to by the
-`GITLAB_REDIS_CONFIG_FILE` environment variable
-4. the configuration file `resque.yml`
-
-## redis.queues.yml
-
-If configured, `redis.queues.yml` overrides the
-`resque.yml` settings to configure the Redis database instance
-used for clients of `::Gitlab::Redis::Queues`.
-These queues are intended to be the foundation
-of reliable inter-process communication between modules, whether on the same
-host node, or within a cluster. The primary clients of the queues are
-SideKiq, Mailroom, CI Runner, Workhorse, and push services. Settings here can
-be overridden by the environment variable
-`GITLAB_REDIS_QUEUES_CONFIG_FILE` which provides an alternate location for
-configuration settings.
-
-The order of precedence for the URL used to connect to the Redis instance
-used for `queues` is:
-1. URL from a configuration file pointed to by the
-`GITLAB_REDIS_QUEUES_CONFIG_FILE` environment variable
-2. URL from `redis.queues.yml`
-3. URL from a configuration file pointed to by the
-`GITLAB_REDIS_CONFIG_FILE` environment variable
-4. URL from `resque.yml`
-5. `redis://localhost:6381`
-
-The order of precedence for all other configuration settings for `queues`
-are selected from only the first of the following files found (if a setting
-is not provided in an earlier file, the remainder of the files are not
-searched):
-1. the configuration file pointed to by the
-`GITLAB_REDIS_QUEUES_CONFIG_FILE` environment variable
-2. the configuration file `redis.queues.yml`
-3. the configuration file pointed to by the
-`GITLAB_REDIS_CONFIG_FILE` environment variable
-4. the configuration file `resque.yml`
-
-## redis.shared_state.yml
-
-If configured, `redis.shared_state.yml` overrides the
-`resque.yml` settings to configure the Redis database instance
-used for clients of `::Gitlab::Redis::SharedState` such as session state,
-and rate limiting.
-Settings here can be overridden by the environment variable
-`GITLAB_REDIS_SHARED_STATE_CONFIG_FILE` which provides
-an alternate location for configuration settings.
-
-The order of precedence for the URL used to connect to the Redis instance
-used for `shared_state` is:
-1. URL from a configuration file pointed to by the
-`GITLAB_REDIS_SHARED_STATE_CONFIG_FILE` environment variable
-2. URL from `redis.shared_state.yml`
-3. URL from a configuration file pointed to by the
-`GITLAB_REDIS_CONFIG_FILE` environment variable
-4. URL from `resque.yml`
-5. `redis://localhost:6382`
-
-The order of precedence for all other configuration settings for `shared_state`
-are selected from only the first of the following files found (if a setting
-is not provided in an earlier file, the remainder of the files are not
-searched):
-1. the configuration file pointed to by the
-`GITLAB_REDIS_SHARED_STATE_CONFIG_FILE` environment variable
-2. the configuration file `redis.shared_state.yml`
-3. the configuration file pointed to by the
-`GITLAB_REDIS_CONFIG_FILE` environment variable
-4. the configuration file `resque.yml`
-
-## redis.trace_chunks.yml
-
-If configured, `redis.trace_chunks.yml` overrides the
-`resque.yml` settings to configure the Redis database instance
-used for clients of `::Gitlab::Redis::TraceChunks` which stores CI trace chunks.
-
-Settings here can be overridden by the environment variable
-`GITLAB_REDIS_TRACE_CHUNKS_CONFIG_FILE` which provides
-an alternate location for configuration settings.
-
-The order of precedence for the URL used to connect to the Redis instance
-used for `trace_chunks` is:
-1. URL from a configuration file pointed to by the
-`GITLAB_REDIS_TRACE_CHUNKS_CONFIG_FILE` environment variable
-2. URL from `redis.trace_chunks.yml`
-3. URL from a configuration file pointed to by the
-`GITLAB_REDIS_CONFIG_FILE` environment variable
-4. URL from `resque.yml`
-5. `redis://localhost:6383`
-
-The order of precedence for all other configuration settings for `trace_chunks`
-are selected from only the first of the following files found (if a setting
-is not provided in an earlier file, the remainder of the files are not
-searched):
-1. the configuration file pointed to by the
-`GITLAB_REDIS_TRACE_CHUNKS_CONFIG_FILE` environment variable
-2. the configuration file `redis.trace_chunks.yml`
-3. the configuration file pointed to by the
-`GITLAB_REDIS_CONFIG_FILE` environment variable
-4. the configuration file `resque.yml`
+## Available configuration files
+
+The Redis instances that can be configured are described in the table below. The
+order of precedence for configuration is described below, where `$NAME` and
+`$FALLBACK_NAME` are the upper-cased instance names from the table, and `$name`
+and `$fallback_name` are the lower-cased versions:
+
+1. The configuration file pointed to by the `GITLAB_REDIS_$NAME_CONFIG_FILE`
+ environment variable.
+1. The configuration file `redis.$name.yml`.
+1. **If a fallback instance is available**, the configuration file
+ `redis.$fallback_name.yml`.
+1. The configuration file pointed to by the `GITLAB_REDIS_CONFIG_FILE`
+environment variable.
+1. The configuration file `resque.yml`.
+
+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)|
+
+If no configuration is found, or no URL is found in the configuration
+file, the default URL used is:
+
+1. `redis://localhost:6380` for `cache`.
+1. `redis://localhost:6381` for `queues`.
+1. `redis://localhost:6382` for `shared_state`.
+1. The URL from the fallback instance for all other instances.
diff --git a/config/application.rb b/config/application.rb
index 2349de4892f..dba9550a3dc 100644
--- a/config/application.rb
+++ b/config/application.rb
@@ -23,6 +23,9 @@ module Gitlab
require_dependency Rails.root.join('lib/gitlab/redis/cache')
require_dependency Rails.root.join('lib/gitlab/redis/queues')
require_dependency Rails.root.join('lib/gitlab/redis/shared_state')
+ 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/current_settings')
require_dependency Rails.root.join('lib/gitlab/middleware/read_only')
require_dependency Rails.root.join('lib/gitlab/middleware/basic_health_check')
@@ -370,15 +373,7 @@ module Gitlab
end
# Use caching across all environments
- # Full list of options:
- # https://api.rubyonrails.org/classes/ActiveSupport/Cache/RedisCacheStore.html#method-c-new
- caching_config_hash = {}
- caching_config_hash[:redis] = Gitlab::Redis::Cache.pool
- caching_config_hash[:compress] = Gitlab::Utils.to_boolean(ENV.fetch('ENABLE_REDIS_CACHE_COMPRESSION', '1'))
- caching_config_hash[:namespace] = Gitlab::Redis::Cache::CACHE_NAMESPACE
- caching_config_hash[:expires_in] = 2.weeks # Cache should not grow forever
-
- config.cache_store = :redis_cache_store, caching_config_hash
+ config.cache_store = :redis_cache_store, Gitlab::Redis::Cache.active_support_config
config.active_job.queue_adapter = :sidekiq
diff --git a/config/feature_categories.yml b/config/feature_categories.yml
index 1ecf217dd92..e61048a6427 100644
--- a/config/feature_categories.yml
+++ b/config/feature_categories.yml
@@ -33,6 +33,7 @@
- continuous_integration_scaling
- database
- dataops
+- delivery
- delivery_management
- dependency_firewall
- dependency_proxy
@@ -53,16 +54,15 @@
- five_minute_production_app
- foundations
- fuzz_testing
-- gdk
- geo_replication
- git_lfs
- gitaly
- gitlab_docs
- global_search
- helm_chart_registry
+- horse
- importers
- incident_management
-- infrastructure
- infrastructure_as_code
- insider_threat
- integrations
@@ -103,12 +103,12 @@
- roadmaps
- runbooks
- runner
+- scalability
- secret_detection
- secrets_management
- security_benchmarking
- security_orchestration
- self_monitoring
-- serverless
- service_desk
- service_ping
- sharding
diff --git a/config/feature_flags/development/add_actor_based_user_to_snowplow_tracking.yml b/config/feature_flags/development/add_actor_based_user_to_snowplow_tracking.yml
new file mode 100644
index 00000000000..9dc20148d56
--- /dev/null
+++ b/config/feature_flags/development/add_actor_based_user_to_snowplow_tracking.yml
@@ -0,0 +1,8 @@
+---
+name: add_actor_based_user_to_snowplow_tracking
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/71353
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/338150
+milestone: '14.4'
+type: development
+group: group::product intelligence
+default_enabled: false
diff --git a/config/feature_flags/development/advanced_search_multi_project_select.yml b/config/feature_flags/development/advanced_search_multi_project_select.yml
index 4f38955fa71..8f74c8990fa 100644
--- a/config/feature_flags/development/advanced_search_multi_project_select.yml
+++ b/config/feature_flags/development/advanced_search_multi_project_select.yml
@@ -2,7 +2,7 @@
name: advanced_search_multi_project_select
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/62606
rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/333011
-milestone: '14.0'
+milestone: '14.4'
type: development
group: group::global search
default_enabled: false
diff --git a/config/feature_flags/development/avoid_cross_joins_environments_in_self_and_descendants.yml b/config/feature_flags/development/avoid_cross_joins_environments_in_self_and_descendants.yml
new file mode 100644
index 00000000000..25b714b2c65
--- /dev/null
+++ b/config/feature_flags/development/avoid_cross_joins_environments_in_self_and_descendants.yml
@@ -0,0 +1,8 @@
+---
+name: avoid_cross_joins_environments_in_self_and_descendants
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/71894
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/342991
+milestone: '14.4'
+type: development
+group: group::release
+default_enabled: false
diff --git a/config/feature_flags/development/ci_archived_build_trace_checksum.yml b/config/feature_flags/development/ci_archived_build_trace_checksum.yml
new file mode 100644
index 00000000000..95e641e0efa
--- /dev/null
+++ b/config/feature_flags/development/ci_archived_build_trace_checksum.yml
@@ -0,0 +1,8 @@
+---
+name: ci_archived_build_trace_checksum
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/70072
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/340737
+milestone: '14.4'
+type: development
+group: group::pipeline execution
+default_enabled: false
diff --git a/config/feature_flags/development/ci_create_external_pr_pipeline_async.yml b/config/feature_flags/development/ci_create_external_pr_pipeline_async.yml
index 3935a818b1f..48c7dbcf740 100644
--- a/config/feature_flags/development/ci_create_external_pr_pipeline_async.yml
+++ b/config/feature_flags/development/ci_create_external_pr_pipeline_async.yml
@@ -5,4 +5,4 @@ rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/338908
milestone: '14.3'
type: development
group: group::pipeline authoring
-default_enabled: false
+default_enabled: true
diff --git a/config/feature_flags/development/ci_idempotent_pipeline_process_worker.yml b/config/feature_flags/development/ci_idempotent_pipeline_process_worker.yml
deleted file mode 100644
index 60104bd3109..00000000000
--- a/config/feature_flags/development/ci_idempotent_pipeline_process_worker.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: ci_idempotent_pipeline_process_worker
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/62410
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/332963
-milestone: '14.0'
-type: development
-group: group::pipeline authoring
-default_enabled: true
diff --git a/config/feature_flags/development/ci_include_rules.yml b/config/feature_flags/development/ci_include_rules.yml
deleted file mode 100644
index d8a3f0b245e..00000000000
--- a/config/feature_flags/development/ci_include_rules.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: ci_include_rules
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/67409
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/337507
-milestone: '14.2'
-type: development
-group: group::pipeline authoring
-default_enabled: true
diff --git a/config/feature_flags/development/ci_minutes_track_live_consumption.yml b/config/feature_flags/development/ci_minutes_track_live_consumption.yml
deleted file mode 100644
index d94dfc4120b..00000000000
--- a/config/feature_flags/development/ci_minutes_track_live_consumption.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: ci_minutes_track_live_consumption
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/59263
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/329197
-milestone: '13.12'
-type: development
-group: group::pipeline execution
-default_enabled: false
diff --git a/config/feature_flags/development/ci_new_query_for_running_stuck_jobs.yml b/config/feature_flags/development/ci_new_query_for_running_stuck_jobs.yml
new file mode 100644
index 00000000000..345e9b4c3ae
--- /dev/null
+++ b/config/feature_flags/development/ci_new_query_for_running_stuck_jobs.yml
@@ -0,0 +1,8 @@
+---
+name: ci_new_query_for_running_stuck_jobs
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/71013
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/339264
+milestone: '14.4'
+type: development
+group: group::pipeline execution
+default_enabled: false
diff --git a/config/feature_flags/development/ci_optimize_project_records_destruction.yml b/config/feature_flags/development/ci_optimize_project_records_destruction.yml
new file mode 100644
index 00000000000..73ad4ae995c
--- /dev/null
+++ b/config/feature_flags/development/ci_optimize_project_records_destruction.yml
@@ -0,0 +1,8 @@
+---
+name: ci_optimize_project_records_destruction
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/71342
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/341936
+milestone: '14.4'
+type: development
+group: group::pipeline execution
+default_enabled: false
diff --git a/config/feature_flags/development/ci_pipeline_add_job_with_lock.yml b/config/feature_flags/development/ci_pipeline_add_job_with_lock.yml
deleted file mode 100644
index 6a708013ca5..00000000000
--- a/config/feature_flags/development/ci_pipeline_add_job_with_lock.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: ci_pipeline_add_job_with_lock
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/65754
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/337628
-milestone: '14.2'
-type: development
-group: group::pipeline authoring
-default_enabled: true
diff --git a/config/feature_flags/development/ci_remove_update_retried_from_process_pipeline.yml b/config/feature_flags/development/ci_remove_update_retried_from_process_pipeline.yml
deleted file mode 100644
index 932ee766340..00000000000
--- a/config/feature_flags/development/ci_remove_update_retried_from_process_pipeline.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: ci_remove_update_retried_from_process_pipeline
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/54300
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/321630
-milestone: '13.9'
-type: development
-group: group::pipeline authoring
-default_enabled: true
diff --git a/config/feature_flags/development/ci_runner_limits.yml b/config/feature_flags/development/ci_runner_limits.yml
deleted file mode 100644
index e7d30dd086c..00000000000
--- a/config/feature_flags/development/ci_runner_limits.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: ci_runner_limits
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/60157
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/329438
-milestone: '13.12'
-type: development
-group: group::runner
-default_enabled: false
diff --git a/config/feature_flags/development/ci_scoped_job_token.yml b/config/feature_flags/development/ci_scoped_job_token.yml
index a7fa0244839..a885a1e6391 100644
--- a/config/feature_flags/development/ci_scoped_job_token.yml
+++ b/config/feature_flags/development/ci_scoped_job_token.yml
@@ -5,4 +5,4 @@ rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/332272
milestone: '14.0'
type: development
group: group::pipeline execution
-default_enabled: false
+default_enabled: true
diff --git a/config/feature_flags/development/container_registry_expiration_policies_caching.yml b/config/feature_flags/development/container_registry_expiration_policies_caching.yml
new file mode 100644
index 00000000000..6e8b0efe94d
--- /dev/null
+++ b/config/feature_flags/development/container_registry_expiration_policies_caching.yml
@@ -0,0 +1,8 @@
+---
+name: container_registry_expiration_policies_caching
+introduced_by_url:
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/340606
+milestone: '14.3'
+type: development
+group: group::package
+default_enabled: false
diff --git a/config/feature_flags/development/create_vulnerabilities_via_api.yml b/config/feature_flags/development/create_vulnerabilities_via_api.yml
index 0a3f9fa73f8..3f8af065dc2 100644
--- a/config/feature_flags/development/create_vulnerabilities_via_api.yml
+++ b/config/feature_flags/development/create_vulnerabilities_via_api.yml
@@ -5,4 +5,4 @@ rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/338694
milestone: '14.3'
type: development
group: group::threat insights
-default_enabled: false
+default_enabled: true
diff --git a/config/feature_flags/development/decomposed_ci_query_in_pipelines_for_merge_request_finder.yml b/config/feature_flags/development/decomposed_ci_query_in_pipelines_for_merge_request_finder.yml
new file mode 100644
index 00000000000..235b37dfb1d
--- /dev/null
+++ b/config/feature_flags/development/decomposed_ci_query_in_pipelines_for_merge_request_finder.yml
@@ -0,0 +1,8 @@
+---
+name: decomposed_ci_query_in_pipelines_for_merge_request_finder
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/68549
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/341341
+milestone: '14.4'
+type: development
+group: group::pipeline execution
+default_enabled: false
diff --git a/config/feature_flags/development/dependency_proxy_workhorse.yml b/config/feature_flags/development/dependency_proxy_workhorse.yml
new file mode 100644
index 00000000000..a3545d32cd5
--- /dev/null
+++ b/config/feature_flags/development/dependency_proxy_workhorse.yml
@@ -0,0 +1,8 @@
+---
+name: dependency_proxy_workhorse
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/68157
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/339639
+milestone: '14.3'
+type: development
+group: group::source code
+default_enabled: false
diff --git a/config/feature_flags/development/ensure_verified_primary_email_for_2fa.yml b/config/feature_flags/development/ensure_verified_primary_email_for_2fa.yml
deleted file mode 100644
index 7a52486d356..00000000000
--- a/config/feature_flags/development/ensure_verified_primary_email_for_2fa.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: ensure_verified_primary_email_for_2fa
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/69593
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/340151
-milestone: '14.3'
-type: development
-group: group::access
-default_enabled: true
diff --git a/config/feature_flags/development/environment_last_visible_pipeline_disable_joins.yml b/config/feature_flags/development/environment_last_visible_pipeline_disable_joins.yml
deleted file mode 100644
index 7667542506a..00000000000
--- a/config/feature_flags/development/environment_last_visible_pipeline_disable_joins.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: environment_last_visible_pipeline_disable_joins
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/68870
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/340283
-milestone: '14.3'
-type: development
-group: group::release
-default_enabled: true
diff --git a/config/feature_flags/development/finding_ci_pipeline_disable_joins.yml b/config/feature_flags/development/finding_ci_pipeline_disable_joins.yml
new file mode 100644
index 00000000000..8987b729cac
--- /dev/null
+++ b/config/feature_flags/development/finding_ci_pipeline_disable_joins.yml
@@ -0,0 +1,8 @@
+---
+name: finding_ci_pipeline_disable_joins
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/70216
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/338665
+milestone: '14.3'
+type: development
+group: group::threat insights
+default_enabled: true
diff --git a/config/feature_flags/development/gitaly_tags_finder.yml b/config/feature_flags/development/gitaly_tags_finder.yml
deleted file mode 100644
index a0a1791e584..00000000000
--- a/config/feature_flags/development/gitaly_tags_finder.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: gitaly_tags_finder
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/69101
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/339741
-milestone: '14.3'
-type: development
-group: group::source code
-default_enabled: false
diff --git a/config/feature_flags/development/gitaly_user_merge_branch_access_error.yml b/config/feature_flags/development/gitaly_user_merge_branch_access_error.yml
new file mode 100644
index 00000000000..6e52112b754
--- /dev/null
+++ b/config/feature_flags/development/gitaly_user_merge_branch_access_error.yml
@@ -0,0 +1,8 @@
+---
+name: gitaly_user_merge_branch_access_error
+introduced_by_url: https://gitlab.com/gitlab-org/gitaly/-/merge_requests/3705
+rollout_issue_url: https://gitlab.com/gitlab-org/gitaly/-/issues/3757
+milestone: '14.3'
+type: development
+group: group::gitaly
+default_enabled: false
diff --git a/config/feature_flags/development/help_page_documentation_redirect.yml b/config/feature_flags/development/help_page_documentation_redirect.yml
deleted file mode 100644
index 8871160e42d..00000000000
--- a/config/feature_flags/development/help_page_documentation_redirect.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: help_page_documentation_redirect
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/42702
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/255328
-milestone: '13.5'
-type: development
-group: group::static site editor
-default_enabled: false
diff --git a/config/feature_flags/development/improved_mergeability_checks.yml b/config/feature_flags/development/improved_mergeability_checks.yml
new file mode 100644
index 00000000000..83450ffa16f
--- /dev/null
+++ b/config/feature_flags/development/improved_mergeability_checks.yml
@@ -0,0 +1,8 @@
+---
+name: improved_mergeability_checks
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/68312
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/342386
+milestone: '14.4'
+type: development
+group: group::code review
+default_enabled: false
diff --git a/config/feature_flags/development/incubation_5mp_google_cloud.yml b/config/feature_flags/development/incubation_5mp_google_cloud.yml
new file mode 100644
index 00000000000..b687a656b40
--- /dev/null
+++ b/config/feature_flags/development/incubation_5mp_google_cloud.yml
@@ -0,0 +1,8 @@
+---
+name: incubation_5mp_google_cloud
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/70715
+rollout_issue_url:
+milestone: '14.3'
+type: development
+group: group::incubation
+default_enabled: false
diff --git a/config/feature_flags/development/infinitely_collapsible_sections.yml b/config/feature_flags/development/infinitely_collapsible_sections.yml
index d0bf063c6f6..44f37c06d70 100644
--- a/config/feature_flags/development/infinitely_collapsible_sections.yml
+++ b/config/feature_flags/development/infinitely_collapsible_sections.yml
@@ -5,4 +5,4 @@ rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/335297
milestone: '14.1'
type: development
group: group::pipeline execution
-default_enabled: true
+default_enabled: false
diff --git a/config/feature_flags/development/jira_connect_asymmetric_jwt.yml b/config/feature_flags/development/jira_connect_asymmetric_jwt.yml
new file mode 100644
index 00000000000..e204a7d6fac
--- /dev/null
+++ b/config/feature_flags/development/jira_connect_asymmetric_jwt.yml
@@ -0,0 +1,8 @@
+---
+name: jira_connect_asymmetric_jwt
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/71080
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/342808
+milestone: '14.4'
+type: development
+group: group::integrations
+default_enabled: false
diff --git a/config/feature_flags/development/lazy_load_commits.yml b/config/feature_flags/development/lazy_load_commits.yml
new file mode 100644
index 00000000000..d4764907211
--- /dev/null
+++ b/config/feature_flags/development/lazy_load_commits.yml
@@ -0,0 +1,8 @@
+---
+name: lazy_load_commits
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/71633
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/342497
+milestone: '14.4'
+type: development
+group: group::source code
+default_enabled: false
diff --git a/config/feature_flags/development/linear_application_setting_ancestor_scopes.yml b/config/feature_flags/development/linear_application_setting_ancestor_scopes.yml
new file mode 100644
index 00000000000..18c64df78d7
--- /dev/null
+++ b/config/feature_flags/development/linear_application_setting_ancestor_scopes.yml
@@ -0,0 +1,8 @@
+---
+name: linear_application_setting_ancestor_scopes
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/70579
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/341346
+milestone: '14.4'
+type: development
+group: group::access
+default_enabled: false
diff --git a/config/feature_flags/development/linear_ee_group_ancestor_scopes.yml b/config/feature_flags/development/linear_ee_group_ancestor_scopes.yml
new file mode 100644
index 00000000000..46294b0aef0
--- /dev/null
+++ b/config/feature_flags/development/linear_ee_group_ancestor_scopes.yml
@@ -0,0 +1,8 @@
+---
+name: linear_ee_group_ancestor_scopes
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/70708
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/341350
+milestone: '14.4'
+type: development
+group: group::access
+default_enabled: false
diff --git a/config/feature_flags/development/linear_group_ancestor_scopes.yml b/config/feature_flags/development/linear_group_ancestor_scopes.yml
new file mode 100644
index 00000000000..f23399c1e6f
--- /dev/null
+++ b/config/feature_flags/development/linear_group_ancestor_scopes.yml
@@ -0,0 +1,8 @@
+---
+name: linear_group_ancestor_scopes
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/70495
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/341115
+milestone: '14.4'
+type: development
+group: group::access
+default_enabled: false
diff --git a/config/feature_flags/development/linear_group_plans_preloaded_ancestor_scopes.yml b/config/feature_flags/development/linear_group_plans_preloaded_ancestor_scopes.yml
new file mode 100644
index 00000000000..d45b8d71a20
--- /dev/null
+++ b/config/feature_flags/development/linear_group_plans_preloaded_ancestor_scopes.yml
@@ -0,0 +1,8 @@
+---
+name: linear_group_plans_preloaded_ancestor_scopes
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/70685
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/341349
+milestone: '14.4'
+type: development
+group: group::access
+default_enabled: false
diff --git a/config/feature_flags/development/linear_group_tree_ancestor_scopes.yml b/config/feature_flags/development/linear_group_tree_ancestor_scopes.yml
new file mode 100644
index 00000000000..3a195242fa1
--- /dev/null
+++ b/config/feature_flags/development/linear_group_tree_ancestor_scopes.yml
@@ -0,0 +1,8 @@
+---
+name: linear_group_tree_ancestor_scopes
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/70503
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/341117
+milestone: '14.4'
+type: development
+group: group::access
+default_enabled: false
diff --git a/config/feature_flags/development/linear_members_finder_ancestor_scopes.yml b/config/feature_flags/development/linear_members_finder_ancestor_scopes.yml
new file mode 100644
index 00000000000..6bd5e164324
--- /dev/null
+++ b/config/feature_flags/development/linear_members_finder_ancestor_scopes.yml
@@ -0,0 +1,8 @@
+---
+name: linear_members_finder_ancestor_scopes
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/70583
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/341347
+milestone: '14.4'
+type: development
+group: group::access
+default_enabled: false
diff --git a/config/feature_flags/development/linear_participants_service_ancestor_scopes.yml b/config/feature_flags/development/linear_participants_service_ancestor_scopes.yml
new file mode 100644
index 00000000000..41b6f3b32d9
--- /dev/null
+++ b/config/feature_flags/development/linear_participants_service_ancestor_scopes.yml
@@ -0,0 +1,8 @@
+---
+name: linear_participants_service_ancestor_scopes
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/70684
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/341348
+milestone: '14.4'
+type: development
+group: group::access
+default_enabled: false
diff --git a/config/feature_flags/development/merge_request_discussion_cache.yml b/config/feature_flags/development/merge_request_discussion_cache.yml
deleted file mode 100644
index e90887fc2b3..00000000000
--- a/config/feature_flags/development/merge_request_discussion_cache.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: merge_request_discussion_cache
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/64688
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/335799
-milestone: '14.1'
-type: development
-group: group::code review
-default_enabled: false
diff --git a/config/feature_flags/development/mergeability_caching.yml b/config/feature_flags/development/mergeability_caching.yml
new file mode 100644
index 00000000000..b9063299926
--- /dev/null
+++ b/config/feature_flags/development/mergeability_caching.yml
@@ -0,0 +1,8 @@
+---
+name: mergeability_caching
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/68312
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/340810
+milestone: '14.4'
+type: development
+group: group::code review
+default_enabled: false
diff --git a/config/feature_flags/development/mr_changes_fluid_layout.yml b/config/feature_flags/development/mr_changes_fluid_layout.yml
new file mode 100644
index 00000000000..87f0c0c6569
--- /dev/null
+++ b/config/feature_flags/development/mr_changes_fluid_layout.yml
@@ -0,0 +1,8 @@
+---
+name: mr_changes_fluid_layout
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/70815
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/341809
+milestone: '14.4'
+type: development
+group: group::code review
+default_enabled: false
diff --git a/config/feature_flags/development/new_customersdot_staging_url.yml b/config/feature_flags/development/new_customersdot_staging_url.yml
new file mode 100644
index 00000000000..288d7f66f01
--- /dev/null
+++ b/config/feature_flags/development/new_customersdot_staging_url.yml
@@ -0,0 +1,8 @@
+---
+name: new_customersdot_staging_url
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/71827
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/342513
+milestone: '14.4'
+type: development
+group: group::fulfillment
+default_enabled: false
diff --git a/config/feature_flags/development/new_dir_modal.yml b/config/feature_flags/development/new_dir_modal.yml
new file mode 100644
index 00000000000..12d007209b7
--- /dev/null
+++ b/config/feature_flags/development/new_dir_modal.yml
@@ -0,0 +1,8 @@
+---
+name: new_dir_modal
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/71154
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/341675
+milestone: '14.4'
+type: development
+group: group::source code
+default_enabled: true
diff --git a/config/feature_flags/development/operational_vulnerabilities.yml b/config/feature_flags/development/operational_vulnerabilities.yml
new file mode 100644
index 00000000000..f1e19a626fb
--- /dev/null
+++ b/config/feature_flags/development/operational_vulnerabilities.yml
@@ -0,0 +1,8 @@
+---
+name: operational_vulnerabilities
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/70732
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/341423
+milestone: '14.4'
+type: development
+group: group::container security
+default_enabled: false
diff --git a/config/feature_flags/development/package_list_apollo.yml b/config/feature_flags/development/package_list_apollo.yml
new file mode 100644
index 00000000000..522b08594e2
--- /dev/null
+++ b/config/feature_flags/development/package_list_apollo.yml
@@ -0,0 +1,8 @@
+---
+name: package_list_apollo
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/70598
+rollout_issue_url:
+milestone: '14.3'
+type: development
+group: group::package
+default_enabled: false
diff --git a/config/feature_flags/development/pages_smart_check_outdated_sha.yml b/config/feature_flags/development/pages_smart_check_outdated_sha.yml
deleted file mode 100644
index 528d357f65c..00000000000
--- a/config/feature_flags/development/pages_smart_check_outdated_sha.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: pages_smart_check_outdated_sha
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/67303
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/336574
-milestone: '14.2'
-type: development
-group: group::release
-default_enabled: false
diff --git a/config/feature_flags/development/paginated_tree_graphql_query.yml b/config/feature_flags/development/paginated_tree_graphql_query.yml
index 13096412f25..d56d8fc336c 100644
--- a/config/feature_flags/development/paginated_tree_graphql_query.yml
+++ b/config/feature_flags/development/paginated_tree_graphql_query.yml
@@ -5,4 +5,4 @@ rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/337214
milestone: '14.2'
type: development
group: group::source code
-default_enabled: false
+default_enabled: true
diff --git a/config/feature_flags/development/pipeline_editor_drawer.yml b/config/feature_flags/development/pipeline_editor_drawer.yml
deleted file mode 100644
index df73c4be01e..00000000000
--- a/config/feature_flags/development/pipeline_editor_drawer.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: pipeline_editor_drawer
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/60856
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/329806
-milestone: '13.12'
-type: development
-group: group::pipeline authoring
-default_enabled: true
diff --git a/config/feature_flags/development/pipeline_editor_empty_state_action.yml b/config/feature_flags/development/pipeline_editor_empty_state_action.yml
deleted file mode 100644
index 870aeb14932..00000000000
--- a/config/feature_flags/development/pipeline_editor_empty_state_action.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: pipeline_editor_empty_state_action
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/55414
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/323229
-milestone: '13.10'
-type: development
-group: group::pipeline authoring
-default_enabled: true
diff --git a/config/feature_flags/development/pipeline_editor_mini_graph.yml b/config/feature_flags/development/pipeline_editor_mini_graph.yml
new file mode 100644
index 00000000000..6f31cb18d82
--- /dev/null
+++ b/config/feature_flags/development/pipeline_editor_mini_graph.yml
@@ -0,0 +1,8 @@
+---
+name: pipeline_editor_mini_graph
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/71622
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/342217
+milestone: '14.4'
+type: development
+group: group::pipeline authoring
+default_enabled: false
diff --git a/config/feature_flags/development/rate_limited_service_issues_create.yml b/config/feature_flags/development/rate_limited_service_issues_create.yml
new file mode 100644
index 00000000000..95ece10aa6c
--- /dev/null
+++ b/config/feature_flags/development/rate_limited_service_issues_create.yml
@@ -0,0 +1,8 @@
+---
+name: rate_limited_service_issues_create
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/68526
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/342677
+milestone: '14.4'
+type: development
+group: group::project management
+default_enabled: false
diff --git a/config/feature_flags/development/redirect_to_latest_template_jobs_browser_performance_testing.yml b/config/feature_flags/development/redirect_to_latest_template_jobs_browser_performance_testing.yml
deleted file mode 100644
index 37c475067a3..00000000000
--- a/config/feature_flags/development/redirect_to_latest_template_jobs_browser_performance_testing.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: redirect_to_latest_template_jobs_browser_performance_testing
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/63144
-rollout_issue_url:
-milestone: '14.0'
-type: development
-group: group::pipeline authoring
-default_enabled: false
diff --git a/config/feature_flags/development/redirect_to_latest_template_security_api_fuzzing.yml b/config/feature_flags/development/redirect_to_latest_template_security_api_fuzzing.yml
deleted file mode 100644
index 96606515bda..00000000000
--- a/config/feature_flags/development/redirect_to_latest_template_security_api_fuzzing.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: redirect_to_latest_template_security_api_fuzzing
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/63144
-rollout_issue_url:
-milestone: '14.0'
-type: development
-group: group::pipeline authoring
-default_enabled: false
diff --git a/config/feature_flags/development/redirect_to_latest_template_security_dast.yml b/config/feature_flags/development/redirect_to_latest_template_security_dast.yml
deleted file mode 100644
index a95c1e1a045..00000000000
--- a/config/feature_flags/development/redirect_to_latest_template_security_dast.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: redirect_to_latest_template_security_dast
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/63144
-rollout_issue_url:
-milestone: '14.0'
-type: development
-group: group::pipeline authoring
-default_enabled: false
diff --git a/config/feature_flags/development/redirect_to_latest_template_terraform.yml b/config/feature_flags/development/redirect_to_latest_template_terraform.yml
deleted file mode 100644
index cb5d833fa2d..00000000000
--- a/config/feature_flags/development/redirect_to_latest_template_terraform.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: redirect_to_latest_template_terraform
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/63144
-rollout_issue_url:
-milestone: '14.0'
-type: development
-group: group::pipeline authoring
-default_enabled: false
diff --git a/config/feature_flags/development/redirect_to_latest_template_verify_browser_performance.yml b/config/feature_flags/development/redirect_to_latest_template_verify_browser_performance.yml
deleted file mode 100644
index 4df74a5b07a..00000000000
--- a/config/feature_flags/development/redirect_to_latest_template_verify_browser_performance.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: redirect_to_latest_template_verify_browser_performance
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/63144
-rollout_issue_url:
-milestone: '14.0'
-type: development
-group: group::pipeline authoring
-default_enabled: false
diff --git a/config/feature_flags/development/refactor_mr_widgets_extensions.yml b/config/feature_flags/development/refactor_mr_widgets_extensions.yml
new file mode 100644
index 00000000000..5b6ea22aafe
--- /dev/null
+++ b/config/feature_flags/development/refactor_mr_widgets_extensions.yml
@@ -0,0 +1,8 @@
+---
+name: refactor_mr_widgets_extensions
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/70993
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/341759
+milestone: '14.4'
+type: development
+group: group::code review
+default_enabled: false
diff --git a/config/feature_flags/development/refactor_mr_widgets_extensions_user.yml b/config/feature_flags/development/refactor_mr_widgets_extensions_user.yml
new file mode 100644
index 00000000000..aa3c2799100
--- /dev/null
+++ b/config/feature_flags/development/refactor_mr_widgets_extensions_user.yml
@@ -0,0 +1,8 @@
+---
+name: refactor_mr_widgets_extensions_user
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/70993
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/341759
+milestone: '14.4'
+type: development
+group: group::code review
+default_enabled: false
diff --git a/config/feature_flags/development/refactor_text_viewer.yml b/config/feature_flags/development/refactor_text_viewer.yml
new file mode 100644
index 00000000000..427137773c6
--- /dev/null
+++ b/config/feature_flags/development/refactor_text_viewer.yml
@@ -0,0 +1,8 @@
+---
+name: refactor_text_viewer
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/70909
+rollout_issue_url:
+milestone: '14.4'
+type: development
+group: 'group::source code'
+default_enabled: false
diff --git a/config/feature_flags/development/reference_cache_memoization.yml b/config/feature_flags/development/reference_cache_memoization.yml
new file mode 100644
index 00000000000..74012208174
--- /dev/null
+++ b/config/feature_flags/development/reference_cache_memoization.yml
@@ -0,0 +1,8 @@
+---
+name: reference_cache_memoization
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/71310
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/341849
+milestone: '14.4'
+type: development
+group: group::source code
+default_enabled: true
diff --git a/config/feature_flags/development/remove_composer_v1_cache_code.yml b/config/feature_flags/development/remove_composer_v1_cache_code.yml
deleted file mode 100644
index 9654fc8dc54..00000000000
--- a/config/feature_flags/development/remove_composer_v1_cache_code.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: remove_composer_v1_cache_code
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/67843
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/338264
-milestone: '14.2'
-type: development
-group: group::package
-default_enabled: false
diff --git a/config/feature_flags/development/request_apdex_counters.yml b/config/feature_flags/development/request_apdex_counters.yml
new file mode 100644
index 00000000000..07d6cb7ac5e
--- /dev/null
+++ b/config/feature_flags/development/request_apdex_counters.yml
@@ -0,0 +1,8 @@
+---
+name: request_apdex_counters
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/69154
+rollout_issue_url: https://gitlab.com/gitlab-com/gl-infra/scalability/-/issues/1099
+milestone: '14.3'
+type: development
+group: team::Scalability
+default_enabled: false
diff --git a/config/feature_flags/development/search_blobs_language_aggregation.yml b/config/feature_flags/development/search_blobs_language_aggregation.yml
new file mode 100644
index 00000000000..da1b81dc52c
--- /dev/null
+++ b/config/feature_flags/development/search_blobs_language_aggregation.yml
@@ -0,0 +1,8 @@
+---
+name: search_blobs_language_aggregation
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/71937
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/342621
+milestone: '14.4'
+type: development
+group: group::global search
+default_enabled: false
diff --git a/config/feature_flags/development/security_orchestration_policies_configuration.yml b/config/feature_flags/development/security_orchestration_policies_configuration.yml
deleted file mode 100644
index 2570743c101..00000000000
--- a/config/feature_flags/development/security_orchestration_policies_configuration.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: security_orchestration_policies_configuration
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/54220
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/321258
-milestone: '13.9'
-type: development
-group: group::container security
-default_enabled: true
diff --git a/config/feature_flags/development/security_report_ingestion_framework.yml b/config/feature_flags/development/security_report_ingestion_framework.yml
new file mode 100644
index 00000000000..490fd03c677
--- /dev/null
+++ b/config/feature_flags/development/security_report_ingestion_framework.yml
@@ -0,0 +1,8 @@
+---
+name: security_report_ingestion_framework
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/66735
+rollout_issue_url:
+milestone: '14.4'
+type: development
+group: group::threat insights
+default_enabled: false
diff --git a/config/feature_flags/development/serverless_domain.yml b/config/feature_flags/development/serverless_domain.yml
deleted file mode 100644
index 67b2c6b8e1a..00000000000
--- a/config/feature_flags/development/serverless_domain.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: serverless_domain
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/21222
-rollout_issue_url:
-milestone: '12.8'
-type: development
-group: group::configure
-default_enabled: false
diff --git a/config/feature_flags/development/show_author_on_note.yml b/config/feature_flags/development/show_author_on_note.yml
deleted file mode 100644
index 7775bf5f27f..00000000000
--- a/config/feature_flags/development/show_author_on_note.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: show_author_on_note
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/40198
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/250282
-milestone: '13.4'
-type: development
-group: group::project management
-default_enabled: false
diff --git a/config/feature_flags/development/sort_by_project_users_by_project_authorizations_user_id.yml b/config/feature_flags/development/sort_by_project_users_by_project_authorizations_user_id.yml
deleted file mode 100644
index 88a4e0b0472..00000000000
--- a/config/feature_flags/development/sort_by_project_users_by_project_authorizations_user_id.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: sort_by_project_users_by_project_authorizations_user_id
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/64528
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/334167
-milestone: '14.1'
-type: development
-group: group::optimize
-default_enabled: true
diff --git a/config/feature_flags/development/specialized_worker_for_project_share_update_auth_recalculation.yml b/config/feature_flags/development/specialized_worker_for_project_share_update_auth_recalculation.yml
deleted file mode 100644
index 5e7d3819a4a..00000000000
--- a/config/feature_flags/development/specialized_worker_for_project_share_update_auth_recalculation.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: specialized_worker_for_project_share_update_auth_recalculation
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/61964
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/334234
-milestone: '14.1'
-type: development
-group: group::access
-default_enabled: false
diff --git a/config/feature_flags/development/specialized_worker_for_project_transfer_auth_recalculation.yml b/config/feature_flags/development/specialized_worker_for_project_transfer_auth_recalculation.yml
deleted file mode 100644
index b77ed607501..00000000000
--- a/config/feature_flags/development/specialized_worker_for_project_transfer_auth_recalculation.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: specialized_worker_for_project_transfer_auth_recalculation
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/61967
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/334237
-milestone: '14.1'
-type: development
-group: group::access
-default_enabled: false
diff --git a/config/feature_flags/development/suppress_apollo_errors_during_navigation.yml b/config/feature_flags/development/suppress_apollo_errors_during_navigation.yml
new file mode 100644
index 00000000000..21548fa4dbb
--- /dev/null
+++ b/config/feature_flags/development/suppress_apollo_errors_during_navigation.yml
@@ -0,0 +1,8 @@
+---
+name: suppress_apollo_errors_during_navigation
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/72031
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/342745
+milestone: '14.4'
+type: development
+group: group::foundations
+default_enabled: false
diff --git a/config/feature_flags/development/surface_environment_creation_failure.yml b/config/feature_flags/development/surface_environment_creation_failure.yml
new file mode 100644
index 00000000000..2c312d432ef
--- /dev/null
+++ b/config/feature_flags/development/surface_environment_creation_failure.yml
@@ -0,0 +1,8 @@
+---
+name: surface_environment_creation_failure
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/69537
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/340169
+milestone: '14.4'
+type: development
+group: group::release
+default_enabled: false
diff --git a/config/feature_flags/development/surface_environment_creation_failure_override.yml b/config/feature_flags/development/surface_environment_creation_failure_override.yml
new file mode 100644
index 00000000000..566281bcb89
--- /dev/null
+++ b/config/feature_flags/development/surface_environment_creation_failure_override.yml
@@ -0,0 +1,8 @@
+---
+name: surface_environment_creation_failure_override
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/69537
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/340169
+milestone: '14.4'
+type: development
+group: group::release
+default_enabled: false
diff --git a/config/feature_flags/development/tags_finder_gitaly.yml b/config/feature_flags/development/tags_finder_gitaly.yml
new file mode 100644
index 00000000000..065a253a69f
--- /dev/null
+++ b/config/feature_flags/development/tags_finder_gitaly.yml
@@ -0,0 +1,8 @@
+---
+name: tags_finder_gitaly
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/69101
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/339741
+milestone: '14.3'
+type: development
+group: group::source code
+default_enabled: true
diff --git a/config/feature_flags/development/track_epic_boards_activity.yml b/config/feature_flags/development/track_epic_boards_activity.yml
deleted file mode 100644
index df48cc5a854..00000000000
--- a/config/feature_flags/development/track_epic_boards_activity.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: track_epic_boards_activity
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/60357
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/338038
-milestone: '13.12'
-type: development
-group: group::product planning
-default_enabled: true
diff --git a/config/feature_flags/development/track_importer_activity.yml b/config/feature_flags/development/track_importer_activity.yml
new file mode 100644
index 00000000000..9f20a14790e
--- /dev/null
+++ b/config/feature_flags/development/track_importer_activity.yml
@@ -0,0 +1,8 @@
+---
+name: track_importer_activity
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/70012
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/339392
+milestone: '14.4'
+type: development
+group: group::import
+default_enabled: false
diff --git a/config/feature_flags/development/update_deployment_after_transaction_commit.yml b/config/feature_flags/development/update_deployment_after_transaction_commit.yml
new file mode 100644
index 00000000000..c07622fc9b4
--- /dev/null
+++ b/config/feature_flags/development/update_deployment_after_transaction_commit.yml
@@ -0,0 +1,8 @@
+---
+name: update_deployment_after_transaction_commit
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/71450
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/342021
+milestone: '14.4'
+type: development
+group: group::release
+default_enabled: false
diff --git a/config/feature_flags/development/usage_data_i_testing_group_code_coverage_visit_total.yml b/config/feature_flags/development/usage_data_i_testing_group_code_coverage_visit_total.yml
deleted file mode 100644
index 720b94fcf6e..00000000000
--- a/config/feature_flags/development/usage_data_i_testing_group_code_coverage_visit_total.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: usage_data_i_testing_group_code_coverage_visit_total
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/51382
-rollout_issue_url:
-milestone: '13.8'
-type: development
-group: group::testing
-default_enabled: true
diff --git a/config/feature_flags/development/usage_data_i_testing_metrics_report_artifact_uploaders.yml b/config/feature_flags/development/usage_data_i_testing_metrics_report_artifact_uploaders.yml
deleted file mode 100644
index 968ab3e63f1..00000000000
--- a/config/feature_flags/development/usage_data_i_testing_metrics_report_artifact_uploaders.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: usage_data_i_testing_metrics_report_artifact_uploaders
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/51670
-rollout_issue_url:
-milestone: '13.9'
-type: development
-group: group::testing
-default_enabled: true
diff --git a/config/feature_flags/development/usage_data_i_testing_summary_widget_total.yml b/config/feature_flags/development/usage_data_i_testing_summary_widget_total.yml
deleted file mode 100644
index fb06ea9f58d..00000000000
--- a/config/feature_flags/development/usage_data_i_testing_summary_widget_total.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: usage_data_i_testing_summary_widget_total
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/57543
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/326058
-milestone: '13.11'
-type: development
-group: group::testing
-default_enabled: true
diff --git a/config/feature_flags/development/usage_data_i_testing_test_case_parsed.yml b/config/feature_flags/development/usage_data_i_testing_test_case_parsed.yml
deleted file mode 100644
index e6e3cd09c28..00000000000
--- a/config/feature_flags/development/usage_data_i_testing_test_case_parsed.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: usage_data_i_testing_test_case_parsed
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/41918
-rollout_issue_url:
-milestone: '13.5'
-type: development
-group: group::testing
-default_enabled: true
diff --git a/config/feature_flags/development/use_upsert_query_for_mr_metrics.yml b/config/feature_flags/development/use_upsert_query_for_mr_metrics.yml
index 14cc5d1a98c..605bc54b78a 100644
--- a/config/feature_flags/development/use_upsert_query_for_mr_metrics.yml
+++ b/config/feature_flags/development/use_upsert_query_for_mr_metrics.yml
@@ -5,4 +5,4 @@ rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/339677
milestone: '14.3'
type: development
group: group::optimize
-default_enabled: false
+default_enabled: true
diff --git a/config/feature_flags/development/validate_namespace_parent_type.yml b/config/feature_flags/development/validate_namespace_parent_type.yml
index dc89c462f17..5c2e0add243 100644
--- a/config/feature_flags/development/validate_namespace_parent_type.yml
+++ b/config/feature_flags/development/validate_namespace_parent_type.yml
@@ -5,4 +5,4 @@ rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/322101
milestone: '13.10'
type: development
group: group::access
-default_enabled: false
+default_enabled: true
diff --git a/config/feature_flags/development/variable_inside_variable.yml b/config/feature_flags/development/variable_inside_variable.yml
index 2060958590f..fee4897b3f0 100644
--- a/config/feature_flags/development/variable_inside_variable.yml
+++ b/config/feature_flags/development/variable_inside_variable.yml
@@ -5,4 +5,4 @@ rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/297382
milestone: '13.11'
type: development
group: group::runner
-default_enabled: false
+default_enabled: true
diff --git a/config/feature_flags/development/vulnerability_flags.yml b/config/feature_flags/development/vulnerability_flags.yml
deleted file mode 100644
index 6ea7dd2e3f1..00000000000
--- a/config/feature_flags/development/vulnerability_flags.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: vulnerability_flags
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/66775
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/340203
-milestone: '14.3'
-type: development
-group: group::static analysis
-default_enabled: true
diff --git a/config/feature_flags/development/vulnerability_location_image_filter.yml b/config/feature_flags/development/vulnerability_location_image_filter.yml
new file mode 100644
index 00000000000..4b373b76ff6
--- /dev/null
+++ b/config/feature_flags/development/vulnerability_location_image_filter.yml
@@ -0,0 +1,8 @@
+---
+name: vulnerability_location_image_filter
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/69867
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/340915
+milestone: '14.4'
+type: development
+group: group::container security
+default_enabled: false
diff --git a/config/feature_flags/development/workhorse_use_sidechannel.yml b/config/feature_flags/development/workhorse_use_sidechannel.yml
new file mode 100644
index 00000000000..f39d313bf1a
--- /dev/null
+++ b/config/feature_flags/development/workhorse_use_sidechannel.yml
@@ -0,0 +1,8 @@
+---
+name: workhorse_use_sidechannel
+introduced_by_url:
+rollout_issue_url: https://gitlab.com/gitlab-com/gl-infra/scalability/-/issues/1193
+milestone: '14.4'
+type: development
+group: 'group::scalability'
+default_enabled: false
diff --git a/config/feature_flags/experiment/jobs_to_be_done.yml b/config/feature_flags/experiment/jobs_to_be_done.yml
deleted file mode 100644
index 5589d33a3c3..00000000000
--- a/config/feature_flags/experiment/jobs_to_be_done.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: jobs_to_be_done
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/60038
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/285564
-milestone: '13.12'
-type: experiment
-group: group::adoption
-default_enabled: false
diff --git a/config/feature_flags/experiment/new_project_sast_enabled.yml b/config/feature_flags/experiment/new_project_sast_enabled.yml
new file mode 100644
index 00000000000..f47c01d26aa
--- /dev/null
+++ b/config/feature_flags/experiment/new_project_sast_enabled.yml
@@ -0,0 +1,8 @@
+---
+name: new_project_sast_enabled
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/70548
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/340929
+milestone: '14.4'
+type: experiment
+group: group::adoption
+default_enabled: false
diff --git a/config/feature_flags/ops/ecomm_instrumentation.yml b/config/feature_flags/ops/ecomm_instrumentation.yml
new file mode 100644
index 00000000000..e35937fa344
--- /dev/null
+++ b/config/feature_flags/ops/ecomm_instrumentation.yml
@@ -0,0 +1,8 @@
+---
+name: ecomm_instrumentation
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/71243
+rollout_issue_url:
+milestone: '14.4'
+type: ops
+group: group::product intelligence
+default_enabled: false
diff --git a/config/feature_flags/ops/show_terraform_banner.yml b/config/feature_flags/ops/show_terraform_banner.yml
new file mode 100644
index 00000000000..a4ec831f4e4
--- /dev/null
+++ b/config/feature_flags/ops/show_terraform_banner.yml
@@ -0,0 +1,8 @@
+---
+name: show_terraform_banner
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/71462
+rollout_issue_url:
+milestone: '14.4'
+type: ops
+group: group::configure
+default_enabled: true
diff --git a/config/gitlab.yml.example b/config/gitlab.yml.example
index a8881fd8a2e..3d2acce9a69 100644
--- a/config/gitlab.yml.example
+++ b/config/gitlab.yml.example
@@ -1218,6 +1218,9 @@ production: &base
# The URL to the internal KAS API (used by the GitLab backend)
# internal_url: grpc://localhost:8153
+ # The URL to the Kubernetes API proxy (used by GitLab users)
+ # external_k8s_proxy_url: https://localhost:8154 # default: nil
+
## GitLab Elasticsearch settings
elasticsearch:
indexer_path: /home/git/gitlab-elasticsearch-indexer/
@@ -1292,6 +1295,9 @@ production: &base
## Google tag manager
# google_tag_manager_id: '_your_tracking_id'
+ ## OneTrust
+ # one_trust_id: '_your_one_trust_id'
+
## Matomo analytics.
# matomo_url: '_your_matomo_url'
# matomo_site_id: '_your_matomo_site_id'
diff --git a/config/initializers/00_active_record_disable_joins.rb b/config/initializers/00_active_record_disable_joins.rb
new file mode 100644
index 00000000000..6348fd7c53b
--- /dev/null
+++ b/config/initializers/00_active_record_disable_joins.rb
@@ -0,0 +1,11 @@
+# frozen_string_literal: true
+
+module ActiveRecordRelationAllowCrossJoins
+ def allow_cross_joins_across_databases(url:)
+ # this method is implemented in:
+ # spec/support/database/prevent_cross_joins.rb
+ self
+ end
+end
+
+ActiveRecord::Relation.prepend(ActiveRecordRelationAllowCrossJoins)
diff --git a/config/initializers/0_acts_as_taggable.rb b/config/initializers/0_acts_as_taggable.rb
index 04619590e3c..8dee3c52a53 100644
--- a/config/initializers/0_acts_as_taggable.rb
+++ b/config/initializers/0_acts_as_taggable.rb
@@ -11,8 +11,8 @@ raise "Counter cache is not disabled" if
ActsAsTaggableOn::Tagging.reflections["tag"].options[:counter_cache]
ActsAsTaggableOn::Tagging.include IgnorableColumns
-ActsAsTaggableOn::Tagging.ignore_column :id_convert_to_bigint, remove_with: '14.2', remove_after: '2021-08-22'
-ActsAsTaggableOn::Tagging.ignore_column :taggable_id_convert_to_bigint, remove_with: '14.2', remove_after: '2021-08-22'
+ActsAsTaggableOn::Tagging.ignore_column :id_convert_to_bigint, remove_with: '14.5', remove_after: '2021-10-22'
+ActsAsTaggableOn::Tagging.ignore_column :taggable_id_convert_to_bigint, remove_with: '14.5', remove_after: '2021-10-22'
# The tags and taggings are supposed to be part of `gitlab_ci`
ActsAsTaggableOn::Tag.gitlab_schema = :gitlab_ci
diff --git a/config/initializers/1_settings.rb b/config/initializers/1_settings.rb
index 1c22216d442..0e4e6f5cc84 100644
--- a/config/initializers/1_settings.rb
+++ b/config/initializers/1_settings.rb
@@ -466,9 +466,6 @@ Settings.cron_jobs['personal_access_tokens_expired_notification_worker']['job_cl
Settings.cron_jobs['repository_archive_cache_worker'] ||= Settingslogic.new({})
Settings.cron_jobs['repository_archive_cache_worker']['cron'] ||= '0 * * * *'
Settings.cron_jobs['repository_archive_cache_worker']['job_class'] = 'RepositoryArchiveCacheWorker'
-Settings.cron_jobs['packages_composer_cache_cleanup_worker'] ||= Settingslogic.new({})
-Settings.cron_jobs['packages_composer_cache_cleanup_worker']['cron'] ||= '30 * * * *'
-Settings.cron_jobs['packages_composer_cache_cleanup_worker']['job_class'] = 'Packages::Composer::CacheCleanupWorker'
Settings.cron_jobs['import_export_project_cleanup_worker'] ||= Settingslogic.new({})
Settings.cron_jobs['import_export_project_cleanup_worker']['cron'] ||= '0 * * * *'
Settings.cron_jobs['import_export_project_cleanup_worker']['job_class'] = 'ImportExportProjectCleanupWorker'
@@ -535,6 +532,9 @@ Settings.cron_jobs['namespaces_prune_aggregation_schedules_worker']['job_class']
Settings.cron_jobs['container_expiration_policy_worker'] ||= Settingslogic.new({})
Settings.cron_jobs['container_expiration_policy_worker']['cron'] ||= '50 * * * *'
Settings.cron_jobs['container_expiration_policy_worker']['job_class'] = 'ContainerExpirationPolicyWorker'
+Settings.cron_jobs['image_ttl_group_policy_worker'] ||= Settingslogic.new({})
+Settings.cron_jobs['image_ttl_group_policy_worker']['cron'] ||= '40 0 * * *'
+Settings.cron_jobs['image_ttl_group_policy_worker']['job_class'] = 'DependencyProxy::ImageTtlGroupPolicyWorker'
Settings.cron_jobs['x509_issuer_crl_check_worker'] ||= Settingslogic.new({})
Settings.cron_jobs['x509_issuer_crl_check_worker']['cron'] ||= '30 1 * * *'
Settings.cron_jobs['x509_issuer_crl_check_worker']['job_class'] = 'X509IssuerCrlCheckWorker'
@@ -757,6 +757,7 @@ Settings.gitlab_kas['enabled'] ||= false
Settings.gitlab_kas['secret_file'] ||= Rails.root.join('.gitlab_kas_secret')
Settings.gitlab_kas['external_url'] ||= 'wss://kas.example.com'
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
#
# Repositories
diff --git a/config/initializers/7_prometheus_metrics.rb b/config/initializers/7_prometheus_metrics.rb
index d2d546a5438..587d393fd77 100644
--- a/config/initializers/7_prometheus_metrics.rb
+++ b/config/initializers/7_prometheus_metrics.rb
@@ -48,7 +48,7 @@ if !Rails.env.test? && Gitlab::Metrics.prometheus_metrics_enabled?
Gitlab::Metrics.gauge(:deployments, 'GitLab Version', {}, :max).set({ version: Gitlab::VERSION, revision: Gitlab.revision }, 1)
- unless Gitlab::Runtime.sidekiq?
+ if Gitlab::Runtime.web_server?
Gitlab::Metrics::RequestsRackMiddleware.initialize_metrics
end
diff --git a/config/initializers/7_redis.rb b/config/initializers/7_redis.rb
index 84aa231089b..50f0fb92317 100644
--- a/config/initializers/7_redis.rb
+++ b/config/initializers/7_redis.rb
@@ -1,5 +1,11 @@
# frozen_string_literal: true
+# We set the instance variable directly to suppress warnings.
+# We cannot switch to the new behavior until we change all existing `redis.exists` calls to `redis.exists?`.
+# Some gems also need to be updated
+# https://gitlab.com/gitlab-org/gitlab/-/issues/340602
+Redis.instance_variable_set(:@exists_returns_integer, false)
+
Redis::Client.prepend(Gitlab::Instrumentation::RedisInterceptor)
# Make sure we initialize a Redis connection pool before multi-threaded
@@ -11,3 +17,5 @@ Gitlab::Redis::Cache.with { nil }
Gitlab::Redis::Queues.with { nil }
Gitlab::Redis::SharedState.with { nil }
Gitlab::Redis::TraceChunks.with { nil }
+Gitlab::Redis::RateLimiting.with { nil }
+Gitlab::Redis::Sessions.with { nil }
diff --git a/config/initializers/action_cable.rb b/config/initializers/action_cable.rb
index 16d29f5910f..a7ef5cc332c 100644
--- a/config/initializers/action_cable.rb
+++ b/config/initializers/action_cable.rb
@@ -19,4 +19,4 @@ ActionCable::SubscriptionAdapter::Redis.redis_connector = lambda do |config|
end
Gitlab::ActionCable::RequestStoreCallbacks.install
-Gitlab::Database::LoadBalancing::ActionCableCallbacks.install if Gitlab::Database::LoadBalancing.enable?
+Gitlab::Database::LoadBalancing::ActionCableCallbacks.install
diff --git a/config/initializers/backtrace_silencers.rb b/config/initializers/backtrace_silencers.rb
index f3e01d23448..4fd41bd4c75 100644
--- a/config/initializers/backtrace_silencers.rb
+++ b/config/initializers/backtrace_silencers.rb
@@ -4,7 +4,7 @@ Rails.backtrace_cleaner.remove_silencers!
# This allows us to see the proper caller of SQL calls in {development,test}.log
if (Rails.env.development? || Rails.env.test?) && Gitlab.ee?
- Rails.backtrace_cleaner.add_silencer { |line| %r(^ee/lib/gitlab/database/load_balancing).match?(line) }
+ Rails.backtrace_cleaner.add_silencer { |line| %r(^lib/gitlab/database/load_balancing).match?(line) }
end
Rails.backtrace_cleaner.add_silencer { |line| !Gitlab::APP_DIRS_PATTERN.match?(line) }
diff --git a/config/initializers/batch_loader.rb b/config/initializers/batch_loader.rb
index d88b43fbcea..e542a26cb81 100644
--- a/config/initializers/batch_loader.rb
+++ b/config/initializers/batch_loader.rb
@@ -1,3 +1,13 @@
# frozen_string_literal: true
Rails.application.config.middleware.use(BatchLoader::Middleware)
+
+# Disables replace_methods by default.
+# See https://github.com/exAspArk/batch-loader#replacing-methods for more information.
+module BatchLoaderWithoutMethodReplacementByDefault
+ def batch(replace_methods: false, **kw_args, &batch_block)
+ super
+ end
+end
+
+BatchLoader.prepend(BatchLoaderWithoutMethodReplacementByDefault)
diff --git a/config/initializers/carrierwave_patch.rb b/config/initializers/carrierwave_patch.rb
index c8c6f75949c..a9c74478541 100644
--- a/config/initializers/carrierwave_patch.rb
+++ b/config/initializers/carrierwave_patch.rb
@@ -49,14 +49,8 @@ module CarrierWave
local_file = local_directory.files.new(key: path)
expire_at = options[:expire_at] || ::Fog::Time.now + @uploader.fog_authenticated_url_expiration
case @uploader.fog_credentials[:provider]
- when 'AWS', 'Google'
- # Older versions of fog-google do not support options as a parameter
- if url_options_supported?(local_file)
- local_file.url(expire_at, options)
- else
- warn "Options hash not supported in #{local_file.class}. You may need to upgrade your Fog provider."
- local_file.url(expire_at)
- end
+ when 'AWS', 'Google', 'AzureRM'
+ local_file.url(expire_at, options)
when 'Rackspace'
connection.get_object_https_url(@uploader.fog_directory, path, expire_at, options)
when 'OpenStack'
diff --git a/config/initializers/database_config.rb b/config/initializers/database_config.rb
index e9f10abd0b9..7aedf9013ae 100644
--- a/config/initializers/database_config.rb
+++ b/config/initializers/database_config.rb
@@ -1,15 +1,5 @@
# frozen_string_literal: true
-def log_pool_size(db, previous_pool_size, current_pool_size)
- log_message = ["#{db} connection pool size: #{current_pool_size}"]
-
- if previous_pool_size && current_pool_size > previous_pool_size
- log_message << "(increased from #{previous_pool_size} to match thread count)"
- end
-
- Gitlab::AppLogger.debug(log_message.join(' '))
-end
-
Gitlab.ee do
# We need to initialize the Geo database before
# setting the Geo DB connection pool size.
diff --git a/config/initializers/gettext_rails_i18n_patch.rb b/config/initializers/gettext_rails_i18n_patch.rb
index c23049e93c9..3c994516b2d 100644
--- a/config/initializers/gettext_rails_i18n_patch.rb
+++ b/config/initializers/gettext_rails_i18n_patch.rb
@@ -1,30 +1,8 @@
# frozen_string_literal: true
-require 'gettext_i18n_rails/haml_parser'
require 'gettext_i18n_rails_js/parser/javascript'
require 'json'
-VUE_TRANSLATE_REGEX = /((%[\w.-]+)(?:\s))?{{ (N|n|s)?__\((.*)\) }}/.freeze
-
-module GettextI18nRails
- class HamlParser
- singleton_class.send(:alias_method, :old_convert_to_code, :convert_to_code)
-
- # We need to convert text in Mustache format
- # to a format that can be parsed by Gettext scripts.
- # If we found a content like "{{ __('Stage') }}"
- # in a HAML file we convert it to "= _('Stage')", that way
- # it can be processed by the "rake gettext:find" script.
- #
- # Overwrites: https://github.com/grosser/gettext_i18n_rails/blob/8396387a431e0f8ead72fc1cd425cad2fa4992f2/lib/gettext_i18n_rails/haml_parser.rb#L9
- def self.convert_to_code(text)
- text.gsub!(VUE_TRANSLATE_REGEX, "\\2= \\3_(\\4)")
-
- old_convert_to_code(text)
- end
- end
-end
-
module GettextI18nRailsJs
module Parser
module Javascript
diff --git a/config/initializers/grape_validators.rb b/config/initializers/grape_validators.rb
index 07dd70822a2..1492894e1fa 100644
--- a/config/initializers/grape_validators.rb
+++ b/config/initializers/grape_validators.rb
@@ -10,3 +10,4 @@ Grape::Validations.register_validator(:check_assignees_count, ::API::Validations
Grape::Validations.register_validator(:untrusted_regexp, ::API::Validations::Validators::UntrustedRegexp)
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)
diff --git a/config/initializers/load_balancing.rb b/config/initializers/load_balancing.rb
index 2b58ae0f642..a31b11bb2be 100644
--- a/config/initializers/load_balancing.rb
+++ b/config/initializers/load_balancing.rb
@@ -1,28 +1,33 @@
# frozen_string_literal: true
-ActiveRecord::Base.singleton_class.attr_accessor :load_balancing_proxy
+Gitlab::Application.configure do |config|
+ config.middleware.use(Gitlab::Database::LoadBalancing::RackMiddleware)
+end
-if Gitlab::Database::LoadBalancing.enable?
- Gitlab::Database.main.disable_prepared_statements
+Gitlab::Database::LoadBalancing.base_models.each do |model|
+ # The load balancer needs to be configured immediately, and re-configured
+ # after forking. This ensures queries that run before forking use the load
+ # balancer, and queries running after a fork don't run into any errors when
+ # using dead database connections.
+ #
+ # See https://gitlab.com/gitlab-org/gitlab/-/merge_requests/63485 for more
+ # information.
+ Gitlab::Database::LoadBalancing::Setup.new(model).setup
- Gitlab::Application.configure do |config|
- config.middleware.use(Gitlab::Database::LoadBalancing::RackMiddleware)
+ # Database queries may be run before we fork, so we must set up the load
+ # balancer as early as possible. When we do fork, we need to make sure all the
+ # hosts are disconnected.
+ Gitlab::Cluster::LifecycleEvents.on_before_fork do
+ # When forking, we don't want to wait until the connections aren't in use
+ # any more, as this could delay the boot cycle.
+ model.connection.load_balancer.disconnect!(timeout: 0)
end
- # This hijacks the "connection" method to ensure both
- # `ActiveRecord::Base.connection` and all models use the same load
- # balancing proxy.
- ActiveRecord::Base.singleton_class.prepend(Gitlab::Database::LoadBalancing::ActiveRecordProxy)
-
- Gitlab::Database::LoadBalancing.configure_proxy
-
- # This needs to be executed after fork of clustered processes
+ # Service discovery only needs to run in the worker processes, as the main one
+ # won't be running many (if any) database queries.
Gitlab::Cluster::LifecycleEvents.on_worker_start do
- # For Host-based LB, we need to re-connect as Rails discards connections on fork
- Gitlab::Database::LoadBalancing.configure_proxy
-
- # Service discovery must be started after configuring the proxy, as service
- # discovery depends on this.
- Gitlab::Database::LoadBalancing.start_service_discovery
+ Gitlab::Database::LoadBalancing::Setup
+ .new(model, start_service_discovery: true)
+ .setup
end
end
diff --git a/config/initializers/mailer_retries.rb b/config/initializers/mailer_retries.rb
index 64fb0ffaa55..5980513af92 100644
--- a/config/initializers/mailer_retries.rb
+++ b/config/initializers/mailer_retries.rb
@@ -1,41 +1,5 @@
# frozen_string_literal: true
-class ActiveJob::QueueAdapters::SidekiqAdapter
- # With Sidekiq 6, we can do something like:
- # class ActionMailer::MailDeliveryJob
- # sidekiq_options retry: 3
- # end
- #
- # See https://gitlab.com/gitlab-org/gitlab/-/issues/329430
- raise "Update this monkey patch: #{__FILE__}" unless Sidekiq::VERSION == '5.2.9'
-
- def enqueue(job) #:nodoc:
- # Sidekiq::Client does not support symbols as keys
- job.provider_job_id = Sidekiq::Client.push \
- "class" => JobWrapper,
- "wrapped" => job.class.to_s,
- "queue" => job.queue_name,
- "args" => [job.serialize],
- "retry" => retry_for(job)
- end
-
- def enqueue_at(job, timestamp) #:nodoc:
- job.provider_job_id = Sidekiq::Client.push \
- "class" => JobWrapper,
- "wrapped" => job.class.to_s,
- "queue" => job.queue_name,
- "args" => [job.serialize],
- "at" => timestamp,
- "retry" => retry_for(job)
- end
-
- private
-
- def retry_for(job)
- if job.queue_name == 'mailers'
- 3
- else
- true
- end
- end
+Rails.application.config.after_initialize do
+ ActionMailer::MailDeliveryJob.sidekiq_options retry: 3
end
diff --git a/config/initializers/postgres_partitioning.rb b/config/initializers/postgres_partitioning.rb
index f2e2fba1559..49f382547d6 100644
--- a/config/initializers/postgres_partitioning.rb
+++ b/config/initializers/postgres_partitioning.rb
@@ -2,8 +2,7 @@
Gitlab::Database::Partitioning.register_models([
AuditEvent,
- WebHookLog,
- LooseForeignKeys::DeletedRecord
+ WebHookLog
])
if Gitlab.ee?
diff --git a/config/initializers/postgresql_cte.rb b/config/initializers/postgresql_cte.rb
index 6a9af7b4868..7d00776e460 100644
--- a/config/initializers/postgresql_cte.rb
+++ b/config/initializers/postgresql_cte.rb
@@ -96,7 +96,7 @@ module ActiveRecord
end
end
- def build_arel(aliases)
+ def build_arel(aliases = nil)
arel = super
build_with(arel) if @values[:with]
diff --git a/config/initializers/sidekiq.rb b/config/initializers/sidekiq.rb
index 19c5e4df854..d33550b82d1 100644
--- a/config/initializers/sidekiq.rb
+++ b/config/initializers/sidekiq.rb
@@ -27,8 +27,14 @@ use_sidekiq_daemon_memory_killer = ENV.fetch("SIDEKIQ_DAEMON_MEMORY_KILLER", 1).
use_sidekiq_legacy_memory_killer = !use_sidekiq_daemon_memory_killer
Sidekiq.configure_server do |config|
+ config.options[:strict] = false
+ config.options[:queues] = Gitlab::SidekiqConfig.expand_queues(config.options[:queues])
+ config.options[:scheduled_enq] = Gitlab::SidekiqEnq
+
+ Sidekiq.logger.info "Listening on queues #{config.options[:queues].uniq.sort}"
+
if enable_json_logs
- Sidekiq.logger.formatter = Gitlab::SidekiqLogging::JSONFormatter.new
+ config.log_formatter = Gitlab::SidekiqLogging::JSONFormatter.new
config.options[:job_logger] = Gitlab::SidekiqLogging::StructuredLogger
# Remove the default-provided handler. The exception is logged inside
@@ -38,11 +44,11 @@ Sidekiq.configure_server do |config|
config.redis = queues_config_hash
- config.server_middleware(&Gitlab::SidekiqMiddleware.server_configurator({
+ config.server_middleware(&Gitlab::SidekiqMiddleware.server_configurator(
metrics: Settings.monitoring.sidekiq_exporter,
arguments_logger: SidekiqLogArguments.enabled? && !enable_json_logs,
memory_killer: enable_sidekiq_memory_killer && use_sidekiq_legacy_memory_killer
- }))
+ ))
config.client_middleware(&Gitlab::SidekiqMiddleware.client_configurator)
diff --git a/config/initializers/zz_metrics.rb b/config/initializers/zz_metrics.rb
index 25e4ec0d483..8e69e1634f1 100644
--- a/config/initializers/zz_metrics.rb
+++ b/config/initializers/zz_metrics.rb
@@ -3,128 +3,6 @@
# This file was prefixed with zz_ because we want to load it the last!
# See: https://gitlab.com/gitlab-org/gitlab-foss/issues/55611
-# Autoload all classes that we want to instrument, and instrument the methods we
-# need. This takes the Gitlab::Metrics::Instrumentation module as an argument so
-# that we can stub it for testing, as it is only called when metrics are
-# enabled.
-#
-# rubocop:disable Metrics/AbcSize
-def instrument_classes(instrumentation)
- return if ENV['STATIC_VERIFICATION']
-
- instrumentation.instrument_instance_methods(Gitlab::Shell)
-
- instrumentation.instrument_methods(Gitlab::Git)
-
- Gitlab::Git.constants.each do |name|
- const = Gitlab::Git.const_get(name, false)
-
- next unless const.is_a?(Module)
-
- instrumentation.instrument_methods(const)
- instrumentation.instrument_instance_methods(const)
- end
-
- # Path to search => prefix to strip from constant
- paths_to_instrument = {
- %w(app finders) => %w(app finders),
- %w(app mailers emails) => %w(app mailers),
- # Don't instrument `app/services/concerns`
- # It contains modules that are included in the services.
- # The services themselves are instrumented so the methods from the modules
- # are included.
- %w(app services [^concerns]**) => %w(app services),
- %w(lib gitlab conflicts) => ['lib'],
- %w(lib gitlab email message) => ['lib'],
- %w(lib gitlab checks) => ['lib']
- }
-
- paths_to_instrument.each do |(path, prefix)|
- prefix = Rails.root.join(*prefix)
-
- Dir[Rails.root.join(*path + ['*.rb'])].each do |file_path|
- path = Pathname.new(file_path).relative_path_from(prefix)
- const = path.to_s.sub('.rb', '').camelize.constantize
-
- instrumentation.instrument_methods(const)
- instrumentation.instrument_instance_methods(const)
- end
- end
-
- instrumentation.instrument_methods(Premailer::Adapter::Nokogiri)
- instrumentation.instrument_instance_methods(Premailer::Adapter::Nokogiri)
-
- instrumentation.instrument_methods(Banzai::Renderer)
- instrumentation.instrument_methods(Banzai::Querying)
-
- instrumentation.instrument_instance_methods(Banzai::ObjectRenderer)
- instrumentation.instrument_instance_methods(Banzai::ReferenceRedactor)
-
- [Issuable, Mentionable, Participable].each do |klass|
- instrumentation.instrument_instance_methods(klass)
- instrumentation.instrument_instance_methods(klass::ClassMethods)
- end
-
- instrumentation.instrument_methods(Gitlab::ReferenceExtractor)
- instrumentation.instrument_instance_methods(Gitlab::ReferenceExtractor)
-
- # Instrument the classes used for checking if somebody has push access.
- instrumentation.instrument_instance_methods(Gitlab::GitAccess)
- instrumentation.instrument_instance_methods(Gitlab::GitAccessWiki)
-
- instrumentation.instrument_instance_methods(API::Helpers)
-
- instrumentation.instrument_instance_methods(RepositoryCheck::SingleRepositoryWorker)
-
- instrumentation.instrument_instance_methods(Rouge::Formatters::HTMLGitlab)
-
- [:XML, :HTML].each do |namespace|
- namespace_mod = Nokogiri.const_get(namespace, false)
-
- instrumentation.instrument_methods(namespace_mod)
- instrumentation.instrument_methods(namespace_mod::Document)
- end
-
- instrumentation.instrument_methods(Rinku)
- instrumentation.instrument_instance_methods(Repository)
-
- instrumentation.instrument_methods(Gitlab::Highlight)
- instrumentation.instrument_instance_methods(Gitlab::Highlight)
- instrumentation.instrument_instance_method(Gitlab::Ci::Config::Yaml::Tags::Resolver, :to_hash)
-
- Gitlab.ee do
- instrumentation.instrument_instance_methods(Elastic::Latest::GitInstanceProxy)
- instrumentation.instrument_instance_methods(Elastic::Latest::GitClassProxy)
-
- instrumentation.instrument_instance_methods(Search::GlobalService)
- instrumentation.instrument_instance_methods(Search::ProjectService)
-
- instrumentation.instrument_instance_methods(Gitlab::Elastic::SearchResults)
- instrumentation.instrument_instance_methods(Gitlab::Elastic::ProjectSearchResults)
- instrumentation.instrument_instance_methods(Gitlab::Elastic::Indexer)
- instrumentation.instrument_instance_methods(Gitlab::Elastic::SnippetSearchResults)
- instrumentation.instrument_instance_methods(Gitlab::Elastic::Helper)
-
- instrumentation.instrument_instance_methods(Elastic::ApplicationVersionedSearch)
- instrumentation.instrument_instance_methods(Elastic::ProjectsSearch)
- instrumentation.instrument_instance_methods(Elastic::RepositoriesSearch)
- instrumentation.instrument_instance_methods(Elastic::SnippetsSearch)
- instrumentation.instrument_instance_methods(Elastic::WikiRepositoriesSearch)
-
- instrumentation.instrument_instance_methods(Gitlab::BitbucketImport::Importer)
- instrumentation.instrument_instance_methods(Bitbucket::Connection)
-
- instrumentation.instrument_instance_methods(Geo::RepositorySyncWorker)
- end
-
- # This is a Rails scope so we have to instrument it manually.
- instrumentation.instrument_method(Project, :visible_to_user)
-
- # Needed for https://gitlab.com/gitlab-org/gitlab-foss/issues/30224#note_32306159
- instrumentation.instrument_instance_method(MergeRequestDiff, :load_commits)
-end
-# rubocop:enable Metrics/AbcSize
-
# With prometheus enabled by default this breaks all specs
# that stubs methods using `any_instance_of` for the models reloaded here.
#
@@ -151,12 +29,8 @@ if Gitlab::Metrics.enabled? && !Rails.env.test? && !(Rails.env.development? && d
Gitlab::Application.configure do |config|
# We want to track certain metrics during the Load Balancing host resolving process.
# Because of that, we need to have metrics code available earlier for Load Balancing.
- if Gitlab::Database::LoadBalancing.enable?
- config.middleware.insert_before Gitlab::Database::LoadBalancing::RackMiddleware,
- Gitlab::Metrics::RackMiddleware
- else
- config.middleware.use(Gitlab::Metrics::RackMiddleware)
- end
+ config.middleware.insert_before Gitlab::Database::LoadBalancing::RackMiddleware,
+ Gitlab::Metrics::RackMiddleware
config.middleware.use(Gitlab::Middleware::RailsQueueDuration)
config.middleware.use(Gitlab::Metrics::ElasticsearchRackMiddleware)
diff --git a/config/initializers_before_autoloader/002_sidekiq.rb b/config/initializers_before_autoloader/002_sidekiq.rb
index 8e2def08279..9ffcf39d6fb 100644
--- a/config/initializers_before_autoloader/002_sidekiq.rb
+++ b/config/initializers_before_autoloader/002_sidekiq.rb
@@ -8,10 +8,6 @@
require 'sidekiq/web'
-# Disable the Sidekiq Rack session since GitLab already has its own session store.
-# CSRF protection still works (https://github.com/mperham/sidekiq/commit/315504e766c4fd88a29b7772169060afc4c40329).
-Sidekiq::Web.set :sessions, false
-
if Rails.env.development?
Sidekiq.default_worker_options[:backtrace] = true
end
diff --git a/config/initializers_before_autoloader/grape_entity_patch.rb b/config/initializers_before_autoloader/grape_entity_patch.rb
deleted file mode 100644
index 2db5876e75f..00000000000
--- a/config/initializers_before_autoloader/grape_entity_patch.rb
+++ /dev/null
@@ -1,27 +0,0 @@
-# frozen_string_literal: true
-
-# This can be removed after the problem gets fixed on upstream.
-# You can follow https://github.com/ruby-grape/grape-entity/pull/355 to see the progress.
-#
-# For more information about the issue;
-# https://github.com/ruby/did_you_mean/issues/158#issuecomment-906056018
-
-require 'grape-entity'
-
-module Grape
- class Entity
- # Upstream version: https://github.com/ruby-grape/grape-entity/blob/675d3c0e20dfc1d6cf6f5ba5b46741bd404c8be7/lib/grape_entity/entity.rb#L520
- def exec_with_object(options, &block)
- if block.parameters.count == 1
- instance_exec(object, &block)
- else
- instance_exec(object, options, &block)
- end
- rescue StandardError => e
- # it handles: https://github.com/ruby/ruby/blob/v3_0_0_preview1/NEWS.md#language-changes point 3, Proc
- raise Grape::Entity::Deprecated.new e.message, 'in ruby 3.0' if e.is_a?(ArgumentError)
-
- raise e
- end
- end
-end
diff --git a/config/locales/en.yml b/config/locales/en.yml
index 4615c9a7390..233dca33bb8 100644
--- a/config/locales/en.yml
+++ b/config/locales/en.yml
@@ -10,6 +10,9 @@ en:
target: Target issue
group:
path: Group URL
+ member:
+ user: "The member's email address"
+ invite_email: "The member's email address"
project/error_tracking_setting:
token: "Auth Token"
project: "Project"
diff --git a/config/mail_room.yml b/config/mail_room.yml
index 25bda294a13..895438dcc4e 100644
--- a/config/mail_room.yml
+++ b/config/mail_room.yml
@@ -29,6 +29,7 @@
:delivery_method: sidekiq
:delivery_options:
:redis_url: <%= config[:redis_url].to_json %>
+ :redis_db: <%= config[:redis_db] %>
:namespace: <%= Gitlab::Redis::Queues::SIDEKIQ_NAMESPACE %>
:queue: <%= config[:queue] %>
:worker: <%= config[:worker] %>
diff --git a/config/metrics/counts_28d/20210216175055_merge_requests.yml b/config/metrics/counts_28d/20210216175055_merge_requests.yml
index dca4f81eeea..06c46964954 100644
--- a/config/metrics/counts_28d/20210216175055_merge_requests.yml
+++ b/config/metrics/counts_28d/20210216175055_merge_requests.yml
@@ -1,7 +1,7 @@
---
data_category: optional
key_path: usage_activity_by_stage_monthly.create.merge_requests
-description: Count of the number of users creating merge requests
+description: Count distinct authors of merge requests
product_section: dev
product_stage: create
product_group: group::code review
diff --git a/config/metrics/counts_28d/20210216175101_merge_requests_users.yml b/config/metrics/counts_28d/20210216175101_merge_requests_users.yml
index 04f0f124e8f..2b43fbf8131 100644
--- a/config/metrics/counts_28d/20210216175101_merge_requests_users.yml
+++ b/config/metrics/counts_28d/20210216175101_merge_requests_users.yml
@@ -1,7 +1,7 @@
---
data_category: optional
key_path: usage_activity_by_stage_monthly.create.merge_requests_users
-description: Monthly count of the number of merge request users
+description: Distinct count of users performing merge request actions like closed, merged, created, commented
product_section: dev
product_stage: create
product_group: group::code review
diff --git a/config/metrics/counts_28d/20210216175405_clusters_applications_cert_managers.yml b/config/metrics/counts_28d/20210216175405_clusters_applications_cert_managers.yml
index a34c679e919..76627a91d0f 100644
--- a/config/metrics/counts_28d/20210216175405_clusters_applications_cert_managers.yml
+++ b/config/metrics/counts_28d/20210216175405_clusters_applications_cert_managers.yml
@@ -7,7 +7,7 @@ product_stage: configure
product_group: group::configure
product_category: kubernetes_management
value_type: number
-status: active
+status: removed
time_frame: 28d
data_source: database
distribution:
@@ -20,3 +20,4 @@ tier:
name: 'count_distinct_user_id_from_clusters_applications_cert_managers'
performance_indicator_type: []
milestone: "<13.9"
+milestone_removed: "14.4"
diff --git a/config/metrics/counts_28d/20210216175407_clusters_applications_helm.yml b/config/metrics/counts_28d/20210216175407_clusters_applications_helm.yml
index 2cc0e937d92..ced2b454844 100644
--- a/config/metrics/counts_28d/20210216175407_clusters_applications_helm.yml
+++ b/config/metrics/counts_28d/20210216175407_clusters_applications_helm.yml
@@ -7,7 +7,7 @@ product_stage: configure
product_group: group::configure
product_category: kubernetes_management
value_type: number
-status: active
+status: removed
time_frame: 28d
data_source: database
distribution:
@@ -20,3 +20,4 @@ tier:
name: 'count_distinct_user_id_from_clusters_applications_helm'
performance_indicator_type: []
milestone: "<13.9"
+milestone_removed: "14.4"
diff --git a/config/metrics/counts_28d/20210216175409_clusters_applications_ingress.yml b/config/metrics/counts_28d/20210216175409_clusters_applications_ingress.yml
index 2cdd680eaee..eee58397947 100644
--- a/config/metrics/counts_28d/20210216175409_clusters_applications_ingress.yml
+++ b/config/metrics/counts_28d/20210216175409_clusters_applications_ingress.yml
@@ -7,7 +7,7 @@ product_stage: configure
product_group: group::configure
product_category: kubernetes_management
value_type: number
-status: active
+status: removed
time_frame: 28d
data_source: database
distribution:
@@ -20,3 +20,4 @@ tier:
name: 'count_distinct_user_id_from_clusters_applications_ingress'
performance_indicator_type: []
milestone: "<13.9"
+milestone_removed: "14.4"
diff --git a/config/metrics/counts_28d/20210216175411_clusters_applications_knative.yml b/config/metrics/counts_28d/20210216175411_clusters_applications_knative.yml
index 23114b91d1f..f12fe191220 100644
--- a/config/metrics/counts_28d/20210216175411_clusters_applications_knative.yml
+++ b/config/metrics/counts_28d/20210216175411_clusters_applications_knative.yml
@@ -7,7 +7,7 @@ product_stage: configure
product_group: group::configure
product_category: kubernetes_management
value_type: number
-status: active
+status: removed
time_frame: 28d
data_source: database
distribution:
@@ -20,3 +20,4 @@ tier:
name: 'count_distinct_user_id_from_clusters_applications_knative'
performance_indicator_type: []
milestone: "<13.9"
+milestone_removed: "14.4"
diff --git a/config/metrics/counts_28d/20210216180958_clusters_applications_prometheus.yml b/config/metrics/counts_28d/20210216180958_clusters_applications_prometheus.yml
index b947a6ff7ea..895746f5121 100644
--- a/config/metrics/counts_28d/20210216180958_clusters_applications_prometheus.yml
+++ b/config/metrics/counts_28d/20210216180958_clusters_applications_prometheus.yml
@@ -7,7 +7,7 @@ product_stage: monitor
product_group: group::monitor
product_category: metrics
value_type: number
-status: active
+status: removed
time_frame: 28d
data_source: database
distribution:
@@ -19,3 +19,4 @@ tier:
- ultimate
performance_indicator_type: []
milestone: "<13.9"
+milestone_removed: "14.4"
diff --git a/config/metrics/counts_28d/20210216181951_clusters_applications_runner.yml b/config/metrics/counts_28d/20210216181951_clusters_applications_runner.yml
index 22702146bc5..4d676e436b2 100644
--- a/config/metrics/counts_28d/20210216181951_clusters_applications_runner.yml
+++ b/config/metrics/counts_28d/20210216181951_clusters_applications_runner.yml
@@ -7,7 +7,7 @@ product_stage: verify
product_group: group::runner
product_category: runner
value_type: number
-status: active
+status: removed
time_frame: 28d
data_source: database
distribution:
@@ -19,3 +19,4 @@ tier:
- ultimate
performance_indicator_type: []
milestone: "<13.9"
+milestone_removed: "14.4"
diff --git a/config/metrics/counts_28d/20210715094458_releases_with_milestones.yml b/config/metrics/counts_28d/20210715094458_releases_with_milestones.yml
new file mode 100644
index 00000000000..74f9406a133
--- /dev/null
+++ b/config/metrics/counts_28d/20210715094458_releases_with_milestones.yml
@@ -0,0 +1,23 @@
+---
+key_path: usage_activity_by_stage_monthly.release.releases_with_milestones
+description: Unique users creating releases with milestones associated
+performance_indicator_type: [smau]
+product_section: ops
+product_stage: release
+product_group: 'group::release'
+product_category: Release Orchestration
+value_type: number
+status: active
+milestone: "14.4"
+introduced_by_url: 'https://gitlab.com/gitlab-org/gitlab/-/merge_requests/71287'
+time_frame: 28d
+data_source: database
+instrumentation_class: 'CountUsersAssociatingMilestonesToReleasesMetric'
+data_category: Optional
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
diff --git a/config/metrics/counts_28d/20210916080405_promoted_issues.yml b/config/metrics/counts_28d/20210916080405_promoted_issues.yml
index 106c3a61289..ec73682b1f3 100644
--- a/config/metrics/counts_28d/20210916080405_promoted_issues.yml
+++ b/config/metrics/counts_28d/20210916080405_promoted_issues.yml
@@ -7,7 +7,7 @@ product_stage: growth
product_group: group::product intelligence
product_category: collection
value_type: number
-status: active
+status: deprecated
milestone: "14.3"
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/70485
time_frame: 28d
diff --git a/config/metrics/counts_28d/20210916201533_clusters_integrations_prometheus.yml b/config/metrics/counts_28d/20210916201533_clusters_integrations_prometheus.yml
new file mode 100644
index 00000000000..6ecc98dcad1
--- /dev/null
+++ b/config/metrics/counts_28d/20210916201533_clusters_integrations_prometheus.yml
@@ -0,0 +1,21 @@
+---
+data_category: optional
+key_path: usage_activity_by_stage_monthly.monitor.clusters_integrations_prometheus
+description: Users creating clusters with Prometheus integration enabled in last 28 days.
+product_section: ops
+product_stage: monitor
+product_group: group::monitor
+product_category: metrics
+value_type: number
+status: active
+time_frame: 28d
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+performance_indicator_type: []
+milestone: "14.4"
diff --git a/config/metrics/counts_28d/20210929102434_p_ci_templates_implicit_jobs_build_monthly.yml b/config/metrics/counts_28d/20210929102434_p_ci_templates_implicit_jobs_build_monthly.yml
new file mode 100644
index 00000000000..4fa6d3d8843
--- /dev/null
+++ b/config/metrics/counts_28d/20210929102434_p_ci_templates_implicit_jobs_build_monthly.yml
@@ -0,0 +1,25 @@
+---
+key_path: redis_hll_counters.ci_templates.p_ci_templates_implicit_jobs_build_monthly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: active
+milestone: "14.4"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/71157
+time_frame: 7d
+data_source: redis_hll
+data_category: optional
+instrumentation_class: RedisHLLMetric
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+options:
+ events:
+ - p_ci_templates_implicit_jobs_build
diff --git a/config/metrics/counts_28d/20210929102736_p_ci_templates_implicit_jobs_deploy_latest_monthly.yml b/config/metrics/counts_28d/20210929102736_p_ci_templates_implicit_jobs_deploy_latest_monthly.yml
new file mode 100644
index 00000000000..9d19a6ffa72
--- /dev/null
+++ b/config/metrics/counts_28d/20210929102736_p_ci_templates_implicit_jobs_deploy_latest_monthly.yml
@@ -0,0 +1,25 @@
+---
+key_path: redis_hll_counters.ci_templates.p_ci_templates_implicit_jobs_deploy_latest_monthly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: active
+milestone: "14.4"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/71157
+time_frame: 7d
+data_source: redis_hll
+data_category: optional
+instrumentation_class: RedisHLLMetric
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+options:
+ events:
+ - p_ci_templates_implicit_jobs_deploy_latest
diff --git a/config/metrics/counts_28d/20210929103010_p_ci_templates_implicit_jobs_deploy_monthly.yml b/config/metrics/counts_28d/20210929103010_p_ci_templates_implicit_jobs_deploy_monthly.yml
new file mode 100644
index 00000000000..5b7b7924c4a
--- /dev/null
+++ b/config/metrics/counts_28d/20210929103010_p_ci_templates_implicit_jobs_deploy_monthly.yml
@@ -0,0 +1,25 @@
+---
+key_path: redis_hll_counters.ci_templates.p_ci_templates_implicit_jobs_deploy_monthly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: active
+milestone: "14.4"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/71157
+time_frame: 7d
+data_source: redis_hll
+data_category: optional
+instrumentation_class: RedisHLLMetric
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+options:
+ events:
+ - p_ci_templates_implicit_jobs_deploy
diff --git a/config/metrics/counts_28d/20210930125418_github_import_project_start_monthly.yml b/config/metrics/counts_28d/20210930125418_github_import_project_start_monthly.yml
new file mode 100644
index 00000000000..2812aa73cad
--- /dev/null
+++ b/config/metrics/counts_28d/20210930125418_github_import_project_start_monthly.yml
@@ -0,0 +1,26 @@
+---
+key_path: redis_hll_counters.importer.github_import_project_start_monthly
+description: The number of github projects that were enqueued to start monthy
+product_section: dev
+product_stage: devops
+product_group: group::import
+product_category:
+value_type: number
+status: active
+milestone: "14.4"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/70012
+time_frame: 28d
+data_source: redis_hll
+data_category: optional
+instrumentation_class: RedisHLLMetric
+options:
+ events:
+ - github_import_project_start
+performance_indicator_type: []
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
diff --git a/config/metrics/counts_28d/20210930130531_github_import_project_success_monthly.yml b/config/metrics/counts_28d/20210930130531_github_import_project_success_monthly.yml
new file mode 100644
index 00000000000..ab599c67376
--- /dev/null
+++ b/config/metrics/counts_28d/20210930130531_github_import_project_success_monthly.yml
@@ -0,0 +1,25 @@
+---
+key_path: redis_hll_counters.importer.github_import_project_success_monthly
+description: The number of github projects that were successful monthly
+product_section: dev
+product_stage: devops
+product_group: group::import
+product_category:
+value_type: number
+status: active
+milestone: "14.4"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/70012
+time_frame: 28d
+data_source: redis_hll
+data_category: optional
+instrumentation_class: RedisHLLMetric
+options:
+ events:
+ - github_import_project_success
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
diff --git a/config/metrics/counts_28d/20210930163813_github_import_project_failure_monthly.yml b/config/metrics/counts_28d/20210930163813_github_import_project_failure_monthly.yml
new file mode 100644
index 00000000000..6651a770920
--- /dev/null
+++ b/config/metrics/counts_28d/20210930163813_github_import_project_failure_monthly.yml
@@ -0,0 +1,25 @@
+---
+key_path: redis_hll_counters.importer.github_import_project_failure_monthly
+description: The number of github projects that failed monthly
+product_section: dev
+product_stage: devops
+product_group: group::import
+product_category:
+value_type: number
+status: active
+milestone: "14.4"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/70012
+time_frame: 28d
+data_source: redis_hll
+data_category: optional
+instrumentation_class: RedisHLLMetric
+options:
+ events:
+ - github_import_project_failure
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
diff --git a/config/metrics/counts_7d/20210916100524_groups_gitlab_slack_application_active.yml b/config/metrics/counts_7d/20210916100524_groups_gitlab_slack_application_active.yml
new file mode 100644
index 00000000000..9a23d73b136
--- /dev/null
+++ b/config/metrics/counts_7d/20210916100524_groups_gitlab_slack_application_active.yml
@@ -0,0 +1,23 @@
+---
+key_path: counts.groups_gitlab_slack_application_active
+name: count_groups_gitlab_slack_application_active
+description: Count groups with active slack application
+product_section: dev
+product_stage: ecosystem
+product_group: group::integrations
+product_category: integrations
+value_type: number
+status: active
+milestone: "14.3"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/70496
+time_frame: 7d
+data_source: database
+data_category: optional
+performance_indicator_type: []
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
diff --git a/config/metrics/counts_7d/20210916101641_projects_gitlab_slack_application_active.yml b/config/metrics/counts_7d/20210916101641_projects_gitlab_slack_application_active.yml
new file mode 100644
index 00000000000..2d1124a5971
--- /dev/null
+++ b/config/metrics/counts_7d/20210916101641_projects_gitlab_slack_application_active.yml
@@ -0,0 +1,23 @@
+---
+key_path: counts.projects_gitlab_slack_application_active
+name: count_project_gitlab_slack_application_active
+description: Count projects with active slack application
+product_section: dev
+product_stage: ecosystem
+product_group: group::integrations
+product_category: integrations
+value_type: number
+status: active
+milestone: "14.3"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/70496
+time_frame: 7d
+data_source: database
+data_category: optional
+performance_indicator_type: []
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
diff --git a/config/metrics/counts_7d/20210916101837_instances_gitlab_slack_application_active.yml b/config/metrics/counts_7d/20210916101837_instances_gitlab_slack_application_active.yml
new file mode 100644
index 00000000000..8a04e024eba
--- /dev/null
+++ b/config/metrics/counts_7d/20210916101837_instances_gitlab_slack_application_active.yml
@@ -0,0 +1,23 @@
+---
+key_path: counts.instances_gitlab_slack_application_active
+name: count_instances_gitlab_slack_application_active
+description: Count instances with active slack application
+product_section: dev
+product_stage: ecosystem
+product_group: group::integrations
+product_category: integrations
+value_type: number
+status: active
+milestone: "14.3"
+introduced_by_url: https://gilab.com/gitlab-org/gitlab/-/merge_requests/70496
+time_frame: 7d
+data_source: database
+data_category: optional
+performance_indicator_type: []
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
diff --git a/config/metrics/counts_7d/20210916102312_templates_gitlab_slack_application_active.yml b/config/metrics/counts_7d/20210916102312_templates_gitlab_slack_application_active.yml
new file mode 100644
index 00000000000..d465e1b3d03
--- /dev/null
+++ b/config/metrics/counts_7d/20210916102312_templates_gitlab_slack_application_active.yml
@@ -0,0 +1,23 @@
+---
+key_path: counts.templates_gitlab_slack_application_active
+name: count_templates_gitlab_slack_application_active
+description: Count templates with active slack application
+product_section: dev
+product_stage: ecosystem
+product_group: group::integrations
+product_category: integrations
+value_type: number
+status: active
+milestone: "14.3"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/70496
+time_frame: 7d
+data_source: database
+data_category: optional
+performance_indicator_type: []
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
diff --git a/config/metrics/counts_7d/20210917040700_groups_inheriting_gitlab_slack_application_active.yml b/config/metrics/counts_7d/20210917040700_groups_inheriting_gitlab_slack_application_active.yml
new file mode 100644
index 00000000000..2a62c45c54a
--- /dev/null
+++ b/config/metrics/counts_7d/20210917040700_groups_inheriting_gitlab_slack_application_active.yml
@@ -0,0 +1,23 @@
+---
+key_path: counts.groups_inheriting_gitlab_slack_application_active
+name: count_groups_inheriting_gitlab_slack_application_active
+description: Count groups inheriting active slack application
+product_section: dev
+product_stage: ecosystem
+product_group: group::integrations
+product_category: integrations
+value_type: number
+status: active
+milestone: "14.3"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/70496
+time_frame: 7d
+data_source: database
+data_category: optional
+performance_indicator_type: []
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
diff --git a/config/metrics/counts_7d/20210917040956_projects_inheriting_gitlab_slack_application_active.yml b/config/metrics/counts_7d/20210917040956_projects_inheriting_gitlab_slack_application_active.yml
new file mode 100644
index 00000000000..266670159b6
--- /dev/null
+++ b/config/metrics/counts_7d/20210917040956_projects_inheriting_gitlab_slack_application_active.yml
@@ -0,0 +1,23 @@
+---
+key_path: counts.projects_inheriting_gitlab_slack_application_active
+name: count_project_inheriting_gitlab_slack_application_active
+description: Count projects inheriting active slack application
+product_section: dev
+product_stage: ecosystem
+product_group: group::integrations
+product_category: integrations
+value_type: number
+status: active
+milestone: "14.3"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/70496
+time_frame: 7d
+data_source: database
+data_category: optional
+performance_indicator_type: []
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
diff --git a/config/metrics/counts_7d/20210929102429_p_ci_templates_implicit_jobs_build_weekly.yml b/config/metrics/counts_7d/20210929102429_p_ci_templates_implicit_jobs_build_weekly.yml
new file mode 100644
index 00000000000..f13174a4af6
--- /dev/null
+++ b/config/metrics/counts_7d/20210929102429_p_ci_templates_implicit_jobs_build_weekly.yml
@@ -0,0 +1,25 @@
+---
+key_path: redis_hll_counters.ci_templates.p_ci_templates_implicit_jobs_build_weekly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: active
+milestone: "14.4"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/71157
+time_frame: 7d
+data_source: redis_hll
+data_category: optional
+instrumentation_class: RedisHLLMetric
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+options:
+ events:
+ - p_ci_templates_implicit_jobs_build
diff --git a/config/metrics/counts_7d/20210929102731_p_ci_templates_implicit_jobs_deploy_latest_weekly.yml b/config/metrics/counts_7d/20210929102731_p_ci_templates_implicit_jobs_deploy_latest_weekly.yml
new file mode 100644
index 00000000000..f4d0ac7ff98
--- /dev/null
+++ b/config/metrics/counts_7d/20210929102731_p_ci_templates_implicit_jobs_deploy_latest_weekly.yml
@@ -0,0 +1,25 @@
+---
+key_path: redis_hll_counters.ci_templates.p_ci_templates_implicit_jobs_deploy_latest_weekly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: active
+milestone: "14.4"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/71157
+time_frame: 7d
+data_source: redis_hll
+data_category: optional
+instrumentation_class: RedisHLLMetric
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+options:
+ events:
+ - p_ci_templates_implicit_jobs_deploy_latest
diff --git a/config/metrics/counts_7d/20210929103006_p_ci_templates_implicit_jobs_deploy_weekly.yml b/config/metrics/counts_7d/20210929103006_p_ci_templates_implicit_jobs_deploy_weekly.yml
new file mode 100644
index 00000000000..964b57c65be
--- /dev/null
+++ b/config/metrics/counts_7d/20210929103006_p_ci_templates_implicit_jobs_deploy_weekly.yml
@@ -0,0 +1,25 @@
+---
+key_path: redis_hll_counters.ci_templates.p_ci_templates_implicit_jobs_deploy_weekly
+description: ''
+product_section: ''
+product_stage: ''
+product_group: ''
+product_category: ''
+value_type: number
+status: active
+milestone: "14.4"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/71157
+time_frame: 7d
+data_source: redis_hll
+data_category: optional
+instrumentation_class: RedisHLLMetric
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+options:
+ events:
+ - p_ci_templates_implicit_jobs_deploy
diff --git a/config/metrics/counts_7d/20210930125411_github_import_project_start_weekly.yml b/config/metrics/counts_7d/20210930125411_github_import_project_start_weekly.yml
new file mode 100644
index 00000000000..2c5b7d46e1a
--- /dev/null
+++ b/config/metrics/counts_7d/20210930125411_github_import_project_start_weekly.yml
@@ -0,0 +1,26 @@
+---
+key_path: redis_hll_counters.importer.github_import_project_start_weekly
+description: The number of github projects that were enqueued to start weekly
+product_section: dev
+product_stage: devops
+product_group: group::import
+product_category:
+value_type: number
+status: active
+milestone: "14.4"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/70012
+time_frame: 7d
+data_source: redis_hll
+data_category: optional
+instrumentation_class: RedisHLLMetric
+options:
+ events:
+ - github_import_project_start
+performance_indicator_type: []
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
diff --git a/config/metrics/counts_7d/20210930130525_github_import_project_success_weekly.yml b/config/metrics/counts_7d/20210930130525_github_import_project_success_weekly.yml
new file mode 100644
index 00000000000..10147658ddc
--- /dev/null
+++ b/config/metrics/counts_7d/20210930130525_github_import_project_success_weekly.yml
@@ -0,0 +1,26 @@
+---
+key_path: redis_hll_counters.importer.github_import_project_success_weekly
+description: The number of github projects that were successful weekly
+product_section: dev
+product_stage: devops
+product_group: group::import
+product_category:
+value_type: number
+status: active
+milestone: "14.4"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/70012
+time_frame: 7d
+data_source: redis_hll
+data_category: optional
+instrumentation_class: RedisHLLMetric
+options:
+ events:
+ - github_import_project_success
+performance_indicator_type: []
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
diff --git a/config/metrics/counts_7d/20210930163807_github_import_project_failure_weekly.yml b/config/metrics/counts_7d/20210930163807_github_import_project_failure_weekly.yml
new file mode 100644
index 00000000000..33a1902504f
--- /dev/null
+++ b/config/metrics/counts_7d/20210930163807_github_import_project_failure_weekly.yml
@@ -0,0 +1,25 @@
+---
+key_path: redis_hll_counters.importer.github_import_project_failure_weekly
+description: The number of github projects that failed weekly
+product_section: dev
+product_stage: devops
+product_group: group::import
+product_category:
+value_type: number
+status: active
+milestone: "14.4"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/70012
+time_frame: 7d
+data_source: redis_hll
+data_category: optional
+instrumentation_class: RedisHLLMetric
+options:
+ events:
+ - github_import_project_failure
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
diff --git a/config/metrics/counts_all/20210216175255_clusters_applications_helm.yml b/config/metrics/counts_all/20210216175255_clusters_applications_helm.yml
index 661d809ae65..e772f669513 100644
--- a/config/metrics/counts_all/20210216175255_clusters_applications_helm.yml
+++ b/config/metrics/counts_all/20210216175255_clusters_applications_helm.yml
@@ -7,7 +7,7 @@ product_stage: configure
product_group: group::configure
product_category: kubernetes_management
value_type: number
-status: active
+status: removed
time_frame: all
data_source: database
distribution:
@@ -19,3 +19,4 @@ tier:
- ultimate
performance_indicator_type: []
milestone: "<13.9"
+milestone_removed: "14.4"
diff --git a/config/metrics/counts_all/20210216175257_clusters_applications_ingress.yml b/config/metrics/counts_all/20210216175257_clusters_applications_ingress.yml
index 889e701a8d7..1e31c28f543 100644
--- a/config/metrics/counts_all/20210216175257_clusters_applications_ingress.yml
+++ b/config/metrics/counts_all/20210216175257_clusters_applications_ingress.yml
@@ -7,7 +7,7 @@ product_stage: configure
product_group: group::configure
product_category: kubernetes_management
value_type: number
-status: active
+status: removed
time_frame: all
data_source: database
distribution:
@@ -19,3 +19,4 @@ tier:
- ultimate
performance_indicator_type: []
milestone: "<13.9"
+milestone_removed: "14.4"
diff --git a/config/metrics/counts_all/20210216175259_clusters_applications_cert_managers.yml b/config/metrics/counts_all/20210216175259_clusters_applications_cert_managers.yml
index a22cf9dd848..bc16040f143 100644
--- a/config/metrics/counts_all/20210216175259_clusters_applications_cert_managers.yml
+++ b/config/metrics/counts_all/20210216175259_clusters_applications_cert_managers.yml
@@ -7,7 +7,7 @@ product_stage: configure
product_group: group::configure
product_category: kubernetes_management
value_type: number
-status: active
+status: removed
time_frame: all
data_source: database
distribution:
@@ -19,3 +19,4 @@ tier:
- ultimate
performance_indicator_type: []
milestone: "<13.9"
+milestone_removed: "14.4"
diff --git a/config/metrics/counts_all/20210216175301_clusters_applications_crossplane.yml b/config/metrics/counts_all/20210216175301_clusters_applications_crossplane.yml
index 1fc50c89bdc..2856a0e25ac 100644
--- a/config/metrics/counts_all/20210216175301_clusters_applications_crossplane.yml
+++ b/config/metrics/counts_all/20210216175301_clusters_applications_crossplane.yml
@@ -7,7 +7,7 @@ product_stage: configure
product_group: group::configure
product_category: kubernetes_management
value_type: number
-status: active
+status: removed
time_frame: all
data_source: database
distribution:
@@ -19,3 +19,4 @@ tier:
- ultimate
performance_indicator_type: []
milestone: "<13.9"
+milestone_removed: "14.4"
diff --git a/config/metrics/counts_all/20210216175303_clusters_applications_prometheus.yml b/config/metrics/counts_all/20210216175303_clusters_applications_prometheus.yml
index b883f9cdd1b..961c9adfdb7 100644
--- a/config/metrics/counts_all/20210216175303_clusters_applications_prometheus.yml
+++ b/config/metrics/counts_all/20210216175303_clusters_applications_prometheus.yml
@@ -7,7 +7,7 @@ product_stage: configure
product_group: group::configure
product_category: kubernetes_management
value_type: number
-status: active
+status: removed
time_frame: all
data_source: database
distribution:
@@ -19,3 +19,4 @@ tier:
- ultimate
performance_indicator_type: []
milestone: "<13.9"
+milestone_removed: "14.4"
diff --git a/config/metrics/counts_all/20210216175305_clusters_applications_runner.yml b/config/metrics/counts_all/20210216175305_clusters_applications_runner.yml
index 5f9c9a9c0d0..33f8d045d2b 100644
--- a/config/metrics/counts_all/20210216175305_clusters_applications_runner.yml
+++ b/config/metrics/counts_all/20210216175305_clusters_applications_runner.yml
@@ -7,7 +7,7 @@ product_stage: configure
product_group: group::configure
product_category: kubernetes_management
value_type: number
-status: active
+status: removed
time_frame: all
data_source: database
distribution:
@@ -19,3 +19,4 @@ tier:
- ultimate
performance_indicator_type: []
milestone: "<13.9"
+milestone_removed: "14.4"
diff --git a/config/metrics/counts_all/20210216175307_clusters_applications_knative.yml b/config/metrics/counts_all/20210216175307_clusters_applications_knative.yml
index 8b5f50c6c7f..e5a80ca6385 100644
--- a/config/metrics/counts_all/20210216175307_clusters_applications_knative.yml
+++ b/config/metrics/counts_all/20210216175307_clusters_applications_knative.yml
@@ -7,7 +7,7 @@ product_stage: configure
product_group: group::configure
product_category: kubernetes_management
value_type: number
-status: active
+status: removed
time_frame: all
data_source: database
distribution:
@@ -19,3 +19,4 @@ tier:
- ultimate
performance_indicator_type: []
milestone: "<13.9"
+milestone_removed: "14.4"
diff --git a/config/metrics/counts_all/20210216175309_clusters_applications_elastic_stack.yml b/config/metrics/counts_all/20210216175309_clusters_applications_elastic_stack.yml
index fafbf8a7d47..4d5dbcd198f 100644
--- a/config/metrics/counts_all/20210216175309_clusters_applications_elastic_stack.yml
+++ b/config/metrics/counts_all/20210216175309_clusters_applications_elastic_stack.yml
@@ -7,7 +7,7 @@ product_stage: configure
product_group: group::configure
product_category: kubernetes_management
value_type: number
-status: active
+status: removed
time_frame: all
data_source: database
distribution:
@@ -19,3 +19,4 @@ tier:
- ultimate
performance_indicator_type: []
milestone: "<13.9"
+milestone_removed: "14.4"
diff --git a/config/metrics/counts_all/20210216175310_clusters_applications_jupyter.yml b/config/metrics/counts_all/20210216175310_clusters_applications_jupyter.yml
index 89c8116f0d8..85d62985fa8 100644
--- a/config/metrics/counts_all/20210216175310_clusters_applications_jupyter.yml
+++ b/config/metrics/counts_all/20210216175310_clusters_applications_jupyter.yml
@@ -7,7 +7,7 @@ product_stage: configure
product_group: group::configure
product_category: kubernetes_management
value_type: number
-status: active
+status: removed
time_frame: all
data_source: database
distribution:
@@ -19,3 +19,4 @@ tier:
- ultimate
performance_indicator_type: []
milestone: "<13.9"
+milestone_removed: "14.4"
diff --git a/config/metrics/counts_all/20210216175312_clusters_applications_cilium.yml b/config/metrics/counts_all/20210216175312_clusters_applications_cilium.yml
index faf7f486d32..33a8a53a8ab 100644
--- a/config/metrics/counts_all/20210216175312_clusters_applications_cilium.yml
+++ b/config/metrics/counts_all/20210216175312_clusters_applications_cilium.yml
@@ -7,7 +7,7 @@ product_stage: configure
product_group: group::configure
product_category: kubernetes_management
value_type: number
-status: active
+status: removed
time_frame: all
data_source: database
distribution:
@@ -19,3 +19,4 @@ tier:
- ultimate
performance_indicator_type: []
milestone: "<13.9"
+milestone_removed: "14.4"
diff --git a/config/metrics/counts_all/20210216175329_clusters_applications_cert_managers.yml b/config/metrics/counts_all/20210216175329_clusters_applications_cert_managers.yml
index 185ab921fd6..f97816e18c1 100644
--- a/config/metrics/counts_all/20210216175329_clusters_applications_cert_managers.yml
+++ b/config/metrics/counts_all/20210216175329_clusters_applications_cert_managers.yml
@@ -7,7 +7,7 @@ product_stage: configure
product_group: group::configure
product_category: kubernetes_management
value_type: number
-status: active
+status: removed
time_frame: all
data_source: database
distribution:
@@ -18,3 +18,4 @@ tier:
- premium
- ultimate
milestone: "<13.9"
+milestone_removed: "14.4"
diff --git a/config/metrics/counts_all/20210216175331_clusters_applications_helm.yml b/config/metrics/counts_all/20210216175331_clusters_applications_helm.yml
index 4561338a3cb..28c58e11854 100644
--- a/config/metrics/counts_all/20210216175331_clusters_applications_helm.yml
+++ b/config/metrics/counts_all/20210216175331_clusters_applications_helm.yml
@@ -7,7 +7,7 @@ product_stage: configure
product_group: group::configure
product_category: kubernetes_management
value_type: number
-status: active
+status: removed
time_frame: all
data_source: database
distribution:
@@ -18,3 +18,4 @@ tier:
- premium
- ultimate
milestone: "<13.9"
+milestone_removed: "14.4"
diff --git a/config/metrics/counts_all/20210216175333_clusters_applications_ingress.yml b/config/metrics/counts_all/20210216175333_clusters_applications_ingress.yml
index 8336b6a4048..b93198b92a4 100644
--- a/config/metrics/counts_all/20210216175333_clusters_applications_ingress.yml
+++ b/config/metrics/counts_all/20210216175333_clusters_applications_ingress.yml
@@ -7,7 +7,7 @@ product_stage: configure
product_group: group::configure
product_category: kubernetes_management
value_type: number
-status: active
+status: removed
time_frame: all
data_source: database
distribution:
@@ -18,3 +18,4 @@ tier:
- premium
- ultimate
milestone: "<13.9"
+milestone_removed: "14.4"
diff --git a/config/metrics/counts_all/20210216175335_clusters_applications_knative.yml b/config/metrics/counts_all/20210216175335_clusters_applications_knative.yml
index c5979093a18..735f3ea8e04 100644
--- a/config/metrics/counts_all/20210216175335_clusters_applications_knative.yml
+++ b/config/metrics/counts_all/20210216175335_clusters_applications_knative.yml
@@ -7,7 +7,7 @@ product_stage: configure
product_group: group::configure
product_category: kubernetes_management
value_type: number
-status: active
+status: removed
time_frame: all
data_source: database
distribution:
@@ -18,3 +18,4 @@ tier:
- premium
- ultimate
milestone: "<13.9"
+milestone_removed: "14.4"
diff --git a/config/metrics/counts_all/20210216175627_templates_asana_active.yml b/config/metrics/counts_all/20210216175627_templates_asana_active.yml
index 48025516d32..3575f359f99 100644
--- a/config/metrics/counts_all/20210216175627_templates_asana_active.yml
+++ b/config/metrics/counts_all/20210216175627_templates_asana_active.yml
@@ -7,7 +7,8 @@ product_stage: ecosystem
product_group: group::integrations
product_category: integrations
value_type: number
-status: active
+status: removed
+milestone_removed: '14.4'
time_frame: all
data_source: database
distribution:
diff --git a/config/metrics/counts_all/20210216175638_templates_assembla_active.yml b/config/metrics/counts_all/20210216175638_templates_assembla_active.yml
index 1ab0d42a5ee..d0f203e12c5 100644
--- a/config/metrics/counts_all/20210216175638_templates_assembla_active.yml
+++ b/config/metrics/counts_all/20210216175638_templates_assembla_active.yml
@@ -7,7 +7,8 @@ product_stage: ecosystem
product_group: group::integrations
product_category: integrations
value_type: number
-status: active
+status: removed
+milestone_removed: '14.4'
time_frame: all
data_source: database
distribution:
diff --git a/config/metrics/counts_all/20210216175649_templates_bamboo_active.yml b/config/metrics/counts_all/20210216175649_templates_bamboo_active.yml
index 85b10732ae8..2e97c4bf1be 100644
--- a/config/metrics/counts_all/20210216175649_templates_bamboo_active.yml
+++ b/config/metrics/counts_all/20210216175649_templates_bamboo_active.yml
@@ -7,7 +7,8 @@ product_stage: ecosystem
product_group: group::integrations
product_category: integrations
value_type: number
-status: active
+status: removed
+milestone_removed: '14.4'
time_frame: all
data_source: database
distribution:
diff --git a/config/metrics/counts_all/20210216175701_templates_bugzilla_active.yml b/config/metrics/counts_all/20210216175701_templates_bugzilla_active.yml
index bc5a1238010..6d26fbfb8dd 100644
--- a/config/metrics/counts_all/20210216175701_templates_bugzilla_active.yml
+++ b/config/metrics/counts_all/20210216175701_templates_bugzilla_active.yml
@@ -7,7 +7,8 @@ product_stage: ecosystem
product_group: group::integrations
product_category: integrations
value_type: number
-status: active
+status: removed
+milestone_removed: '14.4'
time_frame: all
data_source: database
distribution:
diff --git a/config/metrics/counts_all/20210216175712_templates_buildkite_active.yml b/config/metrics/counts_all/20210216175712_templates_buildkite_active.yml
index 16287a4e71a..8218ae10cae 100644
--- a/config/metrics/counts_all/20210216175712_templates_buildkite_active.yml
+++ b/config/metrics/counts_all/20210216175712_templates_buildkite_active.yml
@@ -7,7 +7,8 @@ product_stage: ecosystem
product_group: group::integrations
product_category: integrations
value_type: number
-status: active
+status: removed
+milestone_removed: '14.4'
time_frame: all
data_source: database
distribution:
diff --git a/config/metrics/counts_all/20210216175723_templates_campfire_active.yml b/config/metrics/counts_all/20210216175723_templates_campfire_active.yml
index 728d3d0af48..2e8b09e4997 100644
--- a/config/metrics/counts_all/20210216175723_templates_campfire_active.yml
+++ b/config/metrics/counts_all/20210216175723_templates_campfire_active.yml
@@ -7,7 +7,8 @@ product_stage: ecosystem
product_group: group::integrations
product_category: integrations
value_type: number
-status: active
+status: removed
+milestone_removed: '14.4'
time_frame: all
data_source: database
distribution:
diff --git a/config/metrics/counts_all/20210216175734_templates_confluence_active.yml b/config/metrics/counts_all/20210216175734_templates_confluence_active.yml
index bb2d9976110..2287415e83c 100644
--- a/config/metrics/counts_all/20210216175734_templates_confluence_active.yml
+++ b/config/metrics/counts_all/20210216175734_templates_confluence_active.yml
@@ -7,7 +7,8 @@ product_stage: ecosystem
product_group: group::integrations
product_category: integrations
value_type: number
-status: active
+status: removed
+milestone_removed: '14.4'
time_frame: all
data_source: database
distribution:
diff --git a/config/metrics/counts_all/20210216175745_templates_custom_issue_tracker_active.yml b/config/metrics/counts_all/20210216175745_templates_custom_issue_tracker_active.yml
index c1c63d0529a..343c4c887aa 100644
--- a/config/metrics/counts_all/20210216175745_templates_custom_issue_tracker_active.yml
+++ b/config/metrics/counts_all/20210216175745_templates_custom_issue_tracker_active.yml
@@ -7,7 +7,8 @@ product_stage: ecosystem
product_group: group::integrations
product_category: integrations
value_type: number
-status: active
+status: removed
+milestone_removed: '14.4'
time_frame: all
data_source: database
distribution:
diff --git a/config/metrics/counts_all/20210216175756_templates_discord_active.yml b/config/metrics/counts_all/20210216175756_templates_discord_active.yml
index d0663da787f..9f057665e3a 100644
--- a/config/metrics/counts_all/20210216175756_templates_discord_active.yml
+++ b/config/metrics/counts_all/20210216175756_templates_discord_active.yml
@@ -7,7 +7,8 @@ product_stage: ecosystem
product_group: group::integrations
product_category: integrations
value_type: number
-status: active
+status: removed
+milestone_removed: '14.4'
time_frame: all
data_source: database
distribution:
diff --git a/config/metrics/counts_all/20210216175807_templates_drone_ci_active.yml b/config/metrics/counts_all/20210216175807_templates_drone_ci_active.yml
index 6a764f64ab6..edec715a037 100644
--- a/config/metrics/counts_all/20210216175807_templates_drone_ci_active.yml
+++ b/config/metrics/counts_all/20210216175807_templates_drone_ci_active.yml
@@ -7,7 +7,8 @@ product_stage: ecosystem
product_group: group::integrations
product_category: integrations
value_type: number
-status: active
+status: removed
+milestone_removed: '14.4'
time_frame: all
data_source: database
distribution:
diff --git a/config/metrics/counts_all/20210216175818_templates_emails_on_push_active.yml b/config/metrics/counts_all/20210216175818_templates_emails_on_push_active.yml
index f709aff9f07..057e3b3056b 100644
--- a/config/metrics/counts_all/20210216175818_templates_emails_on_push_active.yml
+++ b/config/metrics/counts_all/20210216175818_templates_emails_on_push_active.yml
@@ -7,7 +7,8 @@ product_stage: ecosystem
product_group: group::integrations
product_category: integrations
value_type: number
-status: active
+status: removed
+milestone_removed: '14.4'
time_frame: all
data_source: database
distribution:
diff --git a/config/metrics/counts_all/20210216175829_templates_external_wiki_active.yml b/config/metrics/counts_all/20210216175829_templates_external_wiki_active.yml
index 35bbce95380..31a270395fb 100644
--- a/config/metrics/counts_all/20210216175829_templates_external_wiki_active.yml
+++ b/config/metrics/counts_all/20210216175829_templates_external_wiki_active.yml
@@ -7,7 +7,8 @@ product_stage: ecosystem
product_group: group::integrations
product_category: integrations
value_type: number
-status: active
+status: removed
+milestone_removed: '14.4'
time_frame: all
data_source: database
distribution:
diff --git a/config/metrics/counts_all/20210216175840_templates_flowdock_active.yml b/config/metrics/counts_all/20210216175840_templates_flowdock_active.yml
index dc1466d2bef..74d085a4447 100644
--- a/config/metrics/counts_all/20210216175840_templates_flowdock_active.yml
+++ b/config/metrics/counts_all/20210216175840_templates_flowdock_active.yml
@@ -7,7 +7,8 @@ product_stage: ecosystem
product_group: group::integrations
product_category: integrations
value_type: number
-status: active
+status: removed
+milestone_removed: '14.4'
time_frame: all
data_source: database
distribution:
diff --git a/config/metrics/counts_all/20210216175902_templates_hangouts_chat_active.yml b/config/metrics/counts_all/20210216175902_templates_hangouts_chat_active.yml
index b676501db10..fb007335b2d 100644
--- a/config/metrics/counts_all/20210216175902_templates_hangouts_chat_active.yml
+++ b/config/metrics/counts_all/20210216175902_templates_hangouts_chat_active.yml
@@ -7,7 +7,8 @@ product_stage: ecosystem
product_group: group::integrations
product_category: integrations
value_type: number
-status: active
+status: removed
+milestone_removed: '14.4'
time_frame: all
data_source: database
distribution:
diff --git a/config/metrics/counts_all/20210216175924_templates_irker_active.yml b/config/metrics/counts_all/20210216175924_templates_irker_active.yml
index fc3ed89b6e8..c3491169a7e 100644
--- a/config/metrics/counts_all/20210216175924_templates_irker_active.yml
+++ b/config/metrics/counts_all/20210216175924_templates_irker_active.yml
@@ -7,7 +7,8 @@ product_stage: ecosystem
product_group: group::integrations
product_category: integrations
value_type: number
-status: active
+status: removed
+milestone_removed: '14.4'
time_frame: all
data_source: database
distribution:
diff --git a/config/metrics/counts_all/20210216175935_templates_jenkins_active.yml b/config/metrics/counts_all/20210216175935_templates_jenkins_active.yml
index 542671304b0..96938d84aee 100644
--- a/config/metrics/counts_all/20210216175935_templates_jenkins_active.yml
+++ b/config/metrics/counts_all/20210216175935_templates_jenkins_active.yml
@@ -7,7 +7,8 @@ product_stage: ecosystem
product_group: group::integrations
product_category: integrations
value_type: number
-status: active
+status: removed
+milestone_removed: '14.4'
time_frame: all
data_source: database
distribution:
diff --git a/config/metrics/counts_all/20210216175946_templates_jira_active.yml b/config/metrics/counts_all/20210216175946_templates_jira_active.yml
index 83d3669b7f2..964aef061d2 100644
--- a/config/metrics/counts_all/20210216175946_templates_jira_active.yml
+++ b/config/metrics/counts_all/20210216175946_templates_jira_active.yml
@@ -7,7 +7,8 @@ product_stage: ecosystem
product_group: group::integrations
product_category: integrations
value_type: number
-status: active
+status: removed
+milestone_removed: '14.4'
time_frame: all
data_source: database
distribution:
diff --git a/config/metrics/counts_all/20210216175957_templates_mattermost_active.yml b/config/metrics/counts_all/20210216175957_templates_mattermost_active.yml
index 460c5e808d8..9e472a1cb54 100644
--- a/config/metrics/counts_all/20210216175957_templates_mattermost_active.yml
+++ b/config/metrics/counts_all/20210216175957_templates_mattermost_active.yml
@@ -7,7 +7,8 @@ product_stage: ecosystem
product_group: group::integrations
product_category: integrations
value_type: number
-status: active
+status: removed
+milestone_removed: '14.4'
time_frame: all
data_source: database
distribution:
diff --git a/config/metrics/counts_all/20210216180008_templates_mattermost_slash_commands_active.yml b/config/metrics/counts_all/20210216180008_templates_mattermost_slash_commands_active.yml
index 927710d918c..97a8dccd834 100644
--- a/config/metrics/counts_all/20210216180008_templates_mattermost_slash_commands_active.yml
+++ b/config/metrics/counts_all/20210216180008_templates_mattermost_slash_commands_active.yml
@@ -7,7 +7,8 @@ product_stage: ecosystem
product_group: group::integrations
product_category: integrations
value_type: number
-status: active
+status: removed
+milestone_removed: '14.4'
time_frame: all
data_source: database
distribution:
diff --git a/config/metrics/counts_all/20210216180019_templates_microsoft_teams_active.yml b/config/metrics/counts_all/20210216180019_templates_microsoft_teams_active.yml
index fb35802c2b7..1fed89e7932 100644
--- a/config/metrics/counts_all/20210216180019_templates_microsoft_teams_active.yml
+++ b/config/metrics/counts_all/20210216180019_templates_microsoft_teams_active.yml
@@ -7,7 +7,8 @@ product_stage: ecosystem
product_group: group::integrations
product_category: integrations
value_type: number
-status: active
+status: removed
+milestone_removed: '14.4'
time_frame: all
data_source: database
distribution:
diff --git a/config/metrics/counts_all/20210216180030_templates_packagist_active.yml b/config/metrics/counts_all/20210216180030_templates_packagist_active.yml
index aa56cf08028..75c4f0f2428 100644
--- a/config/metrics/counts_all/20210216180030_templates_packagist_active.yml
+++ b/config/metrics/counts_all/20210216180030_templates_packagist_active.yml
@@ -7,7 +7,8 @@ product_stage: ecosystem
product_group: group::integrations
product_category: integrations
value_type: number
-status: active
+status: removed
+milestone_removed: '14.4'
time_frame: all
data_source: database
distribution:
diff --git a/config/metrics/counts_all/20210216180041_templates_pipelines_email_active.yml b/config/metrics/counts_all/20210216180041_templates_pipelines_email_active.yml
index 2d81cf582e9..74629749687 100644
--- a/config/metrics/counts_all/20210216180041_templates_pipelines_email_active.yml
+++ b/config/metrics/counts_all/20210216180041_templates_pipelines_email_active.yml
@@ -7,7 +7,8 @@ product_stage: ecosystem
product_group: group::integrations
product_category: integrations
value_type: number
-status: active
+status: removed
+milestone_removed: '14.4'
time_frame: all
data_source: database
distribution:
diff --git a/config/metrics/counts_all/20210216180052_templates_pivotaltracker_active.yml b/config/metrics/counts_all/20210216180052_templates_pivotaltracker_active.yml
index 7c869361d05..abc6227f431 100644
--- a/config/metrics/counts_all/20210216180052_templates_pivotaltracker_active.yml
+++ b/config/metrics/counts_all/20210216180052_templates_pivotaltracker_active.yml
@@ -7,7 +7,8 @@ product_stage: ecosystem
product_group: group::integrations
product_category: integrations
value_type: number
-status: active
+status: removed
+milestone_removed: '14.4'
time_frame: all
data_source: database
distribution:
diff --git a/config/metrics/counts_all/20210216180104_templates_pushover_active.yml b/config/metrics/counts_all/20210216180104_templates_pushover_active.yml
index 572b5da07d4..9580fe01068 100644
--- a/config/metrics/counts_all/20210216180104_templates_pushover_active.yml
+++ b/config/metrics/counts_all/20210216180104_templates_pushover_active.yml
@@ -7,7 +7,8 @@ product_stage: ecosystem
product_group: group::integrations
product_category: integrations
value_type: number
-status: active
+status: removed
+milestone_removed: '14.4'
time_frame: all
data_source: database
distribution:
diff --git a/config/metrics/counts_all/20210216180115_templates_redmine_active.yml b/config/metrics/counts_all/20210216180115_templates_redmine_active.yml
index a85417cbc2c..47ba5ed946b 100644
--- a/config/metrics/counts_all/20210216180115_templates_redmine_active.yml
+++ b/config/metrics/counts_all/20210216180115_templates_redmine_active.yml
@@ -7,7 +7,8 @@ product_stage: ecosystem
product_group: group::integrations
product_category: integrations
value_type: number
-status: active
+status: removed
+milestone_removed: '14.4'
time_frame: all
data_source: database
distribution:
diff --git a/config/metrics/counts_all/20210216180126_templates_slack_active.yml b/config/metrics/counts_all/20210216180126_templates_slack_active.yml
index dffa673cd47..792c965216e 100644
--- a/config/metrics/counts_all/20210216180126_templates_slack_active.yml
+++ b/config/metrics/counts_all/20210216180126_templates_slack_active.yml
@@ -7,7 +7,8 @@ product_stage: ecosystem
product_group: group::integrations
product_category: integrations
value_type: number
-status: active
+status: removed
+milestone_removed: '14.4'
time_frame: all
data_source: database
distribution:
diff --git a/config/metrics/counts_all/20210216180137_templates_slack_slash_commands_active.yml b/config/metrics/counts_all/20210216180137_templates_slack_slash_commands_active.yml
index e044d6cf1dd..38bc6959318 100644
--- a/config/metrics/counts_all/20210216180137_templates_slack_slash_commands_active.yml
+++ b/config/metrics/counts_all/20210216180137_templates_slack_slash_commands_active.yml
@@ -7,7 +7,8 @@ product_stage: ecosystem
product_group: group::integrations
product_category: integrations
value_type: number
-status: active
+status: removed
+milestone_removed: '14.4'
time_frame: all
data_source: database
distribution:
diff --git a/config/metrics/counts_all/20210216180148_templates_teamcity_active.yml b/config/metrics/counts_all/20210216180148_templates_teamcity_active.yml
index b3a37ebc578..63e8285e220 100644
--- a/config/metrics/counts_all/20210216180148_templates_teamcity_active.yml
+++ b/config/metrics/counts_all/20210216180148_templates_teamcity_active.yml
@@ -7,7 +7,8 @@ product_stage: ecosystem
product_group: group::integrations
product_category: integrations
value_type: number
-status: active
+status: removed
+milestone_removed: '14.4'
time_frame: all
data_source: database
distribution:
diff --git a/config/metrics/counts_all/20210216180159_templates_unify_circuit_active.yml b/config/metrics/counts_all/20210216180159_templates_unify_circuit_active.yml
index 39facfb237e..10c7b23a308 100644
--- a/config/metrics/counts_all/20210216180159_templates_unify_circuit_active.yml
+++ b/config/metrics/counts_all/20210216180159_templates_unify_circuit_active.yml
@@ -7,7 +7,8 @@ product_stage: ecosystem
product_group: group::integrations
product_category: integrations
value_type: number
-status: active
+status: removed
+milestone_removed: '14.4'
time_frame: all
data_source: database
distribution:
diff --git a/config/metrics/counts_all/20210216180210_templates_webex_teams_active.yml b/config/metrics/counts_all/20210216180210_templates_webex_teams_active.yml
index 185b538a228..1e41a8170d4 100644
--- a/config/metrics/counts_all/20210216180210_templates_webex_teams_active.yml
+++ b/config/metrics/counts_all/20210216180210_templates_webex_teams_active.yml
@@ -7,7 +7,8 @@ product_stage: ecosystem
product_group: group::integrations
product_category: integrations
value_type: number
-status: active
+status: removed
+milestone_removed: '14.4'
time_frame: all
data_source: database
distribution:
diff --git a/config/metrics/counts_all/20210216180221_templates_youtrack_active.yml b/config/metrics/counts_all/20210216180221_templates_youtrack_active.yml
index a6c11918ce2..edd5aa07f59 100644
--- a/config/metrics/counts_all/20210216180221_templates_youtrack_active.yml
+++ b/config/metrics/counts_all/20210216180221_templates_youtrack_active.yml
@@ -7,7 +7,8 @@ product_stage: ecosystem
product_group: group::integrations
product_category: integrations
value_type: number
-status: active
+status: removed
+milestone_removed: '14.4'
time_frame: all
data_source: database
distribution:
diff --git a/config/metrics/counts_all/20210216180934_templates_prometheus_active.yml b/config/metrics/counts_all/20210216180934_templates_prometheus_active.yml
index 4bf8911c666..9f8a24488ad 100644
--- a/config/metrics/counts_all/20210216180934_templates_prometheus_active.yml
+++ b/config/metrics/counts_all/20210216180934_templates_prometheus_active.yml
@@ -7,7 +7,8 @@ product_stage: monitor
product_group: group::monitor
product_category: metrics
value_type: number
-status: active
+status: removed
+milestone_removed: '14.4'
time_frame: all
data_source: database
distribution:
diff --git a/config/metrics/counts_all/20210216180947_clusters_applications_prometheus.yml b/config/metrics/counts_all/20210216180947_clusters_applications_prometheus.yml
index a43dc103f9c..bf567337380 100644
--- a/config/metrics/counts_all/20210216180947_clusters_applications_prometheus.yml
+++ b/config/metrics/counts_all/20210216180947_clusters_applications_prometheus.yml
@@ -7,7 +7,7 @@ product_stage: monitor
product_group: group::monitor
product_category: metrics
value_type: number
-status: active
+status: removed
time_frame: all
data_source: database
distribution:
@@ -18,3 +18,4 @@ tier:
- premium
- ultimate
milestone: "<13.9"
+milestone_removed: "14.4"
diff --git a/config/metrics/counts_all/20210216181949_clusters_applications_runner.yml b/config/metrics/counts_all/20210216181949_clusters_applications_runner.yml
index 96f16043e65..3c3fc600698 100644
--- a/config/metrics/counts_all/20210216181949_clusters_applications_runner.yml
+++ b/config/metrics/counts_all/20210216181949_clusters_applications_runner.yml
@@ -7,7 +7,7 @@ product_stage: configure
product_group: group::configure
product_category: kubernetes_management
value_type: number
-status: active
+status: removed
time_frame: all
data_source: database
distribution:
@@ -18,3 +18,4 @@ tier:
- premium
- ultimate
milestone: "<13.9"
+milestone_removed: "14.4"
diff --git a/config/metrics/counts_all/20210216182112_sast_jobs.yml b/config/metrics/counts_all/20210216182112_sast_jobs.yml
deleted file mode 100644
index 1012910675b..00000000000
--- a/config/metrics/counts_all/20210216182112_sast_jobs.yml
+++ /dev/null
@@ -1,21 +0,0 @@
----
-data_category: operational
-key_path: counts.sast_jobs
-description: Count of SAST CI jobs for the month. Job names ending in '-sast'
-product_section: sec
-product_stage: secure
-product_group: group::static analysis
-product_category: static_application_security_testing
-value_type: number
-status: active
-time_frame: all
-data_source: database
-distribution:
-- ce
-- ee
-tier:
-- free
-- premium
-- ultimate
-performance_indicator_type: []
-milestone: "<13.9"
diff --git a/config/metrics/counts_all/20210216182114_secret_detection_jobs.yml b/config/metrics/counts_all/20210216182114_secret_detection_jobs.yml
deleted file mode 100644
index 8a3d1ef15f3..00000000000
--- a/config/metrics/counts_all/20210216182114_secret_detection_jobs.yml
+++ /dev/null
@@ -1,21 +0,0 @@
----
-data_category: operational
-key_path: counts.secret_detection_jobs
-description: Count of all 'secret-detection' CI jobs.
-product_section: sec
-product_stage: secure
-product_group: group::static analysis
-product_category: secret_detection
-value_type: number
-status: active
-time_frame: all
-data_source: database
-distribution:
-- ce
-- ee
-tier:
-- free
-- premium
-- ultimate
-performance_indicator_type: []
-milestone: "<13.9"
diff --git a/config/metrics/counts_all/20210216182551_templates_datadog_active.yml b/config/metrics/counts_all/20210216182551_templates_datadog_active.yml
index d2df07b8d21..975bc2164bc 100644
--- a/config/metrics/counts_all/20210216182551_templates_datadog_active.yml
+++ b/config/metrics/counts_all/20210216182551_templates_datadog_active.yml
@@ -7,7 +7,8 @@ product_stage: ecosystem
product_group: group::integrations
product_category: integrations
value_type: number
-status: active
+status: removed
+milestone_removed: '14.4'
time_frame: all
data_source: database
distribution:
diff --git a/config/metrics/counts_all/20210216182618_templates_ewm_active.yml b/config/metrics/counts_all/20210216182618_templates_ewm_active.yml
index 1ace369980b..be61177d818 100644
--- a/config/metrics/counts_all/20210216182618_templates_ewm_active.yml
+++ b/config/metrics/counts_all/20210216182618_templates_ewm_active.yml
@@ -7,7 +7,8 @@ product_stage: ecosystem
product_group: group::integrations
product_category: integrations
value_type: number
-status: active
+status: removed
+milestone_removed: '14.4'
time_frame: all
data_source: database
distribution:
diff --git a/config/metrics/counts_all/20210216182907_package_events_i_package_container_delete_package.yml b/config/metrics/counts_all/20210216182907_package_events_i_package_container_delete_package.yml
index e36411a81e5..c20a79a2f29 100644
--- a/config/metrics/counts_all/20210216182907_package_events_i_package_container_delete_package.yml
+++ b/config/metrics/counts_all/20210216182907_package_events_i_package_container_delete_package.yml
@@ -7,7 +7,8 @@ product_stage: package
product_group: group::package
product_category: container registry
value_type: number
-status: deprecated
+status: removed
+milestone_removed: "14.4"
time_frame: all
data_source: redis
distribution:
diff --git a/config/metrics/counts_all/20210216182909_package_events_i_package_container_pull_package.yml b/config/metrics/counts_all/20210216182909_package_events_i_package_container_pull_package.yml
index c9c448b642e..ff3ab7b40cd 100644
--- a/config/metrics/counts_all/20210216182909_package_events_i_package_container_pull_package.yml
+++ b/config/metrics/counts_all/20210216182909_package_events_i_package_container_pull_package.yml
@@ -7,7 +7,8 @@ product_stage: package
product_group: group::package
product_category: container registry
value_type: number
-status: deprecated
+status: removed
+milestone_removed: "14.4"
time_frame: all
data_source: redis
distribution:
diff --git a/config/metrics/counts_all/20210216182911_package_events_i_package_container_push_package.yml b/config/metrics/counts_all/20210216182911_package_events_i_package_container_push_package.yml
index 9ca8e62f68a..2c9d9a391a0 100644
--- a/config/metrics/counts_all/20210216182911_package_events_i_package_container_push_package.yml
+++ b/config/metrics/counts_all/20210216182911_package_events_i_package_container_push_package.yml
@@ -7,7 +7,8 @@ product_stage: package
product_group: group::package
product_category: container registry
value_type: number
-status: deprecated
+status: removed
+milestone_removed: "14.4"
time_frame: all
data_source: redis
distribution:
diff --git a/config/metrics/counts_all/20210216182917_package_events_i_package_debian_push_package.yml b/config/metrics/counts_all/20210216182917_package_events_i_package_debian_push_package.yml
index 4fe173115ca..c6f23fe0c80 100644
--- a/config/metrics/counts_all/20210216182917_package_events_i_package_debian_push_package.yml
+++ b/config/metrics/counts_all/20210216182917_package_events_i_package_debian_push_package.yml
@@ -7,7 +7,8 @@ product_stage: package
product_group: group::package
product_category: package registry
value_type: number
-status: deprecated
+status: removed
+milestone_removed: "14.4"
time_frame: all
data_source: redis
distribution:
diff --git a/config/metrics/counts_all/20210715094459_releases_with_milestones.yml b/config/metrics/counts_all/20210715094459_releases_with_milestones.yml
new file mode 100644
index 00000000000..5d853604580
--- /dev/null
+++ b/config/metrics/counts_all/20210715094459_releases_with_milestones.yml
@@ -0,0 +1,23 @@
+---
+key_path: usage_activity_by_stage.release.releases_with_milestones
+description: Unique users creating releases with milestones associated
+performance_indicator_type: []
+product_section: ops
+product_stage: release
+product_group: 'group::release'
+product_category: Release Orchestration
+value_type: number
+status: active
+milestone: "14.4"
+introduced_by_url: 'https://gitlab.com/gitlab-org/gitlab/-/merge_requests/71287'
+time_frame: 28d
+data_source: database
+instrumentation_class: 'CountUsersAssociatingMilestonesToReleasesMetric'
+data_category: Optional
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
diff --git a/config/metrics/counts_all/20210915082040_projects_with_expiration_policy_enabled_with_older_than_set_to_60d.yml b/config/metrics/counts_all/20210915082040_projects_with_expiration_policy_enabled_with_older_than_set_to_60d.yml
new file mode 100644
index 00000000000..1a9fe349a90
--- /dev/null
+++ b/config/metrics/counts_all/20210915082040_projects_with_expiration_policy_enabled_with_older_than_set_to_60d.yml
@@ -0,0 +1,22 @@
+---
+data_category: optional
+key_path: counts.projects_with_expiration_policy_enabled_with_older_than_set_to_60d
+description: A count of projects with the cleanup policy set delete tags older than
+ 60 days
+product_section: ops
+product_stage: package
+product_group: group::package
+product_category: container registry
+value_type: number
+status: active
+time_frame: all
+data_source: database
+distribution:
+- ee
+- ce
+tier:
+- free
+- premium
+- ultimate
+performance_indicator_type: []
+milestone: "14.4"
diff --git a/config/metrics/counts_all/20210916200930_clusters_integrations_prometheus.yml b/config/metrics/counts_all/20210916200930_clusters_integrations_prometheus.yml
new file mode 100644
index 00000000000..2e17c5d261b
--- /dev/null
+++ b/config/metrics/counts_all/20210916200930_clusters_integrations_prometheus.yml
@@ -0,0 +1,21 @@
+---
+data_category: optional
+key_path: counts.clusters_integrations_prometheus
+description: Total clusters with Clusters::Integrations::Prometheus enabled
+product_section: ops
+product_stage: configure
+product_group: group::configure
+product_category: kubernetes_management
+value_type: number
+status: active
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+performance_indicator_type: []
+milestone: "14.4"
diff --git a/config/metrics/counts_all/20210916200931_clusters_integrations_elastic_stack.yml b/config/metrics/counts_all/20210916200931_clusters_integrations_elastic_stack.yml
new file mode 100644
index 00000000000..54437cfbf36
--- /dev/null
+++ b/config/metrics/counts_all/20210916200931_clusters_integrations_elastic_stack.yml
@@ -0,0 +1,21 @@
+---
+data_category: optional
+key_path: counts.clusters_integrations_elastic_stack
+description: Total clusters with Clusters::Integrations::ElasticStack enabled
+product_section: ops
+product_stage: configure
+product_group: group::configure
+product_category: kubernetes_management
+value_type: number
+status: active
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+performance_indicator_type: []
+milestone: "14.4"
diff --git a/config/metrics/counts_all/20210916202342_clusters_integrations_prometheus.yml b/config/metrics/counts_all/20210916202342_clusters_integrations_prometheus.yml
new file mode 100644
index 00000000000..d0baa4d0751
--- /dev/null
+++ b/config/metrics/counts_all/20210916202342_clusters_integrations_prometheus.yml
@@ -0,0 +1,21 @@
+---
+data_category: optional
+key_path: usage_activity_by_stage.monitor.clusters_integrations_prometheus
+description: Users creating clusters with Prometheus integration enabled in last 28 days.
+product_section: ops
+product_stage: monitor
+product_group: group::monitor
+product_category: metrics
+value_type: number
+status: active
+time_frame: all
+data_source: database
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+performance_indicator_type: []
+milestone: "14.4"
diff --git a/config/metrics/license/20210204124829_active_user_count.yml b/config/metrics/license/20210204124829_active_user_count.yml
index 871a75bd97b..c6e0895a918 100644
--- a/config/metrics/license/20210204124829_active_user_count.yml
+++ b/config/metrics/license/20210204124829_active_user_count.yml
@@ -10,6 +10,7 @@ status: active
milestone: "<13.9"
data_category: subscription
time_frame: none
+instrumentation_class: ActiveUserCountMetric
data_source: database
distribution:
- ce
diff --git a/config/redis.cache.yml.example b/config/redis.cache.yml.example
deleted file mode 100644
index 44d9f7e8632..00000000000
--- a/config/redis.cache.yml.example
+++ /dev/null
@@ -1,38 +0,0 @@
-# If you change this file in a merge request, please also create
-# a merge request on https://gitlab.com/gitlab-org/omnibus-gitlab/merge_requests
-#
-development:
- url: redis://localhost:6379/10
- #
- # url: redis://localhost:6380
- # sentinels:
- # -
- # host: localhost
- # port: 26380 # point to sentinel, not to redis port
- # -
- # host: replica2
- # port: 26380 # point to sentinel, not to redis port
-test:
- url: redis://localhost:6379/10
- #
- # url: redis://localhost:6380
-production:
- # Redis (single instance)
- url: unix:/var/run/redis/redis.cache.sock
- ##
- # Redis + Sentinel (for HA)
- #
- # Please read instructions carefully before using it as you may lose data:
- # http://redis.io/topics/sentinel
- #
- # You must specify a list of a few sentinels that will handle client connection
- # please read here for more information: https://docs.gitlab.com/ee/administration/redis/index.html
- ##
- # url: redis://master:6380
- # sentinels:
- # -
- # host: replica1
- # port: 26380 # point to sentinel, not to redis port
- # -
- # host: replica2
- # port: 26380 # point to sentinel, not to redis port
diff --git a/config/redis.queues.yml.example b/config/redis.queues.yml.example
deleted file mode 100644
index 4194b44cb88..00000000000
--- a/config/redis.queues.yml.example
+++ /dev/null
@@ -1,38 +0,0 @@
-# If you change this file in a merge request, please also create
-# a merge request on https://gitlab.com/gitlab-org/omnibus-gitlab/merge_requests
-#
-development:
- url: redis://localhost:6379/11
- #
- # url: redis://localhost:6381
- # sentinels:
- # -
- # host: localhost
- # port: 26381 # point to sentinel, not to redis port
- # -
- # host: replica2
- # port: 26381 # point to sentinel, not to redis port
-test:
- url: redis://localhost:6379/11
- #
- # url: redis://localhost:6381
-production:
- # Redis (single instance)
- url: unix:/var/run/redis/redis.queues.sock
- ##
- # Redis + Sentinel (for HA)
- #
- # Please read instructions carefully before using it as you may lose data:
- # http://redis.io/topics/sentinel
- #
- # You must specify a list of a few sentinels that will handle client connection
- # please read here for more information: https://docs.gitlab.com/ee/administration/redis/index.html
- ##
- # url: redis://master:6381
- # sentinels:
- # -
- # host: replica1
- # port: 26381 # point to sentinel, not to redis port
- # -
- # host: replica2
- # port: 26381 # point to sentinel, not to redis port
diff --git a/config/redis.shared_state.yml.example b/config/redis.shared_state.yml.example
deleted file mode 100644
index b3e0c7a8fa9..00000000000
--- a/config/redis.shared_state.yml.example
+++ /dev/null
@@ -1,38 +0,0 @@
-# If you change this file in a merge request, please also create
-# a merge request on https://gitlab.com/gitlab-org/omnibus-gitlab/merge_requests
-#
-development:
- url: redis://localhost:6379/12
- #
- # url: redis://localhost:6382
- # sentinels:
- # -
- # host: localhost
- # port: 26382 # point to sentinel, not to redis port
- # -
- # host: replica2
- # port: 26382 # point to sentinel, not to redis port
-test:
- url: redis://localhost:6379/12
- #
- # url: redis://localhost:6382
-production:
- # Redis (single instance)
- url: unix:/var/run/redis/redis.shared_state.sock
- ##
- # Redis + Sentinel (for HA)
- #
- # Please read instructions carefully before using it as you may lose data:
- # http://redis.io/topics/sentinel
- #
- # You must specify a list of a few sentinels that will handle client connection
- # please read here for more information: https://docs.gitlab.com/ee/administration/redis/index.html
- ##
- # url: redis://master:6382
- # sentinels:
- # -
- # host: replica1
- # port: 26382 # point to sentinel, not to redis port
- # -
- # host: replica2
- # port: 26382 # point to sentinel, not to redis port
diff --git a/config/redis.trace_chunks.yml.example b/config/redis.trace_chunks.yml.example
deleted file mode 100644
index d38b9ba4966..00000000000
--- a/config/redis.trace_chunks.yml.example
+++ /dev/null
@@ -1,38 +0,0 @@
-# If you change this file in a merge request, please also create
-# a merge request on https://gitlab.com/gitlab-org/omnibus-gitlab/merge_requests
-#
-development:
- url: redis://localhost:6379/13
- #
- # url: redis://localhost:6382
- # sentinels:
- # -
- # host: localhost
- # port: 26382 # point to sentinel, not to redis port
- # -
- # host: replica2
- # port: 26382 # point to sentinel, not to redis port
-test:
- url: redis://localhost:6379/13
- #
- # url: redis://localhost:6382
-production:
- # Redis (single instance)
- url: unix:/var/run/redis/redis.trace_chunks.sock
- ##
- # Redis + Sentinel (for HA)
- #
- # Please read instructions carefully before using it as you may lose data:
- # http://redis.io/topics/sentinel
- #
- # You must specify a list of a few sentinels that will handle client connection
- # please read here for more information: https://docs.gitlab.com/ee/administration/redis/index.html
- ##
- # url: redis://master:6382
- # sentinels:
- # -
- # host: replica1
- # port: 26382 # point to sentinel, not to redis port
- # -
- # host: replica2
- # port: 26382 # point to sentinel, not to redis port
diff --git a/config/routes.rb b/config/routes.rb
index 8f4c3886e88..01e57a01359 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -161,8 +161,6 @@ Rails.application.routes.draw do
end
end
- resource :projects
-
draw :operations
draw :jira_connect
diff --git a/config/routes/admin.rb b/config/routes/admin.rb
index e3b365ad276..dac1937b76a 100644
--- a/config/routes/admin.rb
+++ b/config/routes/admin.rb
@@ -38,14 +38,6 @@ namespace :admin do
resources :abuse_reports, only: [:index, :destroy]
resources :gitaly_servers, only: [:index]
- namespace :serverless do
- resources :domains, only: [:index, :create, :update, :destroy] do
- member do
- post '/verify', to: 'domains#verify'
- end
- end
- end
-
resources :spam_logs, only: [:index, :destroy] do
member do
post :mark_as_ham
@@ -69,6 +61,13 @@ namespace :admin do
end
end
+ resources :topics, only: [:index, :new, :create, :edit, :update] do
+ resource :avatar, controller: 'topics/avatars', only: [:destroy]
+ collection do
+ post :preview_markdown
+ end
+ end
+
resources :deploy_keys, only: [:index, :new, :create, :edit, :update, :destroy]
resources :hooks, only: [:index, :create, :edit, :update, :destroy] do
diff --git a/config/routes/group.rb b/config/routes/group.rb
index ef31b639d33..803249f8861 100644
--- a/config/routes/group.rb
+++ b/config/routes/group.rb
@@ -146,5 +146,7 @@ scope format: false do
constraints image: Gitlab::PathRegex.container_image_regex, sha: Gitlab::PathRegex.container_image_blob_sha_regex do
get 'v2/*group_id/dependency_proxy/containers/*image/manifests/*tag' => 'groups/dependency_proxy_for_containers#manifest' # rubocop:todo Cop/PutGroupRoutesUnderScope
get 'v2/*group_id/dependency_proxy/containers/*image/blobs/:sha' => 'groups/dependency_proxy_for_containers#blob' # rubocop:todo Cop/PutGroupRoutesUnderScope
+ post 'v2/*group_id/dependency_proxy/containers/*image/blobs/:sha/upload/authorize' => 'groups/dependency_proxy_for_containers#authorize_upload_blob' # rubocop:todo Cop/PutGroupRoutesUnderScope
+ post 'v2/*group_id/dependency_proxy/containers/*image/blobs/:sha/upload' => 'groups/dependency_proxy_for_containers#upload_blob' # rubocop:todo Cop/PutGroupRoutesUnderScope
end
end
diff --git a/config/routes/import.rb b/config/routes/import.rb
index 64830ef1e52..9c76c4435ff 100644
--- a/config/routes/import.rb
+++ b/config/routes/import.rb
@@ -12,6 +12,10 @@ end
namespace :import do
resources :available_namespaces, only: [:index], controller: :available_namespaces
+ namespace :url do
+ post :validate
+ end
+
resource :github, only: [:create, :new], controller: :github do
post :personal_access_token
get :status
@@ -66,6 +70,7 @@ namespace :import do
post :configure
get :status
get :realtime_changes
+ get :history
end
resource :manifest, only: [:create, :new], controller: :manifest do
diff --git a/config/routes/project.rb b/config/routes/project.rb
index cbd2f5ac839..b1be9ad2ada 100644
--- a/config/routes/project.rb
+++ b/config/routes/project.rb
@@ -298,6 +298,8 @@ constraints(::Constraints::ProjectUrlConstrainer.new) do
end
end
+ resources :cluster_agents, only: [:show], param: :name
+
concerns :clusterable
namespace :serverless do
@@ -311,6 +313,8 @@ constraints(::Constraints::ProjectUrlConstrainer.new) do
resources :terraform, only: [:index]
+ resources :google_cloud, only: [:index]
+
resources :environments, except: [:destroy] do
member do
post :stop
diff --git a/config/routes/uploads.rb b/config/routes/uploads.rb
index 71a868175a9..e2cdf8ba606 100644
--- a/config/routes/uploads.rb
+++ b/config/routes/uploads.rb
@@ -1,10 +1,10 @@
# frozen_string_literal: true
scope path: :uploads do
- # Note attachments and User/Group/Project avatars
+ # Note attachments and User/Group/Project/Topic avatars
get "-/system/:model/:mounted_as/:id/:filename",
to: "uploads#show",
- constraints: { model: /note|user|group|project/, mounted_as: /avatar|attachment/, filename: %r{[^/]+} }
+ constraints: { model: %r{note|user|group|project|projects\/topic}, mounted_as: /avatar|attachment/, filename: %r{[^/]+} }
# show uploads for models, snippets (notes) available for now
get '-/system/:model/:id/:secret/:filename',
diff --git a/config/sidekiq_queues.yml b/config/sidekiq_queues.yml
index d7c6e6031aa..56183d167be 100644
--- a/config/sidekiq_queues.yml
+++ b/config/sidekiq_queues.yml
@@ -29,6 +29,8 @@
- 1
- - analytics_code_review_metrics
- 1
+- - analytics_cycle_analytics_group_data_loader
+ - 1
- - analytics_devops_adoption_create_snapshot
- 1
- - analytics_usage_trends_counter_job
@@ -91,6 +93,10 @@
- 1
- - dependency_proxy
- 1
+- - dependency_proxy_blob
+ - 1
+- - dependency_proxy_manifest
+ - 1
- - deployment
- 3
- - design_management_copy_design_collection
@@ -273,8 +279,6 @@
- 1
- - pages_domain_verification
- 1
-- - pages_remove
- - 1
- - pages_transfer
- 1
- - pages_update_configuration
diff --git a/config/webpack.config.js b/config/webpack.config.js
index adb11548a88..e1a48ee2b41 100644
--- a/config/webpack.config.js
+++ b/config/webpack.config.js
@@ -342,6 +342,14 @@ module.exports = {
esModule: false,
},
},
+ {
+ test: /editor\/schema\/.+\.json$/,
+ type: 'javascript/auto',
+ loader: 'file-loader',
+ options: {
+ name: '[name].[contenthash:8].[ext]',
+ },
+ },
],
},
diff --git a/danger/database/Dangerfile b/danger/database/Dangerfile
index 3018196ddbc..693c03b9dad 100644
--- a/danger/database/Dangerfile
+++ b/danger/database/Dangerfile
@@ -33,7 +33,7 @@ MSG
DATABASE_APPROVED_LABEL = 'database::approved'
non_geo_db_schema_updated = !git.modified_files.grep(%r{\Adb/structure\.sql}).empty?
-geo_db_schema_updated = !git.modified_files.grep(%r{\Aee/db/geo/schema\.rb}).empty?
+geo_db_schema_updated = !git.modified_files.grep(%r{\Aee/db/geo/structure\.sql}).empty?
non_geo_migration_created = !git.added_files.grep(%r{\A(db/(post_)?migrate)/}).empty?
geo_migration_created = !git.added_files.grep(%r{\Aee/db/geo/(post_)?migrate/}).empty?
@@ -45,7 +45,7 @@ if non_geo_migration_created && !non_geo_db_schema_updated
end
if geo_migration_created && !geo_db_schema_updated
- warn format(format_str, migrations: 'Geo migrations', schema: helper.html_link("ee/db/geo/schema.rb"))
+ warn format(format_str, migrations: 'Geo migrations', schema: helper.html_link("ee/db/geo/structure.sql"))
end
return unless helper.ci?
diff --git a/danger/pajamas/Dangerfile b/danger/pajamas/Dangerfile
index a3ff1126bd1..fde12c08b35 100644
--- a/danger/pajamas/Dangerfile
+++ b/danger/pajamas/Dangerfile
@@ -59,7 +59,7 @@ MARKDOWN
if blocking_components_in_mr.any?
markdown(<<~MARKDOWN)
- These deprecated components have already been migrated and can no longer be used. Please use [Pajamas components](https://design.gitlab.com/components/status/) instead.
+ These deprecated components have already been migrated and can no longer be used. Please use [Pajamas components](https://design.gitlab.com/components/overview) instead.
* #{blocking_components_in_mr.join("\n* ")}
@@ -70,7 +70,7 @@ end
if deprecated_components_in_mr.any?
markdown(<<~MARKDOWN)
- These deprecated components are in the process of being migrated. Please consider using [Pajamas components](https://design.gitlab.com/components/status/) instead.
+ These deprecated components are in the process of being migrated. Please consider using [Pajamas components](https://design.gitlab.com/components/overview) instead.
* #{deprecated_components_in_mr.join("\n* ")}
diff --git a/danger/plugins/specs.rb b/danger/plugins/specs.rb
new file mode 100644
index 00000000000..3188785487e
--- /dev/null
+++ b/danger/plugins/specs.rb
@@ -0,0 +1,10 @@
+# frozen_string_literal: true
+
+require_relative '../../tooling/danger/specs'
+
+module Danger
+ class Specs < ::Danger::Plugin
+ # Put the helper code somewhere it can be tested
+ include Tooling::Danger::Specs
+ end
+end
diff --git a/danger/product_intelligence/Dangerfile b/danger/product_intelligence/Dangerfile
index ae58cf4588c..fd6ae76b4f1 100644
--- a/danger/product_intelligence/Dangerfile
+++ b/danger/product_intelligence/Dangerfile
@@ -5,19 +5,19 @@ CHANGED_FILES_MESSAGE = <<~MSG
For the following files, a review from the [Data team and Product Intelligence team](https://gitlab.com/groups/gitlab-org/growth/product-intelligence/engineers/-/group_members?with_inherited_permissions=exclude) is recommended
Please check the ~"product intelligence" [guide](https://docs.gitlab.com/ee/development/usage_ping.html).
+For MR review guidelines, see the [Service Ping review guidelines](https://docs.gitlab.com/ee/development/usage_ping/review_guidelines.html) or the [Snowplow review guidelines](https://docs.gitlab.com/ee/development/snowplow/review_guidelines.html).
%<changed_files>s
MSG
-# exit if not matching files
+# exit if not matching files or if no product intelligence labels
matching_changed_files = product_intelligence.matching_changed_files
-return unless matching_changed_files.any?
+labels = product_intelligence.missing_labels
-warn format(CHANGED_FILES_MESSAGE, changed_files: helper.markdown_list(matching_changed_files))
+return if matching_changed_files.empty? || labels.empty?
-labels = product_intelligence.missing_labels
-return unless labels.any?
+warn format(CHANGED_FILES_MESSAGE, changed_files: helper.markdown_list(matching_changed_files))
gitlab.api.update_merge_request(gitlab.mr_json['project_id'],
gitlab.mr_json['iid'],
diff --git a/danger/roulette/Dangerfile b/danger/roulette/Dangerfile
index cd23028a379..54b46807241 100644
--- a/danger/roulette/Dangerfile
+++ b/danger/roulette/Dangerfile
@@ -99,6 +99,9 @@ categories << :database if helper.mr_labels.include?('database')
# Ensure to spin for Product Intelligence reviewer when ~"product intelligence::review pending" is applied
categories << :product_intelligence if helper.mr_labels.include?("product intelligence::review pending")
+# Skip Product intelligence reviews for growth experiment MRs
+categories.delete(:product_intelligence) unless helper.mr_labels.include?("growth experiment")
+
if changes.any?
project = project_helper.project_name
diff --git a/danger/specs/Dangerfile b/danger/specs/Dangerfile
index 35476ae645d..117eaf61062 100644
--- a/danger/specs/Dangerfile
+++ b/danger/specs/Dangerfile
@@ -20,7 +20,7 @@ Please make sure the spec files pass in AS-IF-FOSS mode either:
1. Locally with `FOSS_ONLY=1 bin/rspec -- %<spec_files>s`.
1. In the MR pipeline by verifying that the `rspec foss-impact` job has passed.
-1. In the MR pipelines by including `RUN AS-IF-FOSS` in the MR title (you can do it with the ``/title %<mr_title>s [RUN AS-IF-FOSS]`` quick action) and start a new MR pipeline.
+1. In the MR pipelines by setting the ~"pipeline:run-as-if-foss" label on the MR (you can do it with the `/label ~"pipeline:run-as-if-foss"` quick action) and start a new MR pipeline.
MSG
@@ -32,11 +32,12 @@ request specs (and/or feature specs). Please add request specs under
See https://gitlab.com/groups/gitlab-org/-/epics/5076 for information.
MSG
-has_app_changes = helper.all_changed_files.grep(%r{\A(app|lib|db/(geo/)?(post_)?migrate)/}).any?
-has_ee_app_changes = helper.all_changed_files.grep(%r{\Aee/(app|lib|db/(geo/)?(post_)?migrate)/}).any?
-spec_changes = helper.all_changed_files.grep(%r{\Aspec/})
+all_changed_files = helper.all_changed_files
+has_app_changes = all_changed_files.grep(%r{\A(app|lib|db/(geo/)?(post_)?migrate)/}).any?
+has_ee_app_changes = all_changed_files.grep(%r{\Aee/(app|lib|db/(geo/)?(post_)?migrate)/}).any?
+spec_changes = specs.changed_specs_files(ee: :exclude)
has_spec_changes = spec_changes.any?
-has_ee_spec_changes = helper.all_changed_files.grep(%r{\Aee/spec/}).any?
+has_ee_spec_changes = specs.changed_specs_files(ee: :only).any?
new_specs_needed = (gitlab.mr_labels & NO_SPECS_LABELS).empty?
if (has_app_changes || has_ee_app_changes) && !(has_spec_changes || has_ee_spec_changes) && new_specs_needed
@@ -45,10 +46,14 @@ end
# The only changes outside `ee/` are in `spec/`
if has_ee_app_changes && has_spec_changes && !(has_app_changes || has_ee_spec_changes)
- warn format(EE_CHANGE_WITH_FOSS_SPEC_CHANGE_MESSAGE, spec_files: spec_changes.join(" "), mr_title: gitlab.mr_json['title']), sticky: false
+ warn format(EE_CHANGE_WITH_FOSS_SPEC_CHANGE_MESSAGE, spec_files: spec_changes.join(" ")), sticky: false
end
# Forbidding a new file addition under `/spec/controllers` or `/ee/spec/controllers`
-if git.added_files.grep(%r{^(ee/)?spec/controllers/}).any?
+if project_helper.changes.added.files.grep(%r{^(ee/)?spec/controllers/}).any?
warn CONTROLLER_SPEC_DEPRECATION_MESSAGE
end
+
+specs.changed_specs_files.each do |filename|
+ specs.add_suggestions_for_match_with_array(filename)
+end
diff --git a/data/deprecations/14-0-nfs-fot-git-repository-storage.yml b/data/deprecations/14-0-nfs-fot-git-repository-storage.yml
new file mode 100644
index 00000000000..f38742439aa
--- /dev/null
+++ b/data/deprecations/14-0-nfs-fot-git-repository-storage.yml
@@ -0,0 +1,22 @@
+- name: "NFS for Git repository storage deprecated" # 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.2" # The milestone when this feature is planned to be removed
+ 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 in GitLab 15.0. Please see our official [Statement of Support](https://about.gitlab.com/support/statement-of-support.html#gitaly-and-nfs) for further information.
+
+ Gitaly Cluster offers tremendous benefits for our customers such as:
+
+ - [Variable replication factors](https://docs.gitlab.com/ee/administration/gitaly/index.html#replication-factor).
+ - [Strong consistency](https://docs.gitlab.com/ee/administration/gitaly/index.html#strong-consistency).
+ - [Distributed read capabilities](https://docs.gitlab.com/ee/administration/gitaly/index.html#distributed-reads).
+
+ We encourage customers currently using NFS for Git repositories to plan their migration by reviewing our documentation on [migrating to Gitaly Cluster](https://docs.gitlab.com/ee/administration/gitaly/index.html#migrate-to-gitaly-cluster).
+
+ stage: # (optional - may be required in the future) String value of the stage that the feature was created in. e.g., Growth
+ tiers: # (optional - may be required in the future) An array of tiers that the feature is available in currently. e.g., [Free, Silver, Gold, Core, Premium, Ultimate]
+ issue_url: # (optional) This is a link to the deprecation issue in GitLab
+ documentation_url: # (optional) This is a link to the current documentation page
+ image_url: # (optional) This is a link to a thumbnail image depicting the feature
+ video_url: # (optional) Use the youtube thumbnail URL with the structure of https://img.youtube.com/vi/UNIQUEID/hqdefault.jpg
+ removal_date: "2022-06-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
diff --git a/data/deprecations/14-2-deprecation-task-runner.yml b/data/deprecations/14-2-deprecation-task-runner.yml
new file mode 100644
index 00000000000..4d01a1969ad
--- /dev/null
+++ b/data/deprecations/14-2-deprecation-task-runner.yml
@@ -0,0 +1,16 @@
+- name: "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.4" # The milestone when this feature is planned to be removed
+ 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).
+
+ This will result in the rename of the sub-chart: `gitlab/task-runner` to `gitlab/toolbox`. Resulting pods will be named along the lines of `{{ .Release.Name }}-toolbox`, which will often be `gitlab-toolbox`. They will be locatable with the label `app=toolbox`.
+
+ stage: # (optional - may be required in the future) String value of the stage that the feature was created in. e.g., Growth
+ tiers: # (optional - may be required in the future) An array of tiers that the feature is available in currently. e.g., [Free, Silver, Gold, Core, Premium, Ultimate]
+ issue_url: # (optional) This is a link to the deprecation issue in GitLab
+ documentation_url: # (optional) This is a link to the current documentation page
+ image_url: # (optional) This is a link to a thumbnail image depicting the feature
+ video_url: # (optional) Use the youtube thumbnail URL with the structure of https://img.youtube.com/vi/UNIQUEID/hqdefault.jpg
+ removal_date: "2021-10-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
diff --git a/data/deprecations/14-3-deprecation-release-cli.yml b/data/deprecations/14-3-deprecation-release-cli.yml
new file mode 100644
index 00000000000..4273d00fc73
--- /dev/null
+++ b/data/deprecations/14-3-deprecation-release-cli.yml
@@ -0,0 +1,13 @@
+- name: "Release CLI be 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
+ 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.
+ stage: # (optional - may be required in the future) String value of the stage that the feature was created in. e.g., Growth
+ tiers: # (optional - may be required in the future) An array of tiers that the feature is available in currently. e.g., [Free, Silver, Gold, Core, Premium, Ultimate]
+ issue_url: # (optional) This is a link to the deprecation issue in GitLab
+ documentation_url: # (optional) This is a link to the current documentation page
+ image_url: # (optional) This is a link to a thumbnail image depicting the feature
+ video_url: # (optional) Use the youtube thumbnail URL with the structure of https://img.youtube.com/vi/UNIQUEID/hqdefault.jpg
+ removal_date: "2021-12-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
diff --git a/data/deprecations/14-3-repository-push-audit-events.yml b/data/deprecations/14-3-repository-push-audit-events.yml
index 3a39c1f4304..4bca8751db4 100644
--- a/data/deprecations/14-3-repository-push-audit-events.yml
+++ b/data/deprecations/14-3-repository-push-audit-events.yml
@@ -11,4 +11,4 @@
tiers: Premium
issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/337993
documentation_url: https://docs.gitlab.com/ee/administration/audit_events.html#repository-push
- announcement_date: "2021-09-02" # https://gitlab.com/gitlab-org/gitlab/-/merge_requests/69024
+ announcement_date: "2021-09-22" # https://gitlab.com/gitlab-org/gitlab/-/merge_requests/69024
diff --git a/data/deprecations/distribution_deprecations_14-3.yml b/data/deprecations/distribution_deprecations_14-3.yml
deleted file mode 100644
index 05263383151..00000000000
--- a/data/deprecations/distribution_deprecations_14-3.yml
+++ /dev/null
@@ -1,8 +0,0 @@
-- name: "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-09-22"
- removal_milestone: "14.4" # the milestone when this feature is planned to be removed
- 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).
-
- This will result in the rename of the sub-chart: `gitlab/task-runner` to `gitlab/toolbox`. Resulting pods will be named along the lines of `{{ .Release.Name }}-toolbox`, which will often be `gitlab-toolbox`. They will be locatable with the label `app=toolbox`.
diff --git a/data/deprecations/templates/_deprecation_template.md.erb b/data/deprecations/templates/_deprecation_template.md.erb
index 64bd6a75a5e..a037151c6ac 100644
--- a/data/deprecations/templates/_deprecation_template.md.erb
+++ b/data/deprecations/templates/_deprecation_template.md.erb
@@ -6,6 +6,16 @@ info: "See the Technical Writers assigned to Development Guidelines: https://abo
# Deprecated feature removal schedule
+DISCLAIMER:
+This page contains information related to upcoming products, features, and functionality.
+It is important to note that the information presented is for informational purposes only.
+Please do not rely on this information for purchasing or planning purposes.
+As with all projects, the items mentioned on this page are subject to change or delay.
+The development, release, and timing of any products, features, or functionality remain at the
+sole discretion of GitLab Inc.
+
+<!-- vale off -->
+
<!--
This page is automatically generated from the YAML files in `/data/deprecations` by the rake task
located at `lib/tasks/gitlab/docs/compile_deprecations.rake`.
diff --git a/data/deprecations/templates/example.yml b/data/deprecations/templates/example.yml
index f665dd21530..a11a6800a74 100644
--- a/data/deprecations/templates/example.yml
+++ b/data/deprecations/templates/example.yml
@@ -12,7 +12,7 @@
- name: "Feature name" # The name of the feature to be deprecated
announcement_milestone: "XX.YY" # The milestone when this feature was first announced as deprecated.
- announcement_date: "YYYY-MM-DD" # The date of the milestone release when this feature was first announced as deprecated
+ announcement_date: "YYYY-MM-DD" # The date of the milestone release when this feature was first announced as deprecated. This should almost always be the 22nd of a month (YYYY-MM-22), unless you did an out of band blog post.
removal_milestone: "XX.YY" # The milestone when this feature is planned to be removed
body: | # Do not modify this line, instead modify the lines below.
<!-- START OF BODY COMMENT
@@ -30,4 +30,4 @@
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: # (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
+ removal_date: # (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/db/init_structure.sql b/db/init_structure.sql
new file mode 100644
index 00000000000..e2048e436ed
--- /dev/null
+++ b/db/init_structure.sql
@@ -0,0 +1,11226 @@
+CREATE EXTENSION IF NOT EXISTS pg_trgm;
+
+CREATE TABLE abuse_reports (
+ id integer NOT NULL,
+ reporter_id integer,
+ user_id integer,
+ message text,
+ created_at timestamp without time zone,
+ updated_at timestamp without time zone,
+ message_html text,
+ cached_markdown_version integer
+);
+
+CREATE SEQUENCE abuse_reports_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE abuse_reports_id_seq OWNED BY abuse_reports.id;
+
+CREATE TABLE alerts_service_data (
+ id bigint NOT NULL,
+ service_id integer NOT NULL,
+ created_at timestamp with time zone NOT NULL,
+ updated_at timestamp with time zone NOT NULL,
+ encrypted_token character varying(255),
+ encrypted_token_iv character varying(255)
+);
+
+CREATE SEQUENCE alerts_service_data_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE alerts_service_data_id_seq OWNED BY alerts_service_data.id;
+
+CREATE TABLE allowed_email_domains (
+ id bigint NOT NULL,
+ created_at timestamp with time zone NOT NULL,
+ updated_at timestamp with time zone NOT NULL,
+ group_id integer NOT NULL,
+ domain character varying(255) NOT NULL
+);
+
+CREATE SEQUENCE allowed_email_domains_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE allowed_email_domains_id_seq OWNED BY allowed_email_domains.id;
+
+CREATE TABLE analytics_cycle_analytics_group_stages (
+ id bigint NOT NULL,
+ created_at timestamp with time zone NOT NULL,
+ updated_at timestamp with time zone NOT NULL,
+ relative_position integer,
+ start_event_identifier integer NOT NULL,
+ end_event_identifier integer NOT NULL,
+ group_id bigint NOT NULL,
+ start_event_label_id bigint,
+ end_event_label_id bigint,
+ hidden boolean DEFAULT false NOT NULL,
+ custom boolean DEFAULT true NOT NULL,
+ name character varying(255) NOT NULL
+);
+
+CREATE SEQUENCE analytics_cycle_analytics_group_stages_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE analytics_cycle_analytics_group_stages_id_seq OWNED BY analytics_cycle_analytics_group_stages.id;
+
+CREATE TABLE analytics_cycle_analytics_project_stages (
+ id bigint NOT NULL,
+ created_at timestamp with time zone NOT NULL,
+ updated_at timestamp with time zone NOT NULL,
+ relative_position integer,
+ start_event_identifier integer NOT NULL,
+ end_event_identifier integer NOT NULL,
+ project_id bigint NOT NULL,
+ start_event_label_id bigint,
+ end_event_label_id bigint,
+ hidden boolean DEFAULT false NOT NULL,
+ custom boolean DEFAULT true NOT NULL,
+ name character varying(255) NOT NULL
+);
+
+CREATE SEQUENCE analytics_cycle_analytics_project_stages_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE analytics_cycle_analytics_project_stages_id_seq OWNED BY analytics_cycle_analytics_project_stages.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
+);
+
+CREATE TABLE analytics_repository_file_commits (
+ id bigint NOT NULL,
+ analytics_repository_file_id bigint NOT NULL,
+ project_id bigint NOT NULL,
+ committed_date date NOT NULL,
+ commit_count smallint NOT NULL
+);
+
+CREATE SEQUENCE analytics_repository_file_commits_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE analytics_repository_file_commits_id_seq OWNED BY analytics_repository_file_commits.id;
+
+CREATE TABLE analytics_repository_file_edits (
+ id bigint NOT NULL,
+ project_id bigint NOT NULL,
+ analytics_repository_file_id bigint NOT NULL,
+ committed_date date NOT NULL,
+ num_edits integer DEFAULT 0 NOT NULL
+);
+
+CREATE SEQUENCE analytics_repository_file_edits_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE analytics_repository_file_edits_id_seq OWNED BY analytics_repository_file_edits.id;
+
+CREATE TABLE analytics_repository_files (
+ id bigint NOT NULL,
+ project_id bigint NOT NULL,
+ file_path character varying(4096) NOT NULL
+);
+
+CREATE SEQUENCE analytics_repository_files_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE analytics_repository_files_id_seq OWNED BY analytics_repository_files.id;
+
+CREATE TABLE appearances (
+ id integer NOT NULL,
+ title character varying NOT NULL,
+ description text NOT NULL,
+ header_logo character varying,
+ logo character varying,
+ created_at timestamp with time zone NOT NULL,
+ updated_at timestamp with time zone NOT NULL,
+ description_html text,
+ cached_markdown_version integer,
+ favicon character varying,
+ new_project_guidelines text,
+ new_project_guidelines_html text,
+ header_message text,
+ header_message_html text,
+ footer_message text,
+ footer_message_html text,
+ message_background_color text,
+ message_font_color text,
+ email_header_and_footer_enabled boolean DEFAULT false NOT NULL,
+ updated_by integer
+);
+
+CREATE SEQUENCE appearances_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE appearances_id_seq OWNED BY appearances.id;
+
+CREATE TABLE application_setting_terms (
+ id integer NOT NULL,
+ cached_markdown_version integer,
+ terms text NOT NULL,
+ terms_html text
+);
+
+CREATE SEQUENCE application_setting_terms_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE application_setting_terms_id_seq OWNED BY application_setting_terms.id;
+
+CREATE TABLE application_settings (
+ id integer NOT NULL,
+ default_projects_limit integer,
+ signup_enabled boolean,
+ gravatar_enabled boolean,
+ sign_in_text text,
+ created_at timestamp without time zone,
+ updated_at timestamp without time zone,
+ home_page_url character varying,
+ default_branch_protection integer DEFAULT 2,
+ restricted_visibility_levels text,
+ version_check_enabled boolean DEFAULT true,
+ max_attachment_size integer DEFAULT 10 NOT NULL,
+ default_project_visibility integer DEFAULT 0 NOT NULL,
+ default_snippet_visibility integer DEFAULT 0 NOT NULL,
+ domain_whitelist text,
+ user_oauth_applications boolean DEFAULT true,
+ after_sign_out_path character varying,
+ session_expire_delay integer DEFAULT 10080 NOT NULL,
+ import_sources text,
+ help_page_text text,
+ admin_notification_email character varying,
+ shared_runners_enabled boolean DEFAULT true NOT NULL,
+ max_artifacts_size integer DEFAULT 100 NOT NULL,
+ runners_registration_token character varying,
+ max_pages_size integer DEFAULT 100 NOT NULL,
+ require_two_factor_authentication boolean DEFAULT false,
+ two_factor_grace_period integer DEFAULT 48,
+ metrics_enabled boolean DEFAULT false,
+ metrics_host character varying DEFAULT 'localhost'::character varying,
+ metrics_pool_size integer DEFAULT 16,
+ metrics_timeout integer DEFAULT 10,
+ metrics_method_call_threshold integer DEFAULT 10,
+ recaptcha_enabled boolean DEFAULT false,
+ metrics_port integer DEFAULT 8089,
+ akismet_enabled boolean DEFAULT false,
+ metrics_sample_interval integer DEFAULT 15,
+ email_author_in_body boolean DEFAULT false,
+ default_group_visibility integer,
+ repository_checks_enabled boolean DEFAULT false,
+ shared_runners_text text,
+ metrics_packet_size integer DEFAULT 1,
+ disabled_oauth_sign_in_sources text,
+ health_check_access_token character varying,
+ send_user_confirmation_email boolean DEFAULT false,
+ container_registry_token_expire_delay integer DEFAULT 5,
+ after_sign_up_text text,
+ user_default_external boolean DEFAULT false NOT NULL,
+ repository_storages character varying DEFAULT 'default'::character varying,
+ enabled_git_access_protocol character varying,
+ domain_blacklist_enabled boolean DEFAULT false,
+ domain_blacklist text,
+ usage_ping_enabled boolean DEFAULT true NOT NULL,
+ sign_in_text_html text,
+ help_page_text_html text,
+ shared_runners_text_html text,
+ after_sign_up_text_html text,
+ rsa_key_restriction integer DEFAULT 0 NOT NULL,
+ dsa_key_restriction integer DEFAULT '-1'::integer NOT NULL,
+ ecdsa_key_restriction integer DEFAULT 0 NOT NULL,
+ ed25519_key_restriction integer DEFAULT 0 NOT NULL,
+ housekeeping_enabled boolean DEFAULT true NOT NULL,
+ housekeeping_bitmaps_enabled boolean DEFAULT true NOT NULL,
+ housekeeping_incremental_repack_period integer DEFAULT 10 NOT NULL,
+ housekeeping_full_repack_period integer DEFAULT 50 NOT NULL,
+ housekeeping_gc_period integer DEFAULT 200 NOT NULL,
+ html_emails_enabled boolean DEFAULT true,
+ plantuml_url character varying,
+ plantuml_enabled boolean,
+ terminal_max_session_time integer DEFAULT 0 NOT NULL,
+ unique_ips_limit_per_user integer,
+ unique_ips_limit_time_window integer,
+ unique_ips_limit_enabled boolean DEFAULT false NOT NULL,
+ default_artifacts_expire_in character varying DEFAULT '0'::character varying NOT NULL,
+ uuid character varying,
+ polling_interval_multiplier numeric DEFAULT 1.0 NOT NULL,
+ cached_markdown_version integer,
+ prometheus_metrics_enabled boolean DEFAULT true NOT NULL,
+ authorized_keys_enabled boolean DEFAULT true NOT NULL,
+ help_page_hide_commercial_content boolean DEFAULT false,
+ help_page_support_url character varying,
+ performance_bar_allowed_group_id integer,
+ hashed_storage_enabled boolean DEFAULT true NOT NULL,
+ project_export_enabled boolean DEFAULT true NOT NULL,
+ auto_devops_enabled boolean DEFAULT true NOT NULL,
+ throttle_unauthenticated_enabled boolean DEFAULT false NOT NULL,
+ throttle_unauthenticated_requests_per_period integer DEFAULT 3600 NOT NULL,
+ throttle_unauthenticated_period_in_seconds integer DEFAULT 3600 NOT NULL,
+ throttle_authenticated_api_enabled boolean DEFAULT false NOT NULL,
+ throttle_authenticated_api_requests_per_period integer DEFAULT 7200 NOT NULL,
+ throttle_authenticated_api_period_in_seconds integer DEFAULT 3600 NOT NULL,
+ throttle_authenticated_web_enabled boolean DEFAULT false NOT NULL,
+ throttle_authenticated_web_requests_per_period integer DEFAULT 7200 NOT NULL,
+ throttle_authenticated_web_period_in_seconds integer DEFAULT 3600 NOT NULL,
+ gitaly_timeout_default integer DEFAULT 55 NOT NULL,
+ gitaly_timeout_medium integer DEFAULT 30 NOT NULL,
+ gitaly_timeout_fast integer DEFAULT 10 NOT NULL,
+ password_authentication_enabled_for_web boolean,
+ password_authentication_enabled_for_git boolean DEFAULT true NOT NULL,
+ external_authorization_service_enabled boolean DEFAULT false NOT NULL,
+ external_authorization_service_url character varying,
+ external_authorization_service_default_label character varying,
+ default_project_creation integer DEFAULT 2 NOT NULL,
+ auto_devops_domain character varying,
+ pages_domain_verification_enabled boolean DEFAULT true NOT NULL,
+ user_default_internal_regex character varying,
+ external_authorization_service_timeout double precision DEFAULT 0.5,
+ external_auth_client_cert text,
+ encrypted_external_auth_client_key text,
+ encrypted_external_auth_client_key_iv character varying,
+ encrypted_external_auth_client_key_pass character varying,
+ encrypted_external_auth_client_key_pass_iv character varying,
+ enforce_terms boolean DEFAULT false,
+ mirror_available boolean DEFAULT true NOT NULL,
+ hide_third_party_offers boolean DEFAULT false NOT NULL,
+ instance_statistics_visibility_private boolean DEFAULT false NOT NULL,
+ receive_max_input_size integer,
+ web_ide_clientside_preview_enabled boolean DEFAULT false NOT NULL,
+ user_show_add_ssh_key_message boolean DEFAULT true NOT NULL,
+ outbound_local_requests_whitelist character varying(255)[] DEFAULT '{}'::character varying[] NOT NULL,
+ usage_stats_set_by_user_id integer,
+ diff_max_patch_bytes integer DEFAULT 102400 NOT NULL,
+ archive_builds_in_seconds integer,
+ commit_email_hostname character varying,
+ first_day_of_week integer DEFAULT 0 NOT NULL,
+ protected_ci_variables boolean DEFAULT false NOT NULL,
+ runners_registration_token_encrypted character varying,
+ local_markdown_version integer DEFAULT 0 NOT NULL,
+ asset_proxy_enabled boolean DEFAULT false NOT NULL,
+ asset_proxy_url character varying,
+ asset_proxy_whitelist text,
+ encrypted_asset_proxy_secret_key text,
+ encrypted_asset_proxy_secret_key_iv character varying,
+ lets_encrypt_notification_email character varying,
+ lets_encrypt_terms_of_service_accepted boolean DEFAULT false NOT NULL,
+ help_text text,
+ elasticsearch_indexing boolean DEFAULT false NOT NULL,
+ elasticsearch_search boolean DEFAULT false NOT NULL,
+ shared_runners_minutes integer DEFAULT 0 NOT NULL,
+ repository_size_limit bigint DEFAULT 0,
+ elasticsearch_url character varying DEFAULT 'http://localhost:9200'::character varying,
+ elasticsearch_aws boolean DEFAULT false NOT NULL,
+ elasticsearch_aws_region character varying DEFAULT 'us-east-1'::character varying,
+ elasticsearch_aws_access_key character varying,
+ geo_status_timeout integer DEFAULT 10,
+ elasticsearch_experimental_indexer boolean,
+ check_namespace_plan boolean DEFAULT false NOT NULL,
+ mirror_max_delay integer DEFAULT 300 NOT NULL,
+ mirror_max_capacity integer DEFAULT 100 NOT NULL,
+ mirror_capacity_threshold integer DEFAULT 50 NOT NULL,
+ slack_app_enabled boolean DEFAULT false,
+ slack_app_id character varying,
+ allow_group_owners_to_manage_ldap boolean DEFAULT true NOT NULL,
+ email_additional_text character varying,
+ file_template_project_id integer,
+ pseudonymizer_enabled boolean DEFAULT false NOT NULL,
+ snowplow_enabled boolean DEFAULT false NOT NULL,
+ snowplow_cookie_domain character varying,
+ custom_project_templates_group_id integer,
+ elasticsearch_limit_indexing boolean DEFAULT false NOT NULL,
+ geo_node_allowed_ips character varying DEFAULT '0.0.0.0/0, ::/0'::character varying,
+ elasticsearch_shards integer DEFAULT 5 NOT NULL,
+ elasticsearch_replicas integer DEFAULT 1 NOT NULL,
+ encrypted_lets_encrypt_private_key text,
+ encrypted_lets_encrypt_private_key_iv text,
+ required_instance_ci_template character varying,
+ dns_rebinding_protection_enabled boolean DEFAULT true NOT NULL,
+ lock_memberships_to_ldap boolean DEFAULT false NOT NULL,
+ default_project_deletion_protection boolean DEFAULT false NOT NULL,
+ time_tracking_limit_to_hours boolean DEFAULT false NOT NULL,
+ grafana_enabled boolean DEFAULT false NOT NULL,
+ grafana_url character varying DEFAULT '/-/grafana'::character varying NOT NULL,
+ raw_blob_request_limit integer DEFAULT 300 NOT NULL,
+ login_recaptcha_protection_enabled boolean DEFAULT false NOT NULL,
+ static_objects_external_storage_url character varying(255),
+ static_objects_external_storage_auth_token character varying(255),
+ instance_administration_project_id bigint,
+ allow_local_requests_from_web_hooks_and_services boolean DEFAULT false,
+ allow_local_requests_from_system_hooks boolean DEFAULT true NOT NULL,
+ throttle_protected_paths_enabled boolean DEFAULT false NOT NULL,
+ throttle_protected_paths_requests_per_period integer DEFAULT 10 NOT NULL,
+ throttle_protected_paths_period_in_seconds integer DEFAULT 60 NOT NULL,
+ protected_paths character varying(255)[] DEFAULT '{/users/password,/users/sign_in,/api/v3/session.json,/api/v3/session,/api/v4/session.json,/api/v4/session,/users,/users/confirmation,/unsubscribes/,/import/github/personal_access_token,/admin/session}'::character varying[],
+ snowplow_collector_hostname character varying,
+ sourcegraph_enabled boolean DEFAULT false NOT NULL,
+ sourcegraph_url character varying(255),
+ max_personal_access_token_lifetime integer,
+ throttle_incident_management_notification_enabled boolean DEFAULT false NOT NULL,
+ throttle_incident_management_notification_period_in_seconds integer DEFAULT 3600,
+ throttle_incident_management_notification_per_period integer DEFAULT 3600,
+ push_event_hooks_limit integer DEFAULT 3 NOT NULL,
+ productivity_analytics_start_date timestamp with time zone,
+ push_event_activities_limit integer DEFAULT 3 NOT NULL,
+ custom_http_clone_url_root character varying(511),
+ snowplow_iglu_registry_url character varying(255),
+ deletion_adjourned_period integer DEFAULT 7 NOT NULL,
+ snowplow_app_id character varying,
+ eks_integration_enabled boolean DEFAULT false NOT NULL,
+ eks_account_id character varying(128),
+ eks_access_key_id character varying(128),
+ encrypted_eks_secret_access_key_iv character varying(255),
+ encrypted_eks_secret_access_key text,
+ license_trial_ends_on date,
+ sourcegraph_public_only boolean DEFAULT true NOT NULL,
+ default_ci_config_path character varying(255),
+ snippet_size_limit bigint DEFAULT 52428800 NOT NULL,
+ encrypted_akismet_api_key text,
+ encrypted_akismet_api_key_iv character varying(255),
+ encrypted_elasticsearch_aws_secret_access_key text,
+ encrypted_elasticsearch_aws_secret_access_key_iv character varying(255),
+ encrypted_recaptcha_private_key text,
+ encrypted_recaptcha_private_key_iv character varying(255),
+ encrypted_recaptcha_site_key text,
+ encrypted_recaptcha_site_key_iv character varying(255),
+ encrypted_slack_app_secret text,
+ encrypted_slack_app_secret_iv character varying(255),
+ encrypted_slack_app_verification_token text,
+ encrypted_slack_app_verification_token_iv character varying(255),
+ minimum_password_length integer DEFAULT 8 NOT NULL,
+ updating_name_disabled_for_users boolean DEFAULT false NOT NULL,
+ force_pages_access_control boolean DEFAULT false NOT NULL,
+ CONSTRAINT check_b4f67a6296 CHECK ((allow_local_requests_from_web_hooks_and_services IS NOT NULL))
+);
+
+CREATE SEQUENCE application_settings_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE application_settings_id_seq OWNED BY application_settings.id;
+
+CREATE TABLE approval_merge_request_rule_sources (
+ id bigint NOT NULL,
+ approval_merge_request_rule_id bigint NOT NULL,
+ approval_project_rule_id bigint NOT NULL
+);
+
+CREATE SEQUENCE approval_merge_request_rule_sources_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE approval_merge_request_rule_sources_id_seq OWNED BY approval_merge_request_rule_sources.id;
+
+CREATE TABLE approval_merge_request_rules (
+ id bigint NOT NULL,
+ created_at timestamp with time zone NOT NULL,
+ updated_at timestamp with time zone NOT NULL,
+ merge_request_id integer NOT NULL,
+ approvals_required smallint DEFAULT 0 NOT NULL,
+ code_owner boolean DEFAULT false NOT NULL,
+ name character varying NOT NULL,
+ rule_type smallint DEFAULT 1 NOT NULL,
+ report_type smallint
+);
+
+CREATE TABLE approval_merge_request_rules_approved_approvers (
+ id bigint NOT NULL,
+ approval_merge_request_rule_id bigint NOT NULL,
+ user_id integer NOT NULL
+);
+
+CREATE SEQUENCE approval_merge_request_rules_approved_approvers_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE approval_merge_request_rules_approved_approvers_id_seq OWNED BY approval_merge_request_rules_approved_approvers.id;
+
+CREATE TABLE approval_merge_request_rules_groups (
+ id bigint NOT NULL,
+ approval_merge_request_rule_id bigint NOT NULL,
+ group_id integer NOT NULL
+);
+
+CREATE SEQUENCE approval_merge_request_rules_groups_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE approval_merge_request_rules_groups_id_seq OWNED BY approval_merge_request_rules_groups.id;
+
+CREATE SEQUENCE approval_merge_request_rules_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE approval_merge_request_rules_id_seq OWNED BY approval_merge_request_rules.id;
+
+CREATE TABLE approval_merge_request_rules_users (
+ id bigint NOT NULL,
+ approval_merge_request_rule_id bigint NOT NULL,
+ user_id integer NOT NULL
+);
+
+CREATE SEQUENCE approval_merge_request_rules_users_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE approval_merge_request_rules_users_id_seq OWNED BY approval_merge_request_rules_users.id;
+
+CREATE TABLE approval_project_rules (
+ id bigint NOT NULL,
+ created_at timestamp with time zone NOT NULL,
+ updated_at timestamp with time zone NOT NULL,
+ project_id integer NOT NULL,
+ approvals_required smallint DEFAULT 0 NOT NULL,
+ name character varying NOT NULL,
+ rule_type smallint DEFAULT 0 NOT NULL
+);
+
+CREATE TABLE approval_project_rules_groups (
+ id bigint NOT NULL,
+ approval_project_rule_id bigint NOT NULL,
+ group_id integer NOT NULL
+);
+
+CREATE SEQUENCE approval_project_rules_groups_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE approval_project_rules_groups_id_seq OWNED BY approval_project_rules_groups.id;
+
+CREATE SEQUENCE approval_project_rules_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE approval_project_rules_id_seq OWNED BY approval_project_rules.id;
+
+CREATE TABLE approval_project_rules_users (
+ id bigint NOT NULL,
+ approval_project_rule_id bigint NOT NULL,
+ user_id integer NOT NULL
+);
+
+CREATE SEQUENCE approval_project_rules_users_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE approval_project_rules_users_id_seq OWNED BY approval_project_rules_users.id;
+
+CREATE TABLE approvals (
+ id integer NOT NULL,
+ merge_request_id integer NOT NULL,
+ user_id integer NOT NULL,
+ created_at timestamp without time zone,
+ updated_at timestamp without time zone
+);
+
+CREATE SEQUENCE approvals_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE approvals_id_seq OWNED BY approvals.id;
+
+CREATE TABLE approver_groups (
+ id integer NOT NULL,
+ target_id integer NOT NULL,
+ target_type character varying NOT NULL,
+ group_id integer NOT NULL,
+ created_at timestamp without time zone,
+ updated_at timestamp without time zone
+);
+
+CREATE SEQUENCE approver_groups_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE approver_groups_id_seq OWNED BY approver_groups.id;
+
+CREATE TABLE approvers (
+ id integer NOT NULL,
+ target_id integer NOT NULL,
+ target_type character varying,
+ user_id integer NOT NULL,
+ created_at timestamp without time zone,
+ updated_at timestamp without time zone
+);
+
+CREATE SEQUENCE approvers_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE approvers_id_seq OWNED BY approvers.id;
+
+CREATE TABLE audit_events (
+ id integer NOT NULL,
+ author_id integer NOT NULL,
+ type character varying NOT NULL,
+ entity_id integer NOT NULL,
+ entity_type character varying NOT NULL,
+ details text,
+ created_at timestamp without time zone,
+ updated_at timestamp without time zone
+);
+
+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 award_emoji (
+ id integer NOT NULL,
+ name character varying,
+ user_id integer,
+ awardable_type character varying,
+ awardable_id integer,
+ created_at timestamp without time zone,
+ updated_at timestamp without time zone
+);
+
+CREATE SEQUENCE award_emoji_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE award_emoji_id_seq OWNED BY award_emoji.id;
+
+CREATE TABLE aws_roles (
+ user_id integer NOT NULL,
+ created_at timestamp with time zone NOT NULL,
+ updated_at timestamp with time zone NOT NULL,
+ role_arn character varying(2048) NOT NULL,
+ role_external_id character varying(64) NOT NULL
+);
+
+CREATE TABLE badges (
+ id integer NOT NULL,
+ link_url character varying NOT NULL,
+ image_url character varying NOT NULL,
+ project_id integer,
+ group_id integer,
+ type character varying NOT NULL,
+ created_at timestamp with time zone NOT NULL,
+ updated_at timestamp with time zone NOT NULL,
+ name character varying(255)
+);
+
+CREATE SEQUENCE badges_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE badges_id_seq OWNED BY badges.id;
+
+CREATE TABLE board_assignees (
+ id integer NOT NULL,
+ board_id integer NOT NULL,
+ assignee_id integer NOT NULL
+);
+
+CREATE SEQUENCE board_assignees_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE board_assignees_id_seq OWNED BY board_assignees.id;
+
+CREATE TABLE board_group_recent_visits (
+ id bigint NOT NULL,
+ created_at timestamp with time zone NOT NULL,
+ updated_at timestamp with time zone NOT NULL,
+ user_id integer,
+ board_id integer,
+ group_id integer
+);
+
+CREATE SEQUENCE board_group_recent_visits_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE board_group_recent_visits_id_seq OWNED BY board_group_recent_visits.id;
+
+CREATE TABLE board_labels (
+ id integer NOT NULL,
+ board_id integer NOT NULL,
+ label_id integer NOT NULL
+);
+
+CREATE SEQUENCE board_labels_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE board_labels_id_seq OWNED BY board_labels.id;
+
+CREATE TABLE board_project_recent_visits (
+ id bigint NOT NULL,
+ created_at timestamp with time zone NOT NULL,
+ updated_at timestamp with time zone NOT NULL,
+ user_id integer,
+ project_id integer,
+ board_id integer
+);
+
+CREATE SEQUENCE board_project_recent_visits_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE board_project_recent_visits_id_seq OWNED BY board_project_recent_visits.id;
+
+CREATE TABLE boards (
+ id integer NOT NULL,
+ project_id integer,
+ created_at timestamp without time zone NOT NULL,
+ updated_at timestamp without time zone NOT NULL,
+ group_id integer,
+ milestone_id integer,
+ weight integer,
+ name character varying DEFAULT 'Development'::character varying NOT NULL
+);
+
+CREATE SEQUENCE boards_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE boards_id_seq OWNED BY boards.id;
+
+CREATE TABLE broadcast_messages (
+ id integer NOT NULL,
+ message text NOT NULL,
+ starts_at timestamp without time zone NOT NULL,
+ ends_at timestamp without time zone NOT NULL,
+ created_at timestamp without time zone NOT NULL,
+ updated_at timestamp without time zone NOT NULL,
+ color character varying,
+ font character varying,
+ message_html text NOT NULL,
+ cached_markdown_version integer,
+ dismissable boolean,
+ target_path character varying(255),
+ broadcast_type smallint DEFAULT 1 NOT NULL
+);
+
+CREATE SEQUENCE broadcast_messages_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE broadcast_messages_id_seq OWNED BY broadcast_messages.id;
+
+CREATE TABLE chat_names (
+ id integer NOT NULL,
+ user_id integer NOT NULL,
+ service_id integer NOT NULL,
+ team_id character varying NOT NULL,
+ team_domain character varying,
+ chat_id character varying NOT NULL,
+ chat_name character varying,
+ last_used_at timestamp without time zone,
+ created_at timestamp without time zone NOT NULL,
+ updated_at timestamp without time zone NOT NULL
+);
+
+CREATE SEQUENCE chat_names_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE chat_names_id_seq OWNED BY chat_names.id;
+
+CREATE TABLE chat_teams (
+ id integer NOT NULL,
+ namespace_id integer NOT NULL,
+ team_id character varying,
+ name character varying,
+ created_at timestamp without time zone NOT NULL,
+ updated_at timestamp without time zone NOT NULL
+);
+
+CREATE SEQUENCE chat_teams_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE chat_teams_id_seq OWNED BY chat_teams.id;
+
+CREATE TABLE ci_build_needs (
+ id integer NOT NULL,
+ build_id integer NOT NULL,
+ name text NOT NULL,
+ artifacts boolean DEFAULT true NOT NULL
+);
+
+CREATE SEQUENCE ci_build_needs_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE ci_build_needs_id_seq OWNED BY ci_build_needs.id;
+
+CREATE TABLE ci_build_trace_chunks (
+ id bigint NOT NULL,
+ build_id integer NOT NULL,
+ chunk_index integer NOT NULL,
+ data_store integer NOT NULL,
+ raw_data bytea
+);
+
+CREATE SEQUENCE ci_build_trace_chunks_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE ci_build_trace_chunks_id_seq OWNED BY ci_build_trace_chunks.id;
+
+CREATE TABLE ci_build_trace_section_names (
+ id integer NOT NULL,
+ project_id integer NOT NULL,
+ name character varying NOT NULL
+);
+
+CREATE SEQUENCE ci_build_trace_section_names_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE ci_build_trace_section_names_id_seq OWNED BY ci_build_trace_section_names.id;
+
+CREATE TABLE ci_build_trace_sections (
+ project_id integer NOT NULL,
+ date_start timestamp with time zone NOT NULL,
+ date_end timestamp with time zone NOT NULL,
+ byte_start bigint NOT NULL,
+ byte_end bigint NOT NULL,
+ build_id integer NOT NULL,
+ section_name_id integer NOT NULL
+);
+
+CREATE TABLE ci_builds (
+ id integer NOT NULL,
+ status character varying,
+ finished_at timestamp without time zone,
+ trace text,
+ created_at timestamp without time zone,
+ updated_at timestamp without time zone,
+ started_at timestamp without time zone,
+ runner_id integer,
+ coverage double precision,
+ commit_id integer,
+ commands text,
+ name character varying,
+ options text,
+ allow_failure boolean DEFAULT false NOT NULL,
+ stage character varying,
+ trigger_request_id integer,
+ stage_idx integer,
+ tag boolean,
+ ref character varying,
+ user_id integer,
+ type character varying,
+ target_url character varying,
+ description character varying,
+ artifacts_file text,
+ project_id integer,
+ artifacts_metadata text,
+ erased_by_id integer,
+ erased_at timestamp without time zone,
+ artifacts_expire_at timestamp without time zone,
+ environment character varying,
+ artifacts_size bigint,
+ "when" character varying,
+ yaml_variables text,
+ queued_at timestamp without time zone,
+ token character varying,
+ lock_version integer,
+ coverage_regex character varying,
+ auto_canceled_by_id integer,
+ retried boolean,
+ stage_id integer,
+ artifacts_file_store integer,
+ artifacts_metadata_store integer,
+ protected boolean,
+ failure_reason integer,
+ scheduled_at timestamp with time zone,
+ token_encrypted character varying,
+ upstream_pipeline_id integer,
+ processed boolean,
+ resource_group_id bigint,
+ waiting_for_resource_at timestamp with time zone,
+ scheduling_type smallint
+);
+
+CREATE SEQUENCE ci_builds_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE ci_builds_id_seq OWNED BY ci_builds.id;
+
+CREATE TABLE ci_builds_metadata (
+ id integer NOT NULL,
+ build_id integer NOT NULL,
+ project_id integer NOT NULL,
+ timeout integer,
+ timeout_source integer DEFAULT 1 NOT NULL,
+ config_options jsonb,
+ config_variables jsonb,
+ interruptible boolean,
+ has_exposed_artifacts boolean,
+ environment_auto_stop_in character varying(255)
+);
+
+CREATE SEQUENCE ci_builds_metadata_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE ci_builds_metadata_id_seq OWNED BY ci_builds_metadata.id;
+
+CREATE TABLE ci_builds_runner_session (
+ id bigint NOT NULL,
+ build_id integer NOT NULL,
+ url character varying NOT NULL,
+ certificate character varying,
+ "authorization" character varying
+);
+
+CREATE SEQUENCE ci_builds_runner_session_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE ci_builds_runner_session_id_seq OWNED BY ci_builds_runner_session.id;
+
+CREATE TABLE ci_group_variables (
+ id integer NOT NULL,
+ key character varying NOT NULL,
+ value text,
+ encrypted_value text,
+ encrypted_value_salt character varying,
+ encrypted_value_iv character varying,
+ group_id integer NOT NULL,
+ protected boolean DEFAULT false NOT NULL,
+ created_at timestamp with time zone NOT NULL,
+ updated_at timestamp with time zone NOT NULL,
+ masked boolean DEFAULT false NOT NULL,
+ variable_type smallint DEFAULT 1 NOT NULL
+);
+
+CREATE SEQUENCE ci_group_variables_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE ci_group_variables_id_seq OWNED BY ci_group_variables.id;
+
+CREATE TABLE ci_job_artifacts (
+ id integer NOT NULL,
+ project_id integer NOT NULL,
+ job_id integer NOT NULL,
+ file_type integer NOT NULL,
+ size bigint,
+ created_at timestamp with time zone NOT NULL,
+ updated_at timestamp with time zone NOT NULL,
+ expire_at timestamp with time zone,
+ file character varying,
+ file_store integer,
+ file_sha256 bytea,
+ file_format smallint,
+ file_location smallint
+);
+
+CREATE SEQUENCE ci_job_artifacts_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE ci_job_artifacts_id_seq OWNED BY ci_job_artifacts.id;
+
+CREATE TABLE ci_job_variables (
+ id bigint NOT NULL,
+ key character varying NOT NULL,
+ encrypted_value text,
+ encrypted_value_iv character varying,
+ job_id bigint NOT NULL,
+ variable_type smallint DEFAULT 1 NOT NULL
+);
+
+CREATE SEQUENCE ci_job_variables_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE ci_job_variables_id_seq OWNED BY ci_job_variables.id;
+
+CREATE TABLE ci_pipeline_chat_data (
+ id bigint NOT NULL,
+ pipeline_id integer NOT NULL,
+ chat_name_id integer NOT NULL,
+ response_url text NOT NULL
+);
+
+CREATE SEQUENCE ci_pipeline_chat_data_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE ci_pipeline_chat_data_id_seq OWNED BY ci_pipeline_chat_data.id;
+
+CREATE TABLE ci_pipeline_schedule_variables (
+ id integer NOT NULL,
+ key character varying NOT NULL,
+ value text,
+ encrypted_value text,
+ encrypted_value_salt character varying,
+ encrypted_value_iv character varying,
+ pipeline_schedule_id integer NOT NULL,
+ created_at timestamp with time zone,
+ updated_at timestamp with time zone,
+ variable_type smallint DEFAULT 1 NOT NULL
+);
+
+CREATE SEQUENCE ci_pipeline_schedule_variables_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE ci_pipeline_schedule_variables_id_seq OWNED BY ci_pipeline_schedule_variables.id;
+
+CREATE TABLE ci_pipeline_schedules (
+ id integer NOT NULL,
+ description character varying,
+ ref character varying,
+ cron character varying,
+ cron_timezone character varying,
+ next_run_at timestamp without time zone,
+ project_id integer,
+ owner_id integer,
+ active boolean DEFAULT true,
+ created_at timestamp without time zone,
+ updated_at timestamp without time zone
+);
+
+CREATE SEQUENCE ci_pipeline_schedules_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE ci_pipeline_schedules_id_seq OWNED BY ci_pipeline_schedules.id;
+
+CREATE TABLE ci_pipeline_variables (
+ id integer NOT NULL,
+ key character varying NOT NULL,
+ value text,
+ encrypted_value text,
+ encrypted_value_salt character varying,
+ encrypted_value_iv character varying,
+ pipeline_id integer NOT NULL,
+ variable_type smallint DEFAULT 1 NOT NULL
+);
+
+CREATE SEQUENCE ci_pipeline_variables_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE ci_pipeline_variables_id_seq OWNED BY ci_pipeline_variables.id;
+
+CREATE TABLE ci_pipelines (
+ id integer NOT NULL,
+ ref character varying,
+ sha character varying,
+ before_sha character varying,
+ created_at timestamp without time zone,
+ updated_at timestamp without time zone,
+ tag boolean DEFAULT false,
+ yaml_errors text,
+ committed_at timestamp without time zone,
+ project_id integer,
+ status character varying,
+ started_at timestamp without time zone,
+ finished_at timestamp without time zone,
+ duration integer,
+ user_id integer,
+ lock_version integer,
+ auto_canceled_by_id integer,
+ pipeline_schedule_id integer,
+ source integer,
+ protected boolean,
+ config_source integer,
+ failure_reason integer,
+ iid integer,
+ merge_request_id integer,
+ source_sha bytea,
+ target_sha bytea,
+ external_pull_request_id bigint
+);
+
+CREATE TABLE ci_pipelines_config (
+ pipeline_id bigint NOT NULL,
+ content text NOT NULL
+);
+
+CREATE SEQUENCE ci_pipelines_config_pipeline_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE ci_pipelines_config_pipeline_id_seq OWNED BY ci_pipelines_config.pipeline_id;
+
+CREATE SEQUENCE ci_pipelines_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE ci_pipelines_id_seq OWNED BY ci_pipelines.id;
+
+CREATE TABLE ci_refs (
+ id bigint NOT NULL,
+ project_id integer NOT NULL,
+ lock_version integer DEFAULT 0,
+ last_updated_by_pipeline_id integer,
+ tag boolean DEFAULT false NOT NULL,
+ ref character varying(255) NOT NULL,
+ status character varying(255) NOT NULL
+);
+
+CREATE SEQUENCE ci_refs_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE ci_refs_id_seq OWNED BY ci_refs.id;
+
+CREATE TABLE ci_resource_groups (
+ id bigint NOT NULL,
+ created_at timestamp with time zone NOT NULL,
+ updated_at timestamp with time zone NOT NULL,
+ project_id bigint NOT NULL,
+ key character varying(255) NOT NULL
+);
+
+CREATE SEQUENCE ci_resource_groups_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE ci_resource_groups_id_seq OWNED BY ci_resource_groups.id;
+
+CREATE TABLE ci_resources (
+ id bigint NOT NULL,
+ created_at timestamp with time zone NOT NULL,
+ updated_at timestamp with time zone NOT NULL,
+ resource_group_id bigint NOT NULL,
+ build_id bigint
+);
+
+CREATE SEQUENCE ci_resources_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE ci_resources_id_seq OWNED BY ci_resources.id;
+
+CREATE TABLE ci_runner_namespaces (
+ id integer NOT NULL,
+ runner_id integer,
+ namespace_id integer
+);
+
+CREATE SEQUENCE ci_runner_namespaces_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE ci_runner_namespaces_id_seq OWNED BY ci_runner_namespaces.id;
+
+CREATE TABLE ci_runner_projects (
+ id integer NOT NULL,
+ runner_id integer NOT NULL,
+ created_at timestamp without time zone,
+ updated_at timestamp without time zone,
+ project_id integer
+);
+
+CREATE SEQUENCE ci_runner_projects_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE ci_runner_projects_id_seq OWNED BY ci_runner_projects.id;
+
+CREATE TABLE ci_runners (
+ id integer NOT NULL,
+ token character varying,
+ created_at timestamp without time zone,
+ updated_at timestamp without time zone,
+ description character varying,
+ contacted_at timestamp without time zone,
+ active boolean DEFAULT true NOT NULL,
+ is_shared boolean DEFAULT false,
+ name character varying,
+ version character varying,
+ revision character varying,
+ platform character varying,
+ architecture character varying,
+ run_untagged boolean DEFAULT true NOT NULL,
+ locked boolean DEFAULT false NOT NULL,
+ access_level integer DEFAULT 0 NOT NULL,
+ maximum_timeout integer,
+ ip_address character varying,
+ runner_type smallint NOT NULL,
+ token_encrypted character varying
+);
+
+CREATE SEQUENCE ci_runners_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE ci_runners_id_seq OWNED BY ci_runners.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
+);
+
+CREATE SEQUENCE ci_sources_pipelines_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE ci_sources_pipelines_id_seq OWNED BY ci_sources_pipelines.id;
+
+CREATE TABLE ci_stages (
+ id integer NOT NULL,
+ project_id integer,
+ pipeline_id integer,
+ created_at timestamp without time zone,
+ updated_at timestamp without time zone,
+ name character varying,
+ status integer,
+ lock_version integer,
+ "position" integer
+);
+
+CREATE SEQUENCE ci_stages_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE ci_stages_id_seq OWNED BY ci_stages.id;
+
+CREATE TABLE ci_subscriptions_projects (
+ id bigint NOT NULL,
+ downstream_project_id bigint NOT NULL,
+ upstream_project_id bigint NOT NULL
+);
+
+CREATE SEQUENCE ci_subscriptions_projects_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE ci_subscriptions_projects_id_seq OWNED BY ci_subscriptions_projects.id;
+
+CREATE TABLE ci_trigger_requests (
+ id integer NOT NULL,
+ trigger_id integer NOT NULL,
+ variables text,
+ created_at timestamp without time zone,
+ updated_at timestamp without time zone,
+ commit_id integer
+);
+
+CREATE SEQUENCE ci_trigger_requests_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE ci_trigger_requests_id_seq OWNED BY ci_trigger_requests.id;
+
+CREATE TABLE ci_triggers (
+ id integer NOT NULL,
+ token character varying,
+ created_at timestamp without time zone,
+ updated_at timestamp without time zone,
+ project_id integer,
+ owner_id integer NOT NULL,
+ description character varying,
+ ref character varying
+);
+
+CREATE SEQUENCE ci_triggers_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE ci_triggers_id_seq OWNED BY ci_triggers.id;
+
+CREATE TABLE ci_variables (
+ id integer NOT NULL,
+ key character varying NOT NULL,
+ value text,
+ encrypted_value text,
+ encrypted_value_salt character varying,
+ encrypted_value_iv character varying,
+ project_id integer NOT NULL,
+ protected boolean DEFAULT false NOT NULL,
+ environment_scope character varying DEFAULT '*'::character varying NOT NULL,
+ masked boolean DEFAULT false NOT NULL,
+ variable_type smallint DEFAULT 1 NOT NULL
+);
+
+CREATE SEQUENCE ci_variables_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE ci_variables_id_seq OWNED BY ci_variables.id;
+
+CREATE TABLE cluster_groups (
+ id integer NOT NULL,
+ cluster_id integer NOT NULL,
+ group_id integer NOT NULL
+);
+
+CREATE SEQUENCE cluster_groups_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE cluster_groups_id_seq OWNED BY cluster_groups.id;
+
+CREATE TABLE cluster_platforms_kubernetes (
+ id integer NOT NULL,
+ cluster_id integer NOT NULL,
+ created_at timestamp with time zone NOT NULL,
+ updated_at timestamp with time zone NOT NULL,
+ api_url text,
+ ca_cert text,
+ namespace character varying,
+ username character varying,
+ encrypted_password text,
+ encrypted_password_iv character varying,
+ encrypted_token text,
+ encrypted_token_iv character varying,
+ authorization_type smallint
+);
+
+CREATE SEQUENCE cluster_platforms_kubernetes_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE cluster_platforms_kubernetes_id_seq OWNED BY cluster_platforms_kubernetes.id;
+
+CREATE TABLE cluster_projects (
+ id integer NOT NULL,
+ project_id integer NOT NULL,
+ cluster_id integer NOT NULL,
+ created_at timestamp with time zone NOT NULL,
+ updated_at timestamp with time zone NOT NULL
+);
+
+CREATE SEQUENCE cluster_projects_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE cluster_projects_id_seq OWNED BY cluster_projects.id;
+
+CREATE TABLE cluster_providers_aws (
+ id bigint NOT NULL,
+ cluster_id bigint NOT NULL,
+ created_by_user_id integer,
+ num_nodes integer NOT NULL,
+ status integer NOT NULL,
+ created_at timestamp with time zone NOT NULL,
+ updated_at timestamp with time zone NOT NULL,
+ key_name character varying(255) NOT NULL,
+ role_arn character varying(2048) NOT NULL,
+ region character varying(255) NOT NULL,
+ vpc_id character varying(255) NOT NULL,
+ subnet_ids character varying(255)[] DEFAULT '{}'::character varying[] NOT NULL,
+ security_group_id character varying(255) NOT NULL,
+ instance_type character varying(255) NOT NULL,
+ access_key_id character varying(255),
+ encrypted_secret_access_key_iv character varying(255),
+ encrypted_secret_access_key text,
+ session_token text,
+ status_reason text
+);
+
+CREATE SEQUENCE cluster_providers_aws_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE cluster_providers_aws_id_seq OWNED BY cluster_providers_aws.id;
+
+CREATE TABLE cluster_providers_gcp (
+ id integer NOT NULL,
+ cluster_id integer NOT NULL,
+ status integer,
+ num_nodes integer NOT NULL,
+ created_at timestamp with time zone NOT NULL,
+ updated_at timestamp with time zone NOT NULL,
+ status_reason text,
+ gcp_project_id character varying NOT NULL,
+ zone character varying NOT NULL,
+ machine_type character varying,
+ operation_id character varying,
+ endpoint character varying,
+ encrypted_access_token text,
+ encrypted_access_token_iv character varying,
+ legacy_abac boolean DEFAULT false NOT NULL,
+ cloud_run boolean DEFAULT false NOT NULL
+);
+
+CREATE SEQUENCE cluster_providers_gcp_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE cluster_providers_gcp_id_seq OWNED BY cluster_providers_gcp.id;
+
+CREATE TABLE clusters (
+ id integer NOT NULL,
+ user_id integer,
+ provider_type integer,
+ platform_type integer,
+ created_at timestamp with time zone NOT NULL,
+ updated_at timestamp with time zone NOT NULL,
+ enabled boolean DEFAULT true,
+ name character varying NOT NULL,
+ environment_scope character varying DEFAULT '*'::character varying NOT NULL,
+ cluster_type smallint DEFAULT 3 NOT NULL,
+ domain character varying,
+ managed boolean DEFAULT true NOT NULL,
+ namespace_per_environment boolean DEFAULT true NOT NULL,
+ cleanup_status smallint DEFAULT 1 NOT NULL,
+ cleanup_status_reason text,
+ management_project_id integer
+);
+
+CREATE TABLE clusters_applications_cert_managers (
+ id integer NOT NULL,
+ cluster_id integer NOT NULL,
+ status integer NOT NULL,
+ version character varying NOT NULL,
+ email character varying NOT NULL,
+ created_at timestamp with time zone NOT NULL,
+ updated_at timestamp with time zone NOT NULL,
+ status_reason text
+);
+
+CREATE SEQUENCE clusters_applications_cert_managers_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE clusters_applications_cert_managers_id_seq OWNED BY clusters_applications_cert_managers.id;
+
+CREATE TABLE clusters_applications_crossplane (
+ id bigint NOT NULL,
+ created_at timestamp with time zone NOT NULL,
+ updated_at timestamp with time zone NOT NULL,
+ cluster_id bigint NOT NULL,
+ status integer NOT NULL,
+ version character varying(255) NOT NULL,
+ stack character varying(255) NOT NULL,
+ status_reason text
+);
+
+CREATE SEQUENCE clusters_applications_crossplane_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE clusters_applications_crossplane_id_seq OWNED BY clusters_applications_crossplane.id;
+
+CREATE TABLE clusters_applications_elastic_stacks (
+ id bigint NOT NULL,
+ created_at timestamp with time zone NOT NULL,
+ updated_at timestamp with time zone NOT NULL,
+ cluster_id bigint NOT NULL,
+ status integer NOT NULL,
+ version character varying(255) NOT NULL,
+ kibana_hostname character varying(255),
+ status_reason text
+);
+
+CREATE SEQUENCE clusters_applications_elastic_stacks_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE clusters_applications_elastic_stacks_id_seq OWNED BY clusters_applications_elastic_stacks.id;
+
+CREATE TABLE clusters_applications_helm (
+ id integer NOT NULL,
+ cluster_id integer NOT NULL,
+ created_at timestamp with time zone NOT NULL,
+ updated_at timestamp with time zone NOT NULL,
+ status integer NOT NULL,
+ version character varying NOT NULL,
+ status_reason text,
+ encrypted_ca_key text,
+ encrypted_ca_key_iv text,
+ ca_cert text
+);
+
+CREATE SEQUENCE clusters_applications_helm_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE clusters_applications_helm_id_seq OWNED BY clusters_applications_helm.id;
+
+CREATE TABLE clusters_applications_ingress (
+ id integer NOT NULL,
+ cluster_id integer NOT NULL,
+ created_at timestamp with time zone NOT NULL,
+ updated_at timestamp with time zone NOT NULL,
+ status integer NOT NULL,
+ ingress_type integer NOT NULL,
+ version character varying NOT NULL,
+ cluster_ip character varying,
+ status_reason text,
+ external_ip character varying,
+ external_hostname character varying,
+ modsecurity_enabled boolean
+);
+
+CREATE SEQUENCE clusters_applications_ingress_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE clusters_applications_ingress_id_seq OWNED BY clusters_applications_ingress.id;
+
+CREATE TABLE clusters_applications_jupyter (
+ id integer NOT NULL,
+ cluster_id integer NOT NULL,
+ oauth_application_id integer,
+ status integer NOT NULL,
+ version character varying NOT NULL,
+ hostname character varying,
+ created_at timestamp with time zone NOT NULL,
+ updated_at timestamp with time zone NOT NULL,
+ status_reason text
+);
+
+CREATE SEQUENCE clusters_applications_jupyter_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE clusters_applications_jupyter_id_seq OWNED BY clusters_applications_jupyter.id;
+
+CREATE TABLE clusters_applications_knative (
+ id integer NOT NULL,
+ cluster_id integer NOT NULL,
+ created_at timestamp with time zone NOT NULL,
+ updated_at timestamp with time zone NOT NULL,
+ status integer NOT NULL,
+ version character varying NOT NULL,
+ hostname character varying,
+ status_reason text,
+ external_ip character varying,
+ external_hostname character varying
+);
+
+CREATE SEQUENCE clusters_applications_knative_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE clusters_applications_knative_id_seq OWNED BY clusters_applications_knative.id;
+
+CREATE TABLE clusters_applications_prometheus (
+ id integer NOT NULL,
+ cluster_id integer NOT NULL,
+ status integer NOT NULL,
+ version character varying NOT NULL,
+ status_reason text,
+ created_at timestamp with time zone NOT NULL,
+ updated_at timestamp with time zone NOT NULL,
+ encrypted_alert_manager_token character varying,
+ encrypted_alert_manager_token_iv character varying,
+ last_update_started_at timestamp with time zone
+);
+
+CREATE SEQUENCE clusters_applications_prometheus_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE clusters_applications_prometheus_id_seq OWNED BY clusters_applications_prometheus.id;
+
+CREATE TABLE clusters_applications_runners (
+ id integer NOT NULL,
+ cluster_id integer NOT NULL,
+ runner_id integer,
+ status integer NOT NULL,
+ created_at timestamp with time zone NOT NULL,
+ updated_at timestamp with time zone NOT NULL,
+ version character varying NOT NULL,
+ status_reason text,
+ privileged boolean DEFAULT true NOT NULL
+);
+
+CREATE SEQUENCE clusters_applications_runners_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE clusters_applications_runners_id_seq OWNED BY clusters_applications_runners.id;
+
+CREATE SEQUENCE clusters_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE clusters_id_seq OWNED BY clusters.id;
+
+CREATE TABLE clusters_kubernetes_namespaces (
+ id bigint NOT NULL,
+ cluster_id integer NOT NULL,
+ project_id integer,
+ cluster_project_id integer,
+ created_at timestamp with time zone NOT NULL,
+ updated_at timestamp with time zone NOT NULL,
+ encrypted_service_account_token_iv character varying,
+ namespace character varying NOT NULL,
+ service_account_name character varying,
+ encrypted_service_account_token text,
+ environment_id bigint
+);
+
+CREATE SEQUENCE clusters_kubernetes_namespaces_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE clusters_kubernetes_namespaces_id_seq OWNED BY clusters_kubernetes_namespaces.id;
+
+CREATE TABLE commit_user_mentions (
+ id bigint NOT NULL,
+ note_id integer NOT NULL,
+ mentioned_users_ids integer[],
+ mentioned_projects_ids integer[],
+ mentioned_groups_ids integer[],
+ commit_id character varying,
+ CONSTRAINT check_724d773807 CHECK ((commit_id IS NOT NULL))
+);
+
+CREATE SEQUENCE commit_user_mentions_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE commit_user_mentions_id_seq OWNED BY commit_user_mentions.id;
+
+CREATE TABLE container_expiration_policies (
+ created_at timestamp with time zone NOT NULL,
+ updated_at timestamp with time zone NOT NULL,
+ next_run_at timestamp with time zone,
+ project_id bigint NOT NULL,
+ name_regex character varying(255),
+ cadence character varying(12) DEFAULT '7d'::character varying NOT NULL,
+ older_than character varying(12),
+ keep_n integer,
+ enabled boolean DEFAULT false NOT NULL
+);
+
+CREATE TABLE container_repositories (
+ id integer NOT NULL,
+ project_id integer NOT NULL,
+ name character varying NOT NULL,
+ created_at timestamp without time zone NOT NULL,
+ updated_at timestamp without time zone NOT NULL
+);
+
+CREATE SEQUENCE container_repositories_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE container_repositories_id_seq OWNED BY container_repositories.id;
+
+CREATE TABLE conversational_development_index_metrics (
+ id integer NOT NULL,
+ leader_issues double precision NOT NULL,
+ instance_issues double precision NOT NULL,
+ leader_notes double precision NOT NULL,
+ instance_notes double precision NOT NULL,
+ leader_milestones double precision NOT NULL,
+ instance_milestones double precision NOT NULL,
+ leader_boards double precision NOT NULL,
+ instance_boards double precision NOT NULL,
+ leader_merge_requests double precision NOT NULL,
+ instance_merge_requests double precision NOT NULL,
+ leader_ci_pipelines double precision NOT NULL,
+ instance_ci_pipelines double precision NOT NULL,
+ leader_environments double precision NOT NULL,
+ instance_environments double precision NOT NULL,
+ leader_deployments double precision NOT NULL,
+ instance_deployments double precision NOT NULL,
+ leader_projects_prometheus_active double precision NOT NULL,
+ instance_projects_prometheus_active double precision NOT NULL,
+ leader_service_desk_issues double precision NOT NULL,
+ instance_service_desk_issues double precision NOT NULL,
+ created_at timestamp without time zone NOT NULL,
+ updated_at timestamp without time zone NOT NULL,
+ percentage_boards double precision DEFAULT 0.0 NOT NULL,
+ percentage_ci_pipelines double precision DEFAULT 0.0 NOT NULL,
+ percentage_deployments double precision DEFAULT 0.0 NOT NULL,
+ percentage_environments double precision DEFAULT 0.0 NOT NULL,
+ percentage_issues double precision DEFAULT 0.0 NOT NULL,
+ percentage_merge_requests double precision DEFAULT 0.0 NOT NULL,
+ percentage_milestones double precision DEFAULT 0.0 NOT NULL,
+ percentage_notes double precision DEFAULT 0.0 NOT NULL,
+ percentage_projects_prometheus_active double precision DEFAULT 0.0 NOT NULL,
+ percentage_service_desk_issues double precision DEFAULT 0.0 NOT NULL
+);
+
+CREATE SEQUENCE conversational_development_index_metrics_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE conversational_development_index_metrics_id_seq OWNED BY conversational_development_index_metrics.id;
+
+CREATE TABLE dependency_proxy_blobs (
+ id integer NOT NULL,
+ created_at timestamp with time zone NOT NULL,
+ file text NOT NULL,
+ file_name character varying NOT NULL,
+ file_store integer,
+ group_id integer NOT NULL,
+ size bigint,
+ updated_at timestamp with time zone NOT NULL
+);
+
+CREATE SEQUENCE dependency_proxy_blobs_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE dependency_proxy_blobs_id_seq OWNED BY dependency_proxy_blobs.id;
+
+CREATE TABLE dependency_proxy_group_settings (
+ id integer NOT NULL,
+ created_at timestamp with time zone NOT NULL,
+ enabled boolean DEFAULT false NOT NULL,
+ group_id integer NOT NULL,
+ updated_at timestamp with time zone NOT NULL
+);
+
+CREATE SEQUENCE dependency_proxy_group_settings_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE dependency_proxy_group_settings_id_seq OWNED BY dependency_proxy_group_settings.id;
+
+CREATE TABLE deploy_keys_projects (
+ id integer NOT NULL,
+ deploy_key_id integer NOT NULL,
+ project_id integer NOT NULL,
+ created_at timestamp without time zone,
+ updated_at timestamp without time zone,
+ can_push boolean DEFAULT false NOT NULL
+);
+
+CREATE SEQUENCE deploy_keys_projects_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE deploy_keys_projects_id_seq OWNED BY deploy_keys_projects.id;
+
+CREATE TABLE deploy_tokens (
+ id integer NOT NULL,
+ revoked boolean DEFAULT false,
+ read_repository boolean DEFAULT false NOT NULL,
+ read_registry boolean DEFAULT false NOT NULL,
+ expires_at timestamp with time zone NOT NULL,
+ created_at timestamp with time zone NOT NULL,
+ name character varying NOT NULL,
+ token character varying,
+ username character varying,
+ token_encrypted character varying(255)
+);
+
+CREATE SEQUENCE deploy_tokens_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE deploy_tokens_id_seq OWNED BY deploy_tokens.id;
+
+CREATE TABLE deployment_merge_requests (
+ deployment_id integer NOT NULL,
+ merge_request_id integer NOT NULL
+);
+
+CREATE TABLE deployments (
+ id integer NOT NULL,
+ iid integer NOT NULL,
+ project_id integer NOT NULL,
+ environment_id integer NOT NULL,
+ ref character varying NOT NULL,
+ tag boolean NOT NULL,
+ sha character varying NOT NULL,
+ user_id integer,
+ deployable_id integer,
+ deployable_type character varying,
+ created_at timestamp without time zone,
+ updated_at timestamp without time zone,
+ on_stop character varying,
+ finished_at timestamp with time zone,
+ status smallint NOT NULL,
+ cluster_id integer
+);
+
+CREATE SEQUENCE deployments_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE deployments_id_seq OWNED BY deployments.id;
+
+CREATE TABLE description_versions (
+ id bigint NOT NULL,
+ created_at timestamp with time zone NOT NULL,
+ updated_at timestamp with time zone NOT NULL,
+ issue_id integer,
+ merge_request_id integer,
+ epic_id integer,
+ description text,
+ deleted_at timestamp with time zone
+);
+
+CREATE SEQUENCE description_versions_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE description_versions_id_seq OWNED BY description_versions.id;
+
+CREATE TABLE design_management_designs (
+ id bigint NOT NULL,
+ project_id integer NOT NULL,
+ issue_id integer,
+ filename character varying NOT NULL
+);
+
+CREATE SEQUENCE design_management_designs_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE design_management_designs_id_seq OWNED BY design_management_designs.id;
+
+CREATE TABLE design_management_designs_versions (
+ design_id bigint NOT NULL,
+ version_id bigint NOT NULL,
+ event smallint DEFAULT 0 NOT NULL,
+ image_v432x230 character varying(255)
+);
+
+CREATE TABLE design_management_versions (
+ id bigint NOT NULL,
+ sha bytea NOT NULL,
+ issue_id bigint,
+ created_at timestamp with time zone NOT NULL,
+ author_id integer
+);
+
+CREATE SEQUENCE design_management_versions_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE design_management_versions_id_seq OWNED BY design_management_versions.id;
+
+CREATE TABLE design_user_mentions (
+ id bigint NOT NULL,
+ design_id integer NOT NULL,
+ note_id integer NOT NULL,
+ mentioned_users_ids integer[],
+ mentioned_projects_ids integer[],
+ mentioned_groups_ids integer[]
+);
+
+CREATE SEQUENCE design_user_mentions_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE design_user_mentions_id_seq OWNED BY design_user_mentions.id;
+
+CREATE TABLE draft_notes (
+ id bigint NOT NULL,
+ merge_request_id integer NOT NULL,
+ author_id integer NOT NULL,
+ resolve_discussion boolean DEFAULT false NOT NULL,
+ discussion_id character varying,
+ note text NOT NULL,
+ "position" text,
+ original_position text,
+ change_position text,
+ commit_id bytea
+);
+
+CREATE SEQUENCE draft_notes_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE draft_notes_id_seq OWNED BY draft_notes.id;
+
+CREATE TABLE elasticsearch_indexed_namespaces (
+ created_at timestamp with time zone NOT NULL,
+ updated_at timestamp with time zone NOT NULL,
+ namespace_id integer
+);
+
+CREATE TABLE elasticsearch_indexed_projects (
+ created_at timestamp with time zone NOT NULL,
+ updated_at timestamp with time zone NOT NULL,
+ project_id integer
+);
+
+CREATE TABLE emails (
+ id integer NOT NULL,
+ user_id integer NOT NULL,
+ email character varying NOT NULL,
+ created_at timestamp without time zone,
+ updated_at timestamp without time zone,
+ confirmation_token character varying,
+ confirmed_at timestamp with time zone,
+ confirmation_sent_at timestamp with time zone
+);
+
+CREATE SEQUENCE emails_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE emails_id_seq OWNED BY emails.id;
+
+CREATE TABLE environments (
+ id integer NOT NULL,
+ project_id integer NOT NULL,
+ name character varying NOT NULL,
+ created_at timestamp without time zone,
+ updated_at timestamp without time zone,
+ external_url character varying,
+ environment_type character varying,
+ state character varying DEFAULT 'available'::character varying NOT NULL,
+ slug character varying NOT NULL,
+ auto_stop_at timestamp with time zone
+);
+
+CREATE SEQUENCE environments_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE environments_id_seq OWNED BY environments.id;
+
+CREATE TABLE epic_issues (
+ id integer NOT NULL,
+ epic_id integer NOT NULL,
+ issue_id integer NOT NULL,
+ relative_position integer
+);
+
+CREATE SEQUENCE epic_issues_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE epic_issues_id_seq OWNED BY epic_issues.id;
+
+CREATE TABLE epic_metrics (
+ id integer NOT NULL,
+ epic_id integer NOT NULL,
+ created_at timestamp without time zone NOT NULL,
+ updated_at timestamp without time zone NOT NULL
+);
+
+CREATE SEQUENCE epic_metrics_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE epic_metrics_id_seq OWNED BY epic_metrics.id;
+
+CREATE TABLE epic_user_mentions (
+ id bigint NOT NULL,
+ epic_id integer NOT NULL,
+ note_id integer,
+ mentioned_users_ids integer[],
+ mentioned_projects_ids integer[],
+ mentioned_groups_ids integer[]
+);
+
+CREATE SEQUENCE epic_user_mentions_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE epic_user_mentions_id_seq OWNED BY epic_user_mentions.id;
+
+CREATE TABLE epics (
+ id integer NOT NULL,
+ group_id integer NOT NULL,
+ author_id integer NOT NULL,
+ assignee_id integer,
+ iid integer NOT NULL,
+ cached_markdown_version integer,
+ updated_by_id integer,
+ last_edited_by_id integer,
+ lock_version integer,
+ start_date date,
+ end_date date,
+ last_edited_at timestamp without time zone,
+ created_at timestamp without time zone NOT NULL,
+ updated_at timestamp without time zone NOT NULL,
+ title character varying NOT NULL,
+ title_html character varying NOT NULL,
+ description text,
+ description_html text,
+ start_date_sourcing_milestone_id integer,
+ due_date_sourcing_milestone_id integer,
+ start_date_fixed date,
+ due_date_fixed date,
+ start_date_is_fixed boolean,
+ due_date_is_fixed boolean,
+ closed_by_id integer,
+ closed_at timestamp without time zone,
+ parent_id integer,
+ relative_position integer,
+ start_date_sourcing_epic_id integer,
+ due_date_sourcing_epic_id integer,
+ state_id smallint DEFAULT 1,
+ CONSTRAINT check_57ee003890 CHECK ((state_id IS NOT NULL))
+);
+
+CREATE SEQUENCE epics_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE epics_id_seq OWNED BY epics.id;
+
+CREATE TABLE events (
+ id integer NOT NULL,
+ project_id integer,
+ author_id integer NOT NULL,
+ target_id integer,
+ created_at timestamp with time zone NOT NULL,
+ updated_at timestamp with time zone NOT NULL,
+ action smallint NOT NULL,
+ target_type character varying,
+ group_id bigint
+);
+
+CREATE SEQUENCE events_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE events_id_seq OWNED BY events.id;
+
+CREATE TABLE evidences (
+ id bigint NOT NULL,
+ release_id bigint NOT NULL,
+ created_at timestamp with time zone NOT NULL,
+ updated_at timestamp with time zone NOT NULL,
+ summary_sha bytea,
+ summary jsonb DEFAULT '{}'::jsonb NOT NULL
+);
+
+CREATE SEQUENCE evidences_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE evidences_id_seq OWNED BY evidences.id;
+
+CREATE TABLE external_pull_requests (
+ id bigint NOT NULL,
+ created_at timestamp with time zone NOT NULL,
+ updated_at timestamp with time zone NOT NULL,
+ project_id bigint NOT NULL,
+ pull_request_iid integer NOT NULL,
+ status smallint NOT NULL,
+ source_branch character varying(255) NOT NULL,
+ target_branch character varying(255) NOT NULL,
+ source_repository character varying(255) NOT NULL,
+ target_repository character varying(255) NOT NULL,
+ source_sha bytea NOT NULL,
+ target_sha bytea NOT NULL
+);
+
+CREATE SEQUENCE external_pull_requests_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE external_pull_requests_id_seq OWNED BY external_pull_requests.id;
+
+CREATE TABLE feature_gates (
+ id integer NOT NULL,
+ feature_key character varying NOT NULL,
+ key character varying NOT NULL,
+ value character varying,
+ created_at timestamp without time zone NOT NULL,
+ updated_at timestamp without time zone NOT NULL
+);
+
+CREATE SEQUENCE feature_gates_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE feature_gates_id_seq OWNED BY feature_gates.id;
+
+CREATE TABLE features (
+ id integer NOT NULL,
+ key character varying NOT NULL,
+ created_at timestamp without time zone NOT NULL,
+ updated_at timestamp without time zone NOT NULL
+);
+
+CREATE SEQUENCE features_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE features_id_seq OWNED BY features.id;
+
+CREATE TABLE fork_network_members (
+ id integer NOT NULL,
+ fork_network_id integer NOT NULL,
+ project_id integer NOT NULL,
+ forked_from_project_id integer
+);
+
+CREATE SEQUENCE fork_network_members_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE fork_network_members_id_seq OWNED BY fork_network_members.id;
+
+CREATE TABLE fork_networks (
+ id integer NOT NULL,
+ root_project_id integer,
+ deleted_root_project_name character varying
+);
+
+CREATE SEQUENCE fork_networks_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE fork_networks_id_seq OWNED BY fork_networks.id;
+
+CREATE TABLE forked_project_links (
+ id integer NOT NULL,
+ forked_to_project_id integer NOT NULL,
+ forked_from_project_id integer NOT NULL,
+ created_at timestamp without time zone,
+ updated_at timestamp without time zone
+);
+
+CREATE SEQUENCE forked_project_links_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE forked_project_links_id_seq OWNED BY forked_project_links.id;
+
+CREATE TABLE geo_cache_invalidation_events (
+ id bigint NOT NULL,
+ key character varying NOT NULL
+);
+
+CREATE SEQUENCE geo_cache_invalidation_events_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+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,
+ repository_updated_event_id bigint,
+ repository_deleted_event_id bigint,
+ repository_renamed_event_id bigint,
+ repositories_changed_event_id bigint,
+ repository_created_event_id bigint,
+ hashed_storage_migrated_event_id bigint,
+ lfs_object_deleted_event_id bigint,
+ hashed_storage_attachments_event_id bigint,
+ upload_deleted_event_id bigint,
+ job_artifact_deleted_event_id bigint,
+ reset_checksum_event_id bigint,
+ cache_invalidation_event_id bigint,
+ container_repository_updated_event_id bigint
+);
+
+CREATE SEQUENCE geo_event_log_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE geo_event_log_id_seq OWNED BY geo_event_log.id;
+
+CREATE TABLE geo_hashed_storage_attachments_events (
+ id bigint NOT NULL,
+ project_id integer NOT NULL,
+ old_attachments_path text NOT NULL,
+ new_attachments_path text NOT NULL
+);
+
+CREATE SEQUENCE geo_hashed_storage_attachments_events_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE geo_hashed_storage_attachments_events_id_seq OWNED BY geo_hashed_storage_attachments_events.id;
+
+CREATE TABLE geo_hashed_storage_migrated_events (
+ id bigint NOT NULL,
+ project_id integer NOT NULL,
+ repository_storage_name text NOT NULL,
+ old_disk_path text NOT NULL,
+ new_disk_path text NOT NULL,
+ old_wiki_disk_path text NOT NULL,
+ new_wiki_disk_path text NOT NULL,
+ old_storage_version smallint,
+ new_storage_version smallint NOT NULL,
+ old_design_disk_path text,
+ new_design_disk_path text
+);
+
+CREATE SEQUENCE geo_hashed_storage_migrated_events_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE geo_hashed_storage_migrated_events_id_seq OWNED BY geo_hashed_storage_migrated_events.id;
+
+CREATE TABLE geo_job_artifact_deleted_events (
+ id bigint NOT NULL,
+ job_artifact_id integer NOT NULL,
+ file_path character varying NOT NULL
+);
+
+CREATE SEQUENCE geo_job_artifact_deleted_events_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE geo_job_artifact_deleted_events_id_seq OWNED BY geo_job_artifact_deleted_events.id;
+
+CREATE TABLE geo_lfs_object_deleted_events (
+ id bigint NOT NULL,
+ lfs_object_id integer NOT NULL,
+ oid character varying NOT NULL,
+ file_path character varying NOT NULL
+);
+
+CREATE SEQUENCE geo_lfs_object_deleted_events_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE geo_lfs_object_deleted_events_id_seq OWNED BY geo_lfs_object_deleted_events.id;
+
+CREATE TABLE geo_node_namespace_links (
+ id integer NOT NULL,
+ geo_node_id integer NOT NULL,
+ namespace_id integer NOT NULL,
+ created_at timestamp without time zone NOT NULL,
+ updated_at timestamp without time zone NOT NULL
+);
+
+CREATE SEQUENCE geo_node_namespace_links_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE geo_node_namespace_links_id_seq OWNED BY geo_node_namespace_links.id;
+
+CREATE TABLE geo_node_statuses (
+ id integer NOT NULL,
+ geo_node_id integer NOT NULL,
+ db_replication_lag_seconds integer,
+ repositories_synced_count integer,
+ repositories_failed_count integer,
+ lfs_objects_count integer,
+ lfs_objects_synced_count integer,
+ lfs_objects_failed_count integer,
+ attachments_count integer,
+ attachments_synced_count integer,
+ attachments_failed_count integer,
+ last_event_id integer,
+ last_event_date timestamp without time zone,
+ cursor_last_event_id integer,
+ cursor_last_event_date timestamp without time zone,
+ created_at timestamp without time zone NOT NULL,
+ updated_at timestamp without time zone NOT NULL,
+ last_successful_status_check_at timestamp without time zone,
+ status_message character varying,
+ replication_slots_count integer,
+ replication_slots_used_count integer,
+ replication_slots_max_retained_wal_bytes bigint,
+ wikis_synced_count integer,
+ wikis_failed_count integer,
+ job_artifacts_count integer,
+ job_artifacts_synced_count integer,
+ job_artifacts_failed_count integer,
+ version character varying,
+ revision character varying,
+ repositories_verified_count integer,
+ repositories_verification_failed_count integer,
+ wikis_verified_count integer,
+ wikis_verification_failed_count integer,
+ lfs_objects_synced_missing_on_primary_count integer,
+ job_artifacts_synced_missing_on_primary_count integer,
+ attachments_synced_missing_on_primary_count integer,
+ repositories_checksummed_count integer,
+ repositories_checksum_failed_count integer,
+ repositories_checksum_mismatch_count integer,
+ wikis_checksummed_count integer,
+ wikis_checksum_failed_count integer,
+ wikis_checksum_mismatch_count integer,
+ storage_configuration_digest bytea,
+ repositories_retrying_verification_count integer,
+ wikis_retrying_verification_count integer,
+ projects_count integer,
+ container_repositories_count integer,
+ container_repositories_synced_count integer,
+ container_repositories_failed_count integer,
+ container_repositories_registry_count integer,
+ design_repositories_count integer,
+ design_repositories_synced_count integer,
+ design_repositories_failed_count integer,
+ design_repositories_registry_count integer
+);
+
+CREATE SEQUENCE geo_node_statuses_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE geo_node_statuses_id_seq OWNED BY geo_node_statuses.id;
+
+CREATE TABLE geo_nodes (
+ id integer NOT NULL,
+ "primary" boolean DEFAULT false NOT NULL,
+ oauth_application_id integer,
+ enabled boolean DEFAULT true NOT NULL,
+ access_key character varying,
+ encrypted_secret_access_key character varying,
+ encrypted_secret_access_key_iv character varying,
+ clone_url_prefix character varying,
+ files_max_capacity integer DEFAULT 10 NOT NULL,
+ repos_max_capacity integer DEFAULT 25 NOT NULL,
+ url character varying NOT NULL,
+ selective_sync_type character varying,
+ selective_sync_shards text,
+ verification_max_capacity integer DEFAULT 100 NOT NULL,
+ minimum_reverification_interval integer DEFAULT 7 NOT NULL,
+ internal_url character varying,
+ name character varying NOT NULL,
+ container_repositories_max_capacity integer DEFAULT 10 NOT NULL,
+ sync_object_storage boolean DEFAULT false NOT NULL,
+ created_at timestamp with time zone,
+ updated_at timestamp with time zone
+);
+
+CREATE SEQUENCE geo_nodes_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE geo_nodes_id_seq OWNED BY geo_nodes.id;
+
+CREATE TABLE geo_repositories_changed_events (
+ id bigint NOT NULL,
+ geo_node_id integer NOT NULL
+);
+
+CREATE SEQUENCE geo_repositories_changed_events_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE geo_repositories_changed_events_id_seq OWNED BY geo_repositories_changed_events.id;
+
+CREATE TABLE geo_repository_created_events (
+ id bigint NOT NULL,
+ project_id integer NOT NULL,
+ repository_storage_name text NOT NULL,
+ repo_path text NOT NULL,
+ wiki_path text,
+ project_name text NOT NULL
+);
+
+CREATE SEQUENCE geo_repository_created_events_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE geo_repository_created_events_id_seq OWNED BY geo_repository_created_events.id;
+
+CREATE TABLE geo_repository_deleted_events (
+ id bigint NOT NULL,
+ project_id integer NOT NULL,
+ repository_storage_name text NOT NULL,
+ deleted_path text NOT NULL,
+ deleted_wiki_path text,
+ deleted_project_name text NOT NULL
+);
+
+CREATE SEQUENCE geo_repository_deleted_events_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE geo_repository_deleted_events_id_seq OWNED BY geo_repository_deleted_events.id;
+
+CREATE TABLE geo_repository_renamed_events (
+ id bigint NOT NULL,
+ project_id integer NOT NULL,
+ repository_storage_name text NOT NULL,
+ old_path_with_namespace text NOT NULL,
+ new_path_with_namespace text NOT NULL,
+ old_wiki_path_with_namespace text NOT NULL,
+ new_wiki_path_with_namespace text NOT NULL,
+ old_path text NOT NULL,
+ new_path text NOT NULL
+);
+
+CREATE SEQUENCE geo_repository_renamed_events_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE geo_repository_renamed_events_id_seq OWNED BY geo_repository_renamed_events.id;
+
+CREATE TABLE geo_repository_updated_events (
+ id bigint NOT NULL,
+ branches_affected integer NOT NULL,
+ tags_affected integer NOT NULL,
+ project_id integer NOT NULL,
+ source smallint NOT NULL,
+ new_branch boolean DEFAULT false NOT NULL,
+ remove_branch boolean DEFAULT false NOT NULL,
+ ref text
+);
+
+CREATE SEQUENCE geo_repository_updated_events_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE geo_repository_updated_events_id_seq OWNED BY geo_repository_updated_events.id;
+
+CREATE TABLE geo_reset_checksum_events (
+ id bigint NOT NULL,
+ project_id integer NOT NULL
+);
+
+CREATE SEQUENCE geo_reset_checksum_events_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE geo_reset_checksum_events_id_seq OWNED BY geo_reset_checksum_events.id;
+
+CREATE TABLE geo_upload_deleted_events (
+ id bigint NOT NULL,
+ upload_id integer NOT NULL,
+ file_path character varying NOT NULL,
+ model_id integer NOT NULL,
+ model_type character varying NOT NULL,
+ uploader character varying NOT NULL
+);
+
+CREATE SEQUENCE geo_upload_deleted_events_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE geo_upload_deleted_events_id_seq OWNED BY geo_upload_deleted_events.id;
+
+CREATE TABLE gitlab_subscription_histories (
+ id bigint NOT NULL,
+ gitlab_subscription_created_at timestamp with time zone,
+ gitlab_subscription_updated_at timestamp with time zone,
+ start_date date,
+ end_date date,
+ trial_ends_on date,
+ namespace_id integer,
+ hosted_plan_id integer,
+ max_seats_used integer,
+ seats integer,
+ trial boolean,
+ change_type smallint,
+ gitlab_subscription_id bigint NOT NULL,
+ created_at timestamp with time zone,
+ trial_starts_on date
+);
+
+CREATE SEQUENCE gitlab_subscription_histories_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE gitlab_subscription_histories_id_seq OWNED BY gitlab_subscription_histories.id;
+
+CREATE TABLE gitlab_subscriptions (
+ id bigint NOT NULL,
+ created_at timestamp with time zone NOT NULL,
+ updated_at timestamp with time zone NOT NULL,
+ start_date date,
+ end_date date,
+ trial_ends_on date,
+ namespace_id integer,
+ hosted_plan_id integer,
+ max_seats_used integer DEFAULT 0,
+ seats integer DEFAULT 0,
+ trial boolean DEFAULT false,
+ trial_starts_on date
+);
+
+CREATE SEQUENCE gitlab_subscriptions_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE gitlab_subscriptions_id_seq OWNED BY gitlab_subscriptions.id;
+
+CREATE TABLE gpg_key_subkeys (
+ id integer NOT NULL,
+ gpg_key_id integer NOT NULL,
+ keyid bytea,
+ fingerprint bytea
+);
+
+CREATE SEQUENCE gpg_key_subkeys_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE gpg_key_subkeys_id_seq OWNED BY gpg_key_subkeys.id;
+
+CREATE TABLE gpg_keys (
+ id integer NOT NULL,
+ created_at timestamp with time zone NOT NULL,
+ updated_at timestamp with time zone NOT NULL,
+ user_id integer,
+ primary_keyid bytea,
+ fingerprint bytea,
+ key text
+);
+
+CREATE SEQUENCE gpg_keys_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE gpg_keys_id_seq OWNED BY gpg_keys.id;
+
+CREATE TABLE gpg_signatures (
+ id integer NOT NULL,
+ created_at timestamp with time zone NOT NULL,
+ updated_at timestamp with time zone NOT NULL,
+ project_id integer,
+ gpg_key_id integer,
+ commit_sha bytea,
+ gpg_key_primary_keyid bytea,
+ gpg_key_user_name text,
+ gpg_key_user_email text,
+ verification_status smallint DEFAULT 0 NOT NULL,
+ gpg_key_subkey_id integer
+);
+
+CREATE SEQUENCE gpg_signatures_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE gpg_signatures_id_seq OWNED BY gpg_signatures.id;
+
+CREATE TABLE grafana_integrations (
+ id bigint NOT NULL,
+ project_id bigint NOT NULL,
+ created_at timestamp with time zone NOT NULL,
+ updated_at timestamp with time zone NOT NULL,
+ encrypted_token character varying(255) NOT NULL,
+ encrypted_token_iv character varying(255) NOT NULL,
+ grafana_url character varying(1024) NOT NULL,
+ enabled boolean DEFAULT false NOT NULL
+);
+
+CREATE SEQUENCE grafana_integrations_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE grafana_integrations_id_seq OWNED BY grafana_integrations.id;
+
+CREATE TABLE group_custom_attributes (
+ id integer NOT NULL,
+ created_at timestamp with time zone NOT NULL,
+ updated_at timestamp with time zone NOT NULL,
+ group_id integer NOT NULL,
+ key character varying NOT NULL,
+ value character varying NOT NULL
+);
+
+CREATE SEQUENCE group_custom_attributes_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE group_custom_attributes_id_seq OWNED BY group_custom_attributes.id;
+
+CREATE TABLE group_deletion_schedules (
+ group_id bigint NOT NULL,
+ user_id bigint NOT NULL,
+ marked_for_deletion_on date NOT NULL
+);
+
+CREATE TABLE group_group_links (
+ id bigint NOT NULL,
+ created_at timestamp with time zone NOT NULL,
+ updated_at timestamp with time zone NOT NULL,
+ shared_group_id bigint NOT NULL,
+ shared_with_group_id bigint NOT NULL,
+ expires_at date,
+ group_access smallint DEFAULT 30 NOT NULL
+);
+
+CREATE SEQUENCE group_group_links_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE group_group_links_id_seq OWNED BY group_group_links.id;
+
+CREATE TABLE historical_data (
+ id integer NOT NULL,
+ date date NOT NULL,
+ active_user_count integer,
+ created_at timestamp without time zone,
+ updated_at timestamp without time zone
+);
+
+CREATE SEQUENCE historical_data_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE historical_data_id_seq OWNED BY historical_data.id;
+
+CREATE TABLE identities (
+ id integer NOT NULL,
+ extern_uid character varying,
+ provider character varying,
+ user_id integer,
+ created_at timestamp without time zone,
+ updated_at timestamp without time zone,
+ saml_provider_id integer,
+ secondary_extern_uid character varying
+);
+
+CREATE SEQUENCE identities_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE identities_id_seq OWNED BY identities.id;
+
+CREATE TABLE import_export_uploads (
+ id integer NOT NULL,
+ updated_at timestamp with time zone NOT NULL,
+ project_id integer,
+ import_file text,
+ export_file text,
+ group_id bigint
+);
+
+CREATE SEQUENCE import_export_uploads_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE import_export_uploads_id_seq OWNED BY import_export_uploads.id;
+
+CREATE TABLE import_failures (
+ id bigint NOT NULL,
+ relation_index integer,
+ project_id bigint NOT NULL,
+ created_at timestamp with time zone NOT NULL,
+ relation_key character varying(64),
+ exception_class character varying(128),
+ correlation_id_value character varying(128),
+ exception_message character varying(255)
+);
+
+CREATE SEQUENCE import_failures_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE import_failures_id_seq OWNED BY import_failures.id;
+
+CREATE TABLE index_statuses (
+ id integer NOT NULL,
+ project_id integer NOT NULL,
+ indexed_at timestamp without time zone,
+ note text,
+ last_commit character varying,
+ created_at timestamp without time zone NOT NULL,
+ updated_at timestamp without time zone NOT NULL,
+ last_wiki_commit bytea,
+ wiki_indexed_at timestamp with time zone
+);
+
+CREATE SEQUENCE index_statuses_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE index_statuses_id_seq OWNED BY index_statuses.id;
+
+CREATE TABLE insights (
+ id integer NOT NULL,
+ namespace_id integer NOT NULL,
+ project_id integer NOT NULL
+);
+
+CREATE SEQUENCE insights_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE insights_id_seq OWNED BY insights.id;
+
+CREATE TABLE internal_ids (
+ id bigint NOT NULL,
+ project_id integer,
+ usage integer NOT NULL,
+ last_value integer NOT NULL,
+ namespace_id integer
+);
+
+CREATE SEQUENCE internal_ids_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE internal_ids_id_seq OWNED BY internal_ids.id;
+
+CREATE TABLE ip_restrictions (
+ id bigint NOT NULL,
+ group_id integer NOT NULL,
+ range character varying NOT NULL
+);
+
+CREATE SEQUENCE ip_restrictions_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE ip_restrictions_id_seq OWNED BY ip_restrictions.id;
+
+CREATE TABLE issue_assignees (
+ user_id integer NOT NULL,
+ issue_id integer NOT NULL
+);
+
+CREATE TABLE issue_links (
+ id integer NOT NULL,
+ source_id integer NOT NULL,
+ target_id integer NOT NULL,
+ created_at timestamp without time zone,
+ updated_at timestamp without time zone,
+ link_type smallint DEFAULT 0 NOT NULL
+);
+
+CREATE SEQUENCE issue_links_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE issue_links_id_seq OWNED BY issue_links.id;
+
+CREATE TABLE issue_metrics (
+ id integer NOT NULL,
+ issue_id integer NOT NULL,
+ first_mentioned_in_commit_at timestamp without time zone,
+ first_associated_with_milestone_at timestamp without time zone,
+ first_added_to_board_at timestamp without time zone,
+ created_at timestamp without time zone NOT NULL,
+ updated_at timestamp without time zone NOT NULL
+);
+
+CREATE SEQUENCE issue_metrics_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE issue_metrics_id_seq OWNED BY issue_metrics.id;
+
+CREATE TABLE issue_milestones (
+ issue_id bigint NOT NULL,
+ milestone_id bigint NOT NULL
+);
+
+CREATE TABLE issue_tracker_data (
+ id bigint NOT NULL,
+ service_id integer NOT NULL,
+ created_at timestamp with time zone NOT NULL,
+ updated_at timestamp with time zone NOT NULL,
+ encrypted_project_url character varying,
+ encrypted_project_url_iv character varying,
+ encrypted_issues_url character varying,
+ encrypted_issues_url_iv character varying,
+ encrypted_new_issue_url character varying,
+ encrypted_new_issue_url_iv character varying
+);
+
+CREATE SEQUENCE issue_tracker_data_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE issue_tracker_data_id_seq OWNED BY issue_tracker_data.id;
+
+CREATE TABLE issue_user_mentions (
+ id bigint NOT NULL,
+ issue_id integer NOT NULL,
+ note_id integer,
+ mentioned_users_ids integer[],
+ mentioned_projects_ids integer[],
+ mentioned_groups_ids integer[]
+);
+
+CREATE SEQUENCE issue_user_mentions_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE issue_user_mentions_id_seq OWNED BY issue_user_mentions.id;
+
+CREATE TABLE issues (
+ id integer NOT NULL,
+ title character varying,
+ author_id integer,
+ project_id integer,
+ created_at timestamp without time zone,
+ updated_at timestamp without time zone,
+ description text,
+ milestone_id integer,
+ state character varying,
+ iid integer,
+ updated_by_id integer,
+ confidential boolean DEFAULT false NOT NULL,
+ due_date date,
+ moved_to_id integer,
+ lock_version integer,
+ title_html text,
+ description_html text,
+ time_estimate integer,
+ relative_position integer,
+ cached_markdown_version integer,
+ last_edited_at timestamp without time zone,
+ last_edited_by_id integer,
+ discussion_locked boolean,
+ closed_at timestamp with time zone,
+ closed_by_id integer,
+ state_id smallint DEFAULT 1 NOT NULL,
+ service_desk_reply_to character varying,
+ weight integer,
+ duplicated_to_id integer,
+ promoted_to_epic_id integer
+);
+
+CREATE SEQUENCE issues_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE issues_id_seq OWNED BY issues.id;
+
+CREATE TABLE issues_prometheus_alert_events (
+ issue_id bigint NOT NULL,
+ prometheus_alert_event_id bigint NOT NULL,
+ created_at timestamp with time zone NOT NULL,
+ updated_at timestamp with time zone NOT NULL
+);
+
+CREATE TABLE issues_self_managed_prometheus_alert_events (
+ issue_id bigint NOT NULL,
+ self_managed_prometheus_alert_event_id bigint NOT NULL,
+ created_at timestamp with time zone NOT NULL,
+ updated_at timestamp with time zone NOT NULL
+);
+
+CREATE TABLE jira_connect_installations (
+ id bigint NOT NULL,
+ client_key character varying,
+ encrypted_shared_secret character varying,
+ encrypted_shared_secret_iv character varying,
+ base_url character varying
+);
+
+CREATE SEQUENCE jira_connect_installations_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE jira_connect_installations_id_seq OWNED BY jira_connect_installations.id;
+
+CREATE TABLE jira_connect_subscriptions (
+ id bigint NOT NULL,
+ created_at timestamp with time zone NOT NULL,
+ jira_connect_installation_id bigint NOT NULL,
+ namespace_id integer NOT NULL,
+ updated_at timestamp with time zone NOT NULL
+);
+
+CREATE SEQUENCE jira_connect_subscriptions_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE jira_connect_subscriptions_id_seq OWNED BY jira_connect_subscriptions.id;
+
+CREATE TABLE jira_tracker_data (
+ id bigint NOT NULL,
+ service_id integer NOT NULL,
+ created_at timestamp with time zone NOT NULL,
+ updated_at timestamp with time zone NOT NULL,
+ encrypted_url character varying,
+ encrypted_url_iv character varying,
+ encrypted_api_url character varying,
+ encrypted_api_url_iv character varying,
+ encrypted_username character varying,
+ encrypted_username_iv character varying,
+ encrypted_password character varying,
+ encrypted_password_iv character varying,
+ jira_issue_transition_id character varying
+);
+
+CREATE SEQUENCE jira_tracker_data_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE jira_tracker_data_id_seq OWNED BY jira_tracker_data.id;
+
+CREATE TABLE keys (
+ id integer NOT NULL,
+ user_id integer,
+ created_at timestamp without time zone,
+ updated_at timestamp without time zone,
+ key text,
+ title character varying,
+ type character varying,
+ fingerprint character varying,
+ public boolean DEFAULT false NOT NULL,
+ last_used_at timestamp without time zone,
+ fingerprint_sha256 bytea
+);
+
+CREATE SEQUENCE keys_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE keys_id_seq OWNED BY keys.id;
+
+CREATE TABLE label_links (
+ id integer NOT NULL,
+ label_id integer,
+ target_id integer,
+ target_type character varying,
+ created_at timestamp without time zone,
+ updated_at timestamp without time zone
+);
+
+CREATE SEQUENCE label_links_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE label_links_id_seq OWNED BY label_links.id;
+
+CREATE TABLE label_priorities (
+ id integer NOT NULL,
+ project_id integer NOT NULL,
+ label_id integer NOT NULL,
+ priority integer NOT NULL,
+ created_at timestamp without time zone NOT NULL,
+ updated_at timestamp without time zone NOT NULL
+);
+
+CREATE SEQUENCE label_priorities_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE label_priorities_id_seq OWNED BY label_priorities.id;
+
+CREATE TABLE labels (
+ id integer NOT NULL,
+ title character varying,
+ color character varying,
+ project_id integer,
+ created_at timestamp without time zone,
+ updated_at timestamp without time zone,
+ template boolean DEFAULT false,
+ description character varying,
+ description_html text,
+ type character varying,
+ group_id integer,
+ cached_markdown_version integer
+);
+
+CREATE SEQUENCE labels_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE labels_id_seq OWNED BY labels.id;
+
+CREATE TABLE ldap_group_links (
+ id integer NOT NULL,
+ cn character varying,
+ group_access integer NOT NULL,
+ group_id integer NOT NULL,
+ created_at timestamp without time zone,
+ updated_at timestamp without time zone,
+ provider character varying,
+ filter character varying
+);
+
+CREATE SEQUENCE ldap_group_links_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE ldap_group_links_id_seq OWNED BY ldap_group_links.id;
+
+CREATE TABLE lfs_file_locks (
+ id integer NOT NULL,
+ project_id integer NOT NULL,
+ user_id integer NOT NULL,
+ created_at timestamp without time zone NOT NULL,
+ path character varying(511)
+);
+
+CREATE SEQUENCE lfs_file_locks_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE lfs_file_locks_id_seq OWNED BY lfs_file_locks.id;
+
+CREATE TABLE lfs_objects (
+ id integer NOT NULL,
+ oid character varying NOT NULL,
+ size bigint NOT NULL,
+ created_at timestamp without time zone,
+ updated_at timestamp without time zone,
+ file character varying,
+ file_store integer
+);
+
+CREATE SEQUENCE lfs_objects_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE lfs_objects_id_seq OWNED BY lfs_objects.id;
+
+CREATE TABLE lfs_objects_projects (
+ id integer NOT NULL,
+ lfs_object_id integer NOT NULL,
+ project_id integer NOT NULL,
+ created_at timestamp without time zone,
+ updated_at timestamp without time zone,
+ repository_type smallint
+);
+
+CREATE SEQUENCE lfs_objects_projects_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE lfs_objects_projects_id_seq OWNED BY lfs_objects_projects.id;
+
+CREATE TABLE licenses (
+ id integer NOT NULL,
+ data text NOT NULL,
+ created_at timestamp without time zone,
+ updated_at timestamp without time zone
+);
+
+CREATE SEQUENCE licenses_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE licenses_id_seq OWNED BY licenses.id;
+
+CREATE TABLE list_user_preferences (
+ id bigint NOT NULL,
+ user_id bigint NOT NULL,
+ list_id bigint NOT NULL,
+ created_at timestamp with time zone NOT NULL,
+ updated_at timestamp with time zone NOT NULL,
+ collapsed boolean
+);
+
+CREATE SEQUENCE list_user_preferences_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE list_user_preferences_id_seq OWNED BY list_user_preferences.id;
+
+CREATE TABLE lists (
+ id integer NOT NULL,
+ board_id integer NOT NULL,
+ label_id integer,
+ list_type integer DEFAULT 1 NOT NULL,
+ "position" integer,
+ created_at timestamp without time zone NOT NULL,
+ updated_at timestamp without time zone NOT NULL,
+ milestone_id integer,
+ user_id integer,
+ max_issue_count integer DEFAULT 0 NOT NULL,
+ max_issue_weight integer DEFAULT 0 NOT NULL
+);
+
+CREATE SEQUENCE lists_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE lists_id_seq OWNED BY lists.id;
+
+CREATE TABLE members (
+ id integer NOT NULL,
+ access_level integer NOT NULL,
+ source_id integer NOT NULL,
+ source_type character varying NOT NULL,
+ user_id integer,
+ notification_level integer NOT NULL,
+ type character varying,
+ created_at timestamp without time zone,
+ updated_at timestamp without time zone,
+ created_by_id integer,
+ invite_email character varying,
+ invite_token character varying,
+ invite_accepted_at timestamp without time zone,
+ requested_at timestamp without time zone,
+ expires_at date,
+ ldap boolean DEFAULT false NOT NULL,
+ override boolean DEFAULT false NOT NULL
+);
+
+CREATE SEQUENCE members_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE members_id_seq OWNED BY members.id;
+
+CREATE TABLE merge_request_assignees (
+ id integer NOT NULL,
+ user_id integer NOT NULL,
+ merge_request_id integer NOT NULL
+);
+
+CREATE SEQUENCE merge_request_assignees_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE merge_request_assignees_id_seq OWNED BY merge_request_assignees.id;
+
+CREATE TABLE merge_request_blocks (
+ id bigint NOT NULL,
+ blocking_merge_request_id integer NOT NULL,
+ blocked_merge_request_id integer NOT NULL,
+ created_at timestamp with time zone NOT NULL,
+ updated_at timestamp with time zone NOT NULL
+);
+
+CREATE SEQUENCE merge_request_blocks_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE merge_request_blocks_id_seq OWNED BY merge_request_blocks.id;
+
+CREATE TABLE merge_request_context_commit_diff_files (
+ merge_request_context_commit_id bigint,
+ sha bytea NOT NULL,
+ relative_order integer NOT NULL,
+ a_mode character varying(255) NOT NULL,
+ b_mode character varying(255) NOT NULL,
+ new_file boolean NOT NULL,
+ renamed_file boolean NOT NULL,
+ deleted_file boolean NOT NULL,
+ too_large boolean NOT NULL,
+ "binary" boolean,
+ new_path text NOT NULL,
+ old_path text NOT NULL,
+ diff text
+);
+
+CREATE TABLE merge_request_context_commits (
+ id bigint NOT NULL,
+ merge_request_id bigint,
+ authored_date timestamp with time zone,
+ committed_date timestamp with time zone,
+ sha bytea NOT NULL,
+ relative_order integer NOT NULL,
+ author_name text,
+ author_email text,
+ committer_name text,
+ committer_email text,
+ message text
+);
+
+CREATE SEQUENCE merge_request_context_commits_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE merge_request_context_commits_id_seq OWNED BY merge_request_context_commits.id;
+
+CREATE TABLE merge_request_diff_commits (
+ authored_date timestamp with time zone,
+ committed_date timestamp with time zone,
+ merge_request_diff_id integer NOT NULL,
+ relative_order integer NOT NULL,
+ sha bytea NOT NULL,
+ author_name text,
+ author_email text,
+ committer_name text,
+ committer_email text,
+ message text
+);
+
+CREATE TABLE merge_request_diff_files (
+ merge_request_diff_id integer NOT NULL,
+ relative_order integer NOT NULL,
+ new_file boolean NOT NULL,
+ renamed_file boolean NOT NULL,
+ deleted_file boolean NOT NULL,
+ too_large boolean NOT NULL,
+ a_mode character varying NOT NULL,
+ b_mode character varying NOT NULL,
+ new_path text NOT NULL,
+ old_path text NOT NULL,
+ diff text,
+ "binary" boolean,
+ external_diff_offset integer,
+ external_diff_size integer
+);
+
+CREATE TABLE merge_request_diffs (
+ id integer NOT NULL,
+ state character varying,
+ merge_request_id integer NOT NULL,
+ created_at timestamp without time zone,
+ updated_at timestamp without time zone,
+ base_commit_sha character varying,
+ real_size character varying,
+ head_commit_sha character varying,
+ start_commit_sha character varying,
+ commits_count integer,
+ external_diff character varying,
+ external_diff_store integer,
+ stored_externally boolean
+);
+
+CREATE SEQUENCE merge_request_diffs_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE merge_request_diffs_id_seq OWNED BY merge_request_diffs.id;
+
+CREATE TABLE merge_request_metrics (
+ id integer NOT NULL,
+ merge_request_id integer NOT NULL,
+ latest_build_started_at timestamp without time zone,
+ latest_build_finished_at timestamp without time zone,
+ first_deployed_to_production_at timestamp without time zone,
+ merged_at timestamp without time zone,
+ created_at timestamp without time zone NOT NULL,
+ updated_at timestamp without time zone NOT NULL,
+ pipeline_id integer,
+ merged_by_id integer,
+ latest_closed_by_id integer,
+ latest_closed_at timestamp with time zone,
+ first_comment_at timestamp with time zone,
+ first_commit_at timestamp with time zone,
+ last_commit_at timestamp with time zone,
+ diff_size integer,
+ modified_paths_size integer,
+ commits_count integer
+);
+
+CREATE SEQUENCE merge_request_metrics_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE merge_request_metrics_id_seq OWNED BY merge_request_metrics.id;
+
+CREATE TABLE merge_request_milestones (
+ merge_request_id bigint NOT NULL,
+ milestone_id bigint NOT NULL
+);
+
+CREATE TABLE merge_request_user_mentions (
+ id bigint NOT NULL,
+ merge_request_id integer NOT NULL,
+ note_id integer,
+ mentioned_users_ids integer[],
+ mentioned_projects_ids integer[],
+ mentioned_groups_ids integer[]
+);
+
+CREATE SEQUENCE merge_request_user_mentions_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE merge_request_user_mentions_id_seq OWNED BY merge_request_user_mentions.id;
+
+CREATE TABLE merge_requests (
+ id integer NOT NULL,
+ target_branch character varying NOT NULL,
+ source_branch character varying NOT NULL,
+ source_project_id integer,
+ author_id integer,
+ assignee_id integer,
+ title character varying,
+ created_at timestamp without time zone,
+ updated_at timestamp without time zone,
+ milestone_id integer,
+ state character varying DEFAULT 'opened'::character varying NOT NULL,
+ merge_status character varying DEFAULT 'unchecked'::character varying NOT NULL,
+ target_project_id integer NOT NULL,
+ iid integer,
+ description text,
+ updated_by_id integer,
+ merge_error text,
+ merge_params text,
+ merge_when_pipeline_succeeds boolean DEFAULT false NOT NULL,
+ merge_user_id integer,
+ merge_commit_sha character varying,
+ rebase_commit_sha character varying,
+ in_progress_merge_commit_sha character varying,
+ lock_version integer,
+ title_html text,
+ description_html text,
+ time_estimate integer,
+ cached_markdown_version integer,
+ last_edited_at timestamp without time zone,
+ last_edited_by_id integer,
+ head_pipeline_id integer,
+ merge_jid character varying,
+ discussion_locked boolean,
+ latest_merge_request_diff_id integer,
+ allow_maintainer_to_push boolean,
+ squash boolean DEFAULT false NOT NULL,
+ state_id smallint DEFAULT 1 NOT NULL,
+ approvals_before_merge integer,
+ rebase_jid character varying,
+ squash_commit_sha bytea
+);
+
+CREATE TABLE merge_requests_closing_issues (
+ id integer NOT NULL,
+ merge_request_id integer NOT NULL,
+ issue_id integer NOT NULL,
+ created_at timestamp without time zone NOT NULL,
+ updated_at timestamp without time zone NOT NULL
+);
+
+CREATE SEQUENCE merge_requests_closing_issues_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE merge_requests_closing_issues_id_seq OWNED BY merge_requests_closing_issues.id;
+
+CREATE SEQUENCE merge_requests_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE merge_requests_id_seq OWNED BY merge_requests.id;
+
+CREATE TABLE merge_trains (
+ id bigint NOT NULL,
+ merge_request_id integer NOT NULL,
+ user_id integer NOT NULL,
+ pipeline_id integer,
+ created_at timestamp with time zone NOT NULL,
+ updated_at timestamp with time zone NOT NULL,
+ target_project_id integer NOT NULL,
+ target_branch text NOT NULL,
+ status smallint DEFAULT 0 NOT NULL
+);
+
+CREATE SEQUENCE merge_trains_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE merge_trains_id_seq OWNED BY merge_trains.id;
+
+CREATE TABLE milestone_releases (
+ milestone_id bigint NOT NULL,
+ release_id bigint NOT NULL
+);
+
+CREATE TABLE milestones (
+ id integer NOT NULL,
+ title character varying NOT NULL,
+ project_id integer,
+ description text,
+ due_date date,
+ created_at timestamp without time zone,
+ updated_at timestamp without time zone,
+ state character varying,
+ iid integer,
+ title_html text,
+ description_html text,
+ start_date date,
+ cached_markdown_version integer,
+ group_id integer
+);
+
+CREATE SEQUENCE milestones_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE milestones_id_seq OWNED BY milestones.id;
+
+CREATE TABLE namespace_aggregation_schedules (
+ namespace_id integer NOT NULL
+);
+
+CREATE SEQUENCE namespace_aggregation_schedules_namespace_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE namespace_aggregation_schedules_namespace_id_seq OWNED BY namespace_aggregation_schedules.namespace_id;
+
+CREATE TABLE namespace_root_storage_statistics (
+ namespace_id integer NOT NULL,
+ updated_at timestamp with time zone NOT NULL,
+ repository_size bigint DEFAULT 0 NOT NULL,
+ lfs_objects_size bigint DEFAULT 0 NOT NULL,
+ wiki_size bigint DEFAULT 0 NOT NULL,
+ build_artifacts_size bigint DEFAULT 0 NOT NULL,
+ storage_size bigint DEFAULT 0 NOT NULL,
+ packages_size bigint DEFAULT 0 NOT NULL
+);
+
+CREATE SEQUENCE namespace_root_storage_statistics_namespace_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE namespace_root_storage_statistics_namespace_id_seq OWNED BY namespace_root_storage_statistics.namespace_id;
+
+CREATE TABLE namespace_statistics (
+ id integer NOT NULL,
+ namespace_id integer NOT NULL,
+ shared_runners_seconds integer DEFAULT 0 NOT NULL,
+ shared_runners_seconds_last_reset timestamp without time zone
+);
+
+CREATE SEQUENCE namespace_statistics_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE namespace_statistics_id_seq OWNED BY namespace_statistics.id;
+
+CREATE TABLE namespaces (
+ id integer NOT NULL,
+ name character varying NOT NULL,
+ path character varying NOT NULL,
+ owner_id integer,
+ created_at timestamp without time zone,
+ updated_at timestamp without time zone,
+ type character varying,
+ description character varying DEFAULT ''::character varying NOT NULL,
+ avatar character varying,
+ share_with_group_lock boolean DEFAULT false,
+ visibility_level integer DEFAULT 20 NOT NULL,
+ request_access_enabled boolean DEFAULT true NOT NULL,
+ description_html text,
+ lfs_enabled boolean,
+ parent_id integer,
+ require_two_factor_authentication boolean DEFAULT false NOT NULL,
+ two_factor_grace_period integer DEFAULT 48 NOT NULL,
+ cached_markdown_version integer,
+ runners_token character varying,
+ project_creation_level integer,
+ runners_token_encrypted character varying,
+ auto_devops_enabled boolean,
+ custom_project_templates_group_id integer,
+ file_template_project_id integer,
+ ldap_sync_error character varying,
+ ldap_sync_last_successful_update_at timestamp without time zone,
+ ldap_sync_last_sync_at timestamp without time zone,
+ ldap_sync_last_update_at timestamp without time zone,
+ plan_id integer,
+ repository_size_limit bigint,
+ saml_discovery_token character varying,
+ shared_runners_minutes_limit integer,
+ trial_ends_on timestamp with time zone,
+ extra_shared_runners_minutes_limit integer,
+ ldap_sync_status character varying DEFAULT 'ready'::character varying NOT NULL,
+ membership_lock boolean DEFAULT false,
+ last_ci_minutes_notification_at timestamp with time zone,
+ last_ci_minutes_usage_notification_level integer,
+ subgroup_creation_level integer DEFAULT 1,
+ emails_disabled boolean,
+ max_pages_size integer,
+ max_artifacts_size integer,
+ mentions_disabled boolean
+);
+
+CREATE SEQUENCE namespaces_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE namespaces_id_seq OWNED BY namespaces.id;
+
+CREATE TABLE note_diff_files (
+ id integer NOT NULL,
+ diff_note_id integer NOT NULL,
+ diff text NOT NULL,
+ new_file boolean NOT NULL,
+ renamed_file boolean NOT NULL,
+ deleted_file boolean NOT NULL,
+ a_mode character varying NOT NULL,
+ b_mode character varying NOT NULL,
+ new_path text NOT NULL,
+ old_path text NOT NULL
+);
+
+CREATE SEQUENCE note_diff_files_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE note_diff_files_id_seq OWNED BY note_diff_files.id;
+
+CREATE TABLE notes (
+ id integer NOT NULL,
+ note text,
+ noteable_type character varying,
+ author_id integer,
+ created_at timestamp without time zone,
+ updated_at timestamp without time zone,
+ project_id integer,
+ attachment character varying,
+ line_code character varying,
+ commit_id character varying,
+ noteable_id integer,
+ system boolean DEFAULT false NOT NULL,
+ st_diff text,
+ updated_by_id integer,
+ type character varying,
+ "position" text,
+ original_position text,
+ resolved_at timestamp without time zone,
+ resolved_by_id integer,
+ discussion_id character varying,
+ note_html text,
+ cached_markdown_version integer,
+ change_position text,
+ resolved_by_push boolean,
+ review_id bigint
+);
+
+CREATE SEQUENCE notes_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE notes_id_seq OWNED BY notes.id;
+
+CREATE TABLE notification_settings (
+ id integer NOT NULL,
+ user_id integer NOT NULL,
+ source_type character varying,
+ source_id integer,
+ level integer DEFAULT 0 NOT NULL,
+ created_at timestamp without time zone NOT NULL,
+ updated_at timestamp without time zone NOT NULL,
+ new_note boolean,
+ new_issue boolean,
+ reopen_issue boolean,
+ close_issue boolean,
+ reassign_issue boolean,
+ new_merge_request boolean,
+ reopen_merge_request boolean,
+ close_merge_request boolean,
+ reassign_merge_request boolean,
+ merge_merge_request boolean,
+ failed_pipeline boolean,
+ success_pipeline boolean,
+ push_to_merge_request boolean,
+ issue_due boolean,
+ notification_email character varying,
+ new_epic boolean,
+ new_release boolean,
+ fixed_pipeline boolean
+);
+
+CREATE SEQUENCE notification_settings_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE notification_settings_id_seq OWNED BY notification_settings.id;
+
+CREATE TABLE oauth_access_grants (
+ id integer NOT NULL,
+ resource_owner_id integer NOT NULL,
+ application_id integer NOT NULL,
+ token character varying NOT NULL,
+ expires_in integer NOT NULL,
+ redirect_uri text NOT NULL,
+ created_at timestamp without time zone NOT NULL,
+ revoked_at timestamp without time zone,
+ scopes character varying
+);
+
+CREATE SEQUENCE oauth_access_grants_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE oauth_access_grants_id_seq OWNED BY oauth_access_grants.id;
+
+CREATE TABLE oauth_access_tokens (
+ id integer NOT NULL,
+ resource_owner_id integer,
+ application_id integer,
+ token character varying NOT NULL,
+ refresh_token character varying,
+ expires_in integer,
+ revoked_at timestamp without time zone,
+ created_at timestamp without time zone NOT NULL,
+ scopes character varying
+);
+
+CREATE SEQUENCE oauth_access_tokens_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE oauth_access_tokens_id_seq OWNED BY oauth_access_tokens.id;
+
+CREATE TABLE oauth_applications (
+ id integer NOT NULL,
+ name character varying NOT NULL,
+ uid character varying NOT NULL,
+ secret character varying NOT NULL,
+ redirect_uri text NOT NULL,
+ scopes character varying DEFAULT ''::character varying NOT NULL,
+ created_at timestamp without time zone,
+ updated_at timestamp without time zone,
+ owner_id integer,
+ owner_type character varying,
+ trusted boolean DEFAULT false NOT NULL,
+ confidential boolean DEFAULT true NOT NULL
+);
+
+CREATE SEQUENCE oauth_applications_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE oauth_applications_id_seq OWNED BY oauth_applications.id;
+
+CREATE TABLE oauth_openid_requests (
+ id integer NOT NULL,
+ access_grant_id integer NOT NULL,
+ nonce character varying NOT NULL
+);
+
+CREATE SEQUENCE oauth_openid_requests_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE oauth_openid_requests_id_seq OWNED BY oauth_openid_requests.id;
+
+CREATE TABLE operations_feature_flag_scopes (
+ id bigint NOT NULL,
+ feature_flag_id bigint NOT NULL,
+ created_at timestamp with time zone NOT NULL,
+ updated_at timestamp with time zone NOT NULL,
+ active boolean NOT NULL,
+ environment_scope character varying DEFAULT '*'::character varying NOT NULL,
+ strategies jsonb DEFAULT '[{"name": "default", "parameters": {}}]'::jsonb NOT NULL
+);
+
+CREATE SEQUENCE operations_feature_flag_scopes_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE operations_feature_flag_scopes_id_seq OWNED BY operations_feature_flag_scopes.id;
+
+CREATE TABLE operations_feature_flags (
+ id bigint NOT NULL,
+ project_id integer NOT NULL,
+ active boolean NOT NULL,
+ created_at timestamp with time zone NOT NULL,
+ updated_at timestamp with time zone NOT NULL,
+ name character varying NOT NULL,
+ description text
+);
+
+CREATE TABLE operations_feature_flags_clients (
+ id bigint NOT NULL,
+ project_id integer NOT NULL,
+ token_encrypted character varying
+);
+
+CREATE SEQUENCE operations_feature_flags_clients_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE operations_feature_flags_clients_id_seq OWNED BY operations_feature_flags_clients.id;
+
+CREATE SEQUENCE operations_feature_flags_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE operations_feature_flags_id_seq OWNED BY operations_feature_flags.id;
+
+CREATE TABLE packages_build_infos (
+ id bigint NOT NULL,
+ package_id integer NOT NULL,
+ pipeline_id integer
+);
+
+CREATE SEQUENCE packages_build_infos_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE packages_build_infos_id_seq OWNED BY packages_build_infos.id;
+
+CREATE TABLE packages_conan_file_metadata (
+ id bigint NOT NULL,
+ package_file_id bigint NOT NULL,
+ created_at timestamp with time zone NOT NULL,
+ updated_at timestamp with time zone NOT NULL,
+ recipe_revision character varying(255) DEFAULT '0'::character varying NOT NULL,
+ package_revision character varying(255),
+ conan_package_reference character varying(255),
+ conan_file_type smallint NOT NULL
+);
+
+CREATE SEQUENCE packages_conan_file_metadata_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE packages_conan_file_metadata_id_seq OWNED BY packages_conan_file_metadata.id;
+
+CREATE TABLE packages_conan_metadata (
+ id bigint NOT NULL,
+ package_id bigint NOT NULL,
+ created_at timestamp with time zone NOT NULL,
+ updated_at timestamp with time zone NOT NULL,
+ package_username character varying(255) NOT NULL,
+ package_channel character varying(255) NOT NULL
+);
+
+CREATE SEQUENCE packages_conan_metadata_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE packages_conan_metadata_id_seq OWNED BY packages_conan_metadata.id;
+
+CREATE TABLE packages_dependencies (
+ id bigint NOT NULL,
+ name character varying(255) NOT NULL,
+ version_pattern character varying(255) NOT NULL
+);
+
+CREATE SEQUENCE packages_dependencies_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE packages_dependencies_id_seq OWNED BY packages_dependencies.id;
+
+CREATE TABLE packages_dependency_links (
+ id bigint NOT NULL,
+ package_id bigint NOT NULL,
+ dependency_id bigint NOT NULL,
+ dependency_type smallint NOT NULL
+);
+
+CREATE SEQUENCE packages_dependency_links_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE packages_dependency_links_id_seq OWNED BY packages_dependency_links.id;
+
+CREATE TABLE packages_maven_metadata (
+ id bigint NOT NULL,
+ package_id bigint NOT NULL,
+ created_at timestamp with time zone NOT NULL,
+ updated_at timestamp with time zone NOT NULL,
+ app_group character varying NOT NULL,
+ app_name character varying NOT NULL,
+ app_version character varying,
+ path character varying(512) NOT NULL
+);
+
+CREATE SEQUENCE packages_maven_metadata_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE packages_maven_metadata_id_seq OWNED BY packages_maven_metadata.id;
+
+CREATE TABLE packages_package_files (
+ id bigint NOT NULL,
+ package_id bigint NOT NULL,
+ created_at timestamp with time zone NOT NULL,
+ updated_at timestamp with time zone NOT NULL,
+ size bigint,
+ file_type integer,
+ file_store integer,
+ file_md5 bytea,
+ file_sha1 bytea,
+ file_name character varying NOT NULL,
+ file text NOT NULL
+);
+
+CREATE SEQUENCE packages_package_files_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE packages_package_files_id_seq OWNED BY packages_package_files.id;
+
+CREATE TABLE packages_packages (
+ id bigint NOT NULL,
+ project_id integer NOT NULL,
+ created_at timestamp with time zone NOT NULL,
+ updated_at timestamp with time zone NOT NULL,
+ name character varying NOT NULL,
+ version character varying,
+ package_type smallint NOT NULL
+);
+
+CREATE SEQUENCE packages_packages_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE packages_packages_id_seq OWNED BY packages_packages.id;
+
+CREATE TABLE packages_tags (
+ id bigint NOT NULL,
+ package_id integer NOT NULL,
+ name character varying(255) NOT NULL
+);
+
+CREATE SEQUENCE packages_tags_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE packages_tags_id_seq OWNED BY packages_tags.id;
+
+CREATE TABLE pages_domain_acme_orders (
+ id bigint NOT NULL,
+ pages_domain_id integer NOT NULL,
+ expires_at timestamp with time zone NOT NULL,
+ created_at timestamp with time zone NOT NULL,
+ updated_at timestamp with time zone NOT NULL,
+ url character varying NOT NULL,
+ challenge_token character varying NOT NULL,
+ challenge_file_content text NOT NULL,
+ encrypted_private_key text NOT NULL,
+ encrypted_private_key_iv text NOT NULL
+);
+
+CREATE SEQUENCE pages_domain_acme_orders_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE pages_domain_acme_orders_id_seq OWNED BY pages_domain_acme_orders.id;
+
+CREATE TABLE pages_domains (
+ id integer NOT NULL,
+ project_id integer,
+ certificate text,
+ encrypted_key text,
+ encrypted_key_iv character varying,
+ encrypted_key_salt character varying,
+ domain character varying,
+ verified_at timestamp with time zone,
+ verification_code character varying NOT NULL,
+ enabled_until timestamp with time zone,
+ remove_at timestamp with time zone,
+ auto_ssl_enabled boolean DEFAULT false NOT NULL,
+ certificate_valid_not_before timestamp with time zone,
+ certificate_valid_not_after timestamp with time zone,
+ certificate_source smallint DEFAULT 0 NOT NULL,
+ wildcard boolean DEFAULT false NOT NULL,
+ domain_type smallint DEFAULT 2 NOT NULL
+);
+
+CREATE SEQUENCE pages_domains_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE pages_domains_id_seq OWNED BY pages_domains.id;
+
+CREATE TABLE path_locks (
+ id integer NOT NULL,
+ path character varying NOT NULL,
+ project_id integer,
+ user_id integer,
+ created_at timestamp without time zone NOT NULL,
+ updated_at timestamp without time zone NOT NULL
+);
+
+CREATE SEQUENCE path_locks_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE path_locks_id_seq OWNED BY path_locks.id;
+
+CREATE TABLE personal_access_tokens (
+ id integer NOT NULL,
+ user_id integer NOT NULL,
+ name character varying NOT NULL,
+ revoked boolean DEFAULT false,
+ expires_at date,
+ created_at timestamp without time zone NOT NULL,
+ updated_at timestamp without time zone NOT NULL,
+ scopes character varying DEFAULT '--- []
+'::character varying NOT NULL,
+ impersonation boolean DEFAULT false NOT NULL,
+ token_digest character varying,
+ expire_notification_delivered boolean DEFAULT false NOT NULL
+);
+
+CREATE SEQUENCE personal_access_tokens_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE personal_access_tokens_id_seq OWNED BY personal_access_tokens.id;
+
+CREATE TABLE plan_limits (
+ plan_id bigint NOT NULL,
+ ci_active_pipelines integer DEFAULT 0 NOT NULL,
+ ci_pipeline_size integer DEFAULT 0 NOT NULL,
+ ci_active_jobs integer DEFAULT 0 NOT NULL,
+ id bigint NOT NULL,
+ project_hooks integer DEFAULT 0 NOT NULL
+);
+
+CREATE SEQUENCE plan_limits_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE plan_limits_id_seq OWNED BY plan_limits.id;
+
+CREATE TABLE plans (
+ id integer NOT NULL,
+ created_at timestamp without time zone NOT NULL,
+ updated_at timestamp without time zone NOT NULL,
+ name character varying,
+ title character varying
+);
+
+CREATE SEQUENCE plans_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE plans_id_seq OWNED BY plans.id;
+
+CREATE TABLE pool_repositories (
+ id bigint NOT NULL,
+ shard_id integer NOT NULL,
+ disk_path character varying,
+ state character varying,
+ source_project_id integer
+);
+
+CREATE SEQUENCE pool_repositories_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE pool_repositories_id_seq OWNED BY pool_repositories.id;
+
+CREATE TABLE programming_languages (
+ id integer NOT NULL,
+ name character varying NOT NULL,
+ color character varying NOT NULL,
+ created_at timestamp with time zone NOT NULL
+);
+
+CREATE SEQUENCE programming_languages_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE programming_languages_id_seq OWNED BY programming_languages.id;
+
+CREATE TABLE project_alerting_settings (
+ project_id integer NOT NULL,
+ encrypted_token character varying NOT NULL,
+ encrypted_token_iv character varying NOT NULL
+);
+
+CREATE TABLE project_aliases (
+ id bigint NOT NULL,
+ project_id integer NOT NULL,
+ name character varying NOT NULL,
+ created_at timestamp with time zone NOT NULL,
+ updated_at timestamp with time zone NOT NULL
+);
+
+CREATE SEQUENCE project_aliases_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE project_aliases_id_seq OWNED BY project_aliases.id;
+
+CREATE TABLE project_authorizations (
+ user_id integer NOT NULL,
+ project_id integer NOT NULL,
+ access_level integer NOT NULL
+);
+
+CREATE TABLE project_auto_devops (
+ id integer NOT NULL,
+ project_id integer NOT NULL,
+ created_at timestamp with time zone NOT NULL,
+ updated_at timestamp with time zone NOT NULL,
+ enabled boolean,
+ deploy_strategy integer DEFAULT 0 NOT NULL
+);
+
+CREATE SEQUENCE project_auto_devops_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE project_auto_devops_id_seq OWNED BY project_auto_devops.id;
+
+CREATE TABLE project_ci_cd_settings (
+ id integer NOT NULL,
+ project_id integer NOT NULL,
+ group_runners_enabled boolean DEFAULT true NOT NULL,
+ merge_pipelines_enabled boolean,
+ default_git_depth integer
+);
+
+CREATE SEQUENCE project_ci_cd_settings_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE project_ci_cd_settings_id_seq OWNED BY project_ci_cd_settings.id;
+
+CREATE TABLE project_custom_attributes (
+ id integer NOT NULL,
+ created_at timestamp with time zone NOT NULL,
+ updated_at timestamp with time zone NOT NULL,
+ project_id integer NOT NULL,
+ key character varying NOT NULL,
+ value character varying NOT NULL
+);
+
+CREATE SEQUENCE project_custom_attributes_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE project_custom_attributes_id_seq OWNED BY project_custom_attributes.id;
+
+CREATE TABLE project_daily_statistics (
+ id bigint NOT NULL,
+ project_id integer NOT NULL,
+ fetch_count integer NOT NULL,
+ date date
+);
+
+CREATE SEQUENCE project_daily_statistics_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE project_daily_statistics_id_seq OWNED BY project_daily_statistics.id;
+
+CREATE TABLE project_deploy_tokens (
+ id integer NOT NULL,
+ project_id integer NOT NULL,
+ deploy_token_id integer NOT NULL,
+ created_at timestamp with time zone NOT NULL
+);
+
+CREATE SEQUENCE project_deploy_tokens_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE project_deploy_tokens_id_seq OWNED BY project_deploy_tokens.id;
+
+CREATE TABLE project_error_tracking_settings (
+ project_id integer NOT NULL,
+ enabled boolean DEFAULT false NOT NULL,
+ api_url character varying,
+ encrypted_token character varying,
+ encrypted_token_iv character varying,
+ project_name character varying,
+ organization_name character varying
+);
+
+CREATE TABLE project_feature_usages (
+ project_id integer NOT NULL,
+ jira_dvcs_cloud_last_sync_at timestamp without time zone,
+ jira_dvcs_server_last_sync_at timestamp without time zone
+);
+
+CREATE TABLE project_features (
+ id integer NOT NULL,
+ project_id integer NOT NULL,
+ merge_requests_access_level integer,
+ issues_access_level integer,
+ wiki_access_level integer,
+ snippets_access_level integer DEFAULT 20 NOT NULL,
+ builds_access_level integer,
+ created_at timestamp without time zone,
+ updated_at timestamp without time zone,
+ repository_access_level integer DEFAULT 20 NOT NULL,
+ pages_access_level integer NOT NULL
+);
+
+CREATE SEQUENCE project_features_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE project_features_id_seq OWNED BY project_features.id;
+
+CREATE TABLE project_group_links (
+ id integer NOT NULL,
+ project_id integer NOT NULL,
+ group_id integer NOT NULL,
+ created_at timestamp without time zone,
+ updated_at timestamp without time zone,
+ group_access integer DEFAULT 30 NOT NULL,
+ expires_at date
+);
+
+CREATE SEQUENCE project_group_links_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE project_group_links_id_seq OWNED BY project_group_links.id;
+
+CREATE TABLE project_import_data (
+ id integer NOT NULL,
+ project_id integer,
+ data text,
+ encrypted_credentials text,
+ encrypted_credentials_iv character varying,
+ encrypted_credentials_salt character varying
+);
+
+CREATE SEQUENCE project_import_data_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE project_import_data_id_seq OWNED BY project_import_data.id;
+
+CREATE TABLE project_incident_management_settings (
+ project_id integer NOT NULL,
+ create_issue boolean DEFAULT true NOT NULL,
+ send_email boolean DEFAULT false NOT NULL,
+ issue_template_key text
+);
+
+CREATE TABLE project_metrics_settings (
+ project_id integer NOT NULL,
+ external_dashboard_url character varying NOT NULL
+);
+
+CREATE TABLE project_mirror_data (
+ id integer NOT NULL,
+ project_id integer NOT NULL,
+ status character varying,
+ jid character varying,
+ last_error text,
+ last_successful_update_at timestamp with time zone,
+ last_update_at timestamp with time zone,
+ last_update_scheduled_at timestamp without time zone,
+ last_update_started_at timestamp without time zone,
+ next_execution_timestamp timestamp without time zone,
+ retry_count integer DEFAULT 0 NOT NULL
+);
+
+CREATE SEQUENCE project_mirror_data_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE project_mirror_data_id_seq OWNED BY project_mirror_data.id;
+
+CREATE TABLE project_pages_metadata (
+ project_id bigint NOT NULL,
+ deployed boolean DEFAULT false NOT NULL
+);
+
+CREATE TABLE project_repositories (
+ id bigint NOT NULL,
+ shard_id integer NOT NULL,
+ disk_path character varying NOT NULL,
+ project_id integer NOT NULL
+);
+
+CREATE SEQUENCE project_repositories_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE project_repositories_id_seq OWNED BY project_repositories.id;
+
+CREATE TABLE project_repository_states (
+ id integer NOT NULL,
+ project_id integer NOT NULL,
+ repository_verification_checksum bytea,
+ wiki_verification_checksum bytea,
+ last_repository_verification_failure character varying,
+ last_wiki_verification_failure character varying,
+ repository_retry_at timestamp with time zone,
+ wiki_retry_at timestamp with time zone,
+ repository_retry_count integer,
+ wiki_retry_count integer,
+ last_repository_verification_ran_at timestamp with time zone,
+ last_wiki_verification_ran_at timestamp with time zone
+);
+
+CREATE SEQUENCE project_repository_states_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE project_repository_states_id_seq OWNED BY project_repository_states.id;
+
+CREATE TABLE project_settings (
+ created_at timestamp with time zone NOT NULL,
+ updated_at timestamp with time zone NOT NULL,
+ project_id integer NOT NULL
+);
+
+CREATE TABLE project_statistics (
+ id integer NOT NULL,
+ project_id integer NOT NULL,
+ namespace_id integer NOT NULL,
+ commit_count bigint DEFAULT 0 NOT NULL,
+ storage_size bigint DEFAULT 0 NOT NULL,
+ repository_size bigint DEFAULT 0 NOT NULL,
+ lfs_objects_size bigint DEFAULT 0 NOT NULL,
+ build_artifacts_size bigint DEFAULT 0 NOT NULL,
+ shared_runners_seconds bigint DEFAULT 0 NOT NULL,
+ shared_runners_seconds_last_reset timestamp without time zone,
+ packages_size bigint DEFAULT 0 NOT NULL,
+ wiki_size bigint
+);
+
+CREATE SEQUENCE project_statistics_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE project_statistics_id_seq OWNED BY project_statistics.id;
+
+CREATE TABLE project_tracing_settings (
+ id bigint NOT NULL,
+ created_at timestamp with time zone NOT NULL,
+ updated_at timestamp with time zone NOT NULL,
+ project_id integer NOT NULL,
+ external_url character varying NOT NULL
+);
+
+CREATE SEQUENCE project_tracing_settings_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE project_tracing_settings_id_seq OWNED BY project_tracing_settings.id;
+
+CREATE TABLE projects (
+ id integer NOT NULL,
+ name character varying,
+ path character varying,
+ description text,
+ created_at timestamp without time zone,
+ updated_at timestamp without time zone,
+ creator_id integer,
+ namespace_id integer NOT NULL,
+ last_activity_at timestamp without time zone,
+ import_url character varying,
+ visibility_level integer DEFAULT 0 NOT NULL,
+ archived boolean DEFAULT false NOT NULL,
+ avatar character varying,
+ star_count integer DEFAULT 0 NOT NULL,
+ merge_requests_rebase_enabled boolean DEFAULT false,
+ import_type character varying,
+ import_source character varying,
+ merge_requests_ff_only_enabled boolean DEFAULT false NOT NULL,
+ shared_runners_enabled boolean DEFAULT true NOT NULL,
+ runners_token character varying,
+ build_coverage_regex character varying,
+ build_allow_git_fetch boolean DEFAULT true NOT NULL,
+ build_timeout integer DEFAULT 3600 NOT NULL,
+ pending_delete boolean DEFAULT false,
+ public_builds boolean DEFAULT true NOT NULL,
+ last_repository_check_failed boolean,
+ last_repository_check_at timestamp without time zone,
+ container_registry_enabled boolean,
+ only_allow_merge_if_pipeline_succeeds boolean DEFAULT false NOT NULL,
+ has_external_issue_tracker boolean,
+ repository_storage character varying DEFAULT 'default'::character varying NOT NULL,
+ repository_read_only boolean,
+ request_access_enabled boolean DEFAULT true NOT NULL,
+ has_external_wiki boolean,
+ ci_config_path character varying,
+ lfs_enabled boolean,
+ description_html text,
+ only_allow_merge_if_all_discussions_are_resolved boolean,
+ printing_merge_request_link_enabled boolean DEFAULT true NOT NULL,
+ auto_cancel_pending_pipelines integer DEFAULT 1 NOT NULL,
+ cached_markdown_version integer,
+ delete_error text,
+ last_repository_updated_at timestamp without time zone,
+ storage_version smallint,
+ resolve_outdated_diff_discussions boolean,
+ external_authorization_classification_label character varying,
+ jobs_cache_index integer,
+ pages_https_only boolean DEFAULT true,
+ remote_mirror_available_overridden boolean,
+ pool_repository_id bigint,
+ runners_token_encrypted character varying,
+ bfg_object_map character varying,
+ detected_repository_languages boolean,
+ disable_overriding_approvers_per_merge_request boolean,
+ external_webhook_token character varying,
+ issues_template text,
+ merge_requests_author_approval boolean,
+ merge_requests_disable_committers_approval boolean,
+ merge_requests_template text,
+ mirror_last_successful_update_at timestamp without time zone,
+ mirror_last_update_at timestamp without time zone,
+ mirror_overwrites_diverged_branches boolean,
+ mirror_user_id integer,
+ only_mirror_protected_branches boolean,
+ packages_enabled boolean,
+ pull_mirror_available_overridden boolean,
+ repository_size_limit bigint,
+ require_password_to_approve boolean,
+ mirror boolean DEFAULT false NOT NULL,
+ mirror_trigger_builds boolean DEFAULT false NOT NULL,
+ reset_approvals_on_push boolean DEFAULT true,
+ service_desk_enabled boolean DEFAULT true,
+ approvals_before_merge integer DEFAULT 0 NOT NULL,
+ emails_disabled boolean,
+ max_pages_size integer,
+ max_artifacts_size integer,
+ pull_mirror_branch_prefix character varying(50),
+ marked_for_deletion_at date,
+ marked_for_deletion_by_user_id integer,
+ remove_source_branch_after_merge boolean,
+ suggestion_commit_message character varying(255)
+);
+
+CREATE SEQUENCE projects_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE projects_id_seq OWNED BY projects.id;
+
+CREATE TABLE prometheus_alert_events (
+ id bigint NOT NULL,
+ project_id integer NOT NULL,
+ prometheus_alert_id integer NOT NULL,
+ started_at timestamp with time zone NOT NULL,
+ ended_at timestamp with time zone,
+ status smallint,
+ payload_key character varying
+);
+
+CREATE SEQUENCE prometheus_alert_events_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE prometheus_alert_events_id_seq OWNED BY prometheus_alert_events.id;
+
+CREATE TABLE prometheus_alerts (
+ id integer NOT NULL,
+ created_at timestamp with time zone NOT NULL,
+ updated_at timestamp with time zone NOT NULL,
+ threshold double precision NOT NULL,
+ operator integer NOT NULL,
+ environment_id integer NOT NULL,
+ project_id integer NOT NULL,
+ prometheus_metric_id integer NOT NULL
+);
+
+CREATE SEQUENCE prometheus_alerts_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE prometheus_alerts_id_seq OWNED BY prometheus_alerts.id;
+
+CREATE TABLE prometheus_metrics (
+ id integer NOT NULL,
+ project_id integer,
+ title character varying NOT NULL,
+ query character varying NOT NULL,
+ y_label character varying NOT NULL,
+ unit character varying NOT NULL,
+ legend character varying,
+ "group" integer NOT NULL,
+ created_at timestamp with time zone NOT NULL,
+ updated_at timestamp with time zone NOT NULL,
+ common boolean DEFAULT false NOT NULL,
+ identifier character varying
+);
+
+CREATE SEQUENCE prometheus_metrics_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE prometheus_metrics_id_seq OWNED BY prometheus_metrics.id;
+
+CREATE TABLE protected_branch_merge_access_levels (
+ id integer NOT NULL,
+ protected_branch_id integer NOT NULL,
+ access_level integer DEFAULT 40,
+ created_at timestamp without time zone NOT NULL,
+ updated_at timestamp without time zone NOT NULL,
+ group_id integer,
+ user_id integer
+);
+
+CREATE SEQUENCE protected_branch_merge_access_levels_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE protected_branch_merge_access_levels_id_seq OWNED BY protected_branch_merge_access_levels.id;
+
+CREATE TABLE protected_branch_push_access_levels (
+ id integer NOT NULL,
+ protected_branch_id integer NOT NULL,
+ access_level integer DEFAULT 40,
+ created_at timestamp without time zone NOT NULL,
+ updated_at timestamp without time zone NOT NULL,
+ group_id integer,
+ user_id integer
+);
+
+CREATE SEQUENCE protected_branch_push_access_levels_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE protected_branch_push_access_levels_id_seq OWNED BY protected_branch_push_access_levels.id;
+
+CREATE TABLE protected_branch_unprotect_access_levels (
+ id integer NOT NULL,
+ protected_branch_id integer NOT NULL,
+ access_level integer DEFAULT 40,
+ user_id integer,
+ group_id integer
+);
+
+CREATE SEQUENCE protected_branch_unprotect_access_levels_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE protected_branch_unprotect_access_levels_id_seq OWNED BY protected_branch_unprotect_access_levels.id;
+
+CREATE TABLE protected_branches (
+ id integer NOT NULL,
+ project_id integer NOT NULL,
+ name character varying NOT NULL,
+ created_at timestamp without time zone,
+ updated_at timestamp without time zone,
+ code_owner_approval_required boolean DEFAULT false NOT NULL
+);
+
+CREATE SEQUENCE protected_branches_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE protected_branches_id_seq OWNED BY protected_branches.id;
+
+CREATE TABLE protected_environment_deploy_access_levels (
+ id integer NOT NULL,
+ created_at timestamp with time zone NOT NULL,
+ updated_at timestamp with time zone NOT NULL,
+ access_level integer DEFAULT 40,
+ protected_environment_id integer NOT NULL,
+ user_id integer,
+ group_id integer
+);
+
+CREATE SEQUENCE protected_environment_deploy_access_levels_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE protected_environment_deploy_access_levels_id_seq OWNED BY protected_environment_deploy_access_levels.id;
+
+CREATE TABLE protected_environments (
+ id integer NOT NULL,
+ project_id integer NOT NULL,
+ created_at timestamp with time zone NOT NULL,
+ updated_at timestamp with time zone NOT NULL,
+ name character varying NOT NULL
+);
+
+CREATE SEQUENCE protected_environments_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE protected_environments_id_seq OWNED BY protected_environments.id;
+
+CREATE TABLE protected_tag_create_access_levels (
+ id integer NOT NULL,
+ protected_tag_id integer NOT NULL,
+ access_level integer DEFAULT 40,
+ user_id integer,
+ group_id integer,
+ created_at timestamp without time zone NOT NULL,
+ updated_at timestamp without time zone NOT NULL
+);
+
+CREATE SEQUENCE protected_tag_create_access_levels_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE protected_tag_create_access_levels_id_seq OWNED BY protected_tag_create_access_levels.id;
+
+CREATE TABLE protected_tags (
+ id integer NOT NULL,
+ project_id integer NOT NULL,
+ name character varying NOT NULL,
+ created_at timestamp without time zone NOT NULL,
+ updated_at timestamp without time zone NOT NULL
+);
+
+CREATE SEQUENCE protected_tags_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE protected_tags_id_seq OWNED BY protected_tags.id;
+
+CREATE TABLE push_event_payloads (
+ commit_count bigint NOT NULL,
+ event_id integer NOT NULL,
+ action smallint NOT NULL,
+ ref_type smallint NOT NULL,
+ commit_from bytea,
+ commit_to bytea,
+ ref text,
+ commit_title character varying(70),
+ ref_count integer
+);
+
+CREATE TABLE push_rules (
+ id integer NOT NULL,
+ force_push_regex character varying,
+ delete_branch_regex character varying,
+ commit_message_regex character varying,
+ deny_delete_tag boolean,
+ project_id integer,
+ created_at timestamp without time zone,
+ updated_at timestamp without time zone,
+ author_email_regex character varying,
+ member_check boolean DEFAULT false NOT NULL,
+ file_name_regex character varying,
+ is_sample boolean DEFAULT false,
+ max_file_size integer DEFAULT 0 NOT NULL,
+ prevent_secrets boolean DEFAULT false NOT NULL,
+ branch_name_regex character varying,
+ reject_unsigned_commits boolean,
+ commit_committer_check boolean,
+ regexp_uses_re2 boolean DEFAULT true,
+ commit_message_negative_regex character varying
+);
+
+CREATE SEQUENCE push_rules_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE push_rules_id_seq OWNED BY push_rules.id;
+
+CREATE TABLE redirect_routes (
+ id integer NOT NULL,
+ source_id integer NOT NULL,
+ source_type character varying NOT NULL,
+ path character varying NOT NULL,
+ created_at timestamp without time zone NOT NULL,
+ updated_at timestamp without time zone NOT NULL
+);
+
+CREATE SEQUENCE redirect_routes_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE redirect_routes_id_seq OWNED BY redirect_routes.id;
+
+CREATE TABLE release_links (
+ id bigint NOT NULL,
+ release_id integer NOT NULL,
+ url character varying NOT NULL,
+ name character varying NOT NULL,
+ created_at timestamp with time zone NOT NULL,
+ updated_at timestamp with time zone NOT NULL
+);
+
+CREATE SEQUENCE release_links_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE release_links_id_seq OWNED BY release_links.id;
+
+CREATE TABLE releases (
+ id integer NOT NULL,
+ tag character varying,
+ description text,
+ project_id integer,
+ created_at timestamp without time zone NOT NULL,
+ updated_at timestamp without time zone NOT NULL,
+ description_html text,
+ cached_markdown_version integer,
+ author_id integer,
+ name character varying,
+ sha character varying,
+ released_at timestamp with time zone NOT NULL
+);
+
+CREATE SEQUENCE releases_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE releases_id_seq OWNED BY releases.id;
+
+CREATE TABLE remote_mirrors (
+ id integer NOT NULL,
+ project_id integer,
+ url character varying,
+ enabled boolean DEFAULT false,
+ update_status character varying,
+ last_update_at timestamp without time zone,
+ last_successful_update_at timestamp without time zone,
+ last_update_started_at timestamp without time zone,
+ last_error character varying,
+ only_protected_branches boolean DEFAULT false NOT NULL,
+ remote_name character varying,
+ encrypted_credentials text,
+ encrypted_credentials_iv character varying,
+ encrypted_credentials_salt character varying,
+ created_at timestamp without time zone NOT NULL,
+ updated_at timestamp without time zone NOT NULL,
+ error_notification_sent boolean
+);
+
+CREATE SEQUENCE remote_mirrors_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE remote_mirrors_id_seq OWNED BY remote_mirrors.id;
+
+CREATE TABLE repository_languages (
+ project_id integer NOT NULL,
+ programming_language_id integer NOT NULL,
+ share double precision NOT NULL
+);
+
+CREATE TABLE resource_label_events (
+ id bigint NOT NULL,
+ action integer NOT NULL,
+ issue_id integer,
+ merge_request_id integer,
+ label_id integer,
+ user_id integer,
+ created_at timestamp with time zone NOT NULL,
+ cached_markdown_version integer,
+ reference text,
+ reference_html text,
+ epic_id integer
+);
+
+CREATE SEQUENCE resource_label_events_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE resource_label_events_id_seq OWNED BY resource_label_events.id;
+
+CREATE TABLE resource_weight_events (
+ id bigint NOT NULL,
+ user_id bigint NOT NULL,
+ issue_id bigint NOT NULL,
+ weight integer,
+ created_at timestamp with time zone NOT NULL
+);
+
+CREATE SEQUENCE resource_weight_events_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE resource_weight_events_id_seq OWNED BY resource_weight_events.id;
+
+CREATE TABLE reviews (
+ id bigint NOT NULL,
+ author_id integer,
+ merge_request_id integer NOT NULL,
+ project_id integer NOT NULL,
+ created_at timestamp with time zone NOT NULL
+);
+
+CREATE SEQUENCE reviews_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE reviews_id_seq OWNED BY reviews.id;
+
+CREATE TABLE routes (
+ id integer NOT NULL,
+ source_id integer NOT NULL,
+ source_type character varying NOT NULL,
+ path character varying NOT NULL,
+ created_at timestamp without time zone,
+ updated_at timestamp without time zone,
+ name character varying
+);
+
+CREATE SEQUENCE routes_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE routes_id_seq OWNED BY routes.id;
+
+CREATE TABLE saml_providers (
+ id integer NOT NULL,
+ group_id integer NOT NULL,
+ enabled boolean NOT NULL,
+ certificate_fingerprint character varying NOT NULL,
+ sso_url character varying NOT NULL,
+ enforced_sso boolean DEFAULT false NOT NULL,
+ enforced_group_managed_accounts boolean DEFAULT false NOT NULL,
+ prohibited_outer_forks boolean DEFAULT false
+);
+
+CREATE SEQUENCE saml_providers_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE saml_providers_id_seq OWNED BY saml_providers.id;
+
+CREATE TABLE scim_oauth_access_tokens (
+ id integer NOT NULL,
+ created_at timestamp with time zone NOT NULL,
+ updated_at timestamp with time zone NOT NULL,
+ group_id integer NOT NULL,
+ token_encrypted character varying NOT NULL
+);
+
+CREATE SEQUENCE scim_oauth_access_tokens_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE scim_oauth_access_tokens_id_seq OWNED BY scim_oauth_access_tokens.id;
+
+CREATE TABLE self_managed_prometheus_alert_events (
+ id bigint NOT NULL,
+ project_id bigint NOT NULL,
+ environment_id bigint,
+ started_at timestamp with time zone NOT NULL,
+ ended_at timestamp with time zone,
+ status smallint NOT NULL,
+ title character varying(255) NOT NULL,
+ query_expression character varying(255),
+ payload_key character varying(255) NOT NULL
+);
+
+CREATE SEQUENCE self_managed_prometheus_alert_events_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE self_managed_prometheus_alert_events_id_seq OWNED BY self_managed_prometheus_alert_events.id;
+
+CREATE TABLE sent_notifications (
+ id integer NOT NULL,
+ project_id integer,
+ noteable_type character varying,
+ noteable_id integer,
+ recipient_id integer,
+ commit_id character varying,
+ reply_key character varying NOT NULL,
+ line_code character varying,
+ note_type character varying,
+ "position" text,
+ in_reply_to_discussion_id character varying
+);
+
+CREATE SEQUENCE sent_notifications_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE sent_notifications_id_seq OWNED BY sent_notifications.id;
+
+CREATE TABLE sentry_issues (
+ id bigint NOT NULL,
+ issue_id bigint NOT NULL,
+ sentry_issue_identifier bigint NOT NULL
+);
+
+CREATE SEQUENCE sentry_issues_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE sentry_issues_id_seq OWNED BY sentry_issues.id;
+
+CREATE TABLE serverless_domain_cluster (
+ pages_domain_id bigint NOT NULL,
+ clusters_applications_knative_id bigint NOT NULL,
+ creator_id bigint,
+ created_at timestamp with time zone NOT NULL,
+ updated_at timestamp with time zone NOT NULL,
+ uuid character varying(14) NOT NULL
+);
+
+CREATE TABLE service_desk_settings (
+ project_id bigint NOT NULL,
+ issue_template_key character varying(255),
+ outgoing_name character varying(255)
+);
+
+CREATE TABLE services (
+ id integer NOT NULL,
+ type character varying,
+ title character varying,
+ project_id integer,
+ created_at timestamp without time zone,
+ updated_at timestamp without time zone,
+ active boolean DEFAULT false NOT NULL,
+ properties text,
+ template boolean DEFAULT false,
+ push_events boolean DEFAULT true,
+ issues_events boolean DEFAULT true,
+ merge_requests_events boolean DEFAULT true,
+ tag_push_events boolean DEFAULT true,
+ note_events boolean DEFAULT true NOT NULL,
+ category character varying DEFAULT 'common'::character varying NOT NULL,
+ "default" boolean DEFAULT false,
+ wiki_page_events boolean DEFAULT true,
+ pipeline_events boolean DEFAULT false NOT NULL,
+ confidential_issues_events boolean DEFAULT true NOT NULL,
+ commit_events boolean DEFAULT true NOT NULL,
+ job_events boolean DEFAULT false NOT NULL,
+ confidential_note_events boolean DEFAULT true,
+ deployment_events boolean DEFAULT false NOT NULL,
+ description character varying(500),
+ comment_on_event_enabled boolean DEFAULT true NOT NULL
+);
+
+CREATE SEQUENCE services_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE services_id_seq OWNED BY services.id;
+
+CREATE TABLE shards (
+ id integer NOT NULL,
+ name character varying NOT NULL
+);
+
+CREATE SEQUENCE shards_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE shards_id_seq OWNED BY shards.id;
+
+CREATE TABLE slack_integrations (
+ id integer NOT NULL,
+ service_id integer NOT NULL,
+ team_id character varying NOT NULL,
+ team_name character varying NOT NULL,
+ alias character varying NOT NULL,
+ user_id character varying NOT NULL,
+ created_at timestamp without time zone NOT NULL,
+ updated_at timestamp without time zone NOT NULL
+);
+
+CREATE SEQUENCE slack_integrations_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE slack_integrations_id_seq OWNED BY slack_integrations.id;
+
+CREATE TABLE smartcard_identities (
+ id bigint NOT NULL,
+ user_id integer NOT NULL,
+ subject character varying NOT NULL,
+ issuer character varying NOT NULL
+);
+
+CREATE SEQUENCE smartcard_identities_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE smartcard_identities_id_seq OWNED BY smartcard_identities.id;
+
+CREATE TABLE snippet_user_mentions (
+ id bigint NOT NULL,
+ snippet_id integer NOT NULL,
+ note_id integer,
+ mentioned_users_ids integer[],
+ mentioned_projects_ids integer[],
+ mentioned_groups_ids integer[]
+);
+
+CREATE SEQUENCE snippet_user_mentions_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE snippet_user_mentions_id_seq OWNED BY snippet_user_mentions.id;
+
+CREATE TABLE snippets (
+ id integer NOT NULL,
+ title character varying,
+ content text,
+ author_id integer NOT NULL,
+ project_id integer,
+ created_at timestamp without time zone,
+ updated_at timestamp without time zone,
+ file_name character varying,
+ type character varying,
+ visibility_level integer DEFAULT 0 NOT NULL,
+ title_html text,
+ content_html text,
+ cached_markdown_version integer,
+ description text,
+ description_html text,
+ encrypted_secret_token character varying(255),
+ encrypted_secret_token_iv character varying(255),
+ secret boolean DEFAULT false NOT NULL,
+ repository_storage character varying(255) DEFAULT 'default'::character varying NOT NULL,
+ storage_version integer DEFAULT 2 NOT NULL
+);
+
+CREATE SEQUENCE snippets_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE snippets_id_seq OWNED BY snippets.id;
+
+CREATE TABLE software_license_policies (
+ id integer NOT NULL,
+ project_id integer NOT NULL,
+ software_license_id integer NOT NULL,
+ classification integer DEFAULT 0,
+ CONSTRAINT check_8e8751b568 CHECK ((classification IS NOT NULL))
+);
+
+CREATE SEQUENCE software_license_policies_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE software_license_policies_id_seq OWNED BY software_license_policies.id;
+
+CREATE TABLE software_licenses (
+ id integer NOT NULL,
+ name character varying NOT NULL,
+ spdx_identifier character varying(255)
+);
+
+CREATE SEQUENCE software_licenses_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE software_licenses_id_seq OWNED BY software_licenses.id;
+
+CREATE TABLE spam_logs (
+ id integer NOT NULL,
+ user_id integer,
+ source_ip character varying,
+ user_agent character varying,
+ via_api boolean,
+ noteable_type character varying,
+ title character varying,
+ description text,
+ created_at timestamp without time zone NOT NULL,
+ updated_at timestamp without time zone NOT NULL,
+ submitted_as_ham boolean DEFAULT false NOT NULL,
+ recaptcha_verified boolean DEFAULT false NOT NULL
+);
+
+CREATE SEQUENCE spam_logs_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE spam_logs_id_seq OWNED BY spam_logs.id;
+
+CREATE TABLE subscriptions (
+ id integer NOT NULL,
+ user_id integer,
+ subscribable_type character varying,
+ subscribable_id integer,
+ subscribed boolean,
+ created_at timestamp without time zone,
+ updated_at timestamp without time zone,
+ project_id integer
+);
+
+CREATE SEQUENCE subscriptions_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE subscriptions_id_seq OWNED BY subscriptions.id;
+
+CREATE TABLE suggestions (
+ id bigint NOT NULL,
+ note_id integer NOT NULL,
+ relative_order smallint NOT NULL,
+ applied boolean DEFAULT false NOT NULL,
+ commit_id character varying,
+ from_content text NOT NULL,
+ to_content text NOT NULL,
+ lines_above integer DEFAULT 0 NOT NULL,
+ lines_below integer DEFAULT 0 NOT NULL,
+ outdated boolean DEFAULT false NOT NULL
+);
+
+CREATE SEQUENCE suggestions_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE suggestions_id_seq OWNED BY suggestions.id;
+
+CREATE TABLE system_note_metadata (
+ id integer NOT NULL,
+ note_id integer NOT NULL,
+ commit_count integer,
+ action character varying,
+ created_at timestamp without time zone NOT NULL,
+ updated_at timestamp without time zone NOT NULL,
+ description_version_id bigint
+);
+
+CREATE SEQUENCE system_note_metadata_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE system_note_metadata_id_seq OWNED BY system_note_metadata.id;
+
+CREATE TABLE taggings (
+ id integer NOT NULL,
+ tag_id integer,
+ taggable_id integer,
+ taggable_type character varying,
+ tagger_id integer,
+ tagger_type character varying,
+ context character varying,
+ created_at timestamp without time zone
+);
+
+CREATE SEQUENCE taggings_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE taggings_id_seq OWNED BY taggings.id;
+
+CREATE TABLE tags (
+ id integer NOT NULL,
+ name character varying,
+ taggings_count integer DEFAULT 0
+);
+
+CREATE SEQUENCE tags_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE tags_id_seq OWNED BY tags.id;
+
+CREATE TABLE term_agreements (
+ id integer NOT NULL,
+ term_id integer NOT NULL,
+ user_id integer NOT NULL,
+ accepted boolean DEFAULT false NOT NULL,
+ created_at timestamp with time zone NOT NULL,
+ updated_at timestamp with time zone NOT NULL
+);
+
+CREATE SEQUENCE term_agreements_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE term_agreements_id_seq OWNED BY term_agreements.id;
+
+CREATE TABLE timelogs (
+ id integer NOT NULL,
+ time_spent integer NOT NULL,
+ user_id integer,
+ created_at timestamp without time zone NOT NULL,
+ updated_at timestamp without time zone NOT NULL,
+ issue_id integer,
+ merge_request_id integer,
+ spent_at timestamp with time zone
+);
+
+CREATE SEQUENCE timelogs_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE timelogs_id_seq OWNED BY timelogs.id;
+
+CREATE TABLE todos (
+ id integer NOT NULL,
+ user_id integer NOT NULL,
+ project_id integer,
+ target_type character varying NOT NULL,
+ target_id integer,
+ author_id integer NOT NULL,
+ action integer NOT NULL,
+ state character varying NOT NULL,
+ created_at timestamp without time zone,
+ updated_at timestamp without time zone,
+ note_id integer,
+ commit_id character varying,
+ group_id integer
+);
+
+CREATE SEQUENCE todos_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE todos_id_seq OWNED BY todos.id;
+
+CREATE TABLE trending_projects (
+ id integer NOT NULL,
+ project_id integer NOT NULL
+);
+
+CREATE SEQUENCE trending_projects_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE trending_projects_id_seq OWNED BY trending_projects.id;
+
+CREATE TABLE u2f_registrations (
+ id integer NOT NULL,
+ certificate text,
+ key_handle character varying,
+ public_key character varying,
+ counter integer,
+ user_id integer,
+ created_at timestamp without time zone NOT NULL,
+ updated_at timestamp without time zone NOT NULL,
+ name character varying
+);
+
+CREATE SEQUENCE u2f_registrations_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE u2f_registrations_id_seq OWNED BY u2f_registrations.id;
+
+CREATE TABLE uploads (
+ id integer NOT NULL,
+ size bigint NOT NULL,
+ path character varying(511) NOT NULL,
+ checksum character varying(64),
+ model_type character varying,
+ model_id integer,
+ uploader character varying NOT NULL,
+ created_at timestamp without time zone NOT NULL,
+ store integer,
+ mount_point character varying,
+ secret character varying
+);
+
+CREATE SEQUENCE uploads_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE uploads_id_seq OWNED BY uploads.id;
+
+CREATE TABLE user_agent_details (
+ id integer NOT NULL,
+ user_agent character varying NOT NULL,
+ ip_address character varying NOT NULL,
+ subject_id integer NOT NULL,
+ subject_type character varying NOT NULL,
+ submitted boolean DEFAULT false NOT NULL,
+ created_at timestamp without time zone NOT NULL,
+ updated_at timestamp without time zone NOT NULL
+);
+
+CREATE SEQUENCE user_agent_details_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE user_agent_details_id_seq OWNED BY user_agent_details.id;
+
+CREATE TABLE user_callouts (
+ id integer NOT NULL,
+ feature_name integer NOT NULL,
+ user_id integer NOT NULL
+);
+
+CREATE SEQUENCE user_callouts_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE user_callouts_id_seq OWNED BY user_callouts.id;
+
+CREATE TABLE user_custom_attributes (
+ id integer NOT NULL,
+ created_at timestamp with time zone NOT NULL,
+ updated_at timestamp with time zone NOT NULL,
+ user_id integer NOT NULL,
+ key character varying NOT NULL,
+ value character varying NOT NULL
+);
+
+CREATE SEQUENCE user_custom_attributes_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE user_custom_attributes_id_seq OWNED BY user_custom_attributes.id;
+
+CREATE TABLE user_interacted_projects (
+ user_id integer NOT NULL,
+ project_id integer NOT NULL
+);
+
+CREATE TABLE user_preferences (
+ id integer NOT NULL,
+ user_id integer NOT NULL,
+ issue_notes_filter smallint DEFAULT 0 NOT NULL,
+ merge_request_notes_filter smallint DEFAULT 0 NOT NULL,
+ created_at timestamp with time zone NOT NULL,
+ updated_at timestamp with time zone NOT NULL,
+ first_day_of_week integer,
+ issues_sort character varying,
+ merge_requests_sort character varying,
+ timezone character varying,
+ time_display_relative boolean,
+ time_format_in_24h boolean,
+ epic_notes_filter smallint DEFAULT 0 NOT NULL,
+ epics_sort character varying,
+ roadmap_epics_state integer,
+ roadmaps_sort character varying,
+ projects_sort character varying(64),
+ show_whitespace_in_diffs boolean DEFAULT true NOT NULL,
+ setup_for_company boolean,
+ sourcegraph_enabled boolean,
+ render_whitespace_in_code boolean,
+ tab_width smallint
+);
+
+CREATE SEQUENCE user_preferences_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE user_preferences_id_seq OWNED BY user_preferences.id;
+
+CREATE TABLE user_statuses (
+ user_id integer NOT NULL,
+ cached_markdown_version integer,
+ emoji character varying DEFAULT 'speech_balloon'::character varying NOT NULL,
+ message character varying(100),
+ message_html character varying
+);
+
+CREATE SEQUENCE user_statuses_user_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE user_statuses_user_id_seq OWNED BY user_statuses.user_id;
+
+CREATE TABLE user_synced_attributes_metadata (
+ id integer NOT NULL,
+ name_synced boolean DEFAULT false,
+ email_synced boolean DEFAULT false,
+ location_synced boolean DEFAULT false,
+ user_id integer NOT NULL,
+ provider character varying
+);
+
+CREATE SEQUENCE user_synced_attributes_metadata_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE user_synced_attributes_metadata_id_seq OWNED BY user_synced_attributes_metadata.id;
+
+CREATE TABLE users (
+ id integer NOT NULL,
+ email character varying DEFAULT ''::character varying NOT NULL,
+ encrypted_password character varying DEFAULT ''::character varying NOT NULL,
+ reset_password_token character varying,
+ reset_password_sent_at timestamp without time zone,
+ remember_created_at timestamp without time zone,
+ sign_in_count integer DEFAULT 0,
+ current_sign_in_at timestamp without time zone,
+ last_sign_in_at timestamp without time zone,
+ current_sign_in_ip character varying,
+ last_sign_in_ip character varying,
+ created_at timestamp without time zone,
+ updated_at timestamp without time zone,
+ name character varying,
+ admin boolean DEFAULT false NOT NULL,
+ projects_limit integer NOT NULL,
+ skype character varying DEFAULT ''::character varying NOT NULL,
+ linkedin character varying DEFAULT ''::character varying NOT NULL,
+ twitter character varying DEFAULT ''::character varying NOT NULL,
+ bio character varying,
+ failed_attempts integer DEFAULT 0,
+ locked_at timestamp without time zone,
+ username character varying,
+ can_create_group boolean DEFAULT true NOT NULL,
+ can_create_team boolean DEFAULT true NOT NULL,
+ state character varying,
+ color_scheme_id integer DEFAULT 1 NOT NULL,
+ password_expires_at timestamp without time zone,
+ created_by_id integer,
+ last_credential_check_at timestamp without time zone,
+ avatar character varying,
+ confirmation_token character varying,
+ confirmed_at timestamp without time zone,
+ confirmation_sent_at timestamp without time zone,
+ unconfirmed_email character varying,
+ hide_no_ssh_key boolean DEFAULT false,
+ website_url character varying DEFAULT ''::character varying NOT NULL,
+ notification_email character varying,
+ hide_no_password boolean DEFAULT false,
+ password_automatically_set boolean DEFAULT false,
+ location character varying,
+ encrypted_otp_secret character varying,
+ encrypted_otp_secret_iv character varying,
+ encrypted_otp_secret_salt character varying,
+ otp_required_for_login boolean DEFAULT false NOT NULL,
+ otp_backup_codes text,
+ public_email character varying DEFAULT ''::character varying NOT NULL,
+ dashboard integer DEFAULT 0,
+ project_view integer DEFAULT 0,
+ consumed_timestep integer,
+ layout integer DEFAULT 0,
+ hide_project_limit boolean DEFAULT false,
+ unlock_token character varying,
+ otp_grace_period_started_at timestamp without time zone,
+ external boolean DEFAULT false,
+ incoming_email_token character varying,
+ organization character varying,
+ require_two_factor_authentication_from_group boolean DEFAULT false NOT NULL,
+ two_factor_grace_period integer DEFAULT 48 NOT NULL,
+ ghost boolean,
+ last_activity_on date,
+ notified_of_own_activity boolean,
+ preferred_language character varying,
+ theme_id smallint,
+ include_private_contributions boolean,
+ feed_token character varying,
+ accepted_term_id integer,
+ private_profile boolean DEFAULT false NOT NULL,
+ commit_email character varying,
+ auditor boolean DEFAULT false NOT NULL,
+ admin_email_unsubscribed_at timestamp without time zone,
+ email_opted_in boolean,
+ email_opted_in_at timestamp without time zone,
+ email_opted_in_ip character varying,
+ email_opted_in_source_id integer,
+ group_view integer,
+ managing_group_id integer,
+ note text,
+ roadmap_layout smallint,
+ bot_type smallint,
+ static_object_token character varying(255),
+ first_name character varying(255),
+ last_name character varying(255),
+ role smallint
+);
+
+CREATE SEQUENCE users_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE users_id_seq OWNED BY users.id;
+
+CREATE TABLE users_ops_dashboard_projects (
+ id bigint NOT NULL,
+ created_at timestamp with time zone NOT NULL,
+ updated_at timestamp with time zone NOT NULL,
+ user_id integer NOT NULL,
+ project_id integer NOT NULL
+);
+
+CREATE SEQUENCE users_ops_dashboard_projects_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE users_ops_dashboard_projects_id_seq OWNED BY users_ops_dashboard_projects.id;
+
+CREATE TABLE users_security_dashboard_projects (
+ user_id bigint NOT NULL,
+ project_id bigint NOT NULL
+);
+
+CREATE TABLE users_star_projects (
+ id integer NOT NULL,
+ project_id integer NOT NULL,
+ user_id integer NOT NULL,
+ created_at timestamp without time zone,
+ updated_at timestamp without time zone
+);
+
+CREATE SEQUENCE users_star_projects_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE users_star_projects_id_seq OWNED BY users_star_projects.id;
+
+CREATE TABLE vulnerabilities (
+ id bigint NOT NULL,
+ milestone_id bigint,
+ epic_id bigint,
+ project_id bigint NOT NULL,
+ author_id bigint NOT NULL,
+ updated_by_id bigint,
+ last_edited_by_id bigint,
+ start_date_sourcing_milestone_id bigint,
+ due_date_sourcing_milestone_id bigint,
+ closed_by_id bigint,
+ last_edited_at timestamp with time zone,
+ created_at timestamp with time zone NOT NULL,
+ updated_at timestamp with time zone NOT NULL,
+ closed_at timestamp with time zone,
+ start_date date,
+ due_date date,
+ state smallint DEFAULT 1 NOT NULL,
+ severity smallint NOT NULL,
+ confidence smallint NOT NULL,
+ severity_overridden boolean DEFAULT false,
+ confidence_overridden boolean DEFAULT false,
+ title character varying(255) NOT NULL,
+ title_html text,
+ description text,
+ description_html text,
+ report_type smallint NOT NULL,
+ cached_markdown_version integer,
+ resolved_by_id bigint,
+ resolved_at timestamp with time zone
+);
+
+CREATE SEQUENCE vulnerabilities_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE vulnerabilities_id_seq OWNED BY vulnerabilities.id;
+
+CREATE TABLE vulnerability_feedback (
+ id integer NOT NULL,
+ created_at timestamp with time zone NOT NULL,
+ updated_at timestamp with time zone NOT NULL,
+ feedback_type smallint NOT NULL,
+ category smallint NOT NULL,
+ project_id integer NOT NULL,
+ author_id integer NOT NULL,
+ pipeline_id integer,
+ issue_id integer,
+ project_fingerprint character varying(40) NOT NULL,
+ merge_request_id integer,
+ comment_author_id integer,
+ comment text,
+ comment_timestamp timestamp with time zone
+);
+
+CREATE SEQUENCE vulnerability_feedback_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE vulnerability_feedback_id_seq OWNED BY vulnerability_feedback.id;
+
+CREATE TABLE vulnerability_identifiers (
+ id bigint NOT NULL,
+ created_at timestamp with time zone NOT NULL,
+ updated_at timestamp with time zone NOT NULL,
+ project_id integer NOT NULL,
+ fingerprint bytea NOT NULL,
+ external_type character varying NOT NULL,
+ external_id character varying NOT NULL,
+ name character varying NOT NULL,
+ url text
+);
+
+CREATE SEQUENCE vulnerability_identifiers_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE vulnerability_identifiers_id_seq OWNED BY vulnerability_identifiers.id;
+
+CREATE TABLE vulnerability_issue_links (
+ id bigint NOT NULL,
+ vulnerability_id bigint NOT NULL,
+ issue_id bigint NOT NULL,
+ link_type smallint DEFAULT 1 NOT NULL,
+ created_at timestamp with time zone NOT NULL,
+ updated_at timestamp with time zone NOT NULL
+);
+
+CREATE SEQUENCE vulnerability_issue_links_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE vulnerability_issue_links_id_seq OWNED BY vulnerability_issue_links.id;
+
+CREATE TABLE vulnerability_occurrence_identifiers (
+ id bigint NOT NULL,
+ created_at timestamp with time zone NOT NULL,
+ updated_at timestamp with time zone NOT NULL,
+ occurrence_id bigint NOT NULL,
+ identifier_id bigint NOT NULL
+);
+
+CREATE SEQUENCE vulnerability_occurrence_identifiers_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE vulnerability_occurrence_identifiers_id_seq OWNED BY vulnerability_occurrence_identifiers.id;
+
+CREATE TABLE vulnerability_occurrence_pipelines (
+ id bigint NOT NULL,
+ created_at timestamp with time zone NOT NULL,
+ updated_at timestamp with time zone NOT NULL,
+ occurrence_id bigint NOT NULL,
+ pipeline_id integer NOT NULL
+);
+
+CREATE SEQUENCE vulnerability_occurrence_pipelines_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE vulnerability_occurrence_pipelines_id_seq OWNED BY vulnerability_occurrence_pipelines.id;
+
+CREATE TABLE vulnerability_occurrences (
+ id bigint NOT NULL,
+ created_at timestamp with time zone NOT NULL,
+ updated_at timestamp with time zone NOT NULL,
+ severity smallint NOT NULL,
+ confidence smallint NOT NULL,
+ report_type smallint NOT NULL,
+ project_id integer NOT NULL,
+ scanner_id bigint NOT NULL,
+ primary_identifier_id bigint NOT NULL,
+ project_fingerprint bytea NOT NULL,
+ location_fingerprint bytea NOT NULL,
+ uuid character varying(36) NOT NULL,
+ name character varying NOT NULL,
+ metadata_version character varying NOT NULL,
+ raw_metadata text NOT NULL,
+ vulnerability_id bigint
+);
+
+CREATE SEQUENCE vulnerability_occurrences_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE vulnerability_occurrences_id_seq OWNED BY vulnerability_occurrences.id;
+
+CREATE TABLE vulnerability_scanners (
+ id bigint NOT NULL,
+ created_at timestamp with time zone NOT NULL,
+ updated_at timestamp with time zone NOT NULL,
+ project_id integer NOT NULL,
+ external_id character varying NOT NULL,
+ name character varying NOT NULL
+);
+
+CREATE SEQUENCE vulnerability_scanners_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE vulnerability_scanners_id_seq OWNED BY vulnerability_scanners.id;
+
+CREATE TABLE web_hook_logs (
+ id integer 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,
+ created_at timestamp without time zone NOT NULL,
+ 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,
+ created_at timestamp without time zone,
+ updated_at timestamp without time zone,
+ type character varying DEFAULT 'ProjectHook'::character varying,
+ service_id integer,
+ push_events boolean DEFAULT true NOT NULL,
+ issues_events boolean DEFAULT false NOT NULL,
+ merge_requests_events boolean DEFAULT false NOT NULL,
+ tag_push_events boolean DEFAULT false,
+ note_events boolean DEFAULT false NOT NULL,
+ enable_ssl_verification boolean DEFAULT true,
+ wiki_page_events boolean DEFAULT false NOT NULL,
+ pipeline_events boolean DEFAULT false NOT NULL,
+ confidential_issues_events boolean DEFAULT false NOT NULL,
+ repository_update_events boolean DEFAULT false NOT NULL,
+ job_events boolean DEFAULT false NOT NULL,
+ confidential_note_events boolean,
+ push_events_branch_filter text,
+ encrypted_token character varying,
+ encrypted_token_iv character varying,
+ encrypted_url character varying,
+ encrypted_url_iv character varying,
+ group_id integer
+);
+
+CREATE SEQUENCE web_hooks_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE web_hooks_id_seq OWNED BY web_hooks.id;
+
+CREATE TABLE webauthn_registrations (
+ id bigint NOT NULL,
+ user_id bigint NOT NULL,
+ counter bigint DEFAULT 0 NOT NULL,
+ created_at timestamp with time zone NOT NULL,
+ updated_at timestamp with time zone NOT NULL,
+ credential_xid text NOT NULL,
+ name text NOT NULL,
+ public_key text NOT NULL
+);
+
+CREATE SEQUENCE webauthn_registrations_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE webauthn_registrations_id_seq OWNED BY webauthn_registrations.id;
+
+CREATE TABLE x509_certificates (
+ id bigint NOT NULL,
+ created_at timestamp with time zone NOT NULL,
+ updated_at timestamp with time zone NOT NULL,
+ subject_key_identifier character varying(255) NOT NULL,
+ subject character varying(255) NOT NULL,
+ email character varying(255) NOT NULL,
+ serial_number bytea NOT NULL,
+ certificate_status smallint DEFAULT 0 NOT NULL,
+ x509_issuer_id bigint NOT NULL
+);
+
+CREATE SEQUENCE x509_certificates_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE x509_certificates_id_seq OWNED BY x509_certificates.id;
+
+CREATE TABLE x509_commit_signatures (
+ id bigint NOT NULL,
+ created_at timestamp with time zone NOT NULL,
+ updated_at timestamp with time zone NOT NULL,
+ project_id bigint NOT NULL,
+ x509_certificate_id bigint NOT NULL,
+ commit_sha bytea NOT NULL,
+ verification_status smallint DEFAULT 0 NOT NULL
+);
+
+CREATE SEQUENCE x509_commit_signatures_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE x509_commit_signatures_id_seq OWNED BY x509_commit_signatures.id;
+
+CREATE TABLE x509_issuers (
+ id bigint NOT NULL,
+ created_at timestamp with time zone NOT NULL,
+ updated_at timestamp with time zone NOT NULL,
+ subject_key_identifier character varying(255) NOT NULL,
+ subject character varying(255) NOT NULL,
+ crl_url character varying(255) NOT NULL
+);
+
+CREATE SEQUENCE x509_issuers_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE x509_issuers_id_seq OWNED BY x509_issuers.id;
+
+CREATE TABLE zoom_meetings (
+ id bigint NOT NULL,
+ project_id bigint NOT NULL,
+ issue_id bigint NOT NULL,
+ created_at timestamp with time zone NOT NULL,
+ updated_at timestamp with time zone NOT NULL,
+ issue_status smallint DEFAULT 1 NOT NULL,
+ url character varying(255)
+);
+
+CREATE SEQUENCE zoom_meetings_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE zoom_meetings_id_seq OWNED BY zoom_meetings.id;
+
+ALTER TABLE ONLY abuse_reports ALTER COLUMN id SET DEFAULT nextval('abuse_reports_id_seq'::regclass);
+
+ALTER TABLE ONLY alerts_service_data ALTER COLUMN id SET DEFAULT nextval('alerts_service_data_id_seq'::regclass);
+
+ALTER TABLE ONLY allowed_email_domains ALTER COLUMN id SET DEFAULT nextval('allowed_email_domains_id_seq'::regclass);
+
+ALTER TABLE ONLY analytics_cycle_analytics_group_stages ALTER COLUMN id SET DEFAULT nextval('analytics_cycle_analytics_group_stages_id_seq'::regclass);
+
+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_repository_file_commits ALTER COLUMN id SET DEFAULT nextval('analytics_repository_file_commits_id_seq'::regclass);
+
+ALTER TABLE ONLY analytics_repository_file_edits ALTER COLUMN id SET DEFAULT nextval('analytics_repository_file_edits_id_seq'::regclass);
+
+ALTER TABLE ONLY analytics_repository_files ALTER COLUMN id SET DEFAULT nextval('analytics_repository_files_id_seq'::regclass);
+
+ALTER TABLE ONLY appearances ALTER COLUMN id SET DEFAULT nextval('appearances_id_seq'::regclass);
+
+ALTER TABLE ONLY application_setting_terms ALTER COLUMN id SET DEFAULT nextval('application_setting_terms_id_seq'::regclass);
+
+ALTER TABLE ONLY application_settings ALTER COLUMN id SET DEFAULT nextval('application_settings_id_seq'::regclass);
+
+ALTER TABLE ONLY approval_merge_request_rule_sources ALTER COLUMN id SET DEFAULT nextval('approval_merge_request_rule_sources_id_seq'::regclass);
+
+ALTER TABLE ONLY approval_merge_request_rules ALTER COLUMN id SET DEFAULT nextval('approval_merge_request_rules_id_seq'::regclass);
+
+ALTER TABLE ONLY approval_merge_request_rules_approved_approvers ALTER COLUMN id SET DEFAULT nextval('approval_merge_request_rules_approved_approvers_id_seq'::regclass);
+
+ALTER TABLE ONLY approval_merge_request_rules_groups ALTER COLUMN id SET DEFAULT nextval('approval_merge_request_rules_groups_id_seq'::regclass);
+
+ALTER TABLE ONLY approval_merge_request_rules_users ALTER COLUMN id SET DEFAULT nextval('approval_merge_request_rules_users_id_seq'::regclass);
+
+ALTER TABLE ONLY approval_project_rules ALTER COLUMN id SET DEFAULT nextval('approval_project_rules_id_seq'::regclass);
+
+ALTER TABLE ONLY approval_project_rules_groups ALTER COLUMN id SET DEFAULT nextval('approval_project_rules_groups_id_seq'::regclass);
+
+ALTER TABLE ONLY approval_project_rules_users ALTER COLUMN id SET DEFAULT nextval('approval_project_rules_users_id_seq'::regclass);
+
+ALTER TABLE ONLY approvals ALTER COLUMN id SET DEFAULT nextval('approvals_id_seq'::regclass);
+
+ALTER TABLE ONLY approver_groups ALTER COLUMN id SET DEFAULT nextval('approver_groups_id_seq'::regclass);
+
+ALTER TABLE ONLY approvers ALTER COLUMN id SET DEFAULT nextval('approvers_id_seq'::regclass);
+
+ALTER TABLE ONLY audit_events ALTER COLUMN id SET DEFAULT nextval('audit_events_id_seq'::regclass);
+
+ALTER TABLE ONLY award_emoji ALTER COLUMN id SET DEFAULT nextval('award_emoji_id_seq'::regclass);
+
+ALTER TABLE ONLY badges ALTER COLUMN id SET DEFAULT nextval('badges_id_seq'::regclass);
+
+ALTER TABLE ONLY board_assignees ALTER COLUMN id SET DEFAULT nextval('board_assignees_id_seq'::regclass);
+
+ALTER TABLE ONLY board_group_recent_visits ALTER COLUMN id SET DEFAULT nextval('board_group_recent_visits_id_seq'::regclass);
+
+ALTER TABLE ONLY board_labels ALTER COLUMN id SET DEFAULT nextval('board_labels_id_seq'::regclass);
+
+ALTER TABLE ONLY board_project_recent_visits ALTER COLUMN id SET DEFAULT nextval('board_project_recent_visits_id_seq'::regclass);
+
+ALTER TABLE ONLY boards ALTER COLUMN id SET DEFAULT nextval('boards_id_seq'::regclass);
+
+ALTER TABLE ONLY broadcast_messages ALTER COLUMN id SET DEFAULT nextval('broadcast_messages_id_seq'::regclass);
+
+ALTER TABLE ONLY chat_names ALTER COLUMN id SET DEFAULT nextval('chat_names_id_seq'::regclass);
+
+ALTER TABLE ONLY chat_teams ALTER COLUMN id SET DEFAULT nextval('chat_teams_id_seq'::regclass);
+
+ALTER TABLE ONLY ci_build_needs ALTER COLUMN id SET DEFAULT nextval('ci_build_needs_id_seq'::regclass);
+
+ALTER TABLE ONLY ci_build_trace_chunks ALTER COLUMN id SET DEFAULT nextval('ci_build_trace_chunks_id_seq'::regclass);
+
+ALTER TABLE ONLY ci_build_trace_section_names ALTER COLUMN id SET DEFAULT nextval('ci_build_trace_section_names_id_seq'::regclass);
+
+ALTER TABLE ONLY ci_builds ALTER COLUMN id SET DEFAULT nextval('ci_builds_id_seq'::regclass);
+
+ALTER TABLE ONLY ci_builds_metadata ALTER COLUMN id SET DEFAULT nextval('ci_builds_metadata_id_seq'::regclass);
+
+ALTER TABLE ONLY ci_builds_runner_session ALTER COLUMN id SET DEFAULT nextval('ci_builds_runner_session_id_seq'::regclass);
+
+ALTER TABLE ONLY ci_group_variables ALTER COLUMN id SET DEFAULT nextval('ci_group_variables_id_seq'::regclass);
+
+ALTER TABLE ONLY ci_job_artifacts ALTER COLUMN id SET DEFAULT nextval('ci_job_artifacts_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_pipeline_chat_data ALTER COLUMN id SET DEFAULT nextval('ci_pipeline_chat_data_id_seq'::regclass);
+
+ALTER TABLE ONLY ci_pipeline_schedule_variables ALTER COLUMN id SET DEFAULT nextval('ci_pipeline_schedule_variables_id_seq'::regclass);
+
+ALTER TABLE ONLY ci_pipeline_schedules ALTER COLUMN id SET DEFAULT nextval('ci_pipeline_schedules_id_seq'::regclass);
+
+ALTER TABLE ONLY ci_pipeline_variables ALTER COLUMN id SET DEFAULT nextval('ci_pipeline_variables_id_seq'::regclass);
+
+ALTER TABLE ONLY ci_pipelines ALTER COLUMN id SET DEFAULT nextval('ci_pipelines_id_seq'::regclass);
+
+ALTER TABLE ONLY ci_pipelines_config ALTER COLUMN pipeline_id SET DEFAULT nextval('ci_pipelines_config_pipeline_id_seq'::regclass);
+
+ALTER TABLE ONLY ci_refs ALTER COLUMN id SET DEFAULT nextval('ci_refs_id_seq'::regclass);
+
+ALTER TABLE ONLY ci_resource_groups ALTER COLUMN id SET DEFAULT nextval('ci_resource_groups_id_seq'::regclass);
+
+ALTER TABLE ONLY ci_resources ALTER COLUMN id SET DEFAULT nextval('ci_resources_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);
+
+ALTER TABLE ONLY ci_runners ALTER COLUMN id SET DEFAULT nextval('ci_runners_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_stages ALTER COLUMN id SET DEFAULT nextval('ci_stages_id_seq'::regclass);
+
+ALTER TABLE ONLY ci_subscriptions_projects ALTER COLUMN id SET DEFAULT nextval('ci_subscriptions_projects_id_seq'::regclass);
+
+ALTER TABLE ONLY ci_trigger_requests ALTER COLUMN id SET DEFAULT nextval('ci_trigger_requests_id_seq'::regclass);
+
+ALTER TABLE ONLY ci_triggers ALTER COLUMN id SET DEFAULT nextval('ci_triggers_id_seq'::regclass);
+
+ALTER TABLE ONLY ci_variables ALTER COLUMN id SET DEFAULT nextval('ci_variables_id_seq'::regclass);
+
+ALTER TABLE ONLY cluster_groups ALTER COLUMN id SET DEFAULT nextval('cluster_groups_id_seq'::regclass);
+
+ALTER TABLE ONLY cluster_platforms_kubernetes ALTER COLUMN id SET DEFAULT nextval('cluster_platforms_kubernetes_id_seq'::regclass);
+
+ALTER TABLE ONLY cluster_projects ALTER COLUMN id SET DEFAULT nextval('cluster_projects_id_seq'::regclass);
+
+ALTER TABLE ONLY cluster_providers_aws ALTER COLUMN id SET DEFAULT nextval('cluster_providers_aws_id_seq'::regclass);
+
+ALTER TABLE ONLY cluster_providers_gcp ALTER COLUMN id SET DEFAULT nextval('cluster_providers_gcp_id_seq'::regclass);
+
+ALTER TABLE ONLY clusters ALTER COLUMN id SET DEFAULT nextval('clusters_id_seq'::regclass);
+
+ALTER TABLE ONLY clusters_applications_cert_managers ALTER COLUMN id SET DEFAULT nextval('clusters_applications_cert_managers_id_seq'::regclass);
+
+ALTER TABLE ONLY clusters_applications_crossplane ALTER COLUMN id SET DEFAULT nextval('clusters_applications_crossplane_id_seq'::regclass);
+
+ALTER TABLE ONLY clusters_applications_elastic_stacks ALTER COLUMN id SET DEFAULT nextval('clusters_applications_elastic_stacks_id_seq'::regclass);
+
+ALTER TABLE ONLY clusters_applications_helm ALTER COLUMN id SET DEFAULT nextval('clusters_applications_helm_id_seq'::regclass);
+
+ALTER TABLE ONLY clusters_applications_ingress ALTER COLUMN id SET DEFAULT nextval('clusters_applications_ingress_id_seq'::regclass);
+
+ALTER TABLE ONLY clusters_applications_jupyter ALTER COLUMN id SET DEFAULT nextval('clusters_applications_jupyter_id_seq'::regclass);
+
+ALTER TABLE ONLY clusters_applications_knative ALTER COLUMN id SET DEFAULT nextval('clusters_applications_knative_id_seq'::regclass);
+
+ALTER TABLE ONLY clusters_applications_prometheus ALTER COLUMN id SET DEFAULT nextval('clusters_applications_prometheus_id_seq'::regclass);
+
+ALTER TABLE ONLY clusters_applications_runners ALTER COLUMN id SET DEFAULT nextval('clusters_applications_runners_id_seq'::regclass);
+
+ALTER TABLE ONLY clusters_kubernetes_namespaces ALTER COLUMN id SET DEFAULT nextval('clusters_kubernetes_namespaces_id_seq'::regclass);
+
+ALTER TABLE ONLY commit_user_mentions ALTER COLUMN id SET DEFAULT nextval('commit_user_mentions_id_seq'::regclass);
+
+ALTER TABLE ONLY container_repositories ALTER COLUMN id SET DEFAULT nextval('container_repositories_id_seq'::regclass);
+
+ALTER TABLE ONLY conversational_development_index_metrics ALTER COLUMN id SET DEFAULT nextval('conversational_development_index_metrics_id_seq'::regclass);
+
+ALTER TABLE ONLY dependency_proxy_blobs ALTER COLUMN id SET DEFAULT nextval('dependency_proxy_blobs_id_seq'::regclass);
+
+ALTER TABLE ONLY dependency_proxy_group_settings ALTER COLUMN id SET DEFAULT nextval('dependency_proxy_group_settings_id_seq'::regclass);
+
+ALTER TABLE ONLY deploy_keys_projects ALTER COLUMN id SET DEFAULT nextval('deploy_keys_projects_id_seq'::regclass);
+
+ALTER TABLE ONLY deploy_tokens ALTER COLUMN id SET DEFAULT nextval('deploy_tokens_id_seq'::regclass);
+
+ALTER TABLE ONLY deployments ALTER COLUMN id SET DEFAULT nextval('deployments_id_seq'::regclass);
+
+ALTER TABLE ONLY description_versions ALTER COLUMN id SET DEFAULT nextval('description_versions_id_seq'::regclass);
+
+ALTER TABLE ONLY design_management_designs ALTER COLUMN id SET DEFAULT nextval('design_management_designs_id_seq'::regclass);
+
+ALTER TABLE ONLY design_management_versions ALTER COLUMN id SET DEFAULT nextval('design_management_versions_id_seq'::regclass);
+
+ALTER TABLE ONLY design_user_mentions ALTER COLUMN id SET DEFAULT nextval('design_user_mentions_id_seq'::regclass);
+
+ALTER TABLE ONLY draft_notes ALTER COLUMN id SET DEFAULT nextval('draft_notes_id_seq'::regclass);
+
+ALTER TABLE ONLY emails ALTER COLUMN id SET DEFAULT nextval('emails_id_seq'::regclass);
+
+ALTER TABLE ONLY environments ALTER COLUMN id SET DEFAULT nextval('environments_id_seq'::regclass);
+
+ALTER TABLE ONLY epic_issues ALTER COLUMN id SET DEFAULT nextval('epic_issues_id_seq'::regclass);
+
+ALTER TABLE ONLY epic_metrics ALTER COLUMN id SET DEFAULT nextval('epic_metrics_id_seq'::regclass);
+
+ALTER TABLE ONLY epic_user_mentions ALTER COLUMN id SET DEFAULT nextval('epic_user_mentions_id_seq'::regclass);
+
+ALTER TABLE ONLY epics ALTER COLUMN id SET DEFAULT nextval('epics_id_seq'::regclass);
+
+ALTER TABLE ONLY events ALTER COLUMN id SET DEFAULT nextval('events_id_seq'::regclass);
+
+ALTER TABLE ONLY evidences ALTER COLUMN id SET DEFAULT nextval('evidences_id_seq'::regclass);
+
+ALTER TABLE ONLY external_pull_requests ALTER COLUMN id SET DEFAULT nextval('external_pull_requests_id_seq'::regclass);
+
+ALTER TABLE ONLY feature_gates ALTER COLUMN id SET DEFAULT nextval('feature_gates_id_seq'::regclass);
+
+ALTER TABLE ONLY features ALTER COLUMN id SET DEFAULT nextval('features_id_seq'::regclass);
+
+ALTER TABLE ONLY fork_network_members ALTER COLUMN id SET DEFAULT nextval('fork_network_members_id_seq'::regclass);
+
+ALTER TABLE ONLY fork_networks ALTER COLUMN id SET DEFAULT nextval('fork_networks_id_seq'::regclass);
+
+ALTER TABLE ONLY forked_project_links ALTER COLUMN id SET DEFAULT nextval('forked_project_links_id_seq'::regclass);
+
+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_hashed_storage_attachments_events ALTER COLUMN id SET DEFAULT nextval('geo_hashed_storage_attachments_events_id_seq'::regclass);
+
+ALTER TABLE ONLY geo_hashed_storage_migrated_events ALTER COLUMN id SET DEFAULT nextval('geo_hashed_storage_migrated_events_id_seq'::regclass);
+
+ALTER TABLE ONLY geo_job_artifact_deleted_events ALTER COLUMN id SET DEFAULT nextval('geo_job_artifact_deleted_events_id_seq'::regclass);
+
+ALTER TABLE ONLY geo_lfs_object_deleted_events ALTER COLUMN id SET DEFAULT nextval('geo_lfs_object_deleted_events_id_seq'::regclass);
+
+ALTER TABLE ONLY geo_node_namespace_links ALTER COLUMN id SET DEFAULT nextval('geo_node_namespace_links_id_seq'::regclass);
+
+ALTER TABLE ONLY geo_node_statuses ALTER COLUMN id SET DEFAULT nextval('geo_node_statuses_id_seq'::regclass);
+
+ALTER TABLE ONLY geo_nodes ALTER COLUMN id SET DEFAULT nextval('geo_nodes_id_seq'::regclass);
+
+ALTER TABLE ONLY geo_repositories_changed_events ALTER COLUMN id SET DEFAULT nextval('geo_repositories_changed_events_id_seq'::regclass);
+
+ALTER TABLE ONLY geo_repository_created_events ALTER COLUMN id SET DEFAULT nextval('geo_repository_created_events_id_seq'::regclass);
+
+ALTER TABLE ONLY geo_repository_deleted_events ALTER COLUMN id SET DEFAULT nextval('geo_repository_deleted_events_id_seq'::regclass);
+
+ALTER TABLE ONLY geo_repository_renamed_events ALTER COLUMN id SET DEFAULT nextval('geo_repository_renamed_events_id_seq'::regclass);
+
+ALTER TABLE ONLY geo_repository_updated_events ALTER COLUMN id SET DEFAULT nextval('geo_repository_updated_events_id_seq'::regclass);
+
+ALTER TABLE ONLY geo_reset_checksum_events ALTER COLUMN id SET DEFAULT nextval('geo_reset_checksum_events_id_seq'::regclass);
+
+ALTER TABLE ONLY geo_upload_deleted_events ALTER COLUMN id SET DEFAULT nextval('geo_upload_deleted_events_id_seq'::regclass);
+
+ALTER TABLE ONLY gitlab_subscription_histories ALTER COLUMN id SET DEFAULT nextval('gitlab_subscription_histories_id_seq'::regclass);
+
+ALTER TABLE ONLY gitlab_subscriptions ALTER COLUMN id SET DEFAULT nextval('gitlab_subscriptions_id_seq'::regclass);
+
+ALTER TABLE ONLY gpg_key_subkeys ALTER COLUMN id SET DEFAULT nextval('gpg_key_subkeys_id_seq'::regclass);
+
+ALTER TABLE ONLY gpg_keys ALTER COLUMN id SET DEFAULT nextval('gpg_keys_id_seq'::regclass);
+
+ALTER TABLE ONLY gpg_signatures ALTER COLUMN id SET DEFAULT nextval('gpg_signatures_id_seq'::regclass);
+
+ALTER TABLE ONLY grafana_integrations ALTER COLUMN id SET DEFAULT nextval('grafana_integrations_id_seq'::regclass);
+
+ALTER TABLE ONLY group_custom_attributes ALTER COLUMN id SET DEFAULT nextval('group_custom_attributes_id_seq'::regclass);
+
+ALTER TABLE ONLY group_group_links ALTER COLUMN id SET DEFAULT nextval('group_group_links_id_seq'::regclass);
+
+ALTER TABLE ONLY historical_data ALTER COLUMN id SET DEFAULT nextval('historical_data_id_seq'::regclass);
+
+ALTER TABLE ONLY identities ALTER COLUMN id SET DEFAULT nextval('identities_id_seq'::regclass);
+
+ALTER TABLE ONLY import_export_uploads ALTER COLUMN id SET DEFAULT nextval('import_export_uploads_id_seq'::regclass);
+
+ALTER TABLE ONLY import_failures ALTER COLUMN id SET DEFAULT nextval('import_failures_id_seq'::regclass);
+
+ALTER TABLE ONLY index_statuses ALTER COLUMN id SET DEFAULT nextval('index_statuses_id_seq'::regclass);
+
+ALTER TABLE ONLY insights ALTER COLUMN id SET DEFAULT nextval('insights_id_seq'::regclass);
+
+ALTER TABLE ONLY internal_ids ALTER COLUMN id SET DEFAULT nextval('internal_ids_id_seq'::regclass);
+
+ALTER TABLE ONLY ip_restrictions ALTER COLUMN id SET DEFAULT nextval('ip_restrictions_id_seq'::regclass);
+
+ALTER TABLE ONLY issue_links ALTER COLUMN id SET DEFAULT nextval('issue_links_id_seq'::regclass);
+
+ALTER TABLE ONLY issue_metrics ALTER COLUMN id SET DEFAULT nextval('issue_metrics_id_seq'::regclass);
+
+ALTER TABLE ONLY issue_tracker_data ALTER COLUMN id SET DEFAULT nextval('issue_tracker_data_id_seq'::regclass);
+
+ALTER TABLE ONLY issue_user_mentions ALTER COLUMN id SET DEFAULT nextval('issue_user_mentions_id_seq'::regclass);
+
+ALTER TABLE ONLY issues ALTER COLUMN id SET DEFAULT nextval('issues_id_seq'::regclass);
+
+ALTER TABLE ONLY jira_connect_installations ALTER COLUMN id SET DEFAULT nextval('jira_connect_installations_id_seq'::regclass);
+
+ALTER TABLE ONLY jira_connect_subscriptions ALTER COLUMN id SET DEFAULT nextval('jira_connect_subscriptions_id_seq'::regclass);
+
+ALTER TABLE ONLY jira_tracker_data ALTER COLUMN id SET DEFAULT nextval('jira_tracker_data_id_seq'::regclass);
+
+ALTER TABLE ONLY keys ALTER COLUMN id SET DEFAULT nextval('keys_id_seq'::regclass);
+
+ALTER TABLE ONLY label_links ALTER COLUMN id SET DEFAULT nextval('label_links_id_seq'::regclass);
+
+ALTER TABLE ONLY label_priorities ALTER COLUMN id SET DEFAULT nextval('label_priorities_id_seq'::regclass);
+
+ALTER TABLE ONLY labels ALTER COLUMN id SET DEFAULT nextval('labels_id_seq'::regclass);
+
+ALTER TABLE ONLY ldap_group_links ALTER COLUMN id SET DEFAULT nextval('ldap_group_links_id_seq'::regclass);
+
+ALTER TABLE ONLY lfs_file_locks ALTER COLUMN id SET DEFAULT nextval('lfs_file_locks_id_seq'::regclass);
+
+ALTER TABLE ONLY lfs_objects ALTER COLUMN id SET DEFAULT nextval('lfs_objects_id_seq'::regclass);
+
+ALTER TABLE ONLY lfs_objects_projects ALTER COLUMN id SET DEFAULT nextval('lfs_objects_projects_id_seq'::regclass);
+
+ALTER TABLE ONLY licenses ALTER COLUMN id SET DEFAULT nextval('licenses_id_seq'::regclass);
+
+ALTER TABLE ONLY list_user_preferences ALTER COLUMN id SET DEFAULT nextval('list_user_preferences_id_seq'::regclass);
+
+ALTER TABLE ONLY lists ALTER COLUMN id SET DEFAULT nextval('lists_id_seq'::regclass);
+
+ALTER TABLE ONLY members ALTER COLUMN id SET DEFAULT nextval('members_id_seq'::regclass);
+
+ALTER TABLE ONLY merge_request_assignees ALTER COLUMN id SET DEFAULT nextval('merge_request_assignees_id_seq'::regclass);
+
+ALTER TABLE ONLY merge_request_blocks ALTER COLUMN id SET DEFAULT nextval('merge_request_blocks_id_seq'::regclass);
+
+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_diffs ALTER COLUMN id SET DEFAULT nextval('merge_request_diffs_id_seq'::regclass);
+
+ALTER TABLE ONLY merge_request_metrics ALTER COLUMN id SET DEFAULT nextval('merge_request_metrics_id_seq'::regclass);
+
+ALTER TABLE ONLY merge_request_user_mentions ALTER COLUMN id SET DEFAULT nextval('merge_request_user_mentions_id_seq'::regclass);
+
+ALTER TABLE ONLY merge_requests ALTER COLUMN id SET DEFAULT nextval('merge_requests_id_seq'::regclass);
+
+ALTER TABLE ONLY merge_requests_closing_issues ALTER COLUMN id SET DEFAULT nextval('merge_requests_closing_issues_id_seq'::regclass);
+
+ALTER TABLE ONLY merge_trains ALTER COLUMN id SET DEFAULT nextval('merge_trains_id_seq'::regclass);
+
+ALTER TABLE ONLY milestones ALTER COLUMN id SET DEFAULT nextval('milestones_id_seq'::regclass);
+
+ALTER TABLE ONLY namespace_aggregation_schedules ALTER COLUMN namespace_id SET DEFAULT nextval('namespace_aggregation_schedules_namespace_id_seq'::regclass);
+
+ALTER TABLE ONLY namespace_root_storage_statistics ALTER COLUMN namespace_id SET DEFAULT nextval('namespace_root_storage_statistics_namespace_id_seq'::regclass);
+
+ALTER TABLE ONLY namespace_statistics ALTER COLUMN id SET DEFAULT nextval('namespace_statistics_id_seq'::regclass);
+
+ALTER TABLE ONLY namespaces ALTER COLUMN id SET DEFAULT nextval('namespaces_id_seq'::regclass);
+
+ALTER TABLE ONLY note_diff_files ALTER COLUMN id SET DEFAULT nextval('note_diff_files_id_seq'::regclass);
+
+ALTER TABLE ONLY notes ALTER COLUMN id SET DEFAULT nextval('notes_id_seq'::regclass);
+
+ALTER TABLE ONLY notification_settings ALTER COLUMN id SET DEFAULT nextval('notification_settings_id_seq'::regclass);
+
+ALTER TABLE ONLY oauth_access_grants ALTER COLUMN id SET DEFAULT nextval('oauth_access_grants_id_seq'::regclass);
+
+ALTER TABLE ONLY oauth_access_tokens ALTER COLUMN id SET DEFAULT nextval('oauth_access_tokens_id_seq'::regclass);
+
+ALTER TABLE ONLY oauth_applications ALTER COLUMN id SET DEFAULT nextval('oauth_applications_id_seq'::regclass);
+
+ALTER TABLE ONLY oauth_openid_requests ALTER COLUMN id SET DEFAULT nextval('oauth_openid_requests_id_seq'::regclass);
+
+ALTER TABLE ONLY operations_feature_flag_scopes ALTER COLUMN id SET DEFAULT nextval('operations_feature_flag_scopes_id_seq'::regclass);
+
+ALTER TABLE ONLY operations_feature_flags ALTER COLUMN id SET DEFAULT nextval('operations_feature_flags_id_seq'::regclass);
+
+ALTER TABLE ONLY operations_feature_flags_clients ALTER COLUMN id SET DEFAULT nextval('operations_feature_flags_clients_id_seq'::regclass);
+
+ALTER TABLE ONLY packages_build_infos ALTER COLUMN id SET DEFAULT nextval('packages_build_infos_id_seq'::regclass);
+
+ALTER TABLE ONLY packages_conan_file_metadata ALTER COLUMN id SET DEFAULT nextval('packages_conan_file_metadata_id_seq'::regclass);
+
+ALTER TABLE ONLY packages_conan_metadata ALTER COLUMN id SET DEFAULT nextval('packages_conan_metadata_id_seq'::regclass);
+
+ALTER TABLE ONLY packages_dependencies ALTER COLUMN id SET DEFAULT nextval('packages_dependencies_id_seq'::regclass);
+
+ALTER TABLE ONLY packages_dependency_links ALTER COLUMN id SET DEFAULT nextval('packages_dependency_links_id_seq'::regclass);
+
+ALTER TABLE ONLY packages_maven_metadata ALTER COLUMN id SET DEFAULT nextval('packages_maven_metadata_id_seq'::regclass);
+
+ALTER TABLE ONLY packages_package_files ALTER COLUMN id SET DEFAULT nextval('packages_package_files_id_seq'::regclass);
+
+ALTER TABLE ONLY packages_packages ALTER COLUMN id SET DEFAULT nextval('packages_packages_id_seq'::regclass);
+
+ALTER TABLE ONLY packages_tags ALTER COLUMN id SET DEFAULT nextval('packages_tags_id_seq'::regclass);
+
+ALTER TABLE ONLY pages_domain_acme_orders ALTER COLUMN id SET DEFAULT nextval('pages_domain_acme_orders_id_seq'::regclass);
+
+ALTER TABLE ONLY pages_domains ALTER COLUMN id SET DEFAULT nextval('pages_domains_id_seq'::regclass);
+
+ALTER TABLE ONLY path_locks ALTER COLUMN id SET DEFAULT nextval('path_locks_id_seq'::regclass);
+
+ALTER TABLE ONLY personal_access_tokens ALTER COLUMN id SET DEFAULT nextval('personal_access_tokens_id_seq'::regclass);
+
+ALTER TABLE ONLY plan_limits ALTER COLUMN id SET DEFAULT nextval('plan_limits_id_seq'::regclass);
+
+ALTER TABLE ONLY plans ALTER COLUMN id SET DEFAULT nextval('plans_id_seq'::regclass);
+
+ALTER TABLE ONLY pool_repositories ALTER COLUMN id SET DEFAULT nextval('pool_repositories_id_seq'::regclass);
+
+ALTER TABLE ONLY programming_languages ALTER COLUMN id SET DEFAULT nextval('programming_languages_id_seq'::regclass);
+
+ALTER TABLE ONLY project_aliases ALTER COLUMN id SET DEFAULT nextval('project_aliases_id_seq'::regclass);
+
+ALTER TABLE ONLY project_auto_devops ALTER COLUMN id SET DEFAULT nextval('project_auto_devops_id_seq'::regclass);
+
+ALTER TABLE ONLY project_ci_cd_settings ALTER COLUMN id SET DEFAULT nextval('project_ci_cd_settings_id_seq'::regclass);
+
+ALTER TABLE ONLY project_custom_attributes ALTER COLUMN id SET DEFAULT nextval('project_custom_attributes_id_seq'::regclass);
+
+ALTER TABLE ONLY project_daily_statistics ALTER COLUMN id SET DEFAULT nextval('project_daily_statistics_id_seq'::regclass);
+
+ALTER TABLE ONLY project_deploy_tokens ALTER COLUMN id SET DEFAULT nextval('project_deploy_tokens_id_seq'::regclass);
+
+ALTER TABLE ONLY project_features ALTER COLUMN id SET DEFAULT nextval('project_features_id_seq'::regclass);
+
+ALTER TABLE ONLY project_group_links ALTER COLUMN id SET DEFAULT nextval('project_group_links_id_seq'::regclass);
+
+ALTER TABLE ONLY project_import_data ALTER COLUMN id SET DEFAULT nextval('project_import_data_id_seq'::regclass);
+
+ALTER TABLE ONLY project_mirror_data ALTER COLUMN id SET DEFAULT nextval('project_mirror_data_id_seq'::regclass);
+
+ALTER TABLE ONLY project_repositories ALTER COLUMN id SET DEFAULT nextval('project_repositories_id_seq'::regclass);
+
+ALTER TABLE ONLY project_repository_states ALTER COLUMN id SET DEFAULT nextval('project_repository_states_id_seq'::regclass);
+
+ALTER TABLE ONLY project_statistics ALTER COLUMN id SET DEFAULT nextval('project_statistics_id_seq'::regclass);
+
+ALTER TABLE ONLY project_tracing_settings ALTER COLUMN id SET DEFAULT nextval('project_tracing_settings_id_seq'::regclass);
+
+ALTER TABLE ONLY projects ALTER COLUMN id SET DEFAULT nextval('projects_id_seq'::regclass);
+
+ALTER TABLE ONLY prometheus_alert_events ALTER COLUMN id SET DEFAULT nextval('prometheus_alert_events_id_seq'::regclass);
+
+ALTER TABLE ONLY prometheus_alerts ALTER COLUMN id SET DEFAULT nextval('prometheus_alerts_id_seq'::regclass);
+
+ALTER TABLE ONLY prometheus_metrics ALTER COLUMN id SET DEFAULT nextval('prometheus_metrics_id_seq'::regclass);
+
+ALTER TABLE ONLY protected_branch_merge_access_levels ALTER COLUMN id SET DEFAULT nextval('protected_branch_merge_access_levels_id_seq'::regclass);
+
+ALTER TABLE ONLY protected_branch_push_access_levels ALTER COLUMN id SET DEFAULT nextval('protected_branch_push_access_levels_id_seq'::regclass);
+
+ALTER TABLE ONLY protected_branch_unprotect_access_levels ALTER COLUMN id SET DEFAULT nextval('protected_branch_unprotect_access_levels_id_seq'::regclass);
+
+ALTER TABLE ONLY protected_branches ALTER COLUMN id SET DEFAULT nextval('protected_branches_id_seq'::regclass);
+
+ALTER TABLE ONLY protected_environment_deploy_access_levels ALTER COLUMN id SET DEFAULT nextval('protected_environment_deploy_access_levels_id_seq'::regclass);
+
+ALTER TABLE ONLY protected_environments ALTER COLUMN id SET DEFAULT nextval('protected_environments_id_seq'::regclass);
+
+ALTER TABLE ONLY protected_tag_create_access_levels ALTER COLUMN id SET DEFAULT nextval('protected_tag_create_access_levels_id_seq'::regclass);
+
+ALTER TABLE ONLY protected_tags ALTER COLUMN id SET DEFAULT nextval('protected_tags_id_seq'::regclass);
+
+ALTER TABLE ONLY push_rules ALTER COLUMN id SET DEFAULT nextval('push_rules_id_seq'::regclass);
+
+ALTER TABLE ONLY redirect_routes ALTER COLUMN id SET DEFAULT nextval('redirect_routes_id_seq'::regclass);
+
+ALTER TABLE ONLY release_links ALTER COLUMN id SET DEFAULT nextval('release_links_id_seq'::regclass);
+
+ALTER TABLE ONLY releases ALTER COLUMN id SET DEFAULT nextval('releases_id_seq'::regclass);
+
+ALTER TABLE ONLY remote_mirrors ALTER COLUMN id SET DEFAULT nextval('remote_mirrors_id_seq'::regclass);
+
+ALTER TABLE ONLY resource_label_events ALTER COLUMN id SET DEFAULT nextval('resource_label_events_id_seq'::regclass);
+
+ALTER TABLE ONLY resource_weight_events ALTER COLUMN id SET DEFAULT nextval('resource_weight_events_id_seq'::regclass);
+
+ALTER TABLE ONLY reviews ALTER COLUMN id SET DEFAULT nextval('reviews_id_seq'::regclass);
+
+ALTER TABLE ONLY routes ALTER COLUMN id SET DEFAULT nextval('routes_id_seq'::regclass);
+
+ALTER TABLE ONLY saml_providers ALTER COLUMN id SET DEFAULT nextval('saml_providers_id_seq'::regclass);
+
+ALTER TABLE ONLY scim_oauth_access_tokens ALTER COLUMN id SET DEFAULT nextval('scim_oauth_access_tokens_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);
+
+ALTER TABLE ONLY sent_notifications ALTER COLUMN id SET DEFAULT nextval('sent_notifications_id_seq'::regclass);
+
+ALTER TABLE ONLY sentry_issues ALTER COLUMN id SET DEFAULT nextval('sentry_issues_id_seq'::regclass);
+
+ALTER TABLE ONLY services ALTER COLUMN id SET DEFAULT nextval('services_id_seq'::regclass);
+
+ALTER TABLE ONLY shards ALTER COLUMN id SET DEFAULT nextval('shards_id_seq'::regclass);
+
+ALTER TABLE ONLY slack_integrations ALTER COLUMN id SET DEFAULT nextval('slack_integrations_id_seq'::regclass);
+
+ALTER TABLE ONLY smartcard_identities ALTER COLUMN id SET DEFAULT nextval('smartcard_identities_id_seq'::regclass);
+
+ALTER TABLE ONLY snippet_user_mentions ALTER COLUMN id SET DEFAULT nextval('snippet_user_mentions_id_seq'::regclass);
+
+ALTER TABLE ONLY snippets ALTER COLUMN id SET DEFAULT nextval('snippets_id_seq'::regclass);
+
+ALTER TABLE ONLY software_license_policies ALTER COLUMN id SET DEFAULT nextval('software_license_policies_id_seq'::regclass);
+
+ALTER TABLE ONLY software_licenses ALTER COLUMN id SET DEFAULT nextval('software_licenses_id_seq'::regclass);
+
+ALTER TABLE ONLY spam_logs ALTER COLUMN id SET DEFAULT nextval('spam_logs_id_seq'::regclass);
+
+ALTER TABLE ONLY subscriptions ALTER COLUMN id SET DEFAULT nextval('subscriptions_id_seq'::regclass);
+
+ALTER TABLE ONLY suggestions ALTER COLUMN id SET DEFAULT nextval('suggestions_id_seq'::regclass);
+
+ALTER TABLE ONLY system_note_metadata ALTER COLUMN id SET DEFAULT nextval('system_note_metadata_id_seq'::regclass);
+
+ALTER TABLE ONLY taggings ALTER COLUMN id SET DEFAULT nextval('taggings_id_seq'::regclass);
+
+ALTER TABLE ONLY tags ALTER COLUMN id SET DEFAULT nextval('tags_id_seq'::regclass);
+
+ALTER TABLE ONLY term_agreements ALTER COLUMN id SET DEFAULT nextval('term_agreements_id_seq'::regclass);
+
+ALTER TABLE ONLY timelogs ALTER COLUMN id SET DEFAULT nextval('timelogs_id_seq'::regclass);
+
+ALTER TABLE ONLY todos ALTER COLUMN id SET DEFAULT nextval('todos_id_seq'::regclass);
+
+ALTER TABLE ONLY trending_projects ALTER COLUMN id SET DEFAULT nextval('trending_projects_id_seq'::regclass);
+
+ALTER TABLE ONLY u2f_registrations ALTER COLUMN id SET DEFAULT nextval('u2f_registrations_id_seq'::regclass);
+
+ALTER TABLE ONLY 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);
+
+ALTER TABLE ONLY user_callouts ALTER COLUMN id SET DEFAULT nextval('user_callouts_id_seq'::regclass);
+
+ALTER TABLE ONLY user_custom_attributes ALTER COLUMN id SET DEFAULT nextval('user_custom_attributes_id_seq'::regclass);
+
+ALTER TABLE ONLY user_preferences ALTER COLUMN id SET DEFAULT nextval('user_preferences_id_seq'::regclass);
+
+ALTER TABLE ONLY user_statuses ALTER COLUMN user_id SET DEFAULT nextval('user_statuses_user_id_seq'::regclass);
+
+ALTER TABLE ONLY user_synced_attributes_metadata ALTER COLUMN id SET DEFAULT nextval('user_synced_attributes_metadata_id_seq'::regclass);
+
+ALTER TABLE ONLY users ALTER COLUMN id SET DEFAULT nextval('users_id_seq'::regclass);
+
+ALTER TABLE ONLY users_ops_dashboard_projects ALTER COLUMN id SET DEFAULT nextval('users_ops_dashboard_projects_id_seq'::regclass);
+
+ALTER TABLE ONLY users_star_projects ALTER COLUMN id SET DEFAULT nextval('users_star_projects_id_seq'::regclass);
+
+ALTER TABLE ONLY vulnerabilities ALTER COLUMN id SET DEFAULT nextval('vulnerabilities_id_seq'::regclass);
+
+ALTER TABLE ONLY vulnerability_feedback ALTER COLUMN id SET DEFAULT nextval('vulnerability_feedback_id_seq'::regclass);
+
+ALTER TABLE ONLY vulnerability_identifiers ALTER COLUMN id SET DEFAULT nextval('vulnerability_identifiers_id_seq'::regclass);
+
+ALTER TABLE ONLY vulnerability_issue_links ALTER COLUMN id SET DEFAULT nextval('vulnerability_issue_links_id_seq'::regclass);
+
+ALTER TABLE ONLY vulnerability_occurrence_identifiers ALTER COLUMN id SET DEFAULT nextval('vulnerability_occurrence_identifiers_id_seq'::regclass);
+
+ALTER TABLE ONLY vulnerability_occurrence_pipelines ALTER COLUMN id SET DEFAULT nextval('vulnerability_occurrence_pipelines_id_seq'::regclass);
+
+ALTER TABLE ONLY vulnerability_occurrences ALTER COLUMN id SET DEFAULT nextval('vulnerability_occurrences_id_seq'::regclass);
+
+ALTER TABLE ONLY vulnerability_scanners ALTER COLUMN id SET DEFAULT nextval('vulnerability_scanners_id_seq'::regclass);
+
+ALTER TABLE ONLY web_hook_logs ALTER COLUMN id SET DEFAULT nextval('web_hook_logs_id_seq'::regclass);
+
+ALTER TABLE ONLY web_hooks ALTER COLUMN id SET DEFAULT nextval('web_hooks_id_seq'::regclass);
+
+ALTER TABLE ONLY webauthn_registrations ALTER COLUMN id SET DEFAULT nextval('webauthn_registrations_id_seq'::regclass);
+
+ALTER TABLE ONLY x509_certificates ALTER COLUMN id SET DEFAULT nextval('x509_certificates_id_seq'::regclass);
+
+ALTER TABLE ONLY x509_commit_signatures ALTER COLUMN id SET DEFAULT nextval('x509_commit_signatures_id_seq'::regclass);
+
+ALTER TABLE ONLY x509_issuers ALTER COLUMN id SET DEFAULT nextval('x509_issuers_id_seq'::regclass);
+
+ALTER TABLE ONLY zoom_meetings ALTER COLUMN id SET DEFAULT nextval('zoom_meetings_id_seq'::regclass);
+
+ALTER TABLE ONLY abuse_reports
+ ADD CONSTRAINT abuse_reports_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY alerts_service_data
+ ADD CONSTRAINT alerts_service_data_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY allowed_email_domains
+ ADD CONSTRAINT allowed_email_domains_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY analytics_cycle_analytics_group_stages
+ ADD CONSTRAINT analytics_cycle_analytics_group_stages_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY analytics_cycle_analytics_project_stages
+ ADD CONSTRAINT analytics_cycle_analytics_project_stages_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY analytics_repository_file_commits
+ ADD CONSTRAINT analytics_repository_file_commits_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY analytics_repository_file_edits
+ ADD CONSTRAINT analytics_repository_file_edits_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY analytics_repository_files
+ ADD CONSTRAINT analytics_repository_files_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY appearances
+ ADD CONSTRAINT appearances_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY application_setting_terms
+ ADD CONSTRAINT application_setting_terms_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY application_settings
+ ADD CONSTRAINT application_settings_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY approval_merge_request_rule_sources
+ ADD CONSTRAINT approval_merge_request_rule_sources_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY approval_merge_request_rules_approved_approvers
+ ADD CONSTRAINT approval_merge_request_rules_approved_approvers_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY approval_merge_request_rules_groups
+ ADD CONSTRAINT approval_merge_request_rules_groups_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY approval_merge_request_rules
+ ADD CONSTRAINT approval_merge_request_rules_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY approval_merge_request_rules_users
+ ADD CONSTRAINT approval_merge_request_rules_users_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY approval_project_rules_groups
+ ADD CONSTRAINT approval_project_rules_groups_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY approval_project_rules
+ ADD CONSTRAINT approval_project_rules_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY approval_project_rules_users
+ ADD CONSTRAINT approval_project_rules_users_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY approvals
+ ADD CONSTRAINT approvals_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY approver_groups
+ ADD CONSTRAINT approver_groups_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY approvers
+ ADD CONSTRAINT approvers_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY audit_events
+ ADD CONSTRAINT audit_events_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY award_emoji
+ ADD CONSTRAINT award_emoji_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY aws_roles
+ ADD CONSTRAINT aws_roles_pkey PRIMARY KEY (user_id);
+
+ALTER TABLE ONLY badges
+ ADD CONSTRAINT badges_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY board_assignees
+ ADD CONSTRAINT board_assignees_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY board_group_recent_visits
+ ADD CONSTRAINT board_group_recent_visits_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY board_labels
+ ADD CONSTRAINT board_labels_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY board_project_recent_visits
+ ADD CONSTRAINT board_project_recent_visits_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY boards
+ ADD CONSTRAINT boards_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY broadcast_messages
+ ADD CONSTRAINT broadcast_messages_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY chat_names
+ ADD CONSTRAINT chat_names_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY chat_teams
+ ADD CONSTRAINT chat_teams_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY ci_build_needs
+ ADD CONSTRAINT ci_build_needs_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY ci_build_trace_chunks
+ ADD CONSTRAINT ci_build_trace_chunks_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY ci_build_trace_section_names
+ ADD CONSTRAINT ci_build_trace_section_names_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY ci_builds_metadata
+ ADD CONSTRAINT ci_builds_metadata_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY ci_builds
+ ADD CONSTRAINT ci_builds_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY ci_builds_runner_session
+ ADD CONSTRAINT ci_builds_runner_session_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY ci_group_variables
+ ADD CONSTRAINT ci_group_variables_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY ci_job_artifacts
+ ADD CONSTRAINT ci_job_artifacts_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY ci_job_variables
+ ADD CONSTRAINT ci_job_variables_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY ci_pipeline_chat_data
+ ADD CONSTRAINT ci_pipeline_chat_data_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY ci_pipeline_schedule_variables
+ ADD CONSTRAINT ci_pipeline_schedule_variables_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY ci_pipeline_schedules
+ ADD CONSTRAINT ci_pipeline_schedules_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY ci_pipeline_variables
+ ADD CONSTRAINT ci_pipeline_variables_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY ci_pipelines_config
+ ADD CONSTRAINT ci_pipelines_config_pkey PRIMARY KEY (pipeline_id);
+
+ALTER TABLE ONLY ci_pipelines
+ ADD CONSTRAINT ci_pipelines_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY ci_refs
+ ADD CONSTRAINT ci_refs_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY ci_resource_groups
+ ADD CONSTRAINT ci_resource_groups_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY ci_resources
+ ADD CONSTRAINT ci_resources_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY ci_runner_namespaces
+ ADD CONSTRAINT ci_runner_namespaces_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY ci_runner_projects
+ ADD CONSTRAINT ci_runner_projects_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY ci_runners
+ ADD CONSTRAINT ci_runners_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY ci_sources_pipelines
+ ADD CONSTRAINT ci_sources_pipelines_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY ci_stages
+ ADD CONSTRAINT ci_stages_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY ci_subscriptions_projects
+ ADD CONSTRAINT ci_subscriptions_projects_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY ci_trigger_requests
+ ADD CONSTRAINT ci_trigger_requests_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY ci_triggers
+ ADD CONSTRAINT ci_triggers_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY ci_variables
+ ADD CONSTRAINT ci_variables_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY cluster_groups
+ ADD CONSTRAINT cluster_groups_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY cluster_platforms_kubernetes
+ ADD CONSTRAINT cluster_platforms_kubernetes_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY cluster_projects
+ ADD CONSTRAINT cluster_projects_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY cluster_providers_aws
+ ADD CONSTRAINT cluster_providers_aws_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY cluster_providers_gcp
+ ADD CONSTRAINT cluster_providers_gcp_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY clusters_applications_cert_managers
+ ADD CONSTRAINT clusters_applications_cert_managers_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY clusters_applications_crossplane
+ ADD CONSTRAINT clusters_applications_crossplane_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY clusters_applications_elastic_stacks
+ ADD CONSTRAINT clusters_applications_elastic_stacks_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY clusters_applications_helm
+ ADD CONSTRAINT clusters_applications_helm_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY clusters_applications_ingress
+ ADD CONSTRAINT clusters_applications_ingress_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY clusters_applications_jupyter
+ ADD CONSTRAINT clusters_applications_jupyter_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY clusters_applications_knative
+ ADD CONSTRAINT clusters_applications_knative_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY clusters_applications_prometheus
+ ADD CONSTRAINT clusters_applications_prometheus_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY clusters_applications_runners
+ ADD CONSTRAINT clusters_applications_runners_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY clusters_kubernetes_namespaces
+ ADD CONSTRAINT clusters_kubernetes_namespaces_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY clusters
+ ADD CONSTRAINT clusters_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY commit_user_mentions
+ ADD CONSTRAINT commit_user_mentions_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY container_expiration_policies
+ ADD CONSTRAINT container_expiration_policies_pkey PRIMARY KEY (project_id);
+
+ALTER TABLE ONLY container_repositories
+ ADD CONSTRAINT container_repositories_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY conversational_development_index_metrics
+ ADD CONSTRAINT conversational_development_index_metrics_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY dependency_proxy_blobs
+ ADD CONSTRAINT dependency_proxy_blobs_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY dependency_proxy_group_settings
+ ADD CONSTRAINT dependency_proxy_group_settings_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY deploy_keys_projects
+ ADD CONSTRAINT deploy_keys_projects_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY deploy_tokens
+ ADD CONSTRAINT deploy_tokens_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY deployments
+ ADD CONSTRAINT deployments_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY description_versions
+ ADD CONSTRAINT description_versions_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY design_management_designs
+ ADD CONSTRAINT design_management_designs_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY design_management_versions
+ ADD CONSTRAINT design_management_versions_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY design_user_mentions
+ ADD CONSTRAINT design_user_mentions_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY draft_notes
+ ADD CONSTRAINT draft_notes_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY emails
+ ADD CONSTRAINT emails_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY environments
+ ADD CONSTRAINT environments_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY epic_issues
+ ADD CONSTRAINT epic_issues_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY epic_metrics
+ ADD CONSTRAINT epic_metrics_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY epic_user_mentions
+ ADD CONSTRAINT epic_user_mentions_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY epics
+ ADD CONSTRAINT epics_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY events
+ ADD CONSTRAINT events_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY evidences
+ ADD CONSTRAINT evidences_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY external_pull_requests
+ ADD CONSTRAINT external_pull_requests_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY feature_gates
+ ADD CONSTRAINT feature_gates_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY features
+ ADD CONSTRAINT features_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY fork_network_members
+ ADD CONSTRAINT fork_network_members_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY fork_networks
+ ADD CONSTRAINT fork_networks_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY forked_project_links
+ ADD CONSTRAINT forked_project_links_pkey PRIMARY KEY (id);
+
+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);
+
+ALTER TABLE ONLY geo_hashed_storage_attachments_events
+ ADD CONSTRAINT geo_hashed_storage_attachments_events_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY geo_hashed_storage_migrated_events
+ ADD CONSTRAINT geo_hashed_storage_migrated_events_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY geo_job_artifact_deleted_events
+ ADD CONSTRAINT geo_job_artifact_deleted_events_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY geo_lfs_object_deleted_events
+ ADD CONSTRAINT geo_lfs_object_deleted_events_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY geo_node_namespace_links
+ ADD CONSTRAINT geo_node_namespace_links_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY geo_node_statuses
+ ADD CONSTRAINT geo_node_statuses_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY geo_nodes
+ ADD CONSTRAINT geo_nodes_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY geo_repositories_changed_events
+ ADD CONSTRAINT geo_repositories_changed_events_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY geo_repository_created_events
+ ADD CONSTRAINT geo_repository_created_events_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY geo_repository_deleted_events
+ ADD CONSTRAINT geo_repository_deleted_events_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY geo_repository_renamed_events
+ ADD CONSTRAINT geo_repository_renamed_events_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY geo_repository_updated_events
+ ADD CONSTRAINT geo_repository_updated_events_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY geo_reset_checksum_events
+ ADD CONSTRAINT geo_reset_checksum_events_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY geo_upload_deleted_events
+ ADD CONSTRAINT geo_upload_deleted_events_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY gitlab_subscription_histories
+ ADD CONSTRAINT gitlab_subscription_histories_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY gitlab_subscriptions
+ ADD CONSTRAINT gitlab_subscriptions_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY gpg_key_subkeys
+ ADD CONSTRAINT gpg_key_subkeys_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY gpg_keys
+ ADD CONSTRAINT gpg_keys_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY gpg_signatures
+ ADD CONSTRAINT gpg_signatures_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY grafana_integrations
+ ADD CONSTRAINT grafana_integrations_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY group_custom_attributes
+ ADD CONSTRAINT group_custom_attributes_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY group_deletion_schedules
+ ADD CONSTRAINT group_deletion_schedules_pkey PRIMARY KEY (group_id);
+
+ALTER TABLE ONLY group_group_links
+ ADD CONSTRAINT group_group_links_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY historical_data
+ ADD CONSTRAINT historical_data_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY identities
+ ADD CONSTRAINT identities_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY import_export_uploads
+ ADD CONSTRAINT import_export_uploads_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY import_failures
+ ADD CONSTRAINT import_failures_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY index_statuses
+ ADD CONSTRAINT index_statuses_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY insights
+ ADD CONSTRAINT insights_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY internal_ids
+ ADD CONSTRAINT internal_ids_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY ip_restrictions
+ ADD CONSTRAINT ip_restrictions_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY issue_links
+ ADD CONSTRAINT issue_links_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY issue_metrics
+ ADD CONSTRAINT issue_metrics_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY issue_tracker_data
+ ADD CONSTRAINT issue_tracker_data_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY issue_user_mentions
+ ADD CONSTRAINT issue_user_mentions_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY issues
+ ADD CONSTRAINT issues_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY jira_connect_installations
+ ADD CONSTRAINT jira_connect_installations_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY jira_connect_subscriptions
+ ADD CONSTRAINT jira_connect_subscriptions_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY jira_tracker_data
+ ADD CONSTRAINT jira_tracker_data_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY keys
+ ADD CONSTRAINT keys_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY label_links
+ ADD CONSTRAINT label_links_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY label_priorities
+ ADD CONSTRAINT label_priorities_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY labels
+ ADD CONSTRAINT labels_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY ldap_group_links
+ ADD CONSTRAINT ldap_group_links_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY lfs_file_locks
+ ADD CONSTRAINT lfs_file_locks_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY lfs_objects
+ ADD CONSTRAINT lfs_objects_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY lfs_objects_projects
+ ADD CONSTRAINT lfs_objects_projects_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY licenses
+ ADD CONSTRAINT licenses_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY list_user_preferences
+ ADD CONSTRAINT list_user_preferences_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY lists
+ ADD CONSTRAINT lists_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY members
+ ADD CONSTRAINT members_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY merge_request_assignees
+ ADD CONSTRAINT merge_request_assignees_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY merge_request_blocks
+ ADD CONSTRAINT merge_request_blocks_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY merge_request_context_commits
+ ADD CONSTRAINT merge_request_context_commits_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY merge_request_diffs
+ ADD CONSTRAINT merge_request_diffs_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY merge_request_metrics
+ ADD CONSTRAINT merge_request_metrics_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY merge_request_user_mentions
+ ADD CONSTRAINT merge_request_user_mentions_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY merge_requests_closing_issues
+ ADD CONSTRAINT merge_requests_closing_issues_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY merge_requests
+ ADD CONSTRAINT merge_requests_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY merge_trains
+ ADD CONSTRAINT merge_trains_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY milestones
+ ADD CONSTRAINT milestones_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY namespace_aggregation_schedules
+ ADD CONSTRAINT namespace_aggregation_schedules_pkey PRIMARY KEY (namespace_id);
+
+ALTER TABLE ONLY namespace_root_storage_statistics
+ ADD CONSTRAINT namespace_root_storage_statistics_pkey PRIMARY KEY (namespace_id);
+
+ALTER TABLE ONLY namespace_statistics
+ ADD CONSTRAINT namespace_statistics_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY namespaces
+ ADD CONSTRAINT namespaces_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY note_diff_files
+ ADD CONSTRAINT note_diff_files_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY notes
+ ADD CONSTRAINT notes_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY notification_settings
+ ADD CONSTRAINT notification_settings_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY oauth_access_grants
+ ADD CONSTRAINT oauth_access_grants_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY oauth_access_tokens
+ ADD CONSTRAINT oauth_access_tokens_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY oauth_applications
+ ADD CONSTRAINT oauth_applications_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY oauth_openid_requests
+ ADD CONSTRAINT oauth_openid_requests_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY operations_feature_flag_scopes
+ ADD CONSTRAINT operations_feature_flag_scopes_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY operations_feature_flags_clients
+ ADD CONSTRAINT operations_feature_flags_clients_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY operations_feature_flags
+ ADD CONSTRAINT operations_feature_flags_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY packages_build_infos
+ ADD CONSTRAINT packages_build_infos_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY packages_conan_file_metadata
+ ADD CONSTRAINT packages_conan_file_metadata_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY packages_conan_metadata
+ ADD CONSTRAINT packages_conan_metadata_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY packages_dependencies
+ ADD CONSTRAINT packages_dependencies_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY packages_dependency_links
+ ADD CONSTRAINT packages_dependency_links_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY packages_maven_metadata
+ ADD CONSTRAINT packages_maven_metadata_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY packages_package_files
+ ADD CONSTRAINT packages_package_files_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY packages_packages
+ ADD CONSTRAINT packages_packages_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY packages_tags
+ ADD CONSTRAINT packages_tags_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY pages_domain_acme_orders
+ ADD CONSTRAINT pages_domain_acme_orders_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY pages_domains
+ ADD CONSTRAINT pages_domains_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY path_locks
+ ADD CONSTRAINT path_locks_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY personal_access_tokens
+ ADD CONSTRAINT personal_access_tokens_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY plan_limits
+ ADD CONSTRAINT plan_limits_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY plans
+ ADD CONSTRAINT plans_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY pool_repositories
+ ADD CONSTRAINT pool_repositories_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY programming_languages
+ ADD CONSTRAINT programming_languages_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY project_alerting_settings
+ ADD CONSTRAINT project_alerting_settings_pkey PRIMARY KEY (project_id);
+
+ALTER TABLE ONLY project_aliases
+ ADD CONSTRAINT project_aliases_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY project_auto_devops
+ ADD CONSTRAINT project_auto_devops_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY project_ci_cd_settings
+ ADD CONSTRAINT project_ci_cd_settings_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY project_custom_attributes
+ ADD CONSTRAINT project_custom_attributes_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY project_daily_statistics
+ ADD CONSTRAINT project_daily_statistics_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY project_deploy_tokens
+ ADD CONSTRAINT project_deploy_tokens_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY project_error_tracking_settings
+ ADD CONSTRAINT project_error_tracking_settings_pkey PRIMARY KEY (project_id);
+
+ALTER TABLE ONLY project_feature_usages
+ ADD CONSTRAINT project_feature_usages_pkey PRIMARY KEY (project_id);
+
+ALTER TABLE ONLY project_features
+ ADD CONSTRAINT project_features_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY project_group_links
+ ADD CONSTRAINT project_group_links_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY project_import_data
+ ADD CONSTRAINT project_import_data_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY project_incident_management_settings
+ ADD CONSTRAINT project_incident_management_settings_pkey PRIMARY KEY (project_id);
+
+ALTER TABLE ONLY project_metrics_settings
+ ADD CONSTRAINT project_metrics_settings_pkey PRIMARY KEY (project_id);
+
+ALTER TABLE ONLY project_mirror_data
+ ADD CONSTRAINT project_mirror_data_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY project_repositories
+ ADD CONSTRAINT project_repositories_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY project_repository_states
+ ADD CONSTRAINT project_repository_states_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY project_settings
+ ADD CONSTRAINT project_settings_pkey PRIMARY KEY (project_id);
+
+ALTER TABLE ONLY project_statistics
+ ADD CONSTRAINT project_statistics_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY project_tracing_settings
+ ADD CONSTRAINT project_tracing_settings_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY projects
+ ADD CONSTRAINT projects_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY prometheus_alert_events
+ ADD CONSTRAINT prometheus_alert_events_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY prometheus_alerts
+ ADD CONSTRAINT prometheus_alerts_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY prometheus_metrics
+ ADD CONSTRAINT prometheus_metrics_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY protected_branch_merge_access_levels
+ ADD CONSTRAINT protected_branch_merge_access_levels_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY protected_branch_push_access_levels
+ ADD CONSTRAINT protected_branch_push_access_levels_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY protected_branch_unprotect_access_levels
+ ADD CONSTRAINT protected_branch_unprotect_access_levels_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY protected_branches
+ ADD CONSTRAINT protected_branches_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY protected_environment_deploy_access_levels
+ ADD CONSTRAINT protected_environment_deploy_access_levels_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY protected_environments
+ ADD CONSTRAINT protected_environments_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY protected_tag_create_access_levels
+ ADD CONSTRAINT protected_tag_create_access_levels_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY protected_tags
+ ADD CONSTRAINT protected_tags_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY push_rules
+ ADD CONSTRAINT push_rules_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY redirect_routes
+ ADD CONSTRAINT redirect_routes_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY release_links
+ ADD CONSTRAINT release_links_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY releases
+ ADD CONSTRAINT releases_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY remote_mirrors
+ ADD CONSTRAINT remote_mirrors_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY resource_label_events
+ ADD CONSTRAINT resource_label_events_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY resource_weight_events
+ ADD CONSTRAINT resource_weight_events_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY reviews
+ ADD CONSTRAINT reviews_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY routes
+ ADD CONSTRAINT routes_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY saml_providers
+ ADD CONSTRAINT saml_providers_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY scim_oauth_access_tokens
+ ADD CONSTRAINT scim_oauth_access_tokens_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY self_managed_prometheus_alert_events
+ ADD CONSTRAINT self_managed_prometheus_alert_events_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY sent_notifications
+ ADD CONSTRAINT sent_notifications_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY sentry_issues
+ ADD CONSTRAINT sentry_issues_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY serverless_domain_cluster
+ ADD CONSTRAINT serverless_domain_cluster_pkey PRIMARY KEY (uuid);
+
+ALTER TABLE ONLY service_desk_settings
+ ADD CONSTRAINT service_desk_settings_pkey PRIMARY KEY (project_id);
+
+ALTER TABLE ONLY services
+ ADD CONSTRAINT services_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY shards
+ ADD CONSTRAINT shards_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY slack_integrations
+ ADD CONSTRAINT slack_integrations_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY smartcard_identities
+ ADD CONSTRAINT smartcard_identities_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY snippet_user_mentions
+ ADD CONSTRAINT snippet_user_mentions_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY snippets
+ ADD CONSTRAINT snippets_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY software_license_policies
+ ADD CONSTRAINT software_license_policies_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY software_licenses
+ ADD CONSTRAINT software_licenses_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY spam_logs
+ ADD CONSTRAINT spam_logs_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY subscriptions
+ ADD CONSTRAINT subscriptions_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY suggestions
+ ADD CONSTRAINT suggestions_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY system_note_metadata
+ ADD CONSTRAINT system_note_metadata_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY taggings
+ ADD CONSTRAINT taggings_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY tags
+ ADD CONSTRAINT tags_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY term_agreements
+ ADD CONSTRAINT term_agreements_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY timelogs
+ ADD CONSTRAINT timelogs_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY todos
+ ADD CONSTRAINT todos_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY trending_projects
+ ADD CONSTRAINT trending_projects_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY u2f_registrations
+ ADD CONSTRAINT u2f_registrations_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY uploads
+ ADD CONSTRAINT uploads_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY user_agent_details
+ ADD CONSTRAINT user_agent_details_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY user_callouts
+ ADD CONSTRAINT user_callouts_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY user_custom_attributes
+ ADD CONSTRAINT user_custom_attributes_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY user_preferences
+ ADD CONSTRAINT user_preferences_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY user_statuses
+ ADD CONSTRAINT user_statuses_pkey PRIMARY KEY (user_id);
+
+ALTER TABLE ONLY user_synced_attributes_metadata
+ ADD CONSTRAINT user_synced_attributes_metadata_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY users_ops_dashboard_projects
+ ADD CONSTRAINT users_ops_dashboard_projects_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY users
+ ADD CONSTRAINT users_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY users_star_projects
+ ADD CONSTRAINT users_star_projects_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY vulnerabilities
+ ADD CONSTRAINT vulnerabilities_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY vulnerability_feedback
+ ADD CONSTRAINT vulnerability_feedback_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY vulnerability_identifiers
+ ADD CONSTRAINT vulnerability_identifiers_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY vulnerability_issue_links
+ ADD CONSTRAINT vulnerability_issue_links_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY vulnerability_occurrence_identifiers
+ ADD CONSTRAINT vulnerability_occurrence_identifiers_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY vulnerability_occurrence_pipelines
+ ADD CONSTRAINT vulnerability_occurrence_pipelines_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY vulnerability_occurrences
+ ADD CONSTRAINT vulnerability_occurrences_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY vulnerability_scanners
+ ADD CONSTRAINT vulnerability_scanners_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY web_hook_logs
+ ADD CONSTRAINT web_hook_logs_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY web_hooks
+ ADD CONSTRAINT web_hooks_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY webauthn_registrations
+ ADD CONSTRAINT webauthn_registrations_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY x509_certificates
+ ADD CONSTRAINT x509_certificates_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY x509_commit_signatures
+ ADD CONSTRAINT x509_commit_signatures_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY x509_issuers
+ ADD CONSTRAINT x509_issuers_pkey PRIMARY KEY (id);
+
+ALTER TABLE ONLY zoom_meetings
+ ADD CONSTRAINT zoom_meetings_pkey PRIMARY KEY (id);
+
+CREATE INDEX analytics_index_audit_events_on_created_at_and_author_id ON 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);
+
+CREATE UNIQUE INDEX analytics_repository_languages_unique_index ON analytics_language_trend_repository_languages USING btree (programming_language_id, project_id, snapshot_date);
+
+CREATE UNIQUE INDEX any_approver_merge_request_rule_type_unique_index ON approval_merge_request_rules USING btree (merge_request_id, rule_type) WHERE (rule_type = 4);
+
+CREATE UNIQUE INDEX any_approver_project_rule_type_unique_index ON approval_project_rules USING btree (project_id) WHERE (rule_type = 3);
+
+CREATE UNIQUE INDEX approval_rule_name_index_for_code_owners ON approval_merge_request_rules USING btree (merge_request_id, code_owner, name) WHERE (code_owner = true);
+
+CREATE INDEX ci_builds_gitlab_monitor_metrics ON ci_builds USING btree (status, created_at, project_id) WHERE ((type)::text = 'Ci::Build'::text);
+
+CREATE INDEX code_owner_approval_required ON protected_branches USING btree (project_id, code_owner_approval_required) WHERE (code_owner_approval_required = true);
+
+CREATE INDEX commit_id_and_note_id_index ON commit_user_mentions USING btree (commit_id, note_id);
+
+CREATE UNIQUE INDEX design_management_designs_versions_uniqueness ON design_management_designs_versions USING btree (design_id, version_id);
+
+CREATE INDEX design_user_mentions_on_design_id_and_note_id_index ON design_user_mentions USING btree (design_id, note_id);
+
+CREATE INDEX epic_mentions_temp_index ON notes USING btree (id) WHERE ((note ~~ '%@%'::text) AND ((noteable_type)::text = 'Epic'::text));
+
+CREATE UNIQUE INDEX epic_user_mentions_on_epic_id_and_note_id_index ON epic_user_mentions USING btree (epic_id, note_id);
+
+CREATE UNIQUE INDEX epic_user_mentions_on_epic_id_index ON epic_user_mentions USING btree (epic_id) WHERE (note_id IS NULL);
+
+CREATE UNIQUE INDEX idx_deployment_merge_requests_unique_index ON deployment_merge_requests USING btree (deployment_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);
+
+CREATE INDEX idx_issues_on_project_id_and_created_at_and_id_and_state_id ON issues USING btree (project_id, created_at, id, state_id);
+
+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_due_date_and_id_and_state_partial ON issues USING btree (project_id, due_date, id, state) WHERE (due_date IS NOT NULL);
+
+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);
+
+CREATE INDEX idx_issues_on_state_id ON issues USING btree (state_id);
+
+CREATE INDEX idx_jira_connect_subscriptions_on_installation_id ON jira_connect_subscriptions USING btree (jira_connect_installation_id);
+
+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_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_source_project_and_branch_state_opened ON merge_requests USING btree (source_project_id, source_branch) WHERE (state_id = 1);
+
+CREATE INDEX idx_merge_requests_on_state_id_and_merge_status ON merge_requests USING btree (state_id, merge_status) WHERE ((state_id = 1) AND ((merge_status)::text = 'can_be_merged'::text));
+
+CREATE INDEX idx_merge_requests_on_target_project_id_and_iid_opened ON merge_requests USING btree (target_project_id, iid) WHERE (state_id = 1);
+
+CREATE INDEX idx_mr_cc_diff_files_on_mr_cc_id ON merge_request_context_commit_diff_files USING btree (merge_request_context_commit_id);
+
+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_packages_packages_on_project_id_name_version_package_type ON packages_packages USING btree (project_id, name, version, package_type);
+
+CREATE UNIQUE INDEX idx_pkgs_dep_links_on_pkg_id_dependency_id_dependency_type ON packages_dependency_links USING btree (package_id, dependency_id, dependency_type);
+
+CREATE INDEX idx_proj_feat_usg_on_jira_dvcs_cloud_last_sync_at_and_proj_id ON project_feature_usages USING btree (jira_dvcs_cloud_last_sync_at, project_id) WHERE (jira_dvcs_cloud_last_sync_at IS NOT NULL);
+
+CREATE INDEX idx_proj_feat_usg_on_jira_dvcs_server_last_sync_at_and_proj_id ON project_feature_usages USING btree (jira_dvcs_server_last_sync_at, project_id) WHERE (jira_dvcs_server_last_sync_at IS NOT NULL);
+
+CREATE UNIQUE INDEX idx_project_id_payload_key_self_managed_prometheus_alert_events ON self_managed_prometheus_alert_events USING btree (project_id, payload_key);
+
+CREATE INDEX idx_project_repository_check_partial ON projects USING btree (repository_storage, created_at) WHERE (last_repository_check_at IS NULL);
+
+CREATE INDEX idx_projects_on_repository_storage_last_repository_updated_at ON projects USING btree (id, repository_storage, last_repository_updated_at);
+
+CREATE INDEX idx_repository_states_on_last_repository_verification_ran_at ON project_repository_states USING btree (project_id, last_repository_verification_ran_at) WHERE ((repository_verification_checksum IS NOT NULL) AND (last_repository_verification_failure IS NULL));
+
+CREATE INDEX idx_repository_states_on_last_wiki_verification_ran_at ON project_repository_states USING btree (project_id, last_wiki_verification_ran_at) WHERE ((wiki_verification_checksum IS NOT NULL) AND (last_wiki_verification_failure IS NULL));
+
+CREATE INDEX idx_repository_states_on_repository_failure_partial ON project_repository_states USING btree (last_repository_verification_failure) WHERE (last_repository_verification_failure IS NOT NULL);
+
+CREATE INDEX idx_repository_states_on_wiki_failure_partial ON project_repository_states USING btree (last_wiki_verification_failure) WHERE (last_wiki_verification_failure IS NOT NULL);
+
+CREATE INDEX idx_repository_states_outdated_checksums ON project_repository_states USING btree (project_id) WHERE (((repository_verification_checksum IS NULL) AND (last_repository_verification_failure IS NULL)) OR ((wiki_verification_checksum IS NULL) AND (last_wiki_verification_failure IS NULL)));
+
+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_vulnerability_issue_links_on_vulnerability_id_and_issue_id ON vulnerability_issue_links USING btree (vulnerability_id, issue_id);
+
+CREATE UNIQUE INDEX idx_vulnerability_issue_links_on_vulnerability_id_and_link_type ON vulnerability_issue_links USING btree (vulnerability_id, link_type) WHERE (link_type = 2);
+
+CREATE INDEX index_abuse_reports_on_user_id ON abuse_reports USING btree (user_id);
+
+CREATE INDEX index_alerts_service_data_on_service_id ON alerts_service_data USING btree (service_id);
+
+CREATE INDEX index_allowed_email_domains_on_group_id ON allowed_email_domains USING btree (group_id);
+
+CREATE INDEX index_analytics_ca_group_stages_on_end_event_label_id ON analytics_cycle_analytics_group_stages USING btree (end_event_label_id);
+
+CREATE INDEX index_analytics_ca_group_stages_on_group_id ON analytics_cycle_analytics_group_stages USING btree (group_id);
+
+CREATE UNIQUE INDEX index_analytics_ca_group_stages_on_group_id_and_name ON analytics_cycle_analytics_group_stages USING btree (group_id, name);
+
+CREATE INDEX index_analytics_ca_group_stages_on_relative_position ON analytics_cycle_analytics_group_stages USING btree (relative_position);
+
+CREATE INDEX index_analytics_ca_group_stages_on_start_event_label_id ON analytics_cycle_analytics_group_stages USING btree (start_event_label_id);
+
+CREATE INDEX index_analytics_ca_project_stages_on_end_event_label_id ON analytics_cycle_analytics_project_stages USING btree (end_event_label_id);
+
+CREATE INDEX index_analytics_ca_project_stages_on_project_id ON analytics_cycle_analytics_project_stages USING btree (project_id);
+
+CREATE UNIQUE INDEX index_analytics_ca_project_stages_on_project_id_and_name ON analytics_cycle_analytics_project_stages USING btree (project_id, name);
+
+CREATE INDEX index_analytics_ca_project_stages_on_relative_position ON analytics_cycle_analytics_project_stages USING btree (relative_position);
+
+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_repository_file_commits_file_id ON analytics_repository_file_commits USING btree (analytics_repository_file_id);
+
+CREATE INDEX index_analytics_repository_file_edits_on_project_id ON analytics_repository_file_edits USING btree (project_id);
+
+CREATE UNIQUE INDEX index_analytics_repository_files_on_project_id_and_file_path ON analytics_repository_files USING btree (project_id, file_path);
+
+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);
+
+CREATE INDEX index_application_settings_on_usage_stats_set_by_user_id ON application_settings USING btree (usage_stats_set_by_user_id);
+
+CREATE INDEX index_applicationsettings_on_instance_administration_project_id ON application_settings USING btree (instance_administration_project_id);
+
+CREATE UNIQUE INDEX index_approval_merge_request_rule_sources_1 ON approval_merge_request_rule_sources USING btree (approval_merge_request_rule_id);
+
+CREATE INDEX index_approval_merge_request_rule_sources_2 ON approval_merge_request_rule_sources USING btree (approval_project_rule_id);
+
+CREATE INDEX index_approval_merge_request_rules_1 ON approval_merge_request_rules USING btree (merge_request_id, code_owner);
+
+CREATE UNIQUE INDEX index_approval_merge_request_rules_approved_approvers_1 ON approval_merge_request_rules_approved_approvers USING btree (approval_merge_request_rule_id, user_id);
+
+CREATE INDEX index_approval_merge_request_rules_approved_approvers_2 ON approval_merge_request_rules_approved_approvers USING btree (user_id);
+
+CREATE UNIQUE INDEX index_approval_merge_request_rules_groups_1 ON approval_merge_request_rules_groups USING btree (approval_merge_request_rule_id, group_id);
+
+CREATE INDEX index_approval_merge_request_rules_groups_2 ON approval_merge_request_rules_groups USING btree (group_id);
+
+CREATE UNIQUE INDEX index_approval_merge_request_rules_users_1 ON approval_merge_request_rules_users USING btree (approval_merge_request_rule_id, user_id);
+
+CREATE INDEX index_approval_merge_request_rules_users_2 ON approval_merge_request_rules_users USING btree (user_id);
+
+CREATE UNIQUE INDEX index_approval_project_rules_groups_1 ON approval_project_rules_groups USING btree (approval_project_rule_id, group_id);
+
+CREATE INDEX index_approval_project_rules_groups_2 ON approval_project_rules_groups USING btree (group_id);
+
+CREATE INDEX index_approval_project_rules_on_project_id ON approval_project_rules USING btree (project_id);
+
+CREATE INDEX index_approval_project_rules_on_rule_type ON approval_project_rules USING btree (rule_type);
+
+CREATE UNIQUE INDEX index_approval_project_rules_users_1 ON approval_project_rules_users USING btree (approval_project_rule_id, user_id);
+
+CREATE INDEX index_approval_project_rules_users_2 ON approval_project_rules_users USING btree (user_id);
+
+CREATE UNIQUE INDEX index_approval_rule_name_for_code_owners_rule_type ON approval_merge_request_rules USING btree (merge_request_id, rule_type, name) WHERE (rule_type = 2);
+
+CREATE INDEX index_approval_rules_code_owners_rule_type ON approval_merge_request_rules USING btree (merge_request_id, rule_type) WHERE (rule_type = 2);
+
+CREATE INDEX index_approvals_on_merge_request_id ON approvals USING btree (merge_request_id);
+
+CREATE UNIQUE INDEX index_approvals_on_user_id_and_merge_request_id ON approvals USING btree (user_id, merge_request_id);
+
+CREATE INDEX index_approver_groups_on_group_id ON approver_groups USING btree (group_id);
+
+CREATE INDEX index_approver_groups_on_target_id_and_target_type ON approver_groups USING btree (target_id, target_type);
+
+CREATE INDEX index_approvers_on_target_id_and_target_type ON approvers USING btree (target_id, target_type);
+
+CREATE INDEX index_approvers_on_user_id ON approvers USING btree (user_id);
+
+CREATE INDEX index_audit_events_on_entity_id_and_entity_type ON audit_events USING btree (entity_id, entity_type);
+
+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);
+
+CREATE INDEX index_badges_on_group_id ON badges USING btree (group_id);
+
+CREATE INDEX index_badges_on_project_id ON badges USING btree (project_id);
+
+CREATE INDEX index_board_assignees_on_assignee_id ON board_assignees USING btree (assignee_id);
+
+CREATE UNIQUE INDEX index_board_assignees_on_board_id_and_assignee_id ON board_assignees USING btree (board_id, assignee_id);
+
+CREATE INDEX index_board_group_recent_visits_on_board_id ON board_group_recent_visits USING btree (board_id);
+
+CREATE INDEX index_board_group_recent_visits_on_group_id ON board_group_recent_visits USING btree (group_id);
+
+CREATE UNIQUE INDEX index_board_group_recent_visits_on_user_group_and_board ON board_group_recent_visits USING btree (user_id, group_id, board_id);
+
+CREATE INDEX index_board_group_recent_visits_on_user_id ON board_group_recent_visits USING btree (user_id);
+
+CREATE UNIQUE INDEX index_board_labels_on_board_id_and_label_id ON board_labels USING btree (board_id, label_id);
+
+CREATE INDEX index_board_labels_on_label_id ON board_labels USING btree (label_id);
+
+CREATE INDEX index_board_project_recent_visits_on_board_id ON board_project_recent_visits USING btree (board_id);
+
+CREATE INDEX index_board_project_recent_visits_on_project_id ON board_project_recent_visits USING btree (project_id);
+
+CREATE INDEX index_board_project_recent_visits_on_user_id ON board_project_recent_visits USING btree (user_id);
+
+CREATE UNIQUE INDEX index_board_project_recent_visits_on_user_project_and_board ON board_project_recent_visits USING btree (user_id, project_id, board_id);
+
+CREATE INDEX index_boards_on_group_id ON boards USING btree (group_id);
+
+CREATE INDEX index_boards_on_milestone_id ON boards USING btree (milestone_id);
+
+CREATE INDEX index_boards_on_project_id ON boards USING btree (project_id);
+
+CREATE INDEX index_broadcast_messages_on_starts_at_and_ends_at_and_id ON broadcast_messages USING btree (starts_at, ends_at, id);
+
+CREATE UNIQUE INDEX index_chat_names_on_service_id_and_team_id_and_chat_id ON chat_names USING btree (service_id, team_id, chat_id);
+
+CREATE UNIQUE INDEX index_chat_names_on_user_id_and_service_id ON chat_names USING btree (user_id, service_id);
+
+CREATE UNIQUE INDEX index_chat_teams_on_namespace_id ON chat_teams USING btree (namespace_id);
+
+CREATE UNIQUE INDEX index_ci_build_needs_on_build_id_and_name ON ci_build_needs USING btree (build_id, name);
+
+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 UNIQUE INDEX index_ci_build_trace_section_names_on_project_id_and_name ON ci_build_trace_section_names USING btree (project_id, name);
+
+CREATE UNIQUE INDEX index_ci_build_trace_sections_on_build_id_and_section_name_id ON ci_build_trace_sections USING btree (build_id, section_name_id);
+
+CREATE INDEX index_ci_build_trace_sections_on_project_id ON ci_build_trace_sections USING btree (project_id);
+
+CREATE INDEX index_ci_build_trace_sections_on_section_name_id ON ci_build_trace_sections USING btree (section_name_id);
+
+CREATE UNIQUE INDEX index_ci_builds_metadata_on_build_id ON ci_builds_metadata USING btree (build_id);
+
+CREATE INDEX index_ci_builds_metadata_on_build_id_and_has_exposed_artifacts ON ci_builds_metadata USING btree (build_id) WHERE (has_exposed_artifacts IS TRUE);
+
+CREATE INDEX index_ci_builds_metadata_on_build_id_and_interruptible ON ci_builds_metadata USING btree (build_id) WHERE (interruptible = true);
+
+CREATE INDEX index_ci_builds_metadata_on_project_id ON ci_builds_metadata USING btree (project_id);
+
+CREATE INDEX index_ci_builds_on_artifacts_expire_at ON ci_builds USING btree (artifacts_expire_at) WHERE (artifacts_file <> ''::text);
+
+CREATE INDEX index_ci_builds_on_auto_canceled_by_id ON ci_builds USING btree (auto_canceled_by_id);
+
+CREATE INDEX index_ci_builds_on_commit_id_and_artifacts_expireatandidpartial ON ci_builds USING btree (commit_id, artifacts_expire_at, id) WHERE (((type)::text = 'Ci::Build'::text) AND ((retried = false) OR (retried IS NULL)) AND ((name)::text = ANY (ARRAY[('sast'::character varying)::text, ('dependency_scanning'::character varying)::text, ('sast:container'::character varying)::text, ('container_scanning'::character varying)::text, ('dast'::character varying)::text])));
+
+CREATE INDEX index_ci_builds_on_commit_id_and_stage_idx_and_created_at ON ci_builds USING btree (commit_id, stage_idx, created_at);
+
+CREATE INDEX index_ci_builds_on_commit_id_and_status_and_type ON ci_builds USING btree (commit_id, status, type);
+
+CREATE INDEX index_ci_builds_on_commit_id_and_type_and_name_and_ref ON ci_builds USING btree (commit_id, type, name, ref);
+
+CREATE INDEX index_ci_builds_on_commit_id_and_type_and_ref ON ci_builds USING btree (commit_id, type, ref);
+
+CREATE INDEX index_ci_builds_on_name_for_security_products_values ON ci_builds USING btree (name) WHERE ((name)::text = ANY (ARRAY[('container_scanning'::character varying)::text, ('dast'::character varying)::text, ('dependency_scanning'::character varying)::text, ('license_management'::character varying)::text, ('sast'::character varying)::text]));
+
+CREATE INDEX index_ci_builds_on_project_id_and_id ON ci_builds USING btree (project_id, id);
+
+CREATE INDEX index_ci_builds_on_project_id_and_name_and_ref ON ci_builds USING btree (project_id, name, ref) WHERE (((type)::text = 'Ci::Build'::text) AND ((status)::text = 'success'::text) AND ((retried = false) OR (retried IS NULL)));
+
+CREATE INDEX index_ci_builds_on_project_id_for_successfull_pages_deploy ON ci_builds USING btree (project_id) WHERE (((type)::text = 'GenericCommitStatus'::text) AND ((stage)::text = 'deploy'::text) AND ((name)::text = 'pages:deploy'::text) AND ((status)::text = 'success'::text));
+
+CREATE INDEX index_ci_builds_on_protected ON ci_builds USING btree (protected);
+
+CREATE INDEX index_ci_builds_on_queued_at ON ci_builds USING btree (queued_at);
+
+CREATE INDEX index_ci_builds_on_runner_id ON ci_builds USING btree (runner_id);
+
+CREATE INDEX index_ci_builds_on_stage_id ON ci_builds USING btree (stage_id);
+
+CREATE INDEX index_ci_builds_on_status_and_type_and_runner_id ON ci_builds USING btree (status, type, runner_id);
+
+CREATE UNIQUE INDEX index_ci_builds_on_token ON ci_builds USING btree (token);
+
+CREATE UNIQUE INDEX index_ci_builds_on_token_encrypted ON ci_builds USING btree (token_encrypted) WHERE (token_encrypted IS NOT NULL);
+
+CREATE INDEX index_ci_builds_on_updated_at ON ci_builds USING btree (updated_at);
+
+CREATE INDEX index_ci_builds_on_upstream_pipeline_id ON ci_builds USING btree (upstream_pipeline_id) WHERE (upstream_pipeline_id IS NOT NULL);
+
+CREATE INDEX index_ci_builds_on_user_id ON ci_builds USING btree (user_id);
+
+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 UNIQUE INDEX index_ci_builds_runner_session_on_build_id ON ci_builds_runner_session USING btree (build_id);
+
+CREATE UNIQUE INDEX index_ci_group_variables_on_group_id_and_key ON ci_group_variables USING btree (group_id, key);
+
+CREATE INDEX index_ci_job_artifacts_on_expire_at_and_job_id ON ci_job_artifacts USING btree (expire_at, job_id);
+
+CREATE INDEX index_ci_job_artifacts_on_file_store ON ci_job_artifacts USING btree (file_store);
+
+CREATE UNIQUE INDEX index_ci_job_artifacts_on_job_id_and_file_type ON ci_job_artifacts USING btree (job_id, file_type);
+
+CREATE INDEX index_ci_job_artifacts_on_project_id ON ci_job_artifacts USING btree (project_id);
+
+CREATE INDEX index_ci_job_artifacts_on_project_id_for_security_reports ON ci_job_artifacts USING btree (project_id) WHERE (file_type = ANY (ARRAY[5, 6, 7, 8]));
+
+CREATE INDEX index_ci_job_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_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);
+
+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_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);
+
+CREATE INDEX index_ci_pipeline_schedules_on_project_id ON ci_pipeline_schedules USING btree (project_id);
+
+CREATE INDEX index_ci_pipeline_variables_on_pipeline_id ON ci_pipeline_variables USING btree (pipeline_id) WHERE ((key)::text = 'AUTO_DEVOPS_MODSECURITY_SEC_RULE_ENGINE'::text);
+
+CREATE UNIQUE INDEX index_ci_pipeline_variables_on_pipeline_id_and_key ON ci_pipeline_variables USING btree (pipeline_id, key);
+
+CREATE INDEX index_ci_pipelines_config_on_pipeline_id ON ci_pipelines_config USING btree (pipeline_id);
+
+CREATE INDEX index_ci_pipelines_on_auto_canceled_by_id ON ci_pipelines USING btree (auto_canceled_by_id);
+
+CREATE INDEX index_ci_pipelines_on_external_pull_request_id ON ci_pipelines USING btree (external_pull_request_id) WHERE (external_pull_request_id IS NOT NULL);
+
+CREATE INDEX index_ci_pipelines_on_merge_request_id ON ci_pipelines USING btree (merge_request_id) WHERE (merge_request_id IS NOT NULL);
+
+CREATE INDEX index_ci_pipelines_on_pipeline_schedule_id ON ci_pipelines USING btree (pipeline_schedule_id);
+
+CREATE INDEX index_ci_pipelines_on_project_id_and_id_desc ON ci_pipelines USING btree (project_id, id DESC);
+
+CREATE UNIQUE INDEX index_ci_pipelines_on_project_id_and_iid ON ci_pipelines USING btree (project_id, iid) WHERE (iid IS NOT NULL);
+
+CREATE INDEX index_ci_pipelines_on_project_id_and_ref_and_status_and_id ON ci_pipelines USING btree (project_id, ref, status, id);
+
+CREATE INDEX index_ci_pipelines_on_project_id_and_sha ON ci_pipelines USING btree (project_id, sha);
+
+CREATE INDEX index_ci_pipelines_on_project_id_and_source ON ci_pipelines USING btree (project_id, source);
+
+CREATE INDEX index_ci_pipelines_on_project_id_and_status_and_config_source ON ci_pipelines USING btree (project_id, status, config_source);
+
+CREATE INDEX index_ci_pipelines_on_project_id_and_status_and_updated_at ON ci_pipelines USING btree (project_id, status, updated_at);
+
+CREATE INDEX index_ci_pipelines_on_project_idandrefandiddesc ON ci_pipelines USING btree (project_id, ref, id DESC);
+
+CREATE INDEX index_ci_pipelines_on_status ON ci_pipelines USING btree (status);
+
+CREATE INDEX index_ci_pipelines_on_user_id ON ci_pipelines USING btree (user_id);
+
+CREATE INDEX index_ci_refs_on_last_updated_by_pipeline_id ON ci_refs USING btree (last_updated_by_pipeline_id);
+
+CREATE UNIQUE INDEX index_ci_refs_on_project_id_and_ref_and_tag ON ci_refs USING btree (project_id, ref, tag);
+
+CREATE UNIQUE INDEX index_ci_resource_groups_on_project_id_and_key ON ci_resource_groups USING btree (project_id, key);
+
+CREATE INDEX index_ci_resources_on_build_id ON ci_resources USING btree (build_id);
+
+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_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);
+
+CREATE INDEX index_ci_runner_projects_on_project_id ON ci_runner_projects USING btree (project_id);
+
+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_is_shared ON ci_runners USING btree (is_shared);
+
+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_token ON ci_runners USING btree (token);
+
+CREATE INDEX index_ci_runners_on_token_encrypted ON ci_runners USING btree (token_encrypted);
+
+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);
+
+CREATE INDEX index_ci_sources_pipelines_on_source_job_id ON ci_sources_pipelines USING btree (source_job_id);
+
+CREATE INDEX index_ci_sources_pipelines_on_source_pipeline_id ON ci_sources_pipelines USING btree (source_pipeline_id);
+
+CREATE INDEX index_ci_sources_pipelines_on_source_project_id ON ci_sources_pipelines USING btree (source_project_id);
+
+CREATE INDEX index_ci_stages_on_pipeline_id ON ci_stages USING btree (pipeline_id);
+
+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");
+
+CREATE INDEX index_ci_stages_on_project_id ON ci_stages USING btree (project_id);
+
+CREATE INDEX index_ci_subscriptions_projects_on_upstream_project_id ON ci_subscriptions_projects USING btree (upstream_project_id);
+
+CREATE UNIQUE INDEX index_ci_subscriptions_projects_unique_subscription ON ci_subscriptions_projects USING btree (downstream_project_id, upstream_project_id);
+
+CREATE INDEX index_ci_trigger_requests_on_commit_id ON ci_trigger_requests USING btree (commit_id);
+
+CREATE INDEX index_ci_trigger_requests_on_trigger_id_and_id ON ci_trigger_requests USING btree (trigger_id, id DESC);
+
+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_variables_on_project_id ON ci_variables USING btree (project_id) WHERE ((key)::text = 'AUTO_DEVOPS_MODSECURITY_SEC_RULE_ENGINE'::text);
+
+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 UNIQUE INDEX index_cluster_groups_on_cluster_id_and_group_id ON cluster_groups USING btree (cluster_id, group_id);
+
+CREATE INDEX index_cluster_groups_on_group_id ON cluster_groups USING btree (group_id);
+
+CREATE UNIQUE INDEX index_cluster_platforms_kubernetes_on_cluster_id ON cluster_platforms_kubernetes USING btree (cluster_id);
+
+CREATE INDEX index_cluster_projects_on_cluster_id ON cluster_projects USING btree (cluster_id);
+
+CREATE INDEX index_cluster_projects_on_project_id ON cluster_projects USING btree (project_id);
+
+CREATE UNIQUE INDEX index_cluster_providers_aws_on_cluster_id ON cluster_providers_aws USING btree (cluster_id);
+
+CREATE INDEX index_cluster_providers_aws_on_cluster_id_and_status ON cluster_providers_aws USING btree (cluster_id, status);
+
+CREATE INDEX index_cluster_providers_aws_on_created_by_user_id ON cluster_providers_aws USING btree (created_by_user_id);
+
+CREATE INDEX index_cluster_providers_gcp_on_cloud_run ON cluster_providers_gcp USING btree (cloud_run);
+
+CREATE UNIQUE INDEX index_cluster_providers_gcp_on_cluster_id ON cluster_providers_gcp USING btree (cluster_id);
+
+CREATE UNIQUE INDEX index_clusters_applications_cert_managers_on_cluster_id ON clusters_applications_cert_managers USING btree (cluster_id);
+
+CREATE UNIQUE INDEX index_clusters_applications_crossplane_on_cluster_id ON clusters_applications_crossplane USING btree (cluster_id);
+
+CREATE UNIQUE INDEX index_clusters_applications_elastic_stacks_on_cluster_id ON clusters_applications_elastic_stacks USING btree (cluster_id);
+
+CREATE UNIQUE INDEX index_clusters_applications_helm_on_cluster_id ON clusters_applications_helm USING btree (cluster_id);
+
+CREATE UNIQUE INDEX index_clusters_applications_ingress_on_cluster_id ON clusters_applications_ingress USING btree (cluster_id);
+
+CREATE UNIQUE INDEX index_clusters_applications_jupyter_on_cluster_id ON clusters_applications_jupyter USING btree (cluster_id);
+
+CREATE INDEX index_clusters_applications_jupyter_on_oauth_application_id ON clusters_applications_jupyter USING btree (oauth_application_id);
+
+CREATE UNIQUE INDEX index_clusters_applications_knative_on_cluster_id ON clusters_applications_knative USING btree (cluster_id);
+
+CREATE UNIQUE INDEX index_clusters_applications_prometheus_on_cluster_id ON clusters_applications_prometheus USING btree (cluster_id);
+
+CREATE UNIQUE INDEX index_clusters_applications_runners_on_cluster_id ON clusters_applications_runners USING btree (cluster_id);
+
+CREATE INDEX index_clusters_applications_runners_on_runner_id ON clusters_applications_runners USING btree (runner_id);
+
+CREATE INDEX index_clusters_kubernetes_namespaces_on_cluster_id ON clusters_kubernetes_namespaces USING btree (cluster_id);
+
+CREATE INDEX index_clusters_kubernetes_namespaces_on_cluster_project_id ON clusters_kubernetes_namespaces USING btree (cluster_project_id);
+
+CREATE INDEX index_clusters_kubernetes_namespaces_on_environment_id ON clusters_kubernetes_namespaces USING btree (environment_id);
+
+CREATE INDEX index_clusters_kubernetes_namespaces_on_project_id ON clusters_kubernetes_namespaces USING btree (project_id);
+
+CREATE INDEX index_clusters_on_enabled ON clusters USING btree (enabled);
+
+CREATE INDEX index_clusters_on_management_project_id ON clusters USING btree (management_project_id) WHERE (management_project_id IS NOT NULL);
+
+CREATE INDEX index_clusters_on_user_id ON clusters USING btree (user_id);
+
+CREATE UNIQUE INDEX index_commit_user_mentions_on_note_id ON commit_user_mentions USING btree (note_id);
+
+CREATE INDEX index_container_expiration_policies_on_next_run_at_and_enabled ON container_expiration_policies USING btree (next_run_at, enabled);
+
+CREATE INDEX index_container_repositories_on_project_id ON container_repositories USING btree (project_id);
+
+CREATE UNIQUE INDEX index_container_repositories_on_project_id_and_name ON container_repositories USING btree (project_id, name);
+
+CREATE INDEX index_dependency_proxy_blobs_on_group_id_and_file_name ON dependency_proxy_blobs USING btree (group_id, file_name);
+
+CREATE INDEX index_dependency_proxy_group_settings_on_group_id ON dependency_proxy_group_settings USING btree (group_id);
+
+CREATE INDEX index_deploy_keys_projects_on_deploy_key_id ON deploy_keys_projects USING btree (deploy_key_id);
+
+CREATE INDEX index_deploy_keys_projects_on_project_id ON deploy_keys_projects USING btree (project_id);
+
+CREATE UNIQUE INDEX index_deploy_tokens_on_token ON deploy_tokens USING btree (token);
+
+CREATE INDEX index_deploy_tokens_on_token_and_expires_at_and_id ON deploy_tokens USING btree (token, expires_at, id) WHERE (revoked IS FALSE);
+
+CREATE UNIQUE INDEX index_deploy_tokens_on_token_encrypted ON deploy_tokens USING btree (token_encrypted);
+
+CREATE INDEX index_deployment_merge_requests_on_merge_request_id ON deployment_merge_requests USING btree (merge_request_id);
+
+CREATE INDEX index_deployments_on_cluster_id_and_status ON deployments USING btree (cluster_id, status);
+
+CREATE INDEX index_deployments_on_created_at ON deployments USING btree (created_at);
+
+CREATE INDEX index_deployments_on_deployable_type_and_deployable_id ON deployments USING btree (deployable_type, deployable_id);
+
+CREATE INDEX index_deployments_on_environment_id_and_id ON deployments USING btree (environment_id, id);
+
+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_and_status ON deployments USING btree (environment_id, status);
+
+CREATE INDEX index_deployments_on_project_id_and_id ON deployments USING btree (project_id, id DESC);
+
+CREATE UNIQUE INDEX index_deployments_on_project_id_and_iid ON deployments USING btree (project_id, iid);
+
+CREATE INDEX index_deployments_on_project_id_and_ref ON deployments USING btree (project_id, ref);
+
+CREATE INDEX index_deployments_on_project_id_and_status ON deployments USING btree (project_id, status);
+
+CREATE INDEX index_deployments_on_project_id_and_status_and_created_at ON deployments USING btree (project_id, status, created_at);
+
+CREATE INDEX index_deployments_on_project_id_and_updated_at_and_id ON deployments USING btree (project_id, updated_at DESC, id DESC);
+
+CREATE INDEX index_description_versions_on_epic_id ON description_versions USING btree (epic_id) WHERE (epic_id IS NOT NULL);
+
+CREATE INDEX index_description_versions_on_issue_id ON description_versions USING btree (issue_id) WHERE (issue_id IS NOT NULL);
+
+CREATE INDEX index_description_versions_on_merge_request_id ON description_versions USING btree (merge_request_id) WHERE (merge_request_id IS NOT NULL);
+
+CREATE UNIQUE INDEX index_design_management_designs_on_issue_id_and_filename ON design_management_designs USING btree (issue_id, filename);
+
+CREATE INDEX index_design_management_designs_on_project_id ON design_management_designs USING btree (project_id);
+
+CREATE INDEX index_design_management_designs_versions_on_design_id ON design_management_designs_versions USING btree (design_id);
+
+CREATE INDEX index_design_management_designs_versions_on_event ON design_management_designs_versions USING btree (event);
+
+CREATE INDEX index_design_management_designs_versions_on_version_id ON design_management_designs_versions USING btree (version_id);
+
+CREATE INDEX index_design_management_versions_on_author_id ON design_management_versions USING btree (author_id) WHERE (author_id IS NOT NULL);
+
+CREATE INDEX index_design_management_versions_on_issue_id ON design_management_versions USING btree (issue_id);
+
+CREATE UNIQUE INDEX index_design_management_versions_on_sha_and_issue_id ON design_management_versions USING btree (sha, issue_id);
+
+CREATE UNIQUE INDEX index_design_user_mentions_on_note_id ON design_user_mentions USING btree (note_id);
+
+CREATE INDEX index_draft_notes_on_author_id ON draft_notes USING btree (author_id);
+
+CREATE INDEX index_draft_notes_on_discussion_id ON draft_notes USING btree (discussion_id);
+
+CREATE INDEX index_draft_notes_on_merge_request_id ON draft_notes USING btree (merge_request_id);
+
+CREATE INDEX index_elasticsearch_indexed_namespaces_on_created_at ON elasticsearch_indexed_namespaces USING btree (created_at);
+
+CREATE UNIQUE INDEX index_elasticsearch_indexed_namespaces_on_namespace_id ON elasticsearch_indexed_namespaces USING btree (namespace_id);
+
+CREATE UNIQUE INDEX index_elasticsearch_indexed_projects_on_project_id ON elasticsearch_indexed_projects USING btree (project_id);
+
+CREATE UNIQUE INDEX index_emails_on_confirmation_token ON emails USING btree (confirmation_token);
+
+CREATE UNIQUE INDEX index_emails_on_email ON emails USING btree (email);
+
+CREATE INDEX index_emails_on_user_id ON emails USING btree (user_id);
+
+CREATE INDEX index_environments_on_name_varchar_pattern_ops ON environments USING btree (name varchar_pattern_ops);
+
+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);
+
+CREATE INDEX index_environments_on_project_id_state_environment_type ON environments USING btree (project_id, state, environment_type);
+
+CREATE INDEX index_epic_issues_on_epic_id ON epic_issues USING btree (epic_id);
+
+CREATE UNIQUE INDEX index_epic_issues_on_issue_id ON epic_issues USING btree (issue_id);
+
+CREATE INDEX index_epic_metrics ON epic_metrics USING btree (epic_id);
+
+CREATE UNIQUE INDEX index_epic_user_mentions_on_note_id ON epic_user_mentions USING btree (note_id) WHERE (note_id IS NOT NULL);
+
+CREATE INDEX index_epics_on_assignee_id ON epics USING btree (assignee_id);
+
+CREATE INDEX index_epics_on_author_id ON epics USING btree (author_id);
+
+CREATE INDEX index_epics_on_closed_by_id ON epics USING btree (closed_by_id);
+
+CREATE INDEX index_epics_on_due_date_sourcing_epic_id ON epics USING btree (due_date_sourcing_epic_id) WHERE (due_date_sourcing_epic_id IS NOT NULL);
+
+CREATE INDEX index_epics_on_due_date_sourcing_milestone_id ON epics USING btree (due_date_sourcing_milestone_id);
+
+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 INDEX index_epics_on_iid ON epics USING btree (iid);
+
+CREATE INDEX index_epics_on_parent_id ON epics USING btree (parent_id);
+
+CREATE INDEX index_epics_on_start_date ON epics USING btree (start_date);
+
+CREATE INDEX index_epics_on_start_date_sourcing_epic_id ON epics USING btree (start_date_sourcing_epic_id) WHERE (start_date_sourcing_epic_id IS NOT NULL);
+
+CREATE INDEX index_epics_on_start_date_sourcing_milestone_id ON epics USING btree (start_date_sourcing_milestone_id);
+
+CREATE INDEX index_events_on_action ON events USING btree (action);
+
+CREATE INDEX index_events_on_author_id_and_project_id ON events USING btree (author_id, project_id);
+
+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);
+
+CREATE INDEX index_events_on_project_id_and_id ON events USING btree (project_id, id);
+
+CREATE INDEX index_events_on_target_type_and_target_id ON events USING btree (target_type, target_id);
+
+CREATE INDEX index_evidences_on_release_id ON evidences USING btree (release_id);
+
+CREATE UNIQUE INDEX index_external_pull_requests_on_project_and_branches ON external_pull_requests USING btree (project_id, source_branch, target_branch);
+
+CREATE UNIQUE INDEX index_feature_flag_scopes_on_flag_id_and_environment_scope ON operations_feature_flag_scopes USING btree (feature_flag_id, environment_scope);
+
+CREATE UNIQUE INDEX index_feature_flags_clients_on_project_id_and_token_encrypted ON operations_feature_flags_clients USING btree (project_id, token_encrypted);
+
+CREATE UNIQUE INDEX index_feature_gates_on_feature_key_and_key_and_value ON feature_gates USING btree (feature_key, key, value);
+
+CREATE UNIQUE INDEX index_features_on_key ON features USING btree (key);
+
+CREATE UNIQUE INDEX index_file_commits_on_committed_date_file_id_and_project_id ON analytics_repository_file_commits USING btree (project_id, committed_date, analytics_repository_file_id);
+
+CREATE UNIQUE INDEX index_file_edits_on_committed_date_file_id_and_project_id ON analytics_repository_file_edits USING btree (analytics_repository_file_id, committed_date, project_id);
+
+CREATE INDEX index_for_resource_group ON ci_builds USING btree (resource_group_id, id) WHERE (resource_group_id IS NOT NULL);
+
+CREATE INDEX index_for_status_per_branch_per_project ON merge_trains USING btree (target_project_id, target_branch, status);
+
+CREATE INDEX index_fork_network_members_on_fork_network_id ON fork_network_members USING btree (fork_network_id);
+
+CREATE INDEX index_fork_network_members_on_forked_from_project_id ON fork_network_members USING btree (forked_from_project_id);
+
+CREATE UNIQUE INDEX index_fork_network_members_on_project_id ON fork_network_members USING btree (project_id);
+
+CREATE UNIQUE INDEX index_fork_networks_on_root_project_id ON fork_networks USING btree (root_project_id);
+
+CREATE UNIQUE INDEX index_forked_project_links_on_forked_to_project_id ON forked_project_links USING btree (forked_to_project_id);
+
+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_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);
+
+CREATE INDEX index_geo_event_log_on_hashed_storage_migrated_event_id ON geo_event_log USING btree (hashed_storage_migrated_event_id) WHERE (hashed_storage_migrated_event_id IS NOT NULL);
+
+CREATE INDEX index_geo_event_log_on_job_artifact_deleted_event_id ON geo_event_log USING btree (job_artifact_deleted_event_id) WHERE (job_artifact_deleted_event_id IS NOT NULL);
+
+CREATE INDEX index_geo_event_log_on_lfs_object_deleted_event_id ON geo_event_log USING btree (lfs_object_deleted_event_id) WHERE (lfs_object_deleted_event_id IS NOT NULL);
+
+CREATE INDEX index_geo_event_log_on_repositories_changed_event_id ON geo_event_log USING btree (repositories_changed_event_id) WHERE (repositories_changed_event_id IS NOT NULL);
+
+CREATE INDEX index_geo_event_log_on_repository_created_event_id ON geo_event_log USING btree (repository_created_event_id) WHERE (repository_created_event_id IS NOT NULL);
+
+CREATE INDEX index_geo_event_log_on_repository_deleted_event_id ON geo_event_log USING btree (repository_deleted_event_id) WHERE (repository_deleted_event_id IS NOT NULL);
+
+CREATE INDEX index_geo_event_log_on_repository_renamed_event_id ON geo_event_log USING btree (repository_renamed_event_id) WHERE (repository_renamed_event_id IS NOT NULL);
+
+CREATE INDEX index_geo_event_log_on_repository_updated_event_id ON geo_event_log USING btree (repository_updated_event_id) WHERE (repository_updated_event_id IS NOT NULL);
+
+CREATE INDEX index_geo_event_log_on_reset_checksum_event_id ON geo_event_log USING btree (reset_checksum_event_id) WHERE (reset_checksum_event_id IS NOT NULL);
+
+CREATE INDEX index_geo_event_log_on_upload_deleted_event_id ON geo_event_log USING btree (upload_deleted_event_id) WHERE (upload_deleted_event_id IS NOT NULL);
+
+CREATE INDEX index_geo_hashed_storage_attachments_events_on_project_id ON geo_hashed_storage_attachments_events USING btree (project_id);
+
+CREATE INDEX index_geo_hashed_storage_migrated_events_on_project_id ON geo_hashed_storage_migrated_events USING btree (project_id);
+
+CREATE INDEX index_geo_job_artifact_deleted_events_on_job_artifact_id ON geo_job_artifact_deleted_events USING btree (job_artifact_id);
+
+CREATE INDEX index_geo_lfs_object_deleted_events_on_lfs_object_id ON geo_lfs_object_deleted_events USING btree (lfs_object_id);
+
+CREATE INDEX index_geo_node_namespace_links_on_geo_node_id ON geo_node_namespace_links USING btree (geo_node_id);
+
+CREATE UNIQUE INDEX index_geo_node_namespace_links_on_geo_node_id_and_namespace_id ON geo_node_namespace_links USING btree (geo_node_id, namespace_id);
+
+CREATE INDEX index_geo_node_namespace_links_on_namespace_id ON geo_node_namespace_links USING btree (namespace_id);
+
+CREATE UNIQUE INDEX index_geo_node_statuses_on_geo_node_id ON geo_node_statuses USING btree (geo_node_id);
+
+CREATE INDEX index_geo_nodes_on_access_key ON geo_nodes USING btree (access_key);
+
+CREATE UNIQUE INDEX index_geo_nodes_on_name ON geo_nodes USING btree (name);
+
+CREATE INDEX index_geo_nodes_on_primary ON geo_nodes USING btree ("primary");
+
+CREATE INDEX index_geo_repositories_changed_events_on_geo_node_id ON geo_repositories_changed_events USING btree (geo_node_id);
+
+CREATE INDEX index_geo_repository_created_events_on_project_id ON geo_repository_created_events USING btree (project_id);
+
+CREATE INDEX index_geo_repository_deleted_events_on_project_id ON geo_repository_deleted_events USING btree (project_id);
+
+CREATE INDEX index_geo_repository_renamed_events_on_project_id ON geo_repository_renamed_events USING btree (project_id);
+
+CREATE INDEX index_geo_repository_updated_events_on_project_id ON geo_repository_updated_events USING btree (project_id);
+
+CREATE INDEX index_geo_repository_updated_events_on_source ON geo_repository_updated_events USING btree (source);
+
+CREATE INDEX index_geo_reset_checksum_events_on_project_id ON geo_reset_checksum_events USING btree (project_id);
+
+CREATE INDEX index_geo_upload_deleted_events_on_upload_id ON geo_upload_deleted_events USING btree (upload_id);
+
+CREATE INDEX index_gitlab_subscription_histories_on_gitlab_subscription_id ON gitlab_subscription_histories USING btree (gitlab_subscription_id);
+
+CREATE INDEX index_gitlab_subscriptions_on_hosted_plan_id ON gitlab_subscriptions USING btree (hosted_plan_id);
+
+CREATE UNIQUE INDEX index_gitlab_subscriptions_on_namespace_id ON gitlab_subscriptions USING btree (namespace_id);
+
+CREATE UNIQUE INDEX index_gpg_key_subkeys_on_fingerprint ON gpg_key_subkeys USING btree (fingerprint);
+
+CREATE INDEX index_gpg_key_subkeys_on_gpg_key_id ON gpg_key_subkeys USING btree (gpg_key_id);
+
+CREATE UNIQUE INDEX index_gpg_key_subkeys_on_keyid ON gpg_key_subkeys USING btree (keyid);
+
+CREATE UNIQUE INDEX index_gpg_keys_on_fingerprint ON gpg_keys USING btree (fingerprint);
+
+CREATE UNIQUE INDEX index_gpg_keys_on_primary_keyid ON gpg_keys USING btree (primary_keyid);
+
+CREATE INDEX index_gpg_keys_on_user_id ON gpg_keys USING btree (user_id);
+
+CREATE UNIQUE INDEX index_gpg_signatures_on_commit_sha ON gpg_signatures USING btree (commit_sha);
+
+CREATE INDEX index_gpg_signatures_on_gpg_key_id ON gpg_signatures USING btree (gpg_key_id);
+
+CREATE INDEX index_gpg_signatures_on_gpg_key_primary_keyid ON gpg_signatures USING btree (gpg_key_primary_keyid);
+
+CREATE INDEX index_gpg_signatures_on_gpg_key_subkey_id ON gpg_signatures USING btree (gpg_key_subkey_id);
+
+CREATE INDEX index_gpg_signatures_on_project_id ON gpg_signatures USING btree (project_id);
+
+CREATE INDEX index_grafana_integrations_on_enabled ON grafana_integrations USING btree (enabled) WHERE (enabled IS TRUE);
+
+CREATE INDEX index_grafana_integrations_on_project_id ON grafana_integrations USING btree (project_id);
+
+CREATE UNIQUE INDEX index_group_custom_attributes_on_group_id_and_key ON group_custom_attributes USING btree (group_id, key);
+
+CREATE INDEX index_group_custom_attributes_on_key_and_value ON group_custom_attributes USING btree (key, value);
+
+CREATE INDEX index_group_deletion_schedules_on_marked_for_deletion_on ON group_deletion_schedules USING btree (marked_for_deletion_on);
+
+CREATE INDEX index_group_deletion_schedules_on_user_id ON group_deletion_schedules USING btree (user_id);
+
+CREATE UNIQUE INDEX index_group_group_links_on_shared_group_and_shared_with_group ON group_group_links USING btree (shared_group_id, shared_with_group_id);
+
+CREATE INDEX index_group_group_links_on_shared_with_group_id ON group_group_links USING btree (shared_with_group_id);
+
+CREATE INDEX index_identities_on_saml_provider_id ON identities USING btree (saml_provider_id) WHERE (saml_provider_id IS NOT NULL);
+
+CREATE INDEX index_identities_on_user_id ON identities USING btree (user_id);
+
+CREATE UNIQUE INDEX index_import_export_uploads_on_group_id ON import_export_uploads USING btree (group_id) WHERE (group_id IS NOT NULL);
+
+CREATE INDEX index_import_export_uploads_on_project_id ON import_export_uploads USING btree (project_id);
+
+CREATE INDEX index_import_export_uploads_on_updated_at ON import_export_uploads USING btree (updated_at);
+
+CREATE INDEX index_import_failures_on_correlation_id_value ON import_failures USING btree (correlation_id_value);
+
+CREATE INDEX index_import_failures_on_project_id ON import_failures USING btree (project_id);
+
+CREATE UNIQUE INDEX index_index_statuses_on_project_id ON index_statuses USING btree (project_id);
+
+CREATE INDEX index_insights_on_namespace_id ON insights USING btree (namespace_id);
+
+CREATE INDEX index_insights_on_project_id ON insights USING btree (project_id);
+
+CREATE INDEX index_internal_ids_on_namespace_id ON internal_ids USING btree (namespace_id);
+
+CREATE INDEX index_internal_ids_on_project_id ON internal_ids USING btree (project_id);
+
+CREATE UNIQUE INDEX index_internal_ids_on_usage_and_namespace_id ON internal_ids USING btree (usage, namespace_id) WHERE (namespace_id IS NOT NULL);
+
+CREATE UNIQUE INDEX index_internal_ids_on_usage_and_project_id ON internal_ids USING btree (usage, project_id) WHERE (project_id IS NOT NULL);
+
+CREATE INDEX index_ip_restrictions_on_group_id ON ip_restrictions USING btree (group_id);
+
+CREATE UNIQUE INDEX index_issue_assignees_on_issue_id_and_user_id ON issue_assignees USING btree (issue_id, user_id);
+
+CREATE INDEX index_issue_assignees_on_user_id ON issue_assignees USING btree (user_id);
+
+CREATE INDEX index_issue_links_on_source_id ON issue_links USING btree (source_id);
+
+CREATE UNIQUE INDEX index_issue_links_on_source_id_and_target_id ON issue_links USING btree (source_id, target_id);
+
+CREATE INDEX index_issue_links_on_target_id ON issue_links USING btree (target_id);
+
+CREATE INDEX index_issue_metrics ON issue_metrics USING btree (issue_id);
+
+CREATE INDEX index_issue_metrics_on_issue_id_and_timestamps ON issue_metrics USING btree (issue_id, first_mentioned_in_commit_at, first_associated_with_milestone_at, first_added_to_board_at);
+
+CREATE UNIQUE INDEX index_issue_milestones_on_issue_id ON issue_milestones USING btree (issue_id);
+
+CREATE UNIQUE INDEX index_issue_milestones_on_issue_id_and_milestone_id ON issue_milestones USING btree (issue_id, milestone_id);
+
+CREATE INDEX index_issue_milestones_on_milestone_id ON issue_milestones USING btree (milestone_id);
+
+CREATE INDEX index_issue_tracker_data_on_service_id ON issue_tracker_data USING btree (service_id);
+
+CREATE UNIQUE INDEX index_issue_user_mentions_on_note_id ON issue_user_mentions USING btree (note_id) WHERE (note_id IS NOT NULL);
+
+CREATE INDEX index_issues_on_author_id ON issues USING btree (author_id);
+
+CREATE INDEX index_issues_on_closed_by_id ON issues USING btree (closed_by_id);
+
+CREATE INDEX index_issues_on_confidential ON issues USING btree (confidential);
+
+CREATE INDEX index_issues_on_description_trigram ON issues USING gin (description gin_trgm_ops);
+
+CREATE INDEX index_issues_on_duplicated_to_id ON issues USING btree (duplicated_to_id) WHERE (duplicated_to_id IS NOT NULL);
+
+CREATE INDEX index_issues_on_milestone_id ON issues USING btree (milestone_id);
+
+CREATE INDEX index_issues_on_moved_to_id ON issues USING btree (moved_to_id) WHERE (moved_to_id IS NOT NULL);
+
+CREATE INDEX index_issues_on_project_id_and_created_at_and_id_and_state ON issues USING btree (project_id, created_at, id, state);
+
+CREATE UNIQUE INDEX index_issues_on_project_id_and_iid ON issues USING btree (project_id, iid);
+
+CREATE INDEX index_issues_on_project_id_and_rel_position_and_state_and_id ON issues USING btree (project_id, relative_position, state, id DESC);
+
+CREATE INDEX index_issues_on_project_id_and_updated_at_and_id_and_state ON issues USING btree (project_id, updated_at, id, state);
+
+CREATE INDEX index_issues_on_promoted_to_epic_id ON issues USING btree (promoted_to_epic_id) WHERE (promoted_to_epic_id IS NOT NULL);
+
+CREATE INDEX index_issues_on_relative_position ON issues USING btree (relative_position);
+
+CREATE INDEX index_issues_on_state ON issues USING btree (state);
+
+CREATE INDEX index_issues_on_title_trigram ON issues USING gin (title gin_trgm_ops);
+
+CREATE INDEX index_issues_on_updated_at ON issues USING btree (updated_at);
+
+CREATE INDEX index_issues_on_updated_by_id ON issues USING btree (updated_by_id) WHERE (updated_by_id IS NOT NULL);
+
+CREATE UNIQUE INDEX index_jira_connect_installations_on_client_key ON jira_connect_installations USING btree (client_key);
+
+CREATE INDEX index_jira_connect_subscriptions_on_namespace_id ON jira_connect_subscriptions USING btree (namespace_id);
+
+CREATE INDEX index_jira_tracker_data_on_service_id ON jira_tracker_data USING btree (service_id);
+
+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);
+
+CREATE INDEX index_keys_on_last_used_at ON keys USING btree (last_used_at DESC NULLS LAST);
+
+CREATE INDEX index_keys_on_user_id ON keys USING btree (user_id);
+
+CREATE UNIQUE INDEX index_kubernetes_namespaces_on_cluster_project_environment_id ON clusters_kubernetes_namespaces USING btree (cluster_id, project_id, environment_id);
+
+CREATE INDEX index_label_links_on_label_id ON label_links USING btree (label_id);
+
+CREATE INDEX index_label_links_on_target_id_and_target_type ON label_links USING btree (target_id, target_type);
+
+CREATE INDEX index_label_priorities_on_label_id ON label_priorities USING btree (label_id);
+
+CREATE INDEX index_label_priorities_on_priority ON label_priorities USING btree (priority);
+
+CREATE UNIQUE INDEX index_label_priorities_on_project_id_and_label_id ON label_priorities USING btree (project_id, label_id);
+
+CREATE UNIQUE INDEX index_labels_on_group_id_and_project_id_and_title ON labels USING btree (group_id, project_id, title);
+
+CREATE INDEX index_labels_on_group_id_and_title ON labels USING btree (group_id, title) WHERE (project_id = NULL::integer);
+
+CREATE INDEX index_labels_on_project_id ON labels USING btree (project_id);
+
+CREATE INDEX index_labels_on_project_id_and_title ON labels USING btree (project_id, title) WHERE (group_id = NULL::integer);
+
+CREATE INDEX index_labels_on_template ON labels USING btree (template) WHERE template;
+
+CREATE INDEX index_labels_on_title ON labels USING btree (title);
+
+CREATE INDEX index_labels_on_type_and_project_id ON labels USING btree (type, project_id);
+
+CREATE UNIQUE INDEX index_lfs_file_locks_on_project_id_and_path ON lfs_file_locks USING btree (project_id, path);
+
+CREATE INDEX index_lfs_file_locks_on_user_id ON lfs_file_locks USING btree (user_id);
+
+CREATE INDEX index_lfs_objects_on_file_store ON lfs_objects USING btree (file_store);
+
+CREATE UNIQUE INDEX index_lfs_objects_on_oid ON lfs_objects USING btree (oid);
+
+CREATE INDEX index_lfs_objects_projects_on_lfs_object_id ON lfs_objects_projects USING btree (lfs_object_id);
+
+CREATE INDEX index_lfs_objects_projects_on_project_id ON lfs_objects_projects USING btree (project_id);
+
+CREATE INDEX index_list_user_preferences_on_list_id ON list_user_preferences USING btree (list_id);
+
+CREATE INDEX index_list_user_preferences_on_user_id ON list_user_preferences USING btree (user_id);
+
+CREATE UNIQUE INDEX index_list_user_preferences_on_user_id_and_list_id ON list_user_preferences USING btree (user_id, list_id);
+
+CREATE UNIQUE INDEX index_lists_on_board_id_and_label_id ON lists USING btree (board_id, label_id);
+
+CREATE INDEX index_lists_on_label_id ON lists USING btree (label_id);
+
+CREATE INDEX index_lists_on_list_type ON lists USING btree (list_type);
+
+CREATE INDEX index_lists_on_milestone_id ON lists USING btree (milestone_id);
+
+CREATE INDEX index_lists_on_user_id ON lists USING btree (user_id);
+
+CREATE INDEX index_members_on_access_level ON members USING btree (access_level);
+
+CREATE INDEX index_members_on_expires_at ON members USING btree (expires_at);
+
+CREATE INDEX index_members_on_invite_email ON members USING btree (invite_email);
+
+CREATE UNIQUE INDEX index_members_on_invite_token ON members USING btree (invite_token);
+
+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_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);
+
+CREATE INDEX index_merge_request_assignees_on_user_id ON merge_request_assignees USING btree (user_id);
+
+CREATE INDEX index_merge_request_blocks_on_blocked_merge_request_id ON merge_request_blocks USING btree (blocked_merge_request_id);
+
+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_commits_on_mr_diff_id_and_order ON merge_request_diff_commits USING btree (merge_request_diff_id, relative_order);
+
+CREATE INDEX index_merge_request_diff_commits_on_sha ON merge_request_diff_commits USING btree (sha);
+
+CREATE UNIQUE INDEX index_merge_request_diff_files_on_mr_diff_id_and_order ON merge_request_diff_files USING btree (merge_request_diff_id, relative_order);
+
+CREATE INDEX index_merge_request_diffs_on_merge_request_id_and_id ON merge_request_diffs USING btree (merge_request_id, id);
+
+CREATE INDEX index_merge_request_diffs_on_merge_request_id_and_id_partial ON merge_request_diffs USING btree (merge_request_id, id) WHERE ((NOT stored_externally) OR (stored_externally IS NULL));
+
+CREATE INDEX index_merge_request_metrics ON merge_request_metrics USING btree (merge_request_id);
+
+CREATE INDEX index_merge_request_metrics_on_first_deployed_to_production_at ON merge_request_metrics USING btree (first_deployed_to_production_at);
+
+CREATE INDEX index_merge_request_metrics_on_latest_closed_at ON merge_request_metrics USING btree (latest_closed_at) WHERE (latest_closed_at IS NOT NULL);
+
+CREATE INDEX index_merge_request_metrics_on_latest_closed_by_id ON merge_request_metrics USING btree (latest_closed_by_id);
+
+CREATE INDEX index_merge_request_metrics_on_merge_request_id_and_merged_at ON merge_request_metrics USING btree (merge_request_id, merged_at) WHERE (merged_at IS NOT NULL);
+
+CREATE INDEX index_merge_request_metrics_on_merged_at ON merge_request_metrics USING btree (merged_at);
+
+CREATE INDEX index_merge_request_metrics_on_merged_by_id ON merge_request_metrics USING btree (merged_by_id);
+
+CREATE INDEX index_merge_request_metrics_on_pipeline_id ON merge_request_metrics USING btree (pipeline_id);
+
+CREATE UNIQUE INDEX index_merge_request_milestones_on_merge_request_id ON merge_request_milestones USING btree (merge_request_id);
+
+CREATE INDEX index_merge_request_milestones_on_milestone_id ON merge_request_milestones USING btree (milestone_id);
+
+CREATE UNIQUE INDEX index_merge_request_user_mentions_on_note_id ON merge_request_user_mentions USING btree (note_id) WHERE (note_id IS NOT NULL);
+
+CREATE INDEX index_merge_requests_closing_issues_on_issue_id ON merge_requests_closing_issues USING btree (issue_id);
+
+CREATE INDEX index_merge_requests_closing_issues_on_merge_request_id ON merge_requests_closing_issues USING btree (merge_request_id);
+
+CREATE INDEX index_merge_requests_on_assignee_id ON merge_requests USING btree (assignee_id);
+
+CREATE INDEX index_merge_requests_on_author_id ON merge_requests USING btree (author_id);
+
+CREATE INDEX index_merge_requests_on_created_at ON merge_requests USING btree (created_at);
+
+CREATE INDEX index_merge_requests_on_description_trigram ON merge_requests USING gin (description gin_trgm_ops);
+
+CREATE INDEX index_merge_requests_on_head_pipeline_id ON merge_requests USING btree (head_pipeline_id);
+
+CREATE INDEX index_merge_requests_on_id_and_merge_jid ON merge_requests USING btree (id, merge_jid) WHERE ((merge_jid IS NOT NULL) AND ((state)::text = 'locked'::text));
+
+CREATE INDEX index_merge_requests_on_latest_merge_request_diff_id ON merge_requests USING btree (latest_merge_request_diff_id);
+
+CREATE INDEX index_merge_requests_on_merge_user_id ON merge_requests USING btree (merge_user_id) WHERE (merge_user_id IS NOT NULL);
+
+CREATE INDEX index_merge_requests_on_milestone_id ON merge_requests USING btree (milestone_id);
+
+CREATE INDEX index_merge_requests_on_source_branch ON merge_requests USING btree (source_branch);
+
+CREATE INDEX index_merge_requests_on_source_project_and_branch_state_opened ON merge_requests USING btree (source_project_id, source_branch) WHERE ((state)::text = 'opened'::text);
+
+CREATE INDEX index_merge_requests_on_source_project_id_and_source_branch ON merge_requests USING btree (source_project_id, source_branch);
+
+CREATE INDEX index_merge_requests_on_state_and_merge_status ON merge_requests USING btree (state, merge_status) WHERE (((state)::text = 'opened'::text) AND ((merge_status)::text = 'can_be_merged'::text));
+
+CREATE INDEX index_merge_requests_on_target_branch ON merge_requests USING btree (target_branch);
+
+CREATE UNIQUE INDEX index_merge_requests_on_target_project_id_and_iid ON merge_requests USING btree (target_project_id, iid);
+
+CREATE INDEX index_merge_requests_on_target_project_id_and_iid_opened ON merge_requests USING btree (target_project_id, iid) WHERE ((state)::text = 'opened'::text);
+
+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));
+
+CREATE INDEX index_merge_requests_on_title ON merge_requests USING btree (title);
+
+CREATE INDEX index_merge_requests_on_title_trigram ON merge_requests USING gin (title gin_trgm_ops);
+
+CREATE INDEX index_merge_requests_on_tp_id_and_merge_commit_sha_and_id ON merge_requests USING btree (target_project_id, merge_commit_sha, id);
+
+CREATE INDEX index_merge_requests_on_updated_by_id ON merge_requests USING btree (updated_by_id) WHERE (updated_by_id IS NOT NULL);
+
+CREATE INDEX index_merge_requests_target_project_id_created_at ON merge_requests USING btree (target_project_id, created_at);
+
+CREATE UNIQUE INDEX index_merge_trains_on_merge_request_id ON merge_trains USING btree (merge_request_id);
+
+CREATE INDEX index_merge_trains_on_pipeline_id ON merge_trains USING btree (pipeline_id);
+
+CREATE INDEX index_merge_trains_on_user_id ON merge_trains USING btree (user_id);
+
+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);
+
+CREATE INDEX index_milestones_on_due_date ON milestones USING btree (due_date);
+
+CREATE INDEX index_milestones_on_group_id ON milestones USING btree (group_id);
+
+CREATE UNIQUE INDEX index_milestones_on_project_id_and_iid ON milestones USING btree (project_id, iid);
+
+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 UNIQUE INDEX index_miletone_releases_on_milestone_and_release ON milestone_releases USING btree (milestone_id, release_id);
+
+CREATE INDEX index_mirror_data_on_next_execution_and_retry_count ON project_mirror_data USING btree (next_execution_timestamp, retry_count);
+
+CREATE UNIQUE INDEX index_mr_blocks_on_blocking_and_blocked_mr_ids ON merge_request_blocks USING btree (blocking_merge_request_id, blocked_merge_request_id);
+
+CREATE UNIQUE INDEX index_mr_context_commits_on_merge_request_id_and_sha ON merge_request_context_commits USING btree (merge_request_id, sha);
+
+CREATE UNIQUE INDEX index_mrs_milestones_on_mr_id_and_milestone_id ON merge_request_milestones USING btree (merge_request_id, milestone_id);
+
+CREATE UNIQUE INDEX index_namespace_aggregation_schedules_on_namespace_id ON namespace_aggregation_schedules USING btree (namespace_id);
+
+CREATE UNIQUE INDEX index_namespace_root_storage_statistics_on_namespace_id ON namespace_root_storage_statistics USING btree (namespace_id);
+
+CREATE UNIQUE INDEX index_namespace_statistics_on_namespace_id ON namespace_statistics USING btree (namespace_id);
+
+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);
+
+CREATE INDEX index_namespaces_on_file_template_project_id ON namespaces USING btree (file_template_project_id);
+
+CREATE INDEX index_namespaces_on_ldap_sync_last_successful_update_at ON namespaces USING btree (ldap_sync_last_successful_update_at);
+
+CREATE INDEX index_namespaces_on_ldap_sync_last_update_at ON namespaces USING btree (ldap_sync_last_update_at);
+
+CREATE UNIQUE INDEX index_namespaces_on_name_and_parent_id ON namespaces USING btree (name, parent_id);
+
+CREATE INDEX index_namespaces_on_name_trigram ON namespaces USING gin (name gin_trgm_ops);
+
+CREATE INDEX index_namespaces_on_owner_id ON namespaces USING btree (owner_id);
+
+CREATE UNIQUE INDEX index_namespaces_on_parent_id_and_id ON namespaces USING btree (parent_id, id);
+
+CREATE INDEX index_namespaces_on_path ON namespaces USING btree (path);
+
+CREATE INDEX index_namespaces_on_path_trigram ON namespaces USING gin (path gin_trgm_ops);
+
+CREATE INDEX index_namespaces_on_plan_id ON namespaces USING btree (plan_id);
+
+CREATE INDEX index_namespaces_on_require_two_factor_authentication ON namespaces USING btree (require_two_factor_authentication);
+
+CREATE UNIQUE INDEX index_namespaces_on_runners_token ON namespaces USING btree (runners_token);
+
+CREATE UNIQUE INDEX index_namespaces_on_runners_token_encrypted ON namespaces USING btree (runners_token_encrypted);
+
+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_trial_ends_on ON namespaces USING btree (trial_ends_on) WHERE (trial_ends_on IS NOT NULL);
+
+CREATE INDEX index_namespaces_on_type_partial ON namespaces USING btree (type) WHERE (type IS NOT NULL);
+
+CREATE UNIQUE INDEX index_note_diff_files_on_diff_note_id ON note_diff_files USING btree (diff_note_id);
+
+CREATE INDEX index_notes_on_author_id ON notes USING btree (author_id);
+
+CREATE INDEX index_notes_on_commit_id ON notes USING btree (commit_id);
+
+CREATE INDEX index_notes_on_created_at ON notes USING btree (created_at);
+
+CREATE INDEX index_notes_on_discussion_id ON notes USING btree (discussion_id);
+
+CREATE INDEX index_notes_on_line_code ON notes USING btree (line_code);
+
+CREATE INDEX index_notes_on_note_trigram ON notes USING gin (note gin_trgm_ops);
+
+CREATE INDEX index_notes_on_noteable_id_and_noteable_type ON notes USING btree (noteable_id, noteable_type);
+
+CREATE INDEX index_notes_on_project_id_and_id_and_system_false ON notes USING btree (project_id, id) WHERE (NOT system);
+
+CREATE INDEX index_notes_on_project_id_and_noteable_type ON notes USING btree (project_id, noteable_type);
+
+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 UNIQUE INDEX index_notifications_on_user_id_and_source_id_and_source_type ON notification_settings USING btree (user_id, source_id, source_type);
+
+CREATE UNIQUE INDEX index_oauth_access_grants_on_token ON oauth_access_grants USING btree (token);
+
+CREATE INDEX index_oauth_access_tokens_on_application_id ON oauth_access_tokens USING btree (application_id);
+
+CREATE UNIQUE INDEX index_oauth_access_tokens_on_refresh_token ON oauth_access_tokens USING btree (refresh_token);
+
+CREATE INDEX index_oauth_access_tokens_on_resource_owner_id ON oauth_access_tokens USING btree (resource_owner_id);
+
+CREATE UNIQUE INDEX index_oauth_access_tokens_on_token ON oauth_access_tokens USING btree (token);
+
+CREATE INDEX index_oauth_applications_on_owner_id_and_owner_type ON oauth_applications USING btree (owner_id, owner_type);
+
+CREATE UNIQUE INDEX index_oauth_applications_on_uid ON oauth_applications USING btree (uid);
+
+CREATE INDEX index_oauth_openid_requests_on_access_grant_id ON oauth_openid_requests USING btree (access_grant_id);
+
+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_identities_lower_extern_uid_and_provider ON identities USING btree (lower((extern_uid)::text), provider);
+
+CREATE INDEX index_on_users_name_lower ON users USING btree (lower((name)::text));
+
+CREATE UNIQUE INDEX index_operations_feature_flags_on_project_id_and_name ON operations_feature_flags USING btree (project_id, name);
+
+CREATE UNIQUE INDEX index_packages_build_infos_on_package_id ON packages_build_infos USING btree (package_id);
+
+CREATE INDEX index_packages_build_infos_on_pipeline_id ON packages_build_infos USING btree (pipeline_id);
+
+CREATE UNIQUE INDEX index_packages_conan_file_metadata_on_package_file_id ON packages_conan_file_metadata USING btree (package_file_id);
+
+CREATE UNIQUE INDEX index_packages_conan_metadata_on_package_id ON packages_conan_metadata USING btree (package_id);
+
+CREATE UNIQUE INDEX index_packages_dependencies_on_name_and_version_pattern ON packages_dependencies USING btree (name, version_pattern);
+
+CREATE INDEX index_packages_dependency_links_on_dependency_id ON packages_dependency_links USING btree (dependency_id);
+
+CREATE INDEX index_packages_maven_metadata_on_package_id_and_path ON packages_maven_metadata USING btree (package_id, path);
+
+CREATE INDEX index_packages_package_files_on_package_id_and_file_name ON packages_package_files USING btree (package_id, file_name);
+
+CREATE INDEX index_packages_packages_on_name_trigram ON packages_packages USING gin (name gin_trgm_ops);
+
+CREATE INDEX index_packages_packages_on_project_id ON packages_packages USING btree (project_id);
+
+CREATE INDEX index_packages_tags_on_package_id ON packages_tags USING btree (package_id);
+
+CREATE INDEX index_pages_domain_acme_orders_on_challenge_token ON pages_domain_acme_orders USING btree (challenge_token);
+
+CREATE INDEX index_pages_domain_acme_orders_on_pages_domain_id ON pages_domain_acme_orders USING btree (pages_domain_id);
+
+CREATE INDEX index_pages_domains_need_auto_ssl_renewal ON pages_domains USING btree (certificate_source, certificate_valid_not_after) WHERE (auto_ssl_enabled = true);
+
+CREATE UNIQUE INDEX index_pages_domains_on_domain ON pages_domains USING btree (domain);
+
+CREATE INDEX index_pages_domains_on_domain_type ON pages_domains USING btree (domain_type);
+
+CREATE INDEX index_pages_domains_on_project_id ON pages_domains USING btree (project_id);
+
+CREATE INDEX index_pages_domains_on_project_id_and_enabled_until ON pages_domains USING btree (project_id, enabled_until);
+
+CREATE INDEX index_pages_domains_on_remove_at ON pages_domains USING btree (remove_at);
+
+CREATE INDEX index_pages_domains_on_verified_at ON pages_domains USING btree (verified_at);
+
+CREATE INDEX index_pages_domains_on_verified_at_and_enabled_until ON pages_domains USING btree (verified_at, enabled_until);
+
+CREATE INDEX index_pages_domains_on_wildcard ON pages_domains USING btree (wildcard);
+
+CREATE INDEX index_pat_on_user_id_and_expires_at ON personal_access_tokens USING btree (user_id, expires_at);
+
+CREATE INDEX index_path_locks_on_path ON path_locks USING btree (path);
+
+CREATE INDEX index_path_locks_on_project_id ON path_locks USING btree (project_id);
+
+CREATE INDEX index_path_locks_on_user_id ON path_locks USING btree (user_id);
+
+CREATE UNIQUE INDEX index_personal_access_tokens_on_token_digest ON personal_access_tokens USING btree (token_digest);
+
+CREATE INDEX index_personal_access_tokens_on_user_id ON personal_access_tokens USING btree (user_id);
+
+CREATE UNIQUE INDEX index_plan_limits_on_plan_id ON plan_limits USING btree (plan_id);
+
+CREATE INDEX index_plans_on_name ON plans USING btree (name);
+
+CREATE UNIQUE INDEX index_pool_repositories_on_disk_path ON pool_repositories USING btree (disk_path);
+
+CREATE INDEX index_pool_repositories_on_shard_id ON pool_repositories USING btree (shard_id);
+
+CREATE UNIQUE INDEX index_pool_repositories_on_source_project_id_and_shard_id ON pool_repositories USING btree (source_project_id, shard_id);
+
+CREATE UNIQUE INDEX index_programming_languages_on_name ON programming_languages USING btree (name);
+
+CREATE UNIQUE INDEX index_project_aliases_on_name ON project_aliases USING btree (name);
+
+CREATE INDEX index_project_aliases_on_project_id ON project_aliases USING btree (project_id);
+
+CREATE INDEX index_project_authorizations_on_project_id ON project_authorizations USING btree (project_id);
+
+CREATE UNIQUE INDEX index_project_authorizations_on_user_id_project_id_access_level ON project_authorizations USING btree (user_id, project_id, access_level);
+
+CREATE UNIQUE INDEX index_project_auto_devops_on_project_id ON project_auto_devops USING btree (project_id);
+
+CREATE UNIQUE INDEX index_project_ci_cd_settings_on_project_id ON project_ci_cd_settings USING btree (project_id);
+
+CREATE INDEX index_project_custom_attributes_on_key_and_value ON project_custom_attributes USING btree (key, value);
+
+CREATE UNIQUE INDEX index_project_custom_attributes_on_project_id_and_key ON project_custom_attributes USING btree (project_id, key);
+
+CREATE UNIQUE INDEX index_project_daily_statistics_on_project_id_and_date ON project_daily_statistics USING btree (project_id, date DESC);
+
+CREATE INDEX index_project_deploy_tokens_on_deploy_token_id ON project_deploy_tokens USING btree (deploy_token_id);
+
+CREATE UNIQUE INDEX index_project_deploy_tokens_on_project_id_and_deploy_token_id ON project_deploy_tokens USING btree (project_id, deploy_token_id);
+
+CREATE INDEX index_project_feature_usages_on_project_id ON project_feature_usages USING btree (project_id);
+
+CREATE UNIQUE INDEX index_project_features_on_project_id ON project_features USING btree (project_id);
+
+CREATE INDEX index_project_group_links_on_group_id ON project_group_links USING btree (group_id);
+
+CREATE INDEX index_project_group_links_on_project_id ON project_group_links USING btree (project_id);
+
+CREATE INDEX index_project_import_data_on_project_id ON project_import_data USING btree (project_id);
+
+CREATE INDEX index_project_mirror_data_on_jid ON project_mirror_data USING btree (jid);
+
+CREATE INDEX index_project_mirror_data_on_last_successful_update_at ON project_mirror_data USING btree (last_successful_update_at);
+
+CREATE INDEX index_project_mirror_data_on_last_update_at_and_retry_count ON project_mirror_data USING btree (last_update_at, retry_count);
+
+CREATE UNIQUE INDEX index_project_mirror_data_on_project_id ON project_mirror_data USING btree (project_id);
+
+CREATE INDEX index_project_mirror_data_on_status ON project_mirror_data USING btree (status);
+
+CREATE UNIQUE INDEX index_project_pages_metadata_on_project_id ON project_pages_metadata USING btree (project_id);
+
+CREATE INDEX index_project_pages_metadata_on_project_id_and_deployed_is_true ON project_pages_metadata USING btree (project_id) WHERE (deployed = true);
+
+CREATE UNIQUE INDEX index_project_repositories_on_disk_path ON project_repositories USING btree (disk_path);
+
+CREATE UNIQUE INDEX index_project_repositories_on_project_id ON project_repositories USING btree (project_id);
+
+CREATE INDEX index_project_repositories_on_shard_id ON project_repositories USING btree (shard_id);
+
+CREATE UNIQUE INDEX index_project_repository_states_on_project_id ON project_repository_states USING btree (project_id);
+
+CREATE INDEX index_project_statistics_on_namespace_id ON project_statistics USING btree (namespace_id);
+
+CREATE UNIQUE INDEX index_project_statistics_on_project_id ON project_statistics USING btree (project_id);
+
+CREATE UNIQUE INDEX index_project_tracing_settings_on_project_id ON project_tracing_settings USING btree (project_id);
+
+CREATE INDEX index_projects_on_created_at_and_id ON projects USING btree (created_at, id);
+
+CREATE INDEX index_projects_on_creator_id ON projects USING btree (creator_id);
+
+CREATE INDEX index_projects_on_description_trigram ON projects USING gin (description gin_trgm_ops);
+
+CREATE UNIQUE INDEX index_projects_on_id_partial_for_visibility ON projects USING btree (id) WHERE (visibility_level = ANY (ARRAY[10, 20]));
+
+CREATE INDEX index_projects_on_last_activity_at ON projects USING btree (last_activity_at);
+
+CREATE INDEX index_projects_on_last_repository_check_at ON projects USING btree (last_repository_check_at) WHERE (last_repository_check_at IS NOT NULL);
+
+CREATE INDEX index_projects_on_last_repository_check_failed ON projects USING btree (last_repository_check_failed);
+
+CREATE INDEX index_projects_on_last_repository_updated_at ON projects USING btree (last_repository_updated_at);
+
+CREATE INDEX index_projects_on_lower_name ON projects USING btree (lower((name)::text));
+
+CREATE INDEX index_projects_on_marked_for_deletion_at ON projects USING btree (marked_for_deletion_at) WHERE (marked_for_deletion_at IS NOT NULL);
+
+CREATE INDEX index_projects_on_marked_for_deletion_by_user_id ON projects USING btree (marked_for_deletion_by_user_id) WHERE (marked_for_deletion_by_user_id IS NOT NULL);
+
+CREATE INDEX index_projects_on_mirror_and_mirror_trigger_builds_both_true ON projects USING btree (id) WHERE ((mirror IS TRUE) AND (mirror_trigger_builds IS TRUE));
+
+CREATE INDEX index_projects_on_mirror_last_successful_update_at ON projects USING btree (mirror_last_successful_update_at);
+
+CREATE INDEX index_projects_on_mirror_user_id ON projects USING btree (mirror_user_id);
+
+CREATE INDEX index_projects_on_name_trigram ON projects USING gin (name gin_trgm_ops);
+
+CREATE INDEX index_projects_on_namespace_id ON projects USING btree (namespace_id);
+
+CREATE INDEX index_projects_on_path ON projects USING btree (path);
+
+CREATE INDEX index_projects_on_path_trigram ON projects USING gin (path gin_trgm_ops);
+
+CREATE INDEX index_projects_on_pending_delete ON projects USING btree (pending_delete);
+
+CREATE INDEX index_projects_on_pool_repository_id ON projects USING btree (pool_repository_id) WHERE (pool_repository_id IS NOT NULL);
+
+CREATE INDEX index_projects_on_repository_storage ON projects USING btree (repository_storage);
+
+CREATE INDEX index_projects_on_runners_token ON projects USING btree (runners_token);
+
+CREATE INDEX index_projects_on_runners_token_encrypted ON projects USING btree (runners_token_encrypted);
+
+CREATE INDEX index_projects_on_star_count ON projects USING btree (star_count);
+
+CREATE INDEX index_projects_on_visibility_level_and_created_at_and_id ON projects USING btree (visibility_level, created_at, id);
+
+CREATE UNIQUE INDEX index_prometheus_alert_event_scoped_payload_key ON prometheus_alert_events USING btree (prometheus_alert_id, payload_key);
+
+CREATE INDEX index_prometheus_alert_events_on_project_id_and_status ON prometheus_alert_events USING btree (project_id, status);
+
+CREATE UNIQUE INDEX index_prometheus_alerts_metric_environment ON prometheus_alerts USING btree (project_id, prometheus_metric_id, environment_id);
+
+CREATE INDEX index_prometheus_alerts_on_environment_id ON prometheus_alerts USING btree (environment_id);
+
+CREATE INDEX index_prometheus_alerts_on_prometheus_metric_id ON prometheus_alerts USING btree (prometheus_metric_id);
+
+CREATE INDEX index_prometheus_metrics_on_common ON prometheus_metrics USING btree (common);
+
+CREATE INDEX index_prometheus_metrics_on_group ON prometheus_metrics USING btree ("group");
+
+CREATE UNIQUE INDEX index_prometheus_metrics_on_identifier ON prometheus_metrics USING btree (identifier);
+
+CREATE INDEX index_prometheus_metrics_on_project_id ON prometheus_metrics USING btree (project_id);
+
+CREATE INDEX index_protected_branch_merge_access ON protected_branch_merge_access_levels USING btree (protected_branch_id);
+
+CREATE INDEX index_protected_branch_merge_access_levels_on_group_id ON protected_branch_merge_access_levels USING btree (group_id);
+
+CREATE INDEX index_protected_branch_merge_access_levels_on_user_id ON protected_branch_merge_access_levels USING btree (user_id);
+
+CREATE INDEX index_protected_branch_push_access ON protected_branch_push_access_levels USING btree (protected_branch_id);
+
+CREATE INDEX index_protected_branch_push_access_levels_on_group_id ON protected_branch_push_access_levels USING btree (group_id);
+
+CREATE INDEX index_protected_branch_push_access_levels_on_user_id ON protected_branch_push_access_levels USING btree (user_id);
+
+CREATE INDEX index_protected_branch_unprotect_access ON protected_branch_unprotect_access_levels USING btree (protected_branch_id);
+
+CREATE INDEX index_protected_branch_unprotect_access_levels_on_group_id ON protected_branch_unprotect_access_levels USING btree (group_id);
+
+CREATE INDEX index_protected_branch_unprotect_access_levels_on_user_id ON protected_branch_unprotect_access_levels USING btree (user_id);
+
+CREATE INDEX index_protected_branches_on_project_id ON protected_branches USING btree (project_id);
+
+CREATE INDEX index_protected_environment_deploy_access ON protected_environment_deploy_access_levels USING btree (protected_environment_id);
+
+CREATE INDEX index_protected_environment_deploy_access_levels_on_group_id ON protected_environment_deploy_access_levels USING btree (group_id);
+
+CREATE INDEX index_protected_environment_deploy_access_levels_on_user_id ON protected_environment_deploy_access_levels USING btree (user_id);
+
+CREATE INDEX index_protected_environments_on_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);
+
+CREATE INDEX index_protected_tag_create_access ON protected_tag_create_access_levels USING btree (protected_tag_id);
+
+CREATE INDEX index_protected_tag_create_access_levels_on_group_id ON protected_tag_create_access_levels USING btree (group_id);
+
+CREATE INDEX index_protected_tag_create_access_levels_on_user_id ON protected_tag_create_access_levels USING btree (user_id);
+
+CREATE INDEX index_protected_tags_on_project_id ON protected_tags USING btree (project_id);
+
+CREATE UNIQUE INDEX index_protected_tags_on_project_id_and_name ON protected_tags USING btree (project_id, name);
+
+CREATE UNIQUE INDEX index_push_event_payloads_on_event_id ON push_event_payloads USING btree (event_id);
+
+CREATE INDEX index_push_rules_on_is_sample ON push_rules USING btree (is_sample) WHERE is_sample;
+
+CREATE INDEX index_push_rules_on_project_id ON push_rules USING btree (project_id);
+
+CREATE UNIQUE INDEX index_redirect_routes_on_path ON redirect_routes USING btree (path);
+
+CREATE UNIQUE INDEX index_redirect_routes_on_path_unique_text_pattern_ops ON redirect_routes USING btree (lower((path)::text) varchar_pattern_ops);
+
+CREATE INDEX index_redirect_routes_on_source_type_and_source_id ON redirect_routes USING btree (source_type, source_id);
+
+CREATE UNIQUE INDEX index_release_links_on_release_id_and_name ON release_links USING btree (release_id, name);
+
+CREATE UNIQUE INDEX index_release_links_on_release_id_and_url ON release_links USING btree (release_id, url);
+
+CREATE INDEX index_releases_on_author_id ON releases USING btree (author_id);
+
+CREATE INDEX index_releases_on_project_id_and_tag ON releases USING btree (project_id, tag);
+
+CREATE INDEX index_remote_mirrors_on_last_successful_update_at ON remote_mirrors USING btree (last_successful_update_at);
+
+CREATE INDEX index_remote_mirrors_on_project_id ON remote_mirrors USING btree (project_id);
+
+CREATE UNIQUE INDEX index_repository_languages_on_project_and_languages_id ON repository_languages USING btree (project_id, programming_language_id);
+
+CREATE INDEX index_resource_label_events_on_epic_id ON resource_label_events USING btree (epic_id);
+
+CREATE INDEX index_resource_label_events_on_issue_id ON resource_label_events USING btree (issue_id);
+
+CREATE INDEX index_resource_label_events_on_label_id_and_action ON resource_label_events USING btree (label_id, action);
+
+CREATE INDEX index_resource_label_events_on_merge_request_id ON resource_label_events USING btree (merge_request_id);
+
+CREATE INDEX index_resource_label_events_on_user_id ON resource_label_events USING btree (user_id);
+
+CREATE INDEX index_resource_weight_events_on_issue_id_and_weight ON resource_weight_events USING btree (issue_id, weight);
+
+CREATE INDEX index_resource_weight_events_on_user_id ON resource_weight_events USING btree (user_id);
+
+CREATE INDEX index_reviews_on_author_id ON reviews USING btree (author_id);
+
+CREATE INDEX index_reviews_on_merge_request_id ON reviews USING btree (merge_request_id);
+
+CREATE INDEX index_reviews_on_project_id ON reviews USING btree (project_id);
+
+CREATE UNIQUE INDEX index_routes_on_path ON routes USING btree (path);
+
+CREATE INDEX index_routes_on_path_text_pattern_ops ON routes USING btree (path varchar_pattern_ops);
+
+CREATE UNIQUE INDEX index_routes_on_source_type_and_source_id ON routes USING btree (source_type, source_id);
+
+CREATE INDEX index_saml_providers_on_group_id ON saml_providers USING btree (group_id);
+
+CREATE UNIQUE INDEX index_scim_oauth_access_tokens_on_group_id_and_token_encrypted ON scim_oauth_access_tokens USING btree (group_id, token_encrypted);
+
+CREATE INDEX index_self_managed_prometheus_alert_events_on_environment_id ON self_managed_prometheus_alert_events USING btree (environment_id);
+
+CREATE UNIQUE INDEX index_sent_notifications_on_reply_key ON sent_notifications USING btree (reply_key);
+
+CREATE UNIQUE INDEX index_sentry_issues_on_issue_id ON sentry_issues USING btree (issue_id);
+
+CREATE INDEX index_serverless_domain_cluster_on_creator_id ON serverless_domain_cluster USING btree (creator_id);
+
+CREATE INDEX index_serverless_domain_cluster_on_pages_domain_id ON serverless_domain_cluster USING btree (pages_domain_id);
+
+CREATE INDEX index_services_on_project_id ON services USING btree (project_id);
+
+CREATE INDEX index_services_on_template ON services USING btree (template);
+
+CREATE INDEX index_services_on_type ON services USING btree (type);
+
+CREATE UNIQUE INDEX index_shards_on_name ON shards USING btree (name);
+
+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);
+
+CREATE UNIQUE INDEX index_smartcard_identities_on_subject_and_issuer ON smartcard_identities USING btree (subject, issuer);
+
+CREATE INDEX index_smartcard_identities_on_user_id ON smartcard_identities USING btree (user_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);
+
+CREATE INDEX index_snippets_on_author_id ON snippets USING btree (author_id);
+
+CREATE INDEX index_snippets_on_content_trigram ON snippets USING gin (content gin_trgm_ops);
+
+CREATE INDEX index_snippets_on_created_at ON snippets USING btree (created_at);
+
+CREATE INDEX index_snippets_on_file_name_trigram ON snippets USING gin (file_name gin_trgm_ops);
+
+CREATE INDEX index_snippets_on_project_id_and_visibility_level ON snippets USING btree (project_id, visibility_level);
+
+CREATE INDEX index_snippets_on_title_trigram ON snippets USING gin (title gin_trgm_ops);
+
+CREATE INDEX index_snippets_on_updated_at ON snippets USING btree (updated_at);
+
+CREATE INDEX index_snippets_on_visibility_level_and_secret ON snippets USING btree (visibility_level, secret);
+
+CREATE INDEX index_software_license_policies_on_software_license_id ON software_license_policies USING btree (software_license_id);
+
+CREATE UNIQUE INDEX index_software_license_policies_unique_per_project ON software_license_policies USING btree (project_id, software_license_id);
+
+CREATE INDEX index_software_licenses_on_spdx_identifier ON software_licenses USING btree (spdx_identifier);
+
+CREATE UNIQUE INDEX index_software_licenses_on_unique_name ON software_licenses USING btree (name);
+
+CREATE INDEX index_subscriptions_on_project_id ON subscriptions USING btree (project_id);
+
+CREATE UNIQUE INDEX index_subscriptions_on_subscribable_and_user_id_and_project_id ON subscriptions USING btree (subscribable_id, subscribable_type, user_id, project_id);
+
+CREATE INDEX index_suggestions_on_note_id ON suggestions USING btree (note_id);
+
+CREATE UNIQUE INDEX index_suggestions_on_note_id_and_relative_order ON suggestions USING btree (note_id, relative_order);
+
+CREATE UNIQUE INDEX index_system_note_metadata_on_description_version_id ON system_note_metadata USING btree (description_version_id) WHERE (description_version_id IS NOT NULL);
+
+CREATE UNIQUE INDEX index_system_note_metadata_on_note_id ON system_note_metadata USING btree (note_id);
+
+CREATE INDEX index_taggings_on_tag_id ON taggings USING btree (tag_id);
+
+CREATE INDEX index_taggings_on_taggable_id_and_taggable_type ON taggings USING btree (taggable_id, taggable_type);
+
+CREATE INDEX index_taggings_on_taggable_id_and_taggable_type_and_context ON taggings USING btree (taggable_id, taggable_type, context);
+
+CREATE UNIQUE INDEX index_tags_on_name ON tags USING btree (name);
+
+CREATE INDEX index_tags_on_name_trigram ON tags USING gin (name gin_trgm_ops);
+
+CREATE INDEX index_term_agreements_on_term_id ON term_agreements USING btree (term_id);
+
+CREATE INDEX index_term_agreements_on_user_id ON term_agreements USING btree (user_id);
+
+CREATE INDEX index_timelogs_on_issue_id ON timelogs USING btree (issue_id);
+
+CREATE INDEX index_timelogs_on_merge_request_id ON timelogs USING btree (merge_request_id);
+
+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);
+
+CREATE INDEX index_todos_on_author_id ON todos USING btree (author_id);
+
+CREATE INDEX index_todos_on_commit_id ON todos USING btree (commit_id);
+
+CREATE INDEX index_todos_on_group_id ON todos USING btree (group_id);
+
+CREATE INDEX index_todos_on_note_id ON todos USING btree (note_id);
+
+CREATE INDEX index_todos_on_project_id ON todos USING btree (project_id);
+
+CREATE INDEX index_todos_on_target_type_and_target_id ON todos USING btree (target_type, target_id);
+
+CREATE INDEX index_todos_on_user_id ON todos USING btree (user_id);
+
+CREATE INDEX index_todos_on_user_id_and_id_done ON todos USING btree (user_id, id) WHERE ((state)::text = 'done'::text);
+
+CREATE INDEX index_todos_on_user_id_and_id_pending ON todos USING btree (user_id, id) WHERE ((state)::text = 'pending'::text);
+
+CREATE UNIQUE INDEX index_trending_projects_on_project_id ON trending_projects USING btree (project_id);
+
+CREATE INDEX index_u2f_registrations_on_key_handle ON u2f_registrations USING btree (key_handle);
+
+CREATE INDEX index_u2f_registrations_on_user_id ON u2f_registrations USING btree (user_id);
+
+CREATE 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);
+
+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_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);
+
+CREATE UNIQUE INDEX index_user_callouts_on_user_id_and_feature_name ON user_callouts USING btree (user_id, feature_name);
+
+CREATE INDEX index_user_custom_attributes_on_key_and_value ON user_custom_attributes USING btree (key, value);
+
+CREATE UNIQUE INDEX index_user_custom_attributes_on_user_id_and_key ON user_custom_attributes USING btree (user_id, key);
+
+CREATE UNIQUE INDEX index_user_interacted_projects_on_project_id_and_user_id ON user_interacted_projects USING btree (project_id, user_id);
+
+CREATE INDEX index_user_interacted_projects_on_user_id ON user_interacted_projects USING btree (user_id);
+
+CREATE UNIQUE INDEX index_user_preferences_on_user_id ON user_preferences USING btree (user_id);
+
+CREATE INDEX index_user_statuses_on_user_id ON user_statuses USING btree (user_id);
+
+CREATE UNIQUE INDEX index_user_synced_attributes_metadata_on_user_id ON user_synced_attributes_metadata USING btree (user_id);
+
+CREATE INDEX index_users_on_accepted_term_id ON users USING btree (accepted_term_id);
+
+CREATE INDEX index_users_on_admin ON users USING btree (admin);
+
+CREATE INDEX index_users_on_bot_type ON users USING btree (bot_type);
+
+CREATE UNIQUE INDEX index_users_on_confirmation_token ON users USING btree (confirmation_token);
+
+CREATE INDEX index_users_on_created_at ON users USING btree (created_at);
+
+CREATE UNIQUE INDEX index_users_on_email ON users USING btree (email);
+
+CREATE INDEX index_users_on_email_trigram ON users USING gin (email gin_trgm_ops);
+
+CREATE INDEX index_users_on_feed_token ON users USING btree (feed_token);
+
+CREATE INDEX index_users_on_ghost ON users USING btree (ghost);
+
+CREATE INDEX index_users_on_group_view ON users USING btree (group_view);
+
+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);
+
+CREATE INDEX index_users_on_name ON users USING btree (name);
+
+CREATE INDEX index_users_on_name_trigram ON users USING gin (name gin_trgm_ops);
+
+CREATE INDEX index_users_on_public_email ON users USING btree (public_email) WHERE ((public_email)::text <> ''::text);
+
+CREATE UNIQUE INDEX index_users_on_reset_password_token ON users USING btree (reset_password_token);
+
+CREATE INDEX index_users_on_state ON users USING btree (state);
+
+CREATE INDEX index_users_on_state_and_internal ON users USING btree (state) WHERE (ghost IS NOT TRUE);
+
+CREATE INDEX index_users_on_state_and_internal_ee ON users USING btree (state) WHERE ((ghost IS NOT TRUE) AND (bot_type IS NULL));
+
+CREATE UNIQUE INDEX index_users_on_static_object_token ON users USING btree (static_object_token);
+
+CREATE INDEX index_users_on_unconfirmed_email ON users USING btree (unconfirmed_email) WHERE (unconfirmed_email IS NOT NULL);
+
+CREATE INDEX index_users_on_username ON users USING btree (username);
+
+CREATE INDEX index_users_on_username_trigram ON users USING gin (username gin_trgm_ops);
+
+CREATE INDEX index_users_ops_dashboard_projects_on_project_id ON users_ops_dashboard_projects USING btree (project_id);
+
+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_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);
+
+CREATE UNIQUE INDEX index_users_star_projects_on_user_id_and_project_id ON users_star_projects USING btree (user_id, project_id);
+
+CREATE INDEX index_vulnerabilities_on_author_id ON vulnerabilities USING btree (author_id);
+
+CREATE INDEX index_vulnerabilities_on_closed_by_id ON vulnerabilities USING btree (closed_by_id);
+
+CREATE INDEX index_vulnerabilities_on_due_date_sourcing_milestone_id ON vulnerabilities USING btree (due_date_sourcing_milestone_id);
+
+CREATE INDEX index_vulnerabilities_on_epic_id ON vulnerabilities USING btree (epic_id);
+
+CREATE INDEX index_vulnerabilities_on_last_edited_by_id ON vulnerabilities USING btree (last_edited_by_id);
+
+CREATE INDEX index_vulnerabilities_on_milestone_id ON vulnerabilities USING btree (milestone_id);
+
+CREATE INDEX index_vulnerabilities_on_project_id ON vulnerabilities USING btree (project_id);
+
+CREATE INDEX index_vulnerabilities_on_resolved_by_id ON vulnerabilities USING btree (resolved_by_id);
+
+CREATE INDEX index_vulnerabilities_on_start_date_sourcing_milestone_id ON vulnerabilities USING btree (start_date_sourcing_milestone_id);
+
+CREATE INDEX index_vulnerabilities_on_updated_by_id ON vulnerabilities USING btree (updated_by_id);
+
+CREATE INDEX index_vulnerability_feedback_on_author_id ON vulnerability_feedback USING btree (author_id);
+
+CREATE INDEX index_vulnerability_feedback_on_comment_author_id ON vulnerability_feedback USING btree (comment_author_id);
+
+CREATE INDEX index_vulnerability_feedback_on_issue_id ON vulnerability_feedback USING btree (issue_id);
+
+CREATE INDEX index_vulnerability_feedback_on_merge_request_id ON vulnerability_feedback USING btree (merge_request_id);
+
+CREATE INDEX index_vulnerability_feedback_on_pipeline_id ON vulnerability_feedback USING btree (pipeline_id);
+
+CREATE UNIQUE INDEX index_vulnerability_identifiers_on_project_id_and_fingerprint ON vulnerability_identifiers USING btree (project_id, fingerprint);
+
+CREATE INDEX index_vulnerability_issue_links_on_issue_id ON vulnerability_issue_links USING btree (issue_id);
+
+CREATE INDEX index_vulnerability_occurrence_identifiers_on_identifier_id ON vulnerability_occurrence_identifiers USING btree (identifier_id);
+
+CREATE UNIQUE INDEX index_vulnerability_occurrence_identifiers_on_unique_keys ON vulnerability_occurrence_identifiers USING btree (occurrence_id, identifier_id);
+
+CREATE INDEX index_vulnerability_occurrence_pipelines_on_pipeline_id ON vulnerability_occurrence_pipelines USING btree (pipeline_id);
+
+CREATE INDEX index_vulnerability_occurrences_on_primary_identifier_id ON vulnerability_occurrences USING btree (primary_identifier_id);
+
+CREATE INDEX index_vulnerability_occurrences_on_scanner_id ON vulnerability_occurrences USING btree (scanner_id);
+
+CREATE UNIQUE INDEX index_vulnerability_occurrences_on_unique_keys ON vulnerability_occurrences USING btree (project_id, primary_identifier_id, location_fingerprint, scanner_id);
+
+CREATE UNIQUE INDEX index_vulnerability_occurrences_on_uuid ON vulnerability_occurrences USING btree (uuid);
+
+CREATE INDEX index_vulnerability_occurrences_on_vulnerability_id ON vulnerability_occurrences USING btree (vulnerability_id);
+
+CREATE UNIQUE INDEX index_vulnerability_scanners_on_project_id_and_external_id ON vulnerability_scanners USING btree (project_id, external_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_web_hook_id ON web_hook_logs USING btree (web_hook_id);
+
+CREATE INDEX index_web_hooks_on_project_id ON web_hooks USING btree (project_id);
+
+CREATE INDEX index_web_hooks_on_type ON web_hooks USING btree (type);
+
+CREATE UNIQUE INDEX index_webauthn_registrations_on_credential_xid ON webauthn_registrations USING btree (credential_xid);
+
+CREATE INDEX index_webauthn_registrations_on_user_id ON webauthn_registrations USING btree (user_id);
+
+CREATE INDEX index_x509_certificates_on_subject_key_identifier ON x509_certificates USING btree (subject_key_identifier);
+
+CREATE INDEX index_x509_certificates_on_x509_issuer_id ON x509_certificates USING btree (x509_issuer_id);
+
+CREATE INDEX index_x509_commit_signatures_on_commit_sha ON x509_commit_signatures USING btree (commit_sha);
+
+CREATE INDEX index_x509_commit_signatures_on_project_id ON x509_commit_signatures USING btree (project_id);
+
+CREATE INDEX index_x509_commit_signatures_on_x509_certificate_id ON x509_commit_signatures USING btree (x509_certificate_id);
+
+CREATE INDEX index_x509_issuers_on_subject_key_identifier ON x509_issuers USING btree (subject_key_identifier);
+
+CREATE INDEX index_zoom_meetings_on_issue_id ON zoom_meetings USING btree (issue_id);
+
+CREATE UNIQUE INDEX index_zoom_meetings_on_issue_id_and_issue_status ON zoom_meetings USING btree (issue_id, issue_status) WHERE (issue_status = 1);
+
+CREATE INDEX index_zoom_meetings_on_issue_status ON zoom_meetings USING btree (issue_status);
+
+CREATE INDEX index_zoom_meetings_on_project_id ON zoom_meetings USING btree (project_id);
+
+CREATE INDEX issue_id_issues_prometheus_alert_events_index ON issues_prometheus_alert_events USING btree (prometheus_alert_event_id);
+
+CREATE INDEX issue_id_issues_self_managed_rometheus_alert_events_index ON issues_self_managed_prometheus_alert_events USING btree (self_managed_prometheus_alert_event_id);
+
+CREATE UNIQUE INDEX issue_id_prometheus_alert_event_id_index ON issues_prometheus_alert_events USING btree (issue_id, prometheus_alert_event_id);
+
+CREATE UNIQUE INDEX issue_id_self_managed_prometheus_alert_event_id_index ON issues_self_managed_prometheus_alert_events USING btree (issue_id, self_managed_prometheus_alert_event_id);
+
+CREATE UNIQUE INDEX issue_user_mentions_on_issue_id_and_note_id_index ON issue_user_mentions USING btree (issue_id, note_id);
+
+CREATE UNIQUE INDEX issue_user_mentions_on_issue_id_index ON issue_user_mentions USING btree (issue_id) WHERE (note_id IS NULL);
+
+CREATE UNIQUE INDEX kubernetes_namespaces_cluster_and_namespace ON clusters_kubernetes_namespaces USING btree (cluster_id, namespace);
+
+CREATE UNIQUE INDEX merge_request_user_mentions_on_mr_id_and_note_id_index ON merge_request_user_mentions USING btree (merge_request_id, note_id);
+
+CREATE UNIQUE INDEX merge_request_user_mentions_on_mr_id_index ON merge_request_user_mentions USING btree (merge_request_id) WHERE (note_id IS 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));
+
+CREATE INDEX partial_index_deployments_for_project_id_and_tag ON deployments USING btree (project_id) WHERE (tag IS TRUE);
+
+CREATE UNIQUE INDEX snippet_user_mentions_on_snippet_id_and_note_id_index ON snippet_user_mentions USING btree (snippet_id, note_id);
+
+CREATE UNIQUE INDEX snippet_user_mentions_on_snippet_id_index ON snippet_user_mentions USING btree (snippet_id) WHERE (note_id IS NULL);
+
+CREATE UNIQUE INDEX taggings_idx ON taggings USING btree (tag_id, taggable_id, taggable_type, context, tagger_id, tagger_type);
+
+CREATE UNIQUE INDEX term_agreements_unique_index ON term_agreements USING btree (user_id, term_id);
+
+CREATE INDEX tmp_build_stage_position_index ON ci_builds USING btree (stage_id, stage_idx) WHERE (stage_idx IS NOT NULL);
+
+CREATE UNIQUE INDEX users_security_dashboard_projects_unique_index ON users_security_dashboard_projects USING btree (project_id, user_id);
+
+CREATE UNIQUE INDEX vulnerability_feedback_unique_idx ON vulnerability_feedback USING btree (project_id, category, feedback_type, project_fingerprint);
+
+CREATE UNIQUE INDEX vulnerability_occurrence_pipelines_on_unique_keys ON vulnerability_occurrence_pipelines USING btree (occurrence_id, pipeline_id);
+
+ALTER TABLE ONLY epics
+ ADD CONSTRAINT fk_013c9f36ca FOREIGN KEY (due_date_sourcing_epic_id) REFERENCES epics(id) ON DELETE SET NULL;
+
+ALTER TABLE ONLY clusters_applications_runners
+ ADD CONSTRAINT fk_02de2ded36 FOREIGN KEY (runner_id) REFERENCES ci_runners(id) ON DELETE SET NULL;
+
+ALTER TABLE ONLY design_management_designs_versions
+ ADD CONSTRAINT fk_03c671965c FOREIGN KEY (design_id) REFERENCES design_management_designs(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY issues
+ ADD CONSTRAINT fk_05f1e72feb FOREIGN KEY (author_id) REFERENCES users(id) ON DELETE SET NULL;
+
+ALTER TABLE ONLY merge_requests
+ ADD CONSTRAINT fk_06067f5644 FOREIGN KEY (latest_merge_request_diff_id) REFERENCES merge_request_diffs(id) ON DELETE SET NULL;
+
+ALTER TABLE ONLY projects
+ ADD CONSTRAINT fk_0a31cca0b8 FOREIGN KEY (marked_for_deletion_by_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;
+
+ALTER TABLE ONLY notification_settings
+ ADD CONSTRAINT fk_0c95e91db7 FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY lists
+ ADD CONSTRAINT fk_0d3f677137 FOREIGN KEY (board_id) REFERENCES boards(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY group_deletion_schedules
+ ADD CONSTRAINT fk_11e3ebfcdd FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY vulnerabilities
+ ADD CONSTRAINT fk_1302949740 FOREIGN KEY (last_edited_by_id) REFERENCES users(id) ON DELETE SET NULL;
+
+ALTER TABLE ONLY vulnerabilities
+ ADD CONSTRAINT fk_131d289c65 FOREIGN KEY (milestone_id) REFERENCES milestones(id) ON DELETE SET NULL;
+
+ALTER TABLE ONLY internal_ids
+ ADD CONSTRAINT fk_162941d509 FOREIGN KEY (namespace_id) REFERENCES namespaces(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY geo_event_log
+ ADD CONSTRAINT fk_176d3fbb5d FOREIGN KEY (job_artifact_deleted_event_id) REFERENCES geo_job_artifact_deleted_events(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY project_features
+ ADD CONSTRAINT fk_18513d9b92 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
+
+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 vulnerabilities
+ ADD CONSTRAINT fk_1d37cddf91 FOREIGN KEY (epic_id) REFERENCES epics(id) ON DELETE SET NULL;
+
+ALTER TABLE ONLY ci_sources_pipelines
+ ADD CONSTRAINT fk_1e53c97c0a FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY epics
+ ADD CONSTRAINT fk_1fbed67632 FOREIGN KEY (start_date_sourcing_milestone_id) REFERENCES milestones(id) ON DELETE SET NULL NOT VALID;
+
+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 users_star_projects
+ ADD CONSTRAINT fk_22cd27ddfc FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY ci_stages
+ ADD CONSTRAINT fk_2360681d1d FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY project_ci_cd_settings
+ ADD CONSTRAINT fk_24c15d2f2e FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY epics
+ ADD CONSTRAINT fk_25b99c1be3 FOREIGN KEY (parent_id) REFERENCES epics(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY ci_pipelines
+ ADD CONSTRAINT fk_262d4c2d19 FOREIGN KEY (auto_canceled_by_id) REFERENCES ci_pipelines(id) ON DELETE SET NULL;
+
+ALTER TABLE ONLY ci_build_trace_sections
+ ADD CONSTRAINT fk_264e112c66 FOREIGN KEY (section_name_id) REFERENCES ci_build_trace_section_names(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY geo_event_log
+ ADD CONSTRAINT fk_27548c6db3 FOREIGN KEY (hashed_storage_migrated_event_id) REFERENCES geo_hashed_storage_migrated_events(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY deployments
+ ADD CONSTRAINT fk_289bba3222 FOREIGN KEY (cluster_id) REFERENCES clusters(id) ON DELETE SET NULL;
+
+ALTER TABLE ONLY notes
+ ADD CONSTRAINT fk_2e82291620 FOREIGN KEY (review_id) REFERENCES reviews(id) ON DELETE SET NULL;
+
+ALTER TABLE ONLY members
+ ADD CONSTRAINT fk_2e88fb7ce9 FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY approvals
+ ADD CONSTRAINT fk_310d714958 FOREIGN KEY (merge_request_id) REFERENCES merge_requests(id) ON DELETE CASCADE;
+
+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 epics
+ ADD CONSTRAINT fk_3654b61b03 FOREIGN KEY (author_id) REFERENCES users(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY push_event_payloads
+ ADD CONSTRAINT fk_36c74129da FOREIGN KEY (event_id) REFERENCES events(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 epics
+ ADD CONSTRAINT fk_3c1fd1cccc FOREIGN KEY (due_date_sourcing_milestone_id) REFERENCES milestones(id) ON DELETE SET NULL NOT VALID;
+
+ALTER TABLE ONLY ci_pipelines
+ ADD CONSTRAINT fk_3d34ab2e06 FOREIGN KEY (pipeline_schedule_id) REFERENCES ci_pipeline_schedules(id) ON DELETE SET NULL;
+
+ALTER TABLE ONLY ci_pipeline_schedule_variables
+ ADD CONSTRAINT fk_41c35fda51 FOREIGN KEY (pipeline_schedule_id) REFERENCES ci_pipeline_schedules(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY geo_event_log
+ ADD CONSTRAINT fk_42c3b54bed FOREIGN KEY (cache_invalidation_event_id) REFERENCES geo_cache_invalidation_events(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY forked_project_links
+ ADD CONSTRAINT fk_434510edb0 FOREIGN KEY (forked_to_project_id) REFERENCES projects(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY ci_runner_projects
+ ADD CONSTRAINT fk_4478a6f1e4 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY todos
+ ADD CONSTRAINT fk_45054f9c45 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY releases
+ ADD CONSTRAINT fk_47fe2a0596 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY geo_event_log
+ ADD CONSTRAINT fk_4a99ebfd60 FOREIGN KEY (repositories_changed_event_id) REFERENCES geo_repositories_changed_events(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY ci_build_trace_sections
+ ADD CONSTRAINT fk_4ebe41f502 FOREIGN KEY (build_id) REFERENCES ci_builds(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY path_locks
+ ADD CONSTRAINT fk_5265c98f24 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY vulnerability_feedback
+ ADD CONSTRAINT fk_563ff1912e FOREIGN KEY (merge_request_id) REFERENCES merge_requests(id) ON DELETE SET NULL;
+
+ALTER TABLE ONLY deploy_keys_projects
+ ADD CONSTRAINT fk_58a901ca7e FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY issue_assignees
+ ADD CONSTRAINT fk_5e0c8d9154 FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY merge_requests
+ ADD CONSTRAINT fk_6149611a04 FOREIGN KEY (assignee_id) REFERENCES users(id) ON DELETE SET NULL;
+
+ALTER TABLE ONLY dependency_proxy_group_settings
+ ADD CONSTRAINT fk_616ddd680a FOREIGN KEY (group_id) REFERENCES namespaces(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY events
+ ADD CONSTRAINT fk_61fbf6ca48 FOREIGN KEY (group_id) REFERENCES namespaces(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY merge_requests
+ ADD CONSTRAINT fk_641731faff FOREIGN KEY (updated_by_id) REFERENCES users(id) ON DELETE SET NULL;
+
+ALTER TABLE ONLY ci_builds
+ ADD CONSTRAINT fk_6661f4f0e8 FOREIGN KEY (resource_group_id) REFERENCES ci_resource_groups(id) ON DELETE SET NULL;
+
+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_6e5c14658a FOREIGN KEY (pool_repository_id) REFERENCES pool_repositories(id) ON DELETE SET NULL;
+
+ALTER TABLE ONLY protected_branch_push_access_levels
+ ADD CONSTRAINT fk_7111b68cdb FOREIGN KEY (group_id) REFERENCES namespaces(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY services
+ ADD CONSTRAINT fk_71cce407f9 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY index_statuses
+ ADD CONSTRAINT fk_74b2492545 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY vulnerabilities
+ ADD CONSTRAINT fk_76bc5f5455 FOREIGN KEY (resolved_by_id) REFERENCES users(id) ON DELETE SET NULL;
+
+ALTER TABLE ONLY oauth_openid_requests
+ ADD CONSTRAINT fk_77114b3b09 FOREIGN KEY (access_grant_id) REFERENCES oauth_access_grants(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY ci_resource_groups
+ ADD CONSTRAINT fk_774722d144 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY users
+ ADD CONSTRAINT fk_789cd90b35 FOREIGN KEY (accepted_term_id) REFERENCES application_setting_terms(id) ON DELETE CASCADE;
+
+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 lists
+ ADD CONSTRAINT fk_7a5553d60f FOREIGN KEY (label_id) REFERENCES labels(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY protected_branches
+ ADD CONSTRAINT fk_7a9c6d93e7 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY vulnerabilities
+ ADD CONSTRAINT fk_7ac31eacb9 FOREIGN KEY (updated_by_id) REFERENCES users(id) ON DELETE SET NULL;
+
+ALTER TABLE ONLY vulnerabilities
+ ADD CONSTRAINT fk_7c5bb22a22 FOREIGN KEY (due_date_sourcing_milestone_id) REFERENCES milestones(id) ON DELETE SET NULL;
+
+ALTER TABLE ONLY labels
+ ADD CONSTRAINT fk_7de4989a69 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY merge_request_metrics
+ ADD CONSTRAINT fk_7f28d925f3 FOREIGN KEY (merged_by_id) REFERENCES users(id) ON DELETE SET NULL;
+
+ALTER TABLE ONLY import_export_uploads
+ ADD CONSTRAINT fk_83319d9721 FOREIGN KEY (group_id) REFERENCES namespaces(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY push_rules
+ ADD CONSTRAINT fk_83b29894de FOREIGN KEY (project_id) REFERENCES projects(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;
+
+ALTER TABLE ONLY ci_pipelines
+ ADD CONSTRAINT fk_86635dbd80 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY geo_event_log
+ ADD CONSTRAINT fk_86c84214ec FOREIGN KEY (repository_renamed_event_id) REFERENCES geo_repository_renamed_events(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY packages_package_files
+ ADD CONSTRAINT fk_86f0f182f8 FOREIGN KEY (package_id) REFERENCES packages_packages(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY ci_builds
+ ADD CONSTRAINT fk_87f4cefcda FOREIGN KEY (upstream_pipeline_id) REFERENCES ci_pipelines(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;
+
+ALTER TABLE ONLY issues
+ ADD CONSTRAINT fk_899c8f3231 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY protected_branch_merge_access_levels
+ ADD CONSTRAINT fk_8a3072ccb3 FOREIGN KEY (protected_branch_id) REFERENCES protected_branches(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY releases
+ ADD CONSTRAINT fk_8e4456f90f FOREIGN KEY (author_id) REFERENCES users(id) ON DELETE SET NULL;
+
+ALTER TABLE ONLY protected_tags
+ ADD CONSTRAINT fk_8e4af87648 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY ci_pipeline_schedules
+ ADD CONSTRAINT fk_8ead60fcc4 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY todos
+ ADD CONSTRAINT fk_91d1f47b13 FOREIGN KEY (note_id) REFERENCES notes(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY vulnerability_feedback
+ ADD CONSTRAINT fk_94f7c8a81e FOREIGN KEY (comment_author_id) REFERENCES users(id) ON DELETE SET NULL;
+
+ALTER TABLE ONLY milestones
+ ADD CONSTRAINT fk_95650a40d4 FOREIGN KEY (group_id) REFERENCES namespaces(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY application_settings
+ ADD CONSTRAINT fk_964370041d FOREIGN KEY (usage_stats_set_by_user_id) REFERENCES users(id) ON DELETE SET NULL;
+
+ALTER TABLE ONLY issues
+ ADD CONSTRAINT fk_96b1dd429c FOREIGN KEY (milestone_id) REFERENCES milestones(id) ON DELETE SET NULL;
+
+ALTER TABLE ONLY vulnerability_occurrences
+ ADD CONSTRAINT fk_97ffe77653 FOREIGN KEY (vulnerability_id) REFERENCES vulnerabilities(id) ON DELETE SET NULL;
+
+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 notes
+ ADD CONSTRAINT fk_99e097b079 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY geo_event_log
+ ADD CONSTRAINT fk_9b9afb1916 FOREIGN KEY (repository_created_event_id) REFERENCES geo_repository_created_events(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY milestones
+ ADD CONSTRAINT fk_9bd0a0c791 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY issues
+ ADD CONSTRAINT fk_9c4516d665 FOREIGN KEY (duplicated_to_id) REFERENCES issues(id) ON DELETE SET NULL;
+
+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 ci_pipeline_schedules
+ ADD CONSTRAINT fk_9ea99f58d2 FOREIGN KEY (owner_id) REFERENCES users(id) ON DELETE SET NULL;
+
+ALTER TABLE ONLY protected_branch_push_access_levels
+ ADD CONSTRAINT fk_9ffc86a3d9 FOREIGN KEY (protected_branch_id) REFERENCES protected_branches(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY issues
+ ADD CONSTRAINT fk_a194299be1 FOREIGN KEY (moved_to_id) REFERENCES issues(id) ON DELETE SET NULL;
+
+ALTER TABLE ONLY ci_builds
+ ADD CONSTRAINT fk_a2141b1522 FOREIGN KEY (auto_canceled_by_id) REFERENCES ci_pipelines(id) ON DELETE SET NULL;
+
+ALTER TABLE ONLY ci_pipelines
+ ADD CONSTRAINT fk_a23be95014 FOREIGN KEY (merge_request_id) REFERENCES merge_requests(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY todos
+ ADD CONSTRAINT fk_a27c483435 FOREIGN KEY (group_id) REFERENCES namespaces(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY jira_connect_subscriptions
+ ADD CONSTRAINT fk_a3c10bcf7d FOREIGN KEY (namespace_id) REFERENCES namespaces(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY users
+ ADD CONSTRAINT fk_a4b8fefe3e FOREIGN KEY (managing_group_id) REFERENCES namespaces(id) ON DELETE SET NULL;
+
+ALTER TABLE ONLY merge_requests
+ ADD CONSTRAINT fk_a6963e8447 FOREIGN KEY (target_project_id) REFERENCES projects(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY epics
+ ADD CONSTRAINT fk_aa5798e761 FOREIGN KEY (closed_by_id) REFERENCES users(id) ON DELETE SET NULL;
+
+ALTER TABLE ONLY identities
+ ADD CONSTRAINT fk_aade90f0fc FOREIGN KEY (saml_provider_id) REFERENCES saml_providers(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY ci_sources_pipelines
+ ADD CONSTRAINT fk_acd9737679 FOREIGN KEY (source_project_id) REFERENCES projects(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY merge_requests
+ ADD CONSTRAINT fk_ad525e1f87 FOREIGN KEY (merge_user_id) REFERENCES users(id) ON DELETE SET NULL;
+
+ALTER TABLE ONLY ci_variables
+ ADD CONSTRAINT fk_ada5eb64b3 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY merge_request_metrics
+ ADD CONSTRAINT fk_ae440388cc FOREIGN KEY (latest_closed_by_id) REFERENCES users(id) ON DELETE SET NULL;
+
+ALTER TABLE ONLY fork_network_members
+ ADD CONSTRAINT fk_b01280dae4 FOREIGN KEY (forked_from_project_id) REFERENCES projects(id) ON DELETE SET NULL;
+
+ALTER TABLE ONLY vulnerabilities
+ ADD CONSTRAINT fk_b1de915a15 FOREIGN KEY (author_id) REFERENCES users(id) ON DELETE SET NULL;
+
+ALTER TABLE ONLY protected_tag_create_access_levels
+ ADD CONSTRAINT fk_b4eb82fe3c FOREIGN KEY (group_id) REFERENCES namespaces(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY issue_assignees
+ ADD CONSTRAINT fk_b7d881734a FOREIGN KEY (issue_id) REFERENCES issues(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY ci_trigger_requests
+ ADD CONSTRAINT fk_b8ec8b7245 FOREIGN KEY (trigger_id) REFERENCES ci_triggers(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY deployments
+ ADD CONSTRAINT fk_b9a3851b82 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY gitlab_subscriptions
+ ADD CONSTRAINT fk_bd0c4019c3 FOREIGN KEY (hosted_plan_id) REFERENCES plans(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY snippets
+ ADD CONSTRAINT fk_be41fd4bb7 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY ci_sources_pipelines
+ ADD CONSTRAINT fk_be5624bf37 FOREIGN KEY (source_job_id) REFERENCES ci_builds(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY packages_maven_metadata
+ ADD CONSTRAINT fk_be88aed360 FOREIGN KEY (package_id) REFERENCES packages_packages(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY ci_builds
+ ADD CONSTRAINT fk_befce0568a FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY design_management_versions
+ ADD CONSTRAINT fk_c1440b4896 FOREIGN KEY (author_id) REFERENCES users(id) ON DELETE SET NULL;
+
+ALTER TABLE ONLY geo_event_log
+ ADD CONSTRAINT fk_c1f241c70d FOREIGN KEY (upload_deleted_event_id) REFERENCES geo_upload_deleted_events(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;
+
+ALTER TABLE ONLY issues
+ ADD CONSTRAINT fk_c63cbf6c25 FOREIGN KEY (closed_by_id) REFERENCES users(id) ON DELETE SET NULL;
+
+ALTER TABLE ONLY issue_links
+ ADD CONSTRAINT fk_c900194ff2 FOREIGN KEY (source_id) REFERENCES issues(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 vulnerabilities
+ ADD CONSTRAINT fk_cf5c60acbf FOREIGN KEY (closed_by_id) REFERENCES users(id) ON DELETE SET NULL;
+
+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;
+
+ALTER TABLE ONLY environments
+ ADD CONSTRAINT fk_d1c8c1da6a FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY ci_builds
+ ADD CONSTRAINT fk_d3130c9a7f FOREIGN KEY (commit_id) REFERENCES ci_pipelines(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;
+
+ALTER TABLE ONLY geo_event_log
+ ADD CONSTRAINT fk_d5af95fcd9 FOREIGN KEY (lfs_object_deleted_event_id) REFERENCES geo_lfs_object_deleted_events(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY lists
+ ADD CONSTRAINT fk_d6cf4279f7 FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY system_note_metadata
+ ADD CONSTRAINT fk_d83a918cb1 FOREIGN KEY (note_id) REFERENCES notes(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY todos
+ ADD CONSTRAINT fk_d94154aa95 FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY project_group_links
+ ADD CONSTRAINT fk_daa8cee94c FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY dependency_proxy_blobs
+ ADD CONSTRAINT fk_db58bbc5d7 FOREIGN KEY (group_id) REFERENCES namespaces(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY epics
+ ADD CONSTRAINT fk_dccd3f98fc FOREIGN KEY (assignee_id) REFERENCES users(id) ON DELETE SET NULL;
+
+ALTER TABLE ONLY issues
+ ADD CONSTRAINT fk_df75a7c8b8 FOREIGN KEY (promoted_to_epic_id) REFERENCES epics(id) ON DELETE SET NULL;
+
+ALTER TABLE ONLY ci_resources
+ ADD CONSTRAINT fk_e169a8e3d5 FOREIGN KEY (build_id) REFERENCES ci_builds(id) ON DELETE SET NULL;
+
+ALTER TABLE ONLY ci_sources_pipelines
+ ADD CONSTRAINT fk_e1bad85861 FOREIGN KEY (pipeline_id) REFERENCES ci_pipelines(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY gitlab_subscriptions
+ ADD CONSTRAINT fk_e2595d00a1 FOREIGN KEY (namespace_id) REFERENCES namespaces(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY ci_triggers
+ ADD CONSTRAINT fk_e3e63f966e FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY merge_requests
+ ADD CONSTRAINT fk_e719a85f8a FOREIGN KEY (author_id) REFERENCES users(id) ON DELETE SET NULL;
+
+ALTER TABLE ONLY issue_links
+ ADD CONSTRAINT fk_e71bb44f1f FOREIGN KEY (target_id) REFERENCES issues(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY namespaces
+ ADD CONSTRAINT fk_e7a0b20a6b FOREIGN KEY (custom_project_templates_group_id) REFERENCES namespaces(id) ON DELETE SET NULL;
+
+ALTER TABLE ONLY fork_networks
+ ADD CONSTRAINT fk_e7b436b2b5 FOREIGN KEY (root_project_id) REFERENCES projects(id) ON DELETE SET NULL;
+
+ALTER TABLE ONLY ci_triggers
+ ADD CONSTRAINT fk_e8e10d1964 FOREIGN KEY (owner_id) REFERENCES users(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY pages_domains
+ ADD CONSTRAINT fk_ea2f6dfc6f FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY application_settings
+ ADD CONSTRAINT fk_ec757bd087 FOREIGN KEY (file_template_project_id) REFERENCES projects(id) ON DELETE SET NULL;
+
+ALTER TABLE ONLY events
+ ADD CONSTRAINT fk_edfd187b6f FOREIGN KEY (author_id) REFERENCES users(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY vulnerabilities
+ ADD CONSTRAINT fk_efb96ab1e2 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY clusters
+ ADD CONSTRAINT fk_f05c5e5a42 FOREIGN KEY (management_project_id) REFERENCES projects(id) ON DELETE SET NULL;
+
+ALTER TABLE ONLY epics
+ ADD CONSTRAINT fk_f081aa4489 FOREIGN KEY (group_id) REFERENCES namespaces(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY boards
+ ADD CONSTRAINT fk_f15266b5f9 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY jira_connect_subscriptions
+ ADD CONSTRAINT fk_f1d617343f FOREIGN KEY (jira_connect_installation_id) REFERENCES jira_connect_installations(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;
+
+ALTER TABLE ONLY design_management_designs_versions
+ ADD CONSTRAINT fk_f4d25ba00c FOREIGN KEY (version_id) REFERENCES design_management_versions(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY protected_tag_create_access_levels
+ ADD CONSTRAINT fk_f7dfda8c51 FOREIGN KEY (protected_tag_id) REFERENCES protected_tags(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY ci_stages
+ ADD CONSTRAINT fk_fb57e6cc56 FOREIGN KEY (pipeline_id) REFERENCES ci_pipelines(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY system_note_metadata
+ ADD CONSTRAINT fk_fbd87415c9 FOREIGN KEY (description_version_id) REFERENCES description_versions(id) ON DELETE SET NULL;
+
+ALTER TABLE ONLY merge_requests
+ ADD CONSTRAINT fk_fd82eae0b9 FOREIGN KEY (head_pipeline_id) REFERENCES ci_pipelines(id) ON DELETE SET NULL;
+
+ALTER TABLE ONLY namespaces
+ ADD CONSTRAINT fk_fdd12e5b80 FOREIGN KEY (plan_id) REFERENCES plans(id) ON DELETE SET NULL;
+
+ALTER TABLE ONLY project_import_data
+ ADD CONSTRAINT fk_ffb9ee3a10 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY issues
+ ADD CONSTRAINT fk_ffed080f01 FOREIGN KEY (updated_by_id) REFERENCES users(id) ON DELETE SET NULL;
+
+ALTER TABLE ONLY personal_access_tokens
+ ADD CONSTRAINT fk_personal_access_tokens_user_id FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY approval_merge_request_rules
+ ADD CONSTRAINT fk_rails_004ce82224 FOREIGN KEY (merge_request_id) REFERENCES merge_requests(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY namespace_statistics
+ ADD CONSTRAINT fk_rails_0062050394 FOREIGN KEY (namespace_id) REFERENCES namespaces(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY clusters_applications_elastic_stacks
+ ADD CONSTRAINT fk_rails_026f219f46 FOREIGN KEY (cluster_id) REFERENCES clusters(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY events
+ ADD CONSTRAINT fk_rails_0434b48643 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY ip_restrictions
+ ADD CONSTRAINT fk_rails_04a93778d5 FOREIGN KEY (group_id) REFERENCES namespaces(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY ci_subscriptions_projects
+ ADD CONSTRAINT fk_rails_0818751483 FOREIGN KEY (downstream_project_id) REFERENCES projects(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY user_interacted_projects
+ ADD CONSTRAINT fk_rails_0894651f08 FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY trending_projects
+ ADD CONSTRAINT fk_rails_09feecd872 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY project_deploy_tokens
+ ADD CONSTRAINT fk_rails_0aca134388 FOREIGN KEY (deploy_token_id) REFERENCES deploy_tokens(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY analytics_repository_file_commits
+ ADD CONSTRAINT fk_rails_0aefa9ee3e FOREIGN KEY (analytics_repository_file_id) REFERENCES analytics_repository_files(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY packages_conan_file_metadata
+ ADD CONSTRAINT fk_rails_0afabd9328 FOREIGN KEY (package_file_id) REFERENCES packages_package_files(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY geo_node_statuses
+ ADD CONSTRAINT fk_rails_0ecc699c2a FOREIGN KEY (geo_node_id) REFERENCES geo_nodes(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY project_repository_states
+ ADD CONSTRAINT fk_rails_0f2298ca8a FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY user_synced_attributes_metadata
+ ADD CONSTRAINT fk_rails_0f4aa0981f FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY project_authorizations
+ ADD CONSTRAINT fk_rails_0f84bb11f3 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY merge_request_context_commits
+ ADD CONSTRAINT fk_rails_0fe0039f60 FOREIGN KEY (merge_request_id) REFERENCES merge_requests(id) ON DELETE CASCADE;
+
+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 prometheus_alert_events
+ ADD CONSTRAINT fk_rails_106f901176 FOREIGN KEY (prometheus_alert_id) REFERENCES prometheus_alerts(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY zoom_meetings
+ ADD CONSTRAINT fk_rails_1190f0e0fa FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY gpg_signatures
+ ADD CONSTRAINT fk_rails_11ae8cb9a7 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY project_authorizations
+ ADD CONSTRAINT fk_rails_11e7aa3ed9 FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY description_versions
+ ADD CONSTRAINT fk_rails_12b144011c FOREIGN KEY (merge_request_id) REFERENCES merge_requests(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY project_statistics
+ ADD CONSTRAINT fk_rails_12c471002f FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY users_security_dashboard_projects
+ ADD CONSTRAINT fk_rails_150cd5682c FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY project_deploy_tokens
+ ADD CONSTRAINT fk_rails_170e03cbaf FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY analytics_cycle_analytics_project_stages
+ ADD CONSTRAINT fk_rails_1722574860 FOREIGN KEY (start_event_label_id) REFERENCES labels(id) ON DELETE CASCADE;
+
+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 clusters_applications_jupyter
+ ADD CONSTRAINT fk_rails_17df21c98c FOREIGN KEY (cluster_id) REFERENCES clusters(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY cluster_providers_aws
+ ADD CONSTRAINT fk_rails_18983d9ea4 FOREIGN KEY (cluster_id) REFERENCES clusters(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY grafana_integrations
+ ADD CONSTRAINT fk_rails_18d0e2b564 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY gpg_signatures
+ ADD CONSTRAINT fk_rails_19d4f1c6f9 FOREIGN KEY (gpg_key_subkey_id) REFERENCES gpg_key_subkeys(id) ON DELETE SET NULL;
+
+ALTER TABLE ONLY board_assignees
+ ADD CONSTRAINT fk_rails_1c0ff59e82 FOREIGN KEY (assignee_id) REFERENCES users(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY epic_user_mentions
+ ADD CONSTRAINT fk_rails_1c65976a49 FOREIGN KEY (note_id) REFERENCES notes(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY approver_groups
+ ADD CONSTRAINT fk_rails_1cdcbd7723 FOREIGN KEY (group_id) REFERENCES namespaces(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY ci_refs
+ ADD CONSTRAINT fk_rails_1da48d19ce FOREIGN KEY (last_updated_by_pipeline_id) REFERENCES ci_pipelines(id) ON DELETE SET NULL;
+
+ALTER TABLE ONLY boards
+ ADD CONSTRAINT fk_rails_1e9a074a35 FOREIGN KEY (group_id) REFERENCES namespaces(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY geo_repository_created_events
+ ADD CONSTRAINT fk_rails_1f49e46a61 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY approval_merge_request_rules_groups
+ ADD CONSTRAINT fk_rails_2020a7124a FOREIGN KEY (group_id) REFERENCES namespaces(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY vulnerability_feedback
+ ADD CONSTRAINT fk_rails_20976e6fd9 FOREIGN KEY (pipeline_id) REFERENCES ci_pipelines(id) ON DELETE SET NULL;
+
+ALTER TABLE ONLY merge_request_milestones
+ ADD CONSTRAINT fk_rails_212ba37b52 FOREIGN KEY (merge_request_id) REFERENCES merge_requests(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY user_statuses
+ ADD CONSTRAINT fk_rails_2178592333 FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY users_ops_dashboard_projects
+ ADD CONSTRAINT fk_rails_220a0562db FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY clusters_applications_runners
+ ADD CONSTRAINT fk_rails_22388594e9 FOREIGN KEY (cluster_id) REFERENCES clusters(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY service_desk_settings
+ ADD CONSTRAINT fk_rails_223a296a85 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY protected_tag_create_access_levels
+ ADD CONSTRAINT fk_rails_2349b78b91 FOREIGN KEY (user_id) REFERENCES users(id);
+
+ALTER TABLE ONLY group_custom_attributes
+ ADD CONSTRAINT fk_rails_246e0db83a FOREIGN KEY (group_id) REFERENCES namespaces(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY lfs_file_locks
+ ADD CONSTRAINT fk_rails_27a1d98fa8 FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY project_alerting_settings
+ ADD CONSTRAINT fk_rails_27a84b407d FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY reviews
+ ADD CONSTRAINT fk_rails_29e6f859c4 FOREIGN KEY (author_id) REFERENCES users(id) ON DELETE SET NULL;
+
+ALTER TABLE ONLY draft_notes
+ ADD CONSTRAINT fk_rails_2a8dac9901 FOREIGN KEY (author_id) REFERENCES users(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY packages_tags
+ ADD CONSTRAINT fk_rails_2b18ae9256 FOREIGN KEY (package_id) REFERENCES packages_packages(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY group_group_links
+ ADD CONSTRAINT fk_rails_2b2353ca49 FOREIGN KEY (shared_with_group_id) REFERENCES namespaces(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY geo_repository_updated_events
+ ADD CONSTRAINT fk_rails_2b70854c08 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY protected_branch_unprotect_access_levels
+ ADD CONSTRAINT fk_rails_2d2aba21ef FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY saml_providers
+ ADD CONSTRAINT fk_rails_306d459be7 FOREIGN KEY (group_id) REFERENCES namespaces(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY merge_request_diff_commits
+ ADD CONSTRAINT fk_rails_316aaceda3 FOREIGN KEY (merge_request_diff_id) REFERENCES merge_request_diffs(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY zoom_meetings
+ ADD CONSTRAINT fk_rails_3263f29616 FOREIGN KEY (issue_id) REFERENCES issues(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY container_repositories
+ ADD CONSTRAINT fk_rails_32f7bf5aad FOREIGN KEY (project_id) REFERENCES projects(id);
+
+ALTER TABLE ONLY clusters_applications_jupyter
+ ADD CONSTRAINT fk_rails_331f0aff78 FOREIGN KEY (oauth_application_id) REFERENCES oauth_applications(id) ON DELETE SET NULL;
+
+ALTER TABLE ONLY merge_request_metrics
+ ADD CONSTRAINT fk_rails_33ae169d48 FOREIGN KEY (pipeline_id) REFERENCES ci_pipelines(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY suggestions
+ ADD CONSTRAINT fk_rails_33b03a535c FOREIGN KEY (note_id) REFERENCES notes(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY board_labels
+ ADD CONSTRAINT fk_rails_362b0600a3 FOREIGN KEY (label_id) REFERENCES labels(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY merge_request_blocks
+ ADD CONSTRAINT fk_rails_364d4bea8b FOREIGN KEY (blocked_merge_request_id) REFERENCES merge_requests(id) ON DELETE CASCADE;
+
+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 issue_user_mentions
+ ADD CONSTRAINT fk_rails_3861d9fefa FOREIGN KEY (note_id) REFERENCES notes(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY self_managed_prometheus_alert_events
+ ADD CONSTRAINT fk_rails_3936dadc62 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY approval_project_rules_groups
+ ADD CONSTRAINT fk_rails_396841e79e FOREIGN KEY (group_id) REFERENCES namespaces(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY self_managed_prometheus_alert_events
+ ADD CONSTRAINT fk_rails_39d83d1b65 FOREIGN KEY (environment_id) REFERENCES environments(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY chat_teams
+ ADD CONSTRAINT fk_rails_3b543909cb FOREIGN KEY (namespace_id) REFERENCES namespaces(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY ci_build_needs
+ ADD CONSTRAINT fk_rails_3cf221d4ed FOREIGN KEY (build_id) REFERENCES ci_builds(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY cluster_groups
+ ADD CONSTRAINT fk_rails_3d28377556 FOREIGN KEY (group_id) REFERENCES namespaces(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY note_diff_files
+ ADD CONSTRAINT fk_rails_3d66047aeb FOREIGN KEY (diff_note_id) REFERENCES notes(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY snippet_user_mentions
+ ADD CONSTRAINT fk_rails_3e00189191 FOREIGN KEY (snippet_id) REFERENCES snippets(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY clusters_applications_helm
+ ADD CONSTRAINT fk_rails_3e2b1c06bc FOREIGN KEY (cluster_id) REFERENCES clusters(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY epic_user_mentions
+ ADD CONSTRAINT fk_rails_3eaf4d88cc FOREIGN KEY (epic_id) REFERENCES epics(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY analytics_cycle_analytics_project_stages
+ ADD CONSTRAINT fk_rails_3ec9fd7912 FOREIGN KEY (end_event_label_id) REFERENCES labels(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY board_assignees
+ ADD CONSTRAINT fk_rails_3f6f926bd5 FOREIGN KEY (board_id) REFERENCES boards(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY description_versions
+ ADD CONSTRAINT fk_rails_3ff658220b FOREIGN KEY (issue_id) REFERENCES issues(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY clusters_kubernetes_namespaces
+ ADD CONSTRAINT fk_rails_40cc7ccbc3 FOREIGN KEY (cluster_project_id) REFERENCES cluster_projects(id) ON DELETE SET NULL;
+
+ALTER TABLE ONLY geo_node_namespace_links
+ ADD CONSTRAINT fk_rails_41ff5fb854 FOREIGN KEY (namespace_id) REFERENCES namespaces(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY epic_issues
+ ADD CONSTRAINT fk_rails_4209981af6 FOREIGN KEY (issue_id) REFERENCES issues(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY ci_refs
+ ADD CONSTRAINT fk_rails_4249db8cc3 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY ci_resources
+ ADD CONSTRAINT fk_rails_430336af2d FOREIGN KEY (resource_group_id) REFERENCES ci_resource_groups(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY remote_mirrors
+ ADD CONSTRAINT fk_rails_43a9aa4ca8 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY lfs_file_locks
+ ADD CONSTRAINT fk_rails_43df7a0412 FOREIGN KEY (project_id) REFERENCES projects(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;
+
+ALTER TABLE ONLY packages_dependency_links
+ ADD CONSTRAINT fk_rails_4437bf4070 FOREIGN KEY (dependency_id) REFERENCES packages_dependencies(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY project_auto_devops
+ ADD CONSTRAINT fk_rails_45436b12b2 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY merge_requests_closing_issues
+ ADD CONSTRAINT fk_rails_458eda8667 FOREIGN KEY (merge_request_id) REFERENCES merge_requests(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY protected_environment_deploy_access_levels
+ ADD CONSTRAINT fk_rails_45cc02a931 FOREIGN KEY (group_id) REFERENCES namespaces(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY prometheus_alert_events
+ ADD CONSTRAINT fk_rails_4675865839 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY smartcard_identities
+ ADD CONSTRAINT fk_rails_4689f889a9 FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY vulnerability_feedback
+ ADD CONSTRAINT fk_rails_472f69b043 FOREIGN KEY (author_id) REFERENCES users(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY user_custom_attributes
+ ADD CONSTRAINT fk_rails_47b91868a8 FOREIGN KEY (user_id) REFERENCES users(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;
+
+ALTER TABLE ONLY design_management_designs
+ ADD CONSTRAINT fk_rails_4bb1073360 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY issue_metrics
+ ADD CONSTRAINT fk_rails_4bb543d85d FOREIGN KEY (issue_id) REFERENCES issues(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY project_metrics_settings
+ ADD CONSTRAINT fk_rails_4c6037ee4f FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY prometheus_metrics
+ ADD CONSTRAINT fk_rails_4c8957a707 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY snippet_user_mentions
+ ADD CONSTRAINT fk_rails_4d3f96b2cb FOREIGN KEY (note_id) REFERENCES notes(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY geo_repository_renamed_events
+ ADD CONSTRAINT fk_rails_4e6524febb FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY aws_roles
+ ADD CONSTRAINT fk_rails_4ed56f4720 FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY merge_request_diff_files
+ ADD CONSTRAINT fk_rails_501aa0a391 FOREIGN KEY (merge_request_diff_id) REFERENCES merge_request_diffs(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY x509_commit_signatures
+ ADD CONSTRAINT fk_rails_53fe41188f FOREIGN KEY (x509_certificate_id) REFERENCES x509_certificates(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY geo_node_namespace_links
+ ADD CONSTRAINT fk_rails_546bf08d3e FOREIGN KEY (geo_node_id) REFERENCES geo_nodes(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY clusters_applications_knative
+ ADD CONSTRAINT fk_rails_54fc91e0a0 FOREIGN KEY (cluster_id) REFERENCES clusters(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY clusters_applications_prometheus
+ ADD CONSTRAINT fk_rails_557e773639 FOREIGN KEY (cluster_id) REFERENCES clusters(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY issue_user_mentions
+ ADD CONSTRAINT fk_rails_57581fda73 FOREIGN KEY (issue_id) REFERENCES issues(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY merge_request_assignees
+ ADD CONSTRAINT fk_rails_579d375628 FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY analytics_cycle_analytics_group_stages
+ ADD CONSTRAINT fk_rails_5a22f40223 FOREIGN KEY (start_event_label_id) REFERENCES labels(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY badges
+ ADD CONSTRAINT fk_rails_5a7c055bdc FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY resource_label_events
+ ADD CONSTRAINT fk_rails_5ac1d2fc24 FOREIGN KEY (issue_id) REFERENCES issues(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY approval_merge_request_rules_groups
+ ADD CONSTRAINT fk_rails_5b2ecf6139 FOREIGN KEY (approval_merge_request_rule_id) REFERENCES approval_merge_request_rules(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY protected_environment_deploy_access_levels
+ ADD CONSTRAINT fk_rails_5b9f6970fe FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY protected_branch_unprotect_access_levels
+ ADD CONSTRAINT fk_rails_5be1abfc25 FOREIGN KEY (group_id) REFERENCES namespaces(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY cluster_providers_gcp
+ ADD CONSTRAINT fk_rails_5c2c3bc814 FOREIGN KEY (cluster_id) REFERENCES clusters(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY insights
+ ADD CONSTRAINT fk_rails_5c4391f60a FOREIGN KEY (namespace_id) REFERENCES namespaces(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY vulnerability_scanners
+ ADD CONSTRAINT fk_rails_5c9d42a221 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY reviews
+ ADD CONSTRAINT fk_rails_5ca11d8c31 FOREIGN KEY (merge_request_id) REFERENCES merge_requests(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY epic_issues
+ ADD CONSTRAINT fk_rails_5d942936b4 FOREIGN KEY (epic_id) REFERENCES epics(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY resource_weight_events
+ ADD CONSTRAINT fk_rails_5eb5cb92a1 FOREIGN KEY (issue_id) REFERENCES issues(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY approval_project_rules
+ ADD CONSTRAINT fk_rails_5fb4dd100b FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY protected_branch_merge_access_levels
+ ADD CONSTRAINT fk_rails_5ffb4f3590 FOREIGN KEY (user_id) REFERENCES users(id);
+
+ALTER TABLE ONLY evidences
+ ADD CONSTRAINT fk_rails_6388b435a6 FOREIGN KEY (release_id) REFERENCES releases(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY vulnerability_occurrence_pipelines
+ ADD CONSTRAINT fk_rails_6421e35d7d FOREIGN KEY (pipeline_id) REFERENCES ci_pipelines(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY reviews
+ ADD CONSTRAINT fk_rails_64798be025 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY operations_feature_flags
+ ADD CONSTRAINT fk_rails_648e241be7 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY board_group_recent_visits
+ ADD CONSTRAINT fk_rails_64bfc19bc5 FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY approval_merge_request_rule_sources
+ ADD CONSTRAINT fk_rails_64e8ed3c7e FOREIGN KEY (approval_project_rule_id) REFERENCES approval_project_rules(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY ci_pipeline_chat_data
+ ADD CONSTRAINT fk_rails_64ebfab6b3 FOREIGN KEY (pipeline_id) REFERENCES ci_pipelines(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY design_management_versions
+ ADD CONSTRAINT fk_rails_6574200d99 FOREIGN KEY (issue_id) REFERENCES issues(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY approval_merge_request_rules_approved_approvers
+ ADD CONSTRAINT fk_rails_6577725edb FOREIGN KEY (approval_merge_request_rule_id) REFERENCES approval_merge_request_rules(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY operations_feature_flags_clients
+ ADD CONSTRAINT fk_rails_6650ed902c FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY web_hook_logs
+ ADD CONSTRAINT fk_rails_666826e111 FOREIGN KEY (web_hook_id) REFERENCES web_hooks(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 plan_limits
+ ADD CONSTRAINT fk_rails_69f8b6184f FOREIGN KEY (plan_id) REFERENCES plans(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY prometheus_alerts
+ ADD CONSTRAINT fk_rails_6d9b283465 FOREIGN KEY (environment_id) REFERENCES environments(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY merge_request_milestones
+ ADD CONSTRAINT fk_rails_6da5e88b3c FOREIGN KEY (milestone_id) REFERENCES milestones(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY term_agreements
+ ADD CONSTRAINT fk_rails_6ea6520e4a FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY users_security_dashboard_projects
+ ADD CONSTRAINT fk_rails_6f6cf8e66e FOREIGN KEY (user_id) REFERENCES users(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;
+
+ALTER TABLE ONLY list_user_preferences
+ ADD CONSTRAINT fk_rails_70b2ef5ce2 FOREIGN KEY (list_id) REFERENCES lists(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY project_custom_attributes
+ ADD CONSTRAINT fk_rails_719c3dccc5 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY user_interacted_projects
+ ADD CONSTRAINT fk_rails_722ceba4f7 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY slack_integrations
+ ADD CONSTRAINT fk_rails_73db19721a FOREIGN KEY (service_id) REFERENCES services(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY merge_request_context_commit_diff_files
+ ADD CONSTRAINT fk_rails_74a00a1787 FOREIGN KEY (merge_request_context_commit_id) REFERENCES merge_request_context_commits(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY clusters_applications_ingress
+ ADD CONSTRAINT fk_rails_753a7b41c1 FOREIGN KEY (cluster_id) REFERENCES clusters(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY release_links
+ ADD CONSTRAINT fk_rails_753be7ae29 FOREIGN KEY (release_id) REFERENCES releases(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY milestone_releases
+ ADD CONSTRAINT fk_rails_754f27dbfa FOREIGN KEY (release_id) REFERENCES releases(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY analytics_repository_files
+ ADD CONSTRAINT fk_rails_755b835007 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY geo_repositories_changed_events
+ ADD CONSTRAINT fk_rails_75ec0fefcc FOREIGN KEY (geo_node_id) REFERENCES geo_nodes(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY resource_label_events
+ ADD CONSTRAINT fk_rails_75efb0a653 FOREIGN KEY (epic_id) REFERENCES epics(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY path_locks
+ ADD CONSTRAINT fk_rails_762cdcf942 FOREIGN KEY (user_id) REFERENCES users(id);
+
+ALTER TABLE ONLY x509_certificates
+ ADD CONSTRAINT fk_rails_76479fb5b4 FOREIGN KEY (x509_issuer_id) REFERENCES x509_issuers(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY pages_domain_acme_orders
+ ADD CONSTRAINT fk_rails_76581b1c16 FOREIGN KEY (pages_domain_id) REFERENCES pages_domains(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 software_license_policies
+ ADD CONSTRAINT fk_rails_7a7a2a92de FOREIGN KEY (software_license_id) REFERENCES software_licenses(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY project_repositories
+ ADD CONSTRAINT fk_rails_7a810d4121 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY milestone_releases
+ ADD CONSTRAINT fk_rails_7ae0756a2d FOREIGN KEY (milestone_id) REFERENCES milestones(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY application_settings
+ ADD CONSTRAINT fk_rails_7e112a9599 FOREIGN KEY (instance_administration_project_id) REFERENCES projects(id) ON DELETE SET NULL;
+
+ALTER TABLE ONLY clusters_kubernetes_namespaces
+ ADD CONSTRAINT fk_rails_7e7688ecaf FOREIGN KEY (cluster_id) REFERENCES clusters(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY approval_merge_request_rules_users
+ ADD CONSTRAINT fk_rails_80e6801803 FOREIGN KEY (approval_merge_request_rule_id) REFERENCES approval_merge_request_rules(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY deployment_merge_requests
+ ADD CONSTRAINT fk_rails_86a6d8bf12 FOREIGN KEY (merge_request_id) REFERENCES merge_requests(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY analytics_language_trend_repository_languages
+ ADD CONSTRAINT fk_rails_86cc9aef5f FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY clusters_applications_crossplane
+ ADD CONSTRAINT fk_rails_87186702df FOREIGN KEY (cluster_id) REFERENCES clusters(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY ci_runner_namespaces
+ ADD CONSTRAINT fk_rails_8767676b7a FOREIGN KEY (runner_id) REFERENCES ci_runners(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY software_license_policies
+ ADD CONSTRAINT fk_rails_87b2247ce5 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY protected_environment_deploy_access_levels
+ ADD CONSTRAINT fk_rails_898a13b650 FOREIGN KEY (protected_environment_id) REFERENCES protected_environments(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY analytics_repository_file_commits
+ ADD CONSTRAINT fk_rails_89bc941356 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY gpg_key_subkeys
+ ADD CONSTRAINT fk_rails_8b2c90b046 FOREIGN KEY (gpg_key_id) REFERENCES gpg_keys(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY allowed_email_domains
+ ADD CONSTRAINT fk_rails_8b5da859f9 FOREIGN KEY (group_id) REFERENCES namespaces(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY cluster_projects
+ ADD CONSTRAINT fk_rails_8b8c5caf07 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY project_pages_metadata
+ ADD CONSTRAINT fk_rails_8c28a61485 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY packages_conan_metadata
+ ADD CONSTRAINT fk_rails_8c68cfec8b FOREIGN KEY (package_id) REFERENCES packages_packages(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY vulnerability_feedback
+ ADD CONSTRAINT fk_rails_8c77e5891a FOREIGN KEY (issue_id) REFERENCES issues(id) ON DELETE SET NULL;
+
+ALTER TABLE ONLY approval_merge_request_rules_approved_approvers
+ ADD CONSTRAINT fk_rails_8dc94cff4d FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY protected_branch_push_access_levels
+ ADD CONSTRAINT fk_rails_8dcb712d65 FOREIGN KEY (user_id) REFERENCES users(id);
+
+ALTER TABLE ONLY design_user_mentions
+ ADD CONSTRAINT fk_rails_8de8c6d632 FOREIGN KEY (note_id) REFERENCES notes(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY clusters_kubernetes_namespaces
+ ADD CONSTRAINT fk_rails_8df789f3ab FOREIGN KEY (environment_id) REFERENCES environments(id) ON DELETE SET NULL;
+
+ALTER TABLE ONLY project_daily_statistics
+ ADD CONSTRAINT fk_rails_8e549b272d FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY ci_pipelines_config
+ ADD CONSTRAINT fk_rails_906c9a2533 FOREIGN KEY (pipeline_id) REFERENCES ci_pipelines(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY approval_project_rules_groups
+ ADD CONSTRAINT fk_rails_9071e863d1 FOREIGN KEY (approval_project_rule_id) REFERENCES approval_project_rules(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY vulnerability_occurrences
+ ADD CONSTRAINT fk_rails_90fed4faba FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY geo_reset_checksum_events
+ ADD CONSTRAINT fk_rails_910a06f12b FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY project_error_tracking_settings
+ ADD CONSTRAINT fk_rails_910a2b8bd9 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY list_user_preferences
+ ADD CONSTRAINT fk_rails_916d72cafd FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY board_labels
+ ADD CONSTRAINT fk_rails_9374a16edd FOREIGN KEY (board_id) REFERENCES boards(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;
+
+ALTER TABLE ONLY resource_label_events
+ ADD CONSTRAINT fk_rails_9851a00031 FOREIGN KEY (merge_request_id) REFERENCES merge_requests(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY ci_job_artifacts
+ ADD CONSTRAINT fk_rails_9862d392f9 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY board_project_recent_visits
+ ADD CONSTRAINT fk_rails_98f8843922 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY clusters_kubernetes_namespaces
+ ADD CONSTRAINT fk_rails_98fe21e486 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE SET NULL;
+
+ALTER TABLE ONLY users_ops_dashboard_projects
+ ADD CONSTRAINT fk_rails_9b4ebf005b FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY project_incident_management_settings
+ ADD CONSTRAINT fk_rails_9c2ea1b7dd FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY gpg_keys
+ ADD CONSTRAINT fk_rails_9d1f5d8719 FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY analytics_language_trend_repository_languages
+ ADD CONSTRAINT fk_rails_9d851d566c FOREIGN KEY (programming_language_id) REFERENCES programming_languages(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY badges
+ ADD CONSTRAINT fk_rails_9df4a56538 FOREIGN KEY (group_id) REFERENCES namespaces(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;
+
+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 project_aliases
+ ADD CONSTRAINT fk_rails_a1804f74a7 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY jira_tracker_data
+ ADD CONSTRAINT fk_rails_a299066916 FOREIGN KEY (service_id) REFERENCES services(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY protected_environments
+ ADD CONSTRAINT fk_rails_a354313d11 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY fork_network_members
+ ADD CONSTRAINT fk_rails_a40860a1ca FOREIGN KEY (fork_network_id) REFERENCES fork_networks(id) ON DELETE CASCADE;
+
+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 cluster_projects
+ ADD CONSTRAINT fk_rails_a5a958bca1 FOREIGN KEY (cluster_id) REFERENCES clusters(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY commit_user_mentions
+ ADD CONSTRAINT fk_rails_a6760813e0 FOREIGN KEY (note_id) REFERENCES notes(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY vulnerability_identifiers
+ ADD CONSTRAINT fk_rails_a67a16c885 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY user_preferences
+ ADD CONSTRAINT fk_rails_a69bfcfd81 FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY sentry_issues
+ ADD CONSTRAINT fk_rails_a6a9612965 FOREIGN KEY (issue_id) REFERENCES issues(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY repository_languages
+ ADD CONSTRAINT fk_rails_a750ec87a8 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY term_agreements
+ ADD CONSTRAINT fk_rails_a88721bcdf FOREIGN KEY (term_id) REFERENCES application_setting_terms(id);
+
+ALTER TABLE ONLY merge_request_user_mentions
+ ADD CONSTRAINT fk_rails_aa1b2961b1 FOREIGN KEY (merge_request_id) REFERENCES merge_requests(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY x509_commit_signatures
+ ADD CONSTRAINT fk_rails_ab07452314 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY ci_build_trace_sections
+ ADD CONSTRAINT fk_rails_ab7c104e26 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY clusters
+ ADD CONSTRAINT fk_rails_ac3a663d79 FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE SET NULL;
+
+ALTER TABLE ONLY analytics_cycle_analytics_group_stages
+ ADD CONSTRAINT fk_rails_ae5da3409b FOREIGN KEY (group_id) REFERENCES namespaces(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY pool_repositories
+ ADD CONSTRAINT fk_rails_af3f8c5d62 FOREIGN KEY (shard_id) REFERENCES shards(id) ON DELETE RESTRICT;
+
+ALTER TABLE ONLY resource_label_events
+ ADD CONSTRAINT fk_rails_b126799f57 FOREIGN KEY (label_id) REFERENCES labels(id) ON DELETE SET NULL;
+
+ALTER TABLE ONLY packages_build_infos
+ ADD CONSTRAINT fk_rails_b18868292d FOREIGN KEY (package_id) REFERENCES packages_packages(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY merge_trains
+ ADD CONSTRAINT fk_rails_b29261ce31 FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY board_project_recent_visits
+ ADD CONSTRAINT fk_rails_b315dd0c80 FOREIGN KEY (board_id) REFERENCES boards(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY issues_prometheus_alert_events
+ ADD CONSTRAINT fk_rails_b32edb790f FOREIGN KEY (prometheus_alert_event_id) REFERENCES prometheus_alert_events(id) ON DELETE CASCADE;
+
+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 issue_milestones
+ ADD CONSTRAINT fk_rails_b3daad894f FOREIGN KEY (milestone_id) REFERENCES milestones(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;
+
+ALTER TABLE ONLY namespace_aggregation_schedules
+ ADD CONSTRAINT fk_rails_b565c8d16c FOREIGN KEY (namespace_id) REFERENCES namespaces(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY alerts_service_data
+ ADD CONSTRAINT fk_rails_b93215a42c FOREIGN KEY (service_id) REFERENCES services(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY merge_trains
+ ADD CONSTRAINT fk_rails_b9d67af01d FOREIGN KEY (target_project_id) REFERENCES projects(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY approval_project_rules_users
+ ADD CONSTRAINT fk_rails_b9e9394efb FOREIGN KEY (approval_project_rule_id) REFERENCES approval_project_rules(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY lists
+ ADD CONSTRAINT fk_rails_baed5f39b7 FOREIGN KEY (milestone_id) REFERENCES milestones(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY approval_merge_request_rules_users
+ ADD CONSTRAINT fk_rails_bc8972fa55 FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY external_pull_requests
+ ADD CONSTRAINT fk_rails_bcae9b5c7b FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY elasticsearch_indexed_projects
+ ADD CONSTRAINT fk_rails_bd13bbdc3d FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY elasticsearch_indexed_namespaces
+ ADD CONSTRAINT fk_rails_bdcf044f37 FOREIGN KEY (namespace_id) REFERENCES namespaces(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY vulnerability_occurrence_identifiers
+ ADD CONSTRAINT fk_rails_be2e49e1d0 FOREIGN KEY (identifier_id) REFERENCES vulnerability_identifiers(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY vulnerability_occurrences
+ ADD CONSTRAINT fk_rails_bf5b788ca7 FOREIGN KEY (scanner_id) REFERENCES vulnerability_scanners(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY resource_weight_events
+ ADD CONSTRAINT fk_rails_bfc406b47c FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE SET NULL;
+
+ALTER TABLE ONLY design_management_designs
+ ADD CONSTRAINT fk_rails_bfe283ec3c FOREIGN KEY (issue_id) REFERENCES issues(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY u2f_registrations
+ ADD CONSTRAINT fk_rails_bfe6a84544 FOREIGN KEY (user_id) REFERENCES users(id);
+
+ALTER TABLE ONLY serverless_domain_cluster
+ ADD CONSTRAINT fk_rails_c09009dee1 FOREIGN KEY (pages_domain_id) REFERENCES pages_domains(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY labels
+ ADD CONSTRAINT fk_rails_c1ac5161d8 FOREIGN KEY (group_id) REFERENCES namespaces(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY project_feature_usages
+ ADD CONSTRAINT fk_rails_c22a50024b FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY project_repositories
+ ADD CONSTRAINT fk_rails_c3258dc63b FOREIGN KEY (shard_id) REFERENCES shards(id) ON DELETE RESTRICT;
+
+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 ci_job_artifacts
+ ADD CONSTRAINT fk_rails_c5137cb2c1 FOREIGN KEY (job_id) REFERENCES ci_builds(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY project_settings
+ ADD CONSTRAINT fk_rails_c6df6e6328 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY container_expiration_policies
+ ADD CONSTRAINT fk_rails_c7360f09ad FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY scim_oauth_access_tokens
+ ADD CONSTRAINT fk_rails_c84404fb6c FOREIGN KEY (group_id) REFERENCES namespaces(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY vulnerability_occurrences
+ ADD CONSTRAINT fk_rails_c8661a61eb FOREIGN KEY (primary_identifier_id) REFERENCES vulnerability_identifiers(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY gpg_signatures
+ ADD CONSTRAINT fk_rails_c97176f5f7 FOREIGN KEY (gpg_key_id) REFERENCES gpg_keys(id) ON DELETE SET NULL;
+
+ALTER TABLE ONLY board_group_recent_visits
+ ADD CONSTRAINT fk_rails_ca04c38720 FOREIGN KEY (board_id) REFERENCES boards(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;
+
+ALTER TABLE ONLY issue_tracker_data
+ ADD CONSTRAINT fk_rails_ccc0840427 FOREIGN KEY (service_id) REFERENCES services(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY analytics_repository_file_edits
+ ADD CONSTRAINT fk_rails_ce1d13b872 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY epic_metrics
+ ADD CONSTRAINT fk_rails_d071904753 FOREIGN KEY (epic_id) REFERENCES epics(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY subscriptions
+ ADD CONSTRAINT fk_rails_d0c8bda804 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY project_mirror_data
+ ADD CONSTRAINT fk_rails_d1aad367d7 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
+
+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 group_group_links
+ ADD CONSTRAINT fk_rails_d3a0488427 FOREIGN KEY (shared_group_id) REFERENCES namespaces(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY vulnerability_issue_links
+ ADD CONSTRAINT fk_rails_d459c19036 FOREIGN KEY (vulnerability_id) REFERENCES vulnerabilities(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY geo_hashed_storage_attachments_events
+ ADD CONSTRAINT fk_rails_d496b088e9 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY analytics_repository_file_edits
+ ADD CONSTRAINT fk_rails_d74fd62274 FOREIGN KEY (analytics_repository_file_id) REFERENCES analytics_repository_files(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY issues_prometheus_alert_events
+ ADD CONSTRAINT fk_rails_db5b756534 FOREIGN KEY (issue_id) REFERENCES issues(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;
+
+ALTER TABLE ONLY deployment_merge_requests
+ ADD CONSTRAINT fk_rails_dcbce9f4df FOREIGN KEY (deployment_id) REFERENCES deployments(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY user_callouts
+ ADD CONSTRAINT fk_rails_ddfdd80f3d FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY vulnerability_feedback
+ ADD CONSTRAINT fk_rails_debd54e456 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
+
+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 label_priorities
+ ADD CONSTRAINT fk_rails_e161058b0f FOREIGN KEY (label_id) REFERENCES labels(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY packages_packages
+ ADD CONSTRAINT fk_rails_e1ac527425 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY cluster_platforms_kubernetes
+ ADD CONSTRAINT fk_rails_e1e2cf841a FOREIGN KEY (cluster_id) REFERENCES clusters(id) ON DELETE CASCADE;
+
+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_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 approval_merge_request_rule_sources
+ ADD CONSTRAINT fk_rails_e605a04f76 FOREIGN KEY (approval_merge_request_rule_id) REFERENCES approval_merge_request_rules(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY prometheus_alerts
+ ADD CONSTRAINT fk_rails_e6351447ec FOREIGN KEY (prometheus_metric_id) REFERENCES prometheus_metrics(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY merge_request_metrics
+ ADD CONSTRAINT fk_rails_e6d7c24d1b FOREIGN KEY (merge_request_id) REFERENCES merge_requests(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY draft_notes
+ ADD CONSTRAINT fk_rails_e753681674 FOREIGN KEY (merge_request_id) REFERENCES merge_requests(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY description_versions
+ ADD CONSTRAINT fk_rails_e8f4caf9c7 FOREIGN KEY (epic_id) REFERENCES epics(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY vulnerability_issue_links
+ ADD CONSTRAINT fk_rails_e9180d534b FOREIGN KEY (issue_id) REFERENCES issues(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY merge_request_blocks
+ ADD CONSTRAINT fk_rails_e9387863bc FOREIGN KEY (blocking_merge_request_id) REFERENCES merge_requests(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY protected_branch_unprotect_access_levels
+ ADD CONSTRAINT fk_rails_e9eb8dc025 FOREIGN KEY (protected_branch_id) REFERENCES protected_branches(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY cluster_providers_aws
+ ADD CONSTRAINT fk_rails_ed1fdfaeb2 FOREIGN KEY (created_by_user_id) REFERENCES users(id) ON DELETE SET NULL;
+
+ALTER TABLE ONLY label_priorities
+ ADD CONSTRAINT fk_rails_ef916d14fa FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY fork_network_members
+ ADD CONSTRAINT fk_rails_efccadc4ec 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;
+
+ALTER TABLE ONLY import_export_uploads
+ ADD CONSTRAINT fk_rails_f129140f9e FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY ci_pipeline_chat_data
+ ADD CONSTRAINT fk_rails_f300456b63 FOREIGN KEY (chat_name_id) REFERENCES chat_names(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY approval_project_rules_users
+ ADD CONSTRAINT fk_rails_f365da8250 FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY insights
+ ADD CONSTRAINT fk_rails_f36fda3932 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY board_group_recent_visits
+ ADD CONSTRAINT fk_rails_f410736518 FOREIGN KEY (group_id) REFERENCES namespaces(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY design_user_mentions
+ ADD CONSTRAINT fk_rails_f7075a53c1 FOREIGN KEY (design_id) REFERENCES design_management_designs(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY internal_ids
+ ADD CONSTRAINT fk_rails_f7d46b66c6 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY issues_self_managed_prometheus_alert_events
+ ADD CONSTRAINT fk_rails_f7db2d72eb FOREIGN KEY (self_managed_prometheus_alert_event_id) REFERENCES self_managed_prometheus_alert_events(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY merge_requests_closing_issues
+ ADD CONSTRAINT fk_rails_f8540692be FOREIGN KEY (issue_id) REFERENCES issues(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY ci_build_trace_section_names
+ ADD CONSTRAINT fk_rails_f8cd72cd26 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY merge_trains
+ ADD CONSTRAINT fk_rails_f90820cb08 FOREIGN KEY (pipeline_id) REFERENCES ci_pipelines(id) ON DELETE SET NULL;
+
+ALTER TABLE ONLY ci_runner_namespaces
+ ADD CONSTRAINT fk_rails_f9d9ed3308 FOREIGN KEY (namespace_id) REFERENCES namespaces(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY board_project_recent_visits
+ ADD CONSTRAINT fk_rails_fb6fc419cb FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY serverless_domain_cluster
+ ADD CONSTRAINT fk_rails_fbdba67eb1 FOREIGN KEY (creator_id) REFERENCES users(id) ON DELETE SET NULL;
+
+ALTER TABLE ONLY ci_job_variables
+ ADD CONSTRAINT fk_rails_fbf3b34792 FOREIGN KEY (job_id) REFERENCES ci_builds(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY cluster_groups
+ ADD CONSTRAINT fk_rails_fdb8648a96 FOREIGN KEY (cluster_id) REFERENCES clusters(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY project_tracing_settings
+ ADD CONSTRAINT fk_rails_fe56f57fc6 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY resource_label_events
+ ADD CONSTRAINT fk_rails_fe91ece594 FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE SET NULL;
+
+ALTER TABLE ONLY issue_milestones
+ ADD CONSTRAINT fk_rails_ff90aaa198 FOREIGN KEY (issue_id) REFERENCES issues(id) ON DELETE CASCADE;
+
+ALTER TABLE ONLY ci_builds_metadata
+ ADD CONSTRAINT fk_rails_ffcf702a02 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
+
+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;
diff --git a/db/migrate/20181228175414_init_schema.rb b/db/migrate/20181228175414_init_schema.rb
index d4212f405d9..df68927d79a 100644
--- a/db/migrate/20181228175414_init_schema.rb
+++ b/db/migrate/20181228175414_init_schema.rb
@@ -1,2562 +1,13 @@
# frozen_string_literal: true
-# rubocop:disable Metrics/AbcSize
-# rubocop:disable Migration/AddConcurrentForeignKey
-# rubocop:disable Style/WordArray
-# rubocop:disable Migration/PreventStrings
-# rubocop:disable Migration/AddLimitToTextColumns
-# rubocop:disable Migration/Datetime
-
class InitSchema < ActiveRecord::Migration[6.0]
DOWNTIME = false
def up
- # These are extensions that must be enabled in order to support this database
- enable_extension "pg_trgm"
- enable_extension "plpgsql"
-
- create_table "abuse_reports", id: :serial, force: :cascade do |t|
- t.integer "reporter_id"
- t.integer "user_id"
- t.text "message"
- t.datetime "created_at"
- t.datetime "updated_at"
- t.text "message_html"
- t.integer "cached_markdown_version"
- end
-
- create_table "appearances", id: :serial, force: :cascade do |t|
- t.string "title", null: false
- t.text "description", null: false
- t.string "header_logo"
- t.string "logo"
- t.datetime_with_timezone "created_at", null: false
- t.datetime_with_timezone "updated_at", null: false
- t.text "description_html"
- t.integer "cached_markdown_version"
- t.string "favicon"
- t.text "new_project_guidelines"
- t.text "new_project_guidelines_html"
- t.text "header_message"
- t.text "header_message_html"
- t.text "footer_message"
- t.text "footer_message_html"
- t.text "message_background_color"
- t.text "message_font_color"
- end
-
- create_table "application_setting_terms", id: :serial, force: :cascade do |t|
- t.integer "cached_markdown_version"
- t.text "terms", null: false
- t.text "terms_html"
- end
-
- create_table "application_settings", id: :serial, force: :cascade do |t|
- t.integer "default_projects_limit"
- t.boolean "signup_enabled"
- t.boolean "gravatar_enabled"
- t.text "sign_in_text"
- t.datetime "created_at"
- t.datetime "updated_at"
- t.string "home_page_url"
- t.integer "default_branch_protection", default: 2
- t.text "restricted_visibility_levels"
- t.boolean "version_check_enabled", default: true
- t.integer "max_attachment_size", default: 10, null: false
- t.integer "default_project_visibility"
- t.integer "default_snippet_visibility"
- t.text "domain_whitelist"
- t.boolean "user_oauth_applications", default: true
- t.string "after_sign_out_path"
- t.integer "session_expire_delay", default: 10080, null: false
- t.text "import_sources"
- t.text "help_page_text"
- t.string "admin_notification_email"
- t.boolean "shared_runners_enabled", default: true, null: false
- t.integer "max_artifacts_size", default: 100, null: false
- t.string "runners_registration_token"
- t.integer "max_pages_size", default: 100, null: false
- t.boolean "require_two_factor_authentication", default: false
- t.integer "two_factor_grace_period", default: 48
- t.boolean "metrics_enabled", default: false
- t.string "metrics_host", default: "localhost"
- t.integer "metrics_pool_size", default: 16
- t.integer "metrics_timeout", default: 10
- t.integer "metrics_method_call_threshold", default: 10
- t.boolean "recaptcha_enabled", default: false
- t.string "recaptcha_site_key"
- t.string "recaptcha_private_key"
- t.integer "metrics_port", default: 8089
- t.boolean "akismet_enabled", default: false
- t.string "akismet_api_key"
- t.integer "metrics_sample_interval", default: 15
- t.boolean "sentry_enabled", default: false
- t.string "sentry_dsn"
- t.boolean "email_author_in_body", default: false
- t.integer "default_group_visibility"
- t.boolean "repository_checks_enabled", default: false
- t.text "shared_runners_text"
- t.integer "metrics_packet_size", default: 1
- t.text "disabled_oauth_sign_in_sources"
- t.string "health_check_access_token"
- t.boolean "send_user_confirmation_email", default: false
- t.integer "container_registry_token_expire_delay", default: 5
- t.text "after_sign_up_text"
- t.boolean "user_default_external", default: false, null: false
- t.string "repository_storages", default: "default"
- t.string "enabled_git_access_protocol"
- t.boolean "domain_blacklist_enabled", default: false
- t.text "domain_blacklist"
- t.boolean "usage_ping_enabled", default: true, null: false
- t.text "sign_in_text_html"
- t.text "help_page_text_html"
- t.text "shared_runners_text_html"
- t.text "after_sign_up_text_html"
- t.integer "rsa_key_restriction", default: 0, null: false
- t.integer "dsa_key_restriction", default: -1, null: false
- t.integer "ecdsa_key_restriction", default: 0, null: false
- t.integer "ed25519_key_restriction", default: 0, null: false
- t.boolean "housekeeping_enabled", default: true, null: false
- t.boolean "housekeeping_bitmaps_enabled", default: true, null: false
- t.integer "housekeeping_incremental_repack_period", default: 10, null: false
- t.integer "housekeeping_full_repack_period", default: 50, null: false
- t.integer "housekeeping_gc_period", default: 200, null: false
- t.boolean "html_emails_enabled", default: true
- t.string "plantuml_url"
- t.boolean "plantuml_enabled"
- t.integer "terminal_max_session_time", default: 0, null: false
- t.integer "unique_ips_limit_per_user"
- t.integer "unique_ips_limit_time_window"
- t.boolean "unique_ips_limit_enabled", default: false, null: false
- t.string "default_artifacts_expire_in", default: "0", null: false
- t.string "uuid"
- t.decimal "polling_interval_multiplier", default: "1.0", null: false
- t.integer "cached_markdown_version"
- t.boolean "clientside_sentry_enabled", default: false, null: false
- t.string "clientside_sentry_dsn"
- t.boolean "prometheus_metrics_enabled", default: true, null: false
- t.boolean "authorized_keys_enabled", default: true, null: false
- t.boolean "help_page_hide_commercial_content", default: false
- t.string "help_page_support_url"
- t.integer "performance_bar_allowed_group_id"
- t.boolean "hashed_storage_enabled", default: false, null: false
- t.boolean "project_export_enabled", default: true, null: false
- t.boolean "auto_devops_enabled", default: true, null: false
- t.boolean "throttle_unauthenticated_enabled", default: false, null: false
- t.integer "throttle_unauthenticated_requests_per_period", default: 3600, null: false
- t.integer "throttle_unauthenticated_period_in_seconds", default: 3600, null: false
- t.boolean "throttle_authenticated_api_enabled", default: false, null: false
- t.integer "throttle_authenticated_api_requests_per_period", default: 7200, null: false
- t.integer "throttle_authenticated_api_period_in_seconds", default: 3600, null: false
- t.boolean "throttle_authenticated_web_enabled", default: false, null: false
- t.integer "throttle_authenticated_web_requests_per_period", default: 7200, null: false
- t.integer "throttle_authenticated_web_period_in_seconds", default: 3600, null: false
- t.integer "gitaly_timeout_default", default: 55, null: false
- t.integer "gitaly_timeout_medium", default: 30, null: false
- t.integer "gitaly_timeout_fast", default: 10, null: false
- t.boolean "password_authentication_enabled_for_web"
- t.boolean "password_authentication_enabled_for_git", default: true, null: false
- t.boolean "external_authorization_service_enabled", default: false, null: false
- t.string "external_authorization_service_url"
- t.string "external_authorization_service_default_label"
- t.integer "default_project_creation", default: 2, null: false
- t.string "auto_devops_domain"
- t.boolean "pages_domain_verification_enabled", default: true, null: false
- t.boolean "allow_local_requests_from_hooks_and_services", default: false, null: false
- t.string "user_default_internal_regex"
- t.float "external_authorization_service_timeout", default: 0.5
- t.text "external_auth_client_cert"
- t.text "encrypted_external_auth_client_key"
- t.string "encrypted_external_auth_client_key_iv"
- t.string "encrypted_external_auth_client_key_pass"
- t.string "encrypted_external_auth_client_key_pass_iv"
- t.boolean "enforce_terms", default: false
- t.boolean "mirror_available", default: true, null: false
- t.boolean "hide_third_party_offers", default: false, null: false
- t.boolean "instance_statistics_visibility_private", default: false, null: false
- t.integer "receive_max_input_size"
- t.boolean "web_ide_clientside_preview_enabled", default: false, null: false
- t.boolean "user_show_add_ssh_key_message", default: true, null: false
- t.string "outbound_local_requests_whitelist", limit: 255, array: true
- t.integer "usage_stats_set_by_user_id"
- t.integer "diff_max_patch_bytes", default: 102400, null: false
- t.integer "archive_builds_in_seconds"
- t.string "commit_email_hostname"
- t.integer "first_day_of_week", default: 0, null: false
- t.boolean "protected_ci_variables", default: false, null: false
- t.string "runners_registration_token_encrypted"
- t.index ["usage_stats_set_by_user_id"], name: "index_application_settings_on_usage_stats_set_by_user_id"
- end
-
- create_table "audit_events", id: :serial, force: :cascade do |t|
- t.integer "author_id", null: false
- t.string "type", null: false
- t.integer "entity_id", null: false
- t.string "entity_type", null: false
- t.text "details"
- t.datetime "created_at"
- t.datetime "updated_at"
- t.index ["entity_id", "entity_type"], name: "index_audit_events_on_entity_id_and_entity_type"
- end
-
- create_table "award_emoji", id: :serial, force: :cascade do |t|
- t.string "name"
- t.integer "user_id"
- t.string "awardable_type"
- t.integer "awardable_id"
- t.datetime "created_at"
- t.datetime "updated_at"
- t.index ["awardable_type", "awardable_id"], name: "index_award_emoji_on_awardable_type_and_awardable_id"
- t.index ["user_id", "name"], name: "index_award_emoji_on_user_id_and_name"
- end
-
- create_table "badges", id: :serial, force: :cascade do |t|
- t.string "link_url", null: false
- t.string "image_url", null: false
- t.integer "project_id"
- t.integer "group_id"
- t.string "type", null: false
- t.datetime_with_timezone "created_at", null: false
- t.datetime_with_timezone "updated_at", null: false
- t.index ["group_id"], name: "index_badges_on_group_id"
- t.index ["project_id"], name: "index_badges_on_project_id"
- end
-
- create_table "board_group_recent_visits", force: :cascade do |t|
- t.datetime_with_timezone "created_at", null: false
- t.datetime_with_timezone "updated_at", null: false
- t.integer "user_id"
- t.integer "board_id"
- t.integer "group_id"
- t.index ["board_id"], name: "index_board_group_recent_visits_on_board_id"
- t.index ["group_id"], name: "index_board_group_recent_visits_on_group_id"
- t.index ["user_id", "group_id", "board_id"], name: "index_board_group_recent_visits_on_user_group_and_board", unique: true
- t.index ["user_id"], name: "index_board_group_recent_visits_on_user_id"
- end
-
- create_table "board_project_recent_visits", force: :cascade do |t|
- t.datetime_with_timezone "created_at", null: false
- t.datetime_with_timezone "updated_at", null: false
- t.integer "user_id"
- t.integer "project_id"
- t.integer "board_id"
- t.index ["board_id"], name: "index_board_project_recent_visits_on_board_id"
- t.index ["project_id"], name: "index_board_project_recent_visits_on_project_id"
- t.index ["user_id", "project_id", "board_id"], name: "index_board_project_recent_visits_on_user_project_and_board", unique: true
- t.index ["user_id"], name: "index_board_project_recent_visits_on_user_id"
- end
-
- create_table "boards", id: :serial, force: :cascade do |t|
- t.integer "project_id"
- t.datetime "created_at", null: false
- t.datetime "updated_at", null: false
- t.integer "group_id"
- t.index ["group_id"], name: "index_boards_on_group_id"
- t.index ["project_id"], name: "index_boards_on_project_id"
- end
-
- create_table "broadcast_messages", id: :serial, force: :cascade do |t|
- t.text "message", null: false
- t.datetime "starts_at", null: false
- t.datetime "ends_at", null: false
- t.datetime "created_at", null: false
- t.datetime "updated_at", null: false
- t.string "color"
- t.string "font"
- t.text "message_html", null: false
- t.integer "cached_markdown_version"
- t.index ["starts_at", "ends_at", "id"], name: "index_broadcast_messages_on_starts_at_and_ends_at_and_id"
- end
-
- create_table "chat_names", id: :serial, force: :cascade do |t|
- t.integer "user_id", null: false
- t.integer "service_id", null: false
- t.string "team_id", null: false
- t.string "team_domain"
- t.string "chat_id", null: false
- t.string "chat_name"
- t.datetime "last_used_at"
- t.datetime "created_at", null: false
- t.datetime "updated_at", null: false
- t.index ["service_id", "team_id", "chat_id"], name: "index_chat_names_on_service_id_and_team_id_and_chat_id", unique: true
- t.index ["user_id", "service_id"], name: "index_chat_names_on_user_id_and_service_id", unique: true
- end
-
- create_table "chat_teams", id: :serial, force: :cascade do |t|
- t.integer "namespace_id", null: false
- t.string "team_id"
- t.string "name"
- t.datetime "created_at", null: false
- t.datetime "updated_at", null: false
- t.index ["namespace_id"], name: "index_chat_teams_on_namespace_id", unique: true
- end
-
- create_table "ci_build_trace_chunks", force: :cascade do |t|
- t.integer "build_id", null: false
- t.integer "chunk_index", null: false
- t.integer "data_store", null: false
- t.binary "raw_data"
- t.index ["build_id", "chunk_index"], name: "index_ci_build_trace_chunks_on_build_id_and_chunk_index", unique: true
- end
-
- create_table "ci_build_trace_section_names", id: :serial, force: :cascade do |t|
- t.integer "project_id", null: false
- t.string "name", null: false
- t.index ["project_id", "name"], name: "index_ci_build_trace_section_names_on_project_id_and_name", unique: true
- end
-
- create_table "ci_build_trace_sections", id: :serial, force: :cascade do |t|
- t.integer "project_id", null: false
- t.datetime_with_timezone "date_start", null: false
- t.datetime_with_timezone "date_end", null: false
- t.bigint "byte_start", null: false
- t.bigint "byte_end", null: false
- t.integer "build_id", null: false
- t.integer "section_name_id", null: false
- t.index ["build_id", "section_name_id"], name: "index_ci_build_trace_sections_on_build_id_and_section_name_id", unique: true
- t.index ["project_id"], name: "index_ci_build_trace_sections_on_project_id"
- t.index ["section_name_id"], name: "index_ci_build_trace_sections_on_section_name_id"
- end
-
- create_table "ci_builds", id: :serial, force: :cascade do |t|
- t.string "status"
- t.datetime "finished_at"
- t.text "trace"
- t.datetime "created_at"
- t.datetime "updated_at"
- t.datetime "started_at"
- t.integer "runner_id"
- t.float "coverage"
- t.integer "commit_id"
- t.text "commands"
- t.string "name"
- t.text "options"
- t.boolean "allow_failure", default: false, null: false
- t.string "stage"
- t.integer "trigger_request_id"
- t.integer "stage_idx"
- t.boolean "tag"
- t.string "ref"
- t.integer "user_id"
- t.string "type"
- t.string "target_url"
- t.string "description"
- t.text "artifacts_file"
- t.integer "project_id"
- t.text "artifacts_metadata"
- t.integer "erased_by_id"
- t.datetime "erased_at"
- t.datetime "artifacts_expire_at"
- t.string "environment"
- t.bigint "artifacts_size"
- t.string "when"
- t.text "yaml_variables"
- t.datetime "queued_at"
- t.string "token"
- t.integer "lock_version"
- t.string "coverage_regex"
- t.integer "auto_canceled_by_id"
- t.boolean "retried"
- t.integer "stage_id"
- t.integer "artifacts_file_store"
- t.integer "artifacts_metadata_store"
- t.boolean "protected"
- t.integer "failure_reason"
- t.datetime_with_timezone "scheduled_at"
- t.string "token_encrypted"
- t.index ["artifacts_expire_at"], name: "index_ci_builds_on_artifacts_expire_at", where: "(artifacts_file <> ''::text)"
- t.index ["auto_canceled_by_id"], name: "index_ci_builds_on_auto_canceled_by_id"
- t.index ["commit_id", "artifacts_expire_at", "id"], name: "index_ci_builds_on_commit_id_and_artifacts_expireatandidpartial", where: "(((type)::text = 'Ci::Build'::text) AND ((retried = false) OR (retried IS NULL)) AND ((name)::text = ANY (ARRAY[('sast'::character varying)::text, ('dependency_scanning'::character varying)::text, ('sast:container'::character varying)::text, ('container_scanning'::character varying)::text, ('dast'::character varying)::text])))"
- t.index ["commit_id", "stage_idx", "created_at"], name: "index_ci_builds_on_commit_id_and_stage_idx_and_created_at"
- t.index ["commit_id", "status", "type"], name: "index_ci_builds_on_commit_id_and_status_and_type"
- t.index ["commit_id", "type", "name", "ref"], name: "index_ci_builds_on_commit_id_and_type_and_name_and_ref"
- t.index ["commit_id", "type", "ref"], name: "index_ci_builds_on_commit_id_and_type_and_ref"
- t.index ["id"], name: "partial_index_ci_builds_on_id_with_legacy_artifacts", where: "(artifacts_file <> ''::text)"
- t.index ["project_id", "id"], name: "index_ci_builds_on_project_id_and_id"
- t.index ["project_id", "status"], name: "index_ci_builds_project_id_and_status_for_live_jobs_partial2", where: "(((type)::text = 'Ci::Build'::text) AND ((status)::text = ANY (ARRAY[('running'::character varying)::text, ('pending'::character varying)::text, ('created'::character varying)::text])))"
- t.index ["protected"], name: "index_ci_builds_on_protected"
- t.index ["runner_id"], name: "index_ci_builds_on_runner_id"
- t.index ["scheduled_at"], name: "partial_index_ci_builds_on_scheduled_at_with_scheduled_jobs", where: "((scheduled_at IS NOT NULL) AND ((type)::text = 'Ci::Build'::text) AND ((status)::text = 'scheduled'::text))"
- t.index ["stage_id", "stage_idx"], name: "tmp_build_stage_position_index", where: "(stage_idx IS NOT NULL)"
- t.index ["stage_id"], name: "index_ci_builds_on_stage_id"
- t.index ["status", "type", "runner_id"], name: "index_ci_builds_on_status_and_type_and_runner_id"
- t.index ["token"], name: "index_ci_builds_on_token", unique: true
- t.index ["token_encrypted"], name: "index_ci_builds_on_token_encrypted", unique: true, where: "(token_encrypted IS NOT NULL)"
- t.index ["updated_at"], name: "index_ci_builds_on_updated_at"
- t.index ["user_id"], name: "index_ci_builds_on_user_id"
- end
-
- create_table "ci_builds_metadata", id: :serial, force: :cascade do |t|
- t.integer "build_id", null: false
- t.integer "project_id", null: false
- t.integer "timeout"
- t.integer "timeout_source", default: 1, null: false
- t.jsonb "config_options"
- t.jsonb "config_variables"
- t.index ["build_id"], name: "index_ci_builds_metadata_on_build_id", unique: true
- t.index ["project_id"], name: "index_ci_builds_metadata_on_project_id"
- end
-
- create_table "ci_builds_runner_session", force: :cascade do |t|
- t.integer "build_id", null: false
- t.string "url", null: false
- t.string "certificate"
- t.string "authorization"
- t.index ["build_id"], name: "index_ci_builds_runner_session_on_build_id", unique: true
- end
-
- create_table "ci_group_variables", id: :serial, force: :cascade do |t|
- t.string "key", null: false
- t.text "value"
- t.text "encrypted_value"
- t.string "encrypted_value_salt"
- t.string "encrypted_value_iv"
- t.integer "group_id", null: false
- t.boolean "protected", default: false, null: false
- t.datetime_with_timezone "created_at", null: false
- t.datetime_with_timezone "updated_at", null: false
- t.index ["group_id", "key"], name: "index_ci_group_variables_on_group_id_and_key", unique: true
- end
-
- create_table "ci_job_artifacts", id: :serial, force: :cascade do |t|
- t.integer "project_id", null: false
- t.integer "job_id", null: false
- t.integer "file_type", null: false
- t.bigint "size"
- t.datetime_with_timezone "created_at", null: false
- t.datetime_with_timezone "updated_at", null: false
- t.datetime_with_timezone "expire_at"
- t.string "file"
- t.integer "file_store"
- t.binary "file_sha256"
- t.integer "file_format", limit: 2
- t.integer "file_location", limit: 2
- t.index ["expire_at", "job_id"], name: "index_ci_job_artifacts_on_expire_at_and_job_id"
- t.index ["file_store"], name: "index_ci_job_artifacts_on_file_store"
- t.index ["job_id", "file_type"], name: "index_ci_job_artifacts_on_job_id_and_file_type", unique: true
- t.index ["project_id"], name: "index_ci_job_artifacts_on_project_id"
- end
-
- create_table "ci_pipeline_chat_data", force: :cascade do |t|
- t.integer "pipeline_id", null: false
- t.integer "chat_name_id", null: false
- t.text "response_url", null: false
- t.index ["chat_name_id"], name: "index_ci_pipeline_chat_data_on_chat_name_id"
- t.index ["pipeline_id"], name: "index_ci_pipeline_chat_data_on_pipeline_id", unique: true
- end
-
- create_table "ci_pipeline_schedule_variables", id: :serial, force: :cascade do |t|
- t.string "key", null: false
- t.text "value"
- t.text "encrypted_value"
- t.string "encrypted_value_salt"
- t.string "encrypted_value_iv"
- t.integer "pipeline_schedule_id", null: false
- t.datetime_with_timezone "created_at"
- t.datetime_with_timezone "updated_at"
- t.index ["pipeline_schedule_id", "key"], name: "index_ci_pipeline_schedule_variables_on_schedule_id_and_key", unique: true
- end
-
- create_table "ci_pipeline_schedules", id: :serial, force: :cascade do |t|
- t.string "description"
- t.string "ref"
- t.string "cron"
- t.string "cron_timezone"
- t.datetime "next_run_at"
- t.integer "project_id"
- t.integer "owner_id"
- t.boolean "active", default: true
- t.datetime "created_at"
- t.datetime "updated_at"
- t.index ["next_run_at", "active"], name: "index_ci_pipeline_schedules_on_next_run_at_and_active"
- t.index ["owner_id"], name: "index_ci_pipeline_schedules_on_owner_id"
- t.index ["project_id"], name: "index_ci_pipeline_schedules_on_project_id"
- end
-
- create_table "ci_pipeline_variables", id: :serial, force: :cascade do |t|
- t.string "key", null: false
- t.text "value"
- t.text "encrypted_value"
- t.string "encrypted_value_salt"
- t.string "encrypted_value_iv"
- t.integer "pipeline_id", null: false
- t.index ["pipeline_id", "key"], name: "index_ci_pipeline_variables_on_pipeline_id_and_key", unique: true
- end
-
- create_table "ci_pipelines", id: :serial, force: :cascade do |t|
- t.string "ref"
- t.string "sha"
- t.string "before_sha"
- t.datetime "created_at"
- t.datetime "updated_at"
- t.boolean "tag", default: false
- t.text "yaml_errors"
- t.datetime "committed_at"
- t.integer "project_id"
- t.string "status"
- t.datetime "started_at"
- t.datetime "finished_at"
- t.integer "duration"
- t.integer "user_id"
- t.integer "lock_version"
- t.integer "auto_canceled_by_id"
- t.integer "pipeline_schedule_id"
- t.integer "source"
- t.boolean "protected"
- t.integer "config_source"
- t.integer "failure_reason"
- t.integer "iid"
- t.integer "merge_request_id"
- t.index ["auto_canceled_by_id"], name: "index_ci_pipelines_on_auto_canceled_by_id"
- t.index ["merge_request_id"], name: "index_ci_pipelines_on_merge_request_id", where: "(merge_request_id IS NOT NULL)"
- t.index ["pipeline_schedule_id"], name: "index_ci_pipelines_on_pipeline_schedule_id"
- t.index ["project_id", "iid"], name: "index_ci_pipelines_on_project_id_and_iid", unique: true, where: "(iid IS NOT NULL)"
- t.index ["project_id", "ref", "id"], name: "index_ci_pipelines_on_project_idandrefandiddesc", order: { id: :desc }
- t.index ["project_id", "ref", "status", "id"], name: "index_ci_pipelines_on_project_id_and_ref_and_status_and_id"
- t.index ["project_id", "sha"], name: "index_ci_pipelines_on_project_id_and_sha"
- t.index ["project_id", "source"], name: "index_ci_pipelines_on_project_id_and_source"
- t.index ["project_id", "status", "config_source"], name: "index_ci_pipelines_on_project_id_and_status_and_config_source"
- t.index ["project_id"], name: "index_ci_pipelines_on_project_id"
- t.index ["status"], name: "index_ci_pipelines_on_status"
- t.index ["user_id"], name: "index_ci_pipelines_on_user_id"
- end
-
- create_table "ci_runner_namespaces", id: :serial, force: :cascade do |t|
- t.integer "runner_id"
- t.integer "namespace_id"
- t.index ["namespace_id"], name: "index_ci_runner_namespaces_on_namespace_id"
- t.index ["runner_id", "namespace_id"], name: "index_ci_runner_namespaces_on_runner_id_and_namespace_id", unique: true
- end
-
- create_table "ci_runner_projects", id: :serial, force: :cascade do |t|
- t.integer "runner_id", null: false
- t.datetime "created_at"
- t.datetime "updated_at"
- t.integer "project_id"
- t.index ["project_id"], name: "index_ci_runner_projects_on_project_id"
- t.index ["runner_id"], name: "index_ci_runner_projects_on_runner_id"
- end
-
- create_table "ci_runners", id: :serial, force: :cascade do |t|
- t.string "token"
- t.datetime "created_at"
- t.datetime "updated_at"
- t.string "description"
- t.datetime "contacted_at"
- t.boolean "active", default: true, null: false
- t.boolean "is_shared", default: false
- t.string "name"
- t.string "version"
- t.string "revision"
- t.string "platform"
- t.string "architecture"
- t.boolean "run_untagged", default: true, null: false
- t.boolean "locked", default: false, null: false
- t.integer "access_level", default: 0, null: false
- t.integer "maximum_timeout"
- t.string "ip_address"
- t.integer "runner_type", limit: 2, null: false
- t.string "token_encrypted"
- t.index ["contacted_at"], name: "index_ci_runners_on_contacted_at"
- t.index ["is_shared"], name: "index_ci_runners_on_is_shared"
- t.index ["locked"], name: "index_ci_runners_on_locked"
- t.index ["runner_type"], name: "index_ci_runners_on_runner_type"
- t.index ["token"], name: "index_ci_runners_on_token"
- end
-
- create_table "ci_stages", id: :serial, force: :cascade do |t|
- t.integer "project_id"
- t.integer "pipeline_id"
- t.datetime "created_at"
- t.datetime "updated_at"
- t.string "name"
- t.integer "status"
- t.integer "lock_version"
- t.integer "position"
- t.index ["pipeline_id", "name"], name: "index_ci_stages_on_pipeline_id_and_name", unique: true
- t.index ["pipeline_id", "position"], name: "index_ci_stages_on_pipeline_id_and_position"
- t.index ["pipeline_id"], name: "index_ci_stages_on_pipeline_id"
- t.index ["project_id"], name: "index_ci_stages_on_project_id"
- end
-
- create_table "ci_trigger_requests", id: :serial, force: :cascade do |t|
- t.integer "trigger_id", null: false
- t.text "variables"
- t.datetime "created_at"
- t.datetime "updated_at"
- t.integer "commit_id"
- t.index ["commit_id"], name: "index_ci_trigger_requests_on_commit_id"
- t.index ["trigger_id"], name: "index_ci_trigger_requests_on_trigger_id"
- end
-
- create_table "ci_triggers", id: :serial, force: :cascade do |t|
- t.string "token"
- t.datetime "created_at"
- t.datetime "updated_at"
- t.integer "project_id"
- t.integer "owner_id"
- t.string "description"
- t.string "ref"
- t.index ["owner_id"], name: "index_ci_triggers_on_owner_id"
- t.index ["project_id"], name: "index_ci_triggers_on_project_id"
- end
-
- create_table "ci_variables", id: :serial, force: :cascade do |t|
- t.string "key", null: false
- t.text "value"
- t.text "encrypted_value"
- t.string "encrypted_value_salt"
- t.string "encrypted_value_iv"
- t.integer "project_id", null: false
- t.boolean "protected", default: false, null: false
- t.string "environment_scope", default: "*", null: false
- t.index ["project_id", "key", "environment_scope"], name: "index_ci_variables_on_project_id_and_key_and_environment_scope", unique: true
- end
-
- create_table "cluster_groups", id: :serial, force: :cascade do |t|
- t.integer "cluster_id", null: false
- t.integer "group_id", null: false
- t.index ["cluster_id", "group_id"], name: "index_cluster_groups_on_cluster_id_and_group_id", unique: true
- t.index ["group_id"], name: "index_cluster_groups_on_group_id"
- end
-
- create_table "cluster_platforms_kubernetes", id: :serial, force: :cascade do |t|
- t.integer "cluster_id", null: false
- t.datetime_with_timezone "created_at", null: false
- t.datetime_with_timezone "updated_at", null: false
- t.text "api_url"
- t.text "ca_cert"
- t.string "namespace"
- t.string "username"
- t.text "encrypted_password"
- t.string "encrypted_password_iv"
- t.text "encrypted_token"
- t.string "encrypted_token_iv"
- t.integer "authorization_type", limit: 2
- t.index ["cluster_id"], name: "index_cluster_platforms_kubernetes_on_cluster_id", unique: true
- end
-
- create_table "cluster_projects", id: :serial, force: :cascade do |t|
- t.integer "project_id", null: false
- t.integer "cluster_id", null: false
- t.datetime_with_timezone "created_at", null: false
- t.datetime_with_timezone "updated_at", null: false
- t.index ["cluster_id"], name: "index_cluster_projects_on_cluster_id"
- t.index ["project_id"], name: "index_cluster_projects_on_project_id"
- end
-
- create_table "cluster_providers_gcp", id: :serial, force: :cascade do |t|
- t.integer "cluster_id", null: false
- t.integer "status"
- t.integer "num_nodes", null: false
- t.datetime_with_timezone "created_at", null: false
- t.datetime_with_timezone "updated_at", null: false
- t.text "status_reason"
- t.string "gcp_project_id", null: false
- t.string "zone", null: false
- t.string "machine_type"
- t.string "operation_id"
- t.string "endpoint"
- t.text "encrypted_access_token"
- t.string "encrypted_access_token_iv"
- t.boolean "legacy_abac", default: true, null: false
- t.index ["cluster_id"], name: "index_cluster_providers_gcp_on_cluster_id", unique: true
- end
-
- create_table "clusters", id: :serial, force: :cascade do |t|
- t.integer "user_id"
- t.integer "provider_type"
- t.integer "platform_type"
- t.datetime_with_timezone "created_at", null: false
- t.datetime_with_timezone "updated_at", null: false
- t.boolean "enabled", default: true
- t.string "name", null: false
- t.string "environment_scope", default: "*", null: false
- t.integer "cluster_type", limit: 2, default: 3, null: false
- t.index ["enabled"], name: "index_clusters_on_enabled"
- t.index ["user_id"], name: "index_clusters_on_user_id"
- end
-
- create_table "clusters_applications_cert_managers", id: :serial, force: :cascade do |t|
- t.integer "cluster_id", null: false
- t.integer "status", null: false
- t.string "version", null: false
- t.string "email", null: false
- t.datetime_with_timezone "created_at", null: false
- t.datetime_with_timezone "updated_at", null: false
- t.text "status_reason"
- t.index ["cluster_id"], name: "index_clusters_applications_cert_managers_on_cluster_id", unique: true
- end
-
- create_table "clusters_applications_helm", id: :serial, force: :cascade do |t|
- t.integer "cluster_id", null: false
- t.datetime_with_timezone "created_at", null: false
- t.datetime_with_timezone "updated_at", null: false
- t.integer "status", null: false
- t.string "version", null: false
- t.text "status_reason"
- t.text "encrypted_ca_key"
- t.text "encrypted_ca_key_iv"
- t.text "ca_cert"
- t.index ["cluster_id"], name: "index_clusters_applications_helm_on_cluster_id", unique: true
- end
-
- create_table "clusters_applications_ingress", id: :serial, force: :cascade do |t|
- t.integer "cluster_id", null: false
- t.datetime_with_timezone "created_at", null: false
- t.datetime_with_timezone "updated_at", null: false
- t.integer "status", null: false
- t.integer "ingress_type", null: false
- t.string "version", null: false
- t.string "cluster_ip"
- t.text "status_reason"
- t.string "external_ip"
- t.index ["cluster_id"], name: "index_clusters_applications_ingress_on_cluster_id", unique: true
- end
-
- create_table "clusters_applications_jupyter", id: :serial, force: :cascade do |t|
- t.integer "cluster_id", null: false
- t.integer "oauth_application_id"
- t.integer "status", null: false
- t.string "version", null: false
- t.string "hostname"
- t.datetime_with_timezone "created_at", null: false
- t.datetime_with_timezone "updated_at", null: false
- t.text "status_reason"
- t.index ["cluster_id"], name: "index_clusters_applications_jupyter_on_cluster_id", unique: true
- t.index ["oauth_application_id"], name: "index_clusters_applications_jupyter_on_oauth_application_id"
- end
-
- create_table "clusters_applications_knative", id: :serial, force: :cascade do |t|
- t.integer "cluster_id", null: false
- t.datetime_with_timezone "created_at", null: false
- t.datetime_with_timezone "updated_at", null: false
- t.integer "status", null: false
- t.string "version", null: false
- t.string "hostname"
- t.text "status_reason"
- t.string "external_ip"
- t.index ["cluster_id"], name: "index_clusters_applications_knative_on_cluster_id", unique: true
- end
-
- create_table "clusters_applications_prometheus", id: :serial, force: :cascade do |t|
- t.integer "cluster_id", null: false
- t.integer "status", null: false
- t.string "version", null: false
- t.text "status_reason"
- t.datetime_with_timezone "created_at", null: false
- t.datetime_with_timezone "updated_at", null: false
- t.index ["cluster_id"], name: "index_clusters_applications_prometheus_on_cluster_id", unique: true
- end
-
- create_table "clusters_applications_runners", id: :serial, force: :cascade do |t|
- t.integer "cluster_id", null: false
- t.integer "runner_id"
- t.integer "status", null: false
- t.datetime_with_timezone "created_at", null: false
- t.datetime_with_timezone "updated_at", null: false
- t.string "version", null: false
- t.text "status_reason"
- t.boolean "privileged", default: true, null: false
- t.index ["cluster_id"], name: "index_clusters_applications_runners_on_cluster_id", unique: true
- t.index ["runner_id"], name: "index_clusters_applications_runners_on_runner_id"
- end
-
- create_table "clusters_kubernetes_namespaces", force: :cascade do |t|
- t.integer "cluster_id", null: false
- t.integer "project_id"
- t.integer "cluster_project_id"
- t.datetime_with_timezone "created_at", null: false
- t.datetime_with_timezone "updated_at", null: false
- t.string "encrypted_service_account_token_iv"
- t.string "namespace", null: false
- t.string "service_account_name"
- t.text "encrypted_service_account_token"
- t.index ["cluster_id", "namespace"], name: "kubernetes_namespaces_cluster_and_namespace", unique: true
- t.index ["cluster_id"], name: "index_clusters_kubernetes_namespaces_on_cluster_id"
- t.index ["cluster_project_id"], name: "index_clusters_kubernetes_namespaces_on_cluster_project_id"
- t.index ["project_id"], name: "index_clusters_kubernetes_namespaces_on_project_id"
- end
-
- create_table "container_repositories", id: :serial, force: :cascade do |t|
- t.integer "project_id", null: false
- t.string "name", null: false
- t.datetime "created_at", null: false
- t.datetime "updated_at", null: false
- t.index ["project_id", "name"], name: "index_container_repositories_on_project_id_and_name", unique: true
- t.index ["project_id"], name: "index_container_repositories_on_project_id"
- end
-
- create_table "conversational_development_index_metrics", id: :serial, force: :cascade do |t|
- t.float "leader_issues", null: false
- t.float "instance_issues", null: false
- t.float "leader_notes", null: false
- t.float "instance_notes", null: false
- t.float "leader_milestones", null: false
- t.float "instance_milestones", null: false
- t.float "leader_boards", null: false
- t.float "instance_boards", null: false
- t.float "leader_merge_requests", null: false
- t.float "instance_merge_requests", null: false
- t.float "leader_ci_pipelines", null: false
- t.float "instance_ci_pipelines", null: false
- t.float "leader_environments", null: false
- t.float "instance_environments", null: false
- t.float "leader_deployments", null: false
- t.float "instance_deployments", null: false
- t.float "leader_projects_prometheus_active", null: false
- t.float "instance_projects_prometheus_active", null: false
- t.float "leader_service_desk_issues", null: false
- t.float "instance_service_desk_issues", null: false
- t.datetime "created_at", null: false
- t.datetime "updated_at", null: false
- t.float "percentage_boards", default: 0.0, null: false
- t.float "percentage_ci_pipelines", default: 0.0, null: false
- t.float "percentage_deployments", default: 0.0, null: false
- t.float "percentage_environments", default: 0.0, null: false
- t.float "percentage_issues", default: 0.0, null: false
- t.float "percentage_merge_requests", default: 0.0, null: false
- t.float "percentage_milestones", default: 0.0, null: false
- t.float "percentage_notes", default: 0.0, null: false
- t.float "percentage_projects_prometheus_active", default: 0.0, null: false
- t.float "percentage_service_desk_issues", default: 0.0, null: false
- end
-
- create_table "deploy_keys_projects", id: :serial, force: :cascade do |t|
- t.integer "deploy_key_id", null: false
- t.integer "project_id", null: false
- t.datetime "created_at"
- t.datetime "updated_at"
- t.boolean "can_push", default: false, null: false
- t.index ["project_id"], name: "index_deploy_keys_projects_on_project_id"
- end
-
- create_table "deploy_tokens", id: :serial, force: :cascade do |t|
- t.boolean "revoked", default: false
- t.boolean "read_repository", default: false, null: false
- t.boolean "read_registry", default: false, null: false
- t.datetime_with_timezone "expires_at", null: false
- t.datetime_with_timezone "created_at", null: false
- t.string "name", null: false
- t.string "token", null: false
- t.index ["token", "expires_at", "id"], name: "index_deploy_tokens_on_token_and_expires_at_and_id", where: "(revoked IS FALSE)"
- t.index ["token"], name: "index_deploy_tokens_on_token", unique: true
- end
-
- create_table "deployments", id: :serial, force: :cascade do |t|
- t.integer "iid", null: false
- t.integer "project_id", null: false
- t.integer "environment_id", null: false
- t.string "ref", null: false
- t.boolean "tag", null: false
- t.string "sha", null: false
- t.integer "user_id"
- t.integer "deployable_id"
- t.string "deployable_type"
- t.datetime "created_at"
- t.datetime "updated_at"
- t.string "on_stop"
- t.datetime_with_timezone "finished_at"
- t.integer "status", limit: 2, null: false
- t.index ["created_at"], name: "index_deployments_on_created_at"
- t.index ["deployable_type", "deployable_id"], name: "index_deployments_on_deployable_type_and_deployable_id"
- t.index ["environment_id", "id"], name: "index_deployments_on_environment_id_and_id"
- t.index ["environment_id", "iid", "project_id"], name: "index_deployments_on_environment_id_and_iid_and_project_id"
- t.index ["environment_id", "status"], name: "index_deployments_on_environment_id_and_status"
- t.index ["id"], name: "partial_index_deployments_for_legacy_successful_deployments", where: "((finished_at IS NULL) AND (status = 2))"
- t.index ["project_id", "iid"], name: "index_deployments_on_project_id_and_iid", unique: true
- t.index ["project_id", "status", "created_at"], name: "index_deployments_on_project_id_and_status_and_created_at"
- t.index ["project_id", "status"], name: "index_deployments_on_project_id_and_status"
- end
-
- create_table "emails", id: :serial, force: :cascade do |t|
- t.integer "user_id", null: false
- t.string "email", null: false
- t.datetime "created_at"
- t.datetime "updated_at"
- t.string "confirmation_token"
- t.datetime_with_timezone "confirmed_at"
- t.datetime_with_timezone "confirmation_sent_at"
- t.index ["confirmation_token"], name: "index_emails_on_confirmation_token", unique: true
- t.index ["email"], name: "index_emails_on_email", unique: true
- t.index ["user_id"], name: "index_emails_on_user_id"
- end
-
- create_table "environments", id: :serial, force: :cascade do |t|
- t.integer "project_id", null: false
- t.string "name", null: false
- t.datetime "created_at"
- t.datetime "updated_at"
- t.string "external_url"
- t.string "environment_type"
- t.string "state", default: "available", null: false
- t.string "slug", null: false
- t.index ["project_id", "name"], name: "index_environments_on_project_id_and_name", unique: true
- t.index ["project_id", "slug"], name: "index_environments_on_project_id_and_slug", unique: true
- end
-
- create_table "events", id: :serial, force: :cascade do |t|
- t.integer "project_id"
- t.integer "author_id", null: false
- t.integer "target_id"
- t.datetime_with_timezone "created_at", null: false
- t.datetime_with_timezone "updated_at", null: false
- t.integer "action", limit: 2, null: false
- t.string "target_type"
- t.index ["action"], name: "index_events_on_action"
- t.index ["author_id", "project_id"], name: "index_events_on_author_id_and_project_id"
- t.index ["project_id", "created_at"], name: "index_events_on_project_id_and_created_at"
- t.index ["project_id", "id"], name: "index_events_on_project_id_and_id"
- t.index ["target_type", "target_id"], name: "index_events_on_target_type_and_target_id"
- end
-
- create_table "feature_gates", id: :serial, force: :cascade do |t|
- t.string "feature_key", null: false
- t.string "key", null: false
- t.string "value"
- t.datetime "created_at", null: false
- t.datetime "updated_at", null: false
- t.index ["feature_key", "key", "value"], name: "index_feature_gates_on_feature_key_and_key_and_value", unique: true
- end
-
- create_table "features", id: :serial, force: :cascade do |t|
- t.string "key", null: false
- t.datetime "created_at", null: false
- t.datetime "updated_at", null: false
- t.index ["key"], name: "index_features_on_key", unique: true
- end
-
- create_table "fork_network_members", id: :serial, force: :cascade do |t|
- t.integer "fork_network_id", null: false
- t.integer "project_id", null: false
- t.integer "forked_from_project_id"
- t.index ["fork_network_id"], name: "index_fork_network_members_on_fork_network_id"
- t.index ["forked_from_project_id"], name: "index_fork_network_members_on_forked_from_project_id"
- t.index ["project_id"], name: "index_fork_network_members_on_project_id", unique: true
- end
-
- create_table "fork_networks", id: :serial, force: :cascade do |t|
- t.integer "root_project_id"
- t.string "deleted_root_project_name"
- t.index ["root_project_id"], name: "index_fork_networks_on_root_project_id", unique: true
- end
-
- create_table "forked_project_links", id: :serial, force: :cascade do |t|
- t.integer "forked_to_project_id", null: false
- t.integer "forked_from_project_id", null: false
- t.datetime "created_at"
- t.datetime "updated_at"
- t.index ["forked_to_project_id"], name: "index_forked_project_links_on_forked_to_project_id", unique: true
- end
-
- create_table "gpg_key_subkeys", id: :serial, force: :cascade do |t|
- t.integer "gpg_key_id", null: false
- t.binary "keyid"
- t.binary "fingerprint"
- t.index ["fingerprint"], name: "index_gpg_key_subkeys_on_fingerprint", unique: true
- t.index ["gpg_key_id"], name: "index_gpg_key_subkeys_on_gpg_key_id"
- t.index ["keyid"], name: "index_gpg_key_subkeys_on_keyid", unique: true
- end
-
- create_table "gpg_keys", id: :serial, force: :cascade do |t|
- t.datetime_with_timezone "created_at", null: false
- t.datetime_with_timezone "updated_at", null: false
- t.integer "user_id"
- t.binary "primary_keyid"
- t.binary "fingerprint"
- t.text "key"
- t.index ["fingerprint"], name: "index_gpg_keys_on_fingerprint", unique: true
- t.index ["primary_keyid"], name: "index_gpg_keys_on_primary_keyid", unique: true
- t.index ["user_id"], name: "index_gpg_keys_on_user_id"
- end
-
- create_table "gpg_signatures", id: :serial, force: :cascade do |t|
- t.datetime_with_timezone "created_at", null: false
- t.datetime_with_timezone "updated_at", null: false
- t.integer "project_id"
- t.integer "gpg_key_id"
- t.binary "commit_sha"
- t.binary "gpg_key_primary_keyid"
- t.text "gpg_key_user_name"
- t.text "gpg_key_user_email"
- t.integer "verification_status", limit: 2, default: 0, null: false
- t.integer "gpg_key_subkey_id"
- t.index ["commit_sha"], name: "index_gpg_signatures_on_commit_sha", unique: true
- t.index ["gpg_key_id"], name: "index_gpg_signatures_on_gpg_key_id"
- t.index ["gpg_key_primary_keyid"], name: "index_gpg_signatures_on_gpg_key_primary_keyid"
- t.index ["gpg_key_subkey_id"], name: "index_gpg_signatures_on_gpg_key_subkey_id"
- t.index ["project_id"], name: "index_gpg_signatures_on_project_id"
- end
-
- create_table "group_custom_attributes", id: :serial, force: :cascade do |t|
- t.datetime_with_timezone "created_at", null: false
- t.datetime_with_timezone "updated_at", null: false
- t.integer "group_id", null: false
- t.string "key", null: false
- t.string "value", null: false
- t.index ["group_id", "key"], name: "index_group_custom_attributes_on_group_id_and_key", unique: true
- t.index ["key", "value"], name: "index_group_custom_attributes_on_key_and_value"
- end
-
- create_table "group_group_links", force: :cascade do |t|
- t.datetime_with_timezone "created_at", null: false
- t.datetime_with_timezone "updated_at", null: false
- t.bigint "shared_group_id", null: false
- t.bigint "shared_with_group_id", null: false
- t.date "expires_at"
- t.integer "group_access", limit: 2, default: 30, null: false
- t.index ["shared_group_id", "shared_with_group_id"], name: "index_group_group_links_on_shared_group_and_shared_with_group", unique: true
- t.index ["shared_with_group_id"], name: "index_group_group_links_on_shared_with_group_id"
- end
-
- create_table "identities", id: :serial, force: :cascade do |t|
- t.string "extern_uid"
- t.string "provider"
- t.integer "user_id"
- t.datetime "created_at"
- t.datetime "updated_at"
- t.index ["user_id"], name: "index_identities_on_user_id"
- end
-
- create_table "import_export_uploads", id: :serial, force: :cascade do |t|
- t.datetime_with_timezone "updated_at", null: false
- t.integer "project_id"
- t.text "import_file"
- t.text "export_file"
- t.index ["project_id"], name: "index_import_export_uploads_on_project_id"
- t.index ["updated_at"], name: "index_import_export_uploads_on_updated_at"
- end
-
- create_table "internal_ids", force: :cascade do |t|
- t.integer "project_id"
- t.integer "usage", null: false
- t.integer "last_value", null: false
- t.integer "namespace_id"
- t.index ["namespace_id"], name: "index_internal_ids_on_namespace_id"
- t.index ["project_id"], name: "index_internal_ids_on_project_id"
- t.index ["usage", "namespace_id"], name: "index_internal_ids_on_usage_and_namespace_id", unique: true, where: "(namespace_id IS NOT NULL)"
- t.index ["usage", "project_id"], name: "index_internal_ids_on_usage_and_project_id", unique: true, where: "(project_id IS NOT NULL)"
- end
-
- create_table "issue_assignees", id: false, force: :cascade do |t|
- t.integer "user_id", null: false
- t.integer "issue_id", null: false
- t.index ["issue_id", "user_id"], name: "index_issue_assignees_on_issue_id_and_user_id", unique: true
- t.index ["user_id"], name: "index_issue_assignees_on_user_id"
- end
-
- create_table "issue_metrics", id: :serial, force: :cascade do |t|
- t.integer "issue_id", null: false
- t.datetime "first_mentioned_in_commit_at"
- t.datetime "first_associated_with_milestone_at"
- t.datetime "first_added_to_board_at"
- t.datetime "created_at", null: false
- t.datetime "updated_at", null: false
- t.index ["issue_id"], name: "index_issue_metrics"
- end
-
- create_table "issues", id: :serial, force: :cascade do |t|
- t.string "title"
- t.integer "author_id"
- t.integer "project_id"
- t.datetime "created_at"
- t.datetime "updated_at"
- t.text "description"
- t.integer "milestone_id"
- t.string "state"
- t.integer "iid"
- t.integer "updated_by_id"
- t.boolean "confidential", default: false, null: false
- t.date "due_date"
- t.integer "moved_to_id"
- t.integer "lock_version"
- t.text "title_html"
- t.text "description_html"
- t.integer "time_estimate"
- t.integer "relative_position"
- t.integer "cached_markdown_version"
- t.datetime "last_edited_at"
- t.integer "last_edited_by_id"
- t.boolean "discussion_locked"
- t.datetime_with_timezone "closed_at"
- t.integer "closed_by_id"
- t.index ["author_id"], name: "index_issues_on_author_id"
- t.index ["closed_by_id"], name: "index_issues_on_closed_by_id"
- t.index ["confidential"], name: "index_issues_on_confidential"
- t.index ["description"], name: "index_issues_on_description_trigram", opclass: :gin_trgm_ops, using: :gin
- t.index ["milestone_id"], name: "index_issues_on_milestone_id"
- t.index ["moved_to_id"], name: "index_issues_on_moved_to_id", where: "(moved_to_id IS NOT NULL)"
- t.index ["project_id", "created_at", "id", "state"], name: "index_issues_on_project_id_and_created_at_and_id_and_state"
- t.index ["project_id", "due_date", "id", "state"], name: "idx_issues_on_project_id_and_due_date_and_id_and_state_partial", where: "(due_date IS NOT NULL)"
- t.index ["project_id", "iid"], name: "index_issues_on_project_id_and_iid", unique: true
- t.index ["project_id", "updated_at", "id", "state"], name: "index_issues_on_project_id_and_updated_at_and_id_and_state"
- t.index ["relative_position"], name: "index_issues_on_relative_position"
- t.index ["state"], name: "index_issues_on_state"
- t.index ["title"], name: "index_issues_on_title_trigram", opclass: :gin_trgm_ops, using: :gin
- t.index ["updated_at"], name: "index_issues_on_updated_at"
- t.index ["updated_by_id"], name: "index_issues_on_updated_by_id", where: "(updated_by_id IS NOT NULL)"
- end
-
- create_table "keys", id: :serial, force: :cascade do |t|
- t.integer "user_id"
- t.datetime "created_at"
- t.datetime "updated_at"
- t.text "key"
- t.string "title"
- t.string "type"
- t.string "fingerprint"
- t.boolean "public", default: false, null: false
- t.datetime "last_used_at"
- t.index ["fingerprint"], name: "index_keys_on_fingerprint", unique: true
- t.index ["user_id"], name: "index_keys_on_user_id"
- end
-
- create_table "label_links", id: :serial, force: :cascade do |t|
- t.integer "label_id"
- t.integer "target_id"
- t.string "target_type"
- t.datetime "created_at"
- t.datetime "updated_at"
- t.index ["label_id"], name: "index_label_links_on_label_id"
- t.index ["target_id", "target_type"], name: "index_label_links_on_target_id_and_target_type"
- end
-
- create_table "label_priorities", id: :serial, force: :cascade do |t|
- t.integer "project_id", null: false
- t.integer "label_id", null: false
- t.integer "priority", null: false
- t.datetime "created_at", null: false
- t.datetime "updated_at", null: false
- t.index ["label_id"], name: "index_label_priorities_on_label_id"
- t.index ["priority"], name: "index_label_priorities_on_priority"
- t.index ["project_id", "label_id"], name: "index_label_priorities_on_project_id_and_label_id", unique: true
- end
-
- create_table "labels", id: :serial, force: :cascade do |t|
- t.string "title"
- t.string "color"
- t.integer "project_id"
- t.datetime "created_at"
- t.datetime "updated_at"
- t.boolean "template", default: false
- t.string "description"
- t.text "description_html"
- t.string "type"
- t.integer "group_id"
- t.integer "cached_markdown_version"
- t.index ["group_id", "project_id", "title"], name: "index_labels_on_group_id_and_project_id_and_title", unique: true
- t.index ["project_id"], name: "index_labels_on_project_id"
- t.index ["template"], name: "index_labels_on_template", where: "template"
- t.index ["title"], name: "index_labels_on_title"
- t.index ["type", "project_id"], name: "index_labels_on_type_and_project_id"
- end
-
- create_table "lfs_file_locks", id: :serial, force: :cascade do |t|
- t.integer "project_id", null: false
- t.integer "user_id", null: false
- t.datetime "created_at", null: false
- t.string "path", limit: 511
- t.index ["project_id", "path"], name: "index_lfs_file_locks_on_project_id_and_path", unique: true
- t.index ["user_id"], name: "index_lfs_file_locks_on_user_id"
- end
-
- create_table "lfs_objects", id: :serial, force: :cascade do |t|
- t.string "oid", null: false
- t.bigint "size", null: false
- t.datetime "created_at"
- t.datetime "updated_at"
- t.string "file"
- t.integer "file_store"
- t.index ["file_store"], name: "index_lfs_objects_on_file_store"
- t.index ["oid"], name: "index_lfs_objects_on_oid", unique: true
- end
-
- create_table "lfs_objects_projects", id: :serial, force: :cascade do |t|
- t.integer "lfs_object_id", null: false
- t.integer "project_id", null: false
- t.datetime "created_at"
- t.datetime "updated_at"
- t.index ["project_id"], name: "index_lfs_objects_projects_on_project_id"
- end
-
- create_table "lists", id: :serial, force: :cascade do |t|
- t.integer "board_id", null: false
- t.integer "label_id"
- t.integer "list_type", default: 1, null: false
- t.integer "position"
- t.datetime "created_at", null: false
- t.datetime "updated_at", null: false
- t.index ["board_id", "label_id"], name: "index_lists_on_board_id_and_label_id", unique: true
- t.index ["label_id"], name: "index_lists_on_label_id"
- t.index ["list_type"], name: "index_lists_on_list_type"
- end
-
- create_table "members", id: :serial, force: :cascade do |t|
- t.integer "access_level", null: false
- t.integer "source_id", null: false
- t.string "source_type", null: false
- t.integer "user_id"
- t.integer "notification_level", null: false
- t.string "type"
- t.datetime "created_at"
- t.datetime "updated_at"
- t.integer "created_by_id"
- t.string "invite_email"
- t.string "invite_token"
- t.datetime "invite_accepted_at"
- t.datetime "requested_at"
- t.date "expires_at"
- t.index ["access_level"], name: "index_members_on_access_level"
- t.index ["invite_token"], name: "index_members_on_invite_token", unique: true
- t.index ["requested_at"], name: "index_members_on_requested_at"
- t.index ["source_id", "source_type"], name: "index_members_on_source_id_and_source_type"
- t.index ["user_id"], name: "index_members_on_user_id"
- end
-
- create_table "merge_request_diff_commits", id: false, force: :cascade do |t|
- t.datetime_with_timezone "authored_date"
- t.datetime_with_timezone "committed_date"
- t.integer "merge_request_diff_id", null: false
- t.integer "relative_order", null: false
- t.binary "sha", null: false
- t.text "author_name"
- t.text "author_email"
- t.text "committer_name"
- t.text "committer_email"
- t.text "message"
- t.index ["merge_request_diff_id", "relative_order"], name: "index_merge_request_diff_commits_on_mr_diff_id_and_order", unique: true
- t.index ["sha"], name: "index_merge_request_diff_commits_on_sha"
- end
-
- create_table "merge_request_diff_files", id: false, force: :cascade do |t|
- t.integer "merge_request_diff_id", null: false
- t.integer "relative_order", null: false
- t.boolean "new_file", null: false
- t.boolean "renamed_file", null: false
- t.boolean "deleted_file", null: false
- t.boolean "too_large", null: false
- t.string "a_mode", null: false
- t.string "b_mode", null: false
- t.text "new_path", null: false
- t.text "old_path", null: false
- t.text "diff", null: false
- t.boolean "binary"
- t.index ["merge_request_diff_id", "relative_order"], name: "index_merge_request_diff_files_on_mr_diff_id_and_order", unique: true
- end
-
- create_table "merge_request_diffs", id: :serial, force: :cascade do |t|
- t.string "state"
- t.integer "merge_request_id", null: false
- t.datetime "created_at"
- t.datetime "updated_at"
- t.string "base_commit_sha"
- t.string "real_size"
- t.string "head_commit_sha"
- t.string "start_commit_sha"
- t.integer "commits_count"
- t.index ["merge_request_id", "id"], name: "index_merge_request_diffs_on_merge_request_id_and_id"
- end
-
- create_table "merge_request_metrics", id: :serial, force: :cascade do |t|
- t.integer "merge_request_id", null: false
- t.datetime "latest_build_started_at"
- t.datetime "latest_build_finished_at"
- t.datetime "first_deployed_to_production_at"
- t.datetime "merged_at"
- t.datetime "created_at", null: false
- t.datetime "updated_at", null: false
- t.integer "pipeline_id"
- t.integer "merged_by_id"
- t.integer "latest_closed_by_id"
- t.datetime_with_timezone "latest_closed_at"
- t.index ["first_deployed_to_production_at"], name: "index_merge_request_metrics_on_first_deployed_to_production_at"
- t.index ["latest_closed_by_id"], name: "index_merge_request_metrics_on_latest_closed_by_id"
- t.index ["merge_request_id"], name: "index_merge_request_metrics"
- t.index ["merged_by_id"], name: "index_merge_request_metrics_on_merged_by_id"
- t.index ["pipeline_id"], name: "index_merge_request_metrics_on_pipeline_id"
- end
-
- create_table "merge_requests", id: :serial, force: :cascade do |t|
- t.string "target_branch", null: false
- t.string "source_branch", null: false
- t.integer "source_project_id"
- t.integer "author_id"
- t.integer "assignee_id"
- t.string "title"
- t.datetime "created_at"
- t.datetime "updated_at"
- t.integer "milestone_id"
- t.string "state", default: "opened", null: false
- t.string "merge_status", default: "unchecked", null: false
- t.integer "target_project_id", null: false
- t.integer "iid"
- t.text "description"
- t.integer "updated_by_id"
- t.text "merge_error"
- t.text "merge_params"
- t.boolean "merge_when_pipeline_succeeds", default: false, null: false
- t.integer "merge_user_id"
- t.string "merge_commit_sha"
- t.string "rebase_commit_sha"
- t.string "in_progress_merge_commit_sha"
- t.integer "lock_version"
- t.text "title_html"
- t.text "description_html"
- t.integer "time_estimate"
- t.integer "cached_markdown_version"
- t.datetime "last_edited_at"
- t.integer "last_edited_by_id"
- t.integer "head_pipeline_id"
- t.string "merge_jid"
- t.boolean "discussion_locked"
- t.integer "latest_merge_request_diff_id"
- t.boolean "allow_maintainer_to_push"
- t.boolean "squash", default: false, null: false
- t.index ["assignee_id"], name: "index_merge_requests_on_assignee_id"
- t.index ["author_id"], name: "index_merge_requests_on_author_id"
- t.index ["created_at"], name: "index_merge_requests_on_created_at"
- t.index ["description"], name: "index_merge_requests_on_description_trigram", opclass: :gin_trgm_ops, using: :gin
- t.index ["head_pipeline_id"], name: "index_merge_requests_on_head_pipeline_id"
- t.index ["id", "merge_jid"], name: "index_merge_requests_on_id_and_merge_jid", where: "((merge_jid IS NOT NULL) AND ((state)::text = 'locked'::text))"
- t.index ["latest_merge_request_diff_id"], name: "index_merge_requests_on_latest_merge_request_diff_id"
- t.index ["merge_user_id"], name: "index_merge_requests_on_merge_user_id", where: "(merge_user_id IS NOT NULL)"
- t.index ["milestone_id"], name: "index_merge_requests_on_milestone_id"
- t.index ["source_branch"], name: "index_merge_requests_on_source_branch"
- t.index ["source_project_id", "source_branch"], name: "index_merge_requests_on_source_project_and_branch_state_opened", where: "((state)::text = 'opened'::text)"
- t.index ["source_project_id", "source_branch"], name: "index_merge_requests_on_source_project_id_and_source_branch"
- t.index ["target_branch"], name: "index_merge_requests_on_target_branch"
- t.index ["target_project_id", "iid"], name: "index_merge_requests_on_target_project_id_and_iid", unique: true
- t.index ["target_project_id", "iid"], name: "index_merge_requests_on_target_project_id_and_iid_opened", where: "((state)::text = 'opened'::text)"
- t.index ["target_project_id", "merge_commit_sha", "id"], name: "index_merge_requests_on_tp_id_and_merge_commit_sha_and_id"
- t.index ["title"], name: "index_merge_requests_on_title"
- t.index ["title"], name: "index_merge_requests_on_title_trigram", opclass: :gin_trgm_ops, using: :gin
- t.index ["updated_by_id"], name: "index_merge_requests_on_updated_by_id", where: "(updated_by_id IS NOT NULL)"
- end
-
- create_table "merge_requests_closing_issues", id: :serial, force: :cascade do |t|
- t.integer "merge_request_id", null: false
- t.integer "issue_id", null: false
- t.datetime "created_at", null: false
- t.datetime "updated_at", null: false
- t.index ["issue_id"], name: "index_merge_requests_closing_issues_on_issue_id"
- t.index ["merge_request_id"], name: "index_merge_requests_closing_issues_on_merge_request_id"
- end
-
- create_table "milestones", id: :serial, force: :cascade do |t|
- t.string "title", null: false
- t.integer "project_id"
- t.text "description"
- t.date "due_date"
- t.datetime "created_at"
- t.datetime "updated_at"
- t.string "state"
- t.integer "iid"
- t.text "title_html"
- t.text "description_html"
- t.date "start_date"
- t.integer "cached_markdown_version"
- t.integer "group_id"
- t.index ["description"], name: "index_milestones_on_description_trigram", opclass: :gin_trgm_ops, using: :gin
- t.index ["due_date"], name: "index_milestones_on_due_date"
- t.index ["group_id"], name: "index_milestones_on_group_id"
- t.index ["project_id", "iid"], name: "index_milestones_on_project_id_and_iid", unique: true
- t.index ["title"], name: "index_milestones_on_title"
- t.index ["title"], name: "index_milestones_on_title_trigram", opclass: :gin_trgm_ops, using: :gin
- end
-
- create_table "namespaces", id: :serial, force: :cascade do |t|
- t.string "name", null: false
- t.string "path", null: false
- t.integer "owner_id"
- t.datetime "created_at"
- t.datetime "updated_at"
- t.string "type"
- t.string "description", default: "", null: false
- t.string "avatar"
- t.boolean "share_with_group_lock", default: false
- t.integer "visibility_level", default: 20, null: false
- t.boolean "request_access_enabled", default: false, null: false
- t.text "description_html"
- t.boolean "lfs_enabled"
- t.integer "parent_id"
- t.boolean "require_two_factor_authentication", default: false, null: false
- t.integer "two_factor_grace_period", default: 48, null: false
- t.integer "cached_markdown_version"
- t.string "runners_token"
- t.integer "project_creation_level"
- t.string "runners_token_encrypted"
- t.index ["created_at"], name: "index_namespaces_on_created_at"
- t.index ["name", "parent_id"], name: "index_namespaces_on_name_and_parent_id", unique: true
- t.index ["name"], name: "index_namespaces_on_name_trigram", opclass: :gin_trgm_ops, using: :gin
- t.index ["owner_id"], name: "index_namespaces_on_owner_id"
- t.index ["parent_id", "id"], name: "index_namespaces_on_parent_id_and_id", unique: true
- t.index ["path"], name: "index_namespaces_on_path"
- t.index ["path"], name: "index_namespaces_on_path_trigram", opclass: :gin_trgm_ops, using: :gin
- t.index ["require_two_factor_authentication"], name: "index_namespaces_on_require_two_factor_authentication"
- t.index ["runners_token"], name: "index_namespaces_on_runners_token", unique: true
- t.index ["type"], name: "index_namespaces_on_type"
- end
-
- create_table "note_diff_files", id: :serial, force: :cascade do |t|
- t.integer "diff_note_id", null: false
- t.text "diff", null: false
- t.boolean "new_file", null: false
- t.boolean "renamed_file", null: false
- t.boolean "deleted_file", null: false
- t.string "a_mode", null: false
- t.string "b_mode", null: false
- t.text "new_path", null: false
- t.text "old_path", null: false
- t.index ["diff_note_id"], name: "index_note_diff_files_on_diff_note_id", unique: true
- end
-
- create_table "notes", id: :serial, force: :cascade do |t|
- t.text "note"
- t.string "noteable_type"
- t.integer "author_id"
- t.datetime "created_at"
- t.datetime "updated_at"
- t.integer "project_id"
- t.string "attachment"
- t.string "line_code"
- t.string "commit_id"
- t.integer "noteable_id"
- t.boolean "system", default: false, null: false
- t.text "st_diff"
- t.integer "updated_by_id"
- t.string "type"
- t.text "position"
- t.text "original_position"
- t.datetime "resolved_at"
- t.integer "resolved_by_id"
- t.string "discussion_id"
- t.text "note_html"
- t.integer "cached_markdown_version"
- t.text "change_position"
- t.boolean "resolved_by_push"
- t.index ["author_id"], name: "index_notes_on_author_id"
- t.index ["commit_id"], name: "index_notes_on_commit_id"
- t.index ["created_at"], name: "index_notes_on_created_at"
- t.index ["discussion_id"], name: "index_notes_on_discussion_id"
- t.index ["line_code"], name: "index_notes_on_line_code"
- t.index ["note"], name: "index_notes_on_note_trigram", opclass: :gin_trgm_ops, using: :gin
- t.index ["noteable_id", "noteable_type"], name: "index_notes_on_noteable_id_and_noteable_type"
- t.index ["noteable_type"], name: "index_notes_on_noteable_type"
- t.index ["project_id", "noteable_type"], name: "index_notes_on_project_id_and_noteable_type"
- end
-
- create_table "notification_settings", id: :serial, force: :cascade do |t|
- t.integer "user_id", null: false
- t.string "source_type"
- t.integer "source_id"
- t.integer "level", default: 0, null: false
- t.datetime "created_at", null: false
- t.datetime "updated_at", null: false
- t.boolean "new_note"
- t.boolean "new_issue"
- t.boolean "reopen_issue"
- t.boolean "close_issue"
- t.boolean "reassign_issue"
- t.boolean "new_merge_request"
- t.boolean "reopen_merge_request"
- t.boolean "close_merge_request"
- t.boolean "reassign_merge_request"
- t.boolean "merge_merge_request"
- t.boolean "failed_pipeline"
- t.boolean "success_pipeline"
- t.boolean "push_to_merge_request"
- t.boolean "issue_due"
- t.index ["source_id", "source_type"], name: "index_notification_settings_on_source_id_and_source_type"
- t.index ["user_id", "source_id", "source_type"], name: "index_notifications_on_user_id_and_source_id_and_source_type", unique: true
- t.index ["user_id"], name: "index_notification_settings_on_user_id"
- end
-
- create_table "oauth_access_grants", id: :serial, force: :cascade do |t|
- t.integer "resource_owner_id", null: false
- t.integer "application_id", null: false
- t.string "token", null: false
- t.integer "expires_in", null: false
- t.text "redirect_uri", null: false
- t.datetime "created_at", null: false
- t.datetime "revoked_at"
- t.string "scopes"
- t.index ["token"], name: "index_oauth_access_grants_on_token", unique: true
- end
-
- create_table "oauth_access_tokens", id: :serial, force: :cascade do |t|
- t.integer "resource_owner_id"
- t.integer "application_id"
- t.string "token", null: false
- t.string "refresh_token"
- t.integer "expires_in"
- t.datetime "revoked_at"
- t.datetime "created_at", null: false
- t.string "scopes"
- t.index ["refresh_token"], name: "index_oauth_access_tokens_on_refresh_token", unique: true
- t.index ["resource_owner_id"], name: "index_oauth_access_tokens_on_resource_owner_id"
- t.index ["token"], name: "index_oauth_access_tokens_on_token", unique: true
- end
-
- create_table "oauth_applications", id: :serial, force: :cascade do |t|
- t.string "name", null: false
- t.string "uid", null: false
- t.string "secret", null: false
- t.text "redirect_uri", null: false
- t.string "scopes", default: "", null: false
- t.datetime "created_at"
- t.datetime "updated_at"
- t.integer "owner_id"
- t.string "owner_type"
- t.boolean "trusted", default: false, null: false
- t.index ["owner_id", "owner_type"], name: "index_oauth_applications_on_owner_id_and_owner_type"
- t.index ["uid"], name: "index_oauth_applications_on_uid", unique: true
- end
-
- create_table "oauth_openid_requests", id: :serial, force: :cascade do |t|
- t.integer "access_grant_id", null: false
- t.string "nonce", null: false
- t.index ["access_grant_id"], name: "index_oauth_openid_requests_on_access_grant_id"
- end
-
- create_table "pages_domains", id: :serial, force: :cascade do |t|
- t.integer "project_id"
- t.text "certificate"
- t.text "encrypted_key"
- t.string "encrypted_key_iv"
- t.string "encrypted_key_salt"
- t.string "domain"
- t.datetime_with_timezone "verified_at"
- t.string "verification_code", null: false
- t.datetime_with_timezone "enabled_until"
- t.index ["domain"], name: "index_pages_domains_on_domain", unique: true
- t.index ["project_id", "enabled_until"], name: "index_pages_domains_on_project_id_and_enabled_until"
- t.index ["project_id"], name: "index_pages_domains_on_project_id"
- t.index ["verified_at", "enabled_until"], name: "index_pages_domains_on_verified_at_and_enabled_until"
- t.index ["verified_at"], name: "index_pages_domains_on_verified_at"
- end
-
- create_table "personal_access_tokens", id: :serial, force: :cascade do |t|
- t.integer "user_id", null: false
- t.string "name", null: false
- t.boolean "revoked", default: false
- t.date "expires_at"
- t.datetime "created_at", null: false
- t.datetime "updated_at", null: false
- t.string "scopes", default: "--- []\n", null: false
- t.boolean "impersonation", default: false, null: false
- t.string "token_digest"
- t.index ["token_digest"], name: "index_personal_access_tokens_on_token_digest", unique: true
- t.index ["user_id"], name: "index_personal_access_tokens_on_user_id"
- end
-
- create_table "pool_repositories", force: :cascade do |t|
- t.integer "shard_id", null: false
- t.string "disk_path"
- t.string "state"
- t.integer "source_project_id"
- t.index ["disk_path"], name: "index_pool_repositories_on_disk_path", unique: true
- t.index ["shard_id"], name: "index_pool_repositories_on_shard_id"
- t.index ["source_project_id"], name: "index_pool_repositories_on_source_project_id", unique: true
- end
-
- create_table "programming_languages", id: :serial, force: :cascade do |t|
- t.string "name", null: false
- t.string "color", null: false
- t.datetime_with_timezone "created_at", null: false
- t.index ["name"], name: "index_programming_languages_on_name", unique: true
- end
-
- create_table "project_authorizations", id: false, force: :cascade do |t|
- t.integer "user_id", null: false
- t.integer "project_id", null: false
- t.integer "access_level", null: false
- t.index ["project_id"], name: "index_project_authorizations_on_project_id"
- t.index ["user_id", "project_id", "access_level"], name: "index_project_authorizations_on_user_id_project_id_access_level", unique: true
- end
-
- create_table "project_auto_devops", id: :serial, force: :cascade do |t|
- t.integer "project_id", null: false
- t.datetime_with_timezone "created_at", null: false
- t.datetime_with_timezone "updated_at", null: false
- t.boolean "enabled"
- t.string "domain"
- t.integer "deploy_strategy", default: 0, null: false
- t.index ["project_id"], name: "index_project_auto_devops_on_project_id", unique: true
- end
-
- create_table "project_ci_cd_settings", id: :serial, force: :cascade do |t|
- t.integer "project_id", null: false
- t.boolean "group_runners_enabled", default: true, null: false
- t.index ["project_id"], name: "index_project_ci_cd_settings_on_project_id", unique: true
- end
-
- create_table "project_custom_attributes", id: :serial, force: :cascade do |t|
- t.datetime_with_timezone "created_at", null: false
- t.datetime_with_timezone "updated_at", null: false
- t.integer "project_id", null: false
- t.string "key", null: false
- t.string "value", null: false
- t.index ["key", "value"], name: "index_project_custom_attributes_on_key_and_value"
- t.index ["project_id", "key"], name: "index_project_custom_attributes_on_project_id_and_key", unique: true
- end
-
- create_table "project_daily_statistics", force: :cascade do |t|
- t.integer "project_id", null: false
- t.integer "fetch_count", null: false
- t.date "date"
- t.index ["project_id", "date"], name: "index_project_daily_statistics_on_project_id_and_date", unique: true, order: { date: :desc }
- end
-
- create_table "project_deploy_tokens", id: :serial, force: :cascade do |t|
- t.integer "project_id", null: false
- t.integer "deploy_token_id", null: false
- t.datetime_with_timezone "created_at", null: false
- t.index ["deploy_token_id"], name: "index_project_deploy_tokens_on_deploy_token_id"
- t.index ["project_id", "deploy_token_id"], name: "index_project_deploy_tokens_on_project_id_and_deploy_token_id", unique: true
- end
-
- create_table "project_error_tracking_settings", primary_key: "project_id", id: :integer, default: nil, force: :cascade do |t|
- t.boolean "enabled", default: true, null: false
- t.string "api_url", null: false
- t.string "encrypted_token"
- t.string "encrypted_token_iv"
- end
-
- create_table "project_features", id: :serial, force: :cascade do |t|
- t.integer "project_id", null: false
- t.integer "merge_requests_access_level"
- t.integer "issues_access_level"
- t.integer "wiki_access_level"
- t.integer "snippets_access_level", default: 20, null: false
- t.integer "builds_access_level"
- t.datetime "created_at"
- t.datetime "updated_at"
- t.integer "repository_access_level", default: 20, null: false
- t.integer "pages_access_level", default: 20, null: false
- t.index ["project_id"], name: "index_project_features_on_project_id", unique: true
- end
-
- create_table "project_group_links", id: :serial, force: :cascade do |t|
- t.integer "project_id", null: false
- t.integer "group_id", null: false
- t.datetime "created_at"
- t.datetime "updated_at"
- t.integer "group_access", default: 30, null: false
- t.date "expires_at"
- t.index ["group_id"], name: "index_project_group_links_on_group_id"
- t.index ["project_id"], name: "index_project_group_links_on_project_id"
- end
-
- create_table "project_import_data", id: :serial, force: :cascade do |t|
- t.integer "project_id"
- t.text "data"
- t.text "encrypted_credentials"
- t.string "encrypted_credentials_iv"
- t.string "encrypted_credentials_salt"
- t.index ["project_id"], name: "index_project_import_data_on_project_id"
- end
-
- create_table "project_mirror_data", id: :serial, force: :cascade do |t|
- t.integer "project_id", null: false
- t.string "status"
- t.string "jid"
- t.text "last_error"
- t.index ["jid"], name: "index_project_mirror_data_on_jid"
- t.index ["project_id"], name: "index_project_mirror_data_on_project_id", unique: true
- t.index ["status"], name: "index_project_mirror_data_on_status"
- end
-
- create_table "project_repositories", force: :cascade do |t|
- t.integer "shard_id", null: false
- t.string "disk_path", null: false
- t.integer "project_id", null: false
- t.index ["disk_path"], name: "index_project_repositories_on_disk_path", unique: true
- t.index ["project_id"], name: "index_project_repositories_on_project_id", unique: true
- t.index ["shard_id"], name: "index_project_repositories_on_shard_id"
- end
-
- create_table "project_statistics", id: :serial, force: :cascade do |t|
- t.integer "project_id", null: false
- t.integer "namespace_id", null: false
- t.bigint "commit_count", default: 0, null: false
- t.bigint "storage_size", default: 0, null: false
- t.bigint "repository_size", default: 0, null: false
- t.bigint "lfs_objects_size", default: 0, null: false
- t.bigint "build_artifacts_size", default: 0, null: false
- t.index ["namespace_id"], name: "index_project_statistics_on_namespace_id"
- t.index ["project_id"], name: "index_project_statistics_on_project_id", unique: true
- end
-
- create_table "projects", id: :serial, force: :cascade do |t|
- t.string "name"
- t.string "path"
- t.text "description"
- t.datetime "created_at"
- t.datetime "updated_at"
- t.integer "creator_id"
- t.integer "namespace_id", null: false
- t.datetime "last_activity_at"
- t.string "import_url"
- t.integer "visibility_level", default: 0, null: false
- t.boolean "archived", default: false, null: false
- t.string "avatar"
- t.string "import_status"
- t.integer "star_count", default: 0, null: false
- t.boolean "merge_requests_rebase_enabled", default: false, null: false
- t.string "import_type"
- t.string "import_source"
- t.boolean "merge_requests_ff_only_enabled", default: false, null: false
- t.text "import_error"
- t.integer "ci_id"
- t.boolean "shared_runners_enabled", default: true, null: false
- t.string "runners_token"
- t.string "build_coverage_regex"
- t.boolean "build_allow_git_fetch", default: true, null: false
- t.integer "build_timeout", default: 3600, null: false
- t.boolean "pending_delete", default: false
- t.boolean "public_builds", default: true, null: false
- t.boolean "last_repository_check_failed"
- t.datetime "last_repository_check_at"
- t.boolean "container_registry_enabled"
- t.boolean "only_allow_merge_if_pipeline_succeeds", default: false, null: false
- t.boolean "has_external_issue_tracker"
- t.string "repository_storage", default: "default", null: false
- t.boolean "repository_read_only"
- t.boolean "request_access_enabled", default: false, null: false
- t.boolean "has_external_wiki"
- t.string "ci_config_path"
- t.boolean "lfs_enabled"
- t.text "description_html"
- t.boolean "only_allow_merge_if_all_discussions_are_resolved"
- t.boolean "printing_merge_request_link_enabled", default: true, null: false
- t.integer "auto_cancel_pending_pipelines", default: 1, null: false
- t.string "import_jid"
- t.integer "cached_markdown_version"
- t.text "delete_error"
- t.datetime "last_repository_updated_at"
- t.integer "storage_version", limit: 2
- t.boolean "resolve_outdated_diff_discussions"
- t.string "external_authorization_classification_label"
- t.integer "jobs_cache_index"
- t.boolean "pages_https_only", default: true
- t.boolean "remote_mirror_available_overridden"
- t.bigint "pool_repository_id"
- t.string "runners_token_encrypted"
- t.string "bfg_object_map"
- t.index "lower((name)::text)", name: "index_projects_on_lower_name"
- t.index ["ci_id"], name: "index_projects_on_ci_id"
- t.index ["created_at"], name: "index_projects_on_created_at"
- t.index ["creator_id"], name: "index_projects_on_creator_id"
- t.index ["description"], name: "index_projects_on_description_trigram", opclass: :gin_trgm_ops, using: :gin
- t.index ["id"], name: "index_projects_on_id_partial_for_visibility", unique: true, where: "(visibility_level = ANY (ARRAY[10, 20]))"
- t.index ["last_activity_at"], name: "index_projects_on_last_activity_at"
- t.index ["last_repository_check_at"], name: "index_projects_on_last_repository_check_at", where: "(last_repository_check_at IS NOT NULL)"
- t.index ["last_repository_check_failed"], name: "index_projects_on_last_repository_check_failed"
- t.index ["last_repository_updated_at"], name: "index_projects_on_last_repository_updated_at"
- t.index ["name"], name: "index_projects_on_name_trigram", opclass: :gin_trgm_ops, using: :gin
- t.index ["namespace_id"], name: "index_projects_on_namespace_id"
- t.index ["path"], name: "index_projects_on_path"
- t.index ["path"], name: "index_projects_on_path_trigram", opclass: :gin_trgm_ops, using: :gin
- t.index ["pending_delete"], name: "index_projects_on_pending_delete"
- t.index ["pool_repository_id"], name: "index_projects_on_pool_repository_id", where: "(pool_repository_id IS NOT NULL)"
- t.index ["repository_storage", "created_at"], name: "idx_project_repository_check_partial", where: "(last_repository_check_at IS NULL)"
- t.index ["repository_storage"], name: "index_projects_on_repository_storage"
- t.index ["runners_token"], name: "index_projects_on_runners_token"
- t.index ["star_count"], name: "index_projects_on_star_count"
- t.index ["visibility_level"], name: "index_projects_on_visibility_level"
- end
-
- create_table "prometheus_metrics", id: :serial, force: :cascade do |t|
- t.integer "project_id"
- t.string "title", null: false
- t.string "query", null: false
- t.string "y_label"
- t.string "unit"
- t.string "legend"
- t.integer "group", null: false
- t.datetime_with_timezone "created_at", null: false
- t.datetime_with_timezone "updated_at", null: false
- t.boolean "common", default: false, null: false
- t.string "identifier"
- t.index ["common"], name: "index_prometheus_metrics_on_common"
- t.index ["group"], name: "index_prometheus_metrics_on_group"
- t.index ["identifier"], name: "index_prometheus_metrics_on_identifier", unique: true
- t.index ["project_id"], name: "index_prometheus_metrics_on_project_id"
- end
-
- create_table "protected_branch_merge_access_levels", id: :serial, force: :cascade do |t|
- t.integer "protected_branch_id", null: false
- t.integer "access_level", default: 40, null: false
- t.datetime "created_at", null: false
- t.datetime "updated_at", null: false
- t.index ["protected_branch_id"], name: "index_protected_branch_merge_access"
- end
-
- create_table "protected_branch_push_access_levels", id: :serial, force: :cascade do |t|
- t.integer "protected_branch_id", null: false
- t.integer "access_level", default: 40, null: false
- t.datetime "created_at", null: false
- t.datetime "updated_at", null: false
- t.index ["protected_branch_id"], name: "index_protected_branch_push_access"
- end
-
- create_table "protected_branches", id: :serial, force: :cascade do |t|
- t.integer "project_id", null: false
- t.string "name", null: false
- t.datetime "created_at"
- t.datetime "updated_at"
- t.index ["project_id"], name: "index_protected_branches_on_project_id"
- end
-
- create_table "protected_tag_create_access_levels", id: :serial, force: :cascade do |t|
- t.integer "protected_tag_id", null: false
- t.integer "access_level", default: 40
- t.integer "user_id"
- t.integer "group_id"
- t.datetime "created_at", null: false
- t.datetime "updated_at", null: false
- t.index ["group_id"], name: "index_protected_tag_create_access_levels_on_group_id"
- t.index ["protected_tag_id"], name: "index_protected_tag_create_access"
- t.index ["user_id"], name: "index_protected_tag_create_access_levels_on_user_id"
- end
-
- create_table "protected_tags", id: :serial, force: :cascade do |t|
- t.integer "project_id", null: false
- t.string "name", null: false
- t.datetime "created_at", null: false
- t.datetime "updated_at", null: false
- t.index ["project_id", "name"], name: "index_protected_tags_on_project_id_and_name", unique: true
- t.index ["project_id"], name: "index_protected_tags_on_project_id"
- end
-
- create_table "push_event_payloads", id: false, force: :cascade do |t|
- t.bigint "commit_count", null: false
- t.integer "event_id", null: false
- t.integer "action", limit: 2, null: false
- t.integer "ref_type", limit: 2, null: false
- t.binary "commit_from"
- t.binary "commit_to"
- t.text "ref"
- t.string "commit_title", limit: 70
- t.index ["event_id"], name: "index_push_event_payloads_on_event_id", unique: true
- end
-
- create_table "redirect_routes", id: :serial, force: :cascade do |t|
- t.integer "source_id", null: false
- t.string "source_type", null: false
- t.string "path", null: false
- t.datetime "created_at", null: false
- t.datetime "updated_at", null: false
- t.index "lower((path)::text) varchar_pattern_ops", name: "index_redirect_routes_on_path_unique_text_pattern_ops", unique: true
- t.index ["path"], name: "index_redirect_routes_on_path", unique: true
- t.index ["source_type", "source_id"], name: "index_redirect_routes_on_source_type_and_source_id"
- end
-
- create_table "release_links", force: :cascade do |t|
- t.integer "release_id", null: false
- t.string "url", null: false
- t.string "name", null: false
- t.datetime_with_timezone "created_at", null: false
- t.datetime_with_timezone "updated_at", null: false
- t.index ["release_id", "name"], name: "index_release_links_on_release_id_and_name", unique: true
- t.index ["release_id", "url"], name: "index_release_links_on_release_id_and_url", unique: true
- end
-
- create_table "releases", id: :serial, force: :cascade do |t|
- t.string "tag"
- t.text "description"
- t.integer "project_id"
- t.datetime "created_at"
- t.datetime "updated_at"
- t.text "description_html"
- t.integer "cached_markdown_version"
- t.integer "author_id"
- t.string "name"
- t.string "sha"
- t.index ["author_id"], name: "index_releases_on_author_id"
- t.index ["project_id", "tag"], name: "index_releases_on_project_id_and_tag"
- t.index ["project_id"], name: "index_releases_on_project_id"
- end
-
- create_table "remote_mirrors", id: :serial, force: :cascade do |t|
- t.integer "project_id"
- t.string "url"
- t.boolean "enabled", default: false
- t.string "update_status"
- t.datetime "last_update_at"
- t.datetime "last_successful_update_at"
- t.datetime "last_update_started_at"
- t.string "last_error"
- t.boolean "only_protected_branches", default: false, null: false
- t.string "remote_name"
- t.text "encrypted_credentials"
- t.string "encrypted_credentials_iv"
- t.string "encrypted_credentials_salt"
- t.datetime "created_at", null: false
- t.datetime "updated_at", null: false
- t.index ["last_successful_update_at"], name: "index_remote_mirrors_on_last_successful_update_at"
- t.index ["project_id"], name: "index_remote_mirrors_on_project_id"
- end
-
- create_table "repository_languages", id: false, force: :cascade do |t|
- t.integer "project_id", null: false
- t.integer "programming_language_id", null: false
- t.float "share", null: false
- t.index ["project_id", "programming_language_id"], name: "index_repository_languages_on_project_and_languages_id", unique: true
- end
-
- create_table "resource_label_events", force: :cascade do |t|
- t.integer "action", null: false
- t.integer "issue_id"
- t.integer "merge_request_id"
- t.integer "label_id"
- t.integer "user_id"
- t.datetime_with_timezone "created_at", null: false
- t.integer "cached_markdown_version"
- t.text "reference"
- t.text "reference_html"
- t.index ["issue_id"], name: "index_resource_label_events_on_issue_id"
- t.index ["label_id"], name: "index_resource_label_events_on_label_id"
- t.index ["merge_request_id"], name: "index_resource_label_events_on_merge_request_id"
- t.index ["user_id"], name: "index_resource_label_events_on_user_id"
- end
-
- create_table "routes", id: :serial, force: :cascade do |t|
- t.integer "source_id", null: false
- t.string "source_type", null: false
- t.string "path", null: false
- t.datetime "created_at"
- t.datetime "updated_at"
- t.string "name"
- t.index ["path"], name: "index_routes_on_path", unique: true
- t.index ["path"], name: "index_routes_on_path_text_pattern_ops", opclass: :varchar_pattern_ops
- t.index ["source_type", "source_id"], name: "index_routes_on_source_type_and_source_id", unique: true
- end
-
- create_table "sent_notifications", id: :serial, force: :cascade do |t|
- t.integer "project_id"
- t.string "noteable_type"
- t.integer "noteable_id"
- t.integer "recipient_id"
- t.string "commit_id"
- t.string "reply_key", null: false
- t.string "line_code"
- t.string "note_type"
- t.text "position"
- t.string "in_reply_to_discussion_id"
- t.index ["reply_key"], name: "index_sent_notifications_on_reply_key", unique: true
- end
-
- create_table "services", id: :serial, force: :cascade do |t|
- t.string "type"
- t.string "title"
- t.integer "project_id"
- t.datetime "created_at"
- t.datetime "updated_at"
- t.boolean "active", default: false, null: false
- t.text "properties"
- t.boolean "template", default: false
- t.boolean "push_events", default: true
- t.boolean "issues_events", default: true
- t.boolean "merge_requests_events", default: true
- t.boolean "tag_push_events", default: true
- t.boolean "note_events", default: true, null: false
- t.string "category", default: "common", null: false
- t.boolean "default", default: false
- t.boolean "wiki_page_events", default: true
- t.boolean "pipeline_events", default: false, null: false
- t.boolean "confidential_issues_events", default: true, null: false
- t.boolean "commit_events", default: true, null: false
- t.boolean "job_events", default: false, null: false
- t.boolean "confidential_note_events", default: true
- t.index ["project_id"], name: "index_services_on_project_id"
- t.index ["template"], name: "index_services_on_template"
- end
-
- create_table "shards", id: :serial, force: :cascade do |t|
- t.string "name", null: false
- t.index ["name"], name: "index_shards_on_name", unique: true
- end
-
- create_table "snippets", id: :serial, force: :cascade do |t|
- t.string "title"
- t.text "content"
- t.integer "author_id", null: false
- t.integer "project_id"
- t.datetime "created_at"
- t.datetime "updated_at"
- t.string "file_name"
- t.string "type"
- t.integer "visibility_level", default: 0, null: false
- t.text "title_html"
- t.text "content_html"
- t.integer "cached_markdown_version"
- t.text "description"
- t.text "description_html"
- t.index ["author_id"], name: "index_snippets_on_author_id"
- t.index ["file_name"], name: "index_snippets_on_file_name_trigram", opclass: :gin_trgm_ops, using: :gin
- t.index ["project_id"], name: "index_snippets_on_project_id"
- t.index ["title"], name: "index_snippets_on_title_trigram", opclass: :gin_trgm_ops, using: :gin
- t.index ["updated_at"], name: "index_snippets_on_updated_at"
- t.index ["visibility_level"], name: "index_snippets_on_visibility_level"
- end
-
- create_table "spam_logs", id: :serial, force: :cascade do |t|
- t.integer "user_id"
- t.string "source_ip"
- t.string "user_agent"
- t.boolean "via_api"
- t.string "noteable_type"
- t.string "title"
- t.text "description"
- t.datetime "created_at", null: false
- t.datetime "updated_at", null: false
- t.boolean "submitted_as_ham", default: false, null: false
- t.boolean "recaptcha_verified", default: false, null: false
- end
-
- create_table "subscriptions", id: :serial, force: :cascade do |t|
- t.integer "user_id"
- t.string "subscribable_type"
- t.integer "subscribable_id"
- t.boolean "subscribed"
- t.datetime "created_at"
- t.datetime "updated_at"
- t.integer "project_id"
- t.index ["project_id"], name: "index_subscriptions_on_project_id"
- t.index ["subscribable_id", "subscribable_type", "user_id", "project_id"], name: "index_subscriptions_on_subscribable_and_user_id_and_project_id", unique: true
- end
-
- create_table "suggestions", force: :cascade do |t|
- t.integer "note_id", null: false
- t.integer "relative_order", limit: 2, null: false
- t.boolean "applied", default: false, null: false
- t.string "commit_id"
- t.text "from_content", null: false
- t.text "to_content", null: false
- t.index ["note_id", "relative_order"], name: "index_suggestions_on_note_id_and_relative_order", unique: true
- t.index ["note_id"], name: "index_suggestions_on_note_id"
- end
-
- create_table "system_note_metadata", id: :serial, force: :cascade do |t|
- t.integer "note_id", null: false
- t.integer "commit_count"
- t.string "action"
- t.datetime "created_at", null: false
- t.datetime "updated_at", null: false
- t.index ["note_id"], name: "index_system_note_metadata_on_note_id", unique: true
- end
-
- create_table "taggings", id: :serial, force: :cascade do |t|
- t.integer "tag_id"
- t.integer "taggable_id"
- t.string "taggable_type"
- t.integer "tagger_id"
- t.string "tagger_type"
- t.string "context"
- t.datetime "created_at"
- t.index ["tag_id", "taggable_id", "taggable_type", "context", "tagger_id", "tagger_type"], name: "taggings_idx", unique: true
- t.index ["tag_id"], name: "index_taggings_on_tag_id"
- t.index ["taggable_id", "taggable_type", "context"], name: "index_taggings_on_taggable_id_and_taggable_type_and_context"
- t.index ["taggable_id", "taggable_type"], name: "index_taggings_on_taggable_id_and_taggable_type"
- end
-
- create_table "tags", id: :serial, force: :cascade do |t|
- t.string "name"
- t.integer "taggings_count", default: 0
- t.index ["name"], name: "index_tags_on_name", unique: true
- end
-
- create_table "term_agreements", id: :serial, force: :cascade do |t|
- t.integer "term_id", null: false
- t.integer "user_id", null: false
- t.boolean "accepted", default: false, null: false
- t.datetime_with_timezone "created_at", null: false
- t.datetime_with_timezone "updated_at", null: false
- t.index ["term_id"], name: "index_term_agreements_on_term_id"
- t.index ["user_id", "term_id"], name: "term_agreements_unique_index", unique: true
- t.index ["user_id"], name: "index_term_agreements_on_user_id"
- end
-
- create_table "timelogs", id: :serial, force: :cascade do |t|
- t.integer "time_spent", null: false
- t.integer "user_id"
- t.datetime "created_at", null: false
- t.datetime "updated_at", null: false
- t.integer "issue_id"
- t.integer "merge_request_id"
- t.datetime_with_timezone "spent_at"
- t.index ["issue_id"], name: "index_timelogs_on_issue_id"
- t.index ["merge_request_id"], name: "index_timelogs_on_merge_request_id"
- t.index ["user_id"], name: "index_timelogs_on_user_id"
- end
-
- create_table "todos", id: :serial, force: :cascade do |t|
- t.integer "user_id", null: false
- t.integer "project_id"
- t.string "target_type", null: false
- t.integer "target_id"
- t.integer "author_id", null: false
- t.integer "action", null: false
- t.string "state", null: false
- t.datetime "created_at"
- t.datetime "updated_at"
- t.integer "note_id"
- t.string "commit_id"
- t.integer "group_id"
- t.index ["author_id"], name: "index_todos_on_author_id"
- t.index ["commit_id"], name: "index_todos_on_commit_id"
- t.index ["group_id"], name: "index_todos_on_group_id"
- t.index ["note_id"], name: "index_todos_on_note_id"
- t.index ["project_id"], name: "index_todos_on_project_id"
- t.index ["target_type", "target_id"], name: "index_todos_on_target_type_and_target_id"
- t.index ["user_id", "id"], name: "index_todos_on_user_id_and_id_done", where: "((state)::text = 'done'::text)"
- t.index ["user_id", "id"], name: "index_todos_on_user_id_and_id_pending", where: "((state)::text = 'pending'::text)"
- t.index ["user_id"], name: "index_todos_on_user_id"
- end
-
- create_table "trending_projects", id: :serial, force: :cascade do |t|
- t.integer "project_id", null: false
- t.index ["project_id"], name: "index_trending_projects_on_project_id", unique: true
- end
-
- create_table "u2f_registrations", id: :serial, force: :cascade do |t|
- t.text "certificate"
- t.string "key_handle"
- t.string "public_key"
- t.integer "counter"
- t.integer "user_id"
- t.datetime "created_at", null: false
- t.datetime "updated_at", null: false
- t.string "name"
- t.index ["key_handle"], name: "index_u2f_registrations_on_key_handle"
- t.index ["user_id"], name: "index_u2f_registrations_on_user_id"
- end
-
- create_table "uploads", id: :serial, force: :cascade do |t|
- t.bigint "size", null: false
- t.string "path", limit: 511, null: false
- t.string "checksum", limit: 64
- t.string "model_type"
- t.integer "model_id"
- t.string "uploader", null: false
- t.datetime "created_at", null: false
- t.integer "store"
- t.string "mount_point"
- t.string "secret"
- t.index ["checksum"], name: "index_uploads_on_checksum"
- t.index ["model_id", "model_type"], name: "index_uploads_on_model_id_and_model_type"
- t.index ["store"], name: "index_uploads_on_store"
- t.index ["uploader", "path"], name: "index_uploads_on_uploader_and_path"
- end
-
- create_table "user_agent_details", id: :serial, force: :cascade do |t|
- t.string "user_agent", null: false
- t.string "ip_address", null: false
- t.integer "subject_id", null: false
- t.string "subject_type", null: false
- t.boolean "submitted", default: false, null: false
- t.datetime "created_at", null: false
- t.datetime "updated_at", null: false
- t.index ["subject_id", "subject_type"], name: "index_user_agent_details_on_subject_id_and_subject_type"
- end
-
- create_table "user_callouts", id: :serial, force: :cascade do |t|
- t.integer "feature_name", null: false
- t.integer "user_id", null: false
- t.index ["user_id", "feature_name"], name: "index_user_callouts_on_user_id_and_feature_name", unique: true
- t.index ["user_id"], name: "index_user_callouts_on_user_id"
- end
-
- create_table "user_custom_attributes", id: :serial, force: :cascade do |t|
- t.datetime_with_timezone "created_at", null: false
- t.datetime_with_timezone "updated_at", null: false
- t.integer "user_id", null: false
- t.string "key", null: false
- t.string "value", null: false
- t.index ["key", "value"], name: "index_user_custom_attributes_on_key_and_value"
- t.index ["user_id", "key"], name: "index_user_custom_attributes_on_user_id_and_key", unique: true
- end
-
- create_table "user_interacted_projects", id: false, force: :cascade do |t|
- t.integer "user_id", null: false
- t.integer "project_id", null: false
- t.index ["project_id", "user_id"], name: "index_user_interacted_projects_on_project_id_and_user_id", unique: true
- t.index ["user_id"], name: "index_user_interacted_projects_on_user_id"
- end
-
- create_table "user_preferences", id: :serial, force: :cascade do |t|
- t.integer "user_id", null: false
- t.integer "issue_notes_filter", limit: 2, default: 0, null: false
- t.integer "merge_request_notes_filter", limit: 2, default: 0, null: false
- t.datetime_with_timezone "created_at", null: false
- t.datetime_with_timezone "updated_at", null: false
- t.integer "first_day_of_week"
- t.index ["user_id"], name: "index_user_preferences_on_user_id", unique: true
- end
-
- create_table "user_statuses", primary_key: "user_id", id: :serial, force: :cascade do |t|
- t.integer "cached_markdown_version"
- t.string "emoji", default: "speech_balloon", null: false
- t.string "message", limit: 100
- t.string "message_html"
- t.index ["user_id"], name: "index_user_statuses_on_user_id"
- end
-
- create_table "user_synced_attributes_metadata", id: :serial, force: :cascade do |t|
- t.boolean "name_synced", default: false
- t.boolean "email_synced", default: false
- t.boolean "location_synced", default: false
- t.integer "user_id", null: false
- t.string "provider"
- t.index ["user_id"], name: "index_user_synced_attributes_metadata_on_user_id", unique: true
- end
-
- create_table "users", id: :serial, force: :cascade do |t|
- t.string "email", default: "", null: false
- t.string "encrypted_password", default: "", null: false
- t.string "reset_password_token"
- t.datetime "reset_password_sent_at"
- t.datetime "remember_created_at"
- t.integer "sign_in_count", default: 0
- t.datetime "current_sign_in_at"
- t.datetime "last_sign_in_at"
- t.string "current_sign_in_ip"
- t.string "last_sign_in_ip"
- t.datetime "created_at"
- t.datetime "updated_at"
- t.string "name"
- t.boolean "admin", default: false, null: false
- t.integer "projects_limit", null: false
- t.string "skype", default: "", null: false
- t.string "linkedin", default: "", null: false
- t.string "twitter", default: "", null: false
- t.string "bio"
- t.integer "failed_attempts", default: 0
- t.datetime "locked_at"
- t.string "username"
- t.boolean "can_create_group", default: true, null: false
- t.boolean "can_create_team", default: true, null: false
- t.string "state"
- t.integer "color_scheme_id", default: 1, null: false
- t.datetime "password_expires_at"
- t.integer "created_by_id"
- t.datetime "last_credential_check_at"
- t.string "avatar"
- t.string "confirmation_token"
- t.datetime "confirmed_at"
- t.datetime "confirmation_sent_at"
- t.string "unconfirmed_email"
- t.boolean "hide_no_ssh_key", default: false
- t.string "website_url", default: "", null: false
- t.string "notification_email"
- t.boolean "hide_no_password", default: false
- t.boolean "password_automatically_set", default: false
- t.string "location"
- t.string "encrypted_otp_secret"
- t.string "encrypted_otp_secret_iv"
- t.string "encrypted_otp_secret_salt"
- t.boolean "otp_required_for_login", default: false, null: false
- t.text "otp_backup_codes"
- t.string "public_email", default: "", null: false
- t.integer "dashboard", default: 0
- t.integer "project_view", default: 0
- t.integer "consumed_timestep"
- t.integer "layout", default: 0
- t.boolean "hide_project_limit", default: false
- t.string "unlock_token"
- t.datetime "otp_grace_period_started_at"
- t.boolean "external", default: false
- t.string "incoming_email_token"
- t.string "organization"
- t.boolean "require_two_factor_authentication_from_group", default: false, null: false
- t.integer "two_factor_grace_period", default: 48, null: false
- t.boolean "ghost"
- t.date "last_activity_on"
- t.boolean "notified_of_own_activity"
- t.string "preferred_language"
- t.integer "theme_id", limit: 2
- t.boolean "include_private_contributions"
- t.string "feed_token"
- t.integer "accepted_term_id"
- t.boolean "private_profile"
- t.string "commit_email"
- t.index "lower((name)::text)", name: "index_on_users_name_lower"
- t.index ["accepted_term_id"], name: "index_users_on_accepted_term_id"
- t.index ["admin"], name: "index_users_on_admin"
- t.index ["confirmation_token"], name: "index_users_on_confirmation_token", unique: true
- t.index ["created_at"], name: "index_users_on_created_at"
- t.index ["email"], name: "index_users_on_email", unique: true
- t.index ["email"], name: "index_users_on_email_trigram", opclass: :gin_trgm_ops, using: :gin
- t.index ["feed_token"], name: "index_users_on_feed_token"
- t.index ["ghost"], name: "index_users_on_ghost"
- t.index ["incoming_email_token"], name: "index_users_on_incoming_email_token"
- t.index ["name"], name: "index_users_on_name"
- t.index ["name"], name: "index_users_on_name_trigram", opclass: :gin_trgm_ops, using: :gin
- t.index ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true
- t.index ["state"], name: "index_users_on_state"
- t.index ["username"], name: "index_users_on_username"
- t.index ["username"], name: "index_users_on_username_trigram", opclass: :gin_trgm_ops, using: :gin
- end
-
- create_table "users_star_projects", id: :serial, force: :cascade do |t|
- t.integer "project_id", null: false
- t.integer "user_id", null: false
- t.datetime "created_at"
- t.datetime "updated_at"
- t.index ["project_id"], name: "index_users_star_projects_on_project_id"
- t.index ["user_id", "project_id"], name: "index_users_star_projects_on_user_id_and_project_id", unique: true
- end
-
- create_table "web_hook_logs", id: :serial, force: :cascade do |t|
- t.integer "web_hook_id", null: false
- t.string "trigger"
- t.string "url"
- t.text "request_headers"
- t.text "request_data"
- t.text "response_headers"
- t.text "response_body"
- t.string "response_status"
- t.float "execution_duration"
- t.string "internal_error_message"
- t.datetime "created_at", null: false
- t.datetime "updated_at", null: false
- t.index ["created_at", "web_hook_id"], name: "index_web_hook_logs_on_created_at_and_web_hook_id"
- t.index ["web_hook_id"], name: "index_web_hook_logs_on_web_hook_id"
- end
-
- create_table "web_hooks", id: :serial, force: :cascade do |t|
- t.integer "project_id"
- t.datetime "created_at"
- t.datetime "updated_at"
- t.string "type", default: "ProjectHook"
- t.integer "service_id"
- t.boolean "push_events", default: true, null: false
- t.boolean "issues_events", default: false, null: false
- t.boolean "merge_requests_events", default: false, null: false
- t.boolean "tag_push_events", default: false
- t.boolean "note_events", default: false, null: false
- t.boolean "enable_ssl_verification", default: true
- t.boolean "wiki_page_events", default: false, null: false
- t.boolean "pipeline_events", default: false, null: false
- t.boolean "confidential_issues_events", default: false, null: false
- t.boolean "repository_update_events", default: false, null: false
- t.boolean "job_events", default: false, null: false
- t.boolean "confidential_note_events"
- t.text "push_events_branch_filter"
- t.string "encrypted_token"
- t.string "encrypted_token_iv"
- t.string "encrypted_url"
- t.string "encrypted_url_iv"
- t.index ["project_id"], name: "index_web_hooks_on_project_id"
- t.index ["type"], name: "index_web_hooks_on_type"
- end
-
- add_foreign_key "application_settings", "users", column: "usage_stats_set_by_user_id", name: "fk_964370041d", on_delete: :nullify
- add_foreign_key "badges", "namespaces", column: "group_id", on_delete: :cascade
- add_foreign_key "badges", "projects", on_delete: :cascade
- add_foreign_key "board_group_recent_visits", "boards", on_delete: :cascade
- add_foreign_key "board_group_recent_visits", "namespaces", column: "group_id", on_delete: :cascade
- add_foreign_key "board_group_recent_visits", "users", on_delete: :cascade
- add_foreign_key "board_project_recent_visits", "boards", on_delete: :cascade
- add_foreign_key "board_project_recent_visits", "projects", on_delete: :cascade
- add_foreign_key "board_project_recent_visits", "users", on_delete: :cascade
- add_foreign_key "boards", "namespaces", column: "group_id", on_delete: :cascade
- add_foreign_key "boards", "projects", name: "fk_f15266b5f9", on_delete: :cascade
- add_foreign_key "chat_teams", "namespaces", on_delete: :cascade
- add_foreign_key "ci_build_trace_chunks", "ci_builds", column: "build_id", on_delete: :cascade
- add_foreign_key "ci_build_trace_section_names", "projects", on_delete: :cascade
- add_foreign_key "ci_build_trace_sections", "ci_build_trace_section_names", column: "section_name_id", name: "fk_264e112c66", on_delete: :cascade
- add_foreign_key "ci_build_trace_sections", "ci_builds", column: "build_id", name: "fk_4ebe41f502", on_delete: :cascade
- add_foreign_key "ci_build_trace_sections", "projects", on_delete: :cascade
- add_foreign_key "ci_builds", "ci_pipelines", column: "auto_canceled_by_id", name: "fk_a2141b1522", on_delete: :nullify
- add_foreign_key "ci_builds", "ci_pipelines", column: "commit_id", name: "fk_d3130c9a7f", on_delete: :cascade
- add_foreign_key "ci_builds", "ci_stages", column: "stage_id", name: "fk_3a9eaa254d", on_delete: :cascade
- add_foreign_key "ci_builds", "projects", name: "fk_befce0568a", on_delete: :cascade
- add_foreign_key "ci_builds_metadata", "ci_builds", column: "build_id", on_delete: :cascade
- add_foreign_key "ci_builds_metadata", "projects", on_delete: :cascade
- add_foreign_key "ci_builds_runner_session", "ci_builds", column: "build_id", on_delete: :cascade
- add_foreign_key "ci_group_variables", "namespaces", column: "group_id", name: "fk_33ae4d58d8", on_delete: :cascade
- add_foreign_key "ci_job_artifacts", "ci_builds", column: "job_id", on_delete: :cascade
- add_foreign_key "ci_job_artifacts", "projects", on_delete: :cascade
- add_foreign_key "ci_pipeline_chat_data", "chat_names", on_delete: :cascade
- add_foreign_key "ci_pipeline_chat_data", "ci_pipelines", column: "pipeline_id", on_delete: :cascade
- add_foreign_key "ci_pipeline_schedule_variables", "ci_pipeline_schedules", column: "pipeline_schedule_id", name: "fk_41c35fda51", on_delete: :cascade
- add_foreign_key "ci_pipeline_schedules", "projects", name: "fk_8ead60fcc4", on_delete: :cascade
- add_foreign_key "ci_pipeline_schedules", "users", column: "owner_id", name: "fk_9ea99f58d2", on_delete: :nullify
- add_foreign_key "ci_pipeline_variables", "ci_pipelines", column: "pipeline_id", name: "fk_f29c5f4380", on_delete: :cascade
- add_foreign_key "ci_pipelines", "ci_pipeline_schedules", column: "pipeline_schedule_id", name: "fk_3d34ab2e06", on_delete: :nullify
- add_foreign_key "ci_pipelines", "ci_pipelines", column: "auto_canceled_by_id", name: "fk_262d4c2d19", on_delete: :nullify
- add_foreign_key "ci_pipelines", "merge_requests", name: "fk_a23be95014", on_delete: :cascade
- add_foreign_key "ci_pipelines", "projects", name: "fk_86635dbd80", on_delete: :cascade
- add_foreign_key "ci_runner_namespaces", "ci_runners", column: "runner_id", on_delete: :cascade
- add_foreign_key "ci_runner_namespaces", "namespaces", on_delete: :cascade
- add_foreign_key "ci_runner_projects", "projects", name: "fk_4478a6f1e4", on_delete: :cascade
- add_foreign_key "ci_stages", "ci_pipelines", column: "pipeline_id", name: "fk_fb57e6cc56", on_delete: :cascade
- add_foreign_key "ci_stages", "projects", name: "fk_2360681d1d", on_delete: :cascade
- add_foreign_key "ci_trigger_requests", "ci_triggers", column: "trigger_id", name: "fk_b8ec8b7245", on_delete: :cascade
- add_foreign_key "ci_triggers", "projects", name: "fk_e3e63f966e", on_delete: :cascade
- add_foreign_key "ci_triggers", "users", column: "owner_id", name: "fk_e8e10d1964", on_delete: :cascade
- add_foreign_key "ci_variables", "projects", name: "fk_ada5eb64b3", on_delete: :cascade
- add_foreign_key "cluster_groups", "clusters", on_delete: :cascade
- add_foreign_key "cluster_groups", "namespaces", column: "group_id", on_delete: :cascade
- add_foreign_key "cluster_platforms_kubernetes", "clusters", on_delete: :cascade
- add_foreign_key "cluster_projects", "clusters", on_delete: :cascade
- add_foreign_key "cluster_projects", "projects", on_delete: :cascade
- add_foreign_key "cluster_providers_gcp", "clusters", on_delete: :cascade
- add_foreign_key "clusters", "users", on_delete: :nullify
- add_foreign_key "clusters_applications_cert_managers", "clusters", on_delete: :cascade
- add_foreign_key "clusters_applications_helm", "clusters", on_delete: :cascade
- add_foreign_key "clusters_applications_ingress", "clusters", on_delete: :cascade
- add_foreign_key "clusters_applications_jupyter", "clusters", on_delete: :cascade
- add_foreign_key "clusters_applications_jupyter", "oauth_applications", on_delete: :nullify
- add_foreign_key "clusters_applications_knative", "clusters", on_delete: :cascade
- add_foreign_key "clusters_applications_prometheus", "clusters", on_delete: :cascade
- add_foreign_key "clusters_applications_runners", "ci_runners", column: "runner_id", name: "fk_02de2ded36", on_delete: :nullify
- add_foreign_key "clusters_applications_runners", "clusters", on_delete: :cascade
- add_foreign_key "clusters_kubernetes_namespaces", "cluster_projects", on_delete: :nullify
- add_foreign_key "clusters_kubernetes_namespaces", "clusters", on_delete: :cascade
- add_foreign_key "clusters_kubernetes_namespaces", "projects", on_delete: :nullify
- add_foreign_key "container_repositories", "projects"
- add_foreign_key "deploy_keys_projects", "projects", name: "fk_58a901ca7e", on_delete: :cascade
- add_foreign_key "deployments", "projects", name: "fk_b9a3851b82", on_delete: :cascade
- add_foreign_key "environments", "projects", name: "fk_d1c8c1da6a", on_delete: :cascade
- add_foreign_key "events", "projects", on_delete: :cascade
- add_foreign_key "events", "users", column: "author_id", name: "fk_edfd187b6f", on_delete: :cascade
- add_foreign_key "fork_network_members", "fork_networks", on_delete: :cascade
- add_foreign_key "fork_network_members", "projects", column: "forked_from_project_id", name: "fk_b01280dae4", on_delete: :nullify
- add_foreign_key "fork_network_members", "projects", on_delete: :cascade
- add_foreign_key "fork_networks", "projects", column: "root_project_id", name: "fk_e7b436b2b5", on_delete: :nullify
- add_foreign_key "forked_project_links", "projects", column: "forked_to_project_id", name: "fk_434510edb0", on_delete: :cascade
- add_foreign_key "gpg_key_subkeys", "gpg_keys", on_delete: :cascade
- add_foreign_key "gpg_keys", "users", on_delete: :cascade
- add_foreign_key "gpg_signatures", "gpg_key_subkeys", on_delete: :nullify
- add_foreign_key "gpg_signatures", "gpg_keys", on_delete: :nullify
- add_foreign_key "gpg_signatures", "projects", on_delete: :cascade
- add_foreign_key "group_custom_attributes", "namespaces", column: "group_id", on_delete: :cascade
- add_foreign_key "group_group_links", "namespaces", column: "shared_group_id", on_delete: :cascade
- add_foreign_key "group_group_links", "namespaces", column: "shared_with_group_id", on_delete: :cascade
- add_foreign_key "import_export_uploads", "projects", on_delete: :cascade
- add_foreign_key "internal_ids", "namespaces", name: "fk_162941d509", on_delete: :cascade
- add_foreign_key "internal_ids", "projects", on_delete: :cascade
- add_foreign_key "issue_assignees", "issues", name: "fk_b7d881734a", on_delete: :cascade
- add_foreign_key "issue_assignees", "users", name: "fk_5e0c8d9154", on_delete: :cascade
- add_foreign_key "issue_metrics", "issues", on_delete: :cascade
- add_foreign_key "issues", "issues", column: "moved_to_id", name: "fk_a194299be1", on_delete: :nullify
- add_foreign_key "issues", "milestones", name: "fk_96b1dd429c", on_delete: :nullify
- add_foreign_key "issues", "projects", name: "fk_899c8f3231", on_delete: :cascade
- add_foreign_key "issues", "users", column: "author_id", name: "fk_05f1e72feb", on_delete: :nullify
- add_foreign_key "issues", "users", column: "closed_by_id", name: "fk_c63cbf6c25", on_delete: :nullify
- add_foreign_key "issues", "users", column: "updated_by_id", name: "fk_ffed080f01", on_delete: :nullify
- add_foreign_key "label_priorities", "labels", on_delete: :cascade
- add_foreign_key "label_priorities", "projects", on_delete: :cascade
- add_foreign_key "labels", "namespaces", column: "group_id", on_delete: :cascade
- add_foreign_key "labels", "projects", name: "fk_7de4989a69", on_delete: :cascade
- add_foreign_key "lfs_file_locks", "projects", on_delete: :cascade
- add_foreign_key "lfs_file_locks", "users", on_delete: :cascade
- add_foreign_key "lists", "boards", name: "fk_0d3f677137", on_delete: :cascade
- add_foreign_key "lists", "labels", name: "fk_7a5553d60f", on_delete: :cascade
- add_foreign_key "members", "users", name: "fk_2e88fb7ce9", on_delete: :cascade
- add_foreign_key "merge_request_diff_commits", "merge_request_diffs", on_delete: :cascade
- add_foreign_key "merge_request_diff_files", "merge_request_diffs", on_delete: :cascade
- add_foreign_key "merge_request_diffs", "merge_requests", name: "fk_8483f3258f", on_delete: :cascade
- add_foreign_key "merge_request_metrics", "ci_pipelines", column: "pipeline_id", on_delete: :cascade
- add_foreign_key "merge_request_metrics", "merge_requests", on_delete: :cascade
- add_foreign_key "merge_request_metrics", "users", column: "latest_closed_by_id", name: "fk_ae440388cc", on_delete: :nullify
- add_foreign_key "merge_request_metrics", "users", column: "merged_by_id", name: "fk_7f28d925f3", on_delete: :nullify
- add_foreign_key "merge_requests", "ci_pipelines", column: "head_pipeline_id", name: "fk_fd82eae0b9", on_delete: :nullify
- add_foreign_key "merge_requests", "merge_request_diffs", column: "latest_merge_request_diff_id", name: "fk_06067f5644", on_delete: :nullify
- add_foreign_key "merge_requests", "milestones", name: "fk_6a5165a692", on_delete: :nullify
- add_foreign_key "merge_requests", "projects", column: "source_project_id", name: "fk_3308fe130c", on_delete: :nullify
- add_foreign_key "merge_requests", "projects", column: "target_project_id", name: "fk_a6963e8447", on_delete: :cascade
- add_foreign_key "merge_requests", "users", column: "assignee_id", name: "fk_6149611a04", on_delete: :nullify
- add_foreign_key "merge_requests", "users", column: "author_id", name: "fk_e719a85f8a", on_delete: :nullify
- add_foreign_key "merge_requests", "users", column: "merge_user_id", name: "fk_ad525e1f87", on_delete: :nullify
- add_foreign_key "merge_requests", "users", column: "updated_by_id", name: "fk_641731faff", on_delete: :nullify
- add_foreign_key "merge_requests_closing_issues", "issues", on_delete: :cascade
- add_foreign_key "merge_requests_closing_issues", "merge_requests", on_delete: :cascade
- add_foreign_key "milestones", "namespaces", column: "group_id", name: "fk_95650a40d4", on_delete: :cascade
- add_foreign_key "milestones", "projects", name: "fk_9bd0a0c791", on_delete: :cascade
- add_foreign_key "note_diff_files", "notes", column: "diff_note_id", on_delete: :cascade
- add_foreign_key "notes", "projects", name: "fk_99e097b079", on_delete: :cascade
- add_foreign_key "notification_settings", "users", name: "fk_0c95e91db7", on_delete: :cascade
- add_foreign_key "oauth_openid_requests", "oauth_access_grants", column: "access_grant_id", name: "fk_oauth_openid_requests_oauth_access_grants_access_grant_id"
- add_foreign_key "pages_domains", "projects", name: "fk_ea2f6dfc6f", on_delete: :cascade
- add_foreign_key "personal_access_tokens", "users"
- add_foreign_key "pool_repositories", "projects", column: "source_project_id", on_delete: :nullify
- add_foreign_key "pool_repositories", "shards", on_delete: :restrict
- add_foreign_key "project_authorizations", "projects", on_delete: :cascade
- add_foreign_key "project_authorizations", "users", on_delete: :cascade
- add_foreign_key "project_auto_devops", "projects", on_delete: :cascade
- add_foreign_key "project_ci_cd_settings", "projects", name: "fk_24c15d2f2e", on_delete: :cascade
- add_foreign_key "project_custom_attributes", "projects", on_delete: :cascade
- add_foreign_key "project_daily_statistics", "projects", on_delete: :cascade
- add_foreign_key "project_deploy_tokens", "deploy_tokens", on_delete: :cascade
- add_foreign_key "project_deploy_tokens", "projects", on_delete: :cascade
- add_foreign_key "project_error_tracking_settings", "projects", on_delete: :cascade
- add_foreign_key "project_features", "projects", name: "fk_18513d9b92", on_delete: :cascade
- add_foreign_key "project_group_links", "projects", name: "fk_daa8cee94c", on_delete: :cascade
- add_foreign_key "project_import_data", "projects", name: "fk_ffb9ee3a10", on_delete: :cascade
- add_foreign_key "project_mirror_data", "projects", on_delete: :cascade
- add_foreign_key "project_repositories", "projects", on_delete: :cascade
- add_foreign_key "project_repositories", "shards", on_delete: :restrict
- add_foreign_key "project_statistics", "projects", on_delete: :cascade
- add_foreign_key "projects", "pool_repositories", name: "fk_6e5c14658a", on_delete: :nullify
- add_foreign_key "prometheus_metrics", "projects", on_delete: :cascade
- add_foreign_key "protected_branch_merge_access_levels", "protected_branches", name: "fk_8a3072ccb3", on_delete: :cascade
- add_foreign_key "protected_branch_push_access_levels", "protected_branches", name: "fk_9ffc86a3d9", on_delete: :cascade
- add_foreign_key "protected_branches", "projects", name: "fk_7a9c6d93e7", on_delete: :cascade
- add_foreign_key "protected_tag_create_access_levels", "namespaces", column: "group_id"
- add_foreign_key "protected_tag_create_access_levels", "protected_tags", name: "fk_f7dfda8c51", on_delete: :cascade
- add_foreign_key "protected_tag_create_access_levels", "users"
- add_foreign_key "protected_tags", "projects", name: "fk_8e4af87648", on_delete: :cascade
- add_foreign_key "push_event_payloads", "events", name: "fk_36c74129da", on_delete: :cascade
- add_foreign_key "release_links", "releases", on_delete: :cascade
- add_foreign_key "releases", "projects", name: "fk_47fe2a0596", on_delete: :cascade
- add_foreign_key "releases", "users", column: "author_id", name: "fk_8e4456f90f", on_delete: :nullify
- add_foreign_key "remote_mirrors", "projects", on_delete: :cascade
- add_foreign_key "repository_languages", "projects", on_delete: :cascade
- add_foreign_key "resource_label_events", "issues", on_delete: :cascade
- add_foreign_key "resource_label_events", "labels", on_delete: :nullify
- add_foreign_key "resource_label_events", "merge_requests", on_delete: :cascade
- add_foreign_key "resource_label_events", "users", on_delete: :nullify
- add_foreign_key "services", "projects", name: "fk_71cce407f9", on_delete: :cascade
- add_foreign_key "snippets", "projects", name: "fk_be41fd4bb7", on_delete: :cascade
- add_foreign_key "subscriptions", "projects", on_delete: :cascade
- add_foreign_key "suggestions", "notes", on_delete: :cascade
- add_foreign_key "system_note_metadata", "notes", name: "fk_d83a918cb1", on_delete: :cascade
- add_foreign_key "term_agreements", "application_setting_terms", column: "term_id"
- add_foreign_key "term_agreements", "users", on_delete: :cascade
- add_foreign_key "timelogs", "issues", name: "fk_timelogs_issues_issue_id", on_delete: :cascade
- add_foreign_key "timelogs", "merge_requests", name: "fk_timelogs_merge_requests_merge_request_id", on_delete: :cascade
- add_foreign_key "todos", "namespaces", column: "group_id", name: "fk_a27c483435", on_delete: :cascade
- add_foreign_key "todos", "notes", name: "fk_91d1f47b13", on_delete: :cascade
- add_foreign_key "todos", "projects", name: "fk_45054f9c45", on_delete: :cascade
- add_foreign_key "todos", "users", column: "author_id", name: "fk_ccf0373936", on_delete: :cascade
- add_foreign_key "todos", "users", name: "fk_d94154aa95", on_delete: :cascade
- add_foreign_key "trending_projects", "projects", on_delete: :cascade
- add_foreign_key "u2f_registrations", "users"
- add_foreign_key "user_callouts", "users", on_delete: :cascade
- add_foreign_key "user_custom_attributes", "users", on_delete: :cascade
- add_foreign_key "user_interacted_projects", "projects", on_delete: :cascade
- add_foreign_key "user_interacted_projects", "users", on_delete: :cascade
- add_foreign_key "user_preferences", "users", on_delete: :cascade
- add_foreign_key "user_statuses", "users", on_delete: :cascade
- add_foreign_key "user_synced_attributes_metadata", "users", on_delete: :cascade
- add_foreign_key "users", "application_setting_terms", column: "accepted_term_id", name: "fk_789cd90b35", on_delete: :cascade
- add_foreign_key "users_star_projects", "projects", name: "fk_22cd27ddfc", on_delete: :cascade
- add_foreign_key "web_hook_logs", "web_hooks", on_delete: :cascade
- add_foreign_key "web_hooks", "projects", name: "fk_0c8ca6d9d1", on_delete: :cascade
+ execute(IO.read("db/init_structure.sql"))
end
def down
raise ActiveRecord::IrreversibleMigration, "The initial migration is not revertable"
end
end
-
-# rubocop:enable Metrics/AbcSize
-# rubocop:enable Migration/AddConcurrentForeignKey
-# rubocop:enable Style/WordArray
-# rubocop:enable Migration/PreventStrings
-# rubocop:enable Migration/AddLimitToTextColumns
-# rubocop:enable Migration/Datetime
diff --git a/db/migrate/20190103140724_make_legacy_false_default.rb b/db/migrate/20190103140724_make_legacy_false_default.rb
deleted file mode 100644
index 154035f76cd..00000000000
--- a/db/migrate/20190103140724_make_legacy_false_default.rb
+++ /dev/null
@@ -1,9 +0,0 @@
-# frozen_string_literal: true
-
-class MakeLegacyFalseDefault < ActiveRecord::Migration[5.0]
- DOWNTIME = false
-
- def change
- change_column_default :cluster_providers_gcp, :legacy_abac, from: true, to: false
- end
-end
diff --git a/db/migrate/20190104182041_cleanup_legacy_artifact_migration.rb b/db/migrate/20190104182041_cleanup_legacy_artifact_migration.rb
deleted file mode 100644
index 11659846a06..00000000000
--- a/db/migrate/20190104182041_cleanup_legacy_artifact_migration.rb
+++ /dev/null
@@ -1,34 +0,0 @@
-# frozen_string_literal: true
-
-class CleanupLegacyArtifactMigration < ActiveRecord::Migration[5.0]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- class Build < ActiveRecord::Base
- include EachBatch
-
- self.table_name = 'ci_builds'
- self.inheritance_column = :_type_disabled
-
- scope :with_legacy_artifacts, -> { where("artifacts_file <> ''") }
- end
-
- def up
- Gitlab::BackgroundMigration.steal('MigrateLegacyArtifacts')
-
- CleanupLegacyArtifactMigration::Build
- .with_legacy_artifacts
- .each_batch(of: 100) do |batch|
- range = batch.pluck('MIN(id)', 'MAX(id)').first
-
- Gitlab::BackgroundMigration::MigrateLegacyArtifacts.new.perform(*range)
- end
- end
-
- def down
- # no-op
- end
-end
diff --git a/db/migrate/20190107151020_add_services_type_index.rb b/db/migrate/20190107151020_add_services_type_index.rb
deleted file mode 100644
index 26b5bd58750..00000000000
--- a/db/migrate/20190107151020_add_services_type_index.rb
+++ /dev/null
@@ -1,20 +0,0 @@
-# frozen_string_literal: true
-
-# See http://doc.gitlab.com/ce/development/migration_style_guide.html
-# for more information on how to write migrations for GitLab.
-
-class AddServicesTypeIndex < ActiveRecord::Migration[5.0]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- add_concurrent_index :services, :type unless index_exists?(:services, :type)
- end
-
- def down
- remove_concurrent_index :services, :type if index_exists?(:services, :type)
- end
-end
diff --git a/db/migrate/20190108192941_remove_partial_index_from_ci_builds_artifacts_file.rb b/db/migrate/20190108192941_remove_partial_index_from_ci_builds_artifacts_file.rb
deleted file mode 100644
index 86de78b831b..00000000000
--- a/db/migrate/20190108192941_remove_partial_index_from_ci_builds_artifacts_file.rb
+++ /dev/null
@@ -1,18 +0,0 @@
-# frozen_string_literal: true
-
-class RemovePartialIndexFromCiBuildsArtifactsFile < ActiveRecord::Migration[5.0]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
- INDEX_NAME = 'partial_index_ci_builds_on_id_with_legacy_artifacts'
-
- disable_ddl_transaction!
-
- def up
- remove_concurrent_index_by_name(:ci_builds, INDEX_NAME)
- end
-
- def down
- add_concurrent_index(:ci_builds, :id, where: "artifacts_file <> ''", name: INDEX_NAME)
- end
-end
diff --git a/db/migrate/20190109153125_add_merge_request_external_diffs.rb b/db/migrate/20190109153125_add_merge_request_external_diffs.rb
deleted file mode 100644
index d787e78142a..00000000000
--- a/db/migrate/20190109153125_add_merge_request_external_diffs.rb
+++ /dev/null
@@ -1,25 +0,0 @@
-# frozen_string_literal: true
-
-# See http://doc.gitlab.com/ce/development/migration_style_guide.html
-# for more information on how to write migrations for GitLab.
-
-class AddMergeRequestExternalDiffs < ActiveRecord::Migration[5.0]
- include Gitlab::Database::MigrationHelpers
-
- # Set this constant to true if this migration requires downtime.
- DOWNTIME = false
-
- def change
- # Allow the merge request diff to store details about an external file
- add_column :merge_request_diffs, :external_diff, :string # rubocop:disable Migration/PreventStrings
- add_column :merge_request_diffs, :external_diff_store, :integer
- add_column :merge_request_diffs, :stored_externally, :boolean
-
- # The diff for each file is mapped to a range in the external file
- add_column :merge_request_diff_files, :external_diff_offset, :integer
- add_column :merge_request_diff_files, :external_diff_size, :integer
-
- # If the diff is in object storage, it will be null in the database
- change_column_null :merge_request_diff_files, :diff, true
- end
-end
diff --git a/db/migrate/20190114172110_add_domain_to_cluster.rb b/db/migrate/20190114172110_add_domain_to_cluster.rb
deleted file mode 100644
index ebe588d8b77..00000000000
--- a/db/migrate/20190114172110_add_domain_to_cluster.rb
+++ /dev/null
@@ -1,9 +0,0 @@
-# frozen_string_literal: true
-
-class AddDomainToCluster < ActiveRecord::Migration[5.0]
- DOWNTIME = false
-
- def change
- add_column :clusters, :domain, :string # rubocop:disable Migration/PreventStrings
- end
-end
diff --git a/db/migrate/20190115054216_add_error_notification_sent_to_remote_mirrors.rb b/db/migrate/20190115054216_add_error_notification_sent_to_remote_mirrors.rb
deleted file mode 100644
index d8f979a1848..00000000000
--- a/db/migrate/20190115054216_add_error_notification_sent_to_remote_mirrors.rb
+++ /dev/null
@@ -1,11 +0,0 @@
-# frozen_string_literal: true
-
-class AddErrorNotificationSentToRemoteMirrors < ActiveRecord::Migration[5.0]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- def change
- add_column :remote_mirrors, :error_notification_sent, :boolean
- end
-end
diff --git a/db/migrate/20190115092821_add_columns_project_error_tracking_settings.rb b/db/migrate/20190115092821_add_columns_project_error_tracking_settings.rb
deleted file mode 100644
index ee6d63b558f..00000000000
--- a/db/migrate/20190115092821_add_columns_project_error_tracking_settings.rb
+++ /dev/null
@@ -1,18 +0,0 @@
-# frozen_string_literal: true
-
-class AddColumnsProjectErrorTrackingSettings < ActiveRecord::Migration[5.0]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- # rubocop:disable Migration/PreventStrings
- def change
- add_column :project_error_tracking_settings, :project_name, :string
- add_column :project_error_tracking_settings, :organization_name, :string
-
- change_column_default :project_error_tracking_settings, :enabled, from: true, to: false
-
- change_column_null :project_error_tracking_settings, :api_url, true
- end
- # rubocop:enable Migration/PreventStrings
-end
diff --git a/db/migrate/20190116234221_add_sorting_fields_to_user_preference.rb b/db/migrate/20190116234221_add_sorting_fields_to_user_preference.rb
deleted file mode 100644
index 5d33f6f4339..00000000000
--- a/db/migrate/20190116234221_add_sorting_fields_to_user_preference.rb
+++ /dev/null
@@ -1,23 +0,0 @@
-# frozen_string_literal: true
-
-# See http://doc.gitlab.com/ce/development/migration_style_guide.html
-# for more information on how to write migrations for GitLab.
-
-class AddSortingFieldsToUserPreference < ActiveRecord::Migration[5.0]
- include Gitlab::Database::MigrationHelpers
-
- # Set this constant to true if this migration requires downtime.
- DOWNTIME = false
-
- # rubocop:disable Migration/PreventStrings
- def up
- add_column :user_preferences, :issues_sort, :string
- add_column :user_preferences, :merge_requests_sort, :string
- end
- # rubocop:enable Migration/PreventStrings
-
- def down
- remove_column :user_preferences, :issues_sort
- remove_column :user_preferences, :merge_requests_sort
- end
-end
diff --git a/db/migrate/20190130091630_add_local_cached_markdown_version.rb b/db/migrate/20190130091630_add_local_cached_markdown_version.rb
deleted file mode 100644
index 00570e6458c..00000000000
--- a/db/migrate/20190130091630_add_local_cached_markdown_version.rb
+++ /dev/null
@@ -1,11 +0,0 @@
-# frozen_string_literal: true
-
-class AddLocalCachedMarkdownVersion < ActiveRecord::Migration[5.0]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- def change
- add_column :application_settings, :local_markdown_version, :integer, default: 0, null: false
- end
-end
diff --git a/db/migrate/20190206193120_add_index_to_tags.rb b/db/migrate/20190206193120_add_index_to_tags.rb
deleted file mode 100644
index d6c0270cb4f..00000000000
--- a/db/migrate/20190206193120_add_index_to_tags.rb
+++ /dev/null
@@ -1,18 +0,0 @@
-# frozen_string_literal: true
-
-class AddIndexToTags < ActiveRecord::Migration[5.0]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
- INDEX_NAME = 'index_tags_on_name_trigram'
-
- disable_ddl_transaction!
-
- def up
- add_concurrent_index :tags, :name, name: INDEX_NAME, using: :gin, opclass: { name: :gin_trgm_ops }
- end
-
- def down
- remove_concurrent_index_by_name(:tags, INDEX_NAME)
- end
-end
diff --git a/db/migrate/20190211131150_add_state_id_to_issuables.rb b/db/migrate/20190211131150_add_state_id_to_issuables.rb
deleted file mode 100644
index c1173eb4249..00000000000
--- a/db/migrate/20190211131150_add_state_id_to_issuables.rb
+++ /dev/null
@@ -1,17 +0,0 @@
-# frozen_string_literal: true
-
-class AddStateIdToIssuables < ActiveRecord::Migration[5.0]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- def up
- add_column :issues, :state_id, :integer, limit: 2
- add_column :merge_requests, :state_id, :integer, limit: 2
- end
-
- def down
- remove_column :issues, :state_id
- remove_column :merge_requests, :state_id
- end
-end
diff --git a/db/migrate/20190215154930_add_merge_pipelines_enabled_to_ci_cd_settings.rb b/db/migrate/20190215154930_add_merge_pipelines_enabled_to_ci_cd_settings.rb
deleted file mode 100644
index 2a2a216da7d..00000000000
--- a/db/migrate/20190215154930_add_merge_pipelines_enabled_to_ci_cd_settings.rb
+++ /dev/null
@@ -1,11 +0,0 @@
-# frozen_string_literal: true
-
-class AddMergePipelinesEnabledToCiCdSettings < ActiveRecord::Migration[5.0]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- def change
- add_column :project_ci_cd_settings, :merge_pipelines_enabled, :boolean
- end
-end
diff --git a/db/migrate/20190218134158_add_masked_to_ci_variables.rb b/db/migrate/20190218134158_add_masked_to_ci_variables.rb
deleted file mode 100644
index 60dcc0d7af5..00000000000
--- a/db/migrate/20190218134158_add_masked_to_ci_variables.rb
+++ /dev/null
@@ -1,21 +0,0 @@
-# frozen_string_literal: true
-
-# See http://doc.gitlab.com/ce/development/migration_style_guide.html
-# for more information on how to write migrations for GitLab.
-
-class AddMaskedToCiVariables < ActiveRecord::Migration[5.0]
- include Gitlab::Database::MigrationHelpers
-
- # Set this constant to true if this migration requires downtime.
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- add_column_with_default :ci_variables, :masked, :boolean, default: false, allow_null: false # rubocop:disable Migration/AddColumnWithDefault
- end
-
- def down
- remove_column :ci_variables, :masked
- end
-end
diff --git a/db/migrate/20190218134209_add_masked_to_ci_group_variables.rb b/db/migrate/20190218134209_add_masked_to_ci_group_variables.rb
deleted file mode 100644
index c25881410d0..00000000000
--- a/db/migrate/20190218134209_add_masked_to_ci_group_variables.rb
+++ /dev/null
@@ -1,21 +0,0 @@
-# frozen_string_literal: true
-
-# See http://doc.gitlab.com/ce/development/migration_style_guide.html
-# for more information on how to write migrations for GitLab.
-
-class AddMaskedToCiGroupVariables < ActiveRecord::Migration[5.0]
- include Gitlab::Database::MigrationHelpers
-
- # Set this constant to true if this migration requires downtime.
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- add_column_with_default :ci_group_variables, :masked, :boolean, default: false, allow_null: false # rubocop:disable Migration/AddColumnWithDefault
- end
-
- def down
- remove_column :ci_group_variables, :masked
- end
-end
diff --git a/db/migrate/20190219201635_add_asset_proxy_settings.rb b/db/migrate/20190219201635_add_asset_proxy_settings.rb
deleted file mode 100644
index 173b2916c4d..00000000000
--- a/db/migrate/20190219201635_add_asset_proxy_settings.rb
+++ /dev/null
@@ -1,20 +0,0 @@
-# frozen_string_literal: true
-
-class AddAssetProxySettings < ActiveRecord::Migration[5.0]
- include Gitlab::Database::MigrationHelpers
-
- # Set this constant to true if this migration requires downtime.
- DOWNTIME = false
-
- # rubocop:disable Migration/PreventStrings
- # rubocop:disable Migration/AddLimitToTextColumns
- def change
- add_column :application_settings, :asset_proxy_enabled, :boolean, default: false, null: false
- add_column :application_settings, :asset_proxy_url, :string
- add_column :application_settings, :asset_proxy_whitelist, :text
- add_column :application_settings, :encrypted_asset_proxy_secret_key, :text
- add_column :application_settings, :encrypted_asset_proxy_secret_key_iv, :string
- end
- # rubocop:enable Migration/AddLimitToTextColumns
- # rubocop:enable Migration/PreventStrings
-end
diff --git a/db/migrate/20190220142344_add_email_header_and_footer_enabled_flag_to_appearances_table.rb b/db/migrate/20190220142344_add_email_header_and_footer_enabled_flag_to_appearances_table.rb
deleted file mode 100644
index 33fb6b8ef0d..00000000000
--- a/db/migrate/20190220142344_add_email_header_and_footer_enabled_flag_to_appearances_table.rb
+++ /dev/null
@@ -1,17 +0,0 @@
-# frozen_string_literal: true
-
-class AddEmailHeaderAndFooterEnabledFlagToAppearancesTable < ActiveRecord::Migration[5.0]
- include Gitlab::Database::MigrationHelpers
-
- disable_ddl_transaction!
-
- DOWNTIME = false
-
- def up
- add_column_with_default(:appearances, :email_header_and_footer_enabled, :boolean, default: false) # rubocop:disable Migration/AddColumnWithDefault
- end
-
- def down
- remove_column(:appearances, :email_header_and_footer_enabled)
- end
-end
diff --git a/db/migrate/20190220150130_add_extra_shas_to_ci_pipelines.rb b/db/migrate/20190220150130_add_extra_shas_to_ci_pipelines.rb
deleted file mode 100644
index 45c7c0949c6..00000000000
--- a/db/migrate/20190220150130_add_extra_shas_to_ci_pipelines.rb
+++ /dev/null
@@ -1,12 +0,0 @@
-# frozen_string_literal: true
-
-class AddExtraShasToCiPipelines < ActiveRecord::Migration[5.0]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- def change
- add_column :ci_pipelines, :source_sha, :binary
- add_column :ci_pipelines, :target_sha, :binary
- end
-end
diff --git a/db/migrate/20190222051615_add_indexes_for_merge_request_diffs_query.rb b/db/migrate/20190222051615_add_indexes_for_merge_request_diffs_query.rb
deleted file mode 100644
index bf7f7b44dec..00000000000
--- a/db/migrate/20190222051615_add_indexes_for_merge_request_diffs_query.rb
+++ /dev/null
@@ -1,42 +0,0 @@
-# frozen_string_literal: true
-
-class AddIndexesForMergeRequestDiffsQuery < ActiveRecord::Migration[5.0]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- INDEX_SPECS = [
- [
- :merge_request_metrics,
- :latest_closed_at,
- { where: 'latest_closed_at IS NOT NULL' }
- ],
- [
- :merge_request_metrics,
- [:merge_request_id, :merged_at],
- { where: 'merged_at IS NOT NULL' }
- ],
- [
- :merge_request_diffs,
- [:merge_request_id, :id],
- {
- name: 'index_merge_request_diffs_on_merge_request_id_and_id_partial',
- where: 'NOT stored_externally OR stored_externally IS NULL'
- }
- ]
- ].freeze
-
- disable_ddl_transaction!
-
- def up
- INDEX_SPECS.each do |spec|
- add_concurrent_index(*spec)
- end
- end
-
- def down
- INDEX_SPECS.reverse_each do |spec|
- remove_concurrent_index(*spec)
- end
- end
-end
diff --git a/db/migrate/20190225152525_add_auto_dev_ops_enabled_to_namespaces.rb b/db/migrate/20190225152525_add_auto_dev_ops_enabled_to_namespaces.rb
deleted file mode 100644
index e4757b6bada..00000000000
--- a/db/migrate/20190225152525_add_auto_dev_ops_enabled_to_namespaces.rb
+++ /dev/null
@@ -1,9 +0,0 @@
-# frozen_string_literal: true
-
-class AddAutoDevOpsEnabledToNamespaces < ActiveRecord::Migration[5.0]
- DOWNTIME = false
-
- def change
- add_column :namespaces, :auto_devops_enabled, :boolean # rubocop:disable Migration/AddColumnsToWideTables
- end
-end
diff --git a/db/migrate/20190225160301_add_runner_tokens_indexes.rb b/db/migrate/20190225160301_add_runner_tokens_indexes.rb
deleted file mode 100644
index 3230c2809de..00000000000
--- a/db/migrate/20190225160301_add_runner_tokens_indexes.rb
+++ /dev/null
@@ -1,24 +0,0 @@
-# frozen_string_literal: true
-
-class AddRunnerTokensIndexes < ActiveRecord::Migration[5.0]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- # It seems that `ci_runners.token_encrypted` and `projects.runners_token_encrypted`
- # are non-unique
-
- def up
- add_concurrent_index :ci_runners, :token_encrypted
- add_concurrent_index :projects, :runners_token_encrypted
- add_concurrent_index :namespaces, :runners_token_encrypted, unique: true
- end
-
- def down
- remove_concurrent_index :ci_runners, :token_encrypted
- remove_concurrent_index :projects, :runners_token_encrypted
- remove_concurrent_index :namespaces, :runners_token_encrypted, unique: true
- end
-end
diff --git a/db/migrate/20190228192410_add_multi_line_attributes_to_suggestion.rb b/db/migrate/20190228192410_add_multi_line_attributes_to_suggestion.rb
deleted file mode 100644
index 4daabb6baa8..00000000000
--- a/db/migrate/20190228192410_add_multi_line_attributes_to_suggestion.rb
+++ /dev/null
@@ -1,19 +0,0 @@
-# frozen_string_literal: true
-
-class AddMultiLineAttributesToSuggestion < ActiveRecord::Migration[5.0]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- add_column_with_default :suggestions, :lines_above, :integer, default: 0, allow_null: false # rubocop:disable Migration/AddColumnWithDefault
- add_column_with_default :suggestions, :lines_below, :integer, default: 0, allow_null: false # rubocop:disable Migration/AddColumnWithDefault
- add_column_with_default :suggestions, :outdated, :boolean, default: false, allow_null: false # rubocop:disable Migration/AddColumnWithDefault
- end
-
- def down
- remove_columns :suggestions, :outdated, :lines_above, :lines_below
- end
-end
diff --git a/db/migrate/20190301182457_add_external_hostname_to_ingress_and_knative.rb b/db/migrate/20190301182457_add_external_hostname_to_ingress_and_knative.rb
deleted file mode 100644
index 4cb6053fbe1..00000000000
--- a/db/migrate/20190301182457_add_external_hostname_to_ingress_and_knative.rb
+++ /dev/null
@@ -1,12 +0,0 @@
-# frozen_string_literal: true
-
-class AddExternalHostnameToIngressAndKnative < ActiveRecord::Migration[5.0]
- DOWNTIME = false
-
- # rubocop:disable Migration/PreventStrings
- def change
- add_column :clusters_applications_ingress, :external_hostname, :string
- add_column :clusters_applications_knative, :external_hostname, :string
- end
- # rubocop:enable Migration/PreventStrings
-end
diff --git a/db/migrate/20190312071108_add_detected_repository_languages_to_projects.rb b/db/migrate/20190312071108_add_detected_repository_languages_to_projects.rb
deleted file mode 100644
index 82e7ec851c9..00000000000
--- a/db/migrate/20190312071108_add_detected_repository_languages_to_projects.rb
+++ /dev/null
@@ -1,12 +0,0 @@
-# frozen_string_literal: true
-
-# See http://doc.gitlab.com/ce/development/migration_style_guide.html
-# for more information on how to write migrations for GitLab.
-
-class AddDetectedRepositoryLanguagesToProjects < ActiveRecord::Migration[5.0]
- DOWNTIME = false
-
- def change
- add_column :projects, :detected_repository_languages, :boolean # rubocop:disable Migration/AddColumnsToWideTables
- end
-end
diff --git a/db/migrate/20190312113229_add_remove_at_to_pages_domains.rb b/db/migrate/20190312113229_add_remove_at_to_pages_domains.rb
deleted file mode 100644
index aa7d2841cd2..00000000000
--- a/db/migrate/20190312113229_add_remove_at_to_pages_domains.rb
+++ /dev/null
@@ -1,10 +0,0 @@
-# frozen_string_literal: true
-
-class AddRemoveAtToPagesDomains < ActiveRecord::Migration[5.0]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
- def change
- add_column :pages_domains, :remove_at, :datetime_with_timezone
- end
-end
diff --git a/db/migrate/20190312113634_add_remove_at_index_to_pages_domains.rb b/db/migrate/20190312113634_add_remove_at_index_to_pages_domains.rb
deleted file mode 100644
index b5ccebd9cfa..00000000000
--- a/db/migrate/20190312113634_add_remove_at_index_to_pages_domains.rb
+++ /dev/null
@@ -1,19 +0,0 @@
-# frozen_string_literal: true
-
-# See http://doc.gitlab.com/ce/development/migration_style_guide.html
-# for more information on how to write migrations for GitLab.
-
-class AddRemoveAtIndexToPagesDomains < ActiveRecord::Migration[5.0]
- include Gitlab::Database::MigrationHelpers
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- add_concurrent_index :pages_domains, :remove_at
- end
-
- def down
- remove_concurrent_index :pages_domains, :remove_at
- end
-end
diff --git a/db/migrate/20190315191339_create_merge_request_assignees_table.rb b/db/migrate/20190315191339_create_merge_request_assignees_table.rb
deleted file mode 100644
index 6fc4463f281..00000000000
--- a/db/migrate/20190315191339_create_merge_request_assignees_table.rb
+++ /dev/null
@@ -1,22 +0,0 @@
-# frozen_string_literal: true
-
-class CreateMergeRequestAssigneesTable < ActiveRecord::Migration[5.0]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- INDEX_NAME = 'index_merge_request_assignees_on_merge_request_id_and_user_id'
-
- def up
- create_table :merge_request_assignees do |t|
- t.references :user, foreign_key: { on_delete: :cascade }, index: true, null: false
- t.references :merge_request, foreign_key: { on_delete: :cascade }, null: false
- end
-
- add_index :merge_request_assignees, [:merge_request_id, :user_id], unique: true, name: INDEX_NAME
- end
-
- def down
- drop_table :merge_request_assignees
- end
-end
diff --git a/db/migrate/20190320174702_add_lets_encrypt_notification_email_to_application_settings.rb b/db/migrate/20190320174702_add_lets_encrypt_notification_email_to_application_settings.rb
deleted file mode 100644
index e0ec10ca204..00000000000
--- a/db/migrate/20190320174702_add_lets_encrypt_notification_email_to_application_settings.rb
+++ /dev/null
@@ -1,17 +0,0 @@
-# frozen_string_literal: true
-
-# See http://doc.gitlab.com/ce/development/migration_style_guide.html
-# for more information on how to write migrations for GitLab.
-
-class AddLetsEncryptNotificationEmailToApplicationSettings < ActiveRecord::Migration[5.0]
- include Gitlab::Database::MigrationHelpers
-
- # Set this constant to true if this migration requires downtime.
- DOWNTIME = false
-
- # rubocop:disable Migration/PreventStrings
- def change
- add_column :application_settings, :lets_encrypt_notification_email, :string
- end
- # rubocop:enable Migration/PreventStrings
-end
diff --git a/db/migrate/20190322164830_add_auto_ssl_enabled_to_pages_domain.rb b/db/migrate/20190322164830_add_auto_ssl_enabled_to_pages_domain.rb
deleted file mode 100644
index 41552b0e2e3..00000000000
--- a/db/migrate/20190322164830_add_auto_ssl_enabled_to_pages_domain.rb
+++ /dev/null
@@ -1,17 +0,0 @@
-# frozen_string_literal: true
-
-class AddAutoSslEnabledToPagesDomain < ActiveRecord::Migration[5.0]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- add_column_with_default :pages_domains, :auto_ssl_enabled, :boolean, default: false # rubocop:disable Migration/AddColumnWithDefault
- end
-
- def down
- remove_column :pages_domains, :auto_ssl_enabled
- end
-end
diff --git a/db/migrate/20190325080727_truncate_user_fullname.rb b/db/migrate/20190325080727_truncate_user_fullname.rb
deleted file mode 100644
index 29255d173d8..00000000000
--- a/db/migrate/20190325080727_truncate_user_fullname.rb
+++ /dev/null
@@ -1,23 +0,0 @@
-# frozen_string_literal: true
-
-# rubocop:disable Migration/UpdateLargeTable
-class TruncateUserFullname < ActiveRecord::Migration[5.0]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- truncated_name = Arel.sql('SUBSTRING(name from 1 for 128)')
- where_clause = Arel.sql("LENGTH(name) > 128")
-
- update_column_in_batches(:users, :name, truncated_name) do |table, query|
- query.where(where_clause)
- end
- end
-
- def down
- # noop
- end
-end
diff --git a/db/migrate/20190325105715_add_fields_to_user_preferences.rb b/db/migrate/20190325105715_add_fields_to_user_preferences.rb
deleted file mode 100644
index 78ccbd65c84..00000000000
--- a/db/migrate/20190325105715_add_fields_to_user_preferences.rb
+++ /dev/null
@@ -1,24 +0,0 @@
-# frozen_string_literal: true
-
-# See http://doc.gitlab.com/ce/development/migration_style_guide.html
-# for more information on how to write migrations for GitLab.
-
-class AddFieldsToUserPreferences < ActiveRecord::Migration[5.0]
- include Gitlab::Database::MigrationHelpers
-
- disable_ddl_transaction!
-
- DOWNTIME = false
-
- def up
- add_column(:user_preferences, :timezone, :string) # rubocop:disable Migration/PreventStrings
- add_column(:user_preferences, :time_display_relative, :boolean)
- add_column(:user_preferences, :time_format_in_24h, :boolean)
- end
-
- def down
- remove_column(:user_preferences, :timezone)
- remove_column(:user_preferences, :time_display_relative)
- remove_column(:user_preferences, :time_format_in_24h)
- end
-end
diff --git a/db/migrate/20190325165127_add_managed_to_cluster.rb b/db/migrate/20190325165127_add_managed_to_cluster.rb
deleted file mode 100644
index 14ed4db143e..00000000000
--- a/db/migrate/20190325165127_add_managed_to_cluster.rb
+++ /dev/null
@@ -1,17 +0,0 @@
-# frozen_string_literal: true
-
-class AddManagedToCluster < ActiveRecord::Migration[5.0]
- include Gitlab::Database::MigrationHelpers
-
- disable_ddl_transaction!
-
- DOWNTIME = false
-
- def up
- add_column_with_default(:clusters, :managed, :boolean, default: true) # rubocop:disable Migration/AddColumnWithDefault
- end
-
- def down
- remove_column(:clusters, :managed)
- end
-end
diff --git a/db/migrate/20190326164045_import_common_metrics_knative.rb b/db/migrate/20190326164045_import_common_metrics_knative.rb
deleted file mode 100644
index 6b331755774..00000000000
--- a/db/migrate/20190326164045_import_common_metrics_knative.rb
+++ /dev/null
@@ -1,15 +0,0 @@
-# frozen_string_literal: true
-
-class ImportCommonMetricsKnative < ActiveRecord::Migration[5.0]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- def up
- ::Gitlab::DatabaseImporters::CommonMetrics::Importer.new.execute
- end
-
- def down
- # no-op
- end
-end
diff --git a/db/migrate/20190327163904_add_notification_email_to_notification_settings.rb b/db/migrate/20190327163904_add_notification_email_to_notification_settings.rb
deleted file mode 100644
index d8a7e96f902..00000000000
--- a/db/migrate/20190327163904_add_notification_email_to_notification_settings.rb
+++ /dev/null
@@ -1,13 +0,0 @@
-# frozen_string_literal: true
-
-class AddNotificationEmailToNotificationSettings < ActiveRecord::Migration[5.0]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- # rubocop:disable Migration/PreventStrings
- def change
- add_column :notification_settings, :notification_email, :string
- end
- # rubocop:enable Migration/PreventStrings
-end
diff --git a/db/migrate/20190329085614_add_lets_encrypt_terms_of_service_accepted_to_application_settings.rb b/db/migrate/20190329085614_add_lets_encrypt_terms_of_service_accepted_to_application_settings.rb
deleted file mode 100644
index 36641e24e45..00000000000
--- a/db/migrate/20190329085614_add_lets_encrypt_terms_of_service_accepted_to_application_settings.rb
+++ /dev/null
@@ -1,21 +0,0 @@
-# frozen_string_literal: true
-
-# See http://doc.gitlab.com/ce/development/migration_style_guide.html
-# for more information on how to write migrations for GitLab.
-
-class AddLetsEncryptTermsOfServiceAcceptedToApplicationSettings < ActiveRecord::Migration[5.0]
- include Gitlab::Database::MigrationHelpers
-
- # Set this constant to true if this migration requires downtime.
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- add_column_with_default(:application_settings, :lets_encrypt_terms_of_service_accepted, :boolean, default: false) # rubocop:disable Migration/AddColumnWithDefault
- end
-
- def down
- remove_column :application_settings, :lets_encrypt_terms_of_service_accepted
- end
-end
diff --git a/db/migrate/20190402150158_backport_enterprise_schema.rb b/db/migrate/20190402150158_backport_enterprise_schema.rb
deleted file mode 100644
index ba5f700a877..00000000000
--- a/db/migrate/20190402150158_backport_enterprise_schema.rb
+++ /dev/null
@@ -1,2195 +0,0 @@
-# frozen_string_literal: true
-
-# rubocop: disable Metrics/AbcSize
-# rubocop: disable Migration/Datetime
-# rubocop: disable Migration/PreventStrings
-# rubocop: disable Migration/AddLimitToTextColumns
-class BackportEnterpriseSchema < ActiveRecord::Migration[5.0]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- APPLICATION_SETTINGS_COLUMNS = [
- { type: :boolean, name: :elasticsearch_indexing, default: false, null: false },
- { type: :boolean, name: :elasticsearch_search, default: false, null: false },
- { type: :integer, name: :shared_runners_minutes, default: 0, null: false },
- { type: :bigint, name: :repository_size_limit, default: 0, null: true },
- { type: :string, name: :elasticsearch_url, default: "http://localhost:9200" },
- { type: :boolean, name: :elasticsearch_aws, default: false, null: false },
- { type: :string, name: :elasticsearch_aws_region, default: "us-east-1", null: true },
- { type: :string, name: :elasticsearch_aws_access_key, default: nil, null: true },
- { type: :string, name: :elasticsearch_aws_secret_access_key, default: nil, null: true },
- { type: :integer, name: :geo_status_timeout, default: 10, null: true },
- { type: :boolean, name: :elasticsearch_experimental_indexer, default: nil, null: true },
- { type: :boolean, name: :check_namespace_plan, default: false, null: false },
- { type: :integer, name: :mirror_max_delay, default: 300, null: false },
- { type: :integer, name: :mirror_max_capacity, default: 100, null: false },
- { type: :integer, name: :mirror_capacity_threshold, default: 50, null: false },
- { type: :boolean, name: :slack_app_enabled, default: false },
- { type: :string, name: :slack_app_id },
- { type: :string, name: :slack_app_secret },
- { type: :string, name: :slack_app_verification_token },
- { type: :boolean, name: :allow_group_owners_to_manage_ldap, default: true, null: false },
- { type: :integer, name: :default_project_creation, default: 2, null: false },
- { type: :string, name: :email_additional_text },
- { type: :integer, name: :file_template_project_id },
- { type: :boolean, name: :pseudonymizer_enabled, default: false, null: false },
- { type: :boolean, name: :snowplow_enabled, default: false, null: false },
- { type: :string, name: :snowplow_collector_uri },
- { type: :string, name: :snowplow_site_id },
- { type: :string, name: :snowplow_cookie_domain },
- { type: :integer, name: :custom_project_templates_group_id },
- { type: :boolean, name: :elasticsearch_limit_indexing, default: false, null: false },
- { type: :string, name: :geo_node_allowed_ips, default: '0.0.0.0/0, ::/0' }
- ].freeze
-
- NAMESPACE_COLUMNS = [
- { type: :integer, name: :custom_project_templates_group_id },
- { type: :integer, name: :file_template_project_id },
- { type: :string, name: :ldap_sync_error },
- { type: :datetime, name: :ldap_sync_last_successful_update_at },
- { type: :datetime, name: :ldap_sync_last_sync_at },
- { type: :datetime, name: :ldap_sync_last_update_at },
- { type: :integer, name: :plan_id },
- { type: :integer, name: :project_creation_level },
- { type: :bigint, name: :repository_size_limit },
- { type: :string, name: :saml_discovery_token },
- { type: :integer, name: :shared_runners_minutes_limit },
- { type: :datetime_with_timezone, name: :trial_ends_on },
- { type: :integer, name: :extra_shared_runners_minutes_limit }
- ].freeze
-
- PROJECT_MIRROR_DATA_COLUMNS = [
- { type: :datetime_with_timezone, name: :last_successful_update_at },
- { type: :datetime_with_timezone, name: :last_update_at },
- { type: :datetime, name: :last_update_scheduled_at },
- { type: :datetime, name: :last_update_started_at },
- { type: :datetime, name: :next_execution_timestamp }
- ].freeze
-
- PROJECTS_COLUMNS = [
- { type: :boolean, name: :disable_overriding_approvers_per_merge_request },
- { type: :string, name: :external_webhook_token },
- { type: :text, name: :issues_template },
- { type: :boolean, name: :merge_requests_author_approval },
- { type: :boolean, name: :merge_requests_disable_committers_approval },
- { type: :boolean, name: :merge_requests_require_code_owner_approval },
- { type: :text, name: :merge_requests_template },
- { type: :datetime, name: :mirror_last_successful_update_at },
- { type: :datetime, name: :mirror_last_update_at },
- { type: :boolean, name: :mirror_overwrites_diverged_branches },
- { type: :integer, name: :mirror_user_id },
- { type: :boolean, name: :only_mirror_protected_branches },
- { type: :boolean, name: :packages_enabled },
- { type: :boolean, name: :pull_mirror_available_overridden },
- { type: :bigint, name: :repository_size_limit },
- { type: :boolean, name: :require_password_to_approve }
- ].freeze
-
- USERS_COLUMNS = [
- { type: :datetime, name: :admin_email_unsubscribed_at },
- { type: :boolean, name: :email_opted_in },
- { type: :datetime, name: :email_opted_in_at },
- { type: :string, name: :email_opted_in_ip },
- { type: :integer, name: :email_opted_in_source_id },
- { type: :integer, name: :group_view },
- { type: :integer, name: :managing_group_id },
- { type: :text, name: :note },
- { type: :integer, name: :roadmap_layout, limit: 2 },
- { type: :boolean, name: :support_bot },
- { type: :integer, name: :bot_type, limit: 2 }
- ].freeze
-
- class ApplicationSetting < ActiveRecord::Base
- self.table_name = 'application_settings'
- end
-
- class ProtectedBranchMergeAccessLevels < ActiveRecord::Base
- self.table_name = 'protected_branch_merge_access_levels'
- end
-
- class ProtectedBranchPushAccessLevels < ActiveRecord::Base
- self.table_name = 'protected_branch_push_access_levels'
- end
-
- class Project < ActiveRecord::Base
- self.table_name = 'projects'
- end
-
- def up
- check_schema!
-
- create_missing_tables
-
- update_appearances
- update_application_settings
- update_boards_table
- update_clusters_applications_prometheus
- update_identities
- update_issues
- update_lists
- update_members
- update_merge_requests
- update_notes
- update_ci_builds
- update_environments
- update_namespaces
- update_notification_settings
- update_project_mirror_data
- update_project_statistics
- update_projects
- update_protected_branch_merge_access_levels
- update_protected_branch_push_access_levels
- update_resource_label_events
- update_user_preferences
- update_users
- update_web_hooks
- update_geo_nodes
-
- add_missing_foreign_keys
- end
-
- def down
- # This migration can not be reverted in a production environment, as doing
- # so would lead to data loss for existing EE installations.
- return if !Rails.env.test? && !Rails.env.development?
-
- remove_foreign_keys
- remove_tables
-
- revert_appearances
- revert_application_settings
- revert_boards_table
- revert_clusters_applications_prometheus
- revert_identities
- revert_issues
- revert_lists
- revert_members
- revert_merge_requests
- revert_notes
- revert_ci_builds
- revert_environments
- revert_namespaces
- revert_notification_settings
- revert_project_mirror_data
- revert_project_statistics
- revert_projects
- revert_protected_branch_merge_access_levels
- revert_protected_branch_push_access_levels
- revert_resource_label_events
- revert_user_preferences
- revert_users
- revert_web_hooks
- end
-
- def add_column_if_not_exists(table, name, *args)
- add_column(table, name, *args) unless column_exists?(table, name)
- end
-
- def remove_column_if_exists(table, column)
- remove_column(table, column) if column_exists?(table, column)
- end
-
- def drop_table_if_exists(table)
- # rubocop:disable Migration/DropTable
- drop_table(table) if table_exists?(table)
- # rubocop:enable Migration/DropTable
- end
-
- def add_column_with_default_if_not_exists(table, name, type, **args)
- unless column_exists?(table, name)
- add_column_with_default(table, name, type, **args) # rubocop:disable Migration/AddColumnWithDefault
- end
- end
-
- def add_missing_columns(table, columns)
- columns.each do |column|
- next if table.column_exists?(column[:name])
-
- # We can't use (public_)send here as this doesn't work with
- # `datetime_with_timezone` for some reason.
- table.column(
- column[:name],
- column[:type],
- default: column[:default],
- null: column.fetch(:null, true),
- limit: column[:limit]
- )
- end
- end
-
- def remove_columns(table, columns)
- columns.each do |column|
- remove_column_if_exists(table, column[:name])
- end
- end
-
- def create_table_if_not_exists(name, **args, &block)
- return if table_exists?(name)
-
- create_table(name, **args, &block)
- end
-
- def add_concurrent_foreign_key(source, target, column:, on_delete: nil, name: nil)
- # We don't want redundant VALIDATE CONSTRAINT statements to run for existing
- # foreign keys, as this can take a long time on large installations such as
- # GitLab.com.
- return if foreign_key_exists?(source, target, column: column)
-
- super
- end
-
- def update_appearances
- add_column_if_not_exists(:appearances, :updated_by, :integer)
- end
-
- def revert_appearances
- remove_column_if_exists(:namespaces, :updated_by)
- end
-
- def update_application_settings
- # In the CE schema this column allows NULL values even though there is a
- # default value. In EE this column is not allowed to be NULL. This means
- # that if we want to add a NOT NULL clause below, we must ensure no existing
- # data would violate this clause.
- ApplicationSetting
- .where(password_authentication_enabled_for_git: nil)
- .update_all(password_authentication_enabled_for_git: true)
-
- change_column_null(
- :application_settings,
- :password_authentication_enabled_for_git,
- false
- )
-
- # This table will only have a single row, and all operations here will be
- # very fast. As such we merge all of this into a single ALTER TABLE
- # statement.
- change_table(:application_settings) do |t|
- t.text(:help_text) unless t.column_exists?(:help_text)
-
- add_missing_columns(t, APPLICATION_SETTINGS_COLUMNS)
- end
-
- add_concurrent_index(
- :application_settings,
- :custom_project_templates_group_id
- )
-
- add_concurrent_index(
- :application_settings,
- :file_template_project_id
- )
- end
-
- def revert_application_settings
- change_column_null(
- :application_settings,
- :password_authentication_enabled_for_git,
- true
- )
-
- remove_concurrent_index(
- :application_settings,
- :custom_project_templates_group_id
- )
-
- remove_concurrent_index(
- :application_settings,
- :file_template_project_id
- )
-
- remove_columns(:application_settings, APPLICATION_SETTINGS_COLUMNS)
- end
-
- def update_boards_table
- add_column_if_not_exists(:boards, :milestone_id, :integer)
- add_column_if_not_exists(:boards, :weight, :integer)
-
- add_column_with_default_if_not_exists(
- :boards,
- :name,
- :string,
- default: 'Development'
- )
-
- add_concurrent_index(:boards, :milestone_id)
- end
-
- def revert_boards_table
- remove_concurrent_index(:boards, :milestone_id)
- remove_column_if_exists(:boards, :name)
- remove_column_if_exists(:boards, :weight)
- remove_column_if_exists(:boards, :milestone_id)
- end
-
- def update_clusters_applications_prometheus
- add_column_if_not_exists(
- :clusters_applications_prometheus,
- :encrypted_alert_manager_token,
- :string
- )
-
- add_column_if_not_exists(
- :clusters_applications_prometheus,
- :encrypted_alert_manager_token_iv,
- :string
- )
-
- add_column_if_not_exists(
- :clusters_applications_prometheus,
- :last_update_started_at,
- :datetime_with_timezone
- )
- end
-
- def revert_clusters_applications_prometheus
- remove_column_if_exists(
- :clusters_applications_prometheus,
- :encrypted_alert_manager_token
- )
-
- remove_column_if_exists(
- :clusters_applications_prometheus,
- :encrypted_alert_manager_token_iv
- )
-
- remove_column_if_exists(
- :clusters_applications_prometheus,
- :last_update_started_at
- )
- end
-
- def update_identities
- add_column_if_not_exists(:identities, :saml_provider_id, :integer)
- add_column_if_not_exists(:identities, :secondary_extern_uid, :string)
-
- add_concurrent_index(
- :identities,
- :saml_provider_id,
- where: 'saml_provider_id IS NOT NULL'
- )
- end
-
- def revert_identities
- remove_column_if_exists(:identities, :saml_provider_id)
- remove_column_if_exists(:identities, :secondary_extern_uid)
- end
-
- def update_issues
- add_column_if_not_exists(:issues, :service_desk_reply_to, :string)
- add_column_if_not_exists(:issues, :weight, :integer)
- end
-
- def revert_issues
- remove_column_if_exists(:issues, :service_desk_reply_to)
- remove_column_if_exists(:issues, :weight)
- end
-
- def update_lists
- add_column_if_not_exists(:lists, :milestone_id, :integer)
- add_column_if_not_exists(:lists, :user_id, :integer)
-
- add_concurrent_index(:lists, :milestone_id)
- add_concurrent_index(:lists, :user_id)
- end
-
- def revert_lists
- remove_column_if_exists(:lists, :milestone_id)
- remove_column_if_exists(:lists, :user_id)
- end
-
- def update_members
- add_column_with_default_if_not_exists(
- :members,
- :ldap,
- :boolean,
- default: false
- )
-
- add_column_with_default_if_not_exists(
- :members,
- :override,
- :boolean,
- default: false
- )
- end
-
- def revert_members
- remove_column_if_exists(:members, :ldap)
- remove_column_if_exists(:members, :override)
- end
-
- def update_merge_requests
- add_column_if_not_exists(:merge_requests, :approvals_before_merge, :integer)
- end
-
- def revert_merge_requests
- remove_column_if_exists(:merge_requests, :approvals_before_merge)
- end
-
- def update_notes
- add_column_if_not_exists(:notes, :review_id, :bigint)
- add_concurrent_index(:notes, :review_id)
- end
-
- def revert_notes
- remove_column_if_exists(:notes, :review_id)
- end
-
- def update_ci_builds
- add_concurrent_index(
- :ci_builds,
- [:name],
- name: 'index_ci_builds_on_name_for_security_products_values',
- where: "
- (
- (name)::text = ANY (
- ARRAY[
- ('container_scanning'::character varying)::text,
- ('dast'::character varying)::text,
- ('dependency_scanning'::character varying)::text,
- ('license_management'::character varying)::text,
- ('sast'::character varying)::text
- ]
- )
- )"
- )
- end
-
- def revert_ci_builds
- remove_concurrent_index_by_name(
- :ci_builds,
- 'index_ci_builds_on_name_for_security_products_values'
- )
- end
-
- def update_environments
- return if index_exists?(:environments, :name, name: 'index_environments_on_name_varchar_pattern_ops')
-
- execute('CREATE INDEX CONCURRENTLY index_environments_on_name_varchar_pattern_ops ON environments (name varchar_pattern_ops);')
- end
-
- def revert_environments
- remove_concurrent_index_by_name(
- :environments,
- 'index_environments_on_name_varchar_pattern_ops'
- )
- end
-
- def update_namespaces
- change_table(:namespaces) do |t|
- add_missing_columns(t, NAMESPACE_COLUMNS)
- end
-
- add_column_with_default_if_not_exists(
- :namespaces,
- :ldap_sync_status,
- :string,
- default: 'ready'
- )
-
- add_column_with_default_if_not_exists(
- :namespaces,
- :membership_lock,
- :boolean,
- default: false,
- allow_null: true
- )
-
- # When `add_concurrent_index` runs, it for some reason incorrectly
- # determines this index does not exist when it does. To work around this, we
- # check the existence by name ourselves.
- unless index_exists_by_name?(:namespaces, 'index_namespaces_on_custom_project_templates_group_id_and_type')
- add_concurrent_index(
- :namespaces,
- %i[custom_project_templates_group_id type],
- where: "(custom_project_templates_group_id IS NOT NULL)"
- )
- end
-
- add_concurrent_index(:namespaces, :file_template_project_id)
- add_concurrent_index(:namespaces, :ldap_sync_last_successful_update_at)
- add_concurrent_index(:namespaces, :ldap_sync_last_update_at)
- add_concurrent_index(:namespaces, :plan_id)
- add_concurrent_index(
- :namespaces,
- :trial_ends_on,
- where: "(trial_ends_on IS NOT NULL)"
- )
-
- unless index_exists_by_name?(:namespaces, 'index_namespaces_on_shared_and_extra_runners_minutes_limit')
- add_concurrent_index(
- :namespaces,
- %i[shared_runners_minutes_limit extra_shared_runners_minutes_limit],
- name: 'index_namespaces_on_shared_and_extra_runners_minutes_limit'
- )
- end
- end
-
- def revert_namespaces
- remove_columns(:namespaces, NAMESPACE_COLUMNS)
- remove_column_if_exists(:namespaces, :ldap_sync_status)
- remove_column_if_exists(:namespaces, :membership_lock)
-
- remove_concurrent_index_by_name(
- :namespaces,
- 'index_namespaces_on_shared_and_extra_runners_minutes_limit'
- )
- end
-
- def update_notification_settings
- add_column_if_not_exists(:notification_settings, :new_epic, :boolean)
- end
-
- def revert_notification_settings
- remove_column_if_exists(:notification_settings, :new_epic)
- end
-
- def update_project_mirror_data
- change_table(:project_mirror_data) do |t|
- add_missing_columns(t, PROJECT_MIRROR_DATA_COLUMNS)
- end
-
- add_column_with_default_if_not_exists(
- :project_mirror_data,
- :retry_count,
- :integer,
- default: 0
- )
-
- add_concurrent_index(:project_mirror_data, :last_successful_update_at)
-
- add_concurrent_index(
- :project_mirror_data,
- %i[next_execution_timestamp retry_count],
- name: 'index_mirror_data_on_next_execution_and_retry_count'
- )
- end
-
- def revert_project_mirror_data
- remove_columns(:project_mirror_data, PROJECT_MIRROR_DATA_COLUMNS)
-
- remove_concurrent_index_by_name(
- :project_mirror_data,
- 'index_mirror_data_on_next_execution_and_retry_count'
- )
-
- remove_column_if_exists(:project_statistics, :retry_count)
- end
-
- def update_project_statistics
- add_column_with_default_if_not_exists(
- :project_statistics,
- :shared_runners_seconds,
- :bigint,
- default: 0
- )
-
- add_column_if_not_exists(
- :project_statistics,
- :shared_runners_seconds_last_reset,
- :datetime
- )
- end
-
- def revert_project_statistics
- remove_column_if_exists(:project_statistics, :shared_runners_seconds)
-
- remove_column_if_exists(
- :project_statistics,
- :shared_runners_seconds_last_reset
- )
- end
-
- def update_projects
- change_table(:projects) do |t|
- add_missing_columns(t, PROJECTS_COLUMNS)
- end
-
- change_column_null(:projects, :merge_requests_rebase_enabled, true)
-
- add_column_with_default_if_not_exists(
- :projects,
- :mirror,
- :boolean,
- default: false
- )
-
- add_column_with_default_if_not_exists(
- :projects,
- :mirror_trigger_builds,
- :boolean,
- default: false
- )
-
- add_column_with_default_if_not_exists(
- :projects,
- :reset_approvals_on_push,
- :boolean,
- default: true,
- allow_null: true
- )
-
- add_column_with_default_if_not_exists(
- :projects,
- :service_desk_enabled,
- :boolean,
- default: true,
- allow_null: true
- )
-
- add_column_with_default_if_not_exists(
- :projects,
- :approvals_before_merge,
- :integer,
- default: 0
- )
-
- add_concurrent_index(
- :projects,
- %i[archived pending_delete merge_requests_require_code_owner_approval],
- name: 'projects_requiring_code_owner_approval',
- where: '((pending_delete = false) AND (archived = false) AND (merge_requests_require_code_owner_approval = true))'
- )
-
- add_concurrent_index(
- :projects,
- %i[id repository_storage last_repository_updated_at],
- name: 'idx_projects_on_repository_storage_last_repository_updated_at'
- )
-
- add_concurrent_index(
- :projects,
- :id,
- name: 'index_projects_on_mirror_and_mirror_trigger_builds_both_true',
- where: '((mirror IS TRUE) AND (mirror_trigger_builds IS TRUE))'
- )
-
- add_concurrent_index(:projects, :mirror_last_successful_update_at)
- end
-
- def revert_projects
- remove_columns(:projects, PROJECTS_COLUMNS)
-
- Project
- .where(merge_requests_rebase_enabled: nil)
- .update_all(merge_requests_rebase_enabled: false)
-
- change_column_null(:projects, :merge_requests_rebase_enabled, false)
-
- remove_column_if_exists(:projects, :mirror)
- remove_column_if_exists(:projects, :mirror_trigger_builds)
- remove_column_if_exists(:projects, :reset_approvals_on_push)
- remove_column_if_exists(:projects, :service_desk_enabled)
- remove_column_if_exists(:projects, :approvals_before_merge)
-
- remove_concurrent_index_by_name(
- :projects,
- 'projects_requiring_code_owner_approval'
- )
-
- remove_concurrent_index_by_name(
- :projects,
- 'idx_projects_on_repository_storage_last_repository_updated_at'
- )
-
- remove_concurrent_index_by_name(
- :projects,
- 'index_projects_on_mirror_and_mirror_trigger_builds_both_true'
- )
- end
-
- def update_protected_branch_merge_access_levels
- change_column_null(:protected_branch_merge_access_levels, :access_level, true)
-
- add_column_if_not_exists(
- :protected_branch_merge_access_levels,
- :group_id,
- :integer
- )
-
- add_column_if_not_exists(
- :protected_branch_merge_access_levels,
- :user_id,
- :integer
- )
-
- add_concurrent_index(:protected_branch_merge_access_levels, :group_id)
- add_concurrent_index(:protected_branch_merge_access_levels, :user_id)
- end
-
- def revert_protected_branch_merge_access_levels
- ProtectedBranchMergeAccessLevels
- .where(access_level: nil)
- .update_all(access_level: false)
-
- change_column_null(
- :protected_branch_merge_access_levels,
- :access_level,
- false
- )
-
- remove_column_if_exists(:protected_branch_merge_access_levels, :group_id)
- remove_column_if_exists(:protected_branch_merge_access_levels, :user_id)
- end
-
- def update_protected_branch_push_access_levels
- change_column_null(
- :protected_branch_push_access_levels,
- :access_level,
- true
- )
-
- add_column_if_not_exists(
- :protected_branch_push_access_levels,
- :group_id,
- :integer
- )
-
- add_column_if_not_exists(
- :protected_branch_push_access_levels,
- :user_id,
- :integer
- )
-
- add_concurrent_index(:protected_branch_push_access_levels, :group_id)
- add_concurrent_index(:protected_branch_push_access_levels, :user_id)
- end
-
- def revert_protected_branch_push_access_levels
- ProtectedBranchPushAccessLevels
- .where(access_level: nil)
- .update_all(access_level: false)
-
- change_column_null(
- :protected_branch_push_access_levels,
- :access_level,
- false
- )
-
- remove_column_if_exists(:protected_branch_push_access_levels, :group_id)
- remove_column_if_exists(:protected_branch_push_access_levels, :user_id)
- end
-
- def update_resource_label_events
- add_column_if_not_exists(:resource_label_events, :epic_id, :integer)
- add_concurrent_index(:resource_label_events, :epic_id)
- end
-
- def revert_resource_label_events
- remove_column_if_exists(:resource_label_events, :epic_id)
- end
-
- def update_user_preferences
- add_column_with_default_if_not_exists(
- :user_preferences,
- :epic_notes_filter,
- :integer,
- default: 0,
- limit: 2
- )
-
- add_column_if_not_exists(:user_preferences, :epics_sort, :string)
- add_column_if_not_exists(:user_preferences, :roadmap_epics_state, :integer)
- add_column_if_not_exists(:user_preferences, :roadmaps_sort, :string)
- end
-
- def revert_user_preferences
- remove_column_if_exists(:user_preferences, :epic_notes_filter)
- remove_column_if_exists(:user_preferences, :epics_sort)
- remove_column_if_exists(:user_preferences, :roadmap_epics_state)
- remove_column_if_exists(:user_preferences, :roadmaps_sort)
- end
-
- def update_users
- add_column_with_default_if_not_exists(
- :users,
- :auditor,
- :boolean,
- default: false
- )
-
- change_table(:users) do |t|
- add_missing_columns(t, USERS_COLUMNS)
- end
-
- add_concurrent_index(:users, :group_view)
- add_concurrent_index(:users, :managing_group_id)
- add_concurrent_index(:users, :support_bot)
- add_concurrent_index(:users, :bot_type)
-
- add_concurrent_index(
- :users,
- :state,
- name: 'index_users_on_state_and_internal_attrs',
- where: '((ghost <> true) AND (support_bot <> true))'
- )
-
- internal_index = 'index_users_on_state_and_internal'
-
- remove_concurrent_index(:users, :state, name: internal_index)
-
- add_concurrent_index(
- :users,
- :state,
- name: internal_index,
- where: '((ghost <> true) AND (bot_type IS NULL))'
- )
- end
-
- def revert_users
- remove_column_if_exists(:users, :auditor)
- remove_columns(:users, USERS_COLUMNS)
-
- remove_concurrent_index_by_name(
- :users,
- 'index_users_on_state_and_internal_attrs'
- )
-
- internal_index = 'index_users_on_state_and_internal'
-
- remove_concurrent_index(:users, :state, name: internal_index)
- add_concurrent_index(:users, :state, name: internal_index)
- end
-
- def update_web_hooks
- add_column_if_not_exists(:web_hooks, :group_id, :integer)
- end
-
- def revert_web_hooks
- remove_column_if_exists(:web_hooks, :group_id)
- end
-
- def update_geo_nodes
- add_column_if_not_exists(:geo_nodes, :internal_url, :string)
- end
-
- def revert_geo_nodes
- remove_column_if_exists(:geo_nodes, :internal_url)
- end
-
- # Some users may have upgraded to EE at some point but downgraded to
- # CE v11.11.3. As a result, their EE tables may not be in the right
- # state. Here we check for these such cases and attempt to guide the
- # user into recovering from this state by upgrading to v11.11.3 EE
- # before installing v12.0.0 CE.
- def check_schema!
- # The following cases will fail later when this migration attempts
- # to add a foreign key for non-existent columns.
- columns_to_check = [
- [:epics, :parent_id], # Added in GitLab 11.7
- [:geo_event_log, :cache_invalidation_event_id], # Added in GitLab 11.4
- [:vulnerability_feedback, :merge_request_id] # Added in GitLab 11.9
- ].freeze
-
- columns_to_check.each do |table, column|
- check_ee_columns!(table, column)
- end
- end
-
- def check_ee_columns!(table, column)
- return unless table_exists?(table)
- return if column_exists?(table, column)
-
- raise_ee_migration_error!(table, column)
- end
-
- def raise_ee_migration_error!(table, column)
- message = "Your database is missing the '#{column}' column from the '#{table}' table that is present for GitLab EE."
-
- message +=
- if ::Gitlab.ee?
- "\nUpgrade your GitLab instance to 11.11.3 EE first!"
- else
- <<~MSG
-
- Even though it looks like you're running a CE installation, it appears
- you may have installed GitLab EE at some point. To migrate to GitLab 12.0:
-
- 1. Install GitLab 11.11.3 EE
- 2. Install GitLab 12.0.x CE
- MSG
- end
-
- raise StandardError, message
- end
-
- def create_missing_tables
- create_table_if_not_exists "approval_merge_request_rule_sources", id: :bigserial do |t|
- t.bigint "approval_merge_request_rule_id", null: false
- t.bigint "approval_project_rule_id", null: false
- t.index %w[approval_merge_request_rule_id], name: "index_approval_merge_request_rule_sources_1", unique: true, using: :btree
- t.index %w[approval_project_rule_id], name: "index_approval_merge_request_rule_sources_2", using: :btree
- end
-
- create_table_if_not_exists "approval_merge_request_rules", id: :bigserial do |t|
- t.datetime_with_timezone "created_at", null: false
- t.datetime_with_timezone "updated_at", null: false
- t.integer "merge_request_id", null: false
- t.integer "approvals_required", limit: 2, default: 0, null: false
- t.boolean "code_owner", default: false, null: false
- t.string "name", null: false
- t.index %w[merge_request_id code_owner name], name: "approval_rule_name_index_for_code_owners", unique: true, where: "(code_owner = true)", using: :btree
- t.index %w[merge_request_id code_owner], name: "index_approval_merge_request_rules_1", using: :btree
- end
-
- create_table_if_not_exists "approval_merge_request_rules_approved_approvers", id: :bigserial do |t|
- t.bigint "approval_merge_request_rule_id", null: false
- t.integer "user_id", null: false
- t.index %w[approval_merge_request_rule_id user_id], name: "index_approval_merge_request_rules_approved_approvers_1", unique: true, using: :btree
- t.index %w[user_id], name: "index_approval_merge_request_rules_approved_approvers_2", using: :btree
- end
-
- create_table_if_not_exists "approval_merge_request_rules_groups", id: :bigserial do |t|
- t.bigint "approval_merge_request_rule_id", null: false
- t.integer "group_id", null: false
- t.index %w[approval_merge_request_rule_id group_id], name: "index_approval_merge_request_rules_groups_1", unique: true, using: :btree
- t.index %w[group_id], name: "index_approval_merge_request_rules_groups_2", using: :btree
- end
-
- create_table_if_not_exists "approval_merge_request_rules_users", id: :bigserial do |t|
- t.bigint "approval_merge_request_rule_id", null: false
- t.integer "user_id", null: false
- t.index %w[approval_merge_request_rule_id user_id], name: "index_approval_merge_request_rules_users_1", unique: true, using: :btree
- t.index %w[user_id], name: "index_approval_merge_request_rules_users_2", using: :btree
- end
-
- create_table_if_not_exists "approval_project_rules", id: :bigserial do |t|
- t.datetime_with_timezone "created_at", null: false
- t.datetime_with_timezone "updated_at", null: false
- t.integer "project_id", null: false
- t.integer "approvals_required", limit: 2, default: 0, null: false
- t.string "name", null: false
- t.index %w[project_id], name: "index_approval_project_rules_on_project_id", using: :btree
- end
-
- create_table_if_not_exists "approval_project_rules_groups", id: :bigserial do |t|
- t.bigint "approval_project_rule_id", null: false
- t.integer "group_id", null: false
- t.index %w[approval_project_rule_id group_id], name: "index_approval_project_rules_groups_1", unique: true, using: :btree
- t.index %w[group_id], name: "index_approval_project_rules_groups_2", using: :btree
- end
-
- create_table_if_not_exists "approval_project_rules_users", id: :bigserial do |t|
- t.bigint "approval_project_rule_id", null: false
- t.integer "user_id", null: false
- t.index %w[approval_project_rule_id user_id], name: "index_approval_project_rules_users_1", unique: true, using: :btree
- t.index %w[user_id], name: "index_approval_project_rules_users_2", using: :btree
- end
-
- create_table_if_not_exists "approvals" do |t|
- t.integer "merge_request_id", null: false
- t.integer "user_id", null: false
- t.datetime "created_at"
- t.datetime "updated_at"
- t.index %w[merge_request_id], name: "index_approvals_on_merge_request_id", using: :btree
- end
-
- create_table_if_not_exists "approver_groups" do |t|
- t.integer "target_id", null: false
- t.string "target_type", null: false
- t.integer "group_id", null: false
- t.datetime "created_at"
- t.datetime "updated_at"
- t.index %w[group_id], name: "index_approver_groups_on_group_id", using: :btree
- t.index %w[target_id target_type], name: "index_approver_groups_on_target_id_and_target_type", using: :btree
- end
-
- create_table_if_not_exists "approvers" do |t|
- t.integer "target_id", null: false
- t.string "target_type"
- t.integer "user_id", null: false
- t.datetime "created_at"
- t.datetime "updated_at"
- t.index %w[target_id target_type], name: "index_approvers_on_target_id_and_target_type", using: :btree
- t.index %w[user_id], name: "index_approvers_on_user_id", using: :btree
- end
-
- create_table_if_not_exists "board_assignees" do |t|
- t.integer "board_id", null: false
- t.integer "assignee_id", null: false
- t.index %w[assignee_id], name: "index_board_assignees_on_assignee_id", using: :btree
- t.index %w[board_id assignee_id], name: "index_board_assignees_on_board_id_and_assignee_id", unique: true, using: :btree
- end
-
- create_table_if_not_exists "board_labels" do |t|
- t.integer "board_id", null: false
- t.integer "label_id", null: false
- t.index %w[board_id label_id], name: "index_board_labels_on_board_id_and_label_id", unique: true, using: :btree
- t.index %w[label_id], name: "index_board_labels_on_label_id", using: :btree
- end
-
- create_table_if_not_exists "ci_sources_pipelines" do |t|
- t.integer "project_id"
- t.integer "pipeline_id"
- t.integer "source_project_id"
- t.integer "source_job_id"
- t.integer "source_pipeline_id"
- t.index ["pipeline_id"], name: "index_ci_sources_pipelines_on_pipeline_id", using: :btree
- t.index ["project_id"], name: "index_ci_sources_pipelines_on_project_id", using: :btree
- t.index ["source_job_id"], name: "index_ci_sources_pipelines_on_source_job_id", using: :btree
- t.index ["source_pipeline_id"], name: "index_ci_sources_pipelines_on_source_pipeline_id", using: :btree
- t.index ["source_project_id"], name: "index_ci_sources_pipelines_on_source_project_id", using: :btree
- end
-
- create_table_if_not_exists "design_management_designs", id: :bigserial, force: :cascade do |t|
- t.integer "project_id", null: false
- t.integer "issue_id", null: false
- t.string "filename", null: false
- t.index %w[issue_id filename], name: "index_design_management_designs_on_issue_id_and_filename", unique: true, using: :btree
- t.index ["project_id"], name: "index_design_management_designs_on_project_id", using: :btree
- end
-
- create_table_if_not_exists "design_management_designs_versions", id: false, force: :cascade do |t|
- t.bigint "design_id", null: false
- t.bigint "version_id", null: false
- t.index %w[design_id version_id], name: "design_management_designs_versions_uniqueness", unique: true, using: :btree
- t.index ["design_id"], name: "index_design_management_designs_versions_on_design_id", using: :btree
- t.index ["version_id"], name: "index_design_management_designs_versions_on_version_id", using: :btree
- end
-
- create_table_if_not_exists "design_management_versions", id: :bigserial, force: :cascade do |t|
- t.binary "sha", null: false
- t.index ["sha"], name: "index_design_management_versions_on_sha", unique: true, using: :btree
- end
-
- create_table_if_not_exists "draft_notes", id: :bigserial do |t|
- t.integer "merge_request_id", null: false
- t.integer "author_id", null: false
- t.boolean "resolve_discussion", default: false, null: false
- t.string "discussion_id"
- t.text "note", null: false
- t.text "position"
- t.text "original_position"
- t.text "change_position"
- t.index ["author_id"], name: "index_draft_notes_on_author_id", using: :btree
- t.index ["discussion_id"], name: "index_draft_notes_on_discussion_id", using: :btree
- t.index ["merge_request_id"], name: "index_draft_notes_on_merge_request_id", using: :btree
- end
-
- create_table_if_not_exists "elasticsearch_indexed_namespaces", id: false do |t|
- t.datetime_with_timezone "created_at", null: false
- t.datetime_with_timezone "updated_at", null: false
- t.integer "namespace_id"
- t.index ["namespace_id"], name: "index_elasticsearch_indexed_namespaces_on_namespace_id", unique: true, using: :btree
- end
-
- create_table_if_not_exists "elasticsearch_indexed_projects", id: false do |t|
- t.datetime_with_timezone "created_at", null: false
- t.datetime_with_timezone "updated_at", null: false
- t.integer "project_id"
- t.index ["project_id"], name: "index_elasticsearch_indexed_projects_on_project_id", unique: true, using: :btree
- end
-
- create_table_if_not_exists "epic_issues" do |t|
- t.integer "epic_id", null: false
- t.integer "issue_id", null: false
- t.integer "relative_position", default: 1073741823, null: false
- t.index ["epic_id"], name: "index_epic_issues_on_epic_id", using: :btree
- t.index ["issue_id"], name: "index_epic_issues_on_issue_id", unique: true, using: :btree
- end
-
- create_table_if_not_exists "epic_metrics" do |t|
- t.integer "epic_id", null: false
- t.datetime "created_at", null: false
- t.datetime "updated_at", null: false
- t.index ["epic_id"], name: "index_epic_metrics", using: :btree
- end
-
- create_table_if_not_exists "epics" do |t|
- t.integer "milestone_id"
- t.integer "group_id", null: false
- t.integer "author_id", null: false
- t.integer "assignee_id"
- t.integer "iid", null: false
- t.integer "cached_markdown_version"
- t.integer "updated_by_id"
- t.integer "last_edited_by_id"
- t.integer "lock_version"
- t.date "start_date"
- t.date "end_date"
- t.datetime "last_edited_at"
- t.datetime "created_at", null: false
- t.datetime "updated_at", null: false
- t.string "title", null: false
- t.string "title_html", null: false
- t.text "description"
- t.text "description_html"
- t.integer "start_date_sourcing_milestone_id"
- t.integer "due_date_sourcing_milestone_id"
- t.date "start_date_fixed"
- t.date "due_date_fixed"
- t.boolean "start_date_is_fixed"
- t.boolean "due_date_is_fixed"
- t.integer "state", limit: 2, default: 1, null: false
- t.integer "closed_by_id"
- t.datetime "closed_at"
- t.integer "parent_id"
- t.integer "relative_position"
- t.index ["assignee_id"], name: "index_epics_on_assignee_id", using: :btree
- t.index ["author_id"], name: "index_epics_on_author_id", using: :btree
- t.index ["closed_by_id"], name: "index_epics_on_closed_by_id", using: :btree
- t.index ["end_date"], name: "index_epics_on_end_date", using: :btree
- t.index ["group_id"], name: "index_epics_on_group_id", using: :btree
- t.index ["iid"], name: "index_epics_on_iid", using: :btree
- t.index ["milestone_id"], name: "index_milestone", using: :btree
- t.index ["parent_id"], name: "index_epics_on_parent_id", using: :btree
- t.index ["start_date"], name: "index_epics_on_start_date", using: :btree
- end
-
- create_table_if_not_exists "geo_cache_invalidation_events", id: :bigserial do |t|
- t.string "key", null: false
- end
-
- create_table_if_not_exists "geo_event_log", id: :bigserial do |t|
- t.datetime "created_at", null: false
- t.bigint "repository_updated_event_id"
- t.bigint "repository_deleted_event_id"
- t.bigint "repository_renamed_event_id"
- t.bigint "repositories_changed_event_id"
- t.bigint "repository_created_event_id"
- t.bigint "hashed_storage_migrated_event_id"
- t.bigint "lfs_object_deleted_event_id"
- t.bigint "hashed_storage_attachments_event_id"
- t.bigint "upload_deleted_event_id"
- t.bigint "job_artifact_deleted_event_id"
- t.bigint "reset_checksum_event_id"
- t.bigint "cache_invalidation_event_id"
- t.index ["cache_invalidation_event_id"], name: "index_geo_event_log_on_cache_invalidation_event_id", where: "(cache_invalidation_event_id IS NOT NULL)", using: :btree
- t.index ["hashed_storage_attachments_event_id"], name: "index_geo_event_log_on_hashed_storage_attachments_event_id", where: "(hashed_storage_attachments_event_id IS NOT NULL)", using: :btree
- t.index ["hashed_storage_migrated_event_id"], name: "index_geo_event_log_on_hashed_storage_migrated_event_id", where: "(hashed_storage_migrated_event_id IS NOT NULL)", using: :btree
- t.index ["job_artifact_deleted_event_id"], name: "index_geo_event_log_on_job_artifact_deleted_event_id", where: "(job_artifact_deleted_event_id IS NOT NULL)", using: :btree
- t.index ["lfs_object_deleted_event_id"], name: "index_geo_event_log_on_lfs_object_deleted_event_id", where: "(lfs_object_deleted_event_id IS NOT NULL)", using: :btree
- t.index ["repositories_changed_event_id"], name: "index_geo_event_log_on_repositories_changed_event_id", where: "(repositories_changed_event_id IS NOT NULL)", using: :btree
- t.index ["repository_created_event_id"], name: "index_geo_event_log_on_repository_created_event_id", where: "(repository_created_event_id IS NOT NULL)", using: :btree
- t.index ["repository_deleted_event_id"], name: "index_geo_event_log_on_repository_deleted_event_id", where: "(repository_deleted_event_id IS NOT NULL)", using: :btree
- t.index ["repository_renamed_event_id"], name: "index_geo_event_log_on_repository_renamed_event_id", where: "(repository_renamed_event_id IS NOT NULL)", using: :btree
- t.index ["repository_updated_event_id"], name: "index_geo_event_log_on_repository_updated_event_id", where: "(repository_updated_event_id IS NOT NULL)", using: :btree
- t.index ["reset_checksum_event_id"], name: "index_geo_event_log_on_reset_checksum_event_id", where: "(reset_checksum_event_id IS NOT NULL)", using: :btree
- t.index ["upload_deleted_event_id"], name: "index_geo_event_log_on_upload_deleted_event_id", where: "(upload_deleted_event_id IS NOT NULL)", using: :btree
- end
-
- create_table_if_not_exists "geo_hashed_storage_attachments_events", id: :bigserial do |t|
- t.integer "project_id", null: false
- t.text "old_attachments_path", null: false
- t.text "new_attachments_path", null: false
- t.index ["project_id"], name: "index_geo_hashed_storage_attachments_events_on_project_id", using: :btree
- end
-
- create_table_if_not_exists "geo_hashed_storage_migrated_events", id: :bigserial do |t|
- t.integer "project_id", null: false
- t.text "repository_storage_name", null: false
- t.text "old_disk_path", null: false
- t.text "new_disk_path", null: false
- t.text "old_wiki_disk_path", null: false
- t.text "new_wiki_disk_path", null: false
- t.integer "old_storage_version", limit: 2
- t.integer "new_storage_version", limit: 2, null: false
- t.index ["project_id"], name: "index_geo_hashed_storage_migrated_events_on_project_id", using: :btree
- end
-
- create_table_if_not_exists "geo_job_artifact_deleted_events", id: :bigserial do |t|
- t.integer "job_artifact_id", null: false
- t.string "file_path", null: false
- t.index ["job_artifact_id"], name: "index_geo_job_artifact_deleted_events_on_job_artifact_id", using: :btree
- end
-
- create_table_if_not_exists "geo_lfs_object_deleted_events", id: :bigserial do |t|
- t.integer "lfs_object_id", null: false
- t.string "oid", null: false
- t.string "file_path", null: false
- t.index ["lfs_object_id"], name: "index_geo_lfs_object_deleted_events_on_lfs_object_id", using: :btree
- end
-
- create_table_if_not_exists "geo_node_namespace_links" do |t|
- t.integer "geo_node_id", null: false
- t.integer "namespace_id", null: false
- t.datetime "created_at", null: false
- t.datetime "updated_at", null: false
- t.index %w[geo_node_id namespace_id], name: "index_geo_node_namespace_links_on_geo_node_id_and_namespace_id", unique: true, using: :btree
- t.index ["geo_node_id"], name: "index_geo_node_namespace_links_on_geo_node_id", using: :btree
- t.index ["namespace_id"], name: "index_geo_node_namespace_links_on_namespace_id", using: :btree
- end
-
- create_table_if_not_exists "geo_node_statuses" do |t|
- t.integer "geo_node_id", null: false
- t.integer "db_replication_lag_seconds"
- t.integer "repositories_synced_count"
- t.integer "repositories_failed_count"
- t.integer "lfs_objects_count"
- t.integer "lfs_objects_synced_count"
- t.integer "lfs_objects_failed_count"
- t.integer "attachments_count"
- t.integer "attachments_synced_count"
- t.integer "attachments_failed_count"
- t.integer "last_event_id"
- t.datetime "last_event_date"
- t.integer "cursor_last_event_id"
- t.datetime "cursor_last_event_date"
- t.datetime "created_at", null: false
- t.datetime "updated_at", null: false
- t.datetime "last_successful_status_check_at"
- t.string "status_message"
- t.integer "replication_slots_count"
- t.integer "replication_slots_used_count"
- t.bigint "replication_slots_max_retained_wal_bytes"
- t.integer "wikis_synced_count"
- t.integer "wikis_failed_count"
- t.integer "job_artifacts_count"
- t.integer "job_artifacts_synced_count"
- t.integer "job_artifacts_failed_count"
- t.string "version"
- t.string "revision"
- t.integer "repositories_verified_count"
- t.integer "repositories_verification_failed_count"
- t.integer "wikis_verified_count"
- t.integer "wikis_verification_failed_count"
- t.integer "lfs_objects_synced_missing_on_primary_count"
- t.integer "job_artifacts_synced_missing_on_primary_count"
- t.integer "attachments_synced_missing_on_primary_count"
- t.integer "repositories_checksummed_count"
- t.integer "repositories_checksum_failed_count"
- t.integer "repositories_checksum_mismatch_count"
- t.integer "wikis_checksummed_count"
- t.integer "wikis_checksum_failed_count"
- t.integer "wikis_checksum_mismatch_count"
- t.binary "storage_configuration_digest"
- t.integer "repositories_retrying_verification_count"
- t.integer "wikis_retrying_verification_count"
- t.integer "projects_count"
- t.index ["geo_node_id"], name: "index_geo_node_statuses_on_geo_node_id", unique: true, using: :btree
- end
-
- create_table_if_not_exists "geo_nodes" do |t|
- t.boolean "primary"
- t.integer "oauth_application_id"
- t.boolean "enabled", default: true, null: false
- t.string "access_key"
- t.string "encrypted_secret_access_key"
- t.string "encrypted_secret_access_key_iv"
- t.string "clone_url_prefix"
- t.integer "files_max_capacity", default: 10, null: false
- t.integer "repos_max_capacity", default: 25, null: false
- t.string "url", null: false
- t.string "selective_sync_type"
- t.text "selective_sync_shards"
- t.integer "verification_max_capacity", default: 100, null: false
- t.integer "minimum_reverification_interval", default: 7, null: false
- t.string "alternate_url"
- t.index ["access_key"], name: "index_geo_nodes_on_access_key", using: :btree
- t.index ["primary"], name: "index_geo_nodes_on_primary", using: :btree
- t.index ["url"], name: "index_geo_nodes_on_url", unique: true, using: :btree
- end
-
- create_table_if_not_exists "geo_repositories_changed_events", id: :bigserial do |t|
- t.integer "geo_node_id", null: false
- t.index ["geo_node_id"], name: "index_geo_repositories_changed_events_on_geo_node_id", using: :btree
- end
-
- create_table_if_not_exists "geo_repository_created_events", id: :bigserial do |t|
- t.integer "project_id", null: false
- t.text "repository_storage_name", null: false
- t.text "repo_path", null: false
- t.text "wiki_path"
- t.text "project_name", null: false
- t.index ["project_id"], name: "index_geo_repository_created_events_on_project_id", using: :btree
- end
-
- create_table_if_not_exists "geo_repository_deleted_events", id: :bigserial do |t|
- t.integer "project_id", null: false
- t.text "repository_storage_name", null: false
- t.text "deleted_path", null: false
- t.text "deleted_wiki_path"
- t.text "deleted_project_name", null: false
- t.index ["project_id"], name: "index_geo_repository_deleted_events_on_project_id", using: :btree
- end
-
- create_table_if_not_exists "geo_repository_renamed_events", id: :bigserial do |t|
- t.integer "project_id", null: false
- t.text "repository_storage_name", null: false
- t.text "old_path_with_namespace", null: false
- t.text "new_path_with_namespace", null: false
- t.text "old_wiki_path_with_namespace", null: false
- t.text "new_wiki_path_with_namespace", null: false
- t.text "old_path", null: false
- t.text "new_path", null: false
- t.index ["project_id"], name: "index_geo_repository_renamed_events_on_project_id", using: :btree
- end
-
- create_table_if_not_exists "geo_repository_updated_events", id: :bigserial do |t|
- t.integer "branches_affected", null: false
- t.integer "tags_affected", null: false
- t.integer "project_id", null: false
- t.integer "source", limit: 2, null: false
- t.boolean "new_branch", default: false, null: false
- t.boolean "remove_branch", default: false, null: false
- t.text "ref"
- t.index ["project_id"], name: "index_geo_repository_updated_events_on_project_id", using: :btree
- t.index ["source"], name: "index_geo_repository_updated_events_on_source", using: :btree
- end
-
- create_table_if_not_exists "geo_reset_checksum_events", id: :bigserial do |t|
- t.integer "project_id", null: false
- t.index ["project_id"], name: "index_geo_reset_checksum_events_on_project_id", using: :btree
- end
-
- create_table_if_not_exists "geo_upload_deleted_events", id: :bigserial do |t|
- t.integer "upload_id", null: false
- t.string "file_path", null: false
- t.integer "model_id", null: false
- t.string "model_type", null: false
- t.string "uploader", null: false
- t.index ["upload_id"], name: "index_geo_upload_deleted_events_on_upload_id", using: :btree
- end
-
- create_table_if_not_exists "gitlab_subscriptions", id: :bigserial do |t|
- t.datetime_with_timezone "created_at", null: false
- t.datetime_with_timezone "updated_at", null: false
- t.date "start_date"
- t.date "end_date"
- t.date "trial_ends_on"
- t.integer "namespace_id"
- t.integer "hosted_plan_id"
- t.integer "max_seats_used", default: 0
- t.integer "seats", default: 0
- t.boolean "trial", default: false
- t.index ["hosted_plan_id"], name: "index_gitlab_subscriptions_on_hosted_plan_id", using: :btree
- t.index ["namespace_id"], name: "index_gitlab_subscriptions_on_namespace_id", unique: true, using: :btree
- end
-
- create_table_if_not_exists "historical_data" do |t|
- t.date "date", null: false
- t.integer "active_user_count"
- t.datetime "created_at"
- t.datetime "updated_at"
- end
-
- create_table_if_not_exists "index_statuses" do |t|
- t.integer "project_id", null: false
- t.datetime "indexed_at"
- t.text "note"
- t.string "last_commit"
- t.datetime "created_at", null: false
- t.datetime "updated_at", null: false
- t.index ["project_id"], name: "index_index_statuses_on_project_id", unique: true, using: :btree
- end
-
- create_table_if_not_exists "insights" do |t|
- t.integer "namespace_id", null: false
- t.integer "project_id", null: false
- t.index ["namespace_id"], name: "index_insights_on_namespace_id", using: :btree
- t.index ["project_id"], name: "index_insights_on_project_id", using: :btree
- end
-
- create_table_if_not_exists "issue_links" do |t|
- t.integer "source_id", null: false
- t.integer "target_id", null: false
- t.datetime "created_at"
- t.datetime "updated_at"
- t.index %w[source_id target_id], name: "index_issue_links_on_source_id_and_target_id", unique: true, using: :btree
- t.index ["source_id"], name: "index_issue_links_on_source_id", using: :btree
- t.index ["target_id"], name: "index_issue_links_on_target_id", using: :btree
- end
-
- create_table_if_not_exists "jira_connect_installations", id: :bigserial do |t|
- t.string "client_key"
- t.string "encrypted_shared_secret"
- t.string "encrypted_shared_secret_iv"
- t.string "base_url"
- t.index ["client_key"], name: "index_jira_connect_installations_on_client_key", unique: true, using: :btree
- end
-
- create_table_if_not_exists "jira_connect_subscriptions", id: :bigserial do |t|
- t.datetime_with_timezone "created_at", null: false
- t.bigint "jira_connect_installation_id", null: false
- t.integer "namespace_id", null: false
- t.datetime_with_timezone "updated_at", null: false
- t.index %w[jira_connect_installation_id namespace_id], name: "idx_jira_connect_subscriptions_on_installation_id_namespace_id", unique: true, using: :btree
- t.index ["jira_connect_installation_id"], name: "idx_jira_connect_subscriptions_on_installation_id", using: :btree
- t.index ["namespace_id"], name: "index_jira_connect_subscriptions_on_namespace_id", using: :btree
- end
-
- create_table_if_not_exists "ldap_group_links" do |t|
- t.string "cn"
- t.integer "group_access", null: false
- t.integer "group_id", null: false
- t.datetime "created_at"
- t.datetime "updated_at"
- t.string "provider"
- t.string "filter"
- end
-
- create_table_if_not_exists "licenses" do |t|
- t.text "data", null: false
- t.datetime "created_at"
- t.datetime "updated_at"
- end
-
- create_table_if_not_exists "namespace_statistics" do |t|
- t.integer "namespace_id", null: false
- t.integer "shared_runners_seconds", default: 0, null: false
- t.datetime "shared_runners_seconds_last_reset"
- t.index ["namespace_id"], name: "index_namespace_statistics_on_namespace_id", unique: true, using: :btree
- end
-
- create_table_if_not_exists "operations_feature_flag_scopes", id: :bigserial do |t|
- t.bigint "feature_flag_id", null: false
- t.datetime_with_timezone "created_at", null: false
- t.datetime_with_timezone "updated_at", null: false
- t.boolean "active", null: false
- t.string "environment_scope", default: "*", null: false
- t.index %w[feature_flag_id environment_scope], name: "index_feature_flag_scopes_on_flag_id_and_environment_scope", unique: true, using: :btree
- end
-
- create_table_if_not_exists "operations_feature_flags", id: :bigserial do |t|
- t.integer "project_id", null: false
- t.boolean "active", null: false
- t.datetime_with_timezone "created_at", null: false
- t.datetime_with_timezone "updated_at", null: false
- t.string "name", null: false
- t.text "description"
- t.index %w[project_id name], name: "index_operations_feature_flags_on_project_id_and_name", unique: true, using: :btree
- end
-
- create_table_if_not_exists "operations_feature_flags_clients", id: :bigserial do |t|
- t.integer "project_id", null: false
- t.string "token", null: false
- t.index %w[project_id token], name: "index_operations_feature_flags_clients_on_project_id_and_token", unique: true, using: :btree
- end
-
- create_table_if_not_exists "packages_maven_metadata", id: :bigserial do |t|
- t.bigint "package_id", null: false
- t.datetime_with_timezone "created_at", null: false
- t.datetime_with_timezone "updated_at", null: false
- t.string "app_group", null: false
- t.string "app_name", null: false
- t.string "app_version"
- t.string "path", limit: 512, null: false
- t.index %w[package_id path], name: "index_packages_maven_metadata_on_package_id_and_path", using: :btree
- end
-
- create_table_if_not_exists "packages_package_files", id: :bigserial do |t|
- t.bigint "package_id", null: false
- t.datetime_with_timezone "created_at", null: false
- t.datetime_with_timezone "updated_at", null: false
- t.bigint "size"
- t.integer "file_type"
- t.integer "file_store"
- t.binary "file_md5"
- t.binary "file_sha1"
- t.string "file_name", null: false
- t.text "file", null: false
- t.index %w[package_id file_name], name: "index_packages_package_files_on_package_id_and_file_name", using: :btree
- end
-
- create_table_if_not_exists "packages_packages", id: :bigserial do |t|
- t.integer "project_id", null: false
- t.datetime_with_timezone "created_at", null: false
- t.datetime_with_timezone "updated_at", null: false
- t.string "name", null: false
- t.string "version"
- t.integer "package_type", limit: 2, null: false
- t.index ["project_id"], name: "index_packages_packages_on_project_id", using: :btree
- end
-
- create_table_if_not_exists "path_locks" do |t|
- t.string "path", null: false
- t.integer "project_id"
- t.integer "user_id"
- t.datetime "created_at", null: false
- t.datetime "updated_at", null: false
- t.index ["path"], name: "index_path_locks_on_path", using: :btree
- t.index ["project_id"], name: "index_path_locks_on_project_id", using: :btree
- t.index ["user_id"], name: "index_path_locks_on_user_id", using: :btree
- end
-
- create_table_if_not_exists "plans" do |t|
- t.datetime "created_at", null: false
- t.datetime "updated_at", null: false
- t.string "name"
- t.string "title"
- t.integer "active_pipelines_limit"
- t.integer "pipeline_size_limit"
- t.index ["name"], name: "index_plans_on_name", using: :btree
- end
-
- create_table_if_not_exists "project_alerting_settings", primary_key: "project_id", id: :integer do |t|
- t.string "encrypted_token", null: false
- t.string "encrypted_token_iv", null: false
- end
-
- create_table_if_not_exists "project_feature_usages", primary_key: "project_id", id: :integer do |t|
- t.datetime "jira_dvcs_cloud_last_sync_at"
- t.datetime "jira_dvcs_server_last_sync_at"
- t.index %w[jira_dvcs_cloud_last_sync_at project_id], name: "idx_proj_feat_usg_on_jira_dvcs_cloud_last_sync_at_and_proj_id", where: "(jira_dvcs_cloud_last_sync_at IS NOT NULL)", using: :btree
- t.index %w[jira_dvcs_server_last_sync_at project_id], name: "idx_proj_feat_usg_on_jira_dvcs_server_last_sync_at_and_proj_id", where: "(jira_dvcs_server_last_sync_at IS NOT NULL)", using: :btree
- t.index ["project_id"], name: "index_project_feature_usages_on_project_id", using: :btree
- end
-
- create_table_if_not_exists "project_incident_management_settings", primary_key: "project_id", id: :integer do |t|
- t.boolean "create_issue", default: false, null: false
- t.boolean "send_email", default: true, null: false
- t.text "issue_template_key"
- end
-
- create_table_if_not_exists "project_repository_states" do |t|
- t.integer "project_id", null: false
- t.binary "repository_verification_checksum"
- t.binary "wiki_verification_checksum"
- t.string "last_repository_verification_failure"
- t.string "last_wiki_verification_failure"
- t.datetime_with_timezone "repository_retry_at"
- t.datetime_with_timezone "wiki_retry_at"
- t.integer "repository_retry_count"
- t.integer "wiki_retry_count"
- t.datetime_with_timezone "last_repository_verification_ran_at"
- t.datetime_with_timezone "last_wiki_verification_ran_at"
- t.index ["last_repository_verification_failure"], name: "idx_repository_states_on_repository_failure_partial", where: "(last_repository_verification_failure IS NOT NULL)", using: :btree
- t.index ["last_wiki_verification_failure"], name: "idx_repository_states_on_wiki_failure_partial", where: "(last_wiki_verification_failure IS NOT NULL)", using: :btree
- t.index %w[project_id last_repository_verification_ran_at], name: "idx_repository_states_on_last_repository_verification_ran_at", where: "((repository_verification_checksum IS NOT NULL) AND (last_repository_verification_failure IS NULL))", using: :btree
- t.index %w[project_id last_wiki_verification_ran_at], name: "idx_repository_states_on_last_wiki_verification_ran_at", where: "((wiki_verification_checksum IS NOT NULL) AND (last_wiki_verification_failure IS NULL))", using: :btree
- t.index ["project_id"], name: "idx_repository_states_outdated_checksums", where: "(((repository_verification_checksum IS NULL) AND (last_repository_verification_failure IS NULL)) OR ((wiki_verification_checksum IS NULL) AND (last_wiki_verification_failure IS NULL)))", using: :btree
- t.index ["project_id"], name: "index_project_repository_states_on_project_id", unique: true, using: :btree
- end
-
- create_table_if_not_exists "project_tracing_settings", id: :bigserial do |t|
- t.datetime_with_timezone "created_at", null: false
- t.datetime_with_timezone "updated_at", null: false
- t.integer "project_id", null: false
- t.string "external_url", null: false
- t.index ["project_id"], name: "index_project_tracing_settings_on_project_id", unique: true, using: :btree
- end
-
- create_table_if_not_exists "prometheus_alert_events", id: :bigserial do |t|
- t.integer "project_id", null: false
- t.integer "prometheus_alert_id", null: false
- t.datetime_with_timezone "started_at", null: false
- t.datetime_with_timezone "ended_at"
- t.integer "status", limit: 2
- t.string "payload_key"
- t.index %w[project_id status], name: "index_prometheus_alert_events_on_project_id_and_status", using: :btree
- t.index %w[prometheus_alert_id payload_key], name: "index_prometheus_alert_event_scoped_payload_key", unique: true, using: :btree
- end
-
- create_table_if_not_exists "prometheus_alerts" do |t|
- t.datetime_with_timezone "created_at", null: false
- t.datetime_with_timezone "updated_at", null: false
- t.float "threshold", null: false
- t.integer "operator", null: false
- t.integer "environment_id", null: false
- t.integer "project_id", null: false
- t.integer "prometheus_metric_id", null: false
- t.index ["environment_id"], name: "index_prometheus_alerts_on_environment_id", using: :btree
- t.index %w[project_id prometheus_metric_id environment_id], name: "index_prometheus_alerts_metric_environment", unique: true, using: :btree
- t.index ["prometheus_metric_id"], name: "index_prometheus_alerts_on_prometheus_metric_id", using: :btree
- end
-
- create_table_if_not_exists "protected_branch_unprotect_access_levels" do |t|
- t.integer "protected_branch_id", null: false
- t.integer "access_level", default: 40
- t.integer "user_id"
- t.integer "group_id"
- t.index ["group_id"], name: "index_protected_branch_unprotect_access_levels_on_group_id", using: :btree
- t.index ["protected_branch_id"], name: "index_protected_branch_unprotect_access", using: :btree
- t.index ["user_id"], name: "index_protected_branch_unprotect_access_levels_on_user_id", using: :btree
- end
-
- create_table_if_not_exists "protected_environment_deploy_access_levels" do |t|
- t.datetime_with_timezone "created_at", null: false
- t.datetime_with_timezone "updated_at", null: false
- t.integer "access_level", default: 40
- t.integer "protected_environment_id", null: false
- t.integer "user_id"
- t.integer "group_id"
- t.index ["group_id"], name: "index_protected_environment_deploy_access_levels_on_group_id", using: :btree
- t.index ["protected_environment_id"], name: "index_protected_environment_deploy_access", using: :btree
- t.index ["user_id"], name: "index_protected_environment_deploy_access_levels_on_user_id", using: :btree
- end
-
- create_table_if_not_exists "protected_environments" do |t|
- t.integer "project_id", null: false
- t.datetime_with_timezone "created_at", null: false
- t.datetime_with_timezone "updated_at", null: false
- t.string "name", null: false
- t.index %w[project_id name], name: "index_protected_environments_on_project_id_and_name", unique: true, using: :btree
- t.index ["project_id"], name: "index_protected_environments_on_project_id", using: :btree
- end
-
- create_table_if_not_exists "push_rules" do |t|
- t.string "force_push_regex"
- t.string "delete_branch_regex"
- t.string "commit_message_regex"
- t.boolean "deny_delete_tag"
- t.integer "project_id"
- t.datetime "created_at"
- t.datetime "updated_at"
- t.string "author_email_regex"
- t.boolean "member_check", default: false, null: false
- t.string "file_name_regex"
- t.boolean "is_sample", default: false
- t.integer "max_file_size", default: 0, null: false
- t.boolean "prevent_secrets", default: false, null: false
- t.string "branch_name_regex"
- t.boolean "reject_unsigned_commits"
- t.boolean "commit_committer_check"
- t.boolean "regexp_uses_re2", default: true
- t.string "commit_message_negative_regex"
- t.index ["is_sample"], name: "index_push_rules_on_is_sample", where: "is_sample", using: :btree
- t.index ["project_id"], name: "index_push_rules_on_project_id", using: :btree
- end
-
- create_table_if_not_exists "reviews", id: :bigserial do |t|
- t.integer "author_id"
- t.integer "merge_request_id", null: false
- t.integer "project_id", null: false
- t.datetime_with_timezone "created_at", null: false
- t.index ["author_id"], name: "index_reviews_on_author_id", using: :btree
- t.index ["merge_request_id"], name: "index_reviews_on_merge_request_id", using: :btree
- t.index ["project_id"], name: "index_reviews_on_project_id", using: :btree
- end
-
- create_table_if_not_exists "saml_providers" do |t|
- t.integer "group_id", null: false
- t.boolean "enabled", null: false
- t.string "certificate_fingerprint", null: false
- t.string "sso_url", null: false
- t.boolean "enforced_sso", default: false, null: false
- t.boolean "enforced_group_managed_accounts", default: false, null: false
- t.index ["group_id"], name: "index_saml_providers_on_group_id", using: :btree
- end
-
- create_table_if_not_exists "scim_oauth_access_tokens" do |t|
- t.datetime_with_timezone "created_at", null: false
- t.datetime_with_timezone "updated_at", null: false
- t.integer "group_id", null: false
- t.string "token_encrypted", null: false
- t.index %w[group_id token_encrypted], name: "index_scim_oauth_access_tokens_on_group_id_and_token_encrypted", unique: true, using: :btree
- end
-
- create_table_if_not_exists "slack_integrations" do |t|
- t.integer "service_id", null: false
- t.string "team_id", null: false
- t.string "team_name", null: false
- t.string "alias", null: false
- t.string "user_id", null: false
- t.datetime "created_at", null: false
- t.datetime "updated_at", null: false
- t.index ["service_id"], name: "index_slack_integrations_on_service_id", using: :btree
- t.index %w[team_id alias], name: "index_slack_integrations_on_team_id_and_alias", unique: true, using: :btree
- end
-
- create_table_if_not_exists "smartcard_identities", id: :bigserial do |t|
- t.integer "user_id", null: false
- t.string "subject", null: false
- t.string "issuer", null: false
- t.index %w[subject issuer], name: "index_smartcard_identities_on_subject_and_issuer", unique: true, using: :btree
- t.index ["user_id"], name: "index_smartcard_identities_on_user_id", using: :btree
- end
-
- create_table_if_not_exists "software_license_policies" do |t|
- t.integer "project_id", null: false
- t.integer "software_license_id", null: false
- t.integer "approval_status", default: 0, null: false
- t.index %w[project_id software_license_id], name: "index_software_license_policies_unique_per_project", unique: true, using: :btree
- t.index ["software_license_id"], name: "index_software_license_policies_on_software_license_id", using: :btree
- end
-
- create_table_if_not_exists "software_licenses" do |t|
- t.string "name", null: false
- t.index ["name"], name: "index_software_licenses_on_name", using: :btree
- end
-
- create_table_if_not_exists "users_ops_dashboard_projects", id: :bigserial do |t|
- t.datetime_with_timezone "created_at", null: false
- t.datetime_with_timezone "updated_at", null: false
- t.integer "user_id", null: false
- t.integer "project_id", null: false
- t.index ["project_id"], name: "index_users_ops_dashboard_projects_on_project_id", using: :btree
- t.index %w[user_id project_id], name: "index_users_ops_dashboard_projects_on_user_id_and_project_id", unique: true, using: :btree
- end
-
- create_table_if_not_exists "vulnerability_feedback" do |t|
- t.datetime_with_timezone "created_at", null: false
- t.datetime_with_timezone "updated_at", null: false
- t.integer "feedback_type", limit: 2, null: false
- t.integer "category", limit: 2, null: false
- t.integer "project_id", null: false
- t.integer "author_id", null: false
- t.integer "pipeline_id"
- t.integer "issue_id"
- t.string "project_fingerprint", limit: 40, null: false
- t.integer "merge_request_id"
- t.index ["author_id"], name: "index_vulnerability_feedback_on_author_id", using: :btree
- t.index ["issue_id"], name: "index_vulnerability_feedback_on_issue_id", using: :btree
- t.index ["merge_request_id"], name: "index_vulnerability_feedback_on_merge_request_id", using: :btree
- t.index ["pipeline_id"], name: "index_vulnerability_feedback_on_pipeline_id", using: :btree
- t.index %w[project_id category feedback_type project_fingerprint], name: "vulnerability_feedback_unique_idx", unique: true, using: :btree
- end
-
- create_table_if_not_exists "vulnerability_identifiers", id: :bigserial do |t|
- t.datetime_with_timezone "created_at", null: false
- t.datetime_with_timezone "updated_at", null: false
- t.integer "project_id", null: false
- t.binary "fingerprint", null: false
- t.string "external_type", null: false
- t.string "external_id", null: false
- t.string "name", null: false
- t.text "url"
- t.index %w[project_id fingerprint], name: "index_vulnerability_identifiers_on_project_id_and_fingerprint", unique: true, using: :btree
- end
-
- create_table_if_not_exists "vulnerability_occurrence_identifiers", id: :bigserial do |t|
- t.datetime_with_timezone "created_at", null: false
- t.datetime_with_timezone "updated_at", null: false
- t.bigint "occurrence_id", null: false
- t.bigint "identifier_id", null: false
- t.index ["identifier_id"], name: "index_vulnerability_occurrence_identifiers_on_identifier_id", using: :btree
- t.index %w[occurrence_id identifier_id], name: "index_vulnerability_occurrence_identifiers_on_unique_keys", unique: true, using: :btree
- end
-
- create_table_if_not_exists "vulnerability_occurrence_pipelines", id: :bigserial do |t|
- t.datetime_with_timezone "created_at", null: false
- t.datetime_with_timezone "updated_at", null: false
- t.bigint "occurrence_id", null: false
- t.integer "pipeline_id", null: false
- t.index %w[occurrence_id pipeline_id], name: "vulnerability_occurrence_pipelines_on_unique_keys", unique: true, using: :btree
- t.index ["pipeline_id"], name: "index_vulnerability_occurrence_pipelines_on_pipeline_id", using: :btree
- end
-
- create_table_if_not_exists "vulnerability_occurrences", id: :bigserial do |t|
- t.datetime_with_timezone "created_at", null: false
- t.datetime_with_timezone "updated_at", null: false
- t.integer "severity", limit: 2, null: false
- t.integer "confidence", limit: 2, null: false
- t.integer "report_type", limit: 2, null: false
- t.integer "project_id", null: false
- t.bigint "scanner_id", null: false
- t.bigint "primary_identifier_id", null: false
- t.binary "project_fingerprint", null: false
- t.binary "location_fingerprint", null: false
- t.string "uuid", limit: 36, null: false
- t.string "name", null: false
- t.string "metadata_version", null: false
- t.text "raw_metadata", null: false
- t.index ["primary_identifier_id"], name: "index_vulnerability_occurrences_on_primary_identifier_id", using: :btree
- t.index %w[project_id primary_identifier_id location_fingerprint scanner_id], name: "index_vulnerability_occurrences_on_unique_keys", unique: true, using: :btree
- t.index ["scanner_id"], name: "index_vulnerability_occurrences_on_scanner_id", using: :btree
- t.index ["uuid"], name: "index_vulnerability_occurrences_on_uuid", unique: true, using: :btree
- end
-
- create_table_if_not_exists "vulnerability_scanners", id: :bigserial do |t|
- t.datetime_with_timezone "created_at", null: false
- t.datetime_with_timezone "updated_at", null: false
- t.integer "project_id", null: false
- t.string "external_id", null: false
- t.string "name", null: false
- t.index %w[project_id external_id], name: "index_vulnerability_scanners_on_project_id_and_external_id", unique: true, using: :btree
- end
-
- create_table_if_not_exists "dependency_proxy_blobs", id: :serial do |t|
- t.datetime_with_timezone "created_at", null: false
- t.text "file", null: false
- t.string "file_name", null: false
- t.integer "file_store"
- t.integer "group_id", null: false
- t.bigint "size"
- t.datetime_with_timezone "updated_at", null: false
- t.index %w[group_id file_name], name: "index_dependency_proxy_blobs_on_group_id_and_file_name", using: :btree
- end
-
- create_table_if_not_exists "dependency_proxy_group_settings", id: :serial do |t|
- t.datetime_with_timezone "created_at", null: false
- t.boolean "enabled", default: false, null: false
- t.integer "group_id", null: false
- t.datetime_with_timezone "updated_at", null: false
- t.index ["group_id"], name: "index_dependency_proxy_group_settings_on_group_id", using: :btree
- end
- end
-
- def remove_tables
- drop_table_if_exists "approval_merge_request_rule_sources"
- drop_table_if_exists "approval_merge_request_rules"
- drop_table_if_exists "approval_merge_request_rules_approved_approvers"
- drop_table_if_exists "approval_merge_request_rules_groups"
- drop_table_if_exists "approval_merge_request_rules_users"
- drop_table_if_exists "approval_project_rules"
- drop_table_if_exists "approval_project_rules_groups"
- drop_table_if_exists "approval_project_rules_users"
- drop_table_if_exists "approvals"
- drop_table_if_exists "approver_groups"
- drop_table_if_exists "approvers"
- drop_table_if_exists "board_assignees"
- drop_table_if_exists "board_labels"
- drop_table_if_exists "ci_sources_pipelines"
- drop_table_if_exists "design_management_designs_versions"
- drop_table_if_exists "design_management_versions"
- drop_table_if_exists "design_management_designs"
- drop_table_if_exists "draft_notes"
- drop_table_if_exists "elasticsearch_indexed_namespaces"
- drop_table_if_exists "elasticsearch_indexed_projects"
- drop_table_if_exists "epic_issues"
- drop_table_if_exists "epic_metrics"
- drop_table_if_exists "epics"
- drop_table_if_exists "geo_cache_invalidation_events"
- drop_table_if_exists "geo_event_log"
- drop_table_if_exists "geo_hashed_storage_attachments_events"
- drop_table_if_exists "geo_hashed_storage_migrated_events"
- drop_table_if_exists "geo_job_artifact_deleted_events"
- drop_table_if_exists "geo_lfs_object_deleted_events"
- drop_table_if_exists "geo_node_namespace_links"
- drop_table_if_exists "geo_node_statuses"
- drop_table_if_exists "geo_nodes"
- drop_table_if_exists "geo_repositories_changed_events"
- drop_table_if_exists "geo_repository_created_events"
- drop_table_if_exists "geo_repository_deleted_events"
- drop_table_if_exists "geo_repository_renamed_events"
- drop_table_if_exists "geo_repository_updated_events"
- drop_table_if_exists "geo_reset_checksum_events"
- drop_table_if_exists "geo_upload_deleted_events"
- drop_table_if_exists "gitlab_subscriptions"
- drop_table_if_exists "historical_data"
- drop_table_if_exists "index_statuses"
- drop_table_if_exists "insights"
- drop_table_if_exists "issue_links"
- drop_table_if_exists "jira_connect_subscriptions"
- drop_table_if_exists "jira_connect_installations"
- drop_table_if_exists "ldap_group_links"
- drop_table_if_exists "licenses"
- drop_table_if_exists "namespace_statistics"
- drop_table_if_exists "operations_feature_flag_scopes"
- drop_table_if_exists "operations_feature_flags"
- drop_table_if_exists "operations_feature_flags_clients"
- drop_table_if_exists "packages_maven_metadata"
- drop_table_if_exists "packages_package_files"
- drop_table_if_exists "packages_packages"
- drop_table_if_exists "path_locks"
- drop_table_if_exists "plans"
- drop_table_if_exists "project_alerting_settings"
- drop_table_if_exists "project_feature_usages"
- drop_table_if_exists "project_incident_management_settings"
- drop_table_if_exists "project_repository_states"
- drop_table_if_exists "project_tracing_settings"
- drop_table_if_exists "prometheus_alert_events"
- drop_table_if_exists "prometheus_alerts"
- drop_table_if_exists "protected_branch_unprotect_access_levels"
- drop_table_if_exists "protected_environment_deploy_access_levels"
- drop_table_if_exists "protected_environments"
- drop_table_if_exists "push_rules"
- drop_table_if_exists "reviews"
- drop_table_if_exists "saml_providers"
- drop_table_if_exists "scim_oauth_access_tokens"
- drop_table_if_exists "slack_integrations"
- drop_table_if_exists "smartcard_identities"
- drop_table_if_exists "software_license_policies"
- drop_table_if_exists "software_licenses"
- drop_table_if_exists "users_ops_dashboard_projects"
- drop_table_if_exists "vulnerability_feedback"
- drop_table_if_exists "vulnerability_identifiers"
- drop_table_if_exists "vulnerability_occurrence_identifiers"
- drop_table_if_exists "vulnerability_occurrence_pipelines"
- drop_table_if_exists "vulnerability_occurrences"
- drop_table_if_exists "vulnerability_scanners"
- drop_table_if_exists "dependency_proxy_blobs"
- drop_table_if_exists "dependency_proxy_group_settings"
- end
-
- def add_missing_foreign_keys
- add_concurrent_foreign_key("application_settings", "namespaces", column: "custom_project_templates_group_id", name: "fk_rails_b53e481273", on_delete: :nullify)
- add_concurrent_foreign_key("application_settings", "projects", column: "file_template_project_id", name: "fk_ec757bd087", on_delete: :nullify)
- add_concurrent_foreign_key("approval_merge_request_rule_sources", "approval_merge_request_rules", column: "approval_merge_request_rule_id", name: "fk_rails_e605a04f76", on_delete: :cascade)
- add_concurrent_foreign_key("approval_merge_request_rule_sources", "approval_project_rules", column: "approval_project_rule_id", name: "fk_rails_64e8ed3c7e", on_delete: :cascade)
- add_concurrent_foreign_key("approval_merge_request_rules", "merge_requests", column: "merge_request_id", name: "fk_rails_004ce82224", on_delete: :cascade)
- add_concurrent_foreign_key("approval_merge_request_rules_approved_approvers", "approval_merge_request_rules", column: "approval_merge_request_rule_id", name: "fk_rails_6577725edb", on_delete: :cascade)
- add_concurrent_foreign_key("approval_merge_request_rules_approved_approvers", "users", column: "user_id", name: "fk_rails_8dc94cff4d", on_delete: :cascade)
- add_concurrent_foreign_key("approval_merge_request_rules_groups", "approval_merge_request_rules", column: "approval_merge_request_rule_id", name: "fk_rails_5b2ecf6139", on_delete: :cascade)
- add_concurrent_foreign_key("approval_merge_request_rules_groups", "namespaces", column: "group_id", name: "fk_rails_2020a7124a", on_delete: :cascade)
- add_concurrent_foreign_key("approval_merge_request_rules_users", "approval_merge_request_rules", column: "approval_merge_request_rule_id", name: "fk_rails_80e6801803", on_delete: :cascade)
- add_concurrent_foreign_key("approval_merge_request_rules_users", "users", column: "user_id", name: "fk_rails_bc8972fa55", on_delete: :cascade)
- add_concurrent_foreign_key("approval_project_rules", "projects", column: "project_id", name: "fk_rails_5fb4dd100b", on_delete: :cascade)
- add_concurrent_foreign_key("approval_project_rules_groups", "approval_project_rules", column: "approval_project_rule_id", name: "fk_rails_9071e863d1", on_delete: :cascade)
- add_concurrent_foreign_key("approval_project_rules_groups", "namespaces", column: "group_id", name: "fk_rails_396841e79e", on_delete: :cascade)
- add_concurrent_foreign_key("approval_project_rules_users", "approval_project_rules", column: "approval_project_rule_id", name: "fk_rails_b9e9394efb", on_delete: :cascade)
- add_concurrent_foreign_key("approval_project_rules_users", "users", column: "user_id", name: "fk_rails_f365da8250", on_delete: :cascade)
- add_concurrent_foreign_key("approvals", "merge_requests", column: "merge_request_id", name: "fk_310d714958", on_delete: :cascade)
- add_concurrent_foreign_key("approver_groups", "namespaces", column: "group_id", name: "fk_rails_1cdcbd7723", on_delete: :cascade)
- add_concurrent_foreign_key("board_assignees", "boards", column: "board_id", name: "fk_rails_3f6f926bd5", on_delete: :cascade)
- add_concurrent_foreign_key("board_assignees", "users", column: "assignee_id", name: "fk_rails_1c0ff59e82", on_delete: :cascade)
- add_concurrent_foreign_key("board_labels", "boards", column: "board_id", name: "fk_rails_9374a16edd", on_delete: :cascade)
- add_concurrent_foreign_key("board_labels", "labels", column: "label_id", name: "fk_rails_362b0600a3", on_delete: :cascade)
- add_concurrent_foreign_key("ci_sources_pipelines", "ci_builds", column: "source_job_id", name: "fk_be5624bf37", on_delete: :cascade)
- add_concurrent_foreign_key("ci_sources_pipelines", "ci_pipelines", column: "pipeline_id", name: "fk_e1bad85861", on_delete: :cascade)
- add_concurrent_foreign_key("ci_sources_pipelines", "ci_pipelines", column: "source_pipeline_id", name: "fk_d4e29af7d7", on_delete: :cascade)
- add_concurrent_foreign_key("ci_sources_pipelines", "projects", column: "source_project_id", name: "fk_acd9737679", on_delete: :cascade)
- add_concurrent_foreign_key("ci_sources_pipelines", "projects", column: "project_id", name: "fk_1e53c97c0a", on_delete: :cascade)
- add_concurrent_foreign_key("design_management_designs", "issues", column: "issue_id", name: "fk_rails_bfe283ec3c", on_delete: :cascade)
- add_concurrent_foreign_key("design_management_designs", "projects", column: "project_id", name: "fk_rails_4bb1073360", on_delete: :cascade)
- add_concurrent_foreign_key("design_management_designs_versions", "design_management_designs", column: "design_id", on_delete: :cascade)
- add_concurrent_foreign_key("design_management_designs_versions", "design_management_versions", column: "version_id", on_delete: :cascade)
- add_concurrent_foreign_key("draft_notes", "merge_requests", column: "merge_request_id", name: "fk_rails_e753681674", on_delete: :cascade)
- add_concurrent_foreign_key("draft_notes", "users", column: "author_id", name: "fk_rails_2a8dac9901", on_delete: :cascade)
- add_concurrent_foreign_key("elasticsearch_indexed_namespaces", "namespaces", column: "namespace_id", name: "fk_rails_bdcf044f37", on_delete: :cascade)
- add_concurrent_foreign_key("elasticsearch_indexed_projects", "projects", column: "project_id", name: "fk_rails_bd13bbdc3d", on_delete: :cascade)
- add_concurrent_foreign_key("epic_issues", "epics", column: "epic_id", name: "fk_rails_5d942936b4", on_delete: :cascade)
- add_concurrent_foreign_key("epic_issues", "issues", column: "issue_id", name: "fk_rails_4209981af6", on_delete: :cascade)
- add_concurrent_foreign_key("epic_metrics", "epics", column: "epic_id", name: "fk_rails_d071904753", on_delete: :cascade)
- add_concurrent_foreign_key("epics", "epics", column: "parent_id", name: "fk_25b99c1be3", on_delete: :cascade)
- add_concurrent_foreign_key("epics", "milestones", column: "milestone_id", name: "fk_rails_1bf671ebb7", on_delete: :nullify)
- add_concurrent_foreign_key("epics", "namespaces", column: "group_id", name: "fk_f081aa4489", on_delete: :cascade)
- add_concurrent_foreign_key("epics", "users", column: "assignee_id", name: "fk_dccd3f98fc", on_delete: :nullify)
- add_concurrent_foreign_key("epics", "users", column: "author_id", name: "fk_3654b61b03", on_delete: :cascade)
- add_concurrent_foreign_key("epics", "users", column: "closed_by_id", name: "fk_aa5798e761", on_delete: :nullify)
- add_concurrent_foreign_key("geo_event_log", "geo_cache_invalidation_events", column: "cache_invalidation_event_id", name: "fk_42c3b54bed", on_delete: :cascade)
- add_concurrent_foreign_key("geo_event_log", "geo_hashed_storage_migrated_events", column: "hashed_storage_migrated_event_id", name: "fk_27548c6db3", on_delete: :cascade)
- add_concurrent_foreign_key("geo_event_log", "geo_job_artifact_deleted_events", column: "job_artifact_deleted_event_id", name: "fk_176d3fbb5d", on_delete: :cascade)
- add_concurrent_foreign_key("geo_event_log", "geo_lfs_object_deleted_events", column: "lfs_object_deleted_event_id", name: "fk_d5af95fcd9", on_delete: :cascade)
- add_concurrent_foreign_key("geo_event_log", "geo_repositories_changed_events", column: "repositories_changed_event_id", name: "fk_4a99ebfd60", on_delete: :cascade)
- add_concurrent_foreign_key("geo_event_log", "geo_repository_created_events", column: "repository_created_event_id", name: "fk_9b9afb1916", on_delete: :cascade)
- add_concurrent_foreign_key("geo_event_log", "geo_repository_deleted_events", column: "repository_deleted_event_id", name: "fk_c4b1c1f66e", on_delete: :cascade)
- add_concurrent_foreign_key("geo_event_log", "geo_repository_renamed_events", column: "repository_renamed_event_id", name: "fk_86c84214ec", on_delete: :cascade)
- add_concurrent_foreign_key("geo_event_log", "geo_repository_updated_events", column: "repository_updated_event_id", name: "fk_78a6492f68", on_delete: :cascade)
- add_concurrent_foreign_key("geo_event_log", "geo_reset_checksum_events", column: "reset_checksum_event_id", name: "fk_cff7185ad2", on_delete: :cascade)
- add_concurrent_foreign_key("geo_event_log", "geo_upload_deleted_events", column: "upload_deleted_event_id", name: "fk_c1f241c70d", on_delete: :cascade)
- add_concurrent_foreign_key("geo_hashed_storage_attachments_events", "projects", column: "project_id", name: "fk_rails_d496b088e9", on_delete: :cascade)
- add_concurrent_foreign_key("geo_hashed_storage_migrated_events", "projects", column: "project_id", name: "fk_rails_687ed7d7c5", on_delete: :cascade)
- add_concurrent_foreign_key("geo_node_namespace_links", "geo_nodes", column: "geo_node_id", name: "fk_rails_546bf08d3e", on_delete: :cascade)
- add_concurrent_foreign_key("geo_node_namespace_links", "namespaces", column: "namespace_id", name: "fk_rails_41ff5fb854", on_delete: :cascade)
- add_concurrent_foreign_key("geo_node_statuses", "geo_nodes", column: "geo_node_id", name: "fk_rails_0ecc699c2a", on_delete: :cascade)
- add_concurrent_foreign_key("geo_repositories_changed_events", "geo_nodes", column: "geo_node_id", name: "fk_rails_75ec0fefcc", on_delete: :cascade)
- add_concurrent_foreign_key("geo_repository_created_events", "projects", column: "project_id", name: "fk_rails_1f49e46a61", on_delete: :cascade)
- add_concurrent_foreign_key("geo_repository_renamed_events", "projects", column: "project_id", name: "fk_rails_4e6524febb", on_delete: :cascade)
- add_concurrent_foreign_key("geo_repository_updated_events", "projects", column: "project_id", name: "fk_rails_2b70854c08", on_delete: :cascade)
- add_concurrent_foreign_key("geo_reset_checksum_events", "projects", column: "project_id", name: "fk_rails_910a06f12b", on_delete: :cascade)
- add_concurrent_foreign_key("gitlab_subscriptions", "namespaces", column: "namespace_id", name: "fk_e2595d00a1", on_delete: :cascade)
- add_concurrent_foreign_key("gitlab_subscriptions", "plans", column: "hosted_plan_id", name: "fk_bd0c4019c3", on_delete: :cascade)
- add_concurrent_foreign_key("identities", "saml_providers", column: "saml_provider_id", name: "fk_aade90f0fc", on_delete: :cascade)
- add_concurrent_foreign_key("index_statuses", "projects", column: "project_id", name: "fk_74b2492545", on_delete: :cascade)
- add_concurrent_foreign_key("insights", "namespaces", column: "namespace_id", name: "fk_rails_5c4391f60a", on_delete: nil)
- add_concurrent_foreign_key("insights", "projects", column: "project_id", name: "fk_rails_f36fda3932", on_delete: nil)
- add_concurrent_foreign_key("issue_links", "issues", column: "source_id", name: "fk_c900194ff2", on_delete: :cascade)
- add_concurrent_foreign_key("issue_links", "issues", column: "target_id", name: "fk_e71bb44f1f", on_delete: :cascade)
- add_concurrent_foreign_key("lists", "milestones", column: "milestone_id", name: "fk_rails_baed5f39b7", on_delete: :cascade)
- add_concurrent_foreign_key("lists", "users", column: "user_id", name: "fk_d6cf4279f7", on_delete: :cascade)
- add_concurrent_foreign_key("namespace_statistics", "namespaces", column: "namespace_id", name: "fk_rails_0062050394", on_delete: :cascade)
- add_concurrent_foreign_key("namespaces", "namespaces", column: "custom_project_templates_group_id", name: "fk_e7a0b20a6b", on_delete: :nullify)
- add_concurrent_foreign_key("namespaces", "plans", column: "plan_id", name: "fk_fdd12e5b80", on_delete: :nullify)
- add_concurrent_foreign_key("namespaces", "projects", column: "file_template_project_id", name: "fk_319256d87a", on_delete: :nullify)
- add_concurrent_foreign_key("notes", "reviews", column: "review_id", name: "fk_2e82291620", on_delete: :nullify)
- add_concurrent_foreign_key("operations_feature_flag_scopes", "operations_feature_flags", column: "feature_flag_id", name: "fk_rails_a50a04d0a4", on_delete: :cascade)
- add_concurrent_foreign_key("operations_feature_flags", "projects", column: "project_id", name: "fk_rails_648e241be7", on_delete: :cascade)
- add_concurrent_foreign_key("operations_feature_flags_clients", "projects", column: "project_id", name: "fk_rails_6650ed902c", on_delete: :cascade)
- add_concurrent_foreign_key("packages_maven_metadata", "packages_packages", column: "package_id", name: "fk_be88aed360", on_delete: :cascade)
- add_concurrent_foreign_key("packages_package_files", "packages_packages", column: "package_id", name: "fk_86f0f182f8", on_delete: :cascade)
- add_concurrent_foreign_key("packages_packages", "projects", column: "project_id", name: "fk_rails_e1ac527425", on_delete: :cascade)
- add_concurrent_foreign_key("path_locks", "projects", column: "project_id", name: "fk_5265c98f24", on_delete: :cascade)
- add_concurrent_foreign_key("path_locks", "users", column: "user_id", name: "fk_rails_762cdcf942", on_delete: nil)
- add_concurrent_foreign_key("project_alerting_settings", "projects", column: "project_id", name: "fk_rails_27a84b407d", on_delete: :cascade)
- add_concurrent_foreign_key("project_feature_usages", "projects", column: "project_id", name: "fk_rails_c22a50024b", on_delete: :cascade)
- add_concurrent_foreign_key("project_incident_management_settings", "projects", column: "project_id", name: "fk_rails_9c2ea1b7dd", on_delete: :cascade)
- add_concurrent_foreign_key("project_repository_states", "projects", column: "project_id", name: "fk_rails_0f2298ca8a", on_delete: :cascade)
- add_concurrent_foreign_key("project_tracing_settings", "projects", column: "project_id", name: "fk_rails_fe56f57fc6", on_delete: :cascade)
- add_concurrent_foreign_key("prometheus_alert_events", "projects", column: "project_id", name: "fk_rails_4675865839", on_delete: :cascade)
- add_concurrent_foreign_key("prometheus_alert_events", "prometheus_alerts", column: "prometheus_alert_id", name: "fk_rails_106f901176", on_delete: :cascade)
- add_concurrent_foreign_key("prometheus_alerts", "environments", column: "environment_id", name: "fk_rails_6d9b283465", on_delete: :cascade)
- add_concurrent_foreign_key("prometheus_alerts", "projects", column: "project_id", name: "fk_rails_f0e8db86aa", on_delete: :cascade)
- add_concurrent_foreign_key("prometheus_alerts", "prometheus_metrics", column: "prometheus_metric_id", name: "fk_rails_e6351447ec", on_delete: :cascade)
- add_concurrent_foreign_key("protected_branch_merge_access_levels", "namespaces", column: "group_id", name: "fk_98f3d044fe", on_delete: :cascade)
- add_concurrent_foreign_key("protected_branch_merge_access_levels", "users", column: "user_id", name: "fk_rails_5ffb4f3590", on_delete: nil)
- add_concurrent_foreign_key("protected_branch_push_access_levels", "namespaces", column: "group_id", name: "fk_7111b68cdb", on_delete: :cascade)
- add_concurrent_foreign_key("protected_branch_push_access_levels", "users", column: "user_id", name: "fk_rails_8dcb712d65", on_delete: nil)
- add_concurrent_foreign_key("protected_branch_unprotect_access_levels", "namespaces", column: "group_id", name: "fk_rails_5be1abfc25", on_delete: :cascade)
- add_concurrent_foreign_key("protected_branch_unprotect_access_levels", "protected_branches", column: "protected_branch_id", name: "fk_rails_e9eb8dc025", on_delete: :cascade)
- add_concurrent_foreign_key("protected_branch_unprotect_access_levels", "users", column: "user_id", name: "fk_rails_2d2aba21ef", on_delete: :cascade)
- add_concurrent_foreign_key("protected_environment_deploy_access_levels", "namespaces", column: "group_id", name: "fk_rails_45cc02a931", on_delete: :cascade)
- add_concurrent_foreign_key("protected_environment_deploy_access_levels", "protected_environments", column: "protected_environment_id", name: "fk_rails_898a13b650", on_delete: :cascade)
- add_concurrent_foreign_key("protected_environment_deploy_access_levels", "users", column: "user_id", name: "fk_rails_5b9f6970fe", on_delete: :cascade)
- add_concurrent_foreign_key("protected_environments", "projects", column: "project_id", name: "fk_rails_a354313d11", on_delete: :cascade)
- add_concurrent_foreign_key("push_rules", "projects", column: "project_id", name: "fk_83b29894de", on_delete: :cascade)
- add_concurrent_foreign_key("resource_label_events", "epics", column: "epic_id", name: "fk_rails_75efb0a653", on_delete: :cascade)
- add_concurrent_foreign_key("reviews", "merge_requests", column: "merge_request_id", name: "fk_rails_5ca11d8c31", on_delete: :cascade)
- add_concurrent_foreign_key("reviews", "projects", column: "project_id", name: "fk_rails_64798be025", on_delete: :cascade)
- add_concurrent_foreign_key("reviews", "users", column: "author_id", name: "fk_rails_29e6f859c4", on_delete: :nullify)
- add_concurrent_foreign_key("saml_providers", "namespaces", column: "group_id", name: "fk_rails_306d459be7", on_delete: :cascade)
- add_concurrent_foreign_key("scim_oauth_access_tokens", "namespaces", column: "group_id", name: "fk_rails_c84404fb6c", on_delete: :cascade)
- add_concurrent_foreign_key("slack_integrations", "services", column: "service_id", name: "fk_rails_73db19721a", on_delete: :cascade)
- add_concurrent_foreign_key("smartcard_identities", "users", column: "user_id", name: "fk_rails_4689f889a9", on_delete: :cascade)
- add_concurrent_foreign_key("software_license_policies", "projects", column: "project_id", name: "fk_rails_87b2247ce5", on_delete: :cascade)
- add_concurrent_foreign_key("software_license_policies", "software_licenses", column: "software_license_id", name: "fk_rails_7a7a2a92de", on_delete: :cascade)
- add_concurrent_foreign_key("users", "namespaces", column: "managing_group_id", name: "fk_a4b8fefe3e", on_delete: :nullify)
- add_concurrent_foreign_key("users_ops_dashboard_projects", "projects", column: "project_id", name: "fk_rails_9b4ebf005b", on_delete: :cascade)
- add_concurrent_foreign_key("users_ops_dashboard_projects", "users", column: "user_id", name: "fk_rails_220a0562db", on_delete: :cascade)
- add_concurrent_foreign_key("vulnerability_feedback", "ci_pipelines", column: "pipeline_id", name: "fk_rails_20976e6fd9", on_delete: :nullify)
- add_concurrent_foreign_key("vulnerability_feedback", "issues", column: "issue_id", name: "fk_rails_8c77e5891a", on_delete: :nullify)
- add_concurrent_foreign_key("vulnerability_feedback", "merge_requests", column: "merge_request_id", name: "fk_563ff1912e", on_delete: :nullify)
- add_concurrent_foreign_key("vulnerability_feedback", "projects", column: "project_id", name: "fk_rails_debd54e456", on_delete: :cascade)
- add_concurrent_foreign_key("vulnerability_feedback", "users", column: "author_id", name: "fk_rails_472f69b043", on_delete: :cascade)
- add_concurrent_foreign_key("vulnerability_identifiers", "projects", column: "project_id", name: "fk_rails_a67a16c885", on_delete: :cascade)
- add_concurrent_foreign_key("vulnerability_occurrence_identifiers", "vulnerability_identifiers", column: "identifier_id", name: "fk_rails_be2e49e1d0", on_delete: :cascade)
- add_concurrent_foreign_key("vulnerability_occurrence_identifiers", "vulnerability_occurrences", column: "occurrence_id", name: "fk_rails_e4ef6d027c", on_delete: :cascade)
- add_concurrent_foreign_key("vulnerability_occurrence_pipelines", "ci_pipelines", column: "pipeline_id", name: "fk_rails_6421e35d7d", on_delete: :cascade)
- add_concurrent_foreign_key("vulnerability_occurrence_pipelines", "vulnerability_occurrences", column: "occurrence_id", name: "fk_rails_dc3ae04693", on_delete: :cascade)
- add_concurrent_foreign_key("vulnerability_occurrences", "projects", column: "project_id", name: "fk_rails_90fed4faba", on_delete: :cascade)
- add_concurrent_foreign_key("vulnerability_occurrences", "vulnerability_identifiers", column: "primary_identifier_id", name: "fk_rails_c8661a61eb", on_delete: :cascade)
- add_concurrent_foreign_key("vulnerability_occurrences", "vulnerability_scanners", column: "scanner_id", name: "fk_rails_bf5b788ca7", on_delete: :cascade)
- add_concurrent_foreign_key("vulnerability_scanners", "projects", column: "project_id", name: "fk_rails_5c9d42a221", on_delete: :cascade)
- add_concurrent_foreign_key("dependency_proxy_blobs", "namespaces", column: "group_id", on_delete: :cascade)
- add_concurrent_foreign_key("dependency_proxy_group_settings", "namespaces", column: "group_id", on_delete: :cascade)
- add_concurrent_foreign_key("jira_connect_subscriptions", "jira_connect_installations", column: "jira_connect_installation_id", on_delete: :cascade)
- add_concurrent_foreign_key("jira_connect_subscriptions", "namespaces", column: "namespace_id", on_delete: :cascade)
-
- remove_foreign_key_without_error("protected_tag_create_access_levels", column: :group_id)
- add_concurrent_foreign_key("protected_tag_create_access_levels", "namespaces", column: :group_id, name: "fk_b4eb82fe3c", on_delete: :cascade)
- end
-
- def remove_foreign_keys
- remove_foreign_key_without_error("application_settings", column: "custom_project_templates_group_id")
- remove_foreign_key_without_error("application_settings", column: "file_template_project_id")
- remove_foreign_key_without_error("approval_merge_request_rule_sources", column: "approval_merge_request_rule_id")
- remove_foreign_key_without_error("approval_merge_request_rule_sources", column: "approval_project_rule_id")
- remove_foreign_key_without_error("approval_merge_request_rules", column: "merge_request_id")
- remove_foreign_key_without_error("approval_merge_request_rules_approved_approvers", column: "approval_merge_request_rule_id")
- remove_foreign_key_without_error("approval_merge_request_rules_approved_approvers", column: "user_id")
- remove_foreign_key_without_error("approval_merge_request_rules_groups", column: "approval_merge_request_rule_id")
- remove_foreign_key_without_error("approval_merge_request_rules_groups", column: "group_id")
- remove_foreign_key_without_error("approval_merge_request_rules_users", column: "approval_merge_request_rule_id")
- remove_foreign_key_without_error("approval_merge_request_rules_users", column: "user_id")
- remove_foreign_key_without_error("approval_project_rules", column: "project_id")
- remove_foreign_key_without_error("approval_project_rules_groups", column: "approval_project_rule_id")
- remove_foreign_key_without_error("approval_project_rules_groups", column: "group_id")
- remove_foreign_key_without_error("approval_project_rules_users", column: "approval_project_rule_id")
- remove_foreign_key_without_error("approval_project_rules_users", column: "user_id")
- remove_foreign_key_without_error("approvals", column: "merge_request_id")
- remove_foreign_key_without_error("approver_groups", column: "group_id")
- remove_foreign_key_without_error("board_assignees", column: "board_id")
- remove_foreign_key_without_error("board_assignees", column: "assignee_id")
- remove_foreign_key_without_error("board_labels", column: "board_id")
- remove_foreign_key_without_error("board_labels", column: "label_id")
- remove_foreign_key_without_error("ci_sources_pipelines", column: "source_job_id")
- remove_foreign_key_without_error("ci_sources_pipelines", column: "pipeline_id")
- remove_foreign_key_without_error("ci_sources_pipelines", column: "source_pipeline_id")
- remove_foreign_key_without_error("ci_sources_pipelines", column: "source_project_id")
- remove_foreign_key_without_error("ci_sources_pipelines", column: "project_id")
- remove_foreign_key_without_error("design_management_designs", column: "issue_id")
- remove_foreign_key_without_error("design_management_designs", column: "project_id")
- remove_foreign_key_without_error("design_management_versions", column: "design_management_design_id")
- remove_foreign_key_without_error("draft_notes", column: "merge_request_id")
- remove_foreign_key_without_error("draft_notes", column: "author_id")
- remove_foreign_key_without_error("elasticsearch_indexed_namespaces", column: "namespace_id")
- remove_foreign_key_without_error("elasticsearch_indexed_projects", column: "project_id")
- remove_foreign_key_without_error("epic_issues", column: "epic_id")
- remove_foreign_key_without_error("epic_issues", column: "issue_id")
- remove_foreign_key_without_error("epic_metrics", column: "epic_id")
- remove_foreign_key_without_error("epics", column: "parent_id")
- remove_foreign_key_without_error("epics", column: "milestone_id")
- remove_foreign_key_without_error("epics", column: "group_id")
- remove_foreign_key_without_error("epics", column: "assignee_id")
- remove_foreign_key_without_error("epics", column: "author_id")
- remove_foreign_key_without_error("epics", column: "closed_by_id")
- remove_foreign_key_without_error("geo_event_log", column: "cache_invalidation_event_id")
- remove_foreign_key_without_error("geo_event_log", column: "hashed_storage_migrated_event_id")
- remove_foreign_key_without_error("geo_event_log", column: "job_artifact_deleted_event_id")
- remove_foreign_key_without_error("geo_event_log", column: "lfs_object_deleted_event_id")
- remove_foreign_key_without_error("geo_event_log", column: "repositories_changed_event_id")
- remove_foreign_key_without_error("geo_event_log", column: "repository_created_event_id")
- remove_foreign_key_without_error("geo_event_log", column: "repository_deleted_event_id")
- remove_foreign_key_without_error("geo_event_log", column: "repository_renamed_event_id")
- remove_foreign_key_without_error("geo_event_log", column: "repository_updated_event_id")
- remove_foreign_key_without_error("geo_event_log", column: "reset_checksum_event_id")
- remove_foreign_key_without_error("geo_event_log", column: "upload_deleted_event_id")
- remove_foreign_key_without_error("geo_hashed_storage_attachments_events", column: "project_id")
- remove_foreign_key_without_error("geo_hashed_storage_migrated_events", column: "project_id")
- remove_foreign_key_without_error("geo_node_namespace_links", column: "geo_node_id")
- remove_foreign_key_without_error("geo_node_namespace_links", column: "namespace_id")
- remove_foreign_key_without_error("geo_node_statuses", column: "geo_node_id")
- remove_foreign_key_without_error("geo_repositories_changed_events", column: "geo_node_id")
- remove_foreign_key_without_error("geo_repository_created_events", column: "project_id")
- remove_foreign_key_without_error("geo_repository_renamed_events", column: "project_id")
- remove_foreign_key_without_error("geo_repository_updated_events", column: "project_id")
- remove_foreign_key_without_error("geo_reset_checksum_events", column: "project_id")
- remove_foreign_key_without_error("gitlab_subscriptions", column: "namespace_id")
- remove_foreign_key_without_error("gitlab_subscriptions", column: "hosted_plan_id")
- remove_foreign_key_without_error("identities", column: "saml_provider_id")
- remove_foreign_key_without_error("index_statuses", column: "project_id")
- remove_foreign_key_without_error("insights", column: "namespace_id", on_delete: nil)
- remove_foreign_key_without_error("insights", column: "project_id", on_delete: nil)
- remove_foreign_key_without_error("issue_links", column: "source_id")
- remove_foreign_key_without_error("issue_links", column: "target_id")
- remove_foreign_key_without_error("lists", column: "milestone_id")
- remove_foreign_key_without_error("lists", column: "user_id")
- remove_foreign_key_without_error("namespace_statistics", column: "namespace_id")
- remove_foreign_key_without_error("namespaces", column: "custom_project_templates_group_id")
- remove_foreign_key_without_error("namespaces", column: "plan_id")
- remove_foreign_key_without_error("namespaces", column: "file_template_project_id")
- remove_foreign_key_without_error("notes", column: "review_id")
- remove_foreign_key_without_error("operations_feature_flag_scopes", column: "feature_flag_id")
- remove_foreign_key_without_error("operations_feature_flags", column: "project_id")
- remove_foreign_key_without_error("operations_feature_flags_clients", column: "project_id")
- remove_foreign_key_without_error("packages_maven_metadata", column: "package_id")
- remove_foreign_key_without_error("packages_package_files", column: "package_id")
- remove_foreign_key_without_error("packages_packages", column: "project_id")
- remove_foreign_key_without_error("path_locks", column: "project_id")
- remove_foreign_key_without_error("path_locks", column: "user_id", on_delete: nil)
- remove_foreign_key_without_error("project_alerting_settings", column: "project_id")
- remove_foreign_key_without_error("project_feature_usages", column: "project_id")
- remove_foreign_key_without_error("project_incident_management_settings", column: "project_id")
- remove_foreign_key_without_error("project_repository_states", column: "project_id")
- remove_foreign_key_without_error("project_tracing_settings", column: "project_id")
- remove_foreign_key_without_error("prometheus_alert_events", column: "project_id")
- remove_foreign_key_without_error("prometheus_alert_events", column: "prometheus_alert_id")
- remove_foreign_key_without_error("prometheus_alerts", column: "environment_id")
- remove_foreign_key_without_error("prometheus_alerts", column: "project_id")
- remove_foreign_key_without_error("prometheus_alerts", column: "prometheus_metric_id")
- remove_foreign_key_without_error("protected_branch_merge_access_levels", column: "group_id")
- remove_foreign_key_without_error("protected_branch_merge_access_levels", column: "user_id", on_delete: nil)
- remove_foreign_key_without_error("protected_branch_push_access_levels", column: "group_id")
- remove_foreign_key_without_error("protected_branch_push_access_levels", column: "user_id", on_delete: nil)
- remove_foreign_key_without_error("protected_branch_unprotect_access_levels", column: "group_id")
- remove_foreign_key_without_error("protected_branch_unprotect_access_levels", column: "protected_branch_id")
- remove_foreign_key_without_error("protected_branch_unprotect_access_levels", column: "user_id")
- remove_foreign_key_without_error("protected_environment_deploy_access_levels", column: "group_id")
- remove_foreign_key_without_error("protected_environment_deploy_access_levels", column: "protected_environment_id")
- remove_foreign_key_without_error("protected_environment_deploy_access_levels", column: "user_id")
- remove_foreign_key_without_error("protected_environments", column: "project_id")
- remove_foreign_key_without_error("push_rules", column: "project_id")
- remove_foreign_key_without_error("resource_label_events", column: "epic_id")
- remove_foreign_key_without_error("reviews", column: "merge_request_id")
- remove_foreign_key_without_error("reviews", column: "project_id")
- remove_foreign_key_without_error("reviews", column: "author_id")
- remove_foreign_key_without_error("saml_providers", column: "group_id")
- remove_foreign_key_without_error("scim_oauth_access_tokens", column: "group_id")
- remove_foreign_key_without_error("slack_integrations", column: "service_id")
- remove_foreign_key_without_error("smartcard_identities", column: "user_id")
- remove_foreign_key_without_error("software_license_policies", column: "project_id")
- remove_foreign_key_without_error("software_license_policies", column: "software_license_id")
- remove_foreign_key_without_error("users", column: "managing_group_id")
- remove_foreign_key_without_error("users_ops_dashboard_projects", column: "project_id")
- remove_foreign_key_without_error("users_ops_dashboard_projects", column: "user_id")
- remove_foreign_key_without_error("vulnerability_feedback", column: "pipeline_id")
- remove_foreign_key_without_error("vulnerability_feedback", column: "issue_id")
- remove_foreign_key_without_error("vulnerability_feedback", column: "merge_request_id")
- remove_foreign_key_without_error("vulnerability_feedback", column: "project_id")
- remove_foreign_key_without_error("vulnerability_feedback", column: "author_id")
- remove_foreign_key_without_error("vulnerability_identifiers", column: "project_id")
- remove_foreign_key_without_error("vulnerability_occurrence_identifiers", column: "identifier_id")
- remove_foreign_key_without_error("vulnerability_occurrence_identifiers", column: "occurrence_id")
- remove_foreign_key_without_error("vulnerability_occurrence_pipelines", column: "pipeline_id")
- remove_foreign_key_without_error("vulnerability_occurrence_pipelines", column: "occurrence_id")
- remove_foreign_key_without_error("vulnerability_occurrences", column: "project_id")
- remove_foreign_key_without_error("vulnerability_occurrences", column: "primary_identifier_id")
- remove_foreign_key_without_error("vulnerability_occurrences", column: "scanner_id")
- remove_foreign_key_without_error("vulnerability_scanners", column: "project_id")
- remove_foreign_key_without_error("dependency_proxy_blobs", column: "group_id")
- remove_foreign_key_without_error("dependency_proxy_group_settings", column: "group_id")
- remove_foreign_key_without_error("jira_connect_subscriptions", "jira_connect_installations", column: "jira_connect_installation_id")
- remove_foreign_key_without_error("jira_connect_subscriptions", "namespaces", column: "namespace_id")
-
- remove_foreign_key_without_error("protected_tag_create_access_levels", column: :group_id)
- add_concurrent_foreign_key("protected_tag_create_access_levels", "namespaces", column: :group_id, on_delete: nil)
- end
-end
-# rubocop: enable Metrics/AbcSize
-# rubocop: enable Migration/Datetime
-# rubocop: enable Migration/PreventStrings
-# rubocop: enable Migration/AddLimitToTextColumns
diff --git a/db/migrate/20190403161806_update_designs_index.rb b/db/migrate/20190403161806_update_designs_index.rb
deleted file mode 100644
index 78517e372d5..00000000000
--- a/db/migrate/20190403161806_update_designs_index.rb
+++ /dev/null
@@ -1,21 +0,0 @@
-# frozen_string_literal: true
-
-# See http://doc.gitlab.com/ce/development/migration_style_guide.html
-# for more information on how to write migrations for GitLab.
-
-class UpdateDesignsIndex < ActiveRecord::Migration[5.0]
- include Gitlab::Database::MigrationHelpers
-
- # Set this constant to true if this migration requires downtime.
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- remove_concurrent_index :design_management_designs, :issue_id, unique: true
- end
-
- def down
- add_concurrent_index :design_management_designs, :issue_id, unique: true
- end
-end
diff --git a/db/migrate/20190408163745_prometheus_knative05_fix.rb b/db/migrate/20190408163745_prometheus_knative05_fix.rb
deleted file mode 100644
index 3d0aa782669..00000000000
--- a/db/migrate/20190408163745_prometheus_knative05_fix.rb
+++ /dev/null
@@ -1,18 +0,0 @@
-# frozen_string_literal: true
-
-# See http://doc.gitlab.com/ce/development/migration_style_guide.html
-# for more information on how to write migrations for GitLab.
-
-class PrometheusKnative05Fix < ActiveRecord::Migration[5.0]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- def up
- ::Gitlab::DatabaseImporters::CommonMetrics::Importer.new.execute
- end
-
- def down
- # no-op
- end
-end
diff --git a/db/migrate/20190409224933_add_name_to_geo_nodes.rb b/db/migrate/20190409224933_add_name_to_geo_nodes.rb
deleted file mode 100644
index ac3eda701d1..00000000000
--- a/db/migrate/20190409224933_add_name_to_geo_nodes.rb
+++ /dev/null
@@ -1,26 +0,0 @@
-# frozen_string_literal: true
-
-# See http://doc.gitlab.com/ce/development/migration_style_guide.html
-# for more information on how to write migrations for GitLab.
-
-class AddNameToGeoNodes < ActiveRecord::Migration[5.0]
- include Gitlab::Database::MigrationHelpers
-
- # Set this constant to true if this migration requires downtime.
- DOWNTIME = false
-
- def up
- add_column :geo_nodes, :name, :string # rubocop:disable Migration/PreventStrings
-
- # url is also unique, and its type and size is identical to the name column,
- # so this is safe.
- execute "UPDATE geo_nodes SET name = url;"
-
- # url is also `null: false`, so this is safe.
- change_column :geo_nodes, :name, :string, null: false
- end
-
- def down
- remove_column :geo_nodes, :name
- end
-end
diff --git a/db/migrate/20190410173409_add_name_index_to_geo_nodes.rb b/db/migrate/20190410173409_add_name_index_to_geo_nodes.rb
deleted file mode 100644
index efbdaf1d025..00000000000
--- a/db/migrate/20190410173409_add_name_index_to_geo_nodes.rb
+++ /dev/null
@@ -1,21 +0,0 @@
-# frozen_string_literal: true
-
-# See http://doc.gitlab.com/ce/development/migration_style_guide.html
-# for more information on how to write migrations for GitLab.
-
-class AddNameIndexToGeoNodes < ActiveRecord::Migration[5.0]
- include Gitlab::Database::MigrationHelpers
-
- # Set this constant to true if this migration requires downtime.
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- add_concurrent_index :geo_nodes, :name, unique: true
- end
-
- def down
- remove_concurrent_index :geo_nodes, :name
- end
-end
diff --git a/db/migrate/20190412155659_add_merge_request_blocks.rb b/db/migrate/20190412155659_add_merge_request_blocks.rb
deleted file mode 100644
index 9e7f370d1cf..00000000000
--- a/db/migrate/20190412155659_add_merge_request_blocks.rb
+++ /dev/null
@@ -1,25 +0,0 @@
-# frozen_string_literal: true
-
-class AddMergeRequestBlocks < ActiveRecord::Migration[5.0]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- def change
- create_table :merge_request_blocks, id: :bigserial do |t|
- t.references :blocking_merge_request,
- index: false, null: false,
- foreign_key: { to_table: :merge_requests, on_delete: :cascade }
-
- t.references :blocked_merge_request,
- index: true, null: false,
- foreign_key: { to_table: :merge_requests, on_delete: :cascade }
-
- t.index [:blocking_merge_request_id, :blocked_merge_request_id],
- unique: true,
- name: 'index_mr_blocks_on_blocking_and_blocked_mr_ids'
-
- t.timestamps_with_timezone
- end
- end
-end
diff --git a/db/migrate/20190412183653_remove_url_index_from_geo_nodes.rb b/db/migrate/20190412183653_remove_url_index_from_geo_nodes.rb
deleted file mode 100644
index 86a46260553..00000000000
--- a/db/migrate/20190412183653_remove_url_index_from_geo_nodes.rb
+++ /dev/null
@@ -1,21 +0,0 @@
-# frozen_string_literal: true
-
-# See http://doc.gitlab.com/ce/development/migration_style_guide.html
-# for more information on how to write migrations for GitLab.
-
-class RemoveUrlIndexFromGeoNodes < ActiveRecord::Migration[5.0]
- include Gitlab::Database::MigrationHelpers
-
- # Set this constant to true if this migration requires downtime.
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- remove_concurrent_index :geo_nodes, :url
- end
-
- def down
- add_concurrent_index :geo_nodes, :url, unique: true
- end
-end
diff --git a/db/migrate/20190414185432_add_comment_to_vulnerability_feedback.rb b/db/migrate/20190414185432_add_comment_to_vulnerability_feedback.rb
deleted file mode 100644
index f2047e21d1e..00000000000
--- a/db/migrate/20190414185432_add_comment_to_vulnerability_feedback.rb
+++ /dev/null
@@ -1,17 +0,0 @@
-# frozen_string_literal: true
-
-class AddCommentToVulnerabilityFeedback < ActiveRecord::Migration[5.1]
- DOWNTIME = false
-
- def up
- add_column :vulnerability_feedback, :comment_author_id, :integer
- add_column :vulnerability_feedback, :comment, :text # rubocop:disable Migration/AddLimitToTextColumns
- add_column :vulnerability_feedback, :comment_timestamp, :datetime_with_timezone
- end
-
- def down
- remove_column :vulnerability_feedback, :comment_author_id
- remove_column :vulnerability_feedback, :comment
- remove_column :vulnerability_feedback, :comment_timestamp
- end
-end
diff --git a/db/migrate/20190415030217_add_variable_type_to_ci_variables.rb b/db/migrate/20190415030217_add_variable_type_to_ci_variables.rb
deleted file mode 100644
index ed7af455e12..00000000000
--- a/db/migrate/20190415030217_add_variable_type_to_ci_variables.rb
+++ /dev/null
@@ -1,17 +0,0 @@
-# frozen_string_literal: true
-
-class AddVariableTypeToCiVariables < ActiveRecord::Migration[5.0]
- include Gitlab::Database::MigrationHelpers
- disable_ddl_transaction!
-
- DOWNTIME = false
- ENV_VAR_VARIABLE_TYPE = 1
-
- def up
- add_column_with_default(:ci_variables, :variable_type, :smallint, default: ENV_VAR_VARIABLE_TYPE) # rubocop:disable Migration/AddColumnWithDefault
- end
-
- def down
- remove_column(:ci_variables, :variable_type)
- end
-end
diff --git a/db/migrate/20190415095825_add_packages_size_to_project_statistics.rb b/db/migrate/20190415095825_add_packages_size_to_project_statistics.rb
deleted file mode 100644
index 99625981563..00000000000
--- a/db/migrate/20190415095825_add_packages_size_to_project_statistics.rb
+++ /dev/null
@@ -1,11 +0,0 @@
-# frozen_string_literal: true
-
-class AddPackagesSizeToProjectStatistics < ActiveRecord::Migration[5.0]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- def change
- add_column :project_statistics, :packages_size, :bigint
- end
-end
diff --git a/db/migrate/20190415172035_update_insights_foreign_keys.rb b/db/migrate/20190415172035_update_insights_foreign_keys.rb
deleted file mode 100644
index 5d3aa4c05e9..00000000000
--- a/db/migrate/20190415172035_update_insights_foreign_keys.rb
+++ /dev/null
@@ -1,25 +0,0 @@
-# frozen_string_literal: true
-
-# rubocop: disable Migration/AddConcurrentForeignKey
-
-class UpdateInsightsForeignKeys < ActiveRecord::Migration[5.0]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- def up
- remove_foreign_key_if_exists(:insights, column: :project_id)
- add_foreign_key(:insights, :projects, column: :project_id, on_delete: :cascade)
-
- remove_foreign_key_if_exists(:insights, column: :namespace_id)
- add_foreign_key(:insights, :namespaces, column: :namespace_id, on_delete: :cascade)
- end
-
- def down
- remove_foreign_key_if_exists(:insights, column: :namespace_id)
- add_foreign_key(:insights, :namespaces, column: :namespace_id)
-
- remove_foreign_key_if_exists(:insights, column: :project_id)
- add_foreign_key(:insights, :projects, column: :project_id)
- end
-end
diff --git a/db/migrate/20190416185130_add_merge_train_enabled_to_ci_cd_settings.rb b/db/migrate/20190416185130_add_merge_train_enabled_to_ci_cd_settings.rb
deleted file mode 100644
index 2488cff38af..00000000000
--- a/db/migrate/20190416185130_add_merge_train_enabled_to_ci_cd_settings.rb
+++ /dev/null
@@ -1,21 +0,0 @@
-# frozen_string_literal: true
-
-class AddMergeTrainEnabledToCiCdSettings < ActiveRecord::Migration[5.1]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- # rubocop:disable Migration/AddColumnWithDefault
- # rubocop:disable Migration/UpdateLargeTable
- def up
- add_column_with_default :project_ci_cd_settings, :merge_trains_enabled, :boolean, default: false, allow_null: false
- end
- # rubocop:enable Migration/AddColumnWithDefault
- # rubocop:enable Migration/UpdateLargeTable
-
- def down
- remove_column :project_ci_cd_settings, :merge_trains_enabled
- end
-end
diff --git a/db/migrate/20190416213556_add_variable_type_to_ci_group_variables.rb b/db/migrate/20190416213556_add_variable_type_to_ci_group_variables.rb
deleted file mode 100644
index 4d329cea1b5..00000000000
--- a/db/migrate/20190416213556_add_variable_type_to_ci_group_variables.rb
+++ /dev/null
@@ -1,17 +0,0 @@
-# frozen_string_literal: true
-
-class AddVariableTypeToCiGroupVariables < ActiveRecord::Migration[5.0]
- include Gitlab::Database::MigrationHelpers
- disable_ddl_transaction!
-
- DOWNTIME = false
- ENV_VAR_VARIABLE_TYPE = 1
-
- def up
- add_column_with_default(:ci_group_variables, :variable_type, :smallint, default: ENV_VAR_VARIABLE_TYPE) # rubocop:disable Migration/AddColumnWithDefault
- end
-
- def down
- remove_column(:ci_group_variables, :variable_type)
- end
-end
diff --git a/db/migrate/20190416213615_add_variable_type_to_ci_pipeline_variables.rb b/db/migrate/20190416213615_add_variable_type_to_ci_pipeline_variables.rb
deleted file mode 100644
index 1a4439da5bf..00000000000
--- a/db/migrate/20190416213615_add_variable_type_to_ci_pipeline_variables.rb
+++ /dev/null
@@ -1,21 +0,0 @@
-# frozen_string_literal: true
-
-class AddVariableTypeToCiPipelineVariables < ActiveRecord::Migration[5.0]
- include Gitlab::Database::MigrationHelpers
- disable_ddl_transaction!
-
- DOWNTIME = false
- ENV_VAR_VARIABLE_TYPE = 1
-
- # rubocop:disable Migration/AddColumnWithDefault
- # rubocop:disable Migration/UpdateLargeTable
- def up
- add_column_with_default(:ci_pipeline_variables, :variable_type, :smallint, default: ENV_VAR_VARIABLE_TYPE)
- end
- # rubocop:enable Migration/AddColumnWithDefault
- # rubocop:enable Migration/UpdateLargeTable
-
- def down
- remove_column(:ci_pipeline_variables, :variable_type)
- end
-end
diff --git a/db/migrate/20190416213631_add_variable_type_to_ci_pipeline_schedule_variables.rb b/db/migrate/20190416213631_add_variable_type_to_ci_pipeline_schedule_variables.rb
deleted file mode 100644
index b7d80cb2d0d..00000000000
--- a/db/migrate/20190416213631_add_variable_type_to_ci_pipeline_schedule_variables.rb
+++ /dev/null
@@ -1,17 +0,0 @@
-# frozen_string_literal: true
-
-class AddVariableTypeToCiPipelineScheduleVariables < ActiveRecord::Migration[5.0]
- include Gitlab::Database::MigrationHelpers
- disable_ddl_transaction!
-
- DOWNTIME = false
- ENV_VAR_VARIABLE_TYPE = 1
-
- def up
- add_column_with_default(:ci_pipeline_schedule_variables, :variable_type, :smallint, default: ENV_VAR_VARIABLE_TYPE) # rubocop:disable Migration/AddColumnWithDefault
- end
-
- def down
- remove_column(:ci_pipeline_schedule_variables, :variable_type)
- end
-end
diff --git a/db/migrate/20190418132750_add_foreign_key_from_vulnerability_feedback_to_users.rb b/db/migrate/20190418132750_add_foreign_key_from_vulnerability_feedback_to_users.rb
deleted file mode 100644
index 0bd9012aee8..00000000000
--- a/db/migrate/20190418132750_add_foreign_key_from_vulnerability_feedback_to_users.rb
+++ /dev/null
@@ -1,19 +0,0 @@
-# frozen_string_literal: true
-
-class AddForeignKeyFromVulnerabilityFeedbackToUsers < ActiveRecord::Migration[5.1]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- add_concurrent_foreign_key :vulnerability_feedback, :users, column: :comment_author_id, on_delete: :nullify
- add_concurrent_index :vulnerability_feedback, :comment_author_id
- end
-
- def down
- remove_foreign_key :vulnerability_feedback, column: :comment_author_id
- remove_concurrent_index :vulnerability_feedback, :comment_author_id
- end
-end
diff --git a/db/migrate/20190418182545_create_merge_request_trains_table.rb b/db/migrate/20190418182545_create_merge_request_trains_table.rb
deleted file mode 100644
index ac927c9c6b9..00000000000
--- a/db/migrate/20190418182545_create_merge_request_trains_table.rb
+++ /dev/null
@@ -1,18 +0,0 @@
-# frozen_string_literal: true
-
-class CreateMergeRequestTrainsTable < ActiveRecord::Migration[5.1]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- def change
- create_table :merge_trains, id: :bigserial do |t|
- t.references :merge_request, foreign_key: { on_delete: :cascade }, type: :integer, index: false, null: false
- t.references :user, foreign_key: { on_delete: :cascade }, type: :integer, null: false
- t.references :pipeline, foreign_key: { to_table: :ci_pipelines, on_delete: :nullify }, type: :integer
- t.timestamps_with_timezone null: false
-
- t.index [:merge_request_id], unique: true
- end
- end
-end
diff --git a/db/migrate/20190419121952_add_bridged_pipeline_id_to_bridges.rb b/db/migrate/20190419121952_add_bridged_pipeline_id_to_bridges.rb
deleted file mode 100644
index efb59403df3..00000000000
--- a/db/migrate/20190419121952_add_bridged_pipeline_id_to_bridges.rb
+++ /dev/null
@@ -1,15 +0,0 @@
-# frozen_string_literal: true
-
-# See http://doc.gitlab.com/ce/development/migration_style_guide.html
-# for more information on how to write migrations for GitLab.
-
-class AddBridgedPipelineIdToBridges < ActiveRecord::Migration[5.0]
- include Gitlab::Database::MigrationHelpers
-
- # Set this constant to true if this migration requires downtime.
- DOWNTIME = false
-
- def change
- add_column :ci_builds, :upstream_pipeline_id, :integer # rubocop:disable Migration/AddColumnsToWideTables
- end
-end
diff --git a/db/migrate/20190419123057_add_bridged_pipeline_id_foreign_key.rb b/db/migrate/20190419123057_add_bridged_pipeline_id_foreign_key.rb
deleted file mode 100644
index c31ec7bc107..00000000000
--- a/db/migrate/20190419123057_add_bridged_pipeline_id_foreign_key.rb
+++ /dev/null
@@ -1,23 +0,0 @@
-# frozen_string_literal: true
-
-# See http://doc.gitlab.com/ce/development/migration_style_guide.html
-# for more information on how to write migrations for GitLab.
-
-class AddBridgedPipelineIdForeignKey < ActiveRecord::Migration[5.0]
- include Gitlab::Database::MigrationHelpers
-
- # Set this constant to true if this migration requires downtime.
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- add_concurrent_index :ci_builds, :upstream_pipeline_id, where: 'upstream_pipeline_id IS NOT NULL'
- add_concurrent_foreign_key :ci_builds, :ci_pipelines, column: :upstream_pipeline_id
- end
-
- def down
- remove_foreign_key :ci_builds, column: :upstream_pipeline_id
- remove_concurrent_index :ci_builds, :upstream_pipeline_id
- end
-end
diff --git a/db/migrate/20190422082247_create_project_metrics_settings.rb b/db/migrate/20190422082247_create_project_metrics_settings.rb
deleted file mode 100644
index 177c4820a0c..00000000000
--- a/db/migrate/20190422082247_create_project_metrics_settings.rb
+++ /dev/null
@@ -1,14 +0,0 @@
-# frozen_string_literal: true
-
-class CreateProjectMetricsSettings < ActiveRecord::Migration[5.0]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- def change
- create_table :project_metrics_settings, id: :int, primary_key: :project_id, default: nil do |t|
- t.string :external_dashboard_url, null: false # rubocop:disable Migration/PreventStrings
- t.foreign_key :projects, column: :project_id, on_delete: :cascade
- end
- end
-end
diff --git a/db/migrate/20190423124640_add_index_to_projects_mirror_user_id.rb b/db/migrate/20190423124640_add_index_to_projects_mirror_user_id.rb
deleted file mode 100644
index b008d8ce0cc..00000000000
--- a/db/migrate/20190423124640_add_index_to_projects_mirror_user_id.rb
+++ /dev/null
@@ -1,17 +0,0 @@
-# frozen_string_literal: true
-
-class AddIndexToProjectsMirrorUserId < ActiveRecord::Migration[5.0]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- add_concurrent_index :projects, :mirror_user_id
- end
-
- def down
- remove_concurrent_index :projects, :mirror_user_id
- end
-end
diff --git a/db/migrate/20190426180107_add_deployment_events_to_services.rb b/db/migrate/20190426180107_add_deployment_events_to_services.rb
deleted file mode 100644
index 61339ea7506..00000000000
--- a/db/migrate/20190426180107_add_deployment_events_to_services.rb
+++ /dev/null
@@ -1,21 +0,0 @@
-# frozen_string_literal: true
-
-class AddDeploymentEventsToServices < ActiveRecord::Migration[5.0]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- # rubocop:disable Migration/AddColumnWithDefault
- # rubocop:disable Migration/UpdateLargeTable
- def up
- add_column_with_default(:services, :deployment_events, :boolean, default: false, allow_null: false)
- end
- # rubocop:enable Migration/AddColumnWithDefault
- # rubocop:enable Migration/UpdateLargeTable
-
- def down
- remove_column(:services, :deployment_events)
- end
-end
diff --git a/db/migrate/20190429082448_create_pages_domain_acme_orders.rb b/db/migrate/20190429082448_create_pages_domain_acme_orders.rb
deleted file mode 100644
index 75636031193..00000000000
--- a/db/migrate/20190429082448_create_pages_domain_acme_orders.rb
+++ /dev/null
@@ -1,32 +0,0 @@
-# frozen_string_literal: true
-
-# See http://doc.gitlab.com/ce/development/migration_style_guide.html
-# for more information on how to write migrations for GitLab.
-
-class CreatePagesDomainAcmeOrders < ActiveRecord::Migration[5.1]
- include Gitlab::Database::MigrationHelpers
-
- # Set this constant to true if this migration requires downtime.
- DOWNTIME = false
-
- # rubocop:disable Migration/PreventStrings
- # rubocop:disable Migration/AddLimitToTextColumns
- def change
- create_table :pages_domain_acme_orders do |t|
- t.references :pages_domain, null: false, index: true, foreign_key: { on_delete: :cascade }, type: :integer
-
- t.datetime_with_timezone :expires_at, null: false
- t.timestamps_with_timezone null: false
-
- t.string :url, null: false
-
- t.string :challenge_token, null: false, index: true
- t.text :challenge_file_content, null: false
-
- t.text :encrypted_private_key, null: false
- t.text :encrypted_private_key_iv, null: false
- end
- end
- # rubocop:enable Migration/AddLimitToTextColumns
- # rubocop:enable Migration/PreventStrings
-end
diff --git a/db/migrate/20190430131225_create_issue_tracker_data.rb b/db/migrate/20190430131225_create_issue_tracker_data.rb
deleted file mode 100644
index 2ec9802dbcd..00000000000
--- a/db/migrate/20190430131225_create_issue_tracker_data.rb
+++ /dev/null
@@ -1,25 +0,0 @@
-# frozen_string_literal: true
-
-# See http://doc.gitlab.com/ce/development/migration_style_guide.html
-# for more information on how to write migrations for GitLab.
-
-class CreateIssueTrackerData < ActiveRecord::Migration[5.1]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- # rubocop:disable Migration/PreventStrings
- def change
- create_table :issue_tracker_data do |t|
- t.references :service, foreign_key: { on_delete: :cascade }, type: :integer, index: true, null: false
- t.timestamps_with_timezone
- t.string :encrypted_project_url
- t.string :encrypted_project_url_iv
- t.string :encrypted_issues_url
- t.string :encrypted_issues_url_iv
- t.string :encrypted_new_issue_url
- t.string :encrypted_new_issue_url_iv
- end
- end
- # rubocop:enable Migration/PreventStrings
-end
diff --git a/db/migrate/20190430142025_create_jira_tracker_data.rb b/db/migrate/20190430142025_create_jira_tracker_data.rb
deleted file mode 100644
index 2144c60a267..00000000000
--- a/db/migrate/20190430142025_create_jira_tracker_data.rb
+++ /dev/null
@@ -1,28 +0,0 @@
-# frozen_string_literal: true
-
-# See http://doc.gitlab.com/ce/development/migration_style_guide.html
-# for more information on how to write migrations for GitLab.
-
-class CreateJiraTrackerData < ActiveRecord::Migration[5.1]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- # rubocop:disable Migration/PreventStrings
- def change
- create_table :jira_tracker_data do |t|
- t.references :service, foreign_key: { on_delete: :cascade }, type: :integer, index: true, null: false
- t.timestamps_with_timezone
- t.string :encrypted_url
- t.string :encrypted_url_iv
- t.string :encrypted_api_url
- t.string :encrypted_api_url_iv
- t.string :encrypted_username
- t.string :encrypted_username_iv
- t.string :encrypted_password
- t.string :encrypted_password_iv
- t.string :jira_issue_transition_id
- end
- end
- # rubocop:enable Migration/PreventStrings
-end
diff --git a/db/migrate/20190506135337_add_temporary_indexes_to_state_id.rb b/db/migrate/20190506135337_add_temporary_indexes_to_state_id.rb
deleted file mode 100644
index 8e9838e1afb..00000000000
--- a/db/migrate/20190506135337_add_temporary_indexes_to_state_id.rb
+++ /dev/null
@@ -1,34 +0,0 @@
-# frozen_string_literal: true
-
-# This migration adds temporary indexes to state_id column of issues
-# and merge_requests tables. It will be used only to peform the scheduling
-# for populating state_id in a post migrate and will be removed after it.
-# Check: ScheduleSyncIssuablesStateIdWhereNil.
-
-class AddTemporaryIndexesToStateId < ActiveRecord::Migration[5.1]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- %w(issues merge_requests).each do |table|
- add_concurrent_index(
- table,
- 'id',
- name: index_name_for(table),
- where: "state_id IS NULL"
- )
- end
- end
-
- def down
- remove_concurrent_index_by_name(:issues, index_name_for("issues"))
- remove_concurrent_index_by_name(:merge_requests, index_name_for("merge_requests"))
- end
-
- def index_name_for(table)
- "idx_on_#{table}_where_state_id_is_null"
- end
-end
diff --git a/db/migrate/20190513174947_enable_create_incident_issues_by_default.rb b/db/migrate/20190513174947_enable_create_incident_issues_by_default.rb
deleted file mode 100644
index ecd466627fe..00000000000
--- a/db/migrate/20190513174947_enable_create_incident_issues_by_default.rb
+++ /dev/null
@@ -1,19 +0,0 @@
-# frozen_string_literal: true
-
-class EnableCreateIncidentIssuesByDefault < ActiveRecord::Migration[5.1]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- def change
- change_default_for :create_issue, from: false, to: true
- change_default_for :send_email, from: true, to: false
- end
-
- private
-
- def change_default_for(column, from:, to:)
- change_column_default :project_incident_management_settings,
- column, from: from, to: to
- end
-end
diff --git a/db/migrate/20190514105711_create_ip_restriction.rb b/db/migrate/20190514105711_create_ip_restriction.rb
deleted file mode 100644
index 51e711ca32b..00000000000
--- a/db/migrate/20190514105711_create_ip_restriction.rb
+++ /dev/null
@@ -1,20 +0,0 @@
-# frozen_string_literal: true
-
-class CreateIpRestriction < ActiveRecord::Migration[5.1]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- def change
- create_table :ip_restrictions do |t|
- t.references :group, references: :namespace,
- column: :group_id,
- type: :integer,
- null: false,
- index: true
- t.string :range, null: false # rubocop:disable Migration/PreventStrings
- end
-
- add_foreign_key(:ip_restrictions, :namespaces, column: :group_id, on_delete: :cascade) # rubocop: disable Migration/AddConcurrentForeignKey
- end
-end
diff --git a/db/migrate/20190515125613_add_application_settings_elasticsearch_shards.rb b/db/migrate/20190515125613_add_application_settings_elasticsearch_shards.rb
deleted file mode 100644
index 9cebc0f8db4..00000000000
--- a/db/migrate/20190515125613_add_application_settings_elasticsearch_shards.rb
+++ /dev/null
@@ -1,10 +0,0 @@
-# frozen_string_literal: true
-
-class AddApplicationSettingsElasticsearchShards < ActiveRecord::Migration[5.1]
- DOWNTIME = false
-
- def change
- add_column :application_settings, :elasticsearch_shards, :integer, null: false, default: 5
- add_column :application_settings, :elasticsearch_replicas, :integer, null: false, default: 1
- end
-end
diff --git a/db/migrate/20190516011213_add_build_queued_at_index.rb b/db/migrate/20190516011213_add_build_queued_at_index.rb
deleted file mode 100644
index 77ffa7cd4e9..00000000000
--- a/db/migrate/20190516011213_add_build_queued_at_index.rb
+++ /dev/null
@@ -1,19 +0,0 @@
-# frozen_string_literal: true
-
-# This migration make queued_at field indexed to speed up builds filtering by job_age
-
-class AddBuildQueuedAtIndex < ActiveRecord::Migration[5.1]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- add_concurrent_index :ci_builds, :queued_at
- end
-
- def down
- remove_concurrent_index :ci_builds, :queued_at
- end
-end
diff --git a/db/migrate/20190516151857_add_lets_encrypt_private_key_to_application_settings.rb b/db/migrate/20190516151857_add_lets_encrypt_private_key_to_application_settings.rb
deleted file mode 100644
index a2692ad32e9..00000000000
--- a/db/migrate/20190516151857_add_lets_encrypt_private_key_to_application_settings.rb
+++ /dev/null
@@ -1,18 +0,0 @@
-# frozen_string_literal: true
-
-# See http://doc.gitlab.com/ce/development/migration_style_guide.html
-# for more information on how to write migrations for GitLab.
-
-class AddLetsEncryptPrivateKeyToApplicationSettings < ActiveRecord::Migration[5.1]
- include Gitlab::Database::MigrationHelpers
-
- # Set this constant to true if this migration requires downtime.
- DOWNTIME = false
-
- # rubocop:disable Migration/AddLimitToTextColumns
- def change
- add_column :application_settings, :encrypted_lets_encrypt_private_key, :text
- add_column :application_settings, :encrypted_lets_encrypt_private_key_iv, :text
- end
- # rubocop:enable Migration/AddLimitToTextColumns
-end
diff --git a/db/migrate/20190516155724_change_packages_size_defaults_in_project_statistics.rb b/db/migrate/20190516155724_change_packages_size_defaults_in_project_statistics.rb
deleted file mode 100644
index eba154df496..00000000000
--- a/db/migrate/20190516155724_change_packages_size_defaults_in_project_statistics.rb
+++ /dev/null
@@ -1,24 +0,0 @@
-# frozen_string_literal: true
-
-class ChangePackagesSizeDefaultsInProjectStatistics < ActiveRecord::Migration[5.1]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- change_column_default :project_statistics, :packages_size, 0
-
- update_column_in_batches(:project_statistics, :packages_size, 0) do |table, query|
- query.where(table[:packages_size].eq(nil))
- end
-
- change_column_null :project_statistics, :packages_size, false
- end
-
- def down
- change_column_null :project_statistics, :packages_size, true
- change_column_default :project_statistics, :packages_size, nil
- end
-end
diff --git a/db/migrate/20190520200123_add_rule_type_to_approval_merge_request_approval_rules.rb b/db/migrate/20190520200123_add_rule_type_to_approval_merge_request_approval_rules.rb
deleted file mode 100644
index 7bdb48f3eec..00000000000
--- a/db/migrate/20190520200123_add_rule_type_to_approval_merge_request_approval_rules.rb
+++ /dev/null
@@ -1,21 +0,0 @@
-# frozen_string_literal: true
-
-# See http://doc.gitlab.com/ce/development/migration_style_guide.html
-# for more information on how to write migrations for GitLab.
-
-class AddRuleTypeToApprovalMergeRequestApprovalRules < ActiveRecord::Migration[5.1]
- include Gitlab::Database::MigrationHelpers
-
- # Set this constant to true if this migration requires downtime.
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- add_column_with_default(:approval_merge_request_rules, :rule_type, :integer, limit: 2, default: 1) # rubocop:disable Migration/AddColumnWithDefault
- end
-
- def down
- remove_column(:approval_merge_request_rules, :rule_type)
- end
-end
diff --git a/db/migrate/20190521174505_add_report_type_to_approval_merge_request_rules.rb b/db/migrate/20190521174505_add_report_type_to_approval_merge_request_rules.rb
deleted file mode 100644
index eafffd4f5a3..00000000000
--- a/db/migrate/20190521174505_add_report_type_to_approval_merge_request_rules.rb
+++ /dev/null
@@ -1,13 +0,0 @@
-# frozen_string_literal: true
-
-class AddReportTypeToApprovalMergeRequestRules < ActiveRecord::Migration[5.1]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- def change
- change_table :approval_merge_request_rules do |t|
- t.integer :report_type, limit: 2
- end
- end
-end
diff --git a/db/migrate/20190523112344_limit_milestone_date_years_to_4_digits.rb b/db/migrate/20190523112344_limit_milestone_date_years_to_4_digits.rb
deleted file mode 100644
index 86fe09d7573..00000000000
--- a/db/migrate/20190523112344_limit_milestone_date_years_to_4_digits.rb
+++ /dev/null
@@ -1,38 +0,0 @@
-# frozen_string_literal: true
-
-# See http://doc.gitlab.com/ce/development/migration_style_guide.html
-# for more information on how to write migrations for GitLab.
-
-class LimitMilestoneDateYearsTo4Digits < ActiveRecord::Migration[5.1]
- include Gitlab::Database::MigrationHelpers
-
- # Set this constant to true if this migration requires downtime.
- DOWNTIME = false
-
- # When a migration requires downtime you **must** uncomment the following
- # constant and define a short and easy to understand explanation as to why the
- # migration requires downtime.
- # DOWNTIME_REASON = ''
-
- # When using the methods "add_concurrent_index", "remove_concurrent_index" or
- # "add_column_with_default" you must disable the use of transactions
- # as these methods can not run in an existing transaction.
- # When using "add_concurrent_index" or "remove_concurrent_index" methods make sure
- # that either of them is the _only_ method called in the migration,
- # any other changes should go in a separate migration.
- # This ensures that upon failure _only_ the index creation or removing fails
- # and can be retried or reverted easily.
- #
- # To disable transactions uncomment the following line and remove these
- # comments:
- # disable_ddl_transaction!
-
- def change
- Milestone.where("start_date > '9999-12-31'").update_all(
- "start_date = '9999-12-31'"
- )
- Milestone.where("due_date > '9999-12-31'").update_all(
- "due_date = '9999-12-31'"
- )
- end
-end
diff --git a/db/migrate/20190524062810_generate_lets_encrypt_private_key.rb b/db/migrate/20190524062810_generate_lets_encrypt_private_key.rb
deleted file mode 100644
index ae93a76575a..00000000000
--- a/db/migrate/20190524062810_generate_lets_encrypt_private_key.rb
+++ /dev/null
@@ -1,18 +0,0 @@
-# frozen_string_literal: true
-
-# See http://doc.gitlab.com/ce/development/migration_style_guide.html
-# for more information on how to write migrations for GitLab.
-
-class GenerateLetsEncryptPrivateKey < ActiveRecord::Migration[5.1]
- include Gitlab::Database::MigrationHelpers
-
- # Set this constant to true if this migration requires downtime.
- DOWNTIME = false
-
- # we now generate this key on the fly, but since this migration was merged to master, we don't remove it
- def up
- end
-
- def down
- end
-end
diff --git a/db/migrate/20190524071727_add_ssl_valid_period_to_pages_domain.rb b/db/migrate/20190524071727_add_ssl_valid_period_to_pages_domain.rb
deleted file mode 100644
index 18544dcb6d3..00000000000
--- a/db/migrate/20190524071727_add_ssl_valid_period_to_pages_domain.rb
+++ /dev/null
@@ -1,16 +0,0 @@
-# frozen_string_literal: true
-
-# See http://doc.gitlab.com/ce/development/migration_style_guide.html
-# for more information on how to write migrations for GitLab.
-
-class AddSslValidPeriodToPagesDomain < ActiveRecord::Migration[5.1]
- include Gitlab::Database::MigrationHelpers
-
- # Set this constant to true if this migration requires downtime.
- DOWNTIME = false
-
- def change
- add_column :pages_domains, :certificate_valid_not_before, :datetime_with_timezone
- add_column :pages_domains, :certificate_valid_not_after, :datetime_with_timezone
- end
-end
diff --git a/db/migrate/20190527011309_add_required_template_name_to_application_settings.rb b/db/migrate/20190527011309_add_required_template_name_to_application_settings.rb
deleted file mode 100644
index 9e0f5c5b1e7..00000000000
--- a/db/migrate/20190527011309_add_required_template_name_to_application_settings.rb
+++ /dev/null
@@ -1,17 +0,0 @@
-# frozen_string_literal: true
-
-# See http://doc.gitlab.com/ce/development/migration_style_guide.html
-# for more information on how to write migrations for GitLab.
-
-class AddRequiredTemplateNameToApplicationSettings < ActiveRecord::Migration[5.1]
- include Gitlab::Database::MigrationHelpers
-
- # Set this constant to true if this migration requires downtime.
- DOWNTIME = false
-
- # rubocop:disable Migration/PreventStrings
- def change
- add_column :application_settings, :required_instance_ci_template, :string, null: true
- end
- # rubocop:enable Migration/PreventStrings
-end
diff --git a/db/migrate/20190527194830_add_wiki_size_to_statistics.rb b/db/migrate/20190527194830_add_wiki_size_to_statistics.rb
deleted file mode 100644
index d4f16cdec18..00000000000
--- a/db/migrate/20190527194830_add_wiki_size_to_statistics.rb
+++ /dev/null
@@ -1,9 +0,0 @@
-# frozen_string_literal: true
-
-class AddWikiSizeToStatistics < ActiveRecord::Migration[5.0]
- DOWNTIME = false
-
- def change
- add_column :project_statistics, :wiki_size, :bigint
- end
-end
diff --git a/db/migrate/20190528173628_add_index_for_code_owner_rule_type_on_approval_merge_request_rules.rb b/db/migrate/20190528173628_add_index_for_code_owner_rule_type_on_approval_merge_request_rules.rb
deleted file mode 100644
index 96d878a98f2..00000000000
--- a/db/migrate/20190528173628_add_index_for_code_owner_rule_type_on_approval_merge_request_rules.rb
+++ /dev/null
@@ -1,55 +0,0 @@
-# frozen_string_literal: true
-
-# See http://doc.gitlab.com/ce/development/migration_style_guide.html
-# for more information on how to write migrations for GitLab.
-
-class AddIndexForCodeOwnerRuleTypeOnApprovalMergeRequestRules < ActiveRecord::Migration[5.1]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- INDEX_CODE_OWNERS_RULES_UNIQUENESS_NAME = 'index_approval_rule_name_for_code_owners_rule_type'
- INDEX_CODE_OWNERS_RULES_QUERY_NAME = 'index_approval_rules_code_owners_rule_type'
-
- class ApprovalMergeRequestRule < ActiveRecord::Base
- include EachBatch
-
- enum rule_types: {
- regular: 1,
- code_owner: 2
- }
- end
-
- def up
- # Ensure only 1 code_owner rule per merge_request
- add_concurrent_index(
- :approval_merge_request_rules,
- [:merge_request_id, :rule_type, :name],
- unique: true,
- where: "rule_type = #{ApprovalMergeRequestRule.rule_types[:code_owner]}",
- name: INDEX_CODE_OWNERS_RULES_UNIQUENESS_NAME
- )
-
- # Support lookups for all code_owner rules per merge_request
- add_concurrent_index(
- :approval_merge_request_rules,
- [:merge_request_id, :rule_type],
- where: "rule_type = #{ApprovalMergeRequestRule.rule_types[:code_owner]}",
- name: INDEX_CODE_OWNERS_RULES_QUERY_NAME
- )
- end
-
- def down
- remove_concurrent_index_by_name(
- :approval_merge_request_rules,
- INDEX_CODE_OWNERS_RULES_UNIQUENESS_NAME
- )
-
- remove_concurrent_index_by_name(
- :approval_merge_request_rules,
- INDEX_CODE_OWNERS_RULES_QUERY_NAME
- )
- end
-end
diff --git a/db/migrate/20190529142545_add_dns_rebinding_protection_enabled_to_application_settings.rb b/db/migrate/20190529142545_add_dns_rebinding_protection_enabled_to_application_settings.rb
deleted file mode 100644
index b50845c85b3..00000000000
--- a/db/migrate/20190529142545_add_dns_rebinding_protection_enabled_to_application_settings.rb
+++ /dev/null
@@ -1,23 +0,0 @@
-# frozen_string_literal: true
-
-# See http://doc.gitlab.com/ce/development/migration_style_guide.html
-# for more information on how to write migrations for GitLab.
-
-class AddDnsRebindingProtectionEnabledToApplicationSettings < ActiveRecord::Migration[5.1]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- add_column_with_default(:application_settings, :dns_rebinding_protection_enabled, # rubocop:disable Migration/AddColumnWithDefault
- :boolean,
- default: true,
- allow_null: false)
- end
-
- def down
- remove_column(:application_settings, :dns_rebinding_protection_enabled)
- end
-end
diff --git a/db/migrate/20190530042141_add_default_git_depth_to_ci_cd_settings.rb b/db/migrate/20190530042141_add_default_git_depth_to_ci_cd_settings.rb
deleted file mode 100644
index 8abea05def4..00000000000
--- a/db/migrate/20190530042141_add_default_git_depth_to_ci_cd_settings.rb
+++ /dev/null
@@ -1,11 +0,0 @@
-# frozen_string_literal: true
-
-class AddDefaultGitDepthToCiCdSettings < ActiveRecord::Migration[5.1]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- def change
- add_column :project_ci_cd_settings, :default_git_depth, :integer
- end
-end
diff --git a/db/migrate/20190530154715_add_index_to_merge_requests_state_and_merge_status.rb b/db/migrate/20190530154715_add_index_to_merge_requests_state_and_merge_status.rb
deleted file mode 100644
index e669f81ca35..00000000000
--- a/db/migrate/20190530154715_add_index_to_merge_requests_state_and_merge_status.rb
+++ /dev/null
@@ -1,21 +0,0 @@
-# frozen_string_literal: true
-
-# See http://doc.gitlab.com/ce/development/migration_style_guide.html
-# for more information on how to write migrations for GitLab.
-
-class AddIndexToMergeRequestsStateAndMergeStatus < ActiveRecord::Migration[5.1]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- add_concurrent_index :merge_requests, [:state, :merge_status],
- where: "state = 'opened' AND merge_status = 'can_be_merged'"
- end
-
- def down
- remove_concurrent_index :merge_requests, [:state, :merge_status]
- end
-end
diff --git a/db/migrate/20190531153110_create_namespace_root_storage_statistics.rb b/db/migrate/20190531153110_create_namespace_root_storage_statistics.rb
deleted file mode 100644
index 702560d05cc..00000000000
--- a/db/migrate/20190531153110_create_namespace_root_storage_statistics.rb
+++ /dev/null
@@ -1,22 +0,0 @@
-# frozen_string_literal: true
-
-class CreateNamespaceRootStorageStatistics < ActiveRecord::Migration[5.1]
- DOWNTIME = false
-
- def change
- create_table :namespace_root_storage_statistics, id: false, primary_key: :namespace_id do |t|
- t.integer :namespace_id, null: false, primary_key: true
- t.datetime_with_timezone :updated_at, null: false
-
- t.bigint :repository_size, null: false, default: 0
- t.bigint :lfs_objects_size, null: false, default: 0
- t.bigint :wiki_size, null: false, default: 0
- t.bigint :build_artifacts_size, null: false, default: 0
- t.bigint :storage_size, null: false, default: 0
- t.bigint :packages_size, null: false, default: 0
-
- t.index :namespace_id, unique: true
- t.foreign_key :namespaces, column: :namespace_id, on_delete: :cascade
- end
- end
-end
diff --git a/db/migrate/20190602014139_add_repository_type_to_lfs_objects_project.rb b/db/migrate/20190602014139_add_repository_type_to_lfs_objects_project.rb
deleted file mode 100644
index 6ff64ba12a9..00000000000
--- a/db/migrate/20190602014139_add_repository_type_to_lfs_objects_project.rb
+++ /dev/null
@@ -1,11 +0,0 @@
-# frozen_string_literal: true
-
-class AddRepositoryTypeToLfsObjectsProject < ActiveRecord::Migration[5.1]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- def change
- add_column :lfs_objects_projects, :repository_type, :integer, limit: 2, null: true
- end
-end
diff --git a/db/migrate/20190603124955_add_index_to_count_pending_mirror_updates.rb b/db/migrate/20190603124955_add_index_to_count_pending_mirror_updates.rb
deleted file mode 100644
index 6aa94f7b20b..00000000000
--- a/db/migrate/20190603124955_add_index_to_count_pending_mirror_updates.rb
+++ /dev/null
@@ -1,17 +0,0 @@
-# frozen_string_literal: true
-
-class AddIndexToCountPendingMirrorUpdates < ActiveRecord::Migration[5.1]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- add_concurrent_index :project_mirror_data, [:last_update_at, :retry_count]
- end
-
- def down
- remove_concurrent_index :project_mirror_data, [:last_update_at, :retry_count]
- end
-end
diff --git a/db/migrate/20190604091310_add_ldap_membership_lock.rb b/db/migrate/20190604091310_add_ldap_membership_lock.rb
deleted file mode 100644
index d2e99f33b87..00000000000
--- a/db/migrate/20190604091310_add_ldap_membership_lock.rb
+++ /dev/null
@@ -1,20 +0,0 @@
-# frozen_string_literal: true
-
-# See http://doc.gitlab.com/ce/development/migration_style_guide.html
-# for more information on how to write migrations for GitLab.
-
-class AddLdapMembershipLock < ActiveRecord::Migration[5.1]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- add_column_with_default(:application_settings, :lock_memberships_to_ldap, :boolean, default: false) # rubocop:disable Migration/AddColumnWithDefault
- end
-
- def down
- remove_column(:application_settings, :lock_memberships_to_ldap)
- end
-end
diff --git a/db/migrate/20190604184643_fix_pool_repository_source_project_id.rb b/db/migrate/20190604184643_fix_pool_repository_source_project_id.rb
deleted file mode 100644
index 30244760e6b..00000000000
--- a/db/migrate/20190604184643_fix_pool_repository_source_project_id.rb
+++ /dev/null
@@ -1,19 +0,0 @@
-# frozen_string_literal: true
-
-# See http://doc.gitlab.com/ce/development/migration_style_guide.html
-# for more information on how to write migrations for GitLab.
-
-class FixPoolRepositorySourceProjectId < ActiveRecord::Migration[5.1]
- include Gitlab::Database::MigrationHelpers
-
- # Set this constant to true if this migration requires downtime.
- DOWNTIME = false
-
- def up
- execute "UPDATE pool_repositories SET source_project_id = (SELECT MIN(id) FROM projects WHERE pool_repository_id = pool_repositories.id) WHERE pool_repositories.source_project_id IS NULL"
- end
-
- def down
- # nothing to do her
- end
-end
diff --git a/db/migrate/20190605104727_add_default_project_deletion_protection_to_application_settings.rb b/db/migrate/20190605104727_add_default_project_deletion_protection_to_application_settings.rb
deleted file mode 100644
index e660c918fa4..00000000000
--- a/db/migrate/20190605104727_add_default_project_deletion_protection_to_application_settings.rb
+++ /dev/null
@@ -1,22 +0,0 @@
-# frozen_string_literal: true
-
-# See http://doc.gitlab.com/ce/development/migration_style_guide.html
-# for more information on how to write migrations for GitLab.
-
-class AddDefaultProjectDeletionProtectionToApplicationSettings < ActiveRecord::Migration[5.1]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- # rubocop:disable Migration/AddColumnWithDefault
- add_column_with_default :application_settings, :default_project_deletion_protection, :boolean, default: false, allow_null: false
- # rubocop:enable Migration/AddColumnWithDefault
- end
-
- def down
- remove_column :application_settings, :default_project_deletion_protection
- end
-end
diff --git a/db/migrate/20190605184422_create_namespace_aggregation_schedules.rb b/db/migrate/20190605184422_create_namespace_aggregation_schedules.rb
deleted file mode 100644
index 5e8cb616cc1..00000000000
--- a/db/migrate/20190605184422_create_namespace_aggregation_schedules.rb
+++ /dev/null
@@ -1,14 +0,0 @@
-# frozen_string_literal: true
-
-class CreateNamespaceAggregationSchedules < ActiveRecord::Migration[5.1]
- DOWNTIME = false
-
- def change
- create_table :namespace_aggregation_schedules, id: false, primary_key: :namespace_id do |t|
- t.integer :namespace_id, null: false, primary_key: true
-
- t.index :namespace_id, unique: true
- t.foreign_key :namespaces, column: :namespace_id, on_delete: :cascade
- end
- end
-end
diff --git a/db/migrate/20190606014128_add_last_ci_minutes_notification_at_to_namespaces.rb b/db/migrate/20190606014128_add_last_ci_minutes_notification_at_to_namespaces.rb
deleted file mode 100644
index 53b2e9f01fe..00000000000
--- a/db/migrate/20190606014128_add_last_ci_minutes_notification_at_to_namespaces.rb
+++ /dev/null
@@ -1,12 +0,0 @@
-# frozen_string_literal: true
-
-# See http://doc.gitlab.com/ce/development/migration_style_guide.html
-# for more information on how to write migrations for GitLab.
-
-class AddLastCiMinutesNotificationAtToNamespaces < ActiveRecord::Migration[5.1]
- DOWNTIME = false
-
- def change
- add_column :namespaces, :last_ci_minutes_notification_at, :datetime_with_timezone # rubocop:disable Migration/AddColumnsToWideTables
- end
-end
diff --git a/db/migrate/20190606034427_add_lfs_object_id_index_to_lfs_objects_projects.rb b/db/migrate/20190606034427_add_lfs_object_id_index_to_lfs_objects_projects.rb
deleted file mode 100644
index fc09fcfae0f..00000000000
--- a/db/migrate/20190606034427_add_lfs_object_id_index_to_lfs_objects_projects.rb
+++ /dev/null
@@ -1,17 +0,0 @@
-# frozen_string_literal: true
-
-class AddLfsObjectIdIndexToLfsObjectsProjects < ActiveRecord::Migration[5.1]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- add_concurrent_index :lfs_objects_projects, :lfs_object_id
- end
-
- def down
- remove_concurrent_index :lfs_objects_projects, :lfs_object_id
- end
-end
diff --git a/db/migrate/20190606054649_change_operations_feature_flags_clients_token_not_null.rb b/db/migrate/20190606054649_change_operations_feature_flags_clients_token_not_null.rb
deleted file mode 100644
index c9dbb48f5bd..00000000000
--- a/db/migrate/20190606054649_change_operations_feature_flags_clients_token_not_null.rb
+++ /dev/null
@@ -1,11 +0,0 @@
-# frozen_string_literal: true
-
-class ChangeOperationsFeatureFlagsClientsTokenNotNull < ActiveRecord::Migration[5.1]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- def change
- change_column_null :operations_feature_flags_clients, :token, true
- end
-end
diff --git a/db/migrate/20190606054742_add_token_encrypted_to_operations_feature_flags_clients.rb b/db/migrate/20190606054742_add_token_encrypted_to_operations_feature_flags_clients.rb
deleted file mode 100644
index 01cd49ac219..00000000000
--- a/db/migrate/20190606054742_add_token_encrypted_to_operations_feature_flags_clients.rb
+++ /dev/null
@@ -1,13 +0,0 @@
-# frozen_string_literal: true
-
-class AddTokenEncryptedToOperationsFeatureFlagsClients < ActiveRecord::Migration[5.1]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- # rubocop:disable Migration/PreventStrings
- def change
- add_column :operations_feature_flags_clients, :token_encrypted, :string
- end
- # rubocop:enable Migration/PreventStrings
-end
diff --git a/db/migrate/20190606054832_add_index_to_operations_feature_flags_clients_token_encrypted.rb b/db/migrate/20190606054832_add_index_to_operations_feature_flags_clients_token_encrypted.rb
deleted file mode 100644
index 5627457af5c..00000000000
--- a/db/migrate/20190606054832_add_index_to_operations_feature_flags_clients_token_encrypted.rb
+++ /dev/null
@@ -1,18 +0,0 @@
-# frozen_string_literal: true
-
-class AddIndexToOperationsFeatureFlagsClientsTokenEncrypted < ActiveRecord::Migration[5.1]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- add_concurrent_index :operations_feature_flags_clients, [:project_id, :token_encrypted],
- unique: true, name: "index_feature_flags_clients_on_project_id_and_token_encrypted"
- end
-
- def down
- remove_concurrent_index_by_name :operations_feature_flags_clients, "index_feature_flags_clients_on_project_id_and_token_encrypted"
- end
-end
diff --git a/db/migrate/20190606202100_add_name_to_badges.rb b/db/migrate/20190606202100_add_name_to_badges.rb
deleted file mode 100644
index 7b386a6e690..00000000000
--- a/db/migrate/20190606202100_add_name_to_badges.rb
+++ /dev/null
@@ -1,11 +0,0 @@
-# frozen_string_literal: true
-
-class AddNameToBadges < ActiveRecord::Migration[5.0]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- def change
- add_column :badges, :name, :string, null: true, limit: 255 # rubocop:disable Migration/PreventStrings
- end
-end
diff --git a/db/migrate/20190607085356_add_source_to_pages_domains.rb b/db/migrate/20190607085356_add_source_to_pages_domains.rb
deleted file mode 100644
index d681ab67431..00000000000
--- a/db/migrate/20190607085356_add_source_to_pages_domains.rb
+++ /dev/null
@@ -1,21 +0,0 @@
-# frozen_string_literal: true
-
-# See http://doc.gitlab.com/ce/development/migration_style_guide.html
-# for more information on how to write migrations for GitLab.
-
-class AddSourceToPagesDomains < ActiveRecord::Migration[5.1]
- include Gitlab::Database::MigrationHelpers
-
- # Set this constant to true if this migration requires downtime.
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- add_column_with_default(:pages_domains, :certificate_source, :smallint, default: 0) # rubocop:disable Migration/AddColumnWithDefault
- end
-
- def down
- remove_column(:pages_domains, :certificate_source)
- end
-end
diff --git a/db/migrate/20190607145325_add_pages_domains_ssl_renew_index.rb b/db/migrate/20190607145325_add_pages_domains_ssl_renew_index.rb
deleted file mode 100644
index 7167accbf1e..00000000000
--- a/db/migrate/20190607145325_add_pages_domains_ssl_renew_index.rb
+++ /dev/null
@@ -1,25 +0,0 @@
-# frozen_string_literal: true
-
-# See http://doc.gitlab.com/ce/development/migration_style_guide.html
-# for more information on how to write migrations for GitLab.
-
-class AddPagesDomainsSslRenewIndex < ActiveRecord::Migration[5.1]
- include Gitlab::Database::MigrationHelpers
-
- # Set this constant to true if this migration requires downtime.
- DOWNTIME = false
-
- INDEX_NAME = 'index_pages_domains_need_auto_ssl_renewal'
-
- disable_ddl_transaction!
-
- def up
- add_concurrent_index(:pages_domains, [:certificate_source, :certificate_valid_not_after],
- where: "auto_ssl_enabled = #{::Gitlab::Database.true_value}", name: INDEX_NAME)
- end
-
- def down
- remove_concurrent_index(:pages_domains, [:certificate_source, :certificate_valid_not_after],
- where: "auto_ssl_enabled = #{::Gitlab::Database.true_value}", name: INDEX_NAME)
- end
-end
diff --git a/db/migrate/20190607190856_add_index_to_users_public_emails.rb b/db/migrate/20190607190856_add_index_to_users_public_emails.rb
deleted file mode 100644
index 81ec38b8b32..00000000000
--- a/db/migrate/20190607190856_add_index_to_users_public_emails.rb
+++ /dev/null
@@ -1,23 +0,0 @@
-# frozen_string_literal: true
-
-# See http://doc.gitlab.com/ce/development/migration_style_guide.html
-# for more information on how to write migrations for GitLab.
-
-class AddIndexToUsersPublicEmails < ActiveRecord::Migration[5.1]
- include Gitlab::Database::MigrationHelpers
-
- # Set this constant to true if this migration requires downtime.
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- add_concurrent_index :users, [:public_email],
- where: "public_email != ''"
- end
-
- def down
- remove_concurrent_index :users, [:public_email],
- where: "public_email != ''"
- end
-end
diff --git a/db/migrate/20190607205656_add_wiki_columns_to_index_status.rb b/db/migrate/20190607205656_add_wiki_columns_to_index_status.rb
deleted file mode 100644
index 0910d425212..00000000000
--- a/db/migrate/20190607205656_add_wiki_columns_to_index_status.rb
+++ /dev/null
@@ -1,12 +0,0 @@
-# frozen_string_literal: true
-
-class AddWikiColumnsToIndexStatus < ActiveRecord::Migration[5.1]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- def change
- add_column :index_statuses, :last_wiki_commit, :binary
- add_column :index_statuses, :wiki_indexed_at, :datetime_with_timezone
- end
-end
diff --git a/db/migrate/20190610142825_add_index_to_members_invite_email.rb b/db/migrate/20190610142825_add_index_to_members_invite_email.rb
deleted file mode 100644
index 58157cc5313..00000000000
--- a/db/migrate/20190610142825_add_index_to_members_invite_email.rb
+++ /dev/null
@@ -1,21 +0,0 @@
-# frozen_string_literal: true
-
-# See http://doc.gitlab.com/ce/development/migration_style_guide.html
-# for more information on how to write migrations for GitLab.
-
-class AddIndexToMembersInviteEmail < ActiveRecord::Migration[5.1]
- include Gitlab::Database::MigrationHelpers
-
- # Set this constant to true if this migration requires downtime.
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- add_concurrent_index :members, [:invite_email]
- end
-
- def down
- remove_concurrent_index :members, [:invite_email]
- end
-end
diff --git a/db/migrate/20190611090827_add_time_tracking_limit_to_hours_to_application_settings.rb b/db/migrate/20190611090827_add_time_tracking_limit_to_hours_to_application_settings.rb
deleted file mode 100644
index f0a3ec1d3bc..00000000000
--- a/db/migrate/20190611090827_add_time_tracking_limit_to_hours_to_application_settings.rb
+++ /dev/null
@@ -1,23 +0,0 @@
-# frozen_string_literal: true
-
-# See http://doc.gitlab.com/ce/development/migration_style_guide.html
-# for more information on how to write migrations for GitLab.
-
-class AddTimeTrackingLimitToHoursToApplicationSettings < ActiveRecord::Migration[5.1]
- include Gitlab::Database::MigrationHelpers
-
- # Set this constant to true if this migration requires downtime.
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- # rubocop:disable Migration/AddColumnWithDefault
- add_column_with_default :application_settings, :time_tracking_limit_to_hours, :boolean, default: false, allow_null: false
- # rubocop:enable Migration/AddColumnWithDefault
- end
-
- def down
- remove_column :application_settings, :time_tracking_limit_to_hours
- end
-end
diff --git a/db/migrate/20190611100201_add_geo_container_repository_updated_events_table.rb b/db/migrate/20190611100201_add_geo_container_repository_updated_events_table.rb
deleted file mode 100644
index 8963e837e08..00000000000
--- a/db/migrate/20190611100201_add_geo_container_repository_updated_events_table.rb
+++ /dev/null
@@ -1,17 +0,0 @@
-# frozen_string_literal: true
-
-class AddGeoContainerRepositoryUpdatedEventsTable < ActiveRecord::Migration[5.1]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- def change
- create_table :geo_container_repository_updated_events, force: :cascade do |t|
- t.integer :container_repository_id, null: false
-
- t.index :container_repository_id, name: :idx_geo_con_rep_updated_events_on_container_repository_id, using: :btree
- end
-
- add_column :geo_event_log, :container_repository_updated_event_id, :bigint
- end
-end
diff --git a/db/migrate/20190611100202_add_index_to_geo_event_log.rb b/db/migrate/20190611100202_add_index_to_geo_event_log.rb
deleted file mode 100644
index c5c855fed61..00000000000
--- a/db/migrate/20190611100202_add_index_to_geo_event_log.rb
+++ /dev/null
@@ -1,17 +0,0 @@
-# frozen_string_literal: true
-
-class AddIndexToGeoEventLog < ActiveRecord::Migration[5.1]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- add_concurrent_index :geo_event_log, :container_repository_updated_event_id
- end
-
- def down
- remove_concurrent_index(:geo_event_log, :container_repository_updated_event_id)
- end
-end
diff --git a/db/migrate/20190611161641_add_target_project_id_to_merge_trains.rb b/db/migrate/20190611161641_add_target_project_id_to_merge_trains.rb
deleted file mode 100644
index 7b73202ab8d..00000000000
--- a/db/migrate/20190611161641_add_target_project_id_to_merge_trains.rb
+++ /dev/null
@@ -1,18 +0,0 @@
-# frozen_string_literal: true
-
-class AddTargetProjectIdToMergeTrains < ActiveRecord::Migration[5.1]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- # rubocop:disable Rails/NotNullColumn
- # rubocop:disable Migration/AddReference
- # rubocop:disable Migration/AddLimitToTextColumns
- def change
- add_reference :merge_trains, :target_project, null: false, index: true, foreign_key: { on_delete: :cascade, to_table: :projects }, type: :integer
- add_column :merge_trains, :target_branch, :text, null: false
- end
- # rubocop:enable Migration/AddLimitToTextColumns
- # rubocop:enable Migration/AddReference
- # rubocop:enable Rails/NotNullColumn
-end
diff --git a/db/migrate/20190612111201_add_geo_container_repository_counters.rb b/db/migrate/20190612111201_add_geo_container_repository_counters.rb
deleted file mode 100644
index b73bb885ab7..00000000000
--- a/db/migrate/20190612111201_add_geo_container_repository_counters.rb
+++ /dev/null
@@ -1,16 +0,0 @@
-# frozen_string_literal: true
-
-class AddGeoContainerRepositoryCounters < ActiveRecord::Migration[5.1]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- def change
- change_table :geo_node_statuses do |t|
- t.column :container_repositories_count, :integer
- t.column :container_repositories_synced_count, :integer
- t.column :container_repositories_failed_count, :integer
- t.column :container_repositories_registry_count, :integer
- end
- end
-end
diff --git a/db/migrate/20190612111404_add_geo_container_sync_capacity.rb b/db/migrate/20190612111404_add_geo_container_sync_capacity.rb
deleted file mode 100644
index d4cd569f460..00000000000
--- a/db/migrate/20190612111404_add_geo_container_sync_capacity.rb
+++ /dev/null
@@ -1,13 +0,0 @@
-# frozen_string_literal: true
-
-class AddGeoContainerSyncCapacity < ActiveRecord::Migration[5.1]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- def change
- change_table :geo_nodes do |t|
- t.column :container_repositories_max_capacity, :integer, default: 10, null: false
- end
- end
-end
diff --git a/db/migrate/20190613030606_enable_hashed_storage_by_default.rb b/db/migrate/20190613030606_enable_hashed_storage_by_default.rb
deleted file mode 100644
index 8edefd1273e..00000000000
--- a/db/migrate/20190613030606_enable_hashed_storage_by_default.rb
+++ /dev/null
@@ -1,15 +0,0 @@
-# frozen_string_literal: true
-
-class EnableHashedStorageByDefault < ActiveRecord::Migration[5.1]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- def up
- change_column_default :application_settings, :hashed_storage_enabled, true
- end
-
- def down
- change_column_default :application_settings, :hashed_storage_enabled, false
- end
-end
diff --git a/db/migrate/20190613044655_add_username_to_deploy_tokens.rb b/db/migrate/20190613044655_add_username_to_deploy_tokens.rb
deleted file mode 100644
index ac5a6589f07..00000000000
--- a/db/migrate/20190613044655_add_username_to_deploy_tokens.rb
+++ /dev/null
@@ -1,9 +0,0 @@
-# frozen_string_literal: true
-
-class AddUsernameToDeployTokens < ActiveRecord::Migration[5.1]
- DOWNTIME = false
-
- def change
- add_column :deploy_tokens, :username, :string # rubocop:disable Migration/PreventStrings
- end
-end
diff --git a/db/migrate/20190613073003_create_project_aliases.rb b/db/migrate/20190613073003_create_project_aliases.rb
deleted file mode 100644
index ee111d437e9..00000000000
--- a/db/migrate/20190613073003_create_project_aliases.rb
+++ /dev/null
@@ -1,16 +0,0 @@
-# frozen_string_literal: true
-
-class CreateProjectAliases < ActiveRecord::Migration[5.1]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- def change
- create_table :project_aliases do |t|
- t.references :project, null: false, index: true, foreign_key: { on_delete: :cascade }, type: :integer
- t.string :name, null: false, index: { unique: true } # rubocop:disable Migration/PreventStrings
-
- t.timestamps_with_timezone null: false
- end
- end
-end
diff --git a/db/migrate/20190617123615_add_grafana_to_settings.rb b/db/migrate/20190617123615_add_grafana_to_settings.rb
deleted file mode 100644
index 2d2250cef27..00000000000
--- a/db/migrate/20190617123615_add_grafana_to_settings.rb
+++ /dev/null
@@ -1,18 +0,0 @@
-# frozen_string_literal: true
-
-class AddGrafanaToSettings < ActiveRecord::Migration[5.1]
- include Gitlab::Database::MigrationHelpers
-
- disable_ddl_transaction!
-
- DOWNTIME = false
-
- def up
- add_column_with_default(:application_settings, :grafana_enabled, :boolean, # rubocop:disable Migration/AddColumnWithDefault
- default: false, allow_null: false)
- end
-
- def down
- remove_column(:application_settings, :grafana_enabled)
- end
-end
diff --git a/db/migrate/20190620105427_change_null_private_profile_to_false.rb b/db/migrate/20190620105427_change_null_private_profile_to_false.rb
deleted file mode 100644
index d820dbbe9d3..00000000000
--- a/db/migrate/20190620105427_change_null_private_profile_to_false.rb
+++ /dev/null
@@ -1,33 +0,0 @@
-# frozen_string_literal: true
-
-class ChangeNullPrivateProfileToFalse < ActiveRecord::Migration[5.1]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
- DELAY = 30.seconds.to_i
- BATCH_SIZE = 1_000
-
- disable_ddl_transaction!
-
- class User < ActiveRecord::Base
- self.table_name = 'users'
-
- include ::EachBatch
- end
-
- def up
- change_column_default :users, :private_profile, false
-
- # Migration will take about 120 hours
- User.where(private_profile: nil).each_batch(of: BATCH_SIZE) do |batch, index|
- range = batch.pluck('MIN(id)', 'MAX(id)').first
- delay = index * DELAY
-
- BackgroundMigrationWorker.perform_in(delay.seconds, 'MigrateNullPrivateProfileToFalse', [*range])
- end
- end
-
- def down
- change_column_default :users, :private_profile, nil
- end
-end
diff --git a/db/migrate/20190621022810_add_last_ci_minutes_usage_notification_level_to_namespaces.rb b/db/migrate/20190621022810_add_last_ci_minutes_usage_notification_level_to_namespaces.rb
deleted file mode 100644
index 02e06703acc..00000000000
--- a/db/migrate/20190621022810_add_last_ci_minutes_usage_notification_level_to_namespaces.rb
+++ /dev/null
@@ -1,9 +0,0 @@
-# frozen_string_literal: true
-
-class AddLastCiMinutesUsageNotificationLevelToNamespaces < ActiveRecord::Migration[5.1]
- DOWNTIME = false
-
- def change
- add_column :namespaces, :last_ci_minutes_usage_notification_level, :integer # rubocop:disable Migration/AddColumnsToWideTables
- end
-end
diff --git a/db/migrate/20190621151636_add_merge_request_rebase_jid.rb b/db/migrate/20190621151636_add_merge_request_rebase_jid.rb
deleted file mode 100644
index df1b1c79375..00000000000
--- a/db/migrate/20190621151636_add_merge_request_rebase_jid.rb
+++ /dev/null
@@ -1,9 +0,0 @@
-# frozen_string_literal: true
-
-class AddMergeRequestRebaseJid < ActiveRecord::Migration[5.1]
- DOWNTIME = false
-
- def change
- add_column :merge_requests, :rebase_jid, :string # rubocop:disable Migration/PreventStrings
- end
-end
diff --git a/db/migrate/20190623212503_add_cluster_id_to_deployments.rb b/db/migrate/20190623212503_add_cluster_id_to_deployments.rb
deleted file mode 100644
index cd0c4191568..00000000000
--- a/db/migrate/20190623212503_add_cluster_id_to_deployments.rb
+++ /dev/null
@@ -1,9 +0,0 @@
-# frozen_string_literal: true
-
-class AddClusterIdToDeployments < ActiveRecord::Migration[5.1]
- DOWNTIME = false
-
- def change
- add_column :deployments, :cluster_id, :integer
- end
-end
diff --git a/db/migrate/20190624123615_add_grafana_url_to_settings.rb b/db/migrate/20190624123615_add_grafana_url_to_settings.rb
deleted file mode 100644
index f10014872e9..00000000000
--- a/db/migrate/20190624123615_add_grafana_url_to_settings.rb
+++ /dev/null
@@ -1,20 +0,0 @@
-# frozen_string_literal: true
-
-class AddGrafanaUrlToSettings < ActiveRecord::Migration[5.1]
- include Gitlab::Database::MigrationHelpers
-
- disable_ddl_transaction!
-
- DOWNTIME = false
-
- # rubocop:disable Migration/PreventStrings
- def up
- add_column_with_default(:application_settings, :grafana_url, :string, # rubocop:disable Migration/AddColumnWithDefault
- default: '/-/grafana', allow_null: false)
- end
- # rubocop:enable Migration/PreventStrings
-
- def down
- remove_column(:application_settings, :grafana_url)
- end
-end
diff --git a/db/migrate/20190625115224_add_description_to_services.rb b/db/migrate/20190625115224_add_description_to_services.rb
deleted file mode 100644
index bdd6d70cb0f..00000000000
--- a/db/migrate/20190625115224_add_description_to_services.rb
+++ /dev/null
@@ -1,14 +0,0 @@
-# frozen_string_literal: true
-
-# See http://doc.gitlab.com/ce/development/migration_style_guide.html
-# for more information on how to write migrations for GitLab.
-
-class AddDescriptionToServices < ActiveRecord::Migration[5.1]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- def change
- add_column :services, :description, :string, limit: 500 # rubocop:disable Migration/PreventStrings
- end
-end
diff --git a/db/migrate/20190626175626_add_group_creation_level_to_namespaces.rb b/db/migrate/20190626175626_add_group_creation_level_to_namespaces.rb
deleted file mode 100644
index 6fcadc0c82c..00000000000
--- a/db/migrate/20190626175626_add_group_creation_level_to_namespaces.rb
+++ /dev/null
@@ -1,18 +0,0 @@
-# frozen_string_literal: true
-
-class AddGroupCreationLevelToNamespaces < ActiveRecord::Migration[5.1]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- def up
- add_column(:namespaces, :subgroup_creation_level, :integer) # rubocop:disable Migration/AddColumnsToWideTables
- change_column_default(:namespaces,
- :subgroup_creation_level,
- ::Gitlab::Access::MAINTAINER_SUBGROUP_ACCESS)
- end
-
- def down
- remove_column(:namespaces, :subgroup_creation_level)
- end
-end
diff --git a/db/migrate/20190627051902_add_cluster_id_index_fk_to_deployments.rb b/db/migrate/20190627051902_add_cluster_id_index_fk_to_deployments.rb
deleted file mode 100644
index f41e5c80269..00000000000
--- a/db/migrate/20190627051902_add_cluster_id_index_fk_to_deployments.rb
+++ /dev/null
@@ -1,21 +0,0 @@
-# frozen_string_literal: true
-
-class AddClusterIdIndexFkToDeployments < ActiveRecord::Migration[5.1]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- add_concurrent_index :deployments, :cluster_id
-
- add_concurrent_foreign_key :deployments, :clusters, column: :cluster_id, on_delete: :nullify
- end
-
- def down
- remove_foreign_key :deployments, :clusters
-
- remove_concurrent_index :deployments, :cluster_id
- end
-end
diff --git a/db/migrate/20190627100221_add_mr_productivity_metrics.rb b/db/migrate/20190627100221_add_mr_productivity_metrics.rb
deleted file mode 100644
index b6f1520cb2d..00000000000
--- a/db/migrate/20190627100221_add_mr_productivity_metrics.rb
+++ /dev/null
@@ -1,14 +0,0 @@
-# frozen_string_literal: true
-
-class AddMrProductivityMetrics < ActiveRecord::Migration[5.1]
- DOWNTIME = false
-
- def change
- add_column :merge_request_metrics, :first_comment_at, :datetime_with_timezone
- add_column :merge_request_metrics, :first_commit_at, :datetime_with_timezone
- add_column :merge_request_metrics, :last_commit_at, :datetime_with_timezone
- add_column :merge_request_metrics, :diff_size, :integer
- add_column :merge_request_metrics, :modified_paths_size, :integer
- add_column :merge_request_metrics, :commits_count, :integer
- end
-end
diff --git a/db/migrate/20190627122264_add_foreign_keys_for_container_repository.rb b/db/migrate/20190627122264_add_foreign_keys_for_container_repository.rb
deleted file mode 100644
index cf7fd03e9af..00000000000
--- a/db/migrate/20190627122264_add_foreign_keys_for_container_repository.rb
+++ /dev/null
@@ -1,25 +0,0 @@
-# frozen_string_literal: true
-
-class AddForeignKeysForContainerRepository < ActiveRecord::Migration[5.1]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- add_concurrent_foreign_key(:geo_container_repository_updated_events, :container_repositories, column: :container_repository_id, on_delete: :cascade)
-
- add_concurrent_foreign_key(:geo_event_log, :geo_container_repository_updated_events, column: :container_repository_updated_event_id, on_delete: :cascade)
- end
-
- def down
- if foreign_key_exists?(:geo_container_repository_updated_events, :container_repositories)
- remove_foreign_key(:geo_container_repository_updated_events, :container_repositories)
- end
-
- if foreign_key_exists?(:geo_event_log, :geo_container_repository_updated_events)
- remove_foreign_key(:geo_event_log, :geo_container_repository_updated_events)
- end
- end
-end
diff --git a/db/migrate/20190628145246_add_strategies_to_operations_feature_flag_scopes.rb b/db/migrate/20190628145246_add_strategies_to_operations_feature_flag_scopes.rb
deleted file mode 100644
index 185a2b04531..00000000000
--- a/db/migrate/20190628145246_add_strategies_to_operations_feature_flag_scopes.rb
+++ /dev/null
@@ -1,19 +0,0 @@
-# frozen_string_literal: true
-
-class AddStrategiesToOperationsFeatureFlagScopes < ActiveRecord::Migration[5.1]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- # rubocop:disable Migration/AddColumnWithDefault
- add_column_with_default :operations_feature_flag_scopes, :strategies, :jsonb, default: [{ name: "default", parameters: {} }]
- # rubocop:enable Migration/AddColumnWithDefault
- end
-
- def down
- remove_column(:operations_feature_flag_scopes, :strategies)
- end
-end
diff --git a/db/migrate/20190628185000_add_released_at_to_releases_table.rb b/db/migrate/20190628185000_add_released_at_to_releases_table.rb
deleted file mode 100644
index ae55aa434d9..00000000000
--- a/db/migrate/20190628185000_add_released_at_to_releases_table.rb
+++ /dev/null
@@ -1,11 +0,0 @@
-# frozen_string_literal: true
-
-class AddReleasedAtToReleasesTable < ActiveRecord::Migration[5.1]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- def change
- add_column(:releases, :released_at, :datetime_with_timezone)
- end
-end
diff --git a/db/migrate/20190628185004_backfill_and_add_not_null_constraint_to_released_at_column_on_releases_table.rb b/db/migrate/20190628185004_backfill_and_add_not_null_constraint_to_released_at_column_on_releases_table.rb
deleted file mode 100644
index 1e5d3e8f235..00000000000
--- a/db/migrate/20190628185004_backfill_and_add_not_null_constraint_to_released_at_column_on_releases_table.rb
+++ /dev/null
@@ -1,18 +0,0 @@
-# frozen_string_literal: true
-
-class BackfillAndAddNotNullConstraintToReleasedAtColumnOnReleasesTable < ActiveRecord::Migration[5.1]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- update_column_in_batches(:releases, :released_at, Arel.sql('created_at'))
- change_column_null(:releases, :released_at, false)
- end
-
- def down
- change_column_null(:releases, :released_at, true)
- end
-end
diff --git a/db/migrate/20190703043358_add_commit_id_to_draft_notes.rb b/db/migrate/20190703043358_add_commit_id_to_draft_notes.rb
deleted file mode 100644
index 022400ce585..00000000000
--- a/db/migrate/20190703043358_add_commit_id_to_draft_notes.rb
+++ /dev/null
@@ -1,11 +0,0 @@
-# frozen_string_literal: true
-
-class AddCommitIdToDraftNotes < ActiveRecord::Migration[5.1]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- def change
- add_column :draft_notes, :commit_id, :binary
- end
-end
diff --git a/db/migrate/20190703130053_remove_gitaly_feature_flags.rb b/db/migrate/20190703130053_remove_gitaly_feature_flags.rb
deleted file mode 100644
index 13ac10a5e21..00000000000
--- a/db/migrate/20190703130053_remove_gitaly_feature_flags.rb
+++ /dev/null
@@ -1,48 +0,0 @@
-# frozen_string_literal: true
-
-class RemoveGitalyFeatureFlags < ActiveRecord::Migration[5.1]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- FEATURES = %w[
- gitaly_batch_lfs_pointers gitaly_blame gitaly_blob_get_all_lfs_pointers gitaly_blob_get_new_lfs_pointers
- gitaly_branch_names gitaly_branch_names_contains_sha gitaly_branches gitaly_bundle_to_disk
- gitaly_calculate_checksum gitaly_can_be_merged gitaly_cherry_pick gitaly_commit_count
- gitaly_commit_deltas gitaly_commit_languages gitaly_commit_messages gitaly_commit_patch
- gitaly_commit_raw_diffs gitaly_commit_stats gitaly_commit_tree_entry gitaly_commits_between
- gitaly_commits_by_message gitaly_conflicts_list_conflict_files gitaly_conflicts_resolve_conflicts gitaly_count_commits
- gitaly_count_diverging_commits_no_max gitaly_create_branch gitaly_create_repo_from_bundle gitaly_create_repository
- gitaly_delete_branch gitaly_delete_refs gitaly_delta_islands gitaly_deny_disk_acces
- gitaly_diff_between gitaly_extract_commit_signature gitaly_fetch_ref gitaly_fetch_remote
- gitaly_fetch_source_branch gitaly_filter_shas_with_signature gitaly_filter_shas_with_signatures gitaly_find_all_commits
- gitaly_find_branch gitaly_find_commit gitaly_find_commits gitaly_find_ref_name
- gitaly_force_push gitaly_fork_repository gitaly_garbage_collect gitaly_get_info_attributes
- gitaly_git_blob_load_all_data gitaly_git_blob_raw gitaly_git_fsck gitaly_go-find-all-tags
- gitaly_has_local_branches gitaly_import_repository gitaly_is_ancestor gitaly_last_commit_for_path
- gitaly_license_short_name gitaly_list_blobs_by_sha_path gitaly_list_commits_by_oid gitaly_local_branches
- gitaly_ls_files gitaly_merge_base gitaly_merged_branch_names gitaly_new_commits
- gitaly_operation_user_add_tag gitaly_operation_user_commit_file gitaly_operation_user_commit_files gitaly_operation_user_create_branch
- gitaly_operation_user_delete_branch gitaly_operation_user_delete_tag gitaly_operation_user_ff_branch gitaly_operation_user_merge_branch
- gitaly_post_receive_pack gitaly_post_upload_pack gitaly_project_raw_show gitaly_raw_changes_between
- gitaly_rebase gitaly_rebase_in_progress gitaly_ref_delete_refs gitaly_ref_exists
- gitaly_ref_exists_branch gitaly_ref_exists_branches gitaly_ref_find_all_remote_branches gitaly_remote_add_remote
- gitaly_remote_fetch_internal_remote gitaly_remote_remove_remote gitaly_remote_update_remote_mirror gitaly_remove_namespace
- gitaly_repack_full gitaly_repack_incremental gitaly_repository_cleanup gitaly_repository_exists
- gitaly_repository_size gitaly_root_ref gitaly_search_files_by_content gitaly_search_files_by_name
- gitaly_squash gitaly_squash_in_progress gitaly_ssh_receive_pack gitaly_ssh_upload_pack
- gitaly_submodule_url_for gitaly_tag_messages gitaly_tag_names gitaly_tag_names_contains_sha
- gitaly_tags gitaly_tree_entries gitaly_wiki_delete_page gitaly_wiki_find_file
- gitaly_wiki_find_page gitaly_wiki_get_all_pages gitaly_wiki_page_formatted_data gitaly_wiki_page_versions
- gitaly_wiki_update_page gitaly_wiki_write_page gitaly_workhorse_archive gitaly_workhorse_raw_show
- gitaly_workhorse_send_git_diff gitaly_workhorse_send_git_patch gitaly_write_config gitaly_write_ref
- ]
-
- class Feature < ActiveRecord::Base
- self.table_name = 'features'
- end
-
- def up
- Feature.where(key: FEATURES).delete_all
- end
-end
diff --git a/db/migrate/20190703171157_add_sourcing_epic_dates.rb b/db/migrate/20190703171157_add_sourcing_epic_dates.rb
deleted file mode 100644
index 202e2098d5b..00000000000
--- a/db/migrate/20190703171157_add_sourcing_epic_dates.rb
+++ /dev/null
@@ -1,10 +0,0 @@
-# frozen_string_literal: true
-
-class AddSourcingEpicDates < ActiveRecord::Migration[5.1]
- DOWNTIME = false
-
- def change
- add_column :epics, :start_date_sourcing_epic_id, :integer
- add_column :epics, :due_date_sourcing_epic_id, :integer
- end
-end
diff --git a/db/migrate/20190703171555_add_sourcing_epic_dates_fks.rb b/db/migrate/20190703171555_add_sourcing_epic_dates_fks.rb
deleted file mode 100644
index 4995a3cd03f..00000000000
--- a/db/migrate/20190703171555_add_sourcing_epic_dates_fks.rb
+++ /dev/null
@@ -1,25 +0,0 @@
-# frozen_string_literal: true
-
-class AddSourcingEpicDatesFks < ActiveRecord::Migration[5.1]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- add_concurrent_index :epics, :start_date_sourcing_epic_id, where: 'start_date_sourcing_epic_id is not null'
- add_concurrent_index :epics, :due_date_sourcing_epic_id, where: 'due_date_sourcing_epic_id is not null'
-
- add_concurrent_foreign_key :epics, :epics, column: :start_date_sourcing_epic_id, on_delete: :nullify
- add_concurrent_foreign_key :epics, :epics, column: :due_date_sourcing_epic_id, on_delete: :nullify
- end
-
- def down
- remove_foreign_key_if_exists :epics, column: :start_date_sourcing_epic_id
- remove_foreign_key_if_exists :epics, column: :due_date_sourcing_epic_id
-
- remove_concurrent_index :epics, :start_date_sourcing_epic_id
- remove_concurrent_index :epics, :due_date_sourcing_epic_id
- end
-end
diff --git a/db/migrate/20190709204413_add_rule_type_to_approval_project_rules.rb b/db/migrate/20190709204413_add_rule_type_to_approval_project_rules.rb
deleted file mode 100644
index b11154d0f26..00000000000
--- a/db/migrate/20190709204413_add_rule_type_to_approval_project_rules.rb
+++ /dev/null
@@ -1,17 +0,0 @@
-# frozen_string_literal: true
-
-class AddRuleTypeToApprovalProjectRules < ActiveRecord::Migration[5.1]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- add_column_with_default :approval_project_rules, :rule_type, :integer, limit: 2, default: 0, allow_null: false # rubocop:disable Migration/AddColumnWithDefault
- end
-
- def down
- remove_column :approval_project_rules, :rule_type
- end
-end
diff --git a/db/migrate/20190709220014_import_common_metrics_y_axis.rb b/db/migrate/20190709220014_import_common_metrics_y_axis.rb
deleted file mode 100644
index 89ecf32ecc1..00000000000
--- a/db/migrate/20190709220014_import_common_metrics_y_axis.rb
+++ /dev/null
@@ -1,13 +0,0 @@
-# frozen_string_literal: true
-
-class ImportCommonMetricsYAxis < ActiveRecord::Migration[5.1]
- DOWNTIME = false
-
- def up
- ::Gitlab::DatabaseImporters::CommonMetrics::Importer.new.execute
- end
-
- def down
- # no-op
- end
-end
diff --git a/db/migrate/20190709220143_add_index_to_issues_relative_position.rb b/db/migrate/20190709220143_add_index_to_issues_relative_position.rb
deleted file mode 100644
index ec11c6d768f..00000000000
--- a/db/migrate/20190709220143_add_index_to_issues_relative_position.rb
+++ /dev/null
@@ -1,20 +0,0 @@
-# frozen_string_literal: true
-
-class AddIndexToIssuesRelativePosition < ActiveRecord::Migration[5.1]
- include Gitlab::Database::MigrationHelpers
-
- # Set this constant to true if this migration requires downtime.
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- INDEX_NAME = 'index_issues_on_project_id_and_state_and_rel_position_and_id'
-
- def up
- add_concurrent_index :issues, [:project_id, :state, :relative_position, :id], order: { id: :desc }, name: INDEX_NAME
- end
-
- def down
- remove_concurrent_index_by_name :issues, INDEX_NAME
- end
-end
diff --git a/db/migrate/20190710151229_add_index_to_approval_project_rules_rule_type.rb b/db/migrate/20190710151229_add_index_to_approval_project_rules_rule_type.rb
deleted file mode 100644
index 64123c53c4a..00000000000
--- a/db/migrate/20190710151229_add_index_to_approval_project_rules_rule_type.rb
+++ /dev/null
@@ -1,17 +0,0 @@
-# frozen_string_literal: true
-
-class AddIndexToApprovalProjectRulesRuleType < ActiveRecord::Migration[5.1]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- add_concurrent_index :approval_project_rules, :rule_type
- end
-
- def down
- remove_concurrent_index :approval_project_rules, :rule_type
- end
-end
diff --git a/db/migrate/20190711124721_create_job_variables.rb b/db/migrate/20190711124721_create_job_variables.rb
deleted file mode 100644
index 6174afc236c..00000000000
--- a/db/migrate/20190711124721_create_job_variables.rb
+++ /dev/null
@@ -1,27 +0,0 @@
-# frozen_string_literal: true
-
-# See http://doc.gitlab.com/ce/development/migration_style_guide.html
-# for more information on how to write migrations for GitLab.
-
-class CreateJobVariables < ActiveRecord::Migration[5.1]
- include Gitlab::Database::MigrationHelpers
-
- # Set this constant to true if this migration requires downtime.
- DOWNTIME = false
-
- # rubocop:disable Migration/PreventStrings
- # rubocop:disable Migration/AddLimitToTextColumns
- def change
- create_table :ci_job_variables do |t|
- t.string :key, null: false
- t.text :encrypted_value
- t.string :encrypted_value_iv
- t.references :job, null: false, index: true, foreign_key: { to_table: :ci_builds, on_delete: :cascade }
- t.integer :variable_type, null: false, limit: 2, default: 1
- end
-
- add_index :ci_job_variables, [:key, :job_id], unique: true
- end
- # rubocop:enable Migration/AddLimitToTextColumns
- # rubocop:enable Migration/PreventStrings
-end
diff --git a/db/migrate/20190711200053_change_deploy_tokens_token_not_null.rb b/db/migrate/20190711200053_change_deploy_tokens_token_not_null.rb
deleted file mode 100644
index 14ccf544d0b..00000000000
--- a/db/migrate/20190711200053_change_deploy_tokens_token_not_null.rb
+++ /dev/null
@@ -1,11 +0,0 @@
-# frozen_string_literal: true
-
-class ChangeDeployTokensTokenNotNull < ActiveRecord::Migration[5.1]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- def change
- change_column_null :deploy_tokens, :token, true
- end
-end
diff --git a/db/migrate/20190711200508_add_token_encrypted_to_deploy_tokens.rb b/db/migrate/20190711200508_add_token_encrypted_to_deploy_tokens.rb
deleted file mode 100644
index dff682e8ce7..00000000000
--- a/db/migrate/20190711200508_add_token_encrypted_to_deploy_tokens.rb
+++ /dev/null
@@ -1,13 +0,0 @@
-# frozen_string_literal: true
-
-class AddTokenEncryptedToDeployTokens < ActiveRecord::Migration[5.1]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- # rubocop:disable Migration/PreventStrings
- def change
- add_column :deploy_tokens, :token_encrypted, :string, limit: 255
- end
- # rubocop:enable Migration/PreventStrings
-end
diff --git a/db/migrate/20190712040400_add_environment_id_to_clusters_kubernetes_namespaces.rb b/db/migrate/20190712040400_add_environment_id_to_clusters_kubernetes_namespaces.rb
deleted file mode 100644
index 7f465c0a962..00000000000
--- a/db/migrate/20190712040400_add_environment_id_to_clusters_kubernetes_namespaces.rb
+++ /dev/null
@@ -1,12 +0,0 @@
-# frozen_string_literal: true
-
-class AddEnvironmentIdToClustersKubernetesNamespaces < ActiveRecord::Migration[5.1]
- DOWNTIME = false
-
- def change
- # rubocop:disable Migration/AddReference
- add_reference :clusters_kubernetes_namespaces, :environment,
- index: true, type: :bigint, foreign_key: { on_delete: :nullify }
- # rubocop:enable Migration/AddReference
- end
-end
diff --git a/db/migrate/20190712040412_index_clusters_kubernetes_namespaces_on_environment_id.rb b/db/migrate/20190712040412_index_clusters_kubernetes_namespaces_on_environment_id.rb
deleted file mode 100644
index 23082492091..00000000000
--- a/db/migrate/20190712040412_index_clusters_kubernetes_namespaces_on_environment_id.rb
+++ /dev/null
@@ -1,18 +0,0 @@
-# frozen_string_literal: true
-
-class IndexClustersKubernetesNamespacesOnEnvironmentId < ActiveRecord::Migration[5.1]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
- INDEX_NAME = 'index_kubernetes_namespaces_on_cluster_project_environment_id'
-
- disable_ddl_transaction!
-
- def up
- add_concurrent_index :clusters_kubernetes_namespaces, [:cluster_id, :project_id, :environment_id], unique: true, name: INDEX_NAME
- end
-
- def down
- remove_concurrent_index :clusters_kubernetes_namespaces, name: INDEX_NAME
- end
-end
diff --git a/db/migrate/20190712064021_add_namespace_per_environment_flag_to_clusters.rb b/db/migrate/20190712064021_add_namespace_per_environment_flag_to_clusters.rb
deleted file mode 100644
index 771eb21c4b6..00000000000
--- a/db/migrate/20190712064021_add_namespace_per_environment_flag_to_clusters.rb
+++ /dev/null
@@ -1,20 +0,0 @@
-# frozen_string_literal: true
-
-# See http://doc.gitlab.com/ce/development/migration_style_guide.html
-# for more information on how to write migrations for GitLab.
-
-class AddNamespacePerEnvironmentFlagToClusters < ActiveRecord::Migration[5.1]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- add_column_with_default :clusters, :namespace_per_environment, :boolean, default: false # rubocop:disable Migration/AddColumnWithDefault
- end
-
- def down
- remove_column :clusters, :namespace_per_environment
- end
-end
diff --git a/db/migrate/20190715042813_add_issue_id_to_versions.rb b/db/migrate/20190715042813_add_issue_id_to_versions.rb
deleted file mode 100644
index 623e72c1096..00000000000
--- a/db/migrate/20190715042813_add_issue_id_to_versions.rb
+++ /dev/null
@@ -1,15 +0,0 @@
-# frozen_string_literal: true
-
-class AddIssueIdToVersions < ActiveRecord::Migration[5.2]
- DOWNTIME = false
-
- def up
- # rubocop:disable Migration/AddReference
- add_reference :design_management_versions, :issue, index: true, foreign_key: { on_delete: :cascade }
- # rubocop:enable Migration/AddReference
- end
-
- def down
- remove_reference :design_management_versions, :issue
- end
-end
diff --git a/db/migrate/20190715043954_set_issue_id_for_all_versions.rb b/db/migrate/20190715043954_set_issue_id_for_all_versions.rb
deleted file mode 100644
index 345b749f1a4..00000000000
--- a/db/migrate/20190715043954_set_issue_id_for_all_versions.rb
+++ /dev/null
@@ -1,19 +0,0 @@
-# frozen_string_literal: true
-
-class SetIssueIdForAllVersions < ActiveRecord::Migration[5.2]
- DOWNTIME = false
-
- def up
- execute('UPDATE design_management_versions as versions SET issue_id = (
- SELECT design_management_designs.issue_id
- FROM design_management_designs
- INNER JOIN design_management_designs_versions ON design_management_designs.id = design_management_designs_versions.design_id
- WHERE design_management_designs_versions.version_id = versions.id
- LIMIT 1
- )')
- end
-
- def down
- # no-op
- end
-end
diff --git a/db/migrate/20190715140740_add_event_type_to_design_management_designs_versions.rb b/db/migrate/20190715140740_add_event_type_to_design_management_designs_versions.rb
deleted file mode 100644
index 136a9d27e25..00000000000
--- a/db/migrate/20190715140740_add_event_type_to_design_management_designs_versions.rb
+++ /dev/null
@@ -1,26 +0,0 @@
-# frozen_string_literal: true
-
-# This migration sets up a event enum on the DesignsVersions join table
-class AddEventTypeToDesignManagementDesignsVersions < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- # Set this constant to true if this migration requires downtime.
- DOWNTIME = false
-
- # We disable these cops here because adding this column is safe. The table does not
- # have any data in it.
- # rubocop: disable Migration/AddIndex
- def up
- add_column(:design_management_designs_versions, :event, :integer,
- limit: 2,
- null: false,
- default: 0)
- add_index(:design_management_designs_versions, :event)
- end
-
- # rubocop: disable Migration/RemoveIndex
- def down
- remove_index(:design_management_designs_versions, :event)
- remove_column(:design_management_designs_versions, :event)
- end
-end
diff --git a/db/migrate/20190715142138_add_raw_blob_request_limit_to_application_settings.rb b/db/migrate/20190715142138_add_raw_blob_request_limit_to_application_settings.rb
deleted file mode 100644
index e8198e11ea7..00000000000
--- a/db/migrate/20190715142138_add_raw_blob_request_limit_to_application_settings.rb
+++ /dev/null
@@ -1,9 +0,0 @@
-# frozen_string_literal: true
-
-class AddRawBlobRequestLimitToApplicationSettings < ActiveRecord::Migration[5.2]
- DOWNTIME = false
-
- def change
- add_column :application_settings, :raw_blob_request_limit, :integer, default: 300, null: false
- end
-end
diff --git a/db/migrate/20190715173819_add_object_storage_flag_to_geo_node.rb b/db/migrate/20190715173819_add_object_storage_flag_to_geo_node.rb
deleted file mode 100644
index cbc353b6282..00000000000
--- a/db/migrate/20190715173819_add_object_storage_flag_to_geo_node.rb
+++ /dev/null
@@ -1,21 +0,0 @@
-# frozen_string_literal: true
-
-# See http://doc.gitlab.com/ce/development/migration_style_guide.html
-# for more information on how to write migrations for GitLab.
-
-class AddObjectStorageFlagToGeoNode < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- # Set this constant to true if this migration requires downtime.
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- add_column_with_default :geo_nodes, :sync_object_storage, :boolean, default: false # rubocop:disable Migration/AddColumnWithDefault
- end
-
- def down
- remove_column :geo_nodes, :sync_object_storage
- end
-end
diff --git a/db/migrate/20190715215532_add_project_emails_disabled.rb b/db/migrate/20190715215532_add_project_emails_disabled.rb
deleted file mode 100644
index 72dba82ef1c..00000000000
--- a/db/migrate/20190715215532_add_project_emails_disabled.rb
+++ /dev/null
@@ -1,9 +0,0 @@
-# frozen_string_literal: true
-
-class AddProjectEmailsDisabled < ActiveRecord::Migration[5.2]
- DOWNTIME = false
-
- def change
- add_column :projects, :emails_disabled, :boolean # rubocop:disable Migration/AddColumnsToWideTables
- end
-end
diff --git a/db/migrate/20190715215549_add_group_emails_disabled.rb b/db/migrate/20190715215549_add_group_emails_disabled.rb
deleted file mode 100644
index 63a815cb880..00000000000
--- a/db/migrate/20190715215549_add_group_emails_disabled.rb
+++ /dev/null
@@ -1,9 +0,0 @@
-# frozen_string_literal: true
-
-class AddGroupEmailsDisabled < ActiveRecord::Migration[5.2]
- DOWNTIME = false
-
- def change
- add_column :namespaces, :emails_disabled, :boolean # rubocop:disable Migration/AddColumnsToWideTables
- end
-end
diff --git a/db/migrate/20190716144222_create_analytics_cycle_analytics_project_stages.rb b/db/migrate/20190716144222_create_analytics_cycle_analytics_project_stages.rb
deleted file mode 100644
index 5723f6db0a3..00000000000
--- a/db/migrate/20190716144222_create_analytics_cycle_analytics_project_stages.rb
+++ /dev/null
@@ -1,36 +0,0 @@
-# frozen_string_literal: true
-
-class CreateAnalyticsCycleAnalyticsProjectStages < ActiveRecord::Migration[5.2]
- DOWNTIME = false
-
- INDEX_PREFIX = 'index_analytics_ca_project_stages_'
-
- def change
- create_table :analytics_cycle_analytics_project_stages do |t|
- t.timestamps_with_timezone
- t.integer :relative_position
- t.integer :start_event_identifier, null: false
- t.integer :end_event_identifier, null: false
-
- t.references(:project,
- null: false,
- foreign_key: { to_table: :projects, on_delete: :cascade },
- index: { name: INDEX_PREFIX + 'on_project_id' }
- )
- t.references(:start_event_label,
- foreign_key: { to_table: :labels, on_delete: :cascade },
- index: { name: INDEX_PREFIX + 'on_start_event_label_id' }
- )
- t.references(:end_event_label,
- foreign_key: { to_table: :labels, on_delete: :cascade },
- index: { name: INDEX_PREFIX + 'on_end_event_label_id' }
- )
- t.boolean :hidden, default: false, null: false
- t.boolean :custom, default: true, null: false
- t.string :name, null: false, limit: 255 # rubocop:disable Migration/PreventStrings
- end
-
- add_index :analytics_cycle_analytics_project_stages, [:project_id, :name], unique: true, name: INDEX_PREFIX + 'on_project_id_and_name'
- add_index :analytics_cycle_analytics_project_stages, [:relative_position], name: INDEX_PREFIX + 'on_relative_position'
- end
-end
diff --git a/db/migrate/20190719122333_add_login_recaptcha_protection_enabled_to_application_settings.rb b/db/migrate/20190719122333_add_login_recaptcha_protection_enabled_to_application_settings.rb
deleted file mode 100644
index 4561e1e8aa9..00000000000
--- a/db/migrate/20190719122333_add_login_recaptcha_protection_enabled_to_application_settings.rb
+++ /dev/null
@@ -1,12 +0,0 @@
-# frozen_string_literal: true
-
-# See http://doc.gitlab.com/ce/development/migration_style_guide.html
-# for more information on how to write migrations for GitLab.
-
-class AddLoginRecaptchaProtectionEnabledToApplicationSettings < ActiveRecord::Migration[5.1]
- DOWNTIME = false
-
- def change
- add_column :application_settings, :login_recaptcha_protection_enabled, :boolean, default: false, null: false
- end
-end
diff --git a/db/migrate/20190719174505_add_index_to_deploy_tokens_token_encrypted.rb b/db/migrate/20190719174505_add_index_to_deploy_tokens_token_encrypted.rb
deleted file mode 100644
index d58d1d8348c..00000000000
--- a/db/migrate/20190719174505_add_index_to_deploy_tokens_token_encrypted.rb
+++ /dev/null
@@ -1,17 +0,0 @@
-# frozen_string_literal: true
-
-class AddIndexToDeployTokensTokenEncrypted < ActiveRecord::Migration[5.1]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- add_concurrent_index :deploy_tokens, :token_encrypted, unique: true, name: "index_deploy_tokens_on_token_encrypted"
- end
-
- def down
- remove_concurrent_index_by_name :deploy_tokens, "index_deploy_tokens_on_token_encrypted"
- end
-end
diff --git a/db/migrate/20190722104947_add_static_object_token_to_users.rb b/db/migrate/20190722104947_add_static_object_token_to_users.rb
deleted file mode 100644
index 3983f076b3f..00000000000
--- a/db/migrate/20190722104947_add_static_object_token_to_users.rb
+++ /dev/null
@@ -1,22 +0,0 @@
-# frozen_string_literal: true
-
-# See http://doc.gitlab.com/ce/development/migration_style_guide.html
-# for more information on how to write migrations for GitLab.
-
-class AddStaticObjectTokenToUsers < ActiveRecord::Migration[5.2]
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- # rubocop:disable Migration/AddColumnsToWideTables
- # rubocop:disable Migration/PreventStrings
- def up
- add_column :users, :static_object_token, :string, limit: 255
- end
- # rubocop:enable Migration/PreventStrings
- # rubocop:enable Migration/AddColumnsToWideTables
-
- def down
- remove_column :users, :static_object_token
- end
-end
diff --git a/db/migrate/20190722132830_add_static_objects_external_storage_columns_to_application_settings.rb b/db/migrate/20190722132830_add_static_objects_external_storage_columns_to_application_settings.rb
deleted file mode 100644
index f493eae26a8..00000000000
--- a/db/migrate/20190722132830_add_static_objects_external_storage_columns_to_application_settings.rb
+++ /dev/null
@@ -1,16 +0,0 @@
-# frozen_string_literal: true
-
-# See http://doc.gitlab.com/ce/development/migration_style_guide.html
-# for more information on how to write migrations for GitLab.
-
-class AddStaticObjectsExternalStorageColumnsToApplicationSettings < ActiveRecord::Migration[5.2]
- # Set this constant to true if this migration requires downtime.
- DOWNTIME = false
-
- # rubocop:disable Migration/PreventStrings
- def change
- add_column :application_settings, :static_objects_external_storage_url, :string, limit: 255
- add_column :application_settings, :static_objects_external_storage_auth_token, :string, limit: 255
- end
- # rubocop:enable Migration/PreventStrings
-end
diff --git a/db/migrate/20190722144316_create_milestone_releases_table.rb b/db/migrate/20190722144316_create_milestone_releases_table.rb
deleted file mode 100644
index 55878bcec41..00000000000
--- a/db/migrate/20190722144316_create_milestone_releases_table.rb
+++ /dev/null
@@ -1,20 +0,0 @@
-# frozen_string_literal: true
-
-class CreateMilestoneReleasesTable < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- def up
- create_table :milestone_releases do |t|
- t.references :milestone, foreign_key: { on_delete: :cascade }, null: false, index: false
- t.references :release, foreign_key: { on_delete: :cascade }, null: false
- end
-
- add_index :milestone_releases, [:milestone_id, :release_id], unique: true, name: 'index_miletone_releases_on_milestone_and_release'
- end
-
- def down
- drop_table :milestone_releases
- end
-end
diff --git a/db/migrate/20190723153247_create_allowed_email_domains_for_groups.rb b/db/migrate/20190723153247_create_allowed_email_domains_for_groups.rb
deleted file mode 100644
index 71af7434f9d..00000000000
--- a/db/migrate/20190723153247_create_allowed_email_domains_for_groups.rb
+++ /dev/null
@@ -1,22 +0,0 @@
-# frozen_string_literal: true
-
-# See http://doc.gitlab.com/ce/development/migration_style_guide.html
-# for more information on how to write migrations for GitLab.
-
-class CreateAllowedEmailDomainsForGroups < ActiveRecord::Migration[5.2]
- # Set this constant to true if this migration requires downtime.
- DOWNTIME = false
-
- def change
- create_table :allowed_email_domains do |t|
- t.timestamps_with_timezone null: false
- t.references :group, references: :namespace,
- column: :group_id,
- type: :integer,
- null: false,
- index: true
- t.foreign_key :namespaces, column: :group_id, on_delete: :cascade
- t.string :domain, null: false, limit: 255 # rubocop:disable Migration/PreventStrings
- end
- end
-end
diff --git a/db/migrate/20190724112147_add_column_for_self_monitoring_project_id.rb b/db/migrate/20190724112147_add_column_for_self_monitoring_project_id.rb
deleted file mode 100644
index cf44804cdb4..00000000000
--- a/db/migrate/20190724112147_add_column_for_self_monitoring_project_id.rb
+++ /dev/null
@@ -1,16 +0,0 @@
-# frozen_string_literal: true
-
-class AddColumnForSelfMonitoringProjectId < ActiveRecord::Migration[5.2]
- DOWNTIME = false
-
- def change
- # rubocop:disable Migration/AddReference
- add_reference(
- :application_settings,
- :instance_administration_project,
- index: { name: 'index_applicationsettings_on_instance_administration_project_id' },
- foreign_key: { to_table: :projects, on_delete: :nullify }
- )
- # rubocop:enable Migration/AddReference
- end
-end
diff --git a/db/migrate/20190725012225_change_outbound_local_requests_whitelist_default.rb b/db/migrate/20190725012225_change_outbound_local_requests_whitelist_default.rb
deleted file mode 100644
index 21b00e0b7d9..00000000000
--- a/db/migrate/20190725012225_change_outbound_local_requests_whitelist_default.rb
+++ /dev/null
@@ -1,30 +0,0 @@
-# frozen_string_literal: true
-
-class ChangeOutboundLocalRequestsWhitelistDefault < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- # Set this constant to true if this migration requires downtime.
- DOWNTIME = false
-
- class ApplicationSetting < ActiveRecord::Base
- self.table_name = 'application_settings'
- end
-
- def up
- default_value = []
-
- change_column_default(:application_settings, :outbound_local_requests_whitelist, default_value)
-
- ApplicationSetting
- .where(outbound_local_requests_whitelist: nil)
- .update(outbound_local_requests_whitelist: default_value)
-
- change_column_null(:application_settings, :outbound_local_requests_whitelist, false)
- end
-
- def down
- change_column_null(:application_settings, :outbound_local_requests_whitelist, true)
-
- change_column_default(:application_settings, :outbound_local_requests_whitelist, nil)
- end
-end
diff --git a/db/migrate/20190725183432_add_index_to_index_on_static_object_token.rb b/db/migrate/20190725183432_add_index_to_index_on_static_object_token.rb
deleted file mode 100644
index 423c45b9543..00000000000
--- a/db/migrate/20190725183432_add_index_to_index_on_static_object_token.rb
+++ /dev/null
@@ -1,21 +0,0 @@
-# frozen_string_literal: true
-
-# See http://doc.gitlab.com/ce/development/migration_style_guide.html
-# for more information on how to write migrations for GitLab.
-
-class AddIndexToIndexOnStaticObjectToken < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- # Set this constant to true if this migration requires downtime.
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- add_concurrent_index :users, :static_object_token, unique: true
- end
-
- def down
- remove_concurrent_index :users, :static_object_token
- end
-end
diff --git a/db/migrate/20190726101050_rename_allow_local_requests_from_hooks_and_services_application_setting.rb b/db/migrate/20190726101050_rename_allow_local_requests_from_hooks_and_services_application_setting.rb
deleted file mode 100644
index cce8942128c..00000000000
--- a/db/migrate/20190726101050_rename_allow_local_requests_from_hooks_and_services_application_setting.rb
+++ /dev/null
@@ -1,17 +0,0 @@
-# frozen_string_literal: true
-
-class RenameAllowLocalRequestsFromHooksAndServicesApplicationSetting < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- rename_column_concurrently :application_settings, :allow_local_requests_from_hooks_and_services, :allow_local_requests_from_web_hooks_and_services
- end
-
- def down
- undo_rename_column_concurrently :application_settings, :allow_local_requests_from_hooks_and_services, :allow_local_requests_from_web_hooks_and_services
- end
-end
diff --git a/db/migrate/20190726101133_add_allow_local_requests_from_system_hooks_to_application_settings.rb b/db/migrate/20190726101133_add_allow_local_requests_from_system_hooks_to_application_settings.rb
deleted file mode 100644
index 95d4f956f93..00000000000
--- a/db/migrate/20190726101133_add_allow_local_requests_from_system_hooks_to_application_settings.rb
+++ /dev/null
@@ -1,18 +0,0 @@
-# frozen_string_literal: true
-
-class AddAllowLocalRequestsFromSystemHooksToApplicationSettings < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- def up
- add_column(:application_settings, :allow_local_requests_from_system_hooks,
- :boolean,
- default: true,
- null: false)
- end
-
- def down
- remove_column(:application_settings, :allow_local_requests_from_system_hooks)
- end
-end
diff --git a/db/migrate/20190729062536_create_analytics_cycle_analytics_group_stages.rb b/db/migrate/20190729062536_create_analytics_cycle_analytics_group_stages.rb
deleted file mode 100644
index d438ece9951..00000000000
--- a/db/migrate/20190729062536_create_analytics_cycle_analytics_group_stages.rb
+++ /dev/null
@@ -1,36 +0,0 @@
-# frozen_string_literal: true
-
-class CreateAnalyticsCycleAnalyticsGroupStages < ActiveRecord::Migration[5.2]
- DOWNTIME = false
-
- INDEX_PREFIX = 'index_analytics_ca_group_stages_'
-
- def change
- create_table :analytics_cycle_analytics_group_stages do |t|
- t.timestamps_with_timezone
- t.integer :relative_position
- t.integer :start_event_identifier, null: false
- t.integer :end_event_identifier, null: false
-
- t.references(:group,
- null: false,
- foreign_key: { to_table: :namespaces, on_delete: :cascade },
- index: { name: INDEX_PREFIX + 'on_group_id' }
- )
- t.references(:start_event_label,
- foreign_key: { to_table: :labels, on_delete: :cascade },
- index: { name: INDEX_PREFIX + 'on_start_event_label_id' }
- )
- t.references(:end_event_label,
- foreign_key: { to_table: :labels, on_delete: :cascade },
- index: { name: INDEX_PREFIX + 'on_end_event_label_id' }
- )
- t.boolean :hidden, default: false, null: false
- t.boolean :custom, default: true, null: false
- t.string :name, null: false, limit: 255 # rubocop:disable Migration/PreventStrings
- end
-
- add_index :analytics_cycle_analytics_group_stages, [:group_id, :name], unique: true, name: INDEX_PREFIX + 'on_group_id_and_name'
- add_index :analytics_cycle_analytics_group_stages, [:relative_position], name: INDEX_PREFIX + 'on_relative_position'
- end
-end
diff --git a/db/migrate/20190729090456_add_index_on_environments_with_state.rb b/db/migrate/20190729090456_add_index_on_environments_with_state.rb
deleted file mode 100644
index 9a8d8391415..00000000000
--- a/db/migrate/20190729090456_add_index_on_environments_with_state.rb
+++ /dev/null
@@ -1,17 +0,0 @@
-# frozen_string_literal: true
-
-class AddIndexOnEnvironmentsWithState < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- add_concurrent_index :environments, [:project_id, :state]
- end
-
- def down
- remove_concurrent_index :environments, [:project_id, :state]
- end
-end
diff --git a/db/migrate/20190729180447_add_merge_requests_require_code_owner_approval_to_protected_branches.rb b/db/migrate/20190729180447_add_merge_requests_require_code_owner_approval_to_protected_branches.rb
deleted file mode 100644
index bfac67606d6..00000000000
--- a/db/migrate/20190729180447_add_merge_requests_require_code_owner_approval_to_protected_branches.rb
+++ /dev/null
@@ -1,31 +0,0 @@
-# frozen_string_literal: true
-
-class AddMergeRequestsRequireCodeOwnerApprovalToProtectedBranches < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- # Set this constant to true if this migration requires downtime.
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- add_column_with_default( # rubocop:disable Migration/AddColumnWithDefault
- :protected_branches,
- :code_owner_approval_required,
- :boolean,
- default: false
- )
-
- add_concurrent_index(
- :protected_branches,
- [:project_id, :code_owner_approval_required],
- name: "code_owner_approval_required",
- where: "code_owner_approval_required = #{Gitlab::Database.true_value}")
- end
-
- def down
- remove_concurrent_index(:protected_branches, name: "code_owner_approval_required")
-
- remove_column(:protected_branches, :code_owner_approval_required)
- end
-end
diff --git a/db/migrate/20190731084415_add_build_need.rb b/db/migrate/20190731084415_add_build_need.rb
deleted file mode 100644
index ba044260db2..00000000000
--- a/db/migrate/20190731084415_add_build_need.rb
+++ /dev/null
@@ -1,20 +0,0 @@
-# frozen_string_literal: true
-
-# See http://doc.gitlab.com/ce/development/migration_style_guide.html
-# for more information on how to write migrations for GitLab.
-
-class AddBuildNeed < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- def change
- create_table :ci_build_needs, id: :serial do |t|
- t.integer :build_id, null: false
- t.text :name, null: false # rubocop:disable Migration/AddLimitToTextColumns
-
- t.index [:build_id, :name], unique: true
- t.foreign_key :ci_builds, column: :build_id, on_delete: :cascade
- end
- end
-end
diff --git a/db/migrate/20190801060809_delete_kubernetes_services.rb b/db/migrate/20190801060809_delete_kubernetes_services.rb
deleted file mode 100644
index 88717293817..00000000000
--- a/db/migrate/20190801060809_delete_kubernetes_services.rb
+++ /dev/null
@@ -1,18 +0,0 @@
-# frozen_string_literal: true
-
-class DeleteKubernetesServices < ActiveRecord::Migration[5.2]
- DOWNTIME = false
-
- class Service < ActiveRecord::Base
- self.table_name = 'services'
- self.inheritance_column = :_type_disabled
- end
-
- def up
- Service.where(type: "KubernetesService").delete_all
- end
-
- def down
- # no-op
- end
-end
diff --git a/db/migrate/20190801142441_add_throttle_protected_path_columns.rb b/db/migrate/20190801142441_add_throttle_protected_path_columns.rb
deleted file mode 100644
index f9e0922ad66..00000000000
--- a/db/migrate/20190801142441_add_throttle_protected_path_columns.rb
+++ /dev/null
@@ -1,27 +0,0 @@
-# frozen_string_literal: true
-
-class AddThrottleProtectedPathColumns < ActiveRecord::Migration[5.2]
- DOWNTIME = false
-
- DEFAULT_PROTECTED_PATHS = [
- '/users/password',
- '/users/sign_in',
- '/api/v3/session.json',
- '/api/v3/session',
- '/api/v4/session.json',
- '/api/v4/session',
- '/users',
- '/users/confirmation',
- '/unsubscribes/',
- '/import/github/personal_access_token'
- ]
-
- # rubocop:disable Migration/PreventStrings
- def change
- add_column :application_settings, :throttle_protected_paths_enabled, :boolean, default: true, null: false
- add_column :application_settings, :throttle_protected_paths_requests_per_period, :integer, default: 10, null: false
- add_column :application_settings, :throttle_protected_paths_period_in_seconds, :integer, default: 60, null: false
- add_column :application_settings, :protected_paths, :string, array: true, limit: 255, default: DEFAULT_PROTECTED_PATHS
- end
- # rubocop:enable Migration/PreventStrings
-end
diff --git a/db/migrate/20190801193427_rename_application_settings_snowplow_collector_uri_column.rb b/db/migrate/20190801193427_rename_application_settings_snowplow_collector_uri_column.rb
deleted file mode 100644
index fba9849d3eb..00000000000
--- a/db/migrate/20190801193427_rename_application_settings_snowplow_collector_uri_column.rb
+++ /dev/null
@@ -1,17 +0,0 @@
-# frozen_string_literal: true
-
-class RenameApplicationSettingsSnowplowCollectorUriColumn < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- rename_column_concurrently :application_settings, :snowplow_collector_uri, :snowplow_collector_hostname
- end
-
- def down
- undo_rename_column_concurrently :application_settings, :snowplow_collector_uri, :snowplow_collector_hostname
- end
-end
diff --git a/db/migrate/20190802012622_reorder_issues_project_id_relative_position_index.rb b/db/migrate/20190802012622_reorder_issues_project_id_relative_position_index.rb
deleted file mode 100644
index 12088dd763f..00000000000
--- a/db/migrate/20190802012622_reorder_issues_project_id_relative_position_index.rb
+++ /dev/null
@@ -1,24 +0,0 @@
-# frozen_string_literal: true
-
-class ReorderIssuesProjectIdRelativePositionIndex < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- OLD_INDEX_NAME = 'index_issues_on_project_id_and_state_and_rel_position_and_id'
- NEW_INDEX_NAME = 'index_issues_on_project_id_and_rel_position_and_state_and_id'
-
- def up
- add_concurrent_index :issues, [:project_id, :relative_position, :state, :id], order: { id: :desc }, name: NEW_INDEX_NAME
-
- remove_concurrent_index_by_name :issues, OLD_INDEX_NAME
- end
-
- def down
- add_concurrent_index :issues, [:project_id, :state, :relative_position, :id], order: { id: :desc }, name: OLD_INDEX_NAME
-
- remove_concurrent_index_by_name :issues, NEW_INDEX_NAME
- end
-end
diff --git a/db/migrate/20190802195602_add_timestamps_columns_to_geo_nodes.rb b/db/migrate/20190802195602_add_timestamps_columns_to_geo_nodes.rb
deleted file mode 100644
index b95d9037afe..00000000000
--- a/db/migrate/20190802195602_add_timestamps_columns_to_geo_nodes.rb
+++ /dev/null
@@ -1,10 +0,0 @@
-# frozen_string_literal: true
-
-class AddTimestampsColumnsToGeoNodes < ActiveRecord::Migration[5.2]
- DOWNTIME = false
-
- def change
- add_column(:geo_nodes, :created_at, :datetime_with_timezone, null: true)
- add_column(:geo_nodes, :updated_at, :datetime_with_timezone, null: true)
- end
-end
diff --git a/db/migrate/20190805140353_remove_rendundant_index_from_releases.rb b/db/migrate/20190805140353_remove_rendundant_index_from_releases.rb
deleted file mode 100644
index 477f8a850f8..00000000000
--- a/db/migrate/20190805140353_remove_rendundant_index_from_releases.rb
+++ /dev/null
@@ -1,24 +0,0 @@
-# frozen_string_literal: true
-
-# See http://doc.gitlab.com/ce/development/migration_style_guide.html
-# for more information on how to write migrations for GitLab.
-
-class RemoveRendundantIndexFromReleases < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- # Set this constant to true if this migration requires downtime.
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- remove_concurrent_index_by_name :releases, 'index_releases_on_project_id'
-
- # This is an extra index that is not present in db/schema.rb but known to exist on some installs
- remove_concurrent_index_by_name :releases, 'releases_project_id_idx' if index_exists_by_name?(:releases, 'releases_project_id_idx')
- end
-
- def down
- add_concurrent_index :releases, :project_id, name: 'index_releases_on_project_id'
- end
-end
diff --git a/db/migrate/20190806071559_remove_epic_issues_default_relative_position.rb b/db/migrate/20190806071559_remove_epic_issues_default_relative_position.rb
deleted file mode 100644
index 0994bbbfd17..00000000000
--- a/db/migrate/20190806071559_remove_epic_issues_default_relative_position.rb
+++ /dev/null
@@ -1,25 +0,0 @@
-# frozen_string_literal: true
-
-class RemoveEpicIssuesDefaultRelativePosition < ActiveRecord::Migration[5.2]
- DOWNTIME = false
-
- include Gitlab::Database::MigrationHelpers
-
- disable_ddl_transaction!
-
- def up
- # The column won't exist if someone installed EE, downgraded to CE
- # before it was added in EE, then tries to upgrade CE.
- if column_exists?(:epic_issues, :relative_position)
- change_column_null :epic_issues, :relative_position, true
- change_column_default :epic_issues, :relative_position, from: 1073741823, to: nil
- else
- add_column_with_default(:epic_issues, :relative_position, :integer, default: nil, allow_null: true) # rubocop:disable Migration/AddColumnWithDefault
- end
- end
-
- def down
- change_column_default :epic_issues, :relative_position, from: nil, to: 1073741823
- change_column_null :epic_issues, :relative_position, false
- end
-end
diff --git a/db/migrate/20190807023052_design_issue_id_nullable.rb b/db/migrate/20190807023052_design_issue_id_nullable.rb
deleted file mode 100644
index 4429e23d520..00000000000
--- a/db/migrate/20190807023052_design_issue_id_nullable.rb
+++ /dev/null
@@ -1,11 +0,0 @@
-# frozen_string_literal: true
-
-class DesignIssueIdNullable < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- def change
- change_column_null :design_management_designs, :issue_id, true
- end
-end
diff --git a/db/migrate/20190808152507_add_projects_sorting_field_to_user_preferences.rb b/db/migrate/20190808152507_add_projects_sorting_field_to_user_preferences.rb
deleted file mode 100644
index 5022ae843e7..00000000000
--- a/db/migrate/20190808152507_add_projects_sorting_field_to_user_preferences.rb
+++ /dev/null
@@ -1,15 +0,0 @@
-# frozen_string_literal: true
-
-class AddProjectsSortingFieldToUserPreferences < ActiveRecord::Migration[5.2]
- DOWNTIME = false
-
- # rubocop:disable Migration/PreventStrings
- def up
- add_column :user_preferences, :projects_sort, :string, limit: 64
- end
- # rubocop:enable Migration/PreventStrings
-
- def down
- remove_column :user_preferences, :projects_sort
- end
-end
diff --git a/db/migrate/20190814205640_import_common_metrics_line_charts.rb b/db/migrate/20190814205640_import_common_metrics_line_charts.rb
deleted file mode 100644
index 1c28d686a42..00000000000
--- a/db/migrate/20190814205640_import_common_metrics_line_charts.rb
+++ /dev/null
@@ -1,13 +0,0 @@
-# frozen_string_literal: true
-
-class ImportCommonMetricsLineCharts < ActiveRecord::Migration[5.2]
- DOWNTIME = false
-
- def up
- ::Gitlab::DatabaseImporters::CommonMetrics::Importer.new.execute
- end
-
- def down
- # no-op
- end
-end
diff --git a/db/migrate/20190815093936_add_index_notes_on_project_id_and_id_and_system_false.rb b/db/migrate/20190815093936_add_index_notes_on_project_id_and_id_and_system_false.rb
deleted file mode 100644
index cbbece35901..00000000000
--- a/db/migrate/20190815093936_add_index_notes_on_project_id_and_id_and_system_false.rb
+++ /dev/null
@@ -1,30 +0,0 @@
-# frozen_string_literal: true
-
-class AddIndexNotesOnProjectIdAndIdAndSystemFalse < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- add_concurrent_index(*index_arguments)
- end
-
- def down
- remove_concurrent_index(*index_arguments)
- end
-
- private
-
- def index_arguments
- [
- :notes,
- [:project_id, :id],
- {
- name: 'index_notes_on_project_id_and_id_and_system_false',
- where: 'NOT system'
- }
- ]
- end
-end
diff --git a/db/migrate/20190815093949_remove_index_notes_on_noteable_type.rb b/db/migrate/20190815093949_remove_index_notes_on_noteable_type.rb
deleted file mode 100644
index 158c88e6258..00000000000
--- a/db/migrate/20190815093949_remove_index_notes_on_noteable_type.rb
+++ /dev/null
@@ -1,29 +0,0 @@
-# frozen_string_literal: true
-
-class RemoveIndexNotesOnNoteableType < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- remove_concurrent_index(*index_arguments)
- end
-
- def down
- add_concurrent_index(*index_arguments)
- end
-
- private
-
- def index_arguments
- [
- :notes,
- [:noteable_type],
- {
- name: 'index_notes_on_noteable_type'
- }
- ]
- end
-end
diff --git a/db/migrate/20190816151221_add_active_jobs_limit_to_plans.rb b/db/migrate/20190816151221_add_active_jobs_limit_to_plans.rb
deleted file mode 100644
index 193e6cb188e..00000000000
--- a/db/migrate/20190816151221_add_active_jobs_limit_to_plans.rb
+++ /dev/null
@@ -1,17 +0,0 @@
-# frozen_string_literal: true
-
-class AddActiveJobsLimitToPlans < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- add_column_with_default :plans, :active_jobs_limit, :integer, default: 0 # rubocop:disable Migration/AddColumnWithDefault
- end
-
- def down
- remove_column :plans, :active_jobs_limit
- end
-end
diff --git a/db/migrate/20190819131155_add_cluster_status_index_to_deployments.rb b/db/migrate/20190819131155_add_cluster_status_index_to_deployments.rb
deleted file mode 100644
index bfa91e33558..00000000000
--- a/db/migrate/20190819131155_add_cluster_status_index_to_deployments.rb
+++ /dev/null
@@ -1,17 +0,0 @@
-# frozen_string_literal: true
-
-class AddClusterStatusIndexToDeployments < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- add_concurrent_index :deployments, [:cluster_id, :status]
- end
-
- def down
- remove_concurrent_index :deployments, [:cluster_id, :status]
- end
-end
diff --git a/db/migrate/20190820163320_add_first_last_name_to_user.rb b/db/migrate/20190820163320_add_first_last_name_to_user.rb
deleted file mode 100644
index 908f55fa821..00000000000
--- a/db/migrate/20190820163320_add_first_last_name_to_user.rb
+++ /dev/null
@@ -1,18 +0,0 @@
-# frozen_string_literal: true
-
-# See http://doc.gitlab.com/ce/development/migration_style_guide.html
-# for more information on how to write migrations for GitLab.
-
-class AddFirstLastNameToUser < ActiveRecord::Migration[5.2]
- # Set this constant to true if this migration requires downtime.
- DOWNTIME = false
-
- # rubocop:disable Migration/AddColumnsToWideTables
- # rubocop:disable Migration/PreventStrings
- def change
- add_column(:users, :first_name, :string, null: true, limit: 255)
- add_column(:users, :last_name, :string, null: true, limit: 255)
- end
- # rubocop:enable Migration/PreventStrings
- # rubocop:enable Migration/AddColumnsToWideTables
-end
diff --git a/db/migrate/20190821040941_create_cluster_providers_aws.rb b/db/migrate/20190821040941_create_cluster_providers_aws.rb
deleted file mode 100644
index 666c33759a2..00000000000
--- a/db/migrate/20190821040941_create_cluster_providers_aws.rb
+++ /dev/null
@@ -1,37 +0,0 @@
-# frozen_string_literal: true
-
-class CreateClusterProvidersAws < ActiveRecord::Migration[5.2]
- DOWNTIME = false
-
- # rubocop:disable Migration/PreventStrings
- # rubocop:disable Migration/AddLimitToTextColumns
- def change
- create_table :cluster_providers_aws do |t|
- t.references :cluster, null: false, type: :bigint, index: { unique: true }, foreign_key: { on_delete: :cascade }
- t.references :created_by_user, type: :integer, foreign_key: { on_delete: :nullify, to_table: :users }
-
- t.integer :num_nodes, null: false
- t.integer :status, null: false
-
- t.timestamps_with_timezone null: false
-
- t.string :key_name, null: false, limit: 255
- t.string :role_arn, null: false, limit: 2048
- t.string :region, null: false, limit: 255
- t.string :vpc_id, null: false, limit: 255
- t.string :subnet_ids, null: false, array: true, default: [], limit: 255
- t.string :security_group_id, null: false, limit: 255
- t.string :instance_type, null: false, limit: 255
-
- t.string :access_key_id, limit: 255
- t.string :encrypted_secret_access_key_iv, limit: 255
- t.text :encrypted_secret_access_key
- t.text :session_token
- t.text :status_reason
-
- t.index [:cluster_id, :status]
- end
- end
- # rubocop:enable Migration/AddLimitToTextColumns
- # rubocop:enable Migration/PreventStrings
-end
diff --git a/db/migrate/20190822175441_rename_epics_state_to_state_id.rb b/db/migrate/20190822175441_rename_epics_state_to_state_id.rb
deleted file mode 100644
index 7f40d164a8e..00000000000
--- a/db/migrate/20190822175441_rename_epics_state_to_state_id.rb
+++ /dev/null
@@ -1,17 +0,0 @@
-# frozen_string_literal: true
-
-class RenameEpicsStateToStateId < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- rename_column_concurrently :epics, :state, :state_id
- end
-
- def down
- cleanup_concurrent_column_rename :epics, :state_id, :state
- end
-end
diff --git a/db/migrate/20190822181528_create_list_user_preferences.rb b/db/migrate/20190822181528_create_list_user_preferences.rb
deleted file mode 100644
index a7993818b50..00000000000
--- a/db/migrate/20190822181528_create_list_user_preferences.rb
+++ /dev/null
@@ -1,16 +0,0 @@
-# frozen_string_literal: true
-
-class CreateListUserPreferences < ActiveRecord::Migration[5.2]
- DOWNTIME = false
-
- def change
- create_table :list_user_preferences do |t|
- t.references :user, index: true, null: false, foreign_key: { on_delete: :cascade }
- t.references :list, index: true, null: false, foreign_key: { on_delete: :cascade }
- t.timestamps_with_timezone null: false
- t.boolean :collapsed
- end
-
- add_index :list_user_preferences, [:user_id, :list_id], unique: true
- end
-end
diff --git a/db/migrate/20190823055948_change_clusters_namespace_per_environment_default.rb b/db/migrate/20190823055948_change_clusters_namespace_per_environment_default.rb
deleted file mode 100644
index 919ce807869..00000000000
--- a/db/migrate/20190823055948_change_clusters_namespace_per_environment_default.rb
+++ /dev/null
@@ -1,12 +0,0 @@
-# frozen_string_literal: true
-
-# See http://doc.gitlab.com/ce/development/migration_style_guide.html
-# for more information on how to write migrations for GitLab.
-
-class ChangeClustersNamespacePerEnvironmentDefault < ActiveRecord::Migration[5.2]
- DOWNTIME = false
-
- def change
- change_column_default :clusters, :namespace_per_environment, from: false, to: true
- end
-end
diff --git a/db/migrate/20190826090628_remove_redundant_deployments_index.rb b/db/migrate/20190826090628_remove_redundant_deployments_index.rb
deleted file mode 100644
index 6b009c17d64..00000000000
--- a/db/migrate/20190826090628_remove_redundant_deployments_index.rb
+++ /dev/null
@@ -1,18 +0,0 @@
-# frozen_string_literal: true
-
-class RemoveRedundantDeploymentsIndex < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- # Set this constant to true if this migration requires downtime.
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- remove_concurrent_index :deployments, :cluster_id
- end
-
- def down
- add_concurrent_index :deployments, :cluster_id
- end
-end
diff --git a/db/migrate/20190826100605_add_group_column_to_events.rb b/db/migrate/20190826100605_add_group_column_to_events.rb
deleted file mode 100644
index dfc9d8cbdf1..00000000000
--- a/db/migrate/20190826100605_add_group_column_to_events.rb
+++ /dev/null
@@ -1,19 +0,0 @@
-# frozen_string_literal: true
-
-class AddGroupColumnToEvents < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- add_column(:events, :group_id, :bigint) unless column_exists?(:events, :group_id)
- add_concurrent_index(:events, :group_id)
- add_concurrent_foreign_key(:events, :namespaces, column: :group_id, on_delete: :cascade)
- end
-
- def down
- remove_column(:events, :group_id) if column_exists?(:events, :group_id)
- end
-end
diff --git a/db/migrate/20190827222124_add_sourcegraph_configuration_to_application_settings.rb b/db/migrate/20190827222124_add_sourcegraph_configuration_to_application_settings.rb
deleted file mode 100644
index 1059f73db8a..00000000000
--- a/db/migrate/20190827222124_add_sourcegraph_configuration_to_application_settings.rb
+++ /dev/null
@@ -1,23 +0,0 @@
-# frozen_string_literal: true
-
-# See http://doc.gitlab.com/ce/development/migration_style_guide.html
-# for more information on how to write migrations for GitLab.
-
-class AddSourcegraphConfigurationToApplicationSettings < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- # Set this constant to true if this migration requires downtime.
- DOWNTIME = false
-
- # rubocop:disable Migration/PreventStrings
- def up
- add_column(:application_settings, :sourcegraph_enabled, :boolean, default: false, null: false)
- add_column(:application_settings, :sourcegraph_url, :string, null: true, limit: 255)
- end
- # rubocop:enable Migration/PreventStrings
-
- def down
- remove_column(:application_settings, :sourcegraph_enabled)
- remove_column(:application_settings, :sourcegraph_url)
- end
-end
diff --git a/db/migrate/20190828083843_add_index_to_ci_job_artifacts_on_project_id_for_security_reports.rb b/db/migrate/20190828083843_add_index_to_ci_job_artifacts_on_project_id_for_security_reports.rb
deleted file mode 100644
index 5253f25aab4..00000000000
--- a/db/migrate/20190828083843_add_index_to_ci_job_artifacts_on_project_id_for_security_reports.rb
+++ /dev/null
@@ -1,22 +0,0 @@
-# frozen_string_literal: true
-
-class AddIndexToCiJobArtifactsOnProjectIdForSecurityReports < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- add_concurrent_index :ci_job_artifacts,
- :project_id,
- name: "index_ci_job_artifacts_on_project_id_for_security_reports",
- where: "file_type IN (5, 6, 7, 8)"
- end
-
- def down
- remove_concurrent_index :ci_job_artifacts,
- :project_id,
- name: "index_ci_job_artifacts_on_project_id_for_security_reports"
- end
-end
diff --git a/db/migrate/20190828110802_add_not_null_constraints_to_prometheus_metrics_y_label_and_unit.rb b/db/migrate/20190828110802_add_not_null_constraints_to_prometheus_metrics_y_label_and_unit.rb
deleted file mode 100644
index 1b238907af6..00000000000
--- a/db/migrate/20190828110802_add_not_null_constraints_to_prometheus_metrics_y_label_and_unit.rb
+++ /dev/null
@@ -1,10 +0,0 @@
-# frozen_string_literal: true
-
-class AddNotNullConstraintsToPrometheusMetricsYLabelAndUnit < ActiveRecord::Migration[5.2]
- DOWNTIME = false
-
- def change
- change_column_null(:prometheus_metrics, :y_label, false)
- change_column_null(:prometheus_metrics, :unit, false)
- end
-end
diff --git a/db/migrate/20190828170945_create_package_metadatum.rb b/db/migrate/20190828170945_create_package_metadatum.rb
deleted file mode 100644
index 3047b812e0e..00000000000
--- a/db/migrate/20190828170945_create_package_metadatum.rb
+++ /dev/null
@@ -1,14 +0,0 @@
-# frozen_string_literal: true
-
-class CreatePackageMetadatum < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- def change
- create_table :packages_package_metadata do |t|
- t.references :package, index: { unique: true }, null: false, foreign_key: { to_table: :packages_packages, on_delete: :cascade }, type: :integer
- t.binary :metadata, null: false
- end
- end
-end
diff --git a/db/migrate/20190828172831_create_package_tag.rb b/db/migrate/20190828172831_create_package_tag.rb
deleted file mode 100644
index a70b71db51d..00000000000
--- a/db/migrate/20190828172831_create_package_tag.rb
+++ /dev/null
@@ -1,16 +0,0 @@
-# frozen_string_literal: true
-
-# frozen_string_literal: true .
-
-class CreatePackageTag < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- def change
- create_table :packages_package_tags do |t|
- t.references :package, index: true, null: false, foreign_key: { to_table: :packages_packages, on_delete: :cascade }, type: :integer
- t.string :name, limit: 255, null: false # rubocop:disable Migration/PreventStrings
- end
- end
-end
diff --git a/db/migrate/20190829131130_create_external_pull_requests.rb b/db/migrate/20190829131130_create_external_pull_requests.rb
deleted file mode 100644
index 817f84017e2..00000000000
--- a/db/migrate/20190829131130_create_external_pull_requests.rb
+++ /dev/null
@@ -1,27 +0,0 @@
-# frozen_string_literal: true
-
-class CreateExternalPullRequests < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
- INDEX = 'index_external_pull_requests_on_project_and_branches'
-
- # rubocop:disable Migration/PreventStrings
- def change
- create_table :external_pull_requests do |t|
- t.timestamps_with_timezone null: false
- t.references :project, null: false, foreign_key: { on_delete: :cascade }, index: false
- t.integer :pull_request_iid, null: false
- t.integer :status, null: false, limit: 2
- t.string :source_branch, null: false, limit: 255
- t.string :target_branch, null: false, limit: 255
- t.string :source_repository, null: false, limit: 255
- t.string :target_repository, null: false, limit: 255
- t.binary :source_sha, null: false
- t.binary :target_sha, null: false
-
- t.index [:project_id, :source_branch, :target_branch], unique: true, name: INDEX
- end
- end
- # rubocop:enable Migration/PreventStrings
-end
diff --git a/db/migrate/20190830075508_add_external_pull_request_id_to_ci_pipelines.rb b/db/migrate/20190830075508_add_external_pull_request_id_to_ci_pipelines.rb
deleted file mode 100644
index 5abf56742b1..00000000000
--- a/db/migrate/20190830075508_add_external_pull_request_id_to_ci_pipelines.rb
+++ /dev/null
@@ -1,15 +0,0 @@
-# frozen_string_literal: true
-
-class AddExternalPullRequestIdToCiPipelines < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- def up
- add_column :ci_pipelines, :external_pull_request_id, :bigint
- end
-
- def down
- remove_column :ci_pipelines, :external_pull_request_id
- end
-end
diff --git a/db/migrate/20190830080123_add_index_to_ci_pipelines_external_pull_request.rb b/db/migrate/20190830080123_add_index_to_ci_pipelines_external_pull_request.rb
deleted file mode 100644
index d2f5ad7a420..00000000000
--- a/db/migrate/20190830080123_add_index_to_ci_pipelines_external_pull_request.rb
+++ /dev/null
@@ -1,17 +0,0 @@
-# frozen_string_literal: true
-
-class AddIndexToCiPipelinesExternalPullRequest < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- add_concurrent_index :ci_pipelines, :external_pull_request_id, where: 'external_pull_request_id IS NOT NULL'
- end
-
- def down
- remove_concurrent_index :ci_pipelines, :external_pull_request_id
- end
-end
diff --git a/db/migrate/20190830080626_add_foreign_key_to_ci_pipelines_external_pull_request.rb b/db/migrate/20190830080626_add_foreign_key_to_ci_pipelines_external_pull_request.rb
deleted file mode 100644
index b38fda83047..00000000000
--- a/db/migrate/20190830080626_add_foreign_key_to_ci_pipelines_external_pull_request.rb
+++ /dev/null
@@ -1,17 +0,0 @@
-# frozen_string_literal: true
-
-class AddForeignKeyToCiPipelinesExternalPullRequest < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- add_concurrent_foreign_key :ci_pipelines, :external_pull_requests, column: :external_pull_request_id, on_delete: :nullify
- end
-
- def down
- remove_foreign_key :ci_pipelines, :external_pull_requests
- end
-end
diff --git a/db/migrate/20190830140240_add_duplicated_to_to_issue.rb b/db/migrate/20190830140240_add_duplicated_to_to_issue.rb
deleted file mode 100644
index b38e4302a0b..00000000000
--- a/db/migrate/20190830140240_add_duplicated_to_to_issue.rb
+++ /dev/null
@@ -1,27 +0,0 @@
-# frozen_string_literal: true
-
-class AddDuplicatedToToIssue < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- add_column :issues, :duplicated_to_id, :integer unless duplicated_to_id_exists?
- add_concurrent_foreign_key :issues, :issues, column: :duplicated_to_id, on_delete: :nullify
- add_concurrent_index :issues, :duplicated_to_id, where: 'duplicated_to_id IS NOT NULL'
- end
-
- def down
- remove_foreign_key_without_error(:issues, column: :duplicated_to_id)
- remove_concurrent_index(:issues, :duplicated_to_id)
- remove_column(:issues, :duplicated_to_id) if duplicated_to_id_exists?
- end
-
- private
-
- def duplicated_to_id_exists?
- column_exists?(:issues, :duplicated_to_id)
- end
-end
diff --git a/db/migrate/20190901174200_add_max_issue_count_to_list.rb b/db/migrate/20190901174200_add_max_issue_count_to_list.rb
deleted file mode 100644
index 7408d2f1c93..00000000000
--- a/db/migrate/20190901174200_add_max_issue_count_to_list.rb
+++ /dev/null
@@ -1,16 +0,0 @@
-# frozen_string_literal: true
-
-class AddMaxIssueCountToList < ActiveRecord::Migration[4.2]
- include Gitlab::Database::MigrationHelpers
- disable_ddl_transaction!
-
- DOWNTIME = false
-
- def up
- add_column_with_default :lists, :max_issue_count, :integer, default: 0 # rubocop:disable Migration/AddColumnWithDefault
- end
-
- def down
- remove_column :lists, :max_issue_count
- end
-end
diff --git a/db/migrate/20190902131045_replace_indexes_for_counting_active_users.rb b/db/migrate/20190902131045_replace_indexes_for_counting_active_users.rb
deleted file mode 100644
index 2c7c47bee96..00000000000
--- a/db/migrate/20190902131045_replace_indexes_for_counting_active_users.rb
+++ /dev/null
@@ -1,23 +0,0 @@
-# frozen_string_literal: true
-
-class ReplaceIndexesForCountingActiveUsers < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- remove_concurrent_index_by_name(:users, 'index_users_on_state_and_internal')
-
- add_concurrent_index(:users, :state, where: 'ghost IS NOT TRUE', name: 'index_users_on_state_and_internal')
- add_concurrent_index(:users, :state, where: 'ghost IS NOT TRUE AND bot_type IS NULL', name: 'index_users_on_state_and_internal_ee')
- end
-
- def down
- remove_concurrent_index_by_name(:users, 'index_users_on_state_and_internal_ee')
- remove_concurrent_index_by_name(:users, 'index_users_on_state_and_internal')
-
- add_concurrent_index(:users, :state, where: 'ghost <> true AND bot_type IS NULL', name: 'index_users_on_state_and_internal')
- end
-end
diff --git a/db/migrate/20190902152329_add_index_for_ci_builds_metrics.rb b/db/migrate/20190902152329_add_index_for_ci_builds_metrics.rb
deleted file mode 100644
index b755d60e311..00000000000
--- a/db/migrate/20190902152329_add_index_for_ci_builds_metrics.rb
+++ /dev/null
@@ -1,19 +0,0 @@
-# frozen_string_literal: true
-
-class AddIndexForCiBuildsMetrics < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- INDEX_NAME = 'ci_builds_gitlab_monitor_metrics'
-
- def up
- add_concurrent_index(:ci_builds, [:status, :created_at, :project_id], where: "type = 'Ci::Build'", name: INDEX_NAME)
- end
-
- def down
- remove_concurrent_index_by_name(:ci_builds, INDEX_NAME)
- end
-end
diff --git a/db/migrate/20190903150358_create_analytics_repository_files_table.rb b/db/migrate/20190903150358_create_analytics_repository_files_table.rb
deleted file mode 100644
index 69c9cd504f4..00000000000
--- a/db/migrate/20190903150358_create_analytics_repository_files_table.rb
+++ /dev/null
@@ -1,23 +0,0 @@
-# frozen_string_literal: true
-
-class CreateAnalyticsRepositoryFilesTable < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- # rubocop:disable Migration/PreventStrings
- def change
- create_table :analytics_repository_files do |t|
- t.references :project,
- index: false,
- foreign_key: { on_delete: :cascade },
- null: false
- t.string :file_path,
- limit: 4096,
- null: false
- end
-
- add_index :analytics_repository_files, [:project_id, :file_path], unique: true
- end
- # rubocop:enable Migration/PreventStrings
-end
diff --git a/db/migrate/20190903150435_create_analytics_repository_file_edits_table.rb b/db/migrate/20190903150435_create_analytics_repository_file_edits_table.rb
deleted file mode 100644
index dca3fa1b37d..00000000000
--- a/db/migrate/20190903150435_create_analytics_repository_file_edits_table.rb
+++ /dev/null
@@ -1,29 +0,0 @@
-# frozen_string_literal: true
-
-class CreateAnalyticsRepositoryFileEditsTable < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- def change
- create_table :analytics_repository_file_edits do |t|
- t.references :project,
- index: true,
- foreign_key: { on_delete: :cascade }, null: false
- t.references :analytics_repository_file,
- index: false,
- foreign_key: { on_delete: :cascade },
- null: false
- t.date :committed_date,
- null: false
- t.integer :num_edits,
- null: false,
- default: 0
- end
-
- add_index :analytics_repository_file_edits,
- [:analytics_repository_file_id, :committed_date, :project_id],
- name: 'index_file_edits_on_committed_date_file_id_and_project_id',
- unique: true
- end
-end
diff --git a/db/migrate/20190904173203_add_index_on_users_unconfirmed_email.rb b/db/migrate/20190904173203_add_index_on_users_unconfirmed_email.rb
deleted file mode 100644
index e78d47f023f..00000000000
--- a/db/migrate/20190904173203_add_index_on_users_unconfirmed_email.rb
+++ /dev/null
@@ -1,17 +0,0 @@
-# frozen_string_literal: true
-
-class AddIndexOnUsersUnconfirmedEmail < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- add_concurrent_index :users, :unconfirmed_email, where: 'unconfirmed_email IS NOT NULL'
- end
-
- def down
- remove_concurrent_index :users, :unconfirmed_email, where: 'unconfirmed_email IS NOT NULL'
- end
-end
diff --git a/db/migrate/20190905022045_add_issues_prometheus_alert_event_join_table.rb b/db/migrate/20190905022045_add_issues_prometheus_alert_event_join_table.rb
deleted file mode 100644
index 861b97f0a09..00000000000
--- a/db/migrate/20190905022045_add_issues_prometheus_alert_event_join_table.rb
+++ /dev/null
@@ -1,22 +0,0 @@
-# frozen_string_literal: true
-
-class AddIssuesPrometheusAlertEventJoinTable < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- def change
- create_table :issues_prometheus_alert_events, id: false do |t|
- t.references :issue, null: false,
- index: false, # Uses the index below
- foreign_key: { on_delete: :cascade }
- t.references :prometheus_alert_event, null: false,
- index: { name: 'issue_id_issues_prometheus_alert_events_index' },
- foreign_key: { on_delete: :cascade }
-
- t.timestamps_with_timezone
- t.index [:issue_id, :prometheus_alert_event_id],
- unique: true, name: 'issue_id_prometheus_alert_event_id_index'
- end
- end
-end
diff --git a/db/migrate/20190905074652_index_timestamp_columns_for_issue_metrics.rb b/db/migrate/20190905074652_index_timestamp_columns_for_issue_metrics.rb
deleted file mode 100644
index e468b2decd9..00000000000
--- a/db/migrate/20190905074652_index_timestamp_columns_for_issue_metrics.rb
+++ /dev/null
@@ -1,29 +0,0 @@
-# frozen_string_literal: true
-
-class IndexTimestampColumnsForIssueMetrics < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- add_concurrent_index(*index_arguments)
- end
-
- def down
- remove_concurrent_index(*index_arguments)
- end
-
- private
-
- def index_arguments
- [
- :issue_metrics,
- [:issue_id, :first_mentioned_in_commit_at, :first_associated_with_milestone_at, :first_added_to_board_at],
- {
- name: 'index_issue_metrics_on_issue_id_and_timestamps'
- }
- ]
- end
-end
diff --git a/db/migrate/20190905140605_add_cloud_run_to_clusters_providers_gcp.rb b/db/migrate/20190905140605_add_cloud_run_to_clusters_providers_gcp.rb
deleted file mode 100644
index cd6b2fb7d4f..00000000000
--- a/db/migrate/20190905140605_add_cloud_run_to_clusters_providers_gcp.rb
+++ /dev/null
@@ -1,17 +0,0 @@
-# frozen_string_literal: true
-
-class AddCloudRunToClustersProvidersGcp < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- add_column_with_default(:cluster_providers_gcp, :cloud_run, :boolean, default: false) # rubocop:disable Migration/AddColumnWithDefault
- end
-
- def down
- remove_column(:cluster_providers_gcp, :cloud_run)
- end
-end
diff --git a/db/migrate/20190905223800_add_interruptible_to_builds_metadata.rb b/db/migrate/20190905223800_add_interruptible_to_builds_metadata.rb
deleted file mode 100644
index a666b11013b..00000000000
--- a/db/migrate/20190905223800_add_interruptible_to_builds_metadata.rb
+++ /dev/null
@@ -1,9 +0,0 @@
-# frozen_string_literal: true
-
-class AddInterruptibleToBuildsMetadata < ActiveRecord::Migration[5.0]
- DOWNTIME = false
-
- def change
- add_column :ci_builds_metadata, :interruptible, :boolean
- end
-end
diff --git a/db/migrate/20190905223900_add_concurrent_index_to_builds_metadata.rb b/db/migrate/20190905223900_add_concurrent_index_to_builds_metadata.rb
deleted file mode 100644
index d394f995673..00000000000
--- a/db/migrate/20190905223900_add_concurrent_index_to_builds_metadata.rb
+++ /dev/null
@@ -1,19 +0,0 @@
-# frozen_string_literal: true
-
-class AddConcurrentIndexToBuildsMetadata < ActiveRecord::Migration[5.0]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- add_concurrent_index :ci_builds_metadata, [:build_id],
- where: "interruptible = false",
- name: "index_ci_builds_metadata_on_build_id_and_interruptible_false"
- end
-
- def down
- remove_concurrent_index_by_name(:ci_builds_metadata, 'index_ci_builds_metadata_on_build_id_and_interruptible_false')
- end
-end
diff --git a/db/migrate/20190906104555_create_alerts_service_data.rb b/db/migrate/20190906104555_create_alerts_service_data.rb
deleted file mode 100644
index 9388a205978..00000000000
--- a/db/migrate/20190906104555_create_alerts_service_data.rb
+++ /dev/null
@@ -1,17 +0,0 @@
-# frozen_string_literal: true
-
-class CreateAlertsServiceData < ActiveRecord::Migration[5.2]
- DOWNTIME = false
-
- # rubocop:disable Migration/PreventStrings
- def change
- create_table :alerts_service_data do |t|
- t.references :service, type: :integer, index: true, null: false,
- foreign_key: { on_delete: :cascade }
- t.timestamps_with_timezone
- t.string :encrypted_token, limit: 255
- t.string :encrypted_token_iv, limit: 255
- end
- end
- # rubocop:enable Migration/PreventStrings
-end
diff --git a/db/migrate/20190907184714_add_show_whitespace_in_diffs_to_user_preferences.rb b/db/migrate/20190907184714_add_show_whitespace_in_diffs_to_user_preferences.rb
deleted file mode 100644
index 41f9b36278a..00000000000
--- a/db/migrate/20190907184714_add_show_whitespace_in_diffs_to_user_preferences.rb
+++ /dev/null
@@ -1,20 +0,0 @@
-# frozen_string_literal: true
-
-# See http://doc.gitlab.com/ce/development/migration_style_guide.html
-# for more information on how to write migrations for GitLab.
-
-class AddShowWhitespaceInDiffsToUserPreferences < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- add_column_with_default :user_preferences, :show_whitespace_in_diffs, :boolean, default: true, allow_null: false # rubocop:disable Migration/AddColumnWithDefault
- end
-
- def down
- remove_column :user_preferences, :show_whitespace_in_diffs
- end
-end
diff --git a/db/migrate/20190909045845_create_project_pages_metadata.rb b/db/migrate/20190909045845_create_project_pages_metadata.rb
deleted file mode 100644
index 5fc8fc6e6c1..00000000000
--- a/db/migrate/20190909045845_create_project_pages_metadata.rb
+++ /dev/null
@@ -1,14 +0,0 @@
-# frozen_string_literal: true
-
-class CreateProjectPagesMetadata < ActiveRecord::Migration[5.2]
- DOWNTIME = false
-
- def change
- create_table :project_pages_metadata, id: false do |t|
- t.references :project, null: false, index: { unique: true }, foreign_key: { on_delete: :cascade }
- t.boolean :deployed, null: false, default: false
-
- t.index :project_id, name: 'index_project_pages_metadata_on_project_id_and_deployed_is_true', where: "deployed = TRUE"
- end
- end
-end
diff --git a/db/migrate/20190910103144_replace_events_index_on_group_id_with_partial_index.rb b/db/migrate/20190910103144_replace_events_index_on_group_id_with_partial_index.rb
deleted file mode 100644
index 40a7454fd20..00000000000
--- a/db/migrate/20190910103144_replace_events_index_on_group_id_with_partial_index.rb
+++ /dev/null
@@ -1,19 +0,0 @@
-# frozen_string_literal: true
-
-class ReplaceEventsIndexOnGroupIdWithPartialIndex < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- add_concurrent_index(:events, :group_id, where: 'group_id IS NOT NULL', name: 'index_events_on_group_id_partial')
- remove_concurrent_index_by_name(:events, 'index_events_on_group_id')
- end
-
- def down
- add_concurrent_index(:events, :group_id, name: 'index_events_on_group_id')
- remove_concurrent_index_by_name(:events, 'index_events_on_group_id_partial')
- end
-end
diff --git a/db/migrate/20190910114843_exclude_nulls_from_index_on_namespaces_type.rb b/db/migrate/20190910114843_exclude_nulls_from_index_on_namespaces_type.rb
deleted file mode 100644
index 8237c48b16d..00000000000
--- a/db/migrate/20190910114843_exclude_nulls_from_index_on_namespaces_type.rb
+++ /dev/null
@@ -1,20 +0,0 @@
-# frozen_string_literal: true
-
-class ExcludeNullsFromIndexOnNamespacesType < ActiveRecord::Migration[5.1]
- include Gitlab::Database::MigrationHelpers
-
- # Set this constant to true if this migration requires downtime.
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- add_concurrent_index(:namespaces, :type, where: 'type is not null', name: 'index_namespaces_on_type_partial')
- remove_concurrent_index_by_name(:namespaces, 'index_namespaces_on_type')
- end
-
- def down
- add_concurrent_index(:namespaces, :type, name: 'index_namespaces_on_type')
- remove_concurrent_index_by_name(:namespaces, 'index_namespaces_on_type_partial')
- end
-end
diff --git a/db/migrate/20190910125852_create_analytics_language_trend_repository_languages.rb b/db/migrate/20190910125852_create_analytics_language_trend_repository_languages.rb
deleted file mode 100644
index 1fc9034655c..00000000000
--- a/db/migrate/20190910125852_create_analytics_language_trend_repository_languages.rb
+++ /dev/null
@@ -1,34 +0,0 @@
-# frozen_string_literal: true
-
-class CreateAnalyticsLanguageTrendRepositoryLanguages < ActiveRecord::Migration[5.2]
- DOWNTIME = false
- INDEX_PREFIX = 'analytics_repository_languages_'
-
- def change
- create_table :analytics_language_trend_repository_languages, id: false do |t|
- t.integer :file_count, null: false, default: 0
-
- t.references :programming_language,
- null: false,
- foreign_key: { on_delete: :cascade },
- index: false
- t.references :project,
- null: false,
- foreign_key: { on_delete: :cascade },
- index: { name: INDEX_PREFIX + 'on_project_id' }
- t.integer :loc, null: false, default: 0
- t.integer :bytes, null: false, default: 0
- # Storing percentage (with 2 decimal places), on 2 bytes.
- # 50.25% => 5025
- # Max: 100.00% => 10000 (fits smallint: 32767)
- t.integer :percentage, limit: 2, null: false, default: 0
- t.date :snapshot_date, null: false
- end
-
- add_index :analytics_language_trend_repository_languages, %I[
- programming_language_id
- project_id
- snapshot_date
- ], name: INDEX_PREFIX + 'unique_index', unique: true
- end
-end
diff --git a/db/migrate/20190910211526_create_packages_conan_file_metadata.rb b/db/migrate/20190910211526_create_packages_conan_file_metadata.rb
deleted file mode 100644
index a6830a93cbc..00000000000
--- a/db/migrate/20190910211526_create_packages_conan_file_metadata.rb
+++ /dev/null
@@ -1,20 +0,0 @@
-# frozen_string_literal: true
-
-class CreatePackagesConanFileMetadata < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- # rubocop:disable Migration/PreventStrings
- def change
- create_table :packages_conan_file_metadata do |t|
- t.references :package_file, index: { unique: true }, null: false, foreign_key: { to_table: :packages_package_files, on_delete: :cascade }, type: :bigint
- t.timestamps_with_timezone
- t.string "recipe_revision", null: false, default: "0", limit: 255
- t.string "package_revision", limit: 255
- t.string "conan_package_reference", limit: 255
- t.integer "conan_file_type", limit: 2, null: false
- end
- end
- # rubocop:enable Migration/PreventStrings
-end
diff --git a/db/migrate/20190910212256_add_any_approver_rule_unique_indexes.rb b/db/migrate/20190910212256_add_any_approver_rule_unique_indexes.rb
deleted file mode 100644
index e8f5b853d1d..00000000000
--- a/db/migrate/20190910212256_add_any_approver_rule_unique_indexes.rb
+++ /dev/null
@@ -1,30 +0,0 @@
-# frozen_string_literal: true
-
-# See http://doc.gitlab.com/ce/development/migration_style_guide.html
-# for more information on how to write migrations for GitLab.
-
-class AddAnyApproverRuleUniqueIndexes < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- PROJECT_RULE_UNIQUE_INDEX = 'any_approver_project_rule_type_unique_index'
- MERGE_REQUEST_RULE_UNIQUE_INDEX = 'any_approver_merge_request_rule_type_unique_index'
-
- disable_ddl_transaction!
-
- def up
- add_concurrent_index(:approval_project_rules, [:project_id],
- where: "rule_type = 3",
- name: PROJECT_RULE_UNIQUE_INDEX, unique: true)
-
- add_concurrent_index(:approval_merge_request_rules, [:merge_request_id, :rule_type],
- where: "rule_type = 4",
- name: MERGE_REQUEST_RULE_UNIQUE_INDEX, unique: true)
- end
-
- def down
- remove_concurrent_index_by_name(:approval_project_rules, PROJECT_RULE_UNIQUE_INDEX)
- remove_concurrent_index_by_name(:approval_merge_request_rules, MERGE_REQUEST_RULE_UNIQUE_INDEX)
- end
-end
diff --git a/db/migrate/20190911115056_add_projects_max_pages_size.rb b/db/migrate/20190911115056_add_projects_max_pages_size.rb
deleted file mode 100644
index 70812e31ab8..00000000000
--- a/db/migrate/20190911115056_add_projects_max_pages_size.rb
+++ /dev/null
@@ -1,9 +0,0 @@
-# frozen_string_literal: true
-
-class AddProjectsMaxPagesSize < ActiveRecord::Migration[5.2]
- DOWNTIME = false
-
- def change
- add_column :projects, :max_pages_size, :integer # rubocop:disable Migration/AddColumnsToWideTables
- end
-end
diff --git a/db/migrate/20190911115109_add_namespaces_max_pages_size.rb b/db/migrate/20190911115109_add_namespaces_max_pages_size.rb
deleted file mode 100644
index d3054714188..00000000000
--- a/db/migrate/20190911115109_add_namespaces_max_pages_size.rb
+++ /dev/null
@@ -1,9 +0,0 @@
-# frozen_string_literal: true
-
-class AddNamespacesMaxPagesSize < ActiveRecord::Migration[5.2]
- DOWNTIME = false
-
- def change
- add_column :namespaces, :max_pages_size, :integer # rubocop:disable Migration/AddColumnsToWideTables
- end
-end
diff --git a/db/migrate/20190911115207_add_projects_max_artifacts_size.rb b/db/migrate/20190911115207_add_projects_max_artifacts_size.rb
deleted file mode 100644
index cd4574ad9c8..00000000000
--- a/db/migrate/20190911115207_add_projects_max_artifacts_size.rb
+++ /dev/null
@@ -1,9 +0,0 @@
-# frozen_string_literal: true
-
-class AddProjectsMaxArtifactsSize < ActiveRecord::Migration[5.2]
- DOWNTIME = false
-
- def change
- add_column :projects, :max_artifacts_size, :integer # rubocop:disable Migration/AddColumnsToWideTables
- end
-end
diff --git a/db/migrate/20190911115222_add_namespaces_max_artifacts_size.rb b/db/migrate/20190911115222_add_namespaces_max_artifacts_size.rb
deleted file mode 100644
index bec81d6c7e1..00000000000
--- a/db/migrate/20190911115222_add_namespaces_max_artifacts_size.rb
+++ /dev/null
@@ -1,9 +0,0 @@
-# frozen_string_literal: true
-
-class AddNamespacesMaxArtifactsSize < ActiveRecord::Migration[5.2]
- DOWNTIME = false
-
- def change
- add_column :namespaces, :max_artifacts_size, :integer # rubocop:disable Migration/AddColumnsToWideTables
- end
-end
diff --git a/db/migrate/20190912061145_add_index_to_members_on_expires_at.rb b/db/migrate/20190912061145_add_index_to_members_on_expires_at.rb
deleted file mode 100644
index e961977747b..00000000000
--- a/db/migrate/20190912061145_add_index_to_members_on_expires_at.rb
+++ /dev/null
@@ -1,17 +0,0 @@
-# frozen_string_literal: true
-
-class AddIndexToMembersOnExpiresAt < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- add_concurrent_index :members, :expires_at
- end
-
- def down
- remove_concurrent_index :members, :expires_at
- end
-end
diff --git a/db/migrate/20190912223232_add_role_to_users.rb b/db/migrate/20190912223232_add_role_to_users.rb
deleted file mode 100644
index a6405ab896d..00000000000
--- a/db/migrate/20190912223232_add_role_to_users.rb
+++ /dev/null
@@ -1,12 +0,0 @@
-# frozen_string_literal: true
-
-# See http://doc.gitlab.com/ce/development/migration_style_guide.html
-# for more information on how to write migrations for GitLab.
-
-class AddRoleToUsers < ActiveRecord::Migration[5.2]
- DOWNTIME = false
-
- def change
- add_column :users, :role, :smallint # rubocop:disable Migration/AddColumnsToWideTables
- end
-end
diff --git a/db/migrate/20190913174707_add_spdx_id_to_software_licenses.rb b/db/migrate/20190913174707_add_spdx_id_to_software_licenses.rb
deleted file mode 100644
index 46e1400c394..00000000000
--- a/db/migrate/20190913174707_add_spdx_id_to_software_licenses.rb
+++ /dev/null
@@ -1,15 +0,0 @@
-# frozen_string_literal: true
-
-class AddSpdxIdToSoftwareLicenses < ActiveRecord::Migration[5.2]
- DOWNTIME = false
-
- # rubocop:disable Migration/PreventStrings
- def up
- add_column :software_licenses, :spdx_identifier, :string, limit: 255
- end
- # rubocop:enable Migration/PreventStrings
-
- def down
- remove_column :software_licenses, :spdx_identifier
- end
-end
diff --git a/db/migrate/20190913175827_add_index_to_software_licenses_on_spdx_id.rb b/db/migrate/20190913175827_add_index_to_software_licenses_on_spdx_id.rb
deleted file mode 100644
index 94f8738b0cc..00000000000
--- a/db/migrate/20190913175827_add_index_to_software_licenses_on_spdx_id.rb
+++ /dev/null
@@ -1,17 +0,0 @@
-# frozen_string_literal: true
-
-class AddIndexToSoftwareLicensesOnSpdxId < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- add_concurrent_index :software_licenses, :spdx_identifier
- end
-
- def down
- remove_concurrent_index :software_licenses, :spdx_identifier
- end
-end
diff --git a/db/migrate/20190914223900_modify_concurrent_index_to_builds_metadata.rb b/db/migrate/20190914223900_modify_concurrent_index_to_builds_metadata.rb
deleted file mode 100644
index ad8979045e5..00000000000
--- a/db/migrate/20190914223900_modify_concurrent_index_to_builds_metadata.rb
+++ /dev/null
@@ -1,23 +0,0 @@
-# frozen_string_literal: true
-
-class ModifyConcurrentIndexToBuildsMetadata < ActiveRecord::Migration[5.0]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- add_concurrent_index :ci_builds_metadata, [:build_id],
- where: "interruptible = true",
- name: "index_ci_builds_metadata_on_build_id_and_interruptible"
- remove_concurrent_index_by_name(:ci_builds_metadata, 'index_ci_builds_metadata_on_build_id_and_interruptible_false')
- end
-
- def down
- remove_concurrent_index_by_name(:ci_builds_metadata, 'index_ci_builds_metadata_on_build_id_and_interruptible')
- add_concurrent_index :ci_builds_metadata, [:build_id],
- where: "interruptible = false",
- name: "index_ci_builds_metadata_on_build_id_and_interruptible_false"
- end
-end
diff --git a/db/migrate/20190918025618_add_user_and_timestamps_to_design_management_versions.rb b/db/migrate/20190918025618_add_user_and_timestamps_to_design_management_versions.rb
deleted file mode 100644
index 3daca8a8e97..00000000000
--- a/db/migrate/20190918025618_add_user_and_timestamps_to_design_management_versions.rb
+++ /dev/null
@@ -1,16 +0,0 @@
-# frozen_string_literal: true
-
-class AddUserAndTimestampsToDesignManagementVersions < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- def up
- add_column :design_management_versions, :user_id, :integer
- add_column :design_management_versions, :created_at, :datetime_with_timezone
- end
-
- def down
- remove_columns :design_management_versions, :user_id, :created_at
- end
-end
diff --git a/db/migrate/20190918102042_create_grafana_integrations.rb b/db/migrate/20190918102042_create_grafana_integrations.rb
deleted file mode 100644
index d48aaaf45bc..00000000000
--- a/db/migrate/20190918102042_create_grafana_integrations.rb
+++ /dev/null
@@ -1,17 +0,0 @@
-# frozen_string_literal: true
-
-class CreateGrafanaIntegrations < ActiveRecord::Migration[5.2]
- DOWNTIME = false
-
- # rubocop:disable Migration/PreventStrings
- def change
- create_table :grafana_integrations do |t|
- t.references :project, index: true, foreign_key: { on_delete: :cascade }, unique: true, null: false
- t.timestamps_with_timezone null: false
- t.string :encrypted_token, limit: 255, null: false
- t.string :encrypted_token_iv, limit: 255, null: false
- t.string :grafana_url, null: false, limit: 1024
- end
- end
- # rubocop:enable Migration/PreventStrings
-end
diff --git a/db/migrate/20190918104212_add_merge_request_metrics_merged_at_index.rb b/db/migrate/20190918104212_add_merge_request_metrics_merged_at_index.rb
deleted file mode 100644
index 9db4e42f3ee..00000000000
--- a/db/migrate/20190918104212_add_merge_request_metrics_merged_at_index.rb
+++ /dev/null
@@ -1,17 +0,0 @@
-# frozen_string_literal: true
-
-class AddMergeRequestMetricsMergedAtIndex < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- add_concurrent_index :merge_request_metrics, [:merged_at, :id]
- end
-
- def down
- remove_concurrent_index :merge_request_metrics, [:merged_at, :id]
- end
-end
diff --git a/db/migrate/20190918104731_add_cleanup_status_to_cluster.rb b/db/migrate/20190918104731_add_cleanup_status_to_cluster.rb
deleted file mode 100644
index 62290fb0fa6..00000000000
--- a/db/migrate/20190918104731_add_cleanup_status_to_cluster.rb
+++ /dev/null
@@ -1,21 +0,0 @@
-# frozen_string_literal: true
-
-class AddCleanupStatusToCluster < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- # Set this constant to true if this migration requires downtime.
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- add_column_with_default(:clusters, :cleanup_status, # rubocop:disable Migration/AddColumnWithDefault
- :smallint,
- default: 1,
- allow_null: false)
- end
-
- def down
- remove_column(:clusters, :cleanup_status)
- end
-end
diff --git a/db/migrate/20190918121135_add_cleanup_status_reason_to_cluster.rb b/db/migrate/20190918121135_add_cleanup_status_reason_to_cluster.rb
deleted file mode 100644
index 85293ebbe86..00000000000
--- a/db/migrate/20190918121135_add_cleanup_status_reason_to_cluster.rb
+++ /dev/null
@@ -1,12 +0,0 @@
-# frozen_string_literal: true
-
-class AddCleanupStatusReasonToCluster < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- # Set this constant to true if this migration requires downtime.
- DOWNTIME = false
-
- def change
- add_column :clusters, :cleanup_status_reason, :text # rubocop:disable Migration/AddLimitToTextColumns
- end
-end
diff --git a/db/migrate/20190919040324_add_successfull_pages_deploy_partial_index_on_ci_builds.rb b/db/migrate/20190919040324_add_successfull_pages_deploy_partial_index_on_ci_builds.rb
deleted file mode 100644
index d736b21dddf..00000000000
--- a/db/migrate/20190919040324_add_successfull_pages_deploy_partial_index_on_ci_builds.rb
+++ /dev/null
@@ -1,23 +0,0 @@
-# frozen_string_literal: true
-
-class AddSuccessfullPagesDeployPartialIndexOnCiBuilds < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- INDEX_NAME = 'index_ci_builds_on_project_id_for_successfull_pages_deploy'
-
- def up
- add_concurrent_index(
- :ci_builds, :project_id,
- name: INDEX_NAME,
- where: "type='GenericCommitStatus' AND stage='deploy' AND name='pages:deploy' AND status = 'success'"
- )
- end
-
- def down
- remove_concurrent_index_by_name :ci_builds, INDEX_NAME
- end
-end
diff --git a/db/migrate/20190919091300_create_evidences.rb b/db/migrate/20190919091300_create_evidences.rb
deleted file mode 100644
index 3f861ed26bd..00000000000
--- a/db/migrate/20190919091300_create_evidences.rb
+++ /dev/null
@@ -1,14 +0,0 @@
-# frozen_string_literal: true
-
-class CreateEvidences < ActiveRecord::Migration[5.2]
- DOWNTIME = false
-
- def change
- create_table :evidences do |t|
- t.references :release, foreign_key: { on_delete: :cascade }, null: false
- t.timestamps_with_timezone
- t.binary :summary_sha
- t.jsonb :summary, null: false, default: {}
- end
- end
-end
diff --git a/db/migrate/20190919104119_index_timestamp_columns_for_merge_requests_creation_date.rb b/db/migrate/20190919104119_index_timestamp_columns_for_merge_requests_creation_date.rb
deleted file mode 100644
index 5e0d80630cd..00000000000
--- a/db/migrate/20190919104119_index_timestamp_columns_for_merge_requests_creation_date.rb
+++ /dev/null
@@ -1,29 +0,0 @@
-# frozen_string_literal: true
-
-class IndexTimestampColumnsForMergeRequestsCreationDate < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- add_concurrent_index(*index_arguments)
- end
-
- def down
- remove_concurrent_index(*index_arguments)
- end
-
- private
-
- def index_arguments
- [
- :merge_requests,
- [:target_project_id, :created_at],
- {
- name: 'index_merge_requests_target_project_id_created_at'
- }
- ]
- end
-end
diff --git a/db/migrate/20190919162036_add_index_to_clusters_providers_gcp_on_cloud_run.rb b/db/migrate/20190919162036_add_index_to_clusters_providers_gcp_on_cloud_run.rb
deleted file mode 100644
index 8e0bde97cc1..00000000000
--- a/db/migrate/20190919162036_add_index_to_clusters_providers_gcp_on_cloud_run.rb
+++ /dev/null
@@ -1,17 +0,0 @@
-# frozen_string_literal: true
-
-class AddIndexToClustersProvidersGcpOnCloudRun < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- add_concurrent_index(:cluster_providers_gcp, :cloud_run)
- end
-
- def down
- remove_concurrent_index(:cluster_providers_gcp, :cloud_run)
- end
-end
diff --git a/db/migrate/20190919183411_add_index_packages_on_name_trigram_to_packages_packages.rb b/db/migrate/20190919183411_add_index_packages_on_name_trigram_to_packages_packages.rb
deleted file mode 100644
index d359350a891..00000000000
--- a/db/migrate/20190919183411_add_index_packages_on_name_trigram_to_packages_packages.rb
+++ /dev/null
@@ -1,18 +0,0 @@
-# frozen_string_literal: true
-
-class AddIndexPackagesOnNameTrigramToPackagesPackages < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
- INDEX_NAME = 'index_packages_packages_on_name_trigram'
-
- disable_ddl_transaction!
-
- def up
- add_concurrent_index :packages_packages, :name, name: INDEX_NAME, using: :gin, opclass: { name: :gin_trgm_ops }
- end
-
- def down
- remove_concurrent_index_by_name(:packages_packages, INDEX_NAME)
- end
-end
diff --git a/db/migrate/20190920122420_add_max_personal_access_token_lifetime_to_application_settings.rb b/db/migrate/20190920122420_add_max_personal_access_token_lifetime_to_application_settings.rb
deleted file mode 100644
index 5a6e810dede..00000000000
--- a/db/migrate/20190920122420_add_max_personal_access_token_lifetime_to_application_settings.rb
+++ /dev/null
@@ -1,9 +0,0 @@
-# frozen_string_literal: true
-
-class AddMaxPersonalAccessTokenLifetimeToApplicationSettings < ActiveRecord::Migration[5.2]
- DOWNTIME = false
-
- def change
- add_column :application_settings, :max_personal_access_token_lifetime, :integer
- end
-end
diff --git a/db/migrate/20190920194925_backfill_releases_table_updated_at_and_add_not_null_constraints_to_timestamps.rb b/db/migrate/20190920194925_backfill_releases_table_updated_at_and_add_not_null_constraints_to_timestamps.rb
deleted file mode 100644
index f8f1c6c231b..00000000000
--- a/db/migrate/20190920194925_backfill_releases_table_updated_at_and_add_not_null_constraints_to_timestamps.rb
+++ /dev/null
@@ -1,24 +0,0 @@
-# frozen_string_literal: true
-
-class BackfillReleasesTableUpdatedAtAndAddNotNullConstraintsToTimestamps < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- change_column_null(:releases, :created_at, false, Time.zone.now)
-
- update_column_in_batches(:releases, :updated_at, Arel.sql('created_at')) do |table, query|
- query.where(table[:updated_at].eq(nil))
- end
-
- change_column_null(:releases, :updated_at, false, Time.zone.now)
- end
-
- def down
- change_column_null(:releases, :updated_at, true)
- change_column_null(:releases, :created_at, true)
- end
-end
diff --git a/db/migrate/20190920224341_create_merge_request_context_commits_and_diffs.rb b/db/migrate/20190920224341_create_merge_request_context_commits_and_diffs.rb
deleted file mode 100644
index bd97d3d3183..00000000000
--- a/db/migrate/20190920224341_create_merge_request_context_commits_and_diffs.rb
+++ /dev/null
@@ -1,45 +0,0 @@
-# frozen_string_literal: true
-
-# See http://doc.gitlab.com/ce/development/migration_style_guide.html
-# for more information on how to write migrations for GitLab.
-
-class CreateMergeRequestContextCommitsAndDiffs < ActiveRecord::Migration[5.2]
- DOWNTIME = false
-
- # rubocop:disable Migration/PreventStrings
- # rubocop:disable Migration/AddLimitToTextColumns
- def change
- create_table :merge_request_context_commits do |t|
- t.references :merge_request, foreign_key: { on_delete: :cascade }
- t.datetime_with_timezone :authored_date
- t.datetime_with_timezone :committed_date
- t.binary :sha, null: false
- t.integer :relative_order, null: false
- t.text :author_name
- t.text :author_email
- t.text :committer_name
- t.text :committer_email
- t.text :message
- t.index [:merge_request_id, :sha], unique: true, name: 'index_mr_context_commits_on_merge_request_id_and_sha'
- end
-
- create_table :merge_request_context_commit_diff_files, id: false do |t|
- t.references :merge_request_context_commit, foreign_key: { on_delete: :cascade }, index: { name: "idx_mr_cc_diff_files_on_mr_cc_id" }
- t.binary :sha, null: false
- t.integer :relative_order, null: false
- t.string :a_mode, null: false, limit: 255
- t.string :b_mode, null: false, limit: 255
- t.boolean :new_file, null: false
- t.boolean :renamed_file, null: false
- t.boolean :deleted_file, null: false
- t.boolean :too_large, null: false
- t.boolean :binary
- t.text :new_path, null: false
- t.text :old_path, null: false
- t.text :diff
- t.index [:merge_request_context_commit_id, :sha], name: 'idx_mr_cc_diff_files_on_mr_cc_id_and_sha'
- end
- end
- # rubocop:enable Migration/AddLimitToTextColumns
- # rubocop:enable Migration/PreventStrings
-end
diff --git a/db/migrate/20190924124627_add_pull_mirror_branch_prefix_to_projects.rb b/db/migrate/20190924124627_add_pull_mirror_branch_prefix_to_projects.rb
deleted file mode 100644
index 2750468834f..00000000000
--- a/db/migrate/20190924124627_add_pull_mirror_branch_prefix_to_projects.rb
+++ /dev/null
@@ -1,13 +0,0 @@
-# frozen_string_literal: true
-
-class AddPullMirrorBranchPrefixToProjects < ActiveRecord::Migration[5.2]
- DOWNTIME = false
-
- # rubocop:disable Migration/AddColumnsToWideTables
- # rubocop:disable Migration/PreventStrings
- def change
- add_column :projects, :pull_mirror_branch_prefix, :string, limit: 50
- end
- # rubocop:enable Migration/PreventStrings
- # rubocop:enable Migration/AddColumnsToWideTables
-end
diff --git a/db/migrate/20190925055714_default_request_access_groups.rb b/db/migrate/20190925055714_default_request_access_groups.rb
deleted file mode 100644
index ba3efbe56f4..00000000000
--- a/db/migrate/20190925055714_default_request_access_groups.rb
+++ /dev/null
@@ -1,15 +0,0 @@
-# frozen_string_literal: true
-
-class DefaultRequestAccessGroups < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- def up
- change_column_default :namespaces, :request_access_enabled, true
- end
-
- def down
- change_column_default :namespaces, :request_access_enabled, false
- end
-end
diff --git a/db/migrate/20190925055902_default_request_access_projects.rb b/db/migrate/20190925055902_default_request_access_projects.rb
deleted file mode 100644
index 3ad88d0963d..00000000000
--- a/db/migrate/20190925055902_default_request_access_projects.rb
+++ /dev/null
@@ -1,15 +0,0 @@
-# frozen_string_literal: true
-
-class DefaultRequestAccessProjects < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- def up
- change_column_default :projects, :request_access_enabled, true
- end
-
- def down
- change_column_default :projects, :request_access_enabled, false
- end
-end
diff --git a/db/migrate/20190926041216_add_user_indexes_to_design_management_versions.rb b/db/migrate/20190926041216_add_user_indexes_to_design_management_versions.rb
deleted file mode 100644
index 6eb9fdbbcaa..00000000000
--- a/db/migrate/20190926041216_add_user_indexes_to_design_management_versions.rb
+++ /dev/null
@@ -1,19 +0,0 @@
-# frozen_string_literal: true
-
-class AddUserIndexesToDesignManagementVersions < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- add_concurrent_foreign_key :design_management_versions, :users, column: :user_id, on_delete: :nullify
- add_concurrent_index :design_management_versions, :user_id, where: 'user_id IS NOT NULL'
- end
-
- def down
- remove_concurrent_index :design_management_versions, :user_id
- remove_foreign_key :design_management_versions, column: :user_id
- end
-end
diff --git a/db/migrate/20190926225633_create_x509_signatures.rb b/db/migrate/20190926225633_create_x509_signatures.rb
deleted file mode 100644
index 40d2c351524..00000000000
--- a/db/migrate/20190926225633_create_x509_signatures.rb
+++ /dev/null
@@ -1,43 +0,0 @@
-# frozen_string_literal: true
-
-# See http://doc.gitlab.com/ce/development/migration_style_guide.html
-# for more information on how to write migrations for GitLab.
-
-class CreateX509Signatures < ActiveRecord::Migration[5.2]
- DOWNTIME = false
-
- # rubocop:disable Migration/PreventStrings
- def change
- create_table :x509_issuers do |t|
- t.timestamps_with_timezone null: false
-
- t.string :subject_key_identifier, index: true, null: false, unique: true, limit: 255
- t.string :subject, null: false, limit: 255
- t.string :crl_url, null: false, limit: 255
- end
-
- create_table :x509_certificates do |t|
- t.timestamps_with_timezone null: false
-
- t.string :subject_key_identifier, index: true, null: false, unique: true, limit: 255
- t.string :subject, null: false, limit: 255
- t.string :email, null: false, limit: 255
- t.binary :serial_number, null: false
-
- t.integer :certificate_status, limit: 2, default: 0, null: false
-
- t.references :x509_issuer, index: true, null: false, foreign_key: { on_delete: :cascade }
- end
-
- create_table :x509_commit_signatures do |t|
- t.timestamps_with_timezone null: false
-
- t.references :project, index: true, null: false, foreign_key: { on_delete: :cascade }
- t.references :x509_certificate, index: true, null: false, foreign_key: { on_delete: :cascade }
-
- t.binary :commit_sha, index: true, null: false
- t.integer :verification_status, limit: 2, default: 0, null: false
- end
- end
- # rubocop:enable Migration/PreventStrings
-end
diff --git a/db/migrate/20190927055500_create_description_versions.rb b/db/migrate/20190927055500_create_description_versions.rb
deleted file mode 100644
index b3082533a6f..00000000000
--- a/db/migrate/20190927055500_create_description_versions.rb
+++ /dev/null
@@ -1,29 +0,0 @@
-# frozen_string_literal: true
-
-class CreateDescriptionVersions < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- def up
- create_table :description_versions do |t|
- t.timestamps_with_timezone
- t.references :issue, index: false, foreign_key: { on_delete: :cascade }, type: :integer
- t.references :merge_request, index: false, foreign_key: { on_delete: :cascade }, type: :integer
- t.references :epic, index: false, foreign_key: { on_delete: :cascade }, type: :integer
- t.text :description # rubocop:disable Migration/AddLimitToTextColumns
- end
-
- add_index :description_versions, :issue_id, where: 'issue_id IS NOT NULL'
- add_index :description_versions, :merge_request_id, where: 'merge_request_id IS NOT NULL'
- add_index :description_versions, :epic_id, where: 'epic_id IS NOT NULL'
-
- add_column :system_note_metadata, :description_version_id, :bigint
- end
-
- def down
- remove_column :system_note_metadata, :description_version_id
-
- drop_table :description_versions
- end
-end
diff --git a/db/migrate/20190927055540_add_index_to_sytem_note_metadata_description_version_id.rb b/db/migrate/20190927055540_add_index_to_sytem_note_metadata_description_version_id.rb
deleted file mode 100644
index 695ba955043..00000000000
--- a/db/migrate/20190927055540_add_index_to_sytem_note_metadata_description_version_id.rb
+++ /dev/null
@@ -1,19 +0,0 @@
-# frozen_string_literal: true
-
-class AddIndexToSytemNoteMetadataDescriptionVersionId < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- add_concurrent_index :system_note_metadata, :description_version_id, unique: true, where: 'description_version_id IS NOT NULL'
- add_concurrent_foreign_key :system_note_metadata, :description_versions, column: :description_version_id, on_delete: :nullify
- end
-
- def down
- remove_foreign_key :system_note_metadata, column: :description_version_id
- remove_concurrent_index :system_note_metadata, :description_version_id
- end
-end
diff --git a/db/migrate/20190927074328_add_index_on_snippet_content.rb b/db/migrate/20190927074328_add_index_on_snippet_content.rb
deleted file mode 100644
index ef7583508f2..00000000000
--- a/db/migrate/20190927074328_add_index_on_snippet_content.rb
+++ /dev/null
@@ -1,18 +0,0 @@
-# frozen_string_literal: true
-
-class AddIndexOnSnippetContent < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
- INDEX_NAME = 'index_snippets_on_content_trigram'
-
- disable_ddl_transaction!
-
- def up
- add_concurrent_index :snippets, :content, name: INDEX_NAME, using: :gin, opclass: { content: :gin_trgm_ops }
- end
-
- def down
- remove_concurrent_index_by_name(:snippets, INDEX_NAME)
- end
-end
diff --git a/db/migrate/20190929180751_create_vulnerabilities.rb b/db/migrate/20190929180751_create_vulnerabilities.rb
deleted file mode 100644
index e4c53b1063a..00000000000
--- a/db/migrate/20190929180751_create_vulnerabilities.rb
+++ /dev/null
@@ -1,41 +0,0 @@
-# frozen_string_literal: true
-
-# See http://doc.gitlab.com/ce/development/migration_style_guide.html
-# for more information on how to write migrations for GitLab.
-
-class CreateVulnerabilities < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- # rubocop:disable Migration/AddLimitToTextColumns
- def change
- create_table :vulnerabilities do |t|
- t.bigint "milestone_id"
- t.bigint "epic_id"
- t.bigint "project_id", null: false
- t.bigint "author_id", null: false
- t.bigint "updated_by_id"
- t.bigint "last_edited_by_id"
- t.bigint "start_date_sourcing_milestone_id"
- t.bigint "due_date_sourcing_milestone_id"
- t.bigint "closed_by_id"
- t.datetime_with_timezone "last_edited_at"
- t.datetime_with_timezone "created_at", null: false
- t.datetime_with_timezone "updated_at", null: false
- t.datetime_with_timezone "closed_at"
- t.date "start_date"
- t.date "due_date"
- t.integer "state", limit: 2, default: 1, null: false # initially: open, closed
- t.integer "severity", limit: 2, null: false # auto-calculated as highest-severity finding, but overrideable
- t.integer "confidence", limit: 2, null: false # auto-calculated as lowest-confidence finding, but overrideable
- t.boolean "severity_overridden", default: false
- t.boolean "confidence_overridden", default: false
- t.string "title", limit: 255, null: false # rubocop:disable Migration/PreventStrings
- t.text "title_html", null: false
- t.text "description"
- t.text "description_html"
- end
- end
- # rubocop:enable Migration/AddLimitToTextColumns
-end
diff --git a/db/migrate/20190929180813_add_reference_from_vulnerability_occurrences_to_occurrences.rb b/db/migrate/20190929180813_add_reference_from_vulnerability_occurrences_to_occurrences.rb
deleted file mode 100644
index eb8e8fb73d1..00000000000
--- a/db/migrate/20190929180813_add_reference_from_vulnerability_occurrences_to_occurrences.rb
+++ /dev/null
@@ -1,14 +0,0 @@
-# frozen_string_literal: true
-
-# See http://doc.gitlab.com/ce/development/migration_style_guide.html
-# for more information on how to write migrations for GitLab.
-
-class AddReferenceFromVulnerabilityOccurrencesToOccurrences < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- def change
- add_column :vulnerability_occurrences, :vulnerability_id, :bigint
- end
-end
diff --git a/db/migrate/20190929180827_add_foreign_keys_and_indexes_to_vulnerabilities.rb b/db/migrate/20190929180827_add_foreign_keys_and_indexes_to_vulnerabilities.rb
deleted file mode 100644
index 4d7c2363083..00000000000
--- a/db/migrate/20190929180827_add_foreign_keys_and_indexes_to_vulnerabilities.rb
+++ /dev/null
@@ -1,76 +0,0 @@
-# frozen_string_literal: true
-
-# See http://doc.gitlab.com/ce/development/migration_style_guide.html
-# for more information on how to write migrations for GitLab.
-
-class AddForeignKeysAndIndexesToVulnerabilities < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- add_concurrent_index :vulnerabilities, :milestone_id
- add_concurrent_foreign_key :vulnerabilities, :milestones, column: :milestone_id, on_delete: :nullify
-
- add_concurrent_index :vulnerabilities, :epic_id
- add_concurrent_foreign_key :vulnerabilities, :epics, column: :epic_id, on_delete: :nullify
-
- add_concurrent_index :vulnerabilities, :project_id
- add_concurrent_foreign_key :vulnerabilities, :projects, column: :project_id
-
- add_concurrent_index :vulnerabilities, :author_id
- add_concurrent_foreign_key :vulnerabilities, :users, column: :author_id, on_delete: :nullify
-
- add_concurrent_index :vulnerabilities, :updated_by_id
- add_concurrent_foreign_key :vulnerabilities, :users, column: :updated_by_id, on_delete: :nullify
-
- add_concurrent_index :vulnerabilities, :last_edited_by_id
- add_concurrent_foreign_key :vulnerabilities, :users, column: :last_edited_by_id, on_delete: :nullify
-
- add_concurrent_index :vulnerabilities, :closed_by_id
- add_concurrent_foreign_key :vulnerabilities, :users, column: :closed_by_id, on_delete: :nullify
-
- add_concurrent_index :vulnerabilities, :start_date_sourcing_milestone_id
- add_concurrent_foreign_key :vulnerabilities, :milestones, column: :start_date_sourcing_milestone_id, on_delete: :nullify
-
- add_concurrent_index :vulnerabilities, :due_date_sourcing_milestone_id
- add_concurrent_foreign_key :vulnerabilities, :milestones, column: :due_date_sourcing_milestone_id, on_delete: :nullify
-
- add_concurrent_index :vulnerability_occurrences, :vulnerability_id
- add_concurrent_foreign_key :vulnerability_occurrences, :vulnerabilities, column: :vulnerability_id, on_delete: :nullify
- end
-
- def down
- remove_foreign_key :vulnerability_occurrences, :vulnerabilities
- remove_concurrent_index :vulnerability_occurrences, :vulnerability_id
-
- remove_foreign_key :vulnerabilities, column: :due_date_sourcing_milestone_id
- remove_concurrent_index :vulnerabilities, :due_date_sourcing_milestone_id
-
- remove_foreign_key :vulnerabilities, column: :start_date_sourcing_milestone_id
- remove_concurrent_index :vulnerabilities, :start_date_sourcing_milestone_id
-
- remove_foreign_key :vulnerabilities, column: :closed_by_id
- remove_concurrent_index :vulnerabilities, :closed_by_id
-
- remove_foreign_key :vulnerabilities, column: :last_edited_by_id
- remove_concurrent_index :vulnerabilities, :last_edited_by_id
-
- remove_foreign_key :vulnerabilities, column: :updated_by_id
- remove_concurrent_index :vulnerabilities, :updated_by_id
-
- remove_foreign_key :vulnerabilities, column: :author_id
- remove_concurrent_index :vulnerabilities, :author_id
-
- remove_foreign_key :vulnerabilities, :projects
- remove_concurrent_index :vulnerabilities, :project_id
-
- remove_foreign_key :vulnerabilities, :epics
- remove_concurrent_index :vulnerabilities, :epic_id
-
- remove_foreign_key :vulnerabilities, :milestones
- remove_concurrent_index :vulnerabilities, :milestone_id
- end
-end
diff --git a/db/migrate/20190930025655_add_incident_management_throttle_columns_to_application_setting.rb b/db/migrate/20190930025655_add_incident_management_throttle_columns_to_application_setting.rb
deleted file mode 100644
index 577c705fbef..00000000000
--- a/db/migrate/20190930025655_add_incident_management_throttle_columns_to_application_setting.rb
+++ /dev/null
@@ -1,30 +0,0 @@
-# frozen_string_literal: true
-
-class AddIncidentManagementThrottleColumnsToApplicationSetting < ActiveRecord::Migration[5.2]
- # Set this constant to true if this migration requires downtime.
- DOWNTIME = false
-
- def up
- add_column(:application_settings,
- :throttle_incident_management_notification_enabled,
- :boolean,
- null: false,
- default: false)
-
- add_column(:application_settings,
- :throttle_incident_management_notification_period_in_seconds,
- :integer,
- default: 3_600)
-
- add_column(:application_settings,
- :throttle_incident_management_notification_per_period,
- :integer,
- default: 3_600)
- end
-
- def down
- remove_column :application_settings, :throttle_incident_management_notification_enabled
- remove_column :application_settings, :throttle_incident_management_notification_period_in_seconds
- remove_column :application_settings, :throttle_incident_management_notification_per_period
- end
-end
diff --git a/db/migrate/20190930063627_add_management_project_id_to_clusters.rb b/db/migrate/20190930063627_add_management_project_id_to_clusters.rb
deleted file mode 100644
index 46c3fef8e76..00000000000
--- a/db/migrate/20190930063627_add_management_project_id_to_clusters.rb
+++ /dev/null
@@ -1,9 +0,0 @@
-# frozen_string_literal: true
-
-class AddManagementProjectIdToClusters < ActiveRecord::Migration[5.2]
- DOWNTIME = false
-
- def change
- add_column :clusters, :management_project_id, :integer
- end
-end
diff --git a/db/migrate/20190930082942_add_new_release_to_notification_settings.rb b/db/migrate/20190930082942_add_new_release_to_notification_settings.rb
deleted file mode 100644
index 2ec5815f542..00000000000
--- a/db/migrate/20190930082942_add_new_release_to_notification_settings.rb
+++ /dev/null
@@ -1,9 +0,0 @@
-# frozen_string_literal: true
-
-class AddNewReleaseToNotificationSettings < ActiveRecord::Migration[5.2]
- DOWNTIME = false
-
- def change
- add_column :notification_settings, :new_release, :boolean
- end
-end
diff --git a/db/migrate/20190930153535_create_zoom_meetings.rb b/db/migrate/20190930153535_create_zoom_meetings.rb
deleted file mode 100644
index 8bc9f0e89de..00000000000
--- a/db/migrate/20190930153535_create_zoom_meetings.rb
+++ /dev/null
@@ -1,24 +0,0 @@
-# frozen_string_literal: true
-
-class CreateZoomMeetings < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- ZOOM_MEETING_STATUS_ADDED = 1
-
- def change
- create_table :zoom_meetings do |t|
- t.references :project, foreign_key: { on_delete: :cascade },
- null: false
- t.references :issue, foreign_key: { on_delete: :cascade },
- null: false
- t.timestamps_with_timezone null: false
- t.integer :issue_status, limit: 2, default: 1, null: false
- t.string :url, limit: 255 # rubocop:disable Migration/PreventStrings
-
- t.index [:issue_id, :issue_status], unique: true,
- where: "issue_status = #{ZOOM_MEETING_STATUS_ADDED}"
- end
- end
-end
diff --git a/db/migrate/20191001040549_add_management_project_id_index_fk_to_clusters.rb b/db/migrate/20191001040549_add_management_project_id_index_fk_to_clusters.rb
deleted file mode 100644
index 97253dd1f2d..00000000000
--- a/db/migrate/20191001040549_add_management_project_id_index_fk_to_clusters.rb
+++ /dev/null
@@ -1,19 +0,0 @@
-# frozen_string_literal: true
-
-class AddManagementProjectIdIndexFkToClusters < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- add_concurrent_foreign_key :clusters, :projects, column: :management_project_id, on_delete: :nullify
- add_concurrent_index :clusters, :management_project_id, where: 'management_project_id IS NOT NULL'
- end
-
- def down
- remove_concurrent_index :clusters, :management_project_id
- remove_foreign_key_if_exists :clusters, column: :management_project_id
- end
-end
diff --git a/db/migrate/20191001170300_create_ci_ref.rb b/db/migrate/20191001170300_create_ci_ref.rb
deleted file mode 100644
index feeb8517e6e..00000000000
--- a/db/migrate/20191001170300_create_ci_ref.rb
+++ /dev/null
@@ -1,21 +0,0 @@
-# frozen_string_literal: true
-
-class CreateCiRef < ActiveRecord::Migration[5.2]
- DOWNTIME = false
-
- # rubocop:disable Migration/PreventStrings
- def change
- create_table :ci_refs do |t|
- t.references :project, null: false, index: false, foreign_key: { on_delete: :cascade }, type: :integer
- t.integer :lock_version, default: 0
- t.integer :last_updated_by_pipeline_id
- t.boolean :tag, default: false, null: false
- t.string :ref, null: false, limit: 255
- t.string :status, null: false, limit: 255
- t.foreign_key :ci_pipelines, column: :last_updated_by_pipeline_id, on_delete: :nullify
- t.index [:project_id, :ref, :tag], unique: true
- t.index [:last_updated_by_pipeline_id]
- end
- end
- # rubocop:enable Migration/PreventStrings
-end
diff --git a/db/migrate/20191002123516_create_clusters_applications_elastic_stack.rb b/db/migrate/20191002123516_create_clusters_applications_elastic_stack.rb
deleted file mode 100644
index e1236423672..00000000000
--- a/db/migrate/20191002123516_create_clusters_applications_elastic_stack.rb
+++ /dev/null
@@ -1,24 +0,0 @@
-# frozen_string_literal: true
-
-# See http://doc.gitlab.com/ce/development/migration_style_guide.html
-# for more information on how to write migrations for GitLab.
-
-class CreateClustersApplicationsElasticStack < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- # rubocop:disable Migration/PreventStrings
- def change
- create_table :clusters_applications_elastic_stacks do |t|
- t.timestamps_with_timezone null: false
- t.references :cluster, null: false, index: false, foreign_key: { on_delete: :cascade }
- t.integer :status, null: false
- t.string :version, null: false, limit: 255
- t.string :kibana_hostname, limit: 255
- t.text :status_reason # rubocop:disable Migration/AddLimitToTextColumns
- t.index :cluster_id, unique: true
- end
- end
- # rubocop:enable Migration/PreventStrings
-end
diff --git a/db/migrate/20191003015155_add_self_managed_prometheus_alerts.rb b/db/migrate/20191003015155_add_self_managed_prometheus_alerts.rb
deleted file mode 100644
index eec6f518257..00000000000
--- a/db/migrate/20191003015155_add_self_managed_prometheus_alerts.rb
+++ /dev/null
@@ -1,22 +0,0 @@
-# frozen_string_literal: true
-
-class AddSelfManagedPrometheusAlerts < ActiveRecord::Migration[5.2]
- DOWNTIME = false
-
- # rubocop:disable Migration/PreventStrings
- def change
- create_table :self_managed_prometheus_alert_events do |t|
- t.references :project, index: false, foreign_key: { on_delete: :cascade }, null: false
- t.references :environment, index: true, foreign_key: { on_delete: :cascade }
- t.datetime_with_timezone :started_at, null: false
- t.datetime_with_timezone :ended_at
-
- t.integer :status, null: false, limit: 2
- t.string :title, null: false, limit: 255
- t.string :query_expression, limit: 255
- t.string :payload_key, null: false, limit: 255
- t.index [:project_id, :payload_key], unique: true, name: 'idx_project_id_payload_key_self_managed_prometheus_alert_events'
- end
- end
- # rubocop:enable Migration/PreventStrings
-end
diff --git a/db/migrate/20191003060227_add_push_event_hooks_limit_to_application_settings.rb b/db/migrate/20191003060227_add_push_event_hooks_limit_to_application_settings.rb
deleted file mode 100644
index 4b381dca81b..00000000000
--- a/db/migrate/20191003060227_add_push_event_hooks_limit_to_application_settings.rb
+++ /dev/null
@@ -1,17 +0,0 @@
-# frozen_string_literal: true
-
-class AddPushEventHooksLimitToApplicationSettings < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- add_column_with_default(:application_settings, :push_event_hooks_limit, :integer, default: 3) # rubocop:disable Migration/AddColumnWithDefault
- end
-
- def down
- remove_column(:application_settings, :push_event_hooks_limit)
- end
-end
diff --git a/db/migrate/20191003064615_create_aws_roles.rb b/db/migrate/20191003064615_create_aws_roles.rb
deleted file mode 100644
index 960e9b28053..00000000000
--- a/db/migrate/20191003064615_create_aws_roles.rb
+++ /dev/null
@@ -1,23 +0,0 @@
-# frozen_string_literal: true
-
-# See http://doc.gitlab.com/ce/development/migration_style_guide.html
-# for more information on how to write migrations for GitLab.
-
-class CreateAwsRoles < ActiveRecord::Migration[5.2]
- DOWNTIME = false
-
- # rubocop:disable Migration/PreventStrings
- def change
- create_table :aws_roles, id: false do |t|
- t.references :user, primary_key: true, default: nil, type: :integer, index: { unique: true }, foreign_key: { on_delete: :cascade }
-
- t.timestamps_with_timezone null: false
-
- t.string :role_arn, null: false, limit: 2048
- t.string :role_external_id, null: false, limit: 64
-
- t.index :role_external_id, unique: true
- end
- end
- # rubocop:enable Migration/PreventStrings
-end
diff --git a/db/migrate/20191003130045_create_issue_user_mentions.rb b/db/migrate/20191003130045_create_issue_user_mentions.rb
deleted file mode 100644
index e465a307f44..00000000000
--- a/db/migrate/20191003130045_create_issue_user_mentions.rb
+++ /dev/null
@@ -1,19 +0,0 @@
-# frozen_string_literal: true
-
-class CreateIssueUserMentions < ActiveRecord::Migration[5.2]
- DOWNTIME = false
-
- def change
- create_table :issue_user_mentions do |t|
- t.references :issue, type: :integer, index: false, null: false, foreign_key: { on_delete: :cascade }
- t.references :note, type: :integer,
- index: { where: 'note_id IS NOT NULL', unique: true }, null: true, foreign_key: { on_delete: :cascade }
- t.integer :mentioned_users_ids, array: true
- t.integer :mentioned_projects_ids, array: true
- t.integer :mentioned_groups_ids, array: true
- end
-
- add_index :issue_user_mentions, [:issue_id], where: 'note_id is null', unique: true, name: 'issue_user_mentions_on_issue_id_index'
- add_index :issue_user_mentions, [:issue_id, :note_id], unique: true, name: 'issue_user_mentions_on_issue_id_and_note_id_index'
- end
-end
diff --git a/db/migrate/20191003150045_create_merge_request_user_mentions.rb b/db/migrate/20191003150045_create_merge_request_user_mentions.rb
deleted file mode 100644
index 0ec45020127..00000000000
--- a/db/migrate/20191003150045_create_merge_request_user_mentions.rb
+++ /dev/null
@@ -1,19 +0,0 @@
-# frozen_string_literal: true
-
-class CreateMergeRequestUserMentions < ActiveRecord::Migration[5.2]
- DOWNTIME = false
-
- def change
- create_table :merge_request_user_mentions do |t|
- t.references :merge_request, type: :integer, index: false, null: false, foreign_key: { on_delete: :cascade }
- t.references :note, type: :integer,
- index: { where: 'note_id IS NOT NULL', unique: true }, null: true, foreign_key: { on_delete: :cascade }
- t.integer :mentioned_users_ids, array: true
- t.integer :mentioned_projects_ids, array: true
- t.integer :mentioned_groups_ids, array: true
- end
-
- add_index :merge_request_user_mentions, [:merge_request_id], where: 'note_id is null', unique: true, name: 'merge_request_user_mentions_on_mr_id_index'
- add_index :merge_request_user_mentions, [:merge_request_id, :note_id], unique: true, name: 'merge_request_user_mentions_on_mr_id_and_note_id_index'
- end
-end
diff --git a/db/migrate/20191003161031_add_mark_for_deletion_to_projects.rb b/db/migrate/20191003161031_add_mark_for_deletion_to_projects.rb
deleted file mode 100644
index 12f17c849aa..00000000000
--- a/db/migrate/20191003161031_add_mark_for_deletion_to_projects.rb
+++ /dev/null
@@ -1,13 +0,0 @@
-# frozen_string_literal: true
-
-class AddMarkForDeletionToProjects < ActiveRecord::Migration[5.2]
- # Set this constant to true if this migration requires downtime.
- DOWNTIME = false
-
- # rubocop:disable Migration/AddColumnsToWideTables
- def change
- add_column :projects, :marked_for_deletion_at, :date
- add_column :projects, :marked_for_deletion_by_user_id, :integer
- end
- # rubocop:enable Migration/AddColumnsToWideTables
-end
diff --git a/db/migrate/20191003161032_add_mark_for_deletion_indexes_to_projects.rb b/db/migrate/20191003161032_add_mark_for_deletion_indexes_to_projects.rb
deleted file mode 100644
index d6ef6509fff..00000000000
--- a/db/migrate/20191003161032_add_mark_for_deletion_indexes_to_projects.rb
+++ /dev/null
@@ -1,19 +0,0 @@
-# frozen_string_literal: true
-
-class AddMarkForDeletionIndexesToProjects < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- add_concurrent_foreign_key :projects, :users, column: :marked_for_deletion_by_user_id, on_delete: :nullify
- add_concurrent_index :projects, :marked_for_deletion_by_user_id, where: 'marked_for_deletion_by_user_id IS NOT NULL'
- end
-
- def down
- remove_foreign_key_if_exists :projects, column: :marked_for_deletion_by_user_id
- remove_concurrent_index :projects, :marked_for_deletion_by_user_id
- end
-end
diff --git a/db/migrate/20191003195218_add_pendo_enabled_to_application_settings.rb b/db/migrate/20191003195218_add_pendo_enabled_to_application_settings.rb
deleted file mode 100644
index 2d937327ca1..00000000000
--- a/db/migrate/20191003195218_add_pendo_enabled_to_application_settings.rb
+++ /dev/null
@@ -1,17 +0,0 @@
-# frozen_string_literal: true
-
-class AddPendoEnabledToApplicationSettings < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- add_column_with_default :application_settings, :pendo_enabled, :boolean, default: false, allow_null: false # rubocop:disable Migration/AddColumnWithDefault
- end
-
- def down
- remove_column :application_settings, :pendo_enabled
- end
-end
diff --git a/db/migrate/20191003195620_add_pendo_url_to_application_settings.rb b/db/migrate/20191003195620_add_pendo_url_to_application_settings.rb
deleted file mode 100644
index cbeb1ef5186..00000000000
--- a/db/migrate/20191003195620_add_pendo_url_to_application_settings.rb
+++ /dev/null
@@ -1,13 +0,0 @@
-# frozen_string_literal: true
-
-class AddPendoUrlToApplicationSettings < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- # rubocop:disable Migration/PreventStrings
- def change
- add_column :application_settings, :pendo_url, :string, limit: 255
- end
- # rubocop:enable Migration/PreventStrings
-end
diff --git a/db/migrate/20191003200045_create_epic_user_mentions.rb b/db/migrate/20191003200045_create_epic_user_mentions.rb
deleted file mode 100644
index 25f9b24f9cc..00000000000
--- a/db/migrate/20191003200045_create_epic_user_mentions.rb
+++ /dev/null
@@ -1,19 +0,0 @@
-# frozen_string_literal: true
-
-class CreateEpicUserMentions < ActiveRecord::Migration[5.2]
- DOWNTIME = false
-
- def change
- create_table :epic_user_mentions do |t|
- t.references :epic, type: :integer, index: false, null: false, foreign_key: { on_delete: :cascade }
- t.references :note, type: :integer,
- index: { where: 'note_id IS NOT NULL', unique: true }, null: true, foreign_key: { on_delete: :cascade }
- t.integer :mentioned_users_ids, array: true
- t.integer :mentioned_projects_ids, array: true
- t.integer :mentioned_groups_ids, array: true
- end
-
- add_index :epic_user_mentions, [:epic_id], where: 'note_id is null', unique: true, name: 'epic_user_mentions_on_epic_id_index'
- add_index :epic_user_mentions, [:epic_id, :note_id], unique: true, name: 'epic_user_mentions_on_epic_id_and_note_id_index'
- end
-end
diff --git a/db/migrate/20191003250045_create_commit_user_mentions.rb b/db/migrate/20191003250045_create_commit_user_mentions.rb
deleted file mode 100644
index 135c115c725..00000000000
--- a/db/migrate/20191003250045_create_commit_user_mentions.rb
+++ /dev/null
@@ -1,18 +0,0 @@
-# frozen_string_literal: true
-
-class CreateCommitUserMentions < ActiveRecord::Migration[5.2]
- DOWNTIME = false
-
- def change
- create_table :commit_user_mentions do |t|
- t.references :note, type: :integer,
- index: { unique: true }, null: false, foreign_key: { on_delete: :cascade }
- t.binary :commit_id, null: false
- t.integer :mentioned_users_ids, array: true
- t.integer :mentioned_projects_ids, array: true
- t.integer :mentioned_groups_ids, array: true
- end
-
- add_index :commit_user_mentions, [:commit_id, :note_id], name: 'commit_user_mentions_on_commit_id_and_note_id_index'
- end
-end
diff --git a/db/migrate/20191003300045_create_snippet_user_mentions.rb b/db/migrate/20191003300045_create_snippet_user_mentions.rb
deleted file mode 100644
index fb7681d6e33..00000000000
--- a/db/migrate/20191003300045_create_snippet_user_mentions.rb
+++ /dev/null
@@ -1,19 +0,0 @@
-# frozen_string_literal: true
-
-class CreateSnippetUserMentions < ActiveRecord::Migration[5.2]
- DOWNTIME = false
-
- def change
- create_table :snippet_user_mentions do |t|
- t.references :snippet, type: :integer, index: false, null: false, foreign_key: { on_delete: :cascade }
- t.references :note, type: :integer,
- index: { where: 'note_id IS NOT NULL', unique: true }, null: true, foreign_key: { on_delete: :cascade }
- t.integer :mentioned_users_ids, array: true
- t.integer :mentioned_projects_ids, array: true
- t.integer :mentioned_groups_ids, array: true
- end
-
- add_index :snippet_user_mentions, [:snippet_id], where: 'note_id is null', unique: true, name: 'snippet_user_mentions_on_snippet_id_index'
- add_index :snippet_user_mentions, [:snippet_id, :note_id], unique: true, name: 'snippet_user_mentions_on_snippet_id_and_note_id_index'
- end
-end
diff --git a/db/migrate/20191003350045_create_design_user_mentions.rb b/db/migrate/20191003350045_create_design_user_mentions.rb
deleted file mode 100644
index 149ee5bd124..00000000000
--- a/db/migrate/20191003350045_create_design_user_mentions.rb
+++ /dev/null
@@ -1,19 +0,0 @@
-# frozen_string_literal: true
-
-class CreateDesignUserMentions < ActiveRecord::Migration[5.2]
- DOWNTIME = false
-
- def change
- create_table :design_user_mentions do |t|
- t.references :design, type: :integer, index: false, null: false,
- foreign_key: { to_table: :design_management_designs, column: :design_id, on_delete: :cascade }
- t.references :note, type: :integer,
- index: { unique: true }, null: false, foreign_key: { on_delete: :cascade }
- t.integer :mentioned_users_ids, array: true
- t.integer :mentioned_projects_ids, array: true
- t.integer :mentioned_groups_ids, array: true
- end
-
- add_index :design_user_mentions, [:design_id, :note_id], name: 'design_user_mentions_on_design_id_and_note_id_index'
- end
-end
diff --git a/db/migrate/20191004080818_add_productivity_analytics_start_date.rb b/db/migrate/20191004080818_add_productivity_analytics_start_date.rb
deleted file mode 100644
index 287b0755bc1..00000000000
--- a/db/migrate/20191004080818_add_productivity_analytics_start_date.rb
+++ /dev/null
@@ -1,11 +0,0 @@
-# frozen_string_literal: true
-
-class AddProductivityAnalyticsStartDate < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- def change
- add_column :application_settings, :productivity_analytics_start_date, :datetime_with_timezone
- end
-end
diff --git a/db/migrate/20191004081520_fill_productivity_analytics_start_date.rb b/db/migrate/20191004081520_fill_productivity_analytics_start_date.rb
deleted file mode 100644
index 9432cd68708..00000000000
--- a/db/migrate/20191004081520_fill_productivity_analytics_start_date.rb
+++ /dev/null
@@ -1,31 +0,0 @@
-# frozen_string_literal: true
-
-# Expected migration duration: 1 minute
-class FillProductivityAnalyticsStartDate < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- add_concurrent_index :merge_request_metrics, :merged_at,
- where: "merged_at > '2019-09-01' AND commits_count IS NOT NULL",
- name: 'fill_productivity_analytics_start_date_tmp_index'
-
- execute(
- <<SQL
- UPDATE application_settings
- SET productivity_analytics_start_date = COALESCE((SELECT MIN(merged_at) FROM merge_request_metrics
- WHERE merged_at > '2019-09-01' AND commits_count IS NOT NULL), NOW())
-SQL
- )
-
- remove_concurrent_index :merge_request_metrics, :merged_at,
- name: 'fill_productivity_analytics_start_date_tmp_index'
- end
-
- def down
- execute('UPDATE application_settings SET productivity_analytics_start_date = NULL')
- end
-end
diff --git a/db/migrate/20191004133612_create_analytics_repository_file_commits.rb b/db/migrate/20191004133612_create_analytics_repository_file_commits.rb
deleted file mode 100644
index f2064b2b301..00000000000
--- a/db/migrate/20191004133612_create_analytics_repository_file_commits.rb
+++ /dev/null
@@ -1,19 +0,0 @@
-# frozen_string_literal: true
-
-class CreateAnalyticsRepositoryFileCommits < ActiveRecord::Migration[5.2]
- DOWNTIME = false
-
- def change
- create_table :analytics_repository_file_commits do |t|
- t.references :analytics_repository_file, index: { name: 'index_analytics_repository_file_commits_file_id' }, foreign_key: { on_delete: :cascade }, null: false
- t.references :project, index: false, foreign_key: { on_delete: :cascade }, null: false
- t.date :committed_date, null: false
- t.integer :commit_count, limit: 2, null: false
- end
-
- add_index :analytics_repository_file_commits,
- [:project_id, :committed_date, :analytics_repository_file_id],
- name: 'index_file_commits_on_committed_date_file_id_and_project_id',
- unique: true
- end
-end
diff --git a/db/migrate/20191004151428_add_auto_stop_in_to_environments.rb b/db/migrate/20191004151428_add_auto_stop_in_to_environments.rb
deleted file mode 100644
index 860e52d420c..00000000000
--- a/db/migrate/20191004151428_add_auto_stop_in_to_environments.rb
+++ /dev/null
@@ -1,9 +0,0 @@
-# frozen_string_literal: true
-
-class AddAutoStopInToEnvironments < ActiveRecord::Migration[5.2]
- DOWNTIME = false
-
- def change
- add_column :environments, :auto_stop_at, :datetime_with_timezone
- end
-end
diff --git a/db/migrate/20191008013056_add_push_event_activities_limit_to_application_settings.rb b/db/migrate/20191008013056_add_push_event_activities_limit_to_application_settings.rb
deleted file mode 100644
index af206bcb8d0..00000000000
--- a/db/migrate/20191008013056_add_push_event_activities_limit_to_application_settings.rb
+++ /dev/null
@@ -1,17 +0,0 @@
-# frozen_string_literal: true
-
-class AddPushEventActivitiesLimitToApplicationSettings < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- add_column_with_default(:application_settings, :push_event_activities_limit, :integer, default: 3) # rubocop:disable Migration/AddColumnWithDefault
- end
-
- def down
- remove_column(:application_settings, :push_event_activities_limit)
- end
-end
diff --git a/db/migrate/20191008142331_add_ref_count_to_push_event_payloads.rb b/db/migrate/20191008142331_add_ref_count_to_push_event_payloads.rb
deleted file mode 100644
index 72621971dbb..00000000000
--- a/db/migrate/20191008142331_add_ref_count_to_push_event_payloads.rb
+++ /dev/null
@@ -1,11 +0,0 @@
-# frozen_string_literal: true
-
-class AddRefCountToPushEventPayloads < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- def change
- add_column :push_event_payloads, :ref_count, :integer
- end
-end
diff --git a/db/migrate/20191008180203_add_issuable_state_id_indexes.rb b/db/migrate/20191008180203_add_issuable_state_id_indexes.rb
deleted file mode 100644
index a9a8b8b6359..00000000000
--- a/db/migrate/20191008180203_add_issuable_state_id_indexes.rb
+++ /dev/null
@@ -1,75 +0,0 @@
-# frozen_string_literal: true
-
-class AddIssuableStateIdIndexes < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- # Creates the same indexes that are currently using state:string column
- # for issues and merge_requests tables
- create_indexes_for_issues
- create_indexes_for_merge_requests
- end
-
- def down
- # Removes indexes for issues
- remove_concurrent_index_by_name :issues, 'idx_issues_on_state_id'
- remove_concurrent_index_by_name :issues, 'idx_issues_on_project_id_and_created_at_and_id_and_state_id'
- remove_concurrent_index_by_name :issues, 'idx_issues_on_project_id_and_due_date_and_id_and_state_id'
- remove_concurrent_index_by_name :issues, 'idx_issues_on_project_id_and_rel_position_and_state_id_and_id'
- remove_concurrent_index_by_name :issues, 'idx_issues_on_project_id_and_updated_at_and_id_and_state_id'
-
- # Removes indexes from merge_requests
- remove_concurrent_index_by_name :merge_requests, 'idx_merge_requests_on_id_and_merge_jid'
- remove_concurrent_index_by_name :merge_requests, 'idx_merge_requests_on_source_project_and_branch_state_opened'
- remove_concurrent_index_by_name :merge_requests, 'idx_merge_requests_on_state_id_and_merge_status'
- remove_concurrent_index_by_name :merge_requests, 'idx_merge_requests_on_target_project_id_and_iid_opened'
- end
-
- def create_indexes_for_issues
- add_concurrent_index :issues, :state_id, name: 'idx_issues_on_state_id'
-
- add_concurrent_index :issues,
- [:project_id, :created_at, :id, :state_id],
- name: 'idx_issues_on_project_id_and_created_at_and_id_and_state_id'
-
- add_concurrent_index :issues,
- [:project_id, :due_date, :id, :state_id],
- where: 'due_date IS NOT NULL',
- name: 'idx_issues_on_project_id_and_due_date_and_id_and_state_id'
-
- add_concurrent_index :issues,
- [:project_id, :relative_position, :state_id, :id],
- order: { id: :desc },
- name: 'idx_issues_on_project_id_and_rel_position_and_state_id_and_id'
-
- add_concurrent_index :issues,
- [:project_id, :updated_at, :id, :state_id],
- name: 'idx_issues_on_project_id_and_updated_at_and_id_and_state_id'
- end
-
- def create_indexes_for_merge_requests
- add_concurrent_index :merge_requests,
- [:id, :merge_jid],
- where: 'merge_jid IS NOT NULL and state_id = 4',
- name: 'idx_merge_requests_on_id_and_merge_jid'
-
- add_concurrent_index :merge_requests,
- [:source_project_id, :source_branch],
- where: 'state_id = 1',
- name: 'idx_merge_requests_on_source_project_and_branch_state_opened'
-
- add_concurrent_index :merge_requests,
- [:state_id, :merge_status],
- where: "state_id = 1 AND merge_status = 'can_be_merged'",
- name: 'idx_merge_requests_on_state_id_and_merge_status'
-
- add_concurrent_index :merge_requests,
- [:target_project_id, :iid],
- where: 'state_id = 1',
- name: 'idx_merge_requests_on_target_project_id_and_iid_opened'
- end
-end
diff --git a/db/migrate/20191008200204_add_state_id_default_value.rb b/db/migrate/20191008200204_add_state_id_default_value.rb
deleted file mode 100644
index 15a80163ca8..00000000000
--- a/db/migrate/20191008200204_add_state_id_default_value.rb
+++ /dev/null
@@ -1,24 +0,0 @@
-# frozen_string_literal: true
-
-# See http://doc.gitlab.com/ce/development/migration_style_guide.html
-# for more information on how to write migrations for GitLab.
-
-class AddStateIdDefaultValue < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- def up
- change_column_default :issues, :state_id, 1
- change_column_null :issues, :state_id, false
- change_column_default :merge_requests, :state_id, 1
- change_column_null :merge_requests, :state_id, false
- end
-
- def down
- change_column_default :issues, :state_id, nil
- change_column_null :issues, :state_id, true
- change_column_default :merge_requests, :state_id, nil
- change_column_null :merge_requests, :state_id, true
- end
-end
diff --git a/db/migrate/20191009100244_add_geo_design_repository_counters.rb b/db/migrate/20191009100244_add_geo_design_repository_counters.rb
deleted file mode 100644
index 26387453f88..00000000000
--- a/db/migrate/20191009100244_add_geo_design_repository_counters.rb
+++ /dev/null
@@ -1,16 +0,0 @@
-# frozen_string_literal: true
-
-class AddGeoDesignRepositoryCounters < ActiveRecord::Migration[5.1]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- def change
- change_table :geo_node_statuses do |t|
- t.column :design_repositories_count, :integer
- t.column :design_repositories_synced_count, :integer
- t.column :design_repositories_failed_count, :integer
- t.column :design_repositories_registry_count, :integer
- end
- end
-end
diff --git a/db/migrate/20191009110124_add_has_exposed_artifacts_to_ci_builds_metadata.rb b/db/migrate/20191009110124_add_has_exposed_artifacts_to_ci_builds_metadata.rb
deleted file mode 100644
index 86c3c540e5e..00000000000
--- a/db/migrate/20191009110124_add_has_exposed_artifacts_to_ci_builds_metadata.rb
+++ /dev/null
@@ -1,13 +0,0 @@
-# frozen_string_literal: true
-
-class AddHasExposedArtifactsToCiBuildsMetadata < ActiveRecord::Migration[5.2]
- DOWNTIME = false
-
- def up
- add_column :ci_builds_metadata, :has_exposed_artifacts, :boolean
- end
-
- def down
- remove_column :ci_builds_metadata, :has_exposed_artifacts
- end
-end
diff --git a/db/migrate/20191009110757_add_index_to_ci_builds_metadata_has_exposed_artifacts.rb b/db/migrate/20191009110757_add_index_to_ci_builds_metadata_has_exposed_artifacts.rb
deleted file mode 100644
index 6b8c452a62a..00000000000
--- a/db/migrate/20191009110757_add_index_to_ci_builds_metadata_has_exposed_artifacts.rb
+++ /dev/null
@@ -1,17 +0,0 @@
-# frozen_string_literal: true
-
-class AddIndexToCiBuildsMetadataHasExposedArtifacts < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- add_concurrent_index :ci_builds_metadata, [:build_id], where: "has_exposed_artifacts IS TRUE", name: 'index_ci_builds_metadata_on_build_id_and_has_exposed_artifacts'
- end
-
- def down
- remove_concurrent_index_by_name :ci_builds_metadata, 'index_ci_builds_metadata_on_build_id_and_has_exposed_artifacts'
- end
-end
diff --git a/db/migrate/20191009222222_add_custom_http_clone_url_root_to_application_settings.rb b/db/migrate/20191009222222_add_custom_http_clone_url_root_to_application_settings.rb
deleted file mode 100644
index 41876ee2cdf..00000000000
--- a/db/migrate/20191009222222_add_custom_http_clone_url_root_to_application_settings.rb
+++ /dev/null
@@ -1,15 +0,0 @@
-# frozen_string_literal: true
-
-# See http://doc.gitlab.com/ce/development/migration_style_guide.html
-# for more information on how to write migrations for GitLab.
-
-class AddCustomHttpCloneUrlRootToApplicationSettings < ActiveRecord::Migration[5.2]
- # Set this constant to true if this migration requires downtime.
- DOWNTIME = false
-
- # rubocop:disable Migration/PreventStrings
- def change
- add_column :application_settings, :custom_http_clone_url_root, :string, limit: 511
- end
- # rubocop:enable Migration/PreventStrings
-end
diff --git a/db/migrate/20191010174846_add_snowplow_iglu_registry_url_to_application_settings.rb b/db/migrate/20191010174846_add_snowplow_iglu_registry_url_to_application_settings.rb
deleted file mode 100644
index 8f882bcaa50..00000000000
--- a/db/migrate/20191010174846_add_snowplow_iglu_registry_url_to_application_settings.rb
+++ /dev/null
@@ -1,11 +0,0 @@
-# frozen_string_literal: true
-
-class AddSnowplowIgluRegistryUrlToApplicationSettings < ActiveRecord::Migration[5.2]
- DOWNTIME = false
-
- # rubocop:disable Migration/PreventStrings
- def change
- add_column :application_settings, :snowplow_iglu_registry_url, :string, limit: 255
- end
- # rubocop:enable Migration/PreventStrings
-end
diff --git a/db/migrate/20191011084019_add_project_deletion_adjourned_period_to_application_settings.rb b/db/migrate/20191011084019_add_project_deletion_adjourned_period_to_application_settings.rb
deleted file mode 100644
index 79546e33253..00000000000
--- a/db/migrate/20191011084019_add_project_deletion_adjourned_period_to_application_settings.rb
+++ /dev/null
@@ -1,11 +0,0 @@
-# frozen_string_literal: true
-
-class AddProjectDeletionAdjournedPeriodToApplicationSettings < ActiveRecord::Migration[5.2]
- DOWNTIME = false
-
- DEFAULT_NUMBER_OF_DAYS_BEFORE_REMOVAL = 7
-
- def change
- add_column :application_settings, :deletion_adjourned_period, :integer, default: DEFAULT_NUMBER_OF_DAYS_BEFORE_REMOVAL, null: false
- end
-end
diff --git a/db/migrate/20191013100213_add_squash_commit_sha_to_merge_requests.rb b/db/migrate/20191013100213_add_squash_commit_sha_to_merge_requests.rb
deleted file mode 100644
index 0a58f0a89aa..00000000000
--- a/db/migrate/20191013100213_add_squash_commit_sha_to_merge_requests.rb
+++ /dev/null
@@ -1,9 +0,0 @@
-# frozen_string_literal: true
-
-class AddSquashCommitShaToMergeRequests < ActiveRecord::Migration[5.2]
- DOWNTIME = false
-
- def change
- add_column :merge_requests, :squash_commit_sha, :binary
- end
-end
diff --git a/db/migrate/20191014025629_rename_design_management_version_user_to_author.rb b/db/migrate/20191014025629_rename_design_management_version_user_to_author.rb
deleted file mode 100644
index 2359cc2e826..00000000000
--- a/db/migrate/20191014025629_rename_design_management_version_user_to_author.rb
+++ /dev/null
@@ -1,17 +0,0 @@
-# frozen_string_literal: true
-
-class RenameDesignManagementVersionUserToAuthor < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- rename_column_concurrently :design_management_versions, :user_id, :author_id
- end
-
- def down
- undo_rename_column_concurrently :design_management_versions, :user_id, :author_id
- end
-end
diff --git a/db/migrate/20191014030730_add_author_index_to_design_management_versions.rb b/db/migrate/20191014030730_add_author_index_to_design_management_versions.rb
deleted file mode 100644
index 30e076f1fe6..00000000000
--- a/db/migrate/20191014030730_add_author_index_to_design_management_versions.rb
+++ /dev/null
@@ -1,17 +0,0 @@
-# frozen_string_literal: true
-
-class AddAuthorIndexToDesignManagementVersions < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- add_concurrent_index :design_management_versions, :author_id, where: 'author_id IS NOT NULL'
- end
-
- def down
- remove_concurrent_index :design_management_versions, :author_id
- end
-end
diff --git a/db/migrate/20191014084150_add_index_on_snippets_project_id_and_visibility_level.rb b/db/migrate/20191014084150_add_index_on_snippets_project_id_and_visibility_level.rb
deleted file mode 100644
index a8f40953e5d..00000000000
--- a/db/migrate/20191014084150_add_index_on_snippets_project_id_and_visibility_level.rb
+++ /dev/null
@@ -1,17 +0,0 @@
-# frozen_string_literal: true
-
-class AddIndexOnSnippetsProjectIdAndVisibilityLevel < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- add_concurrent_index :snippets, [:project_id, :visibility_level]
- end
-
- def down
- remove_concurrent_index :snippets, [:project_id, :visibility_level]
- end
-end
diff --git a/db/migrate/20191014123159_add_expire_notification_delivered_to_personal_access_tokens.rb b/db/migrate/20191014123159_add_expire_notification_delivered_to_personal_access_tokens.rb
deleted file mode 100644
index 41a81e3ac87..00000000000
--- a/db/migrate/20191014123159_add_expire_notification_delivered_to_personal_access_tokens.rb
+++ /dev/null
@@ -1,17 +0,0 @@
-# frozen_string_literal: true
-
-class AddExpireNotificationDeliveredToPersonalAccessTokens < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- add_column_with_default :personal_access_tokens, :expire_notification_delivered, :boolean, default: false # rubocop:disable Migration/AddColumnWithDefault
- end
-
- def down
- remove_column :personal_access_tokens, :expire_notification_delivered
- end
-end
diff --git a/db/migrate/20191014132931_remove_index_on_snippets_project_id.rb b/db/migrate/20191014132931_remove_index_on_snippets_project_id.rb
deleted file mode 100644
index 850112b4f0b..00000000000
--- a/db/migrate/20191014132931_remove_index_on_snippets_project_id.rb
+++ /dev/null
@@ -1,20 +0,0 @@
-# frozen_string_literal: true
-
-class RemoveIndexOnSnippetsProjectId < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- remove_concurrent_index_by_name :snippets, 'index_snippets_on_project_id'
-
- # This is an extra index that is not present in db/schema.rb but known to exist on some installs
- remove_concurrent_index_by_name :snippets, :snippets_project_id_idx if index_exists_by_name? :snippets, :snippets_project_id_idx
- end
-
- def down
- add_concurrent_index :snippets, [:project_id], name: 'index_snippets_on_project_id'
- end
-end
diff --git a/db/migrate/20191016072826_replace_ci_trigger_requests_index.rb b/db/migrate/20191016072826_replace_ci_trigger_requests_index.rb
deleted file mode 100644
index 8faa6c3847f..00000000000
--- a/db/migrate/20191016072826_replace_ci_trigger_requests_index.rb
+++ /dev/null
@@ -1,32 +0,0 @@
-# frozen_string_literal: true
-
-class ReplaceCiTriggerRequestsIndex < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- add_concurrent_index :ci_trigger_requests, [:trigger_id, :id], order: { id: :desc }
-
- # Some installations have legacy, duplicate indexes on
- # ci_trigger_requests.trigger_id. Rails won't drop them without an
- # explicit name: https://gitlab.com/gitlab-org/gitlab/issues/34818
- old_index_names.each do |name|
- remove_concurrent_index :ci_trigger_requests, [:trigger_id], name: name
- end
- end
-
- def down
- add_concurrent_index :ci_trigger_requests, [:trigger_id]
-
- remove_concurrent_index :ci_trigger_requests, [:trigger_id, :id], order: { id: :desc }
- end
-
- private
-
- def old_index_names
- indexes(:ci_trigger_requests).select { |i| i.columns == ['trigger_id'] }.map(&:name)
- end
-end
diff --git a/db/migrate/20191016133352_create_ci_subscriptions_projects.rb b/db/migrate/20191016133352_create_ci_subscriptions_projects.rb
deleted file mode 100644
index 00ab2c19193..00000000000
--- a/db/migrate/20191016133352_create_ci_subscriptions_projects.rb
+++ /dev/null
@@ -1,21 +0,0 @@
-# frozen_string_literal: true
-
-# See http://doc.gitlab.com/ce/development/migration_style_guide.html
-# for more information on how to write migrations for GitLab.
-
-class CreateCiSubscriptionsProjects < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- # Set this constant to true if this migration requires downtime.
- DOWNTIME = false
-
- def change
- create_table :ci_subscriptions_projects do |t|
- t.references :downstream_project, null: false, index: false, foreign_key: { to_table: :projects, on_delete: :cascade }
- t.references :upstream_project, null: false, foreign_key: { to_table: :projects, on_delete: :cascade }
- end
-
- add_index :ci_subscriptions_projects, [:downstream_project_id, :upstream_project_id],
- unique: true, name: 'index_ci_subscriptions_projects_unique_subscription'
- end
-end
diff --git a/db/migrate/20191016220135_add_join_table_for_self_managed_prometheus_alert_issues.rb b/db/migrate/20191016220135_add_join_table_for_self_managed_prometheus_alert_issues.rb
deleted file mode 100644
index 68b448f8836..00000000000
--- a/db/migrate/20191016220135_add_join_table_for_self_managed_prometheus_alert_issues.rb
+++ /dev/null
@@ -1,22 +0,0 @@
-# frozen_string_literal: true
-
-class AddJoinTableForSelfManagedPrometheusAlertIssues < ActiveRecord::Migration[5.2]
- # Set this constant to true if this migration requires downtime.
- DOWNTIME = false
-
- def change
- # Join table to Issues
- create_table :issues_self_managed_prometheus_alert_events, id: false do |t|
- t.references :issue, null: false,
- index: false, # Uses the index below
- foreign_key: { on_delete: :cascade }
- t.references :self_managed_prometheus_alert_event, null: false,
- index: { name: 'issue_id_issues_self_managed_rometheus_alert_events_index' },
- foreign_key: { on_delete: :cascade }
-
- t.timestamps_with_timezone
- t.index [:issue_id, :self_managed_prometheus_alert_event_id],
- unique: true, name: 'issue_id_self_managed_prometheus_alert_event_id_index'
- end
- end
-end
diff --git a/db/migrate/20191017001326_create_users_security_dashboard_projects.rb b/db/migrate/20191017001326_create_users_security_dashboard_projects.rb
deleted file mode 100644
index 398401dbee6..00000000000
--- a/db/migrate/20191017001326_create_users_security_dashboard_projects.rb
+++ /dev/null
@@ -1,15 +0,0 @@
-# frozen_string_literal: true
-
-class CreateUsersSecurityDashboardProjects < ActiveRecord::Migration[5.2]
- DOWNTIME = false
- INDEX_NAME = 'users_security_dashboard_projects_unique_index'
-
- def change
- create_table :users_security_dashboard_projects, id: false do |t|
- t.references :user, null: false, foreign_key: { on_delete: :cascade }
- t.references :project, null: false, index: false, foreign_key: { on_delete: :cascade }
- end
-
- add_index :users_security_dashboard_projects, [:project_id, :user_id], name: INDEX_NAME, unique: true
- end
-end
diff --git a/db/migrate/20191017094449_add_remove_source_branch_after_merge_to_projects.rb b/db/migrate/20191017094449_add_remove_source_branch_after_merge_to_projects.rb
deleted file mode 100644
index d4f84b066a3..00000000000
--- a/db/migrate/20191017094449_add_remove_source_branch_after_merge_to_projects.rb
+++ /dev/null
@@ -1,17 +0,0 @@
-# frozen_string_literal: true
-
-# See http://doc.gitlab.com/ce/development/migration_style_guide.html
-# for more information on how to write migrations for GitLab.
-
-class AddRemoveSourceBranchAfterMergeToProjects < ActiveRecord::Migration[5.1]
- # Set this constant to true if this migration requires downtime.
- DOWNTIME = false
-
- def up
- add_column :projects, :remove_source_branch_after_merge, :boolean # rubocop:disable Migration/AddColumnsToWideTables
- end
-
- def down
- remove_column :projects, :remove_source_branch_after_merge
- end
-end
diff --git a/db/migrate/20191017134513_add_deployment_merge_requests.rb b/db/migrate/20191017134513_add_deployment_merge_requests.rb
deleted file mode 100644
index dbe09463d22..00000000000
--- a/db/migrate/20191017134513_add_deployment_merge_requests.rb
+++ /dev/null
@@ -1,33 +0,0 @@
-# frozen_string_literal: true
-
-class AddDeploymentMergeRequests < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- def change
- create_table :deployment_merge_requests, id: false do |t|
- t.references(
- :deployment,
- foreign_key: { on_delete: :cascade },
- type: :integer,
- index: false,
- null: false
- )
-
- t.references(
- :merge_request,
- foreign_key: { on_delete: :cascade },
- type: :integer,
- index: true,
- null: false
- )
-
- t.index(
- [:deployment_id, :merge_request_id],
- unique: true,
- name: 'idx_deployment_merge_requests_unique_index'
- )
- end
- end
-end
diff --git a/db/migrate/20191017191341_create_clusters_applications_crossplane.rb b/db/migrate/20191017191341_create_clusters_applications_crossplane.rb
deleted file mode 100644
index 42f980ed99d..00000000000
--- a/db/migrate/20191017191341_create_clusters_applications_crossplane.rb
+++ /dev/null
@@ -1,21 +0,0 @@
-# frozen_string_literal: true
-
-class CreateClustersApplicationsCrossplane < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- # rubocop:disable Migration/PreventStrings
- def change
- create_table :clusters_applications_crossplane do |t|
- t.timestamps_with_timezone null: false
- t.references :cluster, null: false, index: false, foreign_key: { on_delete: :cascade }
- t.integer :status, null: false
- t.string :version, null: false, limit: 255
- t.string :stack, null: false, limit: 255
- t.text :status_reason # rubocop:disable Migration/AddLimitToTextColumns
- t.index :cluster_id, unique: true
- end
- end
- # rubocop:enable Migration/PreventStrings
-end
diff --git a/db/migrate/20191023093207_add_comment_actions_to_services.rb b/db/migrate/20191023093207_add_comment_actions_to_services.rb
deleted file mode 100644
index 46d4bdf9500..00000000000
--- a/db/migrate/20191023093207_add_comment_actions_to_services.rb
+++ /dev/null
@@ -1,21 +0,0 @@
-# frozen_string_literal: true
-
-class AddCommentActionsToServices < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- # rubocop:disable Migration/AddColumnWithDefault
- # rubocop:disable Migration/UpdateLargeTable
- def up
- add_column_with_default(:services, :comment_on_event_enabled, :boolean, default: true)
- end
- # rubocop:enable Migration/AddColumnWithDefault
- # rubocop:enable Migration/UpdateLargeTable
-
- def down
- remove_column(:services, :comment_on_event_enabled)
- end
-end
diff --git a/db/migrate/20191023132005_add_merge_requests_index_on_target_project_and_branch.rb b/db/migrate/20191023132005_add_merge_requests_index_on_target_project_and_branch.rb
deleted file mode 100644
index a3de3f34c44..00000000000
--- a/db/migrate/20191023132005_add_merge_requests_index_on_target_project_and_branch.rb
+++ /dev/null
@@ -1,19 +0,0 @@
-# frozen_string_literal: true
-
-class AddMergeRequestsIndexOnTargetProjectAndBranch < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- # Set this constant to true if this migration requires downtime.
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- add_concurrent_index :merge_requests, [:target_project_id, :target_branch],
- where: "state_id = 1 AND merge_when_pipeline_succeeds = true"
- end
-
- def down
- remove_concurrent_index :merge_requests, [:target_project_id, :target_branch]
- end
-end
diff --git a/db/migrate/20191023152913_add_default_and_free_plans.rb b/db/migrate/20191023152913_add_default_and_free_plans.rb
deleted file mode 100644
index 4f5f8000386..00000000000
--- a/db/migrate/20191023152913_add_default_and_free_plans.rb
+++ /dev/null
@@ -1,29 +0,0 @@
-# frozen_string_literal: true
-
-class AddDefaultAndFreePlans < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- class Plan < ApplicationRecord
- end
-
- def up
- plan_names.each do |plan_name|
- Plan.create_with(title: plan_name.titleize).find_or_create_by(name: plan_name)
- end
- end
-
- def down
- Plan.where(name: plan_names).delete_all
- end
-
- private
-
- def plan_names
- [
- ('free' if Gitlab.com?),
- 'default'
- ].compact
- end
-end
diff --git a/db/migrate/20191024134020_add_index_to_zoom_meetings.rb b/db/migrate/20191024134020_add_index_to_zoom_meetings.rb
deleted file mode 100644
index ef3657b6a5e..00000000000
--- a/db/migrate/20191024134020_add_index_to_zoom_meetings.rb
+++ /dev/null
@@ -1,17 +0,0 @@
-# frozen_string_literal: true
-
-class AddIndexToZoomMeetings < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- add_concurrent_index :zoom_meetings, :issue_status
- end
-
- def down
- remove_concurrent_index :zoom_meetings, :issue_status if index_exists?(:zoom_meetings, :issue_status)
- end
-end
diff --git a/db/migrate/20191025092748_add_secret_token_to_snippet.rb b/db/migrate/20191025092748_add_secret_token_to_snippet.rb
deleted file mode 100644
index c43c1fbe2b7..00000000000
--- a/db/migrate/20191025092748_add_secret_token_to_snippet.rb
+++ /dev/null
@@ -1,12 +0,0 @@
-# frozen_string_literal: true
-
-class AddSecretTokenToSnippet < ActiveRecord::Migration[5.2]
- DOWNTIME = false
-
- # rubocop:disable Migration/PreventStrings
- def change
- add_column :snippets, :encrypted_secret_token, :string, limit: 255
- add_column :snippets, :encrypted_secret_token_iv, :string, limit: 255
- end
- # rubocop:enable Migration/PreventStrings
-end
diff --git a/db/migrate/20191026041447_change_default_value_of_throttle_protected_paths.rb b/db/migrate/20191026041447_change_default_value_of_throttle_protected_paths.rb
deleted file mode 100644
index dd79fb217ef..00000000000
--- a/db/migrate/20191026041447_change_default_value_of_throttle_protected_paths.rb
+++ /dev/null
@@ -1,38 +0,0 @@
-# frozen_string_literal: true
-
-class ChangeDefaultValueOfThrottleProtectedPaths < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- def up
- change_column_default :application_settings, :throttle_protected_paths_enabled, false
-
- # Because we already set the value to true in the previous
- # migration, this feature was switched on inadvertently in GitLab
- # 12.4. This migration toggles it back off to ensure we don't
- # inadvertently block legitimate users. The admin will have to
- # re-enable it in the application settings.
- unless omnibus_protected_paths_present?
- execute "UPDATE application_settings SET throttle_protected_paths_enabled = #{false_value}"
- end
- end
-
- def down
- change_column_default :application_settings, :throttle_protected_paths_enabled, true
-
- execute "UPDATE application_settings SET throttle_protected_paths_enabled = #{true_value}"
- end
-
- private
-
- def omnibus_protected_paths_present?
- Rack::Attack.throttles.key?('protected paths')
- rescue e
- say "Error while checking if Omnibus protected paths were already enabled: #{e.message}"
- say 'Continuing. Protected paths will remain enabled.'
-
- # Return true so we don't take a risk
- true
- end
-end
diff --git a/db/migrate/20191026120008_add_promoted_to_epic_to_issues.rb b/db/migrate/20191026120008_add_promoted_to_epic_to_issues.rb
deleted file mode 100644
index 158dbf69bcc..00000000000
--- a/db/migrate/20191026120008_add_promoted_to_epic_to_issues.rb
+++ /dev/null
@@ -1,16 +0,0 @@
-# frozen_string_literal: true
-
-# See http://doc.gitlab.com/ce/development/migration_style_guide.html
-# for more information on how to write migrations for GitLab.
-
-class AddPromotedToEpicToIssues < ActiveRecord::Migration[5.2]
- DOWNTIME = false
-
- def up
- add_column :issues, :promoted_to_epic_id, :integer
- end
-
- def down
- remove_column :issues, :promoted_to_epic_id
- end
-end
diff --git a/db/migrate/20191026120112_add_promoted_to_epic_to_issues_index.rb b/db/migrate/20191026120112_add_promoted_to_epic_to_issues_index.rb
deleted file mode 100644
index 649c2f7abe5..00000000000
--- a/db/migrate/20191026120112_add_promoted_to_epic_to_issues_index.rb
+++ /dev/null
@@ -1,22 +0,0 @@
-# frozen_string_literal: true
-
-# See http://doc.gitlab.com/ce/development/migration_style_guide.html
-# for more information on how to write migrations for GitLab.
-
-class AddPromotedToEpicToIssuesIndex < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- add_concurrent_foreign_key :issues, :epics, column: :promoted_to_epic_id, on_delete: :nullify
- add_concurrent_index :issues, :promoted_to_epic_id, where: 'promoted_to_epic_id IS NOT NULL'
- end
-
- def down
- remove_concurrent_index(:issues, :promoted_to_epic_id)
- remove_foreign_key :issues, column: :promoted_to_epic_id
- end
-end
diff --git a/db/migrate/20191026124116_set_application_settings_default_project_and_snippet_visibility.rb b/db/migrate/20191026124116_set_application_settings_default_project_and_snippet_visibility.rb
deleted file mode 100644
index 9d19279510a..00000000000
--- a/db/migrate/20191026124116_set_application_settings_default_project_and_snippet_visibility.rb
+++ /dev/null
@@ -1,15 +0,0 @@
-# frozen_string_literal: true
-
-class SetApplicationSettingsDefaultProjectAndSnippetVisibility < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- def change
- change_column_null :application_settings, :default_project_visibility, false, 0
- change_column_default :application_settings, :default_project_visibility, from: nil, to: 0
-
- change_column_null :application_settings, :default_snippet_visibility, false, 0
- change_column_default :application_settings, :default_snippet_visibility, from: nil, to: 0
- end
-end
diff --git a/db/migrate/20191028130054_add_max_issue_weight_to_list.rb b/db/migrate/20191028130054_add_max_issue_weight_to_list.rb
deleted file mode 100644
index f15b65067f6..00000000000
--- a/db/migrate/20191028130054_add_max_issue_weight_to_list.rb
+++ /dev/null
@@ -1,17 +0,0 @@
-# frozen_string_literal: true
-
-class AddMaxIssueWeightToList < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- disable_ddl_transaction!
-
- DOWNTIME = false
-
- def up
- add_column_with_default :lists, :max_issue_weight, :integer, default: 0 # rubocop:disable Migration/AddColumnWithDefault
- end
-
- def down
- remove_column :lists, :max_issue_weight
- end
-end
diff --git a/db/migrate/20191028162543_add_setup_for_company_to_user_preferences.rb b/db/migrate/20191028162543_add_setup_for_company_to_user_preferences.rb
deleted file mode 100644
index 18a8a2306e2..00000000000
--- a/db/migrate/20191028162543_add_setup_for_company_to_user_preferences.rb
+++ /dev/null
@@ -1,9 +0,0 @@
-# frozen_string_literal: true
-
-class AddSetupForCompanyToUserPreferences < ActiveRecord::Migration[5.2]
- DOWNTIME = false
-
- def change
- add_column :user_preferences, :setup_for_company, :boolean
- end
-end
diff --git a/db/migrate/20191028184740_rename_snowplow_site_id_to_snowplow_app_id.rb b/db/migrate/20191028184740_rename_snowplow_site_id_to_snowplow_app_id.rb
deleted file mode 100644
index 4e3b2da670e..00000000000
--- a/db/migrate/20191028184740_rename_snowplow_site_id_to_snowplow_app_id.rb
+++ /dev/null
@@ -1,17 +0,0 @@
-# frozen_string_literal: true
-
-class RenameSnowplowSiteIdToSnowplowAppId < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- rename_column_concurrently :application_settings, :snowplow_site_id, :snowplow_app_id
- end
-
- def down
- undo_rename_column_concurrently :application_settings, :snowplow_site_id, :snowplow_app_id
- end
-end
diff --git a/db/migrate/20191029125305_create_packages_conan_metadata.rb b/db/migrate/20191029125305_create_packages_conan_metadata.rb
deleted file mode 100644
index fa14b73e19b..00000000000
--- a/db/migrate/20191029125305_create_packages_conan_metadata.rb
+++ /dev/null
@@ -1,18 +0,0 @@
-# frozen_string_literal: true
-
-class CreatePackagesConanMetadata < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- # rubocop:disable Migration/PreventStrings
- def change
- create_table :packages_conan_metadata do |t|
- t.references :package, index: { unique: true }, null: false, foreign_key: { to_table: :packages_packages, on_delete: :cascade }, type: :bigint
- t.timestamps_with_timezone
- t.string "package_username", null: false, limit: 255
- t.string "package_channel", null: false, limit: 255
- end
- end
- # rubocop:enable Migration/PreventStrings
-end
diff --git a/db/migrate/20191029191901_add_enabled_to_grafana_integrations.rb b/db/migrate/20191029191901_add_enabled_to_grafana_integrations.rb
deleted file mode 100644
index 40e361e2150..00000000000
--- a/db/migrate/20191029191901_add_enabled_to_grafana_integrations.rb
+++ /dev/null
@@ -1,23 +0,0 @@
-# frozen_string_literal: true
-
-class AddEnabledToGrafanaIntegrations < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- add_column_with_default( # rubocop:disable Migration/AddColumnWithDefault
- :grafana_integrations,
- :enabled,
- :boolean,
- allow_null: false,
- default: false
- )
- end
-
- def down
- remove_column(:grafana_integrations, :enabled)
- end
-end
diff --git a/db/migrate/20191030135044_create_plan_limits.rb b/db/migrate/20191030135044_create_plan_limits.rb
deleted file mode 100644
index 291d9824f6d..00000000000
--- a/db/migrate/20191030135044_create_plan_limits.rb
+++ /dev/null
@@ -1,14 +0,0 @@
-# frozen_string_literal: true
-
-class CreatePlanLimits < ActiveRecord::Migration[5.2]
- DOWNTIME = false
-
- def change
- create_table :plan_limits, id: false do |t|
- t.references :plan, foreign_key: { on_delete: :cascade }, null: false, index: { unique: true }
- t.integer :ci_active_pipelines, null: false, default: 0
- t.integer :ci_pipeline_size, null: false, default: 0
- t.integer :ci_active_jobs, null: false, default: 0
- end
- end
-end
diff --git a/db/migrate/20191030152934_move_limits_from_plans.rb b/db/migrate/20191030152934_move_limits_from_plans.rb
deleted file mode 100644
index 020a028f648..00000000000
--- a/db/migrate/20191030152934_move_limits_from_plans.rb
+++ /dev/null
@@ -1,17 +0,0 @@
-# frozen_string_literal: true
-
-class MoveLimitsFromPlans < ActiveRecord::Migration[5.2]
- DOWNTIME = false
-
- def up
- execute <<~SQL
- INSERT INTO plan_limits (plan_id, ci_active_pipelines, ci_pipeline_size, ci_active_jobs)
- SELECT id, COALESCE(active_pipelines_limit, 0), COALESCE(pipeline_size_limit, 0), COALESCE(active_jobs_limit, 0)
- FROM plans
- SQL
- end
-
- def down
- execute 'DELETE FROM plan_limits'
- end
-end
diff --git a/db/migrate/20191031095636_create_project_settings.rb b/db/migrate/20191031095636_create_project_settings.rb
deleted file mode 100644
index 0263eceb3c1..00000000000
--- a/db/migrate/20191031095636_create_project_settings.rb
+++ /dev/null
@@ -1,12 +0,0 @@
-# frozen_string_literal: true
-
-class CreateProjectSettings < ActiveRecord::Migration[5.2]
- DOWNTIME = false
-
- def change
- create_table :project_settings, id: false do |t|
- t.timestamps_with_timezone null: false
- t.references :project, primary_key: true, default: nil, type: :integer, index: false, foreign_key: { on_delete: :cascade }
- end
- end
-end
diff --git a/db/migrate/20191101092917_replace_index_on_metrics_merged_at.rb b/db/migrate/20191101092917_replace_index_on_metrics_merged_at.rb
deleted file mode 100644
index b2baaee2b76..00000000000
--- a/db/migrate/20191101092917_replace_index_on_metrics_merged_at.rb
+++ /dev/null
@@ -1,19 +0,0 @@
-# frozen_string_literal: true
-
-class ReplaceIndexOnMetricsMergedAt < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- add_concurrent_index :merge_request_metrics, :merged_at
- remove_concurrent_index :merge_request_metrics, [:merged_at, :id]
- end
-
- def down
- add_concurrent_index :merge_request_metrics, [:merged_at, :id]
- remove_concurrent_index :merge_request_metrics, :merged_at
- end
-end
diff --git a/db/migrate/20191103202505_add_eks_credentials_to_application_settings.rb b/db/migrate/20191103202505_add_eks_credentials_to_application_settings.rb
deleted file mode 100644
index 5ed3e7edb3c..00000000000
--- a/db/migrate/20191103202505_add_eks_credentials_to_application_settings.rb
+++ /dev/null
@@ -1,18 +0,0 @@
-# frozen_string_literal: true
-
-class AddEksCredentialsToApplicationSettings < ActiveRecord::Migration[5.2]
- # Set this constant to true if this migration requires downtime.
- DOWNTIME = false
-
- # rubocop:disable Migration/PreventStrings
- # rubocop:disable Migration/AddLimitToTextColumns
- def change
- add_column :application_settings, :eks_integration_enabled, :boolean, null: false, default: false
- add_column :application_settings, :eks_account_id, :string, limit: 128
- add_column :application_settings, :eks_access_key_id, :string, limit: 128
- add_column :application_settings, :encrypted_eks_secret_access_key_iv, :string, limit: 255
- add_column :application_settings, :encrypted_eks_secret_access_key, :text
- end
- # rubocop:enable Migration/AddLimitToTextColumns
- # rubocop:enable Migration/PreventStrings
-end
diff --git a/db/migrate/20191104205020_add_license_details_to_application_settings.rb b/db/migrate/20191104205020_add_license_details_to_application_settings.rb
deleted file mode 100644
index f951ae6492d..00000000000
--- a/db/migrate/20191104205020_add_license_details_to_application_settings.rb
+++ /dev/null
@@ -1,11 +0,0 @@
-# frozen_string_literal: true
-
-class AddLicenseDetailsToApplicationSettings < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- def change
- add_column :application_settings, :license_trial_ends_on, :date, null: true
- end
-end
diff --git a/db/migrate/20191105094558_add_report_type_to_vulnerabilities.rb b/db/migrate/20191105094558_add_report_type_to_vulnerabilities.rb
deleted file mode 100644
index 8fb657bf9e7..00000000000
--- a/db/migrate/20191105094558_add_report_type_to_vulnerabilities.rb
+++ /dev/null
@@ -1,9 +0,0 @@
-# frozen_string_literal: true
-
-class AddReportTypeToVulnerabilities < ActiveRecord::Migration[5.2]
- DOWNTIME = false
-
- def change
- add_column :vulnerabilities, :report_type, :integer, limit: 2
- end
-end
diff --git a/db/migrate/20191105134413_create_service_desk_settings.rb b/db/migrate/20191105134413_create_service_desk_settings.rb
deleted file mode 100644
index dc8268f1c90..00000000000
--- a/db/migrate/20191105134413_create_service_desk_settings.rb
+++ /dev/null
@@ -1,20 +0,0 @@
-# frozen_string_literal: true
-
-class CreateServiceDeskSettings < ActiveRecord::Migration[5.2]
- DOWNTIME = false
-
- # rubocop:disable Migration/PreventStrings
- def change
- create_table :service_desk_settings, id: false do |t|
- t.references :project,
- primary_key: true,
- default: nil,
- null: false,
- index: false,
- foreign_key: { on_delete: :cascade }
-
- t.string :issue_template_key, limit: 255
- end
- end
- # rubocop:enable Migration/PreventStrings
-end
diff --git a/db/migrate/20191105155113_add_secret_to_snippet.rb b/db/migrate/20191105155113_add_secret_to_snippet.rb
deleted file mode 100644
index 8f0a330238b..00000000000
--- a/db/migrate/20191105155113_add_secret_to_snippet.rb
+++ /dev/null
@@ -1,27 +0,0 @@
-# frozen_string_literal: true
-
-class AddSecretToSnippet < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- unless column_exists?(:snippets, :secret)
- add_column_with_default :snippets, :secret, :boolean, default: false # rubocop:disable Migration/AddColumnWithDefault
- end
-
- add_concurrent_index :snippets, [:visibility_level, :secret]
- remove_concurrent_index :snippets, :visibility_level
- end
-
- def down
- add_concurrent_index :snippets, :visibility_level
- remove_concurrent_index :snippets, [:visibility_level, :secret]
-
- if column_exists?(:snippets, :secret)
- remove_column :snippets, :secret
- end
- end
-end
diff --git a/db/migrate/20191105193652_add_index_on_deployments_updated_at.rb b/db/migrate/20191105193652_add_index_on_deployments_updated_at.rb
deleted file mode 100644
index 10371c26dcc..00000000000
--- a/db/migrate/20191105193652_add_index_on_deployments_updated_at.rb
+++ /dev/null
@@ -1,18 +0,0 @@
-# frozen_string_literal: true
-
-class AddIndexOnDeploymentsUpdatedAt < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
- INDEX_COLUMNS = [:project_id, :updated_at]
-
- disable_ddl_transaction!
-
- def up
- add_concurrent_index(:deployments, INDEX_COLUMNS)
- end
-
- def down
- remove_concurrent_index(:deployments, INDEX_COLUMNS)
- end
-end
diff --git a/db/migrate/20191106144901_add_state_to_merge_trains.rb b/db/migrate/20191106144901_add_state_to_merge_trains.rb
deleted file mode 100644
index 64a70575c91..00000000000
--- a/db/migrate/20191106144901_add_state_to_merge_trains.rb
+++ /dev/null
@@ -1,18 +0,0 @@
-# frozen_string_literal: true
-
-class AddStateToMergeTrains < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- MERGE_TRAIN_STATUS_CREATED = 0 # Equivalent to MergeTrain.statuses[:created]
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- add_column_with_default :merge_trains, :status, :integer, limit: 2, default: MERGE_TRAIN_STATUS_CREATED # rubocop:disable Migration/AddColumnWithDefault
- end
-
- def down
- remove_column :merge_trains, :status
- end
-end
diff --git a/db/migrate/20191106150931_add_timelog_spent_at_index.rb b/db/migrate/20191106150931_add_timelog_spent_at_index.rb
deleted file mode 100644
index 2412b77d0bf..00000000000
--- a/db/migrate/20191106150931_add_timelog_spent_at_index.rb
+++ /dev/null
@@ -1,20 +0,0 @@
-# frozen_string_literal: true
-
-# See http://doc.gitlab.com/ce/development/migration_style_guide.html
-# for more information on how to write migrations for GitLab.
-
-class AddTimelogSpentAtIndex < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- add_concurrent_index :timelogs, :spent_at, where: 'spent_at IS NOT NULL'
- end
-
- def down
- remove_concurrent_index :timelogs, :spent_at, where: 'spent_at IS NOT NULL'
- end
-end
diff --git a/db/migrate/20191107064946_update_oauth_open_id_requests_foreign_keys.rb b/db/migrate/20191107064946_update_oauth_open_id_requests_foreign_keys.rb
deleted file mode 100644
index 439610758a6..00000000000
--- a/db/migrate/20191107064946_update_oauth_open_id_requests_foreign_keys.rb
+++ /dev/null
@@ -1,29 +0,0 @@
-# frozen_string_literal: true
-
-class UpdateOauthOpenIdRequestsForeignKeys < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- add_concurrent_foreign_key(:oauth_openid_requests, :oauth_access_grants, column: :access_grant_id, on_delete: :cascade, name: new_foreign_key_name)
- remove_foreign_key_if_exists(:oauth_openid_requests, name: existing_foreign_key_name)
- end
-
- def down
- add_concurrent_foreign_key(:oauth_openid_requests, :oauth_access_grants, column: :access_grant_id, on_delete: false, name: existing_foreign_key_name)
- remove_foreign_key_if_exists(:oauth_openid_requests, name: new_foreign_key_name)
- end
-
- private
-
- def new_foreign_key_name
- concurrent_foreign_key_name(:oauth_openid_requests, :access_grant_id)
- end
-
- def existing_foreign_key_name
- 'fk_oauth_openid_requests_oauth_access_grants_access_grant_id'
- end
-end
diff --git a/db/migrate/20191107173446_add_sourcegraph_admin_and_user_preferences.rb b/db/migrate/20191107173446_add_sourcegraph_admin_and_user_preferences.rb
deleted file mode 100644
index 731ed82c999..00000000000
--- a/db/migrate/20191107173446_add_sourcegraph_admin_and_user_preferences.rb
+++ /dev/null
@@ -1,17 +0,0 @@
-# frozen_string_literal: true
-
-class AddSourcegraphAdminAndUserPreferences < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- def up
- add_column(:application_settings, :sourcegraph_public_only, :boolean, default: true, null: false)
- add_column(:user_preferences, :sourcegraph_enabled, :boolean)
- end
-
- def down
- remove_column(:application_settings, :sourcegraph_public_only)
- remove_column(:user_preferences, :sourcegraph_enabled)
- end
-end
diff --git a/db/migrate/20191107220314_add_index_to_projects_on_marked_for_deletion.rb b/db/migrate/20191107220314_add_index_to_projects_on_marked_for_deletion.rb
deleted file mode 100644
index 06849cf9bfd..00000000000
--- a/db/migrate/20191107220314_add_index_to_projects_on_marked_for_deletion.rb
+++ /dev/null
@@ -1,17 +0,0 @@
-# frozen_string_literal: true
-
-class AddIndexToProjectsOnMarkedForDeletion < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- add_concurrent_index :projects, :marked_for_deletion_at, where: 'marked_for_deletion_at IS NOT NULL'
- end
-
- def down
- remove_concurrent_index :projects, :marked_for_deletion_at
- end
-end
diff --git a/db/migrate/20191108031900_create_package_build_info.rb b/db/migrate/20191108031900_create_package_build_info.rb
deleted file mode 100644
index d0c85e2fb3f..00000000000
--- a/db/migrate/20191108031900_create_package_build_info.rb
+++ /dev/null
@@ -1,12 +0,0 @@
-# frozen_string_literal: true
-
-class CreatePackageBuildInfo < ActiveRecord::Migration[5.2]
- DOWNTIME = false
-
- def change
- create_table :packages_build_infos do |t|
- t.references :package, null: false, foreign_key: { to_table: :packages_packages, on_delete: :cascade }, type: :integer, index: { unique: true }
- t.references :pipeline, index: true, null: true, foreign_key: { to_table: :ci_pipelines, on_delete: :nullify }, type: :integer
- end
- end
-end
diff --git a/db/migrate/20191111115229_add_group_id_to_import_export_uploads.rb b/db/migrate/20191111115229_add_group_id_to_import_export_uploads.rb
deleted file mode 100644
index 74ef0f27b3e..00000000000
--- a/db/migrate/20191111115229_add_group_id_to_import_export_uploads.rb
+++ /dev/null
@@ -1,9 +0,0 @@
-# frozen_string_literal: true
-
-class AddGroupIdToImportExportUploads < ActiveRecord::Migration[5.2]
- DOWNTIME = false
-
- def change
- add_column :import_export_uploads, :group_id, :bigint
- end
-end
diff --git a/db/migrate/20191111115431_add_group_fk_to_import_export_uploads.rb b/db/migrate/20191111115431_add_group_fk_to_import_export_uploads.rb
deleted file mode 100644
index 403de3f33ed..00000000000
--- a/db/migrate/20191111115431_add_group_fk_to_import_export_uploads.rb
+++ /dev/null
@@ -1,19 +0,0 @@
-# frozen_string_literal: true
-
-class AddGroupFkToImportExportUploads < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- add_concurrent_foreign_key :import_export_uploads, :namespaces, column: :group_id, on_delete: :cascade
- add_concurrent_index :import_export_uploads, :group_id, unique: true, where: 'group_id IS NOT NULL'
- end
-
- def down
- remove_foreign_key_without_error(:import_export_uploads, column: :group_id)
- remove_concurrent_index(:import_export_uploads, :group_id)
- end
-end
diff --git a/db/migrate/20191111121500_default_ci_config_path.rb b/db/migrate/20191111121500_default_ci_config_path.rb
deleted file mode 100644
index 3914058d35b..00000000000
--- a/db/migrate/20191111121500_default_ci_config_path.rb
+++ /dev/null
@@ -1,15 +0,0 @@
-# frozen_string_literal: true
-
-class DefaultCiConfigPath < ActiveRecord::Migration[5.2]
- DOWNTIME = false
-
- # rubocop:disable Migration/PreventStrings
- def up
- add_column :application_settings, :default_ci_config_path, :string, limit: 255
- end
- # rubocop:enable Migration/PreventStrings
-
- def down
- remove_column :application_settings, :default_ci_config_path
- end
-end
diff --git a/db/migrate/20191111165017_add_fixed_pipeline_to_notification_settings.rb b/db/migrate/20191111165017_add_fixed_pipeline_to_notification_settings.rb
deleted file mode 100644
index 7a857807468..00000000000
--- a/db/migrate/20191111165017_add_fixed_pipeline_to_notification_settings.rb
+++ /dev/null
@@ -1,9 +0,0 @@
-# frozen_string_literal: true
-
-class AddFixedPipelineToNotificationSettings < ActiveRecord::Migration[5.2]
- DOWNTIME = false
-
- def change
- add_column :notification_settings, :fixed_pipeline, :boolean
- end
-end
diff --git a/db/migrate/20191111175230_add_index_on_ci_pipelines_updated_at.rb b/db/migrate/20191111175230_add_index_on_ci_pipelines_updated_at.rb
deleted file mode 100644
index 566bb16ac65..00000000000
--- a/db/migrate/20191111175230_add_index_on_ci_pipelines_updated_at.rb
+++ /dev/null
@@ -1,18 +0,0 @@
-# frozen_string_literal: true
-
-class AddIndexOnCiPipelinesUpdatedAt < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
- INDEX_COLUMNS = [:project_id, :status, :updated_at]
-
- disable_ddl_transaction!
-
- def up
- add_concurrent_index(:ci_pipelines, INDEX_COLUMNS)
- end
-
- def down
- remove_concurrent_index(:ci_pipelines, INDEX_COLUMNS)
- end
-end
diff --git a/db/migrate/20191112090226_add_artifacts_to_ci_build_need.rb b/db/migrate/20191112090226_add_artifacts_to_ci_build_need.rb
deleted file mode 100644
index b868e0b44a8..00000000000
--- a/db/migrate/20191112090226_add_artifacts_to_ci_build_need.rb
+++ /dev/null
@@ -1,20 +0,0 @@
-# frozen_string_literal: true
-
-class AddArtifactsToCiBuildNeed < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- add_column_with_default(:ci_build_needs, :artifacts, # rubocop:disable Migration/AddColumnWithDefault
- :boolean,
- default: true,
- allow_null: false)
- end
-
- def down
- remove_column(:ci_build_needs, :artifacts)
- end
-end
diff --git a/db/migrate/20191112105448_add_index_on_personal_access_tokens_user_id_and_expires_at.rb b/db/migrate/20191112105448_add_index_on_personal_access_tokens_user_id_and_expires_at.rb
deleted file mode 100644
index 1c1dc31ff23..00000000000
--- a/db/migrate/20191112105448_add_index_on_personal_access_tokens_user_id_and_expires_at.rb
+++ /dev/null
@@ -1,18 +0,0 @@
-# frozen_string_literal: true
-
-class AddIndexOnPersonalAccessTokensUserIdAndExpiresAt < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
- INDEX_NAME = 'index_pat_on_user_id_and_expires_at'
-
- disable_ddl_transaction!
-
- def up
- add_concurrent_index :personal_access_tokens, [:user_id, :expires_at], name: INDEX_NAME, using: :btree
- end
-
- def down
- remove_concurrent_index_by_name :personal_access_tokens, INDEX_NAME
- end
-end
diff --git a/db/migrate/20191112115247_add_cached_markdown_version_to_vulnerabilities.rb b/db/migrate/20191112115247_add_cached_markdown_version_to_vulnerabilities.rb
deleted file mode 100644
index b0c513737e8..00000000000
--- a/db/migrate/20191112115247_add_cached_markdown_version_to_vulnerabilities.rb
+++ /dev/null
@@ -1,9 +0,0 @@
-# frozen_string_literal: true
-
-class AddCachedMarkdownVersionToVulnerabilities < ActiveRecord::Migration[5.2]
- DOWNTIME = false
-
- def change
- add_column :vulnerabilities, :cached_markdown_version, :integer
- end
-end
diff --git a/db/migrate/20191112212815_create_web_authn_table.rb b/db/migrate/20191112212815_create_web_authn_table.rb
deleted file mode 100644
index 72895f955df..00000000000
--- a/db/migrate/20191112212815_create_web_authn_table.rb
+++ /dev/null
@@ -1,26 +0,0 @@
-# frozen_string_literal: true
-
-class CreateWebAuthnTable < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- # disable_ddl_transaction!
-
- # rubocop:disable Migration/AddLimitToTextColumns
- # limits are added in subsequent migration
- def change
- create_table :webauthn_registrations do |t|
- t.bigint :user_id, null: false, index: true
-
- t.bigint :counter, default: 0, null: false
- t.timestamps_with_timezone
- t.text :credential_xid, null: false, index: { unique: true }
- t.text :name, null: false
- # The length of the public key is determined by the device
- # and not specified. Thus we can't set a limit
- t.text :public_key, null: false # rubocop:disable Migration/AddLimitToTextColumns
- end
- end
- # rubocop:enable Migration/AddLimitToTextColumns
-end
diff --git a/db/migrate/20191112214305_add_indexes_for_projects_api_default_params.rb b/db/migrate/20191112214305_add_indexes_for_projects_api_default_params.rb
deleted file mode 100644
index 3893c0422c7..00000000000
--- a/db/migrate/20191112214305_add_indexes_for_projects_api_default_params.rb
+++ /dev/null
@@ -1,19 +0,0 @@
-# frozen_string_literal: true
-
-class AddIndexesForProjectsApiDefaultParams < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- add_concurrent_index :projects, %i(visibility_level created_at id)
- remove_concurrent_index_by_name :projects, 'index_projects_on_visibility_level'
- end
-
- def down
- add_concurrent_index :projects, :visibility_level
- remove_concurrent_index :projects, %i(visibility_level created_at id)
- end
-end
diff --git a/db/migrate/20191112221821_add_indexes_for_projects_api_default_params_authenticated.rb b/db/migrate/20191112221821_add_indexes_for_projects_api_default_params_authenticated.rb
deleted file mode 100644
index 6ebc6a72854..00000000000
--- a/db/migrate/20191112221821_add_indexes_for_projects_api_default_params_authenticated.rb
+++ /dev/null
@@ -1,19 +0,0 @@
-# frozen_string_literal: true
-
-class AddIndexesForProjectsApiDefaultParamsAuthenticated < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- add_concurrent_index :projects, %i(created_at id)
- remove_concurrent_index_by_name :projects, 'index_projects_on_created_at'
- end
-
- def down
- add_concurrent_index :projects, :created_at
- remove_concurrent_index_by_name :projects, 'index_projects_on_created_at_and_id'
- end
-end
diff --git a/db/migrate/20191112232338_ensure_no_empty_milestone_titles.rb b/db/migrate/20191112232338_ensure_no_empty_milestone_titles.rb
deleted file mode 100644
index 76cb511424e..00000000000
--- a/db/migrate/20191112232338_ensure_no_empty_milestone_titles.rb
+++ /dev/null
@@ -1,18 +0,0 @@
-# frozen_string_literal: true
-
-class EnsureNoEmptyMilestoneTitles < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- def up
- loop do
- rows_updated = exec_update <<~SQL
- UPDATE milestones SET title = '%BLANK' WHERE id IN (SELECT id FROM milestones WHERE title = '' LIMIT 500)
- SQL
- break if rows_updated < 500
- end
- end
-
- def down; end
-end
diff --git a/db/migrate/20191114132259_add_mentions_disabled_to_namespaces.rb b/db/migrate/20191114132259_add_mentions_disabled_to_namespaces.rb
deleted file mode 100644
index a67d032795d..00000000000
--- a/db/migrate/20191114132259_add_mentions_disabled_to_namespaces.rb
+++ /dev/null
@@ -1,9 +0,0 @@
-# frozen_string_literal: true
-
-class AddMentionsDisabledToNamespaces < ActiveRecord::Migration[5.2]
- DOWNTIME = false
-
- def change
- add_column :namespaces, :mentions_disabled, :boolean # rubocop:disable Migration/AddColumnsToWideTables
- end
-end
diff --git a/db/migrate/20191114173508_add_resolved_attributes_to_vulnerabilities.rb b/db/migrate/20191114173508_add_resolved_attributes_to_vulnerabilities.rb
deleted file mode 100644
index ec45a729ebb..00000000000
--- a/db/migrate/20191114173508_add_resolved_attributes_to_vulnerabilities.rb
+++ /dev/null
@@ -1,15 +0,0 @@
-# frozen_string_literal: true
-
-class AddResolvedAttributesToVulnerabilities < ActiveRecord::Migration[5.2]
- DOWNTIME = false
-
- def up
- add_column :vulnerabilities, :resolved_by_id, :bigint
- add_column :vulnerabilities, :resolved_at, :datetime_with_timezone
- end
-
- def down
- remove_column :vulnerabilities, :resolved_at
- remove_column :vulnerabilities, :resolved_by_id
- end
-end
diff --git a/db/migrate/20191114173602_add_foreign_key_on_resolved_by_id_to_vulnerabilities.rb b/db/migrate/20191114173602_add_foreign_key_on_resolved_by_id_to_vulnerabilities.rb
deleted file mode 100644
index e0a125ca756..00000000000
--- a/db/migrate/20191114173602_add_foreign_key_on_resolved_by_id_to_vulnerabilities.rb
+++ /dev/null
@@ -1,19 +0,0 @@
-# frozen_string_literal: true
-
-class AddForeignKeyOnResolvedByIdToVulnerabilities < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- add_concurrent_index :vulnerabilities, :resolved_by_id
- add_concurrent_foreign_key :vulnerabilities, :users, column: :resolved_by_id, on_delete: :nullify
- end
-
- def down
- remove_foreign_key :vulnerabilities, column: :resolved_by_id
- remove_concurrent_index :vulnerabilities, :resolved_by_id
- end
-end
diff --git a/db/migrate/20191114201118_make_created_at_not_null_in_design_management_versions.rb b/db/migrate/20191114201118_make_created_at_not_null_in_design_management_versions.rb
deleted file mode 100644
index 7b9d70c1a50..00000000000
--- a/db/migrate/20191114201118_make_created_at_not_null_in_design_management_versions.rb
+++ /dev/null
@@ -1,15 +0,0 @@
-# frozen_string_literal: true
-
-class MakeCreatedAtNotNullInDesignManagementVersions < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- def up
- change_column_null :design_management_versions, :created_at, false, Time.now.to_s(:db)
- end
-
- def down
- change_column_null :design_management_versions, :created_at, true
- end
-end
diff --git a/db/migrate/20191115001123_add_index_to_mod_sec_ci_variables.rb b/db/migrate/20191115001123_add_index_to_mod_sec_ci_variables.rb
deleted file mode 100644
index 169ecf5ea41..00000000000
--- a/db/migrate/20191115001123_add_index_to_mod_sec_ci_variables.rb
+++ /dev/null
@@ -1,17 +0,0 @@
-# frozen_string_literal: true
-
-class AddIndexToModSecCiVariables < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- add_concurrent_index :ci_variables, :project_id, where: "key = 'AUTO_DEVOPS_MODSECURITY_SEC_RULE_ENGINE'"
- end
-
- def down
- remove_concurrent_index :ci_variables, :project_id
- end
-end
diff --git a/db/migrate/20191115001843_add_index_to_mod_sec_ci_pipeline_variables.rb b/db/migrate/20191115001843_add_index_to_mod_sec_ci_pipeline_variables.rb
deleted file mode 100644
index 6b13f565a11..00000000000
--- a/db/migrate/20191115001843_add_index_to_mod_sec_ci_pipeline_variables.rb
+++ /dev/null
@@ -1,17 +0,0 @@
-# frozen_string_literal: true
-
-class AddIndexToModSecCiPipelineVariables < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- add_concurrent_index :ci_pipeline_variables, :pipeline_id, where: "key = 'AUTO_DEVOPS_MODSECURITY_SEC_RULE_ENGINE'"
- end
-
- def down
- remove_concurrent_index :ci_pipeline_variables, :pipeline_id
- end
-end
diff --git a/db/migrate/20191115091425_create_vulnerability_issue_links.rb b/db/migrate/20191115091425_create_vulnerability_issue_links.rb
deleted file mode 100644
index 8398b6357c4..00000000000
--- a/db/migrate/20191115091425_create_vulnerability_issue_links.rb
+++ /dev/null
@@ -1,23 +0,0 @@
-# frozen_string_literal: true
-
-class CreateVulnerabilityIssueLinks < ActiveRecord::Migration[5.2]
- DOWNTIME = false
-
- def change
- create_table :vulnerability_issue_links do |t|
- # index: false because idx_vulnerability_issue_links_on_vulnerability_id_and_issue_id refers the same column
- t.references :vulnerability, null: false, index: false, foreign_key: { on_delete: :cascade }
- # index: true is implied
- t.references :issue, null: false, foreign_key: { on_delete: :cascade }
- t.integer 'link_type', limit: 2, null: false, default: 1 # 'related'
- t.index %i[vulnerability_id issue_id],
- name: 'idx_vulnerability_issue_links_on_vulnerability_id_and_issue_id',
- unique: true # only one link (and of only one type) is allowed
- t.index %i[vulnerability_id link_type],
- name: 'idx_vulnerability_issue_links_on_vulnerability_id_and_link_type',
- where: 'link_type = 2',
- unique: true # only one 'created' link per vulnerability is allowed
- t.timestamps_with_timezone
- end
- end
-end
diff --git a/db/migrate/20191115114032_add_processed_to_ci_builds.rb b/db/migrate/20191115114032_add_processed_to_ci_builds.rb
deleted file mode 100644
index 6fece99cb02..00000000000
--- a/db/migrate/20191115114032_add_processed_to_ci_builds.rb
+++ /dev/null
@@ -1,9 +0,0 @@
-# frozen_string_literal: true
-
-class AddProcessedToCiBuilds < ActiveRecord::Migration[5.2]
- DOWNTIME = false
-
- def change
- add_column :ci_builds, :processed, :boolean # rubocop:disable Migration/AddColumnsToWideTables
- end
-end
diff --git a/db/migrate/20191118053631_add_group_deletion_schedules.rb b/db/migrate/20191118053631_add_group_deletion_schedules.rb
deleted file mode 100644
index 6f3ed27e156..00000000000
--- a/db/migrate/20191118053631_add_group_deletion_schedules.rb
+++ /dev/null
@@ -1,28 +0,0 @@
-# frozen_string_literal: true
-
-class AddGroupDeletionSchedules < ActiveRecord::Migration[5.2]
- DOWNTIME = false
-
- def up
- create_table :group_deletion_schedules, id: false do |t|
- t.references :group,
- foreign_key: { on_delete: :cascade, to_table: :namespaces },
- default: nil,
- index: false,
- primary_key: true
-
- t.references :user,
- index: true,
- foreign_key: { on_delete: :nullify },
- null: false
-
- t.date :marked_for_deletion_on,
- index: true,
- null: false
- end
- end
-
- def down
- drop_table :group_deletion_schedules
- end
-end
diff --git a/db/migrate/20191118155702_add_index_on_status_to_merge_trains.rb b/db/migrate/20191118155702_add_index_on_status_to_merge_trains.rb
deleted file mode 100644
index 9b5238045f8..00000000000
--- a/db/migrate/20191118155702_add_index_on_status_to_merge_trains.rb
+++ /dev/null
@@ -1,20 +0,0 @@
-# frozen_string_literal: true
-
-class AddIndexOnStatusToMergeTrains < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
- INDEX_NAME = 'index_for_status_per_branch_per_project'
-
- disable_ddl_transaction!
-
- def up
- add_concurrent_index :merge_trains, [:target_project_id, :target_branch, :status], name: INDEX_NAME
- remove_concurrent_index :merge_trains, :target_project_id
- end
-
- def down
- add_concurrent_index :merge_trains, :target_project_id
- remove_concurrent_index :merge_trains, [:target_project_id, :target_branch, :status], name: INDEX_NAME
- end
-end
diff --git a/db/migrate/20191118173522_add_snippet_size_limit_to_application_settings.rb b/db/migrate/20191118173522_add_snippet_size_limit_to_application_settings.rb
deleted file mode 100644
index b6b30febbd6..00000000000
--- a/db/migrate/20191118173522_add_snippet_size_limit_to_application_settings.rb
+++ /dev/null
@@ -1,13 +0,0 @@
-# frozen_string_literal: true
-
-class AddSnippetSizeLimitToApplicationSettings < ActiveRecord::Migration[5.2]
- DOWNTIME = false
-
- def up
- add_column :application_settings, :snippet_size_limit, :bigint, default: 50.megabytes, null: false
- end
-
- def down
- remove_column :application_settings, :snippet_size_limit
- end
-end
diff --git a/db/migrate/20191118182722_add_index_to_environments_on_project_id_state_environment_type.rb b/db/migrate/20191118182722_add_index_to_environments_on_project_id_state_environment_type.rb
deleted file mode 100644
index 01272dfad44..00000000000
--- a/db/migrate/20191118182722_add_index_to_environments_on_project_id_state_environment_type.rb
+++ /dev/null
@@ -1,21 +0,0 @@
-# frozen_string_literal: true
-
-class AddIndexToEnvironmentsOnProjectIdStateEnvironmentType < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
- OLD_INDEX_NAME = 'index_environments_on_project_id_and_state'
- NEW_INDEX_NAME = 'index_environments_on_project_id_state_environment_type'
-
- disable_ddl_transaction!
-
- def up
- add_concurrent_index(:environments, [:project_id, :state, :environment_type], name: NEW_INDEX_NAME)
- remove_concurrent_index_by_name(:environments, OLD_INDEX_NAME)
- end
-
- def down
- add_concurrent_index(:environments, [:project_id, :state], name: OLD_INDEX_NAME)
- remove_concurrent_index_by_name(:environments, NEW_INDEX_NAME)
- end
-end
diff --git a/db/migrate/20191119023952_add_created_at_index_to_snippets.rb b/db/migrate/20191119023952_add_created_at_index_to_snippets.rb
deleted file mode 100644
index 226af5f9e6d..00000000000
--- a/db/migrate/20191119023952_add_created_at_index_to_snippets.rb
+++ /dev/null
@@ -1,17 +0,0 @@
-# frozen_string_literal: true
-
-class AddCreatedAtIndexToSnippets < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- add_concurrent_index :snippets, :created_at
- end
-
- def down
- remove_concurrent_index :snippets, :created_at
- end
-end
diff --git a/db/migrate/20191119220425_rename_software_license_policies_approval_status_to_classification.rb b/db/migrate/20191119220425_rename_software_license_policies_approval_status_to_classification.rb
deleted file mode 100644
index 98c14f42558..00000000000
--- a/db/migrate/20191119220425_rename_software_license_policies_approval_status_to_classification.rb
+++ /dev/null
@@ -1,17 +0,0 @@
-# frozen_string_literal: true
-
-class RenameSoftwareLicensePoliciesApprovalStatusToClassification < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- rename_column_concurrently :software_license_policies, :approval_status, :classification
- end
-
- def down
- undo_rename_column_concurrently :software_license_policies, :approval_status, :classification
- end
-end
diff --git a/db/migrate/20191119231621_create_container_expiration_policies.rb b/db/migrate/20191119231621_create_container_expiration_policies.rb
deleted file mode 100644
index d06ae659f41..00000000000
--- a/db/migrate/20191119231621_create_container_expiration_policies.rb
+++ /dev/null
@@ -1,23 +0,0 @@
-# frozen_string_literal: true
-
-class CreateContainerExpirationPolicies < ActiveRecord::Migration[5.2]
- DOWNTIME = false
-
- # rubocop:disable Migration/PreventStrings
- def change
- create_table :container_expiration_policies, id: false, primary_key: :project_id do |t|
- t.timestamps_with_timezone null: false
- t.datetime_with_timezone :next_run_at
- t.references :project, primary_key: true, default: nil, index: false, foreign_key: { on_delete: :cascade }
- t.string :name_regex, limit: 255
- t.string :cadence, null: false, limit: 12, default: '7d'
- t.string :older_than, limit: 12
- t.integer :keep_n
- t.boolean :enabled, null: false, default: false
- end
-
- add_index :container_expiration_policies, [:next_run_at, :enabled],
- name: 'index_container_expiration_policies_on_next_run_at_and_enabled'
- end
- # rubocop:enable Migration/PreventStrings
-end
diff --git a/db/migrate/20191120084627_add_encrypted_fields_to_application_settings.rb b/db/migrate/20191120084627_add_encrypted_fields_to_application_settings.rb
deleted file mode 100644
index 7bb2d9c6301..00000000000
--- a/db/migrate/20191120084627_add_encrypted_fields_to_application_settings.rb
+++ /dev/null
@@ -1,34 +0,0 @@
-# frozen_string_literal: true
-
-class AddEncryptedFieldsToApplicationSettings < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- PLAINTEXT_ATTRIBUTES = %w[
- akismet_api_key
- elasticsearch_aws_secret_access_key
- recaptcha_private_key
- recaptcha_site_key
- slack_app_secret
- slack_app_verification_token
- ].freeze
-
- # rubocop:disable Migration/PreventStrings
- # rubocop:disable Migration/AddLimitToTextColumns
- def up
- PLAINTEXT_ATTRIBUTES.each do |plaintext_attribute|
- add_column :application_settings, "encrypted_#{plaintext_attribute}", :text
- add_column :application_settings, "encrypted_#{plaintext_attribute}_iv", :string, limit: 255
- end
- end
- # rubocop:enable Migration/AddLimitToTextColumns
- # rubocop:enable Migration/PreventStrings
-
- def down
- PLAINTEXT_ATTRIBUTES.each do |plaintext_attribute|
- remove_column :application_settings, "encrypted_#{plaintext_attribute}"
- remove_column :application_settings, "encrypted_#{plaintext_attribute}_iv"
- end
- end
-end
diff --git a/db/migrate/20191120115530_encrypt_plaintext_attributes_on_application_settings.rb b/db/migrate/20191120115530_encrypt_plaintext_attributes_on_application_settings.rb
deleted file mode 100644
index 3ae5e3265e8..00000000000
--- a/db/migrate/20191120115530_encrypt_plaintext_attributes_on_application_settings.rb
+++ /dev/null
@@ -1,87 +0,0 @@
-# frozen_string_literal: true
-
-class EncryptPlaintextAttributesOnApplicationSettings < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- PLAINTEXT_ATTRIBUTES = %w[
- akismet_api_key
- elasticsearch_aws_secret_access_key
- recaptcha_private_key
- recaptcha_site_key
- slack_app_secret
- slack_app_verification_token
- ].freeze
-
- class ApplicationSetting < ActiveRecord::Base
- self.table_name = 'application_settings'
-
- def self.encryption_options_base_32_aes_256_gcm
- {
- mode: :per_attribute_iv,
- key: Gitlab::Utils.ensure_utf8_size(Rails.application.secrets.db_key_base, bytes: 32.bytes),
- algorithm: 'aes-256-gcm',
- encode: true
- }
- end
-
- attr_encrypted :akismet_api_key, encryption_options_base_32_aes_256_gcm
- attr_encrypted :elasticsearch_aws_secret_access_key, encryption_options_base_32_aes_256_gcm
- attr_encrypted :recaptcha_private_key, encryption_options_base_32_aes_256_gcm
- attr_encrypted :recaptcha_site_key, encryption_options_base_32_aes_256_gcm
- attr_encrypted :slack_app_secret, encryption_options_base_32_aes_256_gcm
- attr_encrypted :slack_app_verification_token, encryption_options_base_32_aes_256_gcm
-
- def akismet_api_key
- decrypt(:akismet_api_key, self[:encrypted_akismet_api_key]) || self[:akismet_api_key]
- end
-
- def elasticsearch_aws_secret_access_key
- decrypt(:elasticsearch_aws_secret_access_key, self[:encrypted_elasticsearch_aws_secret_access_key]) || self[:elasticsearch_aws_secret_access_key]
- end
-
- def recaptcha_private_key
- decrypt(:recaptcha_private_key, self[:encrypted_recaptcha_private_key]) || self[:recaptcha_private_key]
- end
-
- def recaptcha_site_key
- decrypt(:recaptcha_site_key, self[:encrypted_recaptcha_site_key]) || self[:recaptcha_site_key]
- end
-
- def slack_app_secret
- decrypt(:slack_app_secret, self[:encrypted_slack_app_secret]) || self[:slack_app_secret]
- end
-
- def slack_app_verification_token
- decrypt(:slack_app_verification_token, self[:encrypted_slack_app_verification_token]) || self[:slack_app_verification_token]
- end
- end
-
- def up
- ApplicationSetting.find_each do |application_setting|
- # We are using the setter from attr_encrypted gem to encrypt the data.
- # The gem updates the two columns needed to decrypt the value:
- # - "encrypted_#{plaintext_attribute}"
- # - "encrypted_#{plaintext_attribute}_iv"
- application_setting.assign_attributes(
- PLAINTEXT_ATTRIBUTES.each_with_object({}) do |plaintext_attribute, attributes|
- attributes[plaintext_attribute] = application_setting.send(plaintext_attribute)
- end
- )
- application_setting.save(validate: false)
- end
- end
-
- def down
- ApplicationSetting.find_each do |application_setting|
- application_setting.update_columns(
- PLAINTEXT_ATTRIBUTES.each_with_object({}) do |plaintext_attribute, attributes|
- attributes[plaintext_attribute] = application_setting.send(plaintext_attribute)
- attributes["encrypted_#{plaintext_attribute}"] = nil
- attributes["encrypted_#{plaintext_attribute}_iv"] = nil
- end
- )
- end
- end
-end
diff --git a/db/migrate/20191120200015_add_index_to_grafana_integrations.rb b/db/migrate/20191120200015_add_index_to_grafana_integrations.rb
deleted file mode 100644
index c67f6850baf..00000000000
--- a/db/migrate/20191120200015_add_index_to_grafana_integrations.rb
+++ /dev/null
@@ -1,17 +0,0 @@
-# frozen_string_literal: true
-
-class AddIndexToGrafanaIntegrations < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- add_concurrent_index :grafana_integrations, :enabled, where: 'enabled IS TRUE'
- end
-
- def down
- remove_concurrent_index :grafana_integrations, :enabled
- end
-end
diff --git a/db/migrate/20191121111621_create_packages_dependencies.rb b/db/migrate/20191121111621_create_packages_dependencies.rb
deleted file mode 100644
index 29a8434514e..00000000000
--- a/db/migrate/20191121111621_create_packages_dependencies.rb
+++ /dev/null
@@ -1,16 +0,0 @@
-# frozen_string_literal: true
-
-class CreatePackagesDependencies < ActiveRecord::Migration[5.2]
- DOWNTIME = false
-
- # rubocop:disable Migration/PreventStrings
- def change
- create_table :packages_dependencies do |t|
- t.string :name, null: false, limit: 255
- t.string :version_pattern, null: false, limit: 255
- end
-
- add_index :packages_dependencies, [:name, :version_pattern], unique: true
- end
- # rubocop:enable Migration/PreventStrings
-end
diff --git a/db/migrate/20191121121947_create_packages_dependency_links.rb b/db/migrate/20191121121947_create_packages_dependency_links.rb
deleted file mode 100644
index 0907ed8f16c..00000000000
--- a/db/migrate/20191121121947_create_packages_dependency_links.rb
+++ /dev/null
@@ -1,15 +0,0 @@
-# frozen_string_literal: true
-
-class CreatePackagesDependencyLinks < ActiveRecord::Migration[5.2]
- DOWNTIME = false
-
- def change
- create_table :packages_dependency_links do |t|
- t.references :package, index: false, null: false, foreign_key: { to_table: :packages_packages, on_delete: :cascade }, type: :bigint
- t.references :dependency, null: false, foreign_key: { to_table: :packages_dependencies, on_delete: :cascade }, type: :bigint
- t.integer :dependency_type, limit: 2, null: false
- end
-
- add_index :packages_dependency_links, [:package_id, :dependency_id, :dependency_type], unique: true, name: 'idx_pkgs_dep_links_on_pkg_id_dependency_id_dependency_type'
- end
-end
diff --git a/db/migrate/20191121161018_add_project_id_name_version_package_type_index_to_packages_packages.rb b/db/migrate/20191121161018_add_project_id_name_version_package_type_index_to_packages_packages.rb
deleted file mode 100644
index 4a34b9e791e..00000000000
--- a/db/migrate/20191121161018_add_project_id_name_version_package_type_index_to_packages_packages.rb
+++ /dev/null
@@ -1,22 +0,0 @@
-# frozen_string_literal: true
-
-class AddProjectIdNameVersionPackageTypeIndexToPackagesPackages < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
- INDEX_NAME = 'idx_packages_packages_on_project_id_name_version_package_type'
-
- disable_ddl_transaction!
-
- def up
- add_concurrent_index :packages_packages,
- [:project_id, :name, :version, :package_type],
- name: INDEX_NAME
- end
-
- def down
- remove_concurrent_index :packages_packages,
- [:project_id, :name, :version, :package_type],
- name: INDEX_NAME
- end
-end
diff --git a/db/migrate/20191121193110_add_issue_links_type.rb b/db/migrate/20191121193110_add_issue_links_type.rb
deleted file mode 100644
index 86bfd41b916..00000000000
--- a/db/migrate/20191121193110_add_issue_links_type.rb
+++ /dev/null
@@ -1,17 +0,0 @@
-# frozen_string_literal: true
-
-class AddIssueLinksType < ActiveRecord::Migration[5.1]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- add_column_with_default :issue_links, :link_type, :integer, default: 0, limit: 2 # rubocop:disable Migration/AddColumnWithDefault
- end
-
- def down
- remove_column :issue_links, :link_type
- end
-end
diff --git a/db/migrate/20191122161519_create_sentry_issues_table.rb b/db/migrate/20191122161519_create_sentry_issues_table.rb
deleted file mode 100644
index 753286b6025..00000000000
--- a/db/migrate/20191122161519_create_sentry_issues_table.rb
+++ /dev/null
@@ -1,15 +0,0 @@
-# frozen_string_literal: true
-
-class CreateSentryIssuesTable < ActiveRecord::Migration[5.2]
- DOWNTIME = false
-
- def change
- create_table :sentry_issues do |t|
- t.references :issue,
- foreign_key: { on_delete: :cascade },
- index: { unique: true },
- null: false
- t.bigint :sentry_issue_identifier, null: false
- end
- end
-end
diff --git a/db/migrate/20191123062354_add_minimum_password_length_to_application_settings.rb b/db/migrate/20191123062354_add_minimum_password_length_to_application_settings.rb
deleted file mode 100644
index 0a7ad9d81a9..00000000000
--- a/db/migrate/20191123062354_add_minimum_password_length_to_application_settings.rb
+++ /dev/null
@@ -1,11 +0,0 @@
-# frozen_string_literal: true
-
-class AddMinimumPasswordLengthToApplicationSettings < ActiveRecord::Migration[5.2]
- DOWNTIME = false
-
- DEFAULT_MINIMUM_PASSWORD_LENGTH = 8
-
- def change
- add_column(:application_settings, :minimum_password_length, :integer, default: DEFAULT_MINIMUM_PASSWORD_LENGTH, null: false)
- end
-end
diff --git a/db/migrate/20191123081456_add_dismissable_to_broadcast_messages.rb b/db/migrate/20191123081456_add_dismissable_to_broadcast_messages.rb
deleted file mode 100644
index 40235771d80..00000000000
--- a/db/migrate/20191123081456_add_dismissable_to_broadcast_messages.rb
+++ /dev/null
@@ -1,9 +0,0 @@
-# frozen_string_literal: true
-
-class AddDismissableToBroadcastMessages < ActiveRecord::Migration[5.2]
- DOWNTIME = false
-
- def change
- add_column :broadcast_messages, :dismissable, :boolean
- end
-end
diff --git a/db/migrate/20191124150431_change_label_id_index_to_include_action_on_label_events.rb b/db/migrate/20191124150431_change_label_id_index_to_include_action_on_label_events.rb
deleted file mode 100644
index bd138adc5fa..00000000000
--- a/db/migrate/20191124150431_change_label_id_index_to_include_action_on_label_events.rb
+++ /dev/null
@@ -1,21 +0,0 @@
-# frozen_string_literal: true
-
-class ChangeLabelIdIndexToIncludeActionOnLabelEvents < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- add_concurrent_index(:resource_label_events, %I[label_id action])
-
- remove_concurrent_index(:resource_label_events, :label_id)
- end
-
- def down
- add_concurrent_index(:resource_label_events, :label_id)
-
- remove_concurrent_index(:resource_label_events, %I[label_id action])
- end
-end
diff --git a/db/migrate/20191125114345_add_admin_mode_protected_path.rb b/db/migrate/20191125114345_add_admin_mode_protected_path.rb
deleted file mode 100644
index 7e9b0d5a285..00000000000
--- a/db/migrate/20191125114345_add_admin_mode_protected_path.rb
+++ /dev/null
@@ -1,54 +0,0 @@
-# frozen_string_literal: true
-
-class AddAdminModeProtectedPath < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- ADMIN_MODE_ENDPOINT = '/admin/session'
-
- OLD_DEFAULT_PROTECTED_PATHS = [
- '/users/password',
- '/users/sign_in',
- '/api/v3/session.json',
- '/api/v3/session',
- '/api/v4/session.json',
- '/api/v4/session',
- '/users',
- '/users/confirmation',
- '/unsubscribes/',
- '/import/github/personal_access_token'
- ]
-
- NEW_DEFAULT_PROTECTED_PATHS = OLD_DEFAULT_PROTECTED_PATHS.dup << ADMIN_MODE_ENDPOINT
-
- class ApplicationSetting < ActiveRecord::Base
- self.table_name = 'application_settings'
- end
-
- def up
- change_column_default :application_settings, :protected_paths, NEW_DEFAULT_PROTECTED_PATHS
-
- # schema allows nulls for protected_paths
- ApplicationSetting.where.not(protected_paths: nil).each do |application_setting|
- unless application_setting.protected_paths.include?(ADMIN_MODE_ENDPOINT)
- updated_protected_paths = application_setting.protected_paths << ADMIN_MODE_ENDPOINT
-
- application_setting.update(protected_paths: updated_protected_paths)
- end
- end
- end
-
- def down
- change_column_default :application_settings, :protected_paths, OLD_DEFAULT_PROTECTED_PATHS
-
- # schema allows nulls for protected_paths
- ApplicationSetting.where.not(protected_paths: nil).each do |application_setting|
- if application_setting.protected_paths.include?(ADMIN_MODE_ENDPOINT)
- updated_protected_paths = application_setting.protected_paths - [ADMIN_MODE_ENDPOINT]
-
- application_setting.update(protected_paths: updated_protected_paths)
- end
- end
- end
-end
diff --git a/db/migrate/20191125133353_add_target_path_to_broadcast_message.rb b/db/migrate/20191125133353_add_target_path_to_broadcast_message.rb
deleted file mode 100644
index 8597cce5b19..00000000000
--- a/db/migrate/20191125133353_add_target_path_to_broadcast_message.rb
+++ /dev/null
@@ -1,11 +0,0 @@
-# frozen_string_literal: true
-
-class AddTargetPathToBroadcastMessage < ActiveRecord::Migration[5.2]
- DOWNTIME = false
-
- # rubocop:disable Migration/PreventStrings
- def change
- add_column :broadcast_messages, :target_path, :string, limit: 255
- end
- # rubocop:enable Migration/PreventStrings
-end
diff --git a/db/migrate/20191125140458_create_import_failures.rb b/db/migrate/20191125140458_create_import_failures.rb
deleted file mode 100644
index e5dbcf5d41d..00000000000
--- a/db/migrate/20191125140458_create_import_failures.rb
+++ /dev/null
@@ -1,19 +0,0 @@
-# frozen_string_literal: true
-
-class CreateImportFailures < ActiveRecord::Migration[5.2]
- DOWNTIME = false
-
- # rubocop:disable Migration/PreventStrings
- def change
- create_table :import_failures do |t|
- t.integer :relation_index
- t.references :project, null: false, index: true
- t.datetime_with_timezone :created_at, null: false
- t.string :relation_key, limit: 64
- t.string :exception_class, limit: 128
- t.string :correlation_id_value, limit: 128, index: true
- t.string :exception_message, limit: 255
- end
- end
- # rubocop:enable Migration/PreventStrings
-end
diff --git a/db/migrate/20191126134210_rename_packages_package_tags.rb b/db/migrate/20191126134210_rename_packages_package_tags.rb
deleted file mode 100644
index 75cb53802ab..00000000000
--- a/db/migrate/20191126134210_rename_packages_package_tags.rb
+++ /dev/null
@@ -1,9 +0,0 @@
-# frozen_string_literal: true
-
-class RenamePackagesPackageTags < ActiveRecord::Migration[5.2]
- DOWNTIME = false
-
- def change
- rename_table(:packages_package_tags, :packages_tags)
- end
-end
diff --git a/db/migrate/20191127030005_create_serverless_domain_cluster.rb b/db/migrate/20191127030005_create_serverless_domain_cluster.rb
deleted file mode 100644
index c65301bf133..00000000000
--- a/db/migrate/20191127030005_create_serverless_domain_cluster.rb
+++ /dev/null
@@ -1,19 +0,0 @@
-# frozen_string_literal: true
-
-class CreateServerlessDomainCluster < ActiveRecord::Migration[5.2]
- DOWNTIME = false
-
- # rubocop:disable Migration/PreventStrings
- def change
- create_table :serverless_domain_cluster, id: false, primary_key: :uuid do |t|
- t.references :pages_domain, null: false, foreign_key: { on_delete: :cascade }
- t.references :clusters_applications_knative, null: false,
- foreign_key: { to_table: :clusters_applications_knative, on_delete: :cascade },
- index: { name: :idx_serverless_domain_cluster_on_clusters_applications_knative, unique: true }
- t.references :creator, name: :created_by, foreign_key: { to_table: :users, on_delete: :nullify }
- t.timestamps_with_timezone null: false
- t.string :uuid, null: false, limit: 14, primary_key: true
- end
- end
- # rubocop:enable Migration/PreventStrings
-end
diff --git a/db/migrate/20191127151619_create_gitlab_subscription_histories.rb b/db/migrate/20191127151619_create_gitlab_subscription_histories.rb
deleted file mode 100644
index 718f2c1b313..00000000000
--- a/db/migrate/20191127151619_create_gitlab_subscription_histories.rb
+++ /dev/null
@@ -1,28 +0,0 @@
-# frozen_string_literal: true
-
-class CreateGitlabSubscriptionHistories < ActiveRecord::Migration[5.2]
- DOWNTIME = false
-
- def up
- create_table :gitlab_subscription_histories do |t|
- t.datetime_with_timezone :gitlab_subscription_created_at
- t.datetime_with_timezone :gitlab_subscription_updated_at
- t.date :start_date
- t.date :end_date
- t.date :trial_ends_on
- t.integer :namespace_id, null: true
- t.integer :hosted_plan_id, null: true
- t.integer :max_seats_used
- t.integer :seats
- t.boolean :trial
- t.integer :change_type, limit: 2
- t.bigint :gitlab_subscription_id, null: false
- t.datetime_with_timezone :created_at
- end
- add_index :gitlab_subscription_histories, :gitlab_subscription_id
- end
-
- def down
- drop_table :gitlab_subscription_histories
- end
-end
diff --git a/db/migrate/20191127151629_add_trial_starts_on_to_gitlab_subscriptions.rb b/db/migrate/20191127151629_add_trial_starts_on_to_gitlab_subscriptions.rb
deleted file mode 100644
index 2528aa9c2c8..00000000000
--- a/db/migrate/20191127151629_add_trial_starts_on_to_gitlab_subscriptions.rb
+++ /dev/null
@@ -1,10 +0,0 @@
-# frozen_string_literal: true
-
-class AddTrialStartsOnToGitlabSubscriptions < ActiveRecord::Migration[5.2]
- DOWNTIME = false
-
- def change
- add_column :gitlab_subscriptions, :trial_starts_on, :date, null: true
- add_column :gitlab_subscription_histories, :trial_starts_on, :date, null: true
- end
-end
diff --git a/db/migrate/20191127163053_add_confidential_to_doorkeeper_application.rb b/db/migrate/20191127163053_add_confidential_to_doorkeeper_application.rb
deleted file mode 100644
index 12e22b4744c..00000000000
--- a/db/migrate/20191127163053_add_confidential_to_doorkeeper_application.rb
+++ /dev/null
@@ -1,26 +0,0 @@
-# frozen_string_literal: true
-
-class AddConfidentialToDoorkeeperApplication < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- add_column_with_default( # rubocop:disable Migration/AddColumnWithDefault
- :oauth_applications,
- :confidential,
- :boolean,
- default: false, # assume all existing applications are non-confidential
- allow_null: false
- )
-
- # set the default to true so that all future applications are confidential by default
- change_column_default(:oauth_applications, :confidential, true)
- end
-
- def down
- remove_column :oauth_applications, :confidential
- end
-end
diff --git a/db/migrate/20191127221608_add_wildcard_and_domain_type_to_pages_domains.rb b/db/migrate/20191127221608_add_wildcard_and_domain_type_to_pages_domains.rb
deleted file mode 100644
index 96a2e8275c6..00000000000
--- a/db/migrate/20191127221608_add_wildcard_and_domain_type_to_pages_domains.rb
+++ /dev/null
@@ -1,20 +0,0 @@
-# frozen_string_literal: true
-
-class AddWildcardAndDomainTypeToPagesDomains < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
- PROJECT_TYPE = 2
-
- disable_ddl_transaction!
-
- def up
- add_column_with_default :pages_domains, :wildcard, :boolean, default: false # rubocop:disable Migration/AddColumnWithDefault
- add_column_with_default :pages_domains, :domain_type, :integer, limit: 2, default: PROJECT_TYPE # rubocop:disable Migration/AddColumnWithDefault
- end
-
- def down
- remove_column :pages_domains, :wildcard
- remove_column :pages_domains, :domain_type
- end
-end
diff --git a/db/migrate/20191128145231_add_ci_resource_groups.rb b/db/migrate/20191128145231_add_ci_resource_groups.rb
deleted file mode 100644
index 77975120f72..00000000000
--- a/db/migrate/20191128145231_add_ci_resource_groups.rb
+++ /dev/null
@@ -1,22 +0,0 @@
-# frozen_string_literal: true
-
-class AddCiResourceGroups < ActiveRecord::Migration[5.2]
- DOWNTIME = false
-
- def change
- create_table :ci_resource_groups do |t|
- t.timestamps_with_timezone
- t.bigint :project_id, null: false
- t.string :key, null: false, limit: 255 # rubocop:disable Migration/PreventStrings
- t.index %i[project_id key], unique: true
- end
-
- create_table :ci_resources do |t|
- t.timestamps_with_timezone
- t.references :resource_group, null: false, index: false, foreign_key: { to_table: :ci_resource_groups, on_delete: :cascade }
- t.bigint :build_id, null: true
- t.index %i[build_id]
- t.index %i[resource_group_id build_id], unique: true
- end
- end
-end
diff --git a/db/migrate/20191128145232_add_fk_to_ci_resources_build_id.rb b/db/migrate/20191128145232_add_fk_to_ci_resources_build_id.rb
deleted file mode 100644
index a13513de3b2..00000000000
--- a/db/migrate/20191128145232_add_fk_to_ci_resources_build_id.rb
+++ /dev/null
@@ -1,17 +0,0 @@
-# frozen_string_literal: true
-
-class AddFkToCiResourcesBuildId < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- add_concurrent_foreign_key :ci_resources, :ci_builds, column: :build_id, on_delete: :nullify
- end
-
- def down
- remove_foreign_key_if_exists :ci_resources, column: :build_id
- end
-end
diff --git a/db/migrate/20191128145233_add_fk_to_ci_resource_groups_project_id.rb b/db/migrate/20191128145233_add_fk_to_ci_resource_groups_project_id.rb
deleted file mode 100644
index bb23012ea9b..00000000000
--- a/db/migrate/20191128145233_add_fk_to_ci_resource_groups_project_id.rb
+++ /dev/null
@@ -1,17 +0,0 @@
-# frozen_string_literal: true
-
-class AddFkToCiResourceGroupsProjectId < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- add_concurrent_foreign_key :ci_resource_groups, :projects, column: :project_id, on_delete: :cascade
- end
-
- def down
- remove_foreign_key_if_exists :ci_resource_groups, column: :project_id
- end
-end
diff --git a/db/migrate/20191129134844_add_broadcast_type_to_broadcast_message.rb b/db/migrate/20191129134844_add_broadcast_type_to_broadcast_message.rb
deleted file mode 100644
index 884d9ac6d7f..00000000000
--- a/db/migrate/20191129134844_add_broadcast_type_to_broadcast_message.rb
+++ /dev/null
@@ -1,19 +0,0 @@
-# frozen_string_literal: true
-
-class AddBroadcastTypeToBroadcastMessage < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- # Set this constant to true if this migration requires downtime.
- DOWNTIME = false
- BROADCAST_MESSAGE_BANNER_TYPE = 1
-
- disable_ddl_transaction!
-
- def up
- add_column_with_default(:broadcast_messages, :broadcast_type, :smallint, default: BROADCAST_MESSAGE_BANNER_TYPE) # rubocop:disable Migration/AddColumnWithDefault
- end
-
- def down
- remove_column(:broadcast_messages, :broadcast_type)
- end
-end
diff --git a/db/migrate/20191129144630_add_resource_group_id_to_ci_builds.rb b/db/migrate/20191129144630_add_resource_group_id_to_ci_builds.rb
deleted file mode 100644
index 245df7fdcf3..00000000000
--- a/db/migrate/20191129144630_add_resource_group_id_to_ci_builds.rb
+++ /dev/null
@@ -1,27 +0,0 @@
-# frozen_string_literal: true
-
-class AddResourceGroupIdToCiBuilds < ActiveRecord::Migration[5.2]
- DOWNTIME = false
-
- # rubocop:disable Migration/AddColumnsToWideTables
- def up
- unless column_exists?(:ci_builds, :resource_group_id)
- add_column :ci_builds, :resource_group_id, :bigint
- end
-
- unless column_exists?(:ci_builds, :waiting_for_resource_at)
- add_column :ci_builds, :waiting_for_resource_at, :datetime_with_timezone
- end
- end
- # rubocop:enable Migration/AddColumnsToWideTables
-
- def down
- if column_exists?(:ci_builds, :resource_group_id)
- remove_column :ci_builds, :resource_group_id, :bigint
- end
-
- if column_exists?(:ci_builds, :waiting_for_resource_at)
- remove_column :ci_builds, :waiting_for_resource_at, :datetime_with_timezone
- end
- end
-end
diff --git a/db/migrate/20191129144631_add_index_to_resource_group_id.rb b/db/migrate/20191129144631_add_index_to_resource_group_id.rb
deleted file mode 100644
index 01d56f417b5..00000000000
--- a/db/migrate/20191129144631_add_index_to_resource_group_id.rb
+++ /dev/null
@@ -1,20 +0,0 @@
-# frozen_string_literal: true
-
-class AddIndexToResourceGroupId < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
- INDEX_NAME = 'index_for_resource_group'
-
- disable_ddl_transaction!
-
- def up
- add_concurrent_index :ci_builds, %i[resource_group_id id], where: 'resource_group_id IS NOT NULL', name: INDEX_NAME
- add_concurrent_foreign_key :ci_builds, :ci_resource_groups, column: :resource_group_id, on_delete: :nullify
- end
-
- def down
- remove_foreign_key_if_exists :ci_builds, column: :resource_group_id
- remove_concurrent_index_by_name :ci_builds, INDEX_NAME
- end
-end
diff --git a/db/migrate/20191202181924_add_environment_auto_stop_in_to_ci_builds_metadata.rb b/db/migrate/20191202181924_add_environment_auto_stop_in_to_ci_builds_metadata.rb
deleted file mode 100644
index c09196da91b..00000000000
--- a/db/migrate/20191202181924_add_environment_auto_stop_in_to_ci_builds_metadata.rb
+++ /dev/null
@@ -1,15 +0,0 @@
-# frozen_string_literal: true
-
-class AddEnvironmentAutoStopInToCiBuildsMetadata < ActiveRecord::Migration[5.2]
- DOWNTIME = false
-
- # rubocop:disable Migration/PreventStrings
- def up
- add_column :ci_builds_metadata, :environment_auto_stop_in, :string, limit: 255
- end
- # rubocop:enable Migration/PreventStrings
-
- def down
- remove_column :ci_builds_metadata, :environment_auto_stop_in
- end
-end
diff --git a/db/migrate/20191203121729_update_group_deletion_schedules_foreign_keys.rb b/db/migrate/20191203121729_update_group_deletion_schedules_foreign_keys.rb
deleted file mode 100644
index 99531a1e93e..00000000000
--- a/db/migrate/20191203121729_update_group_deletion_schedules_foreign_keys.rb
+++ /dev/null
@@ -1,29 +0,0 @@
-# frozen_string_literal: true
-
-class UpdateGroupDeletionSchedulesForeignKeys < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- add_concurrent_foreign_key(:group_deletion_schedules, :users, column: :user_id, on_delete: :cascade, name: new_foreign_key_name)
- remove_foreign_key_if_exists(:group_deletion_schedules, column: :user_id, on_delete: :nullify)
- end
-
- def down
- add_concurrent_foreign_key(:group_deletion_schedules, :users, column: :user_id, on_delete: :nullify, name: existing_foreign_key_name)
- remove_foreign_key_if_exists(:group_deletion_schedules, column: :user_id, on_delete: :cascade)
- end
-
- private
-
- def new_foreign_key_name
- concurrent_foreign_key_name(:group_deletion_schedules, :user_id)
- end
-
- def existing_foreign_key_name
- 'fk_group_deletion_schedules_users_user_id'
- end
-end
diff --git a/db/migrate/20191204070713_change_updated_at_index_and_add_index_to_id_on_deployments.rb b/db/migrate/20191204070713_change_updated_at_index_and_add_index_to_id_on_deployments.rb
deleted file mode 100644
index 450b276e689..00000000000
--- a/db/migrate/20191204070713_change_updated_at_index_and_add_index_to_id_on_deployments.rb
+++ /dev/null
@@ -1,29 +0,0 @@
-# frozen_string_literal: true
-
-class ChangeUpdatedAtIndexAndAddIndexToIdOnDeployments < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- disable_ddl_transaction!
-
- DOWNTIME = false
-
- PROJECT_ID_INDEX_PARAMS = [[:project_id, :id], order: { id: :desc }]
- OLD_UPDATED_AT_INDEX_PARAMS = [[:project_id, :updated_at]]
- NEW_UPDATED_AT_INDEX_PARAMS = [[:project_id, :updated_at, :id], order: { updated_at: :desc, id: :desc }]
-
- def up
- add_concurrent_index :deployments, *NEW_UPDATED_AT_INDEX_PARAMS
-
- remove_concurrent_index :deployments, *OLD_UPDATED_AT_INDEX_PARAMS
-
- add_concurrent_index :deployments, *PROJECT_ID_INDEX_PARAMS
- end
-
- def down
- add_concurrent_index :deployments, *OLD_UPDATED_AT_INDEX_PARAMS
-
- remove_concurrent_index :deployments, *NEW_UPDATED_AT_INDEX_PARAMS
-
- remove_concurrent_index :deployments, *PROJECT_ID_INDEX_PARAMS
- end
-end
diff --git a/db/migrate/20191204093410_add_label_project_group_partial_indexes.rb b/db/migrate/20191204093410_add_label_project_group_partial_indexes.rb
deleted file mode 100644
index 85666144856..00000000000
--- a/db/migrate/20191204093410_add_label_project_group_partial_indexes.rb
+++ /dev/null
@@ -1,25 +0,0 @@
-# frozen_string_literal: true
-
-# See http://doc.gitlab.com/ce/development/migration_style_guide.html
-# for more information on how to write migrations for GitLab.
-
-class AddLabelProjectGroupPartialIndexes < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- PROJECT_AND_TITLE = [:project_id, :title]
- GROUP_AND_TITLE = [:group_id, :title]
-
- def up
- add_concurrent_index :labels, PROJECT_AND_TITLE, unique: false, where: "labels.group_id = null"
- add_concurrent_index :labels, GROUP_AND_TITLE, unique: false, where: "labels.project_id = null"
- end
-
- def down
- remove_concurrent_index :labels, PROJECT_AND_TITLE
- remove_concurrent_index :labels, GROUP_AND_TITLE
- end
-end
diff --git a/db/migrate/20191204192726_add_design_disk_path_to_geo_hashed_storage_migrated_events.rb b/db/migrate/20191204192726_add_design_disk_path_to_geo_hashed_storage_migrated_events.rb
deleted file mode 100644
index 8631502ded8..00000000000
--- a/db/migrate/20191204192726_add_design_disk_path_to_geo_hashed_storage_migrated_events.rb
+++ /dev/null
@@ -1,14 +0,0 @@
-# frozen_string_literal: true
-
-class AddDesignDiskPathToGeoHashedStorageMigratedEvents < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- # rubocop:disable Migration/AddLimitToTextColumns
- def change
- add_column :geo_hashed_storage_migrated_events, :old_design_disk_path, :text
- add_column :geo_hashed_storage_migrated_events, :new_design_disk_path, :text
- end
- # rubocop:enable Migration/AddLimitToTextColumns
-end
diff --git a/db/migrate/20191205060723_add_index_to_keys.rb b/db/migrate/20191205060723_add_index_to_keys.rb
deleted file mode 100644
index 8e8c725f62e..00000000000
--- a/db/migrate/20191205060723_add_index_to_keys.rb
+++ /dev/null
@@ -1,17 +0,0 @@
-# frozen_string_literal: true
-
-class AddIndexToKeys < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- add_concurrent_index :keys, :last_used_at, order: { last_used_at: 'DESC NULLS LAST' }
- end
-
- def down
- remove_concurrent_index :keys, :last_used_at
- end
-end
diff --git a/db/migrate/20191205094702_add_index_for_cross_projects_dependencies_to_ci_builds.rb b/db/migrate/20191205094702_add_index_for_cross_projects_dependencies_to_ci_builds.rb
deleted file mode 100644
index 023414fb4bb..00000000000
--- a/db/migrate/20191205094702_add_index_for_cross_projects_dependencies_to_ci_builds.rb
+++ /dev/null
@@ -1,19 +0,0 @@
-# frozen_string_literal: true
-
-class AddIndexForCrossProjectsDependenciesToCiBuilds < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- add_concurrent_index :ci_builds, [:project_id, :name, :ref],
- where: "type = 'Ci::Build' AND status = 'success' AND (retried = FALSE OR retried IS NULL)"
- end
-
- def down
- remove_concurrent_index :ci_builds, [:project_id, :name, :ref],
- where: "type = 'Ci::Build' AND status = 'success' AND (retried = FALSE OR retried IS NULL)"
- end
-end
diff --git a/db/migrate/20191205145647_add_index_to_projects_deploy_keys_deploy_key.rb b/db/migrate/20191205145647_add_index_to_projects_deploy_keys_deploy_key.rb
deleted file mode 100644
index f9cdc226e4d..00000000000
--- a/db/migrate/20191205145647_add_index_to_projects_deploy_keys_deploy_key.rb
+++ /dev/null
@@ -1,17 +0,0 @@
-# frozen_string_literal: true
-
-class AddIndexToProjectsDeployKeysDeployKey < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- disable_ddl_transaction!
-
- DOWNTIME = false
-
- def up
- add_concurrent_index :deploy_keys_projects, :deploy_key_id
- end
-
- def down
- remove_concurrent_index :deploy_keys_projects, :deploy_key_id
- end
-end
diff --git a/db/migrate/20191205212923_support_multiple_milestones_for_issues.rb b/db/migrate/20191205212923_support_multiple_milestones_for_issues.rb
deleted file mode 100644
index e0edd76c4b9..00000000000
--- a/db/migrate/20191205212923_support_multiple_milestones_for_issues.rb
+++ /dev/null
@@ -1,14 +0,0 @@
-# frozen_string_literal: true
-
-class SupportMultipleMilestonesForIssues < ActiveRecord::Migration[5.2]
- DOWNTIME = false
-
- def change
- create_table :issue_milestones, id: false do |t|
- t.references :issue, foreign_key: { on_delete: :cascade }, index: { unique: true }, null: false
- t.references :milestone, foreign_key: { on_delete: :cascade }, index: true, null: false
- end
-
- add_index :issue_milestones, [:issue_id, :milestone_id], unique: true
- end
-end
diff --git a/db/migrate/20191205212924_support_multiple_milestones_for_merge_requests.rb b/db/migrate/20191205212924_support_multiple_milestones_for_merge_requests.rb
deleted file mode 100644
index 85ad1a748e9..00000000000
--- a/db/migrate/20191205212924_support_multiple_milestones_for_merge_requests.rb
+++ /dev/null
@@ -1,14 +0,0 @@
-# frozen_string_literal: true
-
-class SupportMultipleMilestonesForMergeRequests < ActiveRecord::Migration[5.2]
- DOWNTIME = false
-
- def change
- create_table :merge_request_milestones, id: false do |t|
- t.references :merge_request, foreign_key: { on_delete: :cascade }, index: { unique: true }, null: false
- t.references :milestone, foreign_key: { on_delete: :cascade }, index: true, null: false
- end
-
- add_index :merge_request_milestones, [:merge_request_id, :milestone_id], name: 'index_mrs_milestones_on_mr_id_and_milestone_id', unique: true
- end
-end
diff --git a/db/migrate/20191206014412_add_image_to_design_management_designs_versions.rb b/db/migrate/20191206014412_add_image_to_design_management_designs_versions.rb
deleted file mode 100644
index 54ef9b74f29..00000000000
--- a/db/migrate/20191206014412_add_image_to_design_management_designs_versions.rb
+++ /dev/null
@@ -1,11 +0,0 @@
-# frozen_string_literal: true
-
-class AddImageToDesignManagementDesignsVersions < ActiveRecord::Migration[6.0]
- DOWNTIME = false
-
- # rubocop:disable Migration/PreventStrings
- def change
- add_column :design_management_designs_versions, :image_v432x230, :string, limit: 255
- end
- # rubocop:enable Migration/PreventStrings
-end
diff --git a/db/migrate/20191206022133_add_indexes_to_pages_domains_on_wildcard_and_domain_type.rb b/db/migrate/20191206022133_add_indexes_to_pages_domains_on_wildcard_and_domain_type.rb
deleted file mode 100644
index 3c1704a3377..00000000000
--- a/db/migrate/20191206022133_add_indexes_to_pages_domains_on_wildcard_and_domain_type.rb
+++ /dev/null
@@ -1,19 +0,0 @@
-# frozen_string_literal: true
-
-class AddIndexesToPagesDomainsOnWildcardAndDomainType < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- add_concurrent_index :pages_domains, :wildcard
- add_concurrent_index :pages_domains, :domain_type
- end
-
- def down
- remove_concurrent_index :pages_domains, :wildcard
- remove_concurrent_index :pages_domains, :domain_type
- end
-end
diff --git a/db/migrate/20191206122926_update_index_for_pool_repositories.rb b/db/migrate/20191206122926_update_index_for_pool_repositories.rb
deleted file mode 100644
index f88e8e94ee1..00000000000
--- a/db/migrate/20191206122926_update_index_for_pool_repositories.rb
+++ /dev/null
@@ -1,24 +0,0 @@
-# frozen_string_literal: true
-
-class UpdateIndexForPoolRepositories < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- # This index is less restrictive then the one we already have, no need to
- # update data.
- add_concurrent_index :pool_repositories, [:source_project_id, :shard_id], unique: true
- remove_concurrent_index :pool_repositories, :source_project_id
- end
-
- def down
- # Not adding this index as a unique one, since while the new index existed
- # we could have created multiple pool repositories for a project. In that
- # case this rollback would fail.
- add_concurrent_index :pool_repositories, :source_project_id
- remove_concurrent_index :pool_repositories, [:source_project_id, :shard_id], unique: true
- end
-end
diff --git a/db/migrate/20191207104000_add_render_whitespace_in_code_to_user_preference.rb b/db/migrate/20191207104000_add_render_whitespace_in_code_to_user_preference.rb
deleted file mode 100644
index 83b44b98c67..00000000000
--- a/db/migrate/20191207104000_add_render_whitespace_in_code_to_user_preference.rb
+++ /dev/null
@@ -1,17 +0,0 @@
-# frozen_string_literal: true
-
-class AddRenderWhitespaceInCodeToUserPreference < ActiveRecord::Migration[5.1]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- add_column(:user_preferences, :render_whitespace_in_code, :boolean)
- end
-
- def down
- remove_column(:user_preferences, :render_whitespace_in_code)
- end
-end
diff --git a/db/migrate/20191208071111_add_fingerprint_sha256_to_key.rb b/db/migrate/20191208071111_add_fingerprint_sha256_to_key.rb
deleted file mode 100644
index 1bc87357f7d..00000000000
--- a/db/migrate/20191208071111_add_fingerprint_sha256_to_key.rb
+++ /dev/null
@@ -1,13 +0,0 @@
-# frozen_string_literal: true
-
-class AddFingerprintSha256ToKey < ActiveRecord::Migration[5.0]
- DOWNTIME = false
-
- def up
- add_column(:keys, :fingerprint_sha256, :binary)
- end
-
- def down
- remove_column(:keys, :fingerprint_sha256) if column_exists?(:keys, :fingerprint_sha256)
- end
-end
diff --git a/db/migrate/20191208071112_add_fingerprint_sha256_index_to_key.rb b/db/migrate/20191208071112_add_fingerprint_sha256_index_to_key.rb
deleted file mode 100644
index 6f0c4bcd321..00000000000
--- a/db/migrate/20191208071112_add_fingerprint_sha256_index_to_key.rb
+++ /dev/null
@@ -1,17 +0,0 @@
-# frozen_string_literal: true
-
-class AddFingerprintSha256IndexToKey < ActiveRecord::Migration[5.0]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- add_concurrent_index(:keys, "fingerprint_sha256")
- end
-
- def down
- remove_concurrent_index(:keys, "fingerprint_sha256")
- end
-end
diff --git a/db/migrate/20191208110214_add_suggestion_commit_message_to_projects.rb b/db/migrate/20191208110214_add_suggestion_commit_message_to_projects.rb
deleted file mode 100644
index 3c96a1737c2..00000000000
--- a/db/migrate/20191208110214_add_suggestion_commit_message_to_projects.rb
+++ /dev/null
@@ -1,13 +0,0 @@
-# frozen_string_literal: true
-
-class AddSuggestionCommitMessageToProjects < ActiveRecord::Migration[5.2]
- DOWNTIME = false
-
- # rubocop:disable Migration/AddColumnsToWideTables
- # rubocop:disable Migration/PreventStrings
- def change
- add_column :projects, :suggestion_commit_message, :string, limit: 255
- end
- # rubocop:enable Migration/PreventStrings
- # rubocop:enable Migration/AddColumnsToWideTables
-end
diff --git a/db/migrate/20191209143606_add_deleted_at_to_description_versions.rb b/db/migrate/20191209143606_add_deleted_at_to_description_versions.rb
deleted file mode 100644
index 02a3d1271c2..00000000000
--- a/db/migrate/20191209143606_add_deleted_at_to_description_versions.rb
+++ /dev/null
@@ -1,9 +0,0 @@
-# frozen_string_literal: true
-
-class AddDeletedAtToDescriptionVersions < ActiveRecord::Migration[5.2]
- DOWNTIME = false
-
- def change
- add_column :description_versions, :deleted_at, :datetime_with_timezone
- end
-end
diff --git a/db/migrate/20191210211253_create_resource_weight_event.rb b/db/migrate/20191210211253_create_resource_weight_event.rb
deleted file mode 100644
index b458c5f169f..00000000000
--- a/db/migrate/20191210211253_create_resource_weight_event.rb
+++ /dev/null
@@ -1,18 +0,0 @@
-# frozen_string_literal: true
-
-class CreateResourceWeightEvent < ActiveRecord::Migration[5.2]
- DOWNTIME = false
-
- def change
- create_table :resource_weight_events do |t|
- t.references :user, null: false, foreign_key: { on_delete: :nullify },
- index: { name: 'index_resource_weight_events_on_user_id' }
- t.references :issue, null: false, foreign_key: { on_delete: :cascade },
- index: false
- t.integer :weight
- t.datetime_with_timezone :created_at, null: false
-
- t.index [:issue_id, :weight], name: 'index_resource_weight_events_on_issue_id_and_weight'
- end
- end
-end
diff --git a/db/migrate/20191212140117_change_commit_user_mentions_commit_id_column_type.rb b/db/migrate/20191212140117_change_commit_user_mentions_commit_id_column_type.rb
deleted file mode 100644
index f205de3587e..00000000000
--- a/db/migrate/20191212140117_change_commit_user_mentions_commit_id_column_type.rb
+++ /dev/null
@@ -1,38 +0,0 @@
-# frozen_string_literal: true
-
-class ChangeCommitUserMentionsCommitIdColumnType < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- OLD_INDEX = 'commit_user_mentions_on_commit_id_and_note_id_index'
- OLD_TMP_INDEX = 'temp_commit_id_and_note_id_index'
- NEW_TMP_INDEX = 'temp_commit_id_for_type_change_and_note_id_index'
- NEW_INDEX = 'commit_id_and_note_id_index'
-
- # rubocop:disable Migration/PreventStrings
- def up
- # the initial index name is too long and fails during migration. Renaming the index first.
- add_concurrent_index :commit_user_mentions, [:commit_id, :note_id], name: OLD_TMP_INDEX
- remove_concurrent_index_by_name :commit_user_mentions, OLD_INDEX
-
- change_column_type_concurrently :commit_user_mentions, :commit_id, :string
-
- # change_column_type_concurrently creates a new index for new column `commit_id_for_type` based on existing
- # `temp_commit_id_and_note_id_index` naming it `temp_commit_id_for_type_change_and_note_id_index`, yet keeping
- # `temp_commit_id_and_note_id_index` for `commit_id`, that will be cleaned
- # by `cleanup_concurrent_column_type_change :commit_user_mentions, :commit_id` in a later migration.
- #
- # So we'll rename `temp_commit_id_for_type_change_and_note_id_index` to initialy intended name: `commit_id_and_note_id_index`.
-
- add_concurrent_index :commit_user_mentions, [:commit_id_for_type_change, :note_id], name: NEW_INDEX
- remove_concurrent_index_by_name :commit_user_mentions, NEW_TMP_INDEX
- end
- # rubocop:enable Migration/PreventStrings
-
- def down
- cleanup_concurrent_column_type_change :commit_user_mentions, :commit_id
- end
-end
diff --git a/db/migrate/20191213104838_add_service_desk_username.rb b/db/migrate/20191213104838_add_service_desk_username.rb
deleted file mode 100644
index d50de4c362c..00000000000
--- a/db/migrate/20191213104838_add_service_desk_username.rb
+++ /dev/null
@@ -1,11 +0,0 @@
-# frozen_string_literal: true
-
-class AddServiceDeskUsername < ActiveRecord::Migration[5.2]
- DOWNTIME = false
-
- # rubocop:disable Migration/PreventStrings
- def change
- add_column :service_desk_settings, :outgoing_name, :string, limit: 255
- end
- # rubocop:enable Migration/PreventStrings
-end
diff --git a/db/migrate/20191213120427_fix_max_pages_size.rb b/db/migrate/20191213120427_fix_max_pages_size.rb
deleted file mode 100644
index 498ea91b773..00000000000
--- a/db/migrate/20191213120427_fix_max_pages_size.rb
+++ /dev/null
@@ -1,20 +0,0 @@
-# frozen_string_literal: true
-
-class FixMaxPagesSize < ActiveRecord::Migration[5.2]
- DOWNTIME = false
- MAX_SIZE = 1.terabyte / 1.megabyte
-
- class ApplicationSetting < ActiveRecord::Base
- self.table_name = 'application_settings'
- self.inheritance_column = :_type_disabled
- end
-
- def up
- table = ApplicationSetting.arel_table
- ApplicationSetting.where(table[:max_pages_size].gt(MAX_SIZE)).update_all(max_pages_size: MAX_SIZE)
- end
-
- def down
- # no-op
- end
-end
diff --git a/db/migrate/20191213143656_create_ci_pipelines_config.rb b/db/migrate/20191213143656_create_ci_pipelines_config.rb
deleted file mode 100644
index a1821ee9f66..00000000000
--- a/db/migrate/20191213143656_create_ci_pipelines_config.rb
+++ /dev/null
@@ -1,14 +0,0 @@
-# frozen_string_literal: true
-
-class CreateCiPipelinesConfig < ActiveRecord::Migration[5.2]
- DOWNTIME = false
-
- def change
- create_table :ci_pipelines_config, id: false do |t|
- t.references :pipeline,
- primary_key: true,
- foreign_key: { to_table: :ci_pipelines, on_delete: :cascade }
- t.text :content, null: false # rubocop:disable Migration/AddLimitToTextColumns
- end
- end
-end
diff --git a/db/migrate/20191213184609_backfill_operations_feature_flags_active.rb b/db/migrate/20191213184609_backfill_operations_feature_flags_active.rb
deleted file mode 100644
index cc61b30acae..00000000000
--- a/db/migrate/20191213184609_backfill_operations_feature_flags_active.rb
+++ /dev/null
@@ -1,20 +0,0 @@
-# frozen_string_literal: true
-
-class BackfillOperationsFeatureFlagsActive < ActiveRecord::Migration[5.2]
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- class OperationsFeatureFlag < ActiveRecord::Base
- self.table_name = 'operations_feature_flags'
- self.inheritance_column = :_type_disabled
- end
-
- def up
- OperationsFeatureFlag.where(active: false).update_all(active: true)
- end
-
- def down
- # no-op
- end
-end
diff --git a/db/migrate/20191214175727_add_indexes_to_deployments_on_project_id_and_ref.rb b/db/migrate/20191214175727_add_indexes_to_deployments_on_project_id_and_ref.rb
deleted file mode 100644
index ea92f9cfd32..00000000000
--- a/db/migrate/20191214175727_add_indexes_to_deployments_on_project_id_and_ref.rb
+++ /dev/null
@@ -1,20 +0,0 @@
-# frozen_string_literal: true
-
-class AddIndexesToDeploymentsOnProjectIdAndRef < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
- INDEX_NAME = 'partial_index_deployments_for_project_id_and_tag'
-
- disable_ddl_transaction!
-
- def up
- add_concurrent_index :deployments, [:project_id, :ref]
- add_concurrent_index :deployments, [:project_id], where: 'tag IS TRUE', name: INDEX_NAME
- end
-
- def down
- remove_concurrent_index :deployments, [:project_id, :ref]
- remove_concurrent_index :deployments, [:project_id], where: 'tag IS TRUE', name: INDEX_NAME
- end
-end
diff --git a/db/migrate/20191216074800_add_epic_date_sourcing_milestone_indexes.rb b/db/migrate/20191216074800_add_epic_date_sourcing_milestone_indexes.rb
deleted file mode 100644
index 72fd5937331..00000000000
--- a/db/migrate/20191216074800_add_epic_date_sourcing_milestone_indexes.rb
+++ /dev/null
@@ -1,29 +0,0 @@
-# frozen_string_literal: true
-
-class AddEpicDateSourcingMilestoneIndexes < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- add_concurrent_index :epics, due_date_column
- add_concurrent_index :epics, start_date_column
- end
-
- def down
- remove_concurrent_index :epics, start_date_column
- remove_concurrent_index :epics, due_date_column
- end
-
- private
-
- def due_date_column
- :due_date_sourcing_milestone_id
- end
-
- def start_date_column
- :start_date_sourcing_milestone_id
- end
-end
diff --git a/db/migrate/20191216074802_add_epic_start_date_sourcing_milestone_id_foreign_key.rb b/db/migrate/20191216074802_add_epic_start_date_sourcing_milestone_id_foreign_key.rb
deleted file mode 100644
index 1c0713ec586..00000000000
--- a/db/migrate/20191216074802_add_epic_start_date_sourcing_milestone_id_foreign_key.rb
+++ /dev/null
@@ -1,23 +0,0 @@
-# frozen_string_literal: true
-
-class AddEpicStartDateSourcingMilestoneIdForeignKey < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- add_concurrent_foreign_key :epics, :milestones, column: start_date_column, on_delete: :nullify, validate: false
- end
-
- def down
- remove_foreign_key_if_exists :epics, column: start_date_column
- end
-
- private
-
- def start_date_column
- :start_date_sourcing_milestone_id
- end
-end
diff --git a/db/migrate/20191216074803_add_epic_due_date_sourcing_milestone_id_foreign_key.rb b/db/migrate/20191216074803_add_epic_due_date_sourcing_milestone_id_foreign_key.rb
deleted file mode 100644
index 51202e358cc..00000000000
--- a/db/migrate/20191216074803_add_epic_due_date_sourcing_milestone_id_foreign_key.rb
+++ /dev/null
@@ -1,23 +0,0 @@
-# frozen_string_literal: true
-
-class AddEpicDueDateSourcingMilestoneIdForeignKey < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- add_concurrent_foreign_key :epics, :milestones, column: due_date_column, on_delete: :nullify, validate: false
- end
-
- def down
- remove_foreign_key_if_exists :epics, column: due_date_column
- end
-
- private
-
- def due_date_column
- :due_date_sourcing_milestone_id
- end
-end
diff --git a/db/migrate/20191216094119_add_id_to_plan_limits.rb b/db/migrate/20191216094119_add_id_to_plan_limits.rb
deleted file mode 100644
index 05ebd900df3..00000000000
--- a/db/migrate/20191216094119_add_id_to_plan_limits.rb
+++ /dev/null
@@ -1,13 +0,0 @@
-# frozen_string_literal: true
-
-class AddIdToPlanLimits < ActiveRecord::Migration[5.2]
- DOWNTIME = false
-
- def up
- add_column(:plan_limits, :id, :primary_key) unless column_exists?(:plan_limits, :id)
- end
-
- def down
- remove_column(:plan_limits, :id)
- end
-end
diff --git a/db/migrate/20191216183531_add_project_hooks_to_plan_limits.rb b/db/migrate/20191216183531_add_project_hooks_to_plan_limits.rb
deleted file mode 100644
index c56b6edf029..00000000000
--- a/db/migrate/20191216183531_add_project_hooks_to_plan_limits.rb
+++ /dev/null
@@ -1,9 +0,0 @@
-# frozen_string_literal: true
-
-class AddProjectHooksToPlanLimits < ActiveRecord::Migration[5.2]
- DOWNTIME = false
-
- def change
- add_column(:plan_limits, :project_hooks, :integer, default: 0, null: false)
- end
-end
diff --git a/db/migrate/20191216183532_insert_project_hooks_plan_limits.rb b/db/migrate/20191216183532_insert_project_hooks_plan_limits.rb
deleted file mode 100644
index b2c0121dd24..00000000000
--- a/db/migrate/20191216183532_insert_project_hooks_plan_limits.rb
+++ /dev/null
@@ -1,25 +0,0 @@
-# frozen_string_literal: true
-
-class InsertProjectHooksPlanLimits < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- def up
- return unless Gitlab.com?
-
- create_or_update_plan_limit('project_hooks', 'free', 10)
- create_or_update_plan_limit('project_hooks', 'bronze', 20)
- create_or_update_plan_limit('project_hooks', 'silver', 30)
- create_or_update_plan_limit('project_hooks', 'gold', 100)
- end
-
- def down
- return unless Gitlab.com?
-
- create_or_update_plan_limit('project_hooks', 'free', 0)
- create_or_update_plan_limit('project_hooks', 'bronze', 0)
- create_or_update_plan_limit('project_hooks', 'silver', 0)
- create_or_update_plan_limit('project_hooks', 'gold', 0)
- end
-end
diff --git a/db/migrate/20191217165641_add_saml_provider_prohibited_outer_forks.rb b/db/migrate/20191217165641_add_saml_provider_prohibited_outer_forks.rb
deleted file mode 100644
index 4b528578848..00000000000
--- a/db/migrate/20191217165641_add_saml_provider_prohibited_outer_forks.rb
+++ /dev/null
@@ -1,17 +0,0 @@
-# frozen_string_literal: true
-
-class AddSamlProviderProhibitedOuterForks < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- add_column_with_default :saml_providers, :prohibited_outer_forks, :boolean, default: false, allow_null: true # rubocop:disable Migration/AddColumnWithDefault
- end
-
- def down
- remove_column :saml_providers, :prohibited_outer_forks
- end
-end
diff --git a/db/migrate/20191217212348_add_modsecurity_enabled_to_ingress_application.rb b/db/migrate/20191217212348_add_modsecurity_enabled_to_ingress_application.rb
deleted file mode 100644
index 2690a5762dd..00000000000
--- a/db/migrate/20191217212348_add_modsecurity_enabled_to_ingress_application.rb
+++ /dev/null
@@ -1,16 +0,0 @@
-# frozen_string_literal: true
-
-# See http://doc.gitlab.com/ce/development/migration_style_guide.html
-# for more information on how to write migrations for GitLab.
-
-class AddModsecurityEnabledToIngressApplication < ActiveRecord::Migration[5.2]
- DOWNTIME = false
-
- def up
- add_column :clusters_applications_ingress, :modsecurity_enabled, :boolean
- end
-
- def down
- remove_column :clusters_applications_ingress, :modsecurity_enabled
- end
-end
diff --git a/db/migrate/20191218084115_add_updating_name_disabled_for_users_to_application_settings.rb b/db/migrate/20191218084115_add_updating_name_disabled_for_users_to_application_settings.rb
deleted file mode 100644
index d0b2e53650b..00000000000
--- a/db/migrate/20191218084115_add_updating_name_disabled_for_users_to_application_settings.rb
+++ /dev/null
@@ -1,20 +0,0 @@
-# frozen_string_literal: true
-
-class AddUpdatingNameDisabledForUsersToApplicationSettings < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- add_column_with_default(:application_settings, :updating_name_disabled_for_users, # rubocop:disable Migration/AddColumnWithDefault
- :boolean,
- default: false,
- allow_null: false)
- end
-
- def down
- remove_column(:application_settings, :updating_name_disabled_for_users)
- end
-end
diff --git a/db/migrate/20191218122457_add_force_pages_access_control_to_application_settings.rb b/db/migrate/20191218122457_add_force_pages_access_control_to_application_settings.rb
deleted file mode 100644
index 97352fc98ff..00000000000
--- a/db/migrate/20191218122457_add_force_pages_access_control_to_application_settings.rb
+++ /dev/null
@@ -1,12 +0,0 @@
-# frozen_string_literal: true
-
-# See http://doc.gitlab.com/ce/development/migration_style_guide.html
-# for more information on how to write migrations for GitLab.
-
-class AddForcePagesAccessControlToApplicationSettings < ActiveRecord::Migration[5.2]
- DOWNTIME = false
-
- def change
- add_column :application_settings, :force_pages_access_control, :boolean, null: false, default: false
- end
-end
diff --git a/db/migrate/20191218124915_add_repository_storage_to_snippets.rb b/db/migrate/20191218124915_add_repository_storage_to_snippets.rb
deleted file mode 100644
index e2ba11aef20..00000000000
--- a/db/migrate/20191218124915_add_repository_storage_to_snippets.rb
+++ /dev/null
@@ -1,26 +0,0 @@
-# frozen_string_literal: true
-
-class AddRepositoryStorageToSnippets < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- # rubocop:disable Migration/PreventStrings
- def up
- add_column_with_default( # rubocop:disable Migration/AddColumnWithDefault
- :snippets,
- :repository_storage,
- :string,
- default: 'default',
- limit: 255,
- allow_null: false
- )
- end
- # rubocop:enable Migration/PreventStrings
-
- def down
- remove_column(:snippets, :repository_storage)
- end
-end
diff --git a/db/migrate/20191218125015_add_storage_version_to_snippets.rb b/db/migrate/20191218125015_add_storage_version_to_snippets.rb
deleted file mode 100644
index b1bd3589692..00000000000
--- a/db/migrate/20191218125015_add_storage_version_to_snippets.rb
+++ /dev/null
@@ -1,23 +0,0 @@
-# frozen_string_literal: true
-
-class AddStorageVersionToSnippets < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- # Set this constant to true if this migration requires downtime.
- DOWNTIME = false
- disable_ddl_transaction!
-
- def up
- add_column_with_default( # rubocop:disable Migration/AddColumnWithDefault
- :snippets,
- :storage_version,
- :integer,
- default: 2,
- allow_null: false
- )
- end
-
- def down
- remove_column(:snippets, :storage_version)
- end
-end
diff --git a/db/migrate/20191218190253_add_tab_width_to_user_preferences.rb b/db/migrate/20191218190253_add_tab_width_to_user_preferences.rb
deleted file mode 100644
index b03dd8f76b9..00000000000
--- a/db/migrate/20191218190253_add_tab_width_to_user_preferences.rb
+++ /dev/null
@@ -1,9 +0,0 @@
-# frozen_string_literal: true
-
-class AddTabWidthToUserPreferences < ActiveRecord::Migration[5.2]
- DOWNTIME = false
-
- def change
- add_column(:user_preferences, :tab_width, :integer, limit: 2)
- end
-end
diff --git a/db/migrate/20191223124940_add_scheduling_type_to_ci_builds.rb b/db/migrate/20191223124940_add_scheduling_type_to_ci_builds.rb
deleted file mode 100644
index bb849aa8a95..00000000000
--- a/db/migrate/20191223124940_add_scheduling_type_to_ci_builds.rb
+++ /dev/null
@@ -1,11 +0,0 @@
-# frozen_string_literal: true
-
-class AddSchedulingTypeToCiBuilds < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- def change
- add_column :ci_builds, :scheduling_type, :integer, limit: 2 # rubocop:disable Migration/AddColumnsToWideTables
- end
-end
diff --git a/db/migrate/20191225071320_add_index_to_elasticsearch_indexed_namespaces.rb b/db/migrate/20191225071320_add_index_to_elasticsearch_indexed_namespaces.rb
deleted file mode 100644
index 758838cb775..00000000000
--- a/db/migrate/20191225071320_add_index_to_elasticsearch_indexed_namespaces.rb
+++ /dev/null
@@ -1,17 +0,0 @@
-# frozen_string_literal: true
-
-class AddIndexToElasticsearchIndexedNamespaces < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- add_concurrent_index(:elasticsearch_indexed_namespaces, :created_at)
- end
-
- def down
- remove_concurrent_index(:elasticsearch_indexed_namespaces, :created_at)
- end
-end
diff --git a/db/migrate/20191227140254_update_personal_access_tokens_user_id_foreign_key.rb b/db/migrate/20191227140254_update_personal_access_tokens_user_id_foreign_key.rb
deleted file mode 100644
index fbf17b28274..00000000000
--- a/db/migrate/20191227140254_update_personal_access_tokens_user_id_foreign_key.rb
+++ /dev/null
@@ -1,20 +0,0 @@
-# frozen_string_literal: true
-
-class UpdatePersonalAccessTokensUserIdForeignKey < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
- CONSTRAINT_NAME = 'fk_personal_access_tokens_user_id'
-
- disable_ddl_transaction!
-
- def up
- add_concurrent_foreign_key(:personal_access_tokens, :users, column: :user_id, on_delete: :cascade, name: CONSTRAINT_NAME)
- remove_foreign_key_if_exists(:personal_access_tokens, column: :user_id, on_delete: nil)
- end
-
- def down
- add_concurrent_foreign_key(:personal_access_tokens, :users, column: :user_id, on_delete: nil)
- remove_foreign_key_if_exists(:personal_access_tokens, column: :user_id, on_delete: :cascade, name: CONSTRAINT_NAME)
- end
-end
diff --git a/db/migrate/20191229140154_drop_index_ci_pipelines_on_project_id.rb b/db/migrate/20191229140154_drop_index_ci_pipelines_on_project_id.rb
deleted file mode 100644
index 9e78457b007..00000000000
--- a/db/migrate/20191229140154_drop_index_ci_pipelines_on_project_id.rb
+++ /dev/null
@@ -1,20 +0,0 @@
-# frozen_string_literal: true
-
-class DropIndexCiPipelinesOnProjectId < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- remove_concurrent_index_by_name :ci_pipelines, 'index_ci_pipelines_on_project_id'
-
- # extra (duplicate) index that already existed on some installs
- remove_concurrent_index_by_name :ci_pipelines, 'ci_pipelines_project_id_idx'
- end
-
- def down
- add_concurrent_index :ci_pipelines, :project_id, name: 'index_ci_pipelines_on_project_id'
- end
-end
diff --git a/db/migrate/20210629031900_associate_existing_dast_builds_with_variables.rb b/db/migrate/20210629031900_associate_existing_dast_builds_with_variables.rb
index 5db39334550..3d81db87143 100644
--- a/db/migrate/20210629031900_associate_existing_dast_builds_with_variables.rb
+++ b/db/migrate/20210629031900_associate_existing_dast_builds_with_variables.rb
@@ -20,6 +20,7 @@ class AssociateExistingDastBuildsWithVariables < ActiveRecord::Migration[6.1]
class Build < ApplicationRecord
self.table_name = 'ci_builds'
self.inheritance_column = :_type_disabled
+ self.gitlab_schema = :gitlab_ci
default_scope { where(name: :dast, stage: :dast) } # rubocop:disable Cop/DefaultScope
end
diff --git a/db/migrate/20210819185500_create_external_audit_event_destinations_table.rb b/db/migrate/20210819185500_create_external_audit_event_destinations_table.rb
new file mode 100644
index 00000000000..bf0725a77a0
--- /dev/null
+++ b/db/migrate/20210819185500_create_external_audit_event_destinations_table.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+class CreateExternalAuditEventDestinationsTable < Gitlab::Database::Migration[1.0]
+ enable_lock_retries!
+
+ def change
+ create_table :audit_events_external_audit_event_destinations do |t|
+ t.references :namespace, index: false, null: false, foreign_key: { on_delete: :cascade }
+ t.text :destination_url, null: false, limit: 255 # rubocop:disable Migration/AddLimitToTextColumns
+ t.timestamps_with_timezone null: false
+
+ t.index [:namespace_id, :destination_url], unique: true, name: 'index_external_audit_event_destinations_on_namespace_id'
+ end
+ end
+end
diff --git a/db/migrate/20210908195506_add_data_to_vulnerability_finding_evidence.rb b/db/migrate/20210908195506_add_data_to_vulnerability_finding_evidence.rb
new file mode 100644
index 00000000000..447508d3d5b
--- /dev/null
+++ b/db/migrate/20210908195506_add_data_to_vulnerability_finding_evidence.rb
@@ -0,0 +1,7 @@
+# frozen_string_literal: true
+
+class AddDataToVulnerabilityFindingEvidence < Gitlab::Database::Migration[1.0]
+ def change
+ add_column :vulnerability_finding_evidences, :data, :jsonb, default: {}, null: false
+ end
+end
diff --git a/db/migrate/20210910014741_add_dependency_proxy_ttl_group_policy_worker_capacity_to_application_settings.rb b/db/migrate/20210910014741_add_dependency_proxy_ttl_group_policy_worker_capacity_to_application_settings.rb
new file mode 100644
index 00000000000..52fab5a63ee
--- /dev/null
+++ b/db/migrate/20210910014741_add_dependency_proxy_ttl_group_policy_worker_capacity_to_application_settings.rb
@@ -0,0 +1,11 @@
+# frozen_string_literal: true
+
+class AddDependencyProxyTtlGroupPolicyWorkerCapacityToApplicationSettings < Gitlab::Database::Migration[1.0]
+ def change
+ add_column :application_settings,
+ :dependency_proxy_ttl_group_policy_worker_capacity,
+ :smallint,
+ default: 2,
+ null: false
+ end
+end
diff --git a/db/migrate/20210910015047_add_app_settings_dep_proxy_ttl_worker_capacity_check_constraint.rb b/db/migrate/20210910015047_add_app_settings_dep_proxy_ttl_worker_capacity_check_constraint.rb
new file mode 100644
index 00000000000..9b522f2874f
--- /dev/null
+++ b/db/migrate/20210910015047_add_app_settings_dep_proxy_ttl_worker_capacity_check_constraint.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+class AddAppSettingsDepProxyTtlWorkerCapacityCheckConstraint < Gitlab::Database::Migration[1.0]
+ CONSTRAINT_NAME = 'app_settings_dep_proxy_ttl_policies_worker_capacity_positive'
+
+ disable_ddl_transaction!
+
+ def up
+ add_check_constraint :application_settings, 'dependency_proxy_ttl_group_policy_worker_capacity >= 0', CONSTRAINT_NAME
+ end
+
+ def down
+ remove_check_constraint :application_settings, CONSTRAINT_NAME
+ end
+end
diff --git a/db/migrate/20210910192921_add_report_type_into_approval_project_rules.rb b/db/migrate/20210910192921_add_report_type_into_approval_project_rules.rb
new file mode 100644
index 00000000000..4b147034657
--- /dev/null
+++ b/db/migrate/20210910192921_add_report_type_into_approval_project_rules.rb
@@ -0,0 +1,11 @@
+# frozen_string_literal: true
+
+class AddReportTypeIntoApprovalProjectRules < Gitlab::Database::Migration[1.0]
+ def up
+ add_column :approval_project_rules, :report_type, :integer, limit: 2
+ end
+
+ def down
+ remove_column :approval_project_rules, :report_type
+ end
+end
diff --git a/db/migrate/20210912034903_add_runner_features_to_ci_builds_metadata.rb b/db/migrate/20210912034903_add_runner_features_to_ci_builds_metadata.rb
new file mode 100644
index 00000000000..83eddf2fb0d
--- /dev/null
+++ b/db/migrate/20210912034903_add_runner_features_to_ci_builds_metadata.rb
@@ -0,0 +1,9 @@
+# frozen_string_literal: true
+
+class AddRunnerFeaturesToCiBuildsMetadata < Gitlab::Database::Migration[1.0]
+ enable_lock_retries!
+
+ def change
+ add_column :ci_builds_metadata, :runner_features, :jsonb, default: {}, null: false
+ end
+end
diff --git a/db/migrate/20210913224558_update_dependency_proxy_manifests_uniqueness_constraint.rb b/db/migrate/20210913224558_update_dependency_proxy_manifests_uniqueness_constraint.rb
new file mode 100644
index 00000000000..845697c28b5
--- /dev/null
+++ b/db/migrate/20210913224558_update_dependency_proxy_manifests_uniqueness_constraint.rb
@@ -0,0 +1,18 @@
+# frozen_string_literal: true
+
+class UpdateDependencyProxyManifestsUniquenessConstraint < Gitlab::Database::Migration[1.0]
+ disable_ddl_transaction!
+
+ NEW_INDEX_NAME = 'index_dep_prox_manifests_on_group_id_file_name_and_status'
+ OLD_INDEX_NAME = 'index_dependency_proxy_manifests_on_group_id_and_file_name'
+
+ def up
+ add_concurrent_index :dependency_proxy_manifests, [:group_id, :file_name, :status], unique: true, name: NEW_INDEX_NAME
+ remove_concurrent_index_by_name :dependency_proxy_manifests, OLD_INDEX_NAME
+ end
+
+ def down
+ add_concurrent_index :dependency_proxy_manifests, [:group_id, :file_name], unique: true, name: OLD_INDEX_NAME
+ remove_concurrent_index_by_name :dependency_proxy_manifests, NEW_INDEX_NAME
+ end
+end
diff --git a/db/migrate/20210914145810_add_throttle_deprecated_api_columns.rb b/db/migrate/20210914145810_add_throttle_deprecated_api_columns.rb
new file mode 100644
index 00000000000..6e57429bca8
--- /dev/null
+++ b/db/migrate/20210914145810_add_throttle_deprecated_api_columns.rb
@@ -0,0 +1,13 @@
+# frozen_string_literal: true
+
+class AddThrottleDeprecatedApiColumns < Gitlab::Database::Migration[1.0]
+ def change
+ add_column :application_settings, :throttle_unauthenticated_deprecated_api_requests_per_period, :integer, default: 3600, null: false
+ add_column :application_settings, :throttle_unauthenticated_deprecated_api_period_in_seconds, :integer, default: 3600, null: false
+ add_column :application_settings, :throttle_unauthenticated_deprecated_api_enabled, :boolean, default: false, null: false
+
+ add_column :application_settings, :throttle_authenticated_deprecated_api_requests_per_period, :integer, default: 3600, null: false
+ add_column :application_settings, :throttle_authenticated_deprecated_api_period_in_seconds, :integer, default: 1800, null: false
+ add_column :application_settings, :throttle_authenticated_deprecated_api_enabled, :boolean, default: false, null: false
+ end
+end
diff --git a/db/migrate/20210914172202_add_status_index_to_dependency_proxy_tables.rb b/db/migrate/20210914172202_add_status_index_to_dependency_proxy_tables.rb
new file mode 100644
index 00000000000..9b593fbe540
--- /dev/null
+++ b/db/migrate/20210914172202_add_status_index_to_dependency_proxy_tables.rb
@@ -0,0 +1,18 @@
+# frozen_string_literal: true
+
+class AddStatusIndexToDependencyProxyTables < Gitlab::Database::Migration[1.0]
+ MANIFEST_INDEX_NAME = 'index_dependency_proxy_manifests_on_status'
+ BLOB_INDEX_NAME = 'index_dependency_proxy_blobs_on_status'
+
+ disable_ddl_transaction!
+
+ def up
+ add_concurrent_index :dependency_proxy_manifests, :status, name: MANIFEST_INDEX_NAME
+ add_concurrent_index :dependency_proxy_blobs, :status, name: BLOB_INDEX_NAME
+ end
+
+ def down
+ remove_concurrent_index_by_name :dependency_proxy_manifests, MANIFEST_INDEX_NAME
+ remove_concurrent_index_by_name :dependency_proxy_blobs, BLOB_INDEX_NAME
+ end
+end
diff --git a/db/migrate/20210915000453_add_index_on_clusters_integration_prometheus_enabled.rb b/db/migrate/20210915000453_add_index_on_clusters_integration_prometheus_enabled.rb
new file mode 100644
index 00000000000..35cd18c1da9
--- /dev/null
+++ b/db/migrate/20210915000453_add_index_on_clusters_integration_prometheus_enabled.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+class AddIndexOnClustersIntegrationPrometheusEnabled < Gitlab::Database::Migration[1.0]
+ disable_ddl_transaction!
+
+ INDEX_NAME = 'index_clusters_integration_prometheus_enabled'
+
+ def up
+ add_concurrent_index(:clusters_integration_prometheus, [:enabled, :created_at, :cluster_id], name: INDEX_NAME)
+ end
+
+ def down
+ remove_concurrent_index_by_name(:clusters_integration_prometheus, INDEX_NAME)
+ end
+end
diff --git a/db/migrate/20210915001242_add_index_on_clusters_integration_elastic_stack_enabled.rb b/db/migrate/20210915001242_add_index_on_clusters_integration_elastic_stack_enabled.rb
new file mode 100644
index 00000000000..bdaa84f27fe
--- /dev/null
+++ b/db/migrate/20210915001242_add_index_on_clusters_integration_elastic_stack_enabled.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+class AddIndexOnClustersIntegrationElasticStackEnabled < Gitlab::Database::Migration[1.0]
+ disable_ddl_transaction!
+
+ INDEX_NAME = 'index_clusters_integration_elasticstack_enabled'
+
+ def up
+ add_concurrent_index(:clusters_integration_elasticstack, [:enabled, :created_at, :cluster_id], name: INDEX_NAME)
+ end
+
+ def down
+ remove_concurrent_index_by_name(:clusters_integration_elasticstack, INDEX_NAME)
+ end
+end
diff --git a/db/migrate/20210915070423_add_avatar_and_description_to_topic.rb b/db/migrate/20210915070423_add_avatar_and_description_to_topic.rb
new file mode 100644
index 00000000000..2ceeb53cd1e
--- /dev/null
+++ b/db/migrate/20210915070423_add_avatar_and_description_to_topic.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+class AddAvatarAndDescriptionToTopic < Gitlab::Database::Migration[1.0]
+ # rubocop:disable Migration/AddLimitToTextColumns
+ def up
+ add_column :topics, :avatar, :text
+ add_column :topics, :description, :text
+ end
+ # rubocop:enable Migration/AddLimitToTextColumns
+
+ def down
+ remove_column :topics, :avatar
+ remove_column :topics, :description
+ end
+end
diff --git a/db/migrate/20210916132547_add_process_mode_to_resource_groups.rb b/db/migrate/20210916132547_add_process_mode_to_resource_groups.rb
new file mode 100644
index 00000000000..6bac264fcf4
--- /dev/null
+++ b/db/migrate/20210916132547_add_process_mode_to_resource_groups.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+class AddProcessModeToResourceGroups < Gitlab::Database::Migration[1.0]
+ enable_lock_retries!
+
+ PROCESS_MODE_UNORDERED = 0
+
+ def up
+ add_column :ci_resource_groups, :process_mode, :integer, default: PROCESS_MODE_UNORDERED, null: false, limit: 2
+ end
+
+ def down
+ remove_column :ci_resource_groups, :process_mode
+ end
+end
diff --git a/db/migrate/20210917134321_remove_temporary_index_for_project_topics_on_taggings.rb b/db/migrate/20210917134321_remove_temporary_index_for_project_topics_on_taggings.rb
new file mode 100644
index 00000000000..ac4821b8007
--- /dev/null
+++ b/db/migrate/20210917134321_remove_temporary_index_for_project_topics_on_taggings.rb
@@ -0,0 +1,20 @@
+# frozen_string_literal: true
+
+class RemoveTemporaryIndexForProjectTopicsOnTaggings < Gitlab::Database::Migration[1.0]
+ MIGRATION = 'ExtractProjectTopicsIntoSeparateTable'
+ INDEX_NAME = 'tmp_index_taggings_on_id_where_taggable_type_project'
+ INDEX_CONDITION = "taggable_type = 'Project'"
+
+ disable_ddl_transaction!
+
+ def up
+ # Ensure that no background jobs of 20210730104800_schedule_extract_project_topics_into_separate_table remain
+ finalize_background_migration MIGRATION
+ # this index was used in 20210730104800_schedule_extract_project_topics_into_separate_table
+ remove_concurrent_index_by_name :taggings, INDEX_NAME
+ end
+
+ def down
+ add_concurrent_index :taggings, :id, where: INDEX_CONDITION, name: INDEX_NAME # rubocop:disable Migration/PreventIndexCreation
+ end
+end
diff --git a/db/migrate/20210917153645_remove_pipeline_fk_from_packages_build_infos.rb b/db/migrate/20210917153645_remove_pipeline_fk_from_packages_build_infos.rb
new file mode 100644
index 00000000000..456788de521
--- /dev/null
+++ b/db/migrate/20210917153645_remove_pipeline_fk_from_packages_build_infos.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+class RemovePipelineFkFromPackagesBuildInfos < Gitlab::Database::Migration[1.0]
+ disable_ddl_transaction!
+
+ def up
+ with_lock_retries do
+ remove_foreign_key_if_exists(:packages_build_infos, :ci_pipelines)
+ end
+ end
+
+ def down
+ add_concurrent_foreign_key(:packages_build_infos, :ci_pipelines, column: :pipeline_id, on_delete: :nullify)
+ end
+end
diff --git a/db/migrate/20210917153905_remove_pipeline_fk_from_packages_package_file_build_infos.rb b/db/migrate/20210917153905_remove_pipeline_fk_from_packages_package_file_build_infos.rb
new file mode 100644
index 00000000000..187ddc8a088
--- /dev/null
+++ b/db/migrate/20210917153905_remove_pipeline_fk_from_packages_package_file_build_infos.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+class RemovePipelineFkFromPackagesPackageFileBuildInfos < Gitlab::Database::Migration[1.0]
+ disable_ddl_transaction!
+
+ def up
+ with_lock_retries do
+ remove_foreign_key_if_exists(:packages_package_file_build_infos, :ci_pipelines)
+ end
+ end
+
+ def down
+ add_concurrent_foreign_key(:packages_package_file_build_infos, :ci_pipelines, column: :pipeline_id, on_delete: :nullify)
+ end
+end
diff --git a/db/migrate/20210917224419_add_registration_objective_to_user_detail.rb b/db/migrate/20210917224419_add_registration_objective_to_user_detail.rb
new file mode 100644
index 00000000000..ee7a474928e
--- /dev/null
+++ b/db/migrate/20210917224419_add_registration_objective_to_user_detail.rb
@@ -0,0 +1,7 @@
+# frozen_string_literal: true
+
+class AddRegistrationObjectiveToUserDetail < Gitlab::Database::Migration[1.0]
+ def change
+ add_column :user_details, :registration_objective, :smallint
+ end
+end
diff --git a/db/migrate/20210920104446_add_text_limit_to_topics_description_and_avatar.rb b/db/migrate/20210920104446_add_text_limit_to_topics_description_and_avatar.rb
new file mode 100644
index 00000000000..83ceaa58ff4
--- /dev/null
+++ b/db/migrate/20210920104446_add_text_limit_to_topics_description_and_avatar.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+class AddTextLimitToTopicsDescriptionAndAvatar < Gitlab::Database::Migration[1.0]
+ disable_ddl_transaction!
+
+ def up
+ add_text_limit :topics, :description, 1024
+ add_text_limit :topics, :avatar, 255
+ end
+
+ def down
+ remove_text_limit :topics, :avatar
+ remove_text_limit :topics, :description
+ end
+end
diff --git a/db/migrate/20210921032008_add_suggest_pipeline_enabled_to_application_settings.rb b/db/migrate/20210921032008_add_suggest_pipeline_enabled_to_application_settings.rb
new file mode 100644
index 00000000000..5ac12eccc7d
--- /dev/null
+++ b/db/migrate/20210921032008_add_suggest_pipeline_enabled_to_application_settings.rb
@@ -0,0 +1,7 @@
+# frozen_string_literal: true
+
+class AddSuggestPipelineEnabledToApplicationSettings < Gitlab::Database::Migration[1.0]
+ def change
+ add_column :application_settings, :suggest_pipeline_enabled, :boolean, default: true, null: false
+ end
+end
diff --git a/db/migrate/20210921063924_index_labels_using_varchar_pattern_ops.rb b/db/migrate/20210921063924_index_labels_using_varchar_pattern_ops.rb
new file mode 100644
index 00000000000..67975636488
--- /dev/null
+++ b/db/migrate/20210921063924_index_labels_using_varchar_pattern_ops.rb
@@ -0,0 +1,39 @@
+# frozen_string_literal: true
+
+class IndexLabelsUsingVarcharPatternOps < Gitlab::Database::Migration[1.0]
+ disable_ddl_transaction!
+
+ NEW_TITLE_INDEX_NAME = 'index_labels_on_title_varchar'
+ NEW_PROJECT_ID_TITLE_INDEX_NAME = 'index_labels_on_project_id_and_title_varchar_unique'
+ NEW_GROUP_ID_TITLE_INDEX_NAME = 'index_labels_on_group_id_and_title_varchar_unique'
+ NEW_GROUP_ID_INDEX_NAME = 'index_labels_on_group_id'
+
+ OLD_TITLE_INDEX_NAME = 'index_labels_on_title'
+ OLD_PROJECT_ID_TITLE_INDEX_NAME = 'index_labels_on_project_id_and_title_unique'
+ OLD_GROUP_ID_TITLE_INDEX_NAME = 'index_labels_on_group_id_and_title_unique'
+ OLD_GROUP_ID_PROJECT_ID_TITLE_INDEX_NAME = 'index_labels_on_group_id_and_project_id_and_title'
+
+ def up
+ add_concurrent_index :labels, :title, order: { title: :varchar_pattern_ops }, name: NEW_TITLE_INDEX_NAME
+ add_concurrent_index :labels, [:project_id, :title], where: "labels.group_id IS NULL", unique: true, order: { title: :varchar_pattern_ops }, name: NEW_PROJECT_ID_TITLE_INDEX_NAME
+ add_concurrent_index :labels, [:group_id, :title], where: "labels.project_id IS NULL", unique: true, order: { title: :varchar_pattern_ops }, name: NEW_GROUP_ID_TITLE_INDEX_NAME
+ add_concurrent_index :labels, :group_id, name: NEW_GROUP_ID_INDEX_NAME
+
+ remove_concurrent_index_by_name :labels, OLD_TITLE_INDEX_NAME
+ remove_concurrent_index_by_name :labels, OLD_PROJECT_ID_TITLE_INDEX_NAME
+ remove_concurrent_index_by_name :labels, OLD_GROUP_ID_TITLE_INDEX_NAME
+ remove_concurrent_index_by_name :labels, OLD_GROUP_ID_PROJECT_ID_TITLE_INDEX_NAME
+ end
+
+ def down
+ add_concurrent_index :labels, :title, name: OLD_TITLE_INDEX_NAME
+ add_concurrent_index :labels, [:project_id, :title], where: "labels.group_id IS NULL", unique: true, name: OLD_PROJECT_ID_TITLE_INDEX_NAME
+ add_concurrent_index :labels, [:group_id, :title], where: "labels.project_id IS NULL", unique: true, name: OLD_GROUP_ID_TITLE_INDEX_NAME
+ add_concurrent_index :labels, [:group_id, :project_id, :title], unique: true, name: OLD_GROUP_ID_PROJECT_ID_TITLE_INDEX_NAME
+
+ remove_concurrent_index_by_name :labels, NEW_TITLE_INDEX_NAME
+ remove_concurrent_index_by_name :labels, NEW_PROJECT_ID_TITLE_INDEX_NAME
+ remove_concurrent_index_by_name :labels, NEW_GROUP_ID_TITLE_INDEX_NAME
+ remove_concurrent_index_by_name :labels, NEW_GROUP_ID_INDEX_NAME
+ end
+end
diff --git a/db/migrate/20210921191010_add_report_type_index_into_approval_project_rules.rb b/db/migrate/20210921191010_add_report_type_index_into_approval_project_rules.rb
new file mode 100644
index 00000000000..c03c463b9bb
--- /dev/null
+++ b/db/migrate/20210921191010_add_report_type_index_into_approval_project_rules.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+class AddReportTypeIndexIntoApprovalProjectRules < Gitlab::Database::Migration[1.0]
+ disable_ddl_transaction!
+
+ INDEX_NAME = 'index_approval_project_rules_report_type'
+
+ def up
+ add_concurrent_index :approval_project_rules, :report_type, name: INDEX_NAME
+ end
+
+ def down
+ remove_concurrent_index_by_name :approval_project_rules, name: INDEX_NAME
+ end
+end
diff --git a/db/migrate/20210922172056_add_unique_namespaces_index_on_name_parent_id_and_type.rb b/db/migrate/20210922172056_add_unique_namespaces_index_on_name_parent_id_and_type.rb
new file mode 100644
index 00000000000..6cbbe582ff6
--- /dev/null
+++ b/db/migrate/20210922172056_add_unique_namespaces_index_on_name_parent_id_and_type.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+class AddUniqueNamespacesIndexOnNameParentIdAndType < Gitlab::Database::Migration[1.0]
+ INDEX_NAME = 'index_namespaces_name_parent_id_type'
+
+ disable_ddl_transaction!
+
+ def up
+ add_concurrent_index :namespaces, [:name, :parent_id, :type], unique: true, name: INDEX_NAME
+ end
+
+ def down
+ remove_concurrent_index_by_name :namespaces, INDEX_NAME
+ end
+end
diff --git a/db/migrate/20210922172156_drop_unique_namespaces_index_on_name_and_parent_id.rb b/db/migrate/20210922172156_drop_unique_namespaces_index_on_name_and_parent_id.rb
new file mode 100644
index 00000000000..001f3a6964b
--- /dev/null
+++ b/db/migrate/20210922172156_drop_unique_namespaces_index_on_name_and_parent_id.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+class DropUniqueNamespacesIndexOnNameAndParentId < Gitlab::Database::Migration[1.0]
+ INDEX_NAME = 'index_namespaces_on_name_and_parent_id'
+
+ disable_ddl_transaction!
+
+ def up
+ remove_concurrent_index_by_name :namespaces, INDEX_NAME
+ end
+
+ def down
+ add_concurrent_index :namespaces, [:name, :parent_id], unique: true, name: INDEX_NAME
+ end
+end
diff --git a/db/migrate/20210922215740_create_issue_customer_relations_contacts.rb b/db/migrate/20210922215740_create_issue_customer_relations_contacts.rb
new file mode 100644
index 00000000000..2d89d295608
--- /dev/null
+++ b/db/migrate/20210922215740_create_issue_customer_relations_contacts.rb
@@ -0,0 +1,14 @@
+# frozen_string_literal: true
+
+class CreateIssueCustomerRelationsContacts < Gitlab::Database::Migration[1.0]
+ def change
+ create_table :issue_customer_relations_contacts do |t|
+ t.bigint :issue_id, null: false
+ t.bigint :contact_id, null: false
+ t.timestamps_with_timezone null: false
+
+ t.index :contact_id
+ t.index [:issue_id, :contact_id], unique: true, name: :index_issue_crm_contacts_on_issue_id_and_contact_id
+ end
+ end
+end
diff --git a/db/migrate/20210922220104_add_issue_customer_relations_contacts_foreign_keys.rb b/db/migrate/20210922220104_add_issue_customer_relations_contacts_foreign_keys.rb
new file mode 100644
index 00000000000..7be465ca31a
--- /dev/null
+++ b/db/migrate/20210922220104_add_issue_customer_relations_contacts_foreign_keys.rb
@@ -0,0 +1,20 @@
+# frozen_string_literal: true
+
+class AddIssueCustomerRelationsContactsForeignKeys < Gitlab::Database::Migration[1.0]
+ disable_ddl_transaction!
+
+ def up
+ add_concurrent_foreign_key :issue_customer_relations_contacts, :issues, column: :issue_id
+ add_concurrent_foreign_key :issue_customer_relations_contacts, :customer_relations_contacts, column: :contact_id
+ end
+
+ def down
+ with_lock_retries do
+ remove_foreign_key_if_exists :issue_customer_relations_contacts, column: :issue_id
+ end
+
+ with_lock_retries do
+ remove_foreign_key_if_exists :issue_customer_relations_contacts, column: :contact_id
+ end
+ end
+end
diff --git a/db/migrate/20210923042323_add_meta_data_to_user_credit_card_validations.rb b/db/migrate/20210923042323_add_meta_data_to_user_credit_card_validations.rb
new file mode 100644
index 00000000000..2958285e7a5
--- /dev/null
+++ b/db/migrate/20210923042323_add_meta_data_to_user_credit_card_validations.rb
@@ -0,0 +1,13 @@
+# frozen_string_literal: true
+
+class AddMetaDataToUserCreditCardValidations < Gitlab::Database::Migration[1.0]
+ # rubocop:disable Migration/AddLimitToTextColumns
+ def change
+ change_table :user_credit_card_validations do |t|
+ t.date :expiration_date
+ t.integer :last_digits, limit: 2 # last 4 digits
+ t.text :holder_name
+ end
+ end
+ # rubocop:enable Migration/AddLimitToTextColumns
+end
diff --git a/db/migrate/20210923042324_limit_holder_name_on_user_credit_card_validations.rb b/db/migrate/20210923042324_limit_holder_name_on_user_credit_card_validations.rb
new file mode 100644
index 00000000000..11d436093b7
--- /dev/null
+++ b/db/migrate/20210923042324_limit_holder_name_on_user_credit_card_validations.rb
@@ -0,0 +1,23 @@
+# frozen_string_literal: true
+
+class LimitHolderNameOnUserCreditCardValidations < Gitlab::Database::Migration[1.0]
+ disable_ddl_transaction!
+
+ def up
+ add_text_limit :user_credit_card_validations, :holder_name, 26 # ISO IEC 7813
+
+ add_check_constraint(:user_credit_card_validations, 'last_digits BETWEEN 0 AND 9999', constraint_name)
+ end
+
+ def down
+ remove_text_limit :user_credit_card_validations, :holder_name
+
+ remove_check_constraint(:user_credit_card_validations, constraint_name)
+ end
+
+ private
+
+ def constraint_name
+ check_constraint_name(:user_credit_card_validations, :last_digits, 'range')
+ end
+end
diff --git a/db/migrate/20210923042325_index_meta_data_on_user_credit_card_validations.rb b/db/migrate/20210923042325_index_meta_data_on_user_credit_card_validations.rb
new file mode 100644
index 00000000000..cc4f4d35f09
--- /dev/null
+++ b/db/migrate/20210923042325_index_meta_data_on_user_credit_card_validations.rb
@@ -0,0 +1,19 @@
+# frozen_string_literal: true
+
+class IndexMetaDataOnUserCreditCardValidations < Gitlab::Database::Migration[1.0]
+ disable_ddl_transaction!
+
+ INDEX_NAME = 'index_user_credit_card_validations_meta_data_full_match'
+
+ def up
+ add_concurrent_index :user_credit_card_validations,
+ [:holder_name, :expiration_date, :last_digits, :credit_card_validated_at],
+ name: INDEX_NAME
+ end
+
+ def down
+ remove_concurrent_index :user_credit_card_validations,
+ [:holder_name, :expiration_date, :last_digits, :credit_card_validated_at],
+ name: INDEX_NAME
+ end
+end
diff --git a/db/migrate/20210923151641_change_default_for_integrated_error_tracking.rb b/db/migrate/20210923151641_change_default_for_integrated_error_tracking.rb
new file mode 100644
index 00000000000..fc4cc1945f3
--- /dev/null
+++ b/db/migrate/20210923151641_change_default_for_integrated_error_tracking.rb
@@ -0,0 +1,11 @@
+# frozen_string_literal: true
+
+class ChangeDefaultForIntegratedErrorTracking < Gitlab::Database::Migration[1.0]
+ def up
+ change_column_default :project_error_tracking_settings, :integrated, from: false, to: true
+ end
+
+ def down
+ change_column_default :project_error_tracking_settings, :integrated, from: true, to: false
+ end
+end
diff --git a/db/migrate/20210928155022_improve_index_for_error_tracking.rb b/db/migrate/20210928155022_improve_index_for_error_tracking.rb
new file mode 100644
index 00000000000..ec8427670d7
--- /dev/null
+++ b/db/migrate/20210928155022_improve_index_for_error_tracking.rb
@@ -0,0 +1,33 @@
+# frozen_string_literal: true
+
+class ImproveIndexForErrorTracking < Gitlab::Database::Migration[1.0]
+ disable_ddl_transaction!
+
+ def up
+ add_concurrent_index :error_tracking_errors, %i(project_id status last_seen_at id),
+ order: { last_seen_at: :desc, id: :desc },
+ name: 'index_et_errors_on_project_id_and_status_last_seen_at_id_desc'
+
+ add_concurrent_index :error_tracking_errors, %i(project_id status first_seen_at id),
+ order: { first_seen_at: :desc, id: :desc },
+ name: 'index_et_errors_on_project_id_and_status_first_seen_at_id_desc'
+
+ add_concurrent_index :error_tracking_errors, %i(project_id status events_count id),
+ order: { events_count: :desc, id: :desc },
+ name: 'index_et_errors_on_project_id_and_status_events_count_id_desc'
+
+ remove_concurrent_index :error_tracking_errors, [:project_id, :status, :last_seen_at], name: 'index_et_errors_on_project_id_and_status_and_last_seen_at'
+ remove_concurrent_index :error_tracking_errors, [:project_id, :status, :first_seen_at], name: 'index_et_errors_on_project_id_and_status_and_first_seen_at'
+ remove_concurrent_index :error_tracking_errors, [:project_id, :status, :events_count], name: 'index_et_errors_on_project_id_and_status_and_events_count'
+ end
+
+ def down
+ add_concurrent_index :error_tracking_errors, [:project_id, :status, :last_seen_at], name: 'index_et_errors_on_project_id_and_status_and_last_seen_at'
+ add_concurrent_index :error_tracking_errors, [:project_id, :status, :first_seen_at], name: 'index_et_errors_on_project_id_and_status_and_first_seen_at'
+ add_concurrent_index :error_tracking_errors, [:project_id, :status, :events_count], name: 'index_et_errors_on_project_id_and_status_and_events_count'
+
+ remove_concurrent_index :error_tracking_errors, [:project_id, :status, :last_seen_at, :id], name: 'index_et_errors_on_project_id_and_status_last_seen_at_id_desc'
+ remove_concurrent_index :error_tracking_errors, [:project_id, :status, :first_seen_at, :id], name: 'index_et_errors_on_project_id_and_status_first_seen_at_id_desc'
+ remove_concurrent_index :error_tracking_errors, [:project_id, :status, :events_count, :id], name: 'index_et_errors_on_project_id_and_status_events_count_id_desc'
+ end
+end
diff --git a/db/migrate/20210928171122_add_group_id_status_id_index_to_dependency_proxy_tables.rb b/db/migrate/20210928171122_add_group_id_status_id_index_to_dependency_proxy_tables.rb
new file mode 100644
index 00000000000..ef437641f2c
--- /dev/null
+++ b/db/migrate/20210928171122_add_group_id_status_id_index_to_dependency_proxy_tables.rb
@@ -0,0 +1,18 @@
+# frozen_string_literal: true
+
+class AddGroupIdStatusIdIndexToDependencyProxyTables < Gitlab::Database::Migration[1.0]
+ MANIFEST_INDEX_NAME = 'index_dependency_proxy_manifests_on_group_id_status_and_id'
+ BLOB_INDEX_NAME = 'index_dependency_proxy_blobs_on_group_id_status_and_id'
+
+ disable_ddl_transaction!
+
+ def up
+ add_concurrent_index :dependency_proxy_manifests, [:group_id, :status, :id], name: MANIFEST_INDEX_NAME
+ add_concurrent_index :dependency_proxy_blobs, [:group_id, :status, :id], name: BLOB_INDEX_NAME
+ end
+
+ def down
+ remove_concurrent_index_by_name :dependency_proxy_manifests, MANIFEST_INDEX_NAME
+ remove_concurrent_index_by_name :dependency_proxy_blobs, BLOB_INDEX_NAME
+ end
+end
diff --git a/db/migrate/20210929025600_add_phone_to_user_details.rb b/db/migrate/20210929025600_add_phone_to_user_details.rb
new file mode 100644
index 00000000000..9bcfd4ab7e3
--- /dev/null
+++ b/db/migrate/20210929025600_add_phone_to_user_details.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+class AddPhoneToUserDetails < Gitlab::Database::Migration[1.0]
+ enable_lock_retries!
+
+ # rubocop:disable Migration/AddLimitToTextColumns
+ def up
+ add_column :user_details, :phone, :text, comment: 'JiHu-specific column'
+ end
+ # rubocop:enable Migration/AddLimitToTextColumns
+
+ def down
+ remove_column :user_details, :phone
+ end
+end
diff --git a/db/migrate/20210929030834_add_text_limit_to_user_details_phone.rb b/db/migrate/20210929030834_add_text_limit_to_user_details_phone.rb
new file mode 100644
index 00000000000..f250aad3253
--- /dev/null
+++ b/db/migrate/20210929030834_add_text_limit_to_user_details_phone.rb
@@ -0,0 +1,13 @@
+# frozen_string_literal: true
+
+class AddTextLimitToUserDetailsPhone < Gitlab::Database::Migration[1.0]
+ disable_ddl_transaction!
+
+ def up
+ add_text_limit :user_details, :phone, 32
+ end
+
+ def down
+ remove_text_limit :user_details, :phone
+ end
+end
diff --git a/db/migrate/20210929031049_add_unique_index_phone_on_user_details.rb b/db/migrate/20210929031049_add_unique_index_phone_on_user_details.rb
new file mode 100644
index 00000000000..e0cf7aa8a44
--- /dev/null
+++ b/db/migrate/20210929031049_add_unique_index_phone_on_user_details.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+class AddUniqueIndexPhoneOnUserDetails < Gitlab::Database::Migration[1.0]
+ disable_ddl_transaction!
+
+ INDEX_NAME = 'index_user_details_on_phone'
+
+ def up
+ add_concurrent_index :user_details, :phone, unique: true, where: 'phone IS NOT NULL', name: INDEX_NAME, comment: 'JiHu-specific index'
+ end
+
+ def down
+ remove_concurrent_index_by_name :user_details, INDEX_NAME
+ end
+end
diff --git a/db/migrate/20210929032555_create_verification_codes.rb b/db/migrate/20210929032555_create_verification_codes.rb
new file mode 100644
index 00000000000..ad743641b9c
--- /dev/null
+++ b/db/migrate/20210929032555_create_verification_codes.rb
@@ -0,0 +1,36 @@
+# frozen_string_literal: true
+
+class CreateVerificationCodes < Gitlab::Database::Migration[1.0]
+ include Gitlab::Database::PartitioningMigrationHelpers::TableManagementHelpers
+
+ def up
+ constraint_visitor_id_code = check_constraint_name('verification_codes', 'visitor_id_code', 'max_length')
+ constraint_code = check_constraint_name('verification_codes', 'code', 'max_length')
+ constraint_phone = check_constraint_name('verification_codes', 'phone', 'max_length')
+
+ execute(<<~SQL)
+ CREATE TABLE verification_codes (
+ created_at timestamp with time zone NOT NULL DEFAULT NOW(),
+ visitor_id_code text,
+ code text,
+ phone text,
+ PRIMARY KEY (created_at, visitor_id_code, code, phone),
+ CONSTRAINT #{constraint_visitor_id_code} CHECK ((char_length(visitor_id_code) <= 64)),
+ CONSTRAINT #{constraint_code} CHECK ((char_length(code) <= 8)),
+ CONSTRAINT #{constraint_phone} CHECK ((char_length(phone) <= 32))
+ ) PARTITION BY RANGE (created_at);
+ COMMENT ON TABLE verification_codes IS 'JiHu-specific table';
+
+ CREATE UNIQUE INDEX index_verification_codes_on_phone_and_visitor_id_code ON verification_codes (visitor_id_code, phone, created_at);
+ COMMENT ON INDEX index_verification_codes_on_phone_and_visitor_id_code IS 'JiHu-specific index';
+ SQL
+
+ min_date = Date.today - 1.month
+ max_date = Date.today + 1.month
+ create_daterange_partitions('verification_codes', 'created_at', min_date, max_date)
+ end
+
+ def down
+ drop_table :verification_codes
+ end
+end
diff --git a/db/migrate/20210929115340_add_security_policy_configurations_management_project_id_foreign_key.rb b/db/migrate/20210929115340_add_security_policy_configurations_management_project_id_foreign_key.rb
new file mode 100644
index 00000000000..1335c06cf1f
--- /dev/null
+++ b/db/migrate/20210929115340_add_security_policy_configurations_management_project_id_foreign_key.rb
@@ -0,0 +1,18 @@
+# frozen_string_literal: true
+
+class AddSecurityPolicyConfigurationsManagementProjectIdForeignKey < Gitlab::Database::Migration[1.0]
+ CONSTRAINT_NAME = 'fk_security_policy_configurations_management_project_id'
+ OLD_CONSTRAINT_NAME = 'fk_rails_42ed6c25ec'
+
+ disable_ddl_transaction!
+
+ def up
+ add_concurrent_foreign_key(:security_orchestration_policy_configurations, :projects, column: :security_policy_management_project_id, on_delete: :cascade, name: CONSTRAINT_NAME)
+ remove_foreign_key_if_exists(:security_orchestration_policy_configurations, column: :security_policy_management_project_id, on_delete: :restrict, name: OLD_CONSTRAINT_NAME)
+ end
+
+ def down
+ add_concurrent_foreign_key(:security_orchestration_policy_configurations, :projects, column: :security_policy_management_project_id, on_delete: :restrict, name: OLD_CONSTRAINT_NAME)
+ remove_foreign_key_if_exists(:security_orchestration_policy_configurations, column: :security_policy_management_project_id, on_delete: :cascade, name: CONSTRAINT_NAME)
+ end
+end
diff --git a/db/migrate/20210929121516_add_releases_author_id_id_created_at_index.rb b/db/migrate/20210929121516_add_releases_author_id_id_created_at_index.rb
new file mode 100644
index 00000000000..60ca3040d70
--- /dev/null
+++ b/db/migrate/20210929121516_add_releases_author_id_id_created_at_index.rb
@@ -0,0 +1,14 @@
+# frozen_string_literal: true
+class AddReleasesAuthorIdIdCreatedAtIndex < Gitlab::Database::Migration[1.0]
+ disable_ddl_transaction!
+
+ INDEX_NAME = 'index_releases_on_author_id_id_created_at'
+
+ def up
+ add_concurrent_index :releases, [:author_id, :id, :created_at], name: INDEX_NAME
+ end
+
+ def down
+ remove_concurrent_index_by_name :releases, INDEX_NAME
+ end
+end
diff --git a/db/migrate/20210930081208_fix_deprecated_api_throttle_defaults.rb b/db/migrate/20210930081208_fix_deprecated_api_throttle_defaults.rb
new file mode 100644
index 00000000000..be82b16ee8c
--- /dev/null
+++ b/db/migrate/20210930081208_fix_deprecated_api_throttle_defaults.rb
@@ -0,0 +1,8 @@
+# frozen_string_literal: true
+
+class FixDeprecatedApiThrottleDefaults < Gitlab::Database::Migration[1.0]
+ def change
+ change_column_default :application_settings, :throttle_unauthenticated_deprecated_api_requests_per_period, from: 3600, to: 1800
+ change_column_default :application_settings, :throttle_authenticated_deprecated_api_period_in_seconds, from: 1800, to: 3600
+ end
+end
diff --git a/db/migrate/20211001001222_add_source_version_to_bulk_imports.rb b/db/migrate/20211001001222_add_source_version_to_bulk_imports.rb
new file mode 100644
index 00000000000..d0eb4a32cac
--- /dev/null
+++ b/db/migrate/20211001001222_add_source_version_to_bulk_imports.rb
@@ -0,0 +1,7 @@
+# frozen_string_literal: true
+
+class AddSourceVersionToBulkImports < Gitlab::Database::Migration[1.0]
+ def change
+ add_column :bulk_imports, :source_version, :text # rubocop:disable Migration/AddLimitToTextColumns
+ end
+end
diff --git a/db/migrate/20211004062942_create_coverage_fuzzing_corpuses.rb b/db/migrate/20211004062942_create_coverage_fuzzing_corpuses.rb
new file mode 100644
index 00000000000..c24883b626d
--- /dev/null
+++ b/db/migrate/20211004062942_create_coverage_fuzzing_corpuses.rb
@@ -0,0 +1,18 @@
+# frozen_string_literal: true
+
+class CreateCoverageFuzzingCorpuses < Gitlab::Database::Migration[1.0]
+ def change
+ create_table :coverage_fuzzing_corpuses do |t|
+ t.bigint :project_id, null: false
+ t.bigint :user_id
+ t.bigint :package_id, null: false
+
+ t.datetime_with_timezone :file_updated_at, null: false, default: -> { 'NOW()' }
+ t.timestamps_with_timezone null: false
+
+ t.index :project_id
+ t.index :user_id
+ t.index :package_id
+ end
+ end
+end
diff --git a/db/migrate/20211004075629_add_topics_name_gin_index.rb b/db/migrate/20211004075629_add_topics_name_gin_index.rb
new file mode 100644
index 00000000000..94634a4cb2f
--- /dev/null
+++ b/db/migrate/20211004075629_add_topics_name_gin_index.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+class AddTopicsNameGinIndex < Gitlab::Database::Migration[1.0]
+ INDEX_NAME = 'index_topics_on_name_trigram'
+
+ disable_ddl_transaction!
+
+ def up
+ add_concurrent_index :topics, :name, name: INDEX_NAME, using: :gin, opclass: { name: :gin_trgm_ops }
+ end
+
+ def down
+ remove_concurrent_index_by_name :topics, INDEX_NAME
+ end
+end
diff --git a/db/migrate/20211004081911_add_external_event_destination_limit_to_plan_limits.rb b/db/migrate/20211004081911_add_external_event_destination_limit_to_plan_limits.rb
new file mode 100644
index 00000000000..3e44c388617
--- /dev/null
+++ b/db/migrate/20211004081911_add_external_event_destination_limit_to_plan_limits.rb
@@ -0,0 +1,7 @@
+# frozen_string_literal: true
+
+class AddExternalEventDestinationLimitToPlanLimits < Gitlab::Database::Migration[1.0]
+ def change
+ add_column(:plan_limits, :external_audit_event_destinations, :integer, default: 5, null: false)
+ end
+end
diff --git a/db/migrate/20211005063519_add_foreign_key_to_corpuses_on_project.rb b/db/migrate/20211005063519_add_foreign_key_to_corpuses_on_project.rb
new file mode 100644
index 00000000000..ba1fb443343
--- /dev/null
+++ b/db/migrate/20211005063519_add_foreign_key_to_corpuses_on_project.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+class AddForeignKeyToCorpusesOnProject < Gitlab::Database::Migration[1.0]
+ disable_ddl_transaction!
+
+ def up
+ add_concurrent_foreign_key :coverage_fuzzing_corpuses, :projects, column: :project_id, on_delete: :cascade
+ end
+
+ def down
+ with_lock_retries do
+ remove_foreign_key :coverage_fuzzing_corpuses, column: :project_id
+ end
+ end
+end
diff --git a/db/migrate/20211005063616_add_foreign_key_to_corpuses_on_user.rb b/db/migrate/20211005063616_add_foreign_key_to_corpuses_on_user.rb
new file mode 100644
index 00000000000..da08ab97acf
--- /dev/null
+++ b/db/migrate/20211005063616_add_foreign_key_to_corpuses_on_user.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+class AddForeignKeyToCorpusesOnUser < Gitlab::Database::Migration[1.0]
+ disable_ddl_transaction!
+
+ def up
+ add_concurrent_foreign_key :coverage_fuzzing_corpuses, :users, column: :user_id, on_delete: :cascade
+ end
+
+ def down
+ with_lock_retries do
+ remove_foreign_key :coverage_fuzzing_corpuses, column: :user_id
+ end
+ end
+end
diff --git a/db/migrate/20211005063723_add_foreign_key_to_corpuses_on_package.rb b/db/migrate/20211005063723_add_foreign_key_to_corpuses_on_package.rb
new file mode 100644
index 00000000000..74ba7b070d0
--- /dev/null
+++ b/db/migrate/20211005063723_add_foreign_key_to_corpuses_on_package.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+class AddForeignKeyToCorpusesOnPackage < Gitlab::Database::Migration[1.0]
+ disable_ddl_transaction!
+
+ def up
+ add_concurrent_foreign_key :coverage_fuzzing_corpuses, :packages_packages, column: :package_id, on_delete: :cascade
+ end
+
+ def down
+ with_lock_retries do
+ remove_foreign_key :coverage_fuzzing_corpuses, column: :package_id
+ end
+ end
+end
diff --git a/db/migrate/20211005092428_drop_time_range_partitioned_loose_fk.rb b/db/migrate/20211005092428_drop_time_range_partitioned_loose_fk.rb
new file mode 100644
index 00000000000..2aaf5e4cf87
--- /dev/null
+++ b/db/migrate/20211005092428_drop_time_range_partitioned_loose_fk.rb
@@ -0,0 +1,27 @@
+# frozen_string_literal: true
+
+class DropTimeRangePartitionedLooseFk < Gitlab::Database::Migration[1.0]
+ include Gitlab::Database::PartitioningMigrationHelpers
+
+ def up
+ # the table is not in use
+ drop_table :loose_foreign_keys_deleted_records # rubocop: disable Migration/DropTable
+ end
+
+ def down
+ constraint_name = check_constraint_name('loose_foreign_keys_deleted_records', 'deleted_table_name', 'max_length')
+ execute(<<~SQL)
+ CREATE TABLE loose_foreign_keys_deleted_records (
+ created_at timestamp with time zone NOT NULL DEFAULT NOW(),
+ deleted_table_name text NOT NULL,
+ deleted_table_primary_key_value bigint NOT NULL,
+ PRIMARY KEY (created_at, deleted_table_name, deleted_table_primary_key_value),
+ CONSTRAINT #{constraint_name} CHECK ((char_length(deleted_table_name) <= 63))
+ ) PARTITION BY RANGE (created_at);
+ SQL
+
+ min_date = Date.today - 1.month
+ max_date = Date.today + 3.months
+ create_daterange_partitions('loose_foreign_keys_deleted_records', 'created_at', min_date, max_date)
+ end
+end
diff --git a/db/migrate/20211005093558_add_range_partitioned_loose_fk_table.rb b/db/migrate/20211005093558_add_range_partitioned_loose_fk_table.rb
new file mode 100644
index 00000000000..6f52b6ec63b
--- /dev/null
+++ b/db/migrate/20211005093558_add_range_partitioned_loose_fk_table.rb
@@ -0,0 +1,29 @@
+# frozen_string_literal: true
+
+class AddRangePartitionedLooseFkTable < Gitlab::Database::Migration[1.0]
+ include Gitlab::Database::PartitioningMigrationHelpers::TableManagementHelpers
+
+ def up
+ constraint_name = check_constraint_name('loose_foreign_keys_deleted_records', 'fully_qualified_table_name', 'max_length')
+ execute(<<~SQL)
+ CREATE TABLE loose_foreign_keys_deleted_records (
+ id BIGSERIAL NOT NULL,
+ partition bigint NOT NULL,
+ primary_key_value bigint NOT NULL,
+ status smallint NOT NULL DEFAULT 1,
+ created_at timestamp with time zone NOT NULL DEFAULT NOW(),
+ fully_qualified_table_name text NOT NULL,
+ PRIMARY KEY (partition, id),
+ CONSTRAINT #{constraint_name} CHECK ((char_length(fully_qualified_table_name) <= 150))
+ ) PARTITION BY LIST (partition);
+
+ CREATE TABLE gitlab_partitions_static.loose_foreign_keys_deleted_records_1
+ PARTITION OF loose_foreign_keys_deleted_records
+ FOR VALUES IN (1);
+ SQL
+ end
+
+ def down
+ drop_table :loose_foreign_keys_deleted_records
+ end
+end
diff --git a/db/migrate/20211005100112_recreate_loose_fk_insert_function.rb b/db/migrate/20211005100112_recreate_loose_fk_insert_function.rb
new file mode 100644
index 00000000000..b03ad069eba
--- /dev/null
+++ b/db/migrate/20211005100112_recreate_loose_fk_insert_function.rb
@@ -0,0 +1,40 @@
+# frozen_string_literal: true
+
+class RecreateLooseFkInsertFunction < Gitlab::Database::Migration[1.0]
+ include Gitlab::Database::MigrationHelpers::LooseForeignKeyHelpers
+
+ def up
+ execute(<<~SQL)
+ CREATE OR REPLACE FUNCTION #{DELETED_RECORDS_INSERT_FUNCTION_NAME}()
+ RETURNS TRIGGER AS
+ $$
+ BEGIN
+ INSERT INTO loose_foreign_keys_deleted_records
+ (partition, fully_qualified_table_name, primary_key_value)
+ SELECT 1, TG_TABLE_SCHEMA || '.' || TG_TABLE_NAME, old_table.id FROM old_table
+ ON CONFLICT DO NOTHING;
+
+ RETURN NULL;
+ END
+ $$ LANGUAGE PLPGSQL
+ SQL
+ end
+
+ def down
+ # old function
+ execute(<<~SQL)
+ CREATE OR REPLACE FUNCTION #{DELETED_RECORDS_INSERT_FUNCTION_NAME}()
+ RETURNS TRIGGER AS
+ $$
+ BEGIN
+ INSERT INTO loose_foreign_keys_deleted_records
+ (deleted_table_name, deleted_table_primary_key_value)
+ SELECT TG_TABLE_NAME, old_table.id FROM old_table
+ ON CONFLICT DO NOTHING;
+
+ RETURN NULL;
+ END
+ $$ LANGUAGE PLPGSQL
+ SQL
+ end
+end
diff --git a/db/migrate/20211006060254_add_topics_total_projects_count_cache.rb b/db/migrate/20211006060254_add_topics_total_projects_count_cache.rb
new file mode 100644
index 00000000000..ebca4c70879
--- /dev/null
+++ b/db/migrate/20211006060254_add_topics_total_projects_count_cache.rb
@@ -0,0 +1,11 @@
+# frozen_string_literal: true
+
+class AddTopicsTotalProjectsCountCache < Gitlab::Database::Migration[1.0]
+ def up
+ add_column :topics, :total_projects_count, :bigint, null: false, default: 0
+ end
+
+ def down
+ remove_column :topics, :total_projects_count
+ end
+end
diff --git a/db/migrate/20211006103122_change_helm_channel_length.rb b/db/migrate/20211006103122_change_helm_channel_length.rb
new file mode 100644
index 00000000000..6579ca4053b
--- /dev/null
+++ b/db/migrate/20211006103122_change_helm_channel_length.rb
@@ -0,0 +1,14 @@
+# frozen_string_literal: true
+
+class ChangeHelmChannelLength < Gitlab::Database::Migration[1.0]
+ disable_ddl_transaction!
+
+ def up
+ add_text_limit :packages_helm_file_metadata, :channel, 255, constraint_name: check_constraint_name(:packages_helm_file_metadata, :channel, 'max_length_v2')
+ remove_text_limit :packages_helm_file_metadata, :channel, constraint_name: check_constraint_name(:packages_helm_file_metadata, :channel, 'max_length')
+ end
+
+ def down
+ # no-op: Danger of failing if there are records with length(channel) > 63
+ end
+end
diff --git a/db/migrate/20211006122010_add_topics_total_projects_count_index.rb b/db/migrate/20211006122010_add_topics_total_projects_count_index.rb
new file mode 100644
index 00000000000..bd969a9ff0a
--- /dev/null
+++ b/db/migrate/20211006122010_add_topics_total_projects_count_index.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+class AddTopicsTotalProjectsCountIndex < Gitlab::Database::Migration[1.0]
+ INDEX_NAME = 'index_topics_total_projects_count'
+
+ disable_ddl_transaction!
+
+ def up
+ add_concurrent_index :topics, [:total_projects_count, :id], order: { total_projects_count: :desc }, name: INDEX_NAME
+ end
+
+ def down
+ remove_concurrent_index_by_name :topics, INDEX_NAME
+ end
+end
diff --git a/db/migrate/20211007113136_add_status_column_to_security_scans_table.rb b/db/migrate/20211007113136_add_status_column_to_security_scans_table.rb
new file mode 100644
index 00000000000..d60171dead7
--- /dev/null
+++ b/db/migrate/20211007113136_add_status_column_to_security_scans_table.rb
@@ -0,0 +1,7 @@
+# frozen_string_literal: true
+
+class AddStatusColumnToSecurityScansTable < Gitlab::Database::Migration[1.0]
+ def change
+ add_column :security_scans, :status, :integer, limit: 1, default: 0, null: false
+ end
+end
diff --git a/db/migrate/20211008181451_add_shared_runners_duration_to_ci_namespace_monthly_usages.rb b/db/migrate/20211008181451_add_shared_runners_duration_to_ci_namespace_monthly_usages.rb
new file mode 100644
index 00000000000..862d1a26867
--- /dev/null
+++ b/db/migrate/20211008181451_add_shared_runners_duration_to_ci_namespace_monthly_usages.rb
@@ -0,0 +1,9 @@
+# frozen_string_literal: true
+
+class AddSharedRunnersDurationToCiNamespaceMonthlyUsages < Gitlab::Database::Migration[1.0]
+ enable_lock_retries!
+
+ def change
+ add_column :ci_namespace_monthly_usages, :shared_runners_duration, :integer, default: 0, null: false
+ end
+end
diff --git a/db/migrate/20211008182954_add_shared_runners_duration_to_ci_project_monthly_usages.rb b/db/migrate/20211008182954_add_shared_runners_duration_to_ci_project_monthly_usages.rb
new file mode 100644
index 00000000000..76bb7356f0f
--- /dev/null
+++ b/db/migrate/20211008182954_add_shared_runners_duration_to_ci_project_monthly_usages.rb
@@ -0,0 +1,9 @@
+# frozen_string_literal: true
+
+class AddSharedRunnersDurationToCiProjectMonthlyUsages < Gitlab::Database::Migration[1.0]
+ enable_lock_retries!
+
+ def change
+ add_column :ci_project_monthly_usages, :shared_runners_duration, :integer, default: 0, null: false
+ end
+end
diff --git a/db/migrate/20211012091822_add_text_limit_to_bulk_imports_source_version.rb b/db/migrate/20211012091822_add_text_limit_to_bulk_imports_source_version.rb
new file mode 100644
index 00000000000..9b4fca9a98c
--- /dev/null
+++ b/db/migrate/20211012091822_add_text_limit_to_bulk_imports_source_version.rb
@@ -0,0 +1,13 @@
+# frozen_string_literal: true
+
+class AddTextLimitToBulkImportsSourceVersion < Gitlab::Database::Migration[1.0]
+ disable_ddl_transaction!
+
+ def up
+ add_text_limit :bulk_imports, :source_version, 63
+ end
+
+ def down
+ remove_text_limit :bulk_imports, :source_version
+ end
+end
diff --git a/db/post_migrate/20190102152410_delete_inconsistent_internal_id_records2.rb b/db/post_migrate/20190102152410_delete_inconsistent_internal_id_records2.rb
deleted file mode 100644
index ddcddcf72a3..00000000000
--- a/db/post_migrate/20190102152410_delete_inconsistent_internal_id_records2.rb
+++ /dev/null
@@ -1,43 +0,0 @@
-# frozen_string_literal: true
-class DeleteInconsistentInternalIdRecords2 < ActiveRecord::Migration[5.0]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- # This migration cleans up any inconsistent records in internal_ids.
- #
- # That is, it deletes records that track a `last_value` that is
- # smaller than the maximum internal id (usually `iid`) found in
- # the corresponding model records.
-
- def up
- disable_statement_timeout do
- delete_internal_id_records('milestones', 'project_id')
- delete_internal_id_records('milestones', 'namespace_id', 'group_id')
- end
- end
-
- class InternalId < ActiveRecord::Base
- self.table_name = 'internal_ids'
- enum usage: { issues: 0, merge_requests: 1, deployments: 2, milestones: 3, epics: 4, ci_pipelines: 5 }
- end
-
- private
-
- def delete_internal_id_records(base_table, scope_column_name, base_scope_column_name = scope_column_name)
- sql = <<~SQL
- SELECT id FROM ( -- workaround for MySQL
- SELECT internal_ids.id FROM (
- SELECT #{base_scope_column_name} AS #{scope_column_name}, max(iid) as maximum_iid from #{base_table} GROUP BY #{scope_column_name}
- ) maxima JOIN internal_ids USING (#{scope_column_name})
- WHERE internal_ids.usage=#{InternalId.usages.fetch(base_table)} AND maxima.maximum_iid > internal_ids.last_value
- ) internal_ids
- SQL
-
- InternalId.where("id IN (#{sql})").tap do |ids| # rubocop:disable GitlabSecurity/SqlInjection
- say "Deleting internal_id records for #{base_table}: #{ids.map { |i| [i.project_id, i.last_value] }}" unless ids.empty?
- end.delete_all
- end
-end
diff --git a/db/post_migrate/20190115054215_migrate_delete_container_repository_worker.rb b/db/post_migrate/20190115054215_migrate_delete_container_repository_worker.rb
deleted file mode 100644
index 4fcee326b7e..00000000000
--- a/db/post_migrate/20190115054215_migrate_delete_container_repository_worker.rb
+++ /dev/null
@@ -1,15 +0,0 @@
-# frozen_string_literal: true
-
-class MigrateDeleteContainerRepositoryWorker < ActiveRecord::Migration[5.0]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- def up
- sidekiq_queue_migrate('delete_container_repository', to: 'container_repository:delete_container_repository')
- end
-
- def down
- sidekiq_queue_migrate('container_repository:delete_container_repository', to: 'delete_container_repository')
- end
-end
diff --git a/db/post_migrate/20190124200344_migrate_storage_migrator_sidekiq_queue.rb b/db/post_migrate/20190124200344_migrate_storage_migrator_sidekiq_queue.rb
deleted file mode 100644
index 193bd571831..00000000000
--- a/db/post_migrate/20190124200344_migrate_storage_migrator_sidekiq_queue.rb
+++ /dev/null
@@ -1,18 +0,0 @@
-# frozen_string_literal: true
-
-# See http://doc.gitlab.com/ce/development/migration_style_guide.html
-# for more information on how to write migrations for GitLab.
-
-class MigrateStorageMigratorSidekiqQueue < ActiveRecord::Migration[5.0]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- def up
- sidekiq_queue_migrate 'storage_migrator', to: 'hashed_storage:hashed_storage_migrator'
- end
-
- def down
- sidekiq_queue_migrate 'hashed_storage:hashed_storage_migrator', to: 'storage_migrator'
- end
-end
diff --git a/db/post_migrate/20190131122559_fix_null_type_labels.rb b/db/post_migrate/20190131122559_fix_null_type_labels.rb
deleted file mode 100644
index 83bb613990c..00000000000
--- a/db/post_migrate/20190131122559_fix_null_type_labels.rb
+++ /dev/null
@@ -1,23 +0,0 @@
-# frozen_string_literal: true
-
-class FixNullTypeLabels < ActiveRecord::Migration[5.0]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- update_column_in_batches(:labels, :type, 'ProjectLabel') do |table, query|
- query.where(
- table[:project_id].not_eq(nil)
- .and(table[:template].eq(false))
- .and(table[:type].eq(nil))
- )
- end
- end
-
- def down
- # no action
- end
-end
diff --git a/db/post_migrate/20190204115450_migrate_auto_dev_ops_domain_to_cluster_domain.rb b/db/post_migrate/20190204115450_migrate_auto_dev_ops_domain_to_cluster_domain.rb
deleted file mode 100644
index 036b0b64b48..00000000000
--- a/db/post_migrate/20190204115450_migrate_auto_dev_ops_domain_to_cluster_domain.rb
+++ /dev/null
@@ -1,29 +0,0 @@
-# frozen_string_literal: true
-
-class MigrateAutoDevOpsDomainToClusterDomain < ActiveRecord::Migration[5.0]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- def up
- execute(update_clusters_domain_query)
- end
-
- def down
- # no-op
- end
-
- private
-
- def update_clusters_domain_query
- <<~HEREDOC
- UPDATE clusters
- SET domain = project_auto_devops.domain
- FROM cluster_projects, project_auto_devops
- WHERE
- cluster_projects.cluster_id = clusters.id
- AND project_auto_devops.project_id = cluster_projects.project_id
- AND project_auto_devops.domain != ''
- HEREDOC
- end
-end
diff --git a/db/post_migrate/20190214112022_schedule_sync_issuables_state_id.rb b/db/post_migrate/20190214112022_schedule_sync_issuables_state_id.rb
deleted file mode 100644
index de062937fbe..00000000000
--- a/db/post_migrate/20190214112022_schedule_sync_issuables_state_id.rb
+++ /dev/null
@@ -1,58 +0,0 @@
-# frozen_string_literal: true
-
-class ScheduleSyncIssuablesStateId < ActiveRecord::Migration[5.0]
- # This migration schedules the sync of state_id for issues and merge requests
- # which are converting the state column from string to integer.
- # For more information check: https://gitlab.com/gitlab-org/gitlab-foss/issues/51789
-
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- # 2019-02-12 gitlab.com issuable numbers
- # issues count: 13587305
- # merge requests count: 18925274
- #
- # Using 5000 as batch size and 115 seconds interval will give:
- # 2718 jobs for issues - taking ~86 hours
- # 3786 jobs for merge requests - taking ~120 hours
- #
- BATCH_SIZE = 5000
- DELAY_INTERVAL = 120.seconds.to_i
- ISSUES_MIGRATION = 'SyncIssuesStateId'
- MERGE_REQUESTS_MIGRATION = 'SyncMergeRequestsStateId'
-
- disable_ddl_transaction!
-
- class Issue < ActiveRecord::Base
- include EachBatch
-
- self.table_name = 'issues'
- end
-
- class MergeRequest < ActiveRecord::Base
- include EachBatch
-
- self.table_name = 'merge_requests'
- end
-
- def up
- queue_background_migration_jobs_by_range_at_intervals(
- Issue.all,
- ISSUES_MIGRATION,
- DELAY_INTERVAL,
- batch_size: BATCH_SIZE
- )
-
- queue_background_migration_jobs_by_range_at_intervals(
- MergeRequest.all,
- MERGE_REQUESTS_MIGRATION,
- DELAY_INTERVAL,
- batch_size: BATCH_SIZE
- )
- end
-
- def down
- # No op
- end
-end
diff --git a/db/post_migrate/20190301081611_migrate_project_migrate_sidekiq_queue.rb b/db/post_migrate/20190301081611_migrate_project_migrate_sidekiq_queue.rb
deleted file mode 100644
index 46108d142b5..00000000000
--- a/db/post_migrate/20190301081611_migrate_project_migrate_sidekiq_queue.rb
+++ /dev/null
@@ -1,15 +0,0 @@
-# frozen_string_literal: true
-
-class MigrateProjectMigrateSidekiqQueue < ActiveRecord::Migration[5.0]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- def up
- sidekiq_queue_migrate 'project_migrate_hashed_storage', to: 'hashed_storage:hashed_storage_project_migrate'
- end
-
- def down
- sidekiq_queue_migrate 'hashed_storage:hashed_storage_project_migrate', to: 'project_migrate_hashed_storage'
- end
-end
diff --git a/db/post_migrate/20190313092516_clean_up_noteable_id_for_notes_on_commits.rb b/db/post_migrate/20190313092516_clean_up_noteable_id_for_notes_on_commits.rb
deleted file mode 100644
index fcd63f42b0e..00000000000
--- a/db/post_migrate/20190313092516_clean_up_noteable_id_for_notes_on_commits.rb
+++ /dev/null
@@ -1,33 +0,0 @@
-# frozen_string_literal: true
-
-# See http://doc.gitlab.com/ce/development/migration_style_guide.html
-# for more information on how to write migrations for GitLab.
-
-class CleanUpNoteableIdForNotesOnCommits < ActiveRecord::Migration[5.0]
- include Gitlab::Database::MigrationHelpers
-
- # Set this constant to true if this migration requires downtime.
- DOWNTIME = false
-
- TEMP_INDEX_NAME = 'index_notes_on_commit_with_null_noteable_id'
-
- disable_ddl_transaction!
-
- def up
- remove_concurrent_index_by_name(:notes, TEMP_INDEX_NAME)
-
- add_concurrent_index(:notes, :id, where: "noteable_type = 'Commit' AND noteable_id IS NOT NULL", name: TEMP_INDEX_NAME)
-
- # rubocop:disable Migration/UpdateLargeTable
- update_column_in_batches(:notes, :noteable_id, nil, batch_size: 300) do |table, query|
- query.where(
- table[:noteable_type].eq('Commit').and(table[:noteable_id].not_eq(nil))
- )
- end
-
- remove_concurrent_index_by_name(:notes, TEMP_INDEX_NAME)
- end
-
- def down
- end
-end
diff --git a/db/post_migrate/20190322132835_schedule_populate_merge_request_assignees_table.rb b/db/post_migrate/20190322132835_schedule_populate_merge_request_assignees_table.rb
deleted file mode 100644
index 1ecb38e1a86..00000000000
--- a/db/post_migrate/20190322132835_schedule_populate_merge_request_assignees_table.rb
+++ /dev/null
@@ -1,23 +0,0 @@
-# frozen_string_literal: true
-
-# See http://doc.gitlab.com/ce/development/migration_style_guide.html
-# for more information on how to write migrations for GitLab.
-
-class SchedulePopulateMergeRequestAssigneesTable < ActiveRecord::Migration[5.0]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
- BATCH_SIZE = 10_000
- MIGRATION = 'PopulateMergeRequestAssigneesTable'
- DELAY_INTERVAL = 8.minutes.to_i
-
- disable_ddl_transaction!
-
- def up
- say 'Scheduling `PopulateMergeRequestAssigneesTable` jobs'
- # We currently have ~4_500_000 merge request records on GitLab.com.
- # This means it'll schedule ~450 jobs (10k MRs each) with a 8 minutes gap,
- # so this should take ~60 hours for all background migrations to complete.
- queue_background_migration_jobs_by_range_at_intervals(MergeRequest, MIGRATION, DELAY_INTERVAL, batch_size: BATCH_SIZE)
- end
-end
diff --git a/db/post_migrate/20190325111602_rename_v2_root_namespaces.rb b/db/post_migrate/20190325111602_rename_v2_root_namespaces.rb
deleted file mode 100644
index 8571bb82fa0..00000000000
--- a/db/post_migrate/20190325111602_rename_v2_root_namespaces.rb
+++ /dev/null
@@ -1,27 +0,0 @@
-# frozen_string_literal: true
-
-# See http://doc.gitlab.com/ce/development/migration_style_guide.html
-# for more information on how to write migrations for GitLab.
-
-class RenameV2RootNamespaces < ActiveRecord::Migration[5.0]
- include Gitlab::Database::MigrationHelpers
- include Gitlab::Database::RenameReservedPathsMigration::V1
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- # We're taking over the /v2 namespace as it necessary for Docker client to
- # work with GitLab as Dependency proxy for containers.
- def up
- disable_statement_timeout do
- rename_root_paths 'v2'
- end
- end
-
- def down
- disable_statement_timeout do
- revert_renames
- end
- end
-end
diff --git a/db/post_migrate/20190404143330_add_unique_constraint_to_approvals_user_id_and_merge_request_id.rb b/db/post_migrate/20190404143330_add_unique_constraint_to_approvals_user_id_and_merge_request_id.rb
deleted file mode 100644
index dd85ebc8001..00000000000
--- a/db/post_migrate/20190404143330_add_unique_constraint_to_approvals_user_id_and_merge_request_id.rb
+++ /dev/null
@@ -1,39 +0,0 @@
-# frozen_string_literal: true
-
-class AddUniqueConstraintToApprovalsUserIdAndMergeRequestId < ActiveRecord::Migration[5.0]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- remove_duplicates
- add_concurrent_index :approvals, [:user_id, :merge_request_id], unique: true
- end
-
- def down
- remove_concurrent_index :approvals, [:user_id, :merge_request_id]
- end
-
- private
-
- def remove_duplicates
- add_concurrent_index :approvals, [:user_id, :merge_request_id, :id]
-
- execute <<-SQL
- DELETE FROM approvals
- USING (
- SELECT user_id, merge_request_id, MIN(id) as min_id
- FROM approvals
- GROUP BY user_id, merge_request_id
- HAVING COUNT(id) > 1
- ) as approvals_with_duplicates
- WHERE approvals_with_duplicates.user_id = approvals.user_id
- AND approvals_with_duplicates.merge_request_id = approvals.merge_request_id
- AND approvals_with_duplicates.min_id <> approvals.id;
- SQL
-
- remove_concurrent_index :approvals, [:user_id, :merge_request_id, :id]
- end
-end
diff --git a/db/post_migrate/20190404231137_remove_alternate_url_from_geo_nodes.rb b/db/post_migrate/20190404231137_remove_alternate_url_from_geo_nodes.rb
deleted file mode 100644
index 785ceb2fb28..00000000000
--- a/db/post_migrate/20190404231137_remove_alternate_url_from_geo_nodes.rb
+++ /dev/null
@@ -1,21 +0,0 @@
-# frozen_string_literal: true
-
-# See http://doc.gitlab.com/ce/development/migration_style_guide.html
-# for more information on how to write migrations for GitLab.
-
-# We are reverting the feature that created this column. This is for anyone who
-# migrated while the feature still existed in master.
-class RemoveAlternateUrlFromGeoNodes < ActiveRecord::Migration[5.0]
- include Gitlab::Database::MigrationHelpers
-
- # Set this constant to true if this migration requires downtime.
- DOWNTIME = false
-
- def up
- remove_column(:geo_nodes, :alternate_url) if column_exists?(:geo_nodes, :alternate_url)
- end
-
- def down
- add_column :geo_nodes, :alternate_url, :string
- end
-end
diff --git a/db/post_migrate/20190418132125_populate_project_statistics_packages_size.rb b/db/post_migrate/20190418132125_populate_project_statistics_packages_size.rb
deleted file mode 100644
index a6bee3453c1..00000000000
--- a/db/post_migrate/20190418132125_populate_project_statistics_packages_size.rb
+++ /dev/null
@@ -1,46 +0,0 @@
-# frozen_string_literal: true
-
-class PopulateProjectStatisticsPackagesSize < ActiveRecord::Migration[5.0]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- class ProjectStatistics < ActiveRecord::Base
- self.table_name = 'project_statistics'
- end
-
- def up
- stats_ids = ProjectStatistics.joins(
- <<~SQL.strip_heredoc
- INNER JOIN projects ON projects.id = project_statistics.project_id
- INNER JOIN packages_packages ON packages_packages.project_id = projects.id
- INNER JOIN packages_package_files ON packages_package_files.package_id = packages_packages.id
- SQL
- ).distinct.select(:id)
-
- packages_size = Arel.sql(
- '(SELECT SUM(size) FROM packages_package_files ' \
- 'JOIN packages_packages ON packages_packages.id = packages_package_files.package_id ' \
- 'WHERE packages_packages.project_id = project_statistics.project_id)'
- )
- update_column_in_batches(:project_statistics, :packages_size, packages_size) do |table, query|
- query.where(table[:id].in(stats_ids))
- end
-
- storage_size = Arel.sql('(repository_size + lfs_objects_size + build_artifacts_size + COALESCE(packages_size, 0))')
- update_column_in_batches(:project_statistics, :storage_size, storage_size) do |table, query|
- query.where(table[:id].in(stats_ids))
- end
- end
-
- def down
- storage_size = Arel.sql('(repository_size + lfs_objects_size + build_artifacts_size)')
- update_column_in_batches(:project_statistics, :storage_size, storage_size) do |table, query|
- query.where(table[:packages_size].gt(0))
- end
-
- update_column_in_batches(:project_statistics, :packages_size, nil)
- end
-end
diff --git a/db/post_migrate/20190424134256_drop_projects_ci_id.rb b/db/post_migrate/20190424134256_drop_projects_ci_id.rb
deleted file mode 100644
index 223e9fd4a94..00000000000
--- a/db/post_migrate/20190424134256_drop_projects_ci_id.rb
+++ /dev/null
@@ -1,33 +0,0 @@
-# frozen_string_literal: true
-
-# See http://doc.gitlab.com/ce/development/migration_style_guide.html
-# for more information on how to write migrations for GitLab.
-
-class DropProjectsCiId < ActiveRecord::Migration[5.1]
- include Gitlab::Database::MigrationHelpers
-
- # Set this constant to true if this migration requires downtime.
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- if index_exists?(:projects, :ci_id)
- remove_concurrent_index :projects, :ci_id
- end
-
- if column_exists?(:projects, :ci_id)
- remove_column :projects, :ci_id
- end
- end
-
- def down
- unless column_exists?(:projects, :ci_id)
- add_column :projects, :ci_id, :integer # rubocop:disable Migration/AddColumnsToWideTables
- end
-
- unless index_exists?(:projects, :ci_id)
- add_concurrent_index :projects, :ci_id
- end
- end
-end
diff --git a/db/post_migrate/20190506135400_schedule_sync_issuables_state_id_where_nil.rb b/db/post_migrate/20190506135400_schedule_sync_issuables_state_id_where_nil.rb
deleted file mode 100644
index 845c855358b..00000000000
--- a/db/post_migrate/20190506135400_schedule_sync_issuables_state_id_where_nil.rb
+++ /dev/null
@@ -1,63 +0,0 @@
-# frozen_string_literal: true
-
-class ScheduleSyncIssuablesStateIdWhereNil < ActiveRecord::Migration[5.1]
- # Issues and MergeRequests imported by GitHub are being created with
- # state_id = null, this fixes them.
- #
- # Part of a bigger plan: https://gitlab.com/gitlab-org/gitlab-foss/issues/51789
-
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- # 2019-05-02 gitlab.com issuable numbers
- # issues with state_id nil: ~40000
- # merge requests with state_id nil: ~200000
- #
- # Using 5000 as batch size and 120 seconds interval will create:
- # ~8 jobs for issues - taking ~16 minutes
- # ~40 jobs for merge requests - taking ~1.34 hours
- #
- BATCH_SIZE = 5000
- DELAY_INTERVAL = 120.seconds.to_i
- ISSUES_MIGRATION = 'SyncIssuesStateId'
- MERGE_REQUESTS_MIGRATION = 'SyncMergeRequestsStateId'
-
- disable_ddl_transaction!
-
- class Issue < ActiveRecord::Base
- include EachBatch
-
- self.table_name = 'issues'
- end
-
- class MergeRequest < ActiveRecord::Base
- include EachBatch
-
- self.table_name = 'merge_requests'
- end
-
- def up
- queue_background_migration_jobs_by_range_at_intervals(
- Issue.where(state_id: nil),
- ISSUES_MIGRATION,
- DELAY_INTERVAL,
- batch_size: BATCH_SIZE
- )
-
- queue_background_migration_jobs_by_range_at_intervals(
- MergeRequest.where(state_id: nil),
- MERGE_REQUESTS_MIGRATION,
- DELAY_INTERVAL,
- batch_size: BATCH_SIZE
- )
-
- # Remove temporary indexes added on "AddTemporaryIndexesToStateId"
- remove_concurrent_index_by_name(:issues, "idx_on_issues_where_state_id_is_null")
- remove_concurrent_index_by_name(:merge_requests, "idx_on_merge_requests_where_state_id_is_null")
- end
-
- def down
- # No op
- end
-end
diff --git a/db/post_migrate/20190511144331_remove_users_support_type.rb b/db/post_migrate/20190511144331_remove_users_support_type.rb
deleted file mode 100644
index e72fbb229b8..00000000000
--- a/db/post_migrate/20190511144331_remove_users_support_type.rb
+++ /dev/null
@@ -1,27 +0,0 @@
-# frozen_string_literal: true
-
-class RemoveUsersSupportType < ActiveRecord::Migration[5.1]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- INDEX_STATE_INTERNAL_ATTRS = 'index_users_on_state_and_internal_attrs'
-
- disable_ddl_transaction!
-
- def up
- remove_concurrent_index :users, :state, name: INDEX_STATE_INTERNAL_ATTRS
- remove_concurrent_index :users, :support_bot
-
- remove_column :users, :support_bot
- end
-
- def down
- add_column :users, :support_bot, :boolean # rubocop:disable Migration/AddColumnsToWideTables
-
- add_concurrent_index :users, :support_bot
- add_concurrent_index :users, :state,
- name: INDEX_STATE_INTERNAL_ATTRS,
- where: 'ghost <> true AND support_bot <> true'
- end
-end
diff --git a/db/post_migrate/20190517153211_migrate_k8s_service_integration.rb b/db/post_migrate/20190517153211_migrate_k8s_service_integration.rb
deleted file mode 100644
index 0b409cd2866..00000000000
--- a/db/post_migrate/20190517153211_migrate_k8s_service_integration.rb
+++ /dev/null
@@ -1,104 +0,0 @@
-# frozen_string_literal: true
-
-class MigrateK8sServiceIntegration < ActiveRecord::Migration[5.1]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- class Cluster < ActiveRecord::Base
- self.table_name = 'clusters'
-
- has_one :platform_kubernetes, class_name: 'MigrateK8sServiceIntegration::PlatformsKubernetes'
-
- accepts_nested_attributes_for :platform_kubernetes
-
- enum cluster_type: {
- instance_type: 1,
- group_type: 2,
- project_type: 3
- }
-
- enum platform_type: {
- kubernetes: 1
- }
-
- enum provider_type: {
- user: 0,
- gcp: 1
- }
- end
-
- class PlatformsKubernetes < ActiveRecord::Base
- self.table_name = 'cluster_platforms_kubernetes'
-
- belongs_to :cluster, class_name: 'MigrateK8sServiceIntegration::Cluster'
-
- attr_encrypted :token,
- mode: :per_attribute_iv,
- key: Settings.attr_encrypted_db_key_base_truncated,
- algorithm: 'aes-256-cbc'
- end
-
- class Service < ActiveRecord::Base
- include EachBatch
-
- self.table_name = 'services'
- self.inheritance_column = :_type_disabled # Disable STI, otherwise KubernetesModel will be looked up
-
- belongs_to :project, class_name: 'MigrateK8sServiceIntegration::Project', foreign_key: :project_id
-
- scope :kubernetes_service_templates, -> do
- where(category: 'deployment', type: 'KubernetesService', template: true)
- end
-
- def api_url
- parsed_properties['api_url'].presence
- end
-
- def ca_pem
- parsed_properties['ca_pem']
- end
-
- def namespace
- parsed_properties['namespace'].presence
- end
-
- def token
- parsed_properties['token'].presence
- end
-
- private
-
- def parsed_properties
- @parsed_properties ||= JSON.parse(self.properties) # rubocop:disable Gitlab/Json
- end
- end
-
- def up
- has_instance_cluster = Cluster.instance_type.where(enabled: true).exists?
-
- MigrateK8sServiceIntegration::Service.kubernetes_service_templates.find_each do |service|
- next unless service.api_url && service.token
-
- MigrateK8sServiceIntegration::Cluster.create!(
- enabled: !has_instance_cluster && service.active,
- managed: false,
- name: 'KubernetesService',
- cluster_type: 'instance_type',
- provider_type: 'user',
- platform_type: 'kubernetes',
- platform_kubernetes_attributes: {
- api_url: service.api_url,
- ca_cert: service.ca_pem,
- namespace: service.namespace,
- token: service.token
- }
- )
- end
- end
-
- def down
- # It is not possible to tell which instance-level clusters were created by
- # this migration. The original data is intentionally left intact.
- end
-end
diff --git a/db/post_migrate/20190520201748_populate_rule_type_on_approval_merge_request_rules.rb b/db/post_migrate/20190520201748_populate_rule_type_on_approval_merge_request_rules.rb
deleted file mode 100644
index 0f0df456134..00000000000
--- a/db/post_migrate/20190520201748_populate_rule_type_on_approval_merge_request_rules.rb
+++ /dev/null
@@ -1,34 +0,0 @@
-# frozen_string_literal: true
-
-# See http://doc.gitlab.com/ce/development/migration_style_guide.html
-# for more information on how to write migrations for GitLab.
-
-class PopulateRuleTypeOnApprovalMergeRequestRules < ActiveRecord::Migration[5.1]
- include Gitlab::Database::MigrationHelpers
-
- # Set this constant to true if this migration requires downtime.
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- class ApprovalMergeRequestRule < ActiveRecord::Base
- include EachBatch
-
- enum rule_types: {
- regular: 1,
- code_owner: 2
- }
- end
-
- def up
- # On Gitlab.com, this should update about 17k rows. Since our updates are
- # small and we are populating prior to indexing, the overhead should be small
- ApprovalMergeRequestRule.where(code_owner: true).each_batch do |batch|
- batch.update_all(rule_type: ApprovalMergeRequestRule.rule_types[:code_owner])
- end
- end
-
- def down
- # code_owner is already kept in sync with `rule_type`, so no changes are needed
- end
-end
diff --git a/db/post_migrate/20190522143720_drop_project_auto_devops_domain.rb b/db/post_migrate/20190522143720_drop_project_auto_devops_domain.rb
deleted file mode 100644
index 36278d83927..00000000000
--- a/db/post_migrate/20190522143720_drop_project_auto_devops_domain.rb
+++ /dev/null
@@ -1,11 +0,0 @@
-# frozen_string_literal: true
-
-class DropProjectAutoDevopsDomain < ActiveRecord::Migration[5.1]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- def change
- remove_column :project_auto_devops, :domain, :string
- end
-end
diff --git a/db/post_migrate/20190524073827_schedule_fill_valid_time_for_pages_domain_certificates.rb b/db/post_migrate/20190524073827_schedule_fill_valid_time_for_pages_domain_certificates.rb
deleted file mode 100644
index 1d8510e4514..00000000000
--- a/db/post_migrate/20190524073827_schedule_fill_valid_time_for_pages_domain_certificates.rb
+++ /dev/null
@@ -1,34 +0,0 @@
-# frozen_string_literal: true
-
-# See http://doc.gitlab.com/ce/development/migration_style_guide.html
-# for more information on how to write migrations for GitLab.
-
-class ScheduleFillValidTimeForPagesDomainCertificates < ActiveRecord::Migration[5.1]
- include Gitlab::Database::MigrationHelpers
-
- MIGRATION = 'FillValidTimeForPagesDomainCertificate'
- BATCH_SIZE = 500
- BATCH_TIME = 5.minutes
-
- # Set this constant to true if this migration requires downtime.
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- class PagesDomain < ActiveRecord::Base
- include ::EachBatch
-
- self.table_name = 'pages_domains'
- end
-
- def up
- queue_background_migration_jobs_by_range_at_intervals(
- PagesDomain.where.not(certificate: [nil, '']),
- MIGRATION,
- BATCH_TIME,
- batch_size: BATCH_SIZE)
- end
-
- def down
- end
-end
diff --git a/db/post_migrate/20190527194900_schedule_calculate_wiki_sizes.rb b/db/post_migrate/20190527194900_schedule_calculate_wiki_sizes.rb
deleted file mode 100644
index f337390f10c..00000000000
--- a/db/post_migrate/20190527194900_schedule_calculate_wiki_sizes.rb
+++ /dev/null
@@ -1,32 +0,0 @@
-# frozen_string_literal: true
-
-class ScheduleCalculateWikiSizes < ActiveRecord::Migration[5.0]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
- MIGRATION = 'CalculateWikiSizes'
- BATCH_SIZE = 100000
- BATCH_TIME = 5.minutes
-
- class ProjectStatistics < ActiveRecord::Base
- self.table_name = 'project_statistics'
-
- scope :without_wiki_size, -> { where(wiki_size: nil) }
-
- include ::EachBatch
- end
-
- disable_ddl_transaction!
-
- # Disabling this old migration because it should already run
- # in 14.0. This will allow us to remove some `technical debt`
- # in ProjectStatistics model, because of some columns
- # not present by the time the migration is run.
- def up
- # no-op
- end
-
- def down
- # no-op
- end
-end
diff --git a/db/post_migrate/20190528180441_enqueue_reset_merge_status.rb b/db/post_migrate/20190528180441_enqueue_reset_merge_status.rb
deleted file mode 100644
index a3d2f497806..00000000000
--- a/db/post_migrate/20190528180441_enqueue_reset_merge_status.rb
+++ /dev/null
@@ -1,25 +0,0 @@
-# frozen_string_literal: true
-
-# See http://doc.gitlab.com/ce/development/migration_style_guide.html
-# for more information on how to write migrations for GitLab.
-
-class EnqueueResetMergeStatus < ActiveRecord::Migration[5.1]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
- BATCH_SIZE = 10_000
- MIGRATION = 'ResetMergeStatus'
- DELAY_INTERVAL = 5.minutes.to_i
-
- disable_ddl_transaction!
-
- def up
- say 'Scheduling `ResetMergeStatus` jobs'
-
- # We currently have more than ~5_000_000 merge request records on GitLab.com.
- # This means it'll schedule ~500 jobs (10k MRs each) with a 5 minutes gap,
- # so this should take ~41 hours for all background migrations to complete.
- # ((5_000_000 / 10_000) * 5) / 60 => 41.6666..
- queue_background_migration_jobs_by_range_at_intervals(MergeRequest, MIGRATION, DELAY_INTERVAL, batch_size: BATCH_SIZE)
- end
-end
diff --git a/db/post_migrate/20190606163724_migrate_legacy_managed_clusters_to_unmanaged.rb b/db/post_migrate/20190606163724_migrate_legacy_managed_clusters_to_unmanaged.rb
deleted file mode 100644
index 759ab939f7d..00000000000
--- a/db/post_migrate/20190606163724_migrate_legacy_managed_clusters_to_unmanaged.rb
+++ /dev/null
@@ -1,48 +0,0 @@
-# frozen_string_literal: true
-
-# See http://doc.gitlab.com/ce/development/migration_style_guide.html
-# for more information on how to write migrations for GitLab.
-
-class MigrateLegacyManagedClustersToUnmanaged < ActiveRecord::Migration[5.1]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- class Cluster < ActiveRecord::Base
- include EachBatch
-
- self.table_name = 'clusters'
-
- has_many :kubernetes_namespaces, class_name: 'MigrateLegacyManagedClustersToUnmanaged::KubernetesNamespace'
-
- scope :managed, -> { where(managed: true) }
-
- enum cluster_type: {
- instance_type: 1,
- group_type: 2,
- project_type: 3
- }
- end
-
- class KubernetesNamespace < ActiveRecord::Base
- self.table_name = 'clusters_kubernetes_namespaces'
-
- belongs_to :cluster, class_name: 'MigrateLegacyManagedClustersToUnmanaged::Cluster'
- end
-
- def up
- Cluster.managed
- .project_type
- .left_joins(:kubernetes_namespaces)
- .where(clusters_kubernetes_namespaces: { cluster_id: nil })
- .where('clusters.created_at < ?', 5.minutes.ago)
- .each_batch do |batch|
- batch.update_all(managed: false)
- end
- end
-
- def down
- end
-end
diff --git a/db/post_migrate/20190606175050_encrypt_feature_flags_clients_tokens.rb b/db/post_migrate/20190606175050_encrypt_feature_flags_clients_tokens.rb
deleted file mode 100644
index b8df41767f0..00000000000
--- a/db/post_migrate/20190606175050_encrypt_feature_flags_clients_tokens.rb
+++ /dev/null
@@ -1,27 +0,0 @@
-# frozen_string_literal: true
-
-class EncryptFeatureFlagsClientsTokens < ActiveRecord::Migration[5.1]
- DOWNTIME = false
-
- class FeatureFlagsClient < ActiveRecord::Base
- self.table_name = 'operations_feature_flags_clients'
- end
-
- def up
- say_with_time("Encrypting tokens from operations_feature_flags_clients") do
- FeatureFlagsClient.where('token_encrypted is NULL AND token IS NOT NULL').find_each do |feature_flags_client|
- token_encrypted = Gitlab::CryptoHelper.aes256_gcm_encrypt(feature_flags_client.token, nonce: Gitlab::CryptoHelper::AES256_GCM_IV_STATIC)
- feature_flags_client.update!(token_encrypted: token_encrypted)
- end
- end
- end
-
- def down
- say_with_time("Decrypting tokens from operations_feature_flags_clients") do
- FeatureFlagsClient.where('token_encrypted IS NOT NULL AND token IS NULL').find_each do |feature_flags_client|
- token = Gitlab::CryptoHelper.aes256_gcm_decrypt(feature_flags_client.token_encrypted)
- feature_flags_client.update!(token: token)
- end
- end
- end
-end
diff --git a/db/post_migrate/20190611161642_add_index_to_events_and_audit_events_created_at_author_id.rb b/db/post_migrate/20190611161642_add_index_to_events_and_audit_events_created_at_author_id.rb
deleted file mode 100644
index 5b9afbe128c..00000000000
--- a/db/post_migrate/20190611161642_add_index_to_events_and_audit_events_created_at_author_id.rb
+++ /dev/null
@@ -1,25 +0,0 @@
-# frozen_string_literal: true
-
-# See http://doc.gitlab.com/ce/development/migration_style_guide.html
-# for more information on how to write migrations for GitLab.
-
-class AddIndexToEventsAndAuditEventsCreatedAtAuthorId < ActiveRecord::Migration[5.1]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
- INDEX_NAME = 'analytics_index_%s_on_created_at_and_author_id'
- EVENTS_INDEX_NAME = (INDEX_NAME % 'events')
- AUDIT_EVENTS_INDEX_NAME = (INDEX_NAME % 'audit_events')
-
- disable_ddl_transaction!
-
- def up
- add_concurrent_index :events, [:created_at, :author_id], name: EVENTS_INDEX_NAME
- add_concurrent_index :audit_events, [:created_at, :author_id], name: AUDIT_EVENTS_INDEX_NAME
- end
-
- def down
- remove_concurrent_index_by_name :events, EVENTS_INDEX_NAME
- remove_concurrent_index_by_name :audit_events, AUDIT_EVENTS_INDEX_NAME
- end
-end
diff --git a/db/post_migrate/20190613231640_migrate_managed_clusters_with_no_token_to_unmanaged.rb b/db/post_migrate/20190613231640_migrate_managed_clusters_with_no_token_to_unmanaged.rb
deleted file mode 100644
index b2914afe2cd..00000000000
--- a/db/post_migrate/20190613231640_migrate_managed_clusters_with_no_token_to_unmanaged.rb
+++ /dev/null
@@ -1,48 +0,0 @@
-# frozen_string_literal: true
-
-# See http://doc.gitlab.com/ce/development/migration_style_guide.html
-# for more information on how to write migrations for GitLab.
-
-class MigrateManagedClustersWithNoTokenToUnmanaged < ActiveRecord::Migration[5.1]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- class Cluster < ActiveRecord::Base
- include EachBatch
-
- self.table_name = 'clusters'
-
- has_many :kubernetes_namespaces, class_name: 'MigrateManagedClustersWithNoTokenToUnmanaged::KubernetesNamespace'
-
- scope :managed, -> { where(managed: true) }
-
- enum cluster_type: {
- instance_type: 1,
- group_type: 2,
- project_type: 3
- }
- end
-
- class KubernetesNamespace < ActiveRecord::Base
- self.table_name = 'clusters_kubernetes_namespaces'
-
- belongs_to :cluster, class_name: 'MigrateManagedClustersWithNoTokenToUnmanaged::Cluster'
- end
-
- def up
- Cluster.managed
- .project_type
- .joins(:kubernetes_namespaces)
- .where(clusters_kubernetes_namespaces: { encrypted_service_account_token: nil })
- .where('clusters.created_at < ?', Date.new(2018, 12, 1).midnight)
- .each_batch do |batch|
- batch.update_all(managed: false)
- end
- end
-
- def down
- end
-end
diff --git a/db/post_migrate/20190618171120_update_geo_nodes_primary.rb b/db/post_migrate/20190618171120_update_geo_nodes_primary.rb
deleted file mode 100644
index dc9cfbda177..00000000000
--- a/db/post_migrate/20190618171120_update_geo_nodes_primary.rb
+++ /dev/null
@@ -1,20 +0,0 @@
-# frozen_string_literal: true
-
-# See http://doc.gitlab.com/ce/development/migration_style_guide.html
-# for more information on how to write migrations for GitLab.
-
-class UpdateGeoNodesPrimary < ActiveRecord::Migration[5.1]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- def up
- change_column_default(:geo_nodes, :primary, false)
- change_column_null(:geo_nodes, :primary, false, false)
- end
-
- def down
- change_column_default(:geo_nodes, :primary, nil)
- change_column_null(:geo_nodes, :primary, true)
- end
-end
diff --git a/db/post_migrate/20190619175843_remove_import_columns_from_projects.rb b/db/post_migrate/20190619175843_remove_import_columns_from_projects.rb
deleted file mode 100644
index 85f776ac99c..00000000000
--- a/db/post_migrate/20190619175843_remove_import_columns_from_projects.rb
+++ /dev/null
@@ -1,14 +0,0 @@
-# frozen_string_literal: true
-
-class RemoveImportColumnsFromProjects < ActiveRecord::Migration[5.1]
- include Gitlab::Database::MigrationHelpers
-
- # Set this constant to true if this migration requires downtime.
- DOWNTIME = false
-
- def change
- remove_column :projects, :import_status, :string
- remove_column :projects, :import_jid, :string
- remove_column :projects, :import_error, :text
- end
-end
diff --git a/db/post_migrate/20190620112608_enqueue_reset_merge_status_second_run.rb b/db/post_migrate/20190620112608_enqueue_reset_merge_status_second_run.rb
deleted file mode 100644
index 2d096a2a39c..00000000000
--- a/db/post_migrate/20190620112608_enqueue_reset_merge_status_second_run.rb
+++ /dev/null
@@ -1,25 +0,0 @@
-# frozen_string_literal: true
-
-# See http://doc.gitlab.com/ce/development/migration_style_guide.html
-# for more information on how to write migrations for GitLab.
-
-class EnqueueResetMergeStatusSecondRun < ActiveRecord::Migration[5.1]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
- BATCH_SIZE = 10_000
- MIGRATION = 'ResetMergeStatus'
- DELAY_INTERVAL = 5.minutes.to_i
-
- disable_ddl_transaction!
-
- def up
- say 'Scheduling `ResetMergeStatus` jobs'
-
- # We currently have more than ~5_000_000 merge request records on GitLab.com.
- # This means it'll schedule ~500 jobs (10k MRs each) with a 5 minutes gap,
- # so this should take ~41 hours for all background migrations to complete.
- # ((5_000_000 / 10_000) * 5) / 60 => 41.6666..
- queue_background_migration_jobs_by_range_at_intervals(MergeRequest, MIGRATION, DELAY_INTERVAL, batch_size: BATCH_SIZE)
- end
-end
diff --git a/db/post_migrate/20190625184066_remove_sentry_from_application_settings.rb b/db/post_migrate/20190625184066_remove_sentry_from_application_settings.rb
deleted file mode 100644
index 7a0923aabd8..00000000000
--- a/db/post_migrate/20190625184066_remove_sentry_from_application_settings.rb
+++ /dev/null
@@ -1,40 +0,0 @@
-# frozen_string_literal: true
-
-# See http://doc.gitlab.com/ce/development/migration_style_guide.html
-# for more information on how to write migrations for GitLab.
-
-class RemoveSentryFromApplicationSettings < ActiveRecord::Migration[5.0]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- SENTRY_ENABLED_COLUMNS = [
- :sentry_enabled,
- :clientside_sentry_enabled
- ].freeze
-
- SENTRY_DSN_COLUMNS = [
- :sentry_dsn,
- :clientside_sentry_dsn
- ].freeze
-
- disable_ddl_transaction!
-
- def up
- (SENTRY_ENABLED_COLUMNS + SENTRY_DSN_COLUMNS).each do |column|
- remove_column(:application_settings, column) if column_exists?(:application_settings, column)
- end
- end
-
- def down
- SENTRY_ENABLED_COLUMNS.each do |column|
- # rubocop:disable Migration/AddColumnWithDefault
- add_column_with_default(:application_settings, column, :boolean, default: false, allow_null: false) unless column_exists?(:application_settings, column)
- # rubocop:enable Migration/AddColumnWithDefault
- end
-
- SENTRY_DSN_COLUMNS.each do |column|
- add_column(:application_settings, column, :string) unless column_exists?(:application_settings, column)
- end
- end
-end
diff --git a/db/post_migrate/20190628191740_schedule_fixing_names_of_user_namespaces.rb b/db/post_migrate/20190628191740_schedule_fixing_names_of_user_namespaces.rb
deleted file mode 100644
index 8fa7068b957..00000000000
--- a/db/post_migrate/20190628191740_schedule_fixing_names_of_user_namespaces.rb
+++ /dev/null
@@ -1,48 +0,0 @@
-# frozen_string_literal: true
-
-# See http://doc.gitlab.com/ce/development/migration_style_guide.html
-# for more information on how to write migrations for GitLab.
-
-class ScheduleFixingNamesOfUserNamespaces < ActiveRecord::Migration[5.1]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- class Namespace < ActiveRecord::Base
- include ::EachBatch
-
- self.table_name = 'namespaces'
-
- scope :user_namespaces, -> { where(type: nil) }
- end
-
- class Route < ActiveRecord::Base
- include ::EachBatch
-
- self.table_name = 'routes'
-
- scope :project_routes, -> { where(source_type: 'Project') }
- end
-
- disable_ddl_transaction!
-
- def up
- queue_background_migration_jobs_by_range_at_intervals(
- ScheduleFixingNamesOfUserNamespaces::Namespace.user_namespaces,
- 'FixUserNamespaceNames',
- 60.seconds,
- batch_size: 5000
- )
-
- queue_background_migration_jobs_by_range_at_intervals(
- ScheduleFixingNamesOfUserNamespaces::Route.project_routes,
- 'FixUserProjectRouteNames',
- 60.seconds,
- batch_size: 5000
- )
- end
-
- def down
- # no-op
- end
-end
diff --git a/db/post_migrate/20190702173936_populate_remaining_merge_request_assignees.rb b/db/post_migrate/20190702173936_populate_remaining_merge_request_assignees.rb
deleted file mode 100644
index c435b94015d..00000000000
--- a/db/post_migrate/20190702173936_populate_remaining_merge_request_assignees.rb
+++ /dev/null
@@ -1,20 +0,0 @@
-# frozen_string_literal: true
-
-# See http://doc.gitlab.com/ce/development/migration_style_guide.html
-# for more information on how to write migrations for GitLab.
-
-class PopulateRemainingMergeRequestAssignees < ActiveRecord::Migration[5.1]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
- BATCH_SIZE = 10_000
- MIGRATION = 'PopulateMergeRequestAssigneesTable'
-
- disable_ddl_transaction!
-
- def up
- Gitlab::BackgroundMigration.steal(MIGRATION)
-
- Gitlab::BackgroundMigration::PopulateMergeRequestAssigneesTable.new.perform_all_sync(batch_size: BATCH_SIZE)
- end
-end
diff --git a/db/post_migrate/20190703185326_fix_wrong_pages_access_level.rb b/db/post_migrate/20190703185326_fix_wrong_pages_access_level.rb
deleted file mode 100644
index e5981956cf5..00000000000
--- a/db/post_migrate/20190703185326_fix_wrong_pages_access_level.rb
+++ /dev/null
@@ -1,28 +0,0 @@
-# frozen_string_literal: true
-
-class FixWrongPagesAccessLevel < ActiveRecord::Migration[5.1]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- MIGRATION = 'FixPagesAccessLevel'
- BATCH_SIZE = 20_000
- BATCH_TIME = 2.minutes
-
- disable_ddl_transaction!
-
- class ProjectFeature < ActiveRecord::Base
- include ::EachBatch
-
- self.table_name = 'project_features'
- self.inheritance_column = :_type_disabled
- end
-
- def up
- queue_background_migration_jobs_by_range_at_intervals(
- ProjectFeature,
- MIGRATION,
- BATCH_TIME,
- batch_size: BATCH_SIZE)
- end
-end
diff --git a/db/post_migrate/20190711201818_encrypt_deploy_tokens_tokens.rb b/db/post_migrate/20190711201818_encrypt_deploy_tokens_tokens.rb
deleted file mode 100644
index b2de98118b7..00000000000
--- a/db/post_migrate/20190711201818_encrypt_deploy_tokens_tokens.rb
+++ /dev/null
@@ -1,27 +0,0 @@
-# frozen_string_literal: true
-
-class EncryptDeployTokensTokens < ActiveRecord::Migration[5.1]
- DOWNTIME = false
-
- class DeploymentTokens < ActiveRecord::Base
- self.table_name = 'deploy_tokens'
- end
-
- def up
- say_with_time("Encrypting tokens from deploy_tokens") do
- DeploymentTokens.where('token_encrypted is NULL AND token IS NOT NULL').find_each(batch_size: 10000) do |deploy_token|
- token_encrypted = Gitlab::CryptoHelper.aes256_gcm_encrypt(deploy_token.token, nonce: Gitlab::CryptoHelper::AES256_GCM_IV_STATIC)
- deploy_token.update!(token_encrypted: token_encrypted)
- end
- end
- end
-
- def down
- say_with_time("Decrypting tokens from deploy_tokens") do
- DeploymentTokens.where('token_encrypted IS NOT NULL AND token IS NULL').find_each(batch_size: 10000) do |deploy_token|
- token = Gitlab::CryptoHelper.aes256_gcm_decrypt(deploy_token.token_encrypted)
- deploy_token.update!(token: token)
- end
- end
- end
-end
diff --git a/db/post_migrate/20190715043944_remove_sha_index_from_versions.rb b/db/post_migrate/20190715043944_remove_sha_index_from_versions.rb
deleted file mode 100644
index b23abb80dda..00000000000
--- a/db/post_migrate/20190715043944_remove_sha_index_from_versions.rb
+++ /dev/null
@@ -1,17 +0,0 @@
-# frozen_string_literal: true
-
-class RemoveShaIndexFromVersions < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- remove_concurrent_index :design_management_versions, :sha
- end
-
- def down
- add_concurrent_index :design_management_versions, :sha, unique: true, using: :btree
- end
-end
diff --git a/db/post_migrate/20190715044501_add_unique_issue_id_sha_index_to_versions.rb b/db/post_migrate/20190715044501_add_unique_issue_id_sha_index_to_versions.rb
deleted file mode 100644
index 27b0c9648f9..00000000000
--- a/db/post_migrate/20190715044501_add_unique_issue_id_sha_index_to_versions.rb
+++ /dev/null
@@ -1,17 +0,0 @@
-# frozen_string_literal: true
-
-class AddUniqueIssueIdShaIndexToVersions < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- add_concurrent_index :design_management_versions, [:sha, :issue_id], unique: true, using: :btree
- end
-
- def down
- remove_concurrent_index :design_management_versions, [:sha, :issue_id]
- end
-end
diff --git a/db/post_migrate/20190715114644_drop_project_features_pages_access_level_default.rb b/db/post_migrate/20190715114644_drop_project_features_pages_access_level_default.rb
deleted file mode 100644
index 2fb0aa0f460..00000000000
--- a/db/post_migrate/20190715114644_drop_project_features_pages_access_level_default.rb
+++ /dev/null
@@ -1,12 +0,0 @@
-# frozen_string_literal: true
-
-class DropProjectFeaturesPagesAccessLevelDefault < ActiveRecord::Migration[5.1]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
- ENABLED_VALUE = 20
-
- def change
- change_column_default :project_features, :pages_access_level, from: ENABLED_VALUE, to: nil
- end
-end
diff --git a/db/post_migrate/20190715193142_migrate_discussion_id_on_promoted_epics.rb b/db/post_migrate/20190715193142_migrate_discussion_id_on_promoted_epics.rb
deleted file mode 100644
index 13f8477f3ea..00000000000
--- a/db/post_migrate/20190715193142_migrate_discussion_id_on_promoted_epics.rb
+++ /dev/null
@@ -1,62 +0,0 @@
-# frozen_string_literal: true
-
-# See http://doc.gitlab.com/ce/development/migration_style_guide.html
-# for more information on how to write migrations for GitLab.
-
-class MigrateDiscussionIdOnPromotedEpics < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- # We have ~5000 unique discussion_ids -> this migration will take about 102 minutes
- # (5000/100 * 2 minutes + 2 minutes initial delay) on gitlab.com.
- DOWNTIME = false
- BATCH_SIZE = 100
- DELAY_INTERVAL = 2.minutes
- MIGRATION = 'FixPromotedEpicsDiscussionIds'
-
- disable_ddl_transaction!
-
- class SystemNoteMetadata < ActiveRecord::Base
- self.table_name = 'system_note_metadata'
- self.inheritance_column = :_type_disabled
- end
-
- class Note < ActiveRecord::Base
- include EachBatch
-
- has_one :system_note_metadata, class_name: 'MigrateDiscussionIdOnPromotedEpics::SystemNoteMetadata'
-
- self.table_name = 'notes'
- self.inheritance_column = :_type_disabled
-
- def self.fetch_discussion_ids_query
- promoted_epics_query = Note
- .joins(:system_note_metadata)
- .where(system: true)
- .where(noteable_type: 'Epic')
- .where(system_note_metadata: { action: 'moved' })
- .select("DISTINCT noteable_id")
-
- Note.where(noteable_type: 'Epic')
- .where(noteable_id: promoted_epics_query)
- .distinct.pluck(:discussion_id)
- end
- end
-
- def up
- add_concurrent_index(:system_note_metadata, :note_id, where: "action='moved'", name: 'temp_index_system_note_metadata_on_moved_note_id')
- add_concurrent_index(:notes, [:id, :noteable_id], where: "noteable_type='Epic' AND system", name: 'temp_index_notes_on_id_and_noteable_id' )
-
- all_discussion_ids = Note.fetch_discussion_ids_query
- all_discussion_ids.in_groups_of(BATCH_SIZE, false).each_with_index do |ids, index|
- delay = DELAY_INTERVAL * (index + 1)
- BackgroundMigrationWorker.perform_in(delay, MIGRATION, [ids])
- end
-
- remove_concurrent_index(:system_note_metadata, :note_id, where: "action='moved'", name: 'temp_index_system_note_metadata_on_moved_note_id')
- remove_concurrent_index(:notes, [:id, :noteable_id], where: "noteable_type='Epic' AND system", name: 'temp_index_notes_on_id_and_noteable_id')
- end
-
- def down
- # no-op
- end
-end
diff --git a/db/post_migrate/20190723105753_add_index_on_identities_lower_extern_uid_and_provider.rb b/db/post_migrate/20190723105753_add_index_on_identities_lower_extern_uid_and_provider.rb
deleted file mode 100644
index 36ecca4821f..00000000000
--- a/db/post_migrate/20190723105753_add_index_on_identities_lower_extern_uid_and_provider.rb
+++ /dev/null
@@ -1,19 +0,0 @@
-# frozen_string_literal: true
-
-class AddIndexOnIdentitiesLowerExternUidAndProvider < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- INDEX_NAME = "index_on_identities_lower_extern_uid_and_provider"
-
- def up
- add_concurrent_index(:identities, 'lower(extern_uid), provider', name: INDEX_NAME)
- end
-
- def down
- remove_concurrent_index_by_name(:identities, INDEX_NAME)
- end
-end
diff --git a/db/post_migrate/20190725080128_set_not_null_on_users_private_profile.rb b/db/post_migrate/20190725080128_set_not_null_on_users_private_profile.rb
deleted file mode 100644
index db42e949d3f..00000000000
--- a/db/post_migrate/20190725080128_set_not_null_on_users_private_profile.rb
+++ /dev/null
@@ -1,26 +0,0 @@
-# frozen_string_literal: true
-
-class SetNotNullOnUsersPrivateProfile < ActiveRecord::Migration[5.1]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- Gitlab::BackgroundMigration.steal('MigrateNullPrivateProfileToFalse')
-
- # rubocop:disable Migration/UpdateLargeTable
- # rubocop:disable Migration/UpdateColumnInBatches
- # Data has been migrated previously, count should be close to 0
- update_column_in_batches(:users, :private_profile, false) do |table, query|
- query.where(table[:private_profile].eq(nil))
- end
-
- change_column_null :users, :private_profile, false
- end
-
- def down
- change_column_null :users, :private_profile, true
- end
-end
diff --git a/db/post_migrate/20190801114109_cleanup_allow_local_requests_from_hooks_and_services_application_setting_rename.rb b/db/post_migrate/20190801114109_cleanup_allow_local_requests_from_hooks_and_services_application_setting_rename.rb
deleted file mode 100644
index cb86f843f9c..00000000000
--- a/db/post_migrate/20190801114109_cleanup_allow_local_requests_from_hooks_and_services_application_setting_rename.rb
+++ /dev/null
@@ -1,17 +0,0 @@
-# frozen_string_literal: true
-
-class CleanupAllowLocalRequestsFromHooksAndServicesApplicationSettingRename < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- cleanup_concurrent_column_rename :application_settings, :allow_local_requests_from_hooks_and_services, :allow_local_requests_from_web_hooks_and_services
- end
-
- def down
- undo_cleanup_concurrent_column_rename :application_settings, :allow_local_requests_from_hooks_and_services, :allow_local_requests_from_web_hooks_and_services
- end
-end
diff --git a/db/post_migrate/20190802091750_cleanup_application_settings_snowplow_collector_uri_rename.rb b/db/post_migrate/20190802091750_cleanup_application_settings_snowplow_collector_uri_rename.rb
deleted file mode 100644
index 77472585512..00000000000
--- a/db/post_migrate/20190802091750_cleanup_application_settings_snowplow_collector_uri_rename.rb
+++ /dev/null
@@ -1,17 +0,0 @@
-# frozen_string_literal: true
-
-class CleanupApplicationSettingsSnowplowCollectorUriRename < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- cleanup_concurrent_column_rename :application_settings, :snowplow_collector_uri, :snowplow_collector_hostname
- end
-
- def down
- undo_cleanup_concurrent_column_rename :application_settings, :snowplow_collector_uri, :snowplow_collector_hostname
- end
-end
diff --git a/db/post_migrate/20190802235445_add_index_on_id_and_type_and_public_to_keys.rb b/db/post_migrate/20190802235445_add_index_on_id_and_type_and_public_to_keys.rb
deleted file mode 100644
index 9b4d74b4bea..00000000000
--- a/db/post_migrate/20190802235445_add_index_on_id_and_type_and_public_to_keys.rb
+++ /dev/null
@@ -1,23 +0,0 @@
-# frozen_string_literal: true
-
-class AddIndexOnIdAndTypeAndPublicToKeys < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- INDEX_NAME = "index_on_deploy_keys_id_and_type_and_public"
-
- def up
- add_concurrent_index(:keys,
- [:id, :type],
- where: "public = 't'",
- unique: true,
- name: INDEX_NAME)
- end
-
- def down
- remove_concurrent_index_by_name(:keys, INDEX_NAME)
- end
-end
diff --git a/db/post_migrate/20190809072552_set_self_monitoring_project_alerting_token.rb b/db/post_migrate/20190809072552_set_self_monitoring_project_alerting_token.rb
deleted file mode 100644
index d10887fb5d5..00000000000
--- a/db/post_migrate/20190809072552_set_self_monitoring_project_alerting_token.rb
+++ /dev/null
@@ -1,19 +0,0 @@
-# frozen_string_literal: true
-
-class SetSelfMonitoringProjectAlertingToken < ActiveRecord::Migration[5.2]
- DOWNTIME = false
-
- def up
- # no-op
- # Converted to no-op in https://gitlab.com/gitlab-org/gitlab/merge_requests/17049.
-
- # This migration has been made a no-op because the pre-requisite migration
- # which creates the self-monitoring project has already been removed in
- # https://gitlab.com/gitlab-org/gitlab/merge_requests/16864. As
- # such, this migration would do nothing.
- end
-
- def down
- # no-op
- end
-end
diff --git a/db/post_migrate/20190812070645_migrate_private_profile_nulls.rb b/db/post_migrate/20190812070645_migrate_private_profile_nulls.rb
deleted file mode 100644
index 063c1e16c27..00000000000
--- a/db/post_migrate/20190812070645_migrate_private_profile_nulls.rb
+++ /dev/null
@@ -1,31 +0,0 @@
-# frozen_string_literal: true
-
-class MigratePrivateProfileNulls < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
- DELAY = 5.minutes.to_i
- BATCH_SIZE = 1_000
-
- disable_ddl_transaction!
-
- class User < ActiveRecord::Base
- self.table_name = 'users'
-
- include ::EachBatch
- end
-
- def up
- # Migration will take about 7 hours
- User.where(private_profile: nil).each_batch(of: BATCH_SIZE) do |batch, index|
- range = batch.pluck(Arel.sql("MIN(id)"), Arel.sql("MAX(id)")).first
- delay = index * DELAY
-
- BackgroundMigrationWorker.perform_in(delay.seconds, 'MigrateNullPrivateProfileToFalse', [*range])
- end
- end
-
- def down
- # noop
- end
-end
diff --git a/db/post_migrate/20190819231552_update_knative_prometheus_query_for_invocation_count.rb b/db/post_migrate/20190819231552_update_knative_prometheus_query_for_invocation_count.rb
deleted file mode 100644
index 828f551baf6..00000000000
--- a/db/post_migrate/20190819231552_update_knative_prometheus_query_for_invocation_count.rb
+++ /dev/null
@@ -1,13 +0,0 @@
-# frozen_string_literal: true
-
-class UpdateKnativePrometheusQueryForInvocationCount < ActiveRecord::Migration[5.2]
- DOWNTIME = false
-
- def up
- ::Gitlab::DatabaseImporters::CommonMetrics::Importer.new.execute
- end
-
- def down
- # no-op
- end
-end
diff --git a/db/post_migrate/20190822185441_cleanup_epics_state_id_rename.rb b/db/post_migrate/20190822185441_cleanup_epics_state_id_rename.rb
deleted file mode 100644
index 471b2ab9ca2..00000000000
--- a/db/post_migrate/20190822185441_cleanup_epics_state_id_rename.rb
+++ /dev/null
@@ -1,17 +0,0 @@
-# frozen_string_literal: true
-
-class CleanupEpicsStateIdRename < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- cleanup_concurrent_column_rename :epics, :state, :state_id
- end
-
- def down
- rename_column_concurrently :epics, :state_id, :state
- end
-end
diff --git a/db/post_migrate/20190827102026_migrate_code_owner_approval_status_to_protected_branches_in_batches.rb b/db/post_migrate/20190827102026_migrate_code_owner_approval_status_to_protected_branches_in_batches.rb
deleted file mode 100644
index b109f582909..00000000000
--- a/db/post_migrate/20190827102026_migrate_code_owner_approval_status_to_protected_branches_in_batches.rb
+++ /dev/null
@@ -1,46 +0,0 @@
-# frozen_string_literal: true
-
-class MigrateCodeOwnerApprovalStatusToProtectedBranchesInBatches < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- disable_ddl_transaction!
-
- DOWNTIME = false
- BATCH_SIZE = 200
-
- class Project < ActiveRecord::Base
- include EachBatch
-
- self.table_name = 'projects'
- self.inheritance_column = :_type_disabled
-
- has_many :protected_branches
- end
-
- class ProtectedBranch < ActiveRecord::Base
- include EachBatch
-
- self.table_name = 'protected_branches'
- self.inheritance_column = :_type_disabled
-
- belongs_to :project
- end
-
- def up
- add_concurrent_index :projects, :id, name: "temp_active_projects_with_prot_branches", where: 'archived = false and pending_delete = false and merge_requests_require_code_owner_approval = true'
-
- ProtectedBranch
- .joins(:project)
- .where(projects: { archived: false, pending_delete: false, merge_requests_require_code_owner_approval: true })
- .each_batch(of: BATCH_SIZE) do |batch|
- batch.update_all(code_owner_approval_required: true)
- end
-
- remove_concurrent_index_by_name(:projects, "temp_active_projects_with_prot_branches")
- end
-
- def down
- # noop
- #
- end
-end
diff --git a/db/post_migrate/20190902160015_remove_support_bot_column_from_users.rb b/db/post_migrate/20190902160015_remove_support_bot_column_from_users.rb
deleted file mode 100644
index 80d69b57f5d..00000000000
--- a/db/post_migrate/20190902160015_remove_support_bot_column_from_users.rb
+++ /dev/null
@@ -1,19 +0,0 @@
-# frozen_string_literal: true
-
-class RemoveSupportBotColumnFromUsers < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- return unless column_exists?(:users, :support_bot)
-
- remove_column :users, :support_bot
- end
-
- def down
- # no-op because the column should not exist in the previous version
- end
-end
diff --git a/db/post_migrate/20190904205212_remove_id_column_from_intermediate_release_milestones.rb b/db/post_migrate/20190904205212_remove_id_column_from_intermediate_release_milestones.rb
deleted file mode 100644
index e4b65d26db6..00000000000
--- a/db/post_migrate/20190904205212_remove_id_column_from_intermediate_release_milestones.rb
+++ /dev/null
@@ -1,9 +0,0 @@
-# frozen_string_literal: true
-
-class RemoveIdColumnFromIntermediateReleaseMilestones < ActiveRecord::Migration[5.2]
- DOWNTIME = false
-
- def change
- remove_column :milestone_releases, :id, :bigint
- end
-end
diff --git a/db/post_migrate/20190905091812_schedule_project_any_approval_rule_migration.rb b/db/post_migrate/20190905091812_schedule_project_any_approval_rule_migration.rb
deleted file mode 100644
index be47e4dfdf5..00000000000
--- a/db/post_migrate/20190905091812_schedule_project_any_approval_rule_migration.rb
+++ /dev/null
@@ -1,49 +0,0 @@
-# frozen_string_literal: true
-
-# See http://doc.gitlab.com/ce/development/migration_style_guide.html
-# for more information on how to write migrations for GitLab.
-
-class ScheduleProjectAnyApprovalRuleMigration < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
- BATCH_SIZE = 5_000
- MIGRATION = 'PopulateAnyApprovalRuleForProjects'
- DELAY_INTERVAL = 8.minutes.to_i
-
- disable_ddl_transaction!
-
- class Project < ActiveRecord::Base
- include EachBatch
-
- self.table_name = 'projects'
-
- scope :with_approvals_before_merge, -> { where('approvals_before_merge <> 0') }
- end
-
- def up
- return unless Gitlab.ee?
-
- add_concurrent_index :projects, :id,
- name: 'tmp_projects_with_approvals_before_merge',
- where: 'approvals_before_merge <> 0'
-
- say "Scheduling `#{MIGRATION}` jobs"
-
- # We currently have ~43k project records with non-zero approvals_before_merge on GitLab.com.
- # This means it'll schedule ~9 jobs (5k projects each) with a 8 minutes gap,
- # so this should take ~1 hour for all background migrations to complete.
- #
- # The approximate expected number of affected rows is: 18k
-
- queue_background_migration_jobs_by_range_at_intervals(
- ScheduleProjectAnyApprovalRuleMigration::Project.with_approvals_before_merge,
- MIGRATION, DELAY_INTERVAL, batch_size: BATCH_SIZE)
-
- remove_concurrent_index_by_name(:projects, 'tmp_projects_with_approvals_before_merge')
- end
-
- def down
- # no-op
- end
-end
diff --git a/db/post_migrate/20190905091831_schedule_merge_request_any_approval_rule_migration.rb b/db/post_migrate/20190905091831_schedule_merge_request_any_approval_rule_migration.rb
deleted file mode 100644
index cdec87270f0..00000000000
--- a/db/post_migrate/20190905091831_schedule_merge_request_any_approval_rule_migration.rb
+++ /dev/null
@@ -1,49 +0,0 @@
-# frozen_string_literal: true
-
-# See http://doc.gitlab.com/ce/development/migration_style_guide.html
-# for more information on how to write migrations for GitLab.
-
-class ScheduleMergeRequestAnyApprovalRuleMigration < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
- BATCH_SIZE = 5_000
- MIGRATION = 'PopulateAnyApprovalRuleForMergeRequests'
- DELAY_INTERVAL = 8.minutes.to_i
-
- disable_ddl_transaction!
-
- class MergeRequest < ActiveRecord::Base
- include EachBatch
-
- self.table_name = 'merge_requests'
-
- scope :with_approvals_before_merge, -> { where('approvals_before_merge <> 0') }
- end
-
- def up
- return unless Gitlab.ee?
-
- add_concurrent_index :merge_requests, :id,
- name: 'tmp_merge_requests_with_approvals_before_merge',
- where: 'approvals_before_merge <> 0'
-
- say "Scheduling `#{MIGRATION}` jobs"
-
- # We currently have ~440_000 merge request records with non-zero approvals_before_merge on GitLab.com.
- # This means it'll schedule ~88 jobs (5k merge requests each) with a 8 minutes gap,
- # so this should take ~12 hours for all background migrations to complete.
- #
- # The approximate expected number of affected rows is: 190k
-
- queue_background_migration_jobs_by_range_at_intervals(
- ScheduleMergeRequestAnyApprovalRuleMigration::MergeRequest.with_approvals_before_merge,
- MIGRATION, DELAY_INTERVAL, batch_size: BATCH_SIZE)
-
- remove_concurrent_index_by_name(:merge_requests, 'tmp_merge_requests_with_approvals_before_merge')
- end
-
- def down
- # no-op
- end
-end
diff --git a/db/post_migrate/20190909141517_update_cs_vulnerability_confidence_column.rb b/db/post_migrate/20190909141517_update_cs_vulnerability_confidence_column.rb
deleted file mode 100644
index befa08e0cb6..00000000000
--- a/db/post_migrate/20190909141517_update_cs_vulnerability_confidence_column.rb
+++ /dev/null
@@ -1,32 +0,0 @@
-# frozen_string_literal: true
-
-# See http://doc.gitlab.com/ce/development/migration_style_guide.html
-# for more information on how to write migrations for GitLab.
-class UpdateCsVulnerabilityConfidenceColumn < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- disable_ddl_transaction!
-
- DOWNTIME = false
- BATCH_SIZE = 1_000
- INTERVAL = 5.minutes
-
- # 137_424 records to be updated on GitLab.com,
- # giving us an estimated runtime of 12 hours.
- def up
- # no-op in CE
- return unless Gitlab.ee?
-
- migration = Gitlab::BackgroundMigration::UpdateVulnerabilityConfidence
- migration_name = migration.to_s.demodulize
- relation = migration::Occurrence.container_scanning_reports_with_medium_confidence
- queue_background_migration_jobs_by_range_at_intervals(relation,
- migration_name,
- INTERVAL,
- batch_size: BATCH_SIZE)
- end
-
- def down
- # no-op
- end
-end
diff --git a/db/post_migrate/20190910000130_add_index_on_application_id_on_oauth_access_tokens.rb b/db/post_migrate/20190910000130_add_index_on_application_id_on_oauth_access_tokens.rb
deleted file mode 100644
index 78f7c0ecf0f..00000000000
--- a/db/post_migrate/20190910000130_add_index_on_application_id_on_oauth_access_tokens.rb
+++ /dev/null
@@ -1,17 +0,0 @@
-# frozen_string_literal: true
-
-class AddIndexOnApplicationIdOnOauthAccessTokens < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- add_concurrent_index :oauth_access_tokens, :application_id
- end
-
- def down
- remove_concurrent_index :oauth_access_tokens, :application_id
- end
-end
diff --git a/db/post_migrate/20190911251732_sync_issuables_state_id.rb b/db/post_migrate/20190911251732_sync_issuables_state_id.rb
deleted file mode 100644
index 031837122fb..00000000000
--- a/db/post_migrate/20190911251732_sync_issuables_state_id.rb
+++ /dev/null
@@ -1,81 +0,0 @@
-# frozen_string_literal: true
-
-# Sync remaining records for issues/merge_requests tables where state_id
-# is still null.
-# For more information check: https://gitlab.com/gitlab-org/gitlab/issues/26823
-# It creates a temporary index before performing the UPDATES to sync values.
-#
-# In 09-11-2019 we have the following numbers for records with state_id == nil:
-#
-# 1348 issues - default batch size for each update 67
-# 10247 merge requests - default batch size for each update 511
-
-class SyncIssuablesStateId < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- %i(issues merge_requests).each do |table|
- temp_index_name = index_name_for(table)
-
- add_concurrent_index(
- table,
- 'id',
- name: temp_index_name,
- where: 'state_id IS NULL'
- )
-
- update_value = update_condition_for(table)
-
- update_column_in_batches(table, :state_id, update_value) do |table, query|
- query.where(table[:state_id].eq(nil))
- end
- ensure
- remove_concurrent_index_by_name(table, temp_index_name)
- end
- end
-
- def down
- # NO OP
- end
-
- def update_condition_for(table)
- value_expresson =
- if table == :issues
- issues_state_id_condition
- else
- merge_requests_state_id_condition
- end
-
- Arel.sql(value_expresson)
- end
-
- def index_name_for(table)
- "idx_tmp_on_#{table}_where_state_id_is_null"
- end
-
- def issues_state_id_condition
- <<~SQL
- CASE state
- WHEN 'opened' THEN 1
- WHEN 'closed' THEN 2
- ELSE 2
- END
- SQL
- end
-
- def merge_requests_state_id_condition
- <<~SQL
- CASE state
- WHEN 'opened' THEN 1
- WHEN 'closed' THEN 2
- WHEN 'merged' THEN 3
- WHEN 'locked' THEN 4
- ELSE 2
- END
- SQL
- end
-end
diff --git a/db/post_migrate/20190917173107_backfill_software_licenses_spdx_identifiers.rb b/db/post_migrate/20190917173107_backfill_software_licenses_spdx_identifiers.rb
deleted file mode 100644
index 09492f5f99e..00000000000
--- a/db/post_migrate/20190917173107_backfill_software_licenses_spdx_identifiers.rb
+++ /dev/null
@@ -1,57 +0,0 @@
-# frozen_string_literal: true
-
-class BackfillSoftwareLicensesSpdxIdentifiers < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
- CURRENT_LICENSES = {
- 'AGPL-1.0' => 'AGPL-1.0',
- 'AGPL-3.0' => 'AGPL-3.0',
- 'Apache 2.0' => 'Apache-2.0',
- 'Artistic-2.0' => 'Artistic-2.0',
- 'BSD' => 'BSD-4-Clause',
- 'CC0 1.0 Universal' => 'CC0-1.0',
- 'CDDL-1.0' => 'CDDL-1.0',
- 'CDDL-1.1' => 'CDDL-1.1',
- 'EPL-1.0' => 'EPL-1.0',
- 'EPL-2.0' => 'EPL-2.0',
- 'GPLv2' => 'GPL-2.0',
- 'GPLv3' => 'GPL-3.0',
- 'ISC' => 'ISC',
- 'LGPL' => 'LGPL-3.0-only',
- 'LGPL-2.1' => 'LGPL-2.1',
- 'MIT' => 'MIT',
- 'Mozilla Public License 2.0' => 'MPL-2.0',
- 'MS-PL' => 'MS-PL',
- 'MS-RL' => 'MS-RL',
- 'New BSD' => 'BSD-3-Clause',
- 'Python Software Foundation License' => 'Python-2.0',
- 'ruby' => 'Ruby',
- 'Simplified BSD' => 'BSD-2-Clause',
- 'WTFPL' => 'WTFPL',
- 'Zlib' => 'Zlib'
- }.freeze
-
- disable_ddl_transaction!
-
- # 25 records to be updated on GitLab.com
- def up
- return unless Gitlab.ee?
-
- say "Expect #{CURRENT_LICENSES.count} updates to the software_licenses table to occur"
- CURRENT_LICENSES.each do |name, spdx_identifier|
- # The following cop is disabled because of https://gitlab.com/gitlab-org/gitlab/issues/33470
- # For more context see https://gitlab.com/gitlab-org/gitlab/merge_requests/17004#note_226264823
- # rubocop:disable Migration/UpdateColumnInBatches
- update_column_in_batches(:software_licenses, :spdx_identifier, spdx_identifier) do |table, query|
- query.where(table[:name].eq(name))
- end
- end
- end
-
- def down
- return unless Gitlab.ee?
-
- update_column_in_batches(:software_licenses, :spdx_identifier, nil)
- end
-end
diff --git a/db/post_migrate/20190918104222_schedule_productivity_analytics_backfill.rb b/db/post_migrate/20190918104222_schedule_productivity_analytics_backfill.rb
deleted file mode 100644
index cd759735f00..00000000000
--- a/db/post_migrate/20190918104222_schedule_productivity_analytics_backfill.rb
+++ /dev/null
@@ -1,15 +0,0 @@
-# frozen_string_literal: true
-
-class ScheduleProductivityAnalyticsBackfill < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- def up
- # no-op since the migration was removed
- end
-
- def down
- # no-op
- end
-end
diff --git a/db/post_migrate/20190924152703_migrate_issue_trackers_data.rb b/db/post_migrate/20190924152703_migrate_issue_trackers_data.rb
deleted file mode 100644
index 93ea501e7e0..00000000000
--- a/db/post_migrate/20190924152703_migrate_issue_trackers_data.rb
+++ /dev/null
@@ -1,31 +0,0 @@
-# frozen_string_literal: true
-
-class MigrateIssueTrackersData < ActiveRecord::Migration[5.1]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
- INTERVAL = 3.minutes.to_i
- BATCH_SIZE = 5_000
- MIGRATION = 'MigrateIssueTrackersSensitiveData'
-
- disable_ddl_transaction!
-
- class Service < ActiveRecord::Base
- self.table_name = 'services'
- self.inheritance_column = :_type_disabled
-
- include ::EachBatch
- end
-
- def up
- relation = Service.where(category: 'issue_tracker').where("properties IS NOT NULL AND properties != '{}' AND properties != ''")
- queue_background_migration_jobs_by_range_at_intervals(relation,
- MIGRATION,
- INTERVAL,
- batch_size: BATCH_SIZE)
- end
-
- def down
- # no need
- end
-end
diff --git a/db/post_migrate/20190926180443_schedule_epic_issues_after_epics_move.rb b/db/post_migrate/20190926180443_schedule_epic_issues_after_epics_move.rb
deleted file mode 100644
index 113b7104209..00000000000
--- a/db/post_migrate/20190926180443_schedule_epic_issues_after_epics_move.rb
+++ /dev/null
@@ -1,35 +0,0 @@
-# frozen_string_literal: true
-
-# See http://doc.gitlab.com/ce/development/migration_style_guide.html
-# for more information on how to write migrations for GitLab.
-
-class ScheduleEpicIssuesAfterEpicsMove < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
- INTERVAL = 5.minutes.to_i
- BATCH_SIZE = 100
- MIGRATION = 'MoveEpicIssuesAfterEpics'
-
- disable_ddl_transaction!
-
- class Epic < ActiveRecord::Base
- self.table_name = 'epics'
-
- include ::EachBatch
- end
-
- def up
- return unless ::Gitlab.ee?
-
- Epic.each_batch(of: BATCH_SIZE) do |batch, index|
- range = batch.pluck('MIN(id)', 'MAX(id)').first
- delay = index * INTERVAL
- BackgroundMigrationWorker.perform_in(delay, MIGRATION, range)
- end
- end
-
- def down
- # no need
- end
-end
diff --git a/db/post_migrate/20191002031332_schedule_pages_metadata_migration.rb b/db/post_migrate/20191002031332_schedule_pages_metadata_migration.rb
deleted file mode 100644
index 0cd24da50d0..00000000000
--- a/db/post_migrate/20191002031332_schedule_pages_metadata_migration.rb
+++ /dev/null
@@ -1,30 +0,0 @@
-# frozen_string_literal: true
-
-class SchedulePagesMetadataMigration < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- BATCH_SIZE = 10_000
- MIGRATION = 'MigratePagesMetadata'
-
- disable_ddl_transaction!
-
- class Project < ActiveRecord::Base
- include ::EachBatch
-
- self.table_name = 'projects'
- end
-
- def up
- say "Scheduling `#{MIGRATION}` jobs"
-
- # At the time of writing there are ~10_669_292 records to be inserted for GitLab.com,
- # batches of 10_000 with delay interval of 2 minutes gives us an estimate of close to 36 hours.
- queue_background_migration_jobs_by_range_at_intervals(Project, MIGRATION, 2.minutes, batch_size: BATCH_SIZE)
- end
-
- def down
- # no-op
- end
-end
diff --git a/db/post_migrate/20191007163701_populate_remaining_any_approver_rules_for_merge_requests.rb b/db/post_migrate/20191007163701_populate_remaining_any_approver_rules_for_merge_requests.rb
deleted file mode 100644
index e1c0f1d6c0c..00000000000
--- a/db/post_migrate/20191007163701_populate_remaining_any_approver_rules_for_merge_requests.rb
+++ /dev/null
@@ -1,44 +0,0 @@
-# frozen_string_literal: true
-
-# See http://doc.gitlab.com/ce/development/migration_style_guide.html
-# for more information on how to write migrations for GitLab.
-
-class PopulateRemainingAnyApproverRulesForMergeRequests < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
- BATCH_SIZE = 10_000
- MIGRATION = 'PopulateAnyApprovalRuleForMergeRequests'
-
- disable_ddl_transaction!
-
- class MergeRequest < ActiveRecord::Base
- include EachBatch
-
- self.table_name = 'merge_requests'
-
- scope :with_approvals_before_merge, -> { where.not(approvals_before_merge: 0) }
- end
-
- def up
- return unless Gitlab.ee?
-
- add_concurrent_index :merge_requests, :id,
- name: 'tmp_merge_requests_with_approvals_before_merge',
- where: 'approvals_before_merge != 0'
-
- Gitlab::BackgroundMigration.steal(MIGRATION)
-
- PopulateRemainingAnyApproverRulesForMergeRequests::MergeRequest.with_approvals_before_merge.each_batch(of: BATCH_SIZE) do |batch|
- range = batch.pluck('MIN(id)', 'MAX(id)').first
-
- Gitlab::BackgroundMigration::PopulateAnyApprovalRuleForMergeRequests.new.perform(*range)
- end
-
- remove_concurrent_index_by_name(:merge_requests, 'tmp_merge_requests_with_approvals_before_merge')
- end
-
- def down
- # no-op
- end
-end
diff --git a/db/post_migrate/20191007163736_populate_remaining_any_approver_rules_for_projects.rb b/db/post_migrate/20191007163736_populate_remaining_any_approver_rules_for_projects.rb
deleted file mode 100644
index fce17ffcf16..00000000000
--- a/db/post_migrate/20191007163736_populate_remaining_any_approver_rules_for_projects.rb
+++ /dev/null
@@ -1,44 +0,0 @@
-# frozen_string_literal: true
-
-# See http://doc.gitlab.com/ce/development/migration_style_guide.html
-# for more information on how to write migrations for GitLab.
-
-class PopulateRemainingAnyApproverRulesForProjects < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
- BATCH_SIZE = 5_000
- MIGRATION = 'PopulateAnyApprovalRuleForProjects'
-
- disable_ddl_transaction!
-
- class Project < ActiveRecord::Base
- include EachBatch
-
- self.table_name = 'projects'
-
- scope :with_approvals_before_merge, -> { where.not(approvals_before_merge: 0) }
- end
-
- def up
- return unless Gitlab.ee?
-
- add_concurrent_index :projects, :id,
- name: 'tmp_projects_with_approvals_before_merge',
- where: 'approvals_before_merge != 0'
-
- Gitlab::BackgroundMigration.steal(MIGRATION)
-
- PopulateRemainingAnyApproverRulesForProjects::Project.with_approvals_before_merge.each_batch(of: BATCH_SIZE) do |batch|
- range = batch.pluck('MIN(id)', 'MAX(id)').first
-
- Gitlab::BackgroundMigration::PopulateAnyApprovalRuleForProjects.new.perform(*range)
- end
-
- remove_concurrent_index_by_name(:projects, 'tmp_projects_with_approvals_before_merge')
- end
-
- def down
- # no-op
- end
-end
diff --git a/db/post_migrate/20191008143850_fix_any_approver_rule_for_projects.rb b/db/post_migrate/20191008143850_fix_any_approver_rule_for_projects.rb
deleted file mode 100644
index c1f4b7e42ab..00000000000
--- a/db/post_migrate/20191008143850_fix_any_approver_rule_for_projects.rb
+++ /dev/null
@@ -1,51 +0,0 @@
-# frozen_string_literal: true
-
-# See http://doc.gitlab.com/ce/development/migration_style_guide.html
-# for more information on how to write migrations for GitLab.
-
-class FixAnyApproverRuleForProjects < ActiveRecord::Migration[5.2]
- DOWNTIME = false
- BATCH_SIZE = 1000
-
- disable_ddl_transaction!
-
- class ApprovalProjectRule < ActiveRecord::Base
- NON_EXISTENT_RULE_TYPE = 4
- ANY_APPROVER_RULE_TYPE = 3
-
- include EachBatch
-
- self.table_name = 'approval_project_rules'
-
- scope :any_approver, -> { where(rule_type: ANY_APPROVER_RULE_TYPE) }
- scope :non_existent_rule_type, -> { where(rule_type: NON_EXISTENT_RULE_TYPE) }
- end
-
- def up
- return unless Gitlab.ee?
-
- # Remove approval project rule with rule type 4 if the project has a rule with rule_type 3
- #
- # Currently, there is no projects on gitlab.com which have both rules with 3 and 4 rule type
- # There's a code-level validation for a rule, which doesn't allow to create rules with the same names
- #
- # But in order to avoid failing the update query due to uniqueness constraint
- # Let's run the delete query to be sure
- project_ids = FixAnyApproverRuleForProjects::ApprovalProjectRule.any_approver.select(:project_id)
- FixAnyApproverRuleForProjects::ApprovalProjectRule
- .non_existent_rule_type
- .where(project_id: project_ids)
- .delete_all
-
- # Set approval project rule types to 3
- # Currently there are 18_445 records to be updated
- FixAnyApproverRuleForProjects::ApprovalProjectRule.non_existent_rule_type.each_batch(of: BATCH_SIZE) do |rules|
- rules.update_all(rule_type: FixAnyApproverRuleForProjects::ApprovalProjectRule::ANY_APPROVER_RULE_TYPE)
- end
- end
-
- def down
- # The migration doesn't leave the database in an inconsistent state
- # And can be run multiple times
- end
-end
diff --git a/db/post_migrate/20191014030134_cleanup_design_management_version_user_to_author_rename.rb b/db/post_migrate/20191014030134_cleanup_design_management_version_user_to_author_rename.rb
deleted file mode 100644
index e7132cbeeb7..00000000000
--- a/db/post_migrate/20191014030134_cleanup_design_management_version_user_to_author_rename.rb
+++ /dev/null
@@ -1,17 +0,0 @@
-# frozen_string_literal: true
-
-class CleanupDesignManagementVersionUserToAuthorRename < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- cleanup_concurrent_column_rename :design_management_versions, :user_id, :author_id
- end
-
- def down
- undo_cleanup_concurrent_column_rename :design_management_versions, :user_id, :author_id
- end
-end
diff --git a/db/post_migrate/20191015154408_drop_merge_requests_require_code_owner_approval_from_projects.rb b/db/post_migrate/20191015154408_drop_merge_requests_require_code_owner_approval_from_projects.rb
deleted file mode 100644
index f31471c2891..00000000000
--- a/db/post_migrate/20191015154408_drop_merge_requests_require_code_owner_approval_from_projects.rb
+++ /dev/null
@@ -1,27 +0,0 @@
-# frozen_string_literal: true
-
-# See http://doc.gitlab.com/ce/development/migration_style_guide.html
-# for more information on how to write migrations for GitLab.
-
-class DropMergeRequestsRequireCodeOwnerApprovalFromProjects < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- remove_column :projects, :merge_requests_require_code_owner_approval, :boolean
- end
-
- def down
- add_column :projects, :merge_requests_require_code_owner_approval, :boolean # rubocop:disable Migration/AddColumnsToWideTables
-
- add_concurrent_index(
- :projects,
- %i[archived pending_delete merge_requests_require_code_owner_approval],
- name: 'projects_requiring_code_owner_approval',
- where: '((pending_delete = false) AND (archived = false) AND (merge_requests_require_code_owner_approval = true))'
- )
- end
-end
diff --git a/db/post_migrate/20191017045817_schedule_fix_gitlab_com_pages_access_level.rb b/db/post_migrate/20191017045817_schedule_fix_gitlab_com_pages_access_level.rb
deleted file mode 100644
index fc44568ea17..00000000000
--- a/db/post_migrate/20191017045817_schedule_fix_gitlab_com_pages_access_level.rb
+++ /dev/null
@@ -1,17 +0,0 @@
-# frozen_string_literal: true
-
-# See http://doc.gitlab.com/ce/development/migration_style_guide.html
-# for more information on how to write migrations for GitLab.
-
-# Code of this migration was removed after execution on gitlab.com
-# https://gitlab.com/gitlab-org/gitlab/issues/34018
-# Empty migration is left here to avoid any problems with rolling back
-class ScheduleFixGitlabComPagesAccessLevel < ActiveRecord::Migration[5.2]
- DOWNTIME = false
-
- def up
- end
-
- def down
- end
-end
diff --git a/db/post_migrate/20191017180026_drop_ci_build_trace_sections_id.rb b/db/post_migrate/20191017180026_drop_ci_build_trace_sections_id.rb
deleted file mode 100644
index 0405e23b465..00000000000
--- a/db/post_migrate/20191017180026_drop_ci_build_trace_sections_id.rb
+++ /dev/null
@@ -1,19 +0,0 @@
-# frozen_string_literal: true
-
-class DropCiBuildTraceSectionsId < ActiveRecord::Migration[5.2]
- DOWNTIME = false
-
- def up
- ##
- # This column has already been ignored since 12.4
- # See https://gitlab.com/gitlab-org/gitlab/issues/32569
- remove_column :ci_build_trace_sections, :id
- end
-
- def down
- ##
- # We don't backfill serial ids as it's not used in application code
- # and quite expensive process.
- add_column :ci_build_trace_sections, :id, :bigint
- end
-end
diff --git a/db/post_migrate/20191021101942_remove_empty_github_service_templates.rb b/db/post_migrate/20191021101942_remove_empty_github_service_templates.rb
deleted file mode 100644
index 64abe93b3e8..00000000000
--- a/db/post_migrate/20191021101942_remove_empty_github_service_templates.rb
+++ /dev/null
@@ -1,28 +0,0 @@
-# frozen_string_literal: true
-
-## It's expected to delete one record on GitLab.com
-#
-class RemoveEmptyGithubServiceTemplates < ActiveRecord::Migration[5.2]
- DOWNTIME = false
-
- class Service < ActiveRecord::Base
- self.table_name = 'services'
- self.inheritance_column = :_type_disabled
-
- serialize :properties, JSON
- end
-
- def up
- relationship.where(properties: {}).delete_all
- end
-
- def down
- relationship.find_or_create_by!(properties: {})
- end
-
- private
-
- def relationship
- RemoveEmptyGithubServiceTemplates::Service.where(template: true, type: 'GithubService')
- end
-end
diff --git a/db/post_migrate/20191022113635_nullify_feature_flag_plaintext_tokens.rb b/db/post_migrate/20191022113635_nullify_feature_flag_plaintext_tokens.rb
deleted file mode 100644
index 9ade1454844..00000000000
--- a/db/post_migrate/20191022113635_nullify_feature_flag_plaintext_tokens.rb
+++ /dev/null
@@ -1,39 +0,0 @@
-# frozen_string_literal: true
-
-class NullifyFeatureFlagPlaintextTokens < ActiveRecord::Migration[5.2]
- DOWNTIME = false
-
- class FeatureFlagsClient < ActiveRecord::Base
- include EachBatch
-
- self.table_name = 'operations_feature_flags_clients'
-
- scope :with_encrypted_token, -> { where.not(token_encrypted: nil) }
- scope :with_plaintext_token, -> { where.not(token: nil) }
- scope :without_plaintext_token, -> { where(token: nil) }
- end
-
- disable_ddl_transaction!
-
- def up
- return unless Gitlab.ee?
-
- # 7357 records to be updated on GitLab.com
- FeatureFlagsClient.with_encrypted_token.with_plaintext_token.each_batch do |relation|
- relation.update_all(token: nil)
- end
- end
-
- def down
- return unless Gitlab.ee?
-
- # There is no way to restore only the tokens that were NULLifyed in the `up`
- # but we can do is to restore _all_ of them in case it is needed.
- say_with_time('Decrypting tokens from operations_feature_flags_clients') do
- FeatureFlagsClient.with_encrypted_token.without_plaintext_token.find_each do |feature_flags_client|
- token = Gitlab::CryptoHelper.aes256_gcm_decrypt(feature_flags_client.token_encrypted)
- feature_flags_client.update_column(:token, token)
- end
- end
- end
-end
diff --git a/db/post_migrate/20191029095537_cleanup_application_settings_snowplow_site_id_rename.rb b/db/post_migrate/20191029095537_cleanup_application_settings_snowplow_site_id_rename.rb
deleted file mode 100644
index 83b4a2af2b6..00000000000
--- a/db/post_migrate/20191029095537_cleanup_application_settings_snowplow_site_id_rename.rb
+++ /dev/null
@@ -1,17 +0,0 @@
-# frozen_string_literal: true
-
-class CleanupApplicationSettingsSnowplowSiteIdRename < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- cleanup_concurrent_column_rename :application_settings, :snowplow_site_id, :snowplow_app_id
- end
-
- def down
- undo_cleanup_concurrent_column_rename :application_settings, :snowplow_site_id, :snowplow_app_id
- end
-end
diff --git a/db/post_migrate/20191030193050_remove_pendo_from_application_settings.rb b/db/post_migrate/20191030193050_remove_pendo_from_application_settings.rb
deleted file mode 100644
index c1a1cc01aa4..00000000000
--- a/db/post_migrate/20191030193050_remove_pendo_from_application_settings.rb
+++ /dev/null
@@ -1,19 +0,0 @@
-# frozen_string_literal: true
-
-class RemovePendoFromApplicationSettings < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- disable_ddl_transaction!
-
- DOWNTIME = false
-
- def up
- remove_column :application_settings, :pendo_enabled
- remove_column :application_settings, :pendo_url
- end
-
- def down
- add_column_with_default :application_settings, :pendo_enabled, :boolean, default: false, allow_null: false # rubocop:disable Migration/AddColumnWithDefault
- add_column :application_settings, :pendo_url, :string, limit: 255
- end
-end
diff --git a/db/post_migrate/20191030223057_backfill_version_author_and_created_at.rb b/db/post_migrate/20191030223057_backfill_version_author_and_created_at.rb
deleted file mode 100644
index 3ec6c59f166..00000000000
--- a/db/post_migrate/20191030223057_backfill_version_author_and_created_at.rb
+++ /dev/null
@@ -1,67 +0,0 @@
-# frozen_string_literal: true
-
-class BackfillVersionAuthorAndCreatedAt < ActiveRecord::Migration[5.2]
- DOWNTIME = false
- MIGRATION = 'BackfillVersionDataFromGitaly'
- BATCH_SIZE = 500
-
- disable_ddl_transaction!
-
- class Project < ActiveRecord::Base
- self.table_name = 'projects'
- self.inheritance_column = :_type_disabled
- end
-
- class Issue < ActiveRecord::Base
- self.table_name = 'issues'
- self.inheritance_column = :_type_disabled
- end
-
- class Version < ActiveRecord::Base
- include EachBatch
- self.table_name = 'design_management_versions'
- self.inheritance_column = :_type_disabled
-
- # Returns unique issue ids of versions that are not in projects
- # that are pending deletion.
- scope :with_unique_issue_ids, -> do
- versions = Version.arel_table
- issues = Issue.arel_table
- projects = Project.arel_table
-
- select(versions[:issue_id]).where(
- versions[:author_id].eq(nil).or(
- versions[:created_at].eq(nil)
- ).and(
- issues[:project_id].not_in(
- projects.project(projects[:id]).where(projects[:pending_delete].eq(true))
- )
- )
- ).joins(
- versions.join(issues).on(
- issues[:id].eq(versions[:issue_id])
- ).join_sources
- ).distinct
- end
- end
-
- # This migration will make around ~1300 UPDATE queries on GitLab.com,
- # one per design_management_versions record as the migration will update
- # each record individually.
- #
- # It will make around 870 Gitaly `ListCommitsByOid` requests on GitLab.com.
- # One for every unique issue with design_management_versions records.
- def up
- return unless Gitlab.ee? # no-op for CE
-
- Version.with_unique_issue_ids.each_batch(of: BATCH_SIZE) do |versions, index|
- jobs = versions.map { |version| [MIGRATION, [version.issue_id]] }
-
- BackgroundMigrationWorker.bulk_perform_async(jobs)
- end
- end
-
- def down
- # no-op
- end
-end
diff --git a/db/post_migrate/20191031112603_remove_limits_from_plans.rb b/db/post_migrate/20191031112603_remove_limits_from_plans.rb
deleted file mode 100644
index 30fb6a9d193..00000000000
--- a/db/post_migrate/20191031112603_remove_limits_from_plans.rb
+++ /dev/null
@@ -1,17 +0,0 @@
-# frozen_string_literal: true
-
-class RemoveLimitsFromPlans < ActiveRecord::Migration[5.2]
- DOWNTIME = false
-
- def up
- remove_column :plans, :active_pipelines_limit
- remove_column :plans, :pipeline_size_limit
- remove_column :plans, :active_jobs_limit
- end
-
- def down
- add_column :plans, :active_pipelines_limit, :integer
- add_column :plans, :pipeline_size_limit, :integer
- add_column :plans, :active_jobs_limit, :integer
- end
-end
diff --git a/db/post_migrate/20191104142124_nullify_users_role.rb b/db/post_migrate/20191104142124_nullify_users_role.rb
deleted file mode 100644
index ab8eae46745..00000000000
--- a/db/post_migrate/20191104142124_nullify_users_role.rb
+++ /dev/null
@@ -1,26 +0,0 @@
-# frozen_string_literal: true
-
-class NullifyUsersRole < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- disable_ddl_transaction!
- INDEX_NAME = 'partial_index_users_updated_at_for_cleaning_mistaken_values'
-
- DOWNTIME = false
-
- def up
- # expected updated users count is around 10K
- # rubocop: disable Migration/UpdateLargeTable
- add_concurrent_index(:users, :updated_at, where: 'role = 0', name: INDEX_NAME)
-
- update_column_in_batches(:users, :role, nil) do |table, query|
- query.where(table[:updated_at].lt('2019-11-05 12:08:00')).where(table[:role].eq(0))
- end
-
- remove_concurrent_index_by_name(:users, INDEX_NAME)
- end
-
- def down
- # noop
- end
-end
diff --git a/db/post_migrate/20191105094625_set_report_type_for_vulnerabilities.rb b/db/post_migrate/20191105094625_set_report_type_for_vulnerabilities.rb
deleted file mode 100644
index 40e9e3bddc8..00000000000
--- a/db/post_migrate/20191105094625_set_report_type_for_vulnerabilities.rb
+++ /dev/null
@@ -1,34 +0,0 @@
-# frozen_string_literal: true
-
-class SetReportTypeForVulnerabilities < ActiveRecord::Migration[5.2]
- DOWNTIME = false
-
- def up
- # set report_type based on vulnerability_occurrences from which the vulnerabilities were promoted,
- # that is, first vulnerability_occurrences among those having the same vulnerability_id
- execute <<~SQL
- WITH first_findings_for_vulnerabilities AS #{Gitlab::Database::AsWithMaterialized.materialized_if_supported} (
- SELECT MIN(id) AS id, vulnerability_id
- FROM vulnerability_occurrences
- WHERE vulnerability_id IS NOT NULL
- GROUP BY vulnerability_id
- )
- UPDATE vulnerabilities
- SET report_type = vulnerability_occurrences.report_type
- FROM vulnerability_occurrences, first_findings_for_vulnerabilities
- WHERE vulnerability_occurrences.id = first_findings_for_vulnerabilities.id
- AND vulnerabilities.id = vulnerability_occurrences.vulnerability_id
- SQL
-
- # set default report_type for orphan vulnerabilities (there should be none but...)
- execute 'UPDATE vulnerabilities SET report_type = 0 WHERE report_type IS NULL'
-
- change_column_null :vulnerabilities, :report_type, false
- end
-
- def down
- change_column_null :vulnerabilities, :report_type, true
-
- execute 'UPDATE vulnerabilities SET report_type = NULL'
- end
-end
diff --git a/db/post_migrate/20191105140942_add_indices_to_abuse_reports.rb b/db/post_migrate/20191105140942_add_indices_to_abuse_reports.rb
deleted file mode 100644
index 2b2d04e8ccc..00000000000
--- a/db/post_migrate/20191105140942_add_indices_to_abuse_reports.rb
+++ /dev/null
@@ -1,17 +0,0 @@
-# frozen_string_literal: true
-
-class AddIndicesToAbuseReports < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- add_concurrent_index :abuse_reports, :user_id
- end
-
- def down
- remove_concurrent_index :abuse_reports, :user_id
- end
-end
diff --git a/db/post_migrate/20191108202723_add_unique_constraint_to_software_licenses.rb b/db/post_migrate/20191108202723_add_unique_constraint_to_software_licenses.rb
deleted file mode 100644
index 580d3a189c8..00000000000
--- a/db/post_migrate/20191108202723_add_unique_constraint_to_software_licenses.rb
+++ /dev/null
@@ -1,69 +0,0 @@
-# frozen_string_literal: true
-
-class AddUniqueConstraintToSoftwareLicenses < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
- DOWNTIME = false
- NEW_INDEX = 'index_software_licenses_on_unique_name'
- OLD_INDEX = 'index_software_licenses_on_name'
-
- disable_ddl_transaction!
-
- # 12 software licenses will be removed on GitLab.com
- # 0 software license policies will be updated on GitLab.com
- def up(attempts: 100)
- remove_redundant_software_licenses!
-
- add_concurrent_index :software_licenses, :name, unique: true, name: NEW_INDEX
- remove_concurrent_index :software_licenses, :name, name: OLD_INDEX
- rescue ActiveRecord::RecordNotUnique
- retry if (attempts -= 1) > 0
-
- raise StandardError, <<~EOS
- Failed to add an unique index to software_licenses, despite retrying the
- migration 100 times.
-
- See https://gitlab.com/gitlab-org/gitlab/merge_requests/19840.
- EOS
- end
-
- def down
- remove_concurrent_index :software_licenses, :name, unique: true, name: NEW_INDEX
- add_concurrent_index :software_licenses, :name, name: OLD_INDEX
- end
-
- private
-
- def remove_redundant_software_licenses!
- redundant_software_licenses = execute <<~SQL
- SELECT min(id) id, name
- FROM software_licenses
- WHERE name IN (select name from software_licenses group by name having count(name) > 1)
- GROUP BY name
- SQL
- say "Detected #{redundant_software_licenses.count} duplicates."
-
- redundant_software_licenses.each_row do |id, name|
- say_with_time("Reassigning policies that reference software license #{name}.") do
- duplicates = software_licenses.where.not(id: id).where(name: name)
-
- software_license_policies
- .where(software_license_id: duplicates)
- .update_all(software_license_id: id)
-
- duplicates.delete_all
- end
- end
- end
-
- def table(name)
- Class.new(ActiveRecord::Base) { self.table_name = name }
- end
-
- def software_licenses
- @software_licenses ||= table(:software_licenses)
- end
-
- def software_license_policies
- @software_license_policies ||= table(:software_license_policies)
- end
-end
diff --git a/db/post_migrate/20191112023159_complete_pages_metadata_migration.rb b/db/post_migrate/20191112023159_complete_pages_metadata_migration.rb
deleted file mode 100644
index 6468eef8cc1..00000000000
--- a/db/post_migrate/20191112023159_complete_pages_metadata_migration.rb
+++ /dev/null
@@ -1,13 +0,0 @@
-# frozen_string_literal: true
-
-class CompletePagesMetadataMigration < ActiveRecord::Migration[5.2]
- DOWNTIME = false
-
- def up
- Gitlab::BackgroundMigration.steal('MigratePagesMetadata')
- end
-
- def down
- # no-op
- end
-end
diff --git a/db/post_migrate/20191112115317_change_vulnerabilities_title_html_to_nullable.rb b/db/post_migrate/20191112115317_change_vulnerabilities_title_html_to_nullable.rb
deleted file mode 100644
index 6e0f3247410..00000000000
--- a/db/post_migrate/20191112115317_change_vulnerabilities_title_html_to_nullable.rb
+++ /dev/null
@@ -1,9 +0,0 @@
-# frozen_string_literal: true
-
-class ChangeVulnerabilitiesTitleHtmlToNullable < ActiveRecord::Migration[5.2]
- DOWNTIME = false
-
- def change
- change_column_null :vulnerabilities, :title_html, true
- end
-end
diff --git a/db/post_migrate/20191114173624_set_resolved_state_on_vulnerabilities.rb b/db/post_migrate/20191114173624_set_resolved_state_on_vulnerabilities.rb
deleted file mode 100644
index 2900ef852a5..00000000000
--- a/db/post_migrate/20191114173624_set_resolved_state_on_vulnerabilities.rb
+++ /dev/null
@@ -1,31 +0,0 @@
-# frozen_string_literal: true
-
-class SetResolvedStateOnVulnerabilities < ActiveRecord::Migration[5.2]
- DOWNTIME = false
-
- def up
- execute <<~SQL
- -- selecting IDs for all non-orphan Findings that either have no feedback or it's a non-dismissal feedback
- WITH resolved_vulnerability_ids AS #{Gitlab::Database::AsWithMaterialized.materialized_if_supported} (
- SELECT DISTINCT vulnerability_id AS id
- FROM vulnerability_occurrences
- LEFT JOIN vulnerability_feedback ON vulnerability_feedback.project_fingerprint = ENCODE(vulnerability_occurrences.project_fingerprint::bytea, 'HEX')
- WHERE vulnerability_id IS NOT NULL
- AND (vulnerability_feedback.id IS NULL OR vulnerability_feedback.feedback_type <> 0)
- )
- UPDATE vulnerabilities
- SET state = 3, resolved_by_id = closed_by_id, resolved_at = NOW()
- FROM resolved_vulnerability_ids
- WHERE vulnerabilities.id IN (resolved_vulnerability_ids.id)
- AND state = 2 -- only 'closed' Vulnerabilities become 'resolved'
- SQL
- end
-
- def down
- execute <<~SQL
- UPDATE vulnerabilities
- SET state = 2, resolved_by_id = NULL, resolved_at = NULL -- state = 'closed'
- WHERE state = 3 -- 'resolved'
- SQL
- end
-end
diff --git a/db/post_migrate/20191114204343_remove_milestone_id_from_epics.rb b/db/post_migrate/20191114204343_remove_milestone_id_from_epics.rb
deleted file mode 100644
index 4ef6decda95..00000000000
--- a/db/post_migrate/20191114204343_remove_milestone_id_from_epics.rb
+++ /dev/null
@@ -1,13 +0,0 @@
-# frozen_string_literal: true
-
-class RemoveMilestoneIdFromEpics < ActiveRecord::Migration[5.2]
- DOWNTIME = false
-
- def up
- remove_column :epics, :milestone_id
- end
-
- def down
- add_column :epics, :milestone_id, :integer
- end
-end
diff --git a/db/post_migrate/20191115115043_migrate_epic_mentions_to_db.rb b/db/post_migrate/20191115115043_migrate_epic_mentions_to_db.rb
deleted file mode 100644
index 97f2e568a7e..00000000000
--- a/db/post_migrate/20191115115043_migrate_epic_mentions_to_db.rb
+++ /dev/null
@@ -1,36 +0,0 @@
-# frozen_string_literal: true
-
-class MigrateEpicMentionsToDb < ActiveRecord::Migration[5.2]
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- DELAY = 2.minutes.to_i
- BATCH_SIZE = 10000
- MIGRATION = 'UserMentions::CreateResourceUserMention'
-
- JOIN = "LEFT JOIN epic_user_mentions on epics.id = epic_user_mentions.epic_id"
- QUERY_CONDITIONS = "(description like '%@%' OR title like '%@%') AND epic_user_mentions.epic_id is null"
-
- class Epic < ActiveRecord::Base
- include EachBatch
-
- self.table_name = 'epics'
- end
-
- def up
- return unless Gitlab.ee?
-
- Epic
- .joins(JOIN)
- .where(QUERY_CONDITIONS)
- .each_batch(of: BATCH_SIZE) do |batch, index|
- range = batch.pluck(Arel.sql('MIN(epics.id)'), Arel.sql('MAX(epics.id)')).first
- BackgroundMigrationWorker.perform_in(index * DELAY, MIGRATION, ['Epic', JOIN, QUERY_CONDITIONS, false, *range])
- end
- end
-
- def down
- # no-op
- end
-end
diff --git a/db/post_migrate/20191115115522_migrate_epic_notes_mentions_to_db.rb b/db/post_migrate/20191115115522_migrate_epic_notes_mentions_to_db.rb
deleted file mode 100644
index 7914ff59dbd..00000000000
--- a/db/post_migrate/20191115115522_migrate_epic_notes_mentions_to_db.rb
+++ /dev/null
@@ -1,45 +0,0 @@
-# frozen_string_literal: true
-
-class MigrateEpicNotesMentionsToDb < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- DELAY = 2.minutes.to_i
- BATCH_SIZE = 10000
- MIGRATION = 'UserMentions::CreateResourceUserMention'
-
- INDEX_NAME = 'epic_mentions_temp_index'
- INDEX_CONDITION = "note LIKE '%@%'::text AND notes.noteable_type = 'Epic'"
- QUERY_CONDITIONS = "#{INDEX_CONDITION} AND epic_user_mentions.epic_id IS NULL"
- JOIN = 'INNER JOIN epics ON epics.id = notes.noteable_id LEFT JOIN epic_user_mentions ON notes.id = epic_user_mentions.note_id'
-
- class Note < ActiveRecord::Base
- include EachBatch
-
- self.table_name = 'notes'
- end
-
- def up
- return unless Gitlab.ee?
-
- # create temporary index for notes with mentions, may take well over 1h
- add_concurrent_index(:notes, :id, where: INDEX_CONDITION, name: INDEX_NAME)
-
- Note
- .joins(JOIN)
- .where(QUERY_CONDITIONS)
- .each_batch(of: BATCH_SIZE) do |batch, index|
- range = batch.pluck(Arel.sql('MIN(notes.id)'), Arel.sql('MAX(notes.id)')).first
- BackgroundMigrationWorker.perform_in(index * DELAY, MIGRATION, ['Epic', JOIN, QUERY_CONDITIONS, true, *range])
- end
- end
-
- def down
- # no-op
- # temporary index is to be dropped in a different migration in an upcoming release:
- # https://gitlab.com/gitlab-org/gitlab/issues/196842
- end
-end
diff --git a/db/post_migrate/20191118211629_migrate_ops_feature_flags_scopes_target_user_ids.rb b/db/post_migrate/20191118211629_migrate_ops_feature_flags_scopes_target_user_ids.rb
deleted file mode 100644
index 47622a216d9..00000000000
--- a/db/post_migrate/20191118211629_migrate_ops_feature_flags_scopes_target_user_ids.rb
+++ /dev/null
@@ -1,53 +0,0 @@
-# frozen_string_literal: true
-
-class MigrateOpsFeatureFlagsScopesTargetUserIds < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- class OperationsFeatureFlagScope < ActiveRecord::Base
- include EachBatch
- self.table_name = 'operations_feature_flag_scopes'
- self.inheritance_column = :_type_disabled
- end
-
- ###
- # 2019-11-26
- #
- # There are about 1000 rows in the operations_feature_flag_scopes table on gitlab.com.
- # This migration will update about 30 of them.
- # https://gitlab.com/gitlab-org/gitlab/merge_requests/20325#note_250742098
- #
- # This should take a few seconds to run.
- # https://gitlab.com/gitlab-org/gitlab/merge_requests/20325#note_254871603
- #
- ###
- def up
- OperationsFeatureFlagScope.where("strategies @> ?", [{ 'name': 'userWithId' }].to_json).each_batch do |scopes|
- scopes.each do |scope|
- if scope.active
- default_strategy = scope.strategies.find { |s| s['name'] == 'default' }
-
- if default_strategy.present?
- scope.update({ strategies: [default_strategy] })
- end
- else
- user_with_id_strategy = scope.strategies.find { |s| s['name'] == 'userWithId' }
-
- scope.update({
- active: true,
- strategies: [user_with_id_strategy]
- })
- end
- end
- end
- end
-
- def down
- # This is not reversible.
- # The old Target Users feature required the same list of user ids to be applied to each environment scope.
- # Now we allow the list of user ids to differ for each scope.
- end
-end
diff --git a/db/post_migrate/20191119221041_cleanup_software_license_policies_classification_rename.rb b/db/post_migrate/20191119221041_cleanup_software_license_policies_classification_rename.rb
deleted file mode 100644
index eb605dce5aa..00000000000
--- a/db/post_migrate/20191119221041_cleanup_software_license_policies_classification_rename.rb
+++ /dev/null
@@ -1,17 +0,0 @@
-# frozen_string_literal: true
-
-class CleanupSoftwareLicensePoliciesClassificationRename < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- cleanup_concurrent_column_rename :software_license_policies, :approval_status, :classification
- end
-
- def down
- undo_cleanup_concurrent_column_rename :software_license_policies, :approval_status, :classification
- end
-end
diff --git a/db/post_migrate/20191121122856_drop_packages_package_metadata_table.rb b/db/post_migrate/20191121122856_drop_packages_package_metadata_table.rb
deleted file mode 100644
index 9e24f64660c..00000000000
--- a/db/post_migrate/20191121122856_drop_packages_package_metadata_table.rb
+++ /dev/null
@@ -1,16 +0,0 @@
-# frozen_string_literal: true
-
-class DropPackagesPackageMetadataTable < ActiveRecord::Migration[5.2]
- DOWNTIME = false
-
- def up
- drop_table :packages_package_metadata
- end
-
- def down
- create_table :packages_package_metadata do |t|
- t.references :package, index: { unique: true }, null: false, foreign_key: { to_table: :packages_packages, on_delete: :cascade }, type: :integer
- t.binary :metadata, null: false
- end
- end
-end
diff --git a/db/post_migrate/20191122135327_remove_plaintext_columns_from_application_settings.rb b/db/post_migrate/20191122135327_remove_plaintext_columns_from_application_settings.rb
deleted file mode 100644
index b5cd58b10a8..00000000000
--- a/db/post_migrate/20191122135327_remove_plaintext_columns_from_application_settings.rb
+++ /dev/null
@@ -1,28 +0,0 @@
-# frozen_string_literal: true
-
-class RemovePlaintextColumnsFromApplicationSettings < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- PLAINTEXT_ATTRIBUTES = %w[
- akismet_api_key
- elasticsearch_aws_secret_access_key
- recaptcha_private_key
- recaptcha_site_key
- slack_app_secret
- slack_app_verification_token
- ].freeze
-
- def up
- PLAINTEXT_ATTRIBUTES.each do |plaintext_attribute|
- remove_column :application_settings, plaintext_attribute
- end
- end
-
- def down
- PLAINTEXT_ATTRIBUTES.each do |plaintext_attribute|
- add_column :application_settings, plaintext_attribute, :text
- end
- end
-end
diff --git a/db/post_migrate/20191125024005_cleanup_deploy_access_levels_for_removed_groups.rb b/db/post_migrate/20191125024005_cleanup_deploy_access_levels_for_removed_groups.rb
deleted file mode 100644
index 29592612a02..00000000000
--- a/db/post_migrate/20191125024005_cleanup_deploy_access_levels_for_removed_groups.rb
+++ /dev/null
@@ -1,32 +0,0 @@
-# frozen_string_literal: true
-
-class CleanupDeployAccessLevelsForRemovedGroups < ActiveRecord::Migration[5.2]
- DOWNTIME = false
-
- def up
- return unless Gitlab.ee?
-
- delete = <<~SQL
- DELETE FROM protected_environment_deploy_access_levels d
- USING protected_environments p
- WHERE d.protected_environment_id=p.id
- AND d.group_id IS NOT NULL
- AND NOT EXISTS (SELECT 1 FROM project_group_links WHERE project_id=p.project_id AND group_id=d.group_id)
- RETURNING *
- SQL
-
- # At the time of writing there are 4 such records on GitLab.com,
- # execution time is expected to be around 15ms.
- records = execute(delete)
-
- logger = Gitlab::BackgroundMigration::Logger.build
- records.to_a.each do |record|
- logger.info record.as_json.merge(message: "protected_environments_deploy_access_levels was deleted")
- end
- end
-
- def down
- # There is no pragmatic way to restore
- # the records deleted in the `#up` method above.
- end
-end
diff --git a/db/post_migrate/20191128162854_drop_project_ci_cd_settings_merge_trains_enabled.rb b/db/post_migrate/20191128162854_drop_project_ci_cd_settings_merge_trains_enabled.rb
deleted file mode 100644
index 7f91d5112b3..00000000000
--- a/db/post_migrate/20191128162854_drop_project_ci_cd_settings_merge_trains_enabled.rb
+++ /dev/null
@@ -1,19 +0,0 @@
-# frozen_string_literal: true
-
-class DropProjectCiCdSettingsMergeTrainsEnabled < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- remove_column :project_ci_cd_settings, :merge_trains_enabled
- end
-
- def down
- # rubocop:disable Migration/AddColumnWithDefault
- add_column_with_default :project_ci_cd_settings, :merge_trains_enabled, :boolean, default: false, allow_null: true # rubocop:disable Migration/UpdateLargeTable
- # rubocop:enable Migration/AddColumnWithDefault
- end
-end
diff --git a/db/post_migrate/20191202031812_drop_operations_feature_flags_clients_token.rb b/db/post_migrate/20191202031812_drop_operations_feature_flags_clients_token.rb
deleted file mode 100644
index 93cef322f02..00000000000
--- a/db/post_migrate/20191202031812_drop_operations_feature_flags_clients_token.rb
+++ /dev/null
@@ -1,23 +0,0 @@
-# frozen_string_literal: true
-
-class DropOperationsFeatureFlagsClientsToken < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- def up
- # Ignored in 12.5 - https://gitlab.com/gitlab-org/gitlab/merge_requests/18923
- remove_column :operations_feature_flags_clients, :token
- end
-
- def down
- unless column_exists?(:operations_feature_flags_clients, :token)
- add_column :operations_feature_flags_clients, :token, :string
- end
-
- add_concurrent_index :operations_feature_flags_clients, [:project_id, :token], unique: true,
- name: 'index_operations_feature_flags_clients_on_project_id_and_token'
- end
-end
diff --git a/db/post_migrate/20191204114127_delete_legacy_triggers.rb b/db/post_migrate/20191204114127_delete_legacy_triggers.rb
deleted file mode 100644
index 82d901ae689..00000000000
--- a/db/post_migrate/20191204114127_delete_legacy_triggers.rb
+++ /dev/null
@@ -1,17 +0,0 @@
-# frozen_string_literal: true
-
-class DeleteLegacyTriggers < ActiveRecord::Migration[5.2]
- DOWNTIME = false
-
- def up
- execute <<~SQL
- DELETE FROM ci_triggers WHERE owner_id IS NULL
- SQL
-
- change_column_null :ci_triggers, :owner_id, false
- end
-
- def down
- change_column_null :ci_triggers, :owner_id, true
- end
-end
diff --git a/db/post_migrate/20191205084057_update_minimum_password_length.rb b/db/post_migrate/20191205084057_update_minimum_password_length.rb
deleted file mode 100644
index d9324347075..00000000000
--- a/db/post_migrate/20191205084057_update_minimum_password_length.rb
+++ /dev/null
@@ -1,24 +0,0 @@
-# frozen_string_literal: true
-
-class UpdateMinimumPasswordLength < ActiveRecord::Migration[5.2]
- DOWNTIME = false
-
- def up
- value_to_be_updated_to = [
- Devise.password_length.min,
- ApplicationSetting::DEFAULT_MINIMUM_PASSWORD_LENGTH
- ].max
-
- execute "UPDATE application_settings SET minimum_password_length = #{value_to_be_updated_to}"
-
- ApplicationSetting.expire
- end
-
- def down
- value_to_be_updated_to = ApplicationSetting::DEFAULT_MINIMUM_PASSWORD_LENGTH
-
- execute "UPDATE application_settings SET minimum_password_length = #{value_to_be_updated_to}"
-
- ApplicationSetting.expire
- end
-end
diff --git a/db/post_migrate/20191209215316_knative_0_9_prometheus_update.rb b/db/post_migrate/20191209215316_knative_0_9_prometheus_update.rb
deleted file mode 100644
index 52127f71cd0..00000000000
--- a/db/post_migrate/20191209215316_knative_0_9_prometheus_update.rb
+++ /dev/null
@@ -1,13 +0,0 @@
-# frozen_string_literal: true
-
-class Knative09PrometheusUpdate < ActiveRecord::Migration[5.2]
- DOWNTIME = false
-
- def up
- ::Gitlab::DatabaseImporters::CommonMetrics::Importer.new.execute
- end
-
- def down
- # no-op
- end
-end
diff --git a/db/post_migrate/20191212162434_change_commit_user_mentions_commit_id_column_type_cleanup.rb b/db/post_migrate/20191212162434_change_commit_user_mentions_commit_id_column_type_cleanup.rb
deleted file mode 100644
index aed9d335af9..00000000000
--- a/db/post_migrate/20191212162434_change_commit_user_mentions_commit_id_column_type_cleanup.rb
+++ /dev/null
@@ -1,25 +0,0 @@
-# frozen_string_literal: true
-
-class ChangeCommitUserMentionsCommitIdColumnTypeCleanup < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
-
- disable_ddl_transaction!
-
- NEW_INDEX = 'commit_id_for_type_change_and_note_id_index'
- OLD_INDEX = 'commit_user_mentions_on_commit_id_and_note_id_index'
-
- def up
- cleanup_concurrent_column_type_change :commit_user_mentions, :commit_id
- end
-
- def down
- change_column_type_concurrently :commit_user_mentions, :commit_id, :binary
-
- # change_column_type_concurrently creates a new index based on existing commit_id_and_note_id_index` naming it
- # `commit_id_for_type_change_and_note_id_index` so we'll rename it back to its original name.
- add_concurrent_index :commit_user_mentions, [:commit_id_for_type_change, :note_id], name: OLD_INDEX
- remove_concurrent_index_by_name :commit_user_mentions, NEW_INDEX
- end
-end
diff --git a/db/post_migrate/20191218225624_add_index_on_project_id_to_ci_pipelines.rb b/db/post_migrate/20191218225624_add_index_on_project_id_to_ci_pipelines.rb
deleted file mode 100644
index ab6c3b0616a..00000000000
--- a/db/post_migrate/20191218225624_add_index_on_project_id_to_ci_pipelines.rb
+++ /dev/null
@@ -1,18 +0,0 @@
-# frozen_string_literal: true
-
-class AddIndexOnProjectIdToCiPipelines < ActiveRecord::Migration[5.2]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
- INDEX_NAME = 'index_ci_pipelines_on_project_id_and_id_desc'
-
- disable_ddl_transaction!
-
- def up
- add_concurrent_index :ci_pipelines, [:project_id, :id], name: INDEX_NAME, order: { id: :desc }
- end
-
- def down
- remove_concurrent_index :ci_pipelines, [:project_id, :id], name: INDEX_NAME, order: { id: :desc }
- end
-end
diff --git a/db/post_migrate/20210906130643_drop_temporary_columns_and_triggers_for_taggings.rb b/db/post_migrate/20210906130643_drop_temporary_columns_and_triggers_for_taggings.rb
new file mode 100644
index 00000000000..cb5714055bb
--- /dev/null
+++ b/db/post_migrate/20210906130643_drop_temporary_columns_and_triggers_for_taggings.rb
@@ -0,0 +1,18 @@
+# frozen_string_literal: true
+
+class DropTemporaryColumnsAndTriggersForTaggings < Gitlab::Database::Migration[1.0]
+ enable_lock_retries!
+
+ TABLE = 'taggings'
+ COLUMNS = %w(id taggable_id)
+
+ # rubocop:disable Migration/WithLockRetriesDisallowedMethod
+ def up
+ cleanup_conversion_of_integer_to_bigint(TABLE, COLUMNS)
+ end
+ # rubocop:enable Migration/WithLockRetriesDisallowedMethod
+
+ def down
+ restore_conversion_of_integer_to_bigint(TABLE, COLUMNS)
+ end
+end
diff --git a/db/post_migrate/20210907013944_cleanup_bigint_conversion_for_ci_builds_metadata.rb b/db/post_migrate/20210907013944_cleanup_bigint_conversion_for_ci_builds_metadata.rb
new file mode 100644
index 00000000000..54dce0a7da8
--- /dev/null
+++ b/db/post_migrate/20210907013944_cleanup_bigint_conversion_for_ci_builds_metadata.rb
@@ -0,0 +1,17 @@
+# frozen_string_literal: true
+
+class CleanupBigintConversionForCiBuildsMetadata < Gitlab::Database::Migration[1.0]
+ enable_lock_retries!
+
+ TABLE = :ci_builds_metadata
+
+ def up
+ cleanup_conversion_of_integer_to_bigint(TABLE, :id)
+ cleanup_conversion_of_integer_to_bigint(TABLE, :build_id)
+ end
+
+ def down
+ restore_conversion_of_integer_to_bigint(TABLE, :build_id)
+ restore_conversion_of_integer_to_bigint(TABLE, :id)
+ end
+end
diff --git a/db/post_migrate/20210910194952_update_report_type_for_existing_approval_project_rules.rb b/db/post_migrate/20210910194952_update_report_type_for_existing_approval_project_rules.rb
new file mode 100644
index 00000000000..537c235edab
--- /dev/null
+++ b/db/post_migrate/20210910194952_update_report_type_for_existing_approval_project_rules.rb
@@ -0,0 +1,39 @@
+# frozen_string_literal: true
+
+class UpdateReportTypeForExistingApprovalProjectRules < Gitlab::Database::Migration[1.0]
+ def up
+ # 1. We only want to consider when rule_type is set to :report_approver (i.e., 2):
+ # enum rule_type: {
+ # regular: 0,
+ # code_owner: 1, # currently unused
+ # report_approver: 2,
+ # any_approver: 3
+ # }
+ # 2. Also we want to change only the folowing names and respective values:
+ # DEFAULT_NAME_FOR_LICENSE_REPORT = 'License-Check'
+ # DEFAULT_NAME_FOR_VULNERABILITY_REPORT = 'Vulnerability-Check'
+ # DEFAULT_NAME_FOR_COVERAGE = 'Coverage-Check'
+ # enum report_type: {
+ # vulnerability: 1,
+ # license_scanning: 2,
+ # code_coverage: 3
+ # }
+
+ execute <<~SQL
+ UPDATE approval_project_rules
+ SET report_type = converted_values.report_type
+ FROM
+ ( values
+ (1, 'Vulnerability-Check'),
+ (2, 'License-Check'),
+ (3, 'Coverage-Check')
+ ) AS converted_values(report_type, name)
+ WHERE approval_project_rules.name = converted_values.name
+ AND approval_project_rules.rule_type = 2;
+ SQL
+ end
+
+ def down
+ # no-op
+ end
+end
diff --git a/db/post_migrate/20210915022415_cleanup_bigint_conversion_for_ci_builds.rb b/db/post_migrate/20210915022415_cleanup_bigint_conversion_for_ci_builds.rb
new file mode 100644
index 00000000000..d72866691ff
--- /dev/null
+++ b/db/post_migrate/20210915022415_cleanup_bigint_conversion_for_ci_builds.rb
@@ -0,0 +1,16 @@
+# frozen_string_literal: true
+
+class CleanupBigintConversionForCiBuilds < Gitlab::Database::Migration[1.0]
+ enable_lock_retries!
+
+ TABLE = :ci_builds
+ COLUMNS = [:id, :stage_id]
+
+ def up
+ cleanup_conversion_of_integer_to_bigint(TABLE, COLUMNS)
+ end
+
+ def down
+ restore_conversion_of_integer_to_bigint(TABLE, COLUMNS)
+ end
+end
diff --git a/db/post_migrate/20210918201050_remove_old_pending_jobs_for_recalculate_vulnerabilities_occurrences_uuid.rb b/db/post_migrate/20210918201050_remove_old_pending_jobs_for_recalculate_vulnerabilities_occurrences_uuid.rb
new file mode 100644
index 00000000000..224d97243c5
--- /dev/null
+++ b/db/post_migrate/20210918201050_remove_old_pending_jobs_for_recalculate_vulnerabilities_occurrences_uuid.rb
@@ -0,0 +1,18 @@
+# frozen_string_literal: true
+
+class RemoveOldPendingJobsForRecalculateVulnerabilitiesOccurrencesUuid < Gitlab::Database::Migration[1.0]
+ MIGRATION_NAME = 'RecalculateVulnerabilitiesOccurrencesUuid'
+ NEW_MIGRATION_START_DATE = DateTime.new(2021, 8, 18, 0, 0, 0)
+
+ def up
+ Gitlab::Database::BackgroundMigrationJob
+ .for_migration_class(MIGRATION_NAME)
+ .where('created_at < ?', NEW_MIGRATION_START_DATE)
+ .where(status: :pending)
+ .delete_all
+ end
+
+ def down
+ # no-op
+ end
+end
diff --git a/db/post_migrate/20210918202855_reschedule_pending_jobs_for_recalculate_vulnerabilities_occurrences_uuid.rb b/db/post_migrate/20210918202855_reschedule_pending_jobs_for_recalculate_vulnerabilities_occurrences_uuid.rb
new file mode 100644
index 00000000000..88351b3007a
--- /dev/null
+++ b/db/post_migrate/20210918202855_reschedule_pending_jobs_for_recalculate_vulnerabilities_occurrences_uuid.rb
@@ -0,0 +1,18 @@
+# frozen_string_literal: true
+
+class ReschedulePendingJobsForRecalculateVulnerabilitiesOccurrencesUuid < Gitlab::Database::Migration[1.0]
+ MIGRATION = "RecalculateVulnerabilitiesOccurrencesUuid"
+ DELAY_INTERVAL = 2.minutes
+
+ disable_ddl_transaction!
+
+ def up
+ delete_queued_jobs(MIGRATION)
+
+ requeue_background_migration_jobs_by_range_at_intervals(MIGRATION, DELAY_INTERVAL)
+ end
+
+ def down
+ # no-op
+ end
+end
diff --git a/db/post_migrate/20210920232025_remove_ci_builds_foreign_key_from_terraform_state_versions.rb b/db/post_migrate/20210920232025_remove_ci_builds_foreign_key_from_terraform_state_versions.rb
new file mode 100644
index 00000000000..7435a2c889b
--- /dev/null
+++ b/db/post_migrate/20210920232025_remove_ci_builds_foreign_key_from_terraform_state_versions.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+class RemoveCiBuildsForeignKeyFromTerraformStateVersions < Gitlab::Database::Migration[1.0]
+ disable_ddl_transaction!
+
+ def up
+ with_lock_retries do
+ remove_foreign_key_if_exists(:terraform_state_versions, :ci_builds)
+ end
+ end
+
+ def down
+ add_concurrent_foreign_key(:terraform_state_versions, :ci_builds, column: :ci_build_id, on_delete: :nullify)
+ end
+end
diff --git a/db/post_migrate/20210921062820_add_image_location_index_to_vulnerability_occurrences.rb b/db/post_migrate/20210921062820_add_image_location_index_to_vulnerability_occurrences.rb
new file mode 100644
index 00000000000..7a6543395ff
--- /dev/null
+++ b/db/post_migrate/20210921062820_add_image_location_index_to_vulnerability_occurrences.rb
@@ -0,0 +1,18 @@
+# frozen_string_literal: true
+
+class AddImageLocationIndexToVulnerabilityOccurrences < Gitlab::Database::Migration[1.0]
+ disable_ddl_transaction!
+
+ INDEX_NAME = 'index_vulnerability_occurrences_on_location_image'
+
+ def up
+ add_concurrent_index :vulnerability_occurrences, "(location -> 'image')",
+ using: 'GIN',
+ where: 'report_type IN (2, 7)',
+ name: INDEX_NAME
+ end
+
+ def down
+ remove_concurrent_index_by_name :vulnerability_occurrences, INDEX_NAME
+ end
+end
diff --git a/db/post_migrate/20210922021816_drop_int4_columns_for_ci_job_artifacts.rb b/db/post_migrate/20210922021816_drop_int4_columns_for_ci_job_artifacts.rb
new file mode 100644
index 00000000000..e45d6ed34aa
--- /dev/null
+++ b/db/post_migrate/20210922021816_drop_int4_columns_for_ci_job_artifacts.rb
@@ -0,0 +1,10 @@
+# frozen_string_literal: true
+
+class DropInt4ColumnsForCiJobArtifacts < Gitlab::Database::Migration[1.0]
+ enable_lock_retries!
+
+ def change
+ remove_column :ci_job_artifacts, :id_convert_to_bigint, :integer, null: false, default: 0
+ remove_column :ci_job_artifacts, :job_id_convert_to_bigint, :integer, null: false, default: 0
+ end
+end
diff --git a/db/post_migrate/20210922025631_drop_int4_column_for_ci_sources_pipelines.rb b/db/post_migrate/20210922025631_drop_int4_column_for_ci_sources_pipelines.rb
new file mode 100644
index 00000000000..b25f1d88736
--- /dev/null
+++ b/db/post_migrate/20210922025631_drop_int4_column_for_ci_sources_pipelines.rb
@@ -0,0 +1,9 @@
+# frozen_string_literal: true
+
+class DropInt4ColumnForCiSourcesPipelines < Gitlab::Database::Migration[1.0]
+ enable_lock_retries!
+
+ def change
+ remove_column :ci_sources_pipelines, :source_job_id_convert_to_bigint, :integer
+ end
+end
diff --git a/db/post_migrate/20210922082019_drop_int4_column_for_events.rb b/db/post_migrate/20210922082019_drop_int4_column_for_events.rb
new file mode 100644
index 00000000000..a34d54e11e3
--- /dev/null
+++ b/db/post_migrate/20210922082019_drop_int4_column_for_events.rb
@@ -0,0 +1,9 @@
+# frozen_string_literal: true
+
+class DropInt4ColumnForEvents < Gitlab::Database::Migration[1.0]
+ enable_lock_retries!
+
+ def change
+ remove_column :events, :id_convert_to_bigint, :integer, null: false, default: 0
+ end
+end
diff --git a/db/post_migrate/20210922084115_concurrent_index_resource_group_status_commit_id_for_ci_builds.rb b/db/post_migrate/20210922084115_concurrent_index_resource_group_status_commit_id_for_ci_builds.rb
new file mode 100644
index 00000000000..922a9b64b55
--- /dev/null
+++ b/db/post_migrate/20210922084115_concurrent_index_resource_group_status_commit_id_for_ci_builds.rb
@@ -0,0 +1,22 @@
+# frozen_string_literal: true
+
+class ConcurrentIndexResourceGroupStatusCommitIdForCiBuilds < Gitlab::Database::Migration[1.0]
+ INDEX_NAME = 'index_ci_builds_on_resource_group_and_status_and_commit_id'
+
+ disable_ddl_transaction!
+
+ # Indexes were pre-created on gitlab.com to avoid slowing down deployments
+ # See: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/70279
+
+ # rubocop: disable Migration/PreventIndexCreation
+ def up
+ add_concurrent_index :ci_builds, [:resource_group_id, :status, :commit_id],
+ where: 'resource_group_id IS NOT NULL',
+ name: INDEX_NAME
+ end
+ # rubocop: enable Migration/PreventIndexCreation
+
+ def down
+ remove_concurrent_index_by_name :ci_builds, INDEX_NAME
+ end
+end
diff --git a/db/post_migrate/20210922091402_drop_int4_column_for_push_event_payloads.rb b/db/post_migrate/20210922091402_drop_int4_column_for_push_event_payloads.rb
new file mode 100644
index 00000000000..5e30ddacc98
--- /dev/null
+++ b/db/post_migrate/20210922091402_drop_int4_column_for_push_event_payloads.rb
@@ -0,0 +1,9 @@
+# frozen_string_literal: true
+
+class DropInt4ColumnForPushEventPayloads < Gitlab::Database::Migration[1.0]
+ enable_lock_retries!
+
+ def change
+ remove_column :push_event_payloads, :event_id_convert_to_bigint, :integer, null: false, default: 0
+ end
+end
diff --git a/db/post_migrate/20210923133143_remove_redundant_taggings_index.rb b/db/post_migrate/20210923133143_remove_redundant_taggings_index.rb
new file mode 100644
index 00000000000..a33885cc87b
--- /dev/null
+++ b/db/post_migrate/20210923133143_remove_redundant_taggings_index.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+class RemoveRedundantTaggingsIndex < Gitlab::Database::Migration[1.0]
+ disable_ddl_transaction!
+
+ INDEX_NAME = :index_taggings_on_taggable_id_and_taggable_type
+
+ def up
+ remove_concurrent_index_by_name :taggings, INDEX_NAME
+ end
+
+ def down
+ add_concurrent_index :taggings, [:taggable_id, :taggable_type], name: INDEX_NAME
+ end
+end
diff --git a/db/post_migrate/20210923135909_remove_delayed_project_removal_from_namespaces.rb b/db/post_migrate/20210923135909_remove_delayed_project_removal_from_namespaces.rb
new file mode 100644
index 00000000000..531410a91d9
--- /dev/null
+++ b/db/post_migrate/20210923135909_remove_delayed_project_removal_from_namespaces.rb
@@ -0,0 +1,19 @@
+# frozen_string_literal: true
+
+class RemoveDelayedProjectRemovalFromNamespaces < Gitlab::Database::Migration[1.0]
+ disable_ddl_transaction!
+
+ def up
+ with_lock_retries do
+ remove_column :namespaces, :delayed_project_removal
+ end
+ end
+
+ def down
+ with_lock_retries do
+ add_column :namespaces, :delayed_project_removal, :boolean, default: false, null: false, if_not_exists: true # rubocop:disable Migration/AddColumnsToWideTables
+ end
+
+ add_concurrent_index :namespaces, :id, name: 'tmp_idx_on_namespaces_delayed_project_removal', where: 'delayed_project_removal = TRUE'
+ end
+end
diff --git a/db/post_migrate/20210927153807_update_issues_relative_position_indexes.rb b/db/post_migrate/20210927153807_update_issues_relative_position_indexes.rb
new file mode 100644
index 00000000000..c7b0c7c6d14
--- /dev/null
+++ b/db/post_migrate/20210927153807_update_issues_relative_position_indexes.rb
@@ -0,0 +1,24 @@
+# frozen_string_literal: true
+
+class UpdateIssuesRelativePositionIndexes < Gitlab::Database::Migration[1.0]
+ disable_ddl_transaction!
+
+ RELATIVE_POSITION_INDEX_NAME = 'idx_issues_on_project_id_and_rel_asc_and_id'
+ RELATIVE_POSITION_STATE_INDEX_NAME = 'idx_issues_on_project_id_and_rel_position_and_state_id_and_id'
+
+ NEW_RELATIVE_POSITION_STATE_INDEX_NAME = 'idx_issues_on_project_id_and_rel_position_and_id_and_state_id'
+
+ def up
+ add_concurrent_index :issues, [:project_id, :relative_position, :id, :state_id], name: NEW_RELATIVE_POSITION_STATE_INDEX_NAME
+
+ remove_concurrent_index_by_name :issues, RELATIVE_POSITION_INDEX_NAME
+ remove_concurrent_index_by_name :issues, RELATIVE_POSITION_STATE_INDEX_NAME
+ end
+
+ def down
+ add_concurrent_index :issues, [:project_id, :relative_position, :state_id, :id], order: { id: :desc }, name: RELATIVE_POSITION_STATE_INDEX_NAME
+ add_concurrent_index :issues, [:project_id, :relative_position, :id], name: RELATIVE_POSITION_INDEX_NAME
+
+ remove_concurrent_index_by_name :issues, NEW_RELATIVE_POSITION_STATE_INDEX_NAME
+ end
+end
diff --git a/db/post_migrate/20211004110500_add_temporary_index_to_issue_metrics.rb b/db/post_migrate/20211004110500_add_temporary_index_to_issue_metrics.rb
new file mode 100644
index 00000000000..cfc37c55121
--- /dev/null
+++ b/db/post_migrate/20211004110500_add_temporary_index_to_issue_metrics.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+class AddTemporaryIndexToIssueMetrics < Gitlab::Database::Migration[1.0]
+ disable_ddl_transaction!
+
+ INDEX_NAME = 'index_issue_metrics_first_mentioned_in_commit'
+
+ def up
+ add_concurrent_index :issue_metrics, :issue_id, where: 'EXTRACT(YEAR FROM first_mentioned_in_commit_at) > 2019', name: INDEX_NAME
+ end
+
+ def down
+ remove_concurrent_index_by_name :issue_metrics, name: INDEX_NAME
+ end
+end
diff --git a/db/post_migrate/20211004110927_schedule_fix_first_mentioned_in_commit_at_job.rb b/db/post_migrate/20211004110927_schedule_fix_first_mentioned_in_commit_at_job.rb
new file mode 100644
index 00000000000..c7612db3aaf
--- /dev/null
+++ b/db/post_migrate/20211004110927_schedule_fix_first_mentioned_in_commit_at_job.rb
@@ -0,0 +1,27 @@
+# frozen_string_literal: true
+
+class ScheduleFixFirstMentionedInCommitAtJob < Gitlab::Database::Migration[1.0]
+ MIGRATION = 'FixFirstMentionedInCommitAt'
+ BATCH_SIZE = 10_000
+ INTERVAL = 2.minutes.to_i
+
+ disable_ddl_transaction!
+
+ def up
+ scope = define_batchable_model('issue_metrics')
+ .where('EXTRACT(YEAR FROM first_mentioned_in_commit_at) > 2019')
+
+ queue_background_migration_jobs_by_range_at_intervals(
+ scope,
+ MIGRATION,
+ INTERVAL,
+ batch_size: BATCH_SIZE,
+ track_jobs: true,
+ primary_column_name: :issue_id
+ )
+ end
+
+ def down
+ # noop
+ end
+end
diff --git a/db/post_migrate/20211004151202_remove_bio_html_from_user_details.rb b/db/post_migrate/20211004151202_remove_bio_html_from_user_details.rb
new file mode 100644
index 00000000000..d82589efc90
--- /dev/null
+++ b/db/post_migrate/20211004151202_remove_bio_html_from_user_details.rb
@@ -0,0 +1,10 @@
+# frozen_string_literal: true
+
+class RemoveBioHtmlFromUserDetails < Gitlab::Database::Migration[1.0]
+ enable_lock_retries!
+
+ def change
+ remove_column :user_details, :bio_html, :text, null: true
+ remove_column :user_details, :cached_markdown_version, :integer, null: true
+ end
+end
diff --git a/db/post_migrate/20211005010101_rereschedule_delete_orphaned_deployments.rb b/db/post_migrate/20211005010101_rereschedule_delete_orphaned_deployments.rb
new file mode 100644
index 00000000000..f49a0fe2f56
--- /dev/null
+++ b/db/post_migrate/20211005010101_rereschedule_delete_orphaned_deployments.rb
@@ -0,0 +1,23 @@
+# frozen_string_literal: true
+
+class RerescheduleDeleteOrphanedDeployments < Gitlab::Database::Migration[1.0]
+ MIGRATION = 'DeleteOrphanedDeployments'
+ DELAY_INTERVAL = 2.minutes
+
+ disable_ddl_transaction!
+
+ # This is the third time to schedule `DeleteOrphanedDeployments` migration.
+ # The first time failed by an inappropriate batch size and the second time failed by a retry bug.
+ # Since there is no issue in this migration itself, we can simply requeue the
+ # migration jobs **without** no-op-ing the previous migration.
+ # See https://gitlab.com/gitlab-org/gitlab/-/merge_requests/69051#note_669230405 for more information.
+ def up
+ delete_queued_jobs(MIGRATION)
+
+ requeue_background_migration_jobs_by_range_at_intervals(MIGRATION, DELAY_INTERVAL)
+ end
+
+ def down
+ # no-op
+ end
+end
diff --git a/db/post_migrate/20211005083015_recreate_index_security_ci_builds_on_name_and_id_parser_features.rb b/db/post_migrate/20211005083015_recreate_index_security_ci_builds_on_name_and_id_parser_features.rb
new file mode 100644
index 00000000000..9887752618d
--- /dev/null
+++ b/db/post_migrate/20211005083015_recreate_index_security_ci_builds_on_name_and_id_parser_features.rb
@@ -0,0 +1,29 @@
+# frozen_string_literal: true
+
+class RecreateIndexSecurityCiBuildsOnNameAndIdParserFeatures < Gitlab::Database::Migration[1.0]
+ TABLE = "ci_builds"
+ OLD_INDEX_NAME = "index_security_ci_builds_on_name_and_id_parser_features"
+ NEW_INDEX_NAME = "index_security_ci_builds_on_name_and_id_parser_features_broken"
+ COLUMNS = %i[name id]
+ CONSTRAINTS = "(name::text = ANY (ARRAY['container_scanning'::character varying::text,
+ 'dast'::character varying::text,
+ 'dependency_scanning'::character varying::text,
+ 'license_management'::character varying::text,
+ 'sast'::character varying::text,
+ 'secret_detection'::character varying::text,
+ 'coverage_fuzzing'::character varying::text,
+ 'license_scanning'::character varying::text])
+ ) AND type::text = 'Ci::Build'::text"
+
+ enable_lock_retries!
+
+ def up
+ rename_index(TABLE, OLD_INDEX_NAME, NEW_INDEX_NAME)
+ prepare_async_index TABLE, COLUMNS, name: OLD_INDEX_NAME, where: CONSTRAINTS
+ end
+
+ def down
+ unprepare_async_index TABLE, COLUMNS, name: OLD_INDEX_NAME
+ rename_index(TABLE, NEW_INDEX_NAME, OLD_INDEX_NAME)
+ end
+end
diff --git a/db/post_migrate/20211006060436_schedule_populate_topics_total_projects_count_cache.rb b/db/post_migrate/20211006060436_schedule_populate_topics_total_projects_count_cache.rb
new file mode 100644
index 00000000000..b14a9ab88b9
--- /dev/null
+++ b/db/post_migrate/20211006060436_schedule_populate_topics_total_projects_count_cache.rb
@@ -0,0 +1,23 @@
+# frozen_string_literal: true
+
+class SchedulePopulateTopicsTotalProjectsCountCache < Gitlab::Database::Migration[1.0]
+ MIGRATION = 'PopulateTopicsTotalProjectsCountCache'
+ BATCH_SIZE = 10_000
+ DELAY_INTERVAL = 2.minutes
+
+ disable_ddl_transaction!
+
+ def up
+ queue_background_migration_jobs_by_range_at_intervals(
+ define_batchable_model('topics'),
+ MIGRATION,
+ DELAY_INTERVAL,
+ batch_size: BATCH_SIZE,
+ track_jobs: true
+ )
+ end
+
+ def down
+ # no-op
+ end
+end
diff --git a/db/post_migrate/20211006145004_finalize_indexes_for_ci_job_artifacts_expire_at_unlocked.rb b/db/post_migrate/20211006145004_finalize_indexes_for_ci_job_artifacts_expire_at_unlocked.rb
new file mode 100644
index 00000000000..b046ab6ab03
--- /dev/null
+++ b/db/post_migrate/20211006145004_finalize_indexes_for_ci_job_artifacts_expire_at_unlocked.rb
@@ -0,0 +1,16 @@
+# frozen_string_literal: true
+
+class FinalizeIndexesForCiJobArtifactsExpireAtUnlocked < Gitlab::Database::Migration[1.0]
+ disable_ddl_transaction!
+
+ TABLE_NAME = 'ci_job_artifacts'
+ INDEX_NAME = 'ci_job_artifacts_expire_at_unlocked_idx'
+
+ def up
+ add_concurrent_index TABLE_NAME, [:expire_at], where: 'locked = 0', name: INDEX_NAME
+ end
+
+ def down
+ remove_concurrent_index_by_name TABLE_NAME, INDEX_NAME
+ end
+end
diff --git a/db/post_migrate/20211006174114_add_namespace_index_on_type_sync.rb b/db/post_migrate/20211006174114_add_namespace_index_on_type_sync.rb
new file mode 100644
index 00000000000..0185e4cbc5e
--- /dev/null
+++ b/db/post_migrate/20211006174114_add_namespace_index_on_type_sync.rb
@@ -0,0 +1,20 @@
+# frozen_string_literal: true
+
+class AddNamespaceIndexOnTypeSync < Gitlab::Database::Migration[1.0]
+ FULL_INDEX_NAME = 'index_namespaces_on_type_and_id'
+ PARTIAL_INDEX_NAME = 'index_namespaces_on_type_and_id_partial'
+
+ disable_ddl_transaction!
+
+ def up
+ add_concurrent_index :namespaces, [:type, :id], name: FULL_INDEX_NAME
+
+ remove_concurrent_index_by_name :namespaces, name: PARTIAL_INDEX_NAME
+ end
+
+ def down
+ add_concurrent_index(:namespaces, [:type, :id], where: 'type IS NOT NULL', name: PARTIAL_INDEX_NAME)
+
+ remove_concurrent_index_by_name :namespaces, name: FULL_INDEX_NAME
+ end
+end
diff --git a/db/post_migrate/20211007093340_remove_analytics_snapshots_segment_id_column.rb b/db/post_migrate/20211007093340_remove_analytics_snapshots_segment_id_column.rb
new file mode 100644
index 00000000000..df0b8ef2a94
--- /dev/null
+++ b/db/post_migrate/20211007093340_remove_analytics_snapshots_segment_id_column.rb
@@ -0,0 +1,17 @@
+# frozen_string_literal: true
+
+class RemoveAnalyticsSnapshotsSegmentIdColumn < Gitlab::Database::Migration[1.0]
+ disable_ddl_transaction!
+
+ def up
+ remove_column :analytics_devops_adoption_snapshots, :segment_id
+ end
+
+ def down
+ add_column :analytics_devops_adoption_snapshots, :segment_id, :bigint, after: :id
+ add_concurrent_foreign_key :analytics_devops_adoption_snapshots, :analytics_devops_adoption_segments,
+ column: :segment_id, name: 'fk_rails_25da9a92c0', on_delete: :cascade
+ add_concurrent_index :analytics_devops_adoption_snapshots, [:segment_id, :end_time], name: :index_on_snapshots_segment_id_end_time
+ add_concurrent_index :analytics_devops_adoption_snapshots, [:segment_id, :recorded_at], name: :index_on_snapshots_segment_id_recorded_at
+ end
+end
diff --git a/db/post_migrate/20211007155221_schedule_populate_status_column_of_security_scans.rb b/db/post_migrate/20211007155221_schedule_populate_status_column_of_security_scans.rb
new file mode 100644
index 00000000000..03032dfbb0a
--- /dev/null
+++ b/db/post_migrate/20211007155221_schedule_populate_status_column_of_security_scans.rb
@@ -0,0 +1,24 @@
+# frozen_string_literal: true
+
+class SchedulePopulateStatusColumnOfSecurityScans < Gitlab::Database::Migration[1.0]
+ MIGRATION = 'PopulateStatusColumnOfSecurityScans'
+ BATCH_SIZE = 10_000
+ DELAY_INTERVAL = 2.minutes
+
+ disable_ddl_transaction!
+
+ def up
+ return unless Gitlab.ee?
+
+ queue_background_migration_jobs_by_range_at_intervals(
+ define_batchable_model('security_scans'),
+ MIGRATION,
+ DELAY_INTERVAL,
+ batch_size: BATCH_SIZE
+ )
+ end
+
+ def down
+ # no-op
+ end
+end
diff --git a/db/post_migrate/20211011152701_cleanup_delete_orphaned_deployments_background_migration.rb b/db/post_migrate/20211011152701_cleanup_delete_orphaned_deployments_background_migration.rb
new file mode 100644
index 00000000000..82a0b1ac9c8
--- /dev/null
+++ b/db/post_migrate/20211011152701_cleanup_delete_orphaned_deployments_background_migration.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+class CleanupDeleteOrphanedDeploymentsBackgroundMigration < Gitlab::Database::Migration[1.0]
+ MIGRATION = 'DeleteOrphanedDeployments'
+
+ disable_ddl_transaction!
+
+ def up
+ finalize_background_migration(MIGRATION)
+ end
+
+ def down
+ # no-op
+ end
+end
diff --git a/db/post_migrate/20211012155931_remove_schedule_and_status_from_pending_alert_escalations.rb b/db/post_migrate/20211012155931_remove_schedule_and_status_from_pending_alert_escalations.rb
new file mode 100644
index 00000000000..e895ab6b9a0
--- /dev/null
+++ b/db/post_migrate/20211012155931_remove_schedule_and_status_from_pending_alert_escalations.rb
@@ -0,0 +1,29 @@
+# frozen_string_literal: true
+
+class RemoveScheduleAndStatusFromPendingAlertEscalations < Gitlab::Database::Migration[1.0]
+ include Gitlab::Database::PartitioningMigrationHelpers
+
+ disable_ddl_transaction!
+
+ ESCALATIONS_TABLE = :incident_management_pending_alert_escalations
+ SCHEDULES_TABLE = :incident_management_oncall_schedules
+ INDEX_NAME = 'index_incident_management_pending_alert_escalations_on_schedule'
+ CONSTRAINT_NAME = 'fk_rails_fcbfd9338b'
+
+ def up
+ with_lock_retries do
+ remove_column ESCALATIONS_TABLE, :schedule_id
+ remove_column ESCALATIONS_TABLE, :status
+ end
+ end
+
+ def down
+ with_lock_retries do
+ add_column ESCALATIONS_TABLE, :schedule_id, :bigint unless column_exists?(ESCALATIONS_TABLE, :schedule_id)
+ add_column ESCALATIONS_TABLE, :status, :smallint unless column_exists?(ESCALATIONS_TABLE, :status)
+ end
+
+ add_concurrent_partitioned_index ESCALATIONS_TABLE, :schedule_id, name: INDEX_NAME
+ add_concurrent_partitioned_foreign_key ESCALATIONS_TABLE, SCHEDULES_TABLE, column: :schedule_id, name: CONSTRAINT_NAME
+ end
+end
diff --git a/db/schema_migrations/20190102152410 b/db/schema_migrations/20190102152410
deleted file mode 100644
index abeec4ae6ed..00000000000
--- a/db/schema_migrations/20190102152410
+++ /dev/null
@@ -1 +0,0 @@
-b4437ea9b52eaa5c1e25982995720139b359e58c9622a1206b212e96a188e28a \ No newline at end of file
diff --git a/db/schema_migrations/20190103140724 b/db/schema_migrations/20190103140724
deleted file mode 100644
index 85c51014c8f..00000000000
--- a/db/schema_migrations/20190103140724
+++ /dev/null
@@ -1 +0,0 @@
-a972ee9ce7142d93108f635f550d0b6245c335dec130072e9f5121fed52544a1 \ No newline at end of file
diff --git a/db/schema_migrations/20190104182041 b/db/schema_migrations/20190104182041
deleted file mode 100644
index 9342970a634..00000000000
--- a/db/schema_migrations/20190104182041
+++ /dev/null
@@ -1 +0,0 @@
-2f2226dc7a34ae86e00f00ad03e74b2591adc6e5f9367b779c7bb57a38702c0f \ No newline at end of file
diff --git a/db/schema_migrations/20190107151020 b/db/schema_migrations/20190107151020
deleted file mode 100644
index be64b70d253..00000000000
--- a/db/schema_migrations/20190107151020
+++ /dev/null
@@ -1 +0,0 @@
-52b5718373a5a336a38257aa73758059e77ba15afab89ac3326f8a96ac4df00a \ No newline at end of file
diff --git a/db/schema_migrations/20190108192941 b/db/schema_migrations/20190108192941
deleted file mode 100644
index 8bdd56bb248..00000000000
--- a/db/schema_migrations/20190108192941
+++ /dev/null
@@ -1 +0,0 @@
-58d3c729a331666723ff80b4f778795d39bcf6b62fb79931bf25e30ac072fbf8 \ No newline at end of file
diff --git a/db/schema_migrations/20190109153125 b/db/schema_migrations/20190109153125
deleted file mode 100644
index 26ce8cd7b28..00000000000
--- a/db/schema_migrations/20190109153125
+++ /dev/null
@@ -1 +0,0 @@
-901f28f6af880c088971c619d095db2d328c42a8b3b31b4faf53d4bf0f76b4e0 \ No newline at end of file
diff --git a/db/schema_migrations/20190114172110 b/db/schema_migrations/20190114172110
deleted file mode 100644
index c32ee0ddcae..00000000000
--- a/db/schema_migrations/20190114172110
+++ /dev/null
@@ -1 +0,0 @@
-4bde1677e881c6bb03785e313875fce7c4bf690f1fe8b807be473331cfb57c22 \ No newline at end of file
diff --git a/db/schema_migrations/20190115054215 b/db/schema_migrations/20190115054215
deleted file mode 100644
index 45c2d030a79..00000000000
--- a/db/schema_migrations/20190115054215
+++ /dev/null
@@ -1 +0,0 @@
-1a87f77540cf91ae8d640819d515ed34ca69bef1e0d5494b0247385e44f3520c \ No newline at end of file
diff --git a/db/schema_migrations/20190115054216 b/db/schema_migrations/20190115054216
deleted file mode 100644
index 0eb786da0b9..00000000000
--- a/db/schema_migrations/20190115054216
+++ /dev/null
@@ -1 +0,0 @@
-7bd27433ac96c9aaf0ab7aeb5b4bea9af292b56ff5cb9966df63145a95a906e3 \ No newline at end of file
diff --git a/db/schema_migrations/20190115092821 b/db/schema_migrations/20190115092821
deleted file mode 100644
index 9037247c9c1..00000000000
--- a/db/schema_migrations/20190115092821
+++ /dev/null
@@ -1 +0,0 @@
-0d1262ee8c48483020f8aaec1d737650339e56c0fa0b530a047423e5ad4cf7fb \ No newline at end of file
diff --git a/db/schema_migrations/20190116234221 b/db/schema_migrations/20190116234221
deleted file mode 100644
index e57d4297007..00000000000
--- a/db/schema_migrations/20190116234221
+++ /dev/null
@@ -1 +0,0 @@
-36ad5643295d8ab4f2b50c028dc6e047ac1bba18c2495862113c227040549a7c \ No newline at end of file
diff --git a/db/schema_migrations/20190124200344 b/db/schema_migrations/20190124200344
deleted file mode 100644
index b3b490b5a22..00000000000
--- a/db/schema_migrations/20190124200344
+++ /dev/null
@@ -1 +0,0 @@
-c3563a49a4f65389da84eae0a3d6851ac1d89f736ad213047bb20b085cf65444 \ No newline at end of file
diff --git a/db/schema_migrations/20190130091630 b/db/schema_migrations/20190130091630
deleted file mode 100644
index bb31de7213d..00000000000
--- a/db/schema_migrations/20190130091630
+++ /dev/null
@@ -1 +0,0 @@
-824c8286fcc54bf104c76159d75d22addb9084f932d884008a6e09d3ffdd4fc3 \ No newline at end of file
diff --git a/db/schema_migrations/20190131122559 b/db/schema_migrations/20190131122559
deleted file mode 100644
index 5ff09feeb4a..00000000000
--- a/db/schema_migrations/20190131122559
+++ /dev/null
@@ -1 +0,0 @@
-8c9392470fe4f34e5a194b449702161fedfe12237c87e1653fc1edaff6f82493 \ No newline at end of file
diff --git a/db/schema_migrations/20190204115450 b/db/schema_migrations/20190204115450
deleted file mode 100644
index cca6016a50a..00000000000
--- a/db/schema_migrations/20190204115450
+++ /dev/null
@@ -1 +0,0 @@
-1259521d2b9cc79694f0d47dce9e599b7fb0abfd3fa6b8c0161860b6815676c8 \ No newline at end of file
diff --git a/db/schema_migrations/20190206193120 b/db/schema_migrations/20190206193120
deleted file mode 100644
index 9918f719946..00000000000
--- a/db/schema_migrations/20190206193120
+++ /dev/null
@@ -1 +0,0 @@
-75e303c1cc9ba39465ed4cb7db6b24b38af0f83b11b72fcc25478bd98260ecd9 \ No newline at end of file
diff --git a/db/schema_migrations/20190211131150 b/db/schema_migrations/20190211131150
deleted file mode 100644
index 364b1244b25..00000000000
--- a/db/schema_migrations/20190211131150
+++ /dev/null
@@ -1 +0,0 @@
-e400393e5a5cfdbcea5927ce6c037e0879cf86d8b35c11673701a2515bbf93b6 \ No newline at end of file
diff --git a/db/schema_migrations/20190214112022 b/db/schema_migrations/20190214112022
deleted file mode 100644
index d13877d88a6..00000000000
--- a/db/schema_migrations/20190214112022
+++ /dev/null
@@ -1 +0,0 @@
-a3afb501288961682a4969f4ecaf2496e75795fa2adaa10d3d047ee24c9b1967 \ No newline at end of file
diff --git a/db/schema_migrations/20190215154930 b/db/schema_migrations/20190215154930
deleted file mode 100644
index cb0e0834f8d..00000000000
--- a/db/schema_migrations/20190215154930
+++ /dev/null
@@ -1 +0,0 @@
-3eea929f8efcb9ef32242c98a7393a8b45eceb3930b7e9b3a782dd9f5628d718 \ No newline at end of file
diff --git a/db/schema_migrations/20190218134158 b/db/schema_migrations/20190218134158
deleted file mode 100644
index 04b55b69e23..00000000000
--- a/db/schema_migrations/20190218134158
+++ /dev/null
@@ -1 +0,0 @@
-86716aa523d3fbf1c0dc40e758b004ee500d9b6dbc5f5f05ddf167b0f1937fd7 \ No newline at end of file
diff --git a/db/schema_migrations/20190218134209 b/db/schema_migrations/20190218134209
deleted file mode 100644
index 7a442ccf8a4..00000000000
--- a/db/schema_migrations/20190218134209
+++ /dev/null
@@ -1 +0,0 @@
-e63a6b7f3032aa58d906f0b5b2141ae376bc4ce78aa4a9c18c983b4c749cd736 \ No newline at end of file
diff --git a/db/schema_migrations/20190219201635 b/db/schema_migrations/20190219201635
deleted file mode 100644
index 65073d40aea..00000000000
--- a/db/schema_migrations/20190219201635
+++ /dev/null
@@ -1 +0,0 @@
-bba3d5fba71bc98e53f3858cf039d74049eb9beb0c6a7d075909dd58e88595ba \ No newline at end of file
diff --git a/db/schema_migrations/20190220142344 b/db/schema_migrations/20190220142344
deleted file mode 100644
index 32a3a4e12e2..00000000000
--- a/db/schema_migrations/20190220142344
+++ /dev/null
@@ -1 +0,0 @@
-f0c7e5bb3048b6e7d91a4fb5082ad0b1ac86965287f956dc8a2de17e13a9f365 \ No newline at end of file
diff --git a/db/schema_migrations/20190220150130 b/db/schema_migrations/20190220150130
deleted file mode 100644
index bf4130f7e2b..00000000000
--- a/db/schema_migrations/20190220150130
+++ /dev/null
@@ -1 +0,0 @@
-341ac337f4b5aa05bbb6d69ca4517a785eb2f577ed53b282484f6b2bf44eaf86 \ No newline at end of file
diff --git a/db/schema_migrations/20190222051615 b/db/schema_migrations/20190222051615
deleted file mode 100644
index 0028efcf173..00000000000
--- a/db/schema_migrations/20190222051615
+++ /dev/null
@@ -1 +0,0 @@
-af6fc844acb6091006688452a2a5d863bb133908bc739f36267fa8178c316d21 \ No newline at end of file
diff --git a/db/schema_migrations/20190225152525 b/db/schema_migrations/20190225152525
deleted file mode 100644
index 0e90656201a..00000000000
--- a/db/schema_migrations/20190225152525
+++ /dev/null
@@ -1 +0,0 @@
-78ca691904675f03d3debbb6a632e75d74eee054150ed4cd93804a4d70aeb6b4 \ No newline at end of file
diff --git a/db/schema_migrations/20190225160301 b/db/schema_migrations/20190225160301
deleted file mode 100644
index b3126de5788..00000000000
--- a/db/schema_migrations/20190225160301
+++ /dev/null
@@ -1 +0,0 @@
-614cfc757d5f3eddc1144247932b83c71359edea88f06bef9348081448b78134 \ No newline at end of file
diff --git a/db/schema_migrations/20190228192410 b/db/schema_migrations/20190228192410
deleted file mode 100644
index fd80c6c3fa8..00000000000
--- a/db/schema_migrations/20190228192410
+++ /dev/null
@@ -1 +0,0 @@
-ccfbf0b383cc80dca181abed3e23e1c41033aa59b38c2fea25b424e08329633c \ No newline at end of file
diff --git a/db/schema_migrations/20190301081611 b/db/schema_migrations/20190301081611
deleted file mode 100644
index 601c04a3f63..00000000000
--- a/db/schema_migrations/20190301081611
+++ /dev/null
@@ -1 +0,0 @@
-3bab89fa4b95f022ec5a17a1fd3c006f7f822091f35e3db923e1b8f0ca7c0b3e \ No newline at end of file
diff --git a/db/schema_migrations/20190301182457 b/db/schema_migrations/20190301182457
deleted file mode 100644
index 671779d1714..00000000000
--- a/db/schema_migrations/20190301182457
+++ /dev/null
@@ -1 +0,0 @@
-43b776baffd1c8c2e0731c3d897aa3b4f043faa79132dcd2b73d06ee53641f92 \ No newline at end of file
diff --git a/db/schema_migrations/20190312071108 b/db/schema_migrations/20190312071108
deleted file mode 100644
index ff788bf449a..00000000000
--- a/db/schema_migrations/20190312071108
+++ /dev/null
@@ -1 +0,0 @@
-85a35b85d9c6c484cea1991504d2406f752c09929d2770309d475feee238f69c \ No newline at end of file
diff --git a/db/schema_migrations/20190312113229 b/db/schema_migrations/20190312113229
deleted file mode 100644
index 487ec48f404..00000000000
--- a/db/schema_migrations/20190312113229
+++ /dev/null
@@ -1 +0,0 @@
-2028ff93a38e1788d91884f63689d35163cf01ced7e7a049184f2081a18cdafd \ No newline at end of file
diff --git a/db/schema_migrations/20190312113634 b/db/schema_migrations/20190312113634
deleted file mode 100644
index 0f764bc0e0a..00000000000
--- a/db/schema_migrations/20190312113634
+++ /dev/null
@@ -1 +0,0 @@
-52626206f5779839a1d5b2a4910ae3f79adcaa617d21816b25dd8eb18d0f234e \ No newline at end of file
diff --git a/db/schema_migrations/20190313092516 b/db/schema_migrations/20190313092516
deleted file mode 100644
index ba4de300985..00000000000
--- a/db/schema_migrations/20190313092516
+++ /dev/null
@@ -1 +0,0 @@
-b81fd5f350588d2326c97bd061f3b7c3ab97023e445335ad3d848c8eb2c14f48 \ No newline at end of file
diff --git a/db/schema_migrations/20190315191339 b/db/schema_migrations/20190315191339
deleted file mode 100644
index 3245749bb3e..00000000000
--- a/db/schema_migrations/20190315191339
+++ /dev/null
@@ -1 +0,0 @@
-3a8bd7f70351a26ba827ad4e3a63e374c9065e232109925286f6ff0d79430b7b \ No newline at end of file
diff --git a/db/schema_migrations/20190320174702 b/db/schema_migrations/20190320174702
deleted file mode 100644
index 56231223122..00000000000
--- a/db/schema_migrations/20190320174702
+++ /dev/null
@@ -1 +0,0 @@
-8a180702a02279a67245c4fa90fd168ee86d373597902fcf5acd2ca5ed5bb5ee \ No newline at end of file
diff --git a/db/schema_migrations/20190322132835 b/db/schema_migrations/20190322132835
deleted file mode 100644
index 990aaf1701d..00000000000
--- a/db/schema_migrations/20190322132835
+++ /dev/null
@@ -1 +0,0 @@
-56c444f12de56f3e31c723632944a7dacd7eb256760ea268a97f8a02f6365491 \ No newline at end of file
diff --git a/db/schema_migrations/20190322164830 b/db/schema_migrations/20190322164830
deleted file mode 100644
index 8c1d40a8203..00000000000
--- a/db/schema_migrations/20190322164830
+++ /dev/null
@@ -1 +0,0 @@
-ad03fde4d9311607d920e6bddde19b0f96a2ee7ed3199d6eb5f9b111df25a525 \ No newline at end of file
diff --git a/db/schema_migrations/20190325080727 b/db/schema_migrations/20190325080727
deleted file mode 100644
index 1fe4949ba8e..00000000000
--- a/db/schema_migrations/20190325080727
+++ /dev/null
@@ -1 +0,0 @@
-77e3fe2b1a968a4be27b7150ea993de11028b876905f30d381bc08263dab0d3f \ No newline at end of file
diff --git a/db/schema_migrations/20190325105715 b/db/schema_migrations/20190325105715
deleted file mode 100644
index 7c179827543..00000000000
--- a/db/schema_migrations/20190325105715
+++ /dev/null
@@ -1 +0,0 @@
-c674d2f2cf2147125760613edfea332860f90a9cc1e1d9f3c857aa0b033d8912 \ No newline at end of file
diff --git a/db/schema_migrations/20190325111602 b/db/schema_migrations/20190325111602
deleted file mode 100644
index 271e447435a..00000000000
--- a/db/schema_migrations/20190325111602
+++ /dev/null
@@ -1 +0,0 @@
-3fac4d070229a0534a3b98d5f80c814c5564881b24837289207769b9a235e808 \ No newline at end of file
diff --git a/db/schema_migrations/20190325165127 b/db/schema_migrations/20190325165127
deleted file mode 100644
index 88d90cd99e9..00000000000
--- a/db/schema_migrations/20190325165127
+++ /dev/null
@@ -1 +0,0 @@
-9b7ebd3a5456b55a73ae1f7d504c36485d0b15f9e2b7ad3f43c71cbfd65720f1 \ No newline at end of file
diff --git a/db/schema_migrations/20190326164045 b/db/schema_migrations/20190326164045
deleted file mode 100644
index a1ca6378508..00000000000
--- a/db/schema_migrations/20190326164045
+++ /dev/null
@@ -1 +0,0 @@
-69ed3746ead7d706c62fd5287e9df3a496dc9d17d344a6c43b511db3e2467667 \ No newline at end of file
diff --git a/db/schema_migrations/20190327163904 b/db/schema_migrations/20190327163904
deleted file mode 100644
index c0e4070375a..00000000000
--- a/db/schema_migrations/20190327163904
+++ /dev/null
@@ -1 +0,0 @@
-08f49ff72142d860dac3fc70444523d0c89912d1be85a994c17411e4748b9099 \ No newline at end of file
diff --git a/db/schema_migrations/20190329085614 b/db/schema_migrations/20190329085614
deleted file mode 100644
index 069e3e0e86e..00000000000
--- a/db/schema_migrations/20190329085614
+++ /dev/null
@@ -1 +0,0 @@
-a58e6d439a97f378d280aee285a3662525a971ddf11761e0ae3c3093163499db \ No newline at end of file
diff --git a/db/schema_migrations/20190402150158 b/db/schema_migrations/20190402150158
deleted file mode 100644
index 282cc3f5f9d..00000000000
--- a/db/schema_migrations/20190402150158
+++ /dev/null
@@ -1 +0,0 @@
-4501b35c0661f0ef6a3cd46db5d48f90b2131a1ae30bd73b442ed56ac6655e8d \ No newline at end of file
diff --git a/db/schema_migrations/20190403161806 b/db/schema_migrations/20190403161806
deleted file mode 100644
index 41e390d6d83..00000000000
--- a/db/schema_migrations/20190403161806
+++ /dev/null
@@ -1 +0,0 @@
-fd69f104fb0707d622bc8c7955481b277907e919a2423cc7e35f68e76544a304 \ No newline at end of file
diff --git a/db/schema_migrations/20190404143330 b/db/schema_migrations/20190404143330
deleted file mode 100644
index da8b26709c1..00000000000
--- a/db/schema_migrations/20190404143330
+++ /dev/null
@@ -1 +0,0 @@
-dc1704bbed4f8d7e285e8edf9e6d537c8e720f4737f76b089532c6a0712d132a \ No newline at end of file
diff --git a/db/schema_migrations/20190404231137 b/db/schema_migrations/20190404231137
deleted file mode 100644
index 0cc8f0e1203..00000000000
--- a/db/schema_migrations/20190404231137
+++ /dev/null
@@ -1 +0,0 @@
-32f6313383609eb5abd9082e51ddc5719766c3d74d0cc5d776535f52ffddd5bb \ No newline at end of file
diff --git a/db/schema_migrations/20190408163745 b/db/schema_migrations/20190408163745
deleted file mode 100644
index 04fe7efa73a..00000000000
--- a/db/schema_migrations/20190408163745
+++ /dev/null
@@ -1 +0,0 @@
-47d77dd636c35cd2c7f9bc2de035899548052a2005f29735d078f054c02bee7c \ No newline at end of file
diff --git a/db/schema_migrations/20190409224933 b/db/schema_migrations/20190409224933
deleted file mode 100644
index e6c3eb0da22..00000000000
--- a/db/schema_migrations/20190409224933
+++ /dev/null
@@ -1 +0,0 @@
-f3fd28e093775afa4f8e94b2355c1b5a6dc5d3138d31faa44b6d70a2f7dc3f88 \ No newline at end of file
diff --git a/db/schema_migrations/20190410173409 b/db/schema_migrations/20190410173409
deleted file mode 100644
index 7134339796a..00000000000
--- a/db/schema_migrations/20190410173409
+++ /dev/null
@@ -1 +0,0 @@
-6c2980e7e9056aa8966bb3e5b2547d9ef85da1b1bc25d5bd2acc1d218f52f14b \ No newline at end of file
diff --git a/db/schema_migrations/20190412155659 b/db/schema_migrations/20190412155659
deleted file mode 100644
index 8db412696ce..00000000000
--- a/db/schema_migrations/20190412155659
+++ /dev/null
@@ -1 +0,0 @@
-62a8e24ba6fb73cd35bbeef9db6ea8827be117e86b5c0b72caeedfab078a5d5d \ No newline at end of file
diff --git a/db/schema_migrations/20190412183653 b/db/schema_migrations/20190412183653
deleted file mode 100644
index 8e5783e5afc..00000000000
--- a/db/schema_migrations/20190412183653
+++ /dev/null
@@ -1 +0,0 @@
-6760598e05fbf57a005ef680b461d9dfea0481e7e5a8ec295926976cbf674e79 \ No newline at end of file
diff --git a/db/schema_migrations/20190414185432 b/db/schema_migrations/20190414185432
deleted file mode 100644
index e35b69c4057..00000000000
--- a/db/schema_migrations/20190414185432
+++ /dev/null
@@ -1 +0,0 @@
-7155530822ffefff7419ea8d5e319a01af58b64cffe56673cb78e8305b834921 \ No newline at end of file
diff --git a/db/schema_migrations/20190415030217 b/db/schema_migrations/20190415030217
deleted file mode 100644
index cf96941c58a..00000000000
--- a/db/schema_migrations/20190415030217
+++ /dev/null
@@ -1 +0,0 @@
-c3c9010876f7cd32f1ffa858fb35e530f64dad1e8d86962ee3c2a2d63ec052ec \ No newline at end of file
diff --git a/db/schema_migrations/20190415095825 b/db/schema_migrations/20190415095825
deleted file mode 100644
index d13d1f9be19..00000000000
--- a/db/schema_migrations/20190415095825
+++ /dev/null
@@ -1 +0,0 @@
-883a00ae98969170f5f09842b04002145abb5f7e5e253e285eacc71828214ad0 \ No newline at end of file
diff --git a/db/schema_migrations/20190415172035 b/db/schema_migrations/20190415172035
deleted file mode 100644
index 2ec55a9344b..00000000000
--- a/db/schema_migrations/20190415172035
+++ /dev/null
@@ -1 +0,0 @@
-a9e2aed5e1b0ebcdd83b082777fef905bdbec7976a88af8a5393024032d4a61a \ No newline at end of file
diff --git a/db/schema_migrations/20190416185130 b/db/schema_migrations/20190416185130
deleted file mode 100644
index 0a649490d3b..00000000000
--- a/db/schema_migrations/20190416185130
+++ /dev/null
@@ -1 +0,0 @@
-96c1a1ccfecd82e93fd77dcaf957c7dc5e9604e18579cf06603f5e62b8816cd0 \ No newline at end of file
diff --git a/db/schema_migrations/20190416213556 b/db/schema_migrations/20190416213556
deleted file mode 100644
index a6afa258846..00000000000
--- a/db/schema_migrations/20190416213556
+++ /dev/null
@@ -1 +0,0 @@
-67ef8b059ebcfbfd447a1c2fee9628344a97aee1d7280722b507e8c59dec8944 \ No newline at end of file
diff --git a/db/schema_migrations/20190416213615 b/db/schema_migrations/20190416213615
deleted file mode 100644
index effee0822ee..00000000000
--- a/db/schema_migrations/20190416213615
+++ /dev/null
@@ -1 +0,0 @@
-7ac526e1cc920771f43333cebf6792ac41e1b0c4364eb8e0eaa955008801d45e \ No newline at end of file
diff --git a/db/schema_migrations/20190416213631 b/db/schema_migrations/20190416213631
deleted file mode 100644
index c94ba4fd5b2..00000000000
--- a/db/schema_migrations/20190416213631
+++ /dev/null
@@ -1 +0,0 @@
-87782324f2922befcc1b6796dfed84c31f71022a725303428cc7c6e49422184c \ No newline at end of file
diff --git a/db/schema_migrations/20190418132125 b/db/schema_migrations/20190418132125
deleted file mode 100644
index 6a8c766a3fa..00000000000
--- a/db/schema_migrations/20190418132125
+++ /dev/null
@@ -1 +0,0 @@
-a3980532461ee91172a91763d5380770d8b0c2bca5a3135e72617ea24e0d0ac8 \ No newline at end of file
diff --git a/db/schema_migrations/20190418132750 b/db/schema_migrations/20190418132750
deleted file mode 100644
index ddc987390ba..00000000000
--- a/db/schema_migrations/20190418132750
+++ /dev/null
@@ -1 +0,0 @@
-ee96740f57b428f12b1ccfb082ac37a53b713495067652eb4deb470c8044aeda \ No newline at end of file
diff --git a/db/schema_migrations/20190418182545 b/db/schema_migrations/20190418182545
deleted file mode 100644
index 76eba7cf4af..00000000000
--- a/db/schema_migrations/20190418182545
+++ /dev/null
@@ -1 +0,0 @@
-1f07b87a2330c84adcf34c163276afeb7e360bd797f79d26afd58cc80cd449fe \ No newline at end of file
diff --git a/db/schema_migrations/20190419121952 b/db/schema_migrations/20190419121952
deleted file mode 100644
index fe75181492b..00000000000
--- a/db/schema_migrations/20190419121952
+++ /dev/null
@@ -1 +0,0 @@
-bec13ef72249efab67c8e89ec78acfff6aee6d9d2e15f7d16d7e8f630142410b \ No newline at end of file
diff --git a/db/schema_migrations/20190419123057 b/db/schema_migrations/20190419123057
deleted file mode 100644
index 4dfaafa73cb..00000000000
--- a/db/schema_migrations/20190419123057
+++ /dev/null
@@ -1 +0,0 @@
-f63e65742f287eae6de42676655f47faed5ad2cdd999d2f24169beebfd90df6a \ No newline at end of file
diff --git a/db/schema_migrations/20190422082247 b/db/schema_migrations/20190422082247
deleted file mode 100644
index dcfec7aa6ad..00000000000
--- a/db/schema_migrations/20190422082247
+++ /dev/null
@@ -1 +0,0 @@
-66792bafc4b8dbe42f8c9e8112344f7e4aac24c7d4a214dd8d9c35111e93f2de \ No newline at end of file
diff --git a/db/schema_migrations/20190423124640 b/db/schema_migrations/20190423124640
deleted file mode 100644
index 42087906694..00000000000
--- a/db/schema_migrations/20190423124640
+++ /dev/null
@@ -1 +0,0 @@
-9a58f5a97883e97b340c9170d8259a081bb7b6ac82f58a7729cc7aee3a34814f \ No newline at end of file
diff --git a/db/schema_migrations/20190424134256 b/db/schema_migrations/20190424134256
deleted file mode 100644
index 0e6e7fef6dd..00000000000
--- a/db/schema_migrations/20190424134256
+++ /dev/null
@@ -1 +0,0 @@
-c05439f0c95c3278389dd50ee395212ff132f3db5bdda06805b1d8d0000054d8 \ No newline at end of file
diff --git a/db/schema_migrations/20190426180107 b/db/schema_migrations/20190426180107
deleted file mode 100644
index de83271a3f2..00000000000
--- a/db/schema_migrations/20190426180107
+++ /dev/null
@@ -1 +0,0 @@
-ca82f05a9d25e7dde29d678b3db88338dcd22ec0969a47053cb435f3fe24d3d2 \ No newline at end of file
diff --git a/db/schema_migrations/20190429082448 b/db/schema_migrations/20190429082448
deleted file mode 100644
index 99ae471395a..00000000000
--- a/db/schema_migrations/20190429082448
+++ /dev/null
@@ -1 +0,0 @@
-a35c3db7b3be33721141f30634e65a72f26b2858a6c57121a0c68c689c40789a \ No newline at end of file
diff --git a/db/schema_migrations/20190430131225 b/db/schema_migrations/20190430131225
deleted file mode 100644
index 3c12a6f445d..00000000000
--- a/db/schema_migrations/20190430131225
+++ /dev/null
@@ -1 +0,0 @@
-d7f74861d06aaaacf9d05f16a6659e8c93deeed297d4eec93fe0262fef11184d \ No newline at end of file
diff --git a/db/schema_migrations/20190430142025 b/db/schema_migrations/20190430142025
deleted file mode 100644
index a498ab346ed..00000000000
--- a/db/schema_migrations/20190430142025
+++ /dev/null
@@ -1 +0,0 @@
-b9e011b738ee260a804295a7efeb91fb6c40ae5d24cfcc4b7614478eabc06504 \ No newline at end of file
diff --git a/db/schema_migrations/20190506135337 b/db/schema_migrations/20190506135337
deleted file mode 100644
index 6b8dfa5c410..00000000000
--- a/db/schema_migrations/20190506135337
+++ /dev/null
@@ -1 +0,0 @@
-7a37879b82367f2792900e286cd50546607525a2888ee6ffea7b9945f828e107 \ No newline at end of file
diff --git a/db/schema_migrations/20190506135400 b/db/schema_migrations/20190506135400
deleted file mode 100644
index 7e20423d0fe..00000000000
--- a/db/schema_migrations/20190506135400
+++ /dev/null
@@ -1 +0,0 @@
-b9290414944590f81e6bf90840f966d32f5205c839b086a73b59e28119fbe075 \ No newline at end of file
diff --git a/db/schema_migrations/20190511144331 b/db/schema_migrations/20190511144331
deleted file mode 100644
index 0f5a8cac075..00000000000
--- a/db/schema_migrations/20190511144331
+++ /dev/null
@@ -1 +0,0 @@
-7f4212cfe2895b14992d02150915b9c68ca537f5b69acaf286815c0697d9ccf8 \ No newline at end of file
diff --git a/db/schema_migrations/20190513174947 b/db/schema_migrations/20190513174947
deleted file mode 100644
index ba44be223d5..00000000000
--- a/db/schema_migrations/20190513174947
+++ /dev/null
@@ -1 +0,0 @@
-e5778ed38cfb813985a0070cb8120864a575d996a7a83f42a41f6ad1e4b90748 \ No newline at end of file
diff --git a/db/schema_migrations/20190514105711 b/db/schema_migrations/20190514105711
deleted file mode 100644
index 9985a90dbfb..00000000000
--- a/db/schema_migrations/20190514105711
+++ /dev/null
@@ -1 +0,0 @@
-ffe125d215b0c65ce1ca4801e3b78381381c73b8056d95bd024cd5382570fba0 \ No newline at end of file
diff --git a/db/schema_migrations/20190515125613 b/db/schema_migrations/20190515125613
deleted file mode 100644
index c20946369f9..00000000000
--- a/db/schema_migrations/20190515125613
+++ /dev/null
@@ -1 +0,0 @@
-3a7371d1496098c700d0769994cb01f49f834904d4e6176ea2250d4ea34aed6b \ No newline at end of file
diff --git a/db/schema_migrations/20190516011213 b/db/schema_migrations/20190516011213
deleted file mode 100644
index d880a478fbf..00000000000
--- a/db/schema_migrations/20190516011213
+++ /dev/null
@@ -1 +0,0 @@
-367010e0e41cd29fda7e4580bfdd080ebcdd858382c52213cf9765c56e7a5fdf \ No newline at end of file
diff --git a/db/schema_migrations/20190516151857 b/db/schema_migrations/20190516151857
deleted file mode 100644
index d96e812b54a..00000000000
--- a/db/schema_migrations/20190516151857
+++ /dev/null
@@ -1 +0,0 @@
-fd37070c5d59d050b48bfcebfeeff703f3368774df3445993623a6ec73f62396 \ No newline at end of file
diff --git a/db/schema_migrations/20190516155724 b/db/schema_migrations/20190516155724
deleted file mode 100644
index a75bc76c9ab..00000000000
--- a/db/schema_migrations/20190516155724
+++ /dev/null
@@ -1 +0,0 @@
-87361447d851dff62b599e4578d469a373d6e71b0ba30bb424a3c7b13cdb0a0d \ No newline at end of file
diff --git a/db/schema_migrations/20190517153211 b/db/schema_migrations/20190517153211
deleted file mode 100644
index 44c71eb8a04..00000000000
--- a/db/schema_migrations/20190517153211
+++ /dev/null
@@ -1 +0,0 @@
-d763d436102851337ff4d667fa6f11958ecd24251acd138feae18a1549b523c8 \ No newline at end of file
diff --git a/db/schema_migrations/20190520200123 b/db/schema_migrations/20190520200123
deleted file mode 100644
index f4a29b16d4e..00000000000
--- a/db/schema_migrations/20190520200123
+++ /dev/null
@@ -1 +0,0 @@
-7e1baeb3a7664b668bbf10c1399d99ace8ec0050537cfe1637a56546a11993d6 \ No newline at end of file
diff --git a/db/schema_migrations/20190520201748 b/db/schema_migrations/20190520201748
deleted file mode 100644
index d3a2e7ae017..00000000000
--- a/db/schema_migrations/20190520201748
+++ /dev/null
@@ -1 +0,0 @@
-0dc814eaab3c9b9df422cdb26b116c22b35a14fd90fe4c4ff388868d31bf54fc \ No newline at end of file
diff --git a/db/schema_migrations/20190521174505 b/db/schema_migrations/20190521174505
deleted file mode 100644
index fc21aab73ef..00000000000
--- a/db/schema_migrations/20190521174505
+++ /dev/null
@@ -1 +0,0 @@
-a776caf05daa2921442913187335e230683034c7b28a847410ec149bd73c2d85 \ No newline at end of file
diff --git a/db/schema_migrations/20190522143720 b/db/schema_migrations/20190522143720
deleted file mode 100644
index 795fb9452c9..00000000000
--- a/db/schema_migrations/20190522143720
+++ /dev/null
@@ -1 +0,0 @@
-e313e0902106da890ef0bf2e292b66377a306521c53b592a41ff1d0aa3093773 \ No newline at end of file
diff --git a/db/schema_migrations/20190523112344 b/db/schema_migrations/20190523112344
deleted file mode 100644
index 08930b99aac..00000000000
--- a/db/schema_migrations/20190523112344
+++ /dev/null
@@ -1 +0,0 @@
-7ead29c04ea8285a5660546183469941b2e7dd2e73dea2b6c64cf4d640271f85 \ No newline at end of file
diff --git a/db/schema_migrations/20190524062810 b/db/schema_migrations/20190524062810
deleted file mode 100644
index 0d9bac494aa..00000000000
--- a/db/schema_migrations/20190524062810
+++ /dev/null
@@ -1 +0,0 @@
-a1e08ba597e365bd18b1272089189a4417e2353ed80926d52a1eb8a0cfddee22 \ No newline at end of file
diff --git a/db/schema_migrations/20190524071727 b/db/schema_migrations/20190524071727
deleted file mode 100644
index c63a56f5040..00000000000
--- a/db/schema_migrations/20190524071727
+++ /dev/null
@@ -1 +0,0 @@
-5e495b65103d5506efcb95eab0ed07aa64448bb19f2a83137ec51e09aa6675d7 \ No newline at end of file
diff --git a/db/schema_migrations/20190524073827 b/db/schema_migrations/20190524073827
deleted file mode 100644
index 3d152f83be9..00000000000
--- a/db/schema_migrations/20190524073827
+++ /dev/null
@@ -1 +0,0 @@
-a090ed64202749ed3b108491757072f62d93a21c9795b5b48b88b568d13de2f1 \ No newline at end of file
diff --git a/db/schema_migrations/20190527011309 b/db/schema_migrations/20190527011309
deleted file mode 100644
index 101c0b7a7bc..00000000000
--- a/db/schema_migrations/20190527011309
+++ /dev/null
@@ -1 +0,0 @@
-6b85fc6767490e4e45e8f18ab828296c4f6103811a0fe44ea840e8da146cb0b1 \ No newline at end of file
diff --git a/db/schema_migrations/20190527194830 b/db/schema_migrations/20190527194830
deleted file mode 100644
index a647f31c58d..00000000000
--- a/db/schema_migrations/20190527194830
+++ /dev/null
@@ -1 +0,0 @@
-935dc61bec02fa364dd288a67244d8d604ef304c690ef1243c3cd0483e00c356 \ No newline at end of file
diff --git a/db/schema_migrations/20190527194900 b/db/schema_migrations/20190527194900
deleted file mode 100644
index 05bdfe7dcf4..00000000000
--- a/db/schema_migrations/20190527194900
+++ /dev/null
@@ -1 +0,0 @@
-f05f4728c295f5b90ef1662a223e6a265d1598159592286f6a23578f434d2121 \ No newline at end of file
diff --git a/db/schema_migrations/20190528173628 b/db/schema_migrations/20190528173628
deleted file mode 100644
index dffeef637ec..00000000000
--- a/db/schema_migrations/20190528173628
+++ /dev/null
@@ -1 +0,0 @@
-a7e5d565f568c7963add43d4936115a64256d1cd925d0415a46ff567bf14848f \ No newline at end of file
diff --git a/db/schema_migrations/20190528180441 b/db/schema_migrations/20190528180441
deleted file mode 100644
index 4497b2b8449..00000000000
--- a/db/schema_migrations/20190528180441
+++ /dev/null
@@ -1 +0,0 @@
-786807c18fa81892be66c977cc46cf0bef023cb95ee1759330621bb79c11955e \ No newline at end of file
diff --git a/db/schema_migrations/20190529142545 b/db/schema_migrations/20190529142545
deleted file mode 100644
index 5860afac439..00000000000
--- a/db/schema_migrations/20190529142545
+++ /dev/null
@@ -1 +0,0 @@
-68d16c1d3811ef365ae815e9da96370537b8f7d4c25aa71287f7b37c8c764b03 \ No newline at end of file
diff --git a/db/schema_migrations/20190530042141 b/db/schema_migrations/20190530042141
deleted file mode 100644
index 41cc48a9d1b..00000000000
--- a/db/schema_migrations/20190530042141
+++ /dev/null
@@ -1 +0,0 @@
-2583953e1ee878bc3c892e3afd363ddfe0e9f49467a9345f751f999ad6f0c8d0 \ No newline at end of file
diff --git a/db/schema_migrations/20190530154715 b/db/schema_migrations/20190530154715
deleted file mode 100644
index 51772a0715a..00000000000
--- a/db/schema_migrations/20190530154715
+++ /dev/null
@@ -1 +0,0 @@
-1240ce7849fd8111f7917f39afe477730ffbfb8cb0ab11c5134bf6cc6803abd9 \ No newline at end of file
diff --git a/db/schema_migrations/20190531153110 b/db/schema_migrations/20190531153110
deleted file mode 100644
index ad1d33ddbd7..00000000000
--- a/db/schema_migrations/20190531153110
+++ /dev/null
@@ -1 +0,0 @@
-afcab81b5e162ef24ae02d53be845816043fa75eaf13c6330982b53a575849ce \ No newline at end of file
diff --git a/db/schema_migrations/20190602014139 b/db/schema_migrations/20190602014139
deleted file mode 100644
index cb6573f068e..00000000000
--- a/db/schema_migrations/20190602014139
+++ /dev/null
@@ -1 +0,0 @@
-aa6fd9356f8b8d2e002c97b3b3592e73d6b0dd146b20ad4703fa9f4a43b6cbec \ No newline at end of file
diff --git a/db/schema_migrations/20190603124955 b/db/schema_migrations/20190603124955
deleted file mode 100644
index af9f93d017f..00000000000
--- a/db/schema_migrations/20190603124955
+++ /dev/null
@@ -1 +0,0 @@
-ee146a0cce8acfde0f89b7fce8480474f2df9de028c7736f4cd4690ffb5c075a \ No newline at end of file
diff --git a/db/schema_migrations/20190604091310 b/db/schema_migrations/20190604091310
deleted file mode 100644
index 2d367af3872..00000000000
--- a/db/schema_migrations/20190604091310
+++ /dev/null
@@ -1 +0,0 @@
-504a65f9efc57883172fdcb59b738e8fcd1c2cf580c604a520a84ec922b4d105 \ No newline at end of file
diff --git a/db/schema_migrations/20190604184643 b/db/schema_migrations/20190604184643
deleted file mode 100644
index acf6af1d4ce..00000000000
--- a/db/schema_migrations/20190604184643
+++ /dev/null
@@ -1 +0,0 @@
-dc03c37f956fbd004ca336e705038f220fe5a02a46feeeca8d63e80f2fe6cb8a \ No newline at end of file
diff --git a/db/schema_migrations/20190605104727 b/db/schema_migrations/20190605104727
deleted file mode 100644
index 9f1323a9815..00000000000
--- a/db/schema_migrations/20190605104727
+++ /dev/null
@@ -1 +0,0 @@
-37497e9cc9185acebe62e9ea24898e37224917af6d0e93e381edc0d9631d53a4 \ No newline at end of file
diff --git a/db/schema_migrations/20190605184422 b/db/schema_migrations/20190605184422
deleted file mode 100644
index 4993d5f9ebb..00000000000
--- a/db/schema_migrations/20190605184422
+++ /dev/null
@@ -1 +0,0 @@
-0fb5e9c6bdaf8e2acb2c9c8a63100f5663aa671f62e07fa33fe99edbce85fcb9 \ No newline at end of file
diff --git a/db/schema_migrations/20190606014128 b/db/schema_migrations/20190606014128
deleted file mode 100644
index d4a92366e61..00000000000
--- a/db/schema_migrations/20190606014128
+++ /dev/null
@@ -1 +0,0 @@
-cb1b1b375fb69e3c6f33d3e696f4ef785452573935c5a96243f13ecab5a187a3 \ No newline at end of file
diff --git a/db/schema_migrations/20190606034427 b/db/schema_migrations/20190606034427
deleted file mode 100644
index a4951e638c6..00000000000
--- a/db/schema_migrations/20190606034427
+++ /dev/null
@@ -1 +0,0 @@
-f3e40533908868437f317a963038178cb0a04c7b6b1abfb8dd6d0ae169a9a209 \ No newline at end of file
diff --git a/db/schema_migrations/20190606054649 b/db/schema_migrations/20190606054649
deleted file mode 100644
index 67a626f8452..00000000000
--- a/db/schema_migrations/20190606054649
+++ /dev/null
@@ -1 +0,0 @@
-1bafcb781a7d8cd16f5526e9a8f5e3f0c7dd17de9d5595c32453d2c009673c0a \ No newline at end of file
diff --git a/db/schema_migrations/20190606054742 b/db/schema_migrations/20190606054742
deleted file mode 100644
index 23d4b29bb90..00000000000
--- a/db/schema_migrations/20190606054742
+++ /dev/null
@@ -1 +0,0 @@
-22640305aae7467ce244b1a9225de5cbc90db787b1baa277f991350e21a85108 \ No newline at end of file
diff --git a/db/schema_migrations/20190606054832 b/db/schema_migrations/20190606054832
deleted file mode 100644
index e41d65512e6..00000000000
--- a/db/schema_migrations/20190606054832
+++ /dev/null
@@ -1 +0,0 @@
-3c79d8f1867480104fd4c29affd02095202e4d39922482be82914a072a5f02e7 \ No newline at end of file
diff --git a/db/schema_migrations/20190606163724 b/db/schema_migrations/20190606163724
deleted file mode 100644
index a003d9dd3ef..00000000000
--- a/db/schema_migrations/20190606163724
+++ /dev/null
@@ -1 +0,0 @@
-52342ab4e26e39ca4682d8f3ee731617de051b3029ce5a7d97b7bf5a50a124d5 \ No newline at end of file
diff --git a/db/schema_migrations/20190606175050 b/db/schema_migrations/20190606175050
deleted file mode 100644
index 43a2f6c3de1..00000000000
--- a/db/schema_migrations/20190606175050
+++ /dev/null
@@ -1 +0,0 @@
-1ecf4228ce976c3f233e13aa6868e43d6d5104d0e8a479abc74f857a6d9cafce \ No newline at end of file
diff --git a/db/schema_migrations/20190606202100 b/db/schema_migrations/20190606202100
deleted file mode 100644
index 6d4b870bcf0..00000000000
--- a/db/schema_migrations/20190606202100
+++ /dev/null
@@ -1 +0,0 @@
-f83d5d357ecb172e9ea9456d8d4209c42c124db075f05207e81dd33cfef2f5c3 \ No newline at end of file
diff --git a/db/schema_migrations/20190607085356 b/db/schema_migrations/20190607085356
deleted file mode 100644
index 403f450b009..00000000000
--- a/db/schema_migrations/20190607085356
+++ /dev/null
@@ -1 +0,0 @@
-03a357ec9004e70efa1f93f79e21045219518901e245fa75fb8b943aca92725e \ No newline at end of file
diff --git a/db/schema_migrations/20190607145325 b/db/schema_migrations/20190607145325
deleted file mode 100644
index ced928bf8d1..00000000000
--- a/db/schema_migrations/20190607145325
+++ /dev/null
@@ -1 +0,0 @@
-db85869c90ab5ab42a18b4d2e82bdd86957b32ef3e433715a89c14091b7d0616 \ No newline at end of file
diff --git a/db/schema_migrations/20190607190856 b/db/schema_migrations/20190607190856
deleted file mode 100644
index 9a56d9d4dfd..00000000000
--- a/db/schema_migrations/20190607190856
+++ /dev/null
@@ -1 +0,0 @@
-d63160a517e26c56e72f6c08557af6a7e1798306bfa8fc8b552b86e0343cdb26 \ No newline at end of file
diff --git a/db/schema_migrations/20190607205656 b/db/schema_migrations/20190607205656
deleted file mode 100644
index a63622f3ea2..00000000000
--- a/db/schema_migrations/20190607205656
+++ /dev/null
@@ -1 +0,0 @@
-5bafb21d8d5b4651a1bae9e9dd184b4e4ac99a179068d1bc117b97f1c83a9796 \ No newline at end of file
diff --git a/db/schema_migrations/20190610142825 b/db/schema_migrations/20190610142825
deleted file mode 100644
index 56c1833bd44..00000000000
--- a/db/schema_migrations/20190610142825
+++ /dev/null
@@ -1 +0,0 @@
-e1834da62fe919f9d93b80c97319266a4494f1a14833f7be6637a562591f6236 \ No newline at end of file
diff --git a/db/schema_migrations/20190611090827 b/db/schema_migrations/20190611090827
deleted file mode 100644
index b13743f7b66..00000000000
--- a/db/schema_migrations/20190611090827
+++ /dev/null
@@ -1 +0,0 @@
-39cd7fa15659e7afcda7e59599e2b971c56fd5097105bbd4bf99c92ada398b99 \ No newline at end of file
diff --git a/db/schema_migrations/20190611100201 b/db/schema_migrations/20190611100201
deleted file mode 100644
index bd94fb72901..00000000000
--- a/db/schema_migrations/20190611100201
+++ /dev/null
@@ -1 +0,0 @@
-d23880fd9f984318f91f4f27136a90c23659c14983d2fc59402372121ec632a9 \ No newline at end of file
diff --git a/db/schema_migrations/20190611100202 b/db/schema_migrations/20190611100202
deleted file mode 100644
index 1d72fc158d2..00000000000
--- a/db/schema_migrations/20190611100202
+++ /dev/null
@@ -1 +0,0 @@
-45c181d994822f92a984fc5d51c40db4a813e5eb083979114d2be0dc46e5fb4b \ No newline at end of file
diff --git a/db/schema_migrations/20190611161641 b/db/schema_migrations/20190611161641
deleted file mode 100644
index 6e84592f40e..00000000000
--- a/db/schema_migrations/20190611161641
+++ /dev/null
@@ -1 +0,0 @@
-0de36ee37bc4e7e0a53cefb3a254e0b7445fc26b394f5b0fe0ffff0e225994e4 \ No newline at end of file
diff --git a/db/schema_migrations/20190611161642 b/db/schema_migrations/20190611161642
deleted file mode 100644
index 2a2f41e8337..00000000000
--- a/db/schema_migrations/20190611161642
+++ /dev/null
@@ -1 +0,0 @@
-d91a41584d6deb62a4c3884a9bf8df290fd232593d330b1332f8a34873a6ea00 \ No newline at end of file
diff --git a/db/schema_migrations/20190612111201 b/db/schema_migrations/20190612111201
deleted file mode 100644
index 3cb0deb644f..00000000000
--- a/db/schema_migrations/20190612111201
+++ /dev/null
@@ -1 +0,0 @@
-998cc01599f4ce7e3544e1551ec238ee53d15e226f5a5dec0920d7bd04031105 \ No newline at end of file
diff --git a/db/schema_migrations/20190612111404 b/db/schema_migrations/20190612111404
deleted file mode 100644
index b6e7b3d3548..00000000000
--- a/db/schema_migrations/20190612111404
+++ /dev/null
@@ -1 +0,0 @@
-2f2a8d4bc77d1e67c5625acc6a9482a07147bf0620ecd17dc71ad543b97b66b3 \ No newline at end of file
diff --git a/db/schema_migrations/20190613030606 b/db/schema_migrations/20190613030606
deleted file mode 100644
index 560a9393d1f..00000000000
--- a/db/schema_migrations/20190613030606
+++ /dev/null
@@ -1 +0,0 @@
-ebdd40a0903fbdf8826dbf9ab1d995cb4aefc336c8adbc8a2d1dbb07418aa48e \ No newline at end of file
diff --git a/db/schema_migrations/20190613044655 b/db/schema_migrations/20190613044655
deleted file mode 100644
index c7cbd43115b..00000000000
--- a/db/schema_migrations/20190613044655
+++ /dev/null
@@ -1 +0,0 @@
-ed2a16e4096acb1476cf452245abe37e3fe11ccfbf8f84dbbf56be3c80238e80 \ No newline at end of file
diff --git a/db/schema_migrations/20190613073003 b/db/schema_migrations/20190613073003
deleted file mode 100644
index 451d6ab7b6e..00000000000
--- a/db/schema_migrations/20190613073003
+++ /dev/null
@@ -1 +0,0 @@
-9d6603760854e72c812894c1290ad6cb4067c2145fe5bdfa0c4d971398db409b \ No newline at end of file
diff --git a/db/schema_migrations/20190613231640 b/db/schema_migrations/20190613231640
deleted file mode 100644
index e9ea84f27b8..00000000000
--- a/db/schema_migrations/20190613231640
+++ /dev/null
@@ -1 +0,0 @@
-32914670dedaddceeba21519343deb11dc79b027b491e2ecf9566874f0794e2e \ No newline at end of file
diff --git a/db/schema_migrations/20190617123615 b/db/schema_migrations/20190617123615
deleted file mode 100644
index c5c7053d51f..00000000000
--- a/db/schema_migrations/20190617123615
+++ /dev/null
@@ -1 +0,0 @@
-e4497740a3f33e37b2ed14bc9f3b67a29af91cdcdc40c44ac6ef896047957046 \ No newline at end of file
diff --git a/db/schema_migrations/20190618171120 b/db/schema_migrations/20190618171120
deleted file mode 100644
index 6c28a884641..00000000000
--- a/db/schema_migrations/20190618171120
+++ /dev/null
@@ -1 +0,0 @@
-a41ac00d0dbb71e23e224e5cddf65891efb83167fdeef2568f10420e6362c794 \ No newline at end of file
diff --git a/db/schema_migrations/20190619175843 b/db/schema_migrations/20190619175843
deleted file mode 100644
index 142d694f58a..00000000000
--- a/db/schema_migrations/20190619175843
+++ /dev/null
@@ -1 +0,0 @@
-2e08e7f7493f2feecf4029bb788b0f6a113ee83f44fd8437e9903f5c5b62e7d0 \ No newline at end of file
diff --git a/db/schema_migrations/20190620105427 b/db/schema_migrations/20190620105427
deleted file mode 100644
index 54106d8dfae..00000000000
--- a/db/schema_migrations/20190620105427
+++ /dev/null
@@ -1 +0,0 @@
-5689bf2f5dcc2464fcb0361c69c8d0a17d7bc2d2c3af88ac80644374c9210311 \ No newline at end of file
diff --git a/db/schema_migrations/20190620112608 b/db/schema_migrations/20190620112608
deleted file mode 100644
index d78c1abb550..00000000000
--- a/db/schema_migrations/20190620112608
+++ /dev/null
@@ -1 +0,0 @@
-19738810877e1177df13681f77ec0d05d3124ca6ffc862829883f9f1995557e7 \ No newline at end of file
diff --git a/db/schema_migrations/20190621022810 b/db/schema_migrations/20190621022810
deleted file mode 100644
index ff2949806c4..00000000000
--- a/db/schema_migrations/20190621022810
+++ /dev/null
@@ -1 +0,0 @@
-d55d3175690df242a19cd25ba2d78cb3ddd5a35d095fe354ff20b7977b09eaf3 \ No newline at end of file
diff --git a/db/schema_migrations/20190621151636 b/db/schema_migrations/20190621151636
deleted file mode 100644
index 2046ae116ab..00000000000
--- a/db/schema_migrations/20190621151636
+++ /dev/null
@@ -1 +0,0 @@
-4759b161afb94a5b1eb951fd2a874a4c5b7e53cec7c4fbf6a7292ed2d8e8dabc \ No newline at end of file
diff --git a/db/schema_migrations/20190623212503 b/db/schema_migrations/20190623212503
deleted file mode 100644
index 64ff254fce2..00000000000
--- a/db/schema_migrations/20190623212503
+++ /dev/null
@@ -1 +0,0 @@
-98ceb8452ec3c1c9d16096e567b5d3046c9403d643da555647be73343cdfe9ed \ No newline at end of file
diff --git a/db/schema_migrations/20190624123615 b/db/schema_migrations/20190624123615
deleted file mode 100644
index 1e59eed250c..00000000000
--- a/db/schema_migrations/20190624123615
+++ /dev/null
@@ -1 +0,0 @@
-52674a8e27d46622259c99099faf88fc409691b1e67ce9c6ae728ab29435a6e7 \ No newline at end of file
diff --git a/db/schema_migrations/20190625115224 b/db/schema_migrations/20190625115224
deleted file mode 100644
index 1090694684e..00000000000
--- a/db/schema_migrations/20190625115224
+++ /dev/null
@@ -1 +0,0 @@
-bf4ea807b92c5f82d1c2e2c8acf6c269484931540b8b24618dd44aed2d3a45a0 \ No newline at end of file
diff --git a/db/schema_migrations/20190625184066 b/db/schema_migrations/20190625184066
deleted file mode 100644
index 3f76b9ccf17..00000000000
--- a/db/schema_migrations/20190625184066
+++ /dev/null
@@ -1 +0,0 @@
-b79a009d180b2faee8795eddcd855b3080e2716bb0ac153f2031f33044cd4c09 \ No newline at end of file
diff --git a/db/schema_migrations/20190626175626 b/db/schema_migrations/20190626175626
deleted file mode 100644
index 33ba2c9fe7d..00000000000
--- a/db/schema_migrations/20190626175626
+++ /dev/null
@@ -1 +0,0 @@
-088a3fa51ef2a41ef11b38d9bb311494ce30645cb679dadffeeacca56e81bd71 \ No newline at end of file
diff --git a/db/schema_migrations/20190627051902 b/db/schema_migrations/20190627051902
deleted file mode 100644
index fb66a2de0a5..00000000000
--- a/db/schema_migrations/20190627051902
+++ /dev/null
@@ -1 +0,0 @@
-67fd84ab0a4fc8ec401149888d4820c620615931d56fa7d2a777b680981f74b8 \ No newline at end of file
diff --git a/db/schema_migrations/20190627100221 b/db/schema_migrations/20190627100221
deleted file mode 100644
index 48c9d783a84..00000000000
--- a/db/schema_migrations/20190627100221
+++ /dev/null
@@ -1 +0,0 @@
-46fe4606e6a33a991a46ee06bf65ee104369ab414f87d40cc24c15005f09d9ac \ No newline at end of file
diff --git a/db/schema_migrations/20190627122264 b/db/schema_migrations/20190627122264
deleted file mode 100644
index 4f752116ea8..00000000000
--- a/db/schema_migrations/20190627122264
+++ /dev/null
@@ -1 +0,0 @@
-2b1c45ada63a90fc8259104c1870a4fe707bf80470c628fb1ed91801e54e5bb1 \ No newline at end of file
diff --git a/db/schema_migrations/20190628145246 b/db/schema_migrations/20190628145246
deleted file mode 100644
index fe1f29883f6..00000000000
--- a/db/schema_migrations/20190628145246
+++ /dev/null
@@ -1 +0,0 @@
-552d4f6f10e75fbf2c8a5a20bc4199c464b2aa028fc9553fa062e4c5430d36ef \ No newline at end of file
diff --git a/db/schema_migrations/20190628185000 b/db/schema_migrations/20190628185000
deleted file mode 100644
index 297cd00076f..00000000000
--- a/db/schema_migrations/20190628185000
+++ /dev/null
@@ -1 +0,0 @@
-7988202164669a5307bc53994083959c272b21c1e33657c88ea43223019298f0 \ No newline at end of file
diff --git a/db/schema_migrations/20190628185004 b/db/schema_migrations/20190628185004
deleted file mode 100644
index 15fc93dc8b1..00000000000
--- a/db/schema_migrations/20190628185004
+++ /dev/null
@@ -1 +0,0 @@
-4b2f0f82eab6b1ed3523bfa0ac56593de05cd0512fc43df028dad7006ab4f14f \ No newline at end of file
diff --git a/db/schema_migrations/20190628191740 b/db/schema_migrations/20190628191740
deleted file mode 100644
index fb4201ffd5e..00000000000
--- a/db/schema_migrations/20190628191740
+++ /dev/null
@@ -1 +0,0 @@
-22dbdd0dcbfc2697655eebc5dea4c749f31484b2660e5ef42b790bfcd6ff5b8c \ No newline at end of file
diff --git a/db/schema_migrations/20190702173936 b/db/schema_migrations/20190702173936
deleted file mode 100644
index 1f6d5fb59b6..00000000000
--- a/db/schema_migrations/20190702173936
+++ /dev/null
@@ -1 +0,0 @@
-a4a25def014aadc4d0883589e2823d0840e982bbc0ec6427d87815ddc37597e2 \ No newline at end of file
diff --git a/db/schema_migrations/20190703043358 b/db/schema_migrations/20190703043358
deleted file mode 100644
index ec5451e142d..00000000000
--- a/db/schema_migrations/20190703043358
+++ /dev/null
@@ -1 +0,0 @@
-39b8a683bf81dbddbe67d4cf9f35557d9218c7fa44d1f203b8efe83e361d3782 \ No newline at end of file
diff --git a/db/schema_migrations/20190703130053 b/db/schema_migrations/20190703130053
deleted file mode 100644
index 05c495065d8..00000000000
--- a/db/schema_migrations/20190703130053
+++ /dev/null
@@ -1 +0,0 @@
-2702394a2b0097580a88aca4f65804abf64a17cc1032c9a641800ddcb68f9c27 \ No newline at end of file
diff --git a/db/schema_migrations/20190703171157 b/db/schema_migrations/20190703171157
deleted file mode 100644
index 62a40205ba9..00000000000
--- a/db/schema_migrations/20190703171157
+++ /dev/null
@@ -1 +0,0 @@
-25d3eaf8e02bc7abaaf5f85289e2d1767429c7584bdf184b269f3ce8283b6b74 \ No newline at end of file
diff --git a/db/schema_migrations/20190703171555 b/db/schema_migrations/20190703171555
deleted file mode 100644
index a9a5d063008..00000000000
--- a/db/schema_migrations/20190703171555
+++ /dev/null
@@ -1 +0,0 @@
-01f022814b8d35c357b4b39cfa19fa087c69ea95ca19fe278f2c795b78169aa2 \ No newline at end of file
diff --git a/db/schema_migrations/20190703185326 b/db/schema_migrations/20190703185326
deleted file mode 100644
index f5cddad84ea..00000000000
--- a/db/schema_migrations/20190703185326
+++ /dev/null
@@ -1 +0,0 @@
-1d5c623de91ba7a646512ce08c0ea0e2d00b42d30bd772d719c15b650c6b9c1a \ No newline at end of file
diff --git a/db/schema_migrations/20190709204413 b/db/schema_migrations/20190709204413
deleted file mode 100644
index 7dd1600979b..00000000000
--- a/db/schema_migrations/20190709204413
+++ /dev/null
@@ -1 +0,0 @@
-2ca41cf6eaca8493cc8ac70f418ce7b8b3cbb66e5160d82563735adeab0d1a60 \ No newline at end of file
diff --git a/db/schema_migrations/20190709220014 b/db/schema_migrations/20190709220014
deleted file mode 100644
index bbc2215a244..00000000000
--- a/db/schema_migrations/20190709220014
+++ /dev/null
@@ -1 +0,0 @@
-1853add73d46169890cfffeaf55037b31a740398b985e4d9491b5ee8f7053114 \ No newline at end of file
diff --git a/db/schema_migrations/20190709220143 b/db/schema_migrations/20190709220143
deleted file mode 100644
index 3761bb2375a..00000000000
--- a/db/schema_migrations/20190709220143
+++ /dev/null
@@ -1 +0,0 @@
-0908df76b1f54196780e0f2327593d192ba2ff28e15502e478dfd5ca45a25ef8 \ No newline at end of file
diff --git a/db/schema_migrations/20190710151229 b/db/schema_migrations/20190710151229
deleted file mode 100644
index 9385ba6155b..00000000000
--- a/db/schema_migrations/20190710151229
+++ /dev/null
@@ -1 +0,0 @@
-3f38687fa0c3d0c37531561c621ef4e6d7985f6ae189bda9dab8f10e445dbc4e \ No newline at end of file
diff --git a/db/schema_migrations/20190711124721 b/db/schema_migrations/20190711124721
deleted file mode 100644
index 6b475f6b805..00000000000
--- a/db/schema_migrations/20190711124721
+++ /dev/null
@@ -1 +0,0 @@
-daf93c9d8381ff4cbbd048e50080d11ecc495ad7ac24b6ea3729e2b7de4aa39c \ No newline at end of file
diff --git a/db/schema_migrations/20190711200053 b/db/schema_migrations/20190711200053
deleted file mode 100644
index 1933550163e..00000000000
--- a/db/schema_migrations/20190711200053
+++ /dev/null
@@ -1 +0,0 @@
-ab0ac0911f2fb21b8ff9b890c2f630810391db5c0abc26dce27c83ad7638a063 \ No newline at end of file
diff --git a/db/schema_migrations/20190711200508 b/db/schema_migrations/20190711200508
deleted file mode 100644
index 8fabc5e81ad..00000000000
--- a/db/schema_migrations/20190711200508
+++ /dev/null
@@ -1 +0,0 @@
-2cfb7874cbd4f2e0ce7e3f38d86e24eaadabf12719bafc2fda42b8d9d98e6aa8 \ No newline at end of file
diff --git a/db/schema_migrations/20190711201818 b/db/schema_migrations/20190711201818
deleted file mode 100644
index c029b259c5e..00000000000
--- a/db/schema_migrations/20190711201818
+++ /dev/null
@@ -1 +0,0 @@
-2058573396bf9a04e3d3524477431c88d6bcd55eca011e785d9cc02e67c4a9e9 \ No newline at end of file
diff --git a/db/schema_migrations/20190712040400 b/db/schema_migrations/20190712040400
deleted file mode 100644
index f4dce5ca733..00000000000
--- a/db/schema_migrations/20190712040400
+++ /dev/null
@@ -1 +0,0 @@
-e2459e4cfb50e8b0cf16248ae12a83ced625c6428737500c32c22d6b94bcec26 \ No newline at end of file
diff --git a/db/schema_migrations/20190712040412 b/db/schema_migrations/20190712040412
deleted file mode 100644
index e8a1a848c77..00000000000
--- a/db/schema_migrations/20190712040412
+++ /dev/null
@@ -1 +0,0 @@
-b054916f4986988b9285f0b651d75c1c7c120a83faf2efe9c1a30e3661736e17 \ No newline at end of file
diff --git a/db/schema_migrations/20190712064021 b/db/schema_migrations/20190712064021
deleted file mode 100644
index d5bcd7c3f49..00000000000
--- a/db/schema_migrations/20190712064021
+++ /dev/null
@@ -1 +0,0 @@
-8f94e963eb8a422b2327736a8072bb9d5104e7cf941d11de3136125e2df297bf \ No newline at end of file
diff --git a/db/schema_migrations/20190715042813 b/db/schema_migrations/20190715042813
deleted file mode 100644
index ab2e27a8be9..00000000000
--- a/db/schema_migrations/20190715042813
+++ /dev/null
@@ -1 +0,0 @@
-0b44983f3ded88843f2477cc6d0b279d6c2168f0d49f5df30fb8a7abb3aa1ef1 \ No newline at end of file
diff --git a/db/schema_migrations/20190715043944 b/db/schema_migrations/20190715043944
deleted file mode 100644
index f63601b4568..00000000000
--- a/db/schema_migrations/20190715043944
+++ /dev/null
@@ -1 +0,0 @@
-fbeac311a26b199ea3c98b5d0bbc6be4708a7e56edf0144089ccc72a2694f2eb \ No newline at end of file
diff --git a/db/schema_migrations/20190715043954 b/db/schema_migrations/20190715043954
deleted file mode 100644
index f03e6304658..00000000000
--- a/db/schema_migrations/20190715043954
+++ /dev/null
@@ -1 +0,0 @@
-f83c6fbc1d29fb4df1cbe78bbab07f28e9fac1c7a61aa29ee156a0329099437e \ No newline at end of file
diff --git a/db/schema_migrations/20190715044501 b/db/schema_migrations/20190715044501
deleted file mode 100644
index a98712a26c4..00000000000
--- a/db/schema_migrations/20190715044501
+++ /dev/null
@@ -1 +0,0 @@
-8601344d3a27c18c1b21ef4224174211993ad219e73708c65325ca0c1dd3f0ac \ No newline at end of file
diff --git a/db/schema_migrations/20190715114644 b/db/schema_migrations/20190715114644
deleted file mode 100644
index 8b573691440..00000000000
--- a/db/schema_migrations/20190715114644
+++ /dev/null
@@ -1 +0,0 @@
-86ee5fd36187d63f8ac246b0d7c02a4f933468b80d4dd5b2a06ed7752ce606b4 \ No newline at end of file
diff --git a/db/schema_migrations/20190715140740 b/db/schema_migrations/20190715140740
deleted file mode 100644
index b194a741ac0..00000000000
--- a/db/schema_migrations/20190715140740
+++ /dev/null
@@ -1 +0,0 @@
-8eca8127d4e3bf7d3cccd57438c29971c599141760380b04880a4085cd2bdb60 \ No newline at end of file
diff --git a/db/schema_migrations/20190715142138 b/db/schema_migrations/20190715142138
deleted file mode 100644
index ed8cca73645..00000000000
--- a/db/schema_migrations/20190715142138
+++ /dev/null
@@ -1 +0,0 @@
-fd1e1a4caf6f7904407784b817217636a8b12e4f853dd8581dc696e1e3f9cc17 \ No newline at end of file
diff --git a/db/schema_migrations/20190715173819 b/db/schema_migrations/20190715173819
deleted file mode 100644
index 3dfd6d0d578..00000000000
--- a/db/schema_migrations/20190715173819
+++ /dev/null
@@ -1 +0,0 @@
-744d01f5a73c4e53ea1116b2b6055dd7db4aa4e1a97fe4110c1a1eb276f1303d \ No newline at end of file
diff --git a/db/schema_migrations/20190715193142 b/db/schema_migrations/20190715193142
deleted file mode 100644
index e621c1ac0b5..00000000000
--- a/db/schema_migrations/20190715193142
+++ /dev/null
@@ -1 +0,0 @@
-974a811dd7cc9810d7e9717bbe1e66db89084f5661dfbb66121099a29e093c8b \ No newline at end of file
diff --git a/db/schema_migrations/20190715215532 b/db/schema_migrations/20190715215532
deleted file mode 100644
index 53eaefff77f..00000000000
--- a/db/schema_migrations/20190715215532
+++ /dev/null
@@ -1 +0,0 @@
-ca01d1d7f09ca6ec4af7b14f73f9fdfb723e9d3be85b94a121fc70803d4e97c8 \ No newline at end of file
diff --git a/db/schema_migrations/20190715215549 b/db/schema_migrations/20190715215549
deleted file mode 100644
index c1ebe3109a5..00000000000
--- a/db/schema_migrations/20190715215549
+++ /dev/null
@@ -1 +0,0 @@
-824d8dc5c0994e92ab63be2893d57244ff22bbbf4f6f281364213e3e25033a15 \ No newline at end of file
diff --git a/db/schema_migrations/20190716144222 b/db/schema_migrations/20190716144222
deleted file mode 100644
index af11d3aca6f..00000000000
--- a/db/schema_migrations/20190716144222
+++ /dev/null
@@ -1 +0,0 @@
-fb3a9f53b3ebda9cd8147faa61a6ba8a2fb9f2852e4d9c10f793ea516d270f9b \ No newline at end of file
diff --git a/db/schema_migrations/20190719122333 b/db/schema_migrations/20190719122333
deleted file mode 100644
index a263369181d..00000000000
--- a/db/schema_migrations/20190719122333
+++ /dev/null
@@ -1 +0,0 @@
-41b0974a7667bb439f115960ba63a2f99d1b747af3d3c5fac27f4fe3ebe3657b \ No newline at end of file
diff --git a/db/schema_migrations/20190719174505 b/db/schema_migrations/20190719174505
deleted file mode 100644
index c00e973c7f7..00000000000
--- a/db/schema_migrations/20190719174505
+++ /dev/null
@@ -1 +0,0 @@
-8132aa506ed7c07fa7610a20305ff9e34febf452e64fce44cd221aa16d95af55 \ No newline at end of file
diff --git a/db/schema_migrations/20190722104947 b/db/schema_migrations/20190722104947
deleted file mode 100644
index df8fb24c556..00000000000
--- a/db/schema_migrations/20190722104947
+++ /dev/null
@@ -1 +0,0 @@
-383b7f623b7ab9496a521a75d83e14af1c8bb5b133494410dda24be8144ed8a4 \ No newline at end of file
diff --git a/db/schema_migrations/20190722132830 b/db/schema_migrations/20190722132830
deleted file mode 100644
index 99dd27a2042..00000000000
--- a/db/schema_migrations/20190722132830
+++ /dev/null
@@ -1 +0,0 @@
-1fdd66556bdf081a09090f9f790142000c22e9402edc67efcdc25806fac5b9cf \ No newline at end of file
diff --git a/db/schema_migrations/20190722144316 b/db/schema_migrations/20190722144316
deleted file mode 100644
index 5a5f5a5839b..00000000000
--- a/db/schema_migrations/20190722144316
+++ /dev/null
@@ -1 +0,0 @@
-1fa269a8ec548e937b04b11fc0bcae7c77c2d1f257ae37d1263573fc9ec6f8cd \ No newline at end of file
diff --git a/db/schema_migrations/20190723105753 b/db/schema_migrations/20190723105753
deleted file mode 100644
index 65401154db6..00000000000
--- a/db/schema_migrations/20190723105753
+++ /dev/null
@@ -1 +0,0 @@
-fd00e121f2e97645fd660a5fadd17d4811faff70bbf966b3333aebd118d1a66e \ No newline at end of file
diff --git a/db/schema_migrations/20190723153247 b/db/schema_migrations/20190723153247
deleted file mode 100644
index caeecf37f87..00000000000
--- a/db/schema_migrations/20190723153247
+++ /dev/null
@@ -1 +0,0 @@
-d4ac849cdd37d734afb3c74baad0ea8833a7a0f1fa607fc1f6c649ee67f9ca8c \ No newline at end of file
diff --git a/db/schema_migrations/20190724112147 b/db/schema_migrations/20190724112147
deleted file mode 100644
index b0913c59a08..00000000000
--- a/db/schema_migrations/20190724112147
+++ /dev/null
@@ -1 +0,0 @@
-283a81dc204445d16db191facf3d92e5d67ad3ff5fa89448f998a52ddc48e9b3 \ No newline at end of file
diff --git a/db/schema_migrations/20190725012225 b/db/schema_migrations/20190725012225
deleted file mode 100644
index 42a307bc49f..00000000000
--- a/db/schema_migrations/20190725012225
+++ /dev/null
@@ -1 +0,0 @@
-180b6a3e2a9bf2d07d7edb47db9b6be0f144936649471de4c60c106e64b39d3f \ No newline at end of file
diff --git a/db/schema_migrations/20190725080128 b/db/schema_migrations/20190725080128
deleted file mode 100644
index 3231fafb244..00000000000
--- a/db/schema_migrations/20190725080128
+++ /dev/null
@@ -1 +0,0 @@
-f187c16f5f27d9fef62ad9186f839dda677ab0406b465f1b16cc01134cc35d7e \ No newline at end of file
diff --git a/db/schema_migrations/20190725183432 b/db/schema_migrations/20190725183432
deleted file mode 100644
index 0a18c88c8b0..00000000000
--- a/db/schema_migrations/20190725183432
+++ /dev/null
@@ -1 +0,0 @@
-3ea3bc4b03f5ee23e8864fa23aa2ee91eb30355246bd3f344711d06c97bfd89d \ No newline at end of file
diff --git a/db/schema_migrations/20190726101050 b/db/schema_migrations/20190726101050
deleted file mode 100644
index 20aab312c87..00000000000
--- a/db/schema_migrations/20190726101050
+++ /dev/null
@@ -1 +0,0 @@
-c1f602171c71e02dd6ba7ce9a949414f71839e518a41f4d179e164a7870f49c9 \ No newline at end of file
diff --git a/db/schema_migrations/20190726101133 b/db/schema_migrations/20190726101133
deleted file mode 100644
index 23462dcd446..00000000000
--- a/db/schema_migrations/20190726101133
+++ /dev/null
@@ -1 +0,0 @@
-2f9887af666d0e9d256d7f0c1526194d5a1af7238e57a57c1f11d05928039785 \ No newline at end of file
diff --git a/db/schema_migrations/20190729062536 b/db/schema_migrations/20190729062536
deleted file mode 100644
index 7b177f8768e..00000000000
--- a/db/schema_migrations/20190729062536
+++ /dev/null
@@ -1 +0,0 @@
-33eab679fd572d55ac8b6363c821b9c94b127f16ec32275dd08a987e4e9bec35 \ No newline at end of file
diff --git a/db/schema_migrations/20190729090456 b/db/schema_migrations/20190729090456
deleted file mode 100644
index fbee008c83f..00000000000
--- a/db/schema_migrations/20190729090456
+++ /dev/null
@@ -1 +0,0 @@
-6aa639ff412dee0c1b78224950f30935d8fcbceddc44f199dc2cba29ad1bb131 \ No newline at end of file
diff --git a/db/schema_migrations/20190729180447 b/db/schema_migrations/20190729180447
deleted file mode 100644
index 776a6dafd9b..00000000000
--- a/db/schema_migrations/20190729180447
+++ /dev/null
@@ -1 +0,0 @@
-7603148a9b9909e0ce6239add43b47627f47f3c7c42a0a57d98a710343ecf221 \ No newline at end of file
diff --git a/db/schema_migrations/20190731084415 b/db/schema_migrations/20190731084415
deleted file mode 100644
index 9c5c8cc24d8..00000000000
--- a/db/schema_migrations/20190731084415
+++ /dev/null
@@ -1 +0,0 @@
-ef924cafda1ed0db2c8dd5015b1c191db9607353bb75d7997e7bc6bd77a932b3 \ No newline at end of file
diff --git a/db/schema_migrations/20190801060809 b/db/schema_migrations/20190801060809
deleted file mode 100644
index 45a57d75919..00000000000
--- a/db/schema_migrations/20190801060809
+++ /dev/null
@@ -1 +0,0 @@
-4f68ea061fc5db2b6ffe0178400277a294aa66f5391cea57e5939064b18d2437 \ No newline at end of file
diff --git a/db/schema_migrations/20190801114109 b/db/schema_migrations/20190801114109
deleted file mode 100644
index 0652f1f6da0..00000000000
--- a/db/schema_migrations/20190801114109
+++ /dev/null
@@ -1 +0,0 @@
-4994a44a4138487988226173a7244e23ca6f02dead34e5f644ebe98e4545b386 \ No newline at end of file
diff --git a/db/schema_migrations/20190801142441 b/db/schema_migrations/20190801142441
deleted file mode 100644
index 9d783f2cf5b..00000000000
--- a/db/schema_migrations/20190801142441
+++ /dev/null
@@ -1 +0,0 @@
-d2719026b340b4e2272d6a45d19c3cf4887bc1fd8c1b6354cfb3386e69f01752 \ No newline at end of file
diff --git a/db/schema_migrations/20190801193427 b/db/schema_migrations/20190801193427
deleted file mode 100644
index fbdb3ba1aaa..00000000000
--- a/db/schema_migrations/20190801193427
+++ /dev/null
@@ -1 +0,0 @@
-7a90f907ae9813ed6dadc5689155177a7985e714f98d193d52b052049497284f \ No newline at end of file
diff --git a/db/schema_migrations/20190802012622 b/db/schema_migrations/20190802012622
deleted file mode 100644
index 270b1eea497..00000000000
--- a/db/schema_migrations/20190802012622
+++ /dev/null
@@ -1 +0,0 @@
-9cdfaa5c3e062f5f90ea580d825583b3d50f09e0750af87aee79f6e2f3480731 \ No newline at end of file
diff --git a/db/schema_migrations/20190802091750 b/db/schema_migrations/20190802091750
deleted file mode 100644
index a22ea316bc7..00000000000
--- a/db/schema_migrations/20190802091750
+++ /dev/null
@@ -1 +0,0 @@
-4f0f1e92ae75588cd2c6c0374907fbf5809f942d07342da8ff264a10a76dd68a \ No newline at end of file
diff --git a/db/schema_migrations/20190802195602 b/db/schema_migrations/20190802195602
deleted file mode 100644
index 7529973918a..00000000000
--- a/db/schema_migrations/20190802195602
+++ /dev/null
@@ -1 +0,0 @@
-c868cca470f2ab73419cb1e44a4bfd6a1e1f45f2c45d69066d305aaffd0ade30 \ No newline at end of file
diff --git a/db/schema_migrations/20190802235445 b/db/schema_migrations/20190802235445
deleted file mode 100644
index bb75868843f..00000000000
--- a/db/schema_migrations/20190802235445
+++ /dev/null
@@ -1 +0,0 @@
-b1051ef820cff1f920d6df527fd79b7a922d4b3fc840670b91ffe8cf36f61407 \ No newline at end of file
diff --git a/db/schema_migrations/20190805140353 b/db/schema_migrations/20190805140353
deleted file mode 100644
index 4d80ef8f4f2..00000000000
--- a/db/schema_migrations/20190805140353
+++ /dev/null
@@ -1 +0,0 @@
-4181ee5e466d8efd90127bcdde2f072c4c75173e612e8496e2ee767e4f64c97e \ No newline at end of file
diff --git a/db/schema_migrations/20190806071559 b/db/schema_migrations/20190806071559
deleted file mode 100644
index c9e382a679b..00000000000
--- a/db/schema_migrations/20190806071559
+++ /dev/null
@@ -1 +0,0 @@
-eb0ddb4065ab724d820a89350052ed694c08a8e98e235c32ea72fbae915330bb \ No newline at end of file
diff --git a/db/schema_migrations/20190807023052 b/db/schema_migrations/20190807023052
deleted file mode 100644
index 9b5cd4b50f3..00000000000
--- a/db/schema_migrations/20190807023052
+++ /dev/null
@@ -1 +0,0 @@
-9a728799a6877d4d0d889846e80dd92448ff0f96bfb2e85eddd31dbbf213c1ac \ No newline at end of file
diff --git a/db/schema_migrations/20190808152507 b/db/schema_migrations/20190808152507
deleted file mode 100644
index e8a4130067a..00000000000
--- a/db/schema_migrations/20190808152507
+++ /dev/null
@@ -1 +0,0 @@
-3caa0d7f3abfaae8602ae0ef9f34987f8135b0612be5be730248b4eafeec65a2 \ No newline at end of file
diff --git a/db/schema_migrations/20190809072552 b/db/schema_migrations/20190809072552
deleted file mode 100644
index cc3ed4b3580..00000000000
--- a/db/schema_migrations/20190809072552
+++ /dev/null
@@ -1 +0,0 @@
-3cfffb7434a171017f6fe634a67e096ab6d52dca9a7137a326f69f294b55d76b \ No newline at end of file
diff --git a/db/schema_migrations/20190812070645 b/db/schema_migrations/20190812070645
deleted file mode 100644
index fed7d32cc77..00000000000
--- a/db/schema_migrations/20190812070645
+++ /dev/null
@@ -1 +0,0 @@
-78b4dc9862419faf4868edf2895587e6e86f18c3d04b45c81950faa9f200820d \ No newline at end of file
diff --git a/db/schema_migrations/20190814205640 b/db/schema_migrations/20190814205640
deleted file mode 100644
index 5926d6ad382..00000000000
--- a/db/schema_migrations/20190814205640
+++ /dev/null
@@ -1 +0,0 @@
-5c6476a11648e962ab12abd61670ea4af6c19780150ec4afb5e28200d7d2b8d4 \ No newline at end of file
diff --git a/db/schema_migrations/20190815093936 b/db/schema_migrations/20190815093936
deleted file mode 100644
index 21427de8945..00000000000
--- a/db/schema_migrations/20190815093936
+++ /dev/null
@@ -1 +0,0 @@
-3176385f347a7caa394e9c28f6d1db6551f3e32034bb31d02b5acf7064825745 \ No newline at end of file
diff --git a/db/schema_migrations/20190815093949 b/db/schema_migrations/20190815093949
deleted file mode 100644
index 8d5e1a4d31d..00000000000
--- a/db/schema_migrations/20190815093949
+++ /dev/null
@@ -1 +0,0 @@
-24d0ed21332c6f5b540b51de7d1e0aa680a0802f3da51e7e6ebefad478632aea \ No newline at end of file
diff --git a/db/schema_migrations/20190816151221 b/db/schema_migrations/20190816151221
deleted file mode 100644
index 72fb221782a..00000000000
--- a/db/schema_migrations/20190816151221
+++ /dev/null
@@ -1 +0,0 @@
-7b597261d88ca69a87973d3a3cf8dd0d7428f8d9c8e33a1b341c620e7515f59c \ No newline at end of file
diff --git a/db/schema_migrations/20190819131155 b/db/schema_migrations/20190819131155
deleted file mode 100644
index 053e70f1ff8..00000000000
--- a/db/schema_migrations/20190819131155
+++ /dev/null
@@ -1 +0,0 @@
-2e73d76d728d37ab1597f7cdb049aead3b20ef8212fd813e79e1d64d56fe8265 \ No newline at end of file
diff --git a/db/schema_migrations/20190819231552 b/db/schema_migrations/20190819231552
deleted file mode 100644
index f3d32630f28..00000000000
--- a/db/schema_migrations/20190819231552
+++ /dev/null
@@ -1 +0,0 @@
-d66662f0bc2962b3e9c306647de4d173b92831c64cf374be27173da46ccf5ace \ No newline at end of file
diff --git a/db/schema_migrations/20190820163320 b/db/schema_migrations/20190820163320
deleted file mode 100644
index 93792f5895b..00000000000
--- a/db/schema_migrations/20190820163320
+++ /dev/null
@@ -1 +0,0 @@
-cba2d66103e62fe6c6d60bfe1ef6be1bcaaee6a48cdeb7bb663c5bd2dc059571 \ No newline at end of file
diff --git a/db/schema_migrations/20190821040941 b/db/schema_migrations/20190821040941
deleted file mode 100644
index 37a82ad9dbd..00000000000
--- a/db/schema_migrations/20190821040941
+++ /dev/null
@@ -1 +0,0 @@
-63240b9c28ba37dc3aa808c9cb94c80bd5556c3e718883cd07f5cbd26c877a58 \ No newline at end of file
diff --git a/db/schema_migrations/20190822175441 b/db/schema_migrations/20190822175441
deleted file mode 100644
index 9fce25dde65..00000000000
--- a/db/schema_migrations/20190822175441
+++ /dev/null
@@ -1 +0,0 @@
-7b878154bca04d4e93e3d8af4a2a4f5ee789493dfb9c06c778d2e912c75f96cc \ No newline at end of file
diff --git a/db/schema_migrations/20190822181528 b/db/schema_migrations/20190822181528
deleted file mode 100644
index 252438dbfe4..00000000000
--- a/db/schema_migrations/20190822181528
+++ /dev/null
@@ -1 +0,0 @@
-173274a98fc3ba27c1536e2d2eefc353810be6e445c35fe5e692d70f574f5a41 \ No newline at end of file
diff --git a/db/schema_migrations/20190822185441 b/db/schema_migrations/20190822185441
deleted file mode 100644
index 0495815eb4c..00000000000
--- a/db/schema_migrations/20190822185441
+++ /dev/null
@@ -1 +0,0 @@
-3eabd3983d6ddaf416e2806d545578c38dc29ebd374c8f763c914dac97620d4b \ No newline at end of file
diff --git a/db/schema_migrations/20190823055948 b/db/schema_migrations/20190823055948
deleted file mode 100644
index 36199132ec9..00000000000
--- a/db/schema_migrations/20190823055948
+++ /dev/null
@@ -1 +0,0 @@
-64c06be6709159060c175972af919282560a33d1e69964512ca3b938c0084059 \ No newline at end of file
diff --git a/db/schema_migrations/20190826090628 b/db/schema_migrations/20190826090628
deleted file mode 100644
index f2bb1347784..00000000000
--- a/db/schema_migrations/20190826090628
+++ /dev/null
@@ -1 +0,0 @@
-e689268ad90086dd164950897da74cbe5ec6d92684eb44280bd34c8adef82beb \ No newline at end of file
diff --git a/db/schema_migrations/20190826100605 b/db/schema_migrations/20190826100605
deleted file mode 100644
index b5095bb9fe6..00000000000
--- a/db/schema_migrations/20190826100605
+++ /dev/null
@@ -1 +0,0 @@
-90fb1444404d07fc3a88f48040d5aeb8c6cbb3389239881737116f4b50983836 \ No newline at end of file
diff --git a/db/schema_migrations/20190827102026 b/db/schema_migrations/20190827102026
deleted file mode 100644
index 86ed4e10076..00000000000
--- a/db/schema_migrations/20190827102026
+++ /dev/null
@@ -1 +0,0 @@
-7528817e5b38379a3115d1de18a4c8a79a88b238ad1684c68ffa09c41992d1a2 \ No newline at end of file
diff --git a/db/schema_migrations/20190827222124 b/db/schema_migrations/20190827222124
deleted file mode 100644
index 9879219c579..00000000000
--- a/db/schema_migrations/20190827222124
+++ /dev/null
@@ -1 +0,0 @@
-72fe9451980b1fae87b884d8ec4d24766ab63cedd9afb2e7dec3d6900d940233 \ No newline at end of file
diff --git a/db/schema_migrations/20190828083843 b/db/schema_migrations/20190828083843
deleted file mode 100644
index fb8d2811ee8..00000000000
--- a/db/schema_migrations/20190828083843
+++ /dev/null
@@ -1 +0,0 @@
-b443f17924a61e4b5edc21ee95ac836c23715c19ac56b0f30f6dde3048e6f4c8 \ No newline at end of file
diff --git a/db/schema_migrations/20190828110802 b/db/schema_migrations/20190828110802
deleted file mode 100644
index 0fd636be6bf..00000000000
--- a/db/schema_migrations/20190828110802
+++ /dev/null
@@ -1 +0,0 @@
-997654825079895b6deb78fee85622d5f553516b0f79dd45864ccf78e7d393c8 \ No newline at end of file
diff --git a/db/schema_migrations/20190828170945 b/db/schema_migrations/20190828170945
deleted file mode 100644
index 3042a5c4c78..00000000000
--- a/db/schema_migrations/20190828170945
+++ /dev/null
@@ -1 +0,0 @@
-d756f3c3669522a88f4145ffbae4dd320362dfa1d20c0dab706f927d5dc9c1fc \ No newline at end of file
diff --git a/db/schema_migrations/20190828172831 b/db/schema_migrations/20190828172831
deleted file mode 100644
index 7928f862d70..00000000000
--- a/db/schema_migrations/20190828172831
+++ /dev/null
@@ -1 +0,0 @@
-bb2177e3f6edfb3b4f3a6f99c163569fcc7ffcd9937e20731127639c5f581e14 \ No newline at end of file
diff --git a/db/schema_migrations/20190829131130 b/db/schema_migrations/20190829131130
deleted file mode 100644
index 5ec3a5a63f9..00000000000
--- a/db/schema_migrations/20190829131130
+++ /dev/null
@@ -1 +0,0 @@
-d79cee991f9c67f1f32734e462ba20716b7afb2807aadbe3bb223482c39752ce \ No newline at end of file
diff --git a/db/schema_migrations/20190830075508 b/db/schema_migrations/20190830075508
deleted file mode 100644
index 5e65fbd2bcc..00000000000
--- a/db/schema_migrations/20190830075508
+++ /dev/null
@@ -1 +0,0 @@
-a63559fc92fab466a04b52828bb4b871d8957012f670d0be426d3d4d7a358523 \ No newline at end of file
diff --git a/db/schema_migrations/20190830080123 b/db/schema_migrations/20190830080123
deleted file mode 100644
index 8ebc3ebb6e5..00000000000
--- a/db/schema_migrations/20190830080123
+++ /dev/null
@@ -1 +0,0 @@
-a01e57d8ea05aa230ea14a64eaab9cf9477a5e2738623142d2f56fc146cce8c8 \ No newline at end of file
diff --git a/db/schema_migrations/20190830080626 b/db/schema_migrations/20190830080626
deleted file mode 100644
index a866a488301..00000000000
--- a/db/schema_migrations/20190830080626
+++ /dev/null
@@ -1 +0,0 @@
-2d41add021e675aad73b81c7e26b4887eebb22f897f9b85db487b1a88a6d6909 \ No newline at end of file
diff --git a/db/schema_migrations/20190830140240 b/db/schema_migrations/20190830140240
deleted file mode 100644
index 5ef4d017f49..00000000000
--- a/db/schema_migrations/20190830140240
+++ /dev/null
@@ -1 +0,0 @@
-113a73e88c0396d50120e77bd5f0cb2a259f1d4e695609114993815fd5f723aa \ No newline at end of file
diff --git a/db/schema_migrations/20190901174200 b/db/schema_migrations/20190901174200
deleted file mode 100644
index 6b7f5f55ce5..00000000000
--- a/db/schema_migrations/20190901174200
+++ /dev/null
@@ -1 +0,0 @@
-07db6a59b3d2535eb6886cbac83372c93c9890085c1bd865365dda84f27655bb \ No newline at end of file
diff --git a/db/schema_migrations/20190902131045 b/db/schema_migrations/20190902131045
deleted file mode 100644
index 9006505b959..00000000000
--- a/db/schema_migrations/20190902131045
+++ /dev/null
@@ -1 +0,0 @@
-6170672240e9dbdf65aea165cc5781daf15fb8737a0b91c560872c0272ecf499 \ No newline at end of file
diff --git a/db/schema_migrations/20190902152329 b/db/schema_migrations/20190902152329
deleted file mode 100644
index 45049378dc7..00000000000
--- a/db/schema_migrations/20190902152329
+++ /dev/null
@@ -1 +0,0 @@
-1e61fe5200e8335727f655dcdbab451f4415d17a8ab2c8f64ee1b94f2e6a84dd \ No newline at end of file
diff --git a/db/schema_migrations/20190902160015 b/db/schema_migrations/20190902160015
deleted file mode 100644
index 1523e1b23b0..00000000000
--- a/db/schema_migrations/20190902160015
+++ /dev/null
@@ -1 +0,0 @@
-9263ca48605ef16b34722cf103f58e179737af3420de4779f056adebca0084a3 \ No newline at end of file
diff --git a/db/schema_migrations/20190903150358 b/db/schema_migrations/20190903150358
deleted file mode 100644
index a7720c53569..00000000000
--- a/db/schema_migrations/20190903150358
+++ /dev/null
@@ -1 +0,0 @@
-c52f003550f4aef93784c633215ad751ea558b4473528f5135439430a3abb3f3 \ No newline at end of file
diff --git a/db/schema_migrations/20190903150435 b/db/schema_migrations/20190903150435
deleted file mode 100644
index f2b72bafc45..00000000000
--- a/db/schema_migrations/20190903150435
+++ /dev/null
@@ -1 +0,0 @@
-a7f0d5b70c638e36ae55c31bab207508f380e68dab2bc92105e8d304dd86abd3 \ No newline at end of file
diff --git a/db/schema_migrations/20190904173203 b/db/schema_migrations/20190904173203
deleted file mode 100644
index c4985aa95aa..00000000000
--- a/db/schema_migrations/20190904173203
+++ /dev/null
@@ -1 +0,0 @@
-a600aea22d7f5b373a272785c24a2277276a7a3f011f8a2fe827cb2e2e669c48 \ No newline at end of file
diff --git a/db/schema_migrations/20190904205212 b/db/schema_migrations/20190904205212
deleted file mode 100644
index 1203c40561c..00000000000
--- a/db/schema_migrations/20190904205212
+++ /dev/null
@@ -1 +0,0 @@
-2cf185a3fe5c97db01f2e1b93135457626d5e6e8713db8f51ec9f0cf5f7fe282 \ No newline at end of file
diff --git a/db/schema_migrations/20190905022045 b/db/schema_migrations/20190905022045
deleted file mode 100644
index d8af3140f0c..00000000000
--- a/db/schema_migrations/20190905022045
+++ /dev/null
@@ -1 +0,0 @@
-e75ebe92e7631d163312dd3d0a1a4bc4a9f42ad9457b534bcd43585c266fe456 \ No newline at end of file
diff --git a/db/schema_migrations/20190905074652 b/db/schema_migrations/20190905074652
deleted file mode 100644
index 72d73da0912..00000000000
--- a/db/schema_migrations/20190905074652
+++ /dev/null
@@ -1 +0,0 @@
-a31342276e56ac9c36affe2dac9b9a29624955d88da6cc54276eb56fe3049963 \ No newline at end of file
diff --git a/db/schema_migrations/20190905091812 b/db/schema_migrations/20190905091812
deleted file mode 100644
index af5d7f93580..00000000000
--- a/db/schema_migrations/20190905091812
+++ /dev/null
@@ -1 +0,0 @@
-16de88860f5a6191dd023cc530e0ae93d648d6205933008ab4f6c3ed86bc25ec \ No newline at end of file
diff --git a/db/schema_migrations/20190905091831 b/db/schema_migrations/20190905091831
deleted file mode 100644
index 2ed7942a7c7..00000000000
--- a/db/schema_migrations/20190905091831
+++ /dev/null
@@ -1 +0,0 @@
-326f4bba5fa295e1f06ecd0a6623a1f5229612c5581e3a3b0d23a30ec586da0b \ No newline at end of file
diff --git a/db/schema_migrations/20190905140605 b/db/schema_migrations/20190905140605
deleted file mode 100644
index f3d57276be6..00000000000
--- a/db/schema_migrations/20190905140605
+++ /dev/null
@@ -1 +0,0 @@
-169286baf5974bee56b3450c2b909b647f0e3432c8c6d958f9fe0236d676c79f \ No newline at end of file
diff --git a/db/schema_migrations/20190905223800 b/db/schema_migrations/20190905223800
deleted file mode 100644
index eda3f89260d..00000000000
--- a/db/schema_migrations/20190905223800
+++ /dev/null
@@ -1 +0,0 @@
-0f49689e2eec83d2b15b81438759bf0bd33039f044dfbc07f1461d670dec85d3 \ No newline at end of file
diff --git a/db/schema_migrations/20190905223900 b/db/schema_migrations/20190905223900
deleted file mode 100644
index 2e1d1e86404..00000000000
--- a/db/schema_migrations/20190905223900
+++ /dev/null
@@ -1 +0,0 @@
-aa3ed5d568045a08acf2c597f5e13e14e09090be034d547838af3ccf0642f44f \ No newline at end of file
diff --git a/db/schema_migrations/20190906104555 b/db/schema_migrations/20190906104555
deleted file mode 100644
index 30d0d71c8e4..00000000000
--- a/db/schema_migrations/20190906104555
+++ /dev/null
@@ -1 +0,0 @@
-b2da83b53773a8a5f3c779fde07e13620463b3d5f05c9437a91cfff616bd76b7 \ No newline at end of file
diff --git a/db/schema_migrations/20190907184714 b/db/schema_migrations/20190907184714
deleted file mode 100644
index 732a32f4578..00000000000
--- a/db/schema_migrations/20190907184714
+++ /dev/null
@@ -1 +0,0 @@
-d9a42b17a86eb438e9b89eaa099f2a6fa1bbaeb0aa46dde58c459c73d263eee2 \ No newline at end of file
diff --git a/db/schema_migrations/20190909045845 b/db/schema_migrations/20190909045845
deleted file mode 100644
index c6324dfc036..00000000000
--- a/db/schema_migrations/20190909045845
+++ /dev/null
@@ -1 +0,0 @@
-28b305e2347f50850a09dc9db2562e24e6579795b61c2be7917f285fa363cbfc \ No newline at end of file
diff --git a/db/schema_migrations/20190909141517 b/db/schema_migrations/20190909141517
deleted file mode 100644
index 489e65b3945..00000000000
--- a/db/schema_migrations/20190909141517
+++ /dev/null
@@ -1 +0,0 @@
-54f0a1698edddee206f61b275996d6a20d94c94b48f2fc4e4d4a464cd8eea676 \ No newline at end of file
diff --git a/db/schema_migrations/20190910000130 b/db/schema_migrations/20190910000130
deleted file mode 100644
index e1ad7182eb2..00000000000
--- a/db/schema_migrations/20190910000130
+++ /dev/null
@@ -1 +0,0 @@
-2de4107f3687f69949b0075bb160a6b93646f2737ed737e2229e8302b6ffb3bd \ No newline at end of file
diff --git a/db/schema_migrations/20190910103144 b/db/schema_migrations/20190910103144
deleted file mode 100644
index eccfe7eefdb..00000000000
--- a/db/schema_migrations/20190910103144
+++ /dev/null
@@ -1 +0,0 @@
-ce78a19764a8055042f4380780e7e0444be1aa904ba8d1206de4723108170017 \ No newline at end of file
diff --git a/db/schema_migrations/20190910114843 b/db/schema_migrations/20190910114843
deleted file mode 100644
index 6bab165a8f9..00000000000
--- a/db/schema_migrations/20190910114843
+++ /dev/null
@@ -1 +0,0 @@
-d8a9d068e664ab398ff7d7efcf2a69d7432efd41d0e89399527cf7099067cda7 \ No newline at end of file
diff --git a/db/schema_migrations/20190910125852 b/db/schema_migrations/20190910125852
deleted file mode 100644
index 8c04d879807..00000000000
--- a/db/schema_migrations/20190910125852
+++ /dev/null
@@ -1 +0,0 @@
-b4344e58c731f9c70895b761cf2b8e7a44c1bcb5b991cdc8d0906e314c4f2296 \ No newline at end of file
diff --git a/db/schema_migrations/20190910211526 b/db/schema_migrations/20190910211526
deleted file mode 100644
index 72f18bd664b..00000000000
--- a/db/schema_migrations/20190910211526
+++ /dev/null
@@ -1 +0,0 @@
-686f188c7033439f89a01f66c832296ae4bbdce8d86271a5bda0c2beb7cc7b2f \ No newline at end of file
diff --git a/db/schema_migrations/20190910212256 b/db/schema_migrations/20190910212256
deleted file mode 100644
index cdb7678e8c6..00000000000
--- a/db/schema_migrations/20190910212256
+++ /dev/null
@@ -1 +0,0 @@
-bf2d561f6150890d54dcaac3bd47099688510cf01ab02b4f8ccb1a496019448e \ No newline at end of file
diff --git a/db/schema_migrations/20190911115056 b/db/schema_migrations/20190911115056
deleted file mode 100644
index cec3ef2cb98..00000000000
--- a/db/schema_migrations/20190911115056
+++ /dev/null
@@ -1 +0,0 @@
-c37f0de57ff5d08961bd660dba33973eb9e2348e4c1460e1b45b30ca8815b9d2 \ No newline at end of file
diff --git a/db/schema_migrations/20190911115109 b/db/schema_migrations/20190911115109
deleted file mode 100644
index 42c0a722373..00000000000
--- a/db/schema_migrations/20190911115109
+++ /dev/null
@@ -1 +0,0 @@
-1a7e8a2fdf5a515dcdc85fb55b335351e1531b49a7d319625e8dae8a7921384b \ No newline at end of file
diff --git a/db/schema_migrations/20190911115207 b/db/schema_migrations/20190911115207
deleted file mode 100644
index 5205c1d07ed..00000000000
--- a/db/schema_migrations/20190911115207
+++ /dev/null
@@ -1 +0,0 @@
-56cfabbb08ece8934ae0f4eadeb8c5d438d3d6156806ab843ff0c1497c94147b \ No newline at end of file
diff --git a/db/schema_migrations/20190911115222 b/db/schema_migrations/20190911115222
deleted file mode 100644
index 47d0dfd4ff1..00000000000
--- a/db/schema_migrations/20190911115222
+++ /dev/null
@@ -1 +0,0 @@
-f5f18602819d84a6423dcc5899572e5c83d6fb251e3f309b748eb303ab65d03f \ No newline at end of file
diff --git a/db/schema_migrations/20190911251732 b/db/schema_migrations/20190911251732
deleted file mode 100644
index 0f724d28d77..00000000000
--- a/db/schema_migrations/20190911251732
+++ /dev/null
@@ -1 +0,0 @@
-4c36e9ee7c007a36df4f49b6f7708b4028413829fe14898e73b8d2e13a8f80af \ No newline at end of file
diff --git a/db/schema_migrations/20190912061145 b/db/schema_migrations/20190912061145
deleted file mode 100644
index a9ec1e1cef3..00000000000
--- a/db/schema_migrations/20190912061145
+++ /dev/null
@@ -1 +0,0 @@
-66182e65e32e9198a92161fb649807df3a265947389c3f84cdd303a66b669628 \ No newline at end of file
diff --git a/db/schema_migrations/20190912223232 b/db/schema_migrations/20190912223232
deleted file mode 100644
index ace13c81391..00000000000
--- a/db/schema_migrations/20190912223232
+++ /dev/null
@@ -1 +0,0 @@
-ba46f2f1a218bb6cfb85b0556cfaf22f8cfe9e72e8176d7db51f36ffc98a54da \ No newline at end of file
diff --git a/db/schema_migrations/20190913174707 b/db/schema_migrations/20190913174707
deleted file mode 100644
index d54be440545..00000000000
--- a/db/schema_migrations/20190913174707
+++ /dev/null
@@ -1 +0,0 @@
-0979c494820844051d5ee90cf241dc76d20524343a3012201941db8715962b41 \ No newline at end of file
diff --git a/db/schema_migrations/20190913175827 b/db/schema_migrations/20190913175827
deleted file mode 100644
index 77ded500f29..00000000000
--- a/db/schema_migrations/20190913175827
+++ /dev/null
@@ -1 +0,0 @@
-efb47887cabf9ab80c541efc08f9d9d70b08d7c06e735861c3a54c961c6c0b05 \ No newline at end of file
diff --git a/db/schema_migrations/20190914223900 b/db/schema_migrations/20190914223900
deleted file mode 100644
index 888f635bc0d..00000000000
--- a/db/schema_migrations/20190914223900
+++ /dev/null
@@ -1 +0,0 @@
-c236cdced1af8a5f286f33e20289aaee9c5918e38aab2da16a2b9b58731c309e \ No newline at end of file
diff --git a/db/schema_migrations/20190917173107 b/db/schema_migrations/20190917173107
deleted file mode 100644
index 084e78606c7..00000000000
--- a/db/schema_migrations/20190917173107
+++ /dev/null
@@ -1 +0,0 @@
-671a0dd0e94baa3874769e83bdf2efa1a96e3e2f17b0d9b47a2268104a50518b \ No newline at end of file
diff --git a/db/schema_migrations/20190918025618 b/db/schema_migrations/20190918025618
deleted file mode 100644
index cecaca948b6..00000000000
--- a/db/schema_migrations/20190918025618
+++ /dev/null
@@ -1 +0,0 @@
-247d77a5db97c95e36ff893669986353e3558780c2187544bce673243bd9dc79 \ No newline at end of file
diff --git a/db/schema_migrations/20190918102042 b/db/schema_migrations/20190918102042
deleted file mode 100644
index 59a1a20a040..00000000000
--- a/db/schema_migrations/20190918102042
+++ /dev/null
@@ -1 +0,0 @@
-1cf2cc93823110690e4debbe6397921ba968bd1ea2e8f4a277a77c02893e8cc7 \ No newline at end of file
diff --git a/db/schema_migrations/20190918104212 b/db/schema_migrations/20190918104212
deleted file mode 100644
index f7e01c33654..00000000000
--- a/db/schema_migrations/20190918104212
+++ /dev/null
@@ -1 +0,0 @@
-2c75f0b733601f577243c2d39089f5a0d99f33f81be9b668d4b9c139b0544301 \ No newline at end of file
diff --git a/db/schema_migrations/20190918104222 b/db/schema_migrations/20190918104222
deleted file mode 100644
index c8572c39792..00000000000
--- a/db/schema_migrations/20190918104222
+++ /dev/null
@@ -1 +0,0 @@
-1d3c87c5e53c56f8aa94ed3d23c65c0c7b84e9252a9a1aa9f21223c1b313e495 \ No newline at end of file
diff --git a/db/schema_migrations/20190918104731 b/db/schema_migrations/20190918104731
deleted file mode 100644
index 61a0c25cd61..00000000000
--- a/db/schema_migrations/20190918104731
+++ /dev/null
@@ -1 +0,0 @@
-3595e71954274ca93f665936fdcdf87073c98cc0b6a840d1f7e6c6d29aebe97e \ No newline at end of file
diff --git a/db/schema_migrations/20190918121135 b/db/schema_migrations/20190918121135
deleted file mode 100644
index f9890b3a0e8..00000000000
--- a/db/schema_migrations/20190918121135
+++ /dev/null
@@ -1 +0,0 @@
-6c85977a3458d9ac411eb9ed79d61b00ee5fa933fbf30fd58b35ef963fe1a746 \ No newline at end of file
diff --git a/db/schema_migrations/20190919040324 b/db/schema_migrations/20190919040324
deleted file mode 100644
index 8009072a21c..00000000000
--- a/db/schema_migrations/20190919040324
+++ /dev/null
@@ -1 +0,0 @@
-aaa311c52e01fe6727592c6f12b2d35e2fe2b391fb93707408376d7bdc95be39 \ No newline at end of file
diff --git a/db/schema_migrations/20190919091300 b/db/schema_migrations/20190919091300
deleted file mode 100644
index 957b870e3c5..00000000000
--- a/db/schema_migrations/20190919091300
+++ /dev/null
@@ -1 +0,0 @@
-e2a0c99b401e65f900105be1855f3d8b2a459dae946f1be7ddd996ec3cf4c7a3 \ No newline at end of file
diff --git a/db/schema_migrations/20190919104119 b/db/schema_migrations/20190919104119
deleted file mode 100644
index 0113dc9fff5..00000000000
--- a/db/schema_migrations/20190919104119
+++ /dev/null
@@ -1 +0,0 @@
-4f3494c5cd745c13d4ca1f239b327b9d4f2d2580350dd351c08c1d225f87013c \ No newline at end of file
diff --git a/db/schema_migrations/20190919162036 b/db/schema_migrations/20190919162036
deleted file mode 100644
index cb6a8479b18..00000000000
--- a/db/schema_migrations/20190919162036
+++ /dev/null
@@ -1 +0,0 @@
-bcbfc76cccb757346cb6f8fc90177170c10600cc7717215d040db7c027dae104 \ No newline at end of file
diff --git a/db/schema_migrations/20190919183411 b/db/schema_migrations/20190919183411
deleted file mode 100644
index 21eee82f4f8..00000000000
--- a/db/schema_migrations/20190919183411
+++ /dev/null
@@ -1 +0,0 @@
-aca0b79fa42d7cc2e838f90105b0a0d4788d8fe96b569a587e733a61d5848f4a \ No newline at end of file
diff --git a/db/schema_migrations/20190920122420 b/db/schema_migrations/20190920122420
deleted file mode 100644
index ef08bf34ebb..00000000000
--- a/db/schema_migrations/20190920122420
+++ /dev/null
@@ -1 +0,0 @@
-6bab074de61f0231e1bdecd0ee4ec333b516d76c19cb8db94ee947818b081f94 \ No newline at end of file
diff --git a/db/schema_migrations/20190920194925 b/db/schema_migrations/20190920194925
deleted file mode 100644
index 0c64e2b6c24..00000000000
--- a/db/schema_migrations/20190920194925
+++ /dev/null
@@ -1 +0,0 @@
-42d85b089f83d310b8b632884ac705249817c95f102682b090d4acfbd61f4b22 \ No newline at end of file
diff --git a/db/schema_migrations/20190920224341 b/db/schema_migrations/20190920224341
deleted file mode 100644
index 9706a37704b..00000000000
--- a/db/schema_migrations/20190920224341
+++ /dev/null
@@ -1 +0,0 @@
-bc6d8b2fceb2982a9a686aa3d419c3f98310168ea2e51762b1a9e5b0ed4b7c48 \ No newline at end of file
diff --git a/db/schema_migrations/20190924124627 b/db/schema_migrations/20190924124627
deleted file mode 100644
index cc90f50596a..00000000000
--- a/db/schema_migrations/20190924124627
+++ /dev/null
@@ -1 +0,0 @@
-8ed6b12a504868795ffb2ecb02060da5b7e5e0ba4e1f9c6169c48310bd84eeef \ No newline at end of file
diff --git a/db/schema_migrations/20190924152703 b/db/schema_migrations/20190924152703
deleted file mode 100644
index 347e9f93d0a..00000000000
--- a/db/schema_migrations/20190924152703
+++ /dev/null
@@ -1 +0,0 @@
-0bb9141d46bcccfa8e9490eaf9fcb33915bdaeacdb84a9c6858935a562c8a362 \ No newline at end of file
diff --git a/db/schema_migrations/20190925055714 b/db/schema_migrations/20190925055714
deleted file mode 100644
index 701644cdd6f..00000000000
--- a/db/schema_migrations/20190925055714
+++ /dev/null
@@ -1 +0,0 @@
-a680157909ef97ac07faca16c001b143378e6465573b6f2373b393c47fc027d6 \ No newline at end of file
diff --git a/db/schema_migrations/20190925055902 b/db/schema_migrations/20190925055902
deleted file mode 100644
index f714bc2686f..00000000000
--- a/db/schema_migrations/20190925055902
+++ /dev/null
@@ -1 +0,0 @@
-f558687fcde66fd9a830c7bdca30085a69491f59bc8adb69ee605a9e6f1c7763 \ No newline at end of file
diff --git a/db/schema_migrations/20190926041216 b/db/schema_migrations/20190926041216
deleted file mode 100644
index 5e3420d6292..00000000000
--- a/db/schema_migrations/20190926041216
+++ /dev/null
@@ -1 +0,0 @@
-a014773268f68be8ee1e645265cda8cfca72d8186c4d0a2c4d6a7d7398f7fea3 \ No newline at end of file
diff --git a/db/schema_migrations/20190926180443 b/db/schema_migrations/20190926180443
deleted file mode 100644
index 291bb50985f..00000000000
--- a/db/schema_migrations/20190926180443
+++ /dev/null
@@ -1 +0,0 @@
-29140931453a51f6dad67a51ab7d17e7a0006ad6275f2624bb481214ed704f71 \ No newline at end of file
diff --git a/db/schema_migrations/20190926225633 b/db/schema_migrations/20190926225633
deleted file mode 100644
index 00719ab965f..00000000000
--- a/db/schema_migrations/20190926225633
+++ /dev/null
@@ -1 +0,0 @@
-c88a5b610eba2708ed79facbf4f35643870ec528af1ee1ee4fc506fbd923a6e0 \ No newline at end of file
diff --git a/db/schema_migrations/20190927055500 b/db/schema_migrations/20190927055500
deleted file mode 100644
index 393ababee7c..00000000000
--- a/db/schema_migrations/20190927055500
+++ /dev/null
@@ -1 +0,0 @@
-f16865939bc333d342cc92edceed9948470f3552268323ec941f0b0c11b93aae \ No newline at end of file
diff --git a/db/schema_migrations/20190927055540 b/db/schema_migrations/20190927055540
deleted file mode 100644
index 6109b40df7a..00000000000
--- a/db/schema_migrations/20190927055540
+++ /dev/null
@@ -1 +0,0 @@
-aea3adb38f7895217fdf08bed5ff9b6f648672b76f475447b6773619cb9cc4c8 \ No newline at end of file
diff --git a/db/schema_migrations/20190927074328 b/db/schema_migrations/20190927074328
deleted file mode 100644
index 89dc5ae89c0..00000000000
--- a/db/schema_migrations/20190927074328
+++ /dev/null
@@ -1 +0,0 @@
-5dabaea6f44793c36585f119903ca9e26b70a7a1d35000107ed25ac1c655d937 \ No newline at end of file
diff --git a/db/schema_migrations/20190929180751 b/db/schema_migrations/20190929180751
deleted file mode 100644
index f09fe68462d..00000000000
--- a/db/schema_migrations/20190929180751
+++ /dev/null
@@ -1 +0,0 @@
-7bc84e4ec27b07c3a8f484ca9237065f8b38e44fa26d21f4f67cd08855017ddd \ No newline at end of file
diff --git a/db/schema_migrations/20190929180813 b/db/schema_migrations/20190929180813
deleted file mode 100644
index 651673105f6..00000000000
--- a/db/schema_migrations/20190929180813
+++ /dev/null
@@ -1 +0,0 @@
-e986b7f607f859f8df4792979a549e045ece73f77ce482ced67da29b64f1d076 \ No newline at end of file
diff --git a/db/schema_migrations/20190929180827 b/db/schema_migrations/20190929180827
deleted file mode 100644
index 0f640c52750..00000000000
--- a/db/schema_migrations/20190929180827
+++ /dev/null
@@ -1 +0,0 @@
-04805d47a8857a8d484fed6b509b4940d5952657ebff694ee6410d2e2805f83c \ No newline at end of file
diff --git a/db/schema_migrations/20190930025655 b/db/schema_migrations/20190930025655
deleted file mode 100644
index 19cd29eafa1..00000000000
--- a/db/schema_migrations/20190930025655
+++ /dev/null
@@ -1 +0,0 @@
-cfbb6f3dd187ec2fb28c290338030608c765d5713842ee3f16827db2be2fff04 \ No newline at end of file
diff --git a/db/schema_migrations/20190930063627 b/db/schema_migrations/20190930063627
deleted file mode 100644
index 046506410c6..00000000000
--- a/db/schema_migrations/20190930063627
+++ /dev/null
@@ -1 +0,0 @@
-3055bcbf27cd61bfc38f2aceb17f62edd87d2491c156576c9a86cc7c938558c6 \ No newline at end of file
diff --git a/db/schema_migrations/20190930082942 b/db/schema_migrations/20190930082942
deleted file mode 100644
index 237c30f5e73..00000000000
--- a/db/schema_migrations/20190930082942
+++ /dev/null
@@ -1 +0,0 @@
-c3605df74eb32a0e5e0966c365e5afe41c2277def650c71ebfde591aff535256 \ No newline at end of file
diff --git a/db/schema_migrations/20190930153535 b/db/schema_migrations/20190930153535
deleted file mode 100644
index e6f379fa97d..00000000000
--- a/db/schema_migrations/20190930153535
+++ /dev/null
@@ -1 +0,0 @@
-e31108d9a2834e73feb7591f7715da6ce4078da1529788d3ee60337d1132eb6a \ No newline at end of file
diff --git a/db/schema_migrations/20191001040549 b/db/schema_migrations/20191001040549
deleted file mode 100644
index 8710defdcfd..00000000000
--- a/db/schema_migrations/20191001040549
+++ /dev/null
@@ -1 +0,0 @@
-6ec6d4d3077ce67d74c66e25ec74d978aca2403da05429878fc876a9e7e5d15f \ No newline at end of file
diff --git a/db/schema_migrations/20191001170300 b/db/schema_migrations/20191001170300
deleted file mode 100644
index 476230c45e6..00000000000
--- a/db/schema_migrations/20191001170300
+++ /dev/null
@@ -1 +0,0 @@
-17cde9d5755d2c9403704482b0deca4748ccb5d9112253fb8abc51ecb3dbf084 \ No newline at end of file
diff --git a/db/schema_migrations/20191002031332 b/db/schema_migrations/20191002031332
deleted file mode 100644
index ffa5e9a5884..00000000000
--- a/db/schema_migrations/20191002031332
+++ /dev/null
@@ -1 +0,0 @@
-74bacf6a489c59ec66ed6687f065ddc2037b2ba35754c551cb0a23188988aafa \ No newline at end of file
diff --git a/db/schema_migrations/20191002123516 b/db/schema_migrations/20191002123516
deleted file mode 100644
index aa4160aa80a..00000000000
--- a/db/schema_migrations/20191002123516
+++ /dev/null
@@ -1 +0,0 @@
-79d78a9910567d4eb9a77400080b68653cee7af50f4894dad5a907306bc1559c \ No newline at end of file
diff --git a/db/schema_migrations/20191003015155 b/db/schema_migrations/20191003015155
deleted file mode 100644
index e8af40d63aa..00000000000
--- a/db/schema_migrations/20191003015155
+++ /dev/null
@@ -1 +0,0 @@
-95e665176c25d7afffddf3bcde7786847f9a05371b8218614c86a4def3472066 \ No newline at end of file
diff --git a/db/schema_migrations/20191003060227 b/db/schema_migrations/20191003060227
deleted file mode 100644
index 9c22b09db90..00000000000
--- a/db/schema_migrations/20191003060227
+++ /dev/null
@@ -1 +0,0 @@
-83b408c994191be4c4854d3899ced96afec3fd10cbca6ae25dc550b73bd8c46e \ No newline at end of file
diff --git a/db/schema_migrations/20191003064615 b/db/schema_migrations/20191003064615
deleted file mode 100644
index 37976de895b..00000000000
--- a/db/schema_migrations/20191003064615
+++ /dev/null
@@ -1 +0,0 @@
-20526b0038ef1ef4123069d6e39fd4b0f5a67e34042a1660a3f074cfb3eaaee9 \ No newline at end of file
diff --git a/db/schema_migrations/20191003130045 b/db/schema_migrations/20191003130045
deleted file mode 100644
index 639ec302114..00000000000
--- a/db/schema_migrations/20191003130045
+++ /dev/null
@@ -1 +0,0 @@
-647253df86d12695d6dc9c58c7b84dffd44d447c996903c9d13a397d73a70878 \ No newline at end of file
diff --git a/db/schema_migrations/20191003150045 b/db/schema_migrations/20191003150045
deleted file mode 100644
index 116ad2dc2e1..00000000000
--- a/db/schema_migrations/20191003150045
+++ /dev/null
@@ -1 +0,0 @@
-701e32e383ad00c81a28caa035746a07ec6a84be6733d5543c261b7c17072e56 \ No newline at end of file
diff --git a/db/schema_migrations/20191003161031 b/db/schema_migrations/20191003161031
deleted file mode 100644
index 5a46d3bbc1a..00000000000
--- a/db/schema_migrations/20191003161031
+++ /dev/null
@@ -1 +0,0 @@
-7bde96e64e08a843eb16786fe755c2892c9b9d90dea851fd444bfa5655ce35c3 \ No newline at end of file
diff --git a/db/schema_migrations/20191003161032 b/db/schema_migrations/20191003161032
deleted file mode 100644
index df8057f443a..00000000000
--- a/db/schema_migrations/20191003161032
+++ /dev/null
@@ -1 +0,0 @@
-28f7f650cca6da6ef4c569ee07f1e681b49ec7f0d472d7f15bde5fbbc4896796 \ No newline at end of file
diff --git a/db/schema_migrations/20191003195218 b/db/schema_migrations/20191003195218
deleted file mode 100644
index 1107e33c6ad..00000000000
--- a/db/schema_migrations/20191003195218
+++ /dev/null
@@ -1 +0,0 @@
-4b1c5dc0da16549b1a903f14dd8eb204ec56482ca22e6839dff8e48f80caee24 \ No newline at end of file
diff --git a/db/schema_migrations/20191003195620 b/db/schema_migrations/20191003195620
deleted file mode 100644
index e74ac9c4aee..00000000000
--- a/db/schema_migrations/20191003195620
+++ /dev/null
@@ -1 +0,0 @@
-634635076b4f908de271d24c34f527634ee6b7c48124dc32bfbd38029e335a74 \ No newline at end of file
diff --git a/db/schema_migrations/20191003200045 b/db/schema_migrations/20191003200045
deleted file mode 100644
index b60c0645785..00000000000
--- a/db/schema_migrations/20191003200045
+++ /dev/null
@@ -1 +0,0 @@
-39f5ff3e3837b71388110f3bfe49d5629f1f0a083b2ce6a36c06cfa560a323ef \ No newline at end of file
diff --git a/db/schema_migrations/20191003250045 b/db/schema_migrations/20191003250045
deleted file mode 100644
index 4976f84e6a6..00000000000
--- a/db/schema_migrations/20191003250045
+++ /dev/null
@@ -1 +0,0 @@
-8a40db4e6be8fc3ee50181feb541bf808a8a9eb6555bcea9edb5c4a7570de557 \ No newline at end of file
diff --git a/db/schema_migrations/20191003300045 b/db/schema_migrations/20191003300045
deleted file mode 100644
index a659fcd73fe..00000000000
--- a/db/schema_migrations/20191003300045
+++ /dev/null
@@ -1 +0,0 @@
-53147133c54680a43bdf1aff6ae02449c2b1593047f22ad2329908ebac6eb5e3 \ No newline at end of file
diff --git a/db/schema_migrations/20191003350045 b/db/schema_migrations/20191003350045
deleted file mode 100644
index 3cc0550fad5..00000000000
--- a/db/schema_migrations/20191003350045
+++ /dev/null
@@ -1 +0,0 @@
-01f417ab7ce788a41e21bfa73de4cc0448964a3e2b34f967296a2429b3541d3c \ No newline at end of file
diff --git a/db/schema_migrations/20191004080818 b/db/schema_migrations/20191004080818
deleted file mode 100644
index edb2e06501b..00000000000
--- a/db/schema_migrations/20191004080818
+++ /dev/null
@@ -1 +0,0 @@
-7cdddb5ab3975e8b878f820561effad9977db87626b14ed9d32a5f1cb0140b55 \ No newline at end of file
diff --git a/db/schema_migrations/20191004081520 b/db/schema_migrations/20191004081520
deleted file mode 100644
index 61204bebacb..00000000000
--- a/db/schema_migrations/20191004081520
+++ /dev/null
@@ -1 +0,0 @@
-2fe1525c594ffb2e5428107fc5ef6c2a2c521b704a26e4153f2fdb1f4fcb86f5 \ No newline at end of file
diff --git a/db/schema_migrations/20191004133612 b/db/schema_migrations/20191004133612
deleted file mode 100644
index 210618788f4..00000000000
--- a/db/schema_migrations/20191004133612
+++ /dev/null
@@ -1 +0,0 @@
-375054e9a4f9e5e3acb29765678c9595e99da067e527f54a6f12c47f3f8145ea \ No newline at end of file
diff --git a/db/schema_migrations/20191004151428 b/db/schema_migrations/20191004151428
deleted file mode 100644
index 140a32a5bde..00000000000
--- a/db/schema_migrations/20191004151428
+++ /dev/null
@@ -1 +0,0 @@
-0ea9ef1db88a71d9a37f0d90dd3311c0bdaaa56ebfd02044580d5b07509e09a1 \ No newline at end of file
diff --git a/db/schema_migrations/20191007163701 b/db/schema_migrations/20191007163701
deleted file mode 100644
index c9ce34edca1..00000000000
--- a/db/schema_migrations/20191007163701
+++ /dev/null
@@ -1 +0,0 @@
-4fb6c0471e91ebacaf06fac4faaed364fbeec6359a59f965e37732efb4df089c \ No newline at end of file
diff --git a/db/schema_migrations/20191007163736 b/db/schema_migrations/20191007163736
deleted file mode 100644
index 093e30e73cf..00000000000
--- a/db/schema_migrations/20191007163736
+++ /dev/null
@@ -1 +0,0 @@
-137eac8d3ab2700cb0615d7b6e1a6f5d78d67b39bfd726ae53e12928526570c4 \ No newline at end of file
diff --git a/db/schema_migrations/20191008013056 b/db/schema_migrations/20191008013056
deleted file mode 100644
index 20f631fa969..00000000000
--- a/db/schema_migrations/20191008013056
+++ /dev/null
@@ -1 +0,0 @@
-9ce5934992c927939d740e2fdc1aaa39d26939bf31ac5fe6e8d861d2d4f723c6 \ No newline at end of file
diff --git a/db/schema_migrations/20191008142331 b/db/schema_migrations/20191008142331
deleted file mode 100644
index 260d7a96b84..00000000000
--- a/db/schema_migrations/20191008142331
+++ /dev/null
@@ -1 +0,0 @@
-172d41ab9cdc70a749baa3e9a06f152f8b3b91db2a9ecf83d981e60398c2097f \ No newline at end of file
diff --git a/db/schema_migrations/20191008143850 b/db/schema_migrations/20191008143850
deleted file mode 100644
index 76c0d403065..00000000000
--- a/db/schema_migrations/20191008143850
+++ /dev/null
@@ -1 +0,0 @@
-9f19480610dd2714e25df6abf8124b889f0dac7798d15e7fb751c7045ea889f7 \ No newline at end of file
diff --git a/db/schema_migrations/20191008180203 b/db/schema_migrations/20191008180203
deleted file mode 100644
index 60eebb8d5d1..00000000000
--- a/db/schema_migrations/20191008180203
+++ /dev/null
@@ -1 +0,0 @@
-0c1c6f8193df04caf2b679200210324f2c0cb756415a65148a849082bddfb35a \ No newline at end of file
diff --git a/db/schema_migrations/20191008200204 b/db/schema_migrations/20191008200204
deleted file mode 100644
index cd158096655..00000000000
--- a/db/schema_migrations/20191008200204
+++ /dev/null
@@ -1 +0,0 @@
-340475bf3c99c19c4ed8ec5bf5932081e7e308b12d50532dcba8f1ba0dccceab \ No newline at end of file
diff --git a/db/schema_migrations/20191009100244 b/db/schema_migrations/20191009100244
deleted file mode 100644
index 29a9d7898ba..00000000000
--- a/db/schema_migrations/20191009100244
+++ /dev/null
@@ -1 +0,0 @@
-7c473a2218de1b95ba49a6ef1ef73a0ac941796bc781456fced83ab893b055ab \ No newline at end of file
diff --git a/db/schema_migrations/20191009110124 b/db/schema_migrations/20191009110124
deleted file mode 100644
index 2738c7dbef5..00000000000
--- a/db/schema_migrations/20191009110124
+++ /dev/null
@@ -1 +0,0 @@
-d1b9c7b45305ceaf336bc08b0e09ebc30a7798674926acec65f8681a3858ae79 \ No newline at end of file
diff --git a/db/schema_migrations/20191009110757 b/db/schema_migrations/20191009110757
deleted file mode 100644
index ae007b9c1b8..00000000000
--- a/db/schema_migrations/20191009110757
+++ /dev/null
@@ -1 +0,0 @@
-8b89d05eb642d48fe82b419c5f96b20e8e216626f0d9c41a140df2d0eac4ca20 \ No newline at end of file
diff --git a/db/schema_migrations/20191009222222 b/db/schema_migrations/20191009222222
deleted file mode 100644
index cf1f7486c9f..00000000000
--- a/db/schema_migrations/20191009222222
+++ /dev/null
@@ -1 +0,0 @@
-3b810cddb78ee65ea7c06f7d5702a2b2fc4f6d34602d7be9b004a2dfd3bfff2b \ No newline at end of file
diff --git a/db/schema_migrations/20191010174846 b/db/schema_migrations/20191010174846
deleted file mode 100644
index 00b1fdc74c1..00000000000
--- a/db/schema_migrations/20191010174846
+++ /dev/null
@@ -1 +0,0 @@
-eaba16815f50b8e2e964601996deccbbce332d7716c49367f0721060f3bc4ec8 \ No newline at end of file
diff --git a/db/schema_migrations/20191011084019 b/db/schema_migrations/20191011084019
deleted file mode 100644
index 4213aa061f9..00000000000
--- a/db/schema_migrations/20191011084019
+++ /dev/null
@@ -1 +0,0 @@
-28239df940adf7613964bf28c5b81a886deddb86712cbf19095fc919a4acf6bc \ No newline at end of file
diff --git a/db/schema_migrations/20191013100213 b/db/schema_migrations/20191013100213
deleted file mode 100644
index 818165d03c4..00000000000
--- a/db/schema_migrations/20191013100213
+++ /dev/null
@@ -1 +0,0 @@
-4bb549347499e4570f278fd78e74e304993fc9bb8e548ca781010b134fcdfc52 \ No newline at end of file
diff --git a/db/schema_migrations/20191014025629 b/db/schema_migrations/20191014025629
deleted file mode 100644
index 4e55bee4959..00000000000
--- a/db/schema_migrations/20191014025629
+++ /dev/null
@@ -1 +0,0 @@
-ca01db96291b81b82ae07a9bb939fbbd2ae6050246a29311894a0951ea0eff56 \ No newline at end of file
diff --git a/db/schema_migrations/20191014030134 b/db/schema_migrations/20191014030134
deleted file mode 100644
index e1eed0dc2fc..00000000000
--- a/db/schema_migrations/20191014030134
+++ /dev/null
@@ -1 +0,0 @@
-ad82d6f2dad42e97601d4f9b938a2d823fdc21e93ea37b87ca65251662703cbe \ No newline at end of file
diff --git a/db/schema_migrations/20191014030730 b/db/schema_migrations/20191014030730
deleted file mode 100644
index 0205b78d2d1..00000000000
--- a/db/schema_migrations/20191014030730
+++ /dev/null
@@ -1 +0,0 @@
-20b8eebd018f231896919a5dde5c6d252efadacd647631f13d9abc18af093132 \ No newline at end of file
diff --git a/db/schema_migrations/20191014084150 b/db/schema_migrations/20191014084150
deleted file mode 100644
index f8dfa8d9613..00000000000
--- a/db/schema_migrations/20191014084150
+++ /dev/null
@@ -1 +0,0 @@
-68af1731d498b269416d55657ca494aa83d8b972994f1c4de192afa8c719f23f \ No newline at end of file
diff --git a/db/schema_migrations/20191014123159 b/db/schema_migrations/20191014123159
deleted file mode 100644
index 7849f2ea9d7..00000000000
--- a/db/schema_migrations/20191014123159
+++ /dev/null
@@ -1 +0,0 @@
-a165f4ebb5ec0cf763adb9e91dae9f4be52e3d9333af684ef829b2f03820c4db \ No newline at end of file
diff --git a/db/schema_migrations/20191014132931 b/db/schema_migrations/20191014132931
deleted file mode 100644
index 8df3ccfb63b..00000000000
--- a/db/schema_migrations/20191014132931
+++ /dev/null
@@ -1 +0,0 @@
-170e19c11fe7c0ae06eebe94876ad7f8073a7eac93535a8d396bf666601ed6ad \ No newline at end of file
diff --git a/db/schema_migrations/20191015154408 b/db/schema_migrations/20191015154408
deleted file mode 100644
index 4c406bcad04..00000000000
--- a/db/schema_migrations/20191015154408
+++ /dev/null
@@ -1 +0,0 @@
-adabec34b91bb4a85e93aed851bd9160228a286ea73ac56e3edd17b7690acd7a \ No newline at end of file
diff --git a/db/schema_migrations/20191016072826 b/db/schema_migrations/20191016072826
deleted file mode 100644
index cbf49e25a42..00000000000
--- a/db/schema_migrations/20191016072826
+++ /dev/null
@@ -1 +0,0 @@
-7038fdce2168ca2f6b60cfe995099b85c5aef44fe0644565ce9581e68544633d \ No newline at end of file
diff --git a/db/schema_migrations/20191016133352 b/db/schema_migrations/20191016133352
deleted file mode 100644
index 05169b4aac3..00000000000
--- a/db/schema_migrations/20191016133352
+++ /dev/null
@@ -1 +0,0 @@
-7ce33f357bb3f7bb8bd912bdfb4e8b77e0f8fbeee3c4f35b26cf2de67b9e38b5 \ No newline at end of file
diff --git a/db/schema_migrations/20191016220135 b/db/schema_migrations/20191016220135
deleted file mode 100644
index d5f743e3cb8..00000000000
--- a/db/schema_migrations/20191016220135
+++ /dev/null
@@ -1 +0,0 @@
-5f77d1303eb8fe7f4a3dbd3dd1cdcce7ce1eb24b5689bbf5eb688dba5873e13e \ No newline at end of file
diff --git a/db/schema_migrations/20191017001326 b/db/schema_migrations/20191017001326
deleted file mode 100644
index 6844190f9dc..00000000000
--- a/db/schema_migrations/20191017001326
+++ /dev/null
@@ -1 +0,0 @@
-9e6a6aefb0f6332a0a373c69a54e974c8998d29ad68b30baca1da2394db7f619 \ No newline at end of file
diff --git a/db/schema_migrations/20191017045817 b/db/schema_migrations/20191017045817
deleted file mode 100644
index c484051625a..00000000000
--- a/db/schema_migrations/20191017045817
+++ /dev/null
@@ -1 +0,0 @@
-0502a7ab6a5fe6d865b41a90ed29a14677d6125fdeca5bf501f6efdbc17fb6c4 \ No newline at end of file
diff --git a/db/schema_migrations/20191017094449 b/db/schema_migrations/20191017094449
deleted file mode 100644
index 1ae29d0a6dd..00000000000
--- a/db/schema_migrations/20191017094449
+++ /dev/null
@@ -1 +0,0 @@
-882342a939bae12ee30b807f204d40fb18614516586341baeb21bcbb9b6e9717 \ No newline at end of file
diff --git a/db/schema_migrations/20191017134513 b/db/schema_migrations/20191017134513
deleted file mode 100644
index 0ad1f8e2465..00000000000
--- a/db/schema_migrations/20191017134513
+++ /dev/null
@@ -1 +0,0 @@
-a868bdd7ed190a51fbd81ef8a36974ac148d6a57e9dbce50ef204b02f2c44b63 \ No newline at end of file
diff --git a/db/schema_migrations/20191017180026 b/db/schema_migrations/20191017180026
deleted file mode 100644
index 25e62576b4d..00000000000
--- a/db/schema_migrations/20191017180026
+++ /dev/null
@@ -1 +0,0 @@
-be157a9c19ca4ffbb563fe66ed98e49073b4e46a0a5554650d403951083380ca \ No newline at end of file
diff --git a/db/schema_migrations/20191017191341 b/db/schema_migrations/20191017191341
deleted file mode 100644
index dcbdc4be712..00000000000
--- a/db/schema_migrations/20191017191341
+++ /dev/null
@@ -1 +0,0 @@
-1f7cd89665a41c127017106e63c9424944c0a492506bf5a7cb4d475e654e6650 \ No newline at end of file
diff --git a/db/schema_migrations/20191021101942 b/db/schema_migrations/20191021101942
deleted file mode 100644
index 675c9370ab7..00000000000
--- a/db/schema_migrations/20191021101942
+++ /dev/null
@@ -1 +0,0 @@
-5f2930ae7d4dad97b6aa9bba35f37d18e2ca02be64522d8e2d25d0989e76f5b3 \ No newline at end of file
diff --git a/db/schema_migrations/20191022113635 b/db/schema_migrations/20191022113635
deleted file mode 100644
index 823d0c986e9..00000000000
--- a/db/schema_migrations/20191022113635
+++ /dev/null
@@ -1 +0,0 @@
-fc22f8d37344a5aa187382c56f693678e09d031699a7f2464a676714e94806c5 \ No newline at end of file
diff --git a/db/schema_migrations/20191023093207 b/db/schema_migrations/20191023093207
deleted file mode 100644
index 4758b0ecdef..00000000000
--- a/db/schema_migrations/20191023093207
+++ /dev/null
@@ -1 +0,0 @@
-86fa9bbc5967a595f73721de376af4ff101f768934a418d0ba8333446b7833ee \ No newline at end of file
diff --git a/db/schema_migrations/20191023132005 b/db/schema_migrations/20191023132005
deleted file mode 100644
index 05a85c7cbb3..00000000000
--- a/db/schema_migrations/20191023132005
+++ /dev/null
@@ -1 +0,0 @@
-a882c8b34ad9953e258dd55b90f2436ae6e63aff04a3d11d3877a4047b847c82 \ No newline at end of file
diff --git a/db/schema_migrations/20191023152913 b/db/schema_migrations/20191023152913
deleted file mode 100644
index 16a2d4c9b0c..00000000000
--- a/db/schema_migrations/20191023152913
+++ /dev/null
@@ -1 +0,0 @@
-eeae7929170a1e677477a96b49196b59a921479f0f972f968100f56fbd1f4f96 \ No newline at end of file
diff --git a/db/schema_migrations/20191024134020 b/db/schema_migrations/20191024134020
deleted file mode 100644
index 3f60f2d45a4..00000000000
--- a/db/schema_migrations/20191024134020
+++ /dev/null
@@ -1 +0,0 @@
-fed14382ef37130d2da6beacc80a5d515785d90a647e8adf1840d5effb8bd291 \ No newline at end of file
diff --git a/db/schema_migrations/20191025092748 b/db/schema_migrations/20191025092748
deleted file mode 100644
index c89bb0024b9..00000000000
--- a/db/schema_migrations/20191025092748
+++ /dev/null
@@ -1 +0,0 @@
-d1c0141c9441751ea8d0f919dd2b47c87fb01ff48b2daa027edaac1dcf007309 \ No newline at end of file
diff --git a/db/schema_migrations/20191026041447 b/db/schema_migrations/20191026041447
deleted file mode 100644
index 78749b3935b..00000000000
--- a/db/schema_migrations/20191026041447
+++ /dev/null
@@ -1 +0,0 @@
-7d652dac435d973f39fa890ac8d90509d2f4983460ee6b2e0d902294406042a6 \ No newline at end of file
diff --git a/db/schema_migrations/20191026120008 b/db/schema_migrations/20191026120008
deleted file mode 100644
index b50d993074c..00000000000
--- a/db/schema_migrations/20191026120008
+++ /dev/null
@@ -1 +0,0 @@
-b678c8b2ec58bd313a27b4cf548c22aa0ed2b162ef697635d355f3f607c4a333 \ No newline at end of file
diff --git a/db/schema_migrations/20191026120112 b/db/schema_migrations/20191026120112
deleted file mode 100644
index dba3a1edd13..00000000000
--- a/db/schema_migrations/20191026120112
+++ /dev/null
@@ -1 +0,0 @@
-b572db7d84a0d1c7ffafd09f6c2b3d75a6f5e5185bec778e2fdf08c301fdec47 \ No newline at end of file
diff --git a/db/schema_migrations/20191026124116 b/db/schema_migrations/20191026124116
deleted file mode 100644
index ea6fba0f3b3..00000000000
--- a/db/schema_migrations/20191026124116
+++ /dev/null
@@ -1 +0,0 @@
-bebe14f48bd10e189c91a9a832a3c062b519f5ad73791f06ad6b5611ecb97ea8 \ No newline at end of file
diff --git a/db/schema_migrations/20191028130054 b/db/schema_migrations/20191028130054
deleted file mode 100644
index ac5da187319..00000000000
--- a/db/schema_migrations/20191028130054
+++ /dev/null
@@ -1 +0,0 @@
-6675036ac2ac04dfc8256e9b0036a5161fdda3fbf4485942712c08305f6c1759 \ No newline at end of file
diff --git a/db/schema_migrations/20191028162543 b/db/schema_migrations/20191028162543
deleted file mode 100644
index 25164a7c36b..00000000000
--- a/db/schema_migrations/20191028162543
+++ /dev/null
@@ -1 +0,0 @@
-f7c0aabbbcfbd54202293735fdf554b97485b1d88cd4ac953f91ba3e8599bec3 \ No newline at end of file
diff --git a/db/schema_migrations/20191028184740 b/db/schema_migrations/20191028184740
deleted file mode 100644
index a09bf9b0915..00000000000
--- a/db/schema_migrations/20191028184740
+++ /dev/null
@@ -1 +0,0 @@
-9f2e65680c422e86a5bf26e514a1edbd32a82a07b3e68b8bb016bbcaa862aa6e \ No newline at end of file
diff --git a/db/schema_migrations/20191029095537 b/db/schema_migrations/20191029095537
deleted file mode 100644
index 8f72856bc89..00000000000
--- a/db/schema_migrations/20191029095537
+++ /dev/null
@@ -1 +0,0 @@
-b8d7fed0fabd24e042d120eefbafc3a914011e23d9f6c22e0d4fd8f45a196d0d \ No newline at end of file
diff --git a/db/schema_migrations/20191029125305 b/db/schema_migrations/20191029125305
deleted file mode 100644
index e83c595a0e2..00000000000
--- a/db/schema_migrations/20191029125305
+++ /dev/null
@@ -1 +0,0 @@
-cb02b49acfa3838dcd1eb1e73fc63272a9b58b8c805970c4dc3f46593e9d92f7 \ No newline at end of file
diff --git a/db/schema_migrations/20191029191901 b/db/schema_migrations/20191029191901
deleted file mode 100644
index 1cda09882e9..00000000000
--- a/db/schema_migrations/20191029191901
+++ /dev/null
@@ -1 +0,0 @@
-8881bc9f3c3fd708d5041f767e2e626687ade676b6e6600f2dffba278f81162a \ No newline at end of file
diff --git a/db/schema_migrations/20191030135044 b/db/schema_migrations/20191030135044
deleted file mode 100644
index 2ee6b4f9756..00000000000
--- a/db/schema_migrations/20191030135044
+++ /dev/null
@@ -1 +0,0 @@
-f6612c7723860345907922dc12e3c73dc2e8aa742e8682b5d4cf929483dc7a8c \ No newline at end of file
diff --git a/db/schema_migrations/20191030152934 b/db/schema_migrations/20191030152934
deleted file mode 100644
index 70be7290f44..00000000000
--- a/db/schema_migrations/20191030152934
+++ /dev/null
@@ -1 +0,0 @@
-7b22e44823a4c9815c58629aa028da915b55114a274f25548078a73cac80d555 \ No newline at end of file
diff --git a/db/schema_migrations/20191030193050 b/db/schema_migrations/20191030193050
deleted file mode 100644
index 5a30175d674..00000000000
--- a/db/schema_migrations/20191030193050
+++ /dev/null
@@ -1 +0,0 @@
-c95cc8c7a11f0c9dc510c9254cac9877a9fa015fdfe1d26b28e4169efa8aca14 \ No newline at end of file
diff --git a/db/schema_migrations/20191030223057 b/db/schema_migrations/20191030223057
deleted file mode 100644
index cef57b1615d..00000000000
--- a/db/schema_migrations/20191030223057
+++ /dev/null
@@ -1 +0,0 @@
-2a2320529c5ad13f78be30ab783af3a3ee651d869feb2745c966443d69089fe8 \ No newline at end of file
diff --git a/db/schema_migrations/20191031095636 b/db/schema_migrations/20191031095636
deleted file mode 100644
index 0da9d40ebaa..00000000000
--- a/db/schema_migrations/20191031095636
+++ /dev/null
@@ -1 +0,0 @@
-523520657d3e053a634666d5c87365f4fc09abe577cf182a019e3b07fcf398bd \ No newline at end of file
diff --git a/db/schema_migrations/20191031112603 b/db/schema_migrations/20191031112603
deleted file mode 100644
index 83dfca58a9f..00000000000
--- a/db/schema_migrations/20191031112603
+++ /dev/null
@@ -1 +0,0 @@
-f89da60d6dc1f28fc43f83d90153d5298425f6a357acf8e4a7e408553dd0d839 \ No newline at end of file
diff --git a/db/schema_migrations/20191101092917 b/db/schema_migrations/20191101092917
deleted file mode 100644
index c791ade4cf3..00000000000
--- a/db/schema_migrations/20191101092917
+++ /dev/null
@@ -1 +0,0 @@
-2c528df52c7a277e858282f28300c637d565f97b7ededce871dcc21f61aac601 \ No newline at end of file
diff --git a/db/schema_migrations/20191103202505 b/db/schema_migrations/20191103202505
deleted file mode 100644
index b1c25cd2604..00000000000
--- a/db/schema_migrations/20191103202505
+++ /dev/null
@@ -1 +0,0 @@
-bcae8632ac442e5d252e048ee875fea1c89d0fbbdd0c3b1e41cbae7a3d558c4a \ No newline at end of file
diff --git a/db/schema_migrations/20191104142124 b/db/schema_migrations/20191104142124
deleted file mode 100644
index 310159e120a..00000000000
--- a/db/schema_migrations/20191104142124
+++ /dev/null
@@ -1 +0,0 @@
-8eef2b56efe33e8e1e8d09e146ab996dca8395dc12d4bbdd16a7472b2e063711 \ No newline at end of file
diff --git a/db/schema_migrations/20191104205020 b/db/schema_migrations/20191104205020
deleted file mode 100644
index f0bab0c5ed4..00000000000
--- a/db/schema_migrations/20191104205020
+++ /dev/null
@@ -1 +0,0 @@
-2d83dea4cc432ee51f1918c9f07dffeced1050306a151c96944a4eaf85c13076 \ No newline at end of file
diff --git a/db/schema_migrations/20191105094558 b/db/schema_migrations/20191105094558
deleted file mode 100644
index 55dbd1d4a68..00000000000
--- a/db/schema_migrations/20191105094558
+++ /dev/null
@@ -1 +0,0 @@
-b306b35b2f71fde76ed385c057d69233f9fa1df628767c6f1cdcf3bae262b621 \ No newline at end of file
diff --git a/db/schema_migrations/20191105094625 b/db/schema_migrations/20191105094625
deleted file mode 100644
index 50452149a4d..00000000000
--- a/db/schema_migrations/20191105094625
+++ /dev/null
@@ -1 +0,0 @@
-17554775e0ef29ea7f459385d9b756f532c13501e63c1c998356f37d2023766b \ No newline at end of file
diff --git a/db/schema_migrations/20191105134413 b/db/schema_migrations/20191105134413
deleted file mode 100644
index c4b25b722f0..00000000000
--- a/db/schema_migrations/20191105134413
+++ /dev/null
@@ -1 +0,0 @@
-a6f3103dc78fe87beefc368ef43a65b6b856adfd31a29f1d3838c5df1ece99df \ No newline at end of file
diff --git a/db/schema_migrations/20191105140942 b/db/schema_migrations/20191105140942
deleted file mode 100644
index 2858b8b4341..00000000000
--- a/db/schema_migrations/20191105140942
+++ /dev/null
@@ -1 +0,0 @@
-54a4048a224f47163db97fba12ec85830014252ab5ec2697ad61f8c978e9243e \ No newline at end of file
diff --git a/db/schema_migrations/20191105155113 b/db/schema_migrations/20191105155113
deleted file mode 100644
index f9c41ecdec6..00000000000
--- a/db/schema_migrations/20191105155113
+++ /dev/null
@@ -1 +0,0 @@
-0f1825d0b0971c0ca115f134f82c7a0cad99279620163b77099d1f35089a33fe \ No newline at end of file
diff --git a/db/schema_migrations/20191105193652 b/db/schema_migrations/20191105193652
deleted file mode 100644
index cfaaf8839b1..00000000000
--- a/db/schema_migrations/20191105193652
+++ /dev/null
@@ -1 +0,0 @@
-676bf9f4379ac5d3d62f3c5a6252f656588a0163c3bdba4b79af866247e3d005 \ No newline at end of file
diff --git a/db/schema_migrations/20191106144901 b/db/schema_migrations/20191106144901
deleted file mode 100644
index 1baae965b5b..00000000000
--- a/db/schema_migrations/20191106144901
+++ /dev/null
@@ -1 +0,0 @@
-fb604a50cf68ae7fc972acfad2dbb6bef9b6b1e7d823cc24447cd56a038134c5 \ No newline at end of file
diff --git a/db/schema_migrations/20191106150931 b/db/schema_migrations/20191106150931
deleted file mode 100644
index 4df15f47d0a..00000000000
--- a/db/schema_migrations/20191106150931
+++ /dev/null
@@ -1 +0,0 @@
-cfe610ad6a068c8c22710a6a48cd0d93a8f45121130ef52742368282cc562f18 \ No newline at end of file
diff --git a/db/schema_migrations/20191107064946 b/db/schema_migrations/20191107064946
deleted file mode 100644
index 639d8c40e34..00000000000
--- a/db/schema_migrations/20191107064946
+++ /dev/null
@@ -1 +0,0 @@
-e747df6c445659cde93e8c326486293f365d0b5fc6dc05c97e4d406d37133836 \ No newline at end of file
diff --git a/db/schema_migrations/20191107173446 b/db/schema_migrations/20191107173446
deleted file mode 100644
index 30bbafae849..00000000000
--- a/db/schema_migrations/20191107173446
+++ /dev/null
@@ -1 +0,0 @@
-135798e88a08ceec8b173693c449039d7ae786a3a5d9943f4f0e066a23a7ae53 \ No newline at end of file
diff --git a/db/schema_migrations/20191107220314 b/db/schema_migrations/20191107220314
deleted file mode 100644
index 54dad8b9380..00000000000
--- a/db/schema_migrations/20191107220314
+++ /dev/null
@@ -1 +0,0 @@
-90f8776f92c44e4bb386cfc398c3201a01d7a2d80ae33e2858cf389d5e4dde38 \ No newline at end of file
diff --git a/db/schema_migrations/20191108031900 b/db/schema_migrations/20191108031900
deleted file mode 100644
index c1df584eb14..00000000000
--- a/db/schema_migrations/20191108031900
+++ /dev/null
@@ -1 +0,0 @@
-5b220440fa19932a1abdc393077dfafd8427984b3bca688e0de7ed98cdab1605 \ No newline at end of file
diff --git a/db/schema_migrations/20191108202723 b/db/schema_migrations/20191108202723
deleted file mode 100644
index dc8b603c3c1..00000000000
--- a/db/schema_migrations/20191108202723
+++ /dev/null
@@ -1 +0,0 @@
-c474888c59cf63770087c49bdc8ae754c88596ceba9cd5eeae1adae962ce6794 \ No newline at end of file
diff --git a/db/schema_migrations/20191111115229 b/db/schema_migrations/20191111115229
deleted file mode 100644
index 5b0967b499e..00000000000
--- a/db/schema_migrations/20191111115229
+++ /dev/null
@@ -1 +0,0 @@
-c28d6365a0cb3002f008afeda995273a3d73586a80d3588929b383245a4de637 \ No newline at end of file
diff --git a/db/schema_migrations/20191111115431 b/db/schema_migrations/20191111115431
deleted file mode 100644
index d65a53bad0b..00000000000
--- a/db/schema_migrations/20191111115431
+++ /dev/null
@@ -1 +0,0 @@
-8c2976f2b7c0570299a93243212045a29376b7dba9d1d89860b08df4a20d431d \ No newline at end of file
diff --git a/db/schema_migrations/20191111121500 b/db/schema_migrations/20191111121500
deleted file mode 100644
index cd82fce59d7..00000000000
--- a/db/schema_migrations/20191111121500
+++ /dev/null
@@ -1 +0,0 @@
-8dda577d540a309465d020297698d8295cc5e6be47aa5e6af6fe0e9fd513c476 \ No newline at end of file
diff --git a/db/schema_migrations/20191111165017 b/db/schema_migrations/20191111165017
deleted file mode 100644
index 11184389d08..00000000000
--- a/db/schema_migrations/20191111165017
+++ /dev/null
@@ -1 +0,0 @@
-166071d7da34dc22c015ff4df7a528d9fa7fd473c6b623a17c2f59a758346fef \ No newline at end of file
diff --git a/db/schema_migrations/20191111175230 b/db/schema_migrations/20191111175230
deleted file mode 100644
index 2fc2a91c160..00000000000
--- a/db/schema_migrations/20191111175230
+++ /dev/null
@@ -1 +0,0 @@
-6ed2940f332eb4d670c212468caaeefe0c06b10f4c937fe7a8feb1b0d6f714f2 \ No newline at end of file
diff --git a/db/schema_migrations/20191112023159 b/db/schema_migrations/20191112023159
deleted file mode 100644
index 38079c91cde..00000000000
--- a/db/schema_migrations/20191112023159
+++ /dev/null
@@ -1 +0,0 @@
-a94bc4da20d7677abd04f50790970ee122c6da0a07387575d466516b5aebde22 \ No newline at end of file
diff --git a/db/schema_migrations/20191112090226 b/db/schema_migrations/20191112090226
deleted file mode 100644
index 8bea3736831..00000000000
--- a/db/schema_migrations/20191112090226
+++ /dev/null
@@ -1 +0,0 @@
-589e90c48569f0ef1825e917a636c37e9248b1d82b8f21af81ee05c32c57f678 \ No newline at end of file
diff --git a/db/schema_migrations/20191112105448 b/db/schema_migrations/20191112105448
deleted file mode 100644
index 020f6d1343a..00000000000
--- a/db/schema_migrations/20191112105448
+++ /dev/null
@@ -1 +0,0 @@
-b2a22bd43c758201433bbe147960f9357b3fd2291b917a17b5835c32503b89da \ No newline at end of file
diff --git a/db/schema_migrations/20191112115247 b/db/schema_migrations/20191112115247
deleted file mode 100644
index 589b69df54c..00000000000
--- a/db/schema_migrations/20191112115247
+++ /dev/null
@@ -1 +0,0 @@
-e4724eacd46e73703be06bf6e65eb8eb870a713f21b39d4050f75f83b4bc9eaa \ No newline at end of file
diff --git a/db/schema_migrations/20191112115317 b/db/schema_migrations/20191112115317
deleted file mode 100644
index 9e7bc5fdaee..00000000000
--- a/db/schema_migrations/20191112115317
+++ /dev/null
@@ -1 +0,0 @@
-ef8e1c9c9b75b6ace8f477f3da7a525b0b7ad79d6c12608709b6a27d69edd3df \ No newline at end of file
diff --git a/db/schema_migrations/20191112212815 b/db/schema_migrations/20191112212815
deleted file mode 100644
index a1ca271d144..00000000000
--- a/db/schema_migrations/20191112212815
+++ /dev/null
@@ -1 +0,0 @@
-1cc9a4dce5a3225f13fb2f5ce7156384b3f8e82f01439177d4bbfa097bc2b87e \ No newline at end of file
diff --git a/db/schema_migrations/20191112214305 b/db/schema_migrations/20191112214305
deleted file mode 100644
index 84a639d72b6..00000000000
--- a/db/schema_migrations/20191112214305
+++ /dev/null
@@ -1 +0,0 @@
-45926e876035749c9fc117bd7686f52d201212460d024f89a98163ab84a31534 \ No newline at end of file
diff --git a/db/schema_migrations/20191112221821 b/db/schema_migrations/20191112221821
deleted file mode 100644
index 830817ed3ef..00000000000
--- a/db/schema_migrations/20191112221821
+++ /dev/null
@@ -1 +0,0 @@
-68eef55b06171c97366d9abba1f4a9d022cf82b9e7cf591fa9d50886806ed00c \ No newline at end of file
diff --git a/db/schema_migrations/20191112232338 b/db/schema_migrations/20191112232338
deleted file mode 100644
index 51e6bda7d1b..00000000000
--- a/db/schema_migrations/20191112232338
+++ /dev/null
@@ -1 +0,0 @@
-ffa4f057d920fe5b53d7e85bb4e9115dd155940ccdf324f3199d53788fa2e361 \ No newline at end of file
diff --git a/db/schema_migrations/20191114132259 b/db/schema_migrations/20191114132259
deleted file mode 100644
index 6c6aaeff794..00000000000
--- a/db/schema_migrations/20191114132259
+++ /dev/null
@@ -1 +0,0 @@
-411798b984888e8b59f1309592b586d83c00fe4fc947f770dbb82a793b003ec3 \ No newline at end of file
diff --git a/db/schema_migrations/20191114173508 b/db/schema_migrations/20191114173508
deleted file mode 100644
index 662001b9558..00000000000
--- a/db/schema_migrations/20191114173508
+++ /dev/null
@@ -1 +0,0 @@
-c12eb42c1a8dddfb3c7da69d438968196cd56fb6fce2e1b1ef52f2f8773b42a8 \ No newline at end of file
diff --git a/db/schema_migrations/20191114173602 b/db/schema_migrations/20191114173602
deleted file mode 100644
index cde41af2032..00000000000
--- a/db/schema_migrations/20191114173602
+++ /dev/null
@@ -1 +0,0 @@
-cd3d6a29af42beee5bb1669b5e4a86863390c8bf388258ee6080e75e1cfa9362 \ No newline at end of file
diff --git a/db/schema_migrations/20191114173624 b/db/schema_migrations/20191114173624
deleted file mode 100644
index f6c76fb5763..00000000000
--- a/db/schema_migrations/20191114173624
+++ /dev/null
@@ -1 +0,0 @@
-00755a10df51d6c4e9f7fa86b90d505fb87579297864d8b481e03e01a54a83e0 \ No newline at end of file
diff --git a/db/schema_migrations/20191114201118 b/db/schema_migrations/20191114201118
deleted file mode 100644
index 22a5c7ccbdc..00000000000
--- a/db/schema_migrations/20191114201118
+++ /dev/null
@@ -1 +0,0 @@
-dc95ddf9241cde3721a50dfb866280ca7050e351ebf014d77a5a89998eb0846a \ No newline at end of file
diff --git a/db/schema_migrations/20191114204343 b/db/schema_migrations/20191114204343
deleted file mode 100644
index 46c2dce360c..00000000000
--- a/db/schema_migrations/20191114204343
+++ /dev/null
@@ -1 +0,0 @@
-e7df7c03d36c594f3d190e4222a8ee0c89c80618af1edc87bae7a5a16f94514b \ No newline at end of file
diff --git a/db/schema_migrations/20191115001123 b/db/schema_migrations/20191115001123
deleted file mode 100644
index 99643a61a91..00000000000
--- a/db/schema_migrations/20191115001123
+++ /dev/null
@@ -1 +0,0 @@
-02df053be2ac9b0e158fe8c0d35cacff033e7c944dc480e2c47afe2eaedb537f \ No newline at end of file
diff --git a/db/schema_migrations/20191115001843 b/db/schema_migrations/20191115001843
deleted file mode 100644
index df8b7514477..00000000000
--- a/db/schema_migrations/20191115001843
+++ /dev/null
@@ -1 +0,0 @@
-d582cfcee296995729a1f417e06058bb8fff0f57f28958efcae4620a5134b228 \ No newline at end of file
diff --git a/db/schema_migrations/20191115091425 b/db/schema_migrations/20191115091425
deleted file mode 100644
index 0d558ded804..00000000000
--- a/db/schema_migrations/20191115091425
+++ /dev/null
@@ -1 +0,0 @@
-02aabd27a5429ff0e589be7d7b4e13a8d380067e072e0bd14ec6fc9dc6d3fbe6 \ No newline at end of file
diff --git a/db/schema_migrations/20191115114032 b/db/schema_migrations/20191115114032
deleted file mode 100644
index 70001f1996c..00000000000
--- a/db/schema_migrations/20191115114032
+++ /dev/null
@@ -1 +0,0 @@
-e7e2f7dc65de62e55e0014369f670460cd7c6350630bd6c738e2f147717a5bce \ No newline at end of file
diff --git a/db/schema_migrations/20191115115043 b/db/schema_migrations/20191115115043
deleted file mode 100644
index 1b30e4a8183..00000000000
--- a/db/schema_migrations/20191115115043
+++ /dev/null
@@ -1 +0,0 @@
-1e9d6316d394efec7427d18a7279b3019ebcec812f4a17394f9ea8a8d797c79a \ No newline at end of file
diff --git a/db/schema_migrations/20191115115522 b/db/schema_migrations/20191115115522
deleted file mode 100644
index b965534509a..00000000000
--- a/db/schema_migrations/20191115115522
+++ /dev/null
@@ -1 +0,0 @@
-f5bdf36ce3005bf05a1bf5366ac640a7e05ae96db62baae562be06c725482fdb \ No newline at end of file
diff --git a/db/schema_migrations/20191118053631 b/db/schema_migrations/20191118053631
deleted file mode 100644
index 187f360cc52..00000000000
--- a/db/schema_migrations/20191118053631
+++ /dev/null
@@ -1 +0,0 @@
-151cbd1c9e128ff84c980dfbf85f6a99ef13f243651d737b8392808f9c15d6c5 \ No newline at end of file
diff --git a/db/schema_migrations/20191118155702 b/db/schema_migrations/20191118155702
deleted file mode 100644
index aab201563cc..00000000000
--- a/db/schema_migrations/20191118155702
+++ /dev/null
@@ -1 +0,0 @@
-48c11c3018de0993c04d1dd57299516cc1598e2911976d8b9a58699d436c1952 \ No newline at end of file
diff --git a/db/schema_migrations/20191118173522 b/db/schema_migrations/20191118173522
deleted file mode 100644
index 18836d14b27..00000000000
--- a/db/schema_migrations/20191118173522
+++ /dev/null
@@ -1 +0,0 @@
-5d2e4a660af19488c53dcd6dd4ad66727c1fd4a1b3e00b41f8562ae1c8336c11 \ No newline at end of file
diff --git a/db/schema_migrations/20191118182722 b/db/schema_migrations/20191118182722
deleted file mode 100644
index 072601540c1..00000000000
--- a/db/schema_migrations/20191118182722
+++ /dev/null
@@ -1 +0,0 @@
-9353e82c3fc2c789a6b91e1d44379f98077af4ac8fef2366f5e97da08a60b4b4 \ No newline at end of file
diff --git a/db/schema_migrations/20191118211629 b/db/schema_migrations/20191118211629
deleted file mode 100644
index abb5f214776..00000000000
--- a/db/schema_migrations/20191118211629
+++ /dev/null
@@ -1 +0,0 @@
-38e968c5c9edcc270c6030e085ecb41734367865aa35c164a6c2d2bbfebb7ae2 \ No newline at end of file
diff --git a/db/schema_migrations/20191119023952 b/db/schema_migrations/20191119023952
deleted file mode 100644
index ca2ddf46c8f..00000000000
--- a/db/schema_migrations/20191119023952
+++ /dev/null
@@ -1 +0,0 @@
-508e64ebf857795c6ea728909de0fec27f0bdea23405bd0a436303f1c1cbd74e \ No newline at end of file
diff --git a/db/schema_migrations/20191119220425 b/db/schema_migrations/20191119220425
deleted file mode 100644
index 945d7467986..00000000000
--- a/db/schema_migrations/20191119220425
+++ /dev/null
@@ -1 +0,0 @@
-9873f12705ded66ae03992d1673e38acaf368cc5392c0873557b07a6c3900c29 \ No newline at end of file
diff --git a/db/schema_migrations/20191119221041 b/db/schema_migrations/20191119221041
deleted file mode 100644
index b831384a7db..00000000000
--- a/db/schema_migrations/20191119221041
+++ /dev/null
@@ -1 +0,0 @@
-348663c95591af2fa10017d943424378cfc25249aaa94a037fe68bc3427c78a3 \ No newline at end of file
diff --git a/db/schema_migrations/20191119231621 b/db/schema_migrations/20191119231621
deleted file mode 100644
index d65b128f7e6..00000000000
--- a/db/schema_migrations/20191119231621
+++ /dev/null
@@ -1 +0,0 @@
-49442aded13f614815ad96300b884f5e2134be92598247af6ee7e90efd85db19 \ No newline at end of file
diff --git a/db/schema_migrations/20191120084627 b/db/schema_migrations/20191120084627
deleted file mode 100644
index 474c68adc76..00000000000
--- a/db/schema_migrations/20191120084627
+++ /dev/null
@@ -1 +0,0 @@
-d7aa131444de95fc618f52b185e13926670509f65f381b25e9d63391bca64aae \ No newline at end of file
diff --git a/db/schema_migrations/20191120115530 b/db/schema_migrations/20191120115530
deleted file mode 100644
index 3d2ddd86a82..00000000000
--- a/db/schema_migrations/20191120115530
+++ /dev/null
@@ -1 +0,0 @@
-a5c2d8c38738909386be4de092f308d622dbcc380cc46e1a53dd860037c66fae \ No newline at end of file
diff --git a/db/schema_migrations/20191120200015 b/db/schema_migrations/20191120200015
deleted file mode 100644
index d7c7a00758a..00000000000
--- a/db/schema_migrations/20191120200015
+++ /dev/null
@@ -1 +0,0 @@
-0b7f93e7251838b260a4e9f3ce1b89fd4b14f635a7b0544b3a556584d9ad41c3 \ No newline at end of file
diff --git a/db/schema_migrations/20191121111621 b/db/schema_migrations/20191121111621
deleted file mode 100644
index a25a4b847e4..00000000000
--- a/db/schema_migrations/20191121111621
+++ /dev/null
@@ -1 +0,0 @@
-800bedef05e9773b347e5d72b6ebae3cfa45ef045af94644fba3402474db362b \ No newline at end of file
diff --git a/db/schema_migrations/20191121121947 b/db/schema_migrations/20191121121947
deleted file mode 100644
index 19be93bc700..00000000000
--- a/db/schema_migrations/20191121121947
+++ /dev/null
@@ -1 +0,0 @@
-0135cf6c1105d26d2c434e6d32314ad2b11222736b2931029b3cb4be39d172fc \ No newline at end of file
diff --git a/db/schema_migrations/20191121122856 b/db/schema_migrations/20191121122856
deleted file mode 100644
index d636d2f2e42..00000000000
--- a/db/schema_migrations/20191121122856
+++ /dev/null
@@ -1 +0,0 @@
-b3de8ff4f58b8d20f4d34739087c8983ad2418f1efee0fdd50cb67012a409ed1 \ No newline at end of file
diff --git a/db/schema_migrations/20191121161018 b/db/schema_migrations/20191121161018
deleted file mode 100644
index 36eb5aedf5e..00000000000
--- a/db/schema_migrations/20191121161018
+++ /dev/null
@@ -1 +0,0 @@
-bcbb1859922137c6bd3d93899ce4be67bb1994497a052a887046c3eb7922f441 \ No newline at end of file
diff --git a/db/schema_migrations/20191121193110 b/db/schema_migrations/20191121193110
deleted file mode 100644
index 9e048e03a75..00000000000
--- a/db/schema_migrations/20191121193110
+++ /dev/null
@@ -1 +0,0 @@
-5cd3737b48cab74481dabf03e8fe8fe6ed3c2011d2fb7abdd4eca9fe969da530 \ No newline at end of file
diff --git a/db/schema_migrations/20191122135327 b/db/schema_migrations/20191122135327
deleted file mode 100644
index 3b3c77194bb..00000000000
--- a/db/schema_migrations/20191122135327
+++ /dev/null
@@ -1 +0,0 @@
-ef3315cca7339b5065a5cb4b3f8710262e905677def259590eb368a5e71b4d71 \ No newline at end of file
diff --git a/db/schema_migrations/20191122161519 b/db/schema_migrations/20191122161519
deleted file mode 100644
index 8098e3a5efc..00000000000
--- a/db/schema_migrations/20191122161519
+++ /dev/null
@@ -1 +0,0 @@
-9bc79a55cbece3adb9e2d5b4c138d9920f13169002c1a1cf2cf61dab984f060e \ No newline at end of file
diff --git a/db/schema_migrations/20191123062354 b/db/schema_migrations/20191123062354
deleted file mode 100644
index 1c0c5cab53c..00000000000
--- a/db/schema_migrations/20191123062354
+++ /dev/null
@@ -1 +0,0 @@
-3ac43a9170cddcbd683bc6bc310127ac851cde57b521dbb3f2fc61a59f7e1257 \ No newline at end of file
diff --git a/db/schema_migrations/20191123081456 b/db/schema_migrations/20191123081456
deleted file mode 100644
index ad3a78bee6e..00000000000
--- a/db/schema_migrations/20191123081456
+++ /dev/null
@@ -1 +0,0 @@
-73d13f3061a9418c99753fd9e2c21eb829618fb37efc27c4c9f7dd53bd3f3490 \ No newline at end of file
diff --git a/db/schema_migrations/20191124150431 b/db/schema_migrations/20191124150431
deleted file mode 100644
index 0b86b4d6cfc..00000000000
--- a/db/schema_migrations/20191124150431
+++ /dev/null
@@ -1 +0,0 @@
-2a27f434c94f762d347964d69c19ddc082574ffde9ee0e8ca20d086986285e23 \ No newline at end of file
diff --git a/db/schema_migrations/20191125024005 b/db/schema_migrations/20191125024005
deleted file mode 100644
index 73273065f07..00000000000
--- a/db/schema_migrations/20191125024005
+++ /dev/null
@@ -1 +0,0 @@
-ce17e69c1031ac6f3b550053894dc4bd1e16afa70e24c426cc2ef393f08bbeaf \ No newline at end of file
diff --git a/db/schema_migrations/20191125114345 b/db/schema_migrations/20191125114345
deleted file mode 100644
index bd67bfa808a..00000000000
--- a/db/schema_migrations/20191125114345
+++ /dev/null
@@ -1 +0,0 @@
-eede24af63df5cd182f1ef405480c32848f0b529d71c6a93d5a5141dd079abe8 \ No newline at end of file
diff --git a/db/schema_migrations/20191125133353 b/db/schema_migrations/20191125133353
deleted file mode 100644
index 3b3d202a2cd..00000000000
--- a/db/schema_migrations/20191125133353
+++ /dev/null
@@ -1 +0,0 @@
-c0b3895d513b2908e011ec3cdabaafcdb2bead67b919c8b680201e0aa841a22b \ No newline at end of file
diff --git a/db/schema_migrations/20191125140458 b/db/schema_migrations/20191125140458
deleted file mode 100644
index f44a26a1969..00000000000
--- a/db/schema_migrations/20191125140458
+++ /dev/null
@@ -1 +0,0 @@
-7cb5f34aadb580710dbf1a49142ee379c8b17a10bf0b3819fb58b7acbd51ee33 \ No newline at end of file
diff --git a/db/schema_migrations/20191126134210 b/db/schema_migrations/20191126134210
deleted file mode 100644
index b0ad9e0a513..00000000000
--- a/db/schema_migrations/20191126134210
+++ /dev/null
@@ -1 +0,0 @@
-0bf3216da908ef4953875a5f1394106734149d0742937d16b6d24d690cac5e69 \ No newline at end of file
diff --git a/db/schema_migrations/20191127030005 b/db/schema_migrations/20191127030005
deleted file mode 100644
index a3b3edd3efe..00000000000
--- a/db/schema_migrations/20191127030005
+++ /dev/null
@@ -1 +0,0 @@
-bf8b4eee3ce310111dcfadf257ac1fb5e1e4c8a4409a9a8f8f35ab60ef767d09 \ No newline at end of file
diff --git a/db/schema_migrations/20191127151619 b/db/schema_migrations/20191127151619
deleted file mode 100644
index 22b9d2403d1..00000000000
--- a/db/schema_migrations/20191127151619
+++ /dev/null
@@ -1 +0,0 @@
-b47b88a03e32f98e50583ac85730e6d031ae77df0bc7cc815a6dd43878829b2b \ No newline at end of file
diff --git a/db/schema_migrations/20191127151629 b/db/schema_migrations/20191127151629
deleted file mode 100644
index becdf2e772a..00000000000
--- a/db/schema_migrations/20191127151629
+++ /dev/null
@@ -1 +0,0 @@
-6720ca3efa4a504757aa9681652016bb8cf9e4f406821f06cdcc59abf12664de \ No newline at end of file
diff --git a/db/schema_migrations/20191127163053 b/db/schema_migrations/20191127163053
deleted file mode 100644
index 0f4e8d350cc..00000000000
--- a/db/schema_migrations/20191127163053
+++ /dev/null
@@ -1 +0,0 @@
-5524515ba60ded269468da8343239c2c7f168cf876976b8338180987f9cc00d7 \ No newline at end of file
diff --git a/db/schema_migrations/20191127221608 b/db/schema_migrations/20191127221608
deleted file mode 100644
index 905940ef6f2..00000000000
--- a/db/schema_migrations/20191127221608
+++ /dev/null
@@ -1 +0,0 @@
-790d79b3198e433a423ca6368ab1ee8f5bfe7bb9f50f167eab5cd26343befd6d \ No newline at end of file
diff --git a/db/schema_migrations/20191128145231 b/db/schema_migrations/20191128145231
deleted file mode 100644
index 99088cbb0e0..00000000000
--- a/db/schema_migrations/20191128145231
+++ /dev/null
@@ -1 +0,0 @@
-f37d6731aca878a9d9fc5d5d63c4c26064df92d5ff9234fe2f8bafa1a5a702c0 \ No newline at end of file
diff --git a/db/schema_migrations/20191128145232 b/db/schema_migrations/20191128145232
deleted file mode 100644
index fdd4c03c66e..00000000000
--- a/db/schema_migrations/20191128145232
+++ /dev/null
@@ -1 +0,0 @@
-9693807e665dd620f4d91ed9005214e92644a834fb9cc87a5a3fbb72561310c6 \ No newline at end of file
diff --git a/db/schema_migrations/20191128145233 b/db/schema_migrations/20191128145233
deleted file mode 100644
index 67cfd23dc7e..00000000000
--- a/db/schema_migrations/20191128145233
+++ /dev/null
@@ -1 +0,0 @@
-ded5dd8872c7bd294cc4f181beddad51d4f88c7c497522bc53b88a2070ca7f9f \ No newline at end of file
diff --git a/db/schema_migrations/20191128162854 b/db/schema_migrations/20191128162854
deleted file mode 100644
index 931cd3d3dc2..00000000000
--- a/db/schema_migrations/20191128162854
+++ /dev/null
@@ -1 +0,0 @@
-d38c0cc2a3850ed3de1b9656a81224dee07d8c5a406e82da54be43dc2d63f973 \ No newline at end of file
diff --git a/db/schema_migrations/20191129134844 b/db/schema_migrations/20191129134844
deleted file mode 100644
index dd4384a7877..00000000000
--- a/db/schema_migrations/20191129134844
+++ /dev/null
@@ -1 +0,0 @@
-1618b03d59e3ad874830a3ff4cae7b8975cf5ea210b2d853b69058c0e1e5c1f7 \ No newline at end of file
diff --git a/db/schema_migrations/20191129144630 b/db/schema_migrations/20191129144630
deleted file mode 100644
index 669b83f6b24..00000000000
--- a/db/schema_migrations/20191129144630
+++ /dev/null
@@ -1 +0,0 @@
-f0c2bb375fc98f9252b84a2d5591f34612059aa0486bb7653010b2de2f21e901 \ No newline at end of file
diff --git a/db/schema_migrations/20191129144631 b/db/schema_migrations/20191129144631
deleted file mode 100644
index 300c05098b1..00000000000
--- a/db/schema_migrations/20191129144631
+++ /dev/null
@@ -1 +0,0 @@
-60a7466cabad9f758b6325ffdcfb70e0ef50d6730a90b9206169b1a814386326 \ No newline at end of file
diff --git a/db/schema_migrations/20191202031812 b/db/schema_migrations/20191202031812
deleted file mode 100644
index 345863c4a78..00000000000
--- a/db/schema_migrations/20191202031812
+++ /dev/null
@@ -1 +0,0 @@
-076331d9d33a8b4243d1d10f30729874bc738229780341225a5d16c7e5b83819 \ No newline at end of file
diff --git a/db/schema_migrations/20191202181924 b/db/schema_migrations/20191202181924
deleted file mode 100644
index eeda8fe8a58..00000000000
--- a/db/schema_migrations/20191202181924
+++ /dev/null
@@ -1 +0,0 @@
-d30901aa01b60fc2563a87d283b6129be500a35dd2f7bc546e916ca11524780a \ No newline at end of file
diff --git a/db/schema_migrations/20191203121729 b/db/schema_migrations/20191203121729
deleted file mode 100644
index 90598d8b7a7..00000000000
--- a/db/schema_migrations/20191203121729
+++ /dev/null
@@ -1 +0,0 @@
-1756e668eead8c08d0c454e5f05d57e4606e027cd7944cec5856b9e7a26a91a6 \ No newline at end of file
diff --git a/db/schema_migrations/20191204070713 b/db/schema_migrations/20191204070713
deleted file mode 100644
index 14231887fb4..00000000000
--- a/db/schema_migrations/20191204070713
+++ /dev/null
@@ -1 +0,0 @@
-d071149c8a56e1af6afc1c10c3e6113fad2f71fefede9867d9d69121e91c41a3 \ No newline at end of file
diff --git a/db/schema_migrations/20191204093410 b/db/schema_migrations/20191204093410
deleted file mode 100644
index 0a5dc3932ac..00000000000
--- a/db/schema_migrations/20191204093410
+++ /dev/null
@@ -1 +0,0 @@
-037cbdf9a42a3b0c8dd46f3d52101f56d971c9999cfc94aae13fc48e8c670a7d \ No newline at end of file
diff --git a/db/schema_migrations/20191204114127 b/db/schema_migrations/20191204114127
deleted file mode 100644
index 57c598ad04d..00000000000
--- a/db/schema_migrations/20191204114127
+++ /dev/null
@@ -1 +0,0 @@
-4c53b91c2d18650887c782f4dcf2584ea81b3b332f68c5e082b0458510390e0a \ No newline at end of file
diff --git a/db/schema_migrations/20191204192726 b/db/schema_migrations/20191204192726
deleted file mode 100644
index 5dc426cfec4..00000000000
--- a/db/schema_migrations/20191204192726
+++ /dev/null
@@ -1 +0,0 @@
-4725cd3b4deb5757c26261a859ca6da50c610019c709b533f7ef1c4fa7f75853 \ No newline at end of file
diff --git a/db/schema_migrations/20191205060723 b/db/schema_migrations/20191205060723
deleted file mode 100644
index 3bf073b1ba8..00000000000
--- a/db/schema_migrations/20191205060723
+++ /dev/null
@@ -1 +0,0 @@
-7de885bae1daefc9215a3cadb2fd827f9b9317d8fa264e4f93db6049760abd6b \ No newline at end of file
diff --git a/db/schema_migrations/20191205084057 b/db/schema_migrations/20191205084057
deleted file mode 100644
index a6f81ff151e..00000000000
--- a/db/schema_migrations/20191205084057
+++ /dev/null
@@ -1 +0,0 @@
-4c19ab1d92e17d8f4c1ede1bf531bb10f49ae7de652d1e095e8960b9389cc1ca \ No newline at end of file
diff --git a/db/schema_migrations/20191205094702 b/db/schema_migrations/20191205094702
deleted file mode 100644
index b3517ddf4a0..00000000000
--- a/db/schema_migrations/20191205094702
+++ /dev/null
@@ -1 +0,0 @@
-05d06d068a1aa69a0cc98c2afbb29f56383c8a9f359a384c0f507a1772691364 \ No newline at end of file
diff --git a/db/schema_migrations/20191205145647 b/db/schema_migrations/20191205145647
deleted file mode 100644
index 1b15d2b4678..00000000000
--- a/db/schema_migrations/20191205145647
+++ /dev/null
@@ -1 +0,0 @@
-01fda9edd67623e926ef8f69df6b9bb513e104e946eb1792962c1a53300314ce \ No newline at end of file
diff --git a/db/schema_migrations/20191205212923 b/db/schema_migrations/20191205212923
deleted file mode 100644
index 772445da80a..00000000000
--- a/db/schema_migrations/20191205212923
+++ /dev/null
@@ -1 +0,0 @@
-638b863fa43469ae13e1a6c26641ca78efd540f37c65e0cdde84ce50094d0b19 \ No newline at end of file
diff --git a/db/schema_migrations/20191205212924 b/db/schema_migrations/20191205212924
deleted file mode 100644
index e50daa13b35..00000000000
--- a/db/schema_migrations/20191205212924
+++ /dev/null
@@ -1 +0,0 @@
-63fbe631eb572d7f81f17ea6915677733d9b6721c63f1ef7deeaa59ee8d3ae73 \ No newline at end of file
diff --git a/db/schema_migrations/20191206014412 b/db/schema_migrations/20191206014412
deleted file mode 100644
index a87cf83eddf..00000000000
--- a/db/schema_migrations/20191206014412
+++ /dev/null
@@ -1 +0,0 @@
-69ef905f6d998d95d61d685c7779779cca9c92dc788d9a184de75db8c879473e \ No newline at end of file
diff --git a/db/schema_migrations/20191206022133 b/db/schema_migrations/20191206022133
deleted file mode 100644
index 92eb71e3845..00000000000
--- a/db/schema_migrations/20191206022133
+++ /dev/null
@@ -1 +0,0 @@
-81aaa536db74a7a66d6ee0fcdfa76762b5c14a00394c22d503264585cb1200c7 \ No newline at end of file
diff --git a/db/schema_migrations/20191206122926 b/db/schema_migrations/20191206122926
deleted file mode 100644
index c61d1af8d57..00000000000
--- a/db/schema_migrations/20191206122926
+++ /dev/null
@@ -1 +0,0 @@
-a6f27e42abe8fed6bc3b0ee258cbf726c9333f668c8505f01b7e6315070bb558 \ No newline at end of file
diff --git a/db/schema_migrations/20191207104000 b/db/schema_migrations/20191207104000
deleted file mode 100644
index c73265e1199..00000000000
--- a/db/schema_migrations/20191207104000
+++ /dev/null
@@ -1 +0,0 @@
-6e187a835f10cce06751a1e947aa959b0e2d502a34f06b35f9d3cfdf2cebfb10 \ No newline at end of file
diff --git a/db/schema_migrations/20191208071111 b/db/schema_migrations/20191208071111
deleted file mode 100644
index 036aa083776..00000000000
--- a/db/schema_migrations/20191208071111
+++ /dev/null
@@ -1 +0,0 @@
-8981bd157b2f8d2b1266a6fb6010512db62b87c70de1697f823c9e640e7c388e \ No newline at end of file
diff --git a/db/schema_migrations/20191208071112 b/db/schema_migrations/20191208071112
deleted file mode 100644
index 5d31e770144..00000000000
--- a/db/schema_migrations/20191208071112
+++ /dev/null
@@ -1 +0,0 @@
-605bf0362a0d8d49d90988b3d2cbae090b2e8581abb92917dc7a9386523078b0 \ No newline at end of file
diff --git a/db/schema_migrations/20191208110214 b/db/schema_migrations/20191208110214
deleted file mode 100644
index 4dd809b90d4..00000000000
--- a/db/schema_migrations/20191208110214
+++ /dev/null
@@ -1 +0,0 @@
-465e9e689823449a33572ee5a627d013588d7ccc5c76ae91de4c7c234e45e3ca \ No newline at end of file
diff --git a/db/schema_migrations/20191209143606 b/db/schema_migrations/20191209143606
deleted file mode 100644
index b6c338450ab..00000000000
--- a/db/schema_migrations/20191209143606
+++ /dev/null
@@ -1 +0,0 @@
-d3d75b6d9ff04a962f6cb5658bae562283192c87abeb14e892acf0bb6687889c \ No newline at end of file
diff --git a/db/schema_migrations/20191209215316 b/db/schema_migrations/20191209215316
deleted file mode 100644
index 81aaae042b2..00000000000
--- a/db/schema_migrations/20191209215316
+++ /dev/null
@@ -1 +0,0 @@
-e806129b477df3b35e1f07a3b99f0401b274501f3f31eb4129ce36ca0f74722e \ No newline at end of file
diff --git a/db/schema_migrations/20191210211253 b/db/schema_migrations/20191210211253
deleted file mode 100644
index 454b42ad4f7..00000000000
--- a/db/schema_migrations/20191210211253
+++ /dev/null
@@ -1 +0,0 @@
-f6f67802ab8cc8afbe71665bbc64bec9aeb449e906cd5a56707397eb16a1fb66 \ No newline at end of file
diff --git a/db/schema_migrations/20191212140117 b/db/schema_migrations/20191212140117
deleted file mode 100644
index 613824d8cad..00000000000
--- a/db/schema_migrations/20191212140117
+++ /dev/null
@@ -1 +0,0 @@
-1d83c19bb8d866dd60dcc53f306a11a6316a854bb8d875ecab022460a2b07d1d \ No newline at end of file
diff --git a/db/schema_migrations/20191212162434 b/db/schema_migrations/20191212162434
deleted file mode 100644
index 4083063602c..00000000000
--- a/db/schema_migrations/20191212162434
+++ /dev/null
@@ -1 +0,0 @@
-d1abf53b84833acf974c32a1d4223fdd47479d5022a292e349b6e24b3751c439 \ No newline at end of file
diff --git a/db/schema_migrations/20191213104838 b/db/schema_migrations/20191213104838
deleted file mode 100644
index b3169815754..00000000000
--- a/db/schema_migrations/20191213104838
+++ /dev/null
@@ -1 +0,0 @@
-fdfa2335789ddb9508fdf4a73e29df2a5a3dbfb397baf61d921ec317a6be969f \ No newline at end of file
diff --git a/db/schema_migrations/20191213120427 b/db/schema_migrations/20191213120427
deleted file mode 100644
index 0a082dd2505..00000000000
--- a/db/schema_migrations/20191213120427
+++ /dev/null
@@ -1 +0,0 @@
-d24902d0d5dc88dded911c37e88dc0761fe78fc79a25e3fb8504ac220534afde \ No newline at end of file
diff --git a/db/schema_migrations/20191213143656 b/db/schema_migrations/20191213143656
deleted file mode 100644
index 3c45a480d46..00000000000
--- a/db/schema_migrations/20191213143656
+++ /dev/null
@@ -1 +0,0 @@
-f9582688d3c2a1a28aab27d165e790e011aa2a5c0200469025d00d29c6b505e7 \ No newline at end of file
diff --git a/db/schema_migrations/20191213184609 b/db/schema_migrations/20191213184609
deleted file mode 100644
index 16451d7305f..00000000000
--- a/db/schema_migrations/20191213184609
+++ /dev/null
@@ -1 +0,0 @@
-fd170a2470e33efc2a6c0fd69afd4fc36865984c187182071a89085af5aea224 \ No newline at end of file
diff --git a/db/schema_migrations/20191214175727 b/db/schema_migrations/20191214175727
deleted file mode 100644
index 045c2016393..00000000000
--- a/db/schema_migrations/20191214175727
+++ /dev/null
@@ -1 +0,0 @@
-086133ceb36365c403246a6414b863b2997b2c7c74a1e8ee7c9c8992dfb3ccc3 \ No newline at end of file
diff --git a/db/schema_migrations/20191216074800 b/db/schema_migrations/20191216074800
deleted file mode 100644
index 0b893f38a8a..00000000000
--- a/db/schema_migrations/20191216074800
+++ /dev/null
@@ -1 +0,0 @@
-7de7138769fac2fb1ad346df12a3d88cb72b813df10f70d25fb26ab8b863e34a \ No newline at end of file
diff --git a/db/schema_migrations/20191216074802 b/db/schema_migrations/20191216074802
deleted file mode 100644
index 9f874f446a3..00000000000
--- a/db/schema_migrations/20191216074802
+++ /dev/null
@@ -1 +0,0 @@
-1d934cb6bc07b0684cc0662dfc5416dcdddb29c01eb53de46735497a114b51f3 \ No newline at end of file
diff --git a/db/schema_migrations/20191216074803 b/db/schema_migrations/20191216074803
deleted file mode 100644
index fa90882e2d5..00000000000
--- a/db/schema_migrations/20191216074803
+++ /dev/null
@@ -1 +0,0 @@
-2f112fdcc370faa7a296a178c64970610e98957a877ca38b72e9a074e14f5f47 \ No newline at end of file
diff --git a/db/schema_migrations/20191216094119 b/db/schema_migrations/20191216094119
deleted file mode 100644
index a84c0cd2c3d..00000000000
--- a/db/schema_migrations/20191216094119
+++ /dev/null
@@ -1 +0,0 @@
-fb45283e30820a5e6df39bc2c7c9e573f5c3cc2f00ca61d69a9cea91d2e52652 \ No newline at end of file
diff --git a/db/schema_migrations/20191216183531 b/db/schema_migrations/20191216183531
deleted file mode 100644
index 8dd707681f3..00000000000
--- a/db/schema_migrations/20191216183531
+++ /dev/null
@@ -1 +0,0 @@
-0141e744f0690f8e21a7827eac9143e3e3da690e7c115e713da627a0c4969faa \ No newline at end of file
diff --git a/db/schema_migrations/20191216183532 b/db/schema_migrations/20191216183532
deleted file mode 100644
index 7ecab29585d..00000000000
--- a/db/schema_migrations/20191216183532
+++ /dev/null
@@ -1 +0,0 @@
-1224e0bcf021942623b90572a3f90b9ae287db440057b5438826c28be10998d6 \ No newline at end of file
diff --git a/db/schema_migrations/20191217165641 b/db/schema_migrations/20191217165641
deleted file mode 100644
index 27d596cc2e0..00000000000
--- a/db/schema_migrations/20191217165641
+++ /dev/null
@@ -1 +0,0 @@
-a947d467ef4f0016822877103c5cc583976986260dac6bcbacbc72074f34ff41 \ No newline at end of file
diff --git a/db/schema_migrations/20191217212348 b/db/schema_migrations/20191217212348
deleted file mode 100644
index dca07895c12..00000000000
--- a/db/schema_migrations/20191217212348
+++ /dev/null
@@ -1 +0,0 @@
-4935f553417c0976253b01fe2ab1bfe1e1604b91f98ebd2449ca5d8093fd8fe0 \ No newline at end of file
diff --git a/db/schema_migrations/20191218084115 b/db/schema_migrations/20191218084115
deleted file mode 100644
index be5900fb1c4..00000000000
--- a/db/schema_migrations/20191218084115
+++ /dev/null
@@ -1 +0,0 @@
-5ae357b24a85d0b6af4a0431f15c484d438bffb43a326f5d480549a1cf7e54b9 \ No newline at end of file
diff --git a/db/schema_migrations/20191218122457 b/db/schema_migrations/20191218122457
deleted file mode 100644
index 1184b0b01f0..00000000000
--- a/db/schema_migrations/20191218122457
+++ /dev/null
@@ -1 +0,0 @@
-9294caff6d0f3378991fb01a27b42f91516370f79be80242ec3fb8198d42da12 \ No newline at end of file
diff --git a/db/schema_migrations/20191218124915 b/db/schema_migrations/20191218124915
deleted file mode 100644
index 5018f9df047..00000000000
--- a/db/schema_migrations/20191218124915
+++ /dev/null
@@ -1 +0,0 @@
-9e9c6d0f0a566baa34e8d0eefd1aefe83f410c7e9434f9656afe978d5b145f68 \ No newline at end of file
diff --git a/db/schema_migrations/20191218125015 b/db/schema_migrations/20191218125015
deleted file mode 100644
index c82bca1a951..00000000000
--- a/db/schema_migrations/20191218125015
+++ /dev/null
@@ -1 +0,0 @@
-355f5e7a57a7375463acac0ff65248342177deb7331c14058f6d99a43b8ded53 \ No newline at end of file
diff --git a/db/schema_migrations/20191218190253 b/db/schema_migrations/20191218190253
deleted file mode 100644
index 9c9d23629bc..00000000000
--- a/db/schema_migrations/20191218190253
+++ /dev/null
@@ -1 +0,0 @@
-8a922655ef936ae6e7bf908d72a2abd3f86e98d49f0368015f41037d542dcd6b \ No newline at end of file
diff --git a/db/schema_migrations/20191218225624 b/db/schema_migrations/20191218225624
deleted file mode 100644
index 94de7b6ba9f..00000000000
--- a/db/schema_migrations/20191218225624
+++ /dev/null
@@ -1 +0,0 @@
-7b6353cddda5a112f07aab18d60a1f19b7642ff8e28c230cf7c70f60d9f72786 \ No newline at end of file
diff --git a/db/schema_migrations/20191223124940 b/db/schema_migrations/20191223124940
deleted file mode 100644
index dc8f1cfabed..00000000000
--- a/db/schema_migrations/20191223124940
+++ /dev/null
@@ -1 +0,0 @@
-301ed1f9806c487f4881a9a106e279886fee673f3a5a0b8286be42bef7dd71ca \ No newline at end of file
diff --git a/db/schema_migrations/20191225071320 b/db/schema_migrations/20191225071320
deleted file mode 100644
index a619481bc3d..00000000000
--- a/db/schema_migrations/20191225071320
+++ /dev/null
@@ -1 +0,0 @@
-f121043e5aab5ea296d097aaa6d67578a79b5adf880b21131cb6acf47d9b4043 \ No newline at end of file
diff --git a/db/schema_migrations/20191227140254 b/db/schema_migrations/20191227140254
deleted file mode 100644
index fdc502a2343..00000000000
--- a/db/schema_migrations/20191227140254
+++ /dev/null
@@ -1 +0,0 @@
-6d6f619112cdee207974400e32c4de69de0c46886970e98c14f4f8bf2e8cba16 \ No newline at end of file
diff --git a/db/schema_migrations/20191229140154 b/db/schema_migrations/20191229140154
deleted file mode 100644
index 206302fc44c..00000000000
--- a/db/schema_migrations/20191229140154
+++ /dev/null
@@ -1 +0,0 @@
-88847b6705613c12002bd87adc5c3d966a4a6a68515a613e633ca56e0ec769f1 \ No newline at end of file
diff --git a/db/schema_migrations/20210819185500 b/db/schema_migrations/20210819185500
new file mode 100644
index 00000000000..1f92c1d81a9
--- /dev/null
+++ b/db/schema_migrations/20210819185500
@@ -0,0 +1 @@
+eab87cb4abfad7542fcff7c25d984e4a7588c824a13b379cb16c87d0c077cfbb \ No newline at end of file
diff --git a/db/schema_migrations/20210906130643 b/db/schema_migrations/20210906130643
new file mode 100644
index 00000000000..150e594026d
--- /dev/null
+++ b/db/schema_migrations/20210906130643
@@ -0,0 +1 @@
+c707c0879e439de95f24f8fe2084388276a46c5e0ee30e4134a43e22ca19b4ec \ No newline at end of file
diff --git a/db/schema_migrations/20210907013944 b/db/schema_migrations/20210907013944
new file mode 100644
index 00000000000..97cf6ef7b2f
--- /dev/null
+++ b/db/schema_migrations/20210907013944
@@ -0,0 +1 @@
+1a449d347248cacae48d10340c5682abe6de57d2991712f4e0a39c921892e0c5 \ No newline at end of file
diff --git a/db/schema_migrations/20210908195506 b/db/schema_migrations/20210908195506
new file mode 100644
index 00000000000..8680c7639d0
--- /dev/null
+++ b/db/schema_migrations/20210908195506
@@ -0,0 +1 @@
+1ad794ac96f6297203046562c2ec422fbb4d1818a65266bb92179096040f7d82 \ No newline at end of file
diff --git a/db/schema_migrations/20210910014741 b/db/schema_migrations/20210910014741
new file mode 100644
index 00000000000..b0f32fcabf3
--- /dev/null
+++ b/db/schema_migrations/20210910014741
@@ -0,0 +1 @@
+e6342d440d398980470f4dd018c5df56d0b5d4df11caa7ba5dd2e92578dbf678 \ No newline at end of file
diff --git a/db/schema_migrations/20210910015047 b/db/schema_migrations/20210910015047
new file mode 100644
index 00000000000..3f76060a9bb
--- /dev/null
+++ b/db/schema_migrations/20210910015047
@@ -0,0 +1 @@
+d0b2ee97781a5d3c671b855fb6be844431a73584be47ba35d83c7e8cfec69bcb \ No newline at end of file
diff --git a/db/schema_migrations/20210910192921 b/db/schema_migrations/20210910192921
new file mode 100644
index 00000000000..d593bca14ac
--- /dev/null
+++ b/db/schema_migrations/20210910192921
@@ -0,0 +1 @@
+48b5f8e614117ac5f1e7af4ab85a8835c3b3b34103154565dd7ef6f541dd3c37 \ No newline at end of file
diff --git a/db/schema_migrations/20210910194952 b/db/schema_migrations/20210910194952
new file mode 100644
index 00000000000..2af73174c34
--- /dev/null
+++ b/db/schema_migrations/20210910194952
@@ -0,0 +1 @@
+b805a0d3143f968343694ec864b38ba4991931131e8a5082dcd719420328a3ef \ No newline at end of file
diff --git a/db/schema_migrations/20210912034903 b/db/schema_migrations/20210912034903
new file mode 100644
index 00000000000..8003a5b110c
--- /dev/null
+++ b/db/schema_migrations/20210912034903
@@ -0,0 +1 @@
+76bfbf3f12fed895c3cfb891080b5a452d1204c83ce96736048f857b33458ad1 \ No newline at end of file
diff --git a/db/schema_migrations/20210913224558 b/db/schema_migrations/20210913224558
new file mode 100644
index 00000000000..f2fb4eaeb71
--- /dev/null
+++ b/db/schema_migrations/20210913224558
@@ -0,0 +1 @@
+377af41414793d7e52ffbb1fd60f2f19c58cd63bb0e85192983b5bfe98515ae8 \ No newline at end of file
diff --git a/db/schema_migrations/20210914145810 b/db/schema_migrations/20210914145810
new file mode 100644
index 00000000000..1c2cdc8cbf2
--- /dev/null
+++ b/db/schema_migrations/20210914145810
@@ -0,0 +1 @@
+a30acb6d2a3772be29dfefc7d8cda2f2df94002556fa5de85483b7fca245be86 \ No newline at end of file
diff --git a/db/schema_migrations/20210914172202 b/db/schema_migrations/20210914172202
new file mode 100644
index 00000000000..2f7531b98aa
--- /dev/null
+++ b/db/schema_migrations/20210914172202
@@ -0,0 +1 @@
+2ab67d4cc17d0fdf01b5861a46d6ec51d1e76e7e88209b0964a884edd22cc63d \ No newline at end of file
diff --git a/db/schema_migrations/20210915000453 b/db/schema_migrations/20210915000453
new file mode 100644
index 00000000000..611af2b1310
--- /dev/null
+++ b/db/schema_migrations/20210915000453
@@ -0,0 +1 @@
+ffb4e066420e1492550255e5866df6dc9f83d3d6cec9033284c4c3194d53b827 \ No newline at end of file
diff --git a/db/schema_migrations/20210915001242 b/db/schema_migrations/20210915001242
new file mode 100644
index 00000000000..7aa9b5c5787
--- /dev/null
+++ b/db/schema_migrations/20210915001242
@@ -0,0 +1 @@
+fc8f86f794d77902fd86acaec6046b65821ff685f841d28158dc05fb55773c16 \ No newline at end of file
diff --git a/db/schema_migrations/20210915022415 b/db/schema_migrations/20210915022415
new file mode 100644
index 00000000000..ab3ca284269
--- /dev/null
+++ b/db/schema_migrations/20210915022415
@@ -0,0 +1 @@
+ecb73d9a0be0cf04a8b405f1225d1a5de2fcdbb4c277fd5549f72a7a21596cdc \ No newline at end of file
diff --git a/db/schema_migrations/20210915070423 b/db/schema_migrations/20210915070423
new file mode 100644
index 00000000000..772226db1dd
--- /dev/null
+++ b/db/schema_migrations/20210915070423
@@ -0,0 +1 @@
+f11b237fab6b4133c73f1d6105d85c8db1548b6d0753b2fd96f613c90a4fa3c1 \ No newline at end of file
diff --git a/db/schema_migrations/20210916132547 b/db/schema_migrations/20210916132547
new file mode 100644
index 00000000000..69932a531d9
--- /dev/null
+++ b/db/schema_migrations/20210916132547
@@ -0,0 +1 @@
+d0953fdbaa6cf656e298ea482b3e3f931254276cb2285cffafba3d94b0626d3f \ No newline at end of file
diff --git a/db/schema_migrations/20210917134321 b/db/schema_migrations/20210917134321
new file mode 100644
index 00000000000..3c5c397ecbf
--- /dev/null
+++ b/db/schema_migrations/20210917134321
@@ -0,0 +1 @@
+a0ba9fb9e2f7f738926a2273f9ff644c43acb999f4d27adf192e5006582a2a0e \ No newline at end of file
diff --git a/db/schema_migrations/20210917153645 b/db/schema_migrations/20210917153645
new file mode 100644
index 00000000000..483c6153a24
--- /dev/null
+++ b/db/schema_migrations/20210917153645
@@ -0,0 +1 @@
+fb4c7ce2ed33b3843fbaaf34ea6dbb6db52776039db62b0ab0bb880744f615d1 \ No newline at end of file
diff --git a/db/schema_migrations/20210917153905 b/db/schema_migrations/20210917153905
new file mode 100644
index 00000000000..a4e424dfad3
--- /dev/null
+++ b/db/schema_migrations/20210917153905
@@ -0,0 +1 @@
+3f0ac2bbfdfe6a2c05043e02ec383bdc7787f86741d6b2df7da2cc6a7aef9ce3 \ No newline at end of file
diff --git a/db/schema_migrations/20210917224419 b/db/schema_migrations/20210917224419
new file mode 100644
index 00000000000..a8b059e7b8d
--- /dev/null
+++ b/db/schema_migrations/20210917224419
@@ -0,0 +1 @@
+9204c844b22ad0d3a938ed908377c8baacdda038725a5cf105e4b11841c1ae21 \ No newline at end of file
diff --git a/db/schema_migrations/20210918201050 b/db/schema_migrations/20210918201050
new file mode 100644
index 00000000000..9c8f28bd813
--- /dev/null
+++ b/db/schema_migrations/20210918201050
@@ -0,0 +1 @@
+596fd274ca1d0b2ce8698e048fea6080c9b777c48febb35a4917a6027826908e \ No newline at end of file
diff --git a/db/schema_migrations/20210918202855 b/db/schema_migrations/20210918202855
new file mode 100644
index 00000000000..f9d48eb269f
--- /dev/null
+++ b/db/schema_migrations/20210918202855
@@ -0,0 +1 @@
+a735ae13c13f5492a5c16d3e60884b60c44d1d57f6aaacaea13f3b1bf00a8d78 \ No newline at end of file
diff --git a/db/schema_migrations/20210920104446 b/db/schema_migrations/20210920104446
new file mode 100644
index 00000000000..4687dca7d3c
--- /dev/null
+++ b/db/schema_migrations/20210920104446
@@ -0,0 +1 @@
+e7e9b13874081a7df42d07ccc9a54fb81973210d1c175cd995300f6339d57495 \ No newline at end of file
diff --git a/db/schema_migrations/20210920232025 b/db/schema_migrations/20210920232025
new file mode 100644
index 00000000000..1c5b248981f
--- /dev/null
+++ b/db/schema_migrations/20210920232025
@@ -0,0 +1 @@
+12dfb473067fc836cd435474405c3ca978d159a13e975f7663fe22c078731fd1 \ No newline at end of file
diff --git a/db/schema_migrations/20210921032008 b/db/schema_migrations/20210921032008
new file mode 100644
index 00000000000..058a4366e4a
--- /dev/null
+++ b/db/schema_migrations/20210921032008
@@ -0,0 +1 @@
+262127539fc16715a56e2cf7426f0f8d24922e26847a01a0a15552d71cd148f8 \ No newline at end of file
diff --git a/db/schema_migrations/20210921062820 b/db/schema_migrations/20210921062820
new file mode 100644
index 00000000000..0f83c4cb322
--- /dev/null
+++ b/db/schema_migrations/20210921062820
@@ -0,0 +1 @@
+ae98a673b649faf8644990de328470579e121544d4fc417562cc64a7687550ca \ No newline at end of file
diff --git a/db/schema_migrations/20210921063924 b/db/schema_migrations/20210921063924
new file mode 100644
index 00000000000..ed849aa174c
--- /dev/null
+++ b/db/schema_migrations/20210921063924
@@ -0,0 +1 @@
+4430d4e0d688c85768201ab09056d60151fdc949b4b5f4ebc5397a99b9ec5f83 \ No newline at end of file
diff --git a/db/schema_migrations/20210921191010 b/db/schema_migrations/20210921191010
new file mode 100644
index 00000000000..c01a8f41437
--- /dev/null
+++ b/db/schema_migrations/20210921191010
@@ -0,0 +1 @@
+8fa4dbfc075036ca379f153e97b7afd2b7600d129f7fb5294dcf4574be9dd7d1 \ No newline at end of file
diff --git a/db/schema_migrations/20210922021816 b/db/schema_migrations/20210922021816
new file mode 100644
index 00000000000..8286647353d
--- /dev/null
+++ b/db/schema_migrations/20210922021816
@@ -0,0 +1 @@
+1d18e061cb5bcdaa7d3fcea93e58d65a6f2c8b557fe53ba461b6cfa570f565be \ No newline at end of file
diff --git a/db/schema_migrations/20210922025631 b/db/schema_migrations/20210922025631
new file mode 100644
index 00000000000..217c1d9da25
--- /dev/null
+++ b/db/schema_migrations/20210922025631
@@ -0,0 +1 @@
+43b02083323765888f019386138e8fbaa3182d74bd5e8790d6fae6ea6f0a2104 \ No newline at end of file
diff --git a/db/schema_migrations/20210922082019 b/db/schema_migrations/20210922082019
new file mode 100644
index 00000000000..c987f19e595
--- /dev/null
+++ b/db/schema_migrations/20210922082019
@@ -0,0 +1 @@
+011b714ee5d4389a5a172ae687eea3a814915fb39a5e5eae38b6ee423a903eaf \ No newline at end of file
diff --git a/db/schema_migrations/20210922084115 b/db/schema_migrations/20210922084115
new file mode 100644
index 00000000000..7870576c40e
--- /dev/null
+++ b/db/schema_migrations/20210922084115
@@ -0,0 +1 @@
+6401de932d87b684c8a00254231312f8633c66a8ea96670b2761442c771d3d7f \ No newline at end of file
diff --git a/db/schema_migrations/20210922091402 b/db/schema_migrations/20210922091402
new file mode 100644
index 00000000000..cb8e307e928
--- /dev/null
+++ b/db/schema_migrations/20210922091402
@@ -0,0 +1 @@
+4f3a1dbf39f1955122f94616952bfe04836c43e97268035b2daec3bc16e55e66 \ No newline at end of file
diff --git a/db/schema_migrations/20210922172056 b/db/schema_migrations/20210922172056
new file mode 100644
index 00000000000..834280df2a8
--- /dev/null
+++ b/db/schema_migrations/20210922172056
@@ -0,0 +1 @@
+c50ccd9986188356776c2d19c5544a6da6e31b5bb1b16ed259455604cb6fd862 \ No newline at end of file
diff --git a/db/schema_migrations/20210922172156 b/db/schema_migrations/20210922172156
new file mode 100644
index 00000000000..06852710217
--- /dev/null
+++ b/db/schema_migrations/20210922172156
@@ -0,0 +1 @@
+083b18b8e687ae8ff9d93ee77c6d4fc2916a2f1b77acf44132f216236b0ff06c \ No newline at end of file
diff --git a/db/schema_migrations/20210922215740 b/db/schema_migrations/20210922215740
new file mode 100644
index 00000000000..b7fdf9b4dfe
--- /dev/null
+++ b/db/schema_migrations/20210922215740
@@ -0,0 +1 @@
+7b343a5e1fd2600585d8fe4ef7585f91fb4c72da329b6f9474384f7217381d12 \ No newline at end of file
diff --git a/db/schema_migrations/20210922220104 b/db/schema_migrations/20210922220104
new file mode 100644
index 00000000000..0cacca67f8f
--- /dev/null
+++ b/db/schema_migrations/20210922220104
@@ -0,0 +1 @@
+ced8a8373bdbf07b2be23701f243f3a9f338776eeaec0a6c4e5cc0e68572a16e \ No newline at end of file
diff --git a/db/schema_migrations/20210923042323 b/db/schema_migrations/20210923042323
new file mode 100644
index 00000000000..944cb833939
--- /dev/null
+++ b/db/schema_migrations/20210923042323
@@ -0,0 +1 @@
+7b08303dae62fe9b9b5081221a6aa4bd6b687e0206e78e4b8a6f5964bc42b344 \ No newline at end of file
diff --git a/db/schema_migrations/20210923042324 b/db/schema_migrations/20210923042324
new file mode 100644
index 00000000000..445a6db0351
--- /dev/null
+++ b/db/schema_migrations/20210923042324
@@ -0,0 +1 @@
+52785c2791be5c17517335496e7cabd99fba1a82e82d8c783703bd68f8b40163 \ No newline at end of file
diff --git a/db/schema_migrations/20210923042325 b/db/schema_migrations/20210923042325
new file mode 100644
index 00000000000..a89582ef187
--- /dev/null
+++ b/db/schema_migrations/20210923042325
@@ -0,0 +1 @@
+f253f2bd5643f8cf72f020e5ba5237506833dee84aa98828166d8ad1570f925f \ No newline at end of file
diff --git a/db/schema_migrations/20210923133143 b/db/schema_migrations/20210923133143
new file mode 100644
index 00000000000..c0e7bb485fb
--- /dev/null
+++ b/db/schema_migrations/20210923133143
@@ -0,0 +1 @@
+d2736a06009d6232d832a03d6842a81b1de2ce79b901331a0e09ac40fc51a463 \ No newline at end of file
diff --git a/db/schema_migrations/20210923135909 b/db/schema_migrations/20210923135909
new file mode 100644
index 00000000000..b7b1ecc6bf2
--- /dev/null
+++ b/db/schema_migrations/20210923135909
@@ -0,0 +1 @@
+2afb8292fcdf9a56c11d9404275ffecfde4b2a474e733e3e19f4db62c628aa6c \ No newline at end of file
diff --git a/db/schema_migrations/20210923151641 b/db/schema_migrations/20210923151641
new file mode 100644
index 00000000000..bd38d8c6a28
--- /dev/null
+++ b/db/schema_migrations/20210923151641
@@ -0,0 +1 @@
+30c135ab62a57208160dd0949d6615f42af39117e25769d70a9658de5417b7e4 \ No newline at end of file
diff --git a/db/schema_migrations/20210927153807 b/db/schema_migrations/20210927153807
new file mode 100644
index 00000000000..c6a675e380b
--- /dev/null
+++ b/db/schema_migrations/20210927153807
@@ -0,0 +1 @@
+8e54f43a955023e422bf40476f468fbdf04f06e806b08fddf35208c65607fec3 \ No newline at end of file
diff --git a/db/schema_migrations/20210928155022 b/db/schema_migrations/20210928155022
new file mode 100644
index 00000000000..d953746413a
--- /dev/null
+++ b/db/schema_migrations/20210928155022
@@ -0,0 +1 @@
+41ea0971cd62ba43bf98c1901169e7bb8fcebe68025d947f26b0ccf6806c976e \ No newline at end of file
diff --git a/db/schema_migrations/20210928171122 b/db/schema_migrations/20210928171122
new file mode 100644
index 00000000000..ccddd09345b
--- /dev/null
+++ b/db/schema_migrations/20210928171122
@@ -0,0 +1 @@
+f257ff9896e2d90ced39c2c010df1d4b74badae046651a190585c9c47342d119 \ No newline at end of file
diff --git a/db/schema_migrations/20210929025600 b/db/schema_migrations/20210929025600
new file mode 100644
index 00000000000..fb00216afac
--- /dev/null
+++ b/db/schema_migrations/20210929025600
@@ -0,0 +1 @@
+c757a7e17433b8ddf15ae6304286fe3da69f820966455e7fbed7282286f5eb67 \ No newline at end of file
diff --git a/db/schema_migrations/20210929030834 b/db/schema_migrations/20210929030834
new file mode 100644
index 00000000000..a3dc19d0440
--- /dev/null
+++ b/db/schema_migrations/20210929030834
@@ -0,0 +1 @@
+b5302b3a2384bd7d0e639f00941efb490c3121a9332f1e73be620ab0f6f3e771 \ No newline at end of file
diff --git a/db/schema_migrations/20210929031049 b/db/schema_migrations/20210929031049
new file mode 100644
index 00000000000..19ba54b465a
--- /dev/null
+++ b/db/schema_migrations/20210929031049
@@ -0,0 +1 @@
+d3f588e4edded61f36acbf25fba39be17a2ac16f37e9114f2c5c257c47dc1308 \ No newline at end of file
diff --git a/db/schema_migrations/20210929032555 b/db/schema_migrations/20210929032555
new file mode 100644
index 00000000000..779e6a63fe2
--- /dev/null
+++ b/db/schema_migrations/20210929032555
@@ -0,0 +1 @@
+08593002910759482c58f9b31f251d589ab32b540d9614a2c677df11d32f7f26 \ No newline at end of file
diff --git a/db/schema_migrations/20210929115340 b/db/schema_migrations/20210929115340
new file mode 100644
index 00000000000..2f6bf226e09
--- /dev/null
+++ b/db/schema_migrations/20210929115340
@@ -0,0 +1 @@
+0de2844fdec43eca860648bdb1a5b184bcc0f79b51086b16d8ef398f32cfd5de \ No newline at end of file
diff --git a/db/schema_migrations/20210929121516 b/db/schema_migrations/20210929121516
new file mode 100644
index 00000000000..c42d39c9c34
--- /dev/null
+++ b/db/schema_migrations/20210929121516
@@ -0,0 +1 @@
+432dc1f1e0280a79e4a6af56c2f2cb40c99edbc09e254b82b7f48c7c9217372b \ No newline at end of file
diff --git a/db/schema_migrations/20210930081208 b/db/schema_migrations/20210930081208
new file mode 100644
index 00000000000..a0c1d701717
--- /dev/null
+++ b/db/schema_migrations/20210930081208
@@ -0,0 +1 @@
+4b2c1b8e80f481d2dbbcfcb61c0a3d3081cbe4081fdd710040a028d72bd5d0e4 \ No newline at end of file
diff --git a/db/schema_migrations/20211001001222 b/db/schema_migrations/20211001001222
new file mode 100644
index 00000000000..2b0ebb346a9
--- /dev/null
+++ b/db/schema_migrations/20211001001222
@@ -0,0 +1 @@
+23be5444bb11f731e98edc9b6aad814d02fd0f3f6be9abdea9060898cc2b95f1 \ No newline at end of file
diff --git a/db/schema_migrations/20211004062942 b/db/schema_migrations/20211004062942
new file mode 100644
index 00000000000..6ad1af289f7
--- /dev/null
+++ b/db/schema_migrations/20211004062942
@@ -0,0 +1 @@
+95dcfdc6c03705b0db5e96d669051edf335b5d6501243f70588f9b73478116a6 \ No newline at end of file
diff --git a/db/schema_migrations/20211004075629 b/db/schema_migrations/20211004075629
new file mode 100644
index 00000000000..d55f7370798
--- /dev/null
+++ b/db/schema_migrations/20211004075629
@@ -0,0 +1 @@
+e035616201329b7610e8c3a647bc01c52ce722790ea7bb88d4a38bc0feb4737e \ No newline at end of file
diff --git a/db/schema_migrations/20211004081911 b/db/schema_migrations/20211004081911
new file mode 100644
index 00000000000..c849cb776d8
--- /dev/null
+++ b/db/schema_migrations/20211004081911
@@ -0,0 +1 @@
+cc53e8c85fdb00c0772987516e0c23f5349cc6dc1e21b4124eb50efdaa6a4fcd \ No newline at end of file
diff --git a/db/schema_migrations/20211004110500 b/db/schema_migrations/20211004110500
new file mode 100644
index 00000000000..e22ed05de83
--- /dev/null
+++ b/db/schema_migrations/20211004110500
@@ -0,0 +1 @@
+1b0b562aefb724afe24b8640a22013cea6fddd0e594d6723f6819f69804ba9f7 \ No newline at end of file
diff --git a/db/schema_migrations/20211004110927 b/db/schema_migrations/20211004110927
new file mode 100644
index 00000000000..aa70a4aa0d8
--- /dev/null
+++ b/db/schema_migrations/20211004110927
@@ -0,0 +1 @@
+50c937f979c83f6937364d92bf65ed42ef963f2d241eadcee6355c1b256c3ec9 \ No newline at end of file
diff --git a/db/schema_migrations/20211004151202 b/db/schema_migrations/20211004151202
new file mode 100644
index 00000000000..f21ef531938
--- /dev/null
+++ b/db/schema_migrations/20211004151202
@@ -0,0 +1 @@
+88f8e8391a480450a3d76d98f089e1e2287048007d0ecdcbd0799c9cc021481f \ No newline at end of file
diff --git a/db/schema_migrations/20211005010101 b/db/schema_migrations/20211005010101
new file mode 100644
index 00000000000..9789f36adea
--- /dev/null
+++ b/db/schema_migrations/20211005010101
@@ -0,0 +1 @@
+40e15593d9ee0fb5a59d1576c6da5a1eece265730f7ae15c5c81c2c5343b362c \ No newline at end of file
diff --git a/db/schema_migrations/20211005063519 b/db/schema_migrations/20211005063519
new file mode 100644
index 00000000000..d3450d4282a
--- /dev/null
+++ b/db/schema_migrations/20211005063519
@@ -0,0 +1 @@
+e45163c2d0d691fb5deab86d024c4edb8e3cd350271418e1ff132c31e2ca90a3 \ No newline at end of file
diff --git a/db/schema_migrations/20211005063616 b/db/schema_migrations/20211005063616
new file mode 100644
index 00000000000..030dfc12a68
--- /dev/null
+++ b/db/schema_migrations/20211005063616
@@ -0,0 +1 @@
+20d35e9baae343bccbb67a25eacd7fdb4b32fd4cedd95e6f8f7a2933470350fb \ No newline at end of file
diff --git a/db/schema_migrations/20211005063723 b/db/schema_migrations/20211005063723
new file mode 100644
index 00000000000..b4d8c7a3f6e
--- /dev/null
+++ b/db/schema_migrations/20211005063723
@@ -0,0 +1 @@
+4659ab6d971b03d9b44dda72fe1b571c5050fd6892cb4f16f2ca1ced0905c1ce \ No newline at end of file
diff --git a/db/schema_migrations/20211005083015 b/db/schema_migrations/20211005083015
new file mode 100644
index 00000000000..0e5a20b824f
--- /dev/null
+++ b/db/schema_migrations/20211005083015
@@ -0,0 +1 @@
+37016ec5e5ab1bd8d2bd8020f98277b3ad9f450b833ce3ebde70aebce5130a26 \ No newline at end of file
diff --git a/db/schema_migrations/20211005092428 b/db/schema_migrations/20211005092428
new file mode 100644
index 00000000000..0ac1a5f6ee6
--- /dev/null
+++ b/db/schema_migrations/20211005092428
@@ -0,0 +1 @@
+43abb71ecc1f1b4e699af1258934884a06e4e4eb1445ec3cc7a2c6668f42f14a \ No newline at end of file
diff --git a/db/schema_migrations/20211005093558 b/db/schema_migrations/20211005093558
new file mode 100644
index 00000000000..943f905b497
--- /dev/null
+++ b/db/schema_migrations/20211005093558
@@ -0,0 +1 @@
+16638e14f1920b2e615dcb14965b7ef2a16ead099e7f8b1cdad6dd75d6d45107 \ No newline at end of file
diff --git a/db/schema_migrations/20211005100112 b/db/schema_migrations/20211005100112
new file mode 100644
index 00000000000..1f7a92ca316
--- /dev/null
+++ b/db/schema_migrations/20211005100112
@@ -0,0 +1 @@
+196cd1cf84babb12e92830bf2b7a0315499fdb976f825d4913a506e744b4fd53 \ No newline at end of file
diff --git a/db/schema_migrations/20211006060254 b/db/schema_migrations/20211006060254
new file mode 100644
index 00000000000..2891170a092
--- /dev/null
+++ b/db/schema_migrations/20211006060254
@@ -0,0 +1 @@
+0d6ec7c1d96f32c645ddc051d8e3b3bd0ad759c52c8938888287b1c6b57d27a3 \ No newline at end of file
diff --git a/db/schema_migrations/20211006060436 b/db/schema_migrations/20211006060436
new file mode 100644
index 00000000000..e2374c092c7
--- /dev/null
+++ b/db/schema_migrations/20211006060436
@@ -0,0 +1 @@
+918852db691546e4e93a933789968115ac98b5757d480ed1e09118508e6024d5 \ No newline at end of file
diff --git a/db/schema_migrations/20211006103122 b/db/schema_migrations/20211006103122
new file mode 100644
index 00000000000..4d2347702de
--- /dev/null
+++ b/db/schema_migrations/20211006103122
@@ -0,0 +1 @@
+1e29e4712d81aacf1178996c2dd9e82593be5a2311273800d91640d8eccd38ed \ No newline at end of file
diff --git a/db/schema_migrations/20211006122010 b/db/schema_migrations/20211006122010
new file mode 100644
index 00000000000..6758ab4978a
--- /dev/null
+++ b/db/schema_migrations/20211006122010
@@ -0,0 +1 @@
+19efbbf7aab5837e33ff72d87e101a76da7eeb1d60c05ffc0ceddad1d0cbc69c \ No newline at end of file
diff --git a/db/schema_migrations/20211006145004 b/db/schema_migrations/20211006145004
new file mode 100644
index 00000000000..6a99396d34a
--- /dev/null
+++ b/db/schema_migrations/20211006145004
@@ -0,0 +1 @@
+9fca672eaa0b82a37c211de35a4961b81fb163d290004907be7bf641327c65b1 \ No newline at end of file
diff --git a/db/schema_migrations/20211006174114 b/db/schema_migrations/20211006174114
new file mode 100644
index 00000000000..1d015b78676
--- /dev/null
+++ b/db/schema_migrations/20211006174114
@@ -0,0 +1 @@
+15d1bc08a87241b4217278ce8214f41d1d3c0cc4c26a3e659f395a602d139758 \ No newline at end of file
diff --git a/db/schema_migrations/20211007093340 b/db/schema_migrations/20211007093340
new file mode 100644
index 00000000000..9b11d742548
--- /dev/null
+++ b/db/schema_migrations/20211007093340
@@ -0,0 +1 @@
+fbb3092caba901ddd5a740bb67a91d1c8a4c458651afaf02704399844acbd2b8 \ No newline at end of file
diff --git a/db/schema_migrations/20211007113136 b/db/schema_migrations/20211007113136
new file mode 100644
index 00000000000..dc245a3723b
--- /dev/null
+++ b/db/schema_migrations/20211007113136
@@ -0,0 +1 @@
+7abcc243cd02a4eba77ea39cbb1b1f2de74d85e55055def9ae02c4fdeaba3d9a \ No newline at end of file
diff --git a/db/schema_migrations/20211007155221 b/db/schema_migrations/20211007155221
new file mode 100644
index 00000000000..662668fe983
--- /dev/null
+++ b/db/schema_migrations/20211007155221
@@ -0,0 +1 @@
+115427979cd7ecfc14bf4f663a9afd5abc6d481d08fafc13ca7e6a8cac9ba20c \ No newline at end of file
diff --git a/db/schema_migrations/20211008181451 b/db/schema_migrations/20211008181451
new file mode 100644
index 00000000000..1687056609f
--- /dev/null
+++ b/db/schema_migrations/20211008181451
@@ -0,0 +1 @@
+b4104ebb3d99100ed5b6831174af563ea7cda46428007e30219198b910313b05 \ No newline at end of file
diff --git a/db/schema_migrations/20211008182954 b/db/schema_migrations/20211008182954
new file mode 100644
index 00000000000..e530f090840
--- /dev/null
+++ b/db/schema_migrations/20211008182954
@@ -0,0 +1 @@
+d16b96a960e03e50135802885f5b8c44168d2413f3db1f53ac15389a33dddc61 \ No newline at end of file
diff --git a/db/schema_migrations/20211011152701 b/db/schema_migrations/20211011152701
new file mode 100644
index 00000000000..fcd6f8ad953
--- /dev/null
+++ b/db/schema_migrations/20211011152701
@@ -0,0 +1 @@
+5701681a1006584149c88da520f780b186ca32ba1facb8b952252c6d426b6c0d \ No newline at end of file
diff --git a/db/schema_migrations/20211012091822 b/db/schema_migrations/20211012091822
new file mode 100644
index 00000000000..09c198571af
--- /dev/null
+++ b/db/schema_migrations/20211012091822
@@ -0,0 +1 @@
+3482e5c12f1603cb67d24aee14f003345ef2a5c350c7dccafdea6554db04c4cc \ No newline at end of file
diff --git a/db/schema_migrations/20211012155931 b/db/schema_migrations/20211012155931
new file mode 100644
index 00000000000..1974e553fb7
--- /dev/null
+++ b/db/schema_migrations/20211012155931
@@ -0,0 +1 @@
+0a9317419b856ba2abf3cad07c43ccfc79abfcd5efd02c464ee76f4debe362c8 \ No newline at end of file
diff --git a/db/structure.sql b/db/structure.sql
index d7e00112d73..d3882446f57 100644
--- a/db/structure.sql
+++ b/db/structure.sql
@@ -27,8 +27,8 @@ CREATE FUNCTION insert_into_loose_foreign_keys_deleted_records() RETURNS trigger
AS $$
BEGIN
INSERT INTO loose_foreign_keys_deleted_records
- (deleted_table_name, deleted_table_primary_key_value)
- SELECT TG_TABLE_NAME, old_table.id FROM old_table
+ (partition, fully_qualified_table_name, primary_key_value)
+ SELECT 1, TG_TABLE_SCHEMA || '.' || TG_TABLE_NAME, old_table.id FROM old_table
ON CONFLICT DO NOTHING;
RETURN NULL;
@@ -77,34 +77,6 @@ RETURN NULL;
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_542d6c2ad72e() RETURNS trigger
- LANGUAGE plpgsql
- AS $$
-BEGIN
- NEW."id_convert_to_bigint" := NEW."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 $$
@@ -114,16 +86,6 @@ BEGIN
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 TABLE audit_events (
id bigint NOT NULL,
author_id integer NOT NULL,
@@ -148,11 +110,9 @@ CREATE TABLE incident_management_pending_alert_escalations (
id bigint NOT NULL,
rule_id bigint NOT NULL,
alert_id bigint NOT NULL,
- schedule_id bigint,
process_at timestamp with time zone NOT NULL,
created_at timestamp with time zone NOT NULL,
- updated_at timestamp with time zone NOT NULL,
- status smallint
+ updated_at timestamp with time zone NOT NULL
)
PARTITION BY RANGE (process_at);
@@ -166,14 +126,6 @@ CREATE TABLE incident_management_pending_issue_escalations (
)
PARTITION BY RANGE (process_at);
-CREATE TABLE loose_foreign_keys_deleted_records (
- created_at timestamp with time zone DEFAULT now() NOT NULL,
- deleted_table_name text NOT NULL,
- deleted_table_primary_key_value bigint NOT NULL,
- CONSTRAINT check_7229f9527e CHECK ((char_length(deleted_table_name) <= 63))
-)
-PARTITION BY RANGE (created_at);
-
CREATE TABLE web_hook_logs (
id bigint NOT NULL,
web_hook_id integer NOT NULL,
@@ -983,6 +935,37 @@ CREATE TABLE gitlab_partitions_static.analytics_cycle_analytics_merge_request_st
);
ALTER TABLE ONLY analytics_cycle_analytics_merge_request_stage_events ATTACH PARTITION gitlab_partitions_static.analytics_cycle_analytics_merge_request_stage_events_31 FOR VALUES WITH (modulus 32, remainder 31);
+CREATE TABLE loose_foreign_keys_deleted_records (
+ id bigint NOT NULL,
+ partition bigint NOT NULL,
+ primary_key_value bigint NOT NULL,
+ status smallint DEFAULT 1 NOT NULL,
+ created_at timestamp with time zone DEFAULT now() NOT NULL,
+ fully_qualified_table_name text NOT NULL,
+ CONSTRAINT check_1a541f3235 CHECK ((char_length(fully_qualified_table_name) <= 150))
+)
+PARTITION BY LIST (partition);
+
+CREATE SEQUENCE loose_foreign_keys_deleted_records_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE loose_foreign_keys_deleted_records_id_seq OWNED BY loose_foreign_keys_deleted_records.id;
+
+CREATE TABLE gitlab_partitions_static.loose_foreign_keys_deleted_records_1 (
+ id bigint DEFAULT nextval('loose_foreign_keys_deleted_records_id_seq'::regclass) NOT NULL,
+ partition bigint NOT NULL,
+ primary_key_value bigint NOT NULL,
+ status smallint DEFAULT 1 NOT NULL,
+ created_at timestamp with time zone DEFAULT now() NOT NULL,
+ fully_qualified_table_name text NOT NULL,
+ CONSTRAINT check_1a541f3235 CHECK ((char_length(fully_qualified_table_name) <= 150))
+);
+ALTER TABLE ONLY loose_foreign_keys_deleted_records ATTACH PARTITION gitlab_partitions_static.loose_foreign_keys_deleted_records_1 FOR VALUES IN ('1');
+
CREATE TABLE product_analytics_events_experimental (
id bigint NOT NULL,
project_id integer NOT NULL,
@@ -9927,7 +9910,6 @@ 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,
recorded_at timestamp with time zone NOT NULL,
issue_opened boolean NOT NULL,
merge_request_opened boolean NOT NULL,
@@ -10375,7 +10357,16 @@ CREATE TABLE application_settings (
sidekiq_job_limiter_mode smallint DEFAULT 1 NOT NULL,
sidekiq_job_limiter_compression_threshold_bytes integer DEFAULT 100000 NOT NULL,
sidekiq_job_limiter_limit_bytes integer DEFAULT 0 NOT NULL,
+ suggest_pipeline_enabled boolean DEFAULT true NOT NULL,
+ throttle_unauthenticated_deprecated_api_requests_per_period integer DEFAULT 1800 NOT NULL,
+ throttle_unauthenticated_deprecated_api_period_in_seconds integer DEFAULT 3600 NOT NULL,
+ throttle_unauthenticated_deprecated_api_enabled boolean DEFAULT false NOT NULL,
+ throttle_authenticated_deprecated_api_requests_per_period integer DEFAULT 3600 NOT NULL,
+ throttle_authenticated_deprecated_api_period_in_seconds integer DEFAULT 3600 NOT NULL,
+ throttle_authenticated_deprecated_api_enabled boolean DEFAULT false NOT NULL,
+ dependency_proxy_ttl_group_policy_worker_capacity smallint DEFAULT 2 NOT NULL,
CONSTRAINT app_settings_container_reg_cleanup_tags_max_list_size_positive CHECK ((container_registry_cleanup_tags_service_max_list_size >= 0)),
+ CONSTRAINT app_settings_dep_proxy_ttl_policies_worker_capacity_positive CHECK ((dependency_proxy_ttl_group_policy_worker_capacity >= 0)),
CONSTRAINT app_settings_ext_pipeline_validation_service_url_text_limit CHECK ((char_length(external_pipeline_validation_service_url) <= 255)),
CONSTRAINT app_settings_registry_exp_policies_worker_capacity_positive CHECK ((container_registry_expiration_policies_worker_capacity >= 0)),
CONSTRAINT app_settings_yaml_max_depth_positive CHECK ((max_yaml_depth > 0)),
@@ -10499,7 +10490,8 @@ CREATE TABLE approval_project_rules (
rule_type smallint DEFAULT 0 NOT NULL,
scanners text[],
vulnerabilities_allowed smallint DEFAULT 0 NOT NULL,
- severity_levels text[] DEFAULT '{}'::text[] NOT NULL
+ severity_levels text[] DEFAULT '{}'::text[] NOT NULL,
+ report_type smallint
);
CREATE TABLE approval_project_rules_groups (
@@ -10632,6 +10624,24 @@ CREATE SEQUENCE atlassian_identities_user_id_seq
ALTER SEQUENCE atlassian_identities_user_id_seq OWNED BY atlassian_identities.user_id;
+CREATE TABLE audit_events_external_audit_event_destinations (
+ id bigint NOT NULL,
+ namespace_id bigint NOT NULL,
+ destination_url text NOT NULL,
+ created_at timestamp with time zone NOT NULL,
+ updated_at timestamp with time zone NOT NULL,
+ CONSTRAINT check_2feafb9daf CHECK ((char_length(destination_url) <= 255))
+);
+
+CREATE SEQUENCE audit_events_external_audit_event_destinations_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE audit_events_external_audit_event_destinations_id_seq OWNED BY audit_events_external_audit_event_destinations.id;
+
CREATE SEQUENCE audit_events_id_seq
START WITH 1
INCREMENT BY 1
@@ -11203,7 +11213,9 @@ CREATE TABLE bulk_imports (
source_type smallint NOT NULL,
status smallint 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,
+ source_version text,
+ CONSTRAINT check_ea4e58775a CHECK ((char_length(source_version) <= 63))
);
CREATE SEQUENCE bulk_imports_id_seq
@@ -11337,7 +11349,6 @@ CREATE TABLE ci_build_trace_metadata (
);
CREATE TABLE ci_builds (
- id_convert_to_bigint integer DEFAULT 0 NOT NULL,
status character varying,
finished_at timestamp without time zone,
trace text,
@@ -11372,7 +11383,6 @@ CREATE TABLE ci_builds (
coverage_regex character varying,
auto_canceled_by_id integer,
retried boolean,
- stage_id_convert_to_bigint integer,
protected boolean,
failure_reason integer,
scheduled_at timestamp with time zone,
@@ -11397,8 +11407,6 @@ CREATE SEQUENCE ci_builds_id_seq
ALTER SEQUENCE ci_builds_id_seq OWNED BY ci_builds.id;
CREATE TABLE ci_builds_metadata (
- id_convert_to_bigint integer DEFAULT 0 NOT NULL,
- build_id_convert_to_bigint integer DEFAULT 0 NOT NULL,
project_id integer NOT NULL,
timeout integer,
timeout_source integer DEFAULT 1 NOT NULL,
@@ -11410,7 +11418,8 @@ CREATE TABLE ci_builds_metadata (
expanded_environment_name character varying(255),
secrets jsonb DEFAULT '{}'::jsonb NOT NULL,
build_id bigint NOT NULL,
- id bigint NOT NULL
+ id bigint NOT NULL,
+ runner_features jsonb DEFAULT '{}'::jsonb NOT NULL
);
CREATE SEQUENCE ci_builds_metadata_id_seq
@@ -11546,9 +11555,7 @@ CREATE SEQUENCE ci_instance_variables_id_seq
ALTER SEQUENCE ci_instance_variables_id_seq OWNED BY ci_instance_variables.id;
CREATE TABLE ci_job_artifacts (
- id_convert_to_bigint integer DEFAULT 0 NOT NULL,
project_id integer NOT NULL,
- job_id_convert_to_bigint integer DEFAULT 0 NOT NULL,
file_type integer NOT NULL,
size bigint,
created_at timestamp with time zone NOT NULL,
@@ -11637,6 +11644,7 @@ CREATE TABLE ci_namespace_monthly_usages (
additional_amount_available integer DEFAULT 0 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,
CONSTRAINT ci_namespace_monthly_usages_year_month_constraint CHECK ((date = date_trunc('month'::text, (date)::timestamp with time zone)))
);
@@ -11881,6 +11889,7 @@ CREATE TABLE ci_project_monthly_usages (
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,
CONSTRAINT ci_project_monthly_usages_year_month_constraint CHECK ((date = date_trunc('month'::text, (date)::timestamp with time zone)))
);
@@ -11915,7 +11924,8 @@ CREATE TABLE ci_resource_groups (
created_at timestamp with time zone NOT NULL,
updated_at timestamp with time zone NOT NULL,
project_id bigint NOT NULL,
- key character varying(255) NOT NULL
+ key character varying(255) NOT NULL,
+ process_mode smallint DEFAULT 0 NOT NULL
);
CREATE SEQUENCE ci_resource_groups_id_seq
@@ -12033,7 +12043,6 @@ CREATE TABLE ci_sources_pipelines (
project_id integer,
pipeline_id integer,
source_project_id integer,
- source_job_id_convert_to_bigint integer,
source_pipeline_id integer,
source_job_id bigint
);
@@ -12757,6 +12766,25 @@ CREATE SEQUENCE conversational_development_index_metrics_id_seq
ALTER SEQUENCE conversational_development_index_metrics_id_seq OWNED BY conversational_development_index_metrics.id;
+CREATE TABLE coverage_fuzzing_corpuses (
+ id bigint NOT NULL,
+ project_id bigint NOT NULL,
+ user_id bigint,
+ package_id bigint NOT NULL,
+ file_updated_at timestamp with time zone DEFAULT now() NOT NULL,
+ created_at timestamp with time zone NOT NULL,
+ updated_at timestamp with time zone NOT NULL
+);
+
+CREATE SEQUENCE coverage_fuzzing_corpuses_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE coverage_fuzzing_corpuses_id_seq OWNED BY coverage_fuzzing_corpuses.id;
+
CREATE TABLE csv_issue_imports (
id bigint NOT NULL,
project_id bigint NOT NULL,
@@ -13744,7 +13772,6 @@ CREATE SEQUENCE error_tracking_errors_id_seq
ALTER SEQUENCE error_tracking_errors_id_seq OWNED BY error_tracking_errors.id;
CREATE TABLE events (
- id_convert_to_bigint integer DEFAULT 0 NOT NULL,
project_id integer,
author_id integer NOT NULL,
target_id integer,
@@ -15111,6 +15138,23 @@ CREATE TABLE issue_assignees (
issue_id integer NOT NULL
);
+CREATE TABLE issue_customer_relations_contacts (
+ id bigint NOT NULL,
+ issue_id bigint NOT NULL,
+ contact_id bigint NOT NULL,
+ created_at timestamp with time zone NOT NULL,
+ updated_at timestamp with time zone NOT NULL
+);
+
+CREATE SEQUENCE issue_customer_relations_contacts_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+ALTER SEQUENCE issue_customer_relations_contacts_id_seq OWNED BY issue_customer_relations_contacts.id;
+
CREATE TABLE issue_email_participants (
id bigint NOT NULL,
issue_id bigint NOT NULL,
@@ -16214,8 +16258,7 @@ CREATE TABLE namespaces (
push_rule_id bigint,
shared_runners_enabled boolean DEFAULT true NOT NULL,
allow_descendants_override_disabled_shared_runners boolean DEFAULT false NOT NULL,
- traversal_ids integer[] DEFAULT '{}'::integer[] NOT NULL,
- delayed_project_removal boolean DEFAULT false NOT NULL
+ traversal_ids integer[] DEFAULT '{}'::integer[] NOT NULL
);
CREATE SEQUENCE namespaces_id_seq
@@ -17018,7 +17061,7 @@ CREATE TABLE packages_helm_file_metadata (
package_file_id bigint NOT NULL,
channel text NOT NULL,
metadata jsonb,
- CONSTRAINT check_c34067922d CHECK ((char_length(channel) <= 63))
+ CONSTRAINT check_06e8d100af CHECK ((char_length(channel) <= 255))
);
CREATE TABLE packages_maven_metadata (
@@ -17407,7 +17450,8 @@ CREATE TABLE plan_limits (
ci_max_artifact_size_cluster_image_scanning integer DEFAULT 0 NOT NULL,
ci_jobs_trace_size_limit integer DEFAULT 100 NOT NULL,
pages_file_entries integer DEFAULT 200000 NOT NULL,
- dast_profile_schedules integer DEFAULT 1 NOT NULL
+ dast_profile_schedules integer DEFAULT 1 NOT NULL,
+ external_audit_event_destinations integer DEFAULT 5 NOT NULL
);
CREATE SEQUENCE plan_limits_id_seq
@@ -17863,7 +17907,7 @@ CREATE TABLE project_error_tracking_settings (
encrypted_token_iv character varying,
project_name character varying,
organization_name character varying,
- integrated boolean DEFAULT false NOT NULL
+ integrated boolean DEFAULT true NOT NULL
);
CREATE TABLE project_export_jobs (
@@ -18489,7 +18533,6 @@ ALTER SEQUENCE protected_tags_id_seq OWNED BY protected_tags.id;
CREATE TABLE push_event_payloads (
commit_count bigint NOT NULL,
- event_id_convert_to_bigint integer DEFAULT 0 NOT NULL,
action smallint NOT NULL,
ref_type smallint NOT NULL,
commit_from bytea,
@@ -19008,7 +19051,8 @@ CREATE TABLE security_scans (
info jsonb DEFAULT '{}'::jsonb NOT NULL,
project_id bigint,
pipeline_id bigint,
- latest boolean DEFAULT true NOT NULL
+ latest boolean DEFAULT true NOT NULL,
+ status smallint DEFAULT 0 NOT NULL
);
CREATE SEQUENCE security_scans_id_seq
@@ -19444,9 +19488,7 @@ CREATE SEQUENCE system_note_metadata_id_seq
ALTER SEQUENCE system_note_metadata_id_seq OWNED BY system_note_metadata.id;
CREATE TABLE taggings (
- id_convert_to_bigint integer DEFAULT 0 NOT NULL,
tag_id integer,
- taggable_id_convert_to_bigint integer,
taggable_type character varying,
tagger_id integer,
tagger_type character varying,
@@ -19623,6 +19665,11 @@ CREATE TABLE topics (
name text NOT NULL,
created_at timestamp with time zone NOT NULL,
updated_at timestamp with time zone NOT NULL,
+ avatar text,
+ description text,
+ total_projects_count bigint DEFAULT 0 NOT NULL,
+ CONSTRAINT check_26753fb43a CHECK ((char_length(avatar) <= 255)),
+ CONSTRAINT check_5d1a07c8c8 CHECK ((char_length(description) <= 1024)),
CONSTRAINT check_7a90d4c757 CHECK ((char_length(name) <= 255))
);
@@ -19767,7 +19814,12 @@ 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
+ credit_card_validated_at timestamp with time zone NOT NULL,
+ expiration_date date,
+ last_digits smallint,
+ holder_name text,
+ CONSTRAINT check_3eea080c91 CHECK (((last_digits >= 0) AND (last_digits <= 9999))),
+ CONSTRAINT check_eafe45d88b CHECK ((char_length(holder_name) <= 26))
);
CREATE TABLE user_custom_attributes (
@@ -19792,19 +19844,22 @@ CREATE TABLE user_details (
user_id bigint NOT NULL,
job_title character varying(200) DEFAULT ''::character varying NOT NULL,
bio character varying(255) DEFAULT ''::character varying NOT NULL,
- bio_html text,
- cached_markdown_version integer,
webauthn_xid text,
other_role text,
provisioned_by_group_id bigint,
pronouns text,
pronunciation text,
+ registration_objective smallint,
+ phone text,
CONSTRAINT check_245664af82 CHECK ((char_length(webauthn_xid) <= 100)),
+ CONSTRAINT check_a73b398c60 CHECK ((char_length(phone) <= 32)),
CONSTRAINT check_b132136b01 CHECK ((char_length(other_role) <= 100)),
CONSTRAINT check_eeeaf8d4f0 CHECK ((char_length(pronouns) <= 50)),
CONSTRAINT check_f932ed37db CHECK ((char_length(pronunciation) <= 255))
);
+COMMENT ON COLUMN user_details.phone IS 'JiHu-specific column';
+
CREATE SEQUENCE user_details_user_id_seq
START WITH 1
INCREMENT BY 1
@@ -20098,6 +20153,19 @@ CREATE SEQUENCE users_statistics_id_seq
ALTER SEQUENCE users_statistics_id_seq OWNED BY users_statistics.id;
+CREATE TABLE verification_codes (
+ created_at timestamp with time zone DEFAULT now() NOT NULL,
+ visitor_id_code text NOT NULL,
+ code text NOT NULL,
+ phone text NOT NULL,
+ CONSTRAINT check_9b84e6aaff CHECK ((char_length(code) <= 8)),
+ CONSTRAINT check_ccc542256b CHECK ((char_length(visitor_id_code) <= 64)),
+ CONSTRAINT check_f5684c195b CHECK ((char_length(phone) <= 32))
+)
+PARTITION BY RANGE (created_at);
+
+COMMENT ON TABLE verification_codes IS 'JiHu-specific table';
+
CREATE TABLE vulnerabilities (
id bigint NOT NULL,
milestone_id bigint,
@@ -20351,6 +20419,7 @@ CREATE TABLE vulnerability_finding_evidences (
updated_at timestamp with time zone NOT NULL,
vulnerability_occurrence_id bigint NOT NULL,
summary text,
+ data jsonb DEFAULT '{}'::jsonb NOT NULL,
CONSTRAINT check_5773b236fb CHECK ((char_length(summary) <= 8000000))
);
@@ -20962,6 +21031,8 @@ ALTER TABLE ONLY atlassian_identities ALTER COLUMN user_id SET DEFAULT nextval('
ALTER TABLE ONLY audit_events ALTER COLUMN id SET DEFAULT nextval('audit_events_id_seq'::regclass);
+ALTER TABLE ONLY audit_events_external_audit_event_destinations ALTER COLUMN id SET DEFAULT nextval('audit_events_external_audit_event_destinations_id_seq'::regclass);
+
ALTER TABLE ONLY authentication_events ALTER COLUMN id SET DEFAULT nextval('authentication_events_id_seq'::regclass);
ALTER TABLE ONLY award_emoji ALTER COLUMN id SET DEFAULT nextval('award_emoji_id_seq'::regclass);
@@ -21154,6 +21225,8 @@ ALTER TABLE ONLY container_repositories ALTER COLUMN id SET DEFAULT nextval('con
ALTER TABLE ONLY conversational_development_index_metrics ALTER COLUMN id SET DEFAULT nextval('conversational_development_index_metrics_id_seq'::regclass);
+ALTER TABLE ONLY coverage_fuzzing_corpuses ALTER COLUMN id SET DEFAULT nextval('coverage_fuzzing_corpuses_id_seq'::regclass);
+
ALTER TABLE ONLY csv_issue_imports ALTER COLUMN id SET DEFAULT nextval('csv_issue_imports_id_seq'::regclass);
ALTER TABLE ONLY custom_emoji ALTER COLUMN id SET DEFAULT nextval('custom_emoji_id_seq'::regclass);
@@ -21370,6 +21443,8 @@ ALTER TABLE ONLY issuable_severities ALTER COLUMN id SET DEFAULT nextval('issuab
ALTER TABLE ONLY issuable_slas ALTER COLUMN id SET DEFAULT nextval('issuable_slas_id_seq'::regclass);
+ALTER TABLE ONLY issue_customer_relations_contacts ALTER COLUMN id SET DEFAULT nextval('issue_customer_relations_contacts_id_seq'::regclass);
+
ALTER TABLE ONLY issue_email_participants ALTER COLUMN id SET DEFAULT nextval('issue_email_participants_id_seq'::regclass);
ALTER TABLE ONLY issue_links ALTER COLUMN id SET DEFAULT nextval('issue_links_id_seq'::regclass);
@@ -21414,6 +21489,8 @@ ALTER TABLE ONLY list_user_preferences ALTER COLUMN id SET DEFAULT nextval('list
ALTER TABLE ONLY lists ALTER COLUMN id SET DEFAULT nextval('lists_id_seq'::regclass);
+ALTER TABLE ONLY loose_foreign_keys_deleted_records ALTER COLUMN id SET DEFAULT nextval('loose_foreign_keys_deleted_records_id_seq'::regclass);
+
ALTER TABLE ONLY members ALTER COLUMN id SET DEFAULT nextval('members_id_seq'::regclass);
ALTER TABLE ONLY merge_request_assignees ALTER COLUMN id SET DEFAULT nextval('merge_request_assignees_id_seq'::regclass);
@@ -22036,6 +22113,12 @@ ALTER TABLE ONLY gitlab_partitions_static.analytics_cycle_analytics_merge_reques
ALTER TABLE ONLY gitlab_partitions_static.analytics_cycle_analytics_merge_request_stage_events_31
ADD CONSTRAINT analytics_cycle_analytics_merge_request_stage_events_31_pkey PRIMARY KEY (stage_event_hash_id, merge_request_id);
+ALTER TABLE ONLY loose_foreign_keys_deleted_records
+ ADD CONSTRAINT loose_foreign_keys_deleted_records_pkey PRIMARY KEY (partition, id);
+
+ALTER TABLE ONLY gitlab_partitions_static.loose_foreign_keys_deleted_records_1
+ ADD CONSTRAINT loose_foreign_keys_deleted_records_1_pkey PRIMARY KEY (partition, id);
+
ALTER TABLE ONLY product_analytics_events_experimental
ADD CONSTRAINT product_analytics_events_experimental_pkey PRIMARY KEY (id, project_id);
@@ -22333,6 +22416,9 @@ ALTER TABLE ONLY ar_internal_metadata
ALTER TABLE ONLY atlassian_identities
ADD CONSTRAINT atlassian_identities_pkey PRIMARY KEY (user_id);
+ALTER TABLE ONLY audit_events_external_audit_event_destinations
+ ADD CONSTRAINT audit_events_external_audit_event_destinations_pkey PRIMARY KEY (id);
+
ALTER TABLE ONLY audit_events
ADD CONSTRAINT audit_events_pkey PRIMARY KEY (id, created_at);
@@ -22657,6 +22743,9 @@ ALTER TABLE ONLY container_repositories
ALTER TABLE ONLY conversational_development_index_metrics
ADD CONSTRAINT conversational_development_index_metrics_pkey PRIMARY KEY (id);
+ALTER TABLE ONLY coverage_fuzzing_corpuses
+ ADD CONSTRAINT coverage_fuzzing_corpuses_pkey PRIMARY KEY (id);
+
ALTER TABLE ONLY csv_issue_imports
ADD CONSTRAINT csv_issue_imports_pkey PRIMARY KEY (id);
@@ -23023,6 +23112,9 @@ ALTER TABLE ONLY issuable_slas
ALTER TABLE ONLY issue_assignees
ADD CONSTRAINT issue_assignees_pkey PRIMARY KEY (issue_id, user_id);
+ALTER TABLE ONLY issue_customer_relations_contacts
+ ADD CONSTRAINT issue_customer_relations_contacts_pkey PRIMARY KEY (id);
+
ALTER TABLE ONLY issue_email_participants
ADD CONSTRAINT issue_email_participants_pkey PRIMARY KEY (id);
@@ -23101,9 +23193,6 @@ ALTER TABLE ONLY list_user_preferences
ALTER TABLE ONLY lists
ADD CONSTRAINT lists_pkey PRIMARY KEY (id);
-ALTER TABLE ONLY loose_foreign_keys_deleted_records
- ADD CONSTRAINT loose_foreign_keys_deleted_records_pkey PRIMARY KEY (created_at, deleted_table_name, deleted_table_primary_key_value);
-
ALTER TABLE ONLY members
ADD CONSTRAINT members_pkey PRIMARY KEY (id);
@@ -23737,6 +23826,9 @@ ALTER TABLE ONLY users_star_projects
ALTER TABLE ONLY users_statistics
ADD CONSTRAINT users_statistics_pkey PRIMARY KEY (id);
+ALTER TABLE ONLY verification_codes
+ ADD CONSTRAINT verification_codes_pkey PRIMARY KEY (created_at, visitor_id_code, code, phone);
+
ALTER TABLE ONLY vulnerabilities
ADD CONSTRAINT vulnerabilities_pkey PRIMARY KEY (id);
@@ -23995,6 +24087,8 @@ CREATE INDEX cadence_create_iterations_automation ON iterations_cadences USING b
CREATE INDEX ci_builds_gitlab_monitor_metrics ON ci_builds USING btree (status, created_at, project_id) WHERE ((type)::text = 'Ci::Build'::text);
+CREATE INDEX ci_job_artifacts_expire_at_unlocked_idx ON ci_job_artifacts USING btree (expire_at) WHERE (locked = 0);
+
CREATE INDEX code_owner_approval_required ON protected_branches USING btree (project_id, code_owner_approval_required) WHERE (code_owner_approval_required = true);
CREATE UNIQUE INDEX commit_user_mentions_on_commit_id_and_note_id_unique_index ON commit_user_mentions USING btree (commit_id, note_id);
@@ -24079,9 +24173,7 @@ 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_rel_position_and_id_and_state_id ON issues USING btree (project_id, relative_position, id, state_id);
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);
@@ -24285,6 +24377,8 @@ CREATE INDEX index_approval_project_rules_on_rule_type ON approval_project_rules
CREATE INDEX index_approval_project_rules_protected_branches_pb_id ON approval_project_rules_protected_branches USING btree (protected_branch_id);
+CREATE INDEX index_approval_project_rules_report_type ON approval_project_rules USING btree (report_type);
+
CREATE UNIQUE INDEX index_approval_project_rules_users_1 ON approval_project_rules_users USING btree (approval_project_rule_id, user_id);
CREATE INDEX index_approval_project_rules_users_2 ON approval_project_rules_users USING btree (user_id);
@@ -24479,6 +24573,8 @@ CREATE INDEX index_ci_builds_on_project_id_for_successfull_pages_deploy ON ci_bu
CREATE INDEX index_ci_builds_on_queued_at ON ci_builds USING btree (queued_at);
+CREATE INDEX index_ci_builds_on_resource_group_and_status_and_commit_id ON ci_builds USING btree (resource_group_id, status, commit_id) WHERE (resource_group_id IS NOT NULL);
+
CREATE INDEX index_ci_builds_on_runner_id_and_id_desc ON ci_builds USING btree (runner_id, id DESC);
CREATE INDEX index_ci_builds_on_stage_id ON ci_builds USING btree (stage_id);
@@ -24771,6 +24867,10 @@ CREATE UNIQUE INDEX index_clusters_applications_runners_on_cluster_id ON cluster
CREATE INDEX index_clusters_applications_runners_on_runner_id ON clusters_applications_runners USING btree (runner_id);
+CREATE INDEX index_clusters_integration_elasticstack_enabled ON clusters_integration_elasticstack USING btree (enabled, created_at, cluster_id);
+
+CREATE INDEX index_clusters_integration_prometheus_enabled ON clusters_integration_prometheus USING btree (enabled, created_at, cluster_id);
+
CREATE INDEX index_clusters_kubernetes_namespaces_on_cluster_id ON clusters_kubernetes_namespaces USING btree (cluster_id);
CREATE INDEX index_clusters_kubernetes_namespaces_on_cluster_project_id ON clusters_kubernetes_namespaces USING btree (cluster_project_id);
@@ -24803,6 +24903,12 @@ CREATE UNIQUE INDEX index_container_repositories_on_project_id_and_name ON conta
CREATE INDEX index_container_repository_on_name_trigram ON container_repositories USING gin (name gin_trgm_ops);
+CREATE INDEX index_coverage_fuzzing_corpuses_on_package_id ON coverage_fuzzing_corpuses USING btree (package_id);
+
+CREATE INDEX index_coverage_fuzzing_corpuses_on_project_id ON coverage_fuzzing_corpuses USING btree (project_id);
+
+CREATE INDEX index_coverage_fuzzing_corpuses_on_user_id ON coverage_fuzzing_corpuses USING btree (user_id);
+
CREATE INDEX index_created_at_on_codeowner_approval_merge_request_rules ON approval_merge_request_rules USING btree (created_at) WHERE ((rule_type = 2) AND (section <> 'codeowners'::text));
CREATE INDEX index_csv_issue_imports_on_project_id ON csv_issue_imports USING btree (project_id);
@@ -24867,11 +24973,19 @@ CREATE INDEX index_dep_ci_build_trace_sections_on_project_id ON dep_ci_build_tra
CREATE INDEX index_dep_ci_build_trace_sections_on_section_name_id ON dep_ci_build_trace_sections USING btree (section_name_id);
+CREATE UNIQUE INDEX index_dep_prox_manifests_on_group_id_file_name_and_status ON dependency_proxy_manifests USING btree (group_id, file_name, status);
+
CREATE INDEX index_dependency_proxy_blobs_on_group_id_and_file_name ON dependency_proxy_blobs USING btree (group_id, file_name);
+CREATE INDEX index_dependency_proxy_blobs_on_group_id_status_and_id ON dependency_proxy_blobs USING btree (group_id, status, id);
+
+CREATE INDEX index_dependency_proxy_blobs_on_status ON dependency_proxy_blobs USING btree (status);
+
CREATE INDEX index_dependency_proxy_group_settings_on_group_id ON dependency_proxy_group_settings USING btree (group_id);
-CREATE UNIQUE INDEX index_dependency_proxy_manifests_on_group_id_and_file_name ON dependency_proxy_manifests USING btree (group_id, file_name);
+CREATE INDEX index_dependency_proxy_manifests_on_group_id_status_and_id ON dependency_proxy_manifests USING btree (group_id, status, id);
+
+CREATE INDEX index_dependency_proxy_manifests_on_status ON dependency_proxy_manifests USING btree (status);
CREATE INDEX index_deploy_key_id_on_protected_branch_push_access_levels ON protected_branch_push_access_levels USING btree (deploy_key_id);
@@ -25061,13 +25175,13 @@ CREATE UNIQUE INDEX index_escalation_rules_on_all_attributes ON incident_managem
CREATE INDEX index_escalation_rules_on_user ON incident_management_escalation_rules USING btree (user_id);
-CREATE INDEX index_et_errors_on_project_id_and_status_and_events_count ON error_tracking_errors USING btree (project_id, status, events_count);
+CREATE INDEX index_et_errors_on_project_id_and_status_and_id ON error_tracking_errors USING btree (project_id, status, id);
-CREATE INDEX index_et_errors_on_project_id_and_status_and_first_seen_at ON error_tracking_errors USING btree (project_id, status, first_seen_at);
+CREATE INDEX index_et_errors_on_project_id_and_status_events_count_id_desc ON error_tracking_errors USING btree (project_id, status, events_count DESC, id DESC);
-CREATE INDEX index_et_errors_on_project_id_and_status_and_id ON error_tracking_errors USING btree (project_id, status, id);
+CREATE INDEX index_et_errors_on_project_id_and_status_first_seen_at_id_desc ON error_tracking_errors USING btree (project_id, status, first_seen_at DESC, id DESC);
-CREATE INDEX index_et_errors_on_project_id_and_status_and_last_seen_at ON error_tracking_errors USING btree (project_id, status, last_seen_at);
+CREATE INDEX index_et_errors_on_project_id_and_status_last_seen_at_id_desc ON error_tracking_errors USING btree (project_id, status, last_seen_at DESC, id DESC);
CREATE INDEX index_events_on_action ON events USING btree (action);
@@ -25107,6 +25221,8 @@ CREATE UNIQUE INDEX index_experiments_on_name ON experiments USING btree (name);
CREATE INDEX index_expired_and_not_notified_personal_access_tokens ON personal_access_tokens USING btree (id, expires_at) WHERE ((impersonation = false) AND (revoked = false) AND (expire_notification_delivered = false));
+CREATE UNIQUE INDEX index_external_audit_event_destinations_on_namespace_id ON audit_events_external_audit_event_destinations USING btree (namespace_id, destination_url);
+
CREATE UNIQUE INDEX index_external_pull_requests_on_project_and_branches ON external_pull_requests USING btree (project_id, source_branch, target_branch);
CREATE UNIQUE INDEX index_feature_flag_scopes_on_flag_id_and_environment_scope ON operations_feature_flag_scopes USING btree (feature_flag_id, environment_scope);
@@ -25323,8 +25439,6 @@ CREATE INDEX index_incident_management_pending_alert_escalations_on_alert_id ON
CREATE INDEX index_incident_management_pending_alert_escalations_on_rule_id ON ONLY incident_management_pending_alert_escalations USING btree (rule_id);
-CREATE INDEX index_incident_management_pending_alert_escalations_on_schedule ON ONLY incident_management_pending_alert_escalations USING btree (schedule_id);
-
CREATE INDEX index_incident_management_pending_issue_escalations_on_issue_id ON ONLY incident_management_pending_issue_escalations USING btree (issue_id);
CREATE INDEX index_incident_management_pending_issue_escalations_on_rule_id ON ONLY incident_management_pending_issue_escalations USING btree (rule_id);
@@ -25373,6 +25487,10 @@ CREATE UNIQUE INDEX index_issuable_slas_on_issue_id ON issuable_slas USING btree
CREATE INDEX index_issue_assignees_on_user_id ON issue_assignees USING btree (user_id);
+CREATE UNIQUE INDEX index_issue_crm_contacts_on_issue_id_and_contact_id ON issue_customer_relations_contacts USING btree (issue_id, contact_id);
+
+CREATE INDEX index_issue_customer_relations_contacts_on_contact_id ON issue_customer_relations_contacts USING btree (contact_id);
+
CREATE UNIQUE INDEX index_issue_email_participants_on_issue_id_and_lower_email ON issue_email_participants USING btree (issue_id, lower(email));
CREATE INDEX index_issue_links_on_source_id ON issue_links USING btree (source_id);
@@ -25381,6 +25499,8 @@ CREATE UNIQUE INDEX index_issue_links_on_source_id_and_target_id ON issue_links
CREATE INDEX index_issue_links_on_target_id ON issue_links USING btree (target_id);
+CREATE INDEX index_issue_metrics_first_mentioned_in_commit ON issue_metrics USING btree (issue_id) WHERE (date_part('year'::text, first_mentioned_in_commit_at) > (2019)::double precision);
+
CREATE INDEX index_issue_metrics_on_issue_id_and_timestamps ON issue_metrics USING btree (issue_id, first_mentioned_in_commit_at, first_associated_with_milestone_at, first_added_to_board_at);
CREATE INDEX index_issue_on_project_id_state_id_and_blocking_issues_count ON issues USING btree (project_id, state_id, blocking_issues_count);
@@ -25473,17 +25593,17 @@ CREATE INDEX index_label_priorities_on_priority ON label_priorities USING btree
CREATE UNIQUE INDEX index_label_priorities_on_project_id_and_label_id ON label_priorities USING btree (project_id, label_id);
-CREATE UNIQUE INDEX index_labels_on_group_id_and_project_id_and_title ON labels USING btree (group_id, project_id, title);
+CREATE INDEX index_labels_on_group_id ON labels USING btree (group_id);
-CREATE UNIQUE INDEX index_labels_on_group_id_and_title_unique ON labels USING btree (group_id, title) WHERE (project_id IS NULL);
+CREATE UNIQUE INDEX index_labels_on_group_id_and_title_varchar_unique ON labels USING btree (group_id, title varchar_pattern_ops) WHERE (project_id IS NULL);
CREATE INDEX index_labels_on_project_id ON labels USING btree (project_id);
-CREATE UNIQUE INDEX index_labels_on_project_id_and_title_unique ON labels USING btree (project_id, title) WHERE (group_id IS NULL);
+CREATE UNIQUE INDEX index_labels_on_project_id_and_title_varchar_unique ON labels USING btree (project_id, title varchar_pattern_ops) WHERE (group_id IS NULL);
CREATE INDEX index_labels_on_template ON labels USING btree (template) WHERE template;
-CREATE INDEX index_labels_on_title ON labels USING btree (title);
+CREATE INDEX index_labels_on_title_varchar ON labels USING btree (title varchar_pattern_ops);
CREATE INDEX index_labels_on_type_and_project_id ON labels USING btree (type, project_id);
@@ -25701,6 +25821,8 @@ CREATE INDEX index_namespaces_id_parent_id_is_not_null ON namespaces USING btree
CREATE INDEX index_namespaces_id_parent_id_is_null ON namespaces USING btree (id) WHERE (parent_id IS NULL);
+CREATE UNIQUE INDEX index_namespaces_name_parent_id_type ON namespaces USING btree (name, parent_id, type);
+
CREATE INDEX index_namespaces_on_created_at ON namespaces USING btree (created_at);
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);
@@ -25711,8 +25833,6 @@ CREATE INDEX index_namespaces_on_ldap_sync_last_successful_update_at ON namespac
CREATE INDEX index_namespaces_on_ldap_sync_last_update_at ON namespaces USING btree (ldap_sync_last_update_at);
-CREATE UNIQUE INDEX index_namespaces_on_name_and_parent_id ON namespaces USING btree (name, parent_id);
-
CREATE INDEX index_namespaces_on_name_trigram ON namespaces USING gin (name gin_trgm_ops);
CREATE INDEX index_namespaces_on_owner_id ON namespaces USING btree (owner_id);
@@ -25735,7 +25855,7 @@ CREATE INDEX index_namespaces_on_shared_and_extra_runners_minutes_limit ON names
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_namespaces_on_type_and_id ON namespaces USING btree (type, id);
CREATE INDEX index_namespaces_public_groups_name_id ON namespaces USING btree (name, id) WHERE (((type)::text = 'Group'::text) AND (visibility_level = 20));
@@ -25813,10 +25933,6 @@ CREATE INDEX index_on_projects_lower_path ON projects USING btree (lower((path):
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);
-
-CREATE INDEX index_on_snapshots_segment_id_recorded_at ON analytics_devops_adoption_snapshots USING btree (segment_id, recorded_at);
-
CREATE INDEX index_on_users_lower_email ON users USING btree (lower((email)::text));
CREATE INDEX index_on_users_lower_username ON users USING btree (lower((username)::text));
@@ -26281,6 +26397,8 @@ CREATE UNIQUE INDEX index_release_links_on_release_id_and_url ON release_links U
CREATE INDEX index_releases_on_author_id ON releases USING btree (author_id);
+CREATE INDEX index_releases_on_author_id_id_created_at ON releases USING btree (author_id, id, created_at);
+
CREATE INDEX index_releases_on_project_id_and_tag ON releases USING btree (project_id, tag);
CREATE INDEX index_releases_on_released_at ON releases USING btree (released_at);
@@ -26393,7 +26511,7 @@ CREATE UNIQUE INDEX index_scim_oauth_access_tokens_on_group_id_and_token_encrypt
CREATE INDEX index_secure_ci_builds_on_user_id_name_created_at ON ci_builds USING btree (user_id, name, created_at) WHERE (((type)::text = 'Ci::Build'::text) AND ((name)::text = ANY (ARRAY[('container_scanning'::character varying)::text, ('dast'::character varying)::text, ('dependency_scanning'::character varying)::text, ('license_management'::character varying)::text, ('license_scanning'::character varying)::text, ('sast'::character varying)::text, ('coverage_fuzzing'::character varying)::text, ('apifuzzer_fuzz'::character varying)::text, ('apifuzzer_fuzz_dnd'::character varying)::text, ('secret_detection'::character varying)::text])));
-CREATE INDEX index_security_ci_builds_on_name_and_id_parser_features ON ci_builds USING btree (name, id) WHERE (((name)::text = ANY (ARRAY[('container_scanning'::character varying)::text, ('dast'::character varying)::text, ('dependency_scanning'::character varying)::text, ('license_management'::character varying)::text, ('sast'::character varying)::text, ('secret_detection'::character varying)::text, ('coverage_fuzzing'::character varying)::text, ('license_scanning'::character varying)::text])) AND ((type)::text = 'Ci::Build'::text));
+CREATE INDEX index_security_ci_builds_on_name_and_id_parser_features_broken ON ci_builds USING btree (name, id) WHERE (((name)::text = ANY (ARRAY[('container_scanning'::character varying)::text, ('dast'::character varying)::text, ('dependency_scanning'::character varying)::text, ('license_management'::character varying)::text, ('sast'::character varying)::text, ('secret_detection'::character varying)::text, ('coverage_fuzzing'::character varying)::text, ('license_scanning'::character varying)::text])) AND ((type)::text = 'Ci::Build'::text));
CREATE INDEX index_security_findings_on_confidence ON security_findings USING btree (confidence);
@@ -26547,8 +26665,6 @@ CREATE UNIQUE INDEX index_system_note_metadata_on_note_id ON system_note_metadat
CREATE INDEX index_taggings_on_tag_id ON taggings USING btree (tag_id);
-CREATE INDEX index_taggings_on_taggable_id_and_taggable_type ON taggings USING btree (taggable_id, taggable_type);
-
CREATE INDEX index_taggings_on_taggable_id_and_taggable_type_and_context ON taggings USING btree (taggable_id, taggable_type, context);
CREATE UNIQUE INDEX index_tags_on_name ON tags USING btree (name);
@@ -26619,6 +26735,10 @@ CREATE UNIQUE INDEX index_token_with_ivs_on_hashed_token ON token_with_ivs USING
CREATE UNIQUE INDEX index_topics_on_name ON topics USING btree (name);
+CREATE INDEX index_topics_on_name_trigram ON topics USING gin (name gin_trgm_ops);
+
+CREATE INDEX index_topics_total_projects_count ON topics USING btree (total_projects_count DESC, id);
+
CREATE UNIQUE INDEX index_trending_projects_on_project_id ON trending_projects USING btree (project_id);
CREATE INDEX index_u2f_registrations_on_key_handle ON u2f_registrations USING btree (key_handle);
@@ -26655,10 +26775,16 @@ CREATE UNIQUE INDEX index_user_canonical_emails_on_user_id ON user_canonical_ema
CREATE UNIQUE INDEX index_user_canonical_emails_on_user_id_and_canonical_email ON user_canonical_emails USING btree (user_id, canonical_email);
+CREATE INDEX index_user_credit_card_validations_meta_data_full_match ON user_credit_card_validations USING btree (holder_name, expiration_date, last_digits, credit_card_validated_at);
+
CREATE INDEX index_user_custom_attributes_on_key_and_value ON user_custom_attributes USING btree (key, value);
CREATE UNIQUE INDEX index_user_custom_attributes_on_user_id_and_key ON user_custom_attributes USING btree (user_id, key);
+CREATE UNIQUE INDEX index_user_details_on_phone ON user_details USING btree (phone) WHERE (phone IS NOT NULL);
+
+COMMENT ON INDEX index_user_details_on_phone IS 'JiHu-specific index';
+
CREATE INDEX index_user_details_on_provisioned_by_group_id ON user_details USING btree (provisioned_by_group_id);
CREATE UNIQUE INDEX index_user_details_on_user_id ON user_details USING btree (user_id);
@@ -26741,6 +26867,10 @@ CREATE INDEX index_users_star_projects_on_project_id ON users_star_projects USIN
CREATE UNIQUE INDEX index_users_star_projects_on_user_id_and_project_id ON users_star_projects USING btree (user_id, project_id);
+CREATE UNIQUE INDEX index_verification_codes_on_phone_and_visitor_id_code ON ONLY verification_codes USING btree (visitor_id_code, phone, created_at);
+
+COMMENT ON INDEX index_verification_codes_on_phone_and_visitor_id_code IS 'JiHu-specific index';
+
CREATE UNIQUE INDEX index_vuln_historical_statistics_on_project_id_and_date ON vulnerability_historical_statistics USING btree (project_id, date);
CREATE INDEX index_vulnerabilities_on_author_id ON vulnerabilities USING btree (author_id);
@@ -26819,6 +26949,8 @@ CREATE INDEX index_vulnerability_occurrences_deduplication ON vulnerability_occu
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_location_image ON vulnerability_occurrences USING gin (((location -> 'image'::text))) WHERE (report_type = ANY (ARRAY[2, 7]));
+
CREATE INDEX index_vulnerability_occurrences_on_primary_identifier_id ON vulnerability_occurrences USING btree (primary_identifier_id);
CREATE INDEX index_vulnerability_occurrences_on_project_fingerprint ON vulnerability_occurrences USING btree (project_fingerprint);
@@ -26945,16 +27077,12 @@ CREATE UNIQUE INDEX term_agreements_unique_index ON term_agreements USING btree
CREATE INDEX tmp_idx_deduplicate_vulnerability_occurrences ON vulnerability_occurrences USING btree (project_id, report_type, location_fingerprint, primary_identifier_id, id);
-CREATE INDEX tmp_idx_on_namespaces_delayed_project_removal ON namespaces USING btree (id) WHERE (delayed_project_removal = true);
-
CREATE INDEX tmp_index_namespaces_empty_traversal_ids_with_child_namespaces ON namespaces USING btree (id) WHERE ((parent_id IS NOT NULL) AND (traversal_ids = '{}'::integer[]));
CREATE INDEX tmp_index_namespaces_empty_traversal_ids_with_root_namespaces ON namespaces USING btree (id) WHERE ((parent_id IS NULL) AND (traversal_ids = '{}'::integer[]));
CREATE INDEX tmp_index_on_vulnerabilities_non_dismissed ON vulnerabilities USING btree (id) WHERE (state <> 2);
-CREATE INDEX tmp_index_taggings_on_id_where_taggable_type_project ON taggings USING btree (id) WHERE ((taggable_type)::text = 'Project'::text);
-
CREATE UNIQUE INDEX uniq_pkgs_deb_grp_architectures_on_distribution_id_and_name ON packages_debian_group_architectures USING btree (distribution_id, name);
CREATE UNIQUE INDEX uniq_pkgs_deb_grp_components_on_distribution_id_and_name ON packages_debian_group_components USING btree (distribution_id, name);
@@ -27109,6 +27237,8 @@ ALTER INDEX analytics_cycle_analytics_merge_request_stage_events_pkey ATTACH PAR
ALTER INDEX analytics_cycle_analytics_merge_request_stage_events_pkey ATTACH PARTITION gitlab_partitions_static.analytics_cycle_analytics_merge_request_stage_events_31_pkey;
+ALTER INDEX loose_foreign_keys_deleted_records_pkey ATTACH PARTITION gitlab_partitions_static.loose_foreign_keys_deleted_records_1_pkey;
+
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;
@@ -27365,16 +27495,8 @@ 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 trigger_3f6129be01d2 BEFORE INSERT OR UPDATE ON ci_builds FOR EACH ROW EXECUTE FUNCTION trigger_3f6129be01d2();
-
-CREATE TRIGGER trigger_542d6c2ad72e BEFORE INSERT OR UPDATE ON ci_builds_metadata FOR EACH ROW EXECUTE FUNCTION trigger_542d6c2ad72e();
-
-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 dep_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_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();
CREATE TRIGGER trigger_has_external_issue_tracker_on_delete AFTER DELETE ON integrations FOR EACH ROW WHEN ((((old.category)::text = 'issue_tracker'::text) AND (old.active = true) AND (old.project_id IS NOT NULL))) EXECUTE FUNCTION set_has_external_issue_tracker();
@@ -27414,9 +27536,6 @@ ALTER TABLE ONLY service_desk_settings
ALTER TABLE ONLY design_management_designs_versions
ADD CONSTRAINT fk_03c671965c FOREIGN KEY (design_id) REFERENCES design_management_designs(id) ON DELETE CASCADE;
-ALTER TABLE ONLY terraform_state_versions
- ADD CONSTRAINT fk_04b91e4a9f FOREIGN KEY (ci_build_id) REFERENCES ci_builds(id) ON DELETE SET NULL;
-
ALTER TABLE ONLY issues
ADD CONSTRAINT fk_05f1e72feb FOREIGN KEY (author_id) REFERENCES users(id) ON DELETE SET NULL;
@@ -27429,6 +27548,9 @@ ALTER TABLE ONLY user_interacted_projects
ALTER TABLE ONLY dast_sites
ADD CONSTRAINT fk_0a57f2271b FOREIGN KEY (dast_site_validation_id) REFERENCES dast_site_validations(id) ON DELETE SET NULL;
+ALTER TABLE ONLY issue_customer_relations_contacts
+ ADD CONSTRAINT fk_0c0037f723 FOREIGN KEY (issue_id) REFERENCES issues(id) ON DELETE CASCADE;
+
ALTER TABLE ONLY web_hooks
ADD CONSTRAINT fk_0c8ca6d9d1 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
@@ -27492,6 +27614,9 @@ ALTER TABLE ONLY boards
ALTER TABLE ONLY epics
ADD CONSTRAINT fk_1fbed67632 FOREIGN KEY (start_date_sourcing_milestone_id) REFERENCES milestones(id) ON DELETE SET NULL;
+ALTER TABLE ONLY coverage_fuzzing_corpuses
+ ADD CONSTRAINT fk_204d40056a FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
+
ALTER TABLE ONLY geo_container_repository_updated_events
ADD CONSTRAINT fk_212c89c706 FOREIGN KEY (container_repository_id) REFERENCES container_repositories(id) ON DELETE CASCADE;
@@ -27531,6 +27656,9 @@ ALTER TABLE ONLY geo_event_log
ALTER TABLE ONLY deployments
ADD CONSTRAINT fk_289bba3222 FOREIGN KEY (cluster_id) REFERENCES clusters(id) ON DELETE SET NULL;
+ALTER TABLE ONLY coverage_fuzzing_corpuses
+ ADD CONSTRAINT fk_29f6f15f82 FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE;
+
ALTER TABLE ONLY agent_group_authorizations
ADD CONSTRAINT fk_2c9f941965 FOREIGN KEY (group_id) REFERENCES namespaces(id) ON DELETE CASCADE;
@@ -27741,6 +27869,9 @@ ALTER TABLE ONLY protected_branches
ALTER TABLE ONLY vulnerabilities
ADD CONSTRAINT fk_7ac31eacb9 FOREIGN KEY (updated_by_id) REFERENCES users(id) ON DELETE SET NULL;
+ALTER TABLE ONLY issue_customer_relations_contacts
+ ADD CONSTRAINT fk_7b92f835bb FOREIGN KEY (contact_id) REFERENCES customer_relations_contacts(id) ON DELETE CASCADE;
+
ALTER TABLE ONLY vulnerabilities
ADD CONSTRAINT fk_7c5bb22a22 FOREIGN KEY (due_date_sourcing_milestone_id) REFERENCES milestones(id) ON DELETE SET NULL;
@@ -28170,6 +28301,9 @@ ALTER TABLE ONLY application_settings
ALTER TABLE ONLY events
ADD CONSTRAINT fk_edfd187b6f FOREIGN KEY (author_id) REFERENCES users(id) ON DELETE CASCADE;
+ALTER TABLE ONLY coverage_fuzzing_corpuses
+ ADD CONSTRAINT fk_ef5ebf339f FOREIGN KEY (package_id) REFERENCES packages_packages(id) ON DELETE CASCADE;
+
ALTER TABLE ONLY vulnerabilities
ADD CONSTRAINT fk_efb96ab1e2 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
@@ -28314,6 +28448,9 @@ ALTER TABLE ONLY packages_conan_file_metadata
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 audit_events_external_audit_event_destinations
+ ADD CONSTRAINT fk_rails_0bc80a4edc FOREIGN KEY (namespace_id) REFERENCES namespaces(id) ON DELETE CASCADE;
+
ALTER TABLE ONLY operations_user_lists
ADD CONSTRAINT fk_rails_0c716e079b FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
@@ -28386,9 +28523,6 @@ ALTER TABLE ONLY project_deploy_tokens
ALTER TABLE ONLY analytics_cycle_analytics_project_stages
ADD CONSTRAINT fk_rails_1722574860 FOREIGN KEY (start_event_label_id) REFERENCES labels(id) ON DELETE CASCADE;
-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;
@@ -28497,9 +28631,6 @@ ALTER TABLE ONLY incident_management_oncall_rotations
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;
-
ALTER TABLE ONLY cluster_agents
ADD CONSTRAINT fk_rails_25e9fc2d5d FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
@@ -28653,9 +28784,6 @@ ALTER TABLE ONLY snippet_user_mentions
ALTER TABLE ONLY clusters_applications_helm
ADD CONSTRAINT fk_rails_3e2b1c06bc FOREIGN KEY (cluster_id) REFERENCES clusters(id) ON DELETE CASCADE;
-ALTER TABLE ONLY packages_package_file_build_infos
- ADD CONSTRAINT fk_rails_3e3f630188 FOREIGN KEY (pipeline_id) REFERENCES ci_pipelines(id) ON DELETE SET NULL;
-
ALTER TABLE ONLY epic_user_mentions
ADD CONSTRAINT fk_rails_3eaf4d88cc FOREIGN KEY (epic_id) REFERENCES epics(id) ON DELETE CASCADE;
@@ -28680,9 +28808,6 @@ ALTER TABLE ONLY epic_issues
ALTER TABLE ONLY ci_refs
ADD CONSTRAINT fk_rails_4249db8cc3 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
-ALTER TABLE ONLY security_orchestration_policy_configurations
- ADD CONSTRAINT fk_rails_42ed6c25ec FOREIGN KEY (security_policy_management_project_id) REFERENCES projects(id) ON DELETE RESTRICT;
-
ALTER TABLE ONLY ci_resources
ADD CONSTRAINT fk_rails_430336af2d FOREIGN KEY (resource_group_id) REFERENCES ci_resource_groups(id) ON DELETE CASCADE;
@@ -29838,9 +29963,6 @@ ALTER TABLE ONLY ci_job_variables
ALTER TABLE ONLY packages_nuget_metadata
ADD CONSTRAINT fk_rails_fc0c19f5b4 FOREIGN KEY (package_id) REFERENCES packages_packages(id) ON DELETE CASCADE;
-ALTER TABLE incident_management_pending_alert_escalations
- ADD CONSTRAINT fk_rails_fcbfd9338b FOREIGN KEY (schedule_id) REFERENCES incident_management_oncall_schedules(id) ON DELETE CASCADE;
-
ALTER TABLE ONLY customer_relations_contacts
ADD CONSTRAINT fk_rails_fd3f2e7572 FOREIGN KEY (organization_id) REFERENCES customer_relations_organizations(id) ON DELETE CASCADE;
@@ -29862,6 +29984,9 @@ ALTER TABLE ONLY resource_label_events
ALTER TABLE ONLY ci_builds_metadata
ADD CONSTRAINT fk_rails_ffcf702a02 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
+ALTER TABLE ONLY security_orchestration_policy_configurations
+ ADD CONSTRAINT fk_security_policy_configurations_management_project_id FOREIGN KEY (security_policy_management_project_id) REFERENCES projects(id) ON DELETE CASCADE;
+
ALTER TABLE ONLY integrations
ADD CONSTRAINT fk_services_inherit_from_id FOREIGN KEY (inherit_from_id) REFERENCES integrations(id) ON DELETE CASCADE;
diff --git a/doc/.vale/gitlab/Acronyms.yml b/doc/.vale/gitlab/Acronyms.yml
index 122cac6f8a1..b75f81dd075 100644
--- a/doc/.vale/gitlab/Acronyms.yml
+++ b/doc/.vale/gitlab/Acronyms.yml
@@ -17,6 +17,7 @@ exceptions:
- AJAX
- ANSI
- API
+ - APM
- ARM
- ARN
- ASCII
@@ -24,6 +25,7 @@ exceptions:
- BSD
- CAS
- CDN
+ - CIDR
- CLI
- CNA
- CNAME
@@ -41,11 +43,13 @@ exceptions:
- DNS
- DOM
- DSA
+ - DSL
- DVCS
- ECDSA
- ECS
- EFS
- EKS
+ - ELB
- EOL
- EXIF
- FAQ
@@ -59,6 +63,7 @@ exceptions:
- GDK
- GDPR
- GET
+ - GID
- GIF
- GKE
- GNU
@@ -94,6 +99,7 @@ exceptions:
- LESS
- LFS
- LRU
+ - LTM
- LTS
- MIME
- MIT
@@ -115,6 +121,8 @@ exceptions:
- PEM
- PEP
- PGP
+ - PID
+ - PKCS
- PHP
- PNG
- POSIX
@@ -124,6 +132,7 @@ exceptions:
- RAM
- RBAC
- RDP
+ - RDS
- REST
- RFC
- RHEL
@@ -135,6 +144,7 @@ exceptions:
- RVM
- SAAS
- SAML
+ - SAN
- SAST
- SATA
- SCIM
@@ -168,7 +178,9 @@ exceptions:
- TODO
- TOML
- TTL
+ - UID
- UDP
+ - UID
- UNIX
- URI
- URL
diff --git a/doc/.vale/gitlab/UnclearAntecedent.yml b/doc/.vale/gitlab/UnclearAntecedent.yml
index 863bbd4e109..5f238598d9f 100644
--- a/doc/.vale/gitlab/UnclearAntecedent.yml
+++ b/doc/.vale/gitlab/UnclearAntecedent.yml
@@ -1,13 +1,13 @@
---
-# Suggestion: gitlab.UnclearAntecedent
+# Warning: gitlab.UnclearAntecedent
#
# Checks for words that need a noun for clarity.
#
-# For a list of all options, see https://errata-ai.gitbook.io/vale/getting-started/styles
+# For a list of all options, see https://docs.errata.ai/vale/styles
extends: existence
message: "'%s' is not precise. Try rewriting with a specific subject and verb."
link: https://docs.gitlab.com/ee/development/documentation/styleguide/word_list.html#this-these-that-those
-level: suggestion
+level: warning
ignorecase: false
tokens:
- 'That is'
diff --git a/doc/.vale/vale-json.tmpl b/doc/.vale/vale-json.tmpl
new file mode 100644
index 00000000000..ed3c3259df3
--- /dev/null
+++ b/doc/.vale/vale-json.tmpl
@@ -0,0 +1,58 @@
+{{- /* Modify Vale's output https://docs.errata.ai/vale/cli#--output */ -}}
+
+{{- /* Keep track of our various counts */ -}}
+
+{{- $e := 0 -}}
+{{- $w := 0 -}}
+{{- $s := 0 -}}
+{{- $f := 0 -}}
+
+{{- /* Range over the linted files */ -}}
+
+{{- range .Files}}
+
+{{- $f = add1 $f -}}
+{{- $path := .Path -}}
+
+{{- /* Range over the file's alerts */ -}}
+[
+
+{{- range $idx, $a := .Alerts -}}
+
+{{- $error := "" -}}
+{{- if eq .Severity "error" -}}
+ {{- $error = .Severity -}}
+ {{- $e = add1 $e -}}
+{{- else if eq .Severity "warning" -}}
+ {{- $error = .Severity -}}
+ {{- $w = add1 $w -}}
+{{- else -}}
+ {{- $error = .Severity -}}
+ {{- $s = add1 $s -}}
+{{- end}}
+
+{{- /* Variables setup */ -}}
+
+{{- $path = $path -}}
+{{- $loc := printf "%d" .Line -}}
+{{- $check := printf "%s" .Check -}}
+{{- $message := printf "%s" .Message -}}
+{{- $link := printf "%s" .Link -}}
+{{- if $idx -}},{{- end -}}
+
+{{- /* Output */ -}}
+
+ {
+ "description": "{{ $message }}",
+ "fingerprint": "{{ $path }}-{{ $loc }}",
+ "severity": "{{ $error }}",
+ "location": {
+ "path": "{{ $path }}",
+ "lines": {
+ "begin": {{ $loc }}
+ }
+ }
+ }
+{{end -}}
+{{end -}}
+]
diff --git a/doc/README.md b/doc/README.md
deleted file mode 100644
index 0e6c2f63f9e..00000000000
--- a/doc/README.md
+++ /dev/null
@@ -1,9 +0,0 @@
----
-redirect_to: 'index.md'
-remove_date: '2021-09-28'
----
-
-This document was moved to [another location](index.md).
-
-<!-- This redirect file can be deleted after 2021-09-28. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/#move-or-rename-a-page -->
diff --git a/doc/administration/audit_events.md b/doc/administration/audit_events.md
index 3ff5fb2635d..572c341f2b2 100644
--- a/doc/administration/audit_events.md
+++ b/doc/administration/audit_events.md
@@ -137,8 +137,6 @@ Project event queries are limited to a maximum of 30 days.
### Instance events **(PREMIUM SELF)**
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/2336) in GitLab 9.3.
-
Server-wide audit events introduce the ability to observe user actions across
the entire instance of your GitLab server, making it easy to understand who
changed what and when for audit purposes.
diff --git a/doc/administration/auth/README.md b/doc/administration/auth/README.md
deleted file mode 100644
index 5ab8653dc35..00000000000
--- a/doc/administration/auth/README.md
+++ /dev/null
@@ -1,8 +0,0 @@
----
-redirect_to: 'index.md'
----
-
-This document was moved to [another location](index.md).
-
-<!-- This redirect file can be deleted after 2021-09-28. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/#move-or-rename-a-page -->
diff --git a/doc/administration/auth/index.md b/doc/administration/auth/index.md
index a072cc73c43..959c5218554 100644
--- a/doc/administration/auth/index.md
+++ b/doc/administration/auth/index.md
@@ -31,7 +31,7 @@ providers:
- [Salesforce](../../integration/salesforce.md)
- [SAML](../../integration/saml.md)
- [SAML for GitLab.com groups](../../user/group/saml_sso/index.md) **(PREMIUM SAAS)**
-- [Shibboleth](../../integration/shibboleth.md)
+- [Shibboleth](../../integration/saml.md)
- [Smartcard](smartcard.md) **(PREMIUM SELF)**
- [Twitter](../../integration/twitter.md)
@@ -45,7 +45,7 @@ For more information, see the links shown on this page for each external provide
| Capability | SaaS | Self-Managed |
|-------------------------------------------------|-----------------------------------------|------------------------------------|
-| **User Provisioning** | SCIM<br>JIT Provisioning | LDAP Sync |
+| **User Provisioning** | SCIM<br>Just-In-Time (JIT) Provisioning | LDAP Sync |
| **User Detail Updating** (not group management) | Not Available | LDAP Sync |
| **Authentication** | SAML at top-level group (1 provider) | LDAP (multiple providers)<br>Generic OAuth2<br>SAML (only 1 permitted per unique provider)<br>Kerberos<br>JWT<br>Smartcard<br>OmniAuth Providers (only 1 permitted per unique provider) |
| **Provider-to-GitLab Role Sync** | SAML Group Sync | LDAP Group Sync |
diff --git a/doc/administration/auth/ldap/google_secure_ldap.md b/doc/administration/auth/ldap/google_secure_ldap.md
index 137f35986ac..e5af8e8256a 100644
--- a/doc/administration/auth/ldap/google_secure_ldap.md
+++ b/doc/administration/auth/ldap/google_secure_ldap.md
@@ -15,7 +15,7 @@ LDAP service that can be configured with GitLab for authentication and group syn
Secure LDAP requires a slightly different configuration than standard LDAP servers.
The steps below cover:
-- Configuring the Secure LDAP Client in the Google Admin console.
+- Configuring the Secure LDAP Client in the Google administrator console.
- Required GitLab configuration.
## Configuring Google LDAP client
diff --git a/doc/administration/auth/ldap/index.md b/doc/administration/auth/ldap/index.md
index 1992b450338..92815f10b92 100644
--- a/doc/administration/auth/ldap/index.md
+++ b/doc/administration/auth/ldap/index.md
@@ -5,7 +5,7 @@ group: Access
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# General LDAP setup **(FREE SELF)**
+# Integrate LDAP with GitLab **(FREE SELF)**
GitLab integrates with [LDAP](https://en.wikipedia.org/wiki/Lightweight_Directory_Access_Protocol)
to support user authentication.
@@ -39,7 +39,9 @@ the LDAP server, or share email addresses.
### User deletion
Users deleted from the LDAP server are immediately blocked from signing in
-to GitLab. However, there's an LDAP check cache time of one hour (which is
+to GitLab and [no longer consumes a
+license](../../../user/admin_area/moderate_users.md).
+However, there's an LDAP check cache time of one hour (which is
[configurable](#adjust-ldap-user-sync-schedule) for GitLab Premium users).
This means users already signed-in or who are using Git over SSH can access
GitLab for up to one hour. Manually block the user in the GitLab Admin Area
@@ -70,15 +72,15 @@ LDAP email address, and then sign into GitLab by using their LDAP credentials.
LDAP service that can be configured with GitLab for authentication and group sync.
See [Google Secure LDAP](google_secure_ldap.md) for detailed configuration instructions.
-## Configuration
+## Configure LDAP
-To enable LDAP integration you must add your LDAP server settings in
-`/etc/gitlab/gitlab.rb` or `/home/git/gitlab/config/gitlab.yml` for Omnibus
-GitLab and installations from source respectively.
+To configure LDAP integration, add your LDAP server settings in:
-There is a Rake task to check LDAP configuration. After configuring LDAP
-using the documentation below, see [LDAP check Rake task](../../raketasks/check.md#ldap-check)
-for information on the LDAP check Rake task.
+- `/etc/gitlab/gitlab.rb` for Omnibus GitLab instances.
+- `/home/git/gitlab/config/gitlab.yml` for source install instances.
+
+After configuring LDAP, to test the configuration, use the
+[LDAP check Rake task](../../raketasks/check.md#ldap-check).
NOTE:
The `encryption` value `simple_tls` corresponds to 'Simple TLS' in the LDAP
@@ -90,9 +92,9 @@ with `start_tls` and `ssl` was replaced with `simple_tls`.
LDAP users must have a set email address, regardless of whether or not it's used
to sign in.
-### Example Configurations
+### Example Omnibus GitLab configuration
-**Omnibus Configuration**
+This example shows configuration for Omnibus GitLab instances:
```ruby
gitlab_rails['ldap_enabled'] = true
@@ -139,7 +141,9 @@ gitlab_rails['ldap_servers'] = {
}
```
-**Source Configuration**
+### Example source install configuration
+
+This example shows configuration for source install instances:
```yaml
production:
@@ -155,6 +159,8 @@ production:
### Basic configuration settings
+These configuration settings are available:
+
| Setting | Description | Required | Examples |
|--------------------|-------------|----------|----------|
| `label` | A human-friendly name for your LDAP server. It is displayed on your sign-in page. | **{check-circle}** Yes | `'Paris'` or `'Acme, Ltd.'` |
@@ -183,6 +189,8 @@ Some examples of the `user_filter` field syntax:
### SSL configuration settings
+These SSL configuration settings are available:
+
| Setting | Description | Required | Examples |
|---------------|-------------|----------|----------|
| `ca_file` | Specifies the path to a file containing a PEM-format CA certificate, for example, if you need an internal CA. | **{dotted-circle}** No | `'/etc/ca.pem'` |
@@ -193,69 +201,72 @@ Some examples of the `user_filter` field syntax:
### Attribute configuration settings
-LDAP attributes that GitLab uses to create an account for the LDAP user. The specified
-attribute can either be the attribute name as a string (for example, `'mail'`), or an
-array of attribute names to try in order (for example, `['mail', 'email']`).
-The user's LDAP sign-in is the attribute specified as `uid` above.
+GitLab uses these LDAP attributes to create an account for the LDAP user. The specified
+attribute can be either:
+
+- The attribute name as a string. For example, `'mail'`.
+- An array of attribute names to try in order. For example, `['mail', 'email']`.
+
+The user's LDAP sign in is the LDAP attribute [specified as `uid`](#basic-configuration-settings).
| Setting | Description | Required | Examples |
|--------------|-------------|----------|----------|
-| `username` | The username is used in paths for the user's own projects (like `gitlab.example.com/username/project`) and when mentioning them in issues, merge request and comments (like `@username`). If the attribute specified for `username` contains an email address, the GitLab username is part of the email address before the `@`. | **{dotted-circle}** No | `['uid', 'userid', 'sAMAccountName']` |
+| `username` | Used in paths for the user's own projects (for example, `gitlab.example.com/username/project`) and when mentioning them in issues, merge request and comments (for example, `@username`). If the attribute specified for `username` contains an email address, the GitLab username is part of the email address before the `@`. | **{dotted-circle}** No | `['uid', 'userid', 'sAMAccountName']` |
| `email` | LDAP attribute for user email. | **{dotted-circle}** No | `['mail', 'email', 'userPrincipalName']` |
| `name` | LDAP attribute for user display name. If `name` is blank, the full name is taken from the `first_name` and `last_name`. | **{dotted-circle}** No | Attributes `'cn'`, or `'displayName'` commonly carry full names. Alternatively, you can force the use of `first_name` and `last_name` by specifying an absent attribute such as `'somethingNonExistent'`. |
| `first_name` | LDAP attribute for user first name. Used when the attribute configured for `name` does not exist. | **{dotted-circle}** No | `'givenName'` |
| `last_name` | LDAP attribute for user last name. Used when the attribute configured for `name` does not exist. | **{dotted-circle}** No | `'sn'` |
-### LDAP Sync configuration settings **(PREMIUM SELF)**
+### LDAP sync configuration settings **(PREMIUM SELF)**
+
+These LDAP sync configuration settings are available:
| Setting | Description | Required | Examples |
|-------------------|-------------|----------|----------|
| `group_base` | Base used to search for groups. | **{dotted-circle}** No | `'ou=groups,dc=gitlab,dc=example'` |
-| `admin_group` | The CN of a group containing GitLab administrators. Note: Not `cn=administrators` or the full DN. | **{dotted-circle}** No | `'administrators'` |
-| `external_groups` | An array of CNs of groups containing users that should be considered external. Note: Not `cn=interns` or the full DN. | **{dotted-circle}** No | `['interns', 'contractors']` |
+| `admin_group` | The CN of a group containing GitLab administrators. Not `cn=administrators` or the full DN. | **{dotted-circle}** No | `'administrators'` |
+| `external_groups` | An array of CNs of groups containing users that should be considered external. Not `cn=interns` or the full DN. | **{dotted-circle}** No | `['interns', 'contractors']` |
| `sync_ssh_keys` | The LDAP attribute containing a user's public SSH key. | **{dotted-circle}** No | `'sshPublicKey'` or false if not set |
### Set up LDAP user filter
-If you want to limit all GitLab access to a subset of the LDAP users on your
-LDAP server, the first step should be to narrow the configured `base`. However,
-it's sometimes necessary to further filter users. In this case, you can set
-up an LDAP user filter. The filter must comply with
-[RFC 4515](https://tools.ietf.org/search/rfc4515).
+To limit all GitLab access to a subset of the LDAP users on your LDAP server, first narrow the
+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://tools.ietf.org/search/rfc4515).
-**Omnibus configuration**
+- Example user filter for Omnibus GitLab instances:
-```ruby
-gitlab_rails['ldap_servers'] = {
-'main' => {
- # snip...
- 'user_filter' => '(employeeType=developer)'
+ ```ruby
+ gitlab_rails['ldap_servers'] = {
+ 'main' => {
+ # snip...
+ 'user_filter' => '(employeeType=developer)'
+ }
}
-}
-```
+ ```
-**Source configuration**
+- Example user filter for source install instances:
-```yaml
-production:
- ldap:
- servers:
- main:
- # snip...
- user_filter: '(employeeType=developer)'
-```
+ ```yaml
+ production:
+ ldap:
+ servers:
+ main:
+ # snip...
+ user_filter: '(employeeType=developer)'
+ ```
-If you want to limit access to the nested members of an Active Directory
-group, use the following syntax:
+To limit access to the nested members of an Active Directory group, use the following syntax:
```plaintext
(memberOf:1.2.840.113556.1.4.1941:=CN=My Group,DC=Example,DC=com)
```
-For more information about this "LDAP_MATCHING_RULE_IN_CHAIN" filter, see the following
-[Microsoft Search Filter Syntax](https://docs.microsoft.com/en-us/windows/win32/adsi/search-filter-syntax) document.
+For more information about `LDAP_MATCHING_RULE_IN_CHAIN` filters, see
+[Search Filter Syntax](https://docs.microsoft.com/en-us/windows/win32/adsi/search-filter-syntax).
+
Support for nested members in the user filter shouldn't be confused with
-[group sync nested groups support](#supported-ldap-group-typesattributes). **(PREMIUM SELF)**
+[group sync nested groups](#supported-ldap-group-typesattributes) support.
GitLab does not support the custom filter syntax used by OmniAuth LDAP.
@@ -451,7 +462,7 @@ If initially your LDAP configuration looked like:
### TLS server authentication
-There are two encryption methods, `simple_tls` and `start_tls`.
+`simple_tls` and `start_tls` are the two available encryption methods.
For either encryption method, if setting `verify_certificates: false`, TLS
encryption is established with the LDAP server before any LDAP-protocol data is
@@ -463,9 +474,9 @@ exchanged but no validation of the LDAP server's SSL certificate is performed.
Not implemented by `Net::LDAP`.
-You should disable anonymous LDAP authentication and enable simple or SASL
-authentication. The TLS client authentication setting in your LDAP server cannot
-be mandatory and clients cannot be authenticated with the TLS protocol.
+You should disable anonymous LDAP authentication and enable simple or Simple Authentication
+and Security Layer (SASL) authentication. The TLS client authentication setting in your LDAP server
+cannot be mandatory and clients cannot be authenticated with the TLS protocol.
## Multiple LDAP servers **(PREMIUM SELF)**
@@ -474,7 +485,7 @@ connects to.
To add another LDAP server:
-1. Duplicate the settings under [the main configuration](#configuration).
+1. Duplicate the settings under [the main configuration](#configure-ldap).
1. Edit them to match the additional LDAP server.
Be sure to choose a different provider ID made of letters a-z and numbers 0-9.
@@ -526,7 +537,7 @@ The process executes the following access checks:
- Ensure the user is still present in LDAP.
- If the LDAP server is Active Directory, ensure the user is active (not
- blocked/disabled state). This is checked only if
+ blocked/disabled state). This check is performed only if
`active_directory: true` is set in the LDAP configuration.
In Active Directory, a user is marked as disabled/blocked if the user
@@ -702,7 +713,7 @@ When enabled, the following applies:
To enable it, you must:
-1. [Enable LDAP](#configuration)
+1. [Configure LDAP](#configure-ldap).
1. On the top bar, select **Menu > Admin**.
1. On the left sidebar, select **Settings > General**.
1. Expand the **Visibility and access controls** section.
@@ -716,7 +727,7 @@ The values shown are in cron format. If needed, you can use a
WARNING:
Do not start the sync process too frequently as this
-could lead to multiple syncs running concurrently. This is primarily a concern
+could lead to multiple syncs running concurrently. This concern is primarily
for installations with a large number of LDAP users. Review the
[LDAP group sync benchmark metrics](#benchmarks) to see how
your installation compares before proceeding.
@@ -850,7 +861,7 @@ LDAP group links each:
- Subsequent syncs (checking membership, no writes) took 15 minutes
These metrics are meant to provide a baseline and performance may vary based on
-any number of factors. This was an extreme benchmark and most instances don't
+any number of factors. This benchmark was extreme and most instances don't
have near this many users or groups. Disk speed, database performance,
network and LDAP server response time affects these metrics.
diff --git a/doc/administration/auth/ldap/ldap-troubleshooting.md b/doc/administration/auth/ldap/ldap-troubleshooting.md
index 1952e8afa97..4757725d0bd 100644
--- a/doc/administration/auth/ldap/ldap-troubleshooting.md
+++ b/doc/administration/auth/ldap/ldap-troubleshooting.md
@@ -55,9 +55,8 @@ main: # 'main' is the GitLab 'provider ID' of this LDAP server
#### Query LDAP **(PREMIUM SELF)**
The following allows you to perform a search in LDAP using the rails console.
-Depending on what you're trying to do, it may make more sense to query [a
-user](#query-a-user-in-ldap) or [a group](#query-a-group-in-ldap) directly, or
-even [use `ldapsearch`](#ldapsearch) instead.
+Depending on what you're trying to do, it may make more sense to query [a user](#query-a-user-in-ldap)
+or [a group](#query-a-group-in-ldap) directly, or even [use `ldapsearch`](#ldapsearch) instead.
```ruby
adapter = Gitlab::Auth::Ldap::Adapter.new('ldapmain')
@@ -90,7 +89,7 @@ established but GitLab doesn't show you LDAP users in the output, one of the
following is most likely true:
- The `bind_dn` user doesn't have enough permissions to traverse the user tree.
-- The user(s) don't fall under the [configured `base`](index.md#configuration).
+- The user(s) don't fall under the [configured `base`](index.md#configure-ldap).
- The [configured `user_filter`](index.md#set-up-ldap-user-filter) blocks access to the user(s).
In this case, you con confirm which of the above is true using
@@ -102,7 +101,7 @@ In this case, you con confirm which of the above is true using
A user can have trouble signing in for any number of reasons. To get started,
here are some questions to ask yourself:
-- Does the user fall under the [configured `base`](index.md#configuration) in
+- Does the user fall under the [configured `base`](index.md#configure-ldap) in
LDAP? The user must fall under this `base` to sign in.
- Does the user pass through the [configured `user_filter`](index.md#set-up-ldap-user-filter)?
If one is not configured, this question can be ignored. If it is, then the
@@ -355,11 +354,10 @@ things to check to debug the situation.
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
LDAP yet and must do so first.
-- You've waited an hour or [the configured
- interval](index.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**
- and press **Sync now** (sync one group) or [run the group sync Rake
- task](../../raketasks/ldap.md#run-a-group-sync) (sync all groups).
+- You've waited an hour or [the configured interval](index.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**
+ and press **Sync now** (sync one group) or [run the group sync Rake task](../../raketasks/ldap.md#run-a-group-sync)
+ (sync all groups).
If all of the above looks good, jump in to a little more advanced debugging in
the rails console.
@@ -371,8 +369,8 @@ the rails console.
1. Look through the output of the sync. See [example log
output](#example-console-output-after-a-group-sync)
for how to read the output.
-1. If you still aren't able to see why the user isn't being added, [query the
- LDAP group directly](#query-a-group-in-ldap) to see what members are listed.
+1. If you still aren't able to see why the user isn't being added, [query the LDAP group directly](#query-a-group-in-ldap)
+ to see what members are listed.
1. Is the user's DN or UID in one of the lists from the above output? One of the DNs or
UIDs here should match the 'Identifier' from the LDAP identity checked earlier. If it doesn't,
the user does not appear to be in the LDAP group.
@@ -387,7 +385,7 @@ the following are true:
- The configured `admin_group` in the `gitlab.rb` is a CN, rather than a DN or an array.
- This CN falls under the scope of the configured `group_base`.
- The members of the `admin_group` have already signed into GitLab with their LDAP
- credentials. GitLab only grants this administrator access to the users whose
+ credentials. GitLab only grants the Administrator role to the users whose
accounts are already connected to LDAP.
If all the above are true and the users are still not getting access, [run a manual
@@ -398,8 +396,8 @@ GitLab syncs the `admin_group`.
#### Sync all groups
NOTE:
-To sync all groups manually when debugging is unnecessary, [use the Rake
-task](../../raketasks/ldap.md#run-a-group-sync) instead.
+To sync all groups manually when debugging is unnecessary,
+[use the Rake task](../../raketasks/ldap.md#run-a-group-sync) instead.
The output from a manual [group sync](index.md#group-sync) can show you what happens
when GitLab syncs its LDAP group memberships against LDAP.
diff --git a/doc/administration/auth/oidc.md b/doc/administration/auth/oidc.md
index 6a037e75f54..12729f2050b 100644
--- a/doc/administration/auth/oidc.md
+++ b/doc/administration/auth/oidc.md
@@ -228,8 +228,7 @@ Azure B2C [offers two ways of defining the business logic for logging in a user]
While cumbersome to configure, custom policies are required because
standard Azure B2C user flows [do not send the OpenID `email` claim](https://github.com/MicrosoftDocs/azure-docs/issues/16566). In
-other words, they do not work with the [`allow_single_sign_on` or `auto_link_user`
-parameters](../../integration/omniauth.md#initial-omniauth-configuration).
+other words, they do not work with the [`allow_single_sign_on` or `auto_link_user` parameters](../../integration/omniauth.md#initial-omniauth-configuration).
With a standard Azure B2C policy, GitLab cannot create a new account or
link to an existing one with an email address.
diff --git a/doc/administration/auth/smartcard.md b/doc/administration/auth/smartcard.md
index 7e2699d5eb3..d79837776b2 100644
--- a/doc/administration/auth/smartcard.md
+++ b/doc/administration/auth/smartcard.md
@@ -126,7 +126,7 @@ more information, see [the relevant issue](https://gitlab.com/gitlab-org/gitlab/
gitlab_rails['smartcard_client_certificate_required_port'] = 3444
```
- NOTE: **Note**
+ NOTE:
Assign a value to at least one of the following variables:
`gitlab_rails['smartcard_client_certificate_required_host']` or
`gitlab_rails['smartcard_client_certificate_required_port']`.
diff --git a/doc/administration/clusters/kas.md b/doc/administration/clusters/kas.md
index 6afaff73396..226710a8911 100644
--- a/doc/administration/clusters/kas.md
+++ b/doc/administration/clusters/kas.md
@@ -104,7 +104,7 @@ In Omnibus GitLab, find the logs in `/var/log/gitlab/gitlab-kas/`.
See also the [user documentation](../../user/clusters/agent/index.md#troubleshooting)
for troubleshooting problems with individual agents.
-### KAS logs - GitOps: failed to get project info
+### KAS logs - GitOps: failed to get project information
If you get the following error message:
diff --git a/doc/administration/configure.md b/doc/administration/configure.md
index d3e37b4a0ee..822acc1a74e 100644
--- a/doc/administration/configure.md
+++ b/doc/administration/configure.md
@@ -7,10 +7,44 @@ type: reference
# Configure your GitLab installation **(FREE SELF)**
-Customize and configure your self-managed GitLab installation.
+Customize and configure your self-managed GitLab installation. Here are some quick links to get you started:
- [Authentication](auth/index.md)
- [Configuration](../user/admin_area/index.md)
- [Repository storage](repository_storage_paths.md)
- [Geo](geo/index.md)
- [Packages](packages/index.md)
+
+The following tables are intended to guide you to choose the right combination of capabilties based on your requirements. It is common to want the most
+available, quickly recoverable, highly performant and fully data resilient solution. However, there are tradeoffs.
+
+The tables lists features on the left and provides their capabilities to the right along with known trade-offs.
+
+## Gitaly Capabilities
+
+| | Availability | Recoverability | Data Resiliency | Performance | Risks/Trade-offs|
+|-|--------------|----------------|-----------------|-------------|-----------------|
+|Gitaly Cluster | Very high - tolerant of node failures | RTO for a single node of 10s with no manual intervention | Data is stored on multiple nodes | Good - While writes may take slightly longer due to voting, read distribution improves read speeds | **Trade-off** - Slight decrease in write speed for redundant, strongly-consistent storage solution. **Risks** - [Does not currently support snapshot backups](gitaly/index.md#snapshot-backup-and-recovery-limitations), GitLab backup task can be slow for large data sets |
+|Gitaly Shards | Single storage location is a single point of failure | Would need to restore only shards which failed | Single point of failure | Good - can allocate repositories to shards to spread load | **Trade-off** - Need to manually configure repositories into different shards to balance loads / storage space **Risks** - Single point of failure relies on recovery process when single-node failure occurs |
+|Gitaly + NFS | Single storage location is a single point of failure | Single node failure requires restoration from backup | Single point of failure | Average - NFS is not ideally suited to large quantities of small reads / writes which can have a detrimental impact on performance | **Trade-off** - Easy and familiar administration though NFS is not ideally suited to Git demands **Risks** - Many instances of NFS compatibility issues which provide very poor customer experiences |
+
+## Geo Capabilities
+
+If your availabity needs to span multiple zones or multiple locations, please read about [Geo](geo/index.md).
+
+| | Availability | Recoverability | Data Resiliency | Performance | Risks/Trade-offs|
+|-|--------------|----------------|-----------------|-------------|-----------------|
+|Geo| Depends on the architecture of the Geo site. It is possible to deploy secondaries in single and multiple node configurations. | Eventually consistent. Recovery point depends on replication lag, which depends on a number of factors such as network speeds. Geo supports failover from a primary to secondary site using manual commands that are scriptable. | Geo currently replicates 100% of planned data types and verifies 50%. See [limitations table](geo/replication/datatypes.md#limitations-on-replicationverification) for more detail. | Improves read/clone times for users of a secondary. | Geo is not intended to replace other backup/restore solutions. Because of replication lag and the possibility of replicating bad data from a primary, we recommend that customers also take regular backups of their primary site and test the restore process. |
+
+## Scenarios for failure modes and available mitigation paths
+
+The following table outlines failure modes and mitigation paths for the product offerings detailed in the tables above. Note - Gitaly Cluster install assumes an odd number replication factor of 3 or greater
+
+| Gitaly Mode | Loss of Single Gitaly Node | Application / Data Corruption | Regional Outage (Loss of Instance) | Notes |
+| ----------- | -------------------------- | ----------------------------- | ---------------------------------- | ----- |
+| Single Gitaly Node | Downtime - Must restore from backup | Downtime - Must restore from Backup | Downtime - Must wait for outage to end | |
+| Single Gitaly Node + Geo Secondary | Downtime - Must restore from backup, can perform a manual failover to secondary | Downtime - Must restore from Backup, errors could have propagated to secondary | Manual intervention - failover to Geo secondary | |
+| Sharded Gitaly Install | Partial Downtime - Only repos on impacted node affected, must restore from backup | Partial Downtime - Only repos on impacted node affected, must restore from backup | Downtime - Must wait for outage to end | |
+| Sharded Gitaly Install + Geo Secondary | Partial Downtime - Only repos on impacted node affected, must restore from backup, could perform manual failover to secondary for impacted repos | Partial Downtime - Only repos on impacted node affected, must restore from backup, errors could have propagated to secondary | Manual intervention - failover to Geo secondary | |
+| Gitaly Cluster Install* | No Downtime - will swap repository primary to another node after 10 seconds | N/A - All writes are voted on by multiple Gitaly Cluster nodes | Downtime - Must wait for outage to end | Snapshot backups for Gitaly Cluster nodes not supported at this time |
+| Gitaly Cluster Install* + Geo Secondary | No Downtime - will swap repository primary to another node after 10 seconds | N/A - All writes are voted on by multiple Gitaly Cluster nodes | Manual intervention - failover to Geo secondary | Snapshot backups for Gitaly Cluster nodes not supported at this time |
diff --git a/doc/administration/environment_variables.md b/doc/administration/environment_variables.md
index 057abce0ed5..3af80363916 100644
--- a/doc/administration/environment_variables.md
+++ b/doc/administration/environment_variables.md
@@ -21,6 +21,7 @@ You can use the following environment variables to override certain values:
|--------------------------------------------|---------|---------------------------------------------------------------------------------------------------------|
| `DATABASE_URL` | string | The database URL; is of the form: `postgresql://localhost/blog_development`. |
| `ENABLE_BOOTSNAP` | string | Enables Bootsnap for speeding up initial Rails boot (`1` to enable). |
+| `EXTERNAL_URL` | string | Specify the external URL at the [time of installation](https://docs.gitlab.com/omnibus/settings/configuration.html#specifying-the-external-url-at-the-time-of-installation). |
| `EXTERNAL_VALIDATION_SERVICE_TIMEOUT` | integer | Timeout, in seconds, for an [external CI/CD pipeline validation service](external_pipeline_validation.md). Default is `5`. |
| `EXTERNAL_VALIDATION_SERVICE_URL` | string | URL to an [external CI/CD pipeline validation service](external_pipeline_validation.md). |
| `EXTERNAL_VALIDATION_SERVICE_TOKEN` | string | The `X-Gitlab-Token` for authentication with an [external CI/CD pipeline validation service](external_pipeline_validation.md). |
diff --git a/doc/administration/external_pipeline_validation.md b/doc/administration/external_pipeline_validation.md
index 738cf591210..a4ed287cc3b 100644
--- a/doc/administration/external_pipeline_validation.md
+++ b/doc/administration/external_pipeline_validation.md
@@ -76,7 +76,8 @@ required number of seconds.
"email": { "type": "string" },
"created_at": { "type": ["string", "null"], "format": "date-time" },
"current_sign_in_ip": { "type": ["string", "null"] },
- "last_sign_in_ip": { "type": ["string", "null"] }
+ "last_sign_in_ip": { "type": ["string", "null"] },
+ "sign_in_count": { "type": "integer" }
}
},
"pipeline": {
diff --git a/doc/administration/feature_flags.md b/doc/administration/feature_flags.md
index 575fa9eb229..f2067e7a2d1 100644
--- a/doc/administration/feature_flags.md
+++ b/doc/administration/feature_flags.md
@@ -1,8 +1,7 @@
---
-stage: none
-group: Development
-info: "See the Technical Writers assigned to Development Guidelines: https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments-to-development-guidelines"
-type: reference
+stage: Enablement
+group: Distribution
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
description: "GitLab administrator: enable and disable GitLab features deployed behind feature flags"
---
diff --git a/doc/administration/file_hooks.md b/doc/administration/file_hooks.md
index f73c961f541..e041f1e11c6 100644
--- a/doc/administration/file_hooks.md
+++ b/doc/administration/file_hooks.md
@@ -7,16 +7,15 @@ type: reference
# File hooks **(FREE SELF)**
-> - Introduced in GitLab 10.6.
-> - Until GitLab 12.8, the feature name was Plugins.
+> Renamed feature from Plugins to File hooks in GitLab 12.8.
With custom file hooks, GitLab administrators can introduce custom integrations
without modifying the GitLab source code.
-NOTE:
-Instead of writing and supporting your own file hook you can make changes
-directly to the GitLab source code and contribute back upstream. This way we can
-ensure functionality is preserved across versions and covered by tests.
+A file hook runs on each event. You can filter events or projects
+in a file hook's code, and create many file hooks as you need. Each file hook is
+triggered by GitLab asynchronously in case of an event. For a list of events
+see the [system hooks](../system_hooks/system_hooks.md) documentation.
NOTE:
File hooks must be configured on the file system of the GitLab server. Only GitLab
@@ -24,10 +23,9 @@ server administrators can complete these tasks. Explore
[system hooks](../system_hooks/system_hooks.md) or [webhooks](../user/project/integrations/webhooks.md)
as an option if you do not have file system access.
-A file hook runs on each event. You can filter events or projects
-in a file hook's code, and create many file hooks as you need. Each file hook is
-triggered by GitLab asynchronously in case of an event. For a list of events
-see the [system hooks](../system_hooks/system_hooks.md) documentation.
+Instead of writing and supporting your own file hook, you can also make changes
+directly to the GitLab source code and contribute back upstream. In this way, we can
+ensure functionality is preserved across versions and covered by tests.
## Setup
@@ -67,7 +65,7 @@ message is logged to:
- `log/file_hook.log` in a source installation.
NOTE:
-Before 14.0 release, the file name was `plugin.log`
+In GitLab 13.12 and earlier, the filename was `plugin.log`
## Creating file hooks
diff --git a/doc/administration/geo/disaster_recovery/planned_failover.md b/doc/administration/geo/disaster_recovery/planned_failover.md
index a7a64701cbd..6312ed669ae 100644
--- a/doc/administration/geo/disaster_recovery/planned_failover.md
+++ b/doc/administration/geo/disaster_recovery/planned_failover.md
@@ -162,6 +162,9 @@ be disabled on the **primary** site:
## Finish replicating and verifying all data
+NOTE:
+GitLab 13.9 through GitLab 14.3 are affected by a bug in which the Geo secondary site statuses will appear to stop updating and become unhealthy. For more information, see [Geo Admin Area shows 'Unhealthy' after enabling Maintenance Mode](../replication/troubleshooting.md#geo-admin-area-shows-unhealthy-after-enabling-maintenance-mode).
+
1. If you are manually replicating any data not managed by Geo, trigger the
final replication process now.
1. On the **primary** node:
@@ -192,12 +195,13 @@ At this point, your **secondary** node contains an up-to-date copy of everything
## Promote the **secondary** node
-Finally, follow the [Disaster Recovery docs](index.md) to promote the
-**secondary** node to a **primary** node. This process causes a brief outage on the **secondary** node, and users may need to log in again.
+After the replication is finished, [promote the **secondary** node to a **primary** node](index.md). This process causes a brief outage on the **secondary** node, and users may need to log in again. If you follow the steps correctly, the old primary Geo site should still be disabled and user traffic should go to the newly-promoted site instead.
-Once it is completed, the maintenance window is over! Your new **primary** node, now
-begin to diverge from the old one. If problems do arise at this point, failing
+When the promotion is completed, the maintenance window is over, and your new **primary** node now
+begins to diverge from the old one. If problems do arise at this point, failing
back to the old **primary** node [is possible](bring_primary_back.md), but likely to result
in the loss of any data uploaded to the new **primary** in the meantime.
-Don't forget to remove the broadcast message after failover is complete.
+Don't forget to remove the broadcast message after the failover is complete.
+
+Finally, you can bring the [old site back as a secondary](bring_primary_back.md#configure-the-former-primary-node-to-be-a-secondary-node).
diff --git a/doc/administration/geo/disaster_recovery/runbooks/planned_failover_multi_node.md b/doc/administration/geo/disaster_recovery/runbooks/planned_failover_multi_node.md
index 4255fba83f6..3eb7bc2a8e0 100644
--- a/doc/administration/geo/disaster_recovery/runbooks/planned_failover_multi_node.md
+++ b/doc/administration/geo/disaster_recovery/runbooks/planned_failover_multi_node.md
@@ -63,6 +63,9 @@ Before following any of those steps, make sure you have `root` access to the
**secondary** to promote it, since there isn't provided an automated way to
promote a Geo replica and perform a failover.
+NOTE:
+GitLab 13.9 through GitLab 14.3 are affected by a bug in which the Geo secondary site statuses will appear to stop updating and become unhealthy. For more information, see [Geo Admin Area shows 'Unhealthy' after enabling Maintenance Mode](../../replication/troubleshooting.md#geo-admin-area-shows-unhealthy-after-enabling-maintenance-mode).
+
On the **secondary** node:
1. On the top bar, select **Menu > Admin**.
diff --git a/doc/administration/geo/disaster_recovery/runbooks/planned_failover_single_node.md b/doc/administration/geo/disaster_recovery/runbooks/planned_failover_single_node.md
index 18923da1056..d4782144df8 100644
--- a/doc/administration/geo/disaster_recovery/runbooks/planned_failover_single_node.md
+++ b/doc/administration/geo/disaster_recovery/runbooks/planned_failover_single_node.md
@@ -51,6 +51,9 @@ Before following any of those steps, make sure you have `root` access to the
**secondary** to promote it, since there isn't provided an automated way to
promote a Geo replica and perform a failover.
+NOTE:
+GitLab 13.9 through GitLab 14.3 are affected by a bug in which the Geo secondary site statuses will appear to stop updating and become unhealthy. For more information, see [Geo Admin Area shows 'Unhealthy' after enabling Maintenance Mode](../../replication/troubleshooting.md#geo-admin-area-shows-unhealthy-after-enabling-maintenance-mode).
+
On the **secondary** node, navigate to the **Admin Area > Geo** dashboard to
review its status. Replicated objects (shown in green) should be close to 100%,
and there should be no failures (shown in red). If a large proportion of
diff --git a/doc/administration/geo/replication/datatypes.md b/doc/administration/geo/replication/datatypes.md
index 3f38436429a..e8e87f92481 100644
--- a/doc/administration/geo/replication/datatypes.md
+++ b/doc/administration/geo/replication/datatypes.md
@@ -198,12 +198,12 @@ successfully, you must replicate their data using some other means.
|[Package Registry](../../../user/packages/package_registry/index.md) | **Yes** (13.2) | [**Yes**](#limitation-of-verification-for-files-in-object-storage) (13.10) | Via Object Storage provider if supported. Native Geo support (Beta). | Behind feature flag `geo_package_file_replication`, enabled by default. |
|[Versioned Terraform State](../../terraform_state.md) | **Yes** (13.5) | [**Yes**](#limitation-of-verification-for-files-in-object-storage) (13.12) | Via Object Storage provider if supported. Native Geo support (Beta). | Replication is behind the feature flag `geo_terraform_state_version_replication`, enabled by default. Verification was behind the feature flag `geo_terraform_state_version_verification`, which was removed in 14.0|
|[External merge request diffs](../../merge_request_diffs.md) | **Yes** (13.5) | No | Via Object Storage provider if supported. Native Geo support (Beta). | Replication is behind the feature flag `geo_merge_request_diff_replication`, enabled by default. Verification is under development, behind the feature flag `geo_merge_request_diff_verification`, introduced in 14.0.|
-|[Versioned snippets](../../../user/snippets.md#versioned-snippets) | [**Yes** (13.7)](https://gitlab.com/groups/gitlab-org/-/epics/2809) | [**Yes** (14.2)](https://gitlab.com/groups/gitlab-org/-/epics/2810) | No | Verification was implemented behind the feature flag `geo_snippet_repository_verification` in 13.11, and the feature flag was removed in 14.2. |
-|[Server-side Git hooks](../../server_hooks.md) | [No](https://gitlab.com/groups/gitlab-org/-/epics/1867) | No | No | |
-|[Elasticsearch integration](../../../integration/elasticsearch.md) | [No](https://gitlab.com/gitlab-org/gitlab/-/issues/1186) | No | No | |
+|[Versioned snippets](../../../user/snippets.md#versioned-snippets) | [**Yes** (13.7)](https://gitlab.com/groups/gitlab-org/-/epics/2809) | [**Yes** (14.2)](https://gitlab.com/groups/gitlab-org/-/epics/2810) | No | Verification was implemented behind the feature flag `geo_snippet_repository_verification` in 13.11, and the feature flag was removed in 14.2. |
|[GitLab Pages](../../pages/index.md) | [**Yes** (14.3)](https://gitlab.com/groups/gitlab-org/-/epics/589) | No | Via Object Storage provider if supported. Native Geo support (Beta). | Behind feature flag `geo_pages_deployment_replication`, enabled by default. |
-|[Dependency proxy images](../../../user/packages/dependency_proxy/index.md) | [No](https://gitlab.com/gitlab-org/gitlab/-/issues/259694) | No | No | Blocked on [Geo: Secondary Mimicry](https://gitlab.com/groups/gitlab-org/-/epics/1528). Replication of this cache is not needed for Disaster Recovery purposes because it can be recreated from external sources. |
-|[Vulnerability Export](../../../user/application_security/vulnerability_report/#export-vulnerability-details) | [Not planned](https://gitlab.com/groups/gitlab-org/-/epics/3111) | No | | Not planned because they are ephemeral and sensitive. They can be regenerated on demand. |
+|[Server-side Git hooks](../../server_hooks.md) | [Not planned](https://gitlab.com/groups/gitlab-org/-/epics/1867) | No | No | Not planned because of current implementation complexity, low customer interest, and availability of alternatives to hooks. |
+|[Elasticsearch integration](../../../integration/elasticsearch.md) | [Not planned](https://gitlab.com/gitlab-org/gitlab/-/issues/1186) | No | No | Not planned because further product discovery is required and Elasticsearch (ES) clusters can be rebuilt. Secondaries currently use the same ES cluster as the primary. |
+|[Dependency proxy images](../../../user/packages/dependency_proxy/index.md) | [Not planned](https://gitlab.com/gitlab-org/gitlab/-/issues/259694) | No | No | Blocked by [Geo: Secondary Mimicry](https://gitlab.com/groups/gitlab-org/-/epics/1528). Replication of this cache is not needed for disaster recovery purposes because it can be recreated from external sources. |
+|[Vulnerability Export](../../../user/application_security/vulnerability_report/#export-vulnerability-details) | [Not planned](https://gitlab.com/groups/gitlab-org/-/epics/3111) | No | No | Not planned because they are ephemeral and sensitive information. They can be regenerated on demand. |
#### Limitation of verification for files in Object Storage
diff --git a/doc/administration/geo/replication/geo_validation_tests.md b/doc/administration/geo/replication/geo_validation_tests.md
index c6b1078ddf0..a4c2f156216 100644
--- a/doc/administration/geo/replication/geo_validation_tests.md
+++ b/doc/administration/geo/replication/geo_validation_tests.md
@@ -114,6 +114,13 @@ The following are GitLab upgrade validation tests we performed.
The following are PostgreSQL upgrade validation tests we performed.
+### September 2021
+
+[Verify Geo installation with PostgreSQL 13](https://gitlab.com/gitlab-org/omnibus-gitlab/-/issues/6131):
+
+- Description: With PostgreSQL 13 available as an opt-in version in GitLab 14.1, we tested fresh installations of GitLab with Geo when PostgreSQL 13 is enabled.
+- Outcome: Successfully built an environment with Geo and PostgreSQL 13 using [GitLab Environment Toolkit](https://gitlab.com/gitlab-org/quality/gitlab-environment-toolkit) and performed Geo QA tests against the environment without failures.
+
### September 2020
[Verify PostgreSQL 12 upgrade for Geo installations](https://gitlab.com/gitlab-org/omnibus-gitlab/-/issues/5454):
diff --git a/doc/administration/geo/replication/multiple_servers.md b/doc/administration/geo/replication/multiple_servers.md
index 7db210d31f4..87b1aa7fc44 100644
--- a/doc/administration/geo/replication/multiple_servers.md
+++ b/doc/administration/geo/replication/multiple_servers.md
@@ -199,7 +199,7 @@ then make the following modifications:
## `application_role` already enables this. You only need this line if
## you selectively enable individual services that depend on Rails, like
- ## `puma`, `sidekiq`, `geo-logcursor`, etc.
+ ## `puma`, `sidekiq`, `geo-logcursor`, and so on.
gitlab_rails['enable'] = true
##
diff --git a/doc/administration/geo/replication/object_storage.md b/doc/administration/geo/replication/object_storage.md
index 1f799b30125..3a10d3bad58 100644
--- a/doc/administration/geo/replication/object_storage.md
+++ b/doc/administration/geo/replication/object_storage.md
@@ -73,7 +73,7 @@ GitLab does not currently support the case where both:
## Third-party replication services
When using Amazon S3, you can use
-[CRR](https://docs.aws.amazon.com/AmazonS3/latest/dev/crr.html) to
+[Cross-Region Replication (CRR)](https://docs.aws.amazon.com/AmazonS3/latest/dev/crr.html) to
have automatic replication between the bucket used by the **primary** site and
the bucket used by **secondary** sites.
diff --git a/doc/administration/geo/replication/security_review.md b/doc/administration/geo/replication/security_review.md
index 966902a3d74..df893298f85 100644
--- a/doc/administration/geo/replication/security_review.md
+++ b/doc/administration/geo/replication/security_review.md
@@ -26,7 +26,7 @@ from [owasp.org](https://owasp.org/).
- Geo streams almost all data held by a GitLab instance between sites. This
includes full database replication, most files (user-uploaded attachments,
- etc) and repository + wiki data. In a typical configuration, this will
+ and so on) and repository + wiki data. In a typical configuration, this will
happen across the public Internet, and be TLS-encrypted.
- PostgreSQL replication is TLS-encrypted.
- See also: [only TLSv1.2 should be supported](https://gitlab.com/gitlab-org/omnibus-gitlab/-/issues/2948)
diff --git a/doc/administration/geo/replication/troubleshooting.md b/doc/administration/geo/replication/troubleshooting.md
index 7b82d742bd5..b7370d32056 100644
--- a/doc/administration/geo/replication/troubleshooting.md
+++ b/doc/administration/geo/replication/troubleshooting.md
@@ -83,7 +83,7 @@ Checking Geo ... Finished
#### Sync status Rake task
Current sync information can be found manually by running this Rake task on any
-**secondary** app node:
+node running Rails (Puma, Sidekiq, or Geo Log Cursor) on the Geo **secondary** site:
```shell
sudo gitlab-rake geo:status
@@ -292,9 +292,8 @@ be set on the **primary** database. In GitLab 9.4, we have made this setting
default to 1. You may need to increase this value if you have more
**secondary** nodes.
-Be sure to restart PostgreSQL for this to take
-effect. See the [PostgreSQL replication
-setup](../setup/database.md#postgresql-replication) guide for more details.
+Be sure to restart PostgreSQL for this to take effect. See the
+[PostgreSQL replication setup](../setup/database.md#postgresql-replication) guide for more details.
### Message: `FATAL: could not start WAL streaming: ERROR: replication slot "geo_secondary_my_domain_com" does not exist`?
@@ -430,7 +429,7 @@ their resync may take a long time and cause significant load on your Geo nodes,
storage and network systems.
If you get the error `Synchronization failed - Error syncing repository` along with the following log messages, this indicates that the expected `geo` remote is not present in the `.git/config` file
-of a repository on the secondary Geo node's filesystem:
+of a repository on the secondary Geo node's file system:
```json
{
@@ -803,7 +802,7 @@ get_ctl_options': invalid option: --skip-preflight-checks (OptionParser::Invalid
get_ctl_options': invalid option: --force (OptionParser::InvalidOption)
```
-This can happen with XFS or filesystems that list files in lexical order, because the
+This can happen with XFS or file systems that list files in lexical order, because the
load order of the Omnibus command files can be different than expected, and a global function would get redefined.
More details can be found in [the related issue](https://gitlab.com/gitlab-org/omnibus-gitlab/-/issues/6076).
@@ -923,6 +922,14 @@ To resolve this issue:
If using a load balancer, ensure that the load balancer's URL is set as the `external_url` in the
`/etc/gitlab/gitlab.rb` of the nodes behind the load balancer.
+### Geo Admin Area shows 'Unhealthy' after enabling Maintenance Mode
+
+In GitLab 13.9 through GitLab 14.3, when [GitLab Maintenance Mode](../../maintenance_mode/index.md) is enabled, the status of Geo secondary sites will stop getting updated. After 10 minutes, the status will become `Unhealthy`.
+
+Geo secondary sites will continue to replicate and verify data, and the secondary sites should still be usable. You can use the [Sync status Rake task](#sync-status-rake-task) to determine the actual status of a secondary site during Maintenance Mode.
+
+This bug was [fixed in GitLab 14.4](https://gitlab.com/gitlab-org/gitlab/-/issues/292983).
+
### GitLab Pages return 404 errors after promoting
This is due to [Pages data not being managed by Geo](datatypes.md#limitations-on-replicationverification).
diff --git a/doc/administration/geo/replication/version_specific_updates.md b/doc/administration/geo/replication/version_specific_updates.md
index 84193e6baac..1b22a5f0991 100644
--- a/doc/administration/geo/replication/version_specific_updates.md
+++ b/doc/administration/geo/replication/version_specific_updates.md
@@ -13,6 +13,8 @@ for updating Geo nodes.
## Updating to 14.1, 14.2, 14.3
+### Multi-arch images
+
We found an [issue](https://gitlab.com/gitlab-org/gitlab/-/issues/336013) where the Container Registry replication wasn't fully working if you used multi-arch images. In case of a multi-arch image, only the primary architecture (for example `amd64`) would be replicated to the secondary node. This has been [fixed in GitLab 14.3](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/67624) and was backported to 14.2 and 14.1, but manual steps are required to force a re-sync.
You can check if you are affected by running:
@@ -46,18 +48,28 @@ Otherwise, on all your **secondary** nodes, in a [Rails console](../../operation
If you are running a version prior to 14.1 and are using Geo and multi-arch containers in your Container Registry, we recommend [upgrading](updating_the_geo_sites.md) to at least GitLab 14.1.
+### Geo Admin Area shows 'Unhealthy' after enabling Maintenance Mode
+
+GitLab 13.9 through GitLab 14.3 are affected by a bug in which enabling [GitLab Maintenance Mode](../../maintenance_mode/index.md) will cause Geo secondary site statuses to appear to stop updating and become unhealthy. For more information, see [Troubleshooting - Geo Admin Area shows 'Unhealthy' after enabling Maintenance Mode](troubleshooting.md#geo-admin-area-shows-unhealthy-after-enabling-maintenance-mode).
+
## Updating to GitLab 14.0/14.1
+### Primary sites can not be removed from the UI
+
We found an issue where [Primary sites can not be removed from the UI](https://gitlab.com/gitlab-org/gitlab/-/issues/338231).
This bug only exists in the UI and does not block the removal of Primary sites using any other method.
-### If you have already updated to an affected version and need to remove your Primary site
+If you are running an affected version and need to remove your Primary site, you can manually remove the Primary site by using the [Geo Nodes API](../../../api/geo_nodes.md#delete-a-geo-node).
-You can manually remove the Primary site by using the [Geo Nodes API](../../../api/geo_nodes.md#delete-a-geo-node).
+### Geo Admin Area shows 'Unhealthy' after enabling Maintenance Mode
+
+GitLab 13.9 through GitLab 14.3 are affected by a bug in which enabling [GitLab Maintenance Mode](../../maintenance_mode/index.md) will cause Geo secondary site statuses to appear to stop updating and become unhealthy. For more information, see [Troubleshooting - Geo Admin Area shows 'Unhealthy' after enabling Maintenance Mode](troubleshooting.md#geo-admin-area-shows-unhealthy-after-enabling-maintenance-mode).
## Updating to GitLab 13.12
+### Secondary nodes re-download all LFS files upon update
+
We found an issue where [secondary nodes re-download all LFS files](https://gitlab.com/gitlab-org/gitlab/-/issues/334550) upon update. This bug:
- Only applies to Geo secondary sites that have replicated LFS objects.
@@ -68,7 +80,7 @@ We found an issue where [secondary nodes re-download all LFS files](https://gitl
If you don't have many LFS objects or can stand a bit of churn, then it is safe to let the secondary sites re-download LFS objects.
If you do have many LFS objects, or many Geo secondary sites, or limited bandwidth, or a combination of them all, then we recommend you skip GitLab 13.12.0 through 13.12.6 and update to GitLab 13.12.7 or newer.
-### If you have already updated to an affected version, and the re-sync is ongoing
+#### If you have already updated to an affected version, and the re-sync is ongoing
You can manually migrate the legacy sync state to the new state column by running the following command in a [Rails console](../../operations/rails_console.md). It should take under a minute:
@@ -76,15 +88,31 @@ You can manually migrate the legacy sync state to the new state column by runnin
Geo::LfsObjectRegistry.where(state: 0, success: true).update_all(state: 2)
```
+### Geo Admin Area shows 'Unhealthy' after enabling Maintenance Mode
+
+GitLab 13.9 through GitLab 14.3 are affected by a bug in which enabling [GitLab Maintenance Mode](../../maintenance_mode/index.md) will cause Geo secondary site statuses to appear to stop updating and become unhealthy. For more information, see [Troubleshooting - Geo Admin Area shows 'Unhealthy' after enabling Maintenance Mode](troubleshooting.md#geo-admin-area-shows-unhealthy-after-enabling-maintenance-mode).
+
## Updating to GitLab 13.11
We found an [issue with Git clone/pull through HTTP(s)](https://gitlab.com/gitlab-org/gitlab/-/issues/330787) on Geo secondaries and on any GitLab instance if maintenance mode is enabled. This was caused by a regression in GitLab Workhorse. This is fixed in the [GitLab 13.11.4 patch release](https://about.gitlab.com/releases/2021/05/14/gitlab-13-11-4-released/). To avoid this issue, upgrade to GitLab 13.11.4 or later.
+### Geo Admin Area shows 'Unhealthy' after enabling Maintenance Mode
+
+GitLab 13.9 through GitLab 14.3 are affected by a bug in which enabling [GitLab Maintenance Mode](../../maintenance_mode/index.md) will cause Geo secondary site statuses to appear to stop updating and become unhealthy. For more information, see [Troubleshooting - Geo Admin Area shows 'Unhealthy' after enabling Maintenance Mode](troubleshooting.md#geo-admin-area-shows-unhealthy-after-enabling-maintenance-mode).
+
+## Updating to GitLab 13.10
+
+### Geo Admin Area shows 'Unhealthy' after enabling Maintenance Mode
+
+GitLab 13.9 through GitLab 14.3 are affected by a bug in which enabling [GitLab Maintenance Mode](../../maintenance_mode/index.md) will cause Geo secondary site statuses to appear to stop updating and become unhealthy. For more information, see [Troubleshooting - Geo Admin Area shows 'Unhealthy' after enabling Maintenance Mode](troubleshooting.md#geo-admin-area-shows-unhealthy-after-enabling-maintenance-mode).
+
## Updating to GitLab 13.9
+### Error during zero-downtime update: "cannot drop column asset_proxy_whitelist"
+
We've detected an issue [with a column rename](https://gitlab.com/gitlab-org/gitlab/-/issues/324160)
that will prevent upgrades to GitLab 13.9.0, 13.9.1, 13.9.2 and 13.9.3 when following the zero-downtime steps. It is necessary
-to perform the following additional steps for the zero-downtime upgrade:
+to perform the following additional steps for the zero-downtime update:
1. Before running the final `sudo gitlab-rake db:migrate` command on the deploy node,
execute the following queries using the PostgreSQL console (or `sudo gitlab-psql`)
@@ -118,6 +146,10 @@ DETAIL: trigger trigger_0d588df444c8 on table application_settings depends on co
To work around this bug, follow the previous steps to complete the update.
More details are available [in this issue](https://gitlab.com/gitlab-org/gitlab/-/issues/324160).
+### Geo Admin Area shows 'Unhealthy' after enabling Maintenance Mode
+
+GitLab 13.9 through GitLab 14.3 are affected by a bug in which enabling [GitLab Maintenance Mode](../../maintenance_mode/index.md) will cause Geo secondary site statuses to appear to stop updating and become unhealthy. For more information, see [Troubleshooting - Geo Admin Area shows 'Unhealthy' after enabling Maintenance Mode](troubleshooting.md#geo-admin-area-shows-unhealthy-after-enabling-maintenance-mode).
+
## Updating to GitLab 13.7
We've detected an issue with the `FetchRemove` call used by Geo secondaries.
diff --git a/doc/administration/get_started.md b/doc/administration/get_started.md
index c0d5a45d8d1..2455aecafea 100644
--- a/doc/administration/get_started.md
+++ b/doc/administration/get_started.md
@@ -54,7 +54,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).
-- Consider [repository mirroring](../user/project/repository/repository_mirroring.md)—an [alternative to project migrations](../ci/ci_cd_for_external_repos/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).
@@ -128,7 +128,7 @@ The routine differs, depending on whether you deployed with Omnibus or the Helm
When you backing up an Omnibus (single node) GitLab server, you can use a single Rake task.
-Learn about [backing up Omnibus or Helm variations](../raketasks/backup_restore.md#back-up-gitlab).
+Learn about [backing up Omnibus or Helm variations](../raketasks/backup_restore.md).
This process backs up your entire instance, but does not back up the configuration files. Ensure those are backed up separately.
Keep your configuration files and backup archives in a separate location to ensure the encryption keys are not kept with the encrypted data.
@@ -214,7 +214,7 @@ If you use GitLab SaaS, you have several channels with which to get support and
To get assistance for GitLab SaaS:
-- Access [GitLab Docs](../README.md) for self-service support.
+- Access [GitLab Docs](../index.md) for self-service support.
- Join the [GitLab Forum](https://forum.gitlab.com/) for community support.
- Gather [your subscription information](https://about.gitlab.com/support/#for-self-managed-users) before submitting a ticket.
- Submit a support ticket for:
diff --git a/doc/administration/gitaly/faq.md b/doc/administration/gitaly/faq.md
index c7ecaa020e0..f79b9555c10 100644
--- a/doc/administration/gitaly/faq.md
+++ b/doc/administration/gitaly/faq.md
@@ -35,7 +35,7 @@ For more information, see:
## Are there instructions for migrating to Gitaly Cluster?
-Yes! For more information, see [Migrate to Gitaly Cluster](index.md#migrate-to-gitaly-cluster).
+Yes! For more information, see [Migrating to Gitaly Cluster](index.md#migrating-to-gitaly-cluster).
## What are some repository storage recommendations?
diff --git a/doc/administration/gitaly/index.md b/doc/administration/gitaly/index.md
index 7a7aac884ed..c689530e12c 100644
--- a/doc/administration/gitaly/index.md
+++ b/doc/administration/gitaly/index.md
@@ -10,14 +10,22 @@ type: reference
[Gitaly](https://gitlab.com/gitlab-org/gitaly) provides high-level RPC access to Git repositories.
It is used by GitLab to read and write Git data.
+Gitaly is present in every GitLab installation and coordinates Git repository
+storage and retrieval. Gitaly can be:
+
+- A simple background service operating on a single instance Omnibus GitLab (all of
+ GitLab on one machine).
+- Separated onto its own instance and configured in a full cluster configuration,
+ depending on scaling and availability requirements.
+
Gitaly implements a client-server architecture:
- A Gitaly server is any node that runs Gitaly itself.
-- A Gitaly client is any node that runs a process that makes requests of the Gitaly server. These
- include, but are not limited to:
- - [GitLab Rails application](https://gitlab.com/gitlab-org/gitlab).
- - [GitLab Shell](https://gitlab.com/gitlab-org/gitlab-shell).
- - [GitLab Workhorse](https://gitlab.com/gitlab-org/gitlab-workhorse).
+- A Gitaly client is any node that runs a process that makes requests of the Gitaly server. Gitaly clients are also known as _Gitaly consumers_ and include:
+ - [GitLab Rails application](https://gitlab.com/gitlab-org/gitlab)
+ - [GitLab Shell](https://gitlab.com/gitlab-org/gitlab-shell)
+ - [GitLab Workhorse](https://gitlab.com/gitlab-org/gitlab-workhorse)
+ - [GitLab Elasticsearch Indexer](https://gitlab.com/gitlab-org/gitlab-elasticsearch-indexer)
Gitaly manages only Git repository access for GitLab. Other types of GitLab data aren't accessed
using Gitaly.
@@ -35,9 +43,49 @@ repository storage is either:
- Read requests are distributed between multiple Gitaly nodes, which can improve performance.
- Write requests are broadcast to repository replicas.
-WARNING:
-Engineering support for NFS for Git repositories is deprecated. Read the
-[deprecation notice](#nfs-deprecation-notice).
+## Guidance regarding Gitaly Cluster
+
+Gitaly Cluster provides the benefits of fault tolerance, but comes with additional complexity of setup and management. Please review existing technical limitations and considerations prior to deploying Gitaly Cluster.
+
+- [Known issues](#known-issues)
+- [Snapshot limitations](#snapshot-backup-and-recovery-limitations).
+
+Please also review the [configuration guidance](configure_gitaly.md) and [Repository storage options](../repository_storage_paths.md) to make sure that Gitaly Cluster is the best set-up for you. Finally, refer to the following guidance:
+
+- If you have not yet migrated to Gitaly Cluster and want to continue using NFS, remain on the
+ service you are using. NFS is supported in 14.x releases.
+- If you have not yet migrated to Gitaly Cluster but want to migrate away from NFS, you have two options - a sharded Gitaly instance or Gitaly Cluster.
+- If you have migrated to Gitaly Cluster and the limitations and tradeoffs are not suitable for your environment, your options are:
+ 1. [Migrate off Gitaly Cluster](#migrate-off-gitaly-cluster) back to your NFS solution
+ 1. [Migrate off Gitaly Cluster](#migrate-off-gitaly-cluster) to NFS solution or to a sharded Gitaly instance.
+
+Reach out to your Technical Account Manager or customer support if you have any questions.
+
+### Known issues
+
+The following table outlines current known issues impacting the use of Gitaly Cluster. For
+the current status of these issues, please refer to the referenced issues and epics.
+
+| Issue | Summary | How to avoid |
+|:--------------------------------------------------------------------------------------|:------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|:--------------------------------|
+| Gitaly Cluster + Geo - Issues retrying failed syncs | If Gitaly Cluster is used on a Geo secondary site, repositories that have failed to sync could continue to fail when Geo tries to resync them. Recovering from this state requires assistance from support to run manual steps. Work is in-progress to update Gitaly Cluster to [identify repositories with a unique and persistent identifier](https://gitlab.com/gitlab-org/gitaly/-/issues/3485), which is expected to resolve the issue. | No known solution at this time. |
+| Database inconsistencies due to repository access outside of Gitaly Cluster's control | Operations that write to the repository storage that do not go through normal Gitaly Cluster methods can cause database inconsistencies. These can include (but are not limited to) snapshot restoration for cluster node disks, node upgrades which modify files under Git control, or any other disk operation that may touch repository storage external to GitLab. The Gitaly team is actively working to provide manual commands to [reconcile the Praefect database with the repository storage](https://gitlab.com/groups/gitlab-org/-/epics/6723). | Don't directly change repositories on any Gitaly Cluster node at this time. |
+| Praefect unable to insert data into the database due to migrations not being applied after an upgrade | If the database is not kept up to date with completed migrations, then the Praefect node is unable to perform normal operation. | Make sure the Praefect database is up and running with all migrations completed (For example: `/opt/gitlab/embedded/bin/praefect -config /var/opt/gitlab/praefect/config.toml sql-migrate-status` should show a list of all applied migrations). Consider [requesting live upgrade assistance](https://about.gitlab.com/support/scheduling-live-upgrade-assistance.html) so your upgrade plan can be reviewed by support. |
+| Restoring a Gitaly Cluster node from a snapshot in a running cluster | Because the Gitaly Cluster runs with consistent state, introducing a single node that is behind will result in the cluster not being able to reconcile the nodes data and other nodes data | Don't restore a single Gitaly Cluster node from a backup snapshot. If you need to restore from backup, it's best to snapshot all Gitaly Cluster nodes at the same time and take a database dump of the Praefect database. |
+
+### Snapshot backup and recovery limitations
+
+Gitaly Cluster does not support snapshot backups because these can cause issues where the Praefect
+database becomes out of sync with the disk storage. Because of how Praefect rebuilds the replication
+metadata of Gitaly disk information during a restore, we recommend using the
+[official backup and restore Rake tasks](../../raketasks/backup_restore.md). If you are unable to use this method, please contact customer support for restoration help.
+
+To track progress on work on a solution for manually re-synchronizing the Praefect database with
+disk storage, see [this epic](https://gitlab.com/groups/gitlab-org/-/epics/6575).
+
+### What to do if you are on Gitaly Cluster experiencing an issue or limitation
+
+Please contact customer support for immediate help in restoration or recovery.
## Gitaly
@@ -156,54 +204,6 @@ WARNING:
If complete cluster failure occurs, disaster recovery plans should be executed. These can affect the
RPO and RTO discussed above.
-### Architecture and configuration recommendations
-
-The following table provides recommendations based on your
-requirements. Users means concurrent users actively performing
-simultaneous Git Operations.
-
-Gitaly services are present in every GitLab installation and always coordinates Git repository storage and
-retrieval. Gitaly can be as simple as a single background service when operating on a single instance Omnibus
-GitLab (All of GitLab on one machine). Gitaly can be separated into it's own instance and it can be configured in
-a full cluster configuration depending on scaling and availability requirements.
-
-The GitLab Reference Architectures provide guidance for what Gitaly configuration is advisable at each of the scales.
-The Gitaly configuration is noted by the architecture diagrams and the table of required resources.
-
-| User Scaling | Reference Architecture To Use | GitLab Instance Configuration | Gitaly Configuration | Git Repository Storage | Instances Dedicated to Gitaly Services |
-| ------------------------------------------------------------ | ------------------------------------------------------------ | -------------------------------------------- | ------------------------------- | ---------------------------------- | -------------------------------------- |
-| Up to 1000 Users | [1K](../reference_architectures/1k_users.md) | Single Instance for all of GitLab | Already Integrated as a Service | Local Disk | 0 |
-| Up to 2999 Users | [2K](../reference_architectures/2k_users.md) | Horizontally Scaled GitLab Instance (Non-HA) | Single Gitaly Server | Local Disk of Gitaly Instance | 1 |
-| 3000 Users and Over | [3K](../reference_architectures/1k_users.md) | Horizontally Scaled GitLab Instance with HA | Gitaly Cluster | Local Disk of Each Gitaly Instance | 8 |
-| RTO/RPO Requirements for AZ Failure Tolerance Regardless of User Scale | [3K (with downscaling)](../reference_architectures/3k_users.md) | Custom (1) | Gitaly Cluster | Local Disk of Each Gitaly Instance | 8 |
-
-1. If you feel that you need AZ Failure Tolerance for user scaling lower than 3K, please contact Customer Success
- to discuss your RTO and RPO needs and what options exist to meet those objectives.
-
-WARNING:
-At present, some [known database inconsistency issues](#known-issues-impacting-gitaly-cluster)
-exist in Gitaly Cluster. It is our recommendation that for now, you remain on your current service.
-We will adjust the date for NFS support removal if this applies to you.
-
-### Known issues impacting Gitaly Cluster
-
-The following table outlines current known issues impacting the use of Gitaly Cluster. For
-the most up to date status of these issues, please refer to the referenced issues / epics.
-
-| Issue | Summary |
-| Gitaly Cluster + Geo can cause database inconsistencies | There are some conditions during Geo replication that can cause database inconsistencies with Gitaly Cluster. These have been identified and are being resolved by updating Gitaly Cluster to [identify repositories with a unique and persistent identifier](https://gitlab.com/gitlab-org/gitaly/-/issues/3485). |
-| Database inconsistencies due to repository access outside of Gitaly Cluster's control | Operations that write to the repository storage which do not go through normal Gitaly Cluster methods can cause database inconsistencies. These can include (but are not limited to) snapshot restoration for cluster node disks, node upgrades which modify files under Git control, or any other disk operation that may touch repository storage external to GitLab. The Gitaly team is actively working to provide manual commands to [reconcile the Praefect database with the repository storage](https://gitlab.com/groups/gitlab-org/-/epics/6723). |
-
-### Snapshot backup and recovery limitations
-
-Gitaly Cluster does not support snapshot backups because these can cause issues where the
-Praefect database becomes out of sync with the disk storage. Because of how Praefect rebuilds
-the replication metadata of Gitaly disk information during a restore, we recommend using the
-[official backup and restore Rake tasks](../../raketasks/backup_restore.md).
-
-To track progress on work on a solution for manually re-synchronizing the Praefect database
-with disk storage, see [this epic](https://gitlab.com/groups/gitlab-org/-/epics/6575).
-
### Virtual storage
Virtual storage makes it viable to have a single repository storage in GitLab to simplify repository
@@ -232,9 +232,7 @@ As with normal Gitaly storages, virtual storages can be sharded.
### Moving beyond NFS
-WARNING:
-Engineering support for NFS for Git repositories is deprecated. Technical support is planned to be
-unavailable from GitLab 15.0. No further enhancements are planned for this feature.
+Engineering support for NFS for Git repositories is deprecated. Technical support is planned to be unavailable starting GitLab 15.0. Please see our [statement of support](https://about.gitlab.com/support/statement-of-support.html#gitaly-and-nfs) for more details.
[Network File System (NFS)](https://en.wikipedia.org/wiki/Network_File_System)
is not well suited to Git workloads which are CPU and IOPS sensitive.
@@ -355,13 +353,9 @@ For configuration information, see [Configure replication factor](praefect.md#co
For more information on configuring Gitaly Cluster, see [Configure Gitaly Cluster](praefect.md).
-## Migrate to Gitaly Cluster
-
-We recommend you migrate to Gitaly Cluster if your
-[requirements recommend](#architecture-and-configuration-recommendations) Gitaly Cluster.
+## Migrating to Gitaly Cluster
-Whether migrating to Gitaly Cluster because of [NFS support deprecation](index.md#nfs-deprecation-notice)
-or to move from single Gitaly nodes, the basic process involves:
+Please see [current guidance on Gitaly Cluster](#guidance-regarding-gitaly-cluster). The basic process for migrating to Gitaly Cluster involves:
1. Create the required storage. Refer to
[repository storage recommendations](faq.md#what-are-some-repository-storage-recommendations).
@@ -371,9 +365,20 @@ or to move from single Gitaly nodes, the basic process involves:
automatic migration but the moves can be scheduled with the GitLab API.
WARNING:
-At present, some [known database inconsistency issues](#known-issues-impacting-gitaly-cluster)
-exist in Gitaly Cluster. It is our recommendation that for now, you remain on your current service.
-We will adjust the date for NFS support removal if this applies to you.
+Some [known database inconsistency issues](#known-issues) exist in Gitaly Cluster. We recommend you
+remain on your current service for now.
+
+### Migrate off Gitaly Cluster
+
+If you have repositories stored on a Gitaly Cluster, but you'd like to migrate
+them back to direct Gitaly storage:
+
+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. There are different possibilities to move them
+ by shard or by group, this gives you the opportunity to spread them over
+ multiple Gitaly servers.
## Monitor Gitaly and Gitaly Cluster
@@ -615,20 +620,4 @@ The second facet presents the only real solution. For this, we developed
## NFS deprecation notice
Engineering support for NFS for Git repositories is deprecated. Technical support is planned to be
-unavailable from GitLab 15.0. No further enhancements are planned for this feature.
-
-Additional information:
-
-- [Recommended NFS mount options and known issues with Gitaly and NFS](../nfs.md#upgrade-to-gitaly-cluster-or-disable-caching-if-experiencing-data-loss).
-- [GitLab statement of support](https://about.gitlab.com/support/statement-of-support.html#gitaly-and-nfs).
-
-GitLab recommends:
-
-- Creating a [Gitaly Cluster](#gitaly-cluster) as soon as possible.
-- [Moving your repositories](#migrate-to-gitaly-cluster) from NFS-based storage to Gitaly
- Cluster.
-
-We welcome your feedback on this process. You can:
-
-- Raise a support ticket.
-- [Comment on the epic](https://gitlab.com/groups/gitlab-org/-/epics/4916).
+unavailable from GitLab 15.0. For further information, please see our [NFS Deprecation](../nfs.md#gitaly-and-nfs-deprecation) documentation.
diff --git a/doc/administration/gitaly/praefect.md b/doc/administration/gitaly/praefect.md
index eb666f1caf4..ce5fb1aaf88 100644
--- a/doc/administration/gitaly/praefect.md
+++ b/doc/administration/gitaly/praefect.md
@@ -265,8 +265,8 @@ praefect['database_direct_dbname'] = 'praefect_production'
#praefect['database_direct_sslrootcert'] = '...'
```
-We recommend using PgBouncer with `session` pool mode instead. You can use the [bundled
-PgBouncer](../postgresql/pgbouncer.md) or use an external PgBouncer and [configure it
+We recommend using PgBouncer with `session` pool mode instead. You can use the
+[bundled PgBouncer](../postgresql/pgbouncer.md) or use an external PgBouncer and [configure it
manually](https://www.pgbouncer.org/config.html).
The following example uses the bundled PgBouncer and sets up two separate connection pools,
@@ -429,7 +429,7 @@ On the **Praefect** node:
WARNING:
If you have data on an already existing storage called
`default`, you should configure the virtual storage with another name and
- [migrate the data to the Gitaly Cluster storage](index.md#migrate-to-gitaly-cluster)
+ [migrate the data to the Gitaly Cluster storage](index.md#migrating-to-gitaly-cluster)
afterwards.
Replace `PRAEFECT_INTERNAL_TOKEN` with a strong secret, which is used by
@@ -475,8 +475,8 @@ On the **Praefect** node:
1. [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/2013) in GitLab 13.1 and later, enable [distribution of reads](index.md#distributed-reads).
-1. Save the changes to `/etc/gitlab/gitlab.rb` and [reconfigure
- Praefect](../restart_gitlab.md#omnibus-gitlab-reconfigure):
+1. Save the changes to `/etc/gitlab/gitlab.rb` and
+ [reconfigure Praefect](../restart_gitlab.md#omnibus-gitlab-reconfigure):
```shell
gitlab-ctl reconfigure
@@ -499,16 +499,16 @@ On the **Praefect** node:
running reconfigure automatically when running commands such as `apt-get update`. This way any
additional configuration changes can be done and then reconfigure can be run manually.
-1. Save the changes to `/etc/gitlab/gitlab.rb` and [reconfigure
- Praefect](../restart_gitlab.md#omnibus-gitlab-reconfigure):
+1. Save the changes to `/etc/gitlab/gitlab.rb` and
+ [reconfigure Praefect](../restart_gitlab.md#omnibus-gitlab-reconfigure):
```shell
gitlab-ctl reconfigure
```
1. To ensure that Praefect [has updated its Prometheus listen
- address](https://gitlab.com/gitlab-org/gitaly/-/issues/2734), [restart
- Praefect](../restart_gitlab.md#omnibus-gitlab-restart):
+ address](https://gitlab.com/gitlab-org/gitaly/-/issues/2734),
+ [restart Praefect](../restart_gitlab.md#omnibus-gitlab-restart):
```shell
gitlab-ctl restart praefect
@@ -695,8 +695,8 @@ Particular attention should be shown to:
was set in the [previous section](#praefect). This document uses `gitaly-1`,
`gitaly-2`, and `gitaly-3` as Gitaly storage names.
-For more information on Gitaly server configuration, see our [Gitaly
-documentation](configure_gitaly.md#configure-gitaly-servers).
+For more information on Gitaly server configuration, see our
+[Gitaly documentation](configure_gitaly.md#configure-gitaly-servers).
1. SSH into the **Gitaly** node and login as root:
@@ -803,16 +803,16 @@ documentation](configure_gitaly.md#configure-gitaly-servers).
})
```
-1. Save the changes to `/etc/gitlab/gitlab.rb` and [reconfigure
- Gitaly](../restart_gitlab.md#omnibus-gitlab-reconfigure):
+1. Save the changes to `/etc/gitlab/gitlab.rb` and
+ [reconfigure Gitaly](../restart_gitlab.md#omnibus-gitlab-reconfigure):
```shell
gitlab-ctl reconfigure
```
1. To ensure that Gitaly [has updated its Prometheus listen
- address](https://gitlab.com/gitlab-org/gitaly/-/issues/2734), [restart
- Gitaly](../restart_gitlab.md#omnibus-gitlab-restart):
+ address](https://gitlab.com/gitlab-org/gitaly/-/issues/2734),
+ [restart Gitaly](../restart_gitlab.md#omnibus-gitlab-restart):
```shell
gitlab-ctl restart gitaly
@@ -893,7 +893,7 @@ Particular attention should be shown to:
WARNING:
If you have existing data stored on the default Gitaly storage,
- you should [migrate the data your Gitaly Cluster storage](index.md#migrate-to-gitaly-cluster)
+ you should [migrate the data your Gitaly Cluster storage](index.md#migrating-to-gitaly-cluster)
first.
```ruby
@@ -1044,8 +1044,8 @@ To get started quickly:
grafana['disable_login_form'] = false
```
-1. Save the changes to `/etc/gitlab/gitlab.rb` and [reconfigure
- GitLab](../restart_gitlab.md#omnibus-gitlab-reconfigure):
+1. Save the changes to `/etc/gitlab/gitlab.rb` and
+ [reconfigure GitLab](../restart_gitlab.md#omnibus-gitlab-reconfigure):
```shell
gitlab-ctl reconfigure
@@ -1309,12 +1309,7 @@ To minimize data loss in GitLab 13.0 to 14.0, Gitaly Cluster:
new primary. If the failed primary contained unreplicated writes, [data loss can occur](#check-for-data-loss).
> - Removed in GitLab 14.1. Instead, repositories [become unavailable](#unavailable-repositories).
-In GitLab 13.0 to 14.0, when Gitaly Cluster switches to a new primary, repositories enter
-read-only mode if they are out of date. This can happen after failing over to an outdated
-secondary. Read-only mode eases data recovery efforts by preventing writes that may conflict
-with the unreplicated writes on other nodes.
-
-When Gitaly Cluster switches to a new primary In GitLab 13.0 to 14.0, repositories enter
+When Gitaly Cluster switches to a new primary in GitLab 13.0 to 14.0, repositories enter
read-only mode if they are out of date. This can happen after failing over to an outdated
secondary. Read-only mode eases data recovery efforts by preventing writes that may conflict
with the unreplicated writes on other nodes.
@@ -1596,3 +1591,26 @@ because of:
- An in-flight RPC call targeting the repository.
If this occurs, run `remove-repository` again.
+
+### Manually list untracked repositories
+
+> [Introduced](https://gitlab.com/gitlab-org/gitaly/-/merge_requests/3926) in GitLab 14.4.
+
+The `list-untracked-repositories` Praefect sub-command lists repositories of the Gitaly Cluster that both:
+
+- Exist for at least one Gitaly storage.
+- Aren't tracked in the Praefect database.
+
+The command outputs:
+
+- Result to `STDOUT` and the command's logs.
+- Errors to `STDERR`.
+
+Each entry is a complete JSON string with a newline at the end (configurable using the
+`-delimiter` flag). For example:
+
+```shell
+sudo /opt/gitlab/embedded/bin/praefect -config /var/opt/gitlab/praefect/config.toml list-untracked-repositories
+{"virtual_storage":"default","storage":"gitaly-1","relative_path":"@hashed/ab/cd/abcd123456789012345678901234567890123456789012345678901234567890.git"}
+{"virtual_storage":"default","storage":"gitaly-1","relative_path":"@hashed/ab/cd/abcd123456789012345678901234567890123456789012345678901234567891.git"}
+```
diff --git a/doc/administration/gitaly/troubleshooting.md b/doc/administration/gitaly/troubleshooting.md
index 1b53a0994f5..1f90ebb7565 100644
--- a/doc/administration/gitaly/troubleshooting.md
+++ b/doc/administration/gitaly/troubleshooting.md
@@ -243,7 +243,7 @@ To mirror-push branches and tags only, and avoid attempting to mirror-push prote
git push origin +refs/heads/*:refs/heads/* +refs/tags/*:refs/tags/*
```
-Any other namespaces that the admin wants to push can be included there as well via additional patterns.
+Any other namespaces that the administrator wants to push can be included there as well via additional patterns.
### Command line tools cannot connect to Gitaly
@@ -365,6 +365,15 @@ To determine the current primary Gitaly node for a specific Praefect node:
curl localhost:9652/metrics | grep gitaly_praefect_primaries`
```
+### Check that repositories are in sync
+
+Is [some cases](index.md#known-issues) the Praefect database can get out of sync with the underlying Gitaly nodes. To check that
+a given repository is fully synced on all nodes, run the [`gitlab:praefect:replicas` Rake task](../raketasks/praefect.md#replica-checksums)
+that checksums the repository on all Gitaly nodes.
+
+The [Praefect dataloss](praefect.md#check-for-data-loss) command only checks the state of the repo in the Praefect database, and cannot
+be relied to detect sync problems in this scenario.
+
### Relation does not exist errors
By default Praefect database tables are created automatically by `gitlab-ctl reconfigure` task.
@@ -393,7 +402,7 @@ $ sudo /opt/gitlab/embedded/bin/praefect -config /var/opt/gitlab/praefect/config
praefect sql-migrate: OK (applied 21 migrations)
```
-### Requests fail with 'repo scoped: invalid Repository' errors
+### Requests fail with 'repository scoped: invalid Repository' errors
This indicates that the virtual storage name used in the
[Praefect configuration](praefect.md#praefect) does not match the storage name used in
diff --git a/doc/administration/index.md b/doc/administration/index.md
index 9412994edb7..ee17edc35fc 100644
--- a/doc/administration/index.md
+++ b/doc/administration/index.md
@@ -41,7 +41,7 @@ Learn how to install, configure, update, and maintain your GitLab instance.
### Configuring GitLab
-- [Adjust your instance's timezone](timezone.md): Customize the default time zone of GitLab.
+- [Adjust your instance's time zone](timezone.md): Customize the default time zone of GitLab.
- [System hooks](../system_hooks/system_hooks.md): Notifications when users, projects and keys are changed.
- [Security](../security/index.md): Learn what you can do to further secure your GitLab instance.
- [Usage statistics, version check, and Service Ping](../user/admin_area/settings/usage_statistics.md): Enable or disable information about your instance to be sent to GitLab, Inc.
diff --git a/doc/administration/instance_limits.md b/doc/administration/instance_limits.md
index 24ffee088f3..a2729e60545 100644
--- a/doc/administration/instance_limits.md
+++ b/doc/administration/instance_limits.md
@@ -88,6 +88,29 @@ requests per user. For more information, read
- **Default rate limit**: Disabled by default.
+### Files API
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/68561) in GitLab 14.3.
+
+FLAG:
+On self-managed GitLab, by default this feature is not available. To make it available,
+ask an administrator to [enable the `files_api_throttling` flag](../administration/feature_flags.md). On GitLab.com, this feature is available but can be configured by GitLab.com administrators only.
+The feature is not ready for production use.
+
+This setting limits the request rate on the Packages API per user or IP address. For more information, read
+[Files API rate limits](../user/admin_area/settings/files_api_rate_limits.md).
+
+- **Default rate limit**: Disabled by default.
+
+### Deprecated API endpoints
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/68645) in GitLab 14.4.
+
+This setting limits the request rate on deprecated API endpoints per user or IP address. For more information, read
+[Deprecated API rate limits](../user/admin_area/settings/deprecated_api_rate_limits.md).
+
+- **Default rate limit**: Disabled by default.
+
### Import/Export
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/35728) in GitLab 13.2.
@@ -212,7 +235,7 @@ Activity history for projects and individuals' profiles was limited to one year
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/14939) in GitLab 12.7.
-There is a limit when embedding metrics in GFM for performance reasons.
+There is a limit when embedding metrics in GitLab Flavored Markdown (GFM) for performance reasons.
- **Max limit**: 100 embeds.
@@ -240,10 +263,10 @@ Set the limit to `0` to disable it.
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/237891) in GitLab 13.7.
-The [minimum wait time between pull refreshes](../user/project/repository/repository_mirroring.md)
+The [minimum wait time between pull refreshes](../user/project/repository/mirror/index.md)
defaults to 300 seconds (5 minutes). For example, by default a pull refresh will only run once in a given 300 second period regardless of how many times you try to trigger it.
-This setting applies in the context of pull refreshes invoked via the [projects API](../api/projects.md#start-the-pull-mirroring-process-for-a-project), or when forcing an update by selecting the **Update now** (**{retry}**) button within **Settings > Repository > Mirroring repositories**. This setting has no effect on the automatic 30 minute interval schedule used by Sidekiq for [pull mirroring](../user/project/repository/repository_mirroring.md#how-it-works).
+This setting applies in the context of pull refreshes invoked via the [projects API](../api/projects.md#start-the-pull-mirroring-process-for-a-project), or when forcing an update by selecting the **Update now** (**{retry}**) button within **Settings > Repository > Mirroring repositories**. This setting has no effect on the automatic 30 minute interval schedule used by Sidekiq for [pull mirroring](../user/project/repository/mirror/pull.md).
To change this limit for a self-managed installation, run the following in the
[GitLab Rails console](operations/rails_console.md#starting-a-rails-console-session):
@@ -511,7 +534,11 @@ Plan.default.actual_limits.update!(pages_file_entries: 100)
### Number of registered runners per scope
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/321368) in GitLab 13.12.
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/321368) in GitLab 13.12. Disabled by default.
+> - Enabled on GitLab.com in GitLab 14.3.
+> - Enabled on self-managed in GitLab 14.4.
+> - Feature flag `ci_runner_limits` removed in GitLab 14.4. You can still use `ci_runner_limits_override`
+ to remove limits for a given scope.
The total number of registered runners is limited at the group and project levels. Each time a new runner is registered,
GitLab checks these limits against runners that have been active in the last 3 months.
@@ -749,7 +776,7 @@ than the specified limit, hooks won't be executed.
More information can be found in these docs:
-- [Webhooks push events](../user/project/integrations/webhooks.md#push-events)
+- [Webhooks push events](../user/project/integrations/webhook_events.md#push-events)
- [Project services push hooks limit](../user/project/integrations/overview.md#push-hooks-limit)
### Activities
diff --git a/doc/administration/instance_review.md b/doc/administration/instance_review.md
index b166bb32aa1..62897651166 100644
--- a/doc/administration/instance_review.md
+++ b/doc/administration/instance_review.md
@@ -12,7 +12,7 @@ If you run a medium-sized self-managed instance (50+ users) of a free version of
[either Community Edition or unlicensed Enterprise Edition](https://about.gitlab.com/install/ce-or-ee/),
you qualify for a free Instance Review.
-1. Sign in as a user with administrator [permissions](../user/permissions.md).
+1. Sign in as a user with Administrator [role](../user/permissions.md).
1. In the top menu, click your user icon, and select
**Get a free instance review**:
diff --git a/doc/administration/integration/terminal.md b/doc/administration/integration/terminal.md
index 882580b35b6..45b94781adc 100644
--- a/doc/administration/integration/terminal.md
+++ b/doc/administration/integration/terminal.md
@@ -6,7 +6,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# Web terminals **(FREE)**
-With the introduction of the [Kubernetes integration](../../user/project/clusters/index.md),
+With the introduction of the [Kubernetes integration](../../user/infrastructure/clusters/index.md),
GitLab can store and use credentials for a Kubernetes cluster.
GitLab uses these credentials to provide access to
[web terminals](../../ci/environments/index.md#web-terminals) for environments.
@@ -50,8 +50,8 @@ detail below.
## Enabling and disabling terminal support
NOTE:
-AWS Elastic Load Balancers (ELBs) do not support web sockets.
-If you want web terminals to work, use AWS Application Load Balancers (ALBs).
+AWS Classic Load Balancers (CLBs) do not support web sockets.
+If you want web terminals to work, use AWS Network Load Balancers (NLBs).
Read [AWS Elastic Load Balancing Product Comparison](https://aws.amazon.com/elasticloadbalancing/features/#compare)
for more information.
diff --git a/doc/administration/invalidate_markdown_cache.md b/doc/administration/invalidate_markdown_cache.md
index 7a880c81843..855910fec6a 100644
--- a/doc/administration/invalidate_markdown_cache.md
+++ b/doc/administration/invalidate_markdown_cache.md
@@ -15,8 +15,8 @@ in the cached text would still refer to the old URL.
To avoid this problem, the administrator can invalidate the existing cache by
increasing the `local_markdown_version` setting in application settings. This can
-be done by [changing the application settings through
-the API](../api/settings.md#change-application-settings):
+be done by changing the application settings
+[through the API](../api/settings.md#change-application-settings):
```shell
curl --request PUT --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/application/settings?local_markdown_version=<increased_number>"
diff --git a/doc/administration/job_artifacts.md b/doc/administration/job_artifacts.md
index b4c16e007cc..46a9ee11679 100644
--- a/doc/administration/job_artifacts.md
+++ b/doc/administration/job_artifacts.md
@@ -446,10 +446,10 @@ List the artifacts for a single project, sorted by artifact size. The output inc
- on-disk location of the artifact
```ruby
-p = Project.find_by_id(:project ID)
+p = Project.find_by_id(<project_id>)
arts = Ci::JobArtifact.where(project: p)
-list = arts.order('sort DESC').limit(50).each do |art|
+list = arts.order(size: :desc).limit(50).each do |art|
puts "Job ID: #{art.job_id} - Size: #{art.size}b - Type: #{art.file_type} - Created: #{art.created_at} - File loc: #{art.file}"
end
```
diff --git a/doc/administration/job_logs.md b/doc/administration/job_logs.md
index 64d9248cb16..f2748305c24 100644
--- a/doc/administration/job_logs.md
+++ b/doc/administration/job_logs.md
@@ -146,9 +146,9 @@ a background job archives the job log. The log is moved to `/var/opt/gitlab/gitl
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 filesystem have to be shared using NFS.
+server, these two locations on the file system have to be shared using NFS.
-To eliminate both filesystem requirements:
+To eliminate both file system requirements:
- [Enable the incremental logging feature](#enable-or-disable-incremental-logging), which uses Redis instead of disk space for temporary caching of job logs.
- Configure [object storage](job_artifacts.md#object-storage-settings) for storing archived job logs.
diff --git a/doc/administration/lfs/index.md b/doc/administration/lfs/index.md
index 682352d8f59..d2f220e3795 100644
--- a/doc/administration/lfs/index.md
+++ b/doc/administration/lfs/index.md
@@ -2,18 +2,15 @@
stage: Create
group: Source Code
info: "To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments"
-type: reference, howto
disqus_identifier: 'https://docs.gitlab.com/ee/workflow/lfs/lfs_administration.html'
---
# GitLab Git Large File Storage (LFS) Administration **(FREE SELF)**
-> - Git LFS is supported in GitLab starting with version 8.2.
-> - Support for object storage, such as AWS S3, was introduced in 10.0.
-> - LFS is enabled in GitLab self-managed instances by default.
-
Documentation about how to use Git LFS are under [Managing large binary files with Git LFS doc](../../topics/git/lfs/index.md).
+LFS is enabled in GitLab self-managed instances by default.
+
## Requirements
- Users need to install [Git LFS client](https://git-lfs.github.com) version 1.0.1 or later.
@@ -346,8 +343,6 @@ git lfs version
## Known limitations
-- Support for removing unreferenced LFS objects was added in 8.14 onward.
-- LFS authentications via SSH was added with GitLab 8.12.
- Only compatible with the Git LFS client versions 1.1.0 and later, or 1.0.2.
- The storage statistics count each LFS object for
every project linking to it.
diff --git a/doc/administration/logs.md b/doc/administration/logs.md
index 990287e3907..a9fd698a525 100644
--- a/doc/administration/logs.md
+++ b/doc/administration/logs.md
@@ -1069,6 +1069,14 @@ For Omnibus GitLab installations, Praefect logs are in `/var/log/gitlab/praefect
GitLab also tracks [Prometheus metrics for Praefect](gitaly/#monitor-gitaly-cluster).
+## Backup log
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/63832) in GitLab 14.1.
+
+For Omnibus installations, the backup log is located at `/var/log/gitlab/gitlab-rails/backup_json.log`.
+
+This log is populated when a [GitLab backup is created](../raketasks/backup_restore.md). You can use this log to understand how the backup process performed.
+
## Performance bar stats
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/48149) in GitLab 13.7.
@@ -1082,7 +1090,7 @@ Performance bar statistics (currently only duration of SQL queries) are recorded
in that file. For example:
```json
-{"severity":"INFO","time":"2020-12-04T09:29:44.592Z","correlation_id":"33680b1490ccd35981b03639c406a697","filename":"app/models/ci/pipeline.rb","method_path":"app/models/ci/pipeline.rb:each_with_object","request_id":"rYHomD0VJS4","duration_ms":26.889,"count":2,"type": "sql"}
+{"severity":"INFO","time":"2020-12-04T09:29:44.592Z","correlation_id":"33680b1490ccd35981b03639c406a697","filename":"app/models/ci/pipeline.rb","method_path":"app/models/ci/pipeline.rb:each_with_object","request_id":"rYHomD0VJS4","duration_ms":26.889,"count":2,"query_type": "active-record"}
```
These statistics are logged on .com only, disabled on self-deployments.
diff --git a/doc/administration/maintenance_mode/index.md b/doc/administration/maintenance_mode/index.md
index 39ee357cc2f..d5bcd132665 100644
--- a/doc/administration/maintenance_mode/index.md
+++ b/doc/administration/maintenance_mode/index.md
@@ -75,7 +75,7 @@ An error is displayed when a user tries to perform a write operation that isn't
NOTE:
In some cases, the visual feedback from an action could be misleading, for example when starring a project, the **Star** button changes to show the **Unstar** action, however, this is only the frontend update, and it doesn't take into account the failed status of the POST request. These visual bugs are to be fixed [in follow-up iterations](https://gitlab.com/gitlab-org/gitlab/-/issues/295197).
-### Admin functions
+### Administrator functions
Systems administrators can edit the application settings. This allows
them to disable Maintenance Mode after it's been enabled.
@@ -111,18 +111,18 @@ For most JSON requests, POST, PUT, PATCH, and DELETE are blocked, and the API re
|HTTP request | Allowed routes | Notes |
|:----:|:--------------------------------------:|:----:|
-| POST | `/admin/application_settings/general` | To allow updating application settings in the admin UI |
+| POST | `/admin/application_settings/general` | To allow updating application settings in the administrator UI |
| PUT | `/api/v4/application/settings` | To allow updating application settings with the API |
| POST | `/users/sign_in` | To allow users to log in. |
| POST | `/users/sign_out`| To allow users to log out. |
| POST | `/oauth/token` | To allow users to log in to a Geo secondary for the first time. |
-| POST | `/admin/session`, `/admin/session/destroy` | To allow [Admin mode for GitLab administrators](https://gitlab.com/groups/gitlab-org/-/epics/2158) |
+| POST | `/admin/session`, `/admin/session/destroy` | To allow [Administrator mode for GitLab administrators](https://gitlab.com/groups/gitlab-org/-/epics/2158) |
| POST | Paths ending with `/compare`| Git revision routes. |
| POST | `.git/git-upload-pack` | To allow Git pull/clone. |
| POST | `/api/v4/internal` | [internal API routes](../../development/internal_api.md) |
-| POST | `/admin/sidekiq` | To allow management of background jobs in the admin UI |
-| POST | `/admin/geo` | To allow updating Geo Nodes in the admin UI |
-| POST | `/api/v4/geo_replication`| To allow certain Geo-specific admin UI actions on secondary sites |
+| POST | `/admin/sidekiq` | To allow management of background jobs in the Admin UI |
+| POST | `/admin/geo` | To allow updating Geo Nodes in the administrator UI |
+| POST | `/api/v4/geo_replication`| To allow certain Geo-specific administrator UI actions on secondary sites |
### GraphQL API
diff --git a/doc/administration/monitoring/performance/img/performance_bar_v14_0.png b/doc/administration/monitoring/performance/img/performance_bar_v14_0.png
deleted file mode 100644
index 42261ddd720..00000000000
--- a/doc/administration/monitoring/performance/img/performance_bar_v14_0.png
+++ /dev/null
Binary files differ
diff --git a/doc/administration/monitoring/performance/img/performance_bar_v14_4.png b/doc/administration/monitoring/performance/img/performance_bar_v14_4.png
new file mode 100644
index 00000000000..388d628c7c4
--- /dev/null
+++ b/doc/administration/monitoring/performance/img/performance_bar_v14_4.png
Binary files differ
diff --git a/doc/administration/monitoring/performance/performance_bar.md b/doc/administration/monitoring/performance/performance_bar.md
index ef4db93d5fc..0befd9eac5b 100644
--- a/doc/administration/monitoring/performance/performance_bar.md
+++ b/doc/administration/monitoring/performance/performance_bar.md
@@ -8,11 +8,12 @@ info: To determine the technical writer assigned to the Stage/Group associated w
> - The **Stats** field [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/271551) in GitLab 13.9.
> - The **Memory** field [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/330736) in GitLab 14.0.
+> - The **Flamegraph** field [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/30275) in GitLab 14.4.
You can display the performance bar to see statistics for the performance of a GitLab UI page.
For example:
-![Performance bar](img/performance_bar_v14_0.png)
+![Performance bar](img/performance_bar_v14_4.png)
## Available information
@@ -64,6 +65,11 @@ From left to right, the performance bar displays:
can be added by its full URL (authenticated as the current user), or by the value of
its `X-Request-Id` header.
- **Download**: a link to download the raw JSON used to generate the Performance Bar reports.
+- **Flamegraph** with mode: a link to generate a [flamegraph](../../../development/profiling.md#speedscope-flamegraphs)
+ of the current URL with the selected [Stackprof mode](https://github.com/tmm1/stackprof#sampling):
+ - The **Wall** mode samples every *interval* of the time on a clock on a wall. The interval is set to `10100` microseconds.
+ - The **CPU** mode samples every *interval* of CPU activity. The interval is set to `10100` microseconds.
+ - The **Object** mode samples every *interval*. The interval is set to `100` allocations.
- **Request Selector**: a select box displayed on the right-hand side of the
Performance Bar which enables you to view these metrics for any requests made while
the current page was open. Only the first two requests per unique URL are captured.
diff --git a/doc/administration/monitoring/prometheus/gitlab_metrics.md b/doc/administration/monitoring/prometheus/gitlab_metrics.md
index c36d2b0f7a4..1d275010556 100644
--- a/doc/administration/monitoring/prometheus/gitlab_metrics.md
+++ b/doc/administration/monitoring/prometheus/gitlab_metrics.md
@@ -119,12 +119,15 @@ The following metrics are available:
| `action_cable_pool_largest_size` | Gauge | 13.4 | Largest number of worker threads observed so far in ActionCable thread pool | `server_mode` |
| `action_cable_pool_pending_tasks` | Gauge | 13.4 | Number of tasks waiting to be executed in ActionCable thread pool | `server_mode` |
| `action_cable_pool_tasks_total` | Gauge | 13.4 | Total number of tasks executed in ActionCable thread pool | `server_mode` |
+| `gitlab_ci_trace_operations_total` | Counter | 13.4 | Total amount of different operations on a build trace | `operation` |
+| `gitlab_ci_trace_bytes_total` | Counter | 13.4 | Total amount of build trace bytes transferred | |
| `action_cable_single_client_transmissions_total` | Counter | 13.10 | The number of ActionCable messages transmitted to any client in any channel | `server_mode` |
| `action_cable_subscription_confirmations_total` | Counter | 13.10 | The number of ActionCable subscriptions from clients confirmed | `server_mode` |
| `action_cable_subscription_rejections_total` | Counter | 13.10 | The number of ActionCable subscriptions from clients rejected | `server_mode` |
-| `action_cable_transmitted_bytes` | Histogram | 14.1 | Message size, in bytes, transmitted over action cable | `operation`, `channel` |
+| `action_cable_transmitted_bytes` | Histogram | 14.1 | Message size, in bytes, transmitted over action cable | `operation`, `channel` |
| `gitlab_issuable_fast_count_by_state_total` | Counter | 13.5 | Total number of row count operations on issue/merge request list pages | |
| `gitlab_issuable_fast_count_by_state_failures_total` | Counter | 13.5 | Number of soft-failed row count operations on issue/merge request list pages | |
+| `gitlab_ci_trace_finalize_duration_seconds` | Histogram | 13.6 | Duration of build trace chunks migration to object storage | |
| `gitlab_external_http_total` | Counter | 13.8 | Total number of HTTP calls to external systems | `controller`, `action` |
| `gitlab_external_http_duration_seconds` | Counter | 13.8 | Duration in seconds spent on each HTTP call to external systems | |
| `gitlab_external_http_exception_total` | Counter | 13.8 | Total number of exceptions raised when making external HTTP calls | |
@@ -132,15 +135,15 @@ The following metrics are available:
| `pipeline_graph_link_calculation_duration_seconds` | Histogram | 13.9 | Total time spent calculating links, in seconds | |
| `pipeline_graph_links_total` | Histogram | 13.9 | Number of links per graph | |
| `pipeline_graph_links_per_job_ratio` | Histogram | 13.9 | Ratio of links to job per graph | |
-| `gitlab_ci_pipeline_security_orchestration_policy_processing_duration_seconds` | Histogram | 13.12 | Time in seconds it takes to process Security Policies in CI/CD pipeline | |
-| `gitlab_ci_difference_live_vs_actual_minutes` | Histogram | 13.12 | Difference between CI minute consumption counted while jobs were running (live) vs when jobs are complete (actual). Used to enforce CI minute consumption limits on long running jobs. | `plan` |
-| `gitlab_spamcheck_request_duration_seconds` | Histogram | 13.12 | The duration for requests between Rails and the anti-spam engine | |
+| `gitlab_ci_pipeline_security_orchestration_policy_processing_duration_seconds` | Histogram | 13.12 | Time in seconds it takes to process Security Policies in CI/CD pipeline | |
+| `gitlab_spamcheck_request_duration_seconds` | Histogram | 13.12 | The duration for requests between Rails and the anti-spam engine | |
| `service_desk_thank_you_email` | Counter | 14.0 | Total number of email responses to new service desk emails | |
| `service_desk_new_note_email` | Counter | 14.0 | Total number of email notifications on new service desk comment | |
| `email_receiver_error` | Counter | 14.1 | Total number of errors when processing incoming emails | |
| `gitlab_snowplow_events_total` | Counter | 14.1 | Total number of GitLab Snowplow product intelligence events emitted | |
| `gitlab_snowplow_failed_events_total` | Counter | 14.1 | Total number of GitLab Snowplow product intelligence events emission failures | |
| `gitlab_snowplow_successful_events_total` | Counter | 14.1 | Total number of GitLab Snowplow product intelligence events emission successes | |
+| `gitlab_ci_build_trace_errors_total` | Counter | 14.4 | Total amount of different error types on a build trace | `type` |
## Metrics controlled by a feature flag
diff --git a/doc/administration/monitoring/prometheus/puma_exporter.md b/doc/administration/monitoring/prometheus/puma_exporter.md
new file mode 100644
index 00000000000..c348e74afaf
--- /dev/null
+++ b/doc/administration/monitoring/prometheus/puma_exporter.md
@@ -0,0 +1,27 @@
+---
+stage: Monitor
+group: Monitor
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
+---
+
+# Puma exporter **(FREE SELF)**
+
+You can use the [Puma exporter](https://github.com/sapcc/puma-exporter)
+to measure various Puma metrics.
+
+To enable the Puma exporter:
+
+1. [Enable Prometheus](index.md#configuring-prometheus).
+1. Edit `/etc/gitlab/gitlab.rb` to add (or find and uncomment) the following lines. Make sure
+ `puma['exporter_enabled']` is set to `true`:
+
+ ```ruby
+ puma['exporter_enabled'] = true
+ puma['exporter_address'] = "127.0.0.1"
+ puma['exporter_port'] = 8083
+ ```
+
+1. Save the file and [reconfigure GitLab](../../restart_gitlab.md#omnibus-gitlab-reconfigure)
+ for the changes to take effect.
+
+Prometheus begins collecting performance data from the Puma exporter exposed at `localhost:8083`.
diff --git a/doc/administration/nfs.md b/doc/administration/nfs.md
index 0cab46a95c9..f18c39af24a 100644
--- a/doc/administration/nfs.md
+++ b/doc/administration/nfs.md
@@ -20,12 +20,46 @@ file system performance, see
## Gitaly and NFS deprecation
+Starting with GitLab version 14.0, support for NFS to store Git repository data will be deprecated. Technical customer support and engineering support will be available for the 14.x releases. Engineering will fix bugs and security vulnerabilities consistent with our [release and maintenance policy](../policy/maintenance.md#security-releases).
+
+At the end of the 14.12 milestone (tenatively June 22nd, 2022) technical and engineering support for using NFS to store Git repository data will be officially at end-of-life. There will be no product changes or troubleshooting provided via Engineering, Security or Paid Support channels.
+
+For those customers still running earlier versions of GitLab, [our support eligibility and maintenance policy applies](https://about.gitlab.com/support/statement-of-support.html#version-support).
+
+For the 14.x releases, we will continue to help with Git related tickets from customers running one or more Gitaly servers with its data stored on NFS. Examples may include:
+
+- Performance issues or timeouts accessing Git data
+- Commits or branches vanish
+- GitLab intermittently returns the wrong Git data (such as reporting that a repository has no branches)
+
+Assistance will be limited to activities like:
+
+- Verifying developers' workflow uses features like protected branches
+- Reviewing GitLab event data from the database to advise if it looks like a force push over-wrote branches
+- Verifying that NFS client mount options match our [documented recommendations](#mount-options)
+- Analyzing the GitLab Workhorse and Rails logs, and determining that `500` errors being seen in the environment are caused by slow responses from Gitaly
+
+GitLab support will be unable to continue with the investigation if:
+
+- The date of the request is on or after the release of GitLab version 15.0, and
+- Support Engineers and Management determine that all reasonable non-NFS root causes have been exhausted
+
+If the issue is reproducible, or if it happens intermittently but regularly, GitLab Support will investigate providing the issue reproduces without the use of NFS. In order to reproduce without NFS, the affected repositories should be migrated to a different Gitaly shard, such as Gitaly cluster or a standalone Gitaly VM, backed with block storage.
+
+### Why remove NFS for Git repository data
+
+{:.no-toc}
+
+NFS is not well-suited to a workload consisting of many small files, like Git repositories. NFS does provide a number of configuration options designed to improve performance. However, over time, a number of these mount options have proven to result in inconsistencies across multiple nodes mounting the NFS volume, up to and including data loss. Addressing these inconsistencies consume extraordinary development and support engineer time that hamper our ability to develop [Gitaly Cluster](gitaly/praefect.md), our purpose-built solution to addressing the deficiencies of NFS in this environment.
+
+Please note that Gitaly Cluster provides highly-available Git repository storage. If this is not a requirement, single-node Gitaly backed by block storage is a suitable substitute.
+
Engineering support for NFS for Git repositories is deprecated. Technical support is planned to be
unavailable from GitLab 15.0. No further enhancements are planned for this feature.
Read:
-- The [Gitaly and NFS deprecation notice](gitaly/index.md#nfs-deprecation-notice).
+- [Moving beyond NFS](gitaly/index.md#moving-beyond-nfs).
- About the [correct mount options to use](#upgrade-to-gitaly-cluster-or-disable-caching-if-experiencing-data-loss).
## Known kernel version incompatibilities
@@ -153,7 +187,7 @@ If the Rugged feature flag is explicitly set to either `true` or `false`, GitLab
NOTE:
From GitLab 12.7, Rugged is not automatically enabled if Puma thread count is greater than `1`.
-If you want to use Rugged with Puma, [set Puma thread count to `1`](https://docs.gitlab.com/omnibus/settings/puma.html#puma-settings).
+If you want to use Rugged with Puma, [set Puma thread count to `1`](../install/requirements.md#puma-settings).
If you want to use Rugged with Puma thread count more than `1`, Rugged can be enabled using the [feature flag](../development/gitaly.md#legacy-rugged-code).
@@ -217,7 +251,7 @@ use the `hard` option, because (from the man page):
> use the soft option only when client responsiveness is more important than data integrity
Other vendors make similar recommendations, including
-[SAP](http://wiki.scn.sap.com/wiki/x/PARnFQ) and NetApp's
+[System Applications and Products in Data Processing (SAP)](http://wiki.scn.sap.com/wiki/x/PARnFQ) and NetApp's
[knowledge base](https://kb.netapp.com/Advice_and_Troubleshooting/Data_Storage_Software/ONTAP_OS/What_are_the_differences_between_hard_mount_and_soft_mount),
they highlight that if the NFS client driver caches data, `soft` means there is no certainty if
writes by GitLab are actually on disk.
@@ -351,7 +385,7 @@ Any `Operation not permitted` errors means you should investigate your NFS serve
If the traffic between your NFS server and NFS client(s) is subject to port filtering
by a firewall, then you need to reconfigure that firewall to allow NFS communication.
-[This guide from TDLP](https://tldp.org/HOWTO/NFS-HOWTO/security.html#FIREWALLS)
+[This guide from The Linux Documentation Project (TDLP)](https://tldp.org/HOWTO/NFS-HOWTO/security.html#FIREWALLS)
covers the basics of using NFS in a firewalled environment. Additionally, we encourage you to
search for and review the specific documentation for your operating system or distribution and your firewall software.
@@ -370,8 +404,8 @@ sudo ufw allow from <client_ip_address> to any port nfs
### Upgrade to Gitaly Cluster or disable caching if experiencing data loss
WARNING:
-Engineering support for NFS for Git repositories is deprecated. Read the
-[Gitaly and NFS deprecation notice](gitaly/index.md#nfs-deprecation-notice).
+Engineering support for NFS for Git repositories is deprecated. Read about
+[moving beyond NFS](gitaly/index.md#moving-beyond-nfs).
Customers and users have reported data loss on high-traffic repositories when using NFS for Git repositories.
For example, we have seen:
diff --git a/doc/administration/operations/fast_ssh_key_lookup.md b/doc/administration/operations/fast_ssh_key_lookup.md
index e30ad4d8248..8aa5af4c2bf 100644
--- a/doc/administration/operations/fast_ssh_key_lookup.md
+++ b/doc/administration/operations/fast_ssh_key_lookup.md
@@ -104,12 +104,12 @@ In the case of lookup failures (which are common), the `authorized_keys`
file is still scanned. So Git SSH performance would still be slow for many
users as long as a large file exists.
-To disable any more writes to the `authorized_keys` file:
+To disable writes to the `authorized_keys` file:
1. On the top bar, select **Menu > Admin**.
1. On the left sidebar, select **Settings > Network**.
1. Expand **Performance optimization**.
-1. Clear the **Write to "authorized_keys" file** checkbox.
+1. Clear the **Use authorized_keys file to authenticate SSH keys** checkbox.
1. Select **Save changes**.
Again, confirm that SSH is working by removing your user's SSH key in the UI,
@@ -123,10 +123,14 @@ or for asking users to re-add their keys.
This is a brief overview. Please refer to the above instructions for more context.
-1. [Rebuild the `authorized_keys` file](../raketasks/maintenance.md#rebuild-authorized_keys-file)
-1. Enable writes to the `authorized_keys` file in Application Settings
+1. [Rebuild the `authorized_keys` file](../raketasks/maintenance.md#rebuild-authorized_keys-file).
+1. Enable writes to the `authorized_keys` file.
+ 1. On the top bar, select **Menu > Admin**.
+ 1. On the left sidebar, select **Settings > Network**.
+ 1. Expand **Performance optimization**.
+ 1. Select the **Use authorized_keys file to authenticate SSH keys** checkbox.
1. Remove the `AuthorizedKeysCommand` lines from `/etc/ssh/sshd_config` or from `/assets/sshd_config` if you are using Omnibus Docker.
-1. Reload `sshd`: `sudo service sshd reload`
+1. Reload `sshd`: `sudo service sshd reload`.
## Compiling a custom version of OpenSSH for CentOS 6
diff --git a/doc/administration/operations/moving_repositories.md b/doc/administration/operations/moving_repositories.md
index 61a9ec8e7d4..8aeaadc17e9 100644
--- a/doc/administration/operations/moving_repositories.md
+++ b/doc/administration/operations/moving_repositories.md
@@ -27,7 +27,7 @@ For more information, see:
querying and scheduling snippet repository moves.
- [The API documentation](../../api/group_repository_storage_moves.md) details the endpoints for
querying and scheduling group repository moves **(PREMIUM SELF)**.
-- [Migrate to Gitaly Cluster](../gitaly/index.md#migrate-to-gitaly-cluster).
+- [Migrating to Gitaly Cluster](../gitaly/index.md#migrating-to-gitaly-cluster).
### Move Repositories
diff --git a/doc/administration/operations/ssh_certificates.md b/doc/administration/operations/ssh_certificates.md
index 814e742b026..77dc4eb180b 100644
--- a/doc/administration/operations/ssh_certificates.md
+++ b/doc/administration/operations/ssh_certificates.md
@@ -21,8 +21,7 @@ upload the new keys to GitLab.
WARNING:
OpenSSH version 6.9+ is required because that version
introduced the `AuthorizedPrincipalsCommand` configuration option. If
-using CentOS 6, you can [follow these
-instructions](fast_ssh_key_lookup.html#compiling-a-custom-version-of-openssh-for-centos-6)
+using CentOS 6, you can [follow these instructions](fast_ssh_key_lookup.md#compiling-a-custom-version-of-openssh-for-centos-6)
to compile an up-to-date version.
## Why use OpenSSH certificates?
@@ -132,8 +131,8 @@ requirement for it, we effectively only care about the "key ID" being
correct. Once that's extracted GitLab enforces its own ACLs for
that user (for example, what projects the user can access).
-So it's OK to e.g. be overly generous in what you accept, since if the
-user e.g. has no access to GitLab at all it just errors out with a
+It's therefore fine to be overly generous in what you accept. For example, if the user has no access
+to GitLab, an error is produced with a message about an invalid user.
message about this being an invalid user.
## Interaction with the `authorized_keys` file
diff --git a/doc/administration/package_information/defaults.md b/doc/administration/package_information/defaults.md
index 45bea065995..95d6135c28c 100644
--- a/doc/administration/package_information/defaults.md
+++ b/doc/administration/package_information/defaults.md
@@ -4,7 +4,7 @@ group: Distribution
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#designated-technical-writers
---
-# Package defaults
+# Package defaults **(FREE SELF)**
Unless configuration is specified in the `/etc/gitlab/gitlab.rb` file,
the package will assume the defaults as noted below.
@@ -14,42 +14,42 @@ the package will assume the defaults as noted below.
See the table below for the list of ports that the Omnibus GitLab assigns
by default:
-| Component | On by default | Communicates via | Alternative | Connection port |
-| :----------------------------------------------------: | :------------: | :--------------: | :---------: | :------------------------------------: |
-| <a name="gitlab-rails"></a> GitLab Rails | Yes | Port | X | 80 or 443 |
-| <a name="gitlab-shell"></a> GitLab Shell | Yes | Port | X | 22 |
-| <a name="postgresql"></a> PostgreSQL | Yes | Socket | Port (5432) | X |
-| <a name="redis"></a> Redis | Yes | Socket | Port (6379) | X |
-| <a name="puma"></a> Puma | Yes | Socket | Port (8080) | X |
-| <a name="gitlab-workhorse"></a> GitLab Workhorse | Yes | Socket | Port (8181) | X |
-| <a name="nginx-status"></a> NGINX status | Yes | Port | X | 8060 |
-| <a name="prometheus"></a> Prometheus | Yes | Port | X | 9090 |
-| <a name="node-exporter"></a> Node exporter | Yes | Port | X | 9100 |
-| <a name="redis-exporter"></a> Redis exporter | Yes | Port | X | 9121 |
-| <a name="postgres-exporter"></a> PostgreSQL exporter | Yes | Port | X | 9187 |
-| <a name="pgbouncer-exporter"></a> PgBouncer exporter | No | Port | X | 9188 |
-| <a name="gitlab-exporter"></a> GitLab Exporter | Yes | Port | X | 9168 |
-| <a name="sidekiq-exporter"></a> Sidekiq exporter | Yes | Port | X | 8082 |
-| <a name="puma-exporter"></a> Puma exporter | No | Port | X | 8083 |
-| <a name="geo-postgresql"></a> Geo PostgreSQL | No | Socket | Port (5431) | X |
-| <a name="redis-sentinel"></a> Redis Sentinel | No | Port | X | 26379 |
-| <a name="incoming-email"></a> Incoming email | No | Port | X | 143 |
-| <a name="elasticsearch"></a> Elastic search | No | Port | X | 9200 |
-| <a name="gitlab-pages"></a> GitLab Pages | No | Port | X | 80 or 443 |
-| <a name="gitlab-registry-web"></a> GitLab Registry | No* | Port | X | 80, 443 or 5050 |
-| <a name="gitlab-registry"></a> GitLab Registry | No | Port | X | 5000 |
-| <a name="ldap"></a> LDAP | No | Port | X | Depends on the component configuration |
-| <a name="kerberos"></a> Kerberos | No | Port | X | 8443 or 8088 |
-| <a name="omniauth"></a> OmniAuth | Yes | Port | X | Depends on the component configuration |
-| <a name="smtp"></a> SMTP | No | Port | X | 465 |
-| <a name="remote-syslog"></a> Remote syslog | No | Port | X | 514 |
-| <a name="mattermost"></a> Mattermost | No | Port | X | 8065 |
-| <a name="mattermost-web"></a> Mattermost | No | Port | X | 80 or 443 |
-| <a name="pgbouncer"></a> PgBouncer | No | Port | X | 6432 |
-| <a name="consul"></a> Consul | No | Port | X | 8300, 8301(UDP), 8500, 8600[^Consul-notes] |
-| <a name="patroni"></a> Patroni | No | Port | X | 8008 |
-| <a name="gitlab-kas"></a> GitLab KAS | No | Port | X | 8150 |
-| <a name="gitaly"></a> Gitaly | No | Port | X | 8075 |
+| Component | On by default | Communicates via | Alternative | Connection port |
+|:-------------------:|:-------------:|:----------------:|:-----------:|:------------------------------------------:|
+| GitLab Rails | Yes | Port | X | 80 or 443 |
+| GitLab Shell | Yes | Port | X | 22 |
+| PostgreSQL | Yes | Socket | Port (5432) | X |
+| Redis | Yes | Socket | Port (6379) | X |
+| Puma | Yes | Socket | Port (8080) | X |
+| GitLab Workhorse | Yes | Socket | Port (8181) | X |
+| NGINX status | Yes | Port | X | 8060 |
+| Prometheus | Yes | Port | X | 9090 |
+| Node exporter | Yes | Port | X | 9100 |
+| Redis exporter | Yes | Port | X | 9121 |
+| PostgreSQL exporter | Yes | Port | X | 9187 |
+| PgBouncer exporter | No | Port | X | 9188 |
+| GitLab Exporter | Yes | Port | X | 9168 |
+| Sidekiq exporter | Yes | Port | X | 8082 |
+| Puma exporter | No | Port | X | 8083 |
+| Geo PostgreSQL | No | Socket | Port (5431) | X |
+| Redis Sentinel | No | Port | X | 26379 |
+| Incoming email | No | Port | X | 143 |
+| Elastic search | No | Port | X | 9200 |
+| GitLab Pages | No | Port | X | 80 or 443 |
+| GitLab Registry | No* | Port | X | 80, 443 or 5050 |
+| GitLab Registry | No | Port | X | 5000 |
+| LDAP | No | Port | X | Depends on the component configuration |
+| Kerberos | No | Port | X | 8443 or 8088 |
+| OmniAuth | Yes | Port | X | Depends on the component configuration |
+| SMTP | No | Port | X | 465 |
+| Remote syslog | No | Port | X | 514 |
+| Mattermost | No | Port | X | 8065 |
+| Mattermost | No | Port | X | 80 or 443 |
+| PgBouncer | No | Port | X | 6432 |
+| Consul | No | Port | X | 8300, 8301(UDP), 8500, 8600[^Consul-notes] |
+| Patroni | No | Port | X | 8008 |
+| GitLab KAS | No | Port | X | 8150 |
+| Gitaly | No | Port | X | 8075 |
Legend:
@@ -59,7 +59,7 @@ Legend:
- `Alternative` - If it is possible to configure the component to use different type of communication. The type is listed with default port used in that case.
- `Connection port` - Port on which the component communicates.
-GitLab also expects a filesystem to be ready for the storage of Git repositories
+GitLab also expects a file system to be ready for the storage of Git repositories
and various other files.
Note that if you are using NFS (Network File System), files will be carried
diff --git a/doc/administration/package_information/deprecated_os.md b/doc/administration/package_information/deprecated_os.md
index 251dbe1e20e..35b333241b2 100644
--- a/doc/administration/package_information/deprecated_os.md
+++ b/doc/administration/package_information/deprecated_os.md
@@ -4,7 +4,7 @@ group: Distribution
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#designated-technical-writers
---
-# OS Versions that are no longer supported
+# OS Versions that are no longer supported **(FREE SELF)**
GitLab provides omnibus packages for operating systems only until their
EOL (End-Of-Life). After the EOL date of the OS, GitLab will stop releasing
diff --git a/doc/administration/package_information/deprecation_policy.md b/doc/administration/package_information/deprecation_policy.md
index cc16661442a..80ce72d54f5 100644
--- a/doc/administration/package_information/deprecation_policy.md
+++ b/doc/administration/package_information/deprecation_policy.md
@@ -4,7 +4,7 @@ group: Distribution
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#designated-technical-writers
---
-# Deprecation policy
+# Deprecation policy **(FREE SELF)**
The Omnibus GitLab packages come with number of different libraries and services which offers users plethora of configuration options.
@@ -60,7 +60,7 @@ We should aim to not remove sensitive configuration in the *next major* release
See the table below for some examples:
-| Config. type | Deprecation announced | Final minor release | Remove |
+| Configuration type | Deprecation announced | Final minor release | Remove |
| -------- | -------- | -------- | -------- |
| Sensitive | 10.1.0 | 10.9.0 | 11.0.0 |
| Sensitive | 10.7.0 | 10.9.0 | 12.0.0 |
@@ -90,6 +90,6 @@ the feature will continue working the same way as if you had `gitlab_rails['bett
However, setting the old version of configuration will print out a deprecation
notice at the end of installation/upgrade/reconfigure run.
-With GitLab 11, `gitlab_rails['configuration'] = true` will no longer work and you will have to manually change the configuration in `/etc/gitlab/gitlab.rb` to the new valid config.
+With GitLab 11, `gitlab_rails['configuration'] = true` will no longer work and you will have to manually change the configuration in `/etc/gitlab/gitlab.rb` to the new valid configuration.
**Note** If this configuration option is sensitive and can put integrity of the installation or
data in danger, installation/upgrade will be aborted.
diff --git a/doc/administration/package_information/index.md b/doc/administration/package_information/index.md
index e18fb621b89..12f3274ecab 100644
--- a/doc/administration/package_information/index.md
+++ b/doc/administration/package_information/index.md
@@ -4,7 +4,7 @@ group: Distribution
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#designated-technical-writers
---
-# Package information
+# Package information **(FREE SELF)**
The Omnibus GitLab package is bundled with all dependencies required for GitLab
to function correctly. More details can be found
@@ -15,10 +15,10 @@ at [bundling dependencies document](omnibus_packages.md).
The released package versions are in the format `MAJOR.MINOR.PATCH-EDITION.OMNIBUS_RELEASE`
| Component | Meaning | Example |
-| --------- | ------- | ------- |
-| MAJOR.MINOR.PATCH | The GitLab version this corresponds to | 13.3.0 |
-| EDITION | The edition of GitLab this corresponds to | ee |
-| OMNIBUS_RELEASE | The omnibus release. Usually, this will be 0. This will be incremented if we need to build a new package without changing the GitLab version. | 0 |
+|-------------------|---------|---------|
+| MAJOR.MINOR.PATCH | The GitLab version this corresponds to. | 13.3.0 |
+| EDITION | The edition of GitLab this corresponds to. | ee |
+| OMNIBUS_RELEASE | The Omnibus GitLab release. Usually, this will be 0. This is incremented if we need to build a new package without changing the GitLab version. | 0 |
## Licenses
@@ -26,23 +26,22 @@ See [licensing](licensing.md)
## Defaults
-The Omnibus GitLab package requires various configuration to get the
-components in working order.
-If the configuration is not provided, the package will use the default
-values assumed in the package.
+The Omnibus GitLab package requires various configuration to get the components
+in working order. If the configuration is not provided, the package will use
+the default values assumed in the package.
These defaults are noted in the package [defaults document](defaults.md).
## Checking the versions of bundled software
-Once the Omnibus GitLab package is installed, all versions of the bundled
+After the Omnibus GitLab package is installed, all versions of the bundled
libraries are located in `/opt/gitlab/version-manifest.txt`.
If you don't have the package installed, you can always check the Omnibus GitLab
[source repository](https://gitlab.com/gitlab-org/omnibus-gitlab/tree/master), specifically the
-[config directory](https://gitlab.com/gitlab-org/omnibus-gitlab/tree/master/config).
+[configuration directory](https://gitlab.com/gitlab-org/omnibus-gitlab/tree/master/config).
-For example, if you take a look at the `8-6-stable` branch, you can conclude that
+For example, if you examine the `8-6-stable` branch, you can conclude that
8.6 packages were running [Ruby 2.1.8](https://gitlab.com/gitlab-org/omnibus-gitlab/blob/8-6-stable/config/projects/gitlab.rb#L48).
Or, that 8.5 packages were bundled with [NGINX 1.9.0](https://gitlab.com/gitlab-org/omnibus-gitlab/blob/8-5-stable/config/software/nginx.rb#L20).
@@ -70,11 +69,10 @@ To view a diff between your configuration file and the latest version, run:
sudo gitlab-ctl diff-config
```
-_**Note:** This command is available from GitLab 8.17_
-
-**Important:** If you are copy-pasting the output of this command into your
-`/etc/gitlab/gitlab.rb` configuration file, make sure to omit leading `+` and `-`
-on each line.
+WARNING:
+If you are pasting the output of this command into your
+`/etc/gitlab/gitlab.rb` configuration file, omit any leading `+` and `-`
+characters on each line.
## Init system detection
diff --git a/doc/administration/package_information/licensing.md b/doc/administration/package_information/licensing.md
index 8557a94bf93..02358c66993 100644
--- a/doc/administration/package_information/licensing.md
+++ b/doc/administration/package_information/licensing.md
@@ -4,7 +4,7 @@ group: Distribution
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#designated-technical-writers
---
-# Package Licensing
+# Package Licensing **(FREE SELF)**
## License
diff --git a/doc/administration/package_information/omnibus_packages.md b/doc/administration/package_information/omnibus_packages.md
index aa73534fc55..115d6c394ad 100644
--- a/doc/administration/package_information/omnibus_packages.md
+++ b/doc/administration/package_information/omnibus_packages.md
@@ -4,7 +4,7 @@ group: Distribution
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#designated-technical-writers
---
-# Omnibus based packages and images
+# Omnibus based packages and images **(FREE SELF)**
Below you can find some basic information on why GitLab provides packages and
a Docker image that come with bundled dependencies.
diff --git a/doc/administration/package_information/postgresql_versions.md b/doc/administration/package_information/postgresql_versions.md
index 89da4864872..252e0cad76d 100644
--- a/doc/administration/package_information/postgresql_versions.md
+++ b/doc/administration/package_information/postgresql_versions.md
@@ -4,7 +4,7 @@ group: Distribution
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#designated-technical-writers
---
-# PostgreSQL versions shipped with Omnibus GitLab
+# PostgreSQL versions shipped with Omnibus GitLab **(FREE SELF)**
NOTE:
This table lists only GitLab versions where a significant change happened in the
diff --git a/doc/administration/package_information/signed_packages.md b/doc/administration/package_information/signed_packages.md
index fb994809460..fb605f8d5be 100644
--- a/doc/administration/package_information/signed_packages.md
+++ b/doc/administration/package_information/signed_packages.md
@@ -4,9 +4,9 @@ group: Distribution
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#designated-technical-writers
---
-# Package Signatures
+# Package Signatures **(FREE SELF)**
-As of the release of GitLab 9.5 on August 22, 2017, GitLab provides signed Omnibus GitLab packages for RPM and DEB based distributions. This means that all packages provided on <https://packages.gitlab.com> are signed, starting with `9.5.0`, and all future versions of supported branches (e.g. `9.3.x` and `9.4.x` after August 22, 2017). Any package version prior to August 22, 2017, will not be signed. Please pass the appropriate argument to your package manager. (Example: `yum --nogpgcheck`)
+As of the release of GitLab 9.5 on August 22, 2017, GitLab provides signed Omnibus GitLab packages for RPM and DEB based distributions. This means that all packages provided on <https://packages.gitlab.com> are signed, starting with `9.5.0`, and all future versions of supported branches (for example `9.3.x` and `9.4.x` after August 22, 2017). Any package version prior to August 22, 2017, will not be signed. Please pass the appropriate argument to your package manager. (Example: `yum --nogpgcheck`)
Omnibus GitLab packages produced by GitLab are created via the [Omnibus](https://github.com/chef/omnibus) tool, for which GitLab has added DEB signing via `debsigs` in [our own fork](https://gitlab.com/gitlab-org/omnibus). This addition, combined with the existing functionality of RPM signing, allows GitLab to provide signed packages for all supported distributions using DEB or RPM.
diff --git a/doc/administration/packages/container_registry.md b/doc/administration/packages/container_registry.md
index 1067474c8b4..7e711bb5740 100644
--- a/doc/administration/packages/container_registry.md
+++ b/doc/administration/packages/container_registry.md
@@ -119,6 +119,11 @@ GitLab from source respectively.
Ensure you choose a port different than the one that Registry listens to (`5000` by default),
otherwise conflicts occur.
+NOTE:
+Host and container firewall rules must be configured to allow traffic in through the port listed
+under the `registry_external_url` line, rather than the port listed under
+`gitlab_rails['registry_port']` (default `5000`).
+
**Omnibus GitLab installations**
1. Your `/etc/gitlab/gitlab.rb` should contain the Registry URL as well as the
@@ -151,6 +156,19 @@ otherwise conflicts occur.
If your certificate provider provides the CA Bundle certificates, append them to the TLS certificate file.
+An administrator may want the container registry listening on an arbitrary port such as `5678`.
+However, the registry and application server are behind an AWS application load balancer that only
+listens on ports `80` and `443`. The admin may simply remove the port number for
+`registry_external_url`, so HTTP or HTTPS is assumed. Then, the rules apply that map the load
+balancer to the registry from ports `80` or `443` to the arbitrary port. This is important if users
+rely on the `docker login` example in the container registry. Here's an example:
+
+```ruby
+registry_external_url 'https://registry-gitlab.example.com'
+registry_nginx['redirect_http_to_https'] = true
+registry_nginx['listen_port'] = 5678
+```
+
**Installations from source**
1. Open `/home/git/gitlab/config/gitlab.yml`, find the `registry` entry and
diff --git a/doc/administration/packages/dependency_proxy.md b/doc/administration/packages/dependency_proxy.md
index 32e7e191011..a394a32fc18 100644
--- a/doc/administration/packages/dependency_proxy.md
+++ b/doc/administration/packages/dependency_proxy.md
@@ -29,8 +29,8 @@ To enable the dependency proxy feature:
gitlab_rails['dependency_proxy_enabled'] = true
```
-1. Save the file and [reconfigure GitLab](../restart_gitlab.md#omnibus-gitlab-reconfigure "How to reconfigure Omnibus GitLab") for the changes to take effect.
-1. Enable the [Puma web server](https://docs.gitlab.com/omnibus/settings/puma.html).
+1. Save the file and [reconfigure GitLab](../restart_gitlab.md#omnibus-gitlab-reconfigure) for the changes to take effect.
+1. Enable the [Puma web server](../operations/puma.md).
**Helm chart installations**
@@ -88,7 +88,7 @@ To change the local storage path:
gitlab_rails['dependency_proxy_storage_path'] = "/mnt/dependency_proxy"
```
-1. Save the file and [reconfigure GitLab](../restart_gitlab.md#omnibus-gitlab-reconfigure "How to reconfigure Omnibus GitLab") for the changes to take effect.
+1. Save the file and [reconfigure GitLab](../restart_gitlab.md#omnibus-gitlab-reconfigure) for the changes to take effect.
**Installations from source**
@@ -145,7 +145,7 @@ This section describes the earlier configuration format.
}
```
-1. Save the file and [reconfigure GitLab](../restart_gitlab.md#omnibus-gitlab-reconfigure "How to reconfigure Omnibus GitLab") for the changes to take effect.
+1. Save the file and [reconfigure GitLab](../restart_gitlab.md#omnibus-gitlab-reconfigure) for the changes to take effect.
**Installations from source**
diff --git a/doc/administration/packages/img/gitlab-registry-architecture.png b/doc/administration/packages/img/gitlab-registry-architecture.png
index 742678d5e11..d6e8f935ad2 100644
--- a/doc/administration/packages/img/gitlab-registry-architecture.png
+++ b/doc/administration/packages/img/gitlab-registry-architecture.png
Binary files differ
diff --git a/doc/administration/packages/index.md b/doc/administration/packages/index.md
index 37473d35573..90f2d9127fe 100644
--- a/doc/administration/packages/index.md
+++ b/doc/administration/packages/index.md
@@ -68,7 +68,7 @@ To enable the Packages feature:
gitlab_rails['packages_enabled'] = true
```
-1. Save the file and [reconfigure GitLab](../restart_gitlab.md#omnibus-gitlab-reconfigure "How to reconfigure Omnibus GitLab") for the changes to take effect.
+1. Save the file and [reconfigure GitLab](../restart_gitlab.md#omnibus-gitlab-reconfigure) for the changes to take effect.
**Installations from source**
@@ -80,7 +80,7 @@ To enable the Packages feature:
enabled: true
```
-1. [Restart GitLab](../restart_gitlab.md#omnibus-gitlab-reconfigure "How to reconfigure Omnibus GitLab") for the changes to take effect.
+1. [Restart GitLab](../restart_gitlab.md#omnibus-gitlab-reconfigure) for the changes to take effect.
**Helm Chart installations**
@@ -92,7 +92,7 @@ To enable the Packages feature:
enabled: true
```
-1. [Restart GitLab](../restart_gitlab.md#helm-chart-installations "How to reconfigure Helm GitLab") for the changes to take effect.
+1. [Restart GitLab](../restart_gitlab.md#helm-chart-installations) for the changes to take effect.
## Rate limits
diff --git a/doc/administration/pages/index.md b/doc/administration/pages/index.md
index 8b7af5ee170..8a0d3f552bf 100644
--- a/doc/administration/pages/index.md
+++ b/doc/administration/pages/index.md
@@ -7,12 +7,6 @@ description: 'Learn how to administer GitLab Pages.'
# GitLab Pages administration **(FREE SELF)**
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/80) in GitLab EE 8.3.
-> - Custom CNAMEs with TLS support were [introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/173) in GitLab EE 8.5.
-> - GitLab Pages [was ported](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/14605) to Community Edition in GitLab 8.17.
-> - Support for subgroup project's websites was
-> [introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/30548) in GitLab 11.8.
-
GitLab Pages allows for hosting of static sites. It must be configured by an
administrator. Separate [user documentation](../../user/project/pages/index.md) is available.
@@ -23,10 +17,10 @@ GitLab from source, see
## Overview
-GitLab Pages makes use of the [GitLab Pages daemon](https://gitlab.com/gitlab-org/gitlab-pages), a simple HTTP server
+GitLab Pages makes use of the [GitLab Pages daemon](https://gitlab.com/gitlab-org/gitlab-pages), a basic HTTP server
written in Go that can listen on an external IP address and provide support for
custom domains and custom certificates. It supports dynamic certificates through
-SNI and exposes pages using HTTP2 by default.
+Server Name Indication (SNI) and exposes pages using HTTP2 by default.
You are encouraged to read its [README](https://gitlab.com/gitlab-org/gitlab-pages/blob/master/README.md) to fully understand how
it works.
@@ -89,7 +83,7 @@ added `gitlab.io` [in 2016](https://gitlab.com/gitlab-com/infrastructure/-/issue
### DNS configuration
GitLab Pages expect to run on their own virtual host. In your DNS server/provider
-you need to add a [wildcard DNS A record](https://en.wikipedia.org/wiki/Wildcard_DNS_record) pointing to the
+add a [wildcard DNS A record](https://en.wikipedia.org/wiki/Wildcard_DNS_record) pointing to the
host that GitLab runs. For example, an entry would look like this:
```plaintext
@@ -99,9 +93,9 @@ host that GitLab runs. For example, an entry would look like this:
Where `example.io` is the domain GitLab Pages is served from,
`192.0.2.1` is the IPv4 address of your GitLab instance, and `2001:db8::1` is the
-IPv6 address. If you don't have IPv6, you can omit the AAAA record.
+IPv6 address. If you don't have IPv6, you can omit the `AAAA` record.
-#### Custom domains
+#### DNS configuration for custom domains
If support for custom domains is needed, the Pages root domain and its subdomains should point to
the secondary IP (which is dedicated for the Pages daemon). `<namespace>.<pages root domain>` should
@@ -131,7 +125,7 @@ Depending on your needs, you can set up GitLab Pages in 4 different ways.
The following examples are listed from the easiest setup to the most
advanced one. The absolute minimum requirement is to set up the wildcard DNS
-since that is needed in all configurations.
+because that is needed in all configurations.
### Wildcard domains
@@ -143,7 +137,7 @@ since that is needed in all configurations.
URL scheme: `http://<namespace>.example.io/<project_slug>`
-This is the minimum setup that you can use Pages with. It is the base for all
+The following is the minimum setup that you can use Pages with. It is the base for all
other setups as described below. NGINX proxies all requests to the daemon.
The Pages daemon doesn't listen to the outside world.
@@ -180,8 +174,8 @@ outside world.
pages_nginx['redirect_http_to_https'] = true
```
-1. If you haven't named your certificate and key `example.io.crt` and `example.io.key`
-then you'll need to also add the full paths as shown below:
+1. If you haven't named your certificate and key `example.io.crt` and `example.io.key`,
+you must also add the full paths as shown below:
```ruby
pages_nginx['ssl_certificate'] = "/etc/gitlab/ssl/pages-nginx.crt"
@@ -201,7 +195,7 @@ Multiple wildcards for one instance is not supported. Only one wildcard per inst
Below is a table of all configuration settings known to Pages in Omnibus GitLab,
and what they do. These options can be adjusted in `/etc/gitlab/gitlab.rb`,
and take effect after you [reconfigure GitLab](../restart_gitlab.md#omnibus-gitlab-reconfigure).
-Most of these settings don't need to be configured manually unless you need more granular
+Most of these settings don't have to be configured manually unless you need more granular
control over how the Pages daemon runs and serves content in your environment.
| Setting | Description |
@@ -382,8 +376,6 @@ To enable it:
### Access control
-> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/33422) in GitLab 11.5.
-
GitLab Pages access control can be configured per-project, and allows access to a Pages
site to be controlled based on a user's membership to that project.
@@ -444,7 +436,7 @@ You can enforce [Access Control](#access-control) for all GitLab Pages websites
on your GitLab instance. By doing so, only logged-in users have access to them.
This setting overrides Access Control set by users in individual projects.
-This can be useful to preserve information published with Pages websites to the users
+This can be helpful to restrict information published with Pages websites to the users
of your instance only.
To do that:
@@ -491,7 +483,7 @@ For Omnibus, this is fixed by [installing a custom CA in Omnibus GitLab](https:/
> [Introduced](https://gitlab.com/gitlab-org/gitlab-pages/-/merge_requests/392) in GitLab 13.7.
WARNING:
-These are advanced settings. The recommended default values are set inside GitLab Pages. You should
+These instructions deal with some advanced settings of your GitLab instance. The recommended default values are set inside GitLab Pages. You should
change these settings only if absolutely necessary. Use extreme caution.
GitLab Pages can serve content from ZIP archives through object storage (an
@@ -524,9 +516,6 @@ After an archive reaches `zip_cache_expiration`, it's marked as expired and remo
## Activate verbose logging for daemon
-Verbose logging was [introduced](https://gitlab.com/gitlab-org/omnibus-gitlab/-/merge_requests/2533) in
-Omnibus GitLab 11.1.
-
Follow the steps below to configure verbose logging of GitLab Pages daemon.
1. By default the daemon only logs with `INFO` level.
@@ -603,8 +592,6 @@ the below steps to do a no downtime transfer to a new storage location.
## Configure listener for reverse proxy requests
-> [Introduced](https://gitlab.com/gitlab-org/omnibus-gitlab/-/merge_requests/2533) in Omnibus GitLab 11.1.
-
Follow the steps below to configure the proxy listener of GitLab Pages.
1. By default the listener is configured to listen for requests on `localhost:8090`.
@@ -775,7 +762,7 @@ WARNING:
From [GitLab 13.3](https://gitlab.com/gitlab-org/gitlab/-/issues/217912) to [GitLab 13.12](https://gitlab.com/gitlab-org/omnibus-gitlab/-/issues/5993) GitLab Pages can either use `disk` or `gitlab` domain configuration source.
-We highly advise you to use `gitlab` configuration source as it will make transition to newer versions easier.
+We highly advise you to use `gitlab` configuration source as it makes transitions to newer versions easier.
To explicitly enable API source:
@@ -1019,14 +1006,13 @@ Starting from GitLab 13.12, this setting also disables the [legacy storage](#mig
In GitLab 14.0 a number of breaking changes were introduced which may require some user intervention.
The steps below describe the best way to migrate without causing any downtime for your GitLab instance.
-If you run GitLab on a single server, then most likely the upgrade process to 14.0 will go smoothly for you
-and you will not notice any problem after upgrading.
+A GitLab instance running on a single server typically upgrades to 14.0 smoothly, and there should be minimal issues after the upgrade is complete.
Regardless, we recommend everyone follow the migration steps to ensure a successful upgrade.
If at any point you run into issues, consult the [troubleshooting section](#troubleshooting).
-If your current GitLab version is lower than 13.12, then you first need to update to 13.12.
+If your current GitLab version is lower than 13.12, then you must first update to 13.12.
Updating directly to 14.0 is [not supported](../../update/index.md#upgrade-paths)
-and may cause downtime for some web-sites hosted on GitLab Pages. Once you update to 13.12,
+and may cause downtime for some web-sites hosted on GitLab Pages. After you update to 13.12,
migrate GitLab Pages to prepare them for GitLab 14.0:
1. Set [`domain_config_source` to `gitlab`](#domain-source-configuration-before-140), which
@@ -1077,7 +1063,7 @@ This issue is fixed in GitLab 14.3 and above, try upgrading GitLab first.
GitLab Pages runs inside a `chroot` jail, usually in a uniquely numbered directory like
`/tmp/gitlab-pages-*`.
-Within the jail, a bundle of trusted certificates is
+In the jail, a bundle of trusted certificates is
provided at `/etc/ssl/ca-bundle.pem`. It's
[copied there](https://gitlab.com/gitlab-org/gitlab-pages/-/merge_requests/51)
from `/opt/gitlab/embedded/ssl/certs/cacert.pem`
@@ -1206,26 +1192,10 @@ To stop `systemd` from cleaning the Pages related content:
sudo gitlab-ctl restart gitlab-pages
```
-### 404 error after transferring the project to a different group or user, or changing project path
-
-If you encounter a `404 Not Found` error a Pages site after transferring a project to
-another group or user, or changing project path, you must trigger a domain configuration
-update for Pages. To do so, write something in the `.update` file. The Pages daemon
-monitors for changes to this file, and reloads the configuration when changes occur.
-
-Use this example to fix a `404 Not Found` error after transferring a project or changing
-a project path with Pages:
-
-```shell
-date > /var/opt/gitlab/gitlab-rails/shared/pages/.update
-```
-
-If you've customized the Pages storage path, adjust the command above to use your custom path.
-
### 404 error after promoting a Geo secondary to a primary node
-These are due to the Pages files not being among the
-[supported data types](../geo/replication/datatypes.md#limitations-on-replicationverification).
+Pages files are not among the
+[supported data types](../geo/replication/datatypes.md#limitations-on-replicationverification) for replication in Geo. After a secondary node is promoted to a primary node, attempts to access a Pages site result in a `404 Not Found` error.
It is possible to copy the subfolders and files in the [Pages path](#change-storage-path)
to the new primary node to resolve this.
@@ -1233,11 +1203,11 @@ For example, you can adapt the `rsync` strategy from the
[moving repositories documentation](../operations/moving_repositories.md).
Alternatively, run the CI pipelines of those projects that contain a `pages` job again.
-## 404 or 500 error when accessing GitLab Pages in a Geo setup
+### 404 or 500 error when accessing GitLab Pages in a Geo setup
Pages sites are only available on the primary Geo site, while the codebase of the project is available on all sites.
-If you try to access a Pages page on a secondary site, you will get a 404 or 500 HTTP code depending on the access control.
+If you try to access a Pages page on a secondary site, a 404 or 500 HTTP code is returned depending on the access control.
Read more which [features don't support Geo replication/verification](../geo/replication/datatypes.md#limitations-on-replicationverification).
diff --git a/doc/administration/postgresql/replication_and_failover.md b/doc/administration/postgresql/replication_and_failover.md
index 2e0820b69c9..dc569a81abf 100644
--- a/doc/administration/postgresql/replication_and_failover.md
+++ b/doc/administration/postgresql/replication_and_failover.md
@@ -23,10 +23,7 @@ replication and failover requires:
- A minimum of three database nodes.
- A minimum of three `Consul` server nodes.
-- A minimum of one `pgbouncer` service node, but it's recommended to have one
- per database node.
- - An internal load balancer (TCP) is required when there is more than one
- `pgbouncer` service node.
+- A minimum of one `pgbouncer` service node, but it's recommended to have one per database node. An internal load balancer (TCP) is required when there is more than one `pgbouncer` service node.
![PostgreSQL HA Architecture](img/pg_ha_architecture.png)
@@ -35,40 +32,31 @@ sure you have redundant connectivity between all Database and GitLab instances
to avoid the network becoming a single point of failure.
NOTE:
-As of GitLab 13.3, PostgreSQL 12 is shipped with Omnibus GitLab. Clustering for PostgreSQL 12 is only supported with
+As of GitLab 13.3, PostgreSQL 12 is shipped with Omnibus GitLab. Clustering for PostgreSQL 12 is supported only with
Patroni. See the [Patroni](#patroni) section for further details. Starting with GitLab 14.0, only PostgreSQL 12 is
-shipped with Omnibus GitLab and thus Patroni becomes mandatory for replication and failover.
+shipped with Omnibus GitLab, and thus Patroni becomes mandatory for replication and failover.
### Database node
Each database node runs three services:
-`PostgreSQL` - The database itself.
-
-`Patroni` - Communicates with other Patroni services in the cluster and handles
-failover when issues with the leader server occurs. The failover procedure
-consists of:
-
-- Selecting a new leader for the cluster.
-- Promoting the new node to leader.
-- Instructing remaining servers to follow the new leader node.
-
-`Consul` agent - To communicate with Consul cluster which stores the current Patroni state. The agent monitors the status of each node in the database cluster and tracks its health in a service definition on the Consul cluster.
+- `PostgreSQL`: The database itself.
+- `Patroni`: Communicates with other Patroni services in the cluster and handles failover when issues with the leader server occurs. The failover procedure consists of:
+ - Selecting a new leader for the cluster.
+ - Promoting the new node to leader.
+ - Instructing remaining servers to follow the new leader node.
+- `Consul` agent: To communicate with Consul cluster which stores the current Patroni state. The agent monitors the status of each node in the database cluster and tracks its health in a service definition on the Consul cluster.
### Consul server node
-The Consul server node runs the Consul server service. These nodes must have reached the quorum and elected a leader _before_ Patroni cluster bootstrap otherwise database nodes wait until such Consul leader is elected.
+The Consul server node runs the Consul server service. These nodes must have reached the quorum and elected a leader _before_ Patroni cluster bootstrap; otherwise, database nodes wait until such Consul leader is elected.
### PgBouncer node
Each PgBouncer node runs two services:
-`PgBouncer` - The database connection pooler itself.
-
-`Consul` agent - Watches the status of the PostgreSQL service definition on the
-Consul cluster. If that status changes, Consul runs a script which updates the
-PgBouncer configuration to point to the new PostgreSQL leader node and reloads
-the PgBouncer service.
+- `PgBouncer`: The database connection pooler itself.
+- `Consul` agent: Watches the status of the PostgreSQL service definition on the Consul cluster. If that status changes, Consul runs a script which updates the PgBouncer configuration to point to the new PostgreSQL leader node and reloads the PgBouncer service.
### Connection flow
@@ -106,8 +94,7 @@ When using default setup, minimum configuration requires:
- `CONSUL_USERNAME`. The default user for Omnibus GitLab is `gitlab-consul`
- `CONSUL_DATABASE_PASSWORD`. Password for the database user.
-- `CONSUL_PASSWORD_HASH`. This is a hash generated out of Consul username/password pair.
- Can be generated with:
+- `CONSUL_PASSWORD_HASH`. This is a hash generated out of Consul username/password pair. It can be generated with:
```shell
sudo gitlab-ctl pg-password-md5 CONSUL_USERNAME
@@ -118,8 +105,7 @@ When using default setup, minimum configuration requires:
Few notes on the service itself:
- The service runs under a system account, by default `gitlab-consul`.
- - If you are using a different username, you have to specify it through the
- `CONSUL_USERNAME` variable.
+- If you are using a different username, you have to specify it through the `CONSUL_USERNAME` variable.
- Passwords are stored in the following locations:
- `/etc/gitlab/gitlab.rb`: hashed
- `/var/opt/gitlab/pgbouncer/pg_auth`: hashed
@@ -129,10 +115,8 @@ Few notes on the service itself:
When configuring PostgreSQL, we do the following:
-- Set `max_replication_slots` to double the number of database nodes.
- Patroni uses one extra slot per node when initiating the replication.
-- Set `max_wal_senders` to one more than the allocated number of replication slots in the cluster.
- This prevents replication from using up all of the available database connections.
+- Set `max_replication_slots` to double the number of database nodes. Patroni uses one extra slot per node when initiating the replication.
+- Set `max_wal_senders` to one more than the allocated number of replication slots in the cluster. This prevents replication from using up all of the available database connections.
In this document we are assuming 3 database nodes, which makes this configuration:
@@ -151,7 +135,7 @@ You need the following password information for the application's database user:
- `POSTGRESQL_USERNAME`. The default user for Omnibus GitLab is `gitlab`
- `POSTGRESQL_USER_PASSWORD`. The password for the database user
- `POSTGRESQL_PASSWORD_HASH`. This is a hash generated out of the username/password pair.
- Can be generated with:
+ It can be generated with:
```shell
sudo gitlab-ctl pg-password-md5 POSTGRESQL_USERNAME
@@ -170,8 +154,7 @@ When using a default setup, the minimum configuration requires:
- `PGBOUNCER_USERNAME`. The default user for Omnibus GitLab is `pgbouncer`
- `PGBOUNCER_PASSWORD`. This is a password for PgBouncer service.
-- `PGBOUNCER_PASSWORD_HASH`. This is a hash generated out of PgBouncer username/password pair.
- Can be generated with:
+- `PGBOUNCER_PASSWORD_HASH`. This is a hash generated out of PgBouncer username/password pair. It can be generated with:
```shell
sudo gitlab-ctl pg-password-md5 PGBOUNCER_USERNAME
@@ -181,8 +164,7 @@ When using a default setup, the minimum configuration requires:
Few things to remember about the service itself:
-- The service runs as the same system account as the database
- - In the package, this is by default `gitlab-psql`
+- The service runs as the same system account as the database. In the package, this is by default `gitlab-psql`
- If you use a non-default user account for PgBouncer service (by default `pgbouncer`), you need to specify this username.
- Passwords are stored in the following locations:
- `/etc/gitlab/gitlab.rb`: hashed, and in plain text
@@ -206,7 +188,7 @@ When installing the GitLab package, do not supply `EXTERNAL_URL` value.
You must enable Patroni explicitly to be able to use it (with `patroni['enable'] = true`).
-Any PostgreSQL configuration item that controls replication, for example `wal_level`, `max_wal_senders`, etc, are strictly
+Any PostgreSQL configuration item that controls replication, for example `wal_level`, `max_wal_senders`, or others are strictly
controlled by Patroni. These configurations override the original settings that you make with the `postgresql[...]` configuration key.
Hence, they are all separated and placed under `patroni['postgresql'][...]`. This behavior is limited to replication.
Patroni honours any other PostgreSQL configuration that was made with the `postgresql[...]` configuration key. For example,
@@ -215,7 +197,7 @@ configuration key.
NOTE:
The configuration of a Patroni node is very similar to a repmgr but shorter. When Patroni is enabled, first you can ignore
-any replication setting of PostgreSQL (it is overwritten anyway). Then you can remove any `repmgr[...]` or
+any replication setting of PostgreSQL (which is overwritten). Then, you can remove any `repmgr[...]` or
repmgr-specific configuration as well. Especially, make sure that you remove `postgresql['shared_preload_libraries'] = 'repmgr_funcs'`.
Here is an example:
@@ -282,7 +264,7 @@ on each node for the changes to take effect.
Generally, when Consul cluster is ready, the first node that [reconfigures](../restart_gitlab.md#omnibus-gitlab-reconfigure)
becomes the leader. You do not need to sequence the nodes reconfiguration. You can run them in parallel or in any order.
-If you choose an arbitrary order you do not have any predetermined leader.
+If you choose an arbitrary order, you do not have any predetermined leader.
#### Enable Monitoring
@@ -296,7 +278,7 @@ If you enable Monitoring, it must be enabled on **all** database servers.
# Enable service discovery for Prometheus
consul['monitoring_service_discovery'] = true
- # Set the network addresses that the exporters will listen on
+ # Set the network addresses that the exporters must listen on
node_exporter['listen_address'] = '0.0.0.0:9100'
postgres_exporter['listen_address'] = '0.0.0.0:9187'
```
@@ -340,9 +322,9 @@ patroni['tls_ca_file'] = '/path/to/ca.pem'
When TLS is enabled, mutual authentication of the API server and client is possible for all endpoints, the extent of which depends on
the `patroni['tls_client_mode']` attribute:
-- `none` (default): the API will not check for any client certificates.
-- `optional`: client certificates are required for all [unsafe](https://patroni.readthedocs.io/en/latest/security.html#protecting-the-rest-api) API calls.
-- `required`: client certificates are required for all API calls.
+- `none` (default): The API does not check for any client certificates.
+- `optional`: Client certificates are required for all [unsafe](https://patroni.readthedocs.io/en/latest/security.html#protecting-the-rest-api) API calls.
+- `required`: Client certificates are required for all API calls.
The client certificates are verified against the CA certificate that is specified with the `patroni['tls_ca_file']` attribute. Therefore,
this attribute is required for mutual TLS authentication. You also need to specify PEM-formatted client certificate and private key files.
@@ -450,9 +432,9 @@ authentication mode (`patroni['tls_client_mode']`), must each have the same valu
#### Configure the internal load balancer
-If you're running more than one PgBouncer node as recommended, then you need to set up a TCP internal load balancer to serve each correctly. This can be accomplished with any reputable TCP load balancer.
+If you're running more than one PgBouncer node as recommended, you must set up a TCP internal load balancer to serve each correctly. This can be accomplished with any reputable TCP load balancer.
-As an example here's how you could do it with [HAProxy](https://www.haproxy.org/):
+As an example, here's how you could do it with [HAProxy](https://www.haproxy.org/):
```plaintext
global
@@ -554,7 +536,7 @@ Here is a list and description of each machine and the assigned IP:
- `10.6.0.33`: PostgreSQL 3
- `10.6.0.41`: GitLab application
-All passwords are set to `toomanysecrets`, please do not use this password or derived hashes and the `external_url` for GitLab is `http://gitlab.example.com`.
+All passwords are set to `toomanysecrets`. Please do not use this password or derived hashes and the `external_url` for GitLab is `http://gitlab.example.com`.
After the initial configuration, if a failover occurs, the PostgresSQL leader node changes to one of the available secondaries until it is failed back.
@@ -675,7 +657,7 @@ This example uses 3 PostgreSQL servers, and 1 application node (with PgBouncer s
It differs from the [recommended setup](#example-recommended-setup) by moving the Consul servers into the same servers we use for PostgreSQL.
The trade-off is between reducing server counts, against the increased operational complexity of needing to deal with PostgreSQL [failover](#manual-failover-procedure-for-patroni) procedures in addition to [Consul outage recovery](../consul.md#outage-recovery) on the same set of machines.
-In this example we start with all servers on the same 10.6.0.0/16 private network range, they can connect to each freely other on those addresses.
+In this example, we start with all servers on the same 10.6.0.0/16 private network range; they can connect to each freely other on those addresses.
Here is a list and description of each machine and the assigned IP:
@@ -684,7 +666,7 @@ Here is a list and description of each machine and the assigned IP:
- `10.6.0.23`: PostgreSQL 3
- `10.6.0.31`: GitLab application
-All passwords are set to `toomanysecrets`, please do not use this password or derived hashes.
+All passwords are set to `toomanysecrets`. Please do not use this password or derived hashes.
The `external_url` for GitLab is `http://gitlab.example.com`
@@ -787,7 +769,7 @@ Patroni is an opinionated solution for PostgreSQL high-availability. It takes th
The fundamental [architecture](#example-recommended-setup-manual-steps) (mentioned above) does not change for Patroni.
You do not need any special consideration for Patroni while provisioning your database nodes. Patroni heavily relies on Consul to store the state of the cluster and elect a leader. Any failure in Consul cluster and its leader election propagates to the Patroni cluster as well.
-Patroni monitors the cluster and handles any failover. When the primary node fails it works with Consul to notify PgBouncer. On failure, Patroni handles the transitioning of the old primary to a replica and rejoins it to the cluster automatically.
+Patroni monitors the cluster and handles any failover. When the primary node fails, it works with Consul to notify PgBouncer. On failure, Patroni handles the transitioning of the old primary to a replica and rejoins it to the cluster automatically.
With Patroni, the connection flow is slightly different. Patroni on each node connects to Consul agent to join the cluster. Only after this point it decides if the node is the primary or a replica. Based on this decision, it configures and starts PostgreSQL which it communicates with directly over a Unix socket. This means that if the Consul cluster is not functional or does not have a leader, Patroni and by extension PostgreSQL does not start. Patroni also exposes a REST API which can be accessed via its [default port](../package_information/defaults.md)
on each node.
@@ -847,7 +829,7 @@ Investigate further if:
- `reply_time` is not current.
The `lsn` fields relate to which write-ahead-log segments have been replicated.
-Run the following on the leader to find out the current LSN:
+Run the following on the leader to find out the current Log Sequence Number (LSN):
```shell
echo 'SELECT pg_current_wal_lsn();' | gitlab-psql
@@ -918,7 +900,7 @@ patroni['remove_data_directory_on_diverged_timelines'] = false
|-|-|
|`use_pg_rewind`|Try running `pg_rewind` on the former cluster leader before it rejoins the database cluster.|
|`remove_data_directory_on_rewind_failure`|If `pg_rewind` fails, remove the local PostgreSQL data directory and re-replicate from the current cluster leader.|
-|`remove_data_directory_on_diverged_timelines`|If `pg_rewind` cannot be used and the former leader's timeline has diverged from the current one, then delete the local data directory and re-replicate from the current cluster leader.|
+|`remove_data_directory_on_diverged_timelines`|If `pg_rewind` cannot be used and the former leader's timeline has diverged from the current one, delete the local data directory and re-replicate from the current cluster leader.|
### Database authorization for Patroni
@@ -936,7 +918,7 @@ You can use `gitlab-ctl patroni members` to check the status of the cluster memb
is the primary or a replica.
When Patroni is enabled, it exclusively controls PostgreSQL's startup,
-shutdown, and restart. This means, to shut down PostgreSQL on a certain node you must shutdown Patroni on the same node with:
+shutdown, and restart. This means, to shut down PostgreSQL on a certain node, you must shutdown Patroni on the same node with:
```shell
sudo gitlab-ctl stop patroni
@@ -974,7 +956,7 @@ When a Geo secondary site is replicating from a primary site that uses `Patroni`
sudo gitlab-ctl replicate-geo-database --host=<new_leader_ip> --replication-slot=<slot_name>
```
-Otherwise, the replication will not happen, even if the original node gets re-added as a follower node. This re-syncs your secondary site database and may take a long time depending on the amount of data to sync. You may also need to run `gitlab-ctl reconfigure` if replication is still not working after re-syncing.
+Otherwise, the replication does not happen, even if the original node gets re-added as a follower node. This re-syncs your secondary site database and may take a long time depending on the amount of data to sync. You may also need to run `gitlab-ctl reconfigure` if replication is still not working after re-syncing.
### Recovering the Patroni cluster
@@ -1097,7 +1079,7 @@ Considering these, you should carefully plan your PostgreSQL upgrade:
sudo gitlab-ctl pg-upgrade -V 12
```
-1. Check the status of the leader and cluster. You can only proceed if you have a healthy leader:
+1. Check the status of the leader and cluster. You can proceed only if you have a healthy leader:
```shell
gitlab-ctl patroni check-leader
@@ -1192,7 +1174,7 @@ If replication is not occurring, it may be necessary to reinitialize a replica.
WARNING:
This is a destructive process and may lead the cluster into a bad state. Make sure that you have a healthy backup before running this process.
-As a last resort, if your Patroni cluster is in an unknown/bad state and no node can start, you can
+As a last resort, if your Patroni cluster is in an unknown or bad state and no node can start, you can
reset the Patroni state in Consul completely, resulting in a reinitialized Patroni cluster when
the first Patroni node starts.
@@ -1248,7 +1230,7 @@ To fix the problem, ensure the loopback interface is included in the CIDR addres
1. [Reconfigure GitLab](../restart_gitlab.md#omnibus-gitlab-reconfigure) for the changes to take effect.
1. Check that [all the replicas are synchronized](#check-replication-status)
-### Errors in Patroni logs: the requested start point is ahead of the WAL flush position
+### Errors in Patroni logs: the requested start point is ahead of the Write Ahead Log (WAL) flush position
This error indicates that the database is not replicating:
diff --git a/doc/administration/raketasks/check.md b/doc/administration/raketasks/check.md
index 7cd7ecc26f7..1d60b8c6f50 100644
--- a/doc/administration/raketasks/check.md
+++ b/doc/administration/raketasks/check.md
@@ -14,7 +14,8 @@ Even though Git is very resilient and tries to prevent data integrity issues,
there are times when things go wrong. The following Rake tasks intend to
help GitLab administrators diagnose problem repositories so they can be fixed.
-There are 3 things that are checked to determine integrity.
+These Rake tasks use three different methods to determine the integrity of Git
+repositories.
1. Git repository file system check ([`git fsck`](https://git-scm.com/docs/git-fsck)).
This step verifies the connectivity and validity of objects in the repository.
@@ -37,7 +38,7 @@ exactly which repositories are causing the trouble.
### Check project code repositories
This task loops through the project code repositories and runs the integrity check
-described previously. If a project uses a pool repository, that will also be checked.
+described previously. If a project uses a pool repository, that is also checked.
Other types of Git repositories [are not checked](https://gitlab.com/gitlab-org/gitaly/-/issues/3643).
**Omnibus Installation**
@@ -67,7 +68,7 @@ source repository.
This task loops through all repositories on the GitLab server and outputs
checksums in the format `<PROJECT ID>,<CHECKSUM>`.
-- If a repository doesn't exist, the project ID will have a blank checksum.
+- If a repository doesn't exist, the project ID is a blank checksum.
- If a repository exists but is empty, the output checksum is `0000000000000000000000000000000000000000`.
- Projects which don't exist are skipped.
@@ -85,9 +86,9 @@ sudo -u git -H bundle exec rake gitlab:git:checksum_projects RAILS_ENV=productio
For example, if:
-- Project with ID#2 doesn't exist, it will be skipped.
-- Project with ID#4 doesn't have a repository, its checksum will be blank.
-- Project with ID#5 has an empty repository, its checksum will be `0000000000000000000000000000000000000000`.
+- Project with ID#2 doesn't exist, it is skipped.
+- Project with ID#4 doesn't have a repository, its checksum is blank.
+- Project with ID#5 has an empty repository, its checksum is `0000000000000000000000000000000000000000`.
The output would then look something like:
@@ -105,7 +106,7 @@ Optionally, specific project IDs can be checksummed by setting an environment
variable `CHECKSUM_PROJECT_IDS` with a list of comma-separated integers, for example:
```shell
-CHECKSUM_PROJECT_IDS="1,3" sudo gitlab-rake gitlab:git:checksum_projects
+sudo CHECKSUM_PROJECT_IDS="1,3" gitlab-rake gitlab:git:checksum_projects
```
## Uploaded files integrity
@@ -115,7 +116,7 @@ These integrity checks can detect missing files. Additionally, for locally
stored files, checksums are generated and stored in the database upon upload,
and these checks verify them against current files.
-Currently, integrity checks are supported for the following types of file:
+Integrity checks are supported for the following types of file:
- CI artifacts (Available from version 10.7.0)
- LFS objects (Available from version 10.6.0)
@@ -206,7 +207,7 @@ above.
### Dangling objects
-The `gitlab:git:fsck` task can find dangling objects such as:
+The `gitlab-rake gitlab:git:fsck` task can find dangling objects such as:
```plaintext
dangling blob a12...
diff --git a/doc/administration/raketasks/maintenance.md b/doc/administration/raketasks/maintenance.md
index 5ddab999efe..d770361864e 100644
--- a/doc/administration/raketasks/maintenance.md
+++ b/doc/administration/raketasks/maintenance.md
@@ -115,7 +115,7 @@ component servers like [Gitaly](../gitaly/configure_gitaly.md#run-gitaly-on-its-
You may also have a look at our troubleshooting guides for:
- [GitLab](../index.md#troubleshooting)
-- [Omnibus GitLab](https://docs.gitlab.com/omnibus/README.html#troubleshooting)
+- [Omnibus GitLab](https://docs.gitlab.com/omnibus/index.html#troubleshooting)
To run `gitlab:check`, run:
@@ -247,7 +247,7 @@ have been corrupted, you should reinstall the omnibus package.
Sometimes you need to know if your GitLab installation can connect to a TCP
service on another machine (for example a PostgreSQL or web server)
-in order to troubleshoot proxy issues.
+to troubleshoot proxy issues.
A Rake task is included to help you with this.
**Omnibus Installation**
@@ -334,13 +334,13 @@ This is an experimental feature that isn't enabled by default. It requires Postg
Database indexes can be rebuilt regularly to reclaim space and maintain healthy levels of index bloat over time.
-In order to rebuild the two indexes with the highest estimated bloat, use the following Rake task:
+To rebuild the two indexes with the highest estimated bloat, use the following Rake task:
```shell
sudo gitlab-rake gitlab:db:reindex
```
-In order to target a specific index, use the following Rake task:
+To target a specific index, use the following Rake task:
```shell
sudo gitlab-rake gitlab:db:reindex['public.a_specific_index']
@@ -352,7 +352,7 @@ The following index types are not supported:
1. Partitioned indexes
1. Expression indexes
-Optionally, this Rake task sends annotations to a Grafana (4.6 or later) endpoint. Use the following custom environment variables in order to enable annotations:
+Optionally, this Rake task sends annotations to a Grafana (4.6 or later) endpoint. Use the following custom environment variables to enable annotations:
1. `GRAFANA_API_URL` - Grafana's base URL, for example `http://some-host:3000`.
1. `GRAFANA_API_KEY` - Grafana API key with at least `Editor role`.
diff --git a/doc/administration/read_only_gitlab.md b/doc/administration/read_only_gitlab.md
index cf45d3e15cf..2fbcb2a62e7 100644
--- a/doc/administration/read_only_gitlab.md
+++ b/doc/administration/read_only_gitlab.md
@@ -66,7 +66,7 @@ sudo gitlab-ctl start puma
If you want to allow users to use the GitLab UI, then you'll need to ensure that
the database is read-only:
-1. Take a [GitLab backup](../raketasks/backup_restore.md#back-up-gitlab)
+1. Take a [GitLab backup](../raketasks/backup_restore.md)
in case things don't go as expected.
1. Enter PostgreSQL on the console as an administrator user:
diff --git a/doc/administration/redis/replication_and_failover.md b/doc/administration/redis/replication_and_failover.md
index 48db734b1af..db652a80780 100644
--- a/doc/administration/redis/replication_and_failover.md
+++ b/doc/administration/redis/replication_and_failover.md
@@ -647,6 +647,7 @@ persistence classes.
| `shared_state` | Store session-related and other persistent data. |
| `actioncable` | Pub/Sub queue backend for ActionCable. |
| `trace_chunks` | Store [CI trace chunks](../job_logs.md#enable-or-disable-incremental-logging) data. |
+| `rate_limiting` | Store [rate limiting](../../user/admin_area/settings/user_and_ip_rate_limits.md) state. |
To make this work with Sentinel:
@@ -659,6 +660,7 @@ To make this work with Sentinel:
gitlab_rails['redis_shared_state_instance'] = REDIS_SHARED_STATE_URL
gitlab_rails['redis_actioncable_instance'] = REDIS_ACTIONCABLE_URL
gitlab_rails['redis_trace_chunks_instance'] = REDIS_TRACE_CHUNKS_URL
+ gitlab_rails['redis_rate_limiting_instance'] = REDIS_RATE_LIMITING_URL
# Configure the Sentinels
gitlab_rails['redis_cache_sentinels'] = [
@@ -681,6 +683,10 @@ To make this work with Sentinel:
{ host: TRACE_CHUNKS_SENTINEL_HOST, port: 26379 },
{ host: TRACE_CHUNKS_SENTINEL_HOST2, port: 26379 }
]
+ gitlab_rails['redis_rate_limiting_sentinels'] = [
+ { host: RATE_LIMITING_SENTINEL_HOST, port: 26379 },
+ { host: RATE_LIMITING_SENTINEL_HOST2, port: 26379 }
+ ]
```
- Redis URLs should be in the format: `redis://:PASSWORD@SENTINEL_PRIMARY_NAME`, where:
diff --git a/doc/administration/redis/standalone.md b/doc/administration/redis/standalone.md
index 42482475d26..8a3b88780a1 100644
--- a/doc/administration/redis/standalone.md
+++ b/doc/administration/redis/standalone.md
@@ -44,8 +44,7 @@ Omnibus GitLab:
1. [Reconfigure Omnibus GitLab](../restart_gitlab.md#omnibus-gitlab-reconfigure) for the changes to take effect.
1. Note the Redis node's IP address or hostname, port, and
- Redis password. These will be necessary when [configuring the GitLab
- application servers](#set-up-the-gitlab-rails-application-instance).
+ Redis password. These will be necessary when [configuring the GitLab application servers](#set-up-the-gitlab-rails-application-instance).
[Advanced configuration options](https://docs.gitlab.com/omnibus/settings/redis.html)
are supported and can be added if needed.
diff --git a/doc/administration/reference_architectures/10k_users.md b/doc/administration/reference_architectures/10k_users.md
index 0fd597e6a2d..e731085b0ce 100644
--- a/doc/administration/reference_architectures/10k_users.md
+++ b/doc/administration/reference_architectures/10k_users.md
@@ -12,6 +12,7 @@ full list of reference architectures, see
> - **Supported users (approximate):** 10,000
> - **High Availability:** Yes ([Praefect](#configure-praefect-postgresql) needs a third-party PostgreSQL solution for HA)
+> - **Cloud Native Hybrid:** [Yes](#cloud-native-hybrid-reference-architecture-with-helm-charts-alternative)
> - **Test requests per second (RPS) rates:** API: 200 RPS, Web: 20 RPS, Git (Pull): 20 RPS, Git (Push): 4 RPS
> - **[Latest 10k weekly performance testing results](https://gitlab.com/gitlab-org/quality/performance/-/wikis/Benchmarks/Latest/10k)**
@@ -22,18 +23,16 @@ full list of reference architectures, see
| PostgreSQL<sup>1</sup> | 3 | 8 vCPU, 30 GB memory | `n1-standard-8` | `m5.2xlarge` | `D8s v3` |
| PgBouncer<sup>1</sup> | 3 | 2 vCPU, 1.8 GB memory | `n1-highcpu-2` | `c5.large` | `F2s v2` |
| Internal load balancing node<sup>3</sup> | 1 | 2 vCPU, 1.8 GB memory | `n1-highcpu-2` | `c5.large` | `F2s v2` |
-| Redis - Cache<sup>2</sup> | 3 | 4 vCPU, 15 GB memory | `n1-standard-4` | `m5.xlarge` | `D4s v3` |
-| Redis - Queues / Shared State<sup>2</sup> | 3 | 4 vCPU, 15 GB memory | `n1-standard-4` | `m5.xlarge` | `D4s v3` |
-| Redis Sentinel - Cache<sup>2</sup> | 3 | 1 vCPU, 3.75 GB memory | `n1-standard-1` | `c5.large` | `A1 v2` |
-| Redis Sentinel - Queues / Shared State<sup>2</sup> | 3 | 1 vCPU, 3.75 GB memory | `n1-standard-1` | `c5.large` | `A1 v2` |
-| Gitaly | 3 | 16 vCPU, 60 GB memory | `n1-standard-16` | `m5.4xlarge` | `D16s v3` |
-| Praefect | 3 | 2 vCPU, 1.8 GB memory | `n1-highcpu-2` | `c5.large` | `F2s v2` |
+| Redis/Sentinel - Cache<sup>2</sup> | 3 | 4 vCPU, 15 GB memory | `n1-standard-4` | `m5.xlarge` | `D4s v3` |
+| Redis/Sentinel - Persistent<sup>2</sup> | 3 | 4 vCPU, 15 GB memory | `n1-standard-4` | `m5.xlarge` | `D4s v3` |
+| Gitaly<sup>5</sup> | 3 | 16 vCPU, 60 GB memory | `n1-standard-16` | `m5.4xlarge` | `D16s v3` |
+| Praefect<sup>5</sup> | 3 | 2 vCPU, 1.8 GB memory | `n1-highcpu-2` | `c5.large` | `F2s v2` |
| Praefect PostgreSQL<sup>1</sup> | 1+ | 2 vCPU, 1.8 GB memory | `n1-highcpu-2` | `c5.large` | `F2s v2` |
| Sidekiq | 4 | 4 vCPU, 15 GB memory | `n1-standard-4` | `m5.xlarge` | `D4s v3` |
| GitLab Rails | 3 | 32 vCPU, 28.8 GB memory | `n1-highcpu-32` | `c5.9xlarge` | `F32s v2` |
| Monitoring node | 1 | 4 vCPU, 3.6 GB memory | `n1-highcpu-4` | `c5.xlarge` | `F4s v2` |
| Object storage<sup>4</sup> | n/a | n/a | n/a | n/a | n/a |
-| NFS server (optional, not recommended) | 1 | 4 vCPU, 3.6 GB memory | `n1-highcpu-4` | `c5.xlarge` | `F4s v2` |
+| NFS server (non-Gitaly) | 1 | 4 vCPU, 3.6 GB memory | `n1-highcpu-4` | `c5.xlarge` | `F4s v2` |
<!-- Disable ordered list rule https://github.com/DavidAnson/markdownlint/blob/main/doc/Rules.md#md029---ordered-list-item-prefix -->
<!-- markdownlint-disable MD029 -->
@@ -41,6 +40,7 @@ full list of reference architectures, see
2. Can be optionally run on reputable third-party external PaaS Redis solutions. Google Memorystore and AWS Elasticache are known to work.
3. Can be optionally run on reputable third-party load balancing services (LB PaaS). AWS ELB is known to work.
4. Should be run on reputable third-party object storage (storage PaaS) for cloud implementations. Google Cloud Storage and AWS S3 are known to work.
+5. Gitaly Cluster provides the benefits of fault tolerance, but comes with additional complexity of setup and management. Please [review the existing technical limitations and considerations prior to deploying Gitaly Cluster](../gitaly/index.md#guidance-regarding-gitaly-cluster). If Gitaly Sharded is desired, the same specs listed above for `Gitaly` should be used.
<!-- markdownlint-enable MD029 -->
NOTE:
@@ -82,11 +82,6 @@ card "Database" as database {
card "redis" as redis {
collections "**Redis Persistent** x3" as redis_persistent #FF6347
collections "**Redis Cache** x3" as redis_cache #FF6347
- collections "**Redis Persistent Sentinel** x3" as redis_persistent_sentinel #FF6347
- collections "**Redis Cache Sentinel** x3"as redis_cache_sentinel #FF6347
-
- redis_persistent <.[#FF6347]- redis_persistent_sentinel
- redis_cache <.[#FF6347]- redis_cache_sentinel
}
cloud "**Object Storage**" as object_storage #white
@@ -137,8 +132,7 @@ our [Sysbench](https://github.com/akopytov/sysbench)-based
Due to better performance and availability, for data objects (such as LFS,
uploads, or artifacts), using an [object storage service](#configure-the-object-storage)
-is recommended instead of using NFS. Using an object storage service also
-doesn't require you to provision and maintain a node.
+is recommended.
It's also worth noting that at this time [Praefect requires its own database server](../gitaly/praefect.md#postgresql) and
that to achieve full High Availability a third-party PostgreSQL database solution will be required.
@@ -169,10 +163,8 @@ To set up GitLab and its components to accommodate up to 10,000 users:
used for shared data objects.
1. [Configure Advanced Search](#configure-advanced-search) (optional) for faster,
more advanced code search across your entire GitLab instance.
-1. [Configure NFS](#configure-nfs-optional) (optional, and not recommended)
- to have shared disk storage service as an alternative to Gitaly or object
- storage. You can skip this step if you're not using GitLab Pages (which
- requires NFS).
+1. [Configure NFS](#configure-nfs)
+ to have shared disk storage service for certain GitLab operations (non Gitaly or Object Storage).
The servers start on the same 10.6.0.0/24 private network range, and can
connect to each other freely on these addresses.
@@ -193,15 +185,9 @@ The following list includes descriptions of each server and its assigned IP:
- `10.6.0.51`: Redis - Cache Primary
- `10.6.0.52`: Redis - Cache Replica 1
- `10.6.0.53`: Redis - Cache Replica 2
-- `10.6.0.71`: Sentinel - Cache 1
-- `10.6.0.72`: Sentinel - Cache 2
-- `10.6.0.73`: Sentinel - Cache 3
-- `10.6.0.61`: Redis - Queues Primary
-- `10.6.0.62`: Redis - Queues Replica 1
-- `10.6.0.63`: Redis - Queues Replica 2
-- `10.6.0.81`: Sentinel - Queues 1
-- `10.6.0.82`: Sentinel - Queues 2
-- `10.6.0.83`: Sentinel - Queues 3
+- `10.6.0.61`: Redis - Persistent Primary
+- `10.6.0.62`: Redis - Persistent Replica 1
+- `10.6.0.63`: Redis - Persistent Replica 2
- `10.6.0.91`: Gitaly 1
- `10.6.0.92`: Gitaly 2
- `10.6.0.93`: Gitaly 3
@@ -792,15 +778,9 @@ to be used with GitLab. The following IPs will be used as an example:
- `10.6.0.51`: Redis - Cache Primary
- `10.6.0.52`: Redis - Cache Replica 1
- `10.6.0.53`: Redis - Cache Replica 2
-- `10.6.0.71`: Sentinel - Cache 1
-- `10.6.0.72`: Sentinel - Cache 2
-- `10.6.0.73`: Sentinel - Cache 3
-- `10.6.0.61`: Redis - Queues Primary
-- `10.6.0.62`: Redis - Queues Replica 1
-- `10.6.0.63`: Redis - Queues Replica 2
-- `10.6.0.81`: Sentinel - Queues 1
-- `10.6.0.82`: Sentinel - Queues 2
-- `10.6.0.83`: Sentinel - Queues 3
+- `10.6.0.61`: Redis - Persistent Primary
+- `10.6.0.62`: Redis - Persistent Replica 1
+- `10.6.0.63`: Redis - Persistent Replica 2
### Providing your own Redis instance
@@ -812,7 +792,7 @@ optional count argument to SPOP, which is required for [Merge Trains](../../ci/p
Note the Redis node's IP address or hostname, port, and password (if required).
These will be necessary later when configuring the [GitLab application servers](#configure-gitlab-rails).
-### Configure the Redis and Sentinel Cache cluster
+### Configure the Redis Cache cluster
This is the section where we install and set up the new Redis Cache instances.
@@ -830,8 +810,12 @@ a node and change its status from primary to replica (and vice versa).
1. Edit `/etc/gitlab/gitlab.rb` and add the contents:
```ruby
- # Specify server role as 'redis_master_role' and enable Consul agent
- roles(['redis_master_role', 'consul_role'])
+ # Specify server roles as 'redis_master_role' with sentinel and the Consul agent
+ roles ['redis_sentinel_role', 'redis_master_role', 'consul_role']
+
+ # Set IP bind address and Quorum number for Redis Sentinel service
+ sentinel['bind'] = '0.0.0.0'
+ sentinel['quorum'] = 2
# IP address pointing to a local IP that the other machines can reach to.
# You can also set bind to '0.0.0.0' which listen in all interfaces.
@@ -843,8 +827,19 @@ a node and change its status from primary to replica (and vice versa).
# machines to connect to it.
redis['port'] = 6379
- # Set up password authentication for Redis (use the same password in all nodes).
+ ## Port of primary Redis server for Sentinel, uncomment to change to non default. Defaults
+ ## to `6379`.
+ #redis['master_port'] = 6379
+
+ # Set up password authentication for Redis and replicas (use the same password in all nodes).
redis['password'] = 'REDIS_PRIMARY_PASSWORD_OF_FIRST_CLUSTER'
+ redis['master_password'] = 'REDIS_PRIMARY_PASSWORD_OF_FIRST_CLUSTER'
+
+ ## Must be the same in every Redis node
+ redis['master_name'] = 'gitlab-redis-cache'
+
+ ## The IP of this primary Redis node.
+ redis['master_ip'] = '10.6.0.51'
# Set the Redis Cache instance as an LRU
# 90% of available RAM in MB
@@ -878,10 +873,6 @@ a node and change its status from primary to replica (and vice versa).
1. [Reconfigure Omnibus GitLab](../restart_gitlab.md#omnibus-gitlab-reconfigure) for the changes to take effect.
-You can specify multiple roles, like sentinel and Redis, as:
-`roles(['redis_sentinel_role', 'redis_master_role'])`. Read more about
-[roles](https://docs.gitlab.com/omnibus/roles/).
-
#### Configure the replica Redis Cache nodes
1. SSH in to the **replica** Redis server.
@@ -889,11 +880,15 @@ You can specify multiple roles, like sentinel and Redis, as:
package of your choice. Be sure to both follow _only_ installation steps 1 and 2
on the page, and to select the correct Omnibus GitLab package, with the same version
and type (Community or Enterprise editions) as your current install.
-1. Edit `/etc/gitlab/gitlab.rb` and add the contents:
+1. Edit `/etc/gitlab/gitlab.rb` and add same contents as the primary node in the previous section replacing `redis_master_node` with `redis_replica_node`:
```ruby
- # Specify server role as 'redis_replica_role' and enable Consul agent
- roles(['redis_replica_role', 'consul_role'])
+ # Specify server roles as 'redis_sentinel_role' and 'redis_replica_role'
+ roles ['redis_sentinel_role', 'redis_replica_role', 'consul_role']
+
+ # Set IP bind address and Quorum number for Redis Sentinel service
+ sentinel['bind'] = '0.0.0.0'
+ sentinel['quorum'] = 2
# IP address pointing to a local IP that the other machines can reach to.
# You can also set bind to '0.0.0.0' which listen in all interfaces.
@@ -905,15 +900,19 @@ You can specify multiple roles, like sentinel and Redis, as:
# machines to connect to it.
redis['port'] = 6379
- # The same password for Redis authentication you set up for the primary node.
+ ## Port of primary Redis server for Sentinel, uncomment to change to non default. Defaults
+ ## to `6379`.
+ #redis['master_port'] = 6379
+
+ # Set up password authentication for Redis and replicas (use the same password in all nodes).
redis['password'] = 'REDIS_PRIMARY_PASSWORD_OF_FIRST_CLUSTER'
+ redis['master_password'] = 'REDIS_PRIMARY_PASSWORD_OF_FIRST_CLUSTER'
- # The IP of the primary Redis node.
- redis['master_ip'] = '10.6.0.51'
+ ## Must be the same in every Redis node
+ redis['master_name'] = 'gitlab-redis-cache'
- # Port of primary Redis server, uncomment to change to non default. Defaults
- # to `6379`.
- #redis['master_port'] = 6379
+ ## The IP of the primary Redis node.
+ redis['master_ip'] = '10.6.0.51'
# Set the Redis Cache instance as an LRU
# 90% of available RAM in MB
@@ -949,15 +948,6 @@ You can specify multiple roles, like sentinel and Redis, as:
1. Go through the steps again for all the other replica nodes, and
make sure to set up the IPs correctly.
-You can specify multiple roles, like sentinel and Redis, as:
-`roles(['redis_sentinel_role', 'redis_master_role'])`. Read more about
-[roles](https://docs.gitlab.com/omnibus/roles/).
-
-These values don't have to be changed again in `/etc/gitlab/gitlab.rb` after
-a failover, as the nodes will be managed by the [Sentinels](#configure-the-sentinel-cache-nodes), and even after a
-`gitlab-ctl reconfigure`, they will get their configuration restored by
-the same Sentinels.
-
Advanced [configuration options](https://docs.gitlab.com/omnibus/settings/redis.html)
are supported and can be added if needed.
@@ -967,133 +957,15 @@ are supported and can be added if needed.
</a>
</div>
-#### Configure the Sentinel Cache nodes
-
-Now that the Redis servers are all set up, let's configure the Sentinel
-servers. The following IPs will be used as an example:
-
-- `10.6.0.71`: Sentinel - Cache 1
-- `10.6.0.72`: Sentinel - Cache 2
-- `10.6.0.73`: Sentinel - Cache 3
-
-NOTE:
-If you're using an external Redis Sentinel instance, be sure to exclude the
-`requirepass` parameter from the Sentinel configuration. This parameter causes
-clients to report `NOAUTH Authentication required.`.
-[Redis Sentinel 3.2.x doesn't support password authentication](https://github.com/antirez/redis/issues/3279).
-
-To configure the Sentinel Cache server:
-
-1. SSH in to the server that will host Consul/Sentinel.
-1. [Download and install](https://about.gitlab.com/install/) the Omnibus GitLab
- package of your choice. Be sure to both follow _only_ installation steps 1 and 2
- on the page, and to select the correct Omnibus GitLab package, with the same version
- and type (Community or Enterprise editions) as your current install.
-1. Edit `/etc/gitlab/gitlab.rb` and add the contents:
-
- ```ruby
- roles(['redis_sentinel_role', 'consul_role'])
-
- ## Must be the same in every sentinel node
- redis['master_name'] = 'gitlab-redis-cache'
-
- ## The same password for Redis authentication you set up for the primary node.
- redis['master_password'] = 'REDIS_PRIMARY_PASSWORD_OF_FIRST_CLUSTER'
-
- ## The IP of the primary Redis node.
- redis['master_ip'] = '10.6.0.51'
-
- ## Define a port so Redis can listen for TCP requests which will allow other
- ## machines to connect to it.
- redis['port'] = 6379
-
- ## Port of primary Redis server, uncomment to change to non default. Defaults
- ## to `6379`.
- #redis['master_port'] = 6379
-
- ## Configure Sentinel's IP
- sentinel['bind'] = '10.6.0.71'
-
- ## Port that Sentinel listens on, uncomment to change to non default. Defaults
- ## to `26379`.
- #sentinel['port'] = 26379
-
- ## Quorum must reflect the amount of voting sentinels it take to start a failover.
- ## Value must NOT be greater then the amount of sentinels.
- ##
- ## The quorum can be used to tune Sentinel in two ways:
- ## 1. If a the quorum is set to a value smaller than the majority of Sentinels
- ## we deploy, we are basically making Sentinel more sensible to primary failures,
- ## triggering a failover as soon as even just a minority of Sentinels is no longer
- ## able to talk with the primary.
- ## 1. If a quorum is set to a value greater than the majority of Sentinels, we are
- ## making Sentinel able to failover only when there are a very large number (larger
- ## than majority) of well connected Sentinels which agree about the primary being down.s
- sentinel['quorum'] = 2
-
- ## Consider unresponsive server down after x amount of ms.
- #sentinel['down_after_milliseconds'] = 10000
-
- ## Specifies the failover timeout in milliseconds. It is used in many ways:
- ##
- ## - The time needed to re-start a failover after a previous failover was
- ## already tried against the same primary by a given Sentinel, is two
- ## times the failover timeout.
- ##
- ## - The time needed for a replica replicating to a wrong primary according
- ## to a Sentinel current configuration, to be forced to replicate
- ## with the right primary, is exactly the failover timeout (counting since
- ## the moment a Sentinel detected the misconfiguration).
- ##
- ## - The time needed to cancel a failover that is already in progress but
- ## did not produced any configuration change (REPLICAOF NO ONE yet not
- ## acknowledged by the promoted replica).
- ##
- ## - The maximum time a failover in progress waits for all the replica to be
- ## reconfigured as replicas of the new primary. However even after this time
- ## the replicas will be reconfigured by the Sentinels anyway, but not with
- ## the exact parallel-syncs progression as specified.
- #sentinel['failover_timeout'] = 60000
-
- ## Enable service discovery for Prometheus
- consul['monitoring_service_discovery'] = true
-
- ## The IPs of the Consul server nodes
- ## You can also use FQDNs and intermix them with IPs
- consul['configuration'] = {
- retry_join: %w(10.6.0.11 10.6.0.12 10.6.0.13),
- }
-
- # Set the network addresses that the exporters will listen on
- node_exporter['listen_address'] = '0.0.0.0:9100'
- redis_exporter['listen_address'] = '0.0.0.0:9121'
-
- # Prevent database migrations from running on upgrade automatically
- gitlab_rails['auto_migrate'] = false
- ```
-
-1. Copy the `/etc/gitlab/gitlab-secrets.json` file from the first Omnibus node you configured and add or replace
- the file of the same name on this server. If this is the first Omnibus node you are configuring then you can skip this step.
-
-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 Consul/Sentinel nodes, and
- make sure you set up the correct IPs.
-
-<div align="right">
- <a type="button" class="btn btn-default" href="#setup-components">
- Back to setup components <i class="fa fa-angle-double-up" aria-hidden="true"></i>
- </a>
-</div>
-
-### Configure the Redis and Sentinel Queues cluster
+### Configure the Redis Persistent cluster
-This is the section where we install and set up the new Redis Queues instances.
+This is the section where we install and set up the new Redis Persistent instances.
Both the primary and replica Redis nodes need the same password defined in
`redis['password']`. At any time during a failover, the Sentinels can reconfigure
a node and change its status from primary to replica (and vice versa).
-#### Configure the primary Redis Queues node
+#### Configure the primary Redis Persistent node
1. SSH in to the **Primary** Redis server.
1. [Download and install](https://about.gitlab.com/install/) the Omnibus GitLab
@@ -1103,8 +975,12 @@ a node and change its status from primary to replica (and vice versa).
1. Edit `/etc/gitlab/gitlab.rb` and add the contents:
```ruby
- # Specify server role as 'redis_master_role' and enable Consul agent
- roles(['redis_master_role', 'consul_role'])
+ # Specify server roles as 'redis_master_role' with Sentinel and the Consul agent
+ roles ['redis_sentinel_role', 'redis_master_role', 'consul_role']
+
+ # Set IP bind address and Quorum number for Redis Sentinel service
+ sentinel['bind'] = '0.0.0.0'
+ sentinel['quorum'] = 2
# IP address pointing to a local IP that the other machines can reach to.
# You can also set bind to '0.0.0.0' which listen in all interfaces.
@@ -1116,8 +992,19 @@ a node and change its status from primary to replica (and vice versa).
# machines to connect to it.
redis['port'] = 6379
- # Set up password authentication for Redis (use the same password in all nodes).
- redis['password'] = 'REDIS_PRIMARY_PASSWORD_OF_SECOND_CLUSTER'
+ ## Port of primary Redis server for Sentinel, uncomment to change to non default. Defaults
+ ## to `6379`.
+ #redis['master_port'] = 6379
+
+ # Set up password authentication for Redis and replicas (use the same password in all nodes).
+ redis['password'] = 'REDIS_PRIMARY_PASSWORD_OF_FIRST_CLUSTER'
+ redis['master_password'] = 'REDIS_PRIMARY_PASSWORD_OF_SECOND_CLUSTER'
+
+ ## Must be the same in every Redis node
+ redis['master_name'] = 'gitlab-redis-persistent'
+
+ ## The IP of this primary Redis node.
+ redis['master_ip'] = '10.6.0.61'
## Enable service discovery for Prometheus
consul['monitoring_service_discovery'] = true
@@ -1141,13 +1028,9 @@ a node and change its status from primary to replica (and vice versa).
1. [Reconfigure Omnibus GitLab](../restart_gitlab.md#omnibus-gitlab-reconfigure) for the changes to take effect.
-You can specify multiple roles, like sentinel and Redis, as:
-`roles(['redis_sentinel_role', 'redis_master_role'])`. Read more about
-[roles](https://docs.gitlab.com/omnibus/roles/).
-
-#### Configure the replica Redis Queues nodes
+#### Configure the replica Redis Persistent nodes
-1. SSH in to the **replica** Redis Queue server.
+1. SSH in to the **replica** Redis Persistent server.
1. [Download and install](https://about.gitlab.com/install/) the Omnibus GitLab
package of your choice. Be sure to both follow _only_ installation steps 1 and 2
on the page, and to select the correct Omnibus GitLab package, with the same version
@@ -1155,8 +1038,12 @@ You can specify multiple roles, like sentinel and Redis, as:
1. Edit `/etc/gitlab/gitlab.rb` and add the contents:
```ruby
- # Specify server role as 'redis_replica_role' and enable Consul agent
- roles(['redis_replica_role', 'consul_role'])
+ # Specify server roles as 'redis_sentinel_role' and 'redis_replica_role'
+ roles ['redis_sentinel_role', 'redis_replica_role', 'consul_role']
+
+ # Set IP bind address and Quorum number for Redis Sentinel service
+ sentinel['bind'] = '0.0.0.0'
+ sentinel['quorum'] = 2
# IP address pointing to a local IP that the other machines can reach to.
# You can also set bind to '0.0.0.0' which listen in all interfaces.
@@ -1168,16 +1055,20 @@ You can specify multiple roles, like sentinel and Redis, as:
# machines to connect to it.
redis['port'] = 6379
+ ## Port of primary Redis server for Sentinel, uncomment to change to non default. Defaults
+ ## to `6379`.
+ #redis['master_port'] = 6379
+
# The same password for Redis authentication you set up for the primary node.
redis['password'] = 'REDIS_PRIMARY_PASSWORD_OF_SECOND_CLUSTER'
+ redis['master_password'] = 'REDIS_PRIMARY_PASSWORD_OF_SECOND_CLUSTER'
+
+ ## Must be the same in every Redis node
+ redis['master_name'] = 'gitlab-redis-persistent'
# The IP of the primary Redis node.
redis['master_ip'] = '10.6.0.61'
- # Port of primary Redis server, uncomment to change to non default. Defaults
- # to `6379`.
- #redis['master_port'] = 6379
-
## Enable service discovery for Prometheus
consul['monitoring_service_discovery'] = true
@@ -1202,15 +1093,6 @@ You can specify multiple roles, like sentinel and Redis, as:
1. Go through the steps again for all the other replica nodes, and
make sure to set up the IPs correctly.
-You can specify multiple roles, like sentinel and Redis, as:
-`roles(['redis_sentinel_role', 'redis_master_role'])`. Read more about
-[roles](https://docs.gitlab.com/omnibus/roles/).
-
-These values don't have to be changed again in `/etc/gitlab/gitlab.rb` after
-a failover, as the nodes will be managed by the [Sentinels](#configure-the-sentinel-queues-nodes), and even after a
-`gitlab-ctl reconfigure`, they will get their configuration restored by
-the same Sentinels.
-
Advanced [configuration options](https://docs.gitlab.com/omnibus/settings/redis.html)
are supported and can be added if needed.
@@ -1220,129 +1102,15 @@ are supported and can be added if needed.
</a>
</div>
-#### Configure the Sentinel Queues nodes
-
-Now that the Redis servers are all set up, let's configure the Sentinel
-servers. The following IPs will be used as an example:
-
-- `10.6.0.81`: Sentinel - Queues 1
-- `10.6.0.82`: Sentinel - Queues 2
-- `10.6.0.83`: Sentinel - Queues 3
-
-NOTE:
-If you're using an external Redis Sentinel instance, be sure to exclude the
-`requirepass` parameter from the Sentinel configuration. This parameter causes
-clients to report `NOAUTH Authentication required.`.
-[Redis Sentinel 3.2.x doesn't support password authentication](https://github.com/antirez/redis/issues/3279).
-
-To configure the Sentinel Queues server:
-
-1. SSH in to the server that will host Sentinel.
-1. [Download and install](https://about.gitlab.com/install/) the Omnibus GitLab
- package of your choice. Be sure to both follow _only_ installation steps 1 and 2
- on the page, and to select the correct Omnibus GitLab package, with the same version
- and type (Community or Enterprise editions) as your current install.
-1. Edit `/etc/gitlab/gitlab.rb` and add the contents:
-
- ```ruby
- roles(['redis_sentinel_role', 'consul_role'])
-
- ## Must be the same in every sentinel node
- redis['master_name'] = 'gitlab-redis-persistent'
-
- ## The same password for Redis authentication you set up for the primary node.
- redis['master_password'] = 'REDIS_PRIMARY_PASSWORD_OF_SECOND_CLUSTER'
-
- ## The IP of the primary Redis node.
- redis['master_ip'] = '10.6.0.61'
-
- ## Define a port so Redis can listen for TCP requests which will allow other
- ## machines to connect to it.
- redis['port'] = 6379
-
- ## Port of primary Redis server, uncomment to change to non default. Defaults
- ## to `6379`.
- #redis['master_port'] = 6379
-
- ## Configure Sentinel's IP
- sentinel['bind'] = '10.6.0.81'
-
- ## Port that Sentinel listens on, uncomment to change to non default. Defaults
- ## to `26379`.
- #sentinel['port'] = 26379
-
- ## Quorum must reflect the amount of voting sentinels it take to start a failover.
- ## Value must NOT be greater then the amount of sentinels.
- ##
- ## The quorum can be used to tune Sentinel in two ways:
- ## 1. If a the quorum is set to a value smaller than the majority of Sentinels
- ## we deploy, we are basically making Sentinel more sensible to primary failures,
- ## triggering a failover as soon as even just a minority of Sentinels is no longer
- ## able to talk with the primary.
- ## 1. If a quorum is set to a value greater than the majority of Sentinels, we are
- ## making Sentinel able to failover only when there are a very large number (larger
- ## than majority) of well connected Sentinels which agree about the primary being down.s
- sentinel['quorum'] = 2
-
- ## Consider unresponsive server down after x amount of ms.
- #sentinel['down_after_milliseconds'] = 10000
-
- ## Specifies the failover timeout in milliseconds. It is used in many ways:
- ##
- ## - The time needed to re-start a failover after a previous failover was
- ## already tried against the same primary by a given Sentinel, is two
- ## times the failover timeout.
- ##
- ## - The time needed for a replica replicating to a wrong primary according
- ## to a Sentinel current configuration, to be forced to replicate
- ## with the right primary, is exactly the failover timeout (counting since
- ## the moment a Sentinel detected the misconfiguration).
- ##
- ## - The time needed to cancel a failover that is already in progress but
- ## did not produced any configuration change (REPLICAOF NO ONE yet not
- ## acknowledged by the promoted replica).
- ##
- ## - The maximum time a failover in progress waits for all the replica to be
- ## reconfigured as replicas of the new primary. However even after this time
- ## the replicas will be reconfigured by the Sentinels anyway, but not with
- ## the exact parallel-syncs progression as specified.
- #sentinel['failover_timeout'] = 60000
-
- ## Enable service discovery for Prometheus
- consul['monitoring_service_discovery'] = true
-
- ## The IPs of the Consul server nodes
- ## You can also use FQDNs and intermix them with IPs
- consul['configuration'] = {
- retry_join: %w(10.6.0.11 10.6.0.12 10.6.0.13),
- }
-
- # Set the network addresses that the exporters will listen on
- node_exporter['listen_address'] = '0.0.0.0:9100'
- redis_exporter['listen_address'] = '0.0.0.0:9121'
-
- # Prevent database migrations from running on upgrade automatically
- gitlab_rails['auto_migrate'] = false
- ```
-
-1. Copy the `/etc/gitlab/gitlab-secrets.json` file from the first Omnibus node you configured and add or replace
- the file of the same name on this server. If this is the first Omnibus node you are configuring then you can skip this step.
-
-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 Sentinel nodes, and
- make sure you set up the correct IPs.
-
-<div align="right">
- <a type="button" class="btn btn-default" href="#setup-components">
- Back to setup components <i class="fa fa-angle-double-up" aria-hidden="true"></i>
- </a>
-</div>
-
## Configure Gitaly Cluster
[Gitaly Cluster](../gitaly/praefect.md) is a GitLab provided and recommended fault tolerant solution for storing Git repositories.
In this configuration, every Git repository is stored on every Gitaly node in the cluster, with one being designated the primary, and failover occurs automatically if the primary node goes down.
+NOTE:
+Gitaly Cluster provides the benefits of fault tolerance, but comes with additional complexity of setup and management. Please [review the existing technical limitations and considerations prior to deploying Gitaly Cluster](../gitaly/index.md#guidance-regarding-gitaly-cluster).
+For implementations with Gitaly Sharded, the same Gitaly specs should be used. Follow the [separate Gitaly documentation](../gitaly/configure_gitaly.md) instead of this section.
+
The recommended cluster setup includes the following components:
- 3 Gitaly nodes: Replicated storage of Git repositories.
@@ -1509,7 +1277,7 @@ the details of each Gitaly node that makes up the cluster. Each storage is also
and this name is used in several areas of the configuration. In this guide, the name of the storage will be
`default`. Also, this guide is geared towards new installs, if upgrading an existing environment
to use Gitaly Cluster, you may need to use a different name.
-Refer to the [Praefect documentation](../gitaly/praefect.md#praefect) for more info.
+Refer to the [Praefect documentation](../gitaly/praefect.md#praefect) for more information.
The following IPs will be used as an example:
@@ -1836,7 +1604,7 @@ To configure the Sidekiq nodes, on each one:
1. [Download and install](https://about.gitlab.com/install/) the Omnibus GitLab
package of your choice. Be sure to follow _only_ installation steps 1 and 2
on the page.
-1. Open `/etc/gitlab/gitlab.rb` with your editor:
+1. Create or edit `/etc/gitlab/gitlab.rb` and use the following configuration:
```ruby
# Avoid running unnecessary services on the Sidekiq server
@@ -1851,36 +1619,40 @@ To configure the Sidekiq nodes, on each one:
gitlab_exporter['enable'] = false
nginx['enable'] = false
+ # External URL
+ ## This should match the URL of the external load balancer
+ external_url 'https://gitlab.example.com'
+
# Redis
## Redis connection details
## First cluster that will host the cache
gitlab_rails['redis_cache_instance'] = 'redis://:<REDIS_PRIMARY_PASSWORD_OF_FIRST_CLUSTER>@gitlab-redis-cache'
gitlab_rails['redis_cache_sentinels'] = [
- {host: '10.6.0.71', port: 26379},
- {host: '10.6.0.72', port: 26379},
- {host: '10.6.0.73', port: 26379},
+ {host: '10.6.0.51', port: 26379},
+ {host: '10.6.0.52', port: 26379},
+ {host: '10.6.0.53', port: 26379},
]
- ## Second cluster that will host the queues, shared state, and actioncable
+ ## 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'
gitlab_rails['redis_queues_sentinels'] = [
- {host: '10.6.0.81', port: 26379},
- {host: '10.6.0.82', port: 26379},
- {host: '10.6.0.83', port: 26379},
+ {host: '10.6.0.61', port: 26379},
+ {host: '10.6.0.62', port: 26379},
+ {host: '10.6.0.63', port: 26379},
]
gitlab_rails['redis_shared_state_sentinels'] = [
- {host: '10.6.0.81', port: 26379},
- {host: '10.6.0.82', port: 26379},
- {host: '10.6.0.83', port: 26379},
+ {host: '10.6.0.61', port: 26379},
+ {host: '10.6.0.62', port: 26379},
+ {host: '10.6.0.63', port: 26379},
]
gitlab_rails['redis_actioncable_sentinels'] = [
- {host: '10.6.0.81', port: 26379},
- {host: '10.6.0.82', port: 26379},
- {host: '10.6.0.83', port: 26379},
+ {host: '10.6.0.61', port: 26379},
+ {host: '10.6.0.62', port: 26379},
+ {host: '10.6.0.63', port: 26379},
]
# Gitaly Cluster
@@ -2032,30 +1804,30 @@ On each node perform the following:
gitlab_rails['redis_cache_instance'] = 'redis://:<REDIS_PRIMARY_PASSWORD_OF_FIRST_CLUSTER>@gitlab-redis-cache'
gitlab_rails['redis_cache_sentinels'] = [
- {host: '10.6.0.71', port: 26379},
- {host: '10.6.0.72', port: 26379},
- {host: '10.6.0.73', port: 26379},
+ {host: '10.6.0.51', port: 26379},
+ {host: '10.6.0.52', port: 26379},
+ {host: '10.6.0.53', port: 26379},
]
- ## Second cluster that will host the queues, shared state, and actionable
+ ## Second cluster that will host the persistent queues, shared state, and actionable
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'
gitlab_rails['redis_queues_sentinels'] = [
- {host: '10.6.0.81', port: 26379},
- {host: '10.6.0.82', port: 26379},
- {host: '10.6.0.83', port: 26379},
+ {host: '10.6.0.61', port: 26379},
+ {host: '10.6.0.62', port: 26379},
+ {host: '10.6.0.63', port: 26379},
]
gitlab_rails['redis_shared_state_sentinels'] = [
- {host: '10.6.0.81', port: 26379},
- {host: '10.6.0.82', port: 26379},
- {host: '10.6.0.83', port: 26379},
+ {host: '10.6.0.61', port: 26379},
+ {host: '10.6.0.62', port: 26379},
+ {host: '10.6.0.63', port: 26379},
]
gitlab_rails['redis_actioncable_sentinels'] = [
- {host: '10.6.0.81', port: 26379},
- {host: '10.6.0.82', port: 26379},
- {host: '10.6.0.83', port: 26379},
+ {host: '10.6.0.61', port: 26379},
+ {host: '10.6.0.62', port: 26379},
+ {host: '10.6.0.63', port: 26379},
]
# Set the network addresses that the exporters used for monitoring will listen on
@@ -2127,7 +1899,7 @@ On each node perform the following:
1. [Reconfigure GitLab](../restart_gitlab.md#omnibus-gitlab-reconfigure) for the changes to take effect.
-1. If you're [using NFS](#configure-nfs-optional):
+1. If you're [using NFS](#configure-nfs):
1. If necessary, install the NFS client utility packages using the following
commands:
@@ -2271,7 +2043,7 @@ To configure the Monitoring node:
## Configure the object storage
GitLab supports using an object storage service for holding numerous types of data.
-It's recommended over [NFS](#configure-nfs-optional) and in general it's better
+It's recommended over [NFS](#configure-nfs) and in general it's better
in larger setups as object storage is typically much more performant, reliable,
and scalable.
@@ -2295,6 +2067,9 @@ There are two ways of specifying object storage configuration in GitLab:
Starting with GitLab 13.2, consolidated object storage configuration is available. It simplifies your GitLab configuration since the connection details are shared across object types. Refer to [Consolidated object storage configuration](../object_storage.md#consolidated-object-storage-configuration) guide for instructions on how to set it up.
+GitLab Runner returns job logs in chunks which Omnibus GitLab caches temporarily on disk in `/var/opt/gitlab/gitlab-ci/builds` by default, even when using consolidated object storage. With default configuration, this directory needs to be shared via NFS on any GitLab Rails and Sidekiq nodes.
+In GitLab 13.6 and later, it's recommended to switch to [Incremental logging](../job_logs.md#incremental-logging-architecture), which uses Redis instead of disk space for temporary caching of job logs.
+
For configuring object storage in GitLab 13.1 and earlier, or for storage types not
supported by consolidated configuration form, refer to the following guides based
on what features you intend to use:
@@ -2341,7 +2116,7 @@ cluster alongside your instance, read how to
</a>
</div>
-## Configure NFS (optional)
+## Configure NFS
[Object storage](#configure-the-object-storage), along with [Gitaly](#configure-gitaly)
are recommended over NFS wherever possible for improved performance. If you intend
@@ -2355,7 +2130,7 @@ unavailable from GitLab 15.0. No further enhancements are planned for this featu
Read:
-- The [Gitaly and NFS deprecation notice](../gitaly/index.md#nfs-deprecation-notice).
+- [Gitaly and NFS Deprecation](../nfs.md#gitaly-and-nfs-deprecation).
- About the [correct mount options to use](../nfs.md#upgrade-to-gitaly-cluster-or-disable-caching-if-experiencing-data-loss).
<div align="right">
@@ -2415,12 +2190,10 @@ services where applicable):
| PostgreSQL<sup>1</sup> | 3 | 8 vCPU, 30 GB memory | `n1-standard-8` |
| PgBouncer<sup>1</sup> | 3 | 2 vCPU, 1.8 GB memory | `n1-highcpu-2` |
| Internal load balancing node<sup>3</sup> | 1 | 2 vCPU, 1.8 GB memory | `n1-highcpu-2` |
-| Redis - Cache<sup>2</sup> | 3 | 4 vCPU, 15 GB memory | `n1-standard-4` |
-| Redis - Queues / Shared State<sup>2</sup> | 3 | 4 vCPU, 15 GB memory | `n1-standard-4` |
-| Redis Sentinel - Cache<sup>2</sup> | 3 | 1 vCPU, 3.75 GB memory | `n1-standard-1` |
-| Redis Sentinel - Queues / Shared State<sup>2</sup> | 3 | 1 vCPU, 3.75 GB memory | `n1-standard-1` |
-| Gitaly | 3 | 16 vCPU, 60 GB memory | `n1-standard-16` |
-| Praefect | 3 | 2 vCPU, 1.8 GB memory | `n1-highcpu-2` |
+| Redis/Sentinel - Cache<sup>2</sup> | 3 | 4 vCPU, 15 GB memory | `n1-standard-4` |
+| Redis/Sentinel - Persistent<sup>2</sup> | 3 | 4 vCPU, 15 GB memory | `n1-standard-4` |
+| Gitaly<sup>5</sup> | 3 | 16 vCPU, 60 GB memory | `n1-standard-16` |
+| Praefect<sup>5</sup> | 3 | 2 vCPU, 1.8 GB memory | `n1-highcpu-2` |
| Praefect PostgreSQL<sup>1</sup> | 1+ | 2 vCPU, 1.8 GB memory | `n1-highcpu-2` |
| Object storage<sup>4</sup> | n/a | n/a | n/a |
@@ -2430,6 +2203,7 @@ services where applicable):
2. Can be optionally run on reputable third-party external PaaS Redis solutions. Google Memorystore and AWS Elasticache are known to work.
3. Can be optionally run on reputable third-party load balancing services (LB PaaS). AWS ELB is known to work.
4. Should be run on reputable third-party object storage (storage PaaS) for cloud implementations. Google Cloud Storage and AWS S3 are known to work.
+5. Gitaly Cluster provides the benefits of fault tolerance, but comes with additional complexity of setup and management. Please [review the existing technical limitations and considerations prior to deploying Gitaly Cluster](../gitaly/index.md#guidance-regarding-gitaly-cluster). If Gitaly Sharded is desired, the same specs listed above for `Gitaly` should be used.
<!-- markdownlint-enable MD029 -->
NOTE:
@@ -2474,11 +2248,6 @@ card "Database" as database {
card "redis" as redis {
collections "**Redis Persistent** x3" as redis_persistent #FF6347
collections "**Redis Cache** x3" as redis_cache #FF6347
- collections "**Redis Persistent Sentinel** x3" as redis_persistent_sentinel #FF6347
- collections "**Redis Cache Sentinel** x3"as redis_cache_sentinel #FF6347
-
- redis_persistent <.[#FF6347]- redis_persistent_sentinel
- redis_cache <.[#FF6347]- redis_cache_sentinel
}
cloud "**Object Storage**" as object_storage #white
diff --git a/doc/administration/reference_architectures/1k_users.md b/doc/administration/reference_architectures/1k_users.md
index ea40e150e58..ae832c2226f 100644
--- a/doc/administration/reference_architectures/1k_users.md
+++ b/doc/administration/reference_architectures/1k_users.md
@@ -18,6 +18,8 @@ many organizations.
> - **Supported users (approximate):** 1,000
> - **High Availability:** No. For a highly-available environment, you can
> follow a modified [3K reference architecture](3k_users.md#supported-modifications-for-lower-user-counts-ha).
+> - **Cloud Native Hybrid:** No. For a cloud native hybrid environment, you
+> can follow a [modified hybrid reference architecture](#cloud-native-hybrid-reference-architecture-with-helm-charts).
> - **Test requests per second (RPS) rates:** API: 20 RPS, Web: 2 RPS, Git (Pull): 2 RPS, Git (Push): 1 RPS
> - **[Latest 1k weekly performance testing results](https://gitlab.com/gitlab-org/quality/performance/-/wikis/Benchmarks/Latest/1k)**
@@ -58,3 +60,12 @@ Elasticsearch cluster design and requirements are dependent on your specific
data. For recommended best practices about how to set up your Elasticsearch
cluster alongside your instance, read how to
[choose the optimal cluster configuration](../../integration/elasticsearch.md#guidance-on-choosing-optimal-cluster-configuration).
+
+## Cloud Native Hybrid reference architecture with Helm Charts
+
+Cloud Native Hybrid Reference Architecture is an alternative approach where select _stateless_
+components are deployed in Kubernetes via our official [Helm Charts](https://docs.gitlab.com/charts/),
+and _stateful_ components are deployed in compute VMs with Omnibus.
+
+The [2k GitLab Cloud Native Hybrid](2k_users.md#cloud-native-hybrid-reference-architecture-with-helm-charts-alternative) (non HA) and [3k GitLab Cloud Native Hybrid](3k_users.md#cloud-native-hybrid-reference-architecture-with-helm-charts-alternative) (HA) reference architectures are the smallest we recommend in Kubernetes.
+For environments that need to serve less users, you can lower the node specs. Depending on your user count, you can lower all suggested node specs as desired. However, it's recommended that you don't go lower than the [general requirements](../../install/requirements.md).
diff --git a/doc/administration/reference_architectures/25k_users.md b/doc/administration/reference_architectures/25k_users.md
index f500434d75b..267f81efd91 100644
--- a/doc/administration/reference_architectures/25k_users.md
+++ b/doc/administration/reference_architectures/25k_users.md
@@ -12,6 +12,7 @@ full list of reference architectures, see
> - **Supported users (approximate):** 25,000
> - **High Availability:** Yes ([Praefect](#configure-praefect-postgresql) needs a third-party PostgreSQL solution for HA)
+> - **Cloud Native Hybrid:** [Yes](#cloud-native-hybrid-reference-architecture-with-helm-charts-alternative)
> - **Test requests per second (RPS) rates:** API: 500 RPS, Web: 50 RPS, Git (Pull): 50 RPS, Git (Push): 10 RPS
> - **[Latest 25k weekly performance testing results](https://gitlab.com/gitlab-org/quality/performance/-/wikis/Benchmarks/Latest/25k)**
@@ -22,18 +23,16 @@ full list of reference architectures, see
| PostgreSQL<sup>1</sup> | 3 | 16 vCPU, 60 GB memory | `n1-standard-16` | `m5.4xlarge` | `D16s v3` |
| PgBouncer<sup>1</sup> | 3 | 2 vCPU, 1.8 GB memory | `n1-highcpu-2` | `c5.large` | `F2s v2` |
| Internal load balancing node<sup>3</sup> | 1 | 4 vCPU, 3.6GB memory | `n1-highcpu-4` | `c5.large` | `F2s v2` |
-| Redis - Cache<sup>2</sup> | 3 | 4 vCPU, 15 GB memory | `n1-standard-4` | `m5.xlarge` | `D4s v3` |
-| Redis - Queues / Shared State<sup>2</sup> | 3 | 4 vCPU, 15 GB memory | `n1-standard-4` | `m5.xlarge` | `D4s v3` |
-| Redis Sentinel - Cache<sup>2</sup> | 3 | 1 vCPU, 3.75 GB memory | `n1-standard-1` | `c5.large` | `A1 v2` |
-| Redis Sentinel - Queues / Shared State<sup>2</sup>| 3 | 1 vCPU, 3.75 GB memory | `n1-standard-1` | `c5.large` | `A1 v2` |
-| Gitaly | 3 | 32 vCPU, 120 GB memory | `n1-standard-32` | `m5.8xlarge` | `D32s v3` |
-| Praefect | 3 | 4 vCPU, 3.6 GB memory | `n1-highcpu-4` | `c5.xlarge` | `F4s v2` |
+| Redis/Sentinel - Cache<sup>2</sup> | 3 | 4 vCPU, 15 GB memory | `n1-standard-4` | `m5.xlarge` | `D4s v3` |
+| Redis/Sentinel - Persistent<sup>2</sup> | 3 | 4 vCPU, 15 GB memory | `n1-standard-4` | `m5.large` | `D4s v3` |
+| Gitaly<sup>5</sup> | 3 | 32 vCPU, 120 GB memory | `n1-standard-32` | `m5.8xlarge` | `D32s v3` |
+| Praefect<sup>5</sup> | 3 | 4 vCPU, 3.6 GB memory | `n1-highcpu-4` | `c5.xlarge` | `F4s v2` |
| Praefect PostgreSQL<sup>1</sup> | 1+ | 2 vCPU, 1.8 GB memory | `n1-highcpu-2` | `c5.large` | `F2s v2` |
| Sidekiq | 4 | 4 vCPU, 15 GB memory | `n1-standard-4` | `m5.xlarge` | `D4s v3` |
| GitLab Rails | 5 | 32 vCPU, 28.8 GB memory | `n1-highcpu-32` | `c5.9xlarge` | `F32s v2` |
| Monitoring node | 1 | 4 vCPU, 3.6 GB memory | `n1-highcpu-4` | `c5.xlarge` | `F4s v2` |
| Object storage<sup>4</sup> | n/a | n/a | n/a | n/a | n/a |
-| NFS server (optional, not recommended) | 1 | 4 vCPU, 3.6 GB memory | `n1-highcpu-4` | `c5.xlarge` | `F4s v2` |
+| NFS server (non-Gitaly) | 1 | 4 vCPU, 3.6 GB memory | `n1-highcpu-4` | `c5.xlarge` | `F4s v2` |
<!-- Disable ordered list rule https://github.com/DavidAnson/markdownlint/blob/main/doc/Rules.md#md029---ordered-list-item-prefix -->
<!-- markdownlint-disable MD029 -->
@@ -41,6 +40,7 @@ full list of reference architectures, see
2. Can be optionally run on reputable third-party external PaaS Redis solutions. Google Memorystore and AWS Elasticache are known to work.
3. Can be optionally run on reputable third-party load balancing services (LB PaaS). AWS ELB is known to work.
4. Should be run on reputable third-party object storage (storage PaaS) for cloud implementations. Google Cloud Storage and AWS S3 are known to work.
+5. Gitaly Cluster provides the benefits of fault tolerance, but comes with additional complexity of setup and management. Please [review the existing technical limitations and considerations prior to deploying Gitaly Cluster](../gitaly/index.md#guidance-regarding-gitaly-cluster). If Gitaly Sharded is desired, the same specs listed above for `Gitaly` should be used.
<!-- markdownlint-enable MD029 -->
NOTE:
@@ -82,11 +82,6 @@ card "Database" as database {
card "redis" as redis {
collections "**Redis Persistent** x3" as redis_persistent #FF6347
collections "**Redis Cache** x3" as redis_cache #FF6347
- collections "**Redis Persistent Sentinel** x3" as redis_persistent_sentinel #FF6347
- collections "**Redis Cache Sentinel** x3"as redis_cache_sentinel #FF6347
-
- redis_persistent <.[#FF6347]- redis_persistent_sentinel
- redis_cache <.[#FF6347]- redis_cache_sentinel
}
cloud "**Object Storage**" as object_storage #white
@@ -137,8 +132,7 @@ our [Sysbench](https://github.com/akopytov/sysbench)-based
Due to better performance and availability, for data objects (such as LFS,
uploads, or artifacts), using an [object storage service](#configure-the-object-storage)
-is recommended instead of using NFS. Using an object storage service also
-doesn't require you to provision and maintain a node.
+is recommended.
It's also worth noting that at this time [Praefect requires its own database server](../gitaly/praefect.md#postgresql) and
that to achieve full High Availability a third-party PostgreSQL database solution will be required.
@@ -169,10 +163,9 @@ To set up GitLab and its components to accommodate up to 25,000 users:
used for shared data objects.
1. [Configure Advanced Search](#configure-advanced-search) (optional) for faster,
more advanced code search across your entire GitLab instance.
-1. [Configure NFS](#configure-nfs-optional) (optional, and not recommended)
- to have shared disk storage service as an alternative to Gitaly or object
- storage. You can skip this step if you're not using GitLab Pages (which
- requires NFS).
+1. [Configure NFS](#configure-nfs)
+ to have shared disk storage service for certain GitLab operations (non
+ Gitaly or Object Storage).
The servers start on the same 10.6.0.0/24 private network range, and can
connect to each other freely on these addresses.
@@ -193,15 +186,9 @@ The following list includes descriptions of each server and its assigned IP:
- `10.6.0.51`: Redis - Cache Primary
- `10.6.0.52`: Redis - Cache Replica 1
- `10.6.0.53`: Redis - Cache Replica 2
-- `10.6.0.71`: Sentinel - Cache 1
-- `10.6.0.72`: Sentinel - Cache 2
-- `10.6.0.73`: Sentinel - Cache 3
-- `10.6.0.61`: Redis - Queues Primary
-- `10.6.0.62`: Redis - Queues Replica 1
-- `10.6.0.63`: Redis - Queues Replica 2
-- `10.6.0.81`: Sentinel - Queues 1
-- `10.6.0.82`: Sentinel - Queues 2
-- `10.6.0.83`: Sentinel - Queues 3
+- `10.6.0.61`: Redis - Persistent Primary
+- `10.6.0.62`: Redis - Persistent Replica 1
+- `10.6.0.63`: Redis - Persistent Replica 2
- `10.6.0.91`: Gitaly 1
- `10.6.0.92`: Gitaly 2
- `10.6.0.93`: Gitaly 3
@@ -794,15 +781,9 @@ to be used with GitLab. The following IPs will be used as an example:
- `10.6.0.51`: Redis - Cache Primary
- `10.6.0.52`: Redis - Cache Replica 1
- `10.6.0.53`: Redis - Cache Replica 2
-- `10.6.0.71`: Sentinel - Cache 1
-- `10.6.0.72`: Sentinel - Cache 2
-- `10.6.0.73`: Sentinel - Cache 3
-- `10.6.0.61`: Redis - Queues Primary
-- `10.6.0.62`: Redis - Queues Replica 1
-- `10.6.0.63`: Redis - Queues Replica 2
-- `10.6.0.81`: Sentinel - Queues 1
-- `10.6.0.82`: Sentinel - Queues 2
-- `10.6.0.83`: Sentinel - Queues 3
+- `10.6.0.61`: Redis - Persistent Primary
+- `10.6.0.62`: Redis - Persistent Replica 1
+- `10.6.0.63`: Redis - Persistent Replica 2
### Providing your own Redis instance
@@ -814,7 +795,7 @@ optional count argument to SPOP, which is required for [Merge Trains](../../ci/p
Note the Redis node's IP address or hostname, port, and password (if required).
These will be necessary later when configuring the [GitLab application servers](#configure-gitlab-rails).
-### Configure the Redis and Sentinel Cache cluster
+### Configure the Redis Cache cluster
This is the section where we install and set up the new Redis Cache instances.
@@ -832,10 +813,14 @@ a node and change its status from primary to replica (and vice versa).
1. Edit `/etc/gitlab/gitlab.rb` and add the contents:
```ruby
- # Specify server role as 'redis_master_role' and enable Consul agent
- roles(['redis_master_role', 'consul_role']
+ # Specify server role as 'redis_sentinel_role' 'redis_master_role'
+ roles ['redis_sentinel_role', 'redis_master_role', 'consul_role']
- # IP address pointing to a local IP that the other machines can reach to.
+ # Set IP bind address and Quorum number for Redis Sentinel service
+ sentinel['bind'] = '0.0.0.0'
+ sentinel['quorum'] = 2
+
+ # IP address pointing to a local IP that the other machines can reach.
# You can also set bind to '0.0.0.0' which listen in all interfaces.
# If you really need to bind to an external accessible IP, make
# sure you add extra firewall rules to prevent unauthorized access.
@@ -845,8 +830,18 @@ a node and change its status from primary to replica (and vice versa).
# machines to connect to it.
redis['port'] = 6379
+ # Port of primary Redis server for Sentinel, uncomment to change to non default.
+ # Defaults to `6379`.
+ # redis['master_port'] = 6379
+
# Set up password authentication for Redis (use the same password in all nodes).
- redis['password'] = 'REDIS_PRIMARY_PASSWORD_OF_FIRST_CLUSTER'
+ redis['master_password'] = 'REDIS_PRIMARY_PASSWORD_OF_FIRST_CLUSTER'
+
+ # Must be the same in every Redis node.
+ redis['master_name'] = 'gitlab-redis-cache'
+
+ # The IP of this primary Redis node.
+ redis['master_ip'] = '10.6.0.51'
# Set the Redis Cache instance as an LRU
# 90% of available RAM in MB
@@ -880,10 +875,6 @@ a node and change its status from primary to replica (and vice versa).
1. [Reconfigure Omnibus GitLab](../restart_gitlab.md#omnibus-gitlab-reconfigure) for the changes to take effect.
-You can specify multiple roles, like sentinel and Redis, as:
-`roles(['redis_sentinel_role', 'redis_master_role'])`. Read more about
-[roles](https://docs.gitlab.com/omnibus/roles/).
-
#### Configure the replica Redis Cache nodes
1. SSH in to the **replica** Redis server.
@@ -891,14 +882,18 @@ You can specify multiple roles, like sentinel and Redis, as:
package of your choice. Be sure to both follow _only_ installation steps 1 and 2
on the page, and to select the correct Omnibus GitLab package, with the same version
and type (Community or Enterprise editions) as your current install.
-1. Edit `/etc/gitlab/gitlab.rb` and add the contents:
+1. Edit `/etc/gitlab/gitlab.rb` and add the same contents as the primary node in the previous section replacing `redis_master_node` with `redis_replica_node`:
```ruby
# Specify server role as 'redis_replica_role' and enable Consul agent
- roles(['redis_replica_role', 'consul_role']
+ roles ['redis_sentinel_role', 'redis_replica_role', 'consul_role']
- # IP address pointing to a local IP that the other machines can reach to.
- # You can also set bind to '0.0.0.0' which listen in all interfaces.
+ # Set IP bind address and Quorum number for Redis Sentinel service
+ sentinel['bind'] = `0.0.0.0`
+ sentinel['quorum'] = 2
+
+ # IP address pointing to a local IP that the other machines can reach.
+ # Set bind to '0.0.0.0' to listen on all interfaces.
# If you really need to bind to an external accessible IP, make
# sure you add extra firewall rules to prevent unauthorized access.
redis['bind'] = '10.6.0.52'
@@ -907,16 +902,19 @@ You can specify multiple roles, like sentinel and Redis, as:
# machines to connect to it.
redis['port'] = 6379
- # The same password for Redis authentication you set up for the primary node.
- redis['password'] = 'REDIS_PRIMARY_PASSWORD_OF_FIRST_CLUSTER'
+ ## Port of primary Redis server for Sentinel, uncomment to change to non default. Defaults
+ ## to `6379`.
+ #redis['master_port'] = 6379
+
+ # Set up password authentication for Redis and replicas (use the same password in all nodes).
+ redis['master_password'] = 'REDIS_PRIMARY_PASSWORD_OF_FIRST_CLUSTER'
+
+ # Must be the same in every Redis node
+ redis['master_name'] = 'gitlab-redis-cache'
# The IP of the primary Redis node.
redis['master_ip'] = '10.6.0.51'
- # Port of primary Redis server, uncomment to change to non default. Defaults
- # to `6379`.
- #redis['master_port'] = 6379
-
# Set the Redis Cache instance as an LRU
# 90% of available RAM in MB
redis['maxmemory'] = '13500mb'
@@ -952,17 +950,7 @@ You can specify multiple roles, like sentinel and Redis, as:
1. Go through the steps again for all the other replica nodes, and
make sure to set up the IPs correctly.
-You can specify multiple roles, like sentinel and Redis, as:
-`roles(['redis_sentinel_role', 'redis_master_role'])`. Read more about
-[roles](https://docs.gitlab.com/omnibus/roles/).
-
-These values don't have to be changed again in `/etc/gitlab/gitlab.rb` after
-a failover, as the nodes will be managed by the [Sentinels](#configure-the-sentinel-cache-nodes), and even after a
-`gitlab-ctl reconfigure`, they will get their configuration restored by
-the same Sentinels.
-
-Advanced [configuration options](https://docs.gitlab.com/omnibus/settings/redis.html)
-are supported and can be added if needed.
+ Advanced [configuration options](https://docs.gitlab.com/omnibus/settings/redis.html) are supported and can be added if needed.
<div align="right">
<a type="button" class="btn btn-default" href="#setup-components">
@@ -970,134 +958,15 @@ are supported and can be added if needed.
</a>
</div>
-#### Configure the Sentinel Cache nodes
-
-Now that the Redis servers are all set up, let's configure the Sentinel
-servers. The following IPs will be used as an example:
-
-- `10.6.0.71`: Sentinel - Cache 1
-- `10.6.0.72`: Sentinel - Cache 2
-- `10.6.0.73`: Sentinel - Cache 3
-
-NOTE:
-If you're using an external Redis Sentinel instance, be sure to exclude the
-`requirepass` parameter from the Sentinel configuration. This parameter causes
-clients to report `NOAUTH Authentication required.`.
-[Redis Sentinel 3.2.x doesn't support password authentication](https://github.com/antirez/redis/issues/3279).
-
-To configure the Sentinel Cache server:
+### Configure the Redis Persistent cluster
-1. SSH in to the server that will host Consul/Sentinel.
-1. [Download and install](https://about.gitlab.com/install/) the Omnibus GitLab
- package of your choice. Be sure to both follow _only_ installation steps 1 and 2
- on the page, and to select the correct Omnibus GitLab package, with the same version
- and type (Community or Enterprise editions) as your current install.
-1. Edit `/etc/gitlab/gitlab.rb` and add the contents:
-
- ```ruby
- roles(['redis_sentinel_role', 'consul_role'])
-
- ## Must be the same in every sentinel node
- redis['master_name'] = 'gitlab-redis-cache'
-
- ## The same password for Redis authentication you set up for the primary node.
- redis['master_password'] = 'REDIS_PRIMARY_PASSWORD_OF_FIRST_CLUSTER'
-
- ## The IP of the primary Redis node.
- redis['master_ip'] = '10.6.0.51'
-
- ## Define a port so Redis can listen for TCP requests which will allow other
- ## machines to connect to it.
- redis['port'] = 6379
-
- ## Port of primary Redis server, uncomment to change to non default. Defaults
- ## to `6379`.
- #redis['master_port'] = 6379
-
- ## Configure Sentinel's IP
- sentinel['bind'] = '10.6.0.71'
-
- ## Port that Sentinel listens on, uncomment to change to non default. Defaults
- ## to `26379`.
- #sentinel['port'] = 26379
-
- ## Quorum must reflect the amount of voting sentinels it take to start a failover.
- ## Value must NOT be greater then the amount of sentinels.
- ##
- ## The quorum can be used to tune Sentinel in two ways:
- ## 1. If a the quorum is set to a value smaller than the majority of Sentinels
- ## we deploy, we are basically making Sentinel more sensible to primary failures,
- ## triggering a failover as soon as even just a minority of Sentinels is no longer
- ## able to talk with the primary.
- ## 1. If a quorum is set to a value greater than the majority of Sentinels, we are
- ## making Sentinel able to failover only when there are a very large number (larger
- ## than majority) of well connected Sentinels which agree about the primary being down.s
- sentinel['quorum'] = 2
-
- ## Consider unresponsive server down after x amount of ms.
- #sentinel['down_after_milliseconds'] = 10000
-
- ## Specifies the failover timeout in milliseconds. It is used in many ways:
- ##
- ## - The time needed to re-start a failover after a previous failover was
- ## already tried against the same primary by a given Sentinel, is two
- ## times the failover timeout.
- ##
- ## - The time needed for a replica replicating to a wrong primary according
- ## to a Sentinel current configuration, to be forced to replicate
- ## with the right primary, is exactly the failover timeout (counting since
- ## the moment a Sentinel detected the misconfiguration).
- ##
- ## - The time needed to cancel a failover that is already in progress but
- ## did not produced any configuration change (REPLICAOF NO ONE yet not
- ## acknowledged by the promoted replica).
- ##
- ## - The maximum time a failover in progress waits for all the replica to be
- ## reconfigured as replicas of the new primary. However even after this time
- ## the replicas will be reconfigured by the Sentinels anyway, but not with
- ## the exact parallel-syncs progression as specified.
- #sentinel['failover_timeout'] = 60000
-
- ## Enable service discovery for Prometheus
- consul['monitoring_service_discovery'] = true
-
- ## The IPs of the Consul server nodes
- ## You can also use FQDNs and intermix them with IPs
- consul['configuration'] = {
- retry_join: %w(10.6.0.11 10.6.0.12 10.6.0.13),
- }
-
- # Set the network addresses that the exporters will listen on
- node_exporter['listen_address'] = '0.0.0.0:9100'
- redis_exporter['listen_address'] = '0.0.0.0:9121'
-
- # Prevent database migrations from running on upgrade automatically
- gitlab_rails['auto_migrate'] = false
- ```
-
-1. Copy the `/etc/gitlab/gitlab-secrets.json` file from the first Omnibus node you configured and add or replace
- the file of the same name on this server. If this is the first Omnibus node you are configuring then you can skip this step.
-
-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 Consul/Sentinel nodes, and
- make sure you set up the correct IPs.
-
-<div align="right">
- <a type="button" class="btn btn-default" href="#setup-components">
- Back to setup components <i class="fa fa-angle-double-up" aria-hidden="true"></i>
- </a>
-</div>
-
-### Configure the Redis and Sentinel Queues cluster
-
-This is the section where we install and set up the new Redis Queues instances.
+This is the section where we install and set up the new Redis Persistent instances.
Both the primary and replica Redis nodes need the same password defined in
`redis['password']`. At any time during a failover, the Sentinels can reconfigure
a node and change its status from primary to replica (and vice versa).
-#### Configure the primary Redis Queues node
+#### Configure the primary Redis Persistent node
1. SSH in to the **Primary** Redis server.
1. [Download and install](https://about.gitlab.com/install/) the Omnibus GitLab
@@ -1107,8 +976,12 @@ a node and change its status from primary to replica (and vice versa).
1. Edit `/etc/gitlab/gitlab.rb` and add the contents:
```ruby
- # Specify server role as 'redis_master_role' and enable Consul agent
- roles(['redis_master_role', 'consul_role'])
+ # Specify server roles as 'redis_sentinel_role' and 'redis_master_role'
+ roles ['redis_sentinel_role', 'redis_master_role', 'consul_role']
+
+ # Set IP bind address and Quorum number for Redis Sentinel service
+ sentinel['bind'] = '0.0.0.0'
+ sentinel['quorum'] = 2
# IP address pointing to a local IP that the other machines can reach to.
# You can also set bind to '0.0.0.0' which listen in all interfaces.
@@ -1120,8 +993,19 @@ a node and change its status from primary to replica (and vice versa).
# machines to connect to it.
redis['port'] = 6379
- # Set up password authentication for Redis (use the same password in all nodes).
- redis['password'] = 'REDIS_PRIMARY_PASSWORD_OF_SECOND_CLUSTER'
+ ## Port of primary Redis server for Sentinel, uncomment to change to non default. Defaults
+ ## to `6379`.
+ #redis['master_port'] = 6379
+
+ # Set up password authentication for Redis and replicas (use the same password in all nodes).
+ redis['password'] = 'REDIS_PRIMARY_PASSWORD_OF_FIRST_CLUSTER'
+ redis['master_password'] = 'REDIS_PRIMARY_PASSWORD_OF_SECOND_CLUSTER'
+
+ ## Must be the same in every Redis node
+ redis['master_name'] = 'gitlab-redis-persistent'
+
+ ## The IP of this primary Redis node.
+ redis['master_ip'] = '10.6.0.61'
## Enable service discovery for Prometheus
consul['monitoring_service_discovery'] = true
@@ -1145,13 +1029,9 @@ a node and change its status from primary to replica (and vice versa).
1. [Reconfigure Omnibus GitLab](../restart_gitlab.md#omnibus-gitlab-reconfigure) for the changes to take effect.
-You can specify multiple roles, like sentinel and Redis, as:
-`roles(['redis_sentinel_role', 'redis_master_role'])`. Read more about
-[roles](https://docs.gitlab.com/omnibus/roles/).
-
-#### Configure the replica Redis Queues nodes
+#### Configure the replica Redis Persistent nodes
-1. SSH in to the **replica** Redis Queue server.
+1. SSH in to the **replica** Redis Persistent server.
1. [Download and install](https://about.gitlab.com/install/) the Omnibus GitLab
package of your choice. Be sure to both follow _only_ installation steps 1 and 2
on the page, and to select the correct Omnibus GitLab package, with the same version
@@ -1160,7 +1040,11 @@ You can specify multiple roles, like sentinel and Redis, as:
```ruby
# Specify server role as 'redis_replica_role' and enable Consul agent
- roles(['redis_replica_role', 'consul_role'])
+ roles ['redis_sentinel_role', 'redis_replica_role', 'consul_role']
+
+ # Set IP bind address and Quorum number for Redis Sentinel service
+ sentinel['bind'] = '0.0.0.0'
+ sentinel['quorum'] = 2
# IP address pointing to a local IP that the other machines can reach to.
# You can also set bind to '0.0.0.0' which listen in all interfaces.
@@ -1172,16 +1056,19 @@ You can specify multiple roles, like sentinel and Redis, as:
# machines to connect to it.
redis['port'] = 6379
+ ## Port of primary Redis server for Sentinel, uncomment to change to non default. Defaults
+ ## to `6379`.
+ #redis['master_port'] = 6379
+
# The same password for Redis authentication you set up for the primary node.
- redis['password'] = 'REDIS_PRIMARY_PASSWORD_OF_SECOND_CLUSTER'
+ redis['master_password'] = 'REDIS_PRIMARY_PASSWORD_OF_SECOND_CLUSTER'
+
+ ## Must be the same in every Redis node
+ redis['master_name'] = 'gitlab-redis-persistent'
# The IP of the primary Redis node.
redis['master_ip'] = '10.6.0.61'
- # Port of primary Redis server, uncomment to change to non default. Defaults
- # to `6379`.
- #redis['master_port'] = 6379
-
## Enable service discovery for Prometheus
consul['monitoring_service_discovery'] = true
@@ -1211,15 +1098,6 @@ You can specify multiple roles, like sentinel and Redis, as:
1. Go through the steps again for all the other replica nodes, and
make sure to set up the IPs correctly.
-You can specify multiple roles, like sentinel and Redis, as:
-`roles(['redis_sentinel_role', 'redis_master_role'])`. Read more about
-[roles](https://docs.gitlab.com/omnibus/roles/).
-
-These values don't have to be changed again in `/etc/gitlab/gitlab.rb` after
-a failover, as the nodes will be managed by the [Sentinels](#configure-the-sentinel-queues-nodes), and even after a
-`gitlab-ctl reconfigure`, they will get their configuration restored by
-the same Sentinels.
-
Advanced [configuration options](https://docs.gitlab.com/omnibus/settings/redis.html)
are supported and can be added if needed.
@@ -1229,138 +1107,16 @@ are supported and can be added if needed.
</a>
</div>
-#### Configure the Sentinel Queues nodes
-
-Now that the Redis servers are all set up, let's configure the Sentinel
-servers. The following IPs will be used as an example:
-
-- `10.6.0.81`: Sentinel - Queues 1
-- `10.6.0.82`: Sentinel - Queues 2
-- `10.6.0.83`: Sentinel - Queues 3
-
-NOTE:
-If you're using an external Redis Sentinel instance, be sure to exclude the
-`requirepass` parameter from the Sentinel configuration. This parameter causes
-clients to report `NOAUTH Authentication required.`.
-[Redis Sentinel 3.2.x doesn't support password authentication](https://github.com/antirez/redis/issues/3279).
-
-To configure the Sentinel Queues server:
-
-1. SSH in to the server that will host Sentinel.
-1. [Download and install](https://about.gitlab.com/install/) the Omnibus GitLab
- package of your choice. Be sure to both follow _only_ installation steps 1 and 2
- on the page, and to select the correct Omnibus GitLab package, with the same version
- and type (Community or Enterprise editions) as your current install.
-1. Edit `/etc/gitlab/gitlab.rb` and add the contents:
-
- ```ruby
- roles(['redis_sentinel_role', 'consul_role'])
-
- ## Must be the same in every sentinel node
- redis['master_name'] = 'gitlab-redis-persistent'
-
- ## The same password for Redis authentication you set up for the primary node.
- redis['master_password'] = 'REDIS_PRIMARY_PASSWORD_OF_SECOND_CLUSTER'
-
- ## The IP of the primary Redis node.
- redis['master_ip'] = '10.6.0.61'
-
- ## Define a port so Redis can listen for TCP requests which will allow other
- ## machines to connect to it.
- redis['port'] = 6379
-
- ## Port of primary Redis server, uncomment to change to non default. Defaults
- ## to `6379`.
- #redis['master_port'] = 6379
-
- ## Configure Sentinel's IP
- sentinel['bind'] = '10.6.0.81'
-
- ## Port that Sentinel listens on, uncomment to change to non default. Defaults
- ## to `26379`.
- #sentinel['port'] = 26379
-
- ## Quorum must reflect the amount of voting sentinels it take to start a failover.
- ## Value must NOT be greater then the amount of sentinels.
- ##
- ## The quorum can be used to tune Sentinel in two ways:
- ## 1. If a the quorum is set to a value smaller than the majority of Sentinels
- ## we deploy, we are basically making Sentinel more sensible to primary failures,
- ## triggering a failover as soon as even just a minority of Sentinels is no longer
- ## able to talk with the primary.
- ## 1. If a quorum is set to a value greater than the majority of Sentinels, we are
- ## making Sentinel able to failover only when there are a very large number (larger
- ## than majority) of well connected Sentinels which agree about the primary being down.s
- sentinel['quorum'] = 2
-
- ## Consider unresponsive server down after x amount of ms.
- #sentinel['down_after_milliseconds'] = 10000
-
- ## Specifies the failover timeout in milliseconds. It is used in many ways:
- ##
- ## - The time needed to re-start a failover after a previous failover was
- ## already tried against the same primary by a given Sentinel, is two
- ## times the failover timeout.
- ##
- ## - The time needed for a replica replicating to a wrong primary according
- ## to a Sentinel current configuration, to be forced to replicate
- ## with the right primary, is exactly the failover timeout (counting since
- ## the moment a Sentinel detected the misconfiguration).
- ##
- ## - The time needed to cancel a failover that is already in progress but
- ## did not produced any configuration change (REPLICAOF NO ONE yet not
- ## acknowledged by the promoted replica).
- ##
- ## - The maximum time a failover in progress waits for all the replica to be
- ## reconfigured as replicas of the new primary. However even after this time
- ## the replicas will be reconfigured by the Sentinels anyway, but not with
- ## the exact parallel-syncs progression as specified.
- #sentinel['failover_timeout'] = 60000
-
- ## Enable service discovery for Prometheus
- consul['monitoring_service_discovery'] = true
-
- ## The IPs of the Consul server nodes
- ## You can also use FQDNs and intermix them with IPs
- consul['configuration'] = {
- retry_join: %w(10.6.0.11 10.6.0.12 10.6.0.13),
- }
-
- # Set the network addresses that the exporters will listen on
- node_exporter['listen_address'] = '0.0.0.0:9100'
- redis_exporter['listen_address'] = '0.0.0.0:9121'
-
- # Prevent database migrations from running on upgrade automatically
- gitlab_rails['auto_migrate'] = false
- ```
-
-1. Copy the `/etc/gitlab/gitlab-secrets.json` file from the first Omnibus node you configured and add or replace
- the file of the same name on this server. If this is the first Omnibus node you are configuring then you can skip this step.
-
-1. To ensure database migrations are only run during reconfigure and not automatically on upgrade, run:
-
- ```shell
- sudo touch /etc/gitlab/skip-auto-reconfigure
- ```
-
- Only the primary GitLab application server should handle migrations.
-
-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 Sentinel nodes, and
- make sure you set up the correct IPs.
-
-<div align="right">
- <a type="button" class="btn btn-default" href="#setup-components">
- Back to setup components <i class="fa fa-angle-double-up" aria-hidden="true"></i>
- </a>
-</div>
-
## Configure Gitaly Cluster
-[Gitaly Cluster](../gitaly/praefect.md) is a GitLab provided and recommended fault tolerant solution for storing Git repositories.
+[Gitaly Cluster](../gitaly/praefect.md) is a GitLab-provided and recommended
+fault tolerant solution for storing Git repositories.
In this configuration, every Git repository is stored on every Gitaly node in the cluster, with one being designated the primary, and failover occurs automatically if the primary node goes down.
+NOTE:
+Gitaly Cluster provides the benefits of fault tolerance, but comes with additional complexity of setup and management. Please [review the existing technical limitations and considerations prior to deploying Gitaly Cluster](../gitaly/index.md#guidance-regarding-gitaly-cluster).
+For implementations with Gitaly Sharded, the same Gitaly specs should be used. Follow the [separate Gitaly documentation](../gitaly/configure_gitaly.md) instead of this section.
+
The recommended cluster setup includes the following components:
- 3 Gitaly nodes: Replicated storage of Git repositories.
@@ -1527,7 +1283,7 @@ the details of each Gitaly node that makes up the cluster. Each storage is also
and this name is used in several areas of the configuration. In this guide, the name of the storage will be
`default`. Also, this guide is geared towards new installs, if upgrading an existing environment
to use Gitaly Cluster, you may need to use a different name.
-Refer to the [Praefect documentation](../gitaly/praefect.md#praefect) for more info.
+Refer to the [Praefect documentation](../gitaly/praefect.md#praefect) for more information.
The following IPs will be used as an example:
@@ -1854,7 +1610,7 @@ To configure the Sidekiq nodes, on each one:
1. [Download and install](https://about.gitlab.com/install/) the Omnibus GitLab
package of your choice. Be sure to follow _only_ installation steps 1 and 2
on the page.
-1. Open `/etc/gitlab/gitlab.rb` with your editor:
+1. Create or edit `/etc/gitlab/gitlab.rb` and use the following configuration:
```ruby
# Avoid running unnecessary services on the Sidekiq server
@@ -1869,36 +1625,40 @@ To configure the Sidekiq nodes, on each one:
gitlab_exporter['enable'] = false
nginx['enable'] = false
+ # External URL
+ ## This should match the URL of the external load balancer
+ external_url 'https://gitlab.example.com'
+
# Redis
## Redis connection details
## First cluster that will host the cache
gitlab_rails['redis_cache_instance'] = 'redis://:<REDIS_PRIMARY_PASSWORD_OF_FIRST_CLUSTER>@gitlab-redis-cache'
gitlab_rails['redis_cache_sentinels'] = [
- {host: '10.6.0.71', port: 26379},
- {host: '10.6.0.72', port: 26379},
- {host: '10.6.0.73', port: 26379},
+ {host: '10.6.0.51', port: 26379},
+ {host: '10.6.0.52', port: 26379},
+ {host: '10.6.0.53', port: 26379},
]
- ## Second cluster that will host the queues, shared state, and actioncable
+ ## 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'
gitlab_rails['redis_queues_sentinels'] = [
- {host: '10.6.0.81', port: 26379},
- {host: '10.6.0.82', port: 26379},
- {host: '10.6.0.83', port: 26379},
+ {host: '10.6.0.61', port: 26379},
+ {host: '10.6.0.62', port: 26379},
+ {host: '10.6.0.63', port: 26379},
]
gitlab_rails['redis_shared_state_sentinels'] = [
- {host: '10.6.0.81', port: 26379},
- {host: '10.6.0.82', port: 26379},
- {host: '10.6.0.83', port: 26379},
+ {host: '10.6.0.61', port: 26379},
+ {host: '10.6.0.62', port: 26379},
+ {host: '10.6.0.63', port: 26379},
]
gitlab_rails['redis_actioncable_sentinels'] = [
- {host: '10.6.0.81', port: 26379},
- {host: '10.6.0.82', port: 26379},
- {host: '10.6.0.83', port: 26379},
+ {host: '10.6.0.61', port: 26379},
+ {host: '10.6.0.62', port: 26379},
+ {host: '10.6.0.63', port: 26379},
]
# Gitaly Cluster
@@ -2052,9 +1812,9 @@ On each node perform the following:
gitlab_rails['redis_cache_instance'] = 'redis://:<REDIS_PRIMARY_PASSWORD_OF_FIRST_CLUSTER>@gitlab-redis-cache'
gitlab_rails['redis_cache_sentinels'] = [
- {host: '10.6.0.71', port: 26379},
- {host: '10.6.0.72', port: 26379},
- {host: '10.6.0.73', port: 26379},
+ {host: '10.6.0.51', port: 26379},
+ {host: '10.6.0.52', port: 26379},
+ {host: '10.6.0.53', port: 26379},
]
## Second cluster that will host the queues, shared state, and actionable
@@ -2063,19 +1823,19 @@ On each node perform the following:
gitlab_rails['redis_actioncable_instance'] = 'redis://:<REDIS_PRIMARY_PASSWORD_OF_SECOND_CLUSTER>@gitlab-redis-persistent'
gitlab_rails['redis_queues_sentinels'] = [
- {host: '10.6.0.81', port: 26379},
- {host: '10.6.0.82', port: 26379},
- {host: '10.6.0.83', port: 26379},
+ {host: '10.6.0.61', port: 26379},
+ {host: '10.6.0.62', port: 26379},
+ {host: '10.6.0.63', port: 26379},
]
gitlab_rails['redis_shared_state_sentinels'] = [
- {host: '10.6.0.81', port: 26379},
- {host: '10.6.0.82', port: 26379},
- {host: '10.6.0.83', port: 26379},
+ {host: '10.6.0.61', port: 26379},
+ {host: '10.6.0.62', port: 26379},
+ {host: '10.6.0.63', port: 26379},
]
gitlab_rails['redis_actioncable_sentinels'] = [
- {host: '10.6.0.81', port: 26379},
- {host: '10.6.0.82', port: 26379},
- {host: '10.6.0.83', port: 26379},
+ {host: '10.6.0.61', port: 26379},
+ {host: '10.6.0.62', port: 26379},
+ {host: '10.6.0.63', port: 26379},
]
# Set the network addresses that the exporters used for monitoring will listen on
@@ -2147,7 +1907,7 @@ On each node perform the following:
1. [Reconfigure GitLab](../restart_gitlab.md#omnibus-gitlab-reconfigure) for the changes to take effect.
-1. If you're [using NFS](#configure-nfs-optional):
+1. If you're [using NFS](#configure-nfs):
1. If necessary, install the NFS client utility packages using the following
commands:
@@ -2289,9 +2049,9 @@ To configure the Monitoring node:
## Configure the object storage
GitLab supports using an object storage service for holding numerous types of data.
-It's recommended over [NFS](#configure-nfs-optional) and in general it's better
-in larger setups as object storage is typically much more performant, reliable,
-and scalable.
+Object storage is also recommended over [NFS](#configure-nfs) and in general
+it's better in larger setups as object storage is typically much more performant,
+reliable, and scalable.
GitLab has been tested on a number of object storage providers:
@@ -2313,6 +2073,9 @@ There are two ways of specifying object storage configuration in GitLab:
Starting with GitLab 13.2, consolidated object storage configuration is available. It simplifies your GitLab configuration since the connection details are shared across object types. Refer to [Consolidated object storage configuration](../object_storage.md#consolidated-object-storage-configuration) guide for instructions on how to set it up.
+GitLab Runner returns job logs in chunks which Omnibus GitLab caches temporarily on disk in `/var/opt/gitlab/gitlab-ci/builds` by default, even when using consolidated object storage. With default configuration, this directory needs to be shared via NFS on any GitLab Rails and Sidekiq nodes.
+In GitLab 13.6 and later, it's recommended to switch to [Incremental logging](../job_logs.md#incremental-logging-architecture), which uses Redis instead of disk space for temporary caching of job logs.
+
For configuring object storage in GitLab 13.1 and earlier, or for storage types not
supported by consolidated configuration form, refer to the following guides based
on what features you intend to use:
@@ -2359,7 +2122,7 @@ cluster alongside your instance, read how to
</a>
</div>
-## Configure NFS (optional)
+## Configure NFS
[Object storage](#configure-the-object-storage), along with [Gitaly](#configure-gitaly)
are recommended over NFS wherever possible for improved performance. If you intend
@@ -2373,7 +2136,7 @@ unavailable from GitLab 15.0. No further enhancements are planned for this featu
Read:
-- The [Gitaly and NFS deprecation notice](../gitaly/index.md#nfs-deprecation-notice).
+- [Gitaly and NFS Deprecation](../nfs.md#gitaly-and-nfs-deprecation).
- About the [correct mount options to use](../nfs.md#upgrade-to-gitaly-cluster-or-disable-caching-if-experiencing-data-loss).
## Cloud Native Hybrid reference architecture with Helm Charts (alternative)
@@ -2427,12 +2190,10 @@ services where applicable):
| PostgreSQL<sup>1</sup> | 3 | 16 vCPU, 60 GB memory | `n1-standard-16` |
| PgBouncer<sup>1</sup> | 3 | 2 vCPU, 1.8 GB memory | `n1-highcpu-2` |
| Internal load balancing node<sup>3</sup> | 1 | 4 vCPU, 3.6GB memory | `n1-highcpu-4` |
-| Redis - Cache<sup>2</sup> | 3 | 4 vCPU, 15 GB memory | `n1-standard-4` |
-| Redis - Queues / Shared State<sup>2</sup> | 3 | 4 vCPU, 15 GB memory | `n1-standard-4` |
-| Redis Sentinel - Cache<sup>2</sup> | 3 | 1 vCPU, 3.75 GB memory | `n1-standard-1` |
-| Redis Sentinel - Queues / Shared State<sup>2</sup> | 3 | 1 vCPU, 3.75 GB memory | `n1-standard-1` |
-| Gitaly | 3 | 32 vCPU, 120 GB memory | `n1-standard-32` |
-| Praefect | 3 | 4 vCPU, 3.6 GB memory | `n1-highcpu-4` |
+| Redis/Sentinel - Cache<sup>2</sup> | 3 | 4 vCPU, 15 GB memory | `n1-standard-4` |
+| Redis/Sentinel - Persistent<sup>2</sup> | 3 | 4 vCPU, 15 GB memory | `n1-standard-4` |
+| Gitaly<sup>5</sup> | 3 | 32 vCPU, 120 GB memory | `n1-standard-32` |
+| Praefect<sup>5</sup> | 3 | 4 vCPU, 3.6 GB memory | `n1-highcpu-4` |
| Praefect PostgreSQL<sup>1</sup> | 1+ | 2 vCPU, 1.8 GB memory | `n1-highcpu-2` |
| Object storage<sup>4</sup> | n/a | n/a | n/a |
@@ -2442,6 +2203,7 @@ services where applicable):
2. Can be optionally run on reputable third-party external PaaS Redis solutions. Google Memorystore and AWS Elasticache are known to work.
3. Can be optionally run on reputable third-party load balancing services (LB PaaS). AWS ELB is known to work.
4. Should be run on reputable third-party object storage (storage PaaS) for cloud implementations. Google Cloud Storage and AWS S3 are known to work.
+5. Gitaly Cluster provides the benefits of fault tolerance, but comes with additional complexity of setup and management. Please [review the existing technical limitations and considerations prior to deploying Gitaly Cluster](../gitaly/index.md#guidance-regarding-gitaly-cluster). If Gitaly Sharded is desired, the same specs listed above for `Gitaly` should be used.
<!-- markdownlint-enable MD029 -->
NOTE:
@@ -2486,11 +2248,6 @@ card "Database" as database {
card "redis" as redis {
collections "**Redis Persistent** x3" as redis_persistent #FF6347
collections "**Redis Cache** x3" as redis_cache #FF6347
- collections "**Redis Persistent Sentinel** x3" as redis_persistent_sentinel #FF6347
- collections "**Redis Cache Sentinel** x3"as redis_cache_sentinel #FF6347
-
- redis_persistent <.[#FF6347]- redis_persistent_sentinel
- redis_cache <.[#FF6347]- redis_cache_sentinel
}
cloud "**Object Storage**" as object_storage #white
diff --git a/doc/administration/reference_architectures/2k_users.md b/doc/administration/reference_architectures/2k_users.md
index 99dd29c3a83..23b15b563f7 100644
--- a/doc/administration/reference_architectures/2k_users.md
+++ b/doc/administration/reference_architectures/2k_users.md
@@ -13,6 +13,7 @@ For a full list of reference architectures, see
> - **Supported users (approximate):** 2,000
> - **High Availability:** No. For a highly-available environment, you can
> follow a modified [3K reference architecture](3k_users.md#supported-modifications-for-lower-user-counts-ha).
+> - **Cloud Native Hybrid:** [Yes](#cloud-native-hybrid-reference-architecture-with-helm-charts-alternative)
> - **Test requests per second (RPS) rates:** API: 40 RPS, Web: 4 RPS, Git (Pull): 4 RPS, Git (Push): 1 RPS
> - **[Latest 2k weekly performance testing results](https://gitlab.com/gitlab-org/quality/performance/-/wikis/Benchmarks/Latest/2k)**
@@ -302,8 +303,8 @@ further configuration steps.
1. [Reconfigure GitLab](../restart_gitlab.md#omnibus-gitlab-reconfigure) for the changes to take effect.
1. Note the PostgreSQL node's IP address or hostname, port, and
- plain text password. These will be necessary when configuring the [GitLab
- application server](#configure-gitlab-rails) later.
+ plain text password. These will be necessary when configuring the
+ [GitLab application server](#configure-gitlab-rails) later.
Advanced [configuration options](https://docs.gitlab.com/omnibus/settings/database.html)
are supported and can be added if needed.
@@ -385,8 +386,8 @@ Omnibus:
1. [Reconfigure Omnibus GitLab](../restart_gitlab.md#omnibus-gitlab-reconfigure) for the changes to take effect.
1. Note the Redis node's IP address or hostname, port, and
- Redis password. These will be necessary when [configuring the GitLab
- application servers](#configure-gitlab-rails) later.
+ Redis password. These will be necessary when
+ [configuring the GitLab application servers](#configure-gitlab-rails) later.
Advanced [configuration options](https://docs.gitlab.com/omnibus/settings/redis.html)
are supported and can be added if needed.
@@ -903,6 +904,9 @@ There are two ways of specifying object storage configuration in GitLab:
Starting with GitLab 13.2, consolidated object storage configuration is available. It simplifies your GitLab configuration since the connection details are shared across object types. Refer to [Consolidated object storage configuration](../object_storage.md#consolidated-object-storage-configuration) guide for instructions on how to set it up.
+GitLab Runner returns job logs in chunks which Omnibus GitLab caches temporarily on disk in `/var/opt/gitlab/gitlab-ci/builds` by default, even when using consolidated object storage. With default configuration, this directory needs to be shared via NFS on any GitLab Rails and Sidekiq nodes.
+In GitLab 13.6 and later, it's recommended to switch to [Incremental logging](../job_logs.md#incremental-logging-architecture), which uses Redis instead of disk space for temporary caching of job logs.
+
For configuring object storage in GitLab 13.1 and earlier, or for storage types not
supported by consolidated configuration form, refer to the following guides based
on what features you intend to use:
@@ -964,7 +968,7 @@ unavailable from GitLab 15.0. No further enhancements are planned for this featu
Read:
-- The [Gitaly and NFS deprecation notice](../gitaly/index.md#nfs-deprecation-notice).
+- [Gitaly and NFS Deprecation](../nfs.md#gitaly-and-nfs-deprecation).
- About the [correct mount options to use](../nfs.md#upgrade-to-gitaly-cluster-or-disable-caching-if-experiencing-data-loss).
## Cloud Native Hybrid reference architecture with Helm Charts (alternative)
diff --git a/doc/administration/reference_architectures/3k_users.md b/doc/administration/reference_architectures/3k_users.md
index da36968f053..575dd22b729 100644
--- a/doc/administration/reference_architectures/3k_users.md
+++ b/doc/administration/reference_architectures/3k_users.md
@@ -22,6 +22,7 @@ For a full list of reference architectures, see
> - **Supported users (approximate):** 3,000
> - **High Availability:** Yes, although [Praefect](#configure-praefect-postgresql) needs a third-party PostgreSQL solution
+> - **Cloud Native Hybrid:** [Yes](#cloud-native-hybrid-reference-architecture-with-helm-charts-alternative)
> - **Test requests per second (RPS) rates:** API: 60 RPS, Web: 6 RPS, Git (Pull): 6 RPS, Git (Push): 1 RPS
> - **[Latest 3k weekly performance testing results](https://gitlab.com/gitlab-org/quality/performance/-/wikis/Benchmarks/Latest/3k)**
@@ -33,8 +34,8 @@ For a full list of reference architectures, see
| PostgreSQL<sup>1</sup> | 3 | 2 vCPU, 7.5 GB memory | `n1-standard-2` | `m5.large` | `D2s v3` |
| PgBouncer<sup>1</sup> | 3 | 2 vCPU, 1.8 GB memory | `n1-highcpu-2` | `c5.large` | `F2s v2` |
| Internal load balancing node<sup>3</sup> | 1 | 2 vCPU, 1.8 GB memory | `n1-highcpu-2` | `c5.large` | `F2s v2` |
-| Gitaly | 3 | 4 vCPU, 15 GB memory | `n1-standard-4` | `m5.xlarge` | `D4s v3` |
-| Praefect | 3 | 2 vCPU, 1.8 GB memory | `n1-highcpu-2` | `c5.large` | `F2s v2` |
+| Gitaly<sup>5</sup> | 3 | 4 vCPU, 15 GB memory | `n1-standard-4` | `m5.xlarge` | `D4s v3` |
+| Praefect<sup>5</sup> | 3 | 2 vCPU, 1.8 GB memory | `n1-highcpu-2` | `c5.large` | `F2s v2` |
| Praefect PostgreSQL<sup>1</sup> | 1+ | 2 vCPU, 1.8 GB memory | `n1-highcpu-2` | `c5.large` | `F2s v2` |
| Sidekiq | 4 | 2 vCPU, 7.5 GB memory | `n1-standard-2` | `m5.large` | `D2s v3` |
| GitLab Rails | 3 | 8 vCPU, 7.2 GB memory | `n1-highcpu-8` | `c5.2xlarge` | `F8s v2` |
@@ -48,6 +49,7 @@ For a full list of reference architectures, see
2. Can be optionally run on reputable third-party external PaaS Redis solutions. Google Memorystore and AWS Elasticache are known to work.
3. Can be optionally run on reputable third-party load balancing services (LB PaaS). AWS ELB is known to work.
4. Should be run on reputable third-party object storage (storage PaaS) for cloud implementations. Google Cloud Storage and AWS S3 are known to work.
+5. Gitaly Cluster provides the benefits of fault tolerance, but comes with additional complexity of setup and management. Please [review the existing technical limitations and considerations prior to deploying Gitaly Cluster](../gitaly/index.md#guidance-regarding-gitaly-cluster). If Gitaly Sharded is desired, the same specs listed above for `Gitaly` should be used.
<!-- markdownlint-enable MD029 -->
NOTE:
@@ -1065,6 +1067,10 @@ The following IPs will be used as an example:
[Gitaly Cluster](../gitaly/praefect.md) is a GitLab provided and recommended fault tolerant solution for storing Git repositories.
In this configuration, every Git repository is stored on every Gitaly node in the cluster, with one being designated the primary, and failover occurs automatically if the primary node goes down.
+NOTE:
+Gitaly Cluster provides the benefits of fault tolerance, but comes with additional complexity of setup and management. Please [review the existing technical limitations and considerations prior to deploying Gitaly Cluster](../gitaly/index.md#guidance-regarding-gitaly-cluster).
+For implementations with Gitaly Sharded, the same Gitaly specs should be used. Follow the [separate Gitaly documentation](../gitaly/configure_gitaly.md) instead of this section.
+
The recommended cluster setup includes the following components:
- 3 Gitaly nodes: Replicated storage of Git repositories.
@@ -1230,7 +1236,7 @@ the details of each Gitaly node that makes up the cluster. Each storage is also
and this name is used in several areas of the configuration. In this guide, the name of the storage will be
`default`. Also, this guide is geared towards new installs, if upgrading an existing environment
to use Gitaly Cluster, you may need to use a different name.
-Refer to the [Praefect documentation](../gitaly/praefect.md#praefect) for more info.
+Refer to the [Praefect documentation](../gitaly/praefect.md#praefect) for more information.
The following IPs will be used as an example:
@@ -1559,7 +1565,7 @@ To configure the Sidekiq nodes, one each one:
1. [Download and install](https://about.gitlab.com/install/) the Omnibus GitLab
package of your choice. Be sure to follow _only_ installation steps 1 and 2
on the page.
-1. Open `/etc/gitlab/gitlab.rb` with your editor:
+1. Create or edit `/etc/gitlab/gitlab.rb` and use the following configuration:
```ruby
# Avoid running unnecessary services on the Sidekiq server
@@ -1574,6 +1580,10 @@ To configure the Sidekiq nodes, one each one:
gitlab_exporter['enable'] = false
nginx['enable'] = false
+ # External URL
+ ## This should match the URL of the external load balancer
+ external_url 'https://gitlab.example.com'
+
# Redis
redis['master_name'] = 'gitlab-redis'
@@ -2011,6 +2021,9 @@ There are two ways of specifying object storage configuration in GitLab:
Starting with GitLab 13.2, consolidated object storage configuration is available. It simplifies your GitLab configuration since the connection details are shared across object types. Refer to [Consolidated object storage configuration](../object_storage.md#consolidated-object-storage-configuration) guide for instructions on how to set it up.
+GitLab Runner returns job logs in chunks which Omnibus GitLab caches temporarily on disk in `/var/opt/gitlab/gitlab-ci/builds` by default, even when using consolidated object storage. With default configuration, this directory needs to be shared via NFS on any GitLab Rails and Sidekiq nodes.
+In GitLab 13.6 and later, it's recommended to switch to [Incremental logging](../job_logs.md#incremental-logging-architecture), which uses Redis instead of disk space for temporary caching of job logs.
+
For configuring object storage in GitLab 13.1 and earlier, or for storage types not
supported by consolidated configuration form, refer to the following guides based
on what features you intend to use:
@@ -2071,7 +2084,7 @@ unavailable from GitLab 15.0. No further enhancements are planned for this featu
Read:
-- The [Gitaly and NFS deprecation notice](../gitaly/index.md#nfs-deprecation-notice).
+- [Gitaly and NFS Deprecation](../nfs.md#gitaly-and-nfs-deprecation).
- About the [correct mount options to use](../nfs.md#upgrade-to-gitaly-cluster-or-disable-caching-if-experiencing-data-loss).
## Supported modifications for lower user counts (HA)
@@ -2150,8 +2163,8 @@ services where applicable):
| PostgreSQL<sup>1</sup> | 3 | 2 vCPU, 7.5 GB memory | `n1-standard-2` |
| PgBouncer<sup>1</sup> | 3 | 2 vCPU, 1.8 GB memory | `n1-highcpu-2` |
| Internal load balancing node<sup>3</sup> | 1 | 2 vCPU, 1.8 GB memory | `n1-highcpu-2` |
-| Gitaly | 3 | 4 vCPU, 15 GB memory | `n1-standard-4` |
-| Praefect | 3 | 2 vCPU, 1.8 GB memory | `n1-highcpu-2` |
+| Gitaly<sup>5</sup> | 3 | 4 vCPU, 15 GB memory | `n1-standard-4` |
+| Praefect<sup>5</sup> | 3 | 2 vCPU, 1.8 GB memory | `n1-highcpu-2` |
| Praefect PostgreSQL<sup>1</sup> | 1+ | 2 vCPU, 1.8 GB memory | `n1-highcpu-2` |
| Object storage<sup>4</sup> | n/a | n/a | n/a |
@@ -2161,6 +2174,7 @@ services where applicable):
2. Can be optionally run on reputable third-party external PaaS Redis solutions. Google Memorystore and AWS Elasticache are known to work.
3. Can be optionally run on reputable third-party load balancing services (LB PaaS). AWS ELB is known to work.
4. Should be run on reputable third-party object storage (storage PaaS) for cloud implementations. Google Cloud Storage and AWS S3 are known to work.
+5. Gitaly Cluster provides the benefits of fault tolerance, but comes with additional complexity of setup and management. Please [review the existing technical limitations and considerations prior to deploying Gitaly Cluster](../gitaly/index.md#guidance-regarding-gitaly-cluster). If Gitaly Sharded is desired, the same specs listed above for `Gitaly` should be used.
<!-- markdownlint-enable MD029 -->
NOTE:
diff --git a/doc/administration/reference_architectures/50k_users.md b/doc/administration/reference_architectures/50k_users.md
index b071b48cbd9..be44f464e7e 100644
--- a/doc/administration/reference_architectures/50k_users.md
+++ b/doc/administration/reference_architectures/50k_users.md
@@ -12,6 +12,7 @@ full list of reference architectures, see
> - **Supported users (approximate):** 50,000
> - **High Availability:** Yes ([Praefect](#configure-praefect-postgresql) needs a third-party PostgreSQL solution for HA)
+> - **Cloud Native Hybrid:** [Yes](#cloud-native-hybrid-reference-architecture-with-helm-charts-alternative)
> - **Test requests per second (RPS) rates:** API: 1000 RPS, Web: 100 RPS, Git (Pull): 100 RPS, Git (Push): 20 RPS
> - **[Latest 50k weekly performance testing results](https://gitlab.com/gitlab-org/quality/performance/-/wikis/Benchmarks/Latest/50k)**
@@ -22,18 +23,16 @@ full list of reference architectures, see
| PostgreSQL<sup>1</sup> | 3 | 32 vCPU, 120 GB memory | `n1-standard-32` | `m5.8xlarge` | `D32s v3` |
| PgBouncer<sup>1</sup> | 3 | 2 vCPU, 1.8 GB memory | `n1-highcpu-2` | `c5.large` | `F2s v2` |
| Internal load balancing node<sup>3</sup> | 1 | 8 vCPU, 7.2 GB memory | `n1-highcpu-8` | `c5.2xlarge` | `F8s v2` |
-| Redis - Cache<sup>2</sup> | 3 | 4 vCPU, 15 GB memory | `n1-standard-4` | `m5.xlarge` | `D4s v3` |
-| Redis - Queues / Shared State<sup>2</sup> | 3 | 4 vCPU, 15 GB memory | `n1-standard-4` | `m5.xlarge` | `D4s v3` |
-| Redis Sentinel - Cache<sup>2</sup> | 3 | 1 vCPU, 3.75 GB memory | `n1-standard-1` | `c5.large` | `A1 v2` |
-| Redis Sentinel - Queues / Shared State<sup>2</sup>| 3 | 1 vCPU, 3.75 GB memory | `n1-standard-1` | `c5.large` | `A1 v2` |
-| Gitaly | 3 | 64 vCPU, 240 GB memory | `n1-standard-64` | `m5.16xlarge` | `D64s v3` |
-| Praefect | 3 | 4 vCPU, 3.6 GB memory | `n1-highcpu-4` | `c5.xlarge` | `F4s v2` |
+| Redis/Sentinel - Cache<sup>2</sup> | 3 | 4 vCPU, 15 GB memory | `n1-standard-4` | `m5.xlarge` | `D4s v3` |
+| Redis/Sentinel - Persistent<sup>2</sup> | 3 | 4 vCPU, 15 GB memory | `n1-standard-4` | `m5.xlarge` | `D4s v3` |
+| Gitaly<sup>5</sup> | 3 | 64 vCPU, 240 GB memory | `n1-standard-64` | `m5.16xlarge` | `D64s v3` |
+| Praefect<sup>5</sup> | 3 | 4 vCPU, 3.6 GB memory | `n1-highcpu-4` | `c5.xlarge` | `F4s v2` |
| Praefect PostgreSQL<sup>1</sup> | 1+ | 2 vCPU, 1.8 GB memory | `n1-highcpu-2` | `c5.large` | `F2s v2` |
| Sidekiq | 4 | 4 vCPU, 15 GB memory | `n1-standard-4` | `m5.xlarge` | `D4s v3` |
| GitLab Rails | 12 | 32 vCPU, 28.8 GB memory | `n1-highcpu-32` | `c5.9xlarge` | `F32s v2` |
| Monitoring node | 1 | 4 vCPU, 3.6 GB memory | `n1-highcpu-4` | `c5.xlarge` | `F4s v2` |
| Object storage<sup>4</sup> | n/a | n/a | n/a | n/a | n/a |
-| NFS server (optional, not recommended) | 1 | 4 vCPU, 3.6 GB memory | `n1-highcpu-4` | `c5.xlarge` | `F4s v2` |
+| NFS server (non-Gitaly) | 1 | 4 vCPU, 3.6 GB memory | `n1-highcpu-4` | `c5.xlarge` | `F4s v2` |
<!-- Disable ordered list rule https://github.com/DavidAnson/markdownlint/blob/main/doc/Rules.md#md029---ordered-list-item-prefix -->
<!-- markdownlint-disable MD029 -->
@@ -41,6 +40,7 @@ full list of reference architectures, see
2. Can be optionally run on reputable third-party external PaaS Redis solutions. Google Memorystore and AWS Elasticache are known to work.
3. Can be optionally run on reputable third-party load balancing services (LB PaaS). AWS ELB is known to work.
4. Should be run on reputable third-party object storage (storage PaaS) for cloud implementations. Google Cloud Storage and AWS S3 are known to work.
+5. Gitaly Cluster provides the benefits of fault tolerance, but comes with additional complexity of setup and management. Please [review the existing technical limitations and considerations prior to deploying Gitaly Cluster](../gitaly/index.md#guidance-regarding-gitaly-cluster). If Gitaly Sharded is desired, the same specs listed above for `Gitaly` should be used.
<!-- markdownlint-enable MD029 -->
NOTE:
@@ -82,11 +82,6 @@ card "Database" as database {
card "redis" as redis {
collections "**Redis Persistent** x3" as redis_persistent #FF6347
collections "**Redis Cache** x3" as redis_cache #FF6347
- collections "**Redis Persistent Sentinel** x3" as redis_persistent_sentinel #FF6347
- collections "**Redis Cache Sentinel** x3"as redis_cache_sentinel #FF6347
-
- redis_persistent <.[#FF6347]- redis_persistent_sentinel
- redis_cache <.[#FF6347]- redis_cache_sentinel
}
cloud "**Object Storage**" as object_storage #white
@@ -137,8 +132,7 @@ our [Sysbench](https://github.com/akopytov/sysbench)-based
Due to better performance and availability, for data objects (such as LFS,
uploads, or artifacts), using an [object storage service](#configure-the-object-storage)
-is recommended instead of using NFS. Using an object storage service also
-doesn't require you to provision and maintain a node.
+is recommended.
It's also worth noting that at this time [Praefect requires its own database server](../gitaly/praefect.md#postgresql) and
that to achieve full High Availability a third-party PostgreSQL database solution will be required.
@@ -169,10 +163,8 @@ To set up GitLab and its components to accommodate up to 50,000 users:
used for shared data objects.
1. [Configure Advanced Search](#configure-advanced-search) (optional) for faster,
more advanced code search across your entire GitLab instance.
-1. [Configure NFS](#configure-nfs-optional) (optional, and not recommended)
- to have shared disk storage service as an alternative to Gitaly or object
- storage. You can skip this step if you're not using GitLab Pages (which
- requires NFS).
+1. [Configure NFS](#configure-nfs)
+ to have shared disk storage service for certain GitLab operations (non Gitaly or Object Storage).
The servers start on the same 10.6.0.0/24 private network range, and can
connect to each other freely on these addresses.
@@ -193,15 +185,9 @@ The following list includes descriptions of each server and its assigned IP:
- `10.6.0.51`: Redis - Cache Primary
- `10.6.0.52`: Redis - Cache Replica 1
- `10.6.0.53`: Redis - Cache Replica 2
-- `10.6.0.71`: Sentinel - Cache 1
-- `10.6.0.72`: Sentinel - Cache 2
-- `10.6.0.73`: Sentinel - Cache 3
-- `10.6.0.61`: Redis - Queues Primary
-- `10.6.0.62`: Redis - Queues Replica 1
-- `10.6.0.63`: Redis - Queues Replica 2
-- `10.6.0.81`: Sentinel - Queues 1
-- `10.6.0.82`: Sentinel - Queues 2
-- `10.6.0.83`: Sentinel - Queues 3
+- `10.6.0.61`: Redis - Persistent Primary
+- `10.6.0.62`: Redis - Persistent Replica 1
+- `10.6.0.63`: Redis - Persistent Replica 2
- `10.6.0.91`: Gitaly 1
- `10.6.0.92`: Gitaly 2
- `10.6.0.93`: Gitaly 3
@@ -802,15 +788,9 @@ to be used with GitLab. The following IPs will be used as an example:
- `10.6.0.51`: Redis - Cache Primary
- `10.6.0.52`: Redis - Cache Replica 1
- `10.6.0.53`: Redis - Cache Replica 2
-- `10.6.0.71`: Sentinel - Cache 1
-- `10.6.0.72`: Sentinel - Cache 2
-- `10.6.0.73`: Sentinel - Cache 3
-- `10.6.0.61`: Redis - Queues Primary
-- `10.6.0.62`: Redis - Queues Replica 1
-- `10.6.0.63`: Redis - Queues Replica 2
-- `10.6.0.81`: Sentinel - Queues 1
-- `10.6.0.82`: Sentinel - Queues 2
-- `10.6.0.83`: Sentinel - Queues 3
+- `10.6.0.61`: Redis - Persistent Primary
+- `10.6.0.62`: Redis - Persistent Replica 1
+- `10.6.0.63`: Redis - Persistent Replica 2
### Providing your own Redis instance
@@ -822,7 +802,7 @@ optional count argument to SPOP, which is required for [Merge Trains](../../ci/p
Note the Redis node's IP address or hostname, port, and password (if required).
These will be necessary later when configuring the [GitLab application servers](#configure-gitlab-rails).
-### Configure the Redis and Sentinel Cache cluster
+### Configure the Redis Cache cluster
This is the section where we install and set up the new Redis Cache instances.
@@ -840,8 +820,12 @@ a node and change its status from primary to replica (and vice versa).
1. Edit `/etc/gitlab/gitlab.rb` and add the contents:
```ruby
- # Specify server role as 'redis_master_role' and enable Consul agent
- roles(['redis_master_role', 'consul_role'])
+ # Specify server role as 'redis_master_role' with Sentinel and enable Consul agent
+ roles(['redis_sentinel_role', 'redis_master_role', 'consul_role'])
+
+ # Set IP bind address and Quorum number for Redis Sentinel service
+ sentinel['bind'] = '0.0.0.0'
+ sentinel['quorum'] = 2
# IP address pointing to a local IP that the other machines can reach to.
# You can also set bind to '0.0.0.0' which listen in all interfaces.
@@ -853,8 +837,19 @@ a node and change its status from primary to replica (and vice versa).
# machines to connect to it.
redis['port'] = 6379
- # Set up password authentication for Redis (use the same password in all nodes).
+ ## Port of primary Redis server for Sentinel, uncomment to change to non default. Defaults
+ ## to `6379`.
+ #redis['master_port'] = 6379
+
+ # Set up password authentication for Redis and replicas (use the same password in all nodes).
redis['password'] = 'REDIS_PRIMARY_PASSWORD_OF_FIRST_CLUSTER'
+ redis['master_password'] = 'REDIS_PRIMARY_PASSWORD_OF_FIRST_CLUSTER'
+
+ ## Must be the same in every Redis node
+ redis['master_name'] = 'gitlab-redis-cache'
+
+ ## The IP of this primary Redis node.
+ redis['master_ip'] = '10.6.0.51'
# Set the Redis Cache instance as an LRU
# 90% of available RAM in MB
@@ -888,10 +883,6 @@ a node and change its status from primary to replica (and vice versa).
1. [Reconfigure Omnibus GitLab](../restart_gitlab.md#omnibus-gitlab-reconfigure) for the changes to take effect.
-You can specify multiple roles, like sentinel and Redis, as:
-`roles(['redis_sentinel_role', 'redis_master_role'])`. Read more about
-[roles](https://docs.gitlab.com/omnibus/roles/).
-
#### Configure the replica Redis Cache nodes
1. SSH in to the **replica** Redis server.
@@ -899,11 +890,15 @@ You can specify multiple roles, like sentinel and Redis, as:
package of your choice. Be sure to both follow _only_ installation steps 1 and 2
on the page, and to select the correct Omnibus GitLab package, with the same version
and type (Community or Enterprise editions) as your current install.
-1. Edit `/etc/gitlab/gitlab.rb` and add the contents:
+1. Edit `/etc/gitlab/gitlab.rb` and add the same contents as the priimary node in the previous section by replacing `redis_master_node` with `redis_replica_node`:
```ruby
- # Specify server role as 'redis_replica_role' and enable Consul agent
- roles(['redis_replica_role', 'consul_role'])
+ # Specify server role as 'redis_replica_role' with Sentinel and enable Consul agent
+ roles(['roles_sentinel_role', 'redis_replica_role', 'consul_role'])
+
+ # Set IP bind address and Quorum number for Redis Sentinel service
+ sentinel['bind'] = '0.0.0.0'
+ sentinel['quorum'] = 2
# IP address pointing to a local IP that the other machines can reach to.
# You can also set bind to '0.0.0.0' which listen in all interfaces.
@@ -915,15 +910,19 @@ You can specify multiple roles, like sentinel and Redis, as:
# machines to connect to it.
redis['port'] = 6379
- # The same password for Redis authentication you set up for the primary node.
+ ## Port of primary Redis server for Sentinel, uncomment to change to non default. Defaults
+ ## to `6379`.
+ #redis['master_port'] = 6379
+
+ # Set up password authentication for Redis and replicas (use the same password in all nodes).
redis['password'] = 'REDIS_PRIMARY_PASSWORD_OF_FIRST_CLUSTER'
+ redis['master_password'] = 'REDIS_PRIMARY_PASSWORD_OF_FIRST_CLUSTER'
- # The IP of the primary Redis node.
- redis['master_ip'] = '10.6.0.51'
+ ## Must be the same in every Redis node
+ redis['master_name'] = 'gitlab-redis-cache'
- # Port of primary Redis server, uncomment to change to non default. Defaults
- # to `6379`.
- #redis['master_port'] = 6379
+ ## The IP of the primary Redis node.
+ redis['master_ip'] = '10.6.0.51'
# Set the Redis Cache instance as an LRU
# 90% of available RAM in MB
@@ -952,25 +951,18 @@ You can specify multiple roles, like sentinel and Redis, as:
gitlab_rails['auto_migrate'] = false
```
-1. Copy the `/etc/gitlab/gitlab-secrets.json` file from the first Omnibus node you configured and add or replace
- the file of the same name on this server. If this is the first Omnibus node you are configuring then you can skip this step.
+ 1. Copy the `/etc/gitlab/gitlab-secrets.json` file from the first Omnibus
+ node you configured and add or replace the file of the same name on this
+ server. If this is the first Omnibus node you are configuring then you
+ can skip this step.
-1. [Reconfigure Omnibus GitLab](../restart_gitlab.md#omnibus-gitlab-reconfigure) for the changes to take effect.
+ 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, and
+ 1. Go through the steps again for all the other replica nodes, and
make sure to set up the IPs correctly.
-You can specify multiple roles, like sentinel and Redis, as:
-`roles(['redis_sentinel_role', 'redis_master_role'])`. Read more about
-[roles](https://docs.gitlab.com/omnibus/roles/).
-
-These values don't have to be changed again in `/etc/gitlab/gitlab.rb` after
-a failover, as the nodes will be managed by the [Sentinels](#configure-the-sentinel-cache-nodes), and even after a
-`gitlab-ctl reconfigure`, they will get their configuration restored by
-the same Sentinels.
-
-Advanced [configuration options](https://docs.gitlab.com/omnibus/settings/redis.html)
-are supported and can be added if needed.
+ Advanced [configuration options](https://docs.gitlab.com/omnibus/settings/redis.html) are supported and can be added if needed.
<div align="right">
<a type="button" class="btn btn-default" href="#setup-components">
@@ -978,126 +970,7 @@ are supported and can be added if needed.
</a>
</div>
-#### Configure the Sentinel Cache nodes
-
-Now that the Redis servers are all set up, let's configure the Sentinel
-servers. The following IPs will be used as an example:
-
-- `10.6.0.71`: Sentinel - Cache 1
-- `10.6.0.72`: Sentinel - Cache 2
-- `10.6.0.73`: Sentinel - Cache 3
-
-NOTE:
-If you're using an external Redis Sentinel instance, be sure to exclude the
-`requirepass` parameter from the Sentinel configuration. This parameter causes
-clients to report `NOAUTH Authentication required.`.
-[Redis Sentinel 3.2.x doesn't support password authentication](https://github.com/antirez/redis/issues/3279).
-
-To configure the Sentinel Cache server:
-
-1. SSH in to the server that will host Consul/Sentinel.
-1. [Download and install](https://about.gitlab.com/install/) the Omnibus GitLab
- package of your choice. Be sure to both follow _only_ installation steps 1 and 2
- on the page, and to select the correct Omnibus GitLab package, with the same version
- and type (Community or Enterprise editions) as your current install.
-1. Edit `/etc/gitlab/gitlab.rb` and add the contents:
-
- ```ruby
- roles(['redis_sentinel_role', 'consul_role'])
-
- ## Must be the same in every sentinel node
- redis['master_name'] = 'gitlab-redis-cache'
-
- ## The same password for Redis authentication you set up for the primary node.
- redis['master_password'] = 'REDIS_PRIMARY_PASSWORD_OF_FIRST_CLUSTER'
-
- ## The IP of the primary Redis node.
- redis['master_ip'] = '10.6.0.51'
-
- ## Define a port so Redis can listen for TCP requests which will allow other
- ## machines to connect to it.
- redis['port'] = 6379
-
- ## Port of primary Redis server, uncomment to change to non default. Defaults
- ## to `6379`.
- #redis['master_port'] = 6379
-
- ## Configure Sentinel's IP
- sentinel['bind'] = '10.6.0.71'
-
- ## Port that Sentinel listens on, uncomment to change to non default. Defaults
- ## to `26379`.
- #sentinel['port'] = 26379
-
- ## Quorum must reflect the amount of voting sentinels it take to start a failover.
- ## Value must NOT be greater then the amount of sentinels.
- ##
- ## The quorum can be used to tune Sentinel in two ways:
- ## 1. If a the quorum is set to a value smaller than the majority of Sentinels
- ## we deploy, we are basically making Sentinel more sensible to primary failures,
- ## triggering a failover as soon as even just a minority of Sentinels is no longer
- ## able to talk with the primary.
- ## 1. If a quorum is set to a value greater than the majority of Sentinels, we are
- ## making Sentinel able to failover only when there are a very large number (larger
- ## than majority) of well connected Sentinels which agree about the primary being down.s
- sentinel['quorum'] = 2
-
- ## Consider unresponsive server down after x amount of ms.
- #sentinel['down_after_milliseconds'] = 10000
-
- ## Specifies the failover timeout in milliseconds. It is used in many ways:
- ##
- ## - The time needed to re-start a failover after a previous failover was
- ## already tried against the same primary by a given Sentinel, is two
- ## times the failover timeout.
- ##
- ## - The time needed for a replica replicating to a wrong primary according
- ## to a Sentinel current configuration, to be forced to replicate
- ## with the right primary, is exactly the failover timeout (counting since
- ## the moment a Sentinel detected the misconfiguration).
- ##
- ## - The time needed to cancel a failover that is already in progress but
- ## did not produced any configuration change (REPLICAOF NO ONE yet not
- ## acknowledged by the promoted replica).
- ##
- ## - The maximum time a failover in progress waits for all the replica to be
- ## reconfigured as replicas of the new primary. However even after this time
- ## the replicas will be reconfigured by the Sentinels anyway, but not with
- ## the exact parallel-syncs progression as specified.
- #sentinel['failover_timeout'] = 60000
-
- ## Enable service discovery for Prometheus
- consul['monitoring_service_discovery'] = true
-
- ## The IPs of the Consul server nodes
- ## You can also use FQDNs and intermix them with IPs
- consul['configuration'] = {
- retry_join: %w(10.6.0.11 10.6.0.12 10.6.0.13),
- }
-
- # Set the network addresses that the exporters will listen on
- node_exporter['listen_address'] = '0.0.0.0:9100'
- redis_exporter['listen_address'] = '0.0.0.0:9121'
-
- # Prevent database migrations from running on upgrade automatically
- gitlab_rails['auto_migrate'] = false
- ```
-
-1. Copy the `/etc/gitlab/gitlab-secrets.json` file from the first Omnibus node you configured and add or replace
- the file of the same name on this server. If this is the first Omnibus node you are configuring then you can skip this step.
-
-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 Consul/Sentinel nodes, and
- make sure you set up the correct IPs.
-
-<div align="right">
- <a type="button" class="btn btn-default" href="#setup-components">
- Back to setup components <i class="fa fa-angle-double-up" aria-hidden="true"></i>
- </a>
-</div>
-
-### Configure the Redis and Sentinel Queues cluster
+### Configure the Redis Persistent cluster
This is the section where we install and set up the new Redis Queues instances.
@@ -1105,7 +978,7 @@ Both the primary and replica Redis nodes need the same password defined in
`redis['password']`. At any time during a failover, the Sentinels can reconfigure
a node and change its status from primary to replica (and vice versa).
-#### Configure the primary Redis Queues node
+#### Configure the primary Redis Persistent node
1. SSH in to the **Primary** Redis server.
1. [Download and install](https://about.gitlab.com/install/) the Omnibus GitLab
@@ -1115,8 +988,12 @@ a node and change its status from primary to replica (and vice versa).
1. Edit `/etc/gitlab/gitlab.rb` and add the contents:
```ruby
- # Specify server role as 'redis_master_role' and enable Consul agent
- roles(['redis_master_role', 'consul_role'])
+ # Specify server roles as 'redis_master_role' with Sentinel and enable the Consul agent
+ roles ['redis_sentinel_role', 'redis_master_role', 'consul_role']
+
+ # Set IP bind address and Quorum number for Redis Sentinel service
+ sentinel['bind'] = '0.0.0.0'
+ sentinel['quorum'] = 2
# IP address pointing to a local IP that the other machines can reach to.
# You can also set bind to '0.0.0.0' which listen in all interfaces.
@@ -1128,8 +1005,19 @@ a node and change its status from primary to replica (and vice versa).
# machines to connect to it.
redis['port'] = 6379
- # Set up password authentication for Redis (use the same password in all nodes).
- redis['password'] = 'REDIS_PRIMARY_PASSWORD_OF_SECOND_CLUSTER'
+ ## Port of primary Redis server for Sentinel, uncomment to change to non default. Defaults
+ ## to `6379`.
+ #redis['master_port'] = 6379
+
+ # Set up password authentication for Redis and replicas (use the same password in all nodes).
+ redis['password'] = 'REDIS_PRIMARY_PASSWORD_OF_FIRST_CLUSTER'
+ redis['master_password'] = 'REDIS_PRIMARY_PASSWORD_OF_SECOND_CLUSTER'
+
+ ## Must be the same in every Redis node
+ redis['master_name'] = 'gitlab-redis-persistent'
+
+ ## The IP of this primary Redis node.
+ redis['master_ip'] = '10.6.0.61'
## Enable service discovery for Prometheus
consul['monitoring_service_discovery'] = true
@@ -1153,13 +1041,9 @@ a node and change its status from primary to replica (and vice versa).
1. [Reconfigure Omnibus GitLab](../restart_gitlab.md#omnibus-gitlab-reconfigure) for the changes to take effect.
-You can specify multiple roles, like sentinel and Redis, as:
-`roles ['redis_sentinel_role', 'redis_master_role']`. Read more about
-[roles](https://docs.gitlab.com/omnibus/roles/).
+#### Configure the replica Redis Persistent nodes
-#### Configure the replica Redis Queues nodes
-
-1. SSH in to the **replica** Redis Queue server.
+1. SSH in to the **replica** Redis Persistent server.
1. [Download and install](https://about.gitlab.com/install/) the Omnibus GitLab
package of your choice. Be sure to both follow _only_ installation steps 1 and 2
on the page, and to select the correct Omnibus GitLab package, with the same version
@@ -1167,8 +1051,12 @@ You can specify multiple roles, like sentinel and Redis, as:
1. Edit `/etc/gitlab/gitlab.rb` and add the contents:
```ruby
- # Specify server role as 'redis_replica_role' and enable Consul agent
- roles(['redis_replica_role', 'consul_role'])
+ # Specify server roles as 'redis_replica_role' with Sentinel and enable Consul agent
+ roles ['redis_sentinel_role', 'redis_replica_role', 'consul_role']
+
+ # Set IP bind address and Quorum number for Redis Sentinel service
+ sentinel['bind'] = '0.0.0.0'
+ sentinel['quorum'] = 2
# IP address pointing to a local IP that the other machines can reach to.
# You can also set bind to '0.0.0.0' which listen in all interfaces.
@@ -1180,16 +1068,20 @@ You can specify multiple roles, like sentinel and Redis, as:
# machines to connect to it.
redis['port'] = 6379
+ ## Port of primary Redis server for Sentinel, uncomment to change to non default. Defaults
+ ## to `6379`.
+ #redis['master_port'] = 6379
+
# The same password for Redis authentication you set up for the primary node.
redis['password'] = 'REDIS_PRIMARY_PASSWORD_OF_SECOND_CLUSTER'
+ redis['master_password'] = 'REDIS_PRIMARY_PASSWORD_OF_SECOND_CLUSTER'
+
+ ## Must be the same in every Redis node
+ redis['master_name'] = 'gitlab-redis-persistent'
# The IP of the primary Redis node.
redis['master_ip'] = '10.6.0.61'
- # Port of primary Redis server, uncomment to change to non default. Defaults
- # to `6379`.
- #redis['master_port'] = 6379
-
## Enable service discovery for Prometheus
consul['monitoring_service_discovery'] = true
@@ -1215,144 +1107,7 @@ You can specify multiple roles, like sentinel and Redis, as:
1. Go through the steps again for all the other replica nodes, and
make sure to set up the IPs correctly.
-You can specify multiple roles, like sentinel and Redis, as:
-`roles(['redis_sentinel_role', 'redis_master_role'])`. Read more about
-[roles](https://docs.gitlab.com/omnibus/roles/).
-
-These values don't have to be changed again in `/etc/gitlab/gitlab.rb` after
-a failover, as the nodes will be managed by the [Sentinels](#configure-the-sentinel-queues-nodes), and even after a
-`gitlab-ctl reconfigure`, they will get their configuration restored by
-the same Sentinels.
-
-Advanced [configuration options](https://docs.gitlab.com/omnibus/settings/redis.html)
-are supported and can be added if needed.
-
-<div align="right">
- <a type="button" class="btn btn-default" href="#setup-components">
- Back to setup components <i class="fa fa-angle-double-up" aria-hidden="true"></i>
- </a>
-</div>
-
-#### Configure the Sentinel Queues nodes
-
-Now that the Redis servers are all set up, let's configure the Sentinel
-servers. The following IPs will be used as an example:
-
-- `10.6.0.81`: Sentinel - Queues 1
-- `10.6.0.82`: Sentinel - Queues 2
-- `10.6.0.83`: Sentinel - Queues 3
-
-NOTE:
-If you're using an external Redis Sentinel instance, be sure to exclude the
-`requirepass` parameter from the Sentinel configuration. This parameter causes
-clients to report `NOAUTH Authentication required.`.
-[Redis Sentinel 3.2.x doesn't support password authentication](https://github.com/antirez/redis/issues/3279).
-
-To configure the Sentinel Queues server:
-
-1. SSH in to the server that will host Sentinel.
-1. [Download and install](https://about.gitlab.com/install/) the Omnibus GitLab
- package of your choice. Be sure to both follow _only_ installation steps 1 and 2
- on the page, and to select the correct Omnibus GitLab package, with the same version
- and type (Community or Enterprise editions) as your current install.
-1. Edit `/etc/gitlab/gitlab.rb` and add the contents:
-
- ```ruby
- roles(['redis_sentinel_role', 'consul_role'])
-
- ## Must be the same in every sentinel node
- redis['master_name'] = 'gitlab-redis-persistent'
-
- ## The same password for Redis authentication you set up for the primary node.
- redis['master_password'] = 'REDIS_PRIMARY_PASSWORD_OF_SECOND_CLUSTER'
-
- ## The IP of the primary Redis node.
- redis['master_ip'] = '10.6.0.61'
-
- ## Define a port so Redis can listen for TCP requests which will allow other
- ## machines to connect to it.
- redis['port'] = 6379
-
- ## Port of primary Redis server, uncomment to change to non default. Defaults
- ## to `6379`.
- #redis['master_port'] = 6379
-
- ## Configure Sentinel's IP
- sentinel['bind'] = '10.6.0.81'
-
- ## Port that Sentinel listens on, uncomment to change to non default. Defaults
- ## to `26379`.
- #sentinel['port'] = 26379
-
- ## Quorum must reflect the amount of voting sentinels it take to start a failover.
- ## Value must NOT be greater then the amount of sentinels.
- ##
- ## The quorum can be used to tune Sentinel in two ways:
- ## 1. If a the quorum is set to a value smaller than the majority of Sentinels
- ## we deploy, we are basically making Sentinel more sensible to primary failures,
- ## triggering a failover as soon as even just a minority of Sentinels is no longer
- ## able to talk with the primary.
- ## 1. If a quorum is set to a value greater than the majority of Sentinels, we are
- ## making Sentinel able to failover only when there are a very large number (larger
- ## than majority) of well connected Sentinels which agree about the primary being down.s
- sentinel['quorum'] = 2
-
- ## Consider unresponsive server down after x amount of ms.
- #sentinel['down_after_milliseconds'] = 10000
-
- ## Specifies the failover timeout in milliseconds. It is used in many ways:
- ##
- ## - The time needed to re-start a failover after a previous failover was
- ## already tried against the same primary by a given Sentinel, is two
- ## times the failover timeout.
- ##
- ## - The time needed for a replica replicating to a wrong primary according
- ## to a Sentinel current configuration, to be forced to replicate
- ## with the right primary, is exactly the failover timeout (counting since
- ## the moment a Sentinel detected the misconfiguration).
- ##
- ## - The time needed to cancel a failover that is already in progress but
- ## did not produced any configuration change (REPLICAOF NO ONE yet not
- ## acknowledged by the promoted replica).
- ##
- ## - The maximum time a failover in progress waits for all the replica to be
- ## reconfigured as replicas of the new primary. However even after this time
- ## the replicas will be reconfigured by the Sentinels anyway, but not with
- ## the exact parallel-syncs progression as specified.
- #sentinel['failover_timeout'] = 60000
-
- ## Enable service discovery for Prometheus
- consul['monitoring_service_discovery'] = true
-
- ## The IPs of the Consul server nodes
- ## You can also use FQDNs and intermix them with IPs
- consul['configuration'] = {
- retry_join: %w(10.6.0.11 10.6.0.12 10.6.0.13),
- }
-
- # Set the network addresses that the exporters will listen on
- node_exporter['listen_address'] = '0.0.0.0:9100'
- redis_exporter['listen_address'] = '0.0.0.0:9121'
-
- # Prevent database migrations from running on upgrade automatically
- gitlab_rails['auto_migrate'] = false
- ```
-
-1. To ensure database migrations are only run during reconfigure and not automatically on upgrade, run:
-
- ```shell
- sudo touch /etc/gitlab/skip-auto-reconfigure
- ```
-
- Only the primary GitLab application server should handle migrations.
-
-1. Copy the `/etc/gitlab/gitlab-secrets.json` file from the first Omnibus node you configured and add or replace
- the file of the same name on this server. If this is the first Omnibus node you are configuring then you can skip this step.
-
-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 Sentinel nodes, and
- make sure you set up the correct IPs.
+Advanced [configuration options](https://docs.gitlab.com/omnibus/settings/redis.html) are supported and can be added if needed.
<div align="right">
<a type="button" class="btn btn-default" href="#setup-components">
@@ -1365,6 +1120,10 @@ To configure the Sentinel Queues server:
[Gitaly Cluster](../gitaly/praefect.md) is a GitLab provided and recommended fault tolerant solution for storing Git repositories.
In this configuration, every Git repository is stored on every Gitaly node in the cluster, with one being designated the primary, and failover occurs automatically if the primary node goes down.
+NOTE:
+Gitaly Cluster provides the benefits of fault tolerance, but comes with additional complexity of setup and management. Please [review the existing technical limitations and considerations prior to deploying Gitaly Cluster](../gitaly/index.md#guidance-regarding-gitaly-cluster).
+For implementations with Gitaly Sharded, the same Gitaly specs should be used. Follow the [separate Gitaly documentation](../gitaly/configure_gitaly.md) instead of this section.
+
The recommended cluster setup includes the following components:
- 3 Gitaly nodes: Replicated storage of Git repositories.
@@ -1531,7 +1290,7 @@ the details of each Gitaly node that makes up the cluster. Each storage is also
and this name is used in several areas of the configuration. In this guide, the name of the storage will be
`default`. Also, this guide is geared towards new installs, if upgrading an existing environment
to use Gitaly Cluster, you may need to use a different name.
-Refer to the [Praefect documentation](../gitaly/praefect.md#praefect) for more info.
+Refer to the [Praefect documentation](../gitaly/praefect.md#praefect) for more information.
The following IPs will be used as an example:
@@ -1858,7 +1617,7 @@ To configure the Sidekiq nodes, on each one:
1. [Download and install](https://about.gitlab.com/install/) the Omnibus GitLab
package of your choice. Be sure to follow _only_ installation steps 1 and 2
on the page.
-1. Open `/etc/gitlab/gitlab.rb` with your editor:
+1. Create or edit `/etc/gitlab/gitlab.rb` and use the following configuration:
```ruby
# Avoid running unnecessary services on the Sidekiq server
@@ -1873,36 +1632,40 @@ To configure the Sidekiq nodes, on each one:
gitlab_exporter['enable'] = false
nginx['enable'] = false
+ # External URL
+ ## This should match the URL of the external load balancer
+ external_url 'https://gitlab.example.com'
+
# Redis
## Redis connection details
## First cluster that will host the cache
gitlab_rails['redis_cache_instance'] = 'redis://:<REDIS_PRIMARY_PASSWORD_OF_FIRST_CLUSTER>@gitlab-redis-cache'
gitlab_rails['redis_cache_sentinels'] = [
- {host: '10.6.0.71', port: 26379},
- {host: '10.6.0.72', port: 26379},
- {host: '10.6.0.73', port: 26379},
+ {host: '10.6.0.51', port: 26379},
+ {host: '10.6.0.52', port: 26379},
+ {host: '10.6.0.53', port: 26379},
]
- ## Second cluster that will host the queues, shared state, and actioncable
+ ## 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'
gitlab_rails['redis_queues_sentinels'] = [
- {host: '10.6.0.81', port: 26379},
- {host: '10.6.0.82', port: 26379},
- {host: '10.6.0.83', port: 26379},
+ {host: '10.6.0.61', port: 26379},
+ {host: '10.6.0.62', port: 26379},
+ {host: '10.6.0.63', port: 26379},
]
gitlab_rails['redis_shared_state_sentinels'] = [
- {host: '10.6.0.81', port: 26379},
- {host: '10.6.0.82', port: 26379},
- {host: '10.6.0.83', port: 26379},
+ {host: '10.6.0.61', port: 26379},
+ {host: '10.6.0.62', port: 26379},
+ {host: '10.6.0.63', port: 26379},
]
gitlab_rails['redis_actioncable_sentinels'] = [
- {host: '10.6.0.81', port: 26379},
- {host: '10.6.0.82', port: 26379},
- {host: '10.6.0.83', port: 26379},
+ {host: '10.6.0.61', port: 26379},
+ {host: '10.6.0.62', port: 26379},
+ {host: '10.6.0.63', port: 26379},
]
# Gitaly
@@ -2063,30 +1826,30 @@ On each node perform the following:
gitlab_rails['redis_cache_instance'] = 'redis://:<REDIS_PRIMARY_PASSWORD_OF_FIRST_CLUSTER>@gitlab-redis-cache'
gitlab_rails['redis_cache_sentinels'] = [
- {host: '10.6.0.71', port: 26379},
- {host: '10.6.0.72', port: 26379},
- {host: '10.6.0.73', port: 26379},
+ {host: '10.6.0.51', port: 26379},
+ {host: '10.6.0.52', port: 26379},
+ {host: '10.6.0.53', port: 26379},
]
- ## Second cluster that will host the queues, shared state, and actionable
+ ## Second cluster that will host the persistent queues, shared state, and actionable
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'
gitlab_rails['redis_queues_sentinels'] = [
- {host: '10.6.0.81', port: 26379},
- {host: '10.6.0.82', port: 26379},
- {host: '10.6.0.83', port: 26379},
+ {host: '10.6.0.61', port: 26379},
+ {host: '10.6.0.62', port: 26379},
+ {host: '10.6.0.63', port: 26379},
]
gitlab_rails['redis_shared_state_sentinels'] = [
- {host: '10.6.0.81', port: 26379},
- {host: '10.6.0.82', port: 26379},
- {host: '10.6.0.83', port: 26379},
+ {host: '10.6.0.61', port: 26379},
+ {host: '10.6.0.62', port: 26379},
+ {host: '10.6.0.63', port: 26379},
]
gitlab_rails['redis_actioncable_sentinels'] = [
- {host: '10.6.0.81', port: 26379},
- {host: '10.6.0.82', port: 26379},
- {host: '10.6.0.83', port: 26379},
+ {host: '10.6.0.61', port: 26379},
+ {host: '10.6.0.62', port: 26379},
+ {host: '10.6.0.63', port: 26379},
]
# Set the network addresses that the exporters used for monitoring will listen on
@@ -2158,7 +1921,7 @@ On each node perform the following:
1. [Reconfigure GitLab](../restart_gitlab.md#omnibus-gitlab-reconfigure) for the changes to take effect.
-1. If you're [using NFS](#configure-nfs-optional):
+1. If you're [using NFS](#configure-nfs):
1. If necessary, install the NFS client utility packages using the following
commands:
@@ -2300,7 +2063,7 @@ To configure the Monitoring node:
## Configure the object storage
GitLab supports using an object storage service for holding numerous types of data.
-It's recommended over [NFS](#configure-nfs-optional) and in general it's better
+It's recommended over [NFS](#configure-nfs) and in general it's better
in larger setups as object storage is typically much more performant, reliable,
and scalable.
@@ -2324,6 +2087,9 @@ There are two ways of specifying object storage configuration in GitLab:
Starting with GitLab 13.2, consolidated object storage configuration is available. It simplifies your GitLab configuration since the connection details are shared across object types. Refer to [Consolidated object storage configuration](../object_storage.md#consolidated-object-storage-configuration) guide for instructions on how to set it up.
+GitLab Runner returns job logs in chunks which Omnibus GitLab caches temporarily on disk in `/var/opt/gitlab/gitlab-ci/builds` by default, even when using consolidated object storage. With default configuration, this directory needs to be shared via NFS on any GitLab Rails and Sidekiq nodes.
+In GitLab 13.6 and later, it's recommended to switch to [Incremental logging](../job_logs.md#incremental-logging-architecture), which uses Redis instead of disk space for temporary caching of job logs.
+
For configuring object storage in GitLab 13.1 and earlier, or for storage types not
supported by consolidated configuration form, refer to the following guides based
on what features you intend to use:
@@ -2370,7 +2136,7 @@ cluster alongside your instance, read how to
</a>
</div>
-## Configure NFS (optional)
+## Configure NFS
[Object storage](#configure-the-object-storage), along with [Gitaly](#configure-gitaly)
are recommended over NFS wherever possible for improved performance. If you intend
@@ -2384,7 +2150,7 @@ unavailable from GitLab 15.0. No further enhancements are planned for this featu
Read:
-- The [Gitaly and NFS deprecation notice](../gitaly/index.md#nfs-deprecation-notice).
+- [Gitaly and NFS Deprecation](../nfs.md#gitaly-and-nfs-deprecation).
- About the [correct mount options to use](../nfs.md#upgrade-to-gitaly-cluster-or-disable-caching-if-experiencing-data-loss).
## Cloud Native Hybrid reference architecture with Helm Charts (alternative)
@@ -2438,12 +2204,10 @@ services where applicable):
| PostgreSQL<sup>1</sup> | 3 | 32 vCPU, 120 GB memory | `n1-standard-32` |
| PgBouncer<sup>1</sup> | 3 | 2 vCPU, 1.8 GB memory | `n1-highcpu-2` |
| Internal load balancing node<sup>3</sup> | 1 | 8 vCPU, 7.2 GB memory | `n1-highcpu-8` |
-| Redis - Cache<sup>2</sup> | 3 | 4 vCPU, 15 GB memory | `n1-standard-4` |
-| Redis - Queues / Shared State<sup>2</sup> | 3 | 4 vCPU, 15 GB memory | `n1-standard-4` |
-| Redis Sentinel - Cache<sup>2</sup> | 3 | 1 vCPU, 3.75 GB memory | `n1-standard-1` |
-| Redis Sentinel - Queues / Shared State<sup>2</sup> | 3 | 1 vCPU, 3.75 GB memory | `n1-standard-1` |
-| Gitaly | 3 | 64 vCPU, 240 GB memory | `n1-standard-64` |
-| Praefect | 3 | 4 vCPU, 3.6 GB memory | `n1-highcpu-4` |
+| Redis/Sentinel - Cache<sup>2</sup> | 3 | 4 vCPU, 15 GB memory | `n1-standard-4` |
+| Redis/Sentinel - Persistent<sup>2</sup> | 3 | 4 vCPU, 15 GB memory | `n1-standard-4` |
+| Gitaly<sup>5</sup> | 3 | 64 vCPU, 240 GB memory | `n1-standard-64` |
+| Praefect<sup>5</sup> | 3 | 4 vCPU, 3.6 GB memory | `n1-highcpu-4` |
| Praefect PostgreSQL<sup>1</sup> | 1+ | 2 vCPU, 1.8 GB memory | `n1-highcpu-2` |
| Object storage<sup>4</sup> | n/a | n/a | n/a |
@@ -2453,6 +2217,7 @@ services where applicable):
2. Can be optionally run on reputable third-party external PaaS Redis solutions. Google Memorystore and AWS Elasticache are known to work.
3. Can be optionally run on reputable third-party load balancing services (LB PaaS). AWS ELB is known to work.
4. Should be run on reputable third-party object storage (storage PaaS) for cloud implementations. Google Cloud Storage and AWS S3 are known to work.
+5. Gitaly Cluster provides the benefits of fault tolerance, but comes with additional complexity of setup and management. Please [review the existing technical limitations and considerations prior to deploying Gitaly Cluster](../gitaly/index.md#guidance-regarding-gitaly-cluster). If Gitaly Sharded is desired, the same specs listed above for `Gitaly` should be used.
<!-- markdownlint-enable MD029 -->
NOTE:
@@ -2497,11 +2262,6 @@ card "Database" as database {
card "redis" as redis {
collections "**Redis Persistent** x3" as redis_persistent #FF6347
collections "**Redis Cache** x3" as redis_cache #FF6347
- collections "**Redis Persistent Sentinel** x3" as redis_persistent_sentinel #FF6347
- collections "**Redis Cache Sentinel** x3"as redis_cache_sentinel #FF6347
-
- redis_persistent <.[#FF6347]- redis_persistent_sentinel
- redis_cache <.[#FF6347]- redis_cache_sentinel
}
cloud "**Object Storage**" as object_storage #white
diff --git a/doc/administration/reference_architectures/5k_users.md b/doc/administration/reference_architectures/5k_users.md
index 4dfe628039a..a5526986be1 100644
--- a/doc/administration/reference_architectures/5k_users.md
+++ b/doc/administration/reference_architectures/5k_users.md
@@ -19,6 +19,7 @@ costly-to-operate environment by using the
> - **Supported users (approximate):** 5,000
> - **High Availability:** Yes ([Praefect](#configure-praefect-postgresql) needs a third-party PostgreSQL solution for HA)
+> - **Cloud Native Hybrid:** [Yes](#cloud-native-hybrid-reference-architecture-with-helm-charts-alternative)
> - **Test requests per second (RPS) rates:** API: 100 RPS, Web: 10 RPS, Git (Pull): 10 RPS, Git (Push): 2 RPS
> - **[Latest 5k weekly performance testing results](https://gitlab.com/gitlab-org/quality/performance/-/wikis/Benchmarks/Latest/5k)**
@@ -30,8 +31,8 @@ costly-to-operate environment by using the
| PostgreSQL<sup>1</sup> | 3 | 4 vCPU, 15 GB memory | `n1-standard-4` | `m5.xlarge` | `D4s v3` |
| PgBouncer<sup>1</sup> | 3 | 2 vCPU, 1.8 GB memory | `n1-highcpu-2` | `c5.large` | `F2s v2` |
| Internal load balancing node<sup>3</sup> | 1 | 2 vCPU, 1.8 GB memory | `n1-highcpu-2` | `c5.large` | `F2s v2` |
-| Gitaly | 3 | 8 vCPU, 30 GB memory | `n1-standard-8` | `m5.2xlarge` | `D8s v3` |
-| Praefect | 3 | 2 vCPU, 1.8 GB memory | `n1-highcpu-2` | `c5.large` | `F2s v2` |
+| Gitaly<sup>5</sup> | 3 | 8 vCPU, 30 GB memory | `n1-standard-8` | `m5.2xlarge` | `D8s v3` |
+| Praefect<sup>5</sup> | 3 | 2 vCPU, 1.8 GB memory | `n1-highcpu-2` | `c5.large` | `F2s v2` |
| Praefect PostgreSQL<sup>1</sup> | 1+ | 2 vCPU, 1.8 GB memory | `n1-highcpu-2` | `c5.large` | `F2s v2` |
| Sidekiq | 4 | 2 vCPU, 7.5 GB memory | `n1-standard-2` | `m5.large` | `D2s v3` |
| GitLab Rails | 3 | 16 vCPU, 14.4 GB memory | `n1-highcpu-16` | `c5.4xlarge` | `F16s v2`|
@@ -45,6 +46,7 @@ costly-to-operate environment by using the
2. Can be optionally run on reputable third-party external PaaS Redis solutions. Google Memorystore and AWS Elasticache are known to work.
3. Can be optionally run on reputable third-party load balancing services (LB PaaS). AWS ELB is known to work.
4. Should be run on reputable third-party object storage (storage PaaS) for cloud implementations. Google Cloud Storage and AWS S3 are known to work.
+5. Gitaly Cluster provides the benefits of fault tolerance, but comes with additional complexity of setup and management. Please [review the existing technical limitations and considerations prior to deploying Gitaly Cluster](../gitaly/index.md#guidance-regarding-gitaly-cluster). If Gitaly Sharded is desired, the same specs listed above for `Gitaly` should be used.
<!-- markdownlint-enable MD029 -->
NOTE:
@@ -1056,6 +1058,10 @@ The following IPs will be used as an example:
[Gitaly Cluster](../gitaly/praefect.md) is a GitLab provided and recommended fault tolerant solution for storing Git repositories.
In this configuration, every Git repository is stored on every Gitaly node in the cluster, with one being designated the primary, and failover occurs automatically if the primary node goes down.
+NOTE:
+Gitaly Cluster provides the benefits of fault tolerance, but comes with additional complexity of setup and management. Please [review the existing technical limitations and considerations prior to deploying Gitaly Cluster](../gitaly/index.md#guidance-regarding-gitaly-cluster).
+For implementations with Gitaly Sharded, the same Gitaly specs should be used. Follow the [separate Gitaly documentation](../gitaly/configure_gitaly.md) instead of this section.
+
The recommended cluster setup includes the following components:
- 3 Gitaly nodes: Replicated storage of Git repositories.
@@ -1222,7 +1228,7 @@ the details of each Gitaly node that makes up the cluster. Each storage is also
and this name is used in several areas of the configuration. In this guide, the name of the storage will be
`default`. Also, this guide is geared towards new installs, if upgrading an existing environment
to use Gitaly Cluster, you may need to use a different name.
-Refer to the [Praefect documentation](../gitaly/praefect.md#praefect) for more info.
+Refer to the [Praefect documentation](../gitaly/praefect.md#praefect) for more information.
The following IPs will be used as an example:
@@ -1549,7 +1555,7 @@ To configure the Sidekiq nodes, one each one:
1. [Download and install](https://about.gitlab.com/install/) the Omnibus GitLab
package of your choice. Be sure to follow _only_ installation steps 1 and 2
on the page.
-1. Open `/etc/gitlab/gitlab.rb` with your editor:
+1. Create or edit `/etc/gitlab/gitlab.rb` and use the following configuration:
```ruby
# Avoid running unnecessary services on the Sidekiq server
@@ -1564,6 +1570,10 @@ To configure the Sidekiq nodes, one each one:
gitlab_exporter['enable'] = false
nginx['enable'] = false
+ # External URL
+ ## This should match the URL of the external load balancer
+ external_url 'https://gitlab.example.com'
+
# Redis
## Must be the same in every sentinel node
redis['master_name'] = 'gitlab-redis'
@@ -2005,6 +2015,9 @@ There are two ways of specifying object storage configuration in GitLab:
Starting with GitLab 13.2, consolidated object storage configuration is available. It simplifies your GitLab configuration since the connection details are shared across object types. Refer to [Consolidated object storage configuration](../object_storage.md#consolidated-object-storage-configuration) guide for instructions on how to set it up.
+GitLab Runner returns job logs in chunks which Omnibus GitLab caches temporarily on disk in `/var/opt/gitlab/gitlab-ci/builds` by default, even when using consolidated object storage. With default configuration, this directory needs to be shared via NFS on any GitLab Rails and Sidekiq nodes.
+In GitLab 13.6 and later, it's recommended to switch to [Incremental logging](../job_logs.md#incremental-logging-architecture), which uses Redis instead of disk space for temporary caching of job logs.
+
For configuring object storage in GitLab 13.1 and earlier, or for storage types not
supported by consolidated configuration form, refer to the following guides based
on what features you intend to use:
@@ -2065,7 +2078,7 @@ unavailable from GitLab 15.0. No further enhancements are planned for this featu
Read:
-- The [Gitaly and NFS deprecation notice](../gitaly/index.md#nfs-deprecation-notice).
+- [Gitaly and NFS Deprecation](../nfs.md#gitaly-and-nfs-deprecation).
- About the [correct mount options to use](../nfs.md#upgrade-to-gitaly-cluster-or-disable-caching-if-experiencing-data-loss).
## Cloud Native Hybrid reference architecture with Helm Charts (alternative)
@@ -2120,8 +2133,8 @@ services where applicable):
| PostgreSQL<sup>1</sup> | 3 | 4 vCPU, 15 GB memory | `n1-standard-4` |
| PgBouncer<sup>1</sup> | 3 | 2 vCPU, 1.8 GB memory | `n1-highcpu-2` |
| Internal load balancing node<sup>3</sup> | 1 | 2 vCPU, 1.8 GB memory | `n1-highcpu-2` |
-| Gitaly | 3 | 8 vCPU, 30 GB memory | `n1-standard-8` |
-| Praefect | 3 | 2 vCPU, 1.8 GB memory | `n1-highcpu-2` |
+| Gitaly<sup>5</sup> | 3 | 8 vCPU, 30 GB memory | `n1-standard-8` |
+| Praefect<sup>5</sup> | 3 | 2 vCPU, 1.8 GB memory | `n1-highcpu-2` |
| Praefect PostgreSQL<sup>1</sup> | 1+ | 2 vCPU, 1.8 GB memory | `n1-highcpu-2` |
| Object storage<sup>4</sup> | n/a | n/a | n/a |
@@ -2131,6 +2144,7 @@ services where applicable):
2. Can be optionally run on reputable third-party external PaaS Redis solutions. Google Memorystore and AWS Elasticache are known to work.
3. Can be optionally run on reputable third-party load balancing services (LB PaaS). AWS ELB is known to work.
4. Should be run on reputable third-party object storage (storage PaaS) for cloud implementations. Google Cloud Storage and AWS S3 are known to work.
+5. Gitaly Cluster provides the benefits of fault tolerance, but comes with additional complexity of setup and management. Please [review the existing technical limitations and considerations prior to deploying Gitaly Cluster](../gitaly/index.md#guidance-regarding-gitaly-cluster). If Gitaly Sharded is desired, the same specs listed above for `Gitaly` should be used.
<!-- markdownlint-enable MD029 -->
NOTE:
diff --git a/doc/administration/reply_by_email.md b/doc/administration/reply_by_email.md
index c249f48b768..055f40ead64 100644
--- a/doc/administration/reply_by_email.md
+++ b/doc/administration/reply_by_email.md
@@ -45,6 +45,8 @@ following headers, in this order:
1. `To` header
1. `References` header
+1. `Delivered-To` header
+1. `Envelope-To` header
If it finds a reply key, it leaves your reply as a comment on
the entity the notification was about (issue, merge request, commit...).
diff --git a/doc/administration/repository_storage_paths.md b/doc/administration/repository_storage_paths.md
index e7edfb9f338..ed50d0e7263 100644
--- a/doc/administration/repository_storage_paths.md
+++ b/doc/administration/repository_storage_paths.md
@@ -11,9 +11,10 @@ GitLab stores [repositories](../user/project/repository/index.md) on repository
storage is either:
- A `gitaly_address`, which points to a [Gitaly node](gitaly/index.md).
-- A `path`, which points directly to the directory where the repositories are stored. This method is
- deprecated and [scheduled to be removed](https://gitlab.com/gitlab-org/gitaly/-/issues/1690) in
- GitLab 14.0.
+- A `path`, which points directly to the directory where the repositories are stored. GitLab
+ directly accessing a directory containing repositories
+ [is deprecated](https://gitlab.com/gitlab-org/gitaly/-/issues/1690).
+ GitLab should be configured to access GitLab repositories though a `gitaly_address`.
GitLab allows you to define multiple repository storages to distribute the storage load between
several mount points. For example:
@@ -173,4 +174,4 @@ information.
## Move repositories
To move a repository to a different repository storage (for example, from `default` to `storage2`), use the
-same process as [migrating to Gitaly Cluster](gitaly/index.md#migrate-to-gitaly-cluster).
+same process as [migrating to Gitaly Cluster](gitaly/index.md#migrating-to-gitaly-cluster).
diff --git a/doc/administration/sidekiq.md b/doc/administration/sidekiq.md
index e753832f2c3..4aee88ed9cb 100644
--- a/doc/administration/sidekiq.md
+++ b/doc/administration/sidekiq.md
@@ -104,6 +104,16 @@ you want using steps 1 and 2 from the GitLab downloads page.
You must also copy the `registry.key` file to each Sidekiq node.
+1. Define the `external_url`. To maintain uniformity of links across nodes, the
+ `external_url` on the Sidekiq server should point to the external URL that users
+ will use to access GitLab. This will either be the `external_url` set on your
+ application server or the URL of a external load balancer which will route traffic
+ to the GitLab application server:
+
+ ```ruby
+ external_url 'https://gitlab.example.com'
+ ```
+
1. Run `gitlab-ctl reconfigure`.
You will need to restart the Sidekiq nodes after an update has occurred and database
@@ -194,6 +204,9 @@ gitlab_rails['monitoring_whitelist'] = ['10.10.1.42', '127.0.0.1']
# Container Registry URL for cleanup jobs
registry_external_url 'https://registry.example.com'
gitlab_rails['registry_api_url'] = "https://registry.example.com"
+
+# External URL (this should match the URL used to access your GitLab instance)
+external_url 'https://gitlab.example.com'
```
## Further reading
diff --git a/doc/administration/smime_signing_email.md b/doc/administration/smime_signing_email.md
index ebc1723076b..8fdd87a5b2d 100644
--- a/doc/administration/smime_signing_email.md
+++ b/doc/administration/smime_signing_email.md
@@ -69,16 +69,16 @@ The key needs to be readable by the GitLab system user (`git` by default).
The key needs to be readable by the GitLab system user (`git` by default).
-### How to convert S/MIME PKCS#12 / PFX format to PEM encoding
+### How to convert S/MIME PKCS #12 format to PEM encoding
-Typically S/MIME certificates are handled in binary PKCS#12 format (`.pfx` or `.p12`
-extensions), which contain the following in a single encrypted file:
+Typically S/MIME certificates are handled in binary Public Key Cryptography Standards (PKCS) #12 format
+(`.pfx` or `.p12` extensions), which contain the following in a single encrypted file:
- Public certificate
- Intermediate certificates (if any)
- Private key
-To export the required files in PEM encoding from the PKCS#12 file, the
+To export the required files in PEM encoding from the PKCS #12 file, the
`openssl` command can be used:
```shell
diff --git a/doc/administration/timezone.md b/doc/administration/timezone.md
index b6076c8ed26..f4339263d34 100644
--- a/doc/administration/timezone.md
+++ b/doc/administration/timezone.md
@@ -14,22 +14,22 @@ The global time zone configuration parameter can be changed in `config/gitlab.ym
Uncomment and customize if you want to change the default time zone of the GitLab application.
-## Viewing available timezones
+## Viewing available time zones
To see all available time zones, run `bundle exec rake time:zones:all`.
For Omnibus installations, run `gitlab-rake time:zones:all`.
NOTE:
-This Rake task does not list timezones in TZInfo format required by Omnibus GitLab during a reconfigure: [#27209](https://gitlab.com/gitlab-org/gitlab/-/issues/27209).
+This Rake task does not list time zones in TZInfo format required by Omnibus GitLab during a reconfigure: [#27209](https://gitlab.com/gitlab-org/gitlab/-/issues/27209).
## Changing time zone in Omnibus installations
-GitLab defaults its time zone to UTC. It has a global timezone configuration parameter in `/etc/gitlab/gitlab.rb`.
+GitLab defaults its time zone to UTC. It has a global time zone configuration parameter in `/etc/gitlab/gitlab.rb`.
-To obtain a list of timezones, log in to your GitLab application server and run a command that generates a list of timezones in TZInfo format for the server. For example, install `timedatectl` and run `timedatectl list-timezones`.
+To obtain a list of time zones, log in to your GitLab application server and run a command that generates a list of time zones in TZInfo format for the server. For example, install `timedatectl` and run `timedatectl list-timezones`.
-To update, add the timezone that best applies to your location. For example:
+To update, add the time zone that best applies to your location. For example:
```ruby
gitlab_rails['time_zone'] = 'America/New_York'
@@ -48,8 +48,12 @@ gitlab-ctl restart
> - [Enabled by default](https://gitlab.com/gitlab-org/gitlab/-/issues/29669) in GitLab 13.9.
> - [Feature flag removed](https://gitlab.com/gitlab-org/gitlab/-/issues/29669) in GitLab 14.1.
-A user can set their time zone in their profile. If a user has not set their time zone, it defaults
-to the time zone [configured at the instance level](#changing-your-time-zone). On GitLab.com, the
-default time zone is UTC.
+Users can set their time zone in their profile. On GitLab.com, the default time zone is UTC.
+
+New users do not have a default time zone in [GitLab 14.4 and later](https://gitlab.com/gitlab-org/gitlab/-/issues/340795). New users must
+explicitly set their time zone before it displays on their profile.
+
+In GitLab 14.3 and earlier, users with no configured time zone default to the time zone
+[configured at the instance level](#changing-your-time-zone).
For more information, see [Set your time zone](../user/profile/index.md#set-your-time-zone).
diff --git a/doc/administration/troubleshooting/debug.md b/doc/administration/troubleshooting/debug.md
index aea891b8a77..e00243aca0a 100644
--- a/doc/administration/troubleshooting/debug.md
+++ b/doc/administration/troubleshooting/debug.md
@@ -225,7 +225,7 @@ gitlab_rails['env'] = {
```
For source installations, set the environment variable.
-Refer to [Puma Worker timeout](https://docs.gitlab.com/omnibus/settings/puma.html#worker-timeout).
+Refer to [Puma Worker timeout](../operations/puma.md#worker-timeout).
[Reconfigure](../restart_gitlab.md#omnibus-gitlab-reconfigure) GitLab for the changes to take effect.
diff --git a/doc/administration/troubleshooting/gitlab_rails_cheat_sheet.md b/doc/administration/troubleshooting/gitlab_rails_cheat_sheet.md
index 491db37d9da..109f451be5a 100644
--- a/doc/administration/troubleshooting/gitlab_rails_cheat_sheet.md
+++ b/doc/administration/troubleshooting/gitlab_rails_cheat_sheet.md
@@ -26,7 +26,7 @@ As GitLab changes, changes to the code are inevitable,
and so some scripts may not work as they once used to. These are not kept
up-to-date as these scripts/commands were added as they were found/needed. As
mentioned above, we recommend running these scripts under the supervision of a
-Support Engineer, who can also verify that they will continue to work as they
+Support Engineer, who can also verify that they continue to work as they
should and, if needed, update the script for the latest version of GitLab.
## Find specific methods for an object
@@ -38,8 +38,6 @@ Array.methods.grep(/sing/)
## Find method source
-Works for [non-instrumented methods](../../development/instrumentation.md#checking-instrumented-methods):
-
```ruby
instance_of_object.method(:foo).source_location
@@ -187,7 +185,7 @@ Project.update_all(visibility_level: 0)
```ruby
#
-# This section will list all the projects which are pending deletion
+# This section lists all the projects which are pending deletion
#
projects = Project.where(pending_delete: true)
projects.each do |p|
@@ -197,7 +195,7 @@ projects.each do |p|
end
#
-# Assign a user (the root user will do)
+# Assign a user (the root user does)
#
user = User.find_by_username('root')
@@ -257,7 +255,7 @@ namespace = Namespace.find_by_full_path("<new_namespace>")
### For Removing webhooks that is getting timeout due to large webhook logs
```ruby
-# ID will be the webhook_id
+# ID is the webhook_id
hook=WebHook.find(ID)
WebHooks::DestroyService.new(current_user).execute(hook)
@@ -399,7 +397,7 @@ projects = Project.find_by_sql("SELECT * FROM projects WHERE name LIKE '%ject'")
### Recreate
WARNING:
-This is a destructive operation, the Wiki will be empty.
+This is a destructive operation, the Wiki becomes empty.
A Projects Wiki can be recreated by this command:
@@ -476,13 +474,13 @@ Projects::ImportExport::ExportService.new(project, user).execute
If the project you wish to export is available at `https://gitlab.example.com/baltig/pipeline-templates`, the value to use for `PROJECT_PATH` would be `baltig/pipeline-templates`.
-If this all runs successfully, you will see output like the following before being returned to the Rails console prompt:
+If this all runs successfully, you see an output like the following before being returned to the Rails console prompt:
```ruby
=> nil
```
-The exported project will be located within a `.tar.gz` file in `/var/opt/gitlab/gitlab-rails/uploads/-/system/import_export_upload/export_file/`.
+The exported project is located within a `.tar.gz` file in `/var/opt/gitlab/gitlab-rails/uploads/-/system/import_export_upload/export_file/`.
## Repository
@@ -490,27 +488,29 @@ The exported project will be located within a `.tar.gz` file in `/var/opt/gitlab
If it seems that a commit has gone "missing", search the sequence of pushes to a repository.
[This StackOverflow article](https://stackoverflow.com/questions/13468027/the-mystery-of-the-missing-commit-across-merges)
-describes how you can end up in this state without a force push.
+describes how you can end up in this state without a force push. Another cause can be a misconfigured [server hook](../server_hooks.md) that changes a HEAD ref via a `git reset` operation.
+
+If you look at the output from the sample code below for the target branch, you
+see a discontinuity in the from/to commits as you step through the output. The `commit_from` of each new push should equal the `commit_to` of the previous push. A break in that sequence indicates one or more commits have been "lost" from the repository history.
-If you look at the output from the sample code below for the target branch, you will
-see a discontinuity in the from/to commits as you step through the output. Each new
-push should be "from" the "to" SHA of the previous push. When this discontinuity happens,
-you will see two pushes with the same "from" SHA:
+The following example checks the last 100 pushes and prints the `commit_from` and `commit_to` entries:
```ruby
-p = Project.find_with_namespace('u/p')
+p = Project.find_by_full_path('u/p')
p.events.pushed_action.last(100).each do |e|
- printf "%-20.20s %8s...%8s (%s)\n", e.data[:ref], e.data[:before], e.data[:after], e.author.try(:username)
+ printf "%-20.20s %8s...%8s (%s)
+", e.push_event_payload[:ref], e.push_event_payload[:commit_from], e.push_event_payload[:commit_to], e.author.try(:username)
end
```
-GitLab 9.5 and above:
+Example output showing break in sequence at line 4:
-```ruby
-p = Project.find_by_full_path('u/p')
-p.events.pushed_action.last(100).each do |e|
- printf "%-20.20s %8s...%8s (%s)\n", e.push_event_payload[:ref], e.push_event_payload[:commit_from], e.push_event_payload[:commit_to], e.author.try(:username)
-end
+```plaintext
+master f21b07713251e04575908149bdc8ac1f105aabc3...6bc56c1f46244792222f6c85b11606933af171de (root)
+master 6bc56c1f46244792222f6c85b11606933af171de...132da6064f5d3453d445fd7cb452b148705bdc1b (root)
+master 132da6064f5d3453d445fd7cb452b148705bdc1b...a62e1e693150a2e46ace0ce696cd4a52856dfa65 (root)
+master 58b07b719a4b0039fec810efa52f479ba1b84756...f05321a5b5728bd8a89b7bf530aa44043c951dce (root)
+master f05321a5b5728bd8a89b7bf530aa44043c951dce...7d02e575fd790e76a3284ee435368279a5eb3773 (root)
```
## Mirrors
@@ -558,7 +558,7 @@ end
```ruby
u = User.new(username: 'test_user', email: 'test@example.com', name: 'Test User', password: 'password', password_confirmation: 'password')
-u.skip_confirmation! # Use it only if you wish user to be automatically confirmed. If skipped, user will recieve confirmation e-mail
+u.skip_confirmation! # Use it only if you wish user to be automatically confirmed. If skipped, user receives confirmation e-mail
u.save!
```
@@ -612,7 +612,7 @@ identifier = Analytics::UsageTrends::Measurement.identifiers[:billable_users]
```ruby
users = User.where('id NOT IN (select distinct(user_id) from project_authorizations)')
-# How many users will be removed?
+# How many users are removed?
users.count
# If that count looks sane:
@@ -726,6 +726,18 @@ group.require_two_factor_authentication=false
group.save
```
+## Authentication
+
+### Re-enable standard web sign-in form
+
+Re-enable the standard username and password-based sign-in form if it was disabled as a [Sign-in restriction](../../user/admin_area/settings/sign_in_restrictions.md#password-authentication-enabled).
+
+You can use this method when a configured external authentication provider (through SSO or an LDAP configuration) is facing an outage and direct sign-in access to GitLab is required.
+
+```ruby
+Gitlab::CurrentSettings.update!(password_authentication_enabled_for_web: true)
+```
+
## SCIM
### Fixing bad SCIM identities
@@ -1061,7 +1073,7 @@ encrypted credentials to allow manual reentry:
If `User OTP Secret Bad count:` is detected. For each user listed disable/enable
two-factor authentication.
-The following script will search in some of the tables for encrypted tokens that are
+The following script searches in some of the tables for encrypted tokens that are
causing decryption errors, and update or reset as needed:
```shell
@@ -1123,7 +1135,7 @@ Geo::ProjectRegistry.sync_failed('repository')
### Resync repositories
-#### Queue up all repositories for resync. Sidekiq will handle each sync
+#### Queue up all repositories for resync. Sidekiq handles each sync
```ruby
Geo::ProjectRegistry.update_all(resync_repository: true, resync_wiki: true)
@@ -1170,10 +1182,10 @@ registry.replicator.send(:download)
#### Verify package files on the secondary manually
-This will iterate over all package files on the secondary, looking at the
+This iterates over all package files on the secondary, looking at the
`verification_checksum` stored in the database (which came from the primary)
and then calculate this value on the secondary to check if they match. This
-won't change anything in the UI:
+does not change anything in the UI:
```ruby
# Run on secondary
@@ -1235,7 +1247,7 @@ Gitlab::UsageData.to_json
### Generate a fresh new Service Ping
-This will also refresh the cached Service Ping displayed in the admin area
+This also refreshes the cached Service Ping displayed in the Admin Area
```ruby
Gitlab::UsageData.to_json(force_refresh: true)
@@ -1269,7 +1281,7 @@ cluster = Clusters::Cluster.find_by(name: 'cluster_name')
Delete cluster without associated resources:
```ruby
-# Find an admin user
+# Find users with the Administrator role
user = User.find_by(username: 'admin_user')
# Find the cluster with the ID
@@ -1289,7 +1301,7 @@ Open the rails console (`gitlab rails c`) and run the following command to see a
ApplicationSetting.last.attributes
```
-Among other attributes, in the output you will notice that all the settings available in the [Elasticsearch Integration page](../../integration/elasticsearch.md), like: `elasticsearch_indexing`, `elasticsearch_url`, `elasticsearch_replicas`, `elasticsearch_pause_indexing`, and so on.
+Among other attributes, the output contains all the settings available in the [Elasticsearch Integration page](../../integration/elasticsearch.md), such as `elasticsearch_indexing`, `elasticsearch_url`, `elasticsearch_replicas`, and `elasticsearch_pause_indexing`.
#### Setting attributes
diff --git a/doc/administration/troubleshooting/img/database-query-dialog_v14_3.png b/doc/administration/troubleshooting/img/database-query-dialog_v14_3.png
new file mode 100644
index 00000000000..197cfa17da2
--- /dev/null
+++ b/doc/administration/troubleshooting/img/database-query-dialog_v14_3.png
Binary files differ
diff --git a/doc/administration/troubleshooting/img/obtaining-a-session-cookie-for-request_v14_3.png b/doc/administration/troubleshooting/img/obtaining-a-session-cookie-for-request_v14_3.png
new file mode 100644
index 00000000000..a63ebf9ecf2
--- /dev/null
+++ b/doc/administration/troubleshooting/img/obtaining-a-session-cookie-for-request_v14_3.png
Binary files differ
diff --git a/doc/administration/troubleshooting/img/paste-request-id-into-progress-bar_v14_3.png b/doc/administration/troubleshooting/img/paste-request-id-into-progress-bar_v14_3.png
new file mode 100644
index 00000000000..a19585d7a89
--- /dev/null
+++ b/doc/administration/troubleshooting/img/paste-request-id-into-progress-bar_v14_3.png
Binary files differ
diff --git a/doc/administration/troubleshooting/img/select-request-id-from-request-selector-drop-down-menu_v14_3.png b/doc/administration/troubleshooting/img/select-request-id-from-request-selector-drop-down-menu_v14_3.png
new file mode 100644
index 00000000000..b8314056c9b
--- /dev/null
+++ b/doc/administration/troubleshooting/img/select-request-id-from-request-selector-drop-down-menu_v14_3.png
Binary files differ
diff --git a/doc/administration/troubleshooting/img/view-pg-details_v14_3.png b/doc/administration/troubleshooting/img/view-pg-details_v14_3.png
new file mode 100644
index 00000000000..1fe12462e4e
--- /dev/null
+++ b/doc/administration/troubleshooting/img/view-pg-details_v14_3.png
Binary files differ
diff --git a/doc/administration/troubleshooting/linux_cheat_sheet.md b/doc/administration/troubleshooting/linux_cheat_sheet.md
index 9eadbad171e..b66e88a8d60 100644
--- a/doc/administration/troubleshooting/linux_cheat_sheet.md
+++ b/doc/administration/troubleshooting/linux_cheat_sheet.md
@@ -14,7 +14,7 @@ having an issue with GitLab, you may want to check your [support options](https:
first, before attempting to use this information.
WARNING:
-If you are administering GitLab you are expected to know these commands for your distribution
+If you administer GitLab you are expected to know these commands for your distribution
of choice. If you are a GitLab Support Engineer, consider this a cross-reference to
translate `yum` -> `apt-get` and the like.
diff --git a/doc/administration/troubleshooting/ssl.md b/doc/administration/troubleshooting/ssl.md
index 80be30a6509..01a4c4af65b 100644
--- a/doc/administration/troubleshooting/ssl.md
+++ b/doc/administration/troubleshooting/ssl.md
@@ -45,7 +45,7 @@ following issues:
```
- The error `SSL certificate problem: unable to get local issuer certificate`
- is displayed when setting up a [mirror](../../user/project/repository/repository_mirroring.md#repository-mirroring)
+ is displayed when setting up a [mirror](../../user/project/repository/mirror/index.md)
from this GitLab instance.
- `openssl` works when specifying the path to the certificate:
@@ -115,7 +115,7 @@ and the restart the runner by running `gitlab-runner restart`.
## Mirroring a remote GitLab repository that uses a self-signed SSL certificate
-When configuring a local GitLab instance to [mirror a repository](../../user/project/repository/repository_mirroring.md)
+When configuring a local GitLab instance to [mirror a repository](../../user/project/repository/mirror/index.md)
from a remote GitLab instance that uses a self-signed certificate, you may see
the `SSL certificate problem: self signed certificate` error message in the
user interface.
diff --git a/doc/administration/troubleshooting/tracing_correlation_id.md b/doc/administration/troubleshooting/tracing_correlation_id.md
index 3518f52e6f6..3bafbed4b3f 100644
--- a/doc/administration/troubleshooting/tracing_correlation_id.md
+++ b/doc/administration/troubleshooting/tracing_correlation_id.md
@@ -135,3 +135,69 @@ 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.
+
+For example, if you want to view the database queries executed for the following API endpoint:
+
+```shell
+https://gitlab.com/api/v4/groups/2564205/projects?with_security_reports=true&page=1&per_page=1
+```
+
+First, enable the **Developer Tools** panel. See [Getting the correlation ID in your browser](#getting-the-correlation-id-in-your-browser) for details on how to do this.
+
+After developer tools have been enabled, obtain a session cookie as follows:
+
+1. Visit <https://gitlab.com> while logged in.
+1. (Optional) Select **Fetch/XHR** request filter in the **Developer Tools** panel. This step is described for Google Chrome developer tools and is not strictly necessary, it just makes it easier to find the correct request.
+1. Select the `results?request_id=<some-request-id>` request on the left hand side.
+1. The session cookie is displayed under the `Request Headers` section of the `Headers` panel. Right-click on the cookie value and select `Copy value`.
+
+![Obtaining a session cookie for request](img/obtaining-a-session-cookie-for-request_v14_3.png)
+
+You have the value of the session cookie copied to your clipboard, for example:
+
+```shell
+experimentation_subject_id=<subject-id>; _gitlab_session=<session-id>; event_filter=all; visitor_id=<visitor-id>; perf_bar_enabled=true; sidebar_collapsed=true; diff_view=inline; sast_entry_point_dismissed=true; auto_devops_settings_dismissed=true; cf_clearance=<cf-clearance>; collapsed_gutter=false; frequently_used_emojis=clap,thumbsup,rofl,tada,eyes,bow
+```
+
+Use the value of the session cookie to craft an API request by pasting it into a custom header of a `curl` request:
+
+```shell
+$ curl --include "https://gitlab.com/api/v4/groups/2564205/projects?with_security_reports=true&page=1&per_page=1" \
+--header 'cookie: experimentation_subject_id=<subject-id>; _gitlab_session=<session-id>; event_filter=all; visitor_id=<visitor-id>; perf_bar_enabled=true; sidebar_collapsed=true; diff_view=inline; sast_entry_point_dismissed=true; auto_devops_settings_dismissed=true; cf_clearance=<cf-clearance>; collapsed_gutter=false; frequently_used_emojis=clap,thumbsup,rofl,tada,eyes,bow'
+
+ date: Tue, 28 Sep 2021 03:55:33 GMT
+ content-type: application/json
+ ...
+ x-request-id: 01FGN8P881GF2E5J91JYA338Y3
+ ...
+ [
+ {
+ "id":27497069,
+ "description":"Analyzer for images used on live K8S containers based on Starboard"
+ },
+ "container_registry_image_prefix":"registry.gitlab.com/gitlab-org/security-products/analyzers/cluster-image-scanning",
+ "..."
+ ]
+```
+
+The response contains the data from the API endpoint, and a `correlation_id` value, returned in the `x-request-id` header, as described in the [Identify the correlation ID for a request](#identify-the-correlation-id-for-a-request) section.
+
+You can then view the database details for this request:
+
+1. Paste the `x-request-id` value into the `request details` field of the [performance bar](../monitoring/performance/performance_bar.md) and press <kbd>Enter/Return</kbd>. This example uses the `x-request-id` value `01FGN8P881GF2E5J91JYA338Y3`, returned by the above response:
+
+ ![Paste request ID into progress bar](img/paste-request-id-into-progress-bar_v14_3.png)
+
+1. A new request is inserted into the `Request Selector` dropdown on the right-hand side of the Performance Bar. Select the new request to view the metrics of the API request:
+
+ ![Select request ID from request selector drop down menu](img/select-request-id-from-request-selector-drop-down-menu_v14_3.png)
+
+ <!-- vale gitlab.Substitutions = NO -->
+1. Select the `pg` link in the Progress Bar to view the database queries executed by the API request:
+
+ ![View pg database details](img/view-pg-details_v14_3.png)
+ <!-- vale gitlab.Substitutions = YES -->
+
+ The database query dialog is displayed:
+
+ ![Database query dialog](img/database-query-dialog_v14_3.png)
diff --git a/doc/administration/user_settings.md b/doc/administration/user_settings.md
index 681ce87edb6..891c11afaf4 100644
--- a/doc/administration/user_settings.md
+++ b/doc/administration/user_settings.md
@@ -4,40 +4,56 @@ group: Access
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Modifying global user settings
+# Modify global user settings **(FREE SELF)**
GitLab administrators can modify user settings for the entire GitLab instance.
-## Disallow users creating top-level groups
+## Prevent users from creating top-level groups
-By default, new users can create top-level groups. To disable this, modify the appropriate configuration file,
-and then [reconfigure and restart GitLab](restart_gitlab.md).
+By default, new users can create top-level groups. To disable your users'
+ability to create top-level groups:
-For Omnibus installations, add the following to `/etc/gitlab/gitlab.rb`:
+**Omnibus GitLab installations**
-```ruby
-gitlab_rails['gitlab_default_can_create_group'] = false
-```
+1. Edit `/etc/gitlab/gitlab.rb` and add the following line:
-For source installations, uncomment the following line in `config/gitlab.yml`:
+ ```ruby
+ gitlab_rails['gitlab_default_can_create_group'] = false
+ ```
-```yaml
-# default_can_create_group: false # default: true
-```
+1. [Reconfigure and restart GitLab](restart_gitlab.md#omnibus-installations).
-## Disallow users changing usernames
+**Source installations**
-By default, new users can change their usernames. To disable this, modify the appropriate configuration file,
-and then [reconfigure and restart GitLab](restart_gitlab.md).
+1. Edit `config/gitlab.yml` and uncomment the following line:
-For Omnibus installations, add the following to `/etc/gitlab/gitlab.rb`:
+ ```yaml
+ # default_can_create_group: false # default: true
+ ```
-```ruby
-gitlab_rails['gitlab_username_changing_enabled'] = false
-```
+1. [Restart GitLab](restart_gitlab.md#installations-from-source).
-For source installations, uncomment the following line in `config/gitlab.yml`:
+## Prevent users from changing their usernames
-```yaml
-# username_changing_enabled: false # default: true - User can change their username/namespace
-```
+By default, new users can change their usernames. To disable your users'
+ability to change their usernames:
+
+**Omnibus GitLab installations**
+
+1. Edit `/etc/gitlab/gitlab.rb` and add the following line:
+
+ ```ruby
+ gitlab_rails['gitlab_username_changing_enabled'] = false
+ ```
+
+1. [Reconfigure and restart GitLab](restart_gitlab.md#omnibus-installations).
+
+**Source installations**
+
+1. Edit `config/gitlab.yml` and uncomment the following line:
+
+ ```yaml
+ # username_changing_enabled: false # default: true - User can change their username/namespace
+ ```
+
+1. [Restart GitLab](restart_gitlab.md#installations-from-source).
diff --git a/doc/api/README.md b/doc/api/README.md
deleted file mode 100644
index 0e6c2f63f9e..00000000000
--- a/doc/api/README.md
+++ /dev/null
@@ -1,9 +0,0 @@
----
-redirect_to: 'index.md'
-remove_date: '2021-09-28'
----
-
-This document was moved to [another location](index.md).
-
-<!-- This redirect file can be deleted after 2021-09-28. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/#move-or-rename-a-page -->
diff --git a/doc/api/access_requests.md b/doc/api/access_requests.md
index 1634184a374..df830a1607d 100644
--- a/doc/api/access_requests.md
+++ b/doc/api/access_requests.md
@@ -2,13 +2,10 @@
stage: Manage
group: Access
info: "To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments"
-type: reference, api
---
# Group and project access requests API **(FREE)**
-> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/18583) in GitLab 8.11.
-
## Valid access levels
The access levels are defined in the `Gitlab::Access` module, and the
diff --git a/doc/api/api_resources.md b/doc/api/api_resources.md
index 8706b1e7e76..7dc3fd1db21 100644
--- a/doc/api/api_resources.md
+++ b/doc/api/api_resources.md
@@ -42,6 +42,7 @@ The following API resources are available in the project context:
| [Events](events.md) | `/projects/:id/events` (also available for users and standalone) |
| [Feature Flags](feature_flags.md) | `/projects/:id/feature_flags` |
| [Feature Flag User Lists](feature_flag_user_lists.md) | `/projects/:id/feature_flags_user_lists` |
+| [Integrations](integrations.md) | `/projects/:id/integrations` |
| [Invitations](invitations.md) | `/projects/:id/invitations` (also available for groups) |
| [Issues](issues.md) | `/projects/:id/issues` (also available for groups and standalone) |
| [Issues Statistics](issues_statistics.md) | `/projects/:id/issues_statistics` (also available for groups and standalone) |
@@ -82,7 +83,7 @@ The following API resources are available in the project context:
| [Resource label events](resource_label_events.md) | `/projects/:id/issues/.../resource_label_events`, `/projects/:id/merge_requests/.../resource_label_events` (also available for groups) |
| [Runners](runners.md) | `/projects/:id/runners` (also available standalone) |
| [Search](search.md) | `/projects/:id/search` (also available for groups and standalone) |
-| [Services](services.md) | `/projects/:id/services` |
+| [Services](services.md) (renamed to [Integrations](integrations.md)) | `/projects/:id/services` |
| [Tags](tags.md) | `/projects/:id/repository/tags` |
| [User-starred metrics dashboards](metrics_user_starred_dashboards.md ) | `/projects/:id/metrics/user_starred_dashboards` |
| [Visual Review discussions](visual_review_discussions.md) **(PREMIUM)** | `/projects/:id/merge_requests/:merge_request_id/visual_review_discussions` |
diff --git a/doc/api/applications.md b/doc/api/applications.md
index 2b5eff68010..22d858bd68a 100644
--- a/doc/api/applications.md
+++ b/doc/api/applications.md
@@ -34,14 +34,14 @@ Parameters:
|:---------------|:--------|:---------|:---------------------------------|
| `name` | string | yes | Name of the application. |
| `redirect_uri` | string | yes | Redirect URI of the application. |
-| `scopes` | string | yes | Scopes of the application. |
+| `scopes` | string | yes | Scopes of the application. You can specify multiple scopes by separating each scope using a space. |
| `confidential` | boolean | no | The application is used where the client secret can be kept confidential. Native mobile apps and Single Page Apps are considered non-confidential. Defaults to `true` if not supplied |
Example request:
```shell
curl --request POST --header "PRIVATE-TOKEN: <your_access_token>" \
- --data "name=MyApplication&redirect_uri=http://redirect.uri&scopes=" \
+ --data "name=MyApplication&redirect_uri=http://redirect.uri&scopes=api read_user email" \
"https://gitlab.example.com/api/v4/applications"
```
diff --git a/doc/api/commits.md b/doc/api/commits.md
index e91da23596f..94d1ced181c 100644
--- a/doc/api/commits.md
+++ b/doc/api/commits.md
@@ -2,7 +2,6 @@
stage: Create
group: Source Code
info: "To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments"
-type: reference, api
---
# Commits API **(FREE)**
@@ -75,8 +74,6 @@ Example response:
## Create a commit with multiple files and actions
-> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/6096) in GitLab 8.13.
-
Create a commit by posting a JSON payload
```plaintext
@@ -256,8 +253,6 @@ Example response:
## Get references a commit is pushed to
-> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/15026) in GitLab 10.6
-
Get all references (from branches or tags) a commit is pushed to.
The pagination parameters `page` and `per_page` can be used to restrict the list of references.
@@ -291,8 +286,6 @@ Example response:
## Cherry-pick a commit
-> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/8047) in GitLab 8.15.
-
Cherry-picks a commit to a given branch.
```plaintext
@@ -366,8 +359,6 @@ dry run.
## Revert a commit
-> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/22919) in GitLab 11.5.
-
Reverts a commit in a given branch.
```plaintext
@@ -622,7 +613,7 @@ Example response:
## Commit status
-In GitLab 8.1 and later, this is the new commit status API.
+This is the commit status API for use with GitLab.
### List the statuses of a commit
@@ -752,8 +743,6 @@ Example response:
## List Merge Requests associated with a commit
-> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/18004) in GitLab 10.7.
-
Get a list of Merge Requests related to the specified commit.
```plaintext
diff --git a/doc/api/container_registry.md b/doc/api/container_registry.md
index 2885cc7d803..1b9778a01b3 100644
--- a/doc/api/container_registry.md
+++ b/doc/api/container_registry.md
@@ -350,7 +350,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/README.html#removing-unused-layers-not-referenced-by-manifests).
+[run the garbage collection](https://docs.gitlab.com/omnibus/maintenance/index.html#removing-unused-layers-not-referenced-by-manifests).
## Delete registry repository tags in bulk
@@ -388,7 +388,7 @@ This API call 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/README.html#removing-unused-layers-not-referenced-by-manifests).
+[run the garbage collection](https://docs.gitlab.com/omnibus/maintenance/index.html#removing-unused-layers-not-referenced-by-manifests).
WARNING:
The number of tags deleted by this API is limited on GitLab.com
diff --git a/doc/api/dependencies.md b/doc/api/dependencies.md
index 6e9c37980ac..b421a32b88a 100644
--- a/doc/api/dependencies.md
+++ b/doc/api/dependencies.md
@@ -34,7 +34,7 @@ GET /projects/:id/dependencies?package_manager=yarn,bundler
| Attribute | Type | Required | Description |
| ------------- | -------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding). |
-| `package_manager` | string array | no | Returns dependencies belonging to specified package manager. Valid values: `bundler`, `composer`, `conan`, `maven`, `npm`, `pip` or `yarn`. |
+| `package_manager` | string array | no | Returns dependencies belonging to specified package manager. Valid values: `bundler`, `composer`, `conan`, `go`, `maven`, `npm`, `nuget`, `pip`, `yarn`, or `sbt`. |
```shell
curl --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/4/dependencies"
diff --git a/doc/api/deploy_tokens.md b/doc/api/deploy_tokens.md
index 3de7ff4ac44..c7189586230 100644
--- a/doc/api/deploy_tokens.md
+++ b/doc/api/deploy_tokens.md
@@ -10,7 +10,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/21811) in GitLab 12.9.
-Get a list of all deploy tokens across the GitLab instance. This endpoint requires administrator access.
+Get a list of all deploy tokens across the GitLab instance. This endpoint requires the Administrator role.
```plaintext
GET /deploy_tokens
diff --git a/doc/api/dora/metrics.md b/doc/api/dora/metrics.md
index 8c82446db2e..4fbd2b0fa80 100644
--- a/doc/api/dora/metrics.md
+++ b/doc/api/dora/metrics.md
@@ -1,6 +1,6 @@
---
-stage: Release
-group: Release
+stage: Manage
+group: Optimize
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
type: reference, api
---
diff --git a/doc/api/dora4_project_analytics.md b/doc/api/dora4_project_analytics.md
index 5a6e1576a3d..f69c918c6e2 100644
--- a/doc/api/dora4_project_analytics.md
+++ b/doc/api/dora4_project_analytics.md
@@ -1,6 +1,6 @@
---
-stage: Release
-group: Release
+stage: Manage
+group: Optimize
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
type: reference, api
---
diff --git a/doc/api/environments.md b/doc/api/environments.md
index 5187ac7c1b2..8188e0e7b85 100644
--- a/doc/api/environments.md
+++ b/doc/api/environments.md
@@ -64,6 +64,8 @@ Example of response
"slug": "review-fix-foo-dfjre3",
"external_url": "https://review-fix-foo-dfjre3.gitlab.example.com",
"state": "available",
+ "created_at": "2019-05-25T18:55:13.252Z",
+ "updated_at": "2019-05-27T18:55:13.252Z",
"last_deployment": {
"id": 100,
"iid": 34,
@@ -176,7 +178,9 @@ Example response:
"name": "deploy",
"slug": "deploy",
"external_url": "https://deploy.gitlab.example.com",
- "state": "available"
+ "state": "available",
+ "created_at": "2019-05-25T18:55:13.252Z",
+ "updated_at": "2019-05-27T18:55:13.252Z"
}
```
@@ -210,7 +214,9 @@ Example response:
"name": "staging",
"slug": "staging",
"external_url": "https://staging.gitlab.example.com",
- "state": "available"
+ "state": "available",
+ "created_at": "2019-05-25T18:55:13.252Z",
+ "updated_at": "2019-05-27T18:55:13.252Z"
}
```
@@ -302,6 +308,8 @@ Example response:
"name": "deploy",
"slug": "deploy",
"external_url": "https://deploy.gitlab.example.com",
- "state": "stopped"
+ "state": "stopped",
+ "created_at": "2019-05-25T18:55:13.252Z",
+ "updated_at": "2019-05-27T18:55:13.252Z"
}
```
diff --git a/doc/api/error_tracking.md b/doc/api/error_tracking.md
index 1abe5522840..203c1a23996 100644
--- a/doc/api/error_tracking.md
+++ b/doc/api/error_tracking.md
@@ -73,7 +73,7 @@ Example response:
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/68384) in GitLab 14.3.
-For [integrated error tracking](https://gitlab.com/gitlab-org/gitlab/-/issues/329596) feature that is behind a disabled feature flag. Only for project maintainers.
+For [integrated error tracking](https://gitlab.com/gitlab-org/gitlab/-/issues/329596) feature. Only for project maintainers.
### List project client keys
diff --git a/doc/api/events.md b/doc/api/events.md
index 8800e7f7f9b..2d173f0053f 100644
--- a/doc/api/events.md
+++ b/doc/api/events.md
@@ -87,10 +87,6 @@ GitLab removes events older than 3 years from the events table for performance r
## List currently authenticated user's events
->**Notes:**
-> This endpoint was introduced in GitLab 9.3.
-> `read_user` access was introduced in GitLab 11.3.
-
Get a list of events for the authenticated user. Scope `read_user` or `api` is required.
```plaintext
@@ -163,10 +159,6 @@ Example response:
### Get user contribution events
->**Notes:**
-> Documentation was formerly located in the [Users API pages](users.md).
-> `read_user` access was introduced in GitLab 11.3.
-
Get the contribution events for the specified user, sorted from newest to oldest. Scope `read_user` or `api` is required.
```plaintext
diff --git a/doc/api/experiments.md b/doc/api/experiments.md
index c5e217a3d66..669d00454bd 100644
--- a/doc/api/experiments.md
+++ b/doc/api/experiments.md
@@ -4,7 +4,7 @@ group: Expansion
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Experiments API
+# Experiments API (GitLab team only) **(FREE SAAS)**
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/262725) in GitLab 13.5.
diff --git a/doc/api/freeze_periods.md b/doc/api/freeze_periods.md
index 6ca69d047da..6dc4e8745d6 100644
--- a/doc/api/freeze_periods.md
+++ b/doc/api/freeze_periods.md
@@ -94,7 +94,7 @@ POST /projects/:id/freeze_periods
| `id` | integer or string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding). |
| `freeze_start` | string | yes | Start of the Freeze Period in [cron](https://crontab.guru/) format. |
| `freeze_end` | string | yes | End of the Freeze Period in [cron](https://crontab.guru/) format. |
-| `cron_timezone` | string | no | The timezone for the cron fields, defaults to UTC if not provided. |
+| `cron_timezone` | string | no | The time zone for the cron fields, defaults to UTC if not provided. |
Example request:
@@ -131,7 +131,7 @@ PUT /projects/:id/freeze_periods/:freeze_period_id
| `freeze_period_id` | integer or string | yes | The database ID of the Freeze Period. |
| `freeze_start` | string | no | Start of the Freeze Period in [cron](https://crontab.guru/) format. |
| `freeze_end` | string | no | End of the Freeze Period in [cron](https://crontab.guru/) format. |
-| `cron_timezone` | string | no | The timezone for the cron fields. |
+| `cron_timezone` | string | no | The time zone for the cron fields. |
Example request:
diff --git a/doc/api/graphql/reference/index.md b/doc/api/graphql/reference/index.md
index c4e73f9c058..e0f18f931f5 100644
--- a/doc/api/graphql/reference/index.md
+++ b/doc/api/graphql/reference/index.md
@@ -25,13 +25,30 @@ Items (fields, enums, etc) that have been removed according to our [deprecation
in [Removed Items](../removed_items.md).
<!-- vale off -->
-<!-- Docs linting disabled after this line. -->
+<!-- Vale linting disabled after this line. -->
<!-- See https://docs.gitlab.com/ee/development/documentation/testing.html#disable-vale-tests -->
+<!-- markdownlint-disable MD044 -->
+<!-- MD044/proper-names test disabled after this line to make page compatible with markdownlint-cli 0.29.0. -->
+<!-- See https://docs.gitlab.com/ee/development/documentation/testing.html#disable-markdownlint-tests -->
+
## `Query` type
The `Query` type contains the API's top-level entry points for all executable queries.
+### `Query.boardList`
+
+Find an issue board list.
+
+Returns [`BoardList`](#boardlist).
+
+#### Arguments
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| <a id="queryboardlistid"></a>`id` | [`ListID!`](#listid) | Global ID of the list. |
+| <a id="queryboardlistissuefilters"></a>`issueFilters` | [`BoardIssueInput`](#boardissueinput) | Filters applied when getting issue metadata in the board list. |
+
### `Query.ciApplicationSettings`
CI related settings that apply to the entire instance.
@@ -469,6 +486,7 @@ four standard [pagination arguments](#connection-pagination-arguments):
| ---- | ---- | ----------- |
| <a id="queryvulnerabilitieshasissues"></a>`hasIssues` | [`Boolean`](#boolean) | Returns only the vulnerabilities which have linked issues. |
| <a id="queryvulnerabilitieshasresolution"></a>`hasResolution` | [`Boolean`](#boolean) | Returns only the vulnerabilities which have been resolved on default branch. |
+| <a id="queryvulnerabilitiesimage"></a>`image` | [`[String!]`](#string) | Filter vulnerabilities by location image. When this filter is present, the response only matches entries for a `reportType` that includes `container_scanning`, `cluster_image_scanning`. |
| <a id="queryvulnerabilitiesprojectid"></a>`projectId` | [`[ID!]`](#id) | Filter vulnerabilities by project. |
| <a id="queryvulnerabilitiesreporttype"></a>`reportType` | [`[VulnerabilityReportType!]`](#vulnerabilityreporttype) | Filter vulnerabilities by report type. |
| <a id="queryvulnerabilitiesscanner"></a>`scanner` | [`[String!]`](#string) | Filter vulnerabilities by VulnerabilityScanner.externalId. |
@@ -1266,6 +1284,9 @@ Input type: `CreateIssueInput`
| <a id="mutationcreateissueepicid"></a>`epicId` | [`EpicID`](#epicid) | ID of an epic to associate the issue with. |
| <a id="mutationcreateissuehealthstatus"></a>`healthStatus` | [`HealthStatus`](#healthstatus) | Desired health status. |
| <a id="mutationcreateissueiid"></a>`iid` | [`Int`](#int) | IID (internal ID) of a project issue. Only admins and project owners can modify. |
+| <a id="mutationcreateissueiterationcadenceid"></a>`iterationCadenceId` | [`IterationsCadenceID`](#iterationscadenceid) | Global iteration cadence ID. Required when `iterationWildcardId` is provided. |
+| <a id="mutationcreateissueiterationid"></a>`iterationId` | [`IterationID`](#iterationid) | Global iteration ID. Mutually exlusive argument with `iterationWildcardId`. |
+| <a id="mutationcreateissueiterationwildcardid"></a>`iterationWildcardId` | [`IssueCreationIterationWildcardId`](#issuecreationiterationwildcardid) | Iteration wildcard ID. Supported values are: `CURRENT`. Mutually exclusive argument with `iterationId`. iterationCadenceId also required when this argument is provided. |
| <a id="mutationcreateissuelabelids"></a>`labelIds` | [`[LabelID!]`](#labelid) | IDs of labels to be added to the issue. |
| <a id="mutationcreateissuelabels"></a>`labels` | [`[String!]`](#string) | Labels of the issue. |
| <a id="mutationcreateissuelocked"></a>`locked` | [`Boolean`](#boolean) | Indicates discussion is locked on the issue. |
@@ -1408,6 +1429,56 @@ Input type: `CreateTestCaseInput`
| <a id="mutationcreatetestcaseerrors"></a>`errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
| <a id="mutationcreatetestcasetestcase"></a>`testCase` | [`Issue`](#issue) | Test case created. |
+### `Mutation.customerRelationsContactCreate`
+
+Input type: `CustomerRelationsContactCreateInput`
+
+#### Arguments
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| <a id="mutationcustomerrelationscontactcreateclientmutationid"></a>`clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| <a id="mutationcustomerrelationscontactcreatedescription"></a>`description` | [`String`](#string) | Description of or notes for the contact. |
+| <a id="mutationcustomerrelationscontactcreateemail"></a>`email` | [`String`](#string) | Email address of the contact. |
+| <a id="mutationcustomerrelationscontactcreatefirstname"></a>`firstName` | [`String!`](#string) | First name of the contact. |
+| <a id="mutationcustomerrelationscontactcreategroupid"></a>`groupId` | [`GroupID!`](#groupid) | Group for the contact. |
+| <a id="mutationcustomerrelationscontactcreatelastname"></a>`lastName` | [`String!`](#string) | Last name of the contact. |
+| <a id="mutationcustomerrelationscontactcreateorganizationid"></a>`organizationId` | [`CustomerRelationsOrganizationID`](#customerrelationsorganizationid) | Organization for the contact. |
+| <a id="mutationcustomerrelationscontactcreatephone"></a>`phone` | [`String`](#string) | Phone number of the contact. |
+
+#### Fields
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| <a id="mutationcustomerrelationscontactcreateclientmutationid"></a>`clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| <a id="mutationcustomerrelationscontactcreatecontact"></a>`contact` | [`CustomerRelationsContact`](#customerrelationscontact) | Contact after the mutation. |
+| <a id="mutationcustomerrelationscontactcreateerrors"></a>`errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
+
+### `Mutation.customerRelationsContactUpdate`
+
+Input type: `CustomerRelationsContactUpdateInput`
+
+#### Arguments
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| <a id="mutationcustomerrelationscontactupdateclientmutationid"></a>`clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| <a id="mutationcustomerrelationscontactupdatedescription"></a>`description` | [`String`](#string) | Description of or notes for the contact. |
+| <a id="mutationcustomerrelationscontactupdateemail"></a>`email` | [`String`](#string) | Email address of the contact. |
+| <a id="mutationcustomerrelationscontactupdatefirstname"></a>`firstName` | [`String`](#string) | First name of the contact. |
+| <a id="mutationcustomerrelationscontactupdateid"></a>`id` | [`CustomerRelationsContactID!`](#customerrelationscontactid) | Global ID of the contact. |
+| <a id="mutationcustomerrelationscontactupdatelastname"></a>`lastName` | [`String`](#string) | Last name of the contact. |
+| <a id="mutationcustomerrelationscontactupdateorganizationid"></a>`organizationId` | [`CustomerRelationsOrganizationID`](#customerrelationsorganizationid) | Organization of the contact. |
+| <a id="mutationcustomerrelationscontactupdatephone"></a>`phone` | [`String`](#string) | Phone number of the contact. |
+
+#### Fields
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| <a id="mutationcustomerrelationscontactupdateclientmutationid"></a>`clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| <a id="mutationcustomerrelationscontactupdatecontact"></a>`contact` | [`CustomerRelationsContact`](#customerrelationscontact) | Contact after the mutation. |
+| <a id="mutationcustomerrelationscontactupdateerrors"></a>`errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
+
### `Mutation.customerRelationsOrganizationCreate`
Input type: `CustomerRelationsOrganizationCreateInput`
@@ -1418,7 +1489,7 @@ Input type: `CustomerRelationsOrganizationCreateInput`
| ---- | ---- | ----------- |
| <a id="mutationcustomerrelationsorganizationcreateclientmutationid"></a>`clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
| <a id="mutationcustomerrelationsorganizationcreatedefaultrate"></a>`defaultRate` | [`Float`](#float) | Standard billing rate for the organization. |
-| <a id="mutationcustomerrelationsorganizationcreatedescription"></a>`description` | [`String`](#string) | Description or notes for the organization. |
+| <a id="mutationcustomerrelationsorganizationcreatedescription"></a>`description` | [`String`](#string) | Description of or notes for the organization. |
| <a id="mutationcustomerrelationsorganizationcreategroupid"></a>`groupId` | [`GroupID!`](#groupid) | Group for the organization. |
| <a id="mutationcustomerrelationsorganizationcreatename"></a>`name` | [`String!`](#string) | Name of the organization. |
@@ -1440,7 +1511,7 @@ Input type: `CustomerRelationsOrganizationUpdateInput`
| ---- | ---- | ----------- |
| <a id="mutationcustomerrelationsorganizationupdateclientmutationid"></a>`clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
| <a id="mutationcustomerrelationsorganizationupdatedefaultrate"></a>`defaultRate` | [`Float`](#float) | Standard billing rate for the organization. |
-| <a id="mutationcustomerrelationsorganizationupdatedescription"></a>`description` | [`String`](#string) | Description or notes for the organization. |
+| <a id="mutationcustomerrelationsorganizationupdatedescription"></a>`description` | [`String`](#string) | Description of or notes for the organization. |
| <a id="mutationcustomerrelationsorganizationupdateid"></a>`id` | [`CustomerRelationsOrganizationID!`](#customerrelationsorganizationid) | Global ID of the organization. |
| <a id="mutationcustomerrelationsorganizationupdatename"></a>`name` | [`String`](#string) | Name of the organization. |
@@ -2432,6 +2503,64 @@ Input type: `ExportRequirementsInput`
| <a id="mutationexportrequirementsclientmutationid"></a>`clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
| <a id="mutationexportrequirementserrors"></a>`errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
+### `Mutation.externalAuditEventDestinationCreate`
+
+Input type: `ExternalAuditEventDestinationCreateInput`
+
+#### Arguments
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| <a id="mutationexternalauditeventdestinationcreateclientmutationid"></a>`clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| <a id="mutationexternalauditeventdestinationcreatedestinationurl"></a>`destinationUrl` | [`String!`](#string) | Destination URL. |
+| <a id="mutationexternalauditeventdestinationcreategrouppath"></a>`groupPath` | [`ID!`](#id) | Group path. |
+
+#### Fields
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| <a id="mutationexternalauditeventdestinationcreateclientmutationid"></a>`clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| <a id="mutationexternalauditeventdestinationcreateerrors"></a>`errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
+| <a id="mutationexternalauditeventdestinationcreateexternalauditeventdestination"></a>`externalAuditEventDestination` | [`ExternalAuditEventDestination`](#externalauditeventdestination) | Destination created. |
+
+### `Mutation.externalAuditEventDestinationDestroy`
+
+Input type: `ExternalAuditEventDestinationDestroyInput`
+
+#### Arguments
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| <a id="mutationexternalauditeventdestinationdestroyclientmutationid"></a>`clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| <a id="mutationexternalauditeventdestinationdestroyid"></a>`id` | [`AuditEventsExternalAuditEventDestinationID!`](#auditeventsexternalauditeventdestinationid) | ID of external audit event destination to destroy. |
+
+#### Fields
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| <a id="mutationexternalauditeventdestinationdestroyclientmutationid"></a>`clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| <a id="mutationexternalauditeventdestinationdestroyerrors"></a>`errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
+
+### `Mutation.externalAuditEventDestinationUpdate`
+
+Input type: `ExternalAuditEventDestinationUpdateInput`
+
+#### Arguments
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| <a id="mutationexternalauditeventdestinationupdateclientmutationid"></a>`clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| <a id="mutationexternalauditeventdestinationupdatedestinationurl"></a>`destinationUrl` | [`String`](#string) | Destination URL to change. |
+| <a id="mutationexternalauditeventdestinationupdateid"></a>`id` | [`AuditEventsExternalAuditEventDestinationID!`](#auditeventsexternalauditeventdestinationid) | ID of external audit event destination to destroy. |
+
+#### Fields
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| <a id="mutationexternalauditeventdestinationupdateclientmutationid"></a>`clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| <a id="mutationexternalauditeventdestinationupdateerrors"></a>`errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
+| <a id="mutationexternalauditeventdestinationupdateexternalauditeventdestination"></a>`externalAuditEventDestination` | [`ExternalAuditEventDestination`](#externalauditeventdestination) | Updated destination. |
+
### `Mutation.gitlabSubscriptionActivate`
Input type: `GitlabSubscriptionActivateInput`
@@ -3904,6 +4033,8 @@ Input type: `RunnersRegistrationTokenResetInput`
### `Mutation.scanExecutionPolicyCommit`
+Commits the `policy_yaml` content to the assigned security policy project for the given project(`project_path`).
+
Input type: `ScanExecutionPolicyCommitInput`
#### Arguments
@@ -3925,6 +4056,8 @@ Input type: `ScanExecutionPolicyCommitInput`
### `Mutation.securityPolicyProjectAssign`
+Assigns the specified project(`security_policy_project_id`) as security policy project for the given project(`project_path`). If the project already has a security policy project, this reassigns the project's security policy project with the given `security_policy_project_id`.
+
Input type: `SecurityPolicyProjectAssignInput`
#### Arguments
@@ -3944,6 +4077,8 @@ Input type: `SecurityPolicyProjectAssignInput`
### `Mutation.securityPolicyProjectCreate`
+Creates and assigns a security policy project for the given project(`project_path`).
+
Input type: `SecurityPolicyProjectCreateInput`
#### Arguments
@@ -4269,6 +4404,26 @@ Input type: `UpdateDependencyProxyImageTtlGroupPolicyInput`
| <a id="mutationupdatedependencyproxyimagettlgrouppolicydependencyproxyimagettlpolicy"></a>`dependencyProxyImageTtlPolicy` | [`DependencyProxyImageTtlGroupPolicy`](#dependencyproxyimagettlgrouppolicy) | Group image TTL policy after mutation. |
| <a id="mutationupdatedependencyproxyimagettlgrouppolicyerrors"></a>`errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
+### `Mutation.updateDependencyProxySettings`
+
+Input type: `UpdateDependencyProxySettingsInput`
+
+#### Arguments
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| <a id="mutationupdatedependencyproxysettingsclientmutationid"></a>`clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| <a id="mutationupdatedependencyproxysettingsenabled"></a>`enabled` | [`Boolean`](#boolean) | Indicates whether the policy is enabled or disabled. |
+| <a id="mutationupdatedependencyproxysettingsgrouppath"></a>`groupPath` | [`ID!`](#id) | Group path for the group dependency proxy. |
+
+#### Fields
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| <a id="mutationupdatedependencyproxysettingsclientmutationid"></a>`clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| <a id="mutationupdatedependencyproxysettingsdependencyproxysetting"></a>`dependencyProxySetting` | [`DependencyProxySetting`](#dependencyproxysetting) | Group dependency proxy settings after mutation. |
+| <a id="mutationupdatedependencyproxysettingserrors"></a>`errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
+
### `Mutation.updateEpic`
Input type: `UpdateEpicInput`
@@ -4560,13 +4715,13 @@ Input type: `VulnerabilityCreateInput`
| <a id="mutationvulnerabilitycreatedismissedat"></a>`dismissedAt` | [`Time`](#time) | Timestamp of when the vulnerability state changed to dismissed (defaults to creation time if status is `dismissed`). |
| <a id="mutationvulnerabilitycreateidentifiers"></a>`identifiers` | [`[VulnerabilityIdentifierInput!]!`](#vulnerabilityidentifierinput) | Array of CVE or CWE identifiers for the vulnerability. |
| <a id="mutationvulnerabilitycreatemessage"></a>`message` | [`String`](#string) | Additional information about the vulnerability. |
+| <a id="mutationvulnerabilitycreatename"></a>`name` | [`String!`](#string) | Name of the vulnerability. |
| <a id="mutationvulnerabilitycreateproject"></a>`project` | [`ProjectID!`](#projectid) | ID of the project to attach the vulnerability to. |
| <a id="mutationvulnerabilitycreateresolvedat"></a>`resolvedAt` | [`Time`](#time) | Timestamp of when the vulnerability state changed to resolved (defaults to creation time if status is `resolved`). |
-| <a id="mutationvulnerabilitycreatescannername"></a>`scannerName` | [`String!`](#string) | Name of the security scanner used to discover the vulnerability. |
+| <a id="mutationvulnerabilitycreatescanner"></a>`scanner` | [`VulnerabilityScannerInput!`](#vulnerabilityscannerinput) | Information about the scanner used to discover the vulnerability. |
| <a id="mutationvulnerabilitycreateseverity"></a>`severity` | [`VulnerabilitySeverity`](#vulnerabilityseverity) | Severity of the vulnerability (defaults to `unknown`). |
| <a id="mutationvulnerabilitycreatesolution"></a>`solution` | [`String`](#string) | How to fix this vulnerability. |
| <a id="mutationvulnerabilitycreatestate"></a>`state` | [`VulnerabilityState`](#vulnerabilitystate) | State of the vulnerability (defaults to `detected`). |
-| <a id="mutationvulnerabilitycreatetitle"></a>`title` | [`String!`](#string) | Title of the vulnerability. |
#### Fields
@@ -5173,6 +5328,7 @@ The edge type for [`CiRunner`](#cirunner).
| ---- | ---- | ----------- |
| <a id="cirunneredgecursor"></a>`cursor` | [`String!`](#string) | A cursor for use in pagination. |
| <a id="cirunneredgenode"></a>`node` | [`CiRunner`](#cirunner) | The item at the end of the edge. |
+| <a id="cirunneredgeweburl"></a>`webUrl` | [`String`](#string) | Web URL of the runner. The value depends on where you put this field in the query. You can use it for projects or groups. |
#### `CiStageConnection`
@@ -5915,6 +6071,29 @@ The edge type for [`Event`](#event).
| <a id="eventedgecursor"></a>`cursor` | [`String!`](#string) | A cursor for use in pagination. |
| <a id="eventedgenode"></a>`node` | [`Event`](#event) | The item at the end of the edge. |
+#### `ExternalAuditEventDestinationConnection`
+
+The connection type for [`ExternalAuditEventDestination`](#externalauditeventdestination).
+
+##### Fields
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| <a id="externalauditeventdestinationconnectionedges"></a>`edges` | [`[ExternalAuditEventDestinationEdge]`](#externalauditeventdestinationedge) | A list of edges. |
+| <a id="externalauditeventdestinationconnectionnodes"></a>`nodes` | [`[ExternalAuditEventDestination]`](#externalauditeventdestination) | A list of nodes. |
+| <a id="externalauditeventdestinationconnectionpageinfo"></a>`pageInfo` | [`PageInfo!`](#pageinfo) | Information to aid in pagination. |
+
+#### `ExternalAuditEventDestinationEdge`
+
+The edge type for [`ExternalAuditEventDestination`](#externalauditeventdestination).
+
+##### Fields
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| <a id="externalauditeventdestinationedgecursor"></a>`cursor` | [`String!`](#string) | A cursor for use in pagination. |
+| <a id="externalauditeventdestinationedgenode"></a>`node` | [`ExternalAuditEventDestination`](#externalauditeventdestination) | The item at the end of the edge. |
+
#### `GroupConnection`
The connection type for [`Group`](#group).
@@ -6503,6 +6682,7 @@ The connection type for [`Package`](#package).
| Name | Type | Description |
| ---- | ---- | ----------- |
+| <a id="packageconnectioncount"></a>`count` | [`Int!`](#int) | Total count of collection. |
| <a id="packageconnectionedges"></a>`edges` | [`[PackageEdge]`](#packageedge) | A list of edges. |
| <a id="packageconnectionnodes"></a>`nodes` | [`[Package]`](#package) | A list of nodes. |
| <a id="packageconnectionpageinfo"></a>`pageInfo` | [`PageInfo!`](#pageinfo) | Information to aid in pagination. |
@@ -8072,7 +8252,7 @@ four standard [pagination arguments](#connection-pagination-arguments):
| <a id="boardepicancestorsmilestonetitle"></a>`milestoneTitle` | [`String`](#string) | Filter epics by milestone title, computed from epic's issues. |
| <a id="boardepicancestorsmyreactionemoji"></a>`myReactionEmoji` | [`String`](#string) | Filter by reaction emoji applied by the current user. |
| <a id="boardepicancestorsnot"></a>`not` | [`NegatedEpicFilterInput`](#negatedepicfilterinput) | Negated epic arguments. |
-| <a id="boardepicancestorssearch"></a>`search` | [`String`](#string) | Search query for epic title or description. |
+| <a id="boardepicancestorssearch"></a>`search` | [`String`](#string) | Search query for title or description. |
| <a id="boardepicancestorssort"></a>`sort` | [`EpicSort`](#epicsort) | List epics by sort order. |
| <a id="boardepicancestorsstartdate"></a>`startDate` **{warning-solid}** | [`Time`](#time) | **Deprecated** in 13.5. Use timeframe.start. |
| <a id="boardepicancestorsstate"></a>`state` | [`EpicState`](#epicstate) | Filter epics by state. |
@@ -8105,7 +8285,7 @@ four standard [pagination arguments](#connection-pagination-arguments):
| <a id="boardepicchildrenmilestonetitle"></a>`milestoneTitle` | [`String`](#string) | Filter epics by milestone title, computed from epic's issues. |
| <a id="boardepicchildrenmyreactionemoji"></a>`myReactionEmoji` | [`String`](#string) | Filter by reaction emoji applied by the current user. |
| <a id="boardepicchildrennot"></a>`not` | [`NegatedEpicFilterInput`](#negatedepicfilterinput) | Negated epic arguments. |
-| <a id="boardepicchildrensearch"></a>`search` | [`String`](#string) | Search query for epic title or description. |
+| <a id="boardepicchildrensearch"></a>`search` | [`String`](#string) | Search query for title or description. |
| <a id="boardepicchildrensort"></a>`sort` | [`EpicSort`](#epicsort) | List epics by sort order. |
| <a id="boardepicchildrenstartdate"></a>`startDate` **{warning-solid}** | [`Time`](#time) | **Deprecated** in 13.5. Use timeframe.start. |
| <a id="boardepicchildrenstate"></a>`state` | [`EpicState`](#epicstate) | Filter epics by state. |
@@ -8391,6 +8571,7 @@ Represents the total number of issues and their weights for a particular day.
| ---- | ---- | ----------- |
| <a id="cirunneraccesslevel"></a>`accessLevel` | [`CiRunnerAccessLevel!`](#cirunneraccesslevel) | Access level of the runner. |
| <a id="cirunneractive"></a>`active` | [`Boolean!`](#boolean) | Indicates the runner is allowed to receive jobs. |
+| <a id="cirunneradminurl"></a>`adminUrl` | [`String`](#string) | Admin URL of the runner. Only available for adminstrators. |
| <a id="cirunnercontactedat"></a>`contactedAt` | [`Time`](#time) | Last contact from the runner. |
| <a id="cirunnerdescription"></a>`description` | [`String`](#string) | Description of the runner. |
| <a id="cirunnerid"></a>`id` | [`CiRunnerID!`](#cirunnerid) | ID of the runner. |
@@ -8407,6 +8588,7 @@ Represents the total number of issues and their weights for a particular day.
| <a id="cirunnershortsha"></a>`shortSha` | [`String`](#string) | First eight characters of the runner's token used to authenticate new job requests. Used as the runner's unique ID. |
| <a id="cirunnerstatus"></a>`status` | [`CiRunnerStatus!`](#cirunnerstatus) | Status of the runner. |
| <a id="cirunnertaglist"></a>`tagList` | [`[String!]`](#string) | Tags associated with the runner. |
+| <a id="cirunneruserpermissions"></a>`userPermissions` | [`RunnerPermissions!`](#runnerpermissions) | Permissions for the current user on the resource. |
| <a id="cirunnerversion"></a>`version` | [`String`](#string) | Version of the runner. |
### `CiStage`
@@ -8737,7 +8919,7 @@ A custom emoji uploaded by user.
| Name | Type | Description |
| ---- | ---- | ----------- |
| <a id="customerrelationscontactcreatedat"></a>`createdAt` | [`Time!`](#time) | Timestamp the contact was created. |
-| <a id="customerrelationscontactdescription"></a>`description` | [`String`](#string) | Description or notes for the contact. |
+| <a id="customerrelationscontactdescription"></a>`description` | [`String`](#string) | Description of or notes for the contact. |
| <a id="customerrelationscontactemail"></a>`email` | [`String`](#string) | Email address of the contact. |
| <a id="customerrelationscontactfirstname"></a>`firstName` | [`String!`](#string) | First name of the contact. |
| <a id="customerrelationscontactid"></a>`id` | [`ID!`](#id) | Internal ID of the contact. |
@@ -8754,7 +8936,7 @@ A custom emoji uploaded by user.
| ---- | ---- | ----------- |
| <a id="customerrelationsorganizationcreatedat"></a>`createdAt` | [`Time!`](#time) | Timestamp the organization was created. |
| <a id="customerrelationsorganizationdefaultrate"></a>`defaultRate` | [`Float`](#float) | Standard billing rate for the organization. |
-| <a id="customerrelationsorganizationdescription"></a>`description` | [`String`](#string) | Description or notes for the organization. |
+| <a id="customerrelationsorganizationdescription"></a>`description` | [`String`](#string) | Description of or notes for the organization. |
| <a id="customerrelationsorganizationid"></a>`id` | [`ID!`](#id) | Internal ID of the organization. |
| <a id="customerrelationsorganizationname"></a>`name` | [`String!`](#string) | Name of the organization. |
| <a id="customerrelationsorganizationupdatedat"></a>`updatedAt` | [`Time!`](#time) | Timestamp the organization was last updated. |
@@ -9477,7 +9659,7 @@ four standard [pagination arguments](#connection-pagination-arguments):
| <a id="epicancestorsmilestonetitle"></a>`milestoneTitle` | [`String`](#string) | Filter epics by milestone title, computed from epic's issues. |
| <a id="epicancestorsmyreactionemoji"></a>`myReactionEmoji` | [`String`](#string) | Filter by reaction emoji applied by the current user. |
| <a id="epicancestorsnot"></a>`not` | [`NegatedEpicFilterInput`](#negatedepicfilterinput) | Negated epic arguments. |
-| <a id="epicancestorssearch"></a>`search` | [`String`](#string) | Search query for epic title or description. |
+| <a id="epicancestorssearch"></a>`search` | [`String`](#string) | Search query for title or description. |
| <a id="epicancestorssort"></a>`sort` | [`EpicSort`](#epicsort) | List epics by sort order. |
| <a id="epicancestorsstartdate"></a>`startDate` **{warning-solid}** | [`Time`](#time) | **Deprecated** in 13.5. Use timeframe.start. |
| <a id="epicancestorsstate"></a>`state` | [`EpicState`](#epicstate) | Filter epics by state. |
@@ -9510,7 +9692,7 @@ four standard [pagination arguments](#connection-pagination-arguments):
| <a id="epicchildrenmilestonetitle"></a>`milestoneTitle` | [`String`](#string) | Filter epics by milestone title, computed from epic's issues. |
| <a id="epicchildrenmyreactionemoji"></a>`myReactionEmoji` | [`String`](#string) | Filter by reaction emoji applied by the current user. |
| <a id="epicchildrennot"></a>`not` | [`NegatedEpicFilterInput`](#negatedepicfilterinput) | Negated epic arguments. |
-| <a id="epicchildrensearch"></a>`search` | [`String`](#string) | Search query for epic title or description. |
+| <a id="epicchildrensearch"></a>`search` | [`String`](#string) | Search query for title or description. |
| <a id="epicchildrensort"></a>`sort` | [`EpicSort`](#epicsort) | List epics by sort order. |
| <a id="epicchildrenstartdate"></a>`startDate` **{warning-solid}** | [`Time`](#time) | **Deprecated** in 13.5. Use timeframe.start. |
| <a id="epicchildrenstate"></a>`state` | [`EpicState`](#epicstate) | Filter epics by state. |
@@ -9634,6 +9816,7 @@ Relationship between an epic and an issue.
| <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. |
+| <a id="epicissuecustomerrelationscontacts"></a>`customerRelationsContacts` | [`CustomerRelationsContactConnection`](#customerrelationscontactconnection) | Customer relations contacts of the issue. (see [Connections](#connections)) |
| <a id="epicissuedescription"></a>`description` | [`String`](#string) | Description of the issue. |
| <a id="epicissuedescriptionhtml"></a>`descriptionHtml` | [`String`](#string) | The GitLab Flavored Markdown rendering of `description`. |
| <a id="epicissuedesigncollection"></a>`designCollection` | [`DesignCollection`](#designcollection) | Collection of design images associated with this issue. |
@@ -9806,6 +9989,18 @@ Representing an event.
| <a id="eventid"></a>`id` | [`ID!`](#id) | ID of the event. |
| <a id="eventupdatedat"></a>`updatedAt` | [`Time!`](#time) | When this event was updated. |
+### `ExternalAuditEventDestination`
+
+Represents an external resource to send audit events to.
+
+#### Fields
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| <a id="externalauditeventdestinationdestinationurl"></a>`destinationUrl` | [`String!`](#string) | External destination to send audit events to. |
+| <a id="externalauditeventdestinationgroup"></a>`group` | [`Group!`](#group) | Group the destination belongs to. |
+| <a id="externalauditeventdestinationid"></a>`id` | [`ID!`](#id) | ID of the destination. |
+
### `ExternalIssue`
Represents an external issue.
@@ -9976,7 +10171,7 @@ four standard [pagination arguments](#connection-pagination-arguments):
##### `GeoNode.uploadRegistries`
-Find Upload registries on this Geo node Available only when feature flag `geo_upload_replication` is enabled. This flag is disabled by default, because the feature is experimental and is subject to change without notice.
+Find Upload registries on this Geo node.
Returns [`UploadRegistryConnection`](#uploadregistryconnection).
@@ -10031,6 +10226,7 @@ four standard [pagination arguments](#connection-pagination-arguments):
| <a id="groupemailsdisabled"></a>`emailsDisabled` | [`Boolean`](#boolean) | Indicates if a group has email notifications disabled. |
| <a id="groupepicboards"></a>`epicBoards` | [`EpicBoardConnection`](#epicboardconnection) | Find epic boards. (see [Connections](#connections)) |
| <a id="groupepicsenabled"></a>`epicsEnabled` | [`Boolean`](#boolean) | Indicates if Epics are enabled for namespace. |
+| <a id="groupexternalauditeventdestinations"></a>`externalAuditEventDestinations` | [`ExternalAuditEventDestinationConnection`](#externalauditeventdestinationconnection) | External locations that receive audit events belonging to the group. Available only when feature flag `ff_external_audit_events_namespace` is enabled. This flag is disabled by default, because the feature is experimental and is subject to change without notice. (see [Connections](#connections)) |
| <a id="groupfullname"></a>`fullName` | [`String!`](#string) | Full name of the namespace. |
| <a id="groupfullpath"></a>`fullPath` | [`ID!`](#id) | Full path of the namespace. |
| <a id="groupid"></a>`id` | [`ID!`](#id) | ID of the namespace. |
@@ -10181,7 +10377,7 @@ Returns [`Epic`](#epic).
| <a id="groupepicmilestonetitle"></a>`milestoneTitle` | [`String`](#string) | Filter epics by milestone title, computed from epic's issues. |
| <a id="groupepicmyreactionemoji"></a>`myReactionEmoji` | [`String`](#string) | Filter by reaction emoji applied by the current user. |
| <a id="groupepicnot"></a>`not` | [`NegatedEpicFilterInput`](#negatedepicfilterinput) | Negated epic arguments. |
-| <a id="groupepicsearch"></a>`search` | [`String`](#string) | Search query for epic title or description. |
+| <a id="groupepicsearch"></a>`search` | [`String`](#string) | Search query for title or description. |
| <a id="groupepicsort"></a>`sort` | [`EpicSort`](#epicsort) | List epics by sort order. |
| <a id="groupepicstartdate"></a>`startDate` **{warning-solid}** | [`Time`](#time) | **Deprecated** in 13.5. Use timeframe.start. |
| <a id="groupepicstate"></a>`state` | [`EpicState`](#epicstate) | Filter epics by state. |
@@ -10226,7 +10422,7 @@ four standard [pagination arguments](#connection-pagination-arguments):
| <a id="groupepicsmilestonetitle"></a>`milestoneTitle` | [`String`](#string) | Filter epics by milestone title, computed from epic's issues. |
| <a id="groupepicsmyreactionemoji"></a>`myReactionEmoji` | [`String`](#string) | Filter by reaction emoji applied by the current user. |
| <a id="groupepicsnot"></a>`not` | [`NegatedEpicFilterInput`](#negatedepicfilterinput) | Negated epic arguments. |
-| <a id="groupepicssearch"></a>`search` | [`String`](#string) | Search query for epic title or description. |
+| <a id="groupepicssearch"></a>`search` | [`String`](#string) | Search query for title or description. |
| <a id="groupepicssort"></a>`sort` | [`EpicSort`](#epicsort) | List epics by sort order. |
| <a id="groupepicsstartdate"></a>`startDate` **{warning-solid}** | [`Time`](#time) | **Deprecated** in 13.5. Use timeframe.start. |
| <a id="groupepicsstate"></a>`state` | [`EpicState`](#epicstate) | Filter epics by state. |
@@ -10269,11 +10465,13 @@ four standard [pagination arguments](#connection-pagination-arguments):
| <a id="groupissuesauthorusername"></a>`authorUsername` | [`String`](#string) | Username of the author of the issue. |
| <a id="groupissuesclosedafter"></a>`closedAfter` | [`Time`](#time) | Issues closed after this date. |
| <a id="groupissuesclosedbefore"></a>`closedBefore` | [`Time`](#time) | Issues closed before this date. |
+| <a id="groupissuesconfidential"></a>`confidential` | [`Boolean`](#boolean) | Filter for confidential issues. If "false", excludes confidential issues. If "true", returns only confidential issues. |
| <a id="groupissuescreatedafter"></a>`createdAfter` | [`Time`](#time) | Issues created after this date. |
| <a id="groupissuescreatedbefore"></a>`createdBefore` | [`Time`](#time) | Issues created before this date. |
| <a id="groupissuesepicid"></a>`epicId` | [`String`](#string) | ID of an epic associated with the issues, "none" and "any" values are supported. |
| <a id="groupissuesiid"></a>`iid` | [`String`](#string) | IID of the issue. For example, "1". |
| <a id="groupissuesiids"></a>`iids` | [`[String!]`](#string) | List of IIDs of issues. For example, `["1", "2"]`. |
+| <a id="groupissuesincludesubepics"></a>`includeSubepics` | [`Boolean`](#boolean) | Whether to include subepics when filtering issues by epicId. |
| <a id="groupissuesincludesubgroups"></a>`includeSubgroups` | [`Boolean`](#boolean) | Include issues belonging to subgroups. |
| <a id="groupissuesiterationid"></a>`iterationId` | [`[ID]`](#id) | List of iteration Global IDs applied to the issue. |
| <a id="groupissuesiterationwildcardid"></a>`iterationWildcardId` | [`IterationWildcardId`](#iterationwildcardid) | Filter by iteration ID wildcard. |
@@ -10282,7 +10480,7 @@ four standard [pagination arguments](#connection-pagination-arguments):
| <a id="groupissuesmilestonewildcardid"></a>`milestoneWildcardId` | [`MilestoneWildcardId`](#milestonewildcardid) | Filter issues by milestone ID wildcard. |
| <a id="groupissuesmyreactionemoji"></a>`myReactionEmoji` | [`String`](#string) | Filter by reaction emoji applied by the current user. Wildcard values "NONE" and "ANY" are supported. |
| <a id="groupissuesnot"></a>`not` | [`NegatedIssueFilterInput`](#negatedissuefilterinput) | Negated arguments. |
-| <a id="groupissuessearch"></a>`search` | [`String`](#string) | Search query for issue title or description. |
+| <a id="groupissuessearch"></a>`search` | [`String`](#string) | Search query for title or description. |
| <a id="groupissuessort"></a>`sort` | [`IssueSort`](#issuesort) | Sort issues by this criteria. |
| <a id="groupissuesstate"></a>`state` | [`IssuableState`](#issuablestate) | Current state of this issue. |
| <a id="groupissuestypes"></a>`types` | [`[IssueType!]`](#issuetype) | Filter issues by the given issue types. |
@@ -10520,6 +10718,7 @@ four standard [pagination arguments](#connection-pagination-arguments):
| ---- | ---- | ----------- |
| <a id="groupvulnerabilitieshasissues"></a>`hasIssues` | [`Boolean`](#boolean) | Returns only the vulnerabilities which have linked issues. |
| <a id="groupvulnerabilitieshasresolution"></a>`hasResolution` | [`Boolean`](#boolean) | Returns only the vulnerabilities which have been resolved on default branch. |
+| <a id="groupvulnerabilitiesimage"></a>`image` | [`[String!]`](#string) | Filter vulnerabilities by location image. When this filter is present, the response only matches entries for a `reportType` that includes `container_scanning`, `cluster_image_scanning`. |
| <a id="groupvulnerabilitiesprojectid"></a>`projectId` | [`[ID!]`](#id) | Filter vulnerabilities by project. |
| <a id="groupvulnerabilitiesreporttype"></a>`reportType` | [`[VulnerabilityReportType!]`](#vulnerabilityreporttype) | Filter vulnerabilities by report type. |
| <a id="groupvulnerabilitiesscanner"></a>`scanner` | [`[String!]`](#string) | Filter vulnerabilities by VulnerabilityScanner.externalId. |
@@ -10781,6 +10980,7 @@ Returns [`VulnerabilitySeveritiesCount`](#vulnerabilityseveritiescount).
| <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. |
+| <a id="issuecustomerrelationscontacts"></a>`customerRelationsContacts` | [`CustomerRelationsContactConnection`](#customerrelationscontactconnection) | Customer relations contacts of the issue. (see [Connections](#connections)) |
| <a id="issuedescription"></a>`description` | [`String`](#string) | Description of the issue. |
| <a id="issuedescriptionhtml"></a>`descriptionHtml` | [`String`](#string) | The GitLab Flavored Markdown rendering of `description`. |
| <a id="issuedesigncollection"></a>`designCollection` | [`DesignCollection`](#designcollection) | Collection of design images associated with this issue. |
@@ -11948,10 +12148,10 @@ Nuget metadata.
| Name | Type | Description |
| ---- | ---- | ----------- |
-| <a id="nugetmetadataiconurl"></a>`iconUrl` | [`String!`](#string) | Icon URL of the Nuget package. |
+| <a id="nugetmetadataiconurl"></a>`iconUrl` | [`String`](#string) | Icon URL of the Nuget package. |
| <a id="nugetmetadataid"></a>`id` | [`PackagesNugetMetadatumID!`](#packagesnugetmetadatumid) | ID of the metadatum. |
-| <a id="nugetmetadatalicenseurl"></a>`licenseUrl` | [`String!`](#string) | License URL of the Nuget package. |
-| <a id="nugetmetadataprojecturl"></a>`projectUrl` | [`String!`](#string) | Project URL of the Nuget package. |
+| <a id="nugetmetadatalicenseurl"></a>`licenseUrl` | [`String`](#string) | License URL of the Nuget package. |
+| <a id="nugetmetadataprojecturl"></a>`projectUrl` | [`String`](#string) | Project URL of the Nuget package. |
### `OncallParticipantType`
@@ -11985,6 +12185,7 @@ Represents a package in the Package Registry. Note that this type is in beta and
| Name | Type | Description |
| ---- | ---- | ----------- |
+| <a id="packagecandestroy"></a>`canDestroy` | [`Boolean!`](#boolean) | Whether the user can destroy the package. |
| <a id="packagecreatedat"></a>`createdAt` | [`Time!`](#time) | Date of creation. |
| <a id="packageid"></a>`id` | [`PackagesPackageID!`](#packagespackageid) | ID of the package. |
| <a id="packagemetadata"></a>`metadata` | [`PackageMetadata`](#packagemetadata) | Package metadata. |
@@ -12044,6 +12245,7 @@ Represents a package details in the Package Registry. Note that this type is in
| Name | Type | Description |
| ---- | ---- | ----------- |
+| <a id="packagedetailstypecandestroy"></a>`canDestroy` | [`Boolean!`](#boolean) | Whether the user can destroy the package. |
| <a id="packagedetailstypecreatedat"></a>`createdAt` | [`Time!`](#time) | Date of creation. |
| <a id="packagedetailstypedependencylinks"></a>`dependencyLinks` | [`PackageDependencyLinkConnection`](#packagedependencylinkconnection) | Dependency link. (see [Connections](#connections)) |
| <a id="packagedetailstypeid"></a>`id` | [`PackagesPackageID!`](#packagespackageid) | ID of the package. |
@@ -12179,6 +12381,7 @@ Represents a file or directory in the project repository that has been locked.
| <a id="pipelineconfigsource"></a>`configSource` | [`PipelineConfigSourceEnum`](#pipelineconfigsourceenum) | Configuration source of the pipeline (UNKNOWN_SOURCE, REPOSITORY_SOURCE, AUTO_DEVOPS_SOURCE, WEBIDE_SOURCE, REMOTE_SOURCE, EXTERNAL_PROJECT_SOURCE, BRIDGE_SOURCE, PARAMETER_SOURCE, COMPLIANCE_SOURCE). |
| <a id="pipelinecoverage"></a>`coverage` | [`Float`](#float) | Coverage percentage. |
| <a id="pipelinecreatedat"></a>`createdAt` | [`Time!`](#time) | Timestamp of the pipeline's creation. |
+| <a id="pipelinedastprofile"></a>`dastProfile` | [`DastProfile`](#dastprofile) | DAST profile associated with the pipeline. Returns `null`if `dast_view_scans` feature flag is disabled. |
| <a id="pipelinedetailedstatus"></a>`detailedStatus` | [`DetailedStatus!`](#detailedstatus) | Detailed status of the pipeline. |
| <a id="pipelinedownstream"></a>`downstream` | [`PipelineConnection`](#pipelineconnection) | Pipelines this pipeline will trigger. (see [Connections](#connections)) |
| <a id="pipelineduration"></a>`duration` | [`Int`](#int) | Duration of the pipeline in seconds. |
@@ -12624,7 +12827,7 @@ four standard [pagination arguments](#connection-pagination-arguments):
| Name | Type | Description |
| ---- | ---- | ----------- |
| <a id="projectdastsitevalidationsnormalizedtargeturls"></a>`normalizedTargetUrls` | [`[String!]`](#string) | Normalized URL of the target to be scanned. |
-| <a id="projectdastsitevalidationsstatus"></a>`status` | [`DastSiteValidationStatusEnum`](#dastsitevalidationstatusenum) | Status of the site validation. Ignored if `dast_failed_site_validations` feature flag is disabled. |
+| <a id="projectdastsitevalidationsstatus"></a>`status` | [`DastSiteValidationStatusEnum`](#dastsitevalidationstatusenum) | Status of the site validation. |
##### `Project.environment`
@@ -12702,11 +12905,13 @@ Returns [`Issue`](#issue).
| <a id="projectissueauthorusername"></a>`authorUsername` | [`String`](#string) | Username of the author of the issue. |
| <a id="projectissueclosedafter"></a>`closedAfter` | [`Time`](#time) | Issues closed after this date. |
| <a id="projectissueclosedbefore"></a>`closedBefore` | [`Time`](#time) | Issues closed before this date. |
+| <a id="projectissueconfidential"></a>`confidential` | [`Boolean`](#boolean) | Filter for confidential issues. If "false", excludes confidential issues. If "true", returns only confidential issues. |
| <a id="projectissuecreatedafter"></a>`createdAfter` | [`Time`](#time) | Issues created after this date. |
| <a id="projectissuecreatedbefore"></a>`createdBefore` | [`Time`](#time) | Issues created before this date. |
| <a id="projectissueepicid"></a>`epicId` | [`String`](#string) | ID of an epic associated with the issues, "none" and "any" values are supported. |
| <a id="projectissueiid"></a>`iid` | [`String`](#string) | IID of the issue. For example, "1". |
| <a id="projectissueiids"></a>`iids` | [`[String!]`](#string) | List of IIDs of issues. For example, `["1", "2"]`. |
+| <a id="projectissueincludesubepics"></a>`includeSubepics` | [`Boolean`](#boolean) | Whether to include subepics when filtering issues by epicId. |
| <a id="projectissueiterationid"></a>`iterationId` | [`[ID]`](#id) | List of iteration Global IDs applied to the issue. |
| <a id="projectissueiterationwildcardid"></a>`iterationWildcardId` | [`IterationWildcardId`](#iterationwildcardid) | Filter by iteration ID wildcard. |
| <a id="projectissuelabelname"></a>`labelName` | [`[String]`](#string) | Labels applied to this issue. |
@@ -12714,7 +12919,7 @@ Returns [`Issue`](#issue).
| <a id="projectissuemilestonewildcardid"></a>`milestoneWildcardId` | [`MilestoneWildcardId`](#milestonewildcardid) | Filter issues by milestone ID wildcard. |
| <a id="projectissuemyreactionemoji"></a>`myReactionEmoji` | [`String`](#string) | Filter by reaction emoji applied by the current user. Wildcard values "NONE" and "ANY" are supported. |
| <a id="projectissuenot"></a>`not` | [`NegatedIssueFilterInput`](#negatedissuefilterinput) | Negated arguments. |
-| <a id="projectissuesearch"></a>`search` | [`String`](#string) | Search query for issue title or description. |
+| <a id="projectissuesearch"></a>`search` | [`String`](#string) | Search query for title or description. |
| <a id="projectissuesort"></a>`sort` | [`IssueSort`](#issuesort) | Sort issues by this criteria. |
| <a id="projectissuestate"></a>`state` | [`IssuableState`](#issuablestate) | Current state of this issue. |
| <a id="projectissuetypes"></a>`types` | [`[IssueType!]`](#issuetype) | Filter issues by the given issue types. |
@@ -12738,6 +12943,7 @@ Returns [`IssueStatusCountsType`](#issuestatuscountstype).
| <a id="projectissuestatuscountsauthorusername"></a>`authorUsername` | [`String`](#string) | Username of the author of the issue. |
| <a id="projectissuestatuscountsclosedafter"></a>`closedAfter` | [`Time`](#time) | Issues closed after this date. |
| <a id="projectissuestatuscountsclosedbefore"></a>`closedBefore` | [`Time`](#time) | Issues closed before this date. |
+| <a id="projectissuestatuscountsconfidential"></a>`confidential` | [`Boolean`](#boolean) | Filter for confidential issues. If "false", excludes confidential issues. If "true", returns only confidential issues. |
| <a id="projectissuestatuscountscreatedafter"></a>`createdAfter` | [`Time`](#time) | Issues created after this date. |
| <a id="projectissuestatuscountscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Issues created before this date. |
| <a id="projectissuestatuscountsiid"></a>`iid` | [`String`](#string) | IID of the issue. For example, "1". |
@@ -12747,7 +12953,7 @@ Returns [`IssueStatusCountsType`](#issuestatuscountstype).
| <a id="projectissuestatuscountsmilestonewildcardid"></a>`milestoneWildcardId` | [`MilestoneWildcardId`](#milestonewildcardid) | Filter issues by milestone ID wildcard. |
| <a id="projectissuestatuscountsmyreactionemoji"></a>`myReactionEmoji` | [`String`](#string) | Filter by reaction emoji applied by the current user. Wildcard values "NONE" and "ANY" are supported. |
| <a id="projectissuestatuscountsnot"></a>`not` | [`NegatedIssueFilterInput`](#negatedissuefilterinput) | Negated arguments. |
-| <a id="projectissuestatuscountssearch"></a>`search` | [`String`](#string) | Search query for issue title or description. |
+| <a id="projectissuestatuscountssearch"></a>`search` | [`String`](#string) | Search query for title or description. |
| <a id="projectissuestatuscountstypes"></a>`types` | [`[IssueType!]`](#issuetype) | Filter issues by the given issue types. |
| <a id="projectissuestatuscountsupdatedafter"></a>`updatedAfter` | [`Time`](#time) | Issues updated after this date. |
| <a id="projectissuestatuscountsupdatedbefore"></a>`updatedBefore` | [`Time`](#time) | Issues updated before this date. |
@@ -12772,11 +12978,13 @@ four standard [pagination arguments](#connection-pagination-arguments):
| <a id="projectissuesauthorusername"></a>`authorUsername` | [`String`](#string) | Username of the author of the issue. |
| <a id="projectissuesclosedafter"></a>`closedAfter` | [`Time`](#time) | Issues closed after this date. |
| <a id="projectissuesclosedbefore"></a>`closedBefore` | [`Time`](#time) | Issues closed before this date. |
+| <a id="projectissuesconfidential"></a>`confidential` | [`Boolean`](#boolean) | Filter for confidential issues. If "false", excludes confidential issues. If "true", returns only confidential issues. |
| <a id="projectissuescreatedafter"></a>`createdAfter` | [`Time`](#time) | Issues created after this date. |
| <a id="projectissuescreatedbefore"></a>`createdBefore` | [`Time`](#time) | Issues created before this date. |
| <a id="projectissuesepicid"></a>`epicId` | [`String`](#string) | ID of an epic associated with the issues, "none" and "any" values are supported. |
| <a id="projectissuesiid"></a>`iid` | [`String`](#string) | IID of the issue. For example, "1". |
| <a id="projectissuesiids"></a>`iids` | [`[String!]`](#string) | List of IIDs of issues. For example, `["1", "2"]`. |
+| <a id="projectissuesincludesubepics"></a>`includeSubepics` | [`Boolean`](#boolean) | Whether to include subepics when filtering issues by epicId. |
| <a id="projectissuesiterationid"></a>`iterationId` | [`[ID]`](#id) | List of iteration Global IDs applied to the issue. |
| <a id="projectissuesiterationwildcardid"></a>`iterationWildcardId` | [`IterationWildcardId`](#iterationwildcardid) | Filter by iteration ID wildcard. |
| <a id="projectissueslabelname"></a>`labelName` | [`[String]`](#string) | Labels applied to this issue. |
@@ -12784,7 +12992,7 @@ four standard [pagination arguments](#connection-pagination-arguments):
| <a id="projectissuesmilestonewildcardid"></a>`milestoneWildcardId` | [`MilestoneWildcardId`](#milestonewildcardid) | Filter issues by milestone ID wildcard. |
| <a id="projectissuesmyreactionemoji"></a>`myReactionEmoji` | [`String`](#string) | Filter by reaction emoji applied by the current user. Wildcard values "NONE" and "ANY" are supported. |
| <a id="projectissuesnot"></a>`not` | [`NegatedIssueFilterInput`](#negatedissuefilterinput) | Negated arguments. |
-| <a id="projectissuessearch"></a>`search` | [`String`](#string) | Search query for issue title or description. |
+| <a id="projectissuessearch"></a>`search` | [`String`](#string) | Search query for title or description. |
| <a id="projectissuessort"></a>`sort` | [`IssueSort`](#issuesort) | Sort issues by this criteria. |
| <a id="projectissuesstate"></a>`state` | [`IssuableState`](#issuablestate) | Current state of this issue. |
| <a id="projectissuestypes"></a>`types` | [`[IssueType!]`](#issuetype) | Filter issues by the given issue types. |
@@ -13196,6 +13404,7 @@ four standard [pagination arguments](#connection-pagination-arguments):
| ---- | ---- | ----------- |
| <a id="projectvulnerabilitieshasissues"></a>`hasIssues` | [`Boolean`](#boolean) | Returns only the vulnerabilities which have linked issues. |
| <a id="projectvulnerabilitieshasresolution"></a>`hasResolution` | [`Boolean`](#boolean) | Returns only the vulnerabilities which have been resolved on default branch. |
+| <a id="projectvulnerabilitiesimage"></a>`image` | [`[String!]`](#string) | Filter vulnerabilities by location image. When this filter is present, the response only matches entries for a `reportType` that includes `container_scanning`, `cluster_image_scanning`. |
| <a id="projectvulnerabilitiesprojectid"></a>`projectId` | [`[ID!]`](#id) | Filter vulnerabilities by project. |
| <a id="projectvulnerabilitiesreporttype"></a>`reportType` | [`[VulnerabilityReportType!]`](#vulnerabilityreporttype) | Filter vulnerabilities by report type. |
| <a id="projectvulnerabilitiesscanner"></a>`scanner` | [`[String!]`](#string) | Filter vulnerabilities by VulnerabilityScanner.externalId. |
@@ -13524,7 +13733,7 @@ Returns [`[String!]`](#string).
##### `Repository.paginatedTree`
-Paginated tree of the repository. Available only when feature flag `paginated_tree_graphql_query` is enabled. This flag is disabled by default, because the feature is experimental and is subject to change without notice.
+Paginated tree of the repository. Available only when feature flag `paginated_tree_graphql_query` is enabled. This flag is enabled by default.
Returns [`TreeConnection`](#treeconnection).
@@ -13676,6 +13885,16 @@ Counts of requirements by their state.
| <a id="runnerarchitecturedownloadlocation"></a>`downloadLocation` | [`String!`](#string) | Download location for the runner for the platform architecture. |
| <a id="runnerarchitecturename"></a>`name` | [`String!`](#string) | Name of the runner platform architecture. |
+### `RunnerPermissions`
+
+#### Fields
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| <a id="runnerpermissionsdeleterunner"></a>`deleteRunner` | [`Boolean!`](#boolean) | Indicates the user can perform `delete_runner` on this resource. |
+| <a id="runnerpermissionsreadrunner"></a>`readRunner` | [`Boolean!`](#boolean) | Indicates the user can perform `read_runner` on this resource. |
+| <a id="runnerpermissionsupdaterunner"></a>`updateRunner` | [`Boolean!`](#boolean) | Indicates the user can perform `update_runner` on this resource. |
+
### `RunnerPlatform`
#### Fields
@@ -13850,6 +14069,7 @@ A Sentry error.
| <a id="sentrydetailederrorgitlabcommitpath"></a>`gitlabCommitPath` | [`String`](#string) | Path to the GitLab page for the GitLab commit attributed to the error. |
| <a id="sentrydetailederrorgitlabissuepath"></a>`gitlabIssuePath` | [`String`](#string) | URL of GitLab Issue. |
| <a id="sentrydetailederrorid"></a>`id` | [`ID!`](#id) | ID (global ID) of the error. |
+| <a id="sentrydetailederrorintegrated"></a>`integrated` | [`Boolean`](#boolean) | Error tracking backend. |
| <a id="sentrydetailederrorlastreleaselastcommit"></a>`lastReleaseLastCommit` | [`String`](#string) | Commit the error was last seen. |
| <a id="sentrydetailederrorlastreleaseshortversion"></a>`lastReleaseShortVersion` | [`String`](#string) | Release short version the error was last seen. |
| <a id="sentrydetailederrorlastreleaseversion"></a>`lastReleaseVersion` | [`String`](#string) | Release version the error was last seen. |
@@ -14709,8 +14929,10 @@ Represents a vulnerability.
| <a id="vulnerabilityhassolutions"></a>`hasSolutions` | [`Boolean`](#boolean) | Indicates whether there is a solution available for this vulnerability. |
| <a id="vulnerabilityid"></a>`id` | [`ID!`](#id) | GraphQL ID of the vulnerability. |
| <a id="vulnerabilityidentifiers"></a>`identifiers` | [`[VulnerabilityIdentifier!]!`](#vulnerabilityidentifier) | Identifiers of the vulnerability. |
+| <a id="vulnerabilitylinks"></a>`links` | [`[VulnerabilityLink!]!`](#vulnerabilitylink) | List of links associated with the vulnerability. |
| <a id="vulnerabilitylocation"></a>`location` | [`VulnerabilityLocation`](#vulnerabilitylocation) | Location metadata for the vulnerability. Its fields depend on the type of security scan that found the vulnerability. |
| <a id="vulnerabilitymergerequest"></a>`mergeRequest` | [`MergeRequest`](#mergerequest) | Merge request that fixes the vulnerability. |
+| <a id="vulnerabilitymessage"></a>`message` | [`String`](#string) | Short text description of the vulnerability. This may include the finding's specific information. |
| <a id="vulnerabilitynotes"></a>`notes` | [`NoteConnection!`](#noteconnection) | All notes on this noteable. (see [Connections](#connections)) |
| <a id="vulnerabilityprimaryidentifier"></a>`primaryIdentifier` | [`VulnerabilityIdentifier`](#vulnerabilityidentifier) | Primary identifier of the vulnerability. |
| <a id="vulnerabilityproject"></a>`project` | [`Project`](#project) | Project on which the vulnerability was found. |
@@ -14956,6 +15178,17 @@ Represents an issue link of a vulnerability.
| <a id="vulnerabilityissuelinkissue"></a>`issue` | [`Issue!`](#issue) | Issue attached to issue link. |
| <a id="vulnerabilityissuelinklinktype"></a>`linkType` | [`VulnerabilityIssueLinkType!`](#vulnerabilityissuelinktype) | Type of the issue link. |
+### `VulnerabilityLink`
+
+Represents a link related to a vulnerability.
+
+#### Fields
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| <a id="vulnerabilitylinkname"></a>`name` | [`String`](#string) | Name of the link. |
+| <a id="vulnerabilitylinkurl"></a>`url` | [`String!`](#string) | URL of the link. |
+
### `VulnerabilityLocationContainerScanning`
Represents the location of a vulnerability found by a container security scan.
@@ -15345,10 +15578,10 @@ Values for sorting runners.
| Value | Description |
| ----- | ----------- |
-| <a id="cirunnerstatusactive"></a>`ACTIVE` | A runner that is active. |
-| <a id="cirunnerstatusnot_connected"></a>`NOT_CONNECTED` | A runner that is not connected. |
-| <a id="cirunnerstatusoffline"></a>`OFFLINE` | A runner that is offline. |
-| <a id="cirunnerstatusonline"></a>`ONLINE` | A runner that is online. |
+| <a id="cirunnerstatusactive"></a>`ACTIVE` | A runner that is not paused. |
+| <a id="cirunnerstatusnot_connected"></a>`NOT_CONNECTED` | A runner that has never contacted this instance. |
+| <a id="cirunnerstatusoffline"></a>`OFFLINE` | A runner that has not contacted this instance within the last 2 hours. |
+| <a id="cirunnerstatusonline"></a>`ONLINE` | A runner that contacted this instance within the last 2 hours. |
| <a id="cirunnerstatuspaused"></a>`PAUSED` | A runner that is paused. |
### `CiRunnerType`
@@ -15425,6 +15658,7 @@ Conan file types.
| <a id="containerexpirationpolicyolderthanenumfourteen_days"></a>`FOURTEEN_DAYS` | 14 days until tags are automatically removed. |
| <a id="containerexpirationpolicyolderthanenumninety_days"></a>`NINETY_DAYS` | 90 days until tags are automatically removed. |
| <a id="containerexpirationpolicyolderthanenumseven_days"></a>`SEVEN_DAYS` | 7 days until tags are automatically removed. |
+| <a id="containerexpirationpolicyolderthanenumsixty_days"></a>`SIXTY_DAYS` | 60 days until tags are automatically removed. |
| <a id="containerexpirationpolicyolderthanenumthirty_days"></a>`THIRTY_DAYS` | 30 days until tags are automatically removed. |
### `ContainerRepositoryCleanupStatus`
@@ -15750,6 +15984,14 @@ State of a GitLab issue or merge request.
| <a id="issuablestatelocked"></a>`locked` | Discussion has been locked. |
| <a id="issuablestateopened"></a>`opened` | In open state. |
+### `IssueCreationIterationWildcardId`
+
+Iteration ID wildcard values for issue creation.
+
+| Value | Description |
+| ----- | ----------- |
+| <a id="issuecreationiterationwildcardidcurrent"></a>`CURRENT` | Current iteration. |
+
### `IssueSort`
Values for sorting issues.
@@ -16013,7 +16255,7 @@ Milestone ID wildcard values.
| <a id="milestonewildcardidany"></a>`ANY` | Milestone is assigned. |
| <a id="milestonewildcardidnone"></a>`NONE` | No milestone is assigned. |
| <a id="milestonewildcardidstarted"></a>`STARTED` | Milestone assigned is open and started (start date <= today). |
-| <a id="milestonewildcardidupcoming"></a>`UPCOMING` | Milestone assigned is due closest in the future (due date > today). |
+| <a id="milestonewildcardidupcoming"></a>`UPCOMING` | Milestone assigned is due in the future (due date > today). |
### `MoveType`
@@ -16455,6 +16697,7 @@ Name of the feature that the callout is for.
| <a id="usercalloutfeaturenameenumregistration_enabled_callout"></a>`REGISTRATION_ENABLED_CALLOUT` | Callout feature name for registration_enabled_callout. |
| <a id="usercalloutfeaturenameenumsecurity_configuration_devops_alert"></a>`SECURITY_CONFIGURATION_DEVOPS_ALERT` | Callout feature name for security_configuration_devops_alert. |
| <a id="usercalloutfeaturenameenumsecurity_configuration_upgrade_banner"></a>`SECURITY_CONFIGURATION_UPGRADE_BANNER` | Callout feature name for security_configuration_upgrade_banner. |
+| <a id="usercalloutfeaturenameenumsecurity_newsletter_callout"></a>`SECURITY_NEWSLETTER_CALLOUT` | Callout feature name for security_newsletter_callout. |
| <a id="usercalloutfeaturenameenumsuggest_pipeline"></a>`SUGGEST_PIPELINE` | Callout feature name for suggest_pipeline. |
| <a id="usercalloutfeaturenameenumsuggest_popover_dismissed"></a>`SUGGEST_POPOVER_DISMISSED` | Callout feature name for suggest_popover_dismissed. |
| <a id="usercalloutfeaturenameenumtabs_position_highlight"></a>`TABS_POSITION_HIGHLIGHT` | Callout feature name for tabs_position_highlight. |
@@ -16646,6 +16889,12 @@ A `AnalyticsDevopsAdoptionEnabledNamespaceID` is a global ID. It is encoded as a
An example `AnalyticsDevopsAdoptionEnabledNamespaceID` is: `"gid://gitlab/Analytics::DevopsAdoption::EnabledNamespace/1"`.
+### `AuditEventsExternalAuditEventDestinationID`
+
+A `AuditEventsExternalAuditEventDestinationID` is a global ID. It is encoded as a string.
+
+An example `AuditEventsExternalAuditEventDestinationID` is: `"gid://gitlab/AuditEvents::ExternalAuditEventDestination/1"`.
+
### `AwardableID`
A `AwardableID` is a global ID. It is encoded as a string.
@@ -16732,6 +16981,12 @@ A `CustomEmojiID` is a global ID. It is encoded as a string.
An example `CustomEmojiID` is: `"gid://gitlab/CustomEmoji/1"`.
+### `CustomerRelationsContactID`
+
+A `CustomerRelationsContactID` is a global ID. It is encoded as a string.
+
+An example `CustomerRelationsContactID` is: `"gid://gitlab/CustomerRelations::Contact/1"`.
+
### `CustomerRelationsOrganizationID`
A `CustomerRelationsOrganizationID` is a global ID. It is encoded as a string.
@@ -17906,6 +18161,7 @@ Represents an escalation rule.
| <a id="negatedissuefilterinputmilestonetitle"></a>`milestoneTitle` | [`[String!]`](#string) | Milestone not applied to this issue. |
| <a id="negatedissuefilterinputmilestonewildcardid"></a>`milestoneWildcardId` | [`NegatedMilestoneWildcardId`](#negatedmilestonewildcardid) | Filter by negated milestone wildcard values. |
| <a id="negatedissuefilterinputmyreactionemoji"></a>`myReactionEmoji` | [`String`](#string) | Filter by reaction emoji applied by the current user. |
+| <a id="negatedissuefilterinputtypes"></a>`types` | [`[IssueType!]`](#issuetype) | Filters out issues by the given issue types. |
| <a id="negatedissuefilterinputweight"></a>`weight` | [`String`](#string) | Weight not applied to the issue. |
### `OncallRotationActivePeriodInputType`
@@ -18057,3 +18313,23 @@ A time-frame defined as a closed inclusive range of two dates.
| <a id="vulnerabilityidentifierinputexternaltype"></a>`externalType` | [`String`](#string) | External type of the vulnerability identifier. |
| <a id="vulnerabilityidentifierinputname"></a>`name` | [`String!`](#string) | Name of the vulnerability identifier. |
| <a id="vulnerabilityidentifierinputurl"></a>`url` | [`String!`](#string) | URL of the vulnerability identifier. |
+
+### `VulnerabilityScannerInput`
+
+#### Arguments
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| <a id="vulnerabilityscannerinputid"></a>`id` | [`String!`](#string) | Unique ID that identifies the scanner. |
+| <a id="vulnerabilityscannerinputname"></a>`name` | [`String!`](#string) | Human readable value that identifies the analyzer, not required to be unique. |
+| <a id="vulnerabilityscannerinputurl"></a>`url` | [`String!`](#string) | Link to more information about the analyzer. |
+| <a id="vulnerabilityscannerinputvendor"></a>`vendor` | [`VulnerabilityScannerVendorInput`](#vulnerabilityscannervendorinput) | Information about vendor/maintainer of the scanner. |
+| <a id="vulnerabilityscannerinputversion"></a>`version` | [`String!`](#string) | Version of the scanner. |
+
+### `VulnerabilityScannerVendorInput`
+
+#### Arguments
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| <a id="vulnerabilityscannervendorinputname"></a>`name` | [`String!`](#string) | Name of the vendor/maintainer. |
diff --git a/doc/api/group_clusters.md b/doc/api/group_clusters.md
index 83373368fc6..81ca45c4531 100644
--- a/doc/api/group_clusters.md
+++ b/doc/api/group_clusters.md
@@ -250,7 +250,7 @@ Parameters:
NOTE:
`name`, `api_url`, `ca_cert` and `token` can only be updated if the cluster was added
-through the ["Add existing Kubernetes cluster"](../user/project/clusters/add_remove_clusters.md#add-existing-cluster) option or
+through the ["Add existing Kubernetes cluster"](../user/project/clusters/add_existing_cluster.md) option or
through the ["Add existing cluster to group"](#add-existing-cluster-to-group) endpoint.
Example request:
diff --git a/doc/api/group_import_export.md b/doc/api/group_import_export.md
index 0a431cfdfbf..212a62516f1 100644
--- a/doc/api/group_import_export.md
+++ b/doc/api/group_import_export.md
@@ -57,8 +57,12 @@ GET /groups/:id/export/download
| `id` | integer/string | yes | ID of the group owned by the authenticated user |
```shell
-curl --header "PRIVATE-TOKEN: <your_access_token>" --remote-header-name \
- --remote-name "https://gitlab.example.com/api/v4/groups/1/export/download"
+group=1
+token=secret
+curl --request GET\
+ --header "PRIVATE-TOKEN: ${token}" \
+ --output download_group_${group}.tar.gz \
+ "https://gitlab.example.com/api/v4/groups/${group}/export/download"
```
```shell
diff --git a/doc/api/group_repository_storage_moves.md b/doc/api/group_repository_storage_moves.md
index a893bffb1f5..9d4120ec355 100644
--- a/doc/api/group_repository_storage_moves.md
+++ b/doc/api/group_repository_storage_moves.md
@@ -10,7 +10,7 @@ type: reference
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/53016) in GitLab 13.9.
Group 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
+[migrating to Gitaly Cluster](../administration/gitaly/index.md#migrating-to-gitaly-cluster), for
example, or to migrate a [group wiki](../user/project/wiki/index.md#group-wikis).
As group repository storage moves are processed, they transition through different states. Values
diff --git a/doc/api/groups.md b/doc/api/groups.md
index bd4c7de567c..7efecfc2c9c 100644
--- a/doc/api/groups.md
+++ b/doc/api/groups.md
@@ -830,7 +830,7 @@ curl --request POST --header "PRIVATE-TOKEN: <your_access_token>" \
## Transfer project to group
-Transfer a project to the Group namespace. Available only to instance administrators, although an [alternative API endpoint](projects.md#transfer-a-project-to-a-new-namespace) is available which does not require instance administrator access. Transferring projects may fail when tagged packages exist in the project's repository.
+Transfer a project to the Group namespace. Available only to instance administrators, although an [alternative API endpoint](projects.md#transfer-a-project-to-a-new-namespace) is available which does not require instance administrator role. Transferring projects may fail when tagged packages exist in the project's repository.
```plaintext
POST /groups/:id/projects/:project_id
diff --git a/doc/api/instance_clusters.md b/doc/api/instance_clusters.md
index 4e0ec3bd433..58f88b26bc4 100644
--- a/doc/api/instance_clusters.md
+++ b/doc/api/instance_clusters.md
@@ -8,10 +8,12 @@ info: To determine the technical writer assigned to the Stage/Group associated w
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/36001) in GitLab 13.2.
-Instance-level Kubernetes clusters allow you to connect a Kubernetes cluster to the GitLab instance, which enables you to use the same cluster across multiple projects. [More information](../user/instance/clusters/index.md)
+With [instance-level Kubernetes clusters](../user/instance/clusters/index.md),
+you can connect a Kubernetes cluster to the GitLab instance and use the same cluster across all of
+the projects within your instance.
NOTE:
-Users need administrator access to use these endpoints.
+Users need the Administrator role to use these endpoints.
## List instance clusters
@@ -240,7 +242,7 @@ Parameters:
NOTE:
`name`, `api_url`, `ca_cert` and `token` can only be updated if the cluster was added
-through the [Add existing Kubernetes cluster](../user/project/clusters/add_remove_clusters.md#add-existing-cluster) option or
+through the [Add existing Kubernetes cluster](../user/project/clusters/add_existing_cluster.md) option or
through the [Add existing instance cluster](#add-existing-instance-cluster) endpoint.
Example request:
diff --git a/doc/api/integrations.md b/doc/api/integrations.md
new file mode 100644
index 00000000000..3c649e8d044
--- /dev/null
+++ b/doc/api/integrations.md
@@ -0,0 +1,1566 @@
+---
+stage: Ecosystem
+group: Integrations
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
+---
+
+# Integrations API **(FREE)**
+
+This API enables you to work with external services that integrate with GitLab.
+
+NOTE:
+In GitLab 14.4, the `services` endpoint was [renamed](https://gitlab.com/gitlab-org/gitlab/-/issues/334500) to `integrations`.
+Calls to the Integrations API can be made to both `/projects/:id/services` and `/projects/:id/integrations`.
+The examples in this document refer to the endpoint at `/projects/:id/integrations`.
+
+This API requires an access token with the [Maintainer or Owner role](../user/permissions.md).
+
+## List all active integrations
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/21330) in GitLab 12.7.
+
+Get a list of all active project integrations.
+
+```plaintext
+GET /projects/:id/integrations
+```
+
+Example response:
+
+```json
+[
+ {
+ "id": 75,
+ "title": "Jenkins CI",
+ "slug": "jenkins",
+ "created_at": "2019-11-20T11:20:25.297Z",
+ "updated_at": "2019-11-20T12:24:37.498Z",
+ "active": true,
+ "commit_events": true,
+ "push_events": true,
+ "issues_events": true,
+ "confidential_issues_events": true,
+ "merge_requests_events": true,
+ "tag_push_events": false,
+ "note_events": true,
+ "confidential_note_events": true,
+ "pipeline_events": true,
+ "wiki_page_events": true,
+ "job_events": true,
+ "comment_on_event_enabled": true
+ },
+ {
+ "id": 76,
+ "title": "Alerts endpoint",
+ "slug": "alerts",
+ "created_at": "2019-11-20T11:20:25.297Z",
+ "updated_at": "2019-11-20T12:24:37.498Z",
+ "active": true,
+ "commit_events": true,
+ "push_events": true,
+ "issues_events": true,
+ "confidential_issues_events": true,
+ "merge_requests_events": true,
+ "tag_push_events": true,
+ "note_events": true,
+ "confidential_note_events": true,
+ "pipeline_events": true,
+ "wiki_page_events": true,
+ "job_events": true,
+ "comment_on_event_enabled": true
+ }
+]
+```
+
+## Asana
+
+Add commit messages as comments to Asana tasks.
+
+See also the [Asana integration documentation](../user/project/integrations/asana.md).
+
+### Create/Edit Asana integration
+
+Set Asana integration for a project.
+
+```plaintext
+PUT /projects/:id/integrations/asana
+```
+
+Parameters:
+
+| Parameter | Type | Required | Description |
+| --------- | ---- | -------- | ----------- |
+| `api_key` | string | true | User API token. User must have access to task. All comments are attributed to this user. |
+| `restrict_to_branch` | string | false | Comma-separated list of branches to be are automatically inspected. Leave blank to include all branches. |
+| `push_events` | boolean | false | Enable notifications for push events |
+
+### Delete Asana integration
+
+Delete Asana integration for a project.
+
+```plaintext
+DELETE /projects/:id/integrations/asana
+```
+
+### Get Asana integration settings
+
+Get Asana integration settings for a project.
+
+```plaintext
+GET /projects/:id/integrations/asana
+```
+
+## Assembla
+
+Project Management Software (Source Commits Endpoint)
+
+### Create/Edit Assembla integration
+
+Set Assembla integration for a project.
+
+```plaintext
+PUT /projects/:id/integrations/assembla
+```
+
+Parameters:
+
+| Parameter | Type | Required | Description |
+| --------- | ---- | -------- | ----------- |
+| `token` | string | true | The authentication token
+| `subdomain` | string | false | The subdomain setting |
+| `push_events` | boolean | false | Enable notifications for push events |
+
+### Delete Assembla integration
+
+Delete Assembla integration for a project.
+
+```plaintext
+DELETE /projects/:id/integrations/assembla
+```
+
+### Get Assembla integration settings
+
+Get Assembla integration settings for a project.
+
+```plaintext
+GET /projects/:id/integrations/assembla
+```
+
+## Atlassian Bamboo CI
+
+A continuous integration and build server
+
+### Create/Edit Atlassian Bamboo CI integration
+
+Set Atlassian Bamboo CI integration for a project.
+
+> You must set up automatic revision labeling and a repository trigger in Bamboo.
+
+```plaintext
+PUT /projects/:id/integrations/bamboo
+```
+
+Parameters:
+
+| Parameter | Type | Required | Description |
+| --------- | ---- | -------- | ----------- |
+| `bamboo_url` | string | true | Bamboo root URL. For example, `https://bamboo.example.com`. |
+| `build_key` | string | true | Bamboo build plan key like KEY |
+| `username` | string | true | A user with API access, if applicable |
+| `password` | string | true | Password of the user |
+| `push_events` | boolean | false | Enable notifications for push events |
+
+### Delete Atlassian Bamboo CI integration
+
+Delete Atlassian Bamboo CI integration for a project.
+
+```plaintext
+DELETE /projects/:id/integrations/bamboo
+```
+
+### Get Atlassian Bamboo CI integration settings
+
+Get Atlassian Bamboo CI integration settings for a project.
+
+```plaintext
+GET /projects/:id/integrations/bamboo
+```
+
+## Bugzilla
+
+Bugzilla Issue Tracker
+
+### Create/Edit Bugzilla integration
+
+Set Bugzilla integration for a project.
+
+```plaintext
+PUT /projects/:id/integrations/bugzilla
+```
+
+Parameters:
+
+| Parameter | Type | Required | Description |
+| --------- | ---- | -------- | ----------- |
+| `new_issue_url` | string | true | New Issue URL |
+| `issues_url` | string | true | Issue URL |
+| `project_url` | string | true | Project URL |
+| `description` | string | false | Description |
+| `title` | string | false | Title |
+| `push_events` | boolean | false | Enable notifications for push events |
+
+### Delete Bugzilla integration
+
+Delete Bugzilla integration for a project.
+
+```plaintext
+DELETE /projects/:id/integrations/bugzilla
+```
+
+### Get Bugzilla integration settings
+
+Get Bugzilla integration settings for a project.
+
+```plaintext
+GET /projects/:id/integrations/bugzilla
+```
+
+## Buildkite
+
+Continuous integration and deployments
+
+### Create/Edit Buildkite integration
+
+Set Buildkite integration for a project.
+
+```plaintext
+PUT /projects/:id/integrations/buildkite
+```
+
+Parameters:
+
+| Parameter | Type | Required | Description |
+| --------- | ---- | -------- | ----------- |
+| `token` | string | true | Buildkite project GitLab token |
+| `project_url` | string | true | Pipeline URL. For example, `https://buildkite.com/example/pipeline` |
+| `enable_ssl_verification` | boolean | false | DEPRECATED: This parameter has no effect since SSL verification is always enabled |
+| `push_events` | boolean | false | Enable notifications for push events |
+
+### Delete Buildkite integration
+
+Delete Buildkite integration for a project.
+
+```plaintext
+DELETE /projects/:id/integrations/buildkite
+```
+
+### Get Buildkite integration settings
+
+Get Buildkite integration settings for a project.
+
+```plaintext
+GET /projects/:id/integrations/buildkite
+```
+
+## Campfire
+
+Send notifications about push events to Campfire chat rooms.
+[New users can no longer sign up for Campfire](https://basecamp.com/retired/campfire).
+
+### Create/Edit Campfire integration
+
+Set Campfire integration for a project.
+
+```plaintext
+PUT /projects/:id/integrations/campfire
+```
+
+Parameters:
+
+| Parameter | Type | Required | Description |
+|---------------|---------|----------|---------------------------------------------------------------------------------------------|
+| `token` | string | true | Campfire API token. To find it, log into Campfire and select **My info**. |
+| `subdomain` | string | false | Campfire subdomain. Text between `https://` and `.campfirenow.com` when you're logged in. |
+| `room` | string | false | Campfire room. The last part of the URL when you're in a room. |
+| `push_events` | boolean | false | Enable notifications for push events. |
+
+### Delete Campfire integration
+
+Delete Campfire integration for a project.
+
+```plaintext
+DELETE /projects/:id/integrations/campfire
+```
+
+### Get Campfire integration settings
+
+Get Campfire integration settings for a project.
+
+```plaintext
+GET /projects/:id/integrations/campfire
+```
+
+## Datadog
+
+Datadog system monitoring.
+
+### Create/Edit Datadog integration
+
+Set Datadog integration for a project.
+
+```plaintext
+PUT /projects/:id/integrations/datadog
+```
+
+Parameters:
+
+| Parameter | Type | Required | Description |
+| --------- | ---- | -------- | ----------- |
+| `api_key` | string | true | API key used for authentication with Datadog |
+| `api_url` | string | false | (Advanced) Define the full URL for your Datadog site directly |
+| `datadog_site` | string | false | Choose the Datadog site to send data to. Set to `datadoghq.eu` to send data to the EU site |
+| `datadog_service` | string | false | Name of this GitLab instance that all data will be tagged with |
+| `datadog_env` | string | false | The environment tag that traces will be tagged with |
+
+### Delete Datadog integration
+
+Delete Datadog integration for a project.
+
+```plaintext
+DELETE /projects/:id/integrations/datadog
+```
+
+### Get Datadog integration settings
+
+Get Datadog integration settings for a project.
+
+```plaintext
+GET /projects/:id/integrations/datadog
+```
+
+## Unify Circuit
+
+Unify Circuit RTC and collaboration tool.
+
+### Create/Edit Unify Circuit integration
+
+Set Unify Circuit integration for a project.
+
+```plaintext
+PUT /projects/:id/integrations/unify-circuit
+```
+
+Parameters:
+
+| Parameter | Type | Required | Description |
+| --------- | ---- | -------- | ----------- |
+| `webhook` | string | true | The Unify Circuit webhook. For example, `https://circuit.com/rest/v2/webhooks/incoming/...`. |
+| `notify_only_broken_pipelines` | boolean | false | Send notifications for broken pipelines |
+| `branches_to_be_notified` | string | false | Branches to send notifications for. Valid options are "all", "default", "protected", and "default_and_protected". The default value is "default" |
+| `push_events` | boolean | false | Enable notifications for push events |
+| `issues_events` | boolean | false | Enable notifications for issue events |
+| `confidential_issues_events` | boolean | false | Enable notifications for confidential issue events |
+| `merge_requests_events` | boolean | false | Enable notifications for merge request events |
+| `tag_push_events` | boolean | false | Enable notifications for tag push events |
+| `note_events` | boolean | false | Enable notifications for note events |
+| `confidential_note_events` | boolean | false | Enable notifications for confidential note events |
+| `pipeline_events` | boolean | false | Enable notifications for pipeline events |
+| `wiki_page_events` | boolean | false | Enable notifications for wiki page events |
+
+### Delete Unify Circuit integration
+
+Delete Unify Circuit integration for a project.
+
+```plaintext
+DELETE /projects/:id/integrations/unify-circuit
+```
+
+### Get Unify Circuit integration settings
+
+Get Unify Circuit integration settings for a project.
+
+```plaintext
+GET /projects/:id/integrations/unify-circuit
+```
+
+## Webex Teams
+
+Webex Teams collaboration tool.
+
+### Create/Edit Webex Teams integration
+
+Set Webex Teams integration for a project.
+
+```plaintext
+PUT /projects/:id/integrations/webex-teams
+```
+
+Parameters:
+
+| Parameter | Type | Required | Description |
+| --------- | ---- | -------- | ----------- |
+| `webhook` | string | true | The Webex Teams webhook. For example, `https://api.ciscospark.com/v1/webhooks/incoming/...`. |
+| `notify_only_broken_pipelines` | boolean | false | Send notifications for broken pipelines |
+| `branches_to_be_notified` | string | false | Branches to send notifications for. Valid options are "all", "default", "protected", and "default_and_protected". The default value is "default" |
+| `push_events` | boolean | false | Enable notifications for push events |
+| `issues_events` | boolean | false | Enable notifications for issue events |
+| `confidential_issues_events` | boolean | false | Enable notifications for confidential issue events |
+| `merge_requests_events` | boolean | false | Enable notifications for merge request events |
+| `tag_push_events` | boolean | false | Enable notifications for tag push events |
+| `note_events` | boolean | false | Enable notifications for note events |
+| `confidential_note_events` | boolean | false | Enable notifications for confidential note events |
+| `pipeline_events` | boolean | false | Enable notifications for pipeline events |
+| `wiki_page_events` | boolean | false | Enable notifications for wiki page events |
+
+### Delete Webex Teams integration
+
+Delete Webex Teams integration for a project.
+
+```plaintext
+DELETE /projects/:id/integrations/webex-teams
+```
+
+### Get Webex Teams integration settings
+
+Get Webex Teams integration settings for a project.
+
+```plaintext
+GET /projects/:id/integrations/webex-teams
+```
+
+## Custom Issue Tracker
+
+Custom issue tracker
+
+### Create/Edit Custom Issue Tracker integration
+
+Set Custom Issue Tracker integration for a project.
+
+```plaintext
+PUT /projects/:id/integrations/custom-issue-tracker
+```
+
+Parameters:
+
+| Parameter | Type | Required | Description |
+| --------- | ---- | -------- | ----------- |
+| `new_issue_url` | string | true | New Issue URL |
+| `issues_url` | string | true | Issue URL |
+| `project_url` | string | true | Project URL |
+| `description` | string | false | Description |
+| `title` | string | false | Title |
+| `push_events` | boolean | false | Enable notifications for push events |
+
+### Delete Custom Issue Tracker integration
+
+Delete Custom Issue Tracker integration for a project.
+
+```plaintext
+DELETE /projects/:id/integrations/custom-issue-tracker
+```
+
+### Get Custom Issue Tracker integration settings
+
+Get Custom Issue Tracker integration settings for a project.
+
+```plaintext
+GET /projects/:id/integrations/custom-issue-tracker
+```
+
+## Discord
+
+Send notifications about project events to a Discord channel.
+
+### Create/Edit Discord integration
+
+Set Discord integration for a project.
+
+```plaintext
+PUT /projects/:id/integrations/discord
+```
+
+Parameters:
+
+| Parameter | Type | Required | Description |
+| --------- | ---- | -------- | ----------- |
+| `webhook` | string | true | Discord webhook. For example, `https://discord.com/api/webhooks/…` |
+
+### Delete Discord integration
+
+Delete Discord integration for a project.
+
+```plaintext
+DELETE /projects/:id/integrations/discord
+```
+
+### Get Discord integration settings
+
+Get Discord integration settings for a project.
+
+```plaintext
+GET /projects/:id/integrations/discord
+```
+
+## Drone CI
+
+Drone is a Continuous Integration platform built on Docker, written in Go
+
+### Create/Edit Drone CI integration
+
+Set Drone CI integration for a project.
+
+```plaintext
+PUT /projects/:id/integrations/drone-ci
+```
+
+Parameters:
+
+| Parameter | Type | Required | Description |
+| --------- | ---- | -------- | ----------- |
+| `token` | string | true | Drone CI project specific token |
+| `drone_url` | string | true | `http://drone.example.com` |
+| `enable_ssl_verification` | boolean | false | Enable SSL verification |
+| `push_events` | boolean | false | Enable notifications for push events |
+| `merge_requests_events` | boolean | false | Enable notifications for merge request events |
+| `tag_push_events` | boolean | false | Enable notifications for tag push events |
+
+### Delete Drone CI integration
+
+Delete Drone CI integration for a project.
+
+```plaintext
+DELETE /projects/:id/integrations/drone-ci
+```
+
+### Get Drone CI integration settings
+
+Get Drone CI integration settings for a project.
+
+```plaintext
+GET /projects/:id/integrations/drone-ci
+```
+
+## Emails on Push
+
+Email the commits and diff of each push to a list of recipients.
+
+### Create/Edit Emails on Push integration
+
+Set Emails on Push integration for a project.
+
+```plaintext
+PUT /projects/:id/integrations/emails-on-push
+```
+
+Parameters:
+
+| Parameter | Type | Required | Description |
+| --------- | ---- | -------- | ----------- |
+| `recipients` | string | true | Emails separated by whitespace |
+| `disable_diffs` | boolean | false | Disable code diffs |
+| `send_from_committer_email` | boolean | false | Send from committer |
+| `push_events` | boolean | false | Enable notifications for push events |
+| `tag_push_events` | boolean | false | Enable notifications for tag push events |
+| `branches_to_be_notified` | string | false | Branches to send notifications for. Valid options are "all", "default", "protected", and "default_and_protected". Notifications are always fired for tag pushes. The default value is "all" |
+
+### Delete Emails on Push integration
+
+Delete Emails on Push integration for a project.
+
+```plaintext
+DELETE /projects/:id/integrations/emails-on-push
+```
+
+### Get Emails on Push integration settings
+
+Get Emails on Push integration settings for a project.
+
+```plaintext
+GET /projects/:id/integrations/emails-on-push
+```
+
+## Engineering Workflow Management (EWM)
+
+Use IBM Engineering Workflow Management (EWM) as a project's issue tracker.
+
+### Create/Edit EWM integration
+
+Set EWM integration for a project.
+
+```plaintext
+PUT /projects/:id/integrations/ewm
+```
+
+Parameters:
+
+| Parameter | Type | Required | Description |
+| --------- | ---- | -------- | ----------- |
+| `new_issue_url` | string | true | The URL to create an issue in EWM |
+| `project_url` | string | true | The URL to the project in EWM |
+| `issues_url` | string | true | The URL to view an issue in EWM. Must contain `:id` |
+
+### Delete EWM integration
+
+Delete EWM integration for a project.
+
+```plaintext
+DELETE /projects/:id/integrations/ewm
+```
+
+### Get EWM integration settings
+
+Get EWM integration settings for a project.
+
+```plaintext
+GET /projects/:id/integrations/ewm
+```
+
+## Confluence integration
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/220934) in GitLab 13.2.
+
+Replaces the link to the internal wiki with a link to a Confluence Cloud Workspace.
+
+### Create/Edit Confluence integration
+
+Set Confluence integration for a project.
+
+```plaintext
+PUT /projects/:id/integrations/confluence
+```
+
+Parameters:
+
+| Parameter | Type | Required | Description |
+| --------- | ---- | -------- | ----------- |
+| `confluence_url` | string | true | The URL of the Confluence Cloud Workspace hosted on atlassian.net. |
+
+### Delete Confluence integration
+
+Delete Confluence integration for a project.
+
+```plaintext
+DELETE /projects/:id/integrations/confluence
+```
+
+### Get Confluence integration settings
+
+Get Confluence integration settings for a project.
+
+```plaintext
+GET /projects/:id/integrations/confluence
+```
+
+## External wiki
+
+Replaces the link to the internal wiki with a link to an external wiki.
+
+### Create/Edit External wiki integration
+
+Set External wiki integration for a project.
+
+```plaintext
+PUT /projects/:id/integrations/external-wiki
+```
+
+Parameters:
+
+| Parameter | Type | Required | Description |
+| --------- | ---- | -------- | ----------- |
+| `external_wiki_url` | string | true | The URL of the external wiki |
+
+### Delete External wiki integration
+
+Delete External wiki integration for a project.
+
+```plaintext
+DELETE /projects/:id/integrations/external-wiki
+```
+
+### Get External wiki integration settings
+
+Get External wiki integration settings for a project.
+
+```plaintext
+GET /projects/:id/integrations/external-wiki
+```
+
+## Flowdock
+
+Flowdock is a ChatOps application for collaboration in software engineering
+companies. You can send notifications from GitLab events to Flowdock flows.
+For integration instructions, see the [Flowdock documentation](https://www.flowdock.com/help/gitlab).
+
+### Create/Edit Flowdock integration
+
+Set Flowdock integration for a project.
+
+```plaintext
+PUT /projects/:id/integrations/flowdock
+```
+
+Parameters:
+
+| Parameter | Type | Required | Description |
+| --------- | ---- | -------- | ----------- |
+| `token` | string | true | Flowdock Git source token |
+| `push_events` | boolean | false | Enable notifications for push events |
+
+### Delete Flowdock integration
+
+Delete Flowdock integration for a project.
+
+```plaintext
+DELETE /projects/:id/integrations/flowdock
+```
+
+### Get Flowdock integration settings
+
+Get Flowdock integration settings for a project.
+
+```plaintext
+GET /projects/:id/integrations/flowdock
+```
+
+## GitHub **(PREMIUM)**
+
+Code collaboration software.
+
+### Create/Edit GitHub integration
+
+Set GitHub integration for a project.
+
+```plaintext
+PUT /projects/:id/integrations/github
+```
+
+Parameters:
+
+| Parameter | Type | Required | Description |
+| --------- | ---- | -------- | ----------- |
+| `token` | string | true | GitHub API token with `repo:status` OAuth scope |
+| `repository_url` | string | true | GitHub repository URL |
+| `static_context` | boolean | false | Append instance name instead of branch to [status check name](../user/project/integrations/github.md#static--dynamic-status-check-names) |
+
+### Delete GitHub integration
+
+Delete GitHub integration for a project.
+
+```plaintext
+DELETE /projects/:id/integrations/github
+```
+
+### Get GitHub integration settings
+
+Get GitHub integration settings for a project.
+
+```plaintext
+GET /projects/:id/integrations/github
+```
+
+## Hangouts Chat
+
+Google Workspace team collaboration tool.
+
+### Create/Edit Hangouts Chat integration
+
+Set Hangouts Chat integration for a project.
+
+```plaintext
+PUT /projects/:id/integrations/hangouts-chat
+```
+
+Parameters:
+
+| Parameter | Type | Required | Description |
+| --------- | ---- | -------- | ----------- |
+| `webhook` | string | true | The Hangouts Chat webhook. For example, `https://chat.googleapis.com/v1/spaces...`. |
+| `notify_only_broken_pipelines` | boolean | false | Send notifications for broken pipelines |
+| `notify_only_default_branch` | boolean | false | DEPRECATED: This parameter has been replaced with `branches_to_be_notified` |
+| `branches_to_be_notified` | string | false | Branches to send notifications for. Valid options are "all", "default", "protected", and "default_and_protected". The default value is "default" |
+| `push_events` | boolean | false | Enable notifications for push events |
+| `issues_events` | boolean | false | Enable notifications for issue events |
+| `confidential_issues_events` | boolean | false | Enable notifications for confidential issue events |
+| `merge_requests_events` | boolean | false | Enable notifications for merge request events |
+| `tag_push_events` | boolean | false | Enable notifications for tag push events |
+| `note_events` | boolean | false | Enable notifications for note events |
+| `confidential_note_events` | boolean | false | Enable notifications for confidential note events |
+| `pipeline_events` | boolean | false | Enable notifications for pipeline events |
+| `wiki_page_events` | boolean | false | Enable notifications for wiki page events |
+
+### Delete Hangouts Chat integration
+
+Delete Hangouts Chat integration for a project.
+
+```plaintext
+DELETE /projects/:id/integrations/hangouts-chat
+```
+
+### Get Hangouts Chat integration settings
+
+Get Hangouts Chat integration settings for a project.
+
+```plaintext
+GET /projects/:id/integrations/hangouts-chat
+```
+
+## Irker (IRC gateway)
+
+Send IRC messages, on update, to a list of recipients through an irker gateway.
+
+For more information, see the [irker integration documentation](../user/project/integrations/irker.md).
+
+### Create/Edit Irker (IRC gateway) integration
+
+Set Irker (IRC gateway) integration for a project.
+
+```plaintext
+PUT /projects/:id/integrations/irker
+```
+
+Parameters:
+
+| Parameter | Type | Required | Description |
+| --------- | ---- | -------- | ----------- |
+| `recipients` | string | true | Recipients/channels separated by whitespaces |
+| `default_irc_uri` | string | false | `irc://irc.network.net:6697/` |
+| `server_host` | string | false | localhost |
+| `server_port` | integer | false | 6659 |
+| `colorize_messages` | boolean | false | Colorize messages |
+| `push_events` | boolean | false | Enable notifications for push events |
+
+### Delete Irker (IRC gateway) integration
+
+Delete Irker (IRC gateway) integration for a project.
+
+```plaintext
+DELETE /projects/:id/integrations/irker
+```
+
+### Get Irker (IRC gateway) integration settings
+
+Get Irker (IRC gateway) integration settings for a project.
+
+```plaintext
+GET /projects/:id/integrations/irker
+```
+
+## Jira
+
+Jira issue tracker.
+
+### Get Jira integration settings
+
+Get Jira integration settings for a project.
+
+```plaintext
+GET /projects/:id/integrations/jira
+```
+
+### Create/Edit Jira integration
+
+Set Jira integration for a project.
+
+```plaintext
+PUT /projects/:id/integrations/jira
+```
+
+Parameters:
+
+| Parameter | Type | Required | Description |
+| --------- | ---- | -------- | ----------- |
+| `url` | string | yes | The URL to the Jira project which is being linked to this GitLab project. For example, `https://jira.example.com`. |
+| `api_url` | string | no | The base URL to the Jira instance API. Web URL value is used if not set. For example, `https://jira-api.example.com`. |
+| `username` | string | yes | The username of the user created to be used with GitLab/Jira. |
+| `password` | string | yes | The password of the user created to be used with GitLab/Jira. |
+| `active` | boolean | no | Activates or deactivates the integration. Defaults to false (deactivated). |
+| `jira_issue_transition_automatic` | boolean | no | Enable [automatic issue transitions](../integration/jira/issues.md#automatic-issue-transitions). Takes precedence over `jira_issue_transition_id` if enabled. Defaults to `false` |
+| `jira_issue_transition_id` | string | no | The ID of one or more transitions for [custom issue transitions](../integration/jira/issues.md#custom-issue-transitions). Ignored if `jira_issue_transition_automatic` is enabled. Defaults to a blank string, which disables custom transitions. |
+| `commit_events` | boolean | false | Enable notifications for commit events |
+| `merge_requests_events` | boolean | false | Enable notifications for merge request events |
+| `comment_on_event_enabled` | boolean | false | Enable comments inside Jira issues on each GitLab event (commit / merge request) |
+
+### Delete Jira integration
+
+Remove all previously Jira integrations from a project.
+
+```plaintext
+DELETE /projects/:id/integrations/jira
+```
+
+## Slack Slash Commands
+
+Ability to receive slash commands from a Slack chat instance.
+
+### Get Slack Slash Command integration settings
+
+Get Slack Slash Command integration settings for a project.
+
+```plaintext
+GET /projects/:id/integrations/slack-slash-commands
+```
+
+Example response:
+
+```json
+{
+ "id": 4,
+ "title": "Slack slash commands",
+ "slug": "slack-slash-commands",
+ "created_at": "2017-06-27T05:51:39-07:00",
+ "updated_at": "2017-06-27T05:51:39-07:00",
+ "active": true,
+ "push_events": true,
+ "issues_events": true,
+ "confidential_issues_events": true,
+ "merge_requests_events": true,
+ "tag_push_events": true,
+ "note_events": true,
+ "job_events": true,
+ "pipeline_events": true,
+ "comment_on_event_enabled": false,
+ "properties": {
+ "token": "<your_access_token>"
+ }
+}
+```
+
+### Create/Edit Slack Slash Commands integration
+
+Set Slack Slash Command for a project.
+
+```plaintext
+PUT /projects/:id/integrations/slack-slash-commands
+```
+
+Parameters:
+
+| Parameter | Type | Required | Description |
+| --------- | ---- | -------- | ----------- |
+| `token` | string | yes | The Slack token |
+
+### Delete Slack Slash Command integration
+
+Delete Slack Slash Command integration for a project.
+
+```plaintext
+DELETE /projects/:id/integrations/slack-slash-commands
+```
+
+## Mattermost Slash Commands
+
+Ability to receive slash commands from a Mattermost chat instance.
+
+### Get Mattermost Slash Command integration settings
+
+Get Mattermost Slash Command integration settings for a project.
+
+```plaintext
+GET /projects/:id/integrations/mattermost-slash-commands
+```
+
+### Create/Edit Mattermost Slash Command integration
+
+Set Mattermost Slash Command for a project.
+
+```plaintext
+PUT /projects/:id/integrations/mattermost-slash-commands
+```
+
+Parameters:
+
+| Parameter | Type | Required | Description |
+| --------- | ---- | -------- | ----------- |
+| `token` | string | yes | The Mattermost token |
+| `username` | string | no | The username to use to post the message |
+
+### Delete Mattermost Slash Command integration
+
+Delete Mattermost Slash Command integration for a project.
+
+```plaintext
+DELETE /projects/:id/integrations/mattermost-slash-commands
+```
+
+## Packagist
+
+Update your project on Packagist (the main Composer repository) when commits or tags are pushed to GitLab.
+
+### Create/Edit Packagist integration
+
+Set Packagist integration for a project.
+
+```plaintext
+PUT /projects/:id/integrations/packagist
+```
+
+Parameters:
+
+| Parameter | Type | Required | Description |
+| --------- | ---- | -------- | ----------- |
+| `username` | string | yes | The username of a Packagist account |
+| `token` | string | yes | API token to the Packagist server |
+| `server` | boolean | no | URL of the Packagist server. Leave blank for default: <https://packagist.org> |
+| `push_events` | boolean | false | Enable notifications for push events |
+| `merge_requests_events` | boolean | false | Enable notifications for merge request events |
+| `tag_push_events` | boolean | false | Enable notifications for tag push events |
+
+### Delete Packagist integration
+
+Delete Packagist integration for a project.
+
+```plaintext
+DELETE /projects/:id/integrations/packagist
+```
+
+### Get Packagist integration settings
+
+Get Packagist integration settings for a project.
+
+```plaintext
+GET /projects/:id/integrations/packagist
+```
+
+## Pipeline-Emails
+
+Get emails for GitLab CI/CD pipelines.
+
+### Create/Edit Pipeline-Emails integration
+
+Set Pipeline-Emails integration for a project.
+
+```plaintext
+PUT /projects/:id/integrations/pipelines-email
+```
+
+Parameters:
+
+| Parameter | Type | Required | Description |
+| --------- | ---- | -------- | ----------- |
+| `recipients` | string | yes | Comma-separated list of recipient email addresses |
+| `add_pusher` | boolean | no | Add pusher to recipients list |
+| `notify_only_broken_pipelines` | boolean | no | Notify only broken pipelines |
+| `branches_to_be_notified` | string | false | Branches to send notifications for. Valid options are "all", "default", "protected", and "default_and_protected. The default value is "default" |
+| `notify_only_default_branch` | boolean | no | Send notifications only for the default branch ([introduced in GitLab 12.0](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/28271)) |
+| `pipeline_events` | boolean | false | Enable notifications for pipeline events |
+
+### Delete Pipeline-Emails integration
+
+Delete Pipeline-Emails integration for a project.
+
+```plaintext
+DELETE /projects/:id/integrations/pipelines-email
+```
+
+### Get Pipeline-Emails integration settings
+
+Get Pipeline-Emails integration settings for a project.
+
+```plaintext
+GET /projects/:id/integrations/pipelines-email
+```
+
+## Pivotal Tracker
+
+Add commit messages as comments to Pivotal Tracker stories.
+
+See also the [Pivotal Tracker integration documentation](../user/project/integrations/pivotal_tracker.md).
+
+### Create/Edit Pivotal Tracker integration
+
+Set Pivotal Tracker integration for a project.
+
+```plaintext
+PUT /projects/:id/integrations/pivotaltracker
+```
+
+Parameters:
+
+| Parameter | Type | Required | Description |
+| --------- | ---- | -------- | ----------- |
+| `token` | string | true | The Pivotal Tracker token |
+| `restrict_to_branch` | boolean | false | Comma-separated list of branches to automatically inspect. Leave blank to include all branches. |
+| `push_events` | boolean | false | Enable notifications for push events |
+
+### Delete Pivotal Tracker integration
+
+Delete Pivotal Tracker integration for a project.
+
+```plaintext
+DELETE /projects/:id/integrations/pivotaltracker
+```
+
+### Get Pivotal Tracker integration settings
+
+Get Pivotal Tracker integration settings for a project.
+
+```plaintext
+GET /projects/:id/integrations/pivotaltracker
+```
+
+## Prometheus
+
+Prometheus is a powerful time-series monitoring service.
+
+### Create/Edit Prometheus integration
+
+Set Prometheus integration for a project.
+
+```plaintext
+PUT /projects/:id/integrations/prometheus
+```
+
+Parameters:
+
+| Parameter | Type | Required | Description |
+| --------- | ---- | -------- | ----------- |
+| `api_url` | string | true | Prometheus API Base URL. For example, `http://prometheus.example.com/`. |
+| `google_iap_audience_client_id` | string | false | Client ID of the IAP secured resource (looks like IAP_CLIENT_ID.apps.googleusercontent.com) |
+| `google_iap_service_account_json` | string | false | `credentials.json` file for your service account, like { "type": "service_account", "project_id": ... } |
+
+### Delete Prometheus integration
+
+Delete Prometheus integration for a project.
+
+```plaintext
+DELETE /projects/:id/integrations/prometheus
+```
+
+### Get Prometheus integration settings
+
+Get Prometheus integration settings for a project.
+
+```plaintext
+GET /projects/:id/integrations/prometheus
+```
+
+## Pushover
+
+Pushover makes it easy to get real-time notifications on your Android device, iPhone, iPad, and Desktop.
+
+### Create/Edit Pushover integration
+
+Set Pushover integration for a project.
+
+```plaintext
+PUT /projects/:id/integrations/pushover
+```
+
+Parameters:
+
+| Parameter | Type | Required | Description |
+| --------- | ---- | -------- | ----------- |
+| `api_key` | string | true | Your application key |
+| `user_key` | string | true | Your user key |
+| `priority` | string | true | The priority |
+| `device` | string | false | Leave blank for all active devices |
+| `sound` | string | false | The sound of the notification |
+| `push_events` | boolean | false | Enable notifications for push events |
+
+### Delete Pushover integration
+
+Delete Pushover integration for a project.
+
+```plaintext
+DELETE /projects/:id/integrations/pushover
+```
+
+### Get Pushover integration settings
+
+Get Pushover integration settings for a project.
+
+```plaintext
+GET /projects/:id/integrations/pushover
+```
+
+## Redmine
+
+Redmine issue tracker
+
+### Create/Edit Redmine integration
+
+Set Redmine integration for a project.
+
+```plaintext
+PUT /projects/:id/integrations/redmine
+```
+
+Parameters:
+
+| Parameter | Type | Required | Description |
+| --------- | ---- | -------- | ----------- |
+| `new_issue_url` | string | true | New Issue URL |
+| `project_url` | string | true | Project URL |
+| `issues_url` | string | true | Issue URL |
+| `description` | string | false | Description |
+| `push_events` | boolean | false | Enable notifications for push events |
+
+### Delete Redmine integration
+
+Delete Redmine integration for a project.
+
+```plaintext
+DELETE /projects/:id/integrations/redmine
+```
+
+### Get Redmine integration settings
+
+Get Redmine integration settings for a project.
+
+```plaintext
+GET /projects/:id/integrations/redmine
+```
+
+## Slack notifications
+
+Receive event notifications in Slack
+
+### Create/Edit Slack integration
+
+Set Slack integration for a project.
+
+```plaintext
+PUT /projects/:id/integrations/slack
+```
+
+Parameters:
+
+| Parameter | Type | Required | Description |
+| --------- | ---- | -------- | ----------- |
+| `webhook` | string | true | `https://hooks.slack.com/services/...` |
+| `username` | string | false | username |
+| `channel` | string | false | Default channel to use if others are not configured |
+| `notify_only_broken_pipelines` | boolean | false | Send notifications for broken pipelines |
+| `notify_only_default_branch` | boolean | false | DEPRECATED: This parameter has been replaced with `branches_to_be_notified` |
+| `branches_to_be_notified` | string | false | Branches to send notifications for. Valid options are "all", "default", "protected", and "default_and_protected". The default value is "default" |
+| `commit_events` | boolean | false | Enable notifications for commit events |
+| `confidential_issue_channel` | string | false | The name of the channel to receive confidential issues events notifications |
+| `confidential_issues_events` | boolean | false | Enable notifications for confidential issue events |
+| `confidential_note_channel` | string | false | The name of the channel to receive confidential note events notifications |
+| `confidential_note_events` | boolean | false | Enable notifications for confidential note events |
+| `deployment_channel` | string | false | The name of the channel to receive deployment events notifications |
+| `deployment_events` | boolean | false | Enable notifications for deployment events |
+| `issue_channel` | string | false | The name of the channel to receive issues events notifications |
+| `issues_events` | boolean | false | Enable notifications for issue events |
+| `job_events` | boolean | false | Enable notifications for job events |
+| `merge_request_channel` | string | false | The name of the channel to receive merge request events notifications |
+| `merge_requests_events` | boolean | false | Enable notifications for merge request events |
+| `note_channel` | string | false | The name of the channel to receive note events notifications |
+| `note_events` | boolean | false | Enable notifications for note events |
+| `pipeline_channel` | string | false | The name of the channel to receive pipeline events notifications |
+| `pipeline_events` | boolean | false | Enable notifications for pipeline events |
+| `push_channel` | string | false | The name of the channel to receive push events notifications |
+| `push_events` | boolean | false | Enable notifications for push events |
+| `tag_push_channel` | string | false | The name of the channel to receive tag push events notifications |
+| `tag_push_events` | boolean | false | Enable notifications for tag push events |
+| `wiki_page_channel` | string | false | The name of the channel to receive wiki page events notifications |
+| `wiki_page_events` | boolean | false | Enable notifications for wiki page events |
+
+### Delete Slack integration
+
+Delete Slack integration for a project.
+
+```plaintext
+DELETE /projects/:id/integrations/slack
+```
+
+### Get Slack integration settings
+
+Get Slack integration settings for a project.
+
+```plaintext
+GET /projects/:id/integrations/slack
+```
+
+## Microsoft Teams
+
+Group Chat Software
+
+### Create/Edit Microsoft Teams integration
+
+Set Microsoft Teams integration for a project.
+
+```plaintext
+PUT /projects/:id/integrations/microsoft-teams
+```
+
+Parameters:
+
+| Parameter | Type | Required | Description |
+| --------- | ---- | -------- | ----------- |
+| `webhook` | string | true | The Microsoft Teams webhook. For example, `https://outlook.office.com/webhook/...` |
+| `notify_only_broken_pipelines` | boolean | false | Send notifications for broken pipelines |
+| `notify_only_default_branch` | boolean | false | DEPRECATED: This parameter has been replaced with `branches_to_be_notified` |
+| `branches_to_be_notified` | string | false | Branches to send notifications for. Valid options are "all", "default", "protected", and "default_and_protected". The default value is "default" |
+| `push_events` | boolean | false | Enable notifications for push events |
+| `issues_events` | boolean | false | Enable notifications for issue events |
+| `confidential_issues_events` | boolean | false | Enable notifications for confidential issue events |
+| `merge_requests_events` | boolean | false | Enable notifications for merge request events |
+| `tag_push_events` | boolean | false | Enable notifications for tag push events |
+| `note_events` | boolean | false | Enable notifications for note events |
+| `confidential_note_events` | boolean | false | Enable notifications for confidential note events |
+| `pipeline_events` | boolean | false | Enable notifications for pipeline events |
+| `wiki_page_events` | boolean | false | Enable notifications for wiki page events |
+
+### Delete Microsoft Teams integration
+
+Delete Microsoft Teams integration for a project.
+
+```plaintext
+DELETE /projects/:id/integrations/microsoft-teams
+```
+
+### Get Microsoft Teams integration settings
+
+Get Microsoft Teams integration settings for a project.
+
+```plaintext
+GET /projects/:id/integrations/microsoft-teams
+```
+
+## Mattermost notifications
+
+Receive event notifications in Mattermost
+
+### Create/Edit Mattermost notifications integration
+
+Set Mattermost notifications integration for a project.
+
+```plaintext
+PUT /projects/:id/integrations/mattermost
+```
+
+Parameters:
+
+| Parameter | Type | Required | Description |
+| --------- | ---- | -------- | ----------- |
+| `webhook` | string | true | The Mattermost webhook. For example, `http://mattermost_host/hooks/...` |
+| `username` | string | false | username |
+| `channel` | string | false | Default channel to use if others are not configured |
+| `notify_only_broken_pipelines` | boolean | false | Send notifications for broken pipelines |
+| `notify_only_default_branch` | boolean | false | DEPRECATED: This parameter has been replaced with `branches_to_be_notified` |
+| `branches_to_be_notified` | string | false | Branches to send notifications for. Valid options are "all", "default", "protected", and "default_and_protected". The default value is "default" |
+| `push_events` | boolean | false | Enable notifications for push events |
+| `issues_events` | boolean | false | Enable notifications for issue events |
+| `confidential_issues_events` | boolean | false | Enable notifications for confidential issue events |
+| `merge_requests_events` | boolean | false | Enable notifications for merge request events |
+| `tag_push_events` | boolean | false | Enable notifications for tag push events |
+| `note_events` | boolean | false | Enable notifications for note events |
+| `confidential_note_events` | boolean | false | Enable notifications for confidential note events |
+| `pipeline_events` | boolean | false | Enable notifications for pipeline events |
+| `wiki_page_events` | boolean | false | Enable notifications for wiki page events |
+| `push_channel` | string | false | The name of the channel to receive push events notifications |
+| `issue_channel` | string | false | The name of the channel to receive issues events notifications |
+| `confidential_issue_channel` | string | false | The name of the channel to receive confidential issues events notifications |
+| `merge_request_channel` | string | false | The name of the channel to receive merge request events notifications |
+| `note_channel` | string | false | The name of the channel to receive note events notifications |
+| `confidential_note_channel` | string | false | The name of the channel to receive confidential note events notifications |
+| `tag_push_channel` | string | false | The name of the channel to receive tag push events notifications |
+| `pipeline_channel` | string | false | The name of the channel to receive pipeline events notifications |
+| `wiki_page_channel` | string | false | The name of the channel to receive wiki page events notifications |
+
+### Delete Mattermost notifications integration
+
+Delete Mattermost notifications integration for a project.
+
+```plaintext
+DELETE /projects/:id/integrations/mattermost
+```
+
+### Get Mattermost notifications integration settings
+
+Get Mattermost notifications integration settings for a project.
+
+```plaintext
+GET /projects/:id/integrations/mattermost
+```
+
+## JetBrains TeamCity CI
+
+A continuous integration and build server
+
+### Create/Edit JetBrains TeamCity CI integration
+
+Set JetBrains TeamCity CI integration for a project.
+
+> The build configuration in TeamCity must use the build format number `%build.vcs.number%`. Configure monitoring of all branches so merge requests build. That setting is in the VSC root advanced settings.
+
+```plaintext
+PUT /projects/:id/integrations/teamcity
+```
+
+Parameters:
+
+| Parameter | Type | Required | Description |
+| --------- | ---- | -------- | ----------- |
+| `teamcity_url` | string | true | TeamCity root URL. For example, `https://teamcity.example.com` |
+| `build_type` | string | true | Build configuration ID |
+| `username` | string | true | A user with permissions to trigger a manual build |
+| `password` | string | true | The password of the user |
+| `push_events` | boolean | false | Enable notifications for push events |
+
+### Delete JetBrains TeamCity CI integration
+
+Delete JetBrains TeamCity CI integration for a project.
+
+```plaintext
+DELETE /projects/:id/integrations/teamcity
+```
+
+### Get JetBrains TeamCity CI integration settings
+
+Get JetBrains TeamCity CI integration settings for a project.
+
+```plaintext
+GET /projects/:id/integrations/teamcity
+```
+
+## Jenkins CI
+
+A continuous integration and build server
+
+### Create/Edit Jenkins CI integration
+
+Set Jenkins CI integration for a project.
+
+```plaintext
+PUT /projects/:id/integrations/jenkins
+```
+
+Parameters:
+
+| Parameter | Type | Required | Description |
+| --------- | ---- | -------- | ----------- |
+| `jenkins_url` | string | true | Jenkins URL like `http://jenkins.example.com`. |
+| `project_name` | string | true | The URL-friendly project name. Example: `my_project_name`. |
+| `username` | string | false | Username for authentication with the Jenkins server, if authentication is required by the server. |
+| `password` | string | false | Password for authentication with the Jenkins server, if authentication is required by the server. |
+| `push_events` | boolean | false | Enable notifications for push events. |
+| `merge_requests_events` | boolean | false | Enable notifications for merge request events. |
+| `tag_push_events` | boolean | false | Enable notifications for tag push events. |
+
+### Delete Jenkins CI integration
+
+Delete Jenkins CI integration for a project.
+
+```plaintext
+DELETE /projects/:id/integrations/jenkins
+```
+
+### Get Jenkins CI integration settings
+
+Get Jenkins CI integration settings for a project.
+
+```plaintext
+GET /projects/:id/integrations/jenkins
+```
+
+## Jenkins CI (Deprecated) integration
+
+A continuous integration and build server
+
+NOTE:
+This integration was [removed](https://gitlab.com/gitlab-org/gitlab/-/issues/1600) in GitLab 13.0.
+
+### Create/Edit Jenkins CI (Deprecated) integration
+
+Set Jenkins CI (Deprecated) integration for a project.
+
+```plaintext
+PUT /projects/:id/integrations/jenkins-deprecated
+```
+
+Parameters:
+
+- `project_url` (**required**) - Jenkins project URL like `http://jenkins.example.com/job/my-project/`
+- `multiproject_enabled` (optional) - Multi-project mode is configured in Jenkins GitLab Hook plugin
+- `pass_unstable` (optional) - Unstable builds are treated as passing
+
+### Delete Jenkins CI (Deprecated) integration
+
+Delete Jenkins CI (Deprecated) integration for a project.
+
+```plaintext
+DELETE /projects/:id/integrations/jenkins-deprecated
+```
+
+### Get Jenkins CI (Deprecated) integration settings
+
+Get Jenkins CI (Deprecated) integration settings for a project.
+
+```plaintext
+GET /projects/:id/integrations/jenkins-deprecated
+```
+
+## MockCI
+
+Mock an external CI. See [`gitlab-org/gitlab-mock-ci-service`](https://gitlab.com/gitlab-org/gitlab-mock-ci-service) for an example of a companion mock integration.
+
+This integration is only available when your environment is set to development.
+
+### Create/Edit MockCI integration
+
+Set MockCI integration for a project.
+
+```plaintext
+PUT /projects/:id/integrations/mock-ci
+```
+
+Parameters:
+
+| Parameter | Type | Required | Description |
+| --------- | ---- | -------- | ----------- |
+| `mock_service_url` | string | true | `http://localhost:4004` |
+
+### Delete MockCI integration
+
+Delete MockCI integration for a project.
+
+```plaintext
+DELETE /projects/:id/integrations/mock-ci
+```
+
+### Get MockCI integration settings
+
+Get MockCI integration settings for a project.
+
+```plaintext
+GET /projects/:id/integrations/mock-ci
+```
+
+## YouTrack
+
+YouTrack issue tracker
+
+### Create/Edit YouTrack integration
+
+Set YouTrack integration for a project.
+
+```plaintext
+PUT /projects/:id/integrations/youtrack
+```
+
+Parameters:
+
+| Parameter | Type | Required | Description |
+| --------- | ---- | -------- | ----------- |
+| `issues_url` | string | true | Issue URL |
+| `project_url` | string | true | Project URL |
+| `description` | string | false | Description |
+| `push_events` | boolean | false | Enable notifications for push events |
+
+### Delete YouTrack integration
+
+Delete YouTrack integration for a project.
+
+```plaintext
+DELETE /projects/:id/integrations/youtrack
+```
+
+### Get YouTrack integration settings
+
+Get YouTrack integration settings for a project.
+
+```plaintext
+GET /projects/:id/integrations/youtrack
+```
diff --git a/doc/api/issues.md b/doc/api/issues.md
index 97d0fd3ce8f..204d75e9ee4 100644
--- a/doc/api/issues.md
+++ b/doc/api/issues.md
@@ -1487,6 +1487,113 @@ NOTE:
The `closed_by` attribute was [introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/17042) in GitLab 10.6. This value is only present for issues closed after GitLab 10.6 and if the user account that closed
the issue still exists.
+## Clone an issue
+
+Clone the issue to given project. If the user has insufficient permissions,
+an error message with status code `400` is returned.
+
+Copies as much data as possible as long as the target project contains equivalent labels, milestones,
+and so on.
+
+```plaintext
+POST /projects/:id/issues/:issue_iid/clone
+```
+
+| Attribute | Type | Required | Description |
+| --------------- | -------------- | ---------------------- | --------------------------------- |
+| `id` | integer/string | **{check-circle}** Yes | ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user. |
+| `issue_iid` | integer | **{check-circle}** Yes | Internal ID of a project's issue. |
+| `to_project_id` | integer | **{check-circle}** Yes | ID of the new project. |
+| `with_notes` | boolean | **{dotted-circle}** No | Clone the issue with [notes](notes.md). Default is `false`. |
+
+```shell
+curl --request POST \
+--header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/5/issues/1/clone?with_notes=true&to_project_id=6"
+```
+
+Example response:
+
+```json
+{
+ "id":290,
+ "iid":1,
+ "project_id":143,
+ "title":"foo",
+ "description":"closed",
+ "state":"opened",
+ "created_at":"2021-09-14T22:24:11.696Z",
+ "updated_at":"2021-09-14T22:24:11.696Z",
+ "closed_at":null,
+ "closed_by":null,
+ "labels":[
+
+ ],
+ "milestone":null,
+ "assignees":[
+ {
+ "id":179,
+ "name":"John Doe2",
+ "username":"john",
+ "state":"active",
+ "avatar_url":"https://www.gravatar.com/avatar/10fc7f102be8de7657fb4d80898bbfe3?s=80\u0026d=identicon",
+ "web_url":"https://gitlab.example.com/john"
+ }
+ ],
+ "author":{
+ "id":179,
+ "name":"John Doe2",
+ "username":"john",
+ "state":"active",
+ "avatar_url":"https://www.gravatar.com/avatar/10fc7f102be8de7657fb4d80898bbfe3?s=80\u0026d=identicon",
+ "web_url":"https://gitlab.example.com/john"
+ },
+ "type":"ISSUE",
+ "assignee":{
+ "id":179,
+ "name":"John Doe2",
+ "username":"john",
+ "state":"active",
+ "avatar_url":"https://www.gravatar.com/avatar/10fc7f102be8de7657fb4d80898bbfe3?s=80\u0026d=identicon",
+ "web_url":"https://gitlab.example.com/john"
+ },
+ "user_notes_count":1,
+ "merge_requests_count":0,
+ "upvotes":0,
+ "downvotes":0,
+ "due_date":null,
+ "confidential":false,
+ "discussion_locked":null,
+ "issue_type":"issue",
+ "web_url":"https://gitlab.example.com/namespace1/project2/-/issues/1",
+ "time_stats":{
+ "time_estimate":0,
+ "total_time_spent":0,
+ "human_time_estimate":null,
+ "human_total_time_spent":null
+ },
+ "task_completion_status":{
+ "count":0,
+ "completed_count":0
+ },
+ "blocking_issues_count":0,
+ "has_tasks":false,
+ "_links":{
+ "self":"https://gitlab.example.com/api/v4/projects/143/issues/1",
+ "notes":"https://gitlab.example.com/api/v4/projects/143/issues/1/notes",
+ "award_emoji":"https://gitlab.example.com/api/v4/projects/143/issues/1/award_emoji",
+ "project":"https://gitlab.example.com/api/v4/projects/143"
+ },
+ "references":{
+ "short":"#1",
+ "relative":"#1",
+ "full":"namespace1/project2#1"
+ },
+ "subscribed":true,
+ "moved_to_id":null,
+ "service_desk_reply_to":null
+}
+```
+
## Subscribe to an issue
Subscribes the authenticated user to an issue to receive notifications.
diff --git a/doc/api/members.md b/doc/api/members.md
index 0b8cf686b8c..44e58f49d3b 100644
--- a/doc/api/members.md
+++ b/doc/api/members.md
@@ -336,7 +336,7 @@ The response represents only direct memberships. Inherited memberships are not i
This API endpoint works on top-level groups only. It does not work on subgroups.
-This API endpoint requires permission to admin memberships for the group.
+This API endpoint requires permission to administer memberships for the group.
This API endpoint takes [pagination](index.md#pagination) parameters `page` and `per_page` to restrict the list of memberships.
@@ -561,7 +561,12 @@ Example response:
## Remove a member from a group or project
-Removes a user from a group or project.
+Removes a user from a group or project where the user has been explicitly assigned a role.
+
+The user needs to be a group member to qualify for removal.
+For example, if the user was added directly to a project within the group but not this
+group explicitly, you cannot use this API to remove them. See
+[Remove a billable member from a group](#remove-a-billable-member-from-a-group) for an alternative approach.
```plaintext
DELETE /groups/:id/members/:user_id
diff --git a/doc/api/merge_request_approvals.md b/doc/api/merge_request_approvals.md
index b4403e1d9b9..4ede95ea189 100644
--- a/doc/api/merge_request_approvals.md
+++ b/doc/api/merge_request_approvals.md
@@ -2,7 +2,6 @@
stage: Create
group: Source Code
info: "To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments"
-type: reference, api
---
# Merge request approvals API **(PREMIUM)**
@@ -15,8 +14,7 @@ in the project. Must be authenticated for all endpoints.
### Get Configuration
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/183) in GitLab 10.6.
-> - Moved to GitLab Premium in 13.9.
+> Moved to GitLab Premium in 13.9.
You can request information about a project's approval configuration using the
following endpoint:
@@ -44,8 +42,7 @@ GET /projects/:id/approvals
### Change configuration
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/183) in GitLab 10.6.
-> - Moved to GitLab Premium in 13.9.
+> Moved to GitLab Premium in 13.9.
If you are allowed to, you can change approval configuration using the following
endpoint:
@@ -180,7 +177,7 @@ GET /projects/:id/approval_rules
### Get a single project-level rule
-> - Introduced 13.7.
+> Introduced in GitLab 13.7.
You can request information about a single project approval rules using the following endpoint:
@@ -294,9 +291,10 @@ POST /projects/:id/approval_rules
| `id` | integer or string | yes | The ID or [URL-encoded path of a project](index.md#namespaced-path-encoding) |
| `name` | string | yes | The name of the approval rule |
| `approvals_required` | integer | yes | The number of required approvals for this rule |
+| `rule_type` | string | 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 | no | The ids of users as approvers |
| `group_ids` | Array | no | The ids of groups as approvers |
-| `protected_branch_ids` | Array | no | **(PREMIUM)** The ids of protected branches to scope the rule by |
+| `protected_branch_ids` | Array | no | **(PREMIUM)** The ids of protected branches to scope the rule by. To identify the ID, [use the API](protected_branches.md#list-protected-branches). |
```json
{
@@ -379,6 +377,23 @@ POST /projects/:id/approval_rules
}
```
+You can increase the default number of 0 required approvers like this:
+
+```shell
+curl --request POST --header "PRIVATE-TOKEN: <your_access_token>" \
+ --header 'Content-Type: application/json' \
+ --data '{"name": "Any name", "rule_type": "any_approver", "approvals_required": 2}'
+```
+
+Another example is creating an additional, user-specific rule:
+
+```shell
+curl --request POST --header "PRIVATE-TOKEN: <your_access_token>" \
+ --header 'Content-Type: application/json' \
+ --data '{"name": "Name of your rule", "approvals_required": 3, "user_ids": [123, 456, 789]}' \
+ https://gitlab.example.com/api/v4/projects/<project_id>/approval_rules
+```
+
### Update project-level rule
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/11877) in GitLab 12.3.
@@ -402,7 +417,7 @@ PUT /projects/:id/approval_rules/:approval_rule_id
| `approvals_required` | integer | yes | The number of required approvals for this rule |
| `user_ids` | Array | no | The ids of users as approvers |
| `group_ids` | Array | no | The ids of groups as approvers |
-| `protected_branch_ids` | Array | no | **(PREMIUM)** The ids of protected branches to scope the rule by |
+| `protected_branch_ids` | Array | no | **(PREMIUM)** The ids of protected branches to scope the rule by. To identify the ID, [use the API](protected_branches.md#list-protected-branches). |
```json
{
@@ -509,8 +524,7 @@ Configuration for approvals on a specific Merge Request. Must be authenticated f
### Get Configuration
-> - Introduced in GitLab 8.9.
-> - Moved to GitLab Premium in 13.9.
+> Moved to GitLab Premium in 13.9.
You can request information about a merge request's approval status using the
following endpoint:
@@ -556,8 +570,7 @@ GET /projects/:id/merge_requests/:merge_request_iid/approvals
### Change approval configuration
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/183) in GitLab 10.6.
-> - Moved to GitLab Premium in 13.9.
+> Moved to GitLab Premium in 13.9.
If you are allowed to, you can change `approvals_required` using the following
endpoint:
@@ -937,8 +950,7 @@ These are system generated rules.
## Approve Merge Request
-> - Introduced in GitLab 8.9.
-> - Moved to GitLab Premium in 13.9.
+> Moved to GitLab Premium in 13.9.
If you are allowed to, you can approve a merge request using the following
endpoint:
@@ -1001,8 +1013,7 @@ does not match, the response code is `409`.
## Unapprove Merge Request
-> - Introduced in GitLab 9.0.
-> - Moved to GitLab Premium in 13.9.
+> Moved to GitLab Premium in 13.9.
If you did approve a merge request, you can unapprove it using the following
endpoint:
diff --git a/doc/api/oauth2.md b/doc/api/oauth2.md
index abf9d7af229..8a8a54a753a 100644
--- a/doc/api/oauth2.md
+++ b/doc/api/oauth2.md
@@ -5,15 +5,15 @@ group: Access
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#designated-technical-writers
---
-# GitLab as an OAuth 2.0 provider **(FREE)**
+# OAuth 2.0 identity provider API **(FREE)**
-This document covers using the [OAuth2](https://oauth.net/2/) protocol to allow
-other services to access GitLab resources on user's behalf.
+GitLab provides an API to allow third-party services to access GitLab resources on a user's behalf
+with the [OAuth2](https://oauth.net/2/) protocol.
-If you want GitLab to be an OAuth authentication service provider to sign into
-other services, see the [OAuth2 authentication service provider](../integration/oauth_provider.md)
-documentation. This functionality is based on the
-[doorkeeper Ruby gem](https://github.com/doorkeeper-gem/doorkeeper).
+To configure GitLab for this, see
+[Configure GitLab as an OAuth 2.0 authentication identity provider](../integration/oauth_provider.md).
+
+This functionality is based on the [doorkeeper Ruby gem](https://github.com/doorkeeper-gem/doorkeeper).
## Supported OAuth 2.0 flows
@@ -25,7 +25,7 @@ GitLab supports the following authorization flows:
- **Authorization code:** Secure and common flow. Recommended option for secure
server-side apps.
- **Implicit grant:** Originally designed for user-agent only apps, such as
- single page web apps running on GitLab Pages).
+ single page web apps running on GitLab Pages.
The [Internet Engineering Task Force (IETF)](https://tools.ietf.org/html/draft-ietf-oauth-security-topics-09#section-2.1.2)
recommends against Implicit grant flow.
- **Resource owner password credentials:** To be used **only** for securely
@@ -412,6 +412,16 @@ prevent breaking changes introduced in [doorkeeper 5.0.2](https://github.com/doo
Don't rely on these fields as they are slated for removal in a later release.
+## Revoke a token
+
+To revoke a token, use the `revoke` endpoint. The API returns a 200 response code and an empty
+JSON hash to indicate success.
+
+```ruby
+parameters = 'client_id=APP_ID&client_secret=APP_SECRET&token=TOKEN'
+RestClient.post 'https://gitlab.example.com/oauth/revoke', parameters
+```
+
## OAuth 2.0 tokens and GitLab registries
Standard OAuth 2.0 tokens support different degrees of access to GitLab
diff --git a/doc/api/packages/debian.md b/doc/api/packages/debian.md
index 154c99d7e0a..66377850c49 100644
--- a/doc/api/packages/debian.md
+++ b/doc/api/packages/debian.md
@@ -78,7 +78,7 @@ GET projects/:id/packages/debian/pool/:distribution/:letter/:package_name/:packa
| `letter` | string | yes | The Debian Classification (first-letter or lib-first-letter). |
| `package_name` | string | yes | The source package name. |
| `package_version` | string | yes | The source package version. |
-| `file_name` | string | yes | The file name. |
+| `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"
@@ -92,7 +92,7 @@ curl --header "Private-Token: <personal_access_token>" \
--remote-name
```
-This writes the downloaded file using the remote file name in the current directory.
+This writes the downloaded file using the remote filename in the current directory.
## Route prefix
@@ -150,7 +150,7 @@ curl --header "Private-Token: <personal_access_token>" \
--remote-name
```
-This writes the downloaded file using the remote file name in the current directory.
+This writes the downloaded file using the remote filename in the current directory.
## Download a signed distribution Release file
@@ -178,7 +178,7 @@ curl --header "Private-Token: <personal_access_token>" \
--remote-name
```
-This writes the downloaded file using the remote file name in the current directory.
+This writes the downloaded file using the remote filename in the current directory.
## Download a release file signature
@@ -206,7 +206,7 @@ curl --header "Private-Token: <personal_access_token>" \
--remote-name
```
-This writes the downloaded file using the remote file name in the current directory.
+This writes the downloaded file using the remote filename in the current directory.
## Download a binary file's index
@@ -236,4 +236,4 @@ curl --header "Private-Token: <personal_access_token>" \
--remote-name
```
-This writes the downloaded file using the remote file name in the current directory.
+This writes the downloaded file using the remote filename in the current directory.
diff --git a/doc/api/packages/helm.md b/doc/api/packages/helm.md
index 8c3b9869368..82b3f5225b0 100644
--- a/doc/api/packages/helm.md
+++ b/doc/api/packages/helm.md
@@ -63,7 +63,7 @@ GET projects/:id/packages/helm/:channel/charts/:file_name.tgz
| ----------- | ------ | -------- | ----------- |
| `id` | string | yes | The ID or full path of the project. |
| `channel` | string | yes | Helm repository channel. |
-| `file_name` | string | yes | Chart file name. |
+| `file_name` | string | yes | Chart filename. |
```shell
curl --user <username>:<personal_access_token> \
diff --git a/doc/api/pages.md b/doc/api/pages.md
index f81a3c3c72b..a115f0b0a0f 100644
--- a/doc/api/pages.md
+++ b/doc/api/pages.md
@@ -12,7 +12,7 @@ The GitLab Pages feature must be enabled to use these endpoints. Find out more a
## Unpublish pages
-Remove pages. The user must have admin privileges.
+Remove pages. The user must have the Administrator role.
```plaintext
DELETE /projects/:id/pages
diff --git a/doc/api/pages_domains.md b/doc/api/pages_domains.md
index 47a8df3875e..624bdf29e5d 100644
--- a/doc/api/pages_domains.md
+++ b/doc/api/pages_domains.md
@@ -12,7 +12,7 @@ The GitLab Pages feature must be enabled to use these endpoints. Find out more a
## List all Pages domains
-Get a list of all Pages domains. The user must have admin permissions.
+Get a list of all Pages domains. The user must have the administrator role.
```plaintext
GET /pages/domains
diff --git a/doc/api/personal_access_tokens.md b/doc/api/personal_access_tokens.md
index b96ee81f673..9c9551a5103 100644
--- a/doc/api/personal_access_tokens.md
+++ b/doc/api/personal_access_tokens.md
@@ -95,6 +95,6 @@ curl --request DELETE --header "PRIVATE-TOKEN: <your_access_token>" "https://git
- `204: No Content` if successfully revoked.
- `400 Bad Request` if not revoked successfully.
-## Create a personal access token (admin only)
+## Create a personal access token (administrator only)
See the [Users API documentation](users.md#create-a-personal-access-token) for information on creating a personal access token.
diff --git a/doc/api/pipeline_schedules.md b/doc/api/pipeline_schedules.md
index 74f96e5374e..625a92f9b89 100644
--- a/doc/api/pipeline_schedules.md
+++ b/doc/api/pipeline_schedules.md
@@ -115,7 +115,7 @@ POST /projects/:id/pipeline_schedules
| `description` | string | yes | The description of the pipeline schedule. |
| `ref` | string | yes | The branch or tag name that is triggered. |
| `cron` | string | yes | The [cron](https://en.wikipedia.org/wiki/Cron) schedule, for example: `0 1 * * *`. |
-| `cron_timezone` | string | no | The timezone supported by `ActiveSupport::TimeZone`, for example: `Pacific Time (US & Canada)` (default: `UTC`). |
+| `cron_timezone` | string | no | The time zone supported by `ActiveSupport::TimeZone`, for example: `Pacific Time (US & Canada)` (default: `UTC`). |
| `active` | boolean | no | The activation of pipeline schedule. If false is set, the pipeline schedule is initially deactivated (default: `true`). |
```shell
@@ -162,7 +162,7 @@ PUT /projects/:id/pipeline_schedules/:pipeline_schedule_id
| `description` | string | no | The description of the pipeline schedule. |
| `ref` | string | no | The branch or tag name that is triggered. |
| `cron` | string | no | The [cron](https://en.wikipedia.org/wiki/Cron) schedule, for example: `0 1 * * *`. |
-| `cron_timezone` | string | no | The timezone supported by `ActiveSupport::TimeZone` (for example `Pacific Time (US & Canada)`), or `TZInfo::Timezone` (for example `America/Los_Angeles`). |
+| `cron_timezone` | string | no | The time zone supported by `ActiveSupport::TimeZone` (for example `Pacific Time (US & Canada)`), or `TZInfo::Timezone` (for example `America/Los_Angeles`). |
| `active` | boolean | no | The activation of pipeline schedule. If false is set, the pipeline schedule is initially deactivated. |
```shell
diff --git a/doc/api/plan_limits.md b/doc/api/plan_limits.md
index 52152dd6e14..8bd87f5a896 100644
--- a/doc/api/plan_limits.md
+++ b/doc/api/plan_limits.md
@@ -14,7 +14,7 @@ The existing plans depend on the GitLab edition. In the Community Edition, only
is available. In the Enterprise Edition, additional plans are available as well.
NOTE:
-Administrator access is required to use this API.
+The Administrator role is required to use this API.
## Get current plan limits
diff --git a/doc/api/project_level_variables.md b/doc/api/project_level_variables.md
index 2dcef40aacb..a2c2da9065f 100644
--- a/doc/api/project_level_variables.md
+++ b/doc/api/project_level_variables.md
@@ -15,8 +15,8 @@ Get list of a project's variables.
GET /projects/:id/variables
```
-| Attribute | Type | required | Description |
-|-----------|---------|----------|---------------------|
+| Attribute | Type | required | Description |
+| --------- | -------------- | -------- | --------------------------------------------------------------------------------------------------------------------------------------------- |
| `id` | integer/string | yes | The ID of a project or [URL-encoded NAMESPACE/PROJECT_NAME of the project](index.md#namespaced-path-encoding) owned by the authenticated user |
```shell
@@ -26,14 +26,20 @@ curl --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/a
```json
[
{
- "key": "TEST_VARIABLE_1",
"variable_type": "env_var",
- "value": "TEST_1"
+ "key": "TEST_VARIABLE_1",
+ "value": "TEST_1",
+ "protected": false,
+ "masked": true,
+ "environment_scope": "*"
},
{
- "key": "TEST_VARIABLE_2",
"variable_type": "env_var",
- "value": "TEST_2"
+ "key": "TEST_VARIABLE_2",
+ "value": "TEST_2",
+ "protected": false,
+ "masked": false,
+ "environment_scope": "*"
}
]
```
@@ -46,11 +52,11 @@ Get the details of a project's specific variable.
GET /projects/:id/variables/:key
```
-| Attribute | Type | required | Description |
-|-----------|---------|----------|-----------------------|
-| `id` | integer/string | yes | The ID of a project or [URL-encoded NAMESPACE/PROJECT_NAME of the project](index.md#namespaced-path-encoding) owned by the authenticated user |
-| `key` | string | yes | The `key` of a variable |
-| `filter` | hash | no | Available filters: `[environment_scope]`. See the [`filter` parameter details](#the-filter-parameter). |
+| Attribute | Type | required | Description |
+| --------- | -------------- | -------- | --------------------------------------------------------------------------------------------------------------------------------------------- |
+| `id` | integer/string | yes | The ID of a project or [URL-encoded NAMESPACE/PROJECT_NAME of the project](index.md#namespaced-path-encoding) owned by the authenticated user |
+| `key` | string | yes | The `key` of a variable |
+| `filter` | hash | no | Available filters: `[environment_scope]`. See the [`filter` parameter details](#the-filter-parameter). |
```shell
curl --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/1/variables/TEST_VARIABLE_1"
@@ -62,7 +68,8 @@ curl --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/a
"variable_type": "env_var",
"value": "TEST_1",
"protected": false,
- "masked": true
+ "masked": true,
+ "environment_scope": "*"
}
```
@@ -74,15 +81,15 @@ Create a new variable.
POST /projects/:id/variables
```
-| Attribute | Type | required | Description |
-|---------------------|---------|----------|-----------------------|
-| `id` | integer/string | yes | The ID of a project or [URL-encoded NAMESPACE/PROJECT_NAME of the project](index.md#namespaced-path-encoding) owned by the authenticated user |
-| `key` | string | yes | The `key` of a variable; must have no more than 255 characters; only `A-Z`, `a-z`, `0-9`, and `_` are allowed |
-| `value` | string | yes | The `value` of a variable |
-| `variable_type` | string | no | The type of a variable. Available types are: `env_var` (default) and `file` |
-| `protected` | boolean | no | Whether the variable is protected. Default: `false` |
-| `masked` | boolean | no | Whether the variable is masked. Default: `false` |
-| `environment_scope` | string | no | The `environment_scope` of the variable. Default: `*` |
+| Attribute | Type | required | Description |
+| ------------------- | -------------- | -------- | --------------------------------------------------------------------------------------------------------------------------------------------- |
+| `id` | integer/string | yes | The ID of a project or [URL-encoded NAMESPACE/PROJECT_NAME of the project](index.md#namespaced-path-encoding) owned by the authenticated user |
+| `key` | string | yes | The `key` of a variable; must have no more than 255 characters; only `A-Z`, `a-z`, `0-9`, and `_` are allowed |
+| `value` | string | yes | The `value` of a variable |
+| `variable_type` | string | no | The type of a variable. Available types are: `env_var` (default) and `file` |
+| `protected` | boolean | no | Whether the variable is protected. Default: `false` |
+| `masked` | boolean | no | Whether the variable is masked. Default: `false` |
+| `environment_scope` | string | no | The `environment_scope` of the variable. Default: `*` |
```shell
curl --request POST --header "PRIVATE-TOKEN: <your_access_token>" \
@@ -91,10 +98,10 @@ curl --request POST --header "PRIVATE-TOKEN: <your_access_token>" \
```json
{
+ "variable_type": "env_var",
"key": "NEW_VARIABLE",
"value": "new value",
"protected": false,
- "variable_type": "env_var",
"masked": false,
"environment_scope": "*"
}
@@ -108,16 +115,16 @@ Update a project's variable.
PUT /projects/:id/variables/:key
```
-| Attribute | Type | required | Description |
-|---------------------|---------|----------|-------------------------|
-| `id` | integer/string | yes | The ID of a project or [URL-encoded NAMESPACE/PROJECT_NAME of the project](index.md#namespaced-path-encoding) owned by the authenticated user |
-| `key` | string | yes | The `key` of a variable |
-| `value` | string | yes | The `value` of a variable |
-| `variable_type` | string | no | The type of a variable. Available types are: `env_var` (default) and `file` |
-| `protected` | boolean | no | Whether the variable is protected |
-| `masked` | boolean | no | Whether the variable is masked |
-| `environment_scope` | string | no | The `environment_scope` of the variable |
-| `filter` | hash | no | Available filters: `[environment_scope]`. See the [`filter` parameter details](#the-filter-parameter). |
+| Attribute | Type | required | Description |
+| ------------------- | -------------- | -------- | --------------------------------------------------------------------------------------------------------------------------------------------- |
+| `id` | integer/string | yes | The ID of a project or [URL-encoded NAMESPACE/PROJECT_NAME of the project](index.md#namespaced-path-encoding) owned by the authenticated user |
+| `key` | string | yes | The `key` of a variable |
+| `value` | string | yes | The `value` of a variable |
+| `variable_type` | string | no | The type of a variable. Available types are: `env_var` (default) and `file` |
+| `protected` | boolean | no | Whether the variable is protected |
+| `masked` | boolean | no | Whether the variable is masked |
+| `environment_scope` | string | no | The `environment_scope` of the variable |
+| `filter` | hash | no | Available filters: `[environment_scope]`. See the [`filter` parameter details](#the-filter-parameter). |
```shell
curl --request PUT --header "PRIVATE-TOKEN: <your_access_token>" \
@@ -126,9 +133,9 @@ curl --request PUT --header "PRIVATE-TOKEN: <your_access_token>" \
```json
{
+ "variable_type": "env_var",
"key": "NEW_VARIABLE",
"value": "updated value",
- "variable_type": "env_var",
"protected": true,
"masked": false,
"environment_scope": "*"
@@ -143,11 +150,11 @@ Remove a project's variable.
DELETE /projects/:id/variables/:key
```
-| Attribute | Type | required | Description |
-|-----------|---------|----------|-------------------------|
-| `id` | integer/string | yes | The ID of a project or [URL-encoded NAMESPACE/PROJECT_NAME of the project](index.md#namespaced-path-encoding) owned by the authenticated user |
-| `key` | string | yes | The `key` of a variable |
-| `filter` | hash | no | Available filters: `[environment_scope]`. See the [`filter` parameter details](#the-filter-parameter). |
+| Attribute | Type | required | Description |
+| --------- | -------------- | -------- | --------------------------------------------------------------------------------------------------------------------------------------------- |
+| `id` | integer/string | yes | The ID of a project or [URL-encoded NAMESPACE/PROJECT_NAME of the project](index.md#namespaced-path-encoding) owned by the authenticated user |
+| `key` | string | yes | The `key` of a variable |
+| `filter` | hash | no | Available filters: `[environment_scope]`. See the [`filter` parameter details](#the-filter-parameter). |
```shell
curl --request DELETE --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/1/variables/VARIABLE_1"
diff --git a/doc/api/project_relations_export.md b/doc/api/project_relations_export.md
new file mode 100644
index 00000000000..2016dcbd141
--- /dev/null
+++ b/doc/api/project_relations_export.md
@@ -0,0 +1,111 @@
+---
+stage: Manage
+group: Import
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
+---
+
+# Project Relations Export API **(FREE)**
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/70330) in GitLab 14.4 behind the `bulk_import` [feature flag](../administration/feature_flags.md), disabled by default.
+
+FLAG:
+On GitLab.com, this feature is available.
+On self-managed GitLab, by default this feature is available. To hide the feature, ask an administrator to
+[disable the `bulk_import` flag](../administration/feature_flags.md).
+The feature is not ready for production use. It is still in experimental stage and might change in the future.
+
+With the Project Relations Export API, you can partially export project structure. This API is
+similar to [project export](project_import_export.md),
+but it exports each top-level relation (for example, milestones/boards/labels) as a separate file
+instead of one archive. The project relations export API is primarily used in
+[group migration](../user/group/import/index.md#enable-or-disable-gitlab-group-migration)
+to support group project import.
+
+## Schedule new export
+
+Start a new project relations export:
+
+```plaintext
+POST /projects/:id/export_relations
+```
+
+| Attribute | Type | Required | Description |
+| --------- | -------------- | -------- | ---------------------------------------- |
+| `id` | integer/string | yes | ID of the project owned by the authenticated user. |
+
+```shell
+curl --request POST --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/1/export_relations"
+```
+
+```json
+{
+ "message": "202 Accepted"
+}
+```
+
+## Export status
+
+View the status of the relations export:
+
+```plaintext
+GET /projects/:id/export_relations/status
+```
+
+| Attribute | Type | Required | Description |
+| --------- | -------------- | -------- | ---------------------------------------- |
+| `id` | integer/string | yes | ID of the project owned by the authenticated user. |
+
+```shell
+curl --request GET --header "PRIVATE-TOKEN: <your_access_token>" \
+ "https://gitlab.example.com/api/v4/projects/1/export_relations/status"
+```
+
+The status can be one of the following:
+
+- `0`: `started`
+- `1`: `finished`
+- `-1`: `failed`
+
+- `0` - `started`
+- `1` - `finished`
+- `-1` - `failed`
+
+```json
+[
+ {
+ "relation": "project_badges",
+ "status": 1,
+ "error": null,
+ "updated_at": "2021-05-04T11:25:20.423Z"
+ },
+ {
+ "relation": "boards",
+ "status": 1,
+ "error": null,
+ "updated_at": "2021-05-04T11:25:20.085Z"
+ }
+]
+```
+
+## Export download
+
+Download the finished relations export:
+
+```plaintext
+GET /projects/:id/export_relations/download
+```
+
+| Attribute | Type | Required | Description |
+| --------------- | -------------- | -------- | ---------------------------------------- |
+| `id` | integer/string | yes | ID of the project owned by the authenticated user. |
+| `relation` | string | yes | Name of the project top-level relation to download. |
+
+```shell
+curl --header "PRIVATE-TOKEN: <your_access_token>" --remote-header-name \
+ --remote-name "https://gitlab.example.com/api/v4/projects/1/export_relations/download?relation=labels"
+```
+
+```shell
+ls labels.ndjson.gz
+labels.ndjson.gz
+```
diff --git a/doc/api/project_repository_storage_moves.md b/doc/api/project_repository_storage_moves.md
index ebb15e1c1d6..b779a0046c6 100644
--- a/doc/api/project_repository_storage_moves.md
+++ b/doc/api/project_repository_storage_moves.md
@@ -10,7 +10,7 @@ type: reference
> [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),
+[migrating to Gitaly Cluster](../administration/gitaly/index.md#migrating-to-gitaly-cluster),
for example.
As project repository storage moves are processed, they transition through different states. Values
diff --git a/doc/api/project_statistics.md b/doc/api/project_statistics.md
index a16bcc513f9..c69e41a423e 100644
--- a/doc/api/project_statistics.md
+++ b/doc/api/project_statistics.md
@@ -8,12 +8,12 @@ type: reference, api
# Project statistics API **(FREE)**
Every API call to [project](../user/project/index.md) statistics must be authenticated.
+Retrieving these statistics requires write access to the repository.
-## Get the statistics of the last 30 days
+This API retrieves the number of times the project is either cloned or pulled
+with the HTTP method. SSH fetches are not included.
-Retrieving the statistics requires write access to the repository.
-Currently only HTTP fetches statistics are returned.
-Fetches statistics includes both clones and pulls count and are HTTP only, SSH fetches are not included.
+## Get the statistics of the last 30 days
```plaintext
GET /projects/:id/statistics
diff --git a/doc/api/projects.md b/doc/api/projects.md
index 29e3cdf6cbf..024362f3246 100644
--- a/doc/api/projects.md
+++ b/doc/api/projects.md
@@ -53,10 +53,10 @@ GET /projects
| `last_activity_before` | datetime | **{dotted-circle}** No | Limit results to projects with last_activity before specified time. Format: ISO 8601 (`YYYY-MM-DDTHH:MM:SSZ`) |
| `membership` | boolean | **{dotted-circle}** No | Limit by projects that the current user is a member of. |
| `min_access_level` | integer | **{dotted-circle}** No | Limit by current user minimal [access level](members.md#valid-access-levels). |
-| `order_by` | string | **{dotted-circle}** No | Return projects ordered by `id`, `name`, `path`, `created_at`, `updated_at`, `last_activity_at`, or `similarity` fields. `repository_size`, `storage_size`, `packages_size` or `wiki_size` fields are only allowed for admins. `similarity` ([introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/332890) in GitLab 14.1) is only available when searching and is limited to projects that the current user is a member of. Default is `created_at`. |
+| `order_by` | string | **{dotted-circle}** No | Return projects ordered by `id`, `name`, `path`, `created_at`, `updated_at`, `last_activity_at`, or `similarity` fields. `repository_size`, `storage_size`, `packages_size` or `wiki_size` fields are only allowed for administrators. `similarity` ([introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/332890) in GitLab 14.1) is only available when searching and is limited to projects that the current user is a member of. Default is `created_at`. |
| `owned` | boolean | **{dotted-circle}** No | Limit by projects explicitly owned by the current user. |
| `repository_checksum_failed` **(PREMIUM)** | boolean | **{dotted-circle}** No | Limit projects where the repository checksum calculation has failed ([Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/6137) in GitLab 11.2). |
-| `repository_storage` | string | **{dotted-circle}** No | Limit results to projects stored on `repository_storage`. _(admins only)_ |
+| `repository_storage` | string | **{dotted-circle}** No | Limit results to projects stored on `repository_storage`. _(administrators only)_ |
| `search_namespaces` | boolean | **{dotted-circle}** No | Include ancestor namespaces when matching search criteria. Default is `false`. |
| `search` | string | **{dotted-circle}** No | Return list of projects matching the search criteria. |
| `simple` | boolean | **{dotted-circle}** No | Return only limited fields for each project. This is a no-op without authentication as then _only_ simple fields are returned. |
@@ -66,7 +66,7 @@ GET /projects
| `topic` | string | **{dotted-circle}** No | Comma-separated topic names. Limit results to projects that match all of given topics. See `topics` attribute. |
| `visibility` | string | **{dotted-circle}** No | Limit by visibility `public`, `internal`, or `private`. |
| `wiki_checksum_failed` **(PREMIUM)** | boolean | **{dotted-circle}** No | Limit projects where the wiki checksum calculation has failed ([Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/6137) in GitLab 11.2). |
-| `with_custom_attributes` | boolean | **{dotted-circle}** No | Include [custom attributes](custom_attributes.md) in response. _(admins only)_ |
+| `with_custom_attributes` | boolean | **{dotted-circle}** No | Include [custom attributes](custom_attributes.md) in response. _(administrator only)_ |
| `with_issues_enabled` | boolean | **{dotted-circle}** No | Limit by enabled issues feature. |
| `with_merge_requests_enabled` | boolean | **{dotted-circle}** No | Limit by enabled merge requests feature. |
| `with_programming_language` | string | **{dotted-circle}** No | Limit by projects which use the given programming language. |
@@ -386,7 +386,7 @@ GET /users/:user_id/projects
| `statistics` | boolean | **{dotted-circle}** No | Include project statistics. Only available to Reporter or higher level role members. |
| `user_id` | string | **{check-circle}** Yes | The ID or username of the user. |
| `visibility` | string | **{dotted-circle}** No | Limit by visibility `public`, `internal`, or `private`. |
-| `with_custom_attributes` | boolean | **{dotted-circle}** No | Include [custom attributes](custom_attributes.md) in response. _(admins only)_ |
+| `with_custom_attributes` | boolean | **{dotted-circle}** No | Include [custom attributes](custom_attributes.md) in response. _(administrator only)_ |
| `with_issues_enabled` | boolean | **{dotted-circle}** No | Limit by enabled issues feature. |
| `with_merge_requests_enabled` | boolean | **{dotted-circle}** No | Limit by enabled merge requests feature. |
| `with_programming_language` | string | **{dotted-circle}** No | Limit by projects which use the given programming language. |
@@ -621,7 +621,7 @@ GET /users/:user_id/starred_projects
| `statistics` | boolean | **{dotted-circle}** No | Include project statistics. Only available to Reporter or higher level role members. |
| `user_id` | string | **{check-circle}** Yes | The ID or username of the user. |
| `visibility` | string | **{dotted-circle}** No | Limit by visibility `public`, `internal`, or `private`. |
-| `with_custom_attributes` | boolean | **{dotted-circle}** No | Include [custom attributes](custom_attributes.md) in response. _(admins only)_ |
+| `with_custom_attributes` | boolean | **{dotted-circle}** No | Include [custom attributes](custom_attributes.md) in response. _(administrator only)_ |
| `with_issues_enabled` | boolean | **{dotted-circle}** No | Limit by enabled issues feature. |
| `with_merge_requests_enabled` | boolean | **{dotted-circle}** No | Limit by enabled merge requests feature. |
@@ -840,7 +840,7 @@ GET /projects/:id
| `id` | integer or string | **{check-circle}** Yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding). |
| `license` | boolean | **{dotted-circle}** No | Include project license data. |
| `statistics` | boolean | **{dotted-circle}** No | Include project statistics. Only available to Reporter or higher level role members. |
-| `with_custom_attributes` | boolean | **{dotted-circle}** No | Include [custom attributes](custom_attributes.md) in response. _(admins only)_ |
+| `with_custom_attributes` | boolean | **{dotted-circle}** No | Include [custom attributes](custom_attributes.md) in response. _(administrators only)_ |
```json
{
@@ -1218,7 +1218,7 @@ POST /projects
| `public_builds` | boolean | **{dotted-circle}** No | If `true`, jobs can be viewed by non-project members. |
| `remove_source_branch_after_merge` | boolean | **{dotted-circle}** No | Enable `Delete source branch` option by default for all new merge requests. |
| `repository_access_level` | string | **{dotted-circle}** No | One of `disabled`, `private`, or `enabled`. |
-| `repository_storage` | string | **{dotted-circle}** No | Which storage shard the repository is on. _(admins only)_ |
+| `repository_storage` | string | **{dotted-circle}** No | Which storage shard the repository is on. _(administrator only)_ |
| `request_access_enabled` | boolean | **{dotted-circle}** No | Allow users to request member access. |
| `resolve_outdated_diff_discussions` | boolean | **{dotted-circle}** No | Automatically resolve merge request diffs discussions on lines changed with a push. |
| `shared_runners_enabled` | boolean | **{dotted-circle}** No | Enable shared runners for this project. |
@@ -1237,7 +1237,7 @@ POST /projects
## Create project for user
-Creates a new project owned by the specified user. Available only for admins.
+Creates a new project owned by the specified user. Available only for administrators.
If your HTTP repository isn't publicly accessible, add authentication information
to the URL `https://username:password@gitlab.company.com/group/project.git`,
@@ -1295,7 +1295,7 @@ POST /projects/user/:user_id
| `public_builds` | boolean | **{dotted-circle}** No | If `true`, jobs can be viewed by non-project-members. |
| `remove_source_branch_after_merge` | boolean | **{dotted-circle}** No | Enable `Delete source branch` option by default for all new merge requests. |
| `repository_access_level` | string | **{dotted-circle}** No | One of `disabled`, `private`, or `enabled`. |
-| `repository_storage` | string | **{dotted-circle}** No | Which storage shard the repository is on. _(admins only)_ |
+| `repository_storage` | string | **{dotted-circle}** No | Which storage shard the repository is on. _(administrators only)_ |
| `request_access_enabled` | boolean | **{dotted-circle}** No | Allow users to request member access. |
| `resolve_outdated_diff_discussions` | boolean | **{dotted-circle}** No | Automatically resolve merge request diffs discussions on lines changed with a push. |
| `shared_runners_enabled` | boolean | **{dotted-circle}** No | Enable shared runners for this project. |
@@ -1360,7 +1360,7 @@ PUT /projects/:id
| `merge_requests_enabled` | boolean | **{dotted-circle}** No | _(Deprecated)_ Enable merge requests for this project. Use `merge_requests_access_level` instead. |
| `mirror_overwrites_diverged_branches` **(PREMIUM)** | boolean | **{dotted-circle}** No | Pull mirror overwrites diverged branches. |
| `mirror_trigger_builds` **(PREMIUM)** | boolean | **{dotted-circle}** No | Pull mirroring triggers builds. |
-| `mirror_user_id` **(PREMIUM)** | integer | **{dotted-circle}** No | User responsible for all the activity surrounding a pull mirror event. _(admins only)_ |
+| `mirror_user_id` **(PREMIUM)** | integer | **{dotted-circle}** No | User responsible for all the activity surrounding a pull mirror event. _(administrators only)_ |
| `mirror` **(PREMIUM)** | boolean | **{dotted-circle}** No | Enables pull mirroring in a project. |
| `name` | string | **{dotted-circle}** No | The name of the project. |
| `operations_access_level` | string | **{dotted-circle}** No | One of `disabled`, `private`, or `enabled`. |
@@ -1375,7 +1375,7 @@ PUT /projects/:id
| `public_builds` | boolean | **{dotted-circle}** No | If `true`, jobs can be viewed by non-project members. |
| `remove_source_branch_after_merge` | boolean | **{dotted-circle}** No | Enable `Delete source branch` option by default for all new merge requests. |
| `repository_access_level` | string | **{dotted-circle}** No | One of `disabled`, `private`, or `enabled`. |
-| `repository_storage` | string | **{dotted-circle}** No | Which storage shard the repository is on. _(admins only)_ |
+| `repository_storage` | string | **{dotted-circle}** No | Which storage shard the repository is on. _(administrators only)_ |
| `request_access_enabled` | boolean | **{dotted-circle}** No | Allow users to request member access. |
| `resolve_outdated_diff_discussions` | boolean | **{dotted-circle}** No | Automatically resolve merge request diffs discussions on lines changed with a push. |
| `service_desk_enabled` | boolean | **{dotted-circle}** No | Enable or disable Service Desk feature. |
@@ -1442,7 +1442,7 @@ GET /projects/:id/forks
| `starred` | boolean | **{dotted-circle}** No | Limit by projects starred by the current user. |
| `statistics` | boolean | **{dotted-circle}** No | Include project statistics. Only available to Reporter or higher level role members. |
| `visibility` | string | **{dotted-circle}** No | Limit by visibility `public`, `internal`, or `private`. |
-| `with_custom_attributes` | boolean | **{dotted-circle}** No | Include [custom attributes](custom_attributes.md) in response. _(admins only)_ |
+| `with_custom_attributes` | boolean | **{dotted-circle}** No | Include [custom attributes](custom_attributes.md) in response. _(administrators only)_ |
| `with_issues_enabled` | boolean | **{dotted-circle}** No | Limit by enabled issues feature. |
| `with_merge_requests_enabled` | boolean | **{dotted-circle}** No | Limit by enabled merge requests feature. |
@@ -2047,7 +2047,7 @@ This endpoint:
merge requests).
- From [GitLab 13.2](https://gitlab.com/gitlab-org/gitlab/-/issues/220382) on
[Premium or higher](https://about.gitlab.com/pricing/) tiers, group
- admins can [configure](../user/group/index.md#enable-delayed-project-removal)
+ administrators can [configure](../user/group/index.md#enable-delayed-project-removal)
projects within a group to be deleted after a delayed period. When enabled,
actual deletion happens after the number of days specified in the
[default deletion delay](../user/admin_area/settings/visibility_and_access_controls.md#default-deletion-delay).
@@ -2373,7 +2373,7 @@ is returned.
## Fork relationship
Allows modification of the forked relationship between existing projects.
-Available only for project owners and admins.
+Available only for project owners and administrators.
### Create a forked from/to relation between existing projects
@@ -2678,13 +2678,21 @@ Read more in the [Project members](members.md) documentation.
> - Introduced in GitLab 11.
> - Moved to GitLab Premium in 13.9.
-Configure pull mirroring while [creating a new project](#create-project) or [updating an existing project](#edit-project) using the API if the remote repository is publicly accessible or via `username/password` authentication. In case your HTTP repository is not publicly accessible, you can add the authentication information to the URL: `https://username:password@gitlab.company.com/group/project.git`, where password is a [personal access token](../user/profile/personal_access_tokens.md) with the API scope enabled.
-
-The relevant API parameters to update are:
-
-- `import_url`: URL of remote repository being mirrored (with `username:password` if needed).
-- `mirror`: Enables pull mirroring on project when set to `true`.
-- `only_mirror_protected_branches`: Set to `true` for protected branches.
+Configure pull mirroring while [creating a new project](#create-project)
+or [updating an existing project](#edit-project) using the API
+if the remote repository is publicly accessible
+or via `username:token` authentication.
+In case your HTTP repository is not publicly accessible,
+you can add the authentication information to the URL:
+`https://username:token@gitlab.company.com/group/project.git`,
+where `token` is a [personal access token](../user/profile/personal_access_tokens.md)
+with the API scope enabled.
+
+| Attribute | Type | Required | Description |
+|--------------|---------|------------------------|-------------|
+| `import_url` | string | **{check-circle}** Yes | URL of remote repository being mirrored (with `user:token` if needed). |
+| `mirror` | boolean | **{check-circle}** Yes | Enables pull mirroring on project when set to `true`. |
+| `only_mirror_protected_branches`| boolean | **{dotted-circle}** No | Limits mirroring to only protected branches when set to `true`. |
## Start the pull mirroring process for a Project **(PREMIUM)**
diff --git a/doc/api/releases/index.md b/doc/api/releases/index.md
index 72627783947..ded47b24c12 100644
--- a/doc/api/releases/index.md
+++ b/doc/api/releases/index.md
@@ -729,3 +729,5 @@ Example response:
A release with a `released_at` attribute set to a future date is labeled
as an **Upcoming Release** [in the UI](../../user/project/releases/index.md#upcoming-releases).
+
+Additionally, if a [release is requested from the API](#list-releases), for each release with a `release_at` attribute set to a future date, an additional attribute `upcoming_release` (set to true) will be returned as part of the response.
diff --git a/doc/api/remote_mirrors.md b/doc/api/remote_mirrors.md
index 799763a7da3..8b584285033 100644
--- a/doc/api/remote_mirrors.md
+++ b/doc/api/remote_mirrors.md
@@ -7,7 +7,7 @@ type: reference, api
# Project remote mirrors API **(FREE)**
-[Push mirrors](../user/project/repository/repository_mirroring.md#push-to-a-remote-repository)
+[Push mirrors](../user/project/repository/mirror/push.md)
defined on a project's repository settings are called "remote mirrors", and the
state of these mirrors can be queried and modified via the remote mirror API
outlined below.
@@ -51,11 +51,15 @@ NOTE:
For security reasons, the `url` attribute is always scrubbed of username
and password information.
-## Create a remote mirror
+## Create a pull mirror
+
+Learn how to [configure a pull mirror](projects.md#configure-pull-mirroring-for-a-project) using the Projects API.
+
+## Create a push mirror
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/24189) in GitLab 12.9.
-Create a remote mirror for a project. The mirror is disabled by default. You can enable it by including the optional parameter `enabled` when creating it:
+Push mirroring is disabled by default. You can enable it by including the optional parameter `enabled` when creating it:
```plaintext
POST /projects/:id/remote_mirrors
@@ -63,7 +67,7 @@ POST /projects/:id/remote_mirrors
| Attribute | Type | Required | Description |
| :---------- | :----- | :--------- | :------------ |
-| `url` | String | yes | The URL of the remote repository to be mirrored. |
+| `url` | String | yes | The target URL to which the repository is mirrored. |
| `enabled` | Boolean | no | Determines if the mirror is enabled. |
| `only_protected_branches` | Boolean | no | Determines if only protected branches are mirrored. |
| `keep_divergent_refs` | Boolean | no | Determines if divergent refs are skipped. |
diff --git a/doc/api/repositories.md b/doc/api/repositories.md
index 1c9136d22ac..e93ffbc5e72 100644
--- a/doc/api/repositories.md
+++ b/doc/api/repositories.md
@@ -14,6 +14,12 @@ be accessed without authentication if the repository is publicly accessible.
This command provides essentially the same functionality as the `git ls-tree` command. For more information, see the section _Tree Objects_ in the [Git internals documentation](https://git-scm.com/book/en/v2/Git-Internals-Git-Objects/#_tree_objects).
+WARNING:
+This endpoint is changing to keyset-based pagination. Iterating pages of results
+with a number (`?page=2`) [is deprecated](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/67509).
+Support for iterating with a number will become unsupported in GitLab 15.0. Use
+the new [keyset pagination system](index.md#keyset-based-pagination) instead.
+
```plaintext
GET /projects/:id/repository/tree
```
@@ -27,6 +33,8 @@ Supported attributes:
| `ref` | string | no | The name of a repository branch or tag or if not given the default branch. |
| `recursive` | boolean | no | Boolean value used to get a recursive tree (false by default). |
| `per_page` | integer | no | Number of results to show per page. If not specified, defaults to `20`. [Learn more on pagination](index.md#pagination). |
+| `pagination` | string | no | If set to `keyset`, use the new keyset pagination method. |
+| `page_token` | string | no | The tree record ID at which to fetch the next page. Used only with keyset pagination. |
```json
[
@@ -118,6 +126,7 @@ Supported attributes:
## Get file archive
> Support for [including Git LFS blobs](../topics/git/lfs/index.md#lfs-objects-in-project-archives) was [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/15079) in GitLab 13.5.
+> Support for downloading a subfolder was [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/28827) in GitLab 14.4.
Get an archive of the repository. This endpoint can be accessed without
authentication if the repository is publicly accessible.
@@ -139,11 +148,12 @@ Supported attributes:
|:------------|:---------------|:---------|:----------------------|
| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user. |
| `sha` | string | no | The commit SHA to download. A tag, branch reference, or SHA can be used. This defaults to the tip of the default branch if not specified. |
+| `path` | string | no | The subpath of the repository to download. This defaults to the whole repository (empty string). |
Example request:
```shell
-curl --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.com/api/v4/projects/<project_id>/repository/archive?sha=<commit_sha>"
+curl --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.com/api/v4/projects/<project_id>/repository/archive?sha=<commit_sha>&path=<path>"
```
## Compare branches, tags or commits
@@ -640,7 +650,7 @@ In an entry, the following variables are available (here `foo.bar` means that
- `author.reference`: a reference to the commit author (for example, `@alice`).
- `author.contributor`: a boolean set to `true` when the author is not a project
member, otherwise `false`.
-- `author.credit`: a boolean set to `true` when `author.contributor` is `true` or
+- `author.credit`: a boolean set to `true` when `author.contributor` is `true` or
when `include_groups` is configured, and the author is a member of one of the
groups.
- `merge_request.reference`: a reference to the merge request that first
diff --git a/doc/api/repository_files.md b/doc/api/repository_files.md
index 1e33aadbc1b..4fb1a94e294 100644
--- a/doc/api/repository_files.md
+++ b/doc/api/repository_files.md
@@ -7,9 +7,11 @@ type: reference, api
# Repository files API **(FREE)**
-**CRUD for repository files**
+You can fetch, create, update, and delete files in your repository with this API.
+You can also [configure rate limits](../user/admin_area/settings/files_api_rate_limits.md)
+for this API.
-**Create, read, update, and delete repository files using this API**
+## Available scopes for personal access tokens
The different scopes available using [personal access tokens](../user/profile/personal_access_tokens.md) are depicted
in the following table.
@@ -19,8 +21,6 @@ in the following table.
| `read_repository` | Allows read-access to the repository files. |
| `api` | Allows read-write access to the repository files. |
-> `read_repository` scope was [introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/23534) in GitLab 11.6.
-
## Get file from repository
Allows you to receive information about file in repository like name, size,
diff --git a/doc/api/resource_groups.md b/doc/api/resource_groups.md
new file mode 100644
index 00000000000..ce4fa33d7f2
--- /dev/null
+++ b/doc/api/resource_groups.md
@@ -0,0 +1,70 @@
+---
+stage: Release
+group: Release
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
+type: concepts, howto
+---
+
+# Resource Groups API
+
+You can read more about [controling the job concurrency with resource groups](../ci/resource_groups/index.md).
+
+## Get a specific resource group
+
+```plaintext
+GET /projects/:id/resource_groups/:key
+```
+
+| 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 |
+| `key` | string | yes | The key of the resource group |
+
+```shell
+curl --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/1/resource_groups/production"
+```
+
+Example of response
+
+```json
+{
+ "id": 3,
+ "key": "production",
+ "process_mode": "unordered",
+ "created_at": "2021-09-01T08:04:59.650Z",
+ "updated_at": "2021-09-01T08:04:59.650Z"
+}
+```
+
+## Edit an existing resource group
+
+Updates an existing resource group's properties.
+
+It returns `200` if the resource group was successfully updated. In case of an error, a status code `400` is returned.
+
+```plaintext
+PUT /projects/:id/resource_groups/:key
+```
+
+| 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 |
+| `key` | string | yes | The key of the resource group |
+| `process_mode` | string | no | The process mode of the resource group. One of `unordered`, `oldest_first` or `newest_first`. Read [process modes](../ci/resource_groups/index.md#process-modes) for more information. |
+
+```shell
+curl --request PUT --data "process_mode=oldest_first" \
+ --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/1/resource_groups/production"
+```
+
+Example response:
+
+```json
+{
+ "id": 3,
+ "key": "production",
+ "process_mode": "oldest_first",
+ "created_at": "2021-09-01T08:04:59.650Z",
+ "updated_at": "2021-09-01T08:13:38.679Z"
+}
+```
diff --git a/doc/api/runners.md b/doc/api/runners.md
index bfdf2d49100..5e84080ecb5 100644
--- a/doc/api/runners.md
+++ b/doc/api/runners.md
@@ -15,7 +15,7 @@ There are two tokens to take into account when connecting a runner with GitLab.
| Token | Description |
| ----- | ----------- |
| Registration token | Token used to [register the runner](https://docs.gitlab.com/runner/register/). It can be [obtained through GitLab](../ci/runners/index.md). |
-| Authentication token | Token used to authenticate the runner with the GitLab instance. It is obtained either automatically when [registering a runner](https://docs.gitlab.com/runner/register/), or manually when [registering the runner via the Runner API](#register-a-new-runner). |
+| Authentication token | Token used to authenticate the runner with the GitLab instance. It is obtained automatically when you [register a runner](https://docs.gitlab.com/runner/register/) or by the Runner API when you manually [register a runner](#register-a-new-runner) or [reset the authentication token](#reset-runners-authentication-token). |
Here's an example of how the two tokens are used in runner registration:
@@ -86,7 +86,7 @@ Example response:
## List all runners **(FREE SELF)**
Get a list of all runners in the GitLab instance (specific and shared). Access
-is restricted to users with `admin` privileges.
+is restricted to users with the administrator role.
```plaintext
GET /runners/all
@@ -720,3 +720,28 @@ POST /groups/:id/runners/reset_registration_token
curl --request POST --header "PRIVATE-TOKEN: <your_access_token>" \
"https://gitlab.example.com/api/v4/groups/9/runners/reset_registration_token"
```
+
+## Reset runner's authentication token
+
+Resets the runner's authentication token.
+
+```plaintext
+POST /runners/:id/reset_authentication_token
+```
+
+| Attribute | Type | Required | Description |
+|-----------|---------|----------|---------------------|
+| `id` | integer | yes | The ID of a runner |
+
+```shell
+curl --request POST --header "PRIVATE-TOKEN: <your_access_token>" \
+ "https://gitlab.example.com/api/v4/runners/1/reset_authentication_token"
+```
+
+Example response:
+
+```json
+{
+ "token": "6337ff461c94fd3fa32ba3b1ff4125"
+}
+```
diff --git a/doc/api/search.md b/doc/api/search.md
index d3a2f9c41b6..d3f0cba9234 100644
--- a/doc/api/search.md
+++ b/doc/api/search.md
@@ -1161,7 +1161,7 @@ Blobs searches are performed on both filenames and contents. Search results:
times in the content.
```shell
-curl --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/6/search?scope=blobs&search=installation&ref=feature"
+curl --request GET --header "PRIVATE-TOKEN: <your_access_token>" https://gitlab.example.com/api/v4/projects/6/search?scope=blobs&search=keyword%20filename:*.py
```
Example response:
@@ -1175,7 +1175,7 @@ Example response:
"path": "README.md",
"filename": "README.md",
"id": null,
- "ref": "feature",
+ "ref": "master",
"startline": 46,
"project_id": 6
}
diff --git a/doc/api/services.md b/doc/api/services.md
index cf6c5ec511b..7587e53c9db 100644
--- a/doc/api/services.md
+++ b/doc/api/services.md
@@ -1,1471 +1,9 @@
---
-stage: Ecosystem
-group: Integrations
-info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
+redirect_to: 'integrations.md'
+remove_date: '2021-11-09'
---
-# Services API **(FREE)**
+This file was moved to [another location](integrations.md).
-NOTE:
-This API requires an access token with the [Maintainer or Owner role](../user/permissions.md).
-
-## List all active services
-
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/21330) in GitLab 12.7.
-
-Get a list of all active project services.
-
-```plaintext
-GET /projects/:id/services
-```
-
-Example response:
-
-```json
-[
- {
- "id": 75,
- "title": "Jenkins CI",
- "slug": "jenkins",
- "created_at": "2019-11-20T11:20:25.297Z",
- "updated_at": "2019-11-20T12:24:37.498Z",
- "active": true,
- "commit_events": true,
- "push_events": true,
- "issues_events": true,
- "confidential_issues_events": true,
- "merge_requests_events": true,
- "tag_push_events": false,
- "note_events": true,
- "confidential_note_events": true,
- "pipeline_events": true,
- "wiki_page_events": true,
- "job_events": true,
- "comment_on_event_enabled": true
- },
- {
- "id": 76,
- "title": "Alerts endpoint",
- "slug": "alerts",
- "created_at": "2019-11-20T11:20:25.297Z",
- "updated_at": "2019-11-20T12:24:37.498Z",
- "active": true,
- "commit_events": true,
- "push_events": true,
- "issues_events": true,
- "confidential_issues_events": true,
- "merge_requests_events": true,
- "tag_push_events": true,
- "note_events": true,
- "confidential_note_events": true,
- "pipeline_events": true,
- "wiki_page_events": true,
- "job_events": true,
- "comment_on_event_enabled": true
- }
-]
-```
-
-## Asana
-
-Add commit messages as comments to Asana tasks.
-
-See also the [Asana service documentation](../user/project/integrations/asana.md).
-
-### Create/Edit Asana service
-
-Set Asana service for a project.
-
-```plaintext
-PUT /projects/:id/services/asana
-```
-
-Parameters:
-
-| Parameter | Type | Required | Description |
-| --------- | ---- | -------- | ----------- |
-| `api_key` | string | true | User API token. User must have access to task. All comments are attributed to this user. |
-| `restrict_to_branch` | string | false | Comma-separated list of branches to be are automatically inspected. Leave blank to include all branches. |
-| `push_events` | boolean | false | Enable notifications for push events |
-
-### Delete Asana service
-
-Delete Asana service for a project.
-
-```plaintext
-DELETE /projects/:id/services/asana
-```
-
-### Get Asana service settings
-
-Get Asana service settings for a project.
-
-```plaintext
-GET /projects/:id/services/asana
-```
-
-## Assembla
-
-Project Management Software (Source Commits Endpoint)
-
-### Create/Edit Assembla service
-
-Set Assembla service for a project.
-
-```plaintext
-PUT /projects/:id/services/assembla
-```
-
-Parameters:
-
-| Parameter | Type | Required | Description |
-| --------- | ---- | -------- | ----------- |
-| `token` | string | true | The authentication token
-| `subdomain` | string | false | The subdomain setting |
-| `push_events` | boolean | false | Enable notifications for push events |
-
-### Delete Assembla service
-
-Delete Assembla service for a project.
-
-```plaintext
-DELETE /projects/:id/services/assembla
-```
-
-### Get Assembla service settings
-
-Get Assembla service settings for a project.
-
-```plaintext
-GET /projects/:id/services/assembla
-```
-
-## Atlassian Bamboo CI
-
-A continuous integration and build server
-
-### Create/Edit Atlassian Bamboo CI service
-
-Set Atlassian Bamboo CI service for a project.
-
-> You must set up automatic revision labeling and a repository trigger in Bamboo.
-
-```plaintext
-PUT /projects/:id/services/bamboo
-```
-
-Parameters:
-
-| Parameter | Type | Required | Description |
-| --------- | ---- | -------- | ----------- |
-| `bamboo_url` | string | true | Bamboo root URL. For example, `https://bamboo.example.com`. |
-| `build_key` | string | true | Bamboo build plan key like KEY |
-| `username` | string | true | A user with API access, if applicable |
-| `password` | string | true | Password of the user |
-| `push_events` | boolean | false | Enable notifications for push events |
-
-### Delete Atlassian Bamboo CI service
-
-Delete Atlassian Bamboo CI service for a project.
-
-```plaintext
-DELETE /projects/:id/services/bamboo
-```
-
-### Get Atlassian Bamboo CI service settings
-
-Get Atlassian Bamboo CI service settings for a project.
-
-```plaintext
-GET /projects/:id/services/bamboo
-```
-
-## Bugzilla
-
-Bugzilla Issue Tracker
-
-### Create/Edit Bugzilla service
-
-Set Bugzilla service for a project.
-
-```plaintext
-PUT /projects/:id/services/bugzilla
-```
-
-Parameters:
-
-| Parameter | Type | Required | Description |
-| --------- | ---- | -------- | ----------- |
-| `new_issue_url` | string | true | New Issue URL |
-| `issues_url` | string | true | Issue URL |
-| `project_url` | string | true | Project URL |
-| `description` | string | false | Description |
-| `title` | string | false | Title |
-| `push_events` | boolean | false | Enable notifications for push events |
-
-### Delete Bugzilla Service
-
-Delete Bugzilla service for a project.
-
-```plaintext
-DELETE /projects/:id/services/bugzilla
-```
-
-### Get Bugzilla Service Settings
-
-Get Bugzilla service settings for a project.
-
-```plaintext
-GET /projects/:id/services/bugzilla
-```
-
-## Buildkite
-
-Continuous integration and deployments
-
-### Create/Edit Buildkite service
-
-Set Buildkite service for a project.
-
-```plaintext
-PUT /projects/:id/services/buildkite
-```
-
-Parameters:
-
-| Parameter | Type | Required | Description |
-| --------- | ---- | -------- | ----------- |
-| `token` | string | true | Buildkite project GitLab token |
-| `project_url` | string | true | Pipeline URL. For example, `https://buildkite.com/example/pipeline` |
-| `enable_ssl_verification` | boolean | false | DEPRECATED: This parameter has no effect since SSL verification is always enabled |
-| `push_events` | boolean | false | Enable notifications for push events |
-
-### Delete Buildkite service
-
-Delete Buildkite service for a project.
-
-```plaintext
-DELETE /projects/:id/services/buildkite
-```
-
-### Get Buildkite service settings
-
-Get Buildkite service settings for a project.
-
-```plaintext
-GET /projects/:id/services/buildkite
-```
-
-## Campfire
-
-Send notifications about push events to Campfire chat rooms.
-[New users can no longer sign up for Campfire](https://basecamp.com/retired/campfire).
-
-### Create/Edit Campfire service
-
-Set Campfire service for a project.
-
-```plaintext
-PUT /projects/:id/services/campfire
-```
-
-Parameters:
-
-| Parameter | Type | Required | Description |
-|---------------|---------|----------|---------------------------------------------------------------------------------------------|
-| `token` | string | true | Campfire API token. To find it, log into Campfire and select **My info**. |
-| `subdomain` | string | false | Campfire subdomain. Text between `https://` and `.campfirenow.com` when you're logged in. |
-| `room` | string | false | Campfire room. The last part of the URL when you're in a room. |
-| `push_events` | boolean | false | Enable notifications for push events. |
-
-### Delete Campfire service
-
-Delete Campfire service for a project.
-
-```plaintext
-DELETE /projects/:id/services/campfire
-```
-
-### Get Campfire service settings
-
-Get Campfire service settings for a project.
-
-```plaintext
-GET /projects/:id/services/campfire
-```
-
-## Unify Circuit
-
-Unify Circuit RTC and collaboration tool.
-
-### Create/Edit Unify Circuit service
-
-Set Unify Circuit service for a project.
-
-```plaintext
-PUT /projects/:id/services/unify-circuit
-```
-
-Parameters:
-
-| Parameter | Type | Required | Description |
-| --------- | ---- | -------- | ----------- |
-| `webhook` | string | true | The Unify Circuit webhook. For example, `https://circuit.com/rest/v2/webhooks/incoming/...`. |
-| `notify_only_broken_pipelines` | boolean | false | Send notifications for broken pipelines |
-| `branches_to_be_notified` | string | false | Branches to send notifications for. Valid options are "all", "default", "protected", and "default_and_protected". The default value is "default" |
-| `push_events` | boolean | false | Enable notifications for push events |
-| `issues_events` | boolean | false | Enable notifications for issue events |
-| `confidential_issues_events` | boolean | false | Enable notifications for confidential issue events |
-| `merge_requests_events` | boolean | false | Enable notifications for merge request events |
-| `tag_push_events` | boolean | false | Enable notifications for tag push events |
-| `note_events` | boolean | false | Enable notifications for note events |
-| `confidential_note_events` | boolean | false | Enable notifications for confidential note events |
-| `pipeline_events` | boolean | false | Enable notifications for pipeline events |
-| `wiki_page_events` | boolean | false | Enable notifications for wiki page events |
-
-### Delete Unify Circuit service
-
-Delete Unify Circuit service for a project.
-
-```plaintext
-DELETE /projects/:id/services/unify-circuit
-```
-
-### Get Unify Circuit service settings
-
-Get Unify Circuit service settings for a project.
-
-```plaintext
-GET /projects/:id/services/unify-circuit
-```
-
-## Webex Teams
-
-Webex Teams collaboration tool.
-
-### Create/Edit Webex Teams service
-
-Set Webex Teams service for a project.
-
-```plaintext
-PUT /projects/:id/services/webex-teams
-```
-
-Parameters:
-
-| Parameter | Type | Required | Description |
-| --------- | ---- | -------- | ----------- |
-| `webhook` | string | true | The Webex Teams webhook. For example, `https://api.ciscospark.com/v1/webhooks/incoming/...`. |
-| `notify_only_broken_pipelines` | boolean | false | Send notifications for broken pipelines |
-| `branches_to_be_notified` | string | false | Branches to send notifications for. Valid options are "all", "default", "protected", and "default_and_protected". The default value is "default" |
-| `push_events` | boolean | false | Enable notifications for push events |
-| `issues_events` | boolean | false | Enable notifications for issue events |
-| `confidential_issues_events` | boolean | false | Enable notifications for confidential issue events |
-| `merge_requests_events` | boolean | false | Enable notifications for merge request events |
-| `tag_push_events` | boolean | false | Enable notifications for tag push events |
-| `note_events` | boolean | false | Enable notifications for note events |
-| `confidential_note_events` | boolean | false | Enable notifications for confidential note events |
-| `pipeline_events` | boolean | false | Enable notifications for pipeline events |
-| `wiki_page_events` | boolean | false | Enable notifications for wiki page events |
-
-### Delete Webex Teams service
-
-Delete Webex Teams service for a project.
-
-```plaintext
-DELETE /projects/:id/services/webex-teams
-```
-
-### Get Webex Teams service settings
-
-Get Webex Teams service settings for a project.
-
-```plaintext
-GET /projects/:id/services/webex-teams
-```
-
-## Custom Issue Tracker
-
-Custom issue tracker
-
-### Create/Edit Custom Issue Tracker service
-
-Set Custom Issue Tracker service for a project.
-
-```plaintext
-PUT /projects/:id/services/custom-issue-tracker
-```
-
-Parameters:
-
-| Parameter | Type | Required | Description |
-| --------- | ---- | -------- | ----------- |
-| `new_issue_url` | string | true | New Issue URL |
-| `issues_url` | string | true | Issue URL |
-| `project_url` | string | true | Project URL |
-| `description` | string | false | Description |
-| `title` | string | false | Title |
-| `push_events` | boolean | false | Enable notifications for push events |
-
-### Delete Custom Issue Tracker service
-
-Delete Custom Issue Tracker service for a project.
-
-```plaintext
-DELETE /projects/:id/services/custom-issue-tracker
-```
-
-### Get Custom Issue Tracker service settings
-
-Get Custom Issue Tracker service settings for a project.
-
-```plaintext
-GET /projects/:id/services/custom-issue-tracker
-```
-
-## Drone CI
-
-Drone is a Continuous Integration platform built on Docker, written in Go
-
-### Create/Edit Drone CI service
-
-Set Drone CI service for a project.
-
-```plaintext
-PUT /projects/:id/services/drone-ci
-```
-
-Parameters:
-
-| Parameter | Type | Required | Description |
-| --------- | ---- | -------- | ----------- |
-| `token` | string | true | Drone CI project specific token |
-| `drone_url` | string | true | `http://drone.example.com` |
-| `enable_ssl_verification` | boolean | false | Enable SSL verification |
-| `push_events` | boolean | false | Enable notifications for push events |
-| `merge_requests_events` | boolean | false | Enable notifications for merge request events |
-| `tag_push_events` | boolean | false | Enable notifications for tag push events |
-
-### Delete Drone CI service
-
-Delete Drone CI service for a project.
-
-```plaintext
-DELETE /projects/:id/services/drone-ci
-```
-
-### Get Drone CI service settings
-
-Get Drone CI service settings for a project.
-
-```plaintext
-GET /projects/:id/services/drone-ci
-```
-
-## Emails on push
-
-Email the commits and diff of each push to a list of recipients.
-
-### Create/Edit Emails on push service
-
-Set Emails on push service for a project.
-
-```plaintext
-PUT /projects/:id/services/emails-on-push
-```
-
-Parameters:
-
-| Parameter | Type | Required | Description |
-| --------- | ---- | -------- | ----------- |
-| `recipients` | string | true | Emails separated by whitespace |
-| `disable_diffs` | boolean | false | Disable code diffs |
-| `send_from_committer_email` | boolean | false | Send from committer |
-| `push_events` | boolean | false | Enable notifications for push events |
-| `tag_push_events` | boolean | false | Enable notifications for tag push events |
-| `branches_to_be_notified` | string | false | Branches to send notifications for. Valid options are "all", "default", "protected", and "default_and_protected". Notifications are always fired for tag pushes. The default value is "all" |
-
-### Delete Emails on push service
-
-Delete Emails on push service for a project.
-
-```plaintext
-DELETE /projects/:id/services/emails-on-push
-```
-
-### Get Emails on push service settings
-
-Get Emails on push service settings for a project.
-
-```plaintext
-GET /projects/:id/services/emails-on-push
-```
-
-## Confluence service
-
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/220934) in GitLab 13.2.
-
-Replaces the link to the internal wiki with a link to a Confluence Cloud Workspace.
-
-### Create/Edit Confluence service
-
-Set Confluence service for a project.
-
-```plaintext
-PUT /projects/:id/services/confluence
-```
-
-Parameters:
-
-| Parameter | Type | Required | Description |
-| --------- | ---- | -------- | ----------- |
-| `confluence_url` | string | true | The URL of the Confluence Cloud Workspace hosted on atlassian.net. |
-
-### Delete Confluence service
-
-Delete Confluence service for a project.
-
-```plaintext
-DELETE /projects/:id/services/confluence
-```
-
-### Get Confluence service settings
-
-Get Confluence service settings for a project.
-
-```plaintext
-GET /projects/:id/services/confluence
-```
-
-## External wiki
-
-Replaces the link to the internal wiki with a link to an external wiki.
-
-### Create/Edit External wiki service
-
-Set External wiki service for a project.
-
-```plaintext
-PUT /projects/:id/services/external-wiki
-```
-
-Parameters:
-
-| Parameter | Type | Required | Description |
-| --------- | ---- | -------- | ----------- |
-| `external_wiki_url` | string | true | The URL of the external wiki |
-
-### Delete External wiki service
-
-Delete External wiki service for a project.
-
-```plaintext
-DELETE /projects/:id/services/external-wiki
-```
-
-### Get External wiki service settings
-
-Get External wiki service settings for a project.
-
-```plaintext
-GET /projects/:id/services/external-wiki
-```
-
-## Flowdock
-
-Flowdock is a ChatOps application for collaboration in software engineering
-companies. You can send notifications from GitLab events to Flowdock flows.
-For integration instructions, see the [Flowdock documentation](https://www.flowdock.com/help/gitlab).
-
-### Create/Edit Flowdock service
-
-Set Flowdock service for a project.
-
-```plaintext
-PUT /projects/:id/services/flowdock
-```
-
-Parameters:
-
-| Parameter | Type | Required | Description |
-| --------- | ---- | -------- | ----------- |
-| `token` | string | true | Flowdock Git source token |
-| `push_events` | boolean | false | Enable notifications for push events |
-
-### Delete Flowdock service
-
-Delete Flowdock service for a project.
-
-```plaintext
-DELETE /projects/:id/services/flowdock
-```
-
-### Get Flowdock service settings
-
-Get Flowdock service settings for a project.
-
-```plaintext
-GET /projects/:id/services/flowdock
-```
-
-## GitHub **(PREMIUM)**
-
-Code collaboration software.
-
-### Create/Edit GitHub service
-
-Set GitHub service for a project.
-
-```plaintext
-PUT /projects/:id/services/github
-```
-
-Parameters:
-
-| Parameter | Type | Required | Description |
-| --------- | ---- | -------- | ----------- |
-| `token` | string | true | GitHub API token with `repo:status` OAuth scope |
-| `repository_url` | string | true | GitHub repository URL |
-| `static_context` | boolean | false | Append instance name instead of branch to [status check name](../user/project/integrations/github.md#static--dynamic-status-check-names) |
-
-### Delete GitHub service
-
-Delete GitHub service for a project.
-
-```plaintext
-DELETE /projects/:id/services/github
-```
-
-### Get GitHub service settings
-
-Get GitHub service settings for a project.
-
-```plaintext
-GET /projects/:id/services/github
-```
-
-## Hangouts Chat
-
-> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/20290) in GitLab 11.2.
-
-Google Workspace team collaboration tool.
-
-### Create/Edit Hangouts Chat service
-
-Set Hangouts Chat service for a project.
-
-```plaintext
-PUT /projects/:id/services/hangouts-chat
-```
-
-NOTE:
-Specific event parameters (for example, `push_events` flag) were [introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/11435) in GitLab 10.4.
-
-Parameters:
-
-| Parameter | Type | Required | Description |
-| --------- | ---- | -------- | ----------- |
-| `webhook` | string | true | The Hangouts Chat webhook. For example, `https://chat.googleapis.com/v1/spaces...`. |
-| `notify_only_broken_pipelines` | boolean | false | Send notifications for broken pipelines |
-| `notify_only_default_branch` | boolean | false | DEPRECATED: This parameter has been replaced with `branches_to_be_notified` |
-| `branches_to_be_notified` | string | false | Branches to send notifications for. Valid options are "all", "default", "protected", and "default_and_protected". The default value is "default" |
-| `push_events` | boolean | false | Enable notifications for push events |
-| `issues_events` | boolean | false | Enable notifications for issue events |
-| `confidential_issues_events` | boolean | false | Enable notifications for confidential issue events |
-| `merge_requests_events` | boolean | false | Enable notifications for merge request events |
-| `tag_push_events` | boolean | false | Enable notifications for tag push events |
-| `note_events` | boolean | false | Enable notifications for note events |
-| `confidential_note_events` | boolean | false | Enable notifications for confidential note events |
-| `pipeline_events` | boolean | false | Enable notifications for pipeline events |
-| `wiki_page_events` | boolean | false | Enable notifications for wiki page events |
-
-### Delete Hangouts Chat service
-
-Delete Hangouts Chat service for a project.
-
-```plaintext
-DELETE /projects/:id/services/hangouts-chat
-```
-
-### Get Hangouts Chat service settings
-
-Get Hangouts Chat service settings for a project.
-
-```plaintext
-GET /projects/:id/services/hangouts-chat
-```
-
-## irker (IRC gateway)
-
-Send IRC messages, on update, to a list of recipients through an irker gateway.
-
-For more information, see the [irker integration documentation](../user/project/integrations/irker.md).
-
-### Create/Edit irker (IRC gateway) service
-
-Set irker (IRC gateway) service for a project.
-
-```plaintext
-PUT /projects/:id/services/irker
-```
-
-Parameters:
-
-| Parameter | Type | Required | Description |
-| --------- | ---- | -------- | ----------- |
-| `recipients` | string | true | Recipients/channels separated by whitespaces |
-| `default_irc_uri` | string | false | `irc://irc.network.net:6697/` |
-| `server_host` | string | false | localhost |
-| `server_port` | integer | false | 6659 |
-| `colorize_messages` | boolean | false | Colorize messages |
-| `push_events` | boolean | false | Enable notifications for push events |
-
-### Delete irker (IRC gateway) service
-
-Delete irker (IRC gateway) service for a project.
-
-```plaintext
-DELETE /projects/:id/services/irker
-```
-
-### Get irker (IRC gateway) service settings
-
-Get irker (IRC gateway) service settings for a project.
-
-```plaintext
-GET /projects/:id/services/irker
-```
-
-## Jira
-
-Jira issue tracker.
-
-### Get Jira service settings
-
-Get Jira service settings for a project.
-
-```plaintext
-GET /projects/:id/services/jira
-```
-
-### Create/Edit Jira service
-
-Set Jira service for a project.
-
-> Starting with GitLab 8.14, `api_url`, `issues_url`, `new_issue_url` and
-> `project_url` are replaced by `url`. If you are using an
-> older version, [follow this documentation](https://gitlab.com/gitlab-org/gitlab/-/blob/8-13-stable-ee/doc/api/services.md#jira).
-
-```plaintext
-PUT /projects/:id/services/jira
-```
-
-Parameters:
-
-| Parameter | Type | Required | Description |
-| --------- | ---- | -------- | ----------- |
-| `url` | string | yes | The URL to the Jira project which is being linked to this GitLab project. For example, `https://jira.example.com`. |
-| `api_url` | string | no | The base URL to the Jira instance API. Web URL value is used if not set. For example, `https://jira-api.example.com`. |
-| `username` | string | yes | The username of the user created to be used with GitLab/Jira. |
-| `password` | string | yes | The password of the user created to be used with GitLab/Jira. |
-| `active` | boolean | no | Activates or deactivates the service. Defaults to false (deactivated). |
-| `jira_issue_transition_automatic` | boolean | no | Enable [automatic issue transitions](../integration/jira/issues.md#automatic-issue-transitions). Takes precedence over `jira_issue_transition_id` if enabled. Defaults to `false` |
-| `jira_issue_transition_id` | string | no | The ID of one or more transitions for [custom issue transitions](../integration/jira/issues.md#custom-issue-transitions). Ignored if `jira_issue_transition_automatic` is enabled. Defaults to a blank string, which disables custom transitions. |
-| `commit_events` | boolean | false | Enable notifications for commit events |
-| `merge_requests_events` | boolean | false | Enable notifications for merge request events |
-| `comment_on_event_enabled` | boolean | false | Enable comments inside Jira issues on each GitLab event (commit / merge request) |
-
-### Delete Jira service
-
-Remove all previously Jira settings from a project.
-
-```plaintext
-DELETE /projects/:id/services/jira
-```
-
-## Slack slash commands
-
-Ability to receive slash commands from a Slack chat instance.
-
-### Get Slack slash command service settings
-
-Get Slack slash command service settings for a project.
-
-```plaintext
-GET /projects/:id/services/slack-slash-commands
-```
-
-Example response:
-
-```json
-{
- "id": 4,
- "title": "Slack slash commands",
- "slug": "slack-slash-commands",
- "created_at": "2017-06-27T05:51:39-07:00",
- "updated_at": "2017-06-27T05:51:39-07:00",
- "active": true,
- "push_events": true,
- "issues_events": true,
- "confidential_issues_events": true,
- "merge_requests_events": true,
- "tag_push_events": true,
- "note_events": true,
- "job_events": true,
- "pipeline_events": true,
- "comment_on_event_enabled": false,
- "properties": {
- "token": "<your_access_token>"
- }
-}
-```
-
-### Create/Edit Slack slash command service
-
-Set Slack slash command for a project.
-
-```plaintext
-PUT /projects/:id/services/slack-slash-commands
-```
-
-Parameters:
-
-| Parameter | Type | Required | Description |
-| --------- | ---- | -------- | ----------- |
-| `token` | string | yes | The Slack token |
-
-### Delete Slack slash command service
-
-Delete Slack slash command service for a project.
-
-```plaintext
-DELETE /projects/:id/services/slack-slash-commands
-```
-
-## Mattermost slash commands
-
-Ability to receive slash commands from a Mattermost chat instance.
-
-### Get Mattermost slash command service settings
-
-Get Mattermost slash command service settings for a project.
-
-```plaintext
-GET /projects/:id/services/mattermost-slash-commands
-```
-
-### Create/Edit Mattermost slash command service
-
-Set Mattermost slash command for a project.
-
-```plaintext
-PUT /projects/:id/services/mattermost-slash-commands
-```
-
-Parameters:
-
-| Parameter | Type | Required | Description |
-| --------- | ---- | -------- | ----------- |
-| `token` | string | yes | The Mattermost token |
-| `username` | string | no | The username to use to post the message |
-
-### Delete Mattermost slash command service
-
-Delete Mattermost slash command service for a project.
-
-```plaintext
-DELETE /projects/:id/services/mattermost-slash-commands
-```
-
-## Packagist
-
-Update your project on Packagist (the main Composer repository) when commits or tags are pushed to GitLab.
-
-### Create/Edit Packagist service
-
-Set Packagist service for a project.
-
-```plaintext
-PUT /projects/:id/services/packagist
-```
-
-Parameters:
-
-| Parameter | Type | Required | Description |
-| --------- | ---- | -------- | ----------- |
-| `username` | string | yes | The username of a Packagist account |
-| `token` | string | yes | API token to the Packagist server |
-| `server` | boolean | no | URL of the Packagist server. Leave blank for default: <https://packagist.org> |
-| `push_events` | boolean | false | Enable notifications for push events |
-| `merge_requests_events` | boolean | false | Enable notifications for merge request events |
-| `tag_push_events` | boolean | false | Enable notifications for tag push events |
-
-### Delete Packagist service
-
-Delete Packagist service for a project.
-
-```plaintext
-DELETE /projects/:id/services/packagist
-```
-
-### Get Packagist service settings
-
-Get Packagist service settings for a project.
-
-```plaintext
-GET /projects/:id/services/packagist
-```
-
-## Pipeline-Emails
-
-Get emails for GitLab CI/CD pipelines.
-
-### Create/Edit Pipeline-Emails service
-
-Set Pipeline-Emails service for a project.
-
-```plaintext
-PUT /projects/:id/services/pipelines-email
-```
-
-Parameters:
-
-| Parameter | Type | Required | Description |
-| --------- | ---- | -------- | ----------- |
-| `recipients` | string | yes | Comma-separated list of recipient email addresses |
-| `add_pusher` | boolean | no | Add pusher to recipients list |
-| `notify_only_broken_pipelines` | boolean | no | Notify only broken pipelines |
-| `branches_to_be_notified` | string | false | Branches to send notifications for. Valid options are "all", "default", "protected", and "default_and_protected. The default value is "default" |
-| `notify_only_default_branch` | boolean | no | Send notifications only for the default branch ([introduced in GitLab 12.0](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/28271)) |
-| `pipeline_events` | boolean | false | Enable notifications for pipeline events |
-
-### Delete Pipeline-Emails service
-
-Delete Pipeline-Emails service for a project.
-
-```plaintext
-DELETE /projects/:id/services/pipelines-email
-```
-
-### Get Pipeline-Emails service settings
-
-Get Pipeline-Emails service settings for a project.
-
-```plaintext
-GET /projects/:id/services/pipelines-email
-```
-
-## Pivotal Tracker
-
-Add commit messages as comments to Pivotal Tracker stories.
-
-See also the [Pivotal Tracker service documentation](../user/project/integrations/pivotal_tracker.md).
-
-### Create/Edit Pivotal Tracker service
-
-Set Pivotal Tracker service for a project.
-
-```plaintext
-PUT /projects/:id/services/pivotaltracker
-```
-
-Parameters:
-
-| Parameter | Type | Required | Description |
-| --------- | ---- | -------- | ----------- |
-| `token` | string | true | The Pivotal Tracker token |
-| `restrict_to_branch` | boolean | false | Comma-separated list of branches to automatically inspect. Leave blank to include all branches. |
-| `push_events` | boolean | false | Enable notifications for push events |
-
-### Delete Pivotal Tracker service
-
-Delete Pivotal Tracker service for a project.
-
-```plaintext
-DELETE /projects/:id/services/pivotaltracker
-```
-
-### Get Pivotal Tracker service settings
-
-Get Pivotal Tracker service settings for a project.
-
-```plaintext
-GET /projects/:id/services/pivotaltracker
-```
-
-## Prometheus
-
-Prometheus is a powerful time-series monitoring service.
-
-### Create/Edit Prometheus service
-
-Set Prometheus service for a project.
-
-```plaintext
-PUT /projects/:id/services/prometheus
-```
-
-Parameters:
-
-| Parameter | Type | Required | Description |
-| --------- | ---- | -------- | ----------- |
-| `api_url` | string | true | Prometheus API Base URL. For example, `http://prometheus.example.com/`. |
-| `google_iap_audience_client_id` | string | false | Client ID of the IAP secured resource (looks like IAP_CLIENT_ID.apps.googleusercontent.com) |
-| `google_iap_service_account_json` | string | false | `credentials.json` file for your service account, like { "type": "service_account", "project_id": ... } |
-
-### Delete Prometheus service
-
-Delete Prometheus service for a project.
-
-```plaintext
-DELETE /projects/:id/services/prometheus
-```
-
-### Get Prometheus service settings
-
-Get Prometheus service settings for a project.
-
-```plaintext
-GET /projects/:id/services/prometheus
-```
-
-## Pushover
-
-Pushover makes it easy to get real-time notifications on your Android device, iPhone, iPad, and Desktop.
-
-### Create/Edit Pushover service
-
-Set Pushover service for a project.
-
-```plaintext
-PUT /projects/:id/services/pushover
-```
-
-Parameters:
-
-| Parameter | Type | Required | Description |
-| --------- | ---- | -------- | ----------- |
-| `api_key` | string | true | Your application key |
-| `user_key` | string | true | Your user key |
-| `priority` | string | true | The priority |
-| `device` | string | false | Leave blank for all active devices |
-| `sound` | string | false | The sound of the notification |
-| `push_events` | boolean | false | Enable notifications for push events |
-
-### Delete Pushover service
-
-Delete Pushover service for a project.
-
-```plaintext
-DELETE /projects/:id/services/pushover
-```
-
-### Get Pushover service settings
-
-Get Pushover service settings for a project.
-
-```plaintext
-GET /projects/:id/services/pushover
-```
-
-## Redmine
-
-Redmine issue tracker
-
-### Create/Edit Redmine service
-
-Set Redmine service for a project.
-
-```plaintext
-PUT /projects/:id/services/redmine
-```
-
-Parameters:
-
-| Parameter | Type | Required | Description |
-| --------- | ---- | -------- | ----------- |
-| `new_issue_url` | string | true | New Issue URL |
-| `project_url` | string | true | Project URL |
-| `issues_url` | string | true | Issue URL |
-| `description` | string | false | Description |
-| `push_events` | boolean | false | Enable notifications for push events |
-
-### Delete Redmine service
-
-Delete Redmine service for a project.
-
-```plaintext
-DELETE /projects/:id/services/redmine
-```
-
-### Get Redmine service settings
-
-Get Redmine service settings for a project.
-
-```plaintext
-GET /projects/:id/services/redmine
-```
-
-## Slack notifications
-
-Receive event notifications in Slack
-
-### Create/Edit Slack service
-
-Set Slack service for a project.
-
-```plaintext
-PUT /projects/:id/services/slack
-```
-
-NOTE:
-Specific event parameters (for example, `push_events` flag and `push_channel`) were [introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/11435) in GitLab 10.4.
-
-Parameters:
-
-| Parameter | Type | Required | Description |
-| --------- | ---- | -------- | ----------- |
-| `webhook` | string | true | `https://hooks.slack.com/services/...` |
-| `username` | string | false | username |
-| `channel` | string | false | Default channel to use if others are not configured |
-| `notify_only_broken_pipelines` | boolean | false | Send notifications for broken pipelines |
-| `notify_only_default_branch` | boolean | false | DEPRECATED: This parameter has been replaced with `branches_to_be_notified` |
-| `branches_to_be_notified` | string | false | Branches to send notifications for. Valid options are "all", "default", "protected", and "default_and_protected". The default value is "default" |
-| `commit_events` | boolean | false | Enable notifications for commit events |
-| `confidential_issue_channel` | string | false | The name of the channel to receive confidential issues events notifications |
-| `confidential_issues_events` | boolean | false | Enable notifications for confidential issue events |
-| `confidential_note_channel` | string | false | The name of the channel to receive confidential note events notifications |
-| `confidential_note_events` | boolean | false | Enable notifications for confidential note events |
-| `deployment_channel` | string | false | The name of the channel to receive deployment events notifications |
-| `deployment_events` | boolean | false | Enable notifications for deployment events |
-| `issue_channel` | string | false | The name of the channel to receive issues events notifications |
-| `issues_events` | boolean | false | Enable notifications for issue events |
-| `job_events` | boolean | false | Enable notifications for job events |
-| `merge_request_channel` | string | false | The name of the channel to receive merge request events notifications |
-| `merge_requests_events` | boolean | false | Enable notifications for merge request events |
-| `note_channel` | string | false | The name of the channel to receive note events notifications |
-| `note_events` | boolean | false | Enable notifications for note events |
-| `pipeline_channel` | string | false | The name of the channel to receive pipeline events notifications |
-| `pipeline_events` | boolean | false | Enable notifications for pipeline events |
-| `push_channel` | string | false | The name of the channel to receive push events notifications |
-| `push_events` | boolean | false | Enable notifications for push events |
-| `tag_push_channel` | string | false | The name of the channel to receive tag push events notifications |
-| `tag_push_events` | boolean | false | Enable notifications for tag push events |
-| `wiki_page_channel` | string | false | The name of the channel to receive wiki page events notifications |
-| `wiki_page_events` | boolean | false | Enable notifications for wiki page events |
-| `vulnerability_channel` | string | false | **(ULTIMATE)** The name of the channel to receive vulnerability event notifications. |
-| `vulnerability_events` | boolean | false | **(ULTIMATE)** Enable notifications for vulnerability events |
-
-### Delete Slack service
-
-Delete Slack service for a project.
-
-```plaintext
-DELETE /projects/:id/services/slack
-```
-
-### Get Slack service settings
-
-Get Slack service settings for a project.
-
-```plaintext
-GET /projects/:id/services/slack
-```
-
-## Microsoft Teams
-
-Group Chat Software
-
-### Create/Edit Microsoft Teams service
-
-Set Microsoft Teams service for a project.
-
-```plaintext
-PUT /projects/:id/services/microsoft-teams
-```
-
-Parameters:
-
-| Parameter | Type | Required | Description |
-| --------- | ---- | -------- | ----------- |
-| `webhook` | string | true | The Microsoft Teams webhook. For example, `https://outlook.office.com/webhook/...` |
-| `notify_only_broken_pipelines` | boolean | false | Send notifications for broken pipelines |
-| `notify_only_default_branch` | boolean | false | DEPRECATED: This parameter has been replaced with `branches_to_be_notified` |
-| `branches_to_be_notified` | string | false | Branches to send notifications for. Valid options are "all", "default", "protected", and "default_and_protected". The default value is "default" |
-| `push_events` | boolean | false | Enable notifications for push events |
-| `issues_events` | boolean | false | Enable notifications for issue events |
-| `confidential_issues_events` | boolean | false | Enable notifications for confidential issue events |
-| `merge_requests_events` | boolean | false | Enable notifications for merge request events |
-| `tag_push_events` | boolean | false | Enable notifications for tag push events |
-| `note_events` | boolean | false | Enable notifications for note events |
-| `confidential_note_events` | boolean | false | Enable notifications for confidential note events |
-| `pipeline_events` | boolean | false | Enable notifications for pipeline events |
-| `wiki_page_events` | boolean | false | Enable notifications for wiki page events |
-
-### Delete Microsoft Teams service
-
-Delete Microsoft Teams service for a project.
-
-```plaintext
-DELETE /projects/:id/services/microsoft-teams
-```
-
-### Get Microsoft Teams service settings
-
-Get Microsoft Teams service settings for a project.
-
-```plaintext
-GET /projects/:id/services/microsoft-teams
-```
-
-## Mattermost notifications
-
-Receive event notifications in Mattermost
-
-### Create/Edit Mattermost notifications service
-
-Set Mattermost service for a project.
-
-```plaintext
-PUT /projects/:id/services/mattermost
-```
-
-NOTE:
-Specific event parameters (for example, `push_events` flag and `push_channel`) were [introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/11435) in GitLab 10.4.
-
-Parameters:
-
-| Parameter | Type | Required | Description |
-| --------- | ---- | -------- | ----------- |
-| `webhook` | string | true | The Mattermost webhook. For example, `http://mattermost_host/hooks/...` |
-| `username` | string | false | username |
-| `channel` | string | false | Default channel to use if others are not configured |
-| `notify_only_broken_pipelines` | boolean | false | Send notifications for broken pipelines |
-| `notify_only_default_branch` | boolean | false | DEPRECATED: This parameter has been replaced with `branches_to_be_notified` |
-| `branches_to_be_notified` | string | false | Branches to send notifications for. Valid options are "all", "default", "protected", and "default_and_protected". The default value is "default" |
-| `push_events` | boolean | false | Enable notifications for push events |
-| `issues_events` | boolean | false | Enable notifications for issue events |
-| `confidential_issues_events` | boolean | false | Enable notifications for confidential issue events |
-| `merge_requests_events` | boolean | false | Enable notifications for merge request events |
-| `tag_push_events` | boolean | false | Enable notifications for tag push events |
-| `note_events` | boolean | false | Enable notifications for note events |
-| `confidential_note_events` | boolean | false | Enable notifications for confidential note events |
-| `pipeline_events` | boolean | false | Enable notifications for pipeline events |
-| `wiki_page_events` | boolean | false | Enable notifications for wiki page events |
-| `vulnerability_events` | boolean | false | **(ULTIMATE)** Enable notifications for vulnerability events |
-| `push_channel` | string | false | The name of the channel to receive push events notifications |
-| `issue_channel` | string | false | The name of the channel to receive issues events notifications |
-| `confidential_issue_channel` | string | false | The name of the channel to receive confidential issues events notifications |
-| `merge_request_channel` | string | false | The name of the channel to receive merge request events notifications |
-| `note_channel` | string | false | The name of the channel to receive note events notifications |
-| `confidential_note_channel` | string | false | The name of the channel to receive confidential note events notifications |
-| `tag_push_channel` | string | false | The name of the channel to receive tag push events notifications |
-| `pipeline_channel` | string | false | The name of the channel to receive pipeline events notifications |
-| `wiki_page_channel` | string | false | The name of the channel to receive wiki page events notifications |
-| `vulnerability_channel` | string | false | **(ULTIMATE)** The name of the channel to receive vulnerability events notifications |
-
-### Delete Mattermost notifications service
-
-Delete Mattermost Notifications service for a project.
-
-```plaintext
-DELETE /projects/:id/services/mattermost
-```
-
-### Get Mattermost notifications service settings
-
-Get Mattermost notifications service settings for a project.
-
-```plaintext
-GET /projects/:id/services/mattermost
-```
-
-## JetBrains TeamCity CI
-
-A continuous integration and build server
-
-### Create/Edit JetBrains TeamCity CI service
-
-Set JetBrains TeamCity CI service for a project.
-
-> The build configuration in TeamCity must use the build format number `%build.vcs.number%`. Configure monitoring of all branches so merge requests build. That setting is in the VSC root advanced settings.
-
-```plaintext
-PUT /projects/:id/services/teamcity
-```
-
-Parameters:
-
-| Parameter | Type | Required | Description |
-| --------- | ---- | -------- | ----------- |
-| `teamcity_url` | string | true | TeamCity root URL. For example, `https://teamcity.example.com` |
-| `build_type` | string | true | Build configuration ID |
-| `username` | string | true | A user with permissions to trigger a manual build |
-| `password` | string | true | The password of the user |
-| `push_events` | boolean | false | Enable notifications for push events |
-
-### Delete JetBrains TeamCity CI service
-
-Delete JetBrains TeamCity CI service for a project.
-
-```plaintext
-DELETE /projects/:id/services/teamcity
-```
-
-### Get JetBrains TeamCity CI service settings
-
-Get JetBrains TeamCity CI service settings for a project.
-
-```plaintext
-GET /projects/:id/services/teamcity
-```
-
-## Jenkins CI
-
-A continuous integration and build server
-
-### Create/Edit Jenkins CI service
-
-Set Jenkins CI service for a project.
-
-```plaintext
-PUT /projects/:id/services/jenkins
-```
-
-Parameters:
-
-| Parameter | Type | Required | Description |
-| --------- | ---- | -------- | ----------- |
-| `jenkins_url` | string | true | Jenkins URL like `http://jenkins.example.com`. |
-| `project_name` | string | true | The URL-friendly project name. Example: `my_project_name`. |
-| `username` | string | false | Username for authentication with the Jenkins server, if authentication is required by the server. |
-| `password` | string | false | Password for authentication with the Jenkins server, if authentication is required by the server. |
-| `push_events` | boolean | false | Enable notifications for push events. |
-| `merge_requests_events` | boolean | false | Enable notifications for merge request events. |
-| `tag_push_events` | boolean | false | Enable notifications for tag push events. |
-
-### Delete Jenkins CI service
-
-Delete Jenkins CI service for a project.
-
-```plaintext
-DELETE /projects/:id/services/jenkins
-```
-
-### Get Jenkins CI service settings
-
-Get Jenkins CI service settings for a project.
-
-```plaintext
-GET /projects/:id/services/jenkins
-```
-
-## Jenkins CI (Deprecated) Service
-
-A continuous integration and build server
-
-NOTE:
-This service was [removed](https://gitlab.com/gitlab-org/gitlab/-/issues/1600) in GitLab 13.0.
-
-### Create/Edit Jenkins CI (Deprecated) service
-
-Set Jenkins CI (Deprecated) service for a project.
-
-```plaintext
-PUT /projects/:id/services/jenkins-deprecated
-```
-
-Parameters:
-
-- `project_url` (**required**) - Jenkins project URL like `http://jenkins.example.com/job/my-project/`
-- `multiproject_enabled` (optional) - Multi-project mode is configured in Jenkins GitLab Hook plugin
-- `pass_unstable` (optional) - Unstable builds are treated as passing
-
-### Delete Jenkins CI (Deprecated) service
-
-Delete Jenkins CI (Deprecated) service for a project.
-
-```plaintext
-DELETE /projects/:id/services/jenkins-deprecated
-```
-
-### Get Jenkins CI (Deprecated) service settings
-
-Get Jenkins CI (Deprecated) service settings for a project.
-
-```plaintext
-GET /projects/:id/services/jenkins-deprecated
-```
-
-## MockCI
-
-Mock an external CI. See [`gitlab-org/gitlab-mock-ci-service`](https://gitlab.com/gitlab-org/gitlab-mock-ci-service) for an example of a companion mock service.
-
-This service is only available when your environment is set to development.
-
-### Create/Edit MockCI service
-
-Set MockCI service for a project.
-
-```plaintext
-PUT /projects/:id/services/mock-ci
-```
-
-Parameters:
-
-| Parameter | Type | Required | Description |
-| --------- | ---- | -------- | ----------- |
-| `mock_service_url` | string | true | `http://localhost:4004` |
-
-### Delete MockCI service
-
-Delete MockCI service for a project.
-
-```plaintext
-DELETE /projects/:id/services/mock-ci
-```
-
-### Get MockCI service settings
-
-Get MockCI service settings for a project.
-
-```plaintext
-GET /projects/:id/services/mock-ci
-```
-
-## YouTrack
-
-YouTrack issue tracker
-
-### Create/Edit YouTrack service
-
-Set YouTrack service for a project.
-
-```plaintext
-PUT /projects/:id/services/youtrack
-```
-
-Parameters:
-
-| Parameter | Type | Required | Description |
-| --------- | ---- | -------- | ----------- |
-| `issues_url` | string | true | Issue URL |
-| `project_url` | string | true | Project URL |
-| `description` | string | false | Description |
-| `push_events` | boolean | false | Enable notifications for push events |
-
-### Delete YouTrack Service
-
-Delete YouTrack service for a project.
-
-```plaintext
-DELETE /projects/:id/services/youtrack
-```
-
-### Get YouTrack Service Settings
-
-Get YouTrack service settings for a project.
-
-```plaintext
-GET /projects/:id/services/youtrack
-```
+<!-- This redirect file can be deleted after <2021-11-09>. -->
+<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/#move-or-rename-a-page -->
diff --git a/doc/api/settings.md b/doc/api/settings.md
index 6b1faa0402f..7b8778973f2 100644
--- a/doc/api/settings.md
+++ b/doc/api/settings.md
@@ -248,7 +248,7 @@ listed in the descriptions of the relevant settings.
| `deactivate_dormant_users` | boolean | no | Enable [automatic deactivation of dormant users](../user/admin_area/moderate_users.md#automatically-deactivate-dormant-users). |
| `default_artifacts_expire_in` | string | no | Set the default expiration time for each job's artifacts. |
| `default_branch_name` | string | no | [Instance-level custom initial branch name](../user/project/repository/branches/default.md#instance-level-custom-initial-branch-name) ([introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/225258) in GitLab 13.2). |
-| `default_branch_protection` | integer | no | Determine if developers can push to the default branch. Can take: `0` _(not protected, both developers and maintainers can push new commits, force push, or delete the branch)_, `1` _(partially protected, developers and maintainers can push new commits, but cannot force push, or delete, the branch)_ or `2` _(fully protected, developers cannot push new commits, but maintainers can; no-one can force push or delete the branch)_ as a parameter. Default is `2`. |
+| `default_branch_protection` | integer | no | Determine if developers can push to the default branch. Can take: `0` _(not protected, both developers and maintainers can push new commits and force push)_, `1` _(partially protected, developers and maintainers can push new commits, but cannot force push)_ or `2` _(fully protected, developers cannot push new commits, but maintainers can; no one can force push)_ as a parameter. Default is `2`. |
| `default_ci_config_path` | string | no | Default CI/CD configuration file and path for new projects (`.gitlab-ci.yml` if not set). |
| `default_group_visibility` | string | no | What visibility level new groups receive. Can take `private`, `internal` and `public` as a parameter. Default is `private`. |
| `default_project_creation` | integer | no | Default project creation protection. Can take: `0` _(No one)_, `1` _(Maintainers)_ or `2` _(Developers + Maintainers)_|
@@ -407,6 +407,7 @@ listed in the descriptions of the relevant settings.
| `spam_check_endpoint_enabled` | boolean | no | Enables Spam Check via external API endpoint. Default is `false`. |
| `spam_check_endpoint_url` | string | no | URL of the external Spam Check service endpoint. |
| `spam_check_api_key` | string | no | The API key used by GitLab for accessing the Spam Check service endpoint. |
+| `suggest_pipeline_enabled` | boolean | no | Enable pipeline suggestion banner. |
| `terminal_max_session_time` | integer | no | Maximum time for web terminal websocket connection (in seconds). Set to `0` for unlimited time. |
| `terms` | text | required by: `enforce_terms` | (**Required by:** `enforce_terms`) Markdown content for the ToS. |
| `throttle_authenticated_api_enabled` | boolean | no | (**If enabled, requires:** `throttle_authenticated_api_period_in_seconds` and `throttle_authenticated_api_requests_per_period`) Enable authenticated API request rate limit. Helps reduce request volume (for example, from crawlers or abusive bots). |
diff --git a/doc/api/snippet_repository_storage_moves.md b/doc/api/snippet_repository_storage_moves.md
index a73542c8505..81473fdff91 100644
--- a/doc/api/snippet_repository_storage_moves.md
+++ b/doc/api/snippet_repository_storage_moves.md
@@ -10,7 +10,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
-[migrating to Gitaly Cluster](../administration/gitaly/index.md#migrate-to-gitaly-cluster), for
+[migrating to Gitaly Cluster](../administration/gitaly/index.md#migrating-to-gitaly-cluster), for
example.
As snippet repository storage moves are processed, they transition through different states. Values
diff --git a/doc/api/usage_data.md b/doc/api/usage_data.md
index f244c681086..4809166f357 100644
--- a/doc/api/usage_data.md
+++ b/doc/api/usage_data.md
@@ -13,7 +13,7 @@ The Service Data API is associated with [Service Ping](../development/service_pi
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/57270) in GitLab 13.11.
-Export all metric definitions as a single YAML file, similar to the [Metrics Dictionary](https://gitlab-org.gitlab.io/growth/product-intelligence/metric-dictionary), for easier importing.
+Export all metric definitions as a single YAML file, similar to the [Metrics Dictionary](https://metrics.gitlab.com/index.html), for easier importing.
```plaintext
GET /usage_data/metric_definitions
diff --git a/doc/api/users.md b/doc/api/users.md
index 4ec609e62e9..d8effc4d38f 100644
--- a/doc/api/users.md
+++ b/doc/api/users.md
@@ -987,7 +987,7 @@ error occurs a `400 Bad Request` is returned with a message explaining the error
## Add SSH key for user
-Create new key owned by specified user. Available only for admin
+Create new key owned by specified user. Available only for administrator.
```plaintext
POST /users/:id/keys
@@ -1018,7 +1018,7 @@ Parameters:
## Delete SSH key for given user
-Deletes key owned by a specified user. Available only for admin.
+Deletes key owned by a specified user. Available only for administrator.
```plaintext
DELETE /users/:id/keys/:key_id
@@ -1165,7 +1165,7 @@ Example response:
## Get a specific GPG key for a given user
Get a specific GPG key for a given user. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/43693)
-in GitLab 13.5, this endpoint can be accessed without admin authentication.
+in GitLab 13.5, this endpoint can be accessed without administrator authentication.
```plaintext
GET /users/:id/gpg_keys/:key_id
@@ -1194,7 +1194,7 @@ Example response:
## Add a GPG key for a given user
-Create new GPG key owned by the specified user. Available only for admins.
+Create new GPG key owned by the specified user. Available only for administrator.
```plaintext
POST /users/:id/gpg_keys
@@ -1226,7 +1226,7 @@ Example response:
## Delete a GPG key for a given user
-Delete a GPG key owned by a specified user. Available only for admins.
+Delete a GPG key owned by a specified user. Available only for administrator.
```plaintext
DELETE /users/:id/gpg_keys/:key_id
@@ -1276,7 +1276,7 @@ Parameters:
## List emails for user
-Get a list of a specified user's emails. Available only for admin
+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
@@ -1345,7 +1345,7 @@ error occurs a `400 Bad Request` is returned with a message explaining the error
## Add email for user
-Create new email owned by specified user. Available only for admin
+Create new email owned by specified user. Available only for administrator
```plaintext
POST /users/:id/emails
@@ -1372,7 +1372,7 @@ Parameters:
## Delete email for given user
-Deletes email owned by a specified user. Available only for admin.
+Deletes email owned by a specified user. Available only for administrator.
```plaintext
DELETE /users/:id/emails/:email_id
@@ -1385,7 +1385,7 @@ Parameters:
## Block user
-Blocks the specified user. Available only for admin.
+Blocks the specified user. Available only for administrator.
```plaintext
POST /users/:id/block
@@ -1405,7 +1405,7 @@ Returns:
## Unblock user
-Unblocks the specified user. Available only for admin.
+Unblocks the specified user. Available only for administrator.
```plaintext
POST /users/:id/unblock
@@ -1422,7 +1422,7 @@ Returns `201 OK` on success, `404 User Not Found` is user cannot be found or
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/22257) in GitLab 12.4.
-Deactivates the specified user. Available only for admin.
+Deactivates the specified user. Available only for administrator.
```plaintext
POST /users/:id/deactivate
@@ -1437,7 +1437,7 @@ Returns:
- `201 OK` on success.
- `404 User Not Found` if user cannot be found.
- `403 Forbidden` when trying to deactivate a user:
- - Blocked by admin or by LDAP synchronization.
+ - Blocked by administrator or by LDAP synchronization.
- That has any activity in past 90 days. These users cannot be deactivated.
- That is internal.
@@ -1445,7 +1445,7 @@ Returns:
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/22257) in GitLab 12.4.
-Activates the specified user. Available only for admin.
+Activates the specified user. Available only for administrator.
```plaintext
POST /users/:id/activate
@@ -1465,7 +1465,7 @@ Returns:
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/327354) in GitLab 14.3.
-Bans the specified user. Available only for admin.
+Bans the specified user. Available only for administrator.
```plaintext
POST /users/:id/ban
@@ -1485,7 +1485,7 @@ Returns:
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/327354) in GitLab 14.3.
-Unbans the specified user. Available only for admin.
+Unbans the specified user. Available only for administrator.
```plaintext
POST /users/:id/unban
@@ -1507,7 +1507,7 @@ Please refer to the [Events API documentation](events.md#get-user-contribution-e
## Get all impersonation tokens of a user
-> Requires admin permissions.
+> Requires administrator permissions.
It retrieves every impersonation token of the user. Use the pagination
parameters `page` and `per_page` to restrict the list of impersonation tokens.
@@ -1639,7 +1639,7 @@ Example Responses:
## Get an impersonation token of a user
-> Requires admin permissions.
+> Requires administrators permissions.
It shows a user's impersonation token.
@@ -1678,7 +1678,7 @@ Example response:
## Create an impersonation token
-> Requires admin permissions.
+> Requires administrator permissions.
> Token values are returned once. Make sure you save it - you can't access it again.
It creates a new impersonation token. Only administrators can do this.
@@ -1723,7 +1723,7 @@ Example response:
## Revoke an impersonation token
-> Requires admin permissions.
+> Requires administrator permissions.
It revokes an impersonation token.
@@ -1845,7 +1845,7 @@ Example response:
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/20532) in GitLab 12.8.
-Lists all projects and groups a user is a member of. This endpoint is available for admins only.
+Lists all projects and groups a user is a member of. This endpoint is available for administrators only.
It returns the `source_id`, `source_name`, `source_type` and `access_level` of a membership.
Source can be of type `Namespace` (representing a group) or `Project`. The response represents only direct memberships. Inherited memberships, for example in subgroups, are not included.
Access levels are represented by an integer value. For more details, read about the meaning of [access level values](access_requests.md#valid-access-levels).
@@ -1865,7 +1865,7 @@ Returns:
- `200 OK` on success.
- `404 User Not Found` if user can't be found.
-- `403 Forbidden` when not requested by an admin.
+- `403 Forbidden` when not requested by an administrator.
- `400 Bad Request` when requested type is not supported.
```shell
diff --git a/doc/api/version.md b/doc/api/version.md
index b076993f00e..80269bc5697 100644
--- a/doc/api/version.md
+++ b/doc/api/version.md
@@ -6,8 +6,6 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# Version API **(FREE)**
-> Introduced in GitLab 8.13.
-
Retrieve version information for this GitLab instance. Responds `200 OK` for
authenticated users.
diff --git a/doc/api/vulnerability_findings.md b/doc/api/vulnerability_findings.md
index dfc6074a1aa..36604ebf87d 100644
--- a/doc/api/vulnerability_findings.md
+++ b/doc/api/vulnerability_findings.md
@@ -74,77 +74,66 @@ Example response:
[
{
"id": null,
- "report_type": "dependency_scanning",
- "name": "Authentication bypass via incorrect DOM traversal and canonicalization in saml2-js",
- "severity": "unknown",
- "confidence": "undefined",
+ "report_type": "sast",
+ "name": "Possible command injection",
+ "severity": "high",
+ "confidence": "high",
"scanner": {
- "external_id": "gemnasium",
- "name": "Gemnasium"
+ "external_id": "brakeman",
+ "name": "Brakeman",
+ "vendor": "GitLab"
},
"identifiers": [
{
- "external_type": "gemnasium",
- "external_id": "9952e574-7b5b-46fa-a270-aeb694198a98",
- "name": "Gemnasium-9952e574-7b5b-46fa-a270-aeb694198a98",
- "url": "https://deps.sec.gitlab.com/packages/npm/saml2-js/versions/1.5.0/advisories"
- },
- {
- "external_type": "cve",
- "external_id": "CVE-2017-11429",
- "name": "CVE-2017-11429",
- "url": "https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2017-11429"
+ "external_type": "brakeman_warning_code",
+ "external_id": "14",
+ "name": "Brakeman Warning Code 14",
+ "url": "https://brakemanscanner.org/docs/warning_types/command_injection/"
}
],
- "project_fingerprint": "fa6f5b6c5d240b834ac5e901dc69f9484cef89ec",
- "uuid": "31f483bc-bfc0-586d-9b92-f1015c4535b8",
- "create_vulnerability_feedback_issue_path": "/tests/yarn-remediation-test/vulnerability_feedback",
- "create_vulnerability_feedback_merge_request_path": "/tests/yarn-remediation-test/vulnerability_feedback",
- "create_vulnerability_feedback_dismissal_path": "/tests/yarn-remediation-test/vulnerability_feedback",
+ "project_fingerprint": "ac218b1770af030cfeef967752ab803c55afb36d",
+ "uuid": "ad5e3be3-a193-55f5-a200-bc12865fb09c",
+ "create_jira_issue_url": null,
+ "false_positive": true,
+ "create_vulnerability_feedback_issue_path": "/root/test-false-positive/-/vulnerability_feedback",
+ "create_vulnerability_feedback_merge_request_path": "/root/test-false-positive/-/vulnerability_feedback",
+ "create_vulnerability_feedback_dismissal_path": "/root/test-false-positive/-/vulnerability_feedback",
"project": {
- "id": 31,
- "name": "yarn-remediation-test",
- "full_path": "/tests/yarn-remediation-test",
- "full_name": "tests / yarn-remediation-test"
+ "id": 2,
+ "name": "Test False Positive",
+ "full_path": "/root/test-false-positive",
+ "full_name": "Administrator / Test False Positive"
},
"dismissal_feedback": null,
"issue_feedback": null,
"merge_request_feedback": null,
- "description": "Some XML DOM traversal and canonicalization APIs may be inconsistent in handling of comments within XML nodes. Incorrect use of these APIs by some SAML libraries results in incorrect parsing of the inner text of XML nodes such that any inner text after the comment is lost prior to cryptographically signing the SAML message. Text after the comment therefore has no impact on the signature on the SAML message.\r\n\r\nA remote attacker can modify SAML content for a SAML service provider without invalidating the cryptographic signature, which may allow attackers to bypass primary authentication for the affected SAML service provider.",
- "links": [
- {
- "url": "https://github.com/Clever/saml2/commit/3546cb61fd541f219abda364c5b919633609ef3d#diff-af730f9f738de1c9ad87596df3f6de84R279"
- },
- {
- "url": "https://www.kb.cert.org/vuls/id/475445"
- },
- {
- "url": "https://github.com/Clever/saml2/issues/127"
- }
- ],
+ "description": null,
+ "links": [],
"location": {
- "file": "yarn.lock",
- "dependency": {
- "package": {
- "name": "saml2-js"
- },
- "version": "1.5.0"
- }
+ "file": "app/controllers/users_controller.rb",
+ "start_line": 42,
+ "class": "UsersController",
+ "method": "list_users"
},
- "details": {
- "custom_field": {
- "name": "URLs",
- "type": "list",
- "items": [
- {
- "type": "url",
- "href": "http://site.com/page/1"
- }
- ]
- }
+ "remediations": [
+ null
+ ],
+ "solution": null,
+ "evidence": null,
+ "request": null,
+ "response": null,
+ "evidence_source": null,
+ "supporting_messages": [],
+ "assets": [],
+ "details": {},
+ "state": "detected",
+ "scan": {
+ "type": "sast",
+ "status": "success",
+ "start_time": "2021-09-02T20:55:48",
+ "end_time": "2021-09-02T20:55:48"
},
- "solution": "Upgrade to fixed version.\r\n",
- "blob_path": "/tests/yarn-remediation-test/blob/cc6c4a0778460455ae5d16ca7025ca9ca1ca75ac/yarn.lock"
+ "blob_path": "/root/test-false-positive/-/blob/dfd75607752a839bbc9c7362d111effaa470fecd/app/controllers/users_controller.rb#L42"
}
]
```
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 095eaaec23f..82529a4c199 100644
--- a/doc/architecture/blueprints/composable_codebase_using_rails_engines/index.md
+++ b/doc/architecture/blueprints/composable_codebase_using_rails_engines/index.md
@@ -495,8 +495,8 @@ Pros:
Cons:
- It is harder to implement GraphQL subscriptions as in case of Sidekiq as we need another way to pass subscriptions
-- `api_v4` paths can be used in some services that are used by Sidekiq (e.g. `api_v4_projects_path`)
-- url_helpers paths are used in models and services, that could be used by Sidekiq (e.g. `Gitlab::Routing.url_helpers.project_pipelines_path` is used by [ExpirePipelineCacheService](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/services/ci/expire_pipeline_cache_service.rb#L20) in [ExpirePipelineCacheWorker](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/workers/expire_pipeline_cache_worker.rb#L18))
+- `api_v4` paths can be used in some services that are used by Sidekiq (for example `api_v4_projects_path`)
+- url_helpers paths are used in models and services, that could be used by Sidekiq (for example `Gitlab::Routing.url_helpers.project_pipelines_path` is used by [ExpirePipelineCacheService](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/services/ci/expire_pipeline_cache_service.rb#L20) in [ExpirePipelineCacheWorker](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/workers/expire_pipeline_cache_worker.rb#L18))
#### Example: GraphQL
@@ -514,7 +514,7 @@ Today, loading GraphQL requires a bunch of [dependencies](https://gitlab.com/git
GraphQL only needs to run in a specific context. If we could limit when it is being loaded we could effectively improve application efficiency, by reducing application load time and required memory. This, for example, is applicable for every size installation.
-A potential challenge with GraphQL and Websockets is that at some point we might want to use Action Cable subscriptions and push GraphQL/API payload from Sidekiq to clients. This would likely utilize Redis to pass data through. Where Sidekiq would publish information on Redis and ActionCable Node would pass through that information to connected clients. This way of working is possible in the above model, but we would have to use GraphQL or API (over HTTP endpoint) to calculate what should be sent.
+A potential challenge with GraphQL and Websockets is that at some point we might want to use Action Cable subscriptions and push GraphQL/API payload from Sidekiq to clients. This would likely use Redis to pass data through. Where Sidekiq would publish information on Redis and ActionCable Node would pass through that information to connected clients. This way of working is possible in the above model, but we would have to use GraphQL or API (over HTTP endpoint) to calculate what should be sent.
An alternative way is to use a notification system that would always make an `ActionCable` node (the one handling WebSockets) generate a payload based on a send query instead of performing passthrough. This could be applicable since `ActionCable` is the one handling a given connection for a client. This could have a downside of having to recalculate the same payload if many clients would be watching the same resource. However, this behavior of system might still be desired for security purposes, as generated payload might be dependent on permission of watching client (we would show different for anonymous, and different for the member of the project).
@@ -529,8 +529,8 @@ Grape::API is another example that only needs to run only in a web server contex
Potential challenges with Grape API:
-- Currently there are some API::API dependencies in the models (e.g. `API::Helpers::Version` dependency in [project model](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/models/project.rb#L2019) or API::API dependency in GeoNode model for [`geo_retrieve_url`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/app/models/geo_node.rb#L183))
-- `api_v4` paths are used in helpers, presenters, and views (e.g. `api_v4_projects_path` in [PackagesHelper](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/helpers/packages_helper.rb#L17))
+- Currently there are some API::API dependencies in the models (for example `API::Helpers::Version` dependency in [project model](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/models/project.rb#L2019) or API::API dependency in GeoNode model for [`geo_retrieve_url`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/app/models/geo_node.rb#L183))
+- `api_v4` paths are used in helpers, presenters, and views (for example `api_v4_projects_path` in [PackagesHelper](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/helpers/packages_helper.rb#L17))
#### Example: Controllers
@@ -544,7 +544,7 @@ Controllers, Serializers, some presenters and some of the Grape:Entities are als
Potential challenges with moving Controllers:
- We needed to extend `Gitlab::Patch::DrawRoute` in order to support `engines/web_engine/config/routes` and `engines/web_engine/ee/config/routes` in case when `web_engine` is loaded. Here is potential [solution](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/53720#note_506957398).
-- `Gitlab::Routing.url_helpers` paths are used in models and services, that could be used by Sidekiq (e.g. `Gitlab::Routing.url_helpers.project_pipelines_path` is used by [ExpirePipelineCacheService](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/services/ci/expire_pipeline_cache_service.rb#L20) in [ExpirePipelineCacheWorker](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/workers/expire_pipeline_cache_worker.rb#L18)))
+- `Gitlab::Routing.url_helpers` paths are used in models and services, that could be used by Sidekiq (for example `Gitlab::Routing.url_helpers.project_pipelines_path` is used by [ExpirePipelineCacheService](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/services/ci/expire_pipeline_cache_service.rb#L20) in [ExpirePipelineCacheWorker](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/workers/expire_pipeline_cache_worker.rb#L18)))
### Packwerk
diff --git a/doc/architecture/blueprints/consolidating_groups_and_projects/index.md b/doc/architecture/blueprints/consolidating_groups_and_projects/index.md
index fab886808e2..a8d87e5f967 100644
--- a/doc/architecture/blueprints/consolidating_groups_and_projects/index.md
+++ b/doc/architecture/blueprints/consolidating_groups_and_projects/index.md
@@ -32,7 +32,7 @@ they all live on their own. A few more problems with this approach:
- Features are coupled to their container. In practice it is not straight
forward to decouple a feature from its container. The degree of coupling
varies across features.
-- Naive duplication of features will result in a more complex and fragile code base.
+- Naive duplication of features will result in a more complex and fragile codebase.
- Generalizing solutions across groups and projects may degrade system performance.
- The range of features span across many teams, and these changes will need to
manage development interference.
diff --git a/doc/ci/README.md b/doc/ci/README.md
deleted file mode 100644
index 0e6c2f63f9e..00000000000
--- a/doc/ci/README.md
+++ /dev/null
@@ -1,9 +0,0 @@
----
-redirect_to: 'index.md'
-remove_date: '2021-09-28'
----
-
-This document was moved to [another location](index.md).
-
-<!-- This redirect file can be deleted after 2021-09-28. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/#move-or-rename-a-page -->
diff --git a/doc/ci/chatops/index.md b/doc/ci/chatops/index.md
index a2d9cf9054d..698b467a813 100644
--- a/doc/ci/chatops/index.md
+++ b/doc/ci/chatops/index.md
@@ -9,6 +9,7 @@ type: index, concepts, howto
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/4466) in GitLab Ultimate 10.6.
> - [Moved](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/24780) to GitLab Free in 11.9.
+> - `CHAT_USER_ID` was [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/341798) in GitLab 14.4.
GitLab ChatOps provides a method to interact with CI/CD jobs through chat services
like Slack. Many organizations' discussion, collaboration, and troubleshooting takes
@@ -17,7 +18,7 @@ posted back to the channel can significantly augment your team's workflow.
## How GitLab ChatOps works
-GitLab ChatOps is built upon [GitLab CI/CD](../README.md) and
+GitLab ChatOps is built upon [GitLab CI/CD](../index.md) and
[Slack Slash Commands](../../user/project/integrations/slack_slash_commands.md).
ChatOps provides a `run` action for [slash commands](../../integration/slash_commands.md)
with the following arguments:
@@ -30,6 +31,7 @@ to the job:
- `CHAT_INPUT` contains any additional arguments.
- `CHAT_CHANNEL` is set to the name of channel the action was triggered in.
+- `CHAT_USER_ID` is set to the chat service's user ID of the user who triggered the slash command.
When executed, ChatOps looks up the specified job name and attempts to match it
to a corresponding job in [`.gitlab-ci.yml`](../yaml/index.md). If a matching job
diff --git a/doc/ci/ci_cd_for_external_repos/bitbucket_integration.md b/doc/ci/ci_cd_for_external_repos/bitbucket_integration.md
index e69daf6651a..cf4e846ebb4 100644
--- a/doc/ci/ci_cd_for_external_repos/bitbucket_integration.md
+++ b/doc/ci/ci_cd_for_external_repos/bitbucket_integration.md
@@ -21,7 +21,7 @@ To use GitLab CI/CD with a Bitbucket Cloud repository:
![Create project](img/external_repository.png)
- GitLab imports the repository and enables [Pull Mirroring](../../user/project/repository/repository_mirroring.md#pull-from-a-remote-repository).
+ GitLab imports the repository and enables [Pull Mirroring](../../user/project/repository/mirror/pull.md).
1. In GitLab, create a
[Personal Access Token](../../user/profile/personal_access_tokens.md)
diff --git a/doc/ci/ci_cd_for_external_repos/github_integration.md b/doc/ci/ci_cd_for_external_repos/github_integration.md
index 70a9c8fc775..4e4b7420697 100644
--- a/doc/ci/ci_cd_for_external_repos/github_integration.md
+++ b/doc/ci/ci_cd_for_external_repos/github_integration.md
@@ -45,7 +45,7 @@ repositories:
GitLab:
1. Imports the project.
-1. Enables [Pull Mirroring](../../user/project/repository/repository_mirroring.md#pull-from-a-remote-repository).
+1. Enables [Pull Mirroring](../../user/project/repository/mirror/pull.md).
1. Enables [GitHub project integration](../../user/project/integrations/github.md).
1. Creates a web hook on GitHub to notify GitLab of new commits.
diff --git a/doc/ci/ci_cd_for_external_repos/index.md b/doc/ci/ci_cd_for_external_repos/index.md
index 365e2ee31de..fbfcdcbf64f 100644
--- a/doc/ci/ci_cd_for_external_repos/index.md
+++ b/doc/ci/ci_cd_for_external_repos/index.md
@@ -18,7 +18,7 @@ GitLab CI/CD can be used with:
Instead of moving your entire project to GitLab, you can connect your
external repository to get the benefits of GitLab CI/CD.
-Connecting an external repository sets up [repository mirroring](../../user/project/repository/repository_mirroring.md)
+Connecting an external repository sets up [repository mirroring](../../user/project/repository/mirror/index.md)
and create a lightweight project with issues, merge requests, wiki, and
snippets disabled. These features
[can be re-enabled later](../../user/project/settings/index.md#sharing-and-permissions).
diff --git a/doc/ci/cloud_deployment/index.md b/doc/ci/cloud_deployment/index.md
index 25b87366a30..408d68fb726 100644
--- a/doc/ci/cloud_deployment/index.md
+++ b/doc/ci/cloud_deployment/index.md
@@ -58,6 +58,9 @@ Some credentials are required to be able to run `aws` commands:
| `AWS_SECRET_ACCESS_KEY` | Your Secret access key |
| `AWS_DEFAULT_REGION` | Your region code |
+ NOTE:
+ When you create a variable it's set to be [protected by default](../variables/index.md#protect-a-cicd-variable). If you want to use the `aws` commands on branches or tags that are not protected, make sure to uncheck the **Protect variable** checkbox.
+
1. You can now use `aws` commands in the `.gitlab-ci.yml` file of this project:
```yaml
diff --git a/doc/ci/docker/using_docker_build.md b/doc/ci/docker/using_docker_build.md
index d5adedc611c..9a4290ead4c 100644
--- a/doc/ci/docker/using_docker_build.md
+++ b/doc/ci/docker/using_docker_build.md
@@ -572,7 +572,7 @@ The configuration is picked up by the `dind` service.
## Authenticate with registry in Docker-in-Docker
When you use Docker-in-Docker, the
-[standard authentication methods](using_docker_images.md#define-an-image-from-a-private-container-registry)
+[standard authentication methods](using_docker_images.md#access-an-image-from-a-private-container-registry)
don't work because a fresh Docker daemon is started with the service.
### Option 1: Run `docker login`
diff --git a/doc/ci/docker/using_docker_images.md b/doc/ci/docker/using_docker_images.md
index c2991ce66f9..79c23d73a68 100644
--- a/doc/ci/docker/using_docker_images.md
+++ b/doc/ci/docker/using_docker_images.md
@@ -214,7 +214,7 @@ Look for the `[runners.docker]` section:
The image and services defined this way are added to all jobs run by
that runner.
-## Define an image from a private Container Registry
+## Access an image from a private Container Registry
To access private container registries, the GitLab Runner process can use:
@@ -224,19 +224,12 @@ To access private container registries, the GitLab Runner process can use:
To define which option should be used, the runner process reads the configuration in this order:
-- A `DOCKER_AUTH_CONFIG` variable provided as either:
- - A [CI/CD variable](../variables/index.md) in the `.gitlab-ci.yml` file.
- - A project's variables stored on the project's **Settings > CI/CD** page.
-- A `DOCKER_AUTH_CONFIG` variable provided as environment variable in the runner's `config.toml` file.
+- A `DOCKER_AUTH_CONFIG` [CI/CD variable](../variables/index.md).
+- A `DOCKER_AUTH_CONFIG` environment variable set in the runner's `config.toml` file.
- A `config.json` file in `$HOME/.docker` directory of the user running the process.
If the `--user` flag is provided to run the child processes as unprivileged user,
the home directory of the main runner process user is used.
-The runner reads this configuration **only** from the `config.toml` file and ignores it if
-it's provided as a CI/CD variable. This is because the runner uses **only**
-`config.toml` configuration and does not interpolate **any** CI/CD variables at
-runtime.
-
### Requirements and limitations
- Available for [Kubernetes executor](https://docs.gitlab.com/runner/executors/kubernetes.html)
@@ -253,9 +246,9 @@ private registry. Both require setting the CI/CD variable
`DOCKER_AUTH_CONFIG` with appropriate authentication information.
1. Per-job: To configure one job to access a private registry, add
- `DOCKER_AUTH_CONFIG` as a job variable.
+ `DOCKER_AUTH_CONFIG` as a [CI/CD variable](../variables/index.md).
1. Per-runner: To configure a runner so all its jobs can access a
- private registry, add `DOCKER_AUTH_CONFIG` to the environment in the
+ private registry, add `DOCKER_AUTH_CONFIG` as an environment variable in the
runner's configuration.
See below for examples of each.
@@ -274,7 +267,7 @@ Let's also assume that these are the sign-in credentials:
| username | `my_username` |
| password | `my_password` |
-Use one of the following methods to determine the value of `DOCKER_AUTH_CONFIG`:
+Use one of the following methods to determine the value for `DOCKER_AUTH_CONFIG`:
- Do a `docker login` on your local machine:
diff --git a/doc/ci/docker/using_kaniko.md b/doc/ci/docker/using_kaniko.md
index 6886899a54b..69c4557dcbe 100644
--- a/doc/ci/docker/using_kaniko.md
+++ b/doc/ci/docker/using_kaniko.md
@@ -13,8 +13,8 @@ type: howto
container images from a Dockerfile, inside a container or Kubernetes cluster.
kaniko solves two problems with using the
-[Docker-in-Docker
-build](using_docker_build.md#use-the-docker-executor-with-the-docker-image-docker-in-docker) method:
+[Docker-in-Docker build](using_docker_build.md#use-the-docker-executor-with-the-docker-image-docker-in-docker)
+method:
- Docker-in-Docker requires [privileged mode](https://docs.docker.com/engine/reference/run/#runtime-privilege-and-linux-capabilities)
to function, which is a significant security concern.
@@ -64,7 +64,7 @@ build:
entrypoint: [""]
script:
- mkdir -p /kaniko/.docker
- - echo "{\"auths\":{\"$CI_REGISTRY\":{\"auth\":\"$(echo -n ${CI_REGISTRY_USER}:${CI_REGISTRY_PASSWORD} | base64)\"}}}" > /kaniko/.docker/config.json
+ - echo "{\"auths\":{\"$CI_REGISTRY\":{\"auth\":\"$(echo -n ${CI_REGISTRY_USER}:${CI_REGISTRY_PASSWORD} | base64 | tr -d '\n')\"}}}" > /kaniko/.docker/config.json
- /kaniko/executor --context $CI_PROJECT_DIR --dockerfile $CI_PROJECT_DIR/Dockerfile --destination $CI_REGISTRY_IMAGE:$CI_COMMIT_TAG
rules:
- if: $CI_COMMIT_TAG
@@ -91,7 +91,7 @@ build:
- mkdir -p /kaniko/.docker
- |-
KANIKOPROXYBUILDARGS=""
- KANIKOCFG="{\"auths\":{\"$CI_REGISTRY\":{\"auth\":\"$(echo -n ${CI_REGISTRY_USER}:${CI_REGISTRY_PASSWORD} | base64)\"}}}"
+ KANIKOCFG="{\"auths\":{\"$CI_REGISTRY\":{\"auth\":\"$(echo -n ${CI_REGISTRY_USER}:${CI_REGISTRY_PASSWORD} | base64 | tr -d '\n')\"}}}"
if [ "x${http_proxy}" != "x" -o "x${https_proxy}" != "x" ]; then
KANIKOCFG="${KANIKOCFG}, \"proxies\": { \"default\": { \"httpProxy\": \"${http_proxy}\", \"httpsProxy\": \"${https_proxy}\", \"noProxy\": \"${no_proxy}\"}}"
KANIKOPROXYBUILDARGS="--build-arg http_proxy=${http_proxy} --build-arg https_proxy=${https_proxy} --build-arg no_proxy=${no_proxy}"
@@ -120,7 +120,7 @@ store:
```yaml
before_script:
- mkdir -p /kaniko/.docker
- - echo "{\"auths\":{\"$CI_REGISTRY\":{\"auth\":\"$(echo -n ${CI_REGISTRY_USER}:${CI_REGISTRY_PASSWORD} | base64)\"}}}" > /kaniko/.docker/config.json
+ - echo "{\"auths\":{\"$CI_REGISTRY\":{\"auth\":\"$(echo -n ${CI_REGISTRY_USER}:${CI_REGISTRY_PASSWORD} | base64 | tr -d '\n')\"}}}" > /kaniko/.docker/config.json
- |
echo "-----BEGIN CERTIFICATE-----
...
diff --git a/doc/ci/environments/deployment_safety.md b/doc/ci/environments/deployment_safety.md
index 1b34b520007..78f30b29e06 100644
--- a/doc/ci/environments/deployment_safety.md
+++ b/doc/ci/environments/deployment_safety.md
@@ -60,7 +60,7 @@ The improved pipeline flow **after** using the resource group:
1. `deploy` job in Pipeline-A finishes.
1. `deploy` job in Pipeline-B starts running.
-For more information, see [`resource_group` keyword in `.gitlab-ci.yml`](../yaml/index.md#resource_group).
+For more information, see [Resource Group documentation](../resource_groups/index.md).
## Skip outdated deployment jobs
diff --git a/doc/ci/environments/img/environments_list.png b/doc/ci/environments/img/environments_list.png
deleted file mode 100644
index 6ddfd858ab6..00000000000
--- a/doc/ci/environments/img/environments_list.png
+++ /dev/null
Binary files differ
diff --git a/doc/ci/environments/img/environments_list_v14_3.png b/doc/ci/environments/img/environments_list_v14_3.png
new file mode 100644
index 00000000000..8fdb85338e7
--- /dev/null
+++ b/doc/ci/environments/img/environments_list_v14_3.png
Binary files differ
diff --git a/doc/ci/environments/img/environments_terminal_button_on_index_v13_10.png b/doc/ci/environments/img/environments_terminal_button_on_index_v13_10.png
deleted file mode 100644
index 4a9a4e65d00..00000000000
--- a/doc/ci/environments/img/environments_terminal_button_on_index_v13_10.png
+++ /dev/null
Binary files differ
diff --git a/doc/ci/environments/img/environments_terminal_button_on_index_v14_3.png b/doc/ci/environments/img/environments_terminal_button_on_index_v14_3.png
new file mode 100644
index 00000000000..d1faf489277
--- /dev/null
+++ b/doc/ci/environments/img/environments_terminal_button_on_index_v14_3.png
Binary files differ
diff --git a/doc/ci/environments/index.md b/doc/ci/environments/index.md
index 6bac004fcdf..ca81ad30317 100644
--- a/doc/ci/environments/index.md
+++ b/doc/ci/environments/index.md
@@ -19,7 +19,7 @@ GitLab:
- Tracks your deployments, so you always know what is deployed on your
servers.
-If you have a deployment service like [Kubernetes](../../user/project/clusters/index.md)
+If you have a deployment service like [Kubernetes](../../user/infrastructure/clusters/index.md)
associated with your project, you can use it to assist with your deployments.
You can even access a [web terminal](#web-terminals) for your environment from within GitLab.
@@ -35,7 +35,7 @@ To view a list of environments and deployments:
1. On the left sidebar, select **Deployments > Environments**.
The environments are displayed.
- ![Environments list](img/environments_list.png)
+ ![Environments list](img/environments_list_v14_3.png)
1. To view a list of deployments for an environment, select the environment name,
for example, `staging`.
@@ -175,13 +175,13 @@ You can find the play button in the pipelines, environments, deployments, and jo
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/27630) in GitLab 12.6.
-If you are deploying to a [Kubernetes cluster](../../user/project/clusters/index.md)
+If you are deploying to a [Kubernetes cluster](../../user/infrastructure/clusters/index.md)
associated with your project, you can configure these deployments from your
`.gitlab-ci.yml` file.
NOTE:
Kubernetes configuration isn't supported for Kubernetes clusters that are
-[managed by GitLab](../../user/project/clusters/index.md#gitlab-managed-clusters).
+[managed by GitLab](../../user/project/clusters/gitlab_managed_clusters.md).
To follow progress on support for GitLab-managed clusters, see the
[relevant issue](https://gitlab.com/gitlab-org/gitlab/-/issues/38054).
@@ -634,7 +634,7 @@ Metric charts can be embedded in GitLab Flavored Markdown. See [Embedding Metric
### Web terminals
If you deploy to your environments with the help of a deployment service (for example,
-the [Kubernetes integration](../../user/project/clusters/index.md)), GitLab can open
+the [Kubernetes integration](../../user/infrastructure/clusters/index.md)), GitLab can open
a terminal session to your environment. You can then debug issues without leaving your web browser.
The Web terminal is a container-based deployment, which often lack basic tools (like an editor),
@@ -646,9 +646,9 @@ Web terminals:
- Are available to project Maintainers and Owners only.
- Must [be enabled](../../administration/integration/terminal.md).
-In the UI, you can view the Web terminal by selecting a **Terminal** button:
+In the UI, you can view the Web terminal by selecting **Terminal** from the actions menu:
-![Terminal button on environment index](img/environments_terminal_button_on_index_v13_10.png)
+![Terminal button on environment index](img/environments_terminal_button_on_index_v14_3.png)
You can also access the terminal button from the page for a specific environment:
@@ -816,3 +816,62 @@ To ensure the `action: stop` can always run when needed, you can:
action: stop
when: manual
```
+
+### A deployment job failed with "This job could not be executed because it would create an environment with an invalid parameter" error
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/21182) in GitLab 14.4.
+
+FLAG:
+On self-managed GitLab, by default this bug fix is not available. To make it available per project or for your entire instance, ask an administrator to [enable the `surface_environment_creation_failure` flag](../../administration/feature_flags.md). On GitLab.com, this bug fix is not available, but will be rolled out shortly.
+
+If your project is configured to [create a dynamic environment](#create-a-dynamic-environment),
+you might encounter this error because the dynamically generated parameter can't be used for creating an environment.
+
+For example, your project has the following `.gitlab-ci.yml`:
+
+```yaml
+deploy:
+ script: echo
+ environment: production/$ENVIRONMENT
+```
+
+Since `$ENVIRONMENT` variable does not exist in the pipeline, GitLab tries to
+create an environment with a name `production/`, which is invalid in
+[the environment name constraint](../yaml/index.md).
+
+To fix this, use one of the following solutions:
+
+- Remove `environment` keyword from the deployment job. GitLab has already been
+ ignoring the invalid keyword, therefore your deployment pipelines stay intact
+ even after the keyword removal.
+- Ensure the variable exists in the pipeline. Please note that there is
+ [a limitation on supported variables](../variables/where_variables_can_be_used.md#gitlab-ciyml-file).
+
+#### If you get this error on Review Apps
+
+For example, if you have the following in your `.gitlab-ci.yml`:
+
+```yaml
+review:
+ script: deploy review app
+ environment: review/$CI_COMMIT_REF_NAME
+```
+
+When you create a new merge request with a branch name `bug-fix!`,
+the `review` job tries to create an environment with `review/bug-fix!`.
+However, the `!` is an invalid character for environments, so the
+deployment job fails since it was about to run without an environment.
+
+To fix this, use one of the following solutions:
+
+- Re-create your feature branch without the invalid characters,
+ such as `bug-fix`.
+- Replace the `CI_COMMIT_REF_NAME`
+ [predefined variable](../variables/predefined_variables.md) with
+ `CI_COMMIT_REF_SLUG` which strips any invalid characters:
+
+ ```yaml
+ review:
+ script: deploy review app
+ environment: review/$CI_COMMIT_REF_SLUG
+ ```
diff --git a/doc/ci/environments/protected_environments.md b/doc/ci/environments/protected_environments.md
index b31e51b35fc..47f93b03136 100644
--- a/doc/ci/environments/protected_environments.md
+++ b/doc/ci/environments/protected_environments.md
@@ -2,26 +2,22 @@
stage: Release
group: Release
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
-type: concepts, howto
---
# Protected environments **(PREMIUM)**
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/6303) in GitLab 11.3.
+[Environments](../environments/index.md) can be used for both testing and
+production reasons.
-[Environments](../environments/index.md) can be used for different reasons:
+Because deploy jobs can be raised by different users with different roles, it's
+important to be able to protect specific environments from the effects of
+unauthorized users.
-- Some of them are just for testing.
-- Others are for production.
-
-Since deploy jobs can be raised by different users with different roles, it is important that
-specific environments are "protected" to prevent unauthorized people from affecting them.
-
-By default, a protected environment does one thing: it ensures that only people
-with the right privileges can deploy to it, thus keeping it safe.
+By default, a protected environment ensures that only people with the
+appropriate privileges can deploy to it, keeping the environment safe.
NOTE:
-A GitLab admin is always allowed to use environments, even if they are protected.
+GitLab administrators can use all environments, including protected environments.
To protect, update, or unprotect an environment, you need to have at least the
[Maintainer role](../../user/permissions.md).
@@ -157,9 +153,9 @@ For more information, see [Deployment safety](deployment_safety.md).
## Group-level protected environments
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/215888) in GitLab 14.0. [Deployed behind the `group_level_protected_environments` flag](../../administration/feature_flags.md), disabled by default.
-> - [Feature flag `group_level_protected_environments`](https://gitlab.com/gitlab-org/gitlab/-/issues/331085) removed in GitLab 14.3.
-> - [Generally Available](https://gitlab.com/gitlab-org/gitlab/-/issues/331085) on GitLab and on GitLab.com in 14.3.
+> - Introduced in GitLab 14.0 [with a flag](https://gitlab.com/gitlab-org/gitlab/-/issues/215888) named `group_level_protected_environments`. Disabled by default.
+> - [Feature flag removed](https://gitlab.com/gitlab-org/gitlab/-/issues/331085) in GitLab 14.3.
+> - [Generally available](https://gitlab.com/gitlab-org/gitlab/-/issues/331085) in GitLab 14.3.
Typically, large enterprise organizations have an explicit permission boundary
between [developers and operators](https://about.gitlab.com/topics/devops/).
@@ -210,8 +206,8 @@ configured:
(or above) to the top-level group. They can maintain CI/CD configurations for
the higher environments (such as production) in the group-level settings page,
which includes group-level protected environments,
- [group-level runners](../runners/runners_scope.md#group-runners),
- [group-level clusters](../../user/group/clusters/index.md), etc. Those
+ [group-level runners](../runners/runners_scope.md#group-runners), and
+ [group-level clusters](../../user/group/clusters/index.md). Those
configurations are inherited to the child projects as read-only entries.
This ensures that only operators can configure the organization-wide
deployment ruleset.
@@ -246,11 +242,11 @@ To protect a group-level environment:
1. Make sure your environments have the correct
[`deployment_tier`](index.md#deployment-tier-of-environments) defined in
`.gitlab-ci.yml`.
-1. Configure the group-level protected environments via the
+1. Configure the group-level protected environments by using the
[REST API](../../api/group_protected_environments.md).
NOTE:
-Configuration [via the UI](https://gitlab.com/gitlab-org/gitlab/-/issues/325249)
+Configuration [with the UI](https://gitlab.com/gitlab-org/gitlab/-/issues/325249)
is scheduled for a later release.
<!-- ## Troubleshooting
diff --git a/doc/ci/examples/README.md b/doc/ci/examples/README.md
deleted file mode 100644
index 0e6c2f63f9e..00000000000
--- a/doc/ci/examples/README.md
+++ /dev/null
@@ -1,9 +0,0 @@
----
-redirect_to: 'index.md'
-remove_date: '2021-09-28'
----
-
-This document was moved to [another location](index.md).
-
-<!-- This redirect file can be deleted after 2021-09-28. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/#move-or-rename-a-page -->
diff --git a/doc/ci/examples/deployment/README.md b/doc/ci/examples/deployment/README.md
deleted file mode 100644
index 0e6c2f63f9e..00000000000
--- a/doc/ci/examples/deployment/README.md
+++ /dev/null
@@ -1,9 +0,0 @@
----
-redirect_to: 'index.md'
-remove_date: '2021-09-28'
----
-
-This document was moved to [another location](index.md).
-
-<!-- This redirect file can be deleted after 2021-09-28. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/#move-or-rename-a-page -->
diff --git a/doc/ci/examples/deployment/composer-npm-deploy.md b/doc/ci/examples/deployment/composer-npm-deploy.md
index 6817c7cac8e..aa4055c00ea 100644
--- a/doc/ci/examples/deployment/composer-npm-deploy.md
+++ b/doc/ci/examples/deployment/composer-npm-deploy.md
@@ -7,7 +7,7 @@ type: tutorial
# Running Composer and npm scripts with deployment via SCP in GitLab CI/CD **(FREE)**
-This guide covers the building of dependencies of a PHP project while compiling assets via an npm script using [GitLab CI/CD](../../README.md).
+This guide covers the building of dependencies of a PHP project while compiling assets via an npm script using [GitLab CI/CD](../../index.md).
While it is possible to create your own image with custom PHP and Node.js versions, for brevity we use an existing [Docker image](https://hub.docker.com/r/tetraweb/php/) that contains both PHP and Node.js installed.
diff --git a/doc/ci/examples/deployment/index.md b/doc/ci/examples/deployment/index.md
index 14fb77dc49f..b083dbb8177 100644
--- a/doc/ci/examples/deployment/index.md
+++ b/doc/ci/examples/deployment/index.md
@@ -56,7 +56,7 @@ To use different provider take a look at long list of [Supported Providers](http
## Using Dpl with Docker
In most cases, you configured [GitLab Runner](https://docs.gitlab.com/runner/) to use your server's shell commands.
-This means that all commands are run in the context of local user (e.g. `gitlab_runner` or `gitlab_ci_multi_runner`).
+This means that all commands are run in the context of local user (for example `gitlab_runner` or `gitlab_ci_multi_runner`).
It also means that most probably in your Docker container you don't have the Ruby runtime installed.
You must install it:
@@ -69,7 +69,7 @@ staging:
- gem install dpl
- dpl --provider=heroku --app=my-app-staging --api_key=$HEROKU_STAGING_API_KEY
only:
- - master
+ - main
```
The first line `apt-get update -yq` updates the list of available packages,
@@ -81,7 +81,7 @@ The above example is valid for all Debian-compatible systems.
It's pretty common in the development workflow to have staging (development) and
production environments
-Let's consider the following example: we would like to deploy the `master`
+Let's consider the following example: we would like to deploy the `main`
branch to `staging` and all tags to the `production` environment.
The final `.gitlab-ci.yml` for that setup would look like this:
@@ -92,7 +92,7 @@ staging:
- gem install dpl
- dpl --provider=heroku --app=my-app-staging --api_key=$HEROKU_STAGING_API_KEY
only:
- - master
+ - main
production:
stage: deploy
@@ -105,7 +105,7 @@ production:
We created two deploy jobs that are executed on different events:
-- `staging`: Executed for all commits pushed to the `master` branch
+- `staging`: Executed for all commits pushed to the `main` branch
- `production`: Executed for all pushed tags
We also use two secure variables:
diff --git a/doc/ci/examples/end_to_end_testing_webdriverio/index.md b/doc/ci/examples/end_to_end_testing_webdriverio/index.md
index 06074d6edc2..a9794afaf10 100644
--- a/doc/ci/examples/end_to_end_testing_webdriverio/index.md
+++ b/doc/ci/examples/end_to_end_testing_webdriverio/index.md
@@ -33,7 +33,7 @@ to write such end-to-end tests, and how to set up GitLab CI/CD to automatically
against your new code, on a branch-by-branch basis. For the scope of this article, we will walk you
through the process of setting up GitLab CI/CD for end-to-end testing JavaScript-based applications
with WebdriverIO, but the general strategy should carry over to other languages.
-We assume you are familiar with GitLab, [GitLab CI/CD](../../README.md), [Review Apps](../../review_apps/index.md), and running your app locally, e.g., on `localhost:8000`.
+We assume you are familiar with GitLab, [GitLab CI/CD](../../index.md), [Review Apps](../../review_apps/index.md), and running your app locally, e.g., on `localhost:8000`.
## What to test
@@ -150,8 +150,8 @@ need to do for this:
1. Update our WebdriverIO configuration to use those browsers to visit the review apps.
For the scope of this article, we've defined an additional [CI/CD stage](../../yaml/index.md#stages)
-`confidence-check` that is executed _after_ the stage that deploys the review app. It uses the `node:latest` [Docker
-image](../../docker/using_docker_images.md). However, WebdriverIO fires up actual browsers
+`confidence-check` that is executed _after_ the stage that deploys the review app. It uses the `node:latest`
+[Docker image](../../docker/using_docker_images.md). However, WebdriverIO fires up actual browsers
to interact with your application, so we need to install and run them.
Furthermore, WebdriverIO uses Selenium as a common interface to control different browsers,
so we need to install and run Selenium as well. Luckily, the Selenium project provides the Docker images
diff --git a/doc/ci/examples/index.md b/doc/ci/examples/index.md
index 2c2c6ecd30f..0fc7b06a584 100644
--- a/doc/ci/examples/index.md
+++ b/doc/ci/examples/index.md
@@ -9,7 +9,7 @@ type: index
# GitLab CI/CD Examples **(FREE)**
This page contains links to a variety of examples that can help you understand how to
-implement [GitLab CI/CD](../README.md) for your specific use case.
+implement [GitLab CI/CD](../index.md) for your specific use case.
Examples are available in several forms. As a collection of:
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 c511839b3e4..e2e12235eba 100644
--- a/doc/ci/examples/laravel_with_gitlab_and_envoy/index.md
+++ b/doc/ci/examples/laravel_with_gitlab_and_envoy/index.md
@@ -17,7 +17,7 @@ date: 2017-08-31
GitLab features our applications with Continuous Integration, and it is possible to easily deploy the new code changes to the production server whenever we want.
-In this tutorial, we'll show you how to initialize a [Laravel](https://laravel.com) application and set up our [Envoy](https://laravel.com/docs/master/envoy) tasks, then we'll jump into see how to test and deploy it with [GitLab CI/CD](../README.md) via [Continuous Delivery](https://about.gitlab.com/blog/2016/08/05/continuous-integration-delivery-and-deployment-with-gitlab/).
+In this tutorial, we'll show you how to initialize a [Laravel](https://laravel.com) application and set up our [Envoy](https://laravel.com/docs/master/envoy) tasks, then we'll jump into see how to test and deploy it with [GitLab CI/CD](../index.md) via [Continuous Delivery](https://about.gitlab.com/blog/2016/08/05/continuous-integration-delivery-and-deployment-with-gitlab/).
We assume you have a basic experience with Laravel, Linux servers,
and you know how to use GitLab.
@@ -394,7 +394,7 @@ We have our app ready on GitLab, and we also can deploy it manually.
But let's take a step forward to do it automatically with [Continuous Delivery](https://about.gitlab.com/blog/2016/08/05/continuous-integration-delivery-and-deployment-with-gitlab/#continuous-delivery) method.
We need to check every commit with a set of automated tests to become aware of issues at the earliest, and then, we can deploy to the target environment if we are happy with the result of the tests.
-[GitLab CI/CD](../../README.md) allows us to use [Docker](https://www.docker.com) engine to handle the process of testing and deploying our app.
+[GitLab CI/CD](../../index.md) allows us to use [Docker](https://www.docker.com) engine to handle the process of testing and deploying our app.
In case you're not familiar with Docker, refer to [Set up automated builds](https://docs.docker.com/get-started/).
To be able to build, test, and deploy our app with GitLab CI/CD, we need to prepare our work environment.
diff --git a/doc/ci/index.md b/doc/ci/index.md
index 87b259af62a..2f18bd28642 100644
--- a/doc/ci/index.md
+++ b/doc/ci/index.md
@@ -32,10 +32,10 @@ For a complete overview of these methodologies and GitLab CI/CD,
read the [Introduction to CI/CD with GitLab](introduction/index.md).
<div class="video-fallback">
- Video demonstration of GitLab CI/CD: <a href="https://www.youtube.com/watch?v=1iXFbchozdY">Demo: CI/CD with GitLab</a>.
+ 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/1iXFbchozdY" frameborder="0" allowfullscreen="true"> </iframe>
+ <iframe src="https://www.youtube.com/embed/ljth1Q5oJoo" frameborder="0" allowfullscreen="true"> </iframe>
</figure>
## GitLab CI/CD concepts
@@ -46,7 +46,7 @@ GitLab CI/CD uses a number of concepts to describe and run your build and deploy
|:--------------------------------------------------------|:-------------------------------------------------------------------------------|
| [Pipelines](pipelines/index.md) | Structure your CI/CD process through pipelines. |
| [CI/CD variables](variables/index.md) | Reuse values based on a variable/value key pair. |
-| [Environments](environments/index.md) | Deploy your application to different environments (e.g., staging, production). |
+| [Environments](environments/index.md) | Deploy your application to different environments (for example, staging, production). |
| [Job artifacts](pipelines/job_artifacts.md) | Output, use, and reuse job artifacts. |
| [Cache dependencies](caching/index.md) | Cache your dependencies for a faster execution. |
| [GitLab Runner](https://docs.gitlab.com/runner/) | Configure your own runners to execute your scripts. |
@@ -65,7 +65,7 @@ GitLab CI/CD supports numerous configuration options:
| [SSH keys for CI/CD](ssh_keys/index.md) | Using SSH keys in your CI pipelines. |
| [Pipeline triggers](triggers/index.md) | Trigger pipelines through the API. |
| [Pipelines for Merge Requests](pipelines/merge_request_pipelines.md) | Design a pipeline structure for running a pipeline in merge requests. |
-| [Integrate with Kubernetes clusters](../user/project/clusters/index.md) | Connect your project to Google Kubernetes Engine (GKE) or an existing Kubernetes cluster. |
+| [Integrate with Kubernetes clusters](../user/infrastructure/clusters/index.md) | Connect your project to Google Kubernetes Engine (GKE) or an existing Kubernetes cluster. |
| [Optimize GitLab and GitLab Runner for large repositories](large_repositories/index.md) | Recommended strategies for handling large repositories. |
| [`.gitlab-ci.yml` full reference](yaml/index.md) | All the attributes you can use with GitLab CI/CD. |
@@ -97,7 +97,7 @@ GitLab CI/CD features, grouped by DevOps stage, include:
| [Building Docker images](docker/using_docker_build.md) | Maintain Docker-based projects using GitLab CI/CD. |
| [Canary Deployments](../user/project/canary_deployments.md) | Ship features to only a portion of your pods and let a percentage of your user base to visit the temporarily deployed feature. |
| [Deploy boards](../user/project/deploy_boards.md) | Check the current health and status of each CI/CD environment running on Kubernetes. |
-| [Feature Flags](../operations/feature_flags.md) **(PREMIUM)** | Deploy your features behind Feature Flags. |
+| [Feature Flags](../operations/feature_flags.md) | Deploy your features behind Feature Flags. |
| [GitLab Pages](../user/project/pages/index.md) | Deploy static websites. |
| [GitLab Releases](../user/project/releases/index.md) | Add release notes to Git tags. |
| [Review Apps](review_apps/index.md) | Configure GitLab CI/CD to preview code changes. |
@@ -111,7 +111,7 @@ GitLab CI/CD features, grouped by DevOps stage, include:
## GitLab CI/CD examples
-See the [CI/CD examples](examples/README.md) page for example project code and tutorials for
+See the [CI/CD examples](examples/index.md) page for example project code and tutorials for
using GitLab CI/CD with various:
- App frameworks
diff --git a/doc/ci/jobs/ci_job_token.md b/doc/ci/jobs/ci_job_token.md
index 70c22d566e5..308f38b22b7 100644
--- a/doc/ci/jobs/ci_job_token.md
+++ b/doc/ci/jobs/ci_job_token.md
@@ -12,9 +12,8 @@ When a pipeline job is about to run, GitLab generates a unique token and injects
You can use a GitLab CI/CD job token to authenticate with specific API endpoints:
- Packages:
- - [Package Registry](../../user/packages/package_registry/index.md). To push to the
- Package Registry, you can use [deploy tokens](../../user/project/deploy_tokens/index.md).
- - [Container Registry](../../user/packages/container_registry/index.md)
+ - [Package Registry](../../user/packages/package_registry/index.md#use-gitlab-cicd-to-build-packages).
+ - [Container Registry](../../user/packages/container_registry/index.md#build-and-push-by-using-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).
@@ -24,8 +23,8 @@ You can use a GitLab CI/CD job token to authenticate with specific API endpoints
- [Release creation](../../api/releases/index.md#create-a-release).
- [Terraform plan](../../user/infrastructure/index.md).
-The token has the same permissions to access the API as the user that triggers the
-pipeline. Therefore, this user must be assigned to [a role that has the required privileges](../../user/permissions.md#gitlab-cicd-permissions).
+The token has the same permissions to access the API as the user that executes the
+job. Therefore, this user must be assigned to [a role that has the required privileges](../../user/permissions.md#gitlab-cicd-permissions).
The token is valid only while the pipeline job runs. After the job finishes, you can't
use the token anymore.
@@ -60,20 +59,20 @@ tries to steal tokens from other jobs.
## Limit GitLab CI/CD job token access
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/328553) in GitLab 14.1.
-> - [Deployed behind a feature flag](../../user/feature_flags.md), disabled by default.
-> - Disabled on GitLab.com.
-> - Not recommended for production use.
-> - To use in GitLab self-managed instances, ask a GitLab administrator to [enable it](#enable-or-disable-ci-job-token-scope-limit). **(FREE SELF)**
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/328553) in GitLab 14.1. [Deployed behind the `:ci_scoped_job_token` feature flag](../../user/feature_flags.md), disabled by default.
+> - [Enabled on GitLab.com and self-managed](https://gitlab.com/gitlab-org/gitlab/-/issues/332272) in GitLab 14.4.
-This in-development feature might not be available for your use. There can be
-[risks when enabling features still in development](../../administration/feature_flags.md#risks-when-enabling-features-still-in-development).
-Refer to this feature's version history for more details.
+FLAG:
+On self-managed GitLab, by default this feature is available. To hide the feature,
+ask an administrator to [disable the `ci_scoped_job_token` flag](../../administration/feature_flags.md).
+On GitLab.com, this feature is available.
You can limit the access scope of a project's CI/CD job token to increase the
job token's security. A job token might give extra permissions that aren't necessary
-to access specific private resources. Limiting the job token access scope reduces the risk of a leaked
-token being used to access private data that the user associated to the job can access.
+to access specific private resources.
+If a job token is leaked it could potentially be used to access data that is private
+to the job token's user. By limiting the job token access scope, private data cannot
+be accessed unless projects are explicitly authorized.
Control the job token access scope with an allowlist of other projects authorized
to be accessed by authenticating with the current project's job token. By default
@@ -87,10 +86,10 @@ setting at all times, and configure the allowlist for cross-project access if ne
For example, when the setting is enabled, jobs in a pipeline in project `A` have
a `CI_JOB_TOKEN` scope limited to project `A`. If the job needs to use the token
to make an API request to a private project `B`, then `B` must be added to the allowlist for `A`.
-If project `B` is public or internal, it doesn't need to be added to the allowlist.
+If project `B` is public or internal, it's not required to be added to the allowlist.
The job token scope is only for controlling access to private projects.
-To enable and configure the job token scope limit:
+### Configure the job token scope limit
1. On the top bar, select **Menu > Projects** and find your project.
1. On the left sidebar, select **Settings > CI/CD**.
@@ -99,31 +98,9 @@ To enable and configure the job token scope limit:
1. (Optional) Add existing projects to the token's access scope. The user adding a
project must have the [maintainer role](../../user/permissions.md) in both projects.
-If the job token scope limit is disabled, the token can potentially be used to authenticate
-API requests to all projects accessible to the user that triggered the job.
-
There is [a proposal](https://gitlab.com/groups/gitlab-org/-/epics/3559) to improve
the feature with more strategic control of the access permissions.
-### Enable or disable CI job token scope limit **(FREE SELF)**
-
-The GitLab CI/CD job token access scope limit is under development and not ready for production
-use. It is deployed behind a feature flag that is **disabled by default**.
-[GitLab administrators with access to the GitLab Rails console](../../administration/feature_flags.md)
-can enable it.
-
-To enable it:
-
-```ruby
-Feature.enable(:ci_scoped_job_token)
-```
-
-To disable it:
-
-```ruby
-Feature.disable(:ci_scoped_job_token)
-```
-
## Trigger a multi-project pipeline by using a CI job token
> `CI_JOB_TOKEN` for multi-project pipelines was [moved](https://gitlab.com/gitlab-org/gitlab/-/issues/31573) from GitLab Premium to GitLab Free in 12.4.
@@ -163,3 +140,50 @@ build_submodule:
```
Read more about the [jobs artifacts API](../../api/job_artifacts.md#download-the-artifacts-archive).
+
+## Troubleshooting
+
+CI job token failures are usually shown as responses like `404 Not Found` or similar:
+
+- Unauthorized Git clone:
+
+ ```plaintext
+ $ git clone https://gitlab-ci-token:$CI_JOB_TOKEN@gitlab.com/fabiopitino/test2.git
+
+ Cloning into 'test2'...
+ remote: The project you were looking for could not be found or you don't have permission to view it.
+ fatal: repository 'https://gitlab-ci-token:[MASKED]@gitlab.com/<namespace>/<project>.git/' not found
+ ```
+
+- Unauthorized package download:
+
+ ```plaintext
+ $ wget --header="JOB-TOKEN: $CI_JOB_TOKEN" ${CI_API_V4_URL}/projects/1234/packages/generic/my_package/0.0.1/file.txt
+
+ --2021-09-23 11:00:13-- https://gitlab.com/api/v4/projects/1234/packages/generic/my_package/0.0.1/file.txt
+ Resolving gitlab.com (gitlab.com)... 172.65.251.78, 2606:4700:90:0:f22e:fbec:5bed:a9b9
+ Connecting to gitlab.com (gitlab.com)|172.65.251.78|:443... connected.
+ HTTP request sent, awaiting response... 404 Not Found
+ 2021-09-23 11:00:13 ERROR 404: Not Found.
+ ```
+
+- Unauthorized API request:
+
+ ```plaintext
+ $ curl --verbose --request POST --form "token=$CI_JOB_TOKEN" --form ref=master "https://gitlab.com/api/v4/projects/1234/trigger/pipeline"
+
+ < HTTP/2 404
+ < date: Thu, 23 Sep 2021 11:00:12 GMT
+ {"message":"404 Not Found"}
+ < content-type: application/json
+ ```
+
+While troubleshooting CI/CD job token authentication issues, be aware that:
+
+- When the [CI/CD job token limit](#limit-gitlab-cicd-job-token-access) is enabled,
+ and the job token is being used to access a different project:
+ - The user that executes the job must be a member of the project that is being accessed.
+ - The user must have the [permissions](../../user/permissions.md) to perform the action.
+ - The target project must be [allowlisted for the job token scope limit](#configure-the-job-token-scope-limit).
+- The CI job token becomes invalid if the job is no longer running, has been erased,
+ or if the project is in the process of being deleted.
diff --git a/doc/ci/jobs/index.md b/doc/ci/jobs/index.md
index 54704d5574b..cb3b11ebf99 100644
--- a/doc/ci/jobs/index.md
+++ b/doc/ci/jobs/index.md
@@ -45,8 +45,6 @@ Clicking an individual job shows you its job log, and allows you to:
## See why a job failed
-> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/17782) in GitLab 10.7.
-
When a pipeline fails or is allowed to fail, there are several places where you
can find the reason:
@@ -58,8 +56,7 @@ In each place, if you hover over the failed job you can see the reason it failed
![Pipeline detail](img/job_failure_reason.png)
-In [GitLab 10.8 and later](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/17814),
-you can also see the reason it failed on the Job detail page.
+You can also see the reason it failed on the Job detail page.
## The order of jobs in a pipeline
@@ -87,8 +84,6 @@ For example:
## Group jobs in a pipeline
-> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/6242) in GitLab 8.12.
-
If you have many similar jobs, your [pipeline graph](../pipelines/index.md#visualize-pipelines) becomes long and hard
to read.
@@ -164,8 +159,6 @@ for a single run of the manual job.
## Delay a job
-> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/21767) in GitLab 11.4.
-
When you do not want to run a job immediately, you can use the [`when:delayed`](../jobs/job_control.md#run-a-job-after-a-delay) keyword to
delay a job's execution for a certain period.
diff --git a/doc/ci/lint.md b/doc/ci/lint.md
index e01bd6b79ff..45152e5a0df 100644
--- a/doc/ci/lint.md
+++ b/doc/ci/lint.md
@@ -4,7 +4,7 @@ group: Pipeline Authoring
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Validate `.gitlab-ci.yml` syntax with the CI Lint tool
+# Validate `.gitlab-ci.yml` syntax with the CI Lint tool **(FREE)**
If you want to test the validity of your GitLab CI/CD configuration before committing
the changes, you can use the CI Lint tool. This tool checks for syntax and logical
diff --git a/doc/ci/merge_request_pipelines/index.md b/doc/ci/merge_request_pipelines/index.md
deleted file mode 100644
index 13f4ca428c6..00000000000
--- a/doc/ci/merge_request_pipelines/index.md
+++ /dev/null
@@ -1,9 +0,0 @@
----
-redirect_to: '../pipelines/merge_request_pipelines.md'
-remove_date: '2021-09-29'
----
-
-This document was moved to [another location](../pipelines/merge_request_pipelines.md).
-
-<!-- This redirect file can be deleted after 2021-09-29. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/#move-or-rename-a-page -->
diff --git a/doc/ci/merge_request_pipelines/pipelines_for_merged_results/index.md b/doc/ci/merge_request_pipelines/pipelines_for_merged_results/index.md
deleted file mode 100644
index 5b68c4ca931..00000000000
--- a/doc/ci/merge_request_pipelines/pipelines_for_merged_results/index.md
+++ /dev/null
@@ -1,9 +0,0 @@
----
-redirect_to: '../../pipelines/pipelines_for_merged_results.md'
-remove_date: '2021-09-29'
----
-
-This document was moved to [another location](../../pipelines/pipelines_for_merged_results.md).
-
-<!-- This redirect file can be deleted after 2021-09-29. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/#move-or-rename-a-page -->
diff --git a/doc/ci/merge_request_pipelines/pipelines_for_merged_results/merge_trains/index.md b/doc/ci/merge_request_pipelines/pipelines_for_merged_results/merge_trains/index.md
deleted file mode 100644
index c8e8dffbdcd..00000000000
--- a/doc/ci/merge_request_pipelines/pipelines_for_merged_results/merge_trains/index.md
+++ /dev/null
@@ -1,9 +0,0 @@
----
-redirect_to: '../../../pipelines/merge_trains.md'
-remove_date: '2021-09-29'
----
-
-This document was moved to [another location](../../../pipelines/merge_trains.md).
-
-<!-- This redirect file can be deleted after 2021-09-29. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/#move-or-rename-a-page -->
diff --git a/doc/ci/metrics_reports.md b/doc/ci/metrics_reports.md
index 9a220121f54..5343af16489 100644
--- a/doc/ci/metrics_reports.md
+++ b/doc/ci/metrics_reports.md
@@ -7,7 +7,7 @@ type: reference
# Metrics Reports **(PREMIUM)**
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/9788) in [GitLab Premium](https://about.gitlab.com/pricing/) 11.10. Requires GitLab Runner 11.10 and above.
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/9788) in GitLab 11.10. Requires GitLab Runner 11.10 and above.
GitLab provides a lot of great reporting tools for things like [merge requests](../user/project/merge_requests/index.md) - [Unit test reports](unit_test_reports.md), [code quality](../user/project/merge_requests/code_quality.md), and performance tests. While JUnit is a great open framework for tests that "pass" or "fail", it is also important to see other types of metrics from a given change.
diff --git a/doc/ci/migration/jenkins.md b/doc/ci/migration/jenkins.md
index 925dff8751c..c2c06375d7b 100644
--- a/doc/ci/migration/jenkins.md
+++ b/doc/ci/migration/jenkins.md
@@ -42,8 +42,8 @@ can be a great resource.
## Manage organizational transition
An important part of transitioning from Jenkins to GitLab is the cultural and organizational
-changes that comes with the move, and successfully managing them. There are a few
-things we have found that helps this:
+changes that come with the move, and successfully managing them. There are a few
+things we have found that help this:
- Setting and communicating a clear vision of what your migration goals are helps
your users understand why the effort is worth it. The value is clear when
diff --git a/doc/ci/multi_project_pipelines.md b/doc/ci/multi_project_pipelines.md
deleted file mode 100644
index 93e04bf8a0e..00000000000
--- a/doc/ci/multi_project_pipelines.md
+++ /dev/null
@@ -1,9 +0,0 @@
----
-redirect_to: 'pipelines/multi_project_pipelines.md'
-remove_date: '2021-09-29'
----
-
-This document was moved to [another location](pipelines/multi_project_pipelines.md).
-
-<!-- This redirect file can be deleted after 2021-09-29. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/#move-or-rename-a-page -->
diff --git a/doc/ci/parent_child_pipelines.md b/doc/ci/parent_child_pipelines.md
deleted file mode 100644
index f2edc263397..00000000000
--- a/doc/ci/parent_child_pipelines.md
+++ /dev/null
@@ -1,9 +0,0 @@
----
-redirect_to: 'pipelines/parent_child_pipelines.md'
-remove_date: '2021-09-29'
----
-
-This document was moved to [another location](pipelines/parent_child_pipelines.md).
-
-<!-- This redirect file can be deleted after 2021-09-29. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/#move-or-rename-a-page -->
diff --git a/doc/ci/pipelines/img/multi_project_pipeline_graph.png b/doc/ci/pipelines/img/multi_project_pipeline_graph.png
deleted file mode 100644
index 723a455cb4a..00000000000
--- a/doc/ci/pipelines/img/multi_project_pipeline_graph.png
+++ /dev/null
Binary files differ
diff --git a/doc/ci/pipelines/img/multi_project_pipeline_graph_v14_3.png b/doc/ci/pipelines/img/multi_project_pipeline_graph_v14_3.png
new file mode 100644
index 00000000000..aadf8bb0979
--- /dev/null
+++ b/doc/ci/pipelines/img/multi_project_pipeline_graph_v14_3.png
Binary files differ
diff --git a/doc/ci/pipelines/img/parent_pipeline_graph_expanded_v12_6.png b/doc/ci/pipelines/img/parent_pipeline_graph_expanded_v12_6.png
deleted file mode 100644
index db18cc201fc..00000000000
--- a/doc/ci/pipelines/img/parent_pipeline_graph_expanded_v12_6.png
+++ /dev/null
Binary files differ
diff --git a/doc/ci/pipelines/img/parent_pipeline_graph_expanded_v14_3.png b/doc/ci/pipelines/img/parent_pipeline_graph_expanded_v14_3.png
new file mode 100644
index 00000000000..206e4eeec05
--- /dev/null
+++ b/doc/ci/pipelines/img/parent_pipeline_graph_expanded_v14_3.png
Binary files differ
diff --git a/doc/ci/pipelines/index.md b/doc/ci/pipelines/index.md
index 1eacc799636..69e974406e2 100644
--- a/doc/ci/pipelines/index.md
+++ b/doc/ci/pipelines/index.md
@@ -38,7 +38,7 @@ A typical pipeline might consist of four stages, executed in the following order
- A `production` stage, with a job called `deploy-to-prod`.
NOTE:
-If you have a [mirrored repository that GitLab pulls from](../../user/project/repository/repository_mirroring.md#pull-from-a-remote-repository),
+If you have a [mirrored repository that GitLab pulls from](../../user/project/repository/mirror/pull.md),
you may need to enable pipeline triggering in your project's
**Settings > Repository > Pull from a remote repository > Trigger pipelines for mirror updates**.
@@ -148,7 +148,7 @@ The pipeline now executes the jobs as configured.
#### Prefill variables in manual pipelines
-> [Introduced in](https://gitlab.com/gitlab-org/gitlab/-/issues/30101) GitLab 13.7.
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/30101) in GitLab 13.7.
You can use the [`value` and `description`](../yaml/index.md#prefill-variables-in-manual-pipelines)
keywords to define
@@ -339,7 +339,7 @@ GitLab capitalizes the stages' names in the pipeline graphs.
### View full pipeline graph
-> - [Visualization improvements introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/276949) in GitLab 13.11.
+> - Visualization improvements [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/276949) in GitLab 13.11.
The [pipeline details page](#view-pipelines) displays the full pipeline graph of
all the jobs in the pipeline.
diff --git a/doc/ci/pipelines/job_artifacts.md b/doc/ci/pipelines/job_artifacts.md
index c6b6f61ef11..7ecee5508ef 100644
--- a/doc/ci/pipelines/job_artifacts.md
+++ b/doc/ci/pipelines/job_artifacts.md
@@ -8,7 +8,7 @@ type: reference, howto
# Job artifacts **(FREE)**
-> Introduced in [GitLab 12.4](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/16675), artifacts in internal and private projects can be previewed when [GitLab Pages access control](../../administration/pages/index.md#access-control) is enabled.
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/16675) in GitLab 12.4, artifacts in internal and private projects can be previewed when [GitLab Pages access control](../../administration/pages/index.md#access-control) is enabled.
Jobs can output an archive of files and directories. This output is known as a job artifact.
@@ -111,7 +111,7 @@ the artifact.
## How searching for job artifacts works
-In [GitLab 13.5](https://gitlab.com/gitlab-org/gitlab/-/issues/201784) and later, artifacts
+In [GitLab 13.5 and later](https://gitlab.com/gitlab-org/gitlab/-/issues/201784), artifacts
for [parent and child pipelines](parent_child_pipelines.md) are searched in hierarchical
order from parent to child. For example, if both parent and child pipelines have a
job with the same name, the job artifact from the parent pipeline is returned.
diff --git a/doc/ci/pipelines/merge_request_pipelines.md b/doc/ci/pipelines/merge_request_pipelines.md
index b3dfe8753c7..5b40744aa79 100644
--- a/doc/ci/pipelines/merge_request_pipelines.md
+++ b/doc/ci/pipelines/merge_request_pipelines.md
@@ -198,7 +198,7 @@ which helps you get your starting configuration correct.
If you are seeing two pipelines when using `only/except`, please see the caveats
related to using `only/except` above (or, consider moving to `rules`).
-In [GitLab 13.7](https://gitlab.com/gitlab-org/gitlab/-/issues/201845) and later,
+In [GitLab 13.7 and later](https://gitlab.com/gitlab-org/gitlab/-/issues/201845),
you can add `workflow:rules` to [switch from branch pipelines to merge request pipelines](../yaml/index.md#switch-between-branch-pipelines-and-merge-request-pipelines).
After a merge request is open on the branch, the pipeline switches to a merge request pipeline.
diff --git a/doc/ci/pipelines/merge_trains.md b/doc/ci/pipelines/merge_trains.md
index 06c1a6fef44..6074909a887 100644
--- a/doc/ci/pipelines/merge_trains.md
+++ b/doc/ci/pipelines/merge_trains.md
@@ -8,8 +8,8 @@ last_update: 2019-07-03
# Merge trains **(PREMIUM)**
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/9186) in [GitLab Premium](https://about.gitlab.com/pricing/) 12.0.
-> - [Squash and merge](../../user/project/merge_requests/squash_and_merge.md) support [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/13001) in [GitLab Premium](https://about.gitlab.com/pricing/) 12.6.
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/9186) in GitLab 12.0.
+> - [Squash and merge](../../user/project/merge_requests/squash_and_merge.md) support [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/13001) in GitLab 12.6.
For more information about why you might want to use merge trains, read [How merge trains keep your master green](https://about.gitlab.com/blog/2020/01/30/all-aboard-merge-trains/).
@@ -59,8 +59,6 @@ to run. If more merge requests are added to the train, they now include the `A`
changes that are included in the target branch, and the `C` changes that are from
the merge request already in the train.
-Read more about [how merge trains keep your master green](https://about.gitlab.com/blog/2020/01/30/all-aboard-merge-trains/).
-
<i class="fa fa-youtube-play youtube" aria-hidden="true"></i>
Watch this video for a demonstration on [how parallel execution
of merge trains can prevent commits from breaking the default
diff --git a/doc/ci/pipelines/multi_project_pipelines.md b/doc/ci/pipelines/multi_project_pipelines.md
index d31ddcf736e..184961f4c95 100644
--- a/doc/ci/pipelines/multi_project_pipelines.md
+++ b/doc/ci/pipelines/multi_project_pipelines.md
@@ -88,7 +88,7 @@ The keywords available for use in trigger jobs are:
- [`only` and `except`](../yaml/index.md#only--except)
- [`when`](../yaml/index.md#when) (only with a value of `on_success`, `on_failure`, or `always`)
- [`extends`](../yaml/index.md#extends)
-- [`needs`](../yaml/index.md#needs)
+- [`needs`](../yaml/index.md#needs), but not [cross project artifact downloads with `needs`](../yaml/index.md#cross-project-artifact-downloads-with-needs)
#### Specify a downstream pipeline branch
@@ -112,7 +112,7 @@ Use:
- The `project` keyword to specify the full path to a downstream project.
- The `branch` keyword to specify the name of a branch in the project specified by `project`.
- [In GitLab 12.4](https://gitlab.com/gitlab-org/gitlab/-/issues/10126) and later, variable expansion is
+ In [GitLab 12.4 and later](https://gitlab.com/gitlab-org/gitlab/-/issues/10126), variable expansion is
supported.
Pipelines triggered on a protected branch in a downstream project use the [role](../../user/permissions.md)
@@ -290,7 +290,7 @@ When using:
## Trigger a pipeline when an upstream project is rebuilt **(PREMIUM)**
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/9045) in GitLab Premium 12.8.
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/9045) in GitLab 12.8.
You can trigger a pipeline in your project whenever a pipeline finishes for a new
tag in a different project.
@@ -321,7 +321,7 @@ downstream projects. On self-managed instances, an administrator can change this
When you configure GitLab CI/CD for your project, you can visualize the stages of your
[jobs](index.md#configure-a-pipeline) on a [pipeline graph](index.md#visualize-pipelines).
-![Multi-project pipeline graph](img/multi_project_pipeline_graph.png)
+![Multi-project pipeline graph](img/multi_project_pipeline_graph_v14_3.png)
In the merge request, on the **Pipelines** tab, multi-project pipeline mini-graphs are displayed.
They expand and are shown adjacent to each other when hovering (or tapping on touchscreen devices).
diff --git a/doc/ci/pipelines/parent_child_pipelines.md b/doc/ci/pipelines/parent_child_pipelines.md
index 71f778d81b3..e48728a904a 100644
--- a/doc/ci/pipelines/parent_child_pipelines.md
+++ b/doc/ci/pipelines/parent_child_pipelines.md
@@ -23,7 +23,7 @@ Additionally, sometimes the behavior of a pipeline needs to be more dynamic. The
to choose to start sub-pipelines (or not) is a powerful ability, especially if the
YAML is dynamically generated.
-![Parent pipeline graph expanded](img/parent_pipeline_graph_expanded_v12_6.png)
+![Parent pipeline graph expanded](img/parent_pipeline_graph_expanded_v14_3.png)
Similarly to [multi-project pipelines](multi_project_pipelines.md), a pipeline can trigger a
set of concurrently running child pipelines, but within the same project:
@@ -72,7 +72,7 @@ microservice_a:
- template: Security/SAST.gitlab-ci.yml
```
-In [GitLab 13.5](https://gitlab.com/gitlab-org/gitlab/-/issues/205157) and later,
+In [GitLab 13.5 and later](https://gitlab.com/gitlab-org/gitlab/-/issues/205157),
you can use [`include:file`](../yaml/index.md#includefile) to trigger child pipelines
with a configuration file in a different project:
@@ -169,7 +169,7 @@ runner for testing, the path separator for the trigger job would be `/`. Other C
configuration for jobs, like scripts, that use the Windows runner would use `\`.
In GitLab 12.9, the child pipeline could fail to be created in certain cases, causing the parent pipeline to fail.
-This is [resolved in GitLab 12.10](https://gitlab.com/gitlab-org/gitlab/-/issues/209070).
+This is [resolved](https://gitlab.com/gitlab-org/gitlab/-/issues/209070) in GitLab 12.10.
## Nested child pipelines
diff --git a/doc/ci/pipelines/pipeline_efficiency.md b/doc/ci/pipelines/pipeline_efficiency.md
index 5c3cdd0633e..94cfeff3acc 100644
--- a/doc/ci/pipelines/pipeline_efficiency.md
+++ b/doc/ci/pipelines/pipeline_efficiency.md
@@ -7,7 +7,7 @@ type: reference
# Pipeline efficiency **(FREE)**
-[CI/CD Pipelines](index.md) are the fundamental building blocks for [GitLab CI/CD](../README.md).
+[CI/CD Pipelines](index.md) are the fundamental building blocks for [GitLab CI/CD](../index.md).
Making pipelines more efficient helps you save developer time, which:
- Speeds up your DevOps processes
diff --git a/doc/ci/pipelines/pipelines_for_merged_results.md b/doc/ci/pipelines/pipelines_for_merged_results.md
index 08d7d119787..2acef9be557 100644
--- a/doc/ci/pipelines/pipelines_for_merged_results.md
+++ b/doc/ci/pipelines/pipelines_for_merged_results.md
@@ -8,7 +8,7 @@ last_update: 2019-07-03
# Pipelines for merged results **(PREMIUM)**
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/7380) in [GitLab Premium](https://about.gitlab.com/pricing/) 11.10.
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/7380) in GitLab 11.10.
When you submit a merge request, you are requesting to merge changes from a
source branch into a target branch. By default, the CI pipeline runs jobs
@@ -49,7 +49,7 @@ To enable pipelines for merge results:
- You must be using [GitLab Runner](https://gitlab.com/gitlab-org/gitlab-runner) 11.9 or later.
- You must not be using
[fast forward merges](../../user/project/merge_requests/fast_forward_merge.md) yet.
- To follow progress, see [#58226](https://gitlab.com/gitlab-org/gitlab/-/issues/26996).
+ To follow progress, see [#26996](https://gitlab.com/gitlab-org/gitlab/-/issues/26996).
- Your repository must be a GitLab repository, not an
[external repository](../ci_cd_for_external_repos/index.md).
@@ -82,7 +82,7 @@ For more information, read the [documentation on Merge Trains](merge_trains.md).
## Automatic pipeline cancellation
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/12996) in [GitLab Premium](https://about.gitlab.com/pricing/) 12.3.
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/12996) in GitLab 12.3.
GitLab CI/CD can detect the presence of redundant pipelines, and cancels them
to conserve CI resources.
diff --git a/doc/ci/pipelines/schedules.md b/doc/ci/pipelines/schedules.md
index 9cb600ae551..90494a715ea 100644
--- a/doc/ci/pipelines/schedules.md
+++ b/doc/ci/pipelines/schedules.md
@@ -73,7 +73,7 @@ job:on-schedule:
job:
rules:
- - if: $CI_PIPELINE_SOURCE = "push"
+ - if: $CI_PIPELINE_SOURCE == "push"
script:
- make build
```
diff --git a/doc/ci/pipelines/settings.md b/doc/ci/pipelines/settings.md
index 94d7e317104..e14c1aa621f 100644
--- a/doc/ci/pipelines/settings.md
+++ b/doc/ci/pipelines/settings.md
@@ -94,7 +94,7 @@ For more information, see [Deployment safety](../environments/deployment_safety.
## Specify a custom CI/CD configuration file
-> [Support for external `.gitlab-ci.yml` locations](https://gitlab.com/gitlab-org/gitlab/-/issues/14376) introduced in GitLab 12.6.
+> Support for external `.gitlab-ci.yml` locations [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/14376) in GitLab 12.6.
GitLab expects to find the CI/CD configuration file (`.gitlab-ci.yml`) in the project's root
directory. However, you can specify an alternate filename path, including locations outside the project.
@@ -241,7 +241,7 @@ Use this regex for commonly used test tools.
### View code coverage history
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/209121) the ability to download a `.csv` in GitLab 12.10.
-> - [Graph introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/33743) in GitLab 13.1.
+> - Graph [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/33743) in GitLab 13.1.
To see the evolution of your project code coverage over time,
you can view a graph or download a CSV file with this data.
@@ -358,6 +358,29 @@ in your `README.md`:
![coverage](https://gitlab.com/gitlab-org/gitlab/badges/main/coverage.svg?job=coverage)
```
+#### Test coverage report badge colors and limits
+
+The default colors and limits for the badge are as follows:
+
+- 95 up to and including 100% - good (`#4c1`)
+- 90 up to 95% - acceptable (`#a3c51c`)
+- 75 up to 90% - medium (`#dfb317`)
+- 0 up to 75% - low (`#e05d44`)
+- no coverage - unknown (`#9f9f9f`)
+
+NOTE:
+*Up to* means up to, but not including, the upper bound.
+
+You can overwrite the limits by using the following additional parameters ([Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/28317) in GitLab 14.4):
+
+- `min_good` (default 95, can use any value between 3 and 100)
+- `min_acceptable` (default 90, can use any value between 2 and min_good-1)
+- `min_medium` (default 75, can use any value between 1 and min_acceptable-1)
+
+If an invalid boundary is set, GitLab automatically adjusts it to be valid. For example,
+if `min_good` is set `80`, and `min_acceptable` is set to `85` (too high), GitLab automatically
+sets `min_acceptable` to `79` (`min_good` - `1`).
+
### Badge styles
Pipeline badges can be rendered in different styles by adding the `style=style_name` parameter to the URL. Two styles are available:
diff --git a/doc/ci/quick_start/index.md b/doc/ci/quick_start/index.md
index e2381238318..4006a1c9c3c 100644
--- a/doc/ci/quick_start/index.md
+++ b/doc/ci/quick_start/index.md
@@ -152,7 +152,7 @@ The pipeline starts when the commit is committed.
- Use the [`rules`](../yaml/index.md#rules) keyword to specify when to run or skip jobs.
The `only` and `except` legacy keywords are still supported, but can't be used
with `rules` in the same job.
- - Keep information across jobs and stages persistent in a pipeline with [`cache`](../yaml/index.md#cache))
+ - 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.
- For the complete `.gitlab-ci.yml` syntax, see [the full `.gitlab-ci.yml` reference topic](../yaml/index.md).
diff --git a/doc/ci/resource_groups/index.md b/doc/ci/resource_groups/index.md
new file mode 100644
index 00000000000..7de3643c0d4
--- /dev/null
+++ b/doc/ci/resource_groups/index.md
@@ -0,0 +1,203 @@
+---
+stage: Release
+group: Release
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
+description: Control the job concurrency in GitLab CI/CD
+---
+
+# Resource Group **(FREE)**
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/15536) in GitLab 12.7.
+
+By default, pipelines in GitLab CI/CD run in parallel. The parallelization is an important factor to improve
+the feedback loop in merge requests, however, there are some situations that
+you may want to limit the concurrency on deployment
+jobs to run them one by one.
+Resource Group allows you to strategically control
+the concurrency of the jobs for optimizing your continuous deployments workflow with safety.
+
+## Add a resource group
+
+Provided that you have the following pipeline configuration (`.gitlab-ci.yml` file in your repository):
+
+```yaml
+build:
+ stage: build
+ script: echo "Your build script"
+
+deploy:
+ stage: deploy
+ script: echo "Your deployment script"
+ environment: production
+```
+
+Every time you push a new commit to a branch, it runs a new pipeline that has
+two jobs `build` and `deploy`. But if you push multiple commits in a short interval, multiple
+pipelines start running simultaneously, for example:
+
+- The first pipeline runs the jobs `build` -> `deploy`
+- The second pipeline runs the jobs `build` -> `deploy`
+
+In this case, the `deploy` jobs across different pipelines could run concurrently
+to the `production` environment. Running multiple deployment scripts to the same
+infrastructure could harm/confuse the instance and leave it in a corrupted state in the worst case.
+
+In order to ensure that a `deploy` job runs once at a time, you can specify
+[`resource_group` keyword](../yaml/index.md#resource_group) to the concurrency sensitive job:
+
+```yaml
+deploy:
+ ...
+ resource_group: production
+```
+
+With this configuration, the safety on the deployments is assured while you
+can still run `build` jobs concurrently for maximizing the pipeline efficency.
+
+## Requirements
+
+- The basic knowledge of the [GitLab CI/CD pipelines](../pipelines/index.md)
+- The basic knowledge of the [GitLab Environments and Deployments](../environments/index.md)
+- [Developer role](../../user/permissions.md) (or above) in the project to configure CI/CD pipelines.
+
+### Limitations
+
+Only one resource can be attached to a resource group.
+
+## Process modes
+
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/202186) in GitLab 14.3.
+> - [Feature flag `ci_resource_group_process_modes`](https://gitlab.com/gitlab-org/gitlab/-/issues/340380) removed in GitLab 14.4.
+> - [Generally available](https://gitlab.com/gitlab-org/gitlab/-/issues/202186) in GitLab 14.4.
+
+You can choose a process mode to strategically control the job concurrency for your deployment preferences.
+The following modes are supported:
+
+- **Unordered:** This is the default process mode that limits the concurrency on running jobs.
+ It's the easiest option to use and useful when you don't care about the execution order
+ of the jobs. It starts processing the jobs whenever a job ready to run.
+- **Oldest first:** This process mode limits the concurrency of the jobs. When a resource is free,
+ it picks the first job from the list of upcoming jobs (`created`, `scheduled`, or `waiting_for_resource` state)
+ that are sorted by pipeline ID in ascending order.
+
+ This mode is useful when you want to ensure that the jobs are executed from the oldest pipeline.
+ This is less efficient compared to the `unordered` mode in terms of the pipeline efficiency,
+ but safer for continuous deployments.
+
+- **Newest first:** This process mode limits the concurrency of the jobs. When a resource is free,
+ it picks the first job from the list of upcoming jobs (`created`, `scheduled` or `waiting_for_resource` state)
+ that are sorted by pipeline ID in descending order.
+
+ This mode is useful when you want to ensure that the jobs are executed from the newest pipeline and
+ cancel all of the old deploy jobs with the [skip outdated deployment jobs](../environments/deployment_safety.md#skip-outdated-deployment-jobs) feature.
+ This is the most efficient option in terms of the pipeline efficiency, but you must ensure that each deployment job is idempotent.
+
+### Change the process mode
+
+To change the process mode of a resource group, you need to use the API and
+send a request to [edit an existing resource group](../../api/resource_groups.md#edit-an-existing-resource-group)
+by specifying the `process_mode`:
+
+- `unordered`
+- `oldest_first`
+- `newest_first`
+
+### An example of difference between the process modes
+
+Consider the following `.gitlab-ci.yml`, where we have two jobs `build` and `deploy`
+each running in their own stage, and the `deploy` job has a resource group set to
+`production`:
+
+```yaml
+build:
+ stage: build
+ script: echo "Your build script"
+
+deploy:
+ stage: deploy
+ script: echo "Your deployment script"
+ environment: production
+ resource_group: production
+```
+
+If three commits are pushed to the project in a short interval, that means that three
+pipelines run almost at the same time:
+
+- The first pipeline runs the jobs `build` -> `deploy`. Let's call this deployment job `deploy-1`.
+- The second pipeline runs the jobs `build` -> `deploy`. Let's call this deployment job `deploy-2`.
+- The third pipeline runs the jobs `build` -> `deploy`. Let's call this deployment job `deploy-3`.
+
+Depending on the process mode of the resource group:
+
+- If the process mode is set to `unordered`:
+ - `deploy-1`, `deploy-2`, and `deploy-3` do not run in parallel.
+ - There is no guarantee on the job execution order, for example, `deploy-1` could run before or after `deploy-3` runs.
+- If the process mode is `oldest_first`:
+ - `deploy-1`, `deploy-2`, and `deploy-3` do not run in parallel.
+ - `deploy-1` runs first, `deploy-2` runs second, and `deploy-3` runs last.
+- If the process mode is `newest_first`:
+ - `deploy-1`, `deploy-2`, and `deploy-3` do not run in parallel.
+ - `deploy-3` runs first, `deploy-2` runs second and `deploy-1` runs last.
+
+## Pipeline-level concurrency control with Cross-Project/Parent-Child pipelines
+
+See the how to [control the pipeline concurrency in cross-project pipelines](../yaml/index.md#pipeline-level-concurrency-control-with-cross-projectparent-child-pipelines).
+
+## API
+
+See the [API documentation](../../api/resource_groups.md).
+
+## Related features
+
+Read more how you can use GitLab for [safe deployments](../environments/deployment_safety.md).
+
+## Troubleshooting
+
+### Avoid dead locks in pipeline configurations
+
+Since [`oldest_first` process mode](#process-modes) enforces the jobs to be executed in a pipeline order,
+there is a case that it doesn't work well with the other CI features.
+
+For example, when you run [a child pipeline](../pipelines/parent_child_pipelines.md)
+that requires the same resource group with the parent pipeline,
+a dead lock could happen. Here is an example of a _bad_ setup:
+
+```yaml
+# BAD
+test:
+ stage: test
+ trigger:
+ include: child-pipeline-requires-production-resource-group.yml
+ strategy: depend
+
+deploy:
+ stage: deploy
+ script: echo
+ resource_group: production
+```
+
+In a parent pipeline, it runs the `test` job that subsequently runs a child pipeline,
+and the [`strategy: depend` option](../yaml/index.md#linking-pipelines-with-triggerstrategy) makes the `test` job wait until the child pipeline has finished.
+The parent pipeline runs the `deploy` job in the next stage, that requires a resource from the `production` resource group.
+If the process mode is `oldest_first`, it executes the jobs from the oldest pipelines, meaning the `deploy` job is going to be executed next.
+
+However, a child pipeline also requires a resource from the `production` resource group.
+Since the child pipeline is newer than the parent pipeline, the child pipeline
+waits until the `deploy` job is finished, something that will never happen.
+
+In this case, you should specify the `resource_group` keyword in the parent pipeline configuration instead:
+
+```yaml
+# GOOD
+test:
+ stage: test
+ trigger:
+ include: child-pipeline.yml
+ strategy: depend
+ resource_group: production # Specify the resource group in the parent pipeline
+
+deploy:
+ stage: deploy
+ script: echo
+ resource_group: production
+```
diff --git a/doc/ci/runners/README.md b/doc/ci/runners/README.md
deleted file mode 100644
index 0e6c2f63f9e..00000000000
--- a/doc/ci/runners/README.md
+++ /dev/null
@@ -1,9 +0,0 @@
----
-redirect_to: 'index.md'
-remove_date: '2021-09-28'
----
-
-This document was moved to [another location](index.md).
-
-<!-- This redirect file can be deleted after 2021-09-28. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/#move-or-rename-a-page -->
diff --git a/doc/ci/runners/build_cloud/linux_build_cloud.md b/doc/ci/runners/build_cloud/linux_build_cloud.md
index 1125d8dbcb4..6cdc93591a7 100644
--- a/doc/ci/runners/build_cloud/linux_build_cloud.md
+++ b/doc/ci/runners/build_cloud/linux_build_cloud.md
@@ -4,7 +4,7 @@ group: Runner
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Build Cloud runners for Linux
+# Build Cloud runners for Linux **(FREE)**
GitLab Build Cloud runners for Linux run in autoscale mode and are powered by Google Cloud Platform.
@@ -15,13 +15,13 @@ GitLab offers Ultimate tier capabilities and included CI/CD minutes per group pe
All your CI/CD jobs run on [n1-standard-1 instances](https://cloud.google.com/compute/docs/machine-types) with 3.75GB of RAM, CoreOS and the latest Docker Engine
installed. Instances provide 1 vCPU and 25GB of HDD disk space. The default
region of the VMs is US East1.
-Each instance is used only for one job, this ensures any sensitive data left on the system can't be accessed by other people their CI jobs.
+Each instance is used only for one job. This ensures that any sensitive data left on the system can't be accessed by other people's CI/CD jobs.
The `gitlab-shared-runners-manager-X.gitlab.com` fleet of runners are dedicated for GitLab projects as well as community forks of them. They use a slightly larger machine type (n1-standard-2) and have a bigger SSD disk size. They don't run untagged jobs and unlike the general fleet of shared runners, the instances are re-used up to 40 times.
Jobs handled by the shared runners on GitLab.com (`shared-runners-manager-X.gitlab.com`),
**time out after 3 hours**, regardless of the timeout configured in a
-project. Check the issues [4010](https://gitlab.com/gitlab-com/infrastructure/-/issues/4010) and [4070](https://gitlab.com/gitlab-com/infrastructure/-/issues/4070) for the reference.
+project. Check the issues [#4010](https://gitlab.com/gitlab-com/infrastructure/-/issues/4010) and [#4070](https://gitlab.com/gitlab-com/infrastructure/-/issues/4070) for the reference.
Below are the runners' settings.
diff --git a/doc/ci/runners/build_cloud/macos/environment.md b/doc/ci/runners/build_cloud/macos/environment.md
index 5336890b931..8a2417186ae 100644
--- a/doc/ci/runners/build_cloud/macos/environment.md
+++ b/doc/ci/runners/build_cloud/macos/environment.md
@@ -4,7 +4,7 @@ group: Runner
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# VM instances and images for Build Cloud for macOS
+# VM instances and images for Build Cloud for macOS **(FREE)**
When you use the Build Cloud for macOS:
diff --git a/doc/ci/runners/build_cloud/macos_build_cloud.md b/doc/ci/runners/build_cloud/macos_build_cloud.md
index 794bc2e597d..5d55462fb63 100644
--- a/doc/ci/runners/build_cloud/macos_build_cloud.md
+++ b/doc/ci/runners/build_cloud/macos_build_cloud.md
@@ -4,7 +4,7 @@ group: Runner
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Build Cloud runners for macOS (Beta)
+# Build Cloud runners for macOS (Beta) **(FREE SAAS)**
The GitLab Build Cloud for macOS Beta provides on-demand runners integrated with GitLab SaaS [CI/CD](../../../ci/index.md).
Use these runners to build, test, and deploy apps for the Apple ecosystem (macOS, iOS, tvOS). You can take advantage
diff --git a/doc/ci/runners/build_cloud/windows_build_cloud.md b/doc/ci/runners/build_cloud/windows_build_cloud.md
index 0004041a3e8..e01de723055 100644
--- a/doc/ci/runners/build_cloud/windows_build_cloud.md
+++ b/doc/ci/runners/build_cloud/windows_build_cloud.md
@@ -4,7 +4,7 @@ group: Runner
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Build Cloud runners for Windows (beta)
+# Build Cloud runners for Windows (beta) **(FREE)**
GitLab Build Cloud runners for Windows are in [beta](https://about.gitlab.com/handbook/product/gitlab-the-product/#beta)
and shouldn't be used for production workloads.
@@ -19,7 +19,7 @@ the Google Cloud Platform. This solution uses an
developed by GitLab for the [custom executor](https://docs.gitlab.com/runner/executors/custom.html).
Windows runners execute your CI/CD jobs on `n1-standard-2` instances with
2 vCPUs and 7.5 GB RAM. You can find a full list of available Windows packages in
-the [package documentation](https://gitlab.com/gitlab-org/ci-cd/shared-runners/images/gcp/windows-containers/blob/master/cookbooks/preinstalled-software/README.md).
+the [package documentation](https://gitlab.com/gitlab-org/ci-cd/shared-runners/images/gcp/windows-containers/blob/main/cookbooks/preinstalled-software/README.md).
We want to keep iterating to get Windows runners in a stable state and
[generally available](https://about.gitlab.com/handbook/product/gitlab-the-product/#generally-available-ga).
diff --git a/doc/ci/secrets/index.md b/doc/ci/secrets/index.md
index 898d310598f..4d42bc69df8 100644
--- a/doc/ci/secrets/index.md
+++ b/doc/ci/secrets/index.md
@@ -1,6 +1,6 @@
---
-stage: Release
-group: Release
+stage: Configure
+group: Configure
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
type: concepts, howto
---
diff --git a/doc/ci/ssh_keys/index.md b/doc/ci/ssh_keys/index.md
index 1e761643a10..817263374f1 100644
--- a/doc/ci/ssh_keys/index.md
+++ b/doc/ci/ssh_keys/index.md
@@ -10,7 +10,7 @@ type: tutorial
GitLab currently doesn't have built-in support for managing SSH keys in a build
environment (where the GitLab Runner runs).
-The SSH keys can be useful when:
+Use SSH keys when:
1. You want to checkout internal submodules
1. You want to download private packages using your package manager (for example, Bundler)
@@ -45,9 +45,9 @@ check the [visibility of your pipelines](../pipelines/settings.md#change-which-u
When your CI/CD jobs run inside Docker containers (meaning the environment is
contained) and you want to deploy your code in a private server, you need a way
-to access it. This is where an SSH key pair comes in handy.
+to access it. In this case, you can use an SSH key pair.
-1. You first need to create an SSH key pair. For more information, follow
+1. You first must create an SSH key pair. For more information, follow
the instructions to [generate an SSH key](../../ssh/index.md#generate-an-ssh-key-pair).
**Do not** add a passphrase to the SSH key, or the `before_script` will
prompt for it.
@@ -101,7 +101,7 @@ to access it. This is where an SSH key pair comes in handy.
1. As a final step, add the _public_ key from the one you created in the first
step to the services that you want to have an access to from within the build
- environment. If you are accessing a private GitLab repository you need to add
+ environment. If you are accessing a private GitLab repository you must add
it as a [deploy key](../../user/project/deploy_keys/index.md).
That's it! You can now have access to private servers or repositories in your
@@ -130,7 +130,7 @@ on, and use that key for all projects that are run on this machine.
1. As a final step, add the _public_ key from the one you created earlier to the
services that you want to have an access to from within the build environment.
- If you are accessing a private GitLab repository you need to add it as a
+ If you are accessing a private GitLab repository you must add it as a
[deploy key](../../user/project/deploy_keys/index.md).
After generating the key, try to sign in to the remote server to accept the
@@ -163,8 +163,8 @@ ssh-keyscan 1.2.3.4
Create a new [CI/CD variable](../variables/index.md) with
`SSH_KNOWN_HOSTS` as "Key", and as a "Value" add the output of `ssh-keyscan`.
-If you need to connect to multiple servers, all the server host keys
-need to be collected in the **Value** of the variable, one key per line.
+If you must connect to multiple servers, all the server host keys
+must be collected in the **Value** of the variable, one key per line.
NOTE:
By using a variable instead of `ssh-keyscan` directly inside
@@ -175,7 +175,7 @@ so there's something wrong with the server or the network.
Now that the `SSH_KNOWN_HOSTS` variable is created, in addition to the
[content of `.gitlab-ci.yml`](#ssh-keys-when-using-the-docker-executor)
-above, here's what more you need to add:
+above, you must add:
```yaml
before_script:
@@ -209,5 +209,5 @@ We have set up an [Example SSH Project](https://gitlab.com/gitlab-examples/ssh-p
that runs on [GitLab.com](https://gitlab.com) using our publicly available
[shared runners](../runners/index.md).
-Want to hack on it? Simply fork it, commit and push your changes. Within a few
+Want to hack on it? Fork it, commit, and push your changes. In a few
moments the changes is picked by a public runner and the job starts.
diff --git a/doc/ci/triggers/README.md b/doc/ci/triggers/README.md
deleted file mode 100644
index 0e6c2f63f9e..00000000000
--- a/doc/ci/triggers/README.md
+++ /dev/null
@@ -1,9 +0,0 @@
----
-redirect_to: 'index.md'
-remove_date: '2021-09-28'
----
-
-This document was moved to [another location](index.md).
-
-<!-- This redirect file can be deleted after 2021-09-28. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/#move-or-rename-a-page -->
diff --git a/doc/ci/troubleshooting.md b/doc/ci/troubleshooting.md
index 827a89fa99c..994e9294ff6 100644
--- a/doc/ci/troubleshooting.md
+++ b/doc/ci/troubleshooting.md
@@ -50,7 +50,7 @@ and check if their values are what you expect.
## GitLab CI/CD documentation
The [complete `.gitlab-ci.yml` reference](yaml/index.md) contains a full list of
-every keyword you may need to use to configure your pipelines.
+every keyword you can use to configure your pipelines.
You can also look at a large number of pipeline configuration [examples](examples/index.md)
and [templates](examples/index.md#cicd-templates).
@@ -76,7 +76,7 @@ if you are using that type:
### Troubleshooting Guides for CI/CD features
-There are troubleshooting guides available for some CI/CD features and related topics:
+Troubleshooting guides are available for some CI/CD features and related topics:
- [Container Registry](../user/packages/container_registry/index.md#troubleshooting-the-gitlab-container-registry)
- [GitLab Runner](https://docs.gitlab.com/runner/faq/)
@@ -118,7 +118,7 @@ Two pipelines can run when pushing a commit to a branch that has an open merge r
associated with it. Usually one pipeline is a merge request pipeline, and the other
is a branch pipeline.
-This is usually caused by the `rules` configuration, and there are several ways to
+This situation is usually caused by the `rules` configuration, and there are several ways to
[prevent duplicate pipelines](jobs/job_control.md#avoid-duplicate-pipelines).
#### A job is not in the pipeline
@@ -168,7 +168,7 @@ a branch to its remote repository. To illustrate the problem, suppose you've had
1. A new pipeline starts running on the `example` branch again, however,
the previous pipeline (2) fails because of `fatal: reference is not a tree:` error.
-This is because the previous pipeline cannot find a checkout-SHA (which is associated with the pipeline record)
+This occurs because the previous pipeline cannot find a checkout-SHA (which is associated with the pipeline record)
from the `example` branch that the commit history has already been overwritten by the force-push.
Similarly, [Pipelines for merged results](pipelines/pipelines_for_merged_results.md)
might have failed intermittently due to [the same reason](pipelines/pipelines_for_merged_results.md#intermittently-pipelines-fail-by-fatal-reference-is-not-a-tree-error).
@@ -199,6 +199,7 @@ latest commit yet. This might be because:
- You are not using CI/CD pipelines in your project.
- You are using CI/CD pipelines in your project, but your configuration prevented a pipeline from running on the source branch for your merge request.
- The latest pipeline was deleted (this is a [known issue](https://gitlab.com/gitlab-org/gitlab/-/issues/214323)).
+- The source branch of the merge request is on a private fork.
After the pipeline is created, the message updates with the pipeline status.
@@ -262,7 +263,7 @@ To [prevent duplicate pipelines](jobs/job_control.md#avoid-duplicate-pipelines),
[`workflow: rules`](yaml/index.md#workflow) or rewrite your rules to control
which pipelines can run.
-### Console workaround if job using resource_group gets stuck
+### Console workaround if job using resource_group gets stuck **(FREE SELF)**
```ruby
# find resource group by name
diff --git a/doc/ci/unit_test_reports.md b/doc/ci/unit_test_reports.md
index 7677908e93a..c37d7f27970 100644
--- a/doc/ci/unit_test_reports.md
+++ b/doc/ci/unit_test_reports.md
@@ -5,7 +5,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
type: reference
---
-# Unit test reports
+# Unit test reports **(FREE)**
> - [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/45318) in GitLab 11.2. Requires GitLab Runner 11.2 and above.
> - [Renamed](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/39737) from JUnit test reports to Unit test reports in GitLab 13.4.
@@ -67,9 +67,9 @@ execution time and the error output.
### Number of recent failures
-> - [Introduced in Merge Requests](https://gitlab.com/gitlab-org/gitlab/-/issues/241759) in GitLab 13.7.
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/241759) in Merge Requests in GitLab 13.7.
> - [Feature flag removed](https://gitlab.com/gitlab-org/gitlab/-/issues/268249) in GitLab 13.8.
-> - [Introduced in Test Reports](https://gitlab.com/gitlab-org/gitlab/-/issues/235525) in GitLab 13.9.
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/235525) in Test Reports in GitLab 13.9.
If a test failed in the project's default branch in the last 14 days, a message like
`Failed {n} time(s) in {default_branch} in the last 14 days` is displayed for that test.
@@ -328,7 +328,7 @@ phpunit:
## Viewing Unit test reports on GitLab
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/24792) in GitLab 12.5 behind a feature flag (`junit_pipeline_view`), disabled by default.
-> - The feature flag was removed and the feature was [made generally available](https://gitlab.com/gitlab-org/gitlab/-/issues/216478) in GitLab 13.3.
+> - [Feature flag removed](https://gitlab.com/gitlab-org/gitlab/-/issues/216478) in GitLab 13.3.
If JUnit report format XML files are generated and uploaded as part of a pipeline, these reports
can be viewed inside the pipelines details page. The **Tests** tab on this page
@@ -357,7 +357,7 @@ GitLab does not parse very [large nodes](https://nokogiri.org/tutorials/parsing_
## Viewing JUnit screenshots on GitLab
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/202114) in GitLab 13.0 behind the `:junit_pipeline_screenshots_view` feature flag, disabled by default.
-> - The feature flag was removed and was [made generally available](https://gitlab.com/gitlab-org/gitlab/-/issues/216979) in GitLab 13.12.
+> - [Feature flag removed](https://gitlab.com/gitlab-org/gitlab/-/issues/216979) in GitLab 13.12.
Upload your screenshots as [artifacts](yaml/index.md#artifactsreportsjunit) to GitLab. If JUnit
report format XML files contain an `attachment` tag, GitLab parses the attachment. Note that:
diff --git a/doc/ci/variables/README.md b/doc/ci/variables/README.md
deleted file mode 100644
index 0e6c2f63f9e..00000000000
--- a/doc/ci/variables/README.md
+++ /dev/null
@@ -1,9 +0,0 @@
----
-redirect_to: 'index.md'
-remove_date: '2021-09-28'
----
-
-This document was moved to [another location](index.md).
-
-<!-- This redirect file can be deleted after 2021-09-28. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/#move-or-rename-a-page -->
diff --git a/doc/ci/variables/index.md b/doc/ci/variables/index.md
index fa4bc6e39fb..8650adf0351 100644
--- a/doc/ci/variables/index.md
+++ b/doc/ci/variables/index.md
@@ -191,7 +191,7 @@ The output is:
### Add a CI/CD variable to a group
-> Support for [environment scopes](https://gitlab.com/gitlab-org/gitlab/-/issues/2874) added to GitLab Premium in 13.11
+> Support for environment scopes [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/2874) in GitLab Premium 13.11
To make a CI/CD variable available to all projects in a group, define a group CI/CD variable.
@@ -244,7 +244,7 @@ To add an instance variable:
1. Select the **Add variable** button, and fill in the details:
- **Key**: Must be one line, with no spaces, using only letters, numbers, or `_`.
- - **Value**: [In GitLab 13.3 and later](https://gitlab.com/gitlab-org/gitlab/-/issues/220028),
+ - **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).
@@ -301,7 +301,7 @@ An alternative to `File` type variables is to:
```shell
# Read certificate stored in $KUBE_CA_PEM variable and save it in a new file
-echo "$KUBE_CA_PEM" > "$(pwd)/kube.ca.pem"
+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"
```
@@ -346,9 +346,9 @@ The value of the variable must:
- Be a single line.
- Be 8 characters or longer, consisting only of:
- Characters from the Base64 alphabet (RFC4648).
- - The `@` and `:` characters ([In GitLab 12.2](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/63043) and later).
- - The `.` character ([In GitLab 12.10](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/29022) and later).
- - The `~` character ([In GitLab 13.12](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/61517) and later).
+ - The `@` and `:` characters (In [GitLab 12.2 and later](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/63043)).
+ - The `.` character (In [GitLab 12.10 and later](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/29022)).
+ - The `~` character (In [GitLab 13.12 and later](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/61517)).
- Not match the name of an existing predefined or custom CI/CD variable.
NOTE:
diff --git a/doc/ci/variables/predefined_variables.md b/doc/ci/variables/predefined_variables.md
index c8688d2433e..45fa1994342 100644
--- a/doc/ci/variables/predefined_variables.md
+++ b/doc/ci/variables/predefined_variables.md
@@ -20,6 +20,7 @@ There are also [Kubernetes-specific deployment variables](../../user/project/clu
|------------------------------------------|--------|--------|-------------|
| `CHAT_CHANNEL` | 10.6 | all | The Source chat channel that triggered the [ChatOps](../chatops/index.md) command. |
| `CHAT_INPUT` | 10.6 | all | The additional arguments passed with the [ChatOps](../chatops/index.md) command. |
+| `CHAT_USER_ID` | 14.4 | all | The chat service's user ID of the user who triggered the [ChatOps](../chatops/index.md) command. |
| `CI` | all | 0.4 | Available for all jobs executed in CI/CD. `true` when available. |
| `CI_API_V4_URL` | 11.7 | all | The GitLab API v4 root URL. |
| `CI_BUILDS_DIR` | all | 11.10 | The top-level directory where builds are executed. |
diff --git a/doc/ci/variables/where_variables_can_be_used.md b/doc/ci/variables/where_variables_can_be_used.md
index 0f9339657fe..9fd1e3eb1a4 100644
--- a/doc/ci/variables/where_variables_can_be_used.md
+++ b/doc/ci/variables/where_variables_can_be_used.md
@@ -5,7 +5,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
type: reference
---
-# Where variables can be used
+# Where variables can be used **(FREE)**
As it's described in the [CI/CD variables](index.md) docs, you can
define many different variables. Some of them can be used for all GitLab CI/CD
@@ -65,9 +65,10 @@ because the expansion is done in GitLab before any runner gets the job.
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/48627) in GitLab 13.10. [Deployed behind the `variable_inside_variable` feature flag](../../user/feature_flags.md), disabled by default.
> - [Enabled on GitLab.com](https://gitlab.com/gitlab-org/gitlab/-/issues/297382) in GitLab 14.3.
+> - [Enabled on self-managed](https://gitlab.com/gitlab-org/gitlab/-/issues/297382) in GitLab 14.4.
FLAG:
-On self-managed GitLab, by default this feature is disabled. To enable the feature per project or for your entire instance, ask an administrator to [enable the `variable_inside_variable` flag](../../administration/feature_flags.md).
+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 `variable_inside_variable`. On GitLab.com, this feature is available.
GitLab expands job variable values recursively before sending them to the runner. For example:
diff --git a/doc/ci/yaml/README.md b/doc/ci/yaml/README.md
deleted file mode 100644
index 0e6c2f63f9e..00000000000
--- a/doc/ci/yaml/README.md
+++ /dev/null
@@ -1,9 +0,0 @@
----
-redirect_to: 'index.md'
-remove_date: '2021-09-28'
----
-
-This document was moved to [another location](index.md).
-
-<!-- This redirect file can be deleted after 2021-09-28. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/#move-or-rename-a-page -->
diff --git a/doc/ci/yaml/index.md b/doc/ci/yaml/index.md
index fb5748788f7..aa44400fffc 100644
--- a/doc/ci/yaml/index.md
+++ b/doc/ci/yaml/index.md
@@ -10,7 +10,7 @@ type: reference
This document lists the configuration options for your GitLab `.gitlab-ci.yml` file.
- For a quick introduction to GitLab CI/CD, follow the [quick start guide](../quick_start/index.md).
-- For a collection of examples, see [GitLab CI/CD Examples](../examples/README.md).
+- For a collection of examples, see [GitLab CI/CD Examples](../examples/index.md).
- To view a large `.gitlab-ci.yml` file used in an enterprise, see the [`.gitlab-ci.yml` file for `gitlab`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/.gitlab-ci.yml).
When you are editing your `.gitlab-ci.yml` file, you can validate it with the
@@ -446,15 +446,15 @@ that proposes expanding this feature to support more variables.
#### `rules` with `include`
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/276515) in GitLab 14.2.
-> - [Enabled on GitLab.com](https://gitlab.com/gitlab-org/gitlab/-/issues/337507) in GitLab 14.3 and is ready for production use.
-> - [Enabled with `ci_include_rules` flag](https://gitlab.com/gitlab-org/gitlab/-/issues/337507) for self-managed GitLab in GitLab 14.3 and is ready for production use.
-
-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 `ci_include_rules` flag](../../administration/feature_flags.md). On GitLab.com, this feature is available.
+> - 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.
You can use [`rules`](#rules) with `include` to conditionally include other configuration files.
-You can only use `rules:if` in `include` with [certain variables](#variables-with-include).
+You can only use [`if` rules](#rulesif) in `include`, and only with [certain variables](#variables-with-include).
+`rules` keywords such as `changes` and `exists` are not supported.
```yaml
include:
@@ -746,9 +746,9 @@ Use `before_script` to define an array of commands that should run before each j
```yaml
job:
before_script:
- - echo "Execute this command before any `script:` commands."
+ - echo "Execute this command before any 'script:' commands."
script:
- - echo "This command executes after the job's `before_script` commands."
+ - echo "This command executes after the job's 'before_script' commands."
```
**Additional details**:
@@ -794,7 +794,7 @@ job:
Scripts you specify in `after_script` execute in a new shell, separate from any
`before_script` or `script` commands. As a result, they:
-- Have a current working directory set back to the default.
+- Have the current working directory set back to the default (according to the [variables which define how the runner processes Git requests](#configure-runner-behavior-with-variables)).
- Don't have access to changes done by commands defined in the `before_script` or `script`,
including:
- Command aliases and variables exported in `script` scripts.
@@ -1178,6 +1178,7 @@ job:
all rules. You can't mix `when` at the job-level with `when` in rules.
- Unlike variables in [`script`](../variables/index.md#use-cicd-variables-in-job-scripts)
sections, variables in rules expressions are always formatted as `$VARIABLE`.
+ - You can use `rules:if` with `include` to [conditionally include other configuration files](#rules-with-include).
**Related topics**:
@@ -1701,6 +1702,8 @@ same group or namespace, you can omit them from the `project:` keyword. For exam
The user running the pipeline must have at least `reporter` access to the group or project, or the group/project must have public visibility.
+You cannot use cross project artifact downloads in the same job as [`trigger`](#trigger).
+
##### Artifact downloads between pipelines in the same project
Use `needs` to download artifacts from different pipelines in the current project.
@@ -2220,7 +2223,7 @@ For more information, see
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/27630) in GitLab 12.6.
Use the `kubernetes` keyword to configure deployments to a
-[Kubernetes cluster](../../user/project/clusters/index.md) that is associated with your project.
+[Kubernetes cluster](../../user/infrastructure/clusters/index.md) that is associated with your project.
For example:
@@ -2243,7 +2246,7 @@ For more information, see
NOTE:
Kubernetes configuration is not supported for Kubernetes clusters
-that are [managed by GitLab](../../user/project/clusters/index.md#gitlab-managed-clusters).
+that are [managed by GitLab](../../user/project/clusters/gitlab_managed_clusters.md).
To follow progress on support for GitLab-managed clusters, see the
[relevant issue](https://gitlab.com/gitlab-org/gitlab/-/issues/38054).
@@ -3258,15 +3261,16 @@ job:
### `coverage`
-Use `coverage` to configure how code coverage is extracted from the
-job output.
+Use `coverage` with a custom regular expression to configure how code coverage
+is extracted from the job output. The coverage is shown in the UI if at least one
+line in the job output matches the regular expression.
-Regular expressions are the only valid kind of value expected here. So, using
-surrounding `/` is mandatory to consistently and explicitly represent
-a regular expression string. You must escape special characters if you want to
-match them literally.
+To extract the code coverage value in the matching line, GitLab uses this
+regular expression: `\d+(\.\d+)?`.
-For example:
+**Possible inputs**: A regular expression. Must start and end with `/`.
+
+**Example of `coverage`**:
```yaml
job1:
@@ -3274,14 +3278,20 @@ job1:
coverage: '/Code coverage: \d+\.\d+/'
```
-The coverage is shown in the UI if at least one line in the job output matches the regular expression.
-If there is more than one matched line in the job output, the last line is used.
-For the matched line, the first occurrence of `\d+(\.\d+)?` is the code coverage.
-Leading zeros are removed.
+In this example:
+
+1. GitLab checks the job log for a line that matches the regular expression. A line
+ like `Code coverage: 67.89` would match.
+1. GitLab then checks the line to find a match to `\d+(\.\d+)?`. The sample matching
+ line above gives a code coverage of `67.89`.
+
+**Additional details**:
-Coverage output from [child pipelines](../pipelines/parent_child_pipelines.md) is not recorded
-or displayed. Check [the related issue](https://gitlab.com/gitlab-org/gitlab/-/issues/280818)
-for more details.
+- If there is more than one matched line in the job output, the last line is used.
+- Leading zeros are removed.
+- Coverage output from [child pipelines](../pipelines/parent_child_pipelines.md)
+ is not recorded or displayed. Check [the related issue](https://gitlab.com/gitlab-org/gitlab/-/issues/280818)
+ for more details.
### `dast_configuration` **(ULTIMATE)**
@@ -3331,56 +3341,38 @@ to select a specific site profile and scanner profile.
> [Introduced](https://gitlab.com/gitlab-org/gitlab-runner/-/issues/3515) in GitLab 11.5, you can control which failures to retry on.
-Use `retry` to configure how many times a job is retried in
-case of a failure.
-
-When a job fails, the job is processed again,
-until the limit specified by the `retry` keyword is reached.
+Use `retry` to configure how many times a job is retried if it fails.
+If not defined, defaults to `0` and jobs do not retry.
-If `retry` is set to `2`, and a job succeeds in a second run (first retry), it is not retried.
-The `retry` value must be a positive integer, from `0` to `2`
-(two retries maximum, three runs in total).
+When a job fails, the job is processed up to two more times, until it succeeds or
+reaches the maximum number of retries.
-The following example retries all failure cases:
-
-```yaml
-test:
- script: rspec
- retry: 2
-```
+By default, all failure types cause the job to be retried. Use [`retry:when`](#retrywhen)
+to select which failures to retry on.
-By default, a job is retried on all failure cases. To have better control
-over which failures to retry, `retry` can be a hash with the following keys:
+**Keyword type**: Job keyword. You can use it only as part of a job or in the
+[`default:` section](#custom-default-keyword-values).
-- `max`: The maximum number of retries.
-- `when`: The failure cases to retry.
+**Possible inputs**: `0` (default), `1`, or `2`.
-To retry only runner system failures at maximum two times:
+**Example of `retry`**:
```yaml
test:
script: rspec
- retry:
- max: 2
- when: runner_system_failure
+ retry: 2
```
-If there is another failure, other than a runner system failure, the job
-is not retried.
+#### `retry:when`
-To retry on multiple failure cases, `when` can also be an array of failures:
+Use `retry:when` with `retry:max` to retry jobs for only specific failure cases.
+`retry:max` is the maximum number of retries, like [`retry`](#retry), and can be
+`0`, `1`, or `2`.
-```yaml
-test:
- script: rspec
- retry:
- max: 2
- when:
- - runner_system_failure
- - stuck_or_timeout_failure
-```
+**Keyword type**: Job keyword. You can use it only as part of a job or in the
+[`default:` section](#custom-default-keyword-values).
-Possible values for `when` are:
+**Possible inputs**: A single failure type, or an array of one or more failure types:
<!--
If you change any of the values below, make sure to update the `RETRY_WHEN_IN_DOCUMENTATION`
@@ -3396,7 +3388,6 @@ Possible values for `when` are:
- `api_failure`: Retry on API failure.
- `stuck_or_timeout_failure`: Retry when the job got stuck or timed out.
- `runner_system_failure`: Retry if there is a runner system failure (for example, job setup failed).
-- `missing_dependency_failure`: Retry if a dependency is missing.
- `runner_unsupported`: Retry if the runner is unsupported.
- `stale_schedule`: Retry if a delayed job could not be executed.
- `job_execution_timeout`: Retry if the script exceeded the maximum execution time set for the job.
@@ -3405,7 +3396,34 @@ Possible values for `when` are:
- `scheduler_failure`: Retry if the scheduler failed to assign the job to a runner.
- `data_integrity_failure`: Retry if there is a structural integrity problem detected.
-You can specify the number of [retry attempts for certain stages of job execution](../runners/configure_runners.md#job-stages-attempts) using variables.
+**Example of `retry:when`** (single failure type):
+
+```yaml
+test:
+ script: rspec
+ retry:
+ max: 2
+ when: runner_system_failure
+```
+
+If there is a failure other than a runner system failure, the job is not retried.
+
+**Example of `retry:when`** (array of failure types):
+
+```yaml
+test:
+ script: rspec
+ retry:
+ max: 2
+ when:
+ - runner_system_failure
+ - stuck_or_timeout_failure
+```
+
+**Related topics**:
+
+You can specify the number of [retry attempts for certain stages of job execution](../runners/configure_runners.md#job-stages-attempts)
+using variables.
### `timeout`
@@ -3859,7 +3877,7 @@ can be deployed to, but there can be only one deployment per device at any given
The `resource_group` value can only contain letters, digits, `-`, `_`, `/`, `$`, `{`, `}`, `.`, and spaces.
It can't start or end with `/`.
-For more information, see [Deployments Safety](../environments/deployment_safety.md).
+For more information, see [Resource Group documentation](../resource_groups/index.md).
#### Pipeline-level concurrency control with Cross-Project/Parent-Child pipelines
diff --git a/doc/development/README.md b/doc/development/README.md
deleted file mode 100644
index 0e6c2f63f9e..00000000000
--- a/doc/development/README.md
+++ /dev/null
@@ -1,9 +0,0 @@
----
-redirect_to: 'index.md'
-remove_date: '2021-09-28'
----
-
-This document was moved to [another location](index.md).
-
-<!-- This redirect file can be deleted after 2021-09-28. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/#move-or-rename-a-page -->
diff --git a/doc/development/adding_database_indexes.md b/doc/development/adding_database_indexes.md
index 16dd581113c..9ca08ab1dc2 100644
--- a/doc/development/adding_database_indexes.md
+++ b/doc/development/adding_database_indexes.md
@@ -275,7 +275,8 @@ You can verify if the MR was deployed to GitLab.com by executing
`/chatops run auto_deploy status <merge_sha>`. To verify existence of
the index, you can:
-- Use a meta-command in #database-lab, such as: `\di <index_name>`
+- 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
diff --git a/doc/development/application_slis/index.md b/doc/development/application_slis/index.md
new file mode 100644
index 00000000000..c1d7ac9fa0c
--- /dev/null
+++ b/doc/development/application_slis/index.md
@@ -0,0 +1,130 @@
+---
+stage: Platforms
+group: Scalability
+info: To 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 Application Service Level Indicators (SLIs)
+
+> [Introduced](https://gitlab.com/groups/gitlab-com/gl-infra/-/epics/525) in GitLab 14.4
+
+It is possible to define [Service Level Indicators
+(SLIs)](https://en.wikipedia.org/wiki/Service_level_indicator)
+directly in the Ruby codebase. This keeps the definition of operations
+and their success close to the implementation and allows the people
+building features to easily define how these features should be
+monitored.
+
+Defining an SLI causes 2
+[Prometheus
+counters](https://prometheus.io/docs/concepts/metric_types/#counter)
+to be emitted from the rails application:
+
+- `gitlab_sli:<sli name>:total`: incremented for each operation.
+- `gitlab_sli:<sli_name>:success_total`: incremented for successful
+ operations.
+
+## Existing SLIs
+
+1. [`rails_request_apdex`](rails_request_apdex.md)
+
+## Defining a new SLI
+
+An SLI can be defined using the `Gitlab::Metrics::Sli` class.
+
+Before the first scrape, it is important to have [initialized the SLI
+with all possible
+label-combinations](https://prometheus.io/docs/practices/instrumentation/#avoid-missing-metrics). This
+avoid confusing results when using these counters in calculations.
+
+To initialize an SLI, use the `.inilialize_sli` class method, for
+example:
+
+```ruby
+Gitlab::Metrics::Sli.initialize_sli(:received_email, [
+ {
+ feature_category: :issue_tracking,
+ email_type: :create_issue
+ },
+ {
+ feature_category: :service_desk,
+ email_type: :service_desk
+ },
+ {
+ feature_category: :code_review,
+ email_type: :create_merge_request
+ }
+])
+```
+
+Metrics must be initialized before they get
+scraped for the first time. This could be done at the start time of the
+process that will emit them, in which case we need to pay attention
+not to increase application's boot time too much. This is preferable
+if possible.
+
+Alternatively, if initializing would take too long, this can be done
+during the first scrape. We need to make sure we don't do it for every
+scrape. This can be done as follows:
+
+```ruby
+def initialize_request_slis_if_needed!
+ return if Gitlab::Metrics::Sli.initialized?(:rails_request_apdex)
+ Gitlab::Metrics::Sli.initialize_sli(:rails_request_apdex, possible_request_labels)
+end
+```
+
+Also pay attention to do it for the different metrics
+endpoints we have. Currently the
+[`WebExporter`](https://gitlab.com/gitlab-org/gitlab/blob/master/lib/gitlab/metrics/exporter/web_exporter.rb)
+and the
+[`HealthController`](https://gitlab.com/gitlab-org/gitlab/blob/master/app/controllers/health_controller.rb)
+for Rails and
+[`SidekiqExporter`](https://gitlab.com/gitlab-org/gitlab/blob/master/lib/gitlab/metrics/exporter/sidekiq_exporter.rb)
+for Sidekiq.
+
+## Tracking operations for an SLI
+
+Tracking an operation in the newly defined SLI can be done like this:
+
+```ruby
+Gitlab::Metrics::Sli[:received_email].increment(
+ labels: {
+ feature_category: :service_desk,
+ email_type: :service_desk
+ },
+ success: issue_created?
+)
+```
+
+Calling `#increment` on this SLI will increment the total Prometheus counter
+
+```prometheus
+gitlab_sli:received_email:total{ feature_category='service_desk', email_type='service_desk' }
+```
+
+If the `success:` argument passed is truthy, then the success counter
+will also be incremented:
+
+```prometheus
+gitlab_sli:received_email:success_total{ feature_category='service_desk', email_type='service_desk' }
+```
+
+## Using the SLI in service monitoring and alerts
+
+When the application is emitting metrics for the new SLI, those need
+to be consumed in the service catalog to result in alerts, and be
+included in the error budget for stage groups and GitLab.com's overall
+availability.
+
+This is currently being worked on in [this
+project](https://gitlab.com/groups/gitlab-com/gl-infra/-/epics/573). As
+part of [this
+issue](https://gitlab.com/gitlab-com/gl-infra/scalability/-/issues/1307)
+we will update the documentation.
+
+For any question, please don't hesitate to createan issue in [the
+Scalability issue
+tracker](https://gitlab.com/gitlab-com/gl-infra/scalability/-/issues)
+or come find us in
+[#g_scalability](https://gitlab.slack.com/archives/CMMF8TKR9) on Slack.
diff --git a/doc/development/application_slis/rails_request_apdex.md b/doc/development/application_slis/rails_request_apdex.md
new file mode 100644
index 00000000000..e1ab5368578
--- /dev/null
+++ b/doc/development/application_slis/rails_request_apdex.md
@@ -0,0 +1,234 @@
+---
+stage: Platforms
+group: Scalability
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
+---
+
+# Rails request apdex SLI
+
+> [Introduced](https://gitlab.com/groups/gitlab-com/gl-infra/-/epics/525) in GitLab 14.4
+
+NOTE:
+This SLI is not yet used in [error budgets for stage
+groups](../stage_group_dashboards.md#error-budget) or service
+monitoring. This is being worked on in [this
+project](https://gitlab.com/groups/gitlab-com/gl-infra/-/epics/573).
+
+The request apdex SLI is [an SLI defined in the application](index.md)
+that measures the duration of successful requests as an indicator for
+application performance. This includes the REST and GraphQL API, and the
+regular controller endpoints. It consists of these counters:
+
+1. `gitlab_sli:rails_request_apdex:total`: This counter gets
+ incremented for every request that did not result in a response
+ with a 5xx status code. This means that slow failures don't get
+ counted twice: The request is already counted in the error-SLI.
+
+1. `gitlab_sli:rails_request_apdex:success_total`: This counter gets
+ incremented for every successful request that performed faster than
+ the [defined target duration depending on the endpoint's
+ urgency](#adjusting-request-urgency).
+
+Both these counters are labeled with:
+
+1. `endpoint_id`: The identification of the Rails Controller or the
+ Grape-API endpoint
+
+1. `feature_category`: The feature category specified for that
+ controller or API endpoint.
+
+## Request Apdex SLO
+
+These counters can be combined into a success ratio, the objective for
+this ratio is defined in the service catalog per service:
+
+1. [Web: 0.998](https://gitlab.com/gitlab-com/runbooks/blob/master/metrics-catalog/services/web.jsonnet#L19)
+1. [API: 0.995](https://gitlab.com/gitlab-com/runbooks/blob/master/metrics-catalog/services/api.jsonnet#L19)
+1. [Git: 0.998](https://gitlab.com/gitlab-com/runbooks/blob/master/metrics-catalog/services/git.jsonnet#L22)
+
+This means that for this SLI to meet SLO, the ratio recorded needs to
+be higher than those defined above.
+
+For example: for the web-service, we want at least 99.8% of requests
+to be faster than their target duration.
+
+These are the targets we use for alerting and service montoring. So
+durations should be set keeping those into account. So we would not
+cause alerts. But the goal would be to set the urgency to a target
+that users would be satisfied with.
+
+Both successful measurements and unsuccessful ones have an impact on the
+error budget for stage groups.
+
+## Adjusting request urgency
+
+Not all endpoints perform the same type of work, so it is possible to
+define different urgencies for different endpoints. An endpoint with a
+lower urgency can have a longer request duration than endpoints that
+are high urgency.
+
+Long-running requests are more expensive for our
+infrastructure: while one request is being served, the thread remains
+occupied for the duration of that request. So nothing else can be handled by that
+thread. Because of Ruby's Global VM Lock, the thread might keep the
+lock and stall other requests handled by the same Puma worker
+process. The request is in fact a noisy neighbor for other requests
+handled by the worker. This is why the upper bound for a target
+duration is capped at 5 seconds.
+
+## Decreasing the urgency (setting a higher target duration)
+
+Increasing the urgency on an existing endpoint can be done on
+a case-by-case basis. Please take the following into account:
+
+1. Apdex is about perceived performance, if a user is actively waiting
+ for the result of a request, waiting 5 seconds might not be
+ acceptable. While if the endpoint is used by an automation
+ requiring a lot of data, 5 seconds could be okay.
+
+ A product manager can help to identify how an endpoint is used.
+
+1. The workload for some endpoints can sometimes differ greatly
+ depending on the parameters specified by the caller. The urgency
+ needs to accomodate that. In some cases, it might be interesting to
+ define a separate [application SLI](index.md#defining-a-new-sli)
+ for what the endpoint is doing.
+
+ When the endpoints in certain cases turn into no-ops, making them
+ very fast, we should ignore these fast requests when setting the
+ target. For example, if the `MergeRequests::DraftsController` is
+ hit for every merge request being viewed, but doesn't need to
+ render anything in most cases, then we should pick the target that
+ would still accomodate the endpoint performing work.
+
+1. Consider the dependent resources consumed by the endpoint. If the endpoint
+ loads a lot of data from Gitaly or the database and this is causing
+ it to not perform satisfactory. It could be better to optimize the
+ way the data is loaded rather than increasing the target duration
+ by lowering the urgency.
+
+ In cases like this, it might be appropriate to temporarily decrease
+ urgency to make the endpoint meet SLO, if this is bearable for the
+ infrastructure. In such cases, please link an issue from a code
+ comment.
+
+ If the endpoint consumes a lot of CPU time, we should also consider
+ this: these kinds of requests are the kind of noisy neighbors we
+ should try to keep as short as possible.
+
+1. Traffic characteristics should also be taken into account: if the
+ trafic to the endpoint is bursty, like CI traffic spinning up a
+ big batch of jobs hitting the same endpoint, then having these
+ endpoints take 5s is not acceptable from an infrastructure point of
+ view. We cannot scale up the fleet fast enough to accomodate for
+ the incoming slow requests alongside the regular traffic.
+
+When lowering the urgency for an existing endpoint, please involve a
+[Scalability team member](https://about.gitlab.com/handbook/engineering/infrastructure/team/scalability/#team-members)
+in the review. We can use request rates and durations available in the
+logs to come up with a recommendation. Picking a threshold can be done
+using the same process as for [increasing
+urgency](#increasing-urgency-setting-a-lower-target-duration), picking
+a duration that is higher than the SLO for the service.
+
+We shouldn't set the longest durations on endpoints in the merge
+requests that introduces them, since we don't yet have data to support
+the decision.
+
+## Increasing urgency (setting a lower target duration)
+
+When decreasing the target duration, we need to make sure the endpoint
+still meets SLO for the fleet that handles the request. You can use the
+information in the logs to determine this:
+
+1. Open [this table in
+ Kibana](https://log.gprd.gitlab.net/goto/bbb6465c68eb83642269e64a467df3df)
+
+1. The table loads information for the busiest endpoints by
+ default. You can speed things up by adding a filter for
+ `json.caller_id.keyword` and adding the identifier you're intersted
+ in (for example: `Projects::RawController#show`).
+
+1. Check the [appropriate percentile duration](#request-apdex-slo) for
+ the service the endpoint is handled by. The overall duration should
+ be lower than the target you intend to set.
+
+1. If the overall duration is below the intended targed. Please also
+ check the peaks over time in [this
+ graph](https://log.gprd.gitlab.net/goto/9319c4a402461d204d13f3a4924a89fc)
+ in Kibana. Here, the percentile in question should not peak above
+ the target duration we want to set.
+
+Since decreasing a threshold too much could result in alerts for the
+apdex degradation, please also involve a Scalability team member in
+the merge reqeust.
+
+## How to adjust the urgency
+
+The urgency can be specified similar to how endpoints [get a feature
+category](../feature_categorization/index.md).
+
+For endpoints that don't have a specific target, the default urgency (1s duration) will be used.
+
+The following configurations are available:
+
+| Urgency | Duration in seconds | Notes |
+|----------|---------------------|-----------------------------------------------|
+| :high | 0.25s | |
+| :medium | 0.5s | |
+| :default | 1s | This is the default when nothing is specified |
+| :low | 5s | |
+
+### Rails controller
+
+An urgency can be specified for all actions in a controller like this:
+
+```ruby
+class Boards::ListsController < ApplicationController
+ urgency :high
+end
+```
+
+To specify the urgency also for certain actions in a controller, they
+can be specified like this:
+
+```ruby
+class Boards::ListsController < ApplicationController
+ urgency :high, [:index, :show]
+end
+```
+
+### Grape endpoints
+
+To specify the urgency for an entire API class, this can be done as
+follows:
+
+```ruby
+module API
+ class Issues < ::API::Base
+ urgency :low
+ end
+end
+```
+
+To specify the urgency also for certain actions in a API class, they
+can be specified like this:
+
+```ruby
+module API
+ class Issues < ::API::Base
+ urgency :medium, [
+ '/groups/:id/issues',
+ '/groups/:id/issues_statistics'
+ ]
+ end
+end
+```
+
+Or, we can specify the urgency per endpoint:
+
+```ruby
+get 'client/features', urgency: :low do
+ # endpoint logic
+end
+```
diff --git a/doc/development/architecture.md b/doc/development/architecture.md
index fe2b621da29..9accd4a3595 100644
--- a/doc/development/architecture.md
+++ b/doc/development/architecture.md
@@ -813,7 +813,7 @@ Starting with GitLab 13.0, Puma is the default web server.
- [Project page](https://gitlab.com/gitlab-org/gitlab/-/blob/master/README.md)
- Configuration:
- - [Omnibus](https://docs.gitlab.com/omnibus/settings/puma.html)
+ - [Omnibus](../administration/operations/puma.md)
- [Charts](https://docs.gitlab.com/charts/charts/gitlab/webservice/)
- [Source](../install/installation.md#configure-it)
- [GDK](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/gitlab.yml.example)
diff --git a/doc/development/cascading_settings.md b/doc/development/cascading_settings.md
index 0fa0e220ba9..a85fc52d303 100644
--- a/doc/development/cascading_settings.md
+++ b/doc/development/cascading_settings.md
@@ -135,7 +135,7 @@ Renders the enforcement checkbox.
| `attribute` | Name of the setting. For example, `:delayed_project_removal`. | `String` or `Symbol` | `true` |
| `group` | Current group. | [`Group`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/models/group.rb) | `true` |
| `form` | [Rails FormBuilder object](https://apidock.com/rails/ActionView/Helpers/FormBuilder). | [`ActionView::Helpers::FormBuilder`](https://apidock.com/rails/ActionView/Helpers/FormBuilder) | `true` |
-| `setting_locked` | If the setting is locked by an ancestor group or admin setting. Can be calculated with [`cascading_namespace_setting_locked?`](https://gitlab.com/gitlab-org/gitlab/-/blob/c2736823b8e922e26fd35df4f0cd77019243c858/app/helpers/namespaces_helper.rb#L86). | `Boolean` | `true` |
+| `setting_locked` | If the setting is locked by an ancestor group or administrator setting. Can be calculated with [`cascading_namespace_setting_locked?`](https://gitlab.com/gitlab-org/gitlab/-/blob/c2736823b8e922e26fd35df4f0cd77019243c858/app/helpers/namespaces_helper.rb#L86). | `Boolean` | `true` |
| `help_text` | Text shown below the checkbox. | `String` | `false` (Subgroups cannot change this setting.) |
[`_setting_label_checkbox.html.haml`](https://gitlab.com/gitlab-org/gitlab/-/blob/c2736823b8e922e26fd35df4f0cd77019243c858/app/views/shared/namespaces/cascading_settings/_setting_label_checkbox.html.haml)
@@ -147,7 +147,7 @@ Renders the label for a checkbox setting.
| `attribute` | Name of the setting. For example, `:delayed_project_removal`. | `String` or `Symbol` | `true` |
| `group` | Current group. | [`Group`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/models/group.rb) | `true` |
| `form` | [Rails FormBuilder object](https://apidock.com/rails/ActionView/Helpers/FormBuilder). | [`ActionView::Helpers::FormBuilder`](https://apidock.com/rails/ActionView/Helpers/FormBuilder) | `true` |
-| `setting_locked` | If the setting is locked by an ancestor group or admin setting. Can be calculated with [`cascading_namespace_setting_locked?`](https://gitlab.com/gitlab-org/gitlab/-/blob/c2736823b8e922e26fd35df4f0cd77019243c858/app/helpers/namespaces_helper.rb#L86). | `Boolean` | `true` |
+| `setting_locked` | If the setting is locked by an ancestor group or administrator setting. Can be calculated with [`cascading_namespace_setting_locked?`](https://gitlab.com/gitlab-org/gitlab/-/blob/c2736823b8e922e26fd35df4f0cd77019243c858/app/helpers/namespaces_helper.rb#L86). | `Boolean` | `true` |
| `settings_path_helper` | Lambda function that generates a path to the ancestor setting. For example, `settings_path_helper: -> (locked_ancestor) { edit_group_path(locked_ancestor, anchor: 'js-permissions-settings') }` | `Lambda` | `true` |
| `help_text` | Text shown below the checkbox. | `String` | `false` (`nil`) |
diff --git a/doc/development/changelog.md b/doc/development/changelog.md
index be46d61eb4c..2753257c941 100644
--- a/doc/development/changelog.md
+++ b/doc/development/changelog.md
@@ -62,8 +62,8 @@ The value must be the full URL of the merge request.
### GitLab Enterprise changes
-If a change is for GitLab Enterprise Edition, you must also add the trailer `EE:
-true`:
+If a change is exclusively for GitLab Enterprise Edition, **you must add** the
+trailer `EE: true`:
```plaintext
Update git vendor to gitlab
@@ -77,6 +77,8 @@ MR: https://gitlab.com/foo/bar/-/merge_requests/123
EE: true
```
+**Do not** add the trailer for changes that apply to both EE and CE.
+
## What warrants a changelog entry?
- Any change that introduces a database migration, whether it's regular, post,
diff --git a/doc/development/cicd/index.md b/doc/development/cicd/index.md
index b4e32066ba8..82fd37eacaf 100644
--- a/doc/development/cicd/index.md
+++ b/doc/development/cicd/index.md
@@ -157,7 +157,7 @@ On top of that, we have the following types of jobs:
- `Ci::Build` ... The job to be executed by runners.
- `Ci::Bridge` ... The job to trigger a downstream pipeline.
-- `GenericCommitStatus` ... The job to be executed in an external CI/CD system e.g. Jenkins.
+- `GenericCommitStatus` ... The job to be executed in an external CI/CD system, for example Jenkins.
When you use the "Job" terminology in codebase, readers would
assume that the class/object is any type of above.
diff --git a/doc/development/cicd/templates.md b/doc/development/cicd/templates.md
index 3fc464e661f..b74a1d0d58a 100644
--- a/doc/development/cicd/templates.md
+++ b/doc/development/cicd/templates.md
@@ -325,8 +325,14 @@ projects on `gitlab.com`:
After you're confident the latest template can be moved to stable:
1. Update the stable template with the content of the latest version.
+1. Remove the migration template from `Gitlab::Template::GitlabCiYmlTemplate::TEMPLATES_WITH_LATEST_VERSION` const.
1. Remove the corresponding feature flag.
+NOTE:
+Feature flags are enabled by default in RSpec, so all tests are performed
+against the latest templates. You should also test the stable templates
+with `stub_feature_flags(redirect_to_latest_template_<name>: false)`.
+
### Further reading
There is an [open issue](https://gitlab.com/gitlab-org/gitlab/-/issues/17716) about
diff --git a/doc/development/code_review.md b/doc/development/code_review.md
index 12cc63ef56d..89516c2168b 100644
--- a/doc/development/code_review.md
+++ b/doc/development/code_review.md
@@ -106,6 +106,7 @@ with [domain expertise](#domain-experts).
1. If your merge request includes user-facing changes (*3*), it must be
**approved by a [Product Designer](https://about.gitlab.com/handbook/engineering/projects/#gitlab_reviewers_UX)**,
based on assignments in the appropriate [DevOps stage group](https://about.gitlab.com/handbook/product/categories/#devops-stages).
+ See the [design and user interface guidelines](contributing/design.md) for details.
1. If your merge request includes adding a new JavaScript library (*1*)...
- If the library significantly increases the
[bundle size](https://gitlab.com/gitlab-org/frontend/playground/webpack-memory-metrics/-/blob/master/doc/report.md), it must
@@ -156,7 +157,7 @@ See the [test engineering process](https://about.gitlab.com/handbook/engineering
1. I have confirmed that this change is [backwards compatible across updates](multi_version_compatibility.md), or I have decided that this does not apply.
1. I have properly separated EE content from FOSS, or this MR is FOSS only.
- [Where should EE code go?](ee_features.md#separation-of-ee-code)
-1. If I am introducing a new expectation for existing data, I have confirmed that existing data meets this expectation or I have made this expectation optional rather than required.
+1. I 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.
##### Performance, reliability, and availability
diff --git a/doc/development/contributing/design.md b/doc/development/contributing/design.md
index 9e8375fcbdd..e85f5dd8349 100644
--- a/doc/development/contributing/design.md
+++ b/doc/development/contributing/design.md
@@ -5,34 +5,119 @@ group: Development
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Implement design & UI elements
+# Design and user interface changes
-For guidance on UX implementation at GitLab, please refer to our [Design System](https://design.gitlab.com/).
+Follow these guidelines when contributing or reviewing design and user interface
+(UI) changes. Refer to our [code review guide](../code_review.md) for broader
+advice and best practices for code review in general.
-The UX team uses labels to manage their workflow.
+The basis for most of these guidelines is [Pajamas](https://design.gitlab.com/),
+GitLab design system. We encourage you to [contribute to Pajamas](https://design.gitlab.com/get-started/contribute/)
+with additions and improvements.
-The `~UX` label on an issue is a signal to the UX team that it will need UX attention.
-To better understand the priority by which UX tackles issues, see the [UX section](https://about.gitlab.com/handbook/engineering/ux/) of the handbook.
+## Merge request reviews
-Once an issue has been worked on and is ready for development, a UXer removes the `~UX` label and applies the `~"UX ready"` label to that issue.
+As a merge request (MR) author, you must include _Before_ and _After_
+screenshots (or videos) of your changes in the description, as explained in our
+[MR workflow](merge_request_workflow.md). These screenshots/videos are very helpful
+for all reviewers and can speed up the review process, especially if the changes
+are small.
-There is a special type label called `~"product discovery"` intended for UX (user experience),
-PM (product manager), FE (frontend), and BE (backend). It represents a discovery issue to discuss the problem and
-potential solutions. The final output for this issue could be a doc of
-requirements, a design artifact, or even a prototype. The solution will be
-developed in a subsequent milestone.
+## Checklist
-`~"product discovery"` issues are like any other issue and should contain a milestone label, `~Deliverable` or `~Stretch`, when scheduled in the current milestone.
+Check these aspects both when _designing_ and _reviewing_ UI changes.
-The initial issue should be about the problem we are solving. If a separate [product discovery issue](https://about.gitlab.com/handbook/engineering/ux/ux-department-workflow/#how-we-use-labels)
-is needed for additional research and design work, it will be created by a PM or UX person.
-Assign the `~UX`, `~"product discovery"` and `~Deliverable` labels, add a milestone and
-use a title that makes it clear that the scheduled issue is product discovery
-(for example, `Product discovery for XYZ`).
+### Writing
-In order to complete a product discovery issue in a release, you must complete the following:
+- Follow [Pajamas](https://design.gitlab.com/content/punctuation/) as the primary
+ guidelines for UI text and [documentation style guide](../documentation/styleguide/index.md)
+ 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/).
+- Request review from the [appropriate Technical Writer](https://about.gitlab.com/handbook/engineering/ux/technical-writing/#designated-technical-writers),
+ 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.
-1. UXer removes the `~UX` label, adds the `~"UX ready"` label.
-1. Modify the issue description in the product discovery issue to contain the final design. If it makes sense, the original information indicating the need for the design can be moved to a lower "Original Information" section.
-1. Copy the design to the description of the delivery issue for which the product discovery issue was created. Do not simply refer to the product discovery issue as a separate source of truth.
-1. In some cases, a product discovery issue also identifies future enhancements that will not go into the issue that originated the product discovery issue. For these items, create new issues containing the designs to ensure they are not lost. Put the issues in the backlog if they are agreed upon as good ideas. Otherwise leave them for triage.
+### Patterns
+
+- Consider similar patterns used in the product and justify in the issue when diverging
+ from them.
+- Use appropriate [components](https://design.gitlab.com/components/overview/)
+ and [data visualizations](https://design.gitlab.com/data-visualization/overview/).
+
+### Visual design
+
+Check visual design properties using your browser's _elements inspector_ ([Chrome](https://developer.chrome.com/docs/devtools/css/),
+[Firefox](https://developer.mozilla.org/en-US/docs/Tools/Page_Inspector/How_to/Open_the_Inspector)).
+
+- Use recommended [colors](https://design.gitlab.com/product-foundations/colors/)
+ and [typography](https://design.gitlab.com/product-foundations/type-fundamentals/).
+- Follow [layout guidelines](https://design.gitlab.com/layout/grid/).
+- Use existing [icons](http://gitlab-org.gitlab.io/gitlab-svgs/) and [illustrations](http://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/)
+ guidelines.
+- _Optionally_ consider [dark mode](../../user/profile/preferences.md#dark-mode). [^1]
+
+ [^1]: You're not required to design for [dark mode](../../user/profile/preferences.md#dark-mode) while the feature is in [alpha](https://about.gitlab.com/handbook/product/gitlab-the-product/#alpha). The [UX Foundations team](https://about.gitlab.com/direction/ecosystem/foundations/) plans to improve the dark mode in the future. Until we integrate [Pajamas](https://design.gitlab.com/) components into the product and the underlying design strategy is in place to support dark mode, we cannot guarantee that we won't introduce bugs and debt to this mode. At your discretion, evaluate the need to create dark mode patches.
+
+### States
+
+Check states using your browser's _styles inspector_ to toggle CSS pseudo-classes
+like `:hover` and others ([Chrome](https://developer.chrome.com/docs/devtools/css/reference/#pseudo-class),
+[Firefox](https://developer.mozilla.org/en-US/docs/Tools/Page_Inspector/How_to/Examine_and_edit_CSS#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),
+ 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/).
+
+### Responsive
+
+Check responsive behavior using your browser's _responsive mode_ ([Chrome](https://developer.chrome.com/docs/devtools/device-mode/#viewport),
+[Firefox](https://developer.mozilla.org/en-US/docs/Tools/Responsive_Design_Mode)).
+
+- Account for resizing, collapsing, moving, or wrapping of elements across
+ all breakpoints (even if larger viewports are prioritized).
+- Provide the same information and actions in all breakpoints.
+
+### Accessibility
+
+Check accessibility using your browser's _accessibility inspector_ ([Chrome](https://developer.chrome.com/docs/devtools/accessibility/reference/),
+[Firefox](https://developer.mozilla.org/en-US/docs/Tools/Accessibility_inspector#accessing_the_accessibility_inspector)).
+
+- Conform to level AA of the World Wide Web Consortium (W3C) [Web Content Accessibility Guidelines 2.1](https://www.w3.org/TR/WCAG21/),
+ according to our [statement of compliance](https://design.gitlab.com/accessibility/a11y/).
+- Follow accessibility [best practices](https://design.gitlab.com/accessibility/best-practices/)
+ and [checklist](../fe_guide/accessibility.md#quick-checklist).
+
+### Handoff
+
+When the design is ready, _before_ starting its implementation:
+
+- Share design specifications in the related issue, preferably through a [Figma link](https://help.figma.com/hc/en-us/articles/360040531773-Share-Files-with-anyone-using-Link-Sharing#Copy_links)
+ link or [GitLab Designs feature](../../user/project/issues/design_management.md#the-design-management-section).
+ See [when you should use each tool](https://about.gitlab.com/handbook/engineering/ux/product-designer/#deliver).
+- Document user flow and states (for example, using [Mermaid flowcharts in Markdown](../../user/markdown.md#mermaid)).
+- Document animations and transitions.
+- Document responsive behaviors.
+- Document non-evident behaviors (for example, field is auto-focused).
+- Document accessibility behaviors (for example, using [accessibility annotations in Figma](https://www.figma.com/file/g7QtDbfxF3pCdWiyskIr0X/Accessibility-bluelines)).
+- Contribute new icons or illustrations to the [GitLab SVGs](https://gitlab.com/gitlab-org/gitlab-svgs)
+ project.
+
+### Follow-ups
+
+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)
+ for additions or enhancements to the design system.
+- Create issues with the [`~UX debt`](issue_workflow.md#technical-and-ux-debt)
+ label for intentional deviations from the agreed-upon UX requirements due to
+ time or feasibility challenges, linking back to the corresponding issue(s) or
+ MR(s).
+- Create issues for [feature additions or enhancements](issue_workflow.md#feature-proposals)
+ outside the agreed-upon UX requirements to avoid scope creep.
diff --git a/doc/development/contributing/issue_workflow.md b/doc/development/contributing/issue_workflow.md
index 29f6eb57160..d0f107ba98a 100644
--- a/doc/development/contributing/issue_workflow.md
+++ b/doc/development/contributing/issue_workflow.md
@@ -151,7 +151,7 @@ From the handbook's
page:
> Categories are high-level capabilities that may be a standalone product at
-another company. e.g. Portfolio Management.
+another company, such as Portfolio Management, for example.
It's highly recommended to add a category label, as it's used by our triage
automation to
@@ -182,7 +182,7 @@ From the handbook's
[Product stages, groups, and categories](https://about.gitlab.com/handbook/product/categories/#hierarchy)
page:
-> Features: Small, discrete functionalities. e.g. Issue weights. Some common
+> Features: Small, discrete functionalities, for example Issue weights. Some common
features are listed within parentheses to facilitate finding responsible PMs by keyword.
It's highly recommended to add a feature label if no category label applies, as
@@ -303,7 +303,7 @@ We automatically add the ~"Accepting merge requests" label to issues
that match the [triage policy](https://about.gitlab.com/handbook/engineering/quality/triage-operations/#accepting-merge-requests).
We recommend people that have never contributed to any open source project to
-look for issues labeled `~"Accepting merge requests"` with a [weight of 1](https://gitlab.com/groups/gitlab-org/-/issues?state=opened&label_name[]=Accepting+merge+requests&assignee_id=None&sort=weight&weight=1) or the `~"Good for new contributors"` [label](https://gitlab.com/gitlab-org/gitlab/-/issues?scope=all&state=opened&label_name[]=good%20for%20new%20contributors&assignee_id=None) attached to it.
+look for issues labeled `~"Accepting merge requests"` with a [weight of 1](https://gitlab.com/groups/gitlab-org/-/issues?state=opened&label_name[]=Accepting+merge+requests&assignee_id=None&sort=weight&weight=1) or the `~"good for new contributors"` [label](https://gitlab.com/gitlab-org/gitlab/-/issues?scope=all&state=opened&label_name[]=good%20for%20new%20contributors&assignee_id=None) attached to it.
More experienced contributors are very welcome to tackle
[any of them](https://gitlab.com/groups/gitlab-org/-/issues?state=opened&label_name[]=Accepting+merge+requests&assignee_id=None).
@@ -342,19 +342,22 @@ To create a feature proposal, open an issue on the
[issue tracker](https://gitlab.com/gitlab-org/gitlab/-/issues).
In order to help track the feature proposals, we have created a
-[`feature`](https://gitlab.com/gitlab-org/gitlab/-/issues?label_name=feature) label. For the time being, users that are not members
-of the project cannot add labels. You can instead ask one of the [core team](https://about.gitlab.com/community/core-team/)
-members to add the label ~feature to the issue or add the following
+[`feature`](https://gitlab.com/gitlab-org/gitlab/-/issues?label_name=feature) label.
+For the time being, users that are not members of the project cannot add labels.
+You can instead ask one of the [core team](https://about.gitlab.com/community/core-team/)
+members to add the label `~feature` to the issue or add the following
code snippet right after your description in a new line: `~feature`.
Please keep feature proposals as small and simple as possible, complex ones
might be edited to make them small and simple.
-Please submit Feature Proposals using the ['Feature Proposal' issue template](https://gitlab.com/gitlab-org/gitlab/-/blob/master/.gitlab/issue_templates/Feature%20proposal%20-%20detailed.md) provided on the issue tracker.
+Please submit feature proposals using the ['Feature Proposal' issue template](https://gitlab.com/gitlab-org/gitlab/-/blob/master/.gitlab/issue_templates/Feature%20proposal%20-%20detailed.md) provided on the issue tracker.
-For changes in the interface, it is helpful to include a mockup. Issues that add to, or change, the interface should
-be given the ~"UX" label. This will allow the UX team to provide input and guidance. You may
-need to ask one of the [core team](https://about.gitlab.com/community/core-team/) members to add the label, if you do not have permissions to do it by yourself.
+For changes to the user interface (UI), follow our [design and UI guidelines](design.md),
+and include a visual example (screenshot, wireframe, or mockup). Such issues should
+be given the `~UX"` label for the Product Design team to provide input and guidance.
+You may need to ask one of the [core team](https://about.gitlab.com/community/core-team/)
+members to add the label, if you do not have permissions to do it by yourself.
If you want to create something yourself, consider opening an issue first to
discuss whether it is interesting to include this in GitLab.
diff --git a/doc/development/contributing/merge_request_workflow.md b/doc/development/contributing/merge_request_workflow.md
index 25561764bd6..a521d89db2b 100644
--- a/doc/development/contributing/merge_request_workflow.md
+++ b/doc/development/contributing/merge_request_workflow.md
@@ -18,8 +18,8 @@ in order to ensure the work is finished before the release date.
If you want to add a new feature that is not labeled, it is best to first create
an issue (if there isn't one already) and leave a comment asking for it
-to be marked as `Accepting Merge Requests`. Please include screenshots or
-wireframes of the proposed feature if it will also change the UI.
+to be marked as `Accepting merge requests`. See the [feature proposals](issue_workflow.md#feature-proposals)
+section.
Merge requests should be submitted to the appropriate project at GitLab.com, for example
[GitLab](https://gitlab.com/gitlab-org/gitlab/-/merge_requests),
@@ -255,14 +255,14 @@ requirements.
1. The change is tested in a review app where possible and if appropriate.
1. The new feature does not degrade the user experience of the product.
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. An agreed-upon rollout plan.
+1. An agreed-upon [rollout plan](https://about.gitlab.com/handbook/engineering/development/processes/rollout-plans/).
1. Merged by a project maintainer.
### Production use
1. Confirmed to be working in staging before implementing the change in production, where possible.
1. Confirmed to be working in the production with no new [Sentry](https://about.gitlab.com/handbook/engineering/#sentry) errors after the contribution is deployed.
-1. Confirmed that the rollout plan has been completed.
+1. Confirmed that the [rollout plan](https://about.gitlab.com/handbook/engineering/development/processes/rollout-plans) has been completed.
1. If there is a performance risk in the change, I have analyzed the performance of the system before and after the change.
1. *If the merge request uses feature flags, per-project or per-group enablement, and a staged rollout:*
- Confirmed to be working on GitLab projects.
diff --git a/doc/development/dangerbot.md b/doc/development/dangerbot.md
index d9b922cb60e..aca37e2182a 100644
--- a/doc/development/dangerbot.md
+++ b/doc/development/dangerbot.md
@@ -141,7 +141,7 @@ at GitLab so far:
- Their availability:
- No "OOO"/"PTO"/"Parental Leave" in their GitLab or Slack status.
- No `:red_circle:`/`:palm_tree:`/`:beach:`/`:beach_umbrella:`/`:beach_with_umbrella:` emojis in GitLab or Slack status.
- - (Experimental) Their timezone: people for which the local hour is between
+ - (Experimental) Their time zone: people for which the local hour is between
6 AM and 2 PM are eligible to be picked. This is to ensure they have a good
chance to get to perform a review during their current work day. The experimentation is tracked in
[this issue](https://gitlab.com/gitlab-org/quality/team-tasks/-/issues/563)
diff --git a/doc/development/database/database_migration_pipeline.md b/doc/development/database/database_migration_pipeline.md
index 5a8ce89a362..ce7e1801abc 100644
--- a/doc/development/database/database_migration_pipeline.md
+++ b/doc/development/database/database_migration_pipeline.md
@@ -50,6 +50,6 @@ Some additional information is included at the bottom of the comment:
| Result | Description |
|----------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
-| Migrations pending on GitLab.com | A summary of migrations not deployed yet to GitLab.com. This info is useful when testing a migration that was merged but not deployed yet. |
+| Migrations pending on GitLab.com | A summary of migrations not deployed yet to GitLab.com. This information is useful when testing a migration that was merged but not deployed yet. |
| Clone details | A link to the `Postgres.ai` thin clone created for this testing pipeline, along with information about its expiry. This can be used to further explore the results of running the migration. Only accessible by database maintainers or with an access request. |
| Artifacts | A link to the pipeline's artifacts. Full query logs for each migration (ending in `.log`) are available there and only accessible by database maintainers or with an access request. |
diff --git a/doc/development/database/database_reviewer_guidelines.md b/doc/development/database/database_reviewer_guidelines.md
index 59653c6dde3..bc18e606f21 100644
--- a/doc/development/database/database_reviewer_guidelines.md
+++ b/doc/development/database/database_reviewer_guidelines.md
@@ -71,6 +71,7 @@ topics and use cases. The most frequently required during database reviewing are
- [Migrations style guide](../migration_style_guide.md) for creating safe SQL migrations.
- [Avoiding downtime in migrations](../avoiding_downtime_in_migrations.md).
- [SQL guidelines](../sql.md) for working with SQL queries.
+- [Guidelines for JiHu contributions with database migrations](https://about.gitlab.com/handbook/ceo/chief-of-staff-team/jihu-support/jihu-database-change-process.html)
## How to apply to become a database maintainer
diff --git a/doc/development/database/efficient_in_operator_queries.md b/doc/development/database/efficient_in_operator_queries.md
index bc72bce30bf..1e706890f64 100644
--- a/doc/development/database/efficient_in_operator_queries.md
+++ b/doc/development/database/efficient_in_operator_queries.md
@@ -66,9 +66,9 @@ The execution of the query can be largely broken down into three steps:
1. The database sorts the `issues` rows in memory by `created_at` and returns `LIMIT 20` rows to
the end-user. For large groups, this final step requires both large memory and CPU resources.
-<details>
-<summary>Expand this sentence to see the execution plan for this DB query.</summary>
-<pre><code>
+Execution plan for this DB query:
+
+```sql
Limit (cost=90170.07..90170.12 rows=20 width=1329) (actual time=967.597..967.607 rows=20 loops=1)
Buffers: shared hit=239127 read=3060
I/O Timings: read=336.879
@@ -106,8 +106,7 @@ The execution of the query can be largely broken down into three steps:
Planning Time: 7.750 ms
Execution Time: 967.973 ms
(36 rows)
-</code></pre>
-</details>
+```
The performance of the query depends on the number of rows in the database.
On average, we can say the following:
@@ -226,7 +225,12 @@ Gitlab::Pagination::Keyset::InOperatorOptimization::QueryBuilder.new(
- `finder_query` loads the actual record row from the database. It must also be a lambda, where
the order by column expressions is available for locating the record. In this example, the
yielded values are `created_at` and `id` SQL expressions. Finding a record is very fast via the
- primary key, so we don't use the `created_at` value.
+ primary key, so we don't use the `created_at` value. Providing the `finder_query` lambda is optional.
+ If it's not given, the IN operator optimization will only make the ORDER BY columns available to
+ the end-user and not the full database row.
+
+ If it's not given, the IN operator optimization will only make the ORDER BY columns available to
+ the end-user and not the full database row.
The following database index on the `issues` table must be present
to make the query execute efficiently:
@@ -235,9 +239,9 @@ to make the query execute efficiently:
"idx_issues_on_project_id_and_created_at_and_id" btree (project_id, created_at, id)
```
-<details>
-<summary>Expand this sentence to see the SQL query.</summary>
-<pre><code>
+The SQL query:
+
+```sql
SELECT "issues".*
FROM
(WITH RECURSIVE "array_cte" AS MATERIALIZED
@@ -348,8 +352,7 @@ SELECT (records).*
FROM "recursive_keyset_cte" AS "issues"
WHERE (COUNT <> 0)) issues -- filtering out the initializer row
LIMIT 20
-</code></pre>
-</details>
+```
### Using the `IN` query optimization
@@ -461,9 +464,9 @@ Gitlab::Pagination::Keyset::InOperatorOptimization::QueryBuilder.new(
).execute.limit(20)
```
-<details>
-<summary>Expand this sentence to see the SQL query.</summary>
-<pre><code>
+The SQL query:
+
+```sql
SELECT "issues".*
FROM
(WITH RECURSIVE "array_cte" AS MATERIALIZED
@@ -581,9 +584,7 @@ FROM
FROM "recursive_keyset_cte" AS "issues"
WHERE (COUNT <> 0)) issues
LIMIT 20
-</code>
-</pre>
-</details>
+```
NOTE:
To make the query efficient, the following columns need to be covered with an index: `project_id`, `issue_type`, `created_at`, and `id`.
@@ -611,6 +612,32 @@ Gitlab::Pagination::Keyset::Iterator.new(scope: scope, **opts).each_batch(of: 10
end
```
+NOTE:
+The query loads complete database rows from the disk. This may cause increased I/O and slower
+database queries. Depending on the use case, the primary key is often only
+needed for the batch query to invoke additional statements. For example, `UPDATE` or `DELETE`. The
+`id` column is included in the `ORDER BY` columns (`created_at` and `id`) and is already
+loaded. In this case, you can omit the `finder_query` parameter.
+
+Example for loading the `ORDER BY` columns only:
+
+```ruby
+scope = Issue.order(:created_at, :id)
+array_scope = Group.find(9970).all_projects.select(:id)
+array_mapping_scope = -> (id_expression) { Issue.where(Issue.arel_table[:project_id].eq(id_expression)) }
+
+opts = {
+ in_operator_optimization_options: {
+ array_scope: array_scope,
+ array_mapping_scope: array_mapping_scope
+ }
+}
+
+Gitlab::Pagination::Keyset::Iterator.new(scope: scope, **opts).each_batch(of: 100) do |records|
+ puts records.select(:id).map { |r| [r.id] } # only id and created_at are available
+end
+```
+
#### Keyset pagination
The optimization works out of the box with GraphQL and the `keyset_paginate` helper method.
diff --git a/doc/development/database/keyset_pagination.md b/doc/development/database/keyset_pagination.md
index fd62c36b753..4f0b353a37f 100644
--- a/doc/development/database/keyset_pagination.md
+++ b/doc/development/database/keyset_pagination.md
@@ -169,7 +169,7 @@ Consider the following scope:
scope = Issue.where(project_id: 10).order(Gitlab::Database.nulls_last_order('relative_position', 'DESC'))
# SELECT "issues".* FROM "issues" WHERE "issues"."project_id" = 10 ORDER BY relative_position DESC NULLS LAST
-scope.keyset_paginate # raises: Gitlab::Pagination::Keyset::Paginator::UnsupportedScopeOrder: The order on the scope does not support keyset pagination
+scope.keyset_paginate # raises: Gitlab::Pagination::Keyset::UnsupportedScopeOrder: The order on the scope does not support keyset pagination
```
The `keyset_paginate` method raises an error because the order value on the query is a custom SQL string and not an [`Arel`](https://www.rubydoc.info/gems/arel) AST node. The keyset library cannot automatically infer configuration values from these kinds of queries.
diff --git a/doc/development/database/multiple_databases.md b/doc/development/database/multiple_databases.md
index 0fd9f821fab..0ba752ba3a6 100644
--- a/doc/development/database/multiple_databases.md
+++ b/doc/development/database/multiple_databases.md
@@ -6,16 +6,14 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# Multiple Databases
-In order to scale GitLab, the GitLab application database
-will be [decomposed into multiple
-databases](https://gitlab.com/groups/gitlab-org/-/epics/6168).
+To scale GitLab, the we are
+[decomposing the GitLab application database into multiple databases](https://gitlab.com/groups/gitlab-org/-/epics/6168).
-## CI Database
+## CI/CD Database
-Support for configuring the GitLab Rails application to use a distinct
-database for CI tables was added in [GitLab
-14.1](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/64289). This
-feature is still under development, and is not ready for production use.
+> Support for configuring the GitLab Rails application to use a distinct
+database for CI/CD tables was [introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/64289)
+in GitLab 14.1. This feature is still under development, and is not ready for production use.
By default, GitLab is configured to use only one main database. To
opt-in to use a main database, and CI database, modify the
@@ -92,8 +90,8 @@ test: &test
### Migrations
-Any migrations that affect `Ci::CiDatabaseRecord` models
-and their tables must be placed in two directories for now:
+Place any migrations that affect `Ci::CiDatabaseRecord` models
+and their tables in two directories:
- `db/migrate`
- `db/ci_migrate`
@@ -394,7 +392,8 @@ You can see a real example of using this method for fixing a cross-join in
#### Allowlist for existing cross-joins
A cross-join across databases can be explicitly allowed by wrapping the code in the
-`::Gitlab::Database.allow_cross_joins_across_databases` helper method.
+`::Gitlab::Database.allow_cross_joins_across_databases` helper method. Alternative
+way is to mark a given relation as `relation.allow_cross_joins_across_databases`.
This method should only be used:
@@ -405,16 +404,113 @@ This method should only be used:
The `allow_cross_joins_across_databases` helper method can be used as follows:
```ruby
+# Scope the block executing a object from database
::Gitlab::Database.allow_cross_joins_across_databases(url: 'https://gitlab.com/gitlab-org/gitlab/-/issues/336590') do
subject.perform(1, 4)
end
```
+```ruby
+# Mark a relation as allowed to cross-join databases
+def find_actual_head_pipeline
+ all_pipelines
+ .allow_cross_joins_across_databases(url: 'https://gitlab.com/gitlab-org/gitlab/-/issues/336891')
+ .for_sha_or_source_sha(diff_head_sha)
+ .first
+end
+```
+
The `url` parameter should point to an issue with a milestone for when we intend
to fix the cross-join. If the cross-join is being used in a migration, we do not
need to fix the code. See <https://gitlab.com/gitlab-org/gitlab/-/issues/340017>
for more details.
+### Removing cross-database transactions
+
+When dealing with multiple databases, it's important to pay close attention to data modification
+that affects more than one database.
+[Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/339811) GitLab 14.4, an automated check
+prevents cross-database modifications.
+
+When at least two different databases are modified during a transaction initiated on any database
+server, the application triggers a cross-database modification error (only in test environment).
+
+Example:
+
+```ruby
+# Open transaction on Main DB
+ApplicationRecord.transaction do
+ ci_build.update!(updated_at: Time.current) # UPDATE on CI DB
+ ci_build.project.update!(updated_at: Time.current) # UPDATE on Main DB
+end
+# raises error: Cross-database data modification of 'main, ci' were detected within
+# a transaction modifying the 'ci_build, projects' tables
+```
+
+The code example above updates the timestamp for two records within a transaction. With the
+ongoing work on the CI database decomposition, we cannot ensure the schematics of a database
+transaction.
+If the second update query fails, the first update query will not be
+rolled back because the `ci_build` record is located on a different database server. For
+more information, look at the
+[transaction guidelines](transaction_guidelines.md#dangerous-example-third-party-api-calls)
+page.
+
+#### Fixing cross-database errors
+
+##### Removing the transaction block
+
+Without an open transaction, the cross-database modification check cannot raise an error.
+By making this change, we sacrifice consistency. In case of an application failure after the
+first `UPDATE` query, the second `UPDATE` query will never execute.
+
+The same code without the `transaction` block:
+
+```ruby
+ci_build.update!(updated_at: Time.current) # CI DB
+ci_build.project.update!(updated_at: Time.current) # Main DB
+```
+
+##### Async processing
+
+If we need more guarantee that an operation finishes the work consistently we can execute it
+within a background job. A background job is scheduled asynchronously and retried several times
+in case of an error. There is still a very small chance of introducing inconsistency.
+
+Example:
+
+```ruby
+current_time = Time.current
+
+MyAsyncConsistencyJob.perform_async(cu_build.id)
+
+ci_build.update!(updated_at: current_time)
+ci_build.project.update!(updated_at: current_time)
+```
+
+The `MyAsyncConsistencyJob` would also attempt to update the timestamp if they differ.
+
+##### Aiming for perfect consistency
+
+At this point, we don't have the tooling (we might not even need it) to ensure similar consistency
+characteristics as we had with one database. If you think that the code you're working on requires
+these properties, then you can disable the cross-database modification check by wrapping to
+offending database queries with a block and create a follow-up issue mentioning the sharding group
+(`gitlab-org/sharding-group`).
+
+```ruby
+Gitlab::Database.allow_cross_joins_across_databases(url: 'gitlab issue URL') do
+ ApplicationRecord.transaction do
+ ci_build.update!(updated_at: Time.current) # UPDATE on CI DB
+ ci_build.project.update!(updated_at: Time.current) # UPDATE on Main DB
+ end
+end
+```
+
+Don't hesitate to reach out to the
+[sharding group](https://about.gitlab.com/handbook/engineering/development/enablement/sharding/)
+for advice.
+
## `config/database.yml`
GitLab will support running multiple databases in the future, for example to [separate tables for the continuous integration features](https://gitlab.com/groups/gitlab-org/-/epics/6167) from the main database. In order to prepare for this change, we [validate the structure of the configuration](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/67877) in `database.yml` to ensure that only known databases are used.
diff --git a/doc/development/database/transaction_guidelines.md b/doc/development/database/transaction_guidelines.md
index 4c586135015..2806bd217db 100644
--- a/doc/development/database/transaction_guidelines.md
+++ b/doc/development/database/transaction_guidelines.md
@@ -8,17 +8,21 @@ info: To determine the technical writer assigned to the Stage/Group associated w
This document gives a few examples of the usage of database transactions in application code.
-For further reference please check PostgreSQL documentation about [transactions](https://www.postgresql.org/docs/current/tutorial-transactions.html).
+For further reference, check PostgreSQL documentation about [transactions](https://www.postgresql.org/docs/current/tutorial-transactions.html).
## Database decomposition and sharding
-The [sharding group](https://about.gitlab.com/handbook/engineering/development/enablement/sharding/) plans to split the main GitLab database and move some of the database tables to other database servers.
+The [sharding group](https://about.gitlab.com/handbook/engineering/development/enablement/sharding/) plans
+to split the main GitLab database and move some of the database tables to other database servers.
-The group will start decomposing the `ci_*` related database tables first. To maintain the current application development experience, tooling and static analyzers will be added to the codebase to ensure correct data access and data modification methods. By using the correct form for defining database transactions, we can save significant refactoring work in the future.
+We'll start decomposing the `ci_*`-related database tables first. To maintain the current application
+development experience, we'll add tooling and static analyzers to the codebase to ensure correct
+data access and data modification methods. By using the correct form for defining database transactions,
+we can save significant refactoring work in the future.
## The transaction block
-The `ActiveRecord` library provides a convenient way to group database statements into a transaction.
+The `ActiveRecord` library provides a convenient way to group database statements into a transaction:
```ruby
issue = Issue.find(10)
@@ -30,16 +34,19 @@ ApplicationRecord.transaction do
end
```
-This transaction involves two database tables, in case of an error, each `UPDATE` statement will be rolled back to the previous, consistent state.
+This transaction involves two database tables. In case of an error, each `UPDATE`
+statement rolls back to the previous consistent state.
NOTE:
Avoid referencing the `ActiveRecord::Base` class and use `ApplicationRecord` instead.
## Transaction and database locks
-When a transaction block is opened, the database will try to acquire the necessary locks on the resources. The type of locks will depend on the actual database statements.
+When a transaction block is opened, the database tries to acquire the necessary
+locks on the resources. The type of locks depend on the actual database statements.
-Consider a concurrent update scenario where the following code is executed at the same time from two different processes:
+Consider a concurrent update scenario where the following code is executed at the
+same time from two different processes:
```ruby
issue = Issue.find(10)
@@ -51,15 +58,22 @@ ApplicationRecord.transaction do
end
```
-The database will try to acquire the `FOR UPDATE` lock for the referenced `issue` and `project` records. In our case, we have two competing transactions for these locks, one of them will successfully acquire them. The other transaction will have to wait in the lock queue until the first transaction finishes. The execution of the second transaction is blocked at this point.
+The database tries to acquire the `FOR UPDATE` lock for the referenced `issue` and
+`project` records. In our case, we have two competing transactions for these locks,
+and only one of them will successfully acquire them. The other transaction will have
+to wait in the lock queue until the first transaction finishes. The execution of the
+second transaction is blocked at this point.
## Transaction speed
-To prevent lock contention and maintain stable application performance, the transaction block should finish as fast as possible. When a transaction acquires locks, it will hold on to them until the transaction finishes.
+To prevent lock contention and maintain stable application performance, the transaction
+block should finish as fast as possible. When a transaction acquires locks, it holds
+on to them until the transaction finishes.
-Apart from application performance, long-running transactions can also affect the application upgrade processes by blocking database migrations.
+Apart from application performance, long-running transactions can also affect application
+upgrade processes by blocking database migrations.
-### Dangerous example: 3rd party API calls
+### Dangerous example: third-party API calls
Consider the following example:
@@ -73,20 +87,29 @@ Member.transaction do
end
```
-Here, we ensure that the `notification_email_sent` column is updated only when the `send_notification_email` method succeeds. The `send_notification_email` method executes a network request to an email sending service. If the underlying infrastructure does not specify timeouts or the network call takes too long time, the database transaction will stay open.
+Here, we ensure that the `notification_email_sent` column is updated only when the
+`send_notification_email` method succeeds. The `send_notification_email` method
+executes a network request to an email sending service. If the underlying infrastructure
+does not specify timeouts or the network call takes too long time, the database transaction
+stays open.
Ideally, a transaction should only contain database statements.
Avoid doing in a `transaction` block:
-- External network requests such as: triggering Sidekiq jobs, sending emails, HTTP API calls and running database statements using a different connection.
+- External network requests such as:
+ - Triggering Sidekiq jobs.
+ - Sending emails.
+ - HTTP API calls.
+ - Running database statements using a different connection.
- File system operations.
- Long, CPU intensive computation.
- Calling `sleep(n)`.
## Explicit model referencing
-If a transaction modifies records from the same database table, it's advised to use the `Model.transaction` block:
+If a transaction modifies records from the same database table, we advise to use the
+`Model.transaction` block:
```ruby
build_1 = Ci::Build.find(1)
@@ -98,7 +121,8 @@ Ci::Build.transaction do
end
```
-The transaction above will use the same database connection for the transaction as the models in the `transaction` block. In a multi-database environment the following example would be dangerous:
+The transaction above uses the same database connection for the transaction as the models
+in the `transaction` block. In a multi-database environment the following example is dangerous:
```ruby
# `ci_builds` table is located on another database
@@ -114,4 +138,6 @@ ActiveRecord::Base.transaction do
end
```
-The `ActiveRecord::Base` class uses a different database connection than the `Ci::Build` records. The two statements in the transaction block will not be part of the transaction and will not be rolled back in case something goes wrong. They act as 3rd part calls.
+The `ActiveRecord::Base` class uses a different database connection than the `Ci::Build` records.
+The two statements in the transaction block will not be part of the transaction and will not be
+rolled back in case something goes wrong. They act as 3rd part calls.
diff --git a/doc/development/database_debugging.md b/doc/development/database_debugging.md
index b1c8508c884..7c17a39746e 100644
--- a/doc/development/database_debugging.md
+++ b/doc/development/database_debugging.md
@@ -72,8 +72,8 @@ bundle exec rails db -e development
## Access the database with a GUI
-Most GUIs (DataGrid, RubyMine, DBeaver) require a TCP connection to the database, but by default
-the database runs on a UNIX socket. To be able to access the database from these tools, some steps
+Most GUIs (DataGrid, RubyMine, DBeaver) require a TCP connection to the database, but by default
+the database runs on a UNIX socket. To be able to access the database from these tools, some steps
are needed:
1. On the GDK root directory, run:
diff --git a/doc/development/database_review.md b/doc/development/database_review.md
index 42bfa656a61..dcd5baab177 100644
--- a/doc/development/database_review.md
+++ b/doc/development/database_review.md
@@ -38,13 +38,24 @@ migration only.
### Required
-The following artifacts are required prior to submitting for a ~database review.
+You must provide the following artifacts when you request a ~database review.
If your merge request description does not include these items, the review will be reassigned back to the author.
+#### Migrations
+
If new migrations are introduced, in the MR **you are required to provide**:
- The output of both migrating (`db:migrate`) and rolling back (`db:rollback`) for all migrations.
+Note that we have automated tooling for
+[GitLab](https://gitlab.com/gitlab-org/gitlab) (provided by the
+`db:check-migrations` pipeline job) that provides this output for migrations on
+~database merge requests. You do not need to provide this information manually
+if the bot can do it for you. The bot also checks that migrations are correctly
+reversible.
+
+#### Queries
+
If new queries have been introduced or existing queries have been updated, **you are required to provide**:
- [Query plans](#query-plans) for each raw SQL query included in the merge request along with the link to the query plan following each raw SQL snippet.
diff --git a/doc/development/distributed_tracing.md b/doc/development/distributed_tracing.md
index f8184a562ec..1e85abf585c 100644
--- a/doc/development/distributed_tracing.md
+++ b/doc/development/distributed_tracing.md
@@ -57,7 +57,7 @@ on non-Go GitLab subsystems.
## Enabling distributed tracing
GitLab uses the `GITLAB_TRACING` environment variable to configure distributed tracing. The same
-configuration is used for all components (e.g., Workhorse, Rails, etc).
+configuration is used for all components (for example, Workhorse, Rails, etc).
When `GITLAB_TRACING` is not set, the application isn't instrumented, meaning that there is
no overhead at all.
diff --git a/doc/development/documentation/feature_flags.md b/doc/development/documentation/feature_flags.md
index 5a4d365ed20..c169af1958e 100644
--- a/doc/development/documentation/feature_flags.md
+++ b/doc/development/documentation/feature_flags.md
@@ -37,14 +37,14 @@ FLAG:
| If the feature is... | Use this text |
|--------------------------|---------------|
-| Available | `On self-managed GitLab, by default this feature is available. To hide the feature, ask an administrator to [disable the <flag name> flag](<path to>/administration/feature_flags.md).` |
-| Unavailable | `On self-managed GitLab, by default this feature is not available. To make it available, ask an administrator to [enable the <flag name> flag](<path to>/administration/feature_flags.md).` |
-| Available, per-group | `On self-managed GitLab, by default this feature is available. To hide the feature per group, ask an administrator to [disable the <flag name> flag](<path to>/administration/feature_flags.md).` |
-| Unavailable, per-group | `On self-managed GitLab, by default this feature is not available. To make it available per group, ask an administrator to [enable the <flag name> flag](<path to>/administration/feature_flags.md).` |
-| Available, per-project | `On self-managed GitLab, by default this feature is available. To hide the feature per project or for your entire instance, ask an administrator to [disable the <flag name> flag](<path to>/administration/feature_flags.md).` |
-| Unavailable, per-project | `On self-managed GitLab, by default this feature is not available. To make it available per project or for your entire instance, ask an administrator to [enable the <flag name> flag](<path to>/administration/feature_flags.md).` |
-| Available, per-user | `On self-managed GitLab, by default this feature is available. To hide the feature per user, ask an administrator to [disable the <flag name> flag](<path to>/administration/feature_flags.md).` |
-| Unavailable, per-user | `On self-managed GitLab, by default this feature is not available. To make it available per user, ask an administrator to [enable the <flag name> flag](<path to>/administration/feature_flags.md).` |
+| Available | `On self-managed GitLab, by default this feature is available. To hide the feature, ask an administrator to [disable the feature flag](<path to>/administration/feature_flags.md) named <flag name>.` |
+| Unavailable | `On self-managed GitLab, by default this feature is not available. To make it available, ask an administrator to [enable the feature flag](<path to>/administration/feature_flags.md) named <flag name>.` |
+| Available, per-group | `On self-managed GitLab, by default this feature is available. To hide the feature per group, ask an administrator to [disable the feature flag](<path to>/administration/feature_flags.md) named <flag name>.` |
+| Unavailable, per-group | `On self-managed GitLab, by default this feature is not available. To make it available per group, ask an administrator to [enable the feature flag](<path to>/administration/feature_flags.md) named <flag name>.` |
+| Available, per-project | `On self-managed GitLab, by default this feature is available. To hide the feature per project or for your entire instance, ask an administrator to [disable the feature flag](<path to>/administration/feature_flags.md) named <flag name>.` |
+| Unavailable, per-project | `On self-managed GitLab, by default this feature is not available. To make it available per project or for your entire instance, ask an administrator to [enable the feature flag](<path to>/administration/feature_flags.md) named <flag name>.` |
+| Available, per-user | `On self-managed GitLab, by default this feature is available. To hide the feature per user, ask an administrator to [disable the feature flag](<path to>/administration/feature_flags.md) named <flag name>.` |
+| Unavailable, per-user | `On self-managed GitLab, by default this feature is not available. To make it available per user, ask an administrator to [enable the feature flag](<path to>/administration/feature_flags.md) named <flag name>.` |
### GitLab.com availability information
@@ -67,7 +67,7 @@ When the state of a flag changes (for example, disabled by default to enabled by
Possible version history entries are:
```markdown
-> - [Introduced](issue-link) in GitLab X.X. [Deployed behind the <flag name> flag](../../administration/feature_flags.md), disabled by default.
+> - [Introduced](issue-link) in GitLab X.X [with a flag](../../administration/feature_flags.md) named <flag name>. Disabled by default.
> - [Enabled on GitLab.com](issue-link) in GitLab X.X.
> - [Enabled on GitLab.com](issue-link) in GitLab X.X. Available to GitLab.com administrators only.
> - [Enabled on self-managed](issue-link) in GitLab X.X.
@@ -80,31 +80,31 @@ Possible version history entries are:
The following examples show the progression of a feature flag.
```markdown
-> Introduced in GitLab 13.7. [Deployed behind the `forti_token_cloud` flag](../../administration/feature_flags.md), disabled by default.
+> Introduced in GitLab 13.7 [with a flag](../../administration/feature_flags.md) named `forti_token_cloud`. Disabled by default.
FLAG:
On self-managed GitLab, by default this feature is not available. To make it available,
-ask an administrator to [enable the `forti_token_cloud` flag](../administration/feature_flags.md).`
+ask an administrator to [enable the featured flag](../administration/feature_flags.md) named `forti_token_cloud`.
The feature is not ready for production use.
```
When the feature is enabled in production, you can update the version history:
```markdown
-> - Introduced in GitLab 13.7. [Deployed behind the `forti_token_cloud` flag](../../administration/feature_flags.md), disabled by default.
+> - Introduced in GitLab 13.7 [with a flag](../../administration/feature_flags.md) named `forti_token_cloud`. Disabled by default.
> - [Enabled on self-managed](https://gitlab.com/issue/etc) GitLab 13.8.
FLAG:
On self-managed GitLab, by default this feature is available. To hide the feature per user,
-ask an administrator to [disable the `forti_token_cloud` flag](../administration/feature_flags.md).
+ask an administrator to [disable the feature flag](../administration/feature_flags.md) named `forti_token_cloud`.
```
And, when the feature is done and fully available to all users:
```markdown
-> - Introduced in GitLab 13.7. [Deployed behind the `forti_token_cloud` flag](../../administration/feature_flags.md), disabled by default.
+> - Introduced in GitLab 13.7 [with a flag](../../administration/feature_flags.md) named `forti_token_cloud`. Disabled by default.
> - [Enabled on self-managed](https://gitlab.com/issue/etc) GitLab 13.8.
> - [Enabled on GitLab.com](https://gitlab.com/issue/etc) in GitLab 13.9.
-> - [Feature flag `forti_token_cloud`](https://gitlab.com/issue/etc) removed in GitLab 14.0.
+> - [Feature flag removed](https://gitlab.com/issue/etc) in GitLab 14.0.
> - [Generally available](issue-link) in GitLab 14.0.
```
diff --git a/doc/development/documentation/img/manual_build_docs.png b/doc/development/documentation/img/manual_build_docs_v14_3.png
index e366a2f7ec4..e366a2f7ec4 100644
--- a/doc/development/documentation/img/manual_build_docs.png
+++ b/doc/development/documentation/img/manual_build_docs_v14_3.png
Binary files differ
diff --git a/doc/development/documentation/index.md b/doc/development/documentation/index.md
index a597ea512c6..75538fe1fe7 100644
--- a/doc/development/documentation/index.md
+++ b/doc/development/documentation/index.md
@@ -108,23 +108,6 @@ info: To determine the technical writer assigned to the Stage/Group associated w
If you need help determining the correct stage, read [Ask for help](workflow.md#ask-for-help).
-### Document type metadata
-
-Originally discussed in [this epic](https://gitlab.com/groups/gitlab-org/-/epics/1280),
-each page should have a metadata tag called `type`. It can be one or more of the
-following:
-
-- `index`: It consists mostly of a list of links to other pages.
- [Example page](../../index.md).
-- `concepts`: The background or context of a subject.
- [Example page](../../topics/autodevops/index.md).
-- `howto`: Specific use case instructions.
- [Example page](../../ssh/index.md).
-- `tutorial`: Learn a process/concept by doing.
- [Example page](../../gitlab-basics/start-using-git.md).
-- `reference`: A collection of information used as a reference to use a feature
- or a functionality. [Example page](../../ci/yaml/index.md).
-
### Redirection metadata
The following metadata should be added when a page is moved to another location:
@@ -154,7 +137,12 @@ Each page can have additional, optional metadata (set in the
[default.html](https://gitlab.com/gitlab-org/gitlab-docs/-/blob/fc3577921343173d589dfa43d837b4307e4e620f/layouts/default.html#L30-52)
Nanoc layout), which is displayed at the top of the page if defined.
-## Move or rename a page
+### Deprecated metadata
+
+The `type` metadata parameter is deprecated but still exists in documentation
+pages. You can safely remove the `type` metadata parameter and its values.
+
+## Move, rename, or delete a page
See [redirects](redirects.md).
@@ -214,8 +202,10 @@ with the following conventions:
The help text follows the [Pajamas guidelines](https://design.gitlab.com/usability/helping-users/#formatting-help-content).
-Use the following special cases depending on the context, ensuring all links
-are inside `_()` so they can be translated:
+#### Linking to `/help` in HAML
+
+Use the following special cases depending on the context, ensuring all link text
+is inside `_()` so it can be translated:
- Linking to a doc page. In its most basic form, the HAML code to generate a
link to the `/help` page is:
@@ -260,6 +250,27 @@ helpPagePath('user/permissions', { anchor: 'anchor-link' })
This is preferred over static paths, as the helper also works on instances installed under a [relative URL](../../install/relative_url.md).
+#### Linking to `/help` in Ruby
+
+To link to the documentation from within Ruby code, use the following code block as a guide, ensuring all link text is inside `_()` so it can
+be translated:
+
+```ruby
+docs_link = link_to _('Learn more.'), help_page_url('user/permissions', anchor: 'anchor-link'), target: '_blank', rel: 'noopener noreferrer'
+_('This is a text describing the option/feature in a sentence. %{docs_link}').html_safe % { docs_link: docs_link.html_safe }
+```
+
+In cases where you need to generate a link from outside of views/helpers, where the `link_to` and `help_page_url` methods are not available, use the following code block
+as a guide where the methods are fully qualified:
+
+```ruby
+docs_link = ActionController::Base.helpers.link_to _('Learn more.'), Rails.application.routes.url_helpers.help_page_url('user/permissions', anchor: 'anchor-link'), target: '_blank', rel: 'noopener noreferrer'
+_('This is a text describing the option/feature in a sentence. %{docs_link}').html_safe % { docs_link: docs_link.html_safe }
+```
+
+Do not use `include ActionView::Helpers::UrlHelper` just to make the `link_to` method available as you might see in some existing code. Read more in
+[issue 340567](https://gitlab.com/gitlab-org/gitlab/-/issues/340567).
+
### GitLab `/help` tests
Several [RSpec tests](https://gitlab.com/gitlab-org/gitlab/-/blob/master/spec/features/help_pages_spec.rb)
diff --git a/doc/development/documentation/redirects.md b/doc/development/documentation/redirects.md
index eb6878f5870..ef94c33a276 100644
--- a/doc/development/documentation/redirects.md
+++ b/doc/development/documentation/redirects.md
@@ -15,13 +15,26 @@ description: Learn how to contribute to GitLab Documentation.
# Redirects in GitLab documentation
-Moving or renaming a document is the same as changing its location. Be sure
-to assign a technical writer to any merge request that renames or moves a page.
-Technical Writers can help with any questions and can review your change.
+When you move, rename, or delete a page, you must add a redirect. Redirects reduce
+how often users get 404s when visiting the documentation site from out-of-date links, like:
+
+- Bookmarks
+- Links from external sites
+- Links from old blog posts
+- Links in the documentation site global navigation
+
+Add a redirect to ensure:
-When moving or renaming a page, you must redirect browsers to the new page.
-This ensures users find the new page, and have the opportunity to update their
-bookmarks.
+- Users see the new page and can update or delete their bookmark.
+- External sites can update their links, especially sites that have automation that
+ check for redirecting links.
+- The documentation site global navigation does not link to a missing page.
+
+ The links in the global navigation are already tested in the `gitlab-docs` project.
+ If the redirect is missing, the `gitlab-docs` project's `main` branch might break.
+
+Be sure to assign a technical writer to any merge request that moves, renames, or deletes a page.
+Technical Writers can help with any questions and can review your change.
There are two types of redirects:
diff --git a/doc/development/documentation/review_apps.md b/doc/development/documentation/review_apps.md
index 2b8c412f165..a5094ea87f0 100644
--- a/doc/development/documentation/review_apps.md
+++ b/doc/development/documentation/review_apps.md
@@ -26,7 +26,7 @@ to render and preview the documentation locally.
If a merge request has documentation changes, use the `review-docs-deploy` manual job
to deploy the documentation review app for your merge request.
-![Manual trigger a documentation review app](img/manual_build_docs.png)
+![Manual trigger a documentation review app](img/manual_build_docs_v14_3.png)
The `review-docs-deploy*` job triggers a cross project pipeline and builds the
docs site with your changes. When the pipeline finishes, the review app URL
diff --git a/doc/development/documentation/site_architecture/index.md b/doc/development/documentation/site_architecture/index.md
index cd69154217c..d1736e10000 100644
--- a/doc/development/documentation/site_architecture/index.md
+++ b/doc/development/documentation/site_architecture/index.md
@@ -230,7 +230,7 @@ reports.
## Monthly release process (versions)
The docs website supports versions and each month we add the latest one to the list.
-For more information, read about the [monthly release process](https://about.gitlab.com/handbook/engineering/ux/technical-writing/workflow/#monthly-documentation-releases).
+For more information, read about the [monthly release process](https://gitlab.com/gitlab-org/gitlab-docs/-/blob/main/doc/releases.md).
## Review Apps for documentation merge requests
diff --git a/doc/development/documentation/structure.md b/doc/development/documentation/structure.md
index a9b93997906..229dbb077fe 100644
--- a/doc/development/documentation/structure.md
+++ b/doc/development/documentation/structure.md
@@ -149,6 +149,8 @@ For the heading:
If you do not put the full error in the title, include it in the body text.
+If multiple causes or workarounds exist, consider putting them into a table format.
+
## Other types of content
There are other types of content in the GitLab documentation that don't
diff --git a/doc/development/documentation/styleguide/img/admin_access_level.png b/doc/development/documentation/styleguide/img/admin_access_level.png
new file mode 100644
index 00000000000..191ba78cd6c
--- /dev/null
+++ b/doc/development/documentation/styleguide/img/admin_access_level.png
Binary files differ
diff --git a/doc/development/documentation/styleguide/index.md b/doc/development/documentation/styleguide/index.md
index 2cbecc91b20..72491ab3a33 100644
--- a/doc/development/documentation/styleguide/index.md
+++ b/doc/development/documentation/styleguide/index.md
@@ -1091,47 +1091,51 @@ However, they should be used sparingly because:
- They are difficult and expensive to localize.
- They cannot be read by screen readers.
-If you do include an image in the documentation, ensure it provides value.
-Don't use `lorem ipsum` text. Try to replicate how the feature would be
-used in a real-world scenario, and [use realistic text](#fake-user-information).
+When needed, use images to help the reader understand:
-### Capture the image
+- Where they are in a complicated process.
+- How they should interact with the application.
-Use images to help the reader understand where they are in a process, or how
-they need to interact with the application.
+### Capture the image
When you take screenshots:
-- **Capture the most relevant area of the page.** Don't include unnecessary white
- space or areas of the page that don't help illustrate the point. The left
- sidebar of the GitLab user interface can change, so don't include the sidebar
- if it's not necessary.
+- **Ensure it provides value.** Don't use `lorem ipsum` text.
+ Try to replicate how the feature would be used in a real-world scenario, and
+ [use realistic text](#fake-user-information).
+- **Capture only the relevant UI.** Don't include unnecessary white
+ space or areas of the UI that don't help illustrate the point. The
+ sidebars in GitLab can change, so don't include
+ them in screenshots unless absolutely necessary.
- **Keep it small.** If you don't need to show the full width of the screen, don't.
- A value of 1000 pixels is a good maximum width for your screenshot image.
+ Reduce the size of your browser window as much as possible to keep elements close
+ together and reduce empty space. Try to keep the screenshot dimensions as small as possible.
+- **Review how the image renders on the page.** Preview the image locally or use the
+review app in the merge request. Make sure the image isn't blurry or overwhelming.
- **Be consistent.** Coordinate screenshots with the other screenshots already on
- a documentation page. For example, if other screenshots include the left
- sidebar, include the sidebar in all screenshots.
+ a documentation page for a consistent reading experience.
### Save the image
+- Resize any wide or tall screenshots if needed, but make sure the screenshot is
+ still clear after being resized and compressed.
+- All images **must** be [compressed](#compress-images) to 100KB or less.
+ In many cases, 25-50KB or less is often possible without reducing image quality.
- Save the image with a lowercase filename that's descriptive of the feature
- or concept in the image. If the image is of the GitLab interface, append the
- GitLab version to the filename, based on this format:
- `image_name_vX_Y.png`. For example, for a screenshot taken from the pipelines
- page of GitLab 11.1, a valid name is `pipelines_v11_1.png`. If you're adding an
- illustration that doesn't include parts of the user interface, add the release
- number corresponding to the release the image was added to; for an MR added to
- 11.1's milestone, a valid name for an illustration is `devops_diagram_v11_1.png`.
+ or concept in the image:
+ - If the image is of the GitLab interface, append the GitLab version to the filename,
+ based on this format: `image_name_vX_Y.png`. For example, for a screenshot taken
+ from the pipelines page of GitLab 11.1, a valid name is `pipelines_v11_1.png`.
+ - If you're adding an illustration that doesn't include parts of the user interface,
+ add the release number corresponding to the release the image was added to.
+ For an MR added to 11.1's milestone, a valid name for an illustration is `devops_diagram_v11_1.png`.
- Place images in a separate directory named `img/` in the same directory where
the `.md` document that you're working on is located.
- Consider using PNG images instead of JPEG.
-- [Compress all PNG images](#compress-images).
- Compress GIFs with <https://ezgif.com/optimize> or similar tool.
- Images should be used (only when necessary) to illustrate the description
of a process, not to replace it.
-- Max image size: 100KB (GIFs included).
-- See also how to link and embed [videos](#videos) to illustrate the
- documentation.
+- See also how to link and embed [videos](#videos) to illustrate the documentation.
### Add the image link to content
@@ -1152,8 +1156,11 @@ known tool is [`pngquant`](https://pngquant.org/), which is cross-platform and
open source. Install it by visiting the official website and following the
instructions for your OS.
+If you use macOS and want all screenshots to be compressed automatically, read
+[One simple trick to make your screenshots 80% smaller](https://about.gitlab.com/blog/2020/01/30/simple-trick-for-smaller-screenshots/).
+
GitLab has a [Ruby script](https://gitlab.com/gitlab-org/gitlab/-/blob/master/bin/pngquant)
-that you can use to automate the process. In the root directory of your local
+that you can use to simplify the manual process. In the root directory of your local
copy of `https://gitlab.com/gitlab-org/gitlab`, run in a terminal:
- Before compressing, if you want, check that all documentation PNG images have
@@ -1360,13 +1367,15 @@ Do not use words to describe the icon:
## Alert boxes
-Use alert boxes to call attention to information.
+Use alert boxes to call attention to information. Use them sparingly, and never have an alert box immediately follow another alert box.
Alert boxes are generated when one of these words is followed by a line break:
- `FLAG:`
- `NOTE:`
- `WARNING:`
+- `INFO:` (Marketing only)
+- `DISCLAIMER:`
For example:
@@ -1423,6 +1432,58 @@ It renders on the GitLab documentation site as:
WARNING:
This is something to be warned about.
+### Info
+
+The Marketing team uses the `INFO` alert to add information relating
+to sales and marketing efforts.
+
+The text in an `INFO:` alert always renders in a floating text box to the right of the text around it.
+To view the rendered GitLab docs site, check the review app in the MR. You might need to move the text up or down
+in the surrounding text, depending on where you'd like to floating box to appear.
+
+For example, if your page has text like this:
+
+```markdown
+This is an introductory paragraph. GitLab uses the SSH protocol to securely communicate with Git.
+When you use SSH keys to authenticate to the GitLab remote server,
+you don't need to supply your username and password each time.
+
+INFO:
+Here is some information. This information is an important addition to how you
+work with GitLab and you might want to consider it.
+
+And here is another paragraph. GitLab uses the SSH protocol to securely communicate with Git.
+When you use SSH keys to authenticate to the GitLab remote server,
+you don't need to supply your username and password each time.
+
+And here is another paragraph. GitLab uses the SSH protocol to securely communicate with Git.
+When you use SSH keys to authenticate to the GitLab remote server,
+you don't need to supply your username and password each time.
+```
+
+It renders on the GitLab documentation site as:
+
+This is an introductory paragraph. GitLab uses the SSH protocol to securely communicate with Git.
+When you use SSH keys to authenticate to the GitLab remote server,
+you don't need to supply your username and password each time.
+
+INFO:
+Here is some information. This information is an important addition to how you
+work with GitLab and you might want to consider it.
+
+And here is another paragraph. GitLab uses the SSH protocol to securely communicate with Git.
+When you use SSH keys to authenticate to the GitLab remote server,
+you don't need to supply your username and password each time.
+
+And here is another paragraph. GitLab uses the SSH protocol to securely communicate with Git.
+When you use SSH keys to authenticate to the GitLab remote server,
+you don't need to supply your username and password each time.
+
+### Disclaimer
+
+Use to describe future functionality only.
+For more information, see [Legal disclaimer for future features](#legal-disclaimer-for-future-features).
+
## Blockquotes
For highlighting a text inside a blockquote, use this format:
@@ -1616,6 +1677,34 @@ For example:
You can say that we plan to remove a feature.
+#### Legal disclaimer for future features
+
+If you **must** write about features we have not yet delivered, put this exact disclaimer near the content it applies to.
+
+```markdown
+DISCLAIMER:
+This page contains information related to upcoming products, features, and functionality.
+It is important to note that the information presented is for informational purposes only.
+Please do not rely on this information for purchasing or planning purposes.
+As with all projects, the items mentioned on this page are subject to change or delay.
+The development, release, and timing of any products, features, or functionality remain at the
+sole discretion of GitLab Inc.
+```
+
+It renders on the GitLab documentation site as:
+
+DISCLAIMER:
+This page contains information related to upcoming products, features, and functionality.
+It is important to note that the information presented is for informational purposes only.
+Please do not rely on this information for purchasing or planning purposes.
+As with all projects, the items mentioned on this page are subject to change or delay.
+The development, release, and timing of any products, features, or functionality remain at the
+sole discretion of GitLab Inc.
+
+If all of the content on the page is not available, use the disclaimer once at the top of the page.
+
+If the content in a topic is not ready, use the disclaimer in the topic.
+
### Removing versions after each major release
Whenever a major GitLab release occurs, we remove all version references
diff --git a/doc/development/documentation/styleguide/word_list.md b/doc/development/documentation/styleguide/word_list.md
index eafe0e7a1c2..f1e6a147571 100644
--- a/doc/development/documentation/styleguide/word_list.md
+++ b/doc/development/documentation/styleguide/word_list.md
@@ -29,9 +29,39 @@ Try to avoid using **above** when referring to an example or table in a document
- In the previous example, the dog had fleas.
-## admin, admin area
+Do not use **above** when referring to versions of the product. Use [**later**](#later) instead.
-Use **administration**, **administrator**, **administer**, or **Admin Area** instead. ([Vale](../testing.md#vale) rule: [`Admin.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/doc/.vale/gitlab/Admin.yml))
+- Do: In GitLab 14.4 and later...
+- Do not: In GitLab 14.4 and above...
+- Do not: In GitLab 14.4 and higher...
+
+## access level
+
+Access levels are different than [roles](#roles) or [permissions](#permissions).
+When you create a user, you choose an access level: **Regular**, **Auditor**, or **Admin**.
+
+Capitalize these words when you refer to the UI. Otherwise use lowercase.
+
+## administrator
+
+Use **administrator** instead of **admin** when talking about a user's access level.
+Use lowercase unless you are referring to the **Admin** access level you select in the UI.
+
+To view the administrator access type, in the GitLab UI, go to the Admin Area and select
+**Users**. Then select **New user**.
+
+![admin access level](img/admin_access_level.png)
+
+An **administrator** is not a [role](#roles) or [permission](#permissions).
+
+- Do: To do this thing, you must be an administrator.
+- Do: To do this thing, you must have the administrator access level.
+- Do not: To do this thing, you must have the Admin role.
+
+## Admin Area
+
+Use title case **Admin Area** to refer to the area of the UI that you access when you select **Menu > Admin**.
+This area of the UI says **Admin Area** at the top of the page and on the menu.
## allow, enable
@@ -54,9 +84,14 @@ in the handbook when writing about Alpha features.
Instead of **and/or**, use **or** or rewrite the sentence to spell out both options.
+## and so on
+
+Do not use **and so on**. Instead, be more specific. For details, see
+[the Microsoft style guide](https://docs.microsoft.com/en-us/style-guide/a-z-word-list-term-collections/a/and-so-on).
+
## area
-Use [**section**](#section) instead of **area**. The only exception is [the Admin Area](#admin-admin-area).
+Use [**section**](#section) instead of **area**. The only exception is [the Admin Area](#admin-area).
## below
@@ -150,8 +185,8 @@ When writing about the Developer role:
- Do not use the phrase, **if you are a developer** to mean someone who is assigned the Developer
role. Instead, write it out. For example, **if you are assigned the Developer role**.
- To describe a situation where the Developer role is the minimum required:
- - Avoid: the Developer role or higher
- - Use instead: at least the Developer role
+ - Do: at least the Developer role
+ - Do not: the Developer role or higher
Do not use **Developer permissions**. A user who is assigned the Developer role has a set of associated permissions.
@@ -207,7 +242,8 @@ Use lowercase for **epic board**.
## etc.
-Try to avoid **etc.**. Be as specific as you can. Do not use **and so on** as a replacement.
+Try to avoid **etc.**. Be as specific as you can. Do not use
+[**and so on**](#and-so-on) as a replacement.
- Do: You can update objects, like merge requests and issues.
- Do not: You can update objects, like merge requests, issues, etc.
@@ -220,8 +256,8 @@ Use **expand** instead of **open** when you are talking about expanding or colla
Use **box** instead of **field** or **text box**.
-- Avoid: In the **Variable name** field, enter `my text`.
-- Use instead: In the **Variable name** box, enter `my text`.
+- Do: In the **Variable name** box, enter `my text`.
+- Do not: In the **Variable name** field, enter `my text`.
## foo
@@ -265,8 +301,8 @@ When writing about the Guest role:
- Do not use the phrase, **if you are a guest** to mean someone who is assigned the Guest
role. Instead, write it out. For example, **if you are assigned the Guest role**.
- To describe a situation where the Guest role is the minimum required:
- - Avoid: the Guest role or higher
- - Use instead: at least the Guest role
+ - Do: at least the Guest role
+ - Do not: the Guest role or higher
Do not use **Guest permissions**. A user who is assigned the Guest role has a set of associated permissions.
@@ -282,15 +318,16 @@ Do not use **high availability** or **HA**. Instead, direct readers to the GitLa
Do not use **higher** when talking about version numbers.
-- Do: In GitLab 14.1 and later.
-- Do not: In GitLab 14.1 and higher.
+- Do: In GitLab 14.4 and later...
+- Do not: In GitLab 14.4 and higher...
+- Do not: In GitLab 14.4 and above...
## hit
Don't use **hit** to mean **press**.
-- Avoid: Hit the **ENTER** button.
-- Use instead: Press **ENTER**.
+- Do: Press **ENTER**.
+- Do not: Hit the **ENTER** button.
## I
@@ -326,8 +363,9 @@ If you want to use **CI** with the word **job**, use **CI/CD job** rather than *
Use **later** when talking about version numbers.
-- Avoid: In GitLab 14.1 and higher.
-- Use instead: In GitLab 14.1 and later.
+- Do: In GitLab 14.1 and later...
+- Do not: In GitLab 14.1 and higher...
+- Do not: In GitLab 14.1 and above...
## list
@@ -354,8 +392,8 @@ When writing about the Maintainer role:
- Do not use the phrase, **if you are a maintainer** to mean someone who is assigned the Maintainer
role. Instead, write it out. For example, **if you are assigned the Maintainer role**.
- To describe a situation where the Maintainer role is the minimum required:
- - Avoid: the Maintainer role or higher
- - Use instead: at least the Maintainer role
+ - Do: at least the Maintainer role
+ - Do not: the Maintainer role or higher
Do not use **Maintainer permissions**. A user who is assigned the Maintainer role has a set of associated permissions.
@@ -416,6 +454,13 @@ Do not use **note that** because it's wordy.
- Do: You can change the settings.
- Do not: Note that you can change the settings.
+## once
+
+The word **once** means **one time**. Don't use it to mean **after** or **when**.
+
+- Do: When the process is complete...
+- Do not: Once the process is complete...
+
## Owner
When writing about the Owner role:
@@ -429,7 +474,9 @@ Do not use **Owner permissions**. A user who is assigned the Owner role has a se
## permissions
-Do not use **roles** and **permissions** interchangeably. Each user is assigned a role. Each role includes a set of permissions.
+Do not use [**roles**](#roles) and **permissions** interchangeably. Each user is assigned a role. Each role includes a set of permissions.
+
+Permissions are not the same as [**access levels**](#access-level).
## please
@@ -454,8 +501,8 @@ When writing about the Reporter role:
- Do not use the phrase, **if you are a reporter** to mean someone who is assigned the Reporter
role. Instead, write it out. For example, **if you are assigned the Reporter role**.
- To describe a situation where the Reporter role is the minimum required:
- - Avoid: the Reporter role or higher
- - Use instead: at least the Reporter role
+ - Do: at least the Reporter role
+ - Do not: the Reporter role or higher
Do not use **Reporter permissions**. A user who is assigned the Reporter role has a set of associated permissions.
@@ -465,12 +512,23 @@ Use title case for **Repository Mirroring**.
## roles
-Do not use **roles** and **permissions** interchangeably. Each user is assigned a role. Each role includes a set of permissions.
+Do not use **roles** and [**permissions**](#permissions) interchangeably. Each user is assigned a role. Each role includes a set of permissions.
+
+Roles are not the same as [**access levels**](#access-level).
## runner, runners
Use lowercase for **runners**. These are the agents that run CI/CD jobs. See also [GitLab Runner](#gitlab-runner) and [this issue](https://gitlab.com/gitlab-org/gitlab/-/issues/233529).
+## (s)
+
+Do not use **(s)** to make a word optionally plural. It can slow down comprehension. For example:
+
+Do: Select the jobs you want.
+Do not: Select the job(s) you want.
+
+If you can select multiples of something, then write the word as plural.
+
## sanity check
Do not use **sanity check**. Use **check for completeness** instead. ([Vale](../testing.md#vale) rule: [`InclusionAbleism.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/doc/.vale/gitlab/InclusionAbleism.yml))
@@ -514,6 +572,13 @@ You can use **single sign-on**.
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))
+## since
+
+The word **since** indicates a timeframe. For example, **Since 1984, Bon Jovi has existed**. Don't use **since** to mean **because**.
+
+- Do: Because you have the Developer role, you can delete the widget.
+- Do not: Since you have the Developer role, you can delete the widget.
+
## slashes
Instead of **and/or**, use **or** or re-write the sentence. This rule also applies to other slashes, like **follow/unfollow**. Some exceptions (like **CI/CD**) are allowed.
diff --git a/doc/development/documentation/testing.md b/doc/development/documentation/testing.md
index dfa2f3ed55a..13648a7c710 100644
--- a/doc/development/documentation/testing.md
+++ b/doc/development/documentation/testing.md
@@ -206,7 +206,6 @@ Vale returns three types of results: `suggestion`, `warning`, and `error`:
(after the Technical Writing team completes its cleanup). Warnings don't break CI. See a list of
[warning-level 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).
- **Error**-level results are Style Guide violations, and should contain clear explanations
- about how to resolve the error. Errors break CI and are displayed in CI job output.
of how to resolve the error. Errors break CI and are displayed in CI job output. See a list of
[error-level rules](https://gitlab.com/search?utf8=✓&snippets=false&scope=&repository_ref=master&search=path%3Adoc%2F.vale%2Fgitlab+Error%3A&group_id=9970&project_id=278964).
diff --git a/doc/development/documentation/workflow.md b/doc/development/documentation/workflow.md
index 31c38bc1446..90c1137e5c5 100644
--- a/doc/development/documentation/workflow.md
+++ b/doc/development/documentation/workflow.md
@@ -99,7 +99,7 @@ The process involves the following:
- Primary Reviewer. Review by a [code reviewer](https://about.gitlab.com/handbook/engineering/projects/)
or other appropriate colleague to confirm accuracy, clarity, and completeness. This can be skipped
for minor fixes without substantive content changes.
-- Technical Writer (Optional). If not completed for a merge request prior to merging, must be scheduled
+- Technical Writer (Optional). If not completed for a merge request before merging, must be scheduled
post-merge. Schedule post-merge reviews only if an urgent merge is required. To request a:
- Pre-merge review, assign the Technical Writer listed for the applicable
[DevOps stage group](https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments).
@@ -111,7 +111,7 @@ The process involves the following:
- Ensure the appropriate labels are applied, including any required to pick a merge request into
a release.
- Ensure that, if there has not been a Technical Writer review completed or scheduled, they
- [create the required issue](https://gitlab.com/gitlab-org/gitlab/-/issues/new?issuable_template=Doc%20Review), assign to the Technical Writer of the given stage group,
+ [create the required issue](https://gitlab.com/gitlab-org/gitlab/-/issues/new?issuable_template=Doc%20Review), assign it to the Technical Writer of the given stage group,
and link it from the merge request.
The process is reflected in the **Documentation**
@@ -130,10 +130,10 @@ immediately after merge by the developer or maintainer. For this,
create an issue using the [Doc Review description template](https://gitlab.com/gitlab-org/gitlab/-/issues/new?issuable_template=Doc%20Review)
and link to it from the merged merge request that introduced the documentation change.
-Circumstances where a regular pre-merge Technical Writer review might be skipped include:
+Circumstances, where a regular pre-merge Technical Writer review might be skipped, include:
-- There is a short amount of time left before the milestone release. If there are less than three days
- remaining, seek a post-merge review and ping the writer via Slack to ensure the review is
+- There is a short amount of time left before the milestone release. If less than three
+ days are remaining, seek a post-merge review and ping the writer via Slack to ensure the review is
completed as soon as possible.
- The size of the change is small and you have a high degree of confidence
that early users of the feature (for example, GitLab.com users) can easily
@@ -156,15 +156,15 @@ Remember:
Ensure the following if skipping an initial Technical Writer review:
-- That [product badges](styleguide/index.md#product-tier-badges) are applied.
-- That the GitLab [version](styleguide/index.md#gitlab-versions) that
- introduced the feature has been included.
-- That changes to headings don't affect in-app hyperlinks.
+- [Product badges](styleguide/index.md#product-tier-badges) are applied.
+- The GitLab [version](styleguide/index.md#gitlab-versions) that
+ introduced the feature is included.
+- Changes to headings don't affect in-app hyperlinks.
- Specific [user permissions](../../user/permissions.md) are documented.
-- That new documents are linked from higher-level indexes, for discoverability.
-- Style guide is followed:
+- New documents are linked from higher-level indexes, for discoverability.
+- The style guide is followed:
- For [directories and files](styleguide/index.md#work-with-directories-and-files).
- For [images](styleguide/index.md#images).
Merge requests that change the location of documentation must always be reviewed by a Technical
-Writer prior to merging.
+Writer before merging.
diff --git a/doc/development/ee_features.md b/doc/development/ee_features.md
index 42fb9fd42fc..7f74d9660e9 100644
--- a/doc/development/ee_features.md
+++ b/doc/development/ee_features.md
@@ -40,7 +40,7 @@ By default, merge request pipelines for development run in an EE-context only. I
developing features that differ between FOSS and EE, you may wish to run pipelines in a
FOSS context as well.
-To run pipelines in both contexts, include `RUN AS-IF-FOSS` in the merge request title.
+To run pipelines in both contexts, add the `~"pipeline:run-as-if-foss"` label to the merge request.
See the [As-if-FOSS jobs](pipelines.md#as-if-foss-jobs) pipelines documentation for more information.
diff --git a/doc/development/elasticsearch.md b/doc/development/elasticsearch.md
index bba4e1cda23..68d8b424331 100644
--- a/doc/development/elasticsearch.md
+++ b/doc/development/elasticsearch.md
@@ -233,11 +233,11 @@ Any data or index cleanup needed to support migration retries should be handled
will re-enqueue itself with a delay which is set using the `throttle_delay` option described below. The batching
must be handled within the `migrate` method, this setting controls the re-enqueuing only.
-- `batch_size` - Sets the number of documents modified during a `batched!` migration run. This size should be set to a value which allows the updates
- enough time to finish. This can be tuned in combination with the `throttle_delay` option described below. The batching
- must be handled within a custom `migrate` method or by using the [`Elastic::MigrationBackfillHelper`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/app/workers/concerns/elastic/migration_backfill_helper.rb)
- `migrate` method which uses this setting. Default value is 1000 documents.
-
+- `batch_size` - Sets the number of documents modified during a `batched!` migration run. This size should be set to a value which allows the updates
+enough time to finish. This can be tuned in combination with the `throttle_delay` option described below. The batching
+must be handled within a custom `migrate` method or by using the [`Elastic::MigrationBackfillHelper`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/app/workers/concerns/elastic/migration_backfill_helper.rb)
+`migrate` method which uses this setting. Default value is 1000 documents.
+
- `throttle_delay` - Sets the wait time in between batch runs. This time should be set high enough to allow each migration batch
enough time to finish. Additionally, the time should be less than 30 minutes since that is how often the
[`Elastic::MigrationWorker`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/app/workers/elastic/migration_worker.rb)
diff --git a/doc/development/experiment_guide/index.md b/doc/development/experiment_guide/index.md
index 4de272fec20..1b1f756d4c0 100644
--- a/doc/development/experiment_guide/index.md
+++ b/doc/development/experiment_guide/index.md
@@ -61,7 +61,7 @@ Therefore, you should postpone this effort until the [experiment cleanup process
We recommend the following workflow:
-1. Review the Pajamas guidelines for [icons](https://design.gitlab.com/product-foundations/iconography) and [illustrations](https://design.gitlab.com/product-foundations/illustration).
+1. Review the Pajamas guidelines for [icons](https://design.gitlab.com/product-foundations/iconography/) and [illustrations](https://design.gitlab.com/product-foundations/illustration/).
1. Add an icon or illustration as an `.svg` file in the `/app/assets/images` (or EE) path in the GitLab repository.
1. Use `image_tag` or `image_path` to render it via the asset pipeline.
1. **If the experiment is a success**, designers add the new icon or illustration to the Pajamas UI kit as part of the cleanup process.
diff --git a/doc/development/fe_guide/accessibility.md b/doc/development/fe_guide/accessibility.md
index 7c870de9a6c..c4ebef4c289 100644
--- a/doc/development/fe_guide/accessibility.md
+++ b/doc/development/fe_guide/accessibility.md
@@ -334,7 +334,7 @@ Keep in mind that:
- When you add `:hover` styles, in most cases you should add `:focus` styles too so that the styling is applied for both mouse **and** keyboard users.
- If you remove an interactive element's `outline`, make sure you maintain visual focus state in another way such as with `box-shadow`.
-See the [Pajamas Keyboard-only page](https://design.gitlab.com/accessibility-audits/keyboard-only) for more detail.
+See the [Pajamas Keyboard-only page](https://design.gitlab.com/accessibility-audits/keyboard-only/) for more detail.
## Tabindex
diff --git a/doc/development/fe_guide/content_editor.md b/doc/development/fe_guide/content_editor.md
index 956e7d0d56e..139825655e9 100644
--- a/doc/development/fe_guide/content_editor.md
+++ b/doc/development/fe_guide/content_editor.md
@@ -11,7 +11,7 @@ experience for [GitLab Flavored Markdown](../../user/markdown.md) in the GitLab
It also serves as the foundation for implementing Markdown-focused editors
that target other engines, like static site generators.
-We use [tiptap 2.0](https://www.tiptap.dev/) and [ProseMirror](https://prosemirror.net/)
+We use [tiptap 2.0](https://tiptap.dev/) and [ProseMirror](https://prosemirror.net/)
to build the Content Editor. These frameworks provide a level of abstraction on top of
the native
[`contenteditable`](https://developer.mozilla.org/en-US/docs/Web/Guide/HTML/Editable_content) web technology.
@@ -143,7 +143,7 @@ The Content Editor is composed of three main layers:
### Editing tools UI
The editing tools UI are Vue components that display the editor's state and
-dispatch [commands](https://www.tiptap.dev/api/commands/#commands) to mutate it.
+dispatch [commands](https://tiptap.dev/api/commands/#commands) to mutate it.
They are located in the `~/content_editor/components` directory. For example,
the **Bold** toolbar button displays the editor's state by becoming active when
the user selects bold text. This button also dispatches the `toggleBold` command
@@ -159,7 +159,7 @@ sequenceDiagram
#### Node views
-We implement [node views](https://www.tiptap.dev/guide/node-views/vue/#node-views-with-vue)
+We implement [node views](https://tiptap.dev/guide/node-views/vue/#node-views-with-vue)
to provide inline editing tools for some content types, like tables and images. Node views
allow separating the presentation of a content type from its
[model](https://prosemirror.net/docs/guide/#doc.data_structures). Using a Vue component in
@@ -209,7 +209,7 @@ the following events:
- `blur`
- `error`.
-Learn more about these events in [Tiptap's event guide](https://www.tiptap.dev/api/events/).
+Learn more about these events in [Tiptap's event guide](https://tiptap.dev/api/events/).
```html
<script>
@@ -246,7 +246,7 @@ export default {
### The Tiptap editor object
-The Tiptap [Editor](https://www.tiptap.dev/api/editor) class manages
+The Tiptap [Editor](https://tiptap.dev/api/editor) class manages
the editor's state and encapsulates all the business logic that powers
the Content Editor. The Content Editor constructs a new instance of this class and
provides all the necessary extensions to support
@@ -255,9 +255,9 @@ provides all the necessary extensions to support
#### Implement new extensions
Extensions are the building blocks of the Content Editor. You can learn how to implement
-new ones by reading [Tiptap's guide](https://www.tiptap.dev/guide/custom-extensions).
-We recommend checking the list of built-in [nodes](https://www.tiptap.dev/api/nodes) and
-[marks](https://www.tiptap.dev/api/marks) before implementing a new extension
+new ones by reading [Tiptap's guide](https://tiptap.dev/guide/custom-extensions).
+We recommend checking the list of built-in [nodes](https://tiptap.dev/api/nodes) and
+[marks](https://tiptap.dev/api/marks) before implementing a new extension
from scratch.
Store the Content Editor extensions in the `~/content_editor/extensions` directory.
@@ -326,8 +326,8 @@ sequenceDiagram
```
Deserializers live in the extension modules. Read Tiptap's
-[parseHTML](https://www.tiptap.dev/guide/custom-extensions#parse-html) and
-[addAttributes](https://www.tiptap.dev/guide/custom-extensions#attributes) documentation to
+[parseHTML](https://tiptap.dev/guide/custom-extensions#parse-html) and
+[addAttributes](https://tiptap.dev/guide/custom-extensions#attributes) documentation to
learn how to implement them. Titap's API is a wrapper around ProseMirror's
[schema spec API](https://prosemirror.net/docs/ref/#model.SchemaSpec).
diff --git a/doc/development/fe_guide/droplab/droplab.md b/doc/development/fe_guide/droplab/droplab.md
deleted file mode 100644
index 8f1ecc115fe..00000000000
--- a/doc/development/fe_guide/droplab/droplab.md
+++ /dev/null
@@ -1,281 +0,0 @@
----
-stage: none
-group: unassigned
-info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
----
-
-# DropLab
-
-A generic dropdown for all of your custom dropdown needs.
-
-## Usage
-
-DropLab can be used by adding a `data-dropdown-trigger` HTML attribute. This
-attribute allows us to find the "trigger" _(toggle)_ for the dropdown, whether
-it's a button, link or input.
-
-The value of the `data-dropdown-trigger` should be a CSS selector that DropLab
-can use to find the trigger's dropdown list.
-
-You should also add the `data-dropdown` attribute to declare the dropdown list.
-The value is irrelevant.
-
-The DropLab class has no side effects, so you must always call `.init` when the
-DOM is ready. `DropLab.prototype.init` takes the same arguments as `DropLab.prototype.addHook`.
-If you don't provide any arguments, it globally queries and instantiates all
-DropLab-compatible dropdowns.
-
-```html
-<a href="#" data-dropdown-trigger="#list">Toggle</a>
-
-<ul id="list" data-dropdown>
- <!-- ... -->
-<ul>
-```
-
-```javascript
-const droplab = new DropLab();
-droplab.init();
-```
-
-As noted, we have a "Toggle" link that's declared as a trigger. It provides a
-selector to find the dropdown list it should control.
-
-### Static data
-
-You can add static list items.
-
-```html
-<a href="#" data-dropdown-trigger="#list">Toggle</a>
-
-<ul id="list" data-dropdown>
- <li>Static value 1</li>
- <li>Static value 2</li>
-<ul>
-```
-
-```javascript
-const droplab = new DropLab();
-droplab.init();
-```
-
-### Explicit instantiation
-
-You can pass the trigger and list elements as constructor arguments to return a
-non-global instance of DropLab using the `DropLab.prototype.init` method.
-
-```html
-<a href="#" id="trigger" data-dropdown-trigger="#list">Toggle</a>
-
-<ul id="list" data-dropdown>
- <!-- ... -->
-<ul>
-```
-
-```javascript
-const trigger = document.getElementById('trigger');
-const list = document.getElementById('list');
-
-const droplab = new DropLab();
-droplab.init(trigger, list);
-```
-
-You can also add hooks to an existing DropLab instance using `DropLab.prototype.addHook`.
-
-```html
-<a href="#" data-dropdown-trigger="#auto-dropdown">Toggle</a>
-<ul id="auto-dropdown" data-dropdown><!-- ... --><ul>
-
-<a href="#" id="trigger" data-dropdown-trigger="#list">Toggle</a>
-<ul id="list" data-dropdown><!-- ... --><ul>
-```
-
-```javascript
-const droplab = new DropLab();
-
-droplab.init();
-
-const trigger = document.getElementById('trigger');
-const list = document.getElementById('list');
-
-droplab.addHook(trigger, list);
-```
-
-### Dynamic data
-
-Adding `data-dynamic` to your dropdown element enables dynamic list
-rendering.
-
-You can template a list item using the keys of the data object provided. Use the
-handlebars syntax `{{ value }}` to HTML escape the value. Use the `<%= value %>`
-syntax to interpolate the value. Use the `<%= value %>` syntax to evaluate the
-value.
-
-Passing an array of objects to `DropLab.prototype.addData` renders that data
-for all `data-dynamic` dropdown lists tracked by that DropLab instance.
-
-```html
-<a href="#" data-dropdown-trigger="#list">Toggle</a>
-
-<ul id="list" data-dropdown data-dynamic>
- <li><a href="#" data-id="{{id}}">{{text}}</a></li>
-</ul>
-```
-
-```javascript
-const droplab = new DropLab();
-
-droplab.init().addData([{
- id: 0,
- text: 'Jacob',
-}, {
- id: 1,
- text: 'Jeff',
-}]);
-```
-
-Alternatively, you can specify a specific dropdown to add this data to by
-passing the data as the second argument and the `id` of the trigger element as
-the first argument.
-
-```html
-<a href="#" data-dropdown-trigger="#list" id="trigger">Toggle</a>
-
-<ul id="list" data-dropdown data-dynamic>
- <li><a href="#" data-id="{{id}}">{{text}}</a></li>
-</ul>
-```
-
-```javascript
-const droplab = new DropLab();
-
-droplab.init().addData('trigger', [{
- id: 0,
- text: 'Jacob',
-}, {
- id: 1,
- text: 'Jeff',
-}]);
-```
-
-This allows you to mix static and dynamic content, even with one trigger.
-
-Note the use of scoping regarding the `data-dropdown` attribute to capture both
-dropdown lists, one of which is dynamic.
-
-```html
-<input id="trigger" data-dropdown-trigger="#list">
-<div id="list" data-dropdown>
- <ul>
- <li><a href="#">Static item 1</a></li>
- <li><a href="#">Static item 2</a></li>
- </ul>
- <ul data-dynamic>
- <li><a href="#" data-id="{{id}}">{{text}}</a></li>
- </ul>
-</div>
-```
-
-```javascript
-const droplab = new DropLab();
-
-droplab.init().addData('trigger', [{
- id: 0,
- text: 'Jacob',
-}, {
- id: 1,
- text: 'Jeff',
-}]);
-```
-
-## Internal selectors
-
-DropLab adds some CSS classes to help lower the barrier to integration.
-
-For example:
-
-- The `droplab-item-selected` CSS class is added to items that have been
- selected either by a mouse click or by enter key selection.
-- The `droplab-item-active` CSS class is added to items that have been selected
- using arrow key navigation.
-- You can add the `droplab-item-ignore` CSS class to any item that you don't
- want to be selectable. For example, an `<li class="divider"></li>` list
- divider element that shouldn't be interactive.
-
-## Internal events
-
-DropLab uses some custom events to help lower the barrier to integration.
-
-For example:
-
-- The `click.dl` event is fired when an `li` list item has been clicked. It's
- also fired when a list item has been selected with the keyboard. It's also
- fired when a `HookButton` button is clicked (a registered `button` tag or `a`
- tag trigger).
-- The `input.dl` event is fired when a `HookInput` (a registered `input` tag
- trigger) triggers an `input` event.
-- The `mousedown.dl` event is fired when a `HookInput` triggers a `mousedown`
- event.
-- The `keyup.dl` event is fired when a `HookInput` triggers a `keyup` event.
-- The `keydown.dl` event is fired when a `HookInput` triggers a `keydown` event.
-
-These custom events add a `detail` object to the vanilla `Event` object that
-provides some potentially useful data.
-
-## Plugins
-
-Plugins are objects that are registered to be executed when a hook is added (when
-a DropLab trigger and dropdown are instantiated).
-
-If no modules API is detected, the library falls back as it does with
-`window.DropLab` and adds `window.DropLab.plugins.PluginName`.
-
-### Usage
-
-To use plugins, you can pass them in an array as the third argument of
-`DropLab.prototype.init` or `DropLab.prototype.addHook`. Some plugins require
-configuration values; the configuration object can be passed as the fourth argument.
-
-```html
-<a href="#" id="trigger" data-dropdown-trigger="#list">Toggle</a>
-<ul id="list" data-dropdown><!-- ... --><ul>
-```
-
-```javascript
-const droplab = new DropLab();
-
-const trigger = document.getElementById('trigger');
-const list = document.getElementById('list');
-
-droplab.init(trigger, list, [droplabAjax], {
- droplabAjax: {
- endpoint: '/some-endpoint',
- method: 'setData',
- },
-});
-```
-
-### Documentation
-
-Refer to the list of available [DropLab plugins](plugins/index.md) for
-information about their use.
-
-### Development
-
-When plugins are initialised for a DropLab trigger+dropdown, DropLab calls the
-plugins' `init` function, so this must be implemented in the plugin.
-
-```javascript
-class MyPlugin {
- static init() {
- this.someProp = 'someProp';
- this.someMethod();
- }
-
- static someMethod() {
- this.otherProp = 'otherProp';
- }
-}
-
-export default MyPlugin;
-```
diff --git a/doc/development/fe_guide/droplab/plugins/ajax.md b/doc/development/fe_guide/droplab/plugins/ajax.md
deleted file mode 100644
index f12f8f260c7..00000000000
--- a/doc/development/fe_guide/droplab/plugins/ajax.md
+++ /dev/null
@@ -1,46 +0,0 @@
----
-stage: none
-group: unassigned
-info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
----
-
-# Ajax plugin
-
-`Ajax` is a DropLab plugin that allows for retrieving and rendering list data
-from a server.
-
-## Usage
-
-Add the `Ajax` object to the plugins array of a `DropLab.prototype.init` or
-`DropLab.prototype.addHook` call.
-
-`Ajax` requires 2 configuration values: the `endpoint` and `method`.
-
-- `endpoint`: Should be a URL to the request endpoint.
-- `method`: Should be `setData` or `addData`.
-- `setData`: Completely replaces the dropdown with the response data.
-- `addData`: Appends the response data to the current dropdown list.
-
-```html
-<a href="#" id="trigger" data-dropdown-trigger="#list">Toggle</a>
-<ul id="list" data-dropdown><!-- ... --><ul>
-```
-
-```javascript
-const droplab = new DropLab();
-
-const trigger = document.getElementById('trigger');
-const list = document.getElementById('list');
-
-droplab.addHook(trigger, list, [Ajax], {
- Ajax: {
- endpoint: '/some-endpoint',
- method: 'setData',
- },
-});
-```
-
-Optionally, you can set `loadingTemplate` to a HTML string. This HTML string
-replaces the dropdown list while the request is pending.
-
-Additionally, you can set `onError` to a function to catch any XHR errors.
diff --git a/doc/development/fe_guide/droplab/plugins/filter.md b/doc/development/fe_guide/droplab/plugins/filter.md
deleted file mode 100644
index 79f10cdb6c1..00000000000
--- a/doc/development/fe_guide/droplab/plugins/filter.md
+++ /dev/null
@@ -1,55 +0,0 @@
----
-stage: none
-group: unassigned
-info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
----
-
-# Filter plugin
-
-`Filter` is a DropLab plugin that allows for filtering data that has been added
-to the dropdown using a simple fuzzy string search of an input value.
-
-## Usage
-
-Add the `Filter` object to the plugins array of a `DropLab.prototype.init` or
-`DropLab.prototype.addHook` call.
-
-- `Filter`: Requires a configuration value for `template`.
-- `template`: Should be the key of the objects within your data array that you
- want to compare to the user input string, for filtering.
-
-```html
-<input href="#" id="trigger" data-dropdown-trigger="#list">
-<ul id="list" data-dropdown data-dynamic>
- <li><a href="#" data-id="{{id}}">{{text}}</a></li>
-<ul>
-```
-
-```javascript
-const droplab = new DropLab();
-
-const trigger = document.getElementById('trigger');
-const list = document.getElementById('list');
-
-droplab.init(trigger, list, [Filter], {
- Filter: {
- template: 'text',
- },
-});
-
-droplab.addData('trigger', [{
- id: 0,
- text: 'Jacob',
-}, {
- id: 1,
- text: 'Jeff',
-}]);
-```
-
-In the previous code, the input string is compared against the `test` key of the
-passed data objects.
-
-Optionally you can set `filterFunction` to a function. This function is then
-used instead of `Filter`'s built-in string search. `filterFunction` is passed
-two arguments: the first is one of the data objects, and the second is the
-current input value.
diff --git a/doc/development/fe_guide/droplab/plugins/index.md b/doc/development/fe_guide/droplab/plugins/index.md
deleted file mode 100644
index c7a2865ca83..00000000000
--- a/doc/development/fe_guide/droplab/plugins/index.md
+++ /dev/null
@@ -1,14 +0,0 @@
----
-stage: none
-group: unassigned
-info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
-description: A list of DropLab plugins.
----
-
-# DropLab plugins
-
-The following plugins are available for use with [DropLab](../droplab.md):
-
-- [Ajax plugin](ajax.md)
-- [Filter plugin](filter.md)
-- [InputSetter plugin](input_setter.md)
diff --git a/doc/development/fe_guide/droplab/plugins/input_setter.md b/doc/development/fe_guide/droplab/plugins/input_setter.md
deleted file mode 100644
index a3c073520cb..00000000000
--- a/doc/development/fe_guide/droplab/plugins/input_setter.md
+++ /dev/null
@@ -1,72 +0,0 @@
----
-stage: none
-group: unassigned
-info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
----
-
-# InputSetter plugin
-
-`InputSetter` is a DropLab plugin that allows for updating DOM out of the scope
-of DropLab when a list item is clicked.
-
-## Usage
-
-Add the `InputSetter` object to the plugins array of a `DropLab.prototype.init`
-or `DropLab.prototype.addHook` call.
-
-- `InputSetter`: Requires a configuration value for `input` and `valueAttribute`.
-- `input`: The DOM element that you want to manipulate.
-- `valueAttribute`: A string that's the name of an attribute on your list items
- that's used to get the value to update the `input` element with.
-
-You can also set the `InputSetter` configuration to an array of objects, which
-allows you to update multiple elements.
-
-```html
-<input id="input" value="">
-<div id="div" data-selected-id=""></div>
-
-<input href="#" id="trigger" data-dropdown-trigger="#list">
-<ul id="list" data-dropdown data-dynamic>
- <li><a href="#" data-id="{{id}}">{{text}}</a></li>
-<ul>
-```
-
-```javascript
-const droplab = new DropLab();
-
-const trigger = document.getElementById('trigger');
-const list = document.getElementById('list');
-
-const input = document.getElementById('input');
-const div = document.getElementById('div');
-
-droplab.init(trigger, list, [InputSetter], {
- InputSetter: [{
- input: input,
- valueAttribute: 'data-id',
- } {
- input: div,
- valueAttribute: 'data-id',
- inputAttribute: 'data-selected-id',
- }],
-});
-
-droplab.addData('trigger', [{
- id: 0,
- text: 'Jacob',
-}, {
- id: 1,
- text: 'Jeff',
-}]);
-```
-
-In the previous code, if the second list item was clicked, it would update the
-`#input` element to have a `value` of `1`, it would also update the `#div`
-element's `data-selected-id` to `1`.
-
-Optionally, you can set `inputAttribute` to a string that's the name of an
-attribute on your `input` element that you want to update. If you don't provide
-an `inputAttribute`, `InputSetter` updates the `value` of the `input`
-element if it's an `INPUT` element, or the `textContent` of the `input` element
-if it isn't an `INPUT` element.
diff --git a/doc/development/fe_guide/editor_lite.md b/doc/development/fe_guide/editor_lite.md
deleted file mode 100644
index 5020bf9eeeb..00000000000
--- a/doc/development/fe_guide/editor_lite.md
+++ /dev/null
@@ -1,9 +0,0 @@
----
-redirect_to: 'source_editor.md'
-remove_date: '2021-09-19'
----
-
-This document was moved to [another location](source_editor.md).
-
-<!-- This redirect file can be deleted after <2021-09-19>. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/#move-or-rename-a-page -->
diff --git a/doc/development/fe_guide/haml.md b/doc/development/fe_guide/haml.md
index 8f501007755..f905fdad77e 100644
--- a/doc/development/fe_guide/haml.md
+++ b/doc/development/fe_guide/haml.md
@@ -57,7 +57,7 @@ For example:
When using the GitLab UI form builder, the following components are available for use in HAML.
NOTE:
-Currently only `gitlab_ui_checkbox_component` is available but more components are planned.
+Currently only the listed components are available but more components are planned.
#### gitlab_ui_checkbox_component
@@ -72,3 +72,16 @@ Currently only `gitlab_ui_checkbox_component` is available but more components a
| `checked_value` | Value when checkbox is checked. | `String` | `false` (`'1'`) |
| `unchecked_value` | Value when checkbox is unchecked. | `String` | `false` (`'0'`) |
| `label_options` | Options that are passed to [Rails `label` method](https://api.rubyonrails.org/classes/ActionView/Helpers/FormBuilder.html#method-i-label). | `Hash` | `false` (`{}`) |
+
+#### gitlab_ui_radio_component
+
+[GitLab UI Docs](https://gitlab-org.gitlab.io/gitlab-ui/?path=/story/base-form-form-radio--default)
+
+| Argument | Description | Type | Required (default value) |
+|---|---|---|---|
+| `method` | Attribute on the object passed to `gitlab_ui_form_for`. | `Symbol` | `true` |
+| `value` | The value of the radio tag. | `Symbol` | `true` |
+| `label` | Radio label. | `String` | `true` |
+| `help_text` | Help text displayed below the radio button. | `String` | `false` (`nil`) |
+| `radio_options` | Options that are passed to [Rails `radio_button` method](https://api.rubyonrails.org/classes/ActionView/Helpers/FormBuilder.html#method-i-radio_button). | `Hash` | `false` (`{}`) |
+| `label_options` | Options that are passed to [Rails `label` method](https://api.rubyonrails.org/classes/ActionView/Helpers/FormBuilder.html#method-i-label). | `Hash` | `false` (`{}`) |
diff --git a/doc/development/fe_guide/index.md b/doc/development/fe_guide/index.md
index a6b49394733..9ef4375d795 100644
--- a/doc/development/fe_guide/index.md
+++ b/doc/development/fe_guide/index.md
@@ -133,9 +133,13 @@ Best practices for monitoring and maximizing frontend performance.
Frontend security practices.
-## [Accessibility](accessibility.md)
+## Accessibility
-Our accessibility standards and resources.
+Our [accessibility standards and resources](accessibility.md).
+
+## Logging
+
+Best practices for [client-side logging](logging.md) for GitLab frontend development.
## [Internationalization (i18n) and Translations](../i18n/externalization.md)
diff --git a/doc/development/fe_guide/logging.md b/doc/development/fe_guide/logging.md
new file mode 100644
index 00000000000..26633eade43
--- /dev/null
+++ b/doc/development/fe_guide/logging.md
@@ -0,0 +1,86 @@
+---
+stage: none
+group: unassigned
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
+---
+
+# Client-side logging for frontend development
+
+This guide contains the best practices for client-side logging for GitLab
+frontend development.
+
+## When to log to the browser console
+
+We do not want to log unnecessarily to the browser console, as excessively
+noisy console logs are not easy to read, parse, or process. We **do** want to
+give visibility to unintended events in the system. If a possible but unexpected
+exception occurs during runtime, we want to log the details of this exception.
+These logs can give significantly helpful context to end users creating issues, or
+contributors diagnosing problems.
+
+Whenever a `catch(e)` exists, and `e` is something unexpected, log the details.
+
+### What makes an error unexpected?
+
+Sometimes a caught exception can be part of normal operations. For instance, third-party
+libraries might throw an exception based on certain inputs. If we can gracefully
+handle these exceptions, then they are expected. Don't log them noisily.
+For example:
+
+```javascript
+try {
+ // Here, we call a method based on some user input.
+ // `doAThing` will throw an exception if the input is invalid.
+ const userInput = getUserInput();
+ doAThing(userInput);
+} catch (e) {
+ if (e instanceof FooSyntaxError) {
+ // To handle a `FooSyntaxError`, we just need to instruct the user to change their input.
+ // This isn't unexpected, and is part of normal operations.
+ setUserMessage(`Try writing better code. ${e.message}`);
+ } else {
+ // We're not sure what `e` is, so something unexpected and bad happened...
+ logError(e);
+ setUserMessage('Something unexpected happened...');
+ }
+}
+```
+
+## How to log an error
+
+We have a helpful `~/lib/logger` module which encapsulates how we can
+consistently log runtime errors in GitLab. Import `logError` from this
+module, and use it as you normally would `console.error`. Pass the actual `Error`
+object, so the stack trace and other details can be captured in the log:
+
+```javascript
+// 1. Import the logger module.
+import { logError } from '~/lib/logger';
+
+export const doThing = () => {
+ return foo()
+ .then(() => {
+ // ...
+ })
+ .catch(e => {
+ // 2. Use `logError` like you would `console.error`.
+ logError('An unexpected error occurred while doing the thing', e);
+
+ // We may or may not want to present that something bad happened to the end user.
+ showThingFailed();
+ });
+};
+```
+
+## Relation to frontend observability
+
+Client-side logging is strongly related to
+[Frontend observability](https://about.gitlab.com/company/team/structure/working-groups/frontend-observability/).
+We want unexpected errors to be observed by our monitoring systems, so
+we can quickly react to user-facing issues. For a number of reasons, it is
+unfeasible to send every log to the monitoring system. Don't shy away from using
+`~/lib/logger`, but consider controlling which messages passed to `~/lib/logger`
+are actually sent to the monitoring systems.
+
+A cohesive logging module helps us control these side effects consistently
+across the various entry points.
diff --git a/doc/development/fe_guide/storybook.md b/doc/development/fe_guide/storybook.md
index 15225cc1deb..a46157d2cad 100644
--- a/doc/development/fe_guide/storybook.md
+++ b/doc/development/fe_guide/storybook.md
@@ -33,19 +33,25 @@ Stories can be added for any Vue component in the `gitlab` repository.
To add a story:
1. Create a new `.stories.js` file in the same directory as the Vue component.
- The file name should have the same prefix as the Vue component.
+ The filename should have the same prefix as the Vue component.
```txt
vue_shared/
├─ components/
│ ├─ sidebar
- │ │ ├─ todo_button.vue
- │ │ ├─ todo_button.stories.js
+ │ | ├─ todo_toggle
+ │ | | ├─ todo_button.vue
+ │ │ | ├─ todo_button.stories.js
```
1. Write the story as per the [official Storybook instructions](https://storybook.js.org/docs/vue/writing-stories/introduction/)
Notes:
- Specify the `title` field of the story as the component's file path from the `javascripts/` directory,
- e.g. if the component is located at `app/assets/javascripts/vue_shared/components/sidebar/todo_toggle/todo_button.vue`, specify the `title` as
- `vue_shared/components/To-do Button`. This will ensure the Storybook navigation maps closely to our internal directory structure.
+ e.g. if the component is located at `app/assets/javascripts/vue_shared/components/sidebar/todo_toggle/todo_button.vue`, specify the story `title` as `vue_shared/components/sidebar/todo_toggle/todo_button`. This will ensure the Storybook navigation maps closely to our internal directory structure.
+
+## Mock backend APIs
+
+GitLab’s Storybook uses [MirajeJS](https://miragejs.com/) to mock REST and GraphQL APIs. Storybook shares the MirajeJS server
+with the [frontend integration tests](../testing_guide/testing_levels.md#frontend-integration-tests). You can find the MirajeJS
+configuration files in `spec/frontend_integration/mock_server`.
diff --git a/doc/development/fe_guide/style/scss.md b/doc/development/fe_guide/style/scss.md
index 6d9bbdd3f2d..ffaaa3e87c7 100644
--- a/doc/development/fe_guide/style/scss.md
+++ b/doc/development/fe_guide/style/scss.md
@@ -45,7 +45,7 @@ result (such as `ml-1` becoming `gl-ml-2`).
If a class you need has not been added to GitLab UI, you get to add it! Follow the naming patterns documented in the [utility files](https://gitlab.com/gitlab-org/gitlab-ui/-/tree/main/src/scss/utility-mixins) and refer to [GitLab UI's CSS documentation](https://gitlab.com/gitlab-org/gitlab-ui/-/blob/main/doc/contributing/adding_css.md#adding-utility-mixins) for more details, especially about adding responsive and stateful rules.
-If it is not possible to wait for a GitLab UI update (generally one day), add the class to [`utilities.scss`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/assets/stylesheets/utilities.scss) following the same naming conventions documented in GitLab UI. A follow—up issue to backport the class to GitLab UI and delete it from GitLab should be opened.
+If it is not possible to wait for a GitLab UI update (generally one day), add the class to [`utilities.scss`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/assets/stylesheets/utilities.scss) following the same naming conventions documented in GitLab UI. A follow-up issue to backport the class to GitLab UI and delete it from GitLab should be opened.
#### When should I create component classes?
diff --git a/doc/development/feature_categorization/index.md b/doc/development/feature_categorization/index.md
index 2f0f8101b53..20325facc75 100644
--- a/doc/development/feature_categorization/index.md
+++ b/doc/development/feature_categorization/index.md
@@ -72,6 +72,11 @@ class SomeCrossCuttingConcernWorker
end
```
+When possible, workers marked as "not owned" use their caller's
+category (worker or HTTP endpoint) in metrics and logs.
+For instance, `ReactiveCachingWorker` can have multiple feature
+categories in metrics and logs.
+
## Rails controllers
Specifying feature categories on controller actions can be done using
diff --git a/doc/development/feature_flags/index.md b/doc/development/feature_flags/index.md
index 1962d5262ce..987ff7c9fe8 100644
--- a/doc/development/feature_flags/index.md
+++ b/doc/development/feature_flags/index.md
@@ -21,7 +21,7 @@ All newly-introduced feature flags should be [disabled by default](https://about
NOTE:
This document is the subject of continued work as part of an epic to [improve internal usage of Feature Flags](https://gitlab.com/groups/gitlab-org/-/epics/3551). Raise any suggestions as new issues and attach them to the epic.
-For an [overview of the feature flag lifecycle](https://about.gitlab.com/handbook/product-development-flow/feature-flag-lifecycle/#feature-flag-lifecycle), or if you need help deciding [if you should use a feature flag](https://about.gitlab.com/handbook/product-development-flow/feature-flag-lifecycle/#when-to-use-feature-flags) or not, please see the [feature flag lifecycle](https://about.gitlab.com/handbook/product-development-flow/feature-flag-lifecycle) handbook page.
+For an [overview of the feature flag lifecycle](https://about.gitlab.com/handbook/product-development-flow/feature-flag-lifecycle/#feature-flag-lifecycle), or if you need help deciding [if you should use a feature flag](https://about.gitlab.com/handbook/product-development-flow/feature-flag-lifecycle/#when-to-use-feature-flags) or not, please see the [feature flag lifecycle](https://about.gitlab.com/handbook/product-development-flow/feature-flag-lifecycle/) handbook page.
## When to use feature flags
diff --git a/doc/development/file_storage.md b/doc/development/file_storage.md
index 71fc81a6ea3..d161206f44d 100644
--- a/doc/development/file_storage.md
+++ b/doc/development/file_storage.md
@@ -28,6 +28,8 @@ There are many places where file uploading is used, according to contexts:
- LFS Objects
- Merge request diffs
- Design Management design thumbnails
+- Topic
+ - Topic avatars
## Disk storage
@@ -42,6 +44,7 @@ they are still not 100% standardized. You can see them below:
| User avatars | yes | `uploads/-/system/user/avatar/:id/:filename` | `AvatarUploader` | User |
| User snippet attachments | yes | `uploads/-/system/personal_snippet/:id/:random_hex/:filename` | `PersonalFileUploader` | Snippet |
| Project avatars | yes | `uploads/-/system/project/avatar/:id/:filename` | `AvatarUploader` | Project |
+| Topic avatars | yes | `uploads/-/system/projects/topic/avatar/:id/:filename` | `AvatarUploader` | Topic |
| Issues/MR/Notes Markdown attachments | yes | `uploads/:project_path_with_namespace/:random_hex/:filename` | `FileUploader` | Project |
| Issues/MR/Notes Legacy Markdown attachments | no | `uploads/-/system/note/attachment/:id/:filename` | `AttachmentUploader` | Note |
| Design Management design thumbnails | yes | `uploads/-/system/design_management/action/image_v432x230/:id/:filename` | `DesignManagement::DesignV432x230Uploader` | DesignManagement::Action |
diff --git a/doc/development/filtering_by_label.md b/doc/development/filtering_by_label.md
index 2b9c7efc087..6f9811f7e05 100644
--- a/doc/development/filtering_by_label.md
+++ b/doc/development/filtering_by_label.md
@@ -82,6 +82,19 @@ AND (EXISTS (
While this worked without schema changes, and did improve readability somewhat,
it did not improve query performance.
+### Attempt A2: use label IDs in the WHERE EXISTS clause
+
+In [merge request #34503](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/34503), we followed a similar approach to A1. But this time, we
+did a separate query to fetch the IDs of the labels used in the filter so that we avoid the `JOIN` in the `EXISTS` clause and filter directly by
+`label_links.label_id`. We also added a new index on `label_links` for the `target_id`, `label_id`, and `target_type` columns to speed up this query.
+
+Finding the label IDs wasn't straightforward because there could be multiple labels with the same title within a single root namespace. We solved
+this by grouping the label IDs by title and then using the array of IDs in the `EXISTS` clauses.
+
+This resulted in a significant performance improvement. However, this optimization could not be applied to the dashboard pages
+where we do not have a project or group context. We could not easily search for the label IDs here because that would mean searching across all
+projects and groups that the user has access to.
+
## Attempt B: Denormalize using an array column
Having [removed MySQL support in GitLab 12.1](https://about.gitlab.com/blog/2019/06/27/removing-mysql-support/),
@@ -159,9 +172,8 @@ However, at present, the disadvantages outweigh the advantages.
## Conclusion
-We have yet to find a method that is demonstrably better than the current
-method, when considering:
+We found a method A2 that does not need denormalization and improves the query performance significantly. This
+did not apply to all cases, but we were able to apply method A1 to the rest of the cases so that we remove the
+`GROUP BY` and `HAVING` clauses in all scenarios.
-1. Query performance.
-1. Readability.
-1. Ease of maintaining schema consistency.
+This simplified the query and improved the performance in the most common cases.
diff --git a/doc/development/go_guide/go_upgrade.md b/doc/development/go_guide/go_upgrade.md
new file mode 100644
index 00000000000..75a093a55ac
--- /dev/null
+++ b/doc/development/go_guide/go_upgrade.md
@@ -0,0 +1,187 @@
+---
+stage: none
+group: unassigned
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
+---
+
+# Managing Go versions
+
+## Overview
+
+All Go binaries, with the exception of
+[GitLab Runner](https://gitlab.com/gitlab-org/gitlab-runner) and [Security Projects](https://gitlab.com/gitlab-org/security-products), are built in
+projects managed by the [Distribution team](https://about.gitlab.com/handbook/product/categories/#distribution-group).
+
+The [Omnibus GitLab](https://gitlab.com/gitlab-org/omnibus-gitlab) project creates a
+single, monolithic operating system package containing all the binaries, while
+the [Cloud-Native GitLab (CNG)](https://gitlab.com/gitlab-org/build/CNG) project
+publishes a set of Docker images deployed and configured by Helm Charts or
+the GitLab Operator.
+
+Testing matrices for all projects using Go must include the version shipped
+by Distribution:
+
+- [Check the Go version shipping with Omnibus GitLab](https://gitlab.com/gitlab-org/gitlab-omnibus-builder/-/blob/master/docker/VERSIONS#L6).
+- [Check the Go version shipping with Cloud-Native GitLab (CNG)](https://gitlab.com/gitlab-org/build/cng/blob/master/ci_files/variables.yml#L12).
+
+## Supporting multiple Go versions
+
+Individual Golang projects need to support multiple Go versions because:
+
+- When a new version of Go is released, we should start integrating it into the CI pipelines to verify compatibility with the new compiler.
+- We must support the [official Omnibus GitLab Go version](#updating-go-version), which may be behind the latest minor release.
+- When Omnibus switches Go version, we still may need to support the old one for security backports.
+
+These 3 requirements may easily be satisfied by keeping support for the [3 latest minor versions of Go](https://golang.org/dl/).
+
+It is ok to drop support for the oldest Go version and support only the 2 latest releases,
+if this is enough to support backports to the last 3 minor GitLab releases.
+
+For example, if we want to drop support for `go 1.11` in GitLab `12.10`, we need
+to verify which Go versions we are using in `12.9`, `12.8`, and `12.7`. We do not
+consider the active milestone, `12.10`, because a backport for `12.7` is required
+in case of a critical security release.
+
+- If both [Omnibus GitLab and Cloud-Native GitLab (CNG)](#updating-go-version) were using Go `1.12` in GitLab `12.7` and later,
+ then we can safely drop support for `1.11`.
+- If Omnibus GitLab or Cloud-Native GitLab (CNG) were using `1.11` in GitLab `12.7`, then we still need to keep
+ support for Go `1.11` for easier backporting of security fixes.
+
+## Updating Go version
+
+We should always:
+
+- Use the same Go version for Omnibus GitLab and Cloud Native GitLab.
+- Use a [supported version](https://golang.org/doc/devel/release#policy).
+- Use the most recent patch-level for that version to keep up with security fixes.
+
+Changing the version affects every project being compiled, so it's important to
+ensure that all projects have been updated to test against the new Go version
+before changing the package builders to use it. Despite [Go's compatibility promise](https://golang.org/doc/go1compat),
+changes between minor versions can expose bugs or cause problems in our projects.
+
+### Upgrade process
+
+The upgrade process involves several key steps:
+
+- [Track component updates and validation](#tracking-work).
+- [Track component integration for release](#tracking-work).
+- [Communication with stakeholders](#communication-plan).
+
+#### Tracking work
+
+Use [the product categories page](https://about.gitlab.com/handbook/product/categories/)
+if you need help finding the correct person or labels:
+
+1. Create the epic in `gitlab-org` group:
+ - Title the epic `Update Go version to <VERSION_NUMBER>`.
+ - Ping the engineering managers responsible for [the projects listed below](#known-dependencies-using-go).
+
+1. Create an upgrade issue for each dependency in the [location indicated below](#known-dependencies-using-go)
+ titled `Support building with Go <VERSION_NUMBER>`. Add the proper label to each issue for easier triage.
+
+ NOTE:
+ The upgrade issues must include [upgrade validation items](#upgrade-validation)
+ in their definition of done. Creating a second [performance testing issue](#upgrade-validation)
+ titled `Validate operation and performance at scale with Go <VERSION_NUMBER>`
+ is strongly recommended to help with scheduling tasks and managing workloads.
+
+1. Schedule an update with the [GitLab Development Kit](https://gitlab.com/gitlab-org/gitlab-development-kit/-/issues):
+ - Title the issue `Support using Go version <VERSION_NUMBER>`.
+ - Set the issue as related to every issue created in the previous step.
+1. Schedule one issue per Secure Stage team and add the `devops::secure` label to each:
+ - [Static Analysis tracker](https://gitlab.com/gitlab-org/gitlab/-/issues).
+ - [Composition Analysis tracker](https://gitlab.com/gitlab-org/gitlab/-/issues).
+ - [Container Security tracker](https://gitlab.com/gitlab-org/gitlab/-/issues).
+1. Schedule builder updates with Distribution projects:
+ - Dependency and GitLab Development Kit issues created in previous steps should be set as blockers.
+ - Each issue should have the title `Support building with Go <VERSION_NUMBER>` and description as noted:
+ - [Cloud-Native GitLab](https://gitlab.com/gitlab-org/charts/gitlab/-/issues)
+
+ ```plaintext
+ Update the `GO_VERSION` in `ci_files/variables.yml`.
+ ```
+
+ - [Omnibus GitLab Builder](https://gitlab.com/gitlab-org/gitlab-omnibus-builder/-/issues)
+
+ ```plaintext
+ Update `GO_VERSION` in `docker/VERSIONS`.
+ ```
+
+ - [Omnibus GitLab](https://gitlab.com/gitlab-org/omnibus-gitlab/-/issues)
+
+ ```plaintext
+ Update `BUILDER_IMAGE_REVISION` in `.gitlab-ci.yml` to match tag from builder.
+ ```
+
+ NOTE:
+ If the component is not automatically upgraded for [Omnibus GitLab](https://gitlab.com/gitlab-org/omnibus-gitlab/-/issues)
+ and [Cloud Native GitLab](https://gitlab.com/gitlab-org/charts/gitlab/-/issues),
+ issues should be opened in their respective trackers titled `Updated bundled version of COMPONENT_NAME`
+ and set as blocked by the component's upgrade issue.
+
+#### Known dependencies using Go
+
+| Component Name | Where to track work |
+|-------------------------------|---------------------|
+| [Alertmanager](https://github.com/prometheus/alertmanager) | [Issue Tracker](https://gitlab.com/gitlab-org/gitlab/-/issues) |
+| Docker Distribution Pruner | [Issue Tracker](https://gitlab.com/gitlab-org/docker-distribution-pruner) |
+| Gitaly | [Issue Tracker](https://gitlab.com/gitlab-org/gitaly/-/issues) |
+| GitLab Compose Kit | [Issuer Tracker](https://gitlab.com/gitlab-org/gitlab-compose-kit/-/issues) |
+| GitLab Container Registry | [Issue Tracker](https://gitlab.com/gitlab-org/container-registry) |
+| GitLab Elasticsearch Indexer | [Issue Tracker](https://gitlab.com/gitlab-org/gitlab-elasticsearch-indexer/-/issues) |
+| GitLab Kubernetes Agent (KAS) | [Issue Tracker](https://gitlab.com/gitlab-org/cluster-integration/gitlab-agent/-/issues) |
+| GitLab Pages | [Issue Tracker](https://gitlab.com/gitlab-org/gitlab-pages/-/issues) |
+| GitLab Quality Images | [Issue Tracker](https://gitlab.com/gitlab-org/gitlab-build-images/-/issues) |
+| GitLab Shell | [Issue Tracker](https://gitlab.com/gitlab-org/gitlab-shell/-/issues) |
+| GitLab Workhorse | [Issue Tracker](https://gitlab.com/gitlab-org/gitlab/-/issues) |
+| Labkit | [Issue Tracker](https://gitlab.com/gitlab-org/labkit/-/issues) |
+| [Node Exporter](https://github.com/prometheus/node_exporter) | [Issue Tracker](https://gitlab.com/gitlab-org/gitlab/-/issues) |
+| [PgBouncer Exporter](https://github.com/prometheus-community/pgbouncer_exporter) | [Issue Tracker](https://gitlab.com/gitlab-org/gitlab/-/issues) |
+| [Postgres Exporter](https://github.com/prometheus-community/postgres_exporter) | [Issue Tracker](https://gitlab.com/gitlab-org/gitlab/-/issues) |
+| [Prometheus](https://github.com/prometheus/prometheus) | [Issue Tracker](https://gitlab.com/gitlab-org/gitlab/-/issues) |
+| [Redis Exporter](https://github.com/oliver006/redis_exporter) | [Issue Tracker](https://gitlab.com/gitlab-org/gitlab/-/issues) |
+
+#### Communication plan
+
+Communication is required at several key points throughout the process and should
+be included in the relevant issues as part of the definition of done:
+
+1. Immediately after creating the epic, it should be posted to Slack. Community members must ask the pinged engineering managers for assistance with this step. The responsible GitLab team member should share a link to the epic in the following Slack channels:
+ - `#backend`
+ - `#development`
+1. Immediately after merging the GitLab Development Kit Update, the same maintainer should add an entry to the engineering week-in-review sync and
+ announce the change in the following Slack channels:
+ - `#backend`
+ - `#development`
+1. Immediately upon merge of the updated Go versions in
+ [Cloud-Native GitLab](https://gitlab.com/gitlab-org/build/CNG) and
+ [Omnibus GitLab](https://gitlab.com/gitlab-org/omnibus-gitlab) add the
+ change to the engineering-week-in-review sync and announce in the following
+ Slack channels:
+ - `#backend`
+ - `#development`
+ - `#releases`
+
+#### Upgrade validation
+
+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 [Performance, Reliability, and Availability guidelines](../code_review.md#performance-reliability-and-availability).
+
+Upstream component maintainers should consider validating their Go-based
+projects with:
+
+- Isolated component operation performance tests.
+
+ Integration tests are costly and should be testing inter-component
+ operational issues. Isolated component testing reduces mean time to
+ feedback on updates and decreases resource burn across the organization.
+
+- Components should have end-to-end test coverage in the GitLab Performance Test tool.
+- Integration validation through installation of fresh packages **_and_** upgrade from previous versions for:
+ - Single GitLab Node
+ - Reference Architecture Deployment
+ - Geo Deployment
diff --git a/doc/development/go_guide/index.md b/doc/development/go_guide/index.md
index 0ee73da48db..44f8924be04 100644
--- a/doc/development/go_guide/index.md
+++ b/doc/development/go_guide/index.md
@@ -23,6 +23,16 @@ experiences. Several projects were started with different standards and they
can still have specifics. They are described in their respective
`README.md` or `PROCESS.md` files.
+## Go language versions
+
+The Go upgrade documentation [provides an overview](go_upgrade.md#overview)
+of how GitLab manages and ships Go binary support.
+
+If a GitLab component requires a newer version of Go, please
+follow the [upgrade process](go_upgrade.md#updating-go-version) to ensure no customer, team, or component is adversely impacted.
+
+Sometimes, individual projects must also [manage builds with multiple versions of Go](go_upgrade.md#supporting-multiple-go-versions).
+
## Dependency Management
Go uses a source-based strategy for dependency management. Dependencies are
@@ -417,70 +427,6 @@ Generated Docker images should have the program at their `Entrypoint` to create
portable commands. That way, anyone can run the image, and without parameters
it displays its help message (if `cli` has been used).
-## Distributing Go binaries
-
-With the exception of [GitLab Runner](https://gitlab.com/gitlab-org/gitlab-runner),
-which publishes its own binaries, our Go binaries are created by projects
-managed by the [Distribution group](https://about.gitlab.com/handbook/product/categories/#distribution-group).
-
-The [Omnibus GitLab](https://gitlab.com/gitlab-org/omnibus-gitlab) project creates a
-single, monolithic operating system package containing all the binaries, while
-the [Cloud-Native GitLab (CNG)](https://gitlab.com/gitlab-org/build/CNG) project
-publishes a set of Docker images and Helm charts to glue them together.
-
-Both approaches use the same version of Go for all projects, so it's important
-to ensure all our Go-using projects have at least one Go version in common in
-their test matrices. You can check the version of Go currently being used by
-[Omnibus](https://gitlab.com/gitlab-org/gitlab-omnibus-builder/blob/master/docker/Dockerfile_debian_10#L59),
-and the version being used for [CNG](https://gitlab.com/gitlab-org/build/cng/blob/master/ci_files/variables.yml#L12).
-
-### Updating Go version
-
-We should always use a [supported version](https://golang.org/doc/devel/release#policy)
-of Go, that is, one of the three most recent minor releases, and should always use
-the most recent patch-level for that version, as it may contain security fixes.
-
-Changing the version affects every project being compiled, so it's important to
-ensure that all projects have been updated to test against the new Go version
-before changing the package builders to use it. Despite [Go's compatibility promise](https://golang.org/doc/go1compat),
-changes between minor versions can expose bugs or cause problems in our projects.
-
-Once you've picked a new Go version to use, the steps to update Omnibus and CNG
-are:
-
-- [Create a merge request in the CNG project](https://gitlab.com/gitlab-org/build/CNG/-/edit/master/ci_files/variables.yml?branch_name=update-go-version),
- update the `GO_VERSION` in `ci_files/variables.yml`.
-- [Create a merge request in the `gitlab-omnibus-builder` project](https://gitlab.com/gitlab-org/gitlab-omnibus-builder/-/edit/master/docker/VERSIONS?branch_name=update-go-version),
- update the `GO_VERSION` in `docker/VERSIONS`.
-- Tag a new release of `gitlab-omnibus-builder` containing the change.
-- [Create a merge request in the `omnibus-gitlab` project](https://gitlab.com/gitlab-org/omnibus-gitlab/edit/master/.gitlab-ci.yml?branch_name=update-gitlab-omnibus-builder-version),
- update the `BUILDER_IMAGE_REVISION` to match the newly-created tag.
-
-To reduce unnecessary differences between two distribution methods, Omnibus and
-CNG **should always use the same Go version**.
-
-### Supporting multiple Go versions
-
-Individual Golang-projects need to support multiple Go versions for the following reasons:
-
-1. When a new Go release is out, we should start integrating it into the CI pipelines to verify compatibility with the new compiler.
-1. We must support the [Omnibus official Go version](#updating-go-version), which may be behind the latest minor release.
-1. When Omnibus switches Go version, we still may need to support the old one for security backports.
-
-These 3 requirements may easily be satisfied by keeping support for the 3 latest minor versions of Go.
-
-It's ok to drop support for the oldest Go version and support only 2 latest releases,
-if this is enough to support backports to the last 3 GitLab minor releases.
-
-Example:
-
-In case we want to drop support for `go 1.11` in GitLab `12.10`, we need to verify which Go versions we are using in `12.9`, `12.8`, and `12.7`.
-
-We do not consider the active milestone, `12.10`, because a backport for `12.7` is required in case of a critical security release.
-
-1. If both [Omnibus and CNG](#updating-go-version) were using Go `1.12` in GitLab `12.7` and later, then we safely drop support for `1.11`.
-1. If Omnibus or CNG were using `1.11` in GitLab `12.7`, then we still need to keep support for Go `1.11` for easier backporting of security fixes.
-
## Secure Team standards and style guidelines
The following are some style guidelines that are specific to the Secure Team.
diff --git a/doc/development/graphql_guide/pagination.md b/doc/development/graphql_guide/pagination.md
index a37c47f1b11..1f40a605cfe 100644
--- a/doc/development/graphql_guide/pagination.md
+++ b/doc/development/graphql_guide/pagination.md
@@ -338,9 +338,9 @@ describe 'sorting and pagination' do
let(:ordered_issues) { issues.sort_by(&:weight) }
it_behaves_like 'sorted paginated query' do
- let(:sort_param) { :WEIGHT_ASC }
- let(:first_param) { 2 }
- let(:expected_results) { ordered_issues.map(&:iid) }
+ let(:sort_param) { :WEIGHT_ASC }
+ let(:first_param) { 2 }
+ let(:all_records) { ordered_issues.map(&:iid) }
end
end
end
diff --git a/doc/development/image_scaling.md b/doc/development/image_scaling.md
index 79687b66711..82ca8cf8e83 100644
--- a/doc/development/image_scaling.md
+++ b/doc/development/image_scaling.md
@@ -31,8 +31,8 @@ The hard-coded rules only permit:
Furthermore, configuration in Workhorse can lead to the image scaler rejecting a request if:
-- The image file is too large (controlled by [`max_filesize`](- we only rescale images that do not exceed a configured size in bytes (see [`max_filesize`](https://gitlab.com/gitlab-org/gitlab-workhorse/-/blob/67ab3a2985d2097392f93523ae1cffe0dbf01b31/config.toml.example#L17)))).
-- Too many image scalers are already running (controlled by [`max_scaler_procs`](https://gitlab.com/gitlab-org/gitlab-workhorse/-/blob/67ab3a2985d2097392f93523ae1cffe0dbf01b31/config.toml.example#L16)).
+- The image file is too large (controlled by [`max_filesize`](- we only rescale images that do not exceed a configured size in bytes (see [`max_filesize`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/workhorse/config.toml.example#L22)))).
+- Too many image scalers are already running (controlled by [`max_scaler_procs`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/workhorse/config.toml.example#L21)).
For instance, here are two different URLs that serve the GitLab project avatar both in its
original size and scaled down to 64 pixels. Only the second request will trigger the image scaler:
@@ -73,7 +73,7 @@ we simply follow the path we take to serve any ordinary upload.
### Workhorse
Assuming Rails decided the request to be valid, Workhorse will take over. Upon receiving the `send-scaled-image`
-instruction through the Rails response, a [special response injector](https://gitlab.com/gitlab-org/gitlab-workhorse/-/blob/master/internal/imageresizer/image_resizer.go)
+instruction through the Rails response, a [special response injector](https://gitlab.com/gitlab-org/gitlab/-/blob/master/workhorse/internal/imageresizer/image_resizer.go)
will be invoked that knows how to rescale images. The only inputs it requires are the location of the image
(a path if the image resides in block storage, or a URL to remote storage otherwise) and the desired width.
Workhorse will handle the location transparently so Rails does not need to be concerned with where the image
diff --git a/doc/development/import_project.md b/doc/development/import_project.md
index d021126c8eb..9872aa239dc 100644
--- a/doc/development/import_project.md
+++ b/doc/development/import_project.md
@@ -111,9 +111,9 @@ public folder (for example `/tmp/`) fixes the issue.
##### `Name can contain only letters, digits, emojis ...`
```plaintext
-Name can contain only letters, digits, emojis, '_', '.', dash, space. It must start with letter,
-digit, emoji or '_'. and Path can contain only letters, digits, '_', '-' and '.'. Cannot start
-with '-', end in '.git' or end in '.atom'
+Name can contain only letters, digits, emojis, '_', '.', '+', dashes, or spaces. It must start with a letter,
+digit, emoji, or '_', and Path can contain only letters, digits, '_', '-', or '.'. It cannot start
+with '-', end in '.git', or end in '.atom'.
```
The project name specified in `project_path` is not valid for one of the specified reasons.
@@ -216,6 +216,6 @@ This is due to a [n+1 calls limit being set for development setups](gitaly.md#to
Many of the tests also require a GitLab Personal Access Token. This is due to numerous endpoints themselves requiring authentication.
-[The official GitLab docs detail how to create this token](../user/profile/personal_access_tokens.md#create-a-personal-access-token). The tests require that the token is generated by an admin user and that it has the `API` and `read_repository` permissions.
+[The official GitLab docs detail how to create this token](../user/profile/personal_access_tokens.md#create-a-personal-access-token). The tests require that the token is generated by an administrator and that it has the `API` and `read_repository` permissions.
Details on how to use the Access Token with each type of test are found in their respective documentation.
diff --git a/doc/development/index.md b/doc/development/index.md
index e8e7369f6c5..3780c986367 100644
--- a/doc/development/index.md
+++ b/doc/development/index.md
@@ -18,7 +18,7 @@ the [Handbook](https://about.gitlab.com/handbook/).
For information on using GitLab to work on your own software projects, see the
[GitLab user documentation](../user/index.md).
-For information on working with the GitLab APIs, see the [API documentation](../api/README.md).
+For information on working with the GitLab APIs, see the [API documentation](../api/index.md).
For information about how to install, configure, update, and upgrade your own
GitLab instance, see the [administration documentation](../administration/index.md).
@@ -173,6 +173,7 @@ the [reviewer values](https://about.gitlab.com/handbook/engineering/workflow/rev
- [Windows Development on GCP](windows.md)
- [FIPS compliance](fips_compliance.md)
- [`Gemfile` guidelines](gemfile.md)
+- [Ruby upgrade guidelines](ruby_upgrade.md)
### Things to be aware of
@@ -189,6 +190,7 @@ the [reviewer values](https://about.gitlab.com/handbook/engineering/workflow/rev
- [Issuable-like Rails models](issuable-like-models.md)
- [Issue types vs first-class types](issue_types.md)
- [DeclarativePolicy framework](policies.md)
+- [Rails update guidelines](rails_update.md)
### Debugging
@@ -215,6 +217,7 @@ the [reviewer values](https://about.gitlab.com/handbook/engineering/workflow/rev
- [How to dump production data to staging](db_dump.md)
- [Geo development](geo.md)
- [Redis guidelines](redis.md)
+ - [Adding a new Redis instance](redis/new_redis_instance.md)
- [Sidekiq guidelines](sidekiq_style_guide.md) for working with Sidekiq workers
- [Working with Gitaly](gitaly.md)
- [Elasticsearch integration docs](elasticsearch.md)
@@ -253,8 +256,6 @@ the [reviewer values](https://about.gitlab.com/handbook/engineering/workflow/rev
## Performance guides
-- [Instrumentation](instrumentation.md) for Ruby code running in production
- environments.
- [Performance guidelines](performance.md) for writing code, benchmarks, and
certain patterns to avoid.
- [Caching guidelines](caching.md) for using caching in Rails under a GitLab environment.
@@ -334,6 +335,7 @@ See [database guidelines](database/index.md).
- [Features inside `.gitlab/`](features_inside_dot_gitlab.md)
- [Dashboards for stage groups](stage_group_dashboards.md)
- [Preventing transient bugs](transient/prevention-patterns.md)
+- [GitLab Application SLIs](application_slis/index.md)
## Other GitLab Development Kit (GDK) guides
diff --git a/doc/development/instrumentation.md b/doc/development/instrumentation.md
deleted file mode 100644
index 83e7444bb1f..00000000000
--- a/doc/development/instrumentation.md
+++ /dev/null
@@ -1,161 +0,0 @@
----
-stage: Monitor
-group: Monitor
-info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
----
-
-# Instrumenting Ruby code **(FREE)**
-
-[GitLab Performance Monitoring](../administration/monitoring/performance/index.md) allows instrumenting of both methods and custom
-blocks of Ruby code. Method instrumentation is the primary form of
-instrumentation with block-based instrumentation only being used when we want to
-drill down to specific regions of code within a method.
-
-Please refer to [Product Intelligence](https://about.gitlab.com/handbook/product/product-intelligence-guide/) if you are tracking product usage patterns.
-
-## Instrumenting Methods
-
-Instrumenting methods is done by using the `Gitlab::Metrics::Instrumentation`
-module. This module offers a few different methods that can be used to
-instrument code:
-
-- `instrument_method`: Instruments a single class method.
-- `instrument_instance_method`: Instruments a single instance method.
-- `instrument_class_hierarchy`: Given a Class, this method recursively
- instruments all sub-classes (both class and instance methods).
-- `instrument_methods`: Instruments all public and private class methods of a
- Module.
-- `instrument_instance_methods`: Instruments all public and private instance
- methods of a Module.
-
-To remove the need for typing the full `Gitlab::Metrics::Instrumentation`
-namespace you can use the `configure` class method. This method simply yields
-the supplied block while passing `Gitlab::Metrics::Instrumentation` as its
-argument. An example:
-
-```ruby
-Gitlab::Metrics::Instrumentation.configure do |conf|
- conf.instrument_method(Foo, :bar)
- conf.instrument_method(Foo, :baz)
-end
-```
-
-Using this method is in general preferred over directly calling the various
-instrumentation methods.
-
-Method instrumentation should be added in the initializer
-`config/initializers/zz_metrics.rb`.
-
-### Examples
-
-Instrumenting a single method:
-
-```ruby
-Gitlab::Metrics::Instrumentation.configure do |conf|
- conf.instrument_method(User, :find_by)
-end
-```
-
-Instrumenting an entire class hierarchy:
-
-```ruby
-Gitlab::Metrics::Instrumentation.configure do |conf|
- conf.instrument_class_hierarchy(ActiveRecord::Base)
-end
-```
-
-Instrumenting all public class methods:
-
-```ruby
-Gitlab::Metrics::Instrumentation.configure do |conf|
- conf.instrument_methods(User)
-end
-```
-
-### Checking Instrumented Methods
-
-The easiest way to check if a method has been instrumented is to check its
-source location. For example:
-
-```ruby
-method = Banzai::Renderer.method(:render)
-
-method.source_location
-```
-
-If the source location points to `lib/gitlab/metrics/instrumentation.rb` you
-know the method has been instrumented.
-
-If you're using Pry you can use the `$` command to display the source code of a
-method (along with its source location), this is easier than running the above
-Ruby code. In case of the above snippet you'd run the following:
-
-- `$ Banzai::Renderer.render`
-
-This prints a result similar to:
-
-```plaintext
-From: /path/to/your/gitlab/lib/gitlab/metrics/instrumentation.rb @ line 148:
-Owner: #<Module:0x0055f0865c6d50>
-Visibility: public
-Number of lines: 21
-
-def #{name}(#{args_signature})
- if trans = Gitlab::Metrics::Instrumentation.transaction
- trans.measure_method(#{label.inspect}) { super }
- else
- super
- end
-end
-```
-
-## Instrumenting Ruby Blocks
-
-Measuring blocks of Ruby code is done by calling `Gitlab::Metrics.measure` and
-passing it a block. For example:
-
-```ruby
-Gitlab::Metrics.measure(:foo) do
- ...
-end
-```
-
-The block is executed and the execution time is stored as a set of fields in the
-currently running transaction. If no transaction is present the block is yielded
-without measuring anything.
-
-Three values are measured for a block:
-
-- The real time elapsed, stored in `NAME_real_time`.
-- The CPU time elapsed, stored in `NAME_cpu_time`.
-- The call count, stored in `NAME_call_count`.
-
-Both the real and CPU timings are measured in milliseconds.
-
-Multiple calls to the same block results in the final values being the sum
-of all individual values. Take this code for example:
-
-```ruby
-3.times do
- Gitlab::Metrics.measure(:sleep) do
- sleep 1
- end
-end
-```
-
-Here, the final value of `sleep_real_time` is `3`, and not `1`.
-
-## Tracking Custom Events
-
-Besides instrumenting code GitLab Performance Monitoring also supports tracking
-of custom events. This is primarily intended to be used for tracking business
-metrics such as the number of Git pushes, repository imports, and so on.
-
-To track a custom event simply call `Gitlab::Metrics.add_event` passing it an
-event name and a custom set of (optional) tags. For example:
-
-```ruby
-Gitlab::Metrics.add_event(:user_login, email: current_user.email)
-```
-
-Event names should be verbs such as `push_repository` and `remove_branch`.
diff --git a/doc/development/integrations/secure.md b/doc/development/integrations/secure.md
index d37ce29e353..34293845d17 100644
--- a/doc/development/integrations/secure.md
+++ b/doc/development/integrations/secure.md
@@ -534,15 +534,24 @@ affecting version `2.50.3-2+deb9u1` of Debian package `glib2.0`:
},
"version": "2.50.3-2+deb9u1",
"operating_system": "debian:9",
- "image": "index.docker.io/library/nginx:1.18"
+ "image": "index.docker.io/library/nginx:1.18",
+ "kubernetes_resource": {
+ "namespace": "production",
+ "kind": "Deployment",
+ "name": "nginx-ingress",
+ "container_name": "nginx",
+ "agent_id": "1"
+ }
}
```
-The affected package is found when scanning the image of the pod `index.docker.io/library/nginx:1.18`.
+The affected package is found when scanning a deployment using the `index.docker.io/library/nginx:1.18` image.
The location fingerprint of a Cluster Image Scanning vulnerability combines the
-`operating_system` and the package `name`, so these attributes are mandatory. The `image` is also
-mandatory. All other attributes are optional.
+`namespace`, `kind`, `name`, and `container_name` fields from the `kubernetes_resource`,
+as well as the package `name`, so these fields are required. The `image` field is also mandatory.
+The `cluster_id` and `agent_id` are mutually exclusive, and one of them must be present.
+All other fields are optional.
#### SAST
diff --git a/doc/development/kubernetes.md b/doc/development/kubernetes.md
index 9e67227ec7f..45c94019c63 100644
--- a/doc/development/kubernetes.md
+++ b/doc/development/kubernetes.md
@@ -7,7 +7,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# Kubernetes integration - development guidelines **(FREE)**
This document provides various guidelines when developing for the GitLab
-[Kubernetes integration](../user/project/clusters/index.md).
+[Kubernetes integration](../user/infrastructure/clusters/index.md).
## Development
diff --git a/doc/development/merge_request_performance_guidelines.md b/doc/development/merge_request_performance_guidelines.md
index d87b7bcb5af..cbf3c09b28b 100644
--- a/doc/development/merge_request_performance_guidelines.md
+++ b/doc/development/merge_request_performance_guidelines.md
@@ -377,16 +377,6 @@ 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.
-## Instrumenting New Code
-
-**Summary:** always add instrumentation for new classes, modules, and methods.
-
-Newly added classes, modules, and methods must be instrumented. This ensures
-we can track the performance of this code over time.
-
-For more information see [Instrumentation](instrumentation.md). This guide
-describes how to add instrumentation and where to add it.
-
## Use of Caching
**Summary:** cache data in memory or in Redis when it's needed multiple times in
diff --git a/doc/development/migration_style_guide.md b/doc/development/migration_style_guide.md
index ce564551fbf..e03b96a0e14 100644
--- a/doc/development/migration_style_guide.md
+++ b/doc/development/migration_style_guide.md
@@ -879,7 +879,7 @@ See the [text data type](database/strings_and_the_text_data_type.md) style guide
## Timestamp column type
By default, Rails uses the `timestamp` data type that stores timestamp data
-without timezone information. The `timestamp` data type is used by calling
+without time zone information. The `timestamp` data type is used by calling
either the `add_timestamps` or the `timestamps` method.
Also, Rails converts the `:datetime` data type to the `timestamp` one.
@@ -904,15 +904,15 @@ end
```
Instead of using these methods, one should use the following methods to store
-timestamps with timezones:
+timestamps with time zones:
- `add_timestamps_with_timezone`
- `timestamps_with_timezone`
- `datetime_with_timezone`
This ensures all timestamps have a time zone specified. This, in turn, means
-existing timestamps don't suddenly use a different timezone when the system's
-timezone changes. It also makes it very clear which timezone was used in the
+existing timestamps don't suddenly use a different time zone when the system's
+time zone changes. It also makes it very clear which time zone was used in the
first place.
## Storing JSON in database
diff --git a/doc/development/packages.md b/doc/development/packages.md
index 869a1755d8f..38c1b941eaf 100644
--- a/doc/development/packages.md
+++ b/doc/development/packages.md
@@ -30,9 +30,9 @@ The existing database model requires the following:
### API endpoints
-Package systems work with GitLab via API. For example `lib/api/npm_packages.rb`
+Package systems work with GitLab via API. For example `lib/api/npm_project_packages.rb`
implements API endpoints to work with npm clients. So, the first thing to do is to
-add a new `lib/api/your_name_packages.rb` file with API endpoints that are
+add a new `lib/api/your_name_project_packages.rb` file with API endpoints that are
necessary to make the package system client to work. Usually that means having
endpoints like:
@@ -48,7 +48,7 @@ GET https://gitlab.com/api/v4/projects/<your_project_id>/packages/npm/
PUT https://gitlab.com/api/v4/projects/<your_project_id>/packages/npm/
```
-Group-level and instance-level endpoints are good to have but are optional.
+Group-level and instance-level endpoints should only be considered after the project-level endpoint is available in production.
#### Remote hierarchy
@@ -168,7 +168,7 @@ The implementation of the different Merge Requests varies between different pack
The MVC must support [Personal Access Tokens](../user/profile/personal_access_tokens.md) right from the start. We currently support two options for these tokens: OAuth and Basic Access.
-OAuth authentication is already supported. You can see an example in the [npm API](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/api/npm_packages.rb).
+OAuth authentication is already supported. You can see an example in the [npm API](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/api/npm_project_packages.rb).
[Basic Access authentication](https://developer.mozilla.org/en-US/docs/Web/HTTP/Authentication)
support is done by overriding a specific function in the API helpers, like
diff --git a/doc/development/pipelines.md b/doc/development/pipelines.md
index dd45091a31b..45982d6075b 100644
--- a/doc/development/pipelines.md
+++ b/doc/development/pipelines.md
@@ -6,8 +6,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# Pipelines for the GitLab project
-Pipelines for [`gitlab-org/gitlab`](https://gitlab.com/gitlab-org/gitlab) and [`gitlab-org/gitlab-foss`](https://gitlab.com/gitlab-org/gitlab-foss) (as well as the
-`dev` instance's mirrors) are configured in the usual
+Pipelines for [`gitlab-org/gitlab`](https://gitlab.com/gitlab-org/gitlab) (as well as the `dev` instance's) is configured in the usual
[`.gitlab-ci.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/.gitlab-ci.yml)
which itself includes files under
[`.gitlab/ci/`](https://gitlab.com/gitlab-org/gitlab/-/tree/master/.gitlab/ci)
@@ -17,29 +16,206 @@ We're striving to [dogfood](https://about.gitlab.com/handbook/engineering/#dogfo
GitLab [CI/CD features and best-practices](../ci/yaml/index.md)
as much as possible.
-## Overview
+## Minimal test jobs before a merge request is approved
-Pipelines for the GitLab project are created using the [`workflow:rules` keyword](../ci/yaml/index.md#workflow)
-feature of the GitLab CI/CD.
+**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.**
-Pipelines are always created for the following scenarios:
+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.
-- `main` branch, including on schedules, pushes, merges, and so on.
-- Merge requests.
-- Tags.
-- Stable, `auto-deploy`, and security branches.
+### RSpec minimal jobs
-Pipeline creation is also affected by the following CI/CD variables:
+#### Determining related RSpec test files in a merge request
-- If `$FORCE_GITLAB_CI` is set, pipelines are created.
-- If `$GITLAB_INTERNAL` is not set, pipelines are not created.
+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:
-No pipeline is created in any other cases (for example, when pushing a branch with no
-MR for it).
+- dynamic mapping from test coverage tracing (generated via the [Crystalball gem](https://github.com/toptal/crystalball))
+ ([see where it's used](https://gitlab.com/gitlab-org/gitlab/-/blob/47d507c93779675d73a05002e2ec9c3c467cd698/tooling/bin/find_tests#L15))
+- static mapping maintained in the [`tests.yml` file](https://gitlab.com/gitlab-org/gitlab/-/blob/master/tests.yml) for special cases that cannot
+ be mapped via coverage tracing ([see where it's used](https://gitlab.com/gitlab-org/gitlab/-/blob/47d507c93779675d73a05002e2ec9c3c467cd698/tooling/bin/find_tests#L12))
-The source of truth for these workflow rules is defined in [`.gitlab-ci.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/.gitlab-ci.yml).
+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.
+
+#### Exceptional cases
+
+In addition, there are a few circumstances where we would always run the full RSpec tests:
+
+- when the `pipeline:run-all-rspec` label is set on the merge request
+- when the merge request is created by an automation (e.g. Gitaly update or MR targeting a stable branch)
+- when any CI config file is changed (i.e. `.gitlab-ci.yml` or `.gitlab/ci/**/*`)
+
+### Jest minimal jobs
+
+#### Determining related 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.
+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
+
+In addition, there are a few circumstances where we would always run the full Jest tests:
+
+- when the `pipeline:run-all-rspec` label is set on the merge request
+- when the merge request is created by an automation (e.g. Gitaly update or MR targeting a stable branch)
+- when any CI config file is changed (i.e. `.gitlab-ci.yml` or `.gitlab/ci/**/*`)
+- when any frontend "core" file is changed (i.e. `package.json`, `yarn.lock`, `babel.config.js`, `jest.config.*.js`, `config/helpers/**/*.js`)
+- when any vendored JavaScript file is changed (i.e. `vendor/assets/javascripts/**/*`)
+- when any backend file is changed ([see the patterns list for details](https://gitlab.com/gitlab-org/gitlab/-/blob/3616946936c1adbd9e754c1bd06f86ba670796d8/.gitlab/ci/rules.gitlab-ci.yml#L205-216))
+
+## Fail-fast job in merge request pipelines
+
+To provide faster feedback when a merge request breaks existing tests, we are experimenting with a
+fail-fast mechanism.
+
+An `rspec fail-fast` job is added in parallel to all other `rspec` jobs in a merge
+request pipeline. This job runs the tests that are directly related to the changes
+in the merge request.
+
+If any of these tests fail, the `rspec fail-fast` job fails, triggering a
+`fail-pipeline-early` job to run. The `fail-pipeline-early` job:
+
+- Cancels the currently running pipeline and all in-progress jobs.
+- Sets pipeline to have status `failed`.
+
+For example:
+
+```mermaid
+graph LR
+ subgraph "prepare stage";
+ A["detect-tests"]
+ end
+
+ subgraph "test stage";
+ B["jest"];
+ C["rspec migration"];
+ D["rspec unit"];
+ E["rspec integration"];
+ F["rspec system"];
+ G["rspec fail-fast"];
+ end
+
+ subgraph "post-test stage";
+ Z["fail-pipeline-early"];
+ end
+
+ A --"artifact: list of test files"--> G
+ G --"on failure"--> Z
+```
+
+The `rspec fail-fast` is a no-op if there are more than 10 test files related to the
+merge request. This prevents `rspec fail-fast` duration from exceeding the average
+`rspec` job duration and defeating its purpose.
+
+This number can be overridden by setting a CI/CD variable named `RSPEC_FAIL_FAST_TEST_FILE_COUNT_THRESHOLD`.
+
+## Test jobs
+
+We have dedicated jobs for each [testing level](testing_guide/testing_levels.md) and each job runs depending on the
+changes made in your merge request.
+If you want to force all the RSpec jobs to run regardless of your changes, you can add the `pipeline:run-all-rspec` label to the merge request.
+
+WARNING:
+Forcing all jobs on docs only related MRs would not have the prerequisite jobs and would lead to errors
+
+### Test suite parallelization
+
+Our current RSpec tests parallelization setup is as follows:
+
+1. The `retrieve-tests-metadata` job in the `prepare` stage ensures we have a
+ `knapsack/report-master.json` file:
+ - The `knapsack/report-master.json` file is fetched from the latest `main` pipeline which runs `update-tests-metadata`
+ (for now it's the 2-hourly scheduled master pipeline), if it's not here we initialize the file with `{}`.
+1. Each `[rspec|rspec-ee] [unit|integration|system|geo] n m` job are run with
+ `knapsack rspec` and should have an evenly distributed share of tests:
+ - It works because the jobs have access to the `knapsack/report-master.json`
+ since the "artifacts from all previous stages are passed by default".
+ - the jobs set their own report path to
+ `"knapsack/${TEST_TOOL}_${TEST_LEVEL}_${DATABASE}_${CI_NODE_INDEX}_${CI_NODE_TOTAL}_report.json"`.
+ - if knapsack is doing its job, test files that are run should be listed under
+ `Report specs`, not under `Leftover specs`.
+1. The `update-tests-metadata` job (which only runs on scheduled pipelines for
+ [the canonical project](https://gitlab.com/gitlab-org/gitlab) takes all the
+ `knapsack/rspec*_pg_*.json` files and merge them all together into a single
+ `knapsack/report-master.json` file that is saved as artifact.
+
+After that, the next pipeline uses the up-to-date `knapsack/report-master.json` file.
+
+### Monitoring
+
+The GitLab test suite is [monitored](performance.md#rspec-profiling) for the `main` branch, and any branch
+that includes `rspec-profile` in their name.
+
+### Logging
+
+- Rails logging to `log/test.log` is disabled by default in CI [for
+ performance reasons](https://jtway.co/speed-up-your-rails-test-suite-by-6-in-1-line-13fedb869ec4). To override this setting, provide the
+ `RAILS_ENABLE_TEST_LOG` environment variable.
+
+## Review app jobs
+
+Consult the [Review Apps](testing_guide/review_apps.md) dedicated page for more information.
+
+## As-if-FOSS jobs
+
+The `* as-if-foss` jobs run the GitLab test suite "as if FOSS", meaning as if the jobs would run in the context
+of the `gitlab-org/gitlab-foss` project. These jobs are only created in the following cases:
+
+- when the `pipeline:run-as-if-foss` label is set on the merge request
+- when the merge request is created in the `gitlab-org/security/gitlab` project
+- when any CI config file is changed (i.e. `.gitlab-ci.yml` or `.gitlab/ci/**/*`)
+
+The `* as-if-foss` jobs are run in addition to the regular EE-context jobs. They have the `FOSS_ONLY='1'` variable
+set and get the `ee/` folder removed before the tests start running.
+
+The intent is to ensure that a change doesn't introduce a failure after the `gitlab-org/gitlab` project is synced to
+the `gitlab-org/gitlab-foss` project.
+
+## As-if-JH jobs
+
+The `* as-if-jh` jobs run the GitLab test suite "as if JiHu", meaning as if the jobs would run in the context
+of [the `gitlab-jh/gitlab` project](jh_features_review.md). These jobs are only created in the following cases:
+
+- when the `pipeline:run-as-if-jh` label is set on the merge request
+- when the `pipeline:run-all-rspec` label is set on the merge request
+- when any code or backstage file is changed
+- when any startup CSS file is changed
+
+The `* as-if-jh` jobs are run in addition to the regular EE-context jobs. The `jh/` folder is added before the tests start running.
+
+The intent is to ensure that a change doesn't introduce a failure after the `gitlab-org/gitlab` project is synced to
+the `gitlab-jh/gitlab` project.
+
+## PostgreSQL versions testing
+
+Our test suite runs against PG12 as GitLab.com runs on PG12 and
+[Omnibus defaults to PG12 for new installs and upgrades](../administration/package_information/postgresql_versions.md).
+
+We do run our test suite against PG11 and PG13 on nightly scheduled pipelines.
+
+We also run our test suite against PG11 upon specific database library changes in MRs and `main` pipelines (with the `rspec db-library-code pg11` job).
+
+### Current versions testing
+
+| Where? | PostgreSQL version |
+| ------ | ------------------ |
+| MRs | 12, 11 for DB library changes |
+| `main` (non-scheduled pipelines) | 12, 11 for DB library changes |
+| 2-hourly scheduled pipelines | 12, 11 for DB library changes |
+| `nightly` scheduled pipelines | 12, 11, 13 |
+
+### Long-term plan
+
+We follow the [PostgreSQL versions shipped with Omnibus GitLab](../administration/package_information/postgresql_versions.md):
+
+| PostgreSQL version | 14.1 (July 2021) | 14.2 (August 2021) | 14.3 (September 2021) | 14.4 (October 2021) | 14.5 (November 2021) | 14.6 (December 2021) |
+| -------------------| ---------------------- | ---------------------- | ---------------------- | ---------------------- | ---------------------- | ---------------------- |
+| PG12 | MRs/`2-hour`/`nightly` | MRs/`2-hour`/`nightly` | MRs/`2-hour`/`nightly` | MRs/`2-hour`/`nightly` | MRs/`2-hour`/`nightly` | MRs/`2-hour`/`nightly` |
+| PG11 | `nightly` | `nightly` | `nightly` | `nightly` | `nightly` | `nightly` |
+| PG13 | `nightly` | `nightly` | `nightly` | `nightly` | `nightly` | `nightly` |
-### Pipelines for Merge Requests
+## Pipelines types for merge requests
In general, pipelines for an MR fall into one or more of the following types,
depending on the changes made in the MR:
@@ -53,7 +229,7 @@ We use the [`rules:`](../ci/yaml/index.md#rules) and [`needs:`](../ci/yaml/index
to determine the jobs that need to be run in a pipeline. Note that an MR that includes multiple types of changes would
have a pipelines that include jobs from multiple types (for example, a combination of docs-only and code-only pipelines).
-#### Documentation only MR pipeline
+### Documentation only MR pipeline
[Reference pipeline](https://gitlab.com/gitlab-org/gitlab/-/pipelines/250546928):
@@ -71,7 +247,7 @@ graph LR
end
```
-#### Code-only MR pipeline
+### Code-only MR pipeline
[Reference pipeline](https://gitlab.com/gitlab-org/gitlab/pipelines/136295694)
@@ -102,7 +278,6 @@ graph RL;
1-16["brakeman-sast"];
1-17["eslint-sast"];
1-18["kubesec-sast"];
- 1-19["nodejs-scan-sast"];
1-20["secrets-sast"];
1-21["static-analysis (14 minutes)"];
click 1-21 "https://app.periscopedata.com/app/gitlab/652085/Engineering-Productivity---Pipeline-Build-Durations?widget=6914471&udv=0"
@@ -123,7 +298,7 @@ graph RL;
2_1-1 & 2_1-2 & 2_1-3 & 2_1-4 --> 1-6;
end
- 2_2-2["rspec frontend_fixture/rspec-ee frontend_fixture (7 minutes)"];
+ 2_2-2["rspec-all frontend_fixture (7 minutes)"];
class 2_2-2 criticalPath;
click 2_2-2 "https://app.periscopedata.com/app/gitlab/652085/Engineering-Productivity---Pipeline-Build-Durations?widget=7910143&udv=0"
2_2-4["memory-on-boot (3.5 minutes)"];
@@ -155,7 +330,7 @@ graph RL;
3_1-1["jest (14.5 minutes)"];
class 3_1-1 criticalPath;
click 3_1-1 "https://app.periscopedata.com/app/gitlab/652085/Engineering-Productivity---Pipeline-Build-Durations?widget=6914204&udv=0"
- subgraph "Needs `rspec frontend_fixture/rspec-ee frontend_fixture`";
+ subgraph "Needs `rspec-all frontend_fixture`";
3_1-1 --> 2_2-2;
end
@@ -173,7 +348,7 @@ graph RL;
end
```
-#### Frontend-only MR pipeline
+### Frontend-only MR pipeline
[Reference pipeline](https://gitlab.com/gitlab-org/gitlab/pipelines/134661039):
@@ -204,7 +379,6 @@ graph RL;
1-16["brakeman-sast"];
1-17["eslint-sast"];
1-18["kubesec-sast"];
- 1-19["nodejs-scan-sast"];
1-20["secrets-sast"];
1-21["static-analysis (14 minutes)"];
click 1-21 "https://app.periscopedata.com/app/gitlab/652085/Engineering-Productivity---Pipeline-Build-Durations?widget=6914471&udv=0"
@@ -226,7 +400,7 @@ graph RL;
2_1-1 & 2_1-2 & 2_1-3 & 2_1-4 --> 1-6;
end
- 2_2-2["rspec frontend_fixture/rspec-ee frontend_fixture (7 minutes)"];
+ 2_2-2["rspec-all frontend_fixture (7 minutes)"];
class 2_2-2 criticalPath;
click 2_2-2 "https://app.periscopedata.com/app/gitlab/652085/Engineering-Productivity---Pipeline-Build-Durations?widget=7910143&udv=0"
2_2-4["memory-on-boot (3.5 minutes)"];
@@ -266,7 +440,7 @@ graph RL;
3_1-1["jest (14.5 minutes)"];
class 3_1-1 criticalPath;
click 3_1-1 "https://app.periscopedata.com/app/gitlab/652085/Engineering-Productivity---Pipeline-Build-Durations?widget=6914204&udv=0"
- subgraph "Needs `rspec frontend_fixture/rspec-ee frontend_fixture`";
+ subgraph "Needs `rspec-all frontend_fixture`";
3_1-1 --> 2_2-2;
end
@@ -299,7 +473,7 @@ graph RL;
end
```
-#### QA-only MR pipeline
+### QA-only MR pipeline
[Reference pipeline](https://gitlab.com/gitlab-org/gitlab/pipelines/134645109):
@@ -330,7 +504,6 @@ graph RL;
1-16["brakeman-sast"];
1-17["eslint-sast"];
1-18["kubesec-sast"];
- 1-19["nodejs-scan-sast"];
1-20["secrets-sast"];
1-21["static-analysis (14 minutes)"];
click 1-21 "https://app.periscopedata.com/app/gitlab/652085/Engineering-Productivity---Pipeline-Build-Durations?widget=6914471&udv=0"
@@ -358,261 +531,53 @@ graph RL;
end
```
-### Fail-fast pipeline in Merge Requests
-
-To provide faster feedback when a Merge Request breaks existing tests, we are experimenting with a
-fail-fast mechanism.
-
-An `rspec fail-fast` job is added in parallel to all other `rspec` jobs in a Merge
-Request pipeline. This job runs the tests that are directly related to the changes
-in the Merge Request.
-
-If any of these tests fail, the `rspec fail-fast` job fails, triggering a
-`fail-pipeline-early` job to run. The `fail-pipeline-early` job:
-
-- Cancels the currently running pipeline and all in-progress jobs.
-- Sets pipeline to have status `failed`.
-
-For example:
-
-```mermaid
-graph LR
- subgraph "prepare stage";
- A["detect-tests"]
- end
-
- subgraph "test stage";
- B["jest"];
- C["rspec migration"];
- D["rspec unit"];
- E["rspec integration"];
- F["rspec system"];
- G["rspec fail-fast"];
- end
-
- subgraph "post-test stage";
- Z["fail-pipeline-early"];
- end
-
- A --"artifact: list of test files"--> G
- G --"on failure"--> Z
-```
-
-A Merge Request author may choose to opt-out of the fail fast mechanism by doing one of the following:
-
-- Adding the `pipeline:skip-rspec-fail-fast` label to the merge request
-- Starting the `dont-interrupt-me` job found in the `sync` stage of a Merge Request pipeline.
-
-The `rspec fail-fast` is a no-op if there are more than 10 test files related to the
-Merge Request. This prevents `rspec fail-fast` duration from exceeding the average
-`rspec` job duration and defeating its purpose.
-
-This number can be overridden by setting a CI/CD variable named `RSPEC_FAIL_FAST_TEST_FILE_COUNT_THRESHOLD`.
-
-NOTE:
-This experiment is only enabled when the CI/CD variable `RSPEC_FAIL_FAST_ENABLED=true` is set.
-
-#### Determining related test files in a Merge Request
-
-The test files related to the Merge Request are determined using the [`test_file_finder`](https://gitlab.com/gitlab-org/ci-cd/test_file_finder) gem.
-We are using a custom mapping between source file to test files, maintained in the `tests.yml` file.
-
-### RSpec minimal jobs
-
-Before a merge request is approved, the pipeline will run a minimal set of RSpec tests that are related to the merge request changes.
-This is to reduce the pipeline cost and shorten the job duration.
-
-To identify the minimal set of tests needed, we use [Crystalball gem](https://github.com/toptal/crystalball) to create a test mapping.
-The test mapping contains a map of each source files to a list of test files which is dependent of the source file.
-This mapping is currently generated using a combination of test coverage tracing and a static mapping.
-In the `detect-tests` job, we use this mapping to identify the minimal tests needed for the current Merge Request.
-
-After a merge request has been approved, the pipeline would contain the full RSpec tests. This will ensure that all tests
-have been run before a merge request is merged.
-
-### Jest minimal jobs
-
-Before a merge request is approved, the pipeline will run a minimal set of Jest tests that are related to the merge request changes.
-This is to reduce the pipeline cost and shorten the job duration.
-
-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.
-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.
-
-After a merge request has been approved, the pipeline would contain the full Jest tests. This will ensure that all tests
-have been run before a merge request is merged.
-
-In addition, there are a few circumstances where we would always run the full Jest tests:
-
-- when `package.json`, `yarn.lock`, `jest` config changes
-- when vendored JavaScript is changed
-- when `.graphql` files are changed
-
-### PostgreSQL versions testing
-
-Our test suite runs against PG12 as GitLab.com runs on PG12 and
-[Omnibus defaults to PG12 for new installs and upgrades](../administration/package_information/postgresql_versions.md),
-Our test suite is currently running against PG11, since GitLab.com still runs on PG11.
-
-We do run our test suite against PG11 on nightly scheduled pipelines as well as upon specific
-database library changes in MRs and `main` pipelines (with the `rspec db-library-code pg11` job).
-
-#### Current versions testing
-
-| Where? | PostgreSQL version |
-| ------ | ------------------ |
-| MRs | 12, 11 for DB library changes |
-| `main` (non-scheduled pipelines) | 12, 11 for DB library changes |
-| 2-hourly scheduled pipelines | 12, 11 for DB library changes |
-| `nightly` scheduled pipelines | 12, 11 |
-
-#### Long-term plan
-
-We follow the [PostgreSQL versions shipped with Omnibus GitLab](../administration/package_information/postgresql_versions.md):
-
-| PostgreSQL version | 13.11 (April 2021) | 13.12 (May 2021) | 14.0 (June 2021?) |
-| -------------------| ---------------------- | ---------------------- | ---------------------- |
-| PG12 | `nightly` | MRs/`2-hour`/`nightly` | MRs/`2-hour`/`nightly` |
-| PG11 | MRs/`2-hour`/`nightly` | `nightly` | `nightly` |
-
-### Test jobs
-
-Consult [GitLab tests in the Continuous Integration (CI) context](testing_guide/ci.md)
-for more information.
-
-We have dedicated jobs for each [testing level](testing_guide/testing_levels.md) and each job runs depending on the
-changes made in your merge request.
-If you want to force all the RSpec jobs to run regardless of your changes, you can add the `pipeline:run-all-rspec` label to the merge request.
-
-> Forcing all jobs on docs only related MRs would not have the prerequisite jobs and would lead to errors
-
-### Review app jobs
-
-Consult the [Review Apps](testing_guide/review_apps.md) dedicated page for more information.
-
-### As-if-FOSS jobs
-
-The `* as-if-foss` jobs allows the GitLab test suite "as-if-FOSS", meaning as if the jobs would run in the context
-of the `gitlab-org/gitlab-foss` project. These jobs are only created in the following cases:
-
-- `gitlab-org/security/gitlab` merge requests.
-- Merge requests with the `pipeline:run-as-if-foss` label
-- Merge requests that changes the CI configuration.
-
-The `* as-if-foss` jobs are run in addition to the regular EE-context jobs. They have the `FOSS_ONLY='1'` variable
-set and get their EE-specific folders removed before the tests start running.
-
-The intent is to ensure that a change doesn't introduce a failure after the `gitlab-org/gitlab` project is synced to
-the `gitlab-org/gitlab-foss` project.
-
-## Performance
-
-### Interruptible pipelines
-
-By default, all jobs are [interruptible](../ci/yaml/index.md#interruptible), except the
-`dont-interrupt-me` job which runs automatically on `main`, and is `manual`
-otherwise.
-
-If you want a running pipeline to finish even if you push new commits to a merge
-request, be sure to start the `dont-interrupt-me` job before pushing.
-
-### Caching strategy
-
-1. All jobs must only pull caches by default.
-1. All jobs must be able to pass with an empty cache. In other words, caches are only there to speed up jobs.
-1. We currently have several different cache definitions defined in
- [`.gitlab/ci/global.gitlab-ci.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/.gitlab/ci/global.gitlab-ci.yml),
- with fixed keys:
- - `.setup-test-env-cache`
- - `.rails-cache`
- - `.static-analysis-cache`
- - `.coverage-cache`
- - `.danger-review-cache`
- - `.qa-cache`
- - `.yarn-cache`
- - `.assets-compile-cache` (the key includes `${NODE_ENV}` so it's actually two different caches).
-1. These cache definitions are composed of [multiple atomic caches](../ci/caching/index.md#use-multiple-caches).
-1. Only the following jobs, running in 2-hourly scheduled pipelines, are pushing (that is, updating) to the caches:
- - `update-setup-test-env-cache`, defined in [`.gitlab/ci/rails.gitlab-ci.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/.gitlab/ci/rails.gitlab-ci.yml).
- - `update-gitaly-binaries-cache`, defined in [`.gitlab/ci/rails.gitlab-ci.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/.gitlab/ci/rails.gitlab-ci.yml).
- - `update-static-analysis-cache`, defined in [`.gitlab/ci/rails.gitlab-ci.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/.gitlab/ci/rails.gitlab-ci.yml).
- - `update-qa-cache`, defined in [`.gitlab/ci/qa.gitlab-ci.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/.gitlab/ci/qa.gitlab-ci.yml).
- - `update-assets-compile-production-cache`, defined in [`.gitlab/ci/frontend.gitlab-ci.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/.gitlab/ci/frontend.gitlab-ci.yml).
- - `update-assets-compile-test-cache`, defined in [`.gitlab/ci/frontend.gitlab-ci.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/.gitlab/ci/frontend.gitlab-ci.yml).
- - `update-yarn-cache`, defined in [`.gitlab/ci/frontend.gitlab-ci.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/.gitlab/ci/frontend.gitlab-ci.yml).
- - `update-storybook-yarn-cache`, defined in [`.gitlab/ci/frontend.gitlab-ci.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/.gitlab/ci/frontend.gitlab-ci.yml).
-1. These jobs can also be forced to run in merge requests with the `pipeline:update-cache` label (this can be useful to warm the caches in a MR that updates the cache keys).
-
-### Artifacts strategy
+## CI configuration internals
-We limit the artifacts that are saved and retrieved by jobs to the minimum in order to reduce the upload/download time and costs, as well as the artifacts storage.
+### Workflow rules
-### Pre-clone step
+Pipelines for the GitLab project are created using the [`workflow:rules` keyword](../ci/yaml/index.md#workflow)
+feature of the GitLab CI/CD.
-The `gitlab-org/gitlab` project on GitLab.com uses a [pre-clone step](https://gitlab.com/gitlab-org/gitlab/-/issues/39134)
-to seed the project with a recent archive of the repository. This is done for
-several reasons:
+Pipelines are always created for the following scenarios:
-- It speeds up builds because a 800 MB download only takes seconds, as opposed to a full Git clone.
-- It significantly reduces load on the file server, as smaller deltas mean less time spent in `git pack-objects`.
+- `main` branch, including on schedules, pushes, merges, and so on.
+- Merge requests.
+- Tags.
+- Stable, `auto-deploy`, and security branches.
-The pre-clone step works by using the `CI_PRE_CLONE_SCRIPT` variable
-[defined by GitLab.com shared runners](../ci/runners/build_cloud/linux_build_cloud.md#pre-clone-script).
+Pipeline creation is also affected by the following CI/CD variables:
-The `CI_PRE_CLONE_SCRIPT` is currently defined as a project CI/CD variable:
+- If `$FORCE_GITLAB_CI` is set, pipelines are created.
+- If `$GITLAB_INTERNAL` is not set, pipelines are not created.
-```shell
-(
- echo "Downloading archived master..."
- wget -O /tmp/gitlab.tar.gz https://storage.googleapis.com/gitlab-ci-git-repo-cache/project-278964/gitlab-master-shallow.tar.gz
+No pipeline is created in any other cases (for example, when pushing a branch with no
+MR for it).
- if [ ! -f /tmp/gitlab.tar.gz ]; then
- echo "Repository cache not available, cloning a new directory..."
- exit
- fi
+The source of truth for these workflow rules is defined in [`.gitlab-ci.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/.gitlab-ci.yml).
- rm -rf $CI_PROJECT_DIR
- echo "Extracting tarball into $CI_PROJECT_DIR..."
- mkdir -p $CI_PROJECT_DIR
- cd $CI_PROJECT_DIR
- tar xzf /tmp/gitlab.tar.gz
- rm -f /tmp/gitlab.tar.gz
- chmod a+w $CI_PROJECT_DIR
-)
-```
+### Default image
-The first step of the script downloads `gitlab-master.tar.gz` from
-Google Cloud Storage. There is a [GitLab CI job named `cache-repo`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/.gitlab/ci/cache-repo.gitlab-ci.yml#L5)
-that is responsible for keeping that archive up-to-date. Every two hours
-on a scheduled pipeline, it does the following:
+The default image is defined in [`.gitlab-ci.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/.gitlab-ci.yml).
-1. Creates a fresh clone of the `gitlab-org/gitlab` repository on GitLab.com.
-1. Saves the data as a `.tar.gz`.
-1. Uploads it into the Google Cloud Storage bucket.
+<!-- vale gitlab.Spelling = NO -->
-When a CI job runs with this configuration, the output looks something like this:
+It includes Ruby, Go, Git, Git LFS, Chrome, Node, Yarn, PostgreSQL, and Graphics Magick.
-```shell
-$ eval "$CI_PRE_CLONE_SCRIPT"
-Downloading archived master...
-Extracting tarball into /builds/group/project...
-Fetching changes...
-Reinitialized existing Git repository in /builds/group/project/.git/
-```
+<!-- vale gitlab.Spelling = YES -->
-Note that the `Reinitialized existing Git repository` message shows that
-the pre-clone step worked. The runner runs `git init`, which
-overwrites the Git configuration with the appropriate settings to fetch
-from the GitLab repository.
+The images used in our pipelines are configured in the
+[`gitlab-org/gitlab-build-images`](https://gitlab.com/gitlab-org/gitlab-build-images)
+project, which is push-mirrored to [`gitlab/gitlab-build-images`](https://dev.gitlab.org/gitlab/gitlab-build-images)
+for redundancy.
-`CI_REPO_CACHE_CREDENTIALS` contains the Google Cloud service account
-JSON for uploading to the `gitlab-ci-git-repo-cache` bucket. (If you're a
-GitLab Team Member, find credentials in the
-[GitLab shared 1Password account](https://about.gitlab.com/handbook/security/#1password-for-teams).
+The current version of the build images can be found in the
+["Used by GitLab section"](https://gitlab.com/gitlab-org/gitlab-build-images/blob/master/.gitlab-ci.yml).
-Note that this bucket should be located in the same continent as the
-runner, or [you can incur network egress charges](https://cloud.google.com/storage/pricing).
+### Default variables
-## CI configuration internals
+In addition to the [predefined CI/CD variables](../ci/variables/predefined_variables.md),
+each pipeline includes default variables defined in
+[`.gitlab-ci.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/.gitlab-ci.yml).
### Stages
@@ -644,24 +609,6 @@ that is deployed in stage `review`.
[an issue with the deployment](https://gitlab.com/gitlab-org/gitlab/-/issues/233458)).
- `notify`: This stage includes jobs that notify various failures to Slack.
-### Default image
-
-The default image is defined in [`.gitlab-ci.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/.gitlab-ci.yml).
-
-<!-- vale gitlab.Spelling = NO -->
-
-It includes Ruby, Go, Git, Git LFS, Chrome, Node, Yarn, PostgreSQL, and Graphics Magick.
-
-<!-- vale gitlab.Spelling = YES -->
-
-The images used in our pipelines are configured in the
-[`gitlab-org/gitlab-build-images`](https://gitlab.com/gitlab-org/gitlab-build-images)
-project, which is push-mirrored to [`gitlab/gitlab-build-images`](https://dev.gitlab.org/gitlab/gitlab-build-images)
-for redundancy.
-
-The current version of the build images can be found in the
-["Used by GitLab section"](https://gitlab.com/gitlab-org/gitlab-build-images/blob/master/.gitlab-ci.yml).
-
### Dependency Proxy
Some of the jobs are using images from Docker Hub, where we also use
@@ -681,12 +628,6 @@ Projects in the `gitlab-org` group pull from the Dependency Proxy, while
forks that reside on any other personal namespaces or groups fall back to
Docker Hub unless `${GITLAB_DEPENDENCY_PROXY}` is also defined there.
-### Default variables
-
-In addition to the [predefined CI/CD variables](../ci/variables/predefined_variables.md),
-each pipeline includes default variables defined in
-[`.gitlab-ci.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/.gitlab-ci.yml).
-
### Common job definitions
Most of the jobs [extend from a few CI definitions](../ci/yaml/index.md#extends)
@@ -756,8 +697,6 @@ and included in `rules` definitions via [YAML anchors](../ci/yaml/index.md#ancho
| `if-dot-com-gitlab-org-and-security-tag` | Limit jobs creation to tags for the `gitlab-org` and `gitlab-org/security` groups on GitLab.com. | |
| `if-dot-com-ee-schedule` | Limits jobs to scheduled pipelines for the `gitlab-org/gitlab` project on GitLab.com. | |
| `if-cache-credentials-schedule` | Limits jobs to scheduled pipelines with the `$CI_REPO_CACHE_CREDENTIALS` variable set. | |
-| `if-rspec-fail-fast-disabled` | Limits jobs to pipelines with `$RSPEC_FAIL_FAST_ENABLED` CI/CD variable not set to `"true"`. | |
-| `if-rspec-fail-fast-skipped` | Matches if the pipeline is for a merge request and the MR has label ~"pipeline:skip-rspec-fail-fast". | |
| `if-security-pipeline-merge-result` | Matches if the pipeline is for a security merge request triggered by `@gitlab-release-tools-bot`. | |
<!-- vale gitlab.Substitutions = YES -->
@@ -783,6 +722,114 @@ and included in `rules` definitions via [YAML anchors](../ci/yaml/index.md#ancho
| `code-qa-patterns` | Combination of `code-patterns` and `qa-patterns`. |
| `code-backstage-qa-patterns` | Combination of `code-patterns`, `backstage-patterns`, and `qa-patterns`. |
+## Performance
+
+### Interruptible pipelines
+
+By default, all jobs are [interruptible](../ci/yaml/index.md#interruptible), except the
+`dont-interrupt-me` job which runs automatically on `main`, and is `manual`
+otherwise.
+
+If you want a running pipeline to finish even if you push new commits to a merge
+request, be sure to start the `dont-interrupt-me` job before pushing.
+
+### Caching strategy
+
+1. All jobs must only pull caches by default.
+1. All jobs must be able to pass with an empty cache. In other words, caches are only there to speed up jobs.
+1. We currently have several different cache definitions defined in
+ [`.gitlab/ci/global.gitlab-ci.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/.gitlab/ci/global.gitlab-ci.yml),
+ with fixed keys:
+ - `.setup-test-env-cache`
+ - `.rails-cache`
+ - `.static-analysis-cache`
+ - `.coverage-cache`
+ - `.danger-review-cache`
+ - `.qa-cache`
+ - `.yarn-cache`
+ - `.assets-compile-cache` (the key includes `${NODE_ENV}` so it's actually two different caches).
+1. These cache definitions are composed of [multiple atomic caches](../ci/caching/index.md#use-multiple-caches).
+1. Only the following jobs, running in 2-hourly scheduled pipelines, are pushing (that is, updating) to the caches:
+ - `update-setup-test-env-cache`, defined in [`.gitlab/ci/rails.gitlab-ci.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/.gitlab/ci/rails.gitlab-ci.yml).
+ - `update-gitaly-binaries-cache`, defined in [`.gitlab/ci/rails.gitlab-ci.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/.gitlab/ci/rails.gitlab-ci.yml).
+ - `update-static-analysis-cache`, defined in [`.gitlab/ci/rails.gitlab-ci.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/.gitlab/ci/rails.gitlab-ci.yml).
+ - `update-qa-cache`, defined in [`.gitlab/ci/qa.gitlab-ci.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/.gitlab/ci/qa.gitlab-ci.yml).
+ - `update-assets-compile-production-cache`, defined in [`.gitlab/ci/frontend.gitlab-ci.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/.gitlab/ci/frontend.gitlab-ci.yml).
+ - `update-assets-compile-test-cache`, defined in [`.gitlab/ci/frontend.gitlab-ci.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/.gitlab/ci/frontend.gitlab-ci.yml).
+ - `update-yarn-cache`, defined in [`.gitlab/ci/frontend.gitlab-ci.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/.gitlab/ci/frontend.gitlab-ci.yml).
+ - `update-storybook-yarn-cache`, defined in [`.gitlab/ci/frontend.gitlab-ci.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/.gitlab/ci/frontend.gitlab-ci.yml).
+1. These jobs can also be forced to run in merge requests with the `pipeline:update-cache` label (this can be useful to warm the caches in a MR that updates the cache keys).
+
+### Artifacts strategy
+
+We limit the artifacts that are saved and retrieved by jobs to the minimum in order to reduce the upload/download time and costs, as well as the artifacts storage.
+
+### Pre-clone step
+
+The `gitlab-org/gitlab` project on GitLab.com uses a [pre-clone step](https://gitlab.com/gitlab-org/gitlab/-/issues/39134)
+to seed the project with a recent archive of the repository. This is done for
+several reasons:
+
+- It speeds up builds because a 800 MB download only takes seconds, as opposed to a full Git clone.
+- It significantly reduces load on the file server, as smaller deltas mean less time spent in `git pack-objects`.
+
+The pre-clone step works by using the `CI_PRE_CLONE_SCRIPT` variable
+[defined by GitLab.com shared runners](../ci/runners/build_cloud/linux_build_cloud.md#pre-clone-script).
+
+The `CI_PRE_CLONE_SCRIPT` is currently defined as a project CI/CD variable:
+
+```shell
+(
+ echo "Downloading archived master..."
+ wget -O /tmp/gitlab.tar.gz https://storage.googleapis.com/gitlab-ci-git-repo-cache/project-278964/gitlab-master-shallow.tar.gz
+
+ if [ ! -f /tmp/gitlab.tar.gz ]; then
+ echo "Repository cache not available, cloning a new directory..."
+ exit
+ fi
+
+ rm -rf $CI_PROJECT_DIR
+ echo "Extracting tarball into $CI_PROJECT_DIR..."
+ mkdir -p $CI_PROJECT_DIR
+ cd $CI_PROJECT_DIR
+ tar xzf /tmp/gitlab.tar.gz
+ rm -f /tmp/gitlab.tar.gz
+ chmod a+w $CI_PROJECT_DIR
+)
+```
+
+The first step of the script downloads `gitlab-master.tar.gz` from
+Google Cloud Storage. There is a [GitLab CI job named `cache-repo`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/.gitlab/ci/cache-repo.gitlab-ci.yml#L5)
+that is responsible for keeping that archive up-to-date. Every two hours
+on a scheduled pipeline, it does the following:
+
+1. Creates a fresh clone of the `gitlab-org/gitlab` repository on GitLab.com.
+1. Saves the data as a `.tar.gz`.
+1. Uploads it into the Google Cloud Storage bucket.
+
+When a CI job runs with this configuration, the output looks something like this:
+
+```shell
+$ eval "$CI_PRE_CLONE_SCRIPT"
+Downloading archived master...
+Extracting tarball into /builds/group/project...
+Fetching changes...
+Reinitialized existing Git repository in /builds/group/project/.git/
+```
+
+Note that the `Reinitialized existing Git repository` message shows that
+the pre-clone step worked. The runner runs `git init`, which
+overwrites the Git configuration with the appropriate settings to fetch
+from the GitLab repository.
+
+`CI_REPO_CACHE_CREDENTIALS` contains the Google Cloud service account
+JSON for uploading to the `gitlab-ci-git-repo-cache` bucket. (If you're a
+GitLab Team Member, find credentials in the
+[GitLab shared 1Password account](https://about.gitlab.com/handbook/security/#1password-for-teams).
+
+Note that this bucket should be located in the same continent as the
+runner, or [you can incur network egress charges](https://cloud.google.com/storage/pricing).
+
---
[Return to Development documentation](index.md)
diff --git a/doc/development/profiling.md b/doc/development/profiling.md
index a58e1d60cc5..656b30402a6 100644
--- a/doc/development/profiling.md
+++ b/doc/development/profiling.md
@@ -98,11 +98,13 @@ profile and log output to S3.
## Speedscope flamegraphs
-You can generate a flamegraph for a particular URL by adding the `performance_bar=flamegraph` parameter to the request.
+You can generate a flamegraph for a particular URL by selecting a flamegraph sampling mode button in the performance bar or by adding the `performance_bar=flamegraph` parameter to the request.
![Speedscope](img/speedscope_v13_12.png)
-More information about the views can be found in the [Speedscope docs](https://github.com/jlfwong/speedscope#views)
+Find more information about the views in the [Speedscope docs](https://github.com/jlfwong/speedscope#views).
+
+Find more information about different sampling modes in the [Stackprof docs](https://github.com/tmm1/stackprof#sampling).
This is enabled for all users that can access the performance bar.
diff --git a/doc/development/rails_update.md b/doc/development/rails_update.md
new file mode 100644
index 00000000000..f25d68a8900
--- /dev/null
+++ b/doc/development/rails_update.md
@@ -0,0 +1,110 @@
+---
+stage: none
+group: unassigned
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
+---
+
+# Rails update guidelines
+
+We strive to run GitLab using the latest Rails releases to benefit from performance, security updates, and new features.
+
+## Rails update approach
+
+1. [Prepare an MR for GitLab](#prepare-an-mr-for-gitlab).
+1. [Prepare an MR for Gitaly](#prepare-an-mr-for-gitaly).
+1. [Create patch releases and backports for security patches](#create-patch-releases-and-backports-for-security-patches).
+
+### Prepare an MR for GitLab
+
+1. Check the [Upgrading Ruby on Rails](https://guides.rubyonrails.org/upgrading_ruby_on_rails.html) guide and prepare the application for the upcoming changes.
+1. Update the `rails` gem version in `Gemfile`.
+1. Run `bundle update rails`.
+1. Run the update task `rake rails:update`.
+1. Update the `activesupport` version in `qa/Gemfile`.
+1. Run `bundle update --conservative activesupport` in the `qa` folder.
+1. Resolve any Bundler conflicts.
+1. Ensure that `@rails/ujs` and `@rails/actioncable` npm packages match the new rails version in [`package.json`](https://gitlab.com/gitlab-org/gitlab/blob/master/package.json).
+1. Create an MR with the `pipeline:run-all-rspec` label and see if pipeline breaks.
+1. To resolve and debug spec failures use `git bisect` against the rails repository. See the [debugging section](#git-bisect-against-rails) below.
+1. Include links to the Gem diffs between the two versions in the merge request description. For example, this is the gem diff for [`activesupport` 6.1.3.2 to
+6.1.4.1](https://my.diffend.io/gems/activerecord/6.1.3.2/6.1.4.1).
+
+### Prepare an MR for Gitaly
+
+1. Update the `activesupport` gem version in [Gitaly Ruby's Gemfile](https://gitlab.com/gitlab-org/gitaly/-/blob/master/ruby/Gemfile).
+1. Run `bundle update --conservative activesupport`.
+1. Create an MR against the Gitaly project with these changes.
+1. Make this MR dependent on the MR created in the GitLab project.
+1. Merged this MR only **after** merging the GitLab project's MR.
+
+### Create patch releases and backports for security patches
+
+If the Rails update was over a patch release and it contains important security fixes,
+make sure to release it in a
+GitLab patch release to self-managed customers. Consult with our [release managers](https://about.gitlab.com/community/release-managers/)
+for how to proceed.
+
+### Deprecation Logger
+
+We also log Ruby and Rails deprecation warnings into a dedicated log file, `log/deprecation_json.log`. It provides
+clues when there is code that is not adequately covered by tests and hence would slip past `DeprecationToolkitEnv`.
+
+For GitLab SaaS, GitLab team members can inspect these log events in Kibana (`https://log.gprd.gitlab.net/goto/f7cebf1ff05038d901ba2c45925c7e01`).
+
+## Git bisect against Rails
+
+Usually, if you know which Rails change caused the spec to fail, it adds additional context and
+helps to find the fix for the failure.
+To efficiently and quickly find which Rails change caused the spec failure you can use the
+[`git bisect`](https://git-scm.com/docs/git-bisect) command against the Rails repository:
+
+1. Clone the `rails` project in a folder of your choice. For example, it might be the GDK root dir:
+
+ ```shell
+ cd <GDK_FOLDER>
+ git clone https://github.com/rails/rails.git
+ ```
+
+1. Replace the `gem 'rails'` line in GitLab `Gemfile` with:
+
+ ```ruby
+ gem 'rails', ENV['RAILS_VERSION'], path: ENV['RAILS_FOLDER']
+ ```
+
+1. Set the `RAILS_FOLDER` env variable with the folder you cloned Rails into:
+
+ ```shell
+ export RAILS_FOLDER="<GDK_FOLDER>/rails"
+ ```
+
+1. Change the directory to `RAILS_FOLDER` and set the range for the `git bisect` command:
+
+ ```shell
+ cd $RAILS_FOLDER
+ git bisect start <NEW_VERSION_TAG> <OLD_VERSION_TAG>
+ ```
+
+ Where `<NEW_VERSION_TAG>` is the tag where the spec is red and `<OLD_VERSION_TAG>` is the one with the green spec.
+ For example, `git bisect start v6.1.4.1 v6.1.3.2` if we're upgrading from version 6.1.3.2 to 6.1.4.1.
+ Replace `<NEW_VERSION_TAG>` with the tag where the spec is red and `<OLD_VERSION_TAG>` with the one with the green spec. For example, `git bisect start v6.1.4.1 v6.1.3.2` if we're upgrading from version 6.1.3.2 to 6.1.4.1.
+ In the output, you can see how many steps approximately it takes to find the commit.
+1. Start the `git bisect` process and pass spec's file name(s) to `scripts/rails-update-bisect` as an argument or arguments. It can be faster to pick only one example instead of an entire spec file.
+
+ ```shell
+ git bisect run <GDK_FOLDER>/gitlab/scripts/rails-update-bisect spec/models/ability_spec.rb
+ # OR
+ git bisect run <GDK_FOLDER>/gitlab/scripts/rails-update-bisect spec/models/ability_spec.rb:7
+ ```
+
+1. When the process is completed, `git bisect` prints the commit hash, which you can use to find the corresponding MR in the [`rails/rails`](https://github.com/rails/rails) repository.
+1. Execute `git bisect reset` to exit the `bisect` mode.
+1. Revert the changes to `Gemfile`:
+
+ ```shell
+ git checkout -- Gemfile
+ ```
+
+### Follow-up reading material
+
+- [Upgrading Ruby on Rails guide](https://guides.rubyonrails.org/upgrading_ruby_on_rails.html)
+- [Rails releases page](https://github.com/rails/rails/releases)
diff --git a/doc/development/redis.md b/doc/development/redis.md
index e631a6ec80c..fa07cebdc61 100644
--- a/doc/development/redis.md
+++ b/doc/development/redis.md
@@ -6,12 +6,17 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# Redis guidelines
+## Redis instances
+
GitLab uses [Redis](https://redis.io) for the following distinct purposes:
- Caching (mostly via `Rails.cache`).
- As a job processing queue with [Sidekiq](sidekiq_style_guide.md).
- To manage the shared application state.
+- To store CI trace chunks.
- As a Pub/Sub queue backend for ActionCable.
+- Rate limiting state storage.
+- Sessions.
In most environments (including the GDK), all of these point to the same
Redis instance.
@@ -29,6 +34,8 @@ more often than it is read.
If [Geo](geo.md) is enabled, each Geo node gets its own, independent Redis
database.
+We have [development documentation on adding a new Redis instance](redis/new_redis_instance.md).
+
## Key naming
Redis is a flat namespace with no hierarchy, which means we must pay attention
diff --git a/doc/development/redis/new_redis_instance.md b/doc/development/redis/new_redis_instance.md
new file mode 100644
index 00000000000..37ee51ebb82
--- /dev/null
+++ b/doc/development/redis/new_redis_instance.md
@@ -0,0 +1,132 @@
+---
+stage: none
+group: unassigned
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
+---
+
+# Add a new Redis instance
+
+GitLab can make use of multiple [Redis instances](../redis.md#redis-instances).
+These instances are functionally partitioned so that, for example, we
+can store [CI trace chunks](../../administration/job_logs.md#incremental-logging-architecture)
+from one Redis instance while storing sessions in another.
+
+From time to time we might want to add a new Redis instance. Typically this will
+be a functional partition split from one of the existing instances such as the
+cache or shared state. This document describes an approach
+for adding a new Redis instance that handles existing data, based on
+prior examples:
+
+- [Dedicated Redis instance for Trace Chunk storage](https://gitlab.com/groups/gitlab-com/gl-infra/-/epics/462).
+- [Create dedicated Redis instance for Rate Limiting data](https://gitlab.com/groups/gitlab-com/gl-infra/-/epics/526).
+
+This document does not cover the operational side of preparing and configuring
+the new Redis instance in detail, but the example epics do contain information
+on previous approaches to this.
+
+## Step 1: Support configuring the new instance
+
+Before we can switch any features to using the new instance, we have to support
+configuring it and referring to it in the codebase. We must support the
+main installation types:
+
+- Source installs (including development environments) - [example MR](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/62767)
+- Omnibus - [example MR](https://gitlab.com/gitlab-org/omnibus-gitlab/-/merge_requests/5316)
+- Helm charts - [example MR](https://gitlab.com/gitlab-org/charts/gitlab/-/merge_requests/2031)
+
+### Fallback instance
+
+In the application code, we need to define a fallback instance in case the new
+instance is not configured. For example, if a GitLab instance has already
+configured a separate shared state Redis, and we are partitioning data from the
+shared state Redis, our new instance's configuration should default to that of
+the shared state Redis when it's not present. Otherwise we could break instances
+that don't configure the new Redis instance as soon as it's available.
+
+You can [define a `.config_fallback` method](https://gitlab.com/gitlab-org/gitlab/-/blob/a75471dd744678f1a59eeb99f71fca577b155acd/lib/gitlab/redis/wrapper.rb#L69-87)
+in `Gitlab::Redis::Wrapper` (the base class for all Redis instances)
+that defines the instance to be used if this one is not configured. If we were
+adding a `Foo` instance that should fall back to `SharedState`, we can do that
+like this:
+
+```ruby
+module Gitlab
+ module Redis
+ class Foo < ::Gitlab::Redis::Wrapper
+ # The data we store on Foo used to be stored on SharedState.
+ def self.config_fallback
+ SharedState
+ end
+ end
+ end
+end
+```
+
+We should also add specs like those in
+[`trace_chunks_spec.rb`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/spec/lib/gitlab/redis/trace_chunks_spec.rb)
+to ensure that this fallback works correctly.
+
+## Step 2: Support writing to and reading from the new instance
+
+When migrating to the new instance, we must account for cases where data is
+either on:
+
+- The 'old' (original) instance.
+- The new one that we have just added support for.
+
+As a result we may need to support reading from and writing to both
+instances, depending on some condition.
+
+The exact condition to use varies depending on the data to be migrated. For
+the trace chunks case above, there was already a database column indicating where the
+data was stored (as there are other storage options than Redis).
+
+This step may not apply if the data has a very short lifetime (a few minutes at most)
+and is not critical. In that case, we
+may decide that it is OK to incur a small amount of data loss and switch
+over through configuration only.
+
+If there is not a more natural way to mark where the data is stored, using a
+[feature flag](../feature_flags/index.md) may be convenient:
+
+- It does not require an application restart to take effect.
+- It applies to all application instances (Sidekiq, API, web, etc.) at
+ the same time.
+- It supports incremental rollout - ideally by actor (project, group,
+ user, etc.) - so that we can monitor for errors and roll back easily.
+
+## Step 3: Migrate the data
+
+We then need to configure the new instance for GitLab.com's production and
+staging environments. Hopefully it will be possible to test this change
+effectively on staging, to at least make sure that basic usage continues to
+work.
+
+After that is done, we can roll out the change to production. Ideally this would
+be in an incremental fashion, following the
+[standard incremental rollout](../feature_flags/controls.md#rolling-out-changes)
+documentation for feature flags.
+
+When we have been using the new instance 100% of the time in production for a
+while and there are no issues, we can proceed.
+
+## Step 4: clean up after the migration
+
+<!-- markdownlint-disable MD044 -->
+We may choose to keep the migration paths or remove them, depending on whether
+or not we expect self-managed instances to perform this migration.
+[gitlab-com/gl-infra/scalability#1131](https://gitlab.com/gitlab-com/gl-infra/scalability/-/issues/1131#note_603354746)
+contains a discussion on this topic for the trace chunks feature flag. It may
+be - as in that case - that we decide that the maintenance costs of supporting
+the migration code are higher than the benefits of allowing self-managed
+instances to perform this migration seamlessly, if we expect self-managed
+instances to cope without this functional partition.
+<!-- markdownlint-enable MD044 -->
+
+If we decide to keep the migration code:
+
+- We should document the migration steps.
+- If we used a feature flag, we should ensure it's an [ops type feature
+ flag](../feature_flags/index.md#ops-type), as these are long-lived flags.
+
+Otherwise, we can remove the flags and conclude the project.
diff --git a/doc/development/repository_mirroring.md b/doc/development/repository_mirroring.md
index bb4c62d70ee..573ffaccaf9 100644
--- a/doc/development/repository_mirroring.md
+++ b/doc/development/repository_mirroring.md
@@ -11,7 +11,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
<!-- vale gitlab.Spelling = NO -->
In December 2018, Tiago Botelho hosted a Deep Dive (GitLab team members only: `https://gitlab.com/gitlab-org/create-stage/issues/1`)
-on the GitLab [Pull Repository Mirroring functionality](../user/project/repository/repository_mirroring.md#pull-from-a-remote-repository)
+on the GitLab [Pull Repository Mirroring functionality](../user/project/repository/mirror/pull.md)
to share his domain specific knowledge with anyone who may work in this part of the
codebase in the future. You can find the <i class="fa fa-youtube-play youtube" aria-hidden="true"></i> [recording on YouTube](https://www.youtube.com/watch?v=sSZq0fpdY-Y),
and the slides in [PDF](https://gitlab.com/gitlab-org/create-stage/uploads/8693404888a941fd851f8a8ecdec9675/Gitlab_Create_-_Pull_Mirroring_Deep_Dive.pdf).
diff --git a/doc/development/reusing_abstractions.md b/doc/development/reusing_abstractions.md
index ded6b074324..568e8a9d123 100644
--- a/doc/development/reusing_abstractions.md
+++ b/doc/development/reusing_abstractions.md
@@ -183,6 +183,8 @@ queries they produce.
Everything in `app/presenters`, used for exposing complex data to a Rails view,
without having to create many instance variables.
+See [the documentation](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/presenters/README.md) for more information.
+
### Serializers
Everything in `app/serializers`, used for presenting the response to a request,
diff --git a/doc/development/ruby_upgrade.md b/doc/development/ruby_upgrade.md
new file mode 100644
index 00000000000..ad6bff8499a
--- /dev/null
+++ b/doc/development/ruby_upgrade.md
@@ -0,0 +1,275 @@
+---
+stage: none
+group: unassigned
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
+---
+
+# Ruby upgrade guidelines
+
+We strive to run GitLab using the latest Ruby MRI releases to benefit from performance and
+security updates and new Ruby APIs. When upgrading Ruby across GitLab, we should do
+so in a way that:
+
+- Is least disruptive to contributors.
+- Optimizes for GitLab SaaS availability.
+- Maintains Ruby version parity across all parts of GitLab.
+
+Before making changes to Ruby versions, read through this document carefully and entirely to get a high-level
+understanding of what changes may be necessary. It is likely that every Ruby upgrade is a little
+different than the one before it, so assess the order and necessity of the documented
+steps.
+
+## Scope of a Ruby upgrade
+
+The first thing to consider when upgrading Ruby is scope. In general, we consider
+the following areas in which Ruby updates may have to occur:
+
+- The main GitLab Rails repository.
+- Any ancillary Ruby system repositories.
+- Any third-party libraries used by systems in these repositories.
+- Any GitLab libraries used by systems in these repositories.
+
+We may not always have to touch all of these. For instance, a patch-level Ruby update is
+unlikely to require updates in third-party gems.
+
+### Patch, minor, and major upgrades
+
+When assessing scope, the Ruby version level matters. For instance, it is harder and riskier
+to upgrade GitLab from Ruby 2.x to 3.x than it is to upgrade from Ruby 2.7.2 to 2.7.4, as
+patch releases are typically restricted to security or bug fixes.
+Be aware of this when preparing an upgrade and plan accordingly.
+
+To help you estimate the scope of future upgrades, see the efforts required for the following upgrades:
+
+- [Patch upgrade 2.7.2 -> 2.7.4](https://gitlab.com/gitlab-org/gitlab/-/issues/335890)
+- [Minor upgrade 2.6.x -> 2.7.x](https://gitlab.com/groups/gitlab-org/-/epics/2380)
+- [Major upgrade 2.x.x -> 3.x.x](https://gitlab.com/groups/gitlab-org/-/epics/5149)
+
+## Affected audiences and targets
+
+Before any upgrade, consider all audiences and targets, ordered by how immediately they are affected by Ruby upgrades:
+
+1. **Developers.** We have many contributors to GitLab and related projects both inside and outside the company. Changing files such as `.ruby-version` affects everyone using tooling that interprets these files.
+The developers are affected as soon as they pull from the repository containing the merged changes.
+1. **GitLab CI/CD.** We heavily lean on CI/CD for code integration and testing. CI/CD jobs do not interpret files such as `.ruby-version`.
+Instead, they use the Ruby installed in the Docker container they execute in, which is defined in `.gitlab-ci.yml`.
+The container images used in these jobs are maintained in the [`gitlab-build-images`](https://gitlab.com/gitlab-org/gitlab-build-images) repository.
+When we merge an update to an image, CI/CD jobs are affected as soon as the [image is built](https://gitlab.com/gitlab-org/gitlab-build-images/#pushing-a-rebuild-image).
+1. **GitLab SaaS**. GitLab.com is deployed from customized Helm charts that use Docker images from [Cloud Native GitLab (CNG)](https://gitlab.com/gitlab-org/build/CNG).
+Just like CI/CD, `.ruby-version` is meaningless in this environment. Instead, those Docker images must be patched to upgrade Ruby.
+GitLab SaaS is affected with the next deployment.
+1. **Self-managed GitLab.** Customers installing GitLab via [Omnibus](https://gitlab.com/gitlab-org/omnibus-gitlab) use none of the above.
+Instead, their Ruby version is defined by the [Ruby software bundle](https://gitlab.com/gitlab-org/omnibus-gitlab/blob/master/config/software/ruby.rb) in Omnibus.
+Self-managed customers are affected as soon as they upgrade to the release containing this change.
+
+## Ruby upgrade approach
+
+Timing all steps in a Ruby upgrade correctly is critical. As a general guideline, consider the following:
+
+- For smaller upgrades where production behavior is unlikely to change, aim to keep the version gap between
+repositories and production minimal. Coordinate with stakeholders to merge all changes closely together
+(within a day or two) to avoid drift. In this scenario the likely order is to upgrade developer tooling and
+environments first, production second.
+- For larger changes, the risk of going to production with a new Ruby is significant. In this case, try to get into a
+position where all known incompatibilities with the new Ruby version are already fixed, then work
+with production engineers to deploy the new Ruby to a subset of the GitLab production fleet. In this scenario
+the likely order is to update production first, developer tooling and environments second. This makes rollbacks
+easier in case of critical regressions in production.
+
+Either way, we found that from past experience the following approach works well, with some steps likely only
+necessary for minor and major upgrades. Note that some of these steps can happen in parallel or may have their
+order reversed as described above.
+
+### Create an epic
+
+Tracking this work in an epic is useful to get a sense of progress. For larger upgrades, include a
+timeline in the epic description so stakeholders know when the final switch is expected to go live.
+
+Break changes to individual repositories into separate issues under this epic.
+
+### Communicate the intent to upgrade
+
+Especially for upgrades that introduce or deprecate features,
+communicate early that an upgrade is due, ideally with an associated timeline. Provide links to important or
+noteworthy changes, so developers can start to familiarize themselves with
+changes ahead of time.
+
+GitLab team members should announce the intent in relevant Slack channels (`#backend` and `#development` at minimum)
+and Engineering Week In Review (EWIR). Include a link to the upgrade epic in your
+[communication](https://about.gitlab.com/handbook/engineering/#communication).
+
+### Add new Ruby to CI/CD and development environments
+
+To build and run Ruby gems and the GitLab Rails application with a new Ruby, you must first prepare CI/CD
+and developer environments to include the new Ruby version.
+At this stage, you *must not make it the default Ruby yet*, but make it optional instead. This allows
+for a smoother transition by supporting both old and new Ruby versions for a period of time.
+
+There are two places that require changes:
+
+1. **[GitLab Build Images](https://gitlab.com/gitlab-org/gitlab-build-images).** These are Docker images
+we use for runners and other Docker-based pre-production environments. The kind of change necessary
+depends on the scope.
+ - For [patch level updates](https://gitlab.com/gitlab-org/gitlab-build-images/-/merge_requests/418), it should suffice to increment the patch level of `RUBY_VERSION`.
+All projects building against the same minor release automatically download the new patch release.
+ - For [major and minor updates](https://gitlab.com/gitlab-org/gitlab-build-images/-/merge_requests/320), create a new set of Docker images that can be used side-by-side with existing images during the upgrade process. **Important:** Make sure to copy over all Ruby patch files
+in the `/patches` directory to a new folder matching the Ruby version you upgrade to, or they aren't applied.
+1. **[GitLab Development Kit (GDK)](https://gitlab.com/gitlab-org/gitlab-development-kit).**
+Update GDK to add the new Ruby as an additional option for
+developers to choose from. This typically only requires it to be appended to `.tool-versions` so `asdf`
+users will benefit from this. Other users will have to install it manually
+([example](https://gitlab.com/gitlab-org/gitlab-development-kit/-/merge_requests/2136).)
+
+For larger version upgrades, consider working with [Quality Engineering](https://about.gitlab.com/handbook/engineering/quality/)
+to identify and set up a test plan.
+
+### Update third-party gems
+
+For patch releases this is unlikely to be necessary, but
+for minor and major releases, there could be breaking changes or Bundler dependency issues when gems
+pin Ruby to a particular version. A good way to find out is to create a merge request in `gitlab-org/gitlab`
+and see what breaks.
+
+### Update GitLab gems and related systems
+
+This is typically necessary, since gems or Ruby applications that we maintain ourselves contain the build setup such as
+`.ruby-version`, `.tool-versions`, or `.gitlab-ci.yml` files. While there isn't always a technical necessity to
+update these repositories for the GitLab Rails application to work with a new Ruby,
+it is good practice to keep Ruby versions in lock-step across all our repositories. For minor and major
+upgrades, add new CI/CD jobs to these repositories using the new Ruby.
+A [build matrix definition](../ci/yaml/index.md#parallel-matrix-jobs) can do this efficiently.
+
+#### Decide which repositories to update
+
+When upgrading Ruby, consider updating the following repositories:
+
+- [Gitaly](https://gitlab.com/gitlab-org/gitaly) ([example](https://gitlab.com/gitlab-org/gitaly/-/merge_requests/3771))
+- [GitLab Labkit](https://gitlab.com/gitlab-org/labkit-ruby) ([example](https://gitlab.com/gitlab-org/labkit-ruby/-/merge_requests/79))
+- [GitLab Exporter](https://gitlab.com/gitlab-org/gitlab-exporter) ([example](https://gitlab.com/gitlab-org/gitlab-exporter/-/merge_requests/150))
+- [GitLab Experiment](https://gitlab.com/gitlab-org/gitlab-experiment) ([example](https://gitlab.com/gitlab-org/gitlab-experiment/-/merge_requests/128))
+- [Gollum Lib](https://gitlab.com/gitlab-org/gollum-lib) ([example](https://gitlab.com/gitlab-org/gollum-lib/-/merge_requests/21))
+- [GitLab Helm Chart](https://gitlab.com/gitlab-org/charts/gitlab) ([example](https://gitlab.com/gitlab-org/charts/gitlab/-/merge_requests/2162))
+- [GitLab Sidekiq fetcher](https://gitlab.com/gitlab-org/sidekiq-reliable-fetch) ([example](https://gitlab.com/gitlab-org/sidekiq-reliable-fetch/-/merge_requests/33))
+- [Prometheus Ruby Mmap Client](https://gitlab.com/gitlab-org/prometheus-client-mmap) ([example](https://gitlab.com/gitlab-org/prometheus-client-mmap/-/merge_requests/59))
+- [GitLab-mail_room](https://gitlab.com/gitlab-org/gitlab-mail_room) ([example](https://gitlab.com/gitlab-org/gitlab-mail_room/-/merge_requests/16))
+
+To assess which of these repositories are critical to be updated alongside the main GitLab application consider:
+
+- The Ruby version scope.
+- The role that the service or library plays in the overall functioning of GitLab.
+
+Refer to the [list of GitLab projects](https://about.gitlab.com/handbook/engineering/projects/) for a complete
+account of which repositories could be affected.
+For smaller version upgrades, it can be acceptable to delay updating libraries that are non-essential or where
+we are certain that the main application test suite would catch regressions under a new Ruby version.
+
+NOTE:
+Consult with the respective code owners whether it is acceptable to merge these changes ahead
+of updating the GitLab application. It might be best to get the necessary approvals
+but wait to merge the change until everything is ready.
+
+### Prepare the GitLab application MR
+
+With the dependencies updated and the new gem versions released, you can update the main Rails
+application with any necessary changes, similar to the gems and related systems.
+On top of that, update the documentation to reflect the version change in the installation
+and update instructions ([example](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/68363)).
+
+NOTE:
+Be especially careful with timing this merge request, since as soon as it is merged, all GitLab contributors
+will be affected by it and the changes will be deployed. You must ensure that this MR remains
+open until everything else is ready, but it can be useful to get approval early to reduce lead time.
+
+### Give developers time to upgrade (grace period)
+
+With the new Ruby made available as an option, and all merge requests either ready or merged,
+there should be a grace period (1 week at minimum) during which developers can
+install the new Ruby on their machines. For GDK and `asdf` users this should happen automatically
+via `gdk update`.
+
+This pause is a good time to assess the risk of this upgrade for GitLab SaaS.
+For Ruby upgrades that are high risk, such as major version upgrades, it is recommended to
+coordinate the changes with the infrastructure team through a [change management request](https://about.gitlab.com/handbook/engineering/infrastructure/change-management/).
+Create this issue early to give everyone enough time to schedule and prepare changes.
+
+### Make it the default Ruby
+
+If there are no known version compatibility issues left, and the grace
+period has passed, all affected repositories and developer tools should be updated to make the new Ruby
+default.
+
+At this point, update the [GitLab Compose Kit (GCK)](https://gitlab.com/gitlab-org/gitlab-compose-kit).
+This is an alternative development environment for users that prefer to run GitLab in `docker-compose`.
+This project relies on the same Docker images as our runners, so it should maintain parity with changes
+in that repository. This change is only necessary when the minor or major version changes
+([example](https://gitlab.com/gitlab-org/gitlab-compose-kit/-/merge_requests/176).)
+
+As mentioned above, if the impact of the Ruby upgrade on SaaS availability is uncertain, it is
+prudent to skip this step until you have verified that it runs smootly in production via a staged
+rollout. In this case, go to the next step first, and then, after the verification period has passed, promote
+the new Ruby to be the new default.
+
+### Update CNG and Omnibus, merge the GitLab MR
+
+The last step is to use the new Ruby in production. This
+requires updating Omnibus and production Docker images to use the new version.
+Helm charts may also have to be updated if there were changes to related systems that maintain
+their own charts (such as `gitlab-exporter`.)
+
+To use the new Ruby in production, update the following projects:
+
+- [Cloud-native GitLab Docker Images (CNG)](https://gitlab.com/gitlab-org/build/CNG) ([example](https://gitlab.com/gitlab-org/build/CNG/-/merge_requests/739))
+- [Omnibus GitLab](https://gitlab.com/gitlab-org/omnibus-gitlab) ([example](https://gitlab.com/gitlab-org/omnibus-gitlab/-/merge_requests/5545))
+
+If you submit a change management request, coordinate the rollout with infrastructure
+engineers. When dealing with larger upgrades, involve [Release Managers](https://about.gitlab.com/community/release-managers/)
+in the rollout plan.
+
+### Create patch releases and backports for security patches
+
+If the upgrade was a patch release and contains important security fixes, it should be released as a
+GitLab patch release to self-managed customers. Consult our [release managers](https://about.gitlab.com/community/release-managers/)
+for how to proceed.
+
+## Ruby upgrade tooling
+
+There are several tools that ease the upgrade process.
+
+### Deprecation Toolkit
+
+A common problem with Ruby upgrades is that deprecation warnings turn into errors. This means that every single
+deprecation warning must be resolved before making the switch. To avoid new warnings from making it into the
+main application branch, we use [`DeprecationToolkitEnv`](https://gitlab.com/gitlab-org/gitlab/blob/master/spec/deprecation_toolkit_env.rb).
+This module observes deprecation warnings emitted from spec runs and turns them into test failures. This prevents
+developers from checking in new code that would fail under a new Ruby.
+
+Sometimes it cannot be avoided to introduce new warnings, for example when a Ruby gem we use emits these warnings
+and we have no control over it. In these cases, add silences, like [this merge request](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/68865) did.
+
+### Deprecation Logger
+
+We also log Ruby and Rails deprecation warnings to a dedicated log file, `log/deprecation_json.log`
+(see [GitLab Developers Guide to Logging](logging.md) for where to find GitLab log files),
+which can provide clues when there is code that is not adequately covered by tests and hence would slip past `DeprecationToolkitEnv`.
+
+For GitLab SaaS, GitLab team members can inspect these log events in Kibana
+(`https://log.gprd.gitlab.net/goto/f7cebf1ff05038d901ba2c45925c7e01`).
+
+## Recommendations
+
+During the upgrade process, consider the following recommendations:
+
+- **Front-load as many changes as possible.** Especially for minor and major releases, it is likely that application
+code will break or change. Any changes that are backward compatible should be merged into the main branch and
+released independently ahead of the Ruby version upgrade. This ensures that we move in small increments and
+get feedback from production environments early.
+- **Create an experimental branch for larger updates.** We generally try to avoid long-running topic branches,
+but for purposes of feedback and experimentation, it can be useful to have such a branch to get regular
+feedback from CI/CD when running a newer Ruby. This can be helpful when first assessing what problems
+we might run into, as [this MR](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/50640) demonstrates.
+These experimental branches are not intended to be merged; they can be closed once all required changes have been broken out
+and merged back independently.
+- **Give yourself enough time to fix problems ahead of a milestone release.** GitLab moves fast.
+As a Ruby upgrade requires many MRs to be sent and reviewed, make sure all changes are merged at least a week
+before the 22nd. This gives us extra time to act if something breaks. If in doubt, it is better to
+postpone the upgrade to the following month, as we [prioritize availability over velocity](https://about.gitlab.com/handbook/engineering/#prioritizing-technical-decisions).
diff --git a/doc/development/scalability.md b/doc/development/scalability.md
index 824c98b4b03..fdae66b7abc 100644
--- a/doc/development/scalability.md
+++ b/doc/development/scalability.md
@@ -45,7 +45,7 @@ many groups or projects, and the access level (including guest, developer, or
maintainer) to groups and projects determines what users can see and
what they can access.
-Users with admin access can access all projects and even impersonate
+Users with the administrator role can access all projects and even impersonate
users.
#### Sharding and partitioning
diff --git a/doc/development/service_ping/dictionary.md b/doc/development/service_ping/dictionary.md
index e7e8464ff7a..810c789bc03 100644
--- a/doc/development/service_ping/dictionary.md
+++ b/doc/development/service_ping/dictionary.md
@@ -1,4 +1,4 @@
---
-redirect_to: 'https://gitlab-org.gitlab.io/growth/product-intelligence/metric-dictionary'
+redirect_to: 'https://metrics.gitlab.com/index.html'
remove_date: '2021-11-10'
---
diff --git a/doc/development/service_ping/implement.md b/doc/development/service_ping/implement.md
index d86b06a6965..34a845147dc 100644
--- a/doc/development/service_ping/implement.md
+++ b/doc/development/service_ping/implement.md
@@ -340,6 +340,9 @@ WARNING:
HyperLogLog (HLL) is a probabilistic algorithm and its **results always includes some small error**. According to [Redis documentation](https://redis.io/commands/pfcount), data from
used HLL implementation is "approximated with a standard error of 0.81%".
+NOTE:
+ A user's consent for usage_stats (`User.single_user&.requires_usage_stats_consent?`) is not checked during the data tracking stage due to performance reasons. Keys corresponding to those counters are present in Redis even if `usage_stats_consent` is still required. However, no metric is collected from Redis and reported back to GitLab as long as `usage_stats_consent` is required.
+
With `Gitlab::UsageDataCounters::HLLRedisCounter` we have available data structures used to count unique values.
Implemented using Redis methods [PFADD](https://redis.io/commands/pfadd) and [PFCOUNT](https://redis.io/commands/pfcount).
@@ -939,7 +942,6 @@ Aggregated metrics collected in `7d` and `28d` time frames are added into Servic
:packages => 155,
:personal_snippets => 2106,
:project_snippets => 407,
- :promoted_issues => 719,
:aggregated_metrics => {
:example_metrics_union => 7,
:example_metrics_intersection => 2
@@ -1028,9 +1030,9 @@ Example metrics persistence:
class UsageData
def count_secure_pipelines(time_period)
...
- relation = ::Security::Scan.latest_successful_by_build.by_scan_types(scan_type).where(security_scans: time_period)
+ relation = ::Security::Scan.by_scan_types(scan_type).where(time_period)
- pipelines_with_secure_jobs['dependency_scanning_pipeline'] = estimate_batch_distinct_count(relation, :commit_id, batch_size: 1000, start: start_id, finish: finish_id) do |result|
+ pipelines_with_secure_jobs['dependency_scanning_pipeline'] = estimate_batch_distinct_count(relation, :pipeline_id, batch_size: 1000, start: start_id, finish: finish_id) do |result|
::Gitlab::Usage::Metrics::Aggregates::Sources::PostgresHll
.save_aggregated_metrics(metric_name: 'dependency_scanning_pipeline', recorded_at_timestamp: recorded_at, time_period: time_period, data: result)
end
diff --git a/doc/development/service_ping/index.md b/doc/development/service_ping/index.md
index 0a94fa2ff6c..19bf7446da9 100644
--- a/doc/development/service_ping/index.md
+++ b/doc/development/service_ping/index.md
@@ -68,9 +68,9 @@ We use the following terminology to describe the Service Ping components:
Starting with GitLab version 14.1, free self-managed users running [GitLab EE](../ee_features.md) can receive paid features by registering with GitLab and sending us activity data via [Service Ping](#what-is-service-ping). Features introduced here do not remove the feature from its paid tier. Users can continue to access the features in a paid tier without sharing usage data.
-The paid feature available in this offering is [Email from GitLab](../../tools/email.md).
-Administrators can use this [Premium](https://about.gitlab.com/pricing/premium/) feature to streamline
-their workflow by emailing all or some instance users directly from the Admin Area.
+##### Features available in 14.1 and later
+
+1. [Email from GitLab](../../tools/email.md).
NOTE:
Registration is not yet required for participation, but will be added in a future milestone.
@@ -110,7 +110,7 @@ To disable Service Ping in the GitLab UI:
1. On the top bar, select **Menu > Admin**.
1. On the left sidebar, select **Settings > Metrics and profiling**.
1. Expand the **Usage statistics** section.
-1. Clear the **Enable service ping** checkbox.
+1. Clear the **Enable Service Ping** checkbox.
1. Select **Save changes**.
### Disable Service Ping using the configuration file
@@ -554,5 +554,5 @@ To work around this bug, you have two options:
1. In GitLab, on the top bar, select **Menu > Admin**.
1. On the left sidebar, select **Settings > Metrics and profiling**.
1. Expand **Usage Statistics**.
- 1. Clear the **Enable service ping** checkbox.
+ 1. Clear the **Enable Service Ping** checkbox.
1. Select **Save Changes**.
diff --git a/doc/development/service_ping/metrics_dictionary.md b/doc/development/service_ping/metrics_dictionary.md
index 8dc2d2255d1..c1478e6290e 100644
--- a/doc/development/service_ping/metrics_dictionary.md
+++ b/doc/development/service_ping/metrics_dictionary.md
@@ -6,7 +6,9 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# Metrics Dictionary Guide
-This guide describes the [Metrics Dictionary](https://gitlab-org.gitlab.io/growth/product-intelligence/metric-dictionary) and how it's implemented.
+[Service Ping](index.md) metrics are defined in the
+[Metrics Dictionary](https://metrics.gitlab.com/index.html).
+This guide describes the dictionary and how it's implemented.
## Metrics Definition and validation
diff --git a/doc/development/service_ping/metrics_lifecycle.md b/doc/development/service_ping/metrics_lifecycle.md
index c0446aece8b..46040146de2 100644
--- a/doc/development/service_ping/metrics_lifecycle.md
+++ b/doc/development/service_ping/metrics_lifecycle.md
@@ -136,7 +136,10 @@ Product Intelligence team as inactive and is assigned to the group owner for rev
We are working on automating this process. See [this issue](https://gitlab.com/gitlab-org/gitlab/-/issues/338466) for details.
-Only deprecated metrics can be removed from Service Ping.
+Metrics can be removed from Service Ping if they:
+
+- Were previously [deprecated](#deprecate-a-metric).
+- Are not used in any Sisense dashboard.
For an example of the metric removal process take a look at this [example issue](https://gitlab.com/gitlab-org/gitlab/-/issues/297029)
diff --git a/doc/development/service_ping/review_guidelines.md b/doc/development/service_ping/review_guidelines.md
index 048b705636f..eb64d460b5a 100644
--- a/doc/development/service_ping/review_guidelines.md
+++ b/doc/development/service_ping/review_guidelines.md
@@ -14,7 +14,7 @@ general best practices for code reviews, refer to our [code review guide](../cod
## Resources for reviewers
- [Service Ping Guide](index.md)
-- [Metrics Dictionary](https://gitlab-org.gitlab.io/growth/product-intelligence/metric-dictionary)
+- [Metrics Dictionary](https://metrics.gitlab.com/index.html)
## Review process
diff --git a/doc/development/sidekiq_style_guide.md b/doc/development/sidekiq_style_guide.md
index 04b7e2f5c45..d45e2073fe7 100644
--- a/doc/development/sidekiq_style_guide.md
+++ b/doc/development/sidekiq_style_guide.md
@@ -154,12 +154,6 @@ A good example of that would be a cache expiration worker.
A job scheduled for an idempotent worker is [deduplicated](#deduplication) when
an unstarted job with the same arguments is already in the queue.
-WARNING:
-For [data consistency jobs](#job-data-consistency-strategies), the deduplication is not compatible with the
-`data_consistency` attribute set to `:sticky` or `:delayed`.
-The reason for this is that deduplication always takes into account the latest binary replication pointer into account, not the first one.
-There is an [open issue](https://gitlab.com/gitlab-org/gitlab/-/issues/325291) to improve this.
-
### Ensuring a worker is idempotent
Make sure the worker tests pass using the following shared example:
@@ -285,6 +279,55 @@ module AuthorizedProjectUpdate
end
```
+### Deduplication with load balancing
+
+> [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/6763) in GitLab 14.4.
+
+Jobs that declare either `:sticky` or `:delayed` data consistency
+are eligible for database load-balancing.
+In both cases, jobs are [scheduled in the future](#scheduling-jobs-in-the-future) with a short delay (1 second).
+This minimizes the chance of replication lag after a write.
+
+If you really want to deduplicate jobs eligible for load balancing,
+specify `including_scheduled: true` argument when defining deduplication strategy:
+
+```ruby
+class DelayedIdempotentWorker
+ include ApplicationWorker
+ data_consistency :delayed
+
+ deduplicate :until_executing, including_scheduled: true
+ idempotent!
+
+ # ...
+end
+```
+
+#### Preserve the latest WAL location for idempotent jobs
+
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/69372) in GitLab 14.3.
+> - [Enabled on GitLab.com](https://gitlab.com/gitlab-org/gitlab/-/issues/338350) in GitLab 14.4.
+
+The deduplication always take into account the latest binary replication pointer, not the first one.
+This happens because we drop the same job scheduled for the second time and the Write-Ahead Log (WAL) is lost.
+This could lead to comparing the old WAL location and reading from a stale replica.
+
+To support both deduplication and maintaining data consistency with load balancing,
+we are preserving the latest WAL location for idempotent jobs in Redis.
+This way we are always comparing the latest binary replication pointer,
+making sure that we read from the replica that is fully caught up.
+
+FLAG:
+On self-managed GitLab, by default this feature is not available.
+To make it available,
+ask an administrator to [enable the preserve_latest_wal_locations_for_idempotent_jobs flag](../administration/feature_flags.md).
+FLAG:
+On self-managed GitLab, by default this feature is not available.
+To make it available,
+ask an administrator to [enable the `preserve_latest_wal_locations_for_idempotent_jobs` flag](../administration/feature_flags.md).
+This feature flag is related to GitLab development and is not intended to be used by GitLab administrators, though.
+On GitLab.com, this feature is available but can be configured by GitLab.com administrators only.
+
## Limited capacity worker
It is possible to limit the number of concurrent running jobs for a worker class
@@ -553,11 +596,6 @@ class DelayedWorker
end
```
-For [idempotent jobs](#idempotent-jobs), the deduplication is not compatible with the
-`data_consistency` attribute set to `:sticky` or `:delayed`.
-The reason for this is that deduplication always takes into account the latest binary replication pointer into account, not the first one.
-There is an [open issue](https://gitlab.com/gitlab-org/gitlab/-/issues/325291) to improve this.
-
### `feature_flag` property
The `feature_flag` property allows you to toggle a job's `data_consistency`,
@@ -583,6 +621,12 @@ class DelayedWorker
end
```
+### Data consistency with idempotent jobs
+
+For [idempotent jobs](#idempotent-jobs) that declare either `:sticky` or `:delayed` data consistency, we are
+[preserving the latest WAL location](#preserve-the-latest-wal-location-for-idempotent-jobs) while deduplicating,
+ensuring that we read from the replica that is fully caught up.
+
## Jobs with External Dependencies
Most background jobs in the GitLab application communicate with other GitLab
diff --git a/doc/development/snowplow/dictionary.md b/doc/development/snowplow/dictionary.md
index 589d6f6fb9f..02e9ba5ce20 100644
--- a/doc/development/snowplow/dictionary.md
+++ b/doc/development/snowplow/dictionary.md
@@ -1,44 +1,4 @@
---
-stage: Growth
-group: Product Intelligence
-info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#designated-technical-writers
+redirect_to: 'https://metrics.gitlab.com/snowplow.html'
+remove_date: '2021-12-28'
---
-
-<!---
- This documentation is auto generated by a script.
-
- Please do not edit this file directly, check generate_event_dictionary task on lib/tasks/gitlab/snowplow.rake.
---->
-
-<!-- vale gitlab.Spelling = NO -->
-
-# Event Dictionary
-
-This file is autogenerated, please do not edit it directly.
-
-To generate these files from the GitLab repository, run:
-
-```shell
-bundle exec rake gitlab:snowplow:generate_event_dictionary
-```
-
-The Event Dictionary is based on the following event definition YAML files:
-
-- [`config/events`](https://gitlab.com/gitlab-org/gitlab/-/tree/f9a404301ca22d038e7b9a9eb08d9c1bbd6c4d84/config/events)
-- [`ee/config/events`](https://gitlab.com/gitlab-org/gitlab/-/tree/f9a404301ca22d038e7b9a9eb08d9c1bbd6c4d84/ee/config/events)
-
-## Event definitions
-
-### `epics promote`
-
-| category | action | label | property | value |
-|---|---|---|---|---|
-| `epics` | `promote` | `` | `The string "issue_id"` | `ID of the issue` |
-
-Issue promoted to epic
-
-YAML definition: `/ee/config/events/epics_promote.yml`
-
-Owner: `group::product planning`
-
-Tiers: `premium`, `ultimate`
diff --git a/doc/development/snowplow/implementation.md b/doc/development/snowplow/implementation.md
new file mode 100644
index 00000000000..0d81b442850
--- /dev/null
+++ b/doc/development/snowplow/implementation.md
@@ -0,0 +1,543 @@
+---
+stage: Growth
+group: Product Intelligence
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
+---
+
+# Implement Snowplow tracking
+
+This page describes how to:
+
+- Implement Snowplow frontend and backend tracking
+- Test Snowplow events
+
+## Snowplow JavaScript frontend tracking
+
+GitLab provides a `Tracking` interface that wraps the [Snowplow JavaScript tracker](https://docs.snowplowanalytics.com/docs/collecting-data/collecting-from-own-applications/javascript-trackers/)
+to track custom events.
+
+For the recommended frontend tracking implementation, see [Usage recommendations](#usage-recommendations).
+
+Tracking implementations must have an `action` and a `category`. You can provide additional
+categories from the [structured event taxonomy](index.md#structured-event-taxonomy) with an `extra` object
+that accepts key-value pairs.
+
+| Field | Type | Default value | Description |
+|:-----------|:-------|:---------------------------|:---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+| `category` | string | `document.body.dataset.page` | Page or subsection of a page in which events are captured. |
+| `action` | string | generic | Action the user is taking. Clicks must be `click` and activations must be `activate`. For example, focusing a form field is `activate_form_input`, and clicking a button is `click_button`. |
+| `data` | object | `{}` | Additional data such as `label`, `property`, `value`, `context` as described in [Structured event taxonomy](index.md#structured-event-taxonomy), and `extra` (key-value pairs object). |
+
+### Usage recommendations
+
+- Use [data attributes](#implement-data-attribute-tracking) on HTML elements that emit `click`, `show.bs.dropdown`, or `hide.bs.dropdown` events.
+- Use the [Vue mixin](#implement-vue-component-tracking) for tracking custom events, or if the supported events for data attributes are not propagating.
+- Use the [tracking class](#implement-raw-javascript-tracking) when tracking raw JavaScript files.
+
+### Implement data attribute tracking
+
+To implement tracking for HAML or Vue templates, add a [`data-track` attribute](#data-track-attributes) to the element.
+
+The following example shows `data-track-*` attributes assigned to a button:
+
+```haml
+%button.btn{ data: { track: { action: "click_button", label: "template_preview", property: "my-template" } } }
+```
+
+```html
+<button class="btn"
+ data-track-action="click_button"
+ data-track-label="template_preview"
+ data-track-property="my-template"
+ data-track-extra='{ "template_variant": "primary" }'
+/>
+```
+
+#### `data-track` attributes
+
+| Attribute | Required | Description |
+|:----------------------|:---------|:------------|
+| `data-track-action` | true | Action the user is taking. Clicks must be prepended with `click` and activations must be prepended with `activate`. For example, focusing a form field is `activate_form_input` and clicking a button is `click_button`. Replaces `data-track-event`, which was [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/290962) in GitLab 13.11. |
+| `data-track-label` | false | The specific element or object to act on. This can be: the label of the element, for example, a tab labeled 'Create from template' for `create_from_template`; a unique identifier if no text is available, for example, `groups_dropdown_close` for closing the Groups dropdown in the top bar; or the name or title attribute of a record being created. |
+| `data-track-property` | false | Any additional property of the element, or object being acted on. |
+| `data-track-value` | false | Describes a numeric value or something directly related to the event. This could be the value of an input. For example, `10` when clicking `internal` visibility. If omitted, this is the element's `value` property or `undefined`. For checkboxes, the default value is the element's checked attribute or `0` when unchecked. |
+| `data-track-extra` | false | A key-value pair object passed as a valid JSON string. This attribute is added to the `extra` property in our [`gitlab_standard`](schemas.md#gitlab_standard) schema. |
+| `data-track-context` | false | The `context` as described in our [Structured event taxonomy](index.md#structured-event-taxonomy). |
+
+#### Event listeners
+
+Event listeners bind at the document level to handle click events in elements with data attributes.
+This allows them to be handled when the DOM re-renders or changes. Document-level binding reduces
+the likelihood that click events stop propagating up the DOM tree.
+
+If click events stop propagating, you must implement listeners and [Vue component tracking](#implement-vue-component-tracking) or [raw JavaScript tracking](#implement-raw-javascript-tracking).
+
+#### Helper methods
+
+Use the following Ruby helper:
+
+```ruby
+tracking_attrs(label, action, property) # { data: { track_label... } }
+
+%button{ **tracking_attrs('main_navigation', 'click_button', 'navigation') }
+```
+
+If you use the GitLab helper method [`nav_link`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/helpers/tab_helper.rb#L76), you must wrap `html_options` under the `html_options` keyword argument. If you
+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`.
+
+```ruby
+# Bad
+= nav_link(controller: ['dashboard/groups', 'explore/groups'], data: { track_label: "explore_groups",
+track_action: "click_button" })
+
+# Good
+= nav_link(controller: ['dashboard/groups', 'explore/groups'], html_options: { data: { track_label:
+"explore_groups", track_action: "click_button" } })
+
+# Good (other helpers)
+= link_to explore_groups_path, title: _("Explore"), data: { track_label: "explore_groups", track_action:
+"click_button" }
+```
+
+### Implement Vue component tracking
+
+For custom event tracking, use a Vue `mixin` in components. Vue `mixin` exposes the `Tracking.event`
+static method and the `track` method called from components or templates. You can specify tracking
+options in `data` or `computed`. These options override any defaults and allow the values to be dynamic
+from props or based on state.
+
+Default options are passed when an event is tracked from the component. If you don't specify an option,
+the default `document.body.dataset.page` is used. The default options are:
+
+- `category`
+- `label`
+- `property`
+- `value`
+
+To implement Vue component tracking:
+
+1. Import the `Tracking` library and request a `mixin`:
+
+ ```javascript
+ import Tracking from '~/tracking';
+ const trackingMixin = Tracking.mixin;
+ ```
+
+1. Provide categories to track the event from the component. For example, to track all events in a
+component with a label, use the `label` category:
+
+ ```javascript
+ import Tracking from '~/tracking';
+ const trackingMixin = Tracking.mixin({ label: 'right_sidebar' });
+ ```
+
+1. In the component, declare the Vue `mixin`:
+
+ ```javascript
+ export default {
+ mixins: [trackingMixin],
+ // ...[component implementation]...
+ data() {
+ return {
+ expanded: false,
+ tracking: {
+ label: 'left_sidebar',
+ },
+ };
+ },
+ };
+ ```
+
+1. To receive event data as a tracking object or computed property:
+ - Declare it in the `data` function. Use a `tracking` object when default event properties are dynamic or provided at runtime:
+
+ ```javascript
+ export default {
+ name: 'RightSidebar',
+ mixins: [Tracking.mixin()],
+ data() {
+ return {
+ tracking: {
+ label: 'right_sidebar',
+ // category: '',
+ // property: '',
+ // value: '',
+ // experiment: '',
+ // extra: {},
+ },
+ };
+ },
+ };
+ ```
+
+ - Declare it in the event data in the `track` function. This object merges with any previously provided options:
+
+ ```javascript
+ this.track('click_button', {
+ label: 'right_sidebar',
+ });
+ ```
+
+1. Optional. Use the `track` method in a template:
+
+ ```html
+ <template>
+ <div>
+ <button data-testid="toggle" @click="toggle">Toggle</button>
+
+ <div v-if="expanded">
+ <p>Hello world!</p>
+ <button @click="track('click_action')">Track another event</button>
+ </div>
+ </div>
+ </template>
+ ```
+
+The following example shows an implementation of Vue component tracking:
+
+```javascript
+export default {
+ name: 'RightSidebar',
+ mixins: [Tracking.mixin({ label: 'right_sidebar' })],
+ data() {
+ return {
+ expanded: false,
+ };
+ },
+ methods: {
+ toggle() {
+ this.expanded = !this.expanded;
+ // Additional data will be merged, like `value` below
+ this.track('click_toggle', { value: Number(this.expanded) });
+ }
+ }
+};
+```
+
+#### Testing example
+
+```javascript
+import { mockTracking } from 'helpers/tracking_helper';
+// mockTracking(category, documentOverride, spyMethod)
+
+describe('RightSidebar.vue', () => {
+ let trackingSpy;
+ let wrapper;
+
+ beforeEach(() => {
+ trackingSpy = mockTracking(undefined, wrapper.element, jest.spyOn);
+ });
+
+ const findToggle = () => wrapper.find('[data-testid="toggle"]');
+
+ it('tracks turning off toggle', () => {
+ findToggle().trigger('click');
+
+ expect(trackingSpy).toHaveBeenCalledWith(undefined, 'click_toggle', {
+ label: 'right_sidebar',
+ value: 0,
+ });
+ });
+});
+```
+
+### Implement raw JavaScript tracking
+
+To call custom event tracking and instrumentation directly from the JavaScript file, call the `Tracking.event` static function.
+
+The following example demonstrates tracking a click on a button by manually calling `Tracking.event`.
+
+```javascript
+import Tracking from '~/tracking';
+
+const button = document.getElementById('create_from_template_button');
+
+button.addEventListener('click', () => {
+ Tracking.event('dashboard:projects:index', 'click_button', {
+ label: 'create_from_template',
+ property: 'template_preview',
+ extra: {
+ templateVariant: 'primary',
+ valid: 1,
+ },
+ });
+});
+```
+
+#### Testing example
+
+```javascript
+import Tracking from '~/tracking';
+
+describe('MyTracking', () => {
+ let wrapper;
+
+ beforeEach(() => {
+ jest.spyOn(Tracking, 'event');
+ });
+
+ const findButton = () => wrapper.find('[data-testid="create_from_template"]');
+
+ it('tracks event', () => {
+ findButton().trigger('click');
+
+ expect(Tracking.event).toHaveBeenCalledWith(undefined, 'click_button', {
+ label: 'create_from_template',
+ property: 'template_preview',
+ extra: {
+ templateVariant: 'primary',
+ valid: true,
+ },
+ });
+ });
+});
+```
+
+### Form tracking
+
+To enable Snowplow automatic [form tracking](https://docs.snowplowanalytics.com/docs/collecting-data/collecting-from-own-applications/javascript-trackers/javascript-tracker/javascript-tracker-v2/tracking-specific-events/#form-tracking):
+
+1. Call `Tracking.enableFormTracking` when the DOM is ready.
+1. Provide a `config` object that includes at least one of the following elements:
+ - `forms` determines the forms to track. Identified by the CSS class name.
+ - `fields` determines the fields inside the tracked forms to track. Identified by the field `name`.
+1. Optional. Provide a list of contexts as the second argument. The [`gitlab_standard`](schemas.md#gitlab_standard) schema is excluded from these events.
+
+```javascript
+Tracking.enableFormTracking({
+ forms: { allow: ['sign-in-form', 'password-recovery-form'] },
+ fields: { allow: ['terms_and_conditions', 'newsletter_agreement'] },
+});
+```
+
+#### Testing example
+
+```javascript
+import Tracking from '~/tracking';
+
+describe('MyFormTracking', () => {
+ let formTrackingSpy;
+
+ beforeEach(() => {
+ formTrackingSpy = jest
+ .spyOn(Tracking, 'enableFormTracking')
+ .mockImplementation(() => null);
+ });
+
+ it('initialized with the correct configuration', () => {
+ expect(formTrackingSpy).toHaveBeenCalledWith({
+ forms: { allow: ['sign-in-form', 'password-recovery-form'] },
+ fields: { allow: ['terms_and_conditions', 'newsletter_agreement'] },
+ });
+ });
+});
+```
+
+## Implement Ruby backend tracking
+
+`Gitlab::Tracking` is an interface that wraps the [Snowplow Ruby Tracker](https://docs.snowplowanalytics.com/docs/collecting-data/collecting-from-own-applications/ruby-tracker/) for tracking custom events.
+Backend tracking provides:
+
+- User behavior tracking
+- Instrumentation to monitor and visualize performance over time in a section or aspect of code.
+
+To add custom event tracking and instrumentation, call the `GitLab::Tracking.event` class method.
+For example:
+
+```ruby
+class Projects::CreateService < BaseService
+ def execute
+ project = Project.create(params)
+
+ Gitlab::Tracking.event('Projects::CreateService', 'create_project', label: project.errors.full_messages.to_sentence,
+ property: project.valid?.to_s, project: project, user: current_user, namespace: namespace)
+ end
+end
+```
+
+Use the following arguments:
+
+| Argument | Type | Default value | Description |
+|------------|---------------------------|---------------|-----------------------------------------------------------------------------------------------------------------------------------|
+| `category` | String | | Area or aspect of the application. For example, `HealthCheckController` or `Lfs::FileTransformer`. |
+| `action` | String | | The action being taken. For example, a controller action such as `create`, or an Active Record callback. |
+| `label` | String | nil | The specific element or object to act on. This can be one of the following: the label of the element, for example, a tab labeled 'Create from template' for `create_from_template`; a unique identifier if no text is available, for example, `groups_dropdown_close` for closing the Groups dropdown in the top bar; or the name or title attribute of a record being created. |
+| `property` | String | nil | Any additional property of the element, or object being acted on. |
+| `value` | Numeric | nil | Describes a numeric value or something directly related to the event. This could be the value of an input. For example, `10` when clicking `internal` visibility. |
+| `context` | Array\[SelfDescribingJSON\] | nil | An array of custom contexts to send with this event. Most events should not have any custom contexts. |
+| `project` | Project | nil | The project associated with the event. |
+| `user` | User | nil | The user associated with the event. |
+| `namespace` | Namespace | nil | The namespace associated with the event. |
+| `extra` | Hash | `{}` | Additional keyword arguments are collected into a hash and sent with the event. |
+
+### Unit testing
+
+To test backend Snowplow events, use the `expect_snowplow_event` helper. For more information, see
+[testing best practices](../testing_guide/best_practices.md#test-snowplow-events).
+
+### Performance
+
+We use the [AsyncEmitter](https://docs.snowplowanalytics.com/docs/collecting-data/collecting-from-own-applications/ruby-tracker/emitters/#the-asyncemitter-class) when tracking events, which allows for instrumentation calls to be run in a background thread. This is still an active area of development.
+
+## Develop and test Snowplow
+
+To develop and test a Snowplow event, there are several tools to test frontend and backend events:
+
+| Testing Tool | Frontend Tracking | Backend Tracking | Local Development Environment | Production Environment | Production Environment |
+|----------------------------------------------|--------------------|---------------------|-------------------------------|------------------------|------------------------|
+| Snowplow Analytics Debugger Chrome Extension | Yes | No | Yes | Yes | Yes |
+| Snowplow Inspector Chrome Extension | Yes | No | Yes | Yes | Yes |
+| Snowplow Micro | Yes | Yes | Yes | No | No |
+
+### Test frontend events
+
+Before you test frontend events in development, you must:
+
+1. [Enable Snowplow tracking in the Admin Area](index.md#enable-snowplow-tracking).
+1. Turn off ad blockers that could prevent Snowplow JavaScript from loading in your environment.
+1. Turn off "Do Not Track" (DNT) in your browser.
+
+All URLs are pseudonymized. The entity identifier [replaces](https://docs.snowplowanalytics.com/docs/collecting-data/collecting-from-own-applications/javascript-trackers/javascript-tracker/javascript-tracker-v2/tracker-setup/other-parameters-2/#Setting_a_custom_page_URL_and_referrer_URL) personally identifiable
+information (PII). PII includes usernames, group, and project names.
+
+#### Snowplow Analytics Debugger Chrome Extension
+
+[Snowplow Analytics Debugger](https://www.iglooanalytics.com/blog/snowplow-analytics-debugger-chrome-extension.html) is a browser extension for testing frontend events. It works in production, staging, and local development environments.
+
+1. Install the [Snowplow Analytics Debugger](https://chrome.google.com/webstore/detail/snowplow-analytics-debugg/jbnlcgeengmijcghameodeaenefieedm) Chrome browser extension.
+1. Open Chrome DevTools to the Snowplow Analytics Debugger tab.
+
+#### Snowplow Inspector Chrome Extension
+
+Snowplow Inspector Chrome Extension is a browser extension for testing frontend events. This works in production, staging, and local development environments.
+
+1. Install [Snowplow Inspector](https://chrome.google.com/webstore/detail/snowplow-inspector/maplkdomeamdlngconidoefjpogkmljm?hl=en).
+1. To open the extension, select the Snowplow Inspector icon beside the address bar.
+1. Click around on a webpage with Snowplow to see JavaScript events firing in the inspector window.
+
+### Test backend events
+
+#### Snowplow Micro
+
+[Snowplow Micro](https://snowplowanalytics.com/blog/2019/07/17/introducing-snowplow-micro/) is a
+Docker-based solution for testing backend and frontend in a local development environment. Snowplow Micro
+records the same events as the full Snowplow pipeline. To query events, use the Snowplow Micro API.
+
+To install and run Snowplow Micro, complete these steps to modify the
+[GitLab Development Kit (GDK)](https://gitlab.com/gitlab-org/gitlab-development-kit):
+
+1. Ensure Docker is installed and running.
+
+1. To install Snowplow Micro, clone the settings in
+[this project](https://gitlab.com/gitlab-org/snowplow-micro-configuration).
+
+1. Navigate to the directory with the cloned project,
+ and start the appropriate Docker container:
+
+ ```shell
+ ./snowplow-micro.sh
+ ```
+
+1. Use GDK to start the PostgreSQL terminal and connect
+ to the `gitlabhq_development` database:
+
+ ```shell
+ gdk psql -d gitlabhq_development
+ ```
+
+1. Update your instance's settings to enable Snowplow events and
+ point to the Snowplow Micro collector:
+
+ ```shell
+ update application_settings set snowplow_collector_hostname='localhost:9090', snowplow_enabled=true, snowplow_cookie_domain='.gitlab.com';
+ ```
+
+1. Update `DEFAULT_SNOWPLOW_OPTIONS` in `app/assets/javascripts/tracking/constants.js` to remove `forceSecureTracker: true`:
+
+ ```diff
+ diff --git a/app/assets/javascripts/tracking/constants.js b/app/assets/javascripts/tracking/constants.js
+ index 598111e4086..eff38074d4c 100644
+ --- a/app/assets/javascripts/tracking/constants.js
+ +++ b/app/assets/javascripts/tracking/constants.js
+ @@ -7,7 +7,6 @@ export const DEFAULT_SNOWPLOW_OPTIONS = {
+ appId: '',
+ userFingerprint: false,
+ respectDoNotTrack: true,
+ - forceSecureTracker: true,
+ eventMethod: 'post',
+ contexts: { webPage: true, performanceTiming: true },
+ formTracking: false,
+ ```
+
+1. Update `options` in `lib/gitlab/tracking.rb` to add `protocol` and `port`:
+
+ ```diff
+ diff --git a/lib/gitlab/tracking.rb b/lib/gitlab/tracking.rb
+ index 618e359211b..e9084623c43 100644
+ --- a/lib/gitlab/tracking.rb
+ +++ b/lib/gitlab/tracking.rb
+ @@ -41,7 +41,9 @@ def options(group)
+ cookie_domain: Gitlab::CurrentSettings.snowplow_cookie_domain,
+ app_id: Gitlab::CurrentSettings.snowplow_app_id,
+ form_tracking: additional_features,
+ - link_click_tracking: additional_features
+ + link_click_tracking: additional_features,
+ + protocol: 'http',
+ + port: 9090
+ }.transform_keys! { |key| key.to_s.camelize(:lower).to_sym }
+ end
+ ```
+
+1. Update `emitter` in `lib/gitlab/tracking/destinations/snowplow.rb` to change `protocol`:
+
+ ```diff
+ diff --git a/lib/gitlab/tracking/destinations/snowplow.rb b/lib/gitlab/tracking/destinations/snowplow.rb
+ index 4fa844de325..5dd9d0eacfb 100644
+ --- a/lib/gitlab/tracking/destinations/snowplow.rb
+ +++ b/lib/gitlab/tracking/destinations/snowplow.rb
+ @@ -40,7 +40,7 @@ def tracker
+ def emitter
+ SnowplowTracker::AsyncEmitter.new(
+ Gitlab::CurrentSettings.snowplow_collector_hostname,
+ - protocol: 'https'
+ + protocol: 'http'
+ )
+ end
+ end
+
+ ```
+
+1. Restart GDK:
+
+ ```shell
+ gdk restart
+ ```
+
+1. Send a test Snowplow event from the Rails console:
+
+ ```ruby
+ Gitlab::Tracking.event('category', 'action')
+ ```
+
+1. Navigate to `localhost:9090/micro/good` to see the event.
+
+#### Useful links
+
+- [Snowplow Micro repository](https://github.com/snowplow-incubator/snowplow-micro)
+- [Installation guide recording](https://www.youtube.com/watch?v=OX46fo_A0Ag)
+
+### Troubleshoot
+
+To control content security policy warnings when using an external host, modify `config/gitlab.yml`
+to allow or disallow them. To allow them, add the relevant host for `connect_src`. For example, for
+`https://snowplow.trx.gitlab.net`:
+
+```yaml
+development:
+ <<: *base
+ gitlab:
+ content_security_policy:
+ enabled: true
+ directives:
+ connect_src: "'self' http://localhost:* http://127.0.0.1:* ws://localhost:* wss://localhost:* ws://127.0.0.1:* https://snowplow.trx.gitlab.net/"
+```
diff --git a/doc/development/snowplow/index.md b/doc/development/snowplow/index.md
index e8b7d871b77..b8b35857adf 100644
--- a/doc/development/snowplow/index.md
+++ b/doc/development/snowplow/index.md
@@ -4,49 +4,37 @@ group: Product Intelligence
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Snowplow Guide
+# Snowplow
-This guide provides an overview of how Snowplow works, and implementation details.
-
-For more information about Product Intelligence, see:
-
-- [Product Intelligence Guide](https://about.gitlab.com/handbook/product/product-intelligence-guide/)
-- [Service Ping Guide](../service_ping/index.md)
-
-More useful links:
-
-- [Product Intelligence Direction](https://about.gitlab.com/direction/product-intelligence/)
-- [Data Analysis Process](https://about.gitlab.com/handbook/business-technology/data-team/#data-analysis-process/)
-- [Data for Product Managers](https://about.gitlab.com/handbook/business-technology/data-team/programs/data-for-product-managers/)
-- [Data Infrastructure](https://about.gitlab.com/handbook/business-technology/data-team/platform/infrastructure/)
+This page provides an overview of how Snowplow works and how to enable it.
## What is Snowplow
-Snowplow is an enterprise-grade marketing and Product Intelligence platform which helps track the way users engage with our website and application.
+Snowplow is an enterprise-grade marketing and Product Intelligence platform that tracks how users engage with our website and application.
-[Snowplow](https://snowplowanalytics.com) consists of the following loosely-coupled sub-systems:
+[Snowplow](https://snowplowanalytics.com) consists of several loosely-coupled sub-systems:
-- **Trackers** fire Snowplow events. Snowplow has 12 trackers, covering web, mobile, desktop, server, and IoT.
-- **Collectors** receive Snowplow events from trackers. We have three different event collectors, synchronizing events either to Amazon S3, Apache Kafka, or Amazon Kinesis.
-- **Enrich** cleans up the raw Snowplow events, enriches them and puts them into storage. We have an Hadoop-based enrichment process, and a Kinesis-based or Kafka-based process.
-- **Storage** is where the Snowplow events live. We store the Snowplow events in a flat file structure on S3, and in the Redshift and PostgreSQL databases.
-- **Data modeling** is where event-level data is joined with other data sets and aggregated into smaller data sets, and business logic is applied. This produces a clean set of tables which make it easier to perform analysis on the data. We have data models for Redshift and Looker.
-- **Analytics** are performed on the Snowplow events or on the aggregate tables.
+- **Trackers** fire Snowplow events. Snowplow has twelve trackers that cover web, mobile, desktop, server, and IoT.
+- **Collectors** receive Snowplow events from trackers. We use different event collectors that synchronize events to Amazon S3, Apache Kafka, or Amazon Kinesis.
+- **Enrich** cleans raw Snowplow events, enriches them, and puts them into storage. There is a Hadoop-based enrichment process, and a Kinesis-based or Kafka-based process.
+- **Storage** stores Snowplow events. We store the Snowplow events in a flat file structure on S3, and in the Redshift and PostgreSQL databases.
+- **Data modeling** joins event-level data with other data sets, aggregates them into smaller data sets, and applies business logic. This produces a clean set of tables for data analysis. We use data models for Redshift and Looker.
+- **Analytics** are performed on Snowplow events or on aggregate tables.
![snowplow_flow](../img/snowplow_flow.png)
### Useful links
-- [Understanding the structure of Snowplow data](https://docs.snowplowanalytics.com/docs/understanding-your-pipeline/canonical-event/)
+- [Snowplow data structure](https://docs.snowplowanalytics.com/docs/understanding-your-pipeline/canonical-event/)
- [Our Iglu schema registry](https://gitlab.com/gitlab-org/iglu)
-- [List of events used in our codebase (Event Dictionary)](dictionary.md)
+- [List of events used in our codebase (Event Dictionary)](https://metrics.gitlab.com/snowplow.html)
## Enable Snowplow tracking
Tracking can be enabled at:
- The instance level, which enables tracking on both the frontend and backend layers.
-- The user level, though user tracking can be disabled on a per-user basis.
+- 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.
@@ -101,21 +89,22 @@ sequenceDiagram
## Structured event taxonomy
-When adding new click events, we should add them in a way that's internally consistent. If we don't, it is difficult to perform analysis across features because each feature captures events differently.
+Click events must be consistent. If each feature captures events differently, it can be difficult
+to perform analysis.
-The current method provides several attributes that are sent on each click event. Please try to follow these guidelines when specifying events to capture:
+Each click event provides attributes that describe the event.
-| attribute | type | required | description |
+| Attribute | Type | Required | Description |
| --------- | ------- | -------- | ----------- |
-| category | text | true | The page or backend area of the application. Unless infeasible, please use the Rails page attribute by default in the frontend, and namespace + class name on the backend. |
-| action | text | true | The action the user is taking, or aspect that's being instrumented. The first word should always describe the action or aspect: clicks should be `click`, activations should be `activate`, creations should be `create`, etc. Use underscores to describe what was acted on; for example, activating a form field would be `activate_form_input`. An interface action like clicking on a dropdown would be `click_dropdown`, while a behavior like creating a project record from the backend would be `create_project` |
-| label | text | false | The specific element or object to act on. This can be one of the following: the label of the element (for example, a tab labeled 'Create from template' for `create_from_template`), a unique identifier if no text is available (for example, `groups_dropdown_close` for closing the Groups dropdown in the top bar), or the name or title attribute of a record being created. |
+| category | text | true | The page or backend section of the application. Unless infeasible, use the Rails page attribute by default in the frontend, and namespace + class name on the backend. |
+| action | text | true | The action the user takes, or aspect that's being instrumented. The first word must describe the action or aspect. For example, clicks must be `click`, activations must be `activate`, creations must be `create`. Use underscores to describe what was acted on. For example, activating a form field is `activate_form_input`, an interface action like clicking on a dropdown is `click_dropdown`, a behavior like creating a project record from the backend is `create_project`. |
+| label | text | false | The specific element or object to act on. This can be one of the following: the label of the element, for example, a tab labeled 'Create from template' for `create_from_template`; a unique identifier if no text is available, for example, `groups_dropdown_close` for closing the Groups dropdown in the top bar; or the name or title attribute of a record being created. |
| property | text | false | Any additional property of the element, or object being acted on. |
| value | decimal | false | Describes a numeric value or something directly related to the event. This could be the value of an input. For example, `10` when clicking `internal` visibility. |
### Examples
-| category* | label | action | property** | value |
+| Category* | Label | Action | Property** | Value |
|-------------|------------------|-----------------------|----------|:-----:|
| `[root:index]` | `main_navigation` | `click_navigation_link` | `[link_label]` | - |
| `[groups:boards:show]` | `toggle_swimlanes` | `click_toggle_button` | - | `[is_active]` |
@@ -125,8 +114,8 @@ The current method provides several attributes that are sent on each click event
| `[projects:clusters:new]` | `chart_options` | `generate_link` | `[chart_link]` | - |
| `[projects:clusters:new]` | `chart_options` | `click_add_label_button` | `[label_id]` | - |
-_* It's ok to omit the category, and use the default._<br>
-_** Property is usually the best place for variable strings._
+_* If you choose to omit the category you can use the default._<br>
+_** Use property for variable strings._
### Reference SQL
@@ -152,651 +141,33 @@ ORDER BY collector_tstamp DESC
LIMIT 20
```
-### Web-specific parameters
-
-Snowplow JS adds many [web-specific parameters](https://docs.snowplowanalytics.com/docs/collecting-data/collecting-from-own-applications/snowplow-tracker-protocol/#Web-specific_parameters) to all web events by default.
-
-## Implement Snowplow JS (Frontend) tracking
-
-GitLab provides `Tracking`, an interface that wraps the [Snowplow JavaScript Tracker](https://docs.snowplowanalytics.com/docs/collecting-data/collecting-from-own-applications/javascript-trackers/) for tracking custom events. The simplest way to use it is to add `data-` attributes to clickable elements and dropdowns. There is also a Vue mixin (exposing a `track` method), and the static method `Tracking.event`. Each of these requires at minimum a `category` and an `action`. You can provide additional [Structured event taxonomy](#structured-event-taxonomy) properties along with an `extra` object that accepts key-value pairs.
-
-| field | type | default value | description |
-|:-----------|:-------|:---------------------------|:---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
-| `category` | string | `document.body.dataset.page` | Page or subsection of a page that events are being captured within. |
-| `action` | string | generic | Action the user is taking. Clicks should be `click` and activations should be `activate`, so for example, focusing a form field would be `activate_form_input`, and clicking a button would be `click_button`. |
-| `data` | object | `{}` | Additional data such as `label`, `property`, `value`, `context` (as described in our [Structured event taxonomy](#structured-event-taxonomy)), and `extra` (key-value pairs object). |
-
-### Usage recommendations
-
-- Use [data attributes](#tracking-with-data-attributes) on HTML elements that emits either the `click`, `show.bs.dropdown`, or `hide.bs.dropdown` events.
-- Use the [Vue mixin](#tracking-within-vue-components) when tracking custom events, or if the supported events for data attributes are not propagating.
-- Use the [Tracking class directly](#tracking-in-raw-javascript) when tracking on raw JS files.
-
-### Tracking with data attributes
-
-When working in HAML (or Vue templates) we can add `data-track-*` attributes to elements of interest. All elements that have a `data-track-action` attribute automatically have event tracking bound on clicks. You can provide extra data as a valid JSON string using `data-track-extra`.
-
-Below is an example of `data-track-*` attributes assigned to a button:
-
-```haml
-%button.btn{ data: { track: { action: "click_button", label: "template_preview", property: "my-template" } } }
-```
-
-```html
-<button class="btn"
- data-track-action="click_button"
- data-track-label="template_preview"
- data-track-property="my-template"
- data-track-extra='{ "template_variant": "primary" }'
-/>
-```
-
-Event listeners are bound at the document level to handle click events on or within elements with these data attributes. This allows them to be properly handled on re-rendering and changes to the DOM. Note that because of the way these events are bound, click events should not be stopped from propagating up the DOM tree. If click events are being stopped from propagating, you must implement your own listeners and follow the instructions in [Tracking within Vue components](#tracking-within-vue-components) or [Tracking in raw JavaScript](#tracking-in-raw-javascript).
-
-Below is a list of supported `data-track-*` attributes:
-
-| attribute | required | description |
-|:----------------------|:---------|:------------|
-| `data-track-action` | true | Action the user is taking. Clicks must be prepended with `click` and activations must be prepended with `activate`. For example, focusing a form field would be `activate_form_input` and clicking a button would be `click_button`. Replaces `data-track-event`, which was [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/290962) in GitLab 13.11. |
-| `data-track-label` | false | The `label` as described in our [Structured event taxonomy](#structured-event-taxonomy). |
-| `data-track-property` | false | The `property` as described in our [Structured event taxonomy](#structured-event-taxonomy). |
-| `data-track-value` | false | The `value` as described in our [Structured event taxonomy](#structured-event-taxonomy). If omitted, this is the element's `value` property or `undefined`. For checkboxes, the default value is the element's checked attribute or `0` when unchecked. |
-| `data-track-extra` | false | A key-value pairs object passed as a valid JSON string. This is added to the `extra` property in our [`gitlab_standard`](#gitlab_standard) schema. |
-| `data-track-context` | false | The `context` as described in our [Structured event taxonomy](#structured-event-taxonomy). |
-
-#### Available helpers
-
-```ruby
-tracking_attrs(label, action, property) # { data: { track_label... } }
-
-%button{ **tracking_attrs('main_navigation', 'click_button', 'navigation') }
-```
-
-#### Caveats
-
-When using the GitLab helper method [`nav_link`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/helpers/tab_helper.rb#L76) be sure to wrap `html_options` under the `html_options` keyword argument.
-Be careful, as this behavior can be confused with the `ActionView` helper method [`link_to`](https://api.rubyonrails.org/v5.2.3/classes/ActionView/Helpers/UrlHelper.html#method-i-link_to) that does not require additional wrapping of `html_options`
-
-```ruby
-# Bad
-= nav_link(controller: ['dashboard/groups', 'explore/groups'], data: { track_label: "explore_groups", track_action: "click_button" })
-
-# Good
-= nav_link(controller: ['dashboard/groups', 'explore/groups'], html_options: { data: { track_label: "explore_groups", track_action: "click_button" } })
-
-# Good (other helpers)
-= link_to explore_groups_path, title: _("Explore"), data: { track_label: "explore_groups", track_action: "click_button" }
-```
-
-### Tracking within Vue components
-
-There's a tracking Vue mixin that can be used in components if more complex tracking is required. To use it, first import the `Tracking` library and request a mixin.
-
-```javascript
-import Tracking from '~/tracking';
-const trackingMixin = Tracking.mixin({ label: 'right_sidebar' });
-```
-
-You can provide default options that are passed along whenever an event is tracked from within your component. For example, if all events in a component should be tracked with a given `label`, you can provide one at this time. Available defaults are `category`, `label`, `property`, and `value`. If no category is specified, `document.body.dataset.page` is used as the default.
-
-You can then use the mixin normally in your component with the `mixin` Vue declaration. The mixin also provides the ability to specify tracking options in `data` or `computed`. These override any defaults and allow the values to be dynamic from props, or based on state.
-
-```javascript
-export default {
- mixins: [trackingMixin],
- // ...[component implementation]...
- data() {
- return {
- expanded: false,
- tracking: {
- label: 'left_sidebar',
- },
- };
- },
-};
-```
-
-The mixin provides a `track` method that can be called from within the template,
-or from component methods. An example of the whole implementation might look like this:
-
-```javascript
-export default {
- name: 'RightSidebar',
- mixins: [Tracking.mixin({ label: 'right_sidebar' })],
- data() {
- return {
- expanded: false,
- };
- },
- methods: {
- toggle() {
- this.expanded = !this.expanded;
- // Additional data will be merged, like `value` below
- this.track('click_toggle', { value: Number(this.expanded) });
- }
- }
-};
-```
-
-The event data can be provided with a `tracking` object, declared in the `data` function,
-or as a `computed property`. A `tracking` object is convenient when the default
-event properties are dynamic or provided at runtime.
-
-```javascript
-export default {
- name: 'RightSidebar',
- mixins: [Tracking.mixin()],
- data() {
- return {
- tracking: {
- label: 'right_sidebar',
- // category: '',
- // property: '',
- // value: '',
- // experiment: '',
- // extra: {},
- },
- };
- },
-};
-```
-
-The event data can be provided directly in the `track` function as well.
-This object merges with any previously provided options.
-
-```javascript
-this.track('click_button', {
- label: 'right_sidebar',
-});
-```
-
-Lastly, if needed within the template, you can use the `track` method directly as well.
-
-```html
-<template>
- <div>
- <button data-testid="toggle" @click="toggle">Toggle</button>
-
- <div v-if="expanded">
- <p>Hello world!</p>
- <button @click="track('click_action')">Track another event</button>
- </div>
- </div>
-</template>
-```
-
-#### Testing example
-
-```javascript
-import { mockTracking } from 'helpers/tracking_helper';
-// mockTracking(category, documentOverride, spyMethod)
-
-describe('RightSidebar.vue', () => {
- let trackingSpy;
- let wrapper;
-
- beforeEach(() => {
- trackingSpy = mockTracking(undefined, wrapper.element, jest.spyOn);
- });
-
- const findToggle = () => wrapper.find('[data-testid="toggle"]');
-
- it('tracks turning off toggle', () => {
- findToggle().trigger('click');
-
- expect(trackingSpy).toHaveBeenCalledWith(undefined, 'click_toggle', {
- label: 'right_sidebar',
- value: 0,
- });
- });
-});
-```
-
-### Tracking in raw JavaScript
-
-Custom event tracking and instrumentation can be added by directly calling the `Tracking.event` static function. The following example demonstrates tracking a click on a button by calling `Tracking.event` manually.
-
-```javascript
-import Tracking from '~/tracking';
-
-const button = document.getElementById('create_from_template_button');
-
-button.addEventListener('click', () => {
- Tracking.event('dashboard:projects:index', 'click_button', {
- label: 'create_from_template',
- property: 'template_preview',
- extra: {
- templateVariant: 'primary',
- valid: 1,
- },
- });
-});
-```
-
-#### Testing example
-
-```javascript
-import Tracking from '~/tracking';
-
-describe('MyTracking', () => {
- let wrapper;
-
- beforeEach(() => {
- jest.spyOn(Tracking, 'event');
- });
+#### Last 100 page view events
- const findButton = () => wrapper.find('[data-testid="create_from_template"]');
-
- it('tracks event', () => {
- findButton().trigger('click');
-
- expect(Tracking.event).toHaveBeenCalledWith(undefined, 'click_button', {
- label: 'create_from_template',
- property: 'template_preview',
- extra: {
- templateVariant: 'primary',
- valid: true,
- },
- });
- });
-});
-```
-
-### Form tracking
-
-Enable Snowplow automatic [form tracking](https://docs.snowplowanalytics.com/docs/collecting-data/collecting-from-own-applications/javascript-trackers/javascript-tracker/javascript-tracker-v2/tracking-specific-events/#form-tracking) by calling `Tracking.enableFormTracking` (after the DOM is ready) and providing a `config` object that includes at least one of the following elements:
-
-- `forms`: determines which forms are tracked, and are identified by the CSS class name.
-- `fields`: determines which fields inside the tracked forms are tracked, and are identified by the field `name`.
-
-An optional list of contexts can be provided as the second argument.
-Note that our [`gitlab_standard`](#gitlab_standard) schema is excluded from these events.
-
-```javascript
-Tracking.enableFormTracking({
- forms: { allow: ['sign-in-form', 'password-recovery-form'] },
- fields: { allow: ['terms_and_conditions', 'newsletter_agreement'] },
-});
-```
-
-#### Testing example
-
-```javascript
-import Tracking from '~/tracking';
-
-describe('MyFormTracking', () => {
- let formTrackingSpy;
-
- beforeEach(() => {
- formTrackingSpy = jest
- .spyOn(Tracking, 'enableFormTracking')
- .mockImplementation(() => null);
- });
-
- it('initialized with the correct configuration', () => {
- expect(formTrackingSpy).toHaveBeenCalledWith({
- forms: { allow: ['sign-in-form', 'password-recovery-form'] },
- fields: { allow: ['terms_and_conditions', 'newsletter_agreement'] },
- });
- });
-});
-```
-
-## Implement Snowplow Ruby (Backend) tracking
-
-GitLab provides `Gitlab::Tracking`, an interface that wraps the [Snowplow Ruby Tracker](https://docs.snowplowanalytics.com/docs/collecting-data/collecting-from-own-applications/ruby-tracker/) for tracking custom events.
-
-Custom event tracking and instrumentation can be added by directly calling the `GitLab::Tracking.event` class method, which accepts the following arguments:
-
-| argument | type | default value | description |
-|------------|---------------------------|---------------|-----------------------------------------------------------------------------------------------------------------------------------|
-| `category` | String | | Area or aspect of the application. This could be `HealthCheckController` or `Lfs::FileTransformer` for instance. |
-| `action` | String | | The action being taken, which can be anything from a controller action like `create` to something like an Active Record callback. |
-| `label` | String | nil | As described in [Structured event taxonomy](#structured-event-taxonomy). |
-| `property` | String | nil | As described in [Structured event taxonomy](#structured-event-taxonomy). |
-| `value` | Numeric | nil | As described in [Structured event taxonomy](#structured-event-taxonomy). |
-| `context` | Array\[SelfDescribingJSON\] | nil | An array of custom contexts to send with this event. Most events should not have any custom contexts. |
-| `project` | Project | nil | The project associated with the event. |
-| `user` | User | nil | The user associated with the event. |
-| `namespace` | Namespace | nil | The namespace associated with the event. |
-| `extra` | Hash | `{}` | Additional keyword arguments are collected into a hash and sent with the event. |
-
-Tracking can be viewed as either tracking user behavior, or can be used for instrumentation to monitor and visualize performance over time in an area or aspect of code.
-
-For example:
-
-```ruby
-class Projects::CreateService < BaseService
- def execute
- project = Project.create(params)
-
- Gitlab::Tracking.event('Projects::CreateService', 'create_project', label: project.errors.full_messages.to_sentence,
- property: project.valid?.to_s, project: project, user: current_user, namespace: namespace)
- end
-end
+```sql
+SELECT
+ -- page_url,
+ -- page_title,
+ -- referer_url,
+ -- marketing_medium,
+ -- marketing_source,
+ -- marketing_campaign,
+ -- browser_window_width,
+ -- device_is_mobile
+ *
+FROM legacy.snowplow_page_views_30
+ORDER BY page_view_start DESC
+LIMIT 100
```
-### Unit testing
-
-Use the `expect_snowplow_event` helper when testing backend Snowplow events. See [testing best practices](
-https://docs.gitlab.com/ee/development/testing_guide/best_practices.html#test-snowplow-events) for details.
-
-### Performance
-
-We use the [AsyncEmitter](https://docs.snowplowanalytics.com/docs/collecting-data/collecting-from-own-applications/ruby-tracker/emitters/#the-asyncemitter-class) when tracking events, which allows for instrumentation calls to be run in a background thread. This is still an active area of development.
-
-## Develop and test Snowplow
-
-There are several tools for developing and testing a Snowplow event.
-
-| Testing Tool | Frontend Tracking | Backend Tracking | Local Development Environment | Production Environment | Production Environment |
-|----------------------------------------------|--------------------|---------------------|-------------------------------|------------------------|------------------------|
-| Snowplow Analytics Debugger Chrome Extension | **{check-circle}** | **{dotted-circle}** | **{check-circle}** | **{check-circle}** | **{check-circle}** |
-| Snowplow Inspector Chrome Extension | **{check-circle}** | **{dotted-circle}** | **{check-circle}** | **{check-circle}** | **{check-circle}** |
-| Snowplow Micro | **{check-circle}** | **{check-circle}** | **{check-circle}** | **{dotted-circle}** | **{dotted-circle}** |
-| Snowplow Mini | **{check-circle}** | **{check-circle}** | **{dotted-circle}** | **{status_preparing}** | **{status_preparing}** |
-
-**Legend**
-
-**{check-circle}** Available, **{status_preparing}** In progress, **{dotted-circle}** Not Planned
-
-### Test frontend events
-
-To test frontend events in development:
-
-- [Enable Snowplow tracking in the Admin Area](#enable-snowplow-tracking).
-- Turn off any ad blockers that would prevent Snowplow JS from loading in your environment.
-- Turn off "Do Not Track" (DNT) in your browser.
-
-#### Snowplow Analytics Debugger Chrome Extension
-
-Snowplow Analytics Debugger is a browser extension for testing frontend events. This works on production, staging, and local development environments.
-
-1. Install the [Snowplow Analytics Debugger](https://chrome.google.com/webstore/detail/snowplow-analytics-debugg/jbnlcgeengmijcghameodeaenefieedm) Chrome browser extension.
-1. Open Chrome DevTools to the Snowplow Analytics Debugger tab.
-1. Learn more at [Igloo Analytics](https://www.iglooanalytics.com/blog/snowplow-analytics-debugger-chrome-extension.html).
-
-#### Snowplow Inspector Chrome Extension
-
-Snowplow Inspector Chrome Extension is a browser extension for testing frontend events. This works on production, staging and local development environments.
-
-1. Install [Snowplow Inspector](https://chrome.google.com/webstore/detail/snowplow-inspector/maplkdomeamdlngconidoefjpogkmljm?hl=en).
-1. Open the Chrome extension by pressing the Snowplow Inspector icon beside the address bar.
-1. Click around on a webpage with Snowplow and you should see JavaScript events firing in the inspector window.
-
-### Snowplow Micro
-
-Snowplow Micro is a very small version of a full Snowplow data collection pipeline: small enough that it can be launched by a test suite. Events can be recorded into Snowplow Micro just as they can a full Snowplow pipeline. Micro then exposes an API that can be queried.
-
-Snowplow Micro is a Docker-based solution for testing frontend and backend events in a local development environment. You must modify GDK using the instructions below to set this up.
-
-- Read [Introducing Snowplow Micro](https://snowplowanalytics.com/blog/2019/07/17/introducing-snowplow-micro/)
-- Look at the [Snowplow Micro repository](https://github.com/snowplow-incubator/snowplow-micro)
-- Watch our <i class="fa fa-youtube-play youtube" aria-hidden="true"></i> [installation guide recording](https://www.youtube.com/watch?v=OX46fo_A0Ag)
-
-1. Ensure Docker is installed and running.
-
-1. Install [Snowplow Micro](https://github.com/snowplow-incubator/snowplow-micro) by cloning the settings in [this project](https://gitlab.com/gitlab-org/snowplow-micro-configuration):
-1. Navigate to the directory with the cloned project, and start the appropriate Docker
- container with the following script:
-
- ```shell
- ./snowplow-micro.sh
- ```
-
-1. Use GDK to start the PostgreSQL terminal and connect to the `gitlabhq_development` database:
-
- ```shell
- gdk psql -d gitlabhq_development
- ```
-
-1. Update your instance's settings to enable Snowplow events and point to the Snowplow Micro collector:
-
- ```shell
- update application_settings set snowplow_collector_hostname='localhost:9090', snowplow_enabled=true, snowplow_cookie_domain='.gitlab.com';
- ```
-
-1. Update `DEFAULT_SNOWPLOW_OPTIONS` in `app/assets/javascripts/tracking/constants.js` to remove `forceSecureTracker: true`:
-
- ```diff
- diff --git a/app/assets/javascripts/tracking/constants.js b/app/assets/javascripts/tracking/constants.js
- index 598111e4086..eff38074d4c 100644
- --- a/app/assets/javascripts/tracking/constants.js
- +++ b/app/assets/javascripts/tracking/constants.js
- @@ -7,7 +7,6 @@ export const DEFAULT_SNOWPLOW_OPTIONS = {
- appId: '',
- userFingerprint: false,
- respectDoNotTrack: true,
- - forceSecureTracker: true,
- eventMethod: 'post',
- contexts: { webPage: true, performanceTiming: true },
- formTracking: false,
- ```
-
-1. Update `options` in `lib/gitlab/tracking.rb` to add `protocol` and `port`:
-
- ```diff
- diff --git a/lib/gitlab/tracking.rb b/lib/gitlab/tracking.rb
- index 618e359211b..e9084623c43 100644
- --- a/lib/gitlab/tracking.rb
- +++ b/lib/gitlab/tracking.rb
- @@ -41,7 +41,9 @@ def options(group)
- cookie_domain: Gitlab::CurrentSettings.snowplow_cookie_domain,
- app_id: Gitlab::CurrentSettings.snowplow_app_id,
- form_tracking: additional_features,
- - link_click_tracking: additional_features
- + link_click_tracking: additional_features,
- + protocol: 'http',
- + port: 9090
- }.transform_keys! { |key| key.to_s.camelize(:lower).to_sym }
- end
- ```
-
-1. Update `emitter` in `lib/gitlab/tracking/destinations/snowplow.rb` to change `protocol`:
-
- ```diff
- diff --git a/lib/gitlab/tracking/destinations/snowplow.rb b/lib/gitlab/tracking/destinations/snowplow.rb
- index 4fa844de325..5dd9d0eacfb 100644
- --- a/lib/gitlab/tracking/destinations/snowplow.rb
- +++ b/lib/gitlab/tracking/destinations/snowplow.rb
- @@ -40,7 +40,7 @@ def tracker
- def emitter
- SnowplowTracker::AsyncEmitter.new(
- Gitlab::CurrentSettings.snowplow_collector_hostname,
- - protocol: 'https'
- + protocol: 'http'
- )
- end
- end
-
- ```
-
-1. Restart GDK:
-
- ```shell
- gdk restart
- ```
-
-1. Send a test Snowplow event from the Rails console:
+### Web-specific parameters
- ```ruby
- Gitlab::Tracking.event('category', 'action')
- ```
+Snowplow JavaScript adds [web-specific parameters](https://docs.snowplowanalytics.com/docs/collecting-data/collecting-from-own-applications/snowplow-tracker-protocol/#Web-specific_parameters) to all web events by default.
-1. Navigate to `localhost:9090/micro/good` to see the event.
-
-### Snowplow Mini
-
-[Snowplow Mini](https://github.com/snowplow/snowplow-mini) is an easily-deployable, single-instance version of Snowplow.
-
-Snowplow Mini can be used for testing frontend and backend events on a production, staging and local development environment.
-
-For GitLab.com, we're setting up a [QA and Testing environment](https://gitlab.com/gitlab-org/telemetry/-/issues/266) using Snowplow Mini.
-
-### Troubleshooting
-
-To control content security policy warnings when using an external host, you can allow or disallow them by modifying `config/gitlab.yml`. To allow them, add the relevant host for `connect_src`. For example, for `https://snowplow.trx.gitlab.net`:
-
-```yaml
-development:
- <<: *base
- gitlab:
- content_security_policy:
- enabled: true
- directives:
- connect_src: "'self' http://localhost:* http://127.0.0.1:* ws://localhost:* wss://localhost:* ws://127.0.0.1:* https://snowplow.trx.gitlab.net/"
-```
+## Related topics
-## Snowplow Schemas
-
-### `gitlab_standard`
-
-We are including the [`gitlab_standard` schema](https://gitlab.com/gitlab-org/iglu/-/blob/master/public/schemas/com.gitlab/gitlab_standard/jsonschema/) with every event. See [Standardize Snowplow Schema](https://gitlab.com/groups/gitlab-org/-/epics/5218) for details.
-
-The [`StandardContext`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/tracking/standard_context.rb) class represents this schema in the application.
-
-| Field Name | Required | Type | Description |
-|----------------|---------------------|-----------------------|---------------------------------------------------------------------------------------------|
-| `project_id` | **{dotted-circle}** | integer | |
-| `namespace_id` | **{dotted-circle}** | integer | |
-| `environment` | **{check-circle}** | string (max 32 chars) | Name of the source environment, such as `production` or `staging` |
-| `source` | **{check-circle}** | string (max 32 chars) | Name of the source application, such as `gitlab-rails` or `gitlab-javascript` |
-| `plan` | **{dotted-circle}** | string (max 32 chars) | Name of the plan for the namespace, such as `free`, `premium`, or `ultimate`. Automatically picked from the `namespace`. |
-| `extra` | **{dotted-circle}** | JSON | Any additional data associated with the event, in the form of key-value pairs |
-
-### Default Schema
-
-| Field Name | Required | Type | Description |
-|--------------------------|---------------------|-----------|----------------------------------------------------------------------------------------------------------------------------------|
-| `app_id` | **{check-circle}** | string | Unique identifier for website / application |
-| `base_currency` | **{dotted-circle}** | string | Reporting currency |
-| `br_colordepth` | **{dotted-circle}** | integer | Browser color depth |
-| `br_cookies` | **{dotted-circle}** | boolean | Does the browser permit cookies? |
-| `br_family` | **{dotted-circle}** | string | Browser family |
-| `br_features_director` | **{dotted-circle}** | boolean | Director plugin installed? |
-| `br_features_flash` | **{dotted-circle}** | boolean | Flash plugin installed? |
-| `br_features_gears` | **{dotted-circle}** | boolean | Google gears installed? |
-| `br_features_java` | **{dotted-circle}** | boolean | Java plugin installed? |
-| `br_features_pdf` | **{dotted-circle}** | boolean | Adobe PDF plugin installed? |
-| `br_features_quicktime` | **{dotted-circle}** | boolean | Quicktime plugin installed? |
-| `br_features_realplayer` | **{dotted-circle}** | boolean | RealPlayer plugin installed? |
-| `br_features_silverlight` | **{dotted-circle}** | boolean | Silverlight plugin installed? |
-| `br_features_windowsmedia` | **{dotted-circle}** | boolean | Windows media plugin installed? |
-| `br_lang` | **{dotted-circle}** | string | Language the browser is set to |
-| `br_name` | **{dotted-circle}** | string | Browser name |
-| `br_renderengine` | **{dotted-circle}** | string | Browser rendering engine |
-| `br_type` | **{dotted-circle}** | string | Browser type |
-| `br_version` | **{dotted-circle}** | string | Browser version |
-| `br_viewheight` | **{dotted-circle}** | string | Browser viewport height |
-| `br_viewwidth` | **{dotted-circle}** | string | Browser viewport width |
-| `collector_tstamp` | **{dotted-circle}** | timestamp | Time stamp for the event recorded by the collector |
-| `contexts` | **{dotted-circle}** | | |
-| `derived_contexts` | **{dotted-circle}** | | Contexts derived in the Enrich process |
-| `derived_tstamp` | **{dotted-circle}** | timestamp | Timestamp making allowance for inaccurate device clock |
-| `doc_charset` | **{dotted-circle}** | string | Web page's character encoding |
-| `doc_height` | **{dotted-circle}** | string | Web page height |
-| `doc_width` | **{dotted-circle}** | string | Web page width |
-| `domain_sessionid` | **{dotted-circle}** | string | Unique identifier (UUID) for this visit of this user_id to this domain |
-| `domain_sessionidx` | **{dotted-circle}** | integer | Index of number of visits that this user_id has made to this domain (The first visit is `1`) |
-| `domain_userid` | **{dotted-circle}** | string | Unique identifier for a user, based on a first party cookie (so domain specific) |
-| `dvce_created_tstamp` | **{dotted-circle}** | timestamp | Timestamp when event occurred, as recorded by client device |
-| `dvce_ismobile` | **{dotted-circle}** | boolean | Indicates whether device is mobile |
-| `dvce_screenheight` | **{dotted-circle}** | string | Screen / monitor resolution |
-| `dvce_screenwidth` | **{dotted-circle}** | string | Screen / monitor resolution |
-| `dvce_sent_tstamp` | **{dotted-circle}** | timestamp | Timestamp when event was sent by client device to collector |
-| `dvce_type` | **{dotted-circle}** | string | Type of device |
-| `etl_tags` | **{dotted-circle}** | string | JSON of tags for this ETL run |
-| `etl_tstamp` | **{dotted-circle}** | timestamp | Timestamp event began ETL |
-| `event` | **{dotted-circle}** | string | Event type |
-| `event_fingerprint` | **{dotted-circle}** | string | Hash client-set event fields |
-| `event_format` | **{dotted-circle}** | string | Format for event |
-| `event_id` | **{dotted-circle}** | string | Event UUID |
-| `event_name` | **{dotted-circle}** | string | Event name |
-| `event_vendor` | **{dotted-circle}** | string | The company who developed the event model |
-| `event_version` | **{dotted-circle}** | string | Version of event schema |
-| `geo_city` | **{dotted-circle}** | string | City of IP origin |
-| `geo_country` | **{dotted-circle}** | string | Country of IP origin |
-| `geo_latitude` | **{dotted-circle}** | string | An approximate latitude |
-| `geo_longitude` | **{dotted-circle}** | string | An approximate longitude |
-| `geo_region` | **{dotted-circle}** | string | Region of IP origin |
-| `geo_region_name` | **{dotted-circle}** | string | Region of IP origin |
-| `geo_timezone` | **{dotted-circle}** | string | Timezone of IP origin |
-| `geo_zipcode` | **{dotted-circle}** | string | Zip (postal) code of IP origin |
-| `ip_domain` | **{dotted-circle}** | string | Second level domain name associated with the visitor's IP address |
-| `ip_isp` | **{dotted-circle}** | string | Visitor's ISP |
-| `ip_netspeed` | **{dotted-circle}** | string | Visitor's connection type |
-| `ip_organization` | **{dotted-circle}** | string | Organization associated with the visitor's IP address – defaults to ISP name if none is found |
-| `mkt_campaign` | **{dotted-circle}** | string | The campaign ID |
-| `mkt_clickid` | **{dotted-circle}** | string | The click ID |
-| `mkt_content` | **{dotted-circle}** | string | The content or ID of the ad. |
-| `mkt_medium` | **{dotted-circle}** | string | Type of traffic source |
-| `mkt_network` | **{dotted-circle}** | string | The ad network to which the click ID belongs |
-| `mkt_source` | **{dotted-circle}** | string | The company / website where the traffic came from |
-| `mkt_term` | **{dotted-circle}** | string | Keywords associated with the referrer |
-| `name_tracker` | **{dotted-circle}** | string | The tracker namespace |
-| `network_userid` | **{dotted-circle}** | string | Unique identifier for a user, based on a cookie from the collector (so set at a network level and shouldn't be set by a tracker) |
-| `os_family` | **{dotted-circle}** | string | Operating system family |
-| `os_manufacturer` | **{dotted-circle}** | string | Manufacturers of operating system |
-| `os_name` | **{dotted-circle}** | string | Name of operating system |
-| `os_timezone` | **{dotted-circle}** | string | Client operating system timezone |
-| `page_referrer` | **{dotted-circle}** | string | Referrer URL |
-| `page_title` | **{dotted-circle}** | string | Page title |
-| `page_url` | **{dotted-circle}** | string | Page URL |
-| `page_urlfragment` | **{dotted-circle}** | string | Fragment aka anchor |
-| `page_urlhost` | **{dotted-circle}** | string | Host aka domain |
-| `page_urlpath` | **{dotted-circle}** | string | Path to page |
-| `page_urlport` | **{dotted-circle}** | integer | Port if specified, 80 if not |
-| `page_urlquery` | **{dotted-circle}** | string | Query string |
-| `page_urlscheme` | **{dotted-circle}** | string | Scheme (protocol name) |
-| `platform` | **{dotted-circle}** | string | The platform the app runs on |
-| `pp_xoffset_max` | **{dotted-circle}** | integer | Maximum page x offset seen in the last ping period |
-| `pp_xoffset_min` | **{dotted-circle}** | integer | Minimum page x offset seen in the last ping period |
-| `pp_yoffset_max` | **{dotted-circle}** | integer | Maximum page y offset seen in the last ping period |
-| `pp_yoffset_min` | **{dotted-circle}** | integer | Minimum page y offset seen in the last ping period |
-| `refr_domain_userid` | **{dotted-circle}** | string | The Snowplow `domain_userid` of the referring website |
-| `refr_dvce_tstamp` | **{dotted-circle}** | timestamp | The time of attaching the `domain_userid` to the inbound link |
-| `refr_medium` | **{dotted-circle}** | string | Type of referer |
-| `refr_source` | **{dotted-circle}** | string | Name of referer if recognised |
-| `refr_term` | **{dotted-circle}** | string | Keywords if source is a search engine |
-| `refr_urlfragment` | **{dotted-circle}** | string | Referer URL fragment |
-| `refr_urlhost` | **{dotted-circle}** | string | Referer host |
-| `refr_urlpath` | **{dotted-circle}** | string | Referer page path |
-| `refr_urlport` | **{dotted-circle}** | integer | Referer port |
-| `refr_urlquery` | **{dotted-circle}** | string | Referer URL query string |
-| `refr_urlscheme` | **{dotted-circle}** | string | Referer scheme |
-| `se_action` | **{dotted-circle}** | string | The action / event itself |
-| `se_category` | **{dotted-circle}** | string | The category of event |
-| `se_label` | **{dotted-circle}** | string | A label often used to refer to the 'object' the action is performed on |
-| `se_property` | **{dotted-circle}** | string | A property associated with either the action or the object |
-| `se_value` | **{dotted-circle}** | decimal | A value associated with the user action |
-| `ti_category` | **{dotted-circle}** | string | Item category |
-| `ti_currency` | **{dotted-circle}** | string | Currency |
-| `ti_name` | **{dotted-circle}** | string | Item name |
-| `ti_orderid` | **{dotted-circle}** | string | Order ID |
-| `ti_price` | **{dotted-circle}** | decimal | Item price |
-| `ti_price_base` | **{dotted-circle}** | decimal | Item price in base currency |
-| `ti_quantity` | **{dotted-circle}** | integer | Item quantity |
-| `ti_sku` | **{dotted-circle}** | string | Item SKU |
-| `tr_affiliation` | **{dotted-circle}** | string | Transaction affiliation (such as channel) |
-| `tr_city` | **{dotted-circle}** | string | Delivery address: city |
-| `tr_country` | **{dotted-circle}** | string | Delivery address: country |
-| `tr_currency` | **{dotted-circle}** | string | Transaction Currency |
-| `tr_orderid` | **{dotted-circle}** | string | Order ID |
-| `tr_shipping` | **{dotted-circle}** | decimal | Delivery cost charged |
-| `tr_shipping_base` | **{dotted-circle}** | decimal | Shipping cost in base currency |
-| `tr_state` | **{dotted-circle}** | string | Delivery address: state |
-| `tr_tax` | **{dotted-circle}** | decimal | Transaction tax value (such as amount of VAT included) |
-| `tr_tax_base` | **{dotted-circle}** | decimal | Tax applied in base currency |
-| `tr_total` | **{dotted-circle}** | decimal | Transaction total value |
-| `tr_total_base` | **{dotted-circle}** | decimal | Total amount of transaction in base currency |
-| `true_tstamp` | **{dotted-circle}** | timestamp | User-set exact timestamp |
-| `txn_id` | **{dotted-circle}** | string | Transaction ID |
-| `unstruct_event` | **{dotted-circle}** | JSON | The properties of the event |
-| `uploaded_at` | **{dotted-circle}** | | |
-| `user_fingerprint` | **{dotted-circle}** | integer | User identifier based on (hopefully unique) browser features |
-| `user_id` | **{dotted-circle}** | string | Unique identifier for user, set by the business using setUserId |
-| `user_ipaddress` | **{dotted-circle}** | string | IP address |
-| `useragent` | **{dotted-circle}** | string | User agent (expressed as a browser string) |
-| `v_collector` | **{dotted-circle}** | string | Collector version |
-| `v_etl` | **{dotted-circle}** | string | ETL version |
-| `v_tracker` | **{dotted-circle}** | string | Identifier for Snowplow tracker |
+- [Product Intelligence Guide](https://about.gitlab.com/handbook/product/product-intelligence-guide/)
+- [Service Ping Guide](../service_ping/index.md)
+- [Product Intelligence Direction](https://about.gitlab.com/direction/product-intelligence/)
+- [Data Analysis Process](https://about.gitlab.com/handbook/business-technology/data-team/#data-analysis-process/)
+- [Data for Product Managers](https://about.gitlab.com/handbook/business-technology/data-team/programs/data-for-product-managers/)
+- [Data Infrastructure](https://about.gitlab.com/handbook/business-technology/data-team/platform/infrastructure/)
diff --git a/doc/development/snowplow/review_guidelines.md b/doc/development/snowplow/review_guidelines.md
index 8edcbf06a0e..69fad1794e2 100644
--- a/doc/development/snowplow/review_guidelines.md
+++ b/doc/development/snowplow/review_guidelines.md
@@ -14,7 +14,7 @@ general best practices for code reviews, refer to our [code review guide](../cod
## Resources for reviewers
- [Snowplow Guide](index.md)
-- [Event Dictionary](dictionary.md)
+- [Event Dictionary](https://metrics.gitlab.com/snowplow.html)
## Review process
@@ -26,18 +26,18 @@ events or touches Snowplow related files.
#### The merge request **author** should
- For frontend events, when relevant, add a screenshot of the event in
- the [testing tool](../snowplow/index.md#develop-and-test-snowplow) used.
+ the [testing tool](implementation.md#develop-and-test-snowplow) used.
- For backend events, when relevant, add the output of the
- [Snowplow Micro](index.md#snowplow-mini) good events
+ [Snowplow Micro](implementation.md#snowplow-micro) good events
`GET http://localhost:9090/micro/good` (it might be a good idea
to reset with `GET http://localhost:9090/micro/reset` first).
- Update the [Event Dictionary](event_dictionary_guide.md).
#### The Product Intelligence **reviewer** should
-- Check that the [event taxonomy](../snowplow/index.md#structured-event-taxonomy) is correct.
-- Check the [usage recommendations](../snowplow/index.md#usage-recommendations).
+- Check that the [event taxonomy](index.md#structured-event-taxonomy) is correct.
+- Check the [usage recommendations](implementation.md#usage-recommendations).
- Check that the [Event Dictionary](event_dictionary_guide.md) is up-to-date.
- If needed, check that the events are firing locally using one of the
-[testing tools](../snowplow/index.md#develop-and-test-snowplow) available.
+[testing tools](implementation.md#develop-and-test-snowplow) available.
- Approve the MR, and relabel the MR with `~"product intelligence::approved"`.
diff --git a/doc/development/snowplow/schemas.md b/doc/development/snowplow/schemas.md
new file mode 100644
index 00000000000..5b9e4f5256e
--- /dev/null
+++ b/doc/development/snowplow/schemas.md
@@ -0,0 +1,166 @@
+---
+stage: Growth
+group: Product Intelligence
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
+---
+
+# Snowplow schemas
+
+This page provides Snowplow schema reference for GitLab events.
+
+## `gitlab_standard`
+
+We are including the [`gitlab_standard` schema](https://gitlab.com/gitlab-org/iglu/-/blob/master/public/schemas/com.gitlab/gitlab_standard/jsonschema/) with every event. See [Standardize Snowplow Schema](https://gitlab.com/groups/gitlab-org/-/epics/5218) for details.
+
+The [`StandardContext`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/tracking/standard_context.rb) class represents this schema in the application.
+
+| Field Name | Required | Type | Description |
+|----------------|---------------------|-----------------------|---------------------------------------------------------------------------------------------|
+| `project_id` | **{dotted-circle}** | integer | |
+| `namespace_id` | **{dotted-circle}** | integer | |
+| `environment` | **{check-circle}** | string (max 32 chars) | Name of the source environment, such as `production` or `staging` |
+| `source` | **{check-circle}** | string (max 32 chars) | Name of the source application, such as `gitlab-rails` or `gitlab-javascript` |
+| `plan` | **{dotted-circle}** | string (max 32 chars) | Name of the plan for the namespace, such as `free`, `premium`, or `ultimate`. Automatically picked from the `namespace`. |
+| `google_analytics_id` | **{dotted-circle}** | string (max 32 chars) | Google Analytics ID, present when set from our marketing sites. |
+| `extra` | **{dotted-circle}** | JSON | Any additional data associated with the event, in the form of key-value pairs |
+
+## Default Schema
+
+Frontend events include a [web-specific schema](https://docs.snowplowanalytics.com/docs/understanding-your-pipeline/canonical-event/#Web-specific_fields) provided by Snowplow.
+All URLs are pseudonymized. The entity identifier [replaces](https://docs.snowplowanalytics.com/docs/collecting-data/collecting-from-own-applications/javascript-trackers/javascript-tracker/javascript-tracker-v2/tracker-setup/other-parameters-2/#Setting_a_custom_page_URL_and_referrer_URL) personally identifiable
+information (PII). PII includes usernames, group, and project names.
+
+| Field Name | Required | Type | Description |
+|--------------------------|---------------------|-----------|----------------------------------------------------------------------------------------------------------------------------------|
+| `app_id` | **{check-circle}** | string | Unique identifier for website / application |
+| `base_currency` | **{dotted-circle}** | string | Reporting currency |
+| `br_colordepth` | **{dotted-circle}** | integer | Browser color depth |
+| `br_cookies` | **{dotted-circle}** | boolean | Does the browser permit cookies? |
+| `br_family` | **{dotted-circle}** | string | Browser family |
+| `br_features_director` | **{dotted-circle}** | boolean | Director plugin installed? |
+| `br_features_flash` | **{dotted-circle}** | boolean | Flash plugin installed? |
+| `br_features_gears` | **{dotted-circle}** | boolean | Google gears installed? |
+| `br_features_java` | **{dotted-circle}** | boolean | Java plugin installed? |
+| `br_features_pdf` | **{dotted-circle}** | boolean | Adobe PDF plugin installed? |
+| `br_features_quicktime` | **{dotted-circle}** | boolean | Quicktime plugin installed? |
+| `br_features_realplayer` | **{dotted-circle}** | boolean | RealPlayer plugin installed? |
+| `br_features_silverlight` | **{dotted-circle}** | boolean | Silverlight plugin installed? |
+| `br_features_windowsmedia` | **{dotted-circle}** | boolean | Windows media plugin installed? |
+| `br_lang` | **{dotted-circle}** | string | Language the browser is set to |
+| `br_name` | **{dotted-circle}** | string | Browser name |
+| `br_renderengine` | **{dotted-circle}** | string | Browser rendering engine |
+| `br_type` | **{dotted-circle}** | string | Browser type |
+| `br_version` | **{dotted-circle}** | string | Browser version |
+| `br_viewheight` | **{dotted-circle}** | string | Browser viewport height |
+| `br_viewwidth` | **{dotted-circle}** | string | Browser viewport width |
+| `collector_tstamp` | **{dotted-circle}** | timestamp | Time stamp for the event recorded by the collector |
+| `contexts` | **{dotted-circle}** | | |
+| `derived_contexts` | **{dotted-circle}** | | Contexts derived in the Enrich process |
+| `derived_tstamp` | **{dotted-circle}** | timestamp | Timestamp making allowance for inaccurate device clock |
+| `doc_charset` | **{dotted-circle}** | string | Web page's character encoding |
+| `doc_height` | **{dotted-circle}** | string | Web page height |
+| `doc_width` | **{dotted-circle}** | string | Web page width |
+| `domain_sessionid` | **{dotted-circle}** | string | Unique identifier (UUID) for this visit of this user_id to this domain |
+| `domain_sessionidx` | **{dotted-circle}** | integer | Index of number of visits that this user_id has made to this domain (The first visit is `1`) |
+| `domain_userid` | **{dotted-circle}** | string | Unique identifier for a user, based on a first party cookie (so domain specific) |
+| `dvce_created_tstamp` | **{dotted-circle}** | timestamp | Timestamp when event occurred, as recorded by client device |
+| `dvce_ismobile` | **{dotted-circle}** | boolean | Indicates whether device is mobile |
+| `dvce_screenheight` | **{dotted-circle}** | string | Screen / monitor resolution |
+| `dvce_screenwidth` | **{dotted-circle}** | string | Screen / monitor resolution |
+| `dvce_sent_tstamp` | **{dotted-circle}** | timestamp | Timestamp when event was sent by client device to collector |
+| `dvce_type` | **{dotted-circle}** | string | Type of device |
+| `etl_tags` | **{dotted-circle}** | string | JSON of tags for this ETL run |
+| `etl_tstamp` | **{dotted-circle}** | timestamp | Timestamp event began ETL |
+| `event` | **{dotted-circle}** | string | Event type |
+| `event_fingerprint` | **{dotted-circle}** | string | Hash client-set event fields |
+| `event_format` | **{dotted-circle}** | string | Format for event |
+| `event_id` | **{dotted-circle}** | string | Event UUID |
+| `event_name` | **{dotted-circle}** | string | Event name |
+| `event_vendor` | **{dotted-circle}** | string | The company who developed the event model |
+| `event_version` | **{dotted-circle}** | string | Version of event schema |
+| `geo_city` | **{dotted-circle}** | string | City of IP origin |
+| `geo_country` | **{dotted-circle}** | string | Country of IP origin |
+| `geo_latitude` | **{dotted-circle}** | string | An approximate latitude |
+| `geo_longitude` | **{dotted-circle}** | string | An approximate longitude |
+| `geo_region` | **{dotted-circle}** | string | Region of IP origin |
+| `geo_region_name` | **{dotted-circle}** | string | Region of IP origin |
+| `geo_timezone` | **{dotted-circle}** | string | Time zone of IP origin |
+| `geo_zipcode` | **{dotted-circle}** | string | Zip (postal) code of IP origin |
+| `ip_domain` | **{dotted-circle}** | string | Second level domain name associated with the visitor's IP address |
+| `ip_isp` | **{dotted-circle}** | string | Visitor's ISP |
+| `ip_netspeed` | **{dotted-circle}** | string | Visitor's connection type |
+| `ip_organization` | **{dotted-circle}** | string | Organization associated with the visitor's IP address – defaults to ISP name if none is found |
+| `mkt_campaign` | **{dotted-circle}** | string | The campaign ID |
+| `mkt_clickid` | **{dotted-circle}** | string | The click ID |
+| `mkt_content` | **{dotted-circle}** | string | The content or ID of the ad. |
+| `mkt_medium` | **{dotted-circle}** | string | Type of traffic source |
+| `mkt_network` | **{dotted-circle}** | string | The ad network to which the click ID belongs |
+| `mkt_source` | **{dotted-circle}** | string | The company / website where the traffic came from |
+| `mkt_term` | **{dotted-circle}** | string | Keywords associated with the referrer |
+| `name_tracker` | **{dotted-circle}** | string | The tracker namespace |
+| `network_userid` | **{dotted-circle}** | string | Unique identifier for a user, based on a cookie from the collector (so set at a network level and shouldn't be set by a tracker) |
+| `os_family` | **{dotted-circle}** | string | Operating system family |
+| `os_manufacturer` | **{dotted-circle}** | string | Manufacturers of operating system |
+| `os_name` | **{dotted-circle}** | string | Name of operating system |
+| `os_timezone` | **{dotted-circle}** | string | Client operating system time zone |
+| `page_referrer` | **{dotted-circle}** | string | Referrer URL |
+| `page_title` | **{dotted-circle}** | string | Page title |
+| `page_url` | **{dotted-circle}** | string | Page URL |
+| `page_urlfragment` | **{dotted-circle}** | string | Fragment aka anchor |
+| `page_urlhost` | **{dotted-circle}** | string | Host aka domain |
+| `page_urlpath` | **{dotted-circle}** | string | Path to page |
+| `page_urlport` | **{dotted-circle}** | integer | Port if specified, 80 if not |
+| `page_urlquery` | **{dotted-circle}** | string | Query string |
+| `page_urlscheme` | **{dotted-circle}** | string | Scheme (protocol name) |
+| `platform` | **{dotted-circle}** | string | The platform the app runs on |
+| `pp_xoffset_max` | **{dotted-circle}** | integer | Maximum page x offset seen in the last ping period |
+| `pp_xoffset_min` | **{dotted-circle}** | integer | Minimum page x offset seen in the last ping period |
+| `pp_yoffset_max` | **{dotted-circle}** | integer | Maximum page y offset seen in the last ping period |
+| `pp_yoffset_min` | **{dotted-circle}** | integer | Minimum page y offset seen in the last ping period |
+| `refr_domain_userid` | **{dotted-circle}** | string | The Snowplow `domain_userid` of the referring website |
+| `refr_dvce_tstamp` | **{dotted-circle}** | timestamp | The time of attaching the `domain_userid` to the inbound link |
+| `refr_medium` | **{dotted-circle}** | string | Type of referer |
+| `refr_source` | **{dotted-circle}** | string | Name of referer if recognised |
+| `refr_term` | **{dotted-circle}** | string | Keywords if source is a search engine |
+| `refr_urlfragment` | **{dotted-circle}** | string | Referer URL fragment |
+| `refr_urlhost` | **{dotted-circle}** | string | Referer host |
+| `refr_urlpath` | **{dotted-circle}** | string | Referer page path |
+| `refr_urlport` | **{dotted-circle}** | integer | Referer port |
+| `refr_urlquery` | **{dotted-circle}** | string | Referer URL query string |
+| `refr_urlscheme` | **{dotted-circle}** | string | Referer scheme |
+| `se_action` | **{dotted-circle}** | string | The action / event itself |
+| `se_category` | **{dotted-circle}** | string | The category of event |
+| `se_label` | **{dotted-circle}** | string | A label often used to refer to the 'object' the action is performed on |
+| `se_property` | **{dotted-circle}** | string | A property associated with either the action or the object |
+| `se_value` | **{dotted-circle}** | decimal | A value associated with the user action |
+| `ti_category` | **{dotted-circle}** | string | Item category |
+| `ti_currency` | **{dotted-circle}** | string | Currency |
+| `ti_name` | **{dotted-circle}** | string | Item name |
+| `ti_orderid` | **{dotted-circle}** | string | Order ID |
+| `ti_price` | **{dotted-circle}** | decimal | Item price |
+| `ti_price_base` | **{dotted-circle}** | decimal | Item price in base currency |
+| `ti_quantity` | **{dotted-circle}** | integer | Item quantity |
+| `ti_sku` | **{dotted-circle}** | string | Item SKU |
+| `tr_affiliation` | **{dotted-circle}** | string | Transaction affiliation (such as channel) |
+| `tr_city` | **{dotted-circle}** | string | Delivery address: city |
+| `tr_country` | **{dotted-circle}** | string | Delivery address: country |
+| `tr_currency` | **{dotted-circle}** | string | Transaction Currency |
+| `tr_orderid` | **{dotted-circle}** | string | Order ID |
+| `tr_shipping` | **{dotted-circle}** | decimal | Delivery cost charged |
+| `tr_shipping_base` | **{dotted-circle}** | decimal | Shipping cost in base currency |
+| `tr_state` | **{dotted-circle}** | string | Delivery address: state |
+| `tr_tax` | **{dotted-circle}** | decimal | Transaction tax value (such as amount of VAT included) |
+| `tr_tax_base` | **{dotted-circle}** | decimal | Tax applied in base currency |
+| `tr_total` | **{dotted-circle}** | decimal | Transaction total value |
+| `tr_total_base` | **{dotted-circle}** | decimal | Total amount of transaction in base currency |
+| `true_tstamp` | **{dotted-circle}** | timestamp | User-set exact timestamp |
+| `txn_id` | **{dotted-circle}** | string | Transaction ID |
+| `unstruct_event` | **{dotted-circle}** | JSON | The properties of the event |
+| `uploaded_at` | **{dotted-circle}** | | |
+| `user_fingerprint` | **{dotted-circle}** | integer | User identifier based on (hopefully unique) browser features |
+| `user_id` | **{dotted-circle}** | string | Unique identifier for user, set by the business using setUserId |
+| `user_ipaddress` | **{dotted-circle}** | string | IP address |
+| `useragent` | **{dotted-circle}** | string | User agent (expressed as a browser string) |
+| `v_collector` | **{dotted-circle}** | string | Collector version |
+| `v_etl` | **{dotted-circle}** | string | ETL version |
+| `v_tracker` | **{dotted-circle}** | string | Identifier for Snowplow tracker |
diff --git a/doc/development/sql.md b/doc/development/sql.md
index 3483305c113..129280598fe 100644
--- a/doc/development/sql.md
+++ b/doc/development/sql.md
@@ -241,7 +241,7 @@ MergeRequest.where(source_project_id: Project.all.select(:id))
```
The _only_ time you should use `pluck` is when you actually need to operate on
-the values in Ruby itself (e.g. write them to a file). In almost all other cases
+the values in Ruby itself (for example, writing them to a file). In almost all other cases
you should ask yourself "Can I not just use a sub-query?".
In line with our `CodeReuse/ActiveRecord` cop, you should only use forms like
diff --git a/doc/development/stage_group_dashboards.md b/doc/development/stage_group_dashboards.md
index 7c518e9b6ca..a887558e473 100644
--- a/doc/development/stage_group_dashboards.md
+++ b/doc/development/stage_group_dashboards.md
@@ -1,6 +1,6 @@
---
-stage: Enablement
-group: Infrastructure
+stage: Platforms
+group: Scalability
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
@@ -58,6 +58,12 @@ component can have 2 indicators:
[Web](https://gitlab.com/gitlab-com/runbooks/-/blob/f22f40b2c2eab37d85e23ccac45e658b2c914445/metrics-catalog/services/web.jsonnet#L154)
services, that threshold is **5 seconds**.
+ We're working on making this target configurable per endpoint in [this
+ project](https://gitlab.com/groups/gitlab-com/gl-infra/-/epics/525). Learn
+ how to [customize the request
+ apdex](application_slis/rails_request_apdex.md), this new apdex
+ measurement is not yet part of the error budget.
+
For Sidekiq job execution, the threshold depends on the [job
urgency](sidekiq_style_guide.md#job-urgency). It is
[currently](https://gitlab.com/gitlab-com/runbooks/-/blob/f22f40b2c2eab37d85e23ccac45e658b2c914445/metrics-catalog/services/lib/sidekiq-helpers.libsonnet#L25-38)
@@ -120,7 +126,7 @@ Inside a stage group dashboard, there are some notable components. Let's take th
![Default time filter](img/stage_group_dashboards_time_filter.png)
-- By default, all the times are in UTC timezone. [We use UTC when communicating in Engineering](https://about.gitlab.com/handbook/communication/#writing-style-guidelines).
+- By default, all the times are in UTC time zone. [We use UTC when communicating in Engineering](https://about.gitlab.com/handbook/communication/#writing-style-guidelines).
- All metrics recorded in the GitLab production system have [1-year retention](https://gitlab.com/gitlab-cookbooks/gitlab-prometheus/-/blob/31526b03fef823e2f9b3cda7c75dcd28a12418a3/attributes/prometheus.rb#L40).
- Alternatively, you can zoom in or filter the time range directly on a graph. See the [Grafana Time Range Controls](https://grafana.com/docs/grafana/latest/dashboards/time-range-controls/) documentation for more information.
diff --git a/doc/development/testing_guide/best_practices.md b/doc/development/testing_guide/best_practices.md
index 79664490368..52e89a10556 100644
--- a/doc/development/testing_guide/best_practices.md
+++ b/doc/development/testing_guide/best_practices.md
@@ -68,7 +68,7 @@ SILENCE_DEPRECATIONS=1 bin/rspec spec/models/project_spec.rb
### Test speed
-GitLab has a massive test suite that, without [parallelization](ci.md#test-suite-parallelization-on-the-ci), can take hours
+GitLab has a massive test suite that, without [parallelization](../pipelines.md#test-suite-parallelization), can take hours
to run. It's important that we make an effort to write tests that are accurate
and effective _as well as_ fast.
diff --git a/doc/development/testing_guide/ci.md b/doc/development/testing_guide/ci.md
index e3fccdcee34..de024084c9c 100644
--- a/doc/development/testing_guide/ci.md
+++ b/doc/development/testing_guide/ci.md
@@ -1,45 +1,9 @@
---
-stage: none
-group: unassigned
-info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
+redirect_to: '../pipelines.md'
+remove_date: '2022-01-12'
---
-# GitLab tests in the Continuous Integration (CI) context
+This file was moved to [another location](../pipelines.md).
-## Test suite parallelization on the CI
-
-Our current CI parallelization setup is as follows:
-
-1. The `retrieve-tests-metadata` job in the `prepare` stage ensures we have a
- `knapsack/report-master.json` file:
- - The `knapsack/report-master.json` file is fetched from the latest `main` pipeline which runs `update-tests-metadata`
- (for now it's the 2-hourly scheduled master pipeline), if it's not here we initialize the file with `{}`.
-1. Each `[rspec|rspec-ee] [unit|integration|system|geo] n m` job are run with
- `knapsack rspec` and should have an evenly distributed share of tests:
- - It works because the jobs have access to the `knapsack/report-master.json`
- since the "artifacts from all previous stages are passed by default".
- - the jobs set their own report path to
- `"knapsack/${TEST_TOOL}_${TEST_LEVEL}_${DATABASE}_${CI_NODE_INDEX}_${CI_NODE_TOTAL}_report.json"`.
- - if knapsack is doing its job, test files that are run should be listed under
- `Report specs`, not under `Leftover specs`.
-1. The `update-tests-metadata` job (which only runs on scheduled pipelines for
- [the canonical project](https://gitlab.com/gitlab-org/gitlab) takes all the
- `knapsack/rspec*_pg_*.json` files and merge them all together into a single
- `knapsack/report-master.json` file that is saved as artifact.
-
-After that, the next pipeline uses the up-to-date `knapsack/report-master.json` file.
-
-## Monitoring
-
-The GitLab test suite is [monitored](../performance.md#rspec-profiling) for the `main` branch, and any branch
-that includes `rspec-profile` in their name.
-
-## CI setup
-
-- Rails logging to `log/test.log` is disabled by default in CI [for
- performance reasons](https://jtway.co/speed-up-your-rails-test-suite-by-6-in-1-line-13fedb869ec4). To override this setting, provide the
- `RAILS_ENABLE_TEST_LOG` environment variable.
-
----
-
-[Return to Testing documentation](index.md)
+<!-- This redirect file can be deleted after <2022-01-12>. -->
+<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/#move-or-rename-a-page -->
diff --git a/doc/development/testing_guide/end_to_end/best_practices.md b/doc/development/testing_guide/end_to_end/best_practices.md
index a3caa8bf2b3..9491c89c2a0 100644
--- a/doc/development/testing_guide/end_to_end/best_practices.md
+++ b/doc/development/testing_guide/end_to_end/best_practices.md
@@ -245,7 +245,11 @@ end
## Prefer `aggregate_failures` when there are back-to-back expectations
-In cases where there must be multiple (back-to-back) expectations within a test case, it is preferable to use `aggregate_failures`.
+See [Prefer aggregate failures when there are multiple expectations](#prefer-aggregate_failures-when-there-are-multiple-expectations)
+
+## Prefer `aggregate_failures` when there are multiple expectations
+
+In cases where there must be multiple expectations within a test case, it is preferable to use `aggregate_failures`.
This allows you to group a set of expectations and see all the failures altogether, rather than having the test being aborted on the first failure.
@@ -270,6 +274,32 @@ Page::Search::Results.perform do |search|
end
```
+Attach the `:aggregate_failures` metadata to the example if multiple expectations are separated by statements.
+
+```ruby
+#=> Good
+it 'searches', :aggregate_failures do
+ Page::Search::Results.perform do |search|
+ expect(search).to have_file_in_project(template[:file_name], project.name)
+
+ search.switch_to_code
+
+ expect(search).to have_file_with_content(template[:file_name], content[0..33])
+ end
+end
+
+#=> Bad
+it 'searches' do
+ Page::Search::Results.perform do |search|
+ expect(search).to have_file_in_project(template[:file_name], project.name)
+
+ search.switch_to_code
+
+ expect(search).to have_file_with_content(template[:file_name], content[0..33])
+ end
+end
+```
+
## Prefer to split tests across multiple files
Our framework includes a couple of parallelization mechanisms that work by executing spec files in parallel.
@@ -333,11 +363,11 @@ after(:all) do
end
```
-## Tag tests that require Administrator access
+## Tag tests that require the Administrator role
-We don't run tests that require Administrator access against our Production environments.
+We don't run tests that require the Administrator role against our Production environments.
-When you add a new test that requires Administrator access, apply the RSpec metadata `:requires_admin` so that the test will not be included in the test suites executed against Production and other environments on which we don't want to run those tests.
+When you add a new test that requires the Administrator role, apply the RSpec metadata `:requires_admin` so that the test will not be included in the test suites executed against Production and other environments on which we don't want to run those tests.
When running tests locally or configuring a pipeline, the environment variable `QA_CAN_TEST_ADMIN_FEATURES` can be set to `false` to skip tests that have the `:requires_admin` tag.
diff --git a/doc/development/testing_guide/end_to_end/dynamic_element_validation.md b/doc/development/testing_guide/end_to_end/dynamic_element_validation.md
index 6c504e6fa28..8770a5d33cd 100644
--- a/doc/development/testing_guide/end_to_end/dynamic_element_validation.md
+++ b/doc/development/testing_guide/end_to_end/dynamic_element_validation.md
@@ -52,7 +52,7 @@ Simply put, a required element is a visible HTML element that appears on a UI co
"Visible" can be defined as
-- Not having any CSS preventing its display. E.g.: `display: none` or `width: 0px; height: 0px;`
+- Not having any CSS preventing its display, for example, `display: none` or `width: 0px; height: 0px;`
- Being able to be interacted with by the user
"UI component" can be defined as
diff --git a/doc/development/testing_guide/end_to_end/feature_flags.md b/doc/development/testing_guide/end_to_end/feature_flags.md
index c9acb2e9371..994ee3f253c 100644
--- a/doc/development/testing_guide/end_to_end/feature_flags.md
+++ b/doc/development/testing_guide/end_to_end/feature_flags.md
@@ -15,7 +15,7 @@ token via `GITLAB_QA_ADMIN_ACCESS_TOKEN` (recommended), or provide `GITLAB_ADMIN
and `GITLAB_ADMIN_PASSWORD`.
Please be sure to include the tag `:requires_admin` so that the test can be skipped in environments
-where admin access is not available.
+where administrator access is not available.
WARNING:
You are strongly advised to [enable feature flags only for a group, project, user](../../feature_flags/index.md#feature-actors),
diff --git a/doc/development/testing_guide/end_to_end/index.md b/doc/development/testing_guide/end_to_end/index.md
index 36c0f5adf00..b097d6b0729 100644
--- a/doc/development/testing_guide/end_to_end/index.md
+++ b/doc/development/testing_guide/end_to_end/index.md
@@ -184,7 +184,7 @@ 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`.
-A common CI template for report uploading is stored in
+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).
#### Merge requests
diff --git a/doc/development/testing_guide/end_to_end/page_objects.md b/doc/development/testing_guide/end_to_end/page_objects.md
index 9ffa7ea4f77..85ab4d479f9 100644
--- a/doc/development/testing_guide/end_to_end/page_objects.md
+++ b/doc/development/testing_guide/end_to_end/page_objects.md
@@ -105,7 +105,7 @@ code but **this is deprecated** in favor of the above method for two reasons:
- Consistency: there is only one way to define an element
- Separation of concerns: QA uses dedicated `data-qa-*` attributes instead of reusing code
- or classes used by other components (e.g. `js-*` classes etc.)
+ or classes used by other components (for example, `js-*` classes etc.)
```ruby
view 'app/views/my/view.html.haml' do
diff --git a/doc/development/testing_guide/end_to_end/rspec_metadata_tests.md b/doc/development/testing_guide/end_to_end/rspec_metadata_tests.md
index b6e92367f89..3749511fef5 100644
--- a/doc/development/testing_guide/end_to_end/rspec_metadata_tests.md
+++ b/doc/development/testing_guide/end_to_end/rspec_metadata_tests.md
@@ -26,6 +26,7 @@ This is a partial list of the [RSpec metadata](https://relishapp.com/rspec/rspec
| `:ldap_no_tls` | The test requires a GitLab instance to be configured to use an external LDAP server with TLS not enabled. |
| `:ldap_tls` | The test requires a GitLab instance to be configured to use an external LDAP server with TLS enabled. |
| `:mattermost` | The test requires a GitLab Mattermost service on the GitLab instance. |
+| `:mixed_env` | The test should only be executed in environments that have a paired canary version available through traffic routing based on the existence of the `gitlab_canary=true` cookie. Tests in this category are switching the cookie mid-test to validate mixed deployment environments. |
| `:object_storage` | The test requires a GitLab instance to be configured to use multiple [object storage types](../../../administration/object_storage.md). Uses MinIO as the object storage server. |
| `:only` | The test is only to be run in specific execution contexts. See [test execution context selection](execution_context_selection.md) for more information. |
| `:orchestrated` | The GitLab instance under test may be [configured by `gitlab-qa`](https://gitlab.com/gitlab-org/gitlab-qa/-/blob/master/docs/what_tests_can_be_run.md#orchestrated-tests) to be different to the default GitLab configuration, or `gitlab-qa` may launch additional services in separate Docker containers, or both. Tests tagged with `:orchestrated` are excluded when testing environments where we can't dynamically modify the GitLab configuration (for example, Staging). |
@@ -34,7 +35,7 @@ This is a partial list of the [RSpec metadata](https://relishapp.com/rspec/rspec
| `:relative_url` | The test requires a GitLab instance to be installed under a [relative URL](../../../install/relative_url.md). |
| `:reliable` | The test has been [promoted to a reliable test](https://about.gitlab.com/handbook/engineering/quality/guidelines/reliable-tests/#promoting-an-existing-test-to-reliable) meaning it passes consistently in all pipelines, including merge requests. |
| `:repository_storage` | The test requires a GitLab instance to be configured to use multiple [repository storage paths](../../../administration/repository_storage_paths.md). Paired with the `:orchestrated` tag. |
-| `:requires_admin` | The test requires an admin account. Tests with the tag are excluded when run against Canary and Production environments. |
+| `:requires_admin` | The test requires an administrator account. Tests with the tag are excluded when run against Canary and Production environments. |
| `:requires_git_protocol_v2` | The test requires that Git protocol version 2 is enabled on the server. It's assumed to be enabled by default but if not the test can be skipped by setting `QA_CAN_TEST_GIT_PROTOCOL_V2` to `false`. |
| `:requires_praefect` | The test requires that the GitLab instance uses [Gitaly Cluster](../../../administration/gitaly/praefect.md) (a.k.a. Praefect) as the repository storage . It's assumed to be used by default but if not the test can be skipped by setting `QA_CAN_TEST_PRAEFECT` to `false`. |
| `:runner` | The test depends on and sets up a GitLab Runner instance, typically to run a pipeline. |
diff --git a/doc/development/testing_guide/end_to_end/running_tests_that_require_special_setup.md b/doc/development/testing_guide/end_to_end/running_tests_that_require_special_setup.md
index 46a3053c267..eadd0ef49a0 100644
--- a/doc/development/testing_guide/end_to_end/running_tests_that_require_special_setup.md
+++ b/doc/development/testing_guide/end_to_end/running_tests_that_require_special_setup.md
@@ -45,7 +45,7 @@ docker run \
Jenkins is available on `http://localhost:8080`.
-Admin username is `admin` and password is `password`.
+Administrator username is `admin` and password is `password`.
It is worth noting that this is not an orchestrated test. It is [tagged with the `:orchestrated` meta](https://gitlab.com/gitlab-org/gitlab/-/blob/163c8a8c814db26d11e104d1cb2dcf02eb567dbe/qa/qa/specs/features/ee/browser_ui/3_create/jenkins/jenkins_build_status_spec.rb#L5)
only to prevent it from running in the pipelines for live environments such as Staging.
@@ -167,9 +167,9 @@ The following includes more information on the command:
-`QA_DEBUG` - Set to `true` to verbosely log page object actions.
-`WEBDRIVER_HEADLESS` - When running locally, set to `false` to allow browser tests to be visible - watch your tests being run.
--`GITLAB_ADMIN_USERNAME` - Admin username to use when adding a license.
--`GITLAB_ADMIN_PASSWORD` - Admin password to use when adding a license.
--`GITLAB_QA_ACCESS_TOKEN` and `GITLAB_QA_ADMIN_ACCESS_TOKEN` - A valid personal access token with the `api` scope. This is used for API access during tests, and is used in the version that staging is currently running. The `ADMIN_ACCESS_TOKEN` is from a user with admin access. Used for API access as an admin during tests.
+-`GITLAB_ADMIN_USERNAME` - Administrator username to use when adding a license.
+-`GITLAB_ADMIN_PASSWORD` - Administrator password to use when adding a license.
+-`GITLAB_QA_ACCESS_TOKEN` and `GITLAB_QA_ADMIN_ACCESS_TOKEN` - A valid personal access token with the `api` scope. This is used for API access during tests, and is used in the version that staging is currently running. The `ADMIN_ACCESS_TOKEN` is from a user with administrator access. Used for API access as an administrator during tests.
-`CLUSTER_API_URL` - Use the address `https://kubernetes.docker.internal:6443` . This address is used to enable the cluster to be network accessible while deploying using Auto DevOps.
-`https://[YOUR-PORT].qa-tunnel.gitlab.info/` - The address of your local GDK
-`qa/specs/features/browser_ui/8_monitor/all_monitor_core_features_spec.rb` - The path to the monitor core specs
@@ -410,9 +410,9 @@ Tests that are tagged with `:ldap_tls` and `:ldap_no_tls` meta are orchestrated
These tests spin up a Docker container [(`osixia/openldap`)](https://hub.docker.com/r/osixia/openldap) running an instance of [OpenLDAP](https://www.openldap.org/).
The container uses fixtures [checked into the GitLab-QA repository](https://gitlab.com/gitlab-org/gitlab-qa/-/tree/9ffb9ad3be847a9054967d792d6772a74220fb42/fixtures/ldap) to create
-base data such as users and groups including the admin group. The password for [all users](https://gitlab.com/gitlab-org/gitlab-qa/-/blob/9ffb9ad3be847a9054967d792d6772a74220fb42/fixtures/ldap/2_add_users.ldif) including [the `tanuki` user](https://gitlab.com/gitlab-org/gitlab-qa/-/blob/9ffb9ad3be847a9054967d792d6772a74220fb42/fixtures/ldap/tanuki.ldif) is `password`.
+base data such as users and groups including the administrator group. The password for [all users](https://gitlab.com/gitlab-org/gitlab-qa/-/blob/9ffb9ad3be847a9054967d792d6772a74220fb42/fixtures/ldap/2_add_users.ldif) including [the `tanuki` user](https://gitlab.com/gitlab-org/gitlab-qa/-/blob/9ffb9ad3be847a9054967d792d6772a74220fb42/fixtures/ldap/tanuki.ldif) is `password`.
-A GitLab instance is also created in a Docker container based on our [General LDAP setup](../../../administration/auth/ldap/index.md#general-ldap-setup) documentation.
+A GitLab instance is also created in a Docker container based on our [LDAP setup](../../../administration/auth/ldap/index.md) documentation.
Tests that are tagged `:ldap_tls` enable TLS on GitLab using the certificate [checked into the GitLab-QA repository](https://gitlab.com/gitlab-org/gitlab-qa/-/tree/9ffb9ad3be847a9054967d792d6772a74220fb42/tls_certificates/gitlab).
diff --git a/doc/development/testing_guide/flaky_tests.md b/doc/development/testing_guide/flaky_tests.md
index bfcd68dbaf3..9489020de5d 100644
--- a/doc/development/testing_guide/flaky_tests.md
+++ b/doc/development/testing_guide/flaky_tests.md
@@ -37,9 +37,9 @@ bin/rspec --tag quarantine
Once a test is in quarantine, there are 3 choices:
-- Should the test be fixed (i.e. get rid of its flakiness)?
+- Should the test be fixed (that is, get rid of its flakiness)?
- Should the test be moved to a lower level of testing?
-- Should the test be removed entirely (e.g. because there's already a
+- Should the test be removed entirely (for example, because there's already a
lower-level test, or it's duplicating another same-level test, or it's testing
too much etc.)?
diff --git a/doc/development/testing_guide/frontend_testing.md b/doc/development/testing_guide/frontend_testing.md
index 76687db3a3f..0e721ba2760 100644
--- a/doc/development/testing_guide/frontend_testing.md
+++ b/doc/development/testing_guide/frontend_testing.md
@@ -146,7 +146,7 @@ it('does not display a dropdown if no metricTypes exist', () => {
});
```
-Keep an eye out for these kinds of tests, as they just make updating logic more fragile and tedious than it needs to be. This is also true for other libraries. A rule of thumb here is: if you are checking a `wrapper.vm` property, you should probably stop and rethink the test to check the rendered template instead.
+Keep an eye out for these kinds of tests, as they just make updating logic more fragile and tedious than it needs to be. This is also true for other libraries. A suggestion here is: if you are checking a `wrapper.vm` property, you should probably stop and rethink the test to check the rendered template instead.
Some more examples can be found in the [Frontend unit tests section](testing_levels.md#frontend-unit-tests)
@@ -783,20 +783,25 @@ often using fixtures to validate correct integration with the backend code.
### Use fixtures
-Jest uses `spec/frontend/__helpers__/fixtures.js` to import fixtures in tests.
-
-The following are examples of tests that work for Jest:
+To import a JSON fixture, `import` it using the `test_fixtures` alias.
```javascript
+import responseBody from 'test_fixtures/some/fixture.json' // loads spec/frontend/fixtures/some/fixture.json
+
it('makes a request', () => {
- const responseBody = getJSONFixture('some/fixture.json'); // loads spec/frontend/fixtures/some/fixture.json
axiosMock.onGet(endpoint).reply(200, responseBody);
myButton.click();
// ...
});
+```
+
+For other fixtures, Jest uses `spec/frontend/__helpers__/fixtures.js` to import them in tests.
+The following are examples of tests that work for Jest:
+
+```javascript
it('uses some HTML element', () => {
loadFixtures('some/page.html'); // loads spec/frontend/fixtures/some/page.html and adds it to the DOM
@@ -843,10 +848,6 @@ describe GraphQL::Query, type: :request do
all_releases_query_path = 'releases/graphql/queries/all_releases.query.graphql'
- before(:all) do
- clean_frontend_fixtures('graphql/releases/')
- end
-
it "graphql/#{all_releases_query_path}.json" do
query = get_graphql_query_as_string(all_releases_query_path)
@@ -860,7 +861,7 @@ end
This will create a new fixture located at
`tmp/tests/frontend/fixtures-ee/graphql/releases/graphql/queries/all_releases.query.graphql.json`.
-You can import the JSON fixture in a Jest test using the `getJSONFixture` method
+You can import the JSON fixture in a Jest test using the `test_fixtures` alias
[as described below](#use-fixtures).
## Data-driven tests
@@ -998,7 +999,7 @@ it like so:
import Subject from '~/feature/the_subject.vue';
// Force Jest to transpile and cache
-// eslint-disable-next-line import/order, no-unused-vars
+// eslint-disable-next-line no-unused-vars
import _Thing from '~/feature/path/to/thing.vue';
```
diff --git a/doc/development/testing_guide/img/review-app-parent-pipeline.png b/doc/development/testing_guide/img/review-app-parent-pipeline.png
new file mode 100644
index 00000000000..5686d5f6ebe
--- /dev/null
+++ b/doc/development/testing_guide/img/review-app-parent-pipeline.png
Binary files differ
diff --git a/doc/development/testing_guide/index.md b/doc/development/testing_guide/index.md
index 015d8a92a4d..2e00a00c454 100644
--- a/doc/development/testing_guide/index.md
+++ b/doc/development/testing_guide/index.md
@@ -48,7 +48,7 @@ testing promises, stubbing etc.
What are flaky tests, the different kind of flaky tests we encountered, and what
we do about them.
-## [GitLab tests in the Continuous Integration (CI) context](ci.md)
+## [GitLab pipelines](../pipelines.md)
How GitLab test suite is run in the CI context: setup, caches, artifacts,
parallelization, monitoring.
diff --git a/doc/development/testing_guide/review_apps.md b/doc/development/testing_guide/review_apps.md
index 72d63fd8194..4091f213a8f 100644
--- a/doc/development/testing_guide/review_apps.md
+++ b/doc/development/testing_guide/review_apps.md
@@ -6,8 +6,98 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# Review Apps
-Review Apps are automatically deployed by [the
-pipeline](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/6665).
+Review Apps are deployed using the `start-review-app-pipeline` job. This job triggers a child pipeline containing a series of jobs to perform the various tasks needed to deploy a Review App.
+
+![start-review-app-pipeline job](img/review-app-parent-pipeline.png)
+
+For any of the following scenarios, the `start-review-app-pipeline` job would be automatically started:
+
+- for merge requests with CI config changes
+- for merge requests with frontend changes
+- for merge requests with QA changes
+- for scheduled pipelines
+
+## QA runs on Review Apps
+
+On every [pipeline](https://gitlab.com/gitlab-org/gitlab/pipelines/125315730) in the `qa` stage (which comes after the
+`review` stage), the `review-qa-smoke` job is automatically started and it runs
+the QA smoke suite.
+
+You can also manually start the `review-qa-all`: it runs the full QA suite.
+
+After the end-to-end test runs have finished, [Allure reports](https://github.com/allure-framework/allure2) are generated and published by
+the `allure-report-qa-smoke` and `allure-report-qa-all` jobs. A comment with links to the reports are added to the merge request.
+
+## Performance Metrics
+
+On every [pipeline](https://gitlab.com/gitlab-org/gitlab/pipelines/125315730) in the `qa` stage, the
+`review-performance` job is automatically started: this job does basic
+browser performance testing using a
+[Sitespeed.io Container](../../user/project/merge_requests/browser_performance_testing.md).
+
+## How to
+
+### Get access to the GCP Review Apps cluster
+
+You need to [open an access request (internal link)](https://gitlab.com/gitlab-com/access-requests/-/issues/new)
+for the `gcp-review-apps-dev` GCP group and role.
+
+This grants you the following permissions for:
+
+- [Retrieving pod logs](#dig-into-a-pods-logs). Granted by [Viewer (`roles/viewer`)](https://cloud.google.com/iam/docs/understanding-roles#kubernetes-engine-roles).
+- [Running a Rails console](#run-a-rails-console). Granted by [Kubernetes Engine Developer (`roles/container.pods.exec`)](https://cloud.google.com/iam/docs/understanding-roles#kubernetes-engine-roles).
+
+### Log into my Review App
+
+For GitLab Team Members only. If you want to sign in to the review app, review
+the GitLab handbook information for the [shared 1Password account](https://about.gitlab.com/handbook/security/#1password-for-teams).
+
+- The default username is `root`.
+- The password can be found in the 1Password login item named `GitLab EE Review App`.
+
+### Enable a feature flag for my Review App
+
+1. Open your Review App and log in as documented above.
+1. Create a personal access token.
+1. Enable the feature flag using the [Feature flag API](../../api/features.md).
+
+### Find my Review App slug
+
+1. Open the `review-deploy` job.
+1. Look for `** Deploying review-*`.
+1. For instance for `** Deploying review-1234-abc-defg... **`,
+ your Review App slug would be `review-1234-abc-defg` in this case.
+
+### Run a Rails console
+
+1. Make sure you [have access to the cluster](#get-access-to-the-gcp-review-apps-cluster) and the `container.pods.exec` permission first.
+1. [Filter Workloads by your Review App slug](https://console.cloud.google.com/kubernetes/workload?project=gitlab-review-apps),
+ e.g. `review-qa-raise-e-12chm0`.
+1. Find and open the `task-runner` Deployment, e.g. `review-qa-raise-e-12chm0-task-runner`.
+1. Click on the Pod in the "Managed pods" section, e.g. `review-qa-raise-e-12chm0-task-runner-d5455cc8-2lsvz`.
+1. Click on the `KUBECTL` dropdown, then `Exec` -> `task-runner`.
+1. Replace `-c task-runner -- ls` with `-it -- gitlab-rails console` from the
+ default command or
+ - Run `kubectl exec --namespace review-qa-raise-e-12chm0 review-qa-raise-e-12chm0-task-runner-d5455cc8-2lsvz -it -- gitlab-rails console` and
+ - Replace `review-qa-raise-e-12chm0-task-runner-d5455cc8-2lsvz`
+ with your Pod's name.
+
+### Dig into a Pod's logs
+
+1. Make sure you [have access to the cluster](#get-access-to-the-gcp-review-apps-cluster) and the `container.pods.getLogs` permission first.
+1. [Filter Workloads by your Review App slug](https://console.cloud.google.com/kubernetes/workload?project=gitlab-review-apps),
+ e.g. `review-qa-raise-e-12chm0`.
+1. Find and open the `migrations` Deployment, e.g.
+ `review-qa-raise-e-12chm0-migrations.1`.
+1. Click on the Pod in the "Managed pods" section, e.g.
+ `review-qa-raise-e-12chm0-migrations.1-nqwtx`.
+1. Click on the `Container logs` link.
+
+Alternatively, you could use the [Logs Explorer](https://console.cloud.google.com/logs/query;query=?project=gitlab-review-apps) which provides more utility to search logs. An example query for a pod name is as follows:
+
+```shell
+resource.labels.pod_name:"review-qa-raise-e-12chm0-migrations"
+```
## How does it work?
@@ -89,7 +179,7 @@ subgraph "CNG-mirror pipeline"
**Additional notes:**
-- If the `review-deploy` job keep failing (note that we already retry it twice),
+- If the `review-deploy` job keeps failing (and a manual retry didn't help),
please post a message in the `#g_qe_engineering_productivity` channel and/or create a `~"Engineering Productivity"` `~"ep::review apps"` `~bug`
issue with a link to your merge request. Note that the deployment failure can
reveal an actual problem introduced in your merge request (i.e. this isn't
@@ -105,7 +195,7 @@ subgraph "CNG-mirror pipeline"
stop a Review App manually, and is also started by GitLab once a merge
request's branch is deleted after being merged.
- The Kubernetes cluster is connected to the `gitlab` projects using the
- [GitLab Kubernetes integration](../../user/project/clusters/index.md). This basically
+ [GitLab Kubernetes integration](../../user/infrastructure/clusters/index.md). This basically
allows to have a link to the Review App directly from the merge request widget.
### Auto-stopping of Review Apps
@@ -126,24 +216,6 @@ The `review-gcp-cleanup` job that automatically runs in scheduled pipelines
(and is manual in merge request) removes any dangling GCP network resources
that were not removed along with the Kubernetes resources.
-## QA runs
-
-On every [pipeline](https://gitlab.com/gitlab-org/gitlab/pipelines/125315730) in the `qa` stage (which comes after the
-`review` stage), the `review-qa-smoke` job is automatically started and it runs
-the QA smoke suite.
-
-You can also manually start the `review-qa-all`: it runs the full QA suite.
-
-After the end-to-end test runs have finished, [Allure reports](https://github.com/allure-framework/allure2) are generated and published by
-the `allure-report-qa-smoke` and `allure-report-qa-all` jobs. A comment with links to the reports are added to the merge request.
-
-## Performance Metrics
-
-On every [pipeline](https://gitlab.com/gitlab-org/gitlab/pipelines/125315730) in the `qa` stage, the
-`review-performance` job is automatically started: this job does basic
-browser performance testing using a
-[Sitespeed.io Container](../../user/project/merge_requests/browser_performance_testing.md).
-
## Cluster configuration
The cluster is configured via Terraform in the [`engineering-productivity-infrastructure`](https://gitlab.com/gitlab-org/quality/engineering-productivity-infrastructure) project.
@@ -157,64 +229,6 @@ The Helm version used is defined in the
[`registry.gitlab.com/gitlab-org/gitlab-build-images:gitlab-helm3-kubectl1.14` image](https://gitlab.com/gitlab-org/gitlab-build-images/-/blob/master/Dockerfile.gitlab-helm3-kubectl1.14#L7)
used by the `review-deploy` and `review-stop` jobs.
-## How to
-
-### Get access to the GCP Review Apps cluster
-
-You need to [open an access request (internal link)](https://gitlab.com/gitlab-com/access-requests/-/issues/new)
-for the `gcp-review-apps-dev` GCP group and role.
-
-This grants you the following permissions for:
-
-- [Retrieving pod logs](#dig-into-a-pods-logs). Granted by [Viewer (`roles/viewer`)](https://cloud.google.com/iam/docs/understanding-roles#kubernetes-engine-roles).
-- [Running a Rails console](#run-a-rails-console). Granted by [Kubernetes Engine Developer (`roles/container.pods.exec`)](https://cloud.google.com/iam/docs/understanding-roles#kubernetes-engine-roles).
-
-### Log into my Review App
-
-For GitLab Team Members only. If you want to sign in to the review app, review
-the GitLab handbook information for the [shared 1Password account](https://about.gitlab.com/handbook/security/#1password-for-teams).
-
-- The default username is `root`.
-- The password can be found in the 1Password login item named `GitLab EE Review App`.
-
-### Enable a feature flag for my Review App
-
-1. Open your Review App and log in as documented above.
-1. Create a personal access token.
-1. Enable the feature flag using the [Feature flag API](../../api/features.md).
-
-### Find my Review App slug
-
-1. Open the `review-deploy` job.
-1. Look for `** Deploying review-*`.
-1. For instance for `** Deploying review-1234-abc-defg... **`,
- your Review App slug would be `review-1234-abc-defg` in this case.
-
-### Run a Rails console
-
-1. Make sure you [have access to the cluster](#get-access-to-the-gcp-review-apps-cluster) and the `container.pods.exec` permission first.
-1. [Filter Workloads by your Review App slug](https://console.cloud.google.com/kubernetes/workload?project=gitlab-review-apps),
- e.g. `review-qa-raise-e-12chm0`.
-1. Find and open the `task-runner` Deployment, e.g. `review-qa-raise-e-12chm0-task-runner`.
-1. Click on the Pod in the "Managed pods" section, e.g. `review-qa-raise-e-12chm0-task-runner-d5455cc8-2lsvz`.
-1. Click on the `KUBECTL` dropdown, then `Exec` -> `task-runner`.
-1. Replace `-c task-runner -- ls` with `-it -- gitlab-rails console` from the
- default command or
- - Run `kubectl exec --namespace review-qa-raise-e-12chm0 review-qa-raise-e-12chm0-task-runner-d5455cc8-2lsvz -it -- gitlab-rails console` and
- - Replace `review-qa-raise-e-12chm0-task-runner-d5455cc8-2lsvz`
- with your Pod's name.
-
-### Dig into a Pod's logs
-
-1. Make sure you [have access to the cluster](#get-access-to-the-gcp-review-apps-cluster) and the `container.pods.getLogs` permission first.
-1. [Filter Workloads by your Review App slug](https://console.cloud.google.com/kubernetes/workload?project=gitlab-review-apps),
- e.g. `review-qa-raise-e-12chm0`.
-1. Find and open the `migrations` Deployment, e.g.
- `review-qa-raise-e-12chm0-migrations.1`.
-1. Click on the Pod in the "Managed pods" section, e.g.
- `review-qa-raise-e-12chm0-migrations.1-nqwtx`.
-1. Click on the `Container logs` link.
-
## Diagnosing unhealthy Review App releases
If [Review App Stability](https://app.periscopedata.com/app/gitlab/496118/Engineering-Productivity-Sandbox?widget=6690556&udv=785399)
diff --git a/doc/development/usage_ping/dictionary.md b/doc/development/usage_ping/dictionary.md
index e7e8464ff7a..810c789bc03 100644
--- a/doc/development/usage_ping/dictionary.md
+++ b/doc/development/usage_ping/dictionary.md
@@ -1,4 +1,4 @@
---
-redirect_to: 'https://gitlab-org.gitlab.io/growth/product-intelligence/metric-dictionary'
+redirect_to: 'https://metrics.gitlab.com/index.html'
remove_date: '2021-11-10'
---
diff --git a/doc/development/usage_ping/index.md b/doc/development/usage_ping/index.md
deleted file mode 100644
index aa06cb36f0c..00000000000
--- a/doc/development/usage_ping/index.md
+++ /dev/null
@@ -1,9 +0,0 @@
----
-redirect_to: '../service_ping/index.md'
-remove_date: '2021-10-09'
----
-
-This file was moved to [another location](../service_ping/index.md).
-
-<!-- This redirect file can be deleted after <2021-10-09>. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/#move-or-rename-a-page -->
diff --git a/doc/development/usage_ping/metrics_dictionary.md b/doc/development/usage_ping/metrics_dictionary.md
deleted file mode 100644
index 3743c2e0414..00000000000
--- a/doc/development/usage_ping/metrics_dictionary.md
+++ /dev/null
@@ -1,9 +0,0 @@
----
-redirect_to: '../service_ping/metrics_dictionary.md'
-remove_date: '2021-10-09'
----
-
-This file was moved to [another location](../service_ping/metrics_dictionary.md).
-
-<!-- This redirect file can be deleted after <2021-10-09>. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/#move-or-rename-a-page -->
diff --git a/doc/development/usage_ping/metrics_instrumentation.md b/doc/development/usage_ping/metrics_instrumentation.md
deleted file mode 100644
index f2d731803b8..00000000000
--- a/doc/development/usage_ping/metrics_instrumentation.md
+++ /dev/null
@@ -1,9 +0,0 @@
----
-redirect_to: '../service_ping/metrics_instrumentation.md'
-remove_date: '2021-10-09'
----
-
-This file was moved to [another location](../service_ping/metrics_instrumentation.md).
-
-<!-- This redirect file can be deleted after <2021-10-09>. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/#move-or-rename-a-page -->
diff --git a/doc/development/usage_ping/product_intelligence_review.md b/doc/development/usage_ping/product_intelligence_review.md
deleted file mode 100644
index dc51e3e300a..00000000000
--- a/doc/development/usage_ping/product_intelligence_review.md
+++ /dev/null
@@ -1,9 +0,0 @@
----
-redirect_to: '../service_ping/review_guidelines.md'
-remove_date: '2021-10-09'
----
-
-This file was moved to [another location](../service_ping/review_guidelines.md).
-
-<!-- This redirect file can be deleted after <2021-10-09>. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/#move-or-rename-a-page -->
diff --git a/doc/development/usage_ping/review_guidelines.md b/doc/development/usage_ping/review_guidelines.md
deleted file mode 100644
index dc51e3e300a..00000000000
--- a/doc/development/usage_ping/review_guidelines.md
+++ /dev/null
@@ -1,9 +0,0 @@
----
-redirect_to: '../service_ping/review_guidelines.md'
-remove_date: '2021-10-09'
----
-
-This file was moved to [another location](../service_ping/review_guidelines.md).
-
-<!-- This redirect file can be deleted after <2021-10-09>. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/#move-or-rename-a-page -->
diff --git a/doc/development/windows.md b/doc/development/windows.md
index 07f8a80e95f..fb095b68939 100644
--- a/doc/development/windows.md
+++ b/doc/development/windows.md
@@ -33,7 +33,7 @@ tags:
- windows-1809
```
-A list of software preinstalled on the Windows images is available at: [Preinstalled software](https://gitlab.com/gitlab-org/ci-cd/shared-runners/images/gcp/windows-containers/blob/master/cookbooks/preinstalled-software/README.md).
+A list of software preinstalled on the Windows images is available at: [Preinstalled software](https://gitlab.com/gitlab-org/ci-cd/shared-runners/images/gcp/windows-containers/blob/main/cookbooks/preinstalled-software/README.md).
## GCP Windows image for development
@@ -57,7 +57,7 @@ Build a Google Cloud image with the above shared runners repository by doing the
1. Clone the repository <https://github.com/rgl/packer-provisioner-windows-update> and `cd` into the cloned directory.
1. Run the command `go build -o packer-provisioner-windows-update` (requires `go` to be installed).
1. Verify `packer-provisioner-windows-update` is in the `PATH` environment variable.
-1. Add all [required environment variables](https://gitlab.com/gitlab-org/ci-cd/shared-runners/images/gcp/windows-containers/-/blob/master/packer.json#L2-10)
+1. Add all [required environment variables](https://gitlab.com/gitlab-org/ci-cd/shared-runners/images/gcp/windows-containers/-/blob/main/packer.json#L2-10)
in the `packer.json` file to your environment (perhaps use [`direnv`](https://direnv.net/)).
1. Build the image by running the command: `packer build packer.json`.
@@ -136,7 +136,7 @@ PowerShell has aliases for all of the following commands so you don't have to le
- `/` ---> `\` (path separator)
- `cat` ---> `type`
- `mv` ---> `move`
-- Redirection works the same (i.e. `>` and `2>&1`)
+- Redirection works the same (for example, `>` and `2>&1`)
- `.\some.exe` to call a local executable
- curl is available
- `..` and `.` are available
diff --git a/doc/index.md b/doc/index.md
index cb8b0e67f7d..a638647e3e3 100644
--- a/doc/index.md
+++ b/doc/index.md
@@ -40,7 +40,7 @@ Have a look at some of our most popular topics:
|:-------------------------------------------------------------------------------------------|:------------|
| [Two-factor authentication](user/profile/account/two_factor_authentication.md) | Improve the security of your GitLab account. |
| [GitLab groups](user/group/index.md) | Manage projects together. |
-| [GitLab CI/CD pipeline configuration reference](ci/yaml/index.md) | Available configuration options for `.gitlab-ci.yml` files. |
+| [Keyword reference for the `.gitlab-ci.yml` file](ci/yaml/index.md) | Available configuration options for `.gitlab-ci.yml` files. |
| [Activate GitLab EE with a license](user/admin_area/license.md) | Activate GitLab Enterprise Edition functionality with a license. |
| [Back up and restore GitLab](raketasks/backup_restore.md) | Rake tasks for backing up and restoring GitLab self-managed instances. |
| [GitLab release and maintenance policy](policy/maintenance.md) | Policies for version naming and cadence, and also upgrade recommendations. |
@@ -108,7 +108,7 @@ There are many ways to integrate with GitLab, including:
| Topic | Description |
|:-------------------------------------------|:------------|
-| [GitLab REST API](api/README.md) | Integrate with GitLab using our REST API. |
+| [GitLab REST API](api/index.md) | Integrate with GitLab using our REST API. |
| [GitLab GraphQL API](api/graphql/index.md) | Integrate with GitLab using our GraphQL API. |
| [Integrations](integration/index.md) | Integrations with third-party products. |
diff --git a/doc/install/aws/eks_clusters_aws.md b/doc/install/aws/eks_clusters_aws.md
index 95f9f81f601..3c19a83f128 100644
--- a/doc/install/aws/eks_clusters_aws.md
+++ b/doc/install/aws/eks_clusters_aws.md
@@ -17,15 +17,14 @@ This documentation is not for clusters for deployment of GitLab itself, but inst
Information on deploying GitLab onto EKS can be found in [Provisioning GitLab Cloud Native Hybrid on AWS EKS](gitlab_hybrid_on_aws.md).
-## Use AWS EKS quick start or `eksctl`
+## Use `eksctl`
-Using the EKS Quick Start or `eksctl` enables the following when building an EKS Cluster:
+Using `eksctl` enables the following when building an EKS Cluster:
-- It can be part of CloudFormation IaC or [CLI (`eksctl`)](https://eksctl.io/) automation
- You have various cluster configuration options:
- Selection of operating system: Amazon Linux 2, Windows, Bottlerocket
- Selection of Hardware Architecture: x86, ARM, GPU
- - Selection of Fargate backend
+ - Selection of Kubernetes version (the GitLab-managed clusters for your project's applications have [specific Kubernetes version requirements](../../user/infrastructure/clusters/connect/index.md#supported-cluster-versions))
- It can deploy high value-add items to the cluster, including:
- A bastion host to keep the cluster endpoint private and possible perform performance testing.
- Prometheus and Grafana for monitoring.
diff --git a/doc/install/aws/gitlab_hybrid_on_aws.md b/doc/install/aws/gitlab_hybrid_on_aws.md
index 9f53f333463..4d22a29ad0a 100644
--- a/doc/install/aws/gitlab_hybrid_on_aws.md
+++ b/doc/install/aws/gitlab_hybrid_on_aws.md
@@ -15,13 +15,21 @@ Amazon provides a managed Kubernetes service offering known as [Amazon Elastic K
## Tested AWS Bill of Materials by reference architecture size
-| GitLab Cloud Native Hybrid Ref Arch | GitLab Baseline Perf Test Results Omnibus on Instances | AWS Bill of Materials (BOM) for CNH | AWS Build Performance Testing Results for [CNH](https://gitlab.com/gitlab-com/alliances/aws/implementation-patterns/gitlab-cloud-native-hybrid-on-eks/-/blob/master/gitlab-alliances-testing/5K/5k-QuickStart-ARM-RDS-Redis_v13-12-3-ee_2021-07-23_140128/5k-QuickStart-ARM-RDS-Redis_v13-12-3-ee_2021-07-23_140128_results.txt) | CNH Cost Estimate 3 AZs |
+| GitLab Cloud Native Hybrid Ref Arch | GitLab Baseline Perf Test Results Omnibus on Instances | AWS Bill of Materials (BOM) for CNH | AWS Build Performance Testing Results for [CNH](https://gitlab.com/gitlab-com/alliances/aws/implementation-patterns/gitlab-cloud-native-hybrid-on-eks/-/blob/master/gitlab-alliances-testing/5K/5k-QuickStart-ARM-RDS-Redis_v13-12-3-ee_2021-07-23_140128/5k-QuickStart-ARM-RDS-Redis_v13-12-3-ee_2021-07-23_140128_results.txt) | CNH Cost Estimate 3 AZs* |
| ------------------------------------------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ |
-| [2K Omnibus](../../administration/reference_architectures/2k_users.md) | [2K Baseline](https://gitlab.com/gitlab-org/quality/performance/-/wikis/Benchmarks/Latest/2k) | [2K Cloud Native Hybrid on EKS](#2k-cloud-native-hybrid-on-eks) | GPT Test Results | 1 YR Ec2 Compute Savings + 1 YR RDS & Elasticache RIs<br />(2 AZ Cost Estimate is in BOM Below) |
-| [3K](../../administration/reference_architectures/3k_users.md#cloud-native-hybrid-reference-architecture-with-helm-charts-alternative) | [3k Baseline](https://gitlab.com/gitlab-org/quality/performance/-/wikis/Benchmarks/Latest/3k) | [3K Cloud Native Hybrid on EKS](#3k-cloud-native-hybrid-on-eks) | [3K Full Scale GPT Test Results](https://gitlab.com/gitlab-com/alliances/aws/implementation-patterns/gitlab-cloud-native-hybrid-on-eks/-/blob/master/gitlab-alliances-testing/3K/3k-QuickStart-ARM-RDS-Cache_v13-12-3-ee_2021-07-23_124216/3k-QuickStart-ARM-RDS-Cache_v13-12-3-ee_2021-07-23_124216_results.txt)<br /><br />[3K AutoScale GPT Test Results](https://gitlab.com/gitlab-com/alliances/aws/implementation-patterns/gitlab-cloud-native-hybrid-on-eks/-/blob/master/gitlab-alliances-testing/3K/3k-QuickStart-AutoScale-ARM-RDS-Cache_v13-12-3-ee_2021-07-23_194200/3k-QuickStart-AutoScale-ARM-RDS-Cache_v13-12-3-ee_2021-07-23_194200_results.txt) | 1 YR Ec2 Compute Savings + 1 YR RDS & Elasticache RIs<br />(2 AZ Cost Estimate is in BOM Below) |
-| [5K](../../administration/reference_architectures/5k_users.md#cloud-native-hybrid-reference-architecture-with-helm-charts-alternative) | [5k Baseline](https://gitlab.com/gitlab-org/quality/performance/-/wikis/Benchmarks/Latest/5k) | [5K Cloud Native Hybrid on EKS](#5k-cloud-native-hybrid-on-eks) | [5K Full Scale GPT Test Results](https://gitlab.com/gitlab-com/alliances/aws/implementation-patterns/gitlab-cloud-native-hybrid-on-eks/-/blob/master/gitlab-alliances-testing/5K/5k-QuickStart-ARM-RDS-Redis_v13-12-3-ee_2021-07-23_140128/5k-QuickStart-ARM-RDS-Redis_v13-12-3-ee_2021-07-23_140128_results.txt)<br /><br />[5K AutoScale from 25% GPT Test Results](https://gitlab.com/gitlab-com/alliances/aws/implementation-patterns/gitlab-cloud-native-hybrid-on-eks/-/blob/master/gitlab-alliances-testing/5K/5k-QuickStart-AutoScale-From-25Percent-ARM-RDS-Redis_v13-12-3-ee_2021-07-24_102717/5k-QuickStart-AutoScale-From-25Percent-ARM-RDS-Redis_v13-12-3-ee_2021-07-24_102717_results.txt) | 1 YR Ec2 Compute Savings + 1 YR RDS & Elasticache RIs |
+| [2K Omnibus](../../administration/reference_architectures/2k_users.md) | [2K Baseline](https://gitlab.com/gitlab-org/quality/performance/-/wikis/Benchmarks/Latest/2k) | [2K Cloud Native Hybrid on EKS](#2k-cloud-native-hybrid-on-eks) | GPT Test Results | [1 YR Ec2 Compute Savings + 1 YR RDS & Elasticache RIs](https://calculator.aws/#/estimate?id=544bcf1162beae6b8130ad257d081cdf9d4504e3)<br />(2 AZ Cost Estimate is in BOM Below) |
+| [3K](../../administration/reference_architectures/3k_users.md#cloud-native-hybrid-reference-architecture-with-helm-charts-alternative) | [3k Baseline](https://gitlab.com/gitlab-org/quality/performance/-/wikis/Benchmarks/Latest/3k) | [3K Cloud Native Hybrid on EKS](#3k-cloud-native-hybrid-on-eks) | [3K Full Scale GPT Test Results](https://gitlab.com/gitlab-com/alliances/aws/implementation-patterns/gitlab-cloud-native-hybrid-on-eks/-/blob/master/gitlab-alliances-testing/3K/3k-QuickStart-ARM-RDS-Cache_v13-12-3-ee_2021-07-23_124216/3k-QuickStart-ARM-RDS-Cache_v13-12-3-ee_2021-07-23_124216_results.txt)<br /><br />[3K AutoScale GPT Test Results](https://gitlab.com/gitlab-com/alliances/aws/implementation-patterns/gitlab-cloud-native-hybrid-on-eks/-/blob/master/gitlab-alliances-testing/3K/3k-QuickStart-AutoScale-ARM-RDS-Cache_v13-12-3-ee_2021-07-23_194200/3k-QuickStart-AutoScale-ARM-RDS-Cache_v13-12-3-ee_2021-07-23_194200_results.txt) | [1 YR Ec2 Compute Savings + 1 YR RDS & Elasticache RIs](https://calculator.aws/#/estimate?id=f1294fec554e21be999711cddcdab9c5e7f83f14)<br />(2 AZ Cost Estimate is in BOM Below) |
+| [5K](../../administration/reference_architectures/5k_users.md#cloud-native-hybrid-reference-architecture-with-helm-charts-alternative) | [5k Baseline](https://gitlab.com/gitlab-org/quality/performance/-/wikis/Benchmarks/Latest/5k) | [5K Cloud Native Hybrid on EKS](#5k-cloud-native-hybrid-on-eks) | [5K Full Scale GPT Test Results](https://gitlab.com/gitlab-com/alliances/aws/implementation-patterns/gitlab-cloud-native-hybrid-on-eks/-/blob/master/gitlab-alliances-testing/5K/5k-QuickStart-ARM-RDS-Redis_v13-12-3-ee_2021-07-23_140128/5k-QuickStart-ARM-RDS-Redis_v13-12-3-ee_2021-07-23_140128_results.txt)<br /><br />[5K AutoScale from 25% GPT Test Results](https://gitlab.com/gitlab-com/alliances/aws/implementation-patterns/gitlab-cloud-native-hybrid-on-eks/-/blob/master/gitlab-alliances-testing/5K/5k-QuickStart-AutoScale-From-25Percent-ARM-RDS-Redis_v13-12-3-ee_2021-07-24_102717/5k-QuickStart-AutoScale-From-25Percent-ARM-RDS-Redis_v13-12-3-ee_2021-07-24_102717_results.txt) | [1 YR Ec2 Compute Savings + 1 YR RDS & Elasticache RIs](https://calculator.aws/#/estimate?id=330ee43c5b14662db5df6e52b34898d181a09e16) |
| [10K](../../administration/reference_architectures/10k_users.md#cloud-native-hybrid-reference-architecture-with-helm-charts-alternative) | [10k Baseline](https://gitlab.com/gitlab-org/quality/performance/-/wikis/Benchmarks/Latest/10k) | [10K Cloud Native Hybrid on EKS](#10k-cloud-native-hybrid-on-eks) | [10K Full Scale GPT Test Results](https://gitlab.com/gitlab-com/alliances/aws/implementation-patterns/gitlab-cloud-native-hybrid-on-eks/-/blob/master/gitlab-alliances-testing/10K/GL-CloudNative-10k-RDS-Graviton_v13-12-3-ee_2021-07-08_194647/GL-CloudNative-10k-RDS-Graviton_v13-12-3-ee_2021-07-08_194647_results.txt)<br /><br />[10K AutoScale GPT Test Results](hhttps://gitlab.com/gitlab-com/alliances/aws/implementation-patterns/gitlab-cloud-native-hybrid-on-eks/-/blob/master/gitlab-alliances-testing/10K/GL-CloudNative-10k-AutoScaling-Test_v13-12-3-ee_2021-07-09_115139/GL-CloudNative-10k-AutoScaling-Test_v13-12-3-ee_2021-07-09_115139_results.txt) | [10K 1 YR Ec2 Compute Savings + 1 YR RDS & Elasticache RIs](https://calculator.aws/#/estimate?id=5ac2e07a22e01c36ee76b5477c5a046cd1bea792) |
-| [50K](../../administration/reference_architectures/50k_users.md#cloud-native-hybrid-reference-architecture-with-helm-charts-alternative) | [50k Baseline](https://gitlab.com/gitlab-org/quality/performance/-/wikis/Benchmarks/Latest/50k) | [50K Cloud Native Hybrid on EKS](#50k-cloud-native-hybrid-on-eks) | [50K Full Scale GPT Test Results](https://gitlab.com/gitlab-com/alliances/aws/implementation-patterns/gitlab-cloud-native-hybrid-on-eks/-/blob/master/gitlab-alliances-testing/50K/50k-Fixed-Scale-Test_v13-12-3-ee_2021-08-13_172819/50k-Fixed-Scale-Test_v13-12-3-ee_2021-08-13_172819_results.txt)<br /><br />[10K AutoScale GPT Test Results](https://gitlab.com/gitlab-com/alliances/aws/implementation-patterns/gitlab-cloud-native-hybrid-on-eks/-/blob/master/gitlab-alliances-testing/50K/50k-AutoScale-Test_v13-12-3-ee_2021-08-13_192633/50k-AutoScale-Test_v13-12-3-ee_2021-08-13_192633.txt) | 10K 1 YR Ec2 Compute Savings + 1 YR RDS & Elasticache RIs |
+| [50K](../../administration/reference_architectures/50k_users.md#cloud-native-hybrid-reference-architecture-with-helm-charts-alternative) | [50k Baseline](https://gitlab.com/gitlab-org/quality/performance/-/wikis/Benchmarks/Latest/50k) | [50K Cloud Native Hybrid on EKS](#50k-cloud-native-hybrid-on-eks) | [50K Full Scale GPT Test Results](https://gitlab.com/gitlab-com/alliances/aws/implementation-patterns/gitlab-cloud-native-hybrid-on-eks/-/blob/master/gitlab-alliances-testing/50K/50k-Fixed-Scale-Test_v13-12-3-ee_2021-08-13_172819/50k-Fixed-Scale-Test_v13-12-3-ee_2021-08-13_172819_results.txt)<br /><br />[10K AutoScale GPT Test Results](https://gitlab.com/gitlab-com/alliances/aws/implementation-patterns/gitlab-cloud-native-hybrid-on-eks/-/blob/master/gitlab-alliances-testing/50K/50k-AutoScale-Test_v13-12-3-ee_2021-08-13_192633/50k-AutoScale-Test_v13-12-3-ee_2021-08-13_192633.txt) | [50K 1 YR Ec2 Compute Savings + 1 YR RDS & Elasticache RIs](https://calculator.aws/#/estimate?id=b9c9d6ac1d4a7848011d2050cef3120931fb7c22) |
+
+\*Cost calculations for actual implementations are a rough guideline with the following considerations:
+
+- Actual choices about instance types should be based on GPT testing of your configuration.
+- The first year of actual usage will reveal potential savings due to lower than expected usage, especially for ramping migrations where the full loading takes months, so be careful not to commit to savings plans too early or for too long.
+- The cost estimates assume full scale of the Kubernetes cluster nodes 24 x 7 x 365. Savings due to 'idling scale-in' are not considered because they are highly dependent on the usage patterns of the specific implementation.
+- Costs such as GitLab Runners, data egress and storage costs are not included as they are very dependent on the configuration of a specific implementation and on development behaviors (for example, frequency of committing or frequency of builds).
+- These estimates will change over time as GitLab tests and optimizes compute choices.
## Available Infrastructure as Code for GitLab Cloud Native Hybrid
@@ -45,9 +53,16 @@ It is helpful to review the [GitLab Environment Toolkit (GET) Issues](https://gi
| Results in a Ready-to-Use instance | Yes | Manual Actions or <br />Supplemental IaC Required |
| **<u>Configuration Features</u>** | | |
| Can deploy Omnibus GitLab (non-Kubernetes | No | Yes |
+| Results in a self-healing Gitaly Cluster configuration | Yes | No |
| Complete Internal Encryption | 85%, Targeting 100% | Manual |
| AWS GovCloud Support | Yes | TBD |
+### Two and Three Zone High Availability
+
+While GitLab Reference Architectures generally encourage three zone redundancy, AWS Quick Starts and AWS Well Architected consider two zone redundancy as AWS Well Architected. Individual implementations should weigh the costs of two and three zone configurations against their own high availability requirements for a final configuration.
+
+Gitaly Cluster uses a consistency voting system to implement strong consistency between synchronized nodes. Regardless of the number of availability zones implemented, there will always need to be a minimum of three Gitaly and three Praefect nodes in the cluster to avoid voting stalemates cause by an even number of nodes.
+
### Streamlined Performance Testing of AWS Quick Start Prepared GitLab Instances
A set of performance testing instructions have been abbreviated for testing a GitLab instance prepared using the AWS Quick Start for GitLab Cloud Native Hybrid on EKS. They assume zero familiarity with GitLab Performance Tool. They can be accessed here: [Performance Testing an Instance Prepared using AWS Quick Start for GitLab Cloud Native Hybrid on EKS](https://gitlab.com/gitlab-com/alliances/aws/implementation-patterns/gitlab-cloud-native-hybrid-on-eks/-/blob/master/Easy-DIY-Perf-Testing.md).
diff --git a/doc/install/aws/gitlab_sre_for_aws.md b/doc/install/aws/gitlab_sre_for_aws.md
index a2d3a2d0295..06e3bf784bd 100644
--- a/doc/install/aws/gitlab_sre_for_aws.md
+++ b/doc/install/aws/gitlab_sre_for_aws.md
@@ -9,7 +9,7 @@ type: index
# GitLab Site Reliability Engineering for AWS **(FREE SELF)**
-## Known issues list
+## AWS known issues list
Known issues are gathered from within GitLab and from customer reported issues. Customers successfully implement GitLab with a variety of "as a Service" components that GitLab has not specifically been designed for, nor has ongoing testing for. While GitLab does take partner technologies very seriously, the highlighting of known issues here is a convenience for implementers and it does not imply that GitLab has targeted compatibility with, nor carries any type of guarantee of running on the partner technology where the issues occur. Please consult individual issues to understand GitLabs stance and plans on any given known issue.
@@ -17,11 +17,11 @@ See the [GitLab AWS known issues list](https://gitlab.com/gitlab-com/alliances/a
## Gitaly SRE considerations
-Gitaly and Gitaly Cluster have been engineered by GitLab to overcome fundamental challenges with horizontal scaling of the open source Git binaries. Here is indepth technical reading on the topic:
+Gitaly is an embedded service for Git Repository Storage. Gitaly and Gitaly Cluster have been engineered by GitLab to overcome fundamental challenges with horizontal scaling of the open source Git binaries that must be used on the service side of GitLab. Here is indepth technical reading on the topic:
### Why Gitaly was built
-Below are some links to better understand why Gitaly was built:
+If you would like to understand the underlying rationale on why GitLab had to invest in creating Gitaly, read the following minimal list of topics:
- [Git characteristics that make horizontal scaling difficult](https://gitlab.com/gitlab-org/gitaly/-/blob/master/doc/DESIGN.md#git-characteristics-that-make-horizontal-scaling-difficult)
- [Git architectural characteristics and assumptions](https://gitlab.com/gitlab-org/gitaly/-/blob/master/doc/DESIGN.md#git-architectural-characteristics-and-assumptions)
@@ -36,19 +36,63 @@ As part of Gitaly cluster consistency, Praefect nodes will occasionally need to
Complete performance metrics should be collected for Gitaly instances for identification of bottlenecks, as they could have to do with disk IO, network IO or memory.
-Gitaly must be implemented on instance compute.
+### Gitaly performance guidelines
-### Gitaly EBS volume sizing guidelines
+Gitaly functions as the primary Git Repository Storage in GitLab. However, it's not simply a streaming file server. It also does a lot of demanding computing work, such as preparing and caching Git pack files which informs some of the performance recommendations below.
-Gitaly storage is expected to be local (not NFS of any type including EFS).
-Gitaly servers also need disk space for building and caching Git pack files.
+NOTE:
+All recommendations are for production configurations, including performance testing. For test configurations, like training or functional testing, you can use less expensive options. However, you should adjust or rebuild if performance is an issue.
-Background:
+#### Overall recommendations
-- When not using provisioned EBS IO, EBS volume size determines the IO level, so provisioning volumes that are much larger than needed can be the least expensive way to improve EBS IO.
-- Only use nitro instance types due to higher IO and EBS optimization.
-- Use Amazon Linux 2 to ensure the best disk and memory optimizations (for example, ENA network adapters and drivers).
-- If GitLab backup scripts are used, they need a temporary space location large enough to hold 2 times the current size of the Git File system. If that will be done on Gitaly servers, separate volumes should be used.
+- Production-grade Gitaly must be implemented on instance compute due to all of the above and below characteristics.
+- Never use [burstable instance types](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/burstable-performance-instances.html) (such as `t2`, `t3`, `t4g`) for Gitaly.
+- Always use at least the [AWS Nitro generation of instances](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instance-types.html#ec2-nitro-instances) to ensure many of the below concerns are automatically handled.
+- Use Amazon Linux 2 to ensure that all [AWS oriented hardware and OS optimizations](https://aws.amazon.com/amazon-linux-2/faqs/) are maximized without additional configuration or SRE management.
+
+#### CPU and memory recommendations
+
+- The general GitLab Gitaly node recommendations for CPU and Memory assume relatively even loading across repositories. GPT testing of any non-characteristic repositories and/or SRE monitoring of Gitaly metrics may inform when to choose memory and/or CPU higher than general recommendations.
+
+**To accommodate:**
+
+- Git Pack file operations are memory and CPU intensive.
+- If repository commit traffic is dense, large, or very frequent, then more CPU and Memory are required to handle the load. Patterns such as storing binaries and/or busy or large monorepos are examples that can cause high loading.
+
+#### Disk I/O recommendations
+
+- Use only SSD storage and the [class of EBS storage](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ebs-volume-types.html) that suites your durability and speed requirements.
+- When not using provisioned EBS IO, EBS volume size determines the I/O level, so provisioning volumes that are much larger than needed can be the least expensive way to improve EBS IO.
+- If Gitaly performance monitoring shows signs of disk stress then one of the provisioned IOPs levels can be chosen. Note that EBS IOPs levels also have enhanced durability which may be appealing for some implementations aside from performance considerations.
+
+**To accommodate:**
+
+- Gitaly storage is expected to be local (not NFS of any type including EFS).
+- Gitaly servers also need disk space for building and caching Git pack files. This is above and beyond the permanent storage of your Git Repositories.
+- Git Pack files are cached in Gitaly. Creation of pack files in temporary disk benefits from fast disk, and disk caching of pack files benefits from ample disk space.
+
+#### Network I/O recommendations
+
+- Use only instance types [from the list of ones that support ENA advanced networking]( https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instance-types.html#instance-type-summary-table) to ensure that cluster replication latency is not due to instance level network I/O bottlenecking.
+- Choose instances with sizes with more than 10 Gbps - but only if needed and only when having proven a node level network bottleneck with monitoring and/or stress testing.
+
+**To accommodate:**
+
+- Gitaly nodes do the main work of streaming repositories for push and pull operations (to add development endpoints, and to CI/CD).
+- Gitaly servers need reasonable low latency between cluster nodes and with Praefect services in order for the cluster to maintain operational and data integrity.
+- Gitaly nodes should be selected with network bottlenecking avoidance as a primary consideration.
+- Gitaly nodes should be monitored for network saturation.
+- Not all networking issues can be solved through optimizing the node level networking:
+ - Gitaly cluster node replication depends on all networking between nodes.
+ - Gitaly networking performance to pull and push endpoints depends on all networking in between.
+
+### AWS Gitaly backup
+
+Due to the nature of how Praefect tracks the replication metadata of Gitaly disk information, the best backup method is [the official backup and restore Rake tasks](../../raketasks/backup_restore.md).
+
+### AWS Gitaly recovery
+
+Gitaly Cluster does not support snapshot backups as these can cause issues where the Praefect database becomes out of syn with the disk storage. Due to the nature of how Praefect rebuilds the replication metadata of Gitaly disk information during a restore, the best recovery method is [the official backup and restore Rake tasks](../../raketasks/backup_restore.md).
### Gitaly HA in EKS quick start
diff --git a/doc/install/aws/index.md b/doc/install/aws/index.md
index 342b6962628..80193d882dd 100644
--- a/doc/install/aws/index.md
+++ b/doc/install/aws/index.md
@@ -87,7 +87,7 @@ Implementation patterns may also provide specialized implementations beyond the
For example:
-- Small, self-contained GitLab instances for per-person admin training, perhaps on Kubernetes so that a deployment cluster is self-contained as well.
+- Small, self-contained GitLab instances for per-person administration training, perhaps on Kubernetes so that a deployment cluster is self-contained as well.
- GitLab Runner implementation patterns, including using platform-specific PaaS.
## Intended audiences and contributors
diff --git a/doc/install/aws/manual_install_aws.md b/doc/install/aws/manual_install_aws.md
index a490cf0eb73..2ad54a17715 100644
--- a/doc/install/aws/manual_install_aws.md
+++ b/doc/install/aws/manual_install_aws.md
@@ -7,15 +7,29 @@ type: howto
{::options parse_block_html="true" /}
-# Installing GitLab on Amazon Web Services (AWS) (DEPRECATED) **(FREE SELF)**
+# Installing a GitLab POC on Amazon Web Services (AWS) **(FREE SELF)**
This page offers a walkthrough of a common configuration for GitLab on AWS using the official GitLab Linux package. You should customize it to accommodate your needs.
NOTE:
-For organizations with 1,000 users or less, the recommended AWS installation method is to launch an EC2 single box [Omnibus Installation](https://about.gitlab.com/install/) and implement a snapshot strategy for backing up the data. See the [1,000 user reference architecture](../../administration/reference_architectures/1k_users.md) for more.
+For organizations with 1,000 users or less, the recommended AWS installation method is to launch an EC2 single box [Omnibus Installation](https://about.gitlab.com/install/) and implement a snapshot strategy for backing up the data. See the [1,000 user reference architecture](../../administration/reference_architectures/1k_users.md) for more information.
+
+## Getting started for production-grade GitLab
NOTE:
-The [GitLab Environment Toolkit (GET)](https://gitlab.com/gitlab-org/quality/gitlab-environment-toolkit/-/tree/master) is GitLabs internal effort to create a multi-cloud, multi-GitLab toolkit to provision GitLab. It can be used to deploy Omnibus GitLab on AWS. GET is developed by GitLab developers and is open to community contributions.
+This document is an installation guide for a proof of concept instance. It is not a reference architecture and it does not result in a highly available configuration.
+
+Following this guide exactly results in a proof of concept instance that roughly equates to a **scaled down** version of a **two availability zone implementation** of the **Non-HA** [Omnibus 2000 User Reference Architecture](../../administration/reference_architectures/2k_users.md). The 2K reference architecture is not HA because it is primarily intended to provide some scaling while keeping costs and complexity low. The [3000 User Reference Architecture](../../administration/reference_architectures/3k_users.md) is the smallest size that is GitLab HA. It has additional service roles to achieve HA, most notably it uses Gitaly Cluster to achieve HA for Git repository storage and specifies triple redundancy.
+
+GitLab maintains and tests two main types of Reference Architectures. The **Omnibus architectures** are implemented on instance compute while **Cloud Native Hybrid architectures** maximize the use of a Kubernetes cluster. Cloud Native Hybrid reference architecture specifications are addendum sections to the Reference Architecture size pages that start by describing the Omnibus architecture. For example, the 3000 User Cloud Native Reference Architecture is in the subsection titled [Cloud Native Hybrid reference architecture with Helm Charts (alternative)](../../administration/reference_architectures/3k_users.md#cloud-native-hybrid-reference-architecture-with-helm-charts-alternative) in the 3000 User Reference Architecture page.
+
+### Getting started for production-grade Omnibus GitLab
+
+The Infrastructure as Code tooling [GitLab Environment Tool (GET)](https://gitlab.com/gitlab-org/quality/gitlab-environment-toolkit/-/tree/master) is the best place to start for building Omnibus GitLab on AWS and most especially if you are targeting an HA setup. While it does not automate everything, it does complete complex setups like Gitaly Cluster for you. GET is open source so anyone can build on top of it and contribute improvements to it.
+
+### Getting started for production-grade Cloud Native Hybrid GitLab
+
+For the Cloud Native Hybrid architectures there are two Infrastructure as Code options which are compared in GitLab Cloud Native Hybrid on AWS EKS implementation pattern in the section [Available Infrastructure as Code for GitLab Cloud Native Hybrid](gitlab_hybrid_on_aws.md#available-infrastructure-as-code-for-gitlab-cloud-native-hybrid). It compares the [GitLab Environment Toolkit](https://gitlab.com/gitlab-org/quality/gitlab-environment-toolkit/-/tree/master) to the AWS Quick Start for GitLab Cloud Native Hybrid on EKS which was codeveloped by GitLab and AWS. GET and the AWS Quick Start are both open source so anyone can build on top of them and contribute improvements to them.
## Introduction
@@ -517,7 +531,7 @@ gitlab=# \q
```ruby
# Disable the built-in Postgres
postgresql['enable'] = false
-
+
# Fill in the connection details
gitlab_rails['db_adapter'] = "postgresql"
gitlab_rails['db_encoding'] = "unicode"
@@ -533,7 +547,7 @@ gitlab=# \q
```ruby
# Disable the built-in Redis
redis['enable'] = false
-
+
# Fill in the connection details
gitlab_rails['redis_host'] = "<redis-endpoint>"
gitlab_rails['redis_port'] = 6379
@@ -734,7 +748,7 @@ Read more on configuring an
## Backup and restore
-GitLab provides [a tool to back up](../../raketasks/backup_restore.md#back-up-gitlab)
+GitLab provides [a tool to back up](../../raketasks/backup_restore.md)
and restore its Git data, database, attachments, LFS objects, and so on.
Some important things to know:
diff --git a/doc/install/azure/index.md b/doc/install/azure/index.md
index 50cbb9fb3b6..06518ff58de 100644
--- a/doc/install/azure/index.md
+++ b/doc/install/azure/index.md
@@ -229,7 +229,7 @@ You can now visit GitLab with your browser at the new external URL.
Use the domain name you set up earlier to visit your new GitLab instance
in your browser. In this example, it's `https://gitlab-prod.eastus.cloudapp.azure.com`.
-The first thing that appears is the sign-in page. GitLab creates an admin user by default.
+The first thing that appears is the sign-in page. GitLab creates an administrator user by default.
The credentials are:
- Username: `root`
diff --git a/doc/install/docker.md b/doc/install/docker.md
index b611f87938e..b3e7e758ec3 100644
--- a/doc/install/docker.md
+++ b/doc/install/docker.md
@@ -103,7 +103,7 @@ sudo docker run --detach \
```
This will ensure that the Docker process has enough permissions to create the
-config files in the mounted volumes.
+configuration files in the mounted volumes.
If you're using the [Kerberos integration](../integration/kerberos.md) **(PREMIUM ONLY)**,
you must also publish your Kerberos port (for example, `--publish 8443:8443`).
@@ -573,7 +573,7 @@ sudo docker restart gitlab
This error occurs when using Docker Toolbox with VirtualBox on Windows or Mac,
and making use of Docker volumes. The `/c/Users` volume is mounted as a
-VirtualBox Shared Folder, and does not support the all POSIX filesystem features.
+VirtualBox Shared Folder, and does not support the all POSIX file system features.
The directory ownership and permissions cannot be changed without remounting, and
GitLab fails.
diff --git a/doc/install/installation.md b/doc/install/installation.md
index b524177abc4..852ddea41bd 100644
--- a/doc/install/installation.md
+++ b/doc/install/installation.md
@@ -51,7 +51,7 @@ If the highest number stable branch is unclear, check the [GitLab blog](https://
| -------- | --------------- | ----- |
| [Ruby](#2-ruby) | `2.7` | From GitLab 13.6, Ruby 2.7 is required. Ruby 3.0 is not supported yet (see [the relevant epic](https://gitlab.com/groups/gitlab-org/-/epics/5149) for the current status). You must use the standard MRI implementation of Ruby. We love [JRuby](https://www.jruby.org/) and [Rubinius](https://github.com/rubinius/rubinius#the-rubinius-language-platform), but GitLab needs several Gems that have native extensions. |
| [Go](#3-go) | `1.15` | |
-| [Git](#git) | `2.31.x` | From GitLab 13.11, Git 2.31.x and later is required. It's highly recommended that you use the [Git version provided by Gitaly](#git). |
+| [Git](#git) | `2.33.x` | From GitLab 14.4, Git 2.33.x and later is required. It's highly recommended that you use the [Git version provided by Gitaly](#git). |
| [Node.js](#4-node) | `12.22.1` | GitLab uses [webpack](https://webpack.js.org/) to compile frontend assets. Node.js 14.x is recommended, as it's faster. You can check which version you're running with `node -v`. You need to update it to a newer version if needed. |
## GitLab directory structure
@@ -557,9 +557,10 @@ sudo -u git cp config/database.yml.postgresql config/database.yml
# Once modified, the `production` settings will be as follows:
#
# production:
-# adapter: postgresql
-# encoding: unicode
-# database: gitlabhq_production
+# main:
+# adapter: postgresql
+# encoding: unicode
+# database: gitlabhq_production
#
sudo -u git -H editor config/database.yml
diff --git a/doc/install/next_steps.md b/doc/install/next_steps.md
index e25241f0378..b5cfbfc9bbb 100644
--- a/doc/install/next_steps.md
+++ b/doc/install/next_steps.md
@@ -52,7 +52,7 @@ installation.
Activate all GitLab Enterprise Edition functionality with a license.
- [Pricing](https://about.gitlab.com/pricing/): Pricing for the different tiers.
-## Cross-repo Code Search
+## Cross-repository Code Search
- [Advanced Search](../integration/elasticsearch.md): Leverage Elasticsearch for
faster, more advanced code search across your entire GitLab instance.
diff --git a/doc/install/openshift_and_gitlab/img/add-gitlab-to-project.png b/doc/install/openshift_and_gitlab/img/add-gitlab-to-project.png
deleted file mode 100644
index 5b6059dd022..00000000000
--- a/doc/install/openshift_and_gitlab/img/add-gitlab-to-project.png
+++ /dev/null
Binary files differ
diff --git a/doc/install/openshift_and_gitlab/img/add-to-project.png b/doc/install/openshift_and_gitlab/img/add-to-project.png
deleted file mode 100644
index f9b00431d00..00000000000
--- a/doc/install/openshift_and_gitlab/img/add-to-project.png
+++ /dev/null
Binary files differ
diff --git a/doc/install/openshift_and_gitlab/img/create-project-ui.png b/doc/install/openshift_and_gitlab/img/create-project-ui.png
deleted file mode 100644
index 43b151264c5..00000000000
--- a/doc/install/openshift_and_gitlab/img/create-project-ui.png
+++ /dev/null
Binary files differ
diff --git a/doc/install/openshift_and_gitlab/img/gitlab-logs.png b/doc/install/openshift_and_gitlab/img/gitlab-logs.png
deleted file mode 100644
index 8b90b2f74ac..00000000000
--- a/doc/install/openshift_and_gitlab/img/gitlab-logs.png
+++ /dev/null
Binary files differ
diff --git a/doc/install/openshift_and_gitlab/img/gitlab-overview.png b/doc/install/openshift_and_gitlab/img/gitlab-overview.png
deleted file mode 100644
index 3a7bec7c2bc..00000000000
--- a/doc/install/openshift_and_gitlab/img/gitlab-overview.png
+++ /dev/null
Binary files differ
diff --git a/doc/install/openshift_and_gitlab/img/gitlab-running.png b/doc/install/openshift_and_gitlab/img/gitlab-running.png
deleted file mode 100644
index 0fcd9f00d08..00000000000
--- a/doc/install/openshift_and_gitlab/img/gitlab-running.png
+++ /dev/null
Binary files differ
diff --git a/doc/install/openshift_and_gitlab/img/gitlab-scale.png b/doc/install/openshift_and_gitlab/img/gitlab-scale.png
deleted file mode 100644
index ebae8b588b1..00000000000
--- a/doc/install/openshift_and_gitlab/img/gitlab-scale.png
+++ /dev/null
Binary files differ
diff --git a/doc/install/openshift_and_gitlab/img/gitlab-settings.png b/doc/install/openshift_and_gitlab/img/gitlab-settings.png
deleted file mode 100644
index 0dd1e1f5b8e..00000000000
--- a/doc/install/openshift_and_gitlab/img/gitlab-settings.png
+++ /dev/null
Binary files differ
diff --git a/doc/install/openshift_and_gitlab/img/no-resources.png b/doc/install/openshift_and_gitlab/img/no-resources.png
deleted file mode 100644
index 1ef0a0b31e5..00000000000
--- a/doc/install/openshift_and_gitlab/img/no-resources.png
+++ /dev/null
Binary files differ
diff --git a/doc/install/openshift_and_gitlab/img/openshift-infra-project.png b/doc/install/openshift_and_gitlab/img/openshift-infra-project.png
deleted file mode 100644
index e31dda1461c..00000000000
--- a/doc/install/openshift_and_gitlab/img/openshift-infra-project.png
+++ /dev/null
Binary files differ
diff --git a/doc/install/openshift_and_gitlab/img/rc-name.png b/doc/install/openshift_and_gitlab/img/rc-name.png
deleted file mode 100644
index 16d967b8460..00000000000
--- a/doc/install/openshift_and_gitlab/img/rc-name.png
+++ /dev/null
Binary files differ
diff --git a/doc/install/openshift_and_gitlab/img/running-pods.png b/doc/install/openshift_and_gitlab/img/running-pods.png
deleted file mode 100644
index e08487c881c..00000000000
--- a/doc/install/openshift_and_gitlab/img/running-pods.png
+++ /dev/null
Binary files differ
diff --git a/doc/install/openshift_and_gitlab/img/web-console.png b/doc/install/openshift_and_gitlab/img/web-console.png
deleted file mode 100644
index 012d7703c73..00000000000
--- a/doc/install/openshift_and_gitlab/img/web-console.png
+++ /dev/null
Binary files differ
diff --git a/doc/install/openshift_and_gitlab/index.md b/doc/install/openshift_and_gitlab/index.md
index b13293eccfc..3b7ea5c1975 100644
--- a/doc/install/openshift_and_gitlab/index.md
+++ b/doc/install/openshift_and_gitlab/index.md
@@ -1,506 +1,9 @@
---
-stage: Enablement
-group: Distribution
-info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
-type: howto
+redirect_to: 'https://docs.gitlab.com/charts/installation/operator.html'
+remove_date: '2022-09-22'
---
-# How to install GitLab on OpenShift Origin 3 **(FREE SELF)**
+This file was moved to [another location](https://docs.gitlab.com/charts/installation/operator.html).
-WARNING:
-This article is deprecated. Use the official Kubernetes Helm charts for
-installing GitLab to OpenShift. Check out the
-[official installation docs](https://docs.gitlab.com/charts/installation/cloud/openshift.html)
-for details.
-
-## Introduction
-
-[OpenShift Origin](https://www.okd.io/) (**Note:** renamed to OKD in August 2018) is an open source container application
-platform created by [RedHat](https://www.redhat.com/en), based on [Kubernetes](https://kubernetes.io/) and [Docker](https://www.docker.com). That means
-you can host your own PaaS for free and almost with no hassle.
-
-In this tutorial, we will see how to deploy GitLab in OpenShift using the GitLab
-official Docker image while getting familiar with the web interface and CLI
-tools that help us achieve our goal.
-
-## Prerequisites
-
-WARNING:
-This information is no longer up to date, as the current versions
-have changed and products have been renamed.
-
-OpenShift 3 is not yet deployed on RedHat's offered [Online platform](https://www.openshift.com/),
-so in order to test it, we use an [all-in-one VirtualBox image](https://www.okd.io/minishift/) that is
-offered by the OpenShift developers and managed by Vagrant. If you haven't done
-already, go ahead and install the following components as they are essential to
-test OpenShift easily:
-
-- [VirtualBox](https://www.virtualbox.org/wiki/Downloads)
-- [Vagrant](https://www.vagrantup.com/downloads)
-- [OpenShift Client](https://docs.okd.io/3.11/cli_reference/get_started_cli.html) (`oc` for short)
-
-It is also important to mention that for the purposes of this tutorial, the
-latest Origin release is used:
-
-- **`oc`** `v1.3.0` (must be [installed](https://github.com/openshift/origin/releases/tag/v1.3.0) locally on your computer)
-- **OpenShift** `v1.3.0` (is pre-installed in the [VM image](https://app.vagrantup.com/openshift/boxes/origin-all-in-one))
-- **Kubernetes** `v1.3.0` (is pre-installed in the [VM image](https://app.vagrantup.com/openshift/boxes/origin-all-in-one))
-
-NOTE:
-If you intend to deploy GitLab on a production OpenShift cluster, there are some
-limitations to bare in mind. Read on the [limitations](#current-limitations)
-section for more information and follow the linked links for the relevant
-discussions.
-
-Now that you have all batteries, let's see how easy it is to test OpenShift
-on your computer.
-
-## Getting familiar with OpenShift Origin
-
-The environment we are about to use is based on CentOS 7, which comes with all
-the tools needed pre-installed, including Docker, Kubernetes, and OpenShift.
-
-### Test OpenShift using Vagrant
-
-As of this writing, the all-in-one VM is at version 1.3, and that's
-what we use in this tutorial.
-
-In short:
-
-1. Open a terminal and in a new directory run:
-
- ```shell
- vagrant init openshift/origin-all-in-one
- ```
-
-1. This generates a Vagrantfile based on the all-in-one VM image
-1. In the same directory where you generated the Vagrantfile
- enter:
-
- ```shell
- vagrant up
- ```
-
-This downloads the VirtualBox image and fire up the VM with some preconfigured
-values as you can see in the Vagrantfile. As you may have noticed, you need
-plenty of RAM (5GB in our example), so make sure you have enough.
-
-Now that OpenShift is set up, let's see how the web console looks like.
-
-### Explore the OpenShift web console
-
-Once Vagrant finishes its thing with the VM, you are presented with a
-message which has some important information. One of them is the IP address
-of the deployed OpenShift platform and in particular `https://10.2.2.2:8443/console/`.
-Open this link with your browser and accept the self-signed certificate in
-order to proceed.
-
-Let's login as admin with username/password `admin/admin`. This is what the
-landing page looks like:
-
-![OpenShift web console](img/web-console.png)
-
-You can see that a number of [projects](https://docs.okd.io/3.11/dev_guide/projects.html) are already created for testing purposes.
-
-If you head over the `openshift-infra` project, a number of services with their
-respective pods are there to explore.
-
-![OpenShift web console](img/openshift-infra-project.png)
-
-We are not exploring the whole interface, but if you want to learn about
-the key concepts of OpenShift, read the [core concepts reference](https://docs.okd.io/3.11/architecture/core_concepts/index.html)
-in the official documentation.
-
-### Explore the OpenShift CLI
-
-OpenShift Client (`oc`), is a powerful CLI tool that talks to the OpenShift API
-and performs pretty much everything you can do from the web UI and much more.
-
-Assuming you have [installed](https://docs.okd.io/3.11/cli_reference/get_started_cli.html) it, let's explore some of its main
-functionalities.
-
-Let's first see the version of `oc`:
-
-```shell
-$ oc version
-
-oc v1.3.0
-kubernetes v1.3.0+52492b4
-```
-
-With `oc help` you can see the top level arguments you can run with `oc` and
-interact with your cluster, Kubernetes, run applications, create projects and
-much more.
-
-Let's login to the all-in-one VM and see how to achieve the same results like
-when we visited the web console earlier. The username/password for the
-administrator user is `admin/admin`. There is also a test user with username/
-password `user/user`, with limited access. Let's login as admin for the moment:
-
-```shell
-$ oc login https://10.2.2.2:8443
-
-Authentication required for https://10.2.2.2:8443 (openshift)
-Username: admin
-Password:
-Login successful.
-
-You have access to the following projects and can switch between them with 'oc project <projectname>':
-
-- cockpit
-- default (current)
-- delete
-- openshift
-- openshift-infra
-- sample
-
-Using project "default".
-```
-
-Switch to the `openshift-infra` project with:
-
-```shell
-oc project openshift-infra
-```
-
-And finally, see its status:
-
-```shell
-oc status
-```
-
-The last command should spit a bunch of information about the statuses of the
-pods and the services, which if you look closely is what we encountered in the
-second image when we explored the web console.
-
-You can always read more about `oc` in the [OpenShift CLI documentation](https://docs.okd.io/3.11/cli_reference/get_started_cli.html).
-
-### Troubleshooting the all-in-one VM
-
-Using the all-in-one VM gives you the ability to test OpenShift whenever you
-want. That means you get to play with it, shutdown the VM, and pick up where
-you left off.
-
-Occasionally, you may encounter issues, like OpenShift not running when booting
-up the VM. The web UI may not respond, or you may see issues when trying to sign
-in with `oc`, like:
-
-```plaintext
-The connection to the server 10.2.2.2:8443 was refused - did you specify the right host or port?
-```
-
-In that case, the OpenShift service might not be running, so in order to fix it:
-
-1. SSH into the VM by selecting the directory where the Vagrantfile is and then
- run:
-
- ```shell
- vagrant ssh
- ```
-
-1. Run `systemctl` and verify by the output that the `openshift` service is not
- running (it is in red color). If that's the case start the service with:
-
- ```shell
- sudo systemctl start openshift
- ```
-
-1. Verify the service is up with:
-
- ```shell
- systemctl status openshift -l
- ```
-
-You can now sign in by using `oc` (like we did before) and visit the web console.
-
-## Deploy GitLab
-
-Now that you got a taste of what OpenShift looks like, let's deploy GitLab!
-
-### Create a new project
-
-First, create a new project to host our application. You can do this
-either by running the CLI client:
-
-```shell
-oc new-project gitlab
-```
-
-or by using the web interface:
-
-![Create a new project from the UI](img/create-project-ui.png)
-
-If you used the command line, `oc` automatically uses the new project and you
-can see its status with:
-
-```shell
-$ oc status
-
-In project gitlab on server https://10.2.2.2:8443
-
-You have no services, deployment configs, or build configs.
-Run 'oc new-app' to create an application.
-```
-
-If you visit the web console, you can now see `gitlab` listed in the projects list.
-
-The next step is to import the OpenShift template for GitLab.
-
-### Import the template
-
-The [template](https://docs.okd.io/3.11/architecture/core_concepts/templates.html) is basically a JSON file which describes a set of
-related object definitions to be created together, as well as a set of
-parameters for those objects.
-
-The template for GitLab resides in the Omnibus GitLab repository under the
-Docker directory. Let's download it locally with `wget`:
-
-```shell
-wget https://gitlab.com/gitlab-org/omnibus-gitlab/raw/master/docker/openshift-template.json
-```
-
-And then let's import it in OpenShift:
-
-```shell
-oc create -f openshift-template.json -n openshift
-```
-
-NOTE:
-The `-n openshift` namespace flag is a trick to make the template available to all
-projects. If you recall from when we created the `gitlab` project, `oc` switched
-to it automatically, and that can be verified by the `oc status` command. If
-you omit the namespace flag, the application will be available only to the
-current project, in our case `gitlab`. The `openshift` namespace is a global
-one that the administrators should use if they want the application to be
-available to all users.
-
-We are now ready to finally deploy GitLab!
-
-### Create a new application
-
-The next step is to use the template we previously imported. Head over to the
-`gitlab` project and hit the **Add to Project** button.
-
-![Add to project](img/add-to-project.png)
-
-This will bring you to the catalog where you can find all the pre-defined
-applications ready to deploy with the click of a button. Search for `gitlab`
-and you will see the previously imported template:
-
-![Add GitLab to project](img/add-gitlab-to-project.png)
-
-Select it, and in the following screen you will be presented with the predefined
-values used with the GitLab template:
-
-![GitLab settings](img/gitlab-settings.png)
-
-Notice at the top that there are three resources to be created with this
-template:
-
-- `gitlab-ce`
-- `gitlab-ce-redis`
-- `gitlab-ce-postgresql`
-
-While PostgreSQL and Redis are bundled in Omnibus GitLab, the template is using
-separate images as you can see from [this line](https://gitlab.com/gitlab-org/omnibus-gitlab/blob/658c065c8d022ce858dd63eaeeadb0b2ddc8deea/docker/openshift-template.json#L239) in the template.
-
-The predefined values have been calculated for the purposes of testing out
-GitLab in the all-in-one VM. You don't need to change anything here, hit
-**Create** to start the deployment.
-
-If you are deploying to production you will want to change the **GitLab instance
-hostname** and use greater values for the volume sizes. If you don't provide a
-password for PostgreSQL, it will be created automatically.
-
-NOTE:
-The `gitlab.apps.10.2.2.2.nip.io` hostname that is used by default will
-resolve to the host with IP `10.2.2.2` which is the IP our VM uses. It is a
-trick to have distinct FQDNs pointing to services that are on our local network.
-Read more on how this works at [nip.io](https://nip.io).
-
-Now that we configured this, let's see how to manage and scale GitLab.
-
-## Manage and scale GitLab
-
-Setting up GitLab for the first time might take a while depending on your
-internet connection and the resources you have attached to the all-in-one VM.
-The GitLab Docker image is quite big (approximately 500 MB), so you'll have to
-wait until it's downloaded and configured before you use it.
-
-### Watch while GitLab gets deployed
-
-Navigate to the `gitlab` project at **Overview**. You can notice that the
-deployment is in progress by the orange color. The Docker images are being
-downloaded and soon they will be up and running.
-
-![GitLab overview](img/gitlab-overview.png)
-
-Switch to the **Browse > Pods** and you will eventually see all 3 pods in a
-running status. Remember the 3 resources that were to be created when we first
-created the GitLab app? This is where you can see them in action.
-
-![Running pods](img/running-pods.png)
-
-You can see GitLab being reconfigured by taking look at the logs in real time.
-Click on `gitlab-ce-2-j7ioe` (your ID will be different) and go to the **Logs**
-tab.
-
-![GitLab logs](img/gitlab-logs.png)
-
-At a point you should see a `gitlab Reconfigured!` message in the logs.
-Navigate back to the **Overview** and hopefully all pods will be up and running.
-
-![GitLab running](img/gitlab-running.png)
-
-Congratulations! You can now navigate to your new shinny GitLab instance by
-visiting `http://gitlab.apps.10.2.2.2.nip.io` where you will be asked to
-change the root user password. Login using `root` as username and providing the
-password you just set, and start using GitLab!
-
-### Scale GitLab with the push of a button
-
-If you reach to a point where your GitLab instance could benefit from a boost
-of resources, you'd be happy to know that you can scale up with the push of a
-button.
-
-In the **Overview** page just click the up arrow button in the pod where
-GitLab is. The change is instant and you can see the number of [replicas](https://docs.okd.io/3.11/architecture/core_concepts/deployments.html#replication-controllers) now
-running scaled to 2.
-
-![GitLab scale](img/gitlab-scale.png)
-
-Upping the GitLab pods is actually like adding new application servers to your
-cluster. You can see how that would work if you didn't use GitLab with
-OpenShift by following the [HA documentation](../../administration/reference_architectures/index.md) for the application servers.
-
-Bare in mind that you may need more resources (CPU, RAM, disk space) when you
-scale up. If a pod is in pending state for too long, you can navigate to
-**Browse > Events** and see the reason and message of the state.
-
-![No resources](img/no-resources.png)
-
-### Scale GitLab using the `oc` CLI
-
-Using `oc` is super easy to scale up the replicas of a pod. You may want to
-skim through the [basic CLI operations](https://docs.okd.io/3.11/cli_reference/basic_cli_operations.html) to get a taste how the CLI
-commands are used. Pay extra attention to the object types as we will use some
-of them and their abbreviated versions below.
-
-In order to scale up, we need to find out the name of the replication controller.
-Let's see how to do that using the following steps.
-
-1. Make sure you are in the `gitlab` project:
-
- ```shell
- oc project gitlab
- ```
-
-1. See what services are used for this project:
-
- ```shell
- oc get svc
- ```
-
- The output will be similar to:
-
- ```plaintext
- NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
- gitlab-ce 172.30.243.177 <none> 22/TCP,80/TCP 5d
- gitlab-ce-postgresql 172.30.116.75 <none> 5432/TCP 5d
- gitlab-ce-redis 172.30.105.88 <none> 6379/TCP 5d
- ```
-
-1. We need to see the replication controllers of the `gitlab-ce` service.
- Get a detailed view of the current ones:
-
- ```shell
- oc describe rc gitlab-ce
- ```
-
- This will return a large detailed list of the current replication controllers.
- Search for the name of the GitLab controller, usually `gitlab-ce-1` or if
- that failed at some point and you spawned another one, it will be named
- `gitlab-ce-2`.
-
-1. Scale GitLab using the previous information:
-
- ```shell
- oc scale --replicas=2 replicationcontrollers gitlab-ce-2
- ```
-
-1. Get the new replicas number to make sure scaling worked:
-
- ```shell
- oc get rc gitlab-ce-2
- ```
-
- which will return something like:
-
- ```plaintext
- NAME DESIRED CURRENT AGE
- gitlab-ce-2 2 2 5d
- ```
-
-And that's it! We successfully scaled the replicas to 2 using the CLI.
-
-As always, you can find the name of the controller using the web console. Just
-click on the service you are interested in and you will see the details in the
-right sidebar.
-
-![Replication controller name](img/rc-name.png)
-
-### Autoscaling GitLab
-
-In case you were wondering whether there is an option to autoscale a pod based
-on the resources of your server, the answer is yes, of course there is.
-
-We will not expand on this matter, but feel free to read the documentation on
-OpenShift's website about [autoscaling](https://docs.okd.io/3.11/dev_guide/pod_autoscaling.html).
-
-## Current limitations
-
-As stated in the [all-in-one VM](https://www.okd.io/minishift/) page:
-
-> By default, OpenShift will not allow a container to run as root or even a
-non-random container assigned user ID. Most Docker images in Docker Hub do not
-follow this best practice and instead run as root.
-
-The all-in-one VM we are using has this security turned off so it will not
-bother us. In any case, it is something to keep in mind when deploying GitLab
-on a production cluster.
-
-In order to deploy GitLab on a production cluster, you will need to assign the
-GitLab service account to the `anyuid` [Security Context Constraints](https://docs.okd.io/3.11/admin_guide/manage_scc.html).
-
-For OpenShift v3.0, you will need to do this manually:
-
-1. Edit the Security Context:
-
- ```shell
- oc edit scc anyuid
- ```
-
-1. Add `system:serviceaccount:<project>:gitlab-ce-user` to the `users` section.
- If you changed the Application Name from the default the user will
- will be `<app-name>-user` instead of `gitlab-ce-user`
-
-1. Save and exit the editor
-
-For OpenShift v3.1 and above, you can do:
-
-```shell
-oc adm policy add-scc-to-user anyuid system:serviceaccount:gitlab:gitlab-ce-user
-```
-
-## Conclusion
-
-You should now have an understanding of the basic OpenShift Origin concepts, and
-a sense of how things work using the web console or the CLI.
-
-Upload a template, create a project, add an application, and you're done. You're
-ready to sign in to your new GitLab instance.
-
-Remember that this tutorial doesn't address all that Origin is capable of. As
-always, refer to the detailed [documentation](https://docs.okd.io) to learn more
-about deploying your own OpenShift PaaS and managing your applications with
-containers.
+<!-- This redirect file can be deleted after <2022-09-22>. -->
+<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/#move-or-rename-a-page -->
diff --git a/doc/install/requirements.md b/doc/install/requirements.md
index 641b092e1e3..c136fb21a90 100644
--- a/doc/install/requirements.md
+++ b/doc/install/requirements.md
@@ -114,7 +114,7 @@ MySQL/MariaDB are advised to [migrate to PostgreSQL](../update/mysql_to_postgres
The server running PostgreSQL should have _at least_ 5-10 GB of storage
available, though the exact requirements [depend on the number of users](../administration/reference_architectures/index.md).
-We highly recommend using the minimum PostgreSQL versions (as specified in
+We highly recommend using at least the minimum PostgreSQL versions (as specified in
the following table) as these were used for development and testing:
| GitLab version | Minimum PostgreSQL version |
@@ -169,7 +169,7 @@ of GitLab Support or other GitLab engineers.
operations to manage partitioned tables.
- You should not modify the GitLab schema (for example, adding triggers or modifying tables).
- Database migrations are tested against the schema definition in the GitLab code base. GitLab
+ Database migrations are tested against the schema definition in the GitLab codebase. GitLab
version upgrades may fail if the schema is modified.
## Puma settings
diff --git a/doc/integration/akismet.md b/doc/integration/akismet.md
index efc293569fe..d216b827676 100644
--- a/doc/integration/akismet.md
+++ b/doc/integration/akismet.md
@@ -16,8 +16,7 @@ Admin page.
Privacy note: GitLab submits the user's IP and user agent to Akismet.
NOTE:
-In GitLab 8.11 and later, all issues are submitted to Akismet.
-In earlier GitLab versions, this only applied to API and non-project members.
+GitLab submits all issues to Akismet.
Akismet configuration is available to users on self-managed GitLab. Akismet is already enabled on
GitLab SaaS (GitLab.com), where it's configuration and management are handled by GitLab Inc.
diff --git a/doc/integration/azure.md b/doc/integration/azure.md
index 47d80ab9a66..3eb0344edda 100644
--- a/doc/integration/azure.md
+++ b/doc/integration/azure.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/engineering/ux/technical-writing/#assignments
---
-# Microsoft Azure OAuth 2.0 OmniAuth Provider **(FREE)**
+# Microsoft Azure OAuth 2.0 OmniAuth Provider **(FREE SELF)**
NOTE:
Per Microsoft, this provider uses the [older Azure Active Directory v1.0 endpoint](https://docs.microsoft.com/en-us/azure/active-directory/azuread-dev/v1-protocols-oauth-code).
diff --git a/doc/integration/bitbucket.md b/doc/integration/bitbucket.md
index 7a3f4a7710d..fa3b62ba7af 100644
--- a/doc/integration/bitbucket.md
+++ b/doc/integration/bitbucket.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/engineering/ux/technical-writing/#assignments
---
-# Integrate your GitLab server with Bitbucket Cloud **(FREE)**
+# Integrate your GitLab server with Bitbucket Cloud **(FREE SELF)**
NOTE:
Starting from GitLab 11.4, OmniAuth is enabled by default. If you're using an
diff --git a/doc/integration/cas.md b/doc/integration/cas.md
index 60ce728fa55..471b1e4e262 100644
--- a/doc/integration/cas.md
+++ b/doc/integration/cas.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/engineering/ux/technical-writing/#assignments
---
-# CAS OmniAuth Provider **(FREE)**
+# CAS OmniAuth Provider **(FREE SELF)**
To enable the CAS OmniAuth provider you must register your application with your
CAS instance. This requires the service URL GitLab supplies to CAS. It should be
diff --git a/doc/integration/elasticsearch.md b/doc/integration/elasticsearch.md
index 9514c298885..b5b09fcd813 100644
--- a/doc/integration/elasticsearch.md
+++ b/doc/integration/elasticsearch.md
@@ -91,7 +91,7 @@ The former Ruby-based indexer was removed in [GitLab 12.3](https://gitlab.com/gi
First, we need to install some dependencies, then we build and install
the indexer itself.
-This project relies on [International Components for Unicode](http://site.icu-project.org/) (ICU) for text encoding,
+This project relies on [International Components for Unicode](https://icu.unicode.org/) (ICU) for text encoding,
therefore we must ensure the development packages for your platform are
installed before running `make`.
@@ -155,7 +155,7 @@ may need to set the `production -> elasticsearch -> indexer_path` setting in you
For GitLab instances with more than 50GB repository data you can follow the instructions for [Indexing large
instances](#indexing-large-instances) below.
-To enable Advanced Search, you must have admin access to GitLab:
+To enable Advanced Search, you must have administrator access to GitLab:
1. On the top bar, select **Menu > Admin**.
1. On the left sidebar, select **Settings > Advanced Search**.
@@ -461,6 +461,8 @@ The following are some available Rake tasks:
| Task | Description |
|:--------------------------------------------------------------------------------------------------------------------------------------------------------|:------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| [`sudo gitlab-rake gitlab:elastic:index`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/lib/tasks/gitlab/elastic.rake) | Enables Elasticsearch indexing and run `gitlab:elastic:create_empty_index`, `gitlab:elastic:clear_index_status`, `gitlab:elastic:index_projects`, and `gitlab:elastic:index_snippets`. |
+| [`sudo gitlab-rake gitlab:elastic:pause_indexing`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/lib/tasks/gitlab/elastic.rake) | Pauses Elasticsearch indexing. Changes are still tracked. Useful for cluster/index migrations. |
+| [`sudo gitlab-rake gitlab:elastic:resume_indexing`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/lib/tasks/gitlab/elastic.rake) | Resumes Elasticsearch indexing. |
| [`sudo gitlab-rake gitlab:elastic:index_projects`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/lib/tasks/gitlab/elastic.rake) | Iterates over all projects and queues Sidekiq jobs to index them in the background. |
| [`sudo gitlab-rake gitlab:elastic:index_projects_status`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/lib/tasks/gitlab/elastic.rake) | Determines the overall status of the indexing. It is done by counting the total number of indexed projects, dividing by a count of the total number of projects, then multiplying by 100. |
| [`sudo gitlab-rake gitlab:elastic:clear_index_status`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/lib/tasks/gitlab/elastic.rake) | Deletes all instances of IndexStatus for all projects. Note that this command will result in a complete wipe of the index, and it should be used with caution. |
@@ -842,7 +844,7 @@ You can run `sudo gitlab-rake gitlab:elastic:projects_not_indexed` to display pr
### No new data is added to the Elasticsearch index when I push code
NOTE:
-This was [fixed in GitLab 13.2](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/35936) and the Rake task is not available for versions greater than that.
+This was [fixed](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/35936) in GitLab 13.2 and the Rake task is not available for versions greater than that.
When performing the initial indexing of blobs, we lock all projects until the project finishes indexing. It could happen that an error during the process causes one or multiple projects to remain locked. In order to unlock them, run:
diff --git a/doc/integration/github.md b/doc/integration/github.md
index 0a96d67ac0c..16241c9293b 100644
--- a/doc/integration/github.md
+++ b/doc/integration/github.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/engineering/ux/technical-writing/#assignments
---
-# Integrate your GitLab instance with GitHub **(FREE)**
+# Integrate your GitLab instance with GitHub **(FREE SELF)**
You can integrate your GitLab instance with GitHub.com and GitHub Enterprise. This integration
enables users to import projects from GitHub, or sign in to your GitLab instance
diff --git a/doc/integration/gitlab.md b/doc/integration/gitlab.md
index 1f35faacc2e..5e28765bb86 100644
--- a/doc/integration/gitlab.md
+++ b/doc/integration/gitlab.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/engineering/ux/technical-writing/#assignments
---
-# Integrate your server with GitLab.com **(FREE)**
+# Integrate your server with GitLab.com **(FREE SELF)**
Import projects from GitLab.com and login to your GitLab instance with your GitLab.com account.
@@ -48,7 +48,7 @@ GitLab.com generates an application ID and secret key for you to use.
1. See [Initial OmniAuth Configuration](omniauth.md#initial-omniauth-configuration) for initial settings.
1. Add the provider configuration:
- For Omnibus installations:
+ For Omnibus installations authenticating against **GitLab.com**:
```ruby
gitlab_rails['omniauth_providers'] = [
@@ -61,7 +61,20 @@ GitLab.com generates an application ID and secret key for you to use.
]
```
- For installations from source:
+ Or, for Omnibus installations authenticating against a different GitLab instance:
+
+ ```ruby
+ gitlab_rails['omniauth_providers'] = [
+ {
+ "name" => "gitlab",
+ "app_id" => "YOUR_APP_ID",
+ "app_secret" => "YOUR_APP_SECRET",
+ "args" => { "scope" => "api", "client_options" => { "site" => "https://gitlab.example.com/api/v4" } }
+ }
+ ]
+ ```
+
+ For installations from source authenticating against **GitLab.com**:
```yaml
- { name: 'gitlab',
@@ -70,6 +83,15 @@ GitLab.com generates an application ID and secret key for you to use.
args: { scope: 'api' } }
```
+ Or, for installations from source to authenticate against a different GitLab instance:
+
+ ```yaml
+ - { name: 'gitlab',
+ app_id: 'YOUR_APP_ID',
+ app_secret: 'YOUR_APP_SECRET',
+ args: { scope: 'api', "client_options": { "site": 'https://gitlab.example.com/api/v4' } }
+ ```
+
1. Change `'YOUR_APP_ID'` to the Application ID from the GitLab.com application page.
1. Change `'YOUR_APP_SECRET'` to the secret from the GitLab.com application page.
1. Save the configuration file.
diff --git a/doc/integration/gitpod.md b/doc/integration/gitpod.md
index bafba2cdf02..26520df18fa 100644
--- a/doc/integration/gitpod.md
+++ b/doc/integration/gitpod.md
@@ -28,7 +28,7 @@ To use the GitLab Gitpod integration, it must be enabled for your GitLab instanc
1. It's [enabled and configured by a GitLab administrator](#configure-a-self-managed-instance).
1. It's [enabled in their user settings](#enable-gitpod-in-your-user-settings).
-To learn more about Gitpod, see their [features](https://www.gitpod.io/features/) and
+To learn more about Gitpod, see their [features](https://www.gitpod.io/features) and
[documentation](https://www.gitpod.io/docs/).
## Enable Gitpod in your user settings
diff --git a/doc/integration/google.md b/doc/integration/google.md
index 4a2c61577ac..172015f7528 100644
--- a/doc/integration/google.md
+++ b/doc/integration/google.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/engineering/ux/technical-writing/#assignments
---
-# Google OAuth 2.0 OmniAuth Provider **(FREE)**
+# Google OAuth 2.0 OmniAuth Provider **(FREE SELF)**
To enable the Google OAuth 2.0 OmniAuth provider you must register your application
with Google. Google generates a client ID and secret key for you to use.
@@ -41,7 +41,7 @@ In Google's side:
1. You should now be able to see a Client ID and Client secret. Note them down
or keep this page open as you need them later.
-1. To enable projects to access [Google Kubernetes Engine](../user/project/clusters/index.md), you must also
+1. To enable projects to access [Google Kubernetes Engine](../user/infrastructure/clusters/index.md), you must also
enable these APIs:
- Google Kubernetes Engine API
- Cloud Resource Manager API
diff --git a/doc/integration/index.md b/doc/integration/index.md
index 00b65263d32..0b2bf6fde94 100644
--- a/doc/integration/index.md
+++ b/doc/integration/index.md
@@ -89,7 +89,7 @@ at Super User also has relevant information.
**Omnibus Trusted Chain**
-[Install the self signed certificate or custom certificate authorities](https://docs.gitlab.com/omnibus/common_installation_problems/README.html#using-self-signed-certificate-or-custom-certificate-authorities)
+[Install the self signed certificate or custom certificate authorities](https://docs.gitlab.com/omnibus/common_installation_problems/index.html#using-self-signed-certificate-or-custom-certificate-authorities)
in to Omnibus GitLab.
It is enough to concatenate the certificate to the main trusted certificate
diff --git a/doc/integration/jenkins.md b/doc/integration/jenkins.md
index 18ae71a7059..2bbda74533f 100644
--- a/doc/integration/jenkins.md
+++ b/doc/integration/jenkins.md
@@ -64,8 +64,8 @@ Grant a GitLab user access to the select GitLab projects.
1. Grant the user permission to the GitLab projects.
- If you're integrating Jenkins with many GitLab projects, consider granting the user global
- Administrator permission. Otherwise, add the user to each project, and grant the Developer role.
+ If you're integrating Jenkins with many GitLab projects, consider granting the user the global
+ Administrator role. Otherwise, add the user to each project, and grant the Developer role.
## Configure GitLab API access
diff --git a/doc/integration/jenkins_deprecated.md b/doc/integration/jenkins_deprecated.md
index e349bb4e88f..8da3118cf2c 100644
--- a/doc/integration/jenkins_deprecated.md
+++ b/doc/integration/jenkins_deprecated.md
@@ -14,7 +14,7 @@ was deprecated in favor of the
Please use documentation for the new [Jenkins CI service](jenkins.md).
NOTE:
-This service was [removed in v13.0](https://gitlab.com/gitlab-org/gitlab/-/issues/1600)
+This service was [removed](https://gitlab.com/gitlab-org/gitlab/-/issues/1600) in GitLab 13.0
Integration includes:
diff --git a/doc/integration/jira/configure.md b/doc/integration/jira/configure.md
index d4e5a1bfca1..979d8a52fb8 100644
--- a/doc/integration/jira/configure.md
+++ b/doc/integration/jira/configure.md
@@ -41,7 +41,7 @@ To configure your project:
For **Jira Server**, use `username`. For **Jira on Atlassian cloud**, use `email`.
- **Password/API token**:
Use `password` for **Jira Server** or `API token` for **Jira on Atlassian cloud**.
-1. To enable users to view Jira issues inside the GitLab project **(PREMIUM)**, select **Enable Jira issues** and
+1. To enable users to [view Jira issues](issues.md#view-jira-issues) inside the GitLab project, select **Enable Jira issues** and
enter a Jira project key.
You can display issues only from a single Jira project in a given GitLab project.
@@ -50,7 +50,7 @@ To configure your project:
If you enable Jira issues with this setting, all users with access to this GitLab project
can view all issues from the specified Jira project.
-1. To enable issue creation for vulnerabilities **(ULTIMATE)**, select **Enable Jira issues creation from vulnerabilities**.
+1. To enable [issue creation for vulnerabilities](../../user/application_security/vulnerabilities/index.md#create-a-jira-issue-for-a-vulnerability), select **Enable Jira issues creation from vulnerabilities**.
1. Select the **Jira issue type**. If the dropdown is empty, select refresh (**{retry}**) and try again.
1. To verify the Jira connection is working, select **Test settings**.
1. Select **Save changes**.
diff --git a/doc/integration/jira/connect-app.md b/doc/integration/jira/connect-app.md
index 7d32c080fff..d274710b3cd 100644
--- a/doc/integration/jira/connect-app.md
+++ b/doc/integration/jira/connect-app.md
@@ -81,7 +81,7 @@ self-managed GitLab instances with Jira Cloud, you can either:
- [Install the application manually](#install-the-application-manually).
- [Create a Marketplace listing](#create-a-marketplace-listing).
-### Install the application manually **(FREE SELF)**
+### Install the application manually
You can configure your Atlassian Cloud instance to allow you to install applications
from outside the Marketplace, which allows you to install the application:
@@ -114,7 +114,7 @@ NOTE:
If a GitLab update makes changes to the application descriptor, you must uninstall, then reinstall, the
application.
-### Create a Marketplace listing **(FREE SELF)**
+### Create a Marketplace listing
If you prefer to not use development mode on your Jira instance, you can create
your own Marketplace listing for your instance. This enables your application
diff --git a/doc/integration/jira/development_panel.md b/doc/integration/jira/development_panel.md
index 5a2ce8a0a75..6fa084ee872 100644
--- a/doc/integration/jira/development_panel.md
+++ b/doc/integration/jira/development_panel.md
@@ -6,7 +6,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# GitLab Jira Development panel integration **(FREE)**
-> - [Moved](https://gitlab.com/gitlab-org/gitlab/-/issues/233149) to GitLab Free in 13.4.
+> - [Moved](https://gitlab.com/gitlab-org/gitlab/-/issues/233149) from GitLab Premium to GitLab Free in 13.4.
With the Jira Development panel integration, you can reference Jira issues in GitLab.
When configured, activity (such as pipeline, deployment, and feature flags) displays in the Jira issue's
@@ -69,13 +69,13 @@ To simplify administration, we recommend that a GitLab group maintainer or group
| Jira usage | GitLab.com customers need | GitLab self-managed customers need |
|------------|---------------------------|------------------------------------|
-| [Atlassian cloud](https://www.atlassian.com/cloud) | The [GitLab.com for Jira Cloud 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. |
+| [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 Connector](dvcs.md). |
Each GitLab project can be configured to connect to an entire Jira instance. That means after
configuration, one GitLab project can interact with all Jira projects in that instance. For:
-- The [view Jira issues](issues.md#view-jira-issues) feature **(PREMIUM)**, you must associate a GitLab project with a
+- The [view Jira issues](issues.md#view-jira-issues) feature, you must associate a GitLab project with a
specific Jira project.
- Other features, you do not have to explicitly associate a GitLab project with any single Jira
project.
diff --git a/doc/integration/jira/index.md b/doc/integration/jira/index.md
index 85f99b49c41..f5f7e8c33fc 100644
--- a/doc/integration/jira/index.md
+++ b/doc/integration/jira/index.md
@@ -7,7 +7,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# Jira integrations **(FREE)**
If your organization uses [Jira](https://www.atlassian.com/software/jira) issues,
-you can [migrate your issues from Jira](../../user/project/import/jira.md) **(PREMIUM)** and work
+you can [migrate your issues from Jira](../../user/project/import/jira.md) and work
exclusively in GitLab. However, if you'd like to continue to use Jira, you can
integrate it with GitLab. GitLab offers two types of Jira integrations, and you
can use one or both depending on the capabilities you need. It is recommended that you enable both.
@@ -20,7 +20,7 @@ in your GitLab project with any of your projects in Jira.
### Jira integration
This integration connects one or more GitLab projects to a Jira instance. The Jira instance
-can be hosted by you or in [Atlassian cloud](https://www.atlassian.com/cloud).
+can be hosted by you or in [Atlassian cloud](https://www.atlassian.com/migration/assess/why-cloud).
The supported Jira versions are `v6.x`, `v7.x`, and `v8.x`.
<i class="fa fa-youtube-play youtube" aria-hidden="true"></i>
@@ -49,8 +49,8 @@ or the Jira DVCS (distributed version control system) connector,
| Mention a Jira issue ID in a GitLab branch name and the Jira issue shows the branch name. | No. | Yes, in the issue's [development panel](https://support.atlassian.com/jira-software-cloud/docs/view-development-information-for-an-issue/). |
| Add Jira time tracking to an issue. | No. | Yes. Time can be specified using Jira Smart Commits. |
| Use a Git commit or merge request to transition or close a Jira issue. | Yes. Only a single transition type, typically configured to close the issue by setting it to Done. | Yes. Transition to any state using Jira Smart Commits. |
-| Display a list of Jira issues. | Yes. **(PREMIUM)** | No. |
-| Create a Jira issue from a vulnerability or finding. | Yes. **(ULTIMATE)** | No. |
+| Display a list of [Jira issues](issues.md#view-jira-issues). | Yes. | No. |
+| Create a Jira issue from a [vulnerability or finding](../../user/application_security/vulnerabilities/index.md#create-a-jira-issue-for-a-vulnerability). | Yes. | No. |
| Create a GitLab branch from a Jira issue. | No. | Yes, in the issue's [development panel](https://support.atlassian.com/jira-software-cloud/docs/view-development-information-for-an-issue/). |
## Authentication in Jira
diff --git a/doc/integration/jira/issues.md b/doc/integration/jira/issues.md
index 0373506062c..70e938a24d4 100644
--- a/doc/integration/jira/issues.md
+++ b/doc/integration/jira/issues.md
@@ -96,7 +96,7 @@ Consider this example:
## View Jira issues **(PREMIUM)**
-> [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/3622) in [GitLab Premium](https://about.gitlab.com/pricing/) 13.2.
+> [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/3622) in GitLab 13.2.
You can browse, search, and view issues from a selected Jira project directly in GitLab,
if your GitLab administrator [has configured it](configure.md).
diff --git a/doc/integration/kerberos.md b/doc/integration/kerberos.md
index 48339144292..2d4abb75875 100644
--- a/doc/integration/kerberos.md
+++ b/doc/integration/kerberos.md
@@ -2,7 +2,6 @@
stage: Manage
group: Access
info: "To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments"
-type: reference, how-to
---
# Kerberos integration **(PREMIUM SELF)**
@@ -173,7 +172,7 @@ enabled, your users are linked to their LDAP accounts on their first sign-in.
For this to work, some prerequisites must be met:
The Kerberos username must match the LDAP user's UID. You can choose which LDAP
-attribute is used as the UID in the GitLab [LDAP configuration](../administration/auth/ldap/index.md#configuration)
+attribute is used as the UID in the GitLab [LDAP configuration](../administration/auth/ldap/index.md#configure-ldap)
but for Active Directory, this should be `sAMAccountName`.
The Kerberos realm must match the domain part of the LDAP user's Distinguished
@@ -296,7 +295,7 @@ Kerberos ticket-based authentication.
## Upgrading from password-based to ticket-based Kerberos sign-ins
-Prior to GitLab 8.10 Enterprise Edition, users had to submit their
+In previous versions of GitLab users had to submit their
Kerberos username and password to GitLab when signing in. We plan to
remove support for password-based Kerberos sign-ins in a future
release, so we recommend that you upgrade to ticket-based sign-ins.
diff --git a/doc/integration/mattermost/img/gitlab-mattermost.png b/doc/integration/mattermost/img/gitlab-mattermost.png
index 1eedcb391b0..c3b019988d0 100644
--- a/doc/integration/mattermost/img/gitlab-mattermost.png
+++ b/doc/integration/mattermost/img/gitlab-mattermost.png
Binary files differ
diff --git a/doc/integration/mattermost/index.md b/doc/integration/mattermost/index.md
index 4830f8ba84e..39005940dfc 100644
--- a/doc/integration/mattermost/index.md
+++ b/doc/integration/mattermost/index.md
@@ -175,7 +175,7 @@ sudo gitlab-psql -d mattermost_production
### Back up GitLab Mattermost
-GitLab Mattermost is not included in the regular [Omnibus GitLab backup](../../raketasks/backup_restore.md#back-up-gitlab) Rake task.
+GitLab Mattermost is not included in the regular [Omnibus GitLab backup](../../raketasks/backup_restore.md) Rake task.
The general Mattermost [backup and disaster recovery](https://docs.mattermost.com/deploy/backup-disaster-recovery.html) documentation can be used as a guide
on what needs to be backed up.
@@ -229,7 +229,7 @@ sudo gitlab-ctl start mattermost
### Mattermost Command Line Tools (CLI)
NOTE:
-This CLI will be replaced in a future release with the new [`mmctl` Command Line Tool](https://docs.mattermost.com/administration/mmctl-cli-tool.html).
+This CLI will be replaced in a future release with the new [`mmctl` Command Line Tool](https://docs.mattermost.com/manage/mmctl-command-line-tool.html).
To use the [Mattermost Command Line Tools (CLI)](https://docs.mattermost.com/administration/command-line-tools.html), ensure that you are in the `/opt/gitlab/embedded/service/mattermost` directory when you run the CLI commands and that you specify the location of the configuration file. The executable is `/opt/gitlab/embedded/bin/mattermost`.
@@ -338,6 +338,7 @@ Below is a list of Mattermost versions for GitLab 11.10 and later:
| 14.1 | 5.36 |
| 14.2 | 5.37 |
| 14.3 | 5.38 |
+| 14.4 | 5.39 |
NOTE:
When upgrading the Mattermost version, it is essential to check the
diff --git a/doc/integration/oauth2_generic.md b/doc/integration/oauth2_generic.md
index 867108d4597..bdf6a0e687d 100644
--- a/doc/integration/oauth2_generic.md
+++ b/doc/integration/oauth2_generic.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/engineering/ux/technical-writing/#assignments
---
-# Sign into GitLab with (almost) any OAuth2 provider **(FREE)**
+# Sign into GitLab with (almost) any OAuth2 provider **(FREE SELF)**
The `omniauth-oauth2-generic` gem allows Single Sign-On between GitLab and your own OAuth2 provider
(or any OAuth2 provider compatible with this gem)
diff --git a/doc/integration/oauth_provider.md b/doc/integration/oauth_provider.md
index 5df6c4f28b7..af715e47ab9 100644
--- a/doc/integration/oauth_provider.md
+++ b/doc/integration/oauth_provider.md
@@ -4,18 +4,16 @@ group: Access
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# GitLab as an OAuth 2.0 authentication service provider
+# Configure GitLab as an OAuth 2.0 authentication identity provider
-This document describes how you can use GitLab as an OAuth 2.0
-authentication service provider.
+This document describes how you can use GitLab as an OAuth 2.0 authentication identity provider.
-If you want to use:
-
-- The [OAuth 2.0](https://oauth.net/2/) protocol to access GitLab resources on
- a user's behalf, see [OAuth 2.0 provider](../api/oauth2.md).
-- Other OAuth 2.0 authentication service providers to sign in to
- GitLab, see the [OAuth 2.0 client documentation](omniauth.md).
-- The related API, see [Applications API](../api/applications.md).
+- 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
@@ -88,6 +86,25 @@ To create an application for your GitLab instance:
When creating application in the **Admin Area** , you can mark it as _trusted_.
The user authorization step is automatically skipped for this application.
+## Expiring Access Tokens
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/21745) in GitLab 14.3.
+
+By default, all new applications expire access tokens after 2 hours. In GitLab 14.2 and
+earlier, OAuth access tokens had no expiration.
+
+All integrations should update to support access token refresh.
+
+When creating new applications, you can opt-out of expiry for backward compatibility by clearing
+**Expire access tokens** when creating them. The ability to opt-out
+[is deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/340848).
+
+Existing:
+
+- Applications can have expiring access tokens. Edit the application and select
+ **Expire access tokens** to enable them.
+- Tokens must be [revoked](../api/oauth2.md#revoke-a-token) or they don't expire.
+
## Authorized applications
Every application you authorize with your GitLab credentials is shown
diff --git a/doc/integration/omniauth.md b/doc/integration/omniauth.md
index 7dc775c2557..6c154ee7f5b 100644
--- a/doc/integration/omniauth.md
+++ b/doc/integration/omniauth.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/engineering/ux/technical-writing/#assignments
---
-# OmniAuth **(FREE)**
+# OmniAuth **(FREE SELF)**
GitLab leverages OmniAuth to allow users to sign in using Twitter, GitHub, and
other popular services. [OmniAuth](https://rubygems.org/gems/omniauth/) is a
@@ -47,7 +47,7 @@ contains some settings that are common for all providers.
| [OpenID Connect](../administration/auth/oidc.md) | `openid_connect` |
| [Salesforce](salesforce.md) | `salesforce` |
| [SAML](saml.md) | `saml` |
-| [Shibboleth](shibboleth.md) | `shibboleth` |
+| [Shibboleth](saml.md) | `shibboleth` |
| [Twitter](twitter.md) | `twitter` |
## Initial OmniAuth Configuration
diff --git a/doc/integration/recaptcha.md b/doc/integration/recaptcha.md
index fd5170d615f..60e2d70ce32 100644
--- a/doc/integration/recaptcha.md
+++ b/doc/integration/recaptcha.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/engineering/ux/technical-writing/#assignments
---
-# reCAPTCHA **(FREE)**
+# reCAPTCHA **(FREE SELF)**
GitLab leverages [Google's reCAPTCHA](https://www.google.com/recaptcha/about/)
to protect against spam and abuse. GitLab displays the CAPTCHA form on the sign-up page
diff --git a/doc/integration/salesforce.md b/doc/integration/salesforce.md
index 56d9feb14e0..9555c762761 100644
--- a/doc/integration/salesforce.md
+++ b/doc/integration/salesforce.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/engineering/ux/technical-writing/#assignments
---
-# Salesforce OmniAuth Provider **(FREE)**
+# Salesforce OmniAuth Provider **(FREE SELF)**
You can integrate your GitLab instance with [Salesforce](https://www.salesforce.com/) to enable users to log in to your GitLab instance with their Salesforce account.
diff --git a/doc/integration/saml.md b/doc/integration/saml.md
index b89772ba2ca..876eb7ba80b 100644
--- a/doc/integration/saml.md
+++ b/doc/integration/saml.md
@@ -53,6 +53,7 @@ in your SAML IdP:
sudo -u git -H editor config/gitlab.yml
```
+1. See [Initial OmniAuth Configuration](omniauth.md#initial-omniauth-configuration) for initial settings.
1. To allow your users to use SAML to sign up without having to manually create
an account first, add the following values to your configuration:
@@ -196,15 +197,13 @@ For example configurations, see the [notes on specific providers](#providers).
| Field | Supported keys |
|-----------------|----------------|
| Email (required)| `email`, `mail` |
-| Username | `username`, `nickname` |
| Full Name | `name` |
| First Name | `first_name`, `firstname`, `firstName` |
| Last Name | `last_name`, `lastname`, `lastName` |
-If a username is not specified, the email address is used to generate the GitLab username.
-
-See [`attribute_statements`](#attribute_statements) for examples on how the
-assertions are configured.
+See [`attribute_statements`](#attribute_statements) for examples on how custom
+assertions are configured. This section also describes how to configure custom
+username attributes.
Please refer to [the OmniAuth SAML gem](https://github.com/omniauth/omniauth-saml/blob/master/lib/omniauth/strategies/saml.rb)
for a full list of supported assertions.
@@ -247,7 +246,7 @@ The name of the attribute can be anything you like, but it must contain the grou
to which a user belongs. To tell GitLab where to find these groups, you need
to add a `groups_attribute:` element to your SAML settings.
-### Required groups **(FREE SELF)**
+### Required groups
Your IdP passes Group information to the SP (GitLab) in the SAML Response.
To use this response, configure GitLab to identify:
@@ -274,7 +273,7 @@ Example:
} }
```
-### External groups **(FREE SELF)**
+### External groups
SAML login supports the automatic identification of a user as an
[external user](../user/permissions.md#external-users). This is based on the user's group
@@ -294,7 +293,7 @@ membership in the SAML identity provider.
} }
```
-### Administrator groups **(FREE SELF)**
+### Administrator groups
The requirements are the same as the previous settings:
@@ -443,7 +442,7 @@ SAML users has an administrator role.
You may also bypass the auto sign-in feature by browsing to
`https://gitlab.example.com/users/sign_in?auto_sign_in=false`.
-### `attribute_statements`
+### `attribute_statements` **(FREE SELF)**
NOTE:
This setting should be used only to map attributes that are part of the OmniAuth
@@ -475,12 +474,10 @@ args: {
#### Set a username
-By default, the email in the SAML response is used to automatically generate the
-user's GitLab username. If you'd like to set another attribute as the username,
-assign it to the `nickname` OmniAuth `info` hash attribute.
+By default, the local part of the email address in the SAML response is used to
+generate the user's GitLab username.
-For example, if you want to set the `username` attribute in your SAML Response to the username
-in GitLab, use the following setting:
+Configure `nickname` in `attribute_statements` to specify one or more attributes that contain a user's desired username:
```yaml
args: {
@@ -493,6 +490,8 @@ args: {
}
```
+This also sets the `username` attribute in your SAML Response to the username in GitLab.
+
### `allowed_clock_drift`
The clock of the Identity Provider may drift slightly ahead of your system clocks.
@@ -719,8 +718,8 @@ documentation on how to use SAML to sign in to GitLab.
Examples:
- [ADFS (Active Directory Federation Services)](https://docs.microsoft.com/en-us/windows-server/identity/ad-fs/operations/create-a-relying-party-trust)
-- [Auth0](https://auth0.com/docs/protocols/saml-protocol/configure-auth0-as-saml-identity-provider)
-- [PingOne by Ping Identity](https://docs.pingidentity.com/bundle/pingone/page/xsh1564020480660-1.html)
+- [Auth0](https://auth0.com/docs/configure/saml-configuration/configure-auth0-saml-identity-provider)
+- [PingOne by Ping Identity](http://docs.pingidentity.com/bundle/pingoneforenterprise/page/xsh1564020480660-1.html)
GitLab provides the following setup notes for guidance only.
If you have any questions on configuring the SAML app, please contact your provider's support.
@@ -729,7 +728,7 @@ If you have any questions on configuring the SAML app, please contact your provi
The following guidance is based on this Okta article, on adding a [SAML Application with an Okta Developer account](https://support.okta.com/help/s/article/Why-can-t-I-add-a-SAML-Application-with-an-Okta-Developer-account?language=en_US):
-1. In the Okta admin section, make sure to select Classic UI view in the top left corner. From there, choose to **Add an App**.
+1. In the Okta administrator section, make sure to select Classic UI view in the top left corner. From there, choose to **Add an App**.
1. When the app screen comes up you see another button to **Create an App** and
choose SAML 2.0 on the next screen.
1. Optionally, you can add a logo
@@ -802,11 +801,12 @@ If you only require a SAML provider for testing, a [quick start guide to start a
### 500 error after login
If you see a "500 error" in GitLab when you are redirected back from the SAML
-sign-in page, this likely indicates that GitLab couldn't get the email address
-for the SAML user.
+sign-in page, this could indicate that:
-Ensure the IdP provides a claim containing the user's email address, using the
-claim name `email` or `mail`.
+- GitLab couldn't get the email address for the SAML user. Ensure the IdP provides a claim containing the user's
+ email address using the claim name `email` or `mail`.
+- The certificate set your `gitlab.rb` file for `idp_cert_fingerprint` or `idp_cert` file is incorrect.
+- Your `gitlab.rb` file is set to enable `idp_cert_fingerprint`, and `idp_cert` is being provided, or the reverse.
### 422 error after login
diff --git a/doc/integration/security_partners/index.md b/doc/integration/security_partners/index.md
index 2b851b5f614..b8c7a0163f5 100644
--- a/doc/integration/security_partners/index.md
+++ b/doc/integration/security_partners/index.md
@@ -1,11 +1,11 @@
---
-stage: Protect
-group: Container Security
+stage: Secure
+group: Static Analysis
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#designated-technical-writers
type: index
---
-# Security partner integrations
+# Security partner integrations **(FREE)**
You can integrate GitLab with its security partners. This page has information on how do this with
each security partner:
diff --git a/doc/integration/shibboleth.md b/doc/integration/shibboleth.md
deleted file mode 100644
index 4a3aa6b3dc5..00000000000
--- a/doc/integration/shibboleth.md
+++ /dev/null
@@ -1,9 +0,0 @@
----
-redirect_to: 'saml.md'
-remove_date: '2021-09-29'
----
-
-This file was moved to [another location](saml.md).
-
-<!-- This redirect file can be deleted after <2021-09-29>. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/#move-or-rename-a-page -->
diff --git a/doc/integration/slash_commands.md b/doc/integration/slash_commands.md
index 4059aef9de3..f5916b72d9d 100644
--- a/doc/integration/slash_commands.md
+++ b/doc/integration/slash_commands.md
@@ -6,7 +6,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# Slash commands in Mattermost and Slack **(FREE)**
-> - [Moved](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/24780) to GitLab Free in 11.9.
+> - [Moved](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/24780) from GitLab Ultimate to GitLab Free in 11.9.
If you want to control and view GitLab content while you're
working in Slack and Mattermost, you can use slash commands.
diff --git a/doc/integration/twitter.md b/doc/integration/twitter.md
index 6bc467ed7b2..f8dd552ec6a 100644
--- a/doc/integration/twitter.md
+++ b/doc/integration/twitter.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/engineering/ux/technical-writing/#assignments
---
-# Twitter OAuth 2.0 OmniAuth Provider **(FREE)**
+# Twitter OAuth 2.0 OmniAuth Provider **(FREE SELF)**
To enable the Twitter OmniAuth provider you must register your application with
Twitter. Twitter generates a client ID and secret key for you to use.
diff --git a/doc/integration/vault.md b/doc/integration/vault.md
index ebfa91c7516..3bca3767785 100644
--- a/doc/integration/vault.md
+++ b/doc/integration/vault.md
@@ -2,12 +2,9 @@
stage: Release
group: Release
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
-type: reference, howto
---
-# Vault Authentication with GitLab OpenID Connect
-
-> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/22323) in GitLab 9.0
+# Vault Authentication with GitLab OpenID Connect **(FREE)**
[Vault](https://www.vaultproject.io/) is a secrets management application offered by HashiCorp.
It allows you to store and manage sensitive information such as secret environment variables, encryption keys, and authentication tokens.
diff --git a/doc/operations/error_tracking.md b/doc/operations/error_tracking.md
index e694105d794..88785196f6e 100644
--- a/doc/operations/error_tracking.md
+++ b/doc/operations/error_tracking.md
@@ -10,6 +10,24 @@ info: To determine the technical writer assigned to the Stage/Group associated w
Error Tracking allows developers to easily discover and view the errors that their application may be generating. By surfacing error information where the code is being developed, efficiency and awareness can be increased.
+## How error tracking works
+
+For error tracking to work, you need two pieces:
+
+- **Your application with Sentry SDK:** when the error happens, Sentry SDK captures information
+ about it and sends it over the network to the backend. The backend stores information about all
+ errors.
+
+- **Error tracking backend:** the backend can be either GitLab itself or Sentry. When it's GitLab,
+ we name it _integrated error tracking_ because you don't need to set up a separate backend. It's
+ already part of the product.
+
+ - To use the GitLab backend, see [integrated error tracking](#integrated-error-tracking).
+ - To use Sentry as the backend, see [Sentry error tracking](#sentry-error-tracking).
+
+ No matter what backend you choose, the [error tracking UI](#error-tracking-list)
+ is the same.
+
## Sentry error tracking
[Sentry](https://sentry.io/) is an open source error tracking system. GitLab allows administrators to connect Sentry to GitLab, to allow users to view a list of Sentry errors in GitLab.
@@ -111,7 +129,7 @@ If another event occurs, the error reverts to unresolved.
## Integrated error tracking
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/329596) in GitLab 14.3.
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/329596) in GitLab 14.4.
Integrated error tracking is a lightweight alternative to Sentry backend.
You still use Sentry SDK with your application. But you don't need to deploy Sentry
@@ -125,8 +143,7 @@ Sentry integration.
### Project settings
-The feature should be enabled on the project level. However, there is no UI to enable this feature yet.
-You must use the GitLab API to enable it.
+You can find the feature configuration at **Settings > Monitor > Error Tracking**.
#### How to enable
@@ -134,26 +151,21 @@ You must use the GitLab API to enable it.
![Error Tracking Settings](img/error_tracking_setting_v14_3.png)
-1. Create a client key (DSN) to use with Sentry SDK in your application. Make sure to save the
- response, as it contains a DSN:
+1. Select **Save changes**. After page reload you should see a text field with the DSN string. Copy it.
- ```shell
- curl --request POST --header "PRIVATE-TOKEN: <your_access_token>" \
- "https://gitlab.example.com/api/v4/projects/PROJECT_ID/error_tracking/client_keys"
- ```
+ ![Error Tracking Settings DSN](img/error_tracking_setting_dsn_v14_4.png)
1. Take the DSN from the previous step and configure your Sentry SDK with it. Errors are now
reported to the GitLab collector and are visible in the [GitLab UI](#error-tracking-list).
-#### How to disable
+#### Managing DSN
-To disable the feature, run this command. This is the same command as the one that enables the
-feature, but with a `false` value instead:
+When you enable the feature you receive a DSN. It includes a hash used for authentication. This hash
+is a client key. GitLab uses client keys to authenticate error tracking requests from your
+application to the GitLab backend.
-```shell
-curl --request PATCH --header "PRIVATE-TOKEN: <your_access_token>" \
- "https://gitlab.example.com/api/v4/projects/PROJECT_ID/error_tracking/settings?active=false&integrated=false"
-```
+In some situations, you may want to create a new client key and remove an existing one.
+You can do so by managing client keys with the [error tracking API](../api/error_tracking.md).
#### Limitations
diff --git a/doc/operations/feature_flags.md b/doc/operations/feature_flags.md
index a8686e2f4b7..2af4ee47292 100644
--- a/doc/operations/feature_flags.md
+++ b/doc/operations/feature_flags.md
@@ -7,7 +7,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# Feature Flags **(FREE)**
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/7433) in GitLab 11.4.
-> - [Moved](https://gitlab.com/gitlab-org/gitlab/-/issues/212318) to GitLab Free in 13.5.
+> - [Moved](https://gitlab.com/gitlab-org/gitlab/-/issues/212318) from GitLab Premium to GitLab Free in 13.5.
With Feature Flags, you can deploy your application's new features to production in smaller batches.
You can toggle a feature on and off to subsets of users, helping you achieve Continuous Delivery.
@@ -166,6 +166,21 @@ WARNING:
The Unleash client **must** be given a user ID for the feature to be enabled for
target users. See the [Ruby example](#ruby-application-example) below.
+## Search for Code References **(PREMIUM)**
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/300299) in GitLab 14.4.
+
+Search your project and find any references of a feature flag in your
+code so that you and clean it up when it's time to remove the feature flag.
+
+To search for code references of a feature flag:
+
+1. On the top bar, select **Menu > Projects** and find your project.
+1. On the left sidebar, select **Deployments > Feature Flags**.
+1. Edit the feature flag you want to remove.
+1. Select **More actions** (**{ellipsis_v}**).
+1. Select **Search code references**.
+
### User List
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/35930) in GitLab 13.1.
@@ -312,7 +327,7 @@ Unleash currently [offers many SDKs for various languages and frameworks](https:
For API content, see:
- [Feature Flags API](../api/feature_flags.md)
-- [Feature Flag Specs API](../api/feature_flag_specs.md) (Deprecated and [scheduled for removal in GitLab 14.0](https://gitlab.com/gitlab-org/gitlab/-/issues/213369).)
+- [Feature Flag Specs API](../api/feature_flag_specs.md) (Deprecated and [scheduled for removal](https://gitlab.com/gitlab-org/gitlab/-/issues/213369) in GitLab 14.0.)
- [Feature Flag User Lists API](../api/feature_flag_user_lists.md)
- [Legacy Feature Flags API](../api/feature_flags_legacy.md)
diff --git a/doc/operations/img/error_tracking_setting_dsn_v14_4.png b/doc/operations/img/error_tracking_setting_dsn_v14_4.png
new file mode 100644
index 00000000000..b7ecaa047b2
--- /dev/null
+++ b/doc/operations/img/error_tracking_setting_dsn_v14_4.png
Binary files differ
diff --git a/doc/operations/incident_management/alerts.md b/doc/operations/incident_management/alerts.md
index c6ff70103d9..cdf7ca5c8bc 100644
--- a/doc/operations/incident_management/alerts.md
+++ b/doc/operations/incident_management/alerts.md
@@ -10,11 +10,10 @@ Alerts are a critical entity in your incident management workflow. They represen
## Alert List
-Users with at least Developer [permissions](../../user/permissions.md) can
+Users with at least the Developer [role](../../user/permissions.md) can
access the Alert list at **Monitor > Alerts** in your project's
sidebar. The Alert list displays alerts sorted by start time, but
you can change the sort order by clicking the headers in the Alert list.
-([Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/217745) in GitLab 13.1.)
The alert list displays the following information:
@@ -53,6 +52,8 @@ immediately identify which alerts you should prioritize investigating:
Alerts contain one of the following icons:
+<!-- vale gitlab.SubstitutionWarning = NO -->
+
| Severity | Icon | Color (hexadecimal) |
|----------|-------------------------|---------------------|
| Critical | **{severity-critical}** | `#8b2615` |
@@ -62,10 +63,12 @@ Alerts contain one of the following icons:
| Info | **{severity-info}** | `#418cd8` |
| Unknown | **{severity-unknown}** | `#bababa` |
+<!-- vale gitlab.SubstitutionWarning = YES -->
+
## Alert details page
Navigate to the Alert details view by visiting the [Alert list](alerts.md)
-and selecting an alert from the list. You need least Developer [permissions](../../user/permissions.md)
+and selecting an alert from the list. You need at least the Developer [role](../../user/permissions.md)
to access alerts.
NOTE:
@@ -108,7 +111,7 @@ To view the metrics for an alert:
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/201846) in GitLab Ultimate 12.8.
> - [Improved](https://gitlab.com/gitlab-org/gitlab/-/issues/217768) in GitLab 13.3.
-> - [Moved](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/25455) to GitLab Free 12.9.
+> - [Moved](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/25455) from GitLab Ultimate to GitLab Free in 12.9.
Viewing logs from a metrics panel can be useful if you're triaging an
application incident and need to [explore logs](../metrics/dashboards/index.md#chart-context-menu)
diff --git a/doc/operations/incident_management/escalation_policies.md b/doc/operations/incident_management/escalation_policies.md
index b82aa5e5dc5..5f132720000 100644
--- a/doc/operations/incident_management/escalation_policies.md
+++ b/doc/operations/incident_management/escalation_policies.md
@@ -6,7 +6,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# Escalation Policies **(PREMIUM)**
-> [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/4638) in [GitLab Premium](https://about.gitlab.com/pricing/) 14.1.
+> [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/4638) in GitLab 14.1.
Escalation Policies protect your company from missed critical alerts. Escalation Policies contain
time-boxed steps that automatically page the next responder in the escalation step if the responder
diff --git a/doc/operations/incident_management/incidents.md b/doc/operations/incident_management/incidents.md
index 0cd0a645c15..2d9ef21f1ce 100644
--- a/doc/operations/incident_management/incidents.md
+++ b/doc/operations/incident_management/incidents.md
@@ -24,7 +24,7 @@ Incident, you have two options to do this manually.
**From the Incidents List:**
-> [Moved](https://gitlab.com/gitlab-org/monitor/health/-/issues/24) to GitLab Free in 13.3.
+> [Moved](https://gitlab.com/gitlab-org/monitor/monitor/-/issues/24) to GitLab Free in 13.3.
- Navigate to **Monitor > Incidents** and click **Create Incident**.
- Create a new issue using the `incident` template available when creating it.
@@ -44,11 +44,11 @@ Incident, you have two options to do this manually.
![Incident List Create](img/new_incident_create_v13_4.png)
-### Create incidents automatically
+### Create incidents automatically **(ULTIMATE)**
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/4925) in GitLab Ultimate 11.11.
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/4925) in GitLab 11.11.
-With Maintainer or higher [permissions](../../user/permissions.md), you can enable
+With at least the Maintainer [role](../../user/permissions.md), you can enable
GitLab to create incident automatically whenever an alert is triggered:
1. Navigate to **Settings > Monitor > Incidents** and expand **Incidents**.
@@ -56,9 +56,9 @@ With Maintainer or higher [permissions](../../user/permissions.md), you can enab
1. To customize the incident, select an
[issue template](../../user/project/description_templates.md#create-an-issue-template).
1. To send [an email notification](paging.md#email-notifications) to users
- with the [Developer role](../../user/permissions.md), select
+ with the Developer [role](../../user/permissions.md), select
**Send a separate email notification to Developers**. Email notifications are
- also sent to users with **Maintainer** and **Owner** permissions.
+ also sent to users with the **Maintainer** and **Owner** roles.
1. Click **Save changes**.
### Create incidents via the PagerDuty webhook
@@ -69,7 +69,7 @@ You can set up a webhook with PagerDuty to automatically create a GitLab inciden
for each PagerDuty incident. This configuration requires you to make changes
in both PagerDuty and GitLab:
-1. Sign in as a user with the [Maintainer role](../../user/permissions.md).
+1. Sign in as a user with the Maintainer [role](../../user/permissions.md).
1. Navigate to **Settings > Monitor > Incidents** and expand **Incidents**.
1. Select the **PagerDuty integration** tab:
@@ -114,14 +114,14 @@ in your project's sidebar. The list contains the following metrics:
tooltip depending on the user's locale.
- **Assignees** - The user assigned to the incident.
- **Published** - Displays a green check mark (**{check-circle}**) if the incident is published
- to a [Status Page](status_page.md). **(ULTIMATE)**
+ to a [Status Page](status_page.md).
The Incident list displays incidents sorted by incident created date.
-([Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/229534) to GitLab Free in 13.3.)
+([Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/229534) in GitLab 13.3.)
To see if a column is sortable, point your mouse at the header. Sortable columns
display an arrow next to the column name.
-Incidents share the [Issues API](../../user/project/issues/index.md).
+Incidents share the [Issues API](../../api/issues.md).
NOTE:
For a live example of the incident list in action, visit this
@@ -165,9 +165,9 @@ Beneath the highlight bar, GitLab displays a summary that includes the following
Comments are displayed in threads, but can be displayed chronologically
[in a timeline view](#timeline-view).
-### Metrics
+### Metrics **(PREMIUM)**
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/235994) in [GitLab Premium](https://about.gitlab.com/pricing/) 13.8.
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/235994) in GitLab 13.8.
In many cases, incidents are associated to metrics. You can upload screenshots of metric
charts in the **Metrics** tab:
@@ -189,7 +189,7 @@ field populated.
### Timeline view **(PREMIUM)**
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/227836) in [GitLab Premium](https://about.gitlab.com/pricing/) 13.5.
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/227836) in GitLab 13.5.
To quickly see the latest updates on an incident, click
**{comments}** **Turn timeline view on** in the comment bar to display comments
@@ -199,7 +199,7 @@ un-threaded and ordered chronologically, newest to oldest:
### Service Level Agreement countdown timer **(PREMIUM)**
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/241663) in [GitLab Premium](https://about.gitlab.com/pricing/) 13.5.
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/241663) in GitLab 13.5.
You can enable the Service Level Agreement Countdown timer on incidents to track
the Service Level Agreements (SLAs) you hold with your customers. The timer is
@@ -277,7 +277,7 @@ templates.
> - [Introduced for Prometheus Integrations](https://gitlab.com/gitlab-org/gitlab/-/issues/13401) in GitLab 12.5.
> - [Introduced for HTTP Integrations](https://gitlab.com/gitlab-org/gitlab/-/issues/13402) in GitLab 13.4.
-With Maintainer or higher [permissions](../../user/permissions.md), you can enable
+With at least the Maintainer [role](../../user/permissions.md), you can enable
GitLab to close an incident automatically when a **Recovery Alert** is received:
1. Navigate to **Settings > Monitor > Incidents** and expand **Incidents**.
diff --git a/doc/operations/incident_management/integrations.md b/doc/operations/incident_management/integrations.md
index f6c85045fa0..1426148d163 100644
--- a/doc/operations/incident_management/integrations.md
+++ b/doc/operations/incident_management/integrations.md
@@ -6,8 +6,8 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# Integrations **(FREE)**
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/13203) in GitLab Ultimate 12.4.
-> - [Moved](https://gitlab.com/gitlab-org/gitlab/-/issues/42640) to GitLab Free in 12.8.
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/13203) in GitLab 12.4.
+> - [Moved](https://gitlab.com/gitlab-org/gitlab/-/issues/42640) from GitLab Ultimate to GitLab Free in 12.8.
GitLab can accept alerts from any source via a webhook receiver. This can be configured
generically or, in GitLab versions 13.1 and greater, you can configure
@@ -16,9 +16,9 @@ to use this endpoint.
## Integrations list
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/245331) in GitLab Free 13.5.
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/245331) in GitLab 13.5.
-With at least the [Maintainer role](../../user/permissions.md), you can view the list of configured
+With at least the Maintainer [role](../../user/permissions.md), you can view the list of configured
alerts integrations by navigating to **Settings > Monitor**
in your project's sidebar menu, and expanding the **Alerts** section. The list displays
the integration name, type, and status (enabled or disabled):
@@ -30,13 +30,13 @@ the integration name, type, and status (enabled or disabled):
GitLab can receive alerts via a HTTP endpoint that you configure,
or the [Prometheus integration](#external-prometheus-integration).
-### Single HTTP Endpoint **(FREE)**
+### Single HTTP Endpoint
Enabling the HTTP Endpoint in a GitLab projects activates it to
receive alert payloads in JSON format. You can always
[customize the payload](#customize-the-alert-payload-outside-of-gitlab) to your liking.
-1. Sign in to GitLab as a user with maintainer [permissions](../../user/permissions.md)
+1. Sign in to GitLab as a user with the Maintainer [role](../../user/permissions.md)
for a project.
1. Navigate to **Settings > Monitor** in your project.
1. Expand the **Alerts** section, and in the **Select integration type** dropdown menu,
@@ -47,13 +47,13 @@ receive alert payloads in JSON format. You can always
### HTTP Endpoints **(PREMIUM)**
-> [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/4442) in GitLab Premium 13.6.
+> [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/4442) in GitLab 13.6.
In [GitLab Premium](https://about.gitlab.com/pricing/), you can create multiple
unique HTTP endpoints to receive alerts from any external source in JSON format,
and you can [customize the payload](#customize-the-alert-payload-outside-of-gitlab).
-1. Sign in to GitLab as a user with maintainer [permissions](../../user/permissions.md)
+1. Sign in to GitLab as a user with the Maintainer [role](../../user/permissions.md)
for a project.
1. Navigate to **Settings > Monitor** in your project.
1. Expand the **Alerts** section.
@@ -80,7 +80,7 @@ side of the integrations list.
#### Map fields in custom alerts
-> [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/4443) in [GitLab Premium](https://about.gitlab.com/pricing/) 13.10.
+> [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/4443) in GitLab 13.10.
You can integrate your monitoring tool's alert format with GitLab alerts. To show the
correct information in the [Alert list](alerts.md) and the
@@ -125,17 +125,7 @@ NOTE:
Ensure your requests are smaller than the
[payload application limits](../../administration/instance_limits.md#generic-alert-json-payloads).
-Example request:
-
-```shell
-curl --request POST \
- --data '{"title": "Incident title"}' \
- --header "Authorization: Bearer <authorization_key>" \
- --header "Content-Type: application/json" \
- <url>
-```
-
-The `<authorization_key>` and `<url>` values can be found when configuring an alert integration.
+### Example request body
Example payload:
@@ -157,15 +147,64 @@ Example payload:
}
```
+## Authorization
+
+The following authorization methods are accepted:
+
+- Bearer authorization header
+- Basic authentication
+
+The `<authorization_key>` and `<url>` values can be found when configuring an alert integration.
+
+### Bearer authorization header
+
+The authorization key can be used as the Bearer token:
+
+```shell
+curl --request POST \
+ --data '{"title": "Incident title"}' \
+ --header "Authorization: Bearer <authorization_key>" \
+ --header "Content-Type: application/json" \
+ <url>
+```
+
+### Basic authentication
+
+The authorization key can be used as the `password`. The `username` is left blank:
+
+- username: `<blank>`
+- pasword: authorization_key
+
+```shell
+curl --request POST \
+ --data '{"title": "Incident title"}' \
+ --header "Authorization: Basic <base_64_encoded_credentials>" \
+ --header "Content-Type: application/json" \
+ <url>
+```
+
+Basic authentication can also be used with credentials directly in the URL:
+
+```shell
+curl --request POST \
+ --data '{"title": "Incident title"}' \
+ --header "Content-Type: application/json" \
+ <username:password@url>
+```
+
+WARNING:
+Using your authorization key in the URL is insecure, as it's visible in server logs. We recommend
+using one of the above header options if your tooling supports it.
+
## Triggering test alerts
-> [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/3066) in GitLab Free in 13.2.
+> [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/3066) in GitLab in 13.2.
After a [project maintainer or owner](../../user/permissions.md)
configures an integration, you can trigger a test
alert to confirm your integration works properly.
-1. Sign in as a user with Developer or greater [permissions](../../user/permissions.md).
+1. Sign in as a user with at least the Developer [role](../../user/permissions.md).
1. Navigate to **Settings > Monitor** in your project.
1. Click **Alerts** to expand the section.
1. Click the **{settings}** settings icon on the right side of the integration in [the list](#integrations-list).
@@ -177,7 +216,7 @@ GitLab displays an error or success message, depending on the outcome of your te
## Automatic grouping of identical alerts **(PREMIUM)**
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/214557) in GitLab Premium 13.2.
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/214557) in GitLab 13.2.
In GitLab versions 13.2 and greater, GitLab groups alerts based on their
payload. When an incoming alert contains the same payload as another alert
@@ -200,9 +239,9 @@ field is `end_time`. With custom mappings, you can select the expected field.
You can also configure the associated [incident to be closed automatically](../incident_management/incidents.md#automatically-close-incidents-via-recovery-alerts) when the alert resolves.
-## Link to your Opsgenie Alerts
+## Link to your Opsgenie Alerts **(PREMIUM)**
-> [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/3066) in GitLab Premium 13.2.
+> [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/3066) in GitLab 13.2.
WARNING:
We are building deeper integration with Opsgenie and other alerting tools through
@@ -219,7 +258,7 @@ active at the same time.
To enable Opsgenie integration:
-1. Sign in as a user with the [Maintainer or Owner role](../../user/permissions.md).
+1. Sign in as a user with the Maintainer or Owner [role](../../user/permissions.md).
1. Navigate to **Monitor > Alerts**.
1. In the **Integrations** select box, select **Opsgenie**.
1. Select the **Active** toggle.
diff --git a/doc/operations/incident_management/oncall_schedules.md b/doc/operations/incident_management/oncall_schedules.md
index 9e736f2cdec..2a8f0eac59c 100644
--- a/doc/operations/incident_management/oncall_schedules.md
+++ b/doc/operations/incident_management/oncall_schedules.md
@@ -6,7 +6,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# On-call Schedule Management **(PREMIUM)**
-> [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/4544) in [GitLab Premium](https://about.gitlab.com/pricing/) 13.11.
+> [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/4544) in GitLab 13.11.
Use on-call schedule management to create schedules for responders to rotate on-call
responsibilities. Maintain the availability of your software services by putting your teams on-call.
@@ -31,7 +31,7 @@ To create an on-call schedule:
1. On the top bar, select **Menu > Projects** and find your project.
1. On the left sidebar, select **Monitor > On-call Schedules**.
1. Select **Add a schedule**.
-1. Enter the schedule's name and description and select a timezone.
+1. Enter the schedule's name and description and select a time zone.
1. Select **Add schedule**.
You now have an empty schedule with no rotations. This renders as an empty state, prompting you to
diff --git a/doc/operations/incident_management/status_page.md b/doc/operations/incident_management/status_page.md
index db7b55424dd..241112df521 100644
--- a/doc/operations/incident_management/status_page.md
+++ b/doc/operations/incident_management/status_page.md
@@ -6,7 +6,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# Status Page **(ULTIMATE)**
-> [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/2479) in [GitLab Ultimate](https://about.gitlab.com/pricing/) 12.10.
+> [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/2479) in GitLab 12.10.
With a GitLab Status Page, you can create and deploy a static website to communicate
efficiently to users during an incident. The Status Page landing page displays an
@@ -138,7 +138,7 @@ you provided during setup. As part of publication, GitLab:
- Anonymizes user and group mentions with `Incident Responder`.
- Removes titles of non-public [GitLab references](../../user/markdown.md#gitlab-specific-references).
- Publishes any files attached to incident issue descriptions, up to 5000 per issue.
- ([Introduced in GitLab 13.1](https://gitlab.com/gitlab-org/gitlab/-/issues/205166).)
+ ([Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/205166) in GitLab 13.1.)
After publication, you can access the incident's details page by clicking the
**Published on status page** button displayed under the Incident's title.
@@ -162,7 +162,7 @@ To publish comments to the Status Page Incident:
adding a microphone [award emoji](../../user/award_emojis.md)
reaction (`:microphone:` 🎤) to the comment.
- Any files attached to the comment (up to 5000 per issue) are also published.
- ([Introduced in GitLab 13.1](https://gitlab.com/gitlab-org/gitlab/-/issues/205166).)
+ ([Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/205166) in GitLab 13.1.)
WARNING:
Anyone with access to view the Issue can add an emoji award to a comment, so
diff --git a/doc/operations/index.md b/doc/operations/index.md
index d170e82dd7f..ec54b6c57b9 100644
--- a/doc/operations/index.md
+++ b/doc/operations/index.md
@@ -36,7 +36,7 @@ Are your alerts too noisy? Alerts configured on GitLab metrics can configured
and fine-tuned in GitLab immediately following a fire-fight.
- [Manage alerts and incidents](incident_management/index.md) in GitLab.
-- [Configure alerts for metrics](metrics/alerts.md#set-up-alerts-for-prometheus-metrics) in GitLab.
+- [Configure alerts for metrics](metrics/alerts.md) in GitLab.
- Create a [status page](incident_management/status_page.md)
to communicate efficiently to your users during an incident.
@@ -94,6 +94,6 @@ an environment.
## More features
- Deploy to different [environments](../ci/environments/index.md).
-- Connect your project to a [Kubernetes cluster](../user/project/clusters/index.md).
+- Connect your project to a [Kubernetes cluster](../user/infrastructure/clusters/index.md).
- See how your application is used and analyze events with [Product Analytics](product_analytics.md).
-- Create, toggle, and remove [Feature Flags](feature_flags.md). **(PREMIUM)**
+- Create, toggle, and remove [Feature Flags](feature_flags.md).
diff --git a/doc/operations/metrics/alerts.md b/doc/operations/metrics/alerts.md
index a3d741b78ea..44999ad7cd6 100644
--- a/doc/operations/metrics/alerts.md
+++ b/doc/operations/metrics/alerts.md
@@ -61,7 +61,7 @@ Prometheus server to use the
## Trigger actions from alerts **(ULTIMATE)**
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/4925) in [GitLab Ultimate](https://about.gitlab.com/pricing/) 11.11.
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/4925) in GitLab 11.11.
Alerts can be used to trigger actions, like opening an issue automatically
(disabled by default since `13.1`). To configure the actions:
@@ -83,7 +83,7 @@ values extracted from the [`alerts` field in webhook payload](https://prometheus
- `full_query`: Alert query extracted from the payload's `generatorURL` field
- Optional list of attached annotations extracted from `annotations/*`
- Alert [GFM](../../user/markdown.md): GitLab Flavored Markdown from the payload's `annotations/gitlab_incident_markdown` field.
-- Alert Severity (introduced in GitLab version [13.9](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/50871):
+- Alert Severity ([Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/50871) in GitLab version 13.9):
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
@@ -107,7 +107,7 @@ of the project.
### Recovery alerts
-> - [From GitLab Ultimate 12.5](https://gitlab.com/gitlab-org/gitlab/-/issues/13401), when GitLab receives a recovery alert, it automatically closes the associated issue.
+> [From GitLab 12.5](https://gitlab.com/gitlab-org/gitlab/-/issues/13401), when GitLab receives a recovery alert, it automatically closes the associated issue.
The alert in GitLab will be automatically resolved when Prometheus
sends a payload with the field `status` set to `resolved`.
diff --git a/doc/operations/metrics/dashboards/default.md b/doc/operations/metrics/dashboards/default.md
index 2ba7a4e0d87..2be26e843c4 100644
--- a/doc/operations/metrics/dashboards/default.md
+++ b/doc/operations/metrics/dashboards/default.md
@@ -30,7 +30,7 @@ This dashboard requires Kubernetes v1.14 or higher, due to the
in Kubernetes 1.14.
This dashboard displays CPU, memory, network and disk metrics for the pods in your
-[connected K8s cluster](../../../user/project/clusters/index.md). It provides a
+[connected Kubernetes cluster](../../../user/infrastructure/clusters/index.md). It provides a
[variable selector](templating_variables.md#metric_label_values-variable-type)
at the top of the dashboard to select which pod's metrics to display.
diff --git a/doc/operations/metrics/dashboards/panel_types.md b/doc/operations/metrics/dashboards/panel_types.md
index dc96e2556ac..140e18b5b13 100644
--- a/doc/operations/metrics/dashboards/panel_types.md
+++ b/doc/operations/metrics/dashboards/panel_types.md
@@ -62,12 +62,10 @@ panel_groups:
query_range: 'http_requests_total'
label: '# of Requests'
unit: 'count'
- metrics:
- id: anomaly_requests_upper_limit
query_range: 10000
label: 'Max # of requests'
unit: 'count'
- metrics:
- id: anomaly_requests_lower_limit
query_range: 2000
label: 'Min # of requests'
diff --git a/doc/operations/metrics/dashboards/variables.md b/doc/operations/metrics/dashboards/variables.md
index 4b083284819..fa79524883d 100644
--- a/doc/operations/metrics/dashboards/variables.md
+++ b/doc/operations/metrics/dashboards/variables.md
@@ -8,7 +8,9 @@ info: To determine the technical writer assigned to the Stage/Group associated w
## Query variables
-Variables can be specified using double curly braces, such as `"{{ci_environment_slug}}"` ([added](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/20793) in GitLab 12.7).
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/20793) in GitLab 12.7.
+
+Variables can be specified using double curly braces, such as `"{{ci_environment_slug}}"`.
Support for the `"%{ci_environment_slug}"` format was
[removed](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/31581) in GitLab 13.0.
@@ -66,5 +68,5 @@ avg(sum(container_memory_usage_bytes{container_name!="{{pod}}"}) by (job)) witho
The URL for this query would be:
```plaintext
-http://gitlab.com/<user>/<project>/-/environments/<environment_id>/metrics?dashboard=.gitlab%2Fdashboards%2Fcustom.yml&pod=POD
+https://gitlab.com/<user>/<project>/-/environments/<environment_id>/metrics?dashboard=.gitlab%2Fdashboards%2Fcustom.yml&pod=POD
```
diff --git a/doc/operations/metrics/dashboards/yaml.md b/doc/operations/metrics/dashboards/yaml.md
index 45803598a40..8068a66d5c4 100644
--- a/doc/operations/metrics/dashboards/yaml.md
+++ b/doc/operations/metrics/dashboards/yaml.md
@@ -14,7 +14,7 @@ Dashboards have several components:
The following tables outline the details of expected properties.
-## **Dashboard (top-level) properties**
+## Dashboard (top-level) properties
| Property | Type | Required | Description |
| ------ | ------ | ------ | ------ |
@@ -23,7 +23,7 @@ The following tables outline the details of expected properties.
| `templating` | hash | no | Top level key under which templating related options can be added. |
| `links` | array | no | Add links to display on the dashboard. |
-## **Templating (`templating`) properties**
+## Templating (`templating`) properties
| Property | Type | Required | Description |
| -------- | ---- | -------- | ----------- |
@@ -31,7 +31,7 @@ The following tables outline the details of expected properties.
Read the documentation on [templating](templating_variables.md).
-## **Links (`links`) properties**
+## Links (`links`) properties
| Property | Type | Required | Description |
| -------- | ---- | -------- | ----------- |
@@ -41,7 +41,7 @@ Read the documentation on [templating](templating_variables.md).
Read the documentation on [links](index.md#add-related-links-to-custom-dashboards).
-## **Panel group (`panel_groups`) properties**
+## Panel group (`panel_groups`) properties
Dashboards display panel groups in the order they are listed in the dashboard YAML file.
@@ -55,7 +55,7 @@ is no longer used.
Panels in a panel group are laid out in rows consisting of two panels per row. An exception to this rule are single panels on a row: these panels take the full width of their containing row.
-## **Panel (`panels`) properties**
+## Panel (`panels`) properties
Dashboards display panels in the order they are listed in the dashboard YAML file.
@@ -72,7 +72,7 @@ is no longer used.
| `metrics` | array | yes | The metrics which should be displayed in the panel. Any number of metrics can be displayed when `type` is `area-chart` or `line-chart`, whereas only 3 can be displayed when `type` is `anomaly-chart`. |
| `links` | array | no | Add links to display on the chart's [context menu](index.md#chart-context-menu). |
-## **Axis (`panels[].y_axis`) properties**
+## Axis (`panels[].y_axis`) properties
| Property | Type | Required | Description |
| ----------- | ------ | ----------------------------- | -------------------------------------------------------------------- |
@@ -80,7 +80,7 @@ is no longer used.
| `format` | string | no, defaults to `engineering` | Unit format used. See the [full list of units](yaml_number_format.md). |
| `precision` | number | no, defaults to `2` | Number of decimal places to display in the number. | |
-## **Metrics (`metrics`) properties**
+## Metrics (`metrics`) properties
| Property | Type | Required | Description |
| ------ | ------ | ------ | ------ |
diff --git a/doc/operations/metrics/embed.md b/doc/operations/metrics/embed.md
index d773d04f1cc..e84c190e08d 100644
--- a/doc/operations/metrics/embed.md
+++ b/doc/operations/metrics/embed.md
@@ -96,17 +96,17 @@ a chart corresponding to the query can be included if these requirements are met
## Embedding cluster health charts
-> - [Introduced](<https://gitlab.com/gitlab-org/gitlab/-/issues/40997>) in [GitLab Ultimate](https://about.gitlab.com/pricing/) 12.9.
-> - [Moved](<https://gitlab.com/gitlab-org/gitlab/-/issues/208224>) to GitLab core in 13.2.
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/40997) in GitLab 12.9.
+> - [Moved](https://gitlab.com/gitlab-org/gitlab/-/issues/208224) from GitLab Ultimate to GitLab Free in 13.2.
-[Cluster Health Metrics](../../user/project/clusters/index.md#visualizing-cluster-health)
+[Cluster Health Metrics](../../user/infrastructure/clusters/manage/clusters_health.md)
can also be embedded in [GitLab-flavored Markdown](../../user/markdown.md).
To embed a metric chart, include a link to that chart in the form
`https://<root_url>/<project>/-/cluster/<cluster_id>?<query_params>` anywhere that
GitLab-flavored Markdown is supported. To generate and copy a link to the chart,
follow the instructions in the
-[Cluster Health Metric documentation](../../user/project/clusters/index.md#visualizing-cluster-health).
+[Cluster Health Metric documentation](../../user/infrastructure/clusters/manage/clusters_health.md).
The following requirements must be met for the metric to unfurl:
@@ -114,7 +114,7 @@ The following requirements must be met for the metric to unfurl:
- Prometheus must be monitoring the cluster.
- The user must be allowed access to the project cluster metrics.
- The dashboards must be reporting data on the
- [Cluster Health Page](../../user/project/clusters/index.md#visualizing-cluster-health)
+ [Cluster Health Page](../../user/infrastructure/clusters/manage/clusters_health.md)
If the above requirements are met, then the metric unfurls as seen below.
diff --git a/doc/operations/metrics/embed_grafana.md b/doc/operations/metrics/embed_grafana.md
index 473b335d4c5..81b1f8a3bc6 100644
--- a/doc/operations/metrics/embed_grafana.md
+++ b/doc/operations/metrics/embed_grafana.md
@@ -51,7 +51,7 @@ To set up the Grafana API in Grafana:
section.
1. To enable the integration, check the **Active** checkbox.
1. For **Grafana URL**, enter the base URL of the Grafana instance.
-1. For **API Token**, enter the Admin API token you just generated.
+1. For **API Token**, enter the Administrator API token you just generated.
1. Click **Save Changes**.
### Generate a link to a panel
diff --git a/doc/operations/metrics/index.md b/doc/operations/metrics/index.md
index 07e71fe79ef..f09b9f35d88 100644
--- a/doc/operations/metrics/index.md
+++ b/doc/operations/metrics/index.md
@@ -111,7 +111,7 @@ dashboard is visible to authenticated and non-authenticated users.
## Adding custom metrics
-> - [Moved](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/28527) to GitLab Free in 12.10.
+> - [Moved](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/28527) from GitLab Premium to GitLab Free in 12.10.
Custom metrics can be monitored by adding them on the monitoring dashboard page.
After saving them, they display on the environment metrics dashboard provided that either:
diff --git a/doc/operations/product_analytics.md b/doc/operations/product_analytics.md
index c89500ab92c..3ff33027042 100644
--- a/doc/operations/product_analytics.md
+++ b/doc/operations/product_analytics.md
@@ -50,8 +50,7 @@ Feature.disable(:product_analytics, Project.find(<project ID>))
After enabling the feature flag for Product Analytics, you can access the
user interface:
-1. Sign in to GitLab as a user with Reporter or greater
- [permissions](../user/permissions.md).
+1. Sign in to GitLab as a user with at least the Reporter [role](../user/permissions.md).
1. Navigate to **Monitor > Product Analytics**.
The user interface contains:
diff --git a/doc/operations/tracing.md b/doc/operations/tracing.md
index 7435c0dd8a2..1593607cc98 100644
--- a/doc/operations/tracing.md
+++ b/doc/operations/tracing.md
@@ -6,8 +6,8 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# Tracing **(FREE)**
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/7903) in GitLab Ultimate 11.5.
-> - [Moved](https://gitlab.com/gitlab-org/gitlab/-/issues/42645) to GitLab Free in 13.5.
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/7903) in GitLab 11.5.
+> - [Moved](https://gitlab.com/gitlab-org/gitlab/-/issues/42645) from GitLab Ultimate to GitLab Free in 13.5.
Tracing provides insight into the performance and health of a deployed application, tracking each
function or microservice that handles a given request. Tracing makes it easy to understand the
diff --git a/doc/policy/maintenance.md b/doc/policy/maintenance.md
index f7c64895c78..399ef40cb40 100644
--- a/doc/policy/maintenance.md
+++ b/doc/policy/maintenance.md
@@ -36,7 +36,7 @@ The following table describes the version types and their release cadence:
| Version type | Description | Cadence |
|:-------------|:------------|:--------|
-| Major | For significant changes, or when any backward-incompatible changes are introduced to the public API. | Yearly. The next major release is GitLab 14.0 on June 22, 2021 (one month later than typical, details in [this issue](https://gitlab.com/gitlab-com/Product/-/issues/2337)). Subsequent major releases will be scheduled for May 22 each year, by default. |
+| Major | For significant changes, or when any backward-incompatible changes are introduced to the public API. | Yearly. The next major release is GitLab 15.0 on May 22, 2022. GitLab schedules major releases on May 22 each year, by default. |
| Minor | For when new backward-compatible functionality is introduced to the public API, a minor feature is introduced, or when a set of smaller features is rolled out. | Monthly on the 22nd. |
| Patch | For backward-compatible bug fixes that fix incorrect behavior. See [Patch releases](#patch-releases). | As needed. |
diff --git a/doc/public_access/public_access.md b/doc/public_access/public_access.md
index 1b4e1e64562..e0b07abd4e9 100644
--- a/doc/public_access/public_access.md
+++ b/doc/public_access/public_access.md
@@ -1,13 +1,13 @@
---
-stage: none
-group: unassigned
+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/engineering/ux/technical-writing/#assignments
type: reference
---
-# Project and group visibility
+# Project and group visibility **(FREE)**
-GitLab allows [Owners](../user/permissions.md) to set a project's or group's visibility as:
+GitLab allows users with the Owner [role](../user/permissions.md) to set a project's or group's visibility as:
- **Public**
- **Internal**
@@ -24,7 +24,7 @@ Public projects can be cloned **without any** authentication over HTTPS.
They are listed in the public access directory (`/public`) for all users.
-**Any signed-in user** has the [Guest role](../user/permissions.md) on the repository.
+**Any signed-in user** has the Guest [role](../user/permissions.md) on the repository.
NOTE:
By default, `/public` is visible to unauthenticated users. However, if the
@@ -39,7 +39,7 @@ Internal projects can be cloned by any signed-in user except
They are also listed in the public access directory (`/public`), but only for signed-in users.
Any signed-in users except [external users](../user/permissions.md#external-users) have the
-[Guest role](../user/permissions.md) on the repository.
+Guest [role](../user/permissions.md) on the repository.
NOTE:
From July 2019, the `Internal` visibility setting is disabled for new projects, groups,
@@ -57,7 +57,7 @@ They appear in the public access directory (`/public`) for project members only.
Prerequisite:
-- You must have the Owner role for a project.
+- You must have the Owner [role](../user/permissions.md) for a project.
1. On the top bar, select **Menu > Projects** and find your project.
1. On the left sidebar, select **Settings > General**.
@@ -69,7 +69,7 @@ Prerequisite:
Prerequisite:
-- You must have the Owner role for a group.
+- You must have the Owner [role](../user/permissions.md) for a group.
1. On the top bar, select **Menu > Groups** and find your project.
1. On the left sidebar, select **Settings > General**.
@@ -77,11 +77,11 @@ Prerequisite:
1. Under **Visibility level** select either **Private**, **Internal**, or **Public**.
1. Select **Save changes**.
-## Restrict use of public or internal projects
+## Restrict use of public or internal projects **(FREE SELF)**
You can restrict the use of visibility levels for users when they create a project or a snippet.
This is useful to prevent users from publicly exposing their repositories by accident. The
-restricted visibility settings do not apply to admin users.
+restricted visibility settings do not apply to administrators.
For details, see [Restricted visibility levels](../user/admin_area/settings/visibility_and_access_controls.md#restrict-visibility-levels).
diff --git a/doc/push_rules/push_rules.md b/doc/push_rules/push_rules.md
index 9a8c0d79395..3d0e4fdbe49 100644
--- a/doc/push_rules/push_rules.md
+++ b/doc/push_rules/push_rules.md
@@ -49,7 +49,7 @@ branch name.
Your developers may not remember that policy, so they might push to
various branches, and CI pipelines might not work as expected. By restricting the
branch names globally in Push Rules, such mistakes are prevented.
-Any branch name that doesn't match your push rule is rejected.
+All branch names that don't match your push rule are rejected.
Note that the name of your default branch is always allowed, regardless of the branch naming
regular expression (regex) specified. GitLab is configured this way
@@ -73,7 +73,7 @@ Some example regular expressions you can use in push rules:
By default, GitLab restricts certain formats of branch names for security purposes.
40-character hexadecimal names, similar to Git commit hashes, are prohibited.
-### Custom Push Rules **(FREE SELF)**
+### Custom Push Rules **(PREMIUM SELF)**
It's possible to create custom push rules rather than the push rules available in
**Admin Area > Push Rules** by using more advanced server hooks.
@@ -104,12 +104,12 @@ The following options are available:
|---------------------------------|-------------|
| Removal of tags with `git push` | Forbid users to remove Git tags with `git push`. Tags can be deleted through the web UI. |
| Check whether the commit author is a GitLab user | Restrict commits to existing GitLab users (checked against their emails). |
-| Reject unverified users **(PREMIUM)** | GitLab rejects any commit that was not committed by an authenticated user. |
-| Check whether commit is signed through GPG **(PREMIUM)** | Reject commit when it is not signed through GPG. Read [signing commits with GPG](../user/project/repository/gpg_signed_commits/index.md). |
+| Reject unverified users | GitLab rejects any commit that was not committed by an authenticated user. |
+| Check whether commit is signed through GPG | Reject commit when it is not signed through GPG. Read [signing commits with GPG](../user/project/repository/gpg_signed_commits/index.md). |
| Prevent pushing secret files | GitLab rejects any files that are likely to contain secrets. See the [forbidden file names](#prevent-pushing-secrets-to-the-repository). |
| Require expression in commit messages | Only commit messages that match this regular expression are allowed to be pushed. Leave empty to allow any commit message. Uses multiline mode, which can be disabled using `(?-m)`. |
| Reject expression in commit messages | Only commit messages that do not match this regular expression are allowed to be pushed. Leave empty to allow any commit message. Uses multiline mode, which can be disabled using `(?-m)`. |
-| Restrict by branch name | Only branch names that match this regular expression are allowed to be pushed. Leave empty to allow any branch name. |
+| Restrict by branch name | Only branch names that match this regular expression are allowed to be pushed. Leave empty to allow all branch names. |
| Restrict by commit author's email | Only commit author's email that match this regular expression are allowed to be pushed. Leave empty to allow any email. |
| Prohibited file names | Any committed filenames that match this regular expression and do not already exist in the repository are not allowed to be pushed. Leave empty to allow any filenames. See [common examples](#prohibited-file-names). |
| Maximum file size | Pushes that contain added or updated files that exceed this file size (in MB) are rejected. Set to 0 to allow files of any size. Files tracked by Git LFS are exempted. |
@@ -117,7 +117,7 @@ The following options are available:
NOTE:
GitLab uses [RE2 syntax](https://github.com/google/re2/wiki/Syntax) for regular expressions in push rules, and you can test them at the [regex101 regex tester](https://regex101.com/).
-### Caveat to "Reject unsigned commits" push rule **(PREMIUM)**
+### Caveat to "Reject unsigned commits" push rule
This push rule ignores commits that are authenticated and created by GitLab
(either through the UI or API). When the **Reject unsigned commits** push rule is
diff --git a/doc/raketasks/backup_restore.md b/doc/raketasks/backup_restore.md
index b6f772dee17..89b727cf570 100644
--- a/doc/raketasks/backup_restore.md
+++ b/doc/raketasks/backup_restore.md
@@ -61,7 +61,7 @@ including:
- Container Registry images
- GitLab Pages content
- Snippets
-- Group wikis **(PREMIUM)**
+- [Group wikis](../user/project/wiki/index.md#group-wikis)
Backups do not include:
@@ -1129,14 +1129,14 @@ GitLab backup script to be too slow. If your GitLab instance has a lot of forked
projects, the regular backup task also duplicates the Git data for all of them.
In these cases, consider using file system snapshots as part of your backup strategy.
-Example: Amazon EBS
+Example: Amazon Elastic Block Store (EBS)
> A GitLab server using Omnibus GitLab hosted on Amazon AWS.
> An EBS drive containing an ext4 file system is mounted at `/var/opt/gitlab`.
> In this case you could make an application backup by taking an EBS snapshot.
> The backup includes all repositories, uploads and PostgreSQL data.
-Example: LVM snapshots + rsync
+Example: Logical Volume Manager (LVM) snapshots + rsync
> A GitLab server using Omnibus GitLab, with an LVM logical volume mounted at `/var/opt/gitlab`.
> Replicating the `/var/opt/gitlab` directory using rsync would not be reliable because too many files would change while rsync is running.
@@ -1172,7 +1172,7 @@ For manually backing up the Git repository data on disk, there are multiple poss
Git repositories must be copied in a consistent way. They should not be copied during concurrent write
operations, as this can lead to inconsistencies or corruption issues. For more details,
-[issue 270422](https://gitlab.com/gitlab-org/gitlab/-/issues/270422 "Provide documentation on preferred method of migrating Gitaly servers")
+[issue #270422](https://gitlab.com/gitlab-org/gitlab/-/issues/270422 "Provide documentation on preferred method of migrating Gitaly servers")
has a longer discussion explaining the potential problems.
To prevent writes to the Git repository data, there are two possible approaches:
@@ -1335,11 +1335,11 @@ that contain required, sensitive information. If the key is lost, GitLab can't
decrypt those columns, preventing access to the following items:
- [CI/CD variables](../ci/variables/index.md)
-- [Kubernetes / GCP integration](../user/project/clusters/index.md)
+- [Kubernetes / GCP integration](../user/infrastructure/clusters/index.md)
- [Custom Pages domains](../user/project/pages/custom_domains_ssl_tls_certification/index.md)
- [Project error tracking](../operations/error_tracking.md)
- [Runner authentication](../ci/runners/index.md)
-- [Project mirroring](../user/project/repository/repository_mirroring.md)
+- [Project mirroring](../user/project/repository/mirror/index.md)
- [Web hooks](../user/project/integrations/webhooks.md)
In cases like CI/CD variables and runner authentication, you can experience
@@ -1517,7 +1517,7 @@ err.message="unknown error"
This issue is caused by the restore running as the unprivileged user `git`,
which is unable to assign the correct ownership to the registry files during
-the restore process ([issue 62759](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/62759 "Incorrect permissions on registry filesystem after restore")).
+the restore process ([issue #62759](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/62759 "Incorrect permissions on registry filesystem after restore")).
To get your registry working again:
@@ -1548,7 +1548,7 @@ If this happens, examine the following:
- If NFS is being used, check if the mount option `timeout` is set. The
default is `600`, and changing this to smaller values results in this error.
-### `gitaly-backup` for repository backup and restore **(FREE SELF)**
+### `gitaly-backup` for repository backup and restore
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/333034) in GitLab 14.2.
> - [Deployed behind a feature flag](../user/feature_flags.md), enabled by default.
diff --git a/doc/raketasks/index.md b/doc/raketasks/index.md
index df71b8791f8..80aa52ed5a4 100644
--- a/doc/raketasks/index.md
+++ b/doc/raketasks/index.md
@@ -12,7 +12,7 @@ common administration and operational processes.
You can perform GitLab Rake tasks by using:
-- `gitlab-rake <raketask>` for [Omnibus GitLab](https://docs.gitlab.com/omnibus/README.html)
+- `gitlab-rake <raketask>` for [Omnibus GitLab](https://docs.gitlab.com/omnibus/index.html)
installations.
- `bundle exec rake <raketask>` for [source](../install/installation.md)
installations.
@@ -51,3 +51,14 @@ The following Rake tasks are available for use with GitLab:
| [User management](user_management.md) | Perform user management tasks. |
| [Webhooks administration](web_hooks.md) | Maintain project webhooks. |
| [X.509 signatures](x509_signatures.md) | Update X.509 commit signatures, which can be useful if the certificate store changed. |
+
+To list all available Rake tasks:
+
+```shell
+# Omnibus GitLab
+sudo gitlab-rake -vT
+
+# Installations from source
+cd /home/git/gitlab
+sudo -u git -H bundle exec rake -vT RAILS_ENV=production
+```
diff --git a/doc/raketasks/user_management.md b/doc/raketasks/user_management.md
index 08f0005883b..f63c35ab475 100644
--- a/doc/raketasks/user_management.md
+++ b/doc/raketasks/user_management.md
@@ -32,7 +32,7 @@ sudo gitlab-rake gitlab:import:all_users_to_all_projects
bundle exec rake gitlab:import:all_users_to_all_projects RAILS_ENV=production
```
-Admin users are added as maintainers.
+Administrators are added as maintainers.
## Add user as a developer to all groups
diff --git a/doc/security/README.md b/doc/security/README.md
deleted file mode 100644
index 0e6c2f63f9e..00000000000
--- a/doc/security/README.md
+++ /dev/null
@@ -1,9 +0,0 @@
----
-redirect_to: 'index.md'
-remove_date: '2021-09-28'
----
-
-This document was moved to [another location](index.md).
-
-<!-- This redirect file can be deleted after 2021-09-28. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/#move-or-rename-a-page -->
diff --git a/doc/security/asset_proxy.md b/doc/security/asset_proxy.md
index d6b85eb5c9f..abeb5c401da 100644
--- a/doc/security/asset_proxy.md
+++ b/doc/security/asset_proxy.md
@@ -1,6 +1,6 @@
---
-stage: none
-group: unassigned
+stage: Manage
+group: Access
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
diff --git a/doc/security/crime_vulnerability.md b/doc/security/crime_vulnerability.md
index a8dee8f589a..801a294dd81 100644
--- a/doc/security/crime_vulnerability.md
+++ b/doc/security/crime_vulnerability.md
@@ -1,6 +1,6 @@
---
-stage: none
-group: unassigned
+stage: Manage
+group: Access
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
type: reference
---
diff --git a/doc/security/index.md b/doc/security/index.md
index 35e93fc2c55..832af93b95e 100644
--- a/doc/security/index.md
+++ b/doc/security/index.md
@@ -1,6 +1,6 @@
---
-stage: none
-group: unassigned
+stage: Manage
+group: Access
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
comments: false
type: index
diff --git a/doc/security/information_exclusivity.md b/doc/security/information_exclusivity.md
index 69223b5edb9..162346c8874 100644
--- a/doc/security/information_exclusivity.md
+++ b/doc/security/information_exclusivity.md
@@ -1,6 +1,6 @@
---
-stage: none
-group: unassigned
+stage: Manage
+group: Access
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
type: concepts
---
@@ -24,7 +24,7 @@ limitation.
You can take steps to prevent unintentional sharing and information
destruction. This limitation is the reason why only certain people are allowed
to [add users to a project](../user/project/members/index.md)
-and why only a GitLab admin can [force push a protected
+and why only a GitLab administrator can [force push a protected
branch](../user/project/protected_branches.md).
<!-- ## Troubleshooting
diff --git a/doc/security/project_import_decompressed_archive_size_limits.md b/doc/security/project_import_decompressed_archive_size_limits.md
index 6510cf459be..3c5099b1f75 100644
--- a/doc/security/project_import_decompressed_archive_size_limits.md
+++ b/doc/security/project_import_decompressed_archive_size_limits.md
@@ -1,6 +1,6 @@
---
-stage: none
-group: unassigned
+stage: Manage
+group: Access
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
type: reference, howto
---
diff --git a/doc/security/rack_attack.md b/doc/security/rack_attack.md
index 4894af1fa19..b0bebc5a956 100644
--- a/doc/security/rack_attack.md
+++ b/doc/security/rack_attack.md
@@ -1,6 +1,6 @@
---
-stage: none
-group: unassigned
+stage: Manage
+group: Access
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
type: reference, howto
---
diff --git a/doc/security/rate_limits.md b/doc/security/rate_limits.md
index 6045dece0c2..4585748ffc2 100644
--- a/doc/security/rate_limits.md
+++ b/doc/security/rate_limits.md
@@ -1,6 +1,6 @@
---
-stage: none
-group: unassigned
+stage: Manage
+group: Access
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
type: reference, howto
---
@@ -35,6 +35,8 @@ These are rate limits you can set in the Admin Area of your instance:
- [User and IP rate limits](../user/admin_area/settings/user_and_ip_rate_limits.md)
- [Package registry rate limits](../user/admin_area/settings/package_registry_rate_limits.md)
- [Git LFS rate limits](../user/admin_area/settings/git_lfs_rate_limits.md)
+- [Files API rate limits](../user/admin_area/settings/files_api_rate_limits.md)
+- [Deprecated API rate limits](../user/admin_area/settings/deprecated_api_rate_limits.md)
## Non-configurable limits
@@ -51,7 +53,7 @@ The **rate limit** is 5 requests per minute per user.
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/commit/35bc85c3ca093fee58d60dacdc9ed1fd9a15adec) in GitLab 13.4.
-There is a rate limit for [testing webhooks](../user/project/integrations/webhooks.md#testing-webhooks), which prevents abuse of the webhook functionality.
+There is a rate limit for [testing webhooks](../user/project/integrations/webhooks.md#test-a-webhook), which prevents abuse of the webhook functionality.
The **rate limit** is 5 requests per minute per user.
diff --git a/doc/security/reset_user_password.md b/doc/security/reset_user_password.md
index 344cfcae46a..8b89200e1a7 100644
--- a/doc/security/reset_user_password.md
+++ b/doc/security/reset_user_password.md
@@ -5,7 +5,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
type: howto
---
-# How to reset user password
+# How to reset user password **(FREE SELF)**
There are a few ways to reset the password of a user.
@@ -32,7 +32,7 @@ sudo gitlab-rake "gitlab:password:reset[johndoe]"
NOTE:
To reset the default admin password, run this Rake task with the username
-`root`, which is the default username of that admin account.
+`root`, which is the default username of that administrator account.
## Rails console
@@ -110,7 +110,7 @@ password.
If the username was changed to something else and has been forgotten, one
possible way is to reset the password using Rails console with user ID `1` (in
-almost all the cases, the first user is the default admin account).
+almost all the cases, the first user is the default administrator account).
<!-- ## Troubleshooting
diff --git a/doc/security/ssh_keys_restrictions.md b/doc/security/ssh_keys_restrictions.md
index 239949b5568..1f1c7457441 100644
--- a/doc/security/ssh_keys_restrictions.md
+++ b/doc/security/ssh_keys_restrictions.md
@@ -27,7 +27,7 @@ the minimum key length for each technology:
![SSH keys restriction admin settings](img/ssh_keys_restrictions_settings.png)
If a restriction is imposed on any key type, users cannot upload new SSH keys that don't meet the
-requirement. Any existing keys that don't meet it are disabled but not removed and users cannot to
+requirement. Any existing keys that don't meet it are disabled but not removed and users cannot
pull or push code using them.
An icon is visible to the user of a restricted key in the SSH keys section of their profile:
diff --git a/doc/security/token_overview.md b/doc/security/token_overview.md
index 4e72033fd77..2a971b21840 100644
--- a/doc/security/token_overview.md
+++ b/doc/security/token_overview.md
@@ -5,7 +5,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
type: reference
---
-# GitLab Token overview
+# GitLab Token overview **(FREE)**
This document lists tokens used in GitLab, their purpose and, where applicable, security guidance.
@@ -63,7 +63,7 @@ Project maintainers and owners can add or enable a deploy key for a project repo
## Runner registration tokens
-Runner registration tokens are used to [register](https://docs.gitlab.com/runner/register/) a [runner](https://docs.gitlab.com/runner/) with GitLab. Group or project owners or instance admins can obtain them through the GitLab user interface. The registration token is limited to runner registration and has no further scope.
+Runner registration tokens are used to [register](https://docs.gitlab.com/runner/register/) a [runner](https://docs.gitlab.com/runner/) with GitLab. Group or project owners or instance administrators can obtain them through the GitLab user interface. The registration token is limited to runner registration and has no further scope.
You can use the runner registration token to add runners that execute jobs in a project or group. The runner has access to the project's code, so be careful when assigning project and group-level permissions.
diff --git a/doc/security/two_factor_authentication.md b/doc/security/two_factor_authentication.md
index a5b01a1b27d..61b26204599 100644
--- a/doc/security/two_factor_authentication.md
+++ b/doc/security/two_factor_authentication.md
@@ -44,13 +44,13 @@ Gitlab::CurrentSettings.update!('require_two_factor_authentication': false)
## Enforce 2FA for all users in a group **(FREE)**
-> [Introduced in](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/24965) GitLab 12.0, 2FA settings for a group are also applied to subgroups.
+> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/24965) in GitLab 12.0, 2FA settings for a group are also applied to subgroups.
To enforce 2FA only for certain groups:
1. Go to the group's **Settings > General** page.
1. Expand the **Permissions, LFS, 2FA** section.
-1. Select the **Require all users in this group to setup two-factor authentication** option.
+1. Select the **Require all users in this group to set up two-factor authentication** option.
You can also specify a grace period in the **Time before enforced** option.
diff --git a/doc/security/unlock_user.md b/doc/security/unlock_user.md
index da451d96ef9..ceb375a9ad1 100644
--- a/doc/security/unlock_user.md
+++ b/doc/security/unlock_user.md
@@ -1,6 +1,6 @@
---
-stage: none
-group: unassigned
+stage: Manage
+group: Access
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
type: howto
---
diff --git a/doc/security/user_email_confirmation.md b/doc/security/user_email_confirmation.md
index 09e1e09b676..48538e413b4 100644
--- a/doc/security/user_email_confirmation.md
+++ b/doc/security/user_email_confirmation.md
@@ -5,7 +5,7 @@ group: Access
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# User email confirmation at sign-up
+# User email confirmation at sign-up **(FREE SELF)**
GitLab can be configured to require confirmation of a user's email address when
the user signs up. When this setting is enabled, the user is unable to sign in until
diff --git a/doc/security/user_file_uploads.md b/doc/security/user_file_uploads.md
index bce2aeb88b4..7a8a78cc5f8 100644
--- a/doc/security/user_file_uploads.md
+++ b/doc/security/user_file_uploads.md
@@ -5,7 +5,7 @@ group: Access
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# User File Uploads
+# User File Uploads **(FREE)**
Images that are attached to issues, merge requests, or comments
do not require authentication to be viewed if they are accessed directly by URL.
diff --git a/doc/security/webhooks.md b/doc/security/webhooks.md
index c0e5d0695cc..89dd4f8e5fc 100644
--- a/doc/security/webhooks.md
+++ b/doc/security/webhooks.md
@@ -1,6 +1,6 @@
---
-stage: none
-group: unassigned
+stage: Manage
+group: Access
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
type: concepts, reference, howto
---
@@ -74,7 +74,7 @@ allowlist:
The allowed entries can be separated by semicolons, commas or whitespaces
(including newlines) and be in different formats like hostnames, IP addresses and/or
IP ranges. IPv6 is supported. Hostnames that contain Unicode characters should
-use IDNA encoding.
+use Internationalising Domain Names in Applications (IDNA) encoding.
The allowlist can hold a maximum of 1000 entries. Each entry can be a maximum of
255 characters.
diff --git a/doc/ssh/README.md b/doc/ssh/README.md
deleted file mode 100644
index 0e6c2f63f9e..00000000000
--- a/doc/ssh/README.md
+++ /dev/null
@@ -1,9 +0,0 @@
----
-redirect_to: 'index.md'
-remove_date: '2021-09-28'
----
-
-This document was moved to [another location](index.md).
-
-<!-- This redirect file can be deleted after 2021-09-28. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/#move-or-rename-a-page -->
diff --git a/doc/ssh/index.md b/doc/ssh/index.md
index 94c157697ce..2fae3512b9d 100644
--- a/doc/ssh/index.md
+++ b/doc/ssh/index.md
@@ -5,7 +5,7 @@ info: "To determine the technical writer assigned to the Stage/Group associated
type: howto, reference
---
-# GitLab and SSH keys
+# GitLab and SSH keys **(FREE)**
Git is a distributed version control system, which means you can work locally,
then share or "push" your changes to a server. In this case, the server is GitLab.
@@ -213,7 +213,7 @@ To use SSH with GitLab, copy your public key to your GitLab account.
which starts with `ssh-ed25519` or `ssh-rsa`, and may end with a comment.
1. In the **Title** box, type a description, like `Work Laptop` or
`Home Workstation`.
-1. Optional. In the **Expires at** box, select an expiration date. (Introduced in [GitLab 12.9](https://gitlab.com/gitlab-org/gitlab/-/issues/36243).)
+1. Optional. In the **Expires at** box, select an expiration date. ([Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/36243) in GitLab 12.9.)
In:
- GitLab 13.12 and earlier, the expiration date is informational only. It doesn't prevent
you from using the key. Administrators can view expiration dates and use them for
@@ -326,7 +326,7 @@ If you are using [EGit](https://www.eclipse.org/egit/), you can [add your SSH ke
## Use SSH on Microsoft Windows
-If you're running Windows 10, you can either use the [Windows Subsystem for Linux (WSL)](https://docs.microsoft.com/en-us/windows/wsl/install-win10)
+If you're running Windows 10, you can either use the [Windows Subsystem for Linux (WSL)](https://docs.microsoft.com/en-us/windows/wsl/install)
with [WSL 2](https://docs.microsoft.com/en-us/windows/wsl/install-win10#update-to-wsl-2) which
has both `git` and `ssh` preinstalled, or install [Git for Windows](https://gitforwindows.org) to
use SSH through Powershell.
diff --git a/doc/subscriptions/bronze_starter.md b/doc/subscriptions/bronze_starter.md
index 327fb8887ad..bb2a2303d29 100644
--- a/doc/subscriptions/bronze_starter.md
+++ b/doc/subscriptions/bronze_starter.md
@@ -68,7 +68,7 @@ the tiers are no longer mentioned in GitLab documentation:
- [Full code quality reports in the code quality tab](../user/project/merge_requests/code_quality.md#code-quality-reports)
- [Merge request approvals](../user/project/merge_requests/approvals/index.md)
- [Multiple assignees](../user/project/merge_requests/getting_started.md#multiple-assignees)
- - [Approval Rule information for Reviewers](../user/project/merge_requests/reviews/index.md#approval-rule-information-for-reviewers) **(PREMIUM)**
+ - [Approval Rule information for Reviewers](../user/project/merge_requests/reviews/index.md#approval-rule-information-for-reviewers)
- [Required Approvals](../user/project/merge_requests/approvals/index.md#required-approvals)
- [Code Owners as eligible approvers](../user/project/merge_requests/approvals/rules.md#code-owners-as-eligible-approvers)
- [Approval rules](../user/project/merge_requests/approvals/rules.md) features
@@ -89,14 +89,14 @@ the tiers are no longer mentioned in GitLab documentation:
- Repositories:
- [Repository size limit](../user/admin_area/settings/account_and_limit_settings.md#repository-size-limit)
- Repository mirroring:
- - [Pull mirroring](../user/project/repository/repository_mirroring.md#pull-from-a-remote-repository) outside repositories in a GitLab repository
- - [Overwrite diverged branches](../user/project/repository/repository_mirroring.md#overwrite-diverged-branches)
- - [Trigger pipelines for mirror updates](../user/project/repository/repository_mirroring.md#trigger-pipelines-for-mirror-updates)
- - [Hard failures](../user/project/repository/repository_mirroring.md#hard-failure) when mirroring fails
- - [Trigger pull mirroring from the API](../user/project/repository/repository_mirroring.md#trigger-an-update-using-the-api)
- - [Mirror only protected branches](../user/project/repository/repository_mirroring.md#mirror-only-protected-branches)
- - [Bidirectional mirroring](../user/project/repository/repository_mirroring.md#bidirectional-mirroring)
- - [Mirror with Perforce Helix via Git Fusion](../user/project/repository/repository_mirroring.md#mirror-with-perforce-helix-via-git-fusion)
+ - [Pull mirroring](../user/project/repository/mirror/pull.md) outside repositories in a GitLab repository
+ - [Overwrite diverged branches](../user/project/repository/mirror/pull.md#overwrite-diverged-branches)
+ - [Trigger pipelines for mirror updates](../user/project/repository/mirror/pull.md#trigger-pipelines-for-mirror-updates)
+ - [Hard failures](../user/project/repository/mirror/pull.md#hard-failure) when mirroring fails
+ - [Trigger pull mirroring from the API](../user/project/repository/mirror/pull.md#trigger-an-update-by-using-the-api)
+ - [Mirror only protected branches](../user/project/repository/mirror/index.md#mirror-only-protected-branches)
+ - [Bidirectional mirroring](../user/project/repository/mirror/bidirectional.md)
+ - [Mirror with Perforce Helix via Git Fusion](../user/project/repository/mirror/bidirectional.md#mirror-with-perforce-helix-via-git-fusion)
- Runners:
- Run pipelines in the parent project [for merge requests from a forked project](../ci/pipelines/merge_request_pipelines.md#run-pipelines-in-the-parent-project-for-merge-requests-from-a-forked-project)
- [Shared runners pipeline minutes quota](../user/admin_area/settings/continuous_integration.md#shared-runners-pipeline-minutes-quota)
diff --git a/doc/subscriptions/gitlab_com/index.md b/doc/subscriptions/gitlab_com/index.md
index cecbb362cb9..a8e02251b64 100644
--- a/doc/subscriptions/gitlab_com/index.md
+++ b/doc/subscriptions/gitlab_com/index.md
@@ -9,115 +9,85 @@ type: index, reference
GitLab SaaS is the GitLab software-as-a-service offering, which is available at GitLab.com.
You don't need to install anything to use GitLab SaaS, you only need to
-[sign up](https://gitlab.com/users/sign_up).
+[sign up](https://gitlab.com/users/sign_up). When you sign up, you choose:
-This page reviews the details of your GitLab SaaS subscription.
+- [A license tier](https://about.gitlab.com/pricing/).
+- [The number of seats you want](#how-seat-usage-is-determined).
-## Choose a GitLab SaaS tier
-
-Pricing is [tier-based](https://about.gitlab.com/pricing/), so you can choose
-the features that fit your budget. For information on the features available
-for each tier, see the
-[GitLab SaaS feature comparison](https://about.gitlab.com/pricing/gitlab-com/feature-comparison/).
-
-## Choose the number of users
-
-NOTE:
-Applied only to groups.
-
-A GitLab SaaS subscription uses a concurrent (_seat_) model. You pay for a
-subscription according to the maximum number of users enabled at once. You can
-add and remove users during the subscription period, as long as the total users
-at any given time doesn't exceed the subscription count.
-
-Every occupied seat is counted in the subscription, with the following exception:
-
-- Members with Guest permissions on an Ultimate subscription.
-
-NOTE:
-To support the open source community and encourage the development of open
-source projects, GitLab grants access to **Ultimate** features for all GitLab SaaS
-**public** projects, regardless of the subscription. GitLab also provides qualifying
-open source projects with 50,000 CI minutes and free access to the Ultimate tier for
-groups through the [GitLab for Open Source program](https://about.gitlab.com/solutions/open-source/).
+All GitLab SaaS public projects, regardless of the subscription, get access to features in the **Ultimate** tier.
+Qualifying open source projects also get 50,000 CI minutes and free access to the **Ultimate** tier
+through the [GitLab for Open Source program](https://about.gitlab.com/solutions/open-source/).
## Obtain a GitLab SaaS subscription
To subscribe to GitLab SaaS:
-1. Create a user account for yourself using our
+1. View the [GitLab SaaS feature comparison](https://about.gitlab.com/pricing/gitlab-com/feature-comparison/)
+ and decide which tier you want.
+1. Create a user account for yourself by using the
[sign up page](https://gitlab.com/users/sign_up).
-1. Create a [group](../../user/group/index.md). GitLab groups help assemble related
- projects together allowing you to grant members access to several projects
- at once. A group is not required if you plan on having projects inside a personal
- namespace.
+1. Create a [group](../../user/group/index.md#create-a-group). You use the group to grant users access to several projects
+ at once. A group is not required if you plan to have projects in a personal namespace instead.
1. Create additional users and
[add them to the group](../../user/group/index.md#add-users-to-a-group).
-1. Select the GitLab SaaS plan through the
- [Customers Portal](https://customers.gitlab.com/).
-1. Link your GitLab SaaS account with your Customers Portal account.
- Once a plan has been selected, if your account is not
- already linked, GitLab prompts you to link your account with a
- **Sign in to GitLab.com** button.
-1. Select the namespace from the drop-down list to associate the subscription.
-1. Proceed to checkout.
-
-NOTE:
-You can also go to the [**My Account**](https://customers.gitlab.com/customers/edit)
-page to add or change the GitLab SaaS account link.
+1. On the left sidebar, select **Billing** and choose a tier.
+1. Fill out the form to complete your purchase.
## View your GitLab SaaS subscription
-To see the status of your GitLab SaaS subscription, log in to GitLab SaaS and go
-to the **Billing** section:
+Prerequisite:
+
+- You must have the Owner [role](../../user/permissions.md) for the group.
-NOTE:
-You must have Owner level [permissions](../../user/permissions.md) to view the billing page.
+To see the status of your GitLab SaaS subscription:
+
+1. On the top bar, select **Menu > Groups** and find your group.
+1. On the left sidebar, select **Settings > Billing**.
-The following table describes details of your subscription:
+The following information is displayed:
| Field | Description |
|:----------------------------|:------------|
| **Seats in subscription** | If this is a paid plan, represents the number of seats you've bought for this group. |
-| **Seats currently in use** | Number of seats in use. Select **See usage** to see a list of the users using these seats. For more details, see [Seat usage](#seat-usage). |
+| **Seats currently in use** | Number of seats in use. Select **See usage** to see a list of the users using these seats. |
| **Max seats used** | Highest number of seats you've used. |
-| **Seats owed** | _Seats owed_ = _Max seats used_ - _Seats in subscription_. |
+| **Seats owed** | **Max seats used** minus **Seats in subscription**. |
| **Subscription start date** | Date your subscription started. If this is for a Free plan, it's the date you transitioned off your group's paid plan. |
| **Subscription end date** | Date your current subscription ends. Does not apply to Free plans. |
-## Seat usage
+## How seat usage is determined
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/216899) in GitLab 13.5.
> - [Updated](https://gitlab.com/gitlab-org/gitlab/-/issues/292086) in GitLab 13.8 to include public
email address.
-The **Seat usage** page lists all users occupying seats. Details for each user include:
-
-- Full name
-- Username
-- Public email address (if they have provided one in their [user settings](../../user/profile/index.md#access-your-user-settings))
-
-The seat usage listing is updated live, but the usage statistics on the billing page are updated
-only once per day. For this reason there can be a minor difference between the seat usage listing
-and the billing page.
+A GitLab SaaS subscription uses a concurrent (_seat_) model. You pay for a
+subscription according to the maximum number of users enabled at one time. You can
+add and remove users during the subscription period, as long as the total users
+at any given time doesn't exceed the subscription count.
Every user is included in seat usage, with the following exceptions:
- Users who are pending approval.
- Members with the Guest role on an Ultimate subscription.
-- Users without project or group memberships on an Ultimate subscription.
- GitLab-created service accounts: `Ghost User` and bots
([`Support Bot`](../../user/project/service_desk.md#support-bot-user),
[`Project bot users`](../../user/project/settings/project_access_tokens.md#project-bot-users), and
so on.)
+Seat usage is reviewed [quarterly or annually](../quarterly_reconciliation.md).
+
### View seat usage
To view a list of seats being used:
1. On the top bar, select **Menu > Groups** and find your group.
1. On the left sidebar, select **Settings > Usage Quotas**.
-1. Under the **Seats** tab, view usage information.
+1. On the **Seats** tab, view usage information.
+
+The seat usage listing is updated live, but the usage statistics on the billing page are updated
+only once per day. For this reason there can be a minor difference between the seat usage listing
+and the billing page.
### Search seat usage
@@ -149,53 +119,14 @@ To export seat usage data as a CSV file:
The generated list contains all seats being used,
and is not affected by the current search.
-## Subscription expiry
+## Seats owed
-When your subscription expires, you can continue to use paid features of GitLab for 14 days.
-On the 15th day, paid features are no longer available. You can
-continue to use free features.
+A GitLab subscription is valid for a specific number of users.
-To resume paid feature functionality, purchase a new subscription.
+If the number of billable users exceeds the number included in the subscription, known
+as the number of **seats owed**, you must pay for the excess number of users before renewal.
-## Renew your GitLab SaaS subscription
-
-To renew your subscription:
-
-1. [Prepare for renewal by reviewing your account.](#prepare-for-renewal-by-reviewing-your-account)
-1. [Renew your GitLab SaaS subscription.](#renew-or-change-a-gitlab-saas-subscription)
-
-### Prepare for renewal by reviewing your account
-
-The [Customers Portal](https://customers.gitlab.com/customers/sign_in) is your
-tool for renewing and modifying your subscription. Before going ahead with renewal,
-log in and verify or update:
-
-- The invoice contact details on the **Account details** page.
-- The credit card on file on the **Payment Methods** page.
-
-NOTE:
-Contact our [support team](https://support.gitlab.com/hc/en-us/requests/new?ticket_form_id=360000071293)
-if you need assistance accessing the Customers Portal or if you need to change
-the contact person who manages your subscription.
-
-It's important to regularly review your user accounts, because:
-
-- A GitLab subscription is based on the number of users. You could pay more than
- you should if you renew for too many users, while the renewal fails if you
- attempt to renew a subscription for too few users.
-- Stale user accounts can be a security risk. A regular review helps reduce this risk.
-
-#### Seats owed
-
-A GitLab subscription is valid for a specific number of users. For details, see
-[Choose the number of users](#choose-the-number-of-users).
-
-If the number of [billable users](#view-your-gitlab-saas-subscription) exceeds the number included in the subscription, known
-as the number of _seats owed_, you must pay for the excess number of users before renewal.
-
-##### Seats owed example
-
-You purchase a subscription for 10 users.
+For example, if you purchase a subscription for 10 users:
| Event | Billable members | Maximum users |
|:---------------------------------------------------|:-----------------|:--------------|
@@ -205,44 +136,7 @@ You purchase a subscription for 10 users.
Seats owed = 12 - 10 (Maximum users - users in subscription)
-### Renew or change a GitLab SaaS subscription
-
-Starting 30 days before a subscription expires, GitLab notifies group owners
-of the date of expiry with a banner in the GitLab user interface.
-
-We recommend following these steps during renewal:
-
-1. Prune any [inactive or unwanted users](#remove-billable-user).
-1. Determine if you have a need for user growth in the upcoming subscription.
-1. Log in to the [Customers Portal](https://customers.gitlab.com/customers/sign_in) and beneath your existing subscription, select the **Renew** button.
-1. Review your renewal details and complete the payment process.
-1. Select **Confirm purchase**.
-
-Your updated subscription is applied to your namespace on the renewal period start date.
-
-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.
-
-For details on upgrading your subscription tier, see
-[Upgrade your GitLab SaaS subscription tier](#upgrade-your-gitlab-saas-subscription-tier).
-
-#### Automatic renewal
-
-To view or change automatic subscription renewal (at the same tier as the
-previous period), log in to the [Customers Portal](https://customers.gitlab.com/customers/sign_in), and:
-
-- If you see a **Resume subscription** button, your subscription was canceled
- previously. Click it to resume automatic renewal.
-- If you see **Cancel subscription**, your subscription is set to automatically
- renew at the end of the subscription period. Click it to cancel automatic renewal.
-
-With automatic renewal enabled, the subscription automatically renews on the
-expiration date without a gap in available service. An invoice is
-generated for the renewal and available for viewing or download in 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.
-
-## Add users to your subscription
+### Add users to your subscription
You can add users to your subscription at any time during the subscription period. The cost of
additional users added during the subscription period is prorated from the date of purchase through
@@ -264,6 +158,21 @@ The following is emailed to you:
- A payment receipt. You can also access this information in the Customers Portal under
[**View invoices**](https://customers.gitlab.com/receipts).
+### Remove users from your subscription
+
+To remove a billable user from your subscription:
+
+1. On the top bar, select **Menu > Groups** and find your group.
+1. On the left sidebar, select **Settings > Billing**.
+1. In the **Seats currently in use** section, select **See usage**.
+1. In the row for the user you want to remove, on the right side, select the ellipsis and **Remove user**.
+1. Re-type the username and select **Remove user**.
+
+If you add a member to a group by using the [share a group with another group](../../user/group/index.md#share-a-group-with-another-group) feature, you can't remove the member by using this method. Instead, you can either:
+
+- Remove the member from the shared group. You must be a group owner to do this.
+- From the group's membership page, remove access from the entire shared group.
+
## Upgrade your GitLab SaaS subscription tier
To upgrade your [GitLab tier](https://about.gitlab.com/pricing/):
@@ -278,26 +187,73 @@ To upgrade your [GitLab tier](https://about.gitlab.com/pricing/):
When the purchase has been processed, you receive confirmation of your new subscription tier.
-## See your subscription and billable users in GitLab.com
+## Subscription expiry
-To view information about your subscription and occupied seats:
+When your subscription expires, you can continue to use paid features of GitLab for 14 days.
+On the 15th day, paid features are no longer available. You can
+continue to use free features.
-1. Go to your group's **Settings > Billing** page.
-1. In the **Seats currently in use** area, select **See usage**.
+To resume paid feature functionality, purchase a new subscription.
-### Remove billable user
+## Renew your GitLab SaaS subscription
-To remove a billable user:
+To renew your subscription:
-1. Go to your group's **Settings > Billing** page.
-1. In the **Seats currently in use** area, select **See usage**.
-1. In the row for the user you want to remove, on the right side, select the ellipsis and **Remove user**.
-1. Re-type the username and select **Remove user**.
+1. [Prepare for renewal by reviewing your account.](#prepare-for-renewal-by-reviewing-your-account)
+1. [Renew your GitLab SaaS subscription.](#renew-or-change-a-gitlab-saas-subscription)
-If you add a member to a group by using the [share a group with another group](../../user/group/index.md#share-a-group-with-another-group) feature, you can't remove the member by using this method. Instead, you can either:
+### Prepare for renewal by reviewing your account
-- Remove the member from the shared group. You must be a group owner to do this.
-- From the group's membership page, remove access from the entire shared group.
+Before you renew your subscription:
+
+1. Log in to the [Customers Portal](https://customers.gitlab.com/customers/sign_in).
+1. On the **Account details** page, verify or update the invoice contact details.
+1. On the **Payment Methods** page, verify or update the credit card on file.
+1. In GitLab, review your list of user accounts and [remove inactive or unwanted users](#remove-users-from-your-subscription).
+
+### Renew or change a GitLab SaaS subscription
+
+Starting 30 days before a subscription expires, GitLab notifies group owners
+of the date of expiry with a banner in the GitLab user interface.
+
+To renew your subscription:
+
+1. Log in to the [Customers Portal](https://customers.gitlab.com/customers/sign_in) and beneath your existing subscription, select **Renew**.
+1. Review your renewal details and complete the payment process.
+1. Select **Confirm purchase**.
+
+Your updated subscription is applied to your namespace on the renewal period start date.
+
+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 the [Support team](https://support.gitlab.com/hc/en-us/requests/new?ticket_form_id=360000071293) for assistance.
+
+For details on upgrading your subscription tier, see
+[Upgrade your GitLab SaaS subscription tier](#upgrade-your-gitlab-saas-subscription-tier).
+
+### Automatic renewal
+
+When you enable automatic renewal, the subscription automatically renews on the
+expiration date without a gap in available service. An invoice is
+generated for the renewal and available for viewing or download on the
+[View invoices](https://customers.gitlab.com/receipts) page.
+
+#### Enable automatic renewal
+
+To view or change automatic subscription renewal (at the same tier as the
+previous period), log 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. Click 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. Click 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.
+
+## Change the contact person for your subscription
+
+To change the contact person who manages your subscription,
+contact the GitLab [Support team](https://support.gitlab.com/hc/en-us/requests/new?ticket_form_id=360000071293).
## CI pipeline minutes
@@ -389,7 +345,8 @@ Be aware that:
be charged for less than one year because your subscription was previously
created with the extra CI minutes.
- After the extra CI minutes have been assigned to a Group, they can't be transferred
- to a different Group.
+ to a different Group by themselves, but they will transfer along with a subscription when
+ changing the linked namespace for the subscription.
- If you have used more minutes than your default quota, these minutes will
be deducted from your Additional Minutes quota immediately after your purchase of additional
minutes.
@@ -426,11 +383,6 @@ To purchase more storage for either a personal or group namespace:
The **Purchased storage available** total is incremented by the amount purchased. All locked
projects are unlocked and their excess usage is deducted from the additional storage.
-## Customers Portal
-
-The GitLab [Customers Portal](../index.md#customers-portal) enables you to manage your subscriptions
-and account details.
-
## Contact Support
Learn more about:
@@ -438,7 +390,7 @@ Learn more about:
- The tiers of [GitLab Support](https://about.gitlab.com/support/).
- [Submit a request via the Support Portal](https://support.gitlab.com/hc/en-us/requests/new).
-We also encourage all users to search our project trackers for known issues and
+We also encourage you to search our project trackers for known issues and
existing feature requests in the [GitLab](https://gitlab.com/gitlab-org/gitlab/-/issues/) project.
These issues are the best avenue for getting updates on specific product plans
diff --git a/doc/subscriptions/quarterly_reconciliation.md b/doc/subscriptions/quarterly_reconciliation.md
index f9cca079e76..cdac50748d0 100644
--- a/doc/subscriptions/quarterly_reconciliation.md
+++ b/doc/subscriptions/quarterly_reconciliation.md
@@ -4,22 +4,24 @@ group: Purchase
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# The quarterly subscription reconciliation process
+# Quarterly reconciliation and annual true-ups **(PREMIUM)**
-GitLab reviews your seat usage every quarter and sends you an invoice for
-any overages.
+GitLab reviews your seat usage and sends you an invoice for any overages.
+This review can occur:
-Annual reviews, also known as the [annual true-up process](self_managed/index.md#users-over-license),
-require you to pay the full annual subscription fee for users added anytime during the year. With quarterly
-reviews, you only pay for the remaining period of your subscription term.
+- **Annually**, also known as the annual true-up process. This process requires you to pay the full annual subscription fee
+ for users added anytime during the year.
+- **Quarterly**. With this process, you only pay for the remaining period of your subscription term.
-For example, if you add users in the third quarter of your subscription term, you only
-pay 25% of what you would have paid previously. This results in substantial savings.
+## Quarterly reconciliation process
+
+With the quarterly reconciliation process, if you add users in the third quarter of your subscription term, for example,
+you only pay 25% of what you would have paid previously. This calculation results in substantial savings.
If it's not possible for you to participate in quarterly reconciliations, you can opt out of the
process by using a contract amendment. In that case, you default to the annual review.
-## Timeline for invoicing and payment
+## Timeline for quarterly invoicing and payment
At the end of each subscription quarter, GitLab notifies you about overages.
The date you're notified about the overage is not the same as the date
@@ -28,7 +30,7 @@ you are billed.
### GitLab SaaS
Group owners receive an email **on the reconciliation date**.
-The email communicates the [overage seat quantity](gitlab_com/index.md#seats-owed-example)
+The email communicates the [overage seat quantity](gitlab_com/index.md#seats-owed)
and expected invoice amount.
**Seven days later**, the subscription is updated to include the additional
diff --git a/doc/subscriptions/self_managed/index.md b/doc/subscriptions/self_managed/index.md
index 72bd1c2b4f7..acdbdefc671 100644
--- a/doc/subscriptions/self_managed/index.md
+++ b/doc/subscriptions/self_managed/index.md
@@ -25,8 +25,8 @@ changes to their subscription.
The cost of a GitLab self-managed subscription is determined by the following:
-- GitLab tier
-- Subscription seats
+- [GitLab tier](https://about.gitlab.com/pricing/)
+- [Subscription seats](#subscription-seats)
## Choose a GitLab tier
@@ -108,6 +108,7 @@ GitLab has several features which can help you manage the number of users:
- Enable the [**Require administrator approval for new sign ups**](../../user/admin_area/settings/sign_up_restrictions.md#require-administrator-approval-for-new-sign-ups)
option.
+- Enable `block_auto_created_users` for new sign-ups via [LDAP](../../administration/auth/ldap/index.md#basic-configuration-settings) or [OmniAuth](../../integration/omniauth.md#initial-omniauth-configuration).
- Enable the [User cap](../../user/admin_area/settings/sign_up_restrictions.md#user-cap)
option. **Available in GitLab 13.7 and later**.
- [Disable new sign-ups](../../user/admin_area/settings/sign_up_restrictions.md), and instead manage new
diff --git a/doc/system_hooks/system_hooks.md b/doc/system_hooks/system_hooks.md
index 7dd0701329d..fbeee7b96bc 100644
--- a/doc/system_hooks/system_hooks.md
+++ b/doc/system_hooks/system_hooks.md
@@ -5,7 +5,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
type: reference
---
-# System hooks
+# System hooks **(FREE SELF)**
Your GitLab instance can perform HTTP POST requests on the following events:
@@ -173,7 +173,7 @@ Please refer to `group_rename` and `user_rename` for that case.
"user_name": "John Smith",
"user_username": "johnsmith",
"user_id": 41,
- "project_visibility": "visibilitylevel|private"
+ "project_visibility": "private"
}
```
@@ -193,7 +193,7 @@ Please refer to `group_rename` and `user_rename` for that case.
"user_name": "John Smith",
"user_username": "johnsmith",
"user_id": 41,
- "project_visibility": "visibilitylevel|private"
+ "project_visibility": "private"
}
```
@@ -213,7 +213,7 @@ Please refer to `group_rename` and `user_rename` for that case.
"user_name": "John Smith",
"user_username": "johnsmith",
"user_id": 41,
- "project_visibility": "visibilitylevel|private"
+ "project_visibility": "private"
}
```
@@ -519,7 +519,7 @@ X-Gitlab-Event: System Hook
}
```
-### Merge request events
+## Merge request events
Triggered when a new merge request is created, an existing merge request was
updated/merged/closed or a commit is added in the source branch.
@@ -533,101 +533,89 @@ X-Gitlab-Event: System Hook
```json
{
"object_kind": "merge_request",
+ "event_type": "merge_request",
"user": {
"id": 1,
"name": "Administrator",
"username": "root",
- "avatar_url": "http://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=80&d=identicon",
+ "avatar_url": "http://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=40\u0026d=identicon",
"email": "admin@example.com"
},
"project": {
- "name": "Example",
- "description": "",
- "web_url": "http://example.com/jsmith/example",
- "avatar_url": null,
- "git_ssh_url": "git@example.com:jsmith/example.git",
- "git_http_url": "http://example.com/jsmith/example.git",
- "namespace": "Jsmith",
- "visibility_level": 0,
- "path_with_namespace": "jsmith/example",
- "default_branch": "master",
- "ci_config_path": "",
- "homepage": "http://example.com/jsmith/example",
- "url": "git@example.com:jsmith/example.git",
- "ssh_url": "git@example.com:jsmith/example.git",
- "http_url": "http://example.com/jsmith/example.git"
+ "id": 1,
+ "name":"Gitlab Test",
+ "description":"Aut reprehenderit ut est.",
+ "web_url":"http://example.com/gitlabhq/gitlab-test",
+ "avatar_url":null,
+ "git_ssh_url":"git@example.com:gitlabhq/gitlab-test.git",
+ "git_http_url":"http://example.com/gitlabhq/gitlab-test.git",
+ "namespace":"GitlabHQ",
+ "visibility_level":20,
+ "path_with_namespace":"gitlabhq/gitlab-test",
+ "default_branch":"master",
+ "homepage":"http://example.com/gitlabhq/gitlab-test",
+ "url":"http://example.com/gitlabhq/gitlab-test.git",
+ "ssh_url":"git@example.com:gitlabhq/gitlab-test.git",
+ "http_url":"http://example.com/gitlabhq/gitlab-test.git"
+ },
+ "repository": {
+ "name": "Gitlab Test",
+ "url": "http://example.com/gitlabhq/gitlab-test.git",
+ "description": "Aut reprehenderit ut est.",
+ "homepage": "http://example.com/gitlabhq/gitlab-test"
},
"object_attributes": {
- "id": 90,
+ "id": 99,
"target_branch": "master",
"source_branch": "ms-viewport",
"source_project_id": 14,
"author_id": 51,
"assignee_id": 6,
"title": "MS-Viewport",
- "created_at": "2017-09-20T08:31:45.944Z",
- "updated_at": "2017-09-28T12:23:42.365Z",
+ "created_at": "2013-12-03T17:23:34Z",
+ "updated_at": "2013-12-03T17:23:34Z",
"milestone_id": null,
"state": "opened",
"merge_status": "unchecked",
"target_project_id": 14,
"iid": 1,
"description": "",
- "updated_by_id": 1,
- "merge_error": null,
- "merge_params": {
- "force_remove_source_branch": "0"
- },
- "merge_when_pipeline_succeeds": false,
- "merge_user_id": null,
- "merge_commit_sha": null,
- "deleted_at": null,
- "in_progress_merge_commit_sha": null,
- "lock_version": 5,
- "time_estimate": 0,
- "last_edited_at": "2017-09-27T12:43:37.558Z",
- "last_edited_by_id": 1,
- "head_pipeline_id": 61,
- "ref_fetched": true,
- "merge_jid": null,
"source": {
- "name": "Awesome Project",
- "description": "",
- "web_url": "http://example.com/awesome_space/awesome_project",
- "avatar_url": null,
- "git_ssh_url": "git@example.com:awesome_space/awesome_project.git",
- "git_http_url": "http://example.com/awesome_space/awesome_project.git",
- "namespace": "root",
- "visibility_level": 0,
- "path_with_namespace": "awesome_space/awesome_project",
- "default_branch": "master",
- "ci_config_path": "",
- "homepage": "http://example.com/awesome_space/awesome_project",
- "url": "http://example.com/awesome_space/awesome_project.git",
- "ssh_url": "git@example.com:awesome_space/awesome_project.git",
- "http_url": "http://example.com/awesome_space/awesome_project.git"
+ "name":"Awesome Project",
+ "description":"Aut reprehenderit ut est.",
+ "web_url":"http://example.com/awesome_space/awesome_project",
+ "avatar_url":null,
+ "git_ssh_url":"git@example.com:awesome_space/awesome_project.git",
+ "git_http_url":"http://example.com/awesome_space/awesome_project.git",
+ "namespace":"Awesome Space",
+ "visibility_level":20,
+ "path_with_namespace":"awesome_space/awesome_project",
+ "default_branch":"master",
+ "homepage":"http://example.com/awesome_space/awesome_project",
+ "url":"http://example.com/awesome_space/awesome_project.git",
+ "ssh_url":"git@example.com:awesome_space/awesome_project.git",
+ "http_url":"http://example.com/awesome_space/awesome_project.git"
},
"target": {
- "name": "Awesome Project",
- "description": "Aut reprehenderit ut est.",
- "web_url": "http://example.com/awesome_space/awesome_project",
- "avatar_url": null,
- "git_ssh_url": "git@example.com:awesome_space/awesome_project.git",
- "git_http_url": "http://example.com/awesome_space/awesome_project.git",
- "namespace": "Awesome Space",
- "visibility_level": 0,
- "path_with_namespace": "awesome_space/awesome_project",
- "default_branch": "master",
- "ci_config_path": "",
- "homepage": "http://example.com/awesome_space/awesome_project",
- "url": "http://example.com/awesome_space/awesome_project.git",
- "ssh_url": "git@example.com:awesome_space/awesome_project.git",
- "http_url": "http://example.com/awesome_space/awesome_project.git"
+ "name":"Awesome Project",
+ "description":"Aut reprehenderit ut est.",
+ "web_url":"http://example.com/awesome_space/awesome_project",
+ "avatar_url":null,
+ "git_ssh_url":"git@example.com:awesome_space/awesome_project.git",
+ "git_http_url":"http://example.com/awesome_space/awesome_project.git",
+ "namespace":"Awesome Space",
+ "visibility_level":20,
+ "path_with_namespace":"awesome_space/awesome_project",
+ "default_branch":"master",
+ "homepage":"http://example.com/awesome_space/awesome_project",
+ "url":"http://example.com/awesome_space/awesome_project.git",
+ "ssh_url":"git@example.com:awesome_space/awesome_project.git",
+ "http_url":"http://example.com/awesome_space/awesome_project.git"
},
"last_commit": {
- "id": "ba3e0d8ff79c80d5b0bbb4f3e2e343e0aaa662b7",
+ "id": "da1560886d4f094c3e6c9ef40349f7d38b5d27d7",
"message": "fixed readme",
- "timestamp": "2017-09-26T16:12:57Z",
+ "timestamp": "2012-01-03T23:36:29+02:00",
"url": "http://example.com/awesome_space/awesome_project/commits/da1560886d4f094c3e6c9ef40349f7d38b5d27d7",
"author": {
"name": "GitLab dev user",
@@ -635,16 +623,61 @@ X-Gitlab-Event: System Hook
}
},
"work_in_progress": false,
- "total_time_spent": 0,
- "human_total_time_spent": null,
- "human_time_estimate": null
+ "url": "http://example.com/diaspora/merge_requests/1",
+ "action": "open",
+ "assignee": {
+ "name": "User1",
+ "username": "user1",
+ "avatar_url": "http://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=40\u0026d=identicon"
+ }
},
- "labels": null,
- "repository": {
- "name": "git-gpg-test",
- "url": "git@example.com:awesome_space/awesome_project.git",
- "description": "",
- "homepage": "http://example.com/awesome_space/awesome_project"
+ "labels": [{
+ "id": 206,
+ "title": "API",
+ "color": "#ffffff",
+ "project_id": 14,
+ "created_at": "2013-12-03T17:15:43Z",
+ "updated_at": "2013-12-03T17:15:43Z",
+ "template": false,
+ "description": "API related issues",
+ "type": "ProjectLabel",
+ "group_id": 41
+ }],
+ "changes": {
+ "updated_by_id": {
+ "previous": null,
+ "current": 1
+ },
+ "updated_at": {
+ "previous": "2017-09-15 16:50:55 UTC",
+ "current":"2017-09-15 16:52:00 UTC"
+ },
+ "labels": {
+ "previous": [{
+ "id": 206,
+ "title": "API",
+ "color": "#ffffff",
+ "project_id": 14,
+ "created_at": "2013-12-03T17:15:43Z",
+ "updated_at": "2013-12-03T17:15:43Z",
+ "template": false,
+ "description": "API related issues",
+ "type": "ProjectLabel",
+ "group_id": 41
+ }],
+ "current": [{
+ "id": 205,
+ "title": "Platform",
+ "color": "#123123",
+ "project_id": 14,
+ "created_at": "2013-12-03T17:15:43Z",
+ "updated_at": "2013-12-03T17:15:43Z",
+ "template": false,
+ "description": "Platform related issues",
+ "type": "ProjectLabel",
+ "group_id": 41
+ }]
+ }
}
}
```
diff --git a/doc/topics/application_development_platform/index.md b/doc/topics/application_development_platform/index.md
index f9baa8916df..1560ceeed26 100644
--- a/doc/topics/application_development_platform/index.md
+++ b/doc/topics/application_development_platform/index.md
@@ -4,7 +4,7 @@ group: unassigned
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Application Development Platform
+# Application Development Platform **(FREE)**
The GitLab Application Development Platform refers to the set of GitLab features used to create, configure, and manage
a complete software development environment. It provides development, operations, and security teams with a robust feature set aimed at supporting best practices out of the box.
diff --git a/doc/topics/authentication/index.md b/doc/topics/authentication/index.md
index 25e6e590f77..da96e88bb21 100644
--- a/doc/topics/authentication/index.md
+++ b/doc/topics/authentication/index.md
@@ -43,7 +43,7 @@ This page gathers all the resources for the topic **Authentication** within GitL
- [Personal access tokens](../../api/index.md#personalproject-access-tokens)
- [Project access tokens](../../api/index.md#personalproject-access-tokens)
- [Impersonation tokens](../../api/index.md#impersonation-tokens)
-- [GitLab as an OAuth2 provider](../../api/oauth2.md#gitlab-as-an-oauth-20-provider)
+- [OAuth 2.0 identity provider API](../../api/oauth2.md)
## Third-party resources
diff --git a/doc/topics/autodevops/customize.md b/doc/topics/autodevops/customize.md
index f8b63f5b41a..c01ed4a49d0 100644
--- a/doc/topics/autodevops/customize.md
+++ b/doc/topics/autodevops/customize.md
@@ -58,7 +58,7 @@ If your goal is to use only a single custom buildpack, you should provide the pr
## Custom `Dockerfile`
-> Support for `DOCKERFILE_PATH` was [added in GitLab 13.2](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/35662)
+> Support for `DOCKERFILE_PATH` was [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.
@@ -715,7 +715,7 @@ The banner can be disabled for:
Feature.enable(:auto_devops_banner_disabled)
```
- - Through the REST API with an admin access token:
+ - 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"
diff --git a/doc/topics/autodevops/index.md b/doc/topics/autodevops/index.md
index e232af05d50..9340f89c502 100644
--- a/doc/topics/autodevops/index.md
+++ b/doc/topics/autodevops/index.md
@@ -131,7 +131,7 @@ following levels:
| Instance type | [Project](#at-the-project-level) | [Group](#at-the-group-level) | [Instance](#at-the-instance-level) (Admin Area) |
|---------------------|------------------------|------------------------|------------------------|
-| GitLab SaaS | **{check-circle}** Yes | **{dotted-circle}** No | **{dotted-circle}** No |
+| GitLab SaaS | **{check-circle}** Yes | **{check-circle}** Yes | **{dotted-circle}** No |
| GitLab self-managed | **{check-circle}** Yes | **{check-circle}** Yes | **{check-circle}** Yes |
Before enabling Auto DevOps, consider [preparing it for deployment](requirements.md). If you don't, Auto DevOps can build and test your app,
diff --git a/doc/topics/autodevops/quick_start_guide.md b/doc/topics/autodevops/quick_start_guide.md
index 59c61da0c45..c84b5e4d9c7 100644
--- a/doc/topics/autodevops/quick_start_guide.md
+++ b/doc/topics/autodevops/quick_start_guide.md
@@ -103,7 +103,7 @@ to deploy this project to.
[Cloud Run](../../user/project/clusters/add_gke_clusters.md#cloud-run-for-anthos),
Istio, and HTTP Load Balancing add-ons for this cluster.
- **GitLab-managed cluster** - Select this checkbox to
- [allow GitLab to manage namespace and service accounts](../../user/project/clusters/index.md#gitlab-managed-clusters) for this cluster.
+ [allow GitLab to manage namespace and service accounts](../../user/project/clusters/gitlab_managed_clusters.md) for this cluster.
1. Select **Create Kubernetes cluster**.
@@ -199,13 +199,13 @@ The jobs are separated into stages:
vulnerabilities and is allowed to fail ([Auto Container Scanning](stages.md#auto-container-scanning))
- The `dependency_scanning` job checks if the application has any dependencies
susceptible to vulnerabilities and is allowed to fail
- ([Auto Dependency Scanning](stages.md#auto-dependency-scanning)) **(ULTIMATE)**
+ ([Auto Dependency Scanning](stages.md#auto-dependency-scanning))
- Jobs suffixed with `-sast` run static analysis on the current code to check for potential
- security issues, and are allowed to fail ([Auto SAST](stages.md#auto-sast)) **(ULTIMATE)**
- - The `secret-detection` job checks for leaked secrets and is allowed to fail ([Auto Secret Detection](stages.md#auto-secret-detection)) **(ULTIMATE)**
+ security issues, and are allowed to fail ([Auto SAST](stages.md#auto-sast))
+ - The `secret-detection` job checks for leaked secrets and is allowed to fail ([Auto Secret Detection](stages.md#auto-secret-detection))
- The `license_scanning` job searches the application's dependencies to determine each of their
licenses and is allowed to fail
- ([Auto License Compliance](stages.md#auto-license-compliance)) **(ULTIMATE)**
+ ([Auto License Compliance](stages.md#auto-license-compliance))
- **Review** - Pipelines on the default branch include this stage with a `dast_environment_deploy` job.
To learn more, see [Dynamic Application Security Testing (DAST)](../../user/application_security/dast/index.md).
@@ -214,7 +214,7 @@ The jobs are separated into stages:
Kubernetes ([Auto Deploy](stages.md#auto-deploy)).
- **Performance** - Performance tests are run on the deployed application
- ([Auto Browser Performance Testing](stages.md#auto-browser-performance-testing)). **(PREMIUM)**
+ ([Auto Browser Performance Testing](stages.md#auto-browser-performance-testing)).
- **Cleanup** - Pipelines on the default branch include this stage with a `stop_dast_environment` job.
@@ -323,7 +323,7 @@ and customized to fit your workflow. Here are some helpful resources for further
1. [Auto DevOps](index.md)
1. [Multiple Kubernetes clusters](multiple_clusters_auto_devops.md)
-1. [Incremental rollout to production](customize.md#incremental-rollout-to-production) **(PREMIUM)**
+1. [Incremental rollout to production](customize.md#incremental-rollout-to-production)
1. [Disable jobs you don't need with CI/CD variables](customize.md#cicd-variables)
1. [Use your own buildpacks to build your application](customize.md#custom-buildpacks)
1. [Prometheus monitoring](../../user/project/integrations/prometheus.md)
diff --git a/doc/topics/autodevops/requirements.md b/doc/topics/autodevops/requirements.md
index 8dd7c0317d9..816cbbece4f 100644
--- a/doc/topics/autodevops/requirements.md
+++ b/doc/topics/autodevops/requirements.md
@@ -97,9 +97,8 @@ To make full use of Auto DevOps with Kubernetes, you need:
To enable deployments, you need:
- 1. A [Kubernetes 1.12+ cluster](../../user/project/clusters/index.md) for your
- project. The easiest way is to create a
- [new cluster using the GitLab UI](../../user/project/clusters/add_remove_clusters.md#create-new-cluster).
+ 1. A [Kubernetes 1.12+ cluster](../../user/infrastructure/clusters/index.md) for your
+ project.
For Kubernetes 1.16+ clusters, you must perform additional configuration for
[Auto Deploy for Kubernetes 1.16+](stages.md#kubernetes-116).
1. For external HTTP traffic, an Ingress controller is required. For regular
@@ -161,7 +160,7 @@ To make full use of Auto DevOps with Kubernetes, you need:
- **cert-manager** (optional, for TLS/HTTPS)
- To enable HTTPS endpoints for your application, you can [install cert-manager](https://cert-manager.io/docs/installation/kubernetes/),
+ To enable HTTPS endpoints for your application, you can [install cert-manager](https://cert-manager.io/docs/installation/supported-releases/),
a native Kubernetes certificate management controller that helps with issuing
certificates. Installing cert-manager on your cluster issues a
[Let's Encrypt](https://letsencrypt.org/) certificate and ensures the
diff --git a/doc/topics/autodevops/stages.md b/doc/topics/autodevops/stages.md
index 9e6f3103664..ead2e957684 100644
--- a/doc/topics/autodevops/stages.md
+++ b/doc/topics/autodevops/stages.md
@@ -35,7 +35,7 @@ your own `Dockerfile`, you must either:
### Auto Build using Cloud Native Buildpacks
-> - Introduced in [GitLab 12.10](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/28165).
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/28165) in GitLab 12.10.
> - Auto Build using Cloud Native Buildpacks by default was [introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/63351) in GitLab 14.0.
Auto Build builds an application using a project's `Dockerfile` if present. If no
@@ -147,7 +147,7 @@ might want to use a [custom buildpack](customize.md#custom-buildpacks).
## Auto Code Quality
-> - [Moved](https://gitlab.com/gitlab-org/gitlab/-/issues/212499) to GitLab Free in 13.2.
+> - [Moved](https://gitlab.com/gitlab-org/gitlab/-/issues/212499) from GitLab Starter to GitLab Free in 13.2.
Auto Code Quality uses the
[Code Quality image](https://gitlab.com/gitlab-org/ci-cd/codequality) to run
@@ -174,8 +174,8 @@ see the documentation.
## Auto Secret Detection
-> - Introduced in GitLab Ultimate 13.1.
-> - [Select functionality made available in all tiers](../../user/application_security/secret_detection/#making-secret-detection-available-to-all-gitlab-tiers) in 13.3
+> - Introduced in GitLab 13.1.
+> - Select functionality [made available](../../user/application_security/secret_detection/#making-secret-detection-available-to-all-gitlab-tiers) in all tiers in GitLab 13.3
Secret Detection uses the
[Secret Detection Docker image](https://gitlab.com/gitlab-org/security-products/analyzers/secrets) to run Secret Detection on the current code, and checks for leaked secrets. Auto Secret Detection requires [GitLab Runner](https://docs.gitlab.com/runner/) 11.5 or above.
@@ -202,7 +202,7 @@ see the documentation.
## Auto License Compliance **(ULTIMATE)**
-> Introduced in GitLab Ultimate 11.0.
+> Introduced in GitLab 11.0.
License Compliance uses the
[License Compliance Docker image](https://gitlab.com/gitlab-org/security-products/analyzers/license-finder)
@@ -310,7 +310,7 @@ You can disable DAST:
## Auto Browser Performance Testing **(PREMIUM)**
-> Introduced in [GitLab Premium](https://about.gitlab.com/pricing/) 10.4.
+> Introduced in GitLab 10.4.
Auto [Browser Performance Testing](../../user/project/merge_requests/browser_performance_testing.md)
measures the browser performance of a web page with the
@@ -331,7 +331,7 @@ Any browser performance differences between the source and target branches are a
## Auto Load Performance Testing **(PREMIUM)**
-> Introduced in [GitLab Premium](https://about.gitlab.com/pricing/) 13.2.
+> Introduced in GitLab 13.2.
Auto [Load Performance Testing](../../user/project/merge_requests/load_performance_testing.md)
measures the server performance of an application with the
@@ -348,7 +348,7 @@ Any load performance test result differences between the source and target branc
## Auto Deploy
-[Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/216008) in GitLab 13.6, you have the choice to deploy to [Amazon Elastic Compute Cloud (Amazon EC2)](https://aws.amazon.com/ec2/) in addition to a Kubernetes cluster.
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/216008) in GitLab 13.6, you have the choice to deploy to [Amazon Elastic Compute Cloud (Amazon EC2)](https://aws.amazon.com/ec2/) in addition to a Kubernetes cluster.
Auto Deploy is an optional step for Auto DevOps. If the [requirements](requirements.md) are not met, the job is skipped.
diff --git a/doc/topics/autodevops/upgrading_auto_deploy_dependencies.md b/doc/topics/autodevops/upgrading_auto_deploy_dependencies.md
index 7ddcdcbacb5..8c460247734 100644
--- a/doc/topics/autodevops/upgrading_auto_deploy_dependencies.md
+++ b/doc/topics/autodevops/upgrading_auto_deploy_dependencies.md
@@ -5,7 +5,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
type: reference
---
-# Upgrading deployments for newer Auto Deploy dependencies
+# Upgrading deployments for newer Auto Deploy dependencies **(FREE)**
[Auto Deploy](stages.md#auto-deploy) is a feature that deploys your application to a Kubernetes cluster.
It consists of several dependencies:
diff --git a/doc/topics/build_your_application.md b/doc/topics/build_your_application.md
index 150e0ec26e4..9750af5ba1c 100644
--- a/doc/topics/build_your_application.md
+++ b/doc/topics/build_your_application.md
@@ -13,4 +13,4 @@ code, and use CI/CD to generate your application. Include packages in your app a
- [Merge requests](../user/project/merge_requests/index.md)
- [CI/CD](../ci/index.md)
- [Packages & Registries](../user/packages/index.md)
-- [Application infrastructure](../user/project/clusters/index.md)
+- [Application infrastructure](../user/infrastructure/index.md)
diff --git a/doc/topics/git/troubleshooting_git.md b/doc/topics/git/troubleshooting_git.md
index cc2631c9445..ae1667376b0 100644
--- a/doc/topics/git/troubleshooting_git.md
+++ b/doc/topics/git/troubleshooting_git.md
@@ -126,7 +126,14 @@ MaxStartups 100:30:200
`100:30:200` means up to 100 SSH sessions are allowed without restriction,
after which 30% of connections are dropped until reaching an absolute maximum of 200.
-Once configured, restart the SSH daemon for the change to take effect.
+After you modify the value of `MaxStartups`, check for any errors in the configuration.
+
+```shell
+sudo sshd -t -f /etc/ssh/sshd_config
+```
+
+If the configuration check runs without errors, it should be safe to restart the
+SSH daemon for the change to take effect.
```shell
# Debian/Ubuntu
@@ -200,7 +207,7 @@ apply more than one:
```shell
omnibus_gitconfig['system'] = {
# Set the http.postBuffer size, in bytes
- "http" => ["postBuffer" => 524288000]
+ "http" => ["postBuffer => 524288000"]
}
```
diff --git a/doc/topics/plan_and_track.md b/doc/topics/plan_and_track.md
index 662898e88fc..86c5287b331 100644
--- a/doc/topics/plan_and_track.md
+++ b/doc/topics/plan_and_track.md
@@ -1,6 +1,6 @@
---
-stage:
-group:
+stage: Plan
+group: Project Management
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
@@ -11,18 +11,32 @@ with milestones and track your team's time. Learn how to save time with
quick actions, see how GitLab renders Markdown text, and learn how to
use Git to interact with GitLab.
-- [Epics](../user/group/epics/index.md)
+## Basic workflow features
+
+Planning features everyone needs to use day-to-day.
+
+- [Keyboard shortcuts](../user/shortcuts.md)
+- [Markdown](../user/markdown.md)
+- [Quick actions](../user/project/quick_actions.md)
+- [To-Do lists](../user/todos.md)
+- [Using Git](../topics/git/index.md)
+
+## Team Planning
+
+Get work done as a team.
+
+- [Comments and threads](../user/discussions/index.md)
- [Issues](../user/project/issues/index.md)
-- [Labels](../user/project/labels.md)
-- [Discussions](../user/discussions/index.md)
- [Iterations](../user/group/iterations/index.md)
+- [Labels](../user/project/labels.md)
- [Milestones](../user/project/milestones/index.md)
- [Requirements](../user/project/requirements/index.md)
-- [Roadmaps](../user/group/roadmap/index.md)
- [Time tracking](../user/project/time_tracking.md)
- [Wikis](../user/project/wiki/index.md)
-- [Keyboard shortcuts](../user/shortcuts.md)
-- [Quick actions](../user/project/quick_actions.md)
-- [Markdown](../user/markdown.md)
-- [To-Do lists](../user/todos.md)
-- [Using Git](../topics/git/index.md)
+
+## Portfolio Management
+
+Align your work across teams.
+
+- [Epics](../user/group/epics/index.md)
+- [Roadmaps](../user/group/roadmap/index.md)
diff --git a/doc/update/deprecations.md b/doc/update/deprecations.md
index d453c5d8336..e2af4f453c0 100644
--- a/doc/update/deprecations.md
+++ b/doc/update/deprecations.md
@@ -6,6 +6,16 @@ info: "See the Technical Writers assigned to Development Guidelines: https://abo
# Deprecated feature removal schedule
+DISCLAIMER:
+This page contains information related to upcoming products, features, and functionality.
+It is important to note that the information presented is for informational purposes only.
+Please do not rely on this information for purchasing or planning purposes.
+As with all projects, the items mentioned on this page are subject to change or delay.
+The development, release, and timing of any products, features, or functionality remain at the
+sole discretion of GitLab Inc.
+
+<!-- vale off -->
+
<!--
This page is automatically generated from the YAML files in `/data/deprecations` by the rake task
located at `lib/tasks/gitlab/docs/compile_deprecations.rake`.
@@ -16,6 +26,24 @@ To add a deprecation, use the example.yml file in `/data/deprecations/templates`
then run `bin/rake gitlab:docs:compile_deprecations`.
-->
+## 14.4
+
+### Rename Task Runner pod to Toolbox
+
+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).
+
+This will result in the rename of the sub-chart: `gitlab/task-runner` to `gitlab/toolbox`. Resulting pods will be named along the lines of `{{ .Release.Name }}-toolbox`, which will often be `gitlab-toolbox`. They will be locatable with the label `app=toolbox`.
+
+Announced: 2021-08-22
+
+## 14.6
+
+### Release CLI be distributed as a generic package
+
+The [release-cli](https://gitlab.com/gitlab-org/release-cli) will be released as a [generic package](https://gitlab.com/gitlab-org/release-cli/-/packages) starting in GitLab 14.2. We will continue to deploy it as a binary to S3 until GitLab 14.5 and stop distributing it in S3 in GitLab 14.6.
+
+Announced: 2021-08-22
+
## 15.0
### Legacy database configuration
@@ -30,19 +58,19 @@ Announced: 2021-09-22
### Audit events for repository push events
-Audit events for [repository events](../administration/audit_events.md#repository-push) are now deprecated and will be removed in GitLab 15.0.
+Audit events for [repository events](https://docs.gitlab.com/ee/administration/audit_events.html#repository-push) are now deprecated and will be removed in GitLab 15.0.
These events have always been disabled by default and had to be manually enabled with a
feature flag. Enabling them can cause too many events to be generated which can
dramatically slow down GitLab instances. For this reason, they are being removed.
-Announced: 2021-09-02
+Announced: 2021-09-22
### OmniAuth Kerberos gem
The `omniauth-kerberos` gem will be removed in our next major release, GitLab 15.0.
-This gem has not been maintained and has very little usage. We therefore plan to remove support for this authentication method and recommend using the Kerberos [SPNEGO](https://en.wikipedia.org/wiki/SPNEGO) integration instead. You can follow the [upgrade instructions](../integration/kerberos.md#upgrading-from-password-based-to-ticket-based-kerberos-sign-ins) to upgrade from the `omniauth-kerberos` integration to the supported one.
+This gem has not been maintained and has very little usage. We therefore plan to remove support for this authentication method and recommend using the Kerberos [SPNEGO](https://en.wikipedia.org/wiki/SPNEGO) integration instead. You can follow the [upgrade instructions](https://docs.gitlab.com/ee/integration/kerberos.html#upgrading-from-password-based-to-ticket-based-kerberos-sign-ins) to upgrade from the `omniauth-kerberos` integration to the supported one.
Note that we are not deprecating the Kerberos SPNEGO integration, only the old password-based Kerberos integration.
@@ -50,18 +78,24 @@ Announced: 2021-09-22
### GitLab Serverless
-[GitLab Serverless](../user/project/clusters/serverless/index.md) is a feature set to support Knative-based serverless development with automatic deployments and monitoring.
+[GitLab Serverless](https://docs.gitlab.com/ee/user/project/clusters/serverless/) is a feature set to support Knative-based serverless development with automatic deployments and monitoring.
We decided to remove the GitLab Serverless features as they never really resonated with our users. Besides, given the continuous development of Kubernetes and Knative, our current implementations do not even work with recent versions.
Announced: 2021-09-22
-## 14.4
+## 15.2
-### Rename Task Runner pod to Toolbox
+### NFS for Git repository storage deprecated
-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).
+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 in GitLab 15.0. Please see our official [Statement of Support](https://about.gitlab.com/support/statement-of-support.html#gitaly-and-nfs) for further information.
-This will result in the rename of the sub-chart: `gitlab/task-runner` to `gitlab/toolbox`. Resulting pods will be named along the lines of `{{ .Release.Name }}-toolbox`, which will often be `gitlab-toolbox`. They will be locatable with the label `app=toolbox`.
+Gitaly Cluster offers tremendous benefits for our customers such as:
-Announced: 2021-09-22
+- [Variable replication factors](https://docs.gitlab.com/ee/administration/gitaly/index.html#replication-factor).
+- [Strong consistency](https://docs.gitlab.com/ee/administration/gitaly/index.html#strong-consistency).
+- [Distributed read capabilities](https://docs.gitlab.com/ee/administration/gitaly/index.html#distributed-reads).
+
+We encourage customers currently using NFS for Git repositories to plan their migration by reviewing our documentation on [migrating to Gitaly Cluster](https://docs.gitlab.com/ee/administration/gitaly/index.html#migrate-to-gitaly-cluster).
+
+Announced: 2021-06-22
diff --git a/doc/update/index.md b/doc/update/index.md
index fadb55684f8..b719c47ae26 100644
--- a/doc/update/index.md
+++ b/doc/update/index.md
@@ -79,6 +79,10 @@ See the guide to [plan your GitLab upgrade](plan_your_upgrade.md).
Certain major/minor releases may require different migrations to be
finished before you update to the newer version.
+Decrease the time required to complete these migrations by increasing the number of
+[Sidekiq workers](../administration/operations/extra_sidekiq_processes.md)
+that can process jobs in the `background_migration` queue.
+
**For GitLab 14.0 and newer**
To check the status of [batched background migrations](../user/admin_area/monitoring/background_migrations.md):
@@ -88,6 +92,16 @@ To check the status of [batched background migrations](../user/admin_area/monito
![queued batched background migrations table](img/batched_background_migrations_queued_v14_0.png)
+The status of batched background migrations can also be queried directly in the database.
+
+1. Log into a `psql` prompt according to the directions for your instance's installation method
+(for example, `sudo gitlab-psql` for Omnibus installations).
+1. Run the following query in the `psql` session to see details on incomplete batched background migrations:
+
+ ```sql
+ select job_class_name, table_name, column_name, job_arguments from batched_background_migrations where status <> 3;
+ ```
+
**For Omnibus installations**
You can also run:
@@ -136,9 +150,9 @@ pending_job_classes.each { |job_class| Gitlab::BackgroundMigration.steal(job_cla
## Dealing with running CI/CD pipelines and jobs
-If you upgrade your GitLab instance while the GitLab Runner is processing jobs, the trace updates will fail. Once GitLab is back online, then the trace updates should self-heal. However, depending on the error, the GitLab Runner will either retry or eventually terminate job handling.
+If you upgrade your GitLab instance while the GitLab Runner is processing jobs, the trace updates fail. When GitLab is back online, the trace updates should self-heal. However, depending on the error, the GitLab Runner either retries or eventually terminates job handling.
-As for the artifacts, the GitLab Runner will attempt to upload them three times, after which the job will eventually fail.
+As for the artifacts, the GitLab Runner attempts to upload them three times, after which the job eventually fails.
To address the above two scenario's, it is advised to do the following prior to upgrading:
@@ -193,7 +207,7 @@ upgrade paths.
| Target version | Your version | Supported upgrade path | Note |
| -------------- | ------------ | ---------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------- |
-| `14.1.2` | `13.9.2` | `13.9.2` -> `13.12.9` -> `14.0.7` -> `14.1.2` | Two intermediate versions are required: `13.12` and `14.0`, then `14.1`. |
+| `14.1.6` | `13.9.2` | `13.9.2` -> `13.12.12` -> `14.0.11` -> `14.1.6` | Two intermediate versions are required: `13.12` and `14.0`, then `14.1`. |
| `13.12.10` | `12.9.2` | `12.9.2` -> `12.10.14` -> `13.0.14` -> `13.1.11` -> `13.8.8` -> `13.12.10` | Four intermediate versions are required: `12.10`, `13.0`, `13.1` and `13.8.8`, then `13.12.10`. |
| `13.2.10` | `11.5.0` | `11.5.0` -> `11.11.8` -> `12.0.12` -> `12.1.17` -> `12.10.14` -> `13.0.14` -> `13.1.11` -> `13.2.10` | Six intermediate versions are required: `11.11`, `12.0`, `12.1`, `12.10`, `13.0` and `13.1`, then `13.2.10`. |
| `12.10.14` | `11.3.4` | `11.3.4` -> `11.11.8` -> `12.0.12` -> `12.1.17` -> `12.10.14` | Three intermediate versions are required: `11.11`, `12.0` and `12.1`, then `12.10.14`. |
@@ -206,7 +220,7 @@ upgrade paths.
Upgrading the *major* version requires more attention.
Backward-incompatible changes and migrations are reserved for major versions.
Follow the directions carefully as we
-cannot guarantee that upgrading between major versions will be seamless.
+cannot guarantee that upgrading between major versions is seamless.
It is required to follow the following upgrade steps to ensure a successful *major* version upgrade:
@@ -293,6 +307,11 @@ NOTE:
Specific information that follow related to Ruby and Git versions do not apply to [Omnibus installations](https://docs.gitlab.com/omnibus/)
and [Helm Chart deployments](https://docs.gitlab.com/charts/). They come with appropriate Ruby and Git versions and are not using system binaries for Ruby and Git. There is no need to install Ruby or Git when utilizing these two approaches.
+### 14.4.0
+
+Git 2.33.x and later is required. We recommend you use the
+[Git version provided by Gitaly](../install/installation.md#git).
+
### 14.3.0
Ruby 2.7.4 is required. Refer to [the Ruby installation instructions](../install/installation.md#2-ruby)
@@ -402,7 +421,7 @@ Git 2.31.x and later is required. We recommend you use the
### 13.9.0
We've detected an issue [with a column rename](https://gitlab.com/gitlab-org/gitlab/-/issues/324160)
-that will prevent upgrades to GitLab 13.9.0, 13.9.1, 13.9.2 and 13.9.3 when following the zero-downtime steps. It is necessary
+that prevents upgrades to GitLab 13.9.0, 13.9.1, 13.9.2, and 13.9.3 when following the zero-downtime steps. It is necessary
to perform the following additional steps for the zero-downtime upgrade:
1. Before running the final `sudo gitlab-rake db:migrate` command on the deploy node,
@@ -423,7 +442,7 @@ to perform the following additional steps for the zero-downtime upgrade:
```
If you have already run the final `sudo gitlab-rake db:migrate` command on the deploy node and have
-encountered the [column rename issue](https://gitlab.com/gitlab-org/gitlab/-/issues/324160), you will
+encountered the [column rename issue](https://gitlab.com/gitlab-org/gitlab/-/issues/324160), you
see the following error:
```shell
diff --git a/doc/update/package/downgrade.md b/doc/update/package/downgrade.md
index 9a528f5ee44..96b17a7632b 100644
--- a/doc/update/package/downgrade.md
+++ b/doc/update/package/downgrade.md
@@ -12,7 +12,7 @@ of a package.
WARNING:
You must at least have a database backup created under the version you are
downgrading to. Ideally, you should have a
-[full backup archive](../../raketasks/backup_restore.md#back-up-gitlab)
+[full backup archive](../../raketasks/backup_restore.md)
on hand.
The example below demonstrates the downgrade procedure when downgrading between minor
diff --git a/doc/update/package/index.md b/doc/update/package/index.md
index 44be79f22fb..776a7111188 100644
--- a/doc/update/package/index.md
+++ b/doc/update/package/index.md
@@ -4,103 +4,99 @@ group: Distribution
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#designated-technical-writers
---
-# Upgrade GitLab using the GitLab Package **(FREE SELF)**
+# Upgrade GitLab by using the GitLab package **(FREE SELF)**
-This section describes how to upgrade GitLab to a new version using the
+You can upgrade GitLab to a new version by using the
GitLab package.
-We recommend performing upgrades between major and minor releases no more than once per
-week, to allow time for background migrations to finish. Decrease the time required to
-complete these migrations by increasing the number of
-[Sidekiq workers](../../administration/operations/extra_sidekiq_processes.md)
-that can process jobs in the `background_migration` queue.
-
-If you don't follow the steps in [zero downtime upgrades](../zero_downtime.md),
-your GitLab application will not be available to users while an upgrade is in progress.
-They either see a "Deploy in progress" message or a "502" error in their web browser.
-
-Prerequisites:
-
-- [Supported upgrade paths](../index.md#upgrade-paths)
- has suggestions on when to upgrade. Upgrade paths are enforced for version upgrades by
- default. This restricts performing direct upgrades that skip major versions (for
- example 10.3 to 12.7 in one jump) that **can break GitLab
- installations** due to multiple reasons like deprecated or removed configuration
- settings, upgrade of internal tools and libraries, and so on.
-- If you are upgrading from a non-Package installation to a GitLab Package installation, see
- [Upgrading from a non-Package installation to a GitLab Package installation](https://docs.gitlab.com/omnibus/convert_to_omnibus.html).
-- It's important to ensure that any
+## Prerequisites
+
+- Decide when to upgrade by viewing the [supported upgrade paths](../index.md#upgrade-paths).
+ You can't directly skip major versions (for example, go from 10.3 to 12.7 in one step).
+- If you are upgrading from a non-package installation to a GitLab package installation, see
+ [Upgrading from a non-package installation to a GitLab package installation](https://docs.gitlab.com/omnibus/update/convert_to_omnibus.html).
+- Ensure that any
[background migrations](../index.md#checking-for-background-migrations-before-upgrading)
- have been fully completed before upgrading to a new major version. Upgrading
- before background migrations have finished may lead to data corruption.
+ are fully completed. Upgrading
+ before background migrations have finished can lead to data corruption.
+ We recommend performing upgrades between major and minor releases no more than once per
+ week, to allow time for background migrations to finish.
- Gitaly servers must be upgraded to the newer version prior to upgrading the application server.
This prevents the gRPC client on the application server from sending RPCs that the old Gitaly version
does not support.
-You can upgrade the GitLab Package using one of the following methods:
+## Downtime
+
+- For single node installations, GitLab is not available to users while an
+ upgrade is in progress. The user's web browser shows a `Deploy in progress` message or a `502` error.
+- For multi-node installations, see how to perform
+ [zero downtime upgrades](../zero_downtime.md).
+
+## Version-specific changes
+
+Upgrading versions might need some manual intervention. For more information,
+check the version your are upgrading to:
+
+- [GitLab 14](https://docs.gitlab.com/omnibus/update/gitlab_14_changes.html)
+- [GitLab 13](https://docs.gitlab.com/omnibus/update/gitlab_13_changes.html)
+- [GitLab 12](https://docs.gitlab.com/omnibus/update/gitlab_12_changes.html)
+- [GitLab 11](https://docs.gitlab.com/omnibus/update/gitlab_11_changes.html)
-- [Using the official repositories](#upgrade-using-the-official-repositories).
-- [Using a manually-downloaded package](#upgrade-using-a-manually-downloaded-package).
+## Back up before upgrading
-Both automatically back up the GitLab database before installing a newer
-GitLab version. You may skip this automatic database backup by creating an empty file
+The GitLab database is backed up before installing a newer GitLab version. You
+may skip this automatic database backup by creating an empty file
at `/etc/gitlab/skip-auto-backup`:
```shell
sudo touch /etc/gitlab/skip-auto-backup
```
-For safety reasons, you should maintain an up-to-date backup on your own if you plan to use this flag.
-
-## Version-specific changes
-
-Updating to major versions might need some manual intervention. For more information,
-check the version your are upgrading to:
-
-- [GitLab 14](https://docs.gitlab.com/omnibus/gitlab_14_changes.html)
-- [GitLab 13](https://docs.gitlab.com/omnibus/gitlab_13_changes.html)
-- [GitLab 12](https://docs.gitlab.com/omnibus/gitlab_12_changes.html)
-- [GitLab 11](https://docs.gitlab.com/omnibus/gitlab_11_changes.html)
+Nevertheless, it is highly recommended to maintain a full up-to-date
+[backup](../../raketasks/backup_restore.md) on your own.
## Upgrade using the official repositories
All GitLab packages are posted to the GitLab [package server](https://packages.gitlab.com/gitlab/).
Five repositories are maintained:
-- [GitLab EE](https://packages.gitlab.com/gitlab/gitlab-ee): for official
- [Enterprise Edition](https://about.gitlab.com/pricing/) releases.
-- [GitLab CE](https://packages.gitlab.com/gitlab/gitlab-ce): for official Community Edition releases.
-- [Unstable](https://packages.gitlab.com/gitlab/unstable): for release candidates and other unstable versions.
-- [Nighty Builds](https://packages.gitlab.com/gitlab/nightly-builds): for nightly builds.
-- [Raspberry Pi](https://packages.gitlab.com/gitlab/raspberry-pi2): for official Community Edition releases built for [Raspberry Pi](https://www.raspberrypi.org) packages.
+- [`gitlab/gitlab-ee`](https://packages.gitlab.com/gitlab/gitlab-ee): The full
+ GitLab package that contains all the Community Edition features plus the
+ [Enterprise Edition](https://about.gitlab.com/pricing/) ones.
+- [`gitlab/gitlab-ce`](https://packages.gitlab.com/gitlab/gitlab-ce): A stripped
+ down package that contains only the Community Edition features.
+- [`gitlab/unstable`](https://packages.gitlab.com/gitlab/unstable): Release candidates and other unstable versions.
+- [`gitlab/nightly-builds`](https://packages.gitlab.com/gitlab/nightly-builds): Nightly builds.
+- [`gitlab/raspberry-pi2`](https://packages.gitlab.com/gitlab/raspberry-pi2): Official Community Edition releases built for [Raspberry Pi](https://www.raspberrypi.org) packages.
-If you have installed Omnibus GitLab [Community Edition](https://about.gitlab.com/install/?version=ce)
+If you have installed GitLab [Community Edition](https://about.gitlab.com/install/?version=ce)
or [Enterprise Edition](https://about.gitlab.com/install/), then the
official GitLab repository should have already been set up for you.
-To upgrade to the newest GitLab version, run:
+### Upgrade to the latest version using the official repositories
-- For GitLab [Enterprise Edition](https://about.gitlab.com/pricing/):
+If you upgrade GitLab regularly, for example once a month, you can upgrade to
+the latest version by using your package manager.
- ```shell
- # Debian/Ubuntu
- sudo apt-get update
- sudo apt-get install gitlab-ee
+To upgrade to the latest GitLab version:
- # Centos/RHEL
- sudo yum install gitlab-ee
- ```
+```shell
+# Ubuntu/Debian
+sudo apt update && sudo apt install gitlab-ee
+
+# RHEL/CentOS 6 and 7
+sudo yum install gitlab-ee
-- For GitLab Community Edition:
+# RHEL/CentOS 8
+sudo dnf install gitlab-ee
- ```shell
- # Debian/Ubuntu
- sudo apt-get update
- sudo apt-get install gitlab-ce
+# SUSE
+sudo zypper install gitlab-ee
+```
- # Centos/RHEL
- sudo yum install gitlab-ce
- ```
+NOTE:
+For the GitLab Community Edition, replace `gitlab-ee` with
+`gitlab-ce`.
### Upgrade to a specific version using the official repositories
@@ -113,30 +109,43 @@ versions, so you must specify the specific GitLab package with each upgrade.
To specify the intended GitLab version number in your package manager's install
or upgrade command:
-1. First, identify the GitLab version number in your package manager:
+1. Identify the version number of the installed package:
```shell
# Ubuntu/Debian
sudo apt-cache madison gitlab-ee
+
# RHEL/CentOS 6 and 7
yum --showduplicates list gitlab-ee
+
# RHEL/CentOS 8
- dnf search gitlab-ee*
+ dnf --showduplicates list gitlab-ee
+
+ # SUSE
+ zypper search -s gitlab-ee
```
-1. Then install the specific GitLab package:
+1. Install the specific `gitlab-ee` package by using one of the following commands
+ and replacing `<version>` with the version you found in the previous step:
```shell
# Ubuntu/Debian
- sudo apt install gitlab-ee=12.0.12-ee.0
+ sudo apt install gitlab-ee=<version>
+
# RHEL/CentOS 6 and 7
- yum install gitlab-ee-12.0.12-ee.0.el7
+ yum install gitlab-ee-<version>
+
# RHEL/CentOS 8
- dnf install gitlab-ee-12.0.12-ee.0.el8
+ dnf install gitlab-ee-<version>
+
# SUSE
- zypper install gitlab-ee=12.0.12-ee.0
+ zypper install gitlab-ee=<version>
```
+NOTE:
+For the GitLab Community Edition, replace `gitlab-ee` with
+`gitlab-ce`.
+
## Upgrade using a manually-downloaded package
NOTE:
@@ -150,34 +159,30 @@ install GitLab for the first time or update it.
To download and install GitLab:
1. Visit the [official repository](#upgrade-using-the-official-repositories) of your package.
-1. Browse to the repository for the type of package you would like to see the
- list of packages that are available. Multiple packages exist for a
- single version, one for each supported distribution type. Next to the filename
- is a label indicating the distribution, as the file names may be the same.
-1. Find the package version you wish to install and click on it.
-1. Click the **Download** button in the upper right corner to download the package.
-1. After the GitLab package is downloaded, install it using the following commands:
-
- - For GitLab [Enterprise Edition](https://about.gitlab.com/pricing/):
+1. Filter the list by searching for the version you want to install (for example 14.1.6).
+ Multiple packages may exist for a single version, one for each supported distribution
+ and architecture. Next to the filename is a label indicating the distribution,
+ as the filenames may be the same.
+1. Find the package version you wish to install, and select the filename from the list.
+1. Select **Download** in the upper right corner to download the package.
+1. After the package is downloaded, install it by using one of the
+ following commands and replacing `<package_name>` with the package name
+ you downloaded:
- ```shell
- # Debian/Ubuntu
- dpkg -i gitlab-ee-<version>.deb
-
- # CentOS/RHEL
- rpm -Uvh gitlab-ee-<version>.rpm
- ```
+ ```shell
+ # Debian/Ubuntu
+ dpkg -i <package_name>
- - For GitLab Community Edition:
+ # CentOS/RHEL
+ rpm -Uvh <package_name>
- ```shell
- # GitLab Community Edition
- # Debian/Ubuntu
- dpkg -i gitlab-ce-<version>.deb
+ # SUSE
+ zypper install <package_name>
+ ```
- # CentOS/RHEL
- rpm -Uvh gitlab-ce-<version>.rpm
- ```
+NOTE:
+For the GitLab Community Edition, replace `gitlab-ee` with
+`gitlab-ce`.
## Troubleshooting
@@ -237,8 +242,8 @@ To avoid this issue, either:
### 500 error when accessing Project > Settings > Repository
-When GitLab is migrated from CE > EE > CE, and then back to EE, you
-might get the following error when viewing a project's repository settings:
+This error occurs when GitLab is converted from CE > EE > CE, and then back to EE.
+When viewing a project's repository settings, you can view this error in the logs:
```shell
Processing by Projects::Settings::RepositoryController#show as HTML
diff --git a/doc/update/plan_your_upgrade.md b/doc/update/plan_your_upgrade.md
index 406f8322218..320f900dd21 100644
--- a/doc/update/plan_your_upgrade.md
+++ b/doc/update/plan_your_upgrade.md
@@ -4,7 +4,7 @@ group: Distribution
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Create a GitLab upgrade plan
+# Create a GitLab upgrade plan **(FREE SELF)**
This document serves as a guide to create a strong plan to upgrade a self-managed
GitLab instance.
@@ -75,7 +75,7 @@ Create a backup of GitLab and all its data (database, repos, uploads, builds,
artifacts, LFS objects, registry, pages). This is vital for making it possible
to roll back GitLab to a working state if there's a problem with the upgrade:
-- Create a [GitLab backup](../raketasks/backup_restore.md#back-up-gitlab).
+- Create a [GitLab backup](../raketasks/backup_restore.md).
Make sure to follow the instructions based on your installation method.
Don't forget to back up the [secrets and configuration files](../raketasks/backup_restore.md#storing-configuration-files).
- Alternatively, create a snapshot of your instance. If this is a multi-node
@@ -173,7 +173,7 @@ If anything doesn't go as planned:
- [`kubesos`](https://gitlab.com/gitlab-com/support/toolbox/kubesos/) if
you installed GitLab using the Helm Charts.
- For support:
- - [Contact GitLab Support](https://support.gitlab.com) and,
+ - [Contact GitLab Support](https://support.gitlab.com/hc) and,
if you have one, your Technical Account Manager.
- If [the situation qualifies](https://about.gitlab.com/support/#definitions-of-support-impact)
and [your plan includes emergency support](https://about.gitlab.com/support/#priority-support),
diff --git a/doc/update/restore_after_failure.md b/doc/update/restore_after_failure.md
index b8cceb8c367..cedb46a7c71 100644
--- a/doc/update/restore_after_failure.md
+++ b/doc/update/restore_after_failure.md
@@ -31,9 +31,7 @@ attempts. This is because some tables may have been added during the failed
upgrade. If these tables are still present after you restore from the
older backup it can lead to migration failures on future upgrades.
-Starting in GitLab 8.6 we drop all tables prior to importing the backup to
-prevent this problem. If you've restored a backup to a version prior to 8.6 you
-may have to manually correct the problem next time you upgrade.
+We drop all tables prior to importing the backup to prevent this problem.
Example error:
@@ -52,38 +50,16 @@ Copy the version from the error. In this case the version number is
WARNING:
Use the following steps only if you are certain you must do them.
-### GitLab 8.6+
+1. Pass the version to a database Rake task to manually mark the migration as
+ complete.
-Pass the version to a database Rake task to manually mark the migration as
-complete.
+ ```shell
+ # Source install
+ sudo -u git -H bundle exec rake gitlab:db:mark_migration_complete[20151103134857] RAILS_ENV=production
-```shell
-# Source install
-sudo -u git -H bundle exec rake gitlab:db:mark_migration_complete[20151103134857] RAILS_ENV=production
+ # Omnibus install
+ sudo gitlab-rake gitlab:db:mark_migration_complete[20151103134857]
+ ```
-# Omnibus install
-sudo gitlab-rake gitlab:db:mark_migration_complete[20151103134857]
-```
-
-After the migration is successfully marked, run the Rake `db:migrate` task again.
-Repeat this process until all failed migrations are complete.
-
-### GitLab < 8.6
-
-```shell
-# Source install
-sudo -u git -H bundle exec rails console -e production
-
-# Omnibus install
-sudo gitlab-rails console
-```
-
-At the Rails console, type the following commands:
-
-```ruby
-ActiveRecord::Base.connection.execute("INSERT INTO schema_migrations (version) VALUES('20151103134857')")
-exit
-```
-
-After the migration is successfully marked, run the Rake `db:migrate` task again.
-Repeat this process until all failed migrations are complete.
+1. After the migration is successfully marked, run the Rake `db:migrate` task again.
+1. Repeat this process until all failed migrations are complete.
diff --git a/doc/update/upgrading_from_source.md b/doc/update/upgrading_from_source.md
index 9abf993f0fe..67559db2cf0 100644
--- a/doc/update/upgrading_from_source.md
+++ b/doc/update/upgrading_from_source.md
@@ -258,6 +258,10 @@ sudo systemctl daemon-reload
### 10. Install libraries, migrations, etc
+Make sure you have the required
+[PostgreSQL extensions](../install/requirements.md#postgresql-requirements),
+then proceed to install the needed libraries:
+
```shell
cd /home/git/gitlab
@@ -304,15 +308,18 @@ cd /home/git/gitlab
sudo -u git -H bundle exec rake "gitlab:workhorse:install[/home/git/gitlab-workhorse]" RAILS_ENV=production
```
+NOTE:
+If you get any errors concerning Rack attack, see the [13.0](#1301) specific
+upgrade instructions.
+
### 13. Update Gitaly
#### Compile Gitaly
```shell
-cd /home/git/gitaly
-sudo -u git -H git fetch --all --tags --prune
-sudo -u git -H git checkout v$(</home/git/gitlab/GITALY_SERVER_VERSION)
-sudo -u git -H make
+# Fetch Gitaly source with Git and compile with Go
+cd /home/git/gitlab
+sudo -u git -H bundle exec rake "gitlab:gitaly:install[/home/git/gitaly,/home/git/repositories]" RAILS_ENV=production
```
### 14. Update GitLab Pages
@@ -375,14 +382,13 @@ Additional instructions here.
### 13.0.1
-As part of [deprecating Rack Attack throttles on Omnibus GitLab](https://gitlab.com/gitlab-org/omnibus-gitlab/-/issues/4750), Rack Attack initializer on GitLab
+As part of [deprecating Rack Attack throttles on Omnibus GitLab](https://gitlab.com/gitlab-org/omnibus-gitlab/-/issues/4750), the Rack Attack initializer on GitLab
was renamed from [`config/initializers/rack_attack_new.rb` to `config/initializers/rack_attack.rb`](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/33072).
If this file exists on your installation, consider creating a backup before updating:
```shell
cd /home/git/gitlab
-
-cp config/initializers/rack_attack.rb config/initializers/rack_attack_backup.rb
+cp config/initializers/rack_attack.rb ~/config/initializers/rack_attack_backup.rb
```
## Troubleshooting
diff --git a/doc/update/zero_downtime.md b/doc/update/zero_downtime.md
index f0e6377f355..7a74435267f 100644
--- a/doc/update/zero_downtime.md
+++ b/doc/update/zero_downtime.md
@@ -4,7 +4,7 @@ group: Distribution
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#designated-technical-writers
---
-# Zero downtime upgrades
+# Zero downtime upgrades **(FREE SELF)**
Starting with GitLab 9.1.0 it's possible to upgrade to a newer major, minor, or
patch version of GitLab without having to take your GitLab instance offline.
@@ -428,7 +428,7 @@ sure you remove `/etc/gitlab/skip-auto-reconfigure` and revert
setting `gitlab_rails['auto_migrate'] = false` in
`/etc/gitlab/gitlab.rb` after you've completed these steps.
-### Use Redis HA (using Sentinel) **(PREMIUM ONLY)**
+### Use Redis HA (using Sentinel) **(PREMIUM SELF)**
Package upgrades may involve version updates to the bundled Redis service. On
instances using [Redis for scaling](../administration/redis/index.md),
@@ -525,7 +525,7 @@ failover is complete, we can go ahead and upgrade the original primary node.
Install the package for new version and follow regular package upgrade
procedure.
-## Geo deployment **(PREMIUM ONLY)**
+## Geo deployment **(PREMIUM SELF)**
The order of steps is important. While following these steps, make
sure you follow them in the right order, on the correct node.
@@ -645,7 +645,7 @@ sure you remove `/etc/gitlab/skip-auto-reconfigure` and revert
setting `gitlab_rails['auto_migrate'] = false` in
`/etc/gitlab/gitlab.rb` after you've completed these steps.
-## Multi-node / HA deployment with Geo **(PREMIUM ONLY)**
+## Multi-node / HA deployment with Geo **(PREMIUM SELF)**
This section describes the steps required to upgrade a multi-node / HA
deployment with Geo. Some steps must be performed on a particular node. This
diff --git a/doc/user/admin_area/analytics/dev_ops_report.md b/doc/user/admin_area/analytics/dev_ops_report.md
index 7ddddfc5e53..b5294bb265d 100644
--- a/doc/user/admin_area/analytics/dev_ops_report.md
+++ b/doc/user/admin_area/analytics/dev_ops_report.md
@@ -6,7 +6,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# DevOps Report **(FREE SELF)**
-> [Renamed from Conversational Development Index](https://gitlab.com/gitlab-org/gitlab/-/issues/20976) in GitLab 12.6.
+> [Renamed](https://gitlab.com/gitlab-org/gitlab/-/issues/20976) from Conversational Development Index in GitLab 12.6.
The DevOps Report gives you an overview of your entire instance's adoption of
[Concurrent DevOps](https://about.gitlab.com/topics/concurrent-devops/)
diff --git a/doc/user/admin_area/appearance.md b/doc/user/admin_area/appearance.md
index 0ffa8289d37..0b264ef22b9 100644
--- a/doc/user/admin_area/appearance.md
+++ b/doc/user/admin_area/appearance.md
@@ -39,7 +39,7 @@ of the page to activate it in the GitLab instance.
## System header and footer messages
-> - [Moved](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/55057) to GitLab Free in 11.9.
+> - [Moved](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/55057) from GitLab Premium to GitLab Free in 11.9.
You can add a small header message, a small footer message, or both, to the interface
of your GitLab instance. These messages appear on all projects and pages of the
diff --git a/doc/user/admin_area/custom_project_templates.md b/doc/user/admin_area/custom_project_templates.md
index 8c0586e5851..976d8e4efcf 100644
--- a/doc/user/admin_area/custom_project_templates.md
+++ b/doc/user/admin_area/custom_project_templates.md
@@ -7,7 +7,7 @@ type: reference
# Custom instance-level project templates **(PREMIUM SELF)**
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/6860) in [GitLab Premium](https://about.gitlab.com/pricing/) 11.2.
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/6860) in GitLab 11.2.
GitLab administrators can set a group to be the source of project templates that are
selectable when a new project is created on the instance. These templates can be selected
diff --git a/doc/user/admin_area/geo_nodes.md b/doc/user/admin_area/geo_nodes.md
index a2354e68d72..f2b899f0be9 100644
--- a/doc/user/admin_area/geo_nodes.md
+++ b/doc/user/admin_area/geo_nodes.md
@@ -22,45 +22,45 @@ All Geo sites have the following settings:
| Setting | Description |
| --------| ----------- |
| Primary | This marks a Geo site as **primary** site. There can be only one **primary** site. |
-| Name | The unique identifier for the Geo site. It's highly recommended to use a physical location as a name. Good examples are "London Office" or "us-east-1". Avoid words like "primary", "secondary", "Geo", or "DR". This makes the failover process easier because the physical location does not change, but the Geo site role can. All nodes in a single Geo site use the same site name. Nodes use the `gitlab_rails['geo_node_name']` setting in `/etc/gitlab/gitlab.rb` to lookup their Geo site record in the PostgreSQL database. If `gitlab_rails['geo_node_name']` is not set, then the node's `external_url` with trailing slash is used as fallback. The value of `Name` is case-sensitive, and most characters are allowed. |
+| Name | The unique identifier for the Geo site. It's highly recommended to use a physical location as a name. Good examples are "London Office" or "us-east-1". Avoid words like "primary", "secondary", "Geo", or "DR". This makes the failover process easier because the physical location does not change, but the Geo site role can. All nodes in a single Geo site use the same site name. Nodes use the `gitlab_rails['geo_node_name']` setting in `/etc/gitlab/gitlab.rb` to lookup their Geo site record in the PostgreSQL database. If `gitlab_rails['geo_node_name']` is not set, the node's `external_url` with trailing slash is used as fallback. The value of `Name` is case-sensitive, and most characters are allowed. |
| URL | The instance's user-facing URL. |
The site you're currently browsing is indicated with a blue `Current` label, and
the **primary** node is listed first as `Primary site`.
-## **Secondary** site settings
+## Secondary site settings
**Secondary** sites have a number of additional settings available:
| Setting | Description |
|---------------------------|-------------|
| Selective synchronization | Enable Geo [selective sync](../../administration/geo/replication/configuration.md#selective-synchronization) for this **secondary** site. |
-| Repository sync capacity | Number of concurrent requests this **secondary** site will make to the **primary** site when backfilling repositories. |
-| File sync capacity | Number of concurrent requests this **secondary** site will make to the **primary** site when backfilling files. |
+| Repository sync capacity | Number of concurrent requests this **secondary** site makes to the **primary** site when backfilling repositories. |
+| File sync capacity | Number of concurrent requests this **secondary** site makes to the **primary** site when backfilling files. |
## Geo backfill
**Secondary** sites are notified of changes to repositories and files by the **primary** site,
-and will always attempt to synchronize those changes as quickly as possible.
+and always attempt to synchronize those changes as quickly as possible.
Backfill is the act of populating the **secondary** site with repositories and files that
-existed *before* the **secondary** site was added to the database. Since there may be
-extremely large numbers of repositories and files, it's infeasible to attempt to
-download them all at once, so GitLab places an upper limit on the concurrency of
+existed *before* the **secondary** site was added to the database. Because there may be
+extremely large numbers of repositories and files, it's not feasible to attempt to
+download them all at once; so, GitLab places an upper limit on the concurrency of
these operations.
-How long the backfill takes is a function of the maximum concurrency, but higher
+How long the backfill takes is dependent on the maximum concurrency, but higher
values place more strain on the **primary** site. From [GitLab 10.2](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/3107),
the limits are configurable. If your **primary** site has lots of surplus capacity,
you can increase the values to complete backfill in a shorter time. If it's
-under heavy load and backfill is reducing its availability for normal requests,
+under heavy load and backfill reduces its availability for normal requests,
you can decrease them.
## Using a different URL for synchronization
The **primary** site's Internal URL is used by **secondary** sites to contact it
(to sync repositories, for example). The name Internal URL distinguishes it from
-[External URL](https://docs.gitlab.com/omnibus/settings/configuration.html#configuring-the-external-url-for-gitlab)
+[External URL](https://docs.gitlab.com/omnibus/settings/configuration.html#configuring-the-external-url-for-gitlab),
which is used by users. Internal URL does not need to be a private address.
Internal URL defaults to external URL, but you can also customize it:
@@ -79,21 +79,21 @@ terminated at the load balancer.
WARNING:
Starting with GitLab 13.3 and [until 13.11](https://gitlab.com/gitlab-org/gitlab/-/issues/325522),
-using an internal URL that is not accessible to the users will result in the
-OAuth authorization flow not working properly, as the users will get redirected
+if you use an internal URL that is not accessible to the users, the
+OAuth authorization flow does not work properly, because users are redirected
to the internal URL instead of the external one.
## Multiple secondary sites behind a load balancer
-In GitLab 11.11, **secondary** sites can use identical external URLs as long as
+In GitLab 11.11, **secondary** sites can use identical external URLs if
a unique `name` is set for each Geo site. The `gitlab.rb` setting
`gitlab_rails['geo_node_name']` must:
- Be set for each GitLab instance that runs `puma`, `sidekiq`, or `geo_logcursor`.
- Match a Geo site name.
-The load balancer must use sticky sessions in order to avoid authentication
-failures and cross site request errors.
+The load balancer must use sticky sessions to avoid authentication
+failures and cross-site request errors.
<!-- ## Troubleshooting
diff --git a/doc/user/admin_area/index.md b/doc/user/admin_area/index.md
index a5c3a2a7aeb..27d2bd8f764 100644
--- a/doc/user/admin_area/index.md
+++ b/doc/user/admin_area/index.md
@@ -8,7 +8,7 @@ type: reference
# GitLab Admin Area **(FREE SELF)**
The Admin Area provides a web UI to manage and configure some features of GitLab
-self-managed instances. If you are an Admin user, you can access the Admin Area
+self-managed instances. If you are an administrator, you can access the Admin Area
by visiting `/admin` on your self-managed instance. You can also access it through
the UI:
@@ -16,7 +16,7 @@ the UI:
- GitLab versions 13.12 and earlier: on the top bar, select the Admin Area icon (**{admin}**).
NOTE:
-Only admin users can access the Admin Area.
+Only administrators can access the Admin Area.
## Admin Area sections
@@ -24,7 +24,7 @@ The Admin Area is made up of the following sections:
| Section | Description |
|:-----------------------------------------------|:------------|
-| **{overview}** [Overview](#overview-section) | View your GitLab [Dashboard](#admin-dashboard), and administer [projects](#administering-projects), [users](#administering-users), [groups](#administering-groups), [jobs](#administering-jobs), [runners](#administering-runners), and [Gitaly servers](#administering-gitaly-servers). |
+| **{overview}** [Overview](#overview-section) | View your GitLab [Dashboard](#admin-area-dashboard), and administer [projects](#administering-projects), [users](#administering-users), [groups](#administering-groups), [topics](#administering-topics), [jobs](#administering-jobs), [runners](#administering-runners), and [Gitaly servers](#administering-gitaly-servers). |
| **{monitor}** Monitoring | View GitLab [system information](#system-information), and information on [background jobs](#background-jobs), [logs](#logs), [health checks](monitoring/health_check.md), [requests profiles](#requests-profiles), and [audit events](#audit-events). |
| **{messages}** Messages | Send and manage [broadcast messages](broadcast_messages.md) for your users. |
| **{hook}** System Hooks | Configure [system hooks](../../system_hooks/system_hooks.md) for many events. |
@@ -41,7 +41,7 @@ The Admin Area is made up of the following sections:
| **{appearance}** Appearance | Customize [GitLab appearance](appearance.md). |
| **{settings}** Settings | Modify the [settings](settings/index.md) for your GitLab instance. |
-## Admin Dashboard
+## Admin Area dashboard
The Dashboard provides statistics and system information about the GitLab instance.
@@ -151,7 +151,7 @@ you must provide the complete email address.
#### User impersonation
-An administrator can "impersonate" any other user, including other administrator users.
+An administrator can "impersonate" any other user, including other administrators.
This allows the administrator to "see what the user sees," and take actions on behalf of the user.
You can impersonate a user in the following ways:
@@ -237,6 +237,26 @@ insensitive, and applies partial matching.
To [Create a new group](../group/index.md#create-a-group) click **New group**.
+### Administering Topics
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/340920) in GitLab 14.4.
+
+You can administer all topics in the GitLab instance from the Admin Area's Topics page.
+
+To access the Topics page:
+
+1. On the top bar, select **Menu > Admin**.
+1. On the left sidebar, select **Overview > Topics**.
+
+For each topic, the page displays their name and number of projects labeled with the topic.
+
+To create a new topic, select **New topic**.
+
+To edit a topic, select **Edit** in that topic's row.
+
+To search for topics by name, enter your criteria in the search box. The topic search is case
+insensitive, and applies partial matching.
+
### Administering Jobs
You can administer all jobs in the GitLab instance from the Admin Area's Jobs page.
@@ -369,7 +389,7 @@ The Sidekiq dashboard consists of the following elements:
### Logs
-Since GitLab 13.0, **Log** view has been removed from the admin dashboard since the logging does not work in multi-node setups and could cause confusion for administrators by displaying partial information.
+Since GitLab 13.0, **Log** view has been removed from the Admin Area dashboard since the logging does not work in multi-node setups and could cause confusion for administrators by displaying partial information.
For multi-node systems we recommend ingesting the logs into services like Elasticsearch and Splunk.
diff --git a/doc/user/admin_area/license.md b/doc/user/admin_area/license.md
index 4e97cb8e49c..d984f6f4092 100644
--- a/doc/user/admin_area/license.md
+++ b/doc/user/admin_area/license.md
@@ -5,7 +5,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
type: howto
---
-# Activating GitLab EE
+# Activating GitLab EE **(PREMIUM SELF)**
To enable features of GitLab Enterprise Edition (EE), you need to activate your instance. Ensure you are running an enterprise edition. To verify, sign in to GitLab and browse to `/help`. The GitLab edition and version are listed at the top of the **Help** page.
@@ -15,7 +15,7 @@ As of GitLab Enterprise Edition 9.4.0, a newly-installed instance without an
uploaded license only has the Free features active. A trial license activates all Ultimate features, but after [the trial expires](#what-happens-when-your-license-expires), some functionality
is locked.
-## Activate GitLab EE with an Activation Code **(PREMIUM SELF)**
+## Activate GitLab EE with an Activation Code
As of GitLab Enterprise Edition 14.1, you need an activation code to activate your instance. You can obtain an activation code by [purchasing a license](https://about.gitlab.com/pricing/) or by signing up for a [free trial](https://about.gitlab.com/free-trial/). This activation code is a 24-character alphanumeric string you receive in a confirmation email. You can also sign in to the [Customers Portal](https://customers.gitlab.com/customers/sign_in) to copy the activation code to your clipboard.
@@ -28,9 +28,9 @@ To begin the activation process with your activation code:
1. Read and accept the terms of service.
1. Select **Activate**.
-## Activate GitLab EE with a License File **(PREMIUM SELF)**
+## Activate GitLab EE with a License File
-If you receive a license file from GitLab (for example a new trial), you can upload it by signing into your GitLab instance as an admin or adding it during installation. The license is a base64-encoded ASCII text file with a `.gitlab-license` extension.
+If you receive a license file from GitLab (for example a new trial), you can upload it by signing into your GitLab instance as an administrator or adding it during installation. The license is a base64-encoded ASCII text file with a `.gitlab-license` extension.
## Uploading your license
diff --git a/doc/user/admin_area/merge_requests_approvals.md b/doc/user/admin_area/merge_requests_approvals.md
index ffa08dee10d..18151fc17d5 100644
--- a/doc/user/admin_area/merge_requests_approvals.md
+++ b/doc/user/admin_area/merge_requests_approvals.md
@@ -32,4 +32,7 @@ any commits to the source branch.
- **Prevent editing approval rules in projects and merge requests**. Prevents users from
modifying the approvers list in project settings or in individual merge requests.
-Also read the [project level merge request approval rules](../project/merge_requests/approvals/index.md), which are affected by instance level rules.
+See also the following, which are affected by instance-level rules:
+
+- [Project-level merge request approval rules](../project/merge_requests/approvals/index.md).
+- [Group-level merge request approval rules](../group/index.md#group-approval-rules) available in GitLab 13.9 and later.
diff --git a/doc/user/admin_area/moderate_users.md b/doc/user/admin_area/moderate_users.md
index 2655d927b87..c8f160f729f 100644
--- a/doc/user/admin_area/moderate_users.md
+++ b/doc/user/admin_area/moderate_users.md
@@ -5,7 +5,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
type: howto
---
-# Moderate users
+# Moderate users **(FREE SELF)**
GitLab administrators can moderate user access by approving, blocking, banning, or deactivating
users.
@@ -73,7 +73,7 @@ In order to completely prevent access of a user to the GitLab instance,
administrators can choose to block the user.
Users can be blocked [via an abuse report](review_abuse_reports.md#blocking-users),
-or directly from the Admin Area. To do this:
+by removing them in LDAP, or directly from the Admin Area. To do this:
1. On the top bar, select **Menu > Admin**.
1. On the left sidebar, select **Overview > Users**.
diff --git a/doc/user/admin_area/monitoring/background_migrations.md b/doc/user/admin_area/monitoring/background_migrations.md
index 5765a530baf..da245300e1d 100644
--- a/doc/user/admin_area/monitoring/background_migrations.md
+++ b/doc/user/admin_area/monitoring/background_migrations.md
@@ -11,7 +11,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
> - [Enabled by default](https://gitlab.com/gitlab-org/gitlab/-/issues/329511) in GitLab 13.12.
> - Enabled on GitLab.com.
> - Recommended for production use.
-> - For GitLab self-managed instances, GitLab administrators can opt to [disable it](#enable-or-disable-batched-background-migrations). **(FREE SELF)**
+> - For GitLab self-managed instances, GitLab administrators can opt to [disable it](#enable-or-disable-batched-background-migrations).
There can be [risks when disabling released features](../../../administration/feature_flags.md#risks-when-disabling-released-features).
Refer to this feature's version history for more details.
@@ -21,12 +21,12 @@ are created by GitLab developers and run automatically on upgrade. However, such
limited in scope to help with migrating some `integer` database columns to `bigint`. This is needed to
prevent integer overflow for some tables.
-## Check the status of background migrations **(FREE SELF)**
+## Check the status of background migrations
All migrations must have a `Finished` status before you [upgrade GitLab](../../../update/index.md).
You can [check the status of existing migrations](../../../update/index.md#checking-for-background-migrations-before-upgrading).
-## Enable or disable batched background migrations **(FREE SELF)**
+## Enable or disable batched background migrations
Batched background migrations are under development but ready for production use.
It is deployed behind a feature flag that is **enabled by default**.
@@ -45,21 +45,21 @@ To disable it:
Feature.disable(:execute_batched_migrations_on_schedule)
```
-## Automatic batch size optimization **(FREE SELF)**
+## Automatic batch size optimization
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/60133) in GitLab 13.12.
> - [Deployed behind a feature flag](../../../user/feature_flags.md), disabled by default.
> - [Enabled by default](https://gitlab.com/gitlab-org/gitlab/-/issues/329511) in GitLab 13.12.
> - Enabled on GitLab.com.
> - Recommended for production use.
-> - For GitLab self-managed instances, GitLab administrators can opt to [disable it](#enable-or-disable-automatic-batch-size-optimization). **(FREE SELF)**
+> - For GitLab self-managed instances, GitLab administrators can opt to [disable it](#enable-or-disable-automatic-batch-size-optimization).
There can be [risks when disabling released features](../../../administration/feature_flags.md#risks-when-disabling-released-features).
Refer to this feature's version history for more details.
To maximize throughput of batched background migrations (in terms of the number of tuples updated per time unit), batch sizes are automatically adjusted based on how long the previous batches took to complete.
-## Enable or disable automatic batch size optimization **(FREE SELF)**
+## Enable or disable automatic batch size optimization
Automatic batch size optimization for batched background migrations is under development but ready for production use.
It is deployed behind a feature flag that is **enabled by default**.
@@ -91,13 +91,95 @@ Expected batched background migration for the given configuration to be marked a
{:job_class_name=>"CopyColumnUsingBackgroundMigrationJob", :table_name=>"push_event_payloads", :column_name=>"event_id", :job_arguments=>[["event_id"], ["event_id_convert_to_bigint"]]}
```
-To fix this error:
+First, check if you have followed the [version-specific upgrade instructions for 14.2](../../../update/index.md#1420).
+If you have, you can [manually finish the batched background migration](#manually-finishing-a-batched-background-migration).
+If you haven't, choose one of the following methods:
-1. Update to either 14.0.5 or 14.1.
-1. [Check the status](#check-the-status-of-background-migrations) of the batched background migration from the error message, and make sure it is listed as finished. If it is still active, either wait until it is done, or finalize it manually using the command suggested in the error, for example:
+1. [Rollback and upgrade](#roll-back-and-follow-the-required-upgrade-path) through one of the required
+versions before updating to 14.2+.
+1. [Roll forward](#roll-forward-and-finish-the-migrations-on-the-upgraded-version), staying on the current
+version and manually ensuring that the batched migrations complete successfully.
+
+#### Roll back and follow the required upgrade path
+
+1. [Rollback and restore the previously installed version](../../../update/restore_after_failure.md#roll-back-to-an-earlier-version-and-restore-a-backup)
+1. Update to either 14.0.5 or 14.1 **before** updating to 14.2+
+1. [Check the status](#check-the-status-of-background-migrations) of the batched background migrations and
+make sure they are all marked as finished before attempting to upgrade again. If any remain marked as active,
+you can [manually finish them](#manually-finishing-a-batched-background-migration).
+
+#### Roll forward and finish the migrations on the upgraded version
+
+##### For a deployment with downtime
+
+To run all the batched background migrations, it can take a significant amount of time
+depending on the size of your GitLab installation.
+
+1. [Check the status](#check-the-status-of-background-migrations) of the batched background migrations in the
+database, and [manually run them](#manually-finishing-a-batched-background-migration) with the appropriate
+arguments until the status query returns no rows.
+1. When the status of all of all them is marked as complete, re-run migrations for your installation.
+1. [Complete the database migrations](../../../administration/raketasks/maintenance.md#run-incomplete-database-migrations) from your GitLab upgrade:
+
+ ```plaintext
+ sudo gitlab-rake db:migrate
+ ```
+
+1. Run a reconfigure:
+
+ ```plaintext
+ sudo gitlab-ctl reconfigure
+ ```
+
+1. Finish the upgrade for your installation.
+
+##### For a no-downtime deployment
+
+As the failing migrations are post-deployment migrations, you can remain on a running instance of the upgraded
+version and wait for the batched background migrations to finish normally.
+
+1. [Check the status](#check-the-status-of-background-migrations) of the batched background migration from
+the error message, and make sure it is listed as finished. If it is still active, either wait until it is done,
+or [manually finish it](#manually-finishing-a-batched-background-migration).
+1. Re-run migrations for your installation, so the remaining post-deployment migrations finish.
+
+### Manually finishing a batched background migration
+
+If you need to manually finish a batched background migration due to an
+error, you can run:
+
+```shell
+sudo gitlab-rake gitlab:background_migrations:finalize[<job_class_name>,<table_name>,<column_name>,'<job_arguments>']
+```
+
+Replace the values in angle brackets with the correct
+arguments. For example, if you receive an error similar to this:
+
+```plaintext
+StandardError: An error has occurred, all later migrations canceled:
+
+Expected batched background migration for the given configuration to be marked as 'finished', but it is 'active':
+ {:job_class_name=>"CopyColumnUsingBackgroundMigrationJob", :table_name=>"push_event_payloads", :column_name=>"event_id", :job_arguments=>[["event_id"], ["event_id_convert_to_bigint"]]}
+```
+
+Plug the arguments from the error message into the command:
```shell
sudo gitlab-rake gitlab:background_migrations:finalize[CopyColumnUsingBackgroundMigrationJob,push_event_payloads,event_id,'[["event_id"]\, ["event_id_convert_to_bigint"]]']
```
-1. You can now update to GitLab 14.2 or higher.
+If you need to manually run a batched background migration to continue an upgrade, you can
+[check the status](#check-the-status-of-background-migrations) in the database and get the
+arguments from the query results. For example, if the query returns this:
+
+```plaintext
+ job_class_name | table_name | column_name | job_arguments
+---------------------------------------+------------+-------------+------------------------------------
+ CopyColumnUsingBackgroundMigrationJob | events | id | [["id"], ["id_convert_to_bigint"]]
+ ```
+
+The results from the query can be plugged into the command:
+
+```shell
+sudo gitlab-rake gitlab:background_migrations:finalize[CopyColumnUsingBackgroundMigrationJob,events,id,'[["id"]\, ["id_convert_to_bigint"]]']
+```
diff --git a/doc/user/admin_area/review_abuse_reports.md b/doc/user/admin_area/review_abuse_reports.md
index 6494934c34d..6a8b48e7ba7 100644
--- a/doc/user/admin_area/review_abuse_reports.md
+++ b/doc/user/admin_area/review_abuse_reports.md
@@ -12,14 +12,14 @@ View and resolve abuse reports from GitLab users.
GitLab administrators can view and [resolve](#resolving-abuse-reports) abuse
reports in the Admin Area.
-## Receiving notifications of abuse reports
+## Receive notification of abuse reports by email
-To receive notifications of new abuse reports by email, follow these steps:
+To receive notifications of new abuse reports by email:
1. On the top bar, select **Menu > Admin**.
1. On the left sidebar, select **Settings > Reporting**.
1. Expand the **Abuse reports** section.
-1. Provide an email address.
+1. Provide an email address and select **Save changes**.
The notification email address can also be set and retrieved
[using the API](../../api/settings.md#list-of-settings-that-can-be-accessed-via-api-calls).
diff --git a/doc/user/admin_area/settings/continuous_integration.md b/doc/user/admin_area/settings/continuous_integration.md
index 178b117d06c..1b6da0e2806 100644
--- a/doc/user/admin_area/settings/continuous_integration.md
+++ b/doc/user/admin_area/settings/continuous_integration.md
@@ -47,7 +47,7 @@ details:
![Shared runner details example](img/continuous_integration_shared_runner_details_v14_0.png)
-## Maximum artifacts size **(FREE SELF)**
+## Maximum artifacts size
The maximum size of the [job artifacts](../../../administration/job_artifacts.md)
can be set at:
@@ -216,6 +216,20 @@ of your GitLab instance (`.gitlab-ci.yml` if not set):
It is also possible to specify a [custom CI/CD configuration file for a specific project](../../../ci/pipelines/settings.md#specify-a-custom-cicd-configuration-file).
+## Enable or disable the pipeline suggestion banner
+
+By default, a banner displays in merge requests with no pipeline suggesting a
+walkthrough on how to add one.
+
+![Suggest pipeline banner](img/suggest_pipeline_banner.png)
+
+To enable or disable the banner:
+
+1. On the top bar, select **Menu > Admin**.
+1. On the left sidebar, select **Settings > CI/CD**.
+1. Select or clear the **Enable pipeline suggestion banner** checkbox.
+1. Select **Save changes**.
+
## Required pipeline configuration **(PREMIUM SELF)**
WARNING:
@@ -296,7 +310,7 @@ To set the maximum file size:
> - [Deployed behind a feature flag](../../feature_flags.md), disabled by default.
> - Disabled on GitLab.com.
> - Not recommended for production use.
-> - To use in GitLab self-managed instances, ask a GitLab administrator to enable it. **(FREE SELF)**
+> - To use in GitLab self-managed instances, ask a GitLab administrator to enable it.
GitLab administrators can adjust who is allowed to register runners, by showing and hiding areas of the UI.
diff --git a/doc/user/admin_area/settings/deprecated_api_rate_limits.md b/doc/user/admin_area/settings/deprecated_api_rate_limits.md
new file mode 100644
index 00000000000..a2edb6da86e
--- /dev/null
+++ b/doc/user/admin_area/settings/deprecated_api_rate_limits.md
@@ -0,0 +1,53 @@
+---
+stage: Create
+group: Source Code
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
+type: reference
+---
+
+# Deprecated API rate limits **(FREE SELF)**
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/68645) in GitLab 14.4.
+
+Deprecated API endpoints are those which have been replaced with alternative
+functionality, but cannot be removed without breaking backward compatibility.
+Setting a restrictive rate limit on these endpoints can encourage users to
+switch to the alternatives.
+
+## Deprecated API endpoints
+
+Not all deprecated API endpoints are included in this rate limit - just those
+that might have a performance impact:
+
+- [`GET /groups/:id`](../../../api/groups.md#details-of-a-group) **without** the `with_projects=0` query parameter.
+
+## Define Deprecated API rate limits
+
+Rate limits for deprecated API endpoints are disabled by default. When enabled, they supersede
+the general user and IP rate limits for requests to deprecated endpoints. You can keep any general user
+and IP rate limits already in place, and increase or decrease the rate limits
+for deprecated API endpoints. No other new features are provided by this override.
+
+Prerequisites:
+
+- You must have the Administrator role for your instance.
+
+To override the general user and IP rate limits for requests to deprecated API endpoints:
+
+1. On the top bar, select **Menu > Admin**.
+1. On the left sidebar, select **Settings > Network**.
+1. Expand **Deprecated API Rate Limits**.
+1. Select the check boxes for the types of rate limits you want to enable:
+ - **Unauthenticated API request rate limit**
+ - **Authenticated API request rate limit**
+1. _If you enabled unauthenticated API request rate limits:_
+ 1. Select the **Maximum unauthenticated API requests per period per IP**.
+ 1. Select the **Unauthenticated API rate limit period in seconds**.
+1. _If you enabled authenticated API request rate limits:_
+ 1. Select the **Maximum authenticated API requests per period per user**.
+ 1. Select the **Authenticated API rate limit period in seconds**.
+
+## Resources
+
+- [Rate limits](../../../security/rate_limits.md)
+- [User and IP rate limits](user_and_ip_rate_limits.md)
diff --git a/doc/user/admin_area/settings/email.md b/doc/user/admin_area/settings/email.md
index c04a9a12912..6bc9e97629c 100644
--- a/doc/user/admin_area/settings/email.md
+++ b/doc/user/admin_area/settings/email.md
@@ -72,7 +72,7 @@ To add additional text to emails:
1. Enter your text in the **Additional text** field.
1. Select **Save changes**.
-## User deactivation emails **(FREE SELF)**
+## User deactivation emails
GitLab sends email notifications to users when their account has been deactivated.
diff --git a/doc/user/admin_area/settings/external_authorization.md b/doc/user/admin_area/settings/external_authorization.md
index 985f3c133d5..5f007c83e4b 100644
--- a/doc/user/admin_area/settings/external_authorization.md
+++ b/doc/user/admin_area/settings/external_authorization.md
@@ -1,13 +1,12 @@
---
-stage: none
-group: unassigned
+stage: Manage
+group: Access
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
-type: reference
---
# External authorization control **(FREE SELF)**
-> - [Moved](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/27056) to GitLab Free in 11.10.
+> - [Moved](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/27056) from GitLab Premium to GitLab Free in 11.10.
In highly controlled environments, it may be necessary for access policy to be
controlled by an external service that permits access based on project
diff --git a/doc/user/admin_area/settings/files_api_rate_limits.md b/doc/user/admin_area/settings/files_api_rate_limits.md
new file mode 100644
index 00000000000..f91d4b2fb0c
--- /dev/null
+++ b/doc/user/admin_area/settings/files_api_rate_limits.md
@@ -0,0 +1,56 @@
+---
+stage: Create
+group: Source Code
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
+type: reference
+---
+
+# Files API rate limits **(FREE SELF)**
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/68561) in GitLab 14.3.
+
+FLAG:
+On self-managed GitLab, by default this feature is not available. To make it
+available, ask an administrator to [enable the `files_api_throttling` flag](../../../administration/feature_flags.md).
+On GitLab.com, this feature is available but can be configured by GitLab.com
+administrators only. The feature is not ready for production use.
+
+The [Repository files API](../../../api/repository_files.md) enables you to
+fetch, create, update, and delete files in your repository. To improve the security
+and durability of your web application, you can enforce
+[rate limits](../../../security/rate_limits.md) on this API. Any rate limits you
+create for the Files API override the [general user and IP rate limits](user_and_ip_rate_limits.md).
+
+## Define Files API rate limits
+
+Rate limits for the Files API are disabled by default. When enabled, they supersede
+the general user and IP rate limits for requests to the
+[Repository files API](../../../api/repository_files.md). You can keep any general user
+and IP rate limits already in place, and increase or decrease the rate limits
+for the Files API. No other new features are provided by this override.
+
+Prerequisites:
+
+- You must have the Administrator role for your instance.
+- The `files_api_throttling` feature flag must be enabled.
+
+To override the general user and IP rate limits for requests to the Repository files API:
+
+1. On the top bar, select **Menu > Admin**.
+1. On the left sidebar, select **Settings > Network**.
+1. Expand **Files API Rate Limits**.
+1. Select the check boxes for the types of rate limits you want to enable:
+ - **Unauthenticated API request rate limit**
+ - **Authenticated API request rate limit**
+1. _If you enabled unauthenticated API request rate limits:_
+ 1. Select the **Max unauthenticated API requests per period per IP**.
+ 1. Select the **Unauthenticated API rate limit period in seconds**.
+1. _If you enabled authenticated API request rate limits:_
+ 1. Select the **Max authenticated API requests per period per user**.
+ 1. Select the **Authenticated API rate limit period in seconds**.
+
+## Resources
+
+- [Rate limits](../../../security/rate_limits.md)
+- [Repository files API](../../../api/repository_files.md)
+- [User and IP rate limits](user_and_ip_rate_limits.md)
diff --git a/doc/user/admin_area/settings/floc.md b/doc/user/admin_area/settings/floc.md
index 17c390aef0e..6bfc6dfbebd 100644
--- a/doc/user/admin_area/settings/floc.md
+++ b/doc/user/admin_area/settings/floc.md
@@ -6,7 +6,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# Federated Learning of Cohorts (FLoC) **(FREE SELF)**
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/60933) in GitLab Free 13.12.
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/60933) in GitLab 13.12.
Federated Learning of Cohorts (FLoC) is a new feature of the Chrome browser.
It works by categorizing users into different cohorts, so that
diff --git a/doc/user/admin_area/settings/gitaly_timeouts.md b/doc/user/admin_area/settings/gitaly_timeouts.md
index 1d4f45d1f04..5da43935052 100644
--- a/doc/user/admin_area/settings/gitaly_timeouts.md
+++ b/doc/user/admin_area/settings/gitaly_timeouts.md
@@ -22,6 +22,6 @@ The following timeouts are available.
| Timeout | Default | Description |
|:--------|:-----------|:----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
-| Default | 55 seconds | Timeout for most Gitaly calls (not enforced for `git` `fetch` and `push` operations, or Sidekiq jobs). For example, checking if a repository exists on disk. Makes sure that Gitaly calls made within a web request cannot exceed the entire request timeout. It should be shorter than the worker timeout that can be configured for [Puma](https://docs.gitlab.com/omnibus/settings/puma.html#puma-settings). If a Gitaly call timeout exceeds the worker timeout, the remaining time from the worker timeout is used to avoid having to terminate the worker. |
+| Default | 55 seconds | Timeout for most Gitaly calls (not enforced for `git` `fetch` and `push` operations, or Sidekiq jobs). For example, checking if a repository exists on disk. Makes sure that Gitaly calls made within a web request cannot exceed the entire request timeout. It should be shorter than the worker timeout that can be configured for [Puma](../../../install/requirements.md#puma-settings). If a Gitaly call timeout exceeds the worker timeout, the remaining time from the worker timeout is used to avoid having to terminate the worker. |
| Fast | 10 seconds | Timeout for fast Gitaly operations used within requests, sometimes multiple times. For example, checking if a repository exists on disk. If fast operations exceed this threshold, there may be a problem with a storage shard. Failing fast can help maintain the stability of the GitLab instance. |
| Medium | 30 seconds | Timeout for Gitaly operations that should be fast (possibly within requests) but preferably not used multiple times within a request. For example, loading blobs. Timeout that should be set between Default and Fast. |
diff --git a/doc/user/admin_area/settings/help_page.md b/doc/user/admin_area/settings/help_page.md
index cf08b9b71db..0bf5dc1d37a 100644
--- a/doc/user/admin_area/settings/help_page.md
+++ b/doc/user/admin_area/settings/help_page.md
@@ -68,12 +68,9 @@ You can specify a custom URL to which users are directed when they:
## Redirect `/help` pages
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/43157) in GitLab 13.5.
-
-FLAG:
-On self-managed GitLab, by default this feature is not available. To make it available, ask an administrator to
-[enable the `:help_page_documentation_redirect` flag](../../../administration/feature_flags.md).
-On GitLab.com, this feature is available but can be configured by GitLab.com administrators only.
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/43157) in GitLab 13.5.
+> - [Feature flag `help_page_documentation_redirect`](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/71737) removed in GitLab 14.4.
+> - [Generally available](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/71737) in GitLab 14.4.
The `/help` URL of a GitLab instance displays a basic version of the documentation sourced from the
[`doc` directory](https://gitlab.com/gitlab-org/gitlab/-/tree/master/doc) of GitLab. `/help` links
diff --git a/doc/user/admin_area/settings/img/suggest_pipeline_banner.png b/doc/user/admin_area/settings/img/suggest_pipeline_banner.png
new file mode 100644
index 00000000000..9f118ccc5ed
--- /dev/null
+++ b/doc/user/admin_area/settings/img/suggest_pipeline_banner.png
Binary files differ
diff --git a/doc/user/admin_area/settings/index.md b/doc/user/admin_area/settings/index.md
index ec5f3ca812f..688734849e5 100644
--- a/doc/user/admin_area/settings/index.md
+++ b/doc/user/admin_area/settings/index.md
@@ -98,6 +98,8 @@ To access the default page for Admin Area settings:
| [User and IP rate limits](user_and_ip_rate_limits.md) | Configure limits for web and API requests. |
| [Package Registry Rate Limits](package_registry_rate_limits.md) | Configure specific limits for Packages API requests that supersede the user and IP rate limits. |
| [Git LFS Rate Limits](git_lfs_rate_limits.md) | Configure specific limits for Git LFS requests that supersede the user and IP rate limits. |
+| [Files API Rate Limits](files_api_rate_limits.md) | Configure specific limits for Files API requests that supersede the user and IP rate limits. |
+| [Deprecated API Rate Limits](deprecated_api_rate_limits.md) | Configure specific limits for deprecated API requests that supersede the user and IP rate limits. |
| [Outbound requests](../../../security/webhooks.md) | Allow requests to the local network from hooks and services. |
| [Protected Paths](protected_paths.md) | Configure paths to be protected by Rack Attack. |
| [Incident Management](../../../operations/incident_management/index.md) Limits | Limit the number of inbound alerts that can be sent to a project. |
diff --git a/doc/user/admin_area/settings/instance_template_repository.md b/doc/user/admin_area/settings/instance_template_repository.md
index 862bf3b1652..044863729db 100644
--- a/doc/user/admin_area/settings/instance_template_repository.md
+++ b/doc/user/admin_area/settings/instance_template_repository.md
@@ -31,6 +31,8 @@ After you add templates, you can use them for the entire instance.
They are available in the [Web Editor's dropdown](../../project/repository/web_editor.md#template-dropdowns)
and through the [API settings](../../../api/settings.md).
+## Supported file types and locations
+
Templates must be added to a specific subdirectory in the repository,
corresponding to the kind of template. The following types of custom templates
are supported:
diff --git a/doc/user/admin_area/settings/protected_paths.md b/doc/user/admin_area/settings/protected_paths.md
index 061e9fa05d3..dc328fe8b7c 100644
--- a/doc/user/admin_area/settings/protected_paths.md
+++ b/doc/user/admin_area/settings/protected_paths.md
@@ -41,7 +41,7 @@ try again.
## Configure using GitLab UI
-> Introduced in [GitLab 12.4](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/31246).
+> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/31246) in GitLab 12.4.
Throttling of protected paths is enabled by default and can be disabled or
customized on **Admin > Network > Protected Paths**, along with these options:
diff --git a/doc/user/admin_area/settings/rate_limit_on_issues_creation.md b/doc/user/admin_area/settings/rate_limit_on_issues_creation.md
index a2e8a875ebb..50dd24de3fb 100644
--- a/doc/user/admin_area/settings/rate_limit_on_issues_creation.md
+++ b/doc/user/admin_area/settings/rate_limit_on_issues_creation.md
@@ -19,7 +19,7 @@ To can change its value:
1. Select **Save changes**.
For example, if you set a limit of 300, requests using the
-[Projects::IssuesController#create](https://gitlab.com/gitlab-org/gitlab/raw/master/app/controllers/projects/issues_controller.rb)
+[Projects::IssuesController#create](https://gitlab.com/gitlab-org/gitlab/blob/master/app/controllers/projects/issues_controller.rb)
action exceeding a rate of 300 per minute are blocked. Access to the endpoint is allowed after one minute.
When using [epics](../../group/epics/index.md), epic creation will share this rate limit with issues.
diff --git a/doc/user/admin_area/settings/sidekiq_job_limits.md b/doc/user/admin_area/settings/sidekiq_job_limits.md
index c6a783beb3f..750665285b4 100644
--- a/doc/user/admin_area/settings/sidekiq_job_limits.md
+++ b/doc/user/admin_area/settings/sidekiq_job_limits.md
@@ -13,7 +13,6 @@ type: reference
Redis. To avoid excessive memory for Redis, we:
- Compress job arguments before storing them in Redis.
-arguments before storing them in Redis, and rejecting jobs that exceed
- Reject jobs that exceed the specified threshold limit after compression.
To access Sidekiq job size limits:
@@ -30,7 +29,6 @@ To access Sidekiq job size limits:
|-------------------------------------------|------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| Limiting mode | Compress | This mode compresses the jobs at the specified threshold and rejects them if they exceed the specified limit after compression. |
| Sidekiq job compression threshold (bytes) | 100 000 (100 KB) | When the size of arguments exceeds this threshold, they are compressed before being stored in Redis. |
-| Sidekiq job size limit (bytes) | 0 | The jobs exceeding this size after compression are rejected. This avoids excessive memory usage in Redis leading to instability. Setting it to 0 prevents rejecting jobs. |
+| Sidekiq job size limit (bytes) | 0 | The jobs exceeding this size after compression are rejected. This avoids excessive memory usage in Redis leading to instability. Setting it to 0 prevents rejecting jobs. |
-After changing these values, [restart
-Sidekiq](../../../administration/restart_gitlab.md).
+After changing these values, [restart Sidekiq](../../../administration/restart_gitlab.md).
diff --git a/doc/user/admin_area/settings/sign_in_restrictions.md b/doc/user/admin_area/settings/sign_in_restrictions.md
index 223ffeebd44..8cee63b0ac2 100644
--- a/doc/user/admin_area/settings/sign_in_restrictions.md
+++ b/doc/user/admin_area/settings/sign_in_restrictions.md
@@ -24,6 +24,8 @@ You can restrict the password authentication for web interface and Git over HTTP
- **Web interface**: When this feature is disabled, the **Standard** sign-in tab is removed and an [external authentication provider](../../../administration/auth/index.md) must be used.
- **Git over HTTP(S)**: When this feature is disabled, a [Personal Access Token](../../profile/personal_access_tokens.md) must be used to authenticate.
+In the event of an external authentication provider outage, use the [GitLab Rails console](../../../administration/operations/rails_console.md) to [re-enable the standard web sign-in form](../../../administration/troubleshooting/gitlab_rails_cheat_sheet.md#re-enable-standard-web-sign-in-form). This configuration can also be changed over the [Application settings REST API](../../../api/settings.md#change-application-settings) while authenticating with an administrator account's personal access token.
+
## Admin Mode
> [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/2158) in GitLab 13.10.
@@ -104,7 +106,7 @@ see [Email notification for unknown sign-ins](../../profile/unknown_sign_in_noti
All users that are not logged in are redirected to the page represented by the configured
**Home page URL** if value is not empty.
-All users are redirected to the page represented by the configured **After sign out path**
+All users are redirected to the page represented by the configured **After sign-out path**
after sign out if value is not empty.
In the **Sign-in restrictions** section, scroll to the **Sign-in text** field. You can add a
diff --git a/doc/user/admin_area/settings/sign_up_restrictions.md b/doc/user/admin_area/settings/sign_up_restrictions.md
index dc09d6a5132..ed80bca470e 100644
--- a/doc/user/admin_area/settings/sign_up_restrictions.md
+++ b/doc/user/admin_area/settings/sign_up_restrictions.md
@@ -31,7 +31,7 @@ To disable sign ups:
> - [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/4491) in GitLab 13.5.
> - [Enabled by default](https://gitlab.com/gitlab-org/gitlab/-/issues/267568) in GitLab 13.6.
-When this setting is enabled, any user visiting your GitLab domain and signing up for a new account
+When this setting is enabled, any user visiting your GitLab domain and signing up for a new account using the registration form
must be explicitly [approved](../moderate_users.md#approve-or-reject-a-user-sign-up) by an
administrator before they can start using their account. In GitLab 13.6 and later, this setting is
enabled by default for new GitLab instances. It is only applicable if sign ups are enabled.
@@ -45,6 +45,12 @@ To require administrator approval for new sign ups:
In [GitLab 13.7 and later](https://gitlab.com/gitlab-org/gitlab/-/issues/273258), if an administrator disables this setting, the users in pending approval state are
automatically approved in a background job.
+NOTE:
+This setting doesn't apply to LDAP or OmniAuth users. To enforce approvals for new users
+signing up using OmniAuth or LDAP, set `block_auto_created_users` to `true` in the
+[OmniAuth configuration](../../../integration/omniauth.md#initial-omniauth-configuration) or
+[LDAP configuration](../../../administration/auth/ldap/index.md#basic-configuration-settings).
+
## Require email confirmation
You can send confirmation emails during sign up and require that users confirm
@@ -56,7 +62,7 @@ To enforce confirmation of the email address used for new sign ups:
1. On the left sidebar, select **Settings > General**, and expand **Sign-up restrictions**.
1. Select the **Enable email restrictions for sign ups** checkbox, then select **Save changes**.
-## User cap **(FREE SELF)**
+## User cap
> - [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/4315) in GitLab 13.7.
> - [Feature flag removed](https://gitlab.com/gitlab-org/gitlab/-/issues/292600) in GitLab 13.9.
@@ -117,7 +123,7 @@ the minimum number of characters a user must have in their password using the Gi
You can specify an inclusive or exclusive list of email domains which can be used for user sign up.
These restrictions are only applied during sign up from an external user. An administrator can add a
-user through the admin panel with a disallowed domain. Also, note that the users can change their
+user through the administrator panel with a disallowed domain. Also, note that the users can change their
email addresses to disallowed domains after sign up.
### Allowlist email domains
diff --git a/doc/user/admin_area/settings/third_party_offers.md b/doc/user/admin_area/settings/third_party_offers.md
index a9c8c5d2a76..c9d48b14a6c 100644
--- a/doc/user/admin_area/settings/third_party_offers.md
+++ b/doc/user/admin_area/settings/third_party_offers.md
@@ -7,7 +7,7 @@ type: reference
# Third-party offers **(FREE SELF)**
-> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/20379) in GitLab Free 11.1.
+> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/20379) in GitLab 11.1.
Within GitLab, we inform users of available third-party offers they might find valuable in order
to enhance the development of their projects. An example is the Google Cloud Platform free credit
diff --git a/doc/user/admin_area/settings/usage_statistics.md b/doc/user/admin_area/settings/usage_statistics.md
index 330a25087ef..923ea9e19c1 100644
--- a/doc/user/admin_area/settings/usage_statistics.md
+++ b/doc/user/admin_area/settings/usage_statistics.md
@@ -12,7 +12,7 @@ to perform various actions.
All usage statistics are [opt-out](#enable-or-disable-usage-statistics).
-## Service Ping **(FREE SELF)**
+## Service Ping
Service Ping is a process that collects and sends a weekly payload to GitLab Inc.
For more information, see the [Service Ping guide](../../../development/service_ping/index.md).
@@ -23,7 +23,7 @@ When Service Ping is enabled, GitLab gathers data from other instances and
enables certain [instance-level analytics features](../analytics/index.md)
that are dependent on Service Ping.
-## Version check **(FREE SELF)**
+## Version check
If enabled, version check informs you if a new version is available and the
importance of it through a status. The status displays on the help pages (`/help`)
@@ -76,7 +76,7 @@ To enable or disable Service Ping and version check:
1. On the top bar, select **Menu > Admin**.
1. On the left sidebar, select **Settings > Metrics and profiling**.
1. Expand **Usage statistics**.
-1. Select or clear the **Enable version check** and **Enable service ping** checkboxes.
+1. Select or clear the **Enable version check** and **Enable Service Ping** checkboxes.
1. Select **Save changes**.
<!-- ## Troubleshooting
diff --git a/doc/user/admin_area/settings/user_and_ip_rate_limits.md b/doc/user/admin_area/settings/user_and_ip_rate_limits.md
index 32f08801c76..ac6fe29da28 100644
--- a/doc/user/admin_area/settings/user_and_ip_rate_limits.md
+++ b/doc/user/admin_area/settings/user_and_ip_rate_limits.md
@@ -189,6 +189,10 @@ The possible names are:
- `throttle_unauthenticated_packages_api`
- `throttle_authenticated_packages_api`
- `throttle_authenticated_git_lfs`
+- `throttle_unauthenticated_files_api`
+- `throttle_authenticated_files_api`
+- `throttle_unauthenticated_deprecated_api`
+- `throttle_authenticated_deprecated_api`
For example, to try out throttles for all authenticated requests to
non-protected paths can be done by setting
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 7f3f4b32802..075becfd32f 100644
--- a/doc/user/admin_area/settings/visibility_and_access_controls.md
+++ b/doc/user/admin_area/settings/visibility_and_access_controls.md
@@ -21,10 +21,7 @@ To access the visibility and access control options:
With this option, you can define [branch protections](../../project/protected_branches.md)
to apply to every repository's [default branch](../../project/repository/branches/default.md).
-These protections specify the user roles with permission to:
-
-- Push to branches.
-- Delete branches.
+These protections specify the user roles with permission to push to default branches.
This setting applies only to each repository's default branch. To protect other branches,
you must configure [branch protection in the repository](../../project/protected_branches.md),
@@ -37,14 +34,14 @@ To change the default branch protection for the entire instance:
1. On the left sidebar, select **Settings > General**.
1. Expand the **Visibility and access controls** section.
1. Select a **Default branch protection**:
- - **Not protected** - Both developers and maintainers can push new commits,
- force push, or delete the branch.
+ - **Not protected** - Both developers and maintainers can push new commits
+ and force push.
- **Protected against pushes** - Developers cannot push new commits, but are
allowed to accept merge requests to the branch. Maintainers can push to the branch.
- **Partially protected** - Both developers and maintainers can push new commits,
- but cannot force push or delete the branch.
+ but cannot force push.
- **Fully protected** - Developers cannot push new commits, but maintainers can.
- No one can force push or delete the branch.
+ No one can force push.
1. To allow group owners to override the instance's default branch protection, select
[**Allow owners to manage default branch protection per group**](#prevent-overrides-of-default-branch-protection).
1. Select **Save changes**.
@@ -295,7 +292,7 @@ For more details, see [SSH key restrictions](../../../security/ssh_keys_restrict
## Enable project mirroring
This option is enabled by default. By disabling it, both
-[pull and push mirroring](../../project/repository/repository_mirroring.md) no longer
+[pull mirroring](../../project/repository/mirror/pull.md) and [push mirroring](../../project/repository/mirror/push.md) no longer
work in every repository. They can only be re-enabled by an administrator user on a per-project basis.
![Mirror settings](img/mirror_settings.png)
diff --git a/doc/user/admin_area/user_cohorts.md b/doc/user/admin_area/user_cohorts.md
index 89026e56a27..28376923810 100644
--- a/doc/user/admin_area/user_cohorts.md
+++ b/doc/user/admin_area/user_cohorts.md
@@ -4,7 +4,7 @@ group: unassigned
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Cohorts **(FREE)**
+# Cohorts **(FREE SELF)**
You can analyze your users' GitLab activities over time.
diff --git a/doc/user/analytics/ci_cd_analytics.md b/doc/user/analytics/ci_cd_analytics.md
index 3c80e1f5f2a..4a42133c308 100644
--- a/doc/user/analytics/ci_cd_analytics.md
+++ b/doc/user/analytics/ci_cd_analytics.md
@@ -24,7 +24,7 @@ View pipeline duration history:
## DevOps Research and Assessment (DORA) key metrics **(ULTIMATE)**
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/275991) in GitLab 13.7.
-> - Added support for [lead time for changes](https://gitlab.com/gitlab-org/gitlab/-/issues/291746) in GitLab 13.10.
+> - [Added support](https://gitlab.com/gitlab-org/gitlab/-/issues/291746) for lead time for changes in GitLab 13.10.
Customer experience is a key metric. Users want to measure platform stability and other
post-deployment performance KPIs, and set targets for customer behavior, experience, and financial
@@ -56,7 +56,7 @@ The following table shows the supported metrics, at which level they are support
| `change_failure_rate` | Project/Group-level | To be supported | To be supported | |
| `time_to_restore_service` | Project/Group-level | To be supported | To be supported | |
-### Deployment frequency charts **(ULTIMATE)**
+### Deployment frequency charts
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/275991) in GitLab 13.8.
@@ -69,7 +69,7 @@ for its deployment information to appear on the graphs.
These charts are available for both groups and projects.
-### Lead time charts **(ULTIMATE)**
+### Lead time charts
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/250329) in GitLab 13.11.
diff --git a/doc/user/analytics/img/project_vsa_filter_v14_3.png b/doc/user/analytics/img/project_vsa_filter_v14_3.png
new file mode 100644
index 00000000000..d3fcad31909
--- /dev/null
+++ b/doc/user/analytics/img/project_vsa_filter_v14_3.png
Binary files differ
diff --git a/doc/user/analytics/img/project_vsa_stage_table_v14_4.png b/doc/user/analytics/img/project_vsa_stage_table_v14_4.png
new file mode 100644
index 00000000000..e65296062f6
--- /dev/null
+++ b/doc/user/analytics/img/project_vsa_stage_table_v14_4.png
Binary files differ
diff --git a/doc/user/analytics/index.md b/doc/user/analytics/index.md
index 5b7e6e39187..c01788f4fc4 100644
--- a/doc/user/analytics/index.md
+++ b/doc/user/analytics/index.md
@@ -10,7 +10,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
When we describe GitLab analytics, we use the following terms:
-- **Cycle time:** The duration of only the execution work alone. Often displayed in combination with "lead time," which is longer. GitLab measures cycle time from issue first merge request creation to issue close. This approach underestimates lead time because merge request creation is always later than commit time. GitLab displays cycle time in [group-level Value Stream Analytics](../group/value_stream_analytics/index.md).
+- **Cycle time:** The duration of only the execution work. Cycle time is often displayed in combination with the lead time, which is longer than the cycle time. GitLab measures cycle time from the earliest commit of a [linked issue's merge request](../project/issues/crosslinking_issues.md) to when that issue is closed. The cycle time approach underestimates the lead time because merge request creation is always later than commit time. GitLab displays cycle time in [group-level Value Stream Analytics](../group/value_stream_analytics/index.md) and [project-level Value Stream Analytics](../analytics/value_stream_analytics.md).
- **Deploys:** The total number of successful deployments to production in the given time frame (across all applicable projects). GitLab displays deploys in [group-level Value Stream Analytics](../group/value_stream_analytics/index.md) and [project-level Value Stream Analytics](value_stream_analytics.md).
- **DORA (DevOps Research and Assessment)** ["Four Keys"](https://cloud.google.com/blog/products/devops-sre/using-the-four-keys-to-measure-your-devops-performance):
- **Speed/Velocity**
diff --git a/doc/user/analytics/issue_analytics.md b/doc/user/analytics/issue_analytics.md
index 44b8c87ee27..af7307eab39 100644
--- a/doc/user/analytics/issue_analytics.md
+++ b/doc/user/analytics/issue_analytics.md
@@ -7,7 +7,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# Issue Analytics **(PREMIUM)**
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/196561) in [GitLab Premium](https://about.gitlab.com/pricing/) 12.9.
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/196561) in GitLab 12.9.
Issue Analytics is a bar graph which illustrates the number of issues created each month.
The default time span is 13 months, which includes the current month, and the 12 months
diff --git a/doc/user/analytics/merge_request_analytics.md b/doc/user/analytics/merge_request_analytics.md
index 44e4cd8b371..2ff15c00a3f 100644
--- a/doc/user/analytics/merge_request_analytics.md
+++ b/doc/user/analytics/merge_request_analytics.md
@@ -115,5 +115,5 @@ bookmark for those preferred settings in your browser.
The **Merge Request Analytics** feature can be accessed only:
-- On [Premium](https://about.gitlab.com/pricing/) and above.
+- On [GitLab Premium](https://about.gitlab.com/pricing/) and above.
- By users with [Reporter access](../permissions.md) and above.
diff --git a/doc/user/analytics/productivity_analytics.md b/doc/user/analytics/productivity_analytics.md
index 391ec5c04d9..dbe71d5f743 100644
--- a/doc/user/analytics/productivity_analytics.md
+++ b/doc/user/analytics/productivity_analytics.md
@@ -6,7 +6,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# Productivity Analytics **(PREMIUM)**
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/12079) in [GitLab Premium](https://about.gitlab.com/pricing/) 12.3.
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/12079) in GitLab 12.3.
Track development velocity with Productivity Analytics.
@@ -60,5 +60,5 @@ You can filter analytics based on a date range. To filter results:
The **Productivity Analytics** dashboard can be accessed only:
-- On the [Premium tier](https://about.gitlab.com/pricing/) and above.
+- On [GitLab Premium](https://about.gitlab.com/pricing/) and above.
- By users with [Reporter access](../permissions.md) and above.
diff --git a/doc/user/analytics/repository_analytics.md b/doc/user/analytics/repository_analytics.md
index 9016bf6393f..e8f8acf5661 100644
--- a/doc/user/analytics/repository_analytics.md
+++ b/doc/user/analytics/repository_analytics.md
@@ -4,7 +4,7 @@ group: Optimize
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Repository Analytics
+# Repository Analytics **(FREE)**
Get high-level overview of the project's Git repository.
diff --git a/doc/user/analytics/value_stream_analytics.md b/doc/user/analytics/value_stream_analytics.md
index 7057d069e95..9c1a8893f95 100644
--- a/doc/user/analytics/value_stream_analytics.md
+++ b/doc/user/analytics/value_stream_analytics.md
@@ -43,12 +43,59 @@ The stages tracked by Value Stream Analytics by default represent the [GitLab fl
- **Staging** (Continuous Deployment)
- Time between merging and deploying to production
+## Filter Value Stream Analytics data
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/326701) in GitLab 14.3
+
+You can filter analytics based on the following parameters:
+
+- Milestones (Group level)
+- Labels (Group level)
+- Author
+- Assignees
+
+To filter results:
+
+1. Select the **Filter results** text box.
+1. Select a parameter.
+1. Select a value. To find a value in the list, enter the value name.
+
+![Value stream analytics filter bar](img/project_vsa_filter_v14_3.png "Active filter bar for a project's Value Stream Analytics")
+
### Date ranges
To filter analytics results based on a date range,
select different **From** and **To** days
from the date picker (default: last 30 days).
+### Stage table
+
+> Sorting the stage table [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/335974) in GitLab 14.4.
+
+![Value Stream Analytics Stage table](img/project_vsa_stage_table_v14_4.png "Project VSA stage table")
+
+The stage table shows a list of related workflow items for the selected stage. This can include:
+
+- CI/CD jobs
+- Issues
+- Merge requests
+- Pipelines
+
+A little badge next to the workflow items table header shows the number of workflow items that
+completed the selected stage.
+
+The stage table also includes the **Time** column, which shows how long it takes each item to pass
+through the selected value stream stage.
+
+To sort the stage table by a table column, select the table header.
+You can sort in ascending or descending order. To find items that spent the most time in a stage,
+potentially causing bottlenecks in your value stream, sort the table by the **Time** column.
+From there, select individual items to drill in and investigate how delays are happening.
+To see which items most recently exited the stage, sort by the work item column on the left.
+
+The table displays 20 items per page. If there are more than 20 items, you can use the
+**Prev** and **Next** buttons to navigate through the pages.
+
## How Time metrics are measured
The **Time** metrics near the top of the page are measured as follows:
diff --git a/doc/user/application_security/api_fuzzing/create_har_files.md b/doc/user/application_security/api_fuzzing/create_har_files.md
index 7940e072420..db0b2a32bcf 100644
--- a/doc/user/application_security/api_fuzzing/create_har_files.md
+++ b/doc/user/application_security/api_fuzzing/create_har_files.md
@@ -68,8 +68,12 @@ Install GitLab HAR Recorder:
1. Make sure proxy is used!
1. Stop the recorder.
-To verify the HAR contains all requests, use the [HAR Viewer (online)](http://www.softwareishard.com/har/viewer/).
-[Google Admin Toolbox HAR Analyzer](https://toolbox.googleapps.com/apps/har_analyzer/)
+To verify the HAR contains all requests, use an online HAR viewer, for example:
+
+- [HAR Viewer](http://www.softwareishard.com/har/viewer/)
+<!-- vale gitlab.Admin = NO -->
+- [Google Admin Toolbox HAR Analyzer](https://toolbox.googleapps.com/apps/har_analyzer/)
+<!-- vale gitlab.Admin = YES -->
### Insomnia API Client
@@ -190,7 +194,9 @@ a text editor.
Tools recommended for viewing HAR files include:
- [HAR Viewer](http://www.softwareishard.com/har/viewer/) - (online)
+<!-- vale gitlab.Admin = NO -->
- [Google Admin Toolbox HAR Analyzer](https://toolbox.googleapps.com/apps/har_analyzer/) - (online)
+<!-- vale gitlab.Admin = YES -->
- [Fiddler](https://www.telerik.com/fiddler) - local
- [Insomnia API Client](https://insomnia.rest/) - local
diff --git a/doc/user/application_security/configuration/index.md b/doc/user/application_security/configuration/index.md
index 98e241ba3bd..674eee5e80a 100644
--- a/doc/user/application_security/configuration/index.md
+++ b/doc/user/application_security/configuration/index.md
@@ -38,7 +38,7 @@ Select **Configuration history** to see the `.gitlab-ci.yml` file's history.
You can configure the following security controls:
-- Static Application Security Testing (SAST)
+- Static Application Security Testing (SAST) **(FREE)**
- Select **Enable SAST** to configure SAST for the current project.
For more details, read [Configure SAST in the UI](../sast/index.md#configure-sast-in-the-ui).
- Dynamic Application Security Testing (DAST) **(ULTIMATE)**
diff --git a/doc/user/application_security/container_scanning/index.md b/doc/user/application_security/container_scanning/index.md
index 2b3d4dbfc0a..22b54bf019c 100644
--- a/doc/user/application_security/container_scanning/index.md
+++ b/doc/user/application_security/container_scanning/index.md
@@ -42,10 +42,20 @@ To enable container scanning in your pipeline, you need the following:
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)
- the Docker image to your project's container registry. If using a third-party container
- registry, you might need to provide authentication credentials using the `DOCKER_USER` and
- `DOCKER_PASSWORD` [configuration variables](#available-cicd-variables).
+ the Docker image to your project's container registry.
- The name of the Docker image to scan, in the `DOCKER_IMAGE` [configuration variable](#available-cicd-variables).
+- If you're using a third-party container registry, you might need to provide authentication
+ credentials through the `DOCKER_USER` and `DOCKER_PASSWORD` [configuration variables](#available-cicd-variables).
+ For example, if you are connecting to AWS ECR, you might use the following:
+
+```yaml
+export AWS_ECR_PASSWORD=$(aws ecr get-login-password --region region)
+
+include:
+ - template: Security/Container-Scanning.gitlab-ci.yml
+ DOCKER_USER: AWS
+ DOCKER_PASSWORD: "$AWS_ECR_PASSWORD"
+```
## Configuration
@@ -397,7 +407,7 @@ For details on saving and transporting Docker images as a file, see Docker's doc
We recommend that you set up a [scheduled pipeline](../../../ci/pipelines/schedules.md)
to fetch the latest vulnerabilities database on a preset schedule.
Automating this with a pipeline means you do not have to do it manually each time. You can use the
-following `.gitlab-yml.ci` example as a template.
+following `.gitlab-ci.yml` example as a template.
```yaml
variables:
@@ -420,6 +430,39 @@ The above template works for a GitLab Docker registry running on a local install
you're using a non-GitLab Docker registry, you must change the `$CI_REGISTRY` value and the
`docker login` credentials to match your local registry's details.
+#### Scan images in external private registries
+
+To scan an image in an external private registry, you must configure access credentials so the
+container scanning analyzer can authenticate itself before attempting to access the image to scan.
+
+If you use the GitLab [Container Registry](../../packages/container_registry/),
+the `DOCKER_USER` and `DOCKER_PASSWORD` [configuration variables](#available-cicd-variables)
+are set automatically and you can skip this configuration.
+
+This example shows the configuration needed to scan images in a private [Google Container Registry](https://cloud.google.com/container-registry/):
+
+```yaml
+include:
+ - template: Security/Container-Scanning.gitlab-ci.yml
+
+container_scanning:
+ variables:
+ DOCKER_USER: _json_key
+ DOCKER_PASSWORD: "$GCP_CREDENTIALS"
+ DOCKER_IMAGE: "gcr.io/path-to-you-registry/image:tag"
+```
+
+Before you commit this configuration, [add a CI/CD variable](../../../ci/variables/#add-a-cicd-variable-to-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:
+
+- The value of the variable may not fit the masking requirements for the **Mask variable** option,
+ so the value could be exposed in the job logs.
+- Scans may not run in unprotected feature branches if you select the **Protect variable** option.
+- Consider creating credentials with read-only permissions and rotating them regularly if the
+ options aren't selected.
+
## Running the standalone container scanning tool
It's possible to run the [GitLab container scanning tool](https://gitlab.com/gitlab-org/security-products/analyzers/container-scanning)
diff --git a/doc/user/application_security/coverage_fuzzing/index.md b/doc/user/application_security/coverage_fuzzing/index.md
index 0d5eb2b6d50..cdb2e7109bf 100644
--- a/doc/user/application_security/coverage_fuzzing/index.md
+++ b/doc/user/application_security/coverage_fuzzing/index.md
@@ -7,15 +7,26 @@ type: reference, howto
# Coverage-guided fuzz testing **(ULTIMATE)**
+Coverage-guided fuzzing sends random inputs to an instrumented version of your application in an
+effort to cause unexpected behavior. Such behavior indicates a bug that you should address.
GitLab allows you to add coverage-guided fuzz testing to your pipelines. This helps you discover
-bugs and potential security issues that other QA processes may miss. Coverage-guided fuzzing sends
-random inputs to an instrumented version of your application in an effort to cause unexpected
-behavior, such as a crash. Such behavior indicates a bug that you should address.
+bugs and potential security issues that other QA processes may miss.
We recommend that you use fuzz testing in addition to the other security scanners in [GitLab Secure](../index.md)
and your own test processes. If you're using [GitLab CI/CD](../../../ci/index.md),
-you can run your coverage-guided fuzz tests as part your CI/CD workflow. You can take advantage of
-coverage-guided fuzzing by including the CI job in your existing `.gitlab-ci.yml` file.
+you can run your coverage-guided fuzz tests as part your CI/CD workflow.
+
+## Coverage-guided fuzz testing process
+
+The fuzz testing process:
+
+1. Compiles the target application.
+1. Runs the instrumented application, using the `gitlab-cov-fuzz` tool.
+1. Parses and analyzes the exception information output by the fuzzer.
+1. Downloads the [corpus](../terminology/index.md#corpus) and crash events from previous pipelines.
+1. Outputs the parsed crash events and data to the `gl-coverage-fuzzing-report.json` file.
+
+The results of the coverage-guided fuzz testing are available in the CI/CD pipeline.
## Supported fuzzing engines and languages
@@ -249,6 +260,8 @@ which shows an overview of all the security vulnerabilities in your groups, proj
Clicking the vulnerability opens a modal that provides additional information about the
vulnerability:
+<!-- vale gitlab.Acronyms = NO -->
+
- Status: The vulnerability's status. As with any type of vulnerability, a coverage fuzzing
vulnerability can be Detected, Confirmed, Dismissed, or Resolved.
- Project: The project in which the vulnerability exists.
@@ -262,3 +275,5 @@ vulnerability:
- Scanner: The scanner that detected the vulnerability (for example, Coverage Fuzzing).
- Scanner Provider: The engine that did the scan. For Coverage Fuzzing, this can be any of the
engines listed in [Supported fuzzing engines and languages](#supported-fuzzing-engines-and-languages).
+
+<!-- vale gitlab.Acronyms = YES -->
diff --git a/doc/user/application_security/cve_id_request.md b/doc/user/application_security/cve_id_request.md
index 1489b250e4b..5ffd47527c5 100644
--- a/doc/user/application_security/cve_id_request.md
+++ b/doc/user/application_security/cve_id_request.md
@@ -5,65 +5,64 @@ group: Threat Insights
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# CVE ID Requests **(FREE SAAS)**
+# CVE ID request **(FREE SAAS)**
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/41203) in GitLab 13.4, only for public projects on GitLab.com.
-As part of [our role as a CVE Numbering Authority](https://about.gitlab.com/security/cve/)
-([CNA](https://cve.mitre.org/cve/cna.html)), you may request
-[CVE](https://cve.mitre.org/index.html) identifiers from GitLab to track
-vulnerabilities found within your project.
+A [CVE](https://cve.mitre.org/index.html) identifier is assigned to a publicly-disclosed software
+vulnerability. GitLab is a [CVE Numbering Authority](https://about.gitlab.com/security/cve/)
+([CNA](https://cve.mitre.org/cve/cna.html)). For any public project you can request
+a CVE identifier (ID).
-## Overview
+Assigning a CVE ID to a vulnerability in your project helps your users stay secure and informed. For
+example, [dependency scanning tools](../application_security/dependency_scanning/index.md) can
+detect when vulnerable versions of your project are used as a dependency.
-CVE identifiers track specific vulnerabilities within projects. Having a CVE assigned to a
-vulnerability in your project helps your users stay secure and informed. For example,
-[dependency scanning tools](../application_security/dependency_scanning/index.md)
-can detect when vulnerable versions of your project are used as a dependency.
+A common vulnerability workflow is:
-## Conditions
+1. Request a CVE for a vulnerability.
+1. Reference the assigned CVE identifier in release notes.
+1. Publish the vulnerability's details after the fix is released.
-If the following conditions are met, a **Request CVE ID** button appears in your issue sidebar:
+## Prerequisites
-- The project is hosted in GitLab.com.
+To [submit a CVE ID Request](#submit-a-cve-id-request) the following prerequisites must be met:
+
+- The project is hosted on GitLab.com.
- The project is public.
- You are a maintainer of the project.
-- The issue is [confidential](../project/issues/confidential_issues.md).
-
-## Submitting a CVE ID Request
-
-Clicking the **Request CVE ID** button in the issue sidebar takes you to the new issue page for
-the [GitLab CVE project](https://gitlab.com/gitlab-org/cves).
+- The vulnerability's issue is [confidential](../project/issues/confidential_issues.md).
-![CVE ID request button](img/cve_id_request_button.png)
+## Submit a CVE ID request
-Creating the [confidential issue](../project/issues/confidential_issues.md) starts the CVE request process.
+To submit a CVE ID request:
-![New CVE ID request issue](img/new_cve_request_issue.png)
+1. Go to the vulnerability's issue and select **Create CVE ID Request**. The new issue page of
+ the [GitLab CVE project](https://gitlab.com/gitlab-org/cves) opens.
-You are required to fill in the issue description, which includes:
+ ![CVE ID request button](img/cve_id_request_button.png)
-- A description of the vulnerability
-- The project's vendor and name
-- Impacted versions
-- Fixed versions
-- The vulnerability type (a [CWE](https://cwe.mitre.org/data/index.html) identifier)
-- A [CVSS v3 vector](https://nvd.nist.gov/vuln-metrics/cvss/v3-calculator)
+1. In the **Title** box, enter a brief description of the vulnerability.
-## CVE Assignment
+1. In the **Description** box, enter the following details:
-GitLab triages your submitted CVE ID request and communicates with you throughout the CVE validation
-and assignment process.
+ - A detailed description of the vulnerability
+ - The project's vendor and name
+ - Impacted versions
+ - Fixed versions
+ - The vulnerability class (a [CWE](https://cwe.mitre.org/data/index.html) identifier)
+ - A [CVSS v3 vector](https://nvd.nist.gov/vuln-metrics/cvss/v3-calculator)
-![CVE ID request communication](img/cve_request_communication.png)
+ ![New CVE ID request issue](img/new_cve_request_issue.png)
-Once a CVE identifier is assigned, you may use and reference it as you see fit.
+GitLab updates your CVE ID request issue when:
-Details of the vulnerability submitted in the CVE ID request are published according to your
-schedule. It's common to request a CVE for an unpatched vulnerability, reference the assigned CVE
-identifier in release notes, and later publish the vulnerability's details after the fix is
-released.
+- Your submission is assigned a CVE.
+- Your CVE is published.
+- MITRE is notified that your CVE is published.
+- MITRE has added your CVE in the NVD feed.
-Separate communications notify you when different stages of the publication process are complete.
+## CVE assignment
-![CVE ID request publication communication](img/cve_request_communication_publication.png)
+After a CVE identifier is assigned, you can reference it as required. Details of the vulnerability
+submitted in the CVE ID request are published according to your schedule.
diff --git a/doc/user/application_security/dast/browser_based.md b/doc/user/application_security/dast/browser_based.md
index 5094ccd2196..9c5b84f4f36 100644
--- a/doc/user/application_security/dast/browser_based.md
+++ b/doc/user/application_security/dast/browser_based.md
@@ -10,13 +10,13 @@ type: reference, howto
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/323423) in GitLab 13.12.
WARNING:
-This product is an early access and is considered a [beta](https://about.gitlab.com/handbook/product/gitlab-the-product/#beta) feature.
+This product is in an early-access stage and is considered a [beta](https://about.gitlab.com/handbook/product/gitlab-the-product/#beta) feature.
GitLab DAST's new browser-based crawler is a crawl engine built by GitLab to test Single Page Applications (SPAs) and traditional web applications.
Due to the reliance of modern web applications on JavaScript, handling SPAs or applications that are dependent on JavaScript is paramount to ensuring proper coverage of an application for Dynamic Application Security Testing (DAST).
-The browser-based crawler works by loading the target application into a specially-instrumented Chromium browser. A snapshot of the page is taken prior to a search to find any actions that a user might perform,
-such as clicking on a link or filling in a form. For each action found, the crawler will execute it, take a new snapshot and determine what in the page changed from the previous snapshot.
+The browser-based crawler works by loading the target application into a specially-instrumented Chromium browser. A snapshot of the page is taken before a search to find any actions that a user might perform,
+such as clicking on a link or filling in a form. For each action found, the crawler executes it, takes a new snapshot, and determines what in the page changed from the previous snapshot.
Crawling continues by taking more snapshots and finding subsequent actions.
The benefit of crawling by following user actions in a browser is that the crawler can interact with the target application much like a real user would, identifying complex flows that traditional web crawlers don't understand. This results in better coverage of the website.
@@ -57,17 +57,17 @@ The browser-based crawler can be configured using CI/CD variables.
| `DAST_BROWSER_IGNORED_HOSTS` | List of strings | `site.com,another.com` | Hostnames included in this variable are accessed but not reported against. |
| `DAST_BROWSER_MAX_ACTIONS` | number | `10000` | The maximum number of actions that the crawler performs. For example, clicking a link, or filling a form. |
| `DAST_BROWSER_MAX_DEPTH` | number | `10` | The maximum number of chained actions that the crawler takes. For example, `Click -> Form Fill -> Click` is a depth of three. |
-| `DAST_BROWSER_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 will likely produce little benefit after five to seven instances. |
+| `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_COOKIES` | dictionary | `abtesting_group:3,region:locked` | A cookie name and value to be added to every request. |
| `DAST_BROWSER_LOG` | List of strings | `brows:debug,auth:debug` | A list of modules and their intended log level. |
-| `DAST_BROWSER_NAVIGATION_TIMEOUT` | [Duration string](https://golang.org/pkg/time/#ParseDuration) | `15s` | The maximum amount of time to wait for a browser to navigate from one page to another |
-| `DAST_BROWSER_ACTION_TIMEOUT` | [Duration string](https://golang.org/pkg/time/#ParseDuration) | `7s` | The maximum amount of time to wait for a browser to complete an action |
-| `DAST_BROWSER_STABILITY_TIMEOUT` | [Duration string](https://golang.org/pkg/time/#ParseDuration) | `7s` | The maximum amount of time to wait for a browser to consider a page loaded and ready for analysis |
-| `DAST_BROWSER_NAVIGATION_STABILITY_TIMEOUT` | [Duration string](https://golang.org/pkg/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_ACTION_STABILITY_TIMEOUT` | [Duration string](https://golang.org/pkg/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_SEARCH_ELEMENT_TIMEOUT` | [Duration string](https://golang.org/pkg/time/#ParseDuration) | `3s` | The maximum amount of time to allow the browser to search for new elements or navigations |
-| `DAST_BROWSER_EXTRACT_ELEMENT_TIMEOUT` | [Duration string](https://golang.org/pkg/time/#ParseDuration) | `5s` | The maximum amount of time to allow the browser to extract newly found elements or navigations |
-| `DAST_BROWSER_ELEMENT_TIMEOUT` | [Duration string](https://golang.org/pkg/time/#ParseDuration) | `600ms` | The maximum amount of time to wait for an element before determining it is ready for analysis |
+| `DAST_BROWSER_NAVIGATION_TIMEOUT` | [Duration string](https://golang.org/pkg/time/#ParseDuration) | `15s` | The maximum amount of time to wait for a browser to navigate from one page to another. |
+| `DAST_BROWSER_ACTION_TIMEOUT` | [Duration string](https://golang.org/pkg/time/#ParseDuration) | `7s` | The maximum amount of time to wait for a browser to complete an action. |
+| `DAST_BROWSER_STABILITY_TIMEOUT` | [Duration string](https://golang.org/pkg/time/#ParseDuration) | `7s` | The maximum amount of time to wait for a browser to consider a page loaded and ready for analysis. |
+| `DAST_BROWSER_NAVIGATION_STABILITY_TIMEOUT` | [Duration string](https://golang.org/pkg/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_ACTION_STABILITY_TIMEOUT` | [Duration string](https://golang.org/pkg/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_SEARCH_ELEMENT_TIMEOUT` | [Duration string](https://golang.org/pkg/time/#ParseDuration) | `3s` | The maximum amount of time to allow the browser to search for new elements or navigations. |
+| `DAST_BROWSER_EXTRACT_ELEMENT_TIMEOUT` | [Duration string](https://golang.org/pkg/time/#ParseDuration) | `5s` | The maximum amount of time to allow the browser to extract newly found elements or navigations. |
+| `DAST_BROWSER_ELEMENT_TIMEOUT` | [Duration string](https://golang.org/pkg/time/#ParseDuration) | `600ms` | The maximum amount of time to wait for an element before determining it is ready for analysis. |
The [DAST variables](index.md#available-cicd-variables) `SECURE_ANALYZERS_PREFIX`, `DAST_FULL_SCAN_ENABLED`, `DAST_AUTO_UPDATE_ADDONS`, `DAST_EXCLUDE_RULES`, `DAST_REQUEST_HEADERS`, `DAST_HTML_REPORT`, `DAST_MARKDOWN_REPORT`, `DAST_XML_REPORT`,
`DAST_AUTH_URL`, `DAST_USERNAME`, `DAST_PASSWORD`, `DAST_USERNAME_FIELD`, `DAST_PASSWORD_FIELD`, `DAST_FIRST_SUBMIT_FIELD`, `DAST_SUBMIT_FIELD`, `DAST_EXCLUDE_URLS`, `DAST_AUTH_VERIFICATION_URL`, `DAST_BROWSER_AUTH_VERIFICATION_SELECTOR`, `DAST_BROWSER_AUTH_VERIFICATION_LOGIN_FORM`, `DAST_BROWSER_AUTH_REPORT`,
@@ -80,27 +80,27 @@ While the browser-based crawler crawls modern web applications efficiently, vuln
The crawler runs the target website in a browser with DAST/ZAP configured as the proxy server. This ensures that all requests and responses made by the browser are passively scanned by DAST/ZAP.
When running a full scan, active vulnerability checks executed by DAST/ZAP do not use a browser. This difference in how vulnerabilities are checked can cause issues that require certain features of the target website to be disabled to ensure the scan works as intended.
-For example, for a target website that contains forms with Anti-CSRF tokens, a passive scan will scan as intended because the browser displays pages/forms as if a user is viewing the page.
-However, active vulnerability checks run in a full scan will not be able to submit forms containing Anti-CSRF tokens. In such cases we recommend you disable Anti-CSRF tokens when running a full scan.
+For example, for a target website that contains forms with Anti-CSRF tokens, a passive scan works as intended because the browser displays pages and forms as if a user is viewing the page.
+However, active vulnerability checks that run in a full scan cannot submit forms containing Anti-CSRF tokens. In such cases, we recommend you disable Anti-CSRF tokens when running a full scan.
## Managing scan time
-It is expected that running the browser-based crawler will result in better coverage for many web applications, when compared to the normal GitLab DAST solution.
+It is expected that running the browser-based crawler results in better coverage for many web applications, when compared to the normal GitLab DAST solution.
This can come at a cost of increased scan time.
You can manage the trade-off between coverage and scan time with the following measures:
- Limit the number of actions executed by the browser with the [variable](#available-cicd-variables) `DAST_BROWSER_MAX_ACTIONS`. The default is `10,000`.
- Limit the page depth that the browser-based crawler will check coverage on with the [variable](#available-cicd-variables) `DAST_BROWSER_MAX_DEPTH`. The crawler uses a breadth-first search strategy, so pages with smaller depth are crawled first. The default is `10`.
-- Vertically scaling the runner and using a higher number of browsers with [variable](#available-cicd-variables) `DAST_BROWSER_NUMBER_OF_BROWSERS`. The default is `3`.
+- Vertically scale the runner and use a higher number of browsers with [variable](#available-cicd-variables) `DAST_BROWSER_NUMBER_OF_BROWSERS`. The default is `3`.
## Timeouts
Due to poor network conditions or heavy application load, the default timeouts may not be applicable to your application.
-Browser-based scans offer the ability to adjust various timeouts to ensure it continues smoothly as it transitions from one page to the next. These values are configured using a [Duration string](https://golang.org/pkg/time/#ParseDuration) which allow you to configure durations with a prefix: `m` for minutes, `s` for seconds, and `ms` for milliseconds.
+Browser-based scans offer the ability to adjust various timeouts to ensure it continues smoothly as it transitions from one page to the next. These values are configured using a [Duration string](https://golang.org/pkg/time/#ParseDuration), which allow you to configure durations with a prefix: `m` for minutes, `s` for seconds, and `ms` for milliseconds.
-Navigations, or the act of loading a new page, usually require the most amount of time as they are
+Navigations, or the act of loading a new page, usually require the most amount of time because they are
loading multiple new resources such as JavaScript or CSS files. Depending on the size of these resources, or the speed at which they are returned, the default `DAST_BROWSER_NAVIGATION_TIMEOUT` may not be sufficient.
Stability timeouts, such as those configurable with `DAST_BROWSER_NAVIGATION_STABILITY_TIMEOUT`, `DAST_BROWSER_STABILITY_TIMEOUT`, and `DAST_BROWSER_ACTION_STABILITY_TIMEOUT` can also be configured. Stability timeouts determine when browser-based scans consider
@@ -110,11 +110,11 @@ a page fully loaded. Browser-based scans consider a page loaded when:
1. There are no open or outstanding requests that are deemed important, such as JavaScript and CSS. Media files are usually deemed unimportant.
1. Depending on whether the browser executed a navigation, was forcibly transitioned, or action:
- - There are no new Document Object Model (DOM) modification events after the `DAST_BROWSER_NAVIGATION_STABILITY_TIMEOUT`, `DAST_BROWSER_STABILITY_TIMEOUT` or `DAST_BROWSER_ACTION_STABILITY_TIMEOUT` durations
+ - There are no new Document Object Model (DOM) modification events after the `DAST_BROWSER_NAVIGATION_STABILITY_TIMEOUT`, `DAST_BROWSER_STABILITY_TIMEOUT`, or `DAST_BROWSER_ACTION_STABILITY_TIMEOUT` durations.
-After these events have occurred, browser-based scans consider the page loaded and ready and attempt the next action.
+After these events have occurred, browser-based scans consider the page loaded and ready, and attempt the next action.
-If your application experiences latency or returns many navigation failures, consider adjusting the timeout values such in this example:
+If your application experiences latency or returns many navigation failures, consider adjusting the timeout values such as in this example:
```yaml
include:
@@ -132,7 +132,7 @@ dast:
```
NOTE:
-Adjusting these values may impact scan time as they adjust how long each browser waits for various activities to complete.
+Adjusting these values may impact scan time because they adjust how long each browser waits for various activities to complete.
## Debugging scans using logging
@@ -168,7 +168,7 @@ The modules that can be configured for logging are as follows:
| Log module | Component overview |
| ---------- | ----------- |
| `AUTH` | Used for creating an authenticated scan. |
-| `BROWS` | Used for querying the state/page of the browser. |
+| `BROWS` | Used for querying the state or page of the browser. |
| `BPOOL` | The set of browsers that are leased out for crawling. |
| `CRAWL` | Used for the core crawler algorithm. |
| `DATAB` | Used for persisting data to the internal database. |
diff --git a/doc/user/application_security/dast/dast_troubleshooting.md b/doc/user/application_security/dast/dast_troubleshooting.md
index f771bc82d58..9969526c906 100644
--- a/doc/user/application_security/dast/dast_troubleshooting.md
+++ b/doc/user/application_security/dast/dast_troubleshooting.md
@@ -20,7 +20,7 @@ A DAST job has two executing processes:
Enable the `DAST_DEBUG` CI/CD variable to debug scripts. This can help when troubleshooting the job,
and outputs statements indicating what percentage of the scan is complete.
-For details on using variables, see [Overriding the DAST template](index.md#customizing-the-dast-settings).
+For details on using variables, see [Overriding the DAST template](index.md#customize-dast-settings).
Debug mode of the ZAP server can be enabled using the `DAST_ZAP_LOG_CONFIGURATION` variable.
The following table outlines examples of values that can be set and the effect that they have on the output that is logged.
diff --git a/doc/user/application_security/dast/index.md b/doc/user/application_security/dast/index.md
index 0d60701b030..09b55e7b395 100644
--- a/doc/user/application_security/dast/index.md
+++ b/doc/user/application_security/dast/index.md
@@ -269,7 +269,7 @@ image. Using the `DAST_VERSION` variable, you can choose how DAST updates:
- Only update fixes by pinning to a minor version (such as `1.6`).
- Prevent all updates by pinning to a specific version (such as `1.6.4`).
-Find the latest DAST versions on the [Releases](https://gitlab.com/security-products/dast/-/releases)
+Find the latest DAST versions on the [Releases](https://gitlab.com/gitlab-org/security-products/dast/-/releases)
page.
#### Configure DAST using the UI
@@ -483,6 +483,13 @@ When using `DAST_PATHS` and `DAST_PATHS_FILE`, note the following:
To perform a [full scan](#full-scan) on the listed paths, use the `DAST_FULL_SCAN_ENABLED` CI/CD variable.
+### List URLs scanned
+
+When DAST completes scanning, the merge request page states the number of URLs scanned.
+Click **View details** to view the web console output which includes the list of scanned URLs.
+
+![DAST Widget](img/dast_urls_scanned_v12_10.png)
+
### View details of a vulnerability detected by DAST
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/36332) in [GitLab Ultimate](https://about.gitlab.com/pricing/) 13.1.
@@ -515,15 +522,20 @@ To view details of vulnerabilities detected by DAST:
| Links | Links to further details of the detected vulnerability. |
| Solution | Details of a recommended solution to the vulnerability (optional). |
-### Customizing the DAST settings
+## Customize DAST settings
+
+You can customize the behavior of DAST using both CI/CD variables and command-line options. Use of CI/CD
+variables overrides the values contained in the DAST template.
+
+### Customize DAST using CI/CD variables
WARNING:
Beginning in GitLab 13.0, the use of [`only` and `except`](../../../ci/yaml/index.md#only--except)
-is no longer supported. When overriding the template, you must use [`rules`](../../../ci/yaml/index.md#rules) instead.
+is no longer supported. You must use [`rules`](../../../ci/yaml/index.md#rules) instead.
The DAST settings can be changed through CI/CD variables by using the
-[`variables`](../../../ci/yaml/index.md#variables) parameter in `.gitlab-ci.yml`.
-These variables are documented in [available variables](#available-cicd-variables).
+[`variables`](../../../ci/yaml/index.md#variables) parameter in `.gitlab-ci.yml`. For details of
+all DAST CI/CD variables, read [Available CI/CD variables](#available-cicd-variables).
For example:
@@ -539,10 +551,10 @@ variables:
Because the template is [evaluated before](../../../ci/yaml/index.md#include) the pipeline
configuration, the last mention of the variable takes precedence.
-#### Enabling and disabling rules
+#### Enable or disable rules
A complete list of the rules that DAST uses to scan for vulnerabilities can be
-found in the [ZAP docs](https://www.zaproxy.org/docs/alerts/).
+found in the [ZAP documentation](https://www.zaproxy.org/docs/alerts/).
`DAST_EXCLUDE_RULES` disables the rules with the given IDs.
@@ -559,7 +571,7 @@ can be found in [exclude_rules.yml](https://gitlab.com/gitlab-org/security-produ
The lists for `DAST_EXCLUDE_RULES` and `DAST_ONLY_INCLUDE_RULES` **must** be enclosed in double
quotes (`"`), otherwise they are interpreted as numeric values.
-### Hide sensitive information
+#### Hide sensitive information
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/36332) in GitLab 13.1.
@@ -573,7 +585,105 @@ authorization credentials. By default, the following headers are masked:
Using the [`DAST_MASK_HTTP_HEADERS` CI/CD variable](#available-cicd-variables), you can list the
headers whose values you want masked. For details on how to mask headers, see
-[Customizing the DAST settings](#customizing-the-dast-settings).
+[Customizing the DAST settings](#customize-dast-settings).
+
+#### Available CI/CD variables
+
+These CI/CD variables are specific to DAST. They can be used to customize the behavior of DAST to your requirements.
+
+| CI/CD variable | Type | Description |
+|:-------------------------------------------------|:--------------|:------------------------------|
+| `DAST_ADVERTISE_SCAN` | boolean | Set to `true` to add a `Via` header to every request sent, advertising that the request was sent as part of a GitLab DAST scan. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/334947) in GitLab 14.1. |
+| `DAST_AGGREGATE_VULNERABILITIES` | boolean | Vulnerability aggregation is set to `true` by default. To disable this feature and see each vulnerability individually set to `false`. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/254043) in GitLab 14.0. |
+| `DAST_API_HOST_OVERRIDE` <sup>1</sup> | string | Used to override domains defined in API specification files. Only supported when importing the API specification from a URL. Example: `example.com:8080`. |
+| `DAST_API_OPENAPI` | URL or string | The API specification to import. The specification can be hosted at a URL, or the name of a file present in the `/zap/wrk` directory. The variable `DAST_WEBSITE` must be specified if this is omitted. |
+| `DAST_API_SPECIFICATION` <sup>1</sup> | URL or string | [Deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/290241) in GitLab 13.12 and replaced by `DAST_API_OPENAPI`. To be removed in GitLab 15.0. The API specification to import. The specification can be hosted at a URL, or the name of a file present in the `/zap/wrk` directory. The variable `DAST_WEBSITE` must be specified if this is omitted. |
+| `DAST_AUTH_REPORT` <sup>2</sup> | boolean | Used in combination with exporting the `gl-dast-debug-auth-report.html` artifact to aid in debugging authentication issues. |
+| `DAST_AUTH_EXCLUDE_URLS` <sup>2</sup> | URLs | **{warning}** **[Removed](https://gitlab.com/gitlab-org/gitlab/-/issues/289959)** in GitLab 14.0. Replaced by `DAST_EXCLUDE_URLS`. The URLs to skip during the authenticated scan; comma-separated. Regular expression syntax can be used to match multiple URLs. For example, `.*` matches an arbitrary character sequence. Not supported for API scans. |
+| `DAST_AUTH_URL` <sup>1,2</sup> | URL | The URL of the page containing the sign-in HTML form on the target website. `DAST_USERNAME` and `DAST_PASSWORD` are submitted with the login form to create an authenticated scan. Not supported for API scans. Example: `https://login.example.com`. |
+| `DAST_AUTH_VERIFICATION_LOGIN_FORM` <sup>2</sup> | boolean | Verifies successful authentication by checking for the lack of a login form once the login form has been submitted. |
+| `DAST_AUTH_VERIFICATION_SELECTOR` <sup>2</sup> | selector | Verifies successful authentication by checking for presence of a selector once the login form has been submitted. Example: `css:.user-photo`. |
+| `DAST_AUTH_VERIFICATION_URL` <sup>1,2</sup> | URL | A URL only accessible to logged in users that DAST can use to confirm successful authentication. If provided, DAST exits if it cannot access the URL. Example: `"http://example.com/loggedin_page"`. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/207335) in GitLab 13.8. |
+| `DAST_AUTO_UPDATE_ADDONS` | boolean | ZAP add-ons are pinned to specific versions in the DAST Docker image. Set to `true` to download the latest versions when the scan starts. Default: `false`. |
+| `DAST_BROWSER_PATH_TO_LOGIN_FORM` <sup>1,2</sup> | selector | Comma-separated list of selectors that will be clicked on prior to attempting to enter `DAST_USERNAME` and `DAST_PASSWORD` into the login form. Example: `"css:.navigation-menu,css:.login-menu-item"`. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/326633) in GitLab 14.1. |
+| `DAST_DEBUG` <sup>1</sup> | boolean | Enable debug message output. Default: `false`. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/12652) in GitLab 13.1. |
+| `DAST_EXCLUDE_RULES` | string | Set to a comma-separated list of Vulnerability Rule IDs to exclude them from running during the scan. Rule IDs are numbers and can be found from the DAST log or on the [ZAP project](https://www.zaproxy.org/docs/alerts/). For example, `HTTP Parameter Override` has a rule ID of `10026`. Cannot be used when `DAST_ONLY_INCLUDE_RULES` is set. **Note:** In earlier versions of GitLab the excluded rules were executed but vulnerabilities they generated were suppressed. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/118641) in GitLab 12.10. |
+| `DAST_EXCLUDE_URLS` <sup>1,2</sup> | URLs | The URLs to skip during the authenticated scan; comma-separated. Regular expression syntax can be used to match multiple URLs. For example, `.*` matches an arbitrary character sequence. Not supported for API scans. Example, `http://example.com/sign-out`. |
+| `DAST_FIRST_SUBMIT_FIELD` <sup>2</sup> | string | The `id` or `name` of the element that when clicked submits the username form of a multi-page login process. For example, `css:button[type='user-submit']`. [Introduced](https://gitlab.com/gitlab-org/gitlab-ee/issues/9894) in GitLab 12.4. |
+| `DAST_FULL_SCAN_DOMAIN_VALIDATION_REQUIRED` | boolean | **{warning}** **[Removed](https://gitlab.com/gitlab-org/gitlab/-/issues/293595)** in GitLab 14.0. Set to `true` to require domain validation when running DAST full scans. Not supported for API scans. Default: `false` |
+| `DAST_FULL_SCAN_ENABLED` <sup>1</sup> | boolean | Set to `true` to run a [ZAP Full Scan](https://github.com/zaproxy/zaproxy/wiki/ZAP-Full-Scan) instead of a [ZAP Baseline Scan](https://github.com/zaproxy/zaproxy/wiki/ZAP-Baseline-Scan). Default: `false` |
+| `DAST_HTML_REPORT` | string | The filename of the HTML report written at the end of a scan. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/12652) in GitLab 13.1. |
+| `DAST_INCLUDE_ALPHA_VULNERABILITIES` | boolean | Set to `true` to include alpha passive and active scan rules. Default: `false`. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/12652) in GitLab 13.1. |
+| `DAST_MARKDOWN_REPORT` | string | The filename of the Markdown report written at the end of a scan. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/12652) in GitLab 13.1. |
+| `DAST_MASK_HTTP_HEADERS` | string | Comma-separated list of request and response headers to be masked (GitLab 13.1). Must contain **all** headers to be masked. Refer to [list of headers that are masked by default](#hide-sensitive-information). |
+| `DAST_MAX_URLS_PER_VULNERABILITY` | number | The maximum number of URLs reported for a single vulnerability. `DAST_MAX_URLS_PER_VULNERABILITY` is set to `50` by default. To list all the URLs set to `0`. [Introduced](https://gitlab.com/gitlab-org/security-products/dast/-/merge_requests/433) in GitLab 13.12. |
+| `DAST_ONLY_INCLUDE_RULES` | string | Set to a comma-separated list of Vulnerability Rule IDs to configure the scan to run only them. Rule IDs are numbers and can be found from the DAST log or on the [ZAP project](https://www.zaproxy.org/docs/alerts/). Cannot be used when `DAST_EXCLUDE_RULES` is set. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/250651) in GitLab 13.12. |
+| `DAST_PASSWORD` <sup>1,2</sup> | string | The password to authenticate to in the website. Example: `P@55w0rd!` |
+| `DAST_PASSWORD_FIELD` <sup>1,2</sup> | string | The selector of password field at the sign-in HTML form. Example: `id:password` |
+| `DAST_PATHS` | string | Set to a comma-separated list of URLs for DAST to scan. For example, `/page1.html,/category1/page3.html,/page2.html`. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/214120) in GitLab 13.4. |
+| `DAST_PATHS_FILE` | string | The file path containing the paths within `DAST_WEBSITE` to scan. The file must be plain text with one path per line. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/258825) in GitLab 13.6. |
+| `DAST_REQUEST_HEADERS` <sup>1</sup> | string | Set to a comma-separated list of request header names and values. Headers are added to every request made by DAST. For example, `Cache-control: no-cache,User-Agent: DAST/1.0` |
+| `DAST_SKIP_TARGET_CHECK` | boolean | Set to `true` to prevent DAST from checking that the target is available before scanning. Default: `false`. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/229067) in GitLab 13.8. |
+| `DAST_SPIDER_MINS` <sup>1</sup> | number | The maximum duration of the spider scan in minutes. Set to `0` for unlimited. Default: One minute, or unlimited when the scan is a full scan. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/12652) in GitLab 13.1. |
+| `DAST_SPIDER_START_AT_HOST` | boolean | Set to `false` to prevent DAST from resetting the target to its host before scanning. When `true`, non-host targets `http://test.site/some_path` is reset to `http://test.site` before scan. Default: `true`. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/258805) in GitLab 13.6. |
+| `DAST_SUBMIT_FIELD` <sup>2</sup> | string | The `id` or `name` of the element that when clicked submits the login form or the password form of a multi-page login process. For example, `css:button[type='submit']`. [Introduced](https://gitlab.com/gitlab-org/gitlab-ee/issues/9894) in GitLab 12.4. |
+| `DAST_TARGET_AVAILABILITY_TIMEOUT` <sup>1</sup> | number | Time limit in seconds to wait for target availability. |
+| `DAST_USE_AJAX_SPIDER` <sup>1</sup> | boolean | Set to `true` to use the AJAX spider in addition to the traditional spider, useful for crawling sites that require JavaScript. Default: `false`. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/12652) in GitLab 13.1. |
+| `DAST_USERNAME` <sup>1,2</sup> | string | The username to authenticate to in the website. Example: `admin` |
+| `DAST_USERNAME_FIELD` <sup>1,2</sup> | string | The selector of username field at the sign-in HTML form. Example: `name:username` |
+| `DAST_XML_REPORT` | string | The filename of the XML report written at the end of a scan. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/12652) in GitLab 13.1. |
+| `DAST_WEBSITE` <sup>1</sup> | URL | The URL of the website to scan. The variable `DAST_API_OPENAPI` must be specified if this is omitted. |
+| `DAST_ZAP_CLI_OPTIONS` | string | ZAP server command-line options. For example, `-Xmx3072m` would set the Java maximum memory allocation pool size. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/12652) in GitLab 13.1. |
+| `DAST_ZAP_LOG_CONFIGURATION` | string | Set to a semicolon-separated list of additional log4j properties for the ZAP Server. Example: `log4j.logger.org.parosproxy.paros.network.HttpSender=DEBUG;log4j.logger.com.crawljax=DEBUG` |
+| `SECURE_ANALYZERS_PREFIX` | URL | Set the Docker registry base address from which to download the analyzer. |
+
+1. Available to an on-demand DAST scan.
+1. Used for authentication.
+
+### Customize DAST using command-line options
+
+Not all DAST configuration is available via CI/CD variables. To find out all
+possible options, run the following configuration.
+Available command-line options are printed to the job log:
+
+```yaml
+include:
+ template: DAST.gitlab-ci.yml
+
+dast:
+ script:
+ - /analyze --help
+```
+
+You must then overwrite the `script` command to pass in the appropriate
+argument. For example, vulnerability definitions in alpha can be included with
+`-a`. The following configuration includes those definitions:
+
+```yaml
+include:
+ template: DAST.gitlab-ci.yml
+
+dast:
+ script:
+ - export DAST_WEBSITE=${DAST_WEBSITE:-$(cat environment_url.txt)}
+ - /analyze -a -t $DAST_WEBSITE
+```
+
+### Custom ZAProxy configuration
+
+The ZAProxy server contains many [useful configurable values](https://gitlab.com/gitlab-org/gitlab/-/issues/36437#note_245801885).
+Many key/values for `-config` remain undocumented, but there is an untested list of
+[possible keys](https://gitlab.com/gitlab-org/gitlab/-/issues/36437#note_244981023).
+Note that these options are not supported by DAST, and may break the DAST scan
+when used. An example of how to rewrite the Authorization header value with `TOKEN` follows:
+
+```yaml
+include:
+ template: DAST.gitlab-ci.yml
+
+variables:
+ DAST_ZAP_CLI_OPTIONS: "-config replacer.full_list(0).description=auth -config replacer.full_list(0).enabled=true -config replacer.full_list(0).matchtype=REQ_HEADER -config replacer.full_list(0).matchstr=Authorization -config replacer.full_list(0).regex=false -config replacer.full_list(0).replacement=TOKEN"
+```
## Authentication
@@ -747,59 +857,6 @@ dast:
when: always
```
-## Available CI/CD variables
-
-These CI/CD variables are specific to DAST. They can be used to customize the behavior of DAST to your requirements.
-
-| CI/CD variable | Type | Description |
-|:-------------------------------------------------|:--------------|:------------------------------|
-| `DAST_ADVERTISE_SCAN` | boolean | Set to `true` to add a `Via` header to every request sent, advertising that the request was sent as part of a GitLab DAST scan. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/334947) in GitLab 14.1. |
-| `DAST_AGGREGATE_VULNERABILITIES` | boolean | Vulnerability aggregation is set to `true` by default. To disable this feature and see each vulnerability individually set to `false`. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/254043) in GitLab 14.0. |
-| `DAST_API_HOST_OVERRIDE` <sup>1</sup> | string | Used to override domains defined in API specification files. Only supported when importing the API specification from a URL. Example: `example.com:8080`. |
-| `DAST_API_OPENAPI` | URL or string | The API specification to import. The specification can be hosted at a URL, or the name of a file present in the `/zap/wrk` directory. The variable `DAST_WEBSITE` must be specified if this is omitted. |
-| `DAST_API_SPECIFICATION` <sup>1</sup> | URL or string | [Deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/290241) in GitLab 13.12 and replaced by `DAST_API_OPENAPI`. To be removed in GitLab 15.0. The API specification to import. The specification can be hosted at a URL, or the name of a file present in the `/zap/wrk` directory. The variable `DAST_WEBSITE` must be specified if this is omitted. |
-| `DAST_AUTH_REPORT` <sup>2</sup> | boolean | Used in combination with exporting the `gl-dast-debug-auth-report.html` artifact to aid in debugging authentication issues. |
-| `DAST_AUTH_EXCLUDE_URLS` <sup>2</sup> | URLs | **{warning}** **[Removed](https://gitlab.com/gitlab-org/gitlab/-/issues/289959)** in GitLab 14.0. Replaced by `DAST_EXCLUDE_URLS`. The URLs to skip during the authenticated scan; comma-separated. Regular expression syntax can be used to match multiple URLs. For example, `.*` matches an arbitrary character sequence. Not supported for API scans. |
-| `DAST_AUTH_URL` <sup>1,2</sup> | URL | The URL of the page containing the sign-in HTML form on the target website. `DAST_USERNAME` and `DAST_PASSWORD` are submitted with the login form to create an authenticated scan. Not supported for API scans. Example: `https://login.example.com`. |
-| `DAST_AUTH_VERIFICATION_LOGIN_FORM` <sup>2</sup> | boolean | Verifies successful authentication by checking for the lack of a login form once the login form has been submitted. |
-| `DAST_AUTH_VERIFICATION_SELECTOR` <sup>2</sup> | selector | Verifies successful authentication by checking for presence of a selector once the login form has been submitted. Example: `css:.user-photo`. |
-| `DAST_AUTH_VERIFICATION_URL` <sup>1,2</sup> | URL | A URL only accessible to logged in users that DAST can use to confirm successful authentication. If provided, DAST exits if it cannot access the URL. Example: `"http://example.com/loggedin_page"`. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/207335) in GitLab 13.8. |
-| `DAST_AUTO_UPDATE_ADDONS` | boolean | ZAP add-ons are pinned to specific versions in the DAST Docker image. Set to `true` to download the latest versions when the scan starts. Default: `false`. |
-| `DAST_BROWSER_PATH_TO_LOGIN_FORM` <sup>1,2</sup> | selector | Comma-separated list of selectors that will be clicked on prior to attempting to enter `DAST_USERNAME` and `DAST_PASSWORD` into the login form. Example: `"css:.navigation-menu,css:.login-menu-item"`. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/326633) in GitLab 14.1. |
-| `DAST_DEBUG` <sup>1</sup> | boolean | Enable debug message output. Default: `false`. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/12652) in GitLab 13.1. |
-| `DAST_EXCLUDE_RULES` | string | Set to a comma-separated list of Vulnerability Rule IDs to exclude them from running during the scan. The whole list **must** be enclosed in double quotes (`"`). Rule IDs are numbers and can be found from the DAST log or on the [ZAP project](https://www.zaproxy.org/docs/alerts/). For example, `HTTP Parameter Override` has a rule ID of `10026`. Cannot be used when `DAST_ONLY_INCLUDE_RULES` is set. **Note:** In earlier versions of GitLab the excluded rules were executed but vulnerabilities they generated were suppressed. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/118641) in GitLab 12.10. |
-| `DAST_EXCLUDE_URLS` <sup>1,2</sup> | URLs | The URLs to skip during the authenticated scan; comma-separated. Regular expression syntax can be used to match multiple URLs. For example, `.*` matches an arbitrary character sequence. Not supported for API scans. Example, `http://example.com/sign-out`. |
-| `DAST_FIRST_SUBMIT_FIELD` <sup>2</sup> | string | The `id` or `name` of the element that when clicked submits the username form of a multi-page login process. For example, `css:button[type='user-submit']`. [Introduced](https://gitlab.com/gitlab-org/gitlab-ee/issues/9894) in GitLab 12.4. |
-| `DAST_FULL_SCAN_DOMAIN_VALIDATION_REQUIRED` | boolean | **{warning}** **[Removed](https://gitlab.com/gitlab-org/gitlab/-/issues/293595)** in GitLab 14.0. Set to `true` to require domain validation when running DAST full scans. Not supported for API scans. Default: `false` |
-| `DAST_FULL_SCAN_ENABLED` <sup>1</sup> | boolean | Set to `true` to run a [ZAP Full Scan](https://github.com/zaproxy/zaproxy/wiki/ZAP-Full-Scan) instead of a [ZAP Baseline Scan](https://github.com/zaproxy/zaproxy/wiki/ZAP-Baseline-Scan). Default: `false` |
-| `DAST_HTML_REPORT` | string | The filename of the HTML report written at the end of a scan. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/12652) in GitLab 13.1. |
-| `DAST_INCLUDE_ALPHA_VULNERABILITIES` | boolean | Set to `true` to include alpha passive and active scan rules. Default: `false`. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/12652) in GitLab 13.1. |
-| `DAST_MARKDOWN_REPORT` | string | The filename of the Markdown report written at the end of a scan. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/12652) in GitLab 13.1. |
-| `DAST_MASK_HTTP_HEADERS` | string | Comma-separated list of request and response headers to be masked (GitLab 13.1). Must contain **all** headers to be masked. Refer to [list of headers that are masked by default](#hide-sensitive-information). |
-| `DAST_MAX_URLS_PER_VULNERABILITY` | number | The maximum number of URLs reported for a single vulnerability. `DAST_MAX_URLS_PER_VULNERABILITY` is set to `50` by default. To list all the URLs set to `0`. [Introduced](https://gitlab.com/gitlab-org/security-products/dast/-/merge_requests/433) in GitLab 13.12. |
-| `DAST_ONLY_INCLUDE_RULES` | string | Set to a comma-separated list of Vulnerability Rule IDs to configure the scan to run only them. The whole list **must** be enclosed in double quotes (`"`). Rule IDs are numbers and can be found from the DAST log or on the [ZAP project](https://www.zaproxy.org/docs/alerts/). Cannot be used when `DAST_EXCLUDE_RULES` is set. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/250651) in GitLab 13.12. |
-| `DAST_PASSWORD` <sup>1,2</sup> | string | The password to authenticate to in the website. Example: `P@55w0rd!` |
-| `DAST_PASSWORD_FIELD` <sup>1,2</sup> | string | The selector of password field at the sign-in HTML form. Example: `id:password` |
-| `DAST_PATHS` | string | Set to a comma-separated list of URLs for DAST to scan. For example, `/page1.html,/category1/page3.html,/page2.html`. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/214120) in GitLab 13.4. |
-| `DAST_PATHS_FILE` | string | The file path containing the paths within `DAST_WEBSITE` to scan. The file must be plain text with one path per line. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/258825) in GitLab 13.6. |
-| `DAST_REQUEST_HEADERS` <sup>1</sup> | string | Set to a comma-separated list of request header names and values. Headers are added to every request made by DAST. For example, `Cache-control: no-cache,User-Agent: DAST/1.0` |
-| `DAST_SKIP_TARGET_CHECK` | boolean | Set to `true` to prevent DAST from checking that the target is available before scanning. Default: `false`. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/229067) in GitLab 13.8. |
-| `DAST_SPIDER_MINS` <sup>1</sup> | number | The maximum duration of the spider scan in minutes. Set to `0` for unlimited. Default: One minute, or unlimited when the scan is a full scan. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/12652) in GitLab 13.1. |
-| `DAST_SPIDER_START_AT_HOST` | boolean | Set to `false` to prevent DAST from resetting the target to its host before scanning. When `true`, non-host targets `http://test.site/some_path` is reset to `http://test.site` before scan. Default: `true`. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/258805) in GitLab 13.6. |
-| `DAST_SUBMIT_FIELD` <sup>2</sup> | string | The `id` or `name` of the element that when clicked submits the login form or the password form of a multi-page login process. For example, `css:button[type='submit']`. [Introduced](https://gitlab.com/gitlab-org/gitlab-ee/issues/9894) in GitLab 12.4. |
-| `DAST_TARGET_AVAILABILITY_TIMEOUT` <sup>1</sup> | number | Time limit in seconds to wait for target availability. |
-| `DAST_USE_AJAX_SPIDER` <sup>1</sup> | boolean | Set to `true` to use the AJAX spider in addition to the traditional spider, useful for crawling sites that require JavaScript. Default: `false`. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/12652) in GitLab 13.1. |
-| `DAST_USERNAME` <sup>1,2</sup> | string | The username to authenticate to in the website. Example: `admin` |
-| `DAST_USERNAME_FIELD` <sup>1,2</sup> | string | The selector of username field at the sign-in HTML form. Example: `name:username` |
-| `DAST_XML_REPORT` | string | The filename of the XML report written at the end of a scan. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/12652) in GitLab 13.1. |
-| `DAST_WEBSITE` <sup>1</sup> | URL | The URL of the website to scan. The variable `DAST_API_OPENAPI` must be specified if this is omitted. |
-| `DAST_ZAP_CLI_OPTIONS` | string | ZAP server command-line options. For example, `-Xmx3072m` would set the Java maximum memory allocation pool size. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/12652) in GitLab 13.1. |
-| `DAST_ZAP_LOG_CONFIGURATION` | string | Set to a semicolon-separated list of additional log4j properties for the ZAP Server. Example: `log4j.logger.org.parosproxy.paros.network.HttpSender=DEBUG;log4j.logger.com.crawljax=DEBUG` |
-| `SECURE_ANALYZERS_PREFIX` | URL | Set the Docker registry base address from which to download the analyzer. |
-
-1. Available to an on-demand DAST scan.
-1. Used for authentication.
-
### Selectors
Selectors are used by CI/CD variables to specify the location of an element displayed on a page in a browser.
@@ -848,51 +905,6 @@ When using selectors to locate specific fields we recommend you avoid searching
- XPath searches as they are less performant than other selector searches.
- Unscoped searches, such as those beginning with `css:*` and `xpath://*`.
-### DAST command-line options
-
-Not all DAST configuration is available via CI/CD variables. To find out all
-possible options, run the following configuration.
-Available command-line options are printed to the job log:
-
-```yaml
-include:
- template: DAST.gitlab-ci.yml
-
-dast:
- script:
- - /analyze --help
-```
-
-You must then overwrite the `script` command to pass in the appropriate
-argument. For example, vulnerability definitions in alpha can be included with
-`-a`. The following configuration includes those definitions:
-
-```yaml
-include:
- template: DAST.gitlab-ci.yml
-
-dast:
- script:
- - export DAST_WEBSITE=${DAST_WEBSITE:-$(cat environment_url.txt)}
- - /analyze -a -t $DAST_WEBSITE
-```
-
-### Custom ZAProxy configuration
-
-The ZAProxy server contains many [useful configurable values](https://gitlab.com/gitlab-org/gitlab/-/issues/36437#note_245801885).
-Many key/values for `-config` remain undocumented, but there is an untested list of
-[possible keys](https://gitlab.com/gitlab-org/gitlab/-/issues/36437#note_244981023).
-Note that these options are not supported by DAST, and may break the DAST scan
-when used. An example of how to rewrite the Authorization header value with `TOKEN` follows:
-
-```yaml
-include:
- template: DAST.gitlab-ci.yml
-
-variables:
- DAST_ZAP_CLI_OPTIONS: "-config replacer.full_list(0).description=auth -config replacer.full_list(0).enabled=true -config replacer.full_list(0).matchtype=REQ_HEADER -config replacer.full_list(0).matchstr=Authorization -config replacer.full_list(0).regex=false -config replacer.full_list(0).replacement=TOKEN"
-```
-
### Bleeding-edge vulnerability definitions
ZAP first creates rules in the `alpha` class. After a testing period with
@@ -1002,12 +1014,15 @@ The on-demand DAST scan runs, and the project's dashboard shows the results.
#### Schedule an on-demand scan
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/328749) in GitLab 14.3. [Deployed behind the `dast_on_demand_scans_scheduler` flag](../../../administration/feature_flags.md), disabled by default.
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/328749) in GitLab 14.3. [Deployed behind the `dast_on_demand_scans_scheduler` flag](../../../administration/feature_flags.md), disabled by default.
+> - [Enabled on GitLab.com](https://gitlab.com/gitlab-org/gitlab/-/issues/328749) in GitLab 14.4.
+> - [Enabled on self-managed](https://gitlab.com/gitlab-org/gitlab/-/issues/328749) in GitLab 14.4.
FLAG:
-On self-managed GitLab, by default this feature is not available. To make it available per user,
-ask an administrator to [disable the `dast_on_demand_scans_scheduler` flag](../../../administration/feature_flags.md).
-The feature is not ready for production use.
+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
+`dast_on_demand_scans_scheduler`.
+On GitLab.com, this feature is available.
To schedule a scan:
@@ -1185,11 +1200,9 @@ If a validated site profile's target URL is edited, the site's validation status
#### Retry a failed validation
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/322609) in GitLab 14.3.
-
-FLAG:
-On self-managed GitLab, by default this feature is available. To hide the feature, ask an
-administrator to [disable the `dast_failed_site_validations` flag](../../../administration/feature_flags.md).
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/322609) in GitLab 14.3.
+> - [Deployed behind the `dast_failed_site_validations` flag](../../../administration/feature_flags.md), enabled by default.
+> - [Feature flag `dast_failed_site_validations` removed](https://gitlab.com/gitlab-org/gitlab/-/issues/323961) in GitLab 14.4.
If a site profile's validation fails, you can retry it by selecting the **Retry validation** button
in the profiles list.
@@ -1308,7 +1321,7 @@ If a scanner profile is linked to a security policy, a user cannot delete the pr
page. See [Scan Execution Policies](../policies/index.md#scan-execution-policy-editor)
for more information.
-### Auditing
+## Auditing
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/217872) in GitLab 14.1.
@@ -1320,13 +1333,6 @@ and DAST site profiles are included in the [audit log](../../../administration/a
The DAST tool outputs a report file in JSON format by default. However, this tool can also generate reports in
Markdown, HTML, and XML. For more information, see the [schema for DAST reports](https://gitlab.com/gitlab-org/security-products/security-report-schemas/-/blob/master/dist/dast-report-format.json).
-### List of URLs scanned
-
-When DAST completes scanning, the merge request page states the number of URLs scanned.
-Click **View details** to view the web console output which includes the list of scanned URLs.
-
-![DAST Widget](img/dast_urls_scanned_v12_10.png)
-
### JSON
WARNING:
diff --git a/doc/user/application_security/dast_api/index.md b/doc/user/application_security/dast_api/index.md
index 055a2ceb161..3b1c91b0be4 100644
--- a/doc/user/application_security/dast_api/index.md
+++ b/doc/user/application_security/dast_api/index.md
@@ -635,7 +635,7 @@ can be added, removed, and modified by creating a custom configuration.
| `DAST_API_TARGET_URL` | Base URL of API testing target. |
|[`DAST_API_CONFIG`](#configuration-files) | DAST API configuration file. Defaults to `.gitlab-dast-api.yml`. |
|[`DAST_API_PROFILE`](#configuration-files) | Configuration profile to use during testing. Defaults to `Quick`. |
-|[`FUZZAPI_EXCLUDE_PATHS`](#exclude-paths) | Exclude API URL paths from testing. |
+|[`DAST_API_EXCLUDE_PATHS`](#exclude-paths) | Exclude API URL paths from testing. |
|[`DAST_API_OPENAPI`](#openapi-specification) | OpenAPI specification file or URL. |
|[`DAST_API_HAR`](#http-archive-har) | HTTP Archive (HAR) file. |
|[`DAST_API_POSTMAN_COLLECTION`](#postman-collection) | Postman Collection file. |
@@ -899,7 +899,7 @@ variables:
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/211892) in GitLab 14.0.
-When testing an API it can be useful to exclude certain paths. For example, you might exclude testing of an authentication service or an older version of the API. To exclude paths, use the `FUZZAPI_EXCLUDE_PATHS` CI/CD variable . This variable is specified in your `.gitlab-ci.yml` file. To exclude multiple paths, separate entries using the `;` character. In the provided paths you can use a single character wildcard `?` and `*` for a multiple character wildcard.
+When testing an API it can be useful to exclude certain paths. For example, you might exclude testing of an authentication service or an older version of the API. To exclude paths, use the `DAST_API_EXCLUDE_PATHS` CI/CD variable . This variable is specified in your `.gitlab-ci.yml` file. To exclude multiple paths, separate entries using the `;` character. In the provided paths you can use a single character wildcard `?` and `*` for a multiple character wildcard.
To verify the paths are excluded, review the `Tested Operations` and `Excluded Operations` portion of the job output. You should not see any excluded paths listed under `Tested Operations`.
diff --git a/doc/user/application_security/dependency_scanning/analyzers.md b/doc/user/application_security/dependency_scanning/analyzers.md
index fae0f457a20..8559d5af02e 100644
--- a/doc/user/application_security/dependency_scanning/analyzers.md
+++ b/doc/user/application_security/dependency_scanning/analyzers.md
@@ -47,7 +47,7 @@ In `.gitlab-ci.yml` define:
```yaml
include:
- template: Dependency-Scanning.gitlab-ci.yml
+ template: Security/Dependency-Scanning.gitlab-ci.yml
variables:
SECURE_ANALYZERS_PREFIX: my-docker-registry/gl-images
@@ -64,7 +64,7 @@ In `.gitlab-ci.yml` define:
```yaml
include:
- template: Dependency-Scanning.gitlab-ci.yml
+ template: Security/Dependency-Scanning.gitlab-ci.yml
variables:
DS_EXCLUDED_ANALYZERS: "bundler-audit, gemnasium"
@@ -77,7 +77,7 @@ In `.gitlab-ci.yml` define:
```yaml
include:
- template: Dependency-Scanning.gitlab-ci.yml
+ template: Security/Dependency-Scanning.gitlab-ci.yml
variables:
DS_EXCLUDED_ANALYZERS: "gemnasium, gemnasium-maven, gemnasium-python, bundler-audit, retire.js"
diff --git a/doc/user/application_security/dependency_scanning/index.md b/doc/user/application_security/dependency_scanning/index.md
index d903ce58982..1f840c96663 100644
--- a/doc/user/application_security/dependency_scanning/index.md
+++ b/doc/user/application_security/dependency_scanning/index.md
@@ -82,6 +82,7 @@ table.supported-languages tr td:last-child {
}
table.supported-languages ul {
+ font-size: 1em;
list-style-type: none;
padding-left: 0px;
margin-bottom: 0px;
@@ -346,7 +347,7 @@ Add the following to your `.gitlab-ci.yml` file:
```yaml
include:
- - template: Dependency-Scanning.gitlab-ci.yml
+ - template: Security/Dependency-Scanning.gitlab-ci.yml
```
The included template creates dependency scanning jobs in your CI/CD
@@ -380,7 +381,7 @@ For example:
```yaml
include:
- - template: Dependency-Scanning.gitlab-ci.yml
+ - template: Security/Dependency-Scanning.gitlab-ci.yml
variables:
SECURE_LOG_LEVEL: error
@@ -402,7 +403,7 @@ the `gemnasium` analyzer:
```yaml
include:
- - template: Dependency-Scanning.gitlab-ci.yml
+ - template: Security/Dependency-Scanning.gitlab-ci.yml
gemnasium-dependency_scanning:
variables:
@@ -413,7 +414,7 @@ To override the `dependencies: []` attribute, add an override job as above, targ
```yaml
include:
- - template: Dependency-Scanning.gitlab-ci.yml
+ - template: Security/Dependency-Scanning.gitlab-ci.yml
gemnasium-dependency_scanning:
dependencies: ["build"]
@@ -712,7 +713,7 @@ value of `GEMNASIUM_DB_REMOTE_URL` to the location of your offline Git copy of t
```yaml
include:
- - template: Dependency-Scanning.gitlab-ci.yml
+ - template: Security/Dependency-Scanning.gitlab-ci.yml
variables:
SECURE_ANALYZERS_PREFIX: "docker-registry.example.com/analyzers"
@@ -867,7 +868,7 @@ to the supported `requirements.txt` as follows.
```yaml
include:
- - template: Dependency-Scanning.gitlab-ci.yml
+ - template: Security/Dependency-Scanning.gitlab-ci.yml
stages:
- test
@@ -926,3 +927,37 @@ gemnasium-maven-dependency_scanning:
- for i in `ls cert*`; do keytool -v -importcert -alias "custom-cert-$i" -file $i -trustcacerts -noprompt -storepass changeit -keystore /opt/asdf/installs/java/adoptopenjdk-11.0.7+10.1/lib/security/cacerts 1>/dev/null 2>&1 || true; done # import each certificate using keytool (note the keystore location is related to the Java version being used and should be changed accordingly for other versions)
- unset ADDITIONAL_CA_CERT_BUNDLE # unset the variable so that the analyzer doesn't duplicate the import
```
+
+### Dependency Scanning job fails with message `strconv.ParseUint: parsing "0.0": invalid syntax`
+
+Invoking Docker-in-Docker is the likely cause of this error. Docker-in-Docker is:
+
+- Disabled by default in GitLab 13.0 and later.
+- Unsupported from GitLab 13.4 and later.
+
+To fix this error, disable Docker-in-Docker for dependency scanning. Individual
+`<analyzer-name>-dependency_scanning` jobs are created for each analyzer that runs in your CI/CD
+pipeline.
+
+```yaml
+include:
+ - template: Dependency-Scanning.gitlab-ci.yml
+
+variables:
+ DS_DISABLE_DIND: "true"
+```
+
+### Message `<file> does not exist in <commit SHA>`
+
+When the `Location` of a dependency in a file is shown, the path in the link goes to a specific Git
+SHA.
+
+If the lock file that our dependency scanning tools reviewed was cached, however, selecting that
+link redirects you to the repository root, with the message:
+`<file> does not exist in <commit SHA>`.
+
+The lock file is cached during the build phase and passed to the dependency scanning job before the
+scan occurs. Because the cache is downloaded before the analyzer run occurs, the existence of a lock
+file in the `CI_BUILDS_DIR` directory triggers the dependency scanning job.
+
+We recommend committing the lock files, which prevents this warning.
diff --git a/doc/user/application_security/img/cve_request_communication.png b/doc/user/application_security/img/cve_request_communication.png
deleted file mode 100644
index 5c58df463ef..00000000000
--- a/doc/user/application_security/img/cve_request_communication.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/application_security/img/cve_request_communication_publication.png b/doc/user/application_security/img/cve_request_communication_publication.png
deleted file mode 100644
index 9eb6f2f8d9f..00000000000
--- a/doc/user/application_security/img/cve_request_communication_publication.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/application_security/img/new_cve_request_issue.png b/doc/user/application_security/img/new_cve_request_issue.png
index 6ea7ca4a2ab..5f9deeb7bd9 100644
--- a/doc/user/application_security/img/new_cve_request_issue.png
+++ b/doc/user/application_security/img/new_cve_request_issue.png
Binary files differ
diff --git a/doc/user/application_security/policies/index.md b/doc/user/application_security/policies/index.md
index bd143d8608a..e1ddb3167ff 100644
--- a/doc/user/application_security/policies/index.md
+++ b/doc/user/application_security/policies/index.md
@@ -1,18 +1,14 @@
---
stage: Protect
group: Container Security
-info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#designated-technical-writers
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
# Policies **(ULTIMATE)**
-> - [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/5329) in [GitLab Ultimate](https://about.gitlab.com/pricing/) 13.10. Deployed behind a feature flag, disabled by default.
-> - [Enabled on self-managed](https://gitlab.com/gitlab-org/gitlab/-/issues/321258) in [GitLab Ultimate](https://about.gitlab.com/pricing/) 14.3.
-
-FLAG:
-On self-managed GitLab, by default this feature is available. To hide the feature,
-ask an administrator to [disable the `security_orchestration_policies_configuration` flag](../../../administration/feature_flags.md).
-On GitLab.com, this feature is available.
+> - Introduced in GitLab Ultimate 13.10 [with a flag](https://gitlab.com/groups/gitlab-org/-/epics/5329) named `security_orchestration_policies_configuration`. Disabled by default.
+> - [Enabled on self-managed](https://gitlab.com/gitlab-org/gitlab/-/issues/321258) in GitLab Ultimate 14.3.
+> - [Feature flag removed](https://gitlab.com/gitlab-org/gitlab/-/issues/321258) in GitLab 14.4.
Policies in GitLab provide security teams a way to require scans of their choice to be run
whenever a project pipeline runs according to the configuration specified. Security teams can
@@ -28,8 +24,8 @@ GitLab supports the following security policies:
The Policies page displays deployed
policies for all available environments. You can check a
-policy's information (for example description, enforcement
-status, etc.), and create and edit deployed policies:
+policy's information (for example, description or enforcement
+status), and create and edit deployed policies:
1. On the top bar, select **Menu > Projects** and find your project.
1. On the left sidebar, select **Security & Compliance > Policies**.
@@ -53,7 +49,7 @@ users must make changes by following the
## Policy editor
-> [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/3403) in [GitLab Ultimate](https://about.gitlab.com/pricing/) 13.4.
+> [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/3403) in GitLab Ultimate 13.4.
You can use the policy editor to create, edit, and delete policies:
@@ -83,7 +79,7 @@ mode to fix your policy before Rule mode is available again.
## Container Network Policy
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/32365) in [GitLab Ultimate](https://about.gitlab.com/pricing/) 12.9.
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/32365) in GitLab Ultimate 12.9.
The **Container Network Policy** section provides packet flow metrics for
your application's Kubernetes namespace. This section has the following
@@ -158,7 +154,7 @@ at the bottom of the editor.
### Configure a Network Policy Alert
-> - [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/3438) and [enabled by default](https://gitlab.com/gitlab-org/gitlab/-/issues/287676) in [GitLab Ultimate](https://about.gitlab.com/pricing/) 13.9.
+> - [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/3438) and [enabled by default](https://gitlab.com/gitlab-org/gitlab/-/issues/287676) in GitLab Ultimate 13.9.
> - The feature flag was removed and the Threat Monitoring Alerts Project was [made generally available](https://gitlab.com/gitlab-org/gitlab/-/issues/287676) in GitLab 14.0.
You can use policy alerts to track your policy's impact. Alerts are only available if you've
@@ -255,6 +251,10 @@ The policy editor currently only supports the YAML mode. The Rule mode is tracke
The YAML file with Scan Execution Policies consists of an array of objects matching Scan Execution Policy Schema nested under the `scan_execution_policy` key. You can configure a maximum of 5 policies under the `scan_execution_policy` key.
+When you save a new policy, GitLab validates its contents against [this JSON schema](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/app/validators/json_schemas/security_orchestration_policy.json).
+If you're not familiar with how to read [JSON schemas](https://json-schema.org/),
+the following sections and tables provide an alternative.
+
| Field | Type | Possible values | Description |
|-------|------|-----------------|-------------|
| `scan_execution_policy` | `array` of Scan Execution Policy | | List of scan execution policies (maximum 5) |
@@ -291,6 +291,8 @@ This rule enforces the defined actions and schedules a scan on the provided date
#### `cluster` schema
+Use this schema to define `clusters` objects in the [`schedule` rule type](#schedule-rule-type).
+
| Field | Type | Possible values | Description |
|--------------|---------------------|--------------------------|-------------|
| `containers` | `array` of `string` | | The container name that will be scanned (only the first value is currently supported). |
@@ -323,13 +325,16 @@ Note the following:
- For a secret detection scan, only rules with the default ruleset are supported. [Custom rulesets](../secret_detection/index.md#custom-rulesets)
are not supported.
- A secret detection scan runs in `normal` mode when executed as part of a pipeline, and in
- [`historic`](../secret_detection/index.md#full-history-secret-scan)
+ [`historic`](../secret_detection/index.md#full-history-secret-detection)
mode when executed as part of a scheduled scan.
- A container scanning and cluster image scanning scans configured for the `pipeline` rule type will ignore the cluster defined in the `clusters` object.
They will use predefined CI/CD variables defined for your project. Cluster selection with the `clusters` object is supported for the `schedule` rule type.
Cluster with name provided in `clusters` object must be created and configured for the project. To be able to successfully perform the `container_scanning`/`cluster_image_scanning` scans for the cluster you must follow instructions for the [Cluster Image Scanning feature](../cluster_image_scanning/index.md#prerequisites).
-Here's an example:
+### Example security policies project
+
+You can use this example in a `.gitlab/security-policies/policy.yml`, as described in
+[Security policies project](#security-policies-project).
```yaml
---
@@ -398,6 +403,24 @@ In this example:
- Cluster Image Scanning scan runs every 24h. The scan runs on the `production-cluster` cluster and fetches vulnerabilities
from the container with the name `database` configured for deployment with the name `production-application` in the `production-namespace` namespace.
+### Example for scan execution policy editor
+
+You can use this example in the YAML mode of the [Scan Execution Policy editor](#scan-execution-policy-editor).
+It corresponds to a single object from the previous example.
+
+```yaml
+name: Enforce Secret Detection and Container Scanning in every default branch pipeline
+description: This policy enforces pipeline configuration to have a job with Secret Detection and Container Scanning scans for the default branch
+enabled: true
+rules:
+ - type: pipeline
+ branches:
+ - main
+actions:
+ - scan: secret_detection
+ - scan: container_scanning
+```
+
## Roadmap
See the [Category Direction page](https://about.gitlab.com/direction/protect/container_network_security/)
diff --git a/doc/user/application_security/sast/index.md b/doc/user/application_security/sast/index.md
index 3caa1771a5b..7ffefd34e40 100644
--- a/doc/user/application_security/sast/index.md
+++ b/doc/user/application_security/sast/index.md
@@ -27,6 +27,8 @@ analysis are available in the [security dashboards](../security_dashboard/index.
The results are sorted by the priority of the vulnerability:
+<!-- vale gitlab.SubstitutionWarning = NO -->
+
1. Critical
1. High
1. Medium
@@ -34,6 +36,8 @@ The results are sorted by the priority of the vulnerability:
1. Info
1. Unknown
+<!-- vale gitlab.SubstitutionWarning = YES -->
+
A pipeline consists of multiple jobs, including SAST and DAST scanning. If any job fails to finish
for any reason, the security dashboard does not show SAST scanner output. For example, if the SAST
job finishes but the DAST job fails, the security dashboard does not show SAST results. On failure,
@@ -71,10 +75,11 @@ You can also [view our language roadmap](https://about.gitlab.com/direction/secu
| .NET Core | [Security Code Scan](https://security-code-scan.github.io) | 11.0 |
| .NET Framework | [Security Code Scan](https://security-code-scan.github.io) | 13.0 |
| Apex (Salesforce) | [PMD](https://pmd.github.io/pmd/index.html) | 12.1 |
-| C | [Semgrep](https://semgrep.dev) | 14.2 |
+| C | [Semgrep](https://semgrep.dev) | 14.2 |
| C/C++ | [Flawfinder](https://github.com/david-a-wheeler/flawfinder) | 10.7 |
| Elixir (Phoenix) | [Sobelow](https://github.com/nccgroup/sobelow) | 11.1 |
| Go | [Gosec](https://github.com/securego/gosec) | 10.7 |
+| Go | [Semgrep](https://semgrep.dev) | 14.4 |
| Groovy ([Ant](https://ant.apache.org/), [Gradle](https://gradle.org/), [Maven](https://maven.apache.org/), and [SBT](https://www.scala-sbt.org/)) | [SpotBugs](https://spotbugs.github.io/) with the [find-sec-bugs](https://find-sec-bugs.github.io/) plugin | 11.3 (Gradle) & 11.9 (Ant, Maven, SBT) |
| Helm Charts | [Kubesec](https://github.com/controlplaneio/kubesec) | 13.1 |
| Java ([Ant](https://ant.apache.org/), [Gradle](https://gradle.org/), [Maven](https://maven.apache.org/), and [SBT](https://www.scala-sbt.org/)) | [SpotBugs](https://spotbugs.github.io/) with the [find-sec-bugs](https://find-sec-bugs.github.io/) plugin | 10.6 (Maven), 10.8 (Gradle) & 11.9 (Ant, SBT) |
@@ -184,26 +189,60 @@ The results are saved as a
that you can later download and analyze. Due to implementation limitations, we
always take the latest SAST artifact available.
-### Configure SAST in the UI **(ULTIMATE)**
+### Configure SAST in the UI
+
+You can enable and configure SAST in the UI, either with default settings, or with customizations.
+Use the method that best meets your needs.
+
+- [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)
+
+### Configure SAST in the UI with default settings **(FREE)**
+
+> [Introduced](https://about.gitlab.com/releases/2021/02/22/gitlab-13-9-released/#security-configuration-page-for-all-users) in GitLab 13.9
+
+To enable and configure SAST with default settings:
+
+1. On the top bar, select **Menu > Projects** and find your project.
+1. On the left sidebar, select **Security & Compliance** > **Configuration**.
+1. In the SAST section, select `Enable via MR`.
+1. Review the draft MR that enables SAST with the default recommended settings in the
+ `.gitlab-ci.yml` file.
+1. Merge the MR to enable SAST. You should see SAST jobs run in that MR's pipeline.
+
+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.
+
+### Configure SAST in the UI with customizations **(ULTIMATE)**
> - [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/3659) in GitLab Ultimate 13.3.
> - [Improved](https://gitlab.com/gitlab-org/gitlab/-/issues/232862) in GitLab Ultimate 13.4.
> - [Improved](https://gitlab.com/groups/gitlab-org/-/epics/3635) in GitLab Ultimate 13.5.
-You can enable and configure SAST with a basic configuration using the **SAST Configuration**
-page:
+To enable and configure SAST with customizations:
-1. From the project's home page, go to **Security & Compliance** > **Configuration** in the
- left sidebar.
-1. If the project does not have a `.gitlab-ci.yml` file, click **Enable** in the Static Application Security Testing (SAST) row, otherwise click **Configure**.
+1. On the top bar, select **Menu > Projects** and find your project.
+1. On the left sidebar, select **Security & Compliance > Configuration**.
+1. If the project does not have a `.gitlab-ci.yml` file, select **Enable** in the Static Application
+ Security Testing (SAST) row, otherwise select **Configure**.
1. Enter the custom SAST values.
- Custom values are stored in the `.gitlab-ci.yml` file. For CI/CD variables not in the SAST Configuration page, their values are left unchanged. Default values are inherited from the GitLab SAST template.
+ Custom values are stored in the `.gitlab-ci.yml` file. For CI/CD variables not in the SAST
+ Configuration page, their values are left unchanged. Default values are inherited from the GitLab
+ SAST template.
-1. Optionally, expand the **SAST analyzers** section, select individual [SAST analyzers](analyzers.md) and enter custom analyzer values.
-1. Click **Create Merge Request**.
+1. Optionally, expand the **SAST analyzers** section, select individual
+ [SAST analyzers](analyzers.md) and enter custom analyzer values.
+1. Select **Create Merge Request**.
1. Review and merge the merge request.
+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.
+
### Customizing the SAST settings
The SAST settings can be changed through [CI/CD variables](#available-cicd-variables)
@@ -250,12 +289,16 @@ versions are pulled, there are certain cases where it can be beneficial to pin
an analyzer to a specific release. To do so, override the `SAST_ANALYZER_IMAGE_TAG` CI/CD variable
in the job template directly.
-In the example below, we are pinning to a specific patch version of the `spotbugs` analyzer:
+In the example below, we pin to a specific patch version of the `spotbugs` analyzer and minor version of the `semgrep` analyzer:
```yaml
include:
- template: Security/SAST.gitlab-ci.yml
+semgrep-sast:
+ variables:
+ SAST_ANALYZER_IMAGE_TAG: "2.12"
+
spotbugs-sast:
variables:
SAST_ANALYZER_IMAGE_TAG: "2.28.1"
@@ -361,9 +404,6 @@ To create a custom ruleset:
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/292686) in GitLab 14.2.
-FLAG:
-On self-managed GitLab, by default this feature is not available. To make it available, ask an administrator to [enable the `vulnerability_flags` flag](../../../administration/feature_flags.md). On GitLab.com, this feature is available.
-
Vulnerabilities that have been detected and are false positives will be flagged as false positives in the security dashboard.
### Using CI/CD variables to pass credentials for private repositories
@@ -536,9 +576,11 @@ all [custom variables](../../../ci/variables/index.md#custom-cicd-variables) are
to the underlying SAST analyzer images if
[the SAST vendored template](#configuration) is used.
-WARNING:
-Variables having names starting with these prefixes are **not** propagated to the SAST Docker container and/or
-analyzer containers: `DOCKER_`, `CI`, `GITLAB_`, `FF_`, `HOME`, `PWD`, `OLDPWD`, `PATH`, `SHLVL`, `HOSTNAME`.
+NOTE:
+In [GitLab 13.3 and earlier](https://gitlab.com/gitlab-org/gitlab/-/issues/220540),
+variables whose names started with the following prefixes are **not** propagated to either the
+analyzer containers or SAST Docker container: `DOCKER_`, `CI`, `GITLAB_`, `FF_`, `HOME`, `PWD`,
+`OLDPWD`, `PATH`, `SHLVL`, `HOSTNAME`.
### Experimental features
@@ -807,3 +849,55 @@ This occurs when Flawfinder encounters an invalid UTF-8 character. To fix this,
### Semgrep slowness, unexpected results, or other errors
If Semgrep is slow, reports too many false positives or false negatives, crashes, fails, or is otherwise broken, see the Semgrep docs for [troubleshooting GitLab SAST](https://semgrep.dev/docs/troubleshooting/gitlab-sast/).
+
+### SAST job fails with message `strconv.ParseUint: parsing "0.0": invalid syntax`
+
+Invoking Docker-in-Docker is the likely cause of this error. Docker-in-Docker is:
+
+- Disabled by default in GitLab 13.0 and later.
+- Unsupported from GitLab 13.4 and later.
+
+Several workarounds are available. From GitLab version 13.0 and later, you must not use
+Docker-in-Docker.
+
+#### Workaround 1: Pin analyzer versions (GitLab 12.1 and earlier)
+
+Set the following variables for the SAST job. This pins the analyzer versions to the last known
+working version, allowing SAST with Docker-in-Docker to complete as it did previously:
+
+```yaml
+sast:
+ variables:
+ SAST_DEFAULT_ANALYZERS: ""
+ SAST_ANALYZER_IMAGES: "registry.gitlab.com/gitlab-org/security-products/analyzers/bandit:2.9.6, registry.gitlab.com/gitlab-org/security-products/analyzers/brakeman:2.11.0, registry.gitlab.com/gitlab-org/security-products/analyzers/eslint:2.10.0, registry.gitlab.com/gitlab-org/security-products/analyzers/flawfinder:2.11.1, registry.gitlab.com/gitlab-org/security-products/analyzers/gosec:2.14.0, registry.gitlab.com/gitlab-org/security-products/analyzers/nodejs-scan:2.11.0, registry.gitlab.com/gitlab-org/security-products/analyzers/phpcs-security-audit:2.9.1, registry.gitlab.com/gitlab-org/security-products/analyzers/pmd-apex:2.9.0, registry.gitlab.com/gitlab-org/security-products/analyzers/secrets:3.12.0, registry.gitlab.com/gitlab-org/security-products/analyzers/security-code-scan:2.13.0, registry.gitlab.com/gitlab-org/security-products/analyzers/sobelow:2.8.0, registry.gitlab.com/gitlab-org/security-products/analyzers/spotbugs:2.13.6, registry.gitlab.com/gitlab-org/security-products/analyzers/tslint:2.4.0"
+```
+
+Remove any analyzers you don't need from the `SAST_ANALYZER_IMAGES` list. Keep
+`SAST_DEFAULT_ANALYZERS` set to an empty string `""`.
+
+#### Workaround 2: Disable Docker-in-Docker for SAST and Dependency Scanning (GitLab 12.3 and later)
+
+Disable Docker-in-Docker for SAST. Individual `<analyzer-name>-sast` jobs are created for each
+analyzer that runs in your CI/CD pipeline.
+
+```yaml
+include:
+ - template: SAST.gitlab-ci.yml
+
+variables:
+ SAST_DISABLE_DIND: "true"
+```
+
+#### Workaround 3: Upgrade to GitLab 13.x and use the defaults
+
+From GitLab 13.0, SAST defaults to not using Docker-in-Docker. In GitLab 13.4 and later, SAST using
+Docker-in-Docker is [no longer supported](https://gitlab.com/gitlab-org/gitlab/-/issues/220540).
+If you have this problem on GitLab 13.x and later, you have customized your SAST job to
+use Docker-in-Docker. To resolve this, comment out any customizations you've made to
+your SAST CI job definition and [follow the documentation](index.md#configuration)
+to reconfigure, using the new and improved job definition default values.
+
+```yaml
+include:
+ - template: Security/SAST.gitlab-ci.yml
+```
diff --git a/doc/user/application_security/secret_detection/index.md b/doc/user/application_security/secret_detection/index.md
index cd1014d36a6..5933496ea00 100644
--- a/doc/user/application_security/secret_detection/index.md
+++ b/doc/user/application_security/secret_detection/index.md
@@ -138,7 +138,7 @@ The results are saved as a
that you can later download and analyze. Due to implementation limitations, we
always take the latest Secret Detection artifact available.
-### Enable Secret Detection via an automatic merge request **(ULTIMATE SELF)**
+### Enable Secret Detection via an automatic merge request **(FREE)**
> - [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/4496) in GitLab 13.11, behind a feature flag, enabled by default.
> - [Feature flag removed](https://gitlab.com/gitlab-org/gitlab/-/issues/329886) in GitLab 14.1.
@@ -151,7 +151,12 @@ from the Security Configuration page.
1. In the **Secret Detection** row, select **Configure via Merge Request**.
This automatically creates a merge request with the changes necessary to enable Secret Detection
-that you can review and merge to complete the configuration.
+that you can review and merge to complete the configuration.
+
+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.
### Customizing settings
@@ -167,12 +172,12 @@ WARNING:
Beginning in GitLab 13.0, the use of [`only` and `except`](../../../ci/yaml/index.md#only--except)
is no longer supported. When overriding the template, you must use [`rules`](../../../ci/yaml/index.md#rules) instead.
-#### GIT_DEPTH
+#### `GIT_DEPTH` variable
The [`GIT_DEPTH` CI/CD variable](../../../ci/runners/configure_runners.md#shallow-cloning) affects Secret Detection.
The Secret Detection analyzer relies on generating patches between commits to scan content for
secrets. If you override the default, ensure the value is greater than 1. If the number of commits
-in an MR is greater than the GIT_DEPTH value, Secret Detection will [fail to detect secrets](#error-couldnt-run-the-gitleaks-command-exit-status-2).
+in an MR is greater than the `GIT_DEPTH` value, Secret Detection will [fail to detect secrets](#error-couldnt-run-the-gitleaks-command-exit-status-2).
#### Custom settings example
@@ -285,20 +290,20 @@ sequenceDiagram
Cloud Vendor-->>+RevocationAPI: ACCEPTED
```
-## Full History Secret Scan
+## Full History Secret Detection
GitLab 12.11 introduced support for scanning the full history of a repository. This new functionality
is particularly useful when you are enabling Secret Detection in a repository for the first time and you
-want to perform a full secret scan. Running a secret scan on the full history can take a long time,
+want to perform a full secret detection scan. Running a secret detection scan on the full history can take a long time,
especially for larger repositories with lengthy Git histories. We recommend not setting this CI/CD variable
as part of your normal job definition.
A new configuration variable ([`SECRET_DETECTION_HISTORIC_SCAN`](#available-cicd-variables))
can be set to change the behavior of the GitLab Secret Detection scan to run on the entire Git history of a repository.
-We have created a [short video walkthrough](https://youtu.be/wDtc_K00Y0A) showcasing how you can perform a full history secret scan.
+We have created a [short video walkthrough](https://youtu.be/wDtc_K00Y0A) showcasing how you can perform a full history secret detection scan.
<div class="video-fallback">
- See the video: <a href="https://www.youtube.com/watch?v=wDtc_K00Y0A">Walkthrough of historical secret scan</a>.
+ See the video: <a href="https://www.youtube.com/watch?v=wDtc_K00Y0A">Walkthrough of historical secret detection scan</a>.
</div>
<figure class="video-container">
<iframe src="https://www.youtube.com/embed/wDtc_K00Y0A" frameborder="0" allowfullscreen="true"> </iframe>
diff --git a/doc/user/application_security/vulnerability_report/index.md b/doc/user/application_security/vulnerability_report/index.md
index 8b811c62ec3..f5b0194c320 100644
--- a/doc/user/application_security/vulnerability_report/index.md
+++ b/doc/user/application_security/vulnerability_report/index.md
@@ -45,6 +45,8 @@ From the Vulnerability Report you can:
You can filter the vulnerabilities table by:
+<!-- vale gitlab.SubstitutionWarning = NO -->
+
| Filter | Available options |
|:---------|:------------------|
| Status | Detected, Confirmed, Dismissed, Resolved. |
@@ -53,6 +55,8 @@ You can filter the vulnerabilities table by:
| Project | For more details, see [Project filter](#project-filter). |
| Activity | For more details, see [Activity filter](#activity-filter). |
+<!-- vale gitlab.SubstitutionWarning = YES -->
+
### Filter the list of vulnerabilities
To filter the list of vulnerabilities:
diff --git a/doc/user/asciidoc.md b/doc/user/asciidoc.md
index 8313b20e795..cd166666ad6 100644
--- a/doc/user/asciidoc.md
+++ b/doc/user/asciidoc.md
@@ -1,8 +1,7 @@
---
stage: Create
group: Source Code
-info: "To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments"
-type: reference, howto
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
# AsciiDoc **(FREE)**
@@ -85,7 +84,7 @@ I believe I shall--no, actually I won't.
**Macros**
```plaintext
-// where c=specialchars, q=quotes, a=attributes, r=replacements, m=macros, p=post_replacements, etc.
+// where c=specialchars, q=quotes, a=attributes, r=replacements, m=macros, p=post_replacements
The European icon:flag[role=blue] is blue & contains pass:[************] arranged in a icon:circle-o[role=yellow].
The pass:c[->] operator is often referred to as the stabby lambda.
Since `pass:[++]` has strong priority in AsciiDoc, you can rewrite pass:c,a,r[C++ => C{pp}].
@@ -151,7 +150,7 @@ This paragraph has a footnote.footnote:[This is the text of the footnote.]
** level 2
*** level 3
**** level 4
-***** etc.
+***** level 5
* back at level 1
+
Attach a block or paragraph to a list item using a list continuation (which you can enclose in an open block).
@@ -240,10 +239,10 @@ include::basics.adoc[]
include::https://example.org/installation.adoc[]
```
-To guarantee good system performance and prevent malicious documents causing
-problems, GitLab enforces a **maximum limit** on the number of include directives
-processed in any one document. Currently a total of 32 documents can be
-included, a number that is inclusive of transitive dependencies.
+To guarantee good system performance and prevent malicious documents from causing
+problems, GitLab enforces a maximum limit on the number of include directives
+processed in any one document. You can include up to 32 documents, which is
+inclusive of transitive dependencies.
### Blocks
@@ -428,7 +427,7 @@ If you're new to using Mermaid or need help identifying issues in your Mermaid c
the [Mermaid Live Editor](https://mermaid-js.github.io/mermaid-live-editor/) is a helpful tool
for creating and resolving issues within Mermaid diagrams.
-In order to generate a diagram or flowchart, you should write your text inside the `mermaid` block:
+To generate a diagram or flowchart, enter your text in a `mermaid` block:
```plaintext
[mermaid]
@@ -447,7 +446,7 @@ Kroki supports more than a dozen diagram libraries.
To make Kroki available in GitLab, a GitLab administrator needs to enable it first.
Read more in the [Kroki integration](../administration/integration/kroki.md) page.
-Once Kroki is enabled, you can create a wide variety of diagrams in AsciiDoc and Markdown documents.
+After Kroki is enabled, you can create diagrams in AsciiDoc and Markdown documents.
Here's an example using a GraphViz diagram:
**AsciiDoc**
@@ -476,7 +475,7 @@ digraph G {
To make PlantUML available in GitLab, a GitLab administrator needs to enable it first.
Read more in [PlantUML & GitLab](../administration/integration/plantuml.md).
-Once enabled, you should write your text inside the `plantuml` block:
+After PlantUML is enabled, enter your text in a `plantuml` block:
```plaintext
[plantuml]
diff --git a/doc/user/award_emojis.md b/doc/user/award_emojis.md
index de250bc5fb4..88651688779 100644
--- a/doc/user/award_emojis.md
+++ b/doc/user/award_emojis.md
@@ -6,11 +6,6 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# Award emoji **(FREE)**
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/1825) in GitLab 8.2.
-> - GitLab 9.0 [introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/9570) the usage of native emoji if the platform
-> supports them and falls back to images or CSS sprites. This change greatly
-> improved award emoji performance overall.
-
When you're collaborating online, you get fewer opportunities for high-fives
and thumbs-ups. Emoji can be awarded to [issues](project/issues/index.md), [merge requests](project/merge_requests/index.md),
[snippets](snippets.md), and anywhere you can have a thread.
@@ -24,8 +19,6 @@ For information on the relevant API, see [Award Emoji API](../api/award_emoji.md
## Sort issues and merge requests on vote count
-> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/2781) in GitLab 8.5.
-
You can quickly sort issues and merge requests by the number of votes they
have received. The sort options can be found in the dropdown menu as "Most
popular" and "Least popular".
@@ -38,8 +31,6 @@ downvotes.
## Award emoji for comments
-> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/4291) in GitLab 8.9.
-
Award emoji can also be applied to individual comments when you want to
celebrate an accomplishment or agree with an opinion.
diff --git a/doc/user/clusters/agent/ci_cd_tunnel.md b/doc/user/clusters/agent/ci_cd_tunnel.md
index 1ea5168f30c..6c8b7c95771 100644
--- a/doc/user/clusters/agent/ci_cd_tunnel.md
+++ b/doc/user/clusters/agent/ci_cd_tunnel.md
@@ -10,6 +10,10 @@ info: To determine the technical writer assigned to the Stage/Group associated w
> - The pre-configured `KUBECONFIG` was [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/324275) in GitLab 14.2.
> - The ability to authorize groups was [introduced](https://gitlab.com/groups/gitlab-org/-/epics/5784) in GitLab 14.3.
+WARNING:
+The CI/CD Tunnel is not supported for GitLab self-managed instances installed via Omnibus. We
+plan to [add support for Omnibus](https://gitlab.com/gitlab-org/gitlab/-/issues/324272) in the future.
+
The CI/CD Tunnel enables users to access Kubernetes clusters from GitLab CI/CD jobs even if there is no network
connectivity between GitLab Runner and a cluster. GitLab Runner does not have to be running in the same cluster.
diff --git a/doc/user/clusters/agent/index.md b/doc/user/clusters/agent/index.md
index d2dc57c0849..557d389147d 100644
--- a/doc/user/clusters/agent/index.md
+++ b/doc/user/clusters/agent/index.md
@@ -15,7 +15,7 @@ The [GitLab Kubernetes Agent](https://gitlab.com/gitlab-org/cluster-integration/
is an active in-cluster component for solving GitLab and Kubernetes integration
tasks in a secure and cloud-native way. It enables:
-- Integrating GitLab with a Kubernetes cluster behind a firewall or NAT
+- GitLab integration with a Kubernetes cluster behind a firewall or NAT
(network address translation).
- Pull-based GitOps deployments.
- [Inventory object](../../infrastructure/clusters/deploy/inventory_object.md) to keep track of objects applied to your cluster.
@@ -28,7 +28,7 @@ and [our development documentation](https://gitlab.com/gitlab-org/cluster-integr
## GitLab Agent GitOps workflow
-The GitLab Agent uses multiple GitLab projects to provide a flexible workflow
+The GitLab Agent, herein _Agent_, uses multiple GitLab projects to provide a flexible workflow
that can suit various needs. This diagram shows these repositories and the main
actors involved in a deployment:
@@ -54,10 +54,10 @@ There are several components that work in concert for the Agent to accomplish Gi
- A properly-configured Kubernetes cluster where the Agent is running.
- A configuration repository that contains a `config.yaml` file, which tells the
- Agent which repositories to synchronize with the cluster.
+ Agent the repositories to synchronize with the cluster.
- A manifest repository that contains manifest files. Any changes to manifest files are applied to the cluster.
-You can use the same GitLab project or separate projects for configuration and manifest files, as follows:
+You can use the same GitLab project or projects for configuration and manifest files, as follows:
- Single GitLab project (recommended): when you use a single repository to hold both the manifest and the configuration files, these projects can be either private or public, as you prefer.
- Two GitLab projects: when you opt to use two different GitLab projects, one for manifest files, and another for configuration files, the manifests project must be public, while the configuration project can be either private or public. Our backlog contains issues for adding support for
@@ -73,8 +73,8 @@ The setup process involves a few steps to enable GitOps deployments:
1. [Set up the Kubernetes Agent Server](#set-up-the-kubernetes-agent-server) for your GitLab instance.
1. [Define a configuration repository](#define-a-configuration-repository).
1. [Create an Agent record in GitLab](#create-an-agent-record-in-gitlab).
-1. [Generate and copy a Secret token used to connect to the Agent](#create-the-kubernetes-secret).
1. [Install the Agent into the cluster](#install-the-agent-into-the-cluster).
+1. [Generate and copy a Secret token used to connect to the Agent](#create-the-kubernetes-secret).
1. [Create manifest files](#create-manifest-files).
<i class="fa fa-youtube-play youtube" aria-hidden="true"></i> Watch a GitLab 14.2 [walking-through video](https://www.youtube.com/watch?v=XuBpKtsgGkE) with this process.
@@ -200,7 +200,7 @@ For more advanced configurations, we recommend to use [the `kpt` based installat
Otherwise, follow the manual installation steps described below.
-##### Create the Kubernetes secret
+### Create the Kubernetes secret
After generating the token, you must apply it to the Kubernetes cluster.
@@ -256,7 +256,7 @@ NAMESPACE NAME READY S
gitlab-kubernetes-agent gitlab-kubernetes-agent-77689f7dcb-5skqk 1/1 Running 0 51s
```
-##### Example `resources.yml` file
+#### Example `resources.yml` file
```yaml
---
@@ -403,7 +403,7 @@ The following example projects can help you get started with the Kubernetes Agen
- [Configuration repository](https://gitlab.com/gitlab-org/configure/examples/kubernetes-agent)
- This basic GitOps example deploys NGINX: [Manifest repository](https://gitlab.com/gitlab-org/configure/examples/gitops-project)
-### Deploying GitLab Runner with the Agent
+### GitLab Runner Deployment with the Agent
You can use the Kubernetes Agent to
[deploy GitLab Runner in a Kubernetes cluster](https://docs.gitlab.com/runner/install/kubernetes-agent.html).
@@ -444,6 +444,41 @@ the current project, and the configuration directory for each agent:
Additional management interfaces are planned for the GitLab Kubernetes Agent.
[Provide more feedback in the related epic](https://gitlab.com/groups/gitlab-org/-/epics/4739).
+## Remove the GitLab Kubernetes Agent
+
+1. Remove an Agent record with GraphQL by deleting the `clusterAgent` and the `clusterAgentToken`.
+
+ ```graphql
+ mutation deleteAgent {
+ clusterAgentDelete(input: { id: "<cluster-agent-id>" } ) {
+ errors
+ }
+ }
+
+ mutation deleteToken {
+ clusterAgentTokenDelete(input: { id: "<cluster-agent-token-id>" }) {
+ errors
+ }
+ }
+ ```
+
+1. Verify whether the removal occurred successfully. If the output in the Pod logs includes `unauthenticated`, it means that the agent was successfully removed:
+
+ ```json
+ {
+ "level": "warn",
+ "time": "2021-04-29T23:44:07.598Z",
+ "msg": "GetConfiguration.Recv failed",
+ "error": "rpc error: code = Unauthenticated desc = unauthenticated"
+ }
+ ```
+
+1. Delete the GitLab Kubernetes Agent in your cluster:
+
+ ```shell
+ kubectl delete -n gitlab-kubernetes-agent -f ./resources.yml
+ ```
+
## Troubleshooting
If you face any issues while using GitLab Kubernetes Agent, you can read the
@@ -455,10 +490,17 @@ kubectl logs -f -l=app=gitlab-kubernetes-agent -n gitlab-kubernetes-agent
GitLab administrators can additionally view the [Kubernetes Agent Server logs](../../../administration/clusters/kas.md#troubleshooting).
-### Agent logs - Transport: Error while dialing failed to WebSocket dial
+### Agent logs
+
+#### Transport: Error while dialing failed to WebSocket dial
```json
-{"level":"warn","time":"2020-11-04T10:14:39.368Z","msg":"GetConfiguration failed","error":"rpc error: code = Unavailable desc = connection error: desc = \"transport: Error while dialing failed to WebSocket dial: failed to send handshake request: Get \\\"https://gitlab-kas:443/-/kubernetes-agent\\\": dial tcp: lookup gitlab-kas on 10.60.0.10:53: no such host\""}
+{
+ "level": "warn",
+ "time": "2020-11-04T10:14:39.368Z",
+ "msg": "GetConfiguration failed",
+ "error": "rpc error: code = Unavailable desc = connection error: desc = \"transport: Error while dialing failed to WebSocket dial: failed to send handshake request: Get \\\"https://gitlab-kas:443/-/kubernetes-agent\\\": dial tcp: lookup gitlab-kas on 10.60.0.10:53: no such host\""
+}
```
This error is shown if there are some connectivity issues between the address
@@ -466,27 +508,45 @@ specified as `kas-address`, and your Agent pod. To fix it, make sure that you
specified the `kas-address` correctly.
```json
-{"level":"error","time":"2021-06-25T21:15:45.335Z","msg":"Reverse tunnel","mod_name":"reverse_tunnel","error":"Connect(): rpc error: code = Unavailable desc = connection error: desc= \"transport: Error while dialing failed to WebSocket dial: expected handshake response status code 101 but got 301\""}
+{
+ "level": "error",
+ "time": "2021-06-25T21:15:45.335Z",
+ "msg": "Reverse tunnel",
+ "mod_name": "reverse_tunnel",
+ "error": "Connect(): rpc error: code = Unavailable desc = connection error: desc= \"transport: Error while dialing failed to WebSocket dial: expected handshake response status code 101 but got 301\""
+}
```
This error occurs if the `kas-address` doesn't include a trailing slash. To fix it, make sure that the
`wss` or `ws` URL ends with a training slash, such as `wss://GitLab.host.tld:443/-/kubernetes-agent/`
or `ws://GitLab.host.tld:80/-/kubernetes-agent/`.
-### Agent logs - ValidationError(Deployment.metadata)
+#### ValidationError(Deployment.metadata)
```json
-{"level":"info","time":"2020-10-30T08:56:54.329Z","msg":"Synced","project_id":"root/kas-manifest001","resource_key":"apps/Deployment/kas-test001/nginx-deployment","sync_result":"error validating data: [ValidationError(Deployment.metadata): unknown field \"replicas\" in io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta, ValidationError(Deployment.metadata): unknown field \"selector\" in io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta, ValidationError(Deployment.metadata): unknown field \"template\" in io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta]"}
+{
+ "level": "info",
+ "time": "2020-10-30T08:56:54.329Z",
+ "msg": "Synced",
+ "project_id": "root/kas-manifest001",
+ "resource_key": "apps/Deployment/kas-test001/nginx-deployment",
+ "sync_result": "error validating data: [ValidationError(Deployment.metadata): unknown field \"replicas\" in io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta, ValidationError(Deployment.metadata): unknown field \"selector\" in io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta, ValidationError(Deployment.metadata): unknown field \"template\" in io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta]"
+}
```
This error is shown if a manifest file is malformed, and Kubernetes can't
create specified objects. Make sure that your manifest files are valid. You
may try using them to create objects in Kubernetes directly for more troubleshooting.
-### Agent logs - Error while dialing failed to WebSocket dial: failed to send handshake request
+#### Error while dialing failed to WebSocket dial: failed to send handshake request
```json
-{"level":"warn","time":"2020-10-30T09:50:51.173Z","msg":"GetConfiguration failed","error":"rpc error: code = Unavailable desc = connection error: desc = \"transport: Error while dialing failed to WebSocket dial: failed to send handshake request: Get \\\"https://GitLabhost.tld:443/-/kubernetes-agent\\\": net/http: HTTP/1.x transport connection broken: malformed HTTP response \\\"\\\\x00\\\\x00\\\\x06\\\\x04\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x05\\\\x00\\\\x00@\\\\x00\\\"\""}
+{
+ "level": "warn",
+ "time": "2020-10-30T09:50:51.173Z",
+ "msg": "GetConfiguration failed",
+ "error": "rpc error: code = Unavailable desc = connection error: desc = \"transport: Error while dialing failed to WebSocket dial: failed to send handshake request: Get \\\"https://GitLabhost.tld:443/-/kubernetes-agent\\\": net/http: HTTP/1.x transport connection broken: malformed HTTP response \\\"\\\\x00\\\\x00\\\\x06\\\\x04\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x00\\\\x05\\\\x00\\\\x00@\\\\x00\\\"\""
+}
```
This error is shown if you configured `wss` as `kas-address` on the agent side,
@@ -499,19 +559,30 @@ issue is in progress, directly edit the deployment with the
`kubectl edit deployment gitlab-kas` command, and change `--listen-websocket=true` to `--listen-websocket=false`. After running that command, you should be able to use
`grpc://gitlab-kas.<YOUR-NAMESPACE>:8150`.
-### Agent logs - Decompressor is not installed for grpc-encoding
+#### Decompressor is not installed for grpc-encoding
```json
-{"level":"warn","time":"2020-11-05T05:25:46.916Z","msg":"GetConfiguration.Recv failed","error":"rpc error: code = Unimplemented desc = grpc: Decompressor is not installed for grpc-encoding \"gzip\""}
+{
+ "level": "warn",
+ "time": "2020-11-05T05:25:46.916Z",
+ "msg": "GetConfiguration.Recv failed",
+ "error": "rpc error: code = Unimplemented desc = grpc: Decompressor is not installed for grpc-encoding \"gzip\""
+}
```
This error is shown if the version of the agent is newer that the version of KAS.
To fix it, make sure that both `agentk` and KAS use the same versions.
-### Agent logs - Certificate signed by unknown authority
+#### Certificate signed by unknown authority
```json
-{"level":"error","time":"2021-02-25T07:22:37.158Z","msg":"Reverse tunnel","mod_name":"reverse_tunnel","error":"Connect(): rpc error: code = Unavailable desc = connection error: desc = \"transport: Error while dialing failed to WebSocket dial: failed to send handshake request: Get \\\"https://GitLabhost.tld:443/-/kubernetes-agent/\\\": x509: certificate signed by unknown authority\""}
+{
+ "level": "error",
+ "time": "2021-02-25T07:22:37.158Z",
+ "msg": "Reverse tunnel",
+ "mod_name": "reverse_tunnel",
+ "error": "Connect(): rpc error: code = Unavailable desc = connection error: desc = \"transport: Error while dialing failed to WebSocket dial: failed to send handshake request: Get \\\"https://GitLabhost.tld:443/-/kubernetes-agent/\\\": x509: certificate signed by unknown authority\""
+}
```
This error is shown if your GitLab instance is using a certificate signed by an internal CA that
@@ -580,34 +651,3 @@ Alternatively, you can mount the certificate file at a different location and in
mountPath: /tmp/myCA.pem
subPath: myCA.pem
```
-
-## Remove the GitLab Kubernetes Agent
-
-1. Remove an Agent record with GraphQL by deleting the `clusterAgent` and the `clusterAgentToken`.
-
- ```graphql
- mutation deleteAgent {
- clusterAgentDelete(input: { id: "<cluster-agent-id>" } ) {
- errors
- }
- }
-
- mutation deleteToken {
- clusterAgentTokenDelete(input: { id: "<cluster-agent-token-id>" }) {
- errors
- }
- }
- ```
-
-1. Verify whether the removal occurred successfully. If the output in the Pod logs includes `unauthenticated`, it means that the agent was successfully removed:
-
- ```json
- {"level":"warn","time":"2021-04-29T23:44:07.598Z","msg":"GetConfiguration.Recv failed","error":"rpc error:
- code = Unauthenticated desc = unauthenticated"}
- ```
-
-1. Delete the GitLab Kubernetes Agent in your cluster:
-
- ```shell
- kubectl delete -n gitlab-kubernetes-agent -f ./resources.yml
- ```
diff --git a/doc/user/clusters/agent/repository.md b/doc/user/clusters/agent/repository.md
index ea57ded3320..cbb27a3f343 100644
--- a/doc/user/clusters/agent/repository.md
+++ b/doc/user/clusters/agent/repository.md
@@ -152,6 +152,11 @@ gitops:
> [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/5784) in GitLab 14.3.
+FLAG:
+On self-managed GitLab, by default this feature is not available. To make it available,
+ask an administrator to [enable the `group_authorized_agents` flag](../../../administration/feature_flags.md).
+On GitLab.com, this feature is available.
+
If you use the same cluster across multiple projects, you can set up the CI/CD Tunnel
to grant the Agent access to one or more groups. This way, all the projects that belong
to the authorized groups can access the same Agent. This enables you to save resources and
@@ -168,8 +173,8 @@ An Agent can only authorize groups in the same group hierarchy as the Agent's co
To authorize a group:
-1. Edit your `.config.yaml` file under the `.gitlab/agents/<agent name>` directory.
-1. Add the `ci_access` attribute.
+1. Edit your `config.yaml` file under the `.gitlab/agents/<agent name>` directory.
+1. Add the `ci_access` root attribute.
1. Add the `groups` attribute into `ci_access`.
1. Add the group `id` into `groups`, identifying the authorized group through its path.
diff --git a/doc/user/clusters/applications.md b/doc/user/clusters/applications.md
index 2da8396cfd7..31dd503a0cf 100644
--- a/doc/user/clusters/applications.md
+++ b/doc/user/clusters/applications.md
@@ -485,7 +485,7 @@ config:
agent:
monitor:
- eventTypes: ["drop"]
+ eventTypes: ["drop"] # Note: possible values are documented at https://docs.cilium.io/en/stable/cmdref/cilium_monitor/
```
The Cilium monitor log for traffic is logged out by the
diff --git a/doc/user/clusters/environments.md b/doc/user/clusters/environments.md
index cad55f0cf0b..470f65db61b 100644
--- a/doc/user/clusters/environments.md
+++ b/doc/user/clusters/environments.md
@@ -33,7 +33,7 @@ owners](../permissions.md#group-members-permissions)
In order to:
- Track environments for the cluster, you must
- [deploy to a Kubernetes cluster](../project/clusters/index.md#deploying-to-a-kubernetes-cluster)
+ [deploy to a Kubernetes cluster](../project/clusters/deploy_to_cluster.md)
successfully.
- Show pod usage correctly, you must
[enable deploy boards](../project/deploy_boards.md#enabling-deploy-boards).
diff --git a/doc/user/clusters/management_project_template.md b/doc/user/clusters/management_project_template.md
index 9e2b00a0f54..305f66c5ec5 100644
--- a/doc/user/clusters/management_project_template.md
+++ b/doc/user/clusters/management_project_template.md
@@ -12,7 +12,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
With a [cluster management project](management_project.md) you can manage
your cluster's deployment and applications through a repository in GitLab.
-The Custer Management project template provides you a baseline to get
+The Cluster Management project template provides you a baseline to get
started and flexibility to customize your project to your cluster's needs.
For instance, you can:
@@ -91,10 +91,6 @@ the pipeline runs, Helmfile tries to either install or update your apps accordin
cluster and Helm releases. If you change this attribute to `installed: false`, Helmfile tries try to uninstall this app
from your cluster. [Read more](https://github.com/roboll/helmfile) about how Helmfile works.
-Furthermore, each app has an `applications/{app}/values.yaml` file (`applicaton/{app}/values.yaml.gotmpl` in case of GitLab Runner). This is the
-place where you can define default values for your app's Helm chart. Some apps already have defaults
-pre-defined by GitLab.
-
### Built-in applications
The [built-in supported applications](https://gitlab.com/gitlab-org/project-templates/cluster-management/-/tree/master/applications) are:
@@ -110,3 +106,9 @@ The [built-in supported applications](https://gitlab.com/gitlab-org/project-temp
- [Prometheus](../infrastructure/clusters/manage/management_project_applications/prometheus.md)
- [Sentry](../infrastructure/clusters/manage/management_project_applications/sentry.md)
- [Vault](../infrastructure/clusters/manage/management_project_applications/vault.md)
+
+#### How to customize your applications
+
+Each app has an `applications/{app}/values.yaml` file (`applicaton/{app}/values.yaml.gotmpl` in case of GitLab Runner). This is the
+place where you can define default values for your app's Helm chart. Some apps already have defaults
+pre-defined by GitLab.
diff --git a/doc/user/compliance/compliance_report/index.md b/doc/user/compliance/compliance_report/index.md
index d30cedfb3cd..63dd06bcfdb 100644
--- a/doc/user/compliance/compliance_report/index.md
+++ b/doc/user/compliance/compliance_report/index.md
@@ -30,7 +30,7 @@ Prerequisites:
To view the compliance report:
1. On the top bar, select **Menu > Groups** and find your group.
-1. On the left sidebar, select **Security & Compliance > Compliance**.
+1. On the left sidebar, select **Security & Compliance > Compliance report**.
NOTE:
The compliance report shows only the latest merge request on each project.
@@ -87,7 +87,7 @@ Depending on the merge strategy, the merge commit SHA can be a merge commit, squ
To download the Chain of Custody report:
1. On the top bar, select **Menu > Groups** and find your group.
-1. On the left sidebar, select **Security & Compliance > Compliance**.
+1. On the left sidebar, select **Security & Compliance > Compliance report**.
1. Select **List of all merge commits**.
### Commit-specific Chain of Custody Report **(ULTIMATE)**
@@ -97,7 +97,7 @@ To download the Chain of Custody report:
You can generate a commit-specific Chain of Custody report for a given commit SHA.
1. On the top bar, select **Menu > Groups** and find your group.
-1. On the left sidebar, select **Security & Compliance > Compliance**.
+1. On the left sidebar, select **Security & Compliance > Compliance report**.
1. At the top of the compliance report, to the right of **List of all merge commits**, select the down arrow (**{angle-down}**).
1. Enter the merge commit SHA, and then select **Export commit custody report**.
SHA and then select **Export commit custody report**.
diff --git a/doc/user/compliance/license_compliance/img/policies_maintainer_add_v13_2.png b/doc/user/compliance/license_compliance/img/policies_maintainer_add_v13_2.png
deleted file mode 100644
index 2d5946503cf..00000000000
--- a/doc/user/compliance/license_compliance/img/policies_maintainer_add_v13_2.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/compliance/license_compliance/img/policies_maintainer_add_v14_3.png b/doc/user/compliance/license_compliance/img/policies_maintainer_add_v14_3.png
new file mode 100644
index 00000000000..7a27899f8c9
--- /dev/null
+++ b/doc/user/compliance/license_compliance/img/policies_maintainer_add_v14_3.png
Binary files differ
diff --git a/doc/user/compliance/license_compliance/img/policies_maintainer_edit_v14_2.png b/doc/user/compliance/license_compliance/img/policies_maintainer_edit_v14_2.png
deleted file mode 100644
index 2ad08919f86..00000000000
--- a/doc/user/compliance/license_compliance/img/policies_maintainer_edit_v14_2.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/compliance/license_compliance/img/policies_maintainer_edit_v14_3.png b/doc/user/compliance/license_compliance/img/policies_maintainer_edit_v14_3.png
new file mode 100644
index 00000000000..85b2a52e04b
--- /dev/null
+++ b/doc/user/compliance/license_compliance/img/policies_maintainer_edit_v14_3.png
Binary files differ
diff --git a/doc/user/compliance/license_compliance/index.md b/doc/user/compliance/license_compliance/index.md
index 165150a58a1..5318f4deed1 100644
--- a/doc/user/compliance/license_compliance/index.md
+++ b/doc/user/compliance/license_compliance/index.md
@@ -47,7 +47,7 @@ When GitLab detects a **Denied** license, you can view it in the [license list](
![License List](img/license_list_v13_0.png)
You can view and modify existing policies from the [policies](#policies) tab.
-![Edit Policy](img/policies_maintainer_edit_v14_2.png)
+![Edit Policy](img/policies_maintainer_edit_v14_3.png)
## License expressions
@@ -742,8 +742,9 @@ which enables a designated approver that can approve and then merge a merge requ
The **Policies** tab in the project's license compliance section displays your project's license
policies. Project maintainers can specify policies in this section.
-![Edit Policy](img/policies_maintainer_edit_v14_2.png)
-![Add Policy](img/policies_maintainer_add_v13_2.png)
+![Edit Policy](img/policies_maintainer_edit_v14_3.png)
+
+![Add Policy](img/policies_maintainer_add_v14_3.png)
Developers of the project can view the policies configured in a project.
@@ -753,6 +754,10 @@ Developers of the project can view the policies configured in a project.
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/13067) in [GitLab Ultimate](https://about.gitlab.com/pricing/) 12.3.
+Prerequisites:
+
+- Maintainer or Owner [role](../../permissions.md#project-members-permissions).
+
`License-Check` is a [merge request approval](../../project/merge_requests/approvals/index.md) rule
you can enable to allow an individual or group to approve a merge request that contains a `denied`
license.
diff --git a/doc/user/gitlab_com/index.md b/doc/user/gitlab_com/index.md
index 23765de8f46..e0cc79fe0fb 100644
--- a/doc/user/gitlab_com/index.md
+++ b/doc/user/gitlab_com/index.md
@@ -139,7 +139,7 @@ the related documentation.
| [Max pipelines per schedule](../../administration/instance_limits.md#limit-the-number-of-pipelines-created-by-a-pipeline-schedule-per-day) | `24` for Free tier, `288` for all paid tiers | Unlimited |
| [Scheduled Job Archival](../../user/admin_area/settings/continuous_integration.md#archive-jobs) | 3 months | Never |
| Max test cases per [unit test report](../../ci/unit_test_reports.md) | `500_000` | Unlimited |
-| [Max registered runners](../../administration/instance_limits.md#number-of-registered-runners-per-scope) | `50` per-project and per-group for Free tier,<br/>`1_000` per-group for all paid tiers / `1_000` per-project for all paid tiers | `1_000` per-group / `1_000` per-project |
+| [Max registered runners](../../administration/instance_limits.md#number-of-registered-runners-per-scope) | Free tier: `50` per-group / `50` per-project <br/> All paid tiers: `1_000` per-group / `1_000` per-project | `1_000` per-group / `1_000` per-project |
## Account and limit settings
@@ -270,7 +270,7 @@ for `shared_buffers` is quite high, and we are
## Puma
-GitLab.com uses the default of 60 seconds for [Puma request timeouts](https://docs.gitlab.com/omnibus/settings/puma.html#worker-timeout).
+GitLab.com uses the default of 60 seconds for [Puma request timeouts](../../administration/operations/puma.md#worker-timeout).
## GitLab.com-specific rate limits
diff --git a/doc/user/group/clusters/index.md b/doc/user/group/clusters/index.md
index 0d885183a41..25eff076d8d 100644
--- a/doc/user/group/clusters/index.md
+++ b/doc/user/group/clusters/index.md
@@ -14,8 +14,10 @@ Similar to [project-level](../../project/clusters/index.md) and
group-level Kubernetes clusters allow you to connect a Kubernetes cluster to
your group, enabling you to use the same cluster across multiple projects.
-To view your group level Kubernetes clusters, navigate to your project and select
-**Kubernetes** from the left-hand menu.
+To view your group-level Kubernetes clusters:
+
+1. On the top bar, select **Menu > Groups** and find your group.
+1. On the left sidebar, select **Kubernetes**.
## Cluster management project
@@ -58,7 +60,7 @@ differentiate the new cluster from your other clusters.
You can choose to allow GitLab to manage your cluster for you. If GitLab manages
your cluster, resources for your projects are automatically created. See the
-[Access controls](../../project/clusters/add_remove_clusters.md#access-controls)
+[Access controls](../../project/clusters/cluster_access.md)
section for details on which resources GitLab creates for you.
For clusters not managed by GitLab, project-specific resources aren't created
@@ -82,10 +84,11 @@ your cluster, which can cause deployment jobs to fail.
To clear the cache:
-1. Navigate to your group's **Kubernetes** page,
- and select your cluster.
-1. Expand the **Advanced settings** section.
-1. Click **Clear cluster cache**.
+1. On the top bar, select **Menu > Groups** and find your group.
+1. On the left sidebar, select **Kubernetes**.
+1. Select your cluster.
+1. Expand **Advanced settings**.
+1. Select **Clear cluster cache**.
## Base domain
@@ -169,7 +172,7 @@ documentation for project-level clusters.
## More information
For information on integrating GitLab and Kubernetes, see
-[Kubernetes clusters](../../project/clusters/index.md).
+[Kubernetes clusters](../../infrastructure/clusters/index.md).
<!-- ## Troubleshooting
diff --git a/doc/user/group/contribution_analytics/index.md b/doc/user/group/contribution_analytics/index.md
index a2d7f358cd9..b13dd3f63cb 100644
--- a/doc/user/group/contribution_analytics/index.md
+++ b/doc/user/group/contribution_analytics/index.md
@@ -11,15 +11,18 @@ info: To determine the technical writer assigned to the Stage/Group associated w
With Contribution Analytics you can get an overview of the [contribution actions](../../../api/events.md#action-types) in your
group.
-To view the Contribution Analytics, go to your group and select **Analytics > Contribution**.
-
-## Use cases
-
- Analyze your team's contributions over a period of time, and offer a bonus for the top
contributors.
- Identify opportunities for improvement with group members who may benefit from additional
support.
+## View Contribution Analytics
+
+To view Contribution Analytics:
+
+1. On the top bar, select **Menu > Groups** and find your group.
+1. On the left sidebar, select **Analytics > Contribution**.
+
## Using Contribution Analytics
There are three main bar graphs that illustrate the number of contributions per group
diff --git a/doc/user/group/custom_project_templates.md b/doc/user/group/custom_project_templates.md
index 41046477b90..a9c56139b4d 100644
--- a/doc/user/group/custom_project_templates.md
+++ b/doc/user/group/custom_project_templates.md
@@ -17,6 +17,12 @@ in the group and select the **Group** tab.
Every project in the subgroup, but not nested subgroups, can be selected by members
of the group when a new project is created.
+- Public projects can be selected by any signed-in user as a template for a new project,
+ if all enabled [project features](../project/settings/index.md#sharing-and-permissions)
+ except for **GitLab Pages** and **Security & Compliance** are set to **Everyone With Access**.
+ The same applies to internal projects.
+- Private projects can be selected only by users who are members of the projects.
+
Repository and database information that is copied over to each new project is identical to the
data exported with the [GitLab Project Import/Export](../project/settings/import_export.md).
diff --git a/doc/user/group/devops_adoption/index.md b/doc/user/group/devops_adoption/index.md
index 554d01039ad..e3b858aff7d 100644
--- a/doc/user/group/devops_adoption/index.md
+++ b/doc/user/group/devops_adoption/index.md
@@ -14,6 +14,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
> - Dependency Scanning metrics [added](https://gitlab.com/gitlab-org/gitlab/-/issues/328034) in GitLab 14.2.
> - Multiselect [added](https://gitlab.com/gitlab-org/gitlab/-/issues/333586) in GitLab 14.2.
> - Overview table [added](https://gitlab.com/gitlab-org/gitlab/-/issues/335638) in GitLab 14.3.
+> - Adoption over time chart [added](https://gitlab.com/gitlab-org/gitlab/-/issues/337561) in GitLab 14.4.
Prerequisites:
@@ -69,6 +70,13 @@ Each group appears as a separate row in the table.
For each row, a feature is considered "adopted" if it has been used in a project in the given group
during the time period (including projects in any subgroups of the given group).
+## Adoption over time
+
+The **Adoption over time** chart in the **Overview** tab displays DevOps Adoption over time. The chart displays the total number of adopted features from the previous twelve months,
+from when you enabled DevOps Adoption for the group.
+
+The tooltip displays information about the features tracked for individual months.
+
## When is a feature considered adopted
A feature is considered "adopted" if it has been used anywhere in the group in the specified time.
diff --git a/doc/user/group/epics/img/epic_view_roadmap_v12_9.png b/doc/user/group/epics/img/epic_view_roadmap_v12_9.png
index e8224ced7e9..3a33a6c4cf8 100644
--- a/doc/user/group/epics/img/epic_view_roadmap_v12_9.png
+++ b/doc/user/group/epics/img/epic_view_roadmap_v12_9.png
Binary files differ
diff --git a/doc/user/group/import/img/import_panel_v14_1.png b/doc/user/group/import/img/import_panel_v14_1.png
index 28417383b6c..52791a82c3c 100644
--- a/doc/user/group/import/img/import_panel_v14_1.png
+++ b/doc/user/group/import/img/import_panel_v14_1.png
Binary files differ
diff --git a/doc/user/group/import/img/new_group_navigation_v13_8.png b/doc/user/group/import/img/new_group_navigation_v13_8.png
index 307175727c7..40be3dd41d2 100644
--- a/doc/user/group/import/img/new_group_navigation_v13_8.png
+++ b/doc/user/group/import/img/new_group_navigation_v13_8.png
Binary files differ
diff --git a/doc/user/group/import/index.md b/doc/user/group/import/index.md
index 31c3a8e774e..1f5de36303e 100644
--- a/doc/user/group/import/index.md
+++ b/doc/user/group/import/index.md
@@ -5,7 +5,7 @@ group: Import
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Import groups from another instance of GitLab **(FREE)**
+# Migrate groups from another instance of GitLab **(FREE)**
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/249160) in GitLab 13.7.
> - [Deployed behind a feature flag](../../feature_flags.md), disabled by default.
@@ -102,8 +102,10 @@ This might involve reconfiguring your firewall to prevent blocking connection on
### Connect to the remote GitLab instance
-1. Navigate to the New Group page, either via the `+` button in the top navigation bar, or the **New subgroup** button
-on an existing group's page.
+1. Go to the New Group page:
+
+ - On the top bar, select `+` and then **New group**.
+ - Or, on an existing group's page, in the top right, select **New subgroup**.
![Navigation paths to create a new group](img/new_group_navigation_v13_8.png)
@@ -111,21 +113,20 @@ on an existing group's page.
![Fill in import details](img/import_panel_v14_1.png)
-1. Fill in source URL of your GitLab.
-1. Fill in [personal access token](../../../user/profile/personal_access_tokens.md) for remote GitLab instance.
-1. Click "Connect instance".
+1. Enter the source URL of your GitLab instance.
+1. Generate or copy a [personal access token](../../../user/profile/personal_access_tokens.md)
+ with the `api` and `read_repository` scopes on your remote GitLab instance.
+1. Enter the [personal access token](../../../user/profile/personal_access_tokens.md) for your remote GitLab instance.
+1. Select **Connect instance**.
### Selecting which groups to import
After you have authorized access to the GitLab instance, you are redirected to the GitLab Group
-Migration importer page. Listed are the remote GitLab groups to which you have the Owner role.
+Migration importer page. The remote groups you have the Owner role for are listed.
1. By default, the proposed group namespaces match the names as they exist in remote instance, but based on your permissions, you can choose to edit these names before you proceed to import any of them.
-
-1. Select the **Import** button next to any number of groups.
-
-1. The **Status** column shows the import status of each group. You can choose to leave the page open and it updates in real-time.
-
-1. Once a group has been imported, click its GitLab path to open its GitLab URL.
+1. Next to the groups you want to import, select **Import**.
+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)
diff --git a/doc/user/group/index.md b/doc/user/group/index.md
index caf874cfe28..15d2da50012 100644
--- a/doc/user/group/index.md
+++ b/doc/user/group/index.md
@@ -571,10 +571,11 @@ To restrict group access by IP address:
## Restrict group access by domain **(PREMIUM)**
->- [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/7297) in [GitLab Premium](https://about.gitlab.com/pricing/) 12.2.
->- Support for specifying multiple email domains [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/33143) added in GitLab 13.1.
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/7297) in [GitLab Premium](https://about.gitlab.com/pricing/) 12.2.
+> - Support for specifying multiple email domains [added](https://gitlab.com/gitlab-org/gitlab/-/issues/33143) in GitLab 13.1.
+> - Support for restricting access to projects within the group [added](https://gitlab.com/gitlab-org/gitlab/-/issues/14004) in GitLab 14.1.2.
-You can prevent users with email addresses in specific domains from being added to a group.
+You can prevent users with email addresses in specific domains from being added to a group and its projects.
To restrict group access by domain:
@@ -593,9 +594,6 @@ Some domains cannot be restricted. These are the most popular public email domai
- `hotmail.com`, `hotmail.co.uk`, `hotmail.fr`
- `msn.com`, `live.com`, `outlook.com`
-NOTE:
-Domain restrictions apply to groups only. They do not prevent users from being added as members of projects owned by the restricted group.
-
## Group file templates **(PREMIUM)**
Use group file templates to share a set of templates for common file
@@ -732,6 +730,27 @@ The group's new subgroups have push rules set for them based on either:
- The closest parent group with push rules defined.
- Push rules set at the instance level, if no parent groups have push rules defined.
+## Group approval rules **(PREMIUM)**
+
+> Introduced in GitLab 13.9. [Deployed behind the `group_merge_request_approval_settings_feature_flag` flag](../../administration/feature_flags.md), disabled by default.
+
+FLAG:
+On self-managed GitLab, by default this feature is not available. To make it available,
+per group, ask an administrator to [enable the `group_merge_request_approval_settings_feature_flag` flag](../../administration/feature_flags.md).
+The feature is not ready for production use.
+
+Group approval rules are an in-development feature that provides an interface for managing
+[project merge request approval rules](../project/merge_requests/approvals/index.md) at the
+top-level group level. When rules are configured [at the instance level](../admin_area/merge_requests_approvals.md),
+you can't edit locked rules.
+
+To view the merge request approval rules UI for a group:
+
+1. Go to the top-level group's **Settings > General** page.
+1. Expand the **Merge request approvals** section.
+1. Select the settings you want.
+1. Select **Save changes**.
+
## Related topics
- [Group wikis](../project/wiki/index.md)
@@ -769,3 +788,22 @@ If a user sees a 404 when they would normally expect access, and the problem is
In viewing the log entries, compare the `remote.ip` with the list of
[allowed IPs](#restrict-group-access-by-ip-address) for the group.
+
+### Validation errors on namespaces and groups
+
+[GitLab 14.4 and later](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/70365) performs
+the following checks when creating or updating namespaces or groups:
+
+- Namespaces must not have parents.
+- Group parents must be groups and not namespaces.
+
+You can disable the validation if GitLab shows the following errors:
+
+- `A user namespace cannot have a parent`.
+- `A group cannot have a user namespace as its parent`.
+
+To disable the validation,
+[disable the `validate_namespace_parent_type` flag](../../administration/feature_flags.md).
+
+In the unlikely event that you had to disable this feature flag to prevent errors,
+[contact Support](https://about.gitlab.com/support/) so that we can improve this validation.
diff --git a/doc/user/group/insights/img/insights_group_configuration.png b/doc/user/group/insights/img/insights_group_configuration.png
deleted file mode 100644
index d181a1e94c3..00000000000
--- a/doc/user/group/insights/img/insights_group_configuration.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/group/insights/index.md b/doc/user/group/insights/index.md
index 18177d656ab..9f841691eb8 100644
--- a/doc/user/group/insights/index.md
+++ b/doc/user/group/insights/index.md
@@ -9,34 +9,35 @@ info: To determine the technical writer assigned to the Stage/Group associated w
> [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/725) in [GitLab Ultimate](https://about.gitlab.com/pricing/) 12.0.
-Configure the Insights that matter for your groups to explore data such as
-triage hygiene, issues created/closed per a given period, average time for merge
-requests to be merged and much more.
+Configure the Insights that matter for your groups. Explore data such as
+triage hygiene, issues created or closed for a given period, average time for merge
+requests to be merged, and much more.
![Insights example stacked bar chart](img/insights_example_stacked_bar_chart_v13_11.png)
## View your group's Insights
-You can access your group's Insights by clicking the **Analytics > Insights**
-link in the left sidebar.
+To access your group's Insights:
-## Configure your Insights
-
-Navigate to your group's **Settings > General**, expand **Insights**, and choose
-the project that holds your `.gitlab/insights.yml` configuration file:
+1. On the top bar, select **Menu > Groups** and find your group.
+1. On the left sidebar, select **Analytics > Insights**.
-![group insights configuration](img/insights_group_configuration.png)
+## Configure your Insights
-If no configuration was set, a [default configuration file](
-https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/fixtures/insights/default.yml)
-will be used.
+GitLab reads Insights from the [default configuration file](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/fixtures/insights/default.yml).
+If you want to customize it:
-See the [Project's Insights documentation](../../project/insights/index.md) for
-more details about the `.gitlab/insights.yml` configuration file.
+1. Create a new file [`.gitlab/insights.yml`](../../project/insights/index.md)
+in a project that belongs to your group.
+1. On the top bar, select **Menu > Groups** and find your group.
+1. On the left sidebar, select **Settings > General**.
+1. Expand **Insights**.
+1. Select the project that contains your `.gitlab/insights.yml` configuration file.
+1. Select **Save changes**.
## Permissions
-If you have access to view a group, then you have access to view their Insights.
+If you have access to view a group, then you have access to view its Insights.
NOTE:
Issues or merge requests that you don't have access to (because you don't have
diff --git a/doc/user/group/repositories_analytics/index.md b/doc/user/group/repositories_analytics/index.md
index 685c4601ac4..c6cd763355b 100644
--- a/doc/user/group/repositories_analytics/index.md
+++ b/doc/user/group/repositories_analytics/index.md
@@ -7,16 +7,13 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# Repositories Analytics **(PREMIUM)**
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/215104) in [GitLab Premium](https://about.gitlab.com/pricing/) 13.4.
-
-WARNING:
-This feature might not be available to you. Check the **version history** note above for details.
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/215104) in GitLab 13.4.
![Group repositories analytics](../img/group_code_coverage_analytics_v13_9.png)
## Current group code coverage
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/263478) in [GitLab Premium](https://about.gitlab.com/pricing/) 13.7.
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/263478) in GitLab 13.7.
The **Analytics > Repositories** group page displays the overall test coverage of all your projects in your group.
In the **Overall activity** section, you can see:
@@ -27,46 +24,47 @@ In the **Overall activity** section, you can see:
## Average group test coverage from the last 30 days
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/215140) in [GitLab Premium](https://about.gitlab.com/pricing/) 13.9.
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/215140) in GitLab 13.9.
The **Analytics > Repositories** group page displays the average test coverage of all your projects in your group in a graph for the last 30 days.
## Latest project test coverage list
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/267624) in [GitLab Premium](https://about.gitlab.com/pricing/) 13.6.
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/267624) in GitLab 13.6.
To see the latest code coverage for each project in your group:
-1. Go to **Analytics > Repositories** in the group (not from a project).
-1. In the **Latest test coverage results** section, use the **Select projects** dropdown to choose the projects you want to check.
+1. On the top bar, select **Menu > Groups** and find your group.
+1. On the left sidebar, select **Analytics > Repositories**.
+1. In the **Latest test coverage results** section, from the **Select projects** dropdown list, choose the projects you want to check.
You can download code coverage data for specific projects using
[code coverage history](../../../ci/pipelines/settings.md#view-code-coverage-history).
## Download historic test coverage data
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/215104) in [GitLab Premium](https://about.gitlab.com/pricing/) 13.4.
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/215104) in GitLab 13.4.
You can get a CSV of the code coverage data for all of the projects in your group. This report has a maximum of 1000 records. The code coverage data is from the default branch in each project.
To get the report:
-1. Go to your group's **Analytics > Repositories** page
-1. Click **Download historic test coverage data (`.csv`)**,
-1. In the popup, select the projects you want to include in the report.
-1. Select the date range for the report from the preset options.
-1. Click **Download test coverage data (`.csv`)**.
+1. On the top bar, select **Menu > Groups** and find your group.
+1. On the left sidebar, select **Analytics > Repositories**.
+1. Select **Download historic test coverage data (.csv)**.
+1. Select the projects and date range you want to include in the report.
+1. Select **Download test coverage data (.csv)**.
The projects dropdown shows up to 100 projects from your group. If the project you want to check is not in the dropdown list, you can select **All projects** to download the report for all projects in your group, including any projects that are not listed. There is a plan to improve this behavior in this [related issue](https://gitlab.com/gitlab-org/gitlab/-/issues/250684).
-For each day that a coverage report was generated by a job in a project's pipeline, there will be a row in the CSV which includes:
+For each day that a coverage report was generated by a job in a project's pipeline, a row in the CSV includes:
-- The date when the coverage job ran
+- The date the coverage job ran
- The name of the job that generated the coverage report
- The name of the project
- The coverage value
-If the project's code coverage was calculated more than once in a day, we will take the last value from that day.
+If the project's code coverage was calculated more than once in a day, the last value from that day is used.
NOTE:
[In GitLab 13.7 and later](https://gitlab.com/gitlab-org/gitlab/-/issues/270102), group code coverage
diff --git a/doc/user/group/roadmap/img/roadmap_view_v14_3.png b/doc/user/group/roadmap/img/roadmap_view_v14_3.png
index ca4b87b9fdd..ea5e870680e 100644
--- a/doc/user/group/roadmap/img/roadmap_view_v14_3.png
+++ b/doc/user/group/roadmap/img/roadmap_view_v14_3.png
Binary files differ
diff --git a/doc/user/group/saml_sso/index.md b/doc/user/group/saml_sso/index.md
index 8f6b3e7244a..1c894550a14 100644
--- a/doc/user/group/saml_sso/index.md
+++ b/doc/user/group/saml_sso/index.md
@@ -9,7 +9,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
> Introduced in GitLab 11.0.
-This page describes SAML for Groups. For instance-wide SAML on self-managed GitLab instances, see [SAML OmniAuth Provider](../../../integration/saml.md).
+This page describes SAML for groups. For instance-wide SAML on self-managed GitLab instances, see [SAML OmniAuth Provider](../../../integration/saml.md).
[View the differences between SaaS and Self-Managed Authentication and Authorization Options](../../../administration/auth/index.md#saas-vs-self-managed-comparison).
SAML on GitLab.com allows users to sign in through their SAML identity provider. If the user is not already a member, the sign-in process automatically adds the user to the appropriate group.
@@ -23,7 +23,8 @@ If required, you can find [a glossary of common terms](../../../integration/saml
## Configuring your identity provider
-1. Navigate to the GitLab group and select **Settings > SAML SSO**.
+1. On the top bar, select **Menu > Groups** and find your group.
+1. On the left sidebar, select **Settings > SAML SSO**.
1. Configure your SAML identity provider using the **Assertion consumer service URL**, **Identifier**, and **GitLab single sign-on URL**.
Alternatively GitLab provides [metadata XML configuration](#metadata-configuration).
See [specific identity provider documentation](#providers) for more details.
@@ -42,7 +43,7 @@ GitLab.com uses the SAML NameID to identify users. The NameID element:
- Is a required field in the SAML response.
- Must be unique to each user.
-- Must be a persistent value that will never change, such as a randomly generated unique user ID.
+- Must be a persistent value that never changes, such as a randomly generated unique user ID.
- Is case sensitive. The NameID must match exactly on subsequent login attempts, so should not rely on user input that could change between upper and lower case.
- Should not be an email address or username. We strongly recommend against these as it's hard to
guarantee it doesn't ever change, for example, when a person's name changes. Email addresses are
@@ -66,15 +67,15 @@ the user details need to be passed to GitLab as SAML assertions.
At a minimum, the user's email address *must* be specified as an assertion named `email` or `mail`.
See [the assertions list](../../../integration/saml.md#assertions) for other available claims.
-
-NOTE:
-The `username` assertion is not supported for GitLab.com SaaS integrations.
+In addition to the attributes in the linked assertions list, GitLab.com supports `username`
+and `nickname` attributes.
### Metadata configuration
GitLab provides metadata XML that can be used to configure your identity provider.
-1. Navigate to the group and select **Settings > SAML SSO**.
+1. On the top bar, select **Menu > Groups** and find your group.
+1. On the left sidebar, select **Settings > SAML SSO**.
1. Copy the provided **GitLab metadata URL**.
1. Follow your identity provider's documentation and paste the metadata URL when it's requested.
@@ -82,7 +83,8 @@ GitLab provides metadata XML that can be used to configure your identity provide
After you set up your identity provider to work with GitLab, you must configure GitLab to use it for authentication:
-1. Navigate to the group's **Settings > SAML SSO**.
+1. On the top bar, select **Menu > Groups** and find your group.
+1. On the left sidebar, select **Settings > SAML SSO**.
1. Find the SSO URL from your identity provider and enter it the **Identity provider single sign-on URL** field.
1. Find and enter the fingerprint for the SAML token signing certificate in the **Certificate** field.
1. Select the access level to be applied to newly added users in the **Default membership role** field. The default access level is 'Guest'.
@@ -110,7 +112,7 @@ However, users are not prompted to sign in through SSO on each visit. GitLab che
has authenticated through SSO. If it's been more than 1 day since the last sign-in, GitLab
prompts the user to sign in again through SSO.
-We intend to add a similar SSO requirement for [API activity](https://gitlab.com/gitlab-org/gitlab/-/issues/9152).
+We intend to add a similar SSO requirement for [API activity](https://gitlab.com/gitlab-org/gitlab/-/issues/297389).
SSO has the following effects when enabled:
@@ -131,7 +133,7 @@ When SCIM updates, the user's access is immediately revoked.
## Providers
-The SAML standard means that a wide range of identity providers will work with GitLab. Your identity provider may have relevant documentation. It may be generic SAML documentation, or specifically targeted for GitLab.
+The SAML standard means that you can use a wide range of identity providers with GitLab. Your identity provider might have relevant documentation. It can be generic SAML documentation or specifically targeted for GitLab.
When [configuring your identity provider](#configuring-your-identity-provider), please consider the notes below for specific providers to help avoid common issues and as a guide for terminology used.
@@ -224,7 +226,7 @@ When a user tries to sign in with Group SSO, GitLab attempts to find or create a
To link SAML to your existing GitLab.com account:
-1. Sign in to your GitLab.com account.
+1. Sign in to your GitLab.com account. [Reset your password](https://gitlab.com/users/password/new) if necessary.
1. Locate and visit the **GitLab single sign-on URL** for the group you're signing in to. A group owner can find this on the group's **Settings > SAML SSO** page. If the sign-in URL is configured, users can connect to the GitLab app from the identity provider.
1. Select **Authorize**.
1. Enter your credentials on the identity provider if prompted.
@@ -265,6 +267,9 @@ convert the information to XML. An example SAML response is shown here.
<saml2:Attribute Name="email" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:basic">
<saml2:AttributeValue xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xs:string">user.email</saml2:AttributeValue>
</saml2:Attribute>
+ <saml2:Attribute Name="username" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:basic">
+ <saml2:AttributeValue xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xs:string">user.nickName</saml2:AttributeValue>
+ </saml2:Attribute>
<saml2:Attribute Name="first_name" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:unspecified">
<saml2:AttributeValue xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xs:string">user.firstName</saml2:AttributeValue>
</saml2:Attribute>
@@ -309,7 +314,7 @@ group owner, and then you can unlink the account.
For example, to unlink the `MyOrg` account:
-1. In the top-right corner, select your avatar.
+1. On the top bar, in the top right corner, select your avatar.
1. Select **Edit profile**.
1. On the left sidebar, select **Account**.
1. In the **Social sign-in** section, select **Disconnect** next to the connected account.
@@ -346,8 +351,8 @@ a SAML identity provider group name to a GitLab Access Level. This can be done f
To link the SAML groups from the `saml:AttributeStatement` example above:
-1. Enter the value of `saml:AttributeValue` in the `SAML Group Name` field.
-1. Choose the desired `Access Level`.
+1. In the **SAML Group Name** box, enter the value of `saml:AttributeValue`.
+1. Choose the desired **Access Level**.
1. **Save** the group link.
1. Repeat to add additional group links if desired.
@@ -356,7 +361,14 @@ To link the SAML groups from the `saml:AttributeStatement` example above:
If a user is a member of multiple SAML groups mapped to the same GitLab group,
the user gets the highest access level from the groups. For example, if one group
is linked as `Guest` and another `Maintainer`, a user in both groups gets `Maintainer`
-access.
+access.
+
+Users granted:
+
+- A higher role with Group Sync are displayed as having
+ [direct membership](../../project/members/#display-direct-members) of the group.
+- A lower or the same role with Group Sync are displayed as having
+ [inherited membership](../../project/members/#display-inherited-members) of the group.
### Automatic member removal
@@ -480,7 +492,7 @@ If you receive a `404` during setup when using "verify configuration", make sure
[SHA-1 generated fingerprint](../../../integration/saml.md#notes-on-configuring-your-identity-provider).
If a user is trying to sign in for the first time and the GitLab single sign-on URL has not [been configured](#configuring-your-identity-provider), they may see a 404.
-As outlined in the [user access section](#linking-saml-to-your-existing-gitlabcom-account), a group Owner will need to provide the URL to users.
+As outlined in the [user access section](#linking-saml-to-your-existing-gitlabcom-account), a group Owner needs to provide the URL to users.
### Message: "SAML authentication failed: Extern UID has already been taken"
@@ -502,13 +514,13 @@ Here are possible causes and solutions:
| Cause | Solution |
| ---------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------ |
-| When a user account with the email address already exists in GitLab, but the user does not have the SAML identity tied to their account. | The user will need to [link their account](#user-access-and-management). |
+| When a user account with the email address already exists in GitLab, but the user does not have the SAML identity tied to their account. | The user needs to [link their account](#user-access-and-management). |
### Message: "SAML authentication failed: Extern UID has already been taken, User has already been taken"
Getting both of these errors at the same time suggests the NameID capitalization provided by the identity provider didn't exactly match the previous value for that user.
-This can be prevented by configuring the [NameID](#nameid) to return a consistent value. Fixing this for an individual user involves [unlinking SAML in the GitLab account](#unlinking-accounts), although this will cause group membership and to-dos to be lost.
+This can be prevented by configuring the [NameID](#nameid) to return a consistent value. Fixing this for an individual user involves [unlinking SAML in the GitLab account](#unlinking-accounts), although this causes group membership and to-do items to be lost.
### Message: "Request to link SAML account must be authorized"
@@ -541,7 +553,7 @@ Otherwise, to change the SAML app used for sign in, users need to [unlink the cu
Many SAML terms can vary between providers. It is possible that the information you are looking for is listed under another name.
-For more information, start with your identity provider's documentation. Look for their options and examples to see how they configure SAML. This can provide hints on what you'll need to configure GitLab to work with these providers.
+For more information, start with your identity provider's documentation. Look for their options and examples to see how they configure SAML. This can provide hints on what you need to configure GitLab to work with these providers.
It can also help to look at our [more detailed docs for self-managed GitLab](../../../integration/saml.md).
SAML configuration for GitLab.com is mostly the same as for self-managed instances.
diff --git a/doc/user/group/settings/img/import_panel_v14_1.png b/doc/user/group/settings/img/import_panel_v14_1.png
deleted file mode 100644
index 28417383b6c..00000000000
--- a/doc/user/group/settings/img/import_panel_v14_1.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/group/settings/img/new_group_navigation_v13_1.png b/doc/user/group/settings/img/new_group_navigation_v13_1.png
deleted file mode 100644
index 307175727c7..00000000000
--- a/doc/user/group/settings/img/new_group_navigation_v13_1.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/group/settings/import_export.md b/doc/user/group/settings/import_export.md
index 516f3504a98..3f9d94f044e 100644
--- a/doc/user/group/settings/import_export.md
+++ b/doc/user/group/settings/import_export.md
@@ -4,6 +4,7 @@ stage: Manage
group: Import
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
+
# Group import/export **(FREE)**
> [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/2888) in GitLab 13.0 as an experimental feature. May change in future releases.
@@ -23,9 +24,9 @@ Users with the [Owner role](../../permissions.md) for a group can enable
import and export for that group:
1. On the top bar, select **Menu > Admin**.
-1. On the left sidebar, select **Settings > General > Visibility and access controls**.
-1. Scroll to **Import sources**.
-1. Enable the desired **Import sources**.
+1. On the left sidebar, select **Settings > General**.
+1. Expand **Visibility and access controls**.
+1. In the **Import sources** section, select the checkboxes for the sources you want.
## Important Notes
@@ -65,19 +66,23 @@ For more details on the specific data persisted in a group export, see the
## Export a group
+WARNING:
+This feature will be [deprecated](https://gitlab.com/groups/gitlab-org/-/epics/4619)
+in GitLab 14.6 and replaced by [GitLab Migration](../import/).
+
Users with the [Owner role](../../permissions.md) for a group can export the
contents of that group:
-1. On the top bar, select **Menu >** **Groups** and find your group.
-1. On the left sidebar, select **Settings**.
-1. Scroll to the **Advanced** section, and select **Export Group**.
+1. On the top bar, select **Menu > Groups** and find your group.
+1. On the left sidebar, select **Settings > General**.
+1. In the **Advanced** section, select **Export Group**.
1. After the export is generated, you should receive an email with a link to the [exported contents](#exported-contents)
in a compressed tar archive, with contents in NDJSON format.
1. Alternatively, you can download the export from the UI:
1. Return to your group's **Settings > General** page.
- 1. Scroll to the **Advanced** section, and select **Download export**.
- You can also generate a new file by clicking **Regenerate export**.
+ 1. In the **Advanced** section, select **Download export**.
+ You can also generate a new file by selecting **Regenerate export**.
NOTE:
The maximum import file size can be set by the Administrator, default is `0` (unlimited).
@@ -91,24 +96,18 @@ The Enterprise Edition retains some group data that isn't part of the Community
## Importing the group
-1. Navigate to the New Group page, either via the `+` button in the top navigation bar, or the **New subgroup** button
-on an existing group's page.
-
- ![Navigation paths to create a new group](img/new_group_navigation_v13_1.png)
-
-1. On the New Group page, select the **Import group**.
-
- ![Fill in group details](img/import_panel_v14_1.png)
+1. Create a new group:
+ - On the top bar, select **New** (**{plus}**) and then **New group**.
+ - On an existing group's page, select the **New subgroup** button.
+1. Select **Import group**.
1. Enter your group name.
-
1. Accept or modify the associated group URL.
-
-1. Click **Choose file**
-
+1. Select **Choose file**.
1. Select the file that you exported in the [Export a group](#export-a-group) section.
+1. To begin importing, select **Import group**.
-1. Click **Import group** to begin importing. Your newly imported group page appears after the operation completes.
+Your newly imported group page appears after the operation completes.
## Version history
diff --git a/doc/user/group/subgroups/img/create_new_group.png b/doc/user/group/subgroups/img/create_new_group.png
deleted file mode 100644
index 9d011ec709a..00000000000
--- a/doc/user/group/subgroups/img/create_new_group.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/group/subgroups/img/create_subgroup_button_v13_6.png b/doc/user/group/subgroups/img/create_subgroup_button_v13_6.png
deleted file mode 100644
index 013aee6b0b4..00000000000
--- a/doc/user/group/subgroups/img/create_subgroup_button_v13_6.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/group/subgroups/img/group_members_13_7.png b/doc/user/group/subgroups/img/group_members_13_7.png
deleted file mode 100644
index ab22bcb932c..00000000000
--- a/doc/user/group/subgroups/img/group_members_13_7.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/group/subgroups/img/group_members_v14_4.png b/doc/user/group/subgroups/img/group_members_v14_4.png
new file mode 100644
index 00000000000..695564a8b74
--- /dev/null
+++ b/doc/user/group/subgroups/img/group_members_v14_4.png
Binary files differ
diff --git a/doc/user/group/subgroups/index.md b/doc/user/group/subgroups/index.md
index aaff0574ef0..49032d0a2ef 100644
--- a/doc/user/group/subgroups/index.md
+++ b/doc/user/group/subgroups/index.md
@@ -73,51 +73,41 @@ subgroups, the behavior is the same as when performing these actions at the
## Creating a subgroup
+Users can create subgroups if they are explicitly added as an Owner (or
+Maintainer, if that setting is enabled) to an immediate parent group, even if group
+creation is disabled by an administrator in their settings.
+
+To create a subgroup:
+
+1. On the top bar, select **Menu > Groups** and find the parent group.
+1. In the top right, select **New subgroup**.
+1. Select **Create group**.
+1. Fill in the fields. View a list of [reserved names](../../reserved_names.md)
+ that cannot be used as group names.
+1. Select **Create group**.
+
+### Change who can create subgroups
+
To create a subgroup you must either be an Owner or a Maintainer of the
group, depending on the group's setting.
-By default, groups created in:
+By default:
-- GitLab 12.2 or later allow both Owners and Maintainers to create subgroups.
-- GitLab 12.1 or earlier only allow Owners to create subgroups.
+- In GitLab 12.2 or later, both Owners and Maintainers can create subgroups.
+- In GitLab 12.1 or earlier, only Owners can create subgroups.
-The setting can be changed for any group by:
+You can change this setting:
-- A group owner:
+- As group owner:
1. Select the group.
1. On the left sidebar, select **Settings > General**.
- 1. Expand the **Permissions, LFS, 2FA** section.
-- An administrator:
+ 1. Expand **Permissions, LFS, 2FA**.
+- As an administrator:
1. On the top bar, select **Menu > Admin**.
1. On the left sidebar, select **Overview > Groups**.
1. Select the group, and select **Edit**.
-For:
-
-- More information, check the [permissions table](../../permissions.md#group-members-permissions).
-- A list of words that are not allowed to be used as group names, see the
- [reserved names](../../reserved_names.md).
-
-Users can always create subgroups if they are explicitly added as an Owner (or
-Maintainer, if that setting is enabled) to an immediate parent group, even if group
-creation is disabled by an administrator in their settings.
-
-To create a subgroup:
-
-1. In the group's dashboard click the **New subgroup** button.
-
- ![Subgroups page](img/create_subgroup_button_v13_6.png)
-
-1. Create a new group like you would normally do. Notice that the immediate parent group
- namespace is fixed under **Group path**. The visibility level can differ from
- the immediate parent group.
-
- ![Subgroups page](img/create_new_group.png)
-
-1. Click the **Create group** button to be redirected to the new group's
- dashboard page.
-
-Follow the same process to create any subsequent groups.
+For more information, view the [permissions table](../../permissions.md#group-members-permissions).
## Membership
@@ -136,7 +126,7 @@ the **Members** page of the group the member was added.
You can tell if a member has inherited the permissions from a parent group by
looking at the group's **Members** page.
-![Group members page](img/group_members_13_7.png)
+![Group members page](img/group_members_v14_4.png)
From the image above, we can deduce the following things:
diff --git a/doc/user/group/value_stream_analytics/index.md b/doc/user/group/value_stream_analytics/index.md
index 68ae5e0df2d..5c8393f30ab 100644
--- a/doc/user/group/value_stream_analytics/index.md
+++ b/doc/user/group/value_stream_analytics/index.md
@@ -284,9 +284,9 @@ To sort the stage table by a table column, select the table header.
You can sort in ascending or descending order. To find items that spent the most time in a stage,
potentially causing bottlenecks in your value stream, sort the table by the **Time** column.
From there, select individual items to drill in and investigate how delays are happening.
-To see which items the stage most recently, sort by the work item column on the left.
+To see which items most recently exited the stage, sort by the work item column on the left.
-The table displays up to 20 items at a time. If there are more than 20 items, you can use the
+The table displays 20 items per page. If there are more than 20 items, you can use the
**Prev** and **Next** buttons to navigate through the pages.
### Creating a value stream
@@ -302,11 +302,12 @@ best practices. You can customize this flow by adding, hiding or re-ordering sta
To create a value stream:
-1. Navigate to your group's **Analytics > Value Stream**.
-1. Click the Value stream dropdown and select **Create new Value Stream**
-1. Fill in a name for the new Value Stream
- - You can [customize the stages](#creating-a-value-stream-with-stages)
-1. Click the **Create Value Stream** button.
+1. On the top bar, select **Menu > Groups** and find your group.
+1. On the left sidebar, select **Analytics > Value Stream**.
+1. In the top right, select the dropdown list and then **Create new Value Stream**.
+1. Enter a name for the new Value Stream.
+ - You can [customize the stages](#creating-a-value-stream-with-stages).
+1. Select **Create Value Stream**.
![New value stream](img/new_value_stream_v13_12.png "Creating a new value stream")
@@ -324,18 +325,19 @@ add stages as desired.
To create a value stream with stages:
-1. Go to your group and select **Analytics > Value Stream**.
-1. Select the Value Stream dropdown and select **Create new Value Stream**.
+1. On the top bar, select **Menu > Groups** and find your group.
+1. On the left sidebar, select **Analytics > Value Stream**.
+1. In the top right, select the dropdown list and then **Create new Value Stream**.
1. Select either **Create from default template** or **Create from no template**.
- - Default stages in the value stream can be hidden or re-ordered.
+ - You can hide or re-order default stages in the value stream.
![Default stage actions](img/vsa_default_stage_v13_10.png "Default stage actions")
- - New stages can be added by clicking the 'Add another stage' button.
- - The name, start and end events for the stage can be selected
+ - You can add new stages by selecting **Add another stage**.
+ - You can select the name and start and end events for the stage.
![Custom stage actions](img/vsa_custom_stage_v13_10.png "Custom stage actions")
-1. Select the **Create Value Stream** button to save the value stream.
+1. Select **Create Value Stream**.
#### Label-based stages
@@ -358,8 +360,9 @@ In this example, we'd like to measure times for deployment from a staging enviro
After you create a value stream, you can customize it to suit your purposes. To edit a value stream:
-1. Go to your group and select **Analytics > Value Stream**.
-1. Find and select the relevant value stream from the value stream dropdown.
+1. On the top bar, select **Menu > Groups** and find your group.
+1. On the left sidebar, select **Analytics > Value Stream**.
+1. In the top right, select the dropdown list and then select the relevant value stream.
1. Next to the value stream dropdown, select **Edit**.
The edit form is populated with the value stream details.
1. Optional:
@@ -377,10 +380,11 @@ After you create a value stream, you can customize it to suit your purposes. To
To delete a custom value stream:
-1. Navigate to your group's **Analytics > Value Stream**.
-1. Click the Value stream dropdown and select the value stream you would like to delete.
-1. Click the **Delete (name of value stream)**.
-1. Click the **Delete** button to confirm.
+1. On the top bar, select **Menu > Groups** and find your group.
+1. On the left sidebar, select **Analytics > Value Stream**.
+1. In the top right, select the dropdown list and then select the value stream you would like to delete.
+1. Select **Delete (name of value stream)**.
+1. To confirm, select **Delete**.
![Delete value stream](img/delete_value_stream_v13_12.png "Deleting a custom value stream")
@@ -398,15 +402,6 @@ from the chart itself.
The chart data is limited to the last 500 items.
-### Disabling chart
-
-This chart is enabled by default. If you have a self-managed instance, an
-administrator can open a Rails console and disable it with the following command:
-
-```ruby
-Feature.disable(:cycle_analytics_scatterplot_enabled)
-```
-
## Type of work - Tasks by type chart
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/32421) in [GitLab Premium](https://about.gitlab.com/pricing/) 12.10.
@@ -422,7 +417,7 @@ select up to a total of 15 labels.
## Permissions
-To access Group-level Value Stream Analytics, users must have Reporter access or above.
+To access Group-level Value Stream Analytics, users must have at least the Reporter role.
You can [read more about permissions](../../permissions.md) in general.
diff --git a/doc/user/index.md b/doc/user/index.md
index d6eaad469c1..c9f20af9668 100644
--- a/doc/user/index.md
+++ b/doc/user/index.md
@@ -13,10 +13,10 @@ Welcome to GitLab! We're glad to have you here!
As a GitLab user you have access to all the features
your [subscription](https://about.gitlab.com/pricing/)
includes, except [GitLab administrator](../administration/index.md)
-settings, unless you have admin privileges to install, configure,
+settings, unless you have administrator privileges to install, configure,
and upgrade your GitLab instance.
-Admin privileges for [GitLab.com](https://gitlab.com/) are restricted to the GitLab team.
+Administrator privileges for [GitLab.com](https://gitlab.com/) are restricted to the GitLab team.
For more information on configuring GitLab self-managed instances, see the [Administrator documentation](../administration/index.md).
@@ -63,7 +63,7 @@ With GitLab Enterprise Edition, you can also:
- Use [Burndown Charts](project/milestones/burndown_and_burnup_charts.md) to track progress during a sprint or while working on a new version of their software.
- Leverage [Elasticsearch](../integration/elasticsearch.md) with [Advanced Search](search/advanced_search.md) for faster, more advanced code search across your entire GitLab instance.
- [Authenticate users with Kerberos](../integration/kerberos.md).
-- [Mirror a repository](project/repository/repository_mirroring.md) from elsewhere on your local server.
+- [Mirror a repository](project/repository/mirror/index.md) from elsewhere on your local server.
- View your entire CI/CD pipeline involving more than one project with [Multiple-Project Pipelines](../ci/pipelines/multi_project_pipelines.md).
- [Lock files](project/file_lock.md) to prevent conflicts.
- View the current health and status of each CI environment running on Kubernetes with [deploy boards](project/deploy_boards.md).
@@ -78,7 +78,7 @@ There are several types of users in GitLab:
- Regular users and GitLab.com users. <!-- Note: further description TBA -->
- [Groups](group/index.md) of users.
-- GitLab [admin area](admin_area/index.md) user.
+- GitLab [administrator area](admin_area/index.md) user.
- [GitLab Administrator](../administration/index.md) with full access to
self-managed instances' features and settings.
- [Internal users](../development/internal_users.md).
diff --git a/doc/user/infrastructure/clusters/connect/index.md b/doc/user/infrastructure/clusters/connect/index.md
index ada278292a9..636cb1bb457 100644
--- a/doc/user/infrastructure/clusters/connect/index.md
+++ b/doc/user/infrastructure/clusters/connect/index.md
@@ -63,16 +63,6 @@ You can also use the [certificate-based method](../../../project/clusters/multip
but, for [security implications](#security-implications-for-clusters-connected-with-certificates),
we don't recommend using this method.
-## Cluster levels
-
-Choose your cluster's level according to its purpose:
-
-| Level | Purpose |
-|--|--|
-| [Project level](../../../project/clusters/index.md) | Use your cluster for a single project. |
-| [Group level](../../../group/clusters/index.md) | Use the same cluster across multiple projects within your group. |
-| [Instance level](../../../instance/clusters/index.md) **(FREE SELF)** | Use the same cluster across groups and projects within your instance. |
-
## Supported cluster versions
GitLab is committed to support at least two production-ready Kubernetes minor
@@ -86,29 +76,42 @@ version. The range of supported versions is based on the evaluation of:
GitLab supports the following Kubernetes versions, and you can upgrade your
Kubernetes version to any supported version at any time:
+- 1.20 (support ends on July 22, 2022)
- 1.19 (support ends on February 22, 2022)
- 1.18 (support ends on November 22, 2021)
- 1.17 (support ends on September 22, 2021)
+[Adding support to other versions of Kubernetes is managed under this epic](https://gitlab.com/groups/gitlab-org/-/epics/4827).
+
Some GitLab features may support versions outside the range provided here.
-## View your clusters
+## Cluster levels
+
+Choose your cluster's level according to its purpose:
+
+| Level | Purpose |
+|--|--|
+| [Project level](../../../project/clusters/index.md) | Use your cluster for a single project. |
+| [Group level](../../../group/clusters/index.md) | Use the same cluster across multiple projects within your group. |
+| [Instance level](../../../instance/clusters/index.md) | Use the same cluster across groups and projects within your instance. |
+
+### View your clusters
To view the Kubernetes clusters connected to your project,
-group, or instance, open the cluster's page according to the
-[level](#cluster-levels) of your cluster.
+group, or instance, open the cluster's page according to
+your cluster's level.
**Project-level clusters:**
-1. Go to your project's homepage.
+1. On the top bar, select **Menu > Projects** and find your project.
1. On the left sidebar, select **Infrastructure > Kubernetes clusters**.
**Group-level clusters:**
-1. Go to your group's homepage.
+1. On the top bar, select **Menu > Groups** and find your group.
1. On the left sidebar, select **Kubernetes**.
-**Instance-level clusters:** **(FREE SELF)**
+**Instance-level clusters:**
1. On the top bar, select **Menu > Admin**.
1. On the left sidebar, select **Kubernetes**.
diff --git a/doc/user/infrastructure/clusters/connect/new_gke_cluster.md b/doc/user/infrastructure/clusters/connect/new_gke_cluster.md
index 90044fa74e1..3c934b72886 100644
--- a/doc/user/infrastructure/clusters/connect/new_gke_cluster.md
+++ b/doc/user/infrastructure/clusters/connect/new_gke_cluster.md
@@ -26,25 +26,46 @@ You can then modify the project files according to your needs.
**Steps:**
1. [Import the example project](#import-the-example-project).
-1. [Add your GCP credentials to GitLab](#add-your-gcp-credentials-to-gitlab).
+1. [Create your GCP and GitLab credentials](#create-your-gcp-and-gitlab-credentials).
1. [Configure your project](#configure-your-project).
1. [Deploy your cluster](#deploy-your-cluster).
## Import the example project
+To create a new group-level cluster from GitLab using Infrastructure as Code, it is necessary
+to create a project to manage the cluster from. In this tutorial, we import a pre-configured
+sample project to help you get started.
+
Start by [importing the example project by URL](../../../project/import/repo_by_url.md). Use `https://gitlab.com/gitlab-org/configure/examples/gitlab-terraform-gke.git` as URL.
-## Add your GCP credentials to GitLab
+This project provides you with the following resources:
+
+- A [cluster on Google Cloud Platform (GCP)](https://gitlab.com/gitlab-org/configure/examples/gitlab-terraform-gke/-/blob/master/gke.tf)
+with defaults for name, location, node count, and Kubernetes version.
+- A [`gitlab-admin` K8s service account](https://gitlab.com/gitlab-org/configure/examples/gitlab-terraform-gke/-/blob/master/gitlab-admin.tf) with `cluster-admin` privileges.
+- The new group-level cluster connected to GitLab.
+- Pre-configures Terraform files:
-After importing the project, you need to set up [CI environment variables](../../../../ci/variables/index.md) to associate your cluster on GCP to your group in GitLab.
+ ```plaintext
+ ├── backend.tf # State file Location Configuration
+ ├── gke.tf # Google GKE Configuration
+ ├── gitlab-admin.tf # Adding kubernetes service account
+ └── group_cluster.tf # Registering kubernetes cluster to GitLab `apps` Group
+ ```
-We advise that you [set environment variables through the GitLab UI](../../../../ci/variables/index.md#add-a-cicd-variable-to-a-project)
-so that your credentials are not exposed through the code. To do so, follow the steps below.
+## Create your GCP and GitLab credentials
-### Prepare your credentials on GCP
+To set up your project to communicate to GCP and the GitLab API:
-1. Create a [GCP service account](https://cloud.google.com/docs/authentication/getting-started) to authenticate GCP with GitLab. It needs the following roles: `Computer Network Viewer`, `Kubernetes Engine Admin`, and `Service Account User`.
-1. Download the JSON file with the service account key.
+1. Create a [GitLab personal access token](../../../profile/personal_access_tokens.md) with
+ `api` scope. The Terraform script uses it to connect the cluster to your GitLab group. Take note of the generated token. You will
+ need it when you [configure your project](#configure-your-project).
+1. To authenticate GCP with GitLab, create a [GCP service account](https://cloud.google.com/docs/authentication/getting-started)
+with following roles: `Compute Network Viewer`, `Kubernetes Engine Admin`, `Service Account User`, and `Service Account Admin`. Both User and Admin
+service accounts are necessary. The User role impersonates the [default service account](https://cloud.google.com/compute/docs/access/service-accounts#default_service_account)
+when [creating the node pool](https://registry.terraform.io/providers/hashicorp/google/latest/docs/guides/using_gke_with_terraform#node-pool-management).
+The Admin role creates a service account in the `kube-system` namespace.
+1. Download the JSON file with the service account key you created in the previous step.
1. On your computer, encode the JSON file to `base64` (replace `/path/to/sa-key.json` to the path to your key):
```shell
@@ -53,36 +74,38 @@ so that your credentials are not exposed through the code. To do so, follow the
1. Use the output of this command as the `BASE64_GOOGLE_CREDENTIALS` environment variable in the next step.
-### Add your credentials to GitLab as environment variables
+## Configure your project
-1. On GitLab, from your project's sidebar, go to **Settings > CI/CD** and expand **Variables**.
-1. Add your `GITLAB_TOKEN` ([personal access token](../../../profile/personal_access_tokens.md)).
-1. Add the variable `BASE64_GOOGLE_CREDENTIALS` from the previous step.
+**Required configuration:**
-## Configure your project
+Use CI/CD environment variables to configure your project as detailed below.
-After authenticating with GCP, replace the project's defaults from the example
-project with your own. To do so, edit the files as described below.
+**Required configuration:**
-Edit `gke.tf`:
+1. On the left sidebar, select **Settings > CI/CD**.
+1. Expand **Variables**.
+1. Set the variable `TF_VAR_gitlab_token` to the GitLab personal access token you just created.
+1. Set the variable `BASE64_GOOGLE_CREDENTIALS` to the `base64` encoded JSON file you just created.
+1. Set the variable `TF_VAR_gcp_project` to your GCP's `project` name.
+1. Set the variable `TF_VAR_gitlab_group` to the name of the group you want to connect your cluster to. If your group's URL is `https://gitlab.example.com/my-example-group`, `my-example-group` is your group's name.
-1. **(Required)** Replace the GCP `project` with a unique project name.
-1. **(Optional)** Choose the `name` of your cluster.
-1. **(Optional)** Choose the `region` and `zone` that you would like to deploy your cluster to.
-1. Push the changes to your project's default branch.
+**Optional configuration:**
-Edit `group_cluster.tf`:
+The file [`variables.tf`](https://gitlab.com/gitlab-org/configure/examples/gitlab-terraform-gke/-/blob/master/variables.tf)
+contains other variables that you can override according to your needs:
-1. **(Required)**: Replace the `full_path` with the path to your group.
-1. **(Optional)**: Choose your cluster base domain through `domain`.
-1. **(Optional)**: Choose your environment through `environment_scope`.
-1. Push the changes to your project's default branch.
+- `TF_VAR_gcp_region`: Set your cluster's region.
+- `TF_VAR_cluster_name`: Set your cluster's name.
+- `TF_VAR_machine_type`: Set the machine type for the Kubernetes nodes.
+- `TF_VAR_cluster_description`: Set a description for the cluster. We recommend setting this to `$CI_PROJECT_URL` to create a reference to your GitLab project on your GCP cluster detail page. This way you know which project was responsible for provisioning the cluster you see on the GCP dashboard.
+- `TF_VAR_base_domain`: Set to the base domain to provision resources under.
+- `TF_VAR_environment_scope`: Set to the environment scope for your cluster.
Refer to the [GitLab Terraform provider](https://registry.terraform.io/providers/gitlabhq/gitlab/latest/docs) and the [Google Terraform provider](https://registry.terraform.io/providers/hashicorp/google/latest/docs/guides/provider_reference) documentation for further resource options.
## Deploy your cluster
-After adjusting the files in the previous step, manually trigger the deployment of your cluster. In GitLab:
+After configuring your project, manually trigger the deployment of your cluster. In GitLab:
1. From your project's sidebar, go to **CI/CD > Pipelines**.
1. Select the dropdown icon (**{angle-down}**) next to the play icon (**{play}**).
diff --git a/doc/user/infrastructure/clusters/index.md b/doc/user/infrastructure/clusters/index.md
new file mode 100644
index 00000000000..16ca6d02865
--- /dev/null
+++ b/doc/user/infrastructure/clusters/index.md
@@ -0,0 +1,66 @@
+---
+stage: Configure
+group: Configure
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
+---
+
+# Kubernetes clusters **(FREE)**
+
+> - Project-level clusters [introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/35954) in GitLab 10.1.
+> - Group-level clusters [introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/34758) in GitLab 11.6.
+> - Instance-level clusters [introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/39840) in GitLab 11.11.
+
+Kubernetes is a container orchestration platform to deploy applications
+in a cluster without downtime and that scales as you need.
+
+With the GitLab integration with Kubernetes, you can:
+
+1. [Connect your cluster](#connect-your-cluster-to-gitlab).
+1. [Manage your cluster](#manage-your-cluster).
+1. [Deploy your cluster](#deploy-to-your-cluster).
+
+See the [Kubernetes clusters versions supported by GitLab](connect/index.md#supported-cluster-versions).
+
+## Connect your cluster to GitLab
+
+Learn how to [create new and connect existing clusters to GitLab](connect/index.md).
+
+## Manage your cluster
+
+- [Cluster Management Project](../../clusters/management_project.md):
+create a project to manage your cluster's shared resources requiring
+`cluster-admin` privileges such as an Ingress controller.
+ - [Cluster Management Project Template](../../clusters/management_project_template.md): start a cluster management project directly from a template.
+ - [Migrate to Cluster Management Project](../../clusters/migrating_from_gma_to_project_template.md): migrate from the deprecated GitLab Managed Apps to Cluster Management Projects.
+ - [GitLab Managed Apps](../../clusters/applications.md) (deprecated in favor of Cluster Management Projects): configure applications in your cluster directly from GitLab.
+- [Cluster integrations](../../clusters/integrations.md): install
+third-party applications into your cluster and manage them from GitLab.
+- [GitLab-managed clusters](../../project/clusters/gitlab_managed_clusters.md):
+enable GitLab to automatically create resources for your clusters.
+- [Cost management](../../clusters/cost_management.md): see insights into your cluster's resource usage.
+- [Crossplane integration](../../clusters/crossplane.md): manage your cluster's resources and cloud infrastructure with Crossplane.
+
+### Monitor your cluster
+
+- [Prometheus monitoring](../../project/integrations/prometheus_library/kubernetes.md): detect and monitor Kubernetes metrics with Prometheus.
+- [NGINX monitoring](../../project/integrations/prometheus_library/nginx.md): automatically monitor NGINX Ingress.
+- [Clusters health](manage/clusters_health.md): monitor your cluster's health, such as CPU and memory usage.
+
+### Secure your cluster
+
+- [Container Host Security](../../project/clusters/protect/container_host_security/index.md): monitor and block activity inside a container and enforce security policies across the cluster.
+- [Container Network security](../../project/clusters/protect/container_network_security/index.md): filter traffic going in and out of the cluster and traffic between pods through a firewall with Cilium NetworkPolicies.
+
+## Deploy to your cluster
+
+- [CI/CD Tunnel](../../clusters/agent/ci_cd_tunnel.md): use the CI/CD Tunnel to run Kubernetes commands from different projects.
+- [Inventory object](deploy/inventory_object.md): track objects applied to a cluster configured with the Kubernetes Agent.
+- [Auto DevOps](../../../topics/autodevops/index.md): enable Auto DevOps
+to allow GitLab automatically detect, build, test, and deploy applications.
+- [Cluster environments](../../clusters/environments.md): view CI/CD environments deployed to Kubernetes clusters.
+- [Canary Deployments](../../project/canary_deployments.md): deploy app updates to a small portion of the fleet with this Continuous Delivery strategy.
+- [Deploy to your cluster](../../project/clusters/deploy_to_cluster.md):
+deploy applications into your cluster using cluster certificates.
+- [Deploy Boards](../../project/deploy_boards.md): view the current health and status of each CI/CD environment running on your cluster, and the status of deployment pods.
+- [Pod logs](../../project/clusters/kubernetes_pod_logs.md): view the logs of your cluster's running pods.
+- [Serverless](../../project/clusters/serverless/index.md) (deprecated): deploy Serverless applications in Kubernetes environments and cloud Function as a Service (FaaS) environments.
diff --git a/doc/user/infrastructure/clusters/manage/clusters_health.md b/doc/user/infrastructure/clusters/manage/clusters_health.md
new file mode 100644
index 00000000000..009945589ad
--- /dev/null
+++ b/doc/user/infrastructure/clusters/manage/clusters_health.md
@@ -0,0 +1,14 @@
+---
+stage: Configure
+group: Configure
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
+---
+
+# Clusters health **(FREE)**
+
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/4701) in [GitLab Ultimate](https://about.gitlab.com/pricing/) 10.6.
+> - [Moved](https://gitlab.com/gitlab-org/gitlab/-/issues/208224) to GitLab Free in 13.2.
+
+When [the Prometheus cluster integration is enabled](../../../clusters/integrations.md#prometheus-cluster-integration), GitLab monitors the cluster's health. At the top of the cluster settings page, CPU and Memory utilization is displayed, along with the total amount available. Keeping an eye on cluster resources can be important, if the cluster runs out of memory pods may be shutdown or fail to start.
+
+![Cluster Monitoring](img/k8s_cluster_monitoring.png)
diff --git a/doc/user/project/clusters/img/k8s_cluster_monitoring.png b/doc/user/infrastructure/clusters/manage/img/k8s_cluster_monitoring.png
index 0a8c5043c65..0a8c5043c65 100644
--- a/doc/user/project/clusters/img/k8s_cluster_monitoring.png
+++ b/doc/user/infrastructure/clusters/manage/img/k8s_cluster_monitoring.png
Binary files differ
diff --git a/doc/user/infrastructure/index.md b/doc/user/infrastructure/index.md
index 9f28a40474e..e99dc691774 100644
--- a/doc/user/infrastructure/index.md
+++ b/doc/user/infrastructure/index.md
@@ -35,7 +35,7 @@ DevSecOps pipeline by default targeted at Kubernetes based deployments. To suppo
all the GitLab features, GitLab offers a cluster management project for easy onboarding.
The deploy boards provide quick insights into your cluster, including pod logs tailing.
-Learn more about the [GitLab integration with Kubernetes](../project/clusters/index.md).
+Learn more about the [GitLab integration with Kubernetes](clusters/index.md).
## Runbooks in GitLab
diff --git a/doc/user/instance/clusters/index.md b/doc/user/instance/clusters/index.md
index 20cd30b6110..de09cd4845e 100644
--- a/doc/user/instance/clusters/index.md
+++ b/doc/user/instance/clusters/index.md
@@ -4,7 +4,7 @@ group: unassigned
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Instance-level Kubernetes clusters
+# Instance-level Kubernetes clusters **(FREE SELF)**
> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/39840) in GitLab 11.11.
@@ -39,4 +39,4 @@ are deployed to the Kubernetes cluster, see the documentation for
## More information
For information on integrating GitLab and Kubernetes, see
-[Kubernetes clusters](../../project/clusters/index.md).
+[Kubernetes clusters](../../infrastructure/clusters/index.md).
diff --git a/doc/user/markdown.md b/doc/user/markdown.md
index 4149307c45a..5e600b6e0d1 100644
--- a/doc/user/markdown.md
+++ b/doc/user/markdown.md
@@ -524,7 +524,7 @@ GitLab Flavored Markdown recognizes the following:
| specific user | `@user_name` | | |
| specific group | `@group_name` | | |
| entire team | `@all` | | |
-| project | `namespace/project` | | |
+| project | `namespace/project>` | | |
| issue | ``#123`` | `namespace/project#123` | `project#123` |
| merge request | `!123` | `namespace/project!123` | `project!123` |
| snippet | `$123` | `namespace/project$123` | `project$123` |
@@ -955,6 +955,10 @@ Do not change to a reference style link.
![alt text](img/markdown_logo.png "Title Text")
+In the rare case where you need to set a specific height or width for an image,
+you can use the `img` HTML tag instead of Markdown and set its `height` and
+`width` parameters.
+
#### Videos
If this section isn't rendered correctly, [view it in GitLab](https://gitlab.com/gitlab-org/gitlab/-/blob/master/doc/user/markdown.md#videos).
diff --git a/doc/user/packages/composer_repository/index.md b/doc/user/packages/composer_repository/index.md
index 2787aefdeca..6e3af45df17 100644
--- a/doc/user/packages/composer_repository/index.md
+++ b/doc/user/packages/composer_repository/index.md
@@ -10,6 +10,11 @@ info: To determine the technical writer assigned to the Stage/Group associated w
> - [Moved](https://gitlab.com/gitlab-org/gitlab/-/issues/221259) to GitLab Free in 13.3.
> - Support for Composer 2.0 [added](https://gitlab.com/gitlab-org/gitlab/-/issues/259840) in GitLab Free 13.10.
+WARNING:
+The Composer package registry for GitLab is under development and isn't ready for production use due to
+limited functionality. This [epic](https://gitlab.com/groups/gitlab-org/-/epics/6817) details the remaining
+work and timelines to make it production ready.
+
Publish [Composer](https://getcomposer.org/) packages in your project's Package Registry.
Then, install the packages whenever you need to use them as a dependency.
@@ -120,6 +125,7 @@ You can publish a Composer package to the Package Registry as part of your CI/CD
deploy:
stage: deploy
script:
+ - apk add curl
- 'curl --header "Job-Token: $CI_JOB_TOKEN" --data tag=<tag> "${CI_API_V4_URL}/projects/$CI_PROJECT_ID/packages/composer"'
```
@@ -132,7 +138,7 @@ To view the published package, go to **Packages & Registries > Package Registry*
A more detailed Composer CI/CD file is also available as a `.gitlab-ci.yml` template:
1. On the left sidebar, select **Project information**.
-1. Above the file list, click **Set up CI/CD**. If this button is not available, select **CI/CD Configuration** and then **Edit**.
+1. Above the file list, select **Set up CI/CD**. If this button is not available, select **CI/CD Configuration** and then **Edit**.
1. From the **Apply a template** list, select **Composer**.
WARNING:
diff --git a/doc/user/packages/conan_repository/index.md b/doc/user/packages/conan_repository/index.md
index dc08baaf731..33c48478921 100644
--- a/doc/user/packages/conan_repository/index.md
+++ b/doc/user/packages/conan_repository/index.md
@@ -9,6 +9,11 @@ info: To determine the technical writer assigned to the Stage/Group associated w
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/8248) in GitLab Premium 12.6.
> - [Moved](https://gitlab.com/gitlab-org/gitlab/-/issues/221259) to GitLab Free in 13.3.
+WARNING:
+The Conan package registry for GitLab is under development and isn't ready for production use due to
+limited functionality. This [epic](https://gitlab.com/groups/gitlab-org/-/epics/6816) details the remaining
+work and timelines to make it production ready.
+
Publish Conan packages in your project's Package Registry. Then install the
packages whenever you need to use them as a dependency.
@@ -358,7 +363,7 @@ There are two ways to remove a Conan package from the GitLab Package Registry.
- From the GitLab user interface:
Go to your project's **Packages & Registries > Package Registry**. Remove the
- package by clicking the red trash icon.
+ package by selecting **Remove repository** (**{remove}**).
## Search for Conan packages in the Package Registry
diff --git a/doc/user/packages/container_registry/index.md b/doc/user/packages/container_registry/index.md
index 1db2165cd5d..c39552c1edb 100644
--- a/doc/user/packages/container_registry/index.md
+++ b/doc/user/packages/container_registry/index.md
@@ -648,7 +648,11 @@ For self-managed instances, those settings can be updated in the [Rails console]
ApplicationSetting.last.update(container_registry_expiration_policies_worker_capacity: 3)
```
-Alternatively, once the limits are [enabled](#enable-or-disable-cleanup-policy-limits), they are available in the [admin area](../../admin_area/index.md) **Settings > CI/CD > Container Registry**.
+Alternatively, once the limits are [enabled](#enable-or-disable-cleanup-policy-limits),
+they are available in the [administrator area](../../admin_area/index.md):
+
+1. On the top bar, select **Menu > Admin**.
+1. Go to **Settings > CI/CD > Container Registry**.
#### Enable or disable cleanup policy limits
@@ -714,15 +718,6 @@ Check the regex patterns to ensure they are valid.
GitLab uses [RE2 syntax](https://github.com/google/re2/wiki/Syntax) for regular expressions in the cleanup policy. You can test them with the [regex101 regex tester](https://regex101.com/).
View some common [regex pattern examples](#regex-pattern-examples).
-## Use the Container Registry to store Helm Charts
-
-With the launch of [Helm v3](https://helm.sh/docs/topics/registries/),
-you can use the Container Registry to store Helm Charts. However, due to the way metadata is passed
-and stored by Docker, it is not possible for GitLab to parse this data and meet performance standards.
-[This epic](https://gitlab.com/groups/gitlab-org/-/epics/2313) updates the architecture of the Container Registry to support Helm Charts.
-
-[Read more about the above challenges](https://gitlab.com/gitlab-org/gitlab/-/issues/38047#note_298842890).
-
## Limitations
- Moving or renaming existing Container Registry repositories is not supported
@@ -911,10 +906,10 @@ these steps:
while read -r LINE || [[ -n $LINE ]]; do echo ${LINE}; curl --request DELETE --header 'PRIVATE-TOKEN: <PAT>' "https://gitlab.example.com/api/v4/projects/<Project_id>/registry/repositories/<container_repo_id>/tags/${LINE}"; sleep 0.1; echo; done < list_o_tags.out > delete.logs
```
-### Troubleshoot as a GitLab server admin
+### Troubleshoot as a GitLab server administrator
Troubleshooting the GitLab Container Registry, most of the times, requires
-administrator access to the GitLab server.
+you to log in to GitLab server with the Administrator role.
[Read how to troubleshoot the Container Registry](../../../administration/packages/container_registry.md#troubleshooting).
diff --git a/doc/user/packages/debian_repository/index.md b/doc/user/packages/debian_repository/index.md
index 29641380753..36d85d94161 100644
--- a/doc/user/packages/debian_repository/index.md
+++ b/doc/user/packages/debian_repository/index.md
@@ -12,7 +12,8 @@ info: To determine the technical writer assigned to the Stage/Group associated w
WARNING:
The Debian package registry for GitLab is under development and isn't ready for production use due to
-limited functionality.
+limited functionality. This [epic](https://gitlab.com/groups/gitlab-org/-/epics/6057) details the remaining
+work and timelines to make it production ready.
Publish Debian packages in your project's Package Registry. Then install the
packages whenever you need to use them as a dependency.
@@ -138,7 +139,7 @@ To install a package:
1. Configure the repository:
- If you are using a private project, add your [credentials](#authenticate-to-the-package-registry) to your apt config:
+ If you are using a private project, add your [credentials](#authenticate-to-the-package-registry) to your apt configuration:
```shell
echo 'machine gitlab.example.com login <username> password <your_access_token>' \
diff --git a/doc/user/packages/dependency_proxy/index.md b/doc/user/packages/dependency_proxy/index.md
index ad25ec7edbf..5d482a15460 100644
--- a/doc/user/packages/dependency_proxy/index.md
+++ b/doc/user/packages/dependency_proxy/index.md
@@ -33,6 +33,14 @@ The following images and packages are supported.
For a list of planned additions, view the
[direction page](https://about.gitlab.com/direction/package/#dependency-proxy).
+## Enable or disable the Dependency Proxy for a group
+
+To enable or disable the Dependency Proxy for a group:
+
+1. Go to your group's **Settings > Packages & Registries**.
+1. Expand the **Dependency Proxy** section.
+1. To enable the proxy, turn on **Enable Proxy**. To disable it, turn the toggle off.
+
## View the Dependency Proxy
To view the Dependency Proxy:
@@ -66,7 +74,7 @@ has disrupted your existing Dependency Proxy usage.
Because the Dependency Proxy is storing Docker images in a space associated with your group,
you must authenticate against the Dependency Proxy.
-Follow the [instructions for using images from a private registry](../../../ci/docker/using_docker_images.md#define-an-image-from-a-private-container-registry),
+Follow the [instructions for using images from a private registry](../../../ci/docker/using_docker_images.md#access-an-image-from-a-private-container-registry),
but instead of using `registry.example.com:5000`, use your GitLab domain with no port `gitlab.example.com`.
For example, to manually log in:
@@ -171,8 +179,53 @@ from the GitLab server.
Blobs are kept forever on the GitLab server, and there is no hard limit on how much data can be
stored.
+### Using the API to clear the cache
+
To reclaim disk space used by image blobs that are no longer needed, use
-the [Dependency Proxy API](../../../api/dependency_proxy.md).
+the [Dependency Proxy API](../../../api/dependency_proxy.md) to clear the entire
+cache.
+
+If you clear the cache, the next time a pipeline runs it must pull an image or tag from Docker Hub.
+
+### Cleanup policies
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/294187) in GitLab Free 14.4.
+
+The cleanup policy is a scheduled job you can use to clear cached images that are no longer used,
+freeing up additional storage space. The policies use time-to-live (TTL) logic:
+
+- The number of days is configured.
+- All cached dependency proxy files that have not been pulled in that many days are deleted.
+
+Use the [GraphQL API](../../../api/graphql/reference/index.md#mutationupdatedependencyproxyimagettlgrouppolicy)
+to enable and configure cleanup policies:
+
+```graphql
+mutation {
+ updateDependencyProxyImageTtlGroupPolicy(input:
+ {
+ groupPath: "<your-full-group-path>",
+ enabled: true,
+ ttl: 90
+ }
+ ) {
+ dependencyProxyImageTtlPolicy {
+ enabled
+ ttl
+ }
+ errors
+ }
+}
+```
+
+See the [Getting started with GraphQL](../../../api/graphql/getting_started.md)
+guide to learn how to make GraphQL queries. Support for enabling and configuring cleanup policies in
+the UI is tracked in [this issue](https://gitlab.com/gitlab-org/gitlab/-/issues/340777).
+
+When the policy is initially enabled, the default TTL setting is 90 days. Once enabled, stale
+dependency proxy files are queued for deletion each day. Deletion may not occur right away due to
+processing time. If the image is pulled after the cached files are marked as expired, the expired
+files are ignored and new files are downloaded and cached from the external registry.
## Docker Hub rate limits and the Dependency Proxy
@@ -227,7 +280,7 @@ script:
```shell
# Note, you must have jq installed to run this command
-TOKEN=$(curl "https://auth.docker.io/token?service=registry.docker.io&scope=repository:ratelimitpreview/test:pull" | jq --raw-output .token) && curl --head --header "Authorization: Bearer $TOKEN" "https://registry-1.docker.io/v2/ratelimitpreview/test/manifests/latest" 2>&1 | grep RateLimit
+TOKEN=$(curl "https://auth.docker.io/token?service=registry.docker.io&scope=repository:ratelimitpreview/test:pull" | jq --raw-output .token) && curl --head --header "Authorization: Bearer $TOKEN" "https://registry-1.docker.io/v2/ratelimitpreview/test/manifests/latest" 2>&1 | grep --ignore-case RateLimit
...
```
@@ -256,10 +309,6 @@ hub_docker_quota_check:
TOKEN=$(curl "https://auth.docker.io/token?service=registry.docker.io&scope=repository:ratelimitpreview/test:pull" | jq --raw-output .token) && curl --head --header "Authorization: Bearer $TOKEN" "https://registry-1.docker.io/v2/ratelimitpreview/test/manifests/latest" 2>&1
```
-## Use the NPM Dependency Proxy for NPM packages
-
-For information on this, see [Dependency Proxy](../npm_registry/#dependency-proxy).
-
## Troubleshooting
### Dependency Proxy Connection Failure
diff --git a/doc/user/packages/go_proxy/index.md b/doc/user/packages/go_proxy/index.md
index 0c04c4a23d0..f17910cd46d 100644
--- a/doc/user/packages/go_proxy/index.md
+++ b/doc/user/packages/go_proxy/index.md
@@ -9,10 +9,14 @@ info: To determine the technical writer assigned to the Stage/Group associated w
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/27376) in GitLab Premium 13.1.
> - It's deployed behind a feature flag, disabled by default.
> - It's disabled for GitLab.com.
-> - It's not recommended for production use.
> - To use it in GitLab self-managed instances, ask a GitLab administrator to [enable it](#enable-the-go-proxy).
> - [Moved](https://gitlab.com/gitlab-org/gitlab/-/issues/221259) to GitLab Free in 13.3.
+WARNING:
+The Go package registry for GitLab is under development and isn't ready for production use due to
+limited functionality. This [epic](https://gitlab.com/groups/gitlab-org/-/epics/3043) details the remaining
+work and timelines to make it production ready.
+
With the Go proxy for GitLab, every project in GitLab can be fetched with the
[Go proxy protocol](https://proxy.golang.org/).
diff --git a/doc/user/packages/helm_repository/index.md b/doc/user/packages/helm_repository/index.md
index 2d984d76b97..c88fba83dc7 100644
--- a/doc/user/packages/helm_repository/index.md
+++ b/doc/user/packages/helm_repository/index.md
@@ -8,6 +8,11 @@ info: To determine the technical writer assigned to the Stage/Group associated w
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/18997) in GitLab 14.1.
+WARNING:
+The Helm chart registry for GitLab is under development and isn't ready for production use due to
+limited functionality. This [epic](https://gitlab.com/groups/gitlab-org/-/epics/6366) details the remaining
+work and timelines to make it production ready.
+
Publish Helm packages in your project's Package Registry. Then install the
packages whenever you need to use them as a dependency.
@@ -31,6 +36,10 @@ To authenticate to the Helm repository, you need either:
## Publish a package
+WARNING:
+The `helm-push` command is broken in Helm 3.7. For more information, see the [open issue](https://github.com/chartmuseum/helm-push/issues/109)
+in the Chart Museum project.
+
NOTE:
You can publish Helm charts with duplicate names or versions. If duplicates exist, GitLab always
returns the chart with the latest version.
@@ -105,7 +114,7 @@ helm install my-release project-1/mychart
- `<project_id>`: the project ID (like `42`).
- `<channel>`: the name of the channel (like `stable`).
-If the repo has previously been added, you may need to run:
+If the repository has previously been added, you may need to run:
```shell
helm repo update
@@ -123,3 +132,15 @@ Check the [Sidekiq log](../../../administration/logs.md#sidekiqlog)
for any related errors. If you see `Validation failed: Version is invalid`, it means that the
version in your `Chart.yaml` file does not follow [Helm Chart versioning specifications](https://helm.sh/docs/topics/charts/#charts-and-versioning).
To fix the error, use the correct version syntax and upload the chart again.
+
+### `helm push` results in an error
+
+The `helm push` plugin is not yet supported in Helm 3.7. If you try to push a chart using
+`helm push`, it produces the following error:
+
+```plaintext
+Error: this feature has been marked as experimental and is not enabled by default. Please set HELM_EXPERIMENTAL_OCI=1 in your environment to use this feature
+```
+
+To continue to use the plugin, you can push an image using [curl](#use-cicd-to-publish-a-helm-package)
+or downgrade your version of Helm.
diff --git a/doc/user/packages/index.md b/doc/user/packages/index.md
index 9158b5cc674..a8f1b1998ae 100644
--- a/doc/user/packages/index.md
+++ b/doc/user/packages/index.md
@@ -10,20 +10,31 @@ The GitLab [Package Registry](package_registry/index.md) acts as a private or pu
for a variety of common package managers. You can publish and share
packages, which can be easily consumed as a dependency in downstream projects.
+WARNING:
+Not all package manager formats are ready for production use. To view each format's status, see the
+table's **Status** column.
+
The Package Registry supports the following formats:
-| Package type | GitLab version |
-| ------------ | -------------- |
-| [Composer](composer_repository/index.md) | 13.2+ |
-| [Conan](conan_repository/index.md) | 12.6+ |
-| [Go](go_proxy/index.md) | 13.1+ |
-| [Helm](helm_repository/index.md) | 14.1+ |
-| [Maven](maven_repository/index.md) | 11.3+ |
-| [npm](npm_registry/index.md) | 11.7+ |
-| [NuGet](nuget_repository/index.md) | 12.8+ |
-| [PyPI](pypi_repository/index.md) | 12.10+ |
-| [Generic packages](generic_packages/index.md) | 13.5+ |
-| [Ruby gems](rubygems_registry/index.md) | 13.10+ |
+| Package type | GitLab version | Status |
+| ------------ | -------------- |------- |
+| [Maven](maven_repository/index.md) | 11.3+ | Stable |
+| [npm](npm_registry/index.md) | 11.7+ | Stable |
+| [NuGet](nuget_repository/index.md) | 12.8+ | Stable |
+| [PyPI](pypi_repository/index.md) | 12.10+ | Stable |
+| [Generic packages](generic_packages/index.md) | 13.5+ | Stable |
+| [Composer](composer_repository/index.md) | 13.2+ | [Beta](https://gitlab.com/groups/gitlab-org/-/epics/6817) |
+| [Conan](conan_repository/index.md) | 12.6+ | [Beta](https://gitlab.com/groups/gitlab-org/-/epics/6816) |
+| [Helm](helm_repository/index.md) | 14.1+ | [Beta](https://gitlab.com/groups/gitlab-org/-/epics/6366) |
+| [Debian](debian_repository/index.md) | 14.2+ | [Alpha](https://gitlab.com/groups/gitlab-org/-/epics/6057) |
+| [Go](go_proxy/index.md) | 13.1+ | [Alpha](https://gitlab.com/groups/gitlab-org/-/epics/3043) |
+| [Ruby gems](rubygems_registry/index.md) | 13.10+ | [Alpha](https://gitlab.com/groups/gitlab-org/-/epics/3200) |
+
+Status:
+
+- Alpha: behind a feature flag and not officially supported.
+- Beta: several known issues that may prevent expected use.
+- Stable: ready for production use.
You can also use the [API](../../api/packages.md) to administer the Package Registry.
@@ -40,12 +51,12 @@ guides you through the process.
| CocoaPods | [#36890](https://gitlab.com/gitlab-org/gitlab/-/issues/36890) |
| Conda | [#36891](https://gitlab.com/gitlab-org/gitlab/-/issues/36891) |
| CRAN | [#36892](https://gitlab.com/gitlab-org/gitlab/-/issues/36892) |
-| Debian | [Draft: Merge Request](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/50438) |
| Opkg | [#36894](https://gitlab.com/gitlab-org/gitlab/-/issues/36894) |
| P2 | [#36895](https://gitlab.com/gitlab-org/gitlab/-/issues/36895) |
| Puppet | [#36897](https://gitlab.com/gitlab-org/gitlab/-/issues/36897) |
-| RPM | [#5932](https://gitlab.com/gitlab-org/gitlab/-/issues/5932) |
+| RPM | [#5932](https://gitlab.com/groups/gitlab-org/-/epics/5128) |
| SBT | [#36898](https://gitlab.com/gitlab-org/gitlab/-/issues/36898) |
+| Swift | [#12233](https://gitlab.com/gitlab-org/gitlab/-/issues/12233) |
| Vagrant | [#36899](https://gitlab.com/gitlab-org/gitlab/-/issues/36899) |
<!-- vale gitlab.Spelling = YES -->
diff --git a/doc/user/packages/npm_registry/index.md b/doc/user/packages/npm_registry/index.md
index fe7e6a0ea46..b07ae72e273 100644
--- a/doc/user/packages/npm_registry/index.md
+++ b/doc/user/packages/npm_registry/index.md
@@ -370,13 +370,26 @@ in a JavaScript project. You can install a package from the scope of a project o
If multiple packages have the same name and version, when you install a package, the most recently-published package is retrieved.
-1. Set the URL for scoped packages by running:
+1. Set the URL for scoped packages.
+
+ For [instance-level endpoints](#use-the-gitlab-endpoint-for-npm-packages) run:
```shell
npm config set @foo:registry https://gitlab.example.com/api/v4/packages/npm/
```
- Replace `@foo` with your scope.
+ - Replace `@foo` with your scope.
+ - Replace `gitlab.example.com` with your domain name.
+
+ For [project-level endpoints](#use-the-gitlab-endpoint-for-npm-packages) run:
+
+ ```shell
+ npm config set @foo:registry https://gitlab.example.com/api/v4/projects/<your_project_id>/packages/npm/
+ ```
+
+ - Replace `@foo` with your scope.
+ - Replace `gitlab.example.com` with your domain name.
+ - Replace `<your_project_id>` with your project ID, found on the project's home page.
1. Ensure [authentication](#authenticate-to-the-package-registry) is configured.
@@ -601,8 +614,3 @@ The GitLab npm repository supports the following commands for the npm CLI (`npm`
- `npm view`: Show package metadata.
- `yarn add`: Install an npm package.
- `yarn update`: Update your dependencies.
-
-## Dependency Proxy
-
-The NPM Dependency Proxy for NPM packages isn't available. For more information, see
-[this epic](https://gitlab.com/groups/gitlab-org/-/epics/3608).
diff --git a/doc/user/packages/nuget_repository/index.md b/doc/user/packages/nuget_repository/index.md
index 40e8b74c2b6..2af6dc60078 100644
--- a/doc/user/packages/nuget_repository/index.md
+++ b/doc/user/packages/nuget_repository/index.md
@@ -77,6 +77,8 @@ To use the GitLab endpoint for NuGet Packages, choose an option:
Some features such as [publishing](#publish-a-nuget-package) a package are only available on the project-level endpoint.
+When asking for versions of a given NuGet package name, the GitLab Package Registry returns a maximum of 300 most recent versions.
+
WARNING:
Because of how NuGet handles credentials, the Package Registry rejects anonymous requests on the group-level endpoint.
To work around this limitation, set up [authentication](#add-the-package-registry-as-a-source-for-nuget-packages).
@@ -352,12 +354,12 @@ the existing package is overwritten.
## Install packages
-To install a NuGet package from the Package Registry, you must first
-[add a project-level or group-level endpoint](#add-the-package-registry-as-a-source-for-nuget-packages).
-
If multiple packages have the same name and version, when you install
a package, the most recently-published package is retrieved.
+To install a NuGet package from the Package Registry, you must first
+[add a project-level or group-level endpoint](#add-the-package-registry-as-a-source-for-nuget-packages).
+
### Install a package with the NuGet CLI
WARNING:
diff --git a/doc/user/packages/rubygems_registry/index.md b/doc/user/packages/rubygems_registry/index.md
index 2a0fea6e0ef..e31bd8bd0bf 100644
--- a/doc/user/packages/rubygems_registry/index.md
+++ b/doc/user/packages/rubygems_registry/index.md
@@ -9,8 +9,9 @@ info: To determine the technical writer assigned to the Stage/Group associated w
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/803) in [GitLab Free](https://about.gitlab.com/pricing/) 13.10.
WARNING:
-The Ruby gems registry for GitLab is under development and isn't ready for production use due to
-limited functionality.
+The Ruby gems package registry for GitLab is under development and isn't ready for production use due to
+limited functionality. This [epic](https://gitlab.com/groups/gitlab-org/-/epics/3200) details the remaining
+work and timelines to make it production ready.
You can publish Ruby gems in your project's Package Registry, then install the packages when you
need to use them as a dependency. Although you can push gems to the registry, you cannot install
diff --git a/doc/user/permissions.md b/doc/user/permissions.md
index f240a9fd407..10147e7f69c 100644
--- a/doc/user/permissions.md
+++ b/doc/user/permissions.md
@@ -33,8 +33,6 @@ usernames. A GitLab administrator can configure the GitLab instance to
## Project members permissions
-> The Master role was renamed to Maintainer in GitLab 11.0.
-
The Owner role is only available at the group or personal namespace level (and for instance administrators) and is inherited by its projects.
While Maintainer is the highest project-level role, some actions can only be performed by a personal namespace or group owner, or an instance administrator, who receives all permissions.
For more information, see [projects members documentation](project/members/index.md).
@@ -59,23 +57,23 @@ The following table lists project permissions available for each role:
| [Application security](application_security/index.md):<br>View [threats list](application_security/threat_monitoring/index.md#threat-monitoring) **(ULTIMATE)** | | | ✓ | ✓ | ✓ |
| [Application security](application_security/index.md):<br>Create a [CVE ID Request](application_security/cve_id_request.md) **(FREE SAAS)** | | | | ✓ | ✓ |
| [Application security](application_security/index.md):<br>Create or assign [security policy project](application_security/policies/index.md) **(ULTIMATE)** | | | | | ✓ |
-| [CI/CD](../ci/README.md):<br>Download and browse job artifacts | ✓ (*3*) | ✓ | ✓ | ✓ | ✓ |
-| [CI/CD](../ci/README.md):<br>View a job log | ✓ (*3*) | ✓ | ✓ | ✓ | ✓ |
-| [CI/CD](../ci/README.md):<br>View list of jobs | ✓ (*3*) | ✓ | ✓ | ✓ | ✓ |
-| [CI/CD](../ci/README.md):<br>View [environments](../ci/environments/index.md) | | ✓ | ✓ | ✓ | ✓ |
-| [CI/CD](../ci/README.md):<br>Cancel and retry jobs | | | ✓ | ✓ | ✓ |
-| [CI/CD](../ci/README.md):<br>Create new [environments](../ci/environments/index.md) | | | ✓ | ✓ | ✓ |
-| [CI/CD](../ci/README.md):<br>Run CI/CD pipeline against a protected branch | | | ✓ (*5*) | ✓ | ✓ |
-| [CI/CD](../ci/README.md):<br>Stop [environments](../ci/environments/index.md) | | | ✓ | ✓ | ✓ |
-| [CI/CD](../ci/README.md):<br>View a job with [debug logging](../ci/variables/index.md#debug-logging) | | | ✓ | ✓ | ✓ |
-| [CI/CD](../ci/README.md):<br>Manage CI/CD variables | | | | ✓ | ✓ |
-| [CI/CD](../ci/README.md):<br>Manage job triggers | | | | ✓ | ✓ |
-| [CI/CD](../ci/README.md):<br>Manage runners | | | | ✓ | ✓ |
-| [CI/CD](../ci/README.md):<br>Run Web IDE's Interactive Web Terminals **(ULTIMATE ONLY)** | | | | ✓ | ✓ |
-| [CI/CD](../ci/README.md):<br>Use [environment terminals](../ci/environments/index.md#web-terminals) | | | | ✓ | ✓ |
-| [CI/CD](../ci/README.md):<br>Delete pipelines | | | | | ✓ |
-| [Clusters](project/clusters/index.md):<br>View pod logs | | | ✓ | ✓ | ✓ |
-| [Clusters](project/clusters/index.md):<br>Manage clusters | | | | ✓ | ✓ |
+| [CI/CD](../ci/index.md):<br>Download and browse job artifacts | ✓ (*3*) | ✓ | ✓ | ✓ | ✓ |
+| [CI/CD](../ci/index.md):<br>View a job log | ✓ (*3*) | ✓ | ✓ | ✓ | ✓ |
+| [CI/CD](../ci/index.md):<br>View list of jobs | ✓ (*3*) | ✓ | ✓ | ✓ | ✓ |
+| [CI/CD](../ci/index.md):<br>View [environments](../ci/environments/index.md) | | ✓ | ✓ | ✓ | ✓ |
+| [CI/CD](../ci/index.md):<br>Cancel and retry jobs | | | ✓ | ✓ | ✓ |
+| [CI/CD](../ci/index.md):<br>Create new [environments](../ci/environments/index.md) | | | ✓ | ✓ | ✓ |
+| [CI/CD](../ci/index.md):<br>Run CI/CD pipeline against a protected branch | | | ✓ (*5*) | ✓ | ✓ |
+| [CI/CD](../ci/index.md):<br>Stop [environments](../ci/environments/index.md) | | | ✓ | ✓ | ✓ |
+| [CI/CD](../ci/index.md):<br>View a job with [debug logging](../ci/variables/index.md#debug-logging) | | | ✓ | ✓ | ✓ |
+| [CI/CD](../ci/index.md):<br>Manage CI/CD variables | | | | ✓ | ✓ |
+| [CI/CD](../ci/index.md):<br>Manage job triggers | | | | ✓ | ✓ |
+| [CI/CD](../ci/index.md):<br>Manage runners | | | | ✓ | ✓ |
+| [CI/CD](../ci/index.md):<br>Run Web IDE's Interactive Web Terminals **(ULTIMATE ONLY)** | | | | ✓ | ✓ |
+| [CI/CD](../ci/index.md):<br>Use [environment terminals](../ci/environments/index.md#web-terminals) | | | | ✓ | ✓ |
+| [CI/CD](../ci/index.md):<br>Delete pipelines | | | | | ✓ |
+| [Clusters](infrastructure/clusters/index.md):<br>View [pod logs](project/clusters/kubernetes_pod_logs.md) | | | ✓ | ✓ | ✓ |
+| [Clusters](infrastructure/clusters/index.md):<br>Manage clusters | | | | ✓ | ✓ |
| [Container Registry](packages/container_registry/index.md):<br>Create, edit, delete cleanup policies | | | ✓ | ✓ | ✓ |
| [Container Registry](packages/container_registry/index.md):<br>Remove a container registry image | | | ✓ | ✓ | ✓ |
| [Container Registry](packages/container_registry/index.md):<br>Update container registry | | | ✓ | ✓ | ✓ |
@@ -132,7 +130,7 @@ The following table lists project permissions available for each role:
| [Projects](project/index.md):<br>View [wiki](project/wiki/index.md) pages | ✓ | ✓ | ✓ | ✓ | ✓ |
| [Projects](project/index.md):<br>Create [snippets](snippets.md) | | ✓ | ✓ | ✓ | ✓ |
| [Projects](project/index.md):<br>Manage labels | | ✓ | ✓ | ✓ | ✓ |
-| [Projects](project/index.md):<br>View project statistics | | ✓ | ✓ | ✓ | ✓ |
+| [Projects](project/index.md):<br>View [project traffic statistics](../api/project_statistics.md) | | ✓ | ✓ | ✓ | ✓ |
| [Projects](project/index.md):<br>Create, edit, delete [milestones](project/milestones/index.md). | | | ✓ | ✓ | ✓ |
| [Projects](project/index.md):<br>Create, edit, delete [releases](project/releases/index.md) | | | ✓ (*13*) | ✓ (*13*) | ✓ (*13*) |
| [Projects](project/index.md):<br>Create, edit [wiki](project/wiki/index.md) pages | | | ✓ | ✓ | ✓ |
@@ -269,9 +267,6 @@ Find the visibility permissions for the Container Registry, as described in the
## Group members permissions
-NOTE:
-In GitLab 11.0, the Master role was renamed to Maintainer.
-
Any user can remove themselves from a group, unless they are the last Owner of
the group.
@@ -434,7 +429,7 @@ mentioned in the [permissions table above](#project-members-permissions) (they
are unable to browse the project's repository, for example).
NOTE:
-To prevent a guest user from creating projects, as an admin, you can edit the
+To prevent a guest user from creating projects, as an administrator, you can edit the
user's profile to mark the user as [external](#external-users).
Beware though that even if a user is external, if they already have Reporter or
higher permissions in any project or group, they are **not** counted as a
@@ -442,8 +437,6 @@ free guest user.
## Auditor users **(PREMIUM SELF)**
->[Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/998) in [GitLab Premium](https://about.gitlab.com/pricing/) 8.17.
-
Auditor users are given read-only access to all projects, groups, and other
resources on the GitLab instance.
@@ -454,7 +447,7 @@ with the permissions described on the documentation on [auditor users permission
## Users with minimal access **(PREMIUM)**
->[Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/40942) in [GitLab Premium](https://about.gitlab.com/pricing/) 13.4.
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/40942) in [GitLab Premium](https://about.gitlab.com/pricing/) 13.4.
Owners can add members with a "minimal access" role to a parent group. Such users don't
automatically have access to projects and subgroups underneath. To support such access, owners must explicitly add these "minimal access" users to the specific subgroups/projects.
@@ -480,9 +473,6 @@ which visibility level you select on project settings.
## GitLab CI/CD permissions
-NOTE:
-In GitLab 11.0, the Master role was renamed to Maintainer.
-
GitLab CI/CD permissions rely on the role the user has in GitLab. There are four
roles:
@@ -513,13 +503,10 @@ instance and project.
### Job permissions
-NOTE:
-In GitLab 11.0, the Master role was renamed to Maintainer.
-
This table shows granted privileges for jobs triggered by specific types of
users:
-| Action | Guest, Reporter | Developer |Maintainer| Admin |
+| Action | Guest, Reporter | Developer |Maintainer| Administrator |
|---------------------------------------------|-----------------|-------------|----------|---------|
| Run CI job | | ✓ | ✓ | ✓ |
| Clone source and LFS from current project | | ✓ | ✓ | ✓ |
@@ -534,8 +521,8 @@ users:
| Push container images to other projects | | | | |
| Push source and LFS | | | | |
-1. Only if the user is not an external one
-1. Only if the user is a member of the project
+1. Only if the triggering user is not an external one
+1. Only if the triggering user is a member of the project
## Running pipelines on protected branches
@@ -555,7 +542,7 @@ for more information.
## LDAP users permissions
-In GitLab 8.15 and later, LDAP user permissions can now be manually overridden by an admin user.
+LDAP user permissions can be manually overridden by an administrator.
Read through the documentation on [LDAP users permissions](group/index.md#manage-group-memberships-via-ldap) to learn more.
## Project aliases
diff --git a/doc/user/profile/account/create_accounts.md b/doc/user/profile/account/create_accounts.md
index 3cc56cc47e6..ab0cae976d2 100644
--- a/doc/user/profile/account/create_accounts.md
+++ b/doc/user/profile/account/create_accounts.md
@@ -9,7 +9,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
You can create users:
-- Manually through the sign in page or Admin Area.
+- Manually through the sign in page or Administrator Area.
- Automatically through user authentication integrations.
## Create users on sign in page
@@ -24,17 +24,17 @@ their own accounts by either:
## Create users in Admin Area
-As an Admin user, you can manually create users:
+As an Administrator user, you can manually create users:
1. On the top bar, select **Menu > Admin**.
1. On the left sidebar, select **Overview > Users** (`/admin/users`).
1. Select **New user**.
-You can also [create users through the API](../../../api/users.md) as an admin.
+You can also [create users through the API](../../../api/users.md) as an administrator.
-![Admin User Button](img/admin_user_button.png)
+![Administrator User Button](img/admin_user_button.png)
-![Admin User Form](img/admin_user_form.png)
+![Administrator User Form](img/admin_user_form.png)
## Create users through authentication integrations
diff --git a/doc/user/profile/account/delete_account.md b/doc/user/profile/account/delete_account.md
index 41b4e508c38..c555f5ca8cc 100644
--- a/doc/user/profile/account/delete_account.md
+++ b/doc/user/profile/account/delete_account.md
@@ -19,7 +19,7 @@ Deleting a user deletes all projects in that user namespace.
As a user, to delete your own account:
-1. In the top-right corner, select your avatar.
+1. On the top bar, in the top right corner, select your avatar.
1. Select **Edit profile**.
1. On the left sidebar, select **Account**.
1. Select **Delete account**.
diff --git a/doc/user/profile/account/two_factor_authentication.md b/doc/user/profile/account/two_factor_authentication.md
index 44537707db6..6fe4b457fac 100644
--- a/doc/user/profile/account/two_factor_authentication.md
+++ b/doc/user/profile/account/two_factor_authentication.md
@@ -1,5 +1,4 @@
---
-type: howto
stage: Manage
group: Access
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
@@ -35,7 +34,8 @@ still access your account if you lose your U2F / WebAuthn device.
## Enabling 2FA
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/35102) in GitLab 14.3, account email confirmation required.
+> - Account email confirmation requirement [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/35102) in GitLab 14.3. [Deployed behind the `ensure_verified_primary_email_for_2fa` flag](../../../administration/feature_flags.md), enabled by default.
+> - Account email confirmation requirement generally available and [feature flag `ensure_verified_primary_email_for_2fa` removed](https://gitlab.com/gitlab-org/gitlab/-/issues/340151) in GitLab 14.4.
There are multiple ways to enable two-factor authentication (2FA):
@@ -44,11 +44,6 @@ There are multiple ways to enable two-factor authentication (2FA):
In GitLab 14.3 and later, your account email must be confirmed to enable two-factor authentication.
-FLAG:
-On self-managed GitLab, account email confirmation requirement is enabled. To disable this
-restriction, ask an administrator to
-[disable the `ensure_verified_primary_email_for_2fa` flag](../../../administration/feature_flags.md).
-
### One-time password
To enable 2FA:
@@ -239,8 +234,6 @@ Feature.disable(:forti_token_cloud, User.find(<user ID>))
### U2F device
-> Introduced in [GitLab 8.9](https://about.gitlab.com/blog/2016/06/22/gitlab-adds-support-for-u2f/).
-
GitLab officially only supports [YubiKey](https://www.yubico.com/products/)
U2F devices, but users have successfully used [SoloKeys](https://solokeys.com/)
or [Google Titan Security Key](https://cloud.google.com/titan-security-key).
diff --git a/doc/user/profile/active_sessions.md b/doc/user/profile/active_sessions.md
index 25f349d9272..1797307a00c 100644
--- a/doc/user/profile/active_sessions.md
+++ b/doc/user/profile/active_sessions.md
@@ -9,14 +9,14 @@ type: howto
> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/17867) in GitLab 10.8.
-GitLab lists all devices that have logged into your account. This allows you to
+GitLab lists all devices that have logged into your account. You can
review the sessions, and revoke any you don't recognize.
## Listing all active sessions
To list all active sessions:
-1. In the top-right corner, select your avatar.
+1. On the top bar, in the top right corner, select your avatar.
1. Select **Edit profile**.
1. On the left sidebar, select **Active Sessions**.
@@ -33,7 +33,7 @@ exceeds 100, the oldest ones are deleted.
To revoke an active session:
-1. In the top-right corner, select your avatar.
+1. On the top bar, in the top right corner, select your avatar.
1. Select **Edit profile**.
1. On the left sidebar, select **Active Sessions**.
1. Select **Revoke** next to a session. The current session cannot be revoked, as this would sign you out of GitLab.
diff --git a/doc/user/profile/img/notification_global_settings_v13_12.png b/doc/user/profile/img/notification_global_settings_v13_12.png
deleted file mode 100644
index 0998bb89778..00000000000
--- a/doc/user/profile/img/notification_global_settings_v13_12.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/profile/index.md b/doc/user/profile/index.md
index 24006e6f875..7f16c4e244e 100644
--- a/doc/user/profile/index.md
+++ b/doc/user/profile/index.md
@@ -15,25 +15,25 @@ Your profile also includes settings, which you use to customize your GitLab expe
To access your profile:
-1. In the top-right corner, select your avatar.
+1. On the top bar, in the top-right corner, select your avatar.
1. Select your name or username.
## Access your user settings
To access your user settings:
-1. In the top-right corner, select your avatar.
+1. On the top bar, in the top-right corner, select your avatar.
1. Select **Edit profile**.
## Change your password
To change your password:
-1. In the top-right corner, select your avatar.
+1. On the top bar, in the top-right corner, select your avatar.
1. Select **Edit profile**.
1. On the left sidebar, select **Password**.
-1. In the **Current password** field, enter your current password.
-1. In the **New password** and **Password confirmation** field, enter your new password.
+1. In the **Current password** text box, enter your current password.
+1. In the **New password** and **Password confirmation** text box, enter your new password.
1. Select **Save password**.
If you don't know your current password, select the **I forgot my password** link.
@@ -53,7 +53,7 @@ Prerequisites:
To change your username:
-1. In the top-right corner, select your avatar.
+1. On the top bar, in the top-right corner, select your avatar.
1. Select **Edit profile**.
1. On the left sidebar, select **Account**.
1. In the **Change username** section, enter a new username as the path.
@@ -63,10 +63,10 @@ To change your username:
To add new email to your account:
-1. In the top-right corner, select your avatar.
+1. On the top bar, in the top-right corner, select your avatar.
1. Select **Edit profile**.
1. On the left sidebar, select **Emails**.
-1. In the **Email** box, enter the new email.
+1. In the **Email** text box, enter the new email.
1. Select **Add email address**.
1. Verify your email address with the verification email received.
@@ -76,7 +76,7 @@ You can make your user profile visible to only you and GitLab administrators.
To make your profile private:
-1. In the top-right corner, select your avatar.
+1. On the top bar, in the top-right corner, select your avatar.
1. Select **Edit profile**.
1. Select the **Private profile** checkbox.
1. Select **Update profile settings**.
@@ -107,7 +107,7 @@ They can help other users connect with you on other platforms.
To add links to other accounts:
-1. In the top-right corner, select your avatar.
+1. On the top bar, in the top-right corner, select your avatar.
1. Select **Edit profile**.
1. In the **Main settings** section, add your information from:
- Skype
@@ -121,7 +121,7 @@ In the user contribution calendar graph and recent activity list, you can see yo
To show private contributions:
-1. In the top-right corner, select your avatar.
+1. On the top bar, in the top-right corner, select your avatar.
1. Select **Edit profile**.
1. In the **Main settings** section, select the **Include private contributions on my profile** checkbox.
1. Select **Update profile settings**.
@@ -135,9 +135,9 @@ your name in your profile.
To specify your pronouns:
-1. In the top-right corner, select your avatar.
+1. On the top bar, in the top-right corner, select your avatar.
1. Select **Edit profile**.
-1. In the **Pronouns** field, enter your pronouns.
+1. In the **Pronouns** text box, enter your pronouns.
1. Select **Update profile settings**.
## Add your name pronunciation
@@ -149,9 +149,9 @@ your name.
To add your name pronunciation:
-1. In the top-right corner, select your avatar.
+1. On the top bar, in the top-right corner, select your avatar.
1. Select **Edit profile**.
-1. In the **Pronunciation** field, enter how your name is pronounced.
+1. In the **Pronunciation** text box, enter how your name is pronounced.
1. Select **Update profile settings**.
## Set your current status
@@ -165,11 +165,11 @@ Your status is publicly visible even if your [profile is private](#make-your-use
To set your current status:
-1. In the top-right corner, select your avatar.
+1. On the top bar, in the top-right corner, select your avatar.
1. Select **Set status** or, if you have already set a status, **Edit status**.
1. Set the desired emoji and status message. Status messages must be plain text and 100 characters or less.
They can also contain emoji codes like, `I'm on vacation :palm_tree:`.
-1. Select a value from the **Clear status after** dropdown.
+1. Select a value from the **Clear status after** dropdown list.
1. Select **Set status**. Alternatively, you can select **Remove status** to remove your user status entirely.
You can also set your current status by [using the API](../../api/users.md#user-status).
@@ -188,12 +188,12 @@ To indicate to others that you are busy, you can set an indicator.
To set the busy status indicator, either:
- Set it directly:
- 1. In the top-right corner, select your avatar.
+ 1. On the top bar, in the top-right corner, select your avatar.
1. Select **Set status** or, if you have already set a status, **Edit status**.
1. Select the **Busy** checkbox.
- Set it on your profile:
- 1. In the top-right corner, select your avatar.
+ 1. On the top bar, in the top-right corner, select your avatar.
1. Select **Edit profile**.
1. In the **Current status** section, select the **Busy** checkbox.
@@ -221,7 +221,7 @@ To set the busy status indicator, either:
To set your time zone:
-1. In the top-right corner, select your avatar.
+1. On the top bar, in the top-right corner, select your avatar.
1. Select **Edit profile**.
1. In the **Time settings** section, select your time zone from the dropdown list.
@@ -236,7 +236,7 @@ To change your commit email:
1. In the top-right corner, select your avatar.
1. Select **Edit profile**.
-1. In the **Commit email** list, select an email address.
+1. In the **Commit email** dropdown list, select an email address.
1. Select **Update profile settings**.
### Use an automatically-generated private commit email
@@ -246,9 +246,9 @@ so you can keep your email information private.
To use a private commit email:
-1. In the top-right corner, select your avatar.
+1. On the top bar, in the top-right corner, select your avatar.
1. Select **Edit profile**.
-1. In the **Commit email** list, select the **Use a private email** option.
+1. In the **Commit email** dropdown list, select **Use a private email**.
1. Select **Update profile settings**.
Every Git-related action uses the private commit email.
diff --git a/doc/user/profile/notifications.md b/doc/user/profile/notifications.md
index aaa311a4097..6de09f5538f 100644
--- a/doc/user/profile/notifications.md
+++ b/doc/user/profile/notifications.md
@@ -13,56 +13,62 @@ You can receive updates about activity in issues, merge requests, epics, and des
For the tool that GitLab administrators can use to send messages to users, read
[Email from GitLab](../../tools/email.md).
-## Receive notifications
+## Who receives notifications
-You receive notifications for one of the following reasons:
+When notifications are enabled for an issue, merge request, or epic, GitLab notifies you of actions
+that happen there.
-- You participate in an issue, merge request, epic, or design. In this context, _participate_ means
- comment or edit.
-- You've [enabled notifications in an issue, merge request, or epic](#notifications-on-issues-merge-requests-and-epics).
-- You configured notifications at the [project](#project-notifications) and/or [group](#group-notifications) level.
+You might receive notifications for one of the following reasons:
-While notifications are enabled, you receive notification of actions occurring in that issue, merge request, or epic.
+- You participate in an issue, merge request, epic, or design. You become a participant when you comment
+ or edit, or someone mentions you.
+- You've [enabled notifications in an issue, merge request, or epic](#notifications-on-issues-merge-requests-and-epics).
+- You've configured notifications for the [project](#change-level-of-project-notifications) or [group](#group-notifications).
NOTE:
Administrators can block notifications, preventing them from being sent.
-## Tune your notifications
+## Edit notification settings
Getting many notifications can be overwhelming. You can tune the notifications you receive.
For example, you might want to be notified about all activity in a specific project.
For other projects, you only want to be notified when you are mentioned by name.
-You can tune the notifications you receive by changing your notification settings:
-
-- [Global notification settings](#global-notification-settings)
-- [Notification scope](#notification-scope)
-- [Notification levels](#notification-levels)
-
-## Edit notification settings
-
These notification settings apply only to you. They do not affect the notifications received by
-anyone else in the same project or group.
+anyone else.
To edit your notification settings:
1. In the top-right corner, select your avatar.
1. Select **Preferences**.
1. On the left sidebar, select **Notifications**.
-1. Edit the desired notification settings. Edited settings are automatically saved and enabled.
+1. Edit the desired global, group, or project notification settings.
+ Edited settings are automatically saved.
-## Notification scope
+### Notification scope
-You can tune the scope of your notifications by selecting different notification levels for each project and group.
+You can tune the scope of your notifications by selecting different notification levels for each
+project and group.
Notification scope is applied from the broadest to most specific levels:
-- **Global (default)**: Your global, or _default_, notification level applies if you
+- Your **global**, or _default_, notification level applies if you
have not selected a notification level for the project or group in which the activity occurred.
-- **Group**: For each group, you can select a notification level. Your group setting
- overrides your default setting.
-- **Project**: For each project, you can select a notification level. Your project
- setting overrides the group setting.
+- Your **group** setting overrides your default setting.
+- Your **project** setting overrides the group setting.
+
+### Notification levels
+
+For each project and group you can select one of the following levels:
+
+| Level | Description |
+| ----------- | ----------------------------------------------------------- |
+| Global | Your global settings apply. |
+| Watch | Receive notifications for any activity. |
+| Participate | Receive notifications for threads you have participated in. |
+| On mention | Receive notifications when you are [mentioned](../project/issues/issue_data_and_actions.md#mentions) in a comment. |
+| Disabled | Receive no notifications. |
+| Custom | Receive notifications for selected events. |
### Global notification settings
@@ -72,19 +78,17 @@ different values for a project or a group.
- **Notification email**: the email address your notifications are sent to.
Defaults to your primary email address.
- **Receive product marketing emails**: select this checkbox to receive
- [periodic emails](#product-marketing-emails) about GitLab features.
+ [periodic emails](#opt-out-of-product-marketing-emails) about GitLab features.
- **Global notification level**: the default [notification level](#notification-levels)
which applies to all your notifications.
- **Receive notifications about your own activity**: select this checkbox to receive
notifications about your own activity. Not selected by default.
-![notification settings](img/notification_global_settings_v13_12.png)
-
### Group notifications
You can select a notification level and email address for each group.
-#### Group notification level
+#### Change level of group notifications
To select a notification level for a group, use either of these methods:
@@ -100,11 +104,12 @@ Or:
1. Select the notification dropdown, next to the bell icon (**{notifications}**).
1. Select the desired [notification level](#notification-levels).
-#### Group notification email address
+#### Change email address used for group notifications
-> Introduced in GitLab 12.0
+> Introduced in GitLab 12.0.
-You can select an email address to receive notifications for each group you belong to. This could be useful, for example, if you work freelance, and want to keep email about clients' projects separate.
+You can select an email address to receive notifications for each group you belong to.
+You can use group notifications, for example, if you work freelance, and want to keep email about clients' projects separate.
1. In the top-right corner, select your avatar.
1. Select **Preferences**.
@@ -112,9 +117,9 @@ You can select an email address to receive notifications for each group you belo
1. Locate the project in the **Groups** section.
1. Select the desired email address.
-### Project notifications
+### Change level of project notifications
-You can select a notification level for each project to help you closely monitor activity in select projects.
+To help you stay up to date, you can select a notification level for each project.
To select a notification level for a project, use either of these methods:
@@ -131,28 +136,20 @@ Or:
1. Select the desired [notification level](#notification-levels).
<i class="fa fa-youtube-play youtube" aria-hidden="true"></i>
-To learn how to be notified when a new release is available, see [Notification for releases](https://www.youtube.com/watch?v=qyeNkGgqmH4).
+To learn how to be notified when a new release is available, watch [Notification for releases](https://www.youtube.com/watch?v=qyeNkGgqmH4).
-### Notification levels
-
-For each project and group you can select one of the following levels:
-
-| Level | Description |
-| ----------- | ----------------------------------------------------------- |
-| Global | Your global settings apply. |
-| Watch | Receive notifications for any activity. |
-| On mention | Receive notifications when [mentioned](../project/issues/issue_data_and_actions.md#mentions) in a comment. |
-| Participate | Receive notifications for threads you have participated in. |
-| Disabled | Turns off notifications. |
-| Custom | Receive notifications for custom selected events. |
-
-### Product marketing emails
+### Opt out of product marketing emails
You can receive emails that teach you about various GitLab features.
-This is enabled by default.
+These emails are enabled by default.
-To opt out, [edit your notification settings](#edit-notification-settings) and clear the
-**Receive product marketing emails** checkbox.
+To opt out:
+
+1. In the top-right corner, select your avatar.
+1. Select **Preferences**.
+1. On the left sidebar, select **Notifications**.
+1. Clear the **Receive product marketing emails** checkbox.
+ Edited settings are automatically saved and enabled.
Disabling these emails does not disable all emails.
Learn how to [opt out of all emails from GitLab](#opt-out-of-all-gitlab-emails).
@@ -175,108 +172,115 @@ Users are notified of the following events:
| Event | Sent to | Settings level |
|------------------------------|---------------------|------------------------------|
-| New release | Project members | Custom notification |
-| Project moved | Project members (1) | (1) not disabled |
+| New release | Project members | Custom notification. |
+| Project moved | Project members | Any other than disabled. |
| Email changed | User | Security email, always sent. |
-| Group access level changed | User | Sent when user group access level is changed |
+| Group access level changed | User | Sent when user group access level is changed. |
| New email added | User | Security email, always sent. |
| New SAML/SCIM user provisioned | User | Sent when a user is provisioned through SAML/SCIM. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/276018) in GitLab 13.8 |
| New SSH key added | User | Security email, always sent. |
-| New user created | User | Sent on user creation, except for OmniAuth (LDAP)|
-| Password changed | User | Security email, always sent when user changes their own password |
-| Password changed by administrator | User | Security email, always sent when an administrator changes the password of another user |
-| Personal access tokens expiring soon <!-- Do not delete or lint this instance of future tense --> | User | Security email, always sent. |
+| New user created | User | Sent on user creation, except for OmniAuth (LDAP). |
+| Password changed | User | Security email, always sent when user changes their own password. |
+| Password changed by administrator | User | Security email, always sent when an administrator changes the password of another user. |
+| Personal access tokens expiring soon | User | Security email, always sent. |
| Personal access tokens have expired | User | Security email, always sent. |
-| Project access level changed | User | Sent when user project access level is changed |
-| SSH key has expired | User | Security email, always sent. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/322637) in GitLab 13.12 |
+| Project access level changed | User | Sent when user project access level is changed. |
+| SSH key has expired | User | Security email, always sent. _[Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/322637) in GitLab 13.12._ |
| Two-factor authentication disabled | User | Security email, always sent. |
-| User added to group | User | Sent when user is added to group |
-| User added to project | User | Sent when user is added to project |
+| User added to group | User | Sent when user is added to group. |
+| User added to project | User | Sent when user is added to project. |
## Notifications on issues, merge requests, and epics
-To enable notifications on a specific issue, merge request, or epic, you must turn on the
-**Notifications** toggle in the right sidebar.
+You also receive notifications for events happening on
+issues, merge requests, and epics.
-- To subscribe, **turn on** if you are not a participant in the discussion, but want to receive
- notifications on each update.
-- To unsubscribe, **turn off** if you are receiving notifications for updates but no longer want to
- receive them, unsubscribe from it.
-
-Turning this toggle off only unsubscribes you from updates related to this issue, merge request, or epic.
-Learn how to [opt out of all emails from GitLab](#opt-out-of-all-gitlab-emails).
-
-Turning notifications on in an epic doesn't automatically subscribe you to the issues linked
-to the epic.
+### Who receives notifications on issues, merge requests, and epics
-For most events, the notification is sent to:
+In issues, merge requests, and epics, for most events, the notification is sent to:
- Participants:
- - The author and assignee of the issue/merge request.
+ - The author and assignee.
- Authors of comments.
- Anyone [mentioned](../project/issues/issue_data_and_actions.md#mentions) by username in the title
- or description of the issue, merge request or epic.
- - Anyone with notification level "Participating" or higher that is mentioned by their username in
- any of the comments on the issue, merge request, or epic.
+ or description.
+ - Anyone mentioned by username in a comment if their notification level is "Participating" or higher.
- Watchers: users with notification level "Watch".
-- Subscribers: anyone who manually subscribed to the issue, merge request, or epic.
-- Custom: Users with notification level "custom" who turned on notifications for any of the events in the following table.
+- Subscribers: anyone who manually subscribed to notifications.
+- Custom: users with notification level "Custom" who turned on notifications for a fitting type of events.
NOTE:
To minimize the number of notifications that do not require any action, in
-[GitLab versions 12.9 and later](https://gitlab.com/gitlab-org/gitlab/-/issues/616), eligible
-approvers are no longer notified for all the activities in their projects. To receive them they have
+[GitLab 12.9 and later](https://gitlab.com/gitlab-org/gitlab/-/issues/616), eligible
+approvers are no longer notified for all the activities in their projects. To turn on such notifications, they have
to change their user notification settings to **Watch** instead.
+### Edit notification settings for issues, merge requests, and epics
+
+To enable notifications on a specific issue, merge request, or epic, you must turn on the
+**Notifications** toggle in the right sidebar.
+
+- To subscribe, **turn on** if you are not a participant in the discussion, but want to receive
+ notifications on each update.
+
+ When you turn notifications on in an epic, you aren't automatically subscribed to the issues linked
+ to the epic.
+
+- To unsubscribe, **turn off** if you are receiving notifications for updates but no longer want to
+ receive them.
+
+ Turning this toggle off only unsubscribes you from updates related to this issue, merge request, or epic.
+ Learn how to [opt out of all emails from GitLab](#opt-out-of-all-gitlab-emails).
+
+### Notification events on issues, merge requests, and epics
+
The following table presents the events that generate notifications for issues, merge requests, and
epics:
| Event | Sent to |
|------------------------|---------|
-| Change milestone issue | Subscribers, participants mentioned, and Custom notification level with this event selected |
-| Change milestone merge request | Subscribers, participants mentioned, and Custom notification level with this event selected |
+| Change milestone issue | Subscribers, participants mentioned, and Custom notification level with this event selected. |
+| Change milestone merge request | Subscribers, participants mentioned, and Custom notification level with this event selected. |
| Close epic | |
| Close issue | |
| Close merge request | |
-| Due issue | Participants and Custom notification level with this event selected |
-| 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 |
+| Due issue | Participants and Custom notification level with this event selected. |
+| 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._ |
| 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 comment | Participants, Watchers, Subscribers, and Custom notification level with this event selected, plus anyone mentioned by `@username` in the comment, with notification level "Mention" or higher |
+| Merge when pipeline succeeds | Author, Participants, Watchers, Subscribers, and Custom notification level with this event selected. Custom notification level is ignored for Author, Watchers and Subscribers. _[Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/211961) in GitLab 13.4._ |
+| Merge request [marked as ready](../project/merge_requests/drafts.md) | Watchers and participants. _[Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/15332) in GitLab 13.10._ |
+| New comment | Participants, Watchers, Subscribers, and Custom notification level with this event selected. Also anyone mentioned by username in the comment, with notification level "Mention" or higher. |
| New epic | |
| New issue | |
| New merge request | |
-| Push to merge request | Participants and Custom notification level with this event selected |
-| Reassign issue | Participants, Watchers, Subscribers, and Custom notification level with this event selected, plus the old assignee |
-| Reassign merge request | Participants, Watchers, Subscribers, and Custom notification level with this event selected, plus the old assignee |
-| Remove milestone issue | Subscribers, participants mentioned, and Custom notification level with this event selected |
-| Remove milestone merge request | Subscribers, participants mentioned, and Custom notification level with this event selected |
+| 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, participants mentioned, and Custom notification level with this event selected. |
+| Remove milestone merge request | Subscribers, participants mentioned, and Custom notification level with this event selected. |
| Reopen epic | |
| Reopen issue | |
| Reopen merge request | |
-| Successful pipeline | The author of the pipeline, if they have the custom notification setting for successful pipelines set. If the pipeline failed previously, a `Fixed pipeline` message is sent for the first successful pipeline after the failure, then a `Successful pipeline` message for any further successful pipelines. |
+| 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
+changed, notifications are sent to any **new** mentions by username as
if they had been mentioned in the original text.
-By default, you don't receive notifications for issues, merge requests, or epics created
-by yourself. You only receive notifications when somebody else comments or adds changes to the ones
-that you've created or mentions you, or when an issue is due soon.
-To always receive notifications on your own issues and so on, you must turn on
-[notifications about your own activity](#global-notification-settings).
-
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.
+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
+[notifications about your own activity](#global-notification-settings).
+
## Notifications on designs
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/217095) in GitLab 13.6.
-Email notifications are sent to the participants when comments are made on a design.
+Email notifications are sent to the participants when someone comments on a design.
The participants are:
@@ -288,7 +292,9 @@ The participants are:
If you no longer wish to receive any email notifications:
-1. [Go to the Notifications settings page.](#edit-notification-settings)
+1. In the top-right corner, select your avatar.
+1. Select **Preferences**.
+1. On the left sidebar, select **Notifications**.
1. Clear the **Receive product marketing emails** checkbox.
1. Set your **Global notification level** to **Disabled**.
1. Clear the **Receive notifications about your own activity** checkbox.
@@ -299,40 +305,43 @@ On self-managed installations, even after doing this, your instance administrato
[can still email you](../../tools/email.md).
To unsubscribe, select the unsubscribe link in one of these emails.
-## Filter email
+## Email headers you can use to filter email
+
+Notification email messages include GitLab-specific headers. To better manage your notifications,
+you can filter the notification emails based on the content of these headers.
-Notification email messages include GitLab-specific headers. You can filter the notification emails based on the content of these headers to better manage your notifications. For example, you could filter all emails for a specific project where you are being assigned either a merge request or issue.
+For example, you could filter all emails from a specific project where you are being assigned a
+a merge request or an issue.
The following table lists all GitLab-specific email headers:
| Header | Description |
|------------------------------------|-------------------------------------------------------------------------|
+| `List-Id` | The path of the project in an RFC 2919 mailing list identifier. You can use it for email organization with filters. |
+| `X-GitLab-(Resource)-ID` | The ID of the resource the notification is for. The resource, for example, can be `Issue`, `MergeRequest`, `Commit`, or another such resource. |
+| `X-GitLab-Discussion-ID` | The ID of the thread the comment belongs to, in notification emails for comments. |
| `X-GitLab-Group-Id` **(PREMIUM)** | The group's ID. Only present on notification emails for epics. |
| `X-GitLab-Group-Path` **(PREMIUM)** | The group's path. Only present on notification emails for epics. |
-| `X-GitLab-Project` | The name of the project the notification belongs to. |
+| [`X-GitLab-NotificationReason`](#x-gitlab-notificationreason) | The reason for the notification. This can be `mentioned`, `assigned`, or `own_activity`. |
+| `X-GitLab-Pipeline-Id` | The ID of the pipeline the notification is for, in notification emails for pipelines. |
| `X-GitLab-Project-Id` | The project's ID. |
| `X-GitLab-Project-Path` | The project's path. |
-| `X-GitLab-(Resource)-ID` | The ID of the resource the notification is for. The resource, for example, can be `Issue`, `MergeRequest`, `Commit`, or another such resource. |
-| `X-GitLab-Discussion-ID` | The ID of the thread the comment belongs to, in notification emails for comments. |
-| `X-GitLab-Pipeline-Id` | The ID of the pipeline the notification is for, in notification emails for pipelines. |
+| `X-GitLab-Project` | The name of the project the notification belongs to. |
| `X-GitLab-Reply-Key` | A unique token to support reply by email. |
-| `X-GitLab-NotificationReason` | The reason for the notification. This can be `mentioned`, `assigned`, or `own_activity`. |
-| `List-Id` | The path of the project in an RFC 2919 mailing list identifier. This is useful for email organization with filters, for example. |
### X-GitLab-NotificationReason
-The `X-GitLab-NotificationReason` header contains the reason for the notification. The value is one of the following, in order of priority:
+The `X-GitLab-NotificationReason` header contains the reason for the notification.
+The value is one of the following, in order of priority:
- `own_activity`
- `assigned`
- `mentioned`
-The reason for the notification is also included in the footer of the notification email. For example an email with the
-reason `assigned` has this sentence in the footer:
+The reason for the notification is also included in the footer of the notification email.
+For example, an email with the reason `assigned` has this sentence in the footer:
-- `You are receiving this email because you have been assigned an item on <configured GitLab hostname>.`
-
-Notification of other events is being considered for inclusion in the `X-GitLab-NotificationReason` header. For details, see this [related issue](https://gitlab.com/gitlab-org/gitlab/-/issues/20689).
+> You are receiving this email because you have been assigned an item on \<configured GitLab hostname>.
For example, an alert notification email can have one of
[the alert's](../../operations/incident_management/alerts.md) statuses:
@@ -341,3 +350,6 @@ For example, an alert notification email can have one of
- `alert_acknowledged`
- `alert_resolved`
- `alert_ignored`
+
+Expanding the list of events included in the `X-GitLab-NotificationReason` header is tracked in
+[issue 20689](https://gitlab.com/gitlab-org/gitlab/-/issues/20689).
diff --git a/doc/user/project/badges.md b/doc/user/project/badges.md
index 64a375c6a1d..d54edc7e6d3 100644
--- a/doc/user/project/badges.md
+++ b/doc/user/project/badges.md
@@ -24,14 +24,16 @@ If you find that you have to add the same badges to several projects, you may wa
To add a new badge to a project:
-1. Navigate to your project's **Settings > General > Badges**.
+1. On the top bar, select **Menu > Projects** and find your project.
+1. On the left sidebar, select **Settings > General**.
+1. Expand **Badges**.
1. Under "Link", enter the URL that the badges should point to and under
"Badge image URL" the URL of the image that should be displayed.
-1. Submit the badge by clicking the **Add badge** button.
+1. Select **Add badge**.
After adding a badge to a project, you can see it in the list below the form.
-You can edit it by clicking on the pen icon next to it or to delete it by
-clicking on the trash icon.
+You can edit the badge by selecting **Edit** (**{pencil}**) next to it or delete it by
+selecting **Delete** (**{remove}**).
Badges associated with a group can only be edited or deleted on the
[group level](#group-badges).
@@ -42,13 +44,15 @@ A common project badge presents the GitLab CI pipeline status.
To add this badge to a project:
-1. Navigate to your project's **Settings > General > Badges**.
+1. On the top bar, select **Menu > Projects** and find your project.
+1. On the left sidebar, select **Settings > General**.
+1. Expand **Badges**.
1. Under **Name**, enter _Pipeline Status_.
1. Under **Link**, enter the following URL:
`https://gitlab.com/%{project_path}/-/commits/%{default_branch}`
1. Under **Badge image URL**, enter the following URL:
`https://gitlab.com/%{project_path}/badges/%{default_branch}/pipeline.svg`
-1. Submit the badge by clicking the **Add badge** button.
+1. Select **Add badge**.
## Group badges
@@ -60,14 +64,16 @@ project, consider adding them on the [project level](#project-badges) or use
To add a new badge to a group:
-1. Navigate to your group's **Settings > General > Badges**.
+1. On the top bar, select **Menu > Groups** and find your group.
+1. On the left sidebar, select **Settings > General**.
+1. Expand **Badges**.
1. Under "Link", enter the URL that the badges should point to and under
"Badge image URL" the URL of the image that should be displayed.
-1. Submit the badge by clicking the **Add badge** button.
+1. Select **Add badge**.
After adding a badge to a group, you can see it in the list below the form.
-You can edit the badge by clicking on the pen icon next to it or to delete it
-by clicking on the trash icon.
+You can edit the badge by selecting **Edit** (**{pencil}**) next to it or delete it by
+selecting **Delete** (**{remove}**).
Badges directly associated with a project can be configured on the
[project level](#project-badges).
@@ -108,7 +114,8 @@ https://gitlab.example.com/<project_path>/-/raw/<default_branch>/my-image.svg
To add a new badge to a group or project with a custom image:
-1. Go to your group or project and select **Settings > General**.
+1. On the top bar, select **Menu** and find your group or project.
+1. On the left sidebar, select **Settings > General**.
1. Expand **Badges**.
1. Under **Name**, enter the name for the badge.
1. Under **Link**, enter the URL that the badge should point to.
diff --git a/doc/user/project/canary_deployments.md b/doc/user/project/canary_deployments.md
index b4723294438..6d1fb0f6755 100644
--- a/doc/user/project/canary_deployments.md
+++ b/doc/user/project/canary_deployments.md
@@ -90,7 +90,7 @@ canary deployment is promoted to production.
Here's an example setup flow from scratch:
1. Prepare an [Auto DevOps-enabled](../../topics/autodevops/index.md) project.
-1. Set up a [Kubernetes Cluster](../../user/project/clusters/index.md) in your project.
+1. Set up a [Kubernetes Cluster](../../user/infrastructure/clusters/index.md) in your project.
1. Install [NGINX Ingress](https://github.com/kubernetes/ingress-nginx/tree/master/charts/ingress-nginx) in your cluster.
1. Set up [the base domain](../../user/project/clusters/gitlab_managed_clusters.md#base-domain) based on the Ingress
Endpoint assigned above.
diff --git a/doc/user/project/clusters/add_eks_clusters.md b/doc/user/project/clusters/add_eks_clusters.md
index f7dd24fcfad..0db0f14b633 100644
--- a/doc/user/project/clusters/add_eks_clusters.md
+++ b/doc/user/project/clusters/add_eks_clusters.md
@@ -4,23 +4,37 @@ group: Configure
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# EKS clusters (DEPRECATED) **(FREE)**
+# Connect EKS clusters through cluster certificates **(FREE)**
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/22392) in GitLab 12.5.
-> - [Deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/327908) in GitLab 14.0.
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/22392) in GitLab 12.5.
WARNING:
-Use [Infrastructure as Code](../../infrastructure/index.md) to create new clusters. The method described in this document is deprecated as of GitLab 14.0.
+Use [Infrastrucure as Code](../../infrastructure/iac/index.md#create-a-new-cluster-through-iac)
+to create new clusters.
Through GitLab, you can create new clusters and add existing clusters hosted on Amazon Elastic
Kubernetes Service (EKS).
-## Add an existing EKS cluster
+## Connect an existing EKS cluster
-If you already have an EKS cluster and want to integrate it with GitLab,
-see how to [add an existing cluster](add_existing_cluster.md).
+If you already have an EKS cluster and want to connect it to GitLab,
+use the [GitLab Kubernetes Agent](../../clusters/agent/index.md).
-## Create a new certificate-based EKS cluster
+Alternatively, you can [connect them with cluster certificates](add_existing_cluster.md),
+although this method is not recommended for [security implications](../../infrastructure/clusters/connect/index.md#security-implications-for-clusters-connected-with-certificates).
+
+## Create a new EKS cluster
+
+To create a new cluster from GitLab, use [Infrastructure as Code](../../infrastructure/iac/index.md#create-a-new-cluster-through-iac).
+
+Alternatively, you can [create new EKS clusters using cluster certificates](#how-to-create-a-new-cluster-on-eks-through-cluster-certificates-deprecated).
+Although still available on the GitLab UI, this method was deprecated
+in GitLab 14.0 and is scheduled for removal in GitLab 15.0.
+It also has [security implications](../../infrastructure/clusters/connect/index.md#security-implications-for-clusters-connected-with-certificates).
+
+### How to create a new cluster on EKS through cluster certificates (DEPRECATED)
+
+> [Deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/327908) in GitLab 14.0.
Prerequisites:
@@ -41,9 +55,10 @@ Further steps:
1. [Create a default Storage Class](#create-a-default-storage-class).
1. [Deploy the app to EKS](#deploy-the-app-to-eks).
-### Create a new EKS cluster in GitLab
+#### Create a new EKS cluster in GitLab
-To create a new EKS cluster:
+To create new a EKS cluster for your project, group, or instance, through
+cluster certificates:
1. Go to your:
- Project's **Infrastructure > Kubernetes clusters** page, for a project-level cluster.
diff --git a/doc/user/project/clusters/add_existing_cluster.md b/doc/user/project/clusters/add_existing_cluster.md
index 505c493de4e..3347ef9a437 100644
--- a/doc/user/project/clusters/add_existing_cluster.md
+++ b/doc/user/project/clusters/add_existing_cluster.md
@@ -188,7 +188,7 @@ To add a Kubernetes cluster to your project, group, or instance:
```
1. **GitLab-managed cluster** - Leave this checked if you want GitLab to manage namespaces and service accounts for this cluster.
- See the [Managed clusters section](index.md#gitlab-managed-clusters) for more information.
+ See the [Managed clusters section](gitlab_managed_clusters.md) for more information.
1. **Project namespace** (optional) - You don't have to fill this in. By leaving
it blank, GitLab creates one for you. Also:
- Each project should have a unique namespace.
diff --git a/doc/user/project/clusters/add_gke_clusters.md b/doc/user/project/clusters/add_gke_clusters.md
index 78d4bce737d..0d35e89a560 100644
--- a/doc/user/project/clusters/add_gke_clusters.md
+++ b/doc/user/project/clusters/add_gke_clusters.md
@@ -4,48 +4,55 @@ group: Configure
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# GKE clusters (DEPRECATED) **(FREE)**
-
-> - [Deprecated](https://gitlab.com/groups/gitlab-org/-/epics/6049) in GitLab 14.0.
+# Connect GKE clusters through cluster certificates **(FREE)**
WARNING:
-Use [Infrastructure as Code](../../infrastructure/index.md) to create new clusters. The method described in this document is deprecated as of GitLab 14.0.
+Use [Infrastrucure as Code](../../infrastructure/clusters/connect/new_gke_cluster.md)
+to create a cluster hosted on Google Kubernetes Engine (GKE).
-Through GitLab, you can create new clusters and add existing clusters hosted on Amazon Elastic
-Kubernetes Service (EKS).
+Through GitLab, you can create new and connect existing clusters
+hosted on Google Kubernetes Engine (GKE).
-GitLab supports adding new and existing GKE clusters.
+## Connect an existing GKE cluster
-## GKE requirements
+If you already have a GKE cluster and want to connect it to GitLab,
+use the [GitLab Kubernetes Agent](../../clusters/agent/index.md).
-Before creating your first cluster on Google GKE with GitLab integration, make sure the following
-requirements are met:
+Alternatively, you can [connect them with cluster certificates](add_existing_cluster.md),
+altough this method is not recommended for [security implications](../../infrastructure/clusters/connect/index.md#security-implications-for-clusters-connected-with-certificates).
-- A [billing account](https://cloud.google.com/billing/docs/how-to/manage-billing-account)
- set up with access.
-- The Kubernetes Engine API and related service are enabled. It should work immediately but may
- take up to 10 minutes after you create a project. For more information see the
- ["Before you begin" section of the Kubernetes Engine docs](https://cloud.google.com/kubernetes-engine/docs/quickstart#before-you-begin).
+## Create a new GKE cluster from GitLab
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/25925) in GitLab 12.4, all the GKE clusters provisioned by GitLab are [VPC-native](https://cloud.google.com/kubernetes-engine/docs/how-to/alias-ips).
+
+To create a new GKE cluster from GitLab, use [Infrastructure as Code](../../infrastructure/clusters/connect/new_gke_cluster.md).
-## Add an existing GKE cluster
+Alternatively, you can [create new GKE clusters using cluster certificates](#create-a-new-cluster-on-gke-through-cluster-certificates-deprecated).
+Although still available in the GitLab UI, this method was deprecated
+in GitLab 14.0 and is scheduled for removal in GitLab 15.0.
+It also has [security implications](../../infrastructure/clusters/connect/index.md#security-implications-for-clusters-connected-with-certificates).
-If you already have a GKE cluster and want to integrate it with GitLab,
-see how to [add an existing cluster](add_existing_cluster.md).
+## Create a new cluster on GKE through cluster certificates (DEPRECATED)
-## Create new GKE cluster
+> [Deprecated](https://gitlab.com/groups/gitlab-org/-/epics/6049) in GitLab 14.0.
-Starting from [GitLab 12.4](https://gitlab.com/gitlab-org/gitlab/-/issues/25925), all the GKE clusters
-provisioned by GitLab are [VPC-native](https://cloud.google.com/kubernetes-engine/docs/how-to/alias-ips).
+Prerequisites:
+
+- A [Google Cloud billing account](https://cloud.google.com/billing/docs/how-to/manage-billing-account)
+ set up with access.
+- Kubernetes Engine API and related services enabled. It should work immediately but may
+ take up to 10 minutes after you create a project. For more information see the
+ ["Before you begin" section of the Kubernetes Engine docs](https://cloud.google.com/kubernetes-engine/docs/quickstart#before-you-begin).
Note the following:
- The [Google authentication integration](../../../integration/google.md) must be enabled in GitLab
at the instance level. If that's not the case, ask your GitLab administrator to enable it. On
GitLab.com, this is enabled.
-- Starting from [GitLab 12.1](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/55902), all GKE clusters
+- In [GitLab 12.1](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/55902) and later, all GKE clusters
created by GitLab are RBAC-enabled. Take a look at the [RBAC section](cluster_access.md#rbac-cluster-resources) for
more information.
-- Starting from [GitLab 12.5](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/18341), the
+- In [GitLab 12.5](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/18341) and later, the
cluster's pod address IP range is set to `/16` instead of the regular `/14`. `/16` is a CIDR
notation.
- GitLab requires basic authentication enabled and a client certificate issued for the cluster to
@@ -54,9 +61,8 @@ Note the following:
explicitly requests GKE to create clusters with basic authentication enabled and a client
certificate.
-### Creating the cluster on GKE
-
-To create and add a new Kubernetes cluster to your project, group, or instance:
+To create new Kubernetes clusters to your project, group, or instance, through
+cluster certificates:
1. Navigate to your:
- Project's **{cloud-gear}** **Infrastructure > Kubernetes clusters** page, for a project-level
diff --git a/doc/user/project/clusters/cluster_access.md b/doc/user/project/clusters/cluster_access.md
index 7bf202f6963..452f5727620 100644
--- a/doc/user/project/clusters/cluster_access.md
+++ b/doc/user/project/clusters/cluster_access.md
@@ -32,7 +32,7 @@ The resources created by GitLab differ depending on the type of cluster.
Note the following about access controls:
- Environment-specific resources are only created if your cluster is
- [managed by GitLab](index.md#gitlab-managed-clusters).
+ [managed by GitLab](gitlab_managed_clusters.md).
- If your cluster was created before GitLab 12.2, it uses a single namespace for all project
environments.
diff --git a/doc/user/project/clusters/index.md b/doc/user/project/clusters/index.md
index 791dc90cad5..ac59f874244 100644
--- a/doc/user/project/clusters/index.md
+++ b/doc/user/project/clusters/index.md
@@ -4,77 +4,22 @@ group: Configure
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Kubernetes clusters **(FREE)**
+# Project-level Kubernetes clusters **(FREE)**
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/35954) in GitLab 10.1 for projects.
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/34758) in
-> GitLab 11.6 for [groups](../../group/clusters/index.md).
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/39840) in
-> GitLab 11.11 for [instances](../../instance/clusters/index.md).
+> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/35954) in GitLab 10.1.
-We offer extensive integrations to help you connect and manage your Kubernetes clusters from GitLab.
+[Project-level Kubernetes clusters](../../infrastructure/clusters/connect/index.md#cluster-levels)
+allow you to connect a Kubernetes cluster to a project in GitLab.
-Read through this document to get started.
+You can also [connect multiple clusters](multiple_kubernetes_clusters.md)
+to a single project.
-## Benefit from the GitLab-Kubernetes integration
+After connecting a cluster to GitLab, you can benefit from the large number of
+[GitLab features available for Kubernetes clusters](../../infrastructure/clusters/index.md) to manage and deploy to your cluster.
-Using the GitLab-Kubernetes integration, you can benefit of GitLab
-features such as:
+## View your project-level clusters
-- Create [CI/CD Pipelines](../../../ci/pipelines/index.md) to build, test, and deploy to your cluster.
-- Use [Auto DevOps](#auto-devops) to automate the CI/CD process.
-- Use [role-based or attribute-based access controls](cluster_access.md).
-- Run serverless workloads on [Kubernetes with Knative](serverless/index.md).
-- Connect GitLab to in-cluster applications using [cluster integrations](../../clusters/integrations.md).
-- Use [deploy boards](../deploy_boards.md) to see the health and status of each CI [environment](../../../ci/environments/index.md) running on your Kubernetes cluster.
-- Use [Canary deployments](../canary_deployments.md) to update only a portion of your fleet with the latest version of your application.
-- View your [Kubernetes podlogs](kubernetes_pod_logs.md) directly in GitLab.
-- Connect to your cluster through GitLab [web terminals](deploy_to_cluster.md#web-terminals-for-kubernetes-clusters).
+To view project-level Kubernetes clusters:
-## Supported cluster versions
-
-See the [Kubernetes clusters versions supported by GitLab](../../infrastructure/clusters/connect/index.md#supported-cluster-versions).
-
-## Connect your cluster to GitLab
-
-Learn how to [create new and connect existing clusters to GitLab](../../infrastructure/clusters/connect/index.md).
-
-## Cluster integrations
-
-See the available [cluster integrations](../../clusters/integrations.md)
-to integrate third-party applications with your clusters through GitLab.
-
-## Cluster management project
-
-Attach a [Cluster management project](../../clusters/management_project.md)
-to your cluster to manage shared resources requiring `cluster-admin` privileges for
-installation, such as an Ingress controller.
-
-## GitLab-managed clusters
-
-See how to allow [GitLab to manage your cluster for you](gitlab_managed_clusters.md).
-
-## Auto DevOps
-
-You can use [Auto DevOps](../../../topics/autodevops/index.md) to automatically
-detect, build, test, deploy, and monitor your applications.
-
-## Deploying to a Kubernetes cluster
-
-See how to [deploy to your Kubernetes cluster](deploy_to_cluster.md) from GitLab.
-
-## Monitoring your Kubernetes cluster
-
-Automatically detect and monitor Kubernetes metrics. Automatic monitoring of
-[NGINX Ingress](../integrations/prometheus_library/nginx.md) is also supported.
-
-[Read more about Kubernetes monitoring](../integrations/prometheus_library/kubernetes.md)
-
-### Visualizing cluster health
-
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/4701) in [GitLab Ultimate](https://about.gitlab.com/pricing/) 10.6.
-> - [Moved](https://gitlab.com/gitlab-org/gitlab/-/issues/208224) to GitLab Free in 13.2.
-
-When [the Prometheus cluster integration is enabled](../../clusters/integrations.md#prometheus-cluster-integration), GitLab monitors the cluster's health. At the top of the cluster settings page, CPU and Memory utilization is displayed, along with the total amount available. Keeping an eye on cluster resources can be important, if the cluster runs out of memory pods may be shutdown or fail to start.
-
-![Cluster Monitoring](img/k8s_cluster_monitoring.png)
+1. On the top bar, select **Menu > Projects** and find your project.
+1. On the left sidebar, select **Infrastructure > Kubernetes clusters**.
diff --git a/doc/user/project/clusters/protect/container_network_security/quick_start_guide.md b/doc/user/project/clusters/protect/container_network_security/quick_start_guide.md
index 1940cf229b8..283e6c0b81c 100644
--- a/doc/user/project/clusters/protect/container_network_security/quick_start_guide.md
+++ b/doc/user/project/clusters/protect/container_network_security/quick_start_guide.md
@@ -57,7 +57,7 @@ to install Cilium in your Kubernetes cluster.
```
1. Merge or push these changes to the default branch of your cluster management project,
-and [GitLab CI/CD](../../../../../ci/README.md) will automatically install Cilium.
+and [GitLab CI/CD](../../../../../ci/index.md) will automatically install Cilium.
WARNING:
Installation and removal of the Cilium requires a **manual**
diff --git a/doc/user/project/clusters/runbooks/index.md b/doc/user/project/clusters/runbooks/index.md
index 7357fc850e5..9d623518f72 100644
--- a/doc/user/project/clusters/runbooks/index.md
+++ b/doc/user/project/clusters/runbooks/index.md
@@ -63,8 +63,9 @@ information.
Follow this step-by-step guide to configure an executable runbook in GitLab using
the components outlined above and the pre-loaded demo runbook.
-1. Create an [OAuth Application for JupyterHub](../../../../integration/oauth_provider.md#gitlab-as-an-oauth-20-authentication-service-provider).
-1. When [installing JupyterHub with Helm](https://zero-to-jupyterhub.readthedocs.io/en/latest/jupyterhub/installation.html), use the following values
+1. Create an [OAuth application for JupyterHub](../../../../integration/oauth_provider.md).
+1. When [installing JupyterHub with Helm](https://zero-to-jupyterhub.readthedocs.io/en/latest/jupyterhub/installation.html),
+ use the following values:
```yaml
#-----------------------------------------------------------------------------
diff --git a/doc/user/project/clusters/serverless/index.md b/doc/user/project/clusters/serverless/index.md
index fb32579f40e..f6598f8846b 100644
--- a/doc/user/project/clusters/serverless/index.md
+++ b/doc/user/project/clusters/serverless/index.md
@@ -282,7 +282,7 @@ Explanation of the fields used above:
|-----------|-------------|
| `name` | Indicates which provider is used to execute the `serverless.yml` file. In this case, the TriggerMesh middleware. |
| `envs` | Includes the environment variables to be passed as part of function execution for **all** functions in the file, where `FOO` is the variable name and `BAR` are the variable contents. You may replace this with your own variables. |
-| `secrets` | Includes the contents of the Kubernetes secret as environment variables accessible to be passed as part of function execution for **all** functions in the file. The secrets are expected in INI format. |
+| `secrets` | Includes the contents of the Kubernetes secret as environment variables accessible to be passed as part of function execution for **all** functions in the file. The secrets are expected in `INI` format. |
### `functions`
@@ -296,7 +296,7 @@ subsequent lines contain the function attributes.
| `runtime` (optional)| The runtime to be used to execute the function. This can be a runtime alias (see [Runtime aliases](#runtime-aliases)), or it can be a full URL to a custom runtime repository. When the runtime is not specified, we assume that `Dockerfile` is present in the function directory specified by `source`. |
| `description` | A short description of the function. |
| `envs` | Sets an environment variable for the specific function only. |
-| `secrets` | Includes the contents of the Kubernetes secret as environment variables accessible to be passed as part of function execution for the specific function only. The secrets are expected in INI format. |
+| `secrets` | Includes the contents of the Kubernetes secret as environment variables accessible to be passed as part of function execution for the specific function only. The secrets are expected in `INI` format. |
### Deployment
diff --git a/doc/user/project/deploy_boards.md b/doc/user/project/deploy_boards.md
index 05f026cca18..6e2635b89f0 100644
--- a/doc/user/project/deploy_boards.md
+++ b/doc/user/project/deploy_boards.md
@@ -90,7 +90,7 @@ To display the deploy boards for a specific [environment](../../ci/environments/
1. [Configure GitLab Runner](../../ci/runners/index.md) with the [`docker`](https://docs.gitlab.com/runner/executors/docker.html) or
[`kubernetes`](https://docs.gitlab.com/runner/executors/kubernetes.html) executor.
-1. Configure the [Kubernetes integration](clusters/index.md) in your project for the
+1. Configure the [Kubernetes integration](../infrastructure/clusters/index.md) in your project for the
cluster. The Kubernetes namespace is of particular note as you need it
for your deployment scripts (exposed by the `KUBE_NAMESPACE` deployment variable).
1. Ensure Kubernetes annotations of `app.gitlab.com/env: $CI_ENVIRONMENT_SLUG`
diff --git a/doc/user/project/deploy_keys/index.md b/doc/user/project/deploy_keys/index.md
index e9a38f91677..61dccf1cb1b 100644
--- a/doc/user/project/deploy_keys/index.md
+++ b/doc/user/project/deploy_keys/index.md
@@ -10,9 +10,10 @@ type: howto, reference
Deploy keys allow read-only or read-write access to your
repositories by importing an SSH public key into your GitLab instance.
-This is useful, for example, for cloning repositories to your Continuous
-Integration (CI) server. By using deploy keys, you don't have to set up a
-fake user account.
+Deploy keys streamline interactions between your GitLab repository and another
+machine. For example, setting up a deploy key allows secure cloning of your
+repositories to a Continuous Integration (CI) server without setting up a fake
+user account.
There are two types of deploy keys:
@@ -63,11 +64,12 @@ help you access a repository, but there are some notables differences between th
- Deploy keys are shareable between projects that are not related or don't even
belong to the same group. Deploy tokens belong to either a project or
[a group](../deploy_tokens/index.md#group-deploy-token).
-- A deploy key is an SSH key you need to generate yourself on your machine. A deploy
- token is generated by your GitLab instance, and is provided to users only once
- (at creation time).
-- A deploy key is valid as long as it's registered and enabled. Deploy tokens can
- be time-sensitive, as you can control their validity by setting an expiration date to them.
+- A deploy key is an SSH key you generate on the **remote machine**. A deploy
+ token, on the other hand, is generated by your **GitLab instance**, and is
+ provided to users only once (at creation time).
+- A deploy key is valid as long as it's registered and enabled. Deploy tokens
+ can be time-sensitive, as you can control their validity by setting an
+ expiration date to them.
- You can't log in to a registry with deploy keys, or perform read / write operations
on it, but this [is possible with deploy tokens](../deploy_tokens/index.md#gitlab-deploy-token).
- You need an SSH key pair to use deploy keys, but not deploy tokens.
@@ -115,9 +117,9 @@ project, and if you then update the access level for this key from `read-only` t
### Public deploy keys
-Public deploy keys allow `read-only` or `read-write`
-access to any repository in your GitLab instance. This is useful for integrating
-repositories to secure, shared services, such as CI/CD.
+Public deploy keys allow `read-only` or `read-write` access to any repository in
+your GitLab instance. This allows for the integration of your repositories to
+secure, shared services, such as CI/CD.
Instance administrators can add public deploy keys:
@@ -125,32 +127,37 @@ Instance administrators can add public deploy keys:
1. On the left sidebar, select **Deploy Keys**.
1. Select **New deploy key**.
- Make sure your new key has a meaningful title, as it is the primary way for project
- maintainers and owners to identify the correct public deploy key to add. For example,
- if the key gives access to a SaaS CI/CD instance, use the name of that service
- in the key name if that is all the key is used for.
+Make sure your new key has a meaningful title. This title is the primary
+way for project maintainers and owners to identify the correct public deploy key
+to add to a repository or project. For example, the key you set up might be
+intended to give access to a SaaS CI/CD instance. In this case use the name of
+that service in the key title if that is all the key is used for.
![Public deploy keys section](img/public_deploy_key_v13_0.png)
-After adding a key, it's available to any shared systems. Project maintainers
-or higher can [authorize a public deploy key](#project-deploy-keys) to start using it with the project.
+After adding a key, it's available to any shared system. Users with a maintainer role or
+higher can [authorize a public deploy key](#project-deploy-keys) to start using
+it with the project.
NOTE:
-The **Publicly accessible deploy keys** tab within Project's CI/CD settings only appears
-if there is at least one Public deploy key configured.
+The **Publicly accessible deploy keys** tab in a Project's CI/CD
+settings only appears if there is at least one Public deploy key configured.
-Public deploy keys can provide greater security compared to project deploy keys, as
-the administrator of the target integrated system is the only one who needs to know the key value,
-or configure it.
+Public deploy keys can provide greater security compared to project deploy keys.
+This is because the administrator of the target integrated system is the only
+entity who needs to know or configure the key value.
-When creating a Public deploy key, determine whether or not it can be defined for
-very narrow usage, such as just a specific service, or if it needs to be defined for
-broader usage, such as full `read-write` access for all services.
+When creating a Public deploy key, consider what scope and permissions are
+required for it across the entire GitLab instance. For very narrow usage, such
+as a single specific service, a `read-only` deploy key tied to this service is
+best. If the service entails broader usage across the instance, a
+deploy key with full `read-write` access is more appropriate.
WARNING:
-Adding a public deploy key does not immediately expose any repository to it. Public
-deploy keys enable access from other systems, but access is not given to any project
-until a project maintainer chooses to make use of it.
+Adding a public deploy key **does not** immediately expose any repository
+to the remote machine. Access to a project is only given when a project
+maintainer chooses to make use of a deploy key in the project's
+configuration.
## How to disable deploy keys
@@ -162,22 +169,29 @@ can remove or disable a deploy key for a project repository:
1. Select the **{remove}** or **{cancel}** button.
NOTE:
-If anything relies on the removed deploy key, it will stop working once removed.
+Any service that relies on a deploy key stops working after that key is removed.
-If the key is **publicly accessible**, it will be removed from the project, but still available under **Publicly accessible deploy keys**.
+If the key is **publicly accessible**, it is removed from the project, but can
+still be found under **Publicly accessible deploy keys**.
-If the key is **privately accessible** and only in use by this project, it will deleted.
+If the key is **privately accessible** and only in use by this project, it is
+deleted entirely from GitLab on removal.
-If the key is **privately accessible** and in use by other projects, it will be removed from the project, but still available under **Privately accessible deploy keys**.
+If the key is **privately accessible** and also in use by other projects, it is
+removed from the project, but still available under **Privately accessible
+deploy keys**.
## Troubleshooting
### Deploy key cannot push to a protected branch
-If the owner of this deploy key doesn't have access to a [protected
-branch](../protected_branches.md), then this deploy key doesn't have access to
-the branch either. In addition to this, choosing the **No one** value in
-[the "Allowed to push" section](../protected_branches.md#configure-a-protected-branch)
-means that no users **and** no services using deploy keys can push to that selected branch.
+There are a few scenarios where a deploy key will fail to push to a [protected
+branch](../protected_branches.md).
-Refer to [this issue](https://gitlab.com/gitlab-org/gitlab/-/issues/30769) for more information.
+- The owner associated to a deploy key does not have access to the protected branch.
+- The owner associated to a deploy key does not have [membership](../members/index.md) to the project of the protected branch.
+- **No one** is selected in [the "Allowed to push" section](../protected_branches.md#configure-a-protected-branch) of the protected branch.
+
+All deploy keys are associated to an account. Since the permissions for an account can change, this might lead to scenarios where a deploy key that was working is suddenly unable to push to a protected branch.
+
+We recommend you create a service account, and associate a deploy key to the service account, for projects using deploy keys.
diff --git a/doc/user/project/deploy_tokens/index.md b/doc/user/project/deploy_tokens/index.md
index 1798aa0c1c6..483de3b21bd 100644
--- a/doc/user/project/deploy_tokens/index.md
+++ b/doc/user/project/deploy_tokens/index.md
@@ -2,12 +2,10 @@
stage: Release
group: Release
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
-type: howto
---
# Deploy tokens
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/17894) in GitLab 10.7.
> - [Moved](https://gitlab.com/gitlab-org/gitlab/-/issues/199370) from **Settings > Repository** in GitLab 12.9.
> - [Added `write_registry` scope](https://gitlab.com/gitlab-org/gitlab/-/issues/22743) in GitLab 12.10.
> - [Moved](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/29280) from **Settings > CI/CD** in GitLab 12.10.1.
@@ -59,8 +57,8 @@ following table along with GitLab version it was introduced in:
| Scope | Description | Introduced in GitLab Version |
|--------------------------|-------------|------------------------------|
-| `read_repository` | Allows read-access to the repository through `git clone` | 10.7 |
-| `read_registry` | Allows read-access to [container registry](../../packages/container_registry/index.md) images if a project is private and authorization is required. | 10.7 |
+| `read_repository` | Allows read-access to the repository through `git clone` | -- |
+| `read_registry` | Allows read-access to [container registry](../../packages/container_registry/index.md) images if a project is private and authorization is required. | -- |
| `write_registry` | Allows write-access (push) to [container registry](../../packages/container_registry/index.md). | 12.10 |
| `read_package_registry` | Allows read access to the package registry. | 13.0 |
| `write_package_registry` | Allows write access to the package registry. | 13.0 |
@@ -185,8 +183,6 @@ To pull images from the Dependency Proxy, you must:
### GitLab deploy token
-> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/18414) in GitLab 10.8.
-
There's a special case when it comes to deploy tokens. If a user creates one
named `gitlab-deploy-token`, the username and token of the deploy token is
automatically exposed to the CI/CD jobs as CI/CD variables: `CI_DEPLOY_USER`
@@ -203,3 +199,18 @@ NOTE:
The special handling for the `gitlab-deploy-token` deploy token is not
implemented for group deploy tokens. To make the group-level deploy token available for
CI/CD jobs, the `CI_DEPLOY_USER` and `CI_DEPLOY_PASSWORD` variables should be set under **Settings** to the name and token of the group deploy token respectively.
+
+## Troubleshooting
+
+### Group deploy tokens and LFS
+
+A bug
+[prevents Group Deploy Tokens from cloning LFS objects](https://gitlab.com/gitlab-org/gitlab/-/issues/235398).
+If you receive `404 Not Found` errors and this error,
+use a Project Deploy Token to work around the bug:
+
+```plaintext
+api error: Repository or object not found:
+https://<URL-with-token>.git/info/lfs/objects/batch
+Check that it exists and that you have proper access to it
+```
diff --git a/doc/user/project/file_lock.md b/doc/user/project/file_lock.md
index 5ffde38b348..db8c6f24063 100644
--- a/doc/user/project/file_lock.md
+++ b/doc/user/project/file_lock.md
@@ -49,7 +49,7 @@ This process allows you to lock single files or file extensions and it is
done through the command line. It doesn't require GitLab paid subscriptions.
Git LFS is well known for tracking files to reduce the storage of
-Git repositories, but it can also be user for [locking files](https://github.com/git-lfs/git-lfs/wiki/File-Locking).
+Git repositories, but it can also be used for [locking files](https://github.com/git-lfs/git-lfs/wiki/File-Locking).
This is the method used for Exclusive File Locks.
### Install Git LFS
diff --git a/doc/user/project/import/bitbucket_server.md b/doc/user/project/import/bitbucket_server.md
index 7ccdb632c19..2715804b37a 100644
--- a/doc/user/project/import/bitbucket_server.md
+++ b/doc/user/project/import/bitbucket_server.md
@@ -126,6 +126,6 @@ Feature.disable(:bitbucket_server_user_mapping_by_username)
If the GUI-based import tool does not work, you can try to:
- Use the [GitLab Import API](../../../api/import.md#import-repository-from-bitbucket-server) Bitbucket server endpoint.
-- Set up [Repository Mirroring](../repository/repository_mirroring.md), which provides verbose error output.
+- Set up [Repository Mirroring](../repository/mirror/index.md), which provides verbose error output.
See the [troubleshooting](bitbucket.md#troubleshooting) section for [Bitbucket](bitbucket.md).
diff --git a/doc/user/project/import/gitea.md b/doc/user/project/import/gitea.md
index 9364ac4f954..3bbc70b4337 100644
--- a/doc/user/project/import/gitea.md
+++ b/doc/user/project/import/gitea.md
@@ -1,5 +1,4 @@
---
-type: reference, howto
stage: Manage
group: Import
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
@@ -10,30 +9,30 @@ info: To determine the technical writer assigned to the Stage/Group associated w
Import your projects from Gitea to GitLab with minimal effort.
NOTE:
-This requires Gitea `v1.0.0` or newer.
+This requires Gitea `v1.0.0` or later.
The Gitea importer can import:
-- Repository description (GitLab 8.15+)
-- Git repository data (GitLab 8.15+)
-- Issues (GitLab 8.15+)
-- Pull requests (GitLab 8.15+)
-- Milestones (GitLab 8.15+)
-- Labels (GitLab 8.15+)
+- Repository description
+- Git repository data
+- Issues
+- Pull requests
+- Milestones
+- Labels
When importing, repository public access is retained. If a repository is private in Gitea, it's
created as private in GitLab as well.
## How it works
-Since Gitea is currently not an OAuth provider, author/assignee cannot be mapped
-to users in your GitLab instance. This means that the project creator (most of
-the times the current user that started the import process) is set as the author,
-but a reference on the issue about the original Gitea author is kept.
+Because Gitea isn't an OAuth provider, author/assignee can't be mapped to users
+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 or in
-the case the namespace is taken, the repository is imported under the user's
-namespace that started the import process.
+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
@@ -41,7 +40,7 @@ The importer page is visible when you create a new project.
![New project page on GitLab](img/import_projects_from_new_project_page.png)
-Click the **Gitea** link and the import authorization process starts.
+Select the **Gitea** link to start the import authorization process.
![New Gitea project import](img/import_projects_from_gitea_new_import.png)
@@ -52,13 +51,13 @@ GitLab access your repositories:
1. Go to `https://your-gitea-instance/user/settings/applications` (replace
`your-gitea-instance` with the host of your Gitea instance).
-1. Click **Generate New Token**.
+1. Select **Generate New Token**.
1. Enter a token description.
-1. Click **Generate Token**.
+1. Select **Generate Token**.
1. Copy the token hash.
1. Go back to GitLab and provide the token to the Gitea importer.
-1. Hit the **List Your Gitea Repositories** button and wait while GitLab reads
- your repositories' information. Once done, you are taken to the importer
+1. Select **List Your Gitea Repositories** and wait while GitLab reads
+ your repositories' information. After it's done, GitLab displays the importer
page to select the repositories to import.
### Select which repositories to import
@@ -66,19 +65,19 @@ GitLab access your repositories:
After you've authorized access to your Gitea repositories, you are
redirected to the Gitea importer page.
-From there, you can see the import statuses of your Gitea repositories.
+From there, you can view the import statuses of your Gitea repositories:
-- Those that are being imported show a _started_ status,
-- those already successfully imported are green with a _done_ status,
-- whereas those that are not yet imported have an **Import** button on the
+- Those that are being imported show a _started_ status.
+- Those already successfully imported are green with a _done_ status.
+- Those that aren't yet imported have an **Import** button on the
right side of the table.
You also can:
-- Import all your Gitea projects in one go by hitting **Import all projects** in
- the upper left corner.
-- Filter projects by name. If filter is applied, hitting **Import all projects**
- only imports matched projects.
+- Import all of your Gitea projects in one go by selecting **Import all projects**
+ in the upper left corner.
+- Filter projects by name. If filter is applied, selecting **Import all projects**
+ imports only matched projects.
![Gitea importer page](img/import_projects_from_gitea_importer_v12_3.png)
diff --git a/doc/user/project/import/github.md b/doc/user/project/import/github.md
index 4443ae902fb..eff733b0b3d 100644
--- a/doc/user/project/import/github.md
+++ b/doc/user/project/import/github.md
@@ -162,7 +162,7 @@ your GitHub repositories are listed.
## Mirror a repository and share pipeline status
-Depending on your GitLab tier, [repository mirroring](../repository/repository_mirroring.md) can be set up to keep
+Depending on your GitLab tier, [repository mirroring](../repository/mirror/index.md) can be set up to keep
your imported repository in sync with its GitHub copy.
Additionally, you can configure GitLab to send pipeline status updates back GitHub with the
diff --git a/doc/user/project/import/index.md b/doc/user/project/import/index.md
index 65e1eafa477..887eb546148 100644
--- a/doc/user/project/import/index.md
+++ b/doc/user/project/import/index.md
@@ -47,7 +47,7 @@ information, see [the import notes](../settings/import_export.md#important-notes
NOTE:
When migrating to GitLab.com, you must create users manually unless [SCIM](../../../user/group/saml_sso/scim_setup.md)
will be used. Creating users with the API is limited to self-managed instances as it requires
-administrator access.
+the Administrator role.
To migrate all data from self-managed to GitLab.com, you can leverage the [API](../../../api/index.md).
Migrate the assets in this order:
diff --git a/doc/user/project/index.md b/doc/user/project/index.md
index 8c81af418a0..f3173736e9b 100644
--- a/doc/user/project/index.md
+++ b/doc/user/project/index.md
@@ -1,6 +1,6 @@
---
-stage: Create
-group: Source Code
+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/engineering/ux/technical-writing/#assignments"
type: reference
---
@@ -31,7 +31,7 @@ Projects include the following [features](https://about.gitlab.com/features/):
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/repository_mirroring.md)
+ - [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)
@@ -81,7 +81,7 @@ Projects include the following [features](https://about.gitlab.com/features/):
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](clusters/index.md): Connect your GitLab project
+ - [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. **(PREMIUM)**
diff --git a/doc/user/project/integrations/asana.md b/doc/user/project/integrations/asana.md
index e1e926da19b..963fca34827 100644
--- a/doc/user/project/integrations/asana.md
+++ b/doc/user/project/integrations/asana.md
@@ -4,9 +4,9 @@ group: Integrations
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Asana service **(FREE)**
+# Asana integration **(FREE)**
-This service adds commit messages as comments to Asana tasks.
+This integration adds commit messages as comments to Asana tasks.
Once enabled, commit messages are checked for Asana task URLs (for example,
`https://app.asana.com/0/123456/987654`) or task IDs starting with `#`
(for example, `#987654`). Every task ID found gets the commit comment added to it.
@@ -23,7 +23,7 @@ You can use either of these words:
- `closed`
- `closing`
-See also the [Asana service API documentation](../../../api/services.md#asana).
+See also the [Asana integration API documentation](../../../api/integrations.md#asana).
## Setup
diff --git a/doc/user/project/integrations/github.md b/doc/user/project/integrations/github.md
index 4908d21e764..3177aaefb75 100644
--- a/doc/user/project/integrations/github.md
+++ b/doc/user/project/integrations/github.md
@@ -18,7 +18,7 @@ and is automatically configured on [GitHub import](../../../integration/github.m
## Configuration
-This integration requires a [GitHub API token](https://docs.github.com/en/github/authenticating-to-github/keeping-your-account-and-data-secure/creating-a-personal-access-token)
+This integration requires a [GitHub API token](https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/creating-a-personal-access-token)
with `repo:status` access granted.
Complete these steps on GitHub:
diff --git a/doc/user/project/integrations/img/slack_setup.png b/doc/user/project/integrations/img/slack_setup.png
index 8acae659fb4..d8aedf84be5 100644
--- a/doc/user/project/integrations/img/slack_setup.png
+++ b/doc/user/project/integrations/img/slack_setup.png
Binary files differ
diff --git a/doc/user/project/integrations/img/unify_circuit_configuration.png b/doc/user/project/integrations/img/unify_circuit_configuration.png
deleted file mode 100644
index adba065347f..00000000000
--- a/doc/user/project/integrations/img/unify_circuit_configuration.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/project/integrations/img/webhook_logs.png b/doc/user/project/integrations/img/webhook_logs.png
index 24bb593c7d0..05d068fd119 100644
--- a/doc/user/project/integrations/img/webhook_logs.png
+++ b/doc/user/project/integrations/img/webhook_logs.png
Binary files differ
diff --git a/doc/user/project/integrations/img/webhook_testing.png b/doc/user/project/integrations/img/webhook_testing.png
index acfebf473b9..27836556acc 100644
--- a/doc/user/project/integrations/img/webhook_testing.png
+++ b/doc/user/project/integrations/img/webhook_testing.png
Binary files differ
diff --git a/doc/user/project/integrations/img/zentao_product_id.png b/doc/user/project/integrations/img/zentao_product_id.png
deleted file mode 100644
index a91b4c3f82d..00000000000
--- a/doc/user/project/integrations/img/zentao_product_id.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/project/integrations/mattermost_slash_commands.md b/doc/user/project/integrations/mattermost_slash_commands.md
index 8027cc1c61e..1ff558b569b 100644
--- a/doc/user/project/integrations/mattermost_slash_commands.md
+++ b/doc/user/project/integrations/mattermost_slash_commands.md
@@ -16,7 +16,7 @@ separately configured [Mattermost Notifications Service](mattermost.md).
## Prerequisites
-Mattermost [3.4 or later](https://mattermost.com/blog/category/releases/) is required.
+Mattermost [3.4 or later](https://mattermost.com/blog/category/platform/releases/) is required.
GitLab provides different methods of configuring Mattermost slash commands, depending
on your configuration:
diff --git a/doc/user/project/integrations/overview.md b/doc/user/project/integrations/overview.md
index a6f739c6408..2c154467115 100644
--- a/doc/user/project/integrations/overview.md
+++ b/doc/user/project/integrations/overview.md
@@ -32,7 +32,7 @@ Click on the service links to see further configuration instructions and details
| [Bugzilla](bugzilla.md) | Use Bugzilla as the issue tracker. | **{dotted-circle}** No |
| Buildkite | Run CI/CD pipelines with Buildkite. | **{check-circle}** Yes |
| Campfire | Connect to chat. | **{dotted-circle}** No |
-| [Confluence Workspace](../../../api/services.md#confluence-service) | Replace the link to the internal wiki with a link to a Confluence Cloud Workspace. | **{dotted-circle}** No |
+| [Confluence Workspace](../../../api/integrations.md#confluence-integration) | Replace the link to the internal wiki with a link to a Confluence Cloud Workspace. | **{dotted-circle}** No |
| [Custom issue tracker](custom_issue_tracker.md) | Use a custom issue tracker. | **{dotted-circle}** No |
| [Datadog](../../../integration/datadog.md) | Trace your GitLab pipelines with Datadog. | **{check-circle}** Yes |
| [Discord Notifications](discord_notifications.md) | Send notifications about project events to a Discord channel. | **{dotted-circle}** No |
@@ -40,7 +40,7 @@ Click on the service links to see further configuration instructions and details
| [Emails on push](emails_on_push.md) | Send commits and diff of each push by email. | **{dotted-circle}** No |
| [EWM](ewm.md) | Use IBM Engineering Workflow Management as the issue tracker. | **{dotted-circle}** No |
| [External wiki](../wiki/index.md#link-an-external-wiki) | Link an external wiki. | **{dotted-circle}** No |
-| [Flowdock](../../../api/services.md#flowdock) | Send notifications from GitLab to Flowdock flows. | **{dotted-circle}** No |
+| [Flowdock](../../../api/integrations.md#flowdock) | Send notifications from GitLab to Flowdock flows. | **{dotted-circle}** No |
| [GitHub](github.md) | Obtain statuses for commits and pull requests. | **{dotted-circle}** No |
| [Google Chat](hangouts_chat.md) | Send notifications from your GitLab project to a room in Google Chat.| **{dotted-circle}** No |
| [irker (IRC gateway)](irker.md) | Send IRC messages. | **{dotted-circle}** No |
@@ -59,10 +59,9 @@ Click on the service links to see further configuration instructions and details
| [Slack application](gitlab_slack_application.md) | Use Slack's official GitLab application. | **{dotted-circle}** No |
| [Slack notifications](slack.md) | Send notifications about project events to Slack. | **{dotted-circle}** No |
| [Slack slash commands](slack_slash_commands.md) | Enable slash commands in workspace. | **{dotted-circle}** No |
-| [Unify Circuit](unify_circuit.md) | Receive events notifications. | **{dotted-circle}** No |
+| [Unify Circuit](unify_circuit.md) | Send notifications about project events to Unify Circuit. | **{dotted-circle}** No |
| [Webex Teams](webex_teams.md) | Receive events notifications. | **{dotted-circle}** No |
| [YouTrack](youtrack.md) | Use YouTrack as the issue tracker. | **{dotted-circle}** No |
-| [ZenTao](zentao.md) | Use ZenTao as the issue tracker. | **{dotted-circle}** No |
## Push hooks limit
@@ -84,22 +83,7 @@ Read more about [Project integration management](../../admin_area/settings/proje
## Troubleshooting integrations
-Some integrations use service hooks for integration with external applications. To confirm which ones use service hooks, see the [integrations listing](#integrations-listing) above. GitLab stores details of service hook requests made within the last 2 days. To view details of the requests, go to that integration's configuration page.
-
-The **Recent Deliveries** section lists the details of each request made within the last 2 days:
-
-- HTTP status code (green for 200-299 codes, red for the others, `internal error` for failed deliveries)
-- Triggered event
-- URL to which the request was sent
-- Elapsed time of the request
-- Relative time in which the request was made
-
-To view more information about the request's execution, click the respective **View details** link.
-On the details page, you can see the request headers and body sent and received by GitLab.
-
-To repeat a delivery using the same data, click **Resend Request**.
-
-![Recent deliveries](img/webhook_logs.png)
+Some integrations use service hooks for integration with external applications. To confirm which ones use service hooks, see the [integrations listing](#integrations-listing) above. Learn more about [troubleshooting service hooks](webhooks.md#troubleshoot-webhooks).
### Uninitialized repositories
diff --git a/doc/user/project/integrations/pivotal_tracker.md b/doc/user/project/integrations/pivotal_tracker.md
index d464007dd5e..93a3490e4b6 100644
--- a/doc/user/project/integrations/pivotal_tracker.md
+++ b/doc/user/project/integrations/pivotal_tracker.md
@@ -29,7 +29,7 @@ Read more about the
[Source Commits endpoint](https://www.pivotaltracker.com/help/api/rest/v5#Source_Commits) in
the Pivotal Tracker API documentation.
-See also the [Pivotal Tracker service API documentation](../../../api/services.md#pivotal-tracker).
+See also the [Pivotal Tracker integration API documentation](../../../api/integrations.md#pivotal-tracker).
## Set up Pivotal Tracker
diff --git a/doc/user/project/integrations/prometheus.md b/doc/user/project/integrations/prometheus.md
index acae0793e19..680f787c83c 100644
--- a/doc/user/project/integrations/prometheus.md
+++ b/doc/user/project/integrations/prometheus.md
@@ -75,7 +75,7 @@ service account can be found at Google's documentation for
1. (Optional) In **Google IAP Service Account JSON**, provide the contents of the
Service Account credentials file that is authorized to access the Prometheus resource.
The JSON key `token_credential_uri` is discarded to prevent
- [Server-side Request Forgery (SSRF)](https://www.hackerone.com/blog-How-To-Server-Side-Request-Forgery-SSRF).
+ [Server-side Request Forgery (SSRF)](https://www.hackerone.com/application-security/how-server-side-request-forgery-ssrf).
1. Click **Save changes**.
![Configure Prometheus Service](img/prometheus_manual_configuration_v13_2.png)
diff --git a/doc/user/project/integrations/prometheus_library/kubernetes.md b/doc/user/project/integrations/prometheus_library/kubernetes.md
index ea0119f2e94..429df7f7e27 100644
--- a/doc/user/project/integrations/prometheus_library/kubernetes.md
+++ b/doc/user/project/integrations/prometheus_library/kubernetes.md
@@ -12,7 +12,7 @@ GitLab has support for automatically detecting and monitoring Kubernetes metrics
## Requirements
-The [Prometheus](../prometheus.md) and [Kubernetes](../../clusters/index.md)
+The [Prometheus](../prometheus.md) and [Kubernetes](../../../infrastructure/clusters/index.md)
integration services must be enabled.
## Metrics supported
diff --git a/doc/user/project/integrations/prometheus_library/nginx_ingress.md b/doc/user/project/integrations/prometheus_library/nginx_ingress.md
index d1fe58390fe..6478011b730 100644
--- a/doc/user/project/integrations/prometheus_library/nginx_ingress.md
+++ b/doc/user/project/integrations/prometheus_library/nginx_ingress.md
@@ -38,6 +38,8 @@ Managing these settings depends on how NGINX Ingress has been deployed. If you h
## Specifying the Environment label
-In order to isolate and only display relevant metrics for a given environment, GitLab needs a method to detect which labels are associated. To do this, GitLab searches for metrics with appropriate labels. In this case, the `ingress` label must `<CI_ENVIRONMENT_SLUG>`.
+To isolate and display only relevant metrics for a given environment, GitLab needs a method to
+detect which labels are associated. To do this, GitLab searches for metrics with appropriate labels.
+In this case, the `ingress` label must include the value `<CI_ENVIRONMENT_SLUG>`.
If you have used [Auto Deploy](../../../../topics/autodevops/stages.md#auto-deploy) to deploy your app, this format is used automatically and metrics are detected with no action on your part.
diff --git a/doc/user/project/integrations/slack_slash_commands.md b/doc/user/project/integrations/slack_slash_commands.md
index 066a2f83753..cddb72a83b2 100644
--- a/doc/user/project/integrations/slack_slash_commands.md
+++ b/doc/user/project/integrations/slack_slash_commands.md
@@ -6,8 +6,6 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# Slack slash commands **(FREE SELF)**
-> Introduced in GitLab 8.15.
-
If you want to control and view GitLab content while you're
working in Slack, you can use Slack slash commands.
To use Slack slash commands, you must configure both Slack and GitLab.
diff --git a/doc/user/project/integrations/unify_circuit.md b/doc/user/project/integrations/unify_circuit.md
index 2e166e87ff5..814c64d8140 100644
--- a/doc/user/project/integrations/unify_circuit.md
+++ b/doc/user/project/integrations/unify_circuit.md
@@ -6,29 +6,22 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# Unify Circuit service **(FREE)**
-The Unify Circuit service sends notifications from GitLab to the conversation for which the webhook was created.
+The Unify Circuit service sends notifications from GitLab to a Circuit conversation.
-## On Unify Circuit
+## Set up Unify Circuit service
-1. Open the conversation in which you want to see the notifications.
-1. From the conversation menu, select **Configure Webhooks**.
-1. Click **ADD WEBHOOK** and fill in the name of the bot to post the messages. Optionally
- define an avatar.
-1. Click **SAVE** and copy the **Webhook URL** of your webhook.
+In Unify Circuit, [add a webhook](https://www.circuit.com/unifyportalfaqdetail?articleId=164448) and
+copy its URL.
-For more information, see the [Unify Circuit documentation for configuring incoming webhooks](https://www.circuit.com/unifyportalfaqdetail?articleId=164448).
+In GitLab:
-## On GitLab
-
-When you have the **Webhook URL** for your Unify Circuit conversation webhook, you can set up the GitLab service.
-
-1. Navigate to the [Integrations page](overview.md#accessing-integrations) in your project's settings, i.e. **Project > Settings > Integrations**.
-1. Select the **Unify Circuit** integration to configure it.
-1. Ensure that the **Active** toggle is enabled.
-1. Check the checkboxes corresponding to the GitLab events you want to receive in Unify Circuit.
+1. Go to the [Integrations page](overview.md#accessing-integrations) in your project's settings.
+1. Select **Unify Circuit**.
+1. Turn on the **Active** toggle.
+1. Select the checkboxes corresponding to the GitLab events you want to receive in Unify Circuit.
1. Paste the **Webhook URL** that you copied from the Unify Circuit configuration step.
-1. Configure the remaining options and click `Save changes`.
-
-Your Unify Circuit conversation now starts receiving GitLab event notifications as configured.
+1. Select the **Notify only broken pipelines** checkbox to notify only on failures.
+1. In the **Branches to be notified** dropdown, select which types of branches to send notifications for.
+1. Select `Save changes` or optionally select **Test settings**.
-![Unify Circuit configuration](img/unify_circuit_configuration.png)
+Your Unify Circuit conversation now starts receiving GitLab event notifications.
diff --git a/doc/user/project/integrations/webhook_events.md b/doc/user/project/integrations/webhook_events.md
new file mode 100644
index 00000000000..9b07e6322bc
--- /dev/null
+++ b/doc/user/project/integrations/webhook_events.md
@@ -0,0 +1,1669 @@
+---
+stage: Ecosystem
+group: Integrations
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
+---
+
+# Webhook events **(FREE)**
+
+You can configure a [webhook](webhooks.md) in your project that triggers when
+an event occurs. The following events are supported.
+
+## Push events
+
+Triggered when you push to the repository except when pushing tags.
+
+NOTE:
+When more than 20 commits are pushed at once, the `commits` webhook
+attribute only contains the newest 20 for performance reasons. Loading
+detailed commit data is expensive. Note that despite only 20 commits being
+present in the `commits` attribute, the `total_commits_count` attribute contains the actual total.
+
+NOTE:
+If a branch creation push event is generated without new commits being introduced, the
+`commits` attribute in the payload is empty.
+
+Also, if a single push includes changes for more than three (by default, depending on
+[`push_event_hooks_limit` setting](../../../api/settings.md#list-of-settings-that-can-be-accessed-via-api-calls))
+branches, this hook isn't executed.
+
+**Request header**:
+
+```plaintext
+X-Gitlab-Event: Push Hook
+```
+
+**Payload example:**
+
+```json
+{
+ "object_kind": "push",
+ "event_name": "push",
+ "before": "95790bf891e76fee5e1747ab589903a6a1f80f22",
+ "after": "da1560886d4f094c3e6c9ef40349f7d38b5d27d7",
+ "ref": "refs/heads/master",
+ "checkout_sha": "da1560886d4f094c3e6c9ef40349f7d38b5d27d7",
+ "user_id": 4,
+ "user_name": "John Smith",
+ "user_username": "jsmith",
+ "user_email": "john@example.com",
+ "user_avatar": "https://s.gravatar.com/avatar/d4c74594d841139328695756648b6bd6?s=8://s.gravatar.com/avatar/d4c74594d841139328695756648b6bd6?s=80",
+ "project_id": 15,
+ "project":{
+ "id": 15,
+ "name":"Diaspora",
+ "description":"",
+ "web_url":"http://example.com/mike/diaspora",
+ "avatar_url":null,
+ "git_ssh_url":"git@example.com:mike/diaspora.git",
+ "git_http_url":"http://example.com/mike/diaspora.git",
+ "namespace":"Mike",
+ "visibility_level":0,
+ "path_with_namespace":"mike/diaspora",
+ "default_branch":"master",
+ "homepage":"http://example.com/mike/diaspora",
+ "url":"git@example.com:mike/diaspora.git",
+ "ssh_url":"git@example.com:mike/diaspora.git",
+ "http_url":"http://example.com/mike/diaspora.git"
+ },
+ "repository":{
+ "name": "Diaspora",
+ "url": "git@example.com:mike/diaspora.git",
+ "description": "",
+ "homepage": "http://example.com/mike/diaspora",
+ "git_http_url":"http://example.com/mike/diaspora.git",
+ "git_ssh_url":"git@example.com:mike/diaspora.git",
+ "visibility_level":0
+ },
+ "commits": [
+ {
+ "id": "b6568db1bc1dcd7f8b4d5a946b0b91f9dacd7327",
+ "message": "Update Catalan translation to e38cb41.\n\nSee https://gitlab.com/gitlab-org/gitlab for more information",
+ "title": "Update Catalan translation to e38cb41.",
+ "timestamp": "2011-12-12T14:27:31+02:00",
+ "url": "http://example.com/mike/diaspora/commit/b6568db1bc1dcd7f8b4d5a946b0b91f9dacd7327",
+ "author": {
+ "name": "Jordi Mallach",
+ "email": "jordi@softcatala.org"
+ },
+ "added": ["CHANGELOG"],
+ "modified": ["app/controller/application.rb"],
+ "removed": []
+ },
+ {
+ "id": "da1560886d4f094c3e6c9ef40349f7d38b5d27d7",
+ "message": "fixed readme",
+ "title": "fixed readme",
+ "timestamp": "2012-01-03T23:36:29+02:00",
+ "url": "http://example.com/mike/diaspora/commit/da1560886d4f094c3e6c9ef40349f7d38b5d27d7",
+ "author": {
+ "name": "GitLab dev user",
+ "email": "gitlabdev@dv6700.(none)"
+ },
+ "added": ["CHANGELOG"],
+ "modified": ["app/controller/application.rb"],
+ "removed": []
+ }
+ ],
+ "total_commits_count": 4
+}
+```
+
+## Tag events
+
+Triggered when you create (or delete) tags to the repository.
+
+NOTE:
+If a single push includes changes for more than three (by default, depending on
+[`push_event_hooks_limit` setting](../../../api/settings.md#list-of-settings-that-can-be-accessed-via-api-calls))
+tags, this hook is not executed.
+
+**Request header**:
+
+```plaintext
+X-Gitlab-Event: Tag Push Hook
+```
+
+**Payload example:**
+
+```json
+{
+ "object_kind": "tag_push",
+ "event_name": "tag_push",
+ "before": "0000000000000000000000000000000000000000",
+ "after": "82b3d5ae55f7080f1e6022629cdb57bfae7cccc7",
+ "ref": "refs/tags/v1.0.0",
+ "checkout_sha": "82b3d5ae55f7080f1e6022629cdb57bfae7cccc7",
+ "user_id": 1,
+ "user_name": "John Smith",
+ "user_avatar": "https://s.gravatar.com/avatar/d4c74594d841139328695756648b6bd6?s=8://s.gravatar.com/avatar/d4c74594d841139328695756648b6bd6?s=80",
+ "project_id": 1,
+ "project":{
+ "id": 1,
+ "name":"Example",
+ "description":"",
+ "web_url":"http://example.com/jsmith/example",
+ "avatar_url":null,
+ "git_ssh_url":"git@example.com:jsmith/example.git",
+ "git_http_url":"http://example.com/jsmith/example.git",
+ "namespace":"Jsmith",
+ "visibility_level":0,
+ "path_with_namespace":"jsmith/example",
+ "default_branch":"master",
+ "homepage":"http://example.com/jsmith/example",
+ "url":"git@example.com:jsmith/example.git",
+ "ssh_url":"git@example.com:jsmith/example.git",
+ "http_url":"http://example.com/jsmith/example.git"
+ },
+ "repository":{
+ "name": "Example",
+ "url": "ssh://git@example.com/jsmith/example.git",
+ "description": "",
+ "homepage": "http://example.com/jsmith/example",
+ "git_http_url":"http://example.com/jsmith/example.git",
+ "git_ssh_url":"git@example.com:jsmith/example.git",
+ "visibility_level":0
+ },
+ "commits": [],
+ "total_commits_count": 0
+}
+```
+
+## Issue events
+
+Triggered when a new issue is created or an existing issue was updated/closed/reopened.
+
+**Request header**:
+
+```plaintext
+X-Gitlab-Event: Issue Hook
+```
+
+**Available `object_attributes.action`:**
+
+- `open`
+- `close`
+- `reopen`
+- `update`
+
+**Payload example:**
+
+```json
+{
+ "object_kind": "issue",
+ "event_type": "issue",
+ "user": {
+ "id": 1,
+ "name": "Administrator",
+ "username": "root",
+ "avatar_url": "http://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=40\u0026d=identicon",
+ "email": "admin@example.com"
+ },
+ "project": {
+ "id": 1,
+ "name":"Gitlab Test",
+ "description":"Aut reprehenderit ut est.",
+ "web_url":"http://example.com/gitlabhq/gitlab-test",
+ "avatar_url":null,
+ "git_ssh_url":"git@example.com:gitlabhq/gitlab-test.git",
+ "git_http_url":"http://example.com/gitlabhq/gitlab-test.git",
+ "namespace":"GitlabHQ",
+ "visibility_level":20,
+ "path_with_namespace":"gitlabhq/gitlab-test",
+ "default_branch":"master",
+ "ci_config_path": null,
+ "homepage":"http://example.com/gitlabhq/gitlab-test",
+ "url":"http://example.com/gitlabhq/gitlab-test.git",
+ "ssh_url":"git@example.com:gitlabhq/gitlab-test.git",
+ "http_url":"http://example.com/gitlabhq/gitlab-test.git"
+ },
+ "object_attributes": {
+ "id": 301,
+ "title": "New API: create/update/delete file",
+ "assignee_ids": [51],
+ "assignee_id": 51,
+ "author_id": 51,
+ "project_id": 14,
+ "created_at": "2013-12-03T17:15:43Z",
+ "updated_at": "2013-12-03T17:15:43Z",
+ "updated_by_id": 1,
+ "last_edited_at": null,
+ "last_edited_by_id": null,
+ "relative_position": 0,
+ "description": "Create new API for manipulations with repository",
+ "milestone_id": null,
+ "state_id": 1,
+ "confidential": false,
+ "discussion_locked": true,
+ "due_date": null,
+ "moved_to_id": null,
+ "duplicated_to_id": null,
+ "time_estimate": 0,
+ "total_time_spent": 0,
+ "time_change": 0,
+ "human_total_time_spent": null,
+ "human_time_estimate": null,
+ "human_time_change": null,
+ "weight": null,
+ "iid": 23,
+ "url": "http://example.com/diaspora/issues/23",
+ "state": "opened",
+ "action": "open",
+ "labels": [{
+ "id": 206,
+ "title": "API",
+ "color": "#ffffff",
+ "project_id": 14,
+ "created_at": "2013-12-03T17:15:43Z",
+ "updated_at": "2013-12-03T17:15:43Z",
+ "template": false,
+ "description": "API related issues",
+ "type": "ProjectLabel",
+ "group_id": 41
+ }]
+ },
+ "repository": {
+ "name": "Gitlab Test",
+ "url": "http://example.com/gitlabhq/gitlab-test.git",
+ "description": "Aut reprehenderit ut est.",
+ "homepage": "http://example.com/gitlabhq/gitlab-test"
+ },
+ "assignees": [{
+ "name": "User1",
+ "username": "user1",
+ "avatar_url": "http://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=40\u0026d=identicon"
+ }],
+ "assignee": {
+ "name": "User1",
+ "username": "user1",
+ "avatar_url": "http://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=40\u0026d=identicon"
+ },
+ "labels": [{
+ "id": 206,
+ "title": "API",
+ "color": "#ffffff",
+ "project_id": 14,
+ "created_at": "2013-12-03T17:15:43Z",
+ "updated_at": "2013-12-03T17:15:43Z",
+ "template": false,
+ "description": "API related issues",
+ "type": "ProjectLabel",
+ "group_id": 41
+ }],
+ "changes": {
+ "updated_by_id": {
+ "previous": null,
+ "current": 1
+ },
+ "updated_at": {
+ "previous": "2017-09-15 16:50:55 UTC",
+ "current": "2017-09-15 16:52:00 UTC"
+ },
+ "labels": {
+ "previous": [{
+ "id": 206,
+ "title": "API",
+ "color": "#ffffff",
+ "project_id": 14,
+ "created_at": "2013-12-03T17:15:43Z",
+ "updated_at": "2013-12-03T17:15:43Z",
+ "template": false,
+ "description": "API related issues",
+ "type": "ProjectLabel",
+ "group_id": 41
+ }],
+ "current": [{
+ "id": 205,
+ "title": "Platform",
+ "color": "#123123",
+ "project_id": 14,
+ "created_at": "2013-12-03T17:15:43Z",
+ "updated_at": "2013-12-03T17:15:43Z",
+ "template": false,
+ "description": "Platform related issues",
+ "type": "ProjectLabel",
+ "group_id": 41
+ }]
+ }
+ }
+}
+```
+
+NOTE:
+`assignee` and `assignee_id` keys are deprecated and now show the first assignee only.
+
+## Comment events
+
+Triggered when a new comment is made on commits, merge requests, issues, and code snippets.
+The note data is stored in `object_attributes` (for example, `note` or `noteable_type`). The
+payload also includes information about the target of the comment. For example,
+a comment on an issue includes the specific issue information under the `issue` key.
+Valid target types:
+
+- `commit`
+- `merge_request`
+- `issue`
+- `snippet`
+
+### Comment on commit
+
+**Request header**:
+
+```plaintext
+X-Gitlab-Event: Note Hook
+```
+
+**Payload example:**
+
+```json
+{
+ "object_kind": "note",
+ "event_type": "note",
+ "user": {
+ "id": 1,
+ "name": "Administrator",
+ "username": "root",
+ "avatar_url": "http://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=40\u0026d=identicon",
+ "email": "admin@example.com"
+ },
+ "project_id": 5,
+ "project":{
+ "id": 5,
+ "name":"Gitlab Test",
+ "description":"Aut reprehenderit ut est.",
+ "web_url":"http://example.com/gitlabhq/gitlab-test",
+ "avatar_url":null,
+ "git_ssh_url":"git@example.com:gitlabhq/gitlab-test.git",
+ "git_http_url":"http://example.com/gitlabhq/gitlab-test.git",
+ "namespace":"GitlabHQ",
+ "visibility_level":20,
+ "path_with_namespace":"gitlabhq/gitlab-test",
+ "default_branch":"master",
+ "homepage":"http://example.com/gitlabhq/gitlab-test",
+ "url":"http://example.com/gitlabhq/gitlab-test.git",
+ "ssh_url":"git@example.com:gitlabhq/gitlab-test.git",
+ "http_url":"http://example.com/gitlabhq/gitlab-test.git"
+ },
+ "repository":{
+ "name": "Gitlab Test",
+ "url": "http://example.com/gitlab-org/gitlab-test.git",
+ "description": "Aut reprehenderit ut est.",
+ "homepage": "http://example.com/gitlab-org/gitlab-test"
+ },
+ "object_attributes": {
+ "id": 1243,
+ "note": "This is a commit comment. How does this work?",
+ "noteable_type": "Commit",
+ "author_id": 1,
+ "created_at": "2015-05-17 18:08:09 UTC",
+ "updated_at": "2015-05-17 18:08:09 UTC",
+ "project_id": 5,
+ "attachment":null,
+ "line_code": "bec9703f7a456cd2b4ab5fb3220ae016e3e394e3_0_1",
+ "commit_id": "cfe32cf61b73a0d5e9f13e774abde7ff789b1660",
+ "noteable_id": null,
+ "system": false,
+ "st_diff": {
+ "diff": "--- /dev/null\n+++ b/six\n@@ -0,0 +1 @@\n+Subproject commit 409f37c4f05865e4fb208c771485f211a22c4c2d\n",
+ "new_path": "six",
+ "old_path": "six",
+ "a_mode": "0",
+ "b_mode": "160000",
+ "new_file": true,
+ "renamed_file": false,
+ "deleted_file": false
+ },
+ "url": "http://example.com/gitlab-org/gitlab-test/commit/cfe32cf61b73a0d5e9f13e774abde7ff789b1660#note_1243"
+ },
+ "commit": {
+ "id": "cfe32cf61b73a0d5e9f13e774abde7ff789b1660",
+ "message": "Add submodule\n\nSigned-off-by: Example User \u003cuser@example.com.com\u003e\n",
+ "timestamp": "2014-02-27T10:06:20+02:00",
+ "url": "http://example.com/gitlab-org/gitlab-test/commit/cfe32cf61b73a0d5e9f13e774abde7ff789b1660",
+ "author": {
+ "name": "Example User",
+ "email": "user@example.com"
+ }
+ }
+}
+```
+
+### Comment on merge request
+
+**Request header**:
+
+```plaintext
+X-Gitlab-Event: Note Hook
+```
+
+**Payload example:**
+
+```json
+{
+ "object_kind": "note",
+ "event_type": "note",
+ "user": {
+ "id": 1,
+ "name": "Administrator",
+ "username": "root",
+ "avatar_url": "http://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=40\u0026d=identicon",
+ "email": "admin@example.com"
+ },
+ "project_id": 5,
+ "project":{
+ "id": 5,
+ "name":"Gitlab Test",
+ "description":"Aut reprehenderit ut est.",
+ "web_url":"http://example.com/gitlab-org/gitlab-test",
+ "avatar_url":null,
+ "git_ssh_url":"git@example.com:gitlab-org/gitlab-test.git",
+ "git_http_url":"http://example.com/gitlab-org/gitlab-test.git",
+ "namespace":"Gitlab Org",
+ "visibility_level":10,
+ "path_with_namespace":"gitlab-org/gitlab-test",
+ "default_branch":"master",
+ "homepage":"http://example.com/gitlab-org/gitlab-test",
+ "url":"http://example.com/gitlab-org/gitlab-test.git",
+ "ssh_url":"git@example.com:gitlab-org/gitlab-test.git",
+ "http_url":"http://example.com/gitlab-org/gitlab-test.git"
+ },
+ "repository":{
+ "name": "Gitlab Test",
+ "url": "http://localhost/gitlab-org/gitlab-test.git",
+ "description": "Aut reprehenderit ut est.",
+ "homepage": "http://example.com/gitlab-org/gitlab-test"
+ },
+ "object_attributes": {
+ "id": 1244,
+ "note": "This MR needs work.",
+ "noteable_type": "MergeRequest",
+ "author_id": 1,
+ "created_at": "2015-05-17 18:21:36 UTC",
+ "updated_at": "2015-05-17 18:21:36 UTC",
+ "project_id": 5,
+ "attachment": null,
+ "line_code": null,
+ "commit_id": "",
+ "noteable_id": 7,
+ "system": false,
+ "st_diff": null,
+ "url": "http://example.com/gitlab-org/gitlab-test/merge_requests/1#note_1244"
+ },
+ "merge_request": {
+ "id": 7,
+ "target_branch": "markdown",
+ "source_branch": "master",
+ "source_project_id": 5,
+ "author_id": 8,
+ "assignee_id": 28,
+ "title": "Tempora et eos debitis quae laborum et.",
+ "created_at": "2015-03-01 20:12:53 UTC",
+ "updated_at": "2015-03-21 18:27:27 UTC",
+ "milestone_id": 11,
+ "state": "opened",
+ "merge_status": "cannot_be_merged",
+ "target_project_id": 5,
+ "iid": 1,
+ "description": "Et voluptas corrupti assumenda temporibus. Architecto cum animi eveniet amet asperiores. Vitae numquam voluptate est natus sit et ad id.",
+ "position": 0,
+ "source":{
+ "name":"Gitlab Test",
+ "description":"Aut reprehenderit ut est.",
+ "web_url":"http://example.com/gitlab-org/gitlab-test",
+ "avatar_url":null,
+ "git_ssh_url":"git@example.com:gitlab-org/gitlab-test.git",
+ "git_http_url":"http://example.com/gitlab-org/gitlab-test.git",
+ "namespace":"Gitlab Org",
+ "visibility_level":10,
+ "path_with_namespace":"gitlab-org/gitlab-test",
+ "default_branch":"master",
+ "homepage":"http://example.com/gitlab-org/gitlab-test",
+ "url":"http://example.com/gitlab-org/gitlab-test.git",
+ "ssh_url":"git@example.com:gitlab-org/gitlab-test.git",
+ "http_url":"http://example.com/gitlab-org/gitlab-test.git"
+ },
+ "target": {
+ "name":"Gitlab Test",
+ "description":"Aut reprehenderit ut est.",
+ "web_url":"http://example.com/gitlab-org/gitlab-test",
+ "avatar_url":null,
+ "git_ssh_url":"git@example.com:gitlab-org/gitlab-test.git",
+ "git_http_url":"http://example.com/gitlab-org/gitlab-test.git",
+ "namespace":"Gitlab Org",
+ "visibility_level":10,
+ "path_with_namespace":"gitlab-org/gitlab-test",
+ "default_branch":"master",
+ "homepage":"http://example.com/gitlab-org/gitlab-test",
+ "url":"http://example.com/gitlab-org/gitlab-test.git",
+ "ssh_url":"git@example.com:gitlab-org/gitlab-test.git",
+ "http_url":"http://example.com/gitlab-org/gitlab-test.git"
+ },
+ "last_commit": {
+ "id": "562e173be03b8ff2efb05345d12df18815438a4b",
+ "message": "Merge branch 'another-branch' into 'master'\n\nCheck in this test\n",
+ "timestamp": "2015-04-08T21: 00:25-07:00",
+ "url": "http://example.com/gitlab-org/gitlab-test/commit/562e173be03b8ff2efb05345d12df18815438a4b",
+ "author": {
+ "name": "John Smith",
+ "email": "john@example.com"
+ }
+ },
+ "work_in_progress": false,
+ "assignee": {
+ "name": "User1",
+ "username": "user1",
+ "avatar_url": "http://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=40\u0026d=identicon"
+ }
+ }
+}
+```
+
+### Comment on issue
+
+**Request header**:
+
+```plaintext
+X-Gitlab-Event: Note Hook
+```
+
+**Payload example:**
+
+```json
+{
+ "object_kind": "note",
+ "event_type": "note",
+ "user": {
+ "id": 1,
+ "name": "Administrator",
+ "username": "root",
+ "avatar_url": "http://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=40\u0026d=identicon",
+ "email": "admin@example.com"
+ },
+ "project_id": 5,
+ "project":{
+ "id": 5,
+ "name":"Gitlab Test",
+ "description":"Aut reprehenderit ut est.",
+ "web_url":"http://example.com/gitlab-org/gitlab-test",
+ "avatar_url":null,
+ "git_ssh_url":"git@example.com:gitlab-org/gitlab-test.git",
+ "git_http_url":"http://example.com/gitlab-org/gitlab-test.git",
+ "namespace":"Gitlab Org",
+ "visibility_level":10,
+ "path_with_namespace":"gitlab-org/gitlab-test",
+ "default_branch":"master",
+ "homepage":"http://example.com/gitlab-org/gitlab-test",
+ "url":"http://example.com/gitlab-org/gitlab-test.git",
+ "ssh_url":"git@example.com:gitlab-org/gitlab-test.git",
+ "http_url":"http://example.com/gitlab-org/gitlab-test.git"
+ },
+ "repository":{
+ "name":"diaspora",
+ "url":"git@example.com:mike/diaspora.git",
+ "description":"",
+ "homepage":"http://example.com/mike/diaspora"
+ },
+ "object_attributes": {
+ "id": 1241,
+ "note": "Hello world",
+ "noteable_type": "Issue",
+ "author_id": 1,
+ "created_at": "2015-05-17 17:06:40 UTC",
+ "updated_at": "2015-05-17 17:06:40 UTC",
+ "project_id": 5,
+ "attachment": null,
+ "line_code": null,
+ "commit_id": "",
+ "noteable_id": 92,
+ "system": false,
+ "st_diff": null,
+ "url": "http://example.com/gitlab-org/gitlab-test/issues/17#note_1241"
+ },
+ "issue": {
+ "id": 92,
+ "title": "test",
+ "assignee_ids": [],
+ "assignee_id": null,
+ "author_id": 1,
+ "project_id": 5,
+ "created_at": "2015-04-12 14:53:17 UTC",
+ "updated_at": "2015-04-26 08:28:42 UTC",
+ "position": 0,
+ "branch_name": null,
+ "description": "test",
+ "milestone_id": null,
+ "state": "closed",
+ "iid": 17,
+ "labels": [
+ {
+ "id": 25,
+ "title": "Afterpod",
+ "color": "#3e8068",
+ "project_id": null,
+ "created_at": "2019-06-05T14:32:20.211Z",
+ "updated_at": "2019-06-05T14:32:20.211Z",
+ "template": false,
+ "description": null,
+ "type": "GroupLabel",
+ "group_id": 4
+ },
+ {
+ "id": 86,
+ "title": "Element",
+ "color": "#231afe",
+ "project_id": 4,
+ "created_at": "2019-06-05T14:32:20.637Z",
+ "updated_at": "2019-06-05T14:32:20.637Z",
+ "template": false,
+ "description": null,
+ "type": "ProjectLabel",
+ "group_id": null
+ }
+ ]
+ }
+}
+```
+
+NOTE:
+`assignee_id` field is deprecated and now shows the first assignee only.
+
+NOTE:
+`event_type` is set to `confidential_note` for confidential issues.
+
+### Comment on code snippet
+
+**Request header**:
+
+```plaintext
+X-Gitlab-Event: Note Hook
+```
+
+**Payload example:**
+
+```json
+{
+ "object_kind": "note",
+ "event_type": "note",
+ "user": {
+ "id": 1,
+ "name": "Administrator",
+ "username": "root",
+ "avatar_url": "http://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=40\u0026d=identicon",
+ "email": "admin@example.com"
+ },
+ "project_id": 5,
+ "project":{
+ "id": 5,
+ "name":"Gitlab Test",
+ "description":"Aut reprehenderit ut est.",
+ "web_url":"http://example.com/gitlab-org/gitlab-test",
+ "avatar_url":null,
+ "git_ssh_url":"git@example.com:gitlab-org/gitlab-test.git",
+ "git_http_url":"http://example.com/gitlab-org/gitlab-test.git",
+ "namespace":"Gitlab Org",
+ "visibility_level":10,
+ "path_with_namespace":"gitlab-org/gitlab-test",
+ "default_branch":"master",
+ "homepage":"http://example.com/gitlab-org/gitlab-test",
+ "url":"http://example.com/gitlab-org/gitlab-test.git",
+ "ssh_url":"git@example.com:gitlab-org/gitlab-test.git",
+ "http_url":"http://example.com/gitlab-org/gitlab-test.git"
+ },
+ "repository":{
+ "name":"Gitlab Test",
+ "url":"http://example.com/gitlab-org/gitlab-test.git",
+ "description":"Aut reprehenderit ut est.",
+ "homepage":"http://example.com/gitlab-org/gitlab-test"
+ },
+ "object_attributes": {
+ "id": 1245,
+ "note": "Is this snippet doing what it's supposed to be doing?",
+ "noteable_type": "Snippet",
+ "author_id": 1,
+ "created_at": "2015-05-17 18:35:50 UTC",
+ "updated_at": "2015-05-17 18:35:50 UTC",
+ "project_id": 5,
+ "attachment": null,
+ "line_code": null,
+ "commit_id": "",
+ "noteable_id": 53,
+ "system": false,
+ "st_diff": null,
+ "url": "http://example.com/gitlab-org/gitlab-test/snippets/53#note_1245"
+ },
+ "snippet": {
+ "id": 53,
+ "title": "test",
+ "content": "puts 'Hello world'",
+ "author_id": 1,
+ "project_id": 5,
+ "created_at": "2015-04-09 02:40:38 UTC",
+ "updated_at": "2015-04-09 02:40:38 UTC",
+ "file_name": "test.rb",
+ "expires_at": null,
+ "type": "ProjectSnippet",
+ "visibility_level": 0
+ }
+}
+```
+
+## Merge request events
+
+Triggered when a new merge request is created, an existing merge request was updated/merged/closed or a commit is added in the source branch.
+
+**Request header**:
+
+```plaintext
+X-Gitlab-Event: Merge Request Hook
+```
+
+**Available `object_attributes.action`:**
+
+- `open`
+- `close`
+- `reopen`
+- `update`
+- `approved`
+- `unapproved`
+- `merge`
+
+**Payload example:**
+
+```json
+{
+ "object_kind": "merge_request",
+ "event_type": "merge_request",
+ "user": {
+ "id": 1,
+ "name": "Administrator",
+ "username": "root",
+ "avatar_url": "http://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=40\u0026d=identicon",
+ "email": "admin@example.com"
+ },
+ "project": {
+ "id": 1,
+ "name":"Gitlab Test",
+ "description":"Aut reprehenderit ut est.",
+ "web_url":"http://example.com/gitlabhq/gitlab-test",
+ "avatar_url":null,
+ "git_ssh_url":"git@example.com:gitlabhq/gitlab-test.git",
+ "git_http_url":"http://example.com/gitlabhq/gitlab-test.git",
+ "namespace":"GitlabHQ",
+ "visibility_level":20,
+ "path_with_namespace":"gitlabhq/gitlab-test",
+ "default_branch":"master",
+ "homepage":"http://example.com/gitlabhq/gitlab-test",
+ "url":"http://example.com/gitlabhq/gitlab-test.git",
+ "ssh_url":"git@example.com:gitlabhq/gitlab-test.git",
+ "http_url":"http://example.com/gitlabhq/gitlab-test.git"
+ },
+ "repository": {
+ "name": "Gitlab Test",
+ "url": "http://example.com/gitlabhq/gitlab-test.git",
+ "description": "Aut reprehenderit ut est.",
+ "homepage": "http://example.com/gitlabhq/gitlab-test"
+ },
+ "object_attributes": {
+ "id": 99,
+ "target_branch": "master",
+ "source_branch": "ms-viewport",
+ "source_project_id": 14,
+ "author_id": 51,
+ "assignee_id": 6,
+ "title": "MS-Viewport",
+ "created_at": "2013-12-03T17:23:34Z",
+ "updated_at": "2013-12-03T17:23:34Z",
+ "milestone_id": null,
+ "state": "opened",
+ "merge_status": "unchecked",
+ "target_project_id": 14,
+ "iid": 1,
+ "description": "",
+ "source": {
+ "name":"Awesome Project",
+ "description":"Aut reprehenderit ut est.",
+ "web_url":"http://example.com/awesome_space/awesome_project",
+ "avatar_url":null,
+ "git_ssh_url":"git@example.com:awesome_space/awesome_project.git",
+ "git_http_url":"http://example.com/awesome_space/awesome_project.git",
+ "namespace":"Awesome Space",
+ "visibility_level":20,
+ "path_with_namespace":"awesome_space/awesome_project",
+ "default_branch":"master",
+ "homepage":"http://example.com/awesome_space/awesome_project",
+ "url":"http://example.com/awesome_space/awesome_project.git",
+ "ssh_url":"git@example.com:awesome_space/awesome_project.git",
+ "http_url":"http://example.com/awesome_space/awesome_project.git"
+ },
+ "target": {
+ "name":"Awesome Project",
+ "description":"Aut reprehenderit ut est.",
+ "web_url":"http://example.com/awesome_space/awesome_project",
+ "avatar_url":null,
+ "git_ssh_url":"git@example.com:awesome_space/awesome_project.git",
+ "git_http_url":"http://example.com/awesome_space/awesome_project.git",
+ "namespace":"Awesome Space",
+ "visibility_level":20,
+ "path_with_namespace":"awesome_space/awesome_project",
+ "default_branch":"master",
+ "homepage":"http://example.com/awesome_space/awesome_project",
+ "url":"http://example.com/awesome_space/awesome_project.git",
+ "ssh_url":"git@example.com:awesome_space/awesome_project.git",
+ "http_url":"http://example.com/awesome_space/awesome_project.git"
+ },
+ "last_commit": {
+ "id": "da1560886d4f094c3e6c9ef40349f7d38b5d27d7",
+ "message": "fixed readme",
+ "timestamp": "2012-01-03T23:36:29+02:00",
+ "url": "http://example.com/awesome_space/awesome_project/commits/da1560886d4f094c3e6c9ef40349f7d38b5d27d7",
+ "author": {
+ "name": "GitLab dev user",
+ "email": "gitlabdev@dv6700.(none)"
+ }
+ },
+ "work_in_progress": false,
+ "url": "http://example.com/diaspora/merge_requests/1",
+ "action": "open",
+ "assignee": {
+ "name": "User1",
+ "username": "user1",
+ "avatar_url": "http://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=40\u0026d=identicon"
+ }
+ },
+ "labels": [{
+ "id": 206,
+ "title": "API",
+ "color": "#ffffff",
+ "project_id": 14,
+ "created_at": "2013-12-03T17:15:43Z",
+ "updated_at": "2013-12-03T17:15:43Z",
+ "template": false,
+ "description": "API related issues",
+ "type": "ProjectLabel",
+ "group_id": 41
+ }],
+ "changes": {
+ "updated_by_id": {
+ "previous": null,
+ "current": 1
+ },
+ "updated_at": {
+ "previous": "2017-09-15 16:50:55 UTC",
+ "current":"2017-09-15 16:52:00 UTC"
+ },
+ "labels": {
+ "previous": [{
+ "id": 206,
+ "title": "API",
+ "color": "#ffffff",
+ "project_id": 14,
+ "created_at": "2013-12-03T17:15:43Z",
+ "updated_at": "2013-12-03T17:15:43Z",
+ "template": false,
+ "description": "API related issues",
+ "type": "ProjectLabel",
+ "group_id": 41
+ }],
+ "current": [{
+ "id": 205,
+ "title": "Platform",
+ "color": "#123123",
+ "project_id": 14,
+ "created_at": "2013-12-03T17:15:43Z",
+ "updated_at": "2013-12-03T17:15:43Z",
+ "template": false,
+ "description": "Platform related issues",
+ "type": "ProjectLabel",
+ "group_id": 41
+ }]
+ }
+ }
+}
+```
+
+## Wiki Page events
+
+Triggered when a wiki page is created, updated or deleted.
+
+**Request Header**:
+
+```plaintext
+X-Gitlab-Event: Wiki Page Hook
+```
+
+**Payload example**:
+
+```json
+{
+ "object_kind": "wiki_page",
+ "user": {
+ "id": 1,
+ "name": "Administrator",
+ "username": "root",
+ "avatar_url": "http://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=80\u0026d=identicon",
+ "email": "admin@example.com"
+ },
+ "project": {
+ "id": 1,
+ "name": "awesome-project",
+ "description": "This is awesome",
+ "web_url": "http://example.com/root/awesome-project",
+ "avatar_url": null,
+ "git_ssh_url": "git@example.com:root/awesome-project.git",
+ "git_http_url": "http://example.com/root/awesome-project.git",
+ "namespace": "root",
+ "visibility_level": 0,
+ "path_with_namespace": "root/awesome-project",
+ "default_branch": "master",
+ "homepage": "http://example.com/root/awesome-project",
+ "url": "git@example.com:root/awesome-project.git",
+ "ssh_url": "git@example.com:root/awesome-project.git",
+ "http_url": "http://example.com/root/awesome-project.git"
+ },
+ "wiki": {
+ "web_url": "http://example.com/root/awesome-project/-/wikis/home",
+ "git_ssh_url": "git@example.com:root/awesome-project.wiki.git",
+ "git_http_url": "http://example.com/root/awesome-project.wiki.git",
+ "path_with_namespace": "root/awesome-project.wiki",
+ "default_branch": "master"
+ },
+ "object_attributes": {
+ "title": "Awesome",
+ "content": "awesome content goes here",
+ "format": "markdown",
+ "message": "adding an awesome page to the wiki",
+ "slug": "awesome",
+ "url": "http://example.com/root/awesome-project/-/wikis/awesome",
+ "action": "create"
+ }
+}
+```
+
+## Pipeline events
+
+In [GitLab 13.9](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/53159)
+and later, the pipeline webhook returns only the latest jobs.
+
+Triggered on status change of Pipeline.
+
+**Request Header**:
+
+```plaintext
+X-Gitlab-Event: Pipeline Hook
+```
+
+**Payload example**:
+
+```json
+{
+ "object_kind": "pipeline",
+ "object_attributes":{
+ "id": 31,
+ "ref": "master",
+ "tag": false,
+ "sha": "bcbb5ec396a2c0f828686f14fac9b80b780504f2",
+ "before_sha": "bcbb5ec396a2c0f828686f14fac9b80b780504f2",
+ "source": "merge_request_event",
+ "status": "success",
+ "stages":[
+ "build",
+ "test",
+ "deploy"
+ ],
+ "created_at": "2016-08-12 15:23:28 UTC",
+ "finished_at": "2016-08-12 15:26:29 UTC",
+ "duration": 63,
+ "variables": [
+ {
+ "key": "NESTOR_PROD_ENVIRONMENT",
+ "value": "us-west-1"
+ }
+ ]
+ },
+ "merge_request": {
+ "id": 1,
+ "iid": 1,
+ "title": "Test",
+ "source_branch": "test",
+ "source_project_id": 1,
+ "target_branch": "master",
+ "target_project_id": 1,
+ "state": "opened",
+ "merge_status": "can_be_merged",
+ "url": "http://192.168.64.1:3005/gitlab-org/gitlab-test/merge_requests/1"
+ },
+ "user":{
+ "id": 1,
+ "name": "Administrator",
+ "username": "root",
+ "avatar_url": "http://www.gravatar.com/avatar/e32bd13e2add097461cb96824b7a829c?s=80\u0026d=identicon",
+ "email": "user_email@gitlab.com"
+ },
+ "project":{
+ "id": 1,
+ "name": "Gitlab Test",
+ "description": "Atque in sunt eos similique dolores voluptatem.",
+ "web_url": "http://192.168.64.1:3005/gitlab-org/gitlab-test",
+ "avatar_url": null,
+ "git_ssh_url": "git@192.168.64.1:gitlab-org/gitlab-test.git",
+ "git_http_url": "http://192.168.64.1:3005/gitlab-org/gitlab-test.git",
+ "namespace": "Gitlab Org",
+ "visibility_level": 20,
+ "path_with_namespace": "gitlab-org/gitlab-test",
+ "default_branch": "master"
+ },
+ "commit":{
+ "id": "bcbb5ec396a2c0f828686f14fac9b80b780504f2",
+ "message": "test\n",
+ "timestamp": "2016-08-12T17:23:21+02:00",
+ "url": "http://example.com/gitlab-org/gitlab-test/commit/bcbb5ec396a2c0f828686f14fac9b80b780504f2",
+ "author":{
+ "name": "User",
+ "email": "user@gitlab.com"
+ }
+ },
+ "builds":[
+ {
+ "id": 380,
+ "stage": "deploy",
+ "name": "production",
+ "status": "skipped",
+ "created_at": "2016-08-12 15:23:28 UTC",
+ "started_at": null,
+ "finished_at": null,
+ "when": "manual",
+ "manual": true,
+ "allow_failure": false,
+ "user":{
+ "id": 1,
+ "name": "Administrator",
+ "username": "root",
+ "avatar_url": "http://www.gravatar.com/avatar/e32bd13e2add097461cb96824b7a829c?s=80\u0026d=identicon",
+ "email": "admin@example.com"
+ },
+ "runner": null,
+ "artifacts_file":{
+ "filename": null,
+ "size": null
+ },
+ "environment": {
+ "name": "production",
+ "action": "start",
+ "deployment_tier": "production"
+ }
+ },
+ {
+ "id": 377,
+ "stage": "test",
+ "name": "test-image",
+ "status": "success",
+ "created_at": "2016-08-12 15:23:28 UTC",
+ "started_at": "2016-08-12 15:26:12 UTC",
+ "finished_at": null,
+ "when": "on_success",
+ "manual": false,
+ "allow_failure": false,
+ "user":{
+ "id": 1,
+ "name": "Administrator",
+ "username": "root",
+ "avatar_url": "http://www.gravatar.com/avatar/e32bd13e2add097461cb96824b7a829c?s=80\u0026d=identicon",
+ "email": "admin@example.com"
+ },
+ "runner": {
+ "id": 380987,
+ "description": "shared-runners-manager-6.gitlab.com",
+ "active": true,
+ "runner_type": "instance_type",
+ "is_shared": true,
+ "tags": [
+ "linux",
+ "docker",
+ "shared-runner"
+ ]
+ },
+ "artifacts_file":{
+ "filename": null,
+ "size": null
+ },
+ "environment": null
+ },
+ {
+ "id": 378,
+ "stage": "test",
+ "name": "test-build",
+ "status": "success",
+ "created_at": "2016-08-12 15:23:28 UTC",
+ "started_at": "2016-08-12 15:26:12 UTC",
+ "finished_at": "2016-08-12 15:26:29 UTC",
+ "when": "on_success",
+ "manual": false,
+ "allow_failure": false,
+ "user":{
+ "id": 1,
+ "name": "Administrator",
+ "username": "root",
+ "avatar_url": "http://www.gravatar.com/avatar/e32bd13e2add097461cb96824b7a829c?s=80\u0026d=identicon",
+ "email": "admin@example.com"
+ },
+ "runner": {
+ "id":380987,
+ "description":"shared-runners-manager-6.gitlab.com",
+ "active":true,
+ "runner_type": "instance_type",
+ "is_shared": true,
+ "tags": [
+ "linux",
+ "docker"
+ ]
+ },
+ "artifacts_file":{
+ "filename": null,
+ "size": null
+ },
+ "environment": null
+ },
+ {
+ "id": 376,
+ "stage": "build",
+ "name": "build-image",
+ "status": "success",
+ "created_at": "2016-08-12 15:23:28 UTC",
+ "started_at": "2016-08-12 15:24:56 UTC",
+ "finished_at": "2016-08-12 15:25:26 UTC",
+ "when": "on_success",
+ "manual": false,
+ "allow_failure": false,
+ "user":{
+ "id": 1,
+ "name": "Administrator",
+ "username": "root",
+ "avatar_url": "http://www.gravatar.com/avatar/e32bd13e2add097461cb96824b7a829c?s=80\u0026d=identicon",
+ "email": "admin@example.com"
+ },
+ "runner": {
+ "id": 380987,
+ "description": "shared-runners-manager-6.gitlab.com",
+ "active": true,
+ "runner_type": "instance_type",
+ "is_shared": true,
+ "tags": [
+ "linux",
+ "docker"
+ ]
+ },
+ "artifacts_file":{
+ "filename": null,
+ "size": null
+ },
+ "environment": null
+ },
+ {
+ "id": 379,
+ "stage": "deploy",
+ "name": "staging",
+ "status": "created",
+ "created_at": "2016-08-12 15:23:28 UTC",
+ "started_at": null,
+ "finished_at": null,
+ "when": "on_success",
+ "manual": false,
+ "allow_failure": false,
+ "user":{
+ "id": 1,
+ "name": "Administrator",
+ "username": "root",
+ "avatar_url": "http://www.gravatar.com/avatar/e32bd13e2add097461cb96824b7a829c?s=80\u0026d=identicon",
+ "email": "admin@example.com"
+ },
+ "runner": null,
+ "artifacts_file":{
+ "filename": null,
+ "size": null
+ },
+ "environment": {
+ "name": "staging",
+ "action": "start",
+ "deployment_tier": "staging"
+ }
+ }
+ ]
+}
+```
+
+## Job events
+
+Triggered on status change of a job.
+
+**Request Header**:
+
+```plaintext
+X-Gitlab-Event: Job Hook
+```
+
+**Payload example**:
+
+```json
+{
+ "object_kind": "build",
+ "ref": "gitlab-script-trigger",
+ "tag": false,
+ "before_sha": "2293ada6b400935a1378653304eaf6221e0fdb8f",
+ "sha": "2293ada6b400935a1378653304eaf6221e0fdb8f",
+ "build_id": 1977,
+ "build_name": "test",
+ "build_stage": "test",
+ "build_status": "created",
+ "build_created_at": "2021-02-23T02:41:37.886Z",
+ "build_started_at": null,
+ "build_finished_at": null,
+ "build_duration": null,
+ "build_allow_failure": false,
+ "build_failure_reason": "script_failure",
+ "pipeline_id": 2366,
+ "project_id": 380,
+ "project_name": "gitlab-org/gitlab-test",
+ "user": {
+ "id": 3,
+ "name": "User",
+ "email": "user@gitlab.com",
+ "avatar_url": "http://www.gravatar.com/avatar/e32bd13e2add097461cb96824b7a829c?s=80\u0026d=identicon",
+ },
+ "commit": {
+ "id": 2366,
+ "sha": "2293ada6b400935a1378653304eaf6221e0fdb8f",
+ "message": "test\n",
+ "author_name": "User",
+ "author_email": "user@gitlab.com",
+ "status": "created",
+ "duration": null,
+ "started_at": null,
+ "finished_at": null
+ },
+ "repository": {
+ "name": "gitlab_test",
+ "description": "Atque in sunt eos similique dolores voluptatem.",
+ "homepage": "http://192.168.64.1:3005/gitlab-org/gitlab-test",
+ "git_ssh_url": "git@192.168.64.1:gitlab-org/gitlab-test.git",
+ "git_http_url": "http://192.168.64.1:3005/gitlab-org/gitlab-test.git",
+ "visibility_level": 20
+ },
+ "runner": {
+ "active": true,
+ "runner_type": "project_type",
+ "is_shared": false,
+ "id": 380987,
+ "description": "shared-runners-manager-6.gitlab.com",
+ "tags": [
+ "linux",
+ "docker"
+ ]
+ },
+ "environment": null
+}
+```
+
+Note that `commit.id` is the ID of the pipeline, not the ID of the commit.
+
+## Deployment events
+
+Triggered when a deployment:
+
+- Starts ([Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/41214) in GitLab 13.5.)
+- Succeeds
+- Fails
+- Is cancelled
+
+**Request Header**:
+
+```plaintext
+X-Gitlab-Event: Deployment Hook
+```
+
+**Payload example**:
+
+```json
+{
+ "object_kind": "deployment",
+ "status": "success",
+ "status_changed_at":"2021-04-28 21:50:00 +0200",
+ "deployment_id": 15,
+ "deployable_id": 796,
+ "deployable_url": "http://10.126.0.2:3000/root/test-deployment-webhooks/-/jobs/796",
+ "environment": "staging",
+ "project": {
+ "id": 30,
+ "name": "test-deployment-webhooks",
+ "description": "",
+ "web_url": "http://10.126.0.2:3000/root/test-deployment-webhooks",
+ "avatar_url": null,
+ "git_ssh_url": "ssh://vlad@10.126.0.2:2222/root/test-deployment-webhooks.git",
+ "git_http_url": "http://10.126.0.2:3000/root/test-deployment-webhooks.git",
+ "namespace": "Administrator",
+ "visibility_level": 0,
+ "path_with_namespace": "root/test-deployment-webhooks",
+ "default_branch": "master",
+ "ci_config_path": "",
+ "homepage": "http://10.126.0.2:3000/root/test-deployment-webhooks",
+ "url": "ssh://vlad@10.126.0.2:2222/root/test-deployment-webhooks.git",
+ "ssh_url": "ssh://vlad@10.126.0.2:2222/root/test-deployment-webhooks.git",
+ "http_url": "http://10.126.0.2:3000/root/test-deployment-webhooks.git"
+ },
+ "short_sha": "279484c0",
+ "user": {
+ "id": 1,
+ "name": "Administrator",
+ "username": "root",
+ "avatar_url": "https://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=80&d=identicon",
+ "email": "admin@example.com"
+ },
+ "user_url": "http://10.126.0.2:3000/root",
+ "commit_url": "http://10.126.0.2:3000/root/test-deployment-webhooks/-/commit/279484c09fbe69ededfced8c1bb6e6d24616b468",
+ "commit_title": "Add new file"
+}
+```
+
+Note that `deployable_id` is the ID of the CI job.
+
+## Group member events **(PREMIUM)**
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/260347) in GitLab 13.7.
+
+Member events are triggered when:
+
+- A user is added as a group member
+- The access level of a user has changed
+- The expiration date for user access has been updated
+- A user has been removed from the group
+
+### Add member to group
+
+**Request Header**:
+
+```plaintext
+X-Gitlab-Event: Member Hook
+```
+
+**Payload example**:
+
+```json
+{
+ "created_at": "2020-12-11T04:57:22Z",
+ "updated_at": "2020-12-11T04:57:22Z",
+ "group_name": "webhook-test",
+ "group_path": "webhook-test",
+ "group_id": 100,
+ "user_username": "test_user",
+ "user_name": "Test User",
+ "user_email": "testuser@webhooktest.com",
+ "user_id": 64,
+ "group_access": "Guest",
+ "group_plan": null,
+ "expires_at": "2020-12-14T00:00:00Z",
+ "event_name": "user_add_to_group"
+}
+```
+
+### Update member access level or expiration date
+
+**Request Header**:
+
+```plaintext
+X-Gitlab-Event: Member Hook
+```
+
+**Payload example**:
+
+```json
+{
+ "created_at": "2020-12-11T04:57:22Z",
+ "updated_at": "2020-12-12T08:48:19Z",
+ "group_name": "webhook-test",
+ "group_path": "webhook-test",
+ "group_id": 100,
+ "user_username": "test_user",
+ "user_name": "Test User",
+ "user_email": "testuser@webhooktest.com",
+ "user_id": 64,
+ "group_access": "Developer",
+ "group_plan": null,
+ "expires_at": "2020-12-20T00:00:00Z",
+ "event_name": "user_update_for_group"
+}
+```
+
+### Remove member from group
+
+**Request Header**:
+
+```plaintext
+X-Gitlab-Event: Member Hook
+```
+
+**Payload example**:
+
+```json
+{
+ "created_at": "2020-12-11T04:57:22Z",
+ "updated_at": "2020-12-12T08:52:34Z",
+ "group_name": "webhook-test",
+ "group_path": "webhook-test",
+ "group_id": 100,
+ "user_username": "test_user",
+ "user_name": "Test User",
+ "user_email": "testuser@webhooktest.com",
+ "user_id": 64,
+ "group_access": "Guest",
+ "group_plan": null,
+ "expires_at": "2020-12-14T00:00:00Z",
+ "event_name": "user_remove_from_group"
+}
+```
+
+## Subgroup events **(PREMIUM)**
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/260419) in GitLab 13.9.
+
+Subgroup events are triggered when:
+
+- A [subgroup is created in a group](#subgroup-created-in-a-group)
+- A [subgroup is removed from a group](#subgroup-removed-from-a-group)
+
+### Subgroup created in a group
+
+**Request Header**:
+
+```plaintext
+X-Gitlab-Event: Subgroup Hook
+```
+
+**Payload example**:
+
+```json
+{
+
+ "created_at": "2021-01-20T09:40:12Z",
+ "updated_at": "2021-01-20T09:40:12Z",
+ "event_name": "subgroup_create",
+ "name": "subgroup1",
+ "path": "subgroup1",
+ "full_path": "group1/subgroup1",
+ "group_id": 10,
+ "parent_group_id": 7,
+ "parent_name": "group1",
+ "parent_path": "group1",
+ "parent_full_path": "group1"
+
+}
+```
+
+### Subgroup removed from a group
+
+**Request Header**:
+
+```plaintext
+X-Gitlab-Event: Subgroup Hook
+```
+
+**Payload example**:
+
+```json
+{
+
+ "created_at": "2021-01-20T09:40:12Z",
+ "updated_at": "2021-01-20T09:40:12Z",
+ "event_name": "subgroup_destroy",
+ "name": "subgroup1",
+ "path": "subgroup1",
+ "full_path": "group1/subgroup1",
+ "group_id": 10,
+ "parent_group_id": 7,
+ "parent_name": "group1",
+ "parent_path": "group1",
+ "parent_full_path": "group1"
+
+}
+```
+
+NOTE:
+Webhooks for when a [subgroup is removed from a group](#subgroup-removed-from-a-group) are not triggered when a [subgroup is transferred to a new parent group](../../group/index.md#transfer-a-group)
+
+## Feature Flag events
+
+Triggered when a feature flag is turned on or off.
+
+**Request Header**:
+
+```plaintext
+X-Gitlab-Event: Feature Flag Hook
+```
+
+**Payload example**:
+
+```json
+{
+ "object_kind": "feature_flag",
+ "project": {
+ "id": 1,
+ "name":"Gitlab Test",
+ "description":"Aut reprehenderit ut est.",
+ "web_url":"http://example.com/gitlabhq/gitlab-test",
+ "avatar_url":null,
+ "git_ssh_url":"git@example.com:gitlabhq/gitlab-test.git",
+ "git_http_url":"http://example.com/gitlabhq/gitlab-test.git",
+ "namespace":"GitlabHQ",
+ "visibility_level":20,
+ "path_with_namespace":"gitlabhq/gitlab-test",
+ "default_branch":"master",
+ "ci_config_path": null,
+ "homepage":"http://example.com/gitlabhq/gitlab-test",
+ "url":"http://example.com/gitlabhq/gitlab-test.git",
+ "ssh_url":"git@example.com:gitlabhq/gitlab-test.git",
+ "http_url":"http://example.com/gitlabhq/gitlab-test.git"
+ },
+ "user": {
+ "id": 1,
+ "name": "Administrator",
+ "username": "root",
+ "avatar_url": "https://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=80&d=identicon",
+ "email": "admin@example.com"
+ },
+ "user_url": "http://example.com/root",
+ "object_attributes": {
+ "id": 6,
+ "name": "test-feature-flag",
+ "description": "test-feature-flag-description",
+ "active": true
+ }
+}
+```
+
+## Release events
+
+Triggered when a release is created or updated.
+
+**Request Header**:
+
+```plaintext
+X-Gitlab-Event: Release Hook
+```
+
+**Available `object_attributes.action`:**
+
+- `create`
+- `update`
+
+**Payload example**:
+
+```json
+{
+ "id": 1,
+ "created_at": "2020-11-02 12:55:12 UTC",
+ "description": "v1.0 has been released",
+ "name": "v1.1",
+ "released_at": "2020-11-02 12:55:12 UTC",
+ "tag": "v1.1",
+ "object_kind": "release",
+ "project": {
+ "id": 2,
+ "name": "release-webhook-example",
+ "description": "",
+ "web_url": "https://example.com/gitlab-org/release-webhook-example",
+ "avatar_url": null,
+ "git_ssh_url": "ssh://git@example.com/gitlab-org/release-webhook-example.git",
+ "git_http_url": "https://example.com/gitlab-org/release-webhook-example.git",
+ "namespace": "Gitlab",
+ "visibility_level": 0,
+ "path_with_namespace": "gitlab-org/release-webhook-example",
+ "default_branch": "master",
+ "ci_config_path": null,
+ "homepage": "https://example.com/gitlab-org/release-webhook-example",
+ "url": "ssh://git@example.com/gitlab-org/release-webhook-example.git",
+ "ssh_url": "ssh://git@example.com/gitlab-org/release-webhook-example.git",
+ "http_url": "https://example.com/gitlab-org/release-webhook-example.git"
+ },
+ "url": "https://example.com/gitlab-org/release-webhook-example/-/releases/v1.1",
+ "action": "create",
+ "assets": {
+ "count": 5,
+ "links": [
+ {
+ "id": 1,
+ "external": true,
+ "link_type": "other",
+ "name": "Changelog",
+ "url": "https://example.net/changelog"
+ }
+ ],
+ "sources": [
+ {
+ "format": "zip",
+ "url": "https://example.com/gitlab-org/release-webhook-example/-/archive/v1.1/release-webhook-example-v1.1.zip"
+ },
+ {
+ "format": "tar.gz",
+ "url": "https://example.com/gitlab-org/release-webhook-example/-/archive/v1.1/release-webhook-example-v1.1.tar.gz"
+ },
+ {
+ "format": "tar.bz2",
+ "url": "https://example.com/gitlab-org/release-webhook-example/-/archive/v1.1/release-webhook-example-v1.1.tar.bz2"
+ },
+ {
+ "format": "tar",
+ "url": "https://example.com/gitlab-org/release-webhook-example/-/archive/v1.1/release-webhook-example-v1.1.tar"
+ }
+ ]
+ },
+ "commit": {
+ "id": "ee0a3fb31ac16e11b9dbb596ad16d4af654d08f8",
+ "message": "Release v1.1",
+ "title": "Release v1.1",
+ "timestamp": "2020-10-31T14:58:32+11:00",
+ "url": "https://example.com/gitlab-org/release-webhook-example/-/commit/ee0a3fb31ac16e11b9dbb596ad16d4af654d08f8",
+ "author": {
+ "name": "Example User",
+ "email": "user@example.com"
+ }
+ }
+}
+```
diff --git a/doc/user/project/integrations/webhooks.md b/doc/user/project/integrations/webhooks.md
index 44225ac2921..0891d48c038 100644
--- a/doc/user/project/integrations/webhooks.md
+++ b/doc/user/project/integrations/webhooks.md
@@ -6,1802 +6,226 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# Webhooks **(FREE)**
-Project webhooks allow you to trigger a percent-encoded URL if, for example, new code is pushed or
-a new issue is created. You can configure webhooks to listen for specific events
-like pushes, issues or merge requests. GitLab sends a POST request with data
-to the webhook URL.
-
-You usually need to set up your own [webhook receiver](#example-webhook-receiver)
-to receive information from GitLab and send it to another app, according to your requirements.
-We already have a [built-in receiver](slack.md)
-for sending [Slack](https://api.slack.com/incoming-webhooks) notifications _per project_.
-
-## Overview
-
-[Webhooks](https://en.wikipedia.org/wiki/Webhook) are "_user-defined HTTP
-callbacks_". They are usually triggered by some
-event, such as pushing code to a repository or a comment being posted to a blog.
-When that event occurs, the source app makes an HTTP request to the URI
-configured for the webhook. The action taken may be anything.
-Common uses are to trigger builds with continuous integration systems or to
-notify bug tracking systems.
-
-Webhooks can be used to update an external issue tracker, trigger CI jobs,
-update a backup mirror, or even deploy to your production server.
-
-Webhooks are available:
-
-- Per project, at a project's **Settings > Webhooks** menu. **(FREE)**
-- Additionally per group, at a group's **Settings > Webhooks** menu. **(PREMIUM)**
-
-GitLab.com enforces various [webhook limits](../../../user/gitlab_com/index.md#webhooks), including:
-
-- The maximum number of webhooks and their size, both per project, and per group.
-- The number of webhook calls per minute.
-
-## Possible uses for webhooks
-
-- You can set up a webhook in GitLab to send a notification to
+[Webhooks](https://en.wikipedia.org/wiki/Webhook) are custom HTTP callbacks
+that you define. They are usually triggered by an
+event, such as pushing code to a repository or posting a comment on a blog.
+When the event occurs, the source app makes an HTTP request to the URI
+configured for the webhook. The action to take may be anything. For example,
+you can use webhooks to:
+
+- Trigger continuous integration (CI) jobs, update external issue trackers,
+ update a backup mirror, or deploy to your production server.
+- Send a notification to
[Slack](https://api.slack.com/incoming-webhooks) every time a job fails.
-- You can [integrate with Twilio to be notified via SMS](https://www.datadoghq.com/blog/send-alerts-sms-customizable-webhooks-twilio/)
- every time an issue is created for a specific project or group within GitLab
-- You can use them to [automatically assign labels to merge requests](https://about.gitlab.com/blog/2016/08/19/applying-gitlab-labels-automatically/).
-
-## Webhook endpoint tips
-
-If you are writing your own endpoint (web server) to receive
-GitLab webhooks, keep in mind the following:
-
-- Your endpoint should send its HTTP response as fast as possible. If the response takes longer than
- the configured timeout, GitLab decides the hook failed and retries it. For information on
- customizing this timeout, see
- [Webhook fails or multiple webhook requests are triggered](#webhook-fails-or-multiple-webhook-requests-are-triggered).
-- Your endpoint should ALWAYS return a valid HTTP response. If you do
- not do this then GitLab thinks the hook failed and retries it.
- Most HTTP libraries take care of this for you automatically but if
- you are writing a low-level hook this is important to remember.
-- GitLab ignores the HTTP status code returned by your endpoint.
-
-## Secret token
-
-If you specify a secret token, it is sent with the hook request in the
-`X-Gitlab-Token` HTTP header. Your webhook endpoint can check that to verify
-that the request is legitimate.
-
-## SSL verification
-
-By default, the SSL certificate of the webhook endpoint is verified based on
-an internal list of Certificate Authorities. This means the certificate cannot
-be self-signed.
-
-You can turn this off in the webhook settings in your GitLab projects.
-
-## Branch filtering
-
-> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/20338) in GitLab 11.3.
-
-Push events can be filtered by branch using a branch name or wildcard pattern
-to limit which push events are sent to your webhook endpoint. By default the
-field is blank causing all push events to be sent to your webhook endpoint.
-
-## Events
-
-Below are described the supported events.
-
-### Push events
-
-Triggered when you push to the repository except when pushing tags.
-
-NOTE:
-When more than 20 commits are pushed at once, the `commits` webhook
-attribute only contains the newest 20 for performance reasons. Loading
-detailed commit data is expensive. Note that despite only 20 commits being
-present in the `commits` attribute, the `total_commits_count` attribute contains the actual total.
-
-NOTE:
-If a branch creation push event is generated without new commits being introduced, the
-`commits` attribute in the payload is empty.
-
-Also, if a single push includes changes for more than three (by default, depending on
-[`push_event_hooks_limit` setting](../../../api/settings.md#list-of-settings-that-can-be-accessed-via-api-calls))
-branches, this hook isn't executed.
-
-**Request header**:
-
-```plaintext
-X-Gitlab-Event: Push Hook
-```
-
-**Payload example:**
-
-```json
-{
- "object_kind": "push",
- "before": "95790bf891e76fee5e1747ab589903a6a1f80f22",
- "after": "da1560886d4f094c3e6c9ef40349f7d38b5d27d7",
- "ref": "refs/heads/master",
- "checkout_sha": "da1560886d4f094c3e6c9ef40349f7d38b5d27d7",
- "user_id": 4,
- "user_name": "John Smith",
- "user_username": "jsmith",
- "user_email": "john@example.com",
- "user_avatar": "https://s.gravatar.com/avatar/d4c74594d841139328695756648b6bd6?s=8://s.gravatar.com/avatar/d4c74594d841139328695756648b6bd6?s=80",
- "project_id": 15,
- "project":{
- "id": 15,
- "name":"Diaspora",
- "description":"",
- "web_url":"http://example.com/mike/diaspora",
- "avatar_url":null,
- "git_ssh_url":"git@example.com:mike/diaspora.git",
- "git_http_url":"http://example.com/mike/diaspora.git",
- "namespace":"Mike",
- "visibility_level":0,
- "path_with_namespace":"mike/diaspora",
- "default_branch":"master",
- "homepage":"http://example.com/mike/diaspora",
- "url":"git@example.com:mike/diaspora.git",
- "ssh_url":"git@example.com:mike/diaspora.git",
- "http_url":"http://example.com/mike/diaspora.git"
- },
- "repository":{
- "name": "Diaspora",
- "url": "git@example.com:mike/diaspora.git",
- "description": "",
- "homepage": "http://example.com/mike/diaspora",
- "git_http_url":"http://example.com/mike/diaspora.git",
- "git_ssh_url":"git@example.com:mike/diaspora.git",
- "visibility_level":0
- },
- "commits": [
- {
- "id": "b6568db1bc1dcd7f8b4d5a946b0b91f9dacd7327",
- "message": "Update Catalan translation to e38cb41.\n\nSee https://gitlab.com/gitlab-org/gitlab for more information",
- "title": "Update Catalan translation to e38cb41.",
- "timestamp": "2011-12-12T14:27:31+02:00",
- "url": "http://example.com/mike/diaspora/commit/b6568db1bc1dcd7f8b4d5a946b0b91f9dacd7327",
- "author": {
- "name": "Jordi Mallach",
- "email": "jordi@softcatala.org"
- },
- "added": ["CHANGELOG"],
- "modified": ["app/controller/application.rb"],
- "removed": []
- },
- {
- "id": "da1560886d4f094c3e6c9ef40349f7d38b5d27d7",
- "message": "fixed readme",
- "title": "fixed readme",
- "timestamp": "2012-01-03T23:36:29+02:00",
- "url": "http://example.com/mike/diaspora/commit/da1560886d4f094c3e6c9ef40349f7d38b5d27d7",
- "author": {
- "name": "GitLab dev user",
- "email": "gitlabdev@dv6700.(none)"
- },
- "added": ["CHANGELOG"],
- "modified": ["app/controller/application.rb"],
- "removed": []
- }
- ],
- "total_commits_count": 4
-}
-```
+- [Integrate with Twilio to be notified via SMS](https://www.datadoghq.com/blog/send-alerts-sms-customizable-webhooks-twilio/)
+ every time an issue is created for a specific project or group in GitLab.
+- [Automatically assign labels to merge requests](https://about.gitlab.com/blog/2016/08/19/applying-gitlab-labels-automatically/).
-### Tag events
+You can configure your GitLab project or [group](#group-webhooks) to trigger
+a percent-encoded webhook URL when an event occurs. For example, when new code
+is pushed or a new issue is created.
+The webhook listens for specific [events](#events) and
+GitLab sends a POST request with data to the webhook URL.
-Triggered when you create (or delete) tags to the repository.
-
-NOTE:
-If a single push includes changes for more than three (by default, depending on
-[`push_event_hooks_limit` setting](../../../api/settings.md#list-of-settings-that-can-be-accessed-via-api-calls))
-tags, this hook is not executed.
+Usually, you set up your own [webhook receiver](#create-an-example-webhook-receiver)
+to receive information from GitLab and send it to another app, according to your requirements.
+We have a [built-in receiver](slack.md)
+for sending [Slack](https://api.slack.com/incoming-webhooks) notifications per project.
-**Request header**:
+GitLab.com enforces [webhook limits](../../../user/gitlab_com/index.md#webhooks),
+including:
-```plaintext
-X-Gitlab-Event: Tag Push Hook
-```
+- The maximum number of webhooks and their size, both per project and per group.
+- The number of webhook calls per minute.
-**Payload example:**
-
-```json
-{
- "object_kind": "tag_push",
- "before": "0000000000000000000000000000000000000000",
- "after": "82b3d5ae55f7080f1e6022629cdb57bfae7cccc7",
- "ref": "refs/tags/v1.0.0",
- "checkout_sha": "82b3d5ae55f7080f1e6022629cdb57bfae7cccc7",
- "user_id": 1,
- "user_name": "John Smith",
- "user_avatar": "https://s.gravatar.com/avatar/d4c74594d841139328695756648b6bd6?s=8://s.gravatar.com/avatar/d4c74594d841139328695756648b6bd6?s=80",
- "project_id": 1,
- "project":{
- "id": 1,
- "name":"Example",
- "description":"",
- "web_url":"http://example.com/jsmith/example",
- "avatar_url":null,
- "git_ssh_url":"git@example.com:jsmith/example.git",
- "git_http_url":"http://example.com/jsmith/example.git",
- "namespace":"Jsmith",
- "visibility_level":0,
- "path_with_namespace":"jsmith/example",
- "default_branch":"master",
- "homepage":"http://example.com/jsmith/example",
- "url":"git@example.com:jsmith/example.git",
- "ssh_url":"git@example.com:jsmith/example.git",
- "http_url":"http://example.com/jsmith/example.git"
- },
- "repository":{
- "name": "Example",
- "url": "ssh://git@example.com/jsmith/example.git",
- "description": "",
- "homepage": "http://example.com/jsmith/example",
- "git_http_url":"http://example.com/jsmith/example.git",
- "git_ssh_url":"git@example.com:jsmith/example.git",
- "visibility_level":0
- },
- "commits": [],
- "total_commits_count": 0
-}
-```
+## Group webhooks **(PREMIUM)**
-### Issue events
+You can configure a webhook for a group to ensure all projects in the group
+receive the same webhook settings.
-Triggered when a new issue is created or an existing issue was updated/closed/reopened.
+## Configure a webhook
-**Request header**:
+You can configure a webhook for a group or a project.
-```plaintext
-X-Gitlab-Event: Issue Hook
-```
+1. In your project or group, on the left sidebar, select **Settings > Webhooks**.
+1. In **URL**, enter the URL of the webhook endpoint.
+ The URL must be percentage-encoded, if necessary.
+1. In **Secret token**, enter the [secret token](#validate-payloads-by-using-a-secret-token) to validate payloads.
+1. In the **Trigger** section, select the [events](webhook_events.md) to trigger the webhook.
+1. Optional. Clear the **Enable SSL verification** checkbox to disable [SSL verification](#verify-an-ssl-certificate).
+1. Select **Add webhook**.
-**Available `object_attributes.action`:**
-
-- `open`
-- `close`
-- `reopen`
-- `update`
-
-**Payload example:**
-
-```json
-{
- "object_kind": "issue",
- "event_type": "issue",
- "user": {
- "id": 1,
- "name": "Administrator",
- "username": "root",
- "avatar_url": "http://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=40\u0026d=identicon",
- "email": "admin@example.com"
- },
- "project": {
- "id": 1,
- "name":"Gitlab Test",
- "description":"Aut reprehenderit ut est.",
- "web_url":"http://example.com/gitlabhq/gitlab-test",
- "avatar_url":null,
- "git_ssh_url":"git@example.com:gitlabhq/gitlab-test.git",
- "git_http_url":"http://example.com/gitlabhq/gitlab-test.git",
- "namespace":"GitlabHQ",
- "visibility_level":20,
- "path_with_namespace":"gitlabhq/gitlab-test",
- "default_branch":"master",
- "ci_config_path": null,
- "homepage":"http://example.com/gitlabhq/gitlab-test",
- "url":"http://example.com/gitlabhq/gitlab-test.git",
- "ssh_url":"git@example.com:gitlabhq/gitlab-test.git",
- "http_url":"http://example.com/gitlabhq/gitlab-test.git"
- },
- "object_attributes": {
- "id": 301,
- "title": "New API: create/update/delete file",
- "assignee_ids": [51],
- "assignee_id": 51,
- "author_id": 51,
- "project_id": 14,
- "created_at": "2013-12-03T17:15:43Z",
- "updated_at": "2013-12-03T17:15:43Z",
- "updated_by_id": 1,
- "last_edited_at": null,
- "last_edited_by_id": null,
- "relative_position": 0,
- "description": "Create new API for manipulations with repository",
- "milestone_id": null,
- "state_id": 1,
- "confidential": false,
- "discussion_locked": true,
- "due_date": null,
- "moved_to_id": null,
- "duplicated_to_id": null,
- "time_estimate": 0,
- "total_time_spent": 0,
- "time_change": 0,
- "human_total_time_spent": null,
- "human_time_estimate": null,
- "human_time_change": null,
- "weight": null,
- "iid": 23,
- "url": "http://example.com/diaspora/issues/23",
- "state": "opened",
- "action": "open",
- "labels": [{
- "id": 206,
- "title": "API",
- "color": "#ffffff",
- "project_id": 14,
- "created_at": "2013-12-03T17:15:43Z",
- "updated_at": "2013-12-03T17:15:43Z",
- "template": false,
- "description": "API related issues",
- "type": "ProjectLabel",
- "group_id": 41
- }]
- },
- "repository": {
- "name": "Gitlab Test",
- "url": "http://example.com/gitlabhq/gitlab-test.git",
- "description": "Aut reprehenderit ut est.",
- "homepage": "http://example.com/gitlabhq/gitlab-test"
- },
- "assignees": [{
- "name": "User1",
- "username": "user1",
- "avatar_url": "http://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=40\u0026d=identicon"
- }],
- "assignee": {
- "name": "User1",
- "username": "user1",
- "avatar_url": "http://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=40\u0026d=identicon"
- },
- "labels": [{
- "id": 206,
- "title": "API",
- "color": "#ffffff",
- "project_id": 14,
- "created_at": "2013-12-03T17:15:43Z",
- "updated_at": "2013-12-03T17:15:43Z",
- "template": false,
- "description": "API related issues",
- "type": "ProjectLabel",
- "group_id": 41
- }],
- "changes": {
- "updated_by_id": {
- "previous": null,
- "current": 1
- },
- "updated_at": {
- "previous": "2017-09-15 16:50:55 UTC",
- "current": "2017-09-15 16:52:00 UTC"
- },
- "labels": {
- "previous": [{
- "id": 206,
- "title": "API",
- "color": "#ffffff",
- "project_id": 14,
- "created_at": "2013-12-03T17:15:43Z",
- "updated_at": "2013-12-03T17:15:43Z",
- "template": false,
- "description": "API related issues",
- "type": "ProjectLabel",
- "group_id": 41
- }],
- "current": [{
- "id": 205,
- "title": "Platform",
- "color": "#123123",
- "project_id": 14,
- "created_at": "2013-12-03T17:15:43Z",
- "updated_at": "2013-12-03T17:15:43Z",
- "template": false,
- "description": "Platform related issues",
- "type": "ProjectLabel",
- "group_id": 41
- }]
- }
- }
-}
-```
+## Test a webhook
-NOTE:
-`assignee` and `assignee_id` keys are deprecated and now show the first assignee only.
+You can trigger a webhook manually, to ensure it's working properly.
-### Comment events
+For example, to test `push events`, your project should have at least one commit. The webhook uses this commit in the webhook.
-Triggered when a new comment is made on commits, merge requests, issues, and code snippets.
-The note data is stored in `object_attributes` (for example, `note` or `noteable_type`). The
-payload also includes information about the target of the comment. For example,
-a comment on an issue includes the specific issue information under the `issue` key.
-Valid target types:
+To test a webhook:
-- `commit`
-- `merge_request`
-- `issue`
-- `snippet`
+1. In your project, on the left sidebar, select **Settings > Webhooks**.
+1. Scroll down to the list of configured webhooks.
+1. From the **Test** dropdown list, select the type of event to test.
-#### Comment on commit
+![Webhook testing](img/webhook_testing.png)
-**Request header**:
+## Create an example webhook receiver
-```plaintext
-X-Gitlab-Event: Note Hook
-```
+To test how GitLab webhooks work, you can use
+an echo script running in a console session. For the following script to
+work you must have Ruby installed.
-**Payload example:**
-
-```json
-{
- "object_kind": "note",
- "user": {
- "id": 1,
- "name": "Administrator",
- "username": "root",
- "avatar_url": "http://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=40\u0026d=identicon",
- "email": "admin@example.com"
- },
- "project_id": 5,
- "project":{
- "id": 5,
- "name":"Gitlab Test",
- "description":"Aut reprehenderit ut est.",
- "web_url":"http://example.com/gitlabhq/gitlab-test",
- "avatar_url":null,
- "git_ssh_url":"git@example.com:gitlabhq/gitlab-test.git",
- "git_http_url":"http://example.com/gitlabhq/gitlab-test.git",
- "namespace":"GitlabHQ",
- "visibility_level":20,
- "path_with_namespace":"gitlabhq/gitlab-test",
- "default_branch":"master",
- "homepage":"http://example.com/gitlabhq/gitlab-test",
- "url":"http://example.com/gitlabhq/gitlab-test.git",
- "ssh_url":"git@example.com:gitlabhq/gitlab-test.git",
- "http_url":"http://example.com/gitlabhq/gitlab-test.git"
- },
- "repository":{
- "name": "Gitlab Test",
- "url": "http://example.com/gitlab-org/gitlab-test.git",
- "description": "Aut reprehenderit ut est.",
- "homepage": "http://example.com/gitlab-org/gitlab-test"
- },
- "object_attributes": {
- "id": 1243,
- "note": "This is a commit comment. How does this work?",
- "noteable_type": "Commit",
- "author_id": 1,
- "created_at": "2015-05-17 18:08:09 UTC",
- "updated_at": "2015-05-17 18:08:09 UTC",
- "project_id": 5,
- "attachment":null,
- "line_code": "bec9703f7a456cd2b4ab5fb3220ae016e3e394e3_0_1",
- "commit_id": "cfe32cf61b73a0d5e9f13e774abde7ff789b1660",
- "noteable_id": null,
- "system": false,
- "st_diff": {
- "diff": "--- /dev/null\n+++ b/six\n@@ -0,0 +1 @@\n+Subproject commit 409f37c4f05865e4fb208c771485f211a22c4c2d\n",
- "new_path": "six",
- "old_path": "six",
- "a_mode": "0",
- "b_mode": "160000",
- "new_file": true,
- "renamed_file": false,
- "deleted_file": false
- },
- "url": "http://example.com/gitlab-org/gitlab-test/commit/cfe32cf61b73a0d5e9f13e774abde7ff789b1660#note_1243"
- },
- "commit": {
- "id": "cfe32cf61b73a0d5e9f13e774abde7ff789b1660",
- "message": "Add submodule\n\nSigned-off-by: Example User \u003cuser@example.com.com\u003e\n",
- "timestamp": "2014-02-27T10:06:20+02:00",
- "url": "http://example.com/gitlab-org/gitlab-test/commit/cfe32cf61b73a0d5e9f13e774abde7ff789b1660",
- "author": {
- "name": "Example User",
- "email": "user@example.com"
- }
- }
-}
-```
+1. Save the following file as `print_http_body.rb`:
-#### Comment on merge request
+ ```ruby
+ require 'webrick'
-**Request header**:
+ server = WEBrick::HTTPServer.new(:Port => ARGV.first)
+ server.mount_proc '/' do |req, res|
+ puts req.body
+ end
-```plaintext
-X-Gitlab-Event: Note Hook
-```
+ trap 'INT' do
+ server.shutdown
+ end
+ server.start
+ ```
-**Payload example:**
-
-```json
-{
- "object_kind": "note",
- "user": {
- "id": 1,
- "name": "Administrator",
- "username": "root",
- "avatar_url": "http://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=40\u0026d=identicon",
- "email": "admin@example.com"
- },
- "project_id": 5,
- "project":{
- "id": 5,
- "name":"Gitlab Test",
- "description":"Aut reprehenderit ut est.",
- "web_url":"http://example.com/gitlab-org/gitlab-test",
- "avatar_url":null,
- "git_ssh_url":"git@example.com:gitlab-org/gitlab-test.git",
- "git_http_url":"http://example.com/gitlab-org/gitlab-test.git",
- "namespace":"Gitlab Org",
- "visibility_level":10,
- "path_with_namespace":"gitlab-org/gitlab-test",
- "default_branch":"master",
- "homepage":"http://example.com/gitlab-org/gitlab-test",
- "url":"http://example.com/gitlab-org/gitlab-test.git",
- "ssh_url":"git@example.com:gitlab-org/gitlab-test.git",
- "http_url":"http://example.com/gitlab-org/gitlab-test.git"
- },
- "repository":{
- "name": "Gitlab Test",
- "url": "http://localhost/gitlab-org/gitlab-test.git",
- "description": "Aut reprehenderit ut est.",
- "homepage": "http://example.com/gitlab-org/gitlab-test"
- },
- "object_attributes": {
- "id": 1244,
- "note": "This MR needs work.",
- "noteable_type": "MergeRequest",
- "author_id": 1,
- "created_at": "2015-05-17 18:21:36 UTC",
- "updated_at": "2015-05-17 18:21:36 UTC",
- "project_id": 5,
- "attachment": null,
- "line_code": null,
- "commit_id": "",
- "noteable_id": 7,
- "system": false,
- "st_diff": null,
- "url": "http://example.com/gitlab-org/gitlab-test/merge_requests/1#note_1244"
- },
- "merge_request": {
- "id": 7,
- "target_branch": "markdown",
- "source_branch": "master",
- "source_project_id": 5,
- "author_id": 8,
- "assignee_id": 28,
- "title": "Tempora et eos debitis quae laborum et.",
- "created_at": "2015-03-01 20:12:53 UTC",
- "updated_at": "2015-03-21 18:27:27 UTC",
- "milestone_id": 11,
- "state": "opened",
- "merge_status": "cannot_be_merged",
- "target_project_id": 5,
- "iid": 1,
- "description": "Et voluptas corrupti assumenda temporibus. Architecto cum animi eveniet amet asperiores. Vitae numquam voluptate est natus sit et ad id.",
- "position": 0,
- "source":{
- "name":"Gitlab Test",
- "description":"Aut reprehenderit ut est.",
- "web_url":"http://example.com/gitlab-org/gitlab-test",
- "avatar_url":null,
- "git_ssh_url":"git@example.com:gitlab-org/gitlab-test.git",
- "git_http_url":"http://example.com/gitlab-org/gitlab-test.git",
- "namespace":"Gitlab Org",
- "visibility_level":10,
- "path_with_namespace":"gitlab-org/gitlab-test",
- "default_branch":"master",
- "homepage":"http://example.com/gitlab-org/gitlab-test",
- "url":"http://example.com/gitlab-org/gitlab-test.git",
- "ssh_url":"git@example.com:gitlab-org/gitlab-test.git",
- "http_url":"http://example.com/gitlab-org/gitlab-test.git"
- },
- "target": {
- "name":"Gitlab Test",
- "description":"Aut reprehenderit ut est.",
- "web_url":"http://example.com/gitlab-org/gitlab-test",
- "avatar_url":null,
- "git_ssh_url":"git@example.com:gitlab-org/gitlab-test.git",
- "git_http_url":"http://example.com/gitlab-org/gitlab-test.git",
- "namespace":"Gitlab Org",
- "visibility_level":10,
- "path_with_namespace":"gitlab-org/gitlab-test",
- "default_branch":"master",
- "homepage":"http://example.com/gitlab-org/gitlab-test",
- "url":"http://example.com/gitlab-org/gitlab-test.git",
- "ssh_url":"git@example.com:gitlab-org/gitlab-test.git",
- "http_url":"http://example.com/gitlab-org/gitlab-test.git"
- },
- "last_commit": {
- "id": "562e173be03b8ff2efb05345d12df18815438a4b",
- "message": "Merge branch 'another-branch' into 'master'\n\nCheck in this test\n",
- "timestamp": "2015-04-08T21: 00:25-07:00",
- "url": "http://example.com/gitlab-org/gitlab-test/commit/562e173be03b8ff2efb05345d12df18815438a4b",
- "author": {
- "name": "John Smith",
- "email": "john@example.com"
- }
- },
- "work_in_progress": false,
- "assignee": {
- "name": "User1",
- "username": "user1",
- "avatar_url": "http://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=40\u0026d=identicon"
- }
- }
-}
-```
+1. Choose an unused port (for example, `8000`) and start the script:
-#### Comment on issue
+ ```shell
+ ruby print_http_body.rb 8000
+ ```
-**Request header**:
+1. In GitLab, add your webhook receiver as `http://my.host:8000/`.
-```plaintext
-X-Gitlab-Event: Note Hook
-```
+1. Select **Test**. You should see something like this in the console:
-**Payload example:**
-
-```json
-{
- "object_kind": "note",
- "user": {
- "id": 1,
- "name": "Administrator",
- "username": "root",
- "avatar_url": "http://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=40\u0026d=identicon",
- "email": "admin@example.com"
- },
- "project_id": 5,
- "project":{
- "id": 5,
- "name":"Gitlab Test",
- "description":"Aut reprehenderit ut est.",
- "web_url":"http://example.com/gitlab-org/gitlab-test",
- "avatar_url":null,
- "git_ssh_url":"git@example.com:gitlab-org/gitlab-test.git",
- "git_http_url":"http://example.com/gitlab-org/gitlab-test.git",
- "namespace":"Gitlab Org",
- "visibility_level":10,
- "path_with_namespace":"gitlab-org/gitlab-test",
- "default_branch":"master",
- "homepage":"http://example.com/gitlab-org/gitlab-test",
- "url":"http://example.com/gitlab-org/gitlab-test.git",
- "ssh_url":"git@example.com:gitlab-org/gitlab-test.git",
- "http_url":"http://example.com/gitlab-org/gitlab-test.git"
- },
- "repository":{
- "name":"diaspora",
- "url":"git@example.com:mike/diaspora.git",
- "description":"",
- "homepage":"http://example.com/mike/diaspora"
- },
- "object_attributes": {
- "id": 1241,
- "note": "Hello world",
- "noteable_type": "Issue",
- "author_id": 1,
- "created_at": "2015-05-17 17:06:40 UTC",
- "updated_at": "2015-05-17 17:06:40 UTC",
- "project_id": 5,
- "attachment": null,
- "line_code": null,
- "commit_id": "",
- "noteable_id": 92,
- "system": false,
- "st_diff": null,
- "url": "http://example.com/gitlab-org/gitlab-test/issues/17#note_1241"
- },
- "issue": {
- "id": 92,
- "title": "test",
- "assignee_ids": [],
- "assignee_id": null,
- "author_id": 1,
- "project_id": 5,
- "created_at": "2015-04-12 14:53:17 UTC",
- "updated_at": "2015-04-26 08:28:42 UTC",
- "position": 0,
- "branch_name": null,
- "description": "test",
- "milestone_id": null,
- "state": "closed",
- "iid": 17,
- "labels": [
- {
- "id": 25,
- "title": "Afterpod",
- "color": "#3e8068",
- "project_id": null,
- "created_at": "2019-06-05T14:32:20.211Z",
- "updated_at": "2019-06-05T14:32:20.211Z",
- "template": false,
- "description": null,
- "type": "GroupLabel",
- "group_id": 4
- },
- {
- "id": 86,
- "title": "Element",
- "color": "#231afe",
- "project_id": 4,
- "created_at": "2019-06-05T14:32:20.637Z",
- "updated_at": "2019-06-05T14:32:20.637Z",
- "template": false,
- "description": null,
- "type": "ProjectLabel",
- "group_id": null
- }
- ]
- }
-}
-```
+ ```plaintext
+ {"before":"077a85dd266e6f3573ef7e9ef8ce3343ad659c4e","after":"95cd4a99e93bc4bbabacfa2cd10e6725b1403c60",<SNIP>}
+ example.com - - [14/May/2014:07:45:26 EDT] "POST / HTTP/1.1" 200 0
+ - -> /
+ ```
NOTE:
-`assignee_id` field is deprecated and now shows the first assignee only.
-
-#### Comment on code snippet
-
-**Request header**:
-
-```plaintext
-X-Gitlab-Event: Note Hook
-```
-
-**Payload example:**
-
-```json
-{
- "object_kind": "note",
- "user": {
- "id": 1,
- "name": "Administrator",
- "username": "root",
- "avatar_url": "http://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=40\u0026d=identicon",
- "email": "admin@example.com"
- },
- "project_id": 5,
- "project":{
- "id": 5,
- "name":"Gitlab Test",
- "description":"Aut reprehenderit ut est.",
- "web_url":"http://example.com/gitlab-org/gitlab-test",
- "avatar_url":null,
- "git_ssh_url":"git@example.com:gitlab-org/gitlab-test.git",
- "git_http_url":"http://example.com/gitlab-org/gitlab-test.git",
- "namespace":"Gitlab Org",
- "visibility_level":10,
- "path_with_namespace":"gitlab-org/gitlab-test",
- "default_branch":"master",
- "homepage":"http://example.com/gitlab-org/gitlab-test",
- "url":"http://example.com/gitlab-org/gitlab-test.git",
- "ssh_url":"git@example.com:gitlab-org/gitlab-test.git",
- "http_url":"http://example.com/gitlab-org/gitlab-test.git"
- },
- "repository":{
- "name":"Gitlab Test",
- "url":"http://example.com/gitlab-org/gitlab-test.git",
- "description":"Aut reprehenderit ut est.",
- "homepage":"http://example.com/gitlab-org/gitlab-test"
- },
- "object_attributes": {
- "id": 1245,
- "note": "Is this snippet doing what it's supposed to be doing?",
- "noteable_type": "Snippet",
- "author_id": 1,
- "created_at": "2015-05-17 18:35:50 UTC",
- "updated_at": "2015-05-17 18:35:50 UTC",
- "project_id": 5,
- "attachment": null,
- "line_code": null,
- "commit_id": "",
- "noteable_id": 53,
- "system": false,
- "st_diff": null,
- "url": "http://example.com/gitlab-org/gitlab-test/snippets/53#note_1245"
- },
- "snippet": {
- "id": 53,
- "title": "test",
- "content": "puts 'Hello world'",
- "author_id": 1,
- "project_id": 5,
- "created_at": "2015-04-09 02:40:38 UTC",
- "updated_at": "2015-04-09 02:40:38 UTC",
- "file_name": "test.rb",
- "expires_at": null,
- "type": "ProjectSnippet",
- "visibility_level": 0
- }
-}
-```
-
-### Merge request events
-
-Triggered when a new merge request is created, an existing merge request was updated/merged/closed or a commit is added in the source branch.
-
-**Request header**:
-
-```plaintext
-X-Gitlab-Event: Merge Request Hook
-```
-
-**Available `object_attributes.action`:**
-
-- `open`
-- `close`
-- `reopen`
-- `update`
-- `approved`
-- `unapproved`
-- `merge`
-
-**Payload example:**
-
-```json
-{
- "object_kind": "merge_request",
- "user": {
- "id": 1,
- "name": "Administrator",
- "username": "root",
- "avatar_url": "http://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=40\u0026d=identicon",
- "email": "admin@example.com"
- },
- "project": {
- "id": 1,
- "name":"Gitlab Test",
- "description":"Aut reprehenderit ut est.",
- "web_url":"http://example.com/gitlabhq/gitlab-test",
- "avatar_url":null,
- "git_ssh_url":"git@example.com:gitlabhq/gitlab-test.git",
- "git_http_url":"http://example.com/gitlabhq/gitlab-test.git",
- "namespace":"GitlabHQ",
- "visibility_level":20,
- "path_with_namespace":"gitlabhq/gitlab-test",
- "default_branch":"master",
- "homepage":"http://example.com/gitlabhq/gitlab-test",
- "url":"http://example.com/gitlabhq/gitlab-test.git",
- "ssh_url":"git@example.com:gitlabhq/gitlab-test.git",
- "http_url":"http://example.com/gitlabhq/gitlab-test.git"
- },
- "repository": {
- "name": "Gitlab Test",
- "url": "http://example.com/gitlabhq/gitlab-test.git",
- "description": "Aut reprehenderit ut est.",
- "homepage": "http://example.com/gitlabhq/gitlab-test"
- },
- "object_attributes": {
- "id": 99,
- "target_branch": "master",
- "source_branch": "ms-viewport",
- "source_project_id": 14,
- "author_id": 51,
- "assignee_id": 6,
- "title": "MS-Viewport",
- "created_at": "2013-12-03T17:23:34Z",
- "updated_at": "2013-12-03T17:23:34Z",
- "milestone_id": null,
- "state": "opened",
- "merge_status": "unchecked",
- "target_project_id": 14,
- "iid": 1,
- "description": "",
- "source": {
- "name":"Awesome Project",
- "description":"Aut reprehenderit ut est.",
- "web_url":"http://example.com/awesome_space/awesome_project",
- "avatar_url":null,
- "git_ssh_url":"git@example.com:awesome_space/awesome_project.git",
- "git_http_url":"http://example.com/awesome_space/awesome_project.git",
- "namespace":"Awesome Space",
- "visibility_level":20,
- "path_with_namespace":"awesome_space/awesome_project",
- "default_branch":"master",
- "homepage":"http://example.com/awesome_space/awesome_project",
- "url":"http://example.com/awesome_space/awesome_project.git",
- "ssh_url":"git@example.com:awesome_space/awesome_project.git",
- "http_url":"http://example.com/awesome_space/awesome_project.git"
- },
- "target": {
- "name":"Awesome Project",
- "description":"Aut reprehenderit ut est.",
- "web_url":"http://example.com/awesome_space/awesome_project",
- "avatar_url":null,
- "git_ssh_url":"git@example.com:awesome_space/awesome_project.git",
- "git_http_url":"http://example.com/awesome_space/awesome_project.git",
- "namespace":"Awesome Space",
- "visibility_level":20,
- "path_with_namespace":"awesome_space/awesome_project",
- "default_branch":"master",
- "homepage":"http://example.com/awesome_space/awesome_project",
- "url":"http://example.com/awesome_space/awesome_project.git",
- "ssh_url":"git@example.com:awesome_space/awesome_project.git",
- "http_url":"http://example.com/awesome_space/awesome_project.git"
- },
- "last_commit": {
- "id": "da1560886d4f094c3e6c9ef40349f7d38b5d27d7",
- "message": "fixed readme",
- "timestamp": "2012-01-03T23:36:29+02:00",
- "url": "http://example.com/awesome_space/awesome_project/commits/da1560886d4f094c3e6c9ef40349f7d38b5d27d7",
- "author": {
- "name": "GitLab dev user",
- "email": "gitlabdev@dv6700.(none)"
- }
- },
- "work_in_progress": false,
- "url": "http://example.com/diaspora/merge_requests/1",
- "action": "open",
- "assignee": {
- "name": "User1",
- "username": "user1",
- "avatar_url": "http://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=40\u0026d=identicon"
- }
- },
- "labels": [{
- "id": 206,
- "title": "API",
- "color": "#ffffff",
- "project_id": 14,
- "created_at": "2013-12-03T17:15:43Z",
- "updated_at": "2013-12-03T17:15:43Z",
- "template": false,
- "description": "API related issues",
- "type": "ProjectLabel",
- "group_id": 41
- }],
- "changes": {
- "updated_by_id": {
- "previous": null,
- "current": 1
- },
- "updated_at": {
- "previous": "2017-09-15 16:50:55 UTC",
- "current":"2017-09-15 16:52:00 UTC"
- },
- "labels": {
- "previous": [{
- "id": 206,
- "title": "API",
- "color": "#ffffff",
- "project_id": 14,
- "created_at": "2013-12-03T17:15:43Z",
- "updated_at": "2013-12-03T17:15:43Z",
- "template": false,
- "description": "API related issues",
- "type": "ProjectLabel",
- "group_id": 41
- }],
- "current": [{
- "id": 205,
- "title": "Platform",
- "color": "#123123",
- "project_id": 14,
- "created_at": "2013-12-03T17:15:43Z",
- "updated_at": "2013-12-03T17:15:43Z",
- "template": false,
- "description": "Platform related issues",
- "type": "ProjectLabel",
- "group_id": 41
- }]
- }
- }
-}
-```
-
-### Wiki Page events
-
-Triggered when a wiki page is created, updated or deleted.
-
-**Request Header**:
-
-```plaintext
-X-Gitlab-Event: Wiki Page Hook
-```
-
-**Payload example**:
-
-```json
-{
- "object_kind": "wiki_page",
- "user": {
- "id": 1,
- "name": "Administrator",
- "username": "root",
- "avatar_url": "http://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=80\u0026d=identicon",
- "email": "admin@example.com"
- },
- "project": {
- "id": 1,
- "name": "awesome-project",
- "description": "This is awesome",
- "web_url": "http://example.com/root/awesome-project",
- "avatar_url": null,
- "git_ssh_url": "git@example.com:root/awesome-project.git",
- "git_http_url": "http://example.com/root/awesome-project.git",
- "namespace": "root",
- "visibility_level": 0,
- "path_with_namespace": "root/awesome-project",
- "default_branch": "master",
- "homepage": "http://example.com/root/awesome-project",
- "url": "git@example.com:root/awesome-project.git",
- "ssh_url": "git@example.com:root/awesome-project.git",
- "http_url": "http://example.com/root/awesome-project.git"
- },
- "wiki": {
- "web_url": "http://example.com/root/awesome-project/-/wikis/home",
- "git_ssh_url": "git@example.com:root/awesome-project.wiki.git",
- "git_http_url": "http://example.com/root/awesome-project.wiki.git",
- "path_with_namespace": "root/awesome-project.wiki",
- "default_branch": "master"
- },
- "object_attributes": {
- "title": "Awesome",
- "content": "awesome content goes here",
- "format": "markdown",
- "message": "adding an awesome page to the wiki",
- "slug": "awesome",
- "url": "http://example.com/root/awesome-project/-/wikis/awesome",
- "action": "create"
- }
-}
-```
-
-### Pipeline events
-
-In [GitLab 13.9](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/53159)
-and later, the pipeline webhook returns only the latest jobs.
-
-Triggered on status change of Pipeline.
-
-**Request Header**:
-
-```plaintext
-X-Gitlab-Event: Pipeline Hook
-```
-
-**Payload example**:
-
-```json
-{
- "object_kind": "pipeline",
- "object_attributes":{
- "id": 31,
- "ref": "master",
- "tag": false,
- "sha": "bcbb5ec396a2c0f828686f14fac9b80b780504f2",
- "before_sha": "bcbb5ec396a2c0f828686f14fac9b80b780504f2",
- "source": "merge_request_event",
- "status": "success",
- "stages":[
- "build",
- "test",
- "deploy"
- ],
- "created_at": "2016-08-12 15:23:28 UTC",
- "finished_at": "2016-08-12 15:26:29 UTC",
- "duration": 63,
- "variables": [
- {
- "key": "NESTOR_PROD_ENVIRONMENT",
- "value": "us-west-1"
- }
- ]
- },
- "merge_request": {
- "id": 1,
- "iid": 1,
- "title": "Test",
- "source_branch": "test",
- "source_project_id": 1,
- "target_branch": "master",
- "target_project_id": 1,
- "state": "opened",
- "merge_status": "can_be_merged",
- "url": "http://192.168.64.1:3005/gitlab-org/gitlab-test/merge_requests/1"
- },
- "user":{
- "id": 1,
- "name": "Administrator",
- "username": "root",
- "avatar_url": "http://www.gravatar.com/avatar/e32bd13e2add097461cb96824b7a829c?s=80\u0026d=identicon",
- "email": "user_email@gitlab.com"
- },
- "project":{
- "id": 1,
- "name": "Gitlab Test",
- "description": "Atque in sunt eos similique dolores voluptatem.",
- "web_url": "http://192.168.64.1:3005/gitlab-org/gitlab-test",
- "avatar_url": null,
- "git_ssh_url": "git@192.168.64.1:gitlab-org/gitlab-test.git",
- "git_http_url": "http://192.168.64.1:3005/gitlab-org/gitlab-test.git",
- "namespace": "Gitlab Org",
- "visibility_level": 20,
- "path_with_namespace": "gitlab-org/gitlab-test",
- "default_branch": "master"
- },
- "commit":{
- "id": "bcbb5ec396a2c0f828686f14fac9b80b780504f2",
- "message": "test\n",
- "timestamp": "2016-08-12T17:23:21+02:00",
- "url": "http://example.com/gitlab-org/gitlab-test/commit/bcbb5ec396a2c0f828686f14fac9b80b780504f2",
- "author":{
- "name": "User",
- "email": "user@gitlab.com"
- }
- },
- "builds":[
- {
- "id": 380,
- "stage": "deploy",
- "name": "production",
- "status": "skipped",
- "created_at": "2016-08-12 15:23:28 UTC",
- "started_at": null,
- "finished_at": null,
- "when": "manual",
- "manual": true,
- "allow_failure": false,
- "user":{
- "id": 1,
- "name": "Administrator",
- "username": "root",
- "avatar_url": "http://www.gravatar.com/avatar/e32bd13e2add097461cb96824b7a829c?s=80\u0026d=identicon",
- "email": "admin@example.com"
- },
- "runner": null,
- "artifacts_file":{
- "filename": null,
- "size": null
- },
- "environment": {
- "name": "production",
- "action": "start",
- "deployment_tier": "production"
- }
- },
- {
- "id": 377,
- "stage": "test",
- "name": "test-image",
- "status": "success",
- "created_at": "2016-08-12 15:23:28 UTC",
- "started_at": "2016-08-12 15:26:12 UTC",
- "finished_at": null,
- "when": "on_success",
- "manual": false,
- "allow_failure": false,
- "user":{
- "id": 1,
- "name": "Administrator",
- "username": "root",
- "avatar_url": "http://www.gravatar.com/avatar/e32bd13e2add097461cb96824b7a829c?s=80\u0026d=identicon",
- "email": "admin@example.com"
- },
- "runner": {
- "id": 380987,
- "description": "shared-runners-manager-6.gitlab.com",
- "active": true,
- "runner_type": "instance_type",
- "is_shared": true,
- "tags": [
- "linux",
- "docker",
- "shared-runner"
- ]
- },
- "artifacts_file":{
- "filename": null,
- "size": null
- },
- "environment": null
- },
- {
- "id": 378,
- "stage": "test",
- "name": "test-build",
- "status": "success",
- "created_at": "2016-08-12 15:23:28 UTC",
- "started_at": "2016-08-12 15:26:12 UTC",
- "finished_at": "2016-08-12 15:26:29 UTC",
- "when": "on_success",
- "manual": false,
- "allow_failure": false,
- "user":{
- "id": 1,
- "name": "Administrator",
- "username": "root",
- "avatar_url": "http://www.gravatar.com/avatar/e32bd13e2add097461cb96824b7a829c?s=80\u0026d=identicon",
- "email": "admin@example.com"
- },
- "runner": {
- "id":380987,
- "description":"shared-runners-manager-6.gitlab.com",
- "active":true,
- "runner_type": "instance_type",
- "is_shared": true,
- "tags": [
- "linux",
- "docker"
- ]
- },
- "artifacts_file":{
- "filename": null,
- "size": null
- },
- "environment": null
- },
- {
- "id": 376,
- "stage": "build",
- "name": "build-image",
- "status": "success",
- "created_at": "2016-08-12 15:23:28 UTC",
- "started_at": "2016-08-12 15:24:56 UTC",
- "finished_at": "2016-08-12 15:25:26 UTC",
- "when": "on_success",
- "manual": false,
- "allow_failure": false,
- "user":{
- "id": 1,
- "name": "Administrator",
- "username": "root",
- "avatar_url": "http://www.gravatar.com/avatar/e32bd13e2add097461cb96824b7a829c?s=80\u0026d=identicon",
- "email": "admin@example.com"
- },
- "runner": {
- "id": 380987,
- "description": "shared-runners-manager-6.gitlab.com",
- "active": true,
- "runner_type": "instance_type",
- "is_shared": true,
- "tags": [
- "linux",
- "docker"
- ]
- },
- "artifacts_file":{
- "filename": null,
- "size": null
- },
- "environment": null
- },
- {
- "id": 379,
- "stage": "deploy",
- "name": "staging",
- "status": "created",
- "created_at": "2016-08-12 15:23:28 UTC",
- "started_at": null,
- "finished_at": null,
- "when": "on_success",
- "manual": false,
- "allow_failure": false,
- "user":{
- "id": 1,
- "name": "Administrator",
- "username": "root",
- "avatar_url": "http://www.gravatar.com/avatar/e32bd13e2add097461cb96824b7a829c?s=80\u0026d=identicon",
- "email": "admin@example.com"
- },
- "runner": null,
- "artifacts_file":{
- "filename": null,
- "size": null
- },
- "environment": {
- "name": "staging",
- "action": "start",
- "deployment_tier": "staging"
- }
- }
- ]
-}
-```
-
-### Job events
-
-Triggered on status change of a job.
-
-**Request Header**:
-
-```plaintext
-X-Gitlab-Event: Job Hook
-```
-
-**Payload example**:
-
-```json
-{
- "object_kind": "build",
- "ref": "gitlab-script-trigger",
- "tag": false,
- "before_sha": "2293ada6b400935a1378653304eaf6221e0fdb8f",
- "sha": "2293ada6b400935a1378653304eaf6221e0fdb8f",
- "build_id": 1977,
- "build_name": "test",
- "build_stage": "test",
- "build_status": "created",
- "build_created_at": "2021-02-23T02:41:37.886Z",
- "build_started_at": null,
- "build_finished_at": null,
- "build_duration": null,
- "build_allow_failure": false,
- "build_failure_reason": "script_failure",
- "pipeline_id": 2366,
- "project_id": 380,
- "project_name": "gitlab-org/gitlab-test",
- "user": {
- "id": 3,
- "name": "User",
- "email": "user@gitlab.com",
- "avatar_url": "http://www.gravatar.com/avatar/e32bd13e2add097461cb96824b7a829c?s=80\u0026d=identicon",
- },
- "commit": {
- "id": 2366,
- "sha": "2293ada6b400935a1378653304eaf6221e0fdb8f",
- "message": "test\n",
- "author_name": "User",
- "author_email": "user@gitlab.com",
- "status": "created",
- "duration": null,
- "started_at": null,
- "finished_at": null
- },
- "repository": {
- "name": "gitlab_test",
- "description": "Atque in sunt eos similique dolores voluptatem.",
- "homepage": "http://192.168.64.1:3005/gitlab-org/gitlab-test",
- "git_ssh_url": "git@192.168.64.1:gitlab-org/gitlab-test.git",
- "git_http_url": "http://192.168.64.1:3005/gitlab-org/gitlab-test.git",
- "visibility_level": 20
- },
- "runner": {
- "active": true,
- "runner_type": "project_type",
- "is_shared": false,
- "id": 380987,
- "description": "shared-runners-manager-6.gitlab.com",
- "tags": [
- "linux",
- "docker"
- ]
- },
- "environment": null
-}
-```
-
-Note that `commit.id` is the ID of the pipeline, not the ID of the commit.
-
-### Deployment events
-
-Triggered when a deployment:
-
-- Starts ([Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/41214) in GitLab 13.5.)
-- Succeeds
-- Fails
-- Is cancelled
-
-**Request Header**:
-
-```plaintext
-X-Gitlab-Event: Deployment Hook
-```
-
-**Payload example**:
-
-```json
-{
- "object_kind": "deployment",
- "status": "success",
- "status_changed_at":"2021-04-28 21:50:00 +0200",
- "deployment_id": 15,
- "deployable_id": 796,
- "deployable_url": "http://10.126.0.2:3000/root/test-deployment-webhooks/-/jobs/796",
- "environment": "staging",
- "project": {
- "id": 30,
- "name": "test-deployment-webhooks",
- "description": "",
- "web_url": "http://10.126.0.2:3000/root/test-deployment-webhooks",
- "avatar_url": null,
- "git_ssh_url": "ssh://vlad@10.126.0.2:2222/root/test-deployment-webhooks.git",
- "git_http_url": "http://10.126.0.2:3000/root/test-deployment-webhooks.git",
- "namespace": "Administrator",
- "visibility_level": 0,
- "path_with_namespace": "root/test-deployment-webhooks",
- "default_branch": "master",
- "ci_config_path": "",
- "homepage": "http://10.126.0.2:3000/root/test-deployment-webhooks",
- "url": "ssh://vlad@10.126.0.2:2222/root/test-deployment-webhooks.git",
- "ssh_url": "ssh://vlad@10.126.0.2:2222/root/test-deployment-webhooks.git",
- "http_url": "http://10.126.0.2:3000/root/test-deployment-webhooks.git"
- },
- "short_sha": "279484c0",
- "user": {
- "id": 1,
- "name": "Administrator",
- "username": "root",
- "avatar_url": "https://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=80&d=identicon",
- "email": "admin@example.com"
- },
- "user_url": "http://10.126.0.2:3000/root",
- "commit_url": "http://10.126.0.2:3000/root/test-deployment-webhooks/-/commit/279484c09fbe69ededfced8c1bb6e6d24616b468",
- "commit_title": "Add new file"
-}
-```
-
-Note that `deployable_id` is the ID of the CI job.
-
-### Group member events **(PREMIUM)**
-
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/260347) in GitLab 13.7.
-
-Member events are triggered when:
-
-- A user is added as a group member
-- The access level of a user has changed
-- The expiration date for user access has been updated
-- A user has been removed from the group
-
-#### Add member to group
-
-**Request Header**:
-
-```plaintext
-X-Gitlab-Event: Member Hook
-```
-
-**Payload example**:
-
-```json
-{
- "created_at": "2020-12-11T04:57:22Z",
- "updated_at": "2020-12-11T04:57:22Z",
- "group_name": "webhook-test",
- "group_path": "webhook-test",
- "group_id": 100,
- "user_username": "test_user",
- "user_name": "Test User",
- "user_email": "testuser@webhooktest.com",
- "user_id": 64,
- "group_access": "Guest",
- "group_plan": null,
- "expires_at": "2020-12-14T00:00:00Z",
- "event_name": "user_add_to_group"
-}
-```
-
-#### Update member access level or expiration date
-
-**Request Header**:
-
-```plaintext
-X-Gitlab-Event: Member Hook
-```
-
-**Payload example**:
-
-```json
-{
- "created_at": "2020-12-11T04:57:22Z",
- "updated_at": "2020-12-12T08:48:19Z",
- "group_name": "webhook-test",
- "group_path": "webhook-test",
- "group_id": 100,
- "user_username": "test_user",
- "user_name": "Test User",
- "user_email": "testuser@webhooktest.com",
- "user_id": 64,
- "group_access": "Developer",
- "group_plan": null,
- "expires_at": "2020-12-20T00:00:00Z",
- "event_name": "user_update_for_group"
-}
-```
-
-#### Remove member from group
-
-**Request Header**:
-
-```plaintext
-X-Gitlab-Event: Member Hook
-```
-
-**Payload example**:
-
-```json
-{
- "created_at": "2020-12-11T04:57:22Z",
- "updated_at": "2020-12-12T08:52:34Z",
- "group_name": "webhook-test",
- "group_path": "webhook-test",
- "group_id": 100,
- "user_username": "test_user",
- "user_name": "Test User",
- "user_email": "testuser@webhooktest.com",
- "user_id": 64,
- "group_access": "Guest",
- "group_plan": null,
- "expires_at": "2020-12-14T00:00:00Z",
- "event_name": "user_remove_from_group"
-}
-```
-
-### Subgroup events **(PREMIUM)**
-
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/260419) in GitLab 13.9.
-
-Subgroup events are triggered when:
-
-- A [subgroup is created in a group](#subgroup-created-in-a-group)
-- A [subgroup is removed from a group](#subgroup-removed-from-a-group)
-
-#### Subgroup created in a group
-
-**Request Header**:
-
-```plaintext
-X-Gitlab-Event: Subgroup Hook
-```
-
-**Payload example**:
-
-```json
-{
-
- "created_at": "2021-01-20T09:40:12Z",
- "updated_at": "2021-01-20T09:40:12Z",
- "event_name": "subgroup_create",
- "name": "subgroup1",
- "path": "subgroup1",
- "full_path": "group1/subgroup1",
- "group_id": 10,
- "parent_group_id": 7,
- "parent_name": "group1",
- "parent_path": "group1",
- "parent_full_path": "group1"
-
-}
-```
-
-#### Subgroup removed from a group
-
-**Request Header**:
-
-```plaintext
-X-Gitlab-Event: Subgroup Hook
-```
-
-**Payload example**:
-
-```json
-{
-
- "created_at": "2021-01-20T09:40:12Z",
- "updated_at": "2021-01-20T09:40:12Z",
- "event_name": "subgroup_destroy",
- "name": "subgroup1",
- "path": "subgroup1",
- "full_path": "group1/subgroup1",
- "group_id": 10,
- "parent_group_id": 7,
- "parent_name": "group1",
- "parent_path": "group1",
- "parent_full_path": "group1"
+You may need to [allow requests to the local network](../../../security/webhooks.md) for this
+receiver to be added.
-}
-```
+## Validate payloads by using a secret token
-NOTE:
-Webhooks for when a [subgroup is removed from a group](#subgroup-removed-from-a-group) are not triggered when a [subgroup is transferred to a new parent group](../../group/index.md#transfer-a-group)
+You can specify a secret token to validate received payloads.
+The token is sent with the hook request in the
+`X-Gitlab-Token` HTTP header. Your webhook endpoint can check the token to verify
+that the request is legitimate.
-### Feature Flag events
+## Verify an SSL certificate
-Triggered when a feature flag is turned on or off.
+By default, the SSL certificate of the webhook endpoint is verified based on
+an internal list of Certificate Authorities. This means the certificate cannot
+be self-signed.
-**Request Header**:
+You can turn off SSL verification in the [webhook settings](#configure-a-webhook)
+in your GitLab projects.
-```plaintext
-X-Gitlab-Event: Feature Flag Hook
-```
+## Filter push events by branch
-**Payload example**:
-
-```json
-{
- "object_kind": "feature_flag",
- "project": {
- "id": 1,
- "name":"Gitlab Test",
- "description":"Aut reprehenderit ut est.",
- "web_url":"http://example.com/gitlabhq/gitlab-test",
- "avatar_url":null,
- "git_ssh_url":"git@example.com:gitlabhq/gitlab-test.git",
- "git_http_url":"http://example.com/gitlabhq/gitlab-test.git",
- "namespace":"GitlabHQ",
- "visibility_level":20,
- "path_with_namespace":"gitlabhq/gitlab-test",
- "default_branch":"master",
- "ci_config_path": null,
- "homepage":"http://example.com/gitlabhq/gitlab-test",
- "url":"http://example.com/gitlabhq/gitlab-test.git",
- "ssh_url":"git@example.com:gitlabhq/gitlab-test.git",
- "http_url":"http://example.com/gitlabhq/gitlab-test.git"
- },
- "user": {
- "id": 1,
- "name": "Administrator",
- "username": "root",
- "avatar_url": "https://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=80&d=identicon",
- "email": "admin@example.com"
- },
- "user_url": "http://example.com/root",
- "object_attributes": {
- "id": 6,
- "name": "test-feature-flag",
- "description": "test-feature-flag-description",
- "active": true
- }
-}
-```
+> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/20338) in GitLab 11.3.
-### Release events
+Push events can be filtered by branch using a branch name or wildcard pattern
+to limit which push events are sent to your webhook endpoint. By default,
+all push events are sent to your webhook endpoint. You can configure branch filtering
+in the [webhook settings](#configure-a-webhook) in your project.
-Triggered when a release is created or updated.
+## HTTP responses for your endpoint
-**Request Header**:
+If you are writing your own endpoint (web server) to receive
+GitLab webhooks, keep in mind the following:
-```plaintext
-X-Gitlab-Event: Release Hook
-```
+- Your endpoint should send its HTTP response as fast as possible. If the response
+ takes longer than the configured timeout, GitLab assumes the hook failed and retries it.
+ To customize the timeout, see
+ [Webhook fails or multiple webhook requests are triggered](#webhook-fails-or-multiple-webhook-requests-are-triggered).
+- Your endpoint should ALWAYS return a valid HTTP response. If not,
+ GitLab assumes the hook failed and retries it.
+ Most HTTP libraries take care of the response for you automatically but if
+ you are writing a low-level hook, this is important to remember.
+- GitLab ignores the HTTP status code returned by your endpoint.
-**Available `object_attributes.action`:**
-
-- `create`
-- `update`
-
-**Payload example**:
-
-```json
-{
- "id": 1,
- "created_at": "2020-11-02 12:55:12 UTC",
- "description": "v1.0 has been released",
- "name": "v1.1",
- "released_at": "2020-11-02 12:55:12 UTC",
- "tag": "v1.1",
- "object_kind": "release",
- "project": {
- "id": 2,
- "name": "release-webhook-example",
- "description": "",
- "web_url": "https://example.com/gitlab-org/release-webhook-example",
- "avatar_url": null,
- "git_ssh_url": "ssh://git@example.com/gitlab-org/release-webhook-example.git",
- "git_http_url": "https://example.com/gitlab-org/release-webhook-example.git",
- "namespace": "Gitlab",
- "visibility_level": 0,
- "path_with_namespace": "gitlab-org/release-webhook-example",
- "default_branch": "master",
- "ci_config_path": null,
- "homepage": "https://example.com/gitlab-org/release-webhook-example",
- "url": "ssh://git@example.com/gitlab-org/release-webhook-example.git",
- "ssh_url": "ssh://git@example.com/gitlab-org/release-webhook-example.git",
- "http_url": "https://example.com/gitlab-org/release-webhook-example.git"
- },
- "url": "https://example.com/gitlab-org/release-webhook-example/-/releases/v1.1",
- "action": "create",
- "assets": {
- "count": 5,
- "links": [
- {
- "id": 1,
- "external": true,
- "link_type": "other",
- "name": "Changelog",
- "url": "https://example.net/changelog"
- }
- ],
- "sources": [
- {
- "format": "zip",
- "url": "https://example.com/gitlab-org/release-webhook-example/-/archive/v1.1/release-webhook-example-v1.1.zip"
- },
- {
- "format": "tar.gz",
- "url": "https://example.com/gitlab-org/release-webhook-example/-/archive/v1.1/release-webhook-example-v1.1.tar.gz"
- },
- {
- "format": "tar.bz2",
- "url": "https://example.com/gitlab-org/release-webhook-example/-/archive/v1.1/release-webhook-example-v1.1.tar.bz2"
- },
- {
- "format": "tar",
- "url": "https://example.com/gitlab-org/release-webhook-example/-/archive/v1.1/release-webhook-example-v1.1.tar"
- }
- ]
- },
- "commit": {
- "id": "ee0a3fb31ac16e11b9dbb596ad16d4af654d08f8",
- "message": "Release v1.1",
- "title": "Release v1.1",
- "timestamp": "2020-10-31T14:58:32+11:00",
- "url": "https://example.com/gitlab-org/release-webhook-example/-/commit/ee0a3fb31ac16e11b9dbb596ad16d4af654d08f8",
- "author": {
- "name": "Example User",
- "email": "user@example.com"
- }
- }
-}
-```
+## How image URLs are displayed in the webhook body
-## Image URL rewriting
+> Introduced in GitLab 11.2.
-From GitLab 11.2, simple image references are rewritten to use an absolute URL
-in webhooks. So if an image, merge request, comment, or wiki page has this in
-its description:
+Relative image references are rewritten to use an absolute URL
+in the body of a webhook.
+For example, if an image, merge request, comment, or wiki page includes the
+following image reference:
```markdown
![image](/uploads/$sha/image.png)
```
-It appears in the webhook body as follows assuming that:
+If:
- GitLab is installed at `gitlab.example.com`.
- The project is at `example-group/example-project`.
+The reference is rewritten in the webhook body as follows:
+
```markdown
![image](https://gitlab.example.com/example-group/example-project/uploads/$sha/image.png)
```
-This doesn't rewrite URLs that already are pointing to HTTP, HTTPS, or
-protocol-relative URLs. It also doesn't rewrite image URLs using advanced
-Markdown features, like link labels.
+Image URLs are not rewritten if:
-## Testing webhooks
+- They already point to HTTP, HTTPS, or
+ protocol-relative URLs.
+- They use advanced Markdown features like link labels.
-You can trigger the webhook manually. Sample data from the project is used.
-For example, for triggering `Push Events` your project should have at least one commit.
+## Events
-![Webhook testing](img/webhook_testing.png)
+For more information about supported events for Webhooks, go to [Webhook events](webhook_events.md).
## Troubleshoot webhooks
-GitLab stores each perform of the webhook.
-You can find records for last 2 days in "Recent Deliveries" section on the edit page of each webhook.
+GitLab records the history of each webhook request.
+You can view requests made in the last 2 days in the **Recent events** table.
-![Recent deliveries](img/webhook_logs.png)
+To view the table:
-In this section you can see:
+1. In your project, on the left sidebar, select **Settings > Webhooks**.
+1. Scroll down to the webhooks.
+1. Select **Edit** for the webhook you want to view.
-- HTTP status code (green for `200-299` codes, red for the others, `internal error` for failed deliveries).
-- Triggered event.
-- A time when the event was called.
-- Elapsed time of the request.
+The table includes the following details about each request:
-If you need more information about execution, you can click `View details` link.
-On this page, you can see data that GitLab sends (request headers and body) and data that it received (response headers and body).
+- HTTP status code (green for `200`-`299` codes, red for the others, and `internal error` for failed deliveries)
+- Triggered event
+- Elapsed time of the request
+- Relative time for when the request was made
-From this page, you can repeat delivery with the same data by clicking `Resend Request` button.
+![Recent deliveries](img/webhook_logs.png)
NOTE:
-This history is unavailable for Group-level webhooks. For more information, read
+The **Recent events** table is unavailable for group-level webhooks. For more information, read
[issue #325642](https://gitlab.com/gitlab-org/gitlab/-/issues/325642).
+Each webhook event has a corresponding **Details** page. This page details the data that GitLab sent (request headers and body) and received (response headers and body).
+To view the **Details** page, select **View details** for the webhook event.
+
+To repeat the delivery with the same data, select **Resend Request**.
+
NOTE:
-If URL or secret token of the webhook were updated, data is delivered to the new address.
+If you update the URL or secret token of the webhook, data is delivered to the new address.
### Webhook fails or multiple webhook requests are triggered
-When GitLab sends a webhook, it expects a response in 10 seconds by default. If it does not receive
-one, it retries the webhook. If the endpoint doesn't send its HTTP response within those 10 seconds,
-GitLab may decide the hook failed and retry it.
+When GitLab sends a webhook, it expects a response in 10 seconds by default.
+If the endpoint doesn't send an HTTP response in those 10 seconds,
+GitLab may assume the webhook failed and retry it.
-If your webhooks are failing or you are receiving multiple requests, you can try changing the
-default value. You can do this by uncommenting or adding the following setting to your
-`/etc/gitlab/gitlab.rb` file:
+If your webhooks are failing or you are receiving multiple requests,
+you can try changing the default timeout value.
+In your `/etc/gitlab/gitlab.rb` file, uncomment or add the following setting:
```ruby
gitlab_rails['webhook_timeout'] = 10
@@ -1809,48 +233,11 @@ gitlab_rails['webhook_timeout'] = 10
### Unable to get local issuer certificate
-When SSL verification is enabled, this error indicates that GitLab isn't able to verify the SSL certificate of the webhook endpoint.
-Typically, this is because the root certificate isn't issued by a trusted certification authority as
+When SSL verification is enabled, you might get an error that GitLab cannot
+verify the SSL certificate of the webhook endpoint.
+Typically, this error occurs because the root certificate isn't
+issued by a trusted certification authority as
determined by [CAcert.org](http://www.cacert.org/).
-Should that not be the case, consider using [SSL Checker](https://www.sslshopper.com/ssl-checker.html) to identify faults.
-Missing intermediate certificates are a common point of verification failure.
-
-## Example webhook receiver
-
-If you want to see GitLab webhooks in action for testing purposes you can use
-a simple echo script running in a console session. For the following script to
-work you need to have Ruby installed.
-
-Save the following file as `print_http_body.rb`:
-
-```ruby
-require 'webrick'
-
-server = WEBrick::HTTPServer.new(:Port => ARGV.first)
-server.mount_proc '/' do |req, res|
- puts req.body
-end
-
-trap 'INT' do
- server.shutdown
-end
-server.start
-```
-
-Pick an unused port (for example, `8000`) and start the script: `ruby print_http_body.rb
-8000`. Then add your server as a webhook receiver in GitLab as
-`http://my.host:8000/`.
-
-When you press 'Test' in GitLab, you should see something like this in the
-console:
-
-```plaintext
-{"before":"077a85dd266e6f3573ef7e9ef8ce3343ad659c4e","after":"95cd4a99e93bc4bbabacfa2cd10e6725b1403c60",<SNIP>}
-example.com - - [14/May/2014:07:45:26 EDT] "POST / HTTP/1.1" 200 0
-- -> /
-```
-
-NOTE:
-You may need to [allow requests to the local network](../../../security/webhooks.md) for this
-receiver to be added.
+If that is not the case, consider using [SSL Checker](https://www.sslshopper.com/ssl-checker.html) to identify faults.
+Missing intermediate certificates are common causes of verification failure.
diff --git a/doc/user/project/integrations/zentao.md b/doc/user/project/integrations/zentao.md
deleted file mode 100644
index ab8a7829139..00000000000
--- a/doc/user/project/integrations/zentao.md
+++ /dev/null
@@ -1,40 +0,0 @@
----
-stage: Ecosystem
-group: Integrations
-info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
----
-
-# ZenTao product integration **(PREMIUM)**
-
-[ZenTao](https://www.zentao.net/) is a web-based project management platform.
-
-## Configure ZenTao
-
-This integration requires a ZenTao API secret key.
-
-Complete these steps in ZenTao:
-
-1. Go to your **Admin** page and select **Develop > Application**.
-1. Select **Add Application**.
-1. Under **Name** and **Code**, enter a name and a code for the new secret key.
-1. Under **Account**, select an existing account name.
-1. Select **Save**.
-1. Copy the generated key to use in GitLab.
-
-## Configure GitLab
-
-Complete these steps in GitLab:
-
-1. Go to your project and select **Settings > Integrations**.
-1. Select **ZenTao**.
-1. Turn on the **Active** toggle under **Enable Integration**.
-1. Provide the ZenTao configuration information:
- - **ZenTao Web URL**: The base URL of the ZenTao instance web interface you're linking to this GitLab project (for example, `example.zentao.net`).
- - **ZenTao API URL** (optional): The base URL to the ZenTao instance API. Defaults to the Web URL value if not set.
- - **ZenTao API token**: Use the key you generated when you [configured ZenTao](#configure-zentao).
- - **ZenTao Product ID**: To display issues from a single ZenTao product in a given GitLab project. The Product ID can be found in the ZenTao product page under **Settings > Overview**.
-
- ![ZenTao settings page](img/zentao_product_id.png)
-
-1. To verify the ZenTao connection is working, select **Test settings**.
-1. Select **Save changes**.
diff --git a/doc/user/project/issue_board.md b/doc/user/project/issue_board.md
index 4d1805e3d31..8a599608f71 100644
--- a/doc/user/project/issue_board.md
+++ b/doc/user/project/issue_board.md
@@ -203,17 +203,13 @@ When visiting a board, issues appear ordered in any list. You're able to change
that order by dragging the issues. The changed order is saved, so that anybody who visits the same
board later sees the reordering, with some exceptions.
-The first time an issue appears in any board (that is, the first time a user
-loads a board containing that issue), it is ordered in relation to other issues in that list.
-The order is done according to [label priority](labels.md#label-priority).
+When an issue is created, the system assigns a relative order value that is greater than the maximum value
+of that issue's project or root group. This means the issue will be at the bottom of any issue list that
+it appears in.
-At this point, that issue is assigned a relative order value by the system,
-with respect to the other issues in the list. Any time
-you drag and reorder the issue, its relative order value changes accordingly.
-
-Also, any time that issue appears in any board, the ordering is done according to
-the updated relative order value. It's only the first
-time an issue appears that it takes from the priority order mentioned above. If a user in your GitLab instance
+Any time you drag and reorder the issue, its relative order value changes accordingly.
+Then, any time that issue appears in any board, the ordering is done according to
+the updated relative order value. If a user in your GitLab instance
drags issue `A` above issue `B`, the ordering is maintained when these two issues are subsequently
loaded in any board in the same instance. This could be a different project board or a different group
board, for example.
diff --git a/doc/user/project/issues/design_management.md b/doc/user/project/issues/design_management.md
index 7f2713b81e6..37c00bf0efa 100644
--- a/doc/user/project/issues/design_management.md
+++ b/doc/user/project/issues/design_management.md
@@ -1,21 +1,21 @@
---
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"
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
# Design Management **(FREE)**
-> - [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/660) in [GitLab Premium](https://about.gitlab.com/pricing/) 12.2.
-> - Support for SVGs was [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/12771) in [GitLab Premium](https://about.gitlab.com/pricing/) 12.4.
-> - Design Management was [moved](https://gitlab.com/gitlab-org/gitlab/-/issues/212566) to GitLab Free in 13.0.
+> - [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/660) in GitLab Premium 12.2.
+> - Support for SVGs [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/12771) in GitLab Premium 12.4.
+> - [Moved](https://gitlab.com/gitlab-org/gitlab/-/issues/212566) to GitLab Free in 13.0.
-Design Management allows you to upload design assets (wireframes, mockups, etc.)
-to GitLab issues and keep them stored in one single place, accessed by the Design
+Design Management allows you to upload design assets (including wireframes and mockups)
+to GitLab issues and keep them stored in a single place, accessed by the Design
Management's page within an issue, giving product designers, product managers, and engineers a
-way to collaborate on designs over one single source of truth.
+way to collaborate on designs over a single source of truth.
-You can easily share mock-ups of designs with your team, or visual regressions can be easily
+You can share mock-ups of designs with your team, or visual regressions can be
viewed and addressed.
<i class="fa fa-youtube-play youtube" aria-hidden="true"></i>
@@ -36,10 +36,11 @@ to be enabled:
and enable **Git Large File Storage**.
Design Management also requires that projects are using
-[hashed storage](../../../administration/raketasks/storage.md#migrate-to-hashed-storage). Since
- GitLab 10.0, newly created projects use hashed storage by default. A GitLab administrator can verify the storage type of a
-project by navigating to **Admin Area > Projects** and then selecting the project in question.
-A project can be identified as hashed-stored if its *Gitaly relative path* contains `@hashed`.
+[hashed storage](../../../administration/raketasks/storage.md#migrate-to-hashed-storage).
+Newly created projects use hashed storage by default. A GitLab administrator
+can verify the storage type of a project by going to **Admin Area > Projects**
+and then selecting the project in question. A project can be identified as
+hashed-stored if its *Gitaly relative path* contains `@hashed`.
If the requirements are not met, the **Designs** tab displays a message to the user.
@@ -74,8 +75,8 @@ and connect to GitLab through a personal access token. The details are explained
## The Design Management section
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/223193) in GitLab 13.2, Designs are displayed directly on the issue description rather than on a separate tab.
-> - New display's feature flag [removed](https://gitlab.com/gitlab-org/gitlab/-/issues/223197) in GitLab 13.4.
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/223193) in GitLab 13.2. Designs are displayed directly in the issue description instead of a separate tab.
+> - [Feature flag removed](https://gitlab.com/gitlab-org/gitlab/-/issues/223197) for new displays in GitLab 13.4.
You can find to the **Design Management** section in the issue description:
@@ -83,22 +84,26 @@ You can find to the **Design Management** section in the issue description:
## Adding designs
+> - Drag and drop uploads [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/34353) in GitLab Premium 12.9.
+> - New version creation on upload [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/34353) in GitLab Premium 12.9.
+> - Copy and paste uploads [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/202634) in GitLab 12.10.
+> - [Moved](https://gitlab.com/gitlab-org/gitlab/-/issues/212566) to GitLab Free in 13.0.
+
To upload Design images, drag files from your computer and drop them in the Design Management section,
-or click **upload** to select images from your file browser:
+or select **click to upload** to select images from your file browser:
![Designs empty state](img/design_management_upload_v13.3.png)
-[Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/34353) in [GitLab Premium](https://about.gitlab.com/pricing/) 12.9,
-you can drag and drop designs onto the dedicated drop zone to upload them.
+You can drag and drop designs onto the dedicated drop zone to upload them.
![Drag and drop design uploads](img/design_drag_and_drop_uploads_v13_2.png)
-[Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/202634)
-in GitLab 12.10, you can also copy images from your file system and
-paste them directly on the GitLab Design page as a new design.
+You can also copy images from your file system and paste them directly on the
+GitLab Design page as a new design.
-On macOS you can also take a screenshot and immediately copy it to
-the clipboard by simultaneously clicking <kbd>Control</kbd> + <kbd>Command</kbd> + <kbd>Shift</kbd> + <kbd>3</kbd>, and then paste it as a design.
+On macOS, you can take a screenshot and immediately copy it to the clipboard
+by simultaneously pressing <kbd>Control</kbd> + <kbd>Command</kbd> + <kbd>Shift</kbd> + <kbd>3</kbd>,
+and then paste it as a design.
Copy-and-pasting has some limitations:
@@ -108,24 +113,24 @@ Copy-and-pasting has some limitations:
- Copy/pasting designs is not supported on Internet Explorer.
Designs with the same filename as an existing uploaded design create a new version
-of the design, and replaces the previous version. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/34353) in [GitLab Premium](https://about.gitlab.com/pricing/) 12.9, dropping a design on an existing uploaded design also creates a new version,
-provided the filenames are the same.
+of the design, and replaces the previous version. Dropping a design on an
+existing uploaded design creates a new version if the filenames are the same.
### Skipped designs
Designs with the same filename as an existing uploaded design _and_ whose content has not changed are skipped.
-This means that no new version of the design is created. When designs are skipped, you are made aware via a warning
+This means that no new version of the design is created. When designs are skipped, you are made aware by a warning
message on the Issue.
## Viewing designs
-Images on the Design Management page can be enlarged by clicking on them.
-You can navigate through designs by clicking on the navigation buttons on the
+Images on the Design Management page can be enlarged by selecting them.
+You can navigate through designs by selecting the navigation buttons on the
top-right corner or with <kbd>Left</kbd>/<kbd>Right</kbd> keyboard buttons.
The number of discussions on a design — if any — is listed to the right
-of the design filename. Clicking on this number enlarges the design
-just like clicking anywhere else on the design.
+of the design filename. Selecting this number enlarges the design,
+similar to clicking or tapping anywhere else in the design.
When a design is added or modified, an icon is displayed on the item
to help summarize changes between versions.
@@ -137,27 +142,29 @@ to help summarize changes between versions.
### Exploring designs by zooming
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/13217) in [GitLab Premium](https://about.gitlab.com/pricing/) 12.7.
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/13217) in GitLab Premium 12.7.
+> - Drag to move a zoomed image [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/197324) in GitLab 12.10.
+> - [Moved](https://gitlab.com/gitlab-org/gitlab/-/issues/212566) to GitLab Free in 13.0.
Designs can be explored in greater detail by zooming in and out of the image.
Control the amount of zoom with the `+` and `-` buttons at the bottom of the image.
While zoomed, you can still [start new discussions](#starting-discussions-on-designs) on the image, and see any existing ones.
-[Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/197324) in GitLab 12.10, while zoomed in,
-you can click-and-drag on the image to move around it.
+While zoomed in, you can drag the image to move around it.
![Design zooming](img/design_zooming_v12_7.png)
## Deleting designs
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/11089) in [GitLab Premium](https://about.gitlab.com/pricing/) 12.4.
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/11089) in GitLab Premium 12.4.
+> - [Moved](https://gitlab.com/gitlab-org/gitlab/-/issues/212566) to GitLab Free in 13.0.
There are two ways to delete designs: manually delete them
individually, or select a few of them to delete at once,
as shown below.
-To delete a single design, click it to view it enlarged,
-then click the trash icon on the top right corner and confirm
-the deletion by clicking the **Delete** button on the modal window:
+To delete a single design, select it to view it enlarged,
+then select the trash icon on the top right corner and confirm
+the deletion by selecting **Delete** in the window:
![Confirm design deletion](img/confirm_design_deletion_v12_4.png)
@@ -166,7 +173,7 @@ first select the designs you want to delete:
![Select designs](img/select_designs_v12_4.png)
-Once selected, click the **Delete selected** button to confirm the deletion:
+Select **Delete selected** to confirm the deletion:
![Delete multiple designs](img/delete_multiple_designs_v12_4.png)
@@ -183,14 +190,16 @@ You can change the order of designs by dragging them to a new position.
## Starting discussions on designs
-When a design is uploaded, you can start a discussion by clicking on
+> - Adjusting a pin's position [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/34353) in GitLab Premium 12.8.
+> - [Moved](https://gitlab.com/gitlab-org/gitlab/-/issues/212566) to GitLab Free in 13.0.
+
+When a design is uploaded, you can start a discussion by selecting
the image on the exact location you would like the discussion to be focused on.
A pin is added to the image, identifying the discussion's location.
![Starting a new discussion on design](img/adding_note_to_design_1.png)
-[Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/34353) in [GitLab Premium](https://about.gitlab.com/pricing/) 12.8,
-you can adjust a pin's position by dragging it around the image. This is useful
+You can adjust a pin's position by dragging it around the image. This is useful
for when your design layout has changed between revisions, or if you need to move an
existing pin to add a new one in its place.
@@ -198,7 +207,7 @@ Different discussions have different pin numbers:
![Discussions on designs](img/adding_note_to_design_2.png)
-From GitLab 12.5 on, new discussions are outputted to the issue activity,
+In GitLab 12.5 and later, new discussions are output to the issue activity,
so that everyone involved can participate in the discussion.
## Resolve Design threads
@@ -209,20 +218,20 @@ Discussion threads can be resolved on Designs.
There are two ways to resolve/unresolve a Design thread:
-1. You can mark a thread as resolved or unresolved by clicking the checkmark icon for **Resolve thread** in the top-right corner of the first comment of the discussion:
+1. You can mark a thread as resolved or unresolved by selecting the checkmark icon for **Resolve thread** in the top-right corner of the first comment of the discussion:
- ![Resolve thread icon](img/resolve_design-discussion_icon_v13_1.png)
+ ![Resolve thread icon](img/resolve_design-discussion_icon_v13_1.png)
1. Design threads can also be resolved or unresolved in their threads by using a checkbox.
- When replying to a comment, there is a checkbox that you can click in order to resolve or unresolve
- the thread once published:
+ When replying to a comment, you can select or clear a checkbox to resolve or unresolve
+ the thread after publishing:
- ![Resolve checkbox](img/resolve_design-discussion_checkbox_v13_1.png)
+ ![Resolve checkbox](img/resolve_design-discussion_checkbox_v13_1.png)
Resolving a discussion thread also marks any pending to-do items related to notes
inside the thread as done. This is applicable only for to-do items owned by the user triggering the action.
-Note that your resolved comment pins disappear from the Design to free up space for new discussions.
+Your resolved comment pins disappear from the Design to free up space for new discussions.
However, if you need to revisit or find a resolved discussion, all of your resolved threads are
available in the **Resolved Comment** area at the bottom of the right sidebar.
@@ -231,19 +240,19 @@ available in the **Resolved Comment** area at the bottom of the right sidebar.
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/198439) in GitLab 13.4.
> - [Feature flag removed](https://gitlab.com/gitlab-org/gitlab/-/issues/245074) in GitLab 13.5.
-Add a to-do item for a design by clicking **Add a to do** on the design sidebar:
+Add a to-do item for a design by selecting **Add a to do** on the design sidebar:
![To-do button](img/design_todo_button_v13_5.png)
## Referring to designs in Markdown
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/217160) in **GitLab 13.1**.
-> - [Feature flag removed](https://gitlab.com/gitlab-org/gitlab/-/issues/258662) in **GitLab 13.5**
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/217160) in GitLab 13.1.
+> - [Feature flag removed](https://gitlab.com/gitlab-org/gitlab/-/issues/258662) in GitLab 13.5.
We support referring to designs in [Markdown](../../markdown.md), which is available
throughout the application, including in merge request and issue descriptions, in discussions and comments, and in wiki pages.
-At present, full URL references are supported. For example, if we refer to a design
+Full URL references are supported. For example, if we refer to a design
somewhere with:
```markdown
diff --git a/doc/user/project/issues/due_dates.md b/doc/user/project/issues/due_dates.md
index 5b8dd617ab9..94a5fdc3f0f 100644
--- a/doc/user/project/issues/due_dates.md
+++ b/doc/user/project/issues/due_dates.md
@@ -15,7 +15,7 @@ the issue can view the due date.
When creating an issue, select the **Due date** field to make a calendar
appear for choosing the date. To remove the date, select the date
-text and delete it. The date is related to the server's timezone, not the timezone of
+text and delete it. The date is related to the server's time zone, not the time zone of
the user setting the due date.
![Create a due date](img/due_dates_create.png)
@@ -45,7 +45,7 @@ Due dates also appear in your [to-do list](../../todos.md).
The day before an open issue is due, an email is sent to all participants
of the issue. Like the due date, the "day before the due date" is determined by the
-server's timezone.
+server's time zone.
Issues with due dates can also be exported as an iCalendar feed. The URL of the
feed can be added to calendar applications. The feed is accessible by selecting
diff --git a/doc/user/project/issues/managing_issues.md b/doc/user/project/issues/managing_issues.md
index 7033b90b736..a2fa044be6b 100644
--- a/doc/user/project/issues/managing_issues.md
+++ b/doc/user/project/issues/managing_issues.md
@@ -212,7 +212,7 @@ that are not in status **closed** from one project to another.
To access rails console run `sudo gitlab-rails console` on the GitLab server and run the below
script. Please be sure to change `project`, `admin_user`, and `target_project` to your values.
-We do also recommend [creating a backup](../../../raketasks/backup_restore.md#back-up-gitlab) before
+We do also recommend [creating a backup](../../../raketasks/backup_restore.md) before
attempting any changes in the console.
```ruby
diff --git a/doc/user/project/labels.md b/doc/user/project/labels.md
index 43d6ab2070d..e9cbe012110 100644
--- a/doc/user/project/labels.md
+++ b/doc/user/project/labels.md
@@ -156,8 +156,6 @@ to the project:
## Scoped labels **(PREMIUM)**
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/9175) in [GitLab Premium](https://about.gitlab.com/pricing/) 11.10.
-
Scoped labels allow teams to use the label feature to annotate issues, merge requests
and epics with mutually exclusive labels. This can enable more complicated workflows
by preventing certain labels from being used together.
@@ -180,6 +178,19 @@ For example:
1. GitLab automatically removes the `priority::low` label, as an issue should not
have two priority labels at the same time.
+### Filter by scoped labels
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/12285) in GitLab 14.4.
+
+To filter issue, merge request, or epic lists for ones with labels that belong to a given scope, enter
+`<scope>::*` in the searched label name.
+
+For example, filtering by the `platform::*` label returns issues that have `platform::iOS`,
+`platform::Android`, or `platform::Linux` labels.
+
+NOTE:
+This is not available on the [issues or merge requests dashboard pages](../search/index.md#issues-and-merge-requests).
+
### Workflows with scoped labels
Suppose you wanted a custom field in issues to track the operating system platform
@@ -228,14 +239,14 @@ to label notifications for the project only, or the whole group.
## Label priority
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/14189) in GitLab 8.9.
-> - Priority sorting is based on the highest priority label only. [This discussion](https://gitlab.com/gitlab-org/gitlab/-/issues/14523) considers changing this.
-
Labels can have relative priorities, which are used in the **Label priority** and
**Priority** sort orders of issues and merge request list pages. Prioritization
for both group and project labels happens at the project level, and cannot be done
from the group label list.
+NOTE:
+Priority sorting is based on the highest priority label only. [This discussion](https://gitlab.com/gitlab-org/gitlab/-/issues/14523) considers changing this.
+
From the project label list page, star a label to indicate that it has a priority.
![Labels prioritized](img/labels_prioritized_v13_5.png)
diff --git a/doc/user/project/members/img/project_members_filter_direct_v13_9.png b/doc/user/project/members/img/project_members_filter_direct_v13_9.png
deleted file mode 100644
index 50115ee4052..00000000000
--- a/doc/user/project/members/img/project_members_filter_direct_v13_9.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/project/members/img/project_members_filter_direct_v14_4.png b/doc/user/project/members/img/project_members_filter_direct_v14_4.png
new file mode 100644
index 00000000000..79cee06bc30
--- /dev/null
+++ b/doc/user/project/members/img/project_members_filter_direct_v14_4.png
Binary files differ
diff --git a/doc/user/project/members/img/project_members_filter_inherited_v13_9.png b/doc/user/project/members/img/project_members_filter_inherited_v13_9.png
deleted file mode 100644
index 433003fe58b..00000000000
--- a/doc/user/project/members/img/project_members_filter_inherited_v13_9.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/project/members/img/project_members_filter_inherited_v14_4.png b/doc/user/project/members/img/project_members_filter_inherited_v14_4.png
new file mode 100644
index 00000000000..ce2a0ebf088
--- /dev/null
+++ b/doc/user/project/members/img/project_members_filter_inherited_v14_4.png
Binary files differ
diff --git a/doc/user/project/members/img/project_members_search_v13_9.png b/doc/user/project/members/img/project_members_search_v13_9.png
deleted file mode 100644
index 67280d11dca..00000000000
--- a/doc/user/project/members/img/project_members_search_v13_9.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/project/members/img/project_members_search_v14_4.png b/doc/user/project/members/img/project_members_search_v14_4.png
new file mode 100644
index 00000000000..8c52c5788d4
--- /dev/null
+++ b/doc/user/project/members/img/project_members_search_v14_4.png
Binary files differ
diff --git a/doc/user/project/members/img/project_members_sort_v13_9.png b/doc/user/project/members/img/project_members_sort_v13_9.png
deleted file mode 100644
index 47abe18ba49..00000000000
--- a/doc/user/project/members/img/project_members_sort_v13_9.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/project/members/img/project_members_sort_v14_4.png b/doc/user/project/members/img/project_members_sort_v14_4.png
new file mode 100644
index 00000000000..20834b9307e
--- /dev/null
+++ b/doc/user/project/members/img/project_members_sort_v14_4.png
Binary files differ
diff --git a/doc/user/project/members/img/project_members_v13_9.png b/doc/user/project/members/img/project_members_v13_9.png
deleted file mode 100644
index 3b48c752c6a..00000000000
--- a/doc/user/project/members/img/project_members_v13_9.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/project/members/img/project_members_v14_4.png b/doc/user/project/members/img/project_members_v14_4.png
new file mode 100644
index 00000000000..0a235e91d28
--- /dev/null
+++ b/doc/user/project/members/img/project_members_v14_4.png
Binary files differ
diff --git a/doc/user/project/members/index.md b/doc/user/project/members/index.md
index 8a70b74fcc1..f9788ef18ec 100644
--- a/doc/user/project/members/index.md
+++ b/doc/user/project/members/index.md
@@ -87,7 +87,7 @@ A success message is displayed and the new members are now displayed in the list
When your project belongs to a group, group members inherit their role
from the group.
-![Project members page](img/project_members_v13_9.png)
+![Project members page](img/project_members_v14_4.png)
In this example:
@@ -140,7 +140,7 @@ You can filter and sort members in a project.
1. In the **Filter members** box, select `Membership` `=` `Inherited`.
1. Press Enter.
-![Project members filter inherited](img/project_members_filter_inherited_v13_9.png)
+![Project members filter inherited](img/project_members_filter_inherited_v14_4.png)
### Display direct members
@@ -148,19 +148,19 @@ You can filter and sort members in a project.
1. In the **Filter members** box, select `Membership` `=` `Direct`.
1. Press Enter.
-![Project members filter direct](img/project_members_filter_direct_v13_9.png)
+![Project members filter direct](img/project_members_filter_direct_v14_4.png)
### Search
You can search for members by name, username, or email.
-![Project members search](img/project_members_search_v13_9.png)
+![Project members search](img/project_members_search_v14_4.png)
### Sort
You can sort members by **Account**, **Access granted**, **Max role**, or **Last sign-in** in ascending or descending order.
-![Project members sort](img/project_members_sort_v13_9.png)
+![Project members sort](img/project_members_sort_v14_4.png)
## Request access to a project
diff --git a/doc/user/project/members/share_project_with_groups.md b/doc/user/project/members/share_project_with_groups.md
index e1149b85cd5..abca140411a 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: none
-group: unassigned
+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/engineering/ux/technical-writing/#assignments
---
diff --git a/doc/user/project/merge_requests/approvals/rules.md b/doc/user/project/merge_requests/approvals/rules.md
index 7e168fb239a..b422982c0e7 100644
--- a/doc/user/project/merge_requests/approvals/rules.md
+++ b/doc/user/project/merge_requests/approvals/rules.md
@@ -154,7 +154,7 @@ become eligible approvers in the project. To enable this merge request approval
1. Go to your project and select **Settings > General**.
1. Expand **Merge request (MR) approvals**.
-1. Locate **Any eligible user** and select the number of approvals required:
+1. Locate **Eligible users** and select the number of approvals required:
![MR approvals by Code Owners](img/mr_approvals_by_code_owners_v12_7.png)
@@ -225,7 +225,7 @@ approval rule for certain branches:
1. Go to your project and select **Settings**.
1. Expand **Merge request (MR) approvals**.
1. Select a **Target branch**:
- - To protect all branches, select **Any branch**.
+ - To protect all branches, select **All branches**.
- To select a specific branch, select it from the list:
![Scoped to protected branch](img/scoped_to_protected_branch_v13_10.png)
diff --git a/doc/user/project/merge_requests/approvals/settings.md b/doc/user/project/merge_requests/approvals/settings.md
index ebd07f30f52..1c56e91ed6b 100644
--- a/doc/user/project/merge_requests/approvals/settings.md
+++ b/doc/user/project/merge_requests/approvals/settings.md
@@ -5,7 +5,7 @@ info: "To determine the technical writer assigned to the Stage/Group associated
type: reference, concepts
---
-# Merge request approval settings **(FREE)**
+# Merge request approval settings **(PREMIUM)**
You can configure the settings for [merge request approvals](index.md) to
ensure the approval rules meet your use case. You can also configure
@@ -30,7 +30,7 @@ In this section of general settings, you can configure the following settings:
| [Require user password to approve](#require-user-password-to-approve) | Force potential approvers to first authenticate with a password. |
| [Remove all approvals when commits are added to the source branch](#remove-all-approvals-when-commits-are-added-to-the-source-branch) | When enabled, remove all existing approvals on a merge request when more changes are added to it. |
-## Prevent approval by author **(PREMIUM)**
+## Prevent approval by author
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/3349) in GitLab 11.3.
> - Moved to GitLab Premium in 13.9.
@@ -52,7 +52,7 @@ this setting, unless you configure one of these options:
at the instance level, you can't edit this setting at the project or individual
merge request levels.
-## Prevent approvals by users who add commits **(PREMIUM)**
+## Prevent approvals by users who add commits
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/10441) in GitLab 11.10.
> - Moved to GitLab Premium in 13.9.
@@ -126,13 +126,29 @@ merge request could introduce a vulnerability.
To learn more, see [Security approvals in merge requests](../../../application_security/index.md#security-approvals-in-merge-requests).
-## Code coverage check approvals **(PREMIUM)**
+## Code coverage check approvals
You can require specific approvals if a merge request would result in a decline in code test
coverage.
To learn more, see [Coverage check approval rule](../../../../ci/pipelines/settings.md#coverage-check-approval-rule).
+## Merge request approval settings cascading
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/285410) in GitLab 14.4. [Deployed behind the `group_merge_request_approval_settings_feature_flag` flag](../../../../administration/feature_flags.md), disabled by default.
+
+FLAG:
+On self-managed GitLab, by default this feature is not available. To make it available per group, ask an administrator to [enable the `group_merge_request_approval_settings_feature_flag` flag](../../../../administration/feature_flags.md). On GitLab.com, this feature is not available.
+You should not use this feature for production environments
+
+You can also enforce merge request approval settings:
+
+- At the [instance level](../../../admin_area/merge_requests_approvals.md), which apply to all groups on an instance and, therefore, all
+ projects.
+- On a [top-level group](../../../group/index.md#group-approval-rules), which apply to all subgroups and projects.
+
+If the settings are inherited by a group or project, they cannot be overridden by the group or project that inherited them.
+
## Related links
- [Instance-level merge request approval settings](../../../admin_area/merge_requests_approvals.md)
diff --git a/doc/user/project/merge_requests/confidential.md b/doc/user/project/merge_requests/confidential.md
index 6df84dd1dd1..ff2e6acf123 100644
--- a/doc/user/project/merge_requests/confidential.md
+++ b/doc/user/project/merge_requests/confidential.md
@@ -11,11 +11,11 @@ info: To determine the technical writer assigned to the Stage/Group associated w
Merge requests in a public repository are also public, even when the merge
request is created for a [confidential issue](../issues/confidential_issues.md).
To avoid leaking confidential information when working on a confidential issue,
-create your merge request from a private fork.
+create your merge request from a private fork in the same namespace.
Roles are inherited from parent groups. If you create your private fork in the
-same group or subgroup as the original (public) repository, developers receive
-the same permissions in your fork. This inheritance ensures:
+same namespace (same group or subgroup) as the original (public) repository,
+developers receive the same permissions in your fork. This inheritance ensures:
- Developer users have the needed permissions to view confidential issues and resolve them.
- You do not need grant individual users access to your fork.
@@ -24,13 +24,17 @@ The [security practices for confidential merge requests](https://gitlab.com/gitl
## Create a confidential merge request
-WARNING:
-To create a confidential merge request, you must create a private fork. This fork
-may expose confidential information, if you create your fork in another namespace
-that may have other members.
-
Branches are public by default. To protect the confidentiality of your work, you
-must create your changes in a private fork.
+must create your branches and merge requests in the same namespace, but downstream
+in a private fork. If you create your private fork in the same namespace as the
+public repository, your fork inherits the permissions of the upstream public repository.
+Users with the Developer role in the upstream public repository inherit those upstream
+permissions in your downstream private fork without action by you. These users can
+immediately push code to branches in your private fork to help fix the confidential issue.
+
+WARNING:
+Your private fork may expose confidential information, if you create it in a different
+namespace than the upstream repository. The two namespaces may not contain the same users.
Prerequisites:
@@ -56,16 +60,15 @@ To create a confidential merge request:
branches must be available in your selected fork.
1. Select **Create**.
-If you created a branch in your private fork, users with the Developer role in the
-public repository can push code to that branch in your private fork to fix the
-confidential issue.
+This merge request targets your private fork, not the public upstream project.
+Your branch, merge requests, and commits remain in your private fork. This prevents
+prematurely revealing confidential information.
-As your merge request targets your private fork, not the public upstream project,
-your branch, merge request, and commits do not enter the public repository. This
-prevents prematurely revealing confidential information.
+Open a merge request
+[from your fork to the upstream repository](../repository/forking_workflow.md#merging-upstream) when:
-To make a confidential commit public, open a merge request from the private fork
-to the public upstream project.
+- You are satisfied the problem is resolved in your private fork.
+- You are ready to make the confidential commits public.
## Related links
diff --git a/doc/user/project/merge_requests/getting_started.md b/doc/user/project/merge_requests/getting_started.md
index 72fcd7f36b0..cee4df1f61e 100644
--- a/doc/user/project/merge_requests/getting_started.md
+++ b/doc/user/project/merge_requests/getting_started.md
@@ -50,8 +50,9 @@ 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
-options, or add them later by clicking the **Edit** button on the merge
-request's page at the top-right side:
+options. You can also add them later by either selecting **Edit** on the merge
+request's page at the top-right side, or by using
+[keyboard shortcuts for merge requests](../../shortcuts.md#issues-and-merge-requests):
- [Assign](#assignee) the merge request to a colleague for review. With [multiple assignees](#multiple-assignees), you can assign it to more than one person at a time.
- Set a [milestone](../milestones/index.md) to track time-sensitive changes.
@@ -74,8 +75,10 @@ After you have created the merge request, you can also:
- Add [code suggestions](reviews/suggestions.md) to change the content of merge requests directly into merge request threads, and easily apply them to the codebase directly from the UI.
- Add a time estimation and the time spent with that merge request with [Time Tracking](../time_tracking.md#time-tracking).
-Many of these can be set when pushing changes from the command line,
-with [Git push options](../push_options.md).
+Many of these options can be set:
+
+- From the merge request page, with [keyboard shortcuts](../../shortcuts.md#issues-and-merge-requests).
+- When pushing changes from the command line, with [Git push options](../push_options.md).
See also other [features associated to merge requests](reviews/index.md#associated-features).
diff --git a/doc/user/project/merge_requests/index.md b/doc/user/project/merge_requests/index.md
index b7e055ca749..2c062c2c592 100644
--- a/doc/user/project/merge_requests/index.md
+++ b/doc/user/project/merge_requests/index.md
@@ -40,14 +40,18 @@ important parts of the merge request:
## View merge requests
-You can view merge requests for a specific project, or for all projects in a group:
+To view a list of merge requests:
-- **Specific project**: Go to your project and select **Merge requests**.
+- **Merge requests for a project**: Go to your project and select **Merge requests**, or use
+ the <kbd>g</kbd> + <kbd>m</kbd> [keyboard shortcut](../../shortcuts.md) from a page in your project.
- **All projects in a group**: Go to your group and select **Merge requests**.
If your group contains subgroups, this view also displays merge requests from the subgroup projects.
GitLab displays a count of open merge requests in the left sidebar, but
[caches the value](reviews/index.md#cached-merge-request-count) for groups with a large number of
open merge requests.
+- **Merge requests assigned to you**: On any GitLab page, select **Merge requests**
+ in the top bar, or use the <kbd>Shift</kbd> + <kbd>m</kbd>
+ [global keyboard shortcut](../../shortcuts.md).
GitLab displays open merge requests, with tabs to filter the list by open and closed status:
@@ -153,3 +157,4 @@ For a web developer writing a webpage for your company's website:
- [Review a merge request](reviews/index.md)
- [Authorization for merge requests](authorization_for_merge_requests.md)
- [Testing and reports](testing_and_reports_in_merge_requests.md)
+- [GitLab keyboard shortcuts](../../shortcuts.md)
diff --git a/doc/user/project/merge_requests/reviews/index.md b/doc/user/project/merge_requests/reviews/index.md
index dbf3b0180e6..e6f84f1c357 100644
--- a/doc/user/project/merge_requests/reviews/index.md
+++ b/doc/user/project/merge_requests/reviews/index.md
@@ -158,7 +158,7 @@ Multiline comments display the comment's line numbers above the body of the comm
Users with permission level of [Developer or higher](../../../permissions.md) can manage merge requests.
-When bulk editing merge requests in a project, you can edit the following attributes:
+When bulk-editing merge requests in a project, you can edit the following attributes:
- Status (open/closed)
- Assignee
@@ -211,6 +211,8 @@ These features are associated with merge requests:
GitLab can provide the option to resolve certain merge request conflicts in the GitLab UI.
- [Revert changes](../revert_changes.md):
Revert changes from any commit from a merge request.
+- [Keyboard shortcuts](../../../shortcuts.md#issues-and-merge-requests):
+ Access and modify specific parts of a merge request with keyboard commands.
## Troubleshooting
diff --git a/doc/user/project/merge_requests/reviews/suggestions.md b/doc/user/project/merge_requests/reviews/suggestions.md
index 4027ec08234..ac1cd57fb99 100644
--- a/doc/user/project/merge_requests/reviews/suggestions.md
+++ b/doc/user/project/merge_requests/reviews/suggestions.md
@@ -33,9 +33,8 @@ which generates a commit in the merge request authored by the user that suggeste
![Apply suggestions](img/apply_suggestion_v13_9.png)
-1. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/25381) in GitLab 13.9,
- you can opt to add a custom commit message to describe your change. If you don't
- specify it, the default commit message is used. It is not supported for [batch suggestions](#batch-suggestions).
+1. Optionally specify a custom commit message for individual suggestions (GitLab 13.9 and later) to
+ describe your change. If you don't specify it, the default commit message is used.
![Custom commit](img/custom_commit_v13_9.png)
@@ -118,6 +117,7 @@ introduced by [#25381](https://gitlab.com/gitlab-org/gitlab/-/issues/25381).
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/25486) in GitLab 13.1 as an [alpha feature](https://about.gitlab.com/handbook/product/gitlab-the-product/#alpha) behind a feature flag, disabled by default.
> - [Enabled by default](https://gitlab.com/gitlab-org/gitlab/-/issues/227799) in GitLab 13.2.
> - [Feature flag removed](https://gitlab.com/gitlab-org/gitlab/-/issues/320755) in GitLab 13.11.
+> - Custom commit messages for batch suggestions [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/326168) in GitLab 14.4.
You can apply multiple suggestions at once to reduce the number of commits added
to your branch to address your reviewers' requests.
@@ -134,7 +134,10 @@ to your branch to address your reviewers' requests.
![A code change suggestion displayed, with the button to remove that suggestion from its batch highlighted.](img/remove_suggestion_from_batch_v13_1.jpg "Remove a suggestion from a batch")
-1. Having added all the suggestions to your liking, when ready, select **Apply suggestions**:
+1. Having added all the suggestions to your liking, when ready, select **Apply suggestions**. You
+ can optionally specify a custom commit message for [batch suggestions](#batch-suggestions)
+ (GitLab 14.4 and later) to describe your change. If you don't specify it, the default commit
+ message is used.
![A code change suggestion displayed, with the button to apply the batch of suggestions highlighted.](img/apply_batch_of_suggestions_v13_1.jpg "Apply a batch of suggestions")
diff --git a/doc/user/project/merge_requests/status_checks.md b/doc/user/project/merge_requests/status_checks.md
index 399d7958bbf..08b82462187 100644
--- a/doc/user/project/merge_requests/status_checks.md
+++ b/doc/user/project/merge_requests/status_checks.md
@@ -93,7 +93,7 @@ for doesn't appear immediately. The search box requires
**three** alphanumeric characters to be entered for the search to begin.
If you want the status check to be applied to **all** merge requests,
-you can select the **Any branch** option.
+you can select the **All branches** option.
## Delete a status check
diff --git a/doc/user/project/merge_requests/test_coverage_visualization.md b/doc/user/project/merge_requests/test_coverage_visualization.md
index 813e3c1c9ce..b36510c2df8 100644
--- a/doc/user/project/merge_requests/test_coverage_visualization.md
+++ b/doc/user/project/merge_requests/test_coverage_visualization.md
@@ -177,8 +177,6 @@ coverage-jdk11:
# convert report from jacoco to cobertura, using relative project path
- python /opt/cover2cover.py target/site/jacoco/jacoco.xml $CI_PROJECT_DIR/src/main/java/ > target/site/cobertura.xml
needs: ["test-jdk11"]
- dependencies:
- - test-jdk11
artifacts:
reports:
cobertura: target/site/cobertura.xml
@@ -215,8 +213,6 @@ coverage-jdk11:
# convert report from jacoco to cobertura, using relative project path
- python /opt/cover2cover.py build/jacoco/jacoco.xml $CI_PROJECT_DIR/src/main/java/ > build/cobertura.xml
needs: ["test-jdk11"]
- dependencies:
- - test-jdk11
artifacts:
reports:
cobertura: build/cobertura.xml
@@ -235,7 +231,8 @@ run tests:
image: python:3
script:
- pip install pytest pytest-cov
- - pytest --cov=src/ tests.py
+ - coverage run -m pytest
+ - coverage report
- coverage xml
artifacts:
reports:
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 51f1ec96c22..27487003697 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
@@ -26,7 +26,7 @@ and steps below.
- A custom domain name `example.com` or subdomain `subdomain.example.com`.
- Access to your domain's server control panel to set up DNS records:
- A DNS A or CNAME record pointing your domain to GitLab Pages server.
- - A DNS TXT record to verify your domain's ownership.
+ - A DNS `TXT` record to verify your domain's ownership.
### Steps
@@ -48,7 +48,7 @@ Click **Create New Domain**.
#### 2. Get the verification code
After you add a new domain to Pages, the verification code prompts you. Copy the values from GitLab
-and paste them in your domain's control panel as a TXT record on the next step.
+and paste them in your domain's control panel as a `TXT` record on the next step.
![Get the verification code](img/get_domain_verification_code_v12_0.png)
@@ -76,7 +76,7 @@ Root domains (`example.com`) require:
| From | DNS Record | To |
| --------------------------------------------- | ---------- | --------------- |
| `example.com` | A | `35.185.44.232` |
-| `_gitlab-pages-verification-code.example.com` | TXT | `gitlab-pages-verification-code=00112233445566778899aabbccddeeff` |
+| `_gitlab-pages-verification-code.example.com` | `TXT` | `gitlab-pages-verification-code=00112233445566778899aabbccddeeff` |
For projects on GitLab.com, this IP is `35.185.44.232`.
For projects living in other GitLab instances (CE or EE), please contact
@@ -104,7 +104,7 @@ Subdomains (`subdomain.example.com`) require:
| From | DNS Record | To |
| ------------------------------------------------------- | ---------- | --------------------- |
| `subdomain.example.com` | CNAME | `namespace.gitlab.io` |
-| `_gitlab-pages-verification-code.subdomain.example.com` | TXT | `gitlab-pages-verification-code=00112233445566778899aabbccddeeff` |
+| `_gitlab-pages-verification-code.subdomain.example.com` | `TXT` | `gitlab-pages-verification-code=00112233445566778899aabbccddeeff` |
Note that, whether it's a user or a project website, the `CNAME`
should point to your Pages domain (`namespace.gitlab.io`),
@@ -121,15 +121,15 @@ They require:
- A DNS A record for the domain.
- A DNS CNAME record for the subdomain.
-- A DNS TXT record for each.
+- A DNS `TXT` record for each.
| From | DNS Record | To |
| ------------------------------------------------- | ---------- | ---------------------- |
| `example.com` | A | `35.185.44.232` |
-| `_gitlab-pages-verification-code.example.com` | TXT | `gitlab-pages-verification-code=00112233445566778899aabbccddeeff` |
+| `_gitlab-pages-verification-code.example.com` | `TXT` | `gitlab-pages-verification-code=00112233445566778899aabbccddeeff` |
|---------------------------------------------------+------------+------------------------|
| `www.example.com` | CNAME | `namespace.gitlab.io` |
-| `_gitlab-pages-verification-code.www.example.com` | TXT | `gitlab-pages-verification-code=00112233445566778899aabbccddeeff` |
+| `_gitlab-pages-verification-code.www.example.com` | `TXT` | `gitlab-pages-verification-code=00112233445566778899aabbccddeeff` |
If you're using Cloudflare, check
[Redirecting `www.domain.com` to `domain.com` with Cloudflare](#redirecting-wwwdomaincom-to-domaincom-with-cloudflare).
@@ -196,15 +196,15 @@ For a root domain:
| From | DNS Record | To |
| ------------------------------------------------- | ---------- | ---------------------- |
-| `example.com` | TXT | `gitlab-pages-verification-code=00112233445566778899aabbccddeeff` |
-| `_gitlab-pages-verification-code.example.com` | TXT | `gitlab-pages-verification-code=00112233445566778899aabbccddeeff` |
+| `example.com` | `TXT` | `gitlab-pages-verification-code=00112233445566778899aabbccddeeff` |
+| `_gitlab-pages-verification-code.example.com` | `TXT` | `gitlab-pages-verification-code=00112233445566778899aabbccddeeff` |
For a subdomain:
| From | DNS Record | To |
| ------------------------------------------------- | ---------- | ---------------------- |
-| `www.example.com` | TXT | `gitlab-pages-verification-code=00112233445566778899aabbccddeeff` |
-| `_gitlab-pages-verification-code.www.example.com` | TXT | `gitlab-pages-verification-code=00112233445566778899aabbccddeeff` |
+| `www.example.com` | `TXT` | `gitlab-pages-verification-code=00112233445566778899aabbccddeeff` |
+| `_gitlab-pages-verification-code.www.example.com` | `TXT` | `gitlab-pages-verification-code=00112233445566778899aabbccddeeff` |
### Adding more domain aliases
@@ -290,8 +290,6 @@ Sublime Text, Atom, Dreamweaver, Brackets, etc).
## Force HTTPS for GitLab Pages websites
-> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/28857) in GitLab 10.7.
-
To make your website's visitors even more secure, you can choose to
force HTTPS for GitLab Pages. By doing so, all attempts to visit your
website through HTTP are automatically redirected to HTTPS through 301.
diff --git a/doc/user/project/pages/custom_domains_ssl_tls_certification/ssl_tls_concepts.md b/doc/user/project/pages/custom_domains_ssl_tls_certification/ssl_tls_concepts.md
index 5b7f6454ef7..21f2dd51f70 100644
--- a/doc/user/project/pages/custom_domains_ssl_tls_certification/ssl_tls_concepts.md
+++ b/doc/user/project/pages/custom_domains_ssl_tls_certification/ssl_tls_concepts.md
@@ -35,7 +35,7 @@ with financial transactions.
<!-- vale gitlab.Spelling = NO -->
-Now we have a different picture. [According to Josh Aas](https://letsencrypt.org/2015/10/29/phishing-and-malware.html), Executive Director at [ISRG](https://en.wikipedia.org/wiki/Internet_Security_Research_Group):
+Now we have a different picture. [According to Josh Aas](https://letsencrypt.org/2015/10/29/phishing-and-malware.html), Executive Director at [Internet Security Research Group (ISRG)](https://en.wikipedia.org/wiki/Internet_Security_Research_Group):
<!-- vale gitlab.rulename = YES -->
diff --git a/doc/user/project/pages/index.md b/doc/user/project/pages/index.md
index 385a4fafa7d..283ed0b61b9 100644
--- a/doc/user/project/pages/index.md
+++ b/doc/user/project/pages/index.md
@@ -7,14 +7,8 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# GitLab Pages **(FREE)**
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/80) in GitLab Enterprise Edition 8.3.
-> - Custom CNAMEs with TLS support were [introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/173) in GitLab Enterprise Edition 8.5.
-> - [Ported](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/14605) to GitLab Community Edition in GitLab 8.17.
-> - Support for subgroup project's websites was [introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/30548) in GitLab 11.8.
-> - Bundled project templates were [introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/47857) in GitLab 11.8.
-
-With GitLab Pages, you can publish static websites
-directly from a repository in GitLab.
+With GitLab Pages, you can publish static websites directly from a repository
+in GitLab.
<div class="row">
<div class="col-md-9">
@@ -32,11 +26,11 @@ directly from a repository in GitLab.
<div class="col-md-3"><img src="img/ssgs_pages.png" alt="Examples of SSGs supported by Pages" class="middle display-block"></div>
</div>
-To publish a website with Pages, you can use any SSG,
-like Gatsby, Jekyll, Hugo, Middleman, Harp, Hexo, and Brunch, just to name a few. You can also
+To publish a website with Pages, you can use any static site generator,
+like Gatsby, Jekyll, Hugo, Middleman, Harp, Hexo, or Brunch. You can also
publish any website written directly in plain HTML, CSS, and JavaScript.
-Pages does **not** support dynamic server-side processing, for instance, as `.php` and `.asp` requires.
+Pages does not support dynamic server-side processing, for instance, as `.php` and `.asp` requires.
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/).
@@ -45,18 +39,18 @@ Learn more about
To create a GitLab Pages website:
| Document | Description |
-| -------- | ----------- |
-| [Create a `.gitlab-ci.yml` file from scratch](getting_started/pages_from_scratch.md) | Add a Pages site to an existing project. Learn how to create and configure your own CI file. |
+|----------|-------------|
+| [Create a `.gitlab-ci.yml` file from scratch](getting_started/pages_from_scratch.md) | Add a Pages site to an existing project. Learn how to create and configure your own CI file. |
| [Use a `.gitlab-ci.yml` template](getting_started/pages_ci_cd_template.md) | Add a Pages site to an existing project. Use a pre-populated CI template file. |
-| [Fork a sample project](getting_started/pages_forked_sample_project.md) | Create a new project with Pages already configured by forking a sample project. |
-| [Use a project template](getting_started/pages_new_project_template.md) | Create a new project with Pages already configured by using a template. |
+| [Fork a sample project](getting_started/pages_forked_sample_project.md) | Create a new project with Pages already configured by forking a sample project. |
+| [Use a project template](getting_started/pages_new_project_template.md) | Create a new project with Pages already configured by using a template. |
To update a GitLab Pages website:
| Document | Description |
-| -------- | ----------- |
+|----------|-------------|
| [GitLab Pages domain names, URLs, and base URLs](getting_started_part_one.md) | Learn about GitLab Pages default domains. |
-| [Explore GitLab Pages](introduction.md) | Requirements, technical aspects, specific GitLab CI/CD configuration options, Access Control, custom 404 pages, limitations, FAQ. |
+| [Explore GitLab Pages](introduction.md) | Requirements, technical aspects, specific GitLab CI/CD configuration options, Access Control, custom 404 pages, limitations, and FAQ. |
| [Custom domains and SSL/TLS Certificates](custom_domains_ssl_tls_certification/index.md) | Custom domains and subdomains, DNS records, and SSL/TLS certificates. |
| [Let's Encrypt integration](custom_domains_ssl_tls_certification/lets_encrypt_integration.md) | Secure your Pages sites with Let's Encrypt certificates, which are automatically obtained and renewed by GitLab. |
| [Redirects](redirects.md) | Set up HTTP redirects to forward one page to another. |
@@ -64,7 +58,7 @@ To update a GitLab Pages website:
Learn more and see examples:
| Document | Description |
-| -------- | ----------- |
+|----------|-------------|
| [Static vs dynamic websites](https://about.gitlab.com/blog/2016/06/03/ssg-overview-gitlab-pages-part-1-dynamic-x-static/) | Static versus dynamic site overview. |
| [Modern static site generators](https://about.gitlab.com/blog/2016/06/10/ssg-overview-gitlab-pages-part-2/) | SSG overview. |
| [Build any SSG site with GitLab Pages](https://about.gitlab.com/blog/2016/06/17/ssg-overview-gitlab-pages-part-3-examples-ci/) | Use SSGs for GitLab Pages. |
@@ -74,7 +68,7 @@ Learn more and see examples:
To use GitLab Pages, you must create a project in GitLab to upload your website's
files to. These projects can be either public, internal, or private.
-GitLab always deploys your website from a very specific folder called `public` in your
+GitLab always deploys your website from a specific folder called `public` in your
repository. When you create a new project in GitLab, a [repository](../repository/index.md)
becomes available automatically.
@@ -87,7 +81,7 @@ GitLab Pages website.
You can either use the GitLab [default domain for GitLab Pages websites](getting_started_part_one.md#gitlab-pages-default-domain-names),
`*.gitlab.io`, or your own domain (`example.com`). In that case, you
-need administrator access to your domain's registrar (or control panel) to set it up with Pages.
+must have the Administrator role in your domain's registrar (or control panel) to set it up with Pages.
The following diagrams show the workflows you might follow to get started with Pages.
@@ -95,24 +89,21 @@ The following diagrams show the workflows you might follow to get started with P
## Access to your Pages site
-If you're using GitLab Pages default domain (`.gitlab.io`),
-your website is automatically secure and available under
-HTTPS. If you're using your own custom domain, you can
-optionally secure it with SSL/TLS certificates.
+If you're using GitLab Pages default domain (`.gitlab.io`), your website is
+automatically secure and available under HTTPS. If you're using your own custom
+domain, you can optionally secure it with SSL/TLS certificates.
If you're using GitLab.com, your website is publicly available to the internet.
To restrict access to your website, enable [GitLab Pages Access Control](pages_access_control.md).
-If you're using a self-managed instance (Free, Premium, or Ultimate),
-your websites are published on your own server, according to the
-[Pages settings](../../../administration/pages/index.md) chosen by your sysadmin,
-who can make them public or internal.
+If you're using a self-managed instance, your websites are published on your
+own server, according to the [Pages settings](../../../administration/pages/index.md)
+chosen by your sysadmin, who can make them public or internal.
## Pages examples
-There are some great examples of GitLab Pages websites built for
-specific reasons. These examples can teach you advanced techniques
-to use and adapt to your own needs:
+These GitLab Pages website examples can teach you advanced techniques to use
+and adapt for your own needs:
- [Posting to your GitLab Pages blog from iOS](https://about.gitlab.com/blog/2016/08/19/posting-to-your-gitlab-pages-blog-from-ios/).
- [GitLab CI: Run jobs sequentially, in parallel, or build a custom pipeline](https://about.gitlab.com/blog/2016/07/29/the-basics-of-gitlab-ci/).
@@ -122,27 +113,27 @@ to use and adapt to your own needs:
## Administer GitLab Pages for self-managed instances
-If you are running a self-managed instance of GitLab (GitLab Community Edition and Enterprise Editions),
+If you are running a self-managed instance of GitLab,
[follow the administration steps](../../../administration/pages/index.md) to configure Pages.
<i class="fa fa-youtube-play youtube" aria-hidden="true"></i> Watch a [video tutorial](https://www.youtube.com/watch?v=dD8c7WNcc6s) about how to get started with GitLab Pages administration.
## Security for GitLab Pages
-If your username is `foo`, your GitLab Pages website is located at `foo.gitlab.io`.
-GitLab allows usernames to contain a `.`, so a user named `bar.foo` could create
-a GitLab Pages website `bar.foo.gitlab.io` that effectively is a subdomain of your
-`foo.gitlab.io` website. Be careful if you use JavaScript to set cookies for your website.
+If your username is `example`, your GitLab Pages website is located at `example.gitlab.io`.
+GitLab allows usernames to contain a `.`, so a user named `bar.example` could create
+a GitLab Pages website `bar.example.gitlab.io` that effectively is a subdomain of your
+`example.gitlab.io` website. Be careful if you use JavaScript to set cookies for your website.
The safe way to manually set cookies with JavaScript is to not specify the `domain` at all:
```javascript
-// Safe: This cookie is only visible to foo.gitlab.io
+// Safe: This cookie is only visible to example.gitlab.io
document.cookie = "key=value";
-// Unsafe: This cookie is visible to foo.gitlab.io and its subdomains,
+// Unsafe: This cookie is visible to example.gitlab.io and its subdomains,
// regardless of the presence of the leading dot.
-document.cookie = "key=value;domain=.foo.gitlab.io";
-document.cookie = "key=value;domain=foo.gitlab.io";
+document.cookie = "key=value;domain=.example.gitlab.io";
+document.cookie = "key=value;domain=example.gitlab.io";
```
This issue doesn't affect users with a custom domain, or users who don't set any
diff --git a/doc/user/project/pages/introduction.md b/doc/user/project/pages/introduction.md
index 94656c91e98..45c2f1aaf04 100644
--- a/doc/user/project/pages/introduction.md
+++ b/doc/user/project/pages/introduction.md
@@ -118,7 +118,7 @@ pages:
paths:
- public
only:
- - master
+ - main
```
### `.gitlab-ci.yml` for a static site generator
@@ -133,7 +133,7 @@ the `pages` job with the [`only` parameter](../../../ci/yaml/index.md#only--exce
whenever a new commit is pushed to a branch used specifically for your
pages.
-That way, you can have your project's code in the `master` branch and use an
+That way, you can have your project's code in the `main` branch and use an
orphan branch (let's name it `pages`) to host your static generator site.
You can create a new empty branch like this:
@@ -163,7 +163,7 @@ pages:
- pages
```
-See an example that has different files in the [`master` branch](https://gitlab.com/pages/jekyll-branched/tree/master)
+See an example that has different files in the [`main` branch](https://gitlab.com/pages/jekyll-branched/tree/main)
and the source files for Jekyll are in a [`pages` branch](https://gitlab.com/pages/jekyll-branched/tree/pages) which
also includes `.gitlab-ci.yml`.
diff --git a/doc/user/project/push_options.md b/doc/user/project/push_options.md
index c17133e72cf..305bbb2ded0 100644
--- a/doc/user/project/push_options.md
+++ b/doc/user/project/push_options.md
@@ -61,7 +61,7 @@ time as pushing changes:
| Push option | Description | Introduced in version |
| -------------------------------------------- | --------------------------------------------------------------------------------------------------------------- | --------------------- |
| `merge_request.create` | Create a new merge request for the pushed branch. | [11.10](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/26752) |
-| `merge_request.target=<branch_name>` | Set the target of the merge request to a particular branch. | [11.10](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/26752) |
+| `merge_request.target=<branch_name>` | Set the target of the merge request to a particular branch or upstream project, such as: `git push -o merge_request.target=project_path/branch` | [11.10](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/26752) |
| `merge_request.merge_when_pipeline_succeeds` | Set the merge request to [merge when its pipeline succeeds](merge_requests/merge_when_pipeline_succeeds.md). | [11.10](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/26752) |
| `merge_request.remove_source_branch` | Set the merge request to remove the source branch when it's merged. | [12.2](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/64320) |
| `merge_request.title="<title>"` | Set the title of the merge request. Ex: `git push -o merge_request.title="The title I want"`. | [12.2](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/64320) |
diff --git a/doc/user/project/quick_actions.md b/doc/user/project/quick_actions.md
index 52b59d70302..45a83394c41 100644
--- a/doc/user/project/quick_actions.md
+++ b/doc/user/project/quick_actions.md
@@ -103,7 +103,7 @@ threads. Some quick actions might not be available to all subscription tiers.
| `/target_branch <local branch name>` | **{dotted-circle}** No | **{check-circle}** Yes | **{dotted-circle}** No | Set target branch. |
| `/title <new title>` | **{check-circle}** Yes | **{check-circle}** Yes | **{check-circle}** Yes | Change title. |
| `/todo` | **{check-circle}** Yes | **{check-circle}** Yes | **{check-circle}** Yes | Add a to-do item. |
-| `/unapprove` | **{dotted-circle}** No | **{check-circle}** Yes | **{dotted-circle}** No | Unapprove the merge request. ([introduced in GitLab 14.3](https://gitlab.com/gitlab-org/gitlab/-/issues/8003)|
+| `/unapprove` | **{dotted-circle}** No | **{check-circle}** Yes | **{dotted-circle}** No | Unapprove the merge request. ([introduced in GitLab 14.3](https://gitlab.com/gitlab-org/gitlab/-/issues/8103)|
| `/unassign @user1 @user2` | **{check-circle}** Yes | **{check-circle}** Yes | **{dotted-circle}** No | Remove specific assignees. |
| `/unassign` | **{dotted-circle}** No | **{check-circle}** Yes | **{dotted-circle}** No | Remove all assignees. |
| `/unassign_reviewer @user1 @user2` or `/remove_reviewer @user1 @user2` | **{dotted-circle}** No | **{check-circle}** Yes | **{dotted-circle}** No | Remove specific reviewers. |
diff --git a/doc/user/project/releases/index.md b/doc/user/project/releases/index.md
index 49b5ec2ca60..9e4d621dbc6 100644
--- a/doc/user/project/releases/index.md
+++ b/doc/user/project/releases/index.md
@@ -218,7 +218,7 @@ To set a deploy freeze window in the UI, complete these steps:
1. Scroll to **Deploy freezes**.
1. Click **Expand** to see the deploy freeze table.
1. Click **Add deploy freeze** to open the deploy freeze modal.
-1. Enter the start time, end time, and timezone of the desired deploy freeze period.
+1. Enter the start time, end time, and time zone of the desired deploy freeze period.
1. Click **Add deploy freeze** in the modal.
1. After the deploy freeze is saved, you can edit it by selecting the edit button (**{pencil}**) and remove it by selecting the delete button (**{remove}**).
![Deploy freeze modal for setting a deploy freeze period](img/deploy_freeze_v14_3.png)
diff --git a/doc/user/project/repository/branches/default.md b/doc/user/project/repository/branches/default.md
index a1ea929bb49..5cd025f017d 100644
--- a/doc/user/project/repository/branches/default.md
+++ b/doc/user/project/repository/branches/default.md
@@ -11,8 +11,9 @@ When you create a new [project](../../index.md), GitLab creates a default branch
in the repository. A default branch has special configuration options not shared
by other branches:
+- It cannot be deleted.
- It's [initially protected](../../protected_branches.md#protected-branches) against
- accidental deletion and forced pushes.
+ forced pushes.
- When a merge request uses an
[issue closing pattern](../../issues/managing_issues.md#closing-issues-automatically)
to close an issue, the work is merged into this branch.
@@ -97,7 +98,7 @@ Ensure they understand the scope of this change includes references to the old
branch name in related code and scripts.
When changing the default branch name for an existing repository, you should preserve
-the history of your default branch by renaming it, instead of deleting it. This example
+the history of your default branch by renaming it, instead of creating a new branch. This example
renames a Git repository's (`example`) default branch.
1. On your local command line, navigate to your `example` repository, and ensure
@@ -195,3 +196,32 @@ To fix the problem:
```
1. In GitLab, [change the default branch](#change-the-default-branch-name-for-a-project) to the one you intend to use.
+
+### Query GraphQL for default branches
+
+You can use a [GraphQL query](../../../../api/graphql/index.md)
+to retrieve the default branches for all projects in a group.
+
+To return all projects in a single page of results, replace `GROUPNAME` with the
+full path to your group. GitLab returns the first page of results. If `hasNextPage`
+is `true`, you can request the next page by replacing the `null` in `after: null`
+with the value of `endCursor`:
+
+```graphql
+{
+ group(fullPath: "GROUPNAME") {
+ projects(after: null) {
+ pageInfo {
+ hasNextPage
+ endCursor
+ }
+ nodes {
+ name
+ repository {
+ rootRef
+ }
+ }
+ }
+ }
+}
+```
diff --git a/doc/user/project/repository/branches/index.md b/doc/user/project/repository/branches/index.md
index 91858ff9a65..351daaaca3b 100644
--- a/doc/user/project/repository/branches/index.md
+++ b/doc/user/project/repository/branches/index.md
@@ -2,7 +2,6 @@
stage: Create
group: Source Code
info: "To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments"
-type: concepts, howto
---
# Branches **(FREE)**
@@ -57,8 +56,6 @@ To compare branches in a repository:
## Delete merged branches
-> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/6449) in GitLab 8.14.
-
![Delete merged branches](img/delete_merged_branches.png)
This feature allows merged branches to be deleted in bulk. Only branches that
@@ -83,8 +80,6 @@ Search results appear in the following order:
## Branch filter search box
-> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/22166) in GitLab 11.5.
-
![Branch filter search box](img/branch_filter_search_box_v13_12.png)
This feature allows you to search and select branches quickly. Search results appear in the following order:
diff --git a/doc/user/project/repository/forking_workflow.md b/doc/user/project/repository/forking_workflow.md
index 33ab5f6580d..bf4ef21e31b 100644
--- a/doc/user/project/repository/forking_workflow.md
+++ b/doc/user/project/repository/forking_workflow.md
@@ -52,7 +52,7 @@ of the fork must manually change the visibility. Issue
## Repository mirroring
-You can use [repository mirroring](repository_mirroring.md) to keep your fork synced with the original repository. You can also use `git remote add upstream` to achieve the same result.
+You can use [repository mirroring](mirror/index.md) to keep your fork synced with the original repository. You can also use `git remote add upstream` to achieve the same result.
The main difference is that with repository mirroring, your remote fork is automatically kept up-to-date.
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
index 20d76797977..df5e803d77a 100644
--- 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
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
index 150ec3ebf90..732173d9c1b 100644
--- 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
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
index 326605baaab..bbdb9bca199 100644
--- 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
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
index 4a4c1f8cd11..1a92555457a 100644
--- 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
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
index d0bdefaa437..5a5562ed38c 100644
--- 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
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
index 1b2fa59726a..ad949aae8ce 100644
--- 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
Binary files differ
diff --git a/doc/user/project/repository/mirror/bidirectional.md b/doc/user/project/repository/mirror/bidirectional.md
new file mode 100644
index 00000000000..c4254655fcc
--- /dev/null
+++ b/doc/user/project/repository/mirror/bidirectional.md
@@ -0,0 +1,171 @@
+---
+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
+disqus_identifier: 'https://docs.gitlab.com/ee/workflow/repository_mirroring.html'
+---
+
+# Bidirectional mirroring **(PREMIUM)**
+
+> Moved to GitLab Premium in 13.9.
+
+WARNING:
+Bidirectional mirroring may cause conflicts.
+
+Bidirectional [mirroring](index.md) configures two repositories to both pull from,
+and push to, each other. There is no guarantee that either repository can update
+without errors.
+
+## Reduce conflicts in bidirectional mirroring
+
+If you configure bidirectional mirroring, prepare your repositories for
+conflicts. Configure them to reduce conflicts, and how to settle them when they occur:
+
+- [Mirror only protected branches](index.md#mirror-only-protected-branches). Rewriting
+ any mirrored commit on either remote causes conflicts and mirroring to fail.
+- [Protect the branches](../../protected_branches.md) you want to mirror on both
+ remotes to prevent conflicts caused by rewriting history.
+- Reduce mirroring delay with a [push event webhook](../../integrations/webhook_events.md#push-events).
+ Bidirectional mirroring creates a race condition where commits made close together
+ to the same branch cause conflicts. Push event webhooks can help mitigate the race
+ condition. Push mirroring from GitLab is rate limited to once per minute when only
+ push mirroring protected branches.
+- Prevent conflicts [using a pre-receive hook](#prevent-conflicts-by-using-a-pre-receive-hook).
+
+## Configure a webhook to trigger an immediate pull to GitLab
+
+A [push event webhook](../../integrations/webhook_events.md#push-events) in the downstream
+instance can help reduce race conditions by syncing changes more frequently.
+
+Prerequisites:
+
+- You have configured the [push](push.md#set-up-a-push-mirror-to-another-gitlab-instance-with-2fa-activated)
+and [pull](pull.md#pull-from-a-remote-repository) mirrors in the upstream GitLab instance.
+
+To create the webhook in the downstream instance:
+
+1. Create a [personal access token](../../../profile/personal_access_tokens.md) with `API` scope.
+1. On the top bar, select **Menu > Projects** and find your project.
+1. On the left sidebar, select **Settings > Webhooks**.
+1. Add the webhook **URL**, which (in this case) uses the
+ [Pull Mirror API](../../../../api/projects.md#start-the-pull-mirroring-process-for-a-project)
+ request to trigger an immediate pull after a repository update:
+
+ ```plaintext
+ https://gitlab.example.com/api/v4/projects/:id/mirror/pull?private_token=<your_access_token>
+ ```
+
+1. Select **Push Events**.
+1. Select **Add Webhook**.
+
+To test the integration, select **Test** and confirm GitLab doesn't return an error message.
+
+## Prevent conflicts by using a pre-receive hook
+
+WARNING:
+This solution negatively affects the performance of Git push operations, because
+they are proxied to the upstream Git repository.
+
+In this configuration, one Git repository acts as the authoritative upstream, and
+the other as downstream. This server-side `pre-receive` hook accepts a push only
+after first pushing the commit to the upstream repository. Install this hook on
+your downstream repository.
+
+For example:
+
+```shell
+#!/usr/bin/env bash
+
+# --- Assume only one push mirror target
+# Push mirroring remotes are named `remote_mirror_<id>`.
+# This line finds the first remote and uses that.
+TARGET_REPO=$(git remote | grep -m 1 remote_mirror)
+
+proxy_push()
+{
+ # --- Arguments
+ OLDREV=$(git rev-parse $1)
+ NEWREV=$(git rev-parse $2)
+ REFNAME="$3"
+
+ # --- Pattern of branches to proxy pushes
+ allowlist=$(expr "$branch" : "\(master\)")
+
+ case "$refname" in
+ refs/heads/*)
+ branch=$(expr "$refname" : "refs/heads/\(.*\)")
+
+ if [ "$allowlist" = "$branch" ]; then
+ # handle https://git-scm.com/docs/git-receive-pack#_quarantine_environment
+ unset GIT_QUARANTINE_PATH
+ error="$(git push --quiet $TARGET_REPO $NEWREV:$REFNAME 2>&1)"
+ fail=$?
+
+ if [ "$fail" != "0" ]; then
+ echo >&2 ""
+ echo >&2 " Error: updates were rejected by upstream server"
+ echo >&2 " This is usually caused by another repository pushing changes"
+ echo >&2 " to the same ref. You may want to first integrate remote changes"
+ echo >&2 ""
+ return
+ fi
+ fi
+ ;;
+ esac
+}
+
+# Allow dual mode: run from the command line just like the update hook, or
+# if no arguments are given, then run as a hook script:
+if [ -n "$1" -a -n "$2" -a -n "$3" ]; then
+ # Output to the terminal in command line mode. If someone wanted to
+ # resend an email, they could redirect the output to sendmail themselves
+ PAGER= proxy_push $2 $3 $1
+else
+ # Push is proxied upstream one ref at a time. It is possible for some refs
+ # to succeed, and others to fail. This results in a failed push.
+ while read oldrev newrev refname
+ do
+ proxy_push $oldrev $newrev $refname
+ done
+fi
+```
+
+This sample has a few limitations:
+
+- It may not work for your use case without modification:
+ - It doesn't regard different types of authentication mechanisms for the mirror.
+ - It doesn't work with forced updates (rewriting history).
+ - Only branches that match the `allowlist` patterns are proxy pushed.
+- The script circumvents the Git hook quarantine environment because the update of `$TARGET_REPO`
+ is seen as a ref update, and Git displays warnings about it.
+
+## Mirror with Perforce Helix via Git Fusion **(PREMIUM)**
+
+> Moved to GitLab Premium in 13.9.
+
+WARNING:
+Bidirectional mirroring should not be used as a permanent configuration. Refer to
+[Migrating from Perforce Helix](../../import/perforce.md) for alternative migration approaches.
+
+[Git Fusion](https://www.perforce.com/manuals/git-fusion/#Git-Fusion/section_avy_hyc_gl.html) provides a Git interface
+to [Perforce Helix](https://www.perforce.com/products). GitLab can use the Perforce Helix
+interface to bidirectionally mirror projects. It can help when migrating from Perforce Helix
+to GitLab, if overlapping Perforce Helix workspaces cannot be migrated simultaneously.
+
+If you mirror with Perforce Helix, mirror only protected branches. Perforce Helix
+rejects any pushes that rewrite history. Only the fewest number of branches should be mirrored
+due to the performance limitations of Git Fusion.
+
+When you configure mirroring with Perforce Helix by using Git Fusion, we recommend these Git Fusion
+settings:
+
+- Disable `change-pusher`. Otherwise, every commit is rewritten as being committed
+ by the mirroring account, rather than mapping to existing Perforce Helix users or the `unknown_git` user.
+- Use the `unknown_git` user as the commit author, if the GitLab user doesn't exist in
+ Perforce Helix.
+
+Read about [Git Fusion settings on Perforce.com](https://www.perforce.com/manuals/git-fusion/Content/Git-Fusion/section_vss_bdw_w3.html#section_zdp_zz1_3l).
+
+## Related topics
+
+- [Configure server hooks](../../../../administration/server_hooks.md) on a GitLab server.
diff --git a/doc/user/project/repository/img/repository_mirroring_copy_ssh_public_key_button.png b/doc/user/project/repository/mirror/img/repository_mirroring_copy_ssh_public_key_button.png
index e20dae09a4d..e20dae09a4d 100644
--- a/doc/user/project/repository/img/repository_mirroring_copy_ssh_public_key_button.png
+++ b/doc/user/project/repository/mirror/img/repository_mirroring_copy_ssh_public_key_button.png
Binary files differ
diff --git a/doc/user/project/repository/img/repository_mirroring_force_update.png b/doc/user/project/repository/mirror/img/repository_mirroring_force_update.png
index 1e6dcb9ea08..1e6dcb9ea08 100644
--- a/doc/user/project/repository/img/repository_mirroring_force_update.png
+++ b/doc/user/project/repository/mirror/img/repository_mirroring_force_update.png
Binary files differ
diff --git a/doc/user/project/repository/mirror/index.md b/doc/user/project/repository/mirror/index.md
new file mode 100644
index 00000000000..4532a80c2f5
--- /dev/null
+++ b/doc/user/project/repository/mirror/index.md
@@ -0,0 +1,224 @@
+---
+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
+disqus_identifier: 'https://docs.gitlab.com/ee/workflow/repository_mirroring.html'
+---
+
+# Repository mirroring **(FREE)**
+
+Repository mirroring allows for the mirroring of repositories to and from external sources. You
+can use it to mirror branches, tags, and commits between repositories. It helps you use
+a repository outside of GitLab.
+
+A repository mirror at GitLab updates automatically. You can also manually trigger an update:
+
+- At most once every five minutes on GitLab.com.
+- According to a [limit set by the administrator](../../../../administration/instance_limits.md#pull-mirroring-interval)
+ on self-managed instances.
+
+There are two kinds of repository mirroring supported by GitLab:
+
+- [Push](push.md): for mirroring a GitLab repository to another location.
+- [Pull](pull.md): for mirroring a repository from another location to GitLab.
+
+When the mirror repository is updated, all new branches, tags, and commits are visible in the
+project's activity feed.
+
+Users with the [Maintainer role](../../../permissions.md) for the project can also force an
+immediate update, unless:
+
+- The mirror is already being updated.
+- The [limit for pull mirroring interval seconds](../../../../administration/instance_limits.md#pull-mirroring-interval) has not elapsed after its last update.
+
+For security reasons, the URL to the original repository is only displayed to users with the
+[Maintainer role](../../../permissions.md) or the [Owner role](../../../permissions.md) for the mirrored
+project.
+
+## Use cases
+
+The following are some possible use cases for repository mirroring:
+
+- You migrated to GitLab but still must keep your project in another source. In that case, you
+ can set it up to mirror to GitLab (pull) and all the essential history of commits, tags,
+ and branches are available in your GitLab instance. **(PREMIUM)**
+- You have old projects in another source that you don't use actively anymore, but don't want to
+ remove for archiving purposes. In that case, you can create a push mirror so that your active
+ GitLab repository can push its changes to the old location.
+- You are a GitLab self-managed user for privacy reasons and your instance is closed to the public,
+ but you still have certain software components that you want open sourced. In this case, utilizing
+ GitLab to be your primary repository which is closed from the public, and using push mirroring to a
+ GitLab.com repository that's public, allows you to open source specific projects and contribute back
+ to the open source community.
+
+## Mirror only protected branches **(PREMIUM)**
+
+> Moved to GitLab Premium in 13.9.
+
+Based on the mirror direction that you choose, you can opt to mirror only the
+[protected branches](../../protected_branches.md) in the mirroring project,
+either from or to your remote repository. For pull mirroring, non-protected branches in
+the mirroring project are not mirrored and can diverge.
+
+To use this option, check the **Only mirror protected branches** box when
+creating a repository mirror. **(PREMIUM)**
+
+## SSH authentication
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/22982) in GitLab 11.6 for Push mirroring.
+
+SSH authentication is mutual:
+
+- You have to prove to the server that you're allowed to access the repository.
+- The server also has to prove to *you* that it's who it claims to be.
+
+You provide your credentials as a password or public key. The server that the
+other repository resides on provides its credentials as a "host key", the
+fingerprint of which needs to be verified manually.
+
+If you're mirroring over SSH (using an `ssh://` URL), you can authenticate using:
+
+- Password-based authentication, just as over HTTPS.
+- Public key authentication. This is often more secure than password authentication,
+ especially when the other repository supports [deploy keys](../../deploy_keys/index.md).
+
+To get started:
+
+1. In your project, go to **Settings > Repository**, and then expand the **Mirroring repositories** section.
+1. Enter an `ssh://` URL for mirroring.
+
+NOTE:
+SCP-style URLs (that is, `git@example.com:group/project.git`) are not supported at this time.
+
+Entering the URL adds two buttons to the page:
+
+- **Detect host keys**.
+- **Input host keys manually**.
+
+If you select the:
+
+- **Detect host keys** button, GitLab fetches the host keys from the server and display the fingerprints.
+- **Input host keys manually** button, a field is displayed where you can paste in host keys.
+
+Assuming you used the former, you now must verify that the fingerprints are
+those you expect. GitLab.com and other code hosting sites publish their
+fingerprints in the open for you to check:
+
+- [AWS CodeCommit](https://docs.aws.amazon.com/codecommit/latest/userguide/regions.html#regions-fingerprints)
+- [Bitbucket](https://support.atlassian.com/bitbucket-cloud/docs/configure-ssh-and-two-step-verification/)
+- [GitHub](https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/githubs-ssh-key-fingerprints)
+- [GitLab.com](../../../gitlab_com/index.md#ssh-host-keys-fingerprints)
+- [Launchpad](https://help.launchpad.net/SSHFingerprints)
+- [Savannah](http://savannah.gnu.org/maintenance/SshAccess/)
+- [SourceForge](https://sourceforge.net/p/forge/documentation/SSH%20Key%20Fingerprints/)
+
+Other providers vary. If you're running self-managed GitLab, or otherwise
+have access to the server for the other repository, you can securely gather the
+key fingerprints:
+
+```shell
+$ cat /etc/ssh/ssh_host*pub | ssh-keygen -E md5 -l -f -
+256 MD5:f4:28:9f:23:99:15:21:1b:bf:ed:1f:8e:a0:76:b2:9d root@example.com (ECDSA)
+256 MD5:e6:eb:45:8a:3c:59:35:5f:e9:5b:80:12:be:7e:22:73 root@example.com (ED25519)
+2048 MD5:3f:72:be:3d:62:03:5c:62:83:e8:6e:14:34:3a:85:1d root@example.com (RSA)
+```
+
+NOTE:
+You must exclude `-E md5` for some older versions of SSH.
+
+When mirroring the repository, GitLab checks that at least one of the
+stored host keys matches before connecting. This can prevent malicious code from
+being injected into your mirror, or your password being stolen.
+
+### SSH public key authentication
+
+To use SSH public key authentication, you must also choose that option
+from the **Authentication method** dropdown. When the mirror is created,
+GitLab generates a 4096-bit RSA key that can be copied by selecting the **Copy SSH public key** button.
+
+![Repository mirroring copy SSH public key to clipboard button](img/repository_mirroring_copy_ssh_public_key_button.png)
+
+You then must add the public SSH key to the other repository's configuration:
+
+- If the other repository is hosted on GitLab, you should add the public SSH key
+ as a [deploy key](../../../project/deploy_keys/index.md).
+- If the other repository is hosted elsewhere, you must add the key to
+ your user's `authorized_keys` file. Paste the entire public SSH key into the
+ file on its own line and save it.
+
+If you must change the key at any time, you can remove and re-add the mirror
+to generate a new key. Update the other repository with the new
+key to keep the mirror running.
+
+NOTE:
+The generated keys are stored in the GitLab database, not in the file system. Therefore,
+SSH public key authentication for mirrors cannot be used in a pre-receive hook.
+
+## Force an update **(FREE)**
+
+While mirrors are scheduled to update automatically, you can always force an update by using the
+update button which is available on the **Mirroring repositories** section of the **Repository Settings** page.
+
+![Repository mirroring force update user interface](img/repository_mirroring_force_update.png)
+
+## Resources
+
+- Configure a [Pull Mirroring Interval](../../../../administration/instance_limits.md#pull-mirroring-interval)
+- [Disable mirrors for a project](../../../admin_area/settings/visibility_and_access_controls.md#enable-project-mirroring)
+- [Secrets file and mirroring](../../../../raketasks/backup_restore.md#when-the-secrets-file-is-lost)
+
+## Troubleshooting
+
+Should an error occur during a push, GitLab displays an **Error** highlight for that repository. Details on the error can then be seen by hovering over the highlight text.
+
+### 13:Received RST_STREAM with error code 2 with GitHub
+
+If you receive a "13:Received RST_STREAM with error code 2" message while mirroring to a GitHub repository,
+your GitHub settings might be set to block pushes that expose your email address used in commits. Either
+set your email address on GitHub to be public, or disable the [Block command line pushes that expose my email](https://github.com/settings/emails) setting.
+
+### 4:Deadline Exceeded
+
+When upgrading to GitLab 11.11.8 or newer, a change in how usernames are represented means that you
+must update your mirroring username and password to ensure that `%40` characters are replaced with `@`.
+
+### Connection blocked because server only allows public key authentication
+
+As the error indicates, the connection is getting blocked between GitLab and the remote repository. Even if a
+[TCP Check](../../../../administration/raketasks/maintenance.md#check-tcp-connectivity-to-a-remote-site) is successful,
+you must check any networking components in the route from GitLab to the remote Server to ensure there's no blockage.
+
+For example, we've seen this error when a Firewall was performing a `Deep SSH Inspection` on outgoing packets.
+
+### Could not read username: terminal prompts disabled
+
+If you receive this error after creating a new project using
+[GitLab CI/CD for external repositories](../../../../ci/ci_cd_for_external_repos/):
+
+```plaintext
+"2:fetch remote: "fatal: could not read Username for 'https://bitbucket.org': terminal prompts disabled\n": exit status 128."
+```
+
+Check if the repository owner is specified in the URL of your mirrored repository:
+
+1. Go to your project.
+1. On the left sidebar, select **Settings > Repository**.
+1. Select **Mirroring repositories**.
+1. If no repository owner is specified, delete and add the URL again in this format:
+
+ ```plaintext
+ https://**<repo_owner>**@bitbucket.org/<accountname>/<reponame>.git
+ ```
+
+The repository owner is needed for Bitbucket to connect to the repository for mirroring.
+
+### Pull mirror is missing LFS files
+
+In some cases, pull mirroring does not transfer LFS files. This issue occurs when:
+
+- You use an SSH repository URL. The workaround is to use an HTTPS repository URL instead.
+ There is [an issue to fix this for SSH URLs](https://gitlab.com/gitlab-org/gitlab/-/issues/11997).
+- You're using GitLab 14.0 or older, and the source repository is a public Bitbucket URL.
+ This was [fixed in GitLab 14.0.6](https://gitlab.com/gitlab-org/gitlab/-/issues/335123).
+- You mirror an external repository using object storage.
+ There is [an issue to fix this](https://gitlab.com/gitlab-org/gitlab/-/issues/335495).
diff --git a/doc/user/project/repository/mirror/pull.md b/doc/user/project/repository/mirror/pull.md
new file mode 100644
index 00000000000..d1943cbfd71
--- /dev/null
+++ b/doc/user/project/repository/mirror/pull.md
@@ -0,0 +1,121 @@
+---
+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
+disqus_identifier: 'https://docs.gitlab.com/ee/workflow/repository_mirroring.html'
+---
+
+# Pull from a remote repository **(PREMIUM)**
+
+> Moved to GitLab Premium in 13.9.
+
+You can use the GitLab interface to browse the content and activity of a repository,
+even if it isn't hosted on GitLab. Create a pull [mirror](index.md) to copy the
+branches, tags, and commits from an upstream repository to yours.
+
+Unlike [push mirrors](push.md), pull mirrors retrieve changes from an upstream (remote)
+repository on a scheduled basis. To prevent the mirror from diverging from the upstream
+repository, don't push commits directly to the downstream mirror. Push commits to
+the upstream repository instead. Changes in the remote repository are pulled into the GitLab repository, either:
+
+- Automatically in a certain period of time. Self-managed instances can
+ configure [pull mirroring intervals](../../../../administration/instance_limits.md#pull-mirroring-interval).
+- When an administrator [force-updates the mirror](index.md#force-an-update).
+- When an [API call triggers an update](#trigger-an-update-by-using-the-api).
+
+By default, if any branch or tag on the downstream pull mirror diverges from the
+local repository, GitLab stops updating the branch. This prevents data loss.
+Deleted branches and tags in the upstream repository are not reflected in the
+downstream repository.
+
+## How pull mirroring works
+
+After you configure a GitLab repository as a pull mirror:
+
+1. GitLab adds the repository to a queue.
+1. Once per minute, a Sidekiq cron job schedules repository mirrors to update, based on:
+ - Available capacity, determined by Sidekiq settings. For GitLab.com, read
+ [GitLab.com Sidekiq settings](../../../gitlab_com/index.md#sidekiq).
+ - How many mirrors are already in the queue and due for updates. Being due depends
+ on when the repository mirror was last updated, and how many times updates have been retried.
+1. Sidekiq becomes available to process updates, mirrors are updated. If the update process:
+ - **Succeeds**: An update is enqueued again with at least a 30 minute wait.
+ - **Fails**: The update is attempted again later. After 14 failures, a mirror is marked as a
+ [hard failure](#hard-failure) and is no longer enqueued for updates. A branch diverging
+ from its upstream counterpart can cause failures. To prevent branches from
+ diverging, configure [Overwrite diverged branches](#overwrite-diverged-branches) when
+ you create your mirror.
+
+## Configure pull mirroring
+
+Prerequisite:
+
+- If your remote repository is on GitHub and you have
+ [two-factor authentication (2FA) configured](https://docs.github.com/en/authentication/securing-your-account-with-two-factor-authentication-2fa),
+ create a [personal access token for GitHub](https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/creating-a-personal-access-token)
+ with the `repo` scope. If 2FA is enabled, this personal access
+ token serves as your GitHub password.
+
+1. On the top bar, select **Menu > Projects** and find your project.
+1. On the left sidebar, select **Settings > Repository**.
+1. Expand **Mirroring repositories**.
+1. Enter the **Git repository URL**. Include the username
+ in the URL, if required: `https://MYUSERNAME@github.com/GROUPNAME/PROJECTNAME.git`
+1. In **Mirror direction**, select **Pull**.
+1. In **Authentication method**, select your authentication method.
+1. Select any of the options you need:
+ - [**Overwrite diverged branches**](#overwrite-diverged-branches)
+ - [**Trigger pipelines for mirror updates**](#trigger-pipelines-for-mirror-updates)
+ - **Only mirror protected branches**
+1. To save the configuration, select **Mirror repository**.
+
+### Overwrite diverged branches
+
+> Moved to GitLab Premium in 13.9.
+
+To always update your local branches with remote versions, even if they have
+diverged from the remote, select **Overwrite diverged branches** when you
+create a mirror.
+
+WARNING:
+For mirrored branches, enabling this option results in the loss of local changes.
+
+### Trigger pipelines for mirror updates
+
+> Moved to GitLab Premium in 13.9.
+
+If this option is enabled, pipelines trigger when branches or tags are
+updated from the remote repository. Depending on the activity of the remote
+repository, this may greatly increase the load on your CI runners. Only enable
+this feature if you know they can handle the load. CI uses the credentials
+assigned when you set up pull mirroring.
+
+## Trigger an update by using the API
+
+> Moved to GitLab Premium in 13.9.
+
+Pull mirroring uses polling to detect new branches and commits added upstream,
+often minutes afterwards. If you notify GitLab by
+[API](../../../../api/projects.md#start-the-pull-mirroring-process-for-a-project),
+updates are pulled immediately.
+
+For more information, read
+[Start the pull mirroring process for a project](../../../../api/projects.md#start-the-pull-mirroring-process-for-a-project).
+
+## Hard failure
+
+> Moved to GitLab Premium in 13.9.
+
+After 14 consecutive unsuccessful retries, the mirroring process is marked as a hard failure
+and mirroring attempts stop. This failure is visible in either the:
+
+- Project's main dashboard.
+- Pull mirror settings page.
+
+You can resume the project mirroring again by [forcing an update](index.md#force-an-update).
+
+## Related topics
+
+- Configure [pull mirroring intervals](../../../../administration/instance_limits.md#pull-mirroring-interval)
+ on self-managed instances.
+- Configure [pull mirroring through the API](../../../../api/projects.md#configure-pull-mirroring-for-a-project).
diff --git a/doc/user/project/repository/mirror/push.md b/doc/user/project/repository/mirror/push.md
new file mode 100644
index 00000000000..498b8d063a9
--- /dev/null
+++ b/doc/user/project/repository/mirror/push.md
@@ -0,0 +1,197 @@
+---
+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
+disqus_identifier: 'https://docs.gitlab.com/ee/workflow/repository_mirroring.html'
+---
+
+# Push mirroring **(FREE)**
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/40137) in GitLab 13.5: LFS support over HTTPS.
+
+A _push mirror_ is a downstream repository that [mirrors](index.md) the commits made
+to the upstream repository. Push mirrors passively receive copies of the commits made to the
+upstream repository. To prevent the mirror from diverging from the upstream
+repository, don't push commits directly to the downstream mirror. Push commits to
+the upstream repository instead.
+
+While [pull mirroring](pull.md) periodically retrieves updates from the upstream repository,
+push mirrors only receive changes when:
+
+- Commits are pushed to the upstream GitLab repository.
+- An administrator [force-updates the mirror](index.md#force-an-update).
+
+When you push a change to the upstream repository, the push mirror receives it:
+
+- Within five minutes.
+- Within one minute, if you enabled **Only mirror protected branches**.
+
+In the case of a diverged branch, an error displays in the **Mirroring repositories**
+section.
+
+## Configure push mirroring
+
+To set up push mirroring for an existing project:
+
+1. On the top bar, select **Menu > Projects** and find your project.
+1. On the left sidebar, select **Settings > Repository**.
+1. Expand **Mirroring repositories**.
+1. Enter a repository URL.
+1. In the **Mirror direction** dropdown list, select **Push**.
+1. Select an **Authentication method**.
+ You can authenticate with either a password or an [SSH key](index.md#ssh-authentication).
+1. Select **Only mirror protected branches**, if necessary.
+1. Select **Keep divergent refs**, if desired.
+1. To save the configuration, select **Mirror repository**.
+
+### Configure push mirrors through the API
+
+You can also create and modify project push mirrors through the
+[remote mirrors API](../../../../api/remote_mirrors.md).
+
+## Keep divergent refs
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/208828) in GitLab 13.0.
+
+By default, if any ref (branch or tag) on the remote (downstream) mirror diverges from the
+local repository, the upstream repository overwrites any changes on the remote:
+
+1. A repository mirrors `main` and `develop` branches to a remote.
+1. A new commit is added to `develop` on the remote mirror.
+1. The next push updates the remote mirror to match the upstream repository.
+1. The new commit added to `develop` on the remote mirror is lost.
+
+If **Keep divergent refs** is selected, the changes are handled differently:
+
+1. Updates to the `develop` branch on the remote mirror are skipped.
+1. The `develop` branch on the remote mirror preserves the commit that does not
+ exist on the upstream repository. Any refs that exist in the remote mirror,
+ but not the upstream, are left untouched.
+1. The update is marked failed.
+
+After you create a mirror, you can only modify the value of **Keep divergent refs**
+through the [remote mirrors API](../../../../api/remote_mirrors.md).
+
+## Set up a push mirror from GitLab to GitHub
+
+To configure a mirror from GitLab to GitHub:
+
+1. Create a [GitHub personal access token](https://docs.github.com/en/github/authenticating-to-github/keeping-your-account-and-data-secure/creating-a-personal-access-token)
+ with `public_repo` selected.
+1. Enter a **Git repository URL** with this format:
+ `https://<your_github_username>@github.com/<your_github_group>/<your_github_project>.git`.
+1. For **Password**, enter your GitHub personal access token.
+1. Select **Mirror repository**.
+
+The mirrored repository is listed. For example:
+
+```plaintext
+https://*****:*****@github.com/<your_github_group>/<your_github_project>.git
+```
+
+The repository pushes shortly thereafter. To force a push, select **Update now** (**{retry}**).
+
+## Set up a push mirror from GitLab to AWS CodeCommit
+
+AWS CodeCommit push mirroring is the best way to connect GitLab repositories to
+AWS CodePipeline. GitLab is not yet supported as one of their Source Code Management (SCM) providers.
+Each new AWS CodePipeline needs significant AWS infrastructure setup. It also
+requires an individual pipeline per branch.
+
+If AWS CodeDeploy is the final step of a CodePipeline, you can, instead combine
+these tools to create a deployment:
+
+- GitLab CI/CD pipelines.
+- The AWS CLI in the final job in `.gitlab-ci.yml` to deploy to CodeDeploy.
+
+NOTE:
+GitLab-to-AWS-CodeCommit push mirroring cannot use SSH authentication until [GitLab issue 34014](https://gitlab.com/gitlab-org/gitlab/-/issues/34014) is resolved.
+
+To set up a mirror from GitLab to AWS CodeCommit:
+
+1. In the AWS IAM console, create an IAM user.
+1. Add the following least privileges permissions for repository mirroring as an **inline policy**.
+
+ The Amazon Resource Names (ARNs) must explicitly include the region and account. This IAM policy
+ grants privilege for mirroring access to two sample repositories. These permissions have
+ been tested to be the minimum (least privileged) required for mirroring:
+
+ ```json
+ {
+ "Version": "2012-10-17",
+ "Statement": [
+ {
+ "Sid": "MinimumGitLabPushMirroringPermissions",
+ "Effect": "Allow",
+ "Action": [
+ "codecommit:GitPull",
+ "codecommit:GitPush"
+ ],
+ "Resource": [
+ "arn:aws:codecommit:us-east-1:111111111111:MyDestinationRepo",
+ "arn:aws:codecommit:us-east-1:111111111111:MyDemo*"
+ ]
+ }
+ ]
+ }
+ ```
+
+1. After the user is created, select the AWS IAM user name.
+1. Select the **Security credentials** tab.
+1. Under **HTTPS Git credentials for AWS CodeCommit**, select **Generate credentials**.
+
+ NOTE:
+ This Git user ID and password is specific to communicating with CodeCommit. Do
+ not confuse it with the IAM user ID or AWS keys of this user.
+
+1. Copy or download the special Git HTTPS user ID and password.
+1. In the AWS CodeCommit console, create a new repository to mirror from your GitLab repository.
+1. Open your new repository, and then select **Clone URL > Clone HTTPS** (not **Clone HTTPS (GRC)**).
+1. In GitLab, open the repository to be push-mirrored.
+1. On the left sidebar, select **Settings > Repository**, and then expand **Mirroring repositories**.
+1. Fill in the **Git repository URL** field using this format:
+
+ ```plaintext
+ https://<your_aws_git_userid>@git-codecommit.<aws-region>.amazonaws.com/v1/repos/<your_codecommit_repo>
+ ```
+
+ Replace `<your_aws_git_userid>` with the AWS **special HTTPS Git user ID**
+ from the IAM Git credentials created earlier. Replace `<your_codecommit_repo>`
+ with the name of your repository in CodeCommit.
+
+1. For **Mirror direction**, select **Push**.
+1. For **Authentication method**, select **Password**. Fill in the **Password** box
+ with the special IAM Git clone user ID **password** created earlier in AWS.
+1. Leave the option **Only mirror protected branches** for CodeCommit. It pushes more
+ frequently (from every five minutes to every minute).
+
+ CodePipeline requires individual pipeline setups for named branches you want
+ to have a AWS CI setup for. Because feature branches with dynamic names are unsupported,
+ configuring **Only mirror protected branches** doesn't cause flexibility problems
+ with CodePipeline integration. You must also protect all the named branches you
+ want to build CodePipelines for.
+
+1. Select **Mirror repository**. You should see the mirrored repository appear:
+
+ ```plaintext
+ https://*****:*****@git-codecommit.<aws-region>.amazonaws.com/v1/repos/<your_codecommit_repo>
+ ```
+
+To test mirroring by forcing a push, select **Update now** (the half-circle arrows).
+If **Last successful update** shows a date, you have configured mirroring correctly.
+If it isn't working correctly, a red `error` tag appears, and shows the error message as hover text.
+
+## Set up a push mirror to another GitLab instance with 2FA activated
+
+1. On the destination GitLab instance, create a
+ [personal access token](../../../profile/personal_access_tokens.md) with `write_repository` scope.
+1. On the source GitLab instance:
+ 1. Enter the **Git repository URL** using this format:
+ `https://oauth2@<destination host>/<your_gitlab_group_or_name>/<your_gitlab_project>.git`.
+ 1. Enter the **Password**. Use the GitLab personal access token created on the
+ destination GitLab instance.
+ 1. Select **Mirror repository**.
+
+## Related topics
+
+- [Remote mirrors API](../../../../api/remote_mirrors.md).
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 81429ea5384..0094e0b1b15 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,6 +63,12 @@ To purge files from a GitLab repository:
git clone --bare --mirror /path/to/project.bundle
```
+1. Navigate to the `project.git` directory:
+
+ ```shell
+ cd project.git
+ ```
+
1. Using `git filter-repo`, purge any files from the history of your repository. Because we are
trying to remove internal refs, we rely on the `commit-map` produced by each run to tell us
which internal refs to remove.
diff --git a/doc/user/project/repository/repository_mirroring.md b/doc/user/project/repository/repository_mirroring.md
index 5a02a35fce1..8fbe5aec6a3 100644
--- a/doc/user/project/repository/repository_mirroring.md
+++ b/doc/user/project/repository/repository_mirroring.md
@@ -1,635 +1,9 @@
---
-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
-disqus_identifier: 'https://docs.gitlab.com/ee/workflow/repository_mirroring.html'
+redirect_to: 'mirror/index.md'
+remove_date: '2022-03-22'
---
-# Repository mirroring **(FREE)**
+This document was moved to [another location](mirror/index.md).
-Repository mirroring allows for the mirroring of repositories to and from external sources. You
-can use it to mirror branches, tags, and commits between repositories. It helps you use
-a repository outside of GitLab.
-
-A repository mirror at GitLab updates automatically. You can also manually trigger an update:
-
-- At most once every five minutes on GitLab.com.
-- According to a [limit set by the administrator](../../../administration/instance_limits.md#pull-mirroring-interval)
- on self-managed instances.
-
-There are two kinds of repository mirroring supported by GitLab:
-
-- [Push](#push-to-a-remote-repository): for mirroring a GitLab repository to another location.
-- [Pull](#pull-from-a-remote-repository): for mirroring a repository from another location to GitLab.
-
-When the mirror repository is updated, all new branches, tags, and commits are visible in the
-project's activity feed.
-
-Users with the [Maintainer role](../../permissions.md) for the project can also force an
-immediate update, unless:
-
-- The mirror is already being updated.
-- The [limit for pull mirroring interval seconds](../../../administration/instance_limits.md#pull-mirroring-interval) has not elapsed since its last update.
-
-For security reasons, the URL to the original repository is only displayed to users with the
-[Maintainer role](../../permissions.md) or the [Owner role](../../permissions.md) for the mirrored
-project.
-
-## Use cases
-
-The following are some possible use cases for repository mirroring:
-
-- You migrated to GitLab but still need to keep your project in another source. In that case, you
- can set it up to mirror to GitLab (pull) and all the essential history of commits, tags,
- and branches are available in your GitLab instance. **(PREMIUM)**
-- You have old projects in another source that you don't use actively anymore, but don't want to
- remove for archiving purposes. In that case, you can create a push mirror so that your active
- GitLab repository can push its changes to the old location.
-- You are a GitLab self-managed user for privacy reasons and your instance is closed to the public,
- but you still have certain software components that you want open sourced. In this case, utilizing
- GitLab to be your primary repository which is closed from the public, and using push mirroring to a
- GitLab.com repository that's public, allows you to open source specific projects and contribute back
- to the open source community.
-
-## Push to a remote repository
-
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/40137) in GitLab 13.5: LFS support over HTTPS.
-
-For an existing project, you can set up push mirroring as follows:
-
-1. In your project, go to **Settings > Repository**, and then expand the **Mirroring repositories** section.
-1. Enter a repository URL.
-1. In the **Mirror direction** dropdown, select **Push**.
-1. Select an authentication method from the **Authentication method** dropdown.
- You can authenticate with either a password or an [SSH key](#ssh-authentication).
-1. Select the **Only mirror protected branches** checkbox, if necessary.
-1. Select the **Keep divergent refs** checkbox, if desired.
-1. Select **Mirror repository** to save the configuration.
-
-When push mirroring is enabled, only push commits directly to the mirrored repository to prevent the
-mirror diverging.
-
-Unlike [pull mirroring](#how-it-works), the mirrored repository is not periodically auto-synced.
-The mirrored repository receives all changes only when:
-
-- Commits are pushed to GitLab.
-- A [forced update](#force-an-update) is initiated.
-
-Changes pushed to files in the repository are automatically pushed to the remote mirror at least:
-
-- Within five minutes of being received.
-- Within one minute if **Only mirror protected branches** is enabled.
-
-In the case of a diverged branch, an error displays in the **Mirroring repositories**
-section.
-
-### Configure push mirrors through the API
-
-You can also create and modify project push mirrors through the
-[remote mirrors API](../../../api/remote_mirrors.md).
-
-### Keep divergent refs
-
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/208828) in GitLab 13.0.
-
-By default, if any ref (branch or tag) on the remote mirror has diverged from the local repository, the local differences are forced to the remote.
-
-For example, if a repository has `main` and `develop` branches that
-have been mirrored to a remote, and then a new commit is added to `develop` on
-the remote mirror. The next push updates all of the references on the remote mirror to match
-the local repository, and the new commit added to the remote `develop` branch is lost.
-
-With the **Keep divergent refs** option enabled, the `develop` branch is
-skipped, causing only `main` to be updated. The mirror status
-reflects that `develop` has diverged and was skipped, and be marked as a
-failed update. Refs that exist in the mirror repository but not in the local
-repository are left untouched.
-
-NOTE:
-After the mirror is created, this option can only be modified via the [API](../../../api/remote_mirrors.md).
-
-### Set up a push mirror from GitLab to GitHub
-
-To set up a mirror from GitLab to GitHub, you need to follow these steps:
-
-1. Create a [GitHub personal access token](https://docs.github.com/en/github/authenticating-to-github/keeping-your-account-and-data-secure/creating-a-personal-access-token) with the `public_repo` box checked.
-1. Fill in the **Git repository URL** field using this format: `https://<your_github_username>@github.com/<your_github_group>/<your_github_project>.git`.
-1. Fill in **Password** field with your GitHub personal access token.
-1. Select **Mirror repository**.
-
-The mirrored repository is listed. For example, `https://*****:*****@github.com/<your_github_group>/<your_github_project>.git`.
-
-The repository pushes shortly thereafter. To force a push, select the **Update now** (**{retry}**) button.
-
-### Set up a push mirror from GitLab to AWS CodeCommit
-
-AWS CodeCommit push mirroring is the best way to connect GitLab repositories to
-AWS CodePipeline, as GitLab isn't yet supported as one of their Source Code Management (SCM) providers.
-
-Each new AWS CodePipeline needs significant AWS infrastructure setup. It also
-requires an individual pipeline per branch.
-
-If AWS CodeDeploy is the final step of a CodePipeline, you can, instead, leverage
-GitLab CI/CD pipelines and use the AWS CLI in the final job in `.gitlab-ci.yml`
-to deploy to CodeDeploy.
-
-NOTE:
-GitLab-to-AWS-CodeCommit push mirroring cannot use SSH authentication until [GitLab issue 34014](https://gitlab.com/gitlab-org/gitlab/-/issues/34014) is resolved.
-
-To set up a mirror from GitLab to AWS CodeCommit:
-
-1. In the AWS IAM console, create an IAM user.
-1. Add the following least privileges permissions for repository mirroring as an "inline policy".
-
- The Amazon Resource Names (ARNs) must explicitly include the region and account. The IAM policy
- below grants privilege for mirroring access to two sample repositories. These permissions have
- been tested to be the minimum (least privileged) required for mirroring:
-
- ```json
- {
- "Version": "2012-10-17",
- "Statement": [
- {
- "Sid": "MinimumGitLabPushMirroringPermissions",
- "Effect": "Allow",
- "Action": [
- "codecommit:GitPull",
- "codecommit:GitPush"
- ],
- "Resource": [
- "arn:aws:codecommit:us-east-1:111111111111:MyDestinationRepo",
- "arn:aws:codecommit:us-east-1:111111111111:MyDemo*"
- ]
- }
- ]
- }
- ```
-
-1. After the user was created, select the AWS IAM user name.
-1. Select the **Security credentials** tab.
-1. Under **HTTPS Git credentials for AWS CodeCommit** select **Generate credentials**.
-
- NOTE:
- This Git user ID and password is specific to communicating with CodeCommit. Do
- not confuse it with the IAM user ID or AWS keys of this user.
-
-1. Copy or download special Git HTTPS user ID and password.
-1. In the AWS CodeCommit console, create a new repository to mirror from your GitLab repository.
-1. Open your new repository, and then select **Clone URL > Clone HTTPS** (not **Clone HTTPS (GRC)**).
-1. In GitLab, open the repository to be push-mirrored.
-1. Go to **Settings > Repository**, and then expand **Mirroring repositories**.
-1. Fill in the **Git repository URL** field using this format:
-
- ```plaintext
- https://<your_aws_git_userid>@git-codecommit.<aws-region>.amazonaws.com/v1/repos/<your_codecommit_repo>
- ```
-
- Replace `<your_aws_git_userid>` with the AWS **special HTTPS Git user ID** from the IAM Git
- credentials created earlier. Replace `<your_codecommit_repo>` with the name of your repository in CodeCommit.
-
-1. For **Mirror direction**, select **Push**.
-1. For **Authentication method**, select **Password** and fill in the **Password** field with the special IAM Git clone user ID **password** created earlier in AWS.
-1. The option **Only mirror protected branches** should be good for CodeCommit as it pushes more
- frequently (from every five minutes to every minute).
- CodePipeline requires individual pipeline setups for named branches you wish to have a AWS CI setup for. Because feature branches that have dynamic names are unsupported, configuring **Only mirror protected branches** doesn't cause flexibility problems with CodePipeline integration as long as you are also willing to protect all the named branches you want to build CodePipelines for.
-
-1. Select **Mirror repository**. You should see the mirrored repository appear:
-
- ```plaintext
- https://*****:*****@git-codecommit.<aws-region>.amazonaws.com/v1/repos/<your_codecommit_repo>
- ```
-
-To test mirroring by forcing a push, select the half-circle arrows button (hover text is **Update now**).
-If **Last successful update** shows a date, you have configured mirroring correctly.
-If it isn't working correctly, a red `error` tag appears and shows the error message as hover text.
-
-### Set up a push mirror to another GitLab instance with 2FA activated
-
-1. On the destination GitLab instance, create a [personal access token](../../profile/personal_access_tokens.md) with `write_repository` scope.
-1. On the source GitLab instance:
- 1. Fill in the **Git repository URL** field using this format: `https://oauth2@<destination host>/<your_gitlab_group_or_name>/<your_gitlab_project>.git`.
- 1. Fill in the **Password** field with the GitLab personal access token created on the destination GitLab instance.
- 1. Select **Mirror repository**.
-
-## Pull from a remote repository **(PREMIUM)**
-
-> - [Added Git LFS support](https://gitlab.com/gitlab-org/gitlab/-/issues/10871) in GitLab 11.11.
-> - Moved to GitLab Premium in 13.9.
-
-You can set up a repository to automatically have its branches, tags, and commits updated from an
-upstream repository.
-
-If a repository you're interested in is located on a different server, and you want
-to browse its content and its activity using the GitLab interface, you can configure
-mirror pulling:
-
-1. If your remote repository is on GitHub and you have
- [two-factor authentication (2FA) configured](https://docs.github.com/en/github/authenticating-to-github/securing-your-account-with-two-factor-authentication-2fa),
- create a [personal access token for GitHub](https://docs.github.com/en/github/authenticating-to-github/keeping-your-account-and-data-secure/creating-a-personal-access-token).
- with the `repo` scope. If 2FA is enabled, this personal access
- token serves as your GitHub password.
-1. In your project, go to **Settings > Repository**, and then expand the
- **Mirroring repositories** section.
-1. In the **Git repository URL** field, enter a repository URL. Include the username
- in the URL if required: `https://MYUSERNAME@github.com/group/PROJECTNAME.git`
-1. In the **Mirror direction** dropdown, select **Pull**.
-1. In the **Authentication method** dropdown, select your authentication method.
-1. Select from the following checkboxes, if needed:
- - **Overwrite diverged branches**
- - **Trigger pipelines for mirror updates**
- - **Only mirror protected branches**
-1. Select **Mirror repository** to save the configuration.
-
-Because GitLab is now set to pull changes from the upstream repository, you should not push commits
-directly to the repository on GitLab. Instead, any commits should be pushed to the remote repository.
-Changes pushed to the remote repository are pulled into the GitLab repository, either:
-
-- Automatically in a certain period of time.
-- When a [forced update](#force-an-update) is initiated.
-
-WARNING:
-If you do manually update a branch in the GitLab repository, the branch becomes diverged from
-upstream, and GitLab no longer automatically updates this branch to prevent any changes from being lost.
-Deleted branches and tags in the upstream repository are not reflected in the GitLab repository.
-
-### How it works
-
-After the pull mirroring feature has been enabled for a repository, the repository is added to a queue.
-
-Once per minute, a Sidekiq cron job schedules repository mirrors to update, based on:
-
-- The capacity available. This is determined by Sidekiq settings. For GitLab.com, see [GitLab.com Sidekiq settings](../../gitlab_com/index.md#sidekiq).
-- The number of repository mirrors already in the queue that are due to be updated. Being due depends on when the repository mirror was last updated and how many times it's been retried.
-
-Repository mirrors are updated as Sidekiq becomes available to process them. If the process of updating the repository mirror:
-
-- **Succeeds**: An update is enqueued again with at least a 30 minute wait.
-- **Fails**: (For example, a branch diverged from upstream.), The update attempted again later. Mirrors can fail
- up to 14 times before they are no longer enqueued for updates.
-
-### Overwrite diverged branches **(PREMIUM)**
-
-> Moved to GitLab Premium in 13.9.
-
-You can choose to always update your local branches with remote versions, even if they have
-diverged from the remote.
-
-WARNING:
-For mirrored branches, enabling this option results in the loss of local changes.
-
-To use this option, check the **Overwrite diverged branches** box when creating a repository mirror.
-
-### Trigger pipelines for mirror updates **(PREMIUM)**
-
-> Moved to GitLab Premium in 13.9.
-
-If this option is enabled, pipelines trigger when branches or tags are
-updated from the remote repository. Depending on the activity of the remote
-repository, this may greatly increase the load on your CI runners. Only enable
-this if you know they can handle the load. CI uses the credentials
-assigned when you set up pull mirroring.
-
-### Hard failure **(PREMIUM)**
-
-> Moved to GitLab Premium in 13.9.
-
-After 14 consecutive unsuccessful retries, the mirroring process is marked as a hard failure
-and mirroring attempts stop. This failure is visible in either the:
-
-- Project's main dashboard.
-- Pull mirror settings page.
-
-You can resume the project mirroring again by [forcing an update](#force-an-update).
-
-### Trigger an update using the API **(PREMIUM)**
-
-> Moved to GitLab Premium in 13.9.
-
-Pull mirroring uses polling to detect new branches and commits added upstream, often minutes
-afterwards. If you notify GitLab by [API](../../../api/projects.md#start-the-pull-mirroring-process-for-a-project),
-updates are pulled immediately.
-
-For more information, see [Start the pull mirroring process for a Project](../../../api/projects.md#start-the-pull-mirroring-process-for-a-project).
-
-## Mirror only protected branches **(PREMIUM)**
-
-> Moved to GitLab Premium in 13.9.
-
-Based on the mirror direction that you choose, you can opt to mirror only the
-[protected branches](../protected_branches.md) in the mirroring project,
-either from or to your remote repository. For pull mirroring, non-protected branches in
-the mirroring project are not mirrored and can diverge.
-
-To use this option, check the **Only mirror protected branches** box when
-creating a repository mirror. **(PREMIUM)**
-
-## SSH authentication
-
-> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/22982) in GitLab 11.6 for Push mirroring.
-
-SSH authentication is mutual:
-
-- You have to prove to the server that you're allowed to access the repository.
-- The server also has to prove to *you* that it's who it claims to be.
-
-You provide your credentials as a password or public key. The server that the
-other repository resides on provides its credentials as a "host key", the
-fingerprint of which needs to be verified manually.
-
-If you're mirroring over SSH (using an `ssh://` URL), you can authenticate using:
-
-- Password-based authentication, just as over HTTPS.
-- Public key authentication. This is often more secure than password authentication,
- especially when the other repository supports [deploy keys](../deploy_keys/index.md).
-
-To get started:
-
-1. In your project, go to **Settings > Repository**, and then expand the **Mirroring repositories** section.
-1. Enter an `ssh://` URL for mirroring.
-
-NOTE:
-SCP-style URLs (that is, `git@example.com:group/project.git`) are not supported at this time.
-
-Entering the URL adds two buttons to the page:
-
-- **Detect host keys**.
-- **Input host keys manually**.
-
-If you select the:
-
-- **Detect host keys** button, GitLab fetches the host keys from the server and display the fingerprints.
-- **Input host keys manually** button, a field is displayed where you can paste in host keys.
-
-Assuming you used the former, you now need to verify that the fingerprints are
-those you expect. GitLab.com and other code hosting sites publish their
-fingerprints in the open for you to check:
-
-- [AWS CodeCommit](https://docs.aws.amazon.com/codecommit/latest/userguide/regions.html#regions-fingerprints)
-- [Bitbucket](https://support.atlassian.com/bitbucket-cloud/docs/configure-ssh-and-two-step-verification/)
-- [GitHub](https://docs.github.com/en/github/authenticating-to-github/keeping-your-account-and-data-secure/githubs-ssh-key-fingerprints)
-- [GitLab.com](../../gitlab_com/index.md#ssh-host-keys-fingerprints)
-- [Launchpad](https://help.launchpad.net/SSHFingerprints)
-- [Savannah](http://savannah.gnu.org/maintenance/SshAccess/)
-- [SourceForge](https://sourceforge.net/p/forge/documentation/SSH%20Key%20Fingerprints/)
-
-Other providers vary. If you're running self-managed GitLab, or otherwise
-have access to the server for the other repository, you can securely gather the
-key fingerprints:
-
-```shell
-$ cat /etc/ssh/ssh_host*pub | ssh-keygen -E md5 -l -f -
-256 MD5:f4:28:9f:23:99:15:21:1b:bf:ed:1f:8e:a0:76:b2:9d root@example.com (ECDSA)
-256 MD5:e6:eb:45:8a:3c:59:35:5f:e9:5b:80:12:be:7e:22:73 root@example.com (ED25519)
-2048 MD5:3f:72:be:3d:62:03:5c:62:83:e8:6e:14:34:3a:85:1d root@example.com (RSA)
-```
-
-NOTE:
-You may need to exclude `-E md5` for some older versions of SSH.
-
-When mirroring the repository, GitLab checks that at least one of the
-stored host keys matches before connecting. This can prevent malicious code from
-being injected into your mirror, or your password being stolen.
-
-### SSH public key authentication
-
-To use SSH public key authentication, you must also choose that option
-from the **Authentication method** dropdown. When the mirror is created,
-GitLab generates a 4096-bit RSA key that can be copied by selecting the **Copy SSH public key** button.
-
-![Repository mirroring copy SSH public key to clipboard button](img/repository_mirroring_copy_ssh_public_key_button.png)
-
-You then need to add the public SSH key to the other repository's configuration:
-
-- If the other repository is hosted on GitLab, you should add the public SSH key
- as a [deploy key](../../project/deploy_keys/index.md).
-- If the other repository is hosted elsewhere, you may need to add the key to
- your user's `authorized_keys` file. Paste the entire public SSH key into the
- file on its own line and save it.
-
-If you need to change the key at any time, you can remove and re-add the mirror
-to generate a new key. Update the other repository with the new
-key to keep the mirror running.
-
-NOTE:
-The generated keys are stored in the GitLab database, not in the file system. Therefore,
-SSH public key authentication for mirrors cannot be used in a pre-receive hook.
-
-## Force an update **(FREE)**
-
-While mirrors are scheduled to update automatically, you can always force an update by using the
-update button which is available on the **Mirroring repositories** section of the **Repository Settings** page.
-
-![Repository mirroring force update user interface](img/repository_mirroring_force_update.png)
-
-## Bidirectional mirroring **(PREMIUM)**
-
-> Moved to GitLab Premium in 13.9.
-
-WARNING:
-Bidirectional mirroring may cause conflicts.
-
-If you configure a GitLab repository to both pull from, and push to, the same remote source, there
-is no guarantee that either repository updates correctly. If you set up a repository for
-bidirectional mirroring, you should prepare for the likely conflicts by deciding who resolves
-them and how.
-
-Rewriting any mirrored commit on either remote causes conflicts and mirroring to fail. This can
-be prevented by [mirroring only protected branches](#mirror-only-protected-branches).
-
-You should [protect the branches](../protected_branches.md) you wish to mirror on both
-remotes to prevent conflicts caused by rewriting history.
-
-Bidirectional mirroring also creates a race condition where commits made close together to the same
-branch causes conflicts. The race condition can be mitigated by reducing the mirroring delay by using
-a [Push event webhook](../integrations/webhooks.md#push-events) to trigger an immediate
-pull to GitLab. Push mirroring from GitLab is rate limited to once per minute when only push mirroring
-protected branches.
-
-### Configure a webhook to trigger an immediate pull to GitLab
-
-Assuming you have already configured the [push](#set-up-a-push-mirror-to-another-gitlab-instance-with-2fa-activated)
-and [pull](#pull-from-a-remote-repository) mirrors in the upstream GitLab instance, to trigger an
-immediate pull as suggested above, you must configure a [Push Event Web Hook](../integrations/webhooks.md#push-events)
-in the downstream instance.
-
-To do this:
-
-1. Create a [personal access token](../../profile/personal_access_tokens.md) with `API` scope.
-1. In your project, go to **Settings > Webhooks**.
-1. Add the webhook URL which (in this case) uses the [Pull Mirror API](../../../api/projects.md#start-the-pull-mirroring-process-for-a-project)
- request to trigger an immediate pull after updates to the repository.
-
- ```plaintext
- https://gitlab.example.com/api/v4/projects/:id/mirror/pull?private_token=<your_access_token>
- ```
-
-1. Ensure the **Push Events** checkbox is selected.
-1. Select **Add Webhook** to save the webhook.
-
-To test the integration, select the **Test** button and confirm GitLab doesn't return an error message.
-
-### Prevent conflicts using a pre-receive hook
-
-WARNING:
-The solution proposed negatively affects the performance of
-Git push operations because they are proxied to the upstream Git
-repository.
-
-A server-side `pre-receive` hook can be used to prevent the race condition
-described above by only accepting the push after first pushing the commit to
-the upstream Git repository. In this configuration one Git repository acts as
-the authoritative upstream, and the other as downstream. The `pre-receive` hook
-is installed on the downstream repository.
-
-Read about [configuring Server hooks](../../../administration/server_hooks.md) on the GitLab server.
-
-A sample `pre-receive` hook is provided below.
-
-```shell
-#!/usr/bin/env bash
-
-# --- Assume only one push mirror target
-# Push mirroring remotes are named `remote_mirror_<id>`, this finds the first remote and uses that.
-TARGET_REPO=$(git remote | grep -m 1 remote_mirror)
-
-proxy_push()
-{
- # --- Arguments
- OLDREV=$(git rev-parse $1)
- NEWREV=$(git rev-parse $2)
- REFNAME="$3"
-
- # --- Pattern of branches to proxy pushes
- allowlist=$(expr "$branch" : "\(master\)")
-
- case "$refname" in
- refs/heads/*)
- branch=$(expr "$refname" : "refs/heads/\(.*\)")
-
- if [ "$allowlist" = "$branch" ]; then
- unset GIT_QUARANTINE_PATH # handle https://git-scm.com/docs/git-receive-pack#_quarantine_environment
- error="$(git push --quiet $TARGET_REPO $NEWREV:$REFNAME 2>&1)"
- fail=$?
-
- if [ "$fail" != "0" ]; then
- echo >&2 ""
- echo >&2 " Error: updates were rejected by upstream server"
- echo >&2 " This is usually caused by another repository pushing changes"
- echo >&2 " to the same ref. You may want to first integrate remote changes"
- echo >&2 ""
- return
- fi
- fi
- ;;
- esac
-}
-
-# Allow dual mode: run from the command line just like the update hook, or
-# if no arguments are given then run as a hook script
-if [ -n "$1" -a -n "$2" -a -n "$3" ]; then
- # Output to the terminal in command line mode - if someone wanted to
- # resend an email; they could redirect the output to sendmail
- # themselves
- PAGER= proxy_push $2 $3 $1
-else
- # Push is proxied upstream one ref at a time. Because of this it is possible
- # for some refs to succeed, and others to fail. This will result in a failed
- # push.
- while read oldrev newrev refname
- do
- proxy_push $oldrev $newrev $refname
- done
-fi
-```
-
-Note that this sample has a few limitations:
-
-- This example may not work verbatim for your use case and might need modification.
- - It doesn't regard different types of authentication mechanisms for the mirror.
- - It doesn't work with forced updates (rewriting history).
- - Only branches that match the `allowlist` patterns are proxy pushed.
-- The script circumvents the Git hook quarantine environment because the update of `$TARGET_REPO`
- is seen as a ref update, and Git displays warnings about it.
-
-### Mirror with Perforce Helix via Git Fusion **(PREMIUM)**
-
-> Moved to GitLab Premium in 13.9.
-
-WARNING:
-Bidirectional mirroring should not be used as a permanent configuration. Refer to
-[Migrating from Perforce Helix](../import/perforce.md) for alternative migration approaches.
-
-[Git Fusion](https://www.perforce.com/manuals/git-fusion/#Git-Fusion/section_avy_hyc_gl.html) provides a Git interface
-to [Perforce Helix](https://www.perforce.com/products) which can be used by GitLab to bidirectionally
-mirror projects with GitLab. This can help you in some situations when migrating from Perforce Helix
-to GitLab where overlapping Perforce Helix workspaces cannot be migrated simultaneously to GitLab.
-
-If using mirroring with Perforce Helix, you should only mirror protected branches. Perforce Helix
-rejects any pushes that rewrite history. Only the fewest number of branches should be mirrored
-due to the performance limitations of Git Fusion.
-
-When configuring mirroring with Perforce Helix via Git Fusion, the following Git Fusion
-settings are recommended:
-
-- `change-pusher` should be disabled. Otherwise, every commit is rewritten as being committed
- by the mirroring account, rather than being mapped to existing Perforce Helix users or the `unknown_git` user.
-- `unknown_git` user is used as the commit author if the GitLab user doesn't exist in
- Perforce Helix.
-
-Read about [Git Fusion settings on Perforce.com](https://www.perforce.com/manuals/git-fusion/Content/Git-Fusion/section_vss_bdw_w3.html#section_zdp_zz1_3l).
-
-## Troubleshooting
-
-Should an error occur during a push, GitLab displays an **Error** highlight for that repository. Details on the error can then be seen by hovering over the highlight text.
-
-### 13:Received RST_STREAM with error code 2 with GitHub
-
-If you receive a "13:Received RST_STREAM with error code 2" message while mirroring to a GitHub repository,
-your GitHub settings might be set to block pushes that expose your email address used in commits. Either
-set your email address on GitHub to be public, or disable the [Block command line pushes that expose my email](https://github.com/settings/emails) setting.
-
-### 4:Deadline Exceeded
-
-When upgrading to GitLab 11.11.8 or newer, a change in how usernames are represented means that you
-may need to update your mirroring username and password to ensure that `%40` characters are replaced with `@`.
-
-### Connection blocked because server only allows public key authentication
-
-As the error indicates, the connection is getting blocked between GitLab and the remote repository. Even if a
-[TCP Check](../../../administration/raketasks/maintenance.md#check-tcp-connectivity-to-a-remote-site) is successful,
-you must check any networking components in the route from GitLab to the remote Server to ensure there's no blockage.
-
-For example, we've seen this error when a Firewall was performing a `Deep SSH Inspection` on outgoing packets.
-
-### Could not read username: terminal prompts disabled
-
-If you receive this error after creating a new project using
-[GitLab CI/CD for external repositories](../../../ci/ci_cd_for_external_repos/):
-
-```plaintext
-"2:fetch remote: "fatal: could not read Username for 'https://bitbucket.org': terminal prompts disabled\n": exit status 128."
-```
-
-Check if the repository owner is specified in the URL of your mirrored repository:
-
-1. Go to your project.
-1. On the left sidebar, select **Settings > Repository**.
-1. Select **Mirroring repositories**.
-1. If no repository owner is specified, delete and add the URL again in this format:
-
- ```plaintext
- https://**<repo_owner>**@bitbucket.org/<accountname>/<reponame>.git
- ```
-
-The repository owner is needed for Bitbucket to connect to the repository for mirroring.
-
-### Pull mirror is missing LFS files
-
-In some cases, pull mirroring does not transfer LFS files. This issue occurs when:
-
-- You use an SSH repository URL. The workaround is to use an HTTPS repository URL instead.
- There is [an issue to fix this for SSH URLs](https://gitlab.com/gitlab-org/gitlab/-/issues/11997).
-- You're using GitLab 14.0 or older, and the source repository is a public Bitbucket URL.
- This was [fixed in GitLab 14.0.6](https://gitlab.com/gitlab-org/gitlab/-/issues/335123).
-- You mirror an external repository using object storage.
- There is [an issue to fix this](https://gitlab.com/gitlab-org/gitlab/-/issues/335495).
+<!-- This redirect file can be deleted after <2022-03-22>. -->
+<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/#move-or-rename-a-page --> \ No newline at end of file
diff --git a/doc/user/project/requirements/index.md b/doc/user/project/requirements/index.md
index 3be3b1682bb..661bd3e0598 100644
--- a/doc/user/project/requirements/index.md
+++ b/doc/user/project/requirements/index.md
@@ -7,8 +7,12 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# Requirements Management **(ULTIMATE)**
+NOTE:
+In 14.4, Requirements was moved under **Issues**.
+
> - [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/2703) in [GitLab Ultimate](https://about.gitlab.com/pricing/) 12.10.
> - The ability to add and edit a requirement's long description [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/224622) in [GitLab Ultimate](https://about.gitlab.com/pricing/) 13.5.
+> - [Moved under Issues](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/70748) in 14.4
With requirements, you can set criteria to check your products against. They can be based on users,
stakeholders, system, software, or anything else you find important to capture.
@@ -38,7 +42,7 @@ Users with Reporter or higher [permissions](../../permissions.md) can create req
To create a requirement:
-1. In a project, go to **Requirements**.
+1. In a project, go to **Issues > Requirements**.
1. Select **New requirement**.
1. Enter a title and description and select **Create requirement**.
@@ -107,7 +111,7 @@ You can search for a requirement from the requirements list page based on the fo
To search for a requirement:
-1. In a project, go to **Requirements > List**.
+1. In a project, go to **Issues > Requirements > List**.
1. Select the **Search or filter results** field. A dropdown menu appears.
1. Select the requirement author or status from the dropdown or enter plain text to search by requirement title.
1. Press <kbd>Enter</kbd> on your keyboard to filter the list.
@@ -222,7 +226,7 @@ Before you import your file:
To import requirements:
-1. In a project, go to **Requirements**.
+1. In a project, go to **Issues > Requirements**.
- If the project already has existing requirements, select the import icon (**{import}**) in the
top right.
- For a project without any requirements, select **Import CSV** in the middle of the page.
@@ -281,7 +285,7 @@ Users with Reporter or higher [permissions](../../permissions.md) can export req
To export requirements:
-1. In a project, go to **Requirements**.
+1. In a project, go to **Issues > Requirements**.
1. In the top right, select the **Export as CSV** icon (**{export}**).
A confirmation modal appears.
diff --git a/doc/user/project/settings/import_export.md b/doc/user/project/settings/import_export.md
index 69215e03f28..6c3bf731cf8 100644
--- a/doc/user/project/settings/import_export.md
+++ b/doc/user/project/settings/import_export.md
@@ -141,6 +141,11 @@ The following items are **not** exported:
- Merge Request Approvers
- Repository size limits
+These content rules also apply to creating projects from templates on the
+[group](../../group/custom_project_templates.md)
+or [instance](../../admin_area/custom_project_templates.md)
+levels, because the same export and import mechanisms are used.
+
NOTE:
For more details on the specific data persisted in a project export, see the
[`import_export.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/import_export/project/import_export.yml) file.
@@ -221,6 +226,15 @@ GitLab.com may have [different settings](../../gitlab_com/index.md#importexport)
## Troubleshooting
+### Project fails to import due to mismatch
+
+If the [shared runners enablement](../../../ci/runners/runners_scope.md#enable-shared-runners)
+does not match between the exported project, and the project import, the project fails to import.
+Review [issue 276930](https://gitlab.com/gitlab-org/gitlab/-/issues/276930), and either:
+
+- Ensure shared runners are enabled in both the source and destination projects.
+- Disable shared runners on the parent group when you import the project.
+
### Import workaround for large repositories
[Maximum import size limitations](#import-the-project)
@@ -258,7 +272,7 @@ reduce the repository size for another import attempt.
git gc --prune=now --aggressive
# Prepare recreating an importable file
- git bundle create ../project.bundle smaller-tmp-main
+ git bundle create ../project.bundle <default-branch-name>
cd ..
mv project/ ../"$EXPORT"-project
cd ..
@@ -276,3 +290,29 @@ reduce the repository size for another import attempt.
its [default branch](../repository/branches/default.md), and
delete the temporary, `smaller-tmp-main` branch, and
the local, temporary data.
+
+### Manually execute export steps
+
+Exports sometimes fail without giving enough information to troubleshoot. In these cases, it can be
+helpful to [execute the export process manually within rails](https://gitlab.com/gitlab-com/runbooks/-/blob/master/docs/uncategorized/project-export.md#export-a-project-via-rails-console).
+Execute each line individually, rather than pasting the entire block at once, so you can see any
+errors each command returns.
+
+```shell
+u = User.find_by_username('someuser')
+p = Project.find_by_full_path('some/project')
+e = Projects::ImportExport::ExportService.new(p,u)
+
+e.send(:version_saver).send(:save)
+e.send(:avatar_saver).send(:save)
+e.send(:project_tree_saver).send(:save)
+e.send(:uploads_saver).send(:save)
+e.send(:wiki_repo_saver).send(:save)
+e.send(:lfs_saver).send(:save)
+e.send(:snippets_repo_saver).send(:save)
+e.send(:design_repo_saver).send(:save)
+
+s = Gitlab::ImportExport::Saver.new(exportable: p, shared:p.import_export_shared)
+s.send(:compress_and_save)
+s.send(:save_upload)
+```
diff --git a/doc/user/project/settings/index.md b/doc/user/project/settings/index.md
index 8b159a75451..30def6ae80f 100644
--- a/doc/user/project/settings/index.md
+++ b/doc/user/project/settings/index.md
@@ -1,6 +1,6 @@
---
-stage: Create
-group: Source Code
+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/engineering/ux/technical-writing/#assignments"
type: reference, index, howto
---
@@ -39,17 +39,19 @@ You can use [emphasis](../../markdown.md#emphasis), [links](../../markdown.md#li
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/276221) in GitLab 13.9.
> - [Feature flag removed](https://gitlab.com/gitlab-org/gitlab/-/issues/287779) in GitLab 13.12.
-You can create a framework label to identify that your project has certain compliance requirements
-or needs additional oversight.
+You can create a compliance framework label to identify that your project has certain compliance
+requirements or needs additional oversight. The label can optionally apply
+[compliance pipeline configuration](#compliance-pipeline-configuration).
Group owners can create, edit, and delete compliance frameworks:
-1. Go to the group's **Settings** > **General**.
+1. On the top bar, select **Menu > Groups** and find your group.
+1. On the left sidebar, select **Settings** > **General**.
1. Expand the **Compliance frameworks** section.
-Compliance frameworks created can then be assigned to any number of projects using:
+Compliance frameworks created can then be assigned to projects within the group using:
-- The project settings page inside the group or subgroups.
+- The GitLab UI, using the project settings page.
- In [GitLab 14.2](https://gitlab.com/gitlab-org/gitlab/-/issues/333249) and later, using the
[GraphQL API](../../../api/graphql/reference/index.md#mutationprojectsetcomplianceframework).
@@ -64,24 +66,32 @@ read-only view to discourage this behavior.
> - [Enabled by default](https://gitlab.com/gitlab-org/gitlab/-/issues/300324) in GitLab 13.11.
> - [Feature flag removed](https://gitlab.com/gitlab-org/gitlab/-/issues/331231) in GitLab 14.2.
-Group owners can use the compliance pipeline configuration to define compliance requirements
-such as scans or tests, and enforce them in individual projects.
+Group owners can use compliance pipeline configuration to add additional pipeline configuration to
+projects to define compliance requirements such as scans or tests.
-The [custom compliance framework](#compliance-frameworks) feature allows group owners to specify the location
-of a compliance pipeline configuration stored and managed in a dedicated project, distinct from a developer's project.
+[Compliance frameworks](#compliance-frameworks) allow group owners to specify the location of
+compliance pipeline configuration stored and managed in dedicated projects, separate from regular
+projects.
-When you set up the compliance pipeline configuration field, use the
-`file@group/project` format. For example, you can configure
-`.compliance-gitlab-ci.yml@compliance-group/compliance-project`.
-This field is inherited by projects where the compliance framework label is applied. The result
-forces the project to run the compliance configurations.
+When you set up the compliance framework, use the **Compliance pipeline configuration** box to link
+the compliance framework to specific CI/CD configuration. Use the
+`path/file.y[a]ml@group-name/project-name` format. For example:
-When a project with a custom label executes a pipeline, it begins by evaluating the compliance pipeline configuration.
-The custom pipeline configuration can then execute any included individual project configuration.
+- `.compliance-ci.yml@gitlab-org/gitlab`.
+- `.compliance-ci.yaml@gitlab-org/gitlab`.
-The user running the pipeline in the project should at least have Reporter access to the compliance project.
+This configuration is inherited by projects where the compliance framework label is applied. The
+result forces projects with the label to run the compliance CI/CD configuration in addition to
+the project's own CI/CD configuration. When a project with a compliance framework label executes a
+pipeline, it evaluates configuration in the following order:
-Example `.compliance-gitlab-ci.yml`
+1. Compliance pipeline configuration.
+1. Project-specific pipeline configuration.
+
+The user running the pipeline in the project must at least have the Reporter role on the compliance
+project.
+
+Example `.compliance-gitlab-ci.yml`:
```yaml
# Allows compliance team to control the ordering and interweaving of stages/jobs.
@@ -94,10 +104,10 @@ stages:
- deploy
- post-compliance
-variables: # Can be overridden by setting a job-specific variable in project's local .gitlab-ci.yml
+variables: # Can be overridden by setting a job-specific variable in project's local .gitlab-ci.yml
FOO: sast
-sast: # None of these attributes can be overridden by a project's local .gitlab-ci.yml
+sast: # None of these attributes can be overridden by a project's local .gitlab-ci.yml
variables:
FOO: sast
image: ruby:2.6
@@ -144,10 +154,10 @@ audit trail:
after_script:
- "# No after scripts."
-include: # Execute individual project's configuration (if project contains .gitlab-ci.yml)
+include: # Execute individual project's configuration (if project contains .gitlab-ci.yml)
project: '$CI_PROJECT_PATH'
file: '$CI_CONFIG_PATH'
- ref: '$CI_COMMIT_REF_NAME' # Must be defined or MR pipelines always use the use default branch.
+ ref: '$CI_COMMIT_REF_NAME' # Must be defined or MR pipelines always use the use default branch.
```
##### Ensure compliance jobs are always run
@@ -182,6 +192,20 @@ cannot change them:
This ensures that your job uses the settings you intend and that they are not overridden by
project-level pipelines.
+##### Avoid parent and child pipelines
+
+Compliance pipelines start on the run of _every_ pipeline in a relevant project. This means that if a pipeline in the relevant project
+triggers a child pipeline, the compliance pipeline runs first. This can trigger the parent pipeline, instead of the child pipeline.
+
+Therefore, in projects with compliance frameworks, we recommend replacing
+[parent-child pipelines](../../../ci/pipelines/parent_child_pipelines.md) with the following:
+
+- Direct [`include`](../../../ci/yaml/index.md#include) statements that provide the parent pipeline with child pipeline configuration.
+- Child pipelines placed in another project that are run using the [trigger API](../../../ci/triggers/) rather than the parent-child
+ pipeline feature.
+
+This alternative ensures the compliance pipeline does not re-start the parent pipeline.
+
### Sharing and permissions
For your repository, you can set up features such as public access, repository features,
diff --git a/doc/user/project/web_ide/index.md b/doc/user/project/web_ide/index.md
index 010a63b7957..71cf0c03549 100644
--- a/doc/user/project/web_ide/index.md
+++ b/doc/user/project/web_ide/index.md
@@ -26,7 +26,7 @@ and from merge requests:
1. Select **Edit in Web IDE** to open the editor.
- *When viewing a merge request* -
1. Go to your merge request, and select the **Overview** tab.
- 1. Scroll to the widgets area, after the merge request description.
+ 1. Scroll to the widgets section, after the merge request description.
1. Select **Edit in Web IDE** if it is visible.
1. If **Edit in Web IDE** is not visible:
1. Select the **(angle-down)** next to **Open in Gitpod**.
@@ -231,7 +231,7 @@ left.
> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/19318) in [GitLab Free](https://about.gitlab.com/pricing/) 11.0.
To switch between your authored and assigned merge requests, click the
-dropdown in the top of the sidebar to open a list of merge requests. You need to commit or discard all your changes before switching to a different merge
+dropdown in the top of the sidebar to open a list of merge requests. You must commit or discard all your changes before switching to a different merge
request.
## Switching branches
@@ -240,7 +240,7 @@ request.
To switch between branches of the current project repository, click the dropdown
in the top of the sidebar to open a list of branches.
-You need to commit or discard all your changes before switching to a
+You must commit or discard all your changes before switching to a
different branch.
## Markdown editing
@@ -324,7 +324,7 @@ An example `package.json`:
WARNING:
Interactive Web Terminals for the Web IDE is currently in **Beta**.
GitLab.com shared runners [do not yet support Interactive Web Terminals](https://gitlab.com/gitlab-org/gitlab/-/issues/24674),
-so you would need to use your own private runner to make use of this feature.
+so you must use your own private runner to make use of this feature.
[Interactive Web Terminals](../../../ci/interactive_web_terminal/index.md)
give the project [Maintainers](../../permissions.md#project-members-permissions)
@@ -333,14 +333,14 @@ GitLab, including through the Web IDE.
### Runner configuration
-Some things need to be configured in the runner for the interactive web terminal
+Some things must be configured in the runner for the interactive web terminal
to work:
- The runner needs to have
[`[session_server]` configured properly](https://docs.gitlab.com/runner/configuration/advanced-configuration.html#the-session_server-section).
This section requires at least a `session_timeout` value (which defaults to 1800
seconds) and a `listen_address` value. If `advertise_address` is not defined, `listen_address` is used.
-- If you are using a reverse proxy with your GitLab instance, web terminals need to be
+- If you are using a reverse proxy with your GitLab instance, web terminals must be
[enabled](../../../administration/integration/terminal.md#enabling-and-disabling-terminal-support). **(ULTIMATE SELF)**
If you have the terminal open and the job has finished with its tasks, the
@@ -355,7 +355,7 @@ The [File Sync](#file-syncing-to-web-terminal) feature is supported on Kubernete
### Web IDE configuration file
-In order to enable the Web IDE terminals you need to create the file
+To enable the Web IDE terminals you must create the file
`.gitlab/.gitlab-webide.yml` inside the repository's root. This
file is fairly similar to the [CI configuration file](../../../ci/yaml/index.md)
syntax but with some restrictions:
@@ -456,7 +456,7 @@ terminal:
```
- The `webide-file-sync` executable must start **after** the project
- directory is available. This is why we need to add `sleep 5` to the `command`.
+ directory is available. This is why we must add `sleep 5` to the `command`.
See [this issue](https://gitlab.com/gitlab-org/webide-file-sync/-/issues/7) for
more information.
- `$CI_PROJECT_DIR` is a
diff --git a/doc/user/project/wiki/index.md b/doc/user/project/wiki/index.md
index d0a1f485fa8..e2a8167b14c 100644
--- a/doc/user/project/wiki/index.md
+++ b/doc/user/project/wiki/index.md
@@ -13,8 +13,14 @@ in each GitLab project. Every wiki is a separate Git repository, so you can crea
wiki pages in the web interface, or [locally using Git](#create-or-edit-wiki-pages-locally).
To access the wiki for a project or group, go to the page for your project or group
-and, in the left sidebar, select **Wiki**. If **Wiki** is not listed in the
-left sidebar, a project administrator has [disabled it](#enable-or-disable-a-project-wiki).
+and either:
+
+- In the left sidebar, select **Wiki**.
+- On any page in the project, use the <kbd>g</kbd> + <kbd>w</kbd>
+ [wiki keyboard shortcut](../../shortcuts.md).
+
+If **Wiki** is not listed in the left sidebar of your project, a project administrator
+has [disabled it](#enable-or-disable-a-project-wiki).
GitLab wikis support Markdown, RDoc, AsciiDoc, and Org for content.
Wiki pages written in Markdown support all [Markdown features](../../markdown.md),
@@ -130,8 +136,9 @@ may not be able to check out the wiki locally afterward.
You need at least the [Developer role](../../permissions.md) to edit a wiki page:
1. Go to your project or group and select **Wiki**.
-1. Go to the page you want to edit.
-1. Select the edit icon (**{pencil}**).
+1. Go to the page you want to edit, and either:
+ - Use the <kbd>e</kbd> wiki [keyboard shortcut](../../shortcuts.md#wiki-pages).
+ - Select the edit icon (**{pencil}**).
1. Edit the content.
1. Select **Save changes**.
@@ -142,7 +149,7 @@ For an example, read [Table of contents](../../markdown.md#table-of-contents).
## Delete a wiki page
-You need at least the [Maintainer role](../../permissions.md) to delete a wiki page:
+You need at least the [Developer role](../../permissions.md) to delete a wiki page:
1. Go to your project or group and select **Wiki**.
1. Go to the page you want to delete.
@@ -355,3 +362,4 @@ For the status of the ongoing development for CommonMark and GitLab Flavored Mar
- [Project wikis API](../../../api/wikis.md)
- [Group repository storage moves API](../../../api/group_repository_storage_moves.md)
- [Group wikis API](../../../api/group_wikis.md)
+- [Wiki keyboard shortcuts](../../shortcuts.md#wiki-pages)
diff --git a/doc/user/project/working_with_projects.md b/doc/user/project/working_with_projects.md
index 32bb202767a..11b570f19e5 100644
--- a/doc/user/project/working_with_projects.md
+++ b/doc/user/project/working_with_projects.md
@@ -1,6 +1,6 @@
---
-stage: Create
-group: Source Code
+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/engineering/ux/technical-writing/#assignments"
---
@@ -165,7 +165,7 @@ To push a new project:
As project creation permissions can have many factors, contact your
GitLab administrator if you're unsure.
-1. If you want to push using SSH, ensure you have [created a SSH key](../../ssh/README.md) and
+1. If you want to push using SSH, ensure you have [created a SSH key](../../ssh/index.md) and
[added it to your GitLab account](../../ssh/index.md#add-an-ssh-key-to-your-gitlab-account).
1. Push with one of the following methods. Replace `gitlab.example.com` with the
domain name of the machine that hosts your Git repository, `namespace` with the name of
@@ -187,6 +187,12 @@ You can view your new project at `https://gitlab.example.com/namespace/myproject
Your project's visibility is set to **Private** by default, but you can change it
in your [project's settings](../../public_access/public_access.md#change-project-visibility)).
+This feature does not work for project paths that have previously been in use and
+[renamed](settings/index.md#renaming-a-repository). A redirect exists over the previous project path
+that causes push attempts to redirect requests to the renamed project location, instead of creating
+a new project. To create a new project, use the [Web UI](#create-a-project) or the
+[Projects API](../../api/projects.md#create-project).
+
## Fork a project
A fork is a copy of an original repository that you put in another namespace
diff --git a/doc/user/reserved_names.md b/doc/user/reserved_names.md
index bf9abcca640..203b1c9e93a 100644
--- a/doc/user/reserved_names.md
+++ b/doc/user/reserved_names.md
@@ -1,6 +1,6 @@
---
-stage: none
-group: unassigned
+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/engineering/ux/technical-writing/#assignments
---
diff --git a/doc/user/shortcuts.md b/doc/user/shortcuts.md
index 37e89dd54db..f46c5428248 100644
--- a/doc/user/shortcuts.md
+++ b/doc/user/shortcuts.md
@@ -39,7 +39,7 @@ These shortcuts are available in most areas of GitLab:
| <kbd>Shift</kbd> + <kbd>s</kbd> | Go to your Snippets page. |
| <kbd>s</kbd> / <kbd>/</kbd> | Put cursor in the search bar. |
| <kbd>Shift</kbd> + <kbd>i</kbd> | Go to your Issues page. |
-| <kbd>Shift</kbd> + <kbd>m</kbd> | Go to your Merge requests page.|
+| <kbd>Shift</kbd> + <kbd>m</kbd> | Go to your [Merge requests](project/merge_requests/index.md) page. |
| <kbd>Shift</kbd> + <kbd>t</kbd> | Go to your To-Do List page. |
| <kbd>p</kbd> + <kbd>b</kbd> | Show or hide the Performance Bar. |
| <kbd>g</kbd> + <kbd>x</kbd> | Toggle between [GitLab](https://gitlab.com/) and [GitLab Next](https://next.gitlab.com/) (GitLab SaaS only). |
@@ -77,17 +77,17 @@ relatively quickly to work, and they take you to another page in the project.
| <kbd>g</kbd> + <kbd>i</kbd> | Go to the project issues list (**Issues > List**). |
| <kbd>i</kbd> | Go to the New Issue page (**Issues**, select **New Issue** ). |
| <kbd>g</kbd> + <kbd>b</kbd> | Go to the project issue boards list (**Issues > Boards**). |
-| <kbd>g</kbd> + <kbd>m</kbd> | Go to the project merge requests list (**Merge Requests**). |
+| <kbd>g</kbd> + <kbd>m</kbd> | Go to the project [merge requests](project/merge_requests/index.md) list (**Merge Requests**). |
| <kbd>g</kbd> + <kbd>j</kbd> | Go to the CI/CD jobs list (**CI/CD > Jobs**). |
| <kbd>g</kbd> + <kbd>l</kbd> | Go to the project metrics (**Monitor > Metrics**). |
| <kbd>g</kbd> + <kbd>e</kbd> | Go to the project environments (**Deployments > Environments**). |
| <kbd>g</kbd> + <kbd>k</kbd> | Go to the project Kubernetes cluster integration page (**Infrastructure > Kubernetes clusters**). Note that you must have at least [`maintainer` permissions](permissions.md) to access this page. |
| <kbd>g</kbd> + <kbd>s</kbd> | Go to the project snippets list (**Snippets**). |
-| <kbd>g</kbd> + <kbd>w</kbd> | Go to the project wiki (**Wiki**), if enabled. |
+| <kbd>g</kbd> + <kbd>w</kbd> | Go to the [project wiki](project/wiki/index.md) (**Wiki**), if enabled. |
### Issues and merge requests
-These shortcuts are available when viewing issues and merge requests:
+These shortcuts are available when viewing issues and [merge requests](project/merge_requests/index.md):
| Keyboard shortcut | Description |
|------------------------------|-------------|
diff --git a/doc/user/todos.md b/doc/user/todos.md
index f0601db0300..9a985664ed1 100644
--- a/doc/user/todos.md
+++ b/doc/user/todos.md
@@ -7,8 +7,6 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# To-Do List **(FREE)**
-> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/2817) in GitLab 8.5.
-
Your *To-Do List* is a chronological list of items waiting for your input.
The items are known as *to-do items*.
@@ -67,8 +65,6 @@ You can manually add an item to your To-Do List.
## Create a to-do item by directly addressing someone
-> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/7926) in GitLab 9.0.
-
You can create a to-do item by directly addressing someone at the start of a line.
For example, in the following comment:
diff --git a/doc/user/usage_quotas.md b/doc/user/usage_quotas.md
index 07a5eda8cfb..5a48353c9d4 100644
--- a/doc/user/usage_quotas.md
+++ b/doc/user/usage_quotas.md
@@ -5,7 +5,7 @@ group: Utilization
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#designated-technical-writers
---
-# Storage usage quota **(FREE SAAS)**
+# Storage usage quota **(FREE)**
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/13294) in GitLab 12.0.
> - Moved to GitLab Free.
@@ -18,29 +18,27 @@ you must purchase additional storage. For more details, see [Excess storage usag
## View storage usage
-To help manage storage, a namespace's owner can view:
+You can view storage usage for your project or [namespace](../user/group/#namespaces).
-- Total storage used in the namespace
-- Total storage used per project
+1. Go to your project or namespace:
+ - For a project, on the top bar, select **Menu > Projects** and find your project.
+ - For a namespace, enter the URL in your browser's toolbar.
+1. From the left sidebar, select **Settings > Usage Quotas**.
+1. Select the **Storage** tab.
-To view storage usage, from the namespace's page go to **Settings > Usage Quotas** and select the
-**Storage** tab. The Usage Quotas statistics are updated every 90 minutes.
+The statistics are displayed. Select any title to view details. The information on this page
+is updated every 90 minutes.
-If your namespace shows `N/A` as the total storage usage, push a commit to any project in that
-namespace to trigger a recalculation.
-
-A stacked bar graph shows the proportional storage used for the namespace, including a total per
-storage item. Click on each project's title to see a breakdown per storage item.
+If your namespace shows `N/A`, push a commit to any project in the
+namespace to recalculate the storage.
## Storage usage statistics
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/247831) in GitLab 13.7.
-> - It's [deployed behind a feature flag](../user/feature_flags.md), enabled by default.
-> - It's enabled on GitLab SaaS.
-> - It's recommended for production use.
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/68898) project-level graph in GitLab 14.4 [with a flag](../administration/feature_flags.md) named `project_storage_ui`. Disabled by default.
+> - Enabled on GitLab.com in GitLab 14.4.
-WARNING:
-This feature might not be available to you. Check the **version history** note above for details.
+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 `project_storage_ui`. On GitLab.com, this feature is available.
The following storage usage statistics are available to an owner:
diff --git a/doc/user/workspace/index.md b/doc/user/workspace/index.md
index 2ce30c645d5..d75d91f087d 100644
--- a/doc/user/workspace/index.md
+++ b/doc/user/workspace/index.md
@@ -6,24 +6,33 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# Workspace
-Workspace will be above the [top-level namespaces](../group/index.md#namespaces) for you to manage everything you can do as a GitLab administrator, including:
+Workspace will be above the [top-level namespaces](../group/index.md#namespaces) for you to manage
+everything you do as a GitLab administrator, including:
- Defining and applying settings to all of your groups, subgroups, and projects.
- Aggregating data from all your groups, subgroups, and projects.
-The functionality in the [Admin Area](../admin_area/index.md) of self-managed installations will be split up and go to:
+Our goal is to reach feature parity between SaaS and self-managed installations, with all
+[Admin Area settings](/ee/user/admin_area/settings/) moving to either:
-1. Groups (available in the Workspace, Top-level group namespaces, and Sub-groups)
-1. Hardware Controls (for functionality that does not apply to groups)
-
-Our goal is to reach feature parity between SaaS and Self-Managed installations, with all [Admin Area settings](/ee/user/admin_area/settings/) moving to either:
-
-- Workspace (contains features relevant to both GitLab-managed and self-managed installations) with a dedicated Settings menu available within the left navigation bar.
-- Hardware controls (only contains features relative to Self-Managed installations, with one per installation).
+- Groups. Available in the Workspace, top-level group namespaces, and sub-groups.
+- 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.
NOTE:
Workspace is currently in development.
+## Demo: New hierarchy concept for groups and projects for epics
+
+The following demo introduces the new hierarchy concept for groups and projects for epics.
+
+<div class="video-fallback">
+ See the video: <a href="https://www.youtube.com/embed/fE74lsG_8yM">Consolidating groups and projects update (2021-08-23)</a>.
+</div>
+<figure class="video-container">
+ <iframe src="https://www.youtube.com/embed/fE74lsG_8yM" frameborder="0" allowfullscreen="true"> </iframe>
+</figure>
+
## Concept previews
The following provide a preview to the Workspace concept.
diff --git a/generator_templates/active_record/migration/create_table_migration.rb b/generator_templates/active_record/migration/create_table_migration.rb
index 7d52336cd4c..0b0cb05249c 100644
--- a/generator_templates/active_record/migration/create_table_migration.rb
+++ b/generator_templates/active_record/migration/create_table_migration.rb
@@ -3,9 +3,7 @@
# See https://docs.gitlab.com/ee/development/migration_style_guide.html
# for more information on how to write migrations for GitLab.
-class <%= migration_class_name %> < ActiveRecord::Migration[<%= ActiveRecord::Migration.current_version %>]
- include Gitlab::Database::MigrationHelpers
-
+class <%= migration_class_name %> < Gitlab::Database::Migration[<%= Gitlab::Database::Migration.current_version %>]
# When using the methods "add_concurrent_index" or "remove_concurrent_index"
# you must disable the use of transactions
# as these methods can not run in an existing transaction.
diff --git a/haml_lint/inline_javascript.rb b/haml_lint/inline_javascript.rb
index da6af92e82b..c87d77d7a4b 100644
--- a/haml_lint/inline_javascript.rb
+++ b/haml_lint/inline_javascript.rb
@@ -1,9 +1,9 @@
# frozen_string_literal: true
unless Rails.env.production?
- require_dependency 'haml_lint/haml_visitor'
- require_dependency 'haml_lint/linter'
- require_dependency 'haml_lint/linter_registry'
+ require 'haml_lint/haml_visitor'
+ require 'haml_lint/linter'
+ require 'haml_lint/linter_registry'
module HamlLint
class Linter::InlineJavaScript < Linter
diff --git a/jest.config.base.js b/jest.config.base.js
index 3ace87c49bc..7cf1136a073 100644
--- a/jest.config.base.js
+++ b/jest.config.base.js
@@ -102,7 +102,7 @@ module.exports = (path, options = {}) => {
return {
clearMocks: true,
testMatch,
- moduleFileExtensions: ['js', 'json', 'vue'],
+ moduleFileExtensions: ['js', 'json', 'vue', 'gql', 'graphql'],
moduleNameMapper,
collectCoverageFrom,
coverageDirectory: coverageDirectory(),
@@ -112,6 +112,7 @@ module.exports = (path, options = {}) => {
cacheDirectory: '<rootDir>/tmp/cache/jest',
modulePathIgnorePatterns: ['<rootDir>/.yarn-cache/'],
reporters,
+ resolver: './jest_resolver.js',
setupFilesAfterEnv: [`<rootDir>/${path}/test_setup.js`, 'jest-canvas-mock'],
restoreMocks: true,
transform: {
@@ -122,7 +123,7 @@ module.exports = (path, options = {}) => {
'^.+\\.(md|zip|png)$': 'jest-raw-loader',
},
transformIgnorePatterns: [
- 'node_modules/(?!(@gitlab/ui|@gitlab/favicon-overlay|bootstrap-vue|three|monaco-editor|monaco-yaml|fast-mersenne-twister|prosemirror-markdown)/)',
+ 'node_modules/(?!(@gitlab/ui|@gitlab/favicon-overlay|bootstrap-vue|three|monaco-editor|monaco-yaml|fast-mersenne-twister|prosemirror-markdown|dateformat)/)',
],
timers: 'fake',
testEnvironment: '<rootDir>/spec/frontend/environment.js',
diff --git a/jest_resolver.js b/jest_resolver.js
new file mode 100644
index 00000000000..6cbc1b9f18f
--- /dev/null
+++ b/jest_resolver.js
@@ -0,0 +1,17 @@
+const fs = require('fs');
+
+// Wrap jest default resolver to detect missing frontend fixtures.
+module.exports = (request, options) => {
+ try {
+ return options.defaultResolver(request, options);
+ } catch (e) {
+ if (request.match(/tmp\/tests\/frontend\/fixtures/) && !fs.existsSync(request)) {
+ console.error(
+ '\x1b[1m\x1b[41m\x1b[30m %s \x1b[0m %s',
+ '!',
+ `Fixture file ${request} does not exist. Did you run bin/rake frontend:fixtures?`,
+ );
+ }
+ throw e;
+ }
+};
diff --git a/lib/api/api.rb b/lib/api/api.rb
index d0d96858f61..a4d42c735cb 100644
--- a/lib/api/api.rb
+++ b/lib/api/api.rb
@@ -11,11 +11,12 @@ module API
COMMIT_ENDPOINT_REQUIREMENTS = NAMESPACE_OR_PROJECT_REQUIREMENTS.merge(sha: NO_SLASH_URL_PART_REGEX).freeze
USER_REQUIREMENTS = { user_id: NO_SLASH_URL_PART_REGEX }.freeze
LOG_FILTERS = ::Rails.application.config.filter_parameters + [/^output$/]
+ LOG_FORMATTER = Gitlab::GrapeLogging::Formatters::LogrageWithTimestamp.new
insert_before Grape::Middleware::Error,
GrapeLogging::Middleware::RequestLogger,
logger: Logger.new(LOG_FILENAME),
- formatter: Gitlab::GrapeLogging::Formatters::LogrageWithTimestamp.new,
+ formatter: LOG_FORMATTER,
include: [
GrapeLogging::Loggers::FilterParameters.new(LOG_FILTERS),
Gitlab::GrapeLogging::Loggers::ClientEnvLogger.new,
@@ -49,16 +50,19 @@ module API
before do
coerce_nil_params_to_array!
- api_endpoint = env['api.endpoint']
+ api_endpoint = request.env[Grape::Env::API_ENDPOINT]
feature_category = api_endpoint.options[:for].try(:feature_category_for_app, api_endpoint).to_s
+ # remote_ip is added here and the ContextLogger so that the
+ # client_id field is set correctly, as the user object does not
+ # survive between multiple context pushes.
Gitlab::ApplicationContext.push(
user: -> { @current_user },
project: -> { @project },
namespace: -> { @group },
runner: -> { @current_runner || @runner },
- caller_id: api_endpoint.endpoint_id,
remote_ip: request.ip,
+ caller_id: api_endpoint.endpoint_id,
feature_category: feature_category
)
end
@@ -124,6 +128,11 @@ module API
handle_api_exception(exception)
end
+ rescue_from RateLimitedService::RateLimitedError do |exception|
+ exception.log_request(context.request, context.current_user)
+ rack_response({ 'message' => { 'error' => exception.message } }.to_json, 429, exception.headers)
+ end
+
format :json
formatter :json, Gitlab::Json::GrapeFormatter
content_type :json, 'application/json'
@@ -132,6 +141,7 @@ module API
helpers ::API::Helpers
helpers ::API::Helpers::CommonHelpers
helpers ::API::Helpers::PerformanceBarHelpers
+ helpers ::API::Helpers::RateLimiter
namespace do
after do
@@ -157,6 +167,7 @@ module API
mount ::API::Ci::Jobs
mount ::API::Ci::Pipelines
mount ::API::Ci::PipelineSchedules
+ mount ::API::Ci::ResourceGroups
mount ::API::Ci::Runner
mount ::API::Ci::Runners
mount ::API::Ci::Triggers
@@ -170,9 +181,9 @@ module API
mount ::API::DeployTokens
mount ::API::Deployments
mount ::API::Environments
- mount ::API::ErrorTracking
- mount ::API::ErrorTrackingClientKeys
- mount ::API::ErrorTrackingCollector
+ mount ::API::ErrorTracking::ClientKeys
+ mount ::API::ErrorTracking::Collector
+ mount ::API::ErrorTracking::ProjectSettings
mount ::API::Events
mount ::API::FeatureFlags
mount ::API::FeatureFlagsUserLists
@@ -259,7 +270,7 @@ module API
mount ::API::ResourceAccessTokens
mount ::API::RubygemPackages
mount ::API::Search
- mount ::API::Services
+ mount ::API::Integrations
mount ::API::Settings
mount ::API::SidekiqMetrics
mount ::API::SnippetRepositoryStorageMoves
diff --git a/lib/api/base.rb b/lib/api/base.rb
index 33e47c18fcd..c245a65b30b 100644
--- a/lib/api/base.rb
+++ b/lib/api/base.rb
@@ -2,20 +2,33 @@
module API
class Base < Grape::API::Instance # rubocop:disable API/Base
- include ::Gitlab::WithFeatureCategory
+ include ::Gitlab::EndpointAttributes
class << self
def feature_category_for_app(app)
feature_category_for_action(path_for_app(app))
end
+ def urgency_for_app(app)
+ urgency_for_action(path_for_app(app))
+ end
+
def path_for_app(app)
normalize_path(app.namespace, app.options[:path].first)
end
+ def endpoint_id_for_route(route)
+ "#{route.request_method} #{route.origin}"
+ end
+
def route(methods, paths = ['/'], route_options = {}, &block)
+ actions = Array(paths).map { |path| normalize_path(namespace, path) }
if category = route_options.delete(:feature_category)
- feature_category(category, Array(paths).map { |path| normalize_path(namespace, path) })
+ feature_category(category, actions)
+ end
+
+ if target = route_options.delete(:urgency)
+ urgency(target, actions)
end
super
diff --git a/lib/api/bulk_imports.rb b/lib/api/bulk_imports.rb
index 0705a8285c1..c732da17166 100644
--- a/lib/api/bulk_imports.rb
+++ b/lib/api/bulk_imports.rb
@@ -51,7 +51,7 @@ module API
end
end
post do
- response = BulkImportService.new(
+ response = ::BulkImports::CreateService.new(
current_user,
params[:entities],
url: params[:configuration][:url],
diff --git a/lib/api/ci/helpers/runner.rb b/lib/api/ci/helpers/runner.rb
index b9662b822fb..dabb6c7ab3a 100644
--- a/lib/api/ci/helpers/runner.rb
+++ b/lib/api/ci/helpers/runner.rb
@@ -42,8 +42,7 @@ module API
token = params[:token]
if token
- ::Gitlab::Database::LoadBalancing::RackMiddleware
- .stick_or_unstick(env, :runner, token)
+ ::Ci::Runner.sticking.stick_or_unstick_request(env, :runner, token)
end
strong_memoize(:current_runner) do
@@ -80,8 +79,9 @@ module API
id = params[:id]
if id
- ::Gitlab::Database::LoadBalancing::RackMiddleware
- .stick_or_unstick(env, :build, id)
+ ::Ci::Build
+ .sticking
+ .stick_or_unstick_request(env, :build, id)
end
strong_memoize(:current_job) do
diff --git a/lib/api/ci/resource_groups.rb b/lib/api/ci/resource_groups.rb
new file mode 100644
index 00000000000..616bec499d4
--- /dev/null
+++ b/lib/api/ci/resource_groups.rb
@@ -0,0 +1,52 @@
+# frozen_string_literal: true
+
+module API
+ module Ci
+ class ResourceGroups < ::API::Base
+ before { authenticate! }
+
+ feature_category :continuous_delivery
+
+ params do
+ requires :id, type: String, desc: 'The ID of a project'
+ end
+ resource :projects, requirements: ::API::API::NAMESPACE_OR_PROJECT_REQUIREMENTS do
+ desc 'Get a single resource group' do
+ success Entities::Ci::ResourceGroup
+ end
+ params do
+ requires :key, type: String, desc: 'The key of the resource group'
+ end
+ get ':id/resource_groups/:key' do
+ authorize! :read_resource_group, resource_group
+
+ present resource_group, with: Entities::Ci::ResourceGroup
+ end
+
+ desc 'Edit a resource group' do
+ success Entities::Ci::ResourceGroup
+ end
+ params do
+ requires :key, type: String, desc: 'The key of the resource group'
+ optional :process_mode, type: String, desc: 'The process mode',
+ values: ::Ci::ResourceGroup.process_modes.keys
+ end
+ put ':id/resource_groups/:key' do
+ authorize! :update_resource_group, resource_group
+
+ if resource_group.update(declared_params(include_missing: false))
+ present resource_group, with: Entities::Ci::ResourceGroup
+ else
+ render_validation_error!(resource_group)
+ end
+ end
+ end
+
+ helpers do
+ def resource_group
+ @resource_group ||= user_project.resource_groups.find_by_key!(params[:key])
+ end
+ end
+ end
+ end
+end
diff --git a/lib/api/ci/runners.rb b/lib/api/ci/runners.rb
index 93a40925c21..ef712c84804 100644
--- a/lib/api/ci/runners.rb
+++ b/lib/api/ci/runners.rb
@@ -130,6 +130,20 @@ module API
present paginate(jobs), with: Entities::Ci::JobBasicWithProject
end
+
+ desc 'Reset runner authentication token' do
+ success Entities::Ci::ResetTokenResult
+ end
+ params do
+ requires :id, type: Integer, desc: 'The ID of the runner'
+ end
+ post ':id/reset_authentication_token' do
+ runner = get_runner(params[:id])
+ authenticate_update_runner!(runner)
+
+ runner.reset_token!
+ present runner.token, with: Entities::Ci::ResetTokenResult
+ end
end
params do
@@ -190,7 +204,7 @@ module API
not_found!('Runner') unless runner_project
runner = runner_project.runner
- forbidden!("Only one project associated with the runner. Please remove the runner instead") if runner.projects.count == 1
+ forbidden!("Only one project associated with the runner. Please remove the runner instead") if runner.runner_projects.count == 1
destroy_conditionally!(runner_project)
end
@@ -226,13 +240,13 @@ module API
before { authenticate_non_get! }
desc 'Resets runner registration token' do
- success Entities::Ci::ResetRegistrationTokenResult
+ success Entities::Ci::ResetTokenResult
end
post 'reset_registration_token' do
authorize! :update_runners_registration_token
ApplicationSetting.current.reset_runners_registration_token!
- present ApplicationSetting.current_without_cache.runners_registration_token, with: Entities::Ci::ResetRegistrationTokenResult
+ present ApplicationSetting.current_without_cache.runners_registration_token, with: Entities::Ci::ResetTokenResult
end
end
@@ -243,14 +257,14 @@ module API
before { authenticate_non_get! }
desc 'Resets runner registration token' do
- success Entities::Ci::ResetRegistrationTokenResult
+ success Entities::Ci::ResetTokenResult
end
post ':id/runners/reset_registration_token' do
project = find_project! user_project.id
authorize! :update_runners_registration_token, project
project.reset_runners_token!
- present project.runners_token, with: Entities::Ci::ResetRegistrationTokenResult
+ present project.runners_token, with: Entities::Ci::ResetTokenResult
end
end
@@ -261,14 +275,14 @@ module API
before { authenticate_non_get! }
desc 'Resets runner registration token' do
- success Entities::Ci::ResetRegistrationTokenResult
+ success Entities::Ci::ResetTokenResult
end
post ':id/runners/reset_registration_token' do
group = find_group! user_group.id
authorize! :update_runners_registration_token, group
group.reset_runners_token!
- present group.runners_token, with: Entities::Ci::ResetRegistrationTokenResult
+ present group.runners_token, with: Entities::Ci::ResetTokenResult
end
end
@@ -317,7 +331,7 @@ module API
def authenticate_delete_runner!(runner)
return if current_user.admin?
- forbidden!("Runner associated with more than one project") if runner.projects.count > 1
+ forbidden!("Runner associated with more than one project") if runner.runner_projects.count > 1
forbidden!("No access granted") unless can?(current_user, :delete_runner, runner)
end
diff --git a/lib/api/composer_packages.rb b/lib/api/composer_packages.rb
index 7b3750b37ee..94cad7e6c65 100644
--- a/lib/api/composer_packages.rb
+++ b/lib/api/composer_packages.rb
@@ -137,12 +137,12 @@ module API
bad_request!
end
- track_package_event('push_package', :composer, project: authorized_user_project, user: current_user, namespace: authorized_user_project.namespace)
-
::Packages::Composer::CreatePackageService
.new(authorized_user_project, current_user, declared_params.merge(build: current_authenticated_job))
.execute
+ track_package_event('push_package', :composer, project: authorized_user_project, user: current_user, namespace: authorized_user_project.namespace)
+
created!
end
diff --git a/lib/api/container_repositories.rb b/lib/api/container_repositories.rb
index c84527f26e7..9cd3e449687 100644
--- a/lib/api/container_repositories.rb
+++ b/lib/api/container_repositories.rb
@@ -3,6 +3,8 @@
module API
class ContainerRepositories < ::API::Base
include Gitlab::Utils::StrongMemoize
+ include ::API::Helpers::ContainerRegistryHelpers
+
helpers ::API::Helpers::PackagesHelpers
before { authenticate! }
diff --git a/lib/api/entities/basic_project_details.rb b/lib/api/entities/basic_project_details.rb
index 5c33af86b84..e96504db53e 100644
--- a/lib/api/entities/basic_project_details.rb
+++ b/lib/api/entities/basic_project_details.rb
@@ -39,11 +39,11 @@ module API
# rubocop: disable CodeReuse/ActiveRecord
def self.preload_relation(projects_relation, options = {})
# Preloading topics, should be done with using only `:topics`,
- # as `:topics` are defined as: `has_many :topics, through: :taggings`
+ # as `:topics` are defined as: `has_many :topics, through: :project_topics`
# N+1 is solved then by using `subject.topics.map(&:name)`
# MR describing the solution: https://gitlab.com/gitlab-org/gitlab-foss/merge_requests/20555
projects_relation.preload(:project_feature, :route)
- .preload(:import_state, :topics, :topics_acts_as_taggable)
+ .preload(:import_state, :topics)
.preload(:auto_devops)
.preload(namespace: [:route, :owner])
end
diff --git a/lib/api/entities/ci/reset_registration_token_result.rb b/lib/api/entities/ci/reset_registration_token_result.rb
deleted file mode 100644
index 23426432f68..00000000000
--- a/lib/api/entities/ci/reset_registration_token_result.rb
+++ /dev/null
@@ -1,11 +0,0 @@
-# frozen_string_literal: true
-
-module API
- module Entities
- module Ci
- class ResetRegistrationTokenResult < Grape::Entity
- expose(:token) {|object| object}
- end
- end
- end
-end
diff --git a/lib/api/entities/ci/reset_token_result.rb b/lib/api/entities/ci/reset_token_result.rb
new file mode 100644
index 00000000000..4dbf831582b
--- /dev/null
+++ b/lib/api/entities/ci/reset_token_result.rb
@@ -0,0 +1,11 @@
+# frozen_string_literal: true
+
+module API
+ module Entities
+ module Ci
+ class ResetTokenResult < Grape::Entity
+ expose(:token) {|object| object}
+ end
+ end
+ end
+end
diff --git a/lib/api/entities/ci/resource_group.rb b/lib/api/entities/ci/resource_group.rb
new file mode 100644
index 00000000000..0afadfa9e2a
--- /dev/null
+++ b/lib/api/entities/ci/resource_group.rb
@@ -0,0 +1,11 @@
+# frozen_string_literal: true
+
+module API
+ module Entities
+ module Ci
+ class ResourceGroup < Grape::Entity
+ expose :id, :key, :process_mode, :created_at, :updated_at
+ end
+ end
+ end
+end
diff --git a/lib/api/entities/clusters/agent_authorization.rb b/lib/api/entities/clusters/agent_authorization.rb
index 6c533fff105..7bbe0f1ec45 100644
--- a/lib/api/entities/clusters/agent_authorization.rb
+++ b/lib/api/entities/clusters/agent_authorization.rb
@@ -5,7 +5,7 @@ module API
module Clusters
class AgentAuthorization < Grape::Entity
expose :agent_id, as: :id
- expose :project, with: Entities::ProjectIdentity, as: :config_project
+ expose :config_project, with: Entities::ProjectIdentity
expose :config, as: :configuration
end
end
diff --git a/lib/api/entities/environment_basic.rb b/lib/api/entities/environment_basic.rb
index 061d4739874..d9894eac147 100644
--- a/lib/api/entities/environment_basic.rb
+++ b/lib/api/entities/environment_basic.rb
@@ -3,7 +3,7 @@
module API
module Entities
class EnvironmentBasic < Grape::Entity
- expose :id, :name, :slug, :external_url
+ expose :id, :name, :slug, :external_url, :created_at, :updated_at
end
end
end
diff --git a/lib/api/entities/feature_flag.rb b/lib/api/entities/feature_flag.rb
index f383eabd5dc..9dec3873504 100644
--- a/lib/api/entities/feature_flag.rb
+++ b/lib/api/entities/feature_flag.rb
@@ -9,7 +9,9 @@ module API
expose :version
expose :created_at
expose :updated_at
- expose :scopes, using: FeatureFlag::LegacyScope
+ expose :scopes do |_ff|
+ []
+ end
expose :strategies, using: FeatureFlag::Strategy
end
end
diff --git a/lib/api/entities/feature_flag/detailed_legacy_scope.rb b/lib/api/entities/feature_flag/detailed_legacy_scope.rb
deleted file mode 100644
index 47078c1dfde..00000000000
--- a/lib/api/entities/feature_flag/detailed_legacy_scope.rb
+++ /dev/null
@@ -1,11 +0,0 @@
-# frozen_string_literal: true
-
-module API
- module Entities
- class FeatureFlag < Grape::Entity
- class DetailedLegacyScope < LegacyScope
- expose :name
- end
- end
- end
-end
diff --git a/lib/api/entities/feature_flag/legacy_scope.rb b/lib/api/entities/feature_flag/legacy_scope.rb
deleted file mode 100644
index 7329f71c599..00000000000
--- a/lib/api/entities/feature_flag/legacy_scope.rb
+++ /dev/null
@@ -1,16 +0,0 @@
-# frozen_string_literal: true
-
-module API
- module Entities
- class FeatureFlag < Grape::Entity
- class LegacyScope < Grape::Entity
- expose :id
- expose :active
- expose :environment_scope
- expose :strategies
- expose :created_at
- expose :updated_at
- end
- end
- end
-end
diff --git a/lib/api/entities/group_detail.rb b/lib/api/entities/group_detail.rb
index 61f35d0f784..5eaccbc7154 100644
--- a/lib/api/entities/group_detail.rb
+++ b/lib/api/entities/group_detail.rb
@@ -16,7 +16,7 @@ module API
options: { only_owned: true, limit: projects_limit }
).execute
- Entities::Project.prepare_relation(projects)
+ Entities::Project.prepare_relation(projects, options)
end
expose :shared_projects, using: Entities::Project do |group, options|
@@ -26,7 +26,7 @@ module API
options: { only_shared: true, limit: projects_limit }
).execute
- Entities::Project.prepare_relation(projects)
+ Entities::Project.prepare_relation(projects, options)
end
def projects_limit
diff --git a/lib/api/entities/issuable_entity.rb b/lib/api/entities/issuable_entity.rb
index fd5d6c8137f..e2c674c0b8b 100644
--- a/lib/api/entities/issuable_entity.rb
+++ b/lib/api/entities/issuable_entity.rb
@@ -24,7 +24,7 @@ module API
# entity according to the current top-level entity options, such
# as the current_user.
def lazy_issuable_metadata
- BatchLoader.for(object).batch(key: [current_user, :issuable_metadata], replace_methods: false) do |models, loader, args|
+ BatchLoader.for(object).batch(key: [current_user, :issuable_metadata]) do |models, loader, args|
current_user = args[:key].first
issuable_metadata = Gitlab::IssuableMetadata.new(current_user, models)
diff --git a/lib/api/entities/namespace_basic.rb b/lib/api/entities/namespace_basic.rb
index f968a074bd2..2b9dd0b5f4d 100644
--- a/lib/api/entities/namespace_basic.rb
+++ b/lib/api/entities/namespace_basic.rb
@@ -6,7 +6,7 @@ module API
expose :id, :name, :path, :kind, :full_path, :parent_id, :avatar_url
expose :web_url do |namespace|
- if namespace.user?
+ if namespace.user_namespace?
Gitlab::Routing.url_helpers.user_url(namespace.owner)
else
namespace.web_url
diff --git a/lib/api/entities/project.rb b/lib/api/entities/project.rb
index b0e53ac3794..df0c1d7a4c5 100644
--- a/lib/api/entities/project.rb
+++ b/lib/api/entities/project.rb
@@ -132,7 +132,7 @@ module API
def self.preload_relation(projects_relation, options = {})
# Preloading topics, should be done with using only `:topics`,
- # as `:topics` are defined as: `has_many :topics, through: :taggings`
+ # as `:topics` are defined as: `has_many :topics, through: :project_topics`
# N+1 is solved then by using `subject.topics.map(&:name)`
# MR describing the solution: https://gitlab.com/gitlab-org/gitlab-foss/merge_requests/20555
super(projects_relation).preload(group: :namespace_settings)
@@ -144,7 +144,7 @@ module API
.preload(project_group_links: { group: :route },
fork_network: :root_project,
fork_network_member: :forked_from_project,
- forked_from_project: [:route, :topics, :topics_acts_as_taggable, :group, :project_feature, namespace: [:route, :owner]])
+ forked_from_project: [:route, :topics, :group, :project_feature, namespace: [:route, :owner]])
end
# rubocop: enable CodeReuse/ActiveRecord
diff --git a/lib/api/entities/user.rb b/lib/api/entities/user.rb
index 5c46233a639..ff711b4dec2 100644
--- a/lib/api/entities/user.rb
+++ b/lib/api/entities/user.rb
@@ -4,7 +4,7 @@ module API
module Entities
class User < UserBasic
include UsersHelper
- include ActionView::Helpers::SanitizeHelper
+ include TimeZoneHelper
expose :created_at, if: ->(user, opts) { Ability.allowed?(opts[:current_user], :read_user_profile, user) }
expose :bio, :location, :public_email, :skype, :linkedin, :twitter, :website_url, :organization, :job_title, :pronouns
@@ -18,11 +18,8 @@ module API
expose :following, if: ->(user, opts) { Ability.allowed?(opts[:current_user], :read_user_profile, user) } do |user|
user.followees.size
end
-
- # This is only for multi version compatibility reasons, as we removed user.bio_html
- # to be removed in 14.4
- expose :bio_html do |user|
- strip_tags(user.bio)
+ expose :local_time do |user|
+ local_time(user.timezone)
end
end
end
diff --git a/lib/api/error_tracking.rb b/lib/api/error_tracking.rb
deleted file mode 100644
index 369efe3bf8c..00000000000
--- a/lib/api/error_tracking.rb
+++ /dev/null
@@ -1,63 +0,0 @@
-# frozen_string_literal: true
-
-module API
- class ErrorTracking < ::API::Base
- before { authenticate! }
-
- feature_category :error_tracking
-
- helpers do
- def project_setting
- @project_setting ||= user_project.error_tracking_setting
- end
- end
-
- params do
- requires :id, type: String, desc: 'The ID of a project'
- end
-
- resource :projects, requirements: API::NAMESPACE_OR_PROJECT_REQUIREMENTS do
- before do
- authorize! :admin_operations, user_project
-
- not_found!('Error Tracking Setting') unless project_setting
- end
-
- desc 'Get error tracking settings for the project' do
- detail 'This feature was introduced in GitLab 12.7.'
- success Entities::ErrorTracking::ProjectSetting
- end
-
- get ':id/error_tracking/settings' do
- present project_setting, with: Entities::ErrorTracking::ProjectSetting
- end
-
- desc 'Enable or disable error tracking settings for the project' do
- detail 'This feature was introduced in GitLab 12.8.'
- success Entities::ErrorTracking::ProjectSetting
- end
- params do
- requires :active, type: Boolean, desc: 'Specifying whether to enable or disable error tracking settings', allow_blank: false
- optional :integrated, type: Boolean, desc: 'Specifying whether to enable or disable integrated error tracking'
- end
-
- patch ':id/error_tracking/settings/' do
- update_params = {
- error_tracking_setting_attributes: { enabled: params[:active] }
- }
-
- unless params[:integrated].nil?
- update_params[:error_tracking_setting_attributes][:integrated] = params[:integrated]
- end
-
- result = ::Projects::Operations::UpdateService.new(user_project, current_user, update_params).execute
-
- if result[:status] == :success
- present project_setting, with: Entities::ErrorTracking::ProjectSetting
- else
- result
- end
- end
- end
- end
-end
diff --git a/lib/api/error_tracking/client_keys.rb b/lib/api/error_tracking/client_keys.rb
new file mode 100644
index 00000000000..e97df03b6f0
--- /dev/null
+++ b/lib/api/error_tracking/client_keys.rb
@@ -0,0 +1,50 @@
+# frozen_string_literal: true
+
+module API
+ class ErrorTracking::ClientKeys < ::API::Base
+ before { authenticate! }
+
+ feature_category :error_tracking
+
+ params do
+ requires :id, type: String, desc: 'The ID of a project'
+ end
+
+ resource :projects, requirements: API::NAMESPACE_OR_PROJECT_REQUIREMENTS do
+ segment ':id/error_tracking' do
+ before do
+ authorize! :admin_operations, user_project
+ end
+
+ desc 'List all client keys' do
+ detail 'This feature was introduced in GitLab 14.3.'
+ success Entities::ErrorTracking::ClientKey
+ end
+ get '/client_keys' do
+ collection = user_project.error_tracking_client_keys
+
+ present paginate(collection), with: Entities::ErrorTracking::ClientKey
+ end
+
+ desc 'Create a client key' do
+ detail 'This feature was introduced in GitLab 14.3.'
+ success Entities::ErrorTracking::ClientKey
+ end
+ post '/client_keys' do
+ key = user_project.error_tracking_client_keys.create!
+
+ present key, with: Entities::ErrorTracking::ClientKey
+ end
+
+ desc 'Delete a client key' do
+ detail 'This feature was introduced in GitLab 14.3.'
+ success Entities::ErrorTracking::ClientKey
+ end
+ delete '/client_keys/:key_id' do
+ key = user_project.error_tracking_client_keys.find(params[:key_id])
+ key.destroy!
+ end
+ end
+ end
+ end
+end
diff --git a/lib/api/error_tracking/collector.rb b/lib/api/error_tracking/collector.rb
new file mode 100644
index 00000000000..22fbd3a1118
--- /dev/null
+++ b/lib/api/error_tracking/collector.rb
@@ -0,0 +1,135 @@
+# frozen_string_literal: true
+
+module API
+ # This API is responsible for collecting error tracking information
+ # from sentry client. It allows us to use GitLab as an alternative to
+ # sentry backend. For more details see https://gitlab.com/gitlab-org/gitlab/-/issues/329596.
+ class ErrorTracking::Collector < ::API::Base
+ feature_category :error_tracking
+
+ content_type :envelope, 'application/x-sentry-envelope'
+ content_type :json, 'application/json'
+ content_type :txt, 'text/plain'
+ default_format :envelope
+
+ before do
+ not_found!('Project') unless project
+ not_found! unless feature_enabled?
+ not_found! unless active_client_key?
+ end
+
+ helpers do
+ def project
+ @project ||= find_project(params[:id])
+ end
+
+ def feature_enabled?
+ project.error_tracking_setting&.enabled? &&
+ project.error_tracking_setting&.integrated_client?
+ end
+
+ def find_client_key(public_key)
+ return unless public_key.present?
+
+ project.error_tracking_client_keys.active.find_by_public_key(public_key)
+ end
+
+ def active_client_key?
+ public_key = extract_public_key
+
+ find_client_key(public_key)
+ end
+
+ def extract_public_key
+ # Some SDK send public_key as a param. In this case we don't need to parse headers.
+ return params[:sentry_key] if params[:sentry_key].present?
+
+ begin
+ ::ErrorTracking::Collector::SentryAuthParser.parse(request)[:public_key]
+ rescue StandardError
+ bad_request!('Failed to parse sentry request')
+ end
+ end
+ end
+
+ desc 'Submit error tracking event to the project as envelope' do
+ detail 'This feature was introduced in GitLab 14.1.'
+ end
+ params do
+ requires :id, type: String, desc: 'The ID of a project'
+ end
+ post 'error_tracking/collector/api/:id/envelope' do
+ # There is a reason why we have such uncommon path.
+ # We depend on a client side error tracking software which
+ # modifies URL for its own reasons.
+ #
+ # When we give user a URL like this
+ # HOST/api/v4/error_tracking/collector/123
+ #
+ # Then error tracking software will convert it like this:
+ # HOST/api/v4/error_tracking/collector/api/123/envelope/
+
+ begin
+ parsed_request = ::ErrorTracking::Collector::SentryRequestParser.parse(request)
+ rescue StandardError
+ bad_request!('Failed to parse sentry request')
+ end
+
+ type = parsed_request[:request_type]
+
+ # Sentry sends 2 requests on each exception: transaction and event.
+ # Everything else is not a desired behavior.
+ unless type == 'transaction' || type == 'event'
+ render_api_error!('400 Bad Request', 400)
+
+ break
+ end
+
+ # We don't have use for transaction request yet,
+ # so we record only event one.
+ if type == 'event'
+ ::ErrorTracking::CollectErrorService
+ .new(project, nil, event: parsed_request[:event])
+ .execute
+ end
+
+ # Collector should never return any information back.
+ # Because DSN and public key are designed for public use,
+ # it is safe only for submission of new events.
+ no_content!
+ end
+
+ desc 'Submit error tracking event to the project' do
+ detail 'This feature was introduced in GitLab 14.1.'
+ end
+ params do
+ requires :id, type: String, desc: 'The ID of a project'
+ end
+ post 'error_tracking/collector/api/:id/store' do
+ # There is a reason why we have such uncommon path.
+ # We depend on a client side error tracking software which
+ # modifies URL for its own reasons.
+ #
+ # When we give user a URL like this
+ # HOST/api/v4/error_tracking/collector/123
+ #
+ # Then error tracking software will convert it like this:
+ # HOST/api/v4/error_tracking/collector/api/123/store/
+
+ begin
+ parsed_body = Gitlab::Json.parse(request.body.read)
+ rescue StandardError
+ bad_request!('Failed to parse sentry request')
+ end
+
+ ::ErrorTracking::CollectErrorService
+ .new(project, nil, event: parsed_body)
+ .execute
+
+ # Collector should never return any information back.
+ # Because DSN and public key are designed for public use,
+ # it is safe only for submission of new events.
+ no_content!
+ end
+ end
+end
diff --git a/lib/api/error_tracking/project_settings.rb b/lib/api/error_tracking/project_settings.rb
new file mode 100644
index 00000000000..74432d1eaec
--- /dev/null
+++ b/lib/api/error_tracking/project_settings.rb
@@ -0,0 +1,63 @@
+# frozen_string_literal: true
+
+module API
+ class ErrorTracking::ProjectSettings < ::API::Base
+ before { authenticate! }
+
+ feature_category :error_tracking
+
+ helpers do
+ def project_setting
+ @project_setting ||= user_project.error_tracking_setting
+ end
+ end
+
+ params do
+ requires :id, type: String, desc: 'The ID of a project'
+ end
+
+ resource :projects, requirements: API::NAMESPACE_OR_PROJECT_REQUIREMENTS do
+ before do
+ authorize! :admin_operations, user_project
+
+ not_found!('Error Tracking Setting') unless project_setting
+ end
+
+ desc 'Get error tracking settings for the project' do
+ detail 'This feature was introduced in GitLab 12.7.'
+ success Entities::ErrorTracking::ProjectSetting
+ end
+
+ get ':id/error_tracking/settings' do
+ present project_setting, with: Entities::ErrorTracking::ProjectSetting
+ end
+
+ desc 'Enable or disable error tracking settings for the project' do
+ detail 'This feature was introduced in GitLab 12.8.'
+ success Entities::ErrorTracking::ProjectSetting
+ end
+ params do
+ requires :active, type: Boolean, desc: 'Specifying whether to enable or disable error tracking settings', allow_blank: false
+ optional :integrated, type: Boolean, desc: 'Specifying whether to enable or disable integrated error tracking'
+ end
+
+ patch ':id/error_tracking/settings/' do
+ update_params = {
+ error_tracking_setting_attributes: { enabled: params[:active] }
+ }
+
+ unless params[:integrated].nil?
+ update_params[:error_tracking_setting_attributes][:integrated] = params[:integrated]
+ end
+
+ result = ::Projects::Operations::UpdateService.new(user_project, current_user, update_params).execute
+
+ if result[:status] == :success
+ present project_setting, with: Entities::ErrorTracking::ProjectSetting
+ else
+ result
+ end
+ end
+ end
+ end
+end
diff --git a/lib/api/error_tracking_client_keys.rb b/lib/api/error_tracking_client_keys.rb
deleted file mode 100644
index eaa84b7186c..00000000000
--- a/lib/api/error_tracking_client_keys.rb
+++ /dev/null
@@ -1,50 +0,0 @@
-# frozen_string_literal: true
-
-module API
- class ErrorTrackingClientKeys < ::API::Base
- before { authenticate! }
-
- feature_category :error_tracking
-
- params do
- requires :id, type: String, desc: 'The ID of a project'
- end
-
- resource :projects, requirements: API::NAMESPACE_OR_PROJECT_REQUIREMENTS do
- segment ':id/error_tracking' do
- before do
- authorize! :admin_operations, user_project
- end
-
- desc 'List all client keys' do
- detail 'This feature was introduced in GitLab 14.3.'
- success Entities::ErrorTracking::ClientKey
- end
- get '/client_keys' do
- collection = user_project.error_tracking_client_keys
-
- present paginate(collection), with: Entities::ErrorTracking::ClientKey
- end
-
- desc 'Create a client key' do
- detail 'This feature was introduced in GitLab 14.3.'
- success Entities::ErrorTracking::ClientKey
- end
- post '/client_keys' do
- key = user_project.error_tracking_client_keys.create!
-
- present key, with: Entities::ErrorTracking::ClientKey
- end
-
- desc 'Delete a client key' do
- detail 'This feature was introduced in GitLab 14.3.'
- success Entities::ErrorTracking::ClientKey
- end
- delete '/client_keys/:key_id' do
- key = user_project.error_tracking_client_keys.find(params[:key_id])
- key.destroy!
- end
- end
- end
- end
-end
diff --git a/lib/api/error_tracking_collector.rb b/lib/api/error_tracking_collector.rb
deleted file mode 100644
index b1e0f6a858a..00000000000
--- a/lib/api/error_tracking_collector.rb
+++ /dev/null
@@ -1,135 +0,0 @@
-# frozen_string_literal: true
-
-module API
- # This API is responsible for collecting error tracking information
- # from sentry client. It allows us to use GitLab as an alternative to
- # sentry backend. For more details see https://gitlab.com/gitlab-org/gitlab/-/issues/329596.
- class ErrorTrackingCollector < ::API::Base
- feature_category :error_tracking
-
- content_type :envelope, 'application/x-sentry-envelope'
- content_type :json, 'application/json'
- content_type :txt, 'text/plain'
- default_format :envelope
-
- before do
- not_found!('Project') unless project
- not_found! unless feature_enabled?
- not_found! unless active_client_key?
- end
-
- helpers do
- def project
- @project ||= find_project(params[:id])
- end
-
- def feature_enabled?
- project.error_tracking_setting&.enabled? &&
- project.error_tracking_setting&.integrated_client?
- end
-
- def find_client_key(public_key)
- return unless public_key.present?
-
- project.error_tracking_client_keys.active.find_by_public_key(public_key)
- end
-
- def active_client_key?
- public_key = extract_public_key
-
- find_client_key(public_key)
- end
-
- def extract_public_key
- # Some SDK send public_key as a param. In this case we don't need to parse headers.
- return params[:sentry_key] if params[:sentry_key].present?
-
- begin
- ::ErrorTracking::Collector::SentryAuthParser.parse(request)[:public_key]
- rescue StandardError
- bad_request!('Failed to parse sentry request')
- end
- end
- end
-
- desc 'Submit error tracking event to the project as envelope' do
- detail 'This feature was introduced in GitLab 14.1.'
- end
- params do
- requires :id, type: String, desc: 'The ID of a project'
- end
- post 'error_tracking/collector/api/:id/envelope' do
- # There is a reason why we have such uncommon path.
- # We depend on a client side error tracking software which
- # modifies URL for its own reasons.
- #
- # When we give user a URL like this
- # HOST/api/v4/error_tracking/collector/123
- #
- # Then error tracking software will convert it like this:
- # HOST/api/v4/error_tracking/collector/api/123/envelope/
-
- begin
- parsed_request = ::ErrorTracking::Collector::SentryRequestParser.parse(request)
- rescue StandardError
- bad_request!('Failed to parse sentry request')
- end
-
- type = parsed_request[:request_type]
-
- # Sentry sends 2 requests on each exception: transaction and event.
- # Everything else is not a desired behavior.
- unless type == 'transaction' || type == 'event'
- render_api_error!('400 Bad Request', 400)
-
- break
- end
-
- # We don't have use for transaction request yet,
- # so we record only event one.
- if type == 'event'
- ::ErrorTracking::CollectErrorService
- .new(project, nil, event: parsed_request[:event])
- .execute
- end
-
- # Collector should never return any information back.
- # Because DSN and public key are designed for public use,
- # it is safe only for submission of new events.
- no_content!
- end
-
- desc 'Submit error tracking event to the project' do
- detail 'This feature was introduced in GitLab 14.1.'
- end
- params do
- requires :id, type: String, desc: 'The ID of a project'
- end
- post 'error_tracking/collector/api/:id/store' do
- # There is a reason why we have such uncommon path.
- # We depend on a client side error tracking software which
- # modifies URL for its own reasons.
- #
- # When we give user a URL like this
- # HOST/api/v4/error_tracking/collector/123
- #
- # Then error tracking software will convert it like this:
- # HOST/api/v4/error_tracking/collector/api/123/store/
-
- begin
- parsed_body = Gitlab::Json.parse(request.body.read)
- rescue StandardError
- bad_request!('Failed to parse sentry request')
- end
-
- ::ErrorTracking::CollectErrorService
- .new(project, nil, event: parsed_body)
- .execute
-
- # Collector should never return any information back.
- # Because DSN and public key are designed for public use,
- # it is safe only for submission of new events.
- no_content!
- end
- end
-end
diff --git a/lib/api/group_container_repositories.rb b/lib/api/group_container_repositories.rb
index 96175f31696..55e18fd1370 100644
--- a/lib/api/group_container_repositories.rb
+++ b/lib/api/group_container_repositories.rb
@@ -3,6 +3,7 @@
module API
class GroupContainerRepositories < ::API::Base
include PaginationParams
+ include ::API::Helpers::ContainerRegistryHelpers
helpers ::API::Helpers::PackagesHelpers
diff --git a/lib/api/group_export.rb b/lib/api/group_export.rb
index 7e4fdba6033..25cc4e53bd2 100644
--- a/lib/api/group_export.rb
+++ b/lib/api/group_export.rb
@@ -2,8 +2,6 @@
module API
class GroupExport < ::API::Base
- helpers Helpers::RateLimiter
-
before do
not_found! unless Feature.enabled?(:group_import_export, user_group, default_enabled: true)
diff --git a/lib/api/groups.rb b/lib/api/groups.rb
index a1123b6291b..680e3a6e994 100644
--- a/lib/api/groups.rb
+++ b/lib/api/groups.rb
@@ -92,7 +92,7 @@ module API
projects, options = with_custom_attributes(projects, options)
- present options[:with].prepare_relation(projects), options
+ present options[:with].prepare_relation(projects, options), options
end
def present_groups(params, groups)
diff --git a/lib/api/helm_packages.rb b/lib/api/helm_packages.rb
index 8a7e84c9f87..4278d17e003 100644
--- a/lib/api/helm_packages.rb
+++ b/lib/api/helm_packages.rb
@@ -11,7 +11,8 @@ module API
feature_category :package_registry
PACKAGE_FILENAME = 'package.tgz'
- FILE_NAME_REQUIREMENTS = {
+ HELM_REQUIREMENTS = {
+ channel: API::NO_SLASH_URL_PART_REGEX,
file_name: API::NO_SLASH_URL_PART_REGEX
}.freeze
@@ -33,7 +34,7 @@ module API
requires :id, type: String, desc: 'The ID or full path of a project'
end
resource :projects, requirements: API::NAMESPACE_OR_PROJECT_REQUIREMENTS do
- namespace ':id/packages/helm' do
+ namespace ':id/packages/helm', requirements: HELM_REQUIREMENTS do
desc 'Download a chart index' do
detail 'This feature was introduced in GitLab 14.0'
end
@@ -58,7 +59,7 @@ module API
requires :channel, type: String, desc: 'Helm channel', regexp: Gitlab::Regex.helm_channel_regex
requires :file_name, type: String, desc: 'Helm package file name'
end
- get ":channel/charts/:file_name.tgz", requirements: FILE_NAME_REQUIREMENTS do
+ get ":channel/charts/:file_name.tgz" do
authorize_read_package!(authorized_user_project)
package_file = Packages::Helm::PackageFilesFinder.new(authorized_user_project, params[:channel], file_name: "#{params[:file_name]}.tgz").most_recent!
diff --git a/lib/api/helpers.rb b/lib/api/helpers.rb
index 9c347148fd0..f9ba5ba8186 100644
--- a/lib/api/helpers.rb
+++ b/lib/api/helpers.rb
@@ -75,8 +75,9 @@ module API
save_current_user_in_env(@current_user) if @current_user
if @current_user
- ::Gitlab::Database::LoadBalancing::RackMiddleware
- .stick_or_unstick(env, :user, @current_user.id)
+ ::ApplicationRecord
+ .sticking
+ .stick_or_unstick_request(env, :user, @current_user.id)
end
@current_user
@@ -429,8 +430,8 @@ module API
render_api_error!('406 Not Acceptable', 406)
end
- def service_unavailable!
- render_api_error!('503 Service Unavailable', 503)
+ def service_unavailable!(message = nil)
+ render_api_error!(message || '503 Service Unavailable', 503)
end
def conflict!(message = nil)
@@ -624,6 +625,12 @@ module API
{}
end
+ def validate_anonymous_search_access!
+ return if current_user.present? || Feature.disabled?(:disable_anonymous_search, type: :ops)
+
+ unprocessable_entity!('User must be authenticated to use search')
+ end
+
private
# rubocop:disable Gitlab/ModuleWithInstanceVariables
diff --git a/lib/api/helpers/common_helpers.rb b/lib/api/helpers/common_helpers.rb
index 02942820982..855648f2ef0 100644
--- a/lib/api/helpers/common_helpers.rb
+++ b/lib/api/helpers/common_helpers.rb
@@ -34,7 +34,7 @@ module API
end
def endpoint_id
- "#{request.request_method} #{route.origin}"
+ ::API::Base.endpoint_id_for_route(route)
end
end
end
diff --git a/lib/api/helpers/container_registry_helpers.rb b/lib/api/helpers/container_registry_helpers.rb
new file mode 100644
index 00000000000..9c844e364eb
--- /dev/null
+++ b/lib/api/helpers/container_registry_helpers.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+module API
+ module Helpers
+ module ContainerRegistryHelpers
+ extend ActiveSupport::Concern
+
+ included do
+ rescue_from Faraday::Error, ContainerRegistry::Path::InvalidRegistryPathError do |e|
+ service_unavailable!('We are having trouble connecting to the Container Registry. If this error persists, please review the troubleshooting documentation.')
+ end
+ end
+ end
+ end
+end
diff --git a/lib/api/helpers/integrations_helpers.rb b/lib/api/helpers/integrations_helpers.rb
index 06539772568..e0ef9099104 100644
--- a/lib/api/helpers/integrations_helpers.rb
+++ b/lib/api/helpers/integrations_helpers.rb
@@ -2,7 +2,7 @@
module API
module Helpers
- # Helpers module for API::Services
+ # Helpers module for API::Integrations
#
# The data structures inside this model are returned using class methods,
# allowing EE to extend them where necessary.
@@ -340,7 +340,7 @@ module API
required: true,
name: :webhook,
type: String,
- desc: 'Discord webhook. e.g. https://discordapp.com/api/webhooks/…'
+ desc: 'Discord webhook. For example, https://discord.com/api/webhooks/…'
}
],
'drone-ci' => [
diff --git a/lib/api/integrations.rb b/lib/api/integrations.rb
new file mode 100644
index 00000000000..926cde340a0
--- /dev/null
+++ b/lib/api/integrations.rb
@@ -0,0 +1,178 @@
+# frozen_string_literal: true
+module API
+ class Integrations < ::API::Base
+ feature_category :integrations
+
+ integrations = Helpers::IntegrationsHelpers.integrations
+ integration_classes = Helpers::IntegrationsHelpers.integration_classes
+
+ if Rails.env.development?
+ integrations['mock-ci'] = [
+ {
+ required: true,
+ name: :mock_service_url,
+ type: String,
+ desc: 'URL to the mock integration'
+ }
+ ]
+ integrations['mock-deployment'] = []
+ integrations['mock-monitoring'] = []
+
+ integration_classes += Helpers::IntegrationsHelpers.development_integration_classes
+ end
+
+ INTEGRATIONS = integrations.freeze
+
+ integration_classes.each do |integration|
+ event_names = integration.try(:event_names) || next
+ event_names.each do |event_name|
+ INTEGRATIONS[integration.to_param.tr("_", "-")] << {
+ required: false,
+ name: event_name.to_sym,
+ type: String,
+ desc: IntegrationsHelper.integration_event_description(integration, event_name)
+ }
+ end
+ end
+
+ TRIGGER_INTEGRATIONS = {
+ 'mattermost-slash-commands' => [
+ {
+ name: :token,
+ type: String,
+ desc: 'The Mattermost token'
+ }
+ ],
+ 'slack-slash-commands' => [
+ {
+ name: :token,
+ type: String,
+ desc: 'The Slack token'
+ }
+ ]
+ }.freeze
+
+ helpers do
+ def integration_attributes(integration)
+ integration.fields.inject([]) do |arr, hash|
+ arr << hash[:name].to_sym
+ end
+ end
+ end
+
+ # The API officially documents only the `:id/integrations` API paths.
+ # We support the older `id:/services` path for backwards-compatibility in API V4.
+ # The support for `:id/services` can be dropped if we create an API V5.
+ [':id/services', ':id/integrations'].each do |path|
+ params do
+ requires :id, type: String, desc: 'The ID of a project'
+ end
+ resource :projects, requirements: API::NAMESPACE_OR_PROJECT_REQUIREMENTS do
+ before { authenticate! }
+ before { authorize_admin_project }
+
+ desc 'Get all active project integrations' do
+ success Entities::ProjectIntegrationBasic
+ end
+ get path do
+ integrations = user_project.integrations.active
+
+ present integrations, with: Entities::ProjectIntegrationBasic
+ end
+
+ INTEGRATIONS.each do |slug, settings|
+ desc "Set #{slug} integration for project"
+ params do
+ settings.each do |setting|
+ if setting[:required]
+ requires setting[:name], type: setting[:type], desc: setting[:desc]
+ else
+ optional setting[:name], type: setting[:type], desc: setting[:desc]
+ end
+ end
+ end
+ put "#{path}/#{slug}" do
+ integration = user_project.find_or_initialize_integration(slug.underscore)
+ params = declared_params(include_missing: false).merge(active: true)
+
+ if integration.update(params)
+ present integration, with: Entities::ProjectIntegration
+ else
+ render_api_error!('400 Bad Request', 400)
+ end
+ end
+ end
+
+ desc "Delete an integration from a project"
+ params do
+ requires :slug, type: String, values: INTEGRATIONS.keys, desc: 'The name of the integration'
+ end
+ delete "#{path}/:slug" do
+ integration = user_project.find_or_initialize_integration(params[:slug].underscore)
+
+ destroy_conditionally!(integration) do
+ attrs = integration_attributes(integration).index_with { nil }.merge(active: false)
+
+ render_api_error!('400 Bad Request', 400) unless integration.update(attrs)
+ end
+ end
+
+ desc 'Get the integration settings for a project' do
+ success Entities::ProjectIntegration
+ end
+ params do
+ requires :slug, type: String, values: INTEGRATIONS.keys, desc: 'The name of the integration'
+ end
+ get "#{path}/:slug" do
+ integration = user_project.find_or_initialize_integration(params[:slug].underscore)
+
+ not_found!('Integration') unless integration&.persisted?
+
+ present integration, with: Entities::ProjectIntegration
+ end
+ end
+
+ TRIGGER_INTEGRATIONS.each do |integration_slug, settings|
+ helpers do
+ def slash_command_integration(project, integration_slug, params)
+ project.integrations.active.find do |integration|
+ integration.try(:token) == params[:token] && integration.to_param == integration_slug.underscore
+ end
+ end
+ end
+
+ params do
+ requires :id, type: String, desc: 'The ID of a project'
+ end
+ resource :projects, requirements: API::NAMESPACE_OR_PROJECT_REQUIREMENTS do
+ desc "Trigger a slash command for #{integration_slug}" do
+ detail 'Added in GitLab 8.13'
+ end
+ params do
+ settings.each do |setting|
+ requires setting[:name], type: setting[:type], desc: setting[:desc]
+ end
+ end
+ post "#{path}/#{integration_slug.underscore}/trigger" do
+ project = find_project(params[:id])
+
+ # This is not accurate, but done to prevent leakage of the project names
+ not_found!('Integration') unless project
+
+ integration = slash_command_integration(project, integration_slug, params)
+ result = integration.try(:trigger, params)
+
+ if result
+ status result[:status] || 200
+ present result
+ else
+ not_found!('Integration')
+ end
+ end
+ end
+ end
+ end
+ end
+end
+
+API::Integrations.prepend_mod_with('API::Integrations')
diff --git a/lib/api/internal/base.rb b/lib/api/internal/base.rb
index d740c626557..dc9257ebd62 100644
--- a/lib/api/internal/base.rb
+++ b/lib/api/internal/base.rb
@@ -164,7 +164,7 @@ module API
#
# Check whether an SSH key is known to GitLab
#
- get '/authorized_keys', feature_category: :source_code_management do
+ get '/authorized_keys', feature_category: :source_code_management, urgency: :high do
fingerprint = Gitlab::InsecureKeyFingerprint.new(params.fetch(:key)).fingerprint_sha256
key = Key.find_by_fingerprint_sha256(fingerprint)
diff --git a/lib/api/internal/kubernetes.rb b/lib/api/internal/kubernetes.rb
index d1ad3c1feb1..f3974236fe3 100644
--- a/lib/api/internal/kubernetes.rb
+++ b/lib/api/internal/kubernetes.rb
@@ -79,25 +79,6 @@ module API
gitaly_repository: gitaly_repository(project)
}
end
-
- desc 'Gets project info' do
- detail 'Retrieves project info (if authorized)'
- end
- route_setting :authentication, cluster_agent_token_allowed: true
- get '/project_info' do
- project = find_project(params[:id])
-
- unless Guest.can?(:download_code, project) || agent.has_access_to?(project)
- not_found!
- end
-
- status 200
- {
- project_id: project.id,
- gitaly_info: gitaly_info(project),
- gitaly_repository: gitaly_repository(project)
- }
- end
end
namespace 'kubernetes/agent_configuration' do
diff --git a/lib/api/issues.rb b/lib/api/issues.rb
index 39ce6e0b062..43e83bd58fe 100644
--- a/lib/api/issues.rb
+++ b/lib/api/issues.rb
@@ -4,7 +4,6 @@ module API
class Issues < ::API::Base
include PaginationParams
helpers Helpers::IssuesHelpers
- helpers Helpers::RateLimiter
before { authenticate_non_get! }
@@ -114,6 +113,7 @@ module API
end
get '/issues_statistics' do
authenticate! unless params[:scope] == 'all'
+ validate_anonymous_search_access! if params[:search].present?
present issues_statistics, with: Grape::Presenters::Presenter
end
@@ -131,6 +131,7 @@ module API
end
get do
authenticate! unless params[:scope] == 'all'
+ validate_anonymous_search_access! if params[:search].present?
issues = paginate(find_issues)
options = {
@@ -169,6 +170,7 @@ module API
optional :non_archived, type: Boolean, desc: 'Return issues from non archived projects', default: true
end
get ":id/issues" do
+ validate_anonymous_search_access! if declared_params[:search].present?
issues = paginate(find_issues(group_id: user_group.id, include_subgroups: true))
options = {
@@ -187,6 +189,8 @@ module API
use :issues_stats_params
end
get ":id/issues_statistics" do
+ validate_anonymous_search_access! if declared_params[:search].present?
+
present issues_statistics(group_id: user_group.id, include_subgroups: true), with: Grape::Presenters::Presenter
end
end
@@ -204,6 +208,7 @@ module API
use :issues_params
end
get ":id/issues" do
+ validate_anonymous_search_access! if declared_params[:search].present?
issues = paginate(find_issues(project_id: user_project.id))
options = {
@@ -222,6 +227,8 @@ module API
use :issues_stats_params
end
get ":id/issues_statistics" do
+ validate_anonymous_search_access! if declared_params[:search].present?
+
present issues_statistics(project_id: user_project.id), with: Grape::Presenters::Presenter
end
@@ -255,7 +262,7 @@ module API
post ':id/issues' do
Gitlab::QueryLimiting.disable!('https://gitlab.com/gitlab-org/gitlab/-/issues/21140')
- check_rate_limit! :issues_create, [current_user]
+ check_rate_limit! :issues_create, [current_user] if Feature.disabled?("rate_limited_service_issues_create", user_project, default_enabled: :yaml)
authorize! :create_issue, user_project
@@ -375,6 +382,34 @@ module API
end
# rubocop: enable CodeReuse/ActiveRecord
+ desc 'Clone an existing issue' do
+ success Entities::Issue
+ end
+ params do
+ requires :issue_iid, type: Integer, desc: 'The internal ID of a project issue'
+ requires :to_project_id, type: Integer, desc: 'The ID of the new project'
+ optional :with_notes, type: Boolean, desc: 'Clone issue with notes', default: false
+ end
+ # rubocop: disable CodeReuse/ActiveRecord
+ post ':id/issues/:issue_iid/clone' do
+ Gitlab::QueryLimiting.disable!('https://gitlab.com/gitlab-org/gitlab/-/issues/340252')
+
+ issue = user_project.issues.find_by(iid: params[:issue_iid])
+ not_found!('Issue') unless issue
+
+ target_project = Project.find_by(id: params[:to_project_id])
+ not_found!('Project') unless target_project
+
+ begin
+ issue = ::Issues::CloneService.new(project: user_project, current_user: current_user)
+ .execute(issue, target_project, with_notes: params[:with_notes])
+ present issue, with: Entities::Issue, current_user: current_user, project: target_project
+ rescue ::Issues::CloneService::CloneError => error
+ render_api_error!(error.message, 400)
+ end
+ end
+ # rubocop: enable CodeReuse/ActiveRecord
+
desc 'Delete a project issue'
params do
requires :issue_iid, type: Integer, desc: 'The internal ID of a project issue'
diff --git a/lib/api/maven_packages.rb b/lib/api/maven_packages.rb
index 9e5705abe88..5245cd10564 100644
--- a/lib/api/maven_packages.rb
+++ b/lib/api/maven_packages.rb
@@ -264,8 +264,6 @@ module API
when 'md5'
''
else
- track_package_event('push_package', :maven, user: current_user, project: user_project, namespace: user_project.namespace) if jar_file?(format)
-
file_params = {
file: params[:file],
size: params['file.size'],
@@ -276,6 +274,7 @@ module API
}
::Packages::CreatePackageFileService.new(package, file_params.merge(build: current_authenticated_job)).execute
+ track_package_event('push_package', :maven, user: current_user, project: user_project, namespace: user_project.namespace) if jar_file?(format)
end
end
end
diff --git a/lib/api/merge_requests.rb b/lib/api/merge_requests.rb
index 34af9eab511..21c1b7969aa 100644
--- a/lib/api/merge_requests.rb
+++ b/lib/api/merge_requests.rb
@@ -136,6 +136,7 @@ module API
end
get feature_category: :code_review do
authenticate! unless params[:scope] == 'all'
+ validate_anonymous_search_access! if params[:search].present?
merge_requests = find_merge_requests
present merge_requests, serializer_options_for(merge_requests)
@@ -155,6 +156,7 @@ module API
default: true
end
get ":id/merge_requests", feature_category: :code_review do
+ validate_anonymous_search_access! 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)
@@ -195,6 +197,7 @@ module API
end
get ":id/merge_requests", feature_category: :code_review do
authorize! :read_merge_request, user_project
+ validate_anonymous_search_access! if declared_params[:search].present?
merge_requests = find_merge_requests(project_id: user_project.id)
diff --git a/lib/api/notes.rb b/lib/api/notes.rb
index 418efe3d1a7..656eaa2b2bb 100644
--- a/lib/api/notes.rb
+++ b/lib/api/notes.rb
@@ -4,7 +4,6 @@ module API
class Notes < ::API::Base
include PaginationParams
helpers ::API::Helpers::NotesHelpers
- helpers Helpers::RateLimiter
before { authenticate! }
@@ -88,7 +87,7 @@ module API
note = create_note(noteable, opts)
- if note.errors.keys == [:commands_only]
+ if note.errors.attribute_names == [:commands_only]
status 202
present note, with: Entities::NoteCommands
elsif note.valid?
diff --git a/lib/api/project_container_repositories.rb b/lib/api/project_container_repositories.rb
index 28cfa9e3ae0..82b6082c3fe 100644
--- a/lib/api/project_container_repositories.rb
+++ b/lib/api/project_container_repositories.rb
@@ -3,6 +3,8 @@
module API
class ProjectContainerRepositories < ::API::Base
include PaginationParams
+ include ::API::Helpers::ContainerRegistryHelpers
+
helpers ::API::Helpers::PackagesHelpers
REPOSITORY_ENDPOINT_REQUIREMENTS = API::NAMESPACE_OR_PROJECT_REQUIREMENTS.merge(
diff --git a/lib/api/project_export.rb b/lib/api/project_export.rb
index 4041e130f9e..e01c195dbc4 100644
--- a/lib/api/project_export.rb
+++ b/lib/api/project_export.rb
@@ -2,8 +2,6 @@
module API
class ProjectExport < ::API::Base
- helpers Helpers::RateLimiter
-
feature_category :importers
before do
@@ -74,6 +72,52 @@ module API
accepted!
end
+
+ resource do
+ before do
+ not_found! unless ::Feature.enabled?(:bulk_import, default_enabled: :yaml)
+ end
+
+ desc 'Start relations export' do
+ detail 'This feature was introduced in GitLab 14.4'
+ end
+ post ':id/export_relations' do
+ response = ::BulkImports::ExportService.new(portable: user_project, user: current_user).execute
+
+ if response.success?
+ accepted!
+ else
+ render_api_error!(message: 'Project relations export could not be started.')
+ end
+ end
+
+ desc 'Download relations export' do
+ detail 'This feature was introduced in GitLab 14.4'
+ end
+ params do
+ requires :relation,
+ type: String,
+ project_portable: true,
+ desc: 'Project relation name'
+ end
+ get ':id/export_relations/download' do
+ export = user_project.bulk_import_exports.find_by_relation(params[:relation])
+ file = export&.upload&.export_file
+
+ if file
+ present_carrierwave_file!(file)
+ else
+ render_api_error!('404 Not found', 404)
+ end
+ end
+
+ desc 'Relations export status' do
+ detail 'This feature was introduced in GitLab 14.4'
+ end
+ get ':id/export_relations/status' do
+ present user_project.bulk_import_exports, with: Entities::BulkImports::ExportStatus
+ end
+ end
end
end
end
diff --git a/lib/api/project_import.rb b/lib/api/project_import.rb
index 039f7b4be41..d43184ff75d 100644
--- a/lib/api/project_import.rb
+++ b/lib/api/project_import.rb
@@ -6,7 +6,6 @@ module API
helpers Helpers::ProjectsHelpers
helpers Helpers::FileUploadHelpers
- helpers Helpers::RateLimiter
feature_category :importers
diff --git a/lib/api/projects.rb b/lib/api/projects.rb
index 34e0b528ced..e8a48d6c9f4 100644
--- a/lib/api/projects.rb
+++ b/lib/api/projects.rb
@@ -182,8 +182,6 @@ module API
[options[:with].prepare_relation(projects, options), options]
end
- Preloaders::UserMaxAccessLevelInProjectsPreloader.new(records, current_user).execute if current_user
-
present records, options
end
@@ -658,10 +656,7 @@ module API
users = DeclarativePolicy.subject_scope { user_project.team.users }
users = users.search(params[:search]) if params[:search].present?
users = users.where_not_in(params[:skip_users]) if params[:skip_users].present?
-
- if Feature.enabled?(:sort_by_project_users_by_project_authorizations_user_id, user_project, default_enabled: :yaml)
- users = users.order('project_authorizations.user_id' => :asc) # rubocop: disable CodeReuse/ActiveRecord
- end
+ users = users.order('project_authorizations.user_id' => :asc) # rubocop: disable CodeReuse/ActiveRecord
present paginate(users), with: Entities::UserBasic
end
diff --git a/lib/api/projects_relation_builder.rb b/lib/api/projects_relation_builder.rb
index db46602cd90..a4bd06aec10 100644
--- a/lib/api/projects_relation_builder.rb
+++ b/lib/api/projects_relation_builder.rb
@@ -12,6 +12,8 @@ module API
preload_repository_cache(projects_relation)
+ Preloaders::UserMaxAccessLevelInProjectsPreloader.new(projects_relation, options[:current_user]).execute if options[:current_user]
+
projects_relation
end
diff --git a/lib/api/repositories.rb b/lib/api/repositories.rb
index 3c9255e3117..1aa76906b3d 100644
--- a/lib/api/repositories.rb
+++ b/lib/api/repositories.rb
@@ -101,6 +101,7 @@ module API
params do
optional :sha, type: String, desc: 'The commit sha of the archive to be downloaded'
optional :format, type: String, desc: 'The archive format'
+ optional :path, type: String, desc: 'Subfolder of the repository to be downloaded'
end
get ':id/repository/archive', requirements: { format: Gitlab::PathRegex.archive_formats_regex } do
if archive_rate_limit_reached?(current_user, user_project)
@@ -109,7 +110,7 @@ module API
not_acceptable! if Gitlab::HotlinkingDetector.intercept_hotlinking?(request)
- send_git_archive user_project.repository, ref: params[:sha], format: params[:format], append_sha: true
+ send_git_archive user_project.repository, ref: params[:sha], format: params[:format], append_sha: true, path: params[:path]
rescue StandardError
not_found!('File')
end
diff --git a/lib/api/services.rb b/lib/api/services.rb
deleted file mode 100644
index a37b6f4626a..00000000000
--- a/lib/api/services.rb
+++ /dev/null
@@ -1,173 +0,0 @@
-# frozen_string_literal: true
-module API
- class Services < ::API::Base
- feature_category :integrations
-
- integrations = Helpers::IntegrationsHelpers.integrations
- integration_classes = Helpers::IntegrationsHelpers.integration_classes
-
- if Rails.env.development?
- integrations['mock-ci'] = [
- {
- required: true,
- name: :mock_service_url,
- type: String,
- desc: 'URL to the mock service'
- }
- ]
- integrations['mock-deployment'] = []
- integrations['mock-monitoring'] = []
-
- integration_classes += Helpers::IntegrationsHelpers.development_integration_classes
- end
-
- INTEGRATIONS = integrations.freeze
-
- integration_classes.each do |integration|
- event_names = integration.try(:event_names) || next
- event_names.each do |event_name|
- INTEGRATIONS[integration.to_param.tr("_", "-")] << {
- required: false,
- name: event_name.to_sym,
- type: String,
- desc: IntegrationsHelper.integration_event_description(integration, event_name)
- }
- end
- end
-
- TRIGGER_INTEGRATIONS = {
- 'mattermost-slash-commands' => [
- {
- name: :token,
- type: String,
- desc: 'The Mattermost token'
- }
- ],
- 'slack-slash-commands' => [
- {
- name: :token,
- type: String,
- desc: 'The Slack token'
- }
- ]
- }.freeze
-
- params do
- requires :id, type: String, desc: 'The ID of a project'
- end
- resource :projects, requirements: API::NAMESPACE_OR_PROJECT_REQUIREMENTS do
- before { authenticate! }
- before { authorize_admin_project }
-
- helpers do
- def integration_attributes(integration)
- integration.fields.inject([]) do |arr, hash|
- arr << hash[:name].to_sym
- end
- end
- end
-
- desc 'Get all active project integrations' do
- success Entities::ProjectIntegrationBasic
- end
- get ":id/services" do
- integrations = user_project.integrations.active
-
- present integrations, with: Entities::ProjectIntegrationBasic
- end
-
- INTEGRATIONS.each do |slug, settings|
- desc "Set #{slug} integration for project"
- params do
- settings.each do |setting|
- if setting[:required]
- requires setting[:name], type: setting[:type], desc: setting[:desc]
- else
- optional setting[:name], type: setting[:type], desc: setting[:desc]
- end
- end
- end
- put ":id/services/#{slug}" do
- integration = user_project.find_or_initialize_integration(slug.underscore)
- params = declared_params(include_missing: false).merge(active: true)
-
- if integration.update(params)
- present integration, with: Entities::ProjectIntegration
- else
- render_api_error!('400 Bad Request', 400)
- end
- end
- end
-
- desc "Delete an integration from a project"
- params do
- requires :slug, type: String, values: INTEGRATIONS.keys, desc: 'The name of the service'
- end
- delete ":id/services/:slug" do
- integration = user_project.find_or_initialize_integration(params[:slug].underscore)
-
- destroy_conditionally!(integration) do
- attrs = integration_attributes(integration).index_with { nil }.merge(active: false)
-
- render_api_error!('400 Bad Request', 400) unless integration.update(attrs)
- end
- end
-
- desc 'Get the integration settings for a project' do
- success Entities::ProjectIntegration
- end
- params do
- requires :slug, type: String, values: INTEGRATIONS.keys, desc: 'The name of the service'
- end
- get ":id/services/:slug" do
- integration = user_project.find_or_initialize_integration(params[:slug].underscore)
-
- not_found!('Service') unless integration&.persisted?
-
- present integration, with: Entities::ProjectIntegration
- end
- end
-
- TRIGGER_INTEGRATIONS.each do |integration_slug, settings|
- helpers do
- def slash_command_integration(project, integration_slug, params)
- project.integrations.active.find do |integration|
- integration.try(:token) == params[:token] && integration.to_param == integration_slug.underscore
- end
- end
- end
-
- params do
- requires :id, type: String, desc: 'The ID of a project'
- end
- resource :projects, requirements: API::NAMESPACE_OR_PROJECT_REQUIREMENTS do
- desc "Trigger a slash command for #{integration_slug}" do
- detail 'Added in GitLab 8.13'
- end
- params do
- settings.each do |setting|
- requires setting[:name], type: setting[:type], desc: setting[:desc]
- end
- end
- post ":id/services/#{integration_slug.underscore}/trigger" do
- project = find_project(params[:id])
-
- # This is not accurate, but done to prevent leakage of the project names
- not_found!('Service') unless project
-
- integration = slash_command_integration(project, integration_slug, params)
- result = integration.try(:trigger, params)
-
- if result
- status result[:status] || 200
- present result
- else
- not_found!('Service')
- end
- end
- end
- end
- end
-end
-
-API::Services.prepend_mod_with('API::Services')
diff --git a/lib/api/settings.rb b/lib/api/settings.rb
index 36f816ae638..12e1d21a00d 100644
--- a/lib/api/settings.rb
+++ b/lib/api/settings.rb
@@ -177,6 +177,7 @@ module API
optional :whats_new_variant, type: String, values: ApplicationSetting.whats_new_variants.keys, desc: "What's new variant, possible values: `all_tiers`, `current_tier`, and `disabled`."
optional :floc_enabled, type: Grape::API::Boolean, desc: 'Enable FloC (Federated Learning of Cohorts)'
optional :user_deactivation_emails_enabled, type: Boolean, desc: 'Send emails to users upon account deactivation'
+ optional :suggest_pipeline_enabled, type: Boolean, desc: 'Enable pipeline suggestion banner'
ApplicationSetting::SUPPORTED_KEY_TYPES.each do |type|
optional :"#{type}_key_restriction",
diff --git a/lib/api/tags.rb b/lib/api/tags.rb
index 395aacced78..f018b421edd 100644
--- a/lib/api/tags.rb
+++ b/lib/api/tags.rb
@@ -24,7 +24,7 @@ module API
use :pagination
end
get ':id/repository/tags', feature_category: :source_code_management do
- tags = ::TagsFinder.new(user_project.repository,
+ tags, _ = ::TagsFinder.new(user_project.repository,
sort: "#{params[:order_by]}_#{params[:sort]}",
search: params[:search]).execute
diff --git a/lib/api/unleash.rb b/lib/api/unleash.rb
index 37fe540cde1..6dadaf4fc54 100644
--- a/lib/api/unleash.rb
+++ b/lib/api/unleash.rb
@@ -30,7 +30,7 @@ module API
end
desc 'Get a list of features'
- get 'client/features' do
+ get 'client/features', urgency: :medium do
present :version, 1
present :features, feature_flags, with: ::API::Entities::UnleashFeature
end
diff --git a/lib/api/users.rb b/lib/api/users.rb
index 944be990c2f..f16e1148618 100644
--- a/lib/api/users.rb
+++ b/lib/api/users.rb
@@ -795,7 +795,7 @@ module API
use :pagination
optional :state, type: String, default: 'all', values: %w[all active inactive], desc: 'Filters (all|active|inactive) impersonation_tokens'
end
- get feature_category :authentication_and_authorization do
+ get feature_category: :authentication_and_authorization do
present paginate(finder(declared_params(include_missing: false)).execute), with: Entities::ImpersonationToken
end
@@ -1058,6 +1058,10 @@ module API
params do
requires :user_id, type: String, desc: 'The ID or username of the user'
requires :credit_card_validated_at, type: DateTime, desc: 'The time when the user\'s credit card was validated'
+ requires :credit_card_expiration_month, type: Integer, desc: 'The month the credit card expires'
+ requires :credit_card_expiration_year, type: Integer, desc: 'The year the credit card expires'
+ requires :credit_card_holder_name, type: String, desc: 'The credit card holder name'
+ requires :credit_card_mask_number, type: String, desc: 'The last 4 digits of credit card number'
end
put ":user_id/credit_card_validation", feature_category: :users do
authenticated_as_admin!
@@ -1093,7 +1097,6 @@ module API
attrs = declared_params(include_missing: false)
service = ::UserPreferences::UpdateService.new(current_user, attrs).execute
-
if service.success?
present preferences, with: Entities::UserPreferences
else
diff --git a/lib/api/validations/validators/project_portable.rb b/lib/api/validations/validators/project_portable.rb
new file mode 100644
index 00000000000..3a7ea5ea71e
--- /dev/null
+++ b/lib/api/validations/validators/project_portable.rb
@@ -0,0 +1,21 @@
+# frozen_string_literal: true
+
+module API
+ module Validations
+ module Validators
+ class ProjectPortable < Grape::Validations::Base
+ def validate_param!(attr_name, params)
+ portable = params[attr_name]
+
+ portable_relations = ::BulkImports::FileTransfer.config_for(::Project.new).portable_relations
+ return if portable_relations.include?(portable)
+
+ raise Grape::Exceptions::Validation.new(
+ params: [@scope.full_name(attr_name)],
+ message: "is not portable"
+ )
+ end
+ end
+ end
+ end
+end
diff --git a/lib/atlassian/jira_connect/asymmetric_jwt.rb b/lib/atlassian/jira_connect/asymmetric_jwt.rb
new file mode 100644
index 00000000000..a5668701965
--- /dev/null
+++ b/lib/atlassian/jira_connect/asymmetric_jwt.rb
@@ -0,0 +1,68 @@
+# frozen_string_literal: true
+
+module Atlassian
+ module JiraConnect
+ # See documentation about Atlassian asymmetric JWT verification:
+ # https://developer.atlassian.com/cloud/jira/platform/understanding-jwt-for-connect-apps/#verifying-a-asymmetric-jwt-token-for-install-callbacks
+
+ class AsymmetricJwt
+ include Gitlab::Utils::StrongMemoize
+
+ KeyFetchError = Class.new(StandardError)
+
+ ALGORITHM = 'RS256'
+ PUBLIC_KEY_CDN_URL = 'https://connect-install-keys.atlassian.com/'
+ UUID4_REGEX = /\A[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}\z/.freeze
+
+ def initialize(token, verification_claims)
+ @token = token
+ @verification_claims = verification_claims
+ end
+
+ def valid?
+ claims.present? && claims['qsh'] == verification_qsh
+ end
+
+ def iss_claim
+ return unless claims
+
+ claims['iss']
+ end
+
+ private
+
+ def claims
+ strong_memoize(:claims) do
+ _, jwt_headers = decode_token
+ public_key = retrieve_public_key(jwt_headers['kid'])
+ decoded_claims, _ = decode_token(public_key, true, **relevant_claims, verify_aud: true, verify_iss: true, algorithm: ALGORITHM)
+
+ decoded_claims
+ rescue JWT::DecodeError, OpenSSL::PKey::PKeyError, KeyFetchError
+ end
+ end
+
+ def decode_token(key = nil, verify = false, **claims)
+ Atlassian::Jwt.decode(@token, key, verify, **claims)
+ end
+
+ def retrieve_public_key(key_id)
+ raise KeyFetchError unless UUID4_REGEX.match?(key_id)
+
+ public_key = Gitlab::HTTP.try_get(PUBLIC_KEY_CDN_URL + key_id).try(:body)
+
+ raise KeyFetchError if public_key.blank?
+
+ OpenSSL::PKey.read(public_key)
+ end
+
+ def relevant_claims
+ @verification_claims.slice(:aud, :iss)
+ end
+
+ def verification_qsh
+ @verification_claims[:qsh]
+ end
+ end
+ end
+end
diff --git a/lib/atlassian/jira_connect/serializers/environment_entity.rb b/lib/atlassian/jira_connect/serializers/environment_entity.rb
index f3699e4d0ee..b6b5db40ba6 100644
--- a/lib/atlassian/jira_connect/serializers/environment_entity.rb
+++ b/lib/atlassian/jira_connect/serializers/environment_entity.rb
@@ -21,13 +21,13 @@ module Atlassian
def type
case environment.name
- when /prod/i
+ when /\A(.*[^a-z0-9])?(staging|stage|stg|preprod|pre-prod|model|internal)([^a-z0-9].*)?\z/i
+ 'staging'
+ when /\A(.*[^a-z0-9])?(prod|production|prd|live)([^a-z0-9].*)?\z/i
'production'
- when /test/i
+ when /\A(.*[^a-z0-9])?(test|testing|tests|tst|integration|integ|intg|int|acceptance|accept|acpt|qa|qc|control|quality)([^a-z0-9].*)?\z/i
'testing'
- when /staging/i
- 'staging'
- when /(dev|review)/i
+ when /\A(.*[^a-z0-9])?(dev|review|development)([^a-z0-9].*)?\z/i
'development'
else
'unmapped'
diff --git a/lib/backup/gitaly_backup.rb b/lib/backup/gitaly_backup.rb
index 47b63990262..b104beed39c 100644
--- a/lib/backup/gitaly_backup.rb
+++ b/lib/backup/gitaly_backup.rb
@@ -25,7 +25,7 @@ module Backup
args += ['-parallel', @parallel.to_s] if @parallel
args += ['-parallel-storage', @parallel_storage.to_s] if @parallel_storage
- @stdin, stdout, @thread = Open3.popen2(ENV, bin_path, command, '-path', backup_repos_path, *args)
+ @stdin, stdout, @thread = Open3.popen2(build_env, bin_path, command, '-path', backup_repos_path, *args)
@out_reader = Thread.new do
IO.copy_stream(stdout, @progress)
@@ -63,6 +63,13 @@ module Backup
private
+ def build_env
+ {
+ 'SSL_CERT_FILE' => OpenSSL::X509::DEFAULT_CERT_FILE,
+ 'SSL_CERT_DIR' => OpenSSL::X509::DEFAULT_CERT_DIR
+ }.merge(ENV)
+ end
+
def started?
@thread.present?
end
diff --git a/lib/banzai/filter/front_matter_filter.rb b/lib/banzai/filter/front_matter_filter.rb
index 5900e762244..d47900b816a 100644
--- a/lib/banzai/filter/front_matter_filter.rb
+++ b/lib/banzai/filter/front_matter_filter.rb
@@ -9,7 +9,7 @@ module Banzai
html.sub(Gitlab::FrontMatter::PATTERN) do |_match|
lang = $~[:lang].presence || lang_mapping[$~[:delim]]
- ["```#{lang}", $~[:front_matter], "```", "\n"].join("\n")
+ ["```#{lang}:frontmatter", $~[:front_matter], "```", "\n"].join("\n")
end
end
end
diff --git a/lib/banzai/filter/references/abstract_reference_filter.rb b/lib/banzai/filter/references/abstract_reference_filter.rb
index 08014ccdcce..cae0a8b424a 100644
--- a/lib/banzai/filter/references/abstract_reference_filter.rb
+++ b/lib/banzai/filter/references/abstract_reference_filter.rb
@@ -11,7 +11,7 @@ module Banzai
def initialize(doc, context = nil, result = nil)
super
- @reference_cache = ReferenceCache.new(self, context)
+ @reference_cache = ReferenceCache.new(self, context, result)
end
# REFERENCE_PLACEHOLDER is used for re-escaping HTML text except found
diff --git a/lib/banzai/filter/references/milestone_reference_filter.rb b/lib/banzai/filter/references/milestone_reference_filter.rb
index 94f7106d31e..609aaf885ba 100644
--- a/lib/banzai/filter/references/milestone_reference_filter.rb
+++ b/lib/banzai/filter/references/milestone_reference_filter.rb
@@ -5,8 +5,6 @@ module Banzai
module References
# HTML filter that replaces milestone references with links.
class MilestoneReferenceFilter < AbstractReferenceFilter
- include Gitlab::Utils::StrongMemoize
-
self.reference_type = :milestone
self.object_class = Milestone
@@ -63,21 +61,15 @@ module Banzai
end
def valid_context?(parent)
- strong_memoize(:valid_context) do
- group_context?(parent) || project_context?(parent)
- end
+ group_context?(parent) || project_context?(parent)
end
def group_context?(parent)
- strong_memoize(:group_context) do
- parent.is_a?(Group)
- end
+ parent.is_a?(Group)
end
def project_context?(parent)
- strong_memoize(:project_context) do
- parent.is_a?(Project)
- end
+ parent.is_a?(Project)
end
def references_in(text, pattern = Milestone.reference_pattern)
diff --git a/lib/banzai/filter/references/reference_cache.rb b/lib/banzai/filter/references/reference_cache.rb
index b2d47aba2d6..259958f1598 100644
--- a/lib/banzai/filter/references/reference_cache.rb
+++ b/lib/banzai/filter/references/reference_cache.rb
@@ -7,9 +7,10 @@ module Banzai
include Gitlab::Utils::StrongMemoize
include RequestStoreReferenceCache
- def initialize(filter, context)
+ def initialize(filter, context, result)
@filter = filter
@context = context
+ @result = result || {}
end
def load_reference_cache(nodes)
@@ -166,7 +167,7 @@ module Banzai
private
- attr_accessor :filter, :context
+ attr_accessor :filter, :context, :result
delegate :project, :group, :parent, :parent_type, to: :filter
@@ -184,7 +185,11 @@ module Banzai
end
def prepare_doc_for_scan(doc)
- html = doc.to_html
+ html = if Feature.enabled?(:reference_cache_memoization, project, default_enabled: :yaml)
+ result[:rendered_html] ||= doc.to_html
+ else
+ doc.to_html
+ end
filter.requires_unescaping? ? unescape_html_entities(html) : html
end
diff --git a/lib/banzai/filter/syntax_highlight_filter.rb b/lib/banzai/filter/syntax_highlight_filter.rb
index f1440c13d47..8d869cd63d3 100644
--- a/lib/banzai/filter/syntax_highlight_filter.rb
+++ b/lib/banzai/filter/syntax_highlight_filter.rb
@@ -28,6 +28,7 @@ module Banzai
def highlight_node(node)
css_classes = +'code highlight js-syntax-highlight'
lang, lang_params = parse_lang_params(node.attr('lang'))
+ sourcepos = node.parent.attr('data-sourcepos')
retried = false
if use_rouge?(lang)
@@ -55,7 +56,9 @@ module Banzai
retry
end
- highlighted = %(<pre class="#{css_classes}"
+ sourcepos_attr = sourcepos ? "data-sourcepos=\"#{sourcepos}\"" : ""
+
+ highlighted = %(<pre #{sourcepos_attr} class="#{css_classes}"
lang="#{language}"
#{lang_params}
v-pre="true"><code>#{code}</code></pre>)
diff --git a/lib/bulk_imports/clients/graphql.rb b/lib/bulk_imports/clients/graphql.rb
index 0adc2b1c57f..a9f908a4247 100644
--- a/lib/bulk_imports/clients/graphql.rb
+++ b/lib/bulk_imports/clients/graphql.rb
@@ -17,6 +17,8 @@ module BulkImports
)
::Gitlab::Json.parse(response.body)
+ rescue *Gitlab::HTTP::HTTP_ERRORS => e
+ raise ::BulkImports::NetworkError, e
end
end
private_constant :HTTP
@@ -55,7 +57,7 @@ module BulkImports
response = client.execute('{ metadata { version } }')
version = Gitlab::VersionInfo.parse(response.data.metadata.version)
- if version.major < BulkImport::MINIMUM_GITLAB_MAJOR_VERSION
+ if version.major < BulkImport::MIN_MAJOR_VERSION
raise ::BulkImports::Error.unsupported_gitlab_version
else
@compatible_instance_version = true
diff --git a/lib/bulk_imports/clients/http.rb b/lib/bulk_imports/clients/http.rb
index 6c363a3552f..90414a875c6 100644
--- a/lib/bulk_imports/clients/http.rb
+++ b/lib/bulk_imports/clients/http.rb
@@ -3,6 +3,8 @@
module BulkImports
module Clients
class HTTP
+ include Gitlab::Utils::StrongMemoize
+
API_VERSION = 'v4'
DEFAULT_PAGE = 1
DEFAULT_PER_PAGE = 30
@@ -52,24 +54,32 @@ module BulkImports
Gitlab::Utils.append_path(api_url, resource)
end
- def validate_instance_version!
- return if @compatible_instance_version
+ def instance_version
+ strong_memoize(:instance_version) do
+ response = with_error_handling do
+ Gitlab::HTTP.get(resource_url(:version), default_options)
+ end
- response = with_error_handling do
- Gitlab::HTTP.get(resource_url(:version), default_options)
+ Gitlab::VersionInfo.parse(response.parsed_response['version'])
end
+ end
+
+ def compatible_for_project_migration?
+ instance_version >= BulkImport.min_gl_version_for_project_migration
+ end
- version = Gitlab::VersionInfo.parse(response.parsed_response['version'])
+ private
+
+ def validate_instance_version!
+ return if @compatible_instance_version
- if version.major < BulkImport::MINIMUM_GITLAB_MAJOR_VERSION
+ if instance_version.major < BulkImport::MIN_MAJOR_VERSION
raise ::BulkImports::Error.unsupported_gitlab_version
else
@compatible_instance_version = true
end
end
- private
-
# rubocop:disable GitlabSecurity/PublicSend
def request(method, resource, options = {}, &block)
validate_instance_version!
@@ -113,11 +123,11 @@ module BulkImports
def with_error_handling
response = yield
- raise(::BulkImports::Error, "Error #{response.code}") unless response.success?
+ raise ::BulkImports::NetworkError.new(response: response) unless response.success?
response
rescue *Gitlab::HTTP::HTTP_ERRORS => e
- raise(::BulkImports::Error, e)
+ raise ::BulkImports::NetworkError, e
end
def api_url
diff --git a/lib/bulk_imports/common/extractors/ndjson_extractor.rb b/lib/bulk_imports/common/extractors/ndjson_extractor.rb
index 788d10ca364..6b4acd45ea9 100644
--- a/lib/bulk_imports/common/extractors/ndjson_extractor.rb
+++ b/lib/bulk_imports/common/extractors/ndjson_extractor.rb
@@ -60,7 +60,7 @@ module BulkImports
def relative_resource_url(context)
strong_memoize(:relative_resource_url) do
- resource = context.portable.class.name.downcase.pluralize
+ resource = context.entity.pluralized_name
encoded_full_path = context.entity.encoded_source_full_path
EXPORT_DOWNLOAD_URL_PATH % { resource: resource, full_path: encoded_full_path, relation: relation }
diff --git a/lib/bulk_imports/common/pipelines/boards_pipeline.rb b/lib/bulk_imports/common/pipelines/boards_pipeline.rb
new file mode 100644
index 00000000000..8329c217d54
--- /dev/null
+++ b/lib/bulk_imports/common/pipelines/boards_pipeline.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+module BulkImports
+ module Common
+ module Pipelines
+ class BoardsPipeline
+ include NdjsonPipeline
+
+ relation_name 'boards'
+
+ extractor ::BulkImports::Common::Extractors::NdjsonExtractor, relation: relation
+ end
+ end
+ end
+end
diff --git a/lib/bulk_imports/common/pipelines/labels_pipeline.rb b/lib/bulk_imports/common/pipelines/labels_pipeline.rb
new file mode 100644
index 00000000000..495a2ec18b0
--- /dev/null
+++ b/lib/bulk_imports/common/pipelines/labels_pipeline.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+module BulkImports
+ module Common
+ module Pipelines
+ class LabelsPipeline
+ include NdjsonPipeline
+
+ relation_name 'labels'
+
+ extractor ::BulkImports::Common::Extractors::NdjsonExtractor, relation: relation
+ end
+ end
+ end
+end
diff --git a/lib/bulk_imports/error.rb b/lib/bulk_imports/error.rb
index 0464aea642e..988982d3cdf 100644
--- a/lib/bulk_imports/error.rb
+++ b/lib/bulk_imports/error.rb
@@ -3,7 +3,7 @@
module BulkImports
class Error < StandardError
def self.unsupported_gitlab_version
- self.new("Unsupported GitLab Version. Minimum Supported Gitlab Version #{BulkImport::MINIMUM_GITLAB_MAJOR_VERSION}.")
+ self.new("Unsupported GitLab Version. Minimum Supported Gitlab Version #{BulkImport::MIN_MAJOR_VERSION}.")
end
end
end
diff --git a/lib/bulk_imports/groups/pipelines/boards_pipeline.rb b/lib/bulk_imports/groups/pipelines/boards_pipeline.rb
deleted file mode 100644
index 08a0a4abc9f..00000000000
--- a/lib/bulk_imports/groups/pipelines/boards_pipeline.rb
+++ /dev/null
@@ -1,15 +0,0 @@
-# frozen_string_literal: true
-
-module BulkImports
- module Groups
- module Pipelines
- class BoardsPipeline
- include NdjsonPipeline
-
- relation_name 'boards'
-
- extractor ::BulkImports::Common::Extractors::NdjsonExtractor, relation: relation
- end
- end
- end
-end
diff --git a/lib/bulk_imports/groups/pipelines/labels_pipeline.rb b/lib/bulk_imports/groups/pipelines/labels_pipeline.rb
deleted file mode 100644
index 1dd74c10b65..00000000000
--- a/lib/bulk_imports/groups/pipelines/labels_pipeline.rb
+++ /dev/null
@@ -1,15 +0,0 @@
-# frozen_string_literal: true
-
-module BulkImports
- module Groups
- module Pipelines
- class LabelsPipeline
- include NdjsonPipeline
-
- relation_name 'labels'
-
- extractor ::BulkImports::Common::Extractors::NdjsonExtractor, relation: relation
- end
- end
- end
-end
diff --git a/lib/bulk_imports/groups/stage.rb b/lib/bulk_imports/groups/stage.rb
index 8c3b6975b73..a1869b4cb0e 100644
--- a/lib/bulk_imports/groups/stage.rb
+++ b/lib/bulk_imports/groups/stage.rb
@@ -24,7 +24,7 @@ module BulkImports
stage: 1
},
labels: {
- pipeline: BulkImports::Groups::Pipelines::LabelsPipeline,
+ pipeline: BulkImports::Common::Pipelines::LabelsPipeline,
stage: 1
},
milestones: {
@@ -36,7 +36,7 @@ module BulkImports
stage: 1
},
boards: {
- pipeline: BulkImports::Groups::Pipelines::BoardsPipeline,
+ pipeline: BulkImports::Common::Pipelines::BoardsPipeline,
stage: 2
},
finisher: {
@@ -47,7 +47,7 @@ module BulkImports
end
def project_entities_pipeline
- if ::Feature.enabled?(:bulk_import_projects, default_enabled: :yaml)
+ if project_pipeline_available? && ::Feature.enabled?(:bulk_import_projects, default_enabled: :yaml)
{
project_entities: {
pipeline: BulkImports::Groups::Pipelines::ProjectEntitiesPipeline,
@@ -58,6 +58,10 @@ module BulkImports
{}
end
end
+
+ def project_pipeline_available?
+ @bulk_import.source_version_info >= BulkImport.min_gl_version_for_project_migration
+ end
end
end
end
diff --git a/lib/bulk_imports/ndjson_pipeline.rb b/lib/bulk_imports/ndjson_pipeline.rb
index 93fd6986173..f01ce22a46d 100644
--- a/lib/bulk_imports/ndjson_pipeline.rb
+++ b/lib/bulk_imports/ndjson_pipeline.rb
@@ -14,7 +14,7 @@ module BulkImports
relation_definition = import_export_config.top_relation_tree(relation)
deep_transform_relation!(relation_hash, relation, relation_definition) do |key, hash|
- Gitlab::ImportExport::Group::RelationFactory.create(
+ relation_factory.create(
relation_index: relation_index,
relation_sym: key.to_sym,
relation_hash: hash,
@@ -83,6 +83,10 @@ module BulkImports
"Gitlab::ImportExport::#{portable.class}::ObjectBuilder".constantize
end
+ def relation_factory
+ "Gitlab::ImportExport::#{portable.class}::RelationFactory".constantize
+ end
+
def relation
self.class.relation
end
diff --git a/lib/bulk_imports/network_error.rb b/lib/bulk_imports/network_error.rb
new file mode 100644
index 00000000000..d69b0172f6c
--- /dev/null
+++ b/lib/bulk_imports/network_error.rb
@@ -0,0 +1,61 @@
+# frozen_string_literal: true
+
+module BulkImports
+ class NetworkError < Error
+ COUNTER_KEY = 'bulk_imports/%{entity_id}/%{stage}/%{tracker_id}/network_error/%{error}'
+
+ RETRIABLE_EXCEPTIONS = Gitlab::HTTP::HTTP_TIMEOUT_ERRORS
+ RETRIABLE_HTTP_CODES = [429].freeze
+
+ DEFAULT_RETRY_DELAY_SECONDS = 60
+
+ MAX_RETRIABLE_COUNT = 3
+
+ def initialize(message = nil, response: nil)
+ raise ArgumentError, 'message or response required' if message.blank? && response.blank?
+
+ super(message)
+
+ @response = response
+ end
+
+ def retriable?(tracker)
+ if retriable_exception? || retriable_http_code?
+ increment(tracker) <= MAX_RETRIABLE_COUNT
+ else
+ false
+ end
+ end
+
+ def retry_delay
+ if response&.code == 429
+ response.headers.fetch('Retry-After', DEFAULT_RETRY_DELAY_SECONDS).to_i
+ else
+ DEFAULT_RETRY_DELAY_SECONDS
+ end.seconds
+ end
+
+ private
+
+ attr_reader :response
+
+ def retriable_exception?
+ RETRIABLE_EXCEPTIONS.include?(cause&.class)
+ end
+
+ def retriable_http_code?
+ RETRIABLE_HTTP_CODES.include?(response&.code)
+ end
+
+ def increment(tracker)
+ key = COUNTER_KEY % {
+ stage: tracker.stage,
+ tracker_id: tracker.id,
+ entity_id: tracker.entity.id,
+ error: cause.class.name
+ }
+
+ Gitlab::Cache::Import::Caching.increment(key)
+ end
+ end
+end
diff --git a/lib/bulk_imports/projects/graphql/get_repository_query.rb b/lib/bulk_imports/projects/graphql/get_repository_query.rb
new file mode 100644
index 00000000000..d3e377c1175
--- /dev/null
+++ b/lib/bulk_imports/projects/graphql/get_repository_query.rb
@@ -0,0 +1,37 @@
+# frozen_string_literal: true
+
+module BulkImports
+ module Projects
+ module Graphql
+ module GetRepositoryQuery
+ extend self
+
+ def to_s
+ <<-'GRAPHQL'
+ query($full_path: ID!) {
+ project(fullPath: $full_path) {
+ httpUrlToRepo
+ }
+ }
+ GRAPHQL
+ end
+
+ def variables(context)
+ { full_path: context.entity.source_full_path }
+ end
+
+ def base_path
+ %w[data project]
+ end
+
+ def data_path
+ base_path
+ end
+
+ def page_info_path
+ base_path << 'page_info'
+ end
+ end
+ end
+ end
+end
diff --git a/lib/bulk_imports/projects/pipelines/issues_pipeline.rb b/lib/bulk_imports/projects/pipelines/issues_pipeline.rb
new file mode 100644
index 00000000000..5d5bd58f1eb
--- /dev/null
+++ b/lib/bulk_imports/projects/pipelines/issues_pipeline.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+module BulkImports
+ module Projects
+ module Pipelines
+ class IssuesPipeline
+ include NdjsonPipeline
+
+ relation_name 'issues'
+
+ extractor ::BulkImports::Common::Extractors::NdjsonExtractor, relation: relation
+ end
+ end
+ end
+end
diff --git a/lib/bulk_imports/projects/pipelines/repository_pipeline.rb b/lib/bulk_imports/projects/pipelines/repository_pipeline.rb
new file mode 100644
index 00000000000..86e696f87a4
--- /dev/null
+++ b/lib/bulk_imports/projects/pipelines/repository_pipeline.rb
@@ -0,0 +1,34 @@
+# frozen_string_literal: true
+
+module BulkImports
+ module Projects
+ module Pipelines
+ class RepositoryPipeline
+ include Pipeline
+
+ abort_on_failure!
+
+ extractor Common::Extractors::GraphqlExtractor, query: Graphql::GetRepositoryQuery
+
+ def transform(_, data)
+ data.slice('httpUrlToRepo')
+ end
+
+ def load(context, data)
+ url = data['httpUrlToRepo']
+ url = url.sub("://", "://oauth2:#{context.configuration.access_token}@")
+
+ Gitlab::UrlBlocker.validate!(url, allow_local_network: allow_local_requests?, allow_localhost: allow_local_requests?)
+
+ context.portable.repository.import_repository(url)
+ end
+
+ private
+
+ def allow_local_requests?
+ Gitlab::CurrentSettings.allow_local_requests_from_web_hooks_and_services?
+ end
+ end
+ end
+ end
+end
diff --git a/lib/bulk_imports/projects/stage.rb b/lib/bulk_imports/projects/stage.rb
index b606003091b..3ada0f406ca 100644
--- a/lib/bulk_imports/projects/stage.rb
+++ b/lib/bulk_imports/projects/stage.rb
@@ -7,13 +7,29 @@ module BulkImports
def config
@config ||= {
- group: {
+ project: {
pipeline: BulkImports::Projects::Pipelines::ProjectPipeline,
stage: 0
},
+ repository: {
+ pipeline: BulkImports::Projects::Pipelines::RepositoryPipeline,
+ stage: 1
+ },
+ labels: {
+ pipeline: BulkImports::Common::Pipelines::LabelsPipeline,
+ stage: 2
+ },
+ issues: {
+ pipeline: BulkImports::Projects::Pipelines::IssuesPipeline,
+ stage: 3
+ },
+ boards: {
+ pipeline: BulkImports::Common::Pipelines::BoardsPipeline,
+ stage: 4
+ },
finisher: {
pipeline: BulkImports::Common::Pipelines::EntityFinisher,
- stage: 1
+ stage: 5
}
}
end
diff --git a/lib/bulk_imports/stage.rb b/lib/bulk_imports/stage.rb
index 103623cd030..9c19e9ea60b 100644
--- a/lib/bulk_imports/stage.rb
+++ b/lib/bulk_imports/stage.rb
@@ -2,8 +2,10 @@
module BulkImports
class Stage
- def self.pipelines
- new.pipelines
+ def initialize(bulk_import)
+ raise(ArgumentError, 'Expected an argument of type ::BulkImport') unless bulk_import.is_a?(::BulkImport)
+
+ @bulk_import = bulk_import
end
def pipelines
diff --git a/lib/container_registry/client.rb b/lib/container_registry/client.rb
index cc692140301..46399224a5d 100644
--- a/lib/container_registry/client.rb
+++ b/lib/container_registry/client.rb
@@ -51,6 +51,15 @@ module ContainerRegistry
client.supports_tag_delete?
end
+ def self.registry_info
+ registry_config = Gitlab.config.registry
+ return unless registry_config.enabled && registry_config.api_url.present?
+
+ token = Auth::ContainerRegistryAuthenticationService.access_token([], [])
+ client = new(registry_config.api_url, token: token)
+ client.registry_info
+ end
+
def initialize(base_uri, options = {})
@base_uri = base_uri
@options = options
diff --git a/lib/container_registry/tag.rb b/lib/container_registry/tag.rb
index 614b1b5e6c6..2a32f950457 100644
--- a/lib/container_registry/tag.rb
+++ b/lib/container_registry/tag.rb
@@ -5,6 +5,7 @@ module ContainerRegistry
include Gitlab::Utils::StrongMemoize
attr_reader :repository, :name
+ attr_writer :created_at
delegate :registry, :client, to: :repository
delegate :revision, :short_revision, to: :config_blob, allow_nil: true
@@ -73,9 +74,10 @@ module ContainerRegistry
end
def created_at
+ return @created_at if @created_at
return unless config
- strong_memoize(:created_at) do
+ strong_memoize(:memoized_created_at) do
DateTime.rfc3339(config['created'])
rescue ArgumentError
nil
diff --git a/lib/error_tracking/sentry_client/issue.rb b/lib/error_tracking/sentry_client/issue.rb
index bdc567bd859..65da072ef8d 100644
--- a/lib/error_tracking/sentry_client/issue.rb
+++ b/lib/error_tracking/sentry_client/issue.rb
@@ -167,7 +167,8 @@ module ErrorTracking
first_release_version: issue.dig('firstRelease', 'version'),
last_release_last_commit: issue.dig('lastRelease', 'lastCommit'),
last_release_short_version: issue.dig('lastRelease', 'shortVersion'),
- last_release_version: issue.dig('lastRelease', 'version')
+ last_release_version: issue.dig('lastRelease', 'version'),
+ integrated: false
})
end
diff --git a/lib/gitlab/access.rb b/lib/gitlab/access.rb
index 6afcd745d4e..d3c96a0f934 100644
--- a/lib/gitlab/access.rb
+++ b/lib/gitlab/access.rb
@@ -75,10 +75,10 @@ module Gitlab
def protection_options
{
- "Not protected: Both developers and maintainers can push new commits, force push, or delete the branch." => PROTECTION_NONE,
+ "Not protected: Both developers and maintainers can push new commits and force push." => PROTECTION_NONE,
"Protected against pushes: Developers cannot push new commits, but are allowed to accept merge requests to the branch. Maintainers can push to the branch." => PROTECTION_DEV_CAN_MERGE,
- "Partially protected: Both developers and maintainers can push new commits, but cannot force push or delete the branch." => PROTECTION_DEV_CAN_PUSH,
- "Fully protected: Developers cannot push new commits, but maintainers can. No-one can force push or delete the branch." => PROTECTION_FULL
+ "Partially protected: Both developers and maintainers can push new commits, but cannot force push." => PROTECTION_DEV_CAN_PUSH,
+ "Fully protected: Developers cannot push new commits, but maintainers can. No one can force push." => PROTECTION_FULL
}
end
diff --git a/lib/gitlab/analytics/cycle_analytics/stage_events/code_stage_start.rb b/lib/gitlab/analytics/cycle_analytics/stage_events/code_stage_start.rb
index 8e87245e62b..fda4ab0207d 100644
--- a/lib/gitlab/analytics/cycle_analytics/stage_events/code_stage_start.rb
+++ b/lib/gitlab/analytics/cycle_analytics/stage_events/code_stage_start.rb
@@ -53,6 +53,10 @@ module Gitlab
.on(mr_metrics_table[:merge_request_id].eq(mr_table[:id]))
.join_sources
end
+
+ def include_in(query)
+ query.left_joins(merge_requests_closing_issues: { issue: [:metrics] }, metrics: [])
+ end
end
end
end
diff --git a/lib/gitlab/analytics/cycle_analytics/stage_events/issue_deployed_to_production.rb b/lib/gitlab/analytics/cycle_analytics/stage_events/issue_deployed_to_production.rb
index 4ca3c19051e..0cb081c64c4 100644
--- a/lib/gitlab/analytics/cycle_analytics/stage_events/issue_deployed_to_production.rb
+++ b/lib/gitlab/analytics/cycle_analytics/stage_events/issue_deployed_to_production.rb
@@ -26,6 +26,10 @@ module Gitlab
query.joins(merge_requests_closing_issues: { merge_request: [:metrics] }).where(mr_metrics_table[:first_deployed_to_production_at].gteq(mr_table[:created_at]))
end
# rubocop: enable CodeReuse/ActiveRecord
+
+ def include_in(query)
+ query.left_joins(merge_requests_closing_issues: { merge_request: [:metrics] })
+ end
end
end
end
diff --git a/lib/gitlab/analytics/cycle_analytics/stage_events/metrics_based_stage_event.rb b/lib/gitlab/analytics/cycle_analytics/stage_events/metrics_based_stage_event.rb
index fd30ab5277d..e191b0fe897 100644
--- a/lib/gitlab/analytics/cycle_analytics/stage_events/metrics_based_stage_event.rb
+++ b/lib/gitlab/analytics/cycle_analytics/stage_events/metrics_based_stage_event.rb
@@ -20,6 +20,10 @@ module Gitlab
def column_list
[timestamp_projection]
end
+
+ def include_in(query)
+ super.left_joins(:metrics)
+ end
end
end
end
diff --git a/lib/gitlab/analytics/cycle_analytics/stage_events/stage_event.rb b/lib/gitlab/analytics/cycle_analytics/stage_events/stage_event.rb
index 8eb067ed0ec..945cecfcf8c 100644
--- a/lib/gitlab/analytics/cycle_analytics/stage_events/stage_event.rb
+++ b/lib/gitlab/analytics/cycle_analytics/stage_events/stage_event.rb
@@ -61,6 +61,10 @@ module Gitlab
end
# rubocop: enable CodeReuse/ActiveRecord
+ def include_in(query)
+ query
+ end
+
def self.label_based?
false
end
diff --git a/lib/gitlab/application_context.rb b/lib/gitlab/application_context.rb
index 760f1352256..aa33f56582b 100644
--- a/lib/gitlab/application_context.rb
+++ b/lib/gitlab/application_context.rb
@@ -124,7 +124,10 @@ module Gitlab
strong_memoize(:runner_project) do
next unless runner&.project_type?
- projects = runner.projects.take(2) # rubocop: disable CodeReuse/ActiveRecord
+ projects = ::Gitlab::Database.allow_cross_joins_across_databases(url: 'https://gitlab.com/gitlab-org/gitlab/-/issues/342147') do
+ runner.projects.take(2) # rubocop: disable CodeReuse/ActiveRecord
+ end
+
projects.first if projects.one?
end
end
diff --git a/lib/gitlab/application_rate_limiter.rb b/lib/gitlab/application_rate_limiter.rb
index f91a56a0cd2..7c37f67b766 100644
--- a/lib/gitlab/application_rate_limiter.rb
+++ b/lib/gitlab/application_rate_limiter.rb
@@ -11,6 +11,23 @@ module Gitlab
# redirect_to(edit_project_path(@project), status: :too_many_requests)
# end
class ApplicationRateLimiter
+ def initialize(key, **options)
+ @key = key
+ @options = options
+ end
+
+ def throttled?
+ self.class.throttled?(key, **options)
+ end
+
+ def threshold_value
+ options[:threshold] || self.class.threshold(key)
+ end
+
+ def interval_value
+ self.class.interval(key)
+ end
+
class << self
# Application rate limits
#
@@ -73,7 +90,7 @@ module Gitlab
value = 0
interval_value = interval || interval(key)
- Gitlab::Redis::Cache.with do |redis|
+ ::Gitlab::Redis::RateLimiting.with do |redis|
cache_key = action_key(key, scope)
value = redis.incr(cache_key)
redis.expire(cache_key, interval_value) if value == 1
@@ -154,5 +171,9 @@ module Gitlab
scoped_user.username.downcase.in?(options[:users_allowlist])
end
end
+
+ private
+
+ attr_reader :key, :options
end
end
diff --git a/lib/gitlab/auth/request_authenticator.rb b/lib/gitlab/auth/request_authenticator.rb
index 08214bbd449..1a9259a4f0e 100644
--- a/lib/gitlab/auth/request_authenticator.rb
+++ b/lib/gitlab/auth/request_authenticator.rb
@@ -30,7 +30,8 @@ module Gitlab
end
def find_sessionless_user(request_format)
- find_user_from_web_access_token(request_format, scopes: [:api, :read_api]) ||
+ find_user_from_dependency_proxy_token ||
+ find_user_from_web_access_token(request_format, scopes: [:api, :read_api]) ||
find_user_from_feed_token(request_format) ||
find_user_from_static_object_token(request_format) ||
find_user_from_basic_auth_job ||
@@ -82,6 +83,28 @@ module Gitlab
basic_auth_personal_access_token: api_request? || git_request?
}
end
+
+ def find_user_from_dependency_proxy_token
+ return unless dependency_proxy_request?
+
+ token, _ = ActionController::HttpAuthentication::Token.token_and_options(current_request)
+
+ return unless token
+
+ user_or_deploy_token = ::DependencyProxy::AuthTokenService.user_or_deploy_token_from_jwt(token)
+
+ # Do not return deploy tokens
+ # See https://gitlab.com/gitlab-org/gitlab/-/issues/342481
+ return unless user_or_deploy_token.is_a?(::User)
+
+ user_or_deploy_token
+ rescue ActiveRecord::RecordNotFound
+ nil # invalid id used return no user
+ end
+
+ def dependency_proxy_request?
+ Gitlab::PathRegex.dependency_proxy_route_regex.match?(current_request.path)
+ end
end
end
end
diff --git a/lib/gitlab/background_migration/fix_first_mentioned_in_commit_at.rb b/lib/gitlab/background_migration/fix_first_mentioned_in_commit_at.rb
new file mode 100644
index 00000000000..9b278efaedd
--- /dev/null
+++ b/lib/gitlab/background_migration/fix_first_mentioned_in_commit_at.rb
@@ -0,0 +1,91 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module BackgroundMigration
+ # Class that fixes the incorrectly set authored_date within
+ # issue_metrics table
+ class FixFirstMentionedInCommitAt
+ SUB_BATCH_SIZE = 500
+
+ # rubocop: disable Style/Documentation
+ class TmpIssueMetrics < ActiveRecord::Base
+ include EachBatch
+
+ self.table_name = 'issue_metrics'
+
+ def self.from_2020
+ where('EXTRACT(YEAR FROM first_mentioned_in_commit_at) > 2019')
+ end
+ end
+ # rubocop: enable Style/Documentation
+
+ def perform(start_id, end_id)
+ scope(start_id, end_id).each_batch(of: SUB_BATCH_SIZE, column: :issue_id) do |sub_batch|
+ first, last = sub_batch.pluck(Arel.sql('min(issue_id), max(issue_id)')).first
+
+ # The query need to be reconstructed because .each_batch modifies the default scope
+ # See: https://gitlab.com/gitlab-org/gitlab/-/issues/330510
+ inner_query = TmpIssueMetrics
+ .unscoped
+ .merge(scope(first, last))
+ .from("issue_metrics, #{lateral_query}")
+ .select('issue_metrics.issue_id', 'first_authored_date.authored_date')
+ .where('issue_metrics.first_mentioned_in_commit_at > first_authored_date.authored_date')
+
+ TmpIssueMetrics.connection.execute <<~UPDATE_METRICS
+ WITH cte AS #{Gitlab::Database::AsWithMaterialized.materialized_if_supported} (
+ #{inner_query.to_sql}
+ )
+ UPDATE issue_metrics
+ SET
+ first_mentioned_in_commit_at = cte.authored_date
+ FROM
+ cte
+ WHERE
+ cte.issue_id = issue_metrics.issue_id
+ UPDATE_METRICS
+ end
+
+ mark_job_as_succeeded(start_id, end_id)
+ end
+
+ private
+
+ def mark_job_as_succeeded(*arguments)
+ Gitlab::Database::BackgroundMigrationJob.mark_all_as_succeeded(
+ 'FixFirstMentionedInCommitAt',
+ arguments
+ )
+ end
+
+ def scope(start_id, end_id)
+ TmpIssueMetrics.from_2020.where(issue_id: start_id..end_id)
+ end
+
+ def lateral_query
+ <<~SQL
+ LATERAL (
+ SELECT MIN(first_authored_date.authored_date) as authored_date
+ FROM merge_requests_closing_issues,
+ LATERAL (
+ SELECT id
+ FROM merge_request_diffs
+ WHERE merge_request_id = merge_requests_closing_issues.merge_request_id
+ ORDER BY id DESC
+ LIMIT 1
+ ) last_diff_id,
+ LATERAL (
+ SELECT authored_date
+ FROM merge_request_diff_commits
+ WHERE
+ merge_request_diff_id = last_diff_id.id
+ ORDER BY relative_order DESC
+ LIMIT 1
+ ) first_authored_date
+ WHERE merge_requests_closing_issues.issue_id = issue_metrics.issue_id
+ ) first_authored_date
+ SQL
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/background_migration/populate_finding_uuid_for_vulnerability_feedback.rb b/lib/gitlab/background_migration/populate_finding_uuid_for_vulnerability_feedback.rb
index dc31f995ae0..909bf10341a 100644
--- a/lib/gitlab/background_migration/populate_finding_uuid_for_vulnerability_feedback.rb
+++ b/lib/gitlab/background_migration/populate_finding_uuid_for_vulnerability_feedback.rb
@@ -38,7 +38,7 @@ module Gitlab
end
def vulnerability_finding
- BatchLoader.for(finding_key).batch(replace_methods: false) do |finding_keys, loader|
+ BatchLoader.for(finding_key).batch do |finding_keys, loader|
project_ids = finding_keys.map { |key| key[:project_id] }
categories = finding_keys.map { |key| key[:category] }
fingerprints = finding_keys.map { |key| key[:project_fingerprint] }
diff --git a/lib/gitlab/background_migration/populate_status_column_of_security_scans.rb b/lib/gitlab/background_migration/populate_status_column_of_security_scans.rb
new file mode 100644
index 00000000000..9740bcaa86b
--- /dev/null
+++ b/lib/gitlab/background_migration/populate_status_column_of_security_scans.rb
@@ -0,0 +1,13 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module BackgroundMigration
+ class PopulateStatusColumnOfSecurityScans # rubocop:disable Style/Documentation
+ def perform(_start_id, _end_id)
+ # no-op
+ end
+ end
+ end
+end
+
+Gitlab::BackgroundMigration::PopulateStatusColumnOfSecurityScans.prepend_mod
diff --git a/lib/gitlab/background_migration/populate_topics_total_projects_count_cache.rb b/lib/gitlab/background_migration/populate_topics_total_projects_count_cache.rb
new file mode 100644
index 00000000000..1d96872d445
--- /dev/null
+++ b/lib/gitlab/background_migration/populate_topics_total_projects_count_cache.rb
@@ -0,0 +1,29 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module BackgroundMigration
+ SUB_BATCH_SIZE = 1_000
+
+ # The class to populates the total projects counter cache of topics
+ class PopulateTopicsTotalProjectsCountCache
+ # Temporary AR model for topics
+ class Topic < ActiveRecord::Base
+ include EachBatch
+
+ self.table_name = 'topics'
+ end
+
+ def perform(start_id, stop_id)
+ Topic.where(id: start_id..stop_id).each_batch(of: SUB_BATCH_SIZE) do |batch|
+ ActiveRecord::Base.connection.execute(<<~SQL)
+ WITH batched_relation AS #{Gitlab::Database::AsWithMaterialized.materialized_if_supported} (#{batch.select(:id).limit(SUB_BATCH_SIZE).to_sql})
+ UPDATE topics
+ SET total_projects_count = (SELECT COUNT(*) FROM project_topics WHERE topic_id = batched_relation.id)
+ FROM batched_relation
+ WHERE topics.id = batched_relation.id
+ SQL
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/cache/ci/project_pipeline_status.rb b/lib/gitlab/cache/ci/project_pipeline_status.rb
index 137f76bc96d..99ce1119c17 100644
--- a/lib/gitlab/cache/ci/project_pipeline_status.rb
+++ b/lib/gitlab/cache/ci/project_pipeline_status.rb
@@ -69,7 +69,7 @@ module Gitlab
self.sha = commit.sha
self.status = commit.status
- self.ref = project.default_branch
+ self.ref = project.repository.root_ref
end
# We only cache the status for the HEAD commit of a project
@@ -79,7 +79,7 @@ module Gitlab
return unless sha
return unless ref
- if commit.sha == sha && project.default_branch == ref
+ if commit.sha == sha && project.repository.root_ref == ref
store_in_cache
end
end
diff --git a/lib/gitlab/cache/import/caching.rb b/lib/gitlab/cache/import/caching.rb
index 947efee43a9..4dbce0b05e1 100644
--- a/lib/gitlab/cache/import/caching.rb
+++ b/lib/gitlab/cache/import/caching.rb
@@ -84,8 +84,10 @@ module Gitlab
key = cache_key_for(raw_key)
Redis::Cache.with do |redis|
- redis.incr(key)
+ value = redis.incr(key)
redis.expire(key, timeout)
+
+ value
end
end
diff --git a/lib/gitlab/chat/command.rb b/lib/gitlab/chat/command.rb
index 0add53f8174..9370c594ce1 100644
--- a/lib/gitlab/chat/command.rb
+++ b/lib/gitlab/chat/command.rb
@@ -66,7 +66,8 @@ module Gitlab
def build_environment_variables(pipeline)
pipeline.variables.build(
[{ key: 'CHAT_INPUT', value: arguments },
- { key: 'CHAT_CHANNEL', value: channel }]
+ { key: 'CHAT_CHANNEL', value: channel },
+ { key: 'CHAT_USER_ID', value: chat_name.chat_id }]
)
end
diff --git a/lib/gitlab/checks/matching_merge_request.rb b/lib/gitlab/checks/matching_merge_request.rb
index e37cbc0442b..e5ce862264f 100644
--- a/lib/gitlab/checks/matching_merge_request.rb
+++ b/lib/gitlab/checks/matching_merge_request.rb
@@ -13,23 +13,21 @@ module Gitlab
end
def match?
- if ::Gitlab::Database::LoadBalancing.enable?
- # When a user merges a merge request, the following sequence happens:
- #
- # 1. Sidekiq: MergeService runs and updates the merge request in a locked state.
- # 2. Gitaly: The UserMergeBranch RPC runs.
- # 3. Gitaly (gitaly-ruby): This RPC calls the pre-receive hook.
- # 4. Rails: This hook makes an API request to /api/v4/internal/allowed.
- # 5. Rails: This API check does a SQL query for locked merge
- # requests with a matching SHA.
- #
- # Since steps 1 and 5 will happen on different database
- # sessions, replication lag could erroneously cause step 5 to
- # report no matching merge requests. To avoid this, we check
- # the write location to ensure the replica can make this query.
- track_session_metrics do
- ::Gitlab::Database::LoadBalancing::Sticking.select_valid_host(:project, @project.id)
- end
+ # When a user merges a merge request, the following sequence happens:
+ #
+ # 1. Sidekiq: MergeService runs and updates the merge request in a locked state.
+ # 2. Gitaly: The UserMergeBranch RPC runs.
+ # 3. Gitaly (gitaly-ruby): This RPC calls the pre-receive hook.
+ # 4. Rails: This hook makes an API request to /api/v4/internal/allowed.
+ # 5. Rails: This API check does a SQL query for locked merge
+ # requests with a matching SHA.
+ #
+ # Since steps 1 and 5 will happen on different database
+ # sessions, replication lag could erroneously cause step 5 to
+ # report no matching merge requests. To avoid this, we check
+ # the write location to ensure the replica can make this query.
+ track_session_metrics do
+ ::ApplicationRecord.sticking.select_valid_host(:project, @project.id)
end
# rubocop: disable CodeReuse/ActiveRecord
diff --git a/lib/gitlab/ci/badge/coverage/report.rb b/lib/gitlab/ci/badge/coverage/report.rb
index 28863a0703b..78b51dbdaf0 100644
--- a/lib/gitlab/ci/badge/coverage/report.rb
+++ b/lib/gitlab/ci/badge/coverage/report.rb
@@ -15,7 +15,10 @@ module Gitlab::Ci
@job = opts[:job]
@customization = {
key_width: opts[:key_width].to_i,
- key_text: opts[:key_text]
+ key_text: opts[:key_text],
+ min_good: opts[:min_good].to_i,
+ min_acceptable: opts[:min_acceptable].to_i,
+ min_medium: opts[:min_medium].to_i
}
end
diff --git a/lib/gitlab/ci/badge/coverage/template.rb b/lib/gitlab/ci/badge/coverage/template.rb
index 96702420e9d..f12b4f2dbfb 100644
--- a/lib/gitlab/ci/badge/coverage/template.rb
+++ b/lib/gitlab/ci/badge/coverage/template.rb
@@ -16,12 +16,20 @@ module Gitlab::Ci
low: '#e05d44',
unknown: '#9f9f9f'
}.freeze
+ COVERAGE_MAX = 100
+ COVERAGE_MIN = 0
+ MIN_GOOD_DEFAULT = 95
+ MIN_ACCEPTABLE_DEFAULT = 90
+ MIN_MEDIUM_DEFAULT = 75
def initialize(badge)
@entity = badge.entity
@status = badge.status
@key_text = badge.customization.dig(:key_text)
@key_width = badge.customization.dig(:key_width)
+ @min_good = badge.customization.dig(:min_good)
+ @min_acceptable = badge.customization.dig(:min_acceptable)
+ @min_medium = badge.customization.dig(:min_medium)
end
def value_text
@@ -32,12 +40,36 @@ module Gitlab::Ci
@status ? 54 : 58
end
+ def min_good_value
+ if @min_good && @min_good.between?(3, COVERAGE_MAX)
+ @min_good
+ else
+ MIN_GOOD_DEFAULT
+ end
+ end
+
+ def min_acceptable_value
+ if @min_acceptable && @min_acceptable.between?(2, min_good_value - 1)
+ @min_acceptable
+ else
+ [MIN_ACCEPTABLE_DEFAULT, (min_good_value - 1)].min
+ end
+ end
+
+ def min_medium_value
+ if @min_medium && @min_medium.between?(1, min_acceptable_value - 1)
+ @min_medium
+ else
+ [MIN_MEDIUM_DEFAULT, (min_acceptable_value - 1)].min
+ end
+ end
+
def value_color
case @status
- when 95..100 then STATUS_COLOR[:good]
- when 90..95 then STATUS_COLOR[:acceptable]
- when 75..90 then STATUS_COLOR[:medium]
- when 0..75 then STATUS_COLOR[:low]
+ when min_good_value..COVERAGE_MAX then STATUS_COLOR[:good]
+ when min_acceptable_value..min_good_value then STATUS_COLOR[:acceptable]
+ when min_medium_value..min_acceptable_value then STATUS_COLOR[:medium]
+ when COVERAGE_MIN..min_medium_value then STATUS_COLOR[:low]
else
STATUS_COLOR[:unknown]
end
diff --git a/lib/gitlab/ci/build/auto_retry.rb b/lib/gitlab/ci/build/auto_retry.rb
index b98d1d7b330..6ab567dff7c 100644
--- a/lib/gitlab/ci/build/auto_retry.rb
+++ b/lib/gitlab/ci/build/auto_retry.rb
@@ -9,7 +9,8 @@ class Gitlab::Ci::Build::AutoRetry
RETRY_OVERRIDES = {
ci_quota_exceeded: 0,
- no_matching_runner: 0
+ no_matching_runner: 0,
+ missing_dependency_failure: 0
}.freeze
def initialize(build)
diff --git a/lib/gitlab/ci/config/external/mapper.rb b/lib/gitlab/ci/config/external/mapper.rb
index 97e4922b2a1..95f1a842c50 100644
--- a/lib/gitlab/ci/config/external/mapper.rb
+++ b/lib/gitlab/ci/config/external/mapper.rb
@@ -58,9 +58,6 @@ module Gitlab
end
def verify_rules(location)
- # Behaves like there is no `rules`
- return location unless ::Feature.enabled?(:ci_include_rules, context.project, default_enabled: :yaml)
-
return unless Rules.new(location[:rules]).evaluate(context).pass?
location
diff --git a/lib/gitlab/ci/config/external/rules.rb b/lib/gitlab/ci/config/external/rules.rb
index 5a788427172..95470537de3 100644
--- a/lib/gitlab/ci/config/external/rules.rb
+++ b/lib/gitlab/ci/config/external/rules.rb
@@ -5,7 +5,13 @@ module Gitlab
class Config
module External
class Rules
+ ALLOWED_KEYS = Entry::Include::Rules::Rule::ALLOWED_KEYS
+
+ InvalidIncludeRulesError = Class.new(Mapper::Error)
+
def initialize(rule_hashes)
+ validate(rule_hashes)
+
@rule_list = Build::Rules::Rule.fabricate_list(rule_hashes)
end
@@ -19,6 +25,16 @@ module Gitlab
@rule_list.find { |rule| rule.matches?(nil, context) }
end
+ def validate(rule_hashes)
+ return unless rule_hashes.is_a?(Array)
+
+ rule_hashes.each do |rule_hash|
+ next if (rule_hash.keys - ALLOWED_KEYS).empty?
+
+ raise InvalidIncludeRulesError, "invalid include rule: #{rule_hash}"
+ end
+ end
+
Result = Struct.new(:result) do
def pass?
!!result
diff --git a/lib/gitlab/ci/pipeline/chain/validate/external.rb b/lib/gitlab/ci/pipeline/chain/validate/external.rb
index 27bb7fdc05a..28ba1cd4d47 100644
--- a/lib/gitlab/ci/pipeline/chain/validate/external.rb
+++ b/lib/gitlab/ci/pipeline/chain/validate/external.rb
@@ -91,7 +91,8 @@ module Gitlab
email: current_user.email,
created_at: current_user.created_at&.iso8601,
current_sign_in_ip: current_user.current_sign_in_ip,
- last_sign_in_ip: current_user.last_sign_in_ip
+ last_sign_in_ip: current_user.last_sign_in_ip,
+ sign_in_count: current_user.sign_in_count
},
pipeline: {
sha: pipeline.sha,
diff --git a/lib/gitlab/ci/pipeline/metrics.rb b/lib/gitlab/ci/pipeline/metrics.rb
index 28df9f5386c..321efa7854f 100644
--- a/lib/gitlab/ci/pipeline/metrics.rb
+++ b/lib/gitlab/ci/pipeline/metrics.rb
@@ -65,13 +65,6 @@ module Gitlab
Gitlab::Metrics.counter(name, comment)
end
- def self.legacy_update_jobs_counter
- name = :ci_legacy_update_jobs_as_retried_total
- comment = 'Counter of occurrences when jobs were not being set as retried before update_retried'
-
- Gitlab::Metrics.counter(name, comment)
- end
-
def self.pipeline_failure_reason_counter
name = :gitlab_ci_pipeline_failure_reasons
comment = 'Counter of pipeline failure reasons'
@@ -92,14 +85,6 @@ module Gitlab
Gitlab::Metrics.counter(name, comment)
end
-
- def self.gitlab_ci_difference_live_vs_actual_minutes
- name = :gitlab_ci_difference_live_vs_actual_minutes
- comment = 'Comparison between CI minutes consumption from live tracking vs actual consumption'
- labels = {}
- buckets = [-120.0, -60.0, -30.0, -10.0, -5.0, -3.0, -1.0, 0.0, 1.0, 3.0, 5.0, 10.0, 30.0, 60.0, 120.0]
- ::Gitlab::Metrics.histogram(name, comment, labels, buckets)
- end
end
end
end
diff --git a/lib/gitlab/ci/pipeline/seed/build.rb b/lib/gitlab/ci/pipeline/seed/build.rb
index 934bf22d8ad..9ad5d6538b7 100644
--- a/lib/gitlab/ci/pipeline/seed/build.rb
+++ b/lib/gitlab/ci/pipeline/seed/build.rb
@@ -106,10 +106,15 @@ module Gitlab
environment = Seed::Environment.new(build).to_resource
- # If there is a validation error on environment creation, such as
- # the name contains invalid character, the build falls back to a
- # non-environment job.
unless environment.persisted?
+ if Feature.enabled?(:surface_environment_creation_failure, build.project, default_enabled: :yaml) &&
+ Feature.disabled?(:surface_environment_creation_failure_override, build.project)
+ return { status: :failed, failure_reason: :environment_creation_failure }
+ end
+
+ # If there is a validation error on environment creation, such as
+ # the name contains invalid character, the build falls back to a
+ # non-environment job.
Gitlab::ErrorTracking.track_exception(
EnvironmentCreationFailure.new,
project_id: build.project_id,
diff --git a/lib/gitlab/ci/reports/security/flag.rb b/lib/gitlab/ci/reports/security/flag.rb
index 7e6cc758864..8370dd60418 100644
--- a/lib/gitlab/ci/reports/security/flag.rb
+++ b/lib/gitlab/ci/reports/security/flag.rb
@@ -20,7 +20,7 @@ module Gitlab
@description = description
end
- def to_hash
+ def to_h
{
flag_type: flag_type,
origin: origin,
diff --git a/lib/gitlab/ci/reports/security/vulnerability_reports_comparer.rb b/lib/gitlab/ci/reports/security/vulnerability_reports_comparer.rb
index 6cb2e0ddb33..4be4cf62e7b 100644
--- a/lib/gitlab/ci/reports/security/vulnerability_reports_comparer.rb
+++ b/lib/gitlab/ci/reports/security/vulnerability_reports_comparer.rb
@@ -80,6 +80,8 @@ module Gitlab
matcher = FindingMatcher.new(head_findings)
base_findings.each do |base_finding|
+ next if base_finding.requires_manual_resolution?
+
matched_head_finding = matcher.find_and_remove_match!(base_finding)
@fixed_findings << base_finding if matched_head_finding.nil?
diff --git a/lib/gitlab/ci/status/build/failed.rb b/lib/gitlab/ci/status/build/failed.rb
index ee210e51232..b0f12ff7517 100644
--- a/lib/gitlab/ci/status/build/failed.rb
+++ b/lib/gitlab/ci/status/build/failed.rb
@@ -33,7 +33,8 @@ module Gitlab
ci_quota_exceeded: 'no more CI minutes available',
no_matching_runner: 'no matching runner available',
trace_size_exceeded: 'log size limit exceeded',
- builds_disabled: 'project builds are disabled'
+ builds_disabled: 'project builds are disabled',
+ environment_creation_failure: 'environment creation failure'
}.freeze
private_constant :REASONS
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 e0627b85aba..65a58130962 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.12.0'
+ DAST_AUTO_DEPLOY_IMAGE_VERSION: 'v2.14.0'
.dast-auto-deploy:
image: "registry.gitlab.com/gitlab-org/cluster-integration/auto-deploy-image:${DAST_AUTO_DEPLOY_IMAGE_VERSION}"
diff --git a/lib/gitlab/ci/templates/Jobs/Deploy.gitlab-ci.yml b/lib/gitlab/ci/templates/Jobs/Deploy.gitlab-ci.yml
index 2df985cfbb5..58f13746a1f 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.12.0'
+ AUTO_DEPLOY_IMAGE_VERSION: 'v2.14.0'
.auto-deploy:
image: "registry.gitlab.com/gitlab-org/cluster-integration/auto-deploy-image:${AUTO_DEPLOY_IMAGE_VERSION}"
diff --git a/lib/gitlab/ci/templates/Jobs/SAST.gitlab-ci.yml b/lib/gitlab/ci/templates/Jobs/SAST.gitlab-ci.yml
index 917a28bb1ee..37a746a223c 100644
--- a/lib/gitlab/ci/templates/Jobs/SAST.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Jobs/SAST.gitlab-ci.yml
@@ -253,6 +253,7 @@ semgrep-sast:
- '**/*.ts'
- '**/*.tsx'
- '**/*.c'
+ - '**/*.go'
sobelow-sast:
extends: .sast-analyzer
diff --git a/lib/gitlab/ci/templates/npm.gitlab-ci.yml b/lib/gitlab/ci/templates/npm.gitlab-ci.yml
index bfea437b8f1..64c784f43cb 100644
--- a/lib/gitlab/ci/templates/npm.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/npm.gitlab-ci.yml
@@ -11,7 +11,7 @@ publish:
changes:
- package.json
script:
- # If no .npmrc if included in the repo, generate a temporary one that is configured to publish to GitLab's NPM registry
+ # If no .npmrc is included in the repo, generate a temporary one that is configured to publish to GitLab's NPM registry
- |
if [[ ! -f .npmrc ]]; then
echo 'No .npmrc found! Creating one now. Please review the following link for more information: https://docs.gitlab.com/ee/user/packages/npm_registry/index.html#project-level-npm-endpoint-1'
diff --git a/lib/gitlab/ci/trace.rb b/lib/gitlab/ci/trace.rb
index 72a94dcd412..25075cc8f90 100644
--- a/lib/gitlab/ci/trace.rb
+++ b/lib/gitlab/ci/trace.rb
@@ -25,7 +25,7 @@ module Gitlab
delegate :old_trace, to: :job
delegate :can_attempt_archival_now?, :increment_archival_attempts!,
- :archival_attempts_message, to: :trace_metadata
+ :archival_attempts_message, :archival_attempts_available?, to: :trace_metadata
def initialize(job)
@job = job
@@ -122,6 +122,10 @@ module Gitlab
end
end
+ def attempt_archive_cleanup!
+ destroy_any_orphan_trace_data!
+ end
+
def update_interval
if being_watched?
UPDATE_FREQUENCY_WHEN_BEING_WATCHED
@@ -191,7 +195,10 @@ module Gitlab
def unsafe_archive!
raise ArchiveError, 'Job is not finished yet' unless job.complete?
- unsafe_trace_conditionally_cleanup_before_retry!
+ already_archived?.tap do |archived|
+ destroy_any_orphan_trace_data!
+ raise AlreadyArchivedError, 'Could not archive again' if archived
+ end
if job.trace_chunks.any?
Gitlab::Ci::Trace::ChunkedIO.new(job) do |stream|
@@ -214,16 +221,15 @@ module Gitlab
def already_archived?
# TODO check checksum to ensure archive completed successfully
# See https://gitlab.com/gitlab-org/gitlab/-/issues/259619
- trace_artifact.archived_trace_exists?
+ trace_artifact&.archived_trace_exists?
end
- def unsafe_trace_conditionally_cleanup_before_retry!
+ def destroy_any_orphan_trace_data!
return unless trace_artifact
if already_archived?
# An archive already exists, so make sure to remove the trace chunks
erase_trace_chunks!
- raise AlreadyArchivedError, 'Could not archive again'
else
# An archive already exists, but its associated file does not, so remove it
trace_artifact.destroy!
@@ -236,35 +242,7 @@ module Gitlab
end
def archive_stream!(stream)
- clone_file!(stream, JobArtifactUploader.workhorse_upload_path) do |clone_path|
- create_build_trace!(job, clone_path)
- end
- end
-
- def clone_file!(src_stream, temp_dir)
- FileUtils.mkdir_p(temp_dir)
- Dir.mktmpdir("tmp-trace-#{job.id}", temp_dir) do |dir_path|
- temp_path = File.join(dir_path, "job.log")
- FileUtils.touch(temp_path)
- size = IO.copy_stream(src_stream, temp_path)
- raise ArchiveError, 'Failed to copy stream' unless size == src_stream.size
-
- yield(temp_path)
- end
- end
-
- def create_build_trace!(job, path)
- File.open(path) do |stream|
- # TODO: Set `file_format: :raw` after we've cleaned up legacy traces migration
- # https://gitlab.com/gitlab-org/gitlab-foss/merge_requests/20307
- trace_artifact = job.create_job_artifacts_trace!(
- project: job.project,
- file_type: :trace,
- file: stream,
- file_sha256: self.class.hexdigest(path))
-
- trace_metadata.track_archival!(trace_artifact.id)
- end
+ ::Gitlab::Ci::Trace::Archive.new(job, trace_metadata).execute!(stream)
end
def trace_metadata
@@ -314,7 +292,8 @@ module Gitlab
def destroy_stream(build)
if consistent_archived_trace?(build)
- ::Gitlab::Database::LoadBalancing::Sticking
+ ::Ci::Build
+ .sticking
.stick(LOAD_BALANCING_STICKING_NAMESPACE, build.id)
end
@@ -323,7 +302,8 @@ module Gitlab
def read_trace_artifact(build)
if consistent_archived_trace?(build)
- ::Gitlab::Database::LoadBalancing::Sticking
+ ::Ci::Build
+ .sticking
.unstick_or_continue_sticking(LOAD_BALANCING_STICKING_NAMESPACE, build.id)
end
diff --git a/lib/gitlab/ci/trace/archive.rb b/lib/gitlab/ci/trace/archive.rb
new file mode 100644
index 00000000000..5047cf04562
--- /dev/null
+++ b/lib/gitlab/ci/trace/archive.rb
@@ -0,0 +1,77 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Ci
+ class Trace
+ class Archive
+ include ::Gitlab::Utils::StrongMemoize
+ include Checksummable
+
+ def initialize(job, trace_metadata, metrics = ::Gitlab::Ci::Trace::Metrics.new)
+ @job = job
+ @trace_metadata = trace_metadata
+ @metrics = metrics
+ end
+
+ def execute!(stream)
+ clone_file!(stream, JobArtifactUploader.workhorse_upload_path) do |clone_path|
+ md5_checksum = self.class.md5_hexdigest(clone_path)
+ sha256_checksum = self.class.sha256_hexdigest(clone_path)
+
+ job.transaction do
+ self.trace_artifact = create_build_trace!(clone_path, sha256_checksum)
+ trace_metadata.track_archival!(trace_artifact.id, md5_checksum)
+ end
+ end
+
+ validate_archived_trace
+ end
+
+ private
+
+ attr_reader :job, :trace_metadata, :metrics
+ attr_accessor :trace_artifact
+
+ def clone_file!(src_stream, temp_dir)
+ FileUtils.mkdir_p(temp_dir)
+ Dir.mktmpdir("tmp-trace-#{job.id}", temp_dir) do |dir_path|
+ temp_path = File.join(dir_path, "job.log")
+ FileUtils.touch(temp_path)
+ size = IO.copy_stream(src_stream, temp_path)
+ raise ::Gitlab::Ci::Trace::ArchiveError, 'Failed to copy stream' unless size == src_stream.size
+
+ yield(temp_path)
+ end
+ end
+
+ def create_build_trace!(path, file_sha256)
+ File.open(path) do |stream|
+ # TODO: Set `file_format: :raw` after we've cleaned up legacy traces migration
+ # https://gitlab.com/gitlab-org/gitlab-foss/merge_requests/20307
+ job.create_job_artifacts_trace!(
+ project: job.project,
+ file_type: :trace,
+ file: stream,
+ file_sha256: file_sha256)
+ end
+ end
+
+ def validate_archived_trace
+ return unless remote_checksum
+
+ trace_metadata.update!(remote_checksum: remote_checksum)
+
+ unless trace_metadata.remote_checksum_valid?
+ metrics.increment_error_counter(type: :archive_invalid_checksum)
+ end
+ end
+
+ def remote_checksum
+ strong_memoize(:remote_checksum) do
+ ::Gitlab::Ci::Trace::RemoteChecksum.new(trace_artifact).md5_checksum
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/ci/trace/metrics.rb b/lib/gitlab/ci/trace/metrics.rb
index fcd70634630..174a5f184ff 100644
--- a/lib/gitlab/ci/trace/metrics.rb
+++ b/lib/gitlab/ci/trace/metrics.rb
@@ -21,6 +21,12 @@ module Gitlab
:corrupted # malformed trace found after comparing CRC32 and size
].freeze
+ TRACE_ERROR_TYPES = [
+ :chunks_invalid_size, # used to be :corrupted
+ :chunks_invalid_checksum, # used to be :invalid
+ :archive_invalid_checksum # malformed trace found into object store after comparing MD5
+ ].freeze
+
def increment_trace_operation(operation: :unknown)
unless OPERATIONS.include?(operation)
raise ArgumentError, "unknown trace operation: #{operation}"
@@ -33,6 +39,14 @@ module Gitlab
self.class.trace_bytes.increment({}, size.to_i)
end
+ def increment_error_counter(type: :unknown)
+ unless TRACE_ERROR_TYPES.include?(type)
+ raise ArgumentError, "unknown error type: #{type}"
+ end
+
+ self.class.trace_errors_counter.increment(type: type)
+ end
+
def observe_migration_duration(seconds)
self.class.finalize_histogram.observe({}, seconds.to_f)
end
@@ -65,6 +79,15 @@ module Gitlab
::Gitlab::Metrics.histogram(name, comment, labels, buckets)
end
end
+
+ def self.trace_errors_counter
+ strong_memoize(:trace_errors_counter) do
+ name = :gitlab_ci_build_trace_errors_total
+ comment = 'Total amount of different error types on a build trace'
+
+ Gitlab::Metrics.counter(name, comment)
+ end
+ end
end
end
end
diff --git a/lib/gitlab/ci/trace/remote_checksum.rb b/lib/gitlab/ci/trace/remote_checksum.rb
new file mode 100644
index 00000000000..d57f3888ec0
--- /dev/null
+++ b/lib/gitlab/ci/trace/remote_checksum.rb
@@ -0,0 +1,75 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Ci
+ class Trace
+ ##
+ # RemoteChecksum class is responsible for fetching the MD5 checksum of
+ # an uploaded build trace.
+ #
+ class RemoteChecksum
+ include Gitlab::Utils::StrongMemoize
+
+ def initialize(trace_artifact)
+ @trace_artifact = trace_artifact
+ end
+
+ def md5_checksum
+ strong_memoize(:md5_checksum) do
+ fetch_md5_checksum
+ end
+ end
+
+ private
+
+ attr_reader :trace_artifact
+ delegate :aws?, :google?, to: :object_store_config, prefix: :provider
+
+ def fetch_md5_checksum
+ return unless Feature.enabled?(:ci_archived_build_trace_checksum, trace_artifact.project, default_enabled: :yaml)
+ return unless object_store_config.enabled?
+ return if trace_artifact.local_store?
+
+ remote_checksum_value
+ end
+
+ def remote_checksum_value
+ strong_memoize(:remote_checksum_value) do
+ if provider_google?
+ checksum_from_google
+ elsif provider_aws?
+ checksum_from_aws
+ end
+ end
+ end
+
+ def object_store_config
+ strong_memoize(:object_store_config) do
+ trace_artifact.file.class.object_store_config
+ end
+ end
+
+ def checksum_from_google
+ content_md5 = upload_attributes.fetch(:content_md5)
+
+ Base64
+ .decode64(content_md5)
+ .unpack1('H*')
+ end
+
+ def checksum_from_aws
+ upload_attributes.fetch(:etag)
+ end
+
+ # Carrierwave caches attributes for the local file and does not replace
+ # them with the ones from object store after the upload completes.
+ # We need to force it to fetch them directly from the object store.
+ def upload_attributes
+ strong_memoize(:upload_attributes) do
+ ::Ci::JobArtifact.find(trace_artifact.id).file.file.attributes
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/content_security_policy/config_loader.rb b/lib/gitlab/content_security_policy/config_loader.rb
index bdcedd1896d..0e3fa8b8d87 100644
--- a/lib/gitlab/content_security_policy/config_loader.rb
+++ b/lib/gitlab/content_security_policy/config_loader.rb
@@ -35,6 +35,10 @@ module Gitlab
# However Safari seems to read child-src first so we'll just keep both equal
directives['child_src'] = directives['frame_src']
+ # connect_src with 'self' includes https/wss variations of the origin,
+ # however, safari hasn't covered this yet and we need to explicitly add
+ # support for websocket origins until Safari catches up with the specs
+ allow_websocket_connections(directives)
allow_webpack_dev_server(directives) if Rails.env.development?
allow_cdn(directives, Settings.gitlab.cdn_host) if Settings.gitlab.cdn_host.present?
allow_customersdot(directives) if Rails.env.development? && ENV['CUSTOMER_PORTAL_URL'].present?
@@ -67,6 +71,22 @@ module Gitlab
arguments.strip.split(' ').map(&:strip)
end
+ def self.allow_websocket_connections(directives)
+ http_ports = [80, 443]
+ host = Gitlab.config.gitlab.host
+ port = Gitlab.config.gitlab.port
+ secure = Gitlab.config.gitlab.https
+ protocol = secure ? 'wss' : 'ws'
+
+ ws_url = "#{protocol}://#{host}"
+
+ unless http_ports.include?(port)
+ ws_url = "#{ws_url}:#{port}"
+ end
+
+ append_to_directive(directives, 'connect_src', ws_url)
+ end
+
def self.allow_webpack_dev_server(directives)
secure = Settings.webpack.dev_server['https']
host_and_port = "#{Settings.webpack.dev_server['host']}:#{Settings.webpack.dev_server['port']}"
diff --git a/lib/gitlab/database.rb b/lib/gitlab/database.rb
index 385ac40cf13..b560d4cbca8 100644
--- a/lib/gitlab/database.rb
+++ b/lib/gitlab/database.rb
@@ -49,18 +49,29 @@ module Gitlab
# It does not include the default public schema
EXTRA_SCHEMAS = [DYNAMIC_PARTITIONS_SCHEMA, STATIC_PARTITIONS_SCHEMA].freeze
- DATABASES = ActiveRecord::Base
- .connection_handler
- .connection_pools
- .each_with_object({}) do |pool, hash|
- hash[pool.db_config.name.to_sym] = Connection.new(pool.connection_klass)
- end
- .freeze
-
PRIMARY_DATABASE_NAME = ActiveRecord::Base.connection_db_config.name.to_sym
+ def self.database_base_models
+ @database_base_models ||= {
+ # Note that we use ActiveRecord::Base here and not ApplicationRecord.
+ # This is deliberate, as we also use these classes to apply load
+ # balancing to, and the load balancer must be enabled for _all_ models
+ # that inher from ActiveRecord::Base; not just our own models that
+ # inherit from ApplicationRecord.
+ main: ::ActiveRecord::Base,
+ ci: ::Ci::CiDatabaseRecord.connection_class? ? ::Ci::CiDatabaseRecord : nil
+ }.compact.freeze
+ end
+
+ def self.databases
+ @databases ||= database_base_models
+ .transform_values { |connection_class| Connection.new(connection_class) }
+ .with_indifferent_access
+ .freeze
+ end
+
def self.main
- DATABASES[PRIMARY_DATABASE_NAME]
+ databases[PRIMARY_DATABASE_NAME]
end
# We configure the database connection pool size automatically based on the
@@ -99,7 +110,7 @@ module Gitlab
def self.check_postgres_version_and_print_warning
return if Gitlab::Runtime.rails_runner?
- DATABASES.each do |name, connection|
+ databases.each do |name, connection|
next if connection.postgresql_minimum_supported_version?
Kernel.warn ERB.new(Rainbow.new.wrap(<<~EOS).red).result
@@ -111,7 +122,7 @@ module Gitlab
â€â–ˆâ–ˆâ–ˆâ€â–ˆâ–ˆâ–ˆâ€â€â–ˆâ–ˆâ€ ██â€â–ˆâ–ˆâ€ ██â€â–ˆâ–ˆâ€ â€â–ˆâ–ˆâ–ˆâ–ˆâ€â–ˆâ–ˆâ€â–ˆâ–ˆâ€ â€â–ˆâ–ˆâ–ˆâ–ˆâ€â€â–ˆâ–ˆâ–ˆâ–ˆâ–ˆâ–ˆâ€â€
******************************************************************************
- You are using PostgreSQL <%= Gitlab::Database.main.version %> for the #{name} database, but PostgreSQL >= <%= Gitlab::Database::MINIMUM_POSTGRES_VERSION %>
+ You are using PostgreSQL #{connection.version} for the #{name} database, but PostgreSQL >= <%= Gitlab::Database::MINIMUM_POSTGRES_VERSION %>
is required for this version of GitLab.
<% if Rails.env.development? || Rails.env.test? %>
If using gitlab-development-kit, please find the relevant steps here:
diff --git a/lib/gitlab/database/count.rb b/lib/gitlab/database/count.rb
index eac61254bdf..ce61c1ba9ad 100644
--- a/lib/gitlab/database/count.rb
+++ b/lib/gitlab/database/count.rb
@@ -35,7 +35,17 @@ module Gitlab
#
# @param [Array]
# @return [Hash] of Model -> count mapping
- def self.approximate_counts(models, strategies: [TablesampleCountStrategy, ReltuplesCountStrategy, ExactCountStrategy])
+ def self.approximate_counts(models, strategies: [])
+ if strategies.empty?
+ # ExactCountStrategy is the only strategy working on read-only DBs, as others make
+ # use of tuple stats which use the primary DB to estimate tables size in a transaction.
+ strategies = if ::Gitlab::Database.read_write?
+ [TablesampleCountStrategy, ReltuplesCountStrategy, ExactCountStrategy]
+ else
+ [ExactCountStrategy]
+ end
+ end
+
strategies.each_with_object({}) do |strategy, counts_by_model|
models_with_missing_counts = models - counts_by_model.keys
diff --git a/lib/gitlab/database/load_balancing.rb b/lib/gitlab/database/load_balancing.rb
index bbfbf83222f..3e322e752b7 100644
--- a/lib/gitlab/database/load_balancing.rb
+++ b/lib/gitlab/database/load_balancing.rb
@@ -4,72 +4,34 @@ module Gitlab
module Database
module LoadBalancing
# The exceptions raised for connection errors.
- CONNECTION_ERRORS = if defined?(PG)
- [
- PG::ConnectionBad,
- PG::ConnectionDoesNotExist,
- PG::ConnectionException,
- PG::ConnectionFailure,
- PG::UnableToSend,
- # During a failover this error may be raised when
- # writing to a primary.
- PG::ReadOnlySqlTransaction
- ].freeze
- else
- [].freeze
- end
-
- ProxyNotConfiguredError = Class.new(StandardError)
-
- # The connection proxy to use for load balancing (if enabled).
- def self.proxy
- unless load_balancing_proxy = ActiveRecord::Base.load_balancing_proxy
- Gitlab::ErrorTracking.track_exception(
- ProxyNotConfiguredError.new(
- "Attempting to access the database load balancing proxy, but it wasn't configured.\n" \
- "Did you forget to call '#{self.name}.configure_proxy'?"
- ))
- end
-
- load_balancing_proxy
- end
-
- # Returns a Hash containing the load balancing configuration.
- def self.configuration
- @configuration ||= Configuration.for_model(ActiveRecord::Base)
- end
-
- # Returns true if load balancing is to be enabled.
- def self.enable?
- return false if Gitlab::Runtime.rake?
-
- configured?
- end
+ CONNECTION_ERRORS = [
+ PG::ConnectionBad,
+ PG::ConnectionDoesNotExist,
+ PG::ConnectionException,
+ PG::ConnectionFailure,
+ PG::UnableToSend,
+ # During a failover this error may be raised when
+ # writing to a primary.
+ PG::ReadOnlySqlTransaction,
+ # This error is raised when we can't connect to the database in the
+ # first place (e.g. it's offline or the hostname is incorrect).
+ ActiveRecord::ConnectionNotEstablished
+ ].freeze
- def self.configured?
- configuration.load_balancing_enabled? ||
- configuration.service_discovery_enabled?
+ def self.base_models
+ @base_models ||= ::Gitlab::Database.database_base_models.values.freeze
end
- def self.start_service_discovery
- return unless configuration.service_discovery_enabled?
+ def self.each_load_balancer
+ return to_enum(__method__) unless block_given?
- ServiceDiscovery
- .new(proxy.load_balancer, **configuration.service_discovery)
- .start
+ base_models.each do |model|
+ yield model.connection.load_balancer
+ end
end
- # Configures proxying of requests.
- def self.configure_proxy
- lb = LoadBalancer.new(configuration, primary_only: !enable?)
- ActiveRecord::Base.load_balancing_proxy = ConnectionProxy.new(lb)
-
- # Populate service discovery immediately if it is configured
- if configuration.service_discovery_enabled?
- ServiceDiscovery
- .new(lb, **configuration.service_discovery)
- .perform_service_discovery
- end
+ def self.release_hosts
+ each_load_balancer(&:release_host)
end
DB_ROLES = [
diff --git a/lib/gitlab/database/load_balancing/action_cable_callbacks.rb b/lib/gitlab/database/load_balancing/action_cable_callbacks.rb
index 4feba989a0a..7164976ff73 100644
--- a/lib/gitlab/database/load_balancing/action_cable_callbacks.rb
+++ b/lib/gitlab/database/load_balancing/action_cable_callbacks.rb
@@ -16,7 +16,7 @@ module Gitlab
inner.call
ensure
- ::Gitlab::Database::LoadBalancing.proxy.load_balancer.release_host
+ ::Gitlab::Database::LoadBalancing.release_hosts
::Gitlab::Database::LoadBalancing::Session.clear_session
end
end
diff --git a/lib/gitlab/database/load_balancing/active_record_proxy.rb b/lib/gitlab/database/load_balancing/active_record_proxy.rb
deleted file mode 100644
index deaea62d774..00000000000
--- a/lib/gitlab/database/load_balancing/active_record_proxy.rb
+++ /dev/null
@@ -1,15 +0,0 @@
-# frozen_string_literal: true
-
-module Gitlab
- module Database
- module LoadBalancing
- # Module injected into ActiveRecord::Base to allow hijacking of the
- # "connection" method.
- module ActiveRecordProxy
- def connection
- ::Gitlab::Database::LoadBalancing.proxy
- end
- end
- end
- end
-end
diff --git a/lib/gitlab/database/load_balancing/configuration.rb b/lib/gitlab/database/load_balancing/configuration.rb
index 238f55fd98e..6156515bd73 100644
--- a/lib/gitlab/database/load_balancing/configuration.rb
+++ b/lib/gitlab/database/load_balancing/configuration.rb
@@ -72,7 +72,14 @@ module Gitlab
Database.default_pool_size
end
+ # Returns `true` if the use of load balancing replicas should be
+ # enabled.
+ #
+ # This is disabled for Rake tasks to ensure e.g. database migrations
+ # always produce consistent results.
def load_balancing_enabled?
+ return false if Gitlab::Runtime.rake?
+
hosts.any? || service_discovery_enabled?
end
diff --git a/lib/gitlab/database/load_balancing/host.rb b/lib/gitlab/database/load_balancing/host.rb
index acd7df0a263..bdbb80d6f31 100644
--- a/lib/gitlab/database/load_balancing/host.rb
+++ b/lib/gitlab/database/load_balancing/host.rb
@@ -9,19 +9,12 @@ module Gitlab
delegate :connection, :release_connection, :enable_query_cache!, :disable_query_cache!, :query_cache_enabled, to: :pool
- CONNECTION_ERRORS =
- if defined?(PG)
- [
- ActionView::Template::Error,
- ActiveRecord::StatementInvalid,
- PG::Error
- ].freeze
- else
- [
- ActionView::Template::Error,
- ActiveRecord::StatementInvalid
- ].freeze
- end
+ CONNECTION_ERRORS = [
+ ActionView::Template::Error,
+ ActiveRecord::StatementInvalid,
+ ActiveRecord::ConnectionNotEstablished,
+ PG::Error
+ ].freeze
# host - The address of the database.
# load_balancer - The LoadBalancer that manages this Host.
diff --git a/lib/gitlab/database/load_balancing/load_balancer.rb b/lib/gitlab/database/load_balancing/load_balancer.rb
index 9b00b323301..cc9ca325337 100644
--- a/lib/gitlab/database/load_balancing/load_balancer.rb
+++ b/lib/gitlab/database/load_balancing/load_balancer.rb
@@ -12,22 +12,26 @@ module Gitlab
REPLICA_SUFFIX = '_replica'
- attr_reader :host_list, :configuration
+ attr_reader :name, :host_list, :configuration
# configuration - An instance of `LoadBalancing::Configuration` that
# contains the configuration details (such as the hosts)
# for this load balancer.
- # primary_only - If set, the replicas are ignored and the primary is
- # always used.
- def initialize(configuration, primary_only: false)
+ def initialize(configuration)
@configuration = configuration
- @primary_only = primary_only
+ @primary_only = !configuration.load_balancing_enabled?
@host_list =
- if primary_only
+ if @primary_only
HostList.new([PrimaryHost.new(self)])
else
HostList.new(configuration.hosts.map { |addr| Host.new(addr, self) })
end
+
+ @name = @configuration.model.connection_db_config.name.to_sym
+ end
+
+ def primary_only?
+ @primary_only
end
def disconnect!(timeout: 120)
@@ -151,6 +155,17 @@ module Gitlab
# Yields a block, retrying it upon error using an exponential backoff.
def retry_with_backoff(retries = 3, time = 2)
+ # In CI we only use the primary, but databases may not always be
+ # available (or take a few seconds to become available). Retrying in
+ # this case can slow down CI jobs. In addition, retrying with _only_
+ # a primary being present isn't all that helpful.
+ #
+ # To prevent this from happening, we don't make any attempt at
+ # retrying unless one or more replicas are used. This matches the
+ # behaviour from before we enabled load balancing code even if no
+ # replicas were configured.
+ return yield if primary_only?
+
retried = 0
last_error = nil
@@ -176,6 +191,11 @@ module Gitlab
def connection_error?(error)
case error
+ when ActiveRecord::NoDatabaseError
+ # Retrying this error isn't going to magically make the database
+ # appear. It also slows down CI jobs that are meant to create the
+ # database in the first place.
+ false
when ActiveRecord::StatementInvalid, ActionView::Template::Error
# After connecting to the DB Rails will wrap query errors using this
# class.
@@ -235,7 +255,7 @@ module Gitlab
@configuration.model.connection_specification_name,
role: ActiveRecord::Base.writing_role,
shard: ActiveRecord::Base.default_shard
- )
+ ) || raise(::ActiveRecord::ConnectionNotEstablished)
end
private
diff --git a/lib/gitlab/database/load_balancing/primary_host.rb b/lib/gitlab/database/load_balancing/primary_host.rb
index e379652c260..7070cc54d4b 100644
--- a/lib/gitlab/database/load_balancing/primary_host.rb
+++ b/lib/gitlab/database/load_balancing/primary_host.rb
@@ -11,6 +11,12 @@ module Gitlab
# balancing is enabled, but no replicas have been configured (= the
# default case).
class PrimaryHost
+ WAL_ERROR_MESSAGE = <<~MSG.strip
+ Obtaining WAL information when not using any replicas results in
+ redundant queries, and may break installations that don't support
+ streaming replication (e.g. AWS' Aurora database).
+ MSG
+
def initialize(load_balancer)
@load_balancer = load_balancer
end
@@ -51,30 +57,16 @@ module Gitlab
end
def primary_write_location
- @load_balancer.primary_write_location
+ raise NotImplementedError, WAL_ERROR_MESSAGE
end
def database_replica_location
- row = query_and_release(<<-SQL.squish)
- SELECT pg_last_wal_replay_lsn()::text AS location
- SQL
-
- row['location'] if row.any?
- rescue *Host::CONNECTION_ERRORS
- nil
+ raise NotImplementedError, WAL_ERROR_MESSAGE
end
def caught_up?(_location)
true
end
-
- def query_and_release(sql)
- connection.select_all(sql).first || {}
- rescue StandardError
- {}
- ensure
- release_connection
- end
end
end
end
diff --git a/lib/gitlab/database/load_balancing/rack_middleware.rb b/lib/gitlab/database/load_balancing/rack_middleware.rb
index f8a31622b7d..7ce7649cc22 100644
--- a/lib/gitlab/database/load_balancing/rack_middleware.rb
+++ b/lib/gitlab/database/load_balancing/rack_middleware.rb
@@ -9,23 +9,6 @@ module Gitlab
class RackMiddleware
STICK_OBJECT = 'load_balancing.stick_object'
- # Unsticks or continues sticking the current request.
- #
- # This method also updates the Rack environment so #call can later
- # determine if we still need to stick or not.
- #
- # env - The Rack environment.
- # namespace - The namespace to use for sticking.
- # id - The identifier to use for sticking.
- def self.stick_or_unstick(env, namespace, id)
- return unless ::Gitlab::Database::LoadBalancing.enable?
-
- ::Gitlab::Database::LoadBalancing::Sticking.unstick_or_continue_sticking(namespace, id)
-
- env[STICK_OBJECT] ||= Set.new
- env[STICK_OBJECT] << [namespace, id]
- end
-
def initialize(app)
@app = app
end
@@ -53,41 +36,46 @@ module Gitlab
# Typically this code will only be reachable for Rails requests as
# Grape data is not yet available at this point.
def unstick_or_continue_sticking(env)
- namespaces_and_ids = sticking_namespaces_and_ids(env)
+ namespaces_and_ids = sticking_namespaces(env)
- namespaces_and_ids.each do |namespace, id|
- ::Gitlab::Database::LoadBalancing::Sticking.unstick_or_continue_sticking(namespace, id)
+ namespaces_and_ids.each do |(model, namespace, id)|
+ model.sticking.unstick_or_continue_sticking(namespace, id)
end
end
# Determine if we need to stick after handling a request.
def stick_if_necessary(env)
- namespaces_and_ids = sticking_namespaces_and_ids(env)
+ namespaces_and_ids = sticking_namespaces(env)
- namespaces_and_ids.each do |namespace, id|
- ::Gitlab::Database::LoadBalancing::Sticking.stick_if_necessary(namespace, id)
+ namespaces_and_ids.each do |model, namespace, id|
+ model.sticking.stick_if_necessary(namespace, id)
end
end
def clear
- load_balancer.release_host
+ ::Gitlab::Database::LoadBalancing.release_hosts
::Gitlab::Database::LoadBalancing::Session.clear_session
end
- def load_balancer
- ::Gitlab::Database::LoadBalancing.proxy.load_balancer
- end
-
# Determines the sticking namespace and identifier based on the Rack
# environment.
#
# For Rails requests this uses warden, but Grape and others have to
# manually set the right environment variable.
- def sticking_namespaces_and_ids(env)
+ def sticking_namespaces(env)
warden = env['warden']
if warden && warden.user
- [[:user, warden.user.id]]
+ # When sticking per user, _only_ sticking the main connection could
+ # result in the application trying to read data from a different
+ # connection, while that data isn't available yet.
+ #
+ # To prevent this from happening, we scope sticking to all the
+ # models that support load balancing. In the future (if we
+ # determined this to be OK) we may be able to relax this.
+ ::Gitlab::Database::LoadBalancing.base_models.map do |model|
+ [model, :user, warden.user.id]
+ end
elsif env[STICK_OBJECT].present?
env[STICK_OBJECT].to_a
else
diff --git a/lib/gitlab/database/load_balancing/setup.rb b/lib/gitlab/database/load_balancing/setup.rb
new file mode 100644
index 00000000000..3cce839a960
--- /dev/null
+++ b/lib/gitlab/database/load_balancing/setup.rb
@@ -0,0 +1,61 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Database
+ module LoadBalancing
+ # Class for setting up load balancing of a specific model.
+ class Setup
+ attr_reader :configuration
+
+ def initialize(model, start_service_discovery: false)
+ @model = model
+ @configuration = Configuration.for_model(model)
+ @start_service_discovery = start_service_discovery
+ end
+
+ def setup
+ disable_prepared_statements
+ setup_load_balancer
+ setup_service_discovery
+ end
+
+ def disable_prepared_statements
+ db_config_object = @model.connection_db_config
+ config =
+ db_config_object.configuration_hash.merge(prepared_statements: false)
+
+ hash_config = ActiveRecord::DatabaseConfigurations::HashConfig.new(
+ db_config_object.env_name,
+ db_config_object.name,
+ config
+ )
+
+ @model.establish_connection(hash_config)
+ end
+
+ def setup_load_balancer
+ lb = LoadBalancer.new(configuration)
+
+ # We just use a simple `class_attribute` here so we don't need to
+ # inject any modules and/or expose unnecessary methods.
+ @model.class_attribute(:connection)
+ @model.class_attribute(:sticking)
+
+ @model.connection = ConnectionProxy.new(lb)
+ @model.sticking = Sticking.new(lb)
+ end
+
+ def setup_service_discovery
+ return unless configuration.service_discovery_enabled?
+
+ lb = @model.connection.load_balancer
+ sv = ServiceDiscovery.new(lb, **configuration.service_discovery)
+
+ sv.perform_service_discovery
+
+ sv.start if @start_service_discovery
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/database/load_balancing/sidekiq_client_middleware.rb b/lib/gitlab/database/load_balancing/sidekiq_client_middleware.rb
index 518a812b406..62dfe75a851 100644
--- a/lib/gitlab/database/load_balancing/sidekiq_client_middleware.rb
+++ b/lib/gitlab/database/load_balancing/sidekiq_client_middleware.rb
@@ -30,26 +30,26 @@ module Gitlab
end
def set_data_consistency_locations!(job)
- # Once we add support for multiple databases to our load balancer, we would use something like this:
- # job['wal_locations'] = Gitlab::Database::DATABASES.transform_values do |connection|
- # connection.load_balancer.primary_write_location
- # end
- #
- job['wal_locations'] = { Gitlab::Database::MAIN_DATABASE_NAME.to_sym => wal_location } if wal_location
- end
+ locations = {}
- def wal_location
- strong_memoize(:wal_location) do
- if Session.current.use_primary?
- load_balancer.primary_write_location
- else
- load_balancer.host.database_replica_location
+ ::Gitlab::Database::LoadBalancing.each_load_balancer do |lb|
+ if (location = wal_location_for(lb))
+ locations[lb.name] = location
end
end
+
+ job['wal_locations'] = locations
end
- def load_balancer
- LoadBalancing.proxy.load_balancer
+ def wal_location_for(load_balancer)
+ # When only using the primary there's no need for any WAL queries.
+ return if load_balancer.primary_only?
+
+ if ::Gitlab::Database::LoadBalancing::Session.current.use_primary?
+ load_balancer.primary_write_location
+ else
+ load_balancer.host.database_replica_location
+ end
end
end
end
diff --git a/lib/gitlab/database/load_balancing/sidekiq_server_middleware.rb b/lib/gitlab/database/load_balancing/sidekiq_server_middleware.rb
index 15f8f0fb240..f0c7016032b 100644
--- a/lib/gitlab/database/load_balancing/sidekiq_server_middleware.rb
+++ b/lib/gitlab/database/load_balancing/sidekiq_server_middleware.rb
@@ -29,7 +29,7 @@ module Gitlab
private
def clear
- release_hosts
+ LoadBalancing.release_hosts
Session.clear_session
end
@@ -44,7 +44,7 @@ module Gitlab
return :primary_no_wal unless wal_locations
- if all_databases_has_replica_caught_up?(wal_locations)
+ if databases_in_sync?(wal_locations)
# Happy case: we can read from a replica.
retried_before?(worker_class, job) ? :replica_retried : :replica
elsif can_retry?(worker_class, job)
@@ -89,27 +89,18 @@ module Gitlab
job['retry_count'].nil?
end
- def all_databases_has_replica_caught_up?(wal_locations)
- wal_locations.all? do |_config_name, location|
- # Once we add support for multiple databases to our load balancer, we would use something like this:
- # Gitlab::Database::DATABASES[config_name].load_balancer.select_up_to_date_host(location)
- load_balancer.select_up_to_date_host(location)
+ def databases_in_sync?(wal_locations)
+ LoadBalancing.each_load_balancer.all? do |lb|
+ if (location = wal_locations[lb.name])
+ lb.select_up_to_date_host(location)
+ else
+ # If there's no entry for a load balancer it means the Sidekiq
+ # job doesn't care for it. In this case we'll treat the load
+ # balancer as being in sync.
+ true
+ end
end
end
-
- def release_hosts
- # Once we add support for multiple databases to our load balancer, we would use something like this:
- # connection.load_balancer.primary_write_location
- #
- # Gitlab::Database::DATABASES.values.each do |connection|
- # connection.load_balancer.release_host
- # end
- load_balancer.release_host
- end
-
- def load_balancer
- LoadBalancing.proxy.load_balancer
- end
end
end
end
diff --git a/lib/gitlab/database/load_balancing/sticking.rb b/lib/gitlab/database/load_balancing/sticking.rb
index 20d42b9a694..df4ad18581f 100644
--- a/lib/gitlab/database/load_balancing/sticking.rb
+++ b/lib/gitlab/database/load_balancing/sticking.rb
@@ -5,36 +5,47 @@ module Gitlab
module LoadBalancing
# Module used for handling sticking connections to a primary, if
# necessary.
- #
- # ## Examples
- #
- # Sticking a user to the primary:
- #
- # Sticking.stick_if_necessary(:user, current_user.id)
- #
- # To unstick if possible, or continue using the primary otherwise:
- #
- # Sticking.unstick_or_continue_sticking(:user, current_user.id)
- module Sticking
+ class Sticking
# The number of seconds after which a session should stop reading from
# the primary.
EXPIRATION = 30
- # Sticks to the primary if a write was performed.
- def self.stick_if_necessary(namespace, id)
- return unless LoadBalancing.enable?
+ def initialize(load_balancer)
+ @load_balancer = load_balancer
+ @model = load_balancer.configuration.model
+ end
- stick(namespace, id) if Session.current.performed_write?
+ # Unsticks or continues sticking the current request.
+ #
+ # This method also updates the Rack environment so #call can later
+ # determine if we still need to stick or not.
+ #
+ # env - The Rack environment.
+ # namespace - The namespace to use for sticking.
+ # id - The identifier to use for sticking.
+ # model - The ActiveRecord model to scope sticking to.
+ def stick_or_unstick_request(env, namespace, id)
+ unstick_or_continue_sticking(namespace, id)
+
+ env[RackMiddleware::STICK_OBJECT] ||= Set.new
+ env[RackMiddleware::STICK_OBJECT] << [@model, namespace, id]
+ end
+
+ # Sticks to the primary if a write was performed.
+ def stick_if_necessary(namespace, id)
+ stick(namespace, id) if ::Gitlab::Database::LoadBalancing::Session.current.performed_write?
end
- # Checks if we are caught-up with all the work
- def self.all_caught_up?(namespace, id)
+ def all_caught_up?(namespace, id)
location = last_write_location_for(namespace, id)
return true unless location
- load_balancer.select_up_to_date_host(location).tap do |found|
- ActiveSupport::Notifications.instrument('caught_up_replica_pick.load_balancing', { result: found } )
+ @load_balancer.select_up_to_date_host(location).tap do |found|
+ ActiveSupport::Notifications.instrument(
+ 'caught_up_replica_pick.load_balancing',
+ { result: found }
+ )
unstick(namespace, id) if found
end
@@ -45,7 +56,7 @@ module Gitlab
# in another thread.
#
# Returns true if one host was selected.
- def self.select_caught_up_replicas(namespace, id)
+ def select_caught_up_replicas(namespace, id)
location = last_write_location_for(namespace, id)
# Unlike all_caught_up?, we return false if no write location exists.
@@ -53,95 +64,92 @@ module Gitlab
# write location. If no such location exists, err on the side of caution.
return false unless location
- load_balancer.select_up_to_date_host(location).tap do |selected|
+ @load_balancer.select_up_to_date_host(location).tap do |selected|
unstick(namespace, id) if selected
end
end
# Sticks to the primary if necessary, otherwise unsticks an object (if
# it was previously stuck to the primary).
- def self.unstick_or_continue_sticking(namespace, id)
- Session.current.use_primary! unless all_caught_up?(namespace, id)
+ def unstick_or_continue_sticking(namespace, id)
+ return if all_caught_up?(namespace, id)
+
+ ::Gitlab::Database::LoadBalancing::Session.current.use_primary!
end
# Select a replica that has caught up with the primary. If one has not been
# found, stick to the primary.
- def self.select_valid_host(namespace, id)
- replica_selected = select_caught_up_replicas(namespace, id)
+ def select_valid_host(namespace, id)
+ replica_selected =
+ select_caught_up_replicas(namespace, id)
- Session.current.use_primary! unless replica_selected
+ ::Gitlab::Database::LoadBalancing::Session.current.use_primary! unless replica_selected
end
# Starts sticking to the primary for the given namespace and id, using
# the latest WAL pointer from the primary.
- def self.stick(namespace, id)
- return unless LoadBalancing.enable?
-
+ def stick(namespace, id)
mark_primary_write_location(namespace, id)
- Session.current.use_primary!
+ ::Gitlab::Database::LoadBalancing::Session.current.use_primary!
end
- def self.bulk_stick(namespace, ids)
- return unless LoadBalancing.enable?
-
+ def bulk_stick(namespace, ids)
with_primary_write_location do |location|
ids.each do |id|
set_write_location_for(namespace, id, location)
end
end
- Session.current.use_primary!
+ ::Gitlab::Database::LoadBalancing::Session.current.use_primary!
end
- def self.with_primary_write_location
- return unless LoadBalancing.configured?
+ def with_primary_write_location
+ # When only using the primary, there's no point in getting write
+ # locations, as the primary is always in sync with itself.
+ return if @load_balancer.primary_only?
- # Load balancing could be enabled for the Web application server,
- # but it's not activated for Sidekiq. We should update Redis with
- # the write location just in case load balancing is being used.
- location =
- if LoadBalancing.enable?
- load_balancer.primary_write_location
- else
- Gitlab::Database.main.get_write_location(ActiveRecord::Base.connection)
- end
+ location = @load_balancer.primary_write_location
return if location.blank?
yield(location)
end
- def self.mark_primary_write_location(namespace, id)
+ def mark_primary_write_location(namespace, id)
with_primary_write_location do |location|
set_write_location_for(namespace, id, location)
end
end
- # Stops sticking to the primary.
- def self.unstick(namespace, id)
+ def unstick(namespace, id)
Gitlab::Redis::SharedState.with do |redis|
redis.del(redis_key_for(namespace, id))
+ redis.del(old_redis_key_for(namespace, id))
end
end
- def self.set_write_location_for(namespace, id, location)
+ def set_write_location_for(namespace, id, location)
Gitlab::Redis::SharedState.with do |redis|
redis.set(redis_key_for(namespace, id), location, ex: EXPIRATION)
+ redis.set(old_redis_key_for(namespace, id), location, ex: EXPIRATION)
end
end
- def self.last_write_location_for(namespace, id)
+ def last_write_location_for(namespace, id)
Gitlab::Redis::SharedState.with do |redis|
- redis.get(redis_key_for(namespace, id))
+ redis.get(redis_key_for(namespace, id)) ||
+ redis.get(old_redis_key_for(namespace, id))
end
end
- def self.redis_key_for(namespace, id)
- "database-load-balancing/write-location/#{namespace}/#{id}"
+ def redis_key_for(namespace, id)
+ name = @load_balancer.name
+
+ "database-load-balancing/write-location/#{name}/#{namespace}/#{id}"
end
- def self.load_balancer
- LoadBalancing.proxy.load_balancer
+ def old_redis_key_for(namespace, id)
+ "database-load-balancing/write-location/#{namespace}/#{id}"
end
end
end
diff --git a/lib/gitlab/database/migrations/background_migration_helpers.rb b/lib/gitlab/database/migrations/background_migration_helpers.rb
index 19d80ba1d64..bdaf0d35a83 100644
--- a/lib/gitlab/database/migrations/background_migration_helpers.rb
+++ b/lib/gitlab/database/migrations/background_migration_helpers.rb
@@ -106,7 +106,7 @@ module Gitlab
final_delay = 0
batch_counter = 0
- model_class.each_batch(of: batch_size) do |relation, index|
+ model_class.each_batch(of: batch_size, column: primary_column_name) do |relation, index|
max = relation.arel_table[primary_column_name].maximum
min = relation.arel_table[primary_column_name].minimum
diff --git a/lib/gitlab/database/migrations/instrumentation.rb b/lib/gitlab/database/migrations/instrumentation.rb
index d1e55eb825c..6e5ffb74411 100644
--- a/lib/gitlab/database/migrations/instrumentation.rb
+++ b/lib/gitlab/database/migrations/instrumentation.rb
@@ -4,21 +4,21 @@ module Gitlab
module Database
module Migrations
class Instrumentation
- RESULT_DIR = Rails.root.join('tmp', 'migration-testing').freeze
STATS_FILENAME = 'migration-stats.json'
attr_reader :observations
- def initialize(observer_classes = ::Gitlab::Database::Migrations::Observers.all_observers)
+ def initialize(result_dir:, observer_classes: ::Gitlab::Database::Migrations::Observers.all_observers)
@observer_classes = observer_classes
@observations = []
+ @result_dir = result_dir
end
def observe(version:, name:, &block)
observation = Observation.new(version, name)
observation.success = true
- observers = observer_classes.map { |c| c.new(observation) }
+ observers = observer_classes.map { |c| c.new(observation, @result_dir) }
exception = nil
diff --git a/lib/gitlab/database/migrations/observers/migration_observer.rb b/lib/gitlab/database/migrations/observers/migration_observer.rb
index 85d18abb9ef..106f8f1f829 100644
--- a/lib/gitlab/database/migrations/observers/migration_observer.rb
+++ b/lib/gitlab/database/migrations/observers/migration_observer.rb
@@ -5,11 +5,12 @@ module Gitlab
module Migrations
module Observers
class MigrationObserver
- attr_reader :connection, :observation
+ attr_reader :connection, :observation, :output_dir
- def initialize(observation)
+ def initialize(observation, output_dir)
@connection = ActiveRecord::Base.connection
@observation = observation
+ @output_dir = output_dir
end
def before
diff --git a/lib/gitlab/database/migrations/observers/query_details.rb b/lib/gitlab/database/migrations/observers/query_details.rb
index dadacd2d2fc..8f4406e79a5 100644
--- a/lib/gitlab/database/migrations/observers/query_details.rb
+++ b/lib/gitlab/database/migrations/observers/query_details.rb
@@ -6,7 +6,7 @@ module Gitlab
module Observers
class QueryDetails < MigrationObserver
def before
- file_path = File.join(Instrumentation::RESULT_DIR, "#{observation.version}_#{observation.name}-query-details.json")
+ file_path = File.join(output_dir, "#{observation.version}_#{observation.name}-query-details.json")
@file = File.open(file_path, 'wb')
@writer = Oj::StreamWriter.new(@file, {})
@writer.push_array
diff --git a/lib/gitlab/database/migrations/observers/query_log.rb b/lib/gitlab/database/migrations/observers/query_log.rb
index e15d733d2a2..c42fd8bd23d 100644
--- a/lib/gitlab/database/migrations/observers/query_log.rb
+++ b/lib/gitlab/database/migrations/observers/query_log.rb
@@ -7,7 +7,7 @@ module Gitlab
class QueryLog < MigrationObserver
def before
@logger_was = ActiveRecord::Base.logger
- file_path = File.join(Instrumentation::RESULT_DIR, "#{observation.version}_#{observation.name}.log")
+ file_path = File.join(output_dir, "#{observation.version}_#{observation.name}.log")
@logger = Logger.new(file_path)
ActiveRecord::Base.logger = @logger
end
diff --git a/lib/gitlab/database/migrations/runner.rb b/lib/gitlab/database/migrations/runner.rb
new file mode 100644
index 00000000000..b267a64256b
--- /dev/null
+++ b/lib/gitlab/database/migrations/runner.rb
@@ -0,0 +1,92 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Database
+ module Migrations
+ class Runner
+ BASE_RESULT_DIR = Rails.root.join('tmp', 'migration-testing').freeze
+
+ class << self
+ def up
+ Runner.new(direction: :up, migrations: migrations_for_up, result_dir: BASE_RESULT_DIR.join('up'))
+ end
+
+ def down
+ Runner.new(direction: :down, migrations: migrations_for_down, result_dir: BASE_RESULT_DIR.join('down'))
+ end
+
+ def migration_context
+ @migration_context ||= ApplicationRecord.connection.migration_context
+ end
+
+ private
+
+ def migrations_for_up
+ existing_versions = migration_context.get_all_versions.to_set
+
+ migration_context.migrations.reject do |migration|
+ existing_versions.include?(migration.version)
+ end
+ end
+
+ def migration_file_names_this_branch
+ `git diff --name-only origin/HEAD...HEAD db/post_migrate db/migrate`.split("\n")
+ end
+
+ def migrations_for_down
+ versions_this_branch = migration_file_names_this_branch.map do |m_name|
+ m_name.match(%r{^db/(post_)?migrate/(\d+)}) { |m| m.captures[1]&.to_i }
+ end.to_set
+
+ existing_versions = migration_context.get_all_versions.to_set
+ migration_context.migrations.select do |migration|
+ existing_versions.include?(migration.version) && versions_this_branch.include?(migration.version)
+ end
+ end
+ end
+
+ attr_reader :direction, :result_dir, :migrations
+
+ delegate :migration_context, to: :class
+
+ def initialize(direction:, migrations:, result_dir:)
+ raise "Direction must be up or down" unless %i[up down].include?(direction)
+
+ @direction = direction
+ @migrations = migrations
+ @result_dir = result_dir
+ end
+
+ def run
+ FileUtils.mkdir_p(result_dir)
+
+ verbose_was = ActiveRecord::Migration.verbose
+ ActiveRecord::Migration.verbose = true
+
+ sorted_migrations = migrations.sort_by(&:version)
+ sorted_migrations.reverse! if direction == :down
+
+ instrumentation = Instrumentation.new(result_dir: result_dir)
+
+ sorted_migrations.each do |migration|
+ instrumentation.observe(version: migration.version, name: migration.name) do
+ ActiveRecord::Migrator.new(direction, migration_context.migrations, migration_context.schema_migration, migration.version).run
+ end
+ end
+ ensure
+ if instrumentation
+ File.open(File.join(result_dir, Gitlab::Database::Migrations::Instrumentation::STATS_FILENAME), 'wb+') do |io|
+ io << instrumentation.observations.to_json
+ end
+ end
+
+ # We clear the cache here to mirror the cache clearing that happens at the end of `db:migrate` tasks
+ # This clearing makes subsequent rake tasks in the same execution pick up database schema changes caused by
+ # the migrations that were just executed
+ ApplicationRecord.clear_cache!
+ ActiveRecord::Migration.verbose = verbose_was
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/database/partitioning.rb b/lib/gitlab/database/partitioning.rb
index bbde2063c41..71fb995577a 100644
--- a/lib/gitlab/database/partitioning.rb
+++ b/lib/gitlab/database/partitioning.rb
@@ -14,6 +14,10 @@ module Gitlab
def self.sync_partitions(models_to_sync = registered_models)
MultiDatabasePartitionManager.new(models_to_sync).sync_partitions
end
+
+ def self.drop_detached_partitions
+ MultiDatabasePartitionDropper.new.drop_detached_partitions
+ end
end
end
end
diff --git a/lib/gitlab/database/partitioning/detached_partition_dropper.rb b/lib/gitlab/database/partitioning/detached_partition_dropper.rb
index dc63d93fd07..3e7ddece20b 100644
--- a/lib/gitlab/database/partitioning/detached_partition_dropper.rb
+++ b/lib/gitlab/database/partitioning/detached_partition_dropper.rb
@@ -7,18 +7,15 @@ module Gitlab
return unless Feature.enabled?(:drop_detached_partitions, default_enabled: :yaml)
Gitlab::AppLogger.info(message: "Checking for previously detached partitions to drop")
+
Postgresql::DetachedPartition.ready_to_drop.find_each do |detached_partition|
- conn.transaction do
+ connection.transaction do
# Another process may have already dropped the table and deleted this entry
next unless (detached_partition = Postgresql::DetachedPartition.lock.find_by(id: detached_partition.id))
- unless check_partition_detached?(detached_partition)
- Gitlab::AppLogger.error(message: "Attempt to drop attached database partition", partition_name: detached_partition.table_name)
- detached_partition.destroy!
- next
- end
+ drop_detached_partition(detached_partition.table_name)
- drop_one(detached_partition)
+ detached_partition.destroy!
end
rescue StandardError => e
Gitlab::AppLogger.error(message: "Failed to drop previously detached partition",
@@ -30,25 +27,30 @@ module Gitlab
private
- def drop_one(detached_partition)
- conn.transaction do
- conn.execute(<<~SQL)
- DROP TABLE #{Gitlab::Database::DYNAMIC_PARTITIONS_SCHEMA}.#{conn.quote_table_name(detached_partition.table_name)}
- SQL
+ def drop_detached_partition(partition_name)
+ partition_identifier = qualify_partition_name(partition_name)
+
+ if partition_detached?(partition_identifier)
+ connection.drop_table(partition_identifier, if_exists: true)
- detached_partition.destroy!
+ Gitlab::AppLogger.info(message: "Dropped previously detached partition", partition_name: partition_name)
+ else
+ Gitlab::AppLogger.error(message: "Attempt to drop attached database partition", partition_name: partition_name)
end
- Gitlab::AppLogger.info(message: "Dropped previously detached partition", partition_name: detached_partition.table_name)
end
- def check_partition_detached?(detached_partition)
+ def qualify_partition_name(table_name)
+ "#{Gitlab::Database::DYNAMIC_PARTITIONS_SCHEMA}.#{table_name}"
+ end
+
+ def partition_detached?(partition_identifier)
# PostgresPartition checks the pg_inherits view, so our partition will only show here if it's still attached
# and thus should not be dropped
- !PostgresPartition.for_identifier("#{Gitlab::Database::DYNAMIC_PARTITIONS_SCHEMA}.#{detached_partition.table_name}").exists?
+ !Gitlab::Database::PostgresPartition.for_identifier(partition_identifier).exists?
end
- def conn
- @conn ||= ApplicationRecord.connection
+ def connection
+ Postgresql::DetachedPartition.connection
end
end
end
diff --git a/lib/gitlab/database/partitioning/multi_database_partition_dropper.rb b/lib/gitlab/database/partitioning/multi_database_partition_dropper.rb
new file mode 100644
index 00000000000..769b658bae4
--- /dev/null
+++ b/lib/gitlab/database/partitioning/multi_database_partition_dropper.rb
@@ -0,0 +1,35 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Database
+ module Partitioning
+ class MultiDatabasePartitionDropper
+ def drop_detached_partitions
+ Gitlab::AppLogger.info(message: "Dropping detached postgres partitions")
+
+ each_database_connection do |name, connection|
+ Gitlab::Database::SharedModel.using_connection(connection) do
+ Gitlab::AppLogger.debug(message: "Switched database connection", connection_name: name)
+
+ DetachedPartitionDropper.new.perform
+ end
+ end
+
+ Gitlab::AppLogger.info(message: "Finished dropping detached postgres partitions")
+ end
+
+ private
+
+ def each_database_connection
+ databases.each_pair do |name, connection_wrapper|
+ yield name, connection_wrapper.scope.connection
+ end
+ end
+
+ def databases
+ Gitlab::Database.databases
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/database/shared_model.rb b/lib/gitlab/database/shared_model.rb
index 8f256758961..f304c32d731 100644
--- a/lib/gitlab/database/shared_model.rb
+++ b/lib/gitlab/database/shared_model.rb
@@ -2,6 +2,7 @@
module Gitlab
module Database
+ # This abstract class is used for models which need to exist in multiple de-composed databases.
class SharedModel < ActiveRecord::Base
self.abstract_class = true
diff --git a/lib/gitlab/diff/file.rb b/lib/gitlab/diff/file.rb
index 0ba23b8ffc7..1e6d80e1100 100644
--- a/lib/gitlab/diff/file.rb
+++ b/lib/gitlab/diff/file.rb
@@ -200,7 +200,7 @@ module Gitlab
Gitlab::Diff::Highlight.new(self, repository: self.repository).highlight
end
- # Array[<Hash>] with right/left keys that contains Gitlab::Diff::Line objects which text is hightlighted
+ # Array[<Hash>] with right/left keys that contains Gitlab::Diff::Line objects which text is highlighted
def parallel_diff_lines
@parallel_diff_lines ||= Gitlab::Diff::ParallelDiff.new(self).parallelize
end
diff --git a/lib/gitlab/doctor/secrets.rb b/lib/gitlab/doctor/secrets.rb
index 1a1e9fafb1e..44f5c97c70c 100644
--- a/lib/gitlab/doctor/secrets.rb
+++ b/lib/gitlab/doctor/secrets.rb
@@ -72,7 +72,7 @@ module Gitlab
end
def valid_attribute?(data, attr)
- data.public_send(attr) # rubocop:disable GitlabSecurity/PublicSend
+ data.send(attr) # rubocop:disable GitlabSecurity/PublicSend
true
rescue OpenSSL::Cipher::CipherError, TypeError
diff --git a/lib/gitlab/email/handler/create_merge_request_handler.rb b/lib/gitlab/email/handler/create_merge_request_handler.rb
index df12aea1988..c723c2762c7 100644
--- a/lib/gitlab/email/handler/create_merge_request_handler.rb
+++ b/lib/gitlab/email/handler/create_merge_request_handler.rb
@@ -61,7 +61,7 @@ module Gitlab
private
def build_merge_request
- MergeRequests::BuildService.new(project: project, current_user: author, params: merge_request_params).execute
+ ::MergeRequests::BuildService.new(project: project, current_user: author, params: merge_request_params).execute
end
def create_merge_request
@@ -78,7 +78,7 @@ module Gitlab
if merge_request.errors.any?
merge_request
else
- MergeRequests::CreateService.new(project: project, current_user: author).create(merge_request)
+ ::MergeRequests::CreateService.new(project: project, current_user: author).create(merge_request)
end
end
diff --git a/lib/gitlab/email/hook/smime_signature_interceptor.rb b/lib/gitlab/email/hook/smime_signature_interceptor.rb
index fe39589d019..0b092b3e41e 100644
--- a/lib/gitlab/email/hook/smime_signature_interceptor.rb
+++ b/lib/gitlab/email/hook/smime_signature_interceptor.rb
@@ -22,7 +22,7 @@ module Gitlab
private
def certificate
- @certificate ||= Gitlab::Email::Smime::Certificate.from_files(key_path, cert_path, ca_certs_path)
+ @certificate ||= Gitlab::X509::Certificate.from_files(key_path, cert_path, ca_certs_path)
end
def key_path
diff --git a/lib/gitlab/email/message/in_product_marketing/base.rb b/lib/gitlab/email/message/in_product_marketing/base.rb
index 96551c89837..c4895d35a14 100644
--- a/lib/gitlab/email/message/in_product_marketing/base.rb
+++ b/lib/gitlab/email/message/in_product_marketing/base.rb
@@ -50,7 +50,7 @@ module Gitlab
def cta_link
case format
when :html
- link_to cta_text, group_email_campaigns_url(group, track: track, series: series), target: '_blank', rel: 'noopener noreferrer'
+ ActionController::Base.helpers.link_to cta_text, group_email_campaigns_url(group, track: track, series: series), target: '_blank', rel: 'noopener noreferrer'
else
[cta_text, group_email_campaigns_url(group, track: track, series: series)].join(' >> ')
end
@@ -89,7 +89,7 @@ module Gitlab
case format
when :html
links.map do |text, link|
- link_to(text, link)
+ ActionController::Base.helpers.link_to(text, link)
end
else
'| ' + links.map do |text, link|
diff --git a/lib/gitlab/email/message/in_product_marketing/helper.rb b/lib/gitlab/email/message/in_product_marketing/helper.rb
index 4780e08322a..cec0aad44a6 100644
--- a/lib/gitlab/email/message/in_product_marketing/helper.rb
+++ b/lib/gitlab/email/message/in_product_marketing/helper.rb
@@ -7,7 +7,6 @@ module Gitlab
module Helper
include ActionView::Context
include ActionView::Helpers::TagHelper
- include ActionView::Helpers::UrlHelper
private
@@ -32,7 +31,7 @@ module Gitlab
def link(text, link)
case format
when :html
- link_to text, link
+ ActionController::Base.helpers.link_to text, link
else
"#{text} (#{link})"
end
diff --git a/lib/gitlab/email/message/in_product_marketing/trial.rb b/lib/gitlab/email/message/in_product_marketing/trial.rb
index 222046a3966..11a799886ab 100644
--- a/lib/gitlab/email/message/in_product_marketing/trial.rb
+++ b/lib/gitlab/email/message/in_product_marketing/trial.rb
@@ -15,7 +15,7 @@ module Gitlab
def tagline
[
- s_('InProductMarketing|Start a free trial of GitLab Ultimate – no CC required'),
+ s_('InProductMarketing|Start a free trial of GitLab Ultimate – no credit card required'),
s_('InProductMarketing|Improve app security with a 30-day trial'),
s_('InProductMarketing|Start with a GitLab Ultimate free trial')
][series]
diff --git a/lib/gitlab/email/smime/certificate.rb b/lib/gitlab/email/smime/certificate.rb
deleted file mode 100644
index 3607b95b4bc..00000000000
--- a/lib/gitlab/email/smime/certificate.rb
+++ /dev/null
@@ -1,58 +0,0 @@
-# frozen_string_literal: true
-
-module Gitlab
- module Email
- module Smime
- class Certificate
- CERT_REGEX = /-----BEGIN CERTIFICATE-----(?:.|\n)+?-----END CERTIFICATE-----/.freeze
-
- attr_reader :key, :cert, :ca_certs
-
- def key_string
- key.to_s
- end
-
- def cert_string
- cert.to_pem
- end
-
- def ca_certs_string
- ca_certs.map(&:to_pem).join('\n') unless ca_certs.blank?
- end
-
- def self.from_strings(key_string, cert_string, ca_certs_string = nil)
- key = OpenSSL::PKey::RSA.new(key_string)
- cert = OpenSSL::X509::Certificate.new(cert_string)
- ca_certs = load_ca_certs_bundle(ca_certs_string)
-
- new(key, cert, ca_certs)
- end
-
- def self.from_files(key_path, cert_path, ca_certs_path = nil)
- ca_certs_string = File.read(ca_certs_path) if ca_certs_path
-
- from_strings(File.read(key_path), File.read(cert_path), ca_certs_string)
- end
-
- # Returns an array of OpenSSL::X509::Certificate objects, empty array if none found
- #
- # Ruby OpenSSL::X509::Certificate.new will only load the first
- # certificate if a bundle is presented, this allows to parse multiple certs
- # in the same file
- def self.load_ca_certs_bundle(ca_certs_string)
- return [] unless ca_certs_string
-
- ca_certs_string.scan(CERT_REGEX).map do |ca_cert_string|
- OpenSSL::X509::Certificate.new(ca_cert_string)
- end
- end
-
- def initialize(key, cert, ca_certs = nil)
- @key = key
- @cert = cert
- @ca_certs = ca_certs
- end
- end
- end
- end
-end
diff --git a/lib/gitlab/endpoint_attributes.rb b/lib/gitlab/endpoint_attributes.rb
new file mode 100644
index 00000000000..2455e5e599f
--- /dev/null
+++ b/lib/gitlab/endpoint_attributes.rb
@@ -0,0 +1,48 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module EndpointAttributes
+ extend ActiveSupport::Concern
+ include Gitlab::ClassAttributes
+
+ DEFAULT_URGENCY = Config::REQUEST_URGENCIES.fetch(:default)
+
+ class_methods do
+ def feature_category(category, actions = [])
+ endpoint_attributes.set(actions, feature_category: category)
+ end
+
+ def feature_category_for_action(action)
+ category = endpoint_attributes.attribute_for_action(action, :feature_category)
+ category || superclass_feature_category_for_action(action)
+ end
+
+ def urgency(urgency_name, actions = [])
+ endpoint_attributes.set(actions, urgency: urgency_name)
+ end
+
+ def urgency_for_action(action)
+ urgency = endpoint_attributes.attribute_for_action(action, :urgency)
+ urgency || superclass_urgency_for_action(action) || DEFAULT_URGENCY
+ end
+
+ private
+
+ def endpoint_attributes
+ class_attributes[:endpoint_attributes_config] ||= Config.new
+ end
+
+ def superclass_feature_category_for_action(action)
+ return unless superclass.respond_to?(:feature_category_for_action)
+
+ superclass.feature_category_for_action(action)
+ end
+
+ def superclass_urgency_for_action(action)
+ return unless superclass.respond_to?(:urgency_for_action)
+
+ superclass.urgency_for_action(action)
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/endpoint_attributes/config.rb b/lib/gitlab/endpoint_attributes/config.rb
new file mode 100644
index 00000000000..e31a3095736
--- /dev/null
+++ b/lib/gitlab/endpoint_attributes/config.rb
@@ -0,0 +1,81 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module EndpointAttributes
+ class Config
+ RequestUrgency = Struct.new(:name, :duration)
+ REQUEST_URGENCIES = [
+ RequestUrgency.new(:high, 0.25),
+ RequestUrgency.new(:medium, 0.5),
+ RequestUrgency.new(:default, 1),
+ RequestUrgency.new(:low, 5)
+ ].index_by(&:name).freeze
+ SUPPORTED_ATTRIBUTES = %i[feature_category urgency].freeze
+
+ def initialize
+ @default_attributes = {}
+ @action_attributes = {}
+ end
+
+ def defined_actions
+ @action_attributes.keys
+ end
+
+ def set(actions, attributes)
+ sanitize_attributes!(attributes)
+
+ if actions.empty?
+ conflicted = conflicted_attributes(attributes, @default_attributes)
+ raise ArgumentError, "Attributes already defined: #{conflicted.join(", ")}" if conflicted.present?
+
+ @default_attributes.merge!(attributes)
+ else
+ set_attributes_for_actions(actions, attributes)
+ end
+
+ nil
+ end
+
+ def attribute_for_action(action, attribute_name)
+ value = @action_attributes.dig(action.to_s, attribute_name) || @default_attributes[attribute_name]
+ # Translate urgency to a representative struct
+ value = REQUEST_URGENCIES[value] if attribute_name == :urgency
+ value
+ end
+
+ private
+
+ def sanitize_attributes!(attributes)
+ unsupported_attributes = (attributes.keys - SUPPORTED_ATTRIBUTES).present?
+ raise ArgumentError, "Attributes not supported: #{unsupported_attributes.join(", ")}" if unsupported_attributes
+
+ if attributes[:urgency].present? && !REQUEST_URGENCIES.key?(attributes[:urgency])
+ raise ArgumentError, "Urgency not supported: #{attributes[:urgency]}"
+ end
+ end
+
+ def set_attributes_for_actions(actions, attributes)
+ conflicted = conflicted_attributes(attributes, @default_attributes)
+ if conflicted.present?
+ raise ArgumentError, "#{conflicted.join(", ")} are already defined for all actions, but re-defined for #{actions.join(", ")}"
+ end
+
+ actions.each do |action|
+ action = action.to_s
+ if @action_attributes[action].blank?
+ @action_attributes[action] = attributes.dup
+ else
+ conflicted = conflicted_attributes(attributes, @action_attributes[action])
+ raise ArgumentError, "Attributes re-defined for action #{action}: #{conflicted.join(", ")}" if conflicted.present?
+
+ @action_attributes[action].merge!(attributes)
+ end
+ end
+ end
+
+ def conflicted_attributes(attributes, existing_attributes)
+ attributes.keys.filter { |attr| existing_attributes[attr].present? && existing_attributes[attr] != attributes[attr] }
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/error_tracking/detailed_error.rb b/lib/gitlab/error_tracking/detailed_error.rb
index d0b3fc176aa..d9ddb6caeec 100644
--- a/lib/gitlab/error_tracking/detailed_error.rb
+++ b/lib/gitlab/error_tracking/detailed_error.rb
@@ -22,6 +22,7 @@ module Gitlab
:gitlab_issue,
:gitlab_project,
:id,
+ :integrated,
:last_release_last_commit,
:last_release_short_version,
:last_release_version,
diff --git a/lib/gitlab/experimentation.rb b/lib/gitlab/experimentation.rb
index c74bd8e75ef..c2009628c56 100644
--- a/lib/gitlab/experimentation.rb
+++ b/lib/gitlab/experimentation.rb
@@ -40,10 +40,6 @@ module Gitlab
},
invite_members_new_dropdown: {
tracking_category: 'Growth::Expansion::Experiment::InviteMembersNewDropdown'
- },
- show_trial_status_in_sidebar: {
- tracking_category: 'Growth::Conversion::Experiment::ShowTrialStatusInSidebar',
- rollout_strategy: :group
}
}.freeze
diff --git a/lib/gitlab/feature_categories.rb b/lib/gitlab/feature_categories.rb
new file mode 100644
index 00000000000..d06f3b14fed
--- /dev/null
+++ b/lib/gitlab/feature_categories.rb
@@ -0,0 +1,38 @@
+# frozen_string_literal: true
+
+module Gitlab
+ class FeatureCategories
+ FEATURE_CATEGORY_DEFAULT = 'unknown'
+
+ attr_reader :categories
+
+ def self.default
+ @default ||= self.load_from_yaml
+ end
+
+ def self.load_from_yaml
+ categories = YAML.load_file(Rails.root.join('config', 'feature_categories.yml'))
+
+ new(categories)
+ end
+
+ def initialize(categories)
+ @categories = categories.to_set
+ end
+
+ # If valid, returns a feature category from the given request.
+ def from_request(request)
+ category = request.headers["HTTP_X_GITLAB_FEATURE_CATEGORY"].presence
+
+ return unless category && valid?(category)
+
+ return unless ::Gitlab::RequestForgeryProtection.verified?(request.env)
+
+ category
+ end
+
+ def valid?(category)
+ categories.include?(category.to_s)
+ end
+ end
+end
diff --git a/lib/gitlab/form_builders/gitlab_ui_form_builder.rb b/lib/gitlab/form_builders/gitlab_ui_form_builder.rb
index a5290508e42..3f9053d4e0c 100644
--- a/lib/gitlab/form_builders/gitlab_ui_form_builder.rb
+++ b/lib/gitlab/form_builders/gitlab_ui_form_builder.rb
@@ -22,29 +22,53 @@ module Gitlab
format_options(checkbox_options, ['custom-control-input']),
checked_value,
unchecked_value
- ) +
- @template.label(
- @object_name, method, format_options(label_options, ['custom-control-label'])
- ) do
- if help_text
- @template.content_tag(
- :span,
- label
- ) +
- @template.content_tag(
- :p,
- help_text,
- class: 'help-text'
- )
- else
- label
- end
- end
+ ) + generic_label(method, label, label_options, help_text: help_text)
+ end
+ end
+
+ def gitlab_ui_radio_component(
+ method,
+ value,
+ label,
+ help_text: nil,
+ radio_options: {},
+ label_options: {}
+ )
+ @template.content_tag(
+ :div,
+ class: 'gl-form-radio custom-control custom-radio'
+ ) do
+ @template.radio_button(
+ @object_name,
+ method,
+ value,
+ format_options(radio_options, ['custom-control-input'])
+ ) + generic_label(method, label, label_options, help_text: help_text, value: value)
end
end
private
+ def generic_label(method, label, label_options, help_text: nil, value: nil)
+ @template.label(
+ @object_name, method, format_options(label_options.merge({ value: value }), ['custom-control-label'])
+ ) do
+ if help_text
+ @template.content_tag(
+ :span,
+ label
+ ) +
+ @template.content_tag(
+ :p,
+ help_text,
+ class: 'help-text'
+ )
+ else
+ label
+ end
+ end
+ end
+
def format_options(options, classes)
classes << options[:class]
diff --git a/lib/gitlab/git/keep_around.rb b/lib/gitlab/git/keep_around.rb
index b6fc335c979..38f0e47c4c7 100644
--- a/lib/gitlab/git/keep_around.rb
+++ b/lib/gitlab/git/keep_around.rb
@@ -19,7 +19,7 @@ module Gitlab
end
def execute(shas)
- shas.each do |sha|
+ shas.uniq.each do |sha|
next unless sha.present? && commit_by(oid: sha)
next if kept_around?(sha)
diff --git a/lib/gitlab/git/repository.rb b/lib/gitlab/git/repository.rb
index bc15bd367d8..473bc04661c 100644
--- a/lib/gitlab/git/repository.rb
+++ b/lib/gitlab/git/repository.rb
@@ -870,9 +870,9 @@ module Gitlab
end
end
- def squash(user, squash_id, start_sha:, end_sha:, author:, message:)
+ def squash(user, start_sha:, end_sha:, author:, message:)
wrapped_gitaly_errors do
- gitaly_operation_client.user_squash(user, squash_id, start_sha, end_sha, author, message)
+ gitaly_operation_client.user_squash(user, start_sha, end_sha, author, message)
end
end
diff --git a/lib/gitlab/gitaly_client/operation_service.rb b/lib/gitlab/gitaly_client/operation_service.rb
index fd794acb4dd..c17934f12c3 100644
--- a/lib/gitlab/gitaly_client/operation_service.rb
+++ b/lib/gitlab/gitaly_client/operation_service.rb
@@ -162,6 +162,14 @@ module Gitlab
raise Gitlab::Git::CommitError, 'failed to apply merge to branch' unless branch_update.commit_id.present?
Gitlab::Git::OperationService::BranchUpdate.from_gitaly(branch_update)
+
+ rescue GRPC::BadStatus => e
+ decoded_error = decode_detailed_error(e)
+
+ raise unless decoded_error.present?
+
+ raise decoded_error
+
ensure
request_enum.close
end
@@ -259,11 +267,10 @@ module Gitlab
request_enum.close
end
- def user_squash(user, squash_id, start_sha, end_sha, author, message, time = Time.now.utc)
+ def user_squash(user, start_sha, end_sha, author, message, time = Time.now.utc)
request = Gitaly::UserSquashRequest.new(
repository: @gitaly_repo,
user: Gitlab::Git::User.from_gitlab(user).to_gitaly,
- squash_id: squash_id.to_s,
start_sha: start_sha,
end_sha: end_sha,
author: Gitlab::Git::User.from_gitlab(author).to_gitaly,
@@ -471,6 +478,31 @@ module Gitlab
rescue RangeError
raise ArgumentError, "Unknown action '#{action[:action]}'"
end
+
+ def decode_detailed_error(err)
+ # details could have more than one in theory, but we only have one to worry about for now.
+ detailed_error = err.to_rpc_status&.details&.first
+
+ return unless detailed_error.present?
+
+ prefix = %r{type\.googleapis\.com\/gitaly\.(?<error_type>.+)}
+ error_type = prefix.match(detailed_error.type_url)[:error_type]
+
+ detailed_error = Gitaly.const_get(error_type, false).decode(detailed_error.value)
+
+ case detailed_error.error
+ when :access_check
+ access_check_error = detailed_error.access_check
+ # These messages were returned from internal/allowed API calls
+ Gitlab::Git::PreReceiveError.new(fallback_message: access_check_error.error_message)
+ else
+ # We're handling access_check only for now, but we'll add more detailed error types
+ nil
+ end
+ rescue NameError, NoMethodError
+ # Error Class might not be known to ruby yet
+ nil
+ end
end
end
end
diff --git a/lib/gitlab/github_import/parallel_importer.rb b/lib/gitlab/github_import/parallel_importer.rb
index 2429fa4de1d..f72e595e8e9 100644
--- a/lib/gitlab/github_import/parallel_importer.rb
+++ b/lib/gitlab/github_import/parallel_importer.rb
@@ -15,6 +15,10 @@ module Gitlab
true
end
+ def self.track_start_import(project)
+ Gitlab::Import::Metrics.new(:github_importer, project).track_start_import
+ end
+
# This is a workaround for a Ruby 2.3.7 bug. rspec-mocks cannot restore
# the visibility of prepended modules. See
# https://github.com/rspec/rspec-mocks/issues/1231 for more details.
diff --git a/lib/gitlab/github_import/parallel_scheduling.rb b/lib/gitlab/github_import/parallel_scheduling.rb
index 4d0074e43d7..a8e006ea082 100644
--- a/lib/gitlab/github_import/parallel_scheduling.rb
+++ b/lib/gitlab/github_import/parallel_scheduling.rb
@@ -53,7 +53,8 @@ module Gitlab
project_id: project.id,
error_source: self.class.name,
exception: e,
- fail_import: abort_on_failure
+ fail_import: abort_on_failure,
+ metrics: true
)
raise(e)
diff --git a/lib/gitlab/github_import/representation/diff_note.rb b/lib/gitlab/github_import/representation/diff_note.rb
index d0584cc6255..a3dcd2e380c 100644
--- a/lib/gitlab/github_import/representation/diff_note.rb
+++ b/lib/gitlab/github_import/representation/diff_note.rb
@@ -11,7 +11,7 @@ module Gitlab
expose_attribute :noteable_type, :noteable_id, :commit_id, :file_path,
:diff_hunk, :author, :note, :created_at, :updated_at,
- :github_id, :original_commit_id
+ :original_commit_id, :note_id
NOTEABLE_ID_REGEX = %r{/pull/(?<iid>\d+)}i.freeze
@@ -40,7 +40,9 @@ module Gitlab
note: note.body,
created_at: note.created_at,
updated_at: note.updated_at,
- github_id: note.id
+ note_id: note.id,
+ end_line: note.line,
+ start_line: note.start_line
}
new(hash)
@@ -82,6 +84,22 @@ module Gitlab
new_file: false
}
end
+
+ def note
+ @note ||= DiffNotes::SuggestionFormatter.formatted_note_for(
+ note: attributes[:note],
+ start_line: attributes[:start_line],
+ end_line: attributes[:end_line]
+ )
+ end
+
+ def github_identifiers
+ {
+ note_id: note_id,
+ noteable_id: noteable_id,
+ noteable_type: noteable_type
+ }
+ end
end
end
end
diff --git a/lib/gitlab/github_import/representation/diff_notes/suggestion_formatter.rb b/lib/gitlab/github_import/representation/diff_notes/suggestion_formatter.rb
new file mode 100644
index 00000000000..4e5855ee4cd
--- /dev/null
+++ b/lib/gitlab/github_import/representation/diff_notes/suggestion_formatter.rb
@@ -0,0 +1,66 @@
+# frozen_string_literal: true
+
+# This class replaces Github markdown suggestion tag with
+# a Gitlab suggestion tag. The difference between
+# Github's and Gitlab's suggestion tags is that Gitlab
+# includes the range of the suggestion in the tag, while Github
+# uses other note attributes to position the suggestion.
+module Gitlab
+ module GithubImport
+ module Representation
+ module DiffNotes
+ class SuggestionFormatter
+ # A github suggestion:
+ # - the ```suggestion tag must be the first text of the line
+ # - it might have up to 3 spaces before the ```suggestion tag
+ # - extra text on the ```suggestion tag line will be ignored
+ GITHUB_SUGGESTION = /^\ {,3}(?<suggestion>```suggestion\b).*(?<eol>\R)/.freeze
+
+ def self.formatted_note_for(...)
+ new(...).formatted_note
+ end
+
+ def initialize(note:, start_line: nil, end_line: nil)
+ @note = note
+ @start_line = start_line
+ @end_line = end_line
+ end
+
+ def formatted_note
+ if contains_suggestion?
+ note.gsub(
+ GITHUB_SUGGESTION,
+ "\\k<suggestion>:#{suggestion_range}\\k<eol>"
+ )
+ else
+ note
+ end
+ end
+
+ private
+
+ attr_reader :note, :start_line, :end_line
+
+ def contains_suggestion?
+ note.to_s.match?(GITHUB_SUGGESTION)
+ end
+
+ # Github always saves the comment on the _last_ line of the range.
+ # Therefore, the diff hunk will always be related to lines before
+ # the comment itself.
+ def suggestion_range
+ "-#{line_count}+0"
+ end
+
+ def line_count
+ if start_line.present?
+ end_line - start_line
+ else
+ 0
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/github_import/representation/issue.rb b/lib/gitlab/github_import/representation/issue.rb
index 0e04b5ad57f..db4a8188c03 100644
--- a/lib/gitlab/github_import/representation/issue.rb
+++ b/lib/gitlab/github_import/representation/issue.rb
@@ -25,7 +25,6 @@ module Gitlab
hash = {
iid: issue.number,
- github_id: issue.number,
title: issue.title,
description: issue.body,
milestone_number: issue.milestone&.number,
@@ -75,6 +74,13 @@ module Gitlab
def issuable_type
pull_request? ? 'MergeRequest' : 'Issue'
end
+
+ def github_identifiers
+ {
+ iid: iid,
+ issuable_type: issuable_type
+ }
+ end
end
end
end
diff --git a/lib/gitlab/github_import/representation/lfs_object.rb b/lib/gitlab/github_import/representation/lfs_object.rb
index 41723759645..18737bfcde3 100644
--- a/lib/gitlab/github_import/representation/lfs_object.rb
+++ b/lib/gitlab/github_import/representation/lfs_object.rb
@@ -16,8 +16,7 @@ module Gitlab
new(
oid: lfs_object.oid,
link: lfs_object.link,
- size: lfs_object.size,
- github_id: lfs_object.oid
+ size: lfs_object.size
)
end
@@ -31,6 +30,12 @@ module Gitlab
def initialize(attributes)
@attributes = attributes
end
+
+ def github_identifiers
+ {
+ oid: oid
+ }
+ end
end
end
end
diff --git a/lib/gitlab/github_import/representation/note.rb b/lib/gitlab/github_import/representation/note.rb
index 5b98ce7d5ed..bcdb1a5459b 100644
--- a/lib/gitlab/github_import/representation/note.rb
+++ b/lib/gitlab/github_import/representation/note.rb
@@ -10,7 +10,7 @@ module Gitlab
attr_reader :attributes
expose_attribute :noteable_id, :noteable_type, :author, :note,
- :created_at, :updated_at, :github_id
+ :created_at, :updated_at, :note_id
NOTEABLE_TYPE_REGEX = %r{/(?<type>(pull|issues))/(?<iid>\d+)}i.freeze
@@ -42,7 +42,7 @@ module Gitlab
note: note.body,
created_at: note.created_at,
updated_at: note.updated_at,
- github_id: note.id
+ note_id: note.id
}
new(hash)
@@ -64,6 +64,14 @@ module Gitlab
end
alias_method :issuable_type, :noteable_type
+
+ def github_identifiers
+ {
+ note_id: note_id,
+ noteable_id: noteable_id,
+ noteable_type: noteable_type
+ }
+ end
end
end
end
diff --git a/lib/gitlab/github_import/representation/pull_request.rb b/lib/gitlab/github_import/representation/pull_request.rb
index e4f54fcc833..82bcdee8b2b 100644
--- a/lib/gitlab/github_import/representation/pull_request.rb
+++ b/lib/gitlab/github_import/representation/pull_request.rb
@@ -25,7 +25,6 @@ module Gitlab
hash = {
iid: pr.number,
- github_id: pr.number,
title: pr.title,
description: pr.body,
source_branch: pr.head.ref,
@@ -108,6 +107,13 @@ module Gitlab
def issuable_type
'MergeRequest'
end
+
+ def github_identifiers
+ {
+ iid: iid,
+ issuable_type: issuable_type
+ }
+ end
end
end
end
diff --git a/lib/gitlab/github_import/representation/pull_request_review.rb b/lib/gitlab/github_import/representation/pull_request_review.rb
index 08b3160fc4c..70c1e51ffdd 100644
--- a/lib/gitlab/github_import/representation/pull_request_review.rb
+++ b/lib/gitlab/github_import/representation/pull_request_review.rb
@@ -9,7 +9,7 @@ module Gitlab
attr_reader :attributes
- expose_attribute :author, :note, :review_type, :submitted_at, :github_id, :merge_request_id
+ expose_attribute :author, :note, :review_type, :submitted_at, :merge_request_id, :review_id
def self.from_api_response(review)
user = Representation::User.from_api_response(review.user) if review.user
@@ -20,7 +20,7 @@ module Gitlab
note: review.body,
review_type: review.state,
submitted_at: review.submitted_at,
- github_id: review.id
+ review_id: review.id
)
end
@@ -43,6 +43,13 @@ module Gitlab
def approval?
review_type == 'APPROVED'
end
+
+ def github_identifiers
+ {
+ review_id: review_id,
+ merge_request_id: merge_request_id
+ }
+ end
end
end
end
diff --git a/lib/gitlab/github_import/representation/user.rb b/lib/gitlab/github_import/representation/user.rb
index d97b90b6291..fac8920a3f2 100644
--- a/lib/gitlab/github_import/representation/user.rb
+++ b/lib/gitlab/github_import/representation/user.rb
@@ -17,7 +17,6 @@ module Gitlab
def self.from_api_response(user)
new(
id: user.id,
- github_id: user.id,
login: user.login
)
end
diff --git a/lib/gitlab/github_import/sequential_importer.rb b/lib/gitlab/github_import/sequential_importer.rb
index cb6b2017208..6bc37337799 100644
--- a/lib/gitlab/github_import/sequential_importer.rb
+++ b/lib/gitlab/github_import/sequential_importer.rb
@@ -33,18 +33,41 @@ module Gitlab
end
def execute
- Importer::RepositoryImporter.new(project, client).execute
+ metrics.track_start_import
- SEQUENTIAL_IMPORTERS.each do |klass|
- klass.new(project, client).execute
+ begin
+ Importer::RepositoryImporter.new(project, client).execute
+
+ SEQUENTIAL_IMPORTERS.each do |klass|
+ klass.new(project, client).execute
+ end
+
+ rescue StandardError => e
+ Gitlab::Import::ImportFailureService.track(
+ project_id: project.id,
+ error_source: self.class.name,
+ exception: e,
+ fail_import: true,
+ metrics: true
+ )
+
+ raise(e)
end
PARALLEL_IMPORTERS.each do |klass|
klass.new(project, client, parallel: false).execute
end
+ metrics.track_finished_import
+
true
end
+
+ private
+
+ def metrics
+ @metrics ||= Gitlab::Import::Metrics.new(:github_importer, project)
+ end
end
end
end
diff --git a/lib/gitlab/gon_helper.rb b/lib/gitlab/gon_helper.rb
index 258c13894fb..9f628a10771 100644
--- a/lib/gitlab/gon_helper.rb
+++ b/lib/gitlab/gon_helper.rb
@@ -55,6 +55,7 @@ module Gitlab
push_frontend_feature_flag(:security_auto_fix, default_enabled: false)
push_frontend_feature_flag(:improved_emoji_picker, default_enabled: :yaml)
push_frontend_feature_flag(:new_header_search, default_enabled: :yaml)
+ push_frontend_feature_flag(:suppress_apollo_errors_during_navigation, current_user, default_enabled: :yaml)
end
# Exposes the state of a feature flag to the frontend code.
diff --git a/lib/gitlab/grape_logging/loggers/context_logger.rb b/lib/gitlab/grape_logging/loggers/context_logger.rb
index 468a296886e..1da96fdfdff 100644
--- a/lib/gitlab/grape_logging/loggers/context_logger.rb
+++ b/lib/gitlab/grape_logging/loggers/context_logger.rb
@@ -1,11 +1,18 @@
# frozen_string_literal: true
-# This module adds additional correlation id the grape logger
+# This class adds application context to the grape logger
module Gitlab
module GrapeLogging
module Loggers
class ContextLogger < ::GrapeLogging::Loggers::Base
- def parameters(_, _)
+ def parameters(request, _)
+ # Add remote_ip if this request wasn't already handled. If we
+ # add it unconditionally we can break client_id due to the way
+ # the context inherits the user.
+ unless Gitlab::ApplicationContext.current_context_include?(:remote_ip)
+ Gitlab::ApplicationContext.push(remote_ip: request.ip)
+ end
+
Gitlab::ApplicationContext.current
end
end
diff --git a/lib/gitlab/graphql/board/issues_connection_extension.rb b/lib/gitlab/graphql/board/issues_connection_extension.rb
new file mode 100644
index 00000000000..9dcd8c92592
--- /dev/null
+++ b/lib/gitlab/graphql/board/issues_connection_extension.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+module Gitlab
+ module Graphql
+ module Board
+ class IssuesConnectionExtension < GraphQL::Schema::Field::ConnectionExtension
+ def after_resolve(value:, object:, context:, **rest)
+ ::Boards::Issues::ListService
+ .initialize_relative_positions(object.list.board, context[:current_user], value.nodes)
+
+ value
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/graphql/connection_collection_methods.rb b/lib/gitlab/graphql/connection_collection_methods.rb
index 0e2c4a98bb6..2818a9d4e88 100644
--- a/lib/gitlab/graphql/connection_collection_methods.rb
+++ b/lib/gitlab/graphql/connection_collection_methods.rb
@@ -6,7 +6,7 @@ module Gitlab
extend ActiveSupport::Concern
included do
- delegate :to_a, :size, :include?, :empty?, to: :nodes
+ delegate :to_a, :size, :map, :include?, :empty?, to: :nodes
end
end
end
diff --git a/lib/gitlab/health_checks/redis/rate_limiting_check.rb b/lib/gitlab/health_checks/redis/rate_limiting_check.rb
new file mode 100644
index 00000000000..67c14e26361
--- /dev/null
+++ b/lib/gitlab/health_checks/redis/rate_limiting_check.rb
@@ -0,0 +1,35 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module HealthChecks
+ module Redis
+ class RateLimitingCheck
+ extend SimpleAbstractCheck
+
+ class << self
+ def check_up
+ check
+ end
+
+ private
+
+ def metric_prefix
+ 'redis_rate_limiting_ping'
+ end
+
+ def successful?(result)
+ result == 'PONG'
+ end
+
+ # rubocop: disable CodeReuse/ActiveRecord
+ def check
+ catch_timeout 10.seconds do
+ Gitlab::Redis::RateLimiting.with(&:ping)
+ end
+ end
+ # rubocop: enable CodeReuse/ActiveRecord
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/health_checks/redis/redis_check.rb b/lib/gitlab/health_checks/redis/redis_check.rb
index 44b85bf886e..25879c18f84 100644
--- a/lib/gitlab/health_checks/redis/redis_check.rb
+++ b/lib/gitlab/health_checks/redis/redis_check.rb
@@ -21,7 +21,9 @@ module Gitlab
::Gitlab::HealthChecks::Redis::CacheCheck.check_up &&
::Gitlab::HealthChecks::Redis::QueuesCheck.check_up &&
::Gitlab::HealthChecks::Redis::SharedStateCheck.check_up &&
- ::Gitlab::HealthChecks::Redis::TraceChunksCheck.check_up
+ ::Gitlab::HealthChecks::Redis::TraceChunksCheck.check_up &&
+ ::Gitlab::HealthChecks::Redis::RateLimitingCheck.check_up &&
+ ::Gitlab::HealthChecks::Redis::SessionsCheck.check_up
end
end
end
diff --git a/lib/gitlab/health_checks/redis/sessions_check.rb b/lib/gitlab/health_checks/redis/sessions_check.rb
new file mode 100644
index 00000000000..a0c5e177b4e
--- /dev/null
+++ b/lib/gitlab/health_checks/redis/sessions_check.rb
@@ -0,0 +1,35 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module HealthChecks
+ module Redis
+ class SessionsCheck
+ extend SimpleAbstractCheck
+
+ class << self
+ def check_up
+ check
+ end
+
+ private
+
+ def metric_prefix
+ 'redis_sessions_ping'
+ end
+
+ def successful?(result)
+ result == 'PONG'
+ end
+
+ # rubocop: disable CodeReuse/ActiveRecord
+ def check
+ catch_timeout 10.seconds do
+ Gitlab::Redis::Sessions.with(&:ping)
+ end
+ end
+ # rubocop: enable CodeReuse/ActiveRecord
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/highlight.rb b/lib/gitlab/highlight.rb
index f830af68e07..49712548960 100644
--- a/lib/gitlab/highlight.rb
+++ b/lib/gitlab/highlight.rb
@@ -70,7 +70,7 @@ module Gitlab
end
def highlight_plain(text)
- @formatter.format(Rouge::Lexers::PlainText.lex(text), context).html_safe
+ @formatter.format(Rouge::Lexers::PlainText.lex(text), **context).html_safe
end
def highlight_rich(text, continue: true)
@@ -78,7 +78,7 @@ module Gitlab
tag = lexer.tag
tokens = lexer.lex(text, continue: continue)
- Timeout.timeout(timeout_time) { @formatter.format(tokens, context.merge(tag: tag)).html_safe }
+ Timeout.timeout(timeout_time) { @formatter.format(tokens, **context, tag: tag).html_safe }
rescue Timeout::Error => e
add_highlight_timeout_metric
diff --git a/lib/gitlab/i18n.rb b/lib/gitlab/i18n.rb
index 33f2916345e..b090d05de19 100644
--- a/lib/gitlab/i18n.rb
+++ b/lib/gitlab/i18n.rb
@@ -43,27 +43,27 @@ module Gitlab
TRANSLATION_LEVELS = {
'bg' => 0,
'cs_CZ' => 0,
- 'da_DK' => 25,
+ 'da_DK' => 52,
'de' => 16,
'en' => 100,
'eo' => 0,
- 'es' => 42,
+ 'es' => 41,
'fil_PH' => 0,
'fr' => 11,
'gl_ES' => 0,
'id_ID' => 0,
'it' => 2,
- 'ja' => 38,
- 'ko' => 12,
- 'nb_NO' => 26,
+ 'ja' => 37,
+ 'ko' => 11,
+ 'nb_NO' => 35,
'nl_NL' => 0,
- 'pl_PL' => 6,
+ 'pl_PL' => 5,
'pt_BR' => 45,
- 'ro_RO' => 21,
- 'ru' => 28,
+ 'ro_RO' => 24,
+ 'ru' => 27,
'tr_TR' => 16,
'uk' => 40,
- 'zh_CN' => 94,
+ 'zh_CN' => 95,
'zh_HK' => 2,
'zh_TW' => 3
}.freeze
diff --git a/lib/gitlab/import/import_failure_service.rb b/lib/gitlab/import/import_failure_service.rb
index f808ed1b6e2..142c00f7a6b 100644
--- a/lib/gitlab/import/import_failure_service.rb
+++ b/lib/gitlab/import/import_failure_service.rb
@@ -8,14 +8,15 @@ module Gitlab
import_state: nil,
project_id: nil,
error_source: nil,
- fail_import: false
+ fail_import: false,
+ metrics: false
)
new(
exception: exception,
import_state: import_state,
project_id: project_id,
error_source: error_source
- ).execute(fail_import: fail_import)
+ ).execute(fail_import: fail_import, metrics: metrics)
end
def initialize(exception:, import_state: nil, project_id: nil, error_source: nil)
@@ -35,10 +36,11 @@ module Gitlab
@error_source = error_source
end
- def execute(fail_import:)
+ def execute(fail_import:, metrics:)
track_exception
persist_failure
+ track_metrics if metrics
import_state.mark_as_failed(exception.message) if fail_import
end
@@ -71,6 +73,10 @@ module Gitlab
correlation_id_value: Labkit::Correlation::CorrelationId.current_or_new_id
)
end
+
+ def track_metrics
+ Gitlab::Import::Metrics.new("#{project.import_type}_importer", project).track_failed_import
+ end
end
end
end
diff --git a/lib/gitlab/import/metrics.rb b/lib/gitlab/import/metrics.rb
index 2692ab2fa12..5f27d0ab965 100644
--- a/lib/gitlab/import/metrics.rb
+++ b/lib/gitlab/import/metrics.rb
@@ -3,27 +3,35 @@
module Gitlab
module Import
class Metrics
+ include Gitlab::Utils::UsageData
+
IMPORT_DURATION_BUCKETS = [0.5, 1, 3, 5, 10, 60, 120, 240, 360, 720, 1440].freeze
- attr_reader :importer
+ attr_reader :importer, :duration
def initialize(importer, project)
@importer = importer
@project = project
end
+ def track_start_import
+ return unless project.github_import?
+
+ track_usage_event(:github_import_project_start, project.id)
+ end
+
def track_finished_import
- duration = Time.zone.now - @project.created_at
+ @duration = Time.zone.now - project.created_at
- duration_histogram.observe({ importer: importer }, duration)
+ observe_histogram
projects_counter.increment
+ track_finish_metric
end
- def projects_counter
- @projects_counter ||= Gitlab::Metrics.counter(
- :"#{importer}_imported_projects_total",
- 'The number of imported projects'
- )
+ def track_failed_import
+ return unless project.github_import?
+
+ track_usage_event(:github_import_project_failure, project.id)
end
def issues_counter
@@ -42,6 +50,8 @@ module Gitlab
private
+ attr_reader :project
+
def duration_histogram
@duration_histogram ||= Gitlab::Metrics.histogram(
:"#{importer}_total_duration_seconds",
@@ -50,6 +60,27 @@ module Gitlab
IMPORT_DURATION_BUCKETS
)
end
+
+ def projects_counter
+ @projects_counter ||= Gitlab::Metrics.counter(
+ :"#{importer}_imported_projects_total",
+ 'The number of imported projects'
+ )
+ end
+
+ def observe_histogram
+ if project.github_import?
+ duration_histogram.observe({ project: project.full_path }, duration)
+ else
+ duration_histogram.observe({ importer: importer }, duration)
+ end
+ end
+
+ def track_finish_metric
+ return unless project.github_import?
+
+ track_usage_event(:github_import_project_success, project.id)
+ end
end
end
end
diff --git a/lib/gitlab/import_export/attributes_permitter.rb b/lib/gitlab/import_export/attributes_permitter.rb
index acd03d9ec20..2d8e25a9f70 100644
--- a/lib/gitlab/import_export/attributes_permitter.rb
+++ b/lib/gitlab/import_export/attributes_permitter.rb
@@ -44,7 +44,7 @@ module Gitlab
# We want to use AttributesCleaner for these relations instead, in the future this should be removed to make sure
# we are using AttributesPermitter for every imported relation.
- DISABLED_RELATION_NAMES = %i[user author ci_cd_settings issuable_sla push_rule].freeze
+ DISABLED_RELATION_NAMES = %i[user author issuable_sla].freeze
def initialize(config: ImportExport::Config.new.to_h)
@config = config
diff --git a/lib/gitlab/import_export/base/relation_factory.rb b/lib/gitlab/import_export/base/relation_factory.rb
index a84efd1d240..6749ef4e276 100644
--- a/lib/gitlab/import_export/base/relation_factory.rb
+++ b/lib/gitlab/import_export/base/relation_factory.rb
@@ -183,7 +183,7 @@ module Gitlab
def parsed_relation_hash
strong_memoize(:parsed_relation_hash) do
- if Feature.enabled?(:permitted_attributes_for_import_export, default_enabled: :yaml) && attributes_permitter.permitted_attributes_defined?(@relation_sym)
+ if use_attributes_permitter? && attributes_permitter.permitted_attributes_defined?(@relation_sym)
attributes_permitter.permit(@relation_sym, @relation_hash)
else
Gitlab::ImportExport::AttributeCleaner.clean(relation_hash: @relation_hash, relation_class: relation_class)
@@ -195,6 +195,10 @@ module Gitlab
@attributes_permitter ||= Gitlab::ImportExport::AttributesPermitter.new
end
+ def use_attributes_permitter?
+ Feature.enabled?(:permitted_attributes_for_import_export, default_enabled: :yaml)
+ end
+
def existing_or_new_object
# Only find existing records to avoid mapping tables such as milestones
# Otherwise always create the record, skipping the extra SELECT clause.
diff --git a/lib/gitlab/import_export/command_line_util.rb b/lib/gitlab/import_export/command_line_util.rb
index 6c0b6de9e85..fdc4c22001f 100644
--- a/lib/gitlab/import_export/command_line_util.rb
+++ b/lib/gitlab/import_export/command_line_util.rb
@@ -14,6 +14,10 @@ module Gitlab
untar_with_options(archive: archive, dir: dir, options: 'zxf')
end
+ def tar_cf(archive:, dir:)
+ tar_with_options(archive: archive, dir: dir, options: 'cf')
+ end
+
def gzip(dir:, filename:)
gzip_with_options(dir: dir, filename: filename)
end
@@ -59,19 +63,29 @@ module Gitlab
end
def tar_with_options(archive:, dir:, options:)
- execute(%W(tar -#{options} #{archive} -C #{dir} .))
+ execute_cmd(%W(tar -#{options} #{archive} -C #{dir} .))
end
def untar_with_options(archive:, dir:, options:)
- execute(%W(tar -#{options} #{archive} -C #{dir}))
- execute(%W(chmod -R #{UNTAR_MASK} #{dir}))
+ execute_cmd(%W(tar -#{options} #{archive} -C #{dir}))
+ execute_cmd(%W(chmod -R #{UNTAR_MASK} #{dir}))
end
- def execute(cmd)
+ # rubocop:disable Gitlab/ModuleWithInstanceVariables
+ def execute_cmd(cmd)
output, status = Gitlab::Popen.popen(cmd)
- @shared.error(Gitlab::ImportExport::Error.new(output.to_s)) unless status == 0 # rubocop:disable Gitlab/ModuleWithInstanceVariables
- status == 0
+
+ return true if status == 0
+
+ if @shared.respond_to?(:error)
+ @shared.error(Gitlab::ImportExport::Error.new(output.to_s))
+
+ false
+ else
+ raise Gitlab::ImportExport::Error, 'System call failed'
+ end
end
+ # rubocop:enable Gitlab/ModuleWithInstanceVariables
def git_bin_path
Gitlab.config.git.bin_path
diff --git a/lib/gitlab/import_export/group/relation_factory.rb b/lib/gitlab/import_export/group/relation_factory.rb
index 91637161377..adbbd37ce10 100644
--- a/lib/gitlab/import_export/group/relation_factory.rb
+++ b/lib/gitlab/import_export/group/relation_factory.rb
@@ -36,6 +36,10 @@ module Gitlab
@relation_hash['group_id'] = @importable.id
end
+
+ def use_attributes_permitter?
+ false
+ end
end
end
end
diff --git a/lib/gitlab/import_export/json/streaming_serializer.rb b/lib/gitlab/import_export/json/streaming_serializer.rb
index 9d28e1abeab..9ab8fa68d0e 100644
--- a/lib/gitlab/import_export/json/streaming_serializer.rb
+++ b/lib/gitlab/import_export/json/streaming_serializer.rb
@@ -171,7 +171,6 @@ module Gitlab
def read_from_replica_if_available(&block)
return yield unless ::Feature.enabled?(:load_balancing_for_export_workers, type: :development, default_enabled: :yaml)
- return yield unless ::Gitlab::Database::LoadBalancing.enable?
::Gitlab::Database::LoadBalancing::Session.current.use_replicas_for_read_queries(&block)
end
diff --git a/lib/gitlab/import_export/merge_request_parser.rb b/lib/gitlab/import_export/merge_request_parser.rb
index 3910afef108..301e90e3171 100644
--- a/lib/gitlab/import_export/merge_request_parser.rb
+++ b/lib/gitlab/import_export/merge_request_parser.rb
@@ -39,7 +39,9 @@ module Gitlab
# created manually. Ignore failures so we get the merge request itself if
# the commits are missing.
def create_source_branch
- @project.repository.create_branch(@merge_request.source_branch, @diff_head_sha)
+ if @merge_request.open?
+ @project.repository.create_branch(@merge_request.source_branch, @diff_head_sha)
+ end
rescue StandardError => err
Gitlab::Import::Logger.warn(
message: 'Import warning: Failed to create source branch',
diff --git a/lib/gitlab/import_export/project/import_export.yml b/lib/gitlab/import_export/project/import_export.yml
index 8046fedc4f3..86fd11cc336 100644
--- a/lib/gitlab/import_export/project/import_export.yml
+++ b/lib/gitlab/import_export/project/import_export.yml
@@ -131,7 +131,6 @@ included_attributes:
- :link_url
- :name
- :project_id
- - :type
- :updated_at
pipeline_schedules:
- :active
@@ -155,6 +154,124 @@ included_attributes:
- :enabled
- :project_id
- :updated_at
+ boards:
+ - :project_id
+ - :created_at
+ - :updated_at
+ - :group_id
+ - :weight
+ - :name
+ - :hide_backlog_list
+ - :hide_closed_list
+ lists:
+ - :list_type
+ - :position
+ - :created_at
+ - :updated_at
+ - :user_id
+ - :max_issue_count
+ - :max_issue_weight
+ - :limit_metric
+ custom_attributes:
+ - :created_at
+ - :updated_at
+ - :project_id
+ - :key
+ - :value
+ label:
+ - :title
+ - :color
+ - :project_id
+ - :group_id
+ - :created_at
+ - :updated_at
+ - :template
+ - :description
+ - :priority
+ labels:
+ - :title
+ - :color
+ - :project_id
+ - :group_id
+ - :created_at
+ - :updated_at
+ - :template
+ - :description
+ - :priority
+ priorities:
+ - :project_id
+ - :priority
+ - :created_at
+ - :updated_at
+ milestone:
+ - :iid
+ - :title
+ - :project_id
+ - :group_id
+ - :description
+ - :due_date
+ - :created_at
+ - :updated_at
+ - :start_date
+ - :state
+ milestones:
+ - :iid
+ - :title
+ - :project_id
+ - :group_id
+ - :description
+ - :due_date
+ - :created_at
+ - :updated_at
+ - :start_date
+ - :state
+ protected_branches:
+ - :project_id
+ - :name
+ - :created_at
+ - :updated_at
+ - :code_owner_approval_required
+ - :allow_force_push
+ protected_tags:
+ - :project_id
+ - :name
+ - :created_at
+ - :updated_at
+ create_access_levels:
+ - :access_level
+ - :created_at
+ - :updated_at
+ - :user_id
+ - :group_id
+ merge_access_levels:
+ - :access_level
+ - :created_at
+ - :updated_at
+ - :user_id
+ - :group_id
+ push_access_levels:
+ - :access_level
+ - :created_at
+ - :updated_at
+ - :user_id
+ - :group_id
+ releases:
+ - :tag
+ - :description
+ - :project_id
+ - :author_id
+ - :created_at
+ - :updated_at
+ - :name
+ - :sha
+ - :released_at
+ links:
+ - :url
+ - :name
+ - :created_at
+ - :updated_at
+ - :filepath
+ - :link_type
# Do not include the following attributes for the models specified.
excluded_attributes:
@@ -498,6 +615,10 @@ ee:
- :deploy_access_levels
- :security_setting
- :push_rule
+ - boards:
+ - :milestone
+ - lists:
+ - :milestone
included_attributes:
issuable_sla:
@@ -519,3 +640,20 @@ ee:
- :reject_unsigned_commits
- :commit_committer_check
- :regexp_uses_re2
+ unprotect_access_levels:
+ - :access_level
+ - :user_id
+ - :group_id
+ deploy_access_levels:
+ - :created_at
+ - :updated_at
+ - :access_level
+ - :user_id
+ - :group_id
+ protected_environments:
+ - :project_id
+ - :group_id
+ - :name
+ - :created_at
+ - :updated_at
+
diff --git a/lib/gitlab/import_export/relation_tree_restorer.rb b/lib/gitlab/import_export/relation_tree_restorer.rb
index 8d93098a80a..1eeacafef53 100644
--- a/lib/gitlab/import_export/relation_tree_restorer.rb
+++ b/lib/gitlab/import_export/relation_tree_restorer.rb
@@ -37,7 +37,7 @@ module Gitlab
ActiveRecord::Base.no_touching do
update_params!
- BulkInsertableAssociations.with_bulk_insert(enabled: @importable.instance_of?(::Project)) do
+ BulkInsertableAssociations.with_bulk_insert(enabled: project?) do
fix_ci_pipelines_not_sorted_on_legacy_project_json!
create_relations!
end
@@ -55,6 +55,10 @@ module Gitlab
private
+ def project?
+ @importable.instance_of?(::Project)
+ end
+
# Loops through the tree of models defined in import_export.yml and
# finds them in the imported JSON so they can be instantiated and saved
# in the DB. The structure and relationships between models are guessed from
@@ -75,7 +79,7 @@ module Gitlab
def process_relation_item!(relation_key, relation_definition, relation_index, data_hash)
relation_object = build_relation(relation_key, relation_definition, relation_index, data_hash)
return unless relation_object
- return if importable_class == ::Project && group_model?(relation_object)
+ return if project? && group_model?(relation_object)
relation_object.assign_attributes(importable_class_sym => @importable)
@@ -114,7 +118,8 @@ module Gitlab
excluded_keys: excluded_keys_for_relation(importable_class_sym))
@importable.assign_attributes(params)
- @importable.drop_visibility_level! if importable_class == ::Project
+
+ modify_attributes
Gitlab::Timeless.timeless(@importable) do
@importable.save!
@@ -141,6 +146,13 @@ module Gitlab
end
end
+ def modify_attributes
+ return unless project?
+
+ @importable.reconcile_shared_runners_setting!
+ @importable.drop_visibility_level!
+ end
+
def build_relations(relation_key, relation_definition, relation_index, data_hashes)
data_hashes
.map { |data_hash| build_relation(relation_key, relation_definition, relation_index, data_hash) }
diff --git a/lib/gitlab/instrumentation/redis.rb b/lib/gitlab/instrumentation/redis.rb
index ab0e56adc32..4fee779c767 100644
--- a/lib/gitlab/instrumentation/redis.rb
+++ b/lib/gitlab/instrumentation/redis.rb
@@ -9,8 +9,10 @@ module Gitlab
Queues = Class.new(RedisBase)
SharedState = Class.new(RedisBase).enable_redis_cluster_validation
TraceChunks = Class.new(RedisBase).enable_redis_cluster_validation
+ RateLimiting = Class.new(RedisBase).enable_redis_cluster_validation
+ Sessions = Class.new(RedisBase).enable_redis_cluster_validation
- STORAGES = [ActionCable, Cache, Queues, SharedState, TraceChunks].freeze
+ STORAGES = [ActionCable, Cache, Queues, SharedState, TraceChunks, RateLimiting, Sessions].freeze
# Milliseconds represented in seconds (from 1 millisecond to 2 seconds).
QUERY_TIME_BUCKETS = [0.001, 0.0025, 0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1, 2].freeze
diff --git a/lib/gitlab/instrumentation_helper.rb b/lib/gitlab/instrumentation_helper.rb
index 23acf1e8e86..26e44d7822e 100644
--- a/lib/gitlab/instrumentation_helper.rb
+++ b/lib/gitlab/instrumentation_helper.rb
@@ -131,18 +131,43 @@ module Gitlab
enqueued_at_time = convert_to_time(enqueued_at)
return unless enqueued_at_time
- # Its possible that if theres clock-skew between two nodes
- # this value may be less than zero. In that event, we record the value
+ round_elapsed_time(enqueued_at_time)
+ end
+
+ # Returns the time it took for a scheduled job to be enqueued in seconds, as a float,
+ # if the `scheduled_at` and `enqueued_at` fields are available.
+ #
+ # * If the job doesn't contain sufficient information, returns nil
+ # * If the job has a start time in the future, returns 0
+ # * If the job contains an invalid start time value, returns nil
+ # @param [Hash] job a Sidekiq job, represented as a hash
+ def self.enqueue_latency_for_scheduled_job(job)
+ scheduled_at = job['scheduled_at']
+ enqueued_at = job['enqueued_at']
+
+ return unless scheduled_at && enqueued_at
+
+ scheduled_at_time = convert_to_time(scheduled_at)
+ enqueued_at_time = convert_to_time(enqueued_at)
+
+ return unless scheduled_at_time && enqueued_at_time
+
+ round_elapsed_time(scheduled_at_time, enqueued_at_time)
+ end
+
+ def self.round_elapsed_time(start, end_time = Time.now)
+ # It's possible that if there is clock-skew between two nodes this
+ # value may be less than zero. In that event, we record the value
# as zero.
- [elapsed_by_absolute_time(enqueued_at_time), 0].max.round(DURATION_PRECISION)
+ [elapsed_by_absolute_time(start, end_time), 0].max.round(DURATION_PRECISION)
end
# Calculates the time in seconds, as a float, from
# the provided start time until now
#
# @param [Time] start
- def self.elapsed_by_absolute_time(start)
- (Time.now - start).to_f.round(DURATION_PRECISION)
+ def self.elapsed_by_absolute_time(start, end_time)
+ (end_time - start).to_f.round(DURATION_PRECISION)
end
private_class_method :elapsed_by_absolute_time
diff --git a/lib/gitlab/issuable_sorter.rb b/lib/gitlab/issuable_sorter.rb
index 42bbfb32d0b..45c7dc295b1 100644
--- a/lib/gitlab/issuable_sorter.rb
+++ b/lib/gitlab/issuable_sorter.rb
@@ -7,7 +7,7 @@ module Gitlab
grouped_items = issuables.group_by do |issuable|
if issuable.project.id == project.id
:project_ref
- elsif issuable.project.namespace.id == project.namespace.id
+ elsif issuable.project.namespace_id == project.namespace_id
:namespace_ref
else
:full_ref
diff --git a/lib/gitlab/kas.rb b/lib/gitlab/kas.rb
index 45582f19214..408b3afc128 100644
--- a/lib/gitlab/kas.rb
+++ b/lib/gitlab/kas.rb
@@ -41,6 +41,10 @@ module Gitlab
end
def tunnel_url
+ configured = Gitlab.config.gitlab_kas['external_k8s_proxy_url']
+ return configured if configured.present?
+
+ # Legacy code path. Will be removed when all distributions provide a sane default here
uri = URI.join(external_url, K8S_PROXY_PATH)
uri.scheme = uri.scheme.in?(%w(grpcs wss)) ? 'https' : 'http'
uri.to_s
diff --git a/lib/gitlab/mail_room.rb b/lib/gitlab/mail_room.rb
index 0633efc6b0c..75d27ed8cc1 100644
--- a/lib/gitlab/mail_room.rb
+++ b/lib/gitlab/mail_room.rb
@@ -71,7 +71,8 @@ module Gitlab
def redis_config
gitlab_redis_queues = Gitlab::Redis::Queues.new(rails_env)
- config = { redis_url: gitlab_redis_queues.url }
+
+ config = { redis_url: gitlab_redis_queues.url, redis_db: gitlab_redis_queues.db }
if gitlab_redis_queues.sentinels?
config[:sentinels] = gitlab_redis_queues.sentinels
diff --git a/lib/gitlab/merge_requests/mergeability/check_result.rb b/lib/gitlab/merge_requests/mergeability/check_result.rb
new file mode 100644
index 00000000000..d0788c7d7c7
--- /dev/null
+++ b/lib/gitlab/merge_requests/mergeability/check_result.rb
@@ -0,0 +1,48 @@
+# frozen_string_literal: true
+module Gitlab
+ module MergeRequests
+ module Mergeability
+ class CheckResult
+ SUCCESS_STATUS = :success
+ FAILED_STATUS = :failed
+
+ attr_reader :status, :payload
+
+ def self.default_payload
+ { last_run_at: Time.current }
+ end
+
+ def self.success(payload: {})
+ new(status: SUCCESS_STATUS, payload: default_payload.merge(payload))
+ end
+
+ def self.failed(payload: {})
+ new(status: FAILED_STATUS, payload: default_payload.merge(payload))
+ end
+
+ def self.from_hash(data)
+ new(
+ status: data.fetch(:status),
+ payload: data.fetch(:payload))
+ end
+
+ def initialize(status:, payload: {})
+ @status = status
+ @payload = payload
+ end
+
+ def to_hash
+ { status: status, payload: payload }
+ end
+
+ def failed?
+ status == FAILED_STATUS
+ end
+
+ def success?
+ status == SUCCESS_STATUS
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/merge_requests/mergeability/redis_interface.rb b/lib/gitlab/merge_requests/mergeability/redis_interface.rb
new file mode 100644
index 00000000000..081ccfca360
--- /dev/null
+++ b/lib/gitlab/merge_requests/mergeability/redis_interface.rb
@@ -0,0 +1,23 @@
+# frozen_string_literal: true
+module Gitlab
+ module MergeRequests
+ module Mergeability
+ class RedisInterface
+ EXPIRATION = 6.hours
+ VERSION = 1
+
+ def save_check(merge_check:, result_hash:)
+ Gitlab::Redis::SharedState.with do |redis|
+ redis.set(merge_check.cache_key + ":#{VERSION}", result_hash.to_json, ex: EXPIRATION)
+ end
+ end
+
+ def retrieve_check(merge_check:)
+ Gitlab::Redis::SharedState.with do |redis|
+ Gitlab::Json.parse(redis.get(merge_check.cache_key + ":#{VERSION}"))
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/merge_requests/mergeability/results_store.rb b/lib/gitlab/merge_requests/mergeability/results_store.rb
new file mode 100644
index 00000000000..bb6489f8526
--- /dev/null
+++ b/lib/gitlab/merge_requests/mergeability/results_store.rb
@@ -0,0 +1,25 @@
+# frozen_string_literal: true
+module Gitlab
+ module MergeRequests
+ module Mergeability
+ class ResultsStore
+ def initialize(interface: RedisInterface.new, merge_request:)
+ @interface = interface
+ @merge_request = merge_request
+ end
+
+ def read(merge_check:)
+ interface.retrieve_check(merge_check: merge_check)
+ end
+
+ def write(merge_check:, result_hash:)
+ interface.save_check(merge_check: merge_check, result_hash: result_hash)
+ end
+
+ private
+
+ attr_reader :interface
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/metrics/dashboard/service_selector.rb b/lib/gitlab/metrics/dashboard/service_selector.rb
index 641c0c76f8f..6d4b49676e5 100644
--- a/lib/gitlab/metrics/dashboard/service_selector.rb
+++ b/lib/gitlab/metrics/dashboard/service_selector.rb
@@ -30,7 +30,7 @@ module Gitlab
# Returns a class which inherits from the BaseService
# class that can be used to obtain a dashboard for
# the provided params.
- # @return [Gitlab::Metrics::Dashboard::Services::BaseService]
+ # @return [Metrics::Dashboard::BaseService]
def call(params)
service = services.find do |service_class|
service_class.valid_params?(params)
diff --git a/lib/gitlab/metrics/exporter/web_exporter.rb b/lib/gitlab/metrics/exporter/web_exporter.rb
index f378577f08e..c5fa1e545d7 100644
--- a/lib/gitlab/metrics/exporter/web_exporter.rb
+++ b/lib/gitlab/metrics/exporter/web_exporter.rb
@@ -15,6 +15,14 @@ module Gitlab
end
end
+ RailsMetricsInitializer = Struct.new(:app) do
+ def call(env)
+ Gitlab::Metrics::RailsSlis.initialize_request_slis_if_needed!
+
+ app.call(env)
+ end
+ end
+
attr_reader :running
# This exporter is always run on master process
@@ -45,6 +53,15 @@ module Gitlab
private
+ def rack_app
+ app = super
+
+ Rack::Builder.app do
+ use RailsMetricsInitializer
+ run app
+ end
+ end
+
def start_working
@running = true
super
diff --git a/lib/gitlab/metrics/instrumentation.rb b/lib/gitlab/metrics/instrumentation.rb
deleted file mode 100644
index ad45a037161..00000000000
--- a/lib/gitlab/metrics/instrumentation.rb
+++ /dev/null
@@ -1,194 +0,0 @@
-# frozen_string_literal: true
-
-module Gitlab
- module Metrics
- # Module for instrumenting methods.
- #
- # This module allows instrumenting of methods without having to actually
- # alter the target code (e.g. by including modules).
- #
- # Example usage:
- #
- # Gitlab::Metrics::Instrumentation.instrument_method(User, :by_login)
- module Instrumentation
- PROXY_IVAR = :@__gitlab_instrumentation_proxy
-
- def self.configure
- yield self
- end
-
- # Returns the name of the series to use for storing method calls.
- def self.series
- @series ||= "#{::Gitlab::Metrics.series_prefix}method_calls"
- end
-
- # Instruments a class method.
- #
- # mod - The module to instrument as a Module/Class.
- # name - The name of the method to instrument.
- def self.instrument_method(mod, name)
- instrument(:class, mod, name)
- end
-
- # Instruments an instance method.
- #
- # mod - The module to instrument as a Module/Class.
- # name - The name of the method to instrument.
- def self.instrument_instance_method(mod, name)
- instrument(:instance, mod, name)
- end
-
- # Recursively instruments all subclasses of the given root module.
- #
- # This can be used to for example instrument all ActiveRecord models (as
- # these all inherit from ActiveRecord::Base).
- #
- # This method can optionally take a block to pass to `instrument_methods`
- # and `instrument_instance_methods`.
- #
- # root - The root module for which to instrument subclasses. The root
- # module itself is not instrumented.
- def self.instrument_class_hierarchy(root, &block)
- visit = root.subclasses
-
- until visit.empty?
- klass = visit.pop
-
- instrument_methods(klass, &block)
- instrument_instance_methods(klass, &block)
-
- klass.subclasses.each { |c| visit << c }
- end
- end
-
- # Instruments all public and private methods of a module.
- #
- # This method optionally takes a block that can be used to determine if a
- # method should be instrumented or not. The block is passed the receiving
- # module and an UnboundMethod. If the block returns a non truthy value the
- # method is not instrumented.
- #
- # mod - The module to instrument.
- def self.instrument_methods(mod)
- methods = mod.methods(false) + mod.private_methods(false)
- methods.each do |name|
- method = mod.method(name)
-
- if method.owner == mod.singleton_class
- if !block_given? || block_given? && yield(mod, method)
- instrument_method(mod, name)
- end
- end
- end
- end
-
- # Instruments all public and private instance methods of a module.
- #
- # See `instrument_methods` for more information.
- #
- # mod - The module to instrument.
- def self.instrument_instance_methods(mod)
- methods = mod.instance_methods(false) + mod.private_instance_methods(false)
- methods.each do |name|
- method = mod.instance_method(name)
-
- if method.owner == mod
- if !block_given? || block_given? && yield(mod, method)
- instrument_instance_method(mod, name)
- end
- end
- end
- end
-
- # Returns true if a module is instrumented.
- #
- # mod - The module to check
- def self.instrumented?(mod)
- mod.instance_variable_defined?(PROXY_IVAR)
- end
-
- # Returns the proxy module (if any) of `mod`.
- def self.proxy_module(mod)
- mod.instance_variable_get(PROXY_IVAR)
- end
-
- # Instruments a method.
- #
- # type - The type (:class or :instance) of method to instrument.
- # mod - The module containing the method.
- # name - The name of the method to instrument.
- def self.instrument(type, mod, name)
- return unless ::Gitlab::Metrics.enabled?
-
- if type == :instance
- target = mod
- method_name = "##{name}"
- method = mod.instance_method(name)
- else
- target = mod.singleton_class
- method_name = ".#{name}"
- method = mod.method(name)
- end
-
- label = "#{mod.name}#{method_name}"
-
- unless instrumented?(target)
- target.instance_variable_set(PROXY_IVAR, Module.new)
- end
-
- proxy_module = self.proxy_module(target)
-
- # Some code out there (e.g. the "state_machine" Gem) checks the arity of
- # a method to make sure it only passes arguments when the method expects
- # any. If we were to always overwrite a method to take an `*args`
- # signature this would break things. As a result we'll make sure the
- # generated method _only_ accepts regular arguments if the underlying
- # method also accepts them.
- args_signature =
- if method.arity == 0
- ''
- else
- '*args'
- end
-
- method_visibility = method_visibility_for(target, name)
-
- # We silence warnings to avoid such warnings:
- # `Skipping set of ruby2_keywords flag for <...>
- # (method accepts keywords or method does not accept argument splat)`
- # as we apply ruby2_keywords 'blindly' for every instrumented method.
- proxy_module.class_eval <<-EOF, __FILE__, __LINE__ + 1
- def #{name}(#{args_signature})
- if trans = Gitlab::Metrics::Instrumentation.transaction
- trans.method_call_for(#{label.to_sym.inspect}, #{mod.name.inspect}, "#{method_name}")
- .measure { super }
- else
- super
- end
- end
- silence_warnings { ruby2_keywords(:#{name}) if respond_to?(:ruby2_keywords, true) }
- #{method_visibility} :#{name}
- EOF
-
- target.prepend(proxy_module)
- end
-
- def self.method_visibility_for(mod, name)
- if mod.private_method_defined?(name)
- :private
- elsif mod.protected_method_defined?(name)
- :protected
- else
- :public
- end
- end
- private_class_method :method_visibility_for
-
- # Small layer of indirection to make it easier to stub out the current
- # transaction.
- def self.transaction
- Transaction.current
- end
- end
- end
-end
diff --git a/lib/gitlab/metrics/rails_slis.rb b/lib/gitlab/metrics/rails_slis.rb
new file mode 100644
index 00000000000..69e0c1e9fde
--- /dev/null
+++ b/lib/gitlab/metrics/rails_slis.rb
@@ -0,0 +1,52 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Metrics
+ module RailsSlis
+ class << self
+ def request_apdex_counters_enabled?
+ Feature.enabled?(:request_apdex_counters)
+ end
+
+ def initialize_request_slis_if_needed!
+ return unless request_apdex_counters_enabled?
+ return if Gitlab::Metrics::Sli.initialized?(:rails_request_apdex)
+
+ Gitlab::Metrics::Sli.initialize_sli(:rails_request_apdex, possible_request_labels)
+ end
+
+ def request_apdex
+ Gitlab::Metrics::Sli[:rails_request_apdex]
+ end
+
+ private
+
+ def possible_request_labels
+ possible_controller_labels + possible_api_labels
+ end
+
+ def possible_api_labels
+ Gitlab::RequestEndpoints.all_api_endpoints.map do |route|
+ endpoint_id = API::Base.endpoint_id_for_route(route)
+ route_class = route.app.options[:for]
+ feature_category = route_class.feature_category_for_app(route.app)
+
+ {
+ endpoint_id: endpoint_id,
+ feature_category: feature_category
+ }
+ end
+ end
+
+ def possible_controller_labels
+ Gitlab::RequestEndpoints.all_controller_actions.map do |controller, action|
+ {
+ endpoint_id: controller.endpoint_id_for_action(action),
+ feature_category: controller.feature_category_for_action(action)
+ }
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/metrics/requests_rack_middleware.rb b/lib/gitlab/metrics/requests_rack_middleware.rb
index 6ba336d37cd..3a0e34d5615 100644
--- a/lib/gitlab/metrics/requests_rack_middleware.rb
+++ b/lib/gitlab/metrics/requests_rack_middleware.rb
@@ -15,7 +15,8 @@ module Gitlab
HEALTH_ENDPOINT = %r{^/-/(liveness|readiness|health|metrics)/?$}.freeze
- FEATURE_CATEGORY_DEFAULT = 'unknown'
+ FEATURE_CATEGORY_DEFAULT = ::Gitlab::FeatureCategories::FEATURE_CATEGORY_DEFAULT
+ ENDPOINT_MISSING = 'unknown'
# These were the top 5 categories at a point in time, chosen as a
# reasonable default. If we initialize every category we'll end up
@@ -77,6 +78,8 @@ module Gitlab
if !health_endpoint && ::Gitlab::Metrics.record_duration_for_status?(status)
self.class.http_request_duration_seconds.observe({ method: method }, elapsed)
+
+ record_apdex_if_needed(env, elapsed)
end
[status, headers, body]
@@ -105,6 +108,39 @@ module Gitlab
def feature_category
::Gitlab::ApplicationContext.current_context_attribute(:feature_category)
end
+
+ def endpoint_id
+ ::Gitlab::ApplicationContext.current_context_attribute(:caller_id)
+ end
+
+ def record_apdex_if_needed(env, elapsed)
+ return unless Gitlab::Metrics::RailsSlis.request_apdex_counters_enabled?
+
+ Gitlab::Metrics::RailsSlis.request_apdex.increment(
+ labels: labels_from_context,
+ success: satisfactory?(env, elapsed)
+ )
+ end
+
+ def labels_from_context
+ {
+ feature_category: feature_category.presence || FEATURE_CATEGORY_DEFAULT,
+ endpoint_id: endpoint_id.presence || ENDPOINT_MISSING
+ }
+ end
+
+ def satisfactory?(env, elapsed)
+ target =
+ if env['api.endpoint'].present?
+ env['api.endpoint'].options[:for].try(:urgency_for_app, env['api.endpoint'])
+ elsif env['action_controller.instance'].present? && env['action_controller.instance'].respond_to?(:urgency)
+ env['action_controller.instance'].urgency
+ end
+
+ target ||= Gitlab::EndpointAttributes::DEFAULT_URGENCY
+
+ elapsed < target.duration
+ end
end
end
end
diff --git a/lib/gitlab/metrics/sli.rb b/lib/gitlab/metrics/sli.rb
new file mode 100644
index 00000000000..de73db0755d
--- /dev/null
+++ b/lib/gitlab/metrics/sli.rb
@@ -0,0 +1,83 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Metrics
+ class Sli
+ SliNotInitializedError = Class.new(StandardError)
+
+ COUNTER_PREFIX = 'gitlab_sli'
+
+ class << self
+ INITIALIZATION_MUTEX = Mutex.new
+
+ def [](name)
+ known_slis[name] || initialize_sli(name, [])
+ end
+
+ def initialize_sli(name, possible_label_combinations)
+ INITIALIZATION_MUTEX.synchronize do
+ sli = new(name)
+ sli.initialize_counters(possible_label_combinations)
+ known_slis[name] = sli
+ end
+ end
+
+ def initialized?(name)
+ known_slis.key?(name) && known_slis[name].initialized?
+ end
+
+ private
+
+ def known_slis
+ @known_slis ||= {}
+ end
+ end
+
+ attr_reader :name
+
+ def initialize(name)
+ @name = name
+ @initialized_with_combinations = false
+ end
+
+ def initialize_counters(possible_label_combinations)
+ @initialized_with_combinations = possible_label_combinations.any?
+ possible_label_combinations.each do |label_combination|
+ total_counter.get(label_combination)
+ success_counter.get(label_combination)
+ end
+ end
+
+ def increment(labels:, success:)
+ total_counter.increment(labels)
+ success_counter.increment(labels) if success
+ end
+
+ def initialized?
+ @initialized_with_combinations
+ end
+
+ private
+
+ def total_counter
+ prometheus.counter(total_counter_name.to_sym, "Total number of measurements for #{name}")
+ end
+
+ def success_counter
+ prometheus.counter(success_counter_name.to_sym, "Number of successful measurements for #{name}")
+ end
+
+ def total_counter_name
+ "#{COUNTER_PREFIX}:#{name}:total"
+ end
+
+ def success_counter_name
+ "#{COUNTER_PREFIX}:#{name}:success_total"
+ end
+
+ def prometheus
+ Gitlab::Metrics
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/metrics/subscribers/active_record.rb b/lib/gitlab/metrics/subscribers/active_record.rb
index 59b2f88041f..df0582149a9 100644
--- a/lib/gitlab/metrics/subscribers/active_record.rb
+++ b/lib/gitlab/metrics/subscribers/active_record.rb
@@ -47,13 +47,11 @@ module Gitlab
buckets SQL_DURATION_BUCKET
end
- if ::Gitlab::Database::LoadBalancing.enable?
- db_role = ::Gitlab::Database::LoadBalancing.db_role_for_connection(payload[:connection])
- return if db_role.blank?
+ db_role = ::Gitlab::Database::LoadBalancing.db_role_for_connection(payload[:connection])
+ return if db_role.blank?
- increment_db_role_counters(db_role, payload)
- observe_db_role_duration(db_role, event)
- end
+ increment_db_role_counters(db_role, payload)
+ observe_db_role_duration(db_role, event)
end
def self.db_counter_payload
@@ -64,7 +62,7 @@ module Gitlab
payload[key] = Gitlab::SafeRequestStore[key].to_i
end
- if ::Gitlab::SafeRequestStore.active? && ::Gitlab::Database::LoadBalancing.enable?
+ if ::Gitlab::SafeRequestStore.active?
load_balancing_metric_counter_keys.each do |counter|
payload[counter] = ::Gitlab::SafeRequestStore[counter].to_i
end
diff --git a/lib/gitlab/metrics/subscribers/load_balancing.rb b/lib/gitlab/metrics/subscribers/load_balancing.rb
index 333fc63ebef..bd77e8c3c3f 100644
--- a/lib/gitlab/metrics/subscribers/load_balancing.rb
+++ b/lib/gitlab/metrics/subscribers/load_balancing.rb
@@ -10,7 +10,7 @@ module Gitlab
LOG_COUNTERS = { true => :caught_up_replica_pick_ok, false => :caught_up_replica_pick_fail }.freeze
def caught_up_replica_pick(event)
- return unless Gitlab::SafeRequestStore.active? && ::Gitlab::Database::LoadBalancing.enable?
+ return unless Gitlab::SafeRequestStore.active?
result = event.payload[:result]
counter_name = counter(result)
@@ -20,13 +20,13 @@ module Gitlab
# we want to update Prometheus counter after the controller/action are set
def web_transaction_completed(_event)
- return unless Gitlab::SafeRequestStore.active? && ::Gitlab::Database::LoadBalancing.enable?
+ return unless Gitlab::SafeRequestStore.active?
LOG_COUNTERS.keys.each { |result| increment_prometheus_for_result_label(result) }
end
def self.load_balancing_payload
- return {} unless Gitlab::SafeRequestStore.active? && ::Gitlab::Database::LoadBalancing.enable?
+ return {} unless Gitlab::SafeRequestStore.active?
{}.tap do |payload|
LOG_COUNTERS.values.each do |counter|
diff --git a/lib/gitlab/metrics/subscribers/rack_attack.rb b/lib/gitlab/metrics/subscribers/rack_attack.rb
index ebd0d1634e7..d86c0f83c6c 100644
--- a/lib/gitlab/metrics/subscribers/rack_attack.rb
+++ b/lib/gitlab/metrics/subscribers/rack_attack.rb
@@ -22,7 +22,8 @@ module Gitlab
:throttle_authenticated_protected_paths_web,
:throttle_authenticated_packages_api,
:throttle_authenticated_git_lfs,
- :throttle_authenticated_files_api
+ :throttle_authenticated_files_api,
+ :throttle_authenticated_deprecated_api
].freeze
PAYLOAD_KEYS = [
diff --git a/lib/gitlab/metrics/web_transaction.rb b/lib/gitlab/metrics/web_transaction.rb
index 3ebfcc43b0b..544c142f7bb 100644
--- a/lib/gitlab/metrics/web_transaction.rb
+++ b/lib/gitlab/metrics/web_transaction.rb
@@ -57,10 +57,6 @@ module Gitlab
action = "#{controller.action_name}"
- # Try to get the feature category, but don't fail when the controller is
- # not an ApplicationController.
- feature_category = controller.class.try(:feature_category_for_action, action).to_s
-
# Devise exposes a method called "request_format" that does the below.
# However, this method is not available to all controllers (e.g. certain
# Doorkeeper controllers). As such we use the underlying code directly.
@@ -91,9 +87,6 @@ module Gitlab
if route
path = endpoint_paths_cache[route.request_method][route.path]
- grape_class = endpoint.options[:for]
- feature_category = grape_class.try(:feature_category_for_app, endpoint).to_s
-
{ controller: 'Grape', action: "#{route.request_method} #{path}", feature_category: feature_category }
end
end
@@ -109,6 +102,10 @@ module Gitlab
def endpoint_instrumentable_path(raw_path)
raw_path.sub('(.:format)', '').sub('/:version', '')
end
+
+ def feature_category
+ ::Gitlab::ApplicationContext.current_context_attribute(:feature_category) || ::Gitlab::FeatureCategories::FEATURE_CATEGORY_DEFAULT
+ end
end
end
end
diff --git a/lib/gitlab/middleware/multipart.rb b/lib/gitlab/middleware/multipart.rb
index 49be3ffc839..a047015e54f 100644
--- a/lib/gitlab/middleware/multipart.rb
+++ b/lib/gitlab/middleware/multipart.rb
@@ -158,6 +158,7 @@ module Gitlab
::Gitlab.config.uploads.storage_path,
::JobArtifactUploader.workhorse_upload_path,
::LfsObjectUploader.workhorse_upload_path,
+ ::DependencyProxy::FileUploader.workhorse_upload_path,
File.join(Rails.root, 'public/uploads/tmp')
] + package_allowed_paths
end
diff --git a/lib/gitlab/middleware/speedscope.rb b/lib/gitlab/middleware/speedscope.rb
index 74f334d9ab3..6992ac9b720 100644
--- a/lib/gitlab/middleware/speedscope.rb
+++ b/lib/gitlab/middleware/speedscope.rb
@@ -19,11 +19,12 @@ module Gitlab
require 'stackprof'
begin
+ mode = stackprof_mode(request)
flamegraph = ::StackProf.run(
- mode: :wall,
+ mode: mode,
raw: true,
aggregate: false,
- interval: ::Gitlab::StackProf::DEFAULT_INTERVAL_US
+ interval: ::Gitlab::StackProf.interval(mode)
) do
_, _, body = @app.call(env)
end
@@ -64,7 +65,7 @@ module Gitlab
var iframe = document.createElement('IFRAME');
iframe.setAttribute('id', 'speedscope-iframe');
document.body.appendChild(iframe);
- var iframeUrl = '#{speedscope_path}#profileURL=' + objUrl + '&title=' + 'Flamegraph for #{CGI.escape(path)}';
+ var iframeUrl = '#{speedscope_path}#profileURL=' + objUrl + '&title=' + 'Flamegraph for #{CGI.escape(path)} in #{stackprof_mode(request)} mode';
iframe.setAttribute('src', iframeUrl);
</script>
</body>
@@ -73,6 +74,17 @@ module Gitlab
[200, headers, [html]]
end
+
+ def stackprof_mode(request)
+ case request.params['stackprof_mode']&.to_sym
+ when :cpu
+ :cpu
+ when :object
+ :object
+ else
+ :wall
+ end
+ end
end
end
end
diff --git a/lib/gitlab/optimistic_locking.rb b/lib/gitlab/optimistic_locking.rb
index b5e304599ab..9f39b5f122f 100644
--- a/lib/gitlab/optimistic_locking.rb
+++ b/lib/gitlab/optimistic_locking.rb
@@ -11,7 +11,7 @@ module Gitlab
retry_attempts = 0
begin
- ActiveRecord::Base.transaction do # rubocop: disable Database/MultipleDatabases
+ subject.transaction do
yield(subject)
end
rescue ActiveRecord::StaleObjectError
diff --git a/lib/gitlab/pagination/keyset/in_operator_optimization/query_builder.rb b/lib/gitlab/pagination/keyset/in_operator_optimization/query_builder.rb
index 39d6e016ac7..53faf8469f2 100644
--- a/lib/gitlab/pagination/keyset/in_operator_optimization/query_builder.rb
+++ b/lib/gitlab/pagination/keyset/in_operator_optimization/query_builder.rb
@@ -6,10 +6,7 @@ module Gitlab
module InOperatorOptimization
# rubocop: disable CodeReuse/ActiveRecord
class QueryBuilder
- UnsupportedScopeOrder = Class.new(StandardError)
-
RECURSIVE_CTE_NAME = 'recursive_keyset_cte'
- RECORDS_COLUMN = 'records'
# This class optimizes slow database queries (PostgreSQL specific) where the
# IN SQL operator is used with sorting.
@@ -42,26 +39,19 @@ module Gitlab
# > array_mapping_scope: array_mapping_scope,
# > finder_query: finder_query
# > ).execute.limit(20)
- def initialize(scope:, array_scope:, array_mapping_scope:, finder_query:, values: {})
+ def initialize(scope:, array_scope:, array_mapping_scope:, finder_query: nil, values: {})
@scope, success = Gitlab::Pagination::Keyset::SimpleOrderBuilder.build(scope)
- unless success
- error_message = <<~MSG
- The order on the scope does not support keyset pagination. You might need to define a custom Order object.\n
- See https://docs.gitlab.com/ee/development/database/keyset_pagination.html#complex-order-configuration\n
- Or the Gitlab::Pagination::Keyset::Order class for examples
- MSG
- raise(UnsupportedScopeOrder, error_message)
- end
+ raise(UnsupportedScopeOrder) unless success
@order = Gitlab::Pagination::Keyset::Order.extract_keyset_order_object(scope)
@array_scope = array_scope
@array_mapping_scope = array_mapping_scope
- @finder_query = finder_query
@values = values
@model = @scope.model
@table_name = @model.table_name
@arel_table = @model.arel_table
+ @finder_strategy = finder_query.present? ? Strategies::RecordLoaderStrategy.new(finder_query, model, order_by_columns) : Strategies::OrderValuesLoaderStrategy.new(model, order_by_columns)
end
def execute
@@ -74,7 +64,7 @@ module Gitlab
q = cte
.apply_to(model.where({})
.with(selector_cte.to_arel))
- .select(result_collector_final_projections)
+ .select(finder_strategy.final_projections)
.where("count <> 0") # filter out the initializer row
model.from(q.arel.as(table_name))
@@ -82,13 +72,13 @@ module Gitlab
private
- attr_reader :array_scope, :scope, :order, :array_mapping_scope, :finder_query, :values, :model, :table_name, :arel_table
+ attr_reader :array_scope, :scope, :order, :array_mapping_scope, :finder_strategy, :values, :model, :table_name, :arel_table
def initializer_query
array_column_names = array_scope_columns.array_aggregated_column_names + order_by_columns.array_aggregated_column_names
projections = [
- *result_collector_initializer_columns,
+ *finder_strategy.initializer_columns,
*array_column_names,
'0::bigint AS count'
]
@@ -156,7 +146,7 @@ module Gitlab
order_column_value_arrays = order_by_columns.replace_value_in_array_by_position_expressions
select = [
- *result_collector_columns,
+ *finder_strategy.columns,
*array_column_list,
*order_column_value_arrays,
"#{RECURSIVE_CTE_NAME}.count + 1"
@@ -254,23 +244,6 @@ module Gitlab
end.join(", ")
end
- def result_collector_initializer_columns
- ["NULL::#{table_name} AS #{RECORDS_COLUMN}"]
- end
-
- def result_collector_columns
- query = finder_query
- .call(*order_by_columns.array_lookup_expressions_by_position(RECURSIVE_CTE_NAME))
- .select("#{table_name}")
- .limit(1)
-
- ["(#{query.to_sql})"]
- end
-
- def result_collector_final_projections
- ["(#{RECORDS_COLUMN}).*"]
- end
-
def array_scope_columns
@array_scope_columns ||= ArrayScopeColumns.new(array_scope.select_values)
end
diff --git a/lib/gitlab/pagination/keyset/in_operator_optimization/strategies/order_values_loader_strategy.rb b/lib/gitlab/pagination/keyset/in_operator_optimization/strategies/order_values_loader_strategy.rb
new file mode 100644
index 00000000000..fc2b56048f6
--- /dev/null
+++ b/lib/gitlab/pagination/keyset/in_operator_optimization/strategies/order_values_loader_strategy.rb
@@ -0,0 +1,38 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Pagination
+ module Keyset
+ module InOperatorOptimization
+ module Strategies
+ class OrderValuesLoaderStrategy
+ def initialize(model, order_by_columns)
+ @model = model
+ @order_by_columns = order_by_columns
+ end
+
+ def initializer_columns
+ order_by_columns.map do |column|
+ column_name = column.original_column_name.to_s
+ type = model.columns_hash[column_name].sql_type
+ "NULL::#{type} AS #{column_name}"
+ end
+ end
+
+ def columns
+ order_by_columns.array_lookup_expressions_by_position(QueryBuilder::RECURSIVE_CTE_NAME)
+ end
+
+ def final_projections
+ order_by_columns.map(&:original_column_name)
+ end
+
+ private
+
+ attr_reader :model, :order_by_columns
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/pagination/keyset/in_operator_optimization/strategies/record_loader_strategy.rb b/lib/gitlab/pagination/keyset/in_operator_optimization/strategies/record_loader_strategy.rb
new file mode 100644
index 00000000000..b12c33d6e51
--- /dev/null
+++ b/lib/gitlab/pagination/keyset/in_operator_optimization/strategies/record_loader_strategy.rb
@@ -0,0 +1,42 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Pagination
+ module Keyset
+ module InOperatorOptimization
+ module Strategies
+ class RecordLoaderStrategy
+ RECORDS_COLUMN = 'records'
+
+ def initialize(finder_query, model, order_by_columns)
+ @finder_query = finder_query
+ @order_by_columns = order_by_columns
+ @table_name = model.table_name
+ end
+
+ def initializer_columns
+ ["NULL::#{table_name} AS #{RECORDS_COLUMN}"]
+ end
+
+ def columns
+ query = finder_query
+ .call(*order_by_columns.array_lookup_expressions_by_position(QueryBuilder::RECURSIVE_CTE_NAME))
+ .select("#{table_name}")
+ .limit(1)
+
+ ["(#{query.to_sql})"]
+ end
+
+ def final_projections
+ ["(#{RECORDS_COLUMN}).*"]
+ end
+
+ private
+
+ attr_reader :finder_query, :order_by_columns, :table_name
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/pagination/keyset/iterator.rb b/lib/gitlab/pagination/keyset/iterator.rb
index 14807fa37c4..bcd17fd0d34 100644
--- a/lib/gitlab/pagination/keyset/iterator.rb
+++ b/lib/gitlab/pagination/keyset/iterator.rb
@@ -4,12 +4,11 @@ module Gitlab
module Pagination
module Keyset
class Iterator
- UnsupportedScopeOrder = Class.new(StandardError)
-
- def initialize(scope:, use_union_optimization: true, in_operator_optimization_options: nil)
+ def initialize(scope:, cursor: {}, use_union_optimization: true, in_operator_optimization_options: nil)
@scope, success = Gitlab::Pagination::Keyset::SimpleOrderBuilder.build(scope)
- raise(UnsupportedScopeOrder, 'The order on the scope does not support keyset pagination') unless success
+ raise(UnsupportedScopeOrder) unless success
+ @cursor = cursor
@order = Gitlab::Pagination::Keyset::Order.extract_keyset_order_object(scope)
@use_union_optimization = in_operator_optimization_options ? false : use_union_optimization
@in_operator_optimization_options = in_operator_optimization_options
@@ -17,11 +16,9 @@ module Gitlab
# rubocop: disable CodeReuse/ActiveRecord
def each_batch(of: 1000)
- cursor_attributes = {}
-
loop do
current_scope = scope.dup
- relation = order.apply_cursor_conditions(current_scope, cursor_attributes, keyset_options)
+ relation = order.apply_cursor_conditions(current_scope, cursor, keyset_options)
relation = relation.reorder(order) unless @in_operator_optimization_options
relation = relation.limit(of)
@@ -30,14 +27,14 @@ module Gitlab
last_record = relation.last
break unless last_record
- cursor_attributes = order.cursor_attributes_for_node(last_record)
+ @cursor = order.cursor_attributes_for_node(last_record)
end
end
# rubocop: enable CodeReuse/ActiveRecord
private
- attr_reader :scope, :order
+ attr_reader :scope, :cursor, :order
def keyset_options
{
diff --git a/lib/gitlab/pagination/keyset/paginator.rb b/lib/gitlab/pagination/keyset/paginator.rb
index 1c71549d86a..1ff4589d8e1 100644
--- a/lib/gitlab/pagination/keyset/paginator.rb
+++ b/lib/gitlab/pagination/keyset/paginator.rb
@@ -19,8 +19,6 @@ module Gitlab
FORWARD_DIRECTION = 'n'
BACKWARD_DIRECTION = 'p'
- UnsupportedScopeOrder = Class.new(StandardError)
-
# scope - ActiveRecord::Relation object with order by clause
# cursor - Encoded cursor attributes as String. Empty value will requests the first page.
# per_page - Number of items per page.
@@ -167,7 +165,7 @@ module Gitlab
def build_scope(scope)
keyset_aware_scope, success = Gitlab::Pagination::Keyset::SimpleOrderBuilder.build(scope)
- raise(UnsupportedScopeOrder, 'The order on the scope does not support keyset pagination') unless success
+ raise(UnsupportedScopeOrder) unless success
keyset_aware_scope
end
diff --git a/lib/gitlab/pagination/keyset/unsupported_scope_order.rb b/lib/gitlab/pagination/keyset/unsupported_scope_order.rb
new file mode 100644
index 00000000000..1571c00e130
--- /dev/null
+++ b/lib/gitlab/pagination/keyset/unsupported_scope_order.rb
@@ -0,0 +1,19 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Pagination
+ module Keyset
+ class UnsupportedScopeOrder < StandardError
+ DEFAULT_ERROR_MESSAGE = <<~MSG
+ The order on the scope does not support keyset pagination. You might need to define a custom Order object.\n
+ See https://docs.gitlab.com/ee/development/database/keyset_pagination.html#complex-order-configuration\n
+ Or the Gitlab::Pagination::Keyset::Order class for examples
+ MSG
+
+ def message
+ DEFAULT_ERROR_MESSAGE
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/path_regex.rb b/lib/gitlab/path_regex.rb
index c648f4d1fd0..06a26c4830f 100644
--- a/lib/gitlab/path_regex.rb
+++ b/lib/gitlab/path_regex.rb
@@ -262,6 +262,10 @@ module Gitlab
@container_image_blob_sha_regex ||= %r{[\w+.-]+:?\w+}.freeze
end
+ def dependency_proxy_route_regex
+ @dependency_proxy_route_regex ||= %r{\A/v2/#{full_namespace_route_regex}/dependency_proxy/containers/#{container_image_regex}/(manifests|blobs)/#{container_image_blob_sha_regex}\z}
+ end
+
private
def personal_snippet_path_regex
diff --git a/lib/gitlab/performance_bar/stats.rb b/lib/gitlab/performance_bar/stats.rb
index 103cd65cb4b..cf524e69454 100644
--- a/lib/gitlab/performance_bar/stats.rb
+++ b/lib/gitlab/performance_bar/stats.rb
@@ -9,6 +9,9 @@ module Gitlab
ee/lib/ee/peek
lib/peek
lib/gitlab/database
+ lib/gitlab/gitaly_client.rb
+ lib/gitlab/gitaly_client/call.rb
+ lib/gitlab/instrumentation/redis_interceptor.rb
].freeze
def initialize(redis)
@@ -19,7 +22,9 @@ module Gitlab
data = request(id)
return unless data
- log_sql_queries(id, data)
+ log_queries(id, data, 'active-record')
+ log_queries(id, data, 'gitaly')
+ log_queries(id, data, 'redis')
rescue StandardError => err
logger.error(message: "failed to process request id #{id}: #{err.message}")
end
@@ -32,15 +37,15 @@ module Gitlab
Gitlab::Json.parse(json_data)
end
- def log_sql_queries(id, data)
- queries_by_location(data).each do |location, queries|
+ def log_queries(id, data, type)
+ queries_by_location(data, type).each do |location, queries|
next unless location
duration = queries.sum { |query| query['duration'].to_f }
log_info = {
method_path: "#{location[:filename]}:#{location[:method]}",
filename: location[:filename],
- type: :sql,
+ query_type: type,
request_id: id,
count: queries.count,
duration_ms: duration
@@ -50,8 +55,8 @@ module Gitlab
end
end
- def queries_by_location(data)
- return [] unless queries = data.dig('data', 'active-record', 'details')
+ def queries_by_location(data, type)
+ return [] unless queries = data.dig('data', type, 'details')
queries.group_by do |query|
parse_backtrace(query['backtrace'])
diff --git a/lib/gitlab/quick_actions/merge_request_actions.rb b/lib/gitlab/quick_actions/merge_request_actions.rb
index 6348a4902f8..cc2021e14e3 100644
--- a/lib/gitlab/quick_actions/merge_request_actions.rb
+++ b/lib/gitlab/quick_actions/merge_request_actions.rb
@@ -148,7 +148,7 @@ module Gitlab
quick_action_target.persisted? && quick_action_target.can_be_approved_by?(current_user)
end
command :approve do
- success = MergeRequests::ApprovalService.new(project: quick_action_target.project, current_user: current_user).execute(quick_action_target)
+ success = ::MergeRequests::ApprovalService.new(project: quick_action_target.project, current_user: current_user).execute(quick_action_target)
next unless success
@@ -162,7 +162,7 @@ module Gitlab
quick_action_target.persisted? && quick_action_target.can_be_unapproved_by?(current_user)
end
command :unapprove do
- success = MergeRequests::RemoveApprovalService.new(project: quick_action_target.project, current_user: current_user).execute(quick_action_target)
+ success = ::MergeRequests::RemoveApprovalService.new(project: quick_action_target.project, current_user: current_user).execute(quick_action_target)
next unless success
@@ -275,7 +275,7 @@ module Gitlab
end
def merge_orchestration_service
- @merge_orchestration_service ||= MergeRequests::MergeOrchestrationService.new(project, current_user)
+ @merge_orchestration_service ||= ::MergeRequests::MergeOrchestrationService.new(project, current_user)
end
def preferred_auto_merge_strategy(merge_request)
diff --git a/lib/gitlab/quick_actions/relate_actions.rb b/lib/gitlab/quick_actions/relate_actions.rb
index 95f71214667..1de23523f01 100644
--- a/lib/gitlab/quick_actions/relate_actions.rb
+++ b/lib/gitlab/quick_actions/relate_actions.rb
@@ -17,11 +17,17 @@ module Gitlab
params '#issue'
types Issue
condition do
- quick_action_target.persisted? &&
- current_user.can?(:"update_#{quick_action_target.to_ability_name}", quick_action_target)
+ current_user.can?(:"update_#{quick_action_target.to_ability_name}", quick_action_target)
end
- command :relate do |related_param|
- IssueLinks::CreateService.new(quick_action_target, current_user, { issuable_references: [related_param] }).execute
+ command :relate do |related_reference|
+ service = IssueLinks::CreateService.new(quick_action_target, current_user, { issuable_references: [related_reference] })
+ create_issue_link = proc { service.execute }
+
+ if quick_action_target.persisted?
+ create_issue_link.call
+ else
+ quick_action_target.run_after_commit(&create_issue_link)
+ end
end
end
end
diff --git a/lib/gitlab/rack_attack/instrumented_cache_store.rb b/lib/gitlab/rack_attack/instrumented_cache_store.rb
index 8cf9082384f..d8beb259fba 100644
--- a/lib/gitlab/rack_attack/instrumented_cache_store.rb
+++ b/lib/gitlab/rack_attack/instrumented_cache_store.rb
@@ -2,9 +2,10 @@
module Gitlab
module RackAttack
- # This class is a proxy for all Redis calls made by RackAttack. All the
- # calls are instrumented, then redirected to ::Rails.cache. This class
- # instruments the standard interfaces of ActiveRecord::Cache defined in
+ # This class is a proxy for all Redis calls made by RackAttack. All
+ # the calls are instrumented, then redirected to the underlying
+ # store (in `.store). This class instruments the standard interfaces
+ # of ActiveRecord::Cache defined in
# https://github.com/rails/rails/blob/v6.0.3.1/activesupport/lib/active_support/cache.rb#L315
#
# For more information, please see
@@ -14,7 +15,7 @@ module Gitlab
delegate :silence!, :mute, to: :@upstream_store
- def initialize(upstream_store: ::Rails.cache, notifier: ActiveSupport::Notifications)
+ def initialize(upstream_store: ::Gitlab::Redis::RateLimiting.cache_store, notifier: ActiveSupport::Notifications)
@upstream_store = upstream_store
@notifier = notifier
end
diff --git a/lib/gitlab/rack_attack/request.rb b/lib/gitlab/rack_attack/request.rb
index 099174842d0..dbc77c9f9d7 100644
--- a/lib/gitlab/rack_attack/request.rb
+++ b/lib/gitlab/rack_attack/request.rb
@@ -4,6 +4,7 @@ module Gitlab
module RackAttack
module Request
FILES_PATH_REGEX = %r{^/api/v\d+/projects/[^/]+/repository/files/.+}.freeze
+ GROUP_PATH_REGEX = %r{^/api/v\d+/groups/[^/]+/?$}.freeze
def unauthenticated?
!(authenticated_user_id([:api, :rss, :ics]) || authenticated_runner_id)
@@ -71,6 +72,7 @@ module Gitlab
!should_be_skipped? &&
!throttle_unauthenticated_packages_api? &&
!throttle_unauthenticated_files_api? &&
+ !throttle_unauthenticated_deprecated_api? &&
Gitlab::Throttle.settings.throttle_unauthenticated_api_enabled &&
unauthenticated?
end
@@ -87,6 +89,7 @@ module Gitlab
api_request? &&
!throttle_authenticated_packages_api? &&
!throttle_authenticated_files_api? &&
+ !throttle_authenticated_deprecated_api? &&
Gitlab::Throttle.settings.throttle_authenticated_api_enabled
end
@@ -147,6 +150,17 @@ module Gitlab
Gitlab::Throttle.settings.throttle_authenticated_files_api_enabled
end
+ def throttle_unauthenticated_deprecated_api?
+ deprecated_api_request? &&
+ Gitlab::Throttle.settings.throttle_unauthenticated_deprecated_api_enabled &&
+ unauthenticated?
+ end
+
+ def throttle_authenticated_deprecated_api?
+ deprecated_api_request? &&
+ Gitlab::Throttle.settings.throttle_authenticated_deprecated_api_enabled
+ end
+
private
def authenticated_user_id(request_formats)
@@ -176,6 +190,15 @@ module Gitlab
def files_api_path?
path =~ FILES_PATH_REGEX
end
+
+ def deprecated_api_request?
+ # The projects member of the groups endpoint is deprecated. If left
+ # unspecified, with_projects defaults to true
+ with_projects = params['with_projects']
+ with_projects = true if with_projects.blank?
+
+ path =~ GROUP_PATH_REGEX && Gitlab::Utils.to_boolean(with_projects)
+ end
end
end
end
diff --git a/lib/gitlab/redis/cache.rb b/lib/gitlab/redis/cache.rb
index 98b66080b42..a2c7b5e29db 100644
--- a/lib/gitlab/redis/cache.rb
+++ b/lib/gitlab/redis/cache.rb
@@ -5,12 +5,15 @@ module Gitlab
class Cache < ::Gitlab::Redis::Wrapper
CACHE_NAMESPACE = 'cache:gitlab'
- private
-
- def raw_config_hash
- config = super
- config[:url] = 'redis://localhost:6380' if config[:url].blank?
- config
+ # Full list of options:
+ # https://api.rubyonrails.org/classes/ActiveSupport/Cache/RedisCacheStore.html#method-c-new
+ def self.active_support_config
+ {
+ redis: pool,
+ compress: Gitlab::Utils.to_boolean(ENV.fetch('ENABLE_REDIS_CACHE_COMPRESSION', '1')),
+ namespace: CACHE_NAMESPACE,
+ expires_in: 2.weeks # Cache should not grow forever
+ }
end
end
end
diff --git a/lib/gitlab/redis/queues.rb b/lib/gitlab/redis/queues.rb
index 9e291a73bb6..e60e59dcf01 100644
--- a/lib/gitlab/redis/queues.rb
+++ b/lib/gitlab/redis/queues.rb
@@ -2,21 +2,12 @@
# We need this require for MailRoom
require_relative 'wrapper' unless defined?(::Gitlab::Redis::Wrapper)
-require 'active_support/core_ext/object/blank'
module Gitlab
module Redis
class Queues < ::Gitlab::Redis::Wrapper
SIDEKIQ_NAMESPACE = 'resque:gitlab'
MAILROOM_NAMESPACE = 'mail_room:gitlab'
-
- private
-
- def raw_config_hash
- config = super
- config[:url] = 'redis://localhost:6381' if config[:url].blank?
- config
- end
end
end
end
diff --git a/lib/gitlab/redis/rate_limiting.rb b/lib/gitlab/redis/rate_limiting.rb
new file mode 100644
index 00000000000..4ae1d55e4ce
--- /dev/null
+++ b/lib/gitlab/redis/rate_limiting.rb
@@ -0,0 +1,16 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Redis
+ class RateLimiting < ::Gitlab::Redis::Wrapper
+ # The data we store on RateLimiting used to be stored on Cache.
+ def self.config_fallback
+ Cache
+ end
+
+ def self.cache_store
+ @cache_store ||= ActiveSupport::Cache::RedisCacheStore.new(redis: pool, namespace: Cache::CACHE_NAMESPACE)
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/redis/sessions.rb b/lib/gitlab/redis/sessions.rb
new file mode 100644
index 00000000000..3bf1eb6211d
--- /dev/null
+++ b/lib/gitlab/redis/sessions.rb
@@ -0,0 +1,12 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Redis
+ class Sessions < ::Gitlab::Redis::Wrapper
+ # The data we store on Sessions used to be stored on SharedState.
+ def self.config_fallback
+ SharedState
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/redis/shared_state.rb b/lib/gitlab/redis/shared_state.rb
index d62516bd287..1250eabb041 100644
--- a/lib/gitlab/redis/shared_state.rb
+++ b/lib/gitlab/redis/shared_state.rb
@@ -7,14 +7,6 @@ module Gitlab
USER_SESSIONS_NAMESPACE = 'session:user:gitlab'
USER_SESSIONS_LOOKUP_NAMESPACE = 'session:lookup:user:gitlab'
IP_SESSIONS_LOOKUP_NAMESPACE = 'session:lookup:ip:gitlab2'
-
- private
-
- def raw_config_hash
- config = super
- config[:url] = 'redis://localhost:6382' if config[:url].blank?
- config
- end
end
end
end
diff --git a/lib/gitlab/redis/wrapper.rb b/lib/gitlab/redis/wrapper.rb
index 3c8ac07215d..7b804038146 100644
--- a/lib/gitlab/redis/wrapper.rb
+++ b/lib/gitlab/redis/wrapper.rb
@@ -6,6 +6,7 @@
# Rails.
require 'active_support/core_ext/hash/keys'
require 'active_support/core_ext/module/delegation'
+require 'active_support/core_ext/object/blank'
require 'active_support/core_ext/string/inflections'
# Explicitly load Redis::Store::Factory so we can read Redis configuration in
@@ -95,6 +96,8 @@ module Gitlab
end
def instrumentation_class
+ return unless defined?(::Gitlab::Instrumentation::Redis)
+
"::Gitlab::Instrumentation::Redis::#{store_name}".constantize
end
end
@@ -111,6 +114,10 @@ module Gitlab
raw_config_hash[:url]
end
+ def db
+ redis_store_options[:db]
+ end
+
def sentinels
raw_config_hash[:sentinels]
end
@@ -150,11 +157,35 @@ module Gitlab
def raw_config_hash
config_data = fetch_config
- if config_data
- config_data.is_a?(String) ? { url: config_data } : config_data.deep_symbolize_keys
- else
- { url: '' }
+ config_hash =
+ if config_data
+ config_data.is_a?(String) ? { url: config_data } : config_data.deep_symbolize_keys
+ else
+ { url: '' }
+ end
+
+ if config_hash[:url].blank?
+ config_hash[:url] = legacy_fallback_urls[self.class.store_name] || legacy_fallback_urls[self.class.config_fallback.store_name]
end
+
+ config_hash
+ end
+
+ # These URLs were defined for cache, queues, and shared_state in
+ # code. They are used only when no config file exists at all for a
+ # given instance. The configuration does not seem particularly
+ # useful - it uses different ports on localhost - but we cannot
+ # confidently delete it as we don't know if any instances rely on
+ # this.
+ #
+ # DO NOT ADD new instances here. All new instances should define a
+ # `.config_fallback`, which will then be used to look up this URL.
+ def legacy_fallback_urls
+ {
+ 'Cache' => 'redis://localhost:6380',
+ 'Queues' => 'redis://localhost:6381',
+ 'SharedState' => 'redis://localhost:6382'
+ }
end
def fetch_config
diff --git a/lib/gitlab/regex.rb b/lib/gitlab/regex.rb
index a88ef5fe73e..8b2f786a91a 100644
--- a/lib/gitlab/regex.rb
+++ b/lib/gitlab/regex.rb
@@ -131,7 +131,7 @@ module Gitlab
end
def helm_channel_regex
- @helm_channel_regex ||= %r{\A[-\.\_a-zA-Z0-9]+\z}.freeze
+ @helm_channel_regex ||= %r{\A([a-zA-Z0-9](\.|-|_)?){1,255}(?<!\.|-|_)\z}.freeze
end
def helm_package_regex
@@ -220,12 +220,12 @@ module Gitlab
# The character range \p{Alnum} overlaps with \u{00A9}-\u{1f9ff}
# hence the Ruby warning.
# https://gitlab.com/gitlab-org/gitlab/merge_requests/23165#not-easy-fixable
- @project_name_regex ||= /\A[\p{Alnum}\u{00A9}-\u{1f9ff}_][\p{Alnum}\p{Pd}\u{00A9}-\u{1f9ff}_\. ]*\z/.freeze
+ @project_name_regex ||= /\A[\p{Alnum}\u{00A9}-\u{1f9ff}_][\p{Alnum}\p{Pd}\u{002B}\u{00A9}-\u{1f9ff}_\. ]*\z/.freeze
end
def project_name_regex_message
- "can contain only letters, digits, emojis, '_', '.', dash, space. " \
- "It must start with letter, digit, emoji or '_'."
+ "can contain only letters, digits, emojis, '_', '.', '+', dashes, or spaces. " \
+ "It must start with a letter, digit, emoji, or '_'."
end
def group_name_regex
@@ -409,7 +409,7 @@ module Gitlab
end
def merge_request_draft
- /\A(?i)(\[draft\]|\(draft\)|draft:|draft\s\-\s|draft\z)/
+ /\A(?i)(\[draft\]|\(draft\)|draft:)/
end
def issue
diff --git a/lib/gitlab/request_endpoints.rb b/lib/gitlab/request_endpoints.rb
new file mode 100644
index 00000000000..157c0f91e65
--- /dev/null
+++ b/lib/gitlab/request_endpoints.rb
@@ -0,0 +1,41 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module RequestEndpoints
+ class << self
+ def all_api_endpoints
+ # This compile does not do anything if the routes were already built
+ # but if they weren't, the routes will be drawn and available for the rest of
+ # application.
+ API::API.compile!
+ API::API.routes.select { |route| route.app.options[:for] < API::Base }
+ end
+
+ def all_controller_actions
+ # This will return tuples of all controller actions defined in the routes
+ # Only for controllers inheriting ApplicationController
+ # Excluding controllers from gems (OAuth, Sidekiq)
+ Rails.application.routes.routes.filter_map do |route|
+ route_info = route.required_defaults.presence
+ next unless route_info
+ next if route_info[:controller].blank? || route_info[:action].blank?
+
+ controller = constantize_controller(route_info[:controller])
+ next unless controller&.include?(::Gitlab::EndpointAttributes)
+ next if controller == ApplicationController
+ next if controller == Devise::UnlocksController
+
+ [controller, route_info[:action]]
+ end
+ end
+
+ private
+
+ def constantize_controller(name)
+ "#{name.camelize}Controller".constantize
+ rescue NameError
+ nil # some controllers, like the omniauth ones are dynamic
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/saas.rb b/lib/gitlab/saas.rb
index e87c2a0b700..9220ad1be6c 100644
--- a/lib/gitlab/saas.rb
+++ b/lib/gitlab/saas.rb
@@ -36,6 +36,14 @@ module Gitlab
def self.gitlab_com_status_url
'https://status.gitlab.com'
end
+
+ def self.about_pricing_url
+ "https://about.gitlab.com/pricing"
+ end
+
+ def self.about_pricing_faq_url
+ "https://about.gitlab.com/gitlab-com/#faq"
+ end
end
end
diff --git a/lib/gitlab/sidekiq_config.rb b/lib/gitlab/sidekiq_config.rb
index bd6b80530c3..5663c51bb7a 100644
--- a/lib/gitlab/sidekiq_config.rb
+++ b/lib/gitlab/sidekiq_config.rb
@@ -23,12 +23,12 @@ module Gitlab
DEFAULT_WORKERS = {
'_' => DummyWorker.new(
queue: 'default',
- weight: 1, tags: []
+ weight: 1,
+ tags: []
),
'ActionMailer::MailDeliveryJob' => DummyWorker.new(
name: 'ActionMailer::MailDeliveryJob',
queue: 'mailers',
- feature_category: :issue_tracking,
urgency: 'low',
weight: 2,
tags: []
diff --git a/lib/gitlab/sidekiq_config/dummy_worker.rb b/lib/gitlab/sidekiq_config/dummy_worker.rb
index b7f53da8e00..8a2ea1acaab 100644
--- a/lib/gitlab/sidekiq_config/dummy_worker.rb
+++ b/lib/gitlab/sidekiq_config/dummy_worker.rb
@@ -6,7 +6,6 @@ module Gitlab
class DummyWorker
ATTRIBUTE_METHODS = {
name: :name,
- feature_category: :get_feature_category,
has_external_dependencies: :worker_has_external_dependencies?,
urgency: :get_urgency,
resource_boundary: :get_worker_resource_boundary,
@@ -27,6 +26,24 @@ module Gitlab
nil
end
+ # All dummy workers are unowned; get the feature category from the
+ # context if available.
+ def get_feature_category
+ Gitlab::ApplicationContext.current_context_attribute('meta.feature_category') || :not_owned
+ end
+
+ def feature_category_not_owned?
+ true
+ end
+
+ def get_worker_context
+ nil
+ end
+
+ def context_for_arguments(*)
+ nil
+ end
+
ATTRIBUTE_METHODS.each do |attribute, meth|
define_method meth do
@attributes[attribute]
diff --git a/lib/gitlab/sidekiq_enq.rb b/lib/gitlab/sidekiq_enq.rb
new file mode 100644
index 00000000000..d8a01ac8ef4
--- /dev/null
+++ b/lib/gitlab/sidekiq_enq.rb
@@ -0,0 +1,51 @@
+# frozen_string_literal: true
+
+# This is a copy of https://github.com/mperham/sidekiq/blob/32c55e31659a1e6bd42f98334cca5eef2863de8d/lib/sidekiq/scheduled.rb#L11-L34
+#
+# It effectively reverts
+# https://github.com/mperham/sidekiq/commit/9b75467b33759888753191413eddbc15c37a219e
+# because we observe that the extra ZREMs caused by this change can lead to high
+# CPU usage on Redis at peak times:
+# https://gitlab.com/gitlab-com/gl-infra/scalability/-/issues/1179
+#
+module Gitlab
+ class SidekiqEnq
+ def enqueue_jobs(now = Time.now.to_f.to_s, sorted_sets = Sidekiq::Scheduled::SETS)
+ # A job's "score" in Redis is the time at which it should be processed.
+ # Just check Redis for the set of jobs with a timestamp before now.
+ Sidekiq.redis do |conn|
+ sorted_sets.each do |sorted_set|
+ start_time = ::Gitlab::Metrics::System.monotonic_time
+ jobs = redundant_jobs = 0
+
+ Sidekiq.logger.info(message: 'Enqueuing scheduled jobs', status: 'start', sorted_set: sorted_set)
+
+ # Get the next item in the queue if it's score (time to execute) is <= now.
+ # We need to go through the list one at a time to reduce the risk of something
+ # going wrong between the time jobs are popped from the scheduled queue and when
+ # they are pushed onto a work queue and losing the jobs.
+ while (job = conn.zrangebyscore(sorted_set, "-inf", now, limit: [0, 1]).first)
+
+ # Pop item off the queue and add it to the work queue. If the job can't be popped from
+ # the queue, it's because another process already popped it so we can move on to the
+ # next one.
+ if conn.zrem(sorted_set, job)
+ jobs += 1
+ Sidekiq::Client.push(Sidekiq.load_json(job))
+ else
+ redundant_jobs += 1
+ end
+ end
+
+ end_time = ::Gitlab::Metrics::System.monotonic_time
+ Sidekiq.logger.info(message: 'Enqueuing scheduled jobs',
+ status: 'done',
+ sorted_set: sorted_set,
+ jobs_count: jobs,
+ redundant_jobs_count: redundant_jobs,
+ duration_s: end_time - start_time)
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/sidekiq_logging/structured_logger.rb b/lib/gitlab/sidekiq_logging/structured_logger.rb
index 1aebce987fe..3438bc0f3ef 100644
--- a/lib/gitlab/sidekiq_logging/structured_logger.rb
+++ b/lib/gitlab/sidekiq_logging/structured_logger.rb
@@ -5,7 +5,7 @@ require 'active_record/log_subscriber'
module Gitlab
module SidekiqLogging
- class StructuredLogger
+ class StructuredLogger < Sidekiq::JobLogger
include LogsJobs
def call(job, queue)
@@ -55,6 +55,9 @@ module Gitlab
scheduling_latency_s = ::Gitlab::InstrumentationHelper.queue_duration_for_job(payload)
payload['scheduling_latency_s'] = scheduling_latency_s if scheduling_latency_s
+ enqueue_latency_s = ::Gitlab::InstrumentationHelper.enqueue_latency_for_scheduled_job(payload)
+ payload['enqueue_latency_s'] = enqueue_latency_s if enqueue_latency_s
+
payload
end
diff --git a/lib/gitlab/sidekiq_middleware.rb b/lib/gitlab/sidekiq_middleware.rb
index d084e9e9d7e..c97b1632bf8 100644
--- a/lib/gitlab/sidekiq_middleware.rb
+++ b/lib/gitlab/sidekiq_middleware.rb
@@ -13,6 +13,13 @@ module Gitlab
chain.add ::Gitlab::SidekiqMiddleware::SizeLimiter::Server
chain.add ::Gitlab::SidekiqMiddleware::Monitor
+ # Labkit wraps the job in the `Labkit::Context` resurrected from
+ # the job-hash. We need properties from the context for
+ # recording metrics, so this needs to be before
+ # `::Gitlab::SidekiqMiddleware::ServerMetrics` (if we're using
+ # that).
+ chain.add ::Labkit::Middleware::Sidekiq::Server
+
if metrics
chain.add ::Gitlab::SidekiqMiddleware::ServerMetrics
@@ -24,7 +31,6 @@ module Gitlab
chain.add ::Gitlab::SidekiqMiddleware::RequestStoreMiddleware
chain.add ::Gitlab::SidekiqMiddleware::ExtraDoneLogMetadata
chain.add ::Gitlab::SidekiqMiddleware::BatchLoader
- chain.add ::Labkit::Middleware::Sidekiq::Server
chain.add ::Gitlab::SidekiqMiddleware::InstrumentationLogger
chain.add ::Gitlab::SidekiqMiddleware::AdminMode::Server
chain.add ::Gitlab::SidekiqVersioning::Middleware
@@ -33,7 +39,7 @@ module Gitlab
# DuplicateJobs::Server should be placed at the bottom, but before the SidekiqServerMiddleware,
# so we can compare the latest WAL location against replica
chain.add ::Gitlab::SidekiqMiddleware::DuplicateJobs::Server
- chain.add ::Gitlab::Database::LoadBalancing::SidekiqServerMiddleware if load_balancing_enabled?
+ chain.add ::Gitlab::Database::LoadBalancing::SidekiqServerMiddleware
end
end
@@ -46,7 +52,7 @@ module Gitlab
chain.add ::Labkit::Middleware::Sidekiq::Client
# Sidekiq Client Middleware should be placed before DuplicateJobs::Client middleware,
# so we can store WAL location before we deduplicate the job.
- chain.add ::Gitlab::Database::LoadBalancing::SidekiqClientMiddleware if load_balancing_enabled?
+ chain.add ::Gitlab::Database::LoadBalancing::SidekiqClientMiddleware
chain.add ::Gitlab::SidekiqMiddleware::DuplicateJobs::Client
chain.add ::Gitlab::SidekiqStatus::ClientMiddleware
chain.add ::Gitlab::SidekiqMiddleware::AdminMode::Client
@@ -55,10 +61,5 @@ module Gitlab
chain.add ::Gitlab::SidekiqMiddleware::ClientMetrics
end
end
-
- def self.load_balancing_enabled?
- ::Gitlab::Database::LoadBalancing.enable?
- end
- private_class_method :load_balancing_enabled?
end
end
diff --git a/lib/gitlab/sidekiq_middleware/client_metrics.rb b/lib/gitlab/sidekiq_middleware/client_metrics.rb
index e3cc7b28c41..ef80ed706f3 100644
--- a/lib/gitlab/sidekiq_middleware/client_metrics.rb
+++ b/lib/gitlab/sidekiq_middleware/client_metrics.rb
@@ -13,9 +13,15 @@ module Gitlab
def call(worker_class, job, queue, _redis_pool)
# worker_class can either be the string or class of the worker being enqueued.
- worker_class = worker_class.safe_constantize if worker_class.respond_to?(:safe_constantize)
+ worker_class = worker_class.to_s.safe_constantize
+
labels = create_labels(worker_class, queue, job)
- labels[:scheduling] = job.key?('at') ? 'delayed' : 'immediate'
+ if job.key?('at')
+ labels[:scheduling] = 'delayed'
+ job[:scheduled_at] = job['at']
+ else
+ labels[:scheduling] = 'immediate'
+ end
@metrics.fetch(ENQUEUED).increment(labels, 1)
diff --git a/lib/gitlab/sidekiq_middleware/duplicate_jobs/duplicate_job.rb b/lib/gitlab/sidekiq_middleware/duplicate_jobs/duplicate_job.rb
index aeb58d7c153..e63164efc94 100644
--- a/lib/gitlab/sidekiq_middleware/duplicate_jobs/duplicate_job.rb
+++ b/lib/gitlab/sidekiq_middleware/duplicate_jobs/duplicate_job.rb
@@ -64,9 +64,9 @@ module Gitlab
Sidekiq.redis do |redis|
redis.multi do |multi|
- redis.set(idempotency_key, jid, ex: expiry, nx: true)
- read_wal_locations = check_existing_wal_locations!(redis, expiry)
- read_jid = redis.get(idempotency_key)
+ multi.set(idempotency_key, jid, ex: expiry, nx: true)
+ read_wal_locations = check_existing_wal_locations!(multi, expiry)
+ read_jid = multi.get(idempotency_key)
end
end
@@ -81,9 +81,9 @@ module Gitlab
return unless job_wal_locations.present?
Sidekiq.redis do |redis|
- redis.multi do
+ redis.multi do |multi|
job_wal_locations.each do |connection_name, location|
- redis.eval(LUA_SET_WAL_SCRIPT, keys: [wal_location_key(connection_name)], argv: [location, pg_wal_lsn_diff(connection_name).to_i, WAL_LOCATION_TTL])
+ multi.eval(LUA_SET_WAL_SCRIPT, keys: [wal_location_key(connection_name)], argv: [location, pg_wal_lsn_diff(connection_name).to_i, WAL_LOCATION_TTL])
end
end
end
@@ -96,9 +96,9 @@ module Gitlab
read_wal_locations = {}
Sidekiq.redis do |redis|
- redis.multi do
+ redis.multi do |multi|
job_wal_locations.keys.each do |connection_name|
- read_wal_locations[connection_name] = redis.lindex(wal_location_key(connection_name), 0)
+ read_wal_locations[connection_name] = multi.lindex(wal_location_key(connection_name), 0)
end
end
end
@@ -110,8 +110,8 @@ module Gitlab
def delete!
Sidekiq.redis do |redis|
redis.multi do |multi|
- redis.del(idempotency_key)
- delete_wal_locations!(redis)
+ multi.del(idempotency_key)
+ delete_wal_locations!(multi)
end
end
end
@@ -140,13 +140,14 @@ module Gitlab
def idempotent?
return false unless worker_klass
return false unless worker_klass.respond_to?(:idempotent?)
+ return false unless preserve_wal_location? || !worker_klass.utilizes_load_balancing_capabilities?
worker_klass.idempotent?
end
private
- attr_accessor :existing_wal_locations
+ attr_writer :existing_wal_locations
attr_reader :queue_name, :job
attr_writer :existing_jid
@@ -154,8 +155,33 @@ module Gitlab
@worker_klass ||= worker_class_name.to_s.safe_constantize
end
+ def delete_wal_locations!(redis)
+ job_wal_locations.keys.each do |connection_name|
+ redis.del(wal_location_key(connection_name))
+ redis.del(existing_wal_location_key(connection_name))
+ end
+ end
+
+ def check_existing_wal_locations!(redis, expiry)
+ read_wal_locations = {}
+
+ job_wal_locations.each do |connection_name, location|
+ key = existing_wal_location_key(connection_name)
+ redis.set(key, location, ex: expiry, nx: true)
+ read_wal_locations[connection_name] = redis.get(key)
+ end
+
+ read_wal_locations
+ end
+
+ def job_wal_locations
+ return {} unless preserve_wal_location?
+
+ job['wal_locations'] || {}
+ end
+
def pg_wal_lsn_diff(connection_name)
- Gitlab::Database::DATABASES[connection_name].pg_wal_lsn_diff(job_wal_locations[connection_name], existing_wal_locations[connection_name])
+ Gitlab::Database.databases[connection_name].pg_wal_lsn_diff(job_wal_locations[connection_name], existing_wal_locations[connection_name])
end
def strategy
@@ -178,12 +204,6 @@ module Gitlab
job['jid']
end
- def job_wal_locations
- return {} unless preserve_wal_location?
-
- job['wal_locations'] || {}
- end
-
def existing_wal_location_key(connection_name)
"#{idempotency_key}:#{connection_name}:existing_wal_location"
end
@@ -208,23 +228,8 @@ module Gitlab
"#{worker_class_name}:#{Sidekiq.dump_json(arguments)}"
end
- def delete_wal_locations!(redis)
- job_wal_locations.keys.each do |connection_name|
- redis.del(wal_location_key(connection_name))
- redis.del(existing_wal_location_key(connection_name))
- end
- end
-
- def check_existing_wal_locations!(redis, expiry)
- read_wal_locations = {}
-
- job_wal_locations.each do |connection_name, location|
- key = existing_wal_location_key(connection_name)
- redis.set(key, location, ex: expiry, nx: true)
- read_wal_locations[connection_name] = redis.get(key)
- end
-
- read_wal_locations
+ def existing_wal_locations
+ @existing_wal_locations ||= {}
end
def preserve_wal_location?
diff --git a/lib/gitlab/sidekiq_middleware/duplicate_jobs/strategies/deduplicates_when_scheduling.rb b/lib/gitlab/sidekiq_middleware/duplicate_jobs/strategies/deduplicates_when_scheduling.rb
index fc58d4f5323..b0da85b74a6 100644
--- a/lib/gitlab/sidekiq_middleware/duplicate_jobs/strategies/deduplicates_when_scheduling.rb
+++ b/lib/gitlab/sidekiq_middleware/duplicate_jobs/strategies/deduplicates_when_scheduling.rb
@@ -4,11 +4,15 @@ module Gitlab
module SidekiqMiddleware
module DuplicateJobs
module Strategies
- module DeduplicatesWhenScheduling
+ class DeduplicatesWhenScheduling < Base
+ extend ::Gitlab::Utils::Override
+
+ override :initialize
def initialize(duplicate_job)
@duplicate_job = duplicate_job
end
+ override :schedule
def schedule(job)
if deduplicatable_job? && check! && duplicate_job.duplicate?
job['duplicate-of'] = duplicate_job.existing_jid
@@ -25,6 +29,7 @@ module Gitlab
yield
end
+ override :perform
def perform(job)
update_job_wal_location!(job)
end
diff --git a/lib/gitlab/sidekiq_middleware/duplicate_jobs/strategies/until_executed.rb b/lib/gitlab/sidekiq_middleware/duplicate_jobs/strategies/until_executed.rb
index 5164b994267..25f1b8b7c51 100644
--- a/lib/gitlab/sidekiq_middleware/duplicate_jobs/strategies/until_executed.rb
+++ b/lib/gitlab/sidekiq_middleware/duplicate_jobs/strategies/until_executed.rb
@@ -7,11 +7,7 @@ module Gitlab
# This strategy takes a lock before scheduling the job in a queue and
# removes the lock after the job has executed preventing a new job to be queued
# while a job is still executing.
- class UntilExecuted < Base
- extend ::Gitlab::Utils::Override
-
- include DeduplicatesWhenScheduling
-
+ class UntilExecuted < DeduplicatesWhenScheduling
override :perform
def perform(job)
super
diff --git a/lib/gitlab/sidekiq_middleware/duplicate_jobs/strategies/until_executing.rb b/lib/gitlab/sidekiq_middleware/duplicate_jobs/strategies/until_executing.rb
index 1f7e3a4ea30..693e404af73 100644
--- a/lib/gitlab/sidekiq_middleware/duplicate_jobs/strategies/until_executing.rb
+++ b/lib/gitlab/sidekiq_middleware/duplicate_jobs/strategies/until_executing.rb
@@ -7,11 +7,7 @@ module Gitlab
# This strategy takes a lock before scheduling the job in a queue and
# removes the lock before the job starts allowing a new job to be queued
# while a job is still executing.
- class UntilExecuting < Base
- extend ::Gitlab::Utils::Override
-
- include DeduplicatesWhenScheduling
-
+ class UntilExecuting < DeduplicatesWhenScheduling
override :perform
def perform(job)
super
diff --git a/lib/gitlab/sidekiq_middleware/metrics_helper.rb b/lib/gitlab/sidekiq_middleware/metrics_helper.rb
index 66930a34319..207d2d769b2 100644
--- a/lib/gitlab/sidekiq_middleware/metrics_helper.rb
+++ b/lib/gitlab/sidekiq_middleware/metrics_helper.rb
@@ -3,14 +3,21 @@
module Gitlab
module SidekiqMiddleware
module MetricsHelper
+ include ::Gitlab::SidekiqMiddleware::WorkerContext
+
TRUE_LABEL = "yes"
FALSE_LABEL = "no"
private
def create_labels(worker_class, queue, job)
- worker_name = (job['wrapped'].presence || worker_class).to_s
- worker = find_worker(worker_name, worker_class)
+ worker = find_worker(worker_class, job)
+
+ # This should never happen: we should always be able to find a
+ # worker class for a given Sidekiq job. But if we can't, we
+ # shouldn't blow up here, because we want to record this in our
+ # metrics.
+ worker_name = worker.try(:name) || worker.class.name
labels = { queue: queue.to_s,
worker: worker_name,
@@ -23,9 +30,7 @@ module Gitlab
labels[:urgency] = worker.get_urgency.to_s
labels[:external_dependencies] = bool_as_label(worker.worker_has_external_dependencies?)
-
- feature_category = worker.get_feature_category
- labels[:feature_category] = feature_category.to_s
+ labels[:feature_category] = worker.get_feature_category.to_s
resource_boundary = worker.get_worker_resource_boundary
labels[:boundary] = resource_boundary == :unknown ? "" : resource_boundary.to_s
@@ -36,10 +41,6 @@ module Gitlab
def bool_as_label(value)
value ? TRUE_LABEL : FALSE_LABEL
end
-
- def find_worker(worker_name, worker_class)
- Gitlab::SidekiqConfig::DEFAULT_WORKERS.fetch(worker_name, worker_class)
- end
end
end
end
diff --git a/lib/gitlab/sidekiq_middleware/server_metrics.rb b/lib/gitlab/sidekiq_middleware/server_metrics.rb
index 2d9767e0266..bea98403997 100644
--- a/lib/gitlab/sidekiq_middleware/server_metrics.rb
+++ b/lib/gitlab/sidekiq_middleware/server_metrics.rb
@@ -53,10 +53,7 @@ module Gitlab
def initialize
@metrics = self.class.metrics
-
- if ::Gitlab::Database::LoadBalancing.enable?
- @metrics[:sidekiq_load_balancing_count] = ::Gitlab::Metrics.counter(:sidekiq_load_balancing_count, 'Sidekiq jobs with load balancing')
- end
+ @metrics[:sidekiq_load_balancing_count] = ::Gitlab::Metrics.counter(:sidekiq_load_balancing_count, 'Sidekiq jobs with load balancing')
end
def call(worker, job, queue)
@@ -128,8 +125,6 @@ module Gitlab
private
def with_load_balancing_settings(job)
- return unless ::Gitlab::Database::LoadBalancing.enable?
-
keys = %w[load_balancing_strategy worker_data_consistency]
return unless keys.all? { |k| job.key?(k) }
diff --git a/lib/gitlab/sidekiq_middleware/worker_context.rb b/lib/gitlab/sidekiq_middleware/worker_context.rb
index 897a9211948..a5d92cf699c 100644
--- a/lib/gitlab/sidekiq_middleware/worker_context.rb
+++ b/lib/gitlab/sidekiq_middleware/worker_context.rb
@@ -10,6 +10,12 @@ module Gitlab
context_or_nil.use(&block)
end
+
+ def find_worker(worker_class, job)
+ worker_name = (job['wrapped'].presence || worker_class).to_s
+
+ Gitlab::SidekiqConfig::DEFAULT_WORKERS[worker_name]&.klass || worker_class
+ end
end
end
end
diff --git a/lib/gitlab/sidekiq_middleware/worker_context/client.rb b/lib/gitlab/sidekiq_middleware/worker_context/client.rb
index 1a899b27ea3..7d3925e9dec 100644
--- a/lib/gitlab/sidekiq_middleware/worker_context/client.rb
+++ b/lib/gitlab/sidekiq_middleware/worker_context/client.rb
@@ -7,11 +7,11 @@ module Gitlab
include Gitlab::SidekiqMiddleware::WorkerContext
def call(worker_class_or_name, job, _queue, _redis_pool, &block)
- worker_class = worker_class_or_name.to_s.safe_constantize
+ worker_class = find_worker(worker_class_or_name.to_s.safe_constantize, job)
- # Mailers can't be constantized like this
+ # This is not a worker we know about, perhaps from a gem
return yield unless worker_class
- return yield unless worker_class.include?(::ApplicationWorker)
+ return yield unless worker_class.respond_to?(:context_for_arguments)
context_for_args = worker_class.context_for_arguments(job['args'])
@@ -19,7 +19,14 @@ module Gitlab
# This should be inside the context for the arguments so
# that we don't override the feature category on the worker
# with the one from the caller.
- Gitlab::ApplicationContext.with_context(feature_category: worker_class.get_feature_category.to_s, &block)
+ #
+ # We do not want to set anything explicitly in the context
+ # when the feature category is 'not_owned'.
+ if worker_class.feature_category_not_owned?
+ yield
+ else
+ Gitlab::ApplicationContext.with_context(feature_category: worker_class.get_feature_category.to_s, &block)
+ end
end
end
end
diff --git a/lib/gitlab/sidekiq_middleware/worker_context/server.rb b/lib/gitlab/sidekiq_middleware/worker_context/server.rb
index 2d8fd8002d2..d026f4918c6 100644
--- a/lib/gitlab/sidekiq_middleware/worker_context/server.rb
+++ b/lib/gitlab/sidekiq_middleware/worker_context/server.rb
@@ -7,7 +7,7 @@ module Gitlab
include Gitlab::SidekiqMiddleware::WorkerContext
def call(worker, job, _queue, &block)
- worker_class = worker.class
+ worker_class = find_worker(worker.class, job)
# This is not a worker we know about, perhaps from a gem
return yield unless worker_class.respond_to?(:get_worker_context)
diff --git a/lib/gitlab/sidekiq_versioning.rb b/lib/gitlab/sidekiq_versioning.rb
index 8164a5a9d7a..80c0b7650f3 100644
--- a/lib/gitlab/sidekiq_versioning.rb
+++ b/lib/gitlab/sidekiq_versioning.rb
@@ -3,25 +3,21 @@
module Gitlab
module SidekiqVersioning
def self.install!
- Sidekiq::Manager.prepend SidekiqVersioning::Manager
-
# The Sidekiq client API always adds the queue to the Sidekiq queue
# list, but mail_room and gitlab-shell do not. This is only necessary
# for monitoring.
- begin
- queues = SidekiqConfig.worker_queues
+ queues = SidekiqConfig.worker_queues
- if queues.any?
- Sidekiq.redis do |conn|
- conn.pipelined do
- queues.each do |queue|
- conn.sadd('queues', queue)
- end
+ if queues.any?
+ Sidekiq.redis do |conn|
+ conn.pipelined do
+ queues.each do |queue|
+ conn.sadd('queues', queue)
end
end
end
- rescue ::Redis::BaseError, SocketError, Errno::ENOENT, Errno::EADDRNOTAVAIL, Errno::EAFNOSUPPORT, Errno::ECONNRESET, Errno::ECONNREFUSED
end
+ rescue ::Redis::BaseError, SocketError, Errno::ENOENT, Errno::EADDRNOTAVAIL, Errno::EAFNOSUPPORT, Errno::ECONNRESET, Errno::ECONNREFUSED
end
end
end
diff --git a/lib/gitlab/sidekiq_versioning/manager.rb b/lib/gitlab/sidekiq_versioning/manager.rb
deleted file mode 100644
index e5852b43003..00000000000
--- a/lib/gitlab/sidekiq_versioning/manager.rb
+++ /dev/null
@@ -1,14 +0,0 @@
-# frozen_string_literal: true
-
-module Gitlab
- module SidekiqVersioning
- module Manager
- def initialize(options = {})
- options[:strict] = false
- options[:queues] = SidekiqConfig.expand_queues(options[:queues])
- Sidekiq.logger.info "Listening on queues #{options[:queues].uniq.sort}"
- super
- end
- end
- end
-end
diff --git a/lib/gitlab/stack_prof.rb b/lib/gitlab/stack_prof.rb
index 97f52491e9e..9fc4798ffdc 100644
--- a/lib/gitlab/stack_prof.rb
+++ b/lib/gitlab/stack_prof.rb
@@ -75,20 +75,20 @@ module Gitlab
current_timeout_s = nil
else
mode = ENV['STACKPROF_MODE']&.to_sym || DEFAULT_MODE
- interval = ENV['STACKPROF_INTERVAL']&.to_i
- interval ||= (mode == :object ? DEFAULT_INTERVAL_EVENTS : DEFAULT_INTERVAL_US)
+ stackprof_interval = ENV['STACKPROF_INTERVAL']&.to_i
+ stackprof_interval ||= interval(mode)
log_event(
'starting profile',
profile_mode: mode,
- profile_interval: interval,
+ profile_interval: stackprof_interval,
profile_timeout: timeout_s
)
::StackProf.start(
mode: mode,
raw: Gitlab::Utils.to_boolean(ENV['STACKPROF_RAW'] || 'true'),
- interval: interval
+ interval: stackprof_interval
)
current_timeout_s = timeout_s
end
@@ -131,5 +131,9 @@ module Gitlab
pid: Process.pid
}.merge(labels.compact))
end
+
+ def self.interval(mode)
+ mode == :object ? DEFAULT_INTERVAL_EVENTS : DEFAULT_INTERVAL_US
+ end
end
end
diff --git a/lib/gitlab/subscription_portal.rb b/lib/gitlab/subscription_portal.rb
index 78fa5009bc4..9b6bae12057 100644
--- a/lib/gitlab/subscription_portal.rb
+++ b/lib/gitlab/subscription_portal.rb
@@ -3,7 +3,15 @@
module Gitlab
module SubscriptionPortal
def self.default_subscriptions_url
- ::Gitlab.dev_or_test_env? ? 'https://customers.stg.gitlab.com' : 'https://customers.gitlab.com'
+ if ::Gitlab.dev_or_test_env?
+ if Feature.enabled?(:new_customersdot_staging_url, default_enabled: :yaml)
+ 'https://customers.staging.gitlab.com'
+ else
+ 'https://customers.stg.gitlab.com'
+ end
+ else
+ 'https://customers.gitlab.com'
+ end
end
def self.subscriptions_url
@@ -38,6 +46,26 @@ module Gitlab
"#{self.subscriptions_url}/plans"
end
+ def self.subscriptions_gitlab_plans_url
+ "#{self.subscriptions_url}/gitlab_plans"
+ end
+
+ def self.subscriptions_instance_review_url
+ "#{self.subscriptions_url}/instance_review"
+ end
+
+ def self.add_extra_seats_url(group_id)
+ "#{self.subscriptions_url}/gitlab/namespaces/#{group_id}/extra_seats"
+ end
+
+ def self.upgrade_subscription_url(group_id, plan_id)
+ "#{self.subscriptions_url}/gitlab/namespaces/#{group_id}/upgrade/#{plan_id}"
+ end
+
+ def self.renew_subscription_url(group_id)
+ "#{self.subscriptions_url}/gitlab/namespaces/#{group_id}/renew"
+ end
+
def self.subscription_portal_admin_email
ENV.fetch('SUBSCRIPTION_PORTAL_ADMIN_EMAIL', 'gl_com_api@gitlab.com')
end
diff --git a/lib/gitlab/template/gitlab_ci_yml_template.rb b/lib/gitlab/template/gitlab_ci_yml_template.rb
index 263483ba54b..35f45c8809f 100644
--- a/lib/gitlab/template/gitlab_ci_yml_template.rb
+++ b/lib/gitlab/template/gitlab_ci_yml_template.rb
@@ -6,11 +6,7 @@ module Gitlab
BASE_EXCLUDED_PATTERNS = [%r{\.latest\.}].freeze
TEMPLATES_WITH_LATEST_VERSION = {
- 'Jobs/Browser-Performance-Testing' => true,
- 'Jobs/Build' => true,
- 'Security/API-Fuzzing' => true,
- 'Security/DAST' => true,
- 'Terraform' => true
+ 'Jobs/Build' => true
}.freeze
def description
diff --git a/lib/gitlab/throttle.rb b/lib/gitlab/throttle.rb
index 622dc7d9ed0..384953533b5 100644
--- a/lib/gitlab/throttle.rb
+++ b/lib/gitlab/throttle.rb
@@ -7,7 +7,7 @@ module Gitlab
# Each of these settings follows the same pattern of specifying separate
# authenticated and unauthenticated rates via settings. New throttles should
# ideally be regular as well.
- REGULAR_THROTTLES = [:api, :packages_api, :files_api].freeze
+ REGULAR_THROTTLES = [:api, :packages_api, :files_api, :deprecated_api].freeze
def self.settings
Gitlab::CurrentSettings.current_application_settings
diff --git a/lib/gitlab/tracking/docs/helper.rb b/lib/gitlab/tracking/docs/helper.rb
deleted file mode 100644
index 4e03858b771..00000000000
--- a/lib/gitlab/tracking/docs/helper.rb
+++ /dev/null
@@ -1,67 +0,0 @@
-# frozen_string_literal: true
-
-module Gitlab
- module Tracking
- module Docs
- # Helper with functions to be used by HAML templates
- module Helper
- def auto_generated_comment
- <<-MARKDOWN.strip_heredoc
- ---
- stage: Growth
- group: Product Intelligence
- info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#designated-technical-writers
- ---
-
- <!---
- This documentation is auto generated by a script.
-
- Please do not edit this file directly, check generate_event_dictionary task on lib/tasks/gitlab/snowplow.rake.
- --->
-
- <!-- vale gitlab.Spelling = NO -->
- MARKDOWN
- end
-
- def render_description(object)
- return 'Missing description' unless object.description.present?
-
- object.description
- end
-
- def render_event_taxonomy(object)
- headers = %w[category action label property value]
- values = %i[category action label property_description value_description]
- values = values.map { |key| backtick(object.attributes[key]) }
- values = values.join(" | ")
-
- [
- "| #{headers.join(" | ")} |",
- "#{'|---' * headers.size}|",
- "| #{values} |"
- ].join("\n")
- end
-
- def md_link_to(anchor_text, url)
- "[#{anchor_text}](#{url})"
- end
-
- def render_owner(object)
- "Owner: #{backtick(object.product_group)}"
- end
-
- def render_tiers(object)
- "Tiers: #{object.tiers.map(&method(:backtick)).join(', ')}"
- end
-
- def render_yaml_definition_path(object)
- "YAML definition: #{backtick(object.yaml_path)}"
- end
-
- def backtick(string)
- "`#{string}`"
- end
- end
- end
- end
-end
diff --git a/lib/gitlab/tracking/docs/renderer.rb b/lib/gitlab/tracking/docs/renderer.rb
deleted file mode 100644
index 184b935c2ba..00000000000
--- a/lib/gitlab/tracking/docs/renderer.rb
+++ /dev/null
@@ -1,32 +0,0 @@
-# frozen_string_literal: true
-
-module Gitlab
- module Tracking
- module Docs
- class Renderer
- include Gitlab::Tracking::Docs::Helper
- DICTIONARY_PATH = Rails.root.join('doc', 'development', 'snowplow')
- TEMPLATE_PATH = Rails.root.join('lib', 'gitlab', 'tracking', 'docs', 'templates', 'default.md.haml')
-
- def initialize(event_definitions)
- @layout = Haml::Engine.new(File.read(TEMPLATE_PATH))
- @event_definitions = event_definitions.sort
- end
-
- def contents
- # Render and remove an extra trailing new line
- @contents ||= @layout.render(self, event_definitions: @event_definitions).sub!(/\n(?=\Z)/, '')
- end
-
- def write
- filename = DICTIONARY_PATH.join('dictionary.md').to_s
-
- FileUtils.mkdir_p(DICTIONARY_PATH)
- File.write(filename, contents)
-
- filename
- end
- end
- end
- end
-end
diff --git a/lib/gitlab/tracking/docs/templates/default.md.haml b/lib/gitlab/tracking/docs/templates/default.md.haml
deleted file mode 100644
index 568f56590fa..00000000000
--- a/lib/gitlab/tracking/docs/templates/default.md.haml
+++ /dev/null
@@ -1,35 +0,0 @@
-= auto_generated_comment
-
-:plain
- # Event Dictionary
-
- This file is autogenerated, please do not edit it directly.
-
- To generate these files from the GitLab repository, run:
-
- ```shell
- bundle exec rake gitlab:snowplow:generate_event_dictionary
- ```
-
- The Event Dictionary is based on the following event definition YAML files:
-
- - [`config/events`](https://gitlab.com/gitlab-org/gitlab/-/tree/f9a404301ca22d038e7b9a9eb08d9c1bbd6c4d84/config/events)
- - [`ee/config/events`](https://gitlab.com/gitlab-org/gitlab/-/tree/f9a404301ca22d038e7b9a9eb08d9c1bbd6c4d84/ee/config/events)
-
- ## Event definitions
-
-\
-- event_definitions.each do |_path, object|
-
- = "### `#{object.category} #{object.action}`"
- \
- = render_event_taxonomy(object)
- \
- = render_description(object)
- \
- = render_yaml_definition_path(object)
- \
- = render_owner(object)
- \
- = render_tiers(object)
- \
diff --git a/lib/gitlab/tracking/standard_context.rb b/lib/gitlab/tracking/standard_context.rb
index fe5669be014..df62e8bbbe6 100644
--- a/lib/gitlab/tracking/standard_context.rb
+++ b/lib/gitlab/tracking/standard_context.rb
@@ -3,13 +3,14 @@
module Gitlab
module Tracking
class StandardContext
- GITLAB_STANDARD_SCHEMA_URL = 'iglu:com.gitlab/gitlab_standard/jsonschema/1-0-5'
+ GITLAB_STANDARD_SCHEMA_URL = 'iglu:com.gitlab/gitlab_standard/jsonschema/1-0-7'
GITLAB_RAILS_SOURCE = 'gitlab-rails'
def initialize(namespace: nil, project: nil, user: nil, **extra)
@namespace = namespace
@plan = namespace&.actual_plan_name
@project = project
+ @user = user
@extra = extra
end
@@ -35,7 +36,7 @@ module Gitlab
private
- attr_accessor :namespace, :project, :extra, :plan
+ attr_accessor :namespace, :project, :extra, :plan, :user
def to_h
{
@@ -44,6 +45,7 @@ module Gitlab
plan: plan,
extra: extra
}.merge(project_and_namespace)
+ .merge(user_data)
end
def project_and_namespace
@@ -58,6 +60,10 @@ module Gitlab
def project_id
project.is_a?(Integer) ? project : project&.id
end
+
+ def user_data
+ ::Feature.enabled?(:add_actor_based_user_to_snowplow_tracking, user) ? { user_id: user&.id } : {}
+ end
end
end
end
diff --git a/lib/gitlab/usage/metric_definition.rb b/lib/gitlab/usage/metric_definition.rb
index db0cb4c6326..6e5196ecdbd 100644
--- a/lib/gitlab/usage/metric_definition.rb
+++ b/lib/gitlab/usage/metric_definition.rb
@@ -6,6 +6,7 @@ module Gitlab
METRIC_SCHEMA_PATH = Rails.root.join('config', 'metrics', 'schema.json')
BASE_REPO_PATH = 'https://gitlab.com/gitlab-org/gitlab/-/blob/master'
SKIP_VALIDATION_STATUSES = %w[deprecated removed].to_set.freeze
+ AVAILABLE_STATUSES = %w[active data_available implemented deprecated].freeze
InvalidError = Class.new(RuntimeError)
@@ -59,6 +60,10 @@ module Gitlab
attributes[:data_category]&.downcase!
end
+ def available?
+ AVAILABLE_STATUSES.include?(attributes[:status])
+ end
+
alias_method :to_dictionary, :to_h
class << self
@@ -76,7 +81,7 @@ module Gitlab
end
def with_instrumentation_class
- all.select { |definition| definition.attributes[:instrumentation_class].present? }
+ all.select { |definition| definition.attributes[:instrumentation_class].present? && definition.available? }
end
def schemer
diff --git a/lib/gitlab/usage/metrics/instrumentations/active_user_count_metric.rb b/lib/gitlab/usage/metrics/instrumentations/active_user_count_metric.rb
new file mode 100644
index 00000000000..2f3b3af306f
--- /dev/null
+++ b/lib/gitlab/usage/metrics/instrumentations/active_user_count_metric.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Usage
+ module Metrics
+ module Instrumentations
+ class ActiveUserCountMetric < DatabaseMetric
+ operation :count
+
+ relation { User.active }
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/usage/metrics/instrumentations/count_users_associating_milestones_to_releases_metric.rb b/lib/gitlab/usage/metrics/instrumentations/count_users_associating_milestones_to_releases_metric.rb
new file mode 100644
index 00000000000..c10182e23aa
--- /dev/null
+++ b/lib/gitlab/usage/metrics/instrumentations/count_users_associating_milestones_to_releases_metric.rb
@@ -0,0 +1,18 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Usage
+ module Metrics
+ module Instrumentations
+ class CountUsersAssociatingMilestonesToReleasesMetric < DatabaseMetric
+ operation :distinct_count, column: :author_id
+
+ relation { Release.with_milestones }
+
+ start { Release.minimum(:author_id) }
+ finish { Release.maximum(:author_id) }
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/usage_data.rb b/lib/gitlab/usage_data.rb
index 854242031be..dd66f9133bb 100644
--- a/lib/gitlab/usage_data.rb
+++ b/lib/gitlab/usage_data.rb
@@ -76,7 +76,7 @@ module Gitlab
hostname: add_metric('HostnameMetric'),
version: alt_usage_data { Gitlab::VERSION },
installation_type: alt_usage_data { installation_type },
- active_user_count: count(User.active),
+ active_user_count: add_metric('ActiveUserCountMetric'),
edition: 'CE'
}
end
@@ -123,17 +123,9 @@ module Gitlab
clusters_platforms_eks: count(::Clusters::Cluster.aws_installed.enabled),
clusters_platforms_gke: count(::Clusters::Cluster.gcp_installed.enabled),
clusters_platforms_user: count(::Clusters::Cluster.user_provided.enabled),
- clusters_applications_helm: count(::Clusters::Applications::Helm.available),
- clusters_applications_ingress: count(::Clusters::Applications::Ingress.available),
- clusters_applications_cert_managers: count(::Clusters::Applications::CertManager.available),
- clusters_applications_crossplane: count(::Clusters::Applications::Crossplane.available),
- clusters_applications_prometheus: count(::Clusters::Applications::Prometheus.available),
- clusters_applications_runner: count(::Clusters::Applications::Runner.available),
- clusters_applications_knative: count(::Clusters::Applications::Knative.available),
- clusters_applications_elastic_stack: count(::Clusters::Applications::ElasticStack.available),
- clusters_applications_jupyter: count(::Clusters::Applications::Jupyter.available),
- clusters_applications_cilium: count(::Clusters::Applications::Cilium.available),
clusters_management_project: count(::Clusters::Cluster.with_management_project),
+ clusters_integrations_elastic_stack: count(::Clusters::Integrations::ElasticStack.enabled),
+ clusters_integrations_prometheus: count(::Clusters::Integrations::Prometheus.enabled),
kubernetes_agents: count(::Clusters::Agent),
kubernetes_agents_with_token: distinct_count(::Clusters::AgentToken, :agent_id),
in_review_folder: count(::Environment.in_review_folder),
@@ -211,19 +203,6 @@ module Gitlab
}
end
- def snowplow_event_counts(time_period)
- return {} unless report_snowplow_events?
-
- {
- promoted_issues: count(
- self_monitoring_project
- .product_analytics_events
- .by_category_and_action('epics', 'promote')
- .where(time_period)
- )
- }
- end
-
def system_usage_data_monthly
{
counts_monthly: {
@@ -236,10 +215,9 @@ module Gitlab
packages: count(::Packages::Package.where(monthly_time_range_db_params)),
personal_snippets: count(PersonalSnippet.where(monthly_time_range_db_params)),
project_snippets: count(ProjectSnippet.where(monthly_time_range_db_params)),
- projects_with_alerts_created: distinct_count(::AlertManagement::Alert.where(monthly_time_range_db_params), :project_id)
- }.merge(
- snowplow_event_counts(monthly_time_range_db_params(column: :collector_tstamp))
- ).tap do |data|
+ projects_with_alerts_created: distinct_count(::AlertManagement::Alert.where(monthly_time_range_db_params), :project_id),
+ promoted_issues: DEPRECATED_VALUE
+ }.tap do |data|
data[:snippets] = add(data[:personal_snippets], data[:project_snippets])
end
}
@@ -412,7 +390,6 @@ module Gitlab
response[:"projects_#{name}_active"] = count(Integration.active.where.not(project: nil).where(type: type))
response[:"groups_#{name}_active"] = count(Integration.active.where.not(group: nil).where(type: type))
- response[:"templates_#{name}_active"] = count(Integration.active.where(template: true, type: type))
response[:"instances_#{name}_active"] = count(Integration.active.where(instance: true, type: type))
response[:"projects_inheriting_#{name}_active"] = count(Integration.active.where.not(project: nil).where.not(inherit_from_id: nil).where(type: type))
response[:"groups_inheriting_#{name}_active"] = count(Integration.active.where.not(group: nil).where.not(inherit_from_id: nil).where(type: type))
@@ -523,10 +500,6 @@ module Gitlab
# rubocop: disable UsageData/LargeTable
def usage_activity_by_stage_configure(time_period)
{
- clusters_applications_cert_managers: cluster_applications_user_distinct_count(::Clusters::Applications::CertManager, time_period),
- clusters_applications_helm: cluster_applications_user_distinct_count(::Clusters::Applications::Helm, time_period),
- clusters_applications_ingress: cluster_applications_user_distinct_count(::Clusters::Applications::Ingress, time_period),
- clusters_applications_knative: cluster_applications_user_distinct_count(::Clusters::Applications::Knative, time_period),
clusters_management_project: clusters_user_distinct_count(::Clusters::Cluster.with_management_project, time_period),
clusters_disabled: clusters_user_distinct_count(::Clusters::Cluster.disabled, time_period),
clusters_enabled: clusters_user_distinct_count(::Clusters::Cluster.enabled, time_period),
@@ -621,7 +594,7 @@ module Gitlab
{
clusters: distinct_count(::Clusters::Cluster.where(time_period), :user_id),
- clusters_applications_prometheus: cluster_applications_user_distinct_count(::Clusters::Applications::Prometheus, time_period),
+ clusters_integrations_prometheus: cluster_integrations_user_distinct_count(::Clusters::Integrations::Prometheus, time_period),
operations_dashboard_default_dashboard: count(::User.active.with_dashboard('operations').where(time_period),
start: minimum_id(User),
finish: maximum_id(User)),
@@ -647,7 +620,7 @@ module Gitlab
# Omitted because of encrypted properties: `projects_jira_cloud_active`, `projects_jira_server_active`
# rubocop: disable CodeReuse/ActiveRecord
def usage_activity_by_stage_plan(time_period)
- time_frame = time_period.present? ? '28d' : 'none'
+ time_frame = metric_time_period(time_period)
{
issues: add_metric('CountUsersCreatingIssuesMetric', time_frame: time_frame),
notes: distinct_count(::Note.where(time_period), :author_id),
@@ -665,11 +638,13 @@ module Gitlab
# Omitted because no user, creator or author associated: `environments`, `feature_flags`, `in_review_folder`, `pages_domains`
# rubocop: disable CodeReuse/ActiveRecord
def usage_activity_by_stage_release(time_period)
+ time_frame = metric_time_period(time_period)
{
deployments: distinct_count(::Deployment.where(time_period), :user_id),
failed_deployments: distinct_count(::Deployment.failed.where(time_period), :user_id),
releases: distinct_count(::Release.where(time_period), :author_id),
- successful_deployments: distinct_count(::Deployment.success.where(time_period), :user_id)
+ successful_deployments: distinct_count(::Deployment.success.where(time_period), :user_id),
+ releases_with_milestones: add_metric('CountUsersAssociatingMilestonesToReleasesMetric', time_frame: time_frame)
}
end
# rubocop: enable CodeReuse/ActiveRecord
@@ -685,8 +660,7 @@ module Gitlab
ci_pipeline_config_repository: distinct_count(::Ci::Pipeline.repository_source.where(time_period), :user_id, start: minimum_id(User), finish: maximum_id(User)),
ci_pipeline_schedules: distinct_count(::Ci::PipelineSchedule.where(time_period), :owner_id),
ci_pipelines: distinct_count(::Ci::Pipeline.where(time_period), :user_id, start: minimum_id(User), finish: maximum_id(User)),
- ci_triggers: distinct_count(::Ci::Trigger.where(time_period), :owner_id),
- clusters_applications_runner: cluster_applications_user_distinct_count(::Clusters::Applications::Runner, time_period)
+ ci_triggers: distinct_count(::Ci::Trigger.where(time_period), :owner_id)
}
end
# rubocop: enable CodeReuse/ActiveRecord
@@ -755,6 +729,10 @@ module Gitlab
private
+ def metric_time_period(time_period)
+ time_period.present? ? '28d' : 'none'
+ end
+
def gitaly_apdex
with_prometheus_client(verify: false, fallback: FALLBACK) do |client|
result = client.query('avg_over_time(gitlab_usage_ping:gitaly_apdex:ratio_avg_over_time_5m[1w])').first
@@ -794,10 +772,6 @@ module Gitlab
}
end
- def report_snowplow_events?
- self_monitoring_project && Feature.enabled?(:product_analytics_tracking, type: :ops)
- end
-
def distinct_count_service_desk_enabled_projects(time_period)
project_creator_id_start = minimum_id(User)
project_creator_id_finish = maximum_id(User)
@@ -858,17 +832,13 @@ module Gitlab
count(::Issue.with_prometheus_alert_events, start: minimum_id(Issue), finish: maximum_id(Issue))
end
- def self_monitoring_project
- Gitlab::CurrentSettings.self_monitoring_project
- end
-
def clear_memoized
CE_MEMOIZED_VALUES.each { |v| clear_memoization(v) }
end
# rubocop: disable CodeReuse/ActiveRecord
- def cluster_applications_user_distinct_count(applications, time_period)
- distinct_count(applications.where(time_period).available.joins(:cluster), 'clusters.user_id')
+ def cluster_integrations_user_distinct_count(integrations, time_period)
+ distinct_count(integrations.where(time_period).enabled.joins(:cluster), 'clusters.user_id')
end
def clusters_user_distinct_count(clusters, time_period)
diff --git a/lib/gitlab/usage_data_counters/ci_template_unique_counter.rb b/lib/gitlab/usage_data_counters/ci_template_unique_counter.rb
index e5a50c92329..b8de7de848d 100644
--- a/lib/gitlab/usage_data_counters/ci_template_unique_counter.rb
+++ b/lib/gitlab/usage_data_counters/ci_template_unique_counter.rb
@@ -5,23 +5,14 @@ module Gitlab::UsageDataCounters
REDIS_SLOT = 'ci_templates'
KNOWN_EVENTS_FILE_PATH = File.expand_path('known_events/ci_templates.yml', __dir__)
- # NOTE: Events originating from implicit Auto DevOps pipelines get prefixed with `implicit_`
- TEMPLATE_TO_EVENT = {
- '5-Minute-Production-App.gitlab-ci.yml' => '5_min_production_app',
- 'Auto-DevOps.gitlab-ci.yml' => 'auto_devops',
- 'AWS/CF-Provision-and-Deploy-EC2.gitlab-ci.yml' => 'aws_cf_deploy_ec2',
- 'AWS/Deploy-ECS.gitlab-ci.yml' => 'aws_deploy_ecs',
- 'Jobs/Build.gitlab-ci.yml' => 'auto_devops_build',
- 'Jobs/Deploy.gitlab-ci.yml' => 'auto_devops_deploy',
- 'Jobs/Deploy.latest.gitlab-ci.yml' => 'auto_devops_deploy_latest',
- 'Security/SAST.gitlab-ci.yml' => 'security_sast',
- 'Security/Secret-Detection.gitlab-ci.yml' => 'security_secret_detection',
- 'Terraform/Base.latest.gitlab-ci.yml' => 'terraform_base_latest'
- }.freeze
-
class << self
def track_unique_project_event(project_id:, template:, config_source:)
- Gitlab::UsageDataCounters::HLLRedisCounter.track_event(ci_template_event_name(template, config_source), values: project_id)
+ expanded_template_name = expand_template_name(template)
+ return unless expanded_template_name
+
+ Gitlab::UsageDataCounters::HLLRedisCounter.track_event(
+ ci_template_event_name(expanded_template_name, config_source), values: project_id
+ )
end
def ci_templates(relative_base = 'lib/gitlab/ci/templates')
@@ -30,9 +21,12 @@ module Gitlab::UsageDataCounters
def ci_template_event_name(template_name, config_source)
prefix = 'implicit_' if config_source.to_s == 'auto_devops_source'
- template_event_name = TEMPLATE_TO_EVENT[template_name] || template_to_event_name(template_name)
- "p_#{REDIS_SLOT}_#{prefix}#{template_event_name}"
+ "p_#{REDIS_SLOT}_#{prefix}#{template_to_event_name(template_name)}"
+ end
+
+ def expand_template_name(template_name)
+ Gitlab::Template::GitlabCiYmlTemplate.find(template_name.chomp('.gitlab-ci.yml'))&.full_name
end
private
diff --git a/lib/gitlab/usage_data_counters/guest_package_events.yml b/lib/gitlab/usage_data_counters/guest_package_events.yml
deleted file mode 100644
index a9b9f8ea235..00000000000
--- a/lib/gitlab/usage_data_counters/guest_package_events.yml
+++ /dev/null
@@ -1,34 +0,0 @@
----
-- i_package_composer_guest_delete
-- i_package_composer_guest_pull
-- i_package_composer_guest_push
-- i_package_conan_guest_delete
-- i_package_conan_guest_pull
-- i_package_conan_guest_push
-- i_package_container_guest_delete
-- i_package_container_guest_pull
-- i_package_container_guest_push
-- i_package_debian_guest_delete
-- i_package_debian_guest_pull
-- i_package_debian_guest_push
-- i_package_generic_guest_delete
-- i_package_generic_guest_pull
-- i_package_generic_guest_push
-- i_package_golang_guest_delete
-- i_package_golang_guest_pull
-- i_package_golang_guest_push
-- i_package_maven_guest_delete
-- i_package_maven_guest_pull
-- i_package_maven_guest_push
-- i_package_npm_guest_delete
-- i_package_npm_guest_pull
-- i_package_npm_guest_push
-- i_package_nuget_guest_delete
-- i_package_nuget_guest_pull
-- i_package_nuget_guest_push
-- i_package_pypi_guest_delete
-- i_package_pypi_guest_pull
-- i_package_pypi_guest_push
-- i_package_tag_guest_delete
-- i_package_tag_guest_pull
-- i_package_tag_guest_push
diff --git a/lib/gitlab/usage_data_counters/known_events/ci_templates.yml b/lib/gitlab/usage_data_counters/known_events/ci_templates.yml
index cf790767f17..99bdd3ca9e9 100644
--- a/lib/gitlab/usage_data_counters/known_events/ci_templates.yml
+++ b/lib/gitlab/usage_data_counters/known_events/ci_templates.yml
@@ -1,44 +1,8 @@
-# Implicit Auto DevOps pipeline events
-- name: p_ci_templates_implicit_auto_devops
- category: ci_templates
- redis_slot: ci_templates
- aggregation: weekly
-
-# Explicit include:template pipeline events
-- name: p_ci_templates_5_min_production_app
- category: ci_templates
- redis_slot: ci_templates
- aggregation: weekly
-
-- name: p_ci_templates_aws_cf_deploy_ec2
- category: ci_templates
- redis_slot: ci_templates
- aggregation: weekly
-
-- name: p_ci_templates_auto_devops_build
- category: ci_templates
- redis_slot: ci_templates
- aggregation: weekly
-
-- name: p_ci_templates_auto_devops_deploy
- category: ci_templates
- redis_slot: ci_templates
- aggregation: weekly
-
-- name: p_ci_templates_auto_devops_deploy_latest
- category: ci_templates
- redis_slot: ci_templates
- aggregation: weekly
-
-# This part of the file is generated automatically by
+# This file is generated automatically by
# bin/rake gitlab:usage_data:generate_ci_template_events
#
# Do not edit it manually!
-#
-# The section above this should be removed once we roll out tracking all ci
-# templates
-# https://gitlab.com/gitlab-org/gitlab/-/issues/339684
-
+---
- name: p_ci_templates_terraform_base_latest
category: ci_templates
redis_slot: ci_templates
@@ -463,6 +427,10 @@
category: ci_templates
redis_slot: ci_templates
aggregation: weekly
+- name: p_ci_templates_implicit_auto_devops
+ category: ci_templates
+ redis_slot: ci_templates
+ aggregation: weekly
- name: p_ci_templates_implicit_jobs_dast_default_branch_deploy
category: ci_templates
redis_slot: ci_templates
@@ -499,11 +467,11 @@
category: ci_templates
redis_slot: ci_templates
aggregation: weekly
-- name: p_ci_templates_implicit_auto_devops_deploy
+- name: p_ci_templates_implicit_jobs_deploy
category: ci_templates
redis_slot: ci_templates
aggregation: weekly
-- name: p_ci_templates_implicit_auto_devops_build
+- name: p_ci_templates_implicit_jobs_build
category: ci_templates
redis_slot: ci_templates
aggregation: weekly
@@ -515,7 +483,7 @@
category: ci_templates
redis_slot: ci_templates
aggregation: weekly
-- name: p_ci_templates_implicit_auto_devops_deploy_latest
+- name: p_ci_templates_implicit_jobs_deploy_latest
category: ci_templates
redis_slot: ci_templates
aggregation: weekly
diff --git a/lib/gitlab/usage_data_counters/known_events/common.yml b/lib/gitlab/usage_data_counters/known_events/common.yml
index 261d3b37783..feebc7f395a 100644
--- a/lib/gitlab/usage_data_counters/known_events/common.yml
+++ b/lib/gitlab/usage_data_counters/known_events/common.yml
@@ -149,7 +149,6 @@
category: testing
redis_slot: testing
aggregation: weekly
- feature_flag: usage_data_i_testing_test_case_parsed
- name: i_testing_metrics_report_widget_total
category: testing
redis_slot: testing
@@ -158,7 +157,6 @@
category: testing
redis_slot: testing
aggregation: weekly
- feature_flag: usage_data_i_testing_group_code_coverage_visit_total
- name: i_testing_full_code_quality_report_total
category: testing
redis_slot: testing
@@ -179,12 +177,10 @@
category: testing
redis_slot: testing
aggregation: weekly
- feature_flag: usage_data_i_testing_metrics_report_artifact_uploaders
- name: i_testing_summary_widget_total
category: testing
redis_slot: testing
aggregation: weekly
- feature_flag: usage_data_i_testing_summary_widget_total
# Project Management group
- name: g_project_management_issue_title_changed
category: issues_edit
diff --git a/lib/gitlab/usage_data_counters/known_events/epic_board_events.yml b/lib/gitlab/usage_data_counters/known_events/epic_board_events.yml
index 281db441829..3879c561cc4 100644
--- a/lib/gitlab/usage_data_counters/known_events/epic_board_events.yml
+++ b/lib/gitlab/usage_data_counters/known_events/epic_board_events.yml
@@ -7,16 +7,13 @@
category: epic_boards_usage
redis_slot: project_management
aggregation: daily
- feature_flag: track_epic_boards_activity
- name: g_project_management_users_viewing_epic_boards
category: epic_boards_usage
redis_slot: project_management
aggregation: daily
- feature_flag: track_epic_boards_activity
- name: g_project_management_users_updating_epic_board_names
category: epic_boards_usage
redis_slot: project_management
aggregation: daily
- feature_flag: track_epic_boards_activity
diff --git a/lib/gitlab/usage_data_counters/known_events/importer_events.yml b/lib/gitlab/usage_data_counters/known_events/importer_events.yml
new file mode 100644
index 00000000000..79bbac229bc
--- /dev/null
+++ b/lib/gitlab/usage_data_counters/known_events/importer_events.yml
@@ -0,0 +1,17 @@
+---
+# Importer events
+- name: github_import_project_start
+ category: importer
+ redis_slot: import
+ aggregation: weekly
+ feature_flag: track_importer_activity
+- name: github_import_project_success
+ category: importer
+ redis_slot: import
+ aggregation: weekly
+ feature_flag: track_importer_activity
+- name: github_import_project_failure
+ category: importer
+ redis_slot: import
+ aggregation: weekly
+ feature_flag: track_importer_activity
diff --git a/lib/gitlab/utils/delegator_override.rb b/lib/gitlab/utils/delegator_override.rb
new file mode 100644
index 00000000000..15ba29d3916
--- /dev/null
+++ b/lib/gitlab/utils/delegator_override.rb
@@ -0,0 +1,48 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Utils
+ # This module is to validate that delegator classes (`SimpleDelegator`) do not
+ # accidentally override important logic on the fabricated object.
+ module DelegatorOverride
+ def delegator_target(target_class)
+ return unless ENV['STATIC_VERIFICATION']
+
+ unless self < ::SimpleDelegator
+ raise ArgumentError, "'#{self}' is not a subclass of 'SimpleDelegator' class."
+ end
+
+ DelegatorOverride.validator(self).add_target(target_class)
+ end
+
+ def delegator_override(*names)
+ return unless ENV['STATIC_VERIFICATION']
+ raise TypeError unless names.all? { |n| n.is_a?(Symbol) }
+
+ DelegatorOverride.validator(self).add_allowlist(names)
+ end
+
+ def delegator_override_with(mod)
+ return unless ENV['STATIC_VERIFICATION']
+ raise TypeError unless mod.is_a?(Module)
+
+ DelegatorOverride.validator(self).add_allowlist(mod.instance_methods)
+ end
+
+ def self.validator(delegator_class)
+ validators[delegator_class] ||= Validator.new(delegator_class)
+ end
+
+ def self.validators
+ @validators ||= {}
+ end
+
+ def self.verify!
+ validators.each_value do |validator|
+ validator.expand_on_ancestors(validators)
+ validator.validate_overrides!
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/utils/delegator_override/error.rb b/lib/gitlab/utils/delegator_override/error.rb
new file mode 100644
index 00000000000..dfe8d5468b4
--- /dev/null
+++ b/lib/gitlab/utils/delegator_override/error.rb
@@ -0,0 +1,23 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Utils
+ module DelegatorOverride
+ class Error
+ attr_accessor :method_name, :target_class, :target_location, :delegator_class, :delegator_location
+
+ def initialize(method_name, target_class, target_location, delegator_class, delegator_location)
+ @method_name = method_name
+ @target_class = target_class
+ @target_location = target_location
+ @delegator_class = delegator_class
+ @delegator_location = delegator_location
+ end
+
+ def to_s
+ "#{delegator_class}##{method_name} is overriding #{target_class}##{method_name}. delegator_location: #{delegator_location} target_location: #{target_location}"
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/utils/delegator_override/validator.rb b/lib/gitlab/utils/delegator_override/validator.rb
new file mode 100644
index 00000000000..402154b41c2
--- /dev/null
+++ b/lib/gitlab/utils/delegator_override/validator.rb
@@ -0,0 +1,105 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Utils
+ module DelegatorOverride
+ class Validator
+ UnexpectedDelegatorOverrideError = Class.new(StandardError)
+
+ attr_reader :delegator_class, :target_classes
+
+ OVERRIDE_ERROR_MESSAGE = <<~EOS
+ We've detected that the delegator is overriding a specific method(s) on the target class.
+ Please make sure if it's intentional and handle this error accordingly.
+ See https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/presenters/README.md#validate-accidental-overrides for more information.
+ EOS
+
+ def initialize(delegator_class)
+ @delegator_class = delegator_class
+ @target_classes = []
+ end
+
+ def add_allowlist(names)
+ allowed_method_names.concat(names)
+ end
+
+ def allowed_method_names
+ @allowed_method_names ||= []
+ end
+
+ def add_target(target_class)
+ @target_classes << target_class if target_class
+ end
+
+ # This will make sure allowlist we put into ancestors are all included
+ def expand_on_ancestors(validators)
+ delegator_class.ancestors.each do |ancestor|
+ next if delegator_class == ancestor # ancestor includes itself
+
+ validator_ancestor = validators[ancestor]
+
+ next unless validator_ancestor
+
+ add_allowlist(validator_ancestor.allowed_method_names)
+ end
+ end
+
+ def validate_overrides!
+ return if target_classes.empty?
+
+ errors = []
+
+ # Workaround to fully load the instance methods in the target class.
+ # See https://gitlab.com/gitlab-org/gitlab/-/merge_requests/69823#note_678887402
+ begin
+ target_classes.map(&:new)
+ rescue ArgumentError
+ # Some models might raise ArgumentError here, but it's fine in this case,
+ # because this is enough to force ActiveRecord to generate the methods we
+ # need to verify, so it's safe to ignore it.
+ end
+
+ (delegator_class.instance_methods - allowlist).each do |method_name|
+ target_classes.each do |target_class|
+ next unless target_class.instance_methods.include?(method_name)
+
+ errors << generate_error(method_name, target_class, delegator_class)
+ end
+ end
+
+ return if errors.empty?
+
+ details = errors.map { |error| "- #{error}" }.join("\n")
+
+ raise UnexpectedDelegatorOverrideError,
+ <<~TEXT
+ #{OVERRIDE_ERROR_MESSAGE}
+ Here are the conflict details.
+
+ #{details}
+ TEXT
+ end
+
+ private
+
+ def generate_error(method_name, target_class, delegator_class)
+ target_location = extract_location(target_class, method_name)
+ delegator_location = extract_location(delegator_class, method_name)
+ Error.new(method_name, target_class, target_location, delegator_class, delegator_location)
+ end
+
+ def extract_location(klass, method_name)
+ klass.instance_method(method_name).source_location&.join(':') || 'unknown'
+ end
+
+ def allowlist
+ [].tap do |allowed|
+ allowed.concat(allowed_method_names)
+ allowed.concat(Object.instance_methods)
+ allowed.concat(::Delegator.instance_methods)
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/verify/uploads.rb b/lib/gitlab/verify/uploads.rb
index afcdbd087d2..0faf794e14d 100644
--- a/lib/gitlab/verify/uploads.rb
+++ b/lib/gitlab/verify/uploads.rb
@@ -28,7 +28,7 @@ module Gitlab
end
def actual_checksum(upload)
- Upload.hexdigest(upload.absolute_path)
+ Upload.sha256_hexdigest(upload.absolute_path)
end
def remote_object_exists?(upload)
diff --git a/lib/gitlab/view/presenter/base.rb b/lib/gitlab/view/presenter/base.rb
index 9dc687f7740..3bacad72050 100644
--- a/lib/gitlab/view/presenter/base.rb
+++ b/lib/gitlab/view/presenter/base.rb
@@ -47,8 +47,18 @@ module Gitlab
true
end
- def presents(name)
- define_method(name) { subject }
+ def presents(*target_classes, as: nil)
+ if target_classes.any? { |k| k.is_a?(Symbol) }
+ raise ArgumentError, "Unsupported target class type: #{target_classes}."
+ end
+
+ if self < ::Gitlab::View::Presenter::Delegated
+ target_classes.each { |k| delegator_target(k) }
+ elsif self < ::Gitlab::View::Presenter::Simple
+ # no-op
+ end
+
+ define_method(as) { subject } if as
end
end
end
diff --git a/lib/gitlab/view/presenter/delegated.rb b/lib/gitlab/view/presenter/delegated.rb
index d14f8cc4e5e..259cf0cf457 100644
--- a/lib/gitlab/view/presenter/delegated.rb
+++ b/lib/gitlab/view/presenter/delegated.rb
@@ -4,7 +4,18 @@ module Gitlab
module View
module Presenter
class Delegated < SimpleDelegator
+ extend ::Gitlab::Utils::DelegatorOverride
+
+ # TODO: Stop including auxiliary methods/modules in `Presenter::Base` as
+ # it overrides many methods in the Active Record models.
+ # See https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/presenters/README.md#validate-accidental-overrides
+ # for more information.
include Gitlab::View::Presenter::Base
+ delegator_override_with Gitlab::Routing.url_helpers
+ delegator_override :can?
+ delegator_override :declarative_policy_delegate
+ delegator_override :present
+ delegator_override :web_url
def initialize(subject, **attributes)
@subject = subject
diff --git a/lib/gitlab/with_feature_category.rb b/lib/gitlab/with_feature_category.rb
deleted file mode 100644
index 65d21daf78a..00000000000
--- a/lib/gitlab/with_feature_category.rb
+++ /dev/null
@@ -1,50 +0,0 @@
-# frozen_string_literal: true
-
-module Gitlab
- module WithFeatureCategory
- extend ActiveSupport::Concern
- include Gitlab::ClassAttributes
-
- class_methods do
- def feature_category(category, actions = [])
- feature_category_configuration[category] ||= []
- feature_category_configuration[category] += actions.map(&:to_s)
-
- validate_config!(feature_category_configuration)
- end
-
- def feature_category_for_action(action)
- category_config = feature_category_configuration.find do |_, actions|
- actions.empty? || actions.include?(action)
- end
-
- category_config&.first || superclass_feature_category_for_action(action)
- end
-
- private
-
- def validate_config!(config)
- empty = config.find { |_, actions| actions.empty? }
- duplicate_actions = config.values.map(&:uniq).flatten.group_by(&:itself).select { |_, v| v.count > 1 }.keys
-
- if config.length > 1 && empty
- raise ArgumentError, "#{empty.first} is defined for all actions, but other categories are set"
- end
-
- if duplicate_actions.any?
- raise ArgumentError, "Actions have multiple feature categories: #{duplicate_actions.join(', ')}"
- end
- end
-
- def feature_category_configuration
- class_attributes[:feature_category_config] ||= {}
- end
-
- def superclass_feature_category_for_action(action)
- return unless superclass.respond_to?(:feature_category_for_action)
-
- superclass.feature_category_for_action(action)
- end
- end
- end
-end
diff --git a/lib/gitlab/workhorse.rb b/lib/gitlab/workhorse.rb
index 0f33c3aa68e..c40aa2273aa 100644
--- a/lib/gitlab/workhorse.rb
+++ b/lib/gitlab/workhorse.rb
@@ -32,7 +32,8 @@ module Gitlab
GitalyServer: {
address: Gitlab::GitalyClient.address(repository.storage),
token: Gitlab::GitalyClient.token(repository.storage),
- features: Feature::Gitaly.server_feature_flags(repository.project)
+ features: Feature::Gitaly.server_feature_flags(repository.project),
+ sidechannel: Feature.enabled?(:workhorse_use_sidechannel, repository.project, default_enabled: :yaml)
}
}
@@ -169,6 +170,18 @@ module Gitlab
]
end
+ def send_dependency(token, url)
+ params = {
+ 'Header' => { Authorization: ["Bearer #{token}"] },
+ 'Url' => url
+ }
+
+ [
+ SEND_DATA_HEADER,
+ "send-dependency:#{encode(params)}"
+ ]
+ end
+
def channel_websocket(channel)
details = {
'Channel' => {
diff --git a/lib/gitlab/x509/certificate.rb b/lib/gitlab/x509/certificate.rb
new file mode 100644
index 00000000000..c7289a51b49
--- /dev/null
+++ b/lib/gitlab/x509/certificate.rb
@@ -0,0 +1,56 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module X509
+ class Certificate
+ CERT_REGEX = /-----BEGIN CERTIFICATE-----(?:.|\n)+?-----END CERTIFICATE-----/.freeze
+
+ attr_reader :key, :cert, :ca_certs
+
+ def key_string
+ key.to_s
+ end
+
+ def cert_string
+ cert.to_pem
+ end
+
+ def ca_certs_string
+ ca_certs.map(&:to_pem).join('\n') unless ca_certs.blank?
+ end
+
+ def self.from_strings(key_string, cert_string, ca_certs_string = nil)
+ key = OpenSSL::PKey::RSA.new(key_string)
+ cert = OpenSSL::X509::Certificate.new(cert_string)
+ ca_certs = load_ca_certs_bundle(ca_certs_string)
+
+ new(key, cert, ca_certs)
+ end
+
+ def self.from_files(key_path, cert_path, ca_certs_path = nil)
+ ca_certs_string = File.read(ca_certs_path) if ca_certs_path
+
+ from_strings(File.read(key_path), File.read(cert_path), ca_certs_string)
+ end
+
+ # Returns an array of OpenSSL::X509::Certificate objects, empty array if none found
+ #
+ # Ruby OpenSSL::X509::Certificate.new will only load the first
+ # certificate if a bundle is presented, this allows to parse multiple certs
+ # in the same file
+ def self.load_ca_certs_bundle(ca_certs_string)
+ return [] unless ca_certs_string
+
+ ca_certs_string.scan(CERT_REGEX).map do |ca_cert_string|
+ OpenSSL::X509::Certificate.new(ca_cert_string)
+ end
+ end
+
+ def initialize(key, cert, ca_certs = nil)
+ @key = key
+ @cert = cert
+ @ca_certs = ca_certs
+ end
+ end
+ end
+end
diff --git a/lib/peek/views/active_record.rb b/lib/peek/views/active_record.rb
index a3fe206c86f..6a41de8f0b0 100644
--- a/lib/peek/views/active_record.rb
+++ b/lib/peek/views/active_record.rb
@@ -44,10 +44,8 @@ module Peek
count[item[:transaction]] += 1
end
- if ::Gitlab::Database::LoadBalancing.enable?
- count[item[:db_role]] ||= 0
- count[item[:db_role]] += 1
- end
+ count[item[:db_role]] ||= 0
+ count[item[:db_role]] += 1
end
def setup_subscribers
@@ -72,8 +70,6 @@ module Peek
end
def db_role(data)
- return unless ::Gitlab::Database::LoadBalancing.enable?
-
role = ::Gitlab::Database::LoadBalancing.db_role_for_connection(data[:connection]) ||
::Gitlab::Database::LoadBalancing::ROLE_UNKNOWN
diff --git a/lib/quality/seeders/issues.rb b/lib/quality/seeders/issues.rb
index 3eb0245f8a2..5d345dd30a1 100644
--- a/lib/quality/seeders/issues.rb
+++ b/lib/quality/seeders/issues.rb
@@ -30,7 +30,8 @@ module Quality
labels: labels.join(',')
}
params[:closed_at] = params[:created_at] + rand(35).days if params[:state] == 'closed'
- issue = ::Issues::CreateService.new(project: project, current_user: team.sample, params: params, spam_params: nil).execute
+
+ issue = ::Issues::CreateService.new(project: project, current_user: team.sample, params: params, spam_params: nil).execute_without_rate_limiting
if issue.persisted?
created_issues_count += 1
diff --git a/lib/sidebars/groups/menus/scope_menu.rb b/lib/sidebars/groups/menus/scope_menu.rb
index 02c359e3c99..6ce43491343 100644
--- a/lib/sidebars/groups/menus/scope_menu.rb
+++ b/lib/sidebars/groups/menus/scope_menu.rb
@@ -21,7 +21,11 @@ module Sidebars
override :extra_nav_link_html_options
def extra_nav_link_html_options
- { class: 'context-header' }
+ {
+ class: 'context-header has-tooltip',
+ title: context.group.name,
+ data: { container: 'body', placement: 'right' }
+ }
end
override :render?
diff --git a/lib/sidebars/projects/menus/deployments_menu.rb b/lib/sidebars/projects/menus/deployments_menu.rb
index 110d78367b9..24e58e71023 100644
--- a/lib/sidebars/projects/menus/deployments_menu.rb
+++ b/lib/sidebars/projects/menus/deployments_menu.rb
@@ -27,7 +27,7 @@ module Sidebars
override :sprite_icon
def sprite_icon
- 'environment'
+ 'deployments'
end
private
diff --git a/lib/sidebars/projects/menus/infrastructure_menu.rb b/lib/sidebars/projects/menus/infrastructure_menu.rb
index e26bb2237e6..92e9cbb7040 100644
--- a/lib/sidebars/projects/menus/infrastructure_menu.rb
+++ b/lib/sidebars/projects/menus/infrastructure_menu.rb
@@ -11,6 +11,7 @@ module Sidebars
add_item(kubernetes_menu_item)
add_item(serverless_menu_item)
add_item(terraform_menu_item)
+ add_item(google_cloud_menu_item)
true
end
@@ -87,6 +88,22 @@ module Sidebars
item_id: :terraform
)
end
+
+ def google_cloud_menu_item
+ feature_is_enabled = Feature.enabled?(:incubation_5mp_google_cloud)
+ user_has_permissions = can?(context.current_user, :manage_project_google_cloud, context.project)
+
+ unless feature_is_enabled && user_has_permissions
+ return ::Sidebars::NilMenuItem.new(item_id: :incubation_5mp_google_cloud)
+ end
+
+ ::Sidebars::MenuItem.new(
+ title: _('Google Cloud'),
+ link: project_google_cloud_index_path(context.project),
+ active_routes: {},
+ item_id: :google_cloud
+ )
+ end
end
end
end
diff --git a/lib/sidebars/projects/menus/scope_menu.rb b/lib/sidebars/projects/menus/scope_menu.rb
index 539912aa77b..35502c7ea09 100644
--- a/lib/sidebars/projects/menus/scope_menu.rb
+++ b/lib/sidebars/projects/menus/scope_menu.rb
@@ -28,7 +28,11 @@ module Sidebars
override :extra_nav_link_html_options
def extra_nav_link_html_options
- { class: 'context-header' }
+ {
+ class: 'context-header has-tooltip',
+ title: context.project.name,
+ data: { container: 'body', placement: 'right' }
+ }
end
override :render?
diff --git a/lib/system_check/app/git_version_check.rb b/lib/system_check/app/git_version_check.rb
index 31456dc096b..6512b142969 100644
--- a/lib/system_check/app/git_version_check.rb
+++ b/lib/system_check/app/git_version_check.rb
@@ -7,7 +7,7 @@ module SystemCheck
set_check_pass -> { "yes (#{self.current_version})" }
def self.required_version
- @required_version ||= Gitlab::VersionInfo.parse('2.31.0')
+ @required_version ||= Gitlab::VersionInfo.parse('2.33.0')
end
def self.current_version
diff --git a/lib/tasks/frontend.rake b/lib/tasks/frontend.rake
index b2d2c4e3f2b..e768c42736d 100644
--- a/lib/tasks/frontend.rake
+++ b/lib/tasks/frontend.rake
@@ -4,6 +4,11 @@ unless Rails.env.production?
namespace :frontend do
desc 'GitLab | Frontend | Generate fixtures for JavaScript tests'
RSpec::Core::RakeTask.new(:fixtures, [:pattern]) do |t, args|
+ require 'fileutils'
+ require_relative '../../spec/support/helpers/javascript_fixtures_helpers'
+
+ FileUtils.rm_r(JavaScriptFixturesHelpers.fixture_root_path, force: true)
+
directories = %w[spec]
directories << 'ee/spec' if Gitlab.ee?
directory_glob = "{#{directories.join(',')}}"
@@ -13,12 +18,30 @@ unless Rails.env.production?
t.rspec_opts = '--format documentation'
end
+ desc 'GitLab | Frontend | Generate fixtures for JavaScript integration tests'
+ RSpec::Core::RakeTask.new(:mock_server_rspec_fixtures) do |t, args|
+ require 'yaml'
+
+ base_path = Pathname.new('spec/frontend_integration/fixture_generators.yml')
+ ee_path = Pathname.new('ee') + base_path
+
+ fixtures = YAML.safe_load(base_path.read)
+ fixtures.concat(Array(YAML.safe_load(ee_path.read))) if Gitlab.ee? && ee_path.exist?
+
+ t.pattern = fixtures.join(',')
+ ENV['NO_KNAPSACK'] = 'true'
+ t.rspec_opts = '--format documentation'
+ end
+
desc 'GitLab | Frontend | Run JavaScript tests'
task tests: ['yarn:check'] do
sh "yarn test" do |ok, res|
abort('rake frontend:tests failed') unless ok
end
end
+
+ desc 'GitLab | Frontend | Shortcut for generating all fixtures used by MirajeJS mock server'
+ task mock_server_fixtures: ['frontend:mock_server_rspec_fixtures', 'gitlab:graphql:schema:dump']
end
desc 'GitLab | Frontend | Shortcut for frontend:fixtures and frontend:tests'
diff --git a/lib/tasks/gitlab/assets.rake b/lib/tasks/gitlab/assets.rake
index db10428e0dc..cbafed16852 100644
--- a/lib/tasks/gitlab/assets.rake
+++ b/lib/tasks/gitlab/assets.rake
@@ -7,6 +7,7 @@ module Tasks
module Assets
FOSS_ASSET_FOLDERS = %w[app/assets fixtures/emojis vendor/assets/javascripts].freeze
EE_ASSET_FOLDERS = %w[ee/app/assets].freeze
+ JH_ASSET_FOLDERS = %w[jh/app/assets].freeze
JS_ASSET_PATTERNS = %w[*.js config/**/*.js].freeze
JS_ASSET_FILES = %w[package.json yarn.lock].freeze
MASTER_MD5_HASH_FILE = 'master-assets-hash.txt'
@@ -28,6 +29,7 @@ module Tasks
def self.assets_impacting_webpack_compilation
assets_folders = FOSS_ASSET_FOLDERS
assets_folders += EE_ASSET_FOLDERS if ::Gitlab.ee?
+ assets_folders += JH_ASSET_FOLDERS if ::Gitlab.jh?
asset_files = Dir.glob(JS_ASSET_PATTERNS)
asset_files += JS_ASSET_FILES
diff --git a/lib/tasks/gitlab/db.rake b/lib/tasks/gitlab/db.rake
index a6738b01f18..e2647021914 100644
--- a/lib/tasks/gitlab/db.rake
+++ b/lib/tasks/gitlab/db.rake
@@ -211,37 +211,16 @@ namespace :gitlab do
exit 0
end
- desc 'Run migrations with instrumentation'
- task migration_testing: :environment do
- result_dir = Gitlab::Database::Migrations::Instrumentation::RESULT_DIR
- FileUtils.mkdir_p(result_dir)
-
- verbose_was = ActiveRecord::Migration.verbose
- ActiveRecord::Migration.verbose = true
-
- ctx = ActiveRecord::Base.connection.migration_context
- existing_versions = ctx.get_all_versions.to_set
-
- pending_migrations = ctx.migrations.reject do |migration|
- existing_versions.include?(migration.version)
+ namespace :migration_testing do
+ desc 'Run migrations with instrumentation'
+ task up: :environment do
+ Gitlab::Database::Migrations::Runner.up.run
end
- instrumentation = Gitlab::Database::Migrations::Instrumentation.new
-
- pending_migrations.each do |migration|
- instrumentation.observe(version: migration.version, name: migration.name) do
- ActiveRecord::Migrator.new(:up, ctx.migrations, ctx.schema_migration, migration.version).run
- end
- end
- ensure
- if instrumentation
- File.open(File.join(result_dir, Gitlab::Database::Migrations::Instrumentation::STATS_FILENAME), 'wb+') do |io|
- io << instrumentation.observations.to_json
- end
+ desc 'Run down migrations in current branch with instrumentation'
+ task down: :environment do
+ Gitlab::Database::Migrations::Runner.down.run
end
-
- ActiveRecord::Base.clear_cache!
- ActiveRecord::Migration.verbose = verbose_was
end
desc 'Run all pending batched migrations'
diff --git a/lib/tasks/gitlab/packages/composer.rake b/lib/tasks/gitlab/packages/composer.rake
deleted file mode 100644
index 97f1da0ff63..00000000000
--- a/lib/tasks/gitlab/packages/composer.rake
+++ /dev/null
@@ -1,20 +0,0 @@
-# frozen_string_literal: true
-
-require 'logger'
-
-desc "GitLab | Packages | Build composer cache"
-namespace :gitlab do
- namespace :packages do
- task build_composer_cache: :environment do
- logger = Logger.new($stdout)
- logger.info('Starting to build composer cache files')
-
- ::Packages::Package.composer.find_in_batches do |packages|
- packages.group_by { |pkg| [pkg.project_id, pkg.name] }.each do |(project_id, name), packages|
- logger.info("Building cache for #{project_id} -> #{name}")
- Gitlab::Composer::Cache.new(project: packages.first.project, name: name).execute
- end
- end
- end
- end
-end
diff --git a/lib/tasks/gitlab/snowplow.rake b/lib/tasks/gitlab/snowplow.rake
deleted file mode 100644
index 278ba4a471c..00000000000
--- a/lib/tasks/gitlab/snowplow.rake
+++ /dev/null
@@ -1,11 +0,0 @@
-# frozen_string_literal: true
-
-namespace :gitlab do
- namespace :snowplow do
- desc 'GitLab | Snowplow | Generate event dictionary'
- task generate_event_dictionary: :environment do
- items = Gitlab::Tracking::EventDefinition.definitions
- Gitlab::Tracking::Docs::Renderer.new(items).write
- end
- end
-end
diff --git a/lib/tasks/gitlab/usage_data.rake b/lib/tasks/gitlab/usage_data.rake
index 35ddc627389..694c49240ed 100644
--- a/lib/tasks/gitlab/usage_data.rake
+++ b/lib/tasks/gitlab/usage_data.rake
@@ -41,20 +41,32 @@ namespace :gitlab do
repository_includes = ci_template_includes_hash(:repository_source)
auto_devops_jobs_includes = ci_template_includes_hash(:auto_devops_source, 'Jobs')
auto_devops_security_includes = ci_template_includes_hash(:auto_devops_source, 'Security')
- all_includes = [*repository_includes, *auto_devops_jobs_includes, *auto_devops_security_includes]
+ all_includes = [
+ *repository_includes,
+ ci_template_event('p_ci_templates_implicit_auto_devops'),
+ *auto_devops_jobs_includes,
+ *auto_devops_security_includes
+ ]
File.write(Gitlab::UsageDataCounters::CiTemplateUniqueCounter::KNOWN_EVENTS_FILE_PATH, banner + YAML.dump(all_includes).gsub(/ *$/m, ''))
end
def ci_template_includes_hash(source, template_directory = nil)
Gitlab::UsageDataCounters::CiTemplateUniqueCounter.ci_templates("lib/gitlab/ci/templates/#{template_directory}").map do |template|
- {
- 'name' => Gitlab::UsageDataCounters::CiTemplateUniqueCounter.ci_template_event_name("#{template_directory}/#{template}", source),
- 'category' => 'ci_templates',
- 'redis_slot' => Gitlab::UsageDataCounters::CiTemplateUniqueCounter::REDIS_SLOT,
- 'aggregation' => 'weekly'
- }
+ expanded_template_name = Gitlab::UsageDataCounters::CiTemplateUniqueCounter.expand_template_name("#{template_directory}/#{template}")
+ event_name = Gitlab::UsageDataCounters::CiTemplateUniqueCounter.ci_template_event_name(expanded_template_name, source)
+
+ ci_template_event(event_name)
end
end
+
+ def ci_template_event(event_name)
+ {
+ 'name' => event_name,
+ 'category' => 'ci_templates',
+ 'redis_slot' => Gitlab::UsageDataCounters::CiTemplateUniqueCounter::REDIS_SLOT,
+ 'aggregation' => 'weekly'
+ }
+ end
end
end
diff --git a/lib/tasks/import.rake b/lib/tasks/import.rake
index b7a5cbe44b9..c93be95e2e0 100644
--- a/lib/tasks/import.rake
+++ b/lib/tasks/import.rake
@@ -46,21 +46,14 @@ class GithubImport
def import!
@project.import_state.force_start
- import_success = false
-
timings = Benchmark.measure do
- import_success = Gitlab::GithubImport::SequentialImporter
+ Gitlab::GithubImport::SequentialImporter
.new(@project, token: @options[:token])
.execute
end
- if import_success
- @project.after_import
- puts "Import finished. Timings: #{timings}".color(:green)
- else
- puts "Import was not successful. Errors were as follows:"
- puts @project.import_state.last_error
- end
+ @project.after_import
+ puts "Import finished. Timings: #{timings}".color(:green)
end
def new_project
diff --git a/lib/tasks/lint.rake b/lib/tasks/lint.rake
index 976ec089011..62d31803f6e 100644
--- a/lib/tasks/lint.rake
+++ b/lib/tasks/lint.rake
@@ -14,6 +14,14 @@ unless Rails.env.production?
Gitlab::Utils::Override.verify!
end
+ desc "GitLab | Lint | Static verification with database"
+ task static_verification_with_database: %w[
+ lint:static_verification_env
+ dev:load
+ ] do
+ Gitlab::Utils::DelegatorOverride.verify!
+ end
+
desc "GitLab | Lint | Lint JavaScript files using ESLint"
task :javascript do
Rake::Task['eslint'].invoke
diff --git a/lib/tasks/rubocop.rake b/lib/tasks/rubocop.rake
index a4147ae1bba..8c5edb5de8a 100644
--- a/lib/tasks/rubocop.rake
+++ b/lib/tasks/rubocop.rake
@@ -8,13 +8,14 @@ unless Rails.env.production?
namespace :rubocop do
namespace :todo do
desc 'Generate RuboCop todos'
- task :generate do
+ task :generate do # rubocop:disable Rails/RakeEnvironment
require 'rubocop'
options = %w[
--auto-gen-config
--auto-gen-only-exclude
--exclude-limit=100000
+ --no-offense-counts
]
RuboCop::CLI.new.run(options)
diff --git a/locale/am_ET/gitlab.po b/locale/am_ET/gitlab.po
index 78d2ce5a587..8314b02104d 100644
--- a/locale/am_ET/gitlab.po
+++ b/locale/am_ET/gitlab.po
@@ -14,10 +14,7 @@ msgstr ""
"X-Crowdin-Language: am\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-09-01 22:32\n"
-
-msgid " %{name}, confirm your email address now! "
-msgstr ""
+"PO-Revision-Date: 2021-10-04 20:20\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -92,6 +89,16 @@ msgstr ""
msgid "#general, #development"
msgstr ""
+msgid "%d Alert"
+msgid_plural "%d Alerts"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d Alert:"
+msgid_plural "%d Alerts:"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d Approval"
msgid_plural "%d Approvals"
msgstr[0] ""
@@ -455,8 +462,11 @@ msgstr ""
msgid "%{code_open}Protected:%{code_close} Only exposed to protected branches or tags."
msgstr ""
-msgid "%{commit_author_link} authored %{commit_timeago}"
-msgstr "%{commit_timeago} በ%{commit_author_link} የተደረሰ"
+msgid "%{commit_author_link} authored %{commit_authored_timeago}"
+msgstr ""
+
+msgid "%{commit_author_link} authored %{commit_authored_timeago} and %{commit_committer_avatar} %{commit_committer_link} committed %{commit_committer_timeago}"
+msgstr ""
msgid "%{completedCount} completed weight"
msgstr ""
@@ -549,6 +559,15 @@ msgstr ""
msgid "%{doc_link_start}Advanced search%{doc_link_end} is enabled."
msgstr ""
+msgid "%{docs_link_start}Learn about visibility levels.%{docs_link_end}"
+msgstr ""
+
+msgid "%{docs_link_start}What is Large File Storage?%{docs_link_end}"
+msgstr ""
+
+msgid "%{docs_link_start}What is two-factor authentication?%{docs_link_end}"
+msgstr ""
+
msgid "%{due_date} (Past due)"
msgstr ""
@@ -621,9 +640,6 @@ msgstr ""
msgid "%{issueType} actions"
msgstr ""
-msgid "%{issuesCount} issues with a limit of %{maxIssueCount}"
-msgstr ""
-
msgid "%{issuesSize} with a limit of %{maxIssueCount}"
msgstr ""
@@ -681,6 +697,12 @@ msgstr ""
msgid "%{label_for_message} unavailable"
msgstr "%{label_for_message} አáˆá‰°áŒˆáŠ˜áˆ"
+msgid "%{learn_more_link}."
+msgstr ""
+
+msgid "%{lessThan} 1 hour"
+msgstr ""
+
msgid "%{lets_encrypt_link_start}Let's Encrypt%{lets_encrypt_link_end} is a free, automated, and open certificate authority (CA) that issues digital certificates to enable HTTPS (SSL/TLS) for sites."
msgstr ""
@@ -693,15 +715,15 @@ msgstr "የá•áˆ®áŒ€áŠ­á‰± fork áˆáŠ•áŒ­ á‹á‰…ተኛ እይታ ስላለዠ%{
msgid "%{link_start}Learn more%{link_end} about roles."
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
-msgstr ""
-
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
msgstr ""
msgid "%{link_start}Start the title with %{draft_snippet}%{link_end} to prevent a merge request that is a work in progress from being merged before it's ready."
msgstr ""
+msgid "%{link_start}What information does GitLab Inc. collect?%{link_end}"
+msgstr ""
+
msgid "%{listToShow}, and %{awardsListLength} more"
msgstr ""
@@ -854,7 +876,7 @@ msgid_plural "%{securityScanner} results are not available because a pipeline ha
msgstr[0] ""
msgstr[1] ""
-msgid "%{service_ping_link_start}Learn more%{service_ping_link_end} about what information is shared with GitLab Inc."
+msgid "%{service_ping_link_start}What information is shared with GitLab Inc.?%{service_ping_link_end}"
msgstr ""
msgid "%{size} %{unit}"
@@ -890,6 +912,9 @@ msgstr ""
msgid "%{state} epics"
msgstr ""
+msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
+msgstr ""
+
msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
msgstr ""
@@ -949,11 +974,6 @@ msgstr ""
msgid "%{template_project_id} is unknown or invalid"
msgstr ""
-msgid "%{text} %{files}"
-msgid_plural "%{text} %{files} files"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%{text} is available"
msgstr ""
@@ -1038,9 +1058,6 @@ msgstr ""
msgid "%{wildcards_link_start}Wildcards%{wildcards_link_end} such as %{code_tag_start}v*%{code_tag_end} or %{code_tag_start}*-release%{code_tag_end} are supported."
msgstr ""
-msgid "&lt; 1 hour"
-msgstr ""
-
msgid "'%{data}' at %{location} does not match format: %{format}"
msgstr ""
@@ -1124,9 +1141,6 @@ msgstr ""
msgid "(we need your current password to confirm your changes)"
msgstr ""
-msgid "* * * * *"
-msgstr ""
-
msgid "+ %{amount} more"
msgstr ""
@@ -1193,10 +1207,10 @@ msgstr ""
msgid "."
msgstr ""
-msgid "0 bytes"
+msgid "/"
msgstr ""
-msgid "0 for unlimited, only effective with remote storage enabled."
+msgid "0 bytes"
msgstr ""
msgid "0t1DgySidms"
@@ -1326,6 +1340,9 @@ msgstr ""
msgid "1000+"
msgstr ""
+msgid "192.168.0.0/24"
+msgstr ""
+
msgid "1st contribution!"
msgstr ""
@@ -1479,9 +1496,6 @@ msgstr ""
msgid "A plain HTML site that uses Netlify for CI/CD instead of GitLab, but still with all the other great GitLab features"
msgstr ""
-msgid "A plain-text response to show to clients that hit the rate limit."
-msgstr ""
-
msgid "A platform value can be web, mob or app."
msgstr ""
@@ -1563,7 +1577,7 @@ msgstr ""
msgid "APIFuzzing|Configure HTTP basic authentication values. Other authentication methods are supported. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
+msgid "APIFuzzing|Customize your project's API fuzzing configuration options and copy the code snippet to your .gitlab-ci.yml file to apply any changes. Note that this tool does not reflect or update your .gitlab-ci.yml file automatically. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
msgstr ""
msgid "APIFuzzing|Enable authentication"
@@ -1626,9 +1640,6 @@ msgstr ""
msgid "APIFuzzing|To prevent a security leak, authentication info must be added as a %{ciVariablesLinkStart}CI variable%{ciVariablesLinkEnd}. As a user with maintainer access rights, you can manage CI variables in the %{ciSettingsLinkStart}Settings%{ciSettingsLinkEnd} area."
msgstr ""
-msgid "APIFuzzing|Use this tool to generate API fuzzing configuration YAML to copy into your .gitlab-ci.yml file. This tool does not reflect or update your .gitlab-ci.yml file automatically."
-msgstr ""
-
msgid "APIFuzzing|Username for basic authentication"
msgstr ""
@@ -1680,9 +1691,6 @@ msgstr ""
msgid "Abuse reports notification email"
msgstr ""
-msgid "Abuse reports will be sent to this address if it is set. Abuse reports are always available in the admin area."
-msgstr ""
-
msgid "Accept invitation"
msgstr ""
@@ -1719,12 +1727,18 @@ msgstr ""
msgid "Access granted"
msgstr ""
+msgid "Access key ID"
+msgstr ""
+
msgid "Access requests"
msgstr ""
msgid "Access to '%{classification_label}' not allowed"
msgstr ""
+msgid "Access tokens expire after 2 hours. A refresh token may be used at any time to generate a new access token. Non-expiring access tokens are deprecated. Clear this setting to enable backward compatibility."
+msgstr ""
+
msgid "AccessDropdown|Deploy Keys"
msgstr ""
@@ -2037,6 +2051,9 @@ msgstr ""
msgid "Add new directory"
msgstr ""
+msgid "Add new service account"
+msgstr ""
+
msgid "Add or remove previously merged commits"
msgstr ""
@@ -2274,6 +2291,9 @@ msgstr ""
msgid "AdminArea|Features"
msgstr ""
+msgid "AdminArea|Get security updates from GitLab and stay up to date"
+msgstr ""
+
msgid "AdminArea|Groups"
msgstr ""
@@ -2313,6 +2333,12 @@ msgstr ""
msgid "AdminArea|Reporter"
msgstr ""
+msgid "AdminArea|Sign up for the GitLab Security Newsletter to get notified for security updates."
+msgstr ""
+
+msgid "AdminArea|Sign up for the GitLab newsletter"
+msgstr ""
+
msgid "AdminArea|Stop all jobs"
msgstr ""
@@ -2382,9 +2408,15 @@ msgstr ""
msgid "AdminSettings|Disable public access to Pages sites"
msgstr ""
+msgid "AdminSettings|Display a banner on merge requests in projects with no pipelines to initiate steps to add a .gitlab-ci.yml file."
+msgstr ""
+
msgid "AdminSettings|Domain verification is an essential security measure for public GitLab sites. Users are required to demonstrate they control a domain before it is enabled. %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "AdminSettings|Enable pipeline suggestion banner"
+msgstr ""
+
msgid "AdminSettings|Enable shared runners for new projects"
msgstr ""
@@ -2856,10 +2888,10 @@ msgstr ""
msgid "Admin|Quarterly reconciliation will occur on %{qrtlyDate}"
msgstr ""
-msgid "Admin|The number of max seats used for your namespace is currently exceeding the number of seats in your subscription. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgid "Admin|The number of max seats in your namespace exceeds the number of seats in your subscription. On %{qrtlyDate}, quarterly reconciliation occurs and you are automatically billed a prorated amount for the overage. No action is needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice. For more information about the timing of the invoicing process, view the documentation."
msgstr ""
-msgid "Admin|The number of maximum users for your instance is currently exceeding the number of users in license. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgid "Admin|The number of max users in your instance exceeds the number of users in your license. On %{qrtlyDate}, quarterly reconciliation occurs and you are automatically billed a prorated amount for the overage. No action is needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice. For more information about the timing of the invoicing process, view the documentation."
msgstr ""
msgid "Admin|View pending user approvals"
@@ -2880,9 +2912,6 @@ msgstr ""
msgid "Advanced export options"
msgstr ""
-msgid "Advanced permissions, Large File Storage and Two-Factor authentication settings."
-msgstr ""
-
msgid "After a successful password update you will be redirected to login screen."
msgstr ""
@@ -2901,13 +2930,14 @@ msgstr ""
msgid "After you've reviewed these contribution guidelines, you'll be all set to"
msgstr ""
+msgid "Akismet"
+msgstr ""
+
msgid "Akismet API Key"
msgstr ""
-msgid "Alert"
-msgid_plural "Alerts"
-msgstr[0] ""
-msgstr[1] ""
+msgid "Akismet helps prevent the creation of spam issues in public projects."
+msgstr ""
msgid "AlertManagement|Acknowledged"
msgstr ""
@@ -3263,6 +3293,9 @@ msgstr ""
msgid "All (default)"
msgstr ""
+msgid "All GitLab"
+msgstr ""
+
msgid "All Members"
msgstr ""
@@ -3377,6 +3410,9 @@ msgstr ""
msgid "Allow this secondary node to replicate content on Object Storage"
msgstr ""
+msgid "Allow use of licensed EE features"
+msgstr ""
+
msgid "Allow users to dismiss the broadcast message"
msgstr ""
@@ -3452,9 +3488,6 @@ msgstr ""
msgid "Amazon authentication is not %{link_start}correctly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
-msgid "Amount of time (in hours) that users are allowed to skip forced configuration of two-factor authentication"
-msgstr ""
-
msgid "An %{link_start}alert%{link_end} with the same fingerprint is already open. To change the status of this alert, resolve the linked alert."
msgstr ""
@@ -3515,12 +3548,6 @@ msgstr ""
msgid "An error occurred when removing the label."
msgstr ""
-msgid "An error occurred when toggling the notification subscription"
-msgstr ""
-
-msgid "An error occurred when updating the issue weight"
-msgstr ""
-
msgid "An error occurred when updating the title"
msgstr ""
@@ -3569,6 +3596,9 @@ msgstr ""
msgid "An error occurred while enabling Service Desk."
msgstr ""
+msgid "An error occurred while fetching Markdown preview"
+msgstr ""
+
msgid "An error occurred while fetching ancestors"
msgstr ""
@@ -3599,9 +3629,6 @@ msgstr ""
msgid "An error occurred while fetching label colors."
msgstr ""
-msgid "An error occurred while fetching markdown preview"
-msgstr ""
-
msgid "An error occurred while fetching participants"
msgstr ""
@@ -3617,9 +3644,6 @@ msgstr ""
msgid "An error occurred while fetching reference"
msgstr ""
-msgid "An error occurred while fetching sidebar data"
-msgstr ""
-
msgid "An error occurred while fetching tags. Retry the search."
msgstr ""
@@ -3695,6 +3719,9 @@ msgstr ""
msgid "An error occurred while loading merge requests."
msgstr ""
+msgid "An error occurred while loading projects."
+msgstr ""
+
msgid "An error occurred while loading the Needs tab."
msgstr ""
@@ -3929,12 +3956,6 @@ msgstr ""
msgid "Any Milestone"
msgstr ""
-msgid "Any branch"
-msgstr ""
-
-msgid "Any eligible user"
-msgstr ""
-
msgid "Any encrypted tokens"
msgstr ""
@@ -3953,6 +3974,9 @@ msgstr ""
msgid "Any namespace"
msgstr ""
+msgid "App Engine description and apps that are suitable for this deployment target"
+msgstr ""
+
msgid "App ID"
msgstr ""
@@ -4101,6 +4125,11 @@ msgstr ""
msgid "Apply"
msgstr ""
+msgid "Apply %d suggestion"
+msgid_plural "Apply %d suggestions"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Apply a label"
msgstr ""
@@ -4110,13 +4139,10 @@ msgstr ""
msgid "Apply suggestion"
msgstr ""
-msgid "Apply suggestions"
-msgstr ""
-
msgid "Apply template"
msgstr ""
-msgid "Apply this approval rule to any branch or a specific protected branch."
+msgid "Apply this approval rule to all branches or a specific protected branch."
msgstr ""
msgid "Applying"
@@ -4259,9 +4285,6 @@ msgstr ""
msgid "ApprovalSettings|Prevent editing approval rules in projects and merge requests."
msgstr ""
-msgid "ApprovalSettings|Prevent editing approval rules in projects and merge requests. "
-msgstr ""
-
msgid "ApprovalSettings|Remove all approvals when commits are added to the source branch."
msgstr ""
@@ -4277,6 +4300,9 @@ msgstr ""
msgid "ApprovalSettings|This setting is configured at the instance level and can only be changed by an administrator."
msgstr ""
+msgid "ApprovalSettings|This setting is configured in %{groupName} and can only be changed by an administrator or group owner."
+msgstr ""
+
msgid "ApprovalStatusTooltip|Adheres to separation of duties"
msgstr ""
@@ -4763,9 +4789,6 @@ msgstr ""
msgid "Authenticated API rate limit period in seconds"
msgstr ""
-msgid "Authenticated API request rate limit"
-msgstr ""
-
msgid "Authenticated API requests"
msgstr ""
@@ -4775,10 +4798,10 @@ msgstr ""
msgid "Authenticated Git LFS request rate limit"
msgstr ""
-msgid "Authenticated web rate limit period in seconds"
+msgid "Authenticated Git LFS requests"
msgstr ""
-msgid "Authenticated web request rate limit"
+msgid "Authenticated web rate limit period in seconds"
msgstr ""
msgid "Authenticated web requests"
@@ -5156,9 +5179,6 @@ msgstr ""
msgid "Below you will find all the groups that are public."
msgstr ""
-msgid "Beta"
-msgstr ""
-
msgid "Bi-weekly code coverage"
msgstr ""
@@ -5398,6 +5418,21 @@ msgstr ""
msgid "Board scope affects which issues are displayed for anyone who visits this board"
msgstr ""
+msgid "BoardNewEpic|Groups"
+msgstr ""
+
+msgid "BoardNewEpic|Loading groups"
+msgstr ""
+
+msgid "BoardNewEpic|No matching results"
+msgstr ""
+
+msgid "BoardNewEpic|Search groups"
+msgstr ""
+
+msgid "BoardNewEpic|Select a group"
+msgstr ""
+
msgid "BoardNewIssue|No matching results"
msgstr ""
@@ -5475,6 +5510,9 @@ msgstr ""
msgid "Boards|An error occurred while creating the list. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching child groups. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching group projects. Please try again."
msgstr ""
@@ -5807,6 +5845,9 @@ msgstr ""
msgid "Bulk update"
msgstr ""
+msgid "BulkImports|Re-import creates a new group. It does not sync with the existing group."
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -5816,6 +5857,9 @@ msgstr ""
msgid "BulkImport|From source group"
msgstr ""
+msgid "BulkImport|Group import history"
+msgstr ""
+
msgid "BulkImport|Import failed: Destination cannot be a subgroup of the source group. Change the destination and try again."
msgstr ""
@@ -5828,9 +5872,18 @@ msgstr ""
msgid "BulkImport|Importing the group failed"
msgstr ""
+msgid "BulkImport|Last imported to %{link}"
+msgstr ""
+
msgid "BulkImport|Name already exists."
msgstr ""
+msgid "BulkImport|New group"
+msgstr ""
+
+msgid "BulkImport|No history is available"
+msgstr ""
+
msgid "BulkImport|No parent"
msgstr ""
@@ -5843,6 +5896,9 @@ msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} matching filter \"%{filter}\" from %{link}"
msgstr ""
+msgid "BulkImport|Source group"
+msgstr ""
+
msgid "BulkImport|To new group"
msgstr ""
@@ -5852,6 +5908,9 @@ msgstr ""
msgid "BulkImport|You have no groups to import"
msgstr ""
+msgid "BulkImport|Your imported groups will appear here."
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -6094,6 +6153,9 @@ msgstr ""
msgid "Can be manually deployed to"
msgstr ""
+msgid "Can be overridden in each project."
+msgstr ""
+
msgid "Can create groups:"
msgstr ""
@@ -6196,6 +6258,9 @@ msgstr ""
msgid "Cancelling Preview"
msgstr ""
+msgid "Cannot assign a confidential epic to a non-confidential issue. Make the issue confidential and try again"
+msgstr ""
+
msgid "Cannot be assigned to other projects."
msgstr ""
@@ -6247,9 +6312,6 @@ msgstr ""
msgid "Cannot refer to a group %{timebox_type} by an internal id!"
msgstr ""
-msgid "Cannot set confidential epic for a non-confidential issue"
-msgstr ""
-
msgid "Cannot show preview. For previews on sketch files, they must have the file format introduced by Sketch version 43 and above."
msgstr ""
@@ -6487,15 +6549,15 @@ msgstr ""
msgid "Check out, review, and merge locally"
msgstr ""
-msgid "Check the %{docs_link_start}documentation%{docs_link_end}."
-msgstr ""
-
msgid "Check the current instance configuration "
msgstr ""
msgid "Check the elasticsearch.log file to debug why the migration was halted and make any changes before retrying the migration. When you fix the cause of the failure, click \"Retry migration\", and the migration will be scheduled to be retried in the background."
msgstr ""
+msgid "Check with your administrator."
+msgstr ""
+
msgid "Check your Docker images for known vulnerabilities."
msgstr ""
@@ -6526,6 +6588,9 @@ msgstr ""
msgid "Checkout"
msgstr ""
+msgid "Checkout|$%{selectedPlanPrice} per 10 GB storage per pack"
+msgstr ""
+
msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 minutes"
msgstr ""
@@ -6546,17 +6611,23 @@ msgstr ""
msgid "Checkout|%{name}'s GitLab subscription"
msgstr ""
-msgid "Checkout|%{selectedPlanText} plan"
+msgid "Checkout|%{name}'s storage subscription"
msgstr ""
-msgid "Checkout|%{startDate} - %{endDate}"
+msgid "Checkout|%{quantity} GB of storage"
msgstr ""
-msgid "Checkout|%{totalCiMinutes} CI minute"
-msgid_plural "Checkout|%{totalCiMinutes} CI minutes"
+msgid "Checkout|%{quantity} storage pack"
+msgid_plural "Checkout|%{quantity} storage packs"
msgstr[0] ""
msgstr[1] ""
+msgid "Checkout|%{selectedPlanText} plan"
+msgstr ""
+
+msgid "Checkout|%{startDate} - %{endDate}"
+msgstr ""
+
msgid "Checkout|%{totalCiMinutes} CI minutes"
msgstr ""
@@ -6632,6 +6703,9 @@ msgstr ""
msgid "Checkout|Failed to register credit card. Please try again."
msgstr ""
+msgid "Checkout|GB"
+msgstr ""
+
msgid "Checkout|GitLab group"
msgstr ""
@@ -6668,6 +6742,9 @@ msgstr ""
msgid "Checkout|State"
msgstr ""
+msgid "Checkout|Storage packs"
+msgstr ""
+
msgid "Checkout|Street address"
msgstr ""
@@ -6689,6 +6766,9 @@ msgstr ""
msgid "Checkout|Total minutes: %{quantity}"
msgstr ""
+msgid "Checkout|Total storage: %{quantity} GB"
+msgstr ""
+
msgid "Checkout|Users"
msgstr ""
@@ -6698,16 +6778,25 @@ msgstr ""
msgid "Checkout|Your organization"
msgstr ""
+msgid "Checkout|Your storage subscription has the same term as your main subscription, and the price is prorated accordingly."
+msgstr ""
+
msgid "Checkout|Your subscription will be applied to this group"
msgstr ""
msgid "Checkout|Zip code"
msgstr ""
+msgid "Checkout|a storage subscription"
+msgstr ""
+
msgid "Checkout|company or team"
msgstr ""
-msgid "Checkout|x 1,000 minutes per pack = %{strong}"
+msgid "Checkout|minutes"
+msgstr ""
+
+msgid "Checkout|x %{quantity} %{units} per pack ="
msgstr ""
msgid "Cherry-pick this commit"
@@ -7064,6 +7153,9 @@ msgstr ""
msgid "CloneIssue|Cannot clone issue to target project as it is pending deletion."
msgstr ""
+msgid "CloneIssue|Cannot clone issues of '%{issue_type}' type."
+msgstr ""
+
msgid "Cloned this issue to %{path_to_project}."
msgstr ""
@@ -7118,7 +7210,10 @@ msgstr ""
msgid "Closes this %{quick_action_target}."
msgstr ""
-msgid "Cloud licenses can not be removed."
+msgid "Cloud Functions description and apps that are suitable for this deployment target"
+msgstr ""
+
+msgid "Cloud Run description and apps that are suitable for this deployment target"
msgstr ""
msgid "Cluster"
@@ -7145,6 +7240,12 @@ msgstr ""
msgid "ClusterAgents|Access tokens"
msgstr ""
+msgid "ClusterAgents|Agent might not be connected to GitLab"
+msgstr ""
+
+msgid "ClusterAgents|Agent never connected to GitLab"
+msgstr ""
+
msgid "ClusterAgents|Alternative installation methods"
msgstr ""
@@ -7160,6 +7261,12 @@ msgstr ""
msgid "ClusterAgents|Configuration"
msgstr ""
+msgid "ClusterAgents|Connected"
+msgstr ""
+
+msgid "ClusterAgents|Connection status"
+msgstr ""
+
msgid "ClusterAgents|Copy token"
msgstr ""
@@ -7178,6 +7285,9 @@ msgstr ""
msgid "ClusterAgents|For alternative installation methods %{linkStart}go to the documentation%{linkEnd}."
msgstr ""
+msgid "ClusterAgents|For more troubleshooting information go to"
+msgstr ""
+
msgid "ClusterAgents|Go to the repository"
msgstr ""
@@ -7193,18 +7303,30 @@ msgstr ""
msgid "ClusterAgents|Integrate with the GitLab Agent"
msgstr ""
-msgid "ClusterAgents|Last used"
+msgid "ClusterAgents|Last connected %{timeAgo}."
+msgstr ""
+
+msgid "ClusterAgents|Last contact"
msgstr ""
msgid "ClusterAgents|Learn how to create an agent access token"
msgstr ""
+msgid "ClusterAgents|Make sure you are using a valid token."
+msgstr ""
+
msgid "ClusterAgents|Name"
msgstr ""
msgid "ClusterAgents|Never"
msgstr ""
+msgid "ClusterAgents|Never connected"
+msgstr ""
+
+msgid "ClusterAgents|Not connected"
+msgstr ""
+
msgid "ClusterAgents|Read more about getting started"
msgstr ""
@@ -7226,6 +7348,9 @@ msgstr ""
msgid "ClusterAgents|Select which Agent you want to install"
msgstr ""
+msgid "ClusterAgents|The Agent has not been connected in a long time. There might be a connectivity issue. Last contact was %{timeAgo}."
+msgstr ""
+
msgid "ClusterAgents|The GitLab Agent also requires %{linkStart}enabling the Agent Server%{linkEnd}"
msgstr ""
@@ -7253,9 +7378,6 @@ msgstr ""
msgid "ClusterAgents|You will need to create a token to connect to your agent"
msgstr ""
-msgid "ClusterAgent|This feature is only available for premium plans"
-msgstr ""
-
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -7445,9 +7567,6 @@ msgstr ""
msgid "ClusterIntegration|Create Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Create a provision role on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the account and external ID above. %{startMoreInfoLink}More information%{endLink}"
-msgstr ""
-
msgid "ClusterIntegration|Create cluster on"
msgstr ""
@@ -7880,7 +7999,7 @@ msgstr ""
msgid "ClusterIntegration|Subnets"
msgstr ""
-msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provisioned role, first create one on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the above account and external IDs. %{startMoreInfoLink}More information%{endLink}"
+msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provisioned role, first create one on %{awsLinkStart}Amazon Web Services %{awsLinkEnd} using the above account and external IDs. %{moreInfoStart}More information%{moreInfoEnd}"
msgstr ""
msgid "ClusterIntegration|The Kubernetes certificate used to authenticate to the cluster."
@@ -8114,6 +8233,9 @@ msgstr ""
msgid "Collapse replies"
msgstr ""
+msgid "Collapse settings section"
+msgstr ""
+
msgid "Collapse sidebar"
msgstr ""
@@ -8132,6 +8254,9 @@ msgstr ""
msgid "Comma-separated list of email addresses."
msgstr ""
+msgid "Comma-separated list of users allowed to exceed the rate limit."
+msgstr ""
+
msgid "Comma-separated, e.g. '1.1.1.1, 2.2.2.0/24'"
msgstr ""
@@ -8452,6 +8577,9 @@ msgstr ""
msgid "Configure %{repository_checks_link_start}repository checks%{link_end} and %{housekeeping_link_start}housekeeping%{link_end} on repositories."
msgstr ""
+msgid "Configure CAPTCHAs, IP address limits, and other anti-spam measures."
+msgstr ""
+
msgid "Configure Dependency Scanning in `.gitlab-ci.yml` using the GitLab managed template. You can [add variable overrides](https://docs.gitlab.com/ee/user/application_security/dependency_scanning/#customizing-the-dependency-scanning-settings) to customize Dependency Scanning settings."
msgstr ""
@@ -8488,16 +8616,13 @@ msgstr ""
msgid "Configure a %{codeStart}.gitlab-webide.yml%{codeEnd} file in the %{codeStart}.gitlab%{codeEnd} directory to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
msgstr ""
-msgid "Configure existing installation"
-msgstr ""
-
-msgid "Configure limit for notes created per minute by web and API requests."
+msgid "Configure advanced permissions, Large File Storage, and two-factor authentication settings."
msgstr ""
-msgid "Configure limits for Project/Group Import/Export."
+msgid "Configure approvals by authors and committers on all projects."
msgstr ""
-msgid "Configure limits for web and API requests."
+msgid "Configure existing installation"
msgstr ""
msgid "Configure paths to be protected by Rack Attack."
@@ -8512,10 +8637,13 @@ msgstr ""
msgid "Configure settings for Advanced Search with Elasticsearch."
msgstr ""
+msgid "Configure specific limits for Files API requests that supersede the general user and IP rate limits."
+msgstr ""
+
msgid "Configure specific limits for Git LFS requests that supersede the general user and IP rate limits."
msgstr ""
-msgid "Configure specific limits for Packages API requests that supersede the general user and IP rate limits."
+msgid "Configure specific limits for deprecated API requests that supersede the general user and IP rate limits."
msgstr ""
msgid "Configure the %{link} integration."
@@ -8527,6 +8655,9 @@ msgstr ""
msgid "Configure the way a user creates a new account."
msgstr ""
+msgid "Configure via Merge Request"
+msgstr ""
+
msgid "Configure which lists are shown for anyone who visits this board"
msgstr ""
@@ -8995,6 +9126,9 @@ msgstr ""
msgid "Content parsed with %{link}."
msgstr ""
+msgid "ContentEditor|Table of Contents"
+msgstr ""
+
msgid "ContentEditor|You have to provide a renderMarkdown function or a custom serializer"
msgstr ""
@@ -9181,6 +9315,9 @@ msgstr ""
msgid "Copy link to chart"
msgstr ""
+msgid "Copy prefix"
+msgstr ""
+
msgid "Copy reference"
msgstr ""
@@ -9211,6 +9348,9 @@ msgstr ""
msgid "Copy value"
msgstr ""
+msgid "Corpus Management"
+msgstr ""
+
msgid "Corpus Management|Are you sure you want to delete the corpus?"
msgstr ""
@@ -9439,6 +9579,9 @@ msgstr ""
msgid "Create commit"
msgstr ""
+msgid "Create common files more quickly, and standardize their format."
+msgstr ""
+
msgid "Create confidential merge request"
msgstr ""
@@ -9472,6 +9615,9 @@ msgstr ""
msgid "Create issue"
msgstr ""
+msgid "Create issue to resolve all threads"
+msgstr ""
+
msgid "Create iteration"
msgstr ""
@@ -9526,6 +9672,9 @@ msgstr ""
msgid "Create new..."
msgstr ""
+msgid "Create or import your first project"
+msgstr ""
+
msgid "Create project"
msgstr ""
@@ -9883,7 +10032,7 @@ msgstr ""
msgid "Custom notification events"
msgstr ""
-msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notificationLinkStart} notification emails%{notificationLinkEnd}."
+msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notificationLinkStart}notification emails%{notificationLinkEnd}."
msgstr ""
msgid "Custom project templates"
@@ -10082,10 +10231,10 @@ msgid_plural "CycleAnalytics|Showing %{subjectFilterText} and %{selectedLabelsCo
msgstr[0] ""
msgstr[1] ""
-msgid "CycleAnalytics|Showing data for group '%{groupName}' and %{selectedProjectCount} projects from %{startDate} to %{endDate}"
+msgid "CycleAnalytics|Showing data for group '%{groupName}' and %{selectedProjectCount} projects from %{createdAfter} to %{createdBefore}"
msgstr ""
-msgid "CycleAnalytics|Showing data for group '%{groupName}' from %{startDate} to %{endDate}"
+msgid "CycleAnalytics|Showing data for group '%{groupName}' from %{createdAfter} to %{createdBefore}"
msgstr ""
msgid "CycleAnalytics|Stages"
@@ -10319,6 +10468,9 @@ msgstr ""
msgid "DastProfiles|Manage profiles"
msgstr ""
+msgid "DastProfiles|Manage site profiles"
+msgstr ""
+
msgid "DastProfiles|Minimum = 0 (no timeout enabled), Maximum = 2880 minutes"
msgstr ""
@@ -10394,6 +10546,9 @@ msgstr ""
msgid "DastProfiles|Scanner name"
msgstr ""
+msgid "DastProfiles|Schedule"
+msgstr ""
+
msgid "DastProfiles|Select branch"
msgstr ""
@@ -10463,7 +10618,7 @@ msgstr ""
msgid "DastProfiles|Website"
msgstr ""
-msgid "DastProfiles|You can either choose a passive scan or validate the target site in your chosen site profile. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
+msgid "DastProfiles|You can either choose a passive scan or validate the target site from the site profile management page. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
msgstr ""
msgid "DastProfiles|You cannot run an active scan against an unvalidated site."
@@ -10636,7 +10791,7 @@ msgstr ""
msgid "Days to merge"
msgstr ""
-msgid "Deactivate dormant users after 90 days of inactivity. Users can return to active status by signing in to their account. While inactive, a user is not counted as an active user in the instance."
+msgid "Deactivate dormant users after 90 days of inactivity"
msgstr ""
msgid "Dear Administrator,"
@@ -10723,10 +10878,10 @@ msgstr ""
msgid "Define a custom pattern with cron syntax"
msgstr ""
-msgid "Define approval settings."
+msgid "Define approval rules."
msgstr ""
-msgid "Define approval settings. %{linkStart}Learn more.%{linkEnd}"
+msgid "Define approval rules. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "Define custom rules for what constitutes spam, independent of Akismet"
@@ -10735,7 +10890,7 @@ msgstr ""
msgid "Define environments in the deploy stage(s) in %{code_open}.gitlab-ci.yml%{code_close} to track deployments here."
msgstr ""
-msgid "Define how approval rules are applied as a merge request moves toward completion."
+msgid "Define how approval rules are applied to merge requests."
msgstr ""
msgid "Definition"
@@ -10750,6 +10905,12 @@ msgstr ""
msgid "DelayedJobs|Are you sure you want to run %{job_name} immediately? This job will run automatically after it's timer finishes."
msgstr ""
+msgid "DelayedJobs|Are you sure you want to run %{job_name} immediately? This job will run automatically after its timer finishes."
+msgstr ""
+
+msgid "DelayedJobs|Run the delayed job now?"
+msgstr ""
+
msgid "DelayedJobs|Start now"
msgstr ""
@@ -11026,6 +11187,12 @@ msgstr ""
msgid "Dependency proxy image prefix"
msgstr ""
+msgid "DependencyProxy|Create a local proxy for storing frequently used upstream images. %{docLinkStart}Learn more%{docLinkEnd} about dependency proxies."
+msgstr ""
+
+msgid "DependencyProxy|Dependency Proxy"
+msgstr ""
+
msgid "DependencyProxy|Toggle Dependency Proxy"
msgstr ""
@@ -11266,6 +11433,9 @@ msgstr ""
msgid "Deployments"
msgstr ""
+msgid "Deployments to Google Kubernetes Engine can be "
+msgstr ""
+
msgid "Deployments|%{deployments} environment impacted."
msgid_plural "Deployments|%{deployments} environments impacted."
msgstr[0] ""
@@ -11295,6 +11465,9 @@ msgstr ""
msgid "Deployment|success"
msgstr ""
+msgid "Deprecated API rate limits"
+msgstr ""
+
msgid "Deprioritize label"
msgstr ""
@@ -11697,6 +11870,16 @@ msgstr ""
msgid "DiffsCompareBaseBranch|(base)"
msgstr ""
+msgid "Diffs|%d addition"
+msgid_plural "Diffs|%d additions"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Diffs|%d deletion"
+msgid_plural "Diffs|%d deletions"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Diffs|No file name available"
msgstr ""
@@ -11706,9 +11889,17 @@ msgstr ""
msgid "Diffs|Show all unchanged lines"
msgstr ""
+msgid "Diffs|Showing %{dropdownStart}%{count} changed file%{dropdownEnd}"
+msgid_plural "Diffs|Showing %{dropdownStart}%{count} changed files%{dropdownEnd}"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Diffs|Something went wrong while fetching diff lines."
msgstr ""
+msgid "Diffs|with %{additions} and %{deletions}"
+msgstr ""
+
msgid "Direct member"
msgstr ""
@@ -11834,9 +12025,6 @@ msgid_plural "Dismiss %d selected vulnerabilities as"
msgstr[0] ""
msgstr[1] ""
-msgid "Dismiss Value Stream Analytics introduction box"
-msgstr ""
-
msgid "Dismiss merge request promotion"
msgstr ""
@@ -12158,6 +12346,9 @@ msgstr ""
msgid "Edit issues"
msgstr ""
+msgid "Edit merge requests"
+msgstr ""
+
msgid "Edit public deploy key"
msgstr ""
@@ -12233,6 +12424,9 @@ msgstr ""
msgid "Elastic|None. Select projects to index."
msgstr ""
+msgid "Eligible users"
+msgstr ""
+
msgid "Email"
msgstr ""
@@ -12362,6 +12556,9 @@ msgstr ""
msgid "Enable"
msgstr ""
+msgid "Enable Amazon EKS integration"
+msgstr ""
+
msgid "Enable Auto DevOps"
msgstr ""
@@ -12395,6 +12592,9 @@ msgstr ""
msgid "Enable SSL verification"
msgstr ""
+msgid "Enable Service Ping"
+msgstr ""
+
msgid "Enable Snowplow tracking"
msgstr ""
@@ -12425,6 +12625,9 @@ msgstr ""
msgid "Enable authenticated Git LFS request rate limit"
msgstr ""
+msgid "Enable authenticated web request rate limit"
+msgstr ""
+
msgid "Enable authentication"
msgstr ""
@@ -12485,7 +12688,7 @@ msgstr ""
msgid "Enable or disable the Pseudonymizer data collection."
msgstr ""
-msgid "Enable or disable version check and service ping."
+msgid "Enable or disable version check and Service Ping."
msgstr ""
msgid "Enable protected paths rate limit"
@@ -12497,18 +12700,12 @@ msgstr ""
msgid "Enable reCAPTCHA"
msgstr ""
-msgid "Enable reCAPTCHA for login"
-msgstr ""
-
-msgid "Enable reCAPTCHA, Invisible Captcha, Akismet and set IP limits. For reCAPTCHA, we currently only support %{recaptcha_v2_link_start}v2%{recaptcha_v2_link_end}"
+msgid "Enable reCAPTCHA for login."
msgstr ""
msgid "Enable repository checks"
msgstr ""
-msgid "Enable service ping"
-msgstr ""
-
msgid "Enable shared runners for all projects and subgroups in this group."
msgstr ""
@@ -12530,7 +12727,10 @@ msgstr ""
msgid "Enable unauthenticated API request rate limit"
msgstr ""
-msgid "Enable unauthenticated request rate limit"
+msgid "Enable unauthenticated web request rate limit"
+msgstr ""
+
+msgid "Enable user deactivation emails"
msgstr ""
msgid "Enable version check"
@@ -12566,9 +12766,6 @@ msgstr ""
msgid "Enabled sources for code import during project creation. OmniAuth must be configured for GitHub"
msgstr ""
-msgid "Enabling this will only make licensed EE features available to projects if the project namespace's plan includes the feature or if the project is public."
-msgstr ""
-
msgid "Encountered an error while rendering: %{err}"
msgstr ""
@@ -12617,9 +12814,6 @@ msgstr ""
msgid "Enter Admin Mode"
msgstr ""
-msgid "Enter IP address range"
-msgstr ""
-
msgid "Enter a number"
msgstr ""
@@ -12632,9 +12826,6 @@ msgstr ""
msgid "Enter at least three characters to search"
msgstr ""
-msgid "Enter domain"
-msgstr ""
-
msgid "Enter in your Bitbucket Server URL and personal access token below"
msgstr ""
@@ -12821,9 +13012,6 @@ msgstr ""
msgid "Environments|Deployment %{status}"
msgstr ""
-msgid "Environments|Dismiss"
-msgstr ""
-
msgid "Environments|Enable review app"
msgstr ""
@@ -12836,9 +13024,6 @@ msgstr ""
msgid "Environments|Environments are places where code gets deployed, such as staging or production."
msgstr ""
-msgid "Environments|Help us improve environments"
-msgstr ""
-
msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
msgstr ""
@@ -12875,6 +13060,9 @@ msgstr ""
msgid "Environments|Note that this action will stop the environment, but it will %{emphasisStart}not%{emphasisEnd} have an effect on any existing deployment due to no “stop environment action†being defined in the %{ciConfigLinkStart}.gitlab-ci.yml%{ciConfigLinkEnd} file."
msgstr ""
+msgid "Environments|Open"
+msgstr ""
+
msgid "Environments|Open live environment"
msgstr ""
@@ -12914,9 +13102,6 @@ msgstr ""
msgid "Environments|Stopping %{environmentName}"
msgstr ""
-msgid "Environments|Take the survey"
-msgstr ""
-
msgid "Environments|There was an error fetching the logs. Please try again."
msgstr ""
@@ -12938,9 +13123,6 @@ msgstr ""
msgid "Environments|You don't have any environments right now"
msgstr ""
-msgid "Environments|Your feedback helps GitLab make environments better for you and other users. Participate and enter a sweepstake to win a USD 30 gift card."
-msgstr ""
-
msgid "Environments|by %{avatar}"
msgstr ""
@@ -13223,7 +13405,7 @@ msgstr ""
msgid "Error parsing CSV file. Please make sure it has"
msgstr ""
-msgid "Error rendering markdown preview"
+msgid "Error rendering Markdown preview"
msgstr ""
msgid "Error saving label update."
@@ -13271,6 +13453,9 @@ msgstr ""
msgid "Error: %{error_message}"
msgstr ""
+msgid "Error: Couldn't load some or all of the changes."
+msgstr ""
+
msgid "Error: No AWS credentials were supplied"
msgstr ""
@@ -13304,6 +13489,9 @@ msgstr ""
msgid "ErrorTracking|Enable error tracking"
msgstr ""
+msgid "ErrorTracking|Error tracking backend"
+msgstr ""
+
msgid "ErrorTracking|If you self-host Sentry, enter your Sentry instance's full URL. If you use Sentry's hosted solution, enter https://sentry.io"
msgstr ""
@@ -13337,6 +13525,12 @@ msgstr ""
msgid "Escalation policies must have at least one rule"
msgstr ""
+msgid "EscalationPolicies|%{clockIcon} IF alert is not %{alertStatus} in %{minutes}"
+msgstr ""
+
+msgid "EscalationPolicies|%{notificationIcon} THEN %{doAction} %{forScheduleOrUser}"
+msgstr ""
+
msgid "EscalationPolicies|+ Add an additional rule"
msgstr ""
@@ -13379,13 +13573,13 @@ msgstr ""
msgid "EscalationPolicies|Escalation policies"
msgstr ""
-msgid "EscalationPolicies|Escalation rules"
+msgid "EscalationPolicies|Escalation policy %{obstacle} in Project %{project}"
msgstr ""
-msgid "EscalationPolicies|Failed to load oncall-schedules"
+msgid "EscalationPolicies|Escalation rules"
msgstr ""
-msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} %{then} THEN %{doAction} %{scheduleOrUser}"
+msgid "EscalationPolicies|Failed to load oncall-schedules"
msgstr ""
msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} minutes"
@@ -13463,18 +13657,36 @@ msgstr ""
msgid "Every %{action} attempt has failed: %{job_error_message}. Please try again."
msgstr ""
+msgid "Every 3 months"
+msgstr ""
+
+msgid "Every 3 months on the %{day} at %{time} %{timezone}"
+msgstr ""
+
+msgid "Every 6 months"
+msgstr ""
+
+msgid "Every 6 months on the %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Every day"
msgstr ""
msgid "Every day (at %{time})"
msgstr ""
+msgid "Every day at %{time} %{timezone}"
+msgstr ""
+
msgid "Every month"
msgstr ""
msgid "Every month (Day %{day} at %{time})"
msgstr ""
+msgid "Every month on the %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Every three months"
msgstr ""
@@ -13489,6 +13701,15 @@ msgstr[1] ""
msgid "Every week (%{weekday} at %{time})"
msgstr ""
+msgid "Every week on %{day} at %{time} %{timezone}"
+msgstr ""
+
+msgid "Every year"
+msgstr ""
+
+msgid "Every year on %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Everyone"
msgstr ""
@@ -13525,9 +13746,6 @@ msgstr ""
msgid "Exactly one of %{attributes} is required"
msgstr ""
-msgid "Example: %{ip_address}. %{read_more_link}."
-msgstr ""
-
msgid "Example: @sub\\.company\\.com$"
msgstr ""
@@ -13594,13 +13812,13 @@ msgstr ""
msgid "Expand pipeline"
msgstr ""
-msgid "Expand sidebar"
+msgid "Expand settings section"
msgstr ""
-msgid "Expected documents: %{expected_documents}"
+msgid "Expand sidebar"
msgstr ""
-msgid "Experienced"
+msgid "Expected documents: %{expected_documents}"
msgstr ""
msgid "ExperimentSubject|Must have exactly one of User, Namespace, or Project."
@@ -13885,9 +14103,6 @@ msgstr ""
msgid "Failed to load related branches"
msgstr ""
-msgid "Failed to load sidebar lock status"
-msgstr ""
-
msgid "Failed to load stacktrace."
msgstr ""
@@ -14312,6 +14527,9 @@ msgstr ""
msgid "Files"
msgstr ""
+msgid "Files API Rate Limits"
+msgstr ""
+
msgid "Files breadcrumb"
msgstr ""
@@ -15311,6 +15529,9 @@ msgstr ""
msgid "GitLab group: %{source_link}"
msgstr ""
+msgid "GitLab informs you if a new version is available."
+msgstr ""
+
msgid "GitLab is a complete DevOps platform, delivered as a single application, fundamentally changing the way Development, Security, and Ops teams collaborate"
msgstr ""
@@ -15326,7 +15547,7 @@ msgstr ""
msgid "GitLab is open source software to collaborate on code."
msgstr ""
-msgid "GitLab is undergoing maintenance and is operating in a read-only mode."
+msgid "GitLab is undergoing maintenance and is operating in read-only mode."
msgstr ""
msgid "GitLab member or Email address"
@@ -15338,9 +15559,6 @@ msgstr ""
msgid "GitLab project export"
msgstr ""
-msgid "GitLab restart is required to apply changes."
-msgstr ""
-
msgid "GitLab single sign-on URL"
msgstr ""
@@ -15356,9 +15574,6 @@ msgstr ""
msgid "GitLab version"
msgstr ""
-msgid "GitLab will inform you if a new version is available."
-msgstr ""
-
msgid "GitLab will run a background job that will produce pseudonymized CSVs of the GitLab database that will be uploaded to your configured object storage directory."
msgstr ""
@@ -15623,9 +15838,21 @@ msgstr ""
msgid "Go to snippets"
msgstr ""
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check 'Allowed domains for sign-ups'."
+msgstr ""
+
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check 'Email restrictions for sign-ups'."
+msgstr ""
+
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check the 'Domain denylist'."
+msgstr ""
+
msgid "Go to the activity feed"
msgstr ""
+msgid "Go to the group’s 'Settings &gt; General' page, and check 'Restrict membership by email domain'."
+msgstr ""
+
msgid "Go to the milestone list"
msgstr ""
@@ -15662,6 +15889,12 @@ msgstr ""
msgid "Goal of the changes and what reviewers should be aware of"
msgstr ""
+msgid "Google Cloud"
+msgstr ""
+
+msgid "Google Cloud offers several deployment targets. Select the one most suitable for your project."
+msgstr ""
+
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
@@ -15746,9 +15979,6 @@ msgstr ""
msgid "Group ID"
msgstr ""
-msgid "Group ID: %{group_id}"
-msgstr ""
-
msgid "Group Owner must have signed in with SAML before enabling Group Managed Accounts"
msgstr ""
@@ -15923,6 +16153,12 @@ msgstr ""
msgid "GroupImport|Unable to process group import file"
msgstr ""
+msgid "GroupPage|Copy group ID"
+msgstr ""
+
+msgid "GroupPage|Group ID: %{group_id}"
+msgstr ""
+
msgid "GroupRoadmap|%{dateWord} – No end date"
msgstr ""
@@ -15977,6 +16213,9 @@ msgstr ""
msgid "GroupRoadmap|Within 3 years"
msgstr ""
+msgid "GroupSAML|\"persistent\" recommended"
+msgstr ""
+
msgid "GroupSAML|%{strongOpen}Warning%{strongClose} - Enabling %{linkStart}SSO enforcement%{linkEnd} can reduce security risks."
msgstr ""
@@ -16109,6 +16348,9 @@ msgstr ""
msgid "GroupSAML|To be able to prohibit outer forks, you first need to enforce dedicate group managed accounts."
msgstr ""
+msgid "GroupSAML|Use SAML group links to manage group membership using SAML."
+msgstr ""
+
msgid "GroupSAML|Valid SAML Response"
msgstr ""
@@ -16121,13 +16363,10 @@ msgstr ""
msgid "GroupSAML|as %{access_level}"
msgstr ""
-msgid "GroupSAML|must match stored NameID of \"%{extern_uid}\" as we use this to identify users. If the NameID changes users will be unable to sign in."
-msgstr ""
-
-msgid "GroupSAML|should be \"persistent\""
+msgid "GroupSAML|must match stored NameID of \"%{extern_uid}\" to identify user and allow sign in"
msgstr ""
-msgid "GroupSAML|should be a random persistent ID, emails are discouraged"
+msgid "GroupSAML|recommend persistent ID instead of email"
msgstr ""
msgid "GroupSelect|No matching results"
@@ -16142,9 +16381,15 @@ msgstr ""
msgid "GroupSettings|Allow project access token creation"
msgstr ""
+msgid "GroupSettings|Applied to all subgroups unless overridden by a group owner. Groups already added to the project lose access."
+msgstr ""
+
msgid "GroupSettings|Auto DevOps pipeline was updated for the group"
msgstr ""
+msgid "GroupSettings|Available only on the top-level group. Applies to all subgroups. Groups already shared with a group outside %{group} are still shared unless removed manually."
+msgstr ""
+
msgid "GroupSettings|Badges"
msgstr ""
@@ -16196,6 +16441,9 @@ msgstr ""
msgid "GroupSettings|New runners registration token has been generated!"
msgstr ""
+msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgstr ""
+
msgid "GroupSettings|Pipeline settings was updated for the group"
msgstr ""
@@ -16208,12 +16456,15 @@ msgstr ""
msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
-msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups."
+msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups"
msgstr ""
msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
msgstr ""
+msgid "GroupSettings|Prevents group members from being notified if the group is mentioned."
+msgstr ""
+
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
msgstr ""
@@ -16250,21 +16501,6 @@ msgstr ""
msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}."
msgstr ""
-msgid "GroupSettings|This setting is only available on the top-level group and it applies to all subgroups. Groups that have already been shared with a group outside %{group} will still be shared, and this access will have to be revoked manually."
-msgstr ""
-
-msgid "GroupSettings|This setting will be applied to all subgroups unless overridden by a group owner. Groups that already have access to the project will continue to have access unless removed manually."
-msgstr ""
-
-msgid "GroupSettings|This setting will override user notification preferences for all members of the group, subgroups, and projects."
-msgstr ""
-
-msgid "GroupSettings|This setting will prevent group members from being notified if the group is mentioned."
-msgstr ""
-
-msgid "GroupSettings|This setting will prevent group members from forking projects outside of the group."
-msgstr ""
-
msgid "GroupSettings|Transfer group"
msgstr ""
@@ -16382,7 +16618,7 @@ msgstr ""
msgid "GroupsNew|No import options available"
msgstr ""
-msgid "GroupsNew|Not all related objects are migrated, as %{docs_link_start}described here%{docs_link_end}. Please %{feedback_link_start}leave feedback%{feedback_link_end} on this feature."
+msgid "GroupsNew|Not all related objects are migrated. %{docs_link_start}More info%{docs_link_end}."
msgstr ""
msgid "GroupsNew|Personal access token"
@@ -16514,15 +16750,27 @@ msgstr ""
msgid "Hello %{name},"
msgstr ""
-msgid "Hello there"
-msgstr ""
-
msgid "Hello, %{name}!"
msgstr ""
msgid "Hello, %{username}!"
msgstr ""
+msgid "HelloMessage|%{handshake_emoji} Contribute to GitLab: %{contribute_link}"
+msgstr ""
+
+msgid "HelloMessage|%{magnifier_emoji} Create a new GitLab issue: %{new_issue_link}"
+msgstr ""
+
+msgid "HelloMessage|%{rocket_emoji} We like your curiosity! Help us improve GitLab by joining the team: %{jobs_page_link}"
+msgstr ""
+
+msgid "HelloMessage|Does this page need fixes or improvements? Open an issue or contribute a merge request to help make GitLab more lovable. At GitLab, everyone can contribute!"
+msgstr ""
+
+msgid "HelloMessage|Welcome to GitLab!"
+msgstr ""
+
msgid "Help"
msgstr ""
@@ -16532,13 +16780,10 @@ msgstr ""
msgid "Helps prevent bots from creating accounts."
msgstr ""
-msgid "Helps prevent bots from creating issues"
-msgstr ""
-
-msgid "Helps prevent malicious users hide their activity"
+msgid "Helps prevent bots from creating issues."
msgstr ""
-msgid "Helps reduce request volume (e.g. from crawlers or abusive bots)"
+msgid "Helps prevent malicious users hide their activity."
msgstr ""
msgid "Helps reduce request volume (for example, from crawlers or abusive bots)"
@@ -16662,6 +16907,12 @@ msgstr ""
msgid "Housekeeping, export, path, transfer, remove, archive."
msgstr ""
+msgid "How do I configure Akismet?"
+msgstr ""
+
+msgid "How do I configure it?"
+msgstr ""
+
msgid "How do I configure runners?"
msgstr ""
@@ -16683,19 +16934,25 @@ msgstr ""
msgid "How do I set up this service?"
msgstr ""
+msgid "How do I use a web terminal?"
+msgstr ""
+
+msgid "How do I use file templates?"
+msgstr ""
+
msgid "How it works"
msgstr ""
msgid "How many days need to pass between marking entity for deletion and actual removing it."
msgstr ""
-msgid "How many seconds an IP will be counted towards the limit"
+msgid "How many seconds an IP counts toward the IP address limit."
msgstr ""
-msgid "I accept the %{terms_link}"
+msgid "How the job limiter handles jobs exceeding the thresholds specified below. The 'track' mode only logs the jobs. The 'compress' mode compresses the jobs and raises an exception if the compressed size exceeds the limit."
msgstr ""
-msgid "I accept the|Terms of Service and Privacy Policy"
+msgid "I accept the %{terms_link}"
msgstr ""
msgid "I forgot my password"
@@ -16779,13 +17036,16 @@ msgstr ""
msgid "IP Address"
msgstr ""
-msgid "IP expiration time"
+msgid "IP address expiration time"
msgstr ""
-msgid "IP subnet restriction only allowed for top-level groups"
+msgid "IP address restrictions"
+msgstr ""
+
+msgid "IP addresses per user"
msgstr ""
-msgid "IPs per user"
+msgid "IP subnet restriction only allowed for top-level groups"
msgstr ""
msgid "Identifier"
@@ -16800,6 +17060,9 @@ msgstr ""
msgid "If any indexed field exceeds this limit it will be truncated to this number of characters and the rest will not be indexed or searchable. This does not apply to repository and wiki indexing. Setting this to 0 means it is unlimited."
msgstr ""
+msgid "If blank, defaults to %{code_open}Retry later%{code_close}."
+msgstr ""
+
msgid "If blank, set allowable lifetime to %{instance_level_policy_in_words}, as defined by the instance admin. Once set, existing tokens for users in this group may be revoked."
msgstr ""
@@ -16851,6 +17114,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 did not initiate these sign-in attempts, please reach out to your administrator or enable two-factor authentication (2FA) on your account."
+msgstr ""
+
msgid "If you did not initiate this change, please contact your administrator immediately."
msgstr ""
@@ -16942,10 +17208,10 @@ msgstr ""
msgid "Import Projects from Gitea"
msgstr ""
-msgid "Import a project"
+msgid "Import an exported GitLab project"
msgstr ""
-msgid "Import an exported GitLab project"
+msgid "Import and export rate limits"
msgstr ""
msgid "Import failed due to a GitHub error: %{original}"
@@ -16957,12 +17223,18 @@ msgstr ""
msgid "Import from Jira"
msgstr ""
+msgid "Import group"
+msgstr ""
+
msgid "Import group from file"
msgstr ""
msgid "Import groups"
msgstr ""
+msgid "Import history"
+msgstr ""
+
msgid "Import in progress"
msgstr ""
@@ -17026,7 +17298,25 @@ msgstr ""
msgid "Import timed out. Import took longer than %{import_jobs_expiration} seconds"
msgstr ""
-msgid "Import/Export Rate Limits"
+msgid "ImportAProjectModal|Import from a project"
+msgstr ""
+
+msgid "ImportAProjectModal|Import members from another project"
+msgstr ""
+
+msgid "ImportAProjectModal|Import project members"
+msgstr ""
+
+msgid "ImportAProjectModal|Only project members (not group members) are imported, and they get the same permissions as the project you import from."
+msgstr ""
+
+msgid "ImportAProjectModal|Successfully imported"
+msgstr ""
+
+msgid "ImportAProjectModal|Unable to import project members"
+msgstr ""
+
+msgid "ImportAProjectModal|You're importing members to the %{strongStart}%{name}%{strongEnd} project."
msgstr ""
msgid "ImportButtons|Connect repositories from"
@@ -17079,7 +17369,7 @@ msgstr[1] ""
msgid "Importing..."
msgstr ""
-msgid "Import|A repository URL usually ends in a .git suffix, although this is not required. Double check to make sure your repository URL is correct."
+msgid "Import|There is not a valid Git repository at this URL. If your HTTP repository is not publicly accessible, verify your credentials."
msgstr ""
msgid "Improve customer support with Service Desk"
@@ -17088,9 +17378,6 @@ msgstr ""
msgid "Improves Git cloning performance."
msgstr ""
-msgid "In %{time_to_now}"
-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 ""
@@ -17376,7 +17663,7 @@ msgstr ""
msgid "InProductMarketing|Start a GitLab Ultimate trial today in less than one minute, no credit card required."
msgstr ""
-msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no CC required"
+msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no credit card required"
msgstr ""
msgid "InProductMarketing|Start a trial"
@@ -17415,7 +17702,7 @@ msgstr ""
msgid "InProductMarketing|Team up in GitLab for greater efficiency"
msgstr ""
-msgid "InProductMarketing|Team work makes the dream work"
+msgid "InProductMarketing|Team work makes the dream work"
msgstr ""
msgid "InProductMarketing|Test, create, deploy"
@@ -17996,6 +18283,9 @@ msgstr ""
msgid "Integrations|Create new issue in Jira"
msgstr ""
+msgid "Integrations|Create new issue in ZenTao"
+msgstr ""
+
msgid "Integrations|Default settings are inherited from the group level."
msgstr ""
@@ -18089,9 +18379,15 @@ msgstr ""
msgid "Integrations|Search Jira issues"
msgstr ""
+msgid "Integrations|Search ZenTao issues"
+msgstr ""
+
msgid "Integrations|Send notifications about project events to Unify Circuit."
msgstr ""
+msgid "Integrations|Send notifications about project events to a Unify Circuit conversation. %{docs_link}"
+msgstr ""
+
msgid "Integrations|Sign in to add namespaces"
msgstr ""
@@ -18131,6 +18427,9 @@ msgstr ""
msgid "Integrations|You've activated every integration 🎉"
msgstr ""
+msgid "Integrations|ZenTao issues display here when you create issues in your project in ZenTao."
+msgstr ""
+
msgid "Interactive mode"
msgstr ""
@@ -18158,9 +18457,6 @@ msgstr ""
msgid "Interval Pattern"
msgstr ""
-msgid "Introducing Value Stream Analytics"
-msgstr ""
-
msgid "Introducing Your DevOps Report"
msgstr ""
@@ -18257,6 +18553,12 @@ msgstr ""
msgid "Investigate vulnerability: %{title}"
msgstr ""
+msgid "Invisible Captcha"
+msgstr ""
+
+msgid "Invisible Captcha helps prevent the creation of spam accounts. It adds a honeypot field and time-sensitive form submission to the account signup form."
+msgstr ""
+
msgid "Invitation"
msgstr ""
@@ -18710,12 +19012,18 @@ msgstr ""
msgid "Issues"
msgstr ""
+msgid "Issues I've created"
+msgstr ""
+
msgid "Issues Rate Limits"
msgstr ""
msgid "Issues and merge requests"
msgstr ""
+msgid "Issues assigned to me"
+msgstr ""
+
msgid "Issues can be bugs, tasks or ideas to be discussed. Also, issues are searchable and filterable."
msgstr ""
@@ -18827,7 +19135,7 @@ msgstr ""
msgid "Iterations|Create cadence"
msgstr ""
-msgid "Iterations|Create your first iteration"
+msgid "Iterations|Create iteration"
msgstr ""
msgid "Iterations|Delete cadence"
@@ -18836,6 +19144,9 @@ msgstr ""
msgid "Iterations|Delete iteration cadence?"
msgstr ""
+msgid "Iterations|Delete iteration?"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -18869,12 +19180,18 @@ msgstr ""
msgid "Iterations|New iteration cadence"
msgstr ""
+msgid "Iterations|No closed iterations."
+msgstr ""
+
msgid "Iterations|No iteration cadences to show."
msgstr ""
msgid "Iterations|No iterations in cadence."
msgstr ""
+msgid "Iterations|No open iterations."
+msgstr ""
+
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
@@ -18905,6 +19222,9 @@ msgstr ""
msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
msgstr ""
+msgid "Iterations|This will remove the iteration from any issues that are assigned to it."
+msgstr ""
+
msgid "Iterations|Title"
msgstr ""
@@ -18920,15 +19240,9 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "I’m familiar with the basics of DevOps."
-msgstr ""
-
msgid "I’m joining my team who’s already on GitLab"
msgstr ""
-msgid "I’m not familiar with the basics of DevOps."
-msgstr ""
-
msgid "Jaeger URL"
msgstr ""
@@ -19193,6 +19507,9 @@ msgstr ""
msgid "Job"
msgstr ""
+msgid "Job %{jobName}"
+msgstr ""
+
msgid "Job Failed #%{build_id}"
msgstr ""
@@ -19783,9 +20100,6 @@ msgstr ""
msgid "Learn more in the"
msgstr ""
-msgid "Learn more in the|pipeline schedules documentation"
-msgstr ""
-
msgid "Learn more."
msgstr ""
@@ -19897,9 +20211,6 @@ msgstr ""
msgid "Leave Admin Mode"
msgstr ""
-msgid "Leave blank for no limit. Once set, existing personal access tokens may be revoked."
-msgstr ""
-
msgid "Leave edit mode? All unsaved changes will be lost."
msgstr ""
@@ -19945,10 +20256,10 @@ msgstr ""
msgid "LicenseCompliance|Acceptable license to be used in the project"
msgstr ""
-msgid "LicenseCompliance|Add a license"
+msgid "LicenseCompliance|Add license and related policy"
msgstr ""
-msgid "LicenseCompliance|Add license and related policy"
+msgid "LicenseCompliance|Add license policy"
msgstr ""
msgid "LicenseCompliance|Allow"
@@ -20038,6 +20349,9 @@ msgstr ""
msgid "LicenseManagement|Uncategorized"
msgstr ""
+msgid "Licensed Enterprise Edition features can be used if the project namespace's plan includes the feature, or if the project is public."
+msgstr ""
+
msgid "Licensed Features"
msgstr ""
@@ -20104,7 +20418,10 @@ msgstr ""
msgid "Limit namespaces and projects that can be indexed"
msgstr ""
-msgid "Limit sign in from multiple ips"
+msgid "Limit project size at a global, group, and project level. %{link_start}Learn more%{link_end}."
+msgstr ""
+
+msgid "Limit sign in from multiple IP addresses"
msgstr ""
msgid "Limit the number of concurrent operations this secondary site can run in the background."
@@ -20116,11 +20433,17 @@ msgstr ""
msgid "Limit the number of issues and epics per minute a user can create through web and API requests."
msgstr ""
+msgid "Limit the size of Sidekiq jobs stored in Redis."
+msgstr ""
+
msgid "Limited to showing %d event at most"
msgid_plural "Limited to showing %d events at most"
msgstr[0] ""
msgstr[1] ""
+msgid "Limiting mode"
+msgstr ""
+
msgid "Line changes"
msgstr ""
@@ -20190,9 +20513,6 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
-msgid "List of users to be excluded from the limit"
-msgstr ""
-
msgid "List options"
msgstr ""
@@ -20232,9 +20552,6 @@ msgstr ""
msgid "Loading functions timed out. Please reload the page to try again."
msgstr ""
-msgid "Loading issues"
-msgstr ""
-
msgid "Loading more"
msgstr ""
@@ -20526,6 +20843,9 @@ msgstr ""
msgid "Marked For Deletion At - %{deletion_time}"
msgstr ""
+msgid "Marked as ready. Merging is now allowed."
+msgstr ""
+
msgid "Marked this %{noun} as a draft."
msgstr ""
@@ -20598,52 +20918,22 @@ msgstr ""
msgid "Max 100,000 events"
msgstr ""
-msgid "Max 20 characters"
-msgstr ""
-
-msgid "Max Group Export Download requests per minute per user"
-msgstr ""
-
-msgid "Max Group Export requests per minute per user"
-msgstr ""
-
-msgid "Max Group Import requests per minute per user"
-msgstr ""
-
-msgid "Max Project Export Download requests per minute per user"
-msgstr ""
-
-msgid "Max Project Export requests per minute per user"
-msgstr ""
-
-msgid "Max Project Import requests per minute per user"
-msgstr ""
-
-msgid "Max authenticated API requests per period per user"
-msgstr ""
-
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
-msgid "Max authenticated web requests per period per user"
-msgstr ""
-
msgid "Max file size is 200 KB."
msgstr ""
-msgid "Max requests per minute per user"
-msgstr ""
-
msgid "Max role"
msgstr ""
msgid "Max session time"
msgstr ""
-msgid "Max unauthenticated requests per period per IP"
+msgid "MaxBuilds"
msgstr ""
-msgid "MaxBuilds"
+msgid "Maximum 20 characters"
msgstr ""
msgid "Maximum Conan package file size in bytes"
@@ -20679,6 +20969,12 @@ msgstr ""
msgid "Maximum attachment size (MB)"
msgstr ""
+msgid "Maximum authenticated API requests per rate limit period per user"
+msgstr ""
+
+msgid "Maximum authenticated web requests per rate limit period per user"
+msgstr ""
+
msgid "Maximum bulk request size (MiB)"
msgstr ""
@@ -20724,6 +21020,15 @@ msgstr ""
msgid "Maximum files in a diff"
msgstr ""
+msgid "Maximum group export download requests per minute"
+msgstr ""
+
+msgid "Maximum group export requests per minute"
+msgstr ""
+
+msgid "Maximum group import requests per minute"
+msgstr ""
+
msgid "Maximum import size"
msgstr ""
@@ -20760,7 +21065,7 @@ msgstr ""
msgid "Maximum number of projects."
msgstr ""
-msgid "Maximum number of unique IPs per user"
+msgid "Maximum number of unique IP addresses per user."
msgstr ""
msgid "Maximum page reached"
@@ -20769,12 +21074,24 @@ msgstr ""
msgid "Maximum page size"
msgstr ""
+msgid "Maximum project export download requests per minute"
+msgstr ""
+
+msgid "Maximum project export requests per minute"
+msgstr ""
+
+msgid "Maximum project import requests per minute"
+msgstr ""
+
msgid "Maximum push size"
msgstr ""
msgid "Maximum push size (MB)"
msgstr ""
+msgid "Maximum requests per minute"
+msgstr ""
+
msgid "Maximum running slices"
msgstr ""
@@ -20802,10 +21119,16 @@ msgstr ""
msgid "Maximum time between updates that a mirror can have when scheduled to synchronize."
msgstr ""
-msgid "Maximum time for web terminal websocket connection (in seconds). 0 for unlimited."
+msgid "Maximum time that users are allowed to skip the setup of two-factor authentication (in hours). Set to 0 (zero) to enforce at next sign in."
+msgstr ""
+
+msgid "Maximum time, in seconds, for a web terminal websocket connection. 0 for unlimited."
msgstr ""
-msgid "Maximum 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."
+msgid "Maximum unauthenticated API requests per rate limit period per IP"
+msgstr ""
+
+msgid "Maximum unauthenticated web requests per rate limit period per IP"
msgstr ""
msgid "May"
@@ -20823,9 +21146,6 @@ msgstr ""
msgid "Medium vulnerabilities present"
msgstr ""
-msgid "Member lock"
-msgstr ""
-
msgid "Member since"
msgstr ""
@@ -20862,6 +21182,9 @@ msgstr ""
msgid "Members of a group may only view projects they have permission to access"
msgstr ""
+msgid "Membership"
+msgstr ""
+
msgid "Members|%{time} by %{user}"
msgstr ""
@@ -20922,9 +21245,6 @@ msgstr ""
msgid "Members|Expiration date updated successfully."
msgstr ""
-msgid "Members|Expired"
-msgstr ""
-
msgid "Members|Filter members"
msgstr ""
@@ -20940,9 +21260,6 @@ msgstr ""
msgid "Members|Membership"
msgstr ""
-msgid "Members|No expiration set"
-msgstr ""
-
msgid "Members|Remove \"%{groupName}\""
msgstr ""
@@ -20964,9 +21281,6 @@ msgstr ""
msgid "Members|Search invited"
msgstr ""
-msgid "Members|in %{time}"
-msgstr ""
-
msgid "Member|Deny access"
msgstr ""
@@ -21042,9 +21356,6 @@ msgstr ""
msgid "Merge request %{mr_link} was reviewed by %{mr_author}"
msgstr ""
-msgid "Merge request (MR) approvals"
-msgstr ""
-
msgid "Merge request analytics"
msgstr ""
@@ -21066,12 +21377,21 @@ msgstr ""
msgid "Merge requests"
msgstr ""
+msgid "Merge requests I've created"
+msgstr ""
+
msgid "Merge requests are a place to propose changes you've made to a project and discuss those changes with others"
msgstr ""
msgid "Merge requests are read-only in a secondary Geo node"
msgstr ""
+msgid "Merge requests assigned to me"
+msgstr ""
+
+msgid "Merge requests that I'm a reviewer"
+msgstr ""
+
msgid "Merge the branch and fix any conflicts that come up"
msgstr ""
@@ -21132,10 +21452,10 @@ msgstr ""
msgid "MergeRequests|An error occurred while saving the draft comment."
msgstr ""
-msgid "MergeRequests|Failed to squash. Should be done manually."
+msgid "MergeRequests|Create issue to resolve thread"
msgstr ""
-msgid "MergeRequests|Resolve this thread in a new issue"
+msgid "MergeRequests|Failed to squash. Should be done manually."
msgstr ""
msgid "MergeRequests|Saving the comment failed"
@@ -21949,6 +22269,9 @@ msgstr ""
msgid "MoveIssue|Cannot move issue to project it originates from!"
msgstr ""
+msgid "MoveIssue|Cannot move issues of '%{issue_type}' type."
+msgstr ""
+
msgid "Moved issue to %{label} column in the board."
msgstr ""
@@ -22074,6 +22397,15 @@ 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. To learn more about reducing storage capacity please visit our docs."
msgstr ""
+msgid "NamespaceUserCap|Pending users must be reviewed and approved by a group owner. Learn more about %{user_caps_link_start}User Caps%{link_end} and %{users_pending_approval_link_start}Users Pending Approval%{link_end}."
+msgstr ""
+
+msgid "NamespaceUserCap|View pending user approvals"
+msgstr ""
+
+msgid "NamespaceUserCap|Your group has reached its billable member limit"
+msgstr ""
+
msgid "Namespaces"
msgstr ""
@@ -22116,9 +22448,6 @@ msgstr ""
msgid "Network"
msgstr ""
-msgid "Network Policy|New rule"
-msgstr ""
-
msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is inbound from a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
msgstr ""
@@ -22140,16 +22469,13 @@ msgstr ""
msgid "NetworkPolicies|%{strongOpen}any%{strongClose} port"
msgstr ""
-msgid "NetworkPolicies|+ Add alert"
-msgstr ""
-
msgid "NetworkPolicies|.yaml"
msgstr ""
msgid "NetworkPolicies|.yaml mode"
msgstr ""
-msgid "NetworkPolicies|Actions"
+msgid "NetworkPolicies|Add alert"
msgstr ""
msgid "NetworkPolicies|Alerts are intended to be selectively used for a limited number of events that are potentially concerning and warrant a manual review. Alerts should not be used as a substitute for a SIEM or a logging tool. High volume alerts are likely to be dropped so as to preserve the stability of GitLab's integration with Kubernetes."
@@ -22185,9 +22511,6 @@ msgstr ""
msgid "NetworkPolicies|Deny all traffic"
msgstr ""
-msgid "NetworkPolicies|Description"
-msgstr ""
-
msgid "NetworkPolicies|Edit policy"
msgstr ""
@@ -22200,9 +22523,6 @@ msgstr ""
msgid "NetworkPolicies|IP/subnet"
msgstr ""
-msgid "NetworkPolicies|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
-msgstr ""
-
msgid "NetworkPolicies|Invalid or empty policy"
msgstr ""
@@ -22212,19 +22532,16 @@ msgstr ""
msgid "NetworkPolicies|Kubernetes error: %{error}"
msgstr ""
-msgid "NetworkPolicies|Name"
-msgstr ""
-
msgid "NetworkPolicies|Network"
msgstr ""
-msgid "NetworkPolicies|Network traffic"
+msgid "NetworkPolicies|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
msgstr ""
-msgid "NetworkPolicies|New policy"
+msgid "NetworkPolicies|Network policy can be created after the environment is loaded successfully."
msgstr ""
-msgid "NetworkPolicies|No policies detected"
+msgid "NetworkPolicies|Network traffic"
msgstr ""
msgid "NetworkPolicies|None selected"
@@ -22233,21 +22550,12 @@ msgstr ""
msgid "NetworkPolicies|Please %{installLinkStart}install%{installLinkEnd} and %{configureLinkStart}configure a Kubernetes Agent for this project%{configureLinkEnd} to enable alerts."
msgstr ""
-msgid "NetworkPolicies|Policies are a specification of how groups of pods are allowed to communicate with each other's network endpoints."
-msgstr ""
-
msgid "NetworkPolicies|Policy %{policyName} was successfully changed"
msgstr ""
msgid "NetworkPolicies|Policy definition"
msgstr ""
-msgid "NetworkPolicies|Policy editor"
-msgstr ""
-
-msgid "NetworkPolicies|Policy preview"
-msgstr ""
-
msgid "NetworkPolicies|Rule"
msgstr ""
@@ -22257,9 +22565,6 @@ msgstr ""
msgid "NetworkPolicies|Rule mode is unavailable for this policy. In some cases, we cannot parse the YAML file back into the rules editor."
msgstr ""
-msgid "NetworkPolicies|Rules"
-msgstr ""
-
msgid "NetworkPolicies|Save changes"
msgstr ""
@@ -22272,9 +22577,6 @@ msgstr ""
msgid "NetworkPolicies|Traffic that does not match any rule will be blocked."
msgstr ""
-msgid "NetworkPolicies|Unable to parse policy"
-msgstr ""
-
msgid "NetworkPolicies|all DNS names"
msgstr ""
@@ -22454,6 +22756,9 @@ msgstr ""
msgid "New issue"
msgstr ""
+msgid "New issue in %{project}"
+msgstr ""
+
msgid "New issue title"
msgstr ""
@@ -22532,7 +22837,7 @@ msgstr ""
msgid "Newest first"
msgstr ""
-msgid "Newly registered users will by default be external"
+msgid "Newly-registered users are external by default"
msgstr ""
msgid "Next"
@@ -22847,8 +23152,10 @@ msgstr ""
msgid "No webhooks found, add one in the form above."
msgstr ""
-msgid "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} to renew your subscription."
-msgstr ""
+msgid "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} day to renew your subscription."
+msgid_plural "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} days to renew your subscription."
+msgstr[0] ""
+msgstr[1] ""
msgid "No. of commits"
msgstr ""
@@ -22865,7 +23172,7 @@ msgstr ""
msgid "Nodes"
msgstr ""
-msgid "Non-admin users can sign in with read-only access and make read-only API requests."
+msgid "Non-admin users are restricted to read-only access, in both GitLab UI and API."
msgstr ""
msgid "None"
@@ -22946,7 +23253,7 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
-msgid "Notes Rate Limits"
+msgid "Notes rate limit"
msgstr ""
msgid "Notes|Are you sure you want to cancel creating this comment?"
@@ -23113,9 +23420,6 @@ msgstr ""
msgid "November"
msgstr ""
-msgid "Novice"
-msgstr ""
-
msgid "Now, personalize your GitLab experience"
msgstr ""
@@ -23284,7 +23588,7 @@ msgstr ""
msgid "OnCallSchedules|For this rotation, on-call will be:"
msgstr ""
-msgid "OnCallSchedules|On-call schedule %{schedule} in Project %{project}"
+msgid "OnCallSchedules|On-call schedule %{obstacle} in Project %{project}"
msgstr ""
msgid "OnCallSchedules|On-call schedules"
@@ -23431,22 +23735,22 @@ msgstr ""
msgid "OnDemandScans|Scanner profile"
msgstr ""
-msgid "OnDemandScans|Select one of the existing profiles"
+msgid "OnDemandScans|Schedule scan"
msgstr ""
-msgid "OnDemandScans|Site profile"
+msgid "OnDemandScans|Select one of the existing profiles"
msgstr ""
-msgid "OnDemandScans|Use existing scanner profile"
+msgid "OnDemandScans|Site profile"
msgstr ""
-msgid "OnDemandScans|Use existing site profile"
+msgid "OnDemandScans|Start time"
msgstr ""
-msgid "OnDemandScans|You can either choose a passive scan or validate the target site in your chosen site profile. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
+msgid "OnDemandScans|Use existing scanner profile"
msgstr ""
-msgid "OnDemandScans|You cannot run an active scan against an unvalidated site."
+msgid "OnDemandScans|Use existing site profile"
msgstr ""
msgid "OnDemandScans|You must create a repository within your project to run an on-demand scan."
@@ -23511,6 +23815,9 @@ msgstr ""
msgid "Only admins can delete project"
msgstr ""
+msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
+msgstr ""
+
msgid "Only include features new to your current subscription tier."
msgstr ""
@@ -23529,6 +23836,12 @@ msgstr ""
msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
+msgid "Only reCAPTCHA v2 is supported:"
+msgstr ""
+
+msgid "Only users from the specified IP address ranges are able to reach this group, including all subgroups, projects, and Git repositories."
+msgstr ""
+
msgid "Only verified users with an email address in any of these domains can be added to the group."
msgstr ""
@@ -23715,9 +24028,6 @@ msgstr ""
msgid "Package Registry"
msgstr ""
-msgid "Package Registry Rate Limits"
-msgstr ""
-
msgid "Package Registry: authenticated API requests"
msgstr ""
@@ -23736,6 +24046,9 @@ msgstr ""
msgid "Package recipe already exists"
msgstr ""
+msgid "Package registry rate limits"
+msgstr ""
+
msgid "Package type"
msgstr ""
@@ -23802,6 +24115,9 @@ msgstr ""
msgid "PackageRegistry|Composer"
msgstr ""
+msgid "PackageRegistry|Composer.json with license: %{license} and version: %{version}"
+msgstr ""
+
msgid "PackageRegistry|Conan"
msgstr ""
@@ -23865,6 +24181,9 @@ msgstr ""
msgid "PackageRegistry|Copy require package include"
msgstr ""
+msgid "PackageRegistry|Copy target SHA"
+msgstr ""
+
msgid "PackageRegistry|Copy yarn command"
msgstr ""
@@ -23931,6 +24250,9 @@ msgstr ""
msgid "PackageRegistry|Install package version"
msgstr ""
+msgid "PackageRegistry|Instance-level"
+msgstr ""
+
msgid "PackageRegistry|Invalid Package: failed metadata extraction"
msgstr ""
@@ -23976,6 +24298,9 @@ msgstr ""
msgid "PackageRegistry|Pip Command"
msgstr ""
+msgid "PackageRegistry|Project-level"
+msgstr ""
+
msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
msgstr ""
@@ -23997,6 +24322,9 @@ msgstr ""
msgid "PackageRegistry|Remove package"
msgstr ""
+msgid "PackageRegistry|Required Python: %{pythonVersion}"
+msgstr ""
+
msgid "PackageRegistry|RubyGems"
msgstr ""
@@ -24039,6 +24367,9 @@ msgstr ""
msgid "PackageRegistry|Source project located at %{link}"
msgstr ""
+msgid "PackageRegistry|Target SHA: %{sha}"
+msgstr ""
+
msgid "PackageRegistry|There are no other versions of this package."
msgstr ""
@@ -24207,6 +24538,18 @@ msgstr ""
msgid "Password was successfully updated. Please sign in again."
msgstr ""
+msgid "PasswordPrompt|Confirm password"
+msgstr ""
+
+msgid "PasswordPrompt|Confirm password to continue"
+msgstr ""
+
+msgid "PasswordPrompt|Password is required"
+msgstr ""
+
+msgid "PasswordPrompt|Please enter your password to confirm"
+msgstr ""
+
msgid "Passwords should be unique and not used for any other sites or services."
msgstr ""
@@ -24234,6 +24577,9 @@ msgstr ""
msgid "Paste project path (i.e. gitlab-org/gitlab)"
msgstr ""
+msgid "Paste this DSN into your Sentry SDK"
+msgstr ""
+
msgid "Paste your public SSH key, which is usually contained in the file '~/.ssh/id_ed25519.pub' or '~/.ssh/id_rsa.pub' and begins with 'ssh-ed25519' or 'ssh-rsa'. Do not paste your private SSH key, as that can compromise your identity."
msgstr ""
@@ -24318,6 +24664,9 @@ msgstr ""
msgid "PerformanceBar|First Contentful Paint"
msgstr ""
+msgid "PerformanceBar|Flamegraph with mode:"
+msgstr ""
+
msgid "PerformanceBar|Frontend resources"
msgstr ""
@@ -24351,6 +24700,15 @@ msgstr ""
msgid "PerformanceBar|Trace"
msgstr ""
+msgid "PerformanceBar|cpu"
+msgstr ""
+
+msgid "PerformanceBar|object"
+msgstr ""
+
+msgid "PerformanceBar|wall"
+msgstr ""
+
msgid "Period in seconds"
msgstr ""
@@ -24579,6 +24937,48 @@ msgstr ""
msgid "PipelineSchedules|Variables"
msgstr ""
+msgid "PipelineSource|API"
+msgstr ""
+
+msgid "PipelineSource|Chat"
+msgstr ""
+
+msgid "PipelineSource|External"
+msgstr ""
+
+msgid "PipelineSource|External Pull Request"
+msgstr ""
+
+msgid "PipelineSource|Merge Request"
+msgstr ""
+
+msgid "PipelineSource|On-Demand DAST Scan"
+msgstr ""
+
+msgid "PipelineSource|On-Demand DAST Validation"
+msgstr ""
+
+msgid "PipelineSource|Parent Pipeline"
+msgstr ""
+
+msgid "PipelineSource|Pipeline"
+msgstr ""
+
+msgid "PipelineSource|Push"
+msgstr ""
+
+msgid "PipelineSource|Schedule"
+msgstr ""
+
+msgid "PipelineSource|Trigger"
+msgstr ""
+
+msgid "PipelineSource|Web"
+msgstr ""
+
+msgid "PipelineSource|Web IDE"
+msgstr ""
+
msgid "PipelineStatusTooltip|Pipeline: %{ciStatus}"
msgstr ""
@@ -24879,46 +25279,7 @@ msgstr ""
msgid "Pipeline|Source"
msgstr ""
-msgid "Pipeline|Source|API"
-msgstr ""
-
-msgid "Pipeline|Source|Chat"
-msgstr ""
-
-msgid "Pipeline|Source|External"
-msgstr ""
-
-msgid "Pipeline|Source|External Pull Request"
-msgstr ""
-
-msgid "Pipeline|Source|Merge Request"
-msgstr ""
-
-msgid "Pipeline|Source|On-Demand DAST Scan"
-msgstr ""
-
-msgid "Pipeline|Source|On-Demand DAST Validation"
-msgstr ""
-
-msgid "Pipeline|Source|Parent Pipeline"
-msgstr ""
-
-msgid "Pipeline|Source|Pipeline"
-msgstr ""
-
-msgid "Pipeline|Source|Push"
-msgstr ""
-
-msgid "Pipeline|Source|Schedule"
-msgstr ""
-
-msgid "Pipeline|Source|Trigger"
-msgstr ""
-
-msgid "Pipeline|Source|Web"
-msgstr ""
-
-msgid "Pipeline|Source|Web IDE"
+msgid "Pipeline|Source|Security Policy"
msgstr ""
msgid "Pipeline|Specify variable values to be used in this run. The values specified in %{linkStart}CI/CD settings%{linkEnd} will be used by default."
@@ -24969,7 +25330,7 @@ msgstr ""
msgid "Pipeline|We are currently unable to fetch pipeline data"
msgstr ""
-msgid "Pipeline|You’re about to stop pipeline %{pipelineId}."
+msgid "Pipeline|You’re about to stop pipeline #%{pipelineId}."
msgstr ""
msgid "Pipeline|for"
@@ -24996,6 +25357,9 @@ msgstr ""
msgid "Plain diff"
msgstr ""
+msgid "Plain-text response to send to clients that hit a rate limit"
+msgstr ""
+
msgid "Plan:"
msgstr ""
@@ -25140,9 +25504,6 @@ msgstr ""
msgid "Please provide attributes to update"
msgstr ""
-msgid "Please provide your username or email address."
-msgstr ""
-
msgid "Please reach out if you have any questions and we'll be happy to assist."
msgstr ""
@@ -25185,9 +25546,6 @@ msgstr ""
msgid "Please set a new password before proceeding."
msgstr ""
-msgid "Please share your feedback about %{featureName} %{linkStart}in this issue%{linkEnd} to help us improve the experience."
-msgstr ""
-
msgid "Please solve the captcha"
msgstr ""
@@ -25365,6 +25723,9 @@ msgstr ""
msgid "Prevent adding new members to project membership within this group"
msgstr ""
+msgid "Prevent auto-stopping"
+msgstr ""
+
msgid "Prevent editing approval rules in projects and merge requests."
msgstr ""
@@ -25377,7 +25738,7 @@ msgstr ""
msgid "Prevent users from changing their profile name"
msgstr ""
-msgid "Prevent users from performing write operations on GitLab while performing maintenance."
+msgid "Prevent users from performing write operations while GitLab maintenance is in progress."
msgstr ""
msgid "Preview"
@@ -25650,6 +26011,9 @@ msgstr ""
msgid "Profiles|Enter your name, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Enter your password to confirm the email change"
+msgstr ""
+
msgid "Profiles|Enter your pronouns to let people know how to refer to you"
msgstr ""
@@ -25884,10 +26248,10 @@ msgstr ""
msgid "Profiles|e.g. My MacBook key"
msgstr ""
-msgid "Profiles|username"
+msgid "Profiles|https://website.com"
msgstr ""
-msgid "Profiles|website.com"
+msgid "Profiles|username"
msgstr ""
msgid "Profiles|your account"
@@ -26130,9 +26494,21 @@ msgstr ""
msgid "ProjectSelect| or group"
msgstr ""
+msgid "ProjectSelect|No matching results"
+msgstr ""
+
msgid "ProjectSelect|Search for project"
msgstr ""
+msgid "ProjectSelect|Search projects"
+msgstr ""
+
+msgid "ProjectSelect|Select a project"
+msgstr ""
+
+msgid "ProjectSelect|There was an error fetching the projects. Please try again."
+msgstr ""
+
msgid "ProjectService|Drone server URL"
msgstr ""
@@ -26220,6 +26596,9 @@ msgstr ""
msgid "ProjectService|Trigger event when a new, unique alert is recorded."
msgstr ""
+msgid "ProjectService|Trigger event when a new, unique vulnerability is recorded. (Note: This feature requires an Ultimate plan.)"
+msgstr ""
+
msgid "ProjectService|Trigger event when a pipeline status changes."
msgstr ""
@@ -26634,9 +27013,15 @@ msgstr ""
msgid "Projects are graded based on the highest severity vulnerability present"
msgstr ""
+msgid "Projects are organized into groups"
+msgstr ""
+
msgid "Projects contributed to"
msgstr ""
+msgid "Projects help you organize your work. They contain your file repository, issues, merge requests, and so much more."
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr ""
@@ -26871,10 +27256,10 @@ msgstr ""
msgid "PrometheusService|Prometheus cluster integration"
msgstr ""
-msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
+msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
msgstr ""
-msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
+msgid "PrometheusService|The ID of the IAP-secured resource."
msgstr ""
msgid "PrometheusService|The Prometheus API base URL."
@@ -27492,6 +27877,9 @@ msgstr ""
msgid "Rate limit"
msgstr ""
+msgid "Rate limits can help reduce request volume (like from crawlers or abusive bots)."
+msgstr ""
+
msgid "Raw blob request rate limit per minute"
msgstr ""
@@ -27504,6 +27892,9 @@ msgstr ""
msgid "Re-authentication required"
msgstr ""
+msgid "Re-import"
+msgstr ""
+
msgid "Re-request review"
msgstr ""
@@ -27525,6 +27916,9 @@ msgstr ""
msgid "Read more about related issues"
msgstr ""
+msgid "Read their documentation."
+msgstr ""
+
msgid "Ready to get started with GitLab? Follow these steps to set up your workspace, plan and commit changes, and deploy your project."
msgstr ""
@@ -27558,6 +27952,9 @@ msgstr ""
msgid "Receive any notifications from GitLab."
msgstr ""
+msgid "Receive notification of abuse reports by email."
+msgstr ""
+
msgid "Receive notifications about your own activity"
msgstr ""
@@ -27701,9 +28098,6 @@ msgstr ""
msgid "Registry setup"
msgstr ""
-msgid "Regulate approvals by authors/committers. Affects all projects."
-msgstr ""
-
msgid "Reindexing Status: %{status} (Slice multiplier: %{multiplier}, Maximum running slices: %{max_slices})"
msgstr ""
@@ -27799,6 +28193,9 @@ msgstr ""
msgid "Release|Something went wrong while saving the release details."
msgstr ""
+msgid "Reload page"
+msgstr ""
+
msgid "Remediations"
msgstr ""
@@ -28081,6 +28478,9 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
+msgid "Repeats"
+msgstr ""
+
msgid "Replace"
msgstr ""
@@ -28443,10 +28843,7 @@ msgstr ""
msgid "Require additional authentication for administrative tasks."
msgstr ""
-msgid "Require all users in this group to setup Two-factor authentication"
-msgstr ""
-
-msgid "Require all users in this group to setup two-factor authentication"
+msgid "Require all users in this group to set up two-factor authentication"
msgstr ""
msgid "Required approvals (%{approvals_given} given)"
@@ -28492,6 +28889,9 @@ msgstr[1] ""
msgid "Requires values to meet regular expression requirements."
msgstr ""
+msgid "Requires you to deploy or set up cloud-hosted Sentry."
+msgstr ""
+
msgid "Requires your primary GitLab email address."
msgstr ""
@@ -28552,9 +28952,6 @@ msgstr ""
msgid "Resolve"
msgstr ""
-msgid "Resolve all threads in new issue"
-msgstr ""
-
msgid "Resolve conflicts"
msgstr ""
@@ -28612,6 +29009,9 @@ msgstr ""
msgid "Response text"
msgstr ""
+msgid "Restart GitLab to apply changes."
+msgstr ""
+
msgid "Restart Terminal"
msgstr ""
@@ -28630,6 +29030,9 @@ msgstr ""
msgid "Restoring the project will prevent the project from being removed on this date and restore people's ability to make changes to it."
msgstr ""
+msgid "Restrict group access by IP address. %{link_start}Learn more%{link_end}."
+msgstr ""
+
msgid "Restrict membership by email domain"
msgstr ""
@@ -28943,6 +29346,9 @@ msgstr ""
msgid "Runners|Runner #%{runner_id}"
msgstr ""
+msgid "Runners|Runner assigned to project."
+msgstr ""
+
msgid "Runners|Runner is offline, last contact was %{runner_contact} ago"
msgstr ""
@@ -28955,6 +29361,9 @@ msgstr ""
msgid "Runners|Runner registration"
msgstr ""
+msgid "Runners|Runner unassigned from project."
+msgstr ""
+
msgid "Runners|Runners"
msgstr ""
@@ -29147,7 +29556,7 @@ msgstr ""
msgid "SastEntryPoints|How do I set up SAST?"
msgstr ""
-msgid "SastEntryPoints|Learn more."
+msgid "SastEntryPoints|Learn more"
msgstr ""
msgid "Satisfied"
@@ -29189,7 +29598,7 @@ msgstr ""
msgid "Save pipeline schedule"
msgstr ""
-msgid "Save space and find images in the container Registry. remove unneeded tags and keep only the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
+msgid "Save storage space by automatically deleting tags from the container registry and keeping the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
msgstr ""
msgid "Saving"
@@ -29363,6 +29772,9 @@ msgstr ""
msgid "Search or filter results…"
msgstr ""
+msgid "Search or jump to..."
+msgstr ""
+
msgid "Search project"
msgstr ""
@@ -29423,16 +29835,16 @@ msgstr ""
msgid "SearchCodeResults|of %{link_to_project}"
msgstr ""
-msgid "SearchResults|Showing %{count} %{scope} for%{term_element}"
+msgid "SearchResults|Showing %{count} %{scope} for %{term_element}"
msgstr ""
-msgid "SearchResults|Showing %{count} %{scope} for%{term_element} in your personal and project snippets"
+msgid "SearchResults|Showing %{count} %{scope} for %{term_element} in your personal and project snippets"
msgstr ""
-msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for%{term_element}"
+msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for %{term_element}"
msgstr ""
-msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for%{term_element} in your personal and project snippets"
+msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for %{term_element} in your personal and project snippets"
msgstr ""
msgid "SearchResults|code result"
@@ -29514,6 +29926,9 @@ msgstr ""
msgid "Secret Detection"
msgstr ""
+msgid "Secret access key"
+msgstr ""
+
msgid "Secret token"
msgstr ""
@@ -29553,9 +29968,6 @@ msgstr ""
msgid "SecurityApprovals|A merge request approval is required when the license compliance report contains a denied license."
msgstr ""
-msgid "SecurityApprovals|Configurable if security scanners are enabled. %{linkStart}Learn more.%{linkEnd}"
-msgstr ""
-
msgid "SecurityApprovals|Coverage-Check"
msgstr ""
@@ -29568,24 +29980,18 @@ msgstr ""
msgid "SecurityApprovals|Learn more about Vulnerability-Check"
msgstr ""
-msgid "SecurityApprovals|License Scanning must be enabled. %{linkStart}Learn more%{linkEnd}."
-msgstr ""
-
msgid "SecurityApprovals|License-Check"
msgstr ""
msgid "SecurityApprovals|Requires approval for Denied licenses. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}More information%{linkEnd}"
+msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "SecurityApprovals|Requires approval for vulnerabilities. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
-msgid "SecurityApprovals|Test coverage must be enabled. %{linkStart}Learn more%{linkEnd}."
-msgstr ""
-
msgid "SecurityApprovals|Vulnerability-Check"
msgstr ""
@@ -29649,6 +30055,12 @@ msgstr ""
msgid "SecurityConfiguration|Immediately begin risk analysis and remediation with application security features. Start with SAST and Secret Detection, available to all plans. Upgrade to Ultimate to get all features, including:"
msgstr ""
+msgid "SecurityConfiguration|Manage corpus"
+msgstr ""
+
+msgid "SecurityConfiguration|Manage corpus files used as mutation sources in coverage fuzzing."
+msgstr ""
+
msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
msgstr ""
@@ -29703,6 +30115,12 @@ msgstr ""
msgid "SecurityOrchestration|Action"
msgstr ""
+msgid "SecurityOrchestration|Actions"
+msgstr ""
+
+msgid "SecurityOrchestration|Add rule"
+msgstr ""
+
msgid "SecurityOrchestration|All policies"
msgstr ""
@@ -29736,9 +30154,6 @@ msgstr ""
msgid "SecurityOrchestration|Network"
msgstr ""
-msgid "SecurityOrchestration|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
-msgstr ""
-
msgid "SecurityOrchestration|New policy"
msgstr ""
@@ -29754,6 +30169,9 @@ msgstr ""
msgid "SecurityOrchestration|Policy editor"
msgstr ""
+msgid "SecurityOrchestration|Policy preview"
+msgstr ""
+
msgid "SecurityOrchestration|Policy status"
msgstr ""
@@ -29763,6 +30181,9 @@ msgstr ""
msgid "SecurityOrchestration|Rule"
msgstr ""
+msgid "SecurityOrchestration|Rules"
+msgstr ""
+
msgid "SecurityOrchestration|Scan Execution"
msgstr ""
@@ -29856,6 +30277,9 @@ msgstr ""
msgid "SecurityReports|Create issue"
msgstr ""
+msgid "SecurityReports|Development vulnerabilities"
+msgstr ""
+
msgid "SecurityReports|Dismiss vulnerability"
msgstr ""
@@ -29871,6 +30295,9 @@ msgstr ""
msgid "SecurityReports|Download results"
msgstr ""
+msgid "SecurityReports|Download scanned URLs"
+msgstr ""
+
msgid "SecurityReports|Download scanned resources"
msgstr ""
@@ -29994,6 +30421,9 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
+msgid "SecurityReports|The Vulnerability Report shows the results of the lastest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "SecurityReports|The security reports below contain one or more vulnerability findings that could not be parsed and were not recorded. Download the artifacts in the job output to investigate. Ensure any security report created conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
msgstr ""
@@ -30135,10 +30565,10 @@ msgstr ""
msgid "Select a repository"
msgstr ""
-msgid "Select a role"
+msgid "Select a repository containing templates for common files."
msgstr ""
-msgid "Select a shared template repository for all projects on this instance."
+msgid "Select a role"
msgstr ""
msgid "Select a template repository"
@@ -30216,6 +30646,9 @@ msgstr ""
msgid "Select project to choose zone"
msgstr ""
+msgid "Select project to create issue"
+msgstr ""
+
msgid "Select projects"
msgstr ""
@@ -30333,6 +30766,9 @@ msgstr ""
msgid "Send emails to help guide new users through the onboarding process."
msgstr ""
+msgid "Send emails to users upon account deactivation."
+msgstr ""
+
msgid "Send message"
msgstr ""
@@ -30351,6 +30787,9 @@ msgstr ""
msgid "Send service data"
msgstr ""
+msgid "Sentry"
+msgstr ""
+
msgid "Sentry API URL"
msgstr ""
@@ -30465,6 +30904,9 @@ msgstr ""
msgid "Service"
msgstr ""
+msgid "Service Accounts keys are required to authorize GitLab to deploy your Google Cloud project."
+msgstr ""
+
msgid "Service Desk"
msgstr ""
@@ -30537,15 +30979,15 @@ msgstr ""
msgid "Set a password on your account to pull or push via %{protocol}."
msgstr ""
-msgid "Set a template repository for projects in this group"
-msgstr ""
-
msgid "Set access permissions for this token."
msgstr ""
msgid "Set an instance-wide domain that will be available to all clusters when installing Knative."
msgstr ""
+msgid "Set any rate limit to %{code_open}0%{code_close} to disable the limit."
+msgstr ""
+
msgid "Set default and restrict visibility levels. Configure import sources and git access protocol."
msgstr ""
@@ -30558,7 +31000,7 @@ msgstr ""
msgid "Set limit to 0 to allow any file size."
msgstr ""
-msgid "Set max session time for web terminal."
+msgid "Set limits for web and API requests."
msgstr ""
msgid "Set milestone"
@@ -30567,15 +31009,18 @@ msgstr ""
msgid "Set new password"
msgstr ""
-msgid "Set notification email for abuse reports."
+msgid "Set parent epic to an epic"
msgstr ""
-msgid "Set parent epic to an epic"
+msgid "Set per-user rate limits for imports and exports of projects and groups."
msgstr ""
msgid "Set projects and maximum size limits, session duration, user options, and check feature availability for namespace plan."
msgstr ""
+msgid "Set rate limits for package registry API requests that supersede the general user and IP rate limits."
+msgstr ""
+
msgid "Set severity"
msgstr ""
@@ -30594,15 +31039,24 @@ msgstr ""
msgid "Set the default branch for this project. All merge requests and commits are made against this branch unless you specify a different one."
msgstr ""
+msgid "Set the default expiration time for job artifacts in all projects. Set to %{code_open}0%{code_close} to never expire artifacts by default. If no unit is written, it defaults to seconds. For example, these are all equivalent: %{code_open}3600%{code_close}, %{code_open}60 minutes%{code_close}, or %{code_open}one hour%{code_close}."
+msgstr ""
+
msgid "Set the due date to %{due_date}."
msgstr ""
msgid "Set the iteration to %{iteration_reference}."
msgstr ""
+msgid "Set the maximum session time for a web terminal."
+msgstr ""
+
msgid "Set the milestone to %{milestone_reference}."
msgstr ""
+msgid "Set the per-user rate limit for notes created by web or API requests."
+msgstr ""
+
msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
msgstr ""
@@ -30804,6 +31258,9 @@ msgstr ""
msgid "Show Pipeline IID"
msgstr ""
+msgid "Show all %{issuable_type}."
+msgstr ""
+
msgid "Show all activity"
msgstr ""
@@ -30855,15 +31312,9 @@ msgstr ""
msgid "Show list"
msgstr ""
-msgid "Show me advanced features"
-msgstr ""
-
msgid "Show me how to add a pipeline"
msgstr ""
-msgid "Show me the basics"
-msgstr ""
-
msgid "Show one file at a time"
msgstr ""
@@ -30904,15 +31355,15 @@ msgstr ""
msgid "Showing %{pageSize} of %{total} %{issuableType}"
msgstr ""
-msgid "Showing %{pageSize} of %{total} issues"
-msgstr ""
-
msgid "Showing all epics"
msgstr ""
msgid "Showing all issues"
msgstr ""
+msgid "Showing data for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
+msgstr ""
+
msgid "Showing data for workflow items created in this date range. Date range cannot exceed %{maxDateRange} days."
msgstr ""
@@ -30952,6 +31403,15 @@ msgstr ""
msgid "Sidebar|Weight"
msgstr ""
+msgid "Sidekiq job compression threshold (bytes)"
+msgstr ""
+
+msgid "Sidekiq job size limit (bytes)"
+msgstr ""
+
+msgid "Sidekiq job size limits"
+msgstr ""
+
msgid "Sign in"
msgstr ""
@@ -31072,6 +31532,9 @@ msgstr ""
msgid "Site profile not found for given parameters"
msgstr ""
+msgid "Sites"
+msgstr ""
+
msgid "Size"
msgstr ""
@@ -31102,19 +31565,22 @@ msgstr ""
msgid "SlackIntegration|Sends notifications about project events to Slack channels."
msgstr ""
-msgid "SlackService|2. Paste the %{strong_open}Token%{strong_close} into the field below"
+msgid "SlackService|1. %{slash_command_link_start}Add a slash command%{slash_command_link_end} in your Slack team using this information:"
msgstr ""
-msgid "SlackService|3. Select the %{strong_open}Active%{strong_close} checkbox, press %{strong_open}Save changes%{strong_close} and start using GitLab inside Slack!"
+msgid "SlackService|2. Paste the token from Slack in the %{strong_open}Token%{strong_close} field below."
msgstr ""
-msgid "SlackService|Fill in the word that works best for your team."
+msgid "SlackService|3. Select the %{strong_open}Active%{strong_close} checkbox, select %{strong_open}Save changes%{strong_close}, and start using slash commands in Slack!"
+msgstr ""
+
+msgid "SlackService|After setup, get a list of available Slack slash commands by entering"
msgstr ""
-msgid "SlackService|See list of available commands in Slack after setting up this service, by entering"
+msgid "SlackService|Fill in the word that works best for your team."
msgstr ""
-msgid "SlackService|This service allows users to perform common operations on this project by entering slash commands in Slack."
+msgid "SlackService|Perform common operations in this project by entering slash commands in Slack."
msgstr ""
msgid "Slice multiplier"
@@ -31180,7 +31646,7 @@ msgstr ""
msgid "Some child epics may be hidden due to applied filters"
msgstr ""
-msgid "Some common domains are not allowed. %{read_more_link}."
+msgid "Some common domains are not allowed. %{learn_more_link}."
msgstr ""
msgid "Some of the designs you tried uploading did not change:"
@@ -31264,9 +31730,6 @@ msgstr ""
msgid "Something went wrong while exporting requirements"
msgstr ""
-msgid "Something went wrong while fetching %{listType} list"
-msgstr ""
-
msgid "Something went wrong while fetching branches"
msgstr ""
@@ -31321,15 +31784,9 @@ msgstr ""
msgid "Something went wrong while merging this merge request. Please try again."
msgstr ""
-msgid "Something went wrong while moving issues."
-msgstr ""
-
msgid "Something went wrong while obtaining the Let's Encrypt certificate."
msgstr ""
-msgid "Something went wrong while performing the action."
-msgstr ""
-
msgid "Something went wrong while promoting the issue to an epic. Please try again."
msgstr ""
@@ -31657,7 +32114,10 @@ msgstr ""
msgid "SourcegraphPreferences|Uses a custom %{linkStart}Sourcegraph instance%{linkEnd}."
msgstr ""
-msgid "Spam Check API Key"
+msgid "Spam Check"
+msgstr ""
+
+msgid "Spam Check API key"
msgstr ""
msgid "Spam Logs"
@@ -31675,7 +32135,7 @@ msgstr ""
msgid "Specified URL cannot be used: \"%{reason}\""
msgstr ""
-msgid "Specify an e-mail address regex pattern to identify default internal users."
+msgid "Specify an email address regex pattern to identify default internal users."
msgstr ""
msgid "Speed up your pipelines with Needs relationships"
@@ -31930,7 +32390,7 @@ msgstr ""
msgid "StatusCheck|An error occurred fetching the status checks."
msgstr ""
-msgid "StatusCheck|Apply this status check to any branch or a specific protected branch."
+msgid "StatusCheck|Apply this status check to all branches or a specific protected branch."
msgstr ""
msgid "StatusCheck|Check for a status response in Merge Requests. Failures do not block merges. %{link_start}Learn more%{link_end}."
@@ -32269,6 +32729,9 @@ msgstr ""
msgid "Subscriptions"
msgstr ""
+msgid "Subscription|Your subscription for %{strong}%{namespace_name}%{strong_close} has expired and you are now on %{pricing_link_start}the GitLab Free tier%{pricing_link_end}. Don't worry, your data is safe. Get in touch with our support team (%{support_email}). They'll gladly help with your subscription renewal."
+msgstr ""
+
msgid "Subtracted"
msgstr ""
@@ -32497,6 +32960,9 @@ msgstr ""
msgid "SuperSonics|Plan"
msgstr ""
+msgid "SuperSonics|Please agree to the Subscription Agreement"
+msgstr ""
+
msgid "SuperSonics|Ready to get started? A GitLab plan is ideal for scaling organizations and for multi team usage."
msgstr ""
@@ -32527,6 +32993,9 @@ msgstr ""
msgid "SuperSonics|The activation code is not valid. Please make sure to copy it exactly from the Customers Portal or confirmation email. Learn more about %{linkStart}activating your subscription%{linkEnd}."
msgstr ""
+msgid "SuperSonics|The activation code should be a 24-character alphanumeric string"
+msgstr ""
+
msgid "SuperSonics|There is a connectivity issue."
msgstr ""
@@ -32569,9 +33038,15 @@ msgstr ""
msgid "SuperSonics|You do not have an active subscription"
msgstr ""
+msgid "SuperSonics|You have successfully added a license that activates on %{date}. Please see the subscription history table below for more details."
+msgstr ""
+
msgid "SuperSonics|You'll be charged for %{trueUpLinkStart}users over license%{trueUpLinkEnd} on a quarterly or annual basis, depending on the terms of your agreement."
msgstr ""
+msgid "SuperSonics|Your future dated license was successfully added"
+msgstr ""
+
msgid "SuperSonics|Your subscription"
msgstr ""
@@ -32824,7 +33299,7 @@ msgstr ""
msgid "Template to append to all Service Desk issues"
msgstr ""
-msgid "TemplateRepository|Select a repository to make its templates available to all projects. %{link_start}What should the repository contain?%{link_end} "
+msgid "TemplateRepository|Create common files more quickly, and standardize their format."
msgstr ""
msgid "Templates"
@@ -33030,7 +33505,7 @@ msgstr ""
msgid "TestCases|Search test cases"
msgstr ""
-msgid "TestCases|Something went wrong while adding test case to Todo."
+msgid "TestCases|Something went wrong while adding test case to a to-do item."
msgstr ""
msgid "TestCases|Something went wrong while creating a test case."
@@ -33042,7 +33517,7 @@ msgstr ""
msgid "TestCases|Something went wrong while fetching test cases list."
msgstr ""
-msgid "TestCases|Something went wrong while marking test case todo as done."
+msgid "TestCases|Something went wrong while marking test case to-do item as done."
msgstr ""
msgid "TestCases|Something went wrong while moving test case."
@@ -33162,7 +33637,7 @@ msgstr ""
msgid "Thanks for your purchase!"
msgstr ""
-msgid "That is ok, I do not want to renew"
+msgid "That's OK, I don't want to renew"
msgstr ""
msgid "That's it, well done!"
@@ -33185,7 +33660,7 @@ msgid_plural "The %{type} contains the following errors:"
msgstr[0] ""
msgstr[1] ""
-msgid "The API key used by GitLab for accessing the Spam Check service endpoint"
+msgid "The API key used by GitLab for accessing the Spam Check service endpoint."
msgstr ""
msgid "The GitLab subscription service (customers.gitlab.com) is currently experiencing an outage. You can monitor the status and get updates at %{linkStart}status.gitlab.com%{linkEnd}."
@@ -33224,9 +33699,6 @@ msgstr ""
msgid "The URL to use for connecting to Elasticsearch. Use a comma-separated list to support clustering (e.g., \"http://localhost:9200, http://localhost:9201\")."
msgstr ""
-msgid "The Vulnerability Report shows the results of the last successful pipeline run on the default branch."
-msgstr ""
-
msgid "The X509 Certificate to use when mutual TLS is required to communicate with the external authorization service. If left blank, the server certificate is still validated when accessing over HTTPS."
msgstr ""
@@ -33284,9 +33756,6 @@ msgstr ""
msgid "The default branch for this project has been changed. Please update your bookmarks."
msgstr ""
-msgid "The default expiration time for job artifacts. 0 for unlimited. The default unit is in seconds, but you can use other units, for example %{code_open}4 mins 2 sec%{code_close}, %{code_open}2h42min%{code_close}."
-msgstr ""
-
msgid "The dependency list details information about the components used within your project."
msgstr ""
@@ -33478,9 +33947,6 @@ msgstr ""
msgid "The merge conflicts for this merge request have already been resolved. Please return to the merge request."
msgstr ""
-msgid "The merge request can now be merged."
-msgstr ""
-
msgid "The metric must be one of %{metrics}."
msgstr ""
@@ -33856,7 +34322,7 @@ msgstr ""
msgid "There was a problem updating the keep latest artifacts setting."
msgstr ""
-msgid "There was an error %{message} todo."
+msgid "There was an error %{message} to-do item."
msgstr ""
msgid "There was an error adding a To Do."
@@ -33895,6 +34361,9 @@ msgstr ""
msgid "There was an error fetching projects"
msgstr ""
+msgid "There was an error fetching search autocomplete suggestions"
+msgstr ""
+
msgid "There was an error fetching stage total counts"
msgstr ""
@@ -34219,6 +34688,9 @@ msgstr ""
msgid "This field is required."
msgstr ""
+msgid "This form is disabled in preview"
+msgstr ""
+
msgid "This group"
msgstr ""
@@ -34240,9 +34712,6 @@ msgstr ""
msgid "This group is linked to a subscription"
msgstr ""
-msgid "This group, including all subgroups, projects and git repositories, will be reachable from only the specified IP address ranges."
-msgstr ""
-
msgid "This group, its subgroups and projects has been scheduled for removal on %{date}."
msgstr ""
@@ -34522,9 +34991,6 @@ msgstr ""
msgid "This user cannot be unlocked manually from GitLab"
msgstr ""
-msgid "This user does not have a pending request"
-msgstr ""
-
msgid "This user has an unconfirmed email address (%{email}). You may force a confirmation."
msgstr ""
@@ -34633,9 +35099,6 @@ msgstr ""
msgid "ThreatMonitoring|Packet Activity"
msgstr ""
-msgid "ThreatMonitoring|Policies"
-msgstr ""
-
msgid "ThreatMonitoring|Requests"
msgstr ""
@@ -34687,6 +35150,12 @@ msgstr ""
msgid "ThreatMonitoring|View documentation"
msgstr ""
+msgid "Threshold in bytes at which to compress Sidekiq job arguments."
+msgstr ""
+
+msgid "Threshold in bytes at which to reject Sidekiq jobs. Set this to 0 to if you don't want to limit Sidekiq jobs."
+msgstr ""
+
msgid "Throughput"
msgstr ""
@@ -34696,6 +35165,9 @@ msgstr ""
msgid "Time"
msgstr ""
+msgid "Time (in hours) that users are allowed to skip forced configuration of two-factor authentication."
+msgstr ""
+
msgid "Time Spent"
msgstr ""
@@ -34762,7 +35234,7 @@ msgstr ""
msgid "TimeTrackingEstimated|Est"
msgstr ""
-msgid "TimeTracking|%{startTag}Spent: %{endTag}%{timeSpentHumanReadable}"
+msgid "TimeTracking|%{spentStart}Spent: %{spentEnd}"
msgstr ""
msgid "TimeTracking|Estimated:"
@@ -34976,6 +35448,9 @@ msgstr ""
msgid "To access this domain create a new DNS record"
msgstr ""
+msgid "To add a custom suffix, set up a Service Desk email address. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "To add an SSH key you need to %{generate_link_start}generate one%{link_end} or use an %{existing_link_start}existing key%{link_end}."
msgstr ""
@@ -34997,13 +35472,16 @@ msgstr ""
msgid "To connect an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To continue using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
+msgstr ""
+
msgid "To continue, you need to select the link in the confirmation email we sent to verify your email address. If you didn't get our email, select %{strongStart}Resend confirmation email.%{strongEnd}"
msgstr ""
msgid "To define internal users, first enable new users set to external"
msgstr ""
-msgid "To enable Registration Features, make sure \"Enable service ping\" is checked."
+msgid "To enable Registration Features, first enable Service Ping."
msgstr ""
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
@@ -35030,7 +35508,7 @@ msgstr ""
msgid "To get started, use the link below to confirm your account."
msgstr ""
-msgid "To help improve GitLab and its user experience, GitLab will periodically collect usage information."
+msgid "To help improve GitLab and its user experience, GitLab periodically collects usage information."
msgstr ""
msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
@@ -35063,7 +35541,7 @@ msgstr ""
msgid "To preserve performance only %{strong_open}%{display_size} of %{real_size}%{strong_close} files are displayed."
msgstr ""
-msgid "To protect this issue's confidentiality, %{forkLink} and set the fork's visibility to private."
+msgid "To protect this issue's confidentiality, %{linkStart}fork this project%{linkEnd} and set the fork's visibility to private."
msgstr ""
msgid "To protect this issue's confidentiality, a private fork of this project was selected."
@@ -35096,12 +35574,15 @@ msgstr ""
msgid "To set up SAML authentication for your group through an identity provider like Azure, Okta, Onelogin, Ping Identity, or your custom SAML 2.0 provider:"
msgstr ""
-msgid "To set up this service:"
+msgid "To set up this integration:"
msgstr ""
msgid "To specify the notification level per project of a group you belong to, you need to visit project page and change notification level there."
msgstr ""
+msgid "To start using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
+msgstr ""
+
msgid "To unsubscribe from this issue, please paste the following link into your browser:"
msgstr ""
@@ -35689,9 +36170,6 @@ msgstr ""
msgid "Unable to fetch branches list, please close the form and try again"
msgstr ""
-msgid "Unable to fetch unscanned projects"
-msgstr ""
-
msgid "Unable to fetch vulnerable projects"
msgstr ""
@@ -35746,6 +36224,15 @@ msgstr ""
msgid "Unable to update this issue at this time."
msgstr ""
+msgid "Unapprove a merge request"
+msgstr ""
+
+msgid "Unapprove the current merge request."
+msgstr ""
+
+msgid "Unapproved the current merge request."
+msgstr ""
+
msgid "Unarchive project"
msgstr ""
@@ -35758,16 +36245,13 @@ msgstr ""
msgid "Unassigned"
msgstr ""
-msgid "Unauthenticated API request rate limit"
-msgstr ""
-
-msgid "Unauthenticated rate limit period in seconds"
+msgid "Unauthenticated API rate limit period in seconds"
msgstr ""
-msgid "Unauthenticated request rate limit"
+msgid "Unauthenticated requests"
msgstr ""
-msgid "Unauthenticated requests"
+msgid "Unauthenticated web rate limit period in seconds"
msgstr ""
msgid "Undo"
@@ -35869,18 +36353,6 @@ msgstr ""
msgid "Unresolved"
msgstr ""
-msgid "UnscannedProjects|15 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|30 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|5 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|60 or more days"
-msgstr ""
-
msgid "Unschedule job"
msgstr ""
@@ -36100,6 +36572,9 @@ msgstr ""
msgid "UsageQuota|%{help_link_start}Shared runners%{help_link_end} are disabled, so there are no limits set on pipeline usage"
msgstr ""
+msgid "UsageQuota|%{linkTitle} help link"
+msgstr ""
+
msgid "UsageQuota|%{percentageLeft} of purchased storage is available"
msgstr ""
@@ -36109,6 +36584,9 @@ msgstr ""
msgid "UsageQuota|Artifacts is a sum of build and pipeline artifacts."
msgstr ""
+msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
+msgstr ""
+
msgid "UsageQuota|Buy additional minutes"
msgstr ""
@@ -36118,9 +36596,21 @@ msgstr ""
msgid "UsageQuota|CI minutes usage by project"
msgstr ""
+msgid "UsageQuota|Code packages and container images."
+msgstr ""
+
msgid "UsageQuota|Current period usage"
msgstr ""
+msgid "UsageQuota|File attachments and smaller design graphics."
+msgstr ""
+
+msgid "UsageQuota|Git repository, managed by the Gitaly service."
+msgstr ""
+
+msgid "UsageQuota|Includes project registry, artifacts, packages, wiki, uploads and other items."
+msgstr ""
+
msgid "UsageQuota|Increase storage temporarily"
msgstr ""
@@ -36139,6 +36629,9 @@ msgstr ""
msgid "UsageQuota|Packages"
msgstr ""
+msgid "UsageQuota|Pipeline artifacts and job artifacts, created with CI/CD."
+msgstr ""
+
msgid "UsageQuota|Pipelines"
msgstr ""
@@ -36157,6 +36650,9 @@ msgstr ""
msgid "UsageQuota|Seats"
msgstr ""
+msgid "UsageQuota|Shared bits of code and text."
+msgstr ""
+
msgid "UsageQuota|Snippets"
msgstr ""
@@ -36166,6 +36662,12 @@ msgstr ""
msgid "UsageQuota|Storage"
msgstr ""
+msgid "UsageQuota|Storage type"
+msgstr ""
+
+msgid "UsageQuota|There is a known issue with Artifact storage where the total could be incorrect for some projects. More details and progress are available in %{warningLinkStart}the epic%{warningLinkEnd}."
+msgstr ""
+
msgid "UsageQuota|This is the total amount of storage used across your projects within this namespace."
msgstr ""
@@ -36205,6 +36707,9 @@ msgstr ""
msgid "UsageQuota|Usage"
msgstr ""
+msgid "UsageQuota|Usage Breakdown"
+msgstr ""
+
msgid "UsageQuota|Usage Quotas"
msgstr ""
@@ -36229,6 +36734,9 @@ msgstr ""
msgid "UsageQuota|Wiki"
msgstr ""
+msgid "UsageQuota|Wiki content."
+msgstr ""
+
msgid "UsageQuota|Wikis"
msgstr ""
@@ -36445,7 +36953,10 @@ msgstr ""
msgid "User Settings"
msgstr ""
-msgid "User and IP Rate Limits"
+msgid "User and IP rate limits"
+msgstr ""
+
+msgid "User does not have a pending request"
msgstr ""
msgid "User identity was successfully created."
@@ -36742,6 +37253,9 @@ msgstr ""
msgid "Users can launch a development environment from a GitLab browser tab when the %{linkStart}Gitpod%{linkEnd} integration is enabled."
msgstr ""
+msgid "Users can reactivate their account by signing in."
+msgstr ""
+
msgid "Users can render diagrams in AsciiDoc, Markdown, reStructuredText, and Textile documents using Kroki."
msgstr ""
@@ -36757,6 +37271,9 @@ msgstr ""
msgid "Users requesting access to"
msgstr ""
+msgid "Users to exclude from the rate limit"
+msgstr ""
+
msgid "Users were successfully added."
msgstr ""
@@ -36778,6 +37295,9 @@ msgstr ""
msgid "UsersSelect|Unassigned"
msgstr ""
+msgid "Uses GitLab as a lightweight alternative to Sentry."
+msgstr ""
+
msgid "Using %{code_start}::%{code_end} denotes a %{link_start}scoped label set%{link_end}"
msgstr ""
@@ -36808,10 +37328,7 @@ msgstr ""
msgid "Value Stream Analytics can help you determine your team’s velocity"
msgstr ""
-msgid "Value Stream Analytics gives an overview of how much time it takes to go from idea to production in your project."
-msgstr ""
-
-msgid "Value may contain a variable reference"
+msgid "Value might contain a variable reference"
msgstr ""
msgid "Value stream"
@@ -36877,10 +37394,10 @@ msgstr ""
msgid "ValueStream|The Default Value Stream cannot be deleted"
msgstr ""
-msgid "Variable"
+msgid "Values that contain the %{codeStart}$%{codeEnd} character can be considered a variable reference and expanded. %{docsLinkStart}Learn more.%{docsLinkEnd}"
msgstr ""
-msgid "Variable references indicated by %{codeStart}$%{codeEnd} may be expanded. If this is not what you want, consider %{docsLinkStart}using a workaround to prevent expansion%{docsLinkEnd}."
+msgid "Variable"
msgstr ""
msgid "Variable will be masked in job logs."
@@ -37285,6 +37802,9 @@ msgstr ""
msgid "Vulnerability|Evidence"
msgstr ""
+msgid "Vulnerability|False positive detected"
+msgstr ""
+
msgid "Vulnerability|File"
msgstr ""
@@ -37327,6 +37847,9 @@ msgstr ""
msgid "Vulnerability|Status"
msgstr ""
+msgid "Vulnerability|The scanner determined this vulnerability to be a false positive. Verify the evaluation before changing its status. %{linkStart}Learn more about false positive detection.%{linkEnd}"
+msgstr ""
+
msgid "Vulnerability|The unmodified response is the original response that had no mutations done to the request"
msgstr ""
@@ -37651,9 +38174,6 @@ msgstr ""
msgid "Welcome to GitLab,%{br_tag}%{name}!"
msgstr ""
-msgid "Welcome to the guided GitLab tour"
-msgstr ""
-
msgid "Welcome, %{name}!"
msgstr ""
@@ -37672,9 +38192,6 @@ msgstr ""
msgid "What are you searching for?"
msgstr ""
-msgid "What describes you best?"
-msgstr ""
-
msgid "What does this command do?"
msgstr ""
@@ -37696,13 +38213,13 @@ msgstr ""
msgid "What is your job title? (optional)"
msgstr ""
-msgid "What will you use this group for?"
+msgid "What templates can I create?"
msgstr ""
-msgid "What's new"
+msgid "What will you use this group for?"
msgstr ""
-msgid "What’s your experience level?"
+msgid "What's new"
msgstr ""
msgid "When a deployment job is successful, skip older deployment jobs that are still pending."
@@ -37714,6 +38231,9 @@ msgstr ""
msgid "When an event in GitLab triggers a webhook, you can use the request details to figure out if something went wrong."
msgstr ""
+msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+msgstr ""
+
msgid "When inactive, an external authentication provider must be used."
msgstr ""
@@ -37737,6 +38257,9 @@ msgstr ""
msgid "When:"
msgstr ""
+msgid "Which API requests are affected?"
+msgstr ""
+
msgid "While it's rare to have no vulnerabilities, it can happen. In any event, we ask that you please double check your settings to make sure you've set up your dashboard correctly."
msgstr ""
@@ -38016,6 +38539,9 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|Work Items"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -38091,6 +38617,9 @@ msgstr ""
msgid "You are already a member of this %{member_source}."
msgstr ""
+msgid "You are already impersonating another user"
+msgstr ""
+
msgid "You are an admin, which means granting access to %{client_name} will allow them to interact with GitLab as an admin as well. Proceed with caution."
msgstr ""
@@ -38193,6 +38722,9 @@ msgstr ""
msgid "You can also use project access tokens with Git to authenticate over HTTP(S). %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "You can always change your URL later"
+msgstr ""
+
msgid "You can always edit this later"
msgstr ""
@@ -38349,10 +38881,10 @@ msgstr ""
msgid "You can’t %{tag_start}edit%{tag_end} files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
-msgid "You could not create a new trigger."
+msgid "You can’t edit files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
-msgid "You didn't renew your subscription for %{strong}%{namespace_name}%{strong_close} so it was downgraded to the free plan."
+msgid "You could not create a new trigger."
msgstr ""
msgid "You do not have any subscriptions yet"
@@ -38520,6 +39052,12 @@ msgstr ""
msgid "You must provide your current password in order to change it."
msgstr ""
+msgid "You must sign in to search for specific projects."
+msgstr ""
+
+msgid "You must sign in to search for specific terms."
+msgstr ""
+
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
@@ -38547,6 +39085,9 @@ msgstr ""
msgid "You need to upload a GitLab project export archive (ending in .gz)."
msgstr ""
+msgid "You need to verify your primary email first before enabling Two-Factor Authentication."
+msgstr ""
+
msgid "You successfully declined the invitation"
msgstr ""
@@ -38655,10 +39196,10 @@ msgstr ""
msgid "Your %{host} account was signed in to from a new location"
msgstr ""
-msgid "Your %{strong}%{plan_name}%{strong_close} subscription for %{strong}%{namespace_name}%{strong_close} will expire on %{strong}%{expires_on}%{strong_close}."
+msgid "Your %{strong}%{plan_name}%{strong_close} subscription expires on %{strong}%{expires_on}%{strong_close}. After that date, you cannot create issues or merge requests, or use many other features."
msgstr ""
-msgid "Your %{strong}%{plan_name}%{strong_close} subscription will expire on %{strong}%{expires_on}%{strong_close}. After that, you will not be able to create issues or merge requests as well as many other features."
+msgid "Your %{strong}%{plan_name}%{strong_close} subscription for %{strong}%{namespace_name}%{strong_close} will expire on %{strong}%{expires_on}%{strong_close}."
msgstr ""
msgid "Your CI/CD configuration syntax is invalid. View Lint tab for more details."
@@ -38682,7 +39223,7 @@ msgstr ""
msgid "Your GPG keys (%{count})"
msgstr ""
-msgid "Your GitLab account has been locked due to an excessive amount of unsuccessful sign in attempts. Your account will automatically unlock in %{duration} or you may click the link below to unlock now."
+msgid "Your GitLab account has been locked due to an excessive number of unsuccessful sign in attempts. You can wait for your account to automatically unlock in %{duration} or you can click the link below to unlock now."
msgstr ""
msgid "Your GitLab account request has been approved!"
@@ -38793,6 +39334,9 @@ msgstr ""
msgid "Your commit email is used for web based operations, such as edits and merges."
msgstr ""
+msgid "Your current password is required to register a two-factor authenticator app."
+msgstr ""
+
msgid "Your dashboard has been copied. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
@@ -38892,6 +39436,9 @@ msgstr ""
msgid "Your project limit is %{limit} projects! Please contact your administrator to increase it"
msgstr ""
+msgid "Your project will be created at:"
+msgstr ""
+
msgid "Your projects"
msgstr ""
@@ -38931,11 +39478,10 @@ msgstr ""
msgid "Your subscription expired!"
msgstr ""
-msgid "Your subscription has been downgraded."
-msgstr ""
-
-msgid "Your subscription will expire in %{remaining_days}."
-msgstr ""
+msgid "Your subscription will expire in %{remaining_days} day."
+msgid_plural "Your subscription will expire in %{remaining_days} days."
+msgstr[0] ""
+msgstr[1] ""
msgid "Your username is %{username}."
msgstr ""
@@ -39142,6 +39688,9 @@ msgstr ""
msgid "cannot merge"
msgstr ""
+msgid "cannot not be used for user namespace"
+msgstr ""
+
msgid "ciReport|%{degradedNum} degraded"
msgstr ""
@@ -39465,6 +40014,9 @@ msgstr ""
msgid "created %{timeAgo}"
msgstr ""
+msgid "created %{timeAgo} by %{author}"
+msgstr ""
+
msgid "created by"
msgstr ""
@@ -39509,9 +40061,6 @@ msgstr ""
msgid "does not have a supported extension. Only %{extension_list} are supported"
msgstr ""
-msgid "domain is not authorized for sign-up."
-msgstr ""
-
msgid "download it"
msgstr ""
@@ -39529,18 +40078,13 @@ msgstr ""
msgid "email '%{email}' is not a verified email."
msgstr ""
-msgid "email does not match the allowed domain of %{email_domains}"
-msgid_plural "email does not match the allowed domains: %{email_domains}"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "enabled"
msgstr ""
msgid "encrypted: needs to be a :required, :optional or :migrating!"
msgstr ""
-msgid "ending with MIME type format is not allowed."
+msgid "ending with a reserved file extension is not allowed."
msgstr ""
msgid "entries cannot be larger than 255 characters"
@@ -39564,6 +40108,9 @@ msgstr ""
msgid "estimateCommand|%{slash_command} overwrites the total estimated time."
msgstr ""
+msgid "example.com"
+msgstr ""
+
msgid "exceeds the limit of %{bytes} bytes"
msgstr ""
@@ -39614,9 +40161,6 @@ msgstr ""
msgid "fork"
msgstr ""
-msgid "fork this project"
-msgstr ""
-
msgid "from"
msgstr ""
@@ -39625,6 +40169,9 @@ msgid_plural "from %d jobs"
msgstr[0] ""
msgstr[1] ""
+msgid "frontmatter"
+msgstr ""
+
msgid "group"
msgstr ""
@@ -39652,6 +40199,9 @@ msgstr ""
msgid "has been completed."
msgstr ""
+msgid "has too deep level of nesting"
+msgstr ""
+
msgid "help"
msgstr ""
@@ -39685,9 +40235,21 @@ msgstr ""
msgid "in"
msgstr ""
+msgid "in Infrastructure :: Kubernetes clusters"
+msgstr ""
+
+msgid "in all GitLab"
+msgstr ""
+
+msgid "in group"
+msgstr ""
+
msgid "in group %{link_to_group}"
msgstr ""
+msgid "in project"
+msgstr ""
+
msgid "in project %{link_to_project}"
msgstr ""
@@ -39729,16 +40291,19 @@ msgstr ""
msgid "is not a valid X509 certificate."
msgstr ""
-msgid "is not allowed since the group is not top-level group."
+msgid "is not allowed for sign-up."
msgstr ""
-msgid "is not allowed. Try again with a different email address, or contact your GitLab admin."
+msgid "is not allowed for this group."
msgstr ""
-msgid "is not allowed. We do not currently support project-level iterations"
+msgid "is not allowed for this project."
+msgstr ""
+
+msgid "is not allowed since the group is not top-level group."
msgstr ""
-msgid "is not from an allowed domain."
+msgid "is not allowed. We do not currently support project-level iterations"
msgstr ""
msgid "is not in the group enforcing Group Managed Account"
@@ -39831,6 +40396,9 @@ msgstr ""
msgid "log in"
msgstr ""
+msgid "managed"
+msgstr ""
+
msgid "manual"
msgstr ""
@@ -39878,6 +40446,9 @@ msgstr ""
msgid "mrWidget| Please restore it or use a different %{missingBranchName} branch"
msgstr ""
+msgid "mrWidget|%{linkStart}Set up now%{linkEnd} to analyze your source code for known security vulnerabilities."
+msgstr ""
+
msgid "mrWidget|%{mergeError}."
msgstr ""
@@ -39958,6 +40529,9 @@ msgid_plural "mrWidget|Closes issues"
msgstr[0] ""
msgstr[1] ""
+msgid "mrWidget|Create issue to resolve all threads"
+msgstr ""
+
msgid "mrWidget|Delete source branch"
msgstr ""
@@ -39967,12 +40541,18 @@ msgstr ""
msgid "mrWidget|Did not close"
msgstr ""
+msgid "mrWidget|Dismiss"
+msgstr ""
+
msgid "mrWidget|Email patches"
msgstr ""
msgid "mrWidget|Failed to load deployment statistics"
msgstr ""
+msgid "mrWidget|Hide %{widget} details"
+msgstr ""
+
msgid "mrWidget|If the %{missingBranchName} branch exists in your local repository, you can merge this merge request manually using the command line"
msgstr ""
@@ -40068,9 +40648,6 @@ msgstr ""
msgid "mrWidget|Request to merge"
msgstr ""
-msgid "mrWidget|Resolve all threads in new issue"
-msgstr ""
-
msgid "mrWidget|Resolve conflicts"
msgstr ""
@@ -40086,6 +40663,9 @@ msgstr ""
msgid "mrWidget|Revoke approval"
msgstr ""
+msgid "mrWidget|SAST and Secret Detection is not enabled."
+msgstr ""
+
msgid "mrWidget|Set by %{merge_author} to be added to the merge train when the pipeline succeeds"
msgstr ""
@@ -40095,6 +40675,9 @@ msgstr ""
msgid "mrWidget|Set by %{merge_author} to start a merge train when the pipeline succeeds"
msgstr ""
+msgid "mrWidget|Show %{widget} details"
+msgstr ""
+
msgid "mrWidget|The changes were merged into"
msgstr ""
@@ -40107,6 +40690,9 @@ msgstr ""
msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure, or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
msgstr ""
+msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure."
+msgstr ""
+
msgid "mrWidget|The source branch has been deleted"
msgstr ""
@@ -40149,6 +40735,9 @@ msgstr ""
msgid "mrWidget|You can merge after removing denied licenses"
msgstr ""
+msgid "mrWidget|You can only merge once this merge request is approved."
+msgstr ""
+
msgid "mrWidget|Your password"
msgstr ""
@@ -40185,6 +40774,9 @@ msgstr ""
msgid "must be less than the limit of %{tag_limit} tags"
msgstr ""
+msgid "must be set for a project namespace"
+msgstr ""
+
msgid "must be unique by status and elapsed time within a policy"
msgstr ""
@@ -40294,6 +40886,9 @@ msgstr ""
msgid "pipeline"
msgstr ""
+msgid "pipeline schedules documentation"
+msgstr ""
+
msgid "pod_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
msgstr ""
@@ -40343,16 +40938,25 @@ msgstr ""
msgid "project name"
msgstr ""
+msgid "project namespace cannot be the parent of another namespace"
+msgstr ""
+
msgid "projects"
msgstr ""
msgid "quick actions"
msgstr ""
-msgid "reCAPTCHA Private Key"
+msgid "reCAPTCHA"
+msgstr ""
+
+msgid "reCAPTCHA helps prevent credential stuffing."
msgstr ""
-msgid "reCAPTCHA Site Key"
+msgid "reCAPTCHA private key"
+msgstr ""
+
+msgid "reCAPTCHA site key"
msgstr ""
msgid "recent activity"
@@ -40579,6 +41183,9 @@ msgstr ""
msgid "user avatar"
msgstr ""
+msgid "user namespace cannot be the parent of another namespace"
+msgstr ""
+
msgid "user preferences"
msgstr ""
@@ -40671,3 +41278,9 @@ msgstr ""
msgid "your settings"
msgstr ""
+msgid "{group}"
+msgstr ""
+
+msgid "{project}"
+msgstr ""
+
diff --git a/locale/ar_SA/gitlab.po b/locale/ar_SA/gitlab.po
index b2a7f469fe0..1007a55f046 100644
--- a/locale/ar_SA/gitlab.po
+++ b/locale/ar_SA/gitlab.po
@@ -14,10 +14,7 @@ msgstr ""
"X-Crowdin-Language: ar\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-09-01 22:32\n"
-
-msgid " %{name}, confirm your email address now! "
-msgstr ""
+"PO-Revision-Date: 2021-10-04 20:20\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -100,6 +97,24 @@ msgstr ""
msgid "#general, #development"
msgstr ""
+msgid "%d Alert"
+msgid_plural "%d Alerts"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+msgstr[5] ""
+
+msgid "%d Alert:"
+msgid_plural "%d Alerts:"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+msgstr[5] ""
+
msgid "%d Approval"
msgid_plural "%d Approvals"
msgstr[0] ""
@@ -727,7 +742,10 @@ msgstr ""
msgid "%{code_open}Protected:%{code_close} Only exposed to protected branches or tags."
msgstr ""
-msgid "%{commit_author_link} authored %{commit_timeago}"
+msgid "%{commit_author_link} authored %{commit_authored_timeago}"
+msgstr ""
+
+msgid "%{commit_author_link} authored %{commit_authored_timeago} and %{commit_committer_avatar} %{commit_committer_link} committed %{commit_committer_timeago}"
msgstr ""
msgid "%{completedCount} completed weight"
@@ -841,6 +859,15 @@ msgstr ""
msgid "%{doc_link_start}Advanced search%{doc_link_end} is enabled."
msgstr ""
+msgid "%{docs_link_start}Learn about visibility levels.%{docs_link_end}"
+msgstr ""
+
+msgid "%{docs_link_start}What is Large File Storage?%{docs_link_end}"
+msgstr ""
+
+msgid "%{docs_link_start}What is two-factor authentication?%{docs_link_end}"
+msgstr ""
+
msgid "%{due_date} (Past due)"
msgstr ""
@@ -913,9 +940,6 @@ msgstr ""
msgid "%{issueType} actions"
msgstr ""
-msgid "%{issuesCount} issues with a limit of %{maxIssueCount}"
-msgstr ""
-
msgid "%{issuesSize} with a limit of %{maxIssueCount}"
msgstr ""
@@ -973,6 +997,12 @@ msgstr ""
msgid "%{label_for_message} unavailable"
msgstr ""
+msgid "%{learn_more_link}."
+msgstr ""
+
+msgid "%{lessThan} 1 hour"
+msgstr ""
+
msgid "%{lets_encrypt_link_start}Let's Encrypt%{lets_encrypt_link_end} is a free, automated, and open certificate authority (CA) that issues digital certificates to enable HTTPS (SSL/TLS) for sites."
msgstr ""
@@ -985,15 +1015,15 @@ msgstr ""
msgid "%{link_start}Learn more%{link_end} about roles."
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
-msgstr ""
-
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
msgstr ""
msgid "%{link_start}Start the title with %{draft_snippet}%{link_end} to prevent a merge request that is a work in progress from being merged before it's ready."
msgstr ""
+msgid "%{link_start}What information does GitLab Inc. collect?%{link_end}"
+msgstr ""
+
msgid "%{listToShow}, and %{awardsListLength} more"
msgstr ""
@@ -1162,7 +1192,7 @@ msgstr[3] ""
msgstr[4] ""
msgstr[5] ""
-msgid "%{service_ping_link_start}Learn more%{service_ping_link_end} about what information is shared with GitLab Inc."
+msgid "%{service_ping_link_start}What information is shared with GitLab Inc.?%{service_ping_link_end}"
msgstr ""
msgid "%{size} %{unit}"
@@ -1198,6 +1228,9 @@ msgstr ""
msgid "%{state} epics"
msgstr ""
+msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
+msgstr ""
+
msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
msgstr ""
@@ -1285,15 +1318,6 @@ msgstr ""
msgid "%{template_project_id} is unknown or invalid"
msgstr ""
-msgid "%{text} %{files}"
-msgid_plural "%{text} %{files} files"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
-msgstr[4] ""
-msgstr[5] ""
-
msgid "%{text} is available"
msgstr ""
@@ -1378,9 +1402,6 @@ msgstr ""
msgid "%{wildcards_link_start}Wildcards%{wildcards_link_end} such as %{code_tag_start}v*%{code_tag_end} or %{code_tag_start}*-release%{code_tag_end} are supported."
msgstr ""
-msgid "&lt; 1 hour"
-msgstr ""
-
msgid "'%{data}' at %{location} does not match format: %{format}"
msgstr ""
@@ -1468,9 +1489,6 @@ msgstr ""
msgid "(we need your current password to confirm your changes)"
msgstr ""
-msgid "* * * * *"
-msgstr ""
-
msgid "+ %{amount} more"
msgstr ""
@@ -1549,10 +1567,10 @@ msgstr ""
msgid "."
msgstr ""
-msgid "0 bytes"
+msgid "/"
msgstr ""
-msgid "0 for unlimited, only effective with remote storage enabled."
+msgid "0 bytes"
msgstr ""
msgid "0t1DgySidms"
@@ -1774,6 +1792,9 @@ msgstr ""
msgid "1000+"
msgstr ""
+msgid "192.168.0.0/24"
+msgstr ""
+
msgid "1st contribution!"
msgstr ""
@@ -1927,9 +1948,6 @@ msgstr ""
msgid "A plain HTML site that uses Netlify for CI/CD instead of GitLab, but still with all the other great GitLab features"
msgstr ""
-msgid "A plain-text response to show to clients that hit the rate limit."
-msgstr ""
-
msgid "A platform value can be web, mob or app."
msgstr ""
@@ -2011,7 +2029,7 @@ msgstr ""
msgid "APIFuzzing|Configure HTTP basic authentication values. Other authentication methods are supported. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
+msgid "APIFuzzing|Customize your project's API fuzzing configuration options and copy the code snippet to your .gitlab-ci.yml file to apply any changes. Note that this tool does not reflect or update your .gitlab-ci.yml file automatically. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
msgstr ""
msgid "APIFuzzing|Enable authentication"
@@ -2074,9 +2092,6 @@ msgstr ""
msgid "APIFuzzing|To prevent a security leak, authentication info must be added as a %{ciVariablesLinkStart}CI variable%{ciVariablesLinkEnd}. As a user with maintainer access rights, you can manage CI variables in the %{ciSettingsLinkStart}Settings%{ciSettingsLinkEnd} area."
msgstr ""
-msgid "APIFuzzing|Use this tool to generate API fuzzing configuration YAML to copy into your .gitlab-ci.yml file. This tool does not reflect or update your .gitlab-ci.yml file automatically."
-msgstr ""
-
msgid "APIFuzzing|Username for basic authentication"
msgstr ""
@@ -2128,9 +2143,6 @@ msgstr ""
msgid "Abuse reports notification email"
msgstr ""
-msgid "Abuse reports will be sent to this address if it is set. Abuse reports are always available in the admin area."
-msgstr ""
-
msgid "Accept invitation"
msgstr ""
@@ -2167,12 +2179,18 @@ msgstr ""
msgid "Access granted"
msgstr ""
+msgid "Access key ID"
+msgstr ""
+
msgid "Access requests"
msgstr ""
msgid "Access to '%{classification_label}' not allowed"
msgstr ""
+msgid "Access tokens expire after 2 hours. A refresh token may be used at any time to generate a new access token. Non-expiring access tokens are deprecated. Clear this setting to enable backward compatibility."
+msgstr ""
+
msgid "AccessDropdown|Deploy Keys"
msgstr ""
@@ -2485,6 +2503,9 @@ msgstr ""
msgid "Add new directory"
msgstr ""
+msgid "Add new service account"
+msgstr ""
+
msgid "Add or remove previously merged commits"
msgstr ""
@@ -2722,6 +2743,9 @@ msgstr ""
msgid "AdminArea|Features"
msgstr ""
+msgid "AdminArea|Get security updates from GitLab and stay up to date"
+msgstr ""
+
msgid "AdminArea|Groups"
msgstr ""
@@ -2761,6 +2785,12 @@ msgstr ""
msgid "AdminArea|Reporter"
msgstr ""
+msgid "AdminArea|Sign up for the GitLab Security Newsletter to get notified for security updates."
+msgstr ""
+
+msgid "AdminArea|Sign up for the GitLab newsletter"
+msgstr ""
+
msgid "AdminArea|Stop all jobs"
msgstr ""
@@ -2830,9 +2860,15 @@ msgstr ""
msgid "AdminSettings|Disable public access to Pages sites"
msgstr ""
+msgid "AdminSettings|Display a banner on merge requests in projects with no pipelines to initiate steps to add a .gitlab-ci.yml file."
+msgstr ""
+
msgid "AdminSettings|Domain verification is an essential security measure for public GitLab sites. Users are required to demonstrate they control a domain before it is enabled. %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "AdminSettings|Enable pipeline suggestion banner"
+msgstr ""
+
msgid "AdminSettings|Enable shared runners for new projects"
msgstr ""
@@ -3304,10 +3340,10 @@ msgstr ""
msgid "Admin|Quarterly reconciliation will occur on %{qrtlyDate}"
msgstr ""
-msgid "Admin|The number of max seats used for your namespace is currently exceeding the number of seats in your subscription. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgid "Admin|The number of max seats in your namespace exceeds the number of seats in your subscription. On %{qrtlyDate}, quarterly reconciliation occurs and you are automatically billed a prorated amount for the overage. No action is needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice. For more information about the timing of the invoicing process, view the documentation."
msgstr ""
-msgid "Admin|The number of maximum users for your instance is currently exceeding the number of users in license. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgid "Admin|The number of max users in your instance exceeds the number of users in your license. On %{qrtlyDate}, quarterly reconciliation occurs and you are automatically billed a prorated amount for the overage. No action is needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice. For more information about the timing of the invoicing process, view the documentation."
msgstr ""
msgid "Admin|View pending user approvals"
@@ -3328,9 +3364,6 @@ msgstr ""
msgid "Advanced export options"
msgstr ""
-msgid "Advanced permissions, Large File Storage and Two-Factor authentication settings."
-msgstr ""
-
msgid "After a successful password update you will be redirected to login screen."
msgstr ""
@@ -3349,17 +3382,14 @@ msgstr ""
msgid "After you've reviewed these contribution guidelines, you'll be all set to"
msgstr ""
+msgid "Akismet"
+msgstr ""
+
msgid "Akismet API Key"
msgstr ""
-msgid "Alert"
-msgid_plural "Alerts"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
-msgstr[4] ""
-msgstr[5] ""
+msgid "Akismet helps prevent the creation of spam issues in public projects."
+msgstr ""
msgid "AlertManagement|Acknowledged"
msgstr ""
@@ -3715,6 +3745,9 @@ msgstr ""
msgid "All (default)"
msgstr ""
+msgid "All GitLab"
+msgstr ""
+
msgid "All Members"
msgstr ""
@@ -3829,6 +3862,9 @@ msgstr ""
msgid "Allow this secondary node to replicate content on Object Storage"
msgstr ""
+msgid "Allow use of licensed EE features"
+msgstr ""
+
msgid "Allow users to dismiss the broadcast message"
msgstr ""
@@ -3904,9 +3940,6 @@ msgstr ""
msgid "Amazon authentication is not %{link_start}correctly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
-msgid "Amount of time (in hours) that users are allowed to skip forced configuration of two-factor authentication"
-msgstr ""
-
msgid "An %{link_start}alert%{link_end} with the same fingerprint is already open. To change the status of this alert, resolve the linked alert."
msgstr ""
@@ -3967,12 +4000,6 @@ msgstr ""
msgid "An error occurred when removing the label."
msgstr ""
-msgid "An error occurred when toggling the notification subscription"
-msgstr ""
-
-msgid "An error occurred when updating the issue weight"
-msgstr ""
-
msgid "An error occurred when updating the title"
msgstr ""
@@ -4021,6 +4048,9 @@ msgstr ""
msgid "An error occurred while enabling Service Desk."
msgstr ""
+msgid "An error occurred while fetching Markdown preview"
+msgstr ""
+
msgid "An error occurred while fetching ancestors"
msgstr ""
@@ -4051,9 +4081,6 @@ msgstr ""
msgid "An error occurred while fetching label colors."
msgstr ""
-msgid "An error occurred while fetching markdown preview"
-msgstr ""
-
msgid "An error occurred while fetching participants"
msgstr ""
@@ -4069,9 +4096,6 @@ msgstr ""
msgid "An error occurred while fetching reference"
msgstr ""
-msgid "An error occurred while fetching sidebar data"
-msgstr ""
-
msgid "An error occurred while fetching tags. Retry the search."
msgstr ""
@@ -4147,6 +4171,9 @@ msgstr ""
msgid "An error occurred while loading merge requests."
msgstr ""
+msgid "An error occurred while loading projects."
+msgstr ""
+
msgid "An error occurred while loading the Needs tab."
msgstr ""
@@ -4381,12 +4408,6 @@ msgstr ""
msgid "Any Milestone"
msgstr ""
-msgid "Any branch"
-msgstr ""
-
-msgid "Any eligible user"
-msgstr ""
-
msgid "Any encrypted tokens"
msgstr ""
@@ -4405,6 +4426,9 @@ msgstr ""
msgid "Any namespace"
msgstr ""
+msgid "App Engine description and apps that are suitable for this deployment target"
+msgstr ""
+
msgid "App ID"
msgstr ""
@@ -4561,6 +4585,15 @@ msgstr ""
msgid "Apply"
msgstr ""
+msgid "Apply %d suggestion"
+msgid_plural "Apply %d suggestions"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+msgstr[5] ""
+
msgid "Apply a label"
msgstr ""
@@ -4570,13 +4603,10 @@ msgstr ""
msgid "Apply suggestion"
msgstr ""
-msgid "Apply suggestions"
-msgstr ""
-
msgid "Apply template"
msgstr ""
-msgid "Apply this approval rule to any branch or a specific protected branch."
+msgid "Apply this approval rule to all branches or a specific protected branch."
msgstr ""
msgid "Applying"
@@ -4735,9 +4765,6 @@ msgstr ""
msgid "ApprovalSettings|Prevent editing approval rules in projects and merge requests."
msgstr ""
-msgid "ApprovalSettings|Prevent editing approval rules in projects and merge requests. "
-msgstr ""
-
msgid "ApprovalSettings|Remove all approvals when commits are added to the source branch."
msgstr ""
@@ -4753,6 +4780,9 @@ msgstr ""
msgid "ApprovalSettings|This setting is configured at the instance level and can only be changed by an administrator."
msgstr ""
+msgid "ApprovalSettings|This setting is configured in %{groupName} and can only be changed by an administrator or group owner."
+msgstr ""
+
msgid "ApprovalStatusTooltip|Adheres to separation of duties"
msgstr ""
@@ -5251,9 +5281,6 @@ msgstr ""
msgid "Authenticated API rate limit period in seconds"
msgstr ""
-msgid "Authenticated API request rate limit"
-msgstr ""
-
msgid "Authenticated API requests"
msgstr ""
@@ -5263,10 +5290,10 @@ msgstr ""
msgid "Authenticated Git LFS request rate limit"
msgstr ""
-msgid "Authenticated web rate limit period in seconds"
+msgid "Authenticated Git LFS requests"
msgstr ""
-msgid "Authenticated web request rate limit"
+msgid "Authenticated web rate limit period in seconds"
msgstr ""
msgid "Authenticated web requests"
@@ -5644,9 +5671,6 @@ msgstr ""
msgid "Below you will find all the groups that are public."
msgstr ""
-msgid "Beta"
-msgstr ""
-
msgid "Bi-weekly code coverage"
msgstr ""
@@ -5890,6 +5914,21 @@ msgstr ""
msgid "Board scope affects which issues are displayed for anyone who visits this board"
msgstr ""
+msgid "BoardNewEpic|Groups"
+msgstr ""
+
+msgid "BoardNewEpic|Loading groups"
+msgstr ""
+
+msgid "BoardNewEpic|No matching results"
+msgstr ""
+
+msgid "BoardNewEpic|Search groups"
+msgstr ""
+
+msgid "BoardNewEpic|Select a group"
+msgstr ""
+
msgid "BoardNewIssue|No matching results"
msgstr ""
@@ -5971,6 +6010,9 @@ msgstr ""
msgid "Boards|An error occurred while creating the list. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching child groups. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching group projects. Please try again."
msgstr ""
@@ -6307,6 +6349,9 @@ msgstr ""
msgid "Bulk update"
msgstr ""
+msgid "BulkImports|Re-import creates a new group. It does not sync with the existing group."
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -6316,6 +6361,9 @@ msgstr ""
msgid "BulkImport|From source group"
msgstr ""
+msgid "BulkImport|Group import history"
+msgstr ""
+
msgid "BulkImport|Import failed: Destination cannot be a subgroup of the source group. Change the destination and try again."
msgstr ""
@@ -6328,9 +6376,18 @@ msgstr ""
msgid "BulkImport|Importing the group failed"
msgstr ""
+msgid "BulkImport|Last imported to %{link}"
+msgstr ""
+
msgid "BulkImport|Name already exists."
msgstr ""
+msgid "BulkImport|New group"
+msgstr ""
+
+msgid "BulkImport|No history is available"
+msgstr ""
+
msgid "BulkImport|No parent"
msgstr ""
@@ -6343,6 +6400,9 @@ msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} matching filter \"%{filter}\" from %{link}"
msgstr ""
+msgid "BulkImport|Source group"
+msgstr ""
+
msgid "BulkImport|To new group"
msgstr ""
@@ -6352,6 +6412,9 @@ msgstr ""
msgid "BulkImport|You have no groups to import"
msgstr ""
+msgid "BulkImport|Your imported groups will appear here."
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -6598,6 +6661,9 @@ msgstr ""
msgid "Can be manually deployed to"
msgstr ""
+msgid "Can be overridden in each project."
+msgstr ""
+
msgid "Can create groups:"
msgstr ""
@@ -6700,6 +6766,9 @@ msgstr ""
msgid "Cancelling Preview"
msgstr ""
+msgid "Cannot assign a confidential epic to a non-confidential issue. Make the issue confidential and try again"
+msgstr ""
+
msgid "Cannot be assigned to other projects."
msgstr ""
@@ -6751,9 +6820,6 @@ msgstr ""
msgid "Cannot refer to a group %{timebox_type} by an internal id!"
msgstr ""
-msgid "Cannot set confidential epic for a non-confidential issue"
-msgstr ""
-
msgid "Cannot show preview. For previews on sketch files, they must have the file format introduced by Sketch version 43 and above."
msgstr ""
@@ -6991,15 +7057,15 @@ msgstr ""
msgid "Check out, review, and merge locally"
msgstr ""
-msgid "Check the %{docs_link_start}documentation%{docs_link_end}."
-msgstr ""
-
msgid "Check the current instance configuration "
msgstr ""
msgid "Check the elasticsearch.log file to debug why the migration was halted and make any changes before retrying the migration. When you fix the cause of the failure, click \"Retry migration\", and the migration will be scheduled to be retried in the background."
msgstr ""
+msgid "Check with your administrator."
+msgstr ""
+
msgid "Check your Docker images for known vulnerabilities."
msgstr ""
@@ -7030,6 +7096,9 @@ msgstr ""
msgid "Checkout"
msgstr ""
+msgid "Checkout|$%{selectedPlanPrice} per 10 GB storage per pack"
+msgstr ""
+
msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 minutes"
msgstr ""
@@ -7054,14 +7123,14 @@ msgstr ""
msgid "Checkout|%{name}'s GitLab subscription"
msgstr ""
-msgid "Checkout|%{selectedPlanText} plan"
+msgid "Checkout|%{name}'s storage subscription"
msgstr ""
-msgid "Checkout|%{startDate} - %{endDate}"
+msgid "Checkout|%{quantity} GB of storage"
msgstr ""
-msgid "Checkout|%{totalCiMinutes} CI minute"
-msgid_plural "Checkout|%{totalCiMinutes} CI minutes"
+msgid "Checkout|%{quantity} storage pack"
+msgid_plural "Checkout|%{quantity} storage packs"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
@@ -7069,6 +7138,12 @@ msgstr[3] ""
msgstr[4] ""
msgstr[5] ""
+msgid "Checkout|%{selectedPlanText} plan"
+msgstr ""
+
+msgid "Checkout|%{startDate} - %{endDate}"
+msgstr ""
+
msgid "Checkout|%{totalCiMinutes} CI minutes"
msgstr ""
@@ -7144,6 +7219,9 @@ msgstr ""
msgid "Checkout|Failed to register credit card. Please try again."
msgstr ""
+msgid "Checkout|GB"
+msgstr ""
+
msgid "Checkout|GitLab group"
msgstr ""
@@ -7180,6 +7258,9 @@ msgstr ""
msgid "Checkout|State"
msgstr ""
+msgid "Checkout|Storage packs"
+msgstr ""
+
msgid "Checkout|Street address"
msgstr ""
@@ -7201,6 +7282,9 @@ msgstr ""
msgid "Checkout|Total minutes: %{quantity}"
msgstr ""
+msgid "Checkout|Total storage: %{quantity} GB"
+msgstr ""
+
msgid "Checkout|Users"
msgstr ""
@@ -7210,16 +7294,25 @@ msgstr ""
msgid "Checkout|Your organization"
msgstr ""
+msgid "Checkout|Your storage subscription has the same term as your main subscription, and the price is prorated accordingly."
+msgstr ""
+
msgid "Checkout|Your subscription will be applied to this group"
msgstr ""
msgid "Checkout|Zip code"
msgstr ""
+msgid "Checkout|a storage subscription"
+msgstr ""
+
msgid "Checkout|company or team"
msgstr ""
-msgid "Checkout|x 1,000 minutes per pack = %{strong}"
+msgid "Checkout|minutes"
+msgstr ""
+
+msgid "Checkout|x %{quantity} %{units} per pack ="
msgstr ""
msgid "Cherry-pick this commit"
@@ -7576,6 +7669,9 @@ msgstr ""
msgid "CloneIssue|Cannot clone issue to target project as it is pending deletion."
msgstr ""
+msgid "CloneIssue|Cannot clone issues of '%{issue_type}' type."
+msgstr ""
+
msgid "Cloned this issue to %{path_to_project}."
msgstr ""
@@ -7630,7 +7726,10 @@ msgstr ""
msgid "Closes this %{quick_action_target}."
msgstr ""
-msgid "Cloud licenses can not be removed."
+msgid "Cloud Functions description and apps that are suitable for this deployment target"
+msgstr ""
+
+msgid "Cloud Run description and apps that are suitable for this deployment target"
msgstr ""
msgid "Cluster"
@@ -7657,6 +7756,12 @@ msgstr ""
msgid "ClusterAgents|Access tokens"
msgstr ""
+msgid "ClusterAgents|Agent might not be connected to GitLab"
+msgstr ""
+
+msgid "ClusterAgents|Agent never connected to GitLab"
+msgstr ""
+
msgid "ClusterAgents|Alternative installation methods"
msgstr ""
@@ -7672,6 +7777,12 @@ msgstr ""
msgid "ClusterAgents|Configuration"
msgstr ""
+msgid "ClusterAgents|Connected"
+msgstr ""
+
+msgid "ClusterAgents|Connection status"
+msgstr ""
+
msgid "ClusterAgents|Copy token"
msgstr ""
@@ -7690,6 +7801,9 @@ msgstr ""
msgid "ClusterAgents|For alternative installation methods %{linkStart}go to the documentation%{linkEnd}."
msgstr ""
+msgid "ClusterAgents|For more troubleshooting information go to"
+msgstr ""
+
msgid "ClusterAgents|Go to the repository"
msgstr ""
@@ -7705,18 +7819,30 @@ msgstr ""
msgid "ClusterAgents|Integrate with the GitLab Agent"
msgstr ""
-msgid "ClusterAgents|Last used"
+msgid "ClusterAgents|Last connected %{timeAgo}."
+msgstr ""
+
+msgid "ClusterAgents|Last contact"
msgstr ""
msgid "ClusterAgents|Learn how to create an agent access token"
msgstr ""
+msgid "ClusterAgents|Make sure you are using a valid token."
+msgstr ""
+
msgid "ClusterAgents|Name"
msgstr ""
msgid "ClusterAgents|Never"
msgstr ""
+msgid "ClusterAgents|Never connected"
+msgstr ""
+
+msgid "ClusterAgents|Not connected"
+msgstr ""
+
msgid "ClusterAgents|Read more about getting started"
msgstr ""
@@ -7738,6 +7864,9 @@ msgstr ""
msgid "ClusterAgents|Select which Agent you want to install"
msgstr ""
+msgid "ClusterAgents|The Agent has not been connected in a long time. There might be a connectivity issue. Last contact was %{timeAgo}."
+msgstr ""
+
msgid "ClusterAgents|The GitLab Agent also requires %{linkStart}enabling the Agent Server%{linkEnd}"
msgstr ""
@@ -7765,9 +7894,6 @@ msgstr ""
msgid "ClusterAgents|You will need to create a token to connect to your agent"
msgstr ""
-msgid "ClusterAgent|This feature is only available for premium plans"
-msgstr ""
-
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -7957,9 +8083,6 @@ msgstr ""
msgid "ClusterIntegration|Create Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Create a provision role on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the account and external ID above. %{startMoreInfoLink}More information%{endLink}"
-msgstr ""
-
msgid "ClusterIntegration|Create cluster on"
msgstr ""
@@ -8392,7 +8515,7 @@ msgstr ""
msgid "ClusterIntegration|Subnets"
msgstr ""
-msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provisioned role, first create one on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the above account and external IDs. %{startMoreInfoLink}More information%{endLink}"
+msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provisioned role, first create one on %{awsLinkStart}Amazon Web Services %{awsLinkEnd} using the above account and external IDs. %{moreInfoStart}More information%{moreInfoEnd}"
msgstr ""
msgid "ClusterIntegration|The Kubernetes certificate used to authenticate to the cluster."
@@ -8626,6 +8749,9 @@ msgstr ""
msgid "Collapse replies"
msgstr ""
+msgid "Collapse settings section"
+msgstr ""
+
msgid "Collapse sidebar"
msgstr ""
@@ -8644,6 +8770,9 @@ msgstr ""
msgid "Comma-separated list of email addresses."
msgstr ""
+msgid "Comma-separated list of users allowed to exceed the rate limit."
+msgstr ""
+
msgid "Comma-separated, e.g. '1.1.1.1, 2.2.2.0/24'"
msgstr ""
@@ -8968,6 +9097,9 @@ msgstr ""
msgid "Configure %{repository_checks_link_start}repository checks%{link_end} and %{housekeeping_link_start}housekeeping%{link_end} on repositories."
msgstr ""
+msgid "Configure CAPTCHAs, IP address limits, and other anti-spam measures."
+msgstr ""
+
msgid "Configure Dependency Scanning in `.gitlab-ci.yml` using the GitLab managed template. You can [add variable overrides](https://docs.gitlab.com/ee/user/application_security/dependency_scanning/#customizing-the-dependency-scanning-settings) to customize Dependency Scanning settings."
msgstr ""
@@ -9004,16 +9136,13 @@ msgstr ""
msgid "Configure a %{codeStart}.gitlab-webide.yml%{codeEnd} file in the %{codeStart}.gitlab%{codeEnd} directory to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
msgstr ""
-msgid "Configure existing installation"
-msgstr ""
-
-msgid "Configure limit for notes created per minute by web and API requests."
+msgid "Configure advanced permissions, Large File Storage, and two-factor authentication settings."
msgstr ""
-msgid "Configure limits for Project/Group Import/Export."
+msgid "Configure approvals by authors and committers on all projects."
msgstr ""
-msgid "Configure limits for web and API requests."
+msgid "Configure existing installation"
msgstr ""
msgid "Configure paths to be protected by Rack Attack."
@@ -9028,10 +9157,13 @@ msgstr ""
msgid "Configure settings for Advanced Search with Elasticsearch."
msgstr ""
+msgid "Configure specific limits for Files API requests that supersede the general user and IP rate limits."
+msgstr ""
+
msgid "Configure specific limits for Git LFS requests that supersede the general user and IP rate limits."
msgstr ""
-msgid "Configure specific limits for Packages API requests that supersede the general user and IP rate limits."
+msgid "Configure specific limits for deprecated API requests that supersede the general user and IP rate limits."
msgstr ""
msgid "Configure the %{link} integration."
@@ -9043,6 +9175,9 @@ msgstr ""
msgid "Configure the way a user creates a new account."
msgstr ""
+msgid "Configure via Merge Request"
+msgstr ""
+
msgid "Configure which lists are shown for anyone who visits this board"
msgstr ""
@@ -9523,6 +9658,9 @@ msgstr ""
msgid "Content parsed with %{link}."
msgstr ""
+msgid "ContentEditor|Table of Contents"
+msgstr ""
+
msgid "ContentEditor|You have to provide a renderMarkdown function or a custom serializer"
msgstr ""
@@ -9709,6 +9847,9 @@ msgstr ""
msgid "Copy link to chart"
msgstr ""
+msgid "Copy prefix"
+msgstr ""
+
msgid "Copy reference"
msgstr ""
@@ -9739,6 +9880,9 @@ msgstr ""
msgid "Copy value"
msgstr ""
+msgid "Corpus Management"
+msgstr ""
+
msgid "Corpus Management|Are you sure you want to delete the corpus?"
msgstr ""
@@ -9967,6 +10111,9 @@ msgstr ""
msgid "Create commit"
msgstr ""
+msgid "Create common files more quickly, and standardize their format."
+msgstr ""
+
msgid "Create confidential merge request"
msgstr ""
@@ -10000,6 +10147,9 @@ msgstr ""
msgid "Create issue"
msgstr ""
+msgid "Create issue to resolve all threads"
+msgstr ""
+
msgid "Create iteration"
msgstr ""
@@ -10054,6 +10204,9 @@ msgstr ""
msgid "Create new..."
msgstr ""
+msgid "Create or import your first project"
+msgstr ""
+
msgid "Create project"
msgstr ""
@@ -10411,7 +10564,7 @@ msgstr ""
msgid "Custom notification events"
msgstr ""
-msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notificationLinkStart} notification emails%{notificationLinkEnd}."
+msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notificationLinkStart}notification emails%{notificationLinkEnd}."
msgstr ""
msgid "Custom project templates"
@@ -10618,10 +10771,10 @@ msgstr[3] ""
msgstr[4] ""
msgstr[5] ""
-msgid "CycleAnalytics|Showing data for group '%{groupName}' and %{selectedProjectCount} projects from %{startDate} to %{endDate}"
+msgid "CycleAnalytics|Showing data for group '%{groupName}' and %{selectedProjectCount} projects from %{createdAfter} to %{createdBefore}"
msgstr ""
-msgid "CycleAnalytics|Showing data for group '%{groupName}' from %{startDate} to %{endDate}"
+msgid "CycleAnalytics|Showing data for group '%{groupName}' from %{createdAfter} to %{createdBefore}"
msgstr ""
msgid "CycleAnalytics|Stages"
@@ -10855,6 +11008,9 @@ msgstr ""
msgid "DastProfiles|Manage profiles"
msgstr ""
+msgid "DastProfiles|Manage site profiles"
+msgstr ""
+
msgid "DastProfiles|Minimum = 0 (no timeout enabled), Maximum = 2880 minutes"
msgstr ""
@@ -10930,6 +11086,9 @@ msgstr ""
msgid "DastProfiles|Scanner name"
msgstr ""
+msgid "DastProfiles|Schedule"
+msgstr ""
+
msgid "DastProfiles|Select branch"
msgstr ""
@@ -10999,7 +11158,7 @@ msgstr ""
msgid "DastProfiles|Website"
msgstr ""
-msgid "DastProfiles|You can either choose a passive scan or validate the target site in your chosen site profile. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
+msgid "DastProfiles|You can either choose a passive scan or validate the target site from the site profile management page. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
msgstr ""
msgid "DastProfiles|You cannot run an active scan against an unvalidated site."
@@ -11176,7 +11335,7 @@ msgstr ""
msgid "Days to merge"
msgstr ""
-msgid "Deactivate dormant users after 90 days of inactivity. Users can return to active status by signing in to their account. While inactive, a user is not counted as an active user in the instance."
+msgid "Deactivate dormant users after 90 days of inactivity"
msgstr ""
msgid "Dear Administrator,"
@@ -11263,10 +11422,10 @@ msgstr ""
msgid "Define a custom pattern with cron syntax"
msgstr ""
-msgid "Define approval settings."
+msgid "Define approval rules."
msgstr ""
-msgid "Define approval settings. %{linkStart}Learn more.%{linkEnd}"
+msgid "Define approval rules. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "Define custom rules for what constitutes spam, independent of Akismet"
@@ -11275,7 +11434,7 @@ msgstr ""
msgid "Define environments in the deploy stage(s) in %{code_open}.gitlab-ci.yml%{code_close} to track deployments here."
msgstr ""
-msgid "Define how approval rules are applied as a merge request moves toward completion."
+msgid "Define how approval rules are applied to merge requests."
msgstr ""
msgid "Definition"
@@ -11290,6 +11449,12 @@ msgstr ""
msgid "DelayedJobs|Are you sure you want to run %{job_name} immediately? This job will run automatically after it's timer finishes."
msgstr ""
+msgid "DelayedJobs|Are you sure you want to run %{job_name} immediately? This job will run automatically after its timer finishes."
+msgstr ""
+
+msgid "DelayedJobs|Run the delayed job now?"
+msgstr ""
+
msgid "DelayedJobs|Start now"
msgstr ""
@@ -11578,6 +11743,12 @@ msgstr ""
msgid "Dependency proxy image prefix"
msgstr ""
+msgid "DependencyProxy|Create a local proxy for storing frequently used upstream images. %{docLinkStart}Learn more%{docLinkEnd} about dependency proxies."
+msgstr ""
+
+msgid "DependencyProxy|Dependency Proxy"
+msgstr ""
+
msgid "DependencyProxy|Toggle Dependency Proxy"
msgstr ""
@@ -11830,6 +12001,9 @@ msgstr ""
msgid "Deployments"
msgstr ""
+msgid "Deployments to Google Kubernetes Engine can be "
+msgstr ""
+
msgid "Deployments|%{deployments} environment impacted."
msgid_plural "Deployments|%{deployments} environments impacted."
msgstr[0] ""
@@ -11863,6 +12037,9 @@ msgstr ""
msgid "Deployment|success"
msgstr ""
+msgid "Deprecated API rate limits"
+msgstr ""
+
msgid "Deprioritize label"
msgstr ""
@@ -12265,6 +12442,24 @@ msgstr ""
msgid "DiffsCompareBaseBranch|(base)"
msgstr ""
+msgid "Diffs|%d addition"
+msgid_plural "Diffs|%d additions"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+msgstr[5] ""
+
+msgid "Diffs|%d deletion"
+msgid_plural "Diffs|%d deletions"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+msgstr[5] ""
+
msgid "Diffs|No file name available"
msgstr ""
@@ -12274,9 +12469,21 @@ msgstr ""
msgid "Diffs|Show all unchanged lines"
msgstr ""
+msgid "Diffs|Showing %{dropdownStart}%{count} changed file%{dropdownEnd}"
+msgid_plural "Diffs|Showing %{dropdownStart}%{count} changed files%{dropdownEnd}"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+msgstr[5] ""
+
msgid "Diffs|Something went wrong while fetching diff lines."
msgstr ""
+msgid "Diffs|with %{additions} and %{deletions}"
+msgstr ""
+
msgid "Direct member"
msgstr ""
@@ -12406,9 +12613,6 @@ msgstr[3] ""
msgstr[4] ""
msgstr[5] ""
-msgid "Dismiss Value Stream Analytics introduction box"
-msgstr ""
-
msgid "Dismiss merge request promotion"
msgstr ""
@@ -12730,6 +12934,9 @@ msgstr ""
msgid "Edit issues"
msgstr ""
+msgid "Edit merge requests"
+msgstr ""
+
msgid "Edit public deploy key"
msgstr ""
@@ -12805,6 +13012,9 @@ msgstr ""
msgid "Elastic|None. Select projects to index."
msgstr ""
+msgid "Eligible users"
+msgstr ""
+
msgid "Email"
msgstr ""
@@ -12934,6 +13144,9 @@ msgstr ""
msgid "Enable"
msgstr ""
+msgid "Enable Amazon EKS integration"
+msgstr ""
+
msgid "Enable Auto DevOps"
msgstr ""
@@ -12967,6 +13180,9 @@ msgstr ""
msgid "Enable SSL verification"
msgstr ""
+msgid "Enable Service Ping"
+msgstr ""
+
msgid "Enable Snowplow tracking"
msgstr ""
@@ -12997,6 +13213,9 @@ msgstr ""
msgid "Enable authenticated Git LFS request rate limit"
msgstr ""
+msgid "Enable authenticated web request rate limit"
+msgstr ""
+
msgid "Enable authentication"
msgstr ""
@@ -13057,7 +13276,7 @@ msgstr ""
msgid "Enable or disable the Pseudonymizer data collection."
msgstr ""
-msgid "Enable or disable version check and service ping."
+msgid "Enable or disable version check and Service Ping."
msgstr ""
msgid "Enable protected paths rate limit"
@@ -13069,18 +13288,12 @@ msgstr ""
msgid "Enable reCAPTCHA"
msgstr ""
-msgid "Enable reCAPTCHA for login"
-msgstr ""
-
-msgid "Enable reCAPTCHA, Invisible Captcha, Akismet and set IP limits. For reCAPTCHA, we currently only support %{recaptcha_v2_link_start}v2%{recaptcha_v2_link_end}"
+msgid "Enable reCAPTCHA for login."
msgstr ""
msgid "Enable repository checks"
msgstr ""
-msgid "Enable service ping"
-msgstr ""
-
msgid "Enable shared runners for all projects and subgroups in this group."
msgstr ""
@@ -13102,7 +13315,10 @@ msgstr ""
msgid "Enable unauthenticated API request rate limit"
msgstr ""
-msgid "Enable unauthenticated request rate limit"
+msgid "Enable unauthenticated web request rate limit"
+msgstr ""
+
+msgid "Enable user deactivation emails"
msgstr ""
msgid "Enable version check"
@@ -13138,9 +13354,6 @@ msgstr ""
msgid "Enabled sources for code import during project creation. OmniAuth must be configured for GitHub"
msgstr ""
-msgid "Enabling this will only make licensed EE features available to projects if the project namespace's plan includes the feature or if the project is public."
-msgstr ""
-
msgid "Encountered an error while rendering: %{err}"
msgstr ""
@@ -13189,9 +13402,6 @@ msgstr ""
msgid "Enter Admin Mode"
msgstr ""
-msgid "Enter IP address range"
-msgstr ""
-
msgid "Enter a number"
msgstr ""
@@ -13204,9 +13414,6 @@ msgstr ""
msgid "Enter at least three characters to search"
msgstr ""
-msgid "Enter domain"
-msgstr ""
-
msgid "Enter in your Bitbucket Server URL and personal access token below"
msgstr ""
@@ -13393,9 +13600,6 @@ msgstr ""
msgid "Environments|Deployment %{status}"
msgstr ""
-msgid "Environments|Dismiss"
-msgstr ""
-
msgid "Environments|Enable review app"
msgstr ""
@@ -13408,9 +13612,6 @@ msgstr ""
msgid "Environments|Environments are places where code gets deployed, such as staging or production."
msgstr ""
-msgid "Environments|Help us improve environments"
-msgstr ""
-
msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
msgstr ""
@@ -13447,6 +13648,9 @@ msgstr ""
msgid "Environments|Note that this action will stop the environment, but it will %{emphasisStart}not%{emphasisEnd} have an effect on any existing deployment due to no “stop environment action†being defined in the %{ciConfigLinkStart}.gitlab-ci.yml%{ciConfigLinkEnd} file."
msgstr ""
+msgid "Environments|Open"
+msgstr ""
+
msgid "Environments|Open live environment"
msgstr ""
@@ -13486,9 +13690,6 @@ msgstr ""
msgid "Environments|Stopping %{environmentName}"
msgstr ""
-msgid "Environments|Take the survey"
-msgstr ""
-
msgid "Environments|There was an error fetching the logs. Please try again."
msgstr ""
@@ -13510,9 +13711,6 @@ msgstr ""
msgid "Environments|You don't have any environments right now"
msgstr ""
-msgid "Environments|Your feedback helps GitLab make environments better for you and other users. Participate and enter a sweepstake to win a USD 30 gift card."
-msgstr ""
-
msgid "Environments|by %{avatar}"
msgstr ""
@@ -13795,7 +13993,7 @@ msgstr ""
msgid "Error parsing CSV file. Please make sure it has"
msgstr ""
-msgid "Error rendering markdown preview"
+msgid "Error rendering Markdown preview"
msgstr ""
msgid "Error saving label update."
@@ -13843,6 +14041,9 @@ msgstr ""
msgid "Error: %{error_message}"
msgstr ""
+msgid "Error: Couldn't load some or all of the changes."
+msgstr ""
+
msgid "Error: No AWS credentials were supplied"
msgstr ""
@@ -13876,6 +14077,9 @@ msgstr ""
msgid "ErrorTracking|Enable error tracking"
msgstr ""
+msgid "ErrorTracking|Error tracking backend"
+msgstr ""
+
msgid "ErrorTracking|If you self-host Sentry, enter your Sentry instance's full URL. If you use Sentry's hosted solution, enter https://sentry.io"
msgstr ""
@@ -13909,6 +14113,12 @@ msgstr ""
msgid "Escalation policies must have at least one rule"
msgstr ""
+msgid "EscalationPolicies|%{clockIcon} IF alert is not %{alertStatus} in %{minutes}"
+msgstr ""
+
+msgid "EscalationPolicies|%{notificationIcon} THEN %{doAction} %{forScheduleOrUser}"
+msgstr ""
+
msgid "EscalationPolicies|+ Add an additional rule"
msgstr ""
@@ -13951,13 +14161,13 @@ msgstr ""
msgid "EscalationPolicies|Escalation policies"
msgstr ""
-msgid "EscalationPolicies|Escalation rules"
+msgid "EscalationPolicies|Escalation policy %{obstacle} in Project %{project}"
msgstr ""
-msgid "EscalationPolicies|Failed to load oncall-schedules"
+msgid "EscalationPolicies|Escalation rules"
msgstr ""
-msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} %{then} THEN %{doAction} %{scheduleOrUser}"
+msgid "EscalationPolicies|Failed to load oncall-schedules"
msgstr ""
msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} minutes"
@@ -14035,18 +14245,36 @@ msgstr ""
msgid "Every %{action} attempt has failed: %{job_error_message}. Please try again."
msgstr ""
+msgid "Every 3 months"
+msgstr ""
+
+msgid "Every 3 months on the %{day} at %{time} %{timezone}"
+msgstr ""
+
+msgid "Every 6 months"
+msgstr ""
+
+msgid "Every 6 months on the %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Every day"
msgstr ""
msgid "Every day (at %{time})"
msgstr ""
+msgid "Every day at %{time} %{timezone}"
+msgstr ""
+
msgid "Every month"
msgstr ""
msgid "Every month (Day %{day} at %{time})"
msgstr ""
+msgid "Every month on the %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Every three months"
msgstr ""
@@ -14065,6 +14293,15 @@ msgstr[5] ""
msgid "Every week (%{weekday} at %{time})"
msgstr ""
+msgid "Every week on %{day} at %{time} %{timezone}"
+msgstr ""
+
+msgid "Every year"
+msgstr ""
+
+msgid "Every year on %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Everyone"
msgstr ""
@@ -14101,9 +14338,6 @@ msgstr ""
msgid "Exactly one of %{attributes} is required"
msgstr ""
-msgid "Example: %{ip_address}. %{read_more_link}."
-msgstr ""
-
msgid "Example: @sub\\.company\\.com$"
msgstr ""
@@ -14170,13 +14404,13 @@ msgstr ""
msgid "Expand pipeline"
msgstr ""
-msgid "Expand sidebar"
+msgid "Expand settings section"
msgstr ""
-msgid "Expected documents: %{expected_documents}"
+msgid "Expand sidebar"
msgstr ""
-msgid "Experienced"
+msgid "Expected documents: %{expected_documents}"
msgstr ""
msgid "ExperimentSubject|Must have exactly one of User, Namespace, or Project."
@@ -14461,9 +14695,6 @@ msgstr ""
msgid "Failed to load related branches"
msgstr ""
-msgid "Failed to load sidebar lock status"
-msgstr ""
-
msgid "Failed to load stacktrace."
msgstr ""
@@ -14896,6 +15127,9 @@ msgstr ""
msgid "Files"
msgstr ""
+msgid "Files API Rate Limits"
+msgstr ""
+
msgid "Files breadcrumb"
msgstr ""
@@ -15895,6 +16129,9 @@ msgstr ""
msgid "GitLab group: %{source_link}"
msgstr ""
+msgid "GitLab informs you if a new version is available."
+msgstr ""
+
msgid "GitLab is a complete DevOps platform, delivered as a single application, fundamentally changing the way Development, Security, and Ops teams collaborate"
msgstr ""
@@ -15910,7 +16147,7 @@ msgstr ""
msgid "GitLab is open source software to collaborate on code."
msgstr ""
-msgid "GitLab is undergoing maintenance and is operating in a read-only mode."
+msgid "GitLab is undergoing maintenance and is operating in read-only mode."
msgstr ""
msgid "GitLab member or Email address"
@@ -15922,9 +16159,6 @@ msgstr ""
msgid "GitLab project export"
msgstr ""
-msgid "GitLab restart is required to apply changes."
-msgstr ""
-
msgid "GitLab single sign-on URL"
msgstr ""
@@ -15940,9 +16174,6 @@ msgstr ""
msgid "GitLab version"
msgstr ""
-msgid "GitLab will inform you if a new version is available."
-msgstr ""
-
msgid "GitLab will run a background job that will produce pseudonymized CSVs of the GitLab database that will be uploaded to your configured object storage directory."
msgstr ""
@@ -16207,9 +16438,21 @@ msgstr ""
msgid "Go to snippets"
msgstr ""
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check 'Allowed domains for sign-ups'."
+msgstr ""
+
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check 'Email restrictions for sign-ups'."
+msgstr ""
+
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check the 'Domain denylist'."
+msgstr ""
+
msgid "Go to the activity feed"
msgstr ""
+msgid "Go to the group’s 'Settings &gt; General' page, and check 'Restrict membership by email domain'."
+msgstr ""
+
msgid "Go to the milestone list"
msgstr ""
@@ -16246,6 +16489,12 @@ msgstr ""
msgid "Goal of the changes and what reviewers should be aware of"
msgstr ""
+msgid "Google Cloud"
+msgstr ""
+
+msgid "Google Cloud offers several deployment targets. Select the one most suitable for your project."
+msgstr ""
+
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
@@ -16330,9 +16579,6 @@ msgstr ""
msgid "Group ID"
msgstr ""
-msgid "Group ID: %{group_id}"
-msgstr ""
-
msgid "Group Owner must have signed in with SAML before enabling Group Managed Accounts"
msgstr ""
@@ -16507,6 +16753,12 @@ msgstr ""
msgid "GroupImport|Unable to process group import file"
msgstr ""
+msgid "GroupPage|Copy group ID"
+msgstr ""
+
+msgid "GroupPage|Group ID: %{group_id}"
+msgstr ""
+
msgid "GroupRoadmap|%{dateWord} – No end date"
msgstr ""
@@ -16561,6 +16813,9 @@ msgstr ""
msgid "GroupRoadmap|Within 3 years"
msgstr ""
+msgid "GroupSAML|\"persistent\" recommended"
+msgstr ""
+
msgid "GroupSAML|%{strongOpen}Warning%{strongClose} - Enabling %{linkStart}SSO enforcement%{linkEnd} can reduce security risks."
msgstr ""
@@ -16693,6 +16948,9 @@ msgstr ""
msgid "GroupSAML|To be able to prohibit outer forks, you first need to enforce dedicate group managed accounts."
msgstr ""
+msgid "GroupSAML|Use SAML group links to manage group membership using SAML."
+msgstr ""
+
msgid "GroupSAML|Valid SAML Response"
msgstr ""
@@ -16705,13 +16963,10 @@ msgstr ""
msgid "GroupSAML|as %{access_level}"
msgstr ""
-msgid "GroupSAML|must match stored NameID of \"%{extern_uid}\" as we use this to identify users. If the NameID changes users will be unable to sign in."
-msgstr ""
-
-msgid "GroupSAML|should be \"persistent\""
+msgid "GroupSAML|must match stored NameID of \"%{extern_uid}\" to identify user and allow sign in"
msgstr ""
-msgid "GroupSAML|should be a random persistent ID, emails are discouraged"
+msgid "GroupSAML|recommend persistent ID instead of email"
msgstr ""
msgid "GroupSelect|No matching results"
@@ -16726,9 +16981,15 @@ msgstr ""
msgid "GroupSettings|Allow project access token creation"
msgstr ""
+msgid "GroupSettings|Applied to all subgroups unless overridden by a group owner. Groups already added to the project lose access."
+msgstr ""
+
msgid "GroupSettings|Auto DevOps pipeline was updated for the group"
msgstr ""
+msgid "GroupSettings|Available only on the top-level group. Applies to all subgroups. Groups already shared with a group outside %{group} are still shared unless removed manually."
+msgstr ""
+
msgid "GroupSettings|Badges"
msgstr ""
@@ -16780,6 +17041,9 @@ msgstr ""
msgid "GroupSettings|New runners registration token has been generated!"
msgstr ""
+msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgstr ""
+
msgid "GroupSettings|Pipeline settings was updated for the group"
msgstr ""
@@ -16792,12 +17056,15 @@ msgstr ""
msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
-msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups."
+msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups"
msgstr ""
msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
msgstr ""
+msgid "GroupSettings|Prevents group members from being notified if the group is mentioned."
+msgstr ""
+
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
msgstr ""
@@ -16834,21 +17101,6 @@ msgstr ""
msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}."
msgstr ""
-msgid "GroupSettings|This setting is only available on the top-level group and it applies to all subgroups. Groups that have already been shared with a group outside %{group} will still be shared, and this access will have to be revoked manually."
-msgstr ""
-
-msgid "GroupSettings|This setting will be applied to all subgroups unless overridden by a group owner. Groups that already have access to the project will continue to have access unless removed manually."
-msgstr ""
-
-msgid "GroupSettings|This setting will override user notification preferences for all members of the group, subgroups, and projects."
-msgstr ""
-
-msgid "GroupSettings|This setting will prevent group members from being notified if the group is mentioned."
-msgstr ""
-
-msgid "GroupSettings|This setting will prevent group members from forking projects outside of the group."
-msgstr ""
-
msgid "GroupSettings|Transfer group"
msgstr ""
@@ -16966,7 +17218,7 @@ msgstr ""
msgid "GroupsNew|No import options available"
msgstr ""
-msgid "GroupsNew|Not all related objects are migrated, as %{docs_link_start}described here%{docs_link_end}. Please %{feedback_link_start}leave feedback%{feedback_link_end} on this feature."
+msgid "GroupsNew|Not all related objects are migrated. %{docs_link_start}More info%{docs_link_end}."
msgstr ""
msgid "GroupsNew|Personal access token"
@@ -17098,15 +17350,27 @@ msgstr ""
msgid "Hello %{name},"
msgstr ""
-msgid "Hello there"
-msgstr ""
-
msgid "Hello, %{name}!"
msgstr ""
msgid "Hello, %{username}!"
msgstr ""
+msgid "HelloMessage|%{handshake_emoji} Contribute to GitLab: %{contribute_link}"
+msgstr ""
+
+msgid "HelloMessage|%{magnifier_emoji} Create a new GitLab issue: %{new_issue_link}"
+msgstr ""
+
+msgid "HelloMessage|%{rocket_emoji} We like your curiosity! Help us improve GitLab by joining the team: %{jobs_page_link}"
+msgstr ""
+
+msgid "HelloMessage|Does this page need fixes or improvements? Open an issue or contribute a merge request to help make GitLab more lovable. At GitLab, everyone can contribute!"
+msgstr ""
+
+msgid "HelloMessage|Welcome to GitLab!"
+msgstr ""
+
msgid "Help"
msgstr ""
@@ -17116,13 +17380,10 @@ msgstr ""
msgid "Helps prevent bots from creating accounts."
msgstr ""
-msgid "Helps prevent bots from creating issues"
+msgid "Helps prevent bots from creating issues."
msgstr ""
-msgid "Helps prevent malicious users hide their activity"
-msgstr ""
-
-msgid "Helps reduce request volume (e.g. from crawlers or abusive bots)"
+msgid "Helps prevent malicious users hide their activity."
msgstr ""
msgid "Helps reduce request volume (for example, from crawlers or abusive bots)"
@@ -17254,6 +17515,12 @@ msgstr ""
msgid "Housekeeping, export, path, transfer, remove, archive."
msgstr ""
+msgid "How do I configure Akismet?"
+msgstr ""
+
+msgid "How do I configure it?"
+msgstr ""
+
msgid "How do I configure runners?"
msgstr ""
@@ -17275,19 +17542,25 @@ msgstr ""
msgid "How do I set up this service?"
msgstr ""
+msgid "How do I use a web terminal?"
+msgstr ""
+
+msgid "How do I use file templates?"
+msgstr ""
+
msgid "How it works"
msgstr ""
msgid "How many days need to pass between marking entity for deletion and actual removing it."
msgstr ""
-msgid "How many seconds an IP will be counted towards the limit"
+msgid "How many seconds an IP counts toward the IP address limit."
msgstr ""
-msgid "I accept the %{terms_link}"
+msgid "How the job limiter handles jobs exceeding the thresholds specified below. The 'track' mode only logs the jobs. The 'compress' mode compresses the jobs and raises an exception if the compressed size exceeds the limit."
msgstr ""
-msgid "I accept the|Terms of Service and Privacy Policy"
+msgid "I accept the %{terms_link}"
msgstr ""
msgid "I forgot my password"
@@ -17371,13 +17644,16 @@ msgstr ""
msgid "IP Address"
msgstr ""
-msgid "IP expiration time"
+msgid "IP address expiration time"
msgstr ""
-msgid "IP subnet restriction only allowed for top-level groups"
+msgid "IP address restrictions"
msgstr ""
-msgid "IPs per user"
+msgid "IP addresses per user"
+msgstr ""
+
+msgid "IP subnet restriction only allowed for top-level groups"
msgstr ""
msgid "Identifier"
@@ -17392,6 +17668,9 @@ msgstr ""
msgid "If any indexed field exceeds this limit it will be truncated to this number of characters and the rest will not be indexed or searchable. This does not apply to repository and wiki indexing. Setting this to 0 means it is unlimited."
msgstr ""
+msgid "If blank, defaults to %{code_open}Retry later%{code_close}."
+msgstr ""
+
msgid "If blank, set allowable lifetime to %{instance_level_policy_in_words}, as defined by the instance admin. Once set, existing tokens for users in this group may be revoked."
msgstr ""
@@ -17443,6 +17722,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 did not initiate these sign-in attempts, please reach out to your administrator or enable two-factor authentication (2FA) on your account."
+msgstr ""
+
msgid "If you did not initiate this change, please contact your administrator immediately."
msgstr ""
@@ -17542,10 +17824,10 @@ msgstr ""
msgid "Import Projects from Gitea"
msgstr ""
-msgid "Import a project"
+msgid "Import an exported GitLab project"
msgstr ""
-msgid "Import an exported GitLab project"
+msgid "Import and export rate limits"
msgstr ""
msgid "Import failed due to a GitHub error: %{original}"
@@ -17557,12 +17839,18 @@ msgstr ""
msgid "Import from Jira"
msgstr ""
+msgid "Import group"
+msgstr ""
+
msgid "Import group from file"
msgstr ""
msgid "Import groups"
msgstr ""
+msgid "Import history"
+msgstr ""
+
msgid "Import in progress"
msgstr ""
@@ -17626,7 +17914,25 @@ msgstr ""
msgid "Import timed out. Import took longer than %{import_jobs_expiration} seconds"
msgstr ""
-msgid "Import/Export Rate Limits"
+msgid "ImportAProjectModal|Import from a project"
+msgstr ""
+
+msgid "ImportAProjectModal|Import members from another project"
+msgstr ""
+
+msgid "ImportAProjectModal|Import project members"
+msgstr ""
+
+msgid "ImportAProjectModal|Only project members (not group members) are imported, and they get the same permissions as the project you import from."
+msgstr ""
+
+msgid "ImportAProjectModal|Successfully imported"
+msgstr ""
+
+msgid "ImportAProjectModal|Unable to import project members"
+msgstr ""
+
+msgid "ImportAProjectModal|You're importing members to the %{strongStart}%{name}%{strongEnd} project."
msgstr ""
msgid "ImportButtons|Connect repositories from"
@@ -17683,7 +17989,7 @@ msgstr[5] ""
msgid "Importing..."
msgstr ""
-msgid "Import|A repository URL usually ends in a .git suffix, although this is not required. Double check to make sure your repository URL is correct."
+msgid "Import|There is not a valid Git repository at this URL. If your HTTP repository is not publicly accessible, verify your credentials."
msgstr ""
msgid "Improve customer support with Service Desk"
@@ -17692,9 +17998,6 @@ msgstr ""
msgid "Improves Git cloning performance."
msgstr ""
-msgid "In %{time_to_now}"
-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 ""
@@ -17980,7 +18283,7 @@ msgstr ""
msgid "InProductMarketing|Start a GitLab Ultimate trial today in less than one minute, no credit card required."
msgstr ""
-msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no CC required"
+msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no credit card required"
msgstr ""
msgid "InProductMarketing|Start a trial"
@@ -18019,7 +18322,7 @@ msgstr ""
msgid "InProductMarketing|Team up in GitLab for greater efficiency"
msgstr ""
-msgid "InProductMarketing|Team work makes the dream work"
+msgid "InProductMarketing|Team work makes the dream work"
msgstr ""
msgid "InProductMarketing|Test, create, deploy"
@@ -18604,6 +18907,9 @@ msgstr ""
msgid "Integrations|Create new issue in Jira"
msgstr ""
+msgid "Integrations|Create new issue in ZenTao"
+msgstr ""
+
msgid "Integrations|Default settings are inherited from the group level."
msgstr ""
@@ -18697,9 +19003,15 @@ msgstr ""
msgid "Integrations|Search Jira issues"
msgstr ""
+msgid "Integrations|Search ZenTao issues"
+msgstr ""
+
msgid "Integrations|Send notifications about project events to Unify Circuit."
msgstr ""
+msgid "Integrations|Send notifications about project events to a Unify Circuit conversation. %{docs_link}"
+msgstr ""
+
msgid "Integrations|Sign in to add namespaces"
msgstr ""
@@ -18739,6 +19051,9 @@ msgstr ""
msgid "Integrations|You've activated every integration 🎉"
msgstr ""
+msgid "Integrations|ZenTao issues display here when you create issues in your project in ZenTao."
+msgstr ""
+
msgid "Interactive mode"
msgstr ""
@@ -18766,9 +19081,6 @@ msgstr ""
msgid "Interval Pattern"
msgstr ""
-msgid "Introducing Value Stream Analytics"
-msgstr ""
-
msgid "Introducing Your DevOps Report"
msgstr ""
@@ -18865,6 +19177,12 @@ msgstr ""
msgid "Investigate vulnerability: %{title}"
msgstr ""
+msgid "Invisible Captcha"
+msgstr ""
+
+msgid "Invisible Captcha helps prevent the creation of spam accounts. It adds a honeypot field and time-sensitive form submission to the account signup form."
+msgstr ""
+
msgid "Invitation"
msgstr ""
@@ -19318,12 +19636,18 @@ msgstr ""
msgid "Issues"
msgstr ""
+msgid "Issues I've created"
+msgstr ""
+
msgid "Issues Rate Limits"
msgstr ""
msgid "Issues and merge requests"
msgstr ""
+msgid "Issues assigned to me"
+msgstr ""
+
msgid "Issues can be bugs, tasks or ideas to be discussed. Also, issues are searchable and filterable."
msgstr ""
@@ -19435,7 +19759,7 @@ msgstr ""
msgid "Iterations|Create cadence"
msgstr ""
-msgid "Iterations|Create your first iteration"
+msgid "Iterations|Create iteration"
msgstr ""
msgid "Iterations|Delete cadence"
@@ -19444,6 +19768,9 @@ msgstr ""
msgid "Iterations|Delete iteration cadence?"
msgstr ""
+msgid "Iterations|Delete iteration?"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -19477,12 +19804,18 @@ msgstr ""
msgid "Iterations|New iteration cadence"
msgstr ""
+msgid "Iterations|No closed iterations."
+msgstr ""
+
msgid "Iterations|No iteration cadences to show."
msgstr ""
msgid "Iterations|No iterations in cadence."
msgstr ""
+msgid "Iterations|No open iterations."
+msgstr ""
+
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
@@ -19513,6 +19846,9 @@ msgstr ""
msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
msgstr ""
+msgid "Iterations|This will remove the iteration from any issues that are assigned to it."
+msgstr ""
+
msgid "Iterations|Title"
msgstr ""
@@ -19528,15 +19864,9 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "I’m familiar with the basics of DevOps."
-msgstr ""
-
msgid "I’m joining my team who’s already on GitLab"
msgstr ""
-msgid "I’m not familiar with the basics of DevOps."
-msgstr ""
-
msgid "Jaeger URL"
msgstr ""
@@ -19801,6 +20131,9 @@ msgstr ""
msgid "Job"
msgstr ""
+msgid "Job %{jobName}"
+msgstr ""
+
msgid "Job Failed #%{build_id}"
msgstr ""
@@ -20395,9 +20728,6 @@ msgstr ""
msgid "Learn more in the"
msgstr ""
-msgid "Learn more in the|pipeline schedules documentation"
-msgstr ""
-
msgid "Learn more."
msgstr ""
@@ -20509,9 +20839,6 @@ msgstr ""
msgid "Leave Admin Mode"
msgstr ""
-msgid "Leave blank for no limit. Once set, existing personal access tokens may be revoked."
-msgstr ""
-
msgid "Leave edit mode? All unsaved changes will be lost."
msgstr ""
@@ -20557,10 +20884,10 @@ msgstr ""
msgid "LicenseCompliance|Acceptable license to be used in the project"
msgstr ""
-msgid "LicenseCompliance|Add a license"
+msgid "LicenseCompliance|Add license and related policy"
msgstr ""
-msgid "LicenseCompliance|Add license and related policy"
+msgid "LicenseCompliance|Add license policy"
msgstr ""
msgid "LicenseCompliance|Allow"
@@ -20674,6 +21001,9 @@ msgstr ""
msgid "LicenseManagement|Uncategorized"
msgstr ""
+msgid "Licensed Enterprise Edition features can be used if the project namespace's plan includes the feature, or if the project is public."
+msgstr ""
+
msgid "Licensed Features"
msgstr ""
@@ -20740,7 +21070,10 @@ msgstr ""
msgid "Limit namespaces and projects that can be indexed"
msgstr ""
-msgid "Limit sign in from multiple ips"
+msgid "Limit project size at a global, group, and project level. %{link_start}Learn more%{link_end}."
+msgstr ""
+
+msgid "Limit sign in from multiple IP addresses"
msgstr ""
msgid "Limit the number of concurrent operations this secondary site can run in the background."
@@ -20752,6 +21085,9 @@ msgstr ""
msgid "Limit the number of issues and epics per minute a user can create through web and API requests."
msgstr ""
+msgid "Limit the size of Sidekiq jobs stored in Redis."
+msgstr ""
+
msgid "Limited to showing %d event at most"
msgid_plural "Limited to showing %d events at most"
msgstr[0] ""
@@ -20761,6 +21097,9 @@ msgstr[3] ""
msgstr[4] ""
msgstr[5] ""
+msgid "Limiting mode"
+msgstr ""
+
msgid "Line changes"
msgstr ""
@@ -20830,9 +21169,6 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
-msgid "List of users to be excluded from the limit"
-msgstr ""
-
msgid "List options"
msgstr ""
@@ -20872,9 +21208,6 @@ msgstr ""
msgid "Loading functions timed out. Please reload the page to try again."
msgstr ""
-msgid "Loading issues"
-msgstr ""
-
msgid "Loading more"
msgstr ""
@@ -21166,6 +21499,9 @@ msgstr ""
msgid "Marked For Deletion At - %{deletion_time}"
msgstr ""
+msgid "Marked as ready. Merging is now allowed."
+msgstr ""
+
msgid "Marked this %{noun} as a draft."
msgstr ""
@@ -21238,52 +21574,22 @@ msgstr ""
msgid "Max 100,000 events"
msgstr ""
-msgid "Max 20 characters"
-msgstr ""
-
-msgid "Max Group Export Download requests per minute per user"
-msgstr ""
-
-msgid "Max Group Export requests per minute per user"
-msgstr ""
-
-msgid "Max Group Import requests per minute per user"
-msgstr ""
-
-msgid "Max Project Export Download requests per minute per user"
-msgstr ""
-
-msgid "Max Project Export requests per minute per user"
-msgstr ""
-
-msgid "Max Project Import requests per minute per user"
-msgstr ""
-
-msgid "Max authenticated API requests per period per user"
-msgstr ""
-
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
-msgid "Max authenticated web requests per period per user"
-msgstr ""
-
msgid "Max file size is 200 KB."
msgstr ""
-msgid "Max requests per minute per user"
-msgstr ""
-
msgid "Max role"
msgstr ""
msgid "Max session time"
msgstr ""
-msgid "Max unauthenticated requests per period per IP"
+msgid "MaxBuilds"
msgstr ""
-msgid "MaxBuilds"
+msgid "Maximum 20 characters"
msgstr ""
msgid "Maximum Conan package file size in bytes"
@@ -21319,6 +21625,12 @@ msgstr ""
msgid "Maximum attachment size (MB)"
msgstr ""
+msgid "Maximum authenticated API requests per rate limit period per user"
+msgstr ""
+
+msgid "Maximum authenticated web requests per rate limit period per user"
+msgstr ""
+
msgid "Maximum bulk request size (MiB)"
msgstr ""
@@ -21364,6 +21676,15 @@ msgstr ""
msgid "Maximum files in a diff"
msgstr ""
+msgid "Maximum group export download requests per minute"
+msgstr ""
+
+msgid "Maximum group export requests per minute"
+msgstr ""
+
+msgid "Maximum group import requests per minute"
+msgstr ""
+
msgid "Maximum import size"
msgstr ""
@@ -21400,7 +21721,7 @@ msgstr ""
msgid "Maximum number of projects."
msgstr ""
-msgid "Maximum number of unique IPs per user"
+msgid "Maximum number of unique IP addresses per user."
msgstr ""
msgid "Maximum page reached"
@@ -21409,12 +21730,24 @@ msgstr ""
msgid "Maximum page size"
msgstr ""
+msgid "Maximum project export download requests per minute"
+msgstr ""
+
+msgid "Maximum project export requests per minute"
+msgstr ""
+
+msgid "Maximum project import requests per minute"
+msgstr ""
+
msgid "Maximum push size"
msgstr ""
msgid "Maximum push size (MB)"
msgstr ""
+msgid "Maximum requests per minute"
+msgstr ""
+
msgid "Maximum running slices"
msgstr ""
@@ -21442,10 +21775,16 @@ msgstr ""
msgid "Maximum time between updates that a mirror can have when scheduled to synchronize."
msgstr ""
-msgid "Maximum time for web terminal websocket connection (in seconds). 0 for unlimited."
+msgid "Maximum time that users are allowed to skip the setup of two-factor authentication (in hours). Set to 0 (zero) to enforce at next sign in."
+msgstr ""
+
+msgid "Maximum time, in seconds, for a web terminal websocket connection. 0 for unlimited."
msgstr ""
-msgid "Maximum 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."
+msgid "Maximum unauthenticated API requests per rate limit period per IP"
+msgstr ""
+
+msgid "Maximum unauthenticated web requests per rate limit period per IP"
msgstr ""
msgid "May"
@@ -21463,9 +21802,6 @@ msgstr ""
msgid "Medium vulnerabilities present"
msgstr ""
-msgid "Member lock"
-msgstr ""
-
msgid "Member since"
msgstr ""
@@ -21502,6 +21838,9 @@ msgstr ""
msgid "Members of a group may only view projects they have permission to access"
msgstr ""
+msgid "Membership"
+msgstr ""
+
msgid "Members|%{time} by %{user}"
msgstr ""
@@ -21562,9 +21901,6 @@ msgstr ""
msgid "Members|Expiration date updated successfully."
msgstr ""
-msgid "Members|Expired"
-msgstr ""
-
msgid "Members|Filter members"
msgstr ""
@@ -21580,9 +21916,6 @@ msgstr ""
msgid "Members|Membership"
msgstr ""
-msgid "Members|No expiration set"
-msgstr ""
-
msgid "Members|Remove \"%{groupName}\""
msgstr ""
@@ -21604,9 +21937,6 @@ msgstr ""
msgid "Members|Search invited"
msgstr ""
-msgid "Members|in %{time}"
-msgstr ""
-
msgid "Member|Deny access"
msgstr ""
@@ -21682,9 +22012,6 @@ msgstr ""
msgid "Merge request %{mr_link} was reviewed by %{mr_author}"
msgstr ""
-msgid "Merge request (MR) approvals"
-msgstr ""
-
msgid "Merge request analytics"
msgstr ""
@@ -21706,12 +22033,21 @@ msgstr ""
msgid "Merge requests"
msgstr ""
+msgid "Merge requests I've created"
+msgstr ""
+
msgid "Merge requests are a place to propose changes you've made to a project and discuss those changes with others"
msgstr ""
msgid "Merge requests are read-only in a secondary Geo node"
msgstr ""
+msgid "Merge requests assigned to me"
+msgstr ""
+
+msgid "Merge requests that I'm a reviewer"
+msgstr ""
+
msgid "Merge the branch and fix any conflicts that come up"
msgstr ""
@@ -21772,10 +22108,10 @@ msgstr ""
msgid "MergeRequests|An error occurred while saving the draft comment."
msgstr ""
-msgid "MergeRequests|Failed to squash. Should be done manually."
+msgid "MergeRequests|Create issue to resolve thread"
msgstr ""
-msgid "MergeRequests|Resolve this thread in a new issue"
+msgid "MergeRequests|Failed to squash. Should be done manually."
msgstr ""
msgid "MergeRequests|Saving the comment failed"
@@ -22597,6 +22933,9 @@ msgstr ""
msgid "MoveIssue|Cannot move issue to project it originates from!"
msgstr ""
+msgid "MoveIssue|Cannot move issues of '%{issue_type}' type."
+msgstr ""
+
msgid "Moved issue to %{label} column in the board."
msgstr ""
@@ -22726,6 +23065,15 @@ 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. To learn more about reducing storage capacity please visit our docs."
msgstr ""
+msgid "NamespaceUserCap|Pending users must be reviewed and approved by a group owner. Learn more about %{user_caps_link_start}User Caps%{link_end} and %{users_pending_approval_link_start}Users Pending Approval%{link_end}."
+msgstr ""
+
+msgid "NamespaceUserCap|View pending user approvals"
+msgstr ""
+
+msgid "NamespaceUserCap|Your group has reached its billable member limit"
+msgstr ""
+
msgid "Namespaces"
msgstr ""
@@ -22768,9 +23116,6 @@ msgstr ""
msgid "Network"
msgstr ""
-msgid "Network Policy|New rule"
-msgstr ""
-
msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is inbound from a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
msgstr ""
@@ -22792,16 +23137,13 @@ msgstr ""
msgid "NetworkPolicies|%{strongOpen}any%{strongClose} port"
msgstr ""
-msgid "NetworkPolicies|+ Add alert"
-msgstr ""
-
msgid "NetworkPolicies|.yaml"
msgstr ""
msgid "NetworkPolicies|.yaml mode"
msgstr ""
-msgid "NetworkPolicies|Actions"
+msgid "NetworkPolicies|Add alert"
msgstr ""
msgid "NetworkPolicies|Alerts are intended to be selectively used for a limited number of events that are potentially concerning and warrant a manual review. Alerts should not be used as a substitute for a SIEM or a logging tool. High volume alerts are likely to be dropped so as to preserve the stability of GitLab's integration with Kubernetes."
@@ -22837,9 +23179,6 @@ msgstr ""
msgid "NetworkPolicies|Deny all traffic"
msgstr ""
-msgid "NetworkPolicies|Description"
-msgstr ""
-
msgid "NetworkPolicies|Edit policy"
msgstr ""
@@ -22852,9 +23191,6 @@ msgstr ""
msgid "NetworkPolicies|IP/subnet"
msgstr ""
-msgid "NetworkPolicies|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
-msgstr ""
-
msgid "NetworkPolicies|Invalid or empty policy"
msgstr ""
@@ -22864,19 +23200,16 @@ msgstr ""
msgid "NetworkPolicies|Kubernetes error: %{error}"
msgstr ""
-msgid "NetworkPolicies|Name"
-msgstr ""
-
msgid "NetworkPolicies|Network"
msgstr ""
-msgid "NetworkPolicies|Network traffic"
+msgid "NetworkPolicies|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
msgstr ""
-msgid "NetworkPolicies|New policy"
+msgid "NetworkPolicies|Network policy can be created after the environment is loaded successfully."
msgstr ""
-msgid "NetworkPolicies|No policies detected"
+msgid "NetworkPolicies|Network traffic"
msgstr ""
msgid "NetworkPolicies|None selected"
@@ -22885,21 +23218,12 @@ msgstr ""
msgid "NetworkPolicies|Please %{installLinkStart}install%{installLinkEnd} and %{configureLinkStart}configure a Kubernetes Agent for this project%{configureLinkEnd} to enable alerts."
msgstr ""
-msgid "NetworkPolicies|Policies are a specification of how groups of pods are allowed to communicate with each other's network endpoints."
-msgstr ""
-
msgid "NetworkPolicies|Policy %{policyName} was successfully changed"
msgstr ""
msgid "NetworkPolicies|Policy definition"
msgstr ""
-msgid "NetworkPolicies|Policy editor"
-msgstr ""
-
-msgid "NetworkPolicies|Policy preview"
-msgstr ""
-
msgid "NetworkPolicies|Rule"
msgstr ""
@@ -22909,9 +23233,6 @@ msgstr ""
msgid "NetworkPolicies|Rule mode is unavailable for this policy. In some cases, we cannot parse the YAML file back into the rules editor."
msgstr ""
-msgid "NetworkPolicies|Rules"
-msgstr ""
-
msgid "NetworkPolicies|Save changes"
msgstr ""
@@ -22924,9 +23245,6 @@ msgstr ""
msgid "NetworkPolicies|Traffic that does not match any rule will be blocked."
msgstr ""
-msgid "NetworkPolicies|Unable to parse policy"
-msgstr ""
-
msgid "NetworkPolicies|all DNS names"
msgstr ""
@@ -23110,6 +23428,9 @@ msgstr ""
msgid "New issue"
msgstr ""
+msgid "New issue in %{project}"
+msgstr ""
+
msgid "New issue title"
msgstr ""
@@ -23188,7 +23509,7 @@ msgstr ""
msgid "Newest first"
msgstr ""
-msgid "Newly registered users will by default be external"
+msgid "Newly-registered users are external by default"
msgstr ""
msgid "Next"
@@ -23503,8 +23824,14 @@ msgstr ""
msgid "No webhooks found, add one in the form above."
msgstr ""
-msgid "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} to renew your subscription."
-msgstr ""
+msgid "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} day to renew your subscription."
+msgid_plural "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} days to renew your subscription."
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+msgstr[5] ""
msgid "No. of commits"
msgstr ""
@@ -23521,7 +23848,7 @@ msgstr ""
msgid "Nodes"
msgstr ""
-msgid "Non-admin users can sign in with read-only access and make read-only API requests."
+msgid "Non-admin users are restricted to read-only access, in both GitLab UI and API."
msgstr ""
msgid "None"
@@ -23602,7 +23929,7 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
-msgid "Notes Rate Limits"
+msgid "Notes rate limit"
msgstr ""
msgid "Notes|Are you sure you want to cancel creating this comment?"
@@ -23785,9 +24112,6 @@ msgstr ""
msgid "November"
msgstr ""
-msgid "Novice"
-msgstr ""
-
msgid "Now, personalize your GitLab experience"
msgstr ""
@@ -23956,7 +24280,7 @@ msgstr ""
msgid "OnCallSchedules|For this rotation, on-call will be:"
msgstr ""
-msgid "OnCallSchedules|On-call schedule %{schedule} in Project %{project}"
+msgid "OnCallSchedules|On-call schedule %{obstacle} in Project %{project}"
msgstr ""
msgid "OnCallSchedules|On-call schedules"
@@ -24103,22 +24427,22 @@ msgstr ""
msgid "OnDemandScans|Scanner profile"
msgstr ""
+msgid "OnDemandScans|Schedule scan"
+msgstr ""
+
msgid "OnDemandScans|Select one of the existing profiles"
msgstr ""
msgid "OnDemandScans|Site profile"
msgstr ""
-msgid "OnDemandScans|Use existing scanner profile"
+msgid "OnDemandScans|Start time"
msgstr ""
-msgid "OnDemandScans|Use existing site profile"
-msgstr ""
-
-msgid "OnDemandScans|You can either choose a passive scan or validate the target site in your chosen site profile. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
+msgid "OnDemandScans|Use existing scanner profile"
msgstr ""
-msgid "OnDemandScans|You cannot run an active scan against an unvalidated site."
+msgid "OnDemandScans|Use existing site profile"
msgstr ""
msgid "OnDemandScans|You must create a repository within your project to run an on-demand scan."
@@ -24187,6 +24511,9 @@ msgstr ""
msgid "Only admins can delete project"
msgstr ""
+msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
+msgstr ""
+
msgid "Only include features new to your current subscription tier."
msgstr ""
@@ -24205,6 +24532,12 @@ msgstr ""
msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
+msgid "Only reCAPTCHA v2 is supported:"
+msgstr ""
+
+msgid "Only users from the specified IP address ranges are able to reach this group, including all subgroups, projects, and Git repositories."
+msgstr ""
+
msgid "Only verified users with an email address in any of these domains can be added to the group."
msgstr ""
@@ -24391,9 +24724,6 @@ msgstr ""
msgid "Package Registry"
msgstr ""
-msgid "Package Registry Rate Limits"
-msgstr ""
-
msgid "Package Registry: authenticated API requests"
msgstr ""
@@ -24412,6 +24742,9 @@ msgstr ""
msgid "Package recipe already exists"
msgstr ""
+msgid "Package registry rate limits"
+msgstr ""
+
msgid "Package type"
msgstr ""
@@ -24478,6 +24811,9 @@ msgstr ""
msgid "PackageRegistry|Composer"
msgstr ""
+msgid "PackageRegistry|Composer.json with license: %{license} and version: %{version}"
+msgstr ""
+
msgid "PackageRegistry|Conan"
msgstr ""
@@ -24541,6 +24877,9 @@ msgstr ""
msgid "PackageRegistry|Copy require package include"
msgstr ""
+msgid "PackageRegistry|Copy target SHA"
+msgstr ""
+
msgid "PackageRegistry|Copy yarn command"
msgstr ""
@@ -24607,6 +24946,9 @@ msgstr ""
msgid "PackageRegistry|Install package version"
msgstr ""
+msgid "PackageRegistry|Instance-level"
+msgstr ""
+
msgid "PackageRegistry|Invalid Package: failed metadata extraction"
msgstr ""
@@ -24652,6 +24994,9 @@ msgstr ""
msgid "PackageRegistry|Pip Command"
msgstr ""
+msgid "PackageRegistry|Project-level"
+msgstr ""
+
msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
msgstr ""
@@ -24673,6 +25018,9 @@ msgstr ""
msgid "PackageRegistry|Remove package"
msgstr ""
+msgid "PackageRegistry|Required Python: %{pythonVersion}"
+msgstr ""
+
msgid "PackageRegistry|RubyGems"
msgstr ""
@@ -24715,6 +25063,9 @@ msgstr ""
msgid "PackageRegistry|Source project located at %{link}"
msgstr ""
+msgid "PackageRegistry|Target SHA: %{sha}"
+msgstr ""
+
msgid "PackageRegistry|There are no other versions of this package."
msgstr ""
@@ -24883,6 +25234,18 @@ msgstr ""
msgid "Password was successfully updated. Please sign in again."
msgstr ""
+msgid "PasswordPrompt|Confirm password"
+msgstr ""
+
+msgid "PasswordPrompt|Confirm password to continue"
+msgstr ""
+
+msgid "PasswordPrompt|Password is required"
+msgstr ""
+
+msgid "PasswordPrompt|Please enter your password to confirm"
+msgstr ""
+
msgid "Passwords should be unique and not used for any other sites or services."
msgstr ""
@@ -24910,6 +25273,9 @@ msgstr ""
msgid "Paste project path (i.e. gitlab-org/gitlab)"
msgstr ""
+msgid "Paste this DSN into your Sentry SDK"
+msgstr ""
+
msgid "Paste your public SSH key, which is usually contained in the file '~/.ssh/id_ed25519.pub' or '~/.ssh/id_rsa.pub' and begins with 'ssh-ed25519' or 'ssh-rsa'. Do not paste your private SSH key, as that can compromise your identity."
msgstr ""
@@ -24994,6 +25360,9 @@ msgstr ""
msgid "PerformanceBar|First Contentful Paint"
msgstr ""
+msgid "PerformanceBar|Flamegraph with mode:"
+msgstr ""
+
msgid "PerformanceBar|Frontend resources"
msgstr ""
@@ -25027,6 +25396,15 @@ msgstr ""
msgid "PerformanceBar|Trace"
msgstr ""
+msgid "PerformanceBar|cpu"
+msgstr ""
+
+msgid "PerformanceBar|object"
+msgstr ""
+
+msgid "PerformanceBar|wall"
+msgstr ""
+
msgid "Period in seconds"
msgstr ""
@@ -25255,6 +25633,48 @@ msgstr ""
msgid "PipelineSchedules|Variables"
msgstr ""
+msgid "PipelineSource|API"
+msgstr ""
+
+msgid "PipelineSource|Chat"
+msgstr ""
+
+msgid "PipelineSource|External"
+msgstr ""
+
+msgid "PipelineSource|External Pull Request"
+msgstr ""
+
+msgid "PipelineSource|Merge Request"
+msgstr ""
+
+msgid "PipelineSource|On-Demand DAST Scan"
+msgstr ""
+
+msgid "PipelineSource|On-Demand DAST Validation"
+msgstr ""
+
+msgid "PipelineSource|Parent Pipeline"
+msgstr ""
+
+msgid "PipelineSource|Pipeline"
+msgstr ""
+
+msgid "PipelineSource|Push"
+msgstr ""
+
+msgid "PipelineSource|Schedule"
+msgstr ""
+
+msgid "PipelineSource|Trigger"
+msgstr ""
+
+msgid "PipelineSource|Web"
+msgstr ""
+
+msgid "PipelineSource|Web IDE"
+msgstr ""
+
msgid "PipelineStatusTooltip|Pipeline: %{ciStatus}"
msgstr ""
@@ -25555,46 +25975,7 @@ msgstr ""
msgid "Pipeline|Source"
msgstr ""
-msgid "Pipeline|Source|API"
-msgstr ""
-
-msgid "Pipeline|Source|Chat"
-msgstr ""
-
-msgid "Pipeline|Source|External"
-msgstr ""
-
-msgid "Pipeline|Source|External Pull Request"
-msgstr ""
-
-msgid "Pipeline|Source|Merge Request"
-msgstr ""
-
-msgid "Pipeline|Source|On-Demand DAST Scan"
-msgstr ""
-
-msgid "Pipeline|Source|On-Demand DAST Validation"
-msgstr ""
-
-msgid "Pipeline|Source|Parent Pipeline"
-msgstr ""
-
-msgid "Pipeline|Source|Pipeline"
-msgstr ""
-
-msgid "Pipeline|Source|Push"
-msgstr ""
-
-msgid "Pipeline|Source|Schedule"
-msgstr ""
-
-msgid "Pipeline|Source|Trigger"
-msgstr ""
-
-msgid "Pipeline|Source|Web"
-msgstr ""
-
-msgid "Pipeline|Source|Web IDE"
+msgid "Pipeline|Source|Security Policy"
msgstr ""
msgid "Pipeline|Specify variable values to be used in this run. The values specified in %{linkStart}CI/CD settings%{linkEnd} will be used by default."
@@ -25645,7 +26026,7 @@ msgstr ""
msgid "Pipeline|We are currently unable to fetch pipeline data"
msgstr ""
-msgid "Pipeline|You’re about to stop pipeline %{pipelineId}."
+msgid "Pipeline|You’re about to stop pipeline #%{pipelineId}."
msgstr ""
msgid "Pipeline|for"
@@ -25672,6 +26053,9 @@ msgstr ""
msgid "Plain diff"
msgstr ""
+msgid "Plain-text response to send to clients that hit a rate limit"
+msgstr ""
+
msgid "Plan:"
msgstr ""
@@ -25816,9 +26200,6 @@ msgstr ""
msgid "Please provide attributes to update"
msgstr ""
-msgid "Please provide your username or email address."
-msgstr ""
-
msgid "Please reach out if you have any questions and we'll be happy to assist."
msgstr ""
@@ -25861,9 +26242,6 @@ msgstr ""
msgid "Please set a new password before proceeding."
msgstr ""
-msgid "Please share your feedback about %{featureName} %{linkStart}in this issue%{linkEnd} to help us improve the experience."
-msgstr ""
-
msgid "Please solve the captcha"
msgstr ""
@@ -26041,6 +26419,9 @@ msgstr ""
msgid "Prevent adding new members to project membership within this group"
msgstr ""
+msgid "Prevent auto-stopping"
+msgstr ""
+
msgid "Prevent editing approval rules in projects and merge requests."
msgstr ""
@@ -26053,7 +26434,7 @@ msgstr ""
msgid "Prevent users from changing their profile name"
msgstr ""
-msgid "Prevent users from performing write operations on GitLab while performing maintenance."
+msgid "Prevent users from performing write operations while GitLab maintenance is in progress."
msgstr ""
msgid "Preview"
@@ -26326,6 +26707,9 @@ msgstr ""
msgid "Profiles|Enter your name, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Enter your password to confirm the email change"
+msgstr ""
+
msgid "Profiles|Enter your pronouns to let people know how to refer to you"
msgstr ""
@@ -26560,10 +26944,10 @@ msgstr ""
msgid "Profiles|e.g. My MacBook key"
msgstr ""
-msgid "Profiles|username"
+msgid "Profiles|https://website.com"
msgstr ""
-msgid "Profiles|website.com"
+msgid "Profiles|username"
msgstr ""
msgid "Profiles|your account"
@@ -26806,9 +27190,21 @@ msgstr ""
msgid "ProjectSelect| or group"
msgstr ""
+msgid "ProjectSelect|No matching results"
+msgstr ""
+
msgid "ProjectSelect|Search for project"
msgstr ""
+msgid "ProjectSelect|Search projects"
+msgstr ""
+
+msgid "ProjectSelect|Select a project"
+msgstr ""
+
+msgid "ProjectSelect|There was an error fetching the projects. Please try again."
+msgstr ""
+
msgid "ProjectService|Drone server URL"
msgstr ""
@@ -26896,6 +27292,9 @@ msgstr ""
msgid "ProjectService|Trigger event when a new, unique alert is recorded."
msgstr ""
+msgid "ProjectService|Trigger event when a new, unique vulnerability is recorded. (Note: This feature requires an Ultimate plan.)"
+msgstr ""
+
msgid "ProjectService|Trigger event when a pipeline status changes."
msgstr ""
@@ -27310,9 +27709,15 @@ msgstr ""
msgid "Projects are graded based on the highest severity vulnerability present"
msgstr ""
+msgid "Projects are organized into groups"
+msgstr ""
+
msgid "Projects contributed to"
msgstr ""
+msgid "Projects help you organize your work. They contain your file repository, issues, merge requests, and so much more."
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr ""
@@ -27547,10 +27952,10 @@ msgstr ""
msgid "PrometheusService|Prometheus cluster integration"
msgstr ""
-msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
+msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
msgstr ""
-msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
+msgid "PrometheusService|The ID of the IAP-secured resource."
msgstr ""
msgid "PrometheusService|The Prometheus API base URL."
@@ -28168,6 +28573,9 @@ msgstr ""
msgid "Rate limit"
msgstr ""
+msgid "Rate limits can help reduce request volume (like from crawlers or abusive bots)."
+msgstr ""
+
msgid "Raw blob request rate limit per minute"
msgstr ""
@@ -28180,6 +28588,9 @@ msgstr ""
msgid "Re-authentication required"
msgstr ""
+msgid "Re-import"
+msgstr ""
+
msgid "Re-request review"
msgstr ""
@@ -28201,6 +28612,9 @@ msgstr ""
msgid "Read more about related issues"
msgstr ""
+msgid "Read their documentation."
+msgstr ""
+
msgid "Ready to get started with GitLab? Follow these steps to set up your workspace, plan and commit changes, and deploy your project."
msgstr ""
@@ -28234,6 +28648,9 @@ msgstr ""
msgid "Receive any notifications from GitLab."
msgstr ""
+msgid "Receive notification of abuse reports by email."
+msgstr ""
+
msgid "Receive notifications about your own activity"
msgstr ""
@@ -28381,9 +28798,6 @@ msgstr ""
msgid "Registry setup"
msgstr ""
-msgid "Regulate approvals by authors/committers. Affects all projects."
-msgstr ""
-
msgid "Reindexing Status: %{status} (Slice multiplier: %{multiplier}, Maximum running slices: %{max_slices})"
msgstr ""
@@ -28483,6 +28897,9 @@ msgstr ""
msgid "Release|Something went wrong while saving the release details."
msgstr ""
+msgid "Reload page"
+msgstr ""
+
msgid "Remediations"
msgstr ""
@@ -28765,6 +29182,9 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
+msgid "Repeats"
+msgstr ""
+
msgid "Replace"
msgstr ""
@@ -29143,10 +29563,7 @@ msgstr ""
msgid "Require additional authentication for administrative tasks."
msgstr ""
-msgid "Require all users in this group to setup Two-factor authentication"
-msgstr ""
-
-msgid "Require all users in this group to setup two-factor authentication"
+msgid "Require all users in this group to set up two-factor authentication"
msgstr ""
msgid "Required approvals (%{approvals_given} given)"
@@ -29200,6 +29617,9 @@ msgstr[5] ""
msgid "Requires values to meet regular expression requirements."
msgstr ""
+msgid "Requires you to deploy or set up cloud-hosted Sentry."
+msgstr ""
+
msgid "Requires your primary GitLab email address."
msgstr ""
@@ -29260,9 +29680,6 @@ msgstr ""
msgid "Resolve"
msgstr ""
-msgid "Resolve all threads in new issue"
-msgstr ""
-
msgid "Resolve conflicts"
msgstr ""
@@ -29320,6 +29737,9 @@ msgstr ""
msgid "Response text"
msgstr ""
+msgid "Restart GitLab to apply changes."
+msgstr ""
+
msgid "Restart Terminal"
msgstr ""
@@ -29338,6 +29758,9 @@ msgstr ""
msgid "Restoring the project will prevent the project from being removed on this date and restore people's ability to make changes to it."
msgstr ""
+msgid "Restrict group access by IP address. %{link_start}Learn more%{link_end}."
+msgstr ""
+
msgid "Restrict membership by email domain"
msgstr ""
@@ -29659,6 +30082,9 @@ msgstr ""
msgid "Runners|Runner #%{runner_id}"
msgstr ""
+msgid "Runners|Runner assigned to project."
+msgstr ""
+
msgid "Runners|Runner is offline, last contact was %{runner_contact} ago"
msgstr ""
@@ -29671,6 +30097,9 @@ msgstr ""
msgid "Runners|Runner registration"
msgstr ""
+msgid "Runners|Runner unassigned from project."
+msgstr ""
+
msgid "Runners|Runners"
msgstr ""
@@ -29863,7 +30292,7 @@ msgstr ""
msgid "SastEntryPoints|How do I set up SAST?"
msgstr ""
-msgid "SastEntryPoints|Learn more."
+msgid "SastEntryPoints|Learn more"
msgstr ""
msgid "Satisfied"
@@ -29905,7 +30334,7 @@ msgstr ""
msgid "Save pipeline schedule"
msgstr ""
-msgid "Save space and find images in the container Registry. remove unneeded tags and keep only the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
+msgid "Save storage space by automatically deleting tags from the container registry and keeping the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
msgstr ""
msgid "Saving"
@@ -30079,6 +30508,9 @@ msgstr ""
msgid "Search or filter results…"
msgstr ""
+msgid "Search or jump to..."
+msgstr ""
+
msgid "Search project"
msgstr ""
@@ -30139,16 +30571,16 @@ msgstr ""
msgid "SearchCodeResults|of %{link_to_project}"
msgstr ""
-msgid "SearchResults|Showing %{count} %{scope} for%{term_element}"
+msgid "SearchResults|Showing %{count} %{scope} for %{term_element}"
msgstr ""
-msgid "SearchResults|Showing %{count} %{scope} for%{term_element} in your personal and project snippets"
+msgid "SearchResults|Showing %{count} %{scope} for %{term_element} in your personal and project snippets"
msgstr ""
-msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for%{term_element}"
+msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for %{term_element}"
msgstr ""
-msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for%{term_element} in your personal and project snippets"
+msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for %{term_element} in your personal and project snippets"
msgstr ""
msgid "SearchResults|code result"
@@ -30274,6 +30706,9 @@ msgstr ""
msgid "Secret Detection"
msgstr ""
+msgid "Secret access key"
+msgstr ""
+
msgid "Secret token"
msgstr ""
@@ -30313,9 +30748,6 @@ msgstr ""
msgid "SecurityApprovals|A merge request approval is required when the license compliance report contains a denied license."
msgstr ""
-msgid "SecurityApprovals|Configurable if security scanners are enabled. %{linkStart}Learn more.%{linkEnd}"
-msgstr ""
-
msgid "SecurityApprovals|Coverage-Check"
msgstr ""
@@ -30328,24 +30760,18 @@ msgstr ""
msgid "SecurityApprovals|Learn more about Vulnerability-Check"
msgstr ""
-msgid "SecurityApprovals|License Scanning must be enabled. %{linkStart}Learn more%{linkEnd}."
-msgstr ""
-
msgid "SecurityApprovals|License-Check"
msgstr ""
msgid "SecurityApprovals|Requires approval for Denied licenses. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}More information%{linkEnd}"
+msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "SecurityApprovals|Requires approval for vulnerabilities. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
-msgid "SecurityApprovals|Test coverage must be enabled. %{linkStart}Learn more%{linkEnd}."
-msgstr ""
-
msgid "SecurityApprovals|Vulnerability-Check"
msgstr ""
@@ -30409,6 +30835,12 @@ msgstr ""
msgid "SecurityConfiguration|Immediately begin risk analysis and remediation with application security features. Start with SAST and Secret Detection, available to all plans. Upgrade to Ultimate to get all features, including:"
msgstr ""
+msgid "SecurityConfiguration|Manage corpus"
+msgstr ""
+
+msgid "SecurityConfiguration|Manage corpus files used as mutation sources in coverage fuzzing."
+msgstr ""
+
msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
msgstr ""
@@ -30463,6 +30895,12 @@ msgstr ""
msgid "SecurityOrchestration|Action"
msgstr ""
+msgid "SecurityOrchestration|Actions"
+msgstr ""
+
+msgid "SecurityOrchestration|Add rule"
+msgstr ""
+
msgid "SecurityOrchestration|All policies"
msgstr ""
@@ -30496,9 +30934,6 @@ msgstr ""
msgid "SecurityOrchestration|Network"
msgstr ""
-msgid "SecurityOrchestration|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
-msgstr ""
-
msgid "SecurityOrchestration|New policy"
msgstr ""
@@ -30514,6 +30949,9 @@ msgstr ""
msgid "SecurityOrchestration|Policy editor"
msgstr ""
+msgid "SecurityOrchestration|Policy preview"
+msgstr ""
+
msgid "SecurityOrchestration|Policy status"
msgstr ""
@@ -30523,6 +30961,9 @@ msgstr ""
msgid "SecurityOrchestration|Rule"
msgstr ""
+msgid "SecurityOrchestration|Rules"
+msgstr ""
+
msgid "SecurityOrchestration|Scan Execution"
msgstr ""
@@ -30616,6 +31057,9 @@ msgstr ""
msgid "SecurityReports|Create issue"
msgstr ""
+msgid "SecurityReports|Development vulnerabilities"
+msgstr ""
+
msgid "SecurityReports|Dismiss vulnerability"
msgstr ""
@@ -30631,6 +31075,9 @@ msgstr ""
msgid "SecurityReports|Download results"
msgstr ""
+msgid "SecurityReports|Download scanned URLs"
+msgstr ""
+
msgid "SecurityReports|Download scanned resources"
msgstr ""
@@ -30754,6 +31201,9 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
+msgid "SecurityReports|The Vulnerability Report shows the results of the lastest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "SecurityReports|The security reports below contain one or more vulnerability findings that could not be parsed and were not recorded. Download the artifacts in the job output to investigate. Ensure any security report created conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
msgstr ""
@@ -30895,10 +31345,10 @@ msgstr ""
msgid "Select a repository"
msgstr ""
-msgid "Select a role"
+msgid "Select a repository containing templates for common files."
msgstr ""
-msgid "Select a shared template repository for all projects on this instance."
+msgid "Select a role"
msgstr ""
msgid "Select a template repository"
@@ -30976,6 +31426,9 @@ msgstr ""
msgid "Select project to choose zone"
msgstr ""
+msgid "Select project to create issue"
+msgstr ""
+
msgid "Select projects"
msgstr ""
@@ -31093,6 +31546,9 @@ msgstr ""
msgid "Send emails to help guide new users through the onboarding process."
msgstr ""
+msgid "Send emails to users upon account deactivation."
+msgstr ""
+
msgid "Send message"
msgstr ""
@@ -31111,6 +31567,9 @@ msgstr ""
msgid "Send service data"
msgstr ""
+msgid "Sentry"
+msgstr ""
+
msgid "Sentry API URL"
msgstr ""
@@ -31225,6 +31684,9 @@ msgstr ""
msgid "Service"
msgstr ""
+msgid "Service Accounts keys are required to authorize GitLab to deploy your Google Cloud project."
+msgstr ""
+
msgid "Service Desk"
msgstr ""
@@ -31297,15 +31759,15 @@ msgstr ""
msgid "Set a password on your account to pull or push via %{protocol}."
msgstr ""
-msgid "Set a template repository for projects in this group"
-msgstr ""
-
msgid "Set access permissions for this token."
msgstr ""
msgid "Set an instance-wide domain that will be available to all clusters when installing Knative."
msgstr ""
+msgid "Set any rate limit to %{code_open}0%{code_close} to disable the limit."
+msgstr ""
+
msgid "Set default and restrict visibility levels. Configure import sources and git access protocol."
msgstr ""
@@ -31318,7 +31780,7 @@ msgstr ""
msgid "Set limit to 0 to allow any file size."
msgstr ""
-msgid "Set max session time for web terminal."
+msgid "Set limits for web and API requests."
msgstr ""
msgid "Set milestone"
@@ -31327,15 +31789,18 @@ msgstr ""
msgid "Set new password"
msgstr ""
-msgid "Set notification email for abuse reports."
+msgid "Set parent epic to an epic"
msgstr ""
-msgid "Set parent epic to an epic"
+msgid "Set per-user rate limits for imports and exports of projects and groups."
msgstr ""
msgid "Set projects and maximum size limits, session duration, user options, and check feature availability for namespace plan."
msgstr ""
+msgid "Set rate limits for package registry API requests that supersede the general user and IP rate limits."
+msgstr ""
+
msgid "Set severity"
msgstr ""
@@ -31354,15 +31819,24 @@ msgstr ""
msgid "Set the default branch for this project. All merge requests and commits are made against this branch unless you specify a different one."
msgstr ""
+msgid "Set the default expiration time for job artifacts in all projects. Set to %{code_open}0%{code_close} to never expire artifacts by default. If no unit is written, it defaults to seconds. For example, these are all equivalent: %{code_open}3600%{code_close}, %{code_open}60 minutes%{code_close}, or %{code_open}one hour%{code_close}."
+msgstr ""
+
msgid "Set the due date to %{due_date}."
msgstr ""
msgid "Set the iteration to %{iteration_reference}."
msgstr ""
+msgid "Set the maximum session time for a web terminal."
+msgstr ""
+
msgid "Set the milestone to %{milestone_reference}."
msgstr ""
+msgid "Set the per-user rate limit for notes created by web or API requests."
+msgstr ""
+
msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
msgstr ""
@@ -31564,6 +32038,9 @@ msgstr ""
msgid "Show Pipeline IID"
msgstr ""
+msgid "Show all %{issuable_type}."
+msgstr ""
+
msgid "Show all activity"
msgstr ""
@@ -31615,15 +32092,9 @@ msgstr ""
msgid "Show list"
msgstr ""
-msgid "Show me advanced features"
-msgstr ""
-
msgid "Show me how to add a pipeline"
msgstr ""
-msgid "Show me the basics"
-msgstr ""
-
msgid "Show one file at a time"
msgstr ""
@@ -31672,15 +32143,15 @@ msgstr ""
msgid "Showing %{pageSize} of %{total} %{issuableType}"
msgstr ""
-msgid "Showing %{pageSize} of %{total} issues"
-msgstr ""
-
msgid "Showing all epics"
msgstr ""
msgid "Showing all issues"
msgstr ""
+msgid "Showing data for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
+msgstr ""
+
msgid "Showing data for workflow items created in this date range. Date range cannot exceed %{maxDateRange} days."
msgstr ""
@@ -31720,6 +32191,15 @@ msgstr ""
msgid "Sidebar|Weight"
msgstr ""
+msgid "Sidekiq job compression threshold (bytes)"
+msgstr ""
+
+msgid "Sidekiq job size limit (bytes)"
+msgstr ""
+
+msgid "Sidekiq job size limits"
+msgstr ""
+
msgid "Sign in"
msgstr ""
@@ -31840,6 +32320,9 @@ msgstr ""
msgid "Site profile not found for given parameters"
msgstr ""
+msgid "Sites"
+msgstr ""
+
msgid "Size"
msgstr ""
@@ -31870,19 +32353,22 @@ msgstr ""
msgid "SlackIntegration|Sends notifications about project events to Slack channels."
msgstr ""
-msgid "SlackService|2. Paste the %{strong_open}Token%{strong_close} into the field below"
+msgid "SlackService|1. %{slash_command_link_start}Add a slash command%{slash_command_link_end} in your Slack team using this information:"
msgstr ""
-msgid "SlackService|3. Select the %{strong_open}Active%{strong_close} checkbox, press %{strong_open}Save changes%{strong_close} and start using GitLab inside Slack!"
+msgid "SlackService|2. Paste the token from Slack in the %{strong_open}Token%{strong_close} field below."
msgstr ""
-msgid "SlackService|Fill in the word that works best for your team."
+msgid "SlackService|3. Select the %{strong_open}Active%{strong_close} checkbox, select %{strong_open}Save changes%{strong_close}, and start using slash commands in Slack!"
+msgstr ""
+
+msgid "SlackService|After setup, get a list of available Slack slash commands by entering"
msgstr ""
-msgid "SlackService|See list of available commands in Slack after setting up this service, by entering"
+msgid "SlackService|Fill in the word that works best for your team."
msgstr ""
-msgid "SlackService|This service allows users to perform common operations on this project by entering slash commands in Slack."
+msgid "SlackService|Perform common operations in this project by entering slash commands in Slack."
msgstr ""
msgid "Slice multiplier"
@@ -31948,7 +32434,7 @@ msgstr ""
msgid "Some child epics may be hidden due to applied filters"
msgstr ""
-msgid "Some common domains are not allowed. %{read_more_link}."
+msgid "Some common domains are not allowed. %{learn_more_link}."
msgstr ""
msgid "Some of the designs you tried uploading did not change:"
@@ -32032,9 +32518,6 @@ msgstr ""
msgid "Something went wrong while exporting requirements"
msgstr ""
-msgid "Something went wrong while fetching %{listType} list"
-msgstr ""
-
msgid "Something went wrong while fetching branches"
msgstr ""
@@ -32089,15 +32572,9 @@ msgstr ""
msgid "Something went wrong while merging this merge request. Please try again."
msgstr ""
-msgid "Something went wrong while moving issues."
-msgstr ""
-
msgid "Something went wrong while obtaining the Let's Encrypt certificate."
msgstr ""
-msgid "Something went wrong while performing the action."
-msgstr ""
-
msgid "Something went wrong while promoting the issue to an epic. Please try again."
msgstr ""
@@ -32425,7 +32902,10 @@ msgstr ""
msgid "SourcegraphPreferences|Uses a custom %{linkStart}Sourcegraph instance%{linkEnd}."
msgstr ""
-msgid "Spam Check API Key"
+msgid "Spam Check"
+msgstr ""
+
+msgid "Spam Check API key"
msgstr ""
msgid "Spam Logs"
@@ -32443,7 +32923,7 @@ msgstr ""
msgid "Specified URL cannot be used: \"%{reason}\""
msgstr ""
-msgid "Specify an e-mail address regex pattern to identify default internal users."
+msgid "Specify an email address regex pattern to identify default internal users."
msgstr ""
msgid "Speed up your pipelines with Needs relationships"
@@ -32698,7 +33178,7 @@ msgstr ""
msgid "StatusCheck|An error occurred fetching the status checks."
msgstr ""
-msgid "StatusCheck|Apply this status check to any branch or a specific protected branch."
+msgid "StatusCheck|Apply this status check to all branches or a specific protected branch."
msgstr ""
msgid "StatusCheck|Check for a status response in Merge Requests. Failures do not block merges. %{link_start}Learn more%{link_end}."
@@ -33037,6 +33517,9 @@ msgstr ""
msgid "Subscriptions"
msgstr ""
+msgid "Subscription|Your subscription for %{strong}%{namespace_name}%{strong_close} has expired and you are now on %{pricing_link_start}the GitLab Free tier%{pricing_link_end}. Don't worry, your data is safe. Get in touch with our support team (%{support_email}). They'll gladly help with your subscription renewal."
+msgstr ""
+
msgid "Subtracted"
msgstr ""
@@ -33265,6 +33748,9 @@ msgstr ""
msgid "SuperSonics|Plan"
msgstr ""
+msgid "SuperSonics|Please agree to the Subscription Agreement"
+msgstr ""
+
msgid "SuperSonics|Ready to get started? A GitLab plan is ideal for scaling organizations and for multi team usage."
msgstr ""
@@ -33295,6 +33781,9 @@ msgstr ""
msgid "SuperSonics|The activation code is not valid. Please make sure to copy it exactly from the Customers Portal or confirmation email. Learn more about %{linkStart}activating your subscription%{linkEnd}."
msgstr ""
+msgid "SuperSonics|The activation code should be a 24-character alphanumeric string"
+msgstr ""
+
msgid "SuperSonics|There is a connectivity issue."
msgstr ""
@@ -33337,9 +33826,15 @@ msgstr ""
msgid "SuperSonics|You do not have an active subscription"
msgstr ""
+msgid "SuperSonics|You have successfully added a license that activates on %{date}. Please see the subscription history table below for more details."
+msgstr ""
+
msgid "SuperSonics|You'll be charged for %{trueUpLinkStart}users over license%{trueUpLinkEnd} on a quarterly or annual basis, depending on the terms of your agreement."
msgstr ""
+msgid "SuperSonics|Your future dated license was successfully added"
+msgstr ""
+
msgid "SuperSonics|Your subscription"
msgstr ""
@@ -33592,7 +34087,7 @@ msgstr ""
msgid "Template to append to all Service Desk issues"
msgstr ""
-msgid "TemplateRepository|Select a repository to make its templates available to all projects. %{link_start}What should the repository contain?%{link_end} "
+msgid "TemplateRepository|Create common files more quickly, and standardize their format."
msgstr ""
msgid "Templates"
@@ -33814,7 +34309,7 @@ msgstr ""
msgid "TestCases|Search test cases"
msgstr ""
-msgid "TestCases|Something went wrong while adding test case to Todo."
+msgid "TestCases|Something went wrong while adding test case to a to-do item."
msgstr ""
msgid "TestCases|Something went wrong while creating a test case."
@@ -33826,7 +34321,7 @@ msgstr ""
msgid "TestCases|Something went wrong while fetching test cases list."
msgstr ""
-msgid "TestCases|Something went wrong while marking test case todo as done."
+msgid "TestCases|Something went wrong while marking test case to-do item as done."
msgstr ""
msgid "TestCases|Something went wrong while moving test case."
@@ -33946,7 +34441,7 @@ msgstr ""
msgid "Thanks for your purchase!"
msgstr ""
-msgid "That is ok, I do not want to renew"
+msgid "That's OK, I don't want to renew"
msgstr ""
msgid "That's it, well done!"
@@ -33973,7 +34468,7 @@ msgstr[3] ""
msgstr[4] ""
msgstr[5] ""
-msgid "The API key used by GitLab for accessing the Spam Check service endpoint"
+msgid "The API key used by GitLab for accessing the Spam Check service endpoint."
msgstr ""
msgid "The GitLab subscription service (customers.gitlab.com) is currently experiencing an outage. You can monitor the status and get updates at %{linkStart}status.gitlab.com%{linkEnd}."
@@ -34012,9 +34507,6 @@ msgstr ""
msgid "The URL to use for connecting to Elasticsearch. Use a comma-separated list to support clustering (e.g., \"http://localhost:9200, http://localhost:9201\")."
msgstr ""
-msgid "The Vulnerability Report shows the results of the last successful pipeline run on the default branch."
-msgstr ""
-
msgid "The X509 Certificate to use when mutual TLS is required to communicate with the external authorization service. If left blank, the server certificate is still validated when accessing over HTTPS."
msgstr ""
@@ -34072,9 +34564,6 @@ msgstr ""
msgid "The default branch for this project has been changed. Please update your bookmarks."
msgstr ""
-msgid "The default expiration time for job artifacts. 0 for unlimited. The default unit is in seconds, but you can use other units, for example %{code_open}4 mins 2 sec%{code_close}, %{code_open}2h42min%{code_close}."
-msgstr ""
-
msgid "The dependency list details information about the components used within your project."
msgstr ""
@@ -34270,9 +34759,6 @@ msgstr ""
msgid "The merge conflicts for this merge request have already been resolved. Please return to the merge request."
msgstr ""
-msgid "The merge request can now be merged."
-msgstr ""
-
msgid "The metric must be one of %{metrics}."
msgstr ""
@@ -34648,7 +35134,7 @@ msgstr ""
msgid "There was a problem updating the keep latest artifacts setting."
msgstr ""
-msgid "There was an error %{message} todo."
+msgid "There was an error %{message} to-do item."
msgstr ""
msgid "There was an error adding a To Do."
@@ -34687,6 +35173,9 @@ msgstr ""
msgid "There was an error fetching projects"
msgstr ""
+msgid "There was an error fetching search autocomplete suggestions"
+msgstr ""
+
msgid "There was an error fetching stage total counts"
msgstr ""
@@ -35011,6 +35500,9 @@ msgstr ""
msgid "This field is required."
msgstr ""
+msgid "This form is disabled in preview"
+msgstr ""
+
msgid "This group"
msgstr ""
@@ -35032,9 +35524,6 @@ msgstr ""
msgid "This group is linked to a subscription"
msgstr ""
-msgid "This group, including all subgroups, projects and git repositories, will be reachable from only the specified IP address ranges."
-msgstr ""
-
msgid "This group, its subgroups and projects has been scheduled for removal on %{date}."
msgstr ""
@@ -35314,9 +35803,6 @@ msgstr ""
msgid "This user cannot be unlocked manually from GitLab"
msgstr ""
-msgid "This user does not have a pending request"
-msgstr ""
-
msgid "This user has an unconfirmed email address (%{email}). You may force a confirmation."
msgstr ""
@@ -35425,9 +35911,6 @@ msgstr ""
msgid "ThreatMonitoring|Packet Activity"
msgstr ""
-msgid "ThreatMonitoring|Policies"
-msgstr ""
-
msgid "ThreatMonitoring|Requests"
msgstr ""
@@ -35479,6 +35962,12 @@ msgstr ""
msgid "ThreatMonitoring|View documentation"
msgstr ""
+msgid "Threshold in bytes at which to compress Sidekiq job arguments."
+msgstr ""
+
+msgid "Threshold in bytes at which to reject Sidekiq jobs. Set this to 0 to if you don't want to limit Sidekiq jobs."
+msgstr ""
+
msgid "Throughput"
msgstr ""
@@ -35488,6 +35977,9 @@ msgstr ""
msgid "Time"
msgstr ""
+msgid "Time (in hours) that users are allowed to skip forced configuration of two-factor authentication."
+msgstr ""
+
msgid "Time Spent"
msgstr ""
@@ -35554,7 +36046,7 @@ msgstr ""
msgid "TimeTrackingEstimated|Est"
msgstr ""
-msgid "TimeTracking|%{startTag}Spent: %{endTag}%{timeSpentHumanReadable}"
+msgid "TimeTracking|%{spentStart}Spent: %{spentEnd}"
msgstr ""
msgid "TimeTracking|Estimated:"
@@ -35776,6 +36268,9 @@ msgstr ""
msgid "To access this domain create a new DNS record"
msgstr ""
+msgid "To add a custom suffix, set up a Service Desk email address. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "To add an SSH key you need to %{generate_link_start}generate one%{link_end} or use an %{existing_link_start}existing key%{link_end}."
msgstr ""
@@ -35797,13 +36292,16 @@ msgstr ""
msgid "To connect an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To continue using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
+msgstr ""
+
msgid "To continue, you need to select the link in the confirmation email we sent to verify your email address. If you didn't get our email, select %{strongStart}Resend confirmation email.%{strongEnd}"
msgstr ""
msgid "To define internal users, first enable new users set to external"
msgstr ""
-msgid "To enable Registration Features, make sure \"Enable service ping\" is checked."
+msgid "To enable Registration Features, first enable Service Ping."
msgstr ""
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
@@ -35830,7 +36328,7 @@ msgstr ""
msgid "To get started, use the link below to confirm your account."
msgstr ""
-msgid "To help improve GitLab and its user experience, GitLab will periodically collect usage information."
+msgid "To help improve GitLab and its user experience, GitLab periodically collects usage information."
msgstr ""
msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
@@ -35863,7 +36361,7 @@ msgstr ""
msgid "To preserve performance only %{strong_open}%{display_size} of %{real_size}%{strong_close} files are displayed."
msgstr ""
-msgid "To protect this issue's confidentiality, %{forkLink} and set the fork's visibility to private."
+msgid "To protect this issue's confidentiality, %{linkStart}fork this project%{linkEnd} and set the fork's visibility to private."
msgstr ""
msgid "To protect this issue's confidentiality, a private fork of this project was selected."
@@ -35896,12 +36394,15 @@ msgstr ""
msgid "To set up SAML authentication for your group through an identity provider like Azure, Okta, Onelogin, Ping Identity, or your custom SAML 2.0 provider:"
msgstr ""
-msgid "To set up this service:"
+msgid "To set up this integration:"
msgstr ""
msgid "To specify the notification level per project of a group you belong to, you need to visit project page and change notification level there."
msgstr ""
+msgid "To start using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
+msgstr ""
+
msgid "To unsubscribe from this issue, please paste the following link into your browser:"
msgstr ""
@@ -36493,9 +36994,6 @@ msgstr ""
msgid "Unable to fetch branches list, please close the form and try again"
msgstr ""
-msgid "Unable to fetch unscanned projects"
-msgstr ""
-
msgid "Unable to fetch vulnerable projects"
msgstr ""
@@ -36550,6 +37048,15 @@ msgstr ""
msgid "Unable to update this issue at this time."
msgstr ""
+msgid "Unapprove a merge request"
+msgstr ""
+
+msgid "Unapprove the current merge request."
+msgstr ""
+
+msgid "Unapproved the current merge request."
+msgstr ""
+
msgid "Unarchive project"
msgstr ""
@@ -36562,16 +37069,13 @@ msgstr ""
msgid "Unassigned"
msgstr ""
-msgid "Unauthenticated API request rate limit"
-msgstr ""
-
-msgid "Unauthenticated rate limit period in seconds"
+msgid "Unauthenticated API rate limit period in seconds"
msgstr ""
-msgid "Unauthenticated request rate limit"
+msgid "Unauthenticated requests"
msgstr ""
-msgid "Unauthenticated requests"
+msgid "Unauthenticated web rate limit period in seconds"
msgstr ""
msgid "Undo"
@@ -36673,18 +37177,6 @@ msgstr ""
msgid "Unresolved"
msgstr ""
-msgid "UnscannedProjects|15 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|30 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|5 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|60 or more days"
-msgstr ""
-
msgid "Unschedule job"
msgstr ""
@@ -36904,6 +37396,9 @@ msgstr ""
msgid "UsageQuota|%{help_link_start}Shared runners%{help_link_end} are disabled, so there are no limits set on pipeline usage"
msgstr ""
+msgid "UsageQuota|%{linkTitle} help link"
+msgstr ""
+
msgid "UsageQuota|%{percentageLeft} of purchased storage is available"
msgstr ""
@@ -36913,6 +37408,9 @@ msgstr ""
msgid "UsageQuota|Artifacts is a sum of build and pipeline artifacts."
msgstr ""
+msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
+msgstr ""
+
msgid "UsageQuota|Buy additional minutes"
msgstr ""
@@ -36922,9 +37420,21 @@ msgstr ""
msgid "UsageQuota|CI minutes usage by project"
msgstr ""
+msgid "UsageQuota|Code packages and container images."
+msgstr ""
+
msgid "UsageQuota|Current period usage"
msgstr ""
+msgid "UsageQuota|File attachments and smaller design graphics."
+msgstr ""
+
+msgid "UsageQuota|Git repository, managed by the Gitaly service."
+msgstr ""
+
+msgid "UsageQuota|Includes project registry, artifacts, packages, wiki, uploads and other items."
+msgstr ""
+
msgid "UsageQuota|Increase storage temporarily"
msgstr ""
@@ -36943,6 +37453,9 @@ msgstr ""
msgid "UsageQuota|Packages"
msgstr ""
+msgid "UsageQuota|Pipeline artifacts and job artifacts, created with CI/CD."
+msgstr ""
+
msgid "UsageQuota|Pipelines"
msgstr ""
@@ -36961,6 +37474,9 @@ msgstr ""
msgid "UsageQuota|Seats"
msgstr ""
+msgid "UsageQuota|Shared bits of code and text."
+msgstr ""
+
msgid "UsageQuota|Snippets"
msgstr ""
@@ -36970,6 +37486,12 @@ msgstr ""
msgid "UsageQuota|Storage"
msgstr ""
+msgid "UsageQuota|Storage type"
+msgstr ""
+
+msgid "UsageQuota|There is a known issue with Artifact storage where the total could be incorrect for some projects. More details and progress are available in %{warningLinkStart}the epic%{warningLinkEnd}."
+msgstr ""
+
msgid "UsageQuota|This is the total amount of storage used across your projects within this namespace."
msgstr ""
@@ -37009,6 +37531,9 @@ msgstr ""
msgid "UsageQuota|Usage"
msgstr ""
+msgid "UsageQuota|Usage Breakdown"
+msgstr ""
+
msgid "UsageQuota|Usage Quotas"
msgstr ""
@@ -37033,6 +37558,9 @@ msgstr ""
msgid "UsageQuota|Wiki"
msgstr ""
+msgid "UsageQuota|Wiki content."
+msgstr ""
+
msgid "UsageQuota|Wikis"
msgstr ""
@@ -37249,7 +37777,10 @@ msgstr ""
msgid "User Settings"
msgstr ""
-msgid "User and IP Rate Limits"
+msgid "User and IP rate limits"
+msgstr ""
+
+msgid "User does not have a pending request"
msgstr ""
msgid "User identity was successfully created."
@@ -37546,6 +38077,9 @@ msgstr ""
msgid "Users can launch a development environment from a GitLab browser tab when the %{linkStart}Gitpod%{linkEnd} integration is enabled."
msgstr ""
+msgid "Users can reactivate their account by signing in."
+msgstr ""
+
msgid "Users can render diagrams in AsciiDoc, Markdown, reStructuredText, and Textile documents using Kroki."
msgstr ""
@@ -37561,6 +38095,9 @@ msgstr ""
msgid "Users requesting access to"
msgstr ""
+msgid "Users to exclude from the rate limit"
+msgstr ""
+
msgid "Users were successfully added."
msgstr ""
@@ -37582,6 +38119,9 @@ msgstr ""
msgid "UsersSelect|Unassigned"
msgstr ""
+msgid "Uses GitLab as a lightweight alternative to Sentry."
+msgstr ""
+
msgid "Using %{code_start}::%{code_end} denotes a %{link_start}scoped label set%{link_end}"
msgstr ""
@@ -37612,10 +38152,7 @@ msgstr ""
msgid "Value Stream Analytics can help you determine your team’s velocity"
msgstr ""
-msgid "Value Stream Analytics gives an overview of how much time it takes to go from idea to production in your project."
-msgstr ""
-
-msgid "Value may contain a variable reference"
+msgid "Value might contain a variable reference"
msgstr ""
msgid "Value stream"
@@ -37681,10 +38218,10 @@ msgstr ""
msgid "ValueStream|The Default Value Stream cannot be deleted"
msgstr ""
-msgid "Variable"
+msgid "Values that contain the %{codeStart}$%{codeEnd} character can be considered a variable reference and expanded. %{docsLinkStart}Learn more.%{docsLinkEnd}"
msgstr ""
-msgid "Variable references indicated by %{codeStart}$%{codeEnd} may be expanded. If this is not what you want, consider %{docsLinkStart}using a workaround to prevent expansion%{docsLinkEnd}."
+msgid "Variable"
msgstr ""
msgid "Variable will be masked in job logs."
@@ -38101,6 +38638,9 @@ msgstr ""
msgid "Vulnerability|Evidence"
msgstr ""
+msgid "Vulnerability|False positive detected"
+msgstr ""
+
msgid "Vulnerability|File"
msgstr ""
@@ -38143,6 +38683,9 @@ msgstr ""
msgid "Vulnerability|Status"
msgstr ""
+msgid "Vulnerability|The scanner determined this vulnerability to be a false positive. Verify the evaluation before changing its status. %{linkStart}Learn more about false positive detection.%{linkEnd}"
+msgstr ""
+
msgid "Vulnerability|The unmodified response is the original response that had no mutations done to the request"
msgstr ""
@@ -38467,9 +39010,6 @@ msgstr ""
msgid "Welcome to GitLab,%{br_tag}%{name}!"
msgstr ""
-msgid "Welcome to the guided GitLab tour"
-msgstr ""
-
msgid "Welcome, %{name}!"
msgstr ""
@@ -38488,9 +39028,6 @@ msgstr ""
msgid "What are you searching for?"
msgstr ""
-msgid "What describes you best?"
-msgstr ""
-
msgid "What does this command do?"
msgstr ""
@@ -38512,13 +39049,13 @@ msgstr ""
msgid "What is your job title? (optional)"
msgstr ""
-msgid "What will you use this group for?"
+msgid "What templates can I create?"
msgstr ""
-msgid "What's new"
+msgid "What will you use this group for?"
msgstr ""
-msgid "What’s your experience level?"
+msgid "What's new"
msgstr ""
msgid "When a deployment job is successful, skip older deployment jobs that are still pending."
@@ -38530,6 +39067,9 @@ msgstr ""
msgid "When an event in GitLab triggers a webhook, you can use the request details to figure out if something went wrong."
msgstr ""
+msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+msgstr ""
+
msgid "When inactive, an external authentication provider must be used."
msgstr ""
@@ -38557,6 +39097,9 @@ msgstr ""
msgid "When:"
msgstr ""
+msgid "Which API requests are affected?"
+msgstr ""
+
msgid "While it's rare to have no vulnerabilities, it can happen. In any event, we ask that you please double check your settings to make sure you've set up your dashboard correctly."
msgstr ""
@@ -38836,6 +39379,9 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|Work Items"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -38911,6 +39457,9 @@ msgstr ""
msgid "You are already a member of this %{member_source}."
msgstr ""
+msgid "You are already impersonating another user"
+msgstr ""
+
msgid "You are an admin, which means granting access to %{client_name} will allow them to interact with GitLab as an admin as well. Proceed with caution."
msgstr ""
@@ -39013,6 +39562,9 @@ msgstr ""
msgid "You can also use project access tokens with Git to authenticate over HTTP(S). %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "You can always change your URL later"
+msgstr ""
+
msgid "You can always edit this later"
msgstr ""
@@ -39169,10 +39721,10 @@ msgstr ""
msgid "You can’t %{tag_start}edit%{tag_end} files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
-msgid "You could not create a new trigger."
+msgid "You can’t edit files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
-msgid "You didn't renew your subscription for %{strong}%{namespace_name}%{strong_close} so it was downgraded to the free plan."
+msgid "You could not create a new trigger."
msgstr ""
msgid "You do not have any subscriptions yet"
@@ -39340,6 +39892,12 @@ msgstr ""
msgid "You must provide your current password in order to change it."
msgstr ""
+msgid "You must sign in to search for specific projects."
+msgstr ""
+
+msgid "You must sign in to search for specific terms."
+msgstr ""
+
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
@@ -39367,6 +39925,9 @@ msgstr ""
msgid "You need to upload a GitLab project export archive (ending in .gz)."
msgstr ""
+msgid "You need to verify your primary email first before enabling Two-Factor Authentication."
+msgstr ""
+
msgid "You successfully declined the invitation"
msgstr ""
@@ -39475,10 +40036,10 @@ msgstr ""
msgid "Your %{host} account was signed in to from a new location"
msgstr ""
-msgid "Your %{strong}%{plan_name}%{strong_close} subscription for %{strong}%{namespace_name}%{strong_close} will expire on %{strong}%{expires_on}%{strong_close}."
+msgid "Your %{strong}%{plan_name}%{strong_close} subscription expires on %{strong}%{expires_on}%{strong_close}. After that date, you cannot create issues or merge requests, or use many other features."
msgstr ""
-msgid "Your %{strong}%{plan_name}%{strong_close} subscription will expire on %{strong}%{expires_on}%{strong_close}. After that, you will not be able to create issues or merge requests as well as many other features."
+msgid "Your %{strong}%{plan_name}%{strong_close} subscription for %{strong}%{namespace_name}%{strong_close} will expire on %{strong}%{expires_on}%{strong_close}."
msgstr ""
msgid "Your CI/CD configuration syntax is invalid. View Lint tab for more details."
@@ -39502,7 +40063,7 @@ msgstr ""
msgid "Your GPG keys (%{count})"
msgstr ""
-msgid "Your GitLab account has been locked due to an excessive amount of unsuccessful sign in attempts. Your account will automatically unlock in %{duration} or you may click the link below to unlock now."
+msgid "Your GitLab account has been locked due to an excessive number of unsuccessful sign in attempts. You can wait for your account to automatically unlock in %{duration} or you can click the link below to unlock now."
msgstr ""
msgid "Your GitLab account request has been approved!"
@@ -39613,6 +40174,9 @@ msgstr ""
msgid "Your commit email is used for web based operations, such as edits and merges."
msgstr ""
+msgid "Your current password is required to register a two-factor authenticator app."
+msgstr ""
+
msgid "Your dashboard has been copied. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
@@ -39712,6 +40276,9 @@ msgstr ""
msgid "Your project limit is %{limit} projects! Please contact your administrator to increase it"
msgstr ""
+msgid "Your project will be created at:"
+msgstr ""
+
msgid "Your projects"
msgstr ""
@@ -39751,11 +40318,14 @@ msgstr ""
msgid "Your subscription expired!"
msgstr ""
-msgid "Your subscription has been downgraded."
-msgstr ""
-
-msgid "Your subscription will expire in %{remaining_days}."
-msgstr ""
+msgid "Your subscription will expire in %{remaining_days} day."
+msgid_plural "Your subscription will expire in %{remaining_days} days."
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+msgstr[5] ""
msgid "Your username is %{username}."
msgstr ""
@@ -39970,6 +40540,9 @@ msgstr ""
msgid "cannot merge"
msgstr ""
+msgid "cannot not be used for user namespace"
+msgstr ""
+
msgid "ciReport|%{degradedNum} degraded"
msgstr ""
@@ -40297,6 +40870,9 @@ msgstr ""
msgid "created %{timeAgo}"
msgstr ""
+msgid "created %{timeAgo} by %{author}"
+msgstr ""
+
msgid "created by"
msgstr ""
@@ -40345,9 +40921,6 @@ msgstr ""
msgid "does not have a supported extension. Only %{extension_list} are supported"
msgstr ""
-msgid "domain is not authorized for sign-up."
-msgstr ""
-
msgid "download it"
msgstr ""
@@ -40369,22 +40942,13 @@ msgstr ""
msgid "email '%{email}' is not a verified email."
msgstr ""
-msgid "email does not match the allowed domain of %{email_domains}"
-msgid_plural "email does not match the allowed domains: %{email_domains}"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
-msgstr[4] ""
-msgstr[5] ""
-
msgid "enabled"
msgstr ""
msgid "encrypted: needs to be a :required, :optional or :migrating!"
msgstr ""
-msgid "ending with MIME type format is not allowed."
+msgid "ending with a reserved file extension is not allowed."
msgstr ""
msgid "entries cannot be larger than 255 characters"
@@ -40408,6 +40972,9 @@ msgstr ""
msgid "estimateCommand|%{slash_command} overwrites the total estimated time."
msgstr ""
+msgid "example.com"
+msgstr ""
+
msgid "exceeds the limit of %{bytes} bytes"
msgstr ""
@@ -40462,9 +41029,6 @@ msgstr ""
msgid "fork"
msgstr ""
-msgid "fork this project"
-msgstr ""
-
msgid "from"
msgstr ""
@@ -40477,6 +41041,9 @@ msgstr[3] ""
msgstr[4] ""
msgstr[5] ""
+msgid "frontmatter"
+msgstr ""
+
msgid "group"
msgstr ""
@@ -40504,6 +41071,9 @@ msgstr ""
msgid "has been completed."
msgstr ""
+msgid "has too deep level of nesting"
+msgstr ""
+
msgid "help"
msgstr ""
@@ -40537,9 +41107,21 @@ msgstr ""
msgid "in"
msgstr ""
+msgid "in Infrastructure :: Kubernetes clusters"
+msgstr ""
+
+msgid "in all GitLab"
+msgstr ""
+
+msgid "in group"
+msgstr ""
+
msgid "in group %{link_to_group}"
msgstr ""
+msgid "in project"
+msgstr ""
+
msgid "in project %{link_to_project}"
msgstr ""
@@ -40585,16 +41167,19 @@ msgstr ""
msgid "is not a valid X509 certificate."
msgstr ""
-msgid "is not allowed since the group is not top-level group."
+msgid "is not allowed for sign-up."
msgstr ""
-msgid "is not allowed. Try again with a different email address, or contact your GitLab admin."
+msgid "is not allowed for this group."
msgstr ""
-msgid "is not allowed. We do not currently support project-level iterations"
+msgid "is not allowed for this project."
+msgstr ""
+
+msgid "is not allowed since the group is not top-level group."
msgstr ""
-msgid "is not from an allowed domain."
+msgid "is not allowed. We do not currently support project-level iterations"
msgstr ""
msgid "is not in the group enforcing Group Managed Account"
@@ -40687,6 +41272,9 @@ msgstr ""
msgid "log in"
msgstr ""
+msgid "managed"
+msgstr ""
+
msgid "manual"
msgstr ""
@@ -40738,6 +41326,9 @@ msgstr ""
msgid "mrWidget| Please restore it or use a different %{missingBranchName} branch"
msgstr ""
+msgid "mrWidget|%{linkStart}Set up now%{linkEnd} to analyze your source code for known security vulnerabilities."
+msgstr ""
+
msgid "mrWidget|%{mergeError}."
msgstr ""
@@ -40822,6 +41413,9 @@ msgstr[3] ""
msgstr[4] ""
msgstr[5] ""
+msgid "mrWidget|Create issue to resolve all threads"
+msgstr ""
+
msgid "mrWidget|Delete source branch"
msgstr ""
@@ -40831,12 +41425,18 @@ msgstr ""
msgid "mrWidget|Did not close"
msgstr ""
+msgid "mrWidget|Dismiss"
+msgstr ""
+
msgid "mrWidget|Email patches"
msgstr ""
msgid "mrWidget|Failed to load deployment statistics"
msgstr ""
+msgid "mrWidget|Hide %{widget} details"
+msgstr ""
+
msgid "mrWidget|If the %{missingBranchName} branch exists in your local repository, you can merge this merge request manually using the command line"
msgstr ""
@@ -40936,9 +41536,6 @@ msgstr ""
msgid "mrWidget|Request to merge"
msgstr ""
-msgid "mrWidget|Resolve all threads in new issue"
-msgstr ""
-
msgid "mrWidget|Resolve conflicts"
msgstr ""
@@ -40954,6 +41551,9 @@ msgstr ""
msgid "mrWidget|Revoke approval"
msgstr ""
+msgid "mrWidget|SAST and Secret Detection is not enabled."
+msgstr ""
+
msgid "mrWidget|Set by %{merge_author} to be added to the merge train when the pipeline succeeds"
msgstr ""
@@ -40963,6 +41563,9 @@ msgstr ""
msgid "mrWidget|Set by %{merge_author} to start a merge train when the pipeline succeeds"
msgstr ""
+msgid "mrWidget|Show %{widget} details"
+msgstr ""
+
msgid "mrWidget|The changes were merged into"
msgstr ""
@@ -40975,6 +41578,9 @@ msgstr ""
msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure, or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
msgstr ""
+msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure."
+msgstr ""
+
msgid "mrWidget|The source branch has been deleted"
msgstr ""
@@ -41017,6 +41623,9 @@ msgstr ""
msgid "mrWidget|You can merge after removing denied licenses"
msgstr ""
+msgid "mrWidget|You can only merge once this merge request is approved."
+msgstr ""
+
msgid "mrWidget|Your password"
msgstr ""
@@ -41053,6 +41662,9 @@ msgstr ""
msgid "must be less than the limit of %{tag_limit} tags"
msgstr ""
+msgid "must be set for a project namespace"
+msgstr ""
+
msgid "must be unique by status and elapsed time within a policy"
msgstr ""
@@ -41170,6 +41782,9 @@ msgstr ""
msgid "pipeline"
msgstr ""
+msgid "pipeline schedules documentation"
+msgstr ""
+
msgid "pod_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
msgstr ""
@@ -41227,16 +41842,25 @@ msgstr ""
msgid "project name"
msgstr ""
+msgid "project namespace cannot be the parent of another namespace"
+msgstr ""
+
msgid "projects"
msgstr ""
msgid "quick actions"
msgstr ""
-msgid "reCAPTCHA Private Key"
+msgid "reCAPTCHA"
+msgstr ""
+
+msgid "reCAPTCHA helps prevent credential stuffing."
msgstr ""
-msgid "reCAPTCHA Site Key"
+msgid "reCAPTCHA private key"
+msgstr ""
+
+msgid "reCAPTCHA site key"
msgstr ""
msgid "recent activity"
@@ -41467,6 +42091,9 @@ msgstr ""
msgid "user avatar"
msgstr ""
+msgid "user namespace cannot be the parent of another namespace"
+msgstr ""
+
msgid "user preferences"
msgstr ""
@@ -41563,3 +42190,9 @@ msgstr ""
msgid "your settings"
msgstr ""
+msgid "{group}"
+msgstr ""
+
+msgid "{project}"
+msgstr ""
+
diff --git a/locale/as_IN/gitlab.po b/locale/as_IN/gitlab.po
index 3af05fa14f2..56aab7f64da 100644
--- a/locale/as_IN/gitlab.po
+++ b/locale/as_IN/gitlab.po
@@ -14,10 +14,7 @@ msgstr ""
"X-Crowdin-Language: as\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-09-01 22:31\n"
-
-msgid " %{name}, confirm your email address now! "
-msgstr ""
+"PO-Revision-Date: 2021-10-04 20:19\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -92,6 +89,16 @@ msgstr ""
msgid "#general, #development"
msgstr ""
+msgid "%d Alert"
+msgid_plural "%d Alerts"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d Alert:"
+msgid_plural "%d Alerts:"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d Approval"
msgid_plural "%d Approvals"
msgstr[0] ""
@@ -455,7 +462,10 @@ msgstr ""
msgid "%{code_open}Protected:%{code_close} Only exposed to protected branches or tags."
msgstr ""
-msgid "%{commit_author_link} authored %{commit_timeago}"
+msgid "%{commit_author_link} authored %{commit_authored_timeago}"
+msgstr ""
+
+msgid "%{commit_author_link} authored %{commit_authored_timeago} and %{commit_committer_avatar} %{commit_committer_link} committed %{commit_committer_timeago}"
msgstr ""
msgid "%{completedCount} completed weight"
@@ -549,6 +559,15 @@ msgstr ""
msgid "%{doc_link_start}Advanced search%{doc_link_end} is enabled."
msgstr ""
+msgid "%{docs_link_start}Learn about visibility levels.%{docs_link_end}"
+msgstr ""
+
+msgid "%{docs_link_start}What is Large File Storage?%{docs_link_end}"
+msgstr ""
+
+msgid "%{docs_link_start}What is two-factor authentication?%{docs_link_end}"
+msgstr ""
+
msgid "%{due_date} (Past due)"
msgstr ""
@@ -621,9 +640,6 @@ msgstr ""
msgid "%{issueType} actions"
msgstr ""
-msgid "%{issuesCount} issues with a limit of %{maxIssueCount}"
-msgstr ""
-
msgid "%{issuesSize} with a limit of %{maxIssueCount}"
msgstr ""
@@ -681,6 +697,12 @@ msgstr ""
msgid "%{label_for_message} unavailable"
msgstr ""
+msgid "%{learn_more_link}."
+msgstr ""
+
+msgid "%{lessThan} 1 hour"
+msgstr ""
+
msgid "%{lets_encrypt_link_start}Let's Encrypt%{lets_encrypt_link_end} is a free, automated, and open certificate authority (CA) that issues digital certificates to enable HTTPS (SSL/TLS) for sites."
msgstr ""
@@ -693,15 +715,15 @@ msgstr ""
msgid "%{link_start}Learn more%{link_end} about roles."
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
-msgstr ""
-
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
msgstr ""
msgid "%{link_start}Start the title with %{draft_snippet}%{link_end} to prevent a merge request that is a work in progress from being merged before it's ready."
msgstr ""
+msgid "%{link_start}What information does GitLab Inc. collect?%{link_end}"
+msgstr ""
+
msgid "%{listToShow}, and %{awardsListLength} more"
msgstr ""
@@ -854,7 +876,7 @@ msgid_plural "%{securityScanner} results are not available because a pipeline ha
msgstr[0] ""
msgstr[1] ""
-msgid "%{service_ping_link_start}Learn more%{service_ping_link_end} about what information is shared with GitLab Inc."
+msgid "%{service_ping_link_start}What information is shared with GitLab Inc.?%{service_ping_link_end}"
msgstr ""
msgid "%{size} %{unit}"
@@ -890,6 +912,9 @@ msgstr ""
msgid "%{state} epics"
msgstr ""
+msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
+msgstr ""
+
msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
msgstr ""
@@ -949,11 +974,6 @@ msgstr ""
msgid "%{template_project_id} is unknown or invalid"
msgstr ""
-msgid "%{text} %{files}"
-msgid_plural "%{text} %{files} files"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%{text} is available"
msgstr ""
@@ -1038,9 +1058,6 @@ msgstr ""
msgid "%{wildcards_link_start}Wildcards%{wildcards_link_end} such as %{code_tag_start}v*%{code_tag_end} or %{code_tag_start}*-release%{code_tag_end} are supported."
msgstr ""
-msgid "&lt; 1 hour"
-msgstr ""
-
msgid "'%{data}' at %{location} does not match format: %{format}"
msgstr ""
@@ -1124,9 +1141,6 @@ msgstr ""
msgid "(we need your current password to confirm your changes)"
msgstr ""
-msgid "* * * * *"
-msgstr ""
-
msgid "+ %{amount} more"
msgstr ""
@@ -1193,10 +1207,10 @@ msgstr ""
msgid "."
msgstr ""
-msgid "0 bytes"
+msgid "/"
msgstr ""
-msgid "0 for unlimited, only effective with remote storage enabled."
+msgid "0 bytes"
msgstr ""
msgid "0t1DgySidms"
@@ -1326,6 +1340,9 @@ msgstr ""
msgid "1000+"
msgstr ""
+msgid "192.168.0.0/24"
+msgstr ""
+
msgid "1st contribution!"
msgstr ""
@@ -1479,9 +1496,6 @@ msgstr ""
msgid "A plain HTML site that uses Netlify for CI/CD instead of GitLab, but still with all the other great GitLab features"
msgstr ""
-msgid "A plain-text response to show to clients that hit the rate limit."
-msgstr ""
-
msgid "A platform value can be web, mob or app."
msgstr ""
@@ -1563,7 +1577,7 @@ msgstr ""
msgid "APIFuzzing|Configure HTTP basic authentication values. Other authentication methods are supported. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
+msgid "APIFuzzing|Customize your project's API fuzzing configuration options and copy the code snippet to your .gitlab-ci.yml file to apply any changes. Note that this tool does not reflect or update your .gitlab-ci.yml file automatically. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
msgstr ""
msgid "APIFuzzing|Enable authentication"
@@ -1626,9 +1640,6 @@ msgstr ""
msgid "APIFuzzing|To prevent a security leak, authentication info must be added as a %{ciVariablesLinkStart}CI variable%{ciVariablesLinkEnd}. As a user with maintainer access rights, you can manage CI variables in the %{ciSettingsLinkStart}Settings%{ciSettingsLinkEnd} area."
msgstr ""
-msgid "APIFuzzing|Use this tool to generate API fuzzing configuration YAML to copy into your .gitlab-ci.yml file. This tool does not reflect or update your .gitlab-ci.yml file automatically."
-msgstr ""
-
msgid "APIFuzzing|Username for basic authentication"
msgstr ""
@@ -1680,9 +1691,6 @@ msgstr ""
msgid "Abuse reports notification email"
msgstr ""
-msgid "Abuse reports will be sent to this address if it is set. Abuse reports are always available in the admin area."
-msgstr ""
-
msgid "Accept invitation"
msgstr ""
@@ -1719,12 +1727,18 @@ msgstr ""
msgid "Access granted"
msgstr ""
+msgid "Access key ID"
+msgstr ""
+
msgid "Access requests"
msgstr ""
msgid "Access to '%{classification_label}' not allowed"
msgstr ""
+msgid "Access tokens expire after 2 hours. A refresh token may be used at any time to generate a new access token. Non-expiring access tokens are deprecated. Clear this setting to enable backward compatibility."
+msgstr ""
+
msgid "AccessDropdown|Deploy Keys"
msgstr ""
@@ -2037,6 +2051,9 @@ msgstr ""
msgid "Add new directory"
msgstr ""
+msgid "Add new service account"
+msgstr ""
+
msgid "Add or remove previously merged commits"
msgstr ""
@@ -2274,6 +2291,9 @@ msgstr ""
msgid "AdminArea|Features"
msgstr ""
+msgid "AdminArea|Get security updates from GitLab and stay up to date"
+msgstr ""
+
msgid "AdminArea|Groups"
msgstr ""
@@ -2313,6 +2333,12 @@ msgstr ""
msgid "AdminArea|Reporter"
msgstr ""
+msgid "AdminArea|Sign up for the GitLab Security Newsletter to get notified for security updates."
+msgstr ""
+
+msgid "AdminArea|Sign up for the GitLab newsletter"
+msgstr ""
+
msgid "AdminArea|Stop all jobs"
msgstr ""
@@ -2382,9 +2408,15 @@ msgstr ""
msgid "AdminSettings|Disable public access to Pages sites"
msgstr ""
+msgid "AdminSettings|Display a banner on merge requests in projects with no pipelines to initiate steps to add a .gitlab-ci.yml file."
+msgstr ""
+
msgid "AdminSettings|Domain verification is an essential security measure for public GitLab sites. Users are required to demonstrate they control a domain before it is enabled. %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "AdminSettings|Enable pipeline suggestion banner"
+msgstr ""
+
msgid "AdminSettings|Enable shared runners for new projects"
msgstr ""
@@ -2856,10 +2888,10 @@ msgstr ""
msgid "Admin|Quarterly reconciliation will occur on %{qrtlyDate}"
msgstr ""
-msgid "Admin|The number of max seats used for your namespace is currently exceeding the number of seats in your subscription. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgid "Admin|The number of max seats in your namespace exceeds the number of seats in your subscription. On %{qrtlyDate}, quarterly reconciliation occurs and you are automatically billed a prorated amount for the overage. No action is needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice. For more information about the timing of the invoicing process, view the documentation."
msgstr ""
-msgid "Admin|The number of maximum users for your instance is currently exceeding the number of users in license. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgid "Admin|The number of max users in your instance exceeds the number of users in your license. On %{qrtlyDate}, quarterly reconciliation occurs and you are automatically billed a prorated amount for the overage. No action is needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice. For more information about the timing of the invoicing process, view the documentation."
msgstr ""
msgid "Admin|View pending user approvals"
@@ -2880,9 +2912,6 @@ msgstr ""
msgid "Advanced export options"
msgstr ""
-msgid "Advanced permissions, Large File Storage and Two-Factor authentication settings."
-msgstr ""
-
msgid "After a successful password update you will be redirected to login screen."
msgstr ""
@@ -2901,13 +2930,14 @@ msgstr ""
msgid "After you've reviewed these contribution guidelines, you'll be all set to"
msgstr ""
+msgid "Akismet"
+msgstr ""
+
msgid "Akismet API Key"
msgstr ""
-msgid "Alert"
-msgid_plural "Alerts"
-msgstr[0] ""
-msgstr[1] ""
+msgid "Akismet helps prevent the creation of spam issues in public projects."
+msgstr ""
msgid "AlertManagement|Acknowledged"
msgstr ""
@@ -3263,6 +3293,9 @@ msgstr ""
msgid "All (default)"
msgstr ""
+msgid "All GitLab"
+msgstr ""
+
msgid "All Members"
msgstr ""
@@ -3377,6 +3410,9 @@ msgstr ""
msgid "Allow this secondary node to replicate content on Object Storage"
msgstr ""
+msgid "Allow use of licensed EE features"
+msgstr ""
+
msgid "Allow users to dismiss the broadcast message"
msgstr ""
@@ -3452,9 +3488,6 @@ msgstr ""
msgid "Amazon authentication is not %{link_start}correctly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
-msgid "Amount of time (in hours) that users are allowed to skip forced configuration of two-factor authentication"
-msgstr ""
-
msgid "An %{link_start}alert%{link_end} with the same fingerprint is already open. To change the status of this alert, resolve the linked alert."
msgstr ""
@@ -3515,12 +3548,6 @@ msgstr ""
msgid "An error occurred when removing the label."
msgstr ""
-msgid "An error occurred when toggling the notification subscription"
-msgstr ""
-
-msgid "An error occurred when updating the issue weight"
-msgstr ""
-
msgid "An error occurred when updating the title"
msgstr ""
@@ -3569,6 +3596,9 @@ msgstr ""
msgid "An error occurred while enabling Service Desk."
msgstr ""
+msgid "An error occurred while fetching Markdown preview"
+msgstr ""
+
msgid "An error occurred while fetching ancestors"
msgstr ""
@@ -3599,9 +3629,6 @@ msgstr ""
msgid "An error occurred while fetching label colors."
msgstr ""
-msgid "An error occurred while fetching markdown preview"
-msgstr ""
-
msgid "An error occurred while fetching participants"
msgstr ""
@@ -3617,9 +3644,6 @@ msgstr ""
msgid "An error occurred while fetching reference"
msgstr ""
-msgid "An error occurred while fetching sidebar data"
-msgstr ""
-
msgid "An error occurred while fetching tags. Retry the search."
msgstr ""
@@ -3695,6 +3719,9 @@ msgstr ""
msgid "An error occurred while loading merge requests."
msgstr ""
+msgid "An error occurred while loading projects."
+msgstr ""
+
msgid "An error occurred while loading the Needs tab."
msgstr ""
@@ -3929,12 +3956,6 @@ msgstr ""
msgid "Any Milestone"
msgstr ""
-msgid "Any branch"
-msgstr ""
-
-msgid "Any eligible user"
-msgstr ""
-
msgid "Any encrypted tokens"
msgstr ""
@@ -3953,6 +3974,9 @@ msgstr ""
msgid "Any namespace"
msgstr ""
+msgid "App Engine description and apps that are suitable for this deployment target"
+msgstr ""
+
msgid "App ID"
msgstr ""
@@ -4101,6 +4125,11 @@ msgstr ""
msgid "Apply"
msgstr ""
+msgid "Apply %d suggestion"
+msgid_plural "Apply %d suggestions"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Apply a label"
msgstr ""
@@ -4110,13 +4139,10 @@ msgstr ""
msgid "Apply suggestion"
msgstr ""
-msgid "Apply suggestions"
-msgstr ""
-
msgid "Apply template"
msgstr ""
-msgid "Apply this approval rule to any branch or a specific protected branch."
+msgid "Apply this approval rule to all branches or a specific protected branch."
msgstr ""
msgid "Applying"
@@ -4259,9 +4285,6 @@ msgstr ""
msgid "ApprovalSettings|Prevent editing approval rules in projects and merge requests."
msgstr ""
-msgid "ApprovalSettings|Prevent editing approval rules in projects and merge requests. "
-msgstr ""
-
msgid "ApprovalSettings|Remove all approvals when commits are added to the source branch."
msgstr ""
@@ -4277,6 +4300,9 @@ msgstr ""
msgid "ApprovalSettings|This setting is configured at the instance level and can only be changed by an administrator."
msgstr ""
+msgid "ApprovalSettings|This setting is configured in %{groupName} and can only be changed by an administrator or group owner."
+msgstr ""
+
msgid "ApprovalStatusTooltip|Adheres to separation of duties"
msgstr ""
@@ -4763,9 +4789,6 @@ msgstr ""
msgid "Authenticated API rate limit period in seconds"
msgstr ""
-msgid "Authenticated API request rate limit"
-msgstr ""
-
msgid "Authenticated API requests"
msgstr ""
@@ -4775,10 +4798,10 @@ msgstr ""
msgid "Authenticated Git LFS request rate limit"
msgstr ""
-msgid "Authenticated web rate limit period in seconds"
+msgid "Authenticated Git LFS requests"
msgstr ""
-msgid "Authenticated web request rate limit"
+msgid "Authenticated web rate limit period in seconds"
msgstr ""
msgid "Authenticated web requests"
@@ -5156,9 +5179,6 @@ msgstr ""
msgid "Below you will find all the groups that are public."
msgstr ""
-msgid "Beta"
-msgstr ""
-
msgid "Bi-weekly code coverage"
msgstr ""
@@ -5398,6 +5418,21 @@ msgstr ""
msgid "Board scope affects which issues are displayed for anyone who visits this board"
msgstr ""
+msgid "BoardNewEpic|Groups"
+msgstr ""
+
+msgid "BoardNewEpic|Loading groups"
+msgstr ""
+
+msgid "BoardNewEpic|No matching results"
+msgstr ""
+
+msgid "BoardNewEpic|Search groups"
+msgstr ""
+
+msgid "BoardNewEpic|Select a group"
+msgstr ""
+
msgid "BoardNewIssue|No matching results"
msgstr ""
@@ -5475,6 +5510,9 @@ msgstr ""
msgid "Boards|An error occurred while creating the list. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching child groups. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching group projects. Please try again."
msgstr ""
@@ -5807,6 +5845,9 @@ msgstr ""
msgid "Bulk update"
msgstr ""
+msgid "BulkImports|Re-import creates a new group. It does not sync with the existing group."
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -5816,6 +5857,9 @@ msgstr ""
msgid "BulkImport|From source group"
msgstr ""
+msgid "BulkImport|Group import history"
+msgstr ""
+
msgid "BulkImport|Import failed: Destination cannot be a subgroup of the source group. Change the destination and try again."
msgstr ""
@@ -5828,9 +5872,18 @@ msgstr ""
msgid "BulkImport|Importing the group failed"
msgstr ""
+msgid "BulkImport|Last imported to %{link}"
+msgstr ""
+
msgid "BulkImport|Name already exists."
msgstr ""
+msgid "BulkImport|New group"
+msgstr ""
+
+msgid "BulkImport|No history is available"
+msgstr ""
+
msgid "BulkImport|No parent"
msgstr ""
@@ -5843,6 +5896,9 @@ msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} matching filter \"%{filter}\" from %{link}"
msgstr ""
+msgid "BulkImport|Source group"
+msgstr ""
+
msgid "BulkImport|To new group"
msgstr ""
@@ -5852,6 +5908,9 @@ msgstr ""
msgid "BulkImport|You have no groups to import"
msgstr ""
+msgid "BulkImport|Your imported groups will appear here."
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -6094,6 +6153,9 @@ msgstr ""
msgid "Can be manually deployed to"
msgstr ""
+msgid "Can be overridden in each project."
+msgstr ""
+
msgid "Can create groups:"
msgstr ""
@@ -6196,6 +6258,9 @@ msgstr ""
msgid "Cancelling Preview"
msgstr ""
+msgid "Cannot assign a confidential epic to a non-confidential issue. Make the issue confidential and try again"
+msgstr ""
+
msgid "Cannot be assigned to other projects."
msgstr ""
@@ -6247,9 +6312,6 @@ msgstr ""
msgid "Cannot refer to a group %{timebox_type} by an internal id!"
msgstr ""
-msgid "Cannot set confidential epic for a non-confidential issue"
-msgstr ""
-
msgid "Cannot show preview. For previews on sketch files, they must have the file format introduced by Sketch version 43 and above."
msgstr ""
@@ -6487,15 +6549,15 @@ msgstr ""
msgid "Check out, review, and merge locally"
msgstr ""
-msgid "Check the %{docs_link_start}documentation%{docs_link_end}."
-msgstr ""
-
msgid "Check the current instance configuration "
msgstr ""
msgid "Check the elasticsearch.log file to debug why the migration was halted and make any changes before retrying the migration. When you fix the cause of the failure, click \"Retry migration\", and the migration will be scheduled to be retried in the background."
msgstr ""
+msgid "Check with your administrator."
+msgstr ""
+
msgid "Check your Docker images for known vulnerabilities."
msgstr ""
@@ -6526,6 +6588,9 @@ msgstr ""
msgid "Checkout"
msgstr ""
+msgid "Checkout|$%{selectedPlanPrice} per 10 GB storage per pack"
+msgstr ""
+
msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 minutes"
msgstr ""
@@ -6546,17 +6611,23 @@ msgstr ""
msgid "Checkout|%{name}'s GitLab subscription"
msgstr ""
-msgid "Checkout|%{selectedPlanText} plan"
+msgid "Checkout|%{name}'s storage subscription"
msgstr ""
-msgid "Checkout|%{startDate} - %{endDate}"
+msgid "Checkout|%{quantity} GB of storage"
msgstr ""
-msgid "Checkout|%{totalCiMinutes} CI minute"
-msgid_plural "Checkout|%{totalCiMinutes} CI minutes"
+msgid "Checkout|%{quantity} storage pack"
+msgid_plural "Checkout|%{quantity} storage packs"
msgstr[0] ""
msgstr[1] ""
+msgid "Checkout|%{selectedPlanText} plan"
+msgstr ""
+
+msgid "Checkout|%{startDate} - %{endDate}"
+msgstr ""
+
msgid "Checkout|%{totalCiMinutes} CI minutes"
msgstr ""
@@ -6632,6 +6703,9 @@ msgstr ""
msgid "Checkout|Failed to register credit card. Please try again."
msgstr ""
+msgid "Checkout|GB"
+msgstr ""
+
msgid "Checkout|GitLab group"
msgstr ""
@@ -6668,6 +6742,9 @@ msgstr ""
msgid "Checkout|State"
msgstr ""
+msgid "Checkout|Storage packs"
+msgstr ""
+
msgid "Checkout|Street address"
msgstr ""
@@ -6689,6 +6766,9 @@ msgstr ""
msgid "Checkout|Total minutes: %{quantity}"
msgstr ""
+msgid "Checkout|Total storage: %{quantity} GB"
+msgstr ""
+
msgid "Checkout|Users"
msgstr ""
@@ -6698,16 +6778,25 @@ msgstr ""
msgid "Checkout|Your organization"
msgstr ""
+msgid "Checkout|Your storage subscription has the same term as your main subscription, and the price is prorated accordingly."
+msgstr ""
+
msgid "Checkout|Your subscription will be applied to this group"
msgstr ""
msgid "Checkout|Zip code"
msgstr ""
+msgid "Checkout|a storage subscription"
+msgstr ""
+
msgid "Checkout|company or team"
msgstr ""
-msgid "Checkout|x 1,000 minutes per pack = %{strong}"
+msgid "Checkout|minutes"
+msgstr ""
+
+msgid "Checkout|x %{quantity} %{units} per pack ="
msgstr ""
msgid "Cherry-pick this commit"
@@ -7064,6 +7153,9 @@ msgstr ""
msgid "CloneIssue|Cannot clone issue to target project as it is pending deletion."
msgstr ""
+msgid "CloneIssue|Cannot clone issues of '%{issue_type}' type."
+msgstr ""
+
msgid "Cloned this issue to %{path_to_project}."
msgstr ""
@@ -7118,7 +7210,10 @@ msgstr ""
msgid "Closes this %{quick_action_target}."
msgstr ""
-msgid "Cloud licenses can not be removed."
+msgid "Cloud Functions description and apps that are suitable for this deployment target"
+msgstr ""
+
+msgid "Cloud Run description and apps that are suitable for this deployment target"
msgstr ""
msgid "Cluster"
@@ -7145,6 +7240,12 @@ msgstr ""
msgid "ClusterAgents|Access tokens"
msgstr ""
+msgid "ClusterAgents|Agent might not be connected to GitLab"
+msgstr ""
+
+msgid "ClusterAgents|Agent never connected to GitLab"
+msgstr ""
+
msgid "ClusterAgents|Alternative installation methods"
msgstr ""
@@ -7160,6 +7261,12 @@ msgstr ""
msgid "ClusterAgents|Configuration"
msgstr ""
+msgid "ClusterAgents|Connected"
+msgstr ""
+
+msgid "ClusterAgents|Connection status"
+msgstr ""
+
msgid "ClusterAgents|Copy token"
msgstr ""
@@ -7178,6 +7285,9 @@ msgstr ""
msgid "ClusterAgents|For alternative installation methods %{linkStart}go to the documentation%{linkEnd}."
msgstr ""
+msgid "ClusterAgents|For more troubleshooting information go to"
+msgstr ""
+
msgid "ClusterAgents|Go to the repository"
msgstr ""
@@ -7193,18 +7303,30 @@ msgstr ""
msgid "ClusterAgents|Integrate with the GitLab Agent"
msgstr ""
-msgid "ClusterAgents|Last used"
+msgid "ClusterAgents|Last connected %{timeAgo}."
+msgstr ""
+
+msgid "ClusterAgents|Last contact"
msgstr ""
msgid "ClusterAgents|Learn how to create an agent access token"
msgstr ""
+msgid "ClusterAgents|Make sure you are using a valid token."
+msgstr ""
+
msgid "ClusterAgents|Name"
msgstr ""
msgid "ClusterAgents|Never"
msgstr ""
+msgid "ClusterAgents|Never connected"
+msgstr ""
+
+msgid "ClusterAgents|Not connected"
+msgstr ""
+
msgid "ClusterAgents|Read more about getting started"
msgstr ""
@@ -7226,6 +7348,9 @@ msgstr ""
msgid "ClusterAgents|Select which Agent you want to install"
msgstr ""
+msgid "ClusterAgents|The Agent has not been connected in a long time. There might be a connectivity issue. Last contact was %{timeAgo}."
+msgstr ""
+
msgid "ClusterAgents|The GitLab Agent also requires %{linkStart}enabling the Agent Server%{linkEnd}"
msgstr ""
@@ -7253,9 +7378,6 @@ msgstr ""
msgid "ClusterAgents|You will need to create a token to connect to your agent"
msgstr ""
-msgid "ClusterAgent|This feature is only available for premium plans"
-msgstr ""
-
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -7445,9 +7567,6 @@ msgstr ""
msgid "ClusterIntegration|Create Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Create a provision role on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the account and external ID above. %{startMoreInfoLink}More information%{endLink}"
-msgstr ""
-
msgid "ClusterIntegration|Create cluster on"
msgstr ""
@@ -7880,7 +7999,7 @@ msgstr ""
msgid "ClusterIntegration|Subnets"
msgstr ""
-msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provisioned role, first create one on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the above account and external IDs. %{startMoreInfoLink}More information%{endLink}"
+msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provisioned role, first create one on %{awsLinkStart}Amazon Web Services %{awsLinkEnd} using the above account and external IDs. %{moreInfoStart}More information%{moreInfoEnd}"
msgstr ""
msgid "ClusterIntegration|The Kubernetes certificate used to authenticate to the cluster."
@@ -8114,6 +8233,9 @@ msgstr ""
msgid "Collapse replies"
msgstr ""
+msgid "Collapse settings section"
+msgstr ""
+
msgid "Collapse sidebar"
msgstr ""
@@ -8132,6 +8254,9 @@ msgstr ""
msgid "Comma-separated list of email addresses."
msgstr ""
+msgid "Comma-separated list of users allowed to exceed the rate limit."
+msgstr ""
+
msgid "Comma-separated, e.g. '1.1.1.1, 2.2.2.0/24'"
msgstr ""
@@ -8452,6 +8577,9 @@ msgstr ""
msgid "Configure %{repository_checks_link_start}repository checks%{link_end} and %{housekeeping_link_start}housekeeping%{link_end} on repositories."
msgstr ""
+msgid "Configure CAPTCHAs, IP address limits, and other anti-spam measures."
+msgstr ""
+
msgid "Configure Dependency Scanning in `.gitlab-ci.yml` using the GitLab managed template. You can [add variable overrides](https://docs.gitlab.com/ee/user/application_security/dependency_scanning/#customizing-the-dependency-scanning-settings) to customize Dependency Scanning settings."
msgstr ""
@@ -8488,16 +8616,13 @@ msgstr ""
msgid "Configure a %{codeStart}.gitlab-webide.yml%{codeEnd} file in the %{codeStart}.gitlab%{codeEnd} directory to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
msgstr ""
-msgid "Configure existing installation"
-msgstr ""
-
-msgid "Configure limit for notes created per minute by web and API requests."
+msgid "Configure advanced permissions, Large File Storage, and two-factor authentication settings."
msgstr ""
-msgid "Configure limits for Project/Group Import/Export."
+msgid "Configure approvals by authors and committers on all projects."
msgstr ""
-msgid "Configure limits for web and API requests."
+msgid "Configure existing installation"
msgstr ""
msgid "Configure paths to be protected by Rack Attack."
@@ -8512,10 +8637,13 @@ msgstr ""
msgid "Configure settings for Advanced Search with Elasticsearch."
msgstr ""
+msgid "Configure specific limits for Files API requests that supersede the general user and IP rate limits."
+msgstr ""
+
msgid "Configure specific limits for Git LFS requests that supersede the general user and IP rate limits."
msgstr ""
-msgid "Configure specific limits for Packages API requests that supersede the general user and IP rate limits."
+msgid "Configure specific limits for deprecated API requests that supersede the general user and IP rate limits."
msgstr ""
msgid "Configure the %{link} integration."
@@ -8527,6 +8655,9 @@ msgstr ""
msgid "Configure the way a user creates a new account."
msgstr ""
+msgid "Configure via Merge Request"
+msgstr ""
+
msgid "Configure which lists are shown for anyone who visits this board"
msgstr ""
@@ -8995,6 +9126,9 @@ msgstr ""
msgid "Content parsed with %{link}."
msgstr ""
+msgid "ContentEditor|Table of Contents"
+msgstr ""
+
msgid "ContentEditor|You have to provide a renderMarkdown function or a custom serializer"
msgstr ""
@@ -9181,6 +9315,9 @@ msgstr ""
msgid "Copy link to chart"
msgstr ""
+msgid "Copy prefix"
+msgstr ""
+
msgid "Copy reference"
msgstr ""
@@ -9211,6 +9348,9 @@ msgstr ""
msgid "Copy value"
msgstr ""
+msgid "Corpus Management"
+msgstr ""
+
msgid "Corpus Management|Are you sure you want to delete the corpus?"
msgstr ""
@@ -9439,6 +9579,9 @@ msgstr ""
msgid "Create commit"
msgstr ""
+msgid "Create common files more quickly, and standardize their format."
+msgstr ""
+
msgid "Create confidential merge request"
msgstr ""
@@ -9472,6 +9615,9 @@ msgstr ""
msgid "Create issue"
msgstr ""
+msgid "Create issue to resolve all threads"
+msgstr ""
+
msgid "Create iteration"
msgstr ""
@@ -9526,6 +9672,9 @@ msgstr ""
msgid "Create new..."
msgstr ""
+msgid "Create or import your first project"
+msgstr ""
+
msgid "Create project"
msgstr ""
@@ -9883,7 +10032,7 @@ msgstr ""
msgid "Custom notification events"
msgstr ""
-msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notificationLinkStart} notification emails%{notificationLinkEnd}."
+msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notificationLinkStart}notification emails%{notificationLinkEnd}."
msgstr ""
msgid "Custom project templates"
@@ -10082,10 +10231,10 @@ msgid_plural "CycleAnalytics|Showing %{subjectFilterText} and %{selectedLabelsCo
msgstr[0] ""
msgstr[1] ""
-msgid "CycleAnalytics|Showing data for group '%{groupName}' and %{selectedProjectCount} projects from %{startDate} to %{endDate}"
+msgid "CycleAnalytics|Showing data for group '%{groupName}' and %{selectedProjectCount} projects from %{createdAfter} to %{createdBefore}"
msgstr ""
-msgid "CycleAnalytics|Showing data for group '%{groupName}' from %{startDate} to %{endDate}"
+msgid "CycleAnalytics|Showing data for group '%{groupName}' from %{createdAfter} to %{createdBefore}"
msgstr ""
msgid "CycleAnalytics|Stages"
@@ -10319,6 +10468,9 @@ msgstr ""
msgid "DastProfiles|Manage profiles"
msgstr ""
+msgid "DastProfiles|Manage site profiles"
+msgstr ""
+
msgid "DastProfiles|Minimum = 0 (no timeout enabled), Maximum = 2880 minutes"
msgstr ""
@@ -10394,6 +10546,9 @@ msgstr ""
msgid "DastProfiles|Scanner name"
msgstr ""
+msgid "DastProfiles|Schedule"
+msgstr ""
+
msgid "DastProfiles|Select branch"
msgstr ""
@@ -10463,7 +10618,7 @@ msgstr ""
msgid "DastProfiles|Website"
msgstr ""
-msgid "DastProfiles|You can either choose a passive scan or validate the target site in your chosen site profile. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
+msgid "DastProfiles|You can either choose a passive scan or validate the target site from the site profile management page. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
msgstr ""
msgid "DastProfiles|You cannot run an active scan against an unvalidated site."
@@ -10636,7 +10791,7 @@ msgstr ""
msgid "Days to merge"
msgstr ""
-msgid "Deactivate dormant users after 90 days of inactivity. Users can return to active status by signing in to their account. While inactive, a user is not counted as an active user in the instance."
+msgid "Deactivate dormant users after 90 days of inactivity"
msgstr ""
msgid "Dear Administrator,"
@@ -10723,10 +10878,10 @@ msgstr ""
msgid "Define a custom pattern with cron syntax"
msgstr ""
-msgid "Define approval settings."
+msgid "Define approval rules."
msgstr ""
-msgid "Define approval settings. %{linkStart}Learn more.%{linkEnd}"
+msgid "Define approval rules. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "Define custom rules for what constitutes spam, independent of Akismet"
@@ -10735,7 +10890,7 @@ msgstr ""
msgid "Define environments in the deploy stage(s) in %{code_open}.gitlab-ci.yml%{code_close} to track deployments here."
msgstr ""
-msgid "Define how approval rules are applied as a merge request moves toward completion."
+msgid "Define how approval rules are applied to merge requests."
msgstr ""
msgid "Definition"
@@ -10750,6 +10905,12 @@ msgstr ""
msgid "DelayedJobs|Are you sure you want to run %{job_name} immediately? This job will run automatically after it's timer finishes."
msgstr ""
+msgid "DelayedJobs|Are you sure you want to run %{job_name} immediately? This job will run automatically after its timer finishes."
+msgstr ""
+
+msgid "DelayedJobs|Run the delayed job now?"
+msgstr ""
+
msgid "DelayedJobs|Start now"
msgstr ""
@@ -11026,6 +11187,12 @@ msgstr ""
msgid "Dependency proxy image prefix"
msgstr ""
+msgid "DependencyProxy|Create a local proxy for storing frequently used upstream images. %{docLinkStart}Learn more%{docLinkEnd} about dependency proxies."
+msgstr ""
+
+msgid "DependencyProxy|Dependency Proxy"
+msgstr ""
+
msgid "DependencyProxy|Toggle Dependency Proxy"
msgstr ""
@@ -11266,6 +11433,9 @@ msgstr ""
msgid "Deployments"
msgstr ""
+msgid "Deployments to Google Kubernetes Engine can be "
+msgstr ""
+
msgid "Deployments|%{deployments} environment impacted."
msgid_plural "Deployments|%{deployments} environments impacted."
msgstr[0] ""
@@ -11295,6 +11465,9 @@ msgstr ""
msgid "Deployment|success"
msgstr ""
+msgid "Deprecated API rate limits"
+msgstr ""
+
msgid "Deprioritize label"
msgstr ""
@@ -11697,6 +11870,16 @@ msgstr ""
msgid "DiffsCompareBaseBranch|(base)"
msgstr ""
+msgid "Diffs|%d addition"
+msgid_plural "Diffs|%d additions"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Diffs|%d deletion"
+msgid_plural "Diffs|%d deletions"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Diffs|No file name available"
msgstr ""
@@ -11706,9 +11889,17 @@ msgstr ""
msgid "Diffs|Show all unchanged lines"
msgstr ""
+msgid "Diffs|Showing %{dropdownStart}%{count} changed file%{dropdownEnd}"
+msgid_plural "Diffs|Showing %{dropdownStart}%{count} changed files%{dropdownEnd}"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Diffs|Something went wrong while fetching diff lines."
msgstr ""
+msgid "Diffs|with %{additions} and %{deletions}"
+msgstr ""
+
msgid "Direct member"
msgstr ""
@@ -11834,9 +12025,6 @@ msgid_plural "Dismiss %d selected vulnerabilities as"
msgstr[0] ""
msgstr[1] ""
-msgid "Dismiss Value Stream Analytics introduction box"
-msgstr ""
-
msgid "Dismiss merge request promotion"
msgstr ""
@@ -12158,6 +12346,9 @@ msgstr ""
msgid "Edit issues"
msgstr ""
+msgid "Edit merge requests"
+msgstr ""
+
msgid "Edit public deploy key"
msgstr ""
@@ -12233,6 +12424,9 @@ msgstr ""
msgid "Elastic|None. Select projects to index."
msgstr ""
+msgid "Eligible users"
+msgstr ""
+
msgid "Email"
msgstr ""
@@ -12362,6 +12556,9 @@ msgstr ""
msgid "Enable"
msgstr ""
+msgid "Enable Amazon EKS integration"
+msgstr ""
+
msgid "Enable Auto DevOps"
msgstr ""
@@ -12395,6 +12592,9 @@ msgstr ""
msgid "Enable SSL verification"
msgstr ""
+msgid "Enable Service Ping"
+msgstr ""
+
msgid "Enable Snowplow tracking"
msgstr ""
@@ -12425,6 +12625,9 @@ msgstr ""
msgid "Enable authenticated Git LFS request rate limit"
msgstr ""
+msgid "Enable authenticated web request rate limit"
+msgstr ""
+
msgid "Enable authentication"
msgstr ""
@@ -12485,7 +12688,7 @@ msgstr ""
msgid "Enable or disable the Pseudonymizer data collection."
msgstr ""
-msgid "Enable or disable version check and service ping."
+msgid "Enable or disable version check and Service Ping."
msgstr ""
msgid "Enable protected paths rate limit"
@@ -12497,18 +12700,12 @@ msgstr ""
msgid "Enable reCAPTCHA"
msgstr ""
-msgid "Enable reCAPTCHA for login"
-msgstr ""
-
-msgid "Enable reCAPTCHA, Invisible Captcha, Akismet and set IP limits. For reCAPTCHA, we currently only support %{recaptcha_v2_link_start}v2%{recaptcha_v2_link_end}"
+msgid "Enable reCAPTCHA for login."
msgstr ""
msgid "Enable repository checks"
msgstr ""
-msgid "Enable service ping"
-msgstr ""
-
msgid "Enable shared runners for all projects and subgroups in this group."
msgstr ""
@@ -12530,7 +12727,10 @@ msgstr ""
msgid "Enable unauthenticated API request rate limit"
msgstr ""
-msgid "Enable unauthenticated request rate limit"
+msgid "Enable unauthenticated web request rate limit"
+msgstr ""
+
+msgid "Enable user deactivation emails"
msgstr ""
msgid "Enable version check"
@@ -12566,9 +12766,6 @@ msgstr ""
msgid "Enabled sources for code import during project creation. OmniAuth must be configured for GitHub"
msgstr ""
-msgid "Enabling this will only make licensed EE features available to projects if the project namespace's plan includes the feature or if the project is public."
-msgstr ""
-
msgid "Encountered an error while rendering: %{err}"
msgstr ""
@@ -12617,9 +12814,6 @@ msgstr ""
msgid "Enter Admin Mode"
msgstr ""
-msgid "Enter IP address range"
-msgstr ""
-
msgid "Enter a number"
msgstr ""
@@ -12632,9 +12826,6 @@ msgstr ""
msgid "Enter at least three characters to search"
msgstr ""
-msgid "Enter domain"
-msgstr ""
-
msgid "Enter in your Bitbucket Server URL and personal access token below"
msgstr ""
@@ -12821,9 +13012,6 @@ msgstr ""
msgid "Environments|Deployment %{status}"
msgstr ""
-msgid "Environments|Dismiss"
-msgstr ""
-
msgid "Environments|Enable review app"
msgstr ""
@@ -12836,9 +13024,6 @@ msgstr ""
msgid "Environments|Environments are places where code gets deployed, such as staging or production."
msgstr ""
-msgid "Environments|Help us improve environments"
-msgstr ""
-
msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
msgstr ""
@@ -12875,6 +13060,9 @@ msgstr ""
msgid "Environments|Note that this action will stop the environment, but it will %{emphasisStart}not%{emphasisEnd} have an effect on any existing deployment due to no “stop environment action†being defined in the %{ciConfigLinkStart}.gitlab-ci.yml%{ciConfigLinkEnd} file."
msgstr ""
+msgid "Environments|Open"
+msgstr ""
+
msgid "Environments|Open live environment"
msgstr ""
@@ -12914,9 +13102,6 @@ msgstr ""
msgid "Environments|Stopping %{environmentName}"
msgstr ""
-msgid "Environments|Take the survey"
-msgstr ""
-
msgid "Environments|There was an error fetching the logs. Please try again."
msgstr ""
@@ -12938,9 +13123,6 @@ msgstr ""
msgid "Environments|You don't have any environments right now"
msgstr ""
-msgid "Environments|Your feedback helps GitLab make environments better for you and other users. Participate and enter a sweepstake to win a USD 30 gift card."
-msgstr ""
-
msgid "Environments|by %{avatar}"
msgstr ""
@@ -13223,7 +13405,7 @@ msgstr ""
msgid "Error parsing CSV file. Please make sure it has"
msgstr ""
-msgid "Error rendering markdown preview"
+msgid "Error rendering Markdown preview"
msgstr ""
msgid "Error saving label update."
@@ -13271,6 +13453,9 @@ msgstr ""
msgid "Error: %{error_message}"
msgstr ""
+msgid "Error: Couldn't load some or all of the changes."
+msgstr ""
+
msgid "Error: No AWS credentials were supplied"
msgstr ""
@@ -13304,6 +13489,9 @@ msgstr ""
msgid "ErrorTracking|Enable error tracking"
msgstr ""
+msgid "ErrorTracking|Error tracking backend"
+msgstr ""
+
msgid "ErrorTracking|If you self-host Sentry, enter your Sentry instance's full URL. If you use Sentry's hosted solution, enter https://sentry.io"
msgstr ""
@@ -13337,6 +13525,12 @@ msgstr ""
msgid "Escalation policies must have at least one rule"
msgstr ""
+msgid "EscalationPolicies|%{clockIcon} IF alert is not %{alertStatus} in %{minutes}"
+msgstr ""
+
+msgid "EscalationPolicies|%{notificationIcon} THEN %{doAction} %{forScheduleOrUser}"
+msgstr ""
+
msgid "EscalationPolicies|+ Add an additional rule"
msgstr ""
@@ -13379,13 +13573,13 @@ msgstr ""
msgid "EscalationPolicies|Escalation policies"
msgstr ""
-msgid "EscalationPolicies|Escalation rules"
+msgid "EscalationPolicies|Escalation policy %{obstacle} in Project %{project}"
msgstr ""
-msgid "EscalationPolicies|Failed to load oncall-schedules"
+msgid "EscalationPolicies|Escalation rules"
msgstr ""
-msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} %{then} THEN %{doAction} %{scheduleOrUser}"
+msgid "EscalationPolicies|Failed to load oncall-schedules"
msgstr ""
msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} minutes"
@@ -13463,18 +13657,36 @@ msgstr ""
msgid "Every %{action} attempt has failed: %{job_error_message}. Please try again."
msgstr ""
+msgid "Every 3 months"
+msgstr ""
+
+msgid "Every 3 months on the %{day} at %{time} %{timezone}"
+msgstr ""
+
+msgid "Every 6 months"
+msgstr ""
+
+msgid "Every 6 months on the %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Every day"
msgstr ""
msgid "Every day (at %{time})"
msgstr ""
+msgid "Every day at %{time} %{timezone}"
+msgstr ""
+
msgid "Every month"
msgstr ""
msgid "Every month (Day %{day} at %{time})"
msgstr ""
+msgid "Every month on the %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Every three months"
msgstr ""
@@ -13489,6 +13701,15 @@ msgstr[1] ""
msgid "Every week (%{weekday} at %{time})"
msgstr ""
+msgid "Every week on %{day} at %{time} %{timezone}"
+msgstr ""
+
+msgid "Every year"
+msgstr ""
+
+msgid "Every year on %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Everyone"
msgstr ""
@@ -13525,9 +13746,6 @@ msgstr ""
msgid "Exactly one of %{attributes} is required"
msgstr ""
-msgid "Example: %{ip_address}. %{read_more_link}."
-msgstr ""
-
msgid "Example: @sub\\.company\\.com$"
msgstr ""
@@ -13594,13 +13812,13 @@ msgstr ""
msgid "Expand pipeline"
msgstr ""
-msgid "Expand sidebar"
+msgid "Expand settings section"
msgstr ""
-msgid "Expected documents: %{expected_documents}"
+msgid "Expand sidebar"
msgstr ""
-msgid "Experienced"
+msgid "Expected documents: %{expected_documents}"
msgstr ""
msgid "ExperimentSubject|Must have exactly one of User, Namespace, or Project."
@@ -13885,9 +14103,6 @@ msgstr ""
msgid "Failed to load related branches"
msgstr ""
-msgid "Failed to load sidebar lock status"
-msgstr ""
-
msgid "Failed to load stacktrace."
msgstr ""
@@ -14312,6 +14527,9 @@ msgstr ""
msgid "Files"
msgstr ""
+msgid "Files API Rate Limits"
+msgstr ""
+
msgid "Files breadcrumb"
msgstr ""
@@ -15311,6 +15529,9 @@ msgstr ""
msgid "GitLab group: %{source_link}"
msgstr ""
+msgid "GitLab informs you if a new version is available."
+msgstr ""
+
msgid "GitLab is a complete DevOps platform, delivered as a single application, fundamentally changing the way Development, Security, and Ops teams collaborate"
msgstr ""
@@ -15326,7 +15547,7 @@ msgstr ""
msgid "GitLab is open source software to collaborate on code."
msgstr ""
-msgid "GitLab is undergoing maintenance and is operating in a read-only mode."
+msgid "GitLab is undergoing maintenance and is operating in read-only mode."
msgstr ""
msgid "GitLab member or Email address"
@@ -15338,9 +15559,6 @@ msgstr ""
msgid "GitLab project export"
msgstr ""
-msgid "GitLab restart is required to apply changes."
-msgstr ""
-
msgid "GitLab single sign-on URL"
msgstr ""
@@ -15356,9 +15574,6 @@ msgstr ""
msgid "GitLab version"
msgstr ""
-msgid "GitLab will inform you if a new version is available."
-msgstr ""
-
msgid "GitLab will run a background job that will produce pseudonymized CSVs of the GitLab database that will be uploaded to your configured object storage directory."
msgstr ""
@@ -15623,9 +15838,21 @@ msgstr ""
msgid "Go to snippets"
msgstr ""
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check 'Allowed domains for sign-ups'."
+msgstr ""
+
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check 'Email restrictions for sign-ups'."
+msgstr ""
+
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check the 'Domain denylist'."
+msgstr ""
+
msgid "Go to the activity feed"
msgstr ""
+msgid "Go to the group’s 'Settings &gt; General' page, and check 'Restrict membership by email domain'."
+msgstr ""
+
msgid "Go to the milestone list"
msgstr ""
@@ -15662,6 +15889,12 @@ msgstr ""
msgid "Goal of the changes and what reviewers should be aware of"
msgstr ""
+msgid "Google Cloud"
+msgstr ""
+
+msgid "Google Cloud offers several deployment targets. Select the one most suitable for your project."
+msgstr ""
+
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
@@ -15746,9 +15979,6 @@ msgstr ""
msgid "Group ID"
msgstr ""
-msgid "Group ID: %{group_id}"
-msgstr ""
-
msgid "Group Owner must have signed in with SAML before enabling Group Managed Accounts"
msgstr ""
@@ -15923,6 +16153,12 @@ msgstr ""
msgid "GroupImport|Unable to process group import file"
msgstr ""
+msgid "GroupPage|Copy group ID"
+msgstr ""
+
+msgid "GroupPage|Group ID: %{group_id}"
+msgstr ""
+
msgid "GroupRoadmap|%{dateWord} – No end date"
msgstr ""
@@ -15977,6 +16213,9 @@ msgstr ""
msgid "GroupRoadmap|Within 3 years"
msgstr ""
+msgid "GroupSAML|\"persistent\" recommended"
+msgstr ""
+
msgid "GroupSAML|%{strongOpen}Warning%{strongClose} - Enabling %{linkStart}SSO enforcement%{linkEnd} can reduce security risks."
msgstr ""
@@ -16109,6 +16348,9 @@ msgstr ""
msgid "GroupSAML|To be able to prohibit outer forks, you first need to enforce dedicate group managed accounts."
msgstr ""
+msgid "GroupSAML|Use SAML group links to manage group membership using SAML."
+msgstr ""
+
msgid "GroupSAML|Valid SAML Response"
msgstr ""
@@ -16121,13 +16363,10 @@ msgstr ""
msgid "GroupSAML|as %{access_level}"
msgstr ""
-msgid "GroupSAML|must match stored NameID of \"%{extern_uid}\" as we use this to identify users. If the NameID changes users will be unable to sign in."
-msgstr ""
-
-msgid "GroupSAML|should be \"persistent\""
+msgid "GroupSAML|must match stored NameID of \"%{extern_uid}\" to identify user and allow sign in"
msgstr ""
-msgid "GroupSAML|should be a random persistent ID, emails are discouraged"
+msgid "GroupSAML|recommend persistent ID instead of email"
msgstr ""
msgid "GroupSelect|No matching results"
@@ -16142,9 +16381,15 @@ msgstr ""
msgid "GroupSettings|Allow project access token creation"
msgstr ""
+msgid "GroupSettings|Applied to all subgroups unless overridden by a group owner. Groups already added to the project lose access."
+msgstr ""
+
msgid "GroupSettings|Auto DevOps pipeline was updated for the group"
msgstr ""
+msgid "GroupSettings|Available only on the top-level group. Applies to all subgroups. Groups already shared with a group outside %{group} are still shared unless removed manually."
+msgstr ""
+
msgid "GroupSettings|Badges"
msgstr ""
@@ -16196,6 +16441,9 @@ msgstr ""
msgid "GroupSettings|New runners registration token has been generated!"
msgstr ""
+msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgstr ""
+
msgid "GroupSettings|Pipeline settings was updated for the group"
msgstr ""
@@ -16208,12 +16456,15 @@ msgstr ""
msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
-msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups."
+msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups"
msgstr ""
msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
msgstr ""
+msgid "GroupSettings|Prevents group members from being notified if the group is mentioned."
+msgstr ""
+
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
msgstr ""
@@ -16250,21 +16501,6 @@ msgstr ""
msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}."
msgstr ""
-msgid "GroupSettings|This setting is only available on the top-level group and it applies to all subgroups. Groups that have already been shared with a group outside %{group} will still be shared, and this access will have to be revoked manually."
-msgstr ""
-
-msgid "GroupSettings|This setting will be applied to all subgroups unless overridden by a group owner. Groups that already have access to the project will continue to have access unless removed manually."
-msgstr ""
-
-msgid "GroupSettings|This setting will override user notification preferences for all members of the group, subgroups, and projects."
-msgstr ""
-
-msgid "GroupSettings|This setting will prevent group members from being notified if the group is mentioned."
-msgstr ""
-
-msgid "GroupSettings|This setting will prevent group members from forking projects outside of the group."
-msgstr ""
-
msgid "GroupSettings|Transfer group"
msgstr ""
@@ -16382,7 +16618,7 @@ msgstr ""
msgid "GroupsNew|No import options available"
msgstr ""
-msgid "GroupsNew|Not all related objects are migrated, as %{docs_link_start}described here%{docs_link_end}. Please %{feedback_link_start}leave feedback%{feedback_link_end} on this feature."
+msgid "GroupsNew|Not all related objects are migrated. %{docs_link_start}More info%{docs_link_end}."
msgstr ""
msgid "GroupsNew|Personal access token"
@@ -16514,15 +16750,27 @@ msgstr ""
msgid "Hello %{name},"
msgstr ""
-msgid "Hello there"
-msgstr ""
-
msgid "Hello, %{name}!"
msgstr ""
msgid "Hello, %{username}!"
msgstr ""
+msgid "HelloMessage|%{handshake_emoji} Contribute to GitLab: %{contribute_link}"
+msgstr ""
+
+msgid "HelloMessage|%{magnifier_emoji} Create a new GitLab issue: %{new_issue_link}"
+msgstr ""
+
+msgid "HelloMessage|%{rocket_emoji} We like your curiosity! Help us improve GitLab by joining the team: %{jobs_page_link}"
+msgstr ""
+
+msgid "HelloMessage|Does this page need fixes or improvements? Open an issue or contribute a merge request to help make GitLab more lovable. At GitLab, everyone can contribute!"
+msgstr ""
+
+msgid "HelloMessage|Welcome to GitLab!"
+msgstr ""
+
msgid "Help"
msgstr ""
@@ -16532,13 +16780,10 @@ msgstr ""
msgid "Helps prevent bots from creating accounts."
msgstr ""
-msgid "Helps prevent bots from creating issues"
-msgstr ""
-
-msgid "Helps prevent malicious users hide their activity"
+msgid "Helps prevent bots from creating issues."
msgstr ""
-msgid "Helps reduce request volume (e.g. from crawlers or abusive bots)"
+msgid "Helps prevent malicious users hide their activity."
msgstr ""
msgid "Helps reduce request volume (for example, from crawlers or abusive bots)"
@@ -16662,6 +16907,12 @@ msgstr ""
msgid "Housekeeping, export, path, transfer, remove, archive."
msgstr ""
+msgid "How do I configure Akismet?"
+msgstr ""
+
+msgid "How do I configure it?"
+msgstr ""
+
msgid "How do I configure runners?"
msgstr ""
@@ -16683,19 +16934,25 @@ msgstr ""
msgid "How do I set up this service?"
msgstr ""
+msgid "How do I use a web terminal?"
+msgstr ""
+
+msgid "How do I use file templates?"
+msgstr ""
+
msgid "How it works"
msgstr ""
msgid "How many days need to pass between marking entity for deletion and actual removing it."
msgstr ""
-msgid "How many seconds an IP will be counted towards the limit"
+msgid "How many seconds an IP counts toward the IP address limit."
msgstr ""
-msgid "I accept the %{terms_link}"
+msgid "How the job limiter handles jobs exceeding the thresholds specified below. The 'track' mode only logs the jobs. The 'compress' mode compresses the jobs and raises an exception if the compressed size exceeds the limit."
msgstr ""
-msgid "I accept the|Terms of Service and Privacy Policy"
+msgid "I accept the %{terms_link}"
msgstr ""
msgid "I forgot my password"
@@ -16779,13 +17036,16 @@ msgstr ""
msgid "IP Address"
msgstr ""
-msgid "IP expiration time"
+msgid "IP address expiration time"
msgstr ""
-msgid "IP subnet restriction only allowed for top-level groups"
+msgid "IP address restrictions"
+msgstr ""
+
+msgid "IP addresses per user"
msgstr ""
-msgid "IPs per user"
+msgid "IP subnet restriction only allowed for top-level groups"
msgstr ""
msgid "Identifier"
@@ -16800,6 +17060,9 @@ msgstr ""
msgid "If any indexed field exceeds this limit it will be truncated to this number of characters and the rest will not be indexed or searchable. This does not apply to repository and wiki indexing. Setting this to 0 means it is unlimited."
msgstr ""
+msgid "If blank, defaults to %{code_open}Retry later%{code_close}."
+msgstr ""
+
msgid "If blank, set allowable lifetime to %{instance_level_policy_in_words}, as defined by the instance admin. Once set, existing tokens for users in this group may be revoked."
msgstr ""
@@ -16851,6 +17114,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 did not initiate these sign-in attempts, please reach out to your administrator or enable two-factor authentication (2FA) on your account."
+msgstr ""
+
msgid "If you did not initiate this change, please contact your administrator immediately."
msgstr ""
@@ -16942,10 +17208,10 @@ msgstr ""
msgid "Import Projects from Gitea"
msgstr ""
-msgid "Import a project"
+msgid "Import an exported GitLab project"
msgstr ""
-msgid "Import an exported GitLab project"
+msgid "Import and export rate limits"
msgstr ""
msgid "Import failed due to a GitHub error: %{original}"
@@ -16957,12 +17223,18 @@ msgstr ""
msgid "Import from Jira"
msgstr ""
+msgid "Import group"
+msgstr ""
+
msgid "Import group from file"
msgstr ""
msgid "Import groups"
msgstr ""
+msgid "Import history"
+msgstr ""
+
msgid "Import in progress"
msgstr ""
@@ -17026,7 +17298,25 @@ msgstr ""
msgid "Import timed out. Import took longer than %{import_jobs_expiration} seconds"
msgstr ""
-msgid "Import/Export Rate Limits"
+msgid "ImportAProjectModal|Import from a project"
+msgstr ""
+
+msgid "ImportAProjectModal|Import members from another project"
+msgstr ""
+
+msgid "ImportAProjectModal|Import project members"
+msgstr ""
+
+msgid "ImportAProjectModal|Only project members (not group members) are imported, and they get the same permissions as the project you import from."
+msgstr ""
+
+msgid "ImportAProjectModal|Successfully imported"
+msgstr ""
+
+msgid "ImportAProjectModal|Unable to import project members"
+msgstr ""
+
+msgid "ImportAProjectModal|You're importing members to the %{strongStart}%{name}%{strongEnd} project."
msgstr ""
msgid "ImportButtons|Connect repositories from"
@@ -17079,7 +17369,7 @@ msgstr[1] ""
msgid "Importing..."
msgstr ""
-msgid "Import|A repository URL usually ends in a .git suffix, although this is not required. Double check to make sure your repository URL is correct."
+msgid "Import|There is not a valid Git repository at this URL. If your HTTP repository is not publicly accessible, verify your credentials."
msgstr ""
msgid "Improve customer support with Service Desk"
@@ -17088,9 +17378,6 @@ msgstr ""
msgid "Improves Git cloning performance."
msgstr ""
-msgid "In %{time_to_now}"
-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 ""
@@ -17376,7 +17663,7 @@ msgstr ""
msgid "InProductMarketing|Start a GitLab Ultimate trial today in less than one minute, no credit card required."
msgstr ""
-msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no CC required"
+msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no credit card required"
msgstr ""
msgid "InProductMarketing|Start a trial"
@@ -17415,7 +17702,7 @@ msgstr ""
msgid "InProductMarketing|Team up in GitLab for greater efficiency"
msgstr ""
-msgid "InProductMarketing|Team work makes the dream work"
+msgid "InProductMarketing|Team work makes the dream work"
msgstr ""
msgid "InProductMarketing|Test, create, deploy"
@@ -17996,6 +18283,9 @@ msgstr ""
msgid "Integrations|Create new issue in Jira"
msgstr ""
+msgid "Integrations|Create new issue in ZenTao"
+msgstr ""
+
msgid "Integrations|Default settings are inherited from the group level."
msgstr ""
@@ -18089,9 +18379,15 @@ msgstr ""
msgid "Integrations|Search Jira issues"
msgstr ""
+msgid "Integrations|Search ZenTao issues"
+msgstr ""
+
msgid "Integrations|Send notifications about project events to Unify Circuit."
msgstr ""
+msgid "Integrations|Send notifications about project events to a Unify Circuit conversation. %{docs_link}"
+msgstr ""
+
msgid "Integrations|Sign in to add namespaces"
msgstr ""
@@ -18131,6 +18427,9 @@ msgstr ""
msgid "Integrations|You've activated every integration 🎉"
msgstr ""
+msgid "Integrations|ZenTao issues display here when you create issues in your project in ZenTao."
+msgstr ""
+
msgid "Interactive mode"
msgstr ""
@@ -18158,9 +18457,6 @@ msgstr ""
msgid "Interval Pattern"
msgstr ""
-msgid "Introducing Value Stream Analytics"
-msgstr ""
-
msgid "Introducing Your DevOps Report"
msgstr ""
@@ -18257,6 +18553,12 @@ msgstr ""
msgid "Investigate vulnerability: %{title}"
msgstr ""
+msgid "Invisible Captcha"
+msgstr ""
+
+msgid "Invisible Captcha helps prevent the creation of spam accounts. It adds a honeypot field and time-sensitive form submission to the account signup form."
+msgstr ""
+
msgid "Invitation"
msgstr ""
@@ -18710,12 +19012,18 @@ msgstr ""
msgid "Issues"
msgstr ""
+msgid "Issues I've created"
+msgstr ""
+
msgid "Issues Rate Limits"
msgstr ""
msgid "Issues and merge requests"
msgstr ""
+msgid "Issues assigned to me"
+msgstr ""
+
msgid "Issues can be bugs, tasks or ideas to be discussed. Also, issues are searchable and filterable."
msgstr ""
@@ -18827,7 +19135,7 @@ msgstr ""
msgid "Iterations|Create cadence"
msgstr ""
-msgid "Iterations|Create your first iteration"
+msgid "Iterations|Create iteration"
msgstr ""
msgid "Iterations|Delete cadence"
@@ -18836,6 +19144,9 @@ msgstr ""
msgid "Iterations|Delete iteration cadence?"
msgstr ""
+msgid "Iterations|Delete iteration?"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -18869,12 +19180,18 @@ msgstr ""
msgid "Iterations|New iteration cadence"
msgstr ""
+msgid "Iterations|No closed iterations."
+msgstr ""
+
msgid "Iterations|No iteration cadences to show."
msgstr ""
msgid "Iterations|No iterations in cadence."
msgstr ""
+msgid "Iterations|No open iterations."
+msgstr ""
+
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
@@ -18905,6 +19222,9 @@ msgstr ""
msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
msgstr ""
+msgid "Iterations|This will remove the iteration from any issues that are assigned to it."
+msgstr ""
+
msgid "Iterations|Title"
msgstr ""
@@ -18920,15 +19240,9 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "I’m familiar with the basics of DevOps."
-msgstr ""
-
msgid "I’m joining my team who’s already on GitLab"
msgstr ""
-msgid "I’m not familiar with the basics of DevOps."
-msgstr ""
-
msgid "Jaeger URL"
msgstr ""
@@ -19193,6 +19507,9 @@ msgstr ""
msgid "Job"
msgstr ""
+msgid "Job %{jobName}"
+msgstr ""
+
msgid "Job Failed #%{build_id}"
msgstr ""
@@ -19783,9 +20100,6 @@ msgstr ""
msgid "Learn more in the"
msgstr ""
-msgid "Learn more in the|pipeline schedules documentation"
-msgstr ""
-
msgid "Learn more."
msgstr ""
@@ -19897,9 +20211,6 @@ msgstr ""
msgid "Leave Admin Mode"
msgstr ""
-msgid "Leave blank for no limit. Once set, existing personal access tokens may be revoked."
-msgstr ""
-
msgid "Leave edit mode? All unsaved changes will be lost."
msgstr ""
@@ -19945,10 +20256,10 @@ msgstr ""
msgid "LicenseCompliance|Acceptable license to be used in the project"
msgstr ""
-msgid "LicenseCompliance|Add a license"
+msgid "LicenseCompliance|Add license and related policy"
msgstr ""
-msgid "LicenseCompliance|Add license and related policy"
+msgid "LicenseCompliance|Add license policy"
msgstr ""
msgid "LicenseCompliance|Allow"
@@ -20038,6 +20349,9 @@ msgstr ""
msgid "LicenseManagement|Uncategorized"
msgstr ""
+msgid "Licensed Enterprise Edition features can be used if the project namespace's plan includes the feature, or if the project is public."
+msgstr ""
+
msgid "Licensed Features"
msgstr ""
@@ -20104,7 +20418,10 @@ msgstr ""
msgid "Limit namespaces and projects that can be indexed"
msgstr ""
-msgid "Limit sign in from multiple ips"
+msgid "Limit project size at a global, group, and project level. %{link_start}Learn more%{link_end}."
+msgstr ""
+
+msgid "Limit sign in from multiple IP addresses"
msgstr ""
msgid "Limit the number of concurrent operations this secondary site can run in the background."
@@ -20116,11 +20433,17 @@ msgstr ""
msgid "Limit the number of issues and epics per minute a user can create through web and API requests."
msgstr ""
+msgid "Limit the size of Sidekiq jobs stored in Redis."
+msgstr ""
+
msgid "Limited to showing %d event at most"
msgid_plural "Limited to showing %d events at most"
msgstr[0] ""
msgstr[1] ""
+msgid "Limiting mode"
+msgstr ""
+
msgid "Line changes"
msgstr ""
@@ -20190,9 +20513,6 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
-msgid "List of users to be excluded from the limit"
-msgstr ""
-
msgid "List options"
msgstr ""
@@ -20232,9 +20552,6 @@ msgstr ""
msgid "Loading functions timed out. Please reload the page to try again."
msgstr ""
-msgid "Loading issues"
-msgstr ""
-
msgid "Loading more"
msgstr ""
@@ -20526,6 +20843,9 @@ msgstr ""
msgid "Marked For Deletion At - %{deletion_time}"
msgstr ""
+msgid "Marked as ready. Merging is now allowed."
+msgstr ""
+
msgid "Marked this %{noun} as a draft."
msgstr ""
@@ -20598,52 +20918,22 @@ msgstr ""
msgid "Max 100,000 events"
msgstr ""
-msgid "Max 20 characters"
-msgstr ""
-
-msgid "Max Group Export Download requests per minute per user"
-msgstr ""
-
-msgid "Max Group Export requests per minute per user"
-msgstr ""
-
-msgid "Max Group Import requests per minute per user"
-msgstr ""
-
-msgid "Max Project Export Download requests per minute per user"
-msgstr ""
-
-msgid "Max Project Export requests per minute per user"
-msgstr ""
-
-msgid "Max Project Import requests per minute per user"
-msgstr ""
-
-msgid "Max authenticated API requests per period per user"
-msgstr ""
-
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
-msgid "Max authenticated web requests per period per user"
-msgstr ""
-
msgid "Max file size is 200 KB."
msgstr ""
-msgid "Max requests per minute per user"
-msgstr ""
-
msgid "Max role"
msgstr ""
msgid "Max session time"
msgstr ""
-msgid "Max unauthenticated requests per period per IP"
+msgid "MaxBuilds"
msgstr ""
-msgid "MaxBuilds"
+msgid "Maximum 20 characters"
msgstr ""
msgid "Maximum Conan package file size in bytes"
@@ -20679,6 +20969,12 @@ msgstr ""
msgid "Maximum attachment size (MB)"
msgstr ""
+msgid "Maximum authenticated API requests per rate limit period per user"
+msgstr ""
+
+msgid "Maximum authenticated web requests per rate limit period per user"
+msgstr ""
+
msgid "Maximum bulk request size (MiB)"
msgstr ""
@@ -20724,6 +21020,15 @@ msgstr ""
msgid "Maximum files in a diff"
msgstr ""
+msgid "Maximum group export download requests per minute"
+msgstr ""
+
+msgid "Maximum group export requests per minute"
+msgstr ""
+
+msgid "Maximum group import requests per minute"
+msgstr ""
+
msgid "Maximum import size"
msgstr ""
@@ -20760,7 +21065,7 @@ msgstr ""
msgid "Maximum number of projects."
msgstr ""
-msgid "Maximum number of unique IPs per user"
+msgid "Maximum number of unique IP addresses per user."
msgstr ""
msgid "Maximum page reached"
@@ -20769,12 +21074,24 @@ msgstr ""
msgid "Maximum page size"
msgstr ""
+msgid "Maximum project export download requests per minute"
+msgstr ""
+
+msgid "Maximum project export requests per minute"
+msgstr ""
+
+msgid "Maximum project import requests per minute"
+msgstr ""
+
msgid "Maximum push size"
msgstr ""
msgid "Maximum push size (MB)"
msgstr ""
+msgid "Maximum requests per minute"
+msgstr ""
+
msgid "Maximum running slices"
msgstr ""
@@ -20802,10 +21119,16 @@ msgstr ""
msgid "Maximum time between updates that a mirror can have when scheduled to synchronize."
msgstr ""
-msgid "Maximum time for web terminal websocket connection (in seconds). 0 for unlimited."
+msgid "Maximum time that users are allowed to skip the setup of two-factor authentication (in hours). Set to 0 (zero) to enforce at next sign in."
msgstr ""
-msgid "Maximum time that users are allowed to skip the setup of two-factor authentication (in hours). Set to 0 (zero) to enforce at next sign in."
+msgid "Maximum time, in seconds, for a web terminal websocket connection. 0 for unlimited."
+msgstr ""
+
+msgid "Maximum unauthenticated API requests per rate limit period per IP"
+msgstr ""
+
+msgid "Maximum unauthenticated web requests per rate limit period per IP"
msgstr ""
msgid "May"
@@ -20823,9 +21146,6 @@ msgstr ""
msgid "Medium vulnerabilities present"
msgstr ""
-msgid "Member lock"
-msgstr ""
-
msgid "Member since"
msgstr ""
@@ -20862,6 +21182,9 @@ msgstr ""
msgid "Members of a group may only view projects they have permission to access"
msgstr ""
+msgid "Membership"
+msgstr ""
+
msgid "Members|%{time} by %{user}"
msgstr ""
@@ -20922,9 +21245,6 @@ msgstr ""
msgid "Members|Expiration date updated successfully."
msgstr ""
-msgid "Members|Expired"
-msgstr ""
-
msgid "Members|Filter members"
msgstr ""
@@ -20940,9 +21260,6 @@ msgstr ""
msgid "Members|Membership"
msgstr ""
-msgid "Members|No expiration set"
-msgstr ""
-
msgid "Members|Remove \"%{groupName}\""
msgstr ""
@@ -20964,9 +21281,6 @@ msgstr ""
msgid "Members|Search invited"
msgstr ""
-msgid "Members|in %{time}"
-msgstr ""
-
msgid "Member|Deny access"
msgstr ""
@@ -21042,9 +21356,6 @@ msgstr ""
msgid "Merge request %{mr_link} was reviewed by %{mr_author}"
msgstr ""
-msgid "Merge request (MR) approvals"
-msgstr ""
-
msgid "Merge request analytics"
msgstr ""
@@ -21066,12 +21377,21 @@ msgstr ""
msgid "Merge requests"
msgstr ""
+msgid "Merge requests I've created"
+msgstr ""
+
msgid "Merge requests are a place to propose changes you've made to a project and discuss those changes with others"
msgstr ""
msgid "Merge requests are read-only in a secondary Geo node"
msgstr ""
+msgid "Merge requests assigned to me"
+msgstr ""
+
+msgid "Merge requests that I'm a reviewer"
+msgstr ""
+
msgid "Merge the branch and fix any conflicts that come up"
msgstr ""
@@ -21132,10 +21452,10 @@ msgstr ""
msgid "MergeRequests|An error occurred while saving the draft comment."
msgstr ""
-msgid "MergeRequests|Failed to squash. Should be done manually."
+msgid "MergeRequests|Create issue to resolve thread"
msgstr ""
-msgid "MergeRequests|Resolve this thread in a new issue"
+msgid "MergeRequests|Failed to squash. Should be done manually."
msgstr ""
msgid "MergeRequests|Saving the comment failed"
@@ -21949,6 +22269,9 @@ msgstr ""
msgid "MoveIssue|Cannot move issue to project it originates from!"
msgstr ""
+msgid "MoveIssue|Cannot move issues of '%{issue_type}' type."
+msgstr ""
+
msgid "Moved issue to %{label} column in the board."
msgstr ""
@@ -22074,6 +22397,15 @@ 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. To learn more about reducing storage capacity please visit our docs."
msgstr ""
+msgid "NamespaceUserCap|Pending users must be reviewed and approved by a group owner. Learn more about %{user_caps_link_start}User Caps%{link_end} and %{users_pending_approval_link_start}Users Pending Approval%{link_end}."
+msgstr ""
+
+msgid "NamespaceUserCap|View pending user approvals"
+msgstr ""
+
+msgid "NamespaceUserCap|Your group has reached its billable member limit"
+msgstr ""
+
msgid "Namespaces"
msgstr ""
@@ -22116,9 +22448,6 @@ msgstr ""
msgid "Network"
msgstr ""
-msgid "Network Policy|New rule"
-msgstr ""
-
msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is inbound from a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
msgstr ""
@@ -22140,16 +22469,13 @@ msgstr ""
msgid "NetworkPolicies|%{strongOpen}any%{strongClose} port"
msgstr ""
-msgid "NetworkPolicies|+ Add alert"
-msgstr ""
-
msgid "NetworkPolicies|.yaml"
msgstr ""
msgid "NetworkPolicies|.yaml mode"
msgstr ""
-msgid "NetworkPolicies|Actions"
+msgid "NetworkPolicies|Add alert"
msgstr ""
msgid "NetworkPolicies|Alerts are intended to be selectively used for a limited number of events that are potentially concerning and warrant a manual review. Alerts should not be used as a substitute for a SIEM or a logging tool. High volume alerts are likely to be dropped so as to preserve the stability of GitLab's integration with Kubernetes."
@@ -22185,9 +22511,6 @@ msgstr ""
msgid "NetworkPolicies|Deny all traffic"
msgstr ""
-msgid "NetworkPolicies|Description"
-msgstr ""
-
msgid "NetworkPolicies|Edit policy"
msgstr ""
@@ -22200,9 +22523,6 @@ msgstr ""
msgid "NetworkPolicies|IP/subnet"
msgstr ""
-msgid "NetworkPolicies|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
-msgstr ""
-
msgid "NetworkPolicies|Invalid or empty policy"
msgstr ""
@@ -22212,19 +22532,16 @@ msgstr ""
msgid "NetworkPolicies|Kubernetes error: %{error}"
msgstr ""
-msgid "NetworkPolicies|Name"
-msgstr ""
-
msgid "NetworkPolicies|Network"
msgstr ""
-msgid "NetworkPolicies|Network traffic"
+msgid "NetworkPolicies|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
msgstr ""
-msgid "NetworkPolicies|New policy"
+msgid "NetworkPolicies|Network policy can be created after the environment is loaded successfully."
msgstr ""
-msgid "NetworkPolicies|No policies detected"
+msgid "NetworkPolicies|Network traffic"
msgstr ""
msgid "NetworkPolicies|None selected"
@@ -22233,21 +22550,12 @@ msgstr ""
msgid "NetworkPolicies|Please %{installLinkStart}install%{installLinkEnd} and %{configureLinkStart}configure a Kubernetes Agent for this project%{configureLinkEnd} to enable alerts."
msgstr ""
-msgid "NetworkPolicies|Policies are a specification of how groups of pods are allowed to communicate with each other's network endpoints."
-msgstr ""
-
msgid "NetworkPolicies|Policy %{policyName} was successfully changed"
msgstr ""
msgid "NetworkPolicies|Policy definition"
msgstr ""
-msgid "NetworkPolicies|Policy editor"
-msgstr ""
-
-msgid "NetworkPolicies|Policy preview"
-msgstr ""
-
msgid "NetworkPolicies|Rule"
msgstr ""
@@ -22257,9 +22565,6 @@ msgstr ""
msgid "NetworkPolicies|Rule mode is unavailable for this policy. In some cases, we cannot parse the YAML file back into the rules editor."
msgstr ""
-msgid "NetworkPolicies|Rules"
-msgstr ""
-
msgid "NetworkPolicies|Save changes"
msgstr ""
@@ -22272,9 +22577,6 @@ msgstr ""
msgid "NetworkPolicies|Traffic that does not match any rule will be blocked."
msgstr ""
-msgid "NetworkPolicies|Unable to parse policy"
-msgstr ""
-
msgid "NetworkPolicies|all DNS names"
msgstr ""
@@ -22454,6 +22756,9 @@ msgstr ""
msgid "New issue"
msgstr ""
+msgid "New issue in %{project}"
+msgstr ""
+
msgid "New issue title"
msgstr ""
@@ -22532,7 +22837,7 @@ msgstr ""
msgid "Newest first"
msgstr ""
-msgid "Newly registered users will by default be external"
+msgid "Newly-registered users are external by default"
msgstr ""
msgid "Next"
@@ -22847,8 +23152,10 @@ msgstr ""
msgid "No webhooks found, add one in the form above."
msgstr ""
-msgid "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} to renew your subscription."
-msgstr ""
+msgid "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} day to renew your subscription."
+msgid_plural "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} days to renew your subscription."
+msgstr[0] ""
+msgstr[1] ""
msgid "No. of commits"
msgstr ""
@@ -22865,7 +23172,7 @@ msgstr ""
msgid "Nodes"
msgstr ""
-msgid "Non-admin users can sign in with read-only access and make read-only API requests."
+msgid "Non-admin users are restricted to read-only access, in both GitLab UI and API."
msgstr ""
msgid "None"
@@ -22946,7 +23253,7 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
-msgid "Notes Rate Limits"
+msgid "Notes rate limit"
msgstr ""
msgid "Notes|Are you sure you want to cancel creating this comment?"
@@ -23113,9 +23420,6 @@ msgstr ""
msgid "November"
msgstr ""
-msgid "Novice"
-msgstr ""
-
msgid "Now, personalize your GitLab experience"
msgstr ""
@@ -23284,7 +23588,7 @@ msgstr ""
msgid "OnCallSchedules|For this rotation, on-call will be:"
msgstr ""
-msgid "OnCallSchedules|On-call schedule %{schedule} in Project %{project}"
+msgid "OnCallSchedules|On-call schedule %{obstacle} in Project %{project}"
msgstr ""
msgid "OnCallSchedules|On-call schedules"
@@ -23431,22 +23735,22 @@ msgstr ""
msgid "OnDemandScans|Scanner profile"
msgstr ""
-msgid "OnDemandScans|Select one of the existing profiles"
+msgid "OnDemandScans|Schedule scan"
msgstr ""
-msgid "OnDemandScans|Site profile"
+msgid "OnDemandScans|Select one of the existing profiles"
msgstr ""
-msgid "OnDemandScans|Use existing scanner profile"
+msgid "OnDemandScans|Site profile"
msgstr ""
-msgid "OnDemandScans|Use existing site profile"
+msgid "OnDemandScans|Start time"
msgstr ""
-msgid "OnDemandScans|You can either choose a passive scan or validate the target site in your chosen site profile. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
+msgid "OnDemandScans|Use existing scanner profile"
msgstr ""
-msgid "OnDemandScans|You cannot run an active scan against an unvalidated site."
+msgid "OnDemandScans|Use existing site profile"
msgstr ""
msgid "OnDemandScans|You must create a repository within your project to run an on-demand scan."
@@ -23511,6 +23815,9 @@ msgstr ""
msgid "Only admins can delete project"
msgstr ""
+msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
+msgstr ""
+
msgid "Only include features new to your current subscription tier."
msgstr ""
@@ -23529,6 +23836,12 @@ msgstr ""
msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
+msgid "Only reCAPTCHA v2 is supported:"
+msgstr ""
+
+msgid "Only users from the specified IP address ranges are able to reach this group, including all subgroups, projects, and Git repositories."
+msgstr ""
+
msgid "Only verified users with an email address in any of these domains can be added to the group."
msgstr ""
@@ -23715,9 +24028,6 @@ msgstr ""
msgid "Package Registry"
msgstr ""
-msgid "Package Registry Rate Limits"
-msgstr ""
-
msgid "Package Registry: authenticated API requests"
msgstr ""
@@ -23736,6 +24046,9 @@ msgstr ""
msgid "Package recipe already exists"
msgstr ""
+msgid "Package registry rate limits"
+msgstr ""
+
msgid "Package type"
msgstr ""
@@ -23802,6 +24115,9 @@ msgstr ""
msgid "PackageRegistry|Composer"
msgstr ""
+msgid "PackageRegistry|Composer.json with license: %{license} and version: %{version}"
+msgstr ""
+
msgid "PackageRegistry|Conan"
msgstr ""
@@ -23865,6 +24181,9 @@ msgstr ""
msgid "PackageRegistry|Copy require package include"
msgstr ""
+msgid "PackageRegistry|Copy target SHA"
+msgstr ""
+
msgid "PackageRegistry|Copy yarn command"
msgstr ""
@@ -23931,6 +24250,9 @@ msgstr ""
msgid "PackageRegistry|Install package version"
msgstr ""
+msgid "PackageRegistry|Instance-level"
+msgstr ""
+
msgid "PackageRegistry|Invalid Package: failed metadata extraction"
msgstr ""
@@ -23976,6 +24298,9 @@ msgstr ""
msgid "PackageRegistry|Pip Command"
msgstr ""
+msgid "PackageRegistry|Project-level"
+msgstr ""
+
msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
msgstr ""
@@ -23997,6 +24322,9 @@ msgstr ""
msgid "PackageRegistry|Remove package"
msgstr ""
+msgid "PackageRegistry|Required Python: %{pythonVersion}"
+msgstr ""
+
msgid "PackageRegistry|RubyGems"
msgstr ""
@@ -24039,6 +24367,9 @@ msgstr ""
msgid "PackageRegistry|Source project located at %{link}"
msgstr ""
+msgid "PackageRegistry|Target SHA: %{sha}"
+msgstr ""
+
msgid "PackageRegistry|There are no other versions of this package."
msgstr ""
@@ -24207,6 +24538,18 @@ msgstr ""
msgid "Password was successfully updated. Please sign in again."
msgstr ""
+msgid "PasswordPrompt|Confirm password"
+msgstr ""
+
+msgid "PasswordPrompt|Confirm password to continue"
+msgstr ""
+
+msgid "PasswordPrompt|Password is required"
+msgstr ""
+
+msgid "PasswordPrompt|Please enter your password to confirm"
+msgstr ""
+
msgid "Passwords should be unique and not used for any other sites or services."
msgstr ""
@@ -24234,6 +24577,9 @@ msgstr ""
msgid "Paste project path (i.e. gitlab-org/gitlab)"
msgstr ""
+msgid "Paste this DSN into your Sentry SDK"
+msgstr ""
+
msgid "Paste your public SSH key, which is usually contained in the file '~/.ssh/id_ed25519.pub' or '~/.ssh/id_rsa.pub' and begins with 'ssh-ed25519' or 'ssh-rsa'. Do not paste your private SSH key, as that can compromise your identity."
msgstr ""
@@ -24318,6 +24664,9 @@ msgstr ""
msgid "PerformanceBar|First Contentful Paint"
msgstr ""
+msgid "PerformanceBar|Flamegraph with mode:"
+msgstr ""
+
msgid "PerformanceBar|Frontend resources"
msgstr ""
@@ -24351,6 +24700,15 @@ msgstr ""
msgid "PerformanceBar|Trace"
msgstr ""
+msgid "PerformanceBar|cpu"
+msgstr ""
+
+msgid "PerformanceBar|object"
+msgstr ""
+
+msgid "PerformanceBar|wall"
+msgstr ""
+
msgid "Period in seconds"
msgstr ""
@@ -24579,6 +24937,48 @@ msgstr ""
msgid "PipelineSchedules|Variables"
msgstr ""
+msgid "PipelineSource|API"
+msgstr ""
+
+msgid "PipelineSource|Chat"
+msgstr ""
+
+msgid "PipelineSource|External"
+msgstr ""
+
+msgid "PipelineSource|External Pull Request"
+msgstr ""
+
+msgid "PipelineSource|Merge Request"
+msgstr ""
+
+msgid "PipelineSource|On-Demand DAST Scan"
+msgstr ""
+
+msgid "PipelineSource|On-Demand DAST Validation"
+msgstr ""
+
+msgid "PipelineSource|Parent Pipeline"
+msgstr ""
+
+msgid "PipelineSource|Pipeline"
+msgstr ""
+
+msgid "PipelineSource|Push"
+msgstr ""
+
+msgid "PipelineSource|Schedule"
+msgstr ""
+
+msgid "PipelineSource|Trigger"
+msgstr ""
+
+msgid "PipelineSource|Web"
+msgstr ""
+
+msgid "PipelineSource|Web IDE"
+msgstr ""
+
msgid "PipelineStatusTooltip|Pipeline: %{ciStatus}"
msgstr ""
@@ -24879,46 +25279,7 @@ msgstr ""
msgid "Pipeline|Source"
msgstr ""
-msgid "Pipeline|Source|API"
-msgstr ""
-
-msgid "Pipeline|Source|Chat"
-msgstr ""
-
-msgid "Pipeline|Source|External"
-msgstr ""
-
-msgid "Pipeline|Source|External Pull Request"
-msgstr ""
-
-msgid "Pipeline|Source|Merge Request"
-msgstr ""
-
-msgid "Pipeline|Source|On-Demand DAST Scan"
-msgstr ""
-
-msgid "Pipeline|Source|On-Demand DAST Validation"
-msgstr ""
-
-msgid "Pipeline|Source|Parent Pipeline"
-msgstr ""
-
-msgid "Pipeline|Source|Pipeline"
-msgstr ""
-
-msgid "Pipeline|Source|Push"
-msgstr ""
-
-msgid "Pipeline|Source|Schedule"
-msgstr ""
-
-msgid "Pipeline|Source|Trigger"
-msgstr ""
-
-msgid "Pipeline|Source|Web"
-msgstr ""
-
-msgid "Pipeline|Source|Web IDE"
+msgid "Pipeline|Source|Security Policy"
msgstr ""
msgid "Pipeline|Specify variable values to be used in this run. The values specified in %{linkStart}CI/CD settings%{linkEnd} will be used by default."
@@ -24969,7 +25330,7 @@ msgstr ""
msgid "Pipeline|We are currently unable to fetch pipeline data"
msgstr ""
-msgid "Pipeline|You’re about to stop pipeline %{pipelineId}."
+msgid "Pipeline|You’re about to stop pipeline #%{pipelineId}."
msgstr ""
msgid "Pipeline|for"
@@ -24996,6 +25357,9 @@ msgstr ""
msgid "Plain diff"
msgstr ""
+msgid "Plain-text response to send to clients that hit a rate limit"
+msgstr ""
+
msgid "Plan:"
msgstr ""
@@ -25140,9 +25504,6 @@ msgstr ""
msgid "Please provide attributes to update"
msgstr ""
-msgid "Please provide your username or email address."
-msgstr ""
-
msgid "Please reach out if you have any questions and we'll be happy to assist."
msgstr ""
@@ -25185,9 +25546,6 @@ msgstr ""
msgid "Please set a new password before proceeding."
msgstr ""
-msgid "Please share your feedback about %{featureName} %{linkStart}in this issue%{linkEnd} to help us improve the experience."
-msgstr ""
-
msgid "Please solve the captcha"
msgstr ""
@@ -25365,6 +25723,9 @@ msgstr ""
msgid "Prevent adding new members to project membership within this group"
msgstr ""
+msgid "Prevent auto-stopping"
+msgstr ""
+
msgid "Prevent editing approval rules in projects and merge requests."
msgstr ""
@@ -25377,7 +25738,7 @@ msgstr ""
msgid "Prevent users from changing their profile name"
msgstr ""
-msgid "Prevent users from performing write operations on GitLab while performing maintenance."
+msgid "Prevent users from performing write operations while GitLab maintenance is in progress."
msgstr ""
msgid "Preview"
@@ -25650,6 +26011,9 @@ msgstr ""
msgid "Profiles|Enter your name, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Enter your password to confirm the email change"
+msgstr ""
+
msgid "Profiles|Enter your pronouns to let people know how to refer to you"
msgstr ""
@@ -25884,10 +26248,10 @@ msgstr ""
msgid "Profiles|e.g. My MacBook key"
msgstr ""
-msgid "Profiles|username"
+msgid "Profiles|https://website.com"
msgstr ""
-msgid "Profiles|website.com"
+msgid "Profiles|username"
msgstr ""
msgid "Profiles|your account"
@@ -26130,9 +26494,21 @@ msgstr ""
msgid "ProjectSelect| or group"
msgstr ""
+msgid "ProjectSelect|No matching results"
+msgstr ""
+
msgid "ProjectSelect|Search for project"
msgstr ""
+msgid "ProjectSelect|Search projects"
+msgstr ""
+
+msgid "ProjectSelect|Select a project"
+msgstr ""
+
+msgid "ProjectSelect|There was an error fetching the projects. Please try again."
+msgstr ""
+
msgid "ProjectService|Drone server URL"
msgstr ""
@@ -26220,6 +26596,9 @@ msgstr ""
msgid "ProjectService|Trigger event when a new, unique alert is recorded."
msgstr ""
+msgid "ProjectService|Trigger event when a new, unique vulnerability is recorded. (Note: This feature requires an Ultimate plan.)"
+msgstr ""
+
msgid "ProjectService|Trigger event when a pipeline status changes."
msgstr ""
@@ -26634,9 +27013,15 @@ msgstr ""
msgid "Projects are graded based on the highest severity vulnerability present"
msgstr ""
+msgid "Projects are organized into groups"
+msgstr ""
+
msgid "Projects contributed to"
msgstr ""
+msgid "Projects help you organize your work. They contain your file repository, issues, merge requests, and so much more."
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr ""
@@ -26871,10 +27256,10 @@ msgstr ""
msgid "PrometheusService|Prometheus cluster integration"
msgstr ""
-msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
+msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
msgstr ""
-msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
+msgid "PrometheusService|The ID of the IAP-secured resource."
msgstr ""
msgid "PrometheusService|The Prometheus API base URL."
@@ -27492,6 +27877,9 @@ msgstr ""
msgid "Rate limit"
msgstr ""
+msgid "Rate limits can help reduce request volume (like from crawlers or abusive bots)."
+msgstr ""
+
msgid "Raw blob request rate limit per minute"
msgstr ""
@@ -27504,6 +27892,9 @@ msgstr ""
msgid "Re-authentication required"
msgstr ""
+msgid "Re-import"
+msgstr ""
+
msgid "Re-request review"
msgstr ""
@@ -27525,6 +27916,9 @@ msgstr ""
msgid "Read more about related issues"
msgstr ""
+msgid "Read their documentation."
+msgstr ""
+
msgid "Ready to get started with GitLab? Follow these steps to set up your workspace, plan and commit changes, and deploy your project."
msgstr ""
@@ -27558,6 +27952,9 @@ msgstr ""
msgid "Receive any notifications from GitLab."
msgstr ""
+msgid "Receive notification of abuse reports by email."
+msgstr ""
+
msgid "Receive notifications about your own activity"
msgstr ""
@@ -27701,9 +28098,6 @@ msgstr ""
msgid "Registry setup"
msgstr ""
-msgid "Regulate approvals by authors/committers. Affects all projects."
-msgstr ""
-
msgid "Reindexing Status: %{status} (Slice multiplier: %{multiplier}, Maximum running slices: %{max_slices})"
msgstr ""
@@ -27799,6 +28193,9 @@ msgstr ""
msgid "Release|Something went wrong while saving the release details."
msgstr ""
+msgid "Reload page"
+msgstr ""
+
msgid "Remediations"
msgstr ""
@@ -28081,6 +28478,9 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
+msgid "Repeats"
+msgstr ""
+
msgid "Replace"
msgstr ""
@@ -28443,10 +28843,7 @@ msgstr ""
msgid "Require additional authentication for administrative tasks."
msgstr ""
-msgid "Require all users in this group to setup Two-factor authentication"
-msgstr ""
-
-msgid "Require all users in this group to setup two-factor authentication"
+msgid "Require all users in this group to set up two-factor authentication"
msgstr ""
msgid "Required approvals (%{approvals_given} given)"
@@ -28492,6 +28889,9 @@ msgstr[1] ""
msgid "Requires values to meet regular expression requirements."
msgstr ""
+msgid "Requires you to deploy or set up cloud-hosted Sentry."
+msgstr ""
+
msgid "Requires your primary GitLab email address."
msgstr ""
@@ -28552,9 +28952,6 @@ msgstr ""
msgid "Resolve"
msgstr ""
-msgid "Resolve all threads in new issue"
-msgstr ""
-
msgid "Resolve conflicts"
msgstr ""
@@ -28612,6 +29009,9 @@ msgstr ""
msgid "Response text"
msgstr ""
+msgid "Restart GitLab to apply changes."
+msgstr ""
+
msgid "Restart Terminal"
msgstr ""
@@ -28630,6 +29030,9 @@ msgstr ""
msgid "Restoring the project will prevent the project from being removed on this date and restore people's ability to make changes to it."
msgstr ""
+msgid "Restrict group access by IP address. %{link_start}Learn more%{link_end}."
+msgstr ""
+
msgid "Restrict membership by email domain"
msgstr ""
@@ -28943,6 +29346,9 @@ msgstr ""
msgid "Runners|Runner #%{runner_id}"
msgstr ""
+msgid "Runners|Runner assigned to project."
+msgstr ""
+
msgid "Runners|Runner is offline, last contact was %{runner_contact} ago"
msgstr ""
@@ -28955,6 +29361,9 @@ msgstr ""
msgid "Runners|Runner registration"
msgstr ""
+msgid "Runners|Runner unassigned from project."
+msgstr ""
+
msgid "Runners|Runners"
msgstr ""
@@ -29147,7 +29556,7 @@ msgstr ""
msgid "SastEntryPoints|How do I set up SAST?"
msgstr ""
-msgid "SastEntryPoints|Learn more."
+msgid "SastEntryPoints|Learn more"
msgstr ""
msgid "Satisfied"
@@ -29189,7 +29598,7 @@ msgstr ""
msgid "Save pipeline schedule"
msgstr ""
-msgid "Save space and find images in the container Registry. remove unneeded tags and keep only the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
+msgid "Save storage space by automatically deleting tags from the container registry and keeping the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
msgstr ""
msgid "Saving"
@@ -29363,6 +29772,9 @@ msgstr ""
msgid "Search or filter results…"
msgstr ""
+msgid "Search or jump to..."
+msgstr ""
+
msgid "Search project"
msgstr ""
@@ -29423,16 +29835,16 @@ msgstr ""
msgid "SearchCodeResults|of %{link_to_project}"
msgstr ""
-msgid "SearchResults|Showing %{count} %{scope} for%{term_element}"
+msgid "SearchResults|Showing %{count} %{scope} for %{term_element}"
msgstr ""
-msgid "SearchResults|Showing %{count} %{scope} for%{term_element} in your personal and project snippets"
+msgid "SearchResults|Showing %{count} %{scope} for %{term_element} in your personal and project snippets"
msgstr ""
-msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for%{term_element}"
+msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for %{term_element}"
msgstr ""
-msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for%{term_element} in your personal and project snippets"
+msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for %{term_element} in your personal and project snippets"
msgstr ""
msgid "SearchResults|code result"
@@ -29514,6 +29926,9 @@ msgstr ""
msgid "Secret Detection"
msgstr ""
+msgid "Secret access key"
+msgstr ""
+
msgid "Secret token"
msgstr ""
@@ -29553,9 +29968,6 @@ msgstr ""
msgid "SecurityApprovals|A merge request approval is required when the license compliance report contains a denied license."
msgstr ""
-msgid "SecurityApprovals|Configurable if security scanners are enabled. %{linkStart}Learn more.%{linkEnd}"
-msgstr ""
-
msgid "SecurityApprovals|Coverage-Check"
msgstr ""
@@ -29568,24 +29980,18 @@ msgstr ""
msgid "SecurityApprovals|Learn more about Vulnerability-Check"
msgstr ""
-msgid "SecurityApprovals|License Scanning must be enabled. %{linkStart}Learn more%{linkEnd}."
-msgstr ""
-
msgid "SecurityApprovals|License-Check"
msgstr ""
msgid "SecurityApprovals|Requires approval for Denied licenses. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}More information%{linkEnd}"
+msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "SecurityApprovals|Requires approval for vulnerabilities. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
-msgid "SecurityApprovals|Test coverage must be enabled. %{linkStart}Learn more%{linkEnd}."
-msgstr ""
-
msgid "SecurityApprovals|Vulnerability-Check"
msgstr ""
@@ -29649,6 +30055,12 @@ msgstr ""
msgid "SecurityConfiguration|Immediately begin risk analysis and remediation with application security features. Start with SAST and Secret Detection, available to all plans. Upgrade to Ultimate to get all features, including:"
msgstr ""
+msgid "SecurityConfiguration|Manage corpus"
+msgstr ""
+
+msgid "SecurityConfiguration|Manage corpus files used as mutation sources in coverage fuzzing."
+msgstr ""
+
msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
msgstr ""
@@ -29703,6 +30115,12 @@ msgstr ""
msgid "SecurityOrchestration|Action"
msgstr ""
+msgid "SecurityOrchestration|Actions"
+msgstr ""
+
+msgid "SecurityOrchestration|Add rule"
+msgstr ""
+
msgid "SecurityOrchestration|All policies"
msgstr ""
@@ -29736,9 +30154,6 @@ msgstr ""
msgid "SecurityOrchestration|Network"
msgstr ""
-msgid "SecurityOrchestration|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
-msgstr ""
-
msgid "SecurityOrchestration|New policy"
msgstr ""
@@ -29754,6 +30169,9 @@ msgstr ""
msgid "SecurityOrchestration|Policy editor"
msgstr ""
+msgid "SecurityOrchestration|Policy preview"
+msgstr ""
+
msgid "SecurityOrchestration|Policy status"
msgstr ""
@@ -29763,6 +30181,9 @@ msgstr ""
msgid "SecurityOrchestration|Rule"
msgstr ""
+msgid "SecurityOrchestration|Rules"
+msgstr ""
+
msgid "SecurityOrchestration|Scan Execution"
msgstr ""
@@ -29856,6 +30277,9 @@ msgstr ""
msgid "SecurityReports|Create issue"
msgstr ""
+msgid "SecurityReports|Development vulnerabilities"
+msgstr ""
+
msgid "SecurityReports|Dismiss vulnerability"
msgstr ""
@@ -29871,6 +30295,9 @@ msgstr ""
msgid "SecurityReports|Download results"
msgstr ""
+msgid "SecurityReports|Download scanned URLs"
+msgstr ""
+
msgid "SecurityReports|Download scanned resources"
msgstr ""
@@ -29994,6 +30421,9 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
+msgid "SecurityReports|The Vulnerability Report shows the results of the lastest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "SecurityReports|The security reports below contain one or more vulnerability findings that could not be parsed and were not recorded. Download the artifacts in the job output to investigate. Ensure any security report created conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
msgstr ""
@@ -30135,10 +30565,10 @@ msgstr ""
msgid "Select a repository"
msgstr ""
-msgid "Select a role"
+msgid "Select a repository containing templates for common files."
msgstr ""
-msgid "Select a shared template repository for all projects on this instance."
+msgid "Select a role"
msgstr ""
msgid "Select a template repository"
@@ -30216,6 +30646,9 @@ msgstr ""
msgid "Select project to choose zone"
msgstr ""
+msgid "Select project to create issue"
+msgstr ""
+
msgid "Select projects"
msgstr ""
@@ -30333,6 +30766,9 @@ msgstr ""
msgid "Send emails to help guide new users through the onboarding process."
msgstr ""
+msgid "Send emails to users upon account deactivation."
+msgstr ""
+
msgid "Send message"
msgstr ""
@@ -30351,6 +30787,9 @@ msgstr ""
msgid "Send service data"
msgstr ""
+msgid "Sentry"
+msgstr ""
+
msgid "Sentry API URL"
msgstr ""
@@ -30465,6 +30904,9 @@ msgstr ""
msgid "Service"
msgstr ""
+msgid "Service Accounts keys are required to authorize GitLab to deploy your Google Cloud project."
+msgstr ""
+
msgid "Service Desk"
msgstr ""
@@ -30537,15 +30979,15 @@ msgstr ""
msgid "Set a password on your account to pull or push via %{protocol}."
msgstr ""
-msgid "Set a template repository for projects in this group"
-msgstr ""
-
msgid "Set access permissions for this token."
msgstr ""
msgid "Set an instance-wide domain that will be available to all clusters when installing Knative."
msgstr ""
+msgid "Set any rate limit to %{code_open}0%{code_close} to disable the limit."
+msgstr ""
+
msgid "Set default and restrict visibility levels. Configure import sources and git access protocol."
msgstr ""
@@ -30558,7 +31000,7 @@ msgstr ""
msgid "Set limit to 0 to allow any file size."
msgstr ""
-msgid "Set max session time for web terminal."
+msgid "Set limits for web and API requests."
msgstr ""
msgid "Set milestone"
@@ -30567,15 +31009,18 @@ msgstr ""
msgid "Set new password"
msgstr ""
-msgid "Set notification email for abuse reports."
+msgid "Set parent epic to an epic"
msgstr ""
-msgid "Set parent epic to an epic"
+msgid "Set per-user rate limits for imports and exports of projects and groups."
msgstr ""
msgid "Set projects and maximum size limits, session duration, user options, and check feature availability for namespace plan."
msgstr ""
+msgid "Set rate limits for package registry API requests that supersede the general user and IP rate limits."
+msgstr ""
+
msgid "Set severity"
msgstr ""
@@ -30594,15 +31039,24 @@ msgstr ""
msgid "Set the default branch for this project. All merge requests and commits are made against this branch unless you specify a different one."
msgstr ""
+msgid "Set the default expiration time for job artifacts in all projects. Set to %{code_open}0%{code_close} to never expire artifacts by default. If no unit is written, it defaults to seconds. For example, these are all equivalent: %{code_open}3600%{code_close}, %{code_open}60 minutes%{code_close}, or %{code_open}one hour%{code_close}."
+msgstr ""
+
msgid "Set the due date to %{due_date}."
msgstr ""
msgid "Set the iteration to %{iteration_reference}."
msgstr ""
+msgid "Set the maximum session time for a web terminal."
+msgstr ""
+
msgid "Set the milestone to %{milestone_reference}."
msgstr ""
+msgid "Set the per-user rate limit for notes created by web or API requests."
+msgstr ""
+
msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
msgstr ""
@@ -30804,6 +31258,9 @@ msgstr ""
msgid "Show Pipeline IID"
msgstr ""
+msgid "Show all %{issuable_type}."
+msgstr ""
+
msgid "Show all activity"
msgstr ""
@@ -30855,15 +31312,9 @@ msgstr ""
msgid "Show list"
msgstr ""
-msgid "Show me advanced features"
-msgstr ""
-
msgid "Show me how to add a pipeline"
msgstr ""
-msgid "Show me the basics"
-msgstr ""
-
msgid "Show one file at a time"
msgstr ""
@@ -30904,15 +31355,15 @@ msgstr ""
msgid "Showing %{pageSize} of %{total} %{issuableType}"
msgstr ""
-msgid "Showing %{pageSize} of %{total} issues"
-msgstr ""
-
msgid "Showing all epics"
msgstr ""
msgid "Showing all issues"
msgstr ""
+msgid "Showing data for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
+msgstr ""
+
msgid "Showing data for workflow items created in this date range. Date range cannot exceed %{maxDateRange} days."
msgstr ""
@@ -30952,6 +31403,15 @@ msgstr ""
msgid "Sidebar|Weight"
msgstr ""
+msgid "Sidekiq job compression threshold (bytes)"
+msgstr ""
+
+msgid "Sidekiq job size limit (bytes)"
+msgstr ""
+
+msgid "Sidekiq job size limits"
+msgstr ""
+
msgid "Sign in"
msgstr ""
@@ -31072,6 +31532,9 @@ msgstr ""
msgid "Site profile not found for given parameters"
msgstr ""
+msgid "Sites"
+msgstr ""
+
msgid "Size"
msgstr ""
@@ -31102,19 +31565,22 @@ msgstr ""
msgid "SlackIntegration|Sends notifications about project events to Slack channels."
msgstr ""
-msgid "SlackService|2. Paste the %{strong_open}Token%{strong_close} into the field below"
+msgid "SlackService|1. %{slash_command_link_start}Add a slash command%{slash_command_link_end} in your Slack team using this information:"
msgstr ""
-msgid "SlackService|3. Select the %{strong_open}Active%{strong_close} checkbox, press %{strong_open}Save changes%{strong_close} and start using GitLab inside Slack!"
+msgid "SlackService|2. Paste the token from Slack in the %{strong_open}Token%{strong_close} field below."
msgstr ""
-msgid "SlackService|Fill in the word that works best for your team."
+msgid "SlackService|3. Select the %{strong_open}Active%{strong_close} checkbox, select %{strong_open}Save changes%{strong_close}, and start using slash commands in Slack!"
+msgstr ""
+
+msgid "SlackService|After setup, get a list of available Slack slash commands by entering"
msgstr ""
-msgid "SlackService|See list of available commands in Slack after setting up this service, by entering"
+msgid "SlackService|Fill in the word that works best for your team."
msgstr ""
-msgid "SlackService|This service allows users to perform common operations on this project by entering slash commands in Slack."
+msgid "SlackService|Perform common operations in this project by entering slash commands in Slack."
msgstr ""
msgid "Slice multiplier"
@@ -31180,7 +31646,7 @@ msgstr ""
msgid "Some child epics may be hidden due to applied filters"
msgstr ""
-msgid "Some common domains are not allowed. %{read_more_link}."
+msgid "Some common domains are not allowed. %{learn_more_link}."
msgstr ""
msgid "Some of the designs you tried uploading did not change:"
@@ -31264,9 +31730,6 @@ msgstr ""
msgid "Something went wrong while exporting requirements"
msgstr ""
-msgid "Something went wrong while fetching %{listType} list"
-msgstr ""
-
msgid "Something went wrong while fetching branches"
msgstr ""
@@ -31321,15 +31784,9 @@ msgstr ""
msgid "Something went wrong while merging this merge request. Please try again."
msgstr ""
-msgid "Something went wrong while moving issues."
-msgstr ""
-
msgid "Something went wrong while obtaining the Let's Encrypt certificate."
msgstr ""
-msgid "Something went wrong while performing the action."
-msgstr ""
-
msgid "Something went wrong while promoting the issue to an epic. Please try again."
msgstr ""
@@ -31657,7 +32114,10 @@ msgstr ""
msgid "SourcegraphPreferences|Uses a custom %{linkStart}Sourcegraph instance%{linkEnd}."
msgstr ""
-msgid "Spam Check API Key"
+msgid "Spam Check"
+msgstr ""
+
+msgid "Spam Check API key"
msgstr ""
msgid "Spam Logs"
@@ -31675,7 +32135,7 @@ msgstr ""
msgid "Specified URL cannot be used: \"%{reason}\""
msgstr ""
-msgid "Specify an e-mail address regex pattern to identify default internal users."
+msgid "Specify an email address regex pattern to identify default internal users."
msgstr ""
msgid "Speed up your pipelines with Needs relationships"
@@ -31930,7 +32390,7 @@ msgstr ""
msgid "StatusCheck|An error occurred fetching the status checks."
msgstr ""
-msgid "StatusCheck|Apply this status check to any branch or a specific protected branch."
+msgid "StatusCheck|Apply this status check to all branches or a specific protected branch."
msgstr ""
msgid "StatusCheck|Check for a status response in Merge Requests. Failures do not block merges. %{link_start}Learn more%{link_end}."
@@ -32269,6 +32729,9 @@ msgstr ""
msgid "Subscriptions"
msgstr ""
+msgid "Subscription|Your subscription for %{strong}%{namespace_name}%{strong_close} has expired and you are now on %{pricing_link_start}the GitLab Free tier%{pricing_link_end}. Don't worry, your data is safe. Get in touch with our support team (%{support_email}). They'll gladly help with your subscription renewal."
+msgstr ""
+
msgid "Subtracted"
msgstr ""
@@ -32497,6 +32960,9 @@ msgstr ""
msgid "SuperSonics|Plan"
msgstr ""
+msgid "SuperSonics|Please agree to the Subscription Agreement"
+msgstr ""
+
msgid "SuperSonics|Ready to get started? A GitLab plan is ideal for scaling organizations and for multi team usage."
msgstr ""
@@ -32527,6 +32993,9 @@ msgstr ""
msgid "SuperSonics|The activation code is not valid. Please make sure to copy it exactly from the Customers Portal or confirmation email. Learn more about %{linkStart}activating your subscription%{linkEnd}."
msgstr ""
+msgid "SuperSonics|The activation code should be a 24-character alphanumeric string"
+msgstr ""
+
msgid "SuperSonics|There is a connectivity issue."
msgstr ""
@@ -32569,9 +33038,15 @@ msgstr ""
msgid "SuperSonics|You do not have an active subscription"
msgstr ""
+msgid "SuperSonics|You have successfully added a license that activates on %{date}. Please see the subscription history table below for more details."
+msgstr ""
+
msgid "SuperSonics|You'll be charged for %{trueUpLinkStart}users over license%{trueUpLinkEnd} on a quarterly or annual basis, depending on the terms of your agreement."
msgstr ""
+msgid "SuperSonics|Your future dated license was successfully added"
+msgstr ""
+
msgid "SuperSonics|Your subscription"
msgstr ""
@@ -32824,7 +33299,7 @@ msgstr ""
msgid "Template to append to all Service Desk issues"
msgstr ""
-msgid "TemplateRepository|Select a repository to make its templates available to all projects. %{link_start}What should the repository contain?%{link_end} "
+msgid "TemplateRepository|Create common files more quickly, and standardize their format."
msgstr ""
msgid "Templates"
@@ -33030,7 +33505,7 @@ msgstr ""
msgid "TestCases|Search test cases"
msgstr ""
-msgid "TestCases|Something went wrong while adding test case to Todo."
+msgid "TestCases|Something went wrong while adding test case to a to-do item."
msgstr ""
msgid "TestCases|Something went wrong while creating a test case."
@@ -33042,7 +33517,7 @@ msgstr ""
msgid "TestCases|Something went wrong while fetching test cases list."
msgstr ""
-msgid "TestCases|Something went wrong while marking test case todo as done."
+msgid "TestCases|Something went wrong while marking test case to-do item as done."
msgstr ""
msgid "TestCases|Something went wrong while moving test case."
@@ -33162,7 +33637,7 @@ msgstr ""
msgid "Thanks for your purchase!"
msgstr ""
-msgid "That is ok, I do not want to renew"
+msgid "That's OK, I don't want to renew"
msgstr ""
msgid "That's it, well done!"
@@ -33185,7 +33660,7 @@ msgid_plural "The %{type} contains the following errors:"
msgstr[0] ""
msgstr[1] ""
-msgid "The API key used by GitLab for accessing the Spam Check service endpoint"
+msgid "The API key used by GitLab for accessing the Spam Check service endpoint."
msgstr ""
msgid "The GitLab subscription service (customers.gitlab.com) is currently experiencing an outage. You can monitor the status and get updates at %{linkStart}status.gitlab.com%{linkEnd}."
@@ -33224,9 +33699,6 @@ msgstr ""
msgid "The URL to use for connecting to Elasticsearch. Use a comma-separated list to support clustering (e.g., \"http://localhost:9200, http://localhost:9201\")."
msgstr ""
-msgid "The Vulnerability Report shows the results of the last successful pipeline run on the default branch."
-msgstr ""
-
msgid "The X509 Certificate to use when mutual TLS is required to communicate with the external authorization service. If left blank, the server certificate is still validated when accessing over HTTPS."
msgstr ""
@@ -33284,9 +33756,6 @@ msgstr ""
msgid "The default branch for this project has been changed. Please update your bookmarks."
msgstr ""
-msgid "The default expiration time for job artifacts. 0 for unlimited. The default unit is in seconds, but you can use other units, for example %{code_open}4 mins 2 sec%{code_close}, %{code_open}2h42min%{code_close}."
-msgstr ""
-
msgid "The dependency list details information about the components used within your project."
msgstr ""
@@ -33478,9 +33947,6 @@ msgstr ""
msgid "The merge conflicts for this merge request have already been resolved. Please return to the merge request."
msgstr ""
-msgid "The merge request can now be merged."
-msgstr ""
-
msgid "The metric must be one of %{metrics}."
msgstr ""
@@ -33856,7 +34322,7 @@ msgstr ""
msgid "There was a problem updating the keep latest artifacts setting."
msgstr ""
-msgid "There was an error %{message} todo."
+msgid "There was an error %{message} to-do item."
msgstr ""
msgid "There was an error adding a To Do."
@@ -33895,6 +34361,9 @@ msgstr ""
msgid "There was an error fetching projects"
msgstr ""
+msgid "There was an error fetching search autocomplete suggestions"
+msgstr ""
+
msgid "There was an error fetching stage total counts"
msgstr ""
@@ -34219,6 +34688,9 @@ msgstr ""
msgid "This field is required."
msgstr ""
+msgid "This form is disabled in preview"
+msgstr ""
+
msgid "This group"
msgstr ""
@@ -34240,9 +34712,6 @@ msgstr ""
msgid "This group is linked to a subscription"
msgstr ""
-msgid "This group, including all subgroups, projects and git repositories, will be reachable from only the specified IP address ranges."
-msgstr ""
-
msgid "This group, its subgroups and projects has been scheduled for removal on %{date}."
msgstr ""
@@ -34522,9 +34991,6 @@ msgstr ""
msgid "This user cannot be unlocked manually from GitLab"
msgstr ""
-msgid "This user does not have a pending request"
-msgstr ""
-
msgid "This user has an unconfirmed email address (%{email}). You may force a confirmation."
msgstr ""
@@ -34633,9 +35099,6 @@ msgstr ""
msgid "ThreatMonitoring|Packet Activity"
msgstr ""
-msgid "ThreatMonitoring|Policies"
-msgstr ""
-
msgid "ThreatMonitoring|Requests"
msgstr ""
@@ -34687,6 +35150,12 @@ msgstr ""
msgid "ThreatMonitoring|View documentation"
msgstr ""
+msgid "Threshold in bytes at which to compress Sidekiq job arguments."
+msgstr ""
+
+msgid "Threshold in bytes at which to reject Sidekiq jobs. Set this to 0 to if you don't want to limit Sidekiq jobs."
+msgstr ""
+
msgid "Throughput"
msgstr ""
@@ -34696,6 +35165,9 @@ msgstr ""
msgid "Time"
msgstr ""
+msgid "Time (in hours) that users are allowed to skip forced configuration of two-factor authentication."
+msgstr ""
+
msgid "Time Spent"
msgstr ""
@@ -34762,7 +35234,7 @@ msgstr ""
msgid "TimeTrackingEstimated|Est"
msgstr ""
-msgid "TimeTracking|%{startTag}Spent: %{endTag}%{timeSpentHumanReadable}"
+msgid "TimeTracking|%{spentStart}Spent: %{spentEnd}"
msgstr ""
msgid "TimeTracking|Estimated:"
@@ -34976,6 +35448,9 @@ msgstr ""
msgid "To access this domain create a new DNS record"
msgstr ""
+msgid "To add a custom suffix, set up a Service Desk email address. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "To add an SSH key you need to %{generate_link_start}generate one%{link_end} or use an %{existing_link_start}existing key%{link_end}."
msgstr ""
@@ -34997,13 +35472,16 @@ msgstr ""
msgid "To connect an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To continue using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
+msgstr ""
+
msgid "To continue, you need to select the link in the confirmation email we sent to verify your email address. If you didn't get our email, select %{strongStart}Resend confirmation email.%{strongEnd}"
msgstr ""
msgid "To define internal users, first enable new users set to external"
msgstr ""
-msgid "To enable Registration Features, make sure \"Enable service ping\" is checked."
+msgid "To enable Registration Features, first enable Service Ping."
msgstr ""
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
@@ -35030,7 +35508,7 @@ msgstr ""
msgid "To get started, use the link below to confirm your account."
msgstr ""
-msgid "To help improve GitLab and its user experience, GitLab will periodically collect usage information."
+msgid "To help improve GitLab and its user experience, GitLab periodically collects usage information."
msgstr ""
msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
@@ -35063,7 +35541,7 @@ msgstr ""
msgid "To preserve performance only %{strong_open}%{display_size} of %{real_size}%{strong_close} files are displayed."
msgstr ""
-msgid "To protect this issue's confidentiality, %{forkLink} and set the fork's visibility to private."
+msgid "To protect this issue's confidentiality, %{linkStart}fork this project%{linkEnd} and set the fork's visibility to private."
msgstr ""
msgid "To protect this issue's confidentiality, a private fork of this project was selected."
@@ -35096,12 +35574,15 @@ msgstr ""
msgid "To set up SAML authentication for your group through an identity provider like Azure, Okta, Onelogin, Ping Identity, or your custom SAML 2.0 provider:"
msgstr ""
-msgid "To set up this service:"
+msgid "To set up this integration:"
msgstr ""
msgid "To specify the notification level per project of a group you belong to, you need to visit project page and change notification level there."
msgstr ""
+msgid "To start using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
+msgstr ""
+
msgid "To unsubscribe from this issue, please paste the following link into your browser:"
msgstr ""
@@ -35689,9 +36170,6 @@ msgstr ""
msgid "Unable to fetch branches list, please close the form and try again"
msgstr ""
-msgid "Unable to fetch unscanned projects"
-msgstr ""
-
msgid "Unable to fetch vulnerable projects"
msgstr ""
@@ -35746,6 +36224,15 @@ msgstr ""
msgid "Unable to update this issue at this time."
msgstr ""
+msgid "Unapprove a merge request"
+msgstr ""
+
+msgid "Unapprove the current merge request."
+msgstr ""
+
+msgid "Unapproved the current merge request."
+msgstr ""
+
msgid "Unarchive project"
msgstr ""
@@ -35758,16 +36245,13 @@ msgstr ""
msgid "Unassigned"
msgstr ""
-msgid "Unauthenticated API request rate limit"
-msgstr ""
-
-msgid "Unauthenticated rate limit period in seconds"
+msgid "Unauthenticated API rate limit period in seconds"
msgstr ""
-msgid "Unauthenticated request rate limit"
+msgid "Unauthenticated requests"
msgstr ""
-msgid "Unauthenticated requests"
+msgid "Unauthenticated web rate limit period in seconds"
msgstr ""
msgid "Undo"
@@ -35869,18 +36353,6 @@ msgstr ""
msgid "Unresolved"
msgstr ""
-msgid "UnscannedProjects|15 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|30 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|5 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|60 or more days"
-msgstr ""
-
msgid "Unschedule job"
msgstr ""
@@ -36100,6 +36572,9 @@ msgstr ""
msgid "UsageQuota|%{help_link_start}Shared runners%{help_link_end} are disabled, so there are no limits set on pipeline usage"
msgstr ""
+msgid "UsageQuota|%{linkTitle} help link"
+msgstr ""
+
msgid "UsageQuota|%{percentageLeft} of purchased storage is available"
msgstr ""
@@ -36109,6 +36584,9 @@ msgstr ""
msgid "UsageQuota|Artifacts is a sum of build and pipeline artifacts."
msgstr ""
+msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
+msgstr ""
+
msgid "UsageQuota|Buy additional minutes"
msgstr ""
@@ -36118,9 +36596,21 @@ msgstr ""
msgid "UsageQuota|CI minutes usage by project"
msgstr ""
+msgid "UsageQuota|Code packages and container images."
+msgstr ""
+
msgid "UsageQuota|Current period usage"
msgstr ""
+msgid "UsageQuota|File attachments and smaller design graphics."
+msgstr ""
+
+msgid "UsageQuota|Git repository, managed by the Gitaly service."
+msgstr ""
+
+msgid "UsageQuota|Includes project registry, artifacts, packages, wiki, uploads and other items."
+msgstr ""
+
msgid "UsageQuota|Increase storage temporarily"
msgstr ""
@@ -36139,6 +36629,9 @@ msgstr ""
msgid "UsageQuota|Packages"
msgstr ""
+msgid "UsageQuota|Pipeline artifacts and job artifacts, created with CI/CD."
+msgstr ""
+
msgid "UsageQuota|Pipelines"
msgstr ""
@@ -36157,6 +36650,9 @@ msgstr ""
msgid "UsageQuota|Seats"
msgstr ""
+msgid "UsageQuota|Shared bits of code and text."
+msgstr ""
+
msgid "UsageQuota|Snippets"
msgstr ""
@@ -36166,6 +36662,12 @@ msgstr ""
msgid "UsageQuota|Storage"
msgstr ""
+msgid "UsageQuota|Storage type"
+msgstr ""
+
+msgid "UsageQuota|There is a known issue with Artifact storage where the total could be incorrect for some projects. More details and progress are available in %{warningLinkStart}the epic%{warningLinkEnd}."
+msgstr ""
+
msgid "UsageQuota|This is the total amount of storage used across your projects within this namespace."
msgstr ""
@@ -36205,6 +36707,9 @@ msgstr ""
msgid "UsageQuota|Usage"
msgstr ""
+msgid "UsageQuota|Usage Breakdown"
+msgstr ""
+
msgid "UsageQuota|Usage Quotas"
msgstr ""
@@ -36229,6 +36734,9 @@ msgstr ""
msgid "UsageQuota|Wiki"
msgstr ""
+msgid "UsageQuota|Wiki content."
+msgstr ""
+
msgid "UsageQuota|Wikis"
msgstr ""
@@ -36445,7 +36953,10 @@ msgstr ""
msgid "User Settings"
msgstr ""
-msgid "User and IP Rate Limits"
+msgid "User and IP rate limits"
+msgstr ""
+
+msgid "User does not have a pending request"
msgstr ""
msgid "User identity was successfully created."
@@ -36742,6 +37253,9 @@ msgstr ""
msgid "Users can launch a development environment from a GitLab browser tab when the %{linkStart}Gitpod%{linkEnd} integration is enabled."
msgstr ""
+msgid "Users can reactivate their account by signing in."
+msgstr ""
+
msgid "Users can render diagrams in AsciiDoc, Markdown, reStructuredText, and Textile documents using Kroki."
msgstr ""
@@ -36757,6 +37271,9 @@ msgstr ""
msgid "Users requesting access to"
msgstr ""
+msgid "Users to exclude from the rate limit"
+msgstr ""
+
msgid "Users were successfully added."
msgstr ""
@@ -36778,6 +37295,9 @@ msgstr ""
msgid "UsersSelect|Unassigned"
msgstr ""
+msgid "Uses GitLab as a lightweight alternative to Sentry."
+msgstr ""
+
msgid "Using %{code_start}::%{code_end} denotes a %{link_start}scoped label set%{link_end}"
msgstr ""
@@ -36808,10 +37328,7 @@ msgstr ""
msgid "Value Stream Analytics can help you determine your team’s velocity"
msgstr ""
-msgid "Value Stream Analytics gives an overview of how much time it takes to go from idea to production in your project."
-msgstr ""
-
-msgid "Value may contain a variable reference"
+msgid "Value might contain a variable reference"
msgstr ""
msgid "Value stream"
@@ -36877,10 +37394,10 @@ msgstr ""
msgid "ValueStream|The Default Value Stream cannot be deleted"
msgstr ""
-msgid "Variable"
+msgid "Values that contain the %{codeStart}$%{codeEnd} character can be considered a variable reference and expanded. %{docsLinkStart}Learn more.%{docsLinkEnd}"
msgstr ""
-msgid "Variable references indicated by %{codeStart}$%{codeEnd} may be expanded. If this is not what you want, consider %{docsLinkStart}using a workaround to prevent expansion%{docsLinkEnd}."
+msgid "Variable"
msgstr ""
msgid "Variable will be masked in job logs."
@@ -37285,6 +37802,9 @@ msgstr ""
msgid "Vulnerability|Evidence"
msgstr ""
+msgid "Vulnerability|False positive detected"
+msgstr ""
+
msgid "Vulnerability|File"
msgstr ""
@@ -37327,6 +37847,9 @@ msgstr ""
msgid "Vulnerability|Status"
msgstr ""
+msgid "Vulnerability|The scanner determined this vulnerability to be a false positive. Verify the evaluation before changing its status. %{linkStart}Learn more about false positive detection.%{linkEnd}"
+msgstr ""
+
msgid "Vulnerability|The unmodified response is the original response that had no mutations done to the request"
msgstr ""
@@ -37651,9 +38174,6 @@ msgstr ""
msgid "Welcome to GitLab,%{br_tag}%{name}!"
msgstr ""
-msgid "Welcome to the guided GitLab tour"
-msgstr ""
-
msgid "Welcome, %{name}!"
msgstr ""
@@ -37672,9 +38192,6 @@ msgstr ""
msgid "What are you searching for?"
msgstr ""
-msgid "What describes you best?"
-msgstr ""
-
msgid "What does this command do?"
msgstr ""
@@ -37696,13 +38213,13 @@ msgstr ""
msgid "What is your job title? (optional)"
msgstr ""
-msgid "What will you use this group for?"
+msgid "What templates can I create?"
msgstr ""
-msgid "What's new"
+msgid "What will you use this group for?"
msgstr ""
-msgid "What’s your experience level?"
+msgid "What's new"
msgstr ""
msgid "When a deployment job is successful, skip older deployment jobs that are still pending."
@@ -37714,6 +38231,9 @@ msgstr ""
msgid "When an event in GitLab triggers a webhook, you can use the request details to figure out if something went wrong."
msgstr ""
+msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+msgstr ""
+
msgid "When inactive, an external authentication provider must be used."
msgstr ""
@@ -37737,6 +38257,9 @@ msgstr ""
msgid "When:"
msgstr ""
+msgid "Which API requests are affected?"
+msgstr ""
+
msgid "While it's rare to have no vulnerabilities, it can happen. In any event, we ask that you please double check your settings to make sure you've set up your dashboard correctly."
msgstr ""
@@ -38016,6 +38539,9 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|Work Items"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -38091,6 +38617,9 @@ msgstr ""
msgid "You are already a member of this %{member_source}."
msgstr ""
+msgid "You are already impersonating another user"
+msgstr ""
+
msgid "You are an admin, which means granting access to %{client_name} will allow them to interact with GitLab as an admin as well. Proceed with caution."
msgstr ""
@@ -38193,6 +38722,9 @@ msgstr ""
msgid "You can also use project access tokens with Git to authenticate over HTTP(S). %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "You can always change your URL later"
+msgstr ""
+
msgid "You can always edit this later"
msgstr ""
@@ -38349,10 +38881,10 @@ msgstr ""
msgid "You can’t %{tag_start}edit%{tag_end} files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
-msgid "You could not create a new trigger."
+msgid "You can’t edit files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
-msgid "You didn't renew your subscription for %{strong}%{namespace_name}%{strong_close} so it was downgraded to the free plan."
+msgid "You could not create a new trigger."
msgstr ""
msgid "You do not have any subscriptions yet"
@@ -38520,6 +39052,12 @@ msgstr ""
msgid "You must provide your current password in order to change it."
msgstr ""
+msgid "You must sign in to search for specific projects."
+msgstr ""
+
+msgid "You must sign in to search for specific terms."
+msgstr ""
+
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
@@ -38547,6 +39085,9 @@ msgstr ""
msgid "You need to upload a GitLab project export archive (ending in .gz)."
msgstr ""
+msgid "You need to verify your primary email first before enabling Two-Factor Authentication."
+msgstr ""
+
msgid "You successfully declined the invitation"
msgstr ""
@@ -38655,10 +39196,10 @@ msgstr ""
msgid "Your %{host} account was signed in to from a new location"
msgstr ""
-msgid "Your %{strong}%{plan_name}%{strong_close} subscription for %{strong}%{namespace_name}%{strong_close} will expire on %{strong}%{expires_on}%{strong_close}."
+msgid "Your %{strong}%{plan_name}%{strong_close} subscription expires on %{strong}%{expires_on}%{strong_close}. After that date, you cannot create issues or merge requests, or use many other features."
msgstr ""
-msgid "Your %{strong}%{plan_name}%{strong_close} subscription will expire on %{strong}%{expires_on}%{strong_close}. After that, you will not be able to create issues or merge requests as well as many other features."
+msgid "Your %{strong}%{plan_name}%{strong_close} subscription for %{strong}%{namespace_name}%{strong_close} will expire on %{strong}%{expires_on}%{strong_close}."
msgstr ""
msgid "Your CI/CD configuration syntax is invalid. View Lint tab for more details."
@@ -38682,7 +39223,7 @@ msgstr ""
msgid "Your GPG keys (%{count})"
msgstr ""
-msgid "Your GitLab account has been locked due to an excessive amount of unsuccessful sign in attempts. Your account will automatically unlock in %{duration} or you may click the link below to unlock now."
+msgid "Your GitLab account has been locked due to an excessive number of unsuccessful sign in attempts. You can wait for your account to automatically unlock in %{duration} or you can click the link below to unlock now."
msgstr ""
msgid "Your GitLab account request has been approved!"
@@ -38793,6 +39334,9 @@ msgstr ""
msgid "Your commit email is used for web based operations, such as edits and merges."
msgstr ""
+msgid "Your current password is required to register a two-factor authenticator app."
+msgstr ""
+
msgid "Your dashboard has been copied. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
@@ -38892,6 +39436,9 @@ msgstr ""
msgid "Your project limit is %{limit} projects! Please contact your administrator to increase it"
msgstr ""
+msgid "Your project will be created at:"
+msgstr ""
+
msgid "Your projects"
msgstr ""
@@ -38931,11 +39478,10 @@ msgstr ""
msgid "Your subscription expired!"
msgstr ""
-msgid "Your subscription has been downgraded."
-msgstr ""
-
-msgid "Your subscription will expire in %{remaining_days}."
-msgstr ""
+msgid "Your subscription will expire in %{remaining_days} day."
+msgid_plural "Your subscription will expire in %{remaining_days} days."
+msgstr[0] ""
+msgstr[1] ""
msgid "Your username is %{username}."
msgstr ""
@@ -39142,6 +39688,9 @@ msgstr ""
msgid "cannot merge"
msgstr ""
+msgid "cannot not be used for user namespace"
+msgstr ""
+
msgid "ciReport|%{degradedNum} degraded"
msgstr ""
@@ -39465,6 +40014,9 @@ msgstr ""
msgid "created %{timeAgo}"
msgstr ""
+msgid "created %{timeAgo} by %{author}"
+msgstr ""
+
msgid "created by"
msgstr ""
@@ -39509,9 +40061,6 @@ msgstr ""
msgid "does not have a supported extension. Only %{extension_list} are supported"
msgstr ""
-msgid "domain is not authorized for sign-up."
-msgstr ""
-
msgid "download it"
msgstr ""
@@ -39529,18 +40078,13 @@ msgstr ""
msgid "email '%{email}' is not a verified email."
msgstr ""
-msgid "email does not match the allowed domain of %{email_domains}"
-msgid_plural "email does not match the allowed domains: %{email_domains}"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "enabled"
msgstr ""
msgid "encrypted: needs to be a :required, :optional or :migrating!"
msgstr ""
-msgid "ending with MIME type format is not allowed."
+msgid "ending with a reserved file extension is not allowed."
msgstr ""
msgid "entries cannot be larger than 255 characters"
@@ -39564,6 +40108,9 @@ msgstr ""
msgid "estimateCommand|%{slash_command} overwrites the total estimated time."
msgstr ""
+msgid "example.com"
+msgstr ""
+
msgid "exceeds the limit of %{bytes} bytes"
msgstr ""
@@ -39614,9 +40161,6 @@ msgstr ""
msgid "fork"
msgstr ""
-msgid "fork this project"
-msgstr ""
-
msgid "from"
msgstr ""
@@ -39625,6 +40169,9 @@ msgid_plural "from %d jobs"
msgstr[0] ""
msgstr[1] ""
+msgid "frontmatter"
+msgstr ""
+
msgid "group"
msgstr ""
@@ -39652,6 +40199,9 @@ msgstr ""
msgid "has been completed."
msgstr ""
+msgid "has too deep level of nesting"
+msgstr ""
+
msgid "help"
msgstr ""
@@ -39685,9 +40235,21 @@ msgstr ""
msgid "in"
msgstr ""
+msgid "in Infrastructure :: Kubernetes clusters"
+msgstr ""
+
+msgid "in all GitLab"
+msgstr ""
+
+msgid "in group"
+msgstr ""
+
msgid "in group %{link_to_group}"
msgstr ""
+msgid "in project"
+msgstr ""
+
msgid "in project %{link_to_project}"
msgstr ""
@@ -39729,16 +40291,19 @@ msgstr ""
msgid "is not a valid X509 certificate."
msgstr ""
-msgid "is not allowed since the group is not top-level group."
+msgid "is not allowed for sign-up."
msgstr ""
-msgid "is not allowed. Try again with a different email address, or contact your GitLab admin."
+msgid "is not allowed for this group."
msgstr ""
-msgid "is not allowed. We do not currently support project-level iterations"
+msgid "is not allowed for this project."
+msgstr ""
+
+msgid "is not allowed since the group is not top-level group."
msgstr ""
-msgid "is not from an allowed domain."
+msgid "is not allowed. We do not currently support project-level iterations"
msgstr ""
msgid "is not in the group enforcing Group Managed Account"
@@ -39831,6 +40396,9 @@ msgstr ""
msgid "log in"
msgstr ""
+msgid "managed"
+msgstr ""
+
msgid "manual"
msgstr ""
@@ -39878,6 +40446,9 @@ msgstr ""
msgid "mrWidget| Please restore it or use a different %{missingBranchName} branch"
msgstr ""
+msgid "mrWidget|%{linkStart}Set up now%{linkEnd} to analyze your source code for known security vulnerabilities."
+msgstr ""
+
msgid "mrWidget|%{mergeError}."
msgstr ""
@@ -39958,6 +40529,9 @@ msgid_plural "mrWidget|Closes issues"
msgstr[0] ""
msgstr[1] ""
+msgid "mrWidget|Create issue to resolve all threads"
+msgstr ""
+
msgid "mrWidget|Delete source branch"
msgstr ""
@@ -39967,12 +40541,18 @@ msgstr ""
msgid "mrWidget|Did not close"
msgstr ""
+msgid "mrWidget|Dismiss"
+msgstr ""
+
msgid "mrWidget|Email patches"
msgstr ""
msgid "mrWidget|Failed to load deployment statistics"
msgstr ""
+msgid "mrWidget|Hide %{widget} details"
+msgstr ""
+
msgid "mrWidget|If the %{missingBranchName} branch exists in your local repository, you can merge this merge request manually using the command line"
msgstr ""
@@ -40068,9 +40648,6 @@ msgstr ""
msgid "mrWidget|Request to merge"
msgstr ""
-msgid "mrWidget|Resolve all threads in new issue"
-msgstr ""
-
msgid "mrWidget|Resolve conflicts"
msgstr ""
@@ -40086,6 +40663,9 @@ msgstr ""
msgid "mrWidget|Revoke approval"
msgstr ""
+msgid "mrWidget|SAST and Secret Detection is not enabled."
+msgstr ""
+
msgid "mrWidget|Set by %{merge_author} to be added to the merge train when the pipeline succeeds"
msgstr ""
@@ -40095,6 +40675,9 @@ msgstr ""
msgid "mrWidget|Set by %{merge_author} to start a merge train when the pipeline succeeds"
msgstr ""
+msgid "mrWidget|Show %{widget} details"
+msgstr ""
+
msgid "mrWidget|The changes were merged into"
msgstr ""
@@ -40107,6 +40690,9 @@ msgstr ""
msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure, or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
msgstr ""
+msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure."
+msgstr ""
+
msgid "mrWidget|The source branch has been deleted"
msgstr ""
@@ -40149,6 +40735,9 @@ msgstr ""
msgid "mrWidget|You can merge after removing denied licenses"
msgstr ""
+msgid "mrWidget|You can only merge once this merge request is approved."
+msgstr ""
+
msgid "mrWidget|Your password"
msgstr ""
@@ -40185,6 +40774,9 @@ msgstr ""
msgid "must be less than the limit of %{tag_limit} tags"
msgstr ""
+msgid "must be set for a project namespace"
+msgstr ""
+
msgid "must be unique by status and elapsed time within a policy"
msgstr ""
@@ -40294,6 +40886,9 @@ msgstr ""
msgid "pipeline"
msgstr ""
+msgid "pipeline schedules documentation"
+msgstr ""
+
msgid "pod_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
msgstr ""
@@ -40343,16 +40938,25 @@ msgstr ""
msgid "project name"
msgstr ""
+msgid "project namespace cannot be the parent of another namespace"
+msgstr ""
+
msgid "projects"
msgstr ""
msgid "quick actions"
msgstr ""
-msgid "reCAPTCHA Private Key"
+msgid "reCAPTCHA"
+msgstr ""
+
+msgid "reCAPTCHA helps prevent credential stuffing."
msgstr ""
-msgid "reCAPTCHA Site Key"
+msgid "reCAPTCHA private key"
+msgstr ""
+
+msgid "reCAPTCHA site key"
msgstr ""
msgid "recent activity"
@@ -40579,6 +41183,9 @@ msgstr ""
msgid "user avatar"
msgstr ""
+msgid "user namespace cannot be the parent of another namespace"
+msgstr ""
+
msgid "user preferences"
msgstr ""
@@ -40671,3 +41278,9 @@ msgstr ""
msgid "your settings"
msgstr ""
+msgid "{group}"
+msgstr ""
+
+msgid "{project}"
+msgstr ""
+
diff --git a/locale/az_AZ/gitlab.po b/locale/az_AZ/gitlab.po
index 6a6be9d7653..6062ed7b4b1 100644
--- a/locale/az_AZ/gitlab.po
+++ b/locale/az_AZ/gitlab.po
@@ -14,10 +14,7 @@ msgstr ""
"X-Crowdin-Language: az\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-09-01 22:31\n"
-
-msgid " %{name}, confirm your email address now! "
-msgstr ""
+"PO-Revision-Date: 2021-10-04 20:19\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -92,6 +89,16 @@ msgstr ""
msgid "#general, #development"
msgstr ""
+msgid "%d Alert"
+msgid_plural "%d Alerts"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d Alert:"
+msgid_plural "%d Alerts:"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d Approval"
msgid_plural "%d Approvals"
msgstr[0] ""
@@ -455,7 +462,10 @@ msgstr ""
msgid "%{code_open}Protected:%{code_close} Only exposed to protected branches or tags."
msgstr ""
-msgid "%{commit_author_link} authored %{commit_timeago}"
+msgid "%{commit_author_link} authored %{commit_authored_timeago}"
+msgstr ""
+
+msgid "%{commit_author_link} authored %{commit_authored_timeago} and %{commit_committer_avatar} %{commit_committer_link} committed %{commit_committer_timeago}"
msgstr ""
msgid "%{completedCount} completed weight"
@@ -549,6 +559,15 @@ msgstr ""
msgid "%{doc_link_start}Advanced search%{doc_link_end} is enabled."
msgstr ""
+msgid "%{docs_link_start}Learn about visibility levels.%{docs_link_end}"
+msgstr ""
+
+msgid "%{docs_link_start}What is Large File Storage?%{docs_link_end}"
+msgstr ""
+
+msgid "%{docs_link_start}What is two-factor authentication?%{docs_link_end}"
+msgstr ""
+
msgid "%{due_date} (Past due)"
msgstr ""
@@ -621,9 +640,6 @@ msgstr ""
msgid "%{issueType} actions"
msgstr ""
-msgid "%{issuesCount} issues with a limit of %{maxIssueCount}"
-msgstr ""
-
msgid "%{issuesSize} with a limit of %{maxIssueCount}"
msgstr ""
@@ -681,6 +697,12 @@ msgstr ""
msgid "%{label_for_message} unavailable"
msgstr ""
+msgid "%{learn_more_link}."
+msgstr ""
+
+msgid "%{lessThan} 1 hour"
+msgstr ""
+
msgid "%{lets_encrypt_link_start}Let's Encrypt%{lets_encrypt_link_end} is a free, automated, and open certificate authority (CA) that issues digital certificates to enable HTTPS (SSL/TLS) for sites."
msgstr ""
@@ -693,15 +715,15 @@ msgstr ""
msgid "%{link_start}Learn more%{link_end} about roles."
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
-msgstr ""
-
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
msgstr ""
msgid "%{link_start}Start the title with %{draft_snippet}%{link_end} to prevent a merge request that is a work in progress from being merged before it's ready."
msgstr ""
+msgid "%{link_start}What information does GitLab Inc. collect?%{link_end}"
+msgstr ""
+
msgid "%{listToShow}, and %{awardsListLength} more"
msgstr ""
@@ -854,7 +876,7 @@ msgid_plural "%{securityScanner} results are not available because a pipeline ha
msgstr[0] ""
msgstr[1] ""
-msgid "%{service_ping_link_start}Learn more%{service_ping_link_end} about what information is shared with GitLab Inc."
+msgid "%{service_ping_link_start}What information is shared with GitLab Inc.?%{service_ping_link_end}"
msgstr ""
msgid "%{size} %{unit}"
@@ -890,6 +912,9 @@ msgstr ""
msgid "%{state} epics"
msgstr ""
+msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
+msgstr ""
+
msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
msgstr ""
@@ -949,11 +974,6 @@ msgstr ""
msgid "%{template_project_id} is unknown or invalid"
msgstr ""
-msgid "%{text} %{files}"
-msgid_plural "%{text} %{files} files"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%{text} is available"
msgstr ""
@@ -1038,9 +1058,6 @@ msgstr ""
msgid "%{wildcards_link_start}Wildcards%{wildcards_link_end} such as %{code_tag_start}v*%{code_tag_end} or %{code_tag_start}*-release%{code_tag_end} are supported."
msgstr ""
-msgid "&lt; 1 hour"
-msgstr ""
-
msgid "'%{data}' at %{location} does not match format: %{format}"
msgstr ""
@@ -1124,9 +1141,6 @@ msgstr ""
msgid "(we need your current password to confirm your changes)"
msgstr ""
-msgid "* * * * *"
-msgstr ""
-
msgid "+ %{amount} more"
msgstr ""
@@ -1193,10 +1207,10 @@ msgstr ""
msgid "."
msgstr ""
-msgid "0 bytes"
+msgid "/"
msgstr ""
-msgid "0 for unlimited, only effective with remote storage enabled."
+msgid "0 bytes"
msgstr ""
msgid "0t1DgySidms"
@@ -1326,6 +1340,9 @@ msgstr ""
msgid "1000+"
msgstr ""
+msgid "192.168.0.0/24"
+msgstr ""
+
msgid "1st contribution!"
msgstr ""
@@ -1479,9 +1496,6 @@ msgstr ""
msgid "A plain HTML site that uses Netlify for CI/CD instead of GitLab, but still with all the other great GitLab features"
msgstr ""
-msgid "A plain-text response to show to clients that hit the rate limit."
-msgstr ""
-
msgid "A platform value can be web, mob or app."
msgstr ""
@@ -1563,7 +1577,7 @@ msgstr ""
msgid "APIFuzzing|Configure HTTP basic authentication values. Other authentication methods are supported. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
+msgid "APIFuzzing|Customize your project's API fuzzing configuration options and copy the code snippet to your .gitlab-ci.yml file to apply any changes. Note that this tool does not reflect or update your .gitlab-ci.yml file automatically. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
msgstr ""
msgid "APIFuzzing|Enable authentication"
@@ -1626,9 +1640,6 @@ msgstr ""
msgid "APIFuzzing|To prevent a security leak, authentication info must be added as a %{ciVariablesLinkStart}CI variable%{ciVariablesLinkEnd}. As a user with maintainer access rights, you can manage CI variables in the %{ciSettingsLinkStart}Settings%{ciSettingsLinkEnd} area."
msgstr ""
-msgid "APIFuzzing|Use this tool to generate API fuzzing configuration YAML to copy into your .gitlab-ci.yml file. This tool does not reflect or update your .gitlab-ci.yml file automatically."
-msgstr ""
-
msgid "APIFuzzing|Username for basic authentication"
msgstr ""
@@ -1680,9 +1691,6 @@ msgstr ""
msgid "Abuse reports notification email"
msgstr ""
-msgid "Abuse reports will be sent to this address if it is set. Abuse reports are always available in the admin area."
-msgstr ""
-
msgid "Accept invitation"
msgstr ""
@@ -1719,12 +1727,18 @@ msgstr ""
msgid "Access granted"
msgstr ""
+msgid "Access key ID"
+msgstr ""
+
msgid "Access requests"
msgstr ""
msgid "Access to '%{classification_label}' not allowed"
msgstr ""
+msgid "Access tokens expire after 2 hours. A refresh token may be used at any time to generate a new access token. Non-expiring access tokens are deprecated. Clear this setting to enable backward compatibility."
+msgstr ""
+
msgid "AccessDropdown|Deploy Keys"
msgstr ""
@@ -2037,6 +2051,9 @@ msgstr ""
msgid "Add new directory"
msgstr ""
+msgid "Add new service account"
+msgstr ""
+
msgid "Add or remove previously merged commits"
msgstr ""
@@ -2274,6 +2291,9 @@ msgstr ""
msgid "AdminArea|Features"
msgstr ""
+msgid "AdminArea|Get security updates from GitLab and stay up to date"
+msgstr ""
+
msgid "AdminArea|Groups"
msgstr ""
@@ -2313,6 +2333,12 @@ msgstr ""
msgid "AdminArea|Reporter"
msgstr ""
+msgid "AdminArea|Sign up for the GitLab Security Newsletter to get notified for security updates."
+msgstr ""
+
+msgid "AdminArea|Sign up for the GitLab newsletter"
+msgstr ""
+
msgid "AdminArea|Stop all jobs"
msgstr ""
@@ -2382,9 +2408,15 @@ msgstr ""
msgid "AdminSettings|Disable public access to Pages sites"
msgstr ""
+msgid "AdminSettings|Display a banner on merge requests in projects with no pipelines to initiate steps to add a .gitlab-ci.yml file."
+msgstr ""
+
msgid "AdminSettings|Domain verification is an essential security measure for public GitLab sites. Users are required to demonstrate they control a domain before it is enabled. %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "AdminSettings|Enable pipeline suggestion banner"
+msgstr ""
+
msgid "AdminSettings|Enable shared runners for new projects"
msgstr ""
@@ -2856,10 +2888,10 @@ msgstr ""
msgid "Admin|Quarterly reconciliation will occur on %{qrtlyDate}"
msgstr ""
-msgid "Admin|The number of max seats used for your namespace is currently exceeding the number of seats in your subscription. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgid "Admin|The number of max seats in your namespace exceeds the number of seats in your subscription. On %{qrtlyDate}, quarterly reconciliation occurs and you are automatically billed a prorated amount for the overage. No action is needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice. For more information about the timing of the invoicing process, view the documentation."
msgstr ""
-msgid "Admin|The number of maximum users for your instance is currently exceeding the number of users in license. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgid "Admin|The number of max users in your instance exceeds the number of users in your license. On %{qrtlyDate}, quarterly reconciliation occurs and you are automatically billed a prorated amount for the overage. No action is needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice. For more information about the timing of the invoicing process, view the documentation."
msgstr ""
msgid "Admin|View pending user approvals"
@@ -2880,9 +2912,6 @@ msgstr ""
msgid "Advanced export options"
msgstr ""
-msgid "Advanced permissions, Large File Storage and Two-Factor authentication settings."
-msgstr ""
-
msgid "After a successful password update you will be redirected to login screen."
msgstr ""
@@ -2901,13 +2930,14 @@ msgstr ""
msgid "After you've reviewed these contribution guidelines, you'll be all set to"
msgstr ""
+msgid "Akismet"
+msgstr ""
+
msgid "Akismet API Key"
msgstr ""
-msgid "Alert"
-msgid_plural "Alerts"
-msgstr[0] ""
-msgstr[1] ""
+msgid "Akismet helps prevent the creation of spam issues in public projects."
+msgstr ""
msgid "AlertManagement|Acknowledged"
msgstr ""
@@ -3263,6 +3293,9 @@ msgstr ""
msgid "All (default)"
msgstr ""
+msgid "All GitLab"
+msgstr ""
+
msgid "All Members"
msgstr ""
@@ -3377,6 +3410,9 @@ msgstr ""
msgid "Allow this secondary node to replicate content on Object Storage"
msgstr ""
+msgid "Allow use of licensed EE features"
+msgstr ""
+
msgid "Allow users to dismiss the broadcast message"
msgstr ""
@@ -3452,9 +3488,6 @@ msgstr ""
msgid "Amazon authentication is not %{link_start}correctly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
-msgid "Amount of time (in hours) that users are allowed to skip forced configuration of two-factor authentication"
-msgstr ""
-
msgid "An %{link_start}alert%{link_end} with the same fingerprint is already open. To change the status of this alert, resolve the linked alert."
msgstr ""
@@ -3515,12 +3548,6 @@ msgstr ""
msgid "An error occurred when removing the label."
msgstr ""
-msgid "An error occurred when toggling the notification subscription"
-msgstr ""
-
-msgid "An error occurred when updating the issue weight"
-msgstr ""
-
msgid "An error occurred when updating the title"
msgstr ""
@@ -3569,6 +3596,9 @@ msgstr ""
msgid "An error occurred while enabling Service Desk."
msgstr ""
+msgid "An error occurred while fetching Markdown preview"
+msgstr ""
+
msgid "An error occurred while fetching ancestors"
msgstr ""
@@ -3599,9 +3629,6 @@ msgstr ""
msgid "An error occurred while fetching label colors."
msgstr ""
-msgid "An error occurred while fetching markdown preview"
-msgstr ""
-
msgid "An error occurred while fetching participants"
msgstr ""
@@ -3617,9 +3644,6 @@ msgstr ""
msgid "An error occurred while fetching reference"
msgstr ""
-msgid "An error occurred while fetching sidebar data"
-msgstr ""
-
msgid "An error occurred while fetching tags. Retry the search."
msgstr ""
@@ -3695,6 +3719,9 @@ msgstr ""
msgid "An error occurred while loading merge requests."
msgstr ""
+msgid "An error occurred while loading projects."
+msgstr ""
+
msgid "An error occurred while loading the Needs tab."
msgstr ""
@@ -3929,12 +3956,6 @@ msgstr ""
msgid "Any Milestone"
msgstr ""
-msgid "Any branch"
-msgstr ""
-
-msgid "Any eligible user"
-msgstr ""
-
msgid "Any encrypted tokens"
msgstr ""
@@ -3953,6 +3974,9 @@ msgstr ""
msgid "Any namespace"
msgstr ""
+msgid "App Engine description and apps that are suitable for this deployment target"
+msgstr ""
+
msgid "App ID"
msgstr ""
@@ -4101,6 +4125,11 @@ msgstr ""
msgid "Apply"
msgstr ""
+msgid "Apply %d suggestion"
+msgid_plural "Apply %d suggestions"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Apply a label"
msgstr ""
@@ -4110,13 +4139,10 @@ msgstr ""
msgid "Apply suggestion"
msgstr ""
-msgid "Apply suggestions"
-msgstr ""
-
msgid "Apply template"
msgstr ""
-msgid "Apply this approval rule to any branch or a specific protected branch."
+msgid "Apply this approval rule to all branches or a specific protected branch."
msgstr ""
msgid "Applying"
@@ -4259,9 +4285,6 @@ msgstr ""
msgid "ApprovalSettings|Prevent editing approval rules in projects and merge requests."
msgstr ""
-msgid "ApprovalSettings|Prevent editing approval rules in projects and merge requests. "
-msgstr ""
-
msgid "ApprovalSettings|Remove all approvals when commits are added to the source branch."
msgstr ""
@@ -4277,6 +4300,9 @@ msgstr ""
msgid "ApprovalSettings|This setting is configured at the instance level and can only be changed by an administrator."
msgstr ""
+msgid "ApprovalSettings|This setting is configured in %{groupName} and can only be changed by an administrator or group owner."
+msgstr ""
+
msgid "ApprovalStatusTooltip|Adheres to separation of duties"
msgstr ""
@@ -4763,9 +4789,6 @@ msgstr ""
msgid "Authenticated API rate limit period in seconds"
msgstr ""
-msgid "Authenticated API request rate limit"
-msgstr ""
-
msgid "Authenticated API requests"
msgstr ""
@@ -4775,10 +4798,10 @@ msgstr ""
msgid "Authenticated Git LFS request rate limit"
msgstr ""
-msgid "Authenticated web rate limit period in seconds"
+msgid "Authenticated Git LFS requests"
msgstr ""
-msgid "Authenticated web request rate limit"
+msgid "Authenticated web rate limit period in seconds"
msgstr ""
msgid "Authenticated web requests"
@@ -5156,9 +5179,6 @@ msgstr ""
msgid "Below you will find all the groups that are public."
msgstr ""
-msgid "Beta"
-msgstr ""
-
msgid "Bi-weekly code coverage"
msgstr ""
@@ -5398,6 +5418,21 @@ msgstr ""
msgid "Board scope affects which issues are displayed for anyone who visits this board"
msgstr ""
+msgid "BoardNewEpic|Groups"
+msgstr ""
+
+msgid "BoardNewEpic|Loading groups"
+msgstr ""
+
+msgid "BoardNewEpic|No matching results"
+msgstr ""
+
+msgid "BoardNewEpic|Search groups"
+msgstr ""
+
+msgid "BoardNewEpic|Select a group"
+msgstr ""
+
msgid "BoardNewIssue|No matching results"
msgstr ""
@@ -5475,6 +5510,9 @@ msgstr ""
msgid "Boards|An error occurred while creating the list. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching child groups. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching group projects. Please try again."
msgstr ""
@@ -5807,6 +5845,9 @@ msgstr ""
msgid "Bulk update"
msgstr ""
+msgid "BulkImports|Re-import creates a new group. It does not sync with the existing group."
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -5816,6 +5857,9 @@ msgstr ""
msgid "BulkImport|From source group"
msgstr ""
+msgid "BulkImport|Group import history"
+msgstr ""
+
msgid "BulkImport|Import failed: Destination cannot be a subgroup of the source group. Change the destination and try again."
msgstr ""
@@ -5828,9 +5872,18 @@ msgstr ""
msgid "BulkImport|Importing the group failed"
msgstr ""
+msgid "BulkImport|Last imported to %{link}"
+msgstr ""
+
msgid "BulkImport|Name already exists."
msgstr ""
+msgid "BulkImport|New group"
+msgstr ""
+
+msgid "BulkImport|No history is available"
+msgstr ""
+
msgid "BulkImport|No parent"
msgstr ""
@@ -5843,6 +5896,9 @@ msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} matching filter \"%{filter}\" from %{link}"
msgstr ""
+msgid "BulkImport|Source group"
+msgstr ""
+
msgid "BulkImport|To new group"
msgstr ""
@@ -5852,6 +5908,9 @@ msgstr ""
msgid "BulkImport|You have no groups to import"
msgstr ""
+msgid "BulkImport|Your imported groups will appear here."
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -6094,6 +6153,9 @@ msgstr ""
msgid "Can be manually deployed to"
msgstr ""
+msgid "Can be overridden in each project."
+msgstr ""
+
msgid "Can create groups:"
msgstr ""
@@ -6196,6 +6258,9 @@ msgstr ""
msgid "Cancelling Preview"
msgstr ""
+msgid "Cannot assign a confidential epic to a non-confidential issue. Make the issue confidential and try again"
+msgstr ""
+
msgid "Cannot be assigned to other projects."
msgstr ""
@@ -6247,9 +6312,6 @@ msgstr ""
msgid "Cannot refer to a group %{timebox_type} by an internal id!"
msgstr ""
-msgid "Cannot set confidential epic for a non-confidential issue"
-msgstr ""
-
msgid "Cannot show preview. For previews on sketch files, they must have the file format introduced by Sketch version 43 and above."
msgstr ""
@@ -6487,15 +6549,15 @@ msgstr ""
msgid "Check out, review, and merge locally"
msgstr ""
-msgid "Check the %{docs_link_start}documentation%{docs_link_end}."
-msgstr ""
-
msgid "Check the current instance configuration "
msgstr ""
msgid "Check the elasticsearch.log file to debug why the migration was halted and make any changes before retrying the migration. When you fix the cause of the failure, click \"Retry migration\", and the migration will be scheduled to be retried in the background."
msgstr ""
+msgid "Check with your administrator."
+msgstr ""
+
msgid "Check your Docker images for known vulnerabilities."
msgstr ""
@@ -6526,6 +6588,9 @@ msgstr ""
msgid "Checkout"
msgstr ""
+msgid "Checkout|$%{selectedPlanPrice} per 10 GB storage per pack"
+msgstr ""
+
msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 minutes"
msgstr ""
@@ -6546,17 +6611,23 @@ msgstr ""
msgid "Checkout|%{name}'s GitLab subscription"
msgstr ""
-msgid "Checkout|%{selectedPlanText} plan"
+msgid "Checkout|%{name}'s storage subscription"
msgstr ""
-msgid "Checkout|%{startDate} - %{endDate}"
+msgid "Checkout|%{quantity} GB of storage"
msgstr ""
-msgid "Checkout|%{totalCiMinutes} CI minute"
-msgid_plural "Checkout|%{totalCiMinutes} CI minutes"
+msgid "Checkout|%{quantity} storage pack"
+msgid_plural "Checkout|%{quantity} storage packs"
msgstr[0] ""
msgstr[1] ""
+msgid "Checkout|%{selectedPlanText} plan"
+msgstr ""
+
+msgid "Checkout|%{startDate} - %{endDate}"
+msgstr ""
+
msgid "Checkout|%{totalCiMinutes} CI minutes"
msgstr ""
@@ -6632,6 +6703,9 @@ msgstr ""
msgid "Checkout|Failed to register credit card. Please try again."
msgstr ""
+msgid "Checkout|GB"
+msgstr ""
+
msgid "Checkout|GitLab group"
msgstr ""
@@ -6668,6 +6742,9 @@ msgstr ""
msgid "Checkout|State"
msgstr ""
+msgid "Checkout|Storage packs"
+msgstr ""
+
msgid "Checkout|Street address"
msgstr ""
@@ -6689,6 +6766,9 @@ msgstr ""
msgid "Checkout|Total minutes: %{quantity}"
msgstr ""
+msgid "Checkout|Total storage: %{quantity} GB"
+msgstr ""
+
msgid "Checkout|Users"
msgstr ""
@@ -6698,16 +6778,25 @@ msgstr ""
msgid "Checkout|Your organization"
msgstr ""
+msgid "Checkout|Your storage subscription has the same term as your main subscription, and the price is prorated accordingly."
+msgstr ""
+
msgid "Checkout|Your subscription will be applied to this group"
msgstr ""
msgid "Checkout|Zip code"
msgstr ""
+msgid "Checkout|a storage subscription"
+msgstr ""
+
msgid "Checkout|company or team"
msgstr ""
-msgid "Checkout|x 1,000 minutes per pack = %{strong}"
+msgid "Checkout|minutes"
+msgstr ""
+
+msgid "Checkout|x %{quantity} %{units} per pack ="
msgstr ""
msgid "Cherry-pick this commit"
@@ -7064,6 +7153,9 @@ msgstr ""
msgid "CloneIssue|Cannot clone issue to target project as it is pending deletion."
msgstr ""
+msgid "CloneIssue|Cannot clone issues of '%{issue_type}' type."
+msgstr ""
+
msgid "Cloned this issue to %{path_to_project}."
msgstr ""
@@ -7118,7 +7210,10 @@ msgstr ""
msgid "Closes this %{quick_action_target}."
msgstr ""
-msgid "Cloud licenses can not be removed."
+msgid "Cloud Functions description and apps that are suitable for this deployment target"
+msgstr ""
+
+msgid "Cloud Run description and apps that are suitable for this deployment target"
msgstr ""
msgid "Cluster"
@@ -7145,6 +7240,12 @@ msgstr ""
msgid "ClusterAgents|Access tokens"
msgstr ""
+msgid "ClusterAgents|Agent might not be connected to GitLab"
+msgstr ""
+
+msgid "ClusterAgents|Agent never connected to GitLab"
+msgstr ""
+
msgid "ClusterAgents|Alternative installation methods"
msgstr ""
@@ -7160,6 +7261,12 @@ msgstr ""
msgid "ClusterAgents|Configuration"
msgstr ""
+msgid "ClusterAgents|Connected"
+msgstr ""
+
+msgid "ClusterAgents|Connection status"
+msgstr ""
+
msgid "ClusterAgents|Copy token"
msgstr ""
@@ -7178,6 +7285,9 @@ msgstr ""
msgid "ClusterAgents|For alternative installation methods %{linkStart}go to the documentation%{linkEnd}."
msgstr ""
+msgid "ClusterAgents|For more troubleshooting information go to"
+msgstr ""
+
msgid "ClusterAgents|Go to the repository"
msgstr ""
@@ -7193,18 +7303,30 @@ msgstr ""
msgid "ClusterAgents|Integrate with the GitLab Agent"
msgstr ""
-msgid "ClusterAgents|Last used"
+msgid "ClusterAgents|Last connected %{timeAgo}."
+msgstr ""
+
+msgid "ClusterAgents|Last contact"
msgstr ""
msgid "ClusterAgents|Learn how to create an agent access token"
msgstr ""
+msgid "ClusterAgents|Make sure you are using a valid token."
+msgstr ""
+
msgid "ClusterAgents|Name"
msgstr ""
msgid "ClusterAgents|Never"
msgstr ""
+msgid "ClusterAgents|Never connected"
+msgstr ""
+
+msgid "ClusterAgents|Not connected"
+msgstr ""
+
msgid "ClusterAgents|Read more about getting started"
msgstr ""
@@ -7226,6 +7348,9 @@ msgstr ""
msgid "ClusterAgents|Select which Agent you want to install"
msgstr ""
+msgid "ClusterAgents|The Agent has not been connected in a long time. There might be a connectivity issue. Last contact was %{timeAgo}."
+msgstr ""
+
msgid "ClusterAgents|The GitLab Agent also requires %{linkStart}enabling the Agent Server%{linkEnd}"
msgstr ""
@@ -7253,9 +7378,6 @@ msgstr ""
msgid "ClusterAgents|You will need to create a token to connect to your agent"
msgstr ""
-msgid "ClusterAgent|This feature is only available for premium plans"
-msgstr ""
-
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -7445,9 +7567,6 @@ msgstr ""
msgid "ClusterIntegration|Create Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Create a provision role on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the account and external ID above. %{startMoreInfoLink}More information%{endLink}"
-msgstr ""
-
msgid "ClusterIntegration|Create cluster on"
msgstr ""
@@ -7880,7 +7999,7 @@ msgstr ""
msgid "ClusterIntegration|Subnets"
msgstr ""
-msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provisioned role, first create one on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the above account and external IDs. %{startMoreInfoLink}More information%{endLink}"
+msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provisioned role, first create one on %{awsLinkStart}Amazon Web Services %{awsLinkEnd} using the above account and external IDs. %{moreInfoStart}More information%{moreInfoEnd}"
msgstr ""
msgid "ClusterIntegration|The Kubernetes certificate used to authenticate to the cluster."
@@ -8114,6 +8233,9 @@ msgstr ""
msgid "Collapse replies"
msgstr ""
+msgid "Collapse settings section"
+msgstr ""
+
msgid "Collapse sidebar"
msgstr ""
@@ -8132,6 +8254,9 @@ msgstr ""
msgid "Comma-separated list of email addresses."
msgstr ""
+msgid "Comma-separated list of users allowed to exceed the rate limit."
+msgstr ""
+
msgid "Comma-separated, e.g. '1.1.1.1, 2.2.2.0/24'"
msgstr ""
@@ -8452,6 +8577,9 @@ msgstr ""
msgid "Configure %{repository_checks_link_start}repository checks%{link_end} and %{housekeeping_link_start}housekeeping%{link_end} on repositories."
msgstr ""
+msgid "Configure CAPTCHAs, IP address limits, and other anti-spam measures."
+msgstr ""
+
msgid "Configure Dependency Scanning in `.gitlab-ci.yml` using the GitLab managed template. You can [add variable overrides](https://docs.gitlab.com/ee/user/application_security/dependency_scanning/#customizing-the-dependency-scanning-settings) to customize Dependency Scanning settings."
msgstr ""
@@ -8488,16 +8616,13 @@ msgstr ""
msgid "Configure a %{codeStart}.gitlab-webide.yml%{codeEnd} file in the %{codeStart}.gitlab%{codeEnd} directory to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
msgstr ""
-msgid "Configure existing installation"
-msgstr ""
-
-msgid "Configure limit for notes created per minute by web and API requests."
+msgid "Configure advanced permissions, Large File Storage, and two-factor authentication settings."
msgstr ""
-msgid "Configure limits for Project/Group Import/Export."
+msgid "Configure approvals by authors and committers on all projects."
msgstr ""
-msgid "Configure limits for web and API requests."
+msgid "Configure existing installation"
msgstr ""
msgid "Configure paths to be protected by Rack Attack."
@@ -8512,10 +8637,13 @@ msgstr ""
msgid "Configure settings for Advanced Search with Elasticsearch."
msgstr ""
+msgid "Configure specific limits for Files API requests that supersede the general user and IP rate limits."
+msgstr ""
+
msgid "Configure specific limits for Git LFS requests that supersede the general user and IP rate limits."
msgstr ""
-msgid "Configure specific limits for Packages API requests that supersede the general user and IP rate limits."
+msgid "Configure specific limits for deprecated API requests that supersede the general user and IP rate limits."
msgstr ""
msgid "Configure the %{link} integration."
@@ -8527,6 +8655,9 @@ msgstr ""
msgid "Configure the way a user creates a new account."
msgstr ""
+msgid "Configure via Merge Request"
+msgstr ""
+
msgid "Configure which lists are shown for anyone who visits this board"
msgstr ""
@@ -8995,6 +9126,9 @@ msgstr ""
msgid "Content parsed with %{link}."
msgstr ""
+msgid "ContentEditor|Table of Contents"
+msgstr ""
+
msgid "ContentEditor|You have to provide a renderMarkdown function or a custom serializer"
msgstr ""
@@ -9181,6 +9315,9 @@ msgstr ""
msgid "Copy link to chart"
msgstr ""
+msgid "Copy prefix"
+msgstr ""
+
msgid "Copy reference"
msgstr ""
@@ -9211,6 +9348,9 @@ msgstr ""
msgid "Copy value"
msgstr ""
+msgid "Corpus Management"
+msgstr ""
+
msgid "Corpus Management|Are you sure you want to delete the corpus?"
msgstr ""
@@ -9439,6 +9579,9 @@ msgstr ""
msgid "Create commit"
msgstr ""
+msgid "Create common files more quickly, and standardize their format."
+msgstr ""
+
msgid "Create confidential merge request"
msgstr ""
@@ -9472,6 +9615,9 @@ msgstr ""
msgid "Create issue"
msgstr ""
+msgid "Create issue to resolve all threads"
+msgstr ""
+
msgid "Create iteration"
msgstr ""
@@ -9526,6 +9672,9 @@ msgstr ""
msgid "Create new..."
msgstr ""
+msgid "Create or import your first project"
+msgstr ""
+
msgid "Create project"
msgstr ""
@@ -9883,7 +10032,7 @@ msgstr ""
msgid "Custom notification events"
msgstr ""
-msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notificationLinkStart} notification emails%{notificationLinkEnd}."
+msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notificationLinkStart}notification emails%{notificationLinkEnd}."
msgstr ""
msgid "Custom project templates"
@@ -10082,10 +10231,10 @@ msgid_plural "CycleAnalytics|Showing %{subjectFilterText} and %{selectedLabelsCo
msgstr[0] ""
msgstr[1] ""
-msgid "CycleAnalytics|Showing data for group '%{groupName}' and %{selectedProjectCount} projects from %{startDate} to %{endDate}"
+msgid "CycleAnalytics|Showing data for group '%{groupName}' and %{selectedProjectCount} projects from %{createdAfter} to %{createdBefore}"
msgstr ""
-msgid "CycleAnalytics|Showing data for group '%{groupName}' from %{startDate} to %{endDate}"
+msgid "CycleAnalytics|Showing data for group '%{groupName}' from %{createdAfter} to %{createdBefore}"
msgstr ""
msgid "CycleAnalytics|Stages"
@@ -10319,6 +10468,9 @@ msgstr ""
msgid "DastProfiles|Manage profiles"
msgstr ""
+msgid "DastProfiles|Manage site profiles"
+msgstr ""
+
msgid "DastProfiles|Minimum = 0 (no timeout enabled), Maximum = 2880 minutes"
msgstr ""
@@ -10394,6 +10546,9 @@ msgstr ""
msgid "DastProfiles|Scanner name"
msgstr ""
+msgid "DastProfiles|Schedule"
+msgstr ""
+
msgid "DastProfiles|Select branch"
msgstr ""
@@ -10463,7 +10618,7 @@ msgstr ""
msgid "DastProfiles|Website"
msgstr ""
-msgid "DastProfiles|You can either choose a passive scan or validate the target site in your chosen site profile. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
+msgid "DastProfiles|You can either choose a passive scan or validate the target site from the site profile management page. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
msgstr ""
msgid "DastProfiles|You cannot run an active scan against an unvalidated site."
@@ -10636,7 +10791,7 @@ msgstr ""
msgid "Days to merge"
msgstr ""
-msgid "Deactivate dormant users after 90 days of inactivity. Users can return to active status by signing in to their account. While inactive, a user is not counted as an active user in the instance."
+msgid "Deactivate dormant users after 90 days of inactivity"
msgstr ""
msgid "Dear Administrator,"
@@ -10723,10 +10878,10 @@ msgstr ""
msgid "Define a custom pattern with cron syntax"
msgstr ""
-msgid "Define approval settings."
+msgid "Define approval rules."
msgstr ""
-msgid "Define approval settings. %{linkStart}Learn more.%{linkEnd}"
+msgid "Define approval rules. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "Define custom rules for what constitutes spam, independent of Akismet"
@@ -10735,7 +10890,7 @@ msgstr ""
msgid "Define environments in the deploy stage(s) in %{code_open}.gitlab-ci.yml%{code_close} to track deployments here."
msgstr ""
-msgid "Define how approval rules are applied as a merge request moves toward completion."
+msgid "Define how approval rules are applied to merge requests."
msgstr ""
msgid "Definition"
@@ -10750,6 +10905,12 @@ msgstr ""
msgid "DelayedJobs|Are you sure you want to run %{job_name} immediately? This job will run automatically after it's timer finishes."
msgstr ""
+msgid "DelayedJobs|Are you sure you want to run %{job_name} immediately? This job will run automatically after its timer finishes."
+msgstr ""
+
+msgid "DelayedJobs|Run the delayed job now?"
+msgstr ""
+
msgid "DelayedJobs|Start now"
msgstr ""
@@ -11026,6 +11187,12 @@ msgstr ""
msgid "Dependency proxy image prefix"
msgstr ""
+msgid "DependencyProxy|Create a local proxy for storing frequently used upstream images. %{docLinkStart}Learn more%{docLinkEnd} about dependency proxies."
+msgstr ""
+
+msgid "DependencyProxy|Dependency Proxy"
+msgstr ""
+
msgid "DependencyProxy|Toggle Dependency Proxy"
msgstr ""
@@ -11266,6 +11433,9 @@ msgstr ""
msgid "Deployments"
msgstr ""
+msgid "Deployments to Google Kubernetes Engine can be "
+msgstr ""
+
msgid "Deployments|%{deployments} environment impacted."
msgid_plural "Deployments|%{deployments} environments impacted."
msgstr[0] ""
@@ -11295,6 +11465,9 @@ msgstr ""
msgid "Deployment|success"
msgstr ""
+msgid "Deprecated API rate limits"
+msgstr ""
+
msgid "Deprioritize label"
msgstr ""
@@ -11697,6 +11870,16 @@ msgstr ""
msgid "DiffsCompareBaseBranch|(base)"
msgstr ""
+msgid "Diffs|%d addition"
+msgid_plural "Diffs|%d additions"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Diffs|%d deletion"
+msgid_plural "Diffs|%d deletions"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Diffs|No file name available"
msgstr ""
@@ -11706,9 +11889,17 @@ msgstr ""
msgid "Diffs|Show all unchanged lines"
msgstr ""
+msgid "Diffs|Showing %{dropdownStart}%{count} changed file%{dropdownEnd}"
+msgid_plural "Diffs|Showing %{dropdownStart}%{count} changed files%{dropdownEnd}"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Diffs|Something went wrong while fetching diff lines."
msgstr ""
+msgid "Diffs|with %{additions} and %{deletions}"
+msgstr ""
+
msgid "Direct member"
msgstr ""
@@ -11834,9 +12025,6 @@ msgid_plural "Dismiss %d selected vulnerabilities as"
msgstr[0] ""
msgstr[1] ""
-msgid "Dismiss Value Stream Analytics introduction box"
-msgstr ""
-
msgid "Dismiss merge request promotion"
msgstr ""
@@ -12158,6 +12346,9 @@ msgstr ""
msgid "Edit issues"
msgstr ""
+msgid "Edit merge requests"
+msgstr ""
+
msgid "Edit public deploy key"
msgstr ""
@@ -12233,6 +12424,9 @@ msgstr ""
msgid "Elastic|None. Select projects to index."
msgstr ""
+msgid "Eligible users"
+msgstr ""
+
msgid "Email"
msgstr ""
@@ -12362,6 +12556,9 @@ msgstr ""
msgid "Enable"
msgstr ""
+msgid "Enable Amazon EKS integration"
+msgstr ""
+
msgid "Enable Auto DevOps"
msgstr ""
@@ -12395,6 +12592,9 @@ msgstr ""
msgid "Enable SSL verification"
msgstr ""
+msgid "Enable Service Ping"
+msgstr ""
+
msgid "Enable Snowplow tracking"
msgstr ""
@@ -12425,6 +12625,9 @@ msgstr ""
msgid "Enable authenticated Git LFS request rate limit"
msgstr ""
+msgid "Enable authenticated web request rate limit"
+msgstr ""
+
msgid "Enable authentication"
msgstr ""
@@ -12485,7 +12688,7 @@ msgstr ""
msgid "Enable or disable the Pseudonymizer data collection."
msgstr ""
-msgid "Enable or disable version check and service ping."
+msgid "Enable or disable version check and Service Ping."
msgstr ""
msgid "Enable protected paths rate limit"
@@ -12497,18 +12700,12 @@ msgstr ""
msgid "Enable reCAPTCHA"
msgstr ""
-msgid "Enable reCAPTCHA for login"
-msgstr ""
-
-msgid "Enable reCAPTCHA, Invisible Captcha, Akismet and set IP limits. For reCAPTCHA, we currently only support %{recaptcha_v2_link_start}v2%{recaptcha_v2_link_end}"
+msgid "Enable reCAPTCHA for login."
msgstr ""
msgid "Enable repository checks"
msgstr ""
-msgid "Enable service ping"
-msgstr ""
-
msgid "Enable shared runners for all projects and subgroups in this group."
msgstr ""
@@ -12530,7 +12727,10 @@ msgstr ""
msgid "Enable unauthenticated API request rate limit"
msgstr ""
-msgid "Enable unauthenticated request rate limit"
+msgid "Enable unauthenticated web request rate limit"
+msgstr ""
+
+msgid "Enable user deactivation emails"
msgstr ""
msgid "Enable version check"
@@ -12566,9 +12766,6 @@ msgstr ""
msgid "Enabled sources for code import during project creation. OmniAuth must be configured for GitHub"
msgstr ""
-msgid "Enabling this will only make licensed EE features available to projects if the project namespace's plan includes the feature or if the project is public."
-msgstr ""
-
msgid "Encountered an error while rendering: %{err}"
msgstr ""
@@ -12617,9 +12814,6 @@ msgstr ""
msgid "Enter Admin Mode"
msgstr ""
-msgid "Enter IP address range"
-msgstr ""
-
msgid "Enter a number"
msgstr ""
@@ -12632,9 +12826,6 @@ msgstr ""
msgid "Enter at least three characters to search"
msgstr ""
-msgid "Enter domain"
-msgstr ""
-
msgid "Enter in your Bitbucket Server URL and personal access token below"
msgstr ""
@@ -12821,9 +13012,6 @@ msgstr ""
msgid "Environments|Deployment %{status}"
msgstr ""
-msgid "Environments|Dismiss"
-msgstr ""
-
msgid "Environments|Enable review app"
msgstr ""
@@ -12836,9 +13024,6 @@ msgstr ""
msgid "Environments|Environments are places where code gets deployed, such as staging or production."
msgstr ""
-msgid "Environments|Help us improve environments"
-msgstr ""
-
msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
msgstr ""
@@ -12875,6 +13060,9 @@ msgstr ""
msgid "Environments|Note that this action will stop the environment, but it will %{emphasisStart}not%{emphasisEnd} have an effect on any existing deployment due to no “stop environment action†being defined in the %{ciConfigLinkStart}.gitlab-ci.yml%{ciConfigLinkEnd} file."
msgstr ""
+msgid "Environments|Open"
+msgstr ""
+
msgid "Environments|Open live environment"
msgstr ""
@@ -12914,9 +13102,6 @@ msgstr ""
msgid "Environments|Stopping %{environmentName}"
msgstr ""
-msgid "Environments|Take the survey"
-msgstr ""
-
msgid "Environments|There was an error fetching the logs. Please try again."
msgstr ""
@@ -12938,9 +13123,6 @@ msgstr ""
msgid "Environments|You don't have any environments right now"
msgstr ""
-msgid "Environments|Your feedback helps GitLab make environments better for you and other users. Participate and enter a sweepstake to win a USD 30 gift card."
-msgstr ""
-
msgid "Environments|by %{avatar}"
msgstr ""
@@ -13223,7 +13405,7 @@ msgstr ""
msgid "Error parsing CSV file. Please make sure it has"
msgstr ""
-msgid "Error rendering markdown preview"
+msgid "Error rendering Markdown preview"
msgstr ""
msgid "Error saving label update."
@@ -13271,6 +13453,9 @@ msgstr ""
msgid "Error: %{error_message}"
msgstr ""
+msgid "Error: Couldn't load some or all of the changes."
+msgstr ""
+
msgid "Error: No AWS credentials were supplied"
msgstr ""
@@ -13304,6 +13489,9 @@ msgstr ""
msgid "ErrorTracking|Enable error tracking"
msgstr ""
+msgid "ErrorTracking|Error tracking backend"
+msgstr ""
+
msgid "ErrorTracking|If you self-host Sentry, enter your Sentry instance's full URL. If you use Sentry's hosted solution, enter https://sentry.io"
msgstr ""
@@ -13337,6 +13525,12 @@ msgstr ""
msgid "Escalation policies must have at least one rule"
msgstr ""
+msgid "EscalationPolicies|%{clockIcon} IF alert is not %{alertStatus} in %{minutes}"
+msgstr ""
+
+msgid "EscalationPolicies|%{notificationIcon} THEN %{doAction} %{forScheduleOrUser}"
+msgstr ""
+
msgid "EscalationPolicies|+ Add an additional rule"
msgstr ""
@@ -13379,13 +13573,13 @@ msgstr ""
msgid "EscalationPolicies|Escalation policies"
msgstr ""
-msgid "EscalationPolicies|Escalation rules"
+msgid "EscalationPolicies|Escalation policy %{obstacle} in Project %{project}"
msgstr ""
-msgid "EscalationPolicies|Failed to load oncall-schedules"
+msgid "EscalationPolicies|Escalation rules"
msgstr ""
-msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} %{then} THEN %{doAction} %{scheduleOrUser}"
+msgid "EscalationPolicies|Failed to load oncall-schedules"
msgstr ""
msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} minutes"
@@ -13463,18 +13657,36 @@ msgstr ""
msgid "Every %{action} attempt has failed: %{job_error_message}. Please try again."
msgstr ""
+msgid "Every 3 months"
+msgstr ""
+
+msgid "Every 3 months on the %{day} at %{time} %{timezone}"
+msgstr ""
+
+msgid "Every 6 months"
+msgstr ""
+
+msgid "Every 6 months on the %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Every day"
msgstr ""
msgid "Every day (at %{time})"
msgstr ""
+msgid "Every day at %{time} %{timezone}"
+msgstr ""
+
msgid "Every month"
msgstr ""
msgid "Every month (Day %{day} at %{time})"
msgstr ""
+msgid "Every month on the %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Every three months"
msgstr ""
@@ -13489,6 +13701,15 @@ msgstr[1] ""
msgid "Every week (%{weekday} at %{time})"
msgstr ""
+msgid "Every week on %{day} at %{time} %{timezone}"
+msgstr ""
+
+msgid "Every year"
+msgstr ""
+
+msgid "Every year on %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Everyone"
msgstr ""
@@ -13525,9 +13746,6 @@ msgstr ""
msgid "Exactly one of %{attributes} is required"
msgstr ""
-msgid "Example: %{ip_address}. %{read_more_link}."
-msgstr ""
-
msgid "Example: @sub\\.company\\.com$"
msgstr ""
@@ -13594,13 +13812,13 @@ msgstr ""
msgid "Expand pipeline"
msgstr ""
-msgid "Expand sidebar"
+msgid "Expand settings section"
msgstr ""
-msgid "Expected documents: %{expected_documents}"
+msgid "Expand sidebar"
msgstr ""
-msgid "Experienced"
+msgid "Expected documents: %{expected_documents}"
msgstr ""
msgid "ExperimentSubject|Must have exactly one of User, Namespace, or Project."
@@ -13885,9 +14103,6 @@ msgstr ""
msgid "Failed to load related branches"
msgstr ""
-msgid "Failed to load sidebar lock status"
-msgstr ""
-
msgid "Failed to load stacktrace."
msgstr ""
@@ -14312,6 +14527,9 @@ msgstr ""
msgid "Files"
msgstr ""
+msgid "Files API Rate Limits"
+msgstr ""
+
msgid "Files breadcrumb"
msgstr ""
@@ -15311,6 +15529,9 @@ msgstr ""
msgid "GitLab group: %{source_link}"
msgstr ""
+msgid "GitLab informs you if a new version is available."
+msgstr ""
+
msgid "GitLab is a complete DevOps platform, delivered as a single application, fundamentally changing the way Development, Security, and Ops teams collaborate"
msgstr ""
@@ -15326,7 +15547,7 @@ msgstr ""
msgid "GitLab is open source software to collaborate on code."
msgstr ""
-msgid "GitLab is undergoing maintenance and is operating in a read-only mode."
+msgid "GitLab is undergoing maintenance and is operating in read-only mode."
msgstr ""
msgid "GitLab member or Email address"
@@ -15338,9 +15559,6 @@ msgstr ""
msgid "GitLab project export"
msgstr ""
-msgid "GitLab restart is required to apply changes."
-msgstr ""
-
msgid "GitLab single sign-on URL"
msgstr ""
@@ -15356,9 +15574,6 @@ msgstr ""
msgid "GitLab version"
msgstr ""
-msgid "GitLab will inform you if a new version is available."
-msgstr ""
-
msgid "GitLab will run a background job that will produce pseudonymized CSVs of the GitLab database that will be uploaded to your configured object storage directory."
msgstr ""
@@ -15623,9 +15838,21 @@ msgstr ""
msgid "Go to snippets"
msgstr ""
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check 'Allowed domains for sign-ups'."
+msgstr ""
+
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check 'Email restrictions for sign-ups'."
+msgstr ""
+
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check the 'Domain denylist'."
+msgstr ""
+
msgid "Go to the activity feed"
msgstr ""
+msgid "Go to the group’s 'Settings &gt; General' page, and check 'Restrict membership by email domain'."
+msgstr ""
+
msgid "Go to the milestone list"
msgstr ""
@@ -15662,6 +15889,12 @@ msgstr ""
msgid "Goal of the changes and what reviewers should be aware of"
msgstr ""
+msgid "Google Cloud"
+msgstr ""
+
+msgid "Google Cloud offers several deployment targets. Select the one most suitable for your project."
+msgstr ""
+
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
@@ -15746,9 +15979,6 @@ msgstr ""
msgid "Group ID"
msgstr ""
-msgid "Group ID: %{group_id}"
-msgstr ""
-
msgid "Group Owner must have signed in with SAML before enabling Group Managed Accounts"
msgstr ""
@@ -15923,6 +16153,12 @@ msgstr ""
msgid "GroupImport|Unable to process group import file"
msgstr ""
+msgid "GroupPage|Copy group ID"
+msgstr ""
+
+msgid "GroupPage|Group ID: %{group_id}"
+msgstr ""
+
msgid "GroupRoadmap|%{dateWord} – No end date"
msgstr ""
@@ -15977,6 +16213,9 @@ msgstr ""
msgid "GroupRoadmap|Within 3 years"
msgstr ""
+msgid "GroupSAML|\"persistent\" recommended"
+msgstr ""
+
msgid "GroupSAML|%{strongOpen}Warning%{strongClose} - Enabling %{linkStart}SSO enforcement%{linkEnd} can reduce security risks."
msgstr ""
@@ -16109,6 +16348,9 @@ msgstr ""
msgid "GroupSAML|To be able to prohibit outer forks, you first need to enforce dedicate group managed accounts."
msgstr ""
+msgid "GroupSAML|Use SAML group links to manage group membership using SAML."
+msgstr ""
+
msgid "GroupSAML|Valid SAML Response"
msgstr ""
@@ -16121,13 +16363,10 @@ msgstr ""
msgid "GroupSAML|as %{access_level}"
msgstr ""
-msgid "GroupSAML|must match stored NameID of \"%{extern_uid}\" as we use this to identify users. If the NameID changes users will be unable to sign in."
-msgstr ""
-
-msgid "GroupSAML|should be \"persistent\""
+msgid "GroupSAML|must match stored NameID of \"%{extern_uid}\" to identify user and allow sign in"
msgstr ""
-msgid "GroupSAML|should be a random persistent ID, emails are discouraged"
+msgid "GroupSAML|recommend persistent ID instead of email"
msgstr ""
msgid "GroupSelect|No matching results"
@@ -16142,9 +16381,15 @@ msgstr ""
msgid "GroupSettings|Allow project access token creation"
msgstr ""
+msgid "GroupSettings|Applied to all subgroups unless overridden by a group owner. Groups already added to the project lose access."
+msgstr ""
+
msgid "GroupSettings|Auto DevOps pipeline was updated for the group"
msgstr ""
+msgid "GroupSettings|Available only on the top-level group. Applies to all subgroups. Groups already shared with a group outside %{group} are still shared unless removed manually."
+msgstr ""
+
msgid "GroupSettings|Badges"
msgstr ""
@@ -16196,6 +16441,9 @@ msgstr ""
msgid "GroupSettings|New runners registration token has been generated!"
msgstr ""
+msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgstr ""
+
msgid "GroupSettings|Pipeline settings was updated for the group"
msgstr ""
@@ -16208,12 +16456,15 @@ msgstr ""
msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
-msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups."
+msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups"
msgstr ""
msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
msgstr ""
+msgid "GroupSettings|Prevents group members from being notified if the group is mentioned."
+msgstr ""
+
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
msgstr ""
@@ -16250,21 +16501,6 @@ msgstr ""
msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}."
msgstr ""
-msgid "GroupSettings|This setting is only available on the top-level group and it applies to all subgroups. Groups that have already been shared with a group outside %{group} will still be shared, and this access will have to be revoked manually."
-msgstr ""
-
-msgid "GroupSettings|This setting will be applied to all subgroups unless overridden by a group owner. Groups that already have access to the project will continue to have access unless removed manually."
-msgstr ""
-
-msgid "GroupSettings|This setting will override user notification preferences for all members of the group, subgroups, and projects."
-msgstr ""
-
-msgid "GroupSettings|This setting will prevent group members from being notified if the group is mentioned."
-msgstr ""
-
-msgid "GroupSettings|This setting will prevent group members from forking projects outside of the group."
-msgstr ""
-
msgid "GroupSettings|Transfer group"
msgstr ""
@@ -16382,7 +16618,7 @@ msgstr ""
msgid "GroupsNew|No import options available"
msgstr ""
-msgid "GroupsNew|Not all related objects are migrated, as %{docs_link_start}described here%{docs_link_end}. Please %{feedback_link_start}leave feedback%{feedback_link_end} on this feature."
+msgid "GroupsNew|Not all related objects are migrated. %{docs_link_start}More info%{docs_link_end}."
msgstr ""
msgid "GroupsNew|Personal access token"
@@ -16514,15 +16750,27 @@ msgstr ""
msgid "Hello %{name},"
msgstr ""
-msgid "Hello there"
-msgstr ""
-
msgid "Hello, %{name}!"
msgstr ""
msgid "Hello, %{username}!"
msgstr ""
+msgid "HelloMessage|%{handshake_emoji} Contribute to GitLab: %{contribute_link}"
+msgstr ""
+
+msgid "HelloMessage|%{magnifier_emoji} Create a new GitLab issue: %{new_issue_link}"
+msgstr ""
+
+msgid "HelloMessage|%{rocket_emoji} We like your curiosity! Help us improve GitLab by joining the team: %{jobs_page_link}"
+msgstr ""
+
+msgid "HelloMessage|Does this page need fixes or improvements? Open an issue or contribute a merge request to help make GitLab more lovable. At GitLab, everyone can contribute!"
+msgstr ""
+
+msgid "HelloMessage|Welcome to GitLab!"
+msgstr ""
+
msgid "Help"
msgstr ""
@@ -16532,13 +16780,10 @@ msgstr ""
msgid "Helps prevent bots from creating accounts."
msgstr ""
-msgid "Helps prevent bots from creating issues"
-msgstr ""
-
-msgid "Helps prevent malicious users hide their activity"
+msgid "Helps prevent bots from creating issues."
msgstr ""
-msgid "Helps reduce request volume (e.g. from crawlers or abusive bots)"
+msgid "Helps prevent malicious users hide their activity."
msgstr ""
msgid "Helps reduce request volume (for example, from crawlers or abusive bots)"
@@ -16662,6 +16907,12 @@ msgstr ""
msgid "Housekeeping, export, path, transfer, remove, archive."
msgstr ""
+msgid "How do I configure Akismet?"
+msgstr ""
+
+msgid "How do I configure it?"
+msgstr ""
+
msgid "How do I configure runners?"
msgstr ""
@@ -16683,19 +16934,25 @@ msgstr ""
msgid "How do I set up this service?"
msgstr ""
+msgid "How do I use a web terminal?"
+msgstr ""
+
+msgid "How do I use file templates?"
+msgstr ""
+
msgid "How it works"
msgstr ""
msgid "How many days need to pass between marking entity for deletion and actual removing it."
msgstr ""
-msgid "How many seconds an IP will be counted towards the limit"
+msgid "How many seconds an IP counts toward the IP address limit."
msgstr ""
-msgid "I accept the %{terms_link}"
+msgid "How the job limiter handles jobs exceeding the thresholds specified below. The 'track' mode only logs the jobs. The 'compress' mode compresses the jobs and raises an exception if the compressed size exceeds the limit."
msgstr ""
-msgid "I accept the|Terms of Service and Privacy Policy"
+msgid "I accept the %{terms_link}"
msgstr ""
msgid "I forgot my password"
@@ -16779,13 +17036,16 @@ msgstr ""
msgid "IP Address"
msgstr ""
-msgid "IP expiration time"
+msgid "IP address expiration time"
msgstr ""
-msgid "IP subnet restriction only allowed for top-level groups"
+msgid "IP address restrictions"
+msgstr ""
+
+msgid "IP addresses per user"
msgstr ""
-msgid "IPs per user"
+msgid "IP subnet restriction only allowed for top-level groups"
msgstr ""
msgid "Identifier"
@@ -16800,6 +17060,9 @@ msgstr ""
msgid "If any indexed field exceeds this limit it will be truncated to this number of characters and the rest will not be indexed or searchable. This does not apply to repository and wiki indexing. Setting this to 0 means it is unlimited."
msgstr ""
+msgid "If blank, defaults to %{code_open}Retry later%{code_close}."
+msgstr ""
+
msgid "If blank, set allowable lifetime to %{instance_level_policy_in_words}, as defined by the instance admin. Once set, existing tokens for users in this group may be revoked."
msgstr ""
@@ -16851,6 +17114,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 did not initiate these sign-in attempts, please reach out to your administrator or enable two-factor authentication (2FA) on your account."
+msgstr ""
+
msgid "If you did not initiate this change, please contact your administrator immediately."
msgstr ""
@@ -16942,10 +17208,10 @@ msgstr ""
msgid "Import Projects from Gitea"
msgstr ""
-msgid "Import a project"
+msgid "Import an exported GitLab project"
msgstr ""
-msgid "Import an exported GitLab project"
+msgid "Import and export rate limits"
msgstr ""
msgid "Import failed due to a GitHub error: %{original}"
@@ -16957,12 +17223,18 @@ msgstr ""
msgid "Import from Jira"
msgstr ""
+msgid "Import group"
+msgstr ""
+
msgid "Import group from file"
msgstr ""
msgid "Import groups"
msgstr ""
+msgid "Import history"
+msgstr ""
+
msgid "Import in progress"
msgstr ""
@@ -17026,7 +17298,25 @@ msgstr ""
msgid "Import timed out. Import took longer than %{import_jobs_expiration} seconds"
msgstr ""
-msgid "Import/Export Rate Limits"
+msgid "ImportAProjectModal|Import from a project"
+msgstr ""
+
+msgid "ImportAProjectModal|Import members from another project"
+msgstr ""
+
+msgid "ImportAProjectModal|Import project members"
+msgstr ""
+
+msgid "ImportAProjectModal|Only project members (not group members) are imported, and they get the same permissions as the project you import from."
+msgstr ""
+
+msgid "ImportAProjectModal|Successfully imported"
+msgstr ""
+
+msgid "ImportAProjectModal|Unable to import project members"
+msgstr ""
+
+msgid "ImportAProjectModal|You're importing members to the %{strongStart}%{name}%{strongEnd} project."
msgstr ""
msgid "ImportButtons|Connect repositories from"
@@ -17079,7 +17369,7 @@ msgstr[1] ""
msgid "Importing..."
msgstr ""
-msgid "Import|A repository URL usually ends in a .git suffix, although this is not required. Double check to make sure your repository URL is correct."
+msgid "Import|There is not a valid Git repository at this URL. If your HTTP repository is not publicly accessible, verify your credentials."
msgstr ""
msgid "Improve customer support with Service Desk"
@@ -17088,9 +17378,6 @@ msgstr ""
msgid "Improves Git cloning performance."
msgstr ""
-msgid "In %{time_to_now}"
-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 ""
@@ -17376,7 +17663,7 @@ msgstr ""
msgid "InProductMarketing|Start a GitLab Ultimate trial today in less than one minute, no credit card required."
msgstr ""
-msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no CC required"
+msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no credit card required"
msgstr ""
msgid "InProductMarketing|Start a trial"
@@ -17415,7 +17702,7 @@ msgstr ""
msgid "InProductMarketing|Team up in GitLab for greater efficiency"
msgstr ""
-msgid "InProductMarketing|Team work makes the dream work"
+msgid "InProductMarketing|Team work makes the dream work"
msgstr ""
msgid "InProductMarketing|Test, create, deploy"
@@ -17996,6 +18283,9 @@ msgstr ""
msgid "Integrations|Create new issue in Jira"
msgstr ""
+msgid "Integrations|Create new issue in ZenTao"
+msgstr ""
+
msgid "Integrations|Default settings are inherited from the group level."
msgstr ""
@@ -18089,9 +18379,15 @@ msgstr ""
msgid "Integrations|Search Jira issues"
msgstr ""
+msgid "Integrations|Search ZenTao issues"
+msgstr ""
+
msgid "Integrations|Send notifications about project events to Unify Circuit."
msgstr ""
+msgid "Integrations|Send notifications about project events to a Unify Circuit conversation. %{docs_link}"
+msgstr ""
+
msgid "Integrations|Sign in to add namespaces"
msgstr ""
@@ -18131,6 +18427,9 @@ msgstr ""
msgid "Integrations|You've activated every integration 🎉"
msgstr ""
+msgid "Integrations|ZenTao issues display here when you create issues in your project in ZenTao."
+msgstr ""
+
msgid "Interactive mode"
msgstr ""
@@ -18158,9 +18457,6 @@ msgstr ""
msgid "Interval Pattern"
msgstr ""
-msgid "Introducing Value Stream Analytics"
-msgstr ""
-
msgid "Introducing Your DevOps Report"
msgstr ""
@@ -18257,6 +18553,12 @@ msgstr ""
msgid "Investigate vulnerability: %{title}"
msgstr ""
+msgid "Invisible Captcha"
+msgstr ""
+
+msgid "Invisible Captcha helps prevent the creation of spam accounts. It adds a honeypot field and time-sensitive form submission to the account signup form."
+msgstr ""
+
msgid "Invitation"
msgstr ""
@@ -18710,12 +19012,18 @@ msgstr ""
msgid "Issues"
msgstr ""
+msgid "Issues I've created"
+msgstr ""
+
msgid "Issues Rate Limits"
msgstr ""
msgid "Issues and merge requests"
msgstr ""
+msgid "Issues assigned to me"
+msgstr ""
+
msgid "Issues can be bugs, tasks or ideas to be discussed. Also, issues are searchable and filterable."
msgstr ""
@@ -18827,7 +19135,7 @@ msgstr ""
msgid "Iterations|Create cadence"
msgstr ""
-msgid "Iterations|Create your first iteration"
+msgid "Iterations|Create iteration"
msgstr ""
msgid "Iterations|Delete cadence"
@@ -18836,6 +19144,9 @@ msgstr ""
msgid "Iterations|Delete iteration cadence?"
msgstr ""
+msgid "Iterations|Delete iteration?"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -18869,12 +19180,18 @@ msgstr ""
msgid "Iterations|New iteration cadence"
msgstr ""
+msgid "Iterations|No closed iterations."
+msgstr ""
+
msgid "Iterations|No iteration cadences to show."
msgstr ""
msgid "Iterations|No iterations in cadence."
msgstr ""
+msgid "Iterations|No open iterations."
+msgstr ""
+
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
@@ -18905,6 +19222,9 @@ msgstr ""
msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
msgstr ""
+msgid "Iterations|This will remove the iteration from any issues that are assigned to it."
+msgstr ""
+
msgid "Iterations|Title"
msgstr ""
@@ -18920,15 +19240,9 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "I’m familiar with the basics of DevOps."
-msgstr ""
-
msgid "I’m joining my team who’s already on GitLab"
msgstr ""
-msgid "I’m not familiar with the basics of DevOps."
-msgstr ""
-
msgid "Jaeger URL"
msgstr ""
@@ -19193,6 +19507,9 @@ msgstr ""
msgid "Job"
msgstr ""
+msgid "Job %{jobName}"
+msgstr ""
+
msgid "Job Failed #%{build_id}"
msgstr ""
@@ -19783,9 +20100,6 @@ msgstr ""
msgid "Learn more in the"
msgstr ""
-msgid "Learn more in the|pipeline schedules documentation"
-msgstr ""
-
msgid "Learn more."
msgstr ""
@@ -19897,9 +20211,6 @@ msgstr ""
msgid "Leave Admin Mode"
msgstr ""
-msgid "Leave blank for no limit. Once set, existing personal access tokens may be revoked."
-msgstr ""
-
msgid "Leave edit mode? All unsaved changes will be lost."
msgstr ""
@@ -19945,10 +20256,10 @@ msgstr ""
msgid "LicenseCompliance|Acceptable license to be used in the project"
msgstr ""
-msgid "LicenseCompliance|Add a license"
+msgid "LicenseCompliance|Add license and related policy"
msgstr ""
-msgid "LicenseCompliance|Add license and related policy"
+msgid "LicenseCompliance|Add license policy"
msgstr ""
msgid "LicenseCompliance|Allow"
@@ -20038,6 +20349,9 @@ msgstr ""
msgid "LicenseManagement|Uncategorized"
msgstr ""
+msgid "Licensed Enterprise Edition features can be used if the project namespace's plan includes the feature, or if the project is public."
+msgstr ""
+
msgid "Licensed Features"
msgstr ""
@@ -20104,7 +20418,10 @@ msgstr ""
msgid "Limit namespaces and projects that can be indexed"
msgstr ""
-msgid "Limit sign in from multiple ips"
+msgid "Limit project size at a global, group, and project level. %{link_start}Learn more%{link_end}."
+msgstr ""
+
+msgid "Limit sign in from multiple IP addresses"
msgstr ""
msgid "Limit the number of concurrent operations this secondary site can run in the background."
@@ -20116,11 +20433,17 @@ msgstr ""
msgid "Limit the number of issues and epics per minute a user can create through web and API requests."
msgstr ""
+msgid "Limit the size of Sidekiq jobs stored in Redis."
+msgstr ""
+
msgid "Limited to showing %d event at most"
msgid_plural "Limited to showing %d events at most"
msgstr[0] ""
msgstr[1] ""
+msgid "Limiting mode"
+msgstr ""
+
msgid "Line changes"
msgstr ""
@@ -20190,9 +20513,6 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
-msgid "List of users to be excluded from the limit"
-msgstr ""
-
msgid "List options"
msgstr ""
@@ -20232,9 +20552,6 @@ msgstr ""
msgid "Loading functions timed out. Please reload the page to try again."
msgstr ""
-msgid "Loading issues"
-msgstr ""
-
msgid "Loading more"
msgstr ""
@@ -20526,6 +20843,9 @@ msgstr ""
msgid "Marked For Deletion At - %{deletion_time}"
msgstr ""
+msgid "Marked as ready. Merging is now allowed."
+msgstr ""
+
msgid "Marked this %{noun} as a draft."
msgstr ""
@@ -20598,52 +20918,22 @@ msgstr ""
msgid "Max 100,000 events"
msgstr ""
-msgid "Max 20 characters"
-msgstr ""
-
-msgid "Max Group Export Download requests per minute per user"
-msgstr ""
-
-msgid "Max Group Export requests per minute per user"
-msgstr ""
-
-msgid "Max Group Import requests per minute per user"
-msgstr ""
-
-msgid "Max Project Export Download requests per minute per user"
-msgstr ""
-
-msgid "Max Project Export requests per minute per user"
-msgstr ""
-
-msgid "Max Project Import requests per minute per user"
-msgstr ""
-
-msgid "Max authenticated API requests per period per user"
-msgstr ""
-
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
-msgid "Max authenticated web requests per period per user"
-msgstr ""
-
msgid "Max file size is 200 KB."
msgstr ""
-msgid "Max requests per minute per user"
-msgstr ""
-
msgid "Max role"
msgstr ""
msgid "Max session time"
msgstr ""
-msgid "Max unauthenticated requests per period per IP"
+msgid "MaxBuilds"
msgstr ""
-msgid "MaxBuilds"
+msgid "Maximum 20 characters"
msgstr ""
msgid "Maximum Conan package file size in bytes"
@@ -20679,6 +20969,12 @@ msgstr ""
msgid "Maximum attachment size (MB)"
msgstr ""
+msgid "Maximum authenticated API requests per rate limit period per user"
+msgstr ""
+
+msgid "Maximum authenticated web requests per rate limit period per user"
+msgstr ""
+
msgid "Maximum bulk request size (MiB)"
msgstr ""
@@ -20724,6 +21020,15 @@ msgstr ""
msgid "Maximum files in a diff"
msgstr ""
+msgid "Maximum group export download requests per minute"
+msgstr ""
+
+msgid "Maximum group export requests per minute"
+msgstr ""
+
+msgid "Maximum group import requests per minute"
+msgstr ""
+
msgid "Maximum import size"
msgstr ""
@@ -20760,7 +21065,7 @@ msgstr ""
msgid "Maximum number of projects."
msgstr ""
-msgid "Maximum number of unique IPs per user"
+msgid "Maximum number of unique IP addresses per user."
msgstr ""
msgid "Maximum page reached"
@@ -20769,12 +21074,24 @@ msgstr ""
msgid "Maximum page size"
msgstr ""
+msgid "Maximum project export download requests per minute"
+msgstr ""
+
+msgid "Maximum project export requests per minute"
+msgstr ""
+
+msgid "Maximum project import requests per minute"
+msgstr ""
+
msgid "Maximum push size"
msgstr ""
msgid "Maximum push size (MB)"
msgstr ""
+msgid "Maximum requests per minute"
+msgstr ""
+
msgid "Maximum running slices"
msgstr ""
@@ -20802,10 +21119,16 @@ msgstr ""
msgid "Maximum time between updates that a mirror can have when scheduled to synchronize."
msgstr ""
-msgid "Maximum time for web terminal websocket connection (in seconds). 0 for unlimited."
+msgid "Maximum time that users are allowed to skip the setup of two-factor authentication (in hours). Set to 0 (zero) to enforce at next sign in."
msgstr ""
-msgid "Maximum time that users are allowed to skip the setup of two-factor authentication (in hours). Set to 0 (zero) to enforce at next sign in."
+msgid "Maximum time, in seconds, for a web terminal websocket connection. 0 for unlimited."
+msgstr ""
+
+msgid "Maximum unauthenticated API requests per rate limit period per IP"
+msgstr ""
+
+msgid "Maximum unauthenticated web requests per rate limit period per IP"
msgstr ""
msgid "May"
@@ -20823,9 +21146,6 @@ msgstr ""
msgid "Medium vulnerabilities present"
msgstr ""
-msgid "Member lock"
-msgstr ""
-
msgid "Member since"
msgstr ""
@@ -20862,6 +21182,9 @@ msgstr ""
msgid "Members of a group may only view projects they have permission to access"
msgstr ""
+msgid "Membership"
+msgstr ""
+
msgid "Members|%{time} by %{user}"
msgstr ""
@@ -20922,9 +21245,6 @@ msgstr ""
msgid "Members|Expiration date updated successfully."
msgstr ""
-msgid "Members|Expired"
-msgstr ""
-
msgid "Members|Filter members"
msgstr ""
@@ -20940,9 +21260,6 @@ msgstr ""
msgid "Members|Membership"
msgstr ""
-msgid "Members|No expiration set"
-msgstr ""
-
msgid "Members|Remove \"%{groupName}\""
msgstr ""
@@ -20964,9 +21281,6 @@ msgstr ""
msgid "Members|Search invited"
msgstr ""
-msgid "Members|in %{time}"
-msgstr ""
-
msgid "Member|Deny access"
msgstr ""
@@ -21042,9 +21356,6 @@ msgstr ""
msgid "Merge request %{mr_link} was reviewed by %{mr_author}"
msgstr ""
-msgid "Merge request (MR) approvals"
-msgstr ""
-
msgid "Merge request analytics"
msgstr ""
@@ -21066,12 +21377,21 @@ msgstr ""
msgid "Merge requests"
msgstr ""
+msgid "Merge requests I've created"
+msgstr ""
+
msgid "Merge requests are a place to propose changes you've made to a project and discuss those changes with others"
msgstr ""
msgid "Merge requests are read-only in a secondary Geo node"
msgstr ""
+msgid "Merge requests assigned to me"
+msgstr ""
+
+msgid "Merge requests that I'm a reviewer"
+msgstr ""
+
msgid "Merge the branch and fix any conflicts that come up"
msgstr ""
@@ -21132,10 +21452,10 @@ msgstr ""
msgid "MergeRequests|An error occurred while saving the draft comment."
msgstr ""
-msgid "MergeRequests|Failed to squash. Should be done manually."
+msgid "MergeRequests|Create issue to resolve thread"
msgstr ""
-msgid "MergeRequests|Resolve this thread in a new issue"
+msgid "MergeRequests|Failed to squash. Should be done manually."
msgstr ""
msgid "MergeRequests|Saving the comment failed"
@@ -21949,6 +22269,9 @@ msgstr ""
msgid "MoveIssue|Cannot move issue to project it originates from!"
msgstr ""
+msgid "MoveIssue|Cannot move issues of '%{issue_type}' type."
+msgstr ""
+
msgid "Moved issue to %{label} column in the board."
msgstr ""
@@ -22074,6 +22397,15 @@ 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. To learn more about reducing storage capacity please visit our docs."
msgstr ""
+msgid "NamespaceUserCap|Pending users must be reviewed and approved by a group owner. Learn more about %{user_caps_link_start}User Caps%{link_end} and %{users_pending_approval_link_start}Users Pending Approval%{link_end}."
+msgstr ""
+
+msgid "NamespaceUserCap|View pending user approvals"
+msgstr ""
+
+msgid "NamespaceUserCap|Your group has reached its billable member limit"
+msgstr ""
+
msgid "Namespaces"
msgstr ""
@@ -22116,9 +22448,6 @@ msgstr ""
msgid "Network"
msgstr ""
-msgid "Network Policy|New rule"
-msgstr ""
-
msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is inbound from a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
msgstr ""
@@ -22140,16 +22469,13 @@ msgstr ""
msgid "NetworkPolicies|%{strongOpen}any%{strongClose} port"
msgstr ""
-msgid "NetworkPolicies|+ Add alert"
-msgstr ""
-
msgid "NetworkPolicies|.yaml"
msgstr ""
msgid "NetworkPolicies|.yaml mode"
msgstr ""
-msgid "NetworkPolicies|Actions"
+msgid "NetworkPolicies|Add alert"
msgstr ""
msgid "NetworkPolicies|Alerts are intended to be selectively used for a limited number of events that are potentially concerning and warrant a manual review. Alerts should not be used as a substitute for a SIEM or a logging tool. High volume alerts are likely to be dropped so as to preserve the stability of GitLab's integration with Kubernetes."
@@ -22185,9 +22511,6 @@ msgstr ""
msgid "NetworkPolicies|Deny all traffic"
msgstr ""
-msgid "NetworkPolicies|Description"
-msgstr ""
-
msgid "NetworkPolicies|Edit policy"
msgstr ""
@@ -22200,9 +22523,6 @@ msgstr ""
msgid "NetworkPolicies|IP/subnet"
msgstr ""
-msgid "NetworkPolicies|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
-msgstr ""
-
msgid "NetworkPolicies|Invalid or empty policy"
msgstr ""
@@ -22212,19 +22532,16 @@ msgstr ""
msgid "NetworkPolicies|Kubernetes error: %{error}"
msgstr ""
-msgid "NetworkPolicies|Name"
-msgstr ""
-
msgid "NetworkPolicies|Network"
msgstr ""
-msgid "NetworkPolicies|Network traffic"
+msgid "NetworkPolicies|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
msgstr ""
-msgid "NetworkPolicies|New policy"
+msgid "NetworkPolicies|Network policy can be created after the environment is loaded successfully."
msgstr ""
-msgid "NetworkPolicies|No policies detected"
+msgid "NetworkPolicies|Network traffic"
msgstr ""
msgid "NetworkPolicies|None selected"
@@ -22233,21 +22550,12 @@ msgstr ""
msgid "NetworkPolicies|Please %{installLinkStart}install%{installLinkEnd} and %{configureLinkStart}configure a Kubernetes Agent for this project%{configureLinkEnd} to enable alerts."
msgstr ""
-msgid "NetworkPolicies|Policies are a specification of how groups of pods are allowed to communicate with each other's network endpoints."
-msgstr ""
-
msgid "NetworkPolicies|Policy %{policyName} was successfully changed"
msgstr ""
msgid "NetworkPolicies|Policy definition"
msgstr ""
-msgid "NetworkPolicies|Policy editor"
-msgstr ""
-
-msgid "NetworkPolicies|Policy preview"
-msgstr ""
-
msgid "NetworkPolicies|Rule"
msgstr ""
@@ -22257,9 +22565,6 @@ msgstr ""
msgid "NetworkPolicies|Rule mode is unavailable for this policy. In some cases, we cannot parse the YAML file back into the rules editor."
msgstr ""
-msgid "NetworkPolicies|Rules"
-msgstr ""
-
msgid "NetworkPolicies|Save changes"
msgstr ""
@@ -22272,9 +22577,6 @@ msgstr ""
msgid "NetworkPolicies|Traffic that does not match any rule will be blocked."
msgstr ""
-msgid "NetworkPolicies|Unable to parse policy"
-msgstr ""
-
msgid "NetworkPolicies|all DNS names"
msgstr ""
@@ -22454,6 +22756,9 @@ msgstr ""
msgid "New issue"
msgstr ""
+msgid "New issue in %{project}"
+msgstr ""
+
msgid "New issue title"
msgstr ""
@@ -22532,7 +22837,7 @@ msgstr ""
msgid "Newest first"
msgstr ""
-msgid "Newly registered users will by default be external"
+msgid "Newly-registered users are external by default"
msgstr ""
msgid "Next"
@@ -22847,8 +23152,10 @@ msgstr ""
msgid "No webhooks found, add one in the form above."
msgstr ""
-msgid "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} to renew your subscription."
-msgstr ""
+msgid "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} day to renew your subscription."
+msgid_plural "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} days to renew your subscription."
+msgstr[0] ""
+msgstr[1] ""
msgid "No. of commits"
msgstr ""
@@ -22865,7 +23172,7 @@ msgstr ""
msgid "Nodes"
msgstr ""
-msgid "Non-admin users can sign in with read-only access and make read-only API requests."
+msgid "Non-admin users are restricted to read-only access, in both GitLab UI and API."
msgstr ""
msgid "None"
@@ -22946,7 +23253,7 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
-msgid "Notes Rate Limits"
+msgid "Notes rate limit"
msgstr ""
msgid "Notes|Are you sure you want to cancel creating this comment?"
@@ -23113,9 +23420,6 @@ msgstr ""
msgid "November"
msgstr ""
-msgid "Novice"
-msgstr ""
-
msgid "Now, personalize your GitLab experience"
msgstr ""
@@ -23284,7 +23588,7 @@ msgstr ""
msgid "OnCallSchedules|For this rotation, on-call will be:"
msgstr ""
-msgid "OnCallSchedules|On-call schedule %{schedule} in Project %{project}"
+msgid "OnCallSchedules|On-call schedule %{obstacle} in Project %{project}"
msgstr ""
msgid "OnCallSchedules|On-call schedules"
@@ -23431,22 +23735,22 @@ msgstr ""
msgid "OnDemandScans|Scanner profile"
msgstr ""
-msgid "OnDemandScans|Select one of the existing profiles"
+msgid "OnDemandScans|Schedule scan"
msgstr ""
-msgid "OnDemandScans|Site profile"
+msgid "OnDemandScans|Select one of the existing profiles"
msgstr ""
-msgid "OnDemandScans|Use existing scanner profile"
+msgid "OnDemandScans|Site profile"
msgstr ""
-msgid "OnDemandScans|Use existing site profile"
+msgid "OnDemandScans|Start time"
msgstr ""
-msgid "OnDemandScans|You can either choose a passive scan or validate the target site in your chosen site profile. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
+msgid "OnDemandScans|Use existing scanner profile"
msgstr ""
-msgid "OnDemandScans|You cannot run an active scan against an unvalidated site."
+msgid "OnDemandScans|Use existing site profile"
msgstr ""
msgid "OnDemandScans|You must create a repository within your project to run an on-demand scan."
@@ -23511,6 +23815,9 @@ msgstr ""
msgid "Only admins can delete project"
msgstr ""
+msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
+msgstr ""
+
msgid "Only include features new to your current subscription tier."
msgstr ""
@@ -23529,6 +23836,12 @@ msgstr ""
msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
+msgid "Only reCAPTCHA v2 is supported:"
+msgstr ""
+
+msgid "Only users from the specified IP address ranges are able to reach this group, including all subgroups, projects, and Git repositories."
+msgstr ""
+
msgid "Only verified users with an email address in any of these domains can be added to the group."
msgstr ""
@@ -23715,9 +24028,6 @@ msgstr ""
msgid "Package Registry"
msgstr ""
-msgid "Package Registry Rate Limits"
-msgstr ""
-
msgid "Package Registry: authenticated API requests"
msgstr ""
@@ -23736,6 +24046,9 @@ msgstr ""
msgid "Package recipe already exists"
msgstr ""
+msgid "Package registry rate limits"
+msgstr ""
+
msgid "Package type"
msgstr ""
@@ -23802,6 +24115,9 @@ msgstr ""
msgid "PackageRegistry|Composer"
msgstr ""
+msgid "PackageRegistry|Composer.json with license: %{license} and version: %{version}"
+msgstr ""
+
msgid "PackageRegistry|Conan"
msgstr ""
@@ -23865,6 +24181,9 @@ msgstr ""
msgid "PackageRegistry|Copy require package include"
msgstr ""
+msgid "PackageRegistry|Copy target SHA"
+msgstr ""
+
msgid "PackageRegistry|Copy yarn command"
msgstr ""
@@ -23931,6 +24250,9 @@ msgstr ""
msgid "PackageRegistry|Install package version"
msgstr ""
+msgid "PackageRegistry|Instance-level"
+msgstr ""
+
msgid "PackageRegistry|Invalid Package: failed metadata extraction"
msgstr ""
@@ -23976,6 +24298,9 @@ msgstr ""
msgid "PackageRegistry|Pip Command"
msgstr ""
+msgid "PackageRegistry|Project-level"
+msgstr ""
+
msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
msgstr ""
@@ -23997,6 +24322,9 @@ msgstr ""
msgid "PackageRegistry|Remove package"
msgstr ""
+msgid "PackageRegistry|Required Python: %{pythonVersion}"
+msgstr ""
+
msgid "PackageRegistry|RubyGems"
msgstr ""
@@ -24039,6 +24367,9 @@ msgstr ""
msgid "PackageRegistry|Source project located at %{link}"
msgstr ""
+msgid "PackageRegistry|Target SHA: %{sha}"
+msgstr ""
+
msgid "PackageRegistry|There are no other versions of this package."
msgstr ""
@@ -24207,6 +24538,18 @@ msgstr ""
msgid "Password was successfully updated. Please sign in again."
msgstr ""
+msgid "PasswordPrompt|Confirm password"
+msgstr ""
+
+msgid "PasswordPrompt|Confirm password to continue"
+msgstr ""
+
+msgid "PasswordPrompt|Password is required"
+msgstr ""
+
+msgid "PasswordPrompt|Please enter your password to confirm"
+msgstr ""
+
msgid "Passwords should be unique and not used for any other sites or services."
msgstr ""
@@ -24234,6 +24577,9 @@ msgstr ""
msgid "Paste project path (i.e. gitlab-org/gitlab)"
msgstr ""
+msgid "Paste this DSN into your Sentry SDK"
+msgstr ""
+
msgid "Paste your public SSH key, which is usually contained in the file '~/.ssh/id_ed25519.pub' or '~/.ssh/id_rsa.pub' and begins with 'ssh-ed25519' or 'ssh-rsa'. Do not paste your private SSH key, as that can compromise your identity."
msgstr ""
@@ -24318,6 +24664,9 @@ msgstr ""
msgid "PerformanceBar|First Contentful Paint"
msgstr ""
+msgid "PerformanceBar|Flamegraph with mode:"
+msgstr ""
+
msgid "PerformanceBar|Frontend resources"
msgstr ""
@@ -24351,6 +24700,15 @@ msgstr ""
msgid "PerformanceBar|Trace"
msgstr ""
+msgid "PerformanceBar|cpu"
+msgstr ""
+
+msgid "PerformanceBar|object"
+msgstr ""
+
+msgid "PerformanceBar|wall"
+msgstr ""
+
msgid "Period in seconds"
msgstr ""
@@ -24579,6 +24937,48 @@ msgstr ""
msgid "PipelineSchedules|Variables"
msgstr ""
+msgid "PipelineSource|API"
+msgstr ""
+
+msgid "PipelineSource|Chat"
+msgstr ""
+
+msgid "PipelineSource|External"
+msgstr ""
+
+msgid "PipelineSource|External Pull Request"
+msgstr ""
+
+msgid "PipelineSource|Merge Request"
+msgstr ""
+
+msgid "PipelineSource|On-Demand DAST Scan"
+msgstr ""
+
+msgid "PipelineSource|On-Demand DAST Validation"
+msgstr ""
+
+msgid "PipelineSource|Parent Pipeline"
+msgstr ""
+
+msgid "PipelineSource|Pipeline"
+msgstr ""
+
+msgid "PipelineSource|Push"
+msgstr ""
+
+msgid "PipelineSource|Schedule"
+msgstr ""
+
+msgid "PipelineSource|Trigger"
+msgstr ""
+
+msgid "PipelineSource|Web"
+msgstr ""
+
+msgid "PipelineSource|Web IDE"
+msgstr ""
+
msgid "PipelineStatusTooltip|Pipeline: %{ciStatus}"
msgstr ""
@@ -24879,46 +25279,7 @@ msgstr ""
msgid "Pipeline|Source"
msgstr ""
-msgid "Pipeline|Source|API"
-msgstr ""
-
-msgid "Pipeline|Source|Chat"
-msgstr ""
-
-msgid "Pipeline|Source|External"
-msgstr ""
-
-msgid "Pipeline|Source|External Pull Request"
-msgstr ""
-
-msgid "Pipeline|Source|Merge Request"
-msgstr ""
-
-msgid "Pipeline|Source|On-Demand DAST Scan"
-msgstr ""
-
-msgid "Pipeline|Source|On-Demand DAST Validation"
-msgstr ""
-
-msgid "Pipeline|Source|Parent Pipeline"
-msgstr ""
-
-msgid "Pipeline|Source|Pipeline"
-msgstr ""
-
-msgid "Pipeline|Source|Push"
-msgstr ""
-
-msgid "Pipeline|Source|Schedule"
-msgstr ""
-
-msgid "Pipeline|Source|Trigger"
-msgstr ""
-
-msgid "Pipeline|Source|Web"
-msgstr ""
-
-msgid "Pipeline|Source|Web IDE"
+msgid "Pipeline|Source|Security Policy"
msgstr ""
msgid "Pipeline|Specify variable values to be used in this run. The values specified in %{linkStart}CI/CD settings%{linkEnd} will be used by default."
@@ -24969,7 +25330,7 @@ msgstr ""
msgid "Pipeline|We are currently unable to fetch pipeline data"
msgstr ""
-msgid "Pipeline|You’re about to stop pipeline %{pipelineId}."
+msgid "Pipeline|You’re about to stop pipeline #%{pipelineId}."
msgstr ""
msgid "Pipeline|for"
@@ -24996,6 +25357,9 @@ msgstr ""
msgid "Plain diff"
msgstr ""
+msgid "Plain-text response to send to clients that hit a rate limit"
+msgstr ""
+
msgid "Plan:"
msgstr ""
@@ -25140,9 +25504,6 @@ msgstr ""
msgid "Please provide attributes to update"
msgstr ""
-msgid "Please provide your username or email address."
-msgstr ""
-
msgid "Please reach out if you have any questions and we'll be happy to assist."
msgstr ""
@@ -25185,9 +25546,6 @@ msgstr ""
msgid "Please set a new password before proceeding."
msgstr ""
-msgid "Please share your feedback about %{featureName} %{linkStart}in this issue%{linkEnd} to help us improve the experience."
-msgstr ""
-
msgid "Please solve the captcha"
msgstr ""
@@ -25365,6 +25723,9 @@ msgstr ""
msgid "Prevent adding new members to project membership within this group"
msgstr ""
+msgid "Prevent auto-stopping"
+msgstr ""
+
msgid "Prevent editing approval rules in projects and merge requests."
msgstr ""
@@ -25377,7 +25738,7 @@ msgstr ""
msgid "Prevent users from changing their profile name"
msgstr ""
-msgid "Prevent users from performing write operations on GitLab while performing maintenance."
+msgid "Prevent users from performing write operations while GitLab maintenance is in progress."
msgstr ""
msgid "Preview"
@@ -25650,6 +26011,9 @@ msgstr ""
msgid "Profiles|Enter your name, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Enter your password to confirm the email change"
+msgstr ""
+
msgid "Profiles|Enter your pronouns to let people know how to refer to you"
msgstr ""
@@ -25884,10 +26248,10 @@ msgstr ""
msgid "Profiles|e.g. My MacBook key"
msgstr ""
-msgid "Profiles|username"
+msgid "Profiles|https://website.com"
msgstr ""
-msgid "Profiles|website.com"
+msgid "Profiles|username"
msgstr ""
msgid "Profiles|your account"
@@ -26130,9 +26494,21 @@ msgstr ""
msgid "ProjectSelect| or group"
msgstr ""
+msgid "ProjectSelect|No matching results"
+msgstr ""
+
msgid "ProjectSelect|Search for project"
msgstr ""
+msgid "ProjectSelect|Search projects"
+msgstr ""
+
+msgid "ProjectSelect|Select a project"
+msgstr ""
+
+msgid "ProjectSelect|There was an error fetching the projects. Please try again."
+msgstr ""
+
msgid "ProjectService|Drone server URL"
msgstr ""
@@ -26220,6 +26596,9 @@ msgstr ""
msgid "ProjectService|Trigger event when a new, unique alert is recorded."
msgstr ""
+msgid "ProjectService|Trigger event when a new, unique vulnerability is recorded. (Note: This feature requires an Ultimate plan.)"
+msgstr ""
+
msgid "ProjectService|Trigger event when a pipeline status changes."
msgstr ""
@@ -26634,9 +27013,15 @@ msgstr ""
msgid "Projects are graded based on the highest severity vulnerability present"
msgstr ""
+msgid "Projects are organized into groups"
+msgstr ""
+
msgid "Projects contributed to"
msgstr ""
+msgid "Projects help you organize your work. They contain your file repository, issues, merge requests, and so much more."
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr ""
@@ -26871,10 +27256,10 @@ msgstr ""
msgid "PrometheusService|Prometheus cluster integration"
msgstr ""
-msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
+msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
msgstr ""
-msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
+msgid "PrometheusService|The ID of the IAP-secured resource."
msgstr ""
msgid "PrometheusService|The Prometheus API base URL."
@@ -27492,6 +27877,9 @@ msgstr ""
msgid "Rate limit"
msgstr ""
+msgid "Rate limits can help reduce request volume (like from crawlers or abusive bots)."
+msgstr ""
+
msgid "Raw blob request rate limit per minute"
msgstr ""
@@ -27504,6 +27892,9 @@ msgstr ""
msgid "Re-authentication required"
msgstr ""
+msgid "Re-import"
+msgstr ""
+
msgid "Re-request review"
msgstr ""
@@ -27525,6 +27916,9 @@ msgstr ""
msgid "Read more about related issues"
msgstr ""
+msgid "Read their documentation."
+msgstr ""
+
msgid "Ready to get started with GitLab? Follow these steps to set up your workspace, plan and commit changes, and deploy your project."
msgstr ""
@@ -27558,6 +27952,9 @@ msgstr ""
msgid "Receive any notifications from GitLab."
msgstr ""
+msgid "Receive notification of abuse reports by email."
+msgstr ""
+
msgid "Receive notifications about your own activity"
msgstr ""
@@ -27701,9 +28098,6 @@ msgstr ""
msgid "Registry setup"
msgstr ""
-msgid "Regulate approvals by authors/committers. Affects all projects."
-msgstr ""
-
msgid "Reindexing Status: %{status} (Slice multiplier: %{multiplier}, Maximum running slices: %{max_slices})"
msgstr ""
@@ -27799,6 +28193,9 @@ msgstr ""
msgid "Release|Something went wrong while saving the release details."
msgstr ""
+msgid "Reload page"
+msgstr ""
+
msgid "Remediations"
msgstr ""
@@ -28081,6 +28478,9 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
+msgid "Repeats"
+msgstr ""
+
msgid "Replace"
msgstr ""
@@ -28443,10 +28843,7 @@ msgstr ""
msgid "Require additional authentication for administrative tasks."
msgstr ""
-msgid "Require all users in this group to setup Two-factor authentication"
-msgstr ""
-
-msgid "Require all users in this group to setup two-factor authentication"
+msgid "Require all users in this group to set up two-factor authentication"
msgstr ""
msgid "Required approvals (%{approvals_given} given)"
@@ -28492,6 +28889,9 @@ msgstr[1] ""
msgid "Requires values to meet regular expression requirements."
msgstr ""
+msgid "Requires you to deploy or set up cloud-hosted Sentry."
+msgstr ""
+
msgid "Requires your primary GitLab email address."
msgstr ""
@@ -28552,9 +28952,6 @@ msgstr ""
msgid "Resolve"
msgstr ""
-msgid "Resolve all threads in new issue"
-msgstr ""
-
msgid "Resolve conflicts"
msgstr ""
@@ -28612,6 +29009,9 @@ msgstr ""
msgid "Response text"
msgstr ""
+msgid "Restart GitLab to apply changes."
+msgstr ""
+
msgid "Restart Terminal"
msgstr ""
@@ -28630,6 +29030,9 @@ msgstr ""
msgid "Restoring the project will prevent the project from being removed on this date and restore people's ability to make changes to it."
msgstr ""
+msgid "Restrict group access by IP address. %{link_start}Learn more%{link_end}."
+msgstr ""
+
msgid "Restrict membership by email domain"
msgstr ""
@@ -28943,6 +29346,9 @@ msgstr ""
msgid "Runners|Runner #%{runner_id}"
msgstr ""
+msgid "Runners|Runner assigned to project."
+msgstr ""
+
msgid "Runners|Runner is offline, last contact was %{runner_contact} ago"
msgstr ""
@@ -28955,6 +29361,9 @@ msgstr ""
msgid "Runners|Runner registration"
msgstr ""
+msgid "Runners|Runner unassigned from project."
+msgstr ""
+
msgid "Runners|Runners"
msgstr ""
@@ -29147,7 +29556,7 @@ msgstr ""
msgid "SastEntryPoints|How do I set up SAST?"
msgstr ""
-msgid "SastEntryPoints|Learn more."
+msgid "SastEntryPoints|Learn more"
msgstr ""
msgid "Satisfied"
@@ -29189,7 +29598,7 @@ msgstr ""
msgid "Save pipeline schedule"
msgstr ""
-msgid "Save space and find images in the container Registry. remove unneeded tags and keep only the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
+msgid "Save storage space by automatically deleting tags from the container registry and keeping the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
msgstr ""
msgid "Saving"
@@ -29363,6 +29772,9 @@ msgstr ""
msgid "Search or filter results…"
msgstr ""
+msgid "Search or jump to..."
+msgstr ""
+
msgid "Search project"
msgstr ""
@@ -29423,16 +29835,16 @@ msgstr ""
msgid "SearchCodeResults|of %{link_to_project}"
msgstr ""
-msgid "SearchResults|Showing %{count} %{scope} for%{term_element}"
+msgid "SearchResults|Showing %{count} %{scope} for %{term_element}"
msgstr ""
-msgid "SearchResults|Showing %{count} %{scope} for%{term_element} in your personal and project snippets"
+msgid "SearchResults|Showing %{count} %{scope} for %{term_element} in your personal and project snippets"
msgstr ""
-msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for%{term_element}"
+msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for %{term_element}"
msgstr ""
-msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for%{term_element} in your personal and project snippets"
+msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for %{term_element} in your personal and project snippets"
msgstr ""
msgid "SearchResults|code result"
@@ -29514,6 +29926,9 @@ msgstr ""
msgid "Secret Detection"
msgstr ""
+msgid "Secret access key"
+msgstr ""
+
msgid "Secret token"
msgstr ""
@@ -29553,9 +29968,6 @@ msgstr ""
msgid "SecurityApprovals|A merge request approval is required when the license compliance report contains a denied license."
msgstr ""
-msgid "SecurityApprovals|Configurable if security scanners are enabled. %{linkStart}Learn more.%{linkEnd}"
-msgstr ""
-
msgid "SecurityApprovals|Coverage-Check"
msgstr ""
@@ -29568,24 +29980,18 @@ msgstr ""
msgid "SecurityApprovals|Learn more about Vulnerability-Check"
msgstr ""
-msgid "SecurityApprovals|License Scanning must be enabled. %{linkStart}Learn more%{linkEnd}."
-msgstr ""
-
msgid "SecurityApprovals|License-Check"
msgstr ""
msgid "SecurityApprovals|Requires approval for Denied licenses. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}More information%{linkEnd}"
+msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "SecurityApprovals|Requires approval for vulnerabilities. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
-msgid "SecurityApprovals|Test coverage must be enabled. %{linkStart}Learn more%{linkEnd}."
-msgstr ""
-
msgid "SecurityApprovals|Vulnerability-Check"
msgstr ""
@@ -29649,6 +30055,12 @@ msgstr ""
msgid "SecurityConfiguration|Immediately begin risk analysis and remediation with application security features. Start with SAST and Secret Detection, available to all plans. Upgrade to Ultimate to get all features, including:"
msgstr ""
+msgid "SecurityConfiguration|Manage corpus"
+msgstr ""
+
+msgid "SecurityConfiguration|Manage corpus files used as mutation sources in coverage fuzzing."
+msgstr ""
+
msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
msgstr ""
@@ -29703,6 +30115,12 @@ msgstr ""
msgid "SecurityOrchestration|Action"
msgstr ""
+msgid "SecurityOrchestration|Actions"
+msgstr ""
+
+msgid "SecurityOrchestration|Add rule"
+msgstr ""
+
msgid "SecurityOrchestration|All policies"
msgstr ""
@@ -29736,9 +30154,6 @@ msgstr ""
msgid "SecurityOrchestration|Network"
msgstr ""
-msgid "SecurityOrchestration|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
-msgstr ""
-
msgid "SecurityOrchestration|New policy"
msgstr ""
@@ -29754,6 +30169,9 @@ msgstr ""
msgid "SecurityOrchestration|Policy editor"
msgstr ""
+msgid "SecurityOrchestration|Policy preview"
+msgstr ""
+
msgid "SecurityOrchestration|Policy status"
msgstr ""
@@ -29763,6 +30181,9 @@ msgstr ""
msgid "SecurityOrchestration|Rule"
msgstr ""
+msgid "SecurityOrchestration|Rules"
+msgstr ""
+
msgid "SecurityOrchestration|Scan Execution"
msgstr ""
@@ -29856,6 +30277,9 @@ msgstr ""
msgid "SecurityReports|Create issue"
msgstr ""
+msgid "SecurityReports|Development vulnerabilities"
+msgstr ""
+
msgid "SecurityReports|Dismiss vulnerability"
msgstr ""
@@ -29871,6 +30295,9 @@ msgstr ""
msgid "SecurityReports|Download results"
msgstr ""
+msgid "SecurityReports|Download scanned URLs"
+msgstr ""
+
msgid "SecurityReports|Download scanned resources"
msgstr ""
@@ -29994,6 +30421,9 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
+msgid "SecurityReports|The Vulnerability Report shows the results of the lastest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "SecurityReports|The security reports below contain one or more vulnerability findings that could not be parsed and were not recorded. Download the artifacts in the job output to investigate. Ensure any security report created conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
msgstr ""
@@ -30135,10 +30565,10 @@ msgstr ""
msgid "Select a repository"
msgstr ""
-msgid "Select a role"
+msgid "Select a repository containing templates for common files."
msgstr ""
-msgid "Select a shared template repository for all projects on this instance."
+msgid "Select a role"
msgstr ""
msgid "Select a template repository"
@@ -30216,6 +30646,9 @@ msgstr ""
msgid "Select project to choose zone"
msgstr ""
+msgid "Select project to create issue"
+msgstr ""
+
msgid "Select projects"
msgstr ""
@@ -30333,6 +30766,9 @@ msgstr ""
msgid "Send emails to help guide new users through the onboarding process."
msgstr ""
+msgid "Send emails to users upon account deactivation."
+msgstr ""
+
msgid "Send message"
msgstr ""
@@ -30351,6 +30787,9 @@ msgstr ""
msgid "Send service data"
msgstr ""
+msgid "Sentry"
+msgstr ""
+
msgid "Sentry API URL"
msgstr ""
@@ -30465,6 +30904,9 @@ msgstr ""
msgid "Service"
msgstr ""
+msgid "Service Accounts keys are required to authorize GitLab to deploy your Google Cloud project."
+msgstr ""
+
msgid "Service Desk"
msgstr ""
@@ -30537,15 +30979,15 @@ msgstr ""
msgid "Set a password on your account to pull or push via %{protocol}."
msgstr ""
-msgid "Set a template repository for projects in this group"
-msgstr ""
-
msgid "Set access permissions for this token."
msgstr ""
msgid "Set an instance-wide domain that will be available to all clusters when installing Knative."
msgstr ""
+msgid "Set any rate limit to %{code_open}0%{code_close} to disable the limit."
+msgstr ""
+
msgid "Set default and restrict visibility levels. Configure import sources and git access protocol."
msgstr ""
@@ -30558,7 +31000,7 @@ msgstr ""
msgid "Set limit to 0 to allow any file size."
msgstr ""
-msgid "Set max session time for web terminal."
+msgid "Set limits for web and API requests."
msgstr ""
msgid "Set milestone"
@@ -30567,15 +31009,18 @@ msgstr ""
msgid "Set new password"
msgstr ""
-msgid "Set notification email for abuse reports."
+msgid "Set parent epic to an epic"
msgstr ""
-msgid "Set parent epic to an epic"
+msgid "Set per-user rate limits for imports and exports of projects and groups."
msgstr ""
msgid "Set projects and maximum size limits, session duration, user options, and check feature availability for namespace plan."
msgstr ""
+msgid "Set rate limits for package registry API requests that supersede the general user and IP rate limits."
+msgstr ""
+
msgid "Set severity"
msgstr ""
@@ -30594,15 +31039,24 @@ msgstr ""
msgid "Set the default branch for this project. All merge requests and commits are made against this branch unless you specify a different one."
msgstr ""
+msgid "Set the default expiration time for job artifacts in all projects. Set to %{code_open}0%{code_close} to never expire artifacts by default. If no unit is written, it defaults to seconds. For example, these are all equivalent: %{code_open}3600%{code_close}, %{code_open}60 minutes%{code_close}, or %{code_open}one hour%{code_close}."
+msgstr ""
+
msgid "Set the due date to %{due_date}."
msgstr ""
msgid "Set the iteration to %{iteration_reference}."
msgstr ""
+msgid "Set the maximum session time for a web terminal."
+msgstr ""
+
msgid "Set the milestone to %{milestone_reference}."
msgstr ""
+msgid "Set the per-user rate limit for notes created by web or API requests."
+msgstr ""
+
msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
msgstr ""
@@ -30804,6 +31258,9 @@ msgstr ""
msgid "Show Pipeline IID"
msgstr ""
+msgid "Show all %{issuable_type}."
+msgstr ""
+
msgid "Show all activity"
msgstr ""
@@ -30855,15 +31312,9 @@ msgstr ""
msgid "Show list"
msgstr ""
-msgid "Show me advanced features"
-msgstr ""
-
msgid "Show me how to add a pipeline"
msgstr ""
-msgid "Show me the basics"
-msgstr ""
-
msgid "Show one file at a time"
msgstr ""
@@ -30904,15 +31355,15 @@ msgstr ""
msgid "Showing %{pageSize} of %{total} %{issuableType}"
msgstr ""
-msgid "Showing %{pageSize} of %{total} issues"
-msgstr ""
-
msgid "Showing all epics"
msgstr ""
msgid "Showing all issues"
msgstr ""
+msgid "Showing data for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
+msgstr ""
+
msgid "Showing data for workflow items created in this date range. Date range cannot exceed %{maxDateRange} days."
msgstr ""
@@ -30952,6 +31403,15 @@ msgstr ""
msgid "Sidebar|Weight"
msgstr ""
+msgid "Sidekiq job compression threshold (bytes)"
+msgstr ""
+
+msgid "Sidekiq job size limit (bytes)"
+msgstr ""
+
+msgid "Sidekiq job size limits"
+msgstr ""
+
msgid "Sign in"
msgstr ""
@@ -31072,6 +31532,9 @@ msgstr ""
msgid "Site profile not found for given parameters"
msgstr ""
+msgid "Sites"
+msgstr ""
+
msgid "Size"
msgstr ""
@@ -31102,19 +31565,22 @@ msgstr ""
msgid "SlackIntegration|Sends notifications about project events to Slack channels."
msgstr ""
-msgid "SlackService|2. Paste the %{strong_open}Token%{strong_close} into the field below"
+msgid "SlackService|1. %{slash_command_link_start}Add a slash command%{slash_command_link_end} in your Slack team using this information:"
msgstr ""
-msgid "SlackService|3. Select the %{strong_open}Active%{strong_close} checkbox, press %{strong_open}Save changes%{strong_close} and start using GitLab inside Slack!"
+msgid "SlackService|2. Paste the token from Slack in the %{strong_open}Token%{strong_close} field below."
msgstr ""
-msgid "SlackService|Fill in the word that works best for your team."
+msgid "SlackService|3. Select the %{strong_open}Active%{strong_close} checkbox, select %{strong_open}Save changes%{strong_close}, and start using slash commands in Slack!"
+msgstr ""
+
+msgid "SlackService|After setup, get a list of available Slack slash commands by entering"
msgstr ""
-msgid "SlackService|See list of available commands in Slack after setting up this service, by entering"
+msgid "SlackService|Fill in the word that works best for your team."
msgstr ""
-msgid "SlackService|This service allows users to perform common operations on this project by entering slash commands in Slack."
+msgid "SlackService|Perform common operations in this project by entering slash commands in Slack."
msgstr ""
msgid "Slice multiplier"
@@ -31180,7 +31646,7 @@ msgstr ""
msgid "Some child epics may be hidden due to applied filters"
msgstr ""
-msgid "Some common domains are not allowed. %{read_more_link}."
+msgid "Some common domains are not allowed. %{learn_more_link}."
msgstr ""
msgid "Some of the designs you tried uploading did not change:"
@@ -31264,9 +31730,6 @@ msgstr ""
msgid "Something went wrong while exporting requirements"
msgstr ""
-msgid "Something went wrong while fetching %{listType} list"
-msgstr ""
-
msgid "Something went wrong while fetching branches"
msgstr ""
@@ -31321,15 +31784,9 @@ msgstr ""
msgid "Something went wrong while merging this merge request. Please try again."
msgstr ""
-msgid "Something went wrong while moving issues."
-msgstr ""
-
msgid "Something went wrong while obtaining the Let's Encrypt certificate."
msgstr ""
-msgid "Something went wrong while performing the action."
-msgstr ""
-
msgid "Something went wrong while promoting the issue to an epic. Please try again."
msgstr ""
@@ -31657,7 +32114,10 @@ msgstr ""
msgid "SourcegraphPreferences|Uses a custom %{linkStart}Sourcegraph instance%{linkEnd}."
msgstr ""
-msgid "Spam Check API Key"
+msgid "Spam Check"
+msgstr ""
+
+msgid "Spam Check API key"
msgstr ""
msgid "Spam Logs"
@@ -31675,7 +32135,7 @@ msgstr ""
msgid "Specified URL cannot be used: \"%{reason}\""
msgstr ""
-msgid "Specify an e-mail address regex pattern to identify default internal users."
+msgid "Specify an email address regex pattern to identify default internal users."
msgstr ""
msgid "Speed up your pipelines with Needs relationships"
@@ -31930,7 +32390,7 @@ msgstr ""
msgid "StatusCheck|An error occurred fetching the status checks."
msgstr ""
-msgid "StatusCheck|Apply this status check to any branch or a specific protected branch."
+msgid "StatusCheck|Apply this status check to all branches or a specific protected branch."
msgstr ""
msgid "StatusCheck|Check for a status response in Merge Requests. Failures do not block merges. %{link_start}Learn more%{link_end}."
@@ -32269,6 +32729,9 @@ msgstr ""
msgid "Subscriptions"
msgstr ""
+msgid "Subscription|Your subscription for %{strong}%{namespace_name}%{strong_close} has expired and you are now on %{pricing_link_start}the GitLab Free tier%{pricing_link_end}. Don't worry, your data is safe. Get in touch with our support team (%{support_email}). They'll gladly help with your subscription renewal."
+msgstr ""
+
msgid "Subtracted"
msgstr ""
@@ -32497,6 +32960,9 @@ msgstr ""
msgid "SuperSonics|Plan"
msgstr ""
+msgid "SuperSonics|Please agree to the Subscription Agreement"
+msgstr ""
+
msgid "SuperSonics|Ready to get started? A GitLab plan is ideal for scaling organizations and for multi team usage."
msgstr ""
@@ -32527,6 +32993,9 @@ msgstr ""
msgid "SuperSonics|The activation code is not valid. Please make sure to copy it exactly from the Customers Portal or confirmation email. Learn more about %{linkStart}activating your subscription%{linkEnd}."
msgstr ""
+msgid "SuperSonics|The activation code should be a 24-character alphanumeric string"
+msgstr ""
+
msgid "SuperSonics|There is a connectivity issue."
msgstr ""
@@ -32569,9 +33038,15 @@ msgstr ""
msgid "SuperSonics|You do not have an active subscription"
msgstr ""
+msgid "SuperSonics|You have successfully added a license that activates on %{date}. Please see the subscription history table below for more details."
+msgstr ""
+
msgid "SuperSonics|You'll be charged for %{trueUpLinkStart}users over license%{trueUpLinkEnd} on a quarterly or annual basis, depending on the terms of your agreement."
msgstr ""
+msgid "SuperSonics|Your future dated license was successfully added"
+msgstr ""
+
msgid "SuperSonics|Your subscription"
msgstr ""
@@ -32824,7 +33299,7 @@ msgstr ""
msgid "Template to append to all Service Desk issues"
msgstr ""
-msgid "TemplateRepository|Select a repository to make its templates available to all projects. %{link_start}What should the repository contain?%{link_end} "
+msgid "TemplateRepository|Create common files more quickly, and standardize their format."
msgstr ""
msgid "Templates"
@@ -33030,7 +33505,7 @@ msgstr ""
msgid "TestCases|Search test cases"
msgstr ""
-msgid "TestCases|Something went wrong while adding test case to Todo."
+msgid "TestCases|Something went wrong while adding test case to a to-do item."
msgstr ""
msgid "TestCases|Something went wrong while creating a test case."
@@ -33042,7 +33517,7 @@ msgstr ""
msgid "TestCases|Something went wrong while fetching test cases list."
msgstr ""
-msgid "TestCases|Something went wrong while marking test case todo as done."
+msgid "TestCases|Something went wrong while marking test case to-do item as done."
msgstr ""
msgid "TestCases|Something went wrong while moving test case."
@@ -33162,7 +33637,7 @@ msgstr ""
msgid "Thanks for your purchase!"
msgstr ""
-msgid "That is ok, I do not want to renew"
+msgid "That's OK, I don't want to renew"
msgstr ""
msgid "That's it, well done!"
@@ -33185,7 +33660,7 @@ msgid_plural "The %{type} contains the following errors:"
msgstr[0] ""
msgstr[1] ""
-msgid "The API key used by GitLab for accessing the Spam Check service endpoint"
+msgid "The API key used by GitLab for accessing the Spam Check service endpoint."
msgstr ""
msgid "The GitLab subscription service (customers.gitlab.com) is currently experiencing an outage. You can monitor the status and get updates at %{linkStart}status.gitlab.com%{linkEnd}."
@@ -33224,9 +33699,6 @@ msgstr ""
msgid "The URL to use for connecting to Elasticsearch. Use a comma-separated list to support clustering (e.g., \"http://localhost:9200, http://localhost:9201\")."
msgstr ""
-msgid "The Vulnerability Report shows the results of the last successful pipeline run on the default branch."
-msgstr ""
-
msgid "The X509 Certificate to use when mutual TLS is required to communicate with the external authorization service. If left blank, the server certificate is still validated when accessing over HTTPS."
msgstr ""
@@ -33284,9 +33756,6 @@ msgstr ""
msgid "The default branch for this project has been changed. Please update your bookmarks."
msgstr ""
-msgid "The default expiration time for job artifacts. 0 for unlimited. The default unit is in seconds, but you can use other units, for example %{code_open}4 mins 2 sec%{code_close}, %{code_open}2h42min%{code_close}."
-msgstr ""
-
msgid "The dependency list details information about the components used within your project."
msgstr ""
@@ -33478,9 +33947,6 @@ msgstr ""
msgid "The merge conflicts for this merge request have already been resolved. Please return to the merge request."
msgstr ""
-msgid "The merge request can now be merged."
-msgstr ""
-
msgid "The metric must be one of %{metrics}."
msgstr ""
@@ -33856,7 +34322,7 @@ msgstr ""
msgid "There was a problem updating the keep latest artifacts setting."
msgstr ""
-msgid "There was an error %{message} todo."
+msgid "There was an error %{message} to-do item."
msgstr ""
msgid "There was an error adding a To Do."
@@ -33895,6 +34361,9 @@ msgstr ""
msgid "There was an error fetching projects"
msgstr ""
+msgid "There was an error fetching search autocomplete suggestions"
+msgstr ""
+
msgid "There was an error fetching stage total counts"
msgstr ""
@@ -34219,6 +34688,9 @@ msgstr ""
msgid "This field is required."
msgstr ""
+msgid "This form is disabled in preview"
+msgstr ""
+
msgid "This group"
msgstr ""
@@ -34240,9 +34712,6 @@ msgstr ""
msgid "This group is linked to a subscription"
msgstr ""
-msgid "This group, including all subgroups, projects and git repositories, will be reachable from only the specified IP address ranges."
-msgstr ""
-
msgid "This group, its subgroups and projects has been scheduled for removal on %{date}."
msgstr ""
@@ -34522,9 +34991,6 @@ msgstr ""
msgid "This user cannot be unlocked manually from GitLab"
msgstr ""
-msgid "This user does not have a pending request"
-msgstr ""
-
msgid "This user has an unconfirmed email address (%{email}). You may force a confirmation."
msgstr ""
@@ -34633,9 +35099,6 @@ msgstr ""
msgid "ThreatMonitoring|Packet Activity"
msgstr ""
-msgid "ThreatMonitoring|Policies"
-msgstr ""
-
msgid "ThreatMonitoring|Requests"
msgstr ""
@@ -34687,6 +35150,12 @@ msgstr ""
msgid "ThreatMonitoring|View documentation"
msgstr ""
+msgid "Threshold in bytes at which to compress Sidekiq job arguments."
+msgstr ""
+
+msgid "Threshold in bytes at which to reject Sidekiq jobs. Set this to 0 to if you don't want to limit Sidekiq jobs."
+msgstr ""
+
msgid "Throughput"
msgstr ""
@@ -34696,6 +35165,9 @@ msgstr ""
msgid "Time"
msgstr ""
+msgid "Time (in hours) that users are allowed to skip forced configuration of two-factor authentication."
+msgstr ""
+
msgid "Time Spent"
msgstr ""
@@ -34762,7 +35234,7 @@ msgstr ""
msgid "TimeTrackingEstimated|Est"
msgstr ""
-msgid "TimeTracking|%{startTag}Spent: %{endTag}%{timeSpentHumanReadable}"
+msgid "TimeTracking|%{spentStart}Spent: %{spentEnd}"
msgstr ""
msgid "TimeTracking|Estimated:"
@@ -34976,6 +35448,9 @@ msgstr ""
msgid "To access this domain create a new DNS record"
msgstr ""
+msgid "To add a custom suffix, set up a Service Desk email address. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "To add an SSH key you need to %{generate_link_start}generate one%{link_end} or use an %{existing_link_start}existing key%{link_end}."
msgstr ""
@@ -34997,13 +35472,16 @@ msgstr ""
msgid "To connect an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To continue using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
+msgstr ""
+
msgid "To continue, you need to select the link in the confirmation email we sent to verify your email address. If you didn't get our email, select %{strongStart}Resend confirmation email.%{strongEnd}"
msgstr ""
msgid "To define internal users, first enable new users set to external"
msgstr ""
-msgid "To enable Registration Features, make sure \"Enable service ping\" is checked."
+msgid "To enable Registration Features, first enable Service Ping."
msgstr ""
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
@@ -35030,7 +35508,7 @@ msgstr ""
msgid "To get started, use the link below to confirm your account."
msgstr ""
-msgid "To help improve GitLab and its user experience, GitLab will periodically collect usage information."
+msgid "To help improve GitLab and its user experience, GitLab periodically collects usage information."
msgstr ""
msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
@@ -35063,7 +35541,7 @@ msgstr ""
msgid "To preserve performance only %{strong_open}%{display_size} of %{real_size}%{strong_close} files are displayed."
msgstr ""
-msgid "To protect this issue's confidentiality, %{forkLink} and set the fork's visibility to private."
+msgid "To protect this issue's confidentiality, %{linkStart}fork this project%{linkEnd} and set the fork's visibility to private."
msgstr ""
msgid "To protect this issue's confidentiality, a private fork of this project was selected."
@@ -35096,12 +35574,15 @@ msgstr ""
msgid "To set up SAML authentication for your group through an identity provider like Azure, Okta, Onelogin, Ping Identity, or your custom SAML 2.0 provider:"
msgstr ""
-msgid "To set up this service:"
+msgid "To set up this integration:"
msgstr ""
msgid "To specify the notification level per project of a group you belong to, you need to visit project page and change notification level there."
msgstr ""
+msgid "To start using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
+msgstr ""
+
msgid "To unsubscribe from this issue, please paste the following link into your browser:"
msgstr ""
@@ -35689,9 +36170,6 @@ msgstr ""
msgid "Unable to fetch branches list, please close the form and try again"
msgstr ""
-msgid "Unable to fetch unscanned projects"
-msgstr ""
-
msgid "Unable to fetch vulnerable projects"
msgstr ""
@@ -35746,6 +36224,15 @@ msgstr ""
msgid "Unable to update this issue at this time."
msgstr ""
+msgid "Unapprove a merge request"
+msgstr ""
+
+msgid "Unapprove the current merge request."
+msgstr ""
+
+msgid "Unapproved the current merge request."
+msgstr ""
+
msgid "Unarchive project"
msgstr ""
@@ -35758,16 +36245,13 @@ msgstr ""
msgid "Unassigned"
msgstr ""
-msgid "Unauthenticated API request rate limit"
-msgstr ""
-
-msgid "Unauthenticated rate limit period in seconds"
+msgid "Unauthenticated API rate limit period in seconds"
msgstr ""
-msgid "Unauthenticated request rate limit"
+msgid "Unauthenticated requests"
msgstr ""
-msgid "Unauthenticated requests"
+msgid "Unauthenticated web rate limit period in seconds"
msgstr ""
msgid "Undo"
@@ -35869,18 +36353,6 @@ msgstr ""
msgid "Unresolved"
msgstr ""
-msgid "UnscannedProjects|15 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|30 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|5 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|60 or more days"
-msgstr ""
-
msgid "Unschedule job"
msgstr ""
@@ -36100,6 +36572,9 @@ msgstr ""
msgid "UsageQuota|%{help_link_start}Shared runners%{help_link_end} are disabled, so there are no limits set on pipeline usage"
msgstr ""
+msgid "UsageQuota|%{linkTitle} help link"
+msgstr ""
+
msgid "UsageQuota|%{percentageLeft} of purchased storage is available"
msgstr ""
@@ -36109,6 +36584,9 @@ msgstr ""
msgid "UsageQuota|Artifacts is a sum of build and pipeline artifacts."
msgstr ""
+msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
+msgstr ""
+
msgid "UsageQuota|Buy additional minutes"
msgstr ""
@@ -36118,9 +36596,21 @@ msgstr ""
msgid "UsageQuota|CI minutes usage by project"
msgstr ""
+msgid "UsageQuota|Code packages and container images."
+msgstr ""
+
msgid "UsageQuota|Current period usage"
msgstr ""
+msgid "UsageQuota|File attachments and smaller design graphics."
+msgstr ""
+
+msgid "UsageQuota|Git repository, managed by the Gitaly service."
+msgstr ""
+
+msgid "UsageQuota|Includes project registry, artifacts, packages, wiki, uploads and other items."
+msgstr ""
+
msgid "UsageQuota|Increase storage temporarily"
msgstr ""
@@ -36139,6 +36629,9 @@ msgstr ""
msgid "UsageQuota|Packages"
msgstr ""
+msgid "UsageQuota|Pipeline artifacts and job artifacts, created with CI/CD."
+msgstr ""
+
msgid "UsageQuota|Pipelines"
msgstr ""
@@ -36157,6 +36650,9 @@ msgstr ""
msgid "UsageQuota|Seats"
msgstr ""
+msgid "UsageQuota|Shared bits of code and text."
+msgstr ""
+
msgid "UsageQuota|Snippets"
msgstr ""
@@ -36166,6 +36662,12 @@ msgstr ""
msgid "UsageQuota|Storage"
msgstr ""
+msgid "UsageQuota|Storage type"
+msgstr ""
+
+msgid "UsageQuota|There is a known issue with Artifact storage where the total could be incorrect for some projects. More details and progress are available in %{warningLinkStart}the epic%{warningLinkEnd}."
+msgstr ""
+
msgid "UsageQuota|This is the total amount of storage used across your projects within this namespace."
msgstr ""
@@ -36205,6 +36707,9 @@ msgstr ""
msgid "UsageQuota|Usage"
msgstr ""
+msgid "UsageQuota|Usage Breakdown"
+msgstr ""
+
msgid "UsageQuota|Usage Quotas"
msgstr ""
@@ -36229,6 +36734,9 @@ msgstr ""
msgid "UsageQuota|Wiki"
msgstr ""
+msgid "UsageQuota|Wiki content."
+msgstr ""
+
msgid "UsageQuota|Wikis"
msgstr ""
@@ -36445,7 +36953,10 @@ msgstr ""
msgid "User Settings"
msgstr ""
-msgid "User and IP Rate Limits"
+msgid "User and IP rate limits"
+msgstr ""
+
+msgid "User does not have a pending request"
msgstr ""
msgid "User identity was successfully created."
@@ -36742,6 +37253,9 @@ msgstr ""
msgid "Users can launch a development environment from a GitLab browser tab when the %{linkStart}Gitpod%{linkEnd} integration is enabled."
msgstr ""
+msgid "Users can reactivate their account by signing in."
+msgstr ""
+
msgid "Users can render diagrams in AsciiDoc, Markdown, reStructuredText, and Textile documents using Kroki."
msgstr ""
@@ -36757,6 +37271,9 @@ msgstr ""
msgid "Users requesting access to"
msgstr ""
+msgid "Users to exclude from the rate limit"
+msgstr ""
+
msgid "Users were successfully added."
msgstr ""
@@ -36778,6 +37295,9 @@ msgstr ""
msgid "UsersSelect|Unassigned"
msgstr ""
+msgid "Uses GitLab as a lightweight alternative to Sentry."
+msgstr ""
+
msgid "Using %{code_start}::%{code_end} denotes a %{link_start}scoped label set%{link_end}"
msgstr ""
@@ -36808,10 +37328,7 @@ msgstr ""
msgid "Value Stream Analytics can help you determine your team’s velocity"
msgstr ""
-msgid "Value Stream Analytics gives an overview of how much time it takes to go from idea to production in your project."
-msgstr ""
-
-msgid "Value may contain a variable reference"
+msgid "Value might contain a variable reference"
msgstr ""
msgid "Value stream"
@@ -36877,10 +37394,10 @@ msgstr ""
msgid "ValueStream|The Default Value Stream cannot be deleted"
msgstr ""
-msgid "Variable"
+msgid "Values that contain the %{codeStart}$%{codeEnd} character can be considered a variable reference and expanded. %{docsLinkStart}Learn more.%{docsLinkEnd}"
msgstr ""
-msgid "Variable references indicated by %{codeStart}$%{codeEnd} may be expanded. If this is not what you want, consider %{docsLinkStart}using a workaround to prevent expansion%{docsLinkEnd}."
+msgid "Variable"
msgstr ""
msgid "Variable will be masked in job logs."
@@ -37285,6 +37802,9 @@ msgstr ""
msgid "Vulnerability|Evidence"
msgstr ""
+msgid "Vulnerability|False positive detected"
+msgstr ""
+
msgid "Vulnerability|File"
msgstr ""
@@ -37327,6 +37847,9 @@ msgstr ""
msgid "Vulnerability|Status"
msgstr ""
+msgid "Vulnerability|The scanner determined this vulnerability to be a false positive. Verify the evaluation before changing its status. %{linkStart}Learn more about false positive detection.%{linkEnd}"
+msgstr ""
+
msgid "Vulnerability|The unmodified response is the original response that had no mutations done to the request"
msgstr ""
@@ -37651,9 +38174,6 @@ msgstr ""
msgid "Welcome to GitLab,%{br_tag}%{name}!"
msgstr ""
-msgid "Welcome to the guided GitLab tour"
-msgstr ""
-
msgid "Welcome, %{name}!"
msgstr ""
@@ -37672,9 +38192,6 @@ msgstr ""
msgid "What are you searching for?"
msgstr ""
-msgid "What describes you best?"
-msgstr ""
-
msgid "What does this command do?"
msgstr ""
@@ -37696,13 +38213,13 @@ msgstr ""
msgid "What is your job title? (optional)"
msgstr ""
-msgid "What will you use this group for?"
+msgid "What templates can I create?"
msgstr ""
-msgid "What's new"
+msgid "What will you use this group for?"
msgstr ""
-msgid "What’s your experience level?"
+msgid "What's new"
msgstr ""
msgid "When a deployment job is successful, skip older deployment jobs that are still pending."
@@ -37714,6 +38231,9 @@ msgstr ""
msgid "When an event in GitLab triggers a webhook, you can use the request details to figure out if something went wrong."
msgstr ""
+msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+msgstr ""
+
msgid "When inactive, an external authentication provider must be used."
msgstr ""
@@ -37737,6 +38257,9 @@ msgstr ""
msgid "When:"
msgstr ""
+msgid "Which API requests are affected?"
+msgstr ""
+
msgid "While it's rare to have no vulnerabilities, it can happen. In any event, we ask that you please double check your settings to make sure you've set up your dashboard correctly."
msgstr ""
@@ -38016,6 +38539,9 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|Work Items"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -38091,6 +38617,9 @@ msgstr ""
msgid "You are already a member of this %{member_source}."
msgstr ""
+msgid "You are already impersonating another user"
+msgstr ""
+
msgid "You are an admin, which means granting access to %{client_name} will allow them to interact with GitLab as an admin as well. Proceed with caution."
msgstr ""
@@ -38193,6 +38722,9 @@ msgstr ""
msgid "You can also use project access tokens with Git to authenticate over HTTP(S). %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "You can always change your URL later"
+msgstr ""
+
msgid "You can always edit this later"
msgstr ""
@@ -38349,10 +38881,10 @@ msgstr ""
msgid "You can’t %{tag_start}edit%{tag_end} files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
-msgid "You could not create a new trigger."
+msgid "You can’t edit files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
-msgid "You didn't renew your subscription for %{strong}%{namespace_name}%{strong_close} so it was downgraded to the free plan."
+msgid "You could not create a new trigger."
msgstr ""
msgid "You do not have any subscriptions yet"
@@ -38520,6 +39052,12 @@ msgstr ""
msgid "You must provide your current password in order to change it."
msgstr ""
+msgid "You must sign in to search for specific projects."
+msgstr ""
+
+msgid "You must sign in to search for specific terms."
+msgstr ""
+
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
@@ -38547,6 +39085,9 @@ msgstr ""
msgid "You need to upload a GitLab project export archive (ending in .gz)."
msgstr ""
+msgid "You need to verify your primary email first before enabling Two-Factor Authentication."
+msgstr ""
+
msgid "You successfully declined the invitation"
msgstr ""
@@ -38655,10 +39196,10 @@ msgstr ""
msgid "Your %{host} account was signed in to from a new location"
msgstr ""
-msgid "Your %{strong}%{plan_name}%{strong_close} subscription for %{strong}%{namespace_name}%{strong_close} will expire on %{strong}%{expires_on}%{strong_close}."
+msgid "Your %{strong}%{plan_name}%{strong_close} subscription expires on %{strong}%{expires_on}%{strong_close}. After that date, you cannot create issues or merge requests, or use many other features."
msgstr ""
-msgid "Your %{strong}%{plan_name}%{strong_close} subscription will expire on %{strong}%{expires_on}%{strong_close}. After that, you will not be able to create issues or merge requests as well as many other features."
+msgid "Your %{strong}%{plan_name}%{strong_close} subscription for %{strong}%{namespace_name}%{strong_close} will expire on %{strong}%{expires_on}%{strong_close}."
msgstr ""
msgid "Your CI/CD configuration syntax is invalid. View Lint tab for more details."
@@ -38682,7 +39223,7 @@ msgstr ""
msgid "Your GPG keys (%{count})"
msgstr ""
-msgid "Your GitLab account has been locked due to an excessive amount of unsuccessful sign in attempts. Your account will automatically unlock in %{duration} or you may click the link below to unlock now."
+msgid "Your GitLab account has been locked due to an excessive number of unsuccessful sign in attempts. You can wait for your account to automatically unlock in %{duration} or you can click the link below to unlock now."
msgstr ""
msgid "Your GitLab account request has been approved!"
@@ -38793,6 +39334,9 @@ msgstr ""
msgid "Your commit email is used for web based operations, such as edits and merges."
msgstr ""
+msgid "Your current password is required to register a two-factor authenticator app."
+msgstr ""
+
msgid "Your dashboard has been copied. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
@@ -38892,6 +39436,9 @@ msgstr ""
msgid "Your project limit is %{limit} projects! Please contact your administrator to increase it"
msgstr ""
+msgid "Your project will be created at:"
+msgstr ""
+
msgid "Your projects"
msgstr ""
@@ -38931,11 +39478,10 @@ msgstr ""
msgid "Your subscription expired!"
msgstr ""
-msgid "Your subscription has been downgraded."
-msgstr ""
-
-msgid "Your subscription will expire in %{remaining_days}."
-msgstr ""
+msgid "Your subscription will expire in %{remaining_days} day."
+msgid_plural "Your subscription will expire in %{remaining_days} days."
+msgstr[0] ""
+msgstr[1] ""
msgid "Your username is %{username}."
msgstr ""
@@ -39142,6 +39688,9 @@ msgstr ""
msgid "cannot merge"
msgstr ""
+msgid "cannot not be used for user namespace"
+msgstr ""
+
msgid "ciReport|%{degradedNum} degraded"
msgstr ""
@@ -39465,6 +40014,9 @@ msgstr ""
msgid "created %{timeAgo}"
msgstr ""
+msgid "created %{timeAgo} by %{author}"
+msgstr ""
+
msgid "created by"
msgstr ""
@@ -39509,9 +40061,6 @@ msgstr ""
msgid "does not have a supported extension. Only %{extension_list} are supported"
msgstr ""
-msgid "domain is not authorized for sign-up."
-msgstr ""
-
msgid "download it"
msgstr ""
@@ -39529,18 +40078,13 @@ msgstr ""
msgid "email '%{email}' is not a verified email."
msgstr ""
-msgid "email does not match the allowed domain of %{email_domains}"
-msgid_plural "email does not match the allowed domains: %{email_domains}"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "enabled"
msgstr ""
msgid "encrypted: needs to be a :required, :optional or :migrating!"
msgstr ""
-msgid "ending with MIME type format is not allowed."
+msgid "ending with a reserved file extension is not allowed."
msgstr ""
msgid "entries cannot be larger than 255 characters"
@@ -39564,6 +40108,9 @@ msgstr ""
msgid "estimateCommand|%{slash_command} overwrites the total estimated time."
msgstr ""
+msgid "example.com"
+msgstr ""
+
msgid "exceeds the limit of %{bytes} bytes"
msgstr ""
@@ -39614,9 +40161,6 @@ msgstr ""
msgid "fork"
msgstr ""
-msgid "fork this project"
-msgstr ""
-
msgid "from"
msgstr ""
@@ -39625,6 +40169,9 @@ msgid_plural "from %d jobs"
msgstr[0] ""
msgstr[1] ""
+msgid "frontmatter"
+msgstr ""
+
msgid "group"
msgstr ""
@@ -39652,6 +40199,9 @@ msgstr ""
msgid "has been completed."
msgstr ""
+msgid "has too deep level of nesting"
+msgstr ""
+
msgid "help"
msgstr ""
@@ -39685,9 +40235,21 @@ msgstr ""
msgid "in"
msgstr ""
+msgid "in Infrastructure :: Kubernetes clusters"
+msgstr ""
+
+msgid "in all GitLab"
+msgstr ""
+
+msgid "in group"
+msgstr ""
+
msgid "in group %{link_to_group}"
msgstr ""
+msgid "in project"
+msgstr ""
+
msgid "in project %{link_to_project}"
msgstr ""
@@ -39729,16 +40291,19 @@ msgstr ""
msgid "is not a valid X509 certificate."
msgstr ""
-msgid "is not allowed since the group is not top-level group."
+msgid "is not allowed for sign-up."
msgstr ""
-msgid "is not allowed. Try again with a different email address, or contact your GitLab admin."
+msgid "is not allowed for this group."
msgstr ""
-msgid "is not allowed. We do not currently support project-level iterations"
+msgid "is not allowed for this project."
+msgstr ""
+
+msgid "is not allowed since the group is not top-level group."
msgstr ""
-msgid "is not from an allowed domain."
+msgid "is not allowed. We do not currently support project-level iterations"
msgstr ""
msgid "is not in the group enforcing Group Managed Account"
@@ -39831,6 +40396,9 @@ msgstr ""
msgid "log in"
msgstr ""
+msgid "managed"
+msgstr ""
+
msgid "manual"
msgstr ""
@@ -39878,6 +40446,9 @@ msgstr ""
msgid "mrWidget| Please restore it or use a different %{missingBranchName} branch"
msgstr ""
+msgid "mrWidget|%{linkStart}Set up now%{linkEnd} to analyze your source code for known security vulnerabilities."
+msgstr ""
+
msgid "mrWidget|%{mergeError}."
msgstr ""
@@ -39958,6 +40529,9 @@ msgid_plural "mrWidget|Closes issues"
msgstr[0] ""
msgstr[1] ""
+msgid "mrWidget|Create issue to resolve all threads"
+msgstr ""
+
msgid "mrWidget|Delete source branch"
msgstr ""
@@ -39967,12 +40541,18 @@ msgstr ""
msgid "mrWidget|Did not close"
msgstr ""
+msgid "mrWidget|Dismiss"
+msgstr ""
+
msgid "mrWidget|Email patches"
msgstr ""
msgid "mrWidget|Failed to load deployment statistics"
msgstr ""
+msgid "mrWidget|Hide %{widget} details"
+msgstr ""
+
msgid "mrWidget|If the %{missingBranchName} branch exists in your local repository, you can merge this merge request manually using the command line"
msgstr ""
@@ -40068,9 +40648,6 @@ msgstr ""
msgid "mrWidget|Request to merge"
msgstr ""
-msgid "mrWidget|Resolve all threads in new issue"
-msgstr ""
-
msgid "mrWidget|Resolve conflicts"
msgstr ""
@@ -40086,6 +40663,9 @@ msgstr ""
msgid "mrWidget|Revoke approval"
msgstr ""
+msgid "mrWidget|SAST and Secret Detection is not enabled."
+msgstr ""
+
msgid "mrWidget|Set by %{merge_author} to be added to the merge train when the pipeline succeeds"
msgstr ""
@@ -40095,6 +40675,9 @@ msgstr ""
msgid "mrWidget|Set by %{merge_author} to start a merge train when the pipeline succeeds"
msgstr ""
+msgid "mrWidget|Show %{widget} details"
+msgstr ""
+
msgid "mrWidget|The changes were merged into"
msgstr ""
@@ -40107,6 +40690,9 @@ msgstr ""
msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure, or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
msgstr ""
+msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure."
+msgstr ""
+
msgid "mrWidget|The source branch has been deleted"
msgstr ""
@@ -40149,6 +40735,9 @@ msgstr ""
msgid "mrWidget|You can merge after removing denied licenses"
msgstr ""
+msgid "mrWidget|You can only merge once this merge request is approved."
+msgstr ""
+
msgid "mrWidget|Your password"
msgstr ""
@@ -40185,6 +40774,9 @@ msgstr ""
msgid "must be less than the limit of %{tag_limit} tags"
msgstr ""
+msgid "must be set for a project namespace"
+msgstr ""
+
msgid "must be unique by status and elapsed time within a policy"
msgstr ""
@@ -40294,6 +40886,9 @@ msgstr ""
msgid "pipeline"
msgstr ""
+msgid "pipeline schedules documentation"
+msgstr ""
+
msgid "pod_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
msgstr ""
@@ -40343,16 +40938,25 @@ msgstr ""
msgid "project name"
msgstr ""
+msgid "project namespace cannot be the parent of another namespace"
+msgstr ""
+
msgid "projects"
msgstr ""
msgid "quick actions"
msgstr ""
-msgid "reCAPTCHA Private Key"
+msgid "reCAPTCHA"
+msgstr ""
+
+msgid "reCAPTCHA helps prevent credential stuffing."
msgstr ""
-msgid "reCAPTCHA Site Key"
+msgid "reCAPTCHA private key"
+msgstr ""
+
+msgid "reCAPTCHA site key"
msgstr ""
msgid "recent activity"
@@ -40579,6 +41183,9 @@ msgstr ""
msgid "user avatar"
msgstr ""
+msgid "user namespace cannot be the parent of another namespace"
+msgstr ""
+
msgid "user preferences"
msgstr ""
@@ -40671,3 +41278,9 @@ msgstr ""
msgid "your settings"
msgstr ""
+msgid "{group}"
+msgstr ""
+
+msgid "{project}"
+msgstr ""
+
diff --git a/locale/ba_RU/gitlab.po b/locale/ba_RU/gitlab.po
index 11f5e2aab67..ffb21ba1f3f 100644
--- a/locale/ba_RU/gitlab.po
+++ b/locale/ba_RU/gitlab.po
@@ -14,10 +14,7 @@ msgstr ""
"X-Crowdin-Language: ba\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-09-01 22:31\n"
-
-msgid " %{name}, confirm your email address now! "
-msgstr ""
+"PO-Revision-Date: 2021-10-04 20:19\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -90,6 +87,14 @@ msgstr ""
msgid "#general, #development"
msgstr ""
+msgid "%d Alert"
+msgid_plural "%d Alerts"
+msgstr[0] ""
+
+msgid "%d Alert:"
+msgid_plural "%d Alerts:"
+msgstr[0] ""
+
msgid "%d Approval"
msgid_plural "%d Approvals"
msgstr[0] ""
@@ -387,7 +392,10 @@ msgstr ""
msgid "%{code_open}Protected:%{code_close} Only exposed to protected branches or tags."
msgstr ""
-msgid "%{commit_author_link} authored %{commit_timeago}"
+msgid "%{commit_author_link} authored %{commit_authored_timeago}"
+msgstr ""
+
+msgid "%{commit_author_link} authored %{commit_authored_timeago} and %{commit_committer_avatar} %{commit_committer_link} committed %{commit_committer_timeago}"
msgstr ""
msgid "%{completedCount} completed weight"
@@ -476,6 +484,15 @@ msgstr ""
msgid "%{doc_link_start}Advanced search%{doc_link_end} is enabled."
msgstr ""
+msgid "%{docs_link_start}Learn about visibility levels.%{docs_link_end}"
+msgstr ""
+
+msgid "%{docs_link_start}What is Large File Storage?%{docs_link_end}"
+msgstr ""
+
+msgid "%{docs_link_start}What is two-factor authentication?%{docs_link_end}"
+msgstr ""
+
msgid "%{due_date} (Past due)"
msgstr ""
@@ -548,9 +565,6 @@ msgstr ""
msgid "%{issueType} actions"
msgstr ""
-msgid "%{issuesCount} issues with a limit of %{maxIssueCount}"
-msgstr ""
-
msgid "%{issuesSize} with a limit of %{maxIssueCount}"
msgstr ""
@@ -608,6 +622,12 @@ msgstr ""
msgid "%{label_for_message} unavailable"
msgstr ""
+msgid "%{learn_more_link}."
+msgstr ""
+
+msgid "%{lessThan} 1 hour"
+msgstr ""
+
msgid "%{lets_encrypt_link_start}Let's Encrypt%{lets_encrypt_link_end} is a free, automated, and open certificate authority (CA) that issues digital certificates to enable HTTPS (SSL/TLS) for sites."
msgstr ""
@@ -620,15 +640,15 @@ msgstr ""
msgid "%{link_start}Learn more%{link_end} about roles."
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
-msgstr ""
-
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
msgstr ""
msgid "%{link_start}Start the title with %{draft_snippet}%{link_end} to prevent a merge request that is a work in progress from being merged before it's ready."
msgstr ""
+msgid "%{link_start}What information does GitLab Inc. collect?%{link_end}"
+msgstr ""
+
msgid "%{listToShow}, and %{awardsListLength} more"
msgstr ""
@@ -777,7 +797,7 @@ msgid "%{securityScanner} result is not available because a pipeline has not bee
msgid_plural "%{securityScanner} results are not available because a pipeline has not been run since it was enabled. %{linkStart}Run a pipeline%{linkEnd}"
msgstr[0] ""
-msgid "%{service_ping_link_start}Learn more%{service_ping_link_end} about what information is shared with GitLab Inc."
+msgid "%{service_ping_link_start}What information is shared with GitLab Inc.?%{service_ping_link_end}"
msgstr ""
msgid "%{size} %{unit}"
@@ -813,6 +833,9 @@ msgstr ""
msgid "%{state} epics"
msgstr ""
+msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
+msgstr ""
+
msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
msgstr ""
@@ -865,10 +888,6 @@ msgstr ""
msgid "%{template_project_id} is unknown or invalid"
msgstr ""
-msgid "%{text} %{files}"
-msgid_plural "%{text} %{files} files"
-msgstr[0] ""
-
msgid "%{text} is available"
msgstr ""
@@ -953,9 +972,6 @@ msgstr ""
msgid "%{wildcards_link_start}Wildcards%{wildcards_link_end} such as %{code_tag_start}v*%{code_tag_end} or %{code_tag_start}*-release%{code_tag_end} are supported."
msgstr ""
-msgid "&lt; 1 hour"
-msgstr ""
-
msgid "'%{data}' at %{location} does not match format: %{format}"
msgstr ""
@@ -1038,9 +1054,6 @@ msgstr ""
msgid "(we need your current password to confirm your changes)"
msgstr ""
-msgid "* * * * *"
-msgstr ""
-
msgid "+ %{amount} more"
msgstr ""
@@ -1104,10 +1117,10 @@ msgstr ""
msgid "."
msgstr ""
-msgid "0 bytes"
+msgid "/"
msgstr ""
-msgid "0 for unlimited, only effective with remote storage enabled."
+msgid "0 bytes"
msgstr ""
msgid "0t1DgySidms"
@@ -1214,6 +1227,9 @@ msgstr ""
msgid "1000+"
msgstr ""
+msgid "192.168.0.0/24"
+msgstr ""
+
msgid "1st contribution!"
msgstr ""
@@ -1367,9 +1383,6 @@ msgstr ""
msgid "A plain HTML site that uses Netlify for CI/CD instead of GitLab, but still with all the other great GitLab features"
msgstr ""
-msgid "A plain-text response to show to clients that hit the rate limit."
-msgstr ""
-
msgid "A platform value can be web, mob or app."
msgstr ""
@@ -1451,7 +1464,7 @@ msgstr ""
msgid "APIFuzzing|Configure HTTP basic authentication values. Other authentication methods are supported. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
+msgid "APIFuzzing|Customize your project's API fuzzing configuration options and copy the code snippet to your .gitlab-ci.yml file to apply any changes. Note that this tool does not reflect or update your .gitlab-ci.yml file automatically. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
msgstr ""
msgid "APIFuzzing|Enable authentication"
@@ -1514,9 +1527,6 @@ msgstr ""
msgid "APIFuzzing|To prevent a security leak, authentication info must be added as a %{ciVariablesLinkStart}CI variable%{ciVariablesLinkEnd}. As a user with maintainer access rights, you can manage CI variables in the %{ciSettingsLinkStart}Settings%{ciSettingsLinkEnd} area."
msgstr ""
-msgid "APIFuzzing|Use this tool to generate API fuzzing configuration YAML to copy into your .gitlab-ci.yml file. This tool does not reflect or update your .gitlab-ci.yml file automatically."
-msgstr ""
-
msgid "APIFuzzing|Username for basic authentication"
msgstr ""
@@ -1568,9 +1578,6 @@ msgstr ""
msgid "Abuse reports notification email"
msgstr ""
-msgid "Abuse reports will be sent to this address if it is set. Abuse reports are always available in the admin area."
-msgstr ""
-
msgid "Accept invitation"
msgstr ""
@@ -1607,12 +1614,18 @@ msgstr ""
msgid "Access granted"
msgstr ""
+msgid "Access key ID"
+msgstr ""
+
msgid "Access requests"
msgstr ""
msgid "Access to '%{classification_label}' not allowed"
msgstr ""
+msgid "Access tokens expire after 2 hours. A refresh token may be used at any time to generate a new access token. Non-expiring access tokens are deprecated. Clear this setting to enable backward compatibility."
+msgstr ""
+
msgid "AccessDropdown|Deploy Keys"
msgstr ""
@@ -1925,6 +1938,9 @@ msgstr ""
msgid "Add new directory"
msgstr ""
+msgid "Add new service account"
+msgstr ""
+
msgid "Add or remove previously merged commits"
msgstr ""
@@ -2162,6 +2178,9 @@ msgstr ""
msgid "AdminArea|Features"
msgstr ""
+msgid "AdminArea|Get security updates from GitLab and stay up to date"
+msgstr ""
+
msgid "AdminArea|Groups"
msgstr ""
@@ -2201,6 +2220,12 @@ msgstr ""
msgid "AdminArea|Reporter"
msgstr ""
+msgid "AdminArea|Sign up for the GitLab Security Newsletter to get notified for security updates."
+msgstr ""
+
+msgid "AdminArea|Sign up for the GitLab newsletter"
+msgstr ""
+
msgid "AdminArea|Stop all jobs"
msgstr ""
@@ -2270,9 +2295,15 @@ msgstr ""
msgid "AdminSettings|Disable public access to Pages sites"
msgstr ""
+msgid "AdminSettings|Display a banner on merge requests in projects with no pipelines to initiate steps to add a .gitlab-ci.yml file."
+msgstr ""
+
msgid "AdminSettings|Domain verification is an essential security measure for public GitLab sites. Users are required to demonstrate they control a domain before it is enabled. %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "AdminSettings|Enable pipeline suggestion banner"
+msgstr ""
+
msgid "AdminSettings|Enable shared runners for new projects"
msgstr ""
@@ -2744,10 +2775,10 @@ msgstr ""
msgid "Admin|Quarterly reconciliation will occur on %{qrtlyDate}"
msgstr ""
-msgid "Admin|The number of max seats used for your namespace is currently exceeding the number of seats in your subscription. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgid "Admin|The number of max seats in your namespace exceeds the number of seats in your subscription. On %{qrtlyDate}, quarterly reconciliation occurs and you are automatically billed a prorated amount for the overage. No action is needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice. For more information about the timing of the invoicing process, view the documentation."
msgstr ""
-msgid "Admin|The number of maximum users for your instance is currently exceeding the number of users in license. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgid "Admin|The number of max users in your instance exceeds the number of users in your license. On %{qrtlyDate}, quarterly reconciliation occurs and you are automatically billed a prorated amount for the overage. No action is needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice. For more information about the timing of the invoicing process, view the documentation."
msgstr ""
msgid "Admin|View pending user approvals"
@@ -2768,9 +2799,6 @@ msgstr ""
msgid "Advanced export options"
msgstr ""
-msgid "Advanced permissions, Large File Storage and Two-Factor authentication settings."
-msgstr ""
-
msgid "After a successful password update you will be redirected to login screen."
msgstr ""
@@ -2789,12 +2817,14 @@ msgstr ""
msgid "After you've reviewed these contribution guidelines, you'll be all set to"
msgstr ""
+msgid "Akismet"
+msgstr ""
+
msgid "Akismet API Key"
msgstr ""
-msgid "Alert"
-msgid_plural "Alerts"
-msgstr[0] ""
+msgid "Akismet helps prevent the creation of spam issues in public projects."
+msgstr ""
msgid "AlertManagement|Acknowledged"
msgstr ""
@@ -3150,6 +3180,9 @@ msgstr ""
msgid "All (default)"
msgstr ""
+msgid "All GitLab"
+msgstr ""
+
msgid "All Members"
msgstr ""
@@ -3264,6 +3297,9 @@ msgstr ""
msgid "Allow this secondary node to replicate content on Object Storage"
msgstr ""
+msgid "Allow use of licensed EE features"
+msgstr ""
+
msgid "Allow users to dismiss the broadcast message"
msgstr ""
@@ -3339,9 +3375,6 @@ msgstr ""
msgid "Amazon authentication is not %{link_start}correctly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
-msgid "Amount of time (in hours) that users are allowed to skip forced configuration of two-factor authentication"
-msgstr ""
-
msgid "An %{link_start}alert%{link_end} with the same fingerprint is already open. To change the status of this alert, resolve the linked alert."
msgstr ""
@@ -3402,12 +3435,6 @@ msgstr ""
msgid "An error occurred when removing the label."
msgstr ""
-msgid "An error occurred when toggling the notification subscription"
-msgstr ""
-
-msgid "An error occurred when updating the issue weight"
-msgstr ""
-
msgid "An error occurred when updating the title"
msgstr ""
@@ -3456,6 +3483,9 @@ msgstr ""
msgid "An error occurred while enabling Service Desk."
msgstr ""
+msgid "An error occurred while fetching Markdown preview"
+msgstr ""
+
msgid "An error occurred while fetching ancestors"
msgstr ""
@@ -3486,9 +3516,6 @@ msgstr ""
msgid "An error occurred while fetching label colors."
msgstr ""
-msgid "An error occurred while fetching markdown preview"
-msgstr ""
-
msgid "An error occurred while fetching participants"
msgstr ""
@@ -3504,9 +3531,6 @@ msgstr ""
msgid "An error occurred while fetching reference"
msgstr ""
-msgid "An error occurred while fetching sidebar data"
-msgstr ""
-
msgid "An error occurred while fetching tags. Retry the search."
msgstr ""
@@ -3582,6 +3606,9 @@ msgstr ""
msgid "An error occurred while loading merge requests."
msgstr ""
+msgid "An error occurred while loading projects."
+msgstr ""
+
msgid "An error occurred while loading the Needs tab."
msgstr ""
@@ -3816,12 +3843,6 @@ msgstr ""
msgid "Any Milestone"
msgstr ""
-msgid "Any branch"
-msgstr ""
-
-msgid "Any eligible user"
-msgstr ""
-
msgid "Any encrypted tokens"
msgstr ""
@@ -3840,6 +3861,9 @@ msgstr ""
msgid "Any namespace"
msgstr ""
+msgid "App Engine description and apps that are suitable for this deployment target"
+msgstr ""
+
msgid "App ID"
msgstr ""
@@ -3986,6 +4010,10 @@ msgstr ""
msgid "Apply"
msgstr ""
+msgid "Apply %d suggestion"
+msgid_plural "Apply %d suggestions"
+msgstr[0] ""
+
msgid "Apply a label"
msgstr ""
@@ -3995,13 +4023,10 @@ msgstr ""
msgid "Apply suggestion"
msgstr ""
-msgid "Apply suggestions"
-msgstr ""
-
msgid "Apply template"
msgstr ""
-msgid "Apply this approval rule to any branch or a specific protected branch."
+msgid "Apply this approval rule to all branches or a specific protected branch."
msgstr ""
msgid "Applying"
@@ -4140,9 +4165,6 @@ msgstr ""
msgid "ApprovalSettings|Prevent editing approval rules in projects and merge requests."
msgstr ""
-msgid "ApprovalSettings|Prevent editing approval rules in projects and merge requests. "
-msgstr ""
-
msgid "ApprovalSettings|Remove all approvals when commits are added to the source branch."
msgstr ""
@@ -4158,6 +4180,9 @@ msgstr ""
msgid "ApprovalSettings|This setting is configured at the instance level and can only be changed by an administrator."
msgstr ""
+msgid "ApprovalSettings|This setting is configured in %{groupName} and can only be changed by an administrator or group owner."
+msgstr ""
+
msgid "ApprovalStatusTooltip|Adheres to separation of duties"
msgstr ""
@@ -4641,9 +4666,6 @@ msgstr ""
msgid "Authenticated API rate limit period in seconds"
msgstr ""
-msgid "Authenticated API request rate limit"
-msgstr ""
-
msgid "Authenticated API requests"
msgstr ""
@@ -4653,10 +4675,10 @@ msgstr ""
msgid "Authenticated Git LFS request rate limit"
msgstr ""
-msgid "Authenticated web rate limit period in seconds"
+msgid "Authenticated Git LFS requests"
msgstr ""
-msgid "Authenticated web request rate limit"
+msgid "Authenticated web rate limit period in seconds"
msgstr ""
msgid "Authenticated web requests"
@@ -5034,9 +5056,6 @@ msgstr ""
msgid "Below you will find all the groups that are public."
msgstr ""
-msgid "Beta"
-msgstr ""
-
msgid "Bi-weekly code coverage"
msgstr ""
@@ -5275,6 +5294,21 @@ msgstr ""
msgid "Board scope affects which issues are displayed for anyone who visits this board"
msgstr ""
+msgid "BoardNewEpic|Groups"
+msgstr ""
+
+msgid "BoardNewEpic|Loading groups"
+msgstr ""
+
+msgid "BoardNewEpic|No matching results"
+msgstr ""
+
+msgid "BoardNewEpic|Search groups"
+msgstr ""
+
+msgid "BoardNewEpic|Select a group"
+msgstr ""
+
msgid "BoardNewIssue|No matching results"
msgstr ""
@@ -5351,6 +5385,9 @@ msgstr ""
msgid "Boards|An error occurred while creating the list. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching child groups. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching group projects. Please try again."
msgstr ""
@@ -5682,6 +5719,9 @@ msgstr ""
msgid "Bulk update"
msgstr ""
+msgid "BulkImports|Re-import creates a new group. It does not sync with the existing group."
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -5691,6 +5731,9 @@ msgstr ""
msgid "BulkImport|From source group"
msgstr ""
+msgid "BulkImport|Group import history"
+msgstr ""
+
msgid "BulkImport|Import failed: Destination cannot be a subgroup of the source group. Change the destination and try again."
msgstr ""
@@ -5703,9 +5746,18 @@ msgstr ""
msgid "BulkImport|Importing the group failed"
msgstr ""
+msgid "BulkImport|Last imported to %{link}"
+msgstr ""
+
msgid "BulkImport|Name already exists."
msgstr ""
+msgid "BulkImport|New group"
+msgstr ""
+
+msgid "BulkImport|No history is available"
+msgstr ""
+
msgid "BulkImport|No parent"
msgstr ""
@@ -5718,6 +5770,9 @@ msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} matching filter \"%{filter}\" from %{link}"
msgstr ""
+msgid "BulkImport|Source group"
+msgstr ""
+
msgid "BulkImport|To new group"
msgstr ""
@@ -5727,6 +5782,9 @@ msgstr ""
msgid "BulkImport|You have no groups to import"
msgstr ""
+msgid "BulkImport|Your imported groups will appear here."
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -5968,6 +6026,9 @@ msgstr ""
msgid "Can be manually deployed to"
msgstr ""
+msgid "Can be overridden in each project."
+msgstr ""
+
msgid "Can create groups:"
msgstr ""
@@ -6070,6 +6131,9 @@ msgstr ""
msgid "Cancelling Preview"
msgstr ""
+msgid "Cannot assign a confidential epic to a non-confidential issue. Make the issue confidential and try again"
+msgstr ""
+
msgid "Cannot be assigned to other projects."
msgstr ""
@@ -6121,9 +6185,6 @@ msgstr ""
msgid "Cannot refer to a group %{timebox_type} by an internal id!"
msgstr ""
-msgid "Cannot set confidential epic for a non-confidential issue"
-msgstr ""
-
msgid "Cannot show preview. For previews on sketch files, they must have the file format introduced by Sketch version 43 and above."
msgstr ""
@@ -6361,15 +6422,15 @@ msgstr ""
msgid "Check out, review, and merge locally"
msgstr ""
-msgid "Check the %{docs_link_start}documentation%{docs_link_end}."
-msgstr ""
-
msgid "Check the current instance configuration "
msgstr ""
msgid "Check the elasticsearch.log file to debug why the migration was halted and make any changes before retrying the migration. When you fix the cause of the failure, click \"Retry migration\", and the migration will be scheduled to be retried in the background."
msgstr ""
+msgid "Check with your administrator."
+msgstr ""
+
msgid "Check your Docker images for known vulnerabilities."
msgstr ""
@@ -6400,6 +6461,9 @@ msgstr ""
msgid "Checkout"
msgstr ""
+msgid "Checkout|$%{selectedPlanPrice} per 10 GB storage per pack"
+msgstr ""
+
msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 minutes"
msgstr ""
@@ -6419,16 +6483,22 @@ msgstr ""
msgid "Checkout|%{name}'s GitLab subscription"
msgstr ""
-msgid "Checkout|%{selectedPlanText} plan"
+msgid "Checkout|%{name}'s storage subscription"
msgstr ""
-msgid "Checkout|%{startDate} - %{endDate}"
+msgid "Checkout|%{quantity} GB of storage"
msgstr ""
-msgid "Checkout|%{totalCiMinutes} CI minute"
-msgid_plural "Checkout|%{totalCiMinutes} CI minutes"
+msgid "Checkout|%{quantity} storage pack"
+msgid_plural "Checkout|%{quantity} storage packs"
msgstr[0] ""
+msgid "Checkout|%{selectedPlanText} plan"
+msgstr ""
+
+msgid "Checkout|%{startDate} - %{endDate}"
+msgstr ""
+
msgid "Checkout|%{totalCiMinutes} CI minutes"
msgstr ""
@@ -6504,6 +6574,9 @@ msgstr ""
msgid "Checkout|Failed to register credit card. Please try again."
msgstr ""
+msgid "Checkout|GB"
+msgstr ""
+
msgid "Checkout|GitLab group"
msgstr ""
@@ -6540,6 +6613,9 @@ msgstr ""
msgid "Checkout|State"
msgstr ""
+msgid "Checkout|Storage packs"
+msgstr ""
+
msgid "Checkout|Street address"
msgstr ""
@@ -6561,6 +6637,9 @@ msgstr ""
msgid "Checkout|Total minutes: %{quantity}"
msgstr ""
+msgid "Checkout|Total storage: %{quantity} GB"
+msgstr ""
+
msgid "Checkout|Users"
msgstr ""
@@ -6570,16 +6649,25 @@ msgstr ""
msgid "Checkout|Your organization"
msgstr ""
+msgid "Checkout|Your storage subscription has the same term as your main subscription, and the price is prorated accordingly."
+msgstr ""
+
msgid "Checkout|Your subscription will be applied to this group"
msgstr ""
msgid "Checkout|Zip code"
msgstr ""
+msgid "Checkout|a storage subscription"
+msgstr ""
+
msgid "Checkout|company or team"
msgstr ""
-msgid "Checkout|x 1,000 minutes per pack = %{strong}"
+msgid "Checkout|minutes"
+msgstr ""
+
+msgid "Checkout|x %{quantity} %{units} per pack ="
msgstr ""
msgid "Cherry-pick this commit"
@@ -6936,6 +7024,9 @@ msgstr ""
msgid "CloneIssue|Cannot clone issue to target project as it is pending deletion."
msgstr ""
+msgid "CloneIssue|Cannot clone issues of '%{issue_type}' type."
+msgstr ""
+
msgid "Cloned this issue to %{path_to_project}."
msgstr ""
@@ -6990,7 +7081,10 @@ msgstr ""
msgid "Closes this %{quick_action_target}."
msgstr ""
-msgid "Cloud licenses can not be removed."
+msgid "Cloud Functions description and apps that are suitable for this deployment target"
+msgstr ""
+
+msgid "Cloud Run description and apps that are suitable for this deployment target"
msgstr ""
msgid "Cluster"
@@ -7017,6 +7111,12 @@ msgstr ""
msgid "ClusterAgents|Access tokens"
msgstr ""
+msgid "ClusterAgents|Agent might not be connected to GitLab"
+msgstr ""
+
+msgid "ClusterAgents|Agent never connected to GitLab"
+msgstr ""
+
msgid "ClusterAgents|Alternative installation methods"
msgstr ""
@@ -7032,6 +7132,12 @@ msgstr ""
msgid "ClusterAgents|Configuration"
msgstr ""
+msgid "ClusterAgents|Connected"
+msgstr ""
+
+msgid "ClusterAgents|Connection status"
+msgstr ""
+
msgid "ClusterAgents|Copy token"
msgstr ""
@@ -7050,6 +7156,9 @@ msgstr ""
msgid "ClusterAgents|For alternative installation methods %{linkStart}go to the documentation%{linkEnd}."
msgstr ""
+msgid "ClusterAgents|For more troubleshooting information go to"
+msgstr ""
+
msgid "ClusterAgents|Go to the repository"
msgstr ""
@@ -7065,18 +7174,30 @@ msgstr ""
msgid "ClusterAgents|Integrate with the GitLab Agent"
msgstr ""
-msgid "ClusterAgents|Last used"
+msgid "ClusterAgents|Last connected %{timeAgo}."
+msgstr ""
+
+msgid "ClusterAgents|Last contact"
msgstr ""
msgid "ClusterAgents|Learn how to create an agent access token"
msgstr ""
+msgid "ClusterAgents|Make sure you are using a valid token."
+msgstr ""
+
msgid "ClusterAgents|Name"
msgstr ""
msgid "ClusterAgents|Never"
msgstr ""
+msgid "ClusterAgents|Never connected"
+msgstr ""
+
+msgid "ClusterAgents|Not connected"
+msgstr ""
+
msgid "ClusterAgents|Read more about getting started"
msgstr ""
@@ -7098,6 +7219,9 @@ msgstr ""
msgid "ClusterAgents|Select which Agent you want to install"
msgstr ""
+msgid "ClusterAgents|The Agent has not been connected in a long time. There might be a connectivity issue. Last contact was %{timeAgo}."
+msgstr ""
+
msgid "ClusterAgents|The GitLab Agent also requires %{linkStart}enabling the Agent Server%{linkEnd}"
msgstr ""
@@ -7125,9 +7249,6 @@ msgstr ""
msgid "ClusterAgents|You will need to create a token to connect to your agent"
msgstr ""
-msgid "ClusterAgent|This feature is only available for premium plans"
-msgstr ""
-
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -7317,9 +7438,6 @@ msgstr ""
msgid "ClusterIntegration|Create Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Create a provision role on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the account and external ID above. %{startMoreInfoLink}More information%{endLink}"
-msgstr ""
-
msgid "ClusterIntegration|Create cluster on"
msgstr ""
@@ -7752,7 +7870,7 @@ msgstr ""
msgid "ClusterIntegration|Subnets"
msgstr ""
-msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provisioned role, first create one on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the above account and external IDs. %{startMoreInfoLink}More information%{endLink}"
+msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provisioned role, first create one on %{awsLinkStart}Amazon Web Services %{awsLinkEnd} using the above account and external IDs. %{moreInfoStart}More information%{moreInfoEnd}"
msgstr ""
msgid "ClusterIntegration|The Kubernetes certificate used to authenticate to the cluster."
@@ -7986,6 +8104,9 @@ msgstr ""
msgid "Collapse replies"
msgstr ""
+msgid "Collapse settings section"
+msgstr ""
+
msgid "Collapse sidebar"
msgstr ""
@@ -8004,6 +8125,9 @@ msgstr ""
msgid "Comma-separated list of email addresses."
msgstr ""
+msgid "Comma-separated list of users allowed to exceed the rate limit."
+msgstr ""
+
msgid "Comma-separated, e.g. '1.1.1.1, 2.2.2.0/24'"
msgstr ""
@@ -8323,6 +8447,9 @@ msgstr ""
msgid "Configure %{repository_checks_link_start}repository checks%{link_end} and %{housekeeping_link_start}housekeeping%{link_end} on repositories."
msgstr ""
+msgid "Configure CAPTCHAs, IP address limits, and other anti-spam measures."
+msgstr ""
+
msgid "Configure Dependency Scanning in `.gitlab-ci.yml` using the GitLab managed template. You can [add variable overrides](https://docs.gitlab.com/ee/user/application_security/dependency_scanning/#customizing-the-dependency-scanning-settings) to customize Dependency Scanning settings."
msgstr ""
@@ -8359,16 +8486,13 @@ msgstr ""
msgid "Configure a %{codeStart}.gitlab-webide.yml%{codeEnd} file in the %{codeStart}.gitlab%{codeEnd} directory to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
msgstr ""
-msgid "Configure existing installation"
-msgstr ""
-
-msgid "Configure limit for notes created per minute by web and API requests."
+msgid "Configure advanced permissions, Large File Storage, and two-factor authentication settings."
msgstr ""
-msgid "Configure limits for Project/Group Import/Export."
+msgid "Configure approvals by authors and committers on all projects."
msgstr ""
-msgid "Configure limits for web and API requests."
+msgid "Configure existing installation"
msgstr ""
msgid "Configure paths to be protected by Rack Attack."
@@ -8383,10 +8507,13 @@ msgstr ""
msgid "Configure settings for Advanced Search with Elasticsearch."
msgstr ""
+msgid "Configure specific limits for Files API requests that supersede the general user and IP rate limits."
+msgstr ""
+
msgid "Configure specific limits for Git LFS requests that supersede the general user and IP rate limits."
msgstr ""
-msgid "Configure specific limits for Packages API requests that supersede the general user and IP rate limits."
+msgid "Configure specific limits for deprecated API requests that supersede the general user and IP rate limits."
msgstr ""
msgid "Configure the %{link} integration."
@@ -8398,6 +8525,9 @@ msgstr ""
msgid "Configure the way a user creates a new account."
msgstr ""
+msgid "Configure via Merge Request"
+msgstr ""
+
msgid "Configure which lists are shown for anyone who visits this board"
msgstr ""
@@ -8863,6 +8993,9 @@ msgstr ""
msgid "Content parsed with %{link}."
msgstr ""
+msgid "ContentEditor|Table of Contents"
+msgstr ""
+
msgid "ContentEditor|You have to provide a renderMarkdown function or a custom serializer"
msgstr ""
@@ -9049,6 +9182,9 @@ msgstr ""
msgid "Copy link to chart"
msgstr ""
+msgid "Copy prefix"
+msgstr ""
+
msgid "Copy reference"
msgstr ""
@@ -9079,6 +9215,9 @@ msgstr ""
msgid "Copy value"
msgstr ""
+msgid "Corpus Management"
+msgstr ""
+
msgid "Corpus Management|Are you sure you want to delete the corpus?"
msgstr ""
@@ -9307,6 +9446,9 @@ msgstr ""
msgid "Create commit"
msgstr ""
+msgid "Create common files more quickly, and standardize their format."
+msgstr ""
+
msgid "Create confidential merge request"
msgstr ""
@@ -9340,6 +9482,9 @@ msgstr ""
msgid "Create issue"
msgstr ""
+msgid "Create issue to resolve all threads"
+msgstr ""
+
msgid "Create iteration"
msgstr ""
@@ -9394,6 +9539,9 @@ msgstr ""
msgid "Create new..."
msgstr ""
+msgid "Create or import your first project"
+msgstr ""
+
msgid "Create project"
msgstr ""
@@ -9751,7 +9899,7 @@ msgstr ""
msgid "Custom notification events"
msgstr ""
-msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notificationLinkStart} notification emails%{notificationLinkEnd}."
+msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notificationLinkStart}notification emails%{notificationLinkEnd}."
msgstr ""
msgid "Custom project templates"
@@ -9948,10 +10096,10 @@ msgid "CycleAnalytics|Showing %{subjectFilterText} and %{selectedLabelsCount} la
msgid_plural "CycleAnalytics|Showing %{subjectFilterText} and %{selectedLabelsCount} labels"
msgstr[0] ""
-msgid "CycleAnalytics|Showing data for group '%{groupName}' and %{selectedProjectCount} projects from %{startDate} to %{endDate}"
+msgid "CycleAnalytics|Showing data for group '%{groupName}' and %{selectedProjectCount} projects from %{createdAfter} to %{createdBefore}"
msgstr ""
-msgid "CycleAnalytics|Showing data for group '%{groupName}' from %{startDate} to %{endDate}"
+msgid "CycleAnalytics|Showing data for group '%{groupName}' from %{createdAfter} to %{createdBefore}"
msgstr ""
msgid "CycleAnalytics|Stages"
@@ -10185,6 +10333,9 @@ msgstr ""
msgid "DastProfiles|Manage profiles"
msgstr ""
+msgid "DastProfiles|Manage site profiles"
+msgstr ""
+
msgid "DastProfiles|Minimum = 0 (no timeout enabled), Maximum = 2880 minutes"
msgstr ""
@@ -10260,6 +10411,9 @@ msgstr ""
msgid "DastProfiles|Scanner name"
msgstr ""
+msgid "DastProfiles|Schedule"
+msgstr ""
+
msgid "DastProfiles|Select branch"
msgstr ""
@@ -10329,7 +10483,7 @@ msgstr ""
msgid "DastProfiles|Website"
msgstr ""
-msgid "DastProfiles|You can either choose a passive scan or validate the target site in your chosen site profile. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
+msgid "DastProfiles|You can either choose a passive scan or validate the target site from the site profile management page. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
msgstr ""
msgid "DastProfiles|You cannot run an active scan against an unvalidated site."
@@ -10501,7 +10655,7 @@ msgstr ""
msgid "Days to merge"
msgstr ""
-msgid "Deactivate dormant users after 90 days of inactivity. Users can return to active status by signing in to their account. While inactive, a user is not counted as an active user in the instance."
+msgid "Deactivate dormant users after 90 days of inactivity"
msgstr ""
msgid "Dear Administrator,"
@@ -10588,10 +10742,10 @@ msgstr ""
msgid "Define a custom pattern with cron syntax"
msgstr ""
-msgid "Define approval settings."
+msgid "Define approval rules."
msgstr ""
-msgid "Define approval settings. %{linkStart}Learn more.%{linkEnd}"
+msgid "Define approval rules. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "Define custom rules for what constitutes spam, independent of Akismet"
@@ -10600,7 +10754,7 @@ msgstr ""
msgid "Define environments in the deploy stage(s) in %{code_open}.gitlab-ci.yml%{code_close} to track deployments here."
msgstr ""
-msgid "Define how approval rules are applied as a merge request moves toward completion."
+msgid "Define how approval rules are applied to merge requests."
msgstr ""
msgid "Definition"
@@ -10615,6 +10769,12 @@ msgstr ""
msgid "DelayedJobs|Are you sure you want to run %{job_name} immediately? This job will run automatically after it's timer finishes."
msgstr ""
+msgid "DelayedJobs|Are you sure you want to run %{job_name} immediately? This job will run automatically after its timer finishes."
+msgstr ""
+
+msgid "DelayedJobs|Run the delayed job now?"
+msgstr ""
+
msgid "DelayedJobs|Start now"
msgstr ""
@@ -10888,6 +11048,12 @@ msgstr ""
msgid "Dependency proxy image prefix"
msgstr ""
+msgid "DependencyProxy|Create a local proxy for storing frequently used upstream images. %{docLinkStart}Learn more%{docLinkEnd} about dependency proxies."
+msgstr ""
+
+msgid "DependencyProxy|Dependency Proxy"
+msgstr ""
+
msgid "DependencyProxy|Toggle Dependency Proxy"
msgstr ""
@@ -11125,6 +11291,9 @@ msgstr ""
msgid "Deployments"
msgstr ""
+msgid "Deployments to Google Kubernetes Engine can be "
+msgstr ""
+
msgid "Deployments|%{deployments} environment impacted."
msgid_plural "Deployments|%{deployments} environments impacted."
msgstr[0] ""
@@ -11153,6 +11322,9 @@ msgstr ""
msgid "Deployment|success"
msgstr ""
+msgid "Deprecated API rate limits"
+msgstr ""
+
msgid "Deprioritize label"
msgstr ""
@@ -11555,6 +11727,14 @@ msgstr ""
msgid "DiffsCompareBaseBranch|(base)"
msgstr ""
+msgid "Diffs|%d addition"
+msgid_plural "Diffs|%d additions"
+msgstr[0] ""
+
+msgid "Diffs|%d deletion"
+msgid_plural "Diffs|%d deletions"
+msgstr[0] ""
+
msgid "Diffs|No file name available"
msgstr ""
@@ -11564,9 +11744,16 @@ msgstr ""
msgid "Diffs|Show all unchanged lines"
msgstr ""
+msgid "Diffs|Showing %{dropdownStart}%{count} changed file%{dropdownEnd}"
+msgid_plural "Diffs|Showing %{dropdownStart}%{count} changed files%{dropdownEnd}"
+msgstr[0] ""
+
msgid "Diffs|Something went wrong while fetching diff lines."
msgstr ""
+msgid "Diffs|with %{additions} and %{deletions}"
+msgstr ""
+
msgid "Direct member"
msgstr ""
@@ -11691,9 +11878,6 @@ msgid "Dismiss %d selected vulnerability as"
msgid_plural "Dismiss %d selected vulnerabilities as"
msgstr[0] ""
-msgid "Dismiss Value Stream Analytics introduction box"
-msgstr ""
-
msgid "Dismiss merge request promotion"
msgstr ""
@@ -12015,6 +12199,9 @@ msgstr ""
msgid "Edit issues"
msgstr ""
+msgid "Edit merge requests"
+msgstr ""
+
msgid "Edit public deploy key"
msgstr ""
@@ -12090,6 +12277,9 @@ msgstr ""
msgid "Elastic|None. Select projects to index."
msgstr ""
+msgid "Eligible users"
+msgstr ""
+
msgid "Email"
msgstr ""
@@ -12219,6 +12409,9 @@ msgstr ""
msgid "Enable"
msgstr ""
+msgid "Enable Amazon EKS integration"
+msgstr ""
+
msgid "Enable Auto DevOps"
msgstr ""
@@ -12252,6 +12445,9 @@ msgstr ""
msgid "Enable SSL verification"
msgstr ""
+msgid "Enable Service Ping"
+msgstr ""
+
msgid "Enable Snowplow tracking"
msgstr ""
@@ -12282,6 +12478,9 @@ msgstr ""
msgid "Enable authenticated Git LFS request rate limit"
msgstr ""
+msgid "Enable authenticated web request rate limit"
+msgstr ""
+
msgid "Enable authentication"
msgstr ""
@@ -12342,7 +12541,7 @@ msgstr ""
msgid "Enable or disable the Pseudonymizer data collection."
msgstr ""
-msgid "Enable or disable version check and service ping."
+msgid "Enable or disable version check and Service Ping."
msgstr ""
msgid "Enable protected paths rate limit"
@@ -12354,18 +12553,12 @@ msgstr ""
msgid "Enable reCAPTCHA"
msgstr ""
-msgid "Enable reCAPTCHA for login"
-msgstr ""
-
-msgid "Enable reCAPTCHA, Invisible Captcha, Akismet and set IP limits. For reCAPTCHA, we currently only support %{recaptcha_v2_link_start}v2%{recaptcha_v2_link_end}"
+msgid "Enable reCAPTCHA for login."
msgstr ""
msgid "Enable repository checks"
msgstr ""
-msgid "Enable service ping"
-msgstr ""
-
msgid "Enable shared runners for all projects and subgroups in this group."
msgstr ""
@@ -12387,7 +12580,10 @@ msgstr ""
msgid "Enable unauthenticated API request rate limit"
msgstr ""
-msgid "Enable unauthenticated request rate limit"
+msgid "Enable unauthenticated web request rate limit"
+msgstr ""
+
+msgid "Enable user deactivation emails"
msgstr ""
msgid "Enable version check"
@@ -12423,9 +12619,6 @@ msgstr ""
msgid "Enabled sources for code import during project creation. OmniAuth must be configured for GitHub"
msgstr ""
-msgid "Enabling this will only make licensed EE features available to projects if the project namespace's plan includes the feature or if the project is public."
-msgstr ""
-
msgid "Encountered an error while rendering: %{err}"
msgstr ""
@@ -12474,9 +12667,6 @@ msgstr ""
msgid "Enter Admin Mode"
msgstr ""
-msgid "Enter IP address range"
-msgstr ""
-
msgid "Enter a number"
msgstr ""
@@ -12489,9 +12679,6 @@ msgstr ""
msgid "Enter at least three characters to search"
msgstr ""
-msgid "Enter domain"
-msgstr ""
-
msgid "Enter in your Bitbucket Server URL and personal access token below"
msgstr ""
@@ -12678,9 +12865,6 @@ msgstr ""
msgid "Environments|Deployment %{status}"
msgstr ""
-msgid "Environments|Dismiss"
-msgstr ""
-
msgid "Environments|Enable review app"
msgstr ""
@@ -12693,9 +12877,6 @@ msgstr ""
msgid "Environments|Environments are places where code gets deployed, such as staging or production."
msgstr ""
-msgid "Environments|Help us improve environments"
-msgstr ""
-
msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
msgstr ""
@@ -12732,6 +12913,9 @@ msgstr ""
msgid "Environments|Note that this action will stop the environment, but it will %{emphasisStart}not%{emphasisEnd} have an effect on any existing deployment due to no “stop environment action†being defined in the %{ciConfigLinkStart}.gitlab-ci.yml%{ciConfigLinkEnd} file."
msgstr ""
+msgid "Environments|Open"
+msgstr ""
+
msgid "Environments|Open live environment"
msgstr ""
@@ -12771,9 +12955,6 @@ msgstr ""
msgid "Environments|Stopping %{environmentName}"
msgstr ""
-msgid "Environments|Take the survey"
-msgstr ""
-
msgid "Environments|There was an error fetching the logs. Please try again."
msgstr ""
@@ -12795,9 +12976,6 @@ msgstr ""
msgid "Environments|You don't have any environments right now"
msgstr ""
-msgid "Environments|Your feedback helps GitLab make environments better for you and other users. Participate and enter a sweepstake to win a USD 30 gift card."
-msgstr ""
-
msgid "Environments|by %{avatar}"
msgstr ""
@@ -13080,7 +13258,7 @@ msgstr ""
msgid "Error parsing CSV file. Please make sure it has"
msgstr ""
-msgid "Error rendering markdown preview"
+msgid "Error rendering Markdown preview"
msgstr ""
msgid "Error saving label update."
@@ -13128,6 +13306,9 @@ msgstr ""
msgid "Error: %{error_message}"
msgstr ""
+msgid "Error: Couldn't load some or all of the changes."
+msgstr ""
+
msgid "Error: No AWS credentials were supplied"
msgstr ""
@@ -13161,6 +13342,9 @@ msgstr ""
msgid "ErrorTracking|Enable error tracking"
msgstr ""
+msgid "ErrorTracking|Error tracking backend"
+msgstr ""
+
msgid "ErrorTracking|If you self-host Sentry, enter your Sentry instance's full URL. If you use Sentry's hosted solution, enter https://sentry.io"
msgstr ""
@@ -13194,6 +13378,12 @@ msgstr ""
msgid "Escalation policies must have at least one rule"
msgstr ""
+msgid "EscalationPolicies|%{clockIcon} IF alert is not %{alertStatus} in %{minutes}"
+msgstr ""
+
+msgid "EscalationPolicies|%{notificationIcon} THEN %{doAction} %{forScheduleOrUser}"
+msgstr ""
+
msgid "EscalationPolicies|+ Add an additional rule"
msgstr ""
@@ -13236,13 +13426,13 @@ msgstr ""
msgid "EscalationPolicies|Escalation policies"
msgstr ""
-msgid "EscalationPolicies|Escalation rules"
+msgid "EscalationPolicies|Escalation policy %{obstacle} in Project %{project}"
msgstr ""
-msgid "EscalationPolicies|Failed to load oncall-schedules"
+msgid "EscalationPolicies|Escalation rules"
msgstr ""
-msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} %{then} THEN %{doAction} %{scheduleOrUser}"
+msgid "EscalationPolicies|Failed to load oncall-schedules"
msgstr ""
msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} minutes"
@@ -13320,18 +13510,36 @@ msgstr ""
msgid "Every %{action} attempt has failed: %{job_error_message}. Please try again."
msgstr ""
+msgid "Every 3 months"
+msgstr ""
+
+msgid "Every 3 months on the %{day} at %{time} %{timezone}"
+msgstr ""
+
+msgid "Every 6 months"
+msgstr ""
+
+msgid "Every 6 months on the %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Every day"
msgstr ""
msgid "Every day (at %{time})"
msgstr ""
+msgid "Every day at %{time} %{timezone}"
+msgstr ""
+
msgid "Every month"
msgstr ""
msgid "Every month (Day %{day} at %{time})"
msgstr ""
+msgid "Every month on the %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Every three months"
msgstr ""
@@ -13345,6 +13553,15 @@ msgstr[0] ""
msgid "Every week (%{weekday} at %{time})"
msgstr ""
+msgid "Every week on %{day} at %{time} %{timezone}"
+msgstr ""
+
+msgid "Every year"
+msgstr ""
+
+msgid "Every year on %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Everyone"
msgstr ""
@@ -13381,9 +13598,6 @@ msgstr ""
msgid "Exactly one of %{attributes} is required"
msgstr ""
-msgid "Example: %{ip_address}. %{read_more_link}."
-msgstr ""
-
msgid "Example: @sub\\.company\\.com$"
msgstr ""
@@ -13450,13 +13664,13 @@ msgstr ""
msgid "Expand pipeline"
msgstr ""
-msgid "Expand sidebar"
+msgid "Expand settings section"
msgstr ""
-msgid "Expected documents: %{expected_documents}"
+msgid "Expand sidebar"
msgstr ""
-msgid "Experienced"
+msgid "Expected documents: %{expected_documents}"
msgstr ""
msgid "ExperimentSubject|Must have exactly one of User, Namespace, or Project."
@@ -13741,9 +13955,6 @@ msgstr ""
msgid "Failed to load related branches"
msgstr ""
-msgid "Failed to load sidebar lock status"
-msgstr ""
-
msgid "Failed to load stacktrace."
msgstr ""
@@ -14166,6 +14377,9 @@ msgstr ""
msgid "Files"
msgstr ""
+msgid "Files API Rate Limits"
+msgstr ""
+
msgid "Files breadcrumb"
msgstr ""
@@ -15165,6 +15379,9 @@ msgstr ""
msgid "GitLab group: %{source_link}"
msgstr ""
+msgid "GitLab informs you if a new version is available."
+msgstr ""
+
msgid "GitLab is a complete DevOps platform, delivered as a single application, fundamentally changing the way Development, Security, and Ops teams collaborate"
msgstr ""
@@ -15180,7 +15397,7 @@ msgstr ""
msgid "GitLab is open source software to collaborate on code."
msgstr ""
-msgid "GitLab is undergoing maintenance and is operating in a read-only mode."
+msgid "GitLab is undergoing maintenance and is operating in read-only mode."
msgstr ""
msgid "GitLab member or Email address"
@@ -15192,9 +15409,6 @@ msgstr ""
msgid "GitLab project export"
msgstr ""
-msgid "GitLab restart is required to apply changes."
-msgstr ""
-
msgid "GitLab single sign-on URL"
msgstr ""
@@ -15210,9 +15424,6 @@ msgstr ""
msgid "GitLab version"
msgstr ""
-msgid "GitLab will inform you if a new version is available."
-msgstr ""
-
msgid "GitLab will run a background job that will produce pseudonymized CSVs of the GitLab database that will be uploaded to your configured object storage directory."
msgstr ""
@@ -15477,9 +15688,21 @@ msgstr ""
msgid "Go to snippets"
msgstr ""
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check 'Allowed domains for sign-ups'."
+msgstr ""
+
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check 'Email restrictions for sign-ups'."
+msgstr ""
+
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check the 'Domain denylist'."
+msgstr ""
+
msgid "Go to the activity feed"
msgstr ""
+msgid "Go to the group’s 'Settings &gt; General' page, and check 'Restrict membership by email domain'."
+msgstr ""
+
msgid "Go to the milestone list"
msgstr ""
@@ -15516,6 +15739,12 @@ msgstr ""
msgid "Goal of the changes and what reviewers should be aware of"
msgstr ""
+msgid "Google Cloud"
+msgstr ""
+
+msgid "Google Cloud offers several deployment targets. Select the one most suitable for your project."
+msgstr ""
+
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
@@ -15600,9 +15829,6 @@ msgstr ""
msgid "Group ID"
msgstr ""
-msgid "Group ID: %{group_id}"
-msgstr ""
-
msgid "Group Owner must have signed in with SAML before enabling Group Managed Accounts"
msgstr ""
@@ -15777,6 +16003,12 @@ msgstr ""
msgid "GroupImport|Unable to process group import file"
msgstr ""
+msgid "GroupPage|Copy group ID"
+msgstr ""
+
+msgid "GroupPage|Group ID: %{group_id}"
+msgstr ""
+
msgid "GroupRoadmap|%{dateWord} – No end date"
msgstr ""
@@ -15831,6 +16063,9 @@ msgstr ""
msgid "GroupRoadmap|Within 3 years"
msgstr ""
+msgid "GroupSAML|\"persistent\" recommended"
+msgstr ""
+
msgid "GroupSAML|%{strongOpen}Warning%{strongClose} - Enabling %{linkStart}SSO enforcement%{linkEnd} can reduce security risks."
msgstr ""
@@ -15963,6 +16198,9 @@ msgstr ""
msgid "GroupSAML|To be able to prohibit outer forks, you first need to enforce dedicate group managed accounts."
msgstr ""
+msgid "GroupSAML|Use SAML group links to manage group membership using SAML."
+msgstr ""
+
msgid "GroupSAML|Valid SAML Response"
msgstr ""
@@ -15975,13 +16213,10 @@ msgstr ""
msgid "GroupSAML|as %{access_level}"
msgstr ""
-msgid "GroupSAML|must match stored NameID of \"%{extern_uid}\" as we use this to identify users. If the NameID changes users will be unable to sign in."
-msgstr ""
-
-msgid "GroupSAML|should be \"persistent\""
+msgid "GroupSAML|must match stored NameID of \"%{extern_uid}\" to identify user and allow sign in"
msgstr ""
-msgid "GroupSAML|should be a random persistent ID, emails are discouraged"
+msgid "GroupSAML|recommend persistent ID instead of email"
msgstr ""
msgid "GroupSelect|No matching results"
@@ -15996,9 +16231,15 @@ msgstr ""
msgid "GroupSettings|Allow project access token creation"
msgstr ""
+msgid "GroupSettings|Applied to all subgroups unless overridden by a group owner. Groups already added to the project lose access."
+msgstr ""
+
msgid "GroupSettings|Auto DevOps pipeline was updated for the group"
msgstr ""
+msgid "GroupSettings|Available only on the top-level group. Applies to all subgroups. Groups already shared with a group outside %{group} are still shared unless removed manually."
+msgstr ""
+
msgid "GroupSettings|Badges"
msgstr ""
@@ -16050,6 +16291,9 @@ msgstr ""
msgid "GroupSettings|New runners registration token has been generated!"
msgstr ""
+msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgstr ""
+
msgid "GroupSettings|Pipeline settings was updated for the group"
msgstr ""
@@ -16062,12 +16306,15 @@ msgstr ""
msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
-msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups."
+msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups"
msgstr ""
msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
msgstr ""
+msgid "GroupSettings|Prevents group members from being notified if the group is mentioned."
+msgstr ""
+
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
msgstr ""
@@ -16104,21 +16351,6 @@ msgstr ""
msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}."
msgstr ""
-msgid "GroupSettings|This setting is only available on the top-level group and it applies to all subgroups. Groups that have already been shared with a group outside %{group} will still be shared, and this access will have to be revoked manually."
-msgstr ""
-
-msgid "GroupSettings|This setting will be applied to all subgroups unless overridden by a group owner. Groups that already have access to the project will continue to have access unless removed manually."
-msgstr ""
-
-msgid "GroupSettings|This setting will override user notification preferences for all members of the group, subgroups, and projects."
-msgstr ""
-
-msgid "GroupSettings|This setting will prevent group members from being notified if the group is mentioned."
-msgstr ""
-
-msgid "GroupSettings|This setting will prevent group members from forking projects outside of the group."
-msgstr ""
-
msgid "GroupSettings|Transfer group"
msgstr ""
@@ -16236,7 +16468,7 @@ msgstr ""
msgid "GroupsNew|No import options available"
msgstr ""
-msgid "GroupsNew|Not all related objects are migrated, as %{docs_link_start}described here%{docs_link_end}. Please %{feedback_link_start}leave feedback%{feedback_link_end} on this feature."
+msgid "GroupsNew|Not all related objects are migrated. %{docs_link_start}More info%{docs_link_end}."
msgstr ""
msgid "GroupsNew|Personal access token"
@@ -16368,15 +16600,27 @@ msgstr ""
msgid "Hello %{name},"
msgstr ""
-msgid "Hello there"
-msgstr ""
-
msgid "Hello, %{name}!"
msgstr ""
msgid "Hello, %{username}!"
msgstr ""
+msgid "HelloMessage|%{handshake_emoji} Contribute to GitLab: %{contribute_link}"
+msgstr ""
+
+msgid "HelloMessage|%{magnifier_emoji} Create a new GitLab issue: %{new_issue_link}"
+msgstr ""
+
+msgid "HelloMessage|%{rocket_emoji} We like your curiosity! Help us improve GitLab by joining the team: %{jobs_page_link}"
+msgstr ""
+
+msgid "HelloMessage|Does this page need fixes or improvements? Open an issue or contribute a merge request to help make GitLab more lovable. At GitLab, everyone can contribute!"
+msgstr ""
+
+msgid "HelloMessage|Welcome to GitLab!"
+msgstr ""
+
msgid "Help"
msgstr ""
@@ -16386,13 +16630,10 @@ msgstr ""
msgid "Helps prevent bots from creating accounts."
msgstr ""
-msgid "Helps prevent bots from creating issues"
-msgstr ""
-
-msgid "Helps prevent malicious users hide their activity"
+msgid "Helps prevent bots from creating issues."
msgstr ""
-msgid "Helps reduce request volume (e.g. from crawlers or abusive bots)"
+msgid "Helps prevent malicious users hide their activity."
msgstr ""
msgid "Helps reduce request volume (for example, from crawlers or abusive bots)"
@@ -16514,6 +16755,12 @@ msgstr ""
msgid "Housekeeping, export, path, transfer, remove, archive."
msgstr ""
+msgid "How do I configure Akismet?"
+msgstr ""
+
+msgid "How do I configure it?"
+msgstr ""
+
msgid "How do I configure runners?"
msgstr ""
@@ -16535,19 +16782,25 @@ msgstr ""
msgid "How do I set up this service?"
msgstr ""
+msgid "How do I use a web terminal?"
+msgstr ""
+
+msgid "How do I use file templates?"
+msgstr ""
+
msgid "How it works"
msgstr ""
msgid "How many days need to pass between marking entity for deletion and actual removing it."
msgstr ""
-msgid "How many seconds an IP will be counted towards the limit"
+msgid "How many seconds an IP counts toward the IP address limit."
msgstr ""
-msgid "I accept the %{terms_link}"
+msgid "How the job limiter handles jobs exceeding the thresholds specified below. The 'track' mode only logs the jobs. The 'compress' mode compresses the jobs and raises an exception if the compressed size exceeds the limit."
msgstr ""
-msgid "I accept the|Terms of Service and Privacy Policy"
+msgid "I accept the %{terms_link}"
msgstr ""
msgid "I forgot my password"
@@ -16631,13 +16884,16 @@ msgstr ""
msgid "IP Address"
msgstr ""
-msgid "IP expiration time"
+msgid "IP address expiration time"
msgstr ""
-msgid "IP subnet restriction only allowed for top-level groups"
+msgid "IP address restrictions"
+msgstr ""
+
+msgid "IP addresses per user"
msgstr ""
-msgid "IPs per user"
+msgid "IP subnet restriction only allowed for top-level groups"
msgstr ""
msgid "Identifier"
@@ -16652,6 +16908,9 @@ msgstr ""
msgid "If any indexed field exceeds this limit it will be truncated to this number of characters and the rest will not be indexed or searchable. This does not apply to repository and wiki indexing. Setting this to 0 means it is unlimited."
msgstr ""
+msgid "If blank, defaults to %{code_open}Retry later%{code_close}."
+msgstr ""
+
msgid "If blank, set allowable lifetime to %{instance_level_policy_in_words}, as defined by the instance admin. Once set, existing tokens for users in this group may be revoked."
msgstr ""
@@ -16703,6 +16962,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 did not initiate these sign-in attempts, please reach out to your administrator or enable two-factor authentication (2FA) on your account."
+msgstr ""
+
msgid "If you did not initiate this change, please contact your administrator immediately."
msgstr ""
@@ -16792,10 +17054,10 @@ msgstr ""
msgid "Import Projects from Gitea"
msgstr ""
-msgid "Import a project"
+msgid "Import an exported GitLab project"
msgstr ""
-msgid "Import an exported GitLab project"
+msgid "Import and export rate limits"
msgstr ""
msgid "Import failed due to a GitHub error: %{original}"
@@ -16807,12 +17069,18 @@ msgstr ""
msgid "Import from Jira"
msgstr ""
+msgid "Import group"
+msgstr ""
+
msgid "Import group from file"
msgstr ""
msgid "Import groups"
msgstr ""
+msgid "Import history"
+msgstr ""
+
msgid "Import in progress"
msgstr ""
@@ -16876,7 +17144,25 @@ msgstr ""
msgid "Import timed out. Import took longer than %{import_jobs_expiration} seconds"
msgstr ""
-msgid "Import/Export Rate Limits"
+msgid "ImportAProjectModal|Import from a project"
+msgstr ""
+
+msgid "ImportAProjectModal|Import members from another project"
+msgstr ""
+
+msgid "ImportAProjectModal|Import project members"
+msgstr ""
+
+msgid "ImportAProjectModal|Only project members (not group members) are imported, and they get the same permissions as the project you import from."
+msgstr ""
+
+msgid "ImportAProjectModal|Successfully imported"
+msgstr ""
+
+msgid "ImportAProjectModal|Unable to import project members"
+msgstr ""
+
+msgid "ImportAProjectModal|You're importing members to the %{strongStart}%{name}%{strongEnd} project."
msgstr ""
msgid "ImportButtons|Connect repositories from"
@@ -16928,7 +17214,7 @@ msgstr[0] ""
msgid "Importing..."
msgstr ""
-msgid "Import|A repository URL usually ends in a .git suffix, although this is not required. Double check to make sure your repository URL is correct."
+msgid "Import|There is not a valid Git repository at this URL. If your HTTP repository is not publicly accessible, verify your credentials."
msgstr ""
msgid "Improve customer support with Service Desk"
@@ -16937,9 +17223,6 @@ msgstr ""
msgid "Improves Git cloning performance."
msgstr ""
-msgid "In %{time_to_now}"
-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 ""
@@ -17225,7 +17508,7 @@ msgstr ""
msgid "InProductMarketing|Start a GitLab Ultimate trial today in less than one minute, no credit card required."
msgstr ""
-msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no CC required"
+msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no credit card required"
msgstr ""
msgid "InProductMarketing|Start a trial"
@@ -17264,7 +17547,7 @@ msgstr ""
msgid "InProductMarketing|Team up in GitLab for greater efficiency"
msgstr ""
-msgid "InProductMarketing|Team work makes the dream work"
+msgid "InProductMarketing|Team work makes the dream work"
msgstr ""
msgid "InProductMarketing|Test, create, deploy"
@@ -17844,6 +18127,9 @@ msgstr ""
msgid "Integrations|Create new issue in Jira"
msgstr ""
+msgid "Integrations|Create new issue in ZenTao"
+msgstr ""
+
msgid "Integrations|Default settings are inherited from the group level."
msgstr ""
@@ -17937,9 +18223,15 @@ msgstr ""
msgid "Integrations|Search Jira issues"
msgstr ""
+msgid "Integrations|Search ZenTao issues"
+msgstr ""
+
msgid "Integrations|Send notifications about project events to Unify Circuit."
msgstr ""
+msgid "Integrations|Send notifications about project events to a Unify Circuit conversation. %{docs_link}"
+msgstr ""
+
msgid "Integrations|Sign in to add namespaces"
msgstr ""
@@ -17979,6 +18271,9 @@ msgstr ""
msgid "Integrations|You've activated every integration 🎉"
msgstr ""
+msgid "Integrations|ZenTao issues display here when you create issues in your project in ZenTao."
+msgstr ""
+
msgid "Interactive mode"
msgstr ""
@@ -18006,9 +18301,6 @@ msgstr ""
msgid "Interval Pattern"
msgstr ""
-msgid "Introducing Value Stream Analytics"
-msgstr ""
-
msgid "Introducing Your DevOps Report"
msgstr ""
@@ -18105,6 +18397,12 @@ msgstr ""
msgid "Investigate vulnerability: %{title}"
msgstr ""
+msgid "Invisible Captcha"
+msgstr ""
+
+msgid "Invisible Captcha helps prevent the creation of spam accounts. It adds a honeypot field and time-sensitive form submission to the account signup form."
+msgstr ""
+
msgid "Invitation"
msgstr ""
@@ -18558,12 +18856,18 @@ msgstr ""
msgid "Issues"
msgstr ""
+msgid "Issues I've created"
+msgstr ""
+
msgid "Issues Rate Limits"
msgstr ""
msgid "Issues and merge requests"
msgstr ""
+msgid "Issues assigned to me"
+msgstr ""
+
msgid "Issues can be bugs, tasks or ideas to be discussed. Also, issues are searchable and filterable."
msgstr ""
@@ -18675,7 +18979,7 @@ msgstr ""
msgid "Iterations|Create cadence"
msgstr ""
-msgid "Iterations|Create your first iteration"
+msgid "Iterations|Create iteration"
msgstr ""
msgid "Iterations|Delete cadence"
@@ -18684,6 +18988,9 @@ msgstr ""
msgid "Iterations|Delete iteration cadence?"
msgstr ""
+msgid "Iterations|Delete iteration?"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -18717,12 +19024,18 @@ msgstr ""
msgid "Iterations|New iteration cadence"
msgstr ""
+msgid "Iterations|No closed iterations."
+msgstr ""
+
msgid "Iterations|No iteration cadences to show."
msgstr ""
msgid "Iterations|No iterations in cadence."
msgstr ""
+msgid "Iterations|No open iterations."
+msgstr ""
+
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
@@ -18753,6 +19066,9 @@ msgstr ""
msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
msgstr ""
+msgid "Iterations|This will remove the iteration from any issues that are assigned to it."
+msgstr ""
+
msgid "Iterations|Title"
msgstr ""
@@ -18768,15 +19084,9 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "I’m familiar with the basics of DevOps."
-msgstr ""
-
msgid "I’m joining my team who’s already on GitLab"
msgstr ""
-msgid "I’m not familiar with the basics of DevOps."
-msgstr ""
-
msgid "Jaeger URL"
msgstr ""
@@ -19041,6 +19351,9 @@ msgstr ""
msgid "Job"
msgstr ""
+msgid "Job %{jobName}"
+msgstr ""
+
msgid "Job Failed #%{build_id}"
msgstr ""
@@ -19630,9 +19943,6 @@ msgstr ""
msgid "Learn more in the"
msgstr ""
-msgid "Learn more in the|pipeline schedules documentation"
-msgstr ""
-
msgid "Learn more."
msgstr ""
@@ -19744,9 +20054,6 @@ msgstr ""
msgid "Leave Admin Mode"
msgstr ""
-msgid "Leave blank for no limit. Once set, existing personal access tokens may be revoked."
-msgstr ""
-
msgid "Leave edit mode? All unsaved changes will be lost."
msgstr ""
@@ -19792,10 +20099,10 @@ msgstr ""
msgid "LicenseCompliance|Acceptable license to be used in the project"
msgstr ""
-msgid "LicenseCompliance|Add a license"
+msgid "LicenseCompliance|Add license and related policy"
msgstr ""
-msgid "LicenseCompliance|Add license and related policy"
+msgid "LicenseCompliance|Add license policy"
msgstr ""
msgid "LicenseCompliance|Allow"
@@ -19879,6 +20186,9 @@ msgstr ""
msgid "LicenseManagement|Uncategorized"
msgstr ""
+msgid "Licensed Enterprise Edition features can be used if the project namespace's plan includes the feature, or if the project is public."
+msgstr ""
+
msgid "Licensed Features"
msgstr ""
@@ -19945,7 +20255,10 @@ msgstr ""
msgid "Limit namespaces and projects that can be indexed"
msgstr ""
-msgid "Limit sign in from multiple ips"
+msgid "Limit project size at a global, group, and project level. %{link_start}Learn more%{link_end}."
+msgstr ""
+
+msgid "Limit sign in from multiple IP addresses"
msgstr ""
msgid "Limit the number of concurrent operations this secondary site can run in the background."
@@ -19957,10 +20270,16 @@ msgstr ""
msgid "Limit the number of issues and epics per minute a user can create through web and API requests."
msgstr ""
+msgid "Limit the size of Sidekiq jobs stored in Redis."
+msgstr ""
+
msgid "Limited to showing %d event at most"
msgid_plural "Limited to showing %d events at most"
msgstr[0] ""
+msgid "Limiting mode"
+msgstr ""
+
msgid "Line changes"
msgstr ""
@@ -20030,9 +20349,6 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
-msgid "List of users to be excluded from the limit"
-msgstr ""
-
msgid "List options"
msgstr ""
@@ -20072,9 +20388,6 @@ msgstr ""
msgid "Loading functions timed out. Please reload the page to try again."
msgstr ""
-msgid "Loading issues"
-msgstr ""
-
msgid "Loading more"
msgstr ""
@@ -20366,6 +20679,9 @@ msgstr ""
msgid "Marked For Deletion At - %{deletion_time}"
msgstr ""
+msgid "Marked as ready. Merging is now allowed."
+msgstr ""
+
msgid "Marked this %{noun} as a draft."
msgstr ""
@@ -20438,52 +20754,22 @@ msgstr ""
msgid "Max 100,000 events"
msgstr ""
-msgid "Max 20 characters"
-msgstr ""
-
-msgid "Max Group Export Download requests per minute per user"
-msgstr ""
-
-msgid "Max Group Export requests per minute per user"
-msgstr ""
-
-msgid "Max Group Import requests per minute per user"
-msgstr ""
-
-msgid "Max Project Export Download requests per minute per user"
-msgstr ""
-
-msgid "Max Project Export requests per minute per user"
-msgstr ""
-
-msgid "Max Project Import requests per minute per user"
-msgstr ""
-
-msgid "Max authenticated API requests per period per user"
-msgstr ""
-
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
-msgid "Max authenticated web requests per period per user"
-msgstr ""
-
msgid "Max file size is 200 KB."
msgstr ""
-msgid "Max requests per minute per user"
-msgstr ""
-
msgid "Max role"
msgstr ""
msgid "Max session time"
msgstr ""
-msgid "Max unauthenticated requests per period per IP"
+msgid "MaxBuilds"
msgstr ""
-msgid "MaxBuilds"
+msgid "Maximum 20 characters"
msgstr ""
msgid "Maximum Conan package file size in bytes"
@@ -20519,6 +20805,12 @@ msgstr ""
msgid "Maximum attachment size (MB)"
msgstr ""
+msgid "Maximum authenticated API requests per rate limit period per user"
+msgstr ""
+
+msgid "Maximum authenticated web requests per rate limit period per user"
+msgstr ""
+
msgid "Maximum bulk request size (MiB)"
msgstr ""
@@ -20564,6 +20856,15 @@ msgstr ""
msgid "Maximum files in a diff"
msgstr ""
+msgid "Maximum group export download requests per minute"
+msgstr ""
+
+msgid "Maximum group export requests per minute"
+msgstr ""
+
+msgid "Maximum group import requests per minute"
+msgstr ""
+
msgid "Maximum import size"
msgstr ""
@@ -20600,7 +20901,7 @@ msgstr ""
msgid "Maximum number of projects."
msgstr ""
-msgid "Maximum number of unique IPs per user"
+msgid "Maximum number of unique IP addresses per user."
msgstr ""
msgid "Maximum page reached"
@@ -20609,12 +20910,24 @@ msgstr ""
msgid "Maximum page size"
msgstr ""
+msgid "Maximum project export download requests per minute"
+msgstr ""
+
+msgid "Maximum project export requests per minute"
+msgstr ""
+
+msgid "Maximum project import requests per minute"
+msgstr ""
+
msgid "Maximum push size"
msgstr ""
msgid "Maximum push size (MB)"
msgstr ""
+msgid "Maximum requests per minute"
+msgstr ""
+
msgid "Maximum running slices"
msgstr ""
@@ -20642,10 +20955,16 @@ msgstr ""
msgid "Maximum time between updates that a mirror can have when scheduled to synchronize."
msgstr ""
-msgid "Maximum time for web terminal websocket connection (in seconds). 0 for unlimited."
+msgid "Maximum time that users are allowed to skip the setup of two-factor authentication (in hours). Set to 0 (zero) to enforce at next sign in."
msgstr ""
-msgid "Maximum time that users are allowed to skip the setup of two-factor authentication (in hours). Set to 0 (zero) to enforce at next sign in."
+msgid "Maximum time, in seconds, for a web terminal websocket connection. 0 for unlimited."
+msgstr ""
+
+msgid "Maximum unauthenticated API requests per rate limit period per IP"
+msgstr ""
+
+msgid "Maximum unauthenticated web requests per rate limit period per IP"
msgstr ""
msgid "May"
@@ -20663,9 +20982,6 @@ msgstr ""
msgid "Medium vulnerabilities present"
msgstr ""
-msgid "Member lock"
-msgstr ""
-
msgid "Member since"
msgstr ""
@@ -20702,6 +21018,9 @@ msgstr ""
msgid "Members of a group may only view projects they have permission to access"
msgstr ""
+msgid "Membership"
+msgstr ""
+
msgid "Members|%{time} by %{user}"
msgstr ""
@@ -20762,9 +21081,6 @@ msgstr ""
msgid "Members|Expiration date updated successfully."
msgstr ""
-msgid "Members|Expired"
-msgstr ""
-
msgid "Members|Filter members"
msgstr ""
@@ -20780,9 +21096,6 @@ msgstr ""
msgid "Members|Membership"
msgstr ""
-msgid "Members|No expiration set"
-msgstr ""
-
msgid "Members|Remove \"%{groupName}\""
msgstr ""
@@ -20804,9 +21117,6 @@ msgstr ""
msgid "Members|Search invited"
msgstr ""
-msgid "Members|in %{time}"
-msgstr ""
-
msgid "Member|Deny access"
msgstr ""
@@ -20882,9 +21192,6 @@ msgstr ""
msgid "Merge request %{mr_link} was reviewed by %{mr_author}"
msgstr ""
-msgid "Merge request (MR) approvals"
-msgstr ""
-
msgid "Merge request analytics"
msgstr ""
@@ -20906,12 +21213,21 @@ msgstr ""
msgid "Merge requests"
msgstr ""
+msgid "Merge requests I've created"
+msgstr ""
+
msgid "Merge requests are a place to propose changes you've made to a project and discuss those changes with others"
msgstr ""
msgid "Merge requests are read-only in a secondary Geo node"
msgstr ""
+msgid "Merge requests assigned to me"
+msgstr ""
+
+msgid "Merge requests that I'm a reviewer"
+msgstr ""
+
msgid "Merge the branch and fix any conflicts that come up"
msgstr ""
@@ -20972,10 +21288,10 @@ msgstr ""
msgid "MergeRequests|An error occurred while saving the draft comment."
msgstr ""
-msgid "MergeRequests|Failed to squash. Should be done manually."
+msgid "MergeRequests|Create issue to resolve thread"
msgstr ""
-msgid "MergeRequests|Resolve this thread in a new issue"
+msgid "MergeRequests|Failed to squash. Should be done manually."
msgstr ""
msgid "MergeRequests|Saving the comment failed"
@@ -21787,6 +22103,9 @@ msgstr ""
msgid "MoveIssue|Cannot move issue to project it originates from!"
msgstr ""
+msgid "MoveIssue|Cannot move issues of '%{issue_type}' type."
+msgstr ""
+
msgid "Moved issue to %{label} column in the board."
msgstr ""
@@ -21911,6 +22230,15 @@ 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. To learn more about reducing storage capacity please visit our docs."
msgstr ""
+msgid "NamespaceUserCap|Pending users must be reviewed and approved by a group owner. Learn more about %{user_caps_link_start}User Caps%{link_end} and %{users_pending_approval_link_start}Users Pending Approval%{link_end}."
+msgstr ""
+
+msgid "NamespaceUserCap|View pending user approvals"
+msgstr ""
+
+msgid "NamespaceUserCap|Your group has reached its billable member limit"
+msgstr ""
+
msgid "Namespaces"
msgstr ""
@@ -21953,9 +22281,6 @@ msgstr ""
msgid "Network"
msgstr ""
-msgid "Network Policy|New rule"
-msgstr ""
-
msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is inbound from a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
msgstr ""
@@ -21977,16 +22302,13 @@ msgstr ""
msgid "NetworkPolicies|%{strongOpen}any%{strongClose} port"
msgstr ""
-msgid "NetworkPolicies|+ Add alert"
-msgstr ""
-
msgid "NetworkPolicies|.yaml"
msgstr ""
msgid "NetworkPolicies|.yaml mode"
msgstr ""
-msgid "NetworkPolicies|Actions"
+msgid "NetworkPolicies|Add alert"
msgstr ""
msgid "NetworkPolicies|Alerts are intended to be selectively used for a limited number of events that are potentially concerning and warrant a manual review. Alerts should not be used as a substitute for a SIEM or a logging tool. High volume alerts are likely to be dropped so as to preserve the stability of GitLab's integration with Kubernetes."
@@ -22022,9 +22344,6 @@ msgstr ""
msgid "NetworkPolicies|Deny all traffic"
msgstr ""
-msgid "NetworkPolicies|Description"
-msgstr ""
-
msgid "NetworkPolicies|Edit policy"
msgstr ""
@@ -22037,9 +22356,6 @@ msgstr ""
msgid "NetworkPolicies|IP/subnet"
msgstr ""
-msgid "NetworkPolicies|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
-msgstr ""
-
msgid "NetworkPolicies|Invalid or empty policy"
msgstr ""
@@ -22049,19 +22365,16 @@ msgstr ""
msgid "NetworkPolicies|Kubernetes error: %{error}"
msgstr ""
-msgid "NetworkPolicies|Name"
-msgstr ""
-
msgid "NetworkPolicies|Network"
msgstr ""
-msgid "NetworkPolicies|Network traffic"
+msgid "NetworkPolicies|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
msgstr ""
-msgid "NetworkPolicies|New policy"
+msgid "NetworkPolicies|Network policy can be created after the environment is loaded successfully."
msgstr ""
-msgid "NetworkPolicies|No policies detected"
+msgid "NetworkPolicies|Network traffic"
msgstr ""
msgid "NetworkPolicies|None selected"
@@ -22070,21 +22383,12 @@ msgstr ""
msgid "NetworkPolicies|Please %{installLinkStart}install%{installLinkEnd} and %{configureLinkStart}configure a Kubernetes Agent for this project%{configureLinkEnd} to enable alerts."
msgstr ""
-msgid "NetworkPolicies|Policies are a specification of how groups of pods are allowed to communicate with each other's network endpoints."
-msgstr ""
-
msgid "NetworkPolicies|Policy %{policyName} was successfully changed"
msgstr ""
msgid "NetworkPolicies|Policy definition"
msgstr ""
-msgid "NetworkPolicies|Policy editor"
-msgstr ""
-
-msgid "NetworkPolicies|Policy preview"
-msgstr ""
-
msgid "NetworkPolicies|Rule"
msgstr ""
@@ -22094,9 +22398,6 @@ msgstr ""
msgid "NetworkPolicies|Rule mode is unavailable for this policy. In some cases, we cannot parse the YAML file back into the rules editor."
msgstr ""
-msgid "NetworkPolicies|Rules"
-msgstr ""
-
msgid "NetworkPolicies|Save changes"
msgstr ""
@@ -22109,9 +22410,6 @@ msgstr ""
msgid "NetworkPolicies|Traffic that does not match any rule will be blocked."
msgstr ""
-msgid "NetworkPolicies|Unable to parse policy"
-msgstr ""
-
msgid "NetworkPolicies|all DNS names"
msgstr ""
@@ -22290,6 +22588,9 @@ msgstr ""
msgid "New issue"
msgstr ""
+msgid "New issue in %{project}"
+msgstr ""
+
msgid "New issue title"
msgstr ""
@@ -22368,7 +22669,7 @@ msgstr ""
msgid "Newest first"
msgstr ""
-msgid "Newly registered users will by default be external"
+msgid "Newly-registered users are external by default"
msgstr ""
msgid "Next"
@@ -22683,8 +22984,9 @@ msgstr ""
msgid "No webhooks found, add one in the form above."
msgstr ""
-msgid "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} to renew your subscription."
-msgstr ""
+msgid "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} day to renew your subscription."
+msgid_plural "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} days to renew your subscription."
+msgstr[0] ""
msgid "No. of commits"
msgstr ""
@@ -22701,7 +23003,7 @@ msgstr ""
msgid "Nodes"
msgstr ""
-msgid "Non-admin users can sign in with read-only access and make read-only API requests."
+msgid "Non-admin users are restricted to read-only access, in both GitLab UI and API."
msgstr ""
msgid "None"
@@ -22782,7 +23084,7 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
-msgid "Notes Rate Limits"
+msgid "Notes rate limit"
msgstr ""
msgid "Notes|Are you sure you want to cancel creating this comment?"
@@ -22945,9 +23247,6 @@ msgstr ""
msgid "November"
msgstr ""
-msgid "Novice"
-msgstr ""
-
msgid "Now, personalize your GitLab experience"
msgstr ""
@@ -23116,7 +23415,7 @@ msgstr ""
msgid "OnCallSchedules|For this rotation, on-call will be:"
msgstr ""
-msgid "OnCallSchedules|On-call schedule %{schedule} in Project %{project}"
+msgid "OnCallSchedules|On-call schedule %{obstacle} in Project %{project}"
msgstr ""
msgid "OnCallSchedules|On-call schedules"
@@ -23263,22 +23562,22 @@ msgstr ""
msgid "OnDemandScans|Scanner profile"
msgstr ""
-msgid "OnDemandScans|Select one of the existing profiles"
+msgid "OnDemandScans|Schedule scan"
msgstr ""
-msgid "OnDemandScans|Site profile"
+msgid "OnDemandScans|Select one of the existing profiles"
msgstr ""
-msgid "OnDemandScans|Use existing scanner profile"
+msgid "OnDemandScans|Site profile"
msgstr ""
-msgid "OnDemandScans|Use existing site profile"
+msgid "OnDemandScans|Start time"
msgstr ""
-msgid "OnDemandScans|You can either choose a passive scan or validate the target site in your chosen site profile. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
+msgid "OnDemandScans|Use existing scanner profile"
msgstr ""
-msgid "OnDemandScans|You cannot run an active scan against an unvalidated site."
+msgid "OnDemandScans|Use existing site profile"
msgstr ""
msgid "OnDemandScans|You must create a repository within your project to run an on-demand scan."
@@ -23342,6 +23641,9 @@ msgstr ""
msgid "Only admins can delete project"
msgstr ""
+msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
+msgstr ""
+
msgid "Only include features new to your current subscription tier."
msgstr ""
@@ -23360,6 +23662,12 @@ msgstr ""
msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
+msgid "Only reCAPTCHA v2 is supported:"
+msgstr ""
+
+msgid "Only users from the specified IP address ranges are able to reach this group, including all subgroups, projects, and Git repositories."
+msgstr ""
+
msgid "Only verified users with an email address in any of these domains can be added to the group."
msgstr ""
@@ -23546,9 +23854,6 @@ msgstr ""
msgid "Package Registry"
msgstr ""
-msgid "Package Registry Rate Limits"
-msgstr ""
-
msgid "Package Registry: authenticated API requests"
msgstr ""
@@ -23567,6 +23872,9 @@ msgstr ""
msgid "Package recipe already exists"
msgstr ""
+msgid "Package registry rate limits"
+msgstr ""
+
msgid "Package type"
msgstr ""
@@ -23633,6 +23941,9 @@ msgstr ""
msgid "PackageRegistry|Composer"
msgstr ""
+msgid "PackageRegistry|Composer.json with license: %{license} and version: %{version}"
+msgstr ""
+
msgid "PackageRegistry|Conan"
msgstr ""
@@ -23696,6 +24007,9 @@ msgstr ""
msgid "PackageRegistry|Copy require package include"
msgstr ""
+msgid "PackageRegistry|Copy target SHA"
+msgstr ""
+
msgid "PackageRegistry|Copy yarn command"
msgstr ""
@@ -23762,6 +24076,9 @@ msgstr ""
msgid "PackageRegistry|Install package version"
msgstr ""
+msgid "PackageRegistry|Instance-level"
+msgstr ""
+
msgid "PackageRegistry|Invalid Package: failed metadata extraction"
msgstr ""
@@ -23807,6 +24124,9 @@ msgstr ""
msgid "PackageRegistry|Pip Command"
msgstr ""
+msgid "PackageRegistry|Project-level"
+msgstr ""
+
msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
msgstr ""
@@ -23828,6 +24148,9 @@ msgstr ""
msgid "PackageRegistry|Remove package"
msgstr ""
+msgid "PackageRegistry|Required Python: %{pythonVersion}"
+msgstr ""
+
msgid "PackageRegistry|RubyGems"
msgstr ""
@@ -23870,6 +24193,9 @@ msgstr ""
msgid "PackageRegistry|Source project located at %{link}"
msgstr ""
+msgid "PackageRegistry|Target SHA: %{sha}"
+msgstr ""
+
msgid "PackageRegistry|There are no other versions of this package."
msgstr ""
@@ -24038,6 +24364,18 @@ msgstr ""
msgid "Password was successfully updated. Please sign in again."
msgstr ""
+msgid "PasswordPrompt|Confirm password"
+msgstr ""
+
+msgid "PasswordPrompt|Confirm password to continue"
+msgstr ""
+
+msgid "PasswordPrompt|Password is required"
+msgstr ""
+
+msgid "PasswordPrompt|Please enter your password to confirm"
+msgstr ""
+
msgid "Passwords should be unique and not used for any other sites or services."
msgstr ""
@@ -24065,6 +24403,9 @@ msgstr ""
msgid "Paste project path (i.e. gitlab-org/gitlab)"
msgstr ""
+msgid "Paste this DSN into your Sentry SDK"
+msgstr ""
+
msgid "Paste your public SSH key, which is usually contained in the file '~/.ssh/id_ed25519.pub' or '~/.ssh/id_rsa.pub' and begins with 'ssh-ed25519' or 'ssh-rsa'. Do not paste your private SSH key, as that can compromise your identity."
msgstr ""
@@ -24149,6 +24490,9 @@ msgstr ""
msgid "PerformanceBar|First Contentful Paint"
msgstr ""
+msgid "PerformanceBar|Flamegraph with mode:"
+msgstr ""
+
msgid "PerformanceBar|Frontend resources"
msgstr ""
@@ -24182,6 +24526,15 @@ msgstr ""
msgid "PerformanceBar|Trace"
msgstr ""
+msgid "PerformanceBar|cpu"
+msgstr ""
+
+msgid "PerformanceBar|object"
+msgstr ""
+
+msgid "PerformanceBar|wall"
+msgstr ""
+
msgid "Period in seconds"
msgstr ""
@@ -24410,6 +24763,48 @@ msgstr ""
msgid "PipelineSchedules|Variables"
msgstr ""
+msgid "PipelineSource|API"
+msgstr ""
+
+msgid "PipelineSource|Chat"
+msgstr ""
+
+msgid "PipelineSource|External"
+msgstr ""
+
+msgid "PipelineSource|External Pull Request"
+msgstr ""
+
+msgid "PipelineSource|Merge Request"
+msgstr ""
+
+msgid "PipelineSource|On-Demand DAST Scan"
+msgstr ""
+
+msgid "PipelineSource|On-Demand DAST Validation"
+msgstr ""
+
+msgid "PipelineSource|Parent Pipeline"
+msgstr ""
+
+msgid "PipelineSource|Pipeline"
+msgstr ""
+
+msgid "PipelineSource|Push"
+msgstr ""
+
+msgid "PipelineSource|Schedule"
+msgstr ""
+
+msgid "PipelineSource|Trigger"
+msgstr ""
+
+msgid "PipelineSource|Web"
+msgstr ""
+
+msgid "PipelineSource|Web IDE"
+msgstr ""
+
msgid "PipelineStatusTooltip|Pipeline: %{ciStatus}"
msgstr ""
@@ -24710,46 +25105,7 @@ msgstr ""
msgid "Pipeline|Source"
msgstr ""
-msgid "Pipeline|Source|API"
-msgstr ""
-
-msgid "Pipeline|Source|Chat"
-msgstr ""
-
-msgid "Pipeline|Source|External"
-msgstr ""
-
-msgid "Pipeline|Source|External Pull Request"
-msgstr ""
-
-msgid "Pipeline|Source|Merge Request"
-msgstr ""
-
-msgid "Pipeline|Source|On-Demand DAST Scan"
-msgstr ""
-
-msgid "Pipeline|Source|On-Demand DAST Validation"
-msgstr ""
-
-msgid "Pipeline|Source|Parent Pipeline"
-msgstr ""
-
-msgid "Pipeline|Source|Pipeline"
-msgstr ""
-
-msgid "Pipeline|Source|Push"
-msgstr ""
-
-msgid "Pipeline|Source|Schedule"
-msgstr ""
-
-msgid "Pipeline|Source|Trigger"
-msgstr ""
-
-msgid "Pipeline|Source|Web"
-msgstr ""
-
-msgid "Pipeline|Source|Web IDE"
+msgid "Pipeline|Source|Security Policy"
msgstr ""
msgid "Pipeline|Specify variable values to be used in this run. The values specified in %{linkStart}CI/CD settings%{linkEnd} will be used by default."
@@ -24800,7 +25156,7 @@ msgstr ""
msgid "Pipeline|We are currently unable to fetch pipeline data"
msgstr ""
-msgid "Pipeline|You’re about to stop pipeline %{pipelineId}."
+msgid "Pipeline|You’re about to stop pipeline #%{pipelineId}."
msgstr ""
msgid "Pipeline|for"
@@ -24827,6 +25183,9 @@ msgstr ""
msgid "Plain diff"
msgstr ""
+msgid "Plain-text response to send to clients that hit a rate limit"
+msgstr ""
+
msgid "Plan:"
msgstr ""
@@ -24971,9 +25330,6 @@ msgstr ""
msgid "Please provide attributes to update"
msgstr ""
-msgid "Please provide your username or email address."
-msgstr ""
-
msgid "Please reach out if you have any questions and we'll be happy to assist."
msgstr ""
@@ -25016,9 +25372,6 @@ msgstr ""
msgid "Please set a new password before proceeding."
msgstr ""
-msgid "Please share your feedback about %{featureName} %{linkStart}in this issue%{linkEnd} to help us improve the experience."
-msgstr ""
-
msgid "Please solve the captcha"
msgstr ""
@@ -25196,6 +25549,9 @@ msgstr ""
msgid "Prevent adding new members to project membership within this group"
msgstr ""
+msgid "Prevent auto-stopping"
+msgstr ""
+
msgid "Prevent editing approval rules in projects and merge requests."
msgstr ""
@@ -25208,7 +25564,7 @@ msgstr ""
msgid "Prevent users from changing their profile name"
msgstr ""
-msgid "Prevent users from performing write operations on GitLab while performing maintenance."
+msgid "Prevent users from performing write operations while GitLab maintenance is in progress."
msgstr ""
msgid "Preview"
@@ -25481,6 +25837,9 @@ msgstr ""
msgid "Profiles|Enter your name, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Enter your password to confirm the email change"
+msgstr ""
+
msgid "Profiles|Enter your pronouns to let people know how to refer to you"
msgstr ""
@@ -25715,10 +26074,10 @@ msgstr ""
msgid "Profiles|e.g. My MacBook key"
msgstr ""
-msgid "Profiles|username"
+msgid "Profiles|https://website.com"
msgstr ""
-msgid "Profiles|website.com"
+msgid "Profiles|username"
msgstr ""
msgid "Profiles|your account"
@@ -25961,9 +26320,21 @@ msgstr ""
msgid "ProjectSelect| or group"
msgstr ""
+msgid "ProjectSelect|No matching results"
+msgstr ""
+
msgid "ProjectSelect|Search for project"
msgstr ""
+msgid "ProjectSelect|Search projects"
+msgstr ""
+
+msgid "ProjectSelect|Select a project"
+msgstr ""
+
+msgid "ProjectSelect|There was an error fetching the projects. Please try again."
+msgstr ""
+
msgid "ProjectService|Drone server URL"
msgstr ""
@@ -26051,6 +26422,9 @@ msgstr ""
msgid "ProjectService|Trigger event when a new, unique alert is recorded."
msgstr ""
+msgid "ProjectService|Trigger event when a new, unique vulnerability is recorded. (Note: This feature requires an Ultimate plan.)"
+msgstr ""
+
msgid "ProjectService|Trigger event when a pipeline status changes."
msgstr ""
@@ -26465,9 +26839,15 @@ msgstr ""
msgid "Projects are graded based on the highest severity vulnerability present"
msgstr ""
+msgid "Projects are organized into groups"
+msgstr ""
+
msgid "Projects contributed to"
msgstr ""
+msgid "Projects help you organize your work. They contain your file repository, issues, merge requests, and so much more."
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr ""
@@ -26702,10 +27082,10 @@ msgstr ""
msgid "PrometheusService|Prometheus cluster integration"
msgstr ""
-msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
+msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
msgstr ""
-msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
+msgid "PrometheusService|The ID of the IAP-secured resource."
msgstr ""
msgid "PrometheusService|The Prometheus API base URL."
@@ -27323,6 +27703,9 @@ msgstr ""
msgid "Rate limit"
msgstr ""
+msgid "Rate limits can help reduce request volume (like from crawlers or abusive bots)."
+msgstr ""
+
msgid "Raw blob request rate limit per minute"
msgstr ""
@@ -27335,6 +27718,9 @@ msgstr ""
msgid "Re-authentication required"
msgstr ""
+msgid "Re-import"
+msgstr ""
+
msgid "Re-request review"
msgstr ""
@@ -27356,6 +27742,9 @@ msgstr ""
msgid "Read more about related issues"
msgstr ""
+msgid "Read their documentation."
+msgstr ""
+
msgid "Ready to get started with GitLab? Follow these steps to set up your workspace, plan and commit changes, and deploy your project."
msgstr ""
@@ -27389,6 +27778,9 @@ msgstr ""
msgid "Receive any notifications from GitLab."
msgstr ""
+msgid "Receive notification of abuse reports by email."
+msgstr ""
+
msgid "Receive notifications about your own activity"
msgstr ""
@@ -27531,9 +27923,6 @@ msgstr ""
msgid "Registry setup"
msgstr ""
-msgid "Regulate approvals by authors/committers. Affects all projects."
-msgstr ""
-
msgid "Reindexing Status: %{status} (Slice multiplier: %{multiplier}, Maximum running slices: %{max_slices})"
msgstr ""
@@ -27628,6 +28017,9 @@ msgstr ""
msgid "Release|Something went wrong while saving the release details."
msgstr ""
+msgid "Reload page"
+msgstr ""
+
msgid "Remediations"
msgstr ""
@@ -27910,6 +28302,9 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
+msgid "Repeats"
+msgstr ""
+
msgid "Replace"
msgstr ""
@@ -28268,10 +28663,7 @@ msgstr ""
msgid "Require additional authentication for administrative tasks."
msgstr ""
-msgid "Require all users in this group to setup Two-factor authentication"
-msgstr ""
-
-msgid "Require all users in this group to setup two-factor authentication"
+msgid "Require all users in this group to set up two-factor authentication"
msgstr ""
msgid "Required approvals (%{approvals_given} given)"
@@ -28315,6 +28707,9 @@ msgstr[0] ""
msgid "Requires values to meet regular expression requirements."
msgstr ""
+msgid "Requires you to deploy or set up cloud-hosted Sentry."
+msgstr ""
+
msgid "Requires your primary GitLab email address."
msgstr ""
@@ -28375,9 +28770,6 @@ msgstr ""
msgid "Resolve"
msgstr ""
-msgid "Resolve all threads in new issue"
-msgstr ""
-
msgid "Resolve conflicts"
msgstr ""
@@ -28435,6 +28827,9 @@ msgstr ""
msgid "Response text"
msgstr ""
+msgid "Restart GitLab to apply changes."
+msgstr ""
+
msgid "Restart Terminal"
msgstr ""
@@ -28453,6 +28848,9 @@ msgstr ""
msgid "Restoring the project will prevent the project from being removed on this date and restore people's ability to make changes to it."
msgstr ""
+msgid "Restrict group access by IP address. %{link_start}Learn more%{link_end}."
+msgstr ""
+
msgid "Restrict membership by email domain"
msgstr ""
@@ -28764,6 +29162,9 @@ msgstr ""
msgid "Runners|Runner #%{runner_id}"
msgstr ""
+msgid "Runners|Runner assigned to project."
+msgstr ""
+
msgid "Runners|Runner is offline, last contact was %{runner_contact} ago"
msgstr ""
@@ -28776,6 +29177,9 @@ msgstr ""
msgid "Runners|Runner registration"
msgstr ""
+msgid "Runners|Runner unassigned from project."
+msgstr ""
+
msgid "Runners|Runners"
msgstr ""
@@ -28968,7 +29372,7 @@ msgstr ""
msgid "SastEntryPoints|How do I set up SAST?"
msgstr ""
-msgid "SastEntryPoints|Learn more."
+msgid "SastEntryPoints|Learn more"
msgstr ""
msgid "Satisfied"
@@ -29010,7 +29414,7 @@ msgstr ""
msgid "Save pipeline schedule"
msgstr ""
-msgid "Save space and find images in the container Registry. remove unneeded tags and keep only the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
+msgid "Save storage space by automatically deleting tags from the container registry and keeping the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
msgstr ""
msgid "Saving"
@@ -29184,6 +29588,9 @@ msgstr ""
msgid "Search or filter results…"
msgstr ""
+msgid "Search or jump to..."
+msgstr ""
+
msgid "Search project"
msgstr ""
@@ -29244,16 +29651,16 @@ msgstr ""
msgid "SearchCodeResults|of %{link_to_project}"
msgstr ""
-msgid "SearchResults|Showing %{count} %{scope} for%{term_element}"
+msgid "SearchResults|Showing %{count} %{scope} for %{term_element}"
msgstr ""
-msgid "SearchResults|Showing %{count} %{scope} for%{term_element} in your personal and project snippets"
+msgid "SearchResults|Showing %{count} %{scope} for %{term_element} in your personal and project snippets"
msgstr ""
-msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for%{term_element}"
+msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for %{term_element}"
msgstr ""
-msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for%{term_element} in your personal and project snippets"
+msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for %{term_element} in your personal and project snippets"
msgstr ""
msgid "SearchResults|code result"
@@ -29324,6 +29731,9 @@ msgstr ""
msgid "Secret Detection"
msgstr ""
+msgid "Secret access key"
+msgstr ""
+
msgid "Secret token"
msgstr ""
@@ -29363,9 +29773,6 @@ msgstr ""
msgid "SecurityApprovals|A merge request approval is required when the license compliance report contains a denied license."
msgstr ""
-msgid "SecurityApprovals|Configurable if security scanners are enabled. %{linkStart}Learn more.%{linkEnd}"
-msgstr ""
-
msgid "SecurityApprovals|Coverage-Check"
msgstr ""
@@ -29378,24 +29785,18 @@ msgstr ""
msgid "SecurityApprovals|Learn more about Vulnerability-Check"
msgstr ""
-msgid "SecurityApprovals|License Scanning must be enabled. %{linkStart}Learn more%{linkEnd}."
-msgstr ""
-
msgid "SecurityApprovals|License-Check"
msgstr ""
msgid "SecurityApprovals|Requires approval for Denied licenses. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}More information%{linkEnd}"
+msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "SecurityApprovals|Requires approval for vulnerabilities. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
-msgid "SecurityApprovals|Test coverage must be enabled. %{linkStart}Learn more%{linkEnd}."
-msgstr ""
-
msgid "SecurityApprovals|Vulnerability-Check"
msgstr ""
@@ -29459,6 +29860,12 @@ msgstr ""
msgid "SecurityConfiguration|Immediately begin risk analysis and remediation with application security features. Start with SAST and Secret Detection, available to all plans. Upgrade to Ultimate to get all features, including:"
msgstr ""
+msgid "SecurityConfiguration|Manage corpus"
+msgstr ""
+
+msgid "SecurityConfiguration|Manage corpus files used as mutation sources in coverage fuzzing."
+msgstr ""
+
msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
msgstr ""
@@ -29513,6 +29920,12 @@ msgstr ""
msgid "SecurityOrchestration|Action"
msgstr ""
+msgid "SecurityOrchestration|Actions"
+msgstr ""
+
+msgid "SecurityOrchestration|Add rule"
+msgstr ""
+
msgid "SecurityOrchestration|All policies"
msgstr ""
@@ -29546,9 +29959,6 @@ msgstr ""
msgid "SecurityOrchestration|Network"
msgstr ""
-msgid "SecurityOrchestration|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
-msgstr ""
-
msgid "SecurityOrchestration|New policy"
msgstr ""
@@ -29564,6 +29974,9 @@ msgstr ""
msgid "SecurityOrchestration|Policy editor"
msgstr ""
+msgid "SecurityOrchestration|Policy preview"
+msgstr ""
+
msgid "SecurityOrchestration|Policy status"
msgstr ""
@@ -29573,6 +29986,9 @@ msgstr ""
msgid "SecurityOrchestration|Rule"
msgstr ""
+msgid "SecurityOrchestration|Rules"
+msgstr ""
+
msgid "SecurityOrchestration|Scan Execution"
msgstr ""
@@ -29666,6 +30082,9 @@ msgstr ""
msgid "SecurityReports|Create issue"
msgstr ""
+msgid "SecurityReports|Development vulnerabilities"
+msgstr ""
+
msgid "SecurityReports|Dismiss vulnerability"
msgstr ""
@@ -29681,6 +30100,9 @@ msgstr ""
msgid "SecurityReports|Download results"
msgstr ""
+msgid "SecurityReports|Download scanned URLs"
+msgstr ""
+
msgid "SecurityReports|Download scanned resources"
msgstr ""
@@ -29804,6 +30226,9 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
+msgid "SecurityReports|The Vulnerability Report shows the results of the lastest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "SecurityReports|The security reports below contain one or more vulnerability findings that could not be parsed and were not recorded. Download the artifacts in the job output to investigate. Ensure any security report created conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
msgstr ""
@@ -29945,10 +30370,10 @@ msgstr ""
msgid "Select a repository"
msgstr ""
-msgid "Select a role"
+msgid "Select a repository containing templates for common files."
msgstr ""
-msgid "Select a shared template repository for all projects on this instance."
+msgid "Select a role"
msgstr ""
msgid "Select a template repository"
@@ -30026,6 +30451,9 @@ msgstr ""
msgid "Select project to choose zone"
msgstr ""
+msgid "Select project to create issue"
+msgstr ""
+
msgid "Select projects"
msgstr ""
@@ -30143,6 +30571,9 @@ msgstr ""
msgid "Send emails to help guide new users through the onboarding process."
msgstr ""
+msgid "Send emails to users upon account deactivation."
+msgstr ""
+
msgid "Send message"
msgstr ""
@@ -30161,6 +30592,9 @@ msgstr ""
msgid "Send service data"
msgstr ""
+msgid "Sentry"
+msgstr ""
+
msgid "Sentry API URL"
msgstr ""
@@ -30275,6 +30709,9 @@ msgstr ""
msgid "Service"
msgstr ""
+msgid "Service Accounts keys are required to authorize GitLab to deploy your Google Cloud project."
+msgstr ""
+
msgid "Service Desk"
msgstr ""
@@ -30347,15 +30784,15 @@ msgstr ""
msgid "Set a password on your account to pull or push via %{protocol}."
msgstr ""
-msgid "Set a template repository for projects in this group"
-msgstr ""
-
msgid "Set access permissions for this token."
msgstr ""
msgid "Set an instance-wide domain that will be available to all clusters when installing Knative."
msgstr ""
+msgid "Set any rate limit to %{code_open}0%{code_close} to disable the limit."
+msgstr ""
+
msgid "Set default and restrict visibility levels. Configure import sources and git access protocol."
msgstr ""
@@ -30368,7 +30805,7 @@ msgstr ""
msgid "Set limit to 0 to allow any file size."
msgstr ""
-msgid "Set max session time for web terminal."
+msgid "Set limits for web and API requests."
msgstr ""
msgid "Set milestone"
@@ -30377,15 +30814,18 @@ msgstr ""
msgid "Set new password"
msgstr ""
-msgid "Set notification email for abuse reports."
+msgid "Set parent epic to an epic"
msgstr ""
-msgid "Set parent epic to an epic"
+msgid "Set per-user rate limits for imports and exports of projects and groups."
msgstr ""
msgid "Set projects and maximum size limits, session duration, user options, and check feature availability for namespace plan."
msgstr ""
+msgid "Set rate limits for package registry API requests that supersede the general user and IP rate limits."
+msgstr ""
+
msgid "Set severity"
msgstr ""
@@ -30404,15 +30844,24 @@ msgstr ""
msgid "Set the default branch for this project. All merge requests and commits are made against this branch unless you specify a different one."
msgstr ""
+msgid "Set the default expiration time for job artifacts in all projects. Set to %{code_open}0%{code_close} to never expire artifacts by default. If no unit is written, it defaults to seconds. For example, these are all equivalent: %{code_open}3600%{code_close}, %{code_open}60 minutes%{code_close}, or %{code_open}one hour%{code_close}."
+msgstr ""
+
msgid "Set the due date to %{due_date}."
msgstr ""
msgid "Set the iteration to %{iteration_reference}."
msgstr ""
+msgid "Set the maximum session time for a web terminal."
+msgstr ""
+
msgid "Set the milestone to %{milestone_reference}."
msgstr ""
+msgid "Set the per-user rate limit for notes created by web or API requests."
+msgstr ""
+
msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
msgstr ""
@@ -30614,6 +31063,9 @@ msgstr ""
msgid "Show Pipeline IID"
msgstr ""
+msgid "Show all %{issuable_type}."
+msgstr ""
+
msgid "Show all activity"
msgstr ""
@@ -30665,15 +31117,9 @@ msgstr ""
msgid "Show list"
msgstr ""
-msgid "Show me advanced features"
-msgstr ""
-
msgid "Show me how to add a pipeline"
msgstr ""
-msgid "Show me the basics"
-msgstr ""
-
msgid "Show one file at a time"
msgstr ""
@@ -30712,15 +31158,15 @@ msgstr ""
msgid "Showing %{pageSize} of %{total} %{issuableType}"
msgstr ""
-msgid "Showing %{pageSize} of %{total} issues"
-msgstr ""
-
msgid "Showing all epics"
msgstr ""
msgid "Showing all issues"
msgstr ""
+msgid "Showing data for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
+msgstr ""
+
msgid "Showing data for workflow items created in this date range. Date range cannot exceed %{maxDateRange} days."
msgstr ""
@@ -30760,6 +31206,15 @@ msgstr ""
msgid "Sidebar|Weight"
msgstr ""
+msgid "Sidekiq job compression threshold (bytes)"
+msgstr ""
+
+msgid "Sidekiq job size limit (bytes)"
+msgstr ""
+
+msgid "Sidekiq job size limits"
+msgstr ""
+
msgid "Sign in"
msgstr ""
@@ -30880,6 +31335,9 @@ msgstr ""
msgid "Site profile not found for given parameters"
msgstr ""
+msgid "Sites"
+msgstr ""
+
msgid "Size"
msgstr ""
@@ -30910,19 +31368,22 @@ msgstr ""
msgid "SlackIntegration|Sends notifications about project events to Slack channels."
msgstr ""
-msgid "SlackService|2. Paste the %{strong_open}Token%{strong_close} into the field below"
+msgid "SlackService|1. %{slash_command_link_start}Add a slash command%{slash_command_link_end} in your Slack team using this information:"
msgstr ""
-msgid "SlackService|3. Select the %{strong_open}Active%{strong_close} checkbox, press %{strong_open}Save changes%{strong_close} and start using GitLab inside Slack!"
+msgid "SlackService|2. Paste the token from Slack in the %{strong_open}Token%{strong_close} field below."
msgstr ""
-msgid "SlackService|Fill in the word that works best for your team."
+msgid "SlackService|3. Select the %{strong_open}Active%{strong_close} checkbox, select %{strong_open}Save changes%{strong_close}, and start using slash commands in Slack!"
+msgstr ""
+
+msgid "SlackService|After setup, get a list of available Slack slash commands by entering"
msgstr ""
-msgid "SlackService|See list of available commands in Slack after setting up this service, by entering"
+msgid "SlackService|Fill in the word that works best for your team."
msgstr ""
-msgid "SlackService|This service allows users to perform common operations on this project by entering slash commands in Slack."
+msgid "SlackService|Perform common operations in this project by entering slash commands in Slack."
msgstr ""
msgid "Slice multiplier"
@@ -30988,7 +31449,7 @@ msgstr ""
msgid "Some child epics may be hidden due to applied filters"
msgstr ""
-msgid "Some common domains are not allowed. %{read_more_link}."
+msgid "Some common domains are not allowed. %{learn_more_link}."
msgstr ""
msgid "Some of the designs you tried uploading did not change:"
@@ -31072,9 +31533,6 @@ msgstr ""
msgid "Something went wrong while exporting requirements"
msgstr ""
-msgid "Something went wrong while fetching %{listType} list"
-msgstr ""
-
msgid "Something went wrong while fetching branches"
msgstr ""
@@ -31129,15 +31587,9 @@ msgstr ""
msgid "Something went wrong while merging this merge request. Please try again."
msgstr ""
-msgid "Something went wrong while moving issues."
-msgstr ""
-
msgid "Something went wrong while obtaining the Let's Encrypt certificate."
msgstr ""
-msgid "Something went wrong while performing the action."
-msgstr ""
-
msgid "Something went wrong while promoting the issue to an epic. Please try again."
msgstr ""
@@ -31465,7 +31917,10 @@ msgstr ""
msgid "SourcegraphPreferences|Uses a custom %{linkStart}Sourcegraph instance%{linkEnd}."
msgstr ""
-msgid "Spam Check API Key"
+msgid "Spam Check"
+msgstr ""
+
+msgid "Spam Check API key"
msgstr ""
msgid "Spam Logs"
@@ -31483,7 +31938,7 @@ msgstr ""
msgid "Specified URL cannot be used: \"%{reason}\""
msgstr ""
-msgid "Specify an e-mail address regex pattern to identify default internal users."
+msgid "Specify an email address regex pattern to identify default internal users."
msgstr ""
msgid "Speed up your pipelines with Needs relationships"
@@ -31738,7 +32193,7 @@ msgstr ""
msgid "StatusCheck|An error occurred fetching the status checks."
msgstr ""
-msgid "StatusCheck|Apply this status check to any branch or a specific protected branch."
+msgid "StatusCheck|Apply this status check to all branches or a specific protected branch."
msgstr ""
msgid "StatusCheck|Check for a status response in Merge Requests. Failures do not block merges. %{link_start}Learn more%{link_end}."
@@ -32077,6 +32532,9 @@ msgstr ""
msgid "Subscriptions"
msgstr ""
+msgid "Subscription|Your subscription for %{strong}%{namespace_name}%{strong_close} has expired and you are now on %{pricing_link_start}the GitLab Free tier%{pricing_link_end}. Don't worry, your data is safe. Get in touch with our support team (%{support_email}). They'll gladly help with your subscription renewal."
+msgstr ""
+
msgid "Subtracted"
msgstr ""
@@ -32305,6 +32763,9 @@ msgstr ""
msgid "SuperSonics|Plan"
msgstr ""
+msgid "SuperSonics|Please agree to the Subscription Agreement"
+msgstr ""
+
msgid "SuperSonics|Ready to get started? A GitLab plan is ideal for scaling organizations and for multi team usage."
msgstr ""
@@ -32335,6 +32796,9 @@ msgstr ""
msgid "SuperSonics|The activation code is not valid. Please make sure to copy it exactly from the Customers Portal or confirmation email. Learn more about %{linkStart}activating your subscription%{linkEnd}."
msgstr ""
+msgid "SuperSonics|The activation code should be a 24-character alphanumeric string"
+msgstr ""
+
msgid "SuperSonics|There is a connectivity issue."
msgstr ""
@@ -32377,9 +32841,15 @@ msgstr ""
msgid "SuperSonics|You do not have an active subscription"
msgstr ""
+msgid "SuperSonics|You have successfully added a license that activates on %{date}. Please see the subscription history table below for more details."
+msgstr ""
+
msgid "SuperSonics|You'll be charged for %{trueUpLinkStart}users over license%{trueUpLinkEnd} on a quarterly or annual basis, depending on the terms of your agreement."
msgstr ""
+msgid "SuperSonics|Your future dated license was successfully added"
+msgstr ""
+
msgid "SuperSonics|Your subscription"
msgstr ""
@@ -32632,7 +33102,7 @@ msgstr ""
msgid "Template to append to all Service Desk issues"
msgstr ""
-msgid "TemplateRepository|Select a repository to make its templates available to all projects. %{link_start}What should the repository contain?%{link_end} "
+msgid "TemplateRepository|Create common files more quickly, and standardize their format."
msgstr ""
msgid "Templates"
@@ -32834,7 +33304,7 @@ msgstr ""
msgid "TestCases|Search test cases"
msgstr ""
-msgid "TestCases|Something went wrong while adding test case to Todo."
+msgid "TestCases|Something went wrong while adding test case to a to-do item."
msgstr ""
msgid "TestCases|Something went wrong while creating a test case."
@@ -32846,7 +33316,7 @@ msgstr ""
msgid "TestCases|Something went wrong while fetching test cases list."
msgstr ""
-msgid "TestCases|Something went wrong while marking test case todo as done."
+msgid "TestCases|Something went wrong while marking test case to-do item as done."
msgstr ""
msgid "TestCases|Something went wrong while moving test case."
@@ -32966,7 +33436,7 @@ msgstr ""
msgid "Thanks for your purchase!"
msgstr ""
-msgid "That is ok, I do not want to renew"
+msgid "That's OK, I don't want to renew"
msgstr ""
msgid "That's it, well done!"
@@ -32988,7 +33458,7 @@ msgid "The %{type} contains the following error:"
msgid_plural "The %{type} contains the following errors:"
msgstr[0] ""
-msgid "The API key used by GitLab for accessing the Spam Check service endpoint"
+msgid "The API key used by GitLab for accessing the Spam Check service endpoint."
msgstr ""
msgid "The GitLab subscription service (customers.gitlab.com) is currently experiencing an outage. You can monitor the status and get updates at %{linkStart}status.gitlab.com%{linkEnd}."
@@ -33027,9 +33497,6 @@ msgstr ""
msgid "The URL to use for connecting to Elasticsearch. Use a comma-separated list to support clustering (e.g., \"http://localhost:9200, http://localhost:9201\")."
msgstr ""
-msgid "The Vulnerability Report shows the results of the last successful pipeline run on the default branch."
-msgstr ""
-
msgid "The X509 Certificate to use when mutual TLS is required to communicate with the external authorization service. If left blank, the server certificate is still validated when accessing over HTTPS."
msgstr ""
@@ -33087,9 +33554,6 @@ msgstr ""
msgid "The default branch for this project has been changed. Please update your bookmarks."
msgstr ""
-msgid "The default expiration time for job artifacts. 0 for unlimited. The default unit is in seconds, but you can use other units, for example %{code_open}4 mins 2 sec%{code_close}, %{code_open}2h42min%{code_close}."
-msgstr ""
-
msgid "The dependency list details information about the components used within your project."
msgstr ""
@@ -33280,9 +33744,6 @@ msgstr ""
msgid "The merge conflicts for this merge request have already been resolved. Please return to the merge request."
msgstr ""
-msgid "The merge request can now be merged."
-msgstr ""
-
msgid "The metric must be one of %{metrics}."
msgstr ""
@@ -33658,7 +34119,7 @@ msgstr ""
msgid "There was a problem updating the keep latest artifacts setting."
msgstr ""
-msgid "There was an error %{message} todo."
+msgid "There was an error %{message} to-do item."
msgstr ""
msgid "There was an error adding a To Do."
@@ -33697,6 +34158,9 @@ msgstr ""
msgid "There was an error fetching projects"
msgstr ""
+msgid "There was an error fetching search autocomplete suggestions"
+msgstr ""
+
msgid "There was an error fetching stage total counts"
msgstr ""
@@ -34021,6 +34485,9 @@ msgstr ""
msgid "This field is required."
msgstr ""
+msgid "This form is disabled in preview"
+msgstr ""
+
msgid "This group"
msgstr ""
@@ -34042,9 +34509,6 @@ msgstr ""
msgid "This group is linked to a subscription"
msgstr ""
-msgid "This group, including all subgroups, projects and git repositories, will be reachable from only the specified IP address ranges."
-msgstr ""
-
msgid "This group, its subgroups and projects has been scheduled for removal on %{date}."
msgstr ""
@@ -34324,9 +34788,6 @@ msgstr ""
msgid "This user cannot be unlocked manually from GitLab"
msgstr ""
-msgid "This user does not have a pending request"
-msgstr ""
-
msgid "This user has an unconfirmed email address (%{email}). You may force a confirmation."
msgstr ""
@@ -34435,9 +34896,6 @@ msgstr ""
msgid "ThreatMonitoring|Packet Activity"
msgstr ""
-msgid "ThreatMonitoring|Policies"
-msgstr ""
-
msgid "ThreatMonitoring|Requests"
msgstr ""
@@ -34489,6 +34947,12 @@ msgstr ""
msgid "ThreatMonitoring|View documentation"
msgstr ""
+msgid "Threshold in bytes at which to compress Sidekiq job arguments."
+msgstr ""
+
+msgid "Threshold in bytes at which to reject Sidekiq jobs. Set this to 0 to if you don't want to limit Sidekiq jobs."
+msgstr ""
+
msgid "Throughput"
msgstr ""
@@ -34498,6 +34962,9 @@ msgstr ""
msgid "Time"
msgstr ""
+msgid "Time (in hours) that users are allowed to skip forced configuration of two-factor authentication."
+msgstr ""
+
msgid "Time Spent"
msgstr ""
@@ -34564,7 +35031,7 @@ msgstr ""
msgid "TimeTrackingEstimated|Est"
msgstr ""
-msgid "TimeTracking|%{startTag}Spent: %{endTag}%{timeSpentHumanReadable}"
+msgid "TimeTracking|%{spentStart}Spent: %{spentEnd}"
msgstr ""
msgid "TimeTracking|Estimated:"
@@ -34776,6 +35243,9 @@ msgstr ""
msgid "To access this domain create a new DNS record"
msgstr ""
+msgid "To add a custom suffix, set up a Service Desk email address. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "To add an SSH key you need to %{generate_link_start}generate one%{link_end} or use an %{existing_link_start}existing key%{link_end}."
msgstr ""
@@ -34797,13 +35267,16 @@ msgstr ""
msgid "To connect an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To continue using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
+msgstr ""
+
msgid "To continue, you need to select the link in the confirmation email we sent to verify your email address. If you didn't get our email, select %{strongStart}Resend confirmation email.%{strongEnd}"
msgstr ""
msgid "To define internal users, first enable new users set to external"
msgstr ""
-msgid "To enable Registration Features, make sure \"Enable service ping\" is checked."
+msgid "To enable Registration Features, first enable Service Ping."
msgstr ""
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
@@ -34830,7 +35303,7 @@ msgstr ""
msgid "To get started, use the link below to confirm your account."
msgstr ""
-msgid "To help improve GitLab and its user experience, GitLab will periodically collect usage information."
+msgid "To help improve GitLab and its user experience, GitLab periodically collects usage information."
msgstr ""
msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
@@ -34863,7 +35336,7 @@ msgstr ""
msgid "To preserve performance only %{strong_open}%{display_size} of %{real_size}%{strong_close} files are displayed."
msgstr ""
-msgid "To protect this issue's confidentiality, %{forkLink} and set the fork's visibility to private."
+msgid "To protect this issue's confidentiality, %{linkStart}fork this project%{linkEnd} and set the fork's visibility to private."
msgstr ""
msgid "To protect this issue's confidentiality, a private fork of this project was selected."
@@ -34896,12 +35369,15 @@ msgstr ""
msgid "To set up SAML authentication for your group through an identity provider like Azure, Okta, Onelogin, Ping Identity, or your custom SAML 2.0 provider:"
msgstr ""
-msgid "To set up this service:"
+msgid "To set up this integration:"
msgstr ""
msgid "To specify the notification level per project of a group you belong to, you need to visit project page and change notification level there."
msgstr ""
+msgid "To start using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
+msgstr ""
+
msgid "To unsubscribe from this issue, please paste the following link into your browser:"
msgstr ""
@@ -35488,9 +35964,6 @@ msgstr ""
msgid "Unable to fetch branches list, please close the form and try again"
msgstr ""
-msgid "Unable to fetch unscanned projects"
-msgstr ""
-
msgid "Unable to fetch vulnerable projects"
msgstr ""
@@ -35545,6 +36018,15 @@ msgstr ""
msgid "Unable to update this issue at this time."
msgstr ""
+msgid "Unapprove a merge request"
+msgstr ""
+
+msgid "Unapprove the current merge request."
+msgstr ""
+
+msgid "Unapproved the current merge request."
+msgstr ""
+
msgid "Unarchive project"
msgstr ""
@@ -35557,16 +36039,13 @@ msgstr ""
msgid "Unassigned"
msgstr ""
-msgid "Unauthenticated API request rate limit"
-msgstr ""
-
-msgid "Unauthenticated rate limit period in seconds"
+msgid "Unauthenticated API rate limit period in seconds"
msgstr ""
-msgid "Unauthenticated request rate limit"
+msgid "Unauthenticated requests"
msgstr ""
-msgid "Unauthenticated requests"
+msgid "Unauthenticated web rate limit period in seconds"
msgstr ""
msgid "Undo"
@@ -35668,18 +36147,6 @@ msgstr ""
msgid "Unresolved"
msgstr ""
-msgid "UnscannedProjects|15 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|30 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|5 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|60 or more days"
-msgstr ""
-
msgid "Unschedule job"
msgstr ""
@@ -35899,6 +36366,9 @@ msgstr ""
msgid "UsageQuota|%{help_link_start}Shared runners%{help_link_end} are disabled, so there are no limits set on pipeline usage"
msgstr ""
+msgid "UsageQuota|%{linkTitle} help link"
+msgstr ""
+
msgid "UsageQuota|%{percentageLeft} of purchased storage is available"
msgstr ""
@@ -35908,6 +36378,9 @@ msgstr ""
msgid "UsageQuota|Artifacts is a sum of build and pipeline artifacts."
msgstr ""
+msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
+msgstr ""
+
msgid "UsageQuota|Buy additional minutes"
msgstr ""
@@ -35917,9 +36390,21 @@ msgstr ""
msgid "UsageQuota|CI minutes usage by project"
msgstr ""
+msgid "UsageQuota|Code packages and container images."
+msgstr ""
+
msgid "UsageQuota|Current period usage"
msgstr ""
+msgid "UsageQuota|File attachments and smaller design graphics."
+msgstr ""
+
+msgid "UsageQuota|Git repository, managed by the Gitaly service."
+msgstr ""
+
+msgid "UsageQuota|Includes project registry, artifacts, packages, wiki, uploads and other items."
+msgstr ""
+
msgid "UsageQuota|Increase storage temporarily"
msgstr ""
@@ -35938,6 +36423,9 @@ msgstr ""
msgid "UsageQuota|Packages"
msgstr ""
+msgid "UsageQuota|Pipeline artifacts and job artifacts, created with CI/CD."
+msgstr ""
+
msgid "UsageQuota|Pipelines"
msgstr ""
@@ -35956,6 +36444,9 @@ msgstr ""
msgid "UsageQuota|Seats"
msgstr ""
+msgid "UsageQuota|Shared bits of code and text."
+msgstr ""
+
msgid "UsageQuota|Snippets"
msgstr ""
@@ -35965,6 +36456,12 @@ msgstr ""
msgid "UsageQuota|Storage"
msgstr ""
+msgid "UsageQuota|Storage type"
+msgstr ""
+
+msgid "UsageQuota|There is a known issue with Artifact storage where the total could be incorrect for some projects. More details and progress are available in %{warningLinkStart}the epic%{warningLinkEnd}."
+msgstr ""
+
msgid "UsageQuota|This is the total amount of storage used across your projects within this namespace."
msgstr ""
@@ -36004,6 +36501,9 @@ msgstr ""
msgid "UsageQuota|Usage"
msgstr ""
+msgid "UsageQuota|Usage Breakdown"
+msgstr ""
+
msgid "UsageQuota|Usage Quotas"
msgstr ""
@@ -36028,6 +36528,9 @@ msgstr ""
msgid "UsageQuota|Wiki"
msgstr ""
+msgid "UsageQuota|Wiki content."
+msgstr ""
+
msgid "UsageQuota|Wikis"
msgstr ""
@@ -36244,7 +36747,10 @@ msgstr ""
msgid "User Settings"
msgstr ""
-msgid "User and IP Rate Limits"
+msgid "User and IP rate limits"
+msgstr ""
+
+msgid "User does not have a pending request"
msgstr ""
msgid "User identity was successfully created."
@@ -36541,6 +37047,9 @@ msgstr ""
msgid "Users can launch a development environment from a GitLab browser tab when the %{linkStart}Gitpod%{linkEnd} integration is enabled."
msgstr ""
+msgid "Users can reactivate their account by signing in."
+msgstr ""
+
msgid "Users can render diagrams in AsciiDoc, Markdown, reStructuredText, and Textile documents using Kroki."
msgstr ""
@@ -36556,6 +37065,9 @@ msgstr ""
msgid "Users requesting access to"
msgstr ""
+msgid "Users to exclude from the rate limit"
+msgstr ""
+
msgid "Users were successfully added."
msgstr ""
@@ -36577,6 +37089,9 @@ msgstr ""
msgid "UsersSelect|Unassigned"
msgstr ""
+msgid "Uses GitLab as a lightweight alternative to Sentry."
+msgstr ""
+
msgid "Using %{code_start}::%{code_end} denotes a %{link_start}scoped label set%{link_end}"
msgstr ""
@@ -36607,10 +37122,7 @@ msgstr ""
msgid "Value Stream Analytics can help you determine your team’s velocity"
msgstr ""
-msgid "Value Stream Analytics gives an overview of how much time it takes to go from idea to production in your project."
-msgstr ""
-
-msgid "Value may contain a variable reference"
+msgid "Value might contain a variable reference"
msgstr ""
msgid "Value stream"
@@ -36676,10 +37188,10 @@ msgstr ""
msgid "ValueStream|The Default Value Stream cannot be deleted"
msgstr ""
-msgid "Variable"
+msgid "Values that contain the %{codeStart}$%{codeEnd} character can be considered a variable reference and expanded. %{docsLinkStart}Learn more.%{docsLinkEnd}"
msgstr ""
-msgid "Variable references indicated by %{codeStart}$%{codeEnd} may be expanded. If this is not what you want, consider %{docsLinkStart}using a workaround to prevent expansion%{docsLinkEnd}."
+msgid "Variable"
msgstr ""
msgid "Variable will be masked in job logs."
@@ -37081,6 +37593,9 @@ msgstr ""
msgid "Vulnerability|Evidence"
msgstr ""
+msgid "Vulnerability|False positive detected"
+msgstr ""
+
msgid "Vulnerability|File"
msgstr ""
@@ -37123,6 +37638,9 @@ msgstr ""
msgid "Vulnerability|Status"
msgstr ""
+msgid "Vulnerability|The scanner determined this vulnerability to be a false positive. Verify the evaluation before changing its status. %{linkStart}Learn more about false positive detection.%{linkEnd}"
+msgstr ""
+
msgid "Vulnerability|The unmodified response is the original response that had no mutations done to the request"
msgstr ""
@@ -37447,9 +37965,6 @@ msgstr ""
msgid "Welcome to GitLab,%{br_tag}%{name}!"
msgstr ""
-msgid "Welcome to the guided GitLab tour"
-msgstr ""
-
msgid "Welcome, %{name}!"
msgstr ""
@@ -37468,9 +37983,6 @@ msgstr ""
msgid "What are you searching for?"
msgstr ""
-msgid "What describes you best?"
-msgstr ""
-
msgid "What does this command do?"
msgstr ""
@@ -37492,13 +38004,13 @@ msgstr ""
msgid "What is your job title? (optional)"
msgstr ""
-msgid "What will you use this group for?"
+msgid "What templates can I create?"
msgstr ""
-msgid "What's new"
+msgid "What will you use this group for?"
msgstr ""
-msgid "What’s your experience level?"
+msgid "What's new"
msgstr ""
msgid "When a deployment job is successful, skip older deployment jobs that are still pending."
@@ -37510,6 +38022,9 @@ msgstr ""
msgid "When an event in GitLab triggers a webhook, you can use the request details to figure out if something went wrong."
msgstr ""
+msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+msgstr ""
+
msgid "When inactive, an external authentication provider must be used."
msgstr ""
@@ -37532,6 +38047,9 @@ msgstr ""
msgid "When:"
msgstr ""
+msgid "Which API requests are affected?"
+msgstr ""
+
msgid "While it's rare to have no vulnerabilities, it can happen. In any event, we ask that you please double check your settings to make sure you've set up your dashboard correctly."
msgstr ""
@@ -37811,6 +38329,9 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|Work Items"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -37886,6 +38407,9 @@ msgstr ""
msgid "You are already a member of this %{member_source}."
msgstr ""
+msgid "You are already impersonating another user"
+msgstr ""
+
msgid "You are an admin, which means granting access to %{client_name} will allow them to interact with GitLab as an admin as well. Proceed with caution."
msgstr ""
@@ -37988,6 +38512,9 @@ msgstr ""
msgid "You can also use project access tokens with Git to authenticate over HTTP(S). %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "You can always change your URL later"
+msgstr ""
+
msgid "You can always edit this later"
msgstr ""
@@ -38144,10 +38671,10 @@ msgstr ""
msgid "You can’t %{tag_start}edit%{tag_end} files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
-msgid "You could not create a new trigger."
+msgid "You can’t edit files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
-msgid "You didn't renew your subscription for %{strong}%{namespace_name}%{strong_close} so it was downgraded to the free plan."
+msgid "You could not create a new trigger."
msgstr ""
msgid "You do not have any subscriptions yet"
@@ -38315,6 +38842,12 @@ msgstr ""
msgid "You must provide your current password in order to change it."
msgstr ""
+msgid "You must sign in to search for specific projects."
+msgstr ""
+
+msgid "You must sign in to search for specific terms."
+msgstr ""
+
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
@@ -38342,6 +38875,9 @@ msgstr ""
msgid "You need to upload a GitLab project export archive (ending in .gz)."
msgstr ""
+msgid "You need to verify your primary email first before enabling Two-Factor Authentication."
+msgstr ""
+
msgid "You successfully declined the invitation"
msgstr ""
@@ -38450,10 +38986,10 @@ msgstr ""
msgid "Your %{host} account was signed in to from a new location"
msgstr ""
-msgid "Your %{strong}%{plan_name}%{strong_close} subscription for %{strong}%{namespace_name}%{strong_close} will expire on %{strong}%{expires_on}%{strong_close}."
+msgid "Your %{strong}%{plan_name}%{strong_close} subscription expires on %{strong}%{expires_on}%{strong_close}. After that date, you cannot create issues or merge requests, or use many other features."
msgstr ""
-msgid "Your %{strong}%{plan_name}%{strong_close} subscription will expire on %{strong}%{expires_on}%{strong_close}. After that, you will not be able to create issues or merge requests as well as many other features."
+msgid "Your %{strong}%{plan_name}%{strong_close} subscription for %{strong}%{namespace_name}%{strong_close} will expire on %{strong}%{expires_on}%{strong_close}."
msgstr ""
msgid "Your CI/CD configuration syntax is invalid. View Lint tab for more details."
@@ -38477,7 +39013,7 @@ msgstr ""
msgid "Your GPG keys (%{count})"
msgstr ""
-msgid "Your GitLab account has been locked due to an excessive amount of unsuccessful sign in attempts. Your account will automatically unlock in %{duration} or you may click the link below to unlock now."
+msgid "Your GitLab account has been locked due to an excessive number of unsuccessful sign in attempts. You can wait for your account to automatically unlock in %{duration} or you can click the link below to unlock now."
msgstr ""
msgid "Your GitLab account request has been approved!"
@@ -38588,6 +39124,9 @@ msgstr ""
msgid "Your commit email is used for web based operations, such as edits and merges."
msgstr ""
+msgid "Your current password is required to register a two-factor authenticator app."
+msgstr ""
+
msgid "Your dashboard has been copied. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
@@ -38687,6 +39226,9 @@ msgstr ""
msgid "Your project limit is %{limit} projects! Please contact your administrator to increase it"
msgstr ""
+msgid "Your project will be created at:"
+msgstr ""
+
msgid "Your projects"
msgstr ""
@@ -38726,11 +39268,9 @@ msgstr ""
msgid "Your subscription expired!"
msgstr ""
-msgid "Your subscription has been downgraded."
-msgstr ""
-
-msgid "Your subscription will expire in %{remaining_days}."
-msgstr ""
+msgid "Your subscription will expire in %{remaining_days} day."
+msgid_plural "Your subscription will expire in %{remaining_days} days."
+msgstr[0] ""
msgid "Your username is %{username}."
msgstr ""
@@ -38935,6 +39475,9 @@ msgstr ""
msgid "cannot merge"
msgstr ""
+msgid "cannot not be used for user namespace"
+msgstr ""
+
msgid "ciReport|%{degradedNum} degraded"
msgstr ""
@@ -39257,6 +39800,9 @@ msgstr ""
msgid "created %{timeAgo}"
msgstr ""
+msgid "created %{timeAgo} by %{author}"
+msgstr ""
+
msgid "created by"
msgstr ""
@@ -39300,9 +39846,6 @@ msgstr ""
msgid "does not have a supported extension. Only %{extension_list} are supported"
msgstr ""
-msgid "domain is not authorized for sign-up."
-msgstr ""
-
msgid "download it"
msgstr ""
@@ -39319,17 +39862,13 @@ msgstr ""
msgid "email '%{email}' is not a verified email."
msgstr ""
-msgid "email does not match the allowed domain of %{email_domains}"
-msgid_plural "email does not match the allowed domains: %{email_domains}"
-msgstr[0] ""
-
msgid "enabled"
msgstr ""
msgid "encrypted: needs to be a :required, :optional or :migrating!"
msgstr ""
-msgid "ending with MIME type format is not allowed."
+msgid "ending with a reserved file extension is not allowed."
msgstr ""
msgid "entries cannot be larger than 255 characters"
@@ -39353,6 +39892,9 @@ msgstr ""
msgid "estimateCommand|%{slash_command} overwrites the total estimated time."
msgstr ""
+msgid "example.com"
+msgstr ""
+
msgid "exceeds the limit of %{bytes} bytes"
msgstr ""
@@ -39402,9 +39944,6 @@ msgstr ""
msgid "fork"
msgstr ""
-msgid "fork this project"
-msgstr ""
-
msgid "from"
msgstr ""
@@ -39412,6 +39951,9 @@ msgid "from %d job"
msgid_plural "from %d jobs"
msgstr[0] ""
+msgid "frontmatter"
+msgstr ""
+
msgid "group"
msgstr ""
@@ -39439,6 +39981,9 @@ msgstr ""
msgid "has been completed."
msgstr ""
+msgid "has too deep level of nesting"
+msgstr ""
+
msgid "help"
msgstr ""
@@ -39472,9 +40017,21 @@ msgstr ""
msgid "in"
msgstr ""
+msgid "in Infrastructure :: Kubernetes clusters"
+msgstr ""
+
+msgid "in all GitLab"
+msgstr ""
+
+msgid "in group"
+msgstr ""
+
msgid "in group %{link_to_group}"
msgstr ""
+msgid "in project"
+msgstr ""
+
msgid "in project %{link_to_project}"
msgstr ""
@@ -39515,16 +40072,19 @@ msgstr ""
msgid "is not a valid X509 certificate."
msgstr ""
-msgid "is not allowed since the group is not top-level group."
+msgid "is not allowed for sign-up."
msgstr ""
-msgid "is not allowed. Try again with a different email address, or contact your GitLab admin."
+msgid "is not allowed for this group."
msgstr ""
-msgid "is not allowed. We do not currently support project-level iterations"
+msgid "is not allowed for this project."
+msgstr ""
+
+msgid "is not allowed since the group is not top-level group."
msgstr ""
-msgid "is not from an allowed domain."
+msgid "is not allowed. We do not currently support project-level iterations"
msgstr ""
msgid "is not in the group enforcing Group Managed Account"
@@ -39617,6 +40177,9 @@ msgstr ""
msgid "log in"
msgstr ""
+msgid "managed"
+msgstr ""
+
msgid "manual"
msgstr ""
@@ -39663,6 +40226,9 @@ msgstr ""
msgid "mrWidget| Please restore it or use a different %{missingBranchName} branch"
msgstr ""
+msgid "mrWidget|%{linkStart}Set up now%{linkEnd} to analyze your source code for known security vulnerabilities."
+msgstr ""
+
msgid "mrWidget|%{mergeError}."
msgstr ""
@@ -39742,6 +40308,9 @@ msgid "mrWidget|Closes issue"
msgid_plural "mrWidget|Closes issues"
msgstr[0] ""
+msgid "mrWidget|Create issue to resolve all threads"
+msgstr ""
+
msgid "mrWidget|Delete source branch"
msgstr ""
@@ -39751,12 +40320,18 @@ msgstr ""
msgid "mrWidget|Did not close"
msgstr ""
+msgid "mrWidget|Dismiss"
+msgstr ""
+
msgid "mrWidget|Email patches"
msgstr ""
msgid "mrWidget|Failed to load deployment statistics"
msgstr ""
+msgid "mrWidget|Hide %{widget} details"
+msgstr ""
+
msgid "mrWidget|If the %{missingBranchName} branch exists in your local repository, you can merge this merge request manually using the command line"
msgstr ""
@@ -39851,9 +40426,6 @@ msgstr ""
msgid "mrWidget|Request to merge"
msgstr ""
-msgid "mrWidget|Resolve all threads in new issue"
-msgstr ""
-
msgid "mrWidget|Resolve conflicts"
msgstr ""
@@ -39869,6 +40441,9 @@ msgstr ""
msgid "mrWidget|Revoke approval"
msgstr ""
+msgid "mrWidget|SAST and Secret Detection is not enabled."
+msgstr ""
+
msgid "mrWidget|Set by %{merge_author} to be added to the merge train when the pipeline succeeds"
msgstr ""
@@ -39878,6 +40453,9 @@ msgstr ""
msgid "mrWidget|Set by %{merge_author} to start a merge train when the pipeline succeeds"
msgstr ""
+msgid "mrWidget|Show %{widget} details"
+msgstr ""
+
msgid "mrWidget|The changes were merged into"
msgstr ""
@@ -39890,6 +40468,9 @@ msgstr ""
msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure, or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
msgstr ""
+msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure."
+msgstr ""
+
msgid "mrWidget|The source branch has been deleted"
msgstr ""
@@ -39932,6 +40513,9 @@ msgstr ""
msgid "mrWidget|You can merge after removing denied licenses"
msgstr ""
+msgid "mrWidget|You can only merge once this merge request is approved."
+msgstr ""
+
msgid "mrWidget|Your password"
msgstr ""
@@ -39968,6 +40552,9 @@ msgstr ""
msgid "must be less than the limit of %{tag_limit} tags"
msgstr ""
+msgid "must be set for a project namespace"
+msgstr ""
+
msgid "must be unique by status and elapsed time within a policy"
msgstr ""
@@ -40075,6 +40662,9 @@ msgstr ""
msgid "pipeline"
msgstr ""
+msgid "pipeline schedules documentation"
+msgstr ""
+
msgid "pod_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
msgstr ""
@@ -40122,16 +40712,25 @@ msgstr ""
msgid "project name"
msgstr ""
+msgid "project namespace cannot be the parent of another namespace"
+msgstr ""
+
msgid "projects"
msgstr ""
msgid "quick actions"
msgstr ""
-msgid "reCAPTCHA Private Key"
+msgid "reCAPTCHA"
+msgstr ""
+
+msgid "reCAPTCHA helps prevent credential stuffing."
msgstr ""
-msgid "reCAPTCHA Site Key"
+msgid "reCAPTCHA private key"
+msgstr ""
+
+msgid "reCAPTCHA site key"
msgstr ""
msgid "recent activity"
@@ -40357,6 +40956,9 @@ msgstr ""
msgid "user avatar"
msgstr ""
+msgid "user namespace cannot be the parent of another namespace"
+msgstr ""
+
msgid "user preferences"
msgstr ""
@@ -40448,3 +41050,9 @@ msgstr ""
msgid "your settings"
msgstr ""
+msgid "{group}"
+msgstr ""
+
+msgid "{project}"
+msgstr ""
+
diff --git a/locale/bg/gitlab.po b/locale/bg/gitlab.po
index 6883f117fb0..18dfcc1b501 100644
--- a/locale/bg/gitlab.po
+++ b/locale/bg/gitlab.po
@@ -14,10 +14,7 @@ msgstr ""
"X-Crowdin-Language: bg\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-09-01 22:32\n"
-
-msgid " %{name}, confirm your email address now! "
-msgstr ""
+"PO-Revision-Date: 2021-10-04 20:20\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -92,6 +89,16 @@ msgstr ""
msgid "#general, #development"
msgstr ""
+msgid "%d Alert"
+msgid_plural "%d Alerts"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d Alert:"
+msgid_plural "%d Alerts:"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d Approval"
msgid_plural "%d Approvals"
msgstr[0] ""
@@ -455,7 +462,10 @@ msgstr ""
msgid "%{code_open}Protected:%{code_close} Only exposed to protected branches or tags."
msgstr ""
-msgid "%{commit_author_link} authored %{commit_timeago}"
+msgid "%{commit_author_link} authored %{commit_authored_timeago}"
+msgstr ""
+
+msgid "%{commit_author_link} authored %{commit_authored_timeago} and %{commit_committer_avatar} %{commit_committer_link} committed %{commit_committer_timeago}"
msgstr ""
msgid "%{completedCount} completed weight"
@@ -549,6 +559,15 @@ msgstr ""
msgid "%{doc_link_start}Advanced search%{doc_link_end} is enabled."
msgstr ""
+msgid "%{docs_link_start}Learn about visibility levels.%{docs_link_end}"
+msgstr ""
+
+msgid "%{docs_link_start}What is Large File Storage?%{docs_link_end}"
+msgstr ""
+
+msgid "%{docs_link_start}What is two-factor authentication?%{docs_link_end}"
+msgstr ""
+
msgid "%{due_date} (Past due)"
msgstr ""
@@ -621,9 +640,6 @@ msgstr ""
msgid "%{issueType} actions"
msgstr ""
-msgid "%{issuesCount} issues with a limit of %{maxIssueCount}"
-msgstr ""
-
msgid "%{issuesSize} with a limit of %{maxIssueCount}"
msgstr ""
@@ -681,6 +697,12 @@ msgstr ""
msgid "%{label_for_message} unavailable"
msgstr ""
+msgid "%{learn_more_link}."
+msgstr ""
+
+msgid "%{lessThan} 1 hour"
+msgstr ""
+
msgid "%{lets_encrypt_link_start}Let's Encrypt%{lets_encrypt_link_end} is a free, automated, and open certificate authority (CA) that issues digital certificates to enable HTTPS (SSL/TLS) for sites."
msgstr ""
@@ -693,15 +715,15 @@ msgstr ""
msgid "%{link_start}Learn more%{link_end} about roles."
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
-msgstr ""
-
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
msgstr ""
msgid "%{link_start}Start the title with %{draft_snippet}%{link_end} to prevent a merge request that is a work in progress from being merged before it's ready."
msgstr ""
+msgid "%{link_start}What information does GitLab Inc. collect?%{link_end}"
+msgstr ""
+
msgid "%{listToShow}, and %{awardsListLength} more"
msgstr ""
@@ -854,7 +876,7 @@ msgid_plural "%{securityScanner} results are not available because a pipeline ha
msgstr[0] ""
msgstr[1] ""
-msgid "%{service_ping_link_start}Learn more%{service_ping_link_end} about what information is shared with GitLab Inc."
+msgid "%{service_ping_link_start}What information is shared with GitLab Inc.?%{service_ping_link_end}"
msgstr ""
msgid "%{size} %{unit}"
@@ -890,6 +912,9 @@ msgstr ""
msgid "%{state} epics"
msgstr ""
+msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
+msgstr ""
+
msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
msgstr ""
@@ -949,11 +974,6 @@ msgstr ""
msgid "%{template_project_id} is unknown or invalid"
msgstr ""
-msgid "%{text} %{files}"
-msgid_plural "%{text} %{files} files"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%{text} is available"
msgstr ""
@@ -1038,9 +1058,6 @@ msgstr ""
msgid "%{wildcards_link_start}Wildcards%{wildcards_link_end} such as %{code_tag_start}v*%{code_tag_end} or %{code_tag_start}*-release%{code_tag_end} are supported."
msgstr ""
-msgid "&lt; 1 hour"
-msgstr ""
-
msgid "'%{data}' at %{location} does not match format: %{format}"
msgstr ""
@@ -1124,9 +1141,6 @@ msgstr ""
msgid "(we need your current password to confirm your changes)"
msgstr ""
-msgid "* * * * *"
-msgstr ""
-
msgid "+ %{amount} more"
msgstr ""
@@ -1193,10 +1207,10 @@ msgstr ""
msgid "."
msgstr ""
-msgid "0 bytes"
+msgid "/"
msgstr ""
-msgid "0 for unlimited, only effective with remote storage enabled."
+msgid "0 bytes"
msgstr ""
msgid "0t1DgySidms"
@@ -1326,6 +1340,9 @@ msgstr ""
msgid "1000+"
msgstr ""
+msgid "192.168.0.0/24"
+msgstr ""
+
msgid "1st contribution!"
msgstr ""
@@ -1479,9 +1496,6 @@ msgstr ""
msgid "A plain HTML site that uses Netlify for CI/CD instead of GitLab, but still with all the other great GitLab features"
msgstr ""
-msgid "A plain-text response to show to clients that hit the rate limit."
-msgstr ""
-
msgid "A platform value can be web, mob or app."
msgstr ""
@@ -1563,7 +1577,7 @@ msgstr ""
msgid "APIFuzzing|Configure HTTP basic authentication values. Other authentication methods are supported. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
+msgid "APIFuzzing|Customize your project's API fuzzing configuration options and copy the code snippet to your .gitlab-ci.yml file to apply any changes. Note that this tool does not reflect or update your .gitlab-ci.yml file automatically. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
msgstr ""
msgid "APIFuzzing|Enable authentication"
@@ -1626,9 +1640,6 @@ msgstr ""
msgid "APIFuzzing|To prevent a security leak, authentication info must be added as a %{ciVariablesLinkStart}CI variable%{ciVariablesLinkEnd}. As a user with maintainer access rights, you can manage CI variables in the %{ciSettingsLinkStart}Settings%{ciSettingsLinkEnd} area."
msgstr ""
-msgid "APIFuzzing|Use this tool to generate API fuzzing configuration YAML to copy into your .gitlab-ci.yml file. This tool does not reflect or update your .gitlab-ci.yml file automatically."
-msgstr ""
-
msgid "APIFuzzing|Username for basic authentication"
msgstr ""
@@ -1680,9 +1691,6 @@ msgstr ""
msgid "Abuse reports notification email"
msgstr ""
-msgid "Abuse reports will be sent to this address if it is set. Abuse reports are always available in the admin area."
-msgstr ""
-
msgid "Accept invitation"
msgstr ""
@@ -1719,12 +1727,18 @@ msgstr ""
msgid "Access granted"
msgstr ""
+msgid "Access key ID"
+msgstr ""
+
msgid "Access requests"
msgstr ""
msgid "Access to '%{classification_label}' not allowed"
msgstr ""
+msgid "Access tokens expire after 2 hours. A refresh token may be used at any time to generate a new access token. Non-expiring access tokens are deprecated. Clear this setting to enable backward compatibility."
+msgstr ""
+
msgid "AccessDropdown|Deploy Keys"
msgstr ""
@@ -2037,6 +2051,9 @@ msgstr ""
msgid "Add new directory"
msgstr "ДобавÑне на нова папка"
+msgid "Add new service account"
+msgstr ""
+
msgid "Add or remove previously merged commits"
msgstr ""
@@ -2274,6 +2291,9 @@ msgstr ""
msgid "AdminArea|Features"
msgstr ""
+msgid "AdminArea|Get security updates from GitLab and stay up to date"
+msgstr ""
+
msgid "AdminArea|Groups"
msgstr ""
@@ -2313,6 +2333,12 @@ msgstr ""
msgid "AdminArea|Reporter"
msgstr ""
+msgid "AdminArea|Sign up for the GitLab Security Newsletter to get notified for security updates."
+msgstr ""
+
+msgid "AdminArea|Sign up for the GitLab newsletter"
+msgstr ""
+
msgid "AdminArea|Stop all jobs"
msgstr ""
@@ -2382,9 +2408,15 @@ msgstr ""
msgid "AdminSettings|Disable public access to Pages sites"
msgstr ""
+msgid "AdminSettings|Display a banner on merge requests in projects with no pipelines to initiate steps to add a .gitlab-ci.yml file."
+msgstr ""
+
msgid "AdminSettings|Domain verification is an essential security measure for public GitLab sites. Users are required to demonstrate they control a domain before it is enabled. %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "AdminSettings|Enable pipeline suggestion banner"
+msgstr ""
+
msgid "AdminSettings|Enable shared runners for new projects"
msgstr ""
@@ -2856,10 +2888,10 @@ msgstr ""
msgid "Admin|Quarterly reconciliation will occur on %{qrtlyDate}"
msgstr ""
-msgid "Admin|The number of max seats used for your namespace is currently exceeding the number of seats in your subscription. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgid "Admin|The number of max seats in your namespace exceeds the number of seats in your subscription. On %{qrtlyDate}, quarterly reconciliation occurs and you are automatically billed a prorated amount for the overage. No action is needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice. For more information about the timing of the invoicing process, view the documentation."
msgstr ""
-msgid "Admin|The number of maximum users for your instance is currently exceeding the number of users in license. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgid "Admin|The number of max users in your instance exceeds the number of users in your license. On %{qrtlyDate}, quarterly reconciliation occurs and you are automatically billed a prorated amount for the overage. No action is needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice. For more information about the timing of the invoicing process, view the documentation."
msgstr ""
msgid "Admin|View pending user approvals"
@@ -2880,9 +2912,6 @@ msgstr ""
msgid "Advanced export options"
msgstr ""
-msgid "Advanced permissions, Large File Storage and Two-Factor authentication settings."
-msgstr ""
-
msgid "After a successful password update you will be redirected to login screen."
msgstr ""
@@ -2901,13 +2930,14 @@ msgstr ""
msgid "After you've reviewed these contribution guidelines, you'll be all set to"
msgstr ""
+msgid "Akismet"
+msgstr ""
+
msgid "Akismet API Key"
msgstr ""
-msgid "Alert"
-msgid_plural "Alerts"
-msgstr[0] ""
-msgstr[1] ""
+msgid "Akismet helps prevent the creation of spam issues in public projects."
+msgstr ""
msgid "AlertManagement|Acknowledged"
msgstr ""
@@ -3263,6 +3293,9 @@ msgstr ""
msgid "All (default)"
msgstr ""
+msgid "All GitLab"
+msgstr ""
+
msgid "All Members"
msgstr ""
@@ -3377,6 +3410,9 @@ msgstr ""
msgid "Allow this secondary node to replicate content on Object Storage"
msgstr ""
+msgid "Allow use of licensed EE features"
+msgstr ""
+
msgid "Allow users to dismiss the broadcast message"
msgstr ""
@@ -3452,9 +3488,6 @@ msgstr ""
msgid "Amazon authentication is not %{link_start}correctly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
-msgid "Amount of time (in hours) that users are allowed to skip forced configuration of two-factor authentication"
-msgstr ""
-
msgid "An %{link_start}alert%{link_end} with the same fingerprint is already open. To change the status of this alert, resolve the linked alert."
msgstr ""
@@ -3515,12 +3548,6 @@ msgstr ""
msgid "An error occurred when removing the label."
msgstr ""
-msgid "An error occurred when toggling the notification subscription"
-msgstr ""
-
-msgid "An error occurred when updating the issue weight"
-msgstr ""
-
msgid "An error occurred when updating the title"
msgstr ""
@@ -3569,6 +3596,9 @@ msgstr ""
msgid "An error occurred while enabling Service Desk."
msgstr ""
+msgid "An error occurred while fetching Markdown preview"
+msgstr ""
+
msgid "An error occurred while fetching ancestors"
msgstr ""
@@ -3599,9 +3629,6 @@ msgstr ""
msgid "An error occurred while fetching label colors."
msgstr ""
-msgid "An error occurred while fetching markdown preview"
-msgstr ""
-
msgid "An error occurred while fetching participants"
msgstr ""
@@ -3617,9 +3644,6 @@ msgstr ""
msgid "An error occurred while fetching reference"
msgstr ""
-msgid "An error occurred while fetching sidebar data"
-msgstr ""
-
msgid "An error occurred while fetching tags. Retry the search."
msgstr ""
@@ -3695,6 +3719,9 @@ msgstr ""
msgid "An error occurred while loading merge requests."
msgstr ""
+msgid "An error occurred while loading projects."
+msgstr ""
+
msgid "An error occurred while loading the Needs tab."
msgstr ""
@@ -3929,12 +3956,6 @@ msgstr ""
msgid "Any Milestone"
msgstr ""
-msgid "Any branch"
-msgstr ""
-
-msgid "Any eligible user"
-msgstr ""
-
msgid "Any encrypted tokens"
msgstr ""
@@ -3953,6 +3974,9 @@ msgstr ""
msgid "Any namespace"
msgstr ""
+msgid "App Engine description and apps that are suitable for this deployment target"
+msgstr ""
+
msgid "App ID"
msgstr ""
@@ -4101,6 +4125,11 @@ msgstr ""
msgid "Apply"
msgstr ""
+msgid "Apply %d suggestion"
+msgid_plural "Apply %d suggestions"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Apply a label"
msgstr ""
@@ -4110,13 +4139,10 @@ msgstr ""
msgid "Apply suggestion"
msgstr ""
-msgid "Apply suggestions"
-msgstr ""
-
msgid "Apply template"
msgstr ""
-msgid "Apply this approval rule to any branch or a specific protected branch."
+msgid "Apply this approval rule to all branches or a specific protected branch."
msgstr ""
msgid "Applying"
@@ -4259,9 +4285,6 @@ msgstr ""
msgid "ApprovalSettings|Prevent editing approval rules in projects and merge requests."
msgstr ""
-msgid "ApprovalSettings|Prevent editing approval rules in projects and merge requests. "
-msgstr ""
-
msgid "ApprovalSettings|Remove all approvals when commits are added to the source branch."
msgstr ""
@@ -4277,6 +4300,9 @@ msgstr ""
msgid "ApprovalSettings|This setting is configured at the instance level and can only be changed by an administrator."
msgstr ""
+msgid "ApprovalSettings|This setting is configured in %{groupName} and can only be changed by an administrator or group owner."
+msgstr ""
+
msgid "ApprovalStatusTooltip|Adheres to separation of duties"
msgstr ""
@@ -4763,9 +4789,6 @@ msgstr ""
msgid "Authenticated API rate limit period in seconds"
msgstr ""
-msgid "Authenticated API request rate limit"
-msgstr ""
-
msgid "Authenticated API requests"
msgstr ""
@@ -4775,10 +4798,10 @@ msgstr ""
msgid "Authenticated Git LFS request rate limit"
msgstr ""
-msgid "Authenticated web rate limit period in seconds"
+msgid "Authenticated Git LFS requests"
msgstr ""
-msgid "Authenticated web request rate limit"
+msgid "Authenticated web rate limit period in seconds"
msgstr ""
msgid "Authenticated web requests"
@@ -5156,9 +5179,6 @@ msgstr ""
msgid "Below you will find all the groups that are public."
msgstr ""
-msgid "Beta"
-msgstr ""
-
msgid "Bi-weekly code coverage"
msgstr ""
@@ -5398,6 +5418,21 @@ msgstr ""
msgid "Board scope affects which issues are displayed for anyone who visits this board"
msgstr ""
+msgid "BoardNewEpic|Groups"
+msgstr ""
+
+msgid "BoardNewEpic|Loading groups"
+msgstr ""
+
+msgid "BoardNewEpic|No matching results"
+msgstr ""
+
+msgid "BoardNewEpic|Search groups"
+msgstr ""
+
+msgid "BoardNewEpic|Select a group"
+msgstr ""
+
msgid "BoardNewIssue|No matching results"
msgstr ""
@@ -5475,6 +5510,9 @@ msgstr ""
msgid "Boards|An error occurred while creating the list. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching child groups. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching group projects. Please try again."
msgstr ""
@@ -5807,6 +5845,9 @@ msgstr ""
msgid "Bulk update"
msgstr ""
+msgid "BulkImports|Re-import creates a new group. It does not sync with the existing group."
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -5816,6 +5857,9 @@ msgstr ""
msgid "BulkImport|From source group"
msgstr ""
+msgid "BulkImport|Group import history"
+msgstr ""
+
msgid "BulkImport|Import failed: Destination cannot be a subgroup of the source group. Change the destination and try again."
msgstr ""
@@ -5828,9 +5872,18 @@ msgstr ""
msgid "BulkImport|Importing the group failed"
msgstr ""
+msgid "BulkImport|Last imported to %{link}"
+msgstr ""
+
msgid "BulkImport|Name already exists."
msgstr ""
+msgid "BulkImport|New group"
+msgstr ""
+
+msgid "BulkImport|No history is available"
+msgstr ""
+
msgid "BulkImport|No parent"
msgstr ""
@@ -5843,6 +5896,9 @@ msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} matching filter \"%{filter}\" from %{link}"
msgstr ""
+msgid "BulkImport|Source group"
+msgstr ""
+
msgid "BulkImport|To new group"
msgstr ""
@@ -5852,6 +5908,9 @@ msgstr ""
msgid "BulkImport|You have no groups to import"
msgstr ""
+msgid "BulkImport|Your imported groups will appear here."
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -6094,6 +6153,9 @@ msgstr ""
msgid "Can be manually deployed to"
msgstr ""
+msgid "Can be overridden in each project."
+msgstr ""
+
msgid "Can create groups:"
msgstr ""
@@ -6196,6 +6258,9 @@ msgstr ""
msgid "Cancelling Preview"
msgstr ""
+msgid "Cannot assign a confidential epic to a non-confidential issue. Make the issue confidential and try again"
+msgstr ""
+
msgid "Cannot be assigned to other projects."
msgstr ""
@@ -6247,9 +6312,6 @@ msgstr ""
msgid "Cannot refer to a group %{timebox_type} by an internal id!"
msgstr ""
-msgid "Cannot set confidential epic for a non-confidential issue"
-msgstr ""
-
msgid "Cannot show preview. For previews on sketch files, they must have the file format introduced by Sketch version 43 and above."
msgstr ""
@@ -6487,15 +6549,15 @@ msgstr ""
msgid "Check out, review, and merge locally"
msgstr ""
-msgid "Check the %{docs_link_start}documentation%{docs_link_end}."
-msgstr ""
-
msgid "Check the current instance configuration "
msgstr ""
msgid "Check the elasticsearch.log file to debug why the migration was halted and make any changes before retrying the migration. When you fix the cause of the failure, click \"Retry migration\", and the migration will be scheduled to be retried in the background."
msgstr ""
+msgid "Check with your administrator."
+msgstr ""
+
msgid "Check your Docker images for known vulnerabilities."
msgstr ""
@@ -6526,6 +6588,9 @@ msgstr ""
msgid "Checkout"
msgstr ""
+msgid "Checkout|$%{selectedPlanPrice} per 10 GB storage per pack"
+msgstr ""
+
msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 minutes"
msgstr ""
@@ -6546,17 +6611,23 @@ msgstr ""
msgid "Checkout|%{name}'s GitLab subscription"
msgstr ""
-msgid "Checkout|%{selectedPlanText} plan"
+msgid "Checkout|%{name}'s storage subscription"
msgstr ""
-msgid "Checkout|%{startDate} - %{endDate}"
+msgid "Checkout|%{quantity} GB of storage"
msgstr ""
-msgid "Checkout|%{totalCiMinutes} CI minute"
-msgid_plural "Checkout|%{totalCiMinutes} CI minutes"
+msgid "Checkout|%{quantity} storage pack"
+msgid_plural "Checkout|%{quantity} storage packs"
msgstr[0] ""
msgstr[1] ""
+msgid "Checkout|%{selectedPlanText} plan"
+msgstr ""
+
+msgid "Checkout|%{startDate} - %{endDate}"
+msgstr ""
+
msgid "Checkout|%{totalCiMinutes} CI minutes"
msgstr ""
@@ -6632,6 +6703,9 @@ msgstr ""
msgid "Checkout|Failed to register credit card. Please try again."
msgstr ""
+msgid "Checkout|GB"
+msgstr ""
+
msgid "Checkout|GitLab group"
msgstr ""
@@ -6668,6 +6742,9 @@ msgstr ""
msgid "Checkout|State"
msgstr ""
+msgid "Checkout|Storage packs"
+msgstr ""
+
msgid "Checkout|Street address"
msgstr ""
@@ -6689,6 +6766,9 @@ msgstr ""
msgid "Checkout|Total minutes: %{quantity}"
msgstr ""
+msgid "Checkout|Total storage: %{quantity} GB"
+msgstr ""
+
msgid "Checkout|Users"
msgstr ""
@@ -6698,16 +6778,25 @@ msgstr ""
msgid "Checkout|Your organization"
msgstr ""
+msgid "Checkout|Your storage subscription has the same term as your main subscription, and the price is prorated accordingly."
+msgstr ""
+
msgid "Checkout|Your subscription will be applied to this group"
msgstr ""
msgid "Checkout|Zip code"
msgstr ""
+msgid "Checkout|a storage subscription"
+msgstr ""
+
msgid "Checkout|company or team"
msgstr ""
-msgid "Checkout|x 1,000 minutes per pack = %{strong}"
+msgid "Checkout|minutes"
+msgstr ""
+
+msgid "Checkout|x %{quantity} %{units} per pack ="
msgstr ""
msgid "Cherry-pick this commit"
@@ -7064,6 +7153,9 @@ msgstr ""
msgid "CloneIssue|Cannot clone issue to target project as it is pending deletion."
msgstr ""
+msgid "CloneIssue|Cannot clone issues of '%{issue_type}' type."
+msgstr ""
+
msgid "Cloned this issue to %{path_to_project}."
msgstr ""
@@ -7118,7 +7210,10 @@ msgstr ""
msgid "Closes this %{quick_action_target}."
msgstr ""
-msgid "Cloud licenses can not be removed."
+msgid "Cloud Functions description and apps that are suitable for this deployment target"
+msgstr ""
+
+msgid "Cloud Run description and apps that are suitable for this deployment target"
msgstr ""
msgid "Cluster"
@@ -7145,6 +7240,12 @@ msgstr ""
msgid "ClusterAgents|Access tokens"
msgstr ""
+msgid "ClusterAgents|Agent might not be connected to GitLab"
+msgstr ""
+
+msgid "ClusterAgents|Agent never connected to GitLab"
+msgstr ""
+
msgid "ClusterAgents|Alternative installation methods"
msgstr ""
@@ -7160,6 +7261,12 @@ msgstr ""
msgid "ClusterAgents|Configuration"
msgstr ""
+msgid "ClusterAgents|Connected"
+msgstr ""
+
+msgid "ClusterAgents|Connection status"
+msgstr ""
+
msgid "ClusterAgents|Copy token"
msgstr ""
@@ -7178,6 +7285,9 @@ msgstr ""
msgid "ClusterAgents|For alternative installation methods %{linkStart}go to the documentation%{linkEnd}."
msgstr ""
+msgid "ClusterAgents|For more troubleshooting information go to"
+msgstr ""
+
msgid "ClusterAgents|Go to the repository"
msgstr ""
@@ -7193,18 +7303,30 @@ msgstr ""
msgid "ClusterAgents|Integrate with the GitLab Agent"
msgstr ""
-msgid "ClusterAgents|Last used"
+msgid "ClusterAgents|Last connected %{timeAgo}."
+msgstr ""
+
+msgid "ClusterAgents|Last contact"
msgstr ""
msgid "ClusterAgents|Learn how to create an agent access token"
msgstr ""
+msgid "ClusterAgents|Make sure you are using a valid token."
+msgstr ""
+
msgid "ClusterAgents|Name"
msgstr ""
msgid "ClusterAgents|Never"
msgstr ""
+msgid "ClusterAgents|Never connected"
+msgstr ""
+
+msgid "ClusterAgents|Not connected"
+msgstr ""
+
msgid "ClusterAgents|Read more about getting started"
msgstr ""
@@ -7226,6 +7348,9 @@ msgstr ""
msgid "ClusterAgents|Select which Agent you want to install"
msgstr ""
+msgid "ClusterAgents|The Agent has not been connected in a long time. There might be a connectivity issue. Last contact was %{timeAgo}."
+msgstr ""
+
msgid "ClusterAgents|The GitLab Agent also requires %{linkStart}enabling the Agent Server%{linkEnd}"
msgstr ""
@@ -7253,9 +7378,6 @@ msgstr ""
msgid "ClusterAgents|You will need to create a token to connect to your agent"
msgstr ""
-msgid "ClusterAgent|This feature is only available for premium plans"
-msgstr ""
-
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -7445,9 +7567,6 @@ msgstr ""
msgid "ClusterIntegration|Create Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Create a provision role on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the account and external ID above. %{startMoreInfoLink}More information%{endLink}"
-msgstr ""
-
msgid "ClusterIntegration|Create cluster on"
msgstr ""
@@ -7880,7 +7999,7 @@ msgstr ""
msgid "ClusterIntegration|Subnets"
msgstr ""
-msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provisioned role, first create one on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the above account and external IDs. %{startMoreInfoLink}More information%{endLink}"
+msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provisioned role, first create one on %{awsLinkStart}Amazon Web Services %{awsLinkEnd} using the above account and external IDs. %{moreInfoStart}More information%{moreInfoEnd}"
msgstr ""
msgid "ClusterIntegration|The Kubernetes certificate used to authenticate to the cluster."
@@ -8114,6 +8233,9 @@ msgstr ""
msgid "Collapse replies"
msgstr ""
+msgid "Collapse settings section"
+msgstr ""
+
msgid "Collapse sidebar"
msgstr ""
@@ -8132,6 +8254,9 @@ msgstr ""
msgid "Comma-separated list of email addresses."
msgstr ""
+msgid "Comma-separated list of users allowed to exceed the rate limit."
+msgstr ""
+
msgid "Comma-separated, e.g. '1.1.1.1, 2.2.2.0/24'"
msgstr ""
@@ -8452,6 +8577,9 @@ msgstr ""
msgid "Configure %{repository_checks_link_start}repository checks%{link_end} and %{housekeeping_link_start}housekeeping%{link_end} on repositories."
msgstr ""
+msgid "Configure CAPTCHAs, IP address limits, and other anti-spam measures."
+msgstr ""
+
msgid "Configure Dependency Scanning in `.gitlab-ci.yml` using the GitLab managed template. You can [add variable overrides](https://docs.gitlab.com/ee/user/application_security/dependency_scanning/#customizing-the-dependency-scanning-settings) to customize Dependency Scanning settings."
msgstr ""
@@ -8488,16 +8616,13 @@ msgstr ""
msgid "Configure a %{codeStart}.gitlab-webide.yml%{codeEnd} file in the %{codeStart}.gitlab%{codeEnd} directory to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
msgstr ""
-msgid "Configure existing installation"
-msgstr ""
-
-msgid "Configure limit for notes created per minute by web and API requests."
+msgid "Configure advanced permissions, Large File Storage, and two-factor authentication settings."
msgstr ""
-msgid "Configure limits for Project/Group Import/Export."
+msgid "Configure approvals by authors and committers on all projects."
msgstr ""
-msgid "Configure limits for web and API requests."
+msgid "Configure existing installation"
msgstr ""
msgid "Configure paths to be protected by Rack Attack."
@@ -8512,10 +8637,13 @@ msgstr ""
msgid "Configure settings for Advanced Search with Elasticsearch."
msgstr ""
+msgid "Configure specific limits for Files API requests that supersede the general user and IP rate limits."
+msgstr ""
+
msgid "Configure specific limits for Git LFS requests that supersede the general user and IP rate limits."
msgstr ""
-msgid "Configure specific limits for Packages API requests that supersede the general user and IP rate limits."
+msgid "Configure specific limits for deprecated API requests that supersede the general user and IP rate limits."
msgstr ""
msgid "Configure the %{link} integration."
@@ -8527,6 +8655,9 @@ msgstr ""
msgid "Configure the way a user creates a new account."
msgstr ""
+msgid "Configure via Merge Request"
+msgstr ""
+
msgid "Configure which lists are shown for anyone who visits this board"
msgstr ""
@@ -8995,6 +9126,9 @@ msgstr ""
msgid "Content parsed with %{link}."
msgstr ""
+msgid "ContentEditor|Table of Contents"
+msgstr ""
+
msgid "ContentEditor|You have to provide a renderMarkdown function or a custom serializer"
msgstr ""
@@ -9181,6 +9315,9 @@ msgstr ""
msgid "Copy link to chart"
msgstr ""
+msgid "Copy prefix"
+msgstr ""
+
msgid "Copy reference"
msgstr ""
@@ -9211,6 +9348,9 @@ msgstr ""
msgid "Copy value"
msgstr ""
+msgid "Corpus Management"
+msgstr ""
+
msgid "Corpus Management|Are you sure you want to delete the corpus?"
msgstr ""
@@ -9439,6 +9579,9 @@ msgstr ""
msgid "Create commit"
msgstr ""
+msgid "Create common files more quickly, and standardize their format."
+msgstr ""
+
msgid "Create confidential merge request"
msgstr ""
@@ -9472,6 +9615,9 @@ msgstr ""
msgid "Create issue"
msgstr ""
+msgid "Create issue to resolve all threads"
+msgstr ""
+
msgid "Create iteration"
msgstr ""
@@ -9526,6 +9672,9 @@ msgstr ""
msgid "Create new..."
msgstr "Създаване на нов…"
+msgid "Create or import your first project"
+msgstr ""
+
msgid "Create project"
msgstr ""
@@ -9883,7 +10032,7 @@ msgstr ""
msgid "Custom notification events"
msgstr "ПерÑонализирани ÑÑŠÐ±Ð¸Ñ‚Ð¸Ñ Ð·Ð° извеÑÑ‚Ñване"
-msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notificationLinkStart} notification emails%{notificationLinkEnd}."
+msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notificationLinkStart}notification emails%{notificationLinkEnd}."
msgstr ""
msgid "Custom project templates"
@@ -10082,10 +10231,10 @@ msgid_plural "CycleAnalytics|Showing %{subjectFilterText} and %{selectedLabelsCo
msgstr[0] ""
msgstr[1] ""
-msgid "CycleAnalytics|Showing data for group '%{groupName}' and %{selectedProjectCount} projects from %{startDate} to %{endDate}"
+msgid "CycleAnalytics|Showing data for group '%{groupName}' and %{selectedProjectCount} projects from %{createdAfter} to %{createdBefore}"
msgstr ""
-msgid "CycleAnalytics|Showing data for group '%{groupName}' from %{startDate} to %{endDate}"
+msgid "CycleAnalytics|Showing data for group '%{groupName}' from %{createdAfter} to %{createdBefore}"
msgstr ""
msgid "CycleAnalytics|Stages"
@@ -10319,6 +10468,9 @@ msgstr ""
msgid "DastProfiles|Manage profiles"
msgstr ""
+msgid "DastProfiles|Manage site profiles"
+msgstr ""
+
msgid "DastProfiles|Minimum = 0 (no timeout enabled), Maximum = 2880 minutes"
msgstr ""
@@ -10394,6 +10546,9 @@ msgstr ""
msgid "DastProfiles|Scanner name"
msgstr ""
+msgid "DastProfiles|Schedule"
+msgstr ""
+
msgid "DastProfiles|Select branch"
msgstr ""
@@ -10463,7 +10618,7 @@ msgstr ""
msgid "DastProfiles|Website"
msgstr ""
-msgid "DastProfiles|You can either choose a passive scan or validate the target site in your chosen site profile. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
+msgid "DastProfiles|You can either choose a passive scan or validate the target site from the site profile management page. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
msgstr ""
msgid "DastProfiles|You cannot run an active scan against an unvalidated site."
@@ -10636,7 +10791,7 @@ msgstr ""
msgid "Days to merge"
msgstr ""
-msgid "Deactivate dormant users after 90 days of inactivity. Users can return to active status by signing in to their account. While inactive, a user is not counted as an active user in the instance."
+msgid "Deactivate dormant users after 90 days of inactivity"
msgstr ""
msgid "Dear Administrator,"
@@ -10723,10 +10878,10 @@ msgstr ""
msgid "Define a custom pattern with cron syntax"
msgstr "Задайте потребителÑки шаблон, използвайки ÑинтакÑиÑа на „Cron“"
-msgid "Define approval settings."
+msgid "Define approval rules."
msgstr ""
-msgid "Define approval settings. %{linkStart}Learn more.%{linkEnd}"
+msgid "Define approval rules. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "Define custom rules for what constitutes spam, independent of Akismet"
@@ -10735,7 +10890,7 @@ msgstr ""
msgid "Define environments in the deploy stage(s) in %{code_open}.gitlab-ci.yml%{code_close} to track deployments here."
msgstr ""
-msgid "Define how approval rules are applied as a merge request moves toward completion."
+msgid "Define how approval rules are applied to merge requests."
msgstr ""
msgid "Definition"
@@ -10750,6 +10905,12 @@ msgstr ""
msgid "DelayedJobs|Are you sure you want to run %{job_name} immediately? This job will run automatically after it's timer finishes."
msgstr ""
+msgid "DelayedJobs|Are you sure you want to run %{job_name} immediately? This job will run automatically after its timer finishes."
+msgstr ""
+
+msgid "DelayedJobs|Run the delayed job now?"
+msgstr ""
+
msgid "DelayedJobs|Start now"
msgstr ""
@@ -11026,6 +11187,12 @@ msgstr ""
msgid "Dependency proxy image prefix"
msgstr ""
+msgid "DependencyProxy|Create a local proxy for storing frequently used upstream images. %{docLinkStart}Learn more%{docLinkEnd} about dependency proxies."
+msgstr ""
+
+msgid "DependencyProxy|Dependency Proxy"
+msgstr ""
+
msgid "DependencyProxy|Toggle Dependency Proxy"
msgstr ""
@@ -11266,6 +11433,9 @@ msgstr ""
msgid "Deployments"
msgstr ""
+msgid "Deployments to Google Kubernetes Engine can be "
+msgstr ""
+
msgid "Deployments|%{deployments} environment impacted."
msgid_plural "Deployments|%{deployments} environments impacted."
msgstr[0] ""
@@ -11295,6 +11465,9 @@ msgstr ""
msgid "Deployment|success"
msgstr ""
+msgid "Deprecated API rate limits"
+msgstr ""
+
msgid "Deprioritize label"
msgstr ""
@@ -11697,6 +11870,16 @@ msgstr ""
msgid "DiffsCompareBaseBranch|(base)"
msgstr ""
+msgid "Diffs|%d addition"
+msgid_plural "Diffs|%d additions"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Diffs|%d deletion"
+msgid_plural "Diffs|%d deletions"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Diffs|No file name available"
msgstr ""
@@ -11706,9 +11889,17 @@ msgstr ""
msgid "Diffs|Show all unchanged lines"
msgstr ""
+msgid "Diffs|Showing %{dropdownStart}%{count} changed file%{dropdownEnd}"
+msgid_plural "Diffs|Showing %{dropdownStart}%{count} changed files%{dropdownEnd}"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Diffs|Something went wrong while fetching diff lines."
msgstr ""
+msgid "Diffs|with %{additions} and %{deletions}"
+msgstr ""
+
msgid "Direct member"
msgstr ""
@@ -11834,9 +12025,6 @@ msgid_plural "Dismiss %d selected vulnerabilities as"
msgstr[0] ""
msgstr[1] ""
-msgid "Dismiss Value Stream Analytics introduction box"
-msgstr ""
-
msgid "Dismiss merge request promotion"
msgstr ""
@@ -12158,6 +12346,9 @@ msgstr ""
msgid "Edit issues"
msgstr ""
+msgid "Edit merge requests"
+msgstr ""
+
msgid "Edit public deploy key"
msgstr ""
@@ -12233,6 +12424,9 @@ msgstr ""
msgid "Elastic|None. Select projects to index."
msgstr ""
+msgid "Eligible users"
+msgstr ""
+
msgid "Email"
msgstr ""
@@ -12362,6 +12556,9 @@ msgstr ""
msgid "Enable"
msgstr ""
+msgid "Enable Amazon EKS integration"
+msgstr ""
+
msgid "Enable Auto DevOps"
msgstr ""
@@ -12395,6 +12592,9 @@ msgstr ""
msgid "Enable SSL verification"
msgstr ""
+msgid "Enable Service Ping"
+msgstr ""
+
msgid "Enable Snowplow tracking"
msgstr ""
@@ -12425,6 +12625,9 @@ msgstr ""
msgid "Enable authenticated Git LFS request rate limit"
msgstr ""
+msgid "Enable authenticated web request rate limit"
+msgstr ""
+
msgid "Enable authentication"
msgstr ""
@@ -12485,7 +12688,7 @@ msgstr ""
msgid "Enable or disable the Pseudonymizer data collection."
msgstr ""
-msgid "Enable or disable version check and service ping."
+msgid "Enable or disable version check and Service Ping."
msgstr ""
msgid "Enable protected paths rate limit"
@@ -12497,18 +12700,12 @@ msgstr ""
msgid "Enable reCAPTCHA"
msgstr ""
-msgid "Enable reCAPTCHA for login"
-msgstr ""
-
-msgid "Enable reCAPTCHA, Invisible Captcha, Akismet and set IP limits. For reCAPTCHA, we currently only support %{recaptcha_v2_link_start}v2%{recaptcha_v2_link_end}"
+msgid "Enable reCAPTCHA for login."
msgstr ""
msgid "Enable repository checks"
msgstr ""
-msgid "Enable service ping"
-msgstr ""
-
msgid "Enable shared runners for all projects and subgroups in this group."
msgstr ""
@@ -12530,7 +12727,10 @@ msgstr ""
msgid "Enable unauthenticated API request rate limit"
msgstr ""
-msgid "Enable unauthenticated request rate limit"
+msgid "Enable unauthenticated web request rate limit"
+msgstr ""
+
+msgid "Enable user deactivation emails"
msgstr ""
msgid "Enable version check"
@@ -12566,9 +12766,6 @@ msgstr ""
msgid "Enabled sources for code import during project creation. OmniAuth must be configured for GitHub"
msgstr ""
-msgid "Enabling this will only make licensed EE features available to projects if the project namespace's plan includes the feature or if the project is public."
-msgstr ""
-
msgid "Encountered an error while rendering: %{err}"
msgstr ""
@@ -12617,9 +12814,6 @@ msgstr ""
msgid "Enter Admin Mode"
msgstr ""
-msgid "Enter IP address range"
-msgstr ""
-
msgid "Enter a number"
msgstr ""
@@ -12632,9 +12826,6 @@ msgstr ""
msgid "Enter at least three characters to search"
msgstr ""
-msgid "Enter domain"
-msgstr ""
-
msgid "Enter in your Bitbucket Server URL and personal access token below"
msgstr ""
@@ -12821,9 +13012,6 @@ msgstr ""
msgid "Environments|Deployment %{status}"
msgstr ""
-msgid "Environments|Dismiss"
-msgstr ""
-
msgid "Environments|Enable review app"
msgstr ""
@@ -12836,9 +13024,6 @@ msgstr ""
msgid "Environments|Environments are places where code gets deployed, such as staging or production."
msgstr ""
-msgid "Environments|Help us improve environments"
-msgstr ""
-
msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
msgstr ""
@@ -12875,6 +13060,9 @@ msgstr ""
msgid "Environments|Note that this action will stop the environment, but it will %{emphasisStart}not%{emphasisEnd} have an effect on any existing deployment due to no “stop environment action†being defined in the %{ciConfigLinkStart}.gitlab-ci.yml%{ciConfigLinkEnd} file."
msgstr ""
+msgid "Environments|Open"
+msgstr ""
+
msgid "Environments|Open live environment"
msgstr ""
@@ -12914,9 +13102,6 @@ msgstr ""
msgid "Environments|Stopping %{environmentName}"
msgstr ""
-msgid "Environments|Take the survey"
-msgstr ""
-
msgid "Environments|There was an error fetching the logs. Please try again."
msgstr ""
@@ -12938,9 +13123,6 @@ msgstr ""
msgid "Environments|You don't have any environments right now"
msgstr ""
-msgid "Environments|Your feedback helps GitLab make environments better for you and other users. Participate and enter a sweepstake to win a USD 30 gift card."
-msgstr ""
-
msgid "Environments|by %{avatar}"
msgstr ""
@@ -13223,7 +13405,7 @@ msgstr ""
msgid "Error parsing CSV file. Please make sure it has"
msgstr ""
-msgid "Error rendering markdown preview"
+msgid "Error rendering Markdown preview"
msgstr ""
msgid "Error saving label update."
@@ -13271,6 +13453,9 @@ msgstr ""
msgid "Error: %{error_message}"
msgstr ""
+msgid "Error: Couldn't load some or all of the changes."
+msgstr ""
+
msgid "Error: No AWS credentials were supplied"
msgstr ""
@@ -13304,6 +13489,9 @@ msgstr ""
msgid "ErrorTracking|Enable error tracking"
msgstr ""
+msgid "ErrorTracking|Error tracking backend"
+msgstr ""
+
msgid "ErrorTracking|If you self-host Sentry, enter your Sentry instance's full URL. If you use Sentry's hosted solution, enter https://sentry.io"
msgstr ""
@@ -13337,6 +13525,12 @@ msgstr ""
msgid "Escalation policies must have at least one rule"
msgstr ""
+msgid "EscalationPolicies|%{clockIcon} IF alert is not %{alertStatus} in %{minutes}"
+msgstr ""
+
+msgid "EscalationPolicies|%{notificationIcon} THEN %{doAction} %{forScheduleOrUser}"
+msgstr ""
+
msgid "EscalationPolicies|+ Add an additional rule"
msgstr ""
@@ -13379,13 +13573,13 @@ msgstr ""
msgid "EscalationPolicies|Escalation policies"
msgstr ""
-msgid "EscalationPolicies|Escalation rules"
+msgid "EscalationPolicies|Escalation policy %{obstacle} in Project %{project}"
msgstr ""
-msgid "EscalationPolicies|Failed to load oncall-schedules"
+msgid "EscalationPolicies|Escalation rules"
msgstr ""
-msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} %{then} THEN %{doAction} %{scheduleOrUser}"
+msgid "EscalationPolicies|Failed to load oncall-schedules"
msgstr ""
msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} minutes"
@@ -13463,18 +13657,36 @@ msgstr ""
msgid "Every %{action} attempt has failed: %{job_error_message}. Please try again."
msgstr ""
+msgid "Every 3 months"
+msgstr ""
+
+msgid "Every 3 months on the %{day} at %{time} %{timezone}"
+msgstr ""
+
+msgid "Every 6 months"
+msgstr ""
+
+msgid "Every 6 months on the %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Every day"
msgstr ""
msgid "Every day (at %{time})"
msgstr ""
+msgid "Every day at %{time} %{timezone}"
+msgstr ""
+
msgid "Every month"
msgstr ""
msgid "Every month (Day %{day} at %{time})"
msgstr ""
+msgid "Every month on the %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Every three months"
msgstr ""
@@ -13489,6 +13701,15 @@ msgstr[1] ""
msgid "Every week (%{weekday} at %{time})"
msgstr ""
+msgid "Every week on %{day} at %{time} %{timezone}"
+msgstr ""
+
+msgid "Every year"
+msgstr ""
+
+msgid "Every year on %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Everyone"
msgstr ""
@@ -13525,9 +13746,6 @@ msgstr ""
msgid "Exactly one of %{attributes} is required"
msgstr ""
-msgid "Example: %{ip_address}. %{read_more_link}."
-msgstr ""
-
msgid "Example: @sub\\.company\\.com$"
msgstr ""
@@ -13594,13 +13812,13 @@ msgstr ""
msgid "Expand pipeline"
msgstr ""
-msgid "Expand sidebar"
+msgid "Expand settings section"
msgstr ""
-msgid "Expected documents: %{expected_documents}"
+msgid "Expand sidebar"
msgstr ""
-msgid "Experienced"
+msgid "Expected documents: %{expected_documents}"
msgstr ""
msgid "ExperimentSubject|Must have exactly one of User, Namespace, or Project."
@@ -13885,9 +14103,6 @@ msgstr ""
msgid "Failed to load related branches"
msgstr ""
-msgid "Failed to load sidebar lock status"
-msgstr ""
-
msgid "Failed to load stacktrace."
msgstr ""
@@ -14312,6 +14527,9 @@ msgstr ""
msgid "Files"
msgstr "Файлове"
+msgid "Files API Rate Limits"
+msgstr ""
+
msgid "Files breadcrumb"
msgstr ""
@@ -15311,6 +15529,9 @@ msgstr ""
msgid "GitLab group: %{source_link}"
msgstr ""
+msgid "GitLab informs you if a new version is available."
+msgstr ""
+
msgid "GitLab is a complete DevOps platform, delivered as a single application, fundamentally changing the way Development, Security, and Ops teams collaborate"
msgstr ""
@@ -15326,7 +15547,7 @@ msgstr ""
msgid "GitLab is open source software to collaborate on code."
msgstr ""
-msgid "GitLab is undergoing maintenance and is operating in a read-only mode."
+msgid "GitLab is undergoing maintenance and is operating in read-only mode."
msgstr ""
msgid "GitLab member or Email address"
@@ -15338,9 +15559,6 @@ msgstr ""
msgid "GitLab project export"
msgstr ""
-msgid "GitLab restart is required to apply changes."
-msgstr ""
-
msgid "GitLab single sign-on URL"
msgstr ""
@@ -15356,9 +15574,6 @@ msgstr ""
msgid "GitLab version"
msgstr ""
-msgid "GitLab will inform you if a new version is available."
-msgstr ""
-
msgid "GitLab will run a background job that will produce pseudonymized CSVs of the GitLab database that will be uploaded to your configured object storage directory."
msgstr ""
@@ -15623,9 +15838,21 @@ msgstr ""
msgid "Go to snippets"
msgstr ""
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check 'Allowed domains for sign-ups'."
+msgstr ""
+
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check 'Email restrictions for sign-ups'."
+msgstr ""
+
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check the 'Domain denylist'."
+msgstr ""
+
msgid "Go to the activity feed"
msgstr ""
+msgid "Go to the group’s 'Settings &gt; General' page, and check 'Restrict membership by email domain'."
+msgstr ""
+
msgid "Go to the milestone list"
msgstr ""
@@ -15662,6 +15889,12 @@ msgstr ""
msgid "Goal of the changes and what reviewers should be aware of"
msgstr ""
+msgid "Google Cloud"
+msgstr ""
+
+msgid "Google Cloud offers several deployment targets. Select the one most suitable for your project."
+msgstr ""
+
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
@@ -15746,9 +15979,6 @@ msgstr ""
msgid "Group ID"
msgstr ""
-msgid "Group ID: %{group_id}"
-msgstr ""
-
msgid "Group Owner must have signed in with SAML before enabling Group Managed Accounts"
msgstr ""
@@ -15923,6 +16153,12 @@ msgstr ""
msgid "GroupImport|Unable to process group import file"
msgstr ""
+msgid "GroupPage|Copy group ID"
+msgstr ""
+
+msgid "GroupPage|Group ID: %{group_id}"
+msgstr ""
+
msgid "GroupRoadmap|%{dateWord} – No end date"
msgstr ""
@@ -15977,6 +16213,9 @@ msgstr ""
msgid "GroupRoadmap|Within 3 years"
msgstr ""
+msgid "GroupSAML|\"persistent\" recommended"
+msgstr ""
+
msgid "GroupSAML|%{strongOpen}Warning%{strongClose} - Enabling %{linkStart}SSO enforcement%{linkEnd} can reduce security risks."
msgstr ""
@@ -16109,6 +16348,9 @@ msgstr ""
msgid "GroupSAML|To be able to prohibit outer forks, you first need to enforce dedicate group managed accounts."
msgstr ""
+msgid "GroupSAML|Use SAML group links to manage group membership using SAML."
+msgstr ""
+
msgid "GroupSAML|Valid SAML Response"
msgstr ""
@@ -16121,13 +16363,10 @@ msgstr ""
msgid "GroupSAML|as %{access_level}"
msgstr ""
-msgid "GroupSAML|must match stored NameID of \"%{extern_uid}\" as we use this to identify users. If the NameID changes users will be unable to sign in."
-msgstr ""
-
-msgid "GroupSAML|should be \"persistent\""
+msgid "GroupSAML|must match stored NameID of \"%{extern_uid}\" to identify user and allow sign in"
msgstr ""
-msgid "GroupSAML|should be a random persistent ID, emails are discouraged"
+msgid "GroupSAML|recommend persistent ID instead of email"
msgstr ""
msgid "GroupSelect|No matching results"
@@ -16142,9 +16381,15 @@ msgstr ""
msgid "GroupSettings|Allow project access token creation"
msgstr ""
+msgid "GroupSettings|Applied to all subgroups unless overridden by a group owner. Groups already added to the project lose access."
+msgstr ""
+
msgid "GroupSettings|Auto DevOps pipeline was updated for the group"
msgstr ""
+msgid "GroupSettings|Available only on the top-level group. Applies to all subgroups. Groups already shared with a group outside %{group} are still shared unless removed manually."
+msgstr ""
+
msgid "GroupSettings|Badges"
msgstr ""
@@ -16196,6 +16441,9 @@ msgstr ""
msgid "GroupSettings|New runners registration token has been generated!"
msgstr ""
+msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgstr ""
+
msgid "GroupSettings|Pipeline settings was updated for the group"
msgstr ""
@@ -16208,12 +16456,15 @@ msgstr ""
msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
-msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups."
+msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups"
msgstr ""
msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
msgstr ""
+msgid "GroupSettings|Prevents group members from being notified if the group is mentioned."
+msgstr ""
+
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
msgstr ""
@@ -16250,21 +16501,6 @@ msgstr ""
msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}."
msgstr ""
-msgid "GroupSettings|This setting is only available on the top-level group and it applies to all subgroups. Groups that have already been shared with a group outside %{group} will still be shared, and this access will have to be revoked manually."
-msgstr ""
-
-msgid "GroupSettings|This setting will be applied to all subgroups unless overridden by a group owner. Groups that already have access to the project will continue to have access unless removed manually."
-msgstr ""
-
-msgid "GroupSettings|This setting will override user notification preferences for all members of the group, subgroups, and projects."
-msgstr ""
-
-msgid "GroupSettings|This setting will prevent group members from being notified if the group is mentioned."
-msgstr ""
-
-msgid "GroupSettings|This setting will prevent group members from forking projects outside of the group."
-msgstr ""
-
msgid "GroupSettings|Transfer group"
msgstr ""
@@ -16382,7 +16618,7 @@ msgstr ""
msgid "GroupsNew|No import options available"
msgstr ""
-msgid "GroupsNew|Not all related objects are migrated, as %{docs_link_start}described here%{docs_link_end}. Please %{feedback_link_start}leave feedback%{feedback_link_end} on this feature."
+msgid "GroupsNew|Not all related objects are migrated. %{docs_link_start}More info%{docs_link_end}."
msgstr ""
msgid "GroupsNew|Personal access token"
@@ -16514,15 +16750,27 @@ msgstr ""
msgid "Hello %{name},"
msgstr ""
-msgid "Hello there"
-msgstr ""
-
msgid "Hello, %{name}!"
msgstr ""
msgid "Hello, %{username}!"
msgstr ""
+msgid "HelloMessage|%{handshake_emoji} Contribute to GitLab: %{contribute_link}"
+msgstr ""
+
+msgid "HelloMessage|%{magnifier_emoji} Create a new GitLab issue: %{new_issue_link}"
+msgstr ""
+
+msgid "HelloMessage|%{rocket_emoji} We like your curiosity! Help us improve GitLab by joining the team: %{jobs_page_link}"
+msgstr ""
+
+msgid "HelloMessage|Does this page need fixes or improvements? Open an issue or contribute a merge request to help make GitLab more lovable. At GitLab, everyone can contribute!"
+msgstr ""
+
+msgid "HelloMessage|Welcome to GitLab!"
+msgstr ""
+
msgid "Help"
msgstr ""
@@ -16532,13 +16780,10 @@ msgstr ""
msgid "Helps prevent bots from creating accounts."
msgstr ""
-msgid "Helps prevent bots from creating issues"
-msgstr ""
-
-msgid "Helps prevent malicious users hide their activity"
+msgid "Helps prevent bots from creating issues."
msgstr ""
-msgid "Helps reduce request volume (e.g. from crawlers or abusive bots)"
+msgid "Helps prevent malicious users hide their activity."
msgstr ""
msgid "Helps reduce request volume (for example, from crawlers or abusive bots)"
@@ -16662,6 +16907,12 @@ msgstr "ОÑвежаването започна уÑпешно"
msgid "Housekeeping, export, path, transfer, remove, archive."
msgstr ""
+msgid "How do I configure Akismet?"
+msgstr ""
+
+msgid "How do I configure it?"
+msgstr ""
+
msgid "How do I configure runners?"
msgstr ""
@@ -16683,19 +16934,25 @@ msgstr ""
msgid "How do I set up this service?"
msgstr ""
+msgid "How do I use a web terminal?"
+msgstr ""
+
+msgid "How do I use file templates?"
+msgstr ""
+
msgid "How it works"
msgstr ""
msgid "How many days need to pass between marking entity for deletion and actual removing it."
msgstr ""
-msgid "How many seconds an IP will be counted towards the limit"
+msgid "How many seconds an IP counts toward the IP address limit."
msgstr ""
-msgid "I accept the %{terms_link}"
+msgid "How the job limiter handles jobs exceeding the thresholds specified below. The 'track' mode only logs the jobs. The 'compress' mode compresses the jobs and raises an exception if the compressed size exceeds the limit."
msgstr ""
-msgid "I accept the|Terms of Service and Privacy Policy"
+msgid "I accept the %{terms_link}"
msgstr ""
msgid "I forgot my password"
@@ -16779,13 +17036,16 @@ msgstr ""
msgid "IP Address"
msgstr ""
-msgid "IP expiration time"
+msgid "IP address expiration time"
msgstr ""
-msgid "IP subnet restriction only allowed for top-level groups"
+msgid "IP address restrictions"
+msgstr ""
+
+msgid "IP addresses per user"
msgstr ""
-msgid "IPs per user"
+msgid "IP subnet restriction only allowed for top-level groups"
msgstr ""
msgid "Identifier"
@@ -16800,6 +17060,9 @@ msgstr ""
msgid "If any indexed field exceeds this limit it will be truncated to this number of characters and the rest will not be indexed or searchable. This does not apply to repository and wiki indexing. Setting this to 0 means it is unlimited."
msgstr ""
+msgid "If blank, defaults to %{code_open}Retry later%{code_close}."
+msgstr ""
+
msgid "If blank, set allowable lifetime to %{instance_level_policy_in_words}, as defined by the instance admin. Once set, existing tokens for users in this group may be revoked."
msgstr ""
@@ -16851,6 +17114,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 did not initiate these sign-in attempts, please reach out to your administrator or enable two-factor authentication (2FA) on your account."
+msgstr ""
+
msgid "If you did not initiate this change, please contact your administrator immediately."
msgstr ""
@@ -16942,10 +17208,10 @@ msgstr ""
msgid "Import Projects from Gitea"
msgstr ""
-msgid "Import a project"
+msgid "Import an exported GitLab project"
msgstr ""
-msgid "Import an exported GitLab project"
+msgid "Import and export rate limits"
msgstr ""
msgid "Import failed due to a GitHub error: %{original}"
@@ -16957,12 +17223,18 @@ msgstr ""
msgid "Import from Jira"
msgstr ""
+msgid "Import group"
+msgstr ""
+
msgid "Import group from file"
msgstr ""
msgid "Import groups"
msgstr ""
+msgid "Import history"
+msgstr ""
+
msgid "Import in progress"
msgstr ""
@@ -17026,7 +17298,25 @@ msgstr ""
msgid "Import timed out. Import took longer than %{import_jobs_expiration} seconds"
msgstr ""
-msgid "Import/Export Rate Limits"
+msgid "ImportAProjectModal|Import from a project"
+msgstr ""
+
+msgid "ImportAProjectModal|Import members from another project"
+msgstr ""
+
+msgid "ImportAProjectModal|Import project members"
+msgstr ""
+
+msgid "ImportAProjectModal|Only project members (not group members) are imported, and they get the same permissions as the project you import from."
+msgstr ""
+
+msgid "ImportAProjectModal|Successfully imported"
+msgstr ""
+
+msgid "ImportAProjectModal|Unable to import project members"
+msgstr ""
+
+msgid "ImportAProjectModal|You're importing members to the %{strongStart}%{name}%{strongEnd} project."
msgstr ""
msgid "ImportButtons|Connect repositories from"
@@ -17079,7 +17369,7 @@ msgstr[1] ""
msgid "Importing..."
msgstr ""
-msgid "Import|A repository URL usually ends in a .git suffix, although this is not required. Double check to make sure your repository URL is correct."
+msgid "Import|There is not a valid Git repository at this URL. If your HTTP repository is not publicly accessible, verify your credentials."
msgstr ""
msgid "Improve customer support with Service Desk"
@@ -17088,9 +17378,6 @@ msgstr ""
msgid "Improves Git cloning performance."
msgstr ""
-msgid "In %{time_to_now}"
-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 ""
@@ -17376,7 +17663,7 @@ msgstr ""
msgid "InProductMarketing|Start a GitLab Ultimate trial today in less than one minute, no credit card required."
msgstr ""
-msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no CC required"
+msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no credit card required"
msgstr ""
msgid "InProductMarketing|Start a trial"
@@ -17415,7 +17702,7 @@ msgstr ""
msgid "InProductMarketing|Team up in GitLab for greater efficiency"
msgstr ""
-msgid "InProductMarketing|Team work makes the dream work"
+msgid "InProductMarketing|Team work makes the dream work"
msgstr ""
msgid "InProductMarketing|Test, create, deploy"
@@ -17996,6 +18283,9 @@ msgstr ""
msgid "Integrations|Create new issue in Jira"
msgstr ""
+msgid "Integrations|Create new issue in ZenTao"
+msgstr ""
+
msgid "Integrations|Default settings are inherited from the group level."
msgstr ""
@@ -18089,9 +18379,15 @@ msgstr ""
msgid "Integrations|Search Jira issues"
msgstr ""
+msgid "Integrations|Search ZenTao issues"
+msgstr ""
+
msgid "Integrations|Send notifications about project events to Unify Circuit."
msgstr ""
+msgid "Integrations|Send notifications about project events to a Unify Circuit conversation. %{docs_link}"
+msgstr ""
+
msgid "Integrations|Sign in to add namespaces"
msgstr ""
@@ -18131,6 +18427,9 @@ msgstr ""
msgid "Integrations|You've activated every integration 🎉"
msgstr ""
+msgid "Integrations|ZenTao issues display here when you create issues in your project in ZenTao."
+msgstr ""
+
msgid "Interactive mode"
msgstr ""
@@ -18158,9 +18457,6 @@ msgstr ""
msgid "Interval Pattern"
msgstr "Шаблон за интервала"
-msgid "Introducing Value Stream Analytics"
-msgstr ""
-
msgid "Introducing Your DevOps Report"
msgstr ""
@@ -18257,6 +18553,12 @@ msgstr ""
msgid "Investigate vulnerability: %{title}"
msgstr ""
+msgid "Invisible Captcha"
+msgstr ""
+
+msgid "Invisible Captcha helps prevent the creation of spam accounts. It adds a honeypot field and time-sensitive form submission to the account signup form."
+msgstr ""
+
msgid "Invitation"
msgstr ""
@@ -18710,12 +19012,18 @@ msgstr ""
msgid "Issues"
msgstr ""
+msgid "Issues I've created"
+msgstr ""
+
msgid "Issues Rate Limits"
msgstr ""
msgid "Issues and merge requests"
msgstr ""
+msgid "Issues assigned to me"
+msgstr ""
+
msgid "Issues can be bugs, tasks or ideas to be discussed. Also, issues are searchable and filterable."
msgstr ""
@@ -18827,7 +19135,7 @@ msgstr ""
msgid "Iterations|Create cadence"
msgstr ""
-msgid "Iterations|Create your first iteration"
+msgid "Iterations|Create iteration"
msgstr ""
msgid "Iterations|Delete cadence"
@@ -18836,6 +19144,9 @@ msgstr ""
msgid "Iterations|Delete iteration cadence?"
msgstr ""
+msgid "Iterations|Delete iteration?"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -18869,12 +19180,18 @@ msgstr ""
msgid "Iterations|New iteration cadence"
msgstr ""
+msgid "Iterations|No closed iterations."
+msgstr ""
+
msgid "Iterations|No iteration cadences to show."
msgstr ""
msgid "Iterations|No iterations in cadence."
msgstr ""
+msgid "Iterations|No open iterations."
+msgstr ""
+
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
@@ -18905,6 +19222,9 @@ msgstr ""
msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
msgstr ""
+msgid "Iterations|This will remove the iteration from any issues that are assigned to it."
+msgstr ""
+
msgid "Iterations|Title"
msgstr ""
@@ -18920,15 +19240,9 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "I’m familiar with the basics of DevOps."
-msgstr ""
-
msgid "I’m joining my team who’s already on GitLab"
msgstr ""
-msgid "I’m not familiar with the basics of DevOps."
-msgstr ""
-
msgid "Jaeger URL"
msgstr ""
@@ -19193,6 +19507,9 @@ msgstr ""
msgid "Job"
msgstr ""
+msgid "Job %{jobName}"
+msgstr ""
+
msgid "Job Failed #%{build_id}"
msgstr ""
@@ -19783,9 +20100,6 @@ msgstr ""
msgid "Learn more in the"
msgstr "Ðаучете повече в"
-msgid "Learn more in the|pipeline schedules documentation"
-msgstr "документациÑта отноÑно планирането на Ñхеми"
-
msgid "Learn more."
msgstr ""
@@ -19897,9 +20211,6 @@ msgstr ""
msgid "Leave Admin Mode"
msgstr ""
-msgid "Leave blank for no limit. Once set, existing personal access tokens may be revoked."
-msgstr ""
-
msgid "Leave edit mode? All unsaved changes will be lost."
msgstr ""
@@ -19945,10 +20256,10 @@ msgstr ""
msgid "LicenseCompliance|Acceptable license to be used in the project"
msgstr ""
-msgid "LicenseCompliance|Add a license"
+msgid "LicenseCompliance|Add license and related policy"
msgstr ""
-msgid "LicenseCompliance|Add license and related policy"
+msgid "LicenseCompliance|Add license policy"
msgstr ""
msgid "LicenseCompliance|Allow"
@@ -20038,6 +20349,9 @@ msgstr ""
msgid "LicenseManagement|Uncategorized"
msgstr ""
+msgid "Licensed Enterprise Edition features can be used if the project namespace's plan includes the feature, or if the project is public."
+msgstr ""
+
msgid "Licensed Features"
msgstr ""
@@ -20104,7 +20418,10 @@ msgstr ""
msgid "Limit namespaces and projects that can be indexed"
msgstr ""
-msgid "Limit sign in from multiple ips"
+msgid "Limit project size at a global, group, and project level. %{link_start}Learn more%{link_end}."
+msgstr ""
+
+msgid "Limit sign in from multiple IP addresses"
msgstr ""
msgid "Limit the number of concurrent operations this secondary site can run in the background."
@@ -20116,11 +20433,17 @@ msgstr ""
msgid "Limit the number of issues and epics per minute a user can create through web and API requests."
msgstr ""
+msgid "Limit the size of Sidekiq jobs stored in Redis."
+msgstr ""
+
msgid "Limited to showing %d event at most"
msgid_plural "Limited to showing %d events at most"
msgstr[0] ""
msgstr[1] ""
+msgid "Limiting mode"
+msgstr ""
+
msgid "Line changes"
msgstr ""
@@ -20190,9 +20513,6 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
-msgid "List of users to be excluded from the limit"
-msgstr ""
-
msgid "List options"
msgstr ""
@@ -20232,9 +20552,6 @@ msgstr ""
msgid "Loading functions timed out. Please reload the page to try again."
msgstr ""
-msgid "Loading issues"
-msgstr ""
-
msgid "Loading more"
msgstr ""
@@ -20526,6 +20843,9 @@ msgstr ""
msgid "Marked For Deletion At - %{deletion_time}"
msgstr ""
+msgid "Marked as ready. Merging is now allowed."
+msgstr ""
+
msgid "Marked this %{noun} as a draft."
msgstr ""
@@ -20598,52 +20918,22 @@ msgstr ""
msgid "Max 100,000 events"
msgstr ""
-msgid "Max 20 characters"
-msgstr ""
-
-msgid "Max Group Export Download requests per minute per user"
-msgstr ""
-
-msgid "Max Group Export requests per minute per user"
-msgstr ""
-
-msgid "Max Group Import requests per minute per user"
-msgstr ""
-
-msgid "Max Project Export Download requests per minute per user"
-msgstr ""
-
-msgid "Max Project Export requests per minute per user"
-msgstr ""
-
-msgid "Max Project Import requests per minute per user"
-msgstr ""
-
-msgid "Max authenticated API requests per period per user"
-msgstr ""
-
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
-msgid "Max authenticated web requests per period per user"
-msgstr ""
-
msgid "Max file size is 200 KB."
msgstr ""
-msgid "Max requests per minute per user"
-msgstr ""
-
msgid "Max role"
msgstr ""
msgid "Max session time"
msgstr ""
-msgid "Max unauthenticated requests per period per IP"
+msgid "MaxBuilds"
msgstr ""
-msgid "MaxBuilds"
+msgid "Maximum 20 characters"
msgstr ""
msgid "Maximum Conan package file size in bytes"
@@ -20679,6 +20969,12 @@ msgstr ""
msgid "Maximum attachment size (MB)"
msgstr ""
+msgid "Maximum authenticated API requests per rate limit period per user"
+msgstr ""
+
+msgid "Maximum authenticated web requests per rate limit period per user"
+msgstr ""
+
msgid "Maximum bulk request size (MiB)"
msgstr ""
@@ -20724,6 +21020,15 @@ msgstr ""
msgid "Maximum files in a diff"
msgstr ""
+msgid "Maximum group export download requests per minute"
+msgstr ""
+
+msgid "Maximum group export requests per minute"
+msgstr ""
+
+msgid "Maximum group import requests per minute"
+msgstr ""
+
msgid "Maximum import size"
msgstr ""
@@ -20760,7 +21065,7 @@ msgstr ""
msgid "Maximum number of projects."
msgstr ""
-msgid "Maximum number of unique IPs per user"
+msgid "Maximum number of unique IP addresses per user."
msgstr ""
msgid "Maximum page reached"
@@ -20769,12 +21074,24 @@ msgstr ""
msgid "Maximum page size"
msgstr ""
+msgid "Maximum project export download requests per minute"
+msgstr ""
+
+msgid "Maximum project export requests per minute"
+msgstr ""
+
+msgid "Maximum project import requests per minute"
+msgstr ""
+
msgid "Maximum push size"
msgstr ""
msgid "Maximum push size (MB)"
msgstr ""
+msgid "Maximum requests per minute"
+msgstr ""
+
msgid "Maximum running slices"
msgstr ""
@@ -20802,10 +21119,16 @@ msgstr ""
msgid "Maximum time between updates that a mirror can have when scheduled to synchronize."
msgstr ""
-msgid "Maximum time for web terminal websocket connection (in seconds). 0 for unlimited."
+msgid "Maximum time that users are allowed to skip the setup of two-factor authentication (in hours). Set to 0 (zero) to enforce at next sign in."
msgstr ""
-msgid "Maximum time that users are allowed to skip the setup of two-factor authentication (in hours). Set to 0 (zero) to enforce at next sign in."
+msgid "Maximum time, in seconds, for a web terminal websocket connection. 0 for unlimited."
+msgstr ""
+
+msgid "Maximum unauthenticated API requests per rate limit period per IP"
+msgstr ""
+
+msgid "Maximum unauthenticated web requests per rate limit period per IP"
msgstr ""
msgid "May"
@@ -20823,9 +21146,6 @@ msgstr ""
msgid "Medium vulnerabilities present"
msgstr ""
-msgid "Member lock"
-msgstr ""
-
msgid "Member since"
msgstr ""
@@ -20862,6 +21182,9 @@ msgstr ""
msgid "Members of a group may only view projects they have permission to access"
msgstr ""
+msgid "Membership"
+msgstr ""
+
msgid "Members|%{time} by %{user}"
msgstr ""
@@ -20922,9 +21245,6 @@ msgstr ""
msgid "Members|Expiration date updated successfully."
msgstr ""
-msgid "Members|Expired"
-msgstr ""
-
msgid "Members|Filter members"
msgstr ""
@@ -20940,9 +21260,6 @@ msgstr ""
msgid "Members|Membership"
msgstr ""
-msgid "Members|No expiration set"
-msgstr ""
-
msgid "Members|Remove \"%{groupName}\""
msgstr ""
@@ -20964,9 +21281,6 @@ msgstr ""
msgid "Members|Search invited"
msgstr ""
-msgid "Members|in %{time}"
-msgstr ""
-
msgid "Member|Deny access"
msgstr ""
@@ -21042,9 +21356,6 @@ msgstr ""
msgid "Merge request %{mr_link} was reviewed by %{mr_author}"
msgstr ""
-msgid "Merge request (MR) approvals"
-msgstr ""
-
msgid "Merge request analytics"
msgstr ""
@@ -21066,12 +21377,21 @@ msgstr ""
msgid "Merge requests"
msgstr ""
+msgid "Merge requests I've created"
+msgstr ""
+
msgid "Merge requests are a place to propose changes you've made to a project and discuss those changes with others"
msgstr ""
msgid "Merge requests are read-only in a secondary Geo node"
msgstr ""
+msgid "Merge requests assigned to me"
+msgstr ""
+
+msgid "Merge requests that I'm a reviewer"
+msgstr ""
+
msgid "Merge the branch and fix any conflicts that come up"
msgstr ""
@@ -21132,10 +21452,10 @@ msgstr ""
msgid "MergeRequests|An error occurred while saving the draft comment."
msgstr ""
-msgid "MergeRequests|Failed to squash. Should be done manually."
+msgid "MergeRequests|Create issue to resolve thread"
msgstr ""
-msgid "MergeRequests|Resolve this thread in a new issue"
+msgid "MergeRequests|Failed to squash. Should be done manually."
msgstr ""
msgid "MergeRequests|Saving the comment failed"
@@ -21949,6 +22269,9 @@ msgstr ""
msgid "MoveIssue|Cannot move issue to project it originates from!"
msgstr ""
+msgid "MoveIssue|Cannot move issues of '%{issue_type}' type."
+msgstr ""
+
msgid "Moved issue to %{label} column in the board."
msgstr ""
@@ -22074,6 +22397,15 @@ 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. To learn more about reducing storage capacity please visit our docs."
msgstr ""
+msgid "NamespaceUserCap|Pending users must be reviewed and approved by a group owner. Learn more about %{user_caps_link_start}User Caps%{link_end} and %{users_pending_approval_link_start}Users Pending Approval%{link_end}."
+msgstr ""
+
+msgid "NamespaceUserCap|View pending user approvals"
+msgstr ""
+
+msgid "NamespaceUserCap|Your group has reached its billable member limit"
+msgstr ""
+
msgid "Namespaces"
msgstr ""
@@ -22116,9 +22448,6 @@ msgstr ""
msgid "Network"
msgstr ""
-msgid "Network Policy|New rule"
-msgstr ""
-
msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is inbound from a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
msgstr ""
@@ -22140,16 +22469,13 @@ msgstr ""
msgid "NetworkPolicies|%{strongOpen}any%{strongClose} port"
msgstr ""
-msgid "NetworkPolicies|+ Add alert"
-msgstr ""
-
msgid "NetworkPolicies|.yaml"
msgstr ""
msgid "NetworkPolicies|.yaml mode"
msgstr ""
-msgid "NetworkPolicies|Actions"
+msgid "NetworkPolicies|Add alert"
msgstr ""
msgid "NetworkPolicies|Alerts are intended to be selectively used for a limited number of events that are potentially concerning and warrant a manual review. Alerts should not be used as a substitute for a SIEM or a logging tool. High volume alerts are likely to be dropped so as to preserve the stability of GitLab's integration with Kubernetes."
@@ -22185,9 +22511,6 @@ msgstr ""
msgid "NetworkPolicies|Deny all traffic"
msgstr ""
-msgid "NetworkPolicies|Description"
-msgstr ""
-
msgid "NetworkPolicies|Edit policy"
msgstr ""
@@ -22200,9 +22523,6 @@ msgstr ""
msgid "NetworkPolicies|IP/subnet"
msgstr ""
-msgid "NetworkPolicies|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
-msgstr ""
-
msgid "NetworkPolicies|Invalid or empty policy"
msgstr ""
@@ -22212,19 +22532,16 @@ msgstr ""
msgid "NetworkPolicies|Kubernetes error: %{error}"
msgstr ""
-msgid "NetworkPolicies|Name"
-msgstr ""
-
msgid "NetworkPolicies|Network"
msgstr ""
-msgid "NetworkPolicies|Network traffic"
+msgid "NetworkPolicies|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
msgstr ""
-msgid "NetworkPolicies|New policy"
+msgid "NetworkPolicies|Network policy can be created after the environment is loaded successfully."
msgstr ""
-msgid "NetworkPolicies|No policies detected"
+msgid "NetworkPolicies|Network traffic"
msgstr ""
msgid "NetworkPolicies|None selected"
@@ -22233,21 +22550,12 @@ msgstr ""
msgid "NetworkPolicies|Please %{installLinkStart}install%{installLinkEnd} and %{configureLinkStart}configure a Kubernetes Agent for this project%{configureLinkEnd} to enable alerts."
msgstr ""
-msgid "NetworkPolicies|Policies are a specification of how groups of pods are allowed to communicate with each other's network endpoints."
-msgstr ""
-
msgid "NetworkPolicies|Policy %{policyName} was successfully changed"
msgstr ""
msgid "NetworkPolicies|Policy definition"
msgstr ""
-msgid "NetworkPolicies|Policy editor"
-msgstr ""
-
-msgid "NetworkPolicies|Policy preview"
-msgstr ""
-
msgid "NetworkPolicies|Rule"
msgstr ""
@@ -22257,9 +22565,6 @@ msgstr ""
msgid "NetworkPolicies|Rule mode is unavailable for this policy. In some cases, we cannot parse the YAML file back into the rules editor."
msgstr ""
-msgid "NetworkPolicies|Rules"
-msgstr ""
-
msgid "NetworkPolicies|Save changes"
msgstr ""
@@ -22272,9 +22577,6 @@ msgstr ""
msgid "NetworkPolicies|Traffic that does not match any rule will be blocked."
msgstr ""
-msgid "NetworkPolicies|Unable to parse policy"
-msgstr ""
-
msgid "NetworkPolicies|all DNS names"
msgstr ""
@@ -22454,6 +22756,9 @@ msgstr ""
msgid "New issue"
msgstr "Ðов проблем"
+msgid "New issue in %{project}"
+msgstr ""
+
msgid "New issue title"
msgstr ""
@@ -22532,7 +22837,7 @@ msgstr ""
msgid "Newest first"
msgstr ""
-msgid "Newly registered users will by default be external"
+msgid "Newly-registered users are external by default"
msgstr ""
msgid "Next"
@@ -22847,8 +23152,10 @@ msgstr ""
msgid "No webhooks found, add one in the form above."
msgstr ""
-msgid "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} to renew your subscription."
-msgstr ""
+msgid "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} day to renew your subscription."
+msgid_plural "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} days to renew your subscription."
+msgstr[0] ""
+msgstr[1] ""
msgid "No. of commits"
msgstr ""
@@ -22865,7 +23172,7 @@ msgstr ""
msgid "Nodes"
msgstr ""
-msgid "Non-admin users can sign in with read-only access and make read-only API requests."
+msgid "Non-admin users are restricted to read-only access, in both GitLab UI and API."
msgstr ""
msgid "None"
@@ -22946,7 +23253,7 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
-msgid "Notes Rate Limits"
+msgid "Notes rate limit"
msgstr ""
msgid "Notes|Are you sure you want to cancel creating this comment?"
@@ -23113,9 +23420,6 @@ msgstr ""
msgid "November"
msgstr ""
-msgid "Novice"
-msgstr ""
-
msgid "Now, personalize your GitLab experience"
msgstr ""
@@ -23284,7 +23588,7 @@ msgstr ""
msgid "OnCallSchedules|For this rotation, on-call will be:"
msgstr ""
-msgid "OnCallSchedules|On-call schedule %{schedule} in Project %{project}"
+msgid "OnCallSchedules|On-call schedule %{obstacle} in Project %{project}"
msgstr ""
msgid "OnCallSchedules|On-call schedules"
@@ -23431,22 +23735,22 @@ msgstr ""
msgid "OnDemandScans|Scanner profile"
msgstr ""
-msgid "OnDemandScans|Select one of the existing profiles"
+msgid "OnDemandScans|Schedule scan"
msgstr ""
-msgid "OnDemandScans|Site profile"
+msgid "OnDemandScans|Select one of the existing profiles"
msgstr ""
-msgid "OnDemandScans|Use existing scanner profile"
+msgid "OnDemandScans|Site profile"
msgstr ""
-msgid "OnDemandScans|Use existing site profile"
+msgid "OnDemandScans|Start time"
msgstr ""
-msgid "OnDemandScans|You can either choose a passive scan or validate the target site in your chosen site profile. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
+msgid "OnDemandScans|Use existing scanner profile"
msgstr ""
-msgid "OnDemandScans|You cannot run an active scan against an unvalidated site."
+msgid "OnDemandScans|Use existing site profile"
msgstr ""
msgid "OnDemandScans|You must create a repository within your project to run an on-demand scan."
@@ -23511,6 +23815,9 @@ msgstr ""
msgid "Only admins can delete project"
msgstr ""
+msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
+msgstr ""
+
msgid "Only include features new to your current subscription tier."
msgstr ""
@@ -23529,6 +23836,12 @@ msgstr ""
msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
+msgid "Only reCAPTCHA v2 is supported:"
+msgstr ""
+
+msgid "Only users from the specified IP address ranges are able to reach this group, including all subgroups, projects, and Git repositories."
+msgstr ""
+
msgid "Only verified users with an email address in any of these domains can be added to the group."
msgstr ""
@@ -23715,9 +24028,6 @@ msgstr "СобÑтвеник"
msgid "Package Registry"
msgstr ""
-msgid "Package Registry Rate Limits"
-msgstr ""
-
msgid "Package Registry: authenticated API requests"
msgstr ""
@@ -23736,6 +24046,9 @@ msgstr ""
msgid "Package recipe already exists"
msgstr ""
+msgid "Package registry rate limits"
+msgstr ""
+
msgid "Package type"
msgstr ""
@@ -23802,6 +24115,9 @@ msgstr ""
msgid "PackageRegistry|Composer"
msgstr ""
+msgid "PackageRegistry|Composer.json with license: %{license} and version: %{version}"
+msgstr ""
+
msgid "PackageRegistry|Conan"
msgstr ""
@@ -23865,6 +24181,9 @@ msgstr ""
msgid "PackageRegistry|Copy require package include"
msgstr ""
+msgid "PackageRegistry|Copy target SHA"
+msgstr ""
+
msgid "PackageRegistry|Copy yarn command"
msgstr ""
@@ -23931,6 +24250,9 @@ msgstr ""
msgid "PackageRegistry|Install package version"
msgstr ""
+msgid "PackageRegistry|Instance-level"
+msgstr ""
+
msgid "PackageRegistry|Invalid Package: failed metadata extraction"
msgstr ""
@@ -23976,6 +24298,9 @@ msgstr ""
msgid "PackageRegistry|Pip Command"
msgstr ""
+msgid "PackageRegistry|Project-level"
+msgstr ""
+
msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
msgstr ""
@@ -23997,6 +24322,9 @@ msgstr ""
msgid "PackageRegistry|Remove package"
msgstr ""
+msgid "PackageRegistry|Required Python: %{pythonVersion}"
+msgstr ""
+
msgid "PackageRegistry|RubyGems"
msgstr ""
@@ -24039,6 +24367,9 @@ msgstr ""
msgid "PackageRegistry|Source project located at %{link}"
msgstr ""
+msgid "PackageRegistry|Target SHA: %{sha}"
+msgstr ""
+
msgid "PackageRegistry|There are no other versions of this package."
msgstr ""
@@ -24207,6 +24538,18 @@ msgstr ""
msgid "Password was successfully updated. Please sign in again."
msgstr ""
+msgid "PasswordPrompt|Confirm password"
+msgstr ""
+
+msgid "PasswordPrompt|Confirm password to continue"
+msgstr ""
+
+msgid "PasswordPrompt|Password is required"
+msgstr ""
+
+msgid "PasswordPrompt|Please enter your password to confirm"
+msgstr ""
+
msgid "Passwords should be unique and not used for any other sites or services."
msgstr ""
@@ -24234,6 +24577,9 @@ msgstr ""
msgid "Paste project path (i.e. gitlab-org/gitlab)"
msgstr ""
+msgid "Paste this DSN into your Sentry SDK"
+msgstr ""
+
msgid "Paste your public SSH key, which is usually contained in the file '~/.ssh/id_ed25519.pub' or '~/.ssh/id_rsa.pub' and begins with 'ssh-ed25519' or 'ssh-rsa'. Do not paste your private SSH key, as that can compromise your identity."
msgstr ""
@@ -24318,6 +24664,9 @@ msgstr ""
msgid "PerformanceBar|First Contentful Paint"
msgstr ""
+msgid "PerformanceBar|Flamegraph with mode:"
+msgstr ""
+
msgid "PerformanceBar|Frontend resources"
msgstr ""
@@ -24351,6 +24700,15 @@ msgstr ""
msgid "PerformanceBar|Trace"
msgstr ""
+msgid "PerformanceBar|cpu"
+msgstr ""
+
+msgid "PerformanceBar|object"
+msgstr ""
+
+msgid "PerformanceBar|wall"
+msgstr ""
+
msgid "Period in seconds"
msgstr ""
@@ -24579,6 +24937,48 @@ msgstr "Цел"
msgid "PipelineSchedules|Variables"
msgstr "Променливи"
+msgid "PipelineSource|API"
+msgstr ""
+
+msgid "PipelineSource|Chat"
+msgstr ""
+
+msgid "PipelineSource|External"
+msgstr ""
+
+msgid "PipelineSource|External Pull Request"
+msgstr ""
+
+msgid "PipelineSource|Merge Request"
+msgstr ""
+
+msgid "PipelineSource|On-Demand DAST Scan"
+msgstr ""
+
+msgid "PipelineSource|On-Demand DAST Validation"
+msgstr ""
+
+msgid "PipelineSource|Parent Pipeline"
+msgstr ""
+
+msgid "PipelineSource|Pipeline"
+msgstr ""
+
+msgid "PipelineSource|Push"
+msgstr ""
+
+msgid "PipelineSource|Schedule"
+msgstr ""
+
+msgid "PipelineSource|Trigger"
+msgstr ""
+
+msgid "PipelineSource|Web"
+msgstr ""
+
+msgid "PipelineSource|Web IDE"
+msgstr ""
+
msgid "PipelineStatusTooltip|Pipeline: %{ciStatus}"
msgstr ""
@@ -24879,46 +25279,7 @@ msgstr ""
msgid "Pipeline|Source"
msgstr ""
-msgid "Pipeline|Source|API"
-msgstr ""
-
-msgid "Pipeline|Source|Chat"
-msgstr ""
-
-msgid "Pipeline|Source|External"
-msgstr ""
-
-msgid "Pipeline|Source|External Pull Request"
-msgstr ""
-
-msgid "Pipeline|Source|Merge Request"
-msgstr ""
-
-msgid "Pipeline|Source|On-Demand DAST Scan"
-msgstr ""
-
-msgid "Pipeline|Source|On-Demand DAST Validation"
-msgstr ""
-
-msgid "Pipeline|Source|Parent Pipeline"
-msgstr ""
-
-msgid "Pipeline|Source|Pipeline"
-msgstr ""
-
-msgid "Pipeline|Source|Push"
-msgstr ""
-
-msgid "Pipeline|Source|Schedule"
-msgstr ""
-
-msgid "Pipeline|Source|Trigger"
-msgstr ""
-
-msgid "Pipeline|Source|Web"
-msgstr ""
-
-msgid "Pipeline|Source|Web IDE"
+msgid "Pipeline|Source|Security Policy"
msgstr ""
msgid "Pipeline|Specify variable values to be used in this run. The values specified in %{linkStart}CI/CD settings%{linkEnd} will be used by default."
@@ -24969,7 +25330,7 @@ msgstr ""
msgid "Pipeline|We are currently unable to fetch pipeline data"
msgstr ""
-msgid "Pipeline|You’re about to stop pipeline %{pipelineId}."
+msgid "Pipeline|You’re about to stop pipeline #%{pipelineId}."
msgstr ""
msgid "Pipeline|for"
@@ -24996,6 +25357,9 @@ msgstr ""
msgid "Plain diff"
msgstr ""
+msgid "Plain-text response to send to clients that hit a rate limit"
+msgstr ""
+
msgid "Plan:"
msgstr ""
@@ -25140,9 +25504,6 @@ msgstr ""
msgid "Please provide attributes to update"
msgstr ""
-msgid "Please provide your username or email address."
-msgstr ""
-
msgid "Please reach out if you have any questions and we'll be happy to assist."
msgstr ""
@@ -25185,9 +25546,6 @@ msgstr ""
msgid "Please set a new password before proceeding."
msgstr ""
-msgid "Please share your feedback about %{featureName} %{linkStart}in this issue%{linkEnd} to help us improve the experience."
-msgstr ""
-
msgid "Please solve the captcha"
msgstr ""
@@ -25365,6 +25723,9 @@ msgstr ""
msgid "Prevent adding new members to project membership within this group"
msgstr ""
+msgid "Prevent auto-stopping"
+msgstr ""
+
msgid "Prevent editing approval rules in projects and merge requests."
msgstr ""
@@ -25377,7 +25738,7 @@ msgstr ""
msgid "Prevent users from changing their profile name"
msgstr ""
-msgid "Prevent users from performing write operations on GitLab while performing maintenance."
+msgid "Prevent users from performing write operations while GitLab maintenance is in progress."
msgstr ""
msgid "Preview"
@@ -25650,6 +26011,9 @@ msgstr ""
msgid "Profiles|Enter your name, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Enter your password to confirm the email change"
+msgstr ""
+
msgid "Profiles|Enter your pronouns to let people know how to refer to you"
msgstr ""
@@ -25884,10 +26248,10 @@ msgstr ""
msgid "Profiles|e.g. My MacBook key"
msgstr ""
-msgid "Profiles|username"
+msgid "Profiles|https://website.com"
msgstr ""
-msgid "Profiles|website.com"
+msgid "Profiles|username"
msgstr ""
msgid "Profiles|your account"
@@ -26130,9 +26494,21 @@ msgstr ""
msgid "ProjectSelect| or group"
msgstr ""
+msgid "ProjectSelect|No matching results"
+msgstr ""
+
msgid "ProjectSelect|Search for project"
msgstr ""
+msgid "ProjectSelect|Search projects"
+msgstr ""
+
+msgid "ProjectSelect|Select a project"
+msgstr ""
+
+msgid "ProjectSelect|There was an error fetching the projects. Please try again."
+msgstr ""
+
msgid "ProjectService|Drone server URL"
msgstr ""
@@ -26220,6 +26596,9 @@ msgstr ""
msgid "ProjectService|Trigger event when a new, unique alert is recorded."
msgstr ""
+msgid "ProjectService|Trigger event when a new, unique vulnerability is recorded. (Note: This feature requires an Ultimate plan.)"
+msgstr ""
+
msgid "ProjectService|Trigger event when a pipeline status changes."
msgstr ""
@@ -26634,9 +27013,15 @@ msgstr ""
msgid "Projects are graded based on the highest severity vulnerability present"
msgstr ""
+msgid "Projects are organized into groups"
+msgstr ""
+
msgid "Projects contributed to"
msgstr ""
+msgid "Projects help you organize your work. They contain your file repository, issues, merge requests, and so much more."
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr ""
@@ -26871,10 +27256,10 @@ msgstr ""
msgid "PrometheusService|Prometheus cluster integration"
msgstr ""
-msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
+msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
msgstr ""
-msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
+msgid "PrometheusService|The ID of the IAP-secured resource."
msgstr ""
msgid "PrometheusService|The Prometheus API base URL."
@@ -27492,6 +27877,9 @@ msgstr ""
msgid "Rate limit"
msgstr ""
+msgid "Rate limits can help reduce request volume (like from crawlers or abusive bots)."
+msgstr ""
+
msgid "Raw blob request rate limit per minute"
msgstr ""
@@ -27504,6 +27892,9 @@ msgstr ""
msgid "Re-authentication required"
msgstr ""
+msgid "Re-import"
+msgstr ""
+
msgid "Re-request review"
msgstr ""
@@ -27525,6 +27916,9 @@ msgstr ""
msgid "Read more about related issues"
msgstr ""
+msgid "Read their documentation."
+msgstr ""
+
msgid "Ready to get started with GitLab? Follow these steps to set up your workspace, plan and commit changes, and deploy your project."
msgstr ""
@@ -27558,6 +27952,9 @@ msgstr ""
msgid "Receive any notifications from GitLab."
msgstr ""
+msgid "Receive notification of abuse reports by email."
+msgstr ""
+
msgid "Receive notifications about your own activity"
msgstr ""
@@ -27701,9 +28098,6 @@ msgstr ""
msgid "Registry setup"
msgstr ""
-msgid "Regulate approvals by authors/committers. Affects all projects."
-msgstr ""
-
msgid "Reindexing Status: %{status} (Slice multiplier: %{multiplier}, Maximum running slices: %{max_slices})"
msgstr ""
@@ -27799,6 +28193,9 @@ msgstr ""
msgid "Release|Something went wrong while saving the release details."
msgstr ""
+msgid "Reload page"
+msgstr ""
+
msgid "Remediations"
msgstr ""
@@ -28081,6 +28478,9 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
+msgid "Repeats"
+msgstr ""
+
msgid "Replace"
msgstr ""
@@ -28443,10 +28843,7 @@ msgstr ""
msgid "Require additional authentication for administrative tasks."
msgstr ""
-msgid "Require all users in this group to setup Two-factor authentication"
-msgstr ""
-
-msgid "Require all users in this group to setup two-factor authentication"
+msgid "Require all users in this group to set up two-factor authentication"
msgstr ""
msgid "Required approvals (%{approvals_given} given)"
@@ -28492,6 +28889,9 @@ msgstr[1] ""
msgid "Requires values to meet regular expression requirements."
msgstr ""
+msgid "Requires you to deploy or set up cloud-hosted Sentry."
+msgstr ""
+
msgid "Requires your primary GitLab email address."
msgstr ""
@@ -28552,9 +28952,6 @@ msgstr ""
msgid "Resolve"
msgstr ""
-msgid "Resolve all threads in new issue"
-msgstr ""
-
msgid "Resolve conflicts"
msgstr ""
@@ -28612,6 +29009,9 @@ msgstr ""
msgid "Response text"
msgstr ""
+msgid "Restart GitLab to apply changes."
+msgstr ""
+
msgid "Restart Terminal"
msgstr ""
@@ -28630,6 +29030,9 @@ msgstr ""
msgid "Restoring the project will prevent the project from being removed on this date and restore people's ability to make changes to it."
msgstr ""
+msgid "Restrict group access by IP address. %{link_start}Learn more%{link_end}."
+msgstr ""
+
msgid "Restrict membership by email domain"
msgstr ""
@@ -28943,6 +29346,9 @@ msgstr ""
msgid "Runners|Runner #%{runner_id}"
msgstr ""
+msgid "Runners|Runner assigned to project."
+msgstr ""
+
msgid "Runners|Runner is offline, last contact was %{runner_contact} ago"
msgstr ""
@@ -28955,6 +29361,9 @@ msgstr ""
msgid "Runners|Runner registration"
msgstr ""
+msgid "Runners|Runner unassigned from project."
+msgstr ""
+
msgid "Runners|Runners"
msgstr ""
@@ -29147,7 +29556,7 @@ msgstr ""
msgid "SastEntryPoints|How do I set up SAST?"
msgstr ""
-msgid "SastEntryPoints|Learn more."
+msgid "SastEntryPoints|Learn more"
msgstr ""
msgid "Satisfied"
@@ -29189,7 +29598,7 @@ msgstr ""
msgid "Save pipeline schedule"
msgstr "Запазване на плана за Ñхема"
-msgid "Save space and find images in the container Registry. remove unneeded tags and keep only the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
+msgid "Save storage space by automatically deleting tags from the container registry and keeping the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
msgstr ""
msgid "Saving"
@@ -29363,6 +29772,9 @@ msgstr ""
msgid "Search or filter results…"
msgstr ""
+msgid "Search or jump to..."
+msgstr ""
+
msgid "Search project"
msgstr ""
@@ -29423,16 +29835,16 @@ msgstr ""
msgid "SearchCodeResults|of %{link_to_project}"
msgstr ""
-msgid "SearchResults|Showing %{count} %{scope} for%{term_element}"
+msgid "SearchResults|Showing %{count} %{scope} for %{term_element}"
msgstr ""
-msgid "SearchResults|Showing %{count} %{scope} for%{term_element} in your personal and project snippets"
+msgid "SearchResults|Showing %{count} %{scope} for %{term_element} in your personal and project snippets"
msgstr ""
-msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for%{term_element}"
+msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for %{term_element}"
msgstr ""
-msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for%{term_element} in your personal and project snippets"
+msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for %{term_element} in your personal and project snippets"
msgstr ""
msgid "SearchResults|code result"
@@ -29514,6 +29926,9 @@ msgstr ""
msgid "Secret Detection"
msgstr ""
+msgid "Secret access key"
+msgstr ""
+
msgid "Secret token"
msgstr ""
@@ -29553,9 +29968,6 @@ msgstr ""
msgid "SecurityApprovals|A merge request approval is required when the license compliance report contains a denied license."
msgstr ""
-msgid "SecurityApprovals|Configurable if security scanners are enabled. %{linkStart}Learn more.%{linkEnd}"
-msgstr ""
-
msgid "SecurityApprovals|Coverage-Check"
msgstr ""
@@ -29568,24 +29980,18 @@ msgstr ""
msgid "SecurityApprovals|Learn more about Vulnerability-Check"
msgstr ""
-msgid "SecurityApprovals|License Scanning must be enabled. %{linkStart}Learn more%{linkEnd}."
-msgstr ""
-
msgid "SecurityApprovals|License-Check"
msgstr ""
msgid "SecurityApprovals|Requires approval for Denied licenses. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}More information%{linkEnd}"
+msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "SecurityApprovals|Requires approval for vulnerabilities. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
-msgid "SecurityApprovals|Test coverage must be enabled. %{linkStart}Learn more%{linkEnd}."
-msgstr ""
-
msgid "SecurityApprovals|Vulnerability-Check"
msgstr ""
@@ -29649,6 +30055,12 @@ msgstr ""
msgid "SecurityConfiguration|Immediately begin risk analysis and remediation with application security features. Start with SAST and Secret Detection, available to all plans. Upgrade to Ultimate to get all features, including:"
msgstr ""
+msgid "SecurityConfiguration|Manage corpus"
+msgstr ""
+
+msgid "SecurityConfiguration|Manage corpus files used as mutation sources in coverage fuzzing."
+msgstr ""
+
msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
msgstr ""
@@ -29703,6 +30115,12 @@ msgstr ""
msgid "SecurityOrchestration|Action"
msgstr ""
+msgid "SecurityOrchestration|Actions"
+msgstr ""
+
+msgid "SecurityOrchestration|Add rule"
+msgstr ""
+
msgid "SecurityOrchestration|All policies"
msgstr ""
@@ -29736,9 +30154,6 @@ msgstr ""
msgid "SecurityOrchestration|Network"
msgstr ""
-msgid "SecurityOrchestration|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
-msgstr ""
-
msgid "SecurityOrchestration|New policy"
msgstr ""
@@ -29754,6 +30169,9 @@ msgstr ""
msgid "SecurityOrchestration|Policy editor"
msgstr ""
+msgid "SecurityOrchestration|Policy preview"
+msgstr ""
+
msgid "SecurityOrchestration|Policy status"
msgstr ""
@@ -29763,6 +30181,9 @@ msgstr ""
msgid "SecurityOrchestration|Rule"
msgstr ""
+msgid "SecurityOrchestration|Rules"
+msgstr ""
+
msgid "SecurityOrchestration|Scan Execution"
msgstr ""
@@ -29856,6 +30277,9 @@ msgstr ""
msgid "SecurityReports|Create issue"
msgstr ""
+msgid "SecurityReports|Development vulnerabilities"
+msgstr ""
+
msgid "SecurityReports|Dismiss vulnerability"
msgstr ""
@@ -29871,6 +30295,9 @@ msgstr ""
msgid "SecurityReports|Download results"
msgstr ""
+msgid "SecurityReports|Download scanned URLs"
+msgstr ""
+
msgid "SecurityReports|Download scanned resources"
msgstr ""
@@ -29994,6 +30421,9 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
+msgid "SecurityReports|The Vulnerability Report shows the results of the lastest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "SecurityReports|The security reports below contain one or more vulnerability findings that could not be parsed and were not recorded. Download the artifacts in the job output to investigate. Ensure any security report created conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
msgstr ""
@@ -30135,10 +30565,10 @@ msgstr ""
msgid "Select a repository"
msgstr ""
-msgid "Select a role"
+msgid "Select a repository containing templates for common files."
msgstr ""
-msgid "Select a shared template repository for all projects on this instance."
+msgid "Select a role"
msgstr ""
msgid "Select a template repository"
@@ -30216,6 +30646,9 @@ msgstr ""
msgid "Select project to choose zone"
msgstr ""
+msgid "Select project to create issue"
+msgstr ""
+
msgid "Select projects"
msgstr ""
@@ -30333,6 +30766,9 @@ msgstr ""
msgid "Send emails to help guide new users through the onboarding process."
msgstr ""
+msgid "Send emails to users upon account deactivation."
+msgstr ""
+
msgid "Send message"
msgstr ""
@@ -30351,6 +30787,9 @@ msgstr ""
msgid "Send service data"
msgstr ""
+msgid "Sentry"
+msgstr ""
+
msgid "Sentry API URL"
msgstr ""
@@ -30465,6 +30904,9 @@ msgstr ""
msgid "Service"
msgstr ""
+msgid "Service Accounts keys are required to authorize GitLab to deploy your Google Cloud project."
+msgstr ""
+
msgid "Service Desk"
msgstr ""
@@ -30537,15 +30979,15 @@ msgstr ""
msgid "Set a password on your account to pull or push via %{protocol}."
msgstr "Задайте парола на акаунта Ñи, за да можете да изтеглÑте и изпращате промени чрез %{protocol}."
-msgid "Set a template repository for projects in this group"
-msgstr ""
-
msgid "Set access permissions for this token."
msgstr ""
msgid "Set an instance-wide domain that will be available to all clusters when installing Knative."
msgstr ""
+msgid "Set any rate limit to %{code_open}0%{code_close} to disable the limit."
+msgstr ""
+
msgid "Set default and restrict visibility levels. Configure import sources and git access protocol."
msgstr ""
@@ -30558,7 +31000,7 @@ msgstr ""
msgid "Set limit to 0 to allow any file size."
msgstr ""
-msgid "Set max session time for web terminal."
+msgid "Set limits for web and API requests."
msgstr ""
msgid "Set milestone"
@@ -30567,15 +31009,18 @@ msgstr ""
msgid "Set new password"
msgstr ""
-msgid "Set notification email for abuse reports."
+msgid "Set parent epic to an epic"
msgstr ""
-msgid "Set parent epic to an epic"
+msgid "Set per-user rate limits for imports and exports of projects and groups."
msgstr ""
msgid "Set projects and maximum size limits, session duration, user options, and check feature availability for namespace plan."
msgstr ""
+msgid "Set rate limits for package registry API requests that supersede the general user and IP rate limits."
+msgstr ""
+
msgid "Set severity"
msgstr ""
@@ -30594,15 +31039,24 @@ msgstr ""
msgid "Set the default branch for this project. All merge requests and commits are made against this branch unless you specify a different one."
msgstr ""
+msgid "Set the default expiration time for job artifacts in all projects. Set to %{code_open}0%{code_close} to never expire artifacts by default. If no unit is written, it defaults to seconds. For example, these are all equivalent: %{code_open}3600%{code_close}, %{code_open}60 minutes%{code_close}, or %{code_open}one hour%{code_close}."
+msgstr ""
+
msgid "Set the due date to %{due_date}."
msgstr ""
msgid "Set the iteration to %{iteration_reference}."
msgstr ""
+msgid "Set the maximum session time for a web terminal."
+msgstr ""
+
msgid "Set the milestone to %{milestone_reference}."
msgstr ""
+msgid "Set the per-user rate limit for notes created by web or API requests."
+msgstr ""
+
msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
msgstr ""
@@ -30804,6 +31258,9 @@ msgstr ""
msgid "Show Pipeline IID"
msgstr ""
+msgid "Show all %{issuable_type}."
+msgstr ""
+
msgid "Show all activity"
msgstr ""
@@ -30855,15 +31312,9 @@ msgstr ""
msgid "Show list"
msgstr ""
-msgid "Show me advanced features"
-msgstr ""
-
msgid "Show me how to add a pipeline"
msgstr ""
-msgid "Show me the basics"
-msgstr ""
-
msgid "Show one file at a time"
msgstr ""
@@ -30904,15 +31355,15 @@ msgstr ""
msgid "Showing %{pageSize} of %{total} %{issuableType}"
msgstr ""
-msgid "Showing %{pageSize} of %{total} issues"
-msgstr ""
-
msgid "Showing all epics"
msgstr ""
msgid "Showing all issues"
msgstr ""
+msgid "Showing data for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
+msgstr ""
+
msgid "Showing data for workflow items created in this date range. Date range cannot exceed %{maxDateRange} days."
msgstr ""
@@ -30952,6 +31403,15 @@ msgstr ""
msgid "Sidebar|Weight"
msgstr ""
+msgid "Sidekiq job compression threshold (bytes)"
+msgstr ""
+
+msgid "Sidekiq job size limit (bytes)"
+msgstr ""
+
+msgid "Sidekiq job size limits"
+msgstr ""
+
msgid "Sign in"
msgstr ""
@@ -31072,6 +31532,9 @@ msgstr ""
msgid "Site profile not found for given parameters"
msgstr ""
+msgid "Sites"
+msgstr ""
+
msgid "Size"
msgstr ""
@@ -31102,19 +31565,22 @@ msgstr ""
msgid "SlackIntegration|Sends notifications about project events to Slack channels."
msgstr ""
-msgid "SlackService|2. Paste the %{strong_open}Token%{strong_close} into the field below"
+msgid "SlackService|1. %{slash_command_link_start}Add a slash command%{slash_command_link_end} in your Slack team using this information:"
msgstr ""
-msgid "SlackService|3. Select the %{strong_open}Active%{strong_close} checkbox, press %{strong_open}Save changes%{strong_close} and start using GitLab inside Slack!"
+msgid "SlackService|2. Paste the token from Slack in the %{strong_open}Token%{strong_close} field below."
msgstr ""
-msgid "SlackService|Fill in the word that works best for your team."
+msgid "SlackService|3. Select the %{strong_open}Active%{strong_close} checkbox, select %{strong_open}Save changes%{strong_close}, and start using slash commands in Slack!"
+msgstr ""
+
+msgid "SlackService|After setup, get a list of available Slack slash commands by entering"
msgstr ""
-msgid "SlackService|See list of available commands in Slack after setting up this service, by entering"
+msgid "SlackService|Fill in the word that works best for your team."
msgstr ""
-msgid "SlackService|This service allows users to perform common operations on this project by entering slash commands in Slack."
+msgid "SlackService|Perform common operations in this project by entering slash commands in Slack."
msgstr ""
msgid "Slice multiplier"
@@ -31180,7 +31646,7 @@ msgstr ""
msgid "Some child epics may be hidden due to applied filters"
msgstr ""
-msgid "Some common domains are not allowed. %{read_more_link}."
+msgid "Some common domains are not allowed. %{learn_more_link}."
msgstr ""
msgid "Some of the designs you tried uploading did not change:"
@@ -31264,9 +31730,6 @@ msgstr ""
msgid "Something went wrong while exporting requirements"
msgstr ""
-msgid "Something went wrong while fetching %{listType} list"
-msgstr ""
-
msgid "Something went wrong while fetching branches"
msgstr ""
@@ -31321,15 +31784,9 @@ msgstr ""
msgid "Something went wrong while merging this merge request. Please try again."
msgstr ""
-msgid "Something went wrong while moving issues."
-msgstr ""
-
msgid "Something went wrong while obtaining the Let's Encrypt certificate."
msgstr ""
-msgid "Something went wrong while performing the action."
-msgstr ""
-
msgid "Something went wrong while promoting the issue to an epic. Please try again."
msgstr ""
@@ -31657,7 +32114,10 @@ msgstr ""
msgid "SourcegraphPreferences|Uses a custom %{linkStart}Sourcegraph instance%{linkEnd}."
msgstr ""
-msgid "Spam Check API Key"
+msgid "Spam Check"
+msgstr ""
+
+msgid "Spam Check API key"
msgstr ""
msgid "Spam Logs"
@@ -31675,7 +32135,7 @@ msgstr ""
msgid "Specified URL cannot be used: \"%{reason}\""
msgstr ""
-msgid "Specify an e-mail address regex pattern to identify default internal users."
+msgid "Specify an email address regex pattern to identify default internal users."
msgstr ""
msgid "Speed up your pipelines with Needs relationships"
@@ -31930,7 +32390,7 @@ msgstr ""
msgid "StatusCheck|An error occurred fetching the status checks."
msgstr ""
-msgid "StatusCheck|Apply this status check to any branch or a specific protected branch."
+msgid "StatusCheck|Apply this status check to all branches or a specific protected branch."
msgstr ""
msgid "StatusCheck|Check for a status response in Merge Requests. Failures do not block merges. %{link_start}Learn more%{link_end}."
@@ -32269,6 +32729,9 @@ msgstr ""
msgid "Subscriptions"
msgstr ""
+msgid "Subscription|Your subscription for %{strong}%{namespace_name}%{strong_close} has expired and you are now on %{pricing_link_start}the GitLab Free tier%{pricing_link_end}. Don't worry, your data is safe. Get in touch with our support team (%{support_email}). They'll gladly help with your subscription renewal."
+msgstr ""
+
msgid "Subtracted"
msgstr ""
@@ -32497,6 +32960,9 @@ msgstr ""
msgid "SuperSonics|Plan"
msgstr ""
+msgid "SuperSonics|Please agree to the Subscription Agreement"
+msgstr ""
+
msgid "SuperSonics|Ready to get started? A GitLab plan is ideal for scaling organizations and for multi team usage."
msgstr ""
@@ -32527,6 +32993,9 @@ msgstr ""
msgid "SuperSonics|The activation code is not valid. Please make sure to copy it exactly from the Customers Portal or confirmation email. Learn more about %{linkStart}activating your subscription%{linkEnd}."
msgstr ""
+msgid "SuperSonics|The activation code should be a 24-character alphanumeric string"
+msgstr ""
+
msgid "SuperSonics|There is a connectivity issue."
msgstr ""
@@ -32569,9 +33038,15 @@ msgstr ""
msgid "SuperSonics|You do not have an active subscription"
msgstr ""
+msgid "SuperSonics|You have successfully added a license that activates on %{date}. Please see the subscription history table below for more details."
+msgstr ""
+
msgid "SuperSonics|You'll be charged for %{trueUpLinkStart}users over license%{trueUpLinkEnd} on a quarterly or annual basis, depending on the terms of your agreement."
msgstr ""
+msgid "SuperSonics|Your future dated license was successfully added"
+msgstr ""
+
msgid "SuperSonics|Your subscription"
msgstr ""
@@ -32824,7 +33299,7 @@ msgstr ""
msgid "Template to append to all Service Desk issues"
msgstr ""
-msgid "TemplateRepository|Select a repository to make its templates available to all projects. %{link_start}What should the repository contain?%{link_end} "
+msgid "TemplateRepository|Create common files more quickly, and standardize their format."
msgstr ""
msgid "Templates"
@@ -33030,7 +33505,7 @@ msgstr ""
msgid "TestCases|Search test cases"
msgstr ""
-msgid "TestCases|Something went wrong while adding test case to Todo."
+msgid "TestCases|Something went wrong while adding test case to a to-do item."
msgstr ""
msgid "TestCases|Something went wrong while creating a test case."
@@ -33042,7 +33517,7 @@ msgstr ""
msgid "TestCases|Something went wrong while fetching test cases list."
msgstr ""
-msgid "TestCases|Something went wrong while marking test case todo as done."
+msgid "TestCases|Something went wrong while marking test case to-do item as done."
msgstr ""
msgid "TestCases|Something went wrong while moving test case."
@@ -33162,7 +33637,7 @@ msgstr ""
msgid "Thanks for your purchase!"
msgstr ""
-msgid "That is ok, I do not want to renew"
+msgid "That's OK, I don't want to renew"
msgstr ""
msgid "That's it, well done!"
@@ -33185,7 +33660,7 @@ msgid_plural "The %{type} contains the following errors:"
msgstr[0] ""
msgstr[1] ""
-msgid "The API key used by GitLab for accessing the Spam Check service endpoint"
+msgid "The API key used by GitLab for accessing the Spam Check service endpoint."
msgstr ""
msgid "The GitLab subscription service (customers.gitlab.com) is currently experiencing an outage. You can monitor the status and get updates at %{linkStart}status.gitlab.com%{linkEnd}."
@@ -33224,9 +33699,6 @@ msgstr ""
msgid "The URL to use for connecting to Elasticsearch. Use a comma-separated list to support clustering (e.g., \"http://localhost:9200, http://localhost:9201\")."
msgstr ""
-msgid "The Vulnerability Report shows the results of the last successful pipeline run on the default branch."
-msgstr ""
-
msgid "The X509 Certificate to use when mutual TLS is required to communicate with the external authorization service. If left blank, the server certificate is still validated when accessing over HTTPS."
msgstr ""
@@ -33284,9 +33756,6 @@ msgstr ""
msgid "The default branch for this project has been changed. Please update your bookmarks."
msgstr ""
-msgid "The default expiration time for job artifacts. 0 for unlimited. The default unit is in seconds, but you can use other units, for example %{code_open}4 mins 2 sec%{code_close}, %{code_open}2h42min%{code_close}."
-msgstr ""
-
msgid "The dependency list details information about the components used within your project."
msgstr ""
@@ -33478,9 +33947,6 @@ msgstr ""
msgid "The merge conflicts for this merge request have already been resolved. Please return to the merge request."
msgstr ""
-msgid "The merge request can now be merged."
-msgstr ""
-
msgid "The metric must be one of %{metrics}."
msgstr ""
@@ -33856,7 +34322,7 @@ msgstr ""
msgid "There was a problem updating the keep latest artifacts setting."
msgstr ""
-msgid "There was an error %{message} todo."
+msgid "There was an error %{message} to-do item."
msgstr ""
msgid "There was an error adding a To Do."
@@ -33895,6 +34361,9 @@ msgstr ""
msgid "There was an error fetching projects"
msgstr ""
+msgid "There was an error fetching search autocomplete suggestions"
+msgstr ""
+
msgid "There was an error fetching stage total counts"
msgstr ""
@@ -34219,6 +34688,9 @@ msgstr ""
msgid "This field is required."
msgstr ""
+msgid "This form is disabled in preview"
+msgstr ""
+
msgid "This group"
msgstr ""
@@ -34240,9 +34712,6 @@ msgstr ""
msgid "This group is linked to a subscription"
msgstr ""
-msgid "This group, including all subgroups, projects and git repositories, will be reachable from only the specified IP address ranges."
-msgstr ""
-
msgid "This group, its subgroups and projects has been scheduled for removal on %{date}."
msgstr ""
@@ -34522,9 +34991,6 @@ msgstr ""
msgid "This user cannot be unlocked manually from GitLab"
msgstr ""
-msgid "This user does not have a pending request"
-msgstr ""
-
msgid "This user has an unconfirmed email address (%{email}). You may force a confirmation."
msgstr ""
@@ -34633,9 +35099,6 @@ msgstr ""
msgid "ThreatMonitoring|Packet Activity"
msgstr ""
-msgid "ThreatMonitoring|Policies"
-msgstr ""
-
msgid "ThreatMonitoring|Requests"
msgstr ""
@@ -34687,6 +35150,12 @@ msgstr ""
msgid "ThreatMonitoring|View documentation"
msgstr ""
+msgid "Threshold in bytes at which to compress Sidekiq job arguments."
+msgstr ""
+
+msgid "Threshold in bytes at which to reject Sidekiq jobs. Set this to 0 to if you don't want to limit Sidekiq jobs."
+msgstr ""
+
msgid "Throughput"
msgstr ""
@@ -34696,6 +35165,9 @@ msgstr ""
msgid "Time"
msgstr ""
+msgid "Time (in hours) that users are allowed to skip forced configuration of two-factor authentication."
+msgstr ""
+
msgid "Time Spent"
msgstr ""
@@ -34762,7 +35234,7 @@ msgstr ""
msgid "TimeTrackingEstimated|Est"
msgstr ""
-msgid "TimeTracking|%{startTag}Spent: %{endTag}%{timeSpentHumanReadable}"
+msgid "TimeTracking|%{spentStart}Spent: %{spentEnd}"
msgstr ""
msgid "TimeTracking|Estimated:"
@@ -34976,6 +35448,9 @@ msgstr ""
msgid "To access this domain create a new DNS record"
msgstr ""
+msgid "To add a custom suffix, set up a Service Desk email address. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "To add an SSH key you need to %{generate_link_start}generate one%{link_end} or use an %{existing_link_start}existing key%{link_end}."
msgstr ""
@@ -34997,13 +35472,16 @@ msgstr ""
msgid "To connect an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To continue using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
+msgstr ""
+
msgid "To continue, you need to select the link in the confirmation email we sent to verify your email address. If you didn't get our email, select %{strongStart}Resend confirmation email.%{strongEnd}"
msgstr ""
msgid "To define internal users, first enable new users set to external"
msgstr ""
-msgid "To enable Registration Features, make sure \"Enable service ping\" is checked."
+msgid "To enable Registration Features, first enable Service Ping."
msgstr ""
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
@@ -35030,7 +35508,7 @@ msgstr ""
msgid "To get started, use the link below to confirm your account."
msgstr ""
-msgid "To help improve GitLab and its user experience, GitLab will periodically collect usage information."
+msgid "To help improve GitLab and its user experience, GitLab periodically collects usage information."
msgstr ""
msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
@@ -35063,7 +35541,7 @@ msgstr ""
msgid "To preserve performance only %{strong_open}%{display_size} of %{real_size}%{strong_close} files are displayed."
msgstr ""
-msgid "To protect this issue's confidentiality, %{forkLink} and set the fork's visibility to private."
+msgid "To protect this issue's confidentiality, %{linkStart}fork this project%{linkEnd} and set the fork's visibility to private."
msgstr ""
msgid "To protect this issue's confidentiality, a private fork of this project was selected."
@@ -35096,12 +35574,15 @@ msgstr ""
msgid "To set up SAML authentication for your group through an identity provider like Azure, Okta, Onelogin, Ping Identity, or your custom SAML 2.0 provider:"
msgstr ""
-msgid "To set up this service:"
+msgid "To set up this integration:"
msgstr ""
msgid "To specify the notification level per project of a group you belong to, you need to visit project page and change notification level there."
msgstr ""
+msgid "To start using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
+msgstr ""
+
msgid "To unsubscribe from this issue, please paste the following link into your browser:"
msgstr ""
@@ -35689,9 +36170,6 @@ msgstr ""
msgid "Unable to fetch branches list, please close the form and try again"
msgstr ""
-msgid "Unable to fetch unscanned projects"
-msgstr ""
-
msgid "Unable to fetch vulnerable projects"
msgstr ""
@@ -35746,6 +36224,15 @@ msgstr ""
msgid "Unable to update this issue at this time."
msgstr ""
+msgid "Unapprove a merge request"
+msgstr ""
+
+msgid "Unapprove the current merge request."
+msgstr ""
+
+msgid "Unapproved the current merge request."
+msgstr ""
+
msgid "Unarchive project"
msgstr ""
@@ -35758,16 +36245,13 @@ msgstr ""
msgid "Unassigned"
msgstr ""
-msgid "Unauthenticated API request rate limit"
-msgstr ""
-
-msgid "Unauthenticated rate limit period in seconds"
+msgid "Unauthenticated API rate limit period in seconds"
msgstr ""
-msgid "Unauthenticated request rate limit"
+msgid "Unauthenticated requests"
msgstr ""
-msgid "Unauthenticated requests"
+msgid "Unauthenticated web rate limit period in seconds"
msgstr ""
msgid "Undo"
@@ -35869,18 +36353,6 @@ msgstr ""
msgid "Unresolved"
msgstr ""
-msgid "UnscannedProjects|15 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|30 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|5 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|60 or more days"
-msgstr ""
-
msgid "Unschedule job"
msgstr ""
@@ -36100,6 +36572,9 @@ msgstr ""
msgid "UsageQuota|%{help_link_start}Shared runners%{help_link_end} are disabled, so there are no limits set on pipeline usage"
msgstr ""
+msgid "UsageQuota|%{linkTitle} help link"
+msgstr ""
+
msgid "UsageQuota|%{percentageLeft} of purchased storage is available"
msgstr ""
@@ -36109,6 +36584,9 @@ msgstr ""
msgid "UsageQuota|Artifacts is a sum of build and pipeline artifacts."
msgstr ""
+msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
+msgstr ""
+
msgid "UsageQuota|Buy additional minutes"
msgstr ""
@@ -36118,9 +36596,21 @@ msgstr ""
msgid "UsageQuota|CI minutes usage by project"
msgstr ""
+msgid "UsageQuota|Code packages and container images."
+msgstr ""
+
msgid "UsageQuota|Current period usage"
msgstr ""
+msgid "UsageQuota|File attachments and smaller design graphics."
+msgstr ""
+
+msgid "UsageQuota|Git repository, managed by the Gitaly service."
+msgstr ""
+
+msgid "UsageQuota|Includes project registry, artifacts, packages, wiki, uploads and other items."
+msgstr ""
+
msgid "UsageQuota|Increase storage temporarily"
msgstr ""
@@ -36139,6 +36629,9 @@ msgstr ""
msgid "UsageQuota|Packages"
msgstr ""
+msgid "UsageQuota|Pipeline artifacts and job artifacts, created with CI/CD."
+msgstr ""
+
msgid "UsageQuota|Pipelines"
msgstr ""
@@ -36157,6 +36650,9 @@ msgstr ""
msgid "UsageQuota|Seats"
msgstr ""
+msgid "UsageQuota|Shared bits of code and text."
+msgstr ""
+
msgid "UsageQuota|Snippets"
msgstr ""
@@ -36166,6 +36662,12 @@ msgstr ""
msgid "UsageQuota|Storage"
msgstr ""
+msgid "UsageQuota|Storage type"
+msgstr ""
+
+msgid "UsageQuota|There is a known issue with Artifact storage where the total could be incorrect for some projects. More details and progress are available in %{warningLinkStart}the epic%{warningLinkEnd}."
+msgstr ""
+
msgid "UsageQuota|This is the total amount of storage used across your projects within this namespace."
msgstr ""
@@ -36205,6 +36707,9 @@ msgstr ""
msgid "UsageQuota|Usage"
msgstr ""
+msgid "UsageQuota|Usage Breakdown"
+msgstr ""
+
msgid "UsageQuota|Usage Quotas"
msgstr ""
@@ -36229,6 +36734,9 @@ msgstr ""
msgid "UsageQuota|Wiki"
msgstr ""
+msgid "UsageQuota|Wiki content."
+msgstr ""
+
msgid "UsageQuota|Wikis"
msgstr ""
@@ -36445,7 +36953,10 @@ msgstr ""
msgid "User Settings"
msgstr ""
-msgid "User and IP Rate Limits"
+msgid "User and IP rate limits"
+msgstr ""
+
+msgid "User does not have a pending request"
msgstr ""
msgid "User identity was successfully created."
@@ -36742,6 +37253,9 @@ msgstr ""
msgid "Users can launch a development environment from a GitLab browser tab when the %{linkStart}Gitpod%{linkEnd} integration is enabled."
msgstr ""
+msgid "Users can reactivate their account by signing in."
+msgstr ""
+
msgid "Users can render diagrams in AsciiDoc, Markdown, reStructuredText, and Textile documents using Kroki."
msgstr ""
@@ -36757,6 +37271,9 @@ msgstr ""
msgid "Users requesting access to"
msgstr ""
+msgid "Users to exclude from the rate limit"
+msgstr ""
+
msgid "Users were successfully added."
msgstr ""
@@ -36778,6 +37295,9 @@ msgstr ""
msgid "UsersSelect|Unassigned"
msgstr ""
+msgid "Uses GitLab as a lightweight alternative to Sentry."
+msgstr ""
+
msgid "Using %{code_start}::%{code_end} denotes a %{link_start}scoped label set%{link_end}"
msgstr ""
@@ -36808,10 +37328,7 @@ msgstr ""
msgid "Value Stream Analytics can help you determine your team’s velocity"
msgstr ""
-msgid "Value Stream Analytics gives an overview of how much time it takes to go from idea to production in your project."
-msgstr ""
-
-msgid "Value may contain a variable reference"
+msgid "Value might contain a variable reference"
msgstr ""
msgid "Value stream"
@@ -36877,10 +37394,10 @@ msgstr ""
msgid "ValueStream|The Default Value Stream cannot be deleted"
msgstr ""
-msgid "Variable"
+msgid "Values that contain the %{codeStart}$%{codeEnd} character can be considered a variable reference and expanded. %{docsLinkStart}Learn more.%{docsLinkEnd}"
msgstr ""
-msgid "Variable references indicated by %{codeStart}$%{codeEnd} may be expanded. If this is not what you want, consider %{docsLinkStart}using a workaround to prevent expansion%{docsLinkEnd}."
+msgid "Variable"
msgstr ""
msgid "Variable will be masked in job logs."
@@ -37285,6 +37802,9 @@ msgstr ""
msgid "Vulnerability|Evidence"
msgstr ""
+msgid "Vulnerability|False positive detected"
+msgstr ""
+
msgid "Vulnerability|File"
msgstr ""
@@ -37327,6 +37847,9 @@ msgstr ""
msgid "Vulnerability|Status"
msgstr ""
+msgid "Vulnerability|The scanner determined this vulnerability to be a false positive. Verify the evaluation before changing its status. %{linkStart}Learn more about false positive detection.%{linkEnd}"
+msgstr ""
+
msgid "Vulnerability|The unmodified response is the original response that had no mutations done to the request"
msgstr ""
@@ -37651,9 +38174,6 @@ msgstr ""
msgid "Welcome to GitLab,%{br_tag}%{name}!"
msgstr ""
-msgid "Welcome to the guided GitLab tour"
-msgstr ""
-
msgid "Welcome, %{name}!"
msgstr ""
@@ -37672,9 +38192,6 @@ msgstr ""
msgid "What are you searching for?"
msgstr ""
-msgid "What describes you best?"
-msgstr ""
-
msgid "What does this command do?"
msgstr ""
@@ -37696,13 +38213,13 @@ msgstr ""
msgid "What is your job title? (optional)"
msgstr ""
-msgid "What will you use this group for?"
+msgid "What templates can I create?"
msgstr ""
-msgid "What's new"
+msgid "What will you use this group for?"
msgstr ""
-msgid "What’s your experience level?"
+msgid "What's new"
msgstr ""
msgid "When a deployment job is successful, skip older deployment jobs that are still pending."
@@ -37714,6 +38231,9 @@ msgstr ""
msgid "When an event in GitLab triggers a webhook, you can use the request details to figure out if something went wrong."
msgstr ""
+msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+msgstr ""
+
msgid "When inactive, an external authentication provider must be used."
msgstr ""
@@ -37737,6 +38257,9 @@ msgstr ""
msgid "When:"
msgstr ""
+msgid "Which API requests are affected?"
+msgstr ""
+
msgid "While it's rare to have no vulnerabilities, it can happen. In any event, we ask that you please double check your settings to make sure you've set up your dashboard correctly."
msgstr ""
@@ -38016,6 +38539,9 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|Work Items"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -38091,6 +38617,9 @@ msgstr ""
msgid "You are already a member of this %{member_source}."
msgstr ""
+msgid "You are already impersonating another user"
+msgstr ""
+
msgid "You are an admin, which means granting access to %{client_name} will allow them to interact with GitLab as an admin as well. Proceed with caution."
msgstr ""
@@ -38193,6 +38722,9 @@ msgstr ""
msgid "You can also use project access tokens with Git to authenticate over HTTP(S). %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "You can always change your URL later"
+msgstr ""
+
msgid "You can always edit this later"
msgstr ""
@@ -38349,10 +38881,10 @@ msgstr ""
msgid "You can’t %{tag_start}edit%{tag_end} files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
-msgid "You could not create a new trigger."
+msgid "You can’t edit files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
-msgid "You didn't renew your subscription for %{strong}%{namespace_name}%{strong_close} so it was downgraded to the free plan."
+msgid "You could not create a new trigger."
msgstr ""
msgid "You do not have any subscriptions yet"
@@ -38520,6 +39052,12 @@ msgstr ""
msgid "You must provide your current password in order to change it."
msgstr ""
+msgid "You must sign in to search for specific projects."
+msgstr ""
+
+msgid "You must sign in to search for specific terms."
+msgstr ""
+
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
@@ -38547,6 +39085,9 @@ msgstr ""
msgid "You need to upload a GitLab project export archive (ending in .gz)."
msgstr ""
+msgid "You need to verify your primary email first before enabling Two-Factor Authentication."
+msgstr ""
+
msgid "You successfully declined the invitation"
msgstr ""
@@ -38655,10 +39196,10 @@ msgstr ""
msgid "Your %{host} account was signed in to from a new location"
msgstr ""
-msgid "Your %{strong}%{plan_name}%{strong_close} subscription for %{strong}%{namespace_name}%{strong_close} will expire on %{strong}%{expires_on}%{strong_close}."
+msgid "Your %{strong}%{plan_name}%{strong_close} subscription expires on %{strong}%{expires_on}%{strong_close}. After that date, you cannot create issues or merge requests, or use many other features."
msgstr ""
-msgid "Your %{strong}%{plan_name}%{strong_close} subscription will expire on %{strong}%{expires_on}%{strong_close}. After that, you will not be able to create issues or merge requests as well as many other features."
+msgid "Your %{strong}%{plan_name}%{strong_close} subscription for %{strong}%{namespace_name}%{strong_close} will expire on %{strong}%{expires_on}%{strong_close}."
msgstr ""
msgid "Your CI/CD configuration syntax is invalid. View Lint tab for more details."
@@ -38682,7 +39223,7 @@ msgstr ""
msgid "Your GPG keys (%{count})"
msgstr ""
-msgid "Your GitLab account has been locked due to an excessive amount of unsuccessful sign in attempts. Your account will automatically unlock in %{duration} or you may click the link below to unlock now."
+msgid "Your GitLab account has been locked due to an excessive number of unsuccessful sign in attempts. You can wait for your account to automatically unlock in %{duration} or you can click the link below to unlock now."
msgstr ""
msgid "Your GitLab account request has been approved!"
@@ -38793,6 +39334,9 @@ msgstr ""
msgid "Your commit email is used for web based operations, such as edits and merges."
msgstr ""
+msgid "Your current password is required to register a two-factor authenticator app."
+msgstr ""
+
msgid "Your dashboard has been copied. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
@@ -38892,6 +39436,9 @@ msgstr ""
msgid "Your project limit is %{limit} projects! Please contact your administrator to increase it"
msgstr ""
+msgid "Your project will be created at:"
+msgstr ""
+
msgid "Your projects"
msgstr ""
@@ -38931,11 +39478,10 @@ msgstr ""
msgid "Your subscription expired!"
msgstr ""
-msgid "Your subscription has been downgraded."
-msgstr ""
-
-msgid "Your subscription will expire in %{remaining_days}."
-msgstr ""
+msgid "Your subscription will expire in %{remaining_days} day."
+msgid_plural "Your subscription will expire in %{remaining_days} days."
+msgstr[0] ""
+msgstr[1] ""
msgid "Your username is %{username}."
msgstr ""
@@ -39142,6 +39688,9 @@ msgstr ""
msgid "cannot merge"
msgstr ""
+msgid "cannot not be used for user namespace"
+msgstr ""
+
msgid "ciReport|%{degradedNum} degraded"
msgstr ""
@@ -39465,6 +40014,9 @@ msgstr ""
msgid "created %{timeAgo}"
msgstr ""
+msgid "created %{timeAgo} by %{author}"
+msgstr ""
+
msgid "created by"
msgstr ""
@@ -39509,9 +40061,6 @@ msgstr ""
msgid "does not have a supported extension. Only %{extension_list} are supported"
msgstr ""
-msgid "domain is not authorized for sign-up."
-msgstr ""
-
msgid "download it"
msgstr ""
@@ -39529,18 +40078,13 @@ msgstr ""
msgid "email '%{email}' is not a verified email."
msgstr ""
-msgid "email does not match the allowed domain of %{email_domains}"
-msgid_plural "email does not match the allowed domains: %{email_domains}"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "enabled"
msgstr ""
msgid "encrypted: needs to be a :required, :optional or :migrating!"
msgstr ""
-msgid "ending with MIME type format is not allowed."
+msgid "ending with a reserved file extension is not allowed."
msgstr ""
msgid "entries cannot be larger than 255 characters"
@@ -39564,6 +40108,9 @@ msgstr ""
msgid "estimateCommand|%{slash_command} overwrites the total estimated time."
msgstr ""
+msgid "example.com"
+msgstr ""
+
msgid "exceeds the limit of %{bytes} bytes"
msgstr ""
@@ -39614,9 +40161,6 @@ msgstr ""
msgid "fork"
msgstr ""
-msgid "fork this project"
-msgstr ""
-
msgid "from"
msgstr ""
@@ -39625,6 +40169,9 @@ msgid_plural "from %d jobs"
msgstr[0] ""
msgstr[1] ""
+msgid "frontmatter"
+msgstr ""
+
msgid "group"
msgstr ""
@@ -39652,6 +40199,9 @@ msgstr ""
msgid "has been completed."
msgstr ""
+msgid "has too deep level of nesting"
+msgstr ""
+
msgid "help"
msgstr ""
@@ -39685,9 +40235,21 @@ msgstr ""
msgid "in"
msgstr ""
+msgid "in Infrastructure :: Kubernetes clusters"
+msgstr ""
+
+msgid "in all GitLab"
+msgstr ""
+
+msgid "in group"
+msgstr ""
+
msgid "in group %{link_to_group}"
msgstr ""
+msgid "in project"
+msgstr ""
+
msgid "in project %{link_to_project}"
msgstr ""
@@ -39729,16 +40291,19 @@ msgstr ""
msgid "is not a valid X509 certificate."
msgstr ""
-msgid "is not allowed since the group is not top-level group."
+msgid "is not allowed for sign-up."
msgstr ""
-msgid "is not allowed. Try again with a different email address, or contact your GitLab admin."
+msgid "is not allowed for this group."
msgstr ""
-msgid "is not allowed. We do not currently support project-level iterations"
+msgid "is not allowed for this project."
+msgstr ""
+
+msgid "is not allowed since the group is not top-level group."
msgstr ""
-msgid "is not from an allowed domain."
+msgid "is not allowed. We do not currently support project-level iterations"
msgstr ""
msgid "is not in the group enforcing Group Managed Account"
@@ -39831,6 +40396,9 @@ msgstr ""
msgid "log in"
msgstr ""
+msgid "managed"
+msgstr ""
+
msgid "manual"
msgstr ""
@@ -39878,6 +40446,9 @@ msgstr ""
msgid "mrWidget| Please restore it or use a different %{missingBranchName} branch"
msgstr ""
+msgid "mrWidget|%{linkStart}Set up now%{linkEnd} to analyze your source code for known security vulnerabilities."
+msgstr ""
+
msgid "mrWidget|%{mergeError}."
msgstr ""
@@ -39958,6 +40529,9 @@ msgid_plural "mrWidget|Closes issues"
msgstr[0] ""
msgstr[1] ""
+msgid "mrWidget|Create issue to resolve all threads"
+msgstr ""
+
msgid "mrWidget|Delete source branch"
msgstr ""
@@ -39967,12 +40541,18 @@ msgstr ""
msgid "mrWidget|Did not close"
msgstr ""
+msgid "mrWidget|Dismiss"
+msgstr ""
+
msgid "mrWidget|Email patches"
msgstr ""
msgid "mrWidget|Failed to load deployment statistics"
msgstr ""
+msgid "mrWidget|Hide %{widget} details"
+msgstr ""
+
msgid "mrWidget|If the %{missingBranchName} branch exists in your local repository, you can merge this merge request manually using the command line"
msgstr ""
@@ -40068,9 +40648,6 @@ msgstr ""
msgid "mrWidget|Request to merge"
msgstr ""
-msgid "mrWidget|Resolve all threads in new issue"
-msgstr ""
-
msgid "mrWidget|Resolve conflicts"
msgstr ""
@@ -40086,6 +40663,9 @@ msgstr ""
msgid "mrWidget|Revoke approval"
msgstr ""
+msgid "mrWidget|SAST and Secret Detection is not enabled."
+msgstr ""
+
msgid "mrWidget|Set by %{merge_author} to be added to the merge train when the pipeline succeeds"
msgstr ""
@@ -40095,6 +40675,9 @@ msgstr ""
msgid "mrWidget|Set by %{merge_author} to start a merge train when the pipeline succeeds"
msgstr ""
+msgid "mrWidget|Show %{widget} details"
+msgstr ""
+
msgid "mrWidget|The changes were merged into"
msgstr ""
@@ -40107,6 +40690,9 @@ msgstr ""
msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure, or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
msgstr ""
+msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure."
+msgstr ""
+
msgid "mrWidget|The source branch has been deleted"
msgstr ""
@@ -40149,6 +40735,9 @@ msgstr ""
msgid "mrWidget|You can merge after removing denied licenses"
msgstr ""
+msgid "mrWidget|You can only merge once this merge request is approved."
+msgstr ""
+
msgid "mrWidget|Your password"
msgstr ""
@@ -40185,6 +40774,9 @@ msgstr ""
msgid "must be less than the limit of %{tag_limit} tags"
msgstr ""
+msgid "must be set for a project namespace"
+msgstr ""
+
msgid "must be unique by status and elapsed time within a policy"
msgstr ""
@@ -40294,6 +40886,9 @@ msgstr ""
msgid "pipeline"
msgstr ""
+msgid "pipeline schedules documentation"
+msgstr ""
+
msgid "pod_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
msgstr ""
@@ -40343,16 +40938,25 @@ msgstr ""
msgid "project name"
msgstr ""
+msgid "project namespace cannot be the parent of another namespace"
+msgstr ""
+
msgid "projects"
msgstr ""
msgid "quick actions"
msgstr ""
-msgid "reCAPTCHA Private Key"
+msgid "reCAPTCHA"
+msgstr ""
+
+msgid "reCAPTCHA helps prevent credential stuffing."
msgstr ""
-msgid "reCAPTCHA Site Key"
+msgid "reCAPTCHA private key"
+msgstr ""
+
+msgid "reCAPTCHA site key"
msgstr ""
msgid "recent activity"
@@ -40579,6 +41183,9 @@ msgstr ""
msgid "user avatar"
msgstr ""
+msgid "user namespace cannot be the parent of another namespace"
+msgstr ""
+
msgid "user preferences"
msgstr ""
@@ -40671,3 +41278,9 @@ msgstr ""
msgid "your settings"
msgstr ""
+msgid "{group}"
+msgstr ""
+
+msgid "{project}"
+msgstr ""
+
diff --git a/locale/bn_BD/gitlab.po b/locale/bn_BD/gitlab.po
index 228bcc29383..0fb483b3596 100644
--- a/locale/bn_BD/gitlab.po
+++ b/locale/bn_BD/gitlab.po
@@ -14,10 +14,7 @@ msgstr ""
"X-Crowdin-Language: bn\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-09-01 22:30\n"
-
-msgid " %{name}, confirm your email address now! "
-msgstr ""
+"PO-Revision-Date: 2021-10-04 20:18\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -92,6 +89,16 @@ msgstr ""
msgid "#general, #development"
msgstr ""
+msgid "%d Alert"
+msgid_plural "%d Alerts"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d Alert:"
+msgid_plural "%d Alerts:"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d Approval"
msgid_plural "%d Approvals"
msgstr[0] ""
@@ -455,7 +462,10 @@ msgstr ""
msgid "%{code_open}Protected:%{code_close} Only exposed to protected branches or tags."
msgstr ""
-msgid "%{commit_author_link} authored %{commit_timeago}"
+msgid "%{commit_author_link} authored %{commit_authored_timeago}"
+msgstr ""
+
+msgid "%{commit_author_link} authored %{commit_authored_timeago} and %{commit_committer_avatar} %{commit_committer_link} committed %{commit_committer_timeago}"
msgstr ""
msgid "%{completedCount} completed weight"
@@ -549,6 +559,15 @@ msgstr ""
msgid "%{doc_link_start}Advanced search%{doc_link_end} is enabled."
msgstr ""
+msgid "%{docs_link_start}Learn about visibility levels.%{docs_link_end}"
+msgstr ""
+
+msgid "%{docs_link_start}What is Large File Storage?%{docs_link_end}"
+msgstr ""
+
+msgid "%{docs_link_start}What is two-factor authentication?%{docs_link_end}"
+msgstr ""
+
msgid "%{due_date} (Past due)"
msgstr ""
@@ -621,9 +640,6 @@ msgstr ""
msgid "%{issueType} actions"
msgstr ""
-msgid "%{issuesCount} issues with a limit of %{maxIssueCount}"
-msgstr ""
-
msgid "%{issuesSize} with a limit of %{maxIssueCount}"
msgstr ""
@@ -681,6 +697,12 @@ msgstr ""
msgid "%{label_for_message} unavailable"
msgstr ""
+msgid "%{learn_more_link}."
+msgstr ""
+
+msgid "%{lessThan} 1 hour"
+msgstr ""
+
msgid "%{lets_encrypt_link_start}Let's Encrypt%{lets_encrypt_link_end} is a free, automated, and open certificate authority (CA) that issues digital certificates to enable HTTPS (SSL/TLS) for sites."
msgstr ""
@@ -693,15 +715,15 @@ msgstr ""
msgid "%{link_start}Learn more%{link_end} about roles."
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
-msgstr ""
-
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
msgstr ""
msgid "%{link_start}Start the title with %{draft_snippet}%{link_end} to prevent a merge request that is a work in progress from being merged before it's ready."
msgstr ""
+msgid "%{link_start}What information does GitLab Inc. collect?%{link_end}"
+msgstr ""
+
msgid "%{listToShow}, and %{awardsListLength} more"
msgstr ""
@@ -854,7 +876,7 @@ msgid_plural "%{securityScanner} results are not available because a pipeline ha
msgstr[0] ""
msgstr[1] ""
-msgid "%{service_ping_link_start}Learn more%{service_ping_link_end} about what information is shared with GitLab Inc."
+msgid "%{service_ping_link_start}What information is shared with GitLab Inc.?%{service_ping_link_end}"
msgstr ""
msgid "%{size} %{unit}"
@@ -890,6 +912,9 @@ msgstr ""
msgid "%{state} epics"
msgstr ""
+msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
+msgstr ""
+
msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
msgstr ""
@@ -949,11 +974,6 @@ msgstr ""
msgid "%{template_project_id} is unknown or invalid"
msgstr ""
-msgid "%{text} %{files}"
-msgid_plural "%{text} %{files} files"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%{text} is available"
msgstr ""
@@ -1038,9 +1058,6 @@ msgstr ""
msgid "%{wildcards_link_start}Wildcards%{wildcards_link_end} such as %{code_tag_start}v*%{code_tag_end} or %{code_tag_start}*-release%{code_tag_end} are supported."
msgstr ""
-msgid "&lt; 1 hour"
-msgstr ""
-
msgid "'%{data}' at %{location} does not match format: %{format}"
msgstr ""
@@ -1124,9 +1141,6 @@ msgstr ""
msgid "(we need your current password to confirm your changes)"
msgstr ""
-msgid "* * * * *"
-msgstr ""
-
msgid "+ %{amount} more"
msgstr ""
@@ -1193,10 +1207,10 @@ msgstr ""
msgid "."
msgstr ""
-msgid "0 bytes"
+msgid "/"
msgstr ""
-msgid "0 for unlimited, only effective with remote storage enabled."
+msgid "0 bytes"
msgstr ""
msgid "0t1DgySidms"
@@ -1326,6 +1340,9 @@ msgstr ""
msgid "1000+"
msgstr ""
+msgid "192.168.0.0/24"
+msgstr ""
+
msgid "1st contribution!"
msgstr ""
@@ -1479,9 +1496,6 @@ msgstr ""
msgid "A plain HTML site that uses Netlify for CI/CD instead of GitLab, but still with all the other great GitLab features"
msgstr ""
-msgid "A plain-text response to show to clients that hit the rate limit."
-msgstr ""
-
msgid "A platform value can be web, mob or app."
msgstr ""
@@ -1563,7 +1577,7 @@ msgstr ""
msgid "APIFuzzing|Configure HTTP basic authentication values. Other authentication methods are supported. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
+msgid "APIFuzzing|Customize your project's API fuzzing configuration options and copy the code snippet to your .gitlab-ci.yml file to apply any changes. Note that this tool does not reflect or update your .gitlab-ci.yml file automatically. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
msgstr ""
msgid "APIFuzzing|Enable authentication"
@@ -1626,9 +1640,6 @@ msgstr ""
msgid "APIFuzzing|To prevent a security leak, authentication info must be added as a %{ciVariablesLinkStart}CI variable%{ciVariablesLinkEnd}. As a user with maintainer access rights, you can manage CI variables in the %{ciSettingsLinkStart}Settings%{ciSettingsLinkEnd} area."
msgstr ""
-msgid "APIFuzzing|Use this tool to generate API fuzzing configuration YAML to copy into your .gitlab-ci.yml file. This tool does not reflect or update your .gitlab-ci.yml file automatically."
-msgstr ""
-
msgid "APIFuzzing|Username for basic authentication"
msgstr ""
@@ -1680,9 +1691,6 @@ msgstr ""
msgid "Abuse reports notification email"
msgstr ""
-msgid "Abuse reports will be sent to this address if it is set. Abuse reports are always available in the admin area."
-msgstr ""
-
msgid "Accept invitation"
msgstr ""
@@ -1719,12 +1727,18 @@ msgstr ""
msgid "Access granted"
msgstr ""
+msgid "Access key ID"
+msgstr ""
+
msgid "Access requests"
msgstr ""
msgid "Access to '%{classification_label}' not allowed"
msgstr ""
+msgid "Access tokens expire after 2 hours. A refresh token may be used at any time to generate a new access token. Non-expiring access tokens are deprecated. Clear this setting to enable backward compatibility."
+msgstr ""
+
msgid "AccessDropdown|Deploy Keys"
msgstr ""
@@ -2037,6 +2051,9 @@ msgstr ""
msgid "Add new directory"
msgstr ""
+msgid "Add new service account"
+msgstr ""
+
msgid "Add or remove previously merged commits"
msgstr ""
@@ -2274,6 +2291,9 @@ msgstr ""
msgid "AdminArea|Features"
msgstr ""
+msgid "AdminArea|Get security updates from GitLab and stay up to date"
+msgstr ""
+
msgid "AdminArea|Groups"
msgstr ""
@@ -2313,6 +2333,12 @@ msgstr ""
msgid "AdminArea|Reporter"
msgstr ""
+msgid "AdminArea|Sign up for the GitLab Security Newsletter to get notified for security updates."
+msgstr ""
+
+msgid "AdminArea|Sign up for the GitLab newsletter"
+msgstr ""
+
msgid "AdminArea|Stop all jobs"
msgstr ""
@@ -2382,9 +2408,15 @@ msgstr ""
msgid "AdminSettings|Disable public access to Pages sites"
msgstr ""
+msgid "AdminSettings|Display a banner on merge requests in projects with no pipelines to initiate steps to add a .gitlab-ci.yml file."
+msgstr ""
+
msgid "AdminSettings|Domain verification is an essential security measure for public GitLab sites. Users are required to demonstrate they control a domain before it is enabled. %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "AdminSettings|Enable pipeline suggestion banner"
+msgstr ""
+
msgid "AdminSettings|Enable shared runners for new projects"
msgstr ""
@@ -2856,10 +2888,10 @@ msgstr ""
msgid "Admin|Quarterly reconciliation will occur on %{qrtlyDate}"
msgstr ""
-msgid "Admin|The number of max seats used for your namespace is currently exceeding the number of seats in your subscription. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgid "Admin|The number of max seats in your namespace exceeds the number of seats in your subscription. On %{qrtlyDate}, quarterly reconciliation occurs and you are automatically billed a prorated amount for the overage. No action is needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice. For more information about the timing of the invoicing process, view the documentation."
msgstr ""
-msgid "Admin|The number of maximum users for your instance is currently exceeding the number of users in license. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgid "Admin|The number of max users in your instance exceeds the number of users in your license. On %{qrtlyDate}, quarterly reconciliation occurs and you are automatically billed a prorated amount for the overage. No action is needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice. For more information about the timing of the invoicing process, view the documentation."
msgstr ""
msgid "Admin|View pending user approvals"
@@ -2880,9 +2912,6 @@ msgstr ""
msgid "Advanced export options"
msgstr ""
-msgid "Advanced permissions, Large File Storage and Two-Factor authentication settings."
-msgstr ""
-
msgid "After a successful password update you will be redirected to login screen."
msgstr ""
@@ -2901,13 +2930,14 @@ msgstr ""
msgid "After you've reviewed these contribution guidelines, you'll be all set to"
msgstr ""
+msgid "Akismet"
+msgstr ""
+
msgid "Akismet API Key"
msgstr ""
-msgid "Alert"
-msgid_plural "Alerts"
-msgstr[0] ""
-msgstr[1] ""
+msgid "Akismet helps prevent the creation of spam issues in public projects."
+msgstr ""
msgid "AlertManagement|Acknowledged"
msgstr ""
@@ -3263,6 +3293,9 @@ msgstr ""
msgid "All (default)"
msgstr ""
+msgid "All GitLab"
+msgstr ""
+
msgid "All Members"
msgstr ""
@@ -3377,6 +3410,9 @@ msgstr ""
msgid "Allow this secondary node to replicate content on Object Storage"
msgstr ""
+msgid "Allow use of licensed EE features"
+msgstr ""
+
msgid "Allow users to dismiss the broadcast message"
msgstr ""
@@ -3452,9 +3488,6 @@ msgstr ""
msgid "Amazon authentication is not %{link_start}correctly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
-msgid "Amount of time (in hours) that users are allowed to skip forced configuration of two-factor authentication"
-msgstr ""
-
msgid "An %{link_start}alert%{link_end} with the same fingerprint is already open. To change the status of this alert, resolve the linked alert."
msgstr ""
@@ -3515,12 +3548,6 @@ msgstr ""
msgid "An error occurred when removing the label."
msgstr ""
-msgid "An error occurred when toggling the notification subscription"
-msgstr ""
-
-msgid "An error occurred when updating the issue weight"
-msgstr ""
-
msgid "An error occurred when updating the title"
msgstr ""
@@ -3569,6 +3596,9 @@ msgstr ""
msgid "An error occurred while enabling Service Desk."
msgstr ""
+msgid "An error occurred while fetching Markdown preview"
+msgstr ""
+
msgid "An error occurred while fetching ancestors"
msgstr ""
@@ -3599,9 +3629,6 @@ msgstr ""
msgid "An error occurred while fetching label colors."
msgstr ""
-msgid "An error occurred while fetching markdown preview"
-msgstr ""
-
msgid "An error occurred while fetching participants"
msgstr ""
@@ -3617,9 +3644,6 @@ msgstr ""
msgid "An error occurred while fetching reference"
msgstr ""
-msgid "An error occurred while fetching sidebar data"
-msgstr ""
-
msgid "An error occurred while fetching tags. Retry the search."
msgstr ""
@@ -3695,6 +3719,9 @@ msgstr ""
msgid "An error occurred while loading merge requests."
msgstr ""
+msgid "An error occurred while loading projects."
+msgstr ""
+
msgid "An error occurred while loading the Needs tab."
msgstr ""
@@ -3929,12 +3956,6 @@ msgstr ""
msgid "Any Milestone"
msgstr ""
-msgid "Any branch"
-msgstr ""
-
-msgid "Any eligible user"
-msgstr ""
-
msgid "Any encrypted tokens"
msgstr ""
@@ -3953,6 +3974,9 @@ msgstr ""
msgid "Any namespace"
msgstr ""
+msgid "App Engine description and apps that are suitable for this deployment target"
+msgstr ""
+
msgid "App ID"
msgstr ""
@@ -4101,6 +4125,11 @@ msgstr ""
msgid "Apply"
msgstr ""
+msgid "Apply %d suggestion"
+msgid_plural "Apply %d suggestions"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Apply a label"
msgstr ""
@@ -4110,13 +4139,10 @@ msgstr ""
msgid "Apply suggestion"
msgstr ""
-msgid "Apply suggestions"
-msgstr ""
-
msgid "Apply template"
msgstr ""
-msgid "Apply this approval rule to any branch or a specific protected branch."
+msgid "Apply this approval rule to all branches or a specific protected branch."
msgstr ""
msgid "Applying"
@@ -4259,9 +4285,6 @@ msgstr ""
msgid "ApprovalSettings|Prevent editing approval rules in projects and merge requests."
msgstr ""
-msgid "ApprovalSettings|Prevent editing approval rules in projects and merge requests. "
-msgstr ""
-
msgid "ApprovalSettings|Remove all approvals when commits are added to the source branch."
msgstr ""
@@ -4277,6 +4300,9 @@ msgstr ""
msgid "ApprovalSettings|This setting is configured at the instance level and can only be changed by an administrator."
msgstr ""
+msgid "ApprovalSettings|This setting is configured in %{groupName} and can only be changed by an administrator or group owner."
+msgstr ""
+
msgid "ApprovalStatusTooltip|Adheres to separation of duties"
msgstr ""
@@ -4763,9 +4789,6 @@ msgstr ""
msgid "Authenticated API rate limit period in seconds"
msgstr ""
-msgid "Authenticated API request rate limit"
-msgstr ""
-
msgid "Authenticated API requests"
msgstr ""
@@ -4775,10 +4798,10 @@ msgstr ""
msgid "Authenticated Git LFS request rate limit"
msgstr ""
-msgid "Authenticated web rate limit period in seconds"
+msgid "Authenticated Git LFS requests"
msgstr ""
-msgid "Authenticated web request rate limit"
+msgid "Authenticated web rate limit period in seconds"
msgstr ""
msgid "Authenticated web requests"
@@ -5156,9 +5179,6 @@ msgstr ""
msgid "Below you will find all the groups that are public."
msgstr ""
-msgid "Beta"
-msgstr ""
-
msgid "Bi-weekly code coverage"
msgstr ""
@@ -5398,6 +5418,21 @@ msgstr ""
msgid "Board scope affects which issues are displayed for anyone who visits this board"
msgstr ""
+msgid "BoardNewEpic|Groups"
+msgstr ""
+
+msgid "BoardNewEpic|Loading groups"
+msgstr ""
+
+msgid "BoardNewEpic|No matching results"
+msgstr ""
+
+msgid "BoardNewEpic|Search groups"
+msgstr ""
+
+msgid "BoardNewEpic|Select a group"
+msgstr ""
+
msgid "BoardNewIssue|No matching results"
msgstr ""
@@ -5475,6 +5510,9 @@ msgstr ""
msgid "Boards|An error occurred while creating the list. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching child groups. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching group projects. Please try again."
msgstr ""
@@ -5807,6 +5845,9 @@ msgstr ""
msgid "Bulk update"
msgstr ""
+msgid "BulkImports|Re-import creates a new group. It does not sync with the existing group."
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -5816,6 +5857,9 @@ msgstr ""
msgid "BulkImport|From source group"
msgstr ""
+msgid "BulkImport|Group import history"
+msgstr ""
+
msgid "BulkImport|Import failed: Destination cannot be a subgroup of the source group. Change the destination and try again."
msgstr ""
@@ -5828,9 +5872,18 @@ msgstr ""
msgid "BulkImport|Importing the group failed"
msgstr ""
+msgid "BulkImport|Last imported to %{link}"
+msgstr ""
+
msgid "BulkImport|Name already exists."
msgstr ""
+msgid "BulkImport|New group"
+msgstr ""
+
+msgid "BulkImport|No history is available"
+msgstr ""
+
msgid "BulkImport|No parent"
msgstr ""
@@ -5843,6 +5896,9 @@ msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} matching filter \"%{filter}\" from %{link}"
msgstr ""
+msgid "BulkImport|Source group"
+msgstr ""
+
msgid "BulkImport|To new group"
msgstr ""
@@ -5852,6 +5908,9 @@ msgstr ""
msgid "BulkImport|You have no groups to import"
msgstr ""
+msgid "BulkImport|Your imported groups will appear here."
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -6094,6 +6153,9 @@ msgstr ""
msgid "Can be manually deployed to"
msgstr ""
+msgid "Can be overridden in each project."
+msgstr ""
+
msgid "Can create groups:"
msgstr ""
@@ -6196,6 +6258,9 @@ msgstr ""
msgid "Cancelling Preview"
msgstr ""
+msgid "Cannot assign a confidential epic to a non-confidential issue. Make the issue confidential and try again"
+msgstr ""
+
msgid "Cannot be assigned to other projects."
msgstr ""
@@ -6247,9 +6312,6 @@ msgstr ""
msgid "Cannot refer to a group %{timebox_type} by an internal id!"
msgstr ""
-msgid "Cannot set confidential epic for a non-confidential issue"
-msgstr ""
-
msgid "Cannot show preview. For previews on sketch files, they must have the file format introduced by Sketch version 43 and above."
msgstr ""
@@ -6487,15 +6549,15 @@ msgstr ""
msgid "Check out, review, and merge locally"
msgstr ""
-msgid "Check the %{docs_link_start}documentation%{docs_link_end}."
-msgstr ""
-
msgid "Check the current instance configuration "
msgstr ""
msgid "Check the elasticsearch.log file to debug why the migration was halted and make any changes before retrying the migration. When you fix the cause of the failure, click \"Retry migration\", and the migration will be scheduled to be retried in the background."
msgstr ""
+msgid "Check with your administrator."
+msgstr ""
+
msgid "Check your Docker images for known vulnerabilities."
msgstr ""
@@ -6526,6 +6588,9 @@ msgstr ""
msgid "Checkout"
msgstr ""
+msgid "Checkout|$%{selectedPlanPrice} per 10 GB storage per pack"
+msgstr ""
+
msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 minutes"
msgstr ""
@@ -6546,17 +6611,23 @@ msgstr ""
msgid "Checkout|%{name}'s GitLab subscription"
msgstr ""
-msgid "Checkout|%{selectedPlanText} plan"
+msgid "Checkout|%{name}'s storage subscription"
msgstr ""
-msgid "Checkout|%{startDate} - %{endDate}"
+msgid "Checkout|%{quantity} GB of storage"
msgstr ""
-msgid "Checkout|%{totalCiMinutes} CI minute"
-msgid_plural "Checkout|%{totalCiMinutes} CI minutes"
+msgid "Checkout|%{quantity} storage pack"
+msgid_plural "Checkout|%{quantity} storage packs"
msgstr[0] ""
msgstr[1] ""
+msgid "Checkout|%{selectedPlanText} plan"
+msgstr ""
+
+msgid "Checkout|%{startDate} - %{endDate}"
+msgstr ""
+
msgid "Checkout|%{totalCiMinutes} CI minutes"
msgstr ""
@@ -6632,6 +6703,9 @@ msgstr ""
msgid "Checkout|Failed to register credit card. Please try again."
msgstr ""
+msgid "Checkout|GB"
+msgstr ""
+
msgid "Checkout|GitLab group"
msgstr ""
@@ -6668,6 +6742,9 @@ msgstr ""
msgid "Checkout|State"
msgstr ""
+msgid "Checkout|Storage packs"
+msgstr ""
+
msgid "Checkout|Street address"
msgstr ""
@@ -6689,6 +6766,9 @@ msgstr ""
msgid "Checkout|Total minutes: %{quantity}"
msgstr ""
+msgid "Checkout|Total storage: %{quantity} GB"
+msgstr ""
+
msgid "Checkout|Users"
msgstr ""
@@ -6698,16 +6778,25 @@ msgstr ""
msgid "Checkout|Your organization"
msgstr ""
+msgid "Checkout|Your storage subscription has the same term as your main subscription, and the price is prorated accordingly."
+msgstr ""
+
msgid "Checkout|Your subscription will be applied to this group"
msgstr ""
msgid "Checkout|Zip code"
msgstr ""
+msgid "Checkout|a storage subscription"
+msgstr ""
+
msgid "Checkout|company or team"
msgstr ""
-msgid "Checkout|x 1,000 minutes per pack = %{strong}"
+msgid "Checkout|minutes"
+msgstr ""
+
+msgid "Checkout|x %{quantity} %{units} per pack ="
msgstr ""
msgid "Cherry-pick this commit"
@@ -7064,6 +7153,9 @@ msgstr ""
msgid "CloneIssue|Cannot clone issue to target project as it is pending deletion."
msgstr ""
+msgid "CloneIssue|Cannot clone issues of '%{issue_type}' type."
+msgstr ""
+
msgid "Cloned this issue to %{path_to_project}."
msgstr ""
@@ -7118,7 +7210,10 @@ msgstr ""
msgid "Closes this %{quick_action_target}."
msgstr ""
-msgid "Cloud licenses can not be removed."
+msgid "Cloud Functions description and apps that are suitable for this deployment target"
+msgstr ""
+
+msgid "Cloud Run description and apps that are suitable for this deployment target"
msgstr ""
msgid "Cluster"
@@ -7145,6 +7240,12 @@ msgstr ""
msgid "ClusterAgents|Access tokens"
msgstr ""
+msgid "ClusterAgents|Agent might not be connected to GitLab"
+msgstr ""
+
+msgid "ClusterAgents|Agent never connected to GitLab"
+msgstr ""
+
msgid "ClusterAgents|Alternative installation methods"
msgstr ""
@@ -7160,6 +7261,12 @@ msgstr ""
msgid "ClusterAgents|Configuration"
msgstr ""
+msgid "ClusterAgents|Connected"
+msgstr ""
+
+msgid "ClusterAgents|Connection status"
+msgstr ""
+
msgid "ClusterAgents|Copy token"
msgstr ""
@@ -7178,6 +7285,9 @@ msgstr ""
msgid "ClusterAgents|For alternative installation methods %{linkStart}go to the documentation%{linkEnd}."
msgstr ""
+msgid "ClusterAgents|For more troubleshooting information go to"
+msgstr ""
+
msgid "ClusterAgents|Go to the repository"
msgstr ""
@@ -7193,18 +7303,30 @@ msgstr ""
msgid "ClusterAgents|Integrate with the GitLab Agent"
msgstr ""
-msgid "ClusterAgents|Last used"
+msgid "ClusterAgents|Last connected %{timeAgo}."
+msgstr ""
+
+msgid "ClusterAgents|Last contact"
msgstr ""
msgid "ClusterAgents|Learn how to create an agent access token"
msgstr ""
+msgid "ClusterAgents|Make sure you are using a valid token."
+msgstr ""
+
msgid "ClusterAgents|Name"
msgstr ""
msgid "ClusterAgents|Never"
msgstr ""
+msgid "ClusterAgents|Never connected"
+msgstr ""
+
+msgid "ClusterAgents|Not connected"
+msgstr ""
+
msgid "ClusterAgents|Read more about getting started"
msgstr ""
@@ -7226,6 +7348,9 @@ msgstr ""
msgid "ClusterAgents|Select which Agent you want to install"
msgstr ""
+msgid "ClusterAgents|The Agent has not been connected in a long time. There might be a connectivity issue. Last contact was %{timeAgo}."
+msgstr ""
+
msgid "ClusterAgents|The GitLab Agent also requires %{linkStart}enabling the Agent Server%{linkEnd}"
msgstr ""
@@ -7253,9 +7378,6 @@ msgstr ""
msgid "ClusterAgents|You will need to create a token to connect to your agent"
msgstr ""
-msgid "ClusterAgent|This feature is only available for premium plans"
-msgstr ""
-
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -7445,9 +7567,6 @@ msgstr ""
msgid "ClusterIntegration|Create Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Create a provision role on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the account and external ID above. %{startMoreInfoLink}More information%{endLink}"
-msgstr ""
-
msgid "ClusterIntegration|Create cluster on"
msgstr ""
@@ -7880,7 +7999,7 @@ msgstr ""
msgid "ClusterIntegration|Subnets"
msgstr ""
-msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provisioned role, first create one on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the above account and external IDs. %{startMoreInfoLink}More information%{endLink}"
+msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provisioned role, first create one on %{awsLinkStart}Amazon Web Services %{awsLinkEnd} using the above account and external IDs. %{moreInfoStart}More information%{moreInfoEnd}"
msgstr ""
msgid "ClusterIntegration|The Kubernetes certificate used to authenticate to the cluster."
@@ -8114,6 +8233,9 @@ msgstr ""
msgid "Collapse replies"
msgstr ""
+msgid "Collapse settings section"
+msgstr ""
+
msgid "Collapse sidebar"
msgstr ""
@@ -8132,6 +8254,9 @@ msgstr ""
msgid "Comma-separated list of email addresses."
msgstr ""
+msgid "Comma-separated list of users allowed to exceed the rate limit."
+msgstr ""
+
msgid "Comma-separated, e.g. '1.1.1.1, 2.2.2.0/24'"
msgstr ""
@@ -8452,6 +8577,9 @@ msgstr ""
msgid "Configure %{repository_checks_link_start}repository checks%{link_end} and %{housekeeping_link_start}housekeeping%{link_end} on repositories."
msgstr ""
+msgid "Configure CAPTCHAs, IP address limits, and other anti-spam measures."
+msgstr ""
+
msgid "Configure Dependency Scanning in `.gitlab-ci.yml` using the GitLab managed template. You can [add variable overrides](https://docs.gitlab.com/ee/user/application_security/dependency_scanning/#customizing-the-dependency-scanning-settings) to customize Dependency Scanning settings."
msgstr ""
@@ -8488,16 +8616,13 @@ msgstr ""
msgid "Configure a %{codeStart}.gitlab-webide.yml%{codeEnd} file in the %{codeStart}.gitlab%{codeEnd} directory to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
msgstr ""
-msgid "Configure existing installation"
-msgstr ""
-
-msgid "Configure limit for notes created per minute by web and API requests."
+msgid "Configure advanced permissions, Large File Storage, and two-factor authentication settings."
msgstr ""
-msgid "Configure limits for Project/Group Import/Export."
+msgid "Configure approvals by authors and committers on all projects."
msgstr ""
-msgid "Configure limits for web and API requests."
+msgid "Configure existing installation"
msgstr ""
msgid "Configure paths to be protected by Rack Attack."
@@ -8512,10 +8637,13 @@ msgstr ""
msgid "Configure settings for Advanced Search with Elasticsearch."
msgstr ""
+msgid "Configure specific limits for Files API requests that supersede the general user and IP rate limits."
+msgstr ""
+
msgid "Configure specific limits for Git LFS requests that supersede the general user and IP rate limits."
msgstr ""
-msgid "Configure specific limits for Packages API requests that supersede the general user and IP rate limits."
+msgid "Configure specific limits for deprecated API requests that supersede the general user and IP rate limits."
msgstr ""
msgid "Configure the %{link} integration."
@@ -8527,6 +8655,9 @@ msgstr ""
msgid "Configure the way a user creates a new account."
msgstr ""
+msgid "Configure via Merge Request"
+msgstr ""
+
msgid "Configure which lists are shown for anyone who visits this board"
msgstr ""
@@ -8995,6 +9126,9 @@ msgstr ""
msgid "Content parsed with %{link}."
msgstr ""
+msgid "ContentEditor|Table of Contents"
+msgstr ""
+
msgid "ContentEditor|You have to provide a renderMarkdown function or a custom serializer"
msgstr ""
@@ -9181,6 +9315,9 @@ msgstr ""
msgid "Copy link to chart"
msgstr ""
+msgid "Copy prefix"
+msgstr ""
+
msgid "Copy reference"
msgstr ""
@@ -9211,6 +9348,9 @@ msgstr ""
msgid "Copy value"
msgstr ""
+msgid "Corpus Management"
+msgstr ""
+
msgid "Corpus Management|Are you sure you want to delete the corpus?"
msgstr ""
@@ -9439,6 +9579,9 @@ msgstr ""
msgid "Create commit"
msgstr ""
+msgid "Create common files more quickly, and standardize their format."
+msgstr ""
+
msgid "Create confidential merge request"
msgstr ""
@@ -9472,6 +9615,9 @@ msgstr ""
msgid "Create issue"
msgstr ""
+msgid "Create issue to resolve all threads"
+msgstr ""
+
msgid "Create iteration"
msgstr ""
@@ -9526,6 +9672,9 @@ msgstr ""
msgid "Create new..."
msgstr ""
+msgid "Create or import your first project"
+msgstr ""
+
msgid "Create project"
msgstr ""
@@ -9883,7 +10032,7 @@ msgstr ""
msgid "Custom notification events"
msgstr ""
-msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notificationLinkStart} notification emails%{notificationLinkEnd}."
+msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notificationLinkStart}notification emails%{notificationLinkEnd}."
msgstr ""
msgid "Custom project templates"
@@ -10082,10 +10231,10 @@ msgid_plural "CycleAnalytics|Showing %{subjectFilterText} and %{selectedLabelsCo
msgstr[0] ""
msgstr[1] ""
-msgid "CycleAnalytics|Showing data for group '%{groupName}' and %{selectedProjectCount} projects from %{startDate} to %{endDate}"
+msgid "CycleAnalytics|Showing data for group '%{groupName}' and %{selectedProjectCount} projects from %{createdAfter} to %{createdBefore}"
msgstr ""
-msgid "CycleAnalytics|Showing data for group '%{groupName}' from %{startDate} to %{endDate}"
+msgid "CycleAnalytics|Showing data for group '%{groupName}' from %{createdAfter} to %{createdBefore}"
msgstr ""
msgid "CycleAnalytics|Stages"
@@ -10319,6 +10468,9 @@ msgstr ""
msgid "DastProfiles|Manage profiles"
msgstr ""
+msgid "DastProfiles|Manage site profiles"
+msgstr ""
+
msgid "DastProfiles|Minimum = 0 (no timeout enabled), Maximum = 2880 minutes"
msgstr ""
@@ -10394,6 +10546,9 @@ msgstr ""
msgid "DastProfiles|Scanner name"
msgstr ""
+msgid "DastProfiles|Schedule"
+msgstr ""
+
msgid "DastProfiles|Select branch"
msgstr ""
@@ -10463,7 +10618,7 @@ msgstr ""
msgid "DastProfiles|Website"
msgstr ""
-msgid "DastProfiles|You can either choose a passive scan or validate the target site in your chosen site profile. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
+msgid "DastProfiles|You can either choose a passive scan or validate the target site from the site profile management page. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
msgstr ""
msgid "DastProfiles|You cannot run an active scan against an unvalidated site."
@@ -10636,7 +10791,7 @@ msgstr ""
msgid "Days to merge"
msgstr ""
-msgid "Deactivate dormant users after 90 days of inactivity. Users can return to active status by signing in to their account. While inactive, a user is not counted as an active user in the instance."
+msgid "Deactivate dormant users after 90 days of inactivity"
msgstr ""
msgid "Dear Administrator,"
@@ -10723,10 +10878,10 @@ msgstr ""
msgid "Define a custom pattern with cron syntax"
msgstr ""
-msgid "Define approval settings."
+msgid "Define approval rules."
msgstr ""
-msgid "Define approval settings. %{linkStart}Learn more.%{linkEnd}"
+msgid "Define approval rules. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "Define custom rules for what constitutes spam, independent of Akismet"
@@ -10735,7 +10890,7 @@ msgstr ""
msgid "Define environments in the deploy stage(s) in %{code_open}.gitlab-ci.yml%{code_close} to track deployments here."
msgstr ""
-msgid "Define how approval rules are applied as a merge request moves toward completion."
+msgid "Define how approval rules are applied to merge requests."
msgstr ""
msgid "Definition"
@@ -10750,6 +10905,12 @@ msgstr ""
msgid "DelayedJobs|Are you sure you want to run %{job_name} immediately? This job will run automatically after it's timer finishes."
msgstr ""
+msgid "DelayedJobs|Are you sure you want to run %{job_name} immediately? This job will run automatically after its timer finishes."
+msgstr ""
+
+msgid "DelayedJobs|Run the delayed job now?"
+msgstr ""
+
msgid "DelayedJobs|Start now"
msgstr ""
@@ -11026,6 +11187,12 @@ msgstr ""
msgid "Dependency proxy image prefix"
msgstr ""
+msgid "DependencyProxy|Create a local proxy for storing frequently used upstream images. %{docLinkStart}Learn more%{docLinkEnd} about dependency proxies."
+msgstr ""
+
+msgid "DependencyProxy|Dependency Proxy"
+msgstr ""
+
msgid "DependencyProxy|Toggle Dependency Proxy"
msgstr ""
@@ -11266,6 +11433,9 @@ msgstr ""
msgid "Deployments"
msgstr ""
+msgid "Deployments to Google Kubernetes Engine can be "
+msgstr ""
+
msgid "Deployments|%{deployments} environment impacted."
msgid_plural "Deployments|%{deployments} environments impacted."
msgstr[0] ""
@@ -11295,6 +11465,9 @@ msgstr ""
msgid "Deployment|success"
msgstr ""
+msgid "Deprecated API rate limits"
+msgstr ""
+
msgid "Deprioritize label"
msgstr ""
@@ -11697,6 +11870,16 @@ msgstr ""
msgid "DiffsCompareBaseBranch|(base)"
msgstr ""
+msgid "Diffs|%d addition"
+msgid_plural "Diffs|%d additions"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Diffs|%d deletion"
+msgid_plural "Diffs|%d deletions"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Diffs|No file name available"
msgstr ""
@@ -11706,9 +11889,17 @@ msgstr ""
msgid "Diffs|Show all unchanged lines"
msgstr ""
+msgid "Diffs|Showing %{dropdownStart}%{count} changed file%{dropdownEnd}"
+msgid_plural "Diffs|Showing %{dropdownStart}%{count} changed files%{dropdownEnd}"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Diffs|Something went wrong while fetching diff lines."
msgstr ""
+msgid "Diffs|with %{additions} and %{deletions}"
+msgstr ""
+
msgid "Direct member"
msgstr ""
@@ -11834,9 +12025,6 @@ msgid_plural "Dismiss %d selected vulnerabilities as"
msgstr[0] ""
msgstr[1] ""
-msgid "Dismiss Value Stream Analytics introduction box"
-msgstr ""
-
msgid "Dismiss merge request promotion"
msgstr ""
@@ -12158,6 +12346,9 @@ msgstr ""
msgid "Edit issues"
msgstr ""
+msgid "Edit merge requests"
+msgstr ""
+
msgid "Edit public deploy key"
msgstr ""
@@ -12233,6 +12424,9 @@ msgstr ""
msgid "Elastic|None. Select projects to index."
msgstr ""
+msgid "Eligible users"
+msgstr ""
+
msgid "Email"
msgstr ""
@@ -12362,6 +12556,9 @@ msgstr ""
msgid "Enable"
msgstr ""
+msgid "Enable Amazon EKS integration"
+msgstr ""
+
msgid "Enable Auto DevOps"
msgstr ""
@@ -12395,6 +12592,9 @@ msgstr ""
msgid "Enable SSL verification"
msgstr ""
+msgid "Enable Service Ping"
+msgstr ""
+
msgid "Enable Snowplow tracking"
msgstr ""
@@ -12425,6 +12625,9 @@ msgstr ""
msgid "Enable authenticated Git LFS request rate limit"
msgstr ""
+msgid "Enable authenticated web request rate limit"
+msgstr ""
+
msgid "Enable authentication"
msgstr ""
@@ -12485,7 +12688,7 @@ msgstr ""
msgid "Enable or disable the Pseudonymizer data collection."
msgstr ""
-msgid "Enable or disable version check and service ping."
+msgid "Enable or disable version check and Service Ping."
msgstr ""
msgid "Enable protected paths rate limit"
@@ -12497,18 +12700,12 @@ msgstr ""
msgid "Enable reCAPTCHA"
msgstr ""
-msgid "Enable reCAPTCHA for login"
-msgstr ""
-
-msgid "Enable reCAPTCHA, Invisible Captcha, Akismet and set IP limits. For reCAPTCHA, we currently only support %{recaptcha_v2_link_start}v2%{recaptcha_v2_link_end}"
+msgid "Enable reCAPTCHA for login."
msgstr ""
msgid "Enable repository checks"
msgstr ""
-msgid "Enable service ping"
-msgstr ""
-
msgid "Enable shared runners for all projects and subgroups in this group."
msgstr ""
@@ -12530,7 +12727,10 @@ msgstr ""
msgid "Enable unauthenticated API request rate limit"
msgstr ""
-msgid "Enable unauthenticated request rate limit"
+msgid "Enable unauthenticated web request rate limit"
+msgstr ""
+
+msgid "Enable user deactivation emails"
msgstr ""
msgid "Enable version check"
@@ -12566,9 +12766,6 @@ msgstr ""
msgid "Enabled sources for code import during project creation. OmniAuth must be configured for GitHub"
msgstr ""
-msgid "Enabling this will only make licensed EE features available to projects if the project namespace's plan includes the feature or if the project is public."
-msgstr ""
-
msgid "Encountered an error while rendering: %{err}"
msgstr ""
@@ -12617,9 +12814,6 @@ msgstr ""
msgid "Enter Admin Mode"
msgstr ""
-msgid "Enter IP address range"
-msgstr ""
-
msgid "Enter a number"
msgstr ""
@@ -12632,9 +12826,6 @@ msgstr ""
msgid "Enter at least three characters to search"
msgstr ""
-msgid "Enter domain"
-msgstr ""
-
msgid "Enter in your Bitbucket Server URL and personal access token below"
msgstr ""
@@ -12821,9 +13012,6 @@ msgstr ""
msgid "Environments|Deployment %{status}"
msgstr ""
-msgid "Environments|Dismiss"
-msgstr ""
-
msgid "Environments|Enable review app"
msgstr ""
@@ -12836,9 +13024,6 @@ msgstr ""
msgid "Environments|Environments are places where code gets deployed, such as staging or production."
msgstr ""
-msgid "Environments|Help us improve environments"
-msgstr ""
-
msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
msgstr ""
@@ -12875,6 +13060,9 @@ msgstr ""
msgid "Environments|Note that this action will stop the environment, but it will %{emphasisStart}not%{emphasisEnd} have an effect on any existing deployment due to no “stop environment action†being defined in the %{ciConfigLinkStart}.gitlab-ci.yml%{ciConfigLinkEnd} file."
msgstr ""
+msgid "Environments|Open"
+msgstr ""
+
msgid "Environments|Open live environment"
msgstr ""
@@ -12914,9 +13102,6 @@ msgstr ""
msgid "Environments|Stopping %{environmentName}"
msgstr ""
-msgid "Environments|Take the survey"
-msgstr ""
-
msgid "Environments|There was an error fetching the logs. Please try again."
msgstr ""
@@ -12938,9 +13123,6 @@ msgstr ""
msgid "Environments|You don't have any environments right now"
msgstr ""
-msgid "Environments|Your feedback helps GitLab make environments better for you and other users. Participate and enter a sweepstake to win a USD 30 gift card."
-msgstr ""
-
msgid "Environments|by %{avatar}"
msgstr ""
@@ -13223,7 +13405,7 @@ msgstr ""
msgid "Error parsing CSV file. Please make sure it has"
msgstr ""
-msgid "Error rendering markdown preview"
+msgid "Error rendering Markdown preview"
msgstr ""
msgid "Error saving label update."
@@ -13271,6 +13453,9 @@ msgstr ""
msgid "Error: %{error_message}"
msgstr ""
+msgid "Error: Couldn't load some or all of the changes."
+msgstr ""
+
msgid "Error: No AWS credentials were supplied"
msgstr ""
@@ -13304,6 +13489,9 @@ msgstr ""
msgid "ErrorTracking|Enable error tracking"
msgstr ""
+msgid "ErrorTracking|Error tracking backend"
+msgstr ""
+
msgid "ErrorTracking|If you self-host Sentry, enter your Sentry instance's full URL. If you use Sentry's hosted solution, enter https://sentry.io"
msgstr ""
@@ -13337,6 +13525,12 @@ msgstr ""
msgid "Escalation policies must have at least one rule"
msgstr ""
+msgid "EscalationPolicies|%{clockIcon} IF alert is not %{alertStatus} in %{minutes}"
+msgstr ""
+
+msgid "EscalationPolicies|%{notificationIcon} THEN %{doAction} %{forScheduleOrUser}"
+msgstr ""
+
msgid "EscalationPolicies|+ Add an additional rule"
msgstr ""
@@ -13379,13 +13573,13 @@ msgstr ""
msgid "EscalationPolicies|Escalation policies"
msgstr ""
-msgid "EscalationPolicies|Escalation rules"
+msgid "EscalationPolicies|Escalation policy %{obstacle} in Project %{project}"
msgstr ""
-msgid "EscalationPolicies|Failed to load oncall-schedules"
+msgid "EscalationPolicies|Escalation rules"
msgstr ""
-msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} %{then} THEN %{doAction} %{scheduleOrUser}"
+msgid "EscalationPolicies|Failed to load oncall-schedules"
msgstr ""
msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} minutes"
@@ -13463,18 +13657,36 @@ msgstr ""
msgid "Every %{action} attempt has failed: %{job_error_message}. Please try again."
msgstr ""
+msgid "Every 3 months"
+msgstr ""
+
+msgid "Every 3 months on the %{day} at %{time} %{timezone}"
+msgstr ""
+
+msgid "Every 6 months"
+msgstr ""
+
+msgid "Every 6 months on the %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Every day"
msgstr ""
msgid "Every day (at %{time})"
msgstr ""
+msgid "Every day at %{time} %{timezone}"
+msgstr ""
+
msgid "Every month"
msgstr ""
msgid "Every month (Day %{day} at %{time})"
msgstr ""
+msgid "Every month on the %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Every three months"
msgstr ""
@@ -13489,6 +13701,15 @@ msgstr[1] ""
msgid "Every week (%{weekday} at %{time})"
msgstr ""
+msgid "Every week on %{day} at %{time} %{timezone}"
+msgstr ""
+
+msgid "Every year"
+msgstr ""
+
+msgid "Every year on %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Everyone"
msgstr ""
@@ -13525,9 +13746,6 @@ msgstr ""
msgid "Exactly one of %{attributes} is required"
msgstr ""
-msgid "Example: %{ip_address}. %{read_more_link}."
-msgstr ""
-
msgid "Example: @sub\\.company\\.com$"
msgstr ""
@@ -13594,13 +13812,13 @@ msgstr ""
msgid "Expand pipeline"
msgstr ""
-msgid "Expand sidebar"
+msgid "Expand settings section"
msgstr ""
-msgid "Expected documents: %{expected_documents}"
+msgid "Expand sidebar"
msgstr ""
-msgid "Experienced"
+msgid "Expected documents: %{expected_documents}"
msgstr ""
msgid "ExperimentSubject|Must have exactly one of User, Namespace, or Project."
@@ -13885,9 +14103,6 @@ msgstr ""
msgid "Failed to load related branches"
msgstr ""
-msgid "Failed to load sidebar lock status"
-msgstr ""
-
msgid "Failed to load stacktrace."
msgstr ""
@@ -14312,6 +14527,9 @@ msgstr ""
msgid "Files"
msgstr ""
+msgid "Files API Rate Limits"
+msgstr ""
+
msgid "Files breadcrumb"
msgstr ""
@@ -15311,6 +15529,9 @@ msgstr ""
msgid "GitLab group: %{source_link}"
msgstr ""
+msgid "GitLab informs you if a new version is available."
+msgstr ""
+
msgid "GitLab is a complete DevOps platform, delivered as a single application, fundamentally changing the way Development, Security, and Ops teams collaborate"
msgstr ""
@@ -15326,7 +15547,7 @@ msgstr ""
msgid "GitLab is open source software to collaborate on code."
msgstr ""
-msgid "GitLab is undergoing maintenance and is operating in a read-only mode."
+msgid "GitLab is undergoing maintenance and is operating in read-only mode."
msgstr ""
msgid "GitLab member or Email address"
@@ -15338,9 +15559,6 @@ msgstr ""
msgid "GitLab project export"
msgstr ""
-msgid "GitLab restart is required to apply changes."
-msgstr ""
-
msgid "GitLab single sign-on URL"
msgstr ""
@@ -15356,9 +15574,6 @@ msgstr ""
msgid "GitLab version"
msgstr ""
-msgid "GitLab will inform you if a new version is available."
-msgstr ""
-
msgid "GitLab will run a background job that will produce pseudonymized CSVs of the GitLab database that will be uploaded to your configured object storage directory."
msgstr ""
@@ -15623,9 +15838,21 @@ msgstr ""
msgid "Go to snippets"
msgstr ""
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check 'Allowed domains for sign-ups'."
+msgstr ""
+
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check 'Email restrictions for sign-ups'."
+msgstr ""
+
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check the 'Domain denylist'."
+msgstr ""
+
msgid "Go to the activity feed"
msgstr ""
+msgid "Go to the group’s 'Settings &gt; General' page, and check 'Restrict membership by email domain'."
+msgstr ""
+
msgid "Go to the milestone list"
msgstr ""
@@ -15662,6 +15889,12 @@ msgstr ""
msgid "Goal of the changes and what reviewers should be aware of"
msgstr ""
+msgid "Google Cloud"
+msgstr ""
+
+msgid "Google Cloud offers several deployment targets. Select the one most suitable for your project."
+msgstr ""
+
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
@@ -15746,9 +15979,6 @@ msgstr ""
msgid "Group ID"
msgstr ""
-msgid "Group ID: %{group_id}"
-msgstr ""
-
msgid "Group Owner must have signed in with SAML before enabling Group Managed Accounts"
msgstr ""
@@ -15923,6 +16153,12 @@ msgstr ""
msgid "GroupImport|Unable to process group import file"
msgstr ""
+msgid "GroupPage|Copy group ID"
+msgstr ""
+
+msgid "GroupPage|Group ID: %{group_id}"
+msgstr ""
+
msgid "GroupRoadmap|%{dateWord} – No end date"
msgstr ""
@@ -15977,6 +16213,9 @@ msgstr ""
msgid "GroupRoadmap|Within 3 years"
msgstr ""
+msgid "GroupSAML|\"persistent\" recommended"
+msgstr ""
+
msgid "GroupSAML|%{strongOpen}Warning%{strongClose} - Enabling %{linkStart}SSO enforcement%{linkEnd} can reduce security risks."
msgstr ""
@@ -16109,6 +16348,9 @@ msgstr ""
msgid "GroupSAML|To be able to prohibit outer forks, you first need to enforce dedicate group managed accounts."
msgstr ""
+msgid "GroupSAML|Use SAML group links to manage group membership using SAML."
+msgstr ""
+
msgid "GroupSAML|Valid SAML Response"
msgstr ""
@@ -16121,13 +16363,10 @@ msgstr ""
msgid "GroupSAML|as %{access_level}"
msgstr ""
-msgid "GroupSAML|must match stored NameID of \"%{extern_uid}\" as we use this to identify users. If the NameID changes users will be unable to sign in."
-msgstr ""
-
-msgid "GroupSAML|should be \"persistent\""
+msgid "GroupSAML|must match stored NameID of \"%{extern_uid}\" to identify user and allow sign in"
msgstr ""
-msgid "GroupSAML|should be a random persistent ID, emails are discouraged"
+msgid "GroupSAML|recommend persistent ID instead of email"
msgstr ""
msgid "GroupSelect|No matching results"
@@ -16142,9 +16381,15 @@ msgstr ""
msgid "GroupSettings|Allow project access token creation"
msgstr ""
+msgid "GroupSettings|Applied to all subgroups unless overridden by a group owner. Groups already added to the project lose access."
+msgstr ""
+
msgid "GroupSettings|Auto DevOps pipeline was updated for the group"
msgstr ""
+msgid "GroupSettings|Available only on the top-level group. Applies to all subgroups. Groups already shared with a group outside %{group} are still shared unless removed manually."
+msgstr ""
+
msgid "GroupSettings|Badges"
msgstr ""
@@ -16196,6 +16441,9 @@ msgstr ""
msgid "GroupSettings|New runners registration token has been generated!"
msgstr ""
+msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgstr ""
+
msgid "GroupSettings|Pipeline settings was updated for the group"
msgstr ""
@@ -16208,12 +16456,15 @@ msgstr ""
msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
-msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups."
+msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups"
msgstr ""
msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
msgstr ""
+msgid "GroupSettings|Prevents group members from being notified if the group is mentioned."
+msgstr ""
+
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
msgstr ""
@@ -16250,21 +16501,6 @@ msgstr ""
msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}."
msgstr ""
-msgid "GroupSettings|This setting is only available on the top-level group and it applies to all subgroups. Groups that have already been shared with a group outside %{group} will still be shared, and this access will have to be revoked manually."
-msgstr ""
-
-msgid "GroupSettings|This setting will be applied to all subgroups unless overridden by a group owner. Groups that already have access to the project will continue to have access unless removed manually."
-msgstr ""
-
-msgid "GroupSettings|This setting will override user notification preferences for all members of the group, subgroups, and projects."
-msgstr ""
-
-msgid "GroupSettings|This setting will prevent group members from being notified if the group is mentioned."
-msgstr ""
-
-msgid "GroupSettings|This setting will prevent group members from forking projects outside of the group."
-msgstr ""
-
msgid "GroupSettings|Transfer group"
msgstr ""
@@ -16382,7 +16618,7 @@ msgstr ""
msgid "GroupsNew|No import options available"
msgstr ""
-msgid "GroupsNew|Not all related objects are migrated, as %{docs_link_start}described here%{docs_link_end}. Please %{feedback_link_start}leave feedback%{feedback_link_end} on this feature."
+msgid "GroupsNew|Not all related objects are migrated. %{docs_link_start}More info%{docs_link_end}."
msgstr ""
msgid "GroupsNew|Personal access token"
@@ -16514,15 +16750,27 @@ msgstr ""
msgid "Hello %{name},"
msgstr ""
-msgid "Hello there"
-msgstr ""
-
msgid "Hello, %{name}!"
msgstr ""
msgid "Hello, %{username}!"
msgstr ""
+msgid "HelloMessage|%{handshake_emoji} Contribute to GitLab: %{contribute_link}"
+msgstr ""
+
+msgid "HelloMessage|%{magnifier_emoji} Create a new GitLab issue: %{new_issue_link}"
+msgstr ""
+
+msgid "HelloMessage|%{rocket_emoji} We like your curiosity! Help us improve GitLab by joining the team: %{jobs_page_link}"
+msgstr ""
+
+msgid "HelloMessage|Does this page need fixes or improvements? Open an issue or contribute a merge request to help make GitLab more lovable. At GitLab, everyone can contribute!"
+msgstr ""
+
+msgid "HelloMessage|Welcome to GitLab!"
+msgstr ""
+
msgid "Help"
msgstr ""
@@ -16532,13 +16780,10 @@ msgstr ""
msgid "Helps prevent bots from creating accounts."
msgstr ""
-msgid "Helps prevent bots from creating issues"
-msgstr ""
-
-msgid "Helps prevent malicious users hide their activity"
+msgid "Helps prevent bots from creating issues."
msgstr ""
-msgid "Helps reduce request volume (e.g. from crawlers or abusive bots)"
+msgid "Helps prevent malicious users hide their activity."
msgstr ""
msgid "Helps reduce request volume (for example, from crawlers or abusive bots)"
@@ -16662,6 +16907,12 @@ msgstr ""
msgid "Housekeeping, export, path, transfer, remove, archive."
msgstr ""
+msgid "How do I configure Akismet?"
+msgstr ""
+
+msgid "How do I configure it?"
+msgstr ""
+
msgid "How do I configure runners?"
msgstr ""
@@ -16683,19 +16934,25 @@ msgstr ""
msgid "How do I set up this service?"
msgstr ""
+msgid "How do I use a web terminal?"
+msgstr ""
+
+msgid "How do I use file templates?"
+msgstr ""
+
msgid "How it works"
msgstr ""
msgid "How many days need to pass between marking entity for deletion and actual removing it."
msgstr ""
-msgid "How many seconds an IP will be counted towards the limit"
+msgid "How many seconds an IP counts toward the IP address limit."
msgstr ""
-msgid "I accept the %{terms_link}"
+msgid "How the job limiter handles jobs exceeding the thresholds specified below. The 'track' mode only logs the jobs. The 'compress' mode compresses the jobs and raises an exception if the compressed size exceeds the limit."
msgstr ""
-msgid "I accept the|Terms of Service and Privacy Policy"
+msgid "I accept the %{terms_link}"
msgstr ""
msgid "I forgot my password"
@@ -16779,13 +17036,16 @@ msgstr ""
msgid "IP Address"
msgstr ""
-msgid "IP expiration time"
+msgid "IP address expiration time"
msgstr ""
-msgid "IP subnet restriction only allowed for top-level groups"
+msgid "IP address restrictions"
+msgstr ""
+
+msgid "IP addresses per user"
msgstr ""
-msgid "IPs per user"
+msgid "IP subnet restriction only allowed for top-level groups"
msgstr ""
msgid "Identifier"
@@ -16800,6 +17060,9 @@ msgstr ""
msgid "If any indexed field exceeds this limit it will be truncated to this number of characters and the rest will not be indexed or searchable. This does not apply to repository and wiki indexing. Setting this to 0 means it is unlimited."
msgstr ""
+msgid "If blank, defaults to %{code_open}Retry later%{code_close}."
+msgstr ""
+
msgid "If blank, set allowable lifetime to %{instance_level_policy_in_words}, as defined by the instance admin. Once set, existing tokens for users in this group may be revoked."
msgstr ""
@@ -16851,6 +17114,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 did not initiate these sign-in attempts, please reach out to your administrator or enable two-factor authentication (2FA) on your account."
+msgstr ""
+
msgid "If you did not initiate this change, please contact your administrator immediately."
msgstr ""
@@ -16942,10 +17208,10 @@ msgstr ""
msgid "Import Projects from Gitea"
msgstr ""
-msgid "Import a project"
+msgid "Import an exported GitLab project"
msgstr ""
-msgid "Import an exported GitLab project"
+msgid "Import and export rate limits"
msgstr ""
msgid "Import failed due to a GitHub error: %{original}"
@@ -16957,12 +17223,18 @@ msgstr ""
msgid "Import from Jira"
msgstr ""
+msgid "Import group"
+msgstr ""
+
msgid "Import group from file"
msgstr ""
msgid "Import groups"
msgstr ""
+msgid "Import history"
+msgstr ""
+
msgid "Import in progress"
msgstr ""
@@ -17026,7 +17298,25 @@ msgstr ""
msgid "Import timed out. Import took longer than %{import_jobs_expiration} seconds"
msgstr ""
-msgid "Import/Export Rate Limits"
+msgid "ImportAProjectModal|Import from a project"
+msgstr ""
+
+msgid "ImportAProjectModal|Import members from another project"
+msgstr ""
+
+msgid "ImportAProjectModal|Import project members"
+msgstr ""
+
+msgid "ImportAProjectModal|Only project members (not group members) are imported, and they get the same permissions as the project you import from."
+msgstr ""
+
+msgid "ImportAProjectModal|Successfully imported"
+msgstr ""
+
+msgid "ImportAProjectModal|Unable to import project members"
+msgstr ""
+
+msgid "ImportAProjectModal|You're importing members to the %{strongStart}%{name}%{strongEnd} project."
msgstr ""
msgid "ImportButtons|Connect repositories from"
@@ -17079,7 +17369,7 @@ msgstr[1] ""
msgid "Importing..."
msgstr ""
-msgid "Import|A repository URL usually ends in a .git suffix, although this is not required. Double check to make sure your repository URL is correct."
+msgid "Import|There is not a valid Git repository at this URL. If your HTTP repository is not publicly accessible, verify your credentials."
msgstr ""
msgid "Improve customer support with Service Desk"
@@ -17088,9 +17378,6 @@ msgstr ""
msgid "Improves Git cloning performance."
msgstr ""
-msgid "In %{time_to_now}"
-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 ""
@@ -17376,7 +17663,7 @@ msgstr ""
msgid "InProductMarketing|Start a GitLab Ultimate trial today in less than one minute, no credit card required."
msgstr ""
-msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no CC required"
+msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no credit card required"
msgstr ""
msgid "InProductMarketing|Start a trial"
@@ -17415,7 +17702,7 @@ msgstr ""
msgid "InProductMarketing|Team up in GitLab for greater efficiency"
msgstr ""
-msgid "InProductMarketing|Team work makes the dream work"
+msgid "InProductMarketing|Team work makes the dream work"
msgstr ""
msgid "InProductMarketing|Test, create, deploy"
@@ -17996,6 +18283,9 @@ msgstr ""
msgid "Integrations|Create new issue in Jira"
msgstr ""
+msgid "Integrations|Create new issue in ZenTao"
+msgstr ""
+
msgid "Integrations|Default settings are inherited from the group level."
msgstr ""
@@ -18089,9 +18379,15 @@ msgstr ""
msgid "Integrations|Search Jira issues"
msgstr ""
+msgid "Integrations|Search ZenTao issues"
+msgstr ""
+
msgid "Integrations|Send notifications about project events to Unify Circuit."
msgstr ""
+msgid "Integrations|Send notifications about project events to a Unify Circuit conversation. %{docs_link}"
+msgstr ""
+
msgid "Integrations|Sign in to add namespaces"
msgstr ""
@@ -18131,6 +18427,9 @@ msgstr ""
msgid "Integrations|You've activated every integration 🎉"
msgstr ""
+msgid "Integrations|ZenTao issues display here when you create issues in your project in ZenTao."
+msgstr ""
+
msgid "Interactive mode"
msgstr ""
@@ -18158,9 +18457,6 @@ msgstr ""
msgid "Interval Pattern"
msgstr ""
-msgid "Introducing Value Stream Analytics"
-msgstr ""
-
msgid "Introducing Your DevOps Report"
msgstr ""
@@ -18257,6 +18553,12 @@ msgstr ""
msgid "Investigate vulnerability: %{title}"
msgstr ""
+msgid "Invisible Captcha"
+msgstr ""
+
+msgid "Invisible Captcha helps prevent the creation of spam accounts. It adds a honeypot field and time-sensitive form submission to the account signup form."
+msgstr ""
+
msgid "Invitation"
msgstr ""
@@ -18710,12 +19012,18 @@ msgstr ""
msgid "Issues"
msgstr ""
+msgid "Issues I've created"
+msgstr ""
+
msgid "Issues Rate Limits"
msgstr ""
msgid "Issues and merge requests"
msgstr ""
+msgid "Issues assigned to me"
+msgstr ""
+
msgid "Issues can be bugs, tasks or ideas to be discussed. Also, issues are searchable and filterable."
msgstr ""
@@ -18827,7 +19135,7 @@ msgstr ""
msgid "Iterations|Create cadence"
msgstr ""
-msgid "Iterations|Create your first iteration"
+msgid "Iterations|Create iteration"
msgstr ""
msgid "Iterations|Delete cadence"
@@ -18836,6 +19144,9 @@ msgstr ""
msgid "Iterations|Delete iteration cadence?"
msgstr ""
+msgid "Iterations|Delete iteration?"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -18869,12 +19180,18 @@ msgstr ""
msgid "Iterations|New iteration cadence"
msgstr ""
+msgid "Iterations|No closed iterations."
+msgstr ""
+
msgid "Iterations|No iteration cadences to show."
msgstr ""
msgid "Iterations|No iterations in cadence."
msgstr ""
+msgid "Iterations|No open iterations."
+msgstr ""
+
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
@@ -18905,6 +19222,9 @@ msgstr ""
msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
msgstr ""
+msgid "Iterations|This will remove the iteration from any issues that are assigned to it."
+msgstr ""
+
msgid "Iterations|Title"
msgstr ""
@@ -18920,15 +19240,9 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "I’m familiar with the basics of DevOps."
-msgstr ""
-
msgid "I’m joining my team who’s already on GitLab"
msgstr ""
-msgid "I’m not familiar with the basics of DevOps."
-msgstr ""
-
msgid "Jaeger URL"
msgstr ""
@@ -19193,6 +19507,9 @@ msgstr ""
msgid "Job"
msgstr ""
+msgid "Job %{jobName}"
+msgstr ""
+
msgid "Job Failed #%{build_id}"
msgstr ""
@@ -19783,9 +20100,6 @@ msgstr ""
msgid "Learn more in the"
msgstr ""
-msgid "Learn more in the|pipeline schedules documentation"
-msgstr ""
-
msgid "Learn more."
msgstr ""
@@ -19897,9 +20211,6 @@ msgstr ""
msgid "Leave Admin Mode"
msgstr ""
-msgid "Leave blank for no limit. Once set, existing personal access tokens may be revoked."
-msgstr ""
-
msgid "Leave edit mode? All unsaved changes will be lost."
msgstr ""
@@ -19945,10 +20256,10 @@ msgstr ""
msgid "LicenseCompliance|Acceptable license to be used in the project"
msgstr ""
-msgid "LicenseCompliance|Add a license"
+msgid "LicenseCompliance|Add license and related policy"
msgstr ""
-msgid "LicenseCompliance|Add license and related policy"
+msgid "LicenseCompliance|Add license policy"
msgstr ""
msgid "LicenseCompliance|Allow"
@@ -20038,6 +20349,9 @@ msgstr ""
msgid "LicenseManagement|Uncategorized"
msgstr ""
+msgid "Licensed Enterprise Edition features can be used if the project namespace's plan includes the feature, or if the project is public."
+msgstr ""
+
msgid "Licensed Features"
msgstr ""
@@ -20104,7 +20418,10 @@ msgstr ""
msgid "Limit namespaces and projects that can be indexed"
msgstr ""
-msgid "Limit sign in from multiple ips"
+msgid "Limit project size at a global, group, and project level. %{link_start}Learn more%{link_end}."
+msgstr ""
+
+msgid "Limit sign in from multiple IP addresses"
msgstr ""
msgid "Limit the number of concurrent operations this secondary site can run in the background."
@@ -20116,11 +20433,17 @@ msgstr ""
msgid "Limit the number of issues and epics per minute a user can create through web and API requests."
msgstr ""
+msgid "Limit the size of Sidekiq jobs stored in Redis."
+msgstr ""
+
msgid "Limited to showing %d event at most"
msgid_plural "Limited to showing %d events at most"
msgstr[0] ""
msgstr[1] ""
+msgid "Limiting mode"
+msgstr ""
+
msgid "Line changes"
msgstr ""
@@ -20190,9 +20513,6 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
-msgid "List of users to be excluded from the limit"
-msgstr ""
-
msgid "List options"
msgstr ""
@@ -20232,9 +20552,6 @@ msgstr ""
msgid "Loading functions timed out. Please reload the page to try again."
msgstr ""
-msgid "Loading issues"
-msgstr ""
-
msgid "Loading more"
msgstr ""
@@ -20526,6 +20843,9 @@ msgstr ""
msgid "Marked For Deletion At - %{deletion_time}"
msgstr ""
+msgid "Marked as ready. Merging is now allowed."
+msgstr ""
+
msgid "Marked this %{noun} as a draft."
msgstr ""
@@ -20598,52 +20918,22 @@ msgstr ""
msgid "Max 100,000 events"
msgstr ""
-msgid "Max 20 characters"
-msgstr ""
-
-msgid "Max Group Export Download requests per minute per user"
-msgstr ""
-
-msgid "Max Group Export requests per minute per user"
-msgstr ""
-
-msgid "Max Group Import requests per minute per user"
-msgstr ""
-
-msgid "Max Project Export Download requests per minute per user"
-msgstr ""
-
-msgid "Max Project Export requests per minute per user"
-msgstr ""
-
-msgid "Max Project Import requests per minute per user"
-msgstr ""
-
-msgid "Max authenticated API requests per period per user"
-msgstr ""
-
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
-msgid "Max authenticated web requests per period per user"
-msgstr ""
-
msgid "Max file size is 200 KB."
msgstr ""
-msgid "Max requests per minute per user"
-msgstr ""
-
msgid "Max role"
msgstr ""
msgid "Max session time"
msgstr ""
-msgid "Max unauthenticated requests per period per IP"
+msgid "MaxBuilds"
msgstr ""
-msgid "MaxBuilds"
+msgid "Maximum 20 characters"
msgstr ""
msgid "Maximum Conan package file size in bytes"
@@ -20679,6 +20969,12 @@ msgstr ""
msgid "Maximum attachment size (MB)"
msgstr ""
+msgid "Maximum authenticated API requests per rate limit period per user"
+msgstr ""
+
+msgid "Maximum authenticated web requests per rate limit period per user"
+msgstr ""
+
msgid "Maximum bulk request size (MiB)"
msgstr ""
@@ -20724,6 +21020,15 @@ msgstr ""
msgid "Maximum files in a diff"
msgstr ""
+msgid "Maximum group export download requests per minute"
+msgstr ""
+
+msgid "Maximum group export requests per minute"
+msgstr ""
+
+msgid "Maximum group import requests per minute"
+msgstr ""
+
msgid "Maximum import size"
msgstr ""
@@ -20760,7 +21065,7 @@ msgstr ""
msgid "Maximum number of projects."
msgstr ""
-msgid "Maximum number of unique IPs per user"
+msgid "Maximum number of unique IP addresses per user."
msgstr ""
msgid "Maximum page reached"
@@ -20769,12 +21074,24 @@ msgstr ""
msgid "Maximum page size"
msgstr ""
+msgid "Maximum project export download requests per minute"
+msgstr ""
+
+msgid "Maximum project export requests per minute"
+msgstr ""
+
+msgid "Maximum project import requests per minute"
+msgstr ""
+
msgid "Maximum push size"
msgstr ""
msgid "Maximum push size (MB)"
msgstr ""
+msgid "Maximum requests per minute"
+msgstr ""
+
msgid "Maximum running slices"
msgstr ""
@@ -20802,10 +21119,16 @@ msgstr ""
msgid "Maximum time between updates that a mirror can have when scheduled to synchronize."
msgstr ""
-msgid "Maximum time for web terminal websocket connection (in seconds). 0 for unlimited."
+msgid "Maximum time that users are allowed to skip the setup of two-factor authentication (in hours). Set to 0 (zero) to enforce at next sign in."
msgstr ""
-msgid "Maximum time that users are allowed to skip the setup of two-factor authentication (in hours). Set to 0 (zero) to enforce at next sign in."
+msgid "Maximum time, in seconds, for a web terminal websocket connection. 0 for unlimited."
+msgstr ""
+
+msgid "Maximum unauthenticated API requests per rate limit period per IP"
+msgstr ""
+
+msgid "Maximum unauthenticated web requests per rate limit period per IP"
msgstr ""
msgid "May"
@@ -20823,9 +21146,6 @@ msgstr ""
msgid "Medium vulnerabilities present"
msgstr ""
-msgid "Member lock"
-msgstr ""
-
msgid "Member since"
msgstr ""
@@ -20862,6 +21182,9 @@ msgstr ""
msgid "Members of a group may only view projects they have permission to access"
msgstr ""
+msgid "Membership"
+msgstr ""
+
msgid "Members|%{time} by %{user}"
msgstr ""
@@ -20922,9 +21245,6 @@ msgstr ""
msgid "Members|Expiration date updated successfully."
msgstr ""
-msgid "Members|Expired"
-msgstr ""
-
msgid "Members|Filter members"
msgstr ""
@@ -20940,9 +21260,6 @@ msgstr ""
msgid "Members|Membership"
msgstr ""
-msgid "Members|No expiration set"
-msgstr ""
-
msgid "Members|Remove \"%{groupName}\""
msgstr ""
@@ -20964,9 +21281,6 @@ msgstr ""
msgid "Members|Search invited"
msgstr ""
-msgid "Members|in %{time}"
-msgstr ""
-
msgid "Member|Deny access"
msgstr ""
@@ -21042,9 +21356,6 @@ msgstr ""
msgid "Merge request %{mr_link} was reviewed by %{mr_author}"
msgstr ""
-msgid "Merge request (MR) approvals"
-msgstr ""
-
msgid "Merge request analytics"
msgstr ""
@@ -21066,12 +21377,21 @@ msgstr ""
msgid "Merge requests"
msgstr ""
+msgid "Merge requests I've created"
+msgstr ""
+
msgid "Merge requests are a place to propose changes you've made to a project and discuss those changes with others"
msgstr ""
msgid "Merge requests are read-only in a secondary Geo node"
msgstr ""
+msgid "Merge requests assigned to me"
+msgstr ""
+
+msgid "Merge requests that I'm a reviewer"
+msgstr ""
+
msgid "Merge the branch and fix any conflicts that come up"
msgstr ""
@@ -21132,10 +21452,10 @@ msgstr ""
msgid "MergeRequests|An error occurred while saving the draft comment."
msgstr ""
-msgid "MergeRequests|Failed to squash. Should be done manually."
+msgid "MergeRequests|Create issue to resolve thread"
msgstr ""
-msgid "MergeRequests|Resolve this thread in a new issue"
+msgid "MergeRequests|Failed to squash. Should be done manually."
msgstr ""
msgid "MergeRequests|Saving the comment failed"
@@ -21949,6 +22269,9 @@ msgstr ""
msgid "MoveIssue|Cannot move issue to project it originates from!"
msgstr ""
+msgid "MoveIssue|Cannot move issues of '%{issue_type}' type."
+msgstr ""
+
msgid "Moved issue to %{label} column in the board."
msgstr ""
@@ -22074,6 +22397,15 @@ 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. To learn more about reducing storage capacity please visit our docs."
msgstr ""
+msgid "NamespaceUserCap|Pending users must be reviewed and approved by a group owner. Learn more about %{user_caps_link_start}User Caps%{link_end} and %{users_pending_approval_link_start}Users Pending Approval%{link_end}."
+msgstr ""
+
+msgid "NamespaceUserCap|View pending user approvals"
+msgstr ""
+
+msgid "NamespaceUserCap|Your group has reached its billable member limit"
+msgstr ""
+
msgid "Namespaces"
msgstr ""
@@ -22116,9 +22448,6 @@ msgstr ""
msgid "Network"
msgstr ""
-msgid "Network Policy|New rule"
-msgstr ""
-
msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is inbound from a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
msgstr ""
@@ -22140,16 +22469,13 @@ msgstr ""
msgid "NetworkPolicies|%{strongOpen}any%{strongClose} port"
msgstr ""
-msgid "NetworkPolicies|+ Add alert"
-msgstr ""
-
msgid "NetworkPolicies|.yaml"
msgstr ""
msgid "NetworkPolicies|.yaml mode"
msgstr ""
-msgid "NetworkPolicies|Actions"
+msgid "NetworkPolicies|Add alert"
msgstr ""
msgid "NetworkPolicies|Alerts are intended to be selectively used for a limited number of events that are potentially concerning and warrant a manual review. Alerts should not be used as a substitute for a SIEM or a logging tool. High volume alerts are likely to be dropped so as to preserve the stability of GitLab's integration with Kubernetes."
@@ -22185,9 +22511,6 @@ msgstr ""
msgid "NetworkPolicies|Deny all traffic"
msgstr ""
-msgid "NetworkPolicies|Description"
-msgstr ""
-
msgid "NetworkPolicies|Edit policy"
msgstr ""
@@ -22200,9 +22523,6 @@ msgstr ""
msgid "NetworkPolicies|IP/subnet"
msgstr ""
-msgid "NetworkPolicies|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
-msgstr ""
-
msgid "NetworkPolicies|Invalid or empty policy"
msgstr ""
@@ -22212,19 +22532,16 @@ msgstr ""
msgid "NetworkPolicies|Kubernetes error: %{error}"
msgstr ""
-msgid "NetworkPolicies|Name"
-msgstr ""
-
msgid "NetworkPolicies|Network"
msgstr ""
-msgid "NetworkPolicies|Network traffic"
+msgid "NetworkPolicies|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
msgstr ""
-msgid "NetworkPolicies|New policy"
+msgid "NetworkPolicies|Network policy can be created after the environment is loaded successfully."
msgstr ""
-msgid "NetworkPolicies|No policies detected"
+msgid "NetworkPolicies|Network traffic"
msgstr ""
msgid "NetworkPolicies|None selected"
@@ -22233,21 +22550,12 @@ msgstr ""
msgid "NetworkPolicies|Please %{installLinkStart}install%{installLinkEnd} and %{configureLinkStart}configure a Kubernetes Agent for this project%{configureLinkEnd} to enable alerts."
msgstr ""
-msgid "NetworkPolicies|Policies are a specification of how groups of pods are allowed to communicate with each other's network endpoints."
-msgstr ""
-
msgid "NetworkPolicies|Policy %{policyName} was successfully changed"
msgstr ""
msgid "NetworkPolicies|Policy definition"
msgstr ""
-msgid "NetworkPolicies|Policy editor"
-msgstr ""
-
-msgid "NetworkPolicies|Policy preview"
-msgstr ""
-
msgid "NetworkPolicies|Rule"
msgstr ""
@@ -22257,9 +22565,6 @@ msgstr ""
msgid "NetworkPolicies|Rule mode is unavailable for this policy. In some cases, we cannot parse the YAML file back into the rules editor."
msgstr ""
-msgid "NetworkPolicies|Rules"
-msgstr ""
-
msgid "NetworkPolicies|Save changes"
msgstr ""
@@ -22272,9 +22577,6 @@ msgstr ""
msgid "NetworkPolicies|Traffic that does not match any rule will be blocked."
msgstr ""
-msgid "NetworkPolicies|Unable to parse policy"
-msgstr ""
-
msgid "NetworkPolicies|all DNS names"
msgstr ""
@@ -22454,6 +22756,9 @@ msgstr ""
msgid "New issue"
msgstr ""
+msgid "New issue in %{project}"
+msgstr ""
+
msgid "New issue title"
msgstr ""
@@ -22532,7 +22837,7 @@ msgstr ""
msgid "Newest first"
msgstr ""
-msgid "Newly registered users will by default be external"
+msgid "Newly-registered users are external by default"
msgstr ""
msgid "Next"
@@ -22847,8 +23152,10 @@ msgstr ""
msgid "No webhooks found, add one in the form above."
msgstr ""
-msgid "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} to renew your subscription."
-msgstr ""
+msgid "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} day to renew your subscription."
+msgid_plural "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} days to renew your subscription."
+msgstr[0] ""
+msgstr[1] ""
msgid "No. of commits"
msgstr ""
@@ -22865,7 +23172,7 @@ msgstr ""
msgid "Nodes"
msgstr ""
-msgid "Non-admin users can sign in with read-only access and make read-only API requests."
+msgid "Non-admin users are restricted to read-only access, in both GitLab UI and API."
msgstr ""
msgid "None"
@@ -22946,7 +23253,7 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
-msgid "Notes Rate Limits"
+msgid "Notes rate limit"
msgstr ""
msgid "Notes|Are you sure you want to cancel creating this comment?"
@@ -23113,9 +23420,6 @@ msgstr ""
msgid "November"
msgstr ""
-msgid "Novice"
-msgstr ""
-
msgid "Now, personalize your GitLab experience"
msgstr ""
@@ -23284,7 +23588,7 @@ msgstr ""
msgid "OnCallSchedules|For this rotation, on-call will be:"
msgstr ""
-msgid "OnCallSchedules|On-call schedule %{schedule} in Project %{project}"
+msgid "OnCallSchedules|On-call schedule %{obstacle} in Project %{project}"
msgstr ""
msgid "OnCallSchedules|On-call schedules"
@@ -23431,22 +23735,22 @@ msgstr ""
msgid "OnDemandScans|Scanner profile"
msgstr ""
-msgid "OnDemandScans|Select one of the existing profiles"
+msgid "OnDemandScans|Schedule scan"
msgstr ""
-msgid "OnDemandScans|Site profile"
+msgid "OnDemandScans|Select one of the existing profiles"
msgstr ""
-msgid "OnDemandScans|Use existing scanner profile"
+msgid "OnDemandScans|Site profile"
msgstr ""
-msgid "OnDemandScans|Use existing site profile"
+msgid "OnDemandScans|Start time"
msgstr ""
-msgid "OnDemandScans|You can either choose a passive scan or validate the target site in your chosen site profile. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
+msgid "OnDemandScans|Use existing scanner profile"
msgstr ""
-msgid "OnDemandScans|You cannot run an active scan against an unvalidated site."
+msgid "OnDemandScans|Use existing site profile"
msgstr ""
msgid "OnDemandScans|You must create a repository within your project to run an on-demand scan."
@@ -23511,6 +23815,9 @@ msgstr ""
msgid "Only admins can delete project"
msgstr ""
+msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
+msgstr ""
+
msgid "Only include features new to your current subscription tier."
msgstr ""
@@ -23529,6 +23836,12 @@ msgstr ""
msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
+msgid "Only reCAPTCHA v2 is supported:"
+msgstr ""
+
+msgid "Only users from the specified IP address ranges are able to reach this group, including all subgroups, projects, and Git repositories."
+msgstr ""
+
msgid "Only verified users with an email address in any of these domains can be added to the group."
msgstr ""
@@ -23715,9 +24028,6 @@ msgstr ""
msgid "Package Registry"
msgstr ""
-msgid "Package Registry Rate Limits"
-msgstr ""
-
msgid "Package Registry: authenticated API requests"
msgstr ""
@@ -23736,6 +24046,9 @@ msgstr ""
msgid "Package recipe already exists"
msgstr ""
+msgid "Package registry rate limits"
+msgstr ""
+
msgid "Package type"
msgstr ""
@@ -23802,6 +24115,9 @@ msgstr ""
msgid "PackageRegistry|Composer"
msgstr ""
+msgid "PackageRegistry|Composer.json with license: %{license} and version: %{version}"
+msgstr ""
+
msgid "PackageRegistry|Conan"
msgstr ""
@@ -23865,6 +24181,9 @@ msgstr ""
msgid "PackageRegistry|Copy require package include"
msgstr ""
+msgid "PackageRegistry|Copy target SHA"
+msgstr ""
+
msgid "PackageRegistry|Copy yarn command"
msgstr ""
@@ -23931,6 +24250,9 @@ msgstr ""
msgid "PackageRegistry|Install package version"
msgstr ""
+msgid "PackageRegistry|Instance-level"
+msgstr ""
+
msgid "PackageRegistry|Invalid Package: failed metadata extraction"
msgstr ""
@@ -23976,6 +24298,9 @@ msgstr ""
msgid "PackageRegistry|Pip Command"
msgstr ""
+msgid "PackageRegistry|Project-level"
+msgstr ""
+
msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
msgstr ""
@@ -23997,6 +24322,9 @@ msgstr ""
msgid "PackageRegistry|Remove package"
msgstr ""
+msgid "PackageRegistry|Required Python: %{pythonVersion}"
+msgstr ""
+
msgid "PackageRegistry|RubyGems"
msgstr ""
@@ -24039,6 +24367,9 @@ msgstr ""
msgid "PackageRegistry|Source project located at %{link}"
msgstr ""
+msgid "PackageRegistry|Target SHA: %{sha}"
+msgstr ""
+
msgid "PackageRegistry|There are no other versions of this package."
msgstr ""
@@ -24207,6 +24538,18 @@ msgstr ""
msgid "Password was successfully updated. Please sign in again."
msgstr ""
+msgid "PasswordPrompt|Confirm password"
+msgstr ""
+
+msgid "PasswordPrompt|Confirm password to continue"
+msgstr ""
+
+msgid "PasswordPrompt|Password is required"
+msgstr ""
+
+msgid "PasswordPrompt|Please enter your password to confirm"
+msgstr ""
+
msgid "Passwords should be unique and not used for any other sites or services."
msgstr ""
@@ -24234,6 +24577,9 @@ msgstr ""
msgid "Paste project path (i.e. gitlab-org/gitlab)"
msgstr ""
+msgid "Paste this DSN into your Sentry SDK"
+msgstr ""
+
msgid "Paste your public SSH key, which is usually contained in the file '~/.ssh/id_ed25519.pub' or '~/.ssh/id_rsa.pub' and begins with 'ssh-ed25519' or 'ssh-rsa'. Do not paste your private SSH key, as that can compromise your identity."
msgstr ""
@@ -24318,6 +24664,9 @@ msgstr ""
msgid "PerformanceBar|First Contentful Paint"
msgstr ""
+msgid "PerformanceBar|Flamegraph with mode:"
+msgstr ""
+
msgid "PerformanceBar|Frontend resources"
msgstr ""
@@ -24351,6 +24700,15 @@ msgstr ""
msgid "PerformanceBar|Trace"
msgstr ""
+msgid "PerformanceBar|cpu"
+msgstr ""
+
+msgid "PerformanceBar|object"
+msgstr ""
+
+msgid "PerformanceBar|wall"
+msgstr ""
+
msgid "Period in seconds"
msgstr ""
@@ -24579,6 +24937,48 @@ msgstr ""
msgid "PipelineSchedules|Variables"
msgstr ""
+msgid "PipelineSource|API"
+msgstr ""
+
+msgid "PipelineSource|Chat"
+msgstr ""
+
+msgid "PipelineSource|External"
+msgstr ""
+
+msgid "PipelineSource|External Pull Request"
+msgstr ""
+
+msgid "PipelineSource|Merge Request"
+msgstr ""
+
+msgid "PipelineSource|On-Demand DAST Scan"
+msgstr ""
+
+msgid "PipelineSource|On-Demand DAST Validation"
+msgstr ""
+
+msgid "PipelineSource|Parent Pipeline"
+msgstr ""
+
+msgid "PipelineSource|Pipeline"
+msgstr ""
+
+msgid "PipelineSource|Push"
+msgstr ""
+
+msgid "PipelineSource|Schedule"
+msgstr ""
+
+msgid "PipelineSource|Trigger"
+msgstr ""
+
+msgid "PipelineSource|Web"
+msgstr ""
+
+msgid "PipelineSource|Web IDE"
+msgstr ""
+
msgid "PipelineStatusTooltip|Pipeline: %{ciStatus}"
msgstr ""
@@ -24879,46 +25279,7 @@ msgstr ""
msgid "Pipeline|Source"
msgstr ""
-msgid "Pipeline|Source|API"
-msgstr ""
-
-msgid "Pipeline|Source|Chat"
-msgstr ""
-
-msgid "Pipeline|Source|External"
-msgstr ""
-
-msgid "Pipeline|Source|External Pull Request"
-msgstr ""
-
-msgid "Pipeline|Source|Merge Request"
-msgstr ""
-
-msgid "Pipeline|Source|On-Demand DAST Scan"
-msgstr ""
-
-msgid "Pipeline|Source|On-Demand DAST Validation"
-msgstr ""
-
-msgid "Pipeline|Source|Parent Pipeline"
-msgstr ""
-
-msgid "Pipeline|Source|Pipeline"
-msgstr ""
-
-msgid "Pipeline|Source|Push"
-msgstr ""
-
-msgid "Pipeline|Source|Schedule"
-msgstr ""
-
-msgid "Pipeline|Source|Trigger"
-msgstr ""
-
-msgid "Pipeline|Source|Web"
-msgstr ""
-
-msgid "Pipeline|Source|Web IDE"
+msgid "Pipeline|Source|Security Policy"
msgstr ""
msgid "Pipeline|Specify variable values to be used in this run. The values specified in %{linkStart}CI/CD settings%{linkEnd} will be used by default."
@@ -24969,7 +25330,7 @@ msgstr ""
msgid "Pipeline|We are currently unable to fetch pipeline data"
msgstr ""
-msgid "Pipeline|You’re about to stop pipeline %{pipelineId}."
+msgid "Pipeline|You’re about to stop pipeline #%{pipelineId}."
msgstr ""
msgid "Pipeline|for"
@@ -24996,6 +25357,9 @@ msgstr ""
msgid "Plain diff"
msgstr ""
+msgid "Plain-text response to send to clients that hit a rate limit"
+msgstr ""
+
msgid "Plan:"
msgstr ""
@@ -25140,9 +25504,6 @@ msgstr ""
msgid "Please provide attributes to update"
msgstr ""
-msgid "Please provide your username or email address."
-msgstr ""
-
msgid "Please reach out if you have any questions and we'll be happy to assist."
msgstr ""
@@ -25185,9 +25546,6 @@ msgstr ""
msgid "Please set a new password before proceeding."
msgstr ""
-msgid "Please share your feedback about %{featureName} %{linkStart}in this issue%{linkEnd} to help us improve the experience."
-msgstr ""
-
msgid "Please solve the captcha"
msgstr ""
@@ -25365,6 +25723,9 @@ msgstr ""
msgid "Prevent adding new members to project membership within this group"
msgstr ""
+msgid "Prevent auto-stopping"
+msgstr ""
+
msgid "Prevent editing approval rules in projects and merge requests."
msgstr ""
@@ -25377,7 +25738,7 @@ msgstr ""
msgid "Prevent users from changing their profile name"
msgstr ""
-msgid "Prevent users from performing write operations on GitLab while performing maintenance."
+msgid "Prevent users from performing write operations while GitLab maintenance is in progress."
msgstr ""
msgid "Preview"
@@ -25650,6 +26011,9 @@ msgstr ""
msgid "Profiles|Enter your name, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Enter your password to confirm the email change"
+msgstr ""
+
msgid "Profiles|Enter your pronouns to let people know how to refer to you"
msgstr ""
@@ -25884,10 +26248,10 @@ msgstr ""
msgid "Profiles|e.g. My MacBook key"
msgstr ""
-msgid "Profiles|username"
+msgid "Profiles|https://website.com"
msgstr ""
-msgid "Profiles|website.com"
+msgid "Profiles|username"
msgstr ""
msgid "Profiles|your account"
@@ -26130,9 +26494,21 @@ msgstr ""
msgid "ProjectSelect| or group"
msgstr ""
+msgid "ProjectSelect|No matching results"
+msgstr ""
+
msgid "ProjectSelect|Search for project"
msgstr ""
+msgid "ProjectSelect|Search projects"
+msgstr ""
+
+msgid "ProjectSelect|Select a project"
+msgstr ""
+
+msgid "ProjectSelect|There was an error fetching the projects. Please try again."
+msgstr ""
+
msgid "ProjectService|Drone server URL"
msgstr ""
@@ -26220,6 +26596,9 @@ msgstr ""
msgid "ProjectService|Trigger event when a new, unique alert is recorded."
msgstr ""
+msgid "ProjectService|Trigger event when a new, unique vulnerability is recorded. (Note: This feature requires an Ultimate plan.)"
+msgstr ""
+
msgid "ProjectService|Trigger event when a pipeline status changes."
msgstr ""
@@ -26634,9 +27013,15 @@ msgstr ""
msgid "Projects are graded based on the highest severity vulnerability present"
msgstr ""
+msgid "Projects are organized into groups"
+msgstr ""
+
msgid "Projects contributed to"
msgstr ""
+msgid "Projects help you organize your work. They contain your file repository, issues, merge requests, and so much more."
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr ""
@@ -26871,10 +27256,10 @@ msgstr ""
msgid "PrometheusService|Prometheus cluster integration"
msgstr ""
-msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
+msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
msgstr ""
-msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
+msgid "PrometheusService|The ID of the IAP-secured resource."
msgstr ""
msgid "PrometheusService|The Prometheus API base URL."
@@ -27492,6 +27877,9 @@ msgstr ""
msgid "Rate limit"
msgstr ""
+msgid "Rate limits can help reduce request volume (like from crawlers or abusive bots)."
+msgstr ""
+
msgid "Raw blob request rate limit per minute"
msgstr ""
@@ -27504,6 +27892,9 @@ msgstr ""
msgid "Re-authentication required"
msgstr ""
+msgid "Re-import"
+msgstr ""
+
msgid "Re-request review"
msgstr ""
@@ -27525,6 +27916,9 @@ msgstr ""
msgid "Read more about related issues"
msgstr ""
+msgid "Read their documentation."
+msgstr ""
+
msgid "Ready to get started with GitLab? Follow these steps to set up your workspace, plan and commit changes, and deploy your project."
msgstr ""
@@ -27558,6 +27952,9 @@ msgstr ""
msgid "Receive any notifications from GitLab."
msgstr ""
+msgid "Receive notification of abuse reports by email."
+msgstr ""
+
msgid "Receive notifications about your own activity"
msgstr ""
@@ -27701,9 +28098,6 @@ msgstr ""
msgid "Registry setup"
msgstr ""
-msgid "Regulate approvals by authors/committers. Affects all projects."
-msgstr ""
-
msgid "Reindexing Status: %{status} (Slice multiplier: %{multiplier}, Maximum running slices: %{max_slices})"
msgstr ""
@@ -27799,6 +28193,9 @@ msgstr ""
msgid "Release|Something went wrong while saving the release details."
msgstr ""
+msgid "Reload page"
+msgstr ""
+
msgid "Remediations"
msgstr ""
@@ -28081,6 +28478,9 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
+msgid "Repeats"
+msgstr ""
+
msgid "Replace"
msgstr ""
@@ -28443,10 +28843,7 @@ msgstr ""
msgid "Require additional authentication for administrative tasks."
msgstr ""
-msgid "Require all users in this group to setup Two-factor authentication"
-msgstr ""
-
-msgid "Require all users in this group to setup two-factor authentication"
+msgid "Require all users in this group to set up two-factor authentication"
msgstr ""
msgid "Required approvals (%{approvals_given} given)"
@@ -28492,6 +28889,9 @@ msgstr[1] ""
msgid "Requires values to meet regular expression requirements."
msgstr ""
+msgid "Requires you to deploy or set up cloud-hosted Sentry."
+msgstr ""
+
msgid "Requires your primary GitLab email address."
msgstr ""
@@ -28552,9 +28952,6 @@ msgstr ""
msgid "Resolve"
msgstr ""
-msgid "Resolve all threads in new issue"
-msgstr ""
-
msgid "Resolve conflicts"
msgstr ""
@@ -28612,6 +29009,9 @@ msgstr ""
msgid "Response text"
msgstr ""
+msgid "Restart GitLab to apply changes."
+msgstr ""
+
msgid "Restart Terminal"
msgstr ""
@@ -28630,6 +29030,9 @@ msgstr ""
msgid "Restoring the project will prevent the project from being removed on this date and restore people's ability to make changes to it."
msgstr ""
+msgid "Restrict group access by IP address. %{link_start}Learn more%{link_end}."
+msgstr ""
+
msgid "Restrict membership by email domain"
msgstr ""
@@ -28943,6 +29346,9 @@ msgstr ""
msgid "Runners|Runner #%{runner_id}"
msgstr ""
+msgid "Runners|Runner assigned to project."
+msgstr ""
+
msgid "Runners|Runner is offline, last contact was %{runner_contact} ago"
msgstr ""
@@ -28955,6 +29361,9 @@ msgstr ""
msgid "Runners|Runner registration"
msgstr ""
+msgid "Runners|Runner unassigned from project."
+msgstr ""
+
msgid "Runners|Runners"
msgstr ""
@@ -29147,7 +29556,7 @@ msgstr ""
msgid "SastEntryPoints|How do I set up SAST?"
msgstr ""
-msgid "SastEntryPoints|Learn more."
+msgid "SastEntryPoints|Learn more"
msgstr ""
msgid "Satisfied"
@@ -29189,7 +29598,7 @@ msgstr ""
msgid "Save pipeline schedule"
msgstr ""
-msgid "Save space and find images in the container Registry. remove unneeded tags and keep only the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
+msgid "Save storage space by automatically deleting tags from the container registry and keeping the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
msgstr ""
msgid "Saving"
@@ -29363,6 +29772,9 @@ msgstr ""
msgid "Search or filter results…"
msgstr ""
+msgid "Search or jump to..."
+msgstr ""
+
msgid "Search project"
msgstr ""
@@ -29423,16 +29835,16 @@ msgstr ""
msgid "SearchCodeResults|of %{link_to_project}"
msgstr ""
-msgid "SearchResults|Showing %{count} %{scope} for%{term_element}"
+msgid "SearchResults|Showing %{count} %{scope} for %{term_element}"
msgstr ""
-msgid "SearchResults|Showing %{count} %{scope} for%{term_element} in your personal and project snippets"
+msgid "SearchResults|Showing %{count} %{scope} for %{term_element} in your personal and project snippets"
msgstr ""
-msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for%{term_element}"
+msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for %{term_element}"
msgstr ""
-msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for%{term_element} in your personal and project snippets"
+msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for %{term_element} in your personal and project snippets"
msgstr ""
msgid "SearchResults|code result"
@@ -29514,6 +29926,9 @@ msgstr ""
msgid "Secret Detection"
msgstr ""
+msgid "Secret access key"
+msgstr ""
+
msgid "Secret token"
msgstr ""
@@ -29553,9 +29968,6 @@ msgstr ""
msgid "SecurityApprovals|A merge request approval is required when the license compliance report contains a denied license."
msgstr ""
-msgid "SecurityApprovals|Configurable if security scanners are enabled. %{linkStart}Learn more.%{linkEnd}"
-msgstr ""
-
msgid "SecurityApprovals|Coverage-Check"
msgstr ""
@@ -29568,24 +29980,18 @@ msgstr ""
msgid "SecurityApprovals|Learn more about Vulnerability-Check"
msgstr ""
-msgid "SecurityApprovals|License Scanning must be enabled. %{linkStart}Learn more%{linkEnd}."
-msgstr ""
-
msgid "SecurityApprovals|License-Check"
msgstr ""
msgid "SecurityApprovals|Requires approval for Denied licenses. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}More information%{linkEnd}"
+msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "SecurityApprovals|Requires approval for vulnerabilities. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
-msgid "SecurityApprovals|Test coverage must be enabled. %{linkStart}Learn more%{linkEnd}."
-msgstr ""
-
msgid "SecurityApprovals|Vulnerability-Check"
msgstr ""
@@ -29649,6 +30055,12 @@ msgstr ""
msgid "SecurityConfiguration|Immediately begin risk analysis and remediation with application security features. Start with SAST and Secret Detection, available to all plans. Upgrade to Ultimate to get all features, including:"
msgstr ""
+msgid "SecurityConfiguration|Manage corpus"
+msgstr ""
+
+msgid "SecurityConfiguration|Manage corpus files used as mutation sources in coverage fuzzing."
+msgstr ""
+
msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
msgstr ""
@@ -29703,6 +30115,12 @@ msgstr ""
msgid "SecurityOrchestration|Action"
msgstr ""
+msgid "SecurityOrchestration|Actions"
+msgstr ""
+
+msgid "SecurityOrchestration|Add rule"
+msgstr ""
+
msgid "SecurityOrchestration|All policies"
msgstr ""
@@ -29736,9 +30154,6 @@ msgstr ""
msgid "SecurityOrchestration|Network"
msgstr ""
-msgid "SecurityOrchestration|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
-msgstr ""
-
msgid "SecurityOrchestration|New policy"
msgstr ""
@@ -29754,6 +30169,9 @@ msgstr ""
msgid "SecurityOrchestration|Policy editor"
msgstr ""
+msgid "SecurityOrchestration|Policy preview"
+msgstr ""
+
msgid "SecurityOrchestration|Policy status"
msgstr ""
@@ -29763,6 +30181,9 @@ msgstr ""
msgid "SecurityOrchestration|Rule"
msgstr ""
+msgid "SecurityOrchestration|Rules"
+msgstr ""
+
msgid "SecurityOrchestration|Scan Execution"
msgstr ""
@@ -29856,6 +30277,9 @@ msgstr ""
msgid "SecurityReports|Create issue"
msgstr ""
+msgid "SecurityReports|Development vulnerabilities"
+msgstr ""
+
msgid "SecurityReports|Dismiss vulnerability"
msgstr ""
@@ -29871,6 +30295,9 @@ msgstr ""
msgid "SecurityReports|Download results"
msgstr ""
+msgid "SecurityReports|Download scanned URLs"
+msgstr ""
+
msgid "SecurityReports|Download scanned resources"
msgstr ""
@@ -29994,6 +30421,9 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
+msgid "SecurityReports|The Vulnerability Report shows the results of the lastest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "SecurityReports|The security reports below contain one or more vulnerability findings that could not be parsed and were not recorded. Download the artifacts in the job output to investigate. Ensure any security report created conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
msgstr ""
@@ -30135,10 +30565,10 @@ msgstr ""
msgid "Select a repository"
msgstr ""
-msgid "Select a role"
+msgid "Select a repository containing templates for common files."
msgstr ""
-msgid "Select a shared template repository for all projects on this instance."
+msgid "Select a role"
msgstr ""
msgid "Select a template repository"
@@ -30216,6 +30646,9 @@ msgstr ""
msgid "Select project to choose zone"
msgstr ""
+msgid "Select project to create issue"
+msgstr ""
+
msgid "Select projects"
msgstr ""
@@ -30333,6 +30766,9 @@ msgstr ""
msgid "Send emails to help guide new users through the onboarding process."
msgstr ""
+msgid "Send emails to users upon account deactivation."
+msgstr ""
+
msgid "Send message"
msgstr ""
@@ -30351,6 +30787,9 @@ msgstr ""
msgid "Send service data"
msgstr ""
+msgid "Sentry"
+msgstr ""
+
msgid "Sentry API URL"
msgstr ""
@@ -30465,6 +30904,9 @@ msgstr ""
msgid "Service"
msgstr ""
+msgid "Service Accounts keys are required to authorize GitLab to deploy your Google Cloud project."
+msgstr ""
+
msgid "Service Desk"
msgstr ""
@@ -30537,15 +30979,15 @@ msgstr ""
msgid "Set a password on your account to pull or push via %{protocol}."
msgstr ""
-msgid "Set a template repository for projects in this group"
-msgstr ""
-
msgid "Set access permissions for this token."
msgstr ""
msgid "Set an instance-wide domain that will be available to all clusters when installing Knative."
msgstr ""
+msgid "Set any rate limit to %{code_open}0%{code_close} to disable the limit."
+msgstr ""
+
msgid "Set default and restrict visibility levels. Configure import sources and git access protocol."
msgstr ""
@@ -30558,7 +31000,7 @@ msgstr ""
msgid "Set limit to 0 to allow any file size."
msgstr ""
-msgid "Set max session time for web terminal."
+msgid "Set limits for web and API requests."
msgstr ""
msgid "Set milestone"
@@ -30567,15 +31009,18 @@ msgstr ""
msgid "Set new password"
msgstr ""
-msgid "Set notification email for abuse reports."
+msgid "Set parent epic to an epic"
msgstr ""
-msgid "Set parent epic to an epic"
+msgid "Set per-user rate limits for imports and exports of projects and groups."
msgstr ""
msgid "Set projects and maximum size limits, session duration, user options, and check feature availability for namespace plan."
msgstr ""
+msgid "Set rate limits for package registry API requests that supersede the general user and IP rate limits."
+msgstr ""
+
msgid "Set severity"
msgstr ""
@@ -30594,15 +31039,24 @@ msgstr ""
msgid "Set the default branch for this project. All merge requests and commits are made against this branch unless you specify a different one."
msgstr ""
+msgid "Set the default expiration time for job artifacts in all projects. Set to %{code_open}0%{code_close} to never expire artifacts by default. If no unit is written, it defaults to seconds. For example, these are all equivalent: %{code_open}3600%{code_close}, %{code_open}60 minutes%{code_close}, or %{code_open}one hour%{code_close}."
+msgstr ""
+
msgid "Set the due date to %{due_date}."
msgstr ""
msgid "Set the iteration to %{iteration_reference}."
msgstr ""
+msgid "Set the maximum session time for a web terminal."
+msgstr ""
+
msgid "Set the milestone to %{milestone_reference}."
msgstr ""
+msgid "Set the per-user rate limit for notes created by web or API requests."
+msgstr ""
+
msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
msgstr ""
@@ -30804,6 +31258,9 @@ msgstr ""
msgid "Show Pipeline IID"
msgstr ""
+msgid "Show all %{issuable_type}."
+msgstr ""
+
msgid "Show all activity"
msgstr ""
@@ -30855,15 +31312,9 @@ msgstr ""
msgid "Show list"
msgstr ""
-msgid "Show me advanced features"
-msgstr ""
-
msgid "Show me how to add a pipeline"
msgstr ""
-msgid "Show me the basics"
-msgstr ""
-
msgid "Show one file at a time"
msgstr ""
@@ -30904,15 +31355,15 @@ msgstr ""
msgid "Showing %{pageSize} of %{total} %{issuableType}"
msgstr ""
-msgid "Showing %{pageSize} of %{total} issues"
-msgstr ""
-
msgid "Showing all epics"
msgstr ""
msgid "Showing all issues"
msgstr ""
+msgid "Showing data for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
+msgstr ""
+
msgid "Showing data for workflow items created in this date range. Date range cannot exceed %{maxDateRange} days."
msgstr ""
@@ -30952,6 +31403,15 @@ msgstr ""
msgid "Sidebar|Weight"
msgstr ""
+msgid "Sidekiq job compression threshold (bytes)"
+msgstr ""
+
+msgid "Sidekiq job size limit (bytes)"
+msgstr ""
+
+msgid "Sidekiq job size limits"
+msgstr ""
+
msgid "Sign in"
msgstr ""
@@ -31072,6 +31532,9 @@ msgstr ""
msgid "Site profile not found for given parameters"
msgstr ""
+msgid "Sites"
+msgstr ""
+
msgid "Size"
msgstr ""
@@ -31102,19 +31565,22 @@ msgstr ""
msgid "SlackIntegration|Sends notifications about project events to Slack channels."
msgstr ""
-msgid "SlackService|2. Paste the %{strong_open}Token%{strong_close} into the field below"
+msgid "SlackService|1. %{slash_command_link_start}Add a slash command%{slash_command_link_end} in your Slack team using this information:"
msgstr ""
-msgid "SlackService|3. Select the %{strong_open}Active%{strong_close} checkbox, press %{strong_open}Save changes%{strong_close} and start using GitLab inside Slack!"
+msgid "SlackService|2. Paste the token from Slack in the %{strong_open}Token%{strong_close} field below."
msgstr ""
-msgid "SlackService|Fill in the word that works best for your team."
+msgid "SlackService|3. Select the %{strong_open}Active%{strong_close} checkbox, select %{strong_open}Save changes%{strong_close}, and start using slash commands in Slack!"
+msgstr ""
+
+msgid "SlackService|After setup, get a list of available Slack slash commands by entering"
msgstr ""
-msgid "SlackService|See list of available commands in Slack after setting up this service, by entering"
+msgid "SlackService|Fill in the word that works best for your team."
msgstr ""
-msgid "SlackService|This service allows users to perform common operations on this project by entering slash commands in Slack."
+msgid "SlackService|Perform common operations in this project by entering slash commands in Slack."
msgstr ""
msgid "Slice multiplier"
@@ -31180,7 +31646,7 @@ msgstr ""
msgid "Some child epics may be hidden due to applied filters"
msgstr ""
-msgid "Some common domains are not allowed. %{read_more_link}."
+msgid "Some common domains are not allowed. %{learn_more_link}."
msgstr ""
msgid "Some of the designs you tried uploading did not change:"
@@ -31264,9 +31730,6 @@ msgstr ""
msgid "Something went wrong while exporting requirements"
msgstr ""
-msgid "Something went wrong while fetching %{listType} list"
-msgstr ""
-
msgid "Something went wrong while fetching branches"
msgstr ""
@@ -31321,15 +31784,9 @@ msgstr ""
msgid "Something went wrong while merging this merge request. Please try again."
msgstr ""
-msgid "Something went wrong while moving issues."
-msgstr ""
-
msgid "Something went wrong while obtaining the Let's Encrypt certificate."
msgstr ""
-msgid "Something went wrong while performing the action."
-msgstr ""
-
msgid "Something went wrong while promoting the issue to an epic. Please try again."
msgstr ""
@@ -31657,7 +32114,10 @@ msgstr ""
msgid "SourcegraphPreferences|Uses a custom %{linkStart}Sourcegraph instance%{linkEnd}."
msgstr ""
-msgid "Spam Check API Key"
+msgid "Spam Check"
+msgstr ""
+
+msgid "Spam Check API key"
msgstr ""
msgid "Spam Logs"
@@ -31675,7 +32135,7 @@ msgstr ""
msgid "Specified URL cannot be used: \"%{reason}\""
msgstr ""
-msgid "Specify an e-mail address regex pattern to identify default internal users."
+msgid "Specify an email address regex pattern to identify default internal users."
msgstr ""
msgid "Speed up your pipelines with Needs relationships"
@@ -31930,7 +32390,7 @@ msgstr ""
msgid "StatusCheck|An error occurred fetching the status checks."
msgstr ""
-msgid "StatusCheck|Apply this status check to any branch or a specific protected branch."
+msgid "StatusCheck|Apply this status check to all branches or a specific protected branch."
msgstr ""
msgid "StatusCheck|Check for a status response in Merge Requests. Failures do not block merges. %{link_start}Learn more%{link_end}."
@@ -32269,6 +32729,9 @@ msgstr ""
msgid "Subscriptions"
msgstr ""
+msgid "Subscription|Your subscription for %{strong}%{namespace_name}%{strong_close} has expired and you are now on %{pricing_link_start}the GitLab Free tier%{pricing_link_end}. Don't worry, your data is safe. Get in touch with our support team (%{support_email}). They'll gladly help with your subscription renewal."
+msgstr ""
+
msgid "Subtracted"
msgstr ""
@@ -32497,6 +32960,9 @@ msgstr ""
msgid "SuperSonics|Plan"
msgstr ""
+msgid "SuperSonics|Please agree to the Subscription Agreement"
+msgstr ""
+
msgid "SuperSonics|Ready to get started? A GitLab plan is ideal for scaling organizations and for multi team usage."
msgstr ""
@@ -32527,6 +32993,9 @@ msgstr ""
msgid "SuperSonics|The activation code is not valid. Please make sure to copy it exactly from the Customers Portal or confirmation email. Learn more about %{linkStart}activating your subscription%{linkEnd}."
msgstr ""
+msgid "SuperSonics|The activation code should be a 24-character alphanumeric string"
+msgstr ""
+
msgid "SuperSonics|There is a connectivity issue."
msgstr ""
@@ -32569,9 +33038,15 @@ msgstr ""
msgid "SuperSonics|You do not have an active subscription"
msgstr ""
+msgid "SuperSonics|You have successfully added a license that activates on %{date}. Please see the subscription history table below for more details."
+msgstr ""
+
msgid "SuperSonics|You'll be charged for %{trueUpLinkStart}users over license%{trueUpLinkEnd} on a quarterly or annual basis, depending on the terms of your agreement."
msgstr ""
+msgid "SuperSonics|Your future dated license was successfully added"
+msgstr ""
+
msgid "SuperSonics|Your subscription"
msgstr ""
@@ -32824,7 +33299,7 @@ msgstr ""
msgid "Template to append to all Service Desk issues"
msgstr ""
-msgid "TemplateRepository|Select a repository to make its templates available to all projects. %{link_start}What should the repository contain?%{link_end} "
+msgid "TemplateRepository|Create common files more quickly, and standardize their format."
msgstr ""
msgid "Templates"
@@ -33030,7 +33505,7 @@ msgstr ""
msgid "TestCases|Search test cases"
msgstr ""
-msgid "TestCases|Something went wrong while adding test case to Todo."
+msgid "TestCases|Something went wrong while adding test case to a to-do item."
msgstr ""
msgid "TestCases|Something went wrong while creating a test case."
@@ -33042,7 +33517,7 @@ msgstr ""
msgid "TestCases|Something went wrong while fetching test cases list."
msgstr ""
-msgid "TestCases|Something went wrong while marking test case todo as done."
+msgid "TestCases|Something went wrong while marking test case to-do item as done."
msgstr ""
msgid "TestCases|Something went wrong while moving test case."
@@ -33162,7 +33637,7 @@ msgstr ""
msgid "Thanks for your purchase!"
msgstr ""
-msgid "That is ok, I do not want to renew"
+msgid "That's OK, I don't want to renew"
msgstr ""
msgid "That's it, well done!"
@@ -33185,7 +33660,7 @@ msgid_plural "The %{type} contains the following errors:"
msgstr[0] ""
msgstr[1] ""
-msgid "The API key used by GitLab for accessing the Spam Check service endpoint"
+msgid "The API key used by GitLab for accessing the Spam Check service endpoint."
msgstr ""
msgid "The GitLab subscription service (customers.gitlab.com) is currently experiencing an outage. You can monitor the status and get updates at %{linkStart}status.gitlab.com%{linkEnd}."
@@ -33224,9 +33699,6 @@ msgstr ""
msgid "The URL to use for connecting to Elasticsearch. Use a comma-separated list to support clustering (e.g., \"http://localhost:9200, http://localhost:9201\")."
msgstr ""
-msgid "The Vulnerability Report shows the results of the last successful pipeline run on the default branch."
-msgstr ""
-
msgid "The X509 Certificate to use when mutual TLS is required to communicate with the external authorization service. If left blank, the server certificate is still validated when accessing over HTTPS."
msgstr ""
@@ -33284,9 +33756,6 @@ msgstr ""
msgid "The default branch for this project has been changed. Please update your bookmarks."
msgstr ""
-msgid "The default expiration time for job artifacts. 0 for unlimited. The default unit is in seconds, but you can use other units, for example %{code_open}4 mins 2 sec%{code_close}, %{code_open}2h42min%{code_close}."
-msgstr ""
-
msgid "The dependency list details information about the components used within your project."
msgstr ""
@@ -33478,9 +33947,6 @@ msgstr ""
msgid "The merge conflicts for this merge request have already been resolved. Please return to the merge request."
msgstr ""
-msgid "The merge request can now be merged."
-msgstr ""
-
msgid "The metric must be one of %{metrics}."
msgstr ""
@@ -33856,7 +34322,7 @@ msgstr ""
msgid "There was a problem updating the keep latest artifacts setting."
msgstr ""
-msgid "There was an error %{message} todo."
+msgid "There was an error %{message} to-do item."
msgstr ""
msgid "There was an error adding a To Do."
@@ -33895,6 +34361,9 @@ msgstr ""
msgid "There was an error fetching projects"
msgstr ""
+msgid "There was an error fetching search autocomplete suggestions"
+msgstr ""
+
msgid "There was an error fetching stage total counts"
msgstr ""
@@ -34219,6 +34688,9 @@ msgstr ""
msgid "This field is required."
msgstr ""
+msgid "This form is disabled in preview"
+msgstr ""
+
msgid "This group"
msgstr ""
@@ -34240,9 +34712,6 @@ msgstr ""
msgid "This group is linked to a subscription"
msgstr ""
-msgid "This group, including all subgroups, projects and git repositories, will be reachable from only the specified IP address ranges."
-msgstr ""
-
msgid "This group, its subgroups and projects has been scheduled for removal on %{date}."
msgstr ""
@@ -34522,9 +34991,6 @@ msgstr ""
msgid "This user cannot be unlocked manually from GitLab"
msgstr ""
-msgid "This user does not have a pending request"
-msgstr ""
-
msgid "This user has an unconfirmed email address (%{email}). You may force a confirmation."
msgstr ""
@@ -34633,9 +35099,6 @@ msgstr ""
msgid "ThreatMonitoring|Packet Activity"
msgstr ""
-msgid "ThreatMonitoring|Policies"
-msgstr ""
-
msgid "ThreatMonitoring|Requests"
msgstr ""
@@ -34687,6 +35150,12 @@ msgstr ""
msgid "ThreatMonitoring|View documentation"
msgstr ""
+msgid "Threshold in bytes at which to compress Sidekiq job arguments."
+msgstr ""
+
+msgid "Threshold in bytes at which to reject Sidekiq jobs. Set this to 0 to if you don't want to limit Sidekiq jobs."
+msgstr ""
+
msgid "Throughput"
msgstr ""
@@ -34696,6 +35165,9 @@ msgstr ""
msgid "Time"
msgstr ""
+msgid "Time (in hours) that users are allowed to skip forced configuration of two-factor authentication."
+msgstr ""
+
msgid "Time Spent"
msgstr ""
@@ -34762,7 +35234,7 @@ msgstr ""
msgid "TimeTrackingEstimated|Est"
msgstr ""
-msgid "TimeTracking|%{startTag}Spent: %{endTag}%{timeSpentHumanReadable}"
+msgid "TimeTracking|%{spentStart}Spent: %{spentEnd}"
msgstr ""
msgid "TimeTracking|Estimated:"
@@ -34976,6 +35448,9 @@ msgstr ""
msgid "To access this domain create a new DNS record"
msgstr ""
+msgid "To add a custom suffix, set up a Service Desk email address. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "To add an SSH key you need to %{generate_link_start}generate one%{link_end} or use an %{existing_link_start}existing key%{link_end}."
msgstr ""
@@ -34997,13 +35472,16 @@ msgstr ""
msgid "To connect an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To continue using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
+msgstr ""
+
msgid "To continue, you need to select the link in the confirmation email we sent to verify your email address. If you didn't get our email, select %{strongStart}Resend confirmation email.%{strongEnd}"
msgstr ""
msgid "To define internal users, first enable new users set to external"
msgstr ""
-msgid "To enable Registration Features, make sure \"Enable service ping\" is checked."
+msgid "To enable Registration Features, first enable Service Ping."
msgstr ""
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
@@ -35030,7 +35508,7 @@ msgstr ""
msgid "To get started, use the link below to confirm your account."
msgstr ""
-msgid "To help improve GitLab and its user experience, GitLab will periodically collect usage information."
+msgid "To help improve GitLab and its user experience, GitLab periodically collects usage information."
msgstr ""
msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
@@ -35063,7 +35541,7 @@ msgstr ""
msgid "To preserve performance only %{strong_open}%{display_size} of %{real_size}%{strong_close} files are displayed."
msgstr ""
-msgid "To protect this issue's confidentiality, %{forkLink} and set the fork's visibility to private."
+msgid "To protect this issue's confidentiality, %{linkStart}fork this project%{linkEnd} and set the fork's visibility to private."
msgstr ""
msgid "To protect this issue's confidentiality, a private fork of this project was selected."
@@ -35096,12 +35574,15 @@ msgstr ""
msgid "To set up SAML authentication for your group through an identity provider like Azure, Okta, Onelogin, Ping Identity, or your custom SAML 2.0 provider:"
msgstr ""
-msgid "To set up this service:"
+msgid "To set up this integration:"
msgstr ""
msgid "To specify the notification level per project of a group you belong to, you need to visit project page and change notification level there."
msgstr ""
+msgid "To start using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
+msgstr ""
+
msgid "To unsubscribe from this issue, please paste the following link into your browser:"
msgstr ""
@@ -35689,9 +36170,6 @@ msgstr ""
msgid "Unable to fetch branches list, please close the form and try again"
msgstr ""
-msgid "Unable to fetch unscanned projects"
-msgstr ""
-
msgid "Unable to fetch vulnerable projects"
msgstr ""
@@ -35746,6 +36224,15 @@ msgstr ""
msgid "Unable to update this issue at this time."
msgstr ""
+msgid "Unapprove a merge request"
+msgstr ""
+
+msgid "Unapprove the current merge request."
+msgstr ""
+
+msgid "Unapproved the current merge request."
+msgstr ""
+
msgid "Unarchive project"
msgstr ""
@@ -35758,16 +36245,13 @@ msgstr ""
msgid "Unassigned"
msgstr ""
-msgid "Unauthenticated API request rate limit"
-msgstr ""
-
-msgid "Unauthenticated rate limit period in seconds"
+msgid "Unauthenticated API rate limit period in seconds"
msgstr ""
-msgid "Unauthenticated request rate limit"
+msgid "Unauthenticated requests"
msgstr ""
-msgid "Unauthenticated requests"
+msgid "Unauthenticated web rate limit period in seconds"
msgstr ""
msgid "Undo"
@@ -35869,18 +36353,6 @@ msgstr ""
msgid "Unresolved"
msgstr ""
-msgid "UnscannedProjects|15 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|30 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|5 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|60 or more days"
-msgstr ""
-
msgid "Unschedule job"
msgstr ""
@@ -36100,6 +36572,9 @@ msgstr ""
msgid "UsageQuota|%{help_link_start}Shared runners%{help_link_end} are disabled, so there are no limits set on pipeline usage"
msgstr ""
+msgid "UsageQuota|%{linkTitle} help link"
+msgstr ""
+
msgid "UsageQuota|%{percentageLeft} of purchased storage is available"
msgstr ""
@@ -36109,6 +36584,9 @@ msgstr ""
msgid "UsageQuota|Artifacts is a sum of build and pipeline artifacts."
msgstr ""
+msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
+msgstr ""
+
msgid "UsageQuota|Buy additional minutes"
msgstr ""
@@ -36118,9 +36596,21 @@ msgstr ""
msgid "UsageQuota|CI minutes usage by project"
msgstr ""
+msgid "UsageQuota|Code packages and container images."
+msgstr ""
+
msgid "UsageQuota|Current period usage"
msgstr ""
+msgid "UsageQuota|File attachments and smaller design graphics."
+msgstr ""
+
+msgid "UsageQuota|Git repository, managed by the Gitaly service."
+msgstr ""
+
+msgid "UsageQuota|Includes project registry, artifacts, packages, wiki, uploads and other items."
+msgstr ""
+
msgid "UsageQuota|Increase storage temporarily"
msgstr ""
@@ -36139,6 +36629,9 @@ msgstr ""
msgid "UsageQuota|Packages"
msgstr ""
+msgid "UsageQuota|Pipeline artifacts and job artifacts, created with CI/CD."
+msgstr ""
+
msgid "UsageQuota|Pipelines"
msgstr ""
@@ -36157,6 +36650,9 @@ msgstr ""
msgid "UsageQuota|Seats"
msgstr ""
+msgid "UsageQuota|Shared bits of code and text."
+msgstr ""
+
msgid "UsageQuota|Snippets"
msgstr ""
@@ -36166,6 +36662,12 @@ msgstr ""
msgid "UsageQuota|Storage"
msgstr ""
+msgid "UsageQuota|Storage type"
+msgstr ""
+
+msgid "UsageQuota|There is a known issue with Artifact storage where the total could be incorrect for some projects. More details and progress are available in %{warningLinkStart}the epic%{warningLinkEnd}."
+msgstr ""
+
msgid "UsageQuota|This is the total amount of storage used across your projects within this namespace."
msgstr ""
@@ -36205,6 +36707,9 @@ msgstr ""
msgid "UsageQuota|Usage"
msgstr ""
+msgid "UsageQuota|Usage Breakdown"
+msgstr ""
+
msgid "UsageQuota|Usage Quotas"
msgstr ""
@@ -36229,6 +36734,9 @@ msgstr ""
msgid "UsageQuota|Wiki"
msgstr ""
+msgid "UsageQuota|Wiki content."
+msgstr ""
+
msgid "UsageQuota|Wikis"
msgstr ""
@@ -36445,7 +36953,10 @@ msgstr ""
msgid "User Settings"
msgstr ""
-msgid "User and IP Rate Limits"
+msgid "User and IP rate limits"
+msgstr ""
+
+msgid "User does not have a pending request"
msgstr ""
msgid "User identity was successfully created."
@@ -36742,6 +37253,9 @@ msgstr ""
msgid "Users can launch a development environment from a GitLab browser tab when the %{linkStart}Gitpod%{linkEnd} integration is enabled."
msgstr ""
+msgid "Users can reactivate their account by signing in."
+msgstr ""
+
msgid "Users can render diagrams in AsciiDoc, Markdown, reStructuredText, and Textile documents using Kroki."
msgstr ""
@@ -36757,6 +37271,9 @@ msgstr ""
msgid "Users requesting access to"
msgstr ""
+msgid "Users to exclude from the rate limit"
+msgstr ""
+
msgid "Users were successfully added."
msgstr ""
@@ -36778,6 +37295,9 @@ msgstr ""
msgid "UsersSelect|Unassigned"
msgstr ""
+msgid "Uses GitLab as a lightweight alternative to Sentry."
+msgstr ""
+
msgid "Using %{code_start}::%{code_end} denotes a %{link_start}scoped label set%{link_end}"
msgstr ""
@@ -36808,10 +37328,7 @@ msgstr ""
msgid "Value Stream Analytics can help you determine your team’s velocity"
msgstr ""
-msgid "Value Stream Analytics gives an overview of how much time it takes to go from idea to production in your project."
-msgstr ""
-
-msgid "Value may contain a variable reference"
+msgid "Value might contain a variable reference"
msgstr ""
msgid "Value stream"
@@ -36877,10 +37394,10 @@ msgstr ""
msgid "ValueStream|The Default Value Stream cannot be deleted"
msgstr ""
-msgid "Variable"
+msgid "Values that contain the %{codeStart}$%{codeEnd} character can be considered a variable reference and expanded. %{docsLinkStart}Learn more.%{docsLinkEnd}"
msgstr ""
-msgid "Variable references indicated by %{codeStart}$%{codeEnd} may be expanded. If this is not what you want, consider %{docsLinkStart}using a workaround to prevent expansion%{docsLinkEnd}."
+msgid "Variable"
msgstr ""
msgid "Variable will be masked in job logs."
@@ -37285,6 +37802,9 @@ msgstr ""
msgid "Vulnerability|Evidence"
msgstr ""
+msgid "Vulnerability|False positive detected"
+msgstr ""
+
msgid "Vulnerability|File"
msgstr ""
@@ -37327,6 +37847,9 @@ msgstr ""
msgid "Vulnerability|Status"
msgstr ""
+msgid "Vulnerability|The scanner determined this vulnerability to be a false positive. Verify the evaluation before changing its status. %{linkStart}Learn more about false positive detection.%{linkEnd}"
+msgstr ""
+
msgid "Vulnerability|The unmodified response is the original response that had no mutations done to the request"
msgstr ""
@@ -37651,9 +38174,6 @@ msgstr ""
msgid "Welcome to GitLab,%{br_tag}%{name}!"
msgstr ""
-msgid "Welcome to the guided GitLab tour"
-msgstr ""
-
msgid "Welcome, %{name}!"
msgstr ""
@@ -37672,9 +38192,6 @@ msgstr ""
msgid "What are you searching for?"
msgstr ""
-msgid "What describes you best?"
-msgstr ""
-
msgid "What does this command do?"
msgstr ""
@@ -37696,13 +38213,13 @@ msgstr ""
msgid "What is your job title? (optional)"
msgstr ""
-msgid "What will you use this group for?"
+msgid "What templates can I create?"
msgstr ""
-msgid "What's new"
+msgid "What will you use this group for?"
msgstr ""
-msgid "What’s your experience level?"
+msgid "What's new"
msgstr ""
msgid "When a deployment job is successful, skip older deployment jobs that are still pending."
@@ -37714,6 +38231,9 @@ msgstr ""
msgid "When an event in GitLab triggers a webhook, you can use the request details to figure out if something went wrong."
msgstr ""
+msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+msgstr ""
+
msgid "When inactive, an external authentication provider must be used."
msgstr ""
@@ -37737,6 +38257,9 @@ msgstr ""
msgid "When:"
msgstr ""
+msgid "Which API requests are affected?"
+msgstr ""
+
msgid "While it's rare to have no vulnerabilities, it can happen. In any event, we ask that you please double check your settings to make sure you've set up your dashboard correctly."
msgstr ""
@@ -38016,6 +38539,9 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|Work Items"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -38091,6 +38617,9 @@ msgstr ""
msgid "You are already a member of this %{member_source}."
msgstr ""
+msgid "You are already impersonating another user"
+msgstr ""
+
msgid "You are an admin, which means granting access to %{client_name} will allow them to interact with GitLab as an admin as well. Proceed with caution."
msgstr ""
@@ -38193,6 +38722,9 @@ msgstr ""
msgid "You can also use project access tokens with Git to authenticate over HTTP(S). %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "You can always change your URL later"
+msgstr ""
+
msgid "You can always edit this later"
msgstr ""
@@ -38349,10 +38881,10 @@ msgstr ""
msgid "You can’t %{tag_start}edit%{tag_end} files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
-msgid "You could not create a new trigger."
+msgid "You can’t edit files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
-msgid "You didn't renew your subscription for %{strong}%{namespace_name}%{strong_close} so it was downgraded to the free plan."
+msgid "You could not create a new trigger."
msgstr ""
msgid "You do not have any subscriptions yet"
@@ -38520,6 +39052,12 @@ msgstr ""
msgid "You must provide your current password in order to change it."
msgstr ""
+msgid "You must sign in to search for specific projects."
+msgstr ""
+
+msgid "You must sign in to search for specific terms."
+msgstr ""
+
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
@@ -38547,6 +39085,9 @@ msgstr ""
msgid "You need to upload a GitLab project export archive (ending in .gz)."
msgstr ""
+msgid "You need to verify your primary email first before enabling Two-Factor Authentication."
+msgstr ""
+
msgid "You successfully declined the invitation"
msgstr ""
@@ -38655,10 +39196,10 @@ msgstr ""
msgid "Your %{host} account was signed in to from a new location"
msgstr ""
-msgid "Your %{strong}%{plan_name}%{strong_close} subscription for %{strong}%{namespace_name}%{strong_close} will expire on %{strong}%{expires_on}%{strong_close}."
+msgid "Your %{strong}%{plan_name}%{strong_close} subscription expires on %{strong}%{expires_on}%{strong_close}. After that date, you cannot create issues or merge requests, or use many other features."
msgstr ""
-msgid "Your %{strong}%{plan_name}%{strong_close} subscription will expire on %{strong}%{expires_on}%{strong_close}. After that, you will not be able to create issues or merge requests as well as many other features."
+msgid "Your %{strong}%{plan_name}%{strong_close} subscription for %{strong}%{namespace_name}%{strong_close} will expire on %{strong}%{expires_on}%{strong_close}."
msgstr ""
msgid "Your CI/CD configuration syntax is invalid. View Lint tab for more details."
@@ -38682,7 +39223,7 @@ msgstr ""
msgid "Your GPG keys (%{count})"
msgstr ""
-msgid "Your GitLab account has been locked due to an excessive amount of unsuccessful sign in attempts. Your account will automatically unlock in %{duration} or you may click the link below to unlock now."
+msgid "Your GitLab account has been locked due to an excessive number of unsuccessful sign in attempts. You can wait for your account to automatically unlock in %{duration} or you can click the link below to unlock now."
msgstr ""
msgid "Your GitLab account request has been approved!"
@@ -38793,6 +39334,9 @@ msgstr ""
msgid "Your commit email is used for web based operations, such as edits and merges."
msgstr ""
+msgid "Your current password is required to register a two-factor authenticator app."
+msgstr ""
+
msgid "Your dashboard has been copied. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
@@ -38892,6 +39436,9 @@ msgstr ""
msgid "Your project limit is %{limit} projects! Please contact your administrator to increase it"
msgstr ""
+msgid "Your project will be created at:"
+msgstr ""
+
msgid "Your projects"
msgstr ""
@@ -38931,11 +39478,10 @@ msgstr ""
msgid "Your subscription expired!"
msgstr ""
-msgid "Your subscription has been downgraded."
-msgstr ""
-
-msgid "Your subscription will expire in %{remaining_days}."
-msgstr ""
+msgid "Your subscription will expire in %{remaining_days} day."
+msgid_plural "Your subscription will expire in %{remaining_days} days."
+msgstr[0] ""
+msgstr[1] ""
msgid "Your username is %{username}."
msgstr ""
@@ -39142,6 +39688,9 @@ msgstr ""
msgid "cannot merge"
msgstr ""
+msgid "cannot not be used for user namespace"
+msgstr ""
+
msgid "ciReport|%{degradedNum} degraded"
msgstr ""
@@ -39465,6 +40014,9 @@ msgstr ""
msgid "created %{timeAgo}"
msgstr ""
+msgid "created %{timeAgo} by %{author}"
+msgstr ""
+
msgid "created by"
msgstr ""
@@ -39509,9 +40061,6 @@ msgstr ""
msgid "does not have a supported extension. Only %{extension_list} are supported"
msgstr ""
-msgid "domain is not authorized for sign-up."
-msgstr ""
-
msgid "download it"
msgstr ""
@@ -39529,18 +40078,13 @@ msgstr ""
msgid "email '%{email}' is not a verified email."
msgstr ""
-msgid "email does not match the allowed domain of %{email_domains}"
-msgid_plural "email does not match the allowed domains: %{email_domains}"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "enabled"
msgstr ""
msgid "encrypted: needs to be a :required, :optional or :migrating!"
msgstr ""
-msgid "ending with MIME type format is not allowed."
+msgid "ending with a reserved file extension is not allowed."
msgstr ""
msgid "entries cannot be larger than 255 characters"
@@ -39564,6 +40108,9 @@ msgstr ""
msgid "estimateCommand|%{slash_command} overwrites the total estimated time."
msgstr ""
+msgid "example.com"
+msgstr ""
+
msgid "exceeds the limit of %{bytes} bytes"
msgstr ""
@@ -39614,9 +40161,6 @@ msgstr ""
msgid "fork"
msgstr ""
-msgid "fork this project"
-msgstr ""
-
msgid "from"
msgstr ""
@@ -39625,6 +40169,9 @@ msgid_plural "from %d jobs"
msgstr[0] ""
msgstr[1] ""
+msgid "frontmatter"
+msgstr ""
+
msgid "group"
msgstr ""
@@ -39652,6 +40199,9 @@ msgstr ""
msgid "has been completed."
msgstr ""
+msgid "has too deep level of nesting"
+msgstr ""
+
msgid "help"
msgstr ""
@@ -39685,9 +40235,21 @@ msgstr ""
msgid "in"
msgstr ""
+msgid "in Infrastructure :: Kubernetes clusters"
+msgstr ""
+
+msgid "in all GitLab"
+msgstr ""
+
+msgid "in group"
+msgstr ""
+
msgid "in group %{link_to_group}"
msgstr ""
+msgid "in project"
+msgstr ""
+
msgid "in project %{link_to_project}"
msgstr ""
@@ -39729,16 +40291,19 @@ msgstr ""
msgid "is not a valid X509 certificate."
msgstr ""
-msgid "is not allowed since the group is not top-level group."
+msgid "is not allowed for sign-up."
msgstr ""
-msgid "is not allowed. Try again with a different email address, or contact your GitLab admin."
+msgid "is not allowed for this group."
msgstr ""
-msgid "is not allowed. We do not currently support project-level iterations"
+msgid "is not allowed for this project."
+msgstr ""
+
+msgid "is not allowed since the group is not top-level group."
msgstr ""
-msgid "is not from an allowed domain."
+msgid "is not allowed. We do not currently support project-level iterations"
msgstr ""
msgid "is not in the group enforcing Group Managed Account"
@@ -39831,6 +40396,9 @@ msgstr ""
msgid "log in"
msgstr ""
+msgid "managed"
+msgstr ""
+
msgid "manual"
msgstr ""
@@ -39878,6 +40446,9 @@ msgstr ""
msgid "mrWidget| Please restore it or use a different %{missingBranchName} branch"
msgstr ""
+msgid "mrWidget|%{linkStart}Set up now%{linkEnd} to analyze your source code for known security vulnerabilities."
+msgstr ""
+
msgid "mrWidget|%{mergeError}."
msgstr ""
@@ -39958,6 +40529,9 @@ msgid_plural "mrWidget|Closes issues"
msgstr[0] ""
msgstr[1] ""
+msgid "mrWidget|Create issue to resolve all threads"
+msgstr ""
+
msgid "mrWidget|Delete source branch"
msgstr ""
@@ -39967,12 +40541,18 @@ msgstr ""
msgid "mrWidget|Did not close"
msgstr ""
+msgid "mrWidget|Dismiss"
+msgstr ""
+
msgid "mrWidget|Email patches"
msgstr ""
msgid "mrWidget|Failed to load deployment statistics"
msgstr ""
+msgid "mrWidget|Hide %{widget} details"
+msgstr ""
+
msgid "mrWidget|If the %{missingBranchName} branch exists in your local repository, you can merge this merge request manually using the command line"
msgstr ""
@@ -40068,9 +40648,6 @@ msgstr ""
msgid "mrWidget|Request to merge"
msgstr ""
-msgid "mrWidget|Resolve all threads in new issue"
-msgstr ""
-
msgid "mrWidget|Resolve conflicts"
msgstr ""
@@ -40086,6 +40663,9 @@ msgstr ""
msgid "mrWidget|Revoke approval"
msgstr ""
+msgid "mrWidget|SAST and Secret Detection is not enabled."
+msgstr ""
+
msgid "mrWidget|Set by %{merge_author} to be added to the merge train when the pipeline succeeds"
msgstr ""
@@ -40095,6 +40675,9 @@ msgstr ""
msgid "mrWidget|Set by %{merge_author} to start a merge train when the pipeline succeeds"
msgstr ""
+msgid "mrWidget|Show %{widget} details"
+msgstr ""
+
msgid "mrWidget|The changes were merged into"
msgstr ""
@@ -40107,6 +40690,9 @@ msgstr ""
msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure, or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
msgstr ""
+msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure."
+msgstr ""
+
msgid "mrWidget|The source branch has been deleted"
msgstr ""
@@ -40149,6 +40735,9 @@ msgstr ""
msgid "mrWidget|You can merge after removing denied licenses"
msgstr ""
+msgid "mrWidget|You can only merge once this merge request is approved."
+msgstr ""
+
msgid "mrWidget|Your password"
msgstr ""
@@ -40185,6 +40774,9 @@ msgstr ""
msgid "must be less than the limit of %{tag_limit} tags"
msgstr ""
+msgid "must be set for a project namespace"
+msgstr ""
+
msgid "must be unique by status and elapsed time within a policy"
msgstr ""
@@ -40294,6 +40886,9 @@ msgstr ""
msgid "pipeline"
msgstr ""
+msgid "pipeline schedules documentation"
+msgstr ""
+
msgid "pod_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
msgstr ""
@@ -40343,16 +40938,25 @@ msgstr ""
msgid "project name"
msgstr ""
+msgid "project namespace cannot be the parent of another namespace"
+msgstr ""
+
msgid "projects"
msgstr ""
msgid "quick actions"
msgstr ""
-msgid "reCAPTCHA Private Key"
+msgid "reCAPTCHA"
+msgstr ""
+
+msgid "reCAPTCHA helps prevent credential stuffing."
msgstr ""
-msgid "reCAPTCHA Site Key"
+msgid "reCAPTCHA private key"
+msgstr ""
+
+msgid "reCAPTCHA site key"
msgstr ""
msgid "recent activity"
@@ -40579,6 +41183,9 @@ msgstr ""
msgid "user avatar"
msgstr ""
+msgid "user namespace cannot be the parent of another namespace"
+msgstr ""
+
msgid "user preferences"
msgstr ""
@@ -40671,3 +41278,9 @@ msgstr ""
msgid "your settings"
msgstr ""
+msgid "{group}"
+msgstr ""
+
+msgid "{project}"
+msgstr ""
+
diff --git a/locale/bn_IN/gitlab.po b/locale/bn_IN/gitlab.po
index 565d1f64646..ebdb5e26e68 100644
--- a/locale/bn_IN/gitlab.po
+++ b/locale/bn_IN/gitlab.po
@@ -14,10 +14,7 @@ msgstr ""
"X-Crowdin-Language: bn-IN\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-09-01 22:32\n"
-
-msgid " %{name}, confirm your email address now! "
-msgstr ""
+"PO-Revision-Date: 2021-10-04 20:20\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -92,6 +89,16 @@ msgstr ""
msgid "#general, #development"
msgstr ""
+msgid "%d Alert"
+msgid_plural "%d Alerts"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d Alert:"
+msgid_plural "%d Alerts:"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d Approval"
msgid_plural "%d Approvals"
msgstr[0] ""
@@ -455,7 +462,10 @@ msgstr ""
msgid "%{code_open}Protected:%{code_close} Only exposed to protected branches or tags."
msgstr ""
-msgid "%{commit_author_link} authored %{commit_timeago}"
+msgid "%{commit_author_link} authored %{commit_authored_timeago}"
+msgstr ""
+
+msgid "%{commit_author_link} authored %{commit_authored_timeago} and %{commit_committer_avatar} %{commit_committer_link} committed %{commit_committer_timeago}"
msgstr ""
msgid "%{completedCount} completed weight"
@@ -549,6 +559,15 @@ msgstr ""
msgid "%{doc_link_start}Advanced search%{doc_link_end} is enabled."
msgstr ""
+msgid "%{docs_link_start}Learn about visibility levels.%{docs_link_end}"
+msgstr ""
+
+msgid "%{docs_link_start}What is Large File Storage?%{docs_link_end}"
+msgstr ""
+
+msgid "%{docs_link_start}What is two-factor authentication?%{docs_link_end}"
+msgstr ""
+
msgid "%{due_date} (Past due)"
msgstr ""
@@ -621,9 +640,6 @@ msgstr ""
msgid "%{issueType} actions"
msgstr ""
-msgid "%{issuesCount} issues with a limit of %{maxIssueCount}"
-msgstr ""
-
msgid "%{issuesSize} with a limit of %{maxIssueCount}"
msgstr ""
@@ -681,6 +697,12 @@ msgstr ""
msgid "%{label_for_message} unavailable"
msgstr ""
+msgid "%{learn_more_link}."
+msgstr ""
+
+msgid "%{lessThan} 1 hour"
+msgstr ""
+
msgid "%{lets_encrypt_link_start}Let's Encrypt%{lets_encrypt_link_end} is a free, automated, and open certificate authority (CA) that issues digital certificates to enable HTTPS (SSL/TLS) for sites."
msgstr ""
@@ -693,15 +715,15 @@ msgstr ""
msgid "%{link_start}Learn more%{link_end} about roles."
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
-msgstr ""
-
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
msgstr ""
msgid "%{link_start}Start the title with %{draft_snippet}%{link_end} to prevent a merge request that is a work in progress from being merged before it's ready."
msgstr ""
+msgid "%{link_start}What information does GitLab Inc. collect?%{link_end}"
+msgstr ""
+
msgid "%{listToShow}, and %{awardsListLength} more"
msgstr ""
@@ -854,7 +876,7 @@ msgid_plural "%{securityScanner} results are not available because a pipeline ha
msgstr[0] ""
msgstr[1] ""
-msgid "%{service_ping_link_start}Learn more%{service_ping_link_end} about what information is shared with GitLab Inc."
+msgid "%{service_ping_link_start}What information is shared with GitLab Inc.?%{service_ping_link_end}"
msgstr ""
msgid "%{size} %{unit}"
@@ -890,6 +912,9 @@ msgstr ""
msgid "%{state} epics"
msgstr ""
+msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
+msgstr ""
+
msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
msgstr ""
@@ -949,11 +974,6 @@ msgstr ""
msgid "%{template_project_id} is unknown or invalid"
msgstr ""
-msgid "%{text} %{files}"
-msgid_plural "%{text} %{files} files"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%{text} is available"
msgstr ""
@@ -1038,9 +1058,6 @@ msgstr ""
msgid "%{wildcards_link_start}Wildcards%{wildcards_link_end} such as %{code_tag_start}v*%{code_tag_end} or %{code_tag_start}*-release%{code_tag_end} are supported."
msgstr ""
-msgid "&lt; 1 hour"
-msgstr ""
-
msgid "'%{data}' at %{location} does not match format: %{format}"
msgstr ""
@@ -1124,9 +1141,6 @@ msgstr ""
msgid "(we need your current password to confirm your changes)"
msgstr ""
-msgid "* * * * *"
-msgstr ""
-
msgid "+ %{amount} more"
msgstr ""
@@ -1193,10 +1207,10 @@ msgstr ""
msgid "."
msgstr ""
-msgid "0 bytes"
+msgid "/"
msgstr ""
-msgid "0 for unlimited, only effective with remote storage enabled."
+msgid "0 bytes"
msgstr ""
msgid "0t1DgySidms"
@@ -1326,6 +1340,9 @@ msgstr ""
msgid "1000+"
msgstr ""
+msgid "192.168.0.0/24"
+msgstr ""
+
msgid "1st contribution!"
msgstr ""
@@ -1479,9 +1496,6 @@ msgstr ""
msgid "A plain HTML site that uses Netlify for CI/CD instead of GitLab, but still with all the other great GitLab features"
msgstr ""
-msgid "A plain-text response to show to clients that hit the rate limit."
-msgstr ""
-
msgid "A platform value can be web, mob or app."
msgstr ""
@@ -1563,7 +1577,7 @@ msgstr ""
msgid "APIFuzzing|Configure HTTP basic authentication values. Other authentication methods are supported. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
+msgid "APIFuzzing|Customize your project's API fuzzing configuration options and copy the code snippet to your .gitlab-ci.yml file to apply any changes. Note that this tool does not reflect or update your .gitlab-ci.yml file automatically. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
msgstr ""
msgid "APIFuzzing|Enable authentication"
@@ -1626,9 +1640,6 @@ msgstr ""
msgid "APIFuzzing|To prevent a security leak, authentication info must be added as a %{ciVariablesLinkStart}CI variable%{ciVariablesLinkEnd}. As a user with maintainer access rights, you can manage CI variables in the %{ciSettingsLinkStart}Settings%{ciSettingsLinkEnd} area."
msgstr ""
-msgid "APIFuzzing|Use this tool to generate API fuzzing configuration YAML to copy into your .gitlab-ci.yml file. This tool does not reflect or update your .gitlab-ci.yml file automatically."
-msgstr ""
-
msgid "APIFuzzing|Username for basic authentication"
msgstr ""
@@ -1680,9 +1691,6 @@ msgstr ""
msgid "Abuse reports notification email"
msgstr ""
-msgid "Abuse reports will be sent to this address if it is set. Abuse reports are always available in the admin area."
-msgstr ""
-
msgid "Accept invitation"
msgstr ""
@@ -1719,12 +1727,18 @@ msgstr ""
msgid "Access granted"
msgstr ""
+msgid "Access key ID"
+msgstr ""
+
msgid "Access requests"
msgstr ""
msgid "Access to '%{classification_label}' not allowed"
msgstr ""
+msgid "Access tokens expire after 2 hours. A refresh token may be used at any time to generate a new access token. Non-expiring access tokens are deprecated. Clear this setting to enable backward compatibility."
+msgstr ""
+
msgid "AccessDropdown|Deploy Keys"
msgstr ""
@@ -2037,6 +2051,9 @@ msgstr ""
msgid "Add new directory"
msgstr ""
+msgid "Add new service account"
+msgstr ""
+
msgid "Add or remove previously merged commits"
msgstr ""
@@ -2274,6 +2291,9 @@ msgstr ""
msgid "AdminArea|Features"
msgstr ""
+msgid "AdminArea|Get security updates from GitLab and stay up to date"
+msgstr ""
+
msgid "AdminArea|Groups"
msgstr ""
@@ -2313,6 +2333,12 @@ msgstr ""
msgid "AdminArea|Reporter"
msgstr ""
+msgid "AdminArea|Sign up for the GitLab Security Newsletter to get notified for security updates."
+msgstr ""
+
+msgid "AdminArea|Sign up for the GitLab newsletter"
+msgstr ""
+
msgid "AdminArea|Stop all jobs"
msgstr ""
@@ -2382,9 +2408,15 @@ msgstr ""
msgid "AdminSettings|Disable public access to Pages sites"
msgstr ""
+msgid "AdminSettings|Display a banner on merge requests in projects with no pipelines to initiate steps to add a .gitlab-ci.yml file."
+msgstr ""
+
msgid "AdminSettings|Domain verification is an essential security measure for public GitLab sites. Users are required to demonstrate they control a domain before it is enabled. %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "AdminSettings|Enable pipeline suggestion banner"
+msgstr ""
+
msgid "AdminSettings|Enable shared runners for new projects"
msgstr ""
@@ -2856,10 +2888,10 @@ msgstr ""
msgid "Admin|Quarterly reconciliation will occur on %{qrtlyDate}"
msgstr ""
-msgid "Admin|The number of max seats used for your namespace is currently exceeding the number of seats in your subscription. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgid "Admin|The number of max seats in your namespace exceeds the number of seats in your subscription. On %{qrtlyDate}, quarterly reconciliation occurs and you are automatically billed a prorated amount for the overage. No action is needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice. For more information about the timing of the invoicing process, view the documentation."
msgstr ""
-msgid "Admin|The number of maximum users for your instance is currently exceeding the number of users in license. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgid "Admin|The number of max users in your instance exceeds the number of users in your license. On %{qrtlyDate}, quarterly reconciliation occurs and you are automatically billed a prorated amount for the overage. No action is needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice. For more information about the timing of the invoicing process, view the documentation."
msgstr ""
msgid "Admin|View pending user approvals"
@@ -2880,9 +2912,6 @@ msgstr ""
msgid "Advanced export options"
msgstr ""
-msgid "Advanced permissions, Large File Storage and Two-Factor authentication settings."
-msgstr ""
-
msgid "After a successful password update you will be redirected to login screen."
msgstr ""
@@ -2901,13 +2930,14 @@ msgstr ""
msgid "After you've reviewed these contribution guidelines, you'll be all set to"
msgstr ""
+msgid "Akismet"
+msgstr ""
+
msgid "Akismet API Key"
msgstr ""
-msgid "Alert"
-msgid_plural "Alerts"
-msgstr[0] ""
-msgstr[1] ""
+msgid "Akismet helps prevent the creation of spam issues in public projects."
+msgstr ""
msgid "AlertManagement|Acknowledged"
msgstr ""
@@ -3263,6 +3293,9 @@ msgstr ""
msgid "All (default)"
msgstr ""
+msgid "All GitLab"
+msgstr ""
+
msgid "All Members"
msgstr ""
@@ -3377,6 +3410,9 @@ msgstr ""
msgid "Allow this secondary node to replicate content on Object Storage"
msgstr ""
+msgid "Allow use of licensed EE features"
+msgstr ""
+
msgid "Allow users to dismiss the broadcast message"
msgstr ""
@@ -3452,9 +3488,6 @@ msgstr ""
msgid "Amazon authentication is not %{link_start}correctly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
-msgid "Amount of time (in hours) that users are allowed to skip forced configuration of two-factor authentication"
-msgstr ""
-
msgid "An %{link_start}alert%{link_end} with the same fingerprint is already open. To change the status of this alert, resolve the linked alert."
msgstr ""
@@ -3515,12 +3548,6 @@ msgstr ""
msgid "An error occurred when removing the label."
msgstr ""
-msgid "An error occurred when toggling the notification subscription"
-msgstr ""
-
-msgid "An error occurred when updating the issue weight"
-msgstr ""
-
msgid "An error occurred when updating the title"
msgstr ""
@@ -3569,6 +3596,9 @@ msgstr ""
msgid "An error occurred while enabling Service Desk."
msgstr ""
+msgid "An error occurred while fetching Markdown preview"
+msgstr ""
+
msgid "An error occurred while fetching ancestors"
msgstr ""
@@ -3599,9 +3629,6 @@ msgstr ""
msgid "An error occurred while fetching label colors."
msgstr ""
-msgid "An error occurred while fetching markdown preview"
-msgstr ""
-
msgid "An error occurred while fetching participants"
msgstr ""
@@ -3617,9 +3644,6 @@ msgstr ""
msgid "An error occurred while fetching reference"
msgstr ""
-msgid "An error occurred while fetching sidebar data"
-msgstr ""
-
msgid "An error occurred while fetching tags. Retry the search."
msgstr ""
@@ -3695,6 +3719,9 @@ msgstr ""
msgid "An error occurred while loading merge requests."
msgstr ""
+msgid "An error occurred while loading projects."
+msgstr ""
+
msgid "An error occurred while loading the Needs tab."
msgstr ""
@@ -3929,12 +3956,6 @@ msgstr ""
msgid "Any Milestone"
msgstr ""
-msgid "Any branch"
-msgstr ""
-
-msgid "Any eligible user"
-msgstr ""
-
msgid "Any encrypted tokens"
msgstr ""
@@ -3953,6 +3974,9 @@ msgstr ""
msgid "Any namespace"
msgstr ""
+msgid "App Engine description and apps that are suitable for this deployment target"
+msgstr ""
+
msgid "App ID"
msgstr ""
@@ -4101,6 +4125,11 @@ msgstr ""
msgid "Apply"
msgstr ""
+msgid "Apply %d suggestion"
+msgid_plural "Apply %d suggestions"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Apply a label"
msgstr ""
@@ -4110,13 +4139,10 @@ msgstr ""
msgid "Apply suggestion"
msgstr ""
-msgid "Apply suggestions"
-msgstr ""
-
msgid "Apply template"
msgstr ""
-msgid "Apply this approval rule to any branch or a specific protected branch."
+msgid "Apply this approval rule to all branches or a specific protected branch."
msgstr ""
msgid "Applying"
@@ -4259,9 +4285,6 @@ msgstr ""
msgid "ApprovalSettings|Prevent editing approval rules in projects and merge requests."
msgstr ""
-msgid "ApprovalSettings|Prevent editing approval rules in projects and merge requests. "
-msgstr ""
-
msgid "ApprovalSettings|Remove all approvals when commits are added to the source branch."
msgstr ""
@@ -4277,6 +4300,9 @@ msgstr ""
msgid "ApprovalSettings|This setting is configured at the instance level and can only be changed by an administrator."
msgstr ""
+msgid "ApprovalSettings|This setting is configured in %{groupName} and can only be changed by an administrator or group owner."
+msgstr ""
+
msgid "ApprovalStatusTooltip|Adheres to separation of duties"
msgstr ""
@@ -4763,9 +4789,6 @@ msgstr ""
msgid "Authenticated API rate limit period in seconds"
msgstr ""
-msgid "Authenticated API request rate limit"
-msgstr ""
-
msgid "Authenticated API requests"
msgstr ""
@@ -4775,10 +4798,10 @@ msgstr ""
msgid "Authenticated Git LFS request rate limit"
msgstr ""
-msgid "Authenticated web rate limit period in seconds"
+msgid "Authenticated Git LFS requests"
msgstr ""
-msgid "Authenticated web request rate limit"
+msgid "Authenticated web rate limit period in seconds"
msgstr ""
msgid "Authenticated web requests"
@@ -5156,9 +5179,6 @@ msgstr ""
msgid "Below you will find all the groups that are public."
msgstr ""
-msgid "Beta"
-msgstr ""
-
msgid "Bi-weekly code coverage"
msgstr ""
@@ -5398,6 +5418,21 @@ msgstr ""
msgid "Board scope affects which issues are displayed for anyone who visits this board"
msgstr ""
+msgid "BoardNewEpic|Groups"
+msgstr ""
+
+msgid "BoardNewEpic|Loading groups"
+msgstr ""
+
+msgid "BoardNewEpic|No matching results"
+msgstr ""
+
+msgid "BoardNewEpic|Search groups"
+msgstr ""
+
+msgid "BoardNewEpic|Select a group"
+msgstr ""
+
msgid "BoardNewIssue|No matching results"
msgstr ""
@@ -5475,6 +5510,9 @@ msgstr ""
msgid "Boards|An error occurred while creating the list. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching child groups. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching group projects. Please try again."
msgstr ""
@@ -5807,6 +5845,9 @@ msgstr ""
msgid "Bulk update"
msgstr ""
+msgid "BulkImports|Re-import creates a new group. It does not sync with the existing group."
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -5816,6 +5857,9 @@ msgstr ""
msgid "BulkImport|From source group"
msgstr ""
+msgid "BulkImport|Group import history"
+msgstr ""
+
msgid "BulkImport|Import failed: Destination cannot be a subgroup of the source group. Change the destination and try again."
msgstr ""
@@ -5828,9 +5872,18 @@ msgstr ""
msgid "BulkImport|Importing the group failed"
msgstr ""
+msgid "BulkImport|Last imported to %{link}"
+msgstr ""
+
msgid "BulkImport|Name already exists."
msgstr ""
+msgid "BulkImport|New group"
+msgstr ""
+
+msgid "BulkImport|No history is available"
+msgstr ""
+
msgid "BulkImport|No parent"
msgstr ""
@@ -5843,6 +5896,9 @@ msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} matching filter \"%{filter}\" from %{link}"
msgstr ""
+msgid "BulkImport|Source group"
+msgstr ""
+
msgid "BulkImport|To new group"
msgstr ""
@@ -5852,6 +5908,9 @@ msgstr ""
msgid "BulkImport|You have no groups to import"
msgstr ""
+msgid "BulkImport|Your imported groups will appear here."
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -6094,6 +6153,9 @@ msgstr ""
msgid "Can be manually deployed to"
msgstr ""
+msgid "Can be overridden in each project."
+msgstr ""
+
msgid "Can create groups:"
msgstr ""
@@ -6196,6 +6258,9 @@ msgstr ""
msgid "Cancelling Preview"
msgstr ""
+msgid "Cannot assign a confidential epic to a non-confidential issue. Make the issue confidential and try again"
+msgstr ""
+
msgid "Cannot be assigned to other projects."
msgstr ""
@@ -6247,9 +6312,6 @@ msgstr ""
msgid "Cannot refer to a group %{timebox_type} by an internal id!"
msgstr ""
-msgid "Cannot set confidential epic for a non-confidential issue"
-msgstr ""
-
msgid "Cannot show preview. For previews on sketch files, they must have the file format introduced by Sketch version 43 and above."
msgstr ""
@@ -6487,15 +6549,15 @@ msgstr ""
msgid "Check out, review, and merge locally"
msgstr ""
-msgid "Check the %{docs_link_start}documentation%{docs_link_end}."
-msgstr ""
-
msgid "Check the current instance configuration "
msgstr ""
msgid "Check the elasticsearch.log file to debug why the migration was halted and make any changes before retrying the migration. When you fix the cause of the failure, click \"Retry migration\", and the migration will be scheduled to be retried in the background."
msgstr ""
+msgid "Check with your administrator."
+msgstr ""
+
msgid "Check your Docker images for known vulnerabilities."
msgstr ""
@@ -6526,6 +6588,9 @@ msgstr ""
msgid "Checkout"
msgstr ""
+msgid "Checkout|$%{selectedPlanPrice} per 10 GB storage per pack"
+msgstr ""
+
msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 minutes"
msgstr ""
@@ -6546,17 +6611,23 @@ msgstr ""
msgid "Checkout|%{name}'s GitLab subscription"
msgstr ""
-msgid "Checkout|%{selectedPlanText} plan"
+msgid "Checkout|%{name}'s storage subscription"
msgstr ""
-msgid "Checkout|%{startDate} - %{endDate}"
+msgid "Checkout|%{quantity} GB of storage"
msgstr ""
-msgid "Checkout|%{totalCiMinutes} CI minute"
-msgid_plural "Checkout|%{totalCiMinutes} CI minutes"
+msgid "Checkout|%{quantity} storage pack"
+msgid_plural "Checkout|%{quantity} storage packs"
msgstr[0] ""
msgstr[1] ""
+msgid "Checkout|%{selectedPlanText} plan"
+msgstr ""
+
+msgid "Checkout|%{startDate} - %{endDate}"
+msgstr ""
+
msgid "Checkout|%{totalCiMinutes} CI minutes"
msgstr ""
@@ -6632,6 +6703,9 @@ msgstr ""
msgid "Checkout|Failed to register credit card. Please try again."
msgstr ""
+msgid "Checkout|GB"
+msgstr ""
+
msgid "Checkout|GitLab group"
msgstr ""
@@ -6668,6 +6742,9 @@ msgstr ""
msgid "Checkout|State"
msgstr ""
+msgid "Checkout|Storage packs"
+msgstr ""
+
msgid "Checkout|Street address"
msgstr ""
@@ -6689,6 +6766,9 @@ msgstr ""
msgid "Checkout|Total minutes: %{quantity}"
msgstr ""
+msgid "Checkout|Total storage: %{quantity} GB"
+msgstr ""
+
msgid "Checkout|Users"
msgstr ""
@@ -6698,16 +6778,25 @@ msgstr ""
msgid "Checkout|Your organization"
msgstr ""
+msgid "Checkout|Your storage subscription has the same term as your main subscription, and the price is prorated accordingly."
+msgstr ""
+
msgid "Checkout|Your subscription will be applied to this group"
msgstr ""
msgid "Checkout|Zip code"
msgstr ""
+msgid "Checkout|a storage subscription"
+msgstr ""
+
msgid "Checkout|company or team"
msgstr ""
-msgid "Checkout|x 1,000 minutes per pack = %{strong}"
+msgid "Checkout|minutes"
+msgstr ""
+
+msgid "Checkout|x %{quantity} %{units} per pack ="
msgstr ""
msgid "Cherry-pick this commit"
@@ -7064,6 +7153,9 @@ msgstr ""
msgid "CloneIssue|Cannot clone issue to target project as it is pending deletion."
msgstr ""
+msgid "CloneIssue|Cannot clone issues of '%{issue_type}' type."
+msgstr ""
+
msgid "Cloned this issue to %{path_to_project}."
msgstr ""
@@ -7118,7 +7210,10 @@ msgstr ""
msgid "Closes this %{quick_action_target}."
msgstr ""
-msgid "Cloud licenses can not be removed."
+msgid "Cloud Functions description and apps that are suitable for this deployment target"
+msgstr ""
+
+msgid "Cloud Run description and apps that are suitable for this deployment target"
msgstr ""
msgid "Cluster"
@@ -7145,6 +7240,12 @@ msgstr ""
msgid "ClusterAgents|Access tokens"
msgstr ""
+msgid "ClusterAgents|Agent might not be connected to GitLab"
+msgstr ""
+
+msgid "ClusterAgents|Agent never connected to GitLab"
+msgstr ""
+
msgid "ClusterAgents|Alternative installation methods"
msgstr ""
@@ -7160,6 +7261,12 @@ msgstr ""
msgid "ClusterAgents|Configuration"
msgstr ""
+msgid "ClusterAgents|Connected"
+msgstr ""
+
+msgid "ClusterAgents|Connection status"
+msgstr ""
+
msgid "ClusterAgents|Copy token"
msgstr ""
@@ -7178,6 +7285,9 @@ msgstr ""
msgid "ClusterAgents|For alternative installation methods %{linkStart}go to the documentation%{linkEnd}."
msgstr ""
+msgid "ClusterAgents|For more troubleshooting information go to"
+msgstr ""
+
msgid "ClusterAgents|Go to the repository"
msgstr ""
@@ -7193,18 +7303,30 @@ msgstr ""
msgid "ClusterAgents|Integrate with the GitLab Agent"
msgstr ""
-msgid "ClusterAgents|Last used"
+msgid "ClusterAgents|Last connected %{timeAgo}."
+msgstr ""
+
+msgid "ClusterAgents|Last contact"
msgstr ""
msgid "ClusterAgents|Learn how to create an agent access token"
msgstr ""
+msgid "ClusterAgents|Make sure you are using a valid token."
+msgstr ""
+
msgid "ClusterAgents|Name"
msgstr ""
msgid "ClusterAgents|Never"
msgstr ""
+msgid "ClusterAgents|Never connected"
+msgstr ""
+
+msgid "ClusterAgents|Not connected"
+msgstr ""
+
msgid "ClusterAgents|Read more about getting started"
msgstr ""
@@ -7226,6 +7348,9 @@ msgstr ""
msgid "ClusterAgents|Select which Agent you want to install"
msgstr ""
+msgid "ClusterAgents|The Agent has not been connected in a long time. There might be a connectivity issue. Last contact was %{timeAgo}."
+msgstr ""
+
msgid "ClusterAgents|The GitLab Agent also requires %{linkStart}enabling the Agent Server%{linkEnd}"
msgstr ""
@@ -7253,9 +7378,6 @@ msgstr ""
msgid "ClusterAgents|You will need to create a token to connect to your agent"
msgstr ""
-msgid "ClusterAgent|This feature is only available for premium plans"
-msgstr ""
-
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -7445,9 +7567,6 @@ msgstr ""
msgid "ClusterIntegration|Create Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Create a provision role on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the account and external ID above. %{startMoreInfoLink}More information%{endLink}"
-msgstr ""
-
msgid "ClusterIntegration|Create cluster on"
msgstr ""
@@ -7880,7 +7999,7 @@ msgstr ""
msgid "ClusterIntegration|Subnets"
msgstr ""
-msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provisioned role, first create one on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the above account and external IDs. %{startMoreInfoLink}More information%{endLink}"
+msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provisioned role, first create one on %{awsLinkStart}Amazon Web Services %{awsLinkEnd} using the above account and external IDs. %{moreInfoStart}More information%{moreInfoEnd}"
msgstr ""
msgid "ClusterIntegration|The Kubernetes certificate used to authenticate to the cluster."
@@ -8114,6 +8233,9 @@ msgstr ""
msgid "Collapse replies"
msgstr ""
+msgid "Collapse settings section"
+msgstr ""
+
msgid "Collapse sidebar"
msgstr ""
@@ -8132,6 +8254,9 @@ msgstr ""
msgid "Comma-separated list of email addresses."
msgstr ""
+msgid "Comma-separated list of users allowed to exceed the rate limit."
+msgstr ""
+
msgid "Comma-separated, e.g. '1.1.1.1, 2.2.2.0/24'"
msgstr ""
@@ -8452,6 +8577,9 @@ msgstr ""
msgid "Configure %{repository_checks_link_start}repository checks%{link_end} and %{housekeeping_link_start}housekeeping%{link_end} on repositories."
msgstr ""
+msgid "Configure CAPTCHAs, IP address limits, and other anti-spam measures."
+msgstr ""
+
msgid "Configure Dependency Scanning in `.gitlab-ci.yml` using the GitLab managed template. You can [add variable overrides](https://docs.gitlab.com/ee/user/application_security/dependency_scanning/#customizing-the-dependency-scanning-settings) to customize Dependency Scanning settings."
msgstr ""
@@ -8488,16 +8616,13 @@ msgstr ""
msgid "Configure a %{codeStart}.gitlab-webide.yml%{codeEnd} file in the %{codeStart}.gitlab%{codeEnd} directory to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
msgstr ""
-msgid "Configure existing installation"
-msgstr ""
-
-msgid "Configure limit for notes created per minute by web and API requests."
+msgid "Configure advanced permissions, Large File Storage, and two-factor authentication settings."
msgstr ""
-msgid "Configure limits for Project/Group Import/Export."
+msgid "Configure approvals by authors and committers on all projects."
msgstr ""
-msgid "Configure limits for web and API requests."
+msgid "Configure existing installation"
msgstr ""
msgid "Configure paths to be protected by Rack Attack."
@@ -8512,10 +8637,13 @@ msgstr ""
msgid "Configure settings for Advanced Search with Elasticsearch."
msgstr ""
+msgid "Configure specific limits for Files API requests that supersede the general user and IP rate limits."
+msgstr ""
+
msgid "Configure specific limits for Git LFS requests that supersede the general user and IP rate limits."
msgstr ""
-msgid "Configure specific limits for Packages API requests that supersede the general user and IP rate limits."
+msgid "Configure specific limits for deprecated API requests that supersede the general user and IP rate limits."
msgstr ""
msgid "Configure the %{link} integration."
@@ -8527,6 +8655,9 @@ msgstr ""
msgid "Configure the way a user creates a new account."
msgstr ""
+msgid "Configure via Merge Request"
+msgstr ""
+
msgid "Configure which lists are shown for anyone who visits this board"
msgstr ""
@@ -8995,6 +9126,9 @@ msgstr ""
msgid "Content parsed with %{link}."
msgstr ""
+msgid "ContentEditor|Table of Contents"
+msgstr ""
+
msgid "ContentEditor|You have to provide a renderMarkdown function or a custom serializer"
msgstr ""
@@ -9181,6 +9315,9 @@ msgstr ""
msgid "Copy link to chart"
msgstr ""
+msgid "Copy prefix"
+msgstr ""
+
msgid "Copy reference"
msgstr ""
@@ -9211,6 +9348,9 @@ msgstr ""
msgid "Copy value"
msgstr ""
+msgid "Corpus Management"
+msgstr ""
+
msgid "Corpus Management|Are you sure you want to delete the corpus?"
msgstr ""
@@ -9439,6 +9579,9 @@ msgstr ""
msgid "Create commit"
msgstr ""
+msgid "Create common files more quickly, and standardize their format."
+msgstr ""
+
msgid "Create confidential merge request"
msgstr ""
@@ -9472,6 +9615,9 @@ msgstr ""
msgid "Create issue"
msgstr ""
+msgid "Create issue to resolve all threads"
+msgstr ""
+
msgid "Create iteration"
msgstr ""
@@ -9526,6 +9672,9 @@ msgstr ""
msgid "Create new..."
msgstr ""
+msgid "Create or import your first project"
+msgstr ""
+
msgid "Create project"
msgstr ""
@@ -9883,7 +10032,7 @@ msgstr ""
msgid "Custom notification events"
msgstr ""
-msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notificationLinkStart} notification emails%{notificationLinkEnd}."
+msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notificationLinkStart}notification emails%{notificationLinkEnd}."
msgstr ""
msgid "Custom project templates"
@@ -10082,10 +10231,10 @@ msgid_plural "CycleAnalytics|Showing %{subjectFilterText} and %{selectedLabelsCo
msgstr[0] ""
msgstr[1] ""
-msgid "CycleAnalytics|Showing data for group '%{groupName}' and %{selectedProjectCount} projects from %{startDate} to %{endDate}"
+msgid "CycleAnalytics|Showing data for group '%{groupName}' and %{selectedProjectCount} projects from %{createdAfter} to %{createdBefore}"
msgstr ""
-msgid "CycleAnalytics|Showing data for group '%{groupName}' from %{startDate} to %{endDate}"
+msgid "CycleAnalytics|Showing data for group '%{groupName}' from %{createdAfter} to %{createdBefore}"
msgstr ""
msgid "CycleAnalytics|Stages"
@@ -10319,6 +10468,9 @@ msgstr ""
msgid "DastProfiles|Manage profiles"
msgstr ""
+msgid "DastProfiles|Manage site profiles"
+msgstr ""
+
msgid "DastProfiles|Minimum = 0 (no timeout enabled), Maximum = 2880 minutes"
msgstr ""
@@ -10394,6 +10546,9 @@ msgstr ""
msgid "DastProfiles|Scanner name"
msgstr ""
+msgid "DastProfiles|Schedule"
+msgstr ""
+
msgid "DastProfiles|Select branch"
msgstr ""
@@ -10463,7 +10618,7 @@ msgstr ""
msgid "DastProfiles|Website"
msgstr ""
-msgid "DastProfiles|You can either choose a passive scan or validate the target site in your chosen site profile. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
+msgid "DastProfiles|You can either choose a passive scan or validate the target site from the site profile management page. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
msgstr ""
msgid "DastProfiles|You cannot run an active scan against an unvalidated site."
@@ -10636,7 +10791,7 @@ msgstr ""
msgid "Days to merge"
msgstr ""
-msgid "Deactivate dormant users after 90 days of inactivity. Users can return to active status by signing in to their account. While inactive, a user is not counted as an active user in the instance."
+msgid "Deactivate dormant users after 90 days of inactivity"
msgstr ""
msgid "Dear Administrator,"
@@ -10723,10 +10878,10 @@ msgstr ""
msgid "Define a custom pattern with cron syntax"
msgstr ""
-msgid "Define approval settings."
+msgid "Define approval rules."
msgstr ""
-msgid "Define approval settings. %{linkStart}Learn more.%{linkEnd}"
+msgid "Define approval rules. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "Define custom rules for what constitutes spam, independent of Akismet"
@@ -10735,7 +10890,7 @@ msgstr ""
msgid "Define environments in the deploy stage(s) in %{code_open}.gitlab-ci.yml%{code_close} to track deployments here."
msgstr ""
-msgid "Define how approval rules are applied as a merge request moves toward completion."
+msgid "Define how approval rules are applied to merge requests."
msgstr ""
msgid "Definition"
@@ -10750,6 +10905,12 @@ msgstr ""
msgid "DelayedJobs|Are you sure you want to run %{job_name} immediately? This job will run automatically after it's timer finishes."
msgstr ""
+msgid "DelayedJobs|Are you sure you want to run %{job_name} immediately? This job will run automatically after its timer finishes."
+msgstr ""
+
+msgid "DelayedJobs|Run the delayed job now?"
+msgstr ""
+
msgid "DelayedJobs|Start now"
msgstr ""
@@ -11026,6 +11187,12 @@ msgstr ""
msgid "Dependency proxy image prefix"
msgstr ""
+msgid "DependencyProxy|Create a local proxy for storing frequently used upstream images. %{docLinkStart}Learn more%{docLinkEnd} about dependency proxies."
+msgstr ""
+
+msgid "DependencyProxy|Dependency Proxy"
+msgstr ""
+
msgid "DependencyProxy|Toggle Dependency Proxy"
msgstr ""
@@ -11266,6 +11433,9 @@ msgstr ""
msgid "Deployments"
msgstr ""
+msgid "Deployments to Google Kubernetes Engine can be "
+msgstr ""
+
msgid "Deployments|%{deployments} environment impacted."
msgid_plural "Deployments|%{deployments} environments impacted."
msgstr[0] ""
@@ -11295,6 +11465,9 @@ msgstr ""
msgid "Deployment|success"
msgstr ""
+msgid "Deprecated API rate limits"
+msgstr ""
+
msgid "Deprioritize label"
msgstr ""
@@ -11697,6 +11870,16 @@ msgstr ""
msgid "DiffsCompareBaseBranch|(base)"
msgstr ""
+msgid "Diffs|%d addition"
+msgid_plural "Diffs|%d additions"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Diffs|%d deletion"
+msgid_plural "Diffs|%d deletions"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Diffs|No file name available"
msgstr ""
@@ -11706,9 +11889,17 @@ msgstr ""
msgid "Diffs|Show all unchanged lines"
msgstr ""
+msgid "Diffs|Showing %{dropdownStart}%{count} changed file%{dropdownEnd}"
+msgid_plural "Diffs|Showing %{dropdownStart}%{count} changed files%{dropdownEnd}"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Diffs|Something went wrong while fetching diff lines."
msgstr ""
+msgid "Diffs|with %{additions} and %{deletions}"
+msgstr ""
+
msgid "Direct member"
msgstr ""
@@ -11834,9 +12025,6 @@ msgid_plural "Dismiss %d selected vulnerabilities as"
msgstr[0] ""
msgstr[1] ""
-msgid "Dismiss Value Stream Analytics introduction box"
-msgstr ""
-
msgid "Dismiss merge request promotion"
msgstr ""
@@ -12158,6 +12346,9 @@ msgstr ""
msgid "Edit issues"
msgstr ""
+msgid "Edit merge requests"
+msgstr ""
+
msgid "Edit public deploy key"
msgstr ""
@@ -12233,6 +12424,9 @@ msgstr ""
msgid "Elastic|None. Select projects to index."
msgstr ""
+msgid "Eligible users"
+msgstr ""
+
msgid "Email"
msgstr ""
@@ -12362,6 +12556,9 @@ msgstr ""
msgid "Enable"
msgstr ""
+msgid "Enable Amazon EKS integration"
+msgstr ""
+
msgid "Enable Auto DevOps"
msgstr ""
@@ -12395,6 +12592,9 @@ msgstr ""
msgid "Enable SSL verification"
msgstr ""
+msgid "Enable Service Ping"
+msgstr ""
+
msgid "Enable Snowplow tracking"
msgstr ""
@@ -12425,6 +12625,9 @@ msgstr ""
msgid "Enable authenticated Git LFS request rate limit"
msgstr ""
+msgid "Enable authenticated web request rate limit"
+msgstr ""
+
msgid "Enable authentication"
msgstr ""
@@ -12485,7 +12688,7 @@ msgstr ""
msgid "Enable or disable the Pseudonymizer data collection."
msgstr ""
-msgid "Enable or disable version check and service ping."
+msgid "Enable or disable version check and Service Ping."
msgstr ""
msgid "Enable protected paths rate limit"
@@ -12497,18 +12700,12 @@ msgstr ""
msgid "Enable reCAPTCHA"
msgstr ""
-msgid "Enable reCAPTCHA for login"
-msgstr ""
-
-msgid "Enable reCAPTCHA, Invisible Captcha, Akismet and set IP limits. For reCAPTCHA, we currently only support %{recaptcha_v2_link_start}v2%{recaptcha_v2_link_end}"
+msgid "Enable reCAPTCHA for login."
msgstr ""
msgid "Enable repository checks"
msgstr ""
-msgid "Enable service ping"
-msgstr ""
-
msgid "Enable shared runners for all projects and subgroups in this group."
msgstr ""
@@ -12530,7 +12727,10 @@ msgstr ""
msgid "Enable unauthenticated API request rate limit"
msgstr ""
-msgid "Enable unauthenticated request rate limit"
+msgid "Enable unauthenticated web request rate limit"
+msgstr ""
+
+msgid "Enable user deactivation emails"
msgstr ""
msgid "Enable version check"
@@ -12566,9 +12766,6 @@ msgstr ""
msgid "Enabled sources for code import during project creation. OmniAuth must be configured for GitHub"
msgstr ""
-msgid "Enabling this will only make licensed EE features available to projects if the project namespace's plan includes the feature or if the project is public."
-msgstr ""
-
msgid "Encountered an error while rendering: %{err}"
msgstr ""
@@ -12617,9 +12814,6 @@ msgstr ""
msgid "Enter Admin Mode"
msgstr ""
-msgid "Enter IP address range"
-msgstr ""
-
msgid "Enter a number"
msgstr ""
@@ -12632,9 +12826,6 @@ msgstr ""
msgid "Enter at least three characters to search"
msgstr ""
-msgid "Enter domain"
-msgstr ""
-
msgid "Enter in your Bitbucket Server URL and personal access token below"
msgstr ""
@@ -12821,9 +13012,6 @@ msgstr ""
msgid "Environments|Deployment %{status}"
msgstr ""
-msgid "Environments|Dismiss"
-msgstr ""
-
msgid "Environments|Enable review app"
msgstr ""
@@ -12836,9 +13024,6 @@ msgstr ""
msgid "Environments|Environments are places where code gets deployed, such as staging or production."
msgstr ""
-msgid "Environments|Help us improve environments"
-msgstr ""
-
msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
msgstr ""
@@ -12875,6 +13060,9 @@ msgstr ""
msgid "Environments|Note that this action will stop the environment, but it will %{emphasisStart}not%{emphasisEnd} have an effect on any existing deployment due to no “stop environment action†being defined in the %{ciConfigLinkStart}.gitlab-ci.yml%{ciConfigLinkEnd} file."
msgstr ""
+msgid "Environments|Open"
+msgstr ""
+
msgid "Environments|Open live environment"
msgstr ""
@@ -12914,9 +13102,6 @@ msgstr ""
msgid "Environments|Stopping %{environmentName}"
msgstr ""
-msgid "Environments|Take the survey"
-msgstr ""
-
msgid "Environments|There was an error fetching the logs. Please try again."
msgstr ""
@@ -12938,9 +13123,6 @@ msgstr ""
msgid "Environments|You don't have any environments right now"
msgstr ""
-msgid "Environments|Your feedback helps GitLab make environments better for you and other users. Participate and enter a sweepstake to win a USD 30 gift card."
-msgstr ""
-
msgid "Environments|by %{avatar}"
msgstr ""
@@ -13223,7 +13405,7 @@ msgstr ""
msgid "Error parsing CSV file. Please make sure it has"
msgstr ""
-msgid "Error rendering markdown preview"
+msgid "Error rendering Markdown preview"
msgstr ""
msgid "Error saving label update."
@@ -13271,6 +13453,9 @@ msgstr ""
msgid "Error: %{error_message}"
msgstr ""
+msgid "Error: Couldn't load some or all of the changes."
+msgstr ""
+
msgid "Error: No AWS credentials were supplied"
msgstr ""
@@ -13304,6 +13489,9 @@ msgstr ""
msgid "ErrorTracking|Enable error tracking"
msgstr ""
+msgid "ErrorTracking|Error tracking backend"
+msgstr ""
+
msgid "ErrorTracking|If you self-host Sentry, enter your Sentry instance's full URL. If you use Sentry's hosted solution, enter https://sentry.io"
msgstr ""
@@ -13337,6 +13525,12 @@ msgstr ""
msgid "Escalation policies must have at least one rule"
msgstr ""
+msgid "EscalationPolicies|%{clockIcon} IF alert is not %{alertStatus} in %{minutes}"
+msgstr ""
+
+msgid "EscalationPolicies|%{notificationIcon} THEN %{doAction} %{forScheduleOrUser}"
+msgstr ""
+
msgid "EscalationPolicies|+ Add an additional rule"
msgstr ""
@@ -13379,13 +13573,13 @@ msgstr ""
msgid "EscalationPolicies|Escalation policies"
msgstr ""
-msgid "EscalationPolicies|Escalation rules"
+msgid "EscalationPolicies|Escalation policy %{obstacle} in Project %{project}"
msgstr ""
-msgid "EscalationPolicies|Failed to load oncall-schedules"
+msgid "EscalationPolicies|Escalation rules"
msgstr ""
-msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} %{then} THEN %{doAction} %{scheduleOrUser}"
+msgid "EscalationPolicies|Failed to load oncall-schedules"
msgstr ""
msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} minutes"
@@ -13463,18 +13657,36 @@ msgstr ""
msgid "Every %{action} attempt has failed: %{job_error_message}. Please try again."
msgstr ""
+msgid "Every 3 months"
+msgstr ""
+
+msgid "Every 3 months on the %{day} at %{time} %{timezone}"
+msgstr ""
+
+msgid "Every 6 months"
+msgstr ""
+
+msgid "Every 6 months on the %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Every day"
msgstr ""
msgid "Every day (at %{time})"
msgstr ""
+msgid "Every day at %{time} %{timezone}"
+msgstr ""
+
msgid "Every month"
msgstr ""
msgid "Every month (Day %{day} at %{time})"
msgstr ""
+msgid "Every month on the %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Every three months"
msgstr ""
@@ -13489,6 +13701,15 @@ msgstr[1] ""
msgid "Every week (%{weekday} at %{time})"
msgstr ""
+msgid "Every week on %{day} at %{time} %{timezone}"
+msgstr ""
+
+msgid "Every year"
+msgstr ""
+
+msgid "Every year on %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Everyone"
msgstr ""
@@ -13525,9 +13746,6 @@ msgstr ""
msgid "Exactly one of %{attributes} is required"
msgstr ""
-msgid "Example: %{ip_address}. %{read_more_link}."
-msgstr ""
-
msgid "Example: @sub\\.company\\.com$"
msgstr ""
@@ -13594,13 +13812,13 @@ msgstr ""
msgid "Expand pipeline"
msgstr ""
-msgid "Expand sidebar"
+msgid "Expand settings section"
msgstr ""
-msgid "Expected documents: %{expected_documents}"
+msgid "Expand sidebar"
msgstr ""
-msgid "Experienced"
+msgid "Expected documents: %{expected_documents}"
msgstr ""
msgid "ExperimentSubject|Must have exactly one of User, Namespace, or Project."
@@ -13885,9 +14103,6 @@ msgstr ""
msgid "Failed to load related branches"
msgstr ""
-msgid "Failed to load sidebar lock status"
-msgstr ""
-
msgid "Failed to load stacktrace."
msgstr ""
@@ -14312,6 +14527,9 @@ msgstr ""
msgid "Files"
msgstr ""
+msgid "Files API Rate Limits"
+msgstr ""
+
msgid "Files breadcrumb"
msgstr ""
@@ -15311,6 +15529,9 @@ msgstr ""
msgid "GitLab group: %{source_link}"
msgstr ""
+msgid "GitLab informs you if a new version is available."
+msgstr ""
+
msgid "GitLab is a complete DevOps platform, delivered as a single application, fundamentally changing the way Development, Security, and Ops teams collaborate"
msgstr ""
@@ -15326,7 +15547,7 @@ msgstr ""
msgid "GitLab is open source software to collaborate on code."
msgstr ""
-msgid "GitLab is undergoing maintenance and is operating in a read-only mode."
+msgid "GitLab is undergoing maintenance and is operating in read-only mode."
msgstr ""
msgid "GitLab member or Email address"
@@ -15338,9 +15559,6 @@ msgstr ""
msgid "GitLab project export"
msgstr ""
-msgid "GitLab restart is required to apply changes."
-msgstr ""
-
msgid "GitLab single sign-on URL"
msgstr ""
@@ -15356,9 +15574,6 @@ msgstr ""
msgid "GitLab version"
msgstr ""
-msgid "GitLab will inform you if a new version is available."
-msgstr ""
-
msgid "GitLab will run a background job that will produce pseudonymized CSVs of the GitLab database that will be uploaded to your configured object storage directory."
msgstr ""
@@ -15623,9 +15838,21 @@ msgstr ""
msgid "Go to snippets"
msgstr ""
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check 'Allowed domains for sign-ups'."
+msgstr ""
+
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check 'Email restrictions for sign-ups'."
+msgstr ""
+
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check the 'Domain denylist'."
+msgstr ""
+
msgid "Go to the activity feed"
msgstr ""
+msgid "Go to the group’s 'Settings &gt; General' page, and check 'Restrict membership by email domain'."
+msgstr ""
+
msgid "Go to the milestone list"
msgstr ""
@@ -15662,6 +15889,12 @@ msgstr ""
msgid "Goal of the changes and what reviewers should be aware of"
msgstr ""
+msgid "Google Cloud"
+msgstr ""
+
+msgid "Google Cloud offers several deployment targets. Select the one most suitable for your project."
+msgstr ""
+
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
@@ -15746,9 +15979,6 @@ msgstr ""
msgid "Group ID"
msgstr ""
-msgid "Group ID: %{group_id}"
-msgstr ""
-
msgid "Group Owner must have signed in with SAML before enabling Group Managed Accounts"
msgstr ""
@@ -15923,6 +16153,12 @@ msgstr ""
msgid "GroupImport|Unable to process group import file"
msgstr ""
+msgid "GroupPage|Copy group ID"
+msgstr ""
+
+msgid "GroupPage|Group ID: %{group_id}"
+msgstr ""
+
msgid "GroupRoadmap|%{dateWord} – No end date"
msgstr ""
@@ -15977,6 +16213,9 @@ msgstr ""
msgid "GroupRoadmap|Within 3 years"
msgstr ""
+msgid "GroupSAML|\"persistent\" recommended"
+msgstr ""
+
msgid "GroupSAML|%{strongOpen}Warning%{strongClose} - Enabling %{linkStart}SSO enforcement%{linkEnd} can reduce security risks."
msgstr ""
@@ -16109,6 +16348,9 @@ msgstr ""
msgid "GroupSAML|To be able to prohibit outer forks, you first need to enforce dedicate group managed accounts."
msgstr ""
+msgid "GroupSAML|Use SAML group links to manage group membership using SAML."
+msgstr ""
+
msgid "GroupSAML|Valid SAML Response"
msgstr ""
@@ -16121,13 +16363,10 @@ msgstr ""
msgid "GroupSAML|as %{access_level}"
msgstr ""
-msgid "GroupSAML|must match stored NameID of \"%{extern_uid}\" as we use this to identify users. If the NameID changes users will be unable to sign in."
-msgstr ""
-
-msgid "GroupSAML|should be \"persistent\""
+msgid "GroupSAML|must match stored NameID of \"%{extern_uid}\" to identify user and allow sign in"
msgstr ""
-msgid "GroupSAML|should be a random persistent ID, emails are discouraged"
+msgid "GroupSAML|recommend persistent ID instead of email"
msgstr ""
msgid "GroupSelect|No matching results"
@@ -16142,9 +16381,15 @@ msgstr ""
msgid "GroupSettings|Allow project access token creation"
msgstr ""
+msgid "GroupSettings|Applied to all subgroups unless overridden by a group owner. Groups already added to the project lose access."
+msgstr ""
+
msgid "GroupSettings|Auto DevOps pipeline was updated for the group"
msgstr ""
+msgid "GroupSettings|Available only on the top-level group. Applies to all subgroups. Groups already shared with a group outside %{group} are still shared unless removed manually."
+msgstr ""
+
msgid "GroupSettings|Badges"
msgstr ""
@@ -16196,6 +16441,9 @@ msgstr ""
msgid "GroupSettings|New runners registration token has been generated!"
msgstr ""
+msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgstr ""
+
msgid "GroupSettings|Pipeline settings was updated for the group"
msgstr ""
@@ -16208,12 +16456,15 @@ msgstr ""
msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
-msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups."
+msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups"
msgstr ""
msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
msgstr ""
+msgid "GroupSettings|Prevents group members from being notified if the group is mentioned."
+msgstr ""
+
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
msgstr ""
@@ -16250,21 +16501,6 @@ msgstr ""
msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}."
msgstr ""
-msgid "GroupSettings|This setting is only available on the top-level group and it applies to all subgroups. Groups that have already been shared with a group outside %{group} will still be shared, and this access will have to be revoked manually."
-msgstr ""
-
-msgid "GroupSettings|This setting will be applied to all subgroups unless overridden by a group owner. Groups that already have access to the project will continue to have access unless removed manually."
-msgstr ""
-
-msgid "GroupSettings|This setting will override user notification preferences for all members of the group, subgroups, and projects."
-msgstr ""
-
-msgid "GroupSettings|This setting will prevent group members from being notified if the group is mentioned."
-msgstr ""
-
-msgid "GroupSettings|This setting will prevent group members from forking projects outside of the group."
-msgstr ""
-
msgid "GroupSettings|Transfer group"
msgstr ""
@@ -16382,7 +16618,7 @@ msgstr ""
msgid "GroupsNew|No import options available"
msgstr ""
-msgid "GroupsNew|Not all related objects are migrated, as %{docs_link_start}described here%{docs_link_end}. Please %{feedback_link_start}leave feedback%{feedback_link_end} on this feature."
+msgid "GroupsNew|Not all related objects are migrated. %{docs_link_start}More info%{docs_link_end}."
msgstr ""
msgid "GroupsNew|Personal access token"
@@ -16514,15 +16750,27 @@ msgstr ""
msgid "Hello %{name},"
msgstr ""
-msgid "Hello there"
-msgstr ""
-
msgid "Hello, %{name}!"
msgstr ""
msgid "Hello, %{username}!"
msgstr ""
+msgid "HelloMessage|%{handshake_emoji} Contribute to GitLab: %{contribute_link}"
+msgstr ""
+
+msgid "HelloMessage|%{magnifier_emoji} Create a new GitLab issue: %{new_issue_link}"
+msgstr ""
+
+msgid "HelloMessage|%{rocket_emoji} We like your curiosity! Help us improve GitLab by joining the team: %{jobs_page_link}"
+msgstr ""
+
+msgid "HelloMessage|Does this page need fixes or improvements? Open an issue or contribute a merge request to help make GitLab more lovable. At GitLab, everyone can contribute!"
+msgstr ""
+
+msgid "HelloMessage|Welcome to GitLab!"
+msgstr ""
+
msgid "Help"
msgstr ""
@@ -16532,13 +16780,10 @@ msgstr ""
msgid "Helps prevent bots from creating accounts."
msgstr ""
-msgid "Helps prevent bots from creating issues"
-msgstr ""
-
-msgid "Helps prevent malicious users hide their activity"
+msgid "Helps prevent bots from creating issues."
msgstr ""
-msgid "Helps reduce request volume (e.g. from crawlers or abusive bots)"
+msgid "Helps prevent malicious users hide their activity."
msgstr ""
msgid "Helps reduce request volume (for example, from crawlers or abusive bots)"
@@ -16662,6 +16907,12 @@ msgstr ""
msgid "Housekeeping, export, path, transfer, remove, archive."
msgstr ""
+msgid "How do I configure Akismet?"
+msgstr ""
+
+msgid "How do I configure it?"
+msgstr ""
+
msgid "How do I configure runners?"
msgstr ""
@@ -16683,19 +16934,25 @@ msgstr ""
msgid "How do I set up this service?"
msgstr ""
+msgid "How do I use a web terminal?"
+msgstr ""
+
+msgid "How do I use file templates?"
+msgstr ""
+
msgid "How it works"
msgstr ""
msgid "How many days need to pass between marking entity for deletion and actual removing it."
msgstr ""
-msgid "How many seconds an IP will be counted towards the limit"
+msgid "How many seconds an IP counts toward the IP address limit."
msgstr ""
-msgid "I accept the %{terms_link}"
+msgid "How the job limiter handles jobs exceeding the thresholds specified below. The 'track' mode only logs the jobs. The 'compress' mode compresses the jobs and raises an exception if the compressed size exceeds the limit."
msgstr ""
-msgid "I accept the|Terms of Service and Privacy Policy"
+msgid "I accept the %{terms_link}"
msgstr ""
msgid "I forgot my password"
@@ -16779,13 +17036,16 @@ msgstr ""
msgid "IP Address"
msgstr ""
-msgid "IP expiration time"
+msgid "IP address expiration time"
msgstr ""
-msgid "IP subnet restriction only allowed for top-level groups"
+msgid "IP address restrictions"
+msgstr ""
+
+msgid "IP addresses per user"
msgstr ""
-msgid "IPs per user"
+msgid "IP subnet restriction only allowed for top-level groups"
msgstr ""
msgid "Identifier"
@@ -16800,6 +17060,9 @@ msgstr ""
msgid "If any indexed field exceeds this limit it will be truncated to this number of characters and the rest will not be indexed or searchable. This does not apply to repository and wiki indexing. Setting this to 0 means it is unlimited."
msgstr ""
+msgid "If blank, defaults to %{code_open}Retry later%{code_close}."
+msgstr ""
+
msgid "If blank, set allowable lifetime to %{instance_level_policy_in_words}, as defined by the instance admin. Once set, existing tokens for users in this group may be revoked."
msgstr ""
@@ -16851,6 +17114,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 did not initiate these sign-in attempts, please reach out to your administrator or enable two-factor authentication (2FA) on your account."
+msgstr ""
+
msgid "If you did not initiate this change, please contact your administrator immediately."
msgstr ""
@@ -16942,10 +17208,10 @@ msgstr ""
msgid "Import Projects from Gitea"
msgstr ""
-msgid "Import a project"
+msgid "Import an exported GitLab project"
msgstr ""
-msgid "Import an exported GitLab project"
+msgid "Import and export rate limits"
msgstr ""
msgid "Import failed due to a GitHub error: %{original}"
@@ -16957,12 +17223,18 @@ msgstr ""
msgid "Import from Jira"
msgstr ""
+msgid "Import group"
+msgstr ""
+
msgid "Import group from file"
msgstr ""
msgid "Import groups"
msgstr ""
+msgid "Import history"
+msgstr ""
+
msgid "Import in progress"
msgstr ""
@@ -17026,7 +17298,25 @@ msgstr ""
msgid "Import timed out. Import took longer than %{import_jobs_expiration} seconds"
msgstr ""
-msgid "Import/Export Rate Limits"
+msgid "ImportAProjectModal|Import from a project"
+msgstr ""
+
+msgid "ImportAProjectModal|Import members from another project"
+msgstr ""
+
+msgid "ImportAProjectModal|Import project members"
+msgstr ""
+
+msgid "ImportAProjectModal|Only project members (not group members) are imported, and they get the same permissions as the project you import from."
+msgstr ""
+
+msgid "ImportAProjectModal|Successfully imported"
+msgstr ""
+
+msgid "ImportAProjectModal|Unable to import project members"
+msgstr ""
+
+msgid "ImportAProjectModal|You're importing members to the %{strongStart}%{name}%{strongEnd} project."
msgstr ""
msgid "ImportButtons|Connect repositories from"
@@ -17079,7 +17369,7 @@ msgstr[1] ""
msgid "Importing..."
msgstr ""
-msgid "Import|A repository URL usually ends in a .git suffix, although this is not required. Double check to make sure your repository URL is correct."
+msgid "Import|There is not a valid Git repository at this URL. If your HTTP repository is not publicly accessible, verify your credentials."
msgstr ""
msgid "Improve customer support with Service Desk"
@@ -17088,9 +17378,6 @@ msgstr ""
msgid "Improves Git cloning performance."
msgstr ""
-msgid "In %{time_to_now}"
-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 ""
@@ -17376,7 +17663,7 @@ msgstr ""
msgid "InProductMarketing|Start a GitLab Ultimate trial today in less than one minute, no credit card required."
msgstr ""
-msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no CC required"
+msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no credit card required"
msgstr ""
msgid "InProductMarketing|Start a trial"
@@ -17415,7 +17702,7 @@ msgstr ""
msgid "InProductMarketing|Team up in GitLab for greater efficiency"
msgstr ""
-msgid "InProductMarketing|Team work makes the dream work"
+msgid "InProductMarketing|Team work makes the dream work"
msgstr ""
msgid "InProductMarketing|Test, create, deploy"
@@ -17996,6 +18283,9 @@ msgstr ""
msgid "Integrations|Create new issue in Jira"
msgstr ""
+msgid "Integrations|Create new issue in ZenTao"
+msgstr ""
+
msgid "Integrations|Default settings are inherited from the group level."
msgstr ""
@@ -18089,9 +18379,15 @@ msgstr ""
msgid "Integrations|Search Jira issues"
msgstr ""
+msgid "Integrations|Search ZenTao issues"
+msgstr ""
+
msgid "Integrations|Send notifications about project events to Unify Circuit."
msgstr ""
+msgid "Integrations|Send notifications about project events to a Unify Circuit conversation. %{docs_link}"
+msgstr ""
+
msgid "Integrations|Sign in to add namespaces"
msgstr ""
@@ -18131,6 +18427,9 @@ msgstr ""
msgid "Integrations|You've activated every integration 🎉"
msgstr ""
+msgid "Integrations|ZenTao issues display here when you create issues in your project in ZenTao."
+msgstr ""
+
msgid "Interactive mode"
msgstr ""
@@ -18158,9 +18457,6 @@ msgstr ""
msgid "Interval Pattern"
msgstr ""
-msgid "Introducing Value Stream Analytics"
-msgstr ""
-
msgid "Introducing Your DevOps Report"
msgstr ""
@@ -18257,6 +18553,12 @@ msgstr ""
msgid "Investigate vulnerability: %{title}"
msgstr ""
+msgid "Invisible Captcha"
+msgstr ""
+
+msgid "Invisible Captcha helps prevent the creation of spam accounts. It adds a honeypot field and time-sensitive form submission to the account signup form."
+msgstr ""
+
msgid "Invitation"
msgstr ""
@@ -18710,12 +19012,18 @@ msgstr ""
msgid "Issues"
msgstr ""
+msgid "Issues I've created"
+msgstr ""
+
msgid "Issues Rate Limits"
msgstr ""
msgid "Issues and merge requests"
msgstr ""
+msgid "Issues assigned to me"
+msgstr ""
+
msgid "Issues can be bugs, tasks or ideas to be discussed. Also, issues are searchable and filterable."
msgstr ""
@@ -18827,7 +19135,7 @@ msgstr ""
msgid "Iterations|Create cadence"
msgstr ""
-msgid "Iterations|Create your first iteration"
+msgid "Iterations|Create iteration"
msgstr ""
msgid "Iterations|Delete cadence"
@@ -18836,6 +19144,9 @@ msgstr ""
msgid "Iterations|Delete iteration cadence?"
msgstr ""
+msgid "Iterations|Delete iteration?"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -18869,12 +19180,18 @@ msgstr ""
msgid "Iterations|New iteration cadence"
msgstr ""
+msgid "Iterations|No closed iterations."
+msgstr ""
+
msgid "Iterations|No iteration cadences to show."
msgstr ""
msgid "Iterations|No iterations in cadence."
msgstr ""
+msgid "Iterations|No open iterations."
+msgstr ""
+
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
@@ -18905,6 +19222,9 @@ msgstr ""
msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
msgstr ""
+msgid "Iterations|This will remove the iteration from any issues that are assigned to it."
+msgstr ""
+
msgid "Iterations|Title"
msgstr ""
@@ -18920,15 +19240,9 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "I’m familiar with the basics of DevOps."
-msgstr ""
-
msgid "I’m joining my team who’s already on GitLab"
msgstr ""
-msgid "I’m not familiar with the basics of DevOps."
-msgstr ""
-
msgid "Jaeger URL"
msgstr ""
@@ -19193,6 +19507,9 @@ msgstr ""
msgid "Job"
msgstr ""
+msgid "Job %{jobName}"
+msgstr ""
+
msgid "Job Failed #%{build_id}"
msgstr ""
@@ -19783,9 +20100,6 @@ msgstr ""
msgid "Learn more in the"
msgstr ""
-msgid "Learn more in the|pipeline schedules documentation"
-msgstr ""
-
msgid "Learn more."
msgstr ""
@@ -19897,9 +20211,6 @@ msgstr ""
msgid "Leave Admin Mode"
msgstr ""
-msgid "Leave blank for no limit. Once set, existing personal access tokens may be revoked."
-msgstr ""
-
msgid "Leave edit mode? All unsaved changes will be lost."
msgstr ""
@@ -19945,10 +20256,10 @@ msgstr ""
msgid "LicenseCompliance|Acceptable license to be used in the project"
msgstr ""
-msgid "LicenseCompliance|Add a license"
+msgid "LicenseCompliance|Add license and related policy"
msgstr ""
-msgid "LicenseCompliance|Add license and related policy"
+msgid "LicenseCompliance|Add license policy"
msgstr ""
msgid "LicenseCompliance|Allow"
@@ -20038,6 +20349,9 @@ msgstr ""
msgid "LicenseManagement|Uncategorized"
msgstr ""
+msgid "Licensed Enterprise Edition features can be used if the project namespace's plan includes the feature, or if the project is public."
+msgstr ""
+
msgid "Licensed Features"
msgstr ""
@@ -20104,7 +20418,10 @@ msgstr ""
msgid "Limit namespaces and projects that can be indexed"
msgstr ""
-msgid "Limit sign in from multiple ips"
+msgid "Limit project size at a global, group, and project level. %{link_start}Learn more%{link_end}."
+msgstr ""
+
+msgid "Limit sign in from multiple IP addresses"
msgstr ""
msgid "Limit the number of concurrent operations this secondary site can run in the background."
@@ -20116,11 +20433,17 @@ msgstr ""
msgid "Limit the number of issues and epics per minute a user can create through web and API requests."
msgstr ""
+msgid "Limit the size of Sidekiq jobs stored in Redis."
+msgstr ""
+
msgid "Limited to showing %d event at most"
msgid_plural "Limited to showing %d events at most"
msgstr[0] ""
msgstr[1] ""
+msgid "Limiting mode"
+msgstr ""
+
msgid "Line changes"
msgstr ""
@@ -20190,9 +20513,6 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
-msgid "List of users to be excluded from the limit"
-msgstr ""
-
msgid "List options"
msgstr ""
@@ -20232,9 +20552,6 @@ msgstr ""
msgid "Loading functions timed out. Please reload the page to try again."
msgstr ""
-msgid "Loading issues"
-msgstr ""
-
msgid "Loading more"
msgstr ""
@@ -20526,6 +20843,9 @@ msgstr ""
msgid "Marked For Deletion At - %{deletion_time}"
msgstr ""
+msgid "Marked as ready. Merging is now allowed."
+msgstr ""
+
msgid "Marked this %{noun} as a draft."
msgstr ""
@@ -20598,52 +20918,22 @@ msgstr ""
msgid "Max 100,000 events"
msgstr ""
-msgid "Max 20 characters"
-msgstr ""
-
-msgid "Max Group Export Download requests per minute per user"
-msgstr ""
-
-msgid "Max Group Export requests per minute per user"
-msgstr ""
-
-msgid "Max Group Import requests per minute per user"
-msgstr ""
-
-msgid "Max Project Export Download requests per minute per user"
-msgstr ""
-
-msgid "Max Project Export requests per minute per user"
-msgstr ""
-
-msgid "Max Project Import requests per minute per user"
-msgstr ""
-
-msgid "Max authenticated API requests per period per user"
-msgstr ""
-
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
-msgid "Max authenticated web requests per period per user"
-msgstr ""
-
msgid "Max file size is 200 KB."
msgstr ""
-msgid "Max requests per minute per user"
-msgstr ""
-
msgid "Max role"
msgstr ""
msgid "Max session time"
msgstr ""
-msgid "Max unauthenticated requests per period per IP"
+msgid "MaxBuilds"
msgstr ""
-msgid "MaxBuilds"
+msgid "Maximum 20 characters"
msgstr ""
msgid "Maximum Conan package file size in bytes"
@@ -20679,6 +20969,12 @@ msgstr ""
msgid "Maximum attachment size (MB)"
msgstr ""
+msgid "Maximum authenticated API requests per rate limit period per user"
+msgstr ""
+
+msgid "Maximum authenticated web requests per rate limit period per user"
+msgstr ""
+
msgid "Maximum bulk request size (MiB)"
msgstr ""
@@ -20724,6 +21020,15 @@ msgstr ""
msgid "Maximum files in a diff"
msgstr ""
+msgid "Maximum group export download requests per minute"
+msgstr ""
+
+msgid "Maximum group export requests per minute"
+msgstr ""
+
+msgid "Maximum group import requests per minute"
+msgstr ""
+
msgid "Maximum import size"
msgstr ""
@@ -20760,7 +21065,7 @@ msgstr ""
msgid "Maximum number of projects."
msgstr ""
-msgid "Maximum number of unique IPs per user"
+msgid "Maximum number of unique IP addresses per user."
msgstr ""
msgid "Maximum page reached"
@@ -20769,12 +21074,24 @@ msgstr ""
msgid "Maximum page size"
msgstr ""
+msgid "Maximum project export download requests per minute"
+msgstr ""
+
+msgid "Maximum project export requests per minute"
+msgstr ""
+
+msgid "Maximum project import requests per minute"
+msgstr ""
+
msgid "Maximum push size"
msgstr ""
msgid "Maximum push size (MB)"
msgstr ""
+msgid "Maximum requests per minute"
+msgstr ""
+
msgid "Maximum running slices"
msgstr ""
@@ -20802,10 +21119,16 @@ msgstr ""
msgid "Maximum time between updates that a mirror can have when scheduled to synchronize."
msgstr ""
-msgid "Maximum time for web terminal websocket connection (in seconds). 0 for unlimited."
+msgid "Maximum time that users are allowed to skip the setup of two-factor authentication (in hours). Set to 0 (zero) to enforce at next sign in."
msgstr ""
-msgid "Maximum time that users are allowed to skip the setup of two-factor authentication (in hours). Set to 0 (zero) to enforce at next sign in."
+msgid "Maximum time, in seconds, for a web terminal websocket connection. 0 for unlimited."
+msgstr ""
+
+msgid "Maximum unauthenticated API requests per rate limit period per IP"
+msgstr ""
+
+msgid "Maximum unauthenticated web requests per rate limit period per IP"
msgstr ""
msgid "May"
@@ -20823,9 +21146,6 @@ msgstr ""
msgid "Medium vulnerabilities present"
msgstr ""
-msgid "Member lock"
-msgstr ""
-
msgid "Member since"
msgstr ""
@@ -20862,6 +21182,9 @@ msgstr ""
msgid "Members of a group may only view projects they have permission to access"
msgstr ""
+msgid "Membership"
+msgstr ""
+
msgid "Members|%{time} by %{user}"
msgstr ""
@@ -20922,9 +21245,6 @@ msgstr ""
msgid "Members|Expiration date updated successfully."
msgstr ""
-msgid "Members|Expired"
-msgstr ""
-
msgid "Members|Filter members"
msgstr ""
@@ -20940,9 +21260,6 @@ msgstr ""
msgid "Members|Membership"
msgstr ""
-msgid "Members|No expiration set"
-msgstr ""
-
msgid "Members|Remove \"%{groupName}\""
msgstr ""
@@ -20964,9 +21281,6 @@ msgstr ""
msgid "Members|Search invited"
msgstr ""
-msgid "Members|in %{time}"
-msgstr ""
-
msgid "Member|Deny access"
msgstr ""
@@ -21042,9 +21356,6 @@ msgstr ""
msgid "Merge request %{mr_link} was reviewed by %{mr_author}"
msgstr ""
-msgid "Merge request (MR) approvals"
-msgstr ""
-
msgid "Merge request analytics"
msgstr ""
@@ -21066,12 +21377,21 @@ msgstr ""
msgid "Merge requests"
msgstr ""
+msgid "Merge requests I've created"
+msgstr ""
+
msgid "Merge requests are a place to propose changes you've made to a project and discuss those changes with others"
msgstr ""
msgid "Merge requests are read-only in a secondary Geo node"
msgstr ""
+msgid "Merge requests assigned to me"
+msgstr ""
+
+msgid "Merge requests that I'm a reviewer"
+msgstr ""
+
msgid "Merge the branch and fix any conflicts that come up"
msgstr ""
@@ -21132,10 +21452,10 @@ msgstr ""
msgid "MergeRequests|An error occurred while saving the draft comment."
msgstr ""
-msgid "MergeRequests|Failed to squash. Should be done manually."
+msgid "MergeRequests|Create issue to resolve thread"
msgstr ""
-msgid "MergeRequests|Resolve this thread in a new issue"
+msgid "MergeRequests|Failed to squash. Should be done manually."
msgstr ""
msgid "MergeRequests|Saving the comment failed"
@@ -21949,6 +22269,9 @@ msgstr ""
msgid "MoveIssue|Cannot move issue to project it originates from!"
msgstr ""
+msgid "MoveIssue|Cannot move issues of '%{issue_type}' type."
+msgstr ""
+
msgid "Moved issue to %{label} column in the board."
msgstr ""
@@ -22074,6 +22397,15 @@ 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. To learn more about reducing storage capacity please visit our docs."
msgstr ""
+msgid "NamespaceUserCap|Pending users must be reviewed and approved by a group owner. Learn more about %{user_caps_link_start}User Caps%{link_end} and %{users_pending_approval_link_start}Users Pending Approval%{link_end}."
+msgstr ""
+
+msgid "NamespaceUserCap|View pending user approvals"
+msgstr ""
+
+msgid "NamespaceUserCap|Your group has reached its billable member limit"
+msgstr ""
+
msgid "Namespaces"
msgstr ""
@@ -22116,9 +22448,6 @@ msgstr ""
msgid "Network"
msgstr ""
-msgid "Network Policy|New rule"
-msgstr ""
-
msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is inbound from a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
msgstr ""
@@ -22140,16 +22469,13 @@ msgstr ""
msgid "NetworkPolicies|%{strongOpen}any%{strongClose} port"
msgstr ""
-msgid "NetworkPolicies|+ Add alert"
-msgstr ""
-
msgid "NetworkPolicies|.yaml"
msgstr ""
msgid "NetworkPolicies|.yaml mode"
msgstr ""
-msgid "NetworkPolicies|Actions"
+msgid "NetworkPolicies|Add alert"
msgstr ""
msgid "NetworkPolicies|Alerts are intended to be selectively used for a limited number of events that are potentially concerning and warrant a manual review. Alerts should not be used as a substitute for a SIEM or a logging tool. High volume alerts are likely to be dropped so as to preserve the stability of GitLab's integration with Kubernetes."
@@ -22185,9 +22511,6 @@ msgstr ""
msgid "NetworkPolicies|Deny all traffic"
msgstr ""
-msgid "NetworkPolicies|Description"
-msgstr ""
-
msgid "NetworkPolicies|Edit policy"
msgstr ""
@@ -22200,9 +22523,6 @@ msgstr ""
msgid "NetworkPolicies|IP/subnet"
msgstr ""
-msgid "NetworkPolicies|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
-msgstr ""
-
msgid "NetworkPolicies|Invalid or empty policy"
msgstr ""
@@ -22212,19 +22532,16 @@ msgstr ""
msgid "NetworkPolicies|Kubernetes error: %{error}"
msgstr ""
-msgid "NetworkPolicies|Name"
-msgstr ""
-
msgid "NetworkPolicies|Network"
msgstr ""
-msgid "NetworkPolicies|Network traffic"
+msgid "NetworkPolicies|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
msgstr ""
-msgid "NetworkPolicies|New policy"
+msgid "NetworkPolicies|Network policy can be created after the environment is loaded successfully."
msgstr ""
-msgid "NetworkPolicies|No policies detected"
+msgid "NetworkPolicies|Network traffic"
msgstr ""
msgid "NetworkPolicies|None selected"
@@ -22233,21 +22550,12 @@ msgstr ""
msgid "NetworkPolicies|Please %{installLinkStart}install%{installLinkEnd} and %{configureLinkStart}configure a Kubernetes Agent for this project%{configureLinkEnd} to enable alerts."
msgstr ""
-msgid "NetworkPolicies|Policies are a specification of how groups of pods are allowed to communicate with each other's network endpoints."
-msgstr ""
-
msgid "NetworkPolicies|Policy %{policyName} was successfully changed"
msgstr ""
msgid "NetworkPolicies|Policy definition"
msgstr ""
-msgid "NetworkPolicies|Policy editor"
-msgstr ""
-
-msgid "NetworkPolicies|Policy preview"
-msgstr ""
-
msgid "NetworkPolicies|Rule"
msgstr ""
@@ -22257,9 +22565,6 @@ msgstr ""
msgid "NetworkPolicies|Rule mode is unavailable for this policy. In some cases, we cannot parse the YAML file back into the rules editor."
msgstr ""
-msgid "NetworkPolicies|Rules"
-msgstr ""
-
msgid "NetworkPolicies|Save changes"
msgstr ""
@@ -22272,9 +22577,6 @@ msgstr ""
msgid "NetworkPolicies|Traffic that does not match any rule will be blocked."
msgstr ""
-msgid "NetworkPolicies|Unable to parse policy"
-msgstr ""
-
msgid "NetworkPolicies|all DNS names"
msgstr ""
@@ -22454,6 +22756,9 @@ msgstr ""
msgid "New issue"
msgstr ""
+msgid "New issue in %{project}"
+msgstr ""
+
msgid "New issue title"
msgstr ""
@@ -22532,7 +22837,7 @@ msgstr ""
msgid "Newest first"
msgstr ""
-msgid "Newly registered users will by default be external"
+msgid "Newly-registered users are external by default"
msgstr ""
msgid "Next"
@@ -22847,8 +23152,10 @@ msgstr ""
msgid "No webhooks found, add one in the form above."
msgstr ""
-msgid "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} to renew your subscription."
-msgstr ""
+msgid "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} day to renew your subscription."
+msgid_plural "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} days to renew your subscription."
+msgstr[0] ""
+msgstr[1] ""
msgid "No. of commits"
msgstr ""
@@ -22865,7 +23172,7 @@ msgstr ""
msgid "Nodes"
msgstr ""
-msgid "Non-admin users can sign in with read-only access and make read-only API requests."
+msgid "Non-admin users are restricted to read-only access, in both GitLab UI and API."
msgstr ""
msgid "None"
@@ -22946,7 +23253,7 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
-msgid "Notes Rate Limits"
+msgid "Notes rate limit"
msgstr ""
msgid "Notes|Are you sure you want to cancel creating this comment?"
@@ -23113,9 +23420,6 @@ msgstr ""
msgid "November"
msgstr ""
-msgid "Novice"
-msgstr ""
-
msgid "Now, personalize your GitLab experience"
msgstr ""
@@ -23284,7 +23588,7 @@ msgstr ""
msgid "OnCallSchedules|For this rotation, on-call will be:"
msgstr ""
-msgid "OnCallSchedules|On-call schedule %{schedule} in Project %{project}"
+msgid "OnCallSchedules|On-call schedule %{obstacle} in Project %{project}"
msgstr ""
msgid "OnCallSchedules|On-call schedules"
@@ -23431,22 +23735,22 @@ msgstr ""
msgid "OnDemandScans|Scanner profile"
msgstr ""
-msgid "OnDemandScans|Select one of the existing profiles"
+msgid "OnDemandScans|Schedule scan"
msgstr ""
-msgid "OnDemandScans|Site profile"
+msgid "OnDemandScans|Select one of the existing profiles"
msgstr ""
-msgid "OnDemandScans|Use existing scanner profile"
+msgid "OnDemandScans|Site profile"
msgstr ""
-msgid "OnDemandScans|Use existing site profile"
+msgid "OnDemandScans|Start time"
msgstr ""
-msgid "OnDemandScans|You can either choose a passive scan or validate the target site in your chosen site profile. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
+msgid "OnDemandScans|Use existing scanner profile"
msgstr ""
-msgid "OnDemandScans|You cannot run an active scan against an unvalidated site."
+msgid "OnDemandScans|Use existing site profile"
msgstr ""
msgid "OnDemandScans|You must create a repository within your project to run an on-demand scan."
@@ -23511,6 +23815,9 @@ msgstr ""
msgid "Only admins can delete project"
msgstr ""
+msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
+msgstr ""
+
msgid "Only include features new to your current subscription tier."
msgstr ""
@@ -23529,6 +23836,12 @@ msgstr ""
msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
+msgid "Only reCAPTCHA v2 is supported:"
+msgstr ""
+
+msgid "Only users from the specified IP address ranges are able to reach this group, including all subgroups, projects, and Git repositories."
+msgstr ""
+
msgid "Only verified users with an email address in any of these domains can be added to the group."
msgstr ""
@@ -23715,9 +24028,6 @@ msgstr ""
msgid "Package Registry"
msgstr ""
-msgid "Package Registry Rate Limits"
-msgstr ""
-
msgid "Package Registry: authenticated API requests"
msgstr ""
@@ -23736,6 +24046,9 @@ msgstr ""
msgid "Package recipe already exists"
msgstr ""
+msgid "Package registry rate limits"
+msgstr ""
+
msgid "Package type"
msgstr ""
@@ -23802,6 +24115,9 @@ msgstr ""
msgid "PackageRegistry|Composer"
msgstr ""
+msgid "PackageRegistry|Composer.json with license: %{license} and version: %{version}"
+msgstr ""
+
msgid "PackageRegistry|Conan"
msgstr ""
@@ -23865,6 +24181,9 @@ msgstr ""
msgid "PackageRegistry|Copy require package include"
msgstr ""
+msgid "PackageRegistry|Copy target SHA"
+msgstr ""
+
msgid "PackageRegistry|Copy yarn command"
msgstr ""
@@ -23931,6 +24250,9 @@ msgstr ""
msgid "PackageRegistry|Install package version"
msgstr ""
+msgid "PackageRegistry|Instance-level"
+msgstr ""
+
msgid "PackageRegistry|Invalid Package: failed metadata extraction"
msgstr ""
@@ -23976,6 +24298,9 @@ msgstr ""
msgid "PackageRegistry|Pip Command"
msgstr ""
+msgid "PackageRegistry|Project-level"
+msgstr ""
+
msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
msgstr ""
@@ -23997,6 +24322,9 @@ msgstr ""
msgid "PackageRegistry|Remove package"
msgstr ""
+msgid "PackageRegistry|Required Python: %{pythonVersion}"
+msgstr ""
+
msgid "PackageRegistry|RubyGems"
msgstr ""
@@ -24039,6 +24367,9 @@ msgstr ""
msgid "PackageRegistry|Source project located at %{link}"
msgstr ""
+msgid "PackageRegistry|Target SHA: %{sha}"
+msgstr ""
+
msgid "PackageRegistry|There are no other versions of this package."
msgstr ""
@@ -24207,6 +24538,18 @@ msgstr ""
msgid "Password was successfully updated. Please sign in again."
msgstr ""
+msgid "PasswordPrompt|Confirm password"
+msgstr ""
+
+msgid "PasswordPrompt|Confirm password to continue"
+msgstr ""
+
+msgid "PasswordPrompt|Password is required"
+msgstr ""
+
+msgid "PasswordPrompt|Please enter your password to confirm"
+msgstr ""
+
msgid "Passwords should be unique and not used for any other sites or services."
msgstr ""
@@ -24234,6 +24577,9 @@ msgstr ""
msgid "Paste project path (i.e. gitlab-org/gitlab)"
msgstr ""
+msgid "Paste this DSN into your Sentry SDK"
+msgstr ""
+
msgid "Paste your public SSH key, which is usually contained in the file '~/.ssh/id_ed25519.pub' or '~/.ssh/id_rsa.pub' and begins with 'ssh-ed25519' or 'ssh-rsa'. Do not paste your private SSH key, as that can compromise your identity."
msgstr ""
@@ -24318,6 +24664,9 @@ msgstr ""
msgid "PerformanceBar|First Contentful Paint"
msgstr ""
+msgid "PerformanceBar|Flamegraph with mode:"
+msgstr ""
+
msgid "PerformanceBar|Frontend resources"
msgstr ""
@@ -24351,6 +24700,15 @@ msgstr ""
msgid "PerformanceBar|Trace"
msgstr ""
+msgid "PerformanceBar|cpu"
+msgstr ""
+
+msgid "PerformanceBar|object"
+msgstr ""
+
+msgid "PerformanceBar|wall"
+msgstr ""
+
msgid "Period in seconds"
msgstr ""
@@ -24579,6 +24937,48 @@ msgstr ""
msgid "PipelineSchedules|Variables"
msgstr ""
+msgid "PipelineSource|API"
+msgstr ""
+
+msgid "PipelineSource|Chat"
+msgstr ""
+
+msgid "PipelineSource|External"
+msgstr ""
+
+msgid "PipelineSource|External Pull Request"
+msgstr ""
+
+msgid "PipelineSource|Merge Request"
+msgstr ""
+
+msgid "PipelineSource|On-Demand DAST Scan"
+msgstr ""
+
+msgid "PipelineSource|On-Demand DAST Validation"
+msgstr ""
+
+msgid "PipelineSource|Parent Pipeline"
+msgstr ""
+
+msgid "PipelineSource|Pipeline"
+msgstr ""
+
+msgid "PipelineSource|Push"
+msgstr ""
+
+msgid "PipelineSource|Schedule"
+msgstr ""
+
+msgid "PipelineSource|Trigger"
+msgstr ""
+
+msgid "PipelineSource|Web"
+msgstr ""
+
+msgid "PipelineSource|Web IDE"
+msgstr ""
+
msgid "PipelineStatusTooltip|Pipeline: %{ciStatus}"
msgstr ""
@@ -24879,46 +25279,7 @@ msgstr ""
msgid "Pipeline|Source"
msgstr ""
-msgid "Pipeline|Source|API"
-msgstr ""
-
-msgid "Pipeline|Source|Chat"
-msgstr ""
-
-msgid "Pipeline|Source|External"
-msgstr ""
-
-msgid "Pipeline|Source|External Pull Request"
-msgstr ""
-
-msgid "Pipeline|Source|Merge Request"
-msgstr ""
-
-msgid "Pipeline|Source|On-Demand DAST Scan"
-msgstr ""
-
-msgid "Pipeline|Source|On-Demand DAST Validation"
-msgstr ""
-
-msgid "Pipeline|Source|Parent Pipeline"
-msgstr ""
-
-msgid "Pipeline|Source|Pipeline"
-msgstr ""
-
-msgid "Pipeline|Source|Push"
-msgstr ""
-
-msgid "Pipeline|Source|Schedule"
-msgstr ""
-
-msgid "Pipeline|Source|Trigger"
-msgstr ""
-
-msgid "Pipeline|Source|Web"
-msgstr ""
-
-msgid "Pipeline|Source|Web IDE"
+msgid "Pipeline|Source|Security Policy"
msgstr ""
msgid "Pipeline|Specify variable values to be used in this run. The values specified in %{linkStart}CI/CD settings%{linkEnd} will be used by default."
@@ -24969,7 +25330,7 @@ msgstr ""
msgid "Pipeline|We are currently unable to fetch pipeline data"
msgstr ""
-msgid "Pipeline|You’re about to stop pipeline %{pipelineId}."
+msgid "Pipeline|You’re about to stop pipeline #%{pipelineId}."
msgstr ""
msgid "Pipeline|for"
@@ -24996,6 +25357,9 @@ msgstr ""
msgid "Plain diff"
msgstr ""
+msgid "Plain-text response to send to clients that hit a rate limit"
+msgstr ""
+
msgid "Plan:"
msgstr ""
@@ -25140,9 +25504,6 @@ msgstr ""
msgid "Please provide attributes to update"
msgstr ""
-msgid "Please provide your username or email address."
-msgstr ""
-
msgid "Please reach out if you have any questions and we'll be happy to assist."
msgstr ""
@@ -25185,9 +25546,6 @@ msgstr ""
msgid "Please set a new password before proceeding."
msgstr ""
-msgid "Please share your feedback about %{featureName} %{linkStart}in this issue%{linkEnd} to help us improve the experience."
-msgstr ""
-
msgid "Please solve the captcha"
msgstr ""
@@ -25365,6 +25723,9 @@ msgstr ""
msgid "Prevent adding new members to project membership within this group"
msgstr ""
+msgid "Prevent auto-stopping"
+msgstr ""
+
msgid "Prevent editing approval rules in projects and merge requests."
msgstr ""
@@ -25377,7 +25738,7 @@ msgstr ""
msgid "Prevent users from changing their profile name"
msgstr ""
-msgid "Prevent users from performing write operations on GitLab while performing maintenance."
+msgid "Prevent users from performing write operations while GitLab maintenance is in progress."
msgstr ""
msgid "Preview"
@@ -25650,6 +26011,9 @@ msgstr ""
msgid "Profiles|Enter your name, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Enter your password to confirm the email change"
+msgstr ""
+
msgid "Profiles|Enter your pronouns to let people know how to refer to you"
msgstr ""
@@ -25884,10 +26248,10 @@ msgstr ""
msgid "Profiles|e.g. My MacBook key"
msgstr ""
-msgid "Profiles|username"
+msgid "Profiles|https://website.com"
msgstr ""
-msgid "Profiles|website.com"
+msgid "Profiles|username"
msgstr ""
msgid "Profiles|your account"
@@ -26130,9 +26494,21 @@ msgstr ""
msgid "ProjectSelect| or group"
msgstr ""
+msgid "ProjectSelect|No matching results"
+msgstr ""
+
msgid "ProjectSelect|Search for project"
msgstr ""
+msgid "ProjectSelect|Search projects"
+msgstr ""
+
+msgid "ProjectSelect|Select a project"
+msgstr ""
+
+msgid "ProjectSelect|There was an error fetching the projects. Please try again."
+msgstr ""
+
msgid "ProjectService|Drone server URL"
msgstr ""
@@ -26220,6 +26596,9 @@ msgstr ""
msgid "ProjectService|Trigger event when a new, unique alert is recorded."
msgstr ""
+msgid "ProjectService|Trigger event when a new, unique vulnerability is recorded. (Note: This feature requires an Ultimate plan.)"
+msgstr ""
+
msgid "ProjectService|Trigger event when a pipeline status changes."
msgstr ""
@@ -26634,9 +27013,15 @@ msgstr ""
msgid "Projects are graded based on the highest severity vulnerability present"
msgstr ""
+msgid "Projects are organized into groups"
+msgstr ""
+
msgid "Projects contributed to"
msgstr ""
+msgid "Projects help you organize your work. They contain your file repository, issues, merge requests, and so much more."
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr ""
@@ -26871,10 +27256,10 @@ msgstr ""
msgid "PrometheusService|Prometheus cluster integration"
msgstr ""
-msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
+msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
msgstr ""
-msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
+msgid "PrometheusService|The ID of the IAP-secured resource."
msgstr ""
msgid "PrometheusService|The Prometheus API base URL."
@@ -27492,6 +27877,9 @@ msgstr ""
msgid "Rate limit"
msgstr ""
+msgid "Rate limits can help reduce request volume (like from crawlers or abusive bots)."
+msgstr ""
+
msgid "Raw blob request rate limit per minute"
msgstr ""
@@ -27504,6 +27892,9 @@ msgstr ""
msgid "Re-authentication required"
msgstr ""
+msgid "Re-import"
+msgstr ""
+
msgid "Re-request review"
msgstr ""
@@ -27525,6 +27916,9 @@ msgstr ""
msgid "Read more about related issues"
msgstr ""
+msgid "Read their documentation."
+msgstr ""
+
msgid "Ready to get started with GitLab? Follow these steps to set up your workspace, plan and commit changes, and deploy your project."
msgstr ""
@@ -27558,6 +27952,9 @@ msgstr ""
msgid "Receive any notifications from GitLab."
msgstr ""
+msgid "Receive notification of abuse reports by email."
+msgstr ""
+
msgid "Receive notifications about your own activity"
msgstr ""
@@ -27701,9 +28098,6 @@ msgstr ""
msgid "Registry setup"
msgstr ""
-msgid "Regulate approvals by authors/committers. Affects all projects."
-msgstr ""
-
msgid "Reindexing Status: %{status} (Slice multiplier: %{multiplier}, Maximum running slices: %{max_slices})"
msgstr ""
@@ -27799,6 +28193,9 @@ msgstr ""
msgid "Release|Something went wrong while saving the release details."
msgstr ""
+msgid "Reload page"
+msgstr ""
+
msgid "Remediations"
msgstr ""
@@ -28081,6 +28478,9 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
+msgid "Repeats"
+msgstr ""
+
msgid "Replace"
msgstr ""
@@ -28443,10 +28843,7 @@ msgstr ""
msgid "Require additional authentication for administrative tasks."
msgstr ""
-msgid "Require all users in this group to setup Two-factor authentication"
-msgstr ""
-
-msgid "Require all users in this group to setup two-factor authentication"
+msgid "Require all users in this group to set up two-factor authentication"
msgstr ""
msgid "Required approvals (%{approvals_given} given)"
@@ -28492,6 +28889,9 @@ msgstr[1] ""
msgid "Requires values to meet regular expression requirements."
msgstr ""
+msgid "Requires you to deploy or set up cloud-hosted Sentry."
+msgstr ""
+
msgid "Requires your primary GitLab email address."
msgstr ""
@@ -28552,9 +28952,6 @@ msgstr ""
msgid "Resolve"
msgstr ""
-msgid "Resolve all threads in new issue"
-msgstr ""
-
msgid "Resolve conflicts"
msgstr ""
@@ -28612,6 +29009,9 @@ msgstr ""
msgid "Response text"
msgstr ""
+msgid "Restart GitLab to apply changes."
+msgstr ""
+
msgid "Restart Terminal"
msgstr ""
@@ -28630,6 +29030,9 @@ msgstr ""
msgid "Restoring the project will prevent the project from being removed on this date and restore people's ability to make changes to it."
msgstr ""
+msgid "Restrict group access by IP address. %{link_start}Learn more%{link_end}."
+msgstr ""
+
msgid "Restrict membership by email domain"
msgstr ""
@@ -28943,6 +29346,9 @@ msgstr ""
msgid "Runners|Runner #%{runner_id}"
msgstr ""
+msgid "Runners|Runner assigned to project."
+msgstr ""
+
msgid "Runners|Runner is offline, last contact was %{runner_contact} ago"
msgstr ""
@@ -28955,6 +29361,9 @@ msgstr ""
msgid "Runners|Runner registration"
msgstr ""
+msgid "Runners|Runner unassigned from project."
+msgstr ""
+
msgid "Runners|Runners"
msgstr ""
@@ -29147,7 +29556,7 @@ msgstr ""
msgid "SastEntryPoints|How do I set up SAST?"
msgstr ""
-msgid "SastEntryPoints|Learn more."
+msgid "SastEntryPoints|Learn more"
msgstr ""
msgid "Satisfied"
@@ -29189,7 +29598,7 @@ msgstr ""
msgid "Save pipeline schedule"
msgstr ""
-msgid "Save space and find images in the container Registry. remove unneeded tags and keep only the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
+msgid "Save storage space by automatically deleting tags from the container registry and keeping the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
msgstr ""
msgid "Saving"
@@ -29363,6 +29772,9 @@ msgstr ""
msgid "Search or filter results…"
msgstr ""
+msgid "Search or jump to..."
+msgstr ""
+
msgid "Search project"
msgstr ""
@@ -29423,16 +29835,16 @@ msgstr ""
msgid "SearchCodeResults|of %{link_to_project}"
msgstr ""
-msgid "SearchResults|Showing %{count} %{scope} for%{term_element}"
+msgid "SearchResults|Showing %{count} %{scope} for %{term_element}"
msgstr ""
-msgid "SearchResults|Showing %{count} %{scope} for%{term_element} in your personal and project snippets"
+msgid "SearchResults|Showing %{count} %{scope} for %{term_element} in your personal and project snippets"
msgstr ""
-msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for%{term_element}"
+msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for %{term_element}"
msgstr ""
-msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for%{term_element} in your personal and project snippets"
+msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for %{term_element} in your personal and project snippets"
msgstr ""
msgid "SearchResults|code result"
@@ -29514,6 +29926,9 @@ msgstr ""
msgid "Secret Detection"
msgstr ""
+msgid "Secret access key"
+msgstr ""
+
msgid "Secret token"
msgstr ""
@@ -29553,9 +29968,6 @@ msgstr ""
msgid "SecurityApprovals|A merge request approval is required when the license compliance report contains a denied license."
msgstr ""
-msgid "SecurityApprovals|Configurable if security scanners are enabled. %{linkStart}Learn more.%{linkEnd}"
-msgstr ""
-
msgid "SecurityApprovals|Coverage-Check"
msgstr ""
@@ -29568,24 +29980,18 @@ msgstr ""
msgid "SecurityApprovals|Learn more about Vulnerability-Check"
msgstr ""
-msgid "SecurityApprovals|License Scanning must be enabled. %{linkStart}Learn more%{linkEnd}."
-msgstr ""
-
msgid "SecurityApprovals|License-Check"
msgstr ""
msgid "SecurityApprovals|Requires approval for Denied licenses. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}More information%{linkEnd}"
+msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "SecurityApprovals|Requires approval for vulnerabilities. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
-msgid "SecurityApprovals|Test coverage must be enabled. %{linkStart}Learn more%{linkEnd}."
-msgstr ""
-
msgid "SecurityApprovals|Vulnerability-Check"
msgstr ""
@@ -29649,6 +30055,12 @@ msgstr ""
msgid "SecurityConfiguration|Immediately begin risk analysis and remediation with application security features. Start with SAST and Secret Detection, available to all plans. Upgrade to Ultimate to get all features, including:"
msgstr ""
+msgid "SecurityConfiguration|Manage corpus"
+msgstr ""
+
+msgid "SecurityConfiguration|Manage corpus files used as mutation sources in coverage fuzzing."
+msgstr ""
+
msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
msgstr ""
@@ -29703,6 +30115,12 @@ msgstr ""
msgid "SecurityOrchestration|Action"
msgstr ""
+msgid "SecurityOrchestration|Actions"
+msgstr ""
+
+msgid "SecurityOrchestration|Add rule"
+msgstr ""
+
msgid "SecurityOrchestration|All policies"
msgstr ""
@@ -29736,9 +30154,6 @@ msgstr ""
msgid "SecurityOrchestration|Network"
msgstr ""
-msgid "SecurityOrchestration|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
-msgstr ""
-
msgid "SecurityOrchestration|New policy"
msgstr ""
@@ -29754,6 +30169,9 @@ msgstr ""
msgid "SecurityOrchestration|Policy editor"
msgstr ""
+msgid "SecurityOrchestration|Policy preview"
+msgstr ""
+
msgid "SecurityOrchestration|Policy status"
msgstr ""
@@ -29763,6 +30181,9 @@ msgstr ""
msgid "SecurityOrchestration|Rule"
msgstr ""
+msgid "SecurityOrchestration|Rules"
+msgstr ""
+
msgid "SecurityOrchestration|Scan Execution"
msgstr ""
@@ -29856,6 +30277,9 @@ msgstr ""
msgid "SecurityReports|Create issue"
msgstr ""
+msgid "SecurityReports|Development vulnerabilities"
+msgstr ""
+
msgid "SecurityReports|Dismiss vulnerability"
msgstr ""
@@ -29871,6 +30295,9 @@ msgstr ""
msgid "SecurityReports|Download results"
msgstr ""
+msgid "SecurityReports|Download scanned URLs"
+msgstr ""
+
msgid "SecurityReports|Download scanned resources"
msgstr ""
@@ -29994,6 +30421,9 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
+msgid "SecurityReports|The Vulnerability Report shows the results of the lastest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "SecurityReports|The security reports below contain one or more vulnerability findings that could not be parsed and were not recorded. Download the artifacts in the job output to investigate. Ensure any security report created conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
msgstr ""
@@ -30135,10 +30565,10 @@ msgstr ""
msgid "Select a repository"
msgstr ""
-msgid "Select a role"
+msgid "Select a repository containing templates for common files."
msgstr ""
-msgid "Select a shared template repository for all projects on this instance."
+msgid "Select a role"
msgstr ""
msgid "Select a template repository"
@@ -30216,6 +30646,9 @@ msgstr ""
msgid "Select project to choose zone"
msgstr ""
+msgid "Select project to create issue"
+msgstr ""
+
msgid "Select projects"
msgstr ""
@@ -30333,6 +30766,9 @@ msgstr ""
msgid "Send emails to help guide new users through the onboarding process."
msgstr ""
+msgid "Send emails to users upon account deactivation."
+msgstr ""
+
msgid "Send message"
msgstr ""
@@ -30351,6 +30787,9 @@ msgstr ""
msgid "Send service data"
msgstr ""
+msgid "Sentry"
+msgstr ""
+
msgid "Sentry API URL"
msgstr ""
@@ -30465,6 +30904,9 @@ msgstr ""
msgid "Service"
msgstr ""
+msgid "Service Accounts keys are required to authorize GitLab to deploy your Google Cloud project."
+msgstr ""
+
msgid "Service Desk"
msgstr ""
@@ -30537,15 +30979,15 @@ msgstr ""
msgid "Set a password on your account to pull or push via %{protocol}."
msgstr ""
-msgid "Set a template repository for projects in this group"
-msgstr ""
-
msgid "Set access permissions for this token."
msgstr ""
msgid "Set an instance-wide domain that will be available to all clusters when installing Knative."
msgstr ""
+msgid "Set any rate limit to %{code_open}0%{code_close} to disable the limit."
+msgstr ""
+
msgid "Set default and restrict visibility levels. Configure import sources and git access protocol."
msgstr ""
@@ -30558,7 +31000,7 @@ msgstr ""
msgid "Set limit to 0 to allow any file size."
msgstr ""
-msgid "Set max session time for web terminal."
+msgid "Set limits for web and API requests."
msgstr ""
msgid "Set milestone"
@@ -30567,15 +31009,18 @@ msgstr ""
msgid "Set new password"
msgstr ""
-msgid "Set notification email for abuse reports."
+msgid "Set parent epic to an epic"
msgstr ""
-msgid "Set parent epic to an epic"
+msgid "Set per-user rate limits for imports and exports of projects and groups."
msgstr ""
msgid "Set projects and maximum size limits, session duration, user options, and check feature availability for namespace plan."
msgstr ""
+msgid "Set rate limits for package registry API requests that supersede the general user and IP rate limits."
+msgstr ""
+
msgid "Set severity"
msgstr ""
@@ -30594,15 +31039,24 @@ msgstr ""
msgid "Set the default branch for this project. All merge requests and commits are made against this branch unless you specify a different one."
msgstr ""
+msgid "Set the default expiration time for job artifacts in all projects. Set to %{code_open}0%{code_close} to never expire artifacts by default. If no unit is written, it defaults to seconds. For example, these are all equivalent: %{code_open}3600%{code_close}, %{code_open}60 minutes%{code_close}, or %{code_open}one hour%{code_close}."
+msgstr ""
+
msgid "Set the due date to %{due_date}."
msgstr ""
msgid "Set the iteration to %{iteration_reference}."
msgstr ""
+msgid "Set the maximum session time for a web terminal."
+msgstr ""
+
msgid "Set the milestone to %{milestone_reference}."
msgstr ""
+msgid "Set the per-user rate limit for notes created by web or API requests."
+msgstr ""
+
msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
msgstr ""
@@ -30804,6 +31258,9 @@ msgstr ""
msgid "Show Pipeline IID"
msgstr ""
+msgid "Show all %{issuable_type}."
+msgstr ""
+
msgid "Show all activity"
msgstr ""
@@ -30855,15 +31312,9 @@ msgstr ""
msgid "Show list"
msgstr ""
-msgid "Show me advanced features"
-msgstr ""
-
msgid "Show me how to add a pipeline"
msgstr ""
-msgid "Show me the basics"
-msgstr ""
-
msgid "Show one file at a time"
msgstr ""
@@ -30904,15 +31355,15 @@ msgstr ""
msgid "Showing %{pageSize} of %{total} %{issuableType}"
msgstr ""
-msgid "Showing %{pageSize} of %{total} issues"
-msgstr ""
-
msgid "Showing all epics"
msgstr ""
msgid "Showing all issues"
msgstr ""
+msgid "Showing data for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
+msgstr ""
+
msgid "Showing data for workflow items created in this date range. Date range cannot exceed %{maxDateRange} days."
msgstr ""
@@ -30952,6 +31403,15 @@ msgstr ""
msgid "Sidebar|Weight"
msgstr ""
+msgid "Sidekiq job compression threshold (bytes)"
+msgstr ""
+
+msgid "Sidekiq job size limit (bytes)"
+msgstr ""
+
+msgid "Sidekiq job size limits"
+msgstr ""
+
msgid "Sign in"
msgstr ""
@@ -31072,6 +31532,9 @@ msgstr ""
msgid "Site profile not found for given parameters"
msgstr ""
+msgid "Sites"
+msgstr ""
+
msgid "Size"
msgstr ""
@@ -31102,19 +31565,22 @@ msgstr ""
msgid "SlackIntegration|Sends notifications about project events to Slack channels."
msgstr ""
-msgid "SlackService|2. Paste the %{strong_open}Token%{strong_close} into the field below"
+msgid "SlackService|1. %{slash_command_link_start}Add a slash command%{slash_command_link_end} in your Slack team using this information:"
msgstr ""
-msgid "SlackService|3. Select the %{strong_open}Active%{strong_close} checkbox, press %{strong_open}Save changes%{strong_close} and start using GitLab inside Slack!"
+msgid "SlackService|2. Paste the token from Slack in the %{strong_open}Token%{strong_close} field below."
msgstr ""
-msgid "SlackService|Fill in the word that works best for your team."
+msgid "SlackService|3. Select the %{strong_open}Active%{strong_close} checkbox, select %{strong_open}Save changes%{strong_close}, and start using slash commands in Slack!"
+msgstr ""
+
+msgid "SlackService|After setup, get a list of available Slack slash commands by entering"
msgstr ""
-msgid "SlackService|See list of available commands in Slack after setting up this service, by entering"
+msgid "SlackService|Fill in the word that works best for your team."
msgstr ""
-msgid "SlackService|This service allows users to perform common operations on this project by entering slash commands in Slack."
+msgid "SlackService|Perform common operations in this project by entering slash commands in Slack."
msgstr ""
msgid "Slice multiplier"
@@ -31180,7 +31646,7 @@ msgstr ""
msgid "Some child epics may be hidden due to applied filters"
msgstr ""
-msgid "Some common domains are not allowed. %{read_more_link}."
+msgid "Some common domains are not allowed. %{learn_more_link}."
msgstr ""
msgid "Some of the designs you tried uploading did not change:"
@@ -31264,9 +31730,6 @@ msgstr ""
msgid "Something went wrong while exporting requirements"
msgstr ""
-msgid "Something went wrong while fetching %{listType} list"
-msgstr ""
-
msgid "Something went wrong while fetching branches"
msgstr ""
@@ -31321,15 +31784,9 @@ msgstr ""
msgid "Something went wrong while merging this merge request. Please try again."
msgstr ""
-msgid "Something went wrong while moving issues."
-msgstr ""
-
msgid "Something went wrong while obtaining the Let's Encrypt certificate."
msgstr ""
-msgid "Something went wrong while performing the action."
-msgstr ""
-
msgid "Something went wrong while promoting the issue to an epic. Please try again."
msgstr ""
@@ -31657,7 +32114,10 @@ msgstr ""
msgid "SourcegraphPreferences|Uses a custom %{linkStart}Sourcegraph instance%{linkEnd}."
msgstr ""
-msgid "Spam Check API Key"
+msgid "Spam Check"
+msgstr ""
+
+msgid "Spam Check API key"
msgstr ""
msgid "Spam Logs"
@@ -31675,7 +32135,7 @@ msgstr ""
msgid "Specified URL cannot be used: \"%{reason}\""
msgstr ""
-msgid "Specify an e-mail address regex pattern to identify default internal users."
+msgid "Specify an email address regex pattern to identify default internal users."
msgstr ""
msgid "Speed up your pipelines with Needs relationships"
@@ -31930,7 +32390,7 @@ msgstr ""
msgid "StatusCheck|An error occurred fetching the status checks."
msgstr ""
-msgid "StatusCheck|Apply this status check to any branch or a specific protected branch."
+msgid "StatusCheck|Apply this status check to all branches or a specific protected branch."
msgstr ""
msgid "StatusCheck|Check for a status response in Merge Requests. Failures do not block merges. %{link_start}Learn more%{link_end}."
@@ -32269,6 +32729,9 @@ msgstr ""
msgid "Subscriptions"
msgstr ""
+msgid "Subscription|Your subscription for %{strong}%{namespace_name}%{strong_close} has expired and you are now on %{pricing_link_start}the GitLab Free tier%{pricing_link_end}. Don't worry, your data is safe. Get in touch with our support team (%{support_email}). They'll gladly help with your subscription renewal."
+msgstr ""
+
msgid "Subtracted"
msgstr ""
@@ -32497,6 +32960,9 @@ msgstr ""
msgid "SuperSonics|Plan"
msgstr ""
+msgid "SuperSonics|Please agree to the Subscription Agreement"
+msgstr ""
+
msgid "SuperSonics|Ready to get started? A GitLab plan is ideal for scaling organizations and for multi team usage."
msgstr ""
@@ -32527,6 +32993,9 @@ msgstr ""
msgid "SuperSonics|The activation code is not valid. Please make sure to copy it exactly from the Customers Portal or confirmation email. Learn more about %{linkStart}activating your subscription%{linkEnd}."
msgstr ""
+msgid "SuperSonics|The activation code should be a 24-character alphanumeric string"
+msgstr ""
+
msgid "SuperSonics|There is a connectivity issue."
msgstr ""
@@ -32569,9 +33038,15 @@ msgstr ""
msgid "SuperSonics|You do not have an active subscription"
msgstr ""
+msgid "SuperSonics|You have successfully added a license that activates on %{date}. Please see the subscription history table below for more details."
+msgstr ""
+
msgid "SuperSonics|You'll be charged for %{trueUpLinkStart}users over license%{trueUpLinkEnd} on a quarterly or annual basis, depending on the terms of your agreement."
msgstr ""
+msgid "SuperSonics|Your future dated license was successfully added"
+msgstr ""
+
msgid "SuperSonics|Your subscription"
msgstr ""
@@ -32824,7 +33299,7 @@ msgstr ""
msgid "Template to append to all Service Desk issues"
msgstr ""
-msgid "TemplateRepository|Select a repository to make its templates available to all projects. %{link_start}What should the repository contain?%{link_end} "
+msgid "TemplateRepository|Create common files more quickly, and standardize their format."
msgstr ""
msgid "Templates"
@@ -33030,7 +33505,7 @@ msgstr ""
msgid "TestCases|Search test cases"
msgstr ""
-msgid "TestCases|Something went wrong while adding test case to Todo."
+msgid "TestCases|Something went wrong while adding test case to a to-do item."
msgstr ""
msgid "TestCases|Something went wrong while creating a test case."
@@ -33042,7 +33517,7 @@ msgstr ""
msgid "TestCases|Something went wrong while fetching test cases list."
msgstr ""
-msgid "TestCases|Something went wrong while marking test case todo as done."
+msgid "TestCases|Something went wrong while marking test case to-do item as done."
msgstr ""
msgid "TestCases|Something went wrong while moving test case."
@@ -33162,7 +33637,7 @@ msgstr ""
msgid "Thanks for your purchase!"
msgstr ""
-msgid "That is ok, I do not want to renew"
+msgid "That's OK, I don't want to renew"
msgstr ""
msgid "That's it, well done!"
@@ -33185,7 +33660,7 @@ msgid_plural "The %{type} contains the following errors:"
msgstr[0] ""
msgstr[1] ""
-msgid "The API key used by GitLab for accessing the Spam Check service endpoint"
+msgid "The API key used by GitLab for accessing the Spam Check service endpoint."
msgstr ""
msgid "The GitLab subscription service (customers.gitlab.com) is currently experiencing an outage. You can monitor the status and get updates at %{linkStart}status.gitlab.com%{linkEnd}."
@@ -33224,9 +33699,6 @@ msgstr ""
msgid "The URL to use for connecting to Elasticsearch. Use a comma-separated list to support clustering (e.g., \"http://localhost:9200, http://localhost:9201\")."
msgstr ""
-msgid "The Vulnerability Report shows the results of the last successful pipeline run on the default branch."
-msgstr ""
-
msgid "The X509 Certificate to use when mutual TLS is required to communicate with the external authorization service. If left blank, the server certificate is still validated when accessing over HTTPS."
msgstr ""
@@ -33284,9 +33756,6 @@ msgstr ""
msgid "The default branch for this project has been changed. Please update your bookmarks."
msgstr ""
-msgid "The default expiration time for job artifacts. 0 for unlimited. The default unit is in seconds, but you can use other units, for example %{code_open}4 mins 2 sec%{code_close}, %{code_open}2h42min%{code_close}."
-msgstr ""
-
msgid "The dependency list details information about the components used within your project."
msgstr ""
@@ -33478,9 +33947,6 @@ msgstr ""
msgid "The merge conflicts for this merge request have already been resolved. Please return to the merge request."
msgstr ""
-msgid "The merge request can now be merged."
-msgstr ""
-
msgid "The metric must be one of %{metrics}."
msgstr ""
@@ -33856,7 +34322,7 @@ msgstr ""
msgid "There was a problem updating the keep latest artifacts setting."
msgstr ""
-msgid "There was an error %{message} todo."
+msgid "There was an error %{message} to-do item."
msgstr ""
msgid "There was an error adding a To Do."
@@ -33895,6 +34361,9 @@ msgstr ""
msgid "There was an error fetching projects"
msgstr ""
+msgid "There was an error fetching search autocomplete suggestions"
+msgstr ""
+
msgid "There was an error fetching stage total counts"
msgstr ""
@@ -34219,6 +34688,9 @@ msgstr ""
msgid "This field is required."
msgstr ""
+msgid "This form is disabled in preview"
+msgstr ""
+
msgid "This group"
msgstr ""
@@ -34240,9 +34712,6 @@ msgstr ""
msgid "This group is linked to a subscription"
msgstr ""
-msgid "This group, including all subgroups, projects and git repositories, will be reachable from only the specified IP address ranges."
-msgstr ""
-
msgid "This group, its subgroups and projects has been scheduled for removal on %{date}."
msgstr ""
@@ -34522,9 +34991,6 @@ msgstr ""
msgid "This user cannot be unlocked manually from GitLab"
msgstr ""
-msgid "This user does not have a pending request"
-msgstr ""
-
msgid "This user has an unconfirmed email address (%{email}). You may force a confirmation."
msgstr ""
@@ -34633,9 +35099,6 @@ msgstr ""
msgid "ThreatMonitoring|Packet Activity"
msgstr ""
-msgid "ThreatMonitoring|Policies"
-msgstr ""
-
msgid "ThreatMonitoring|Requests"
msgstr ""
@@ -34687,6 +35150,12 @@ msgstr ""
msgid "ThreatMonitoring|View documentation"
msgstr ""
+msgid "Threshold in bytes at which to compress Sidekiq job arguments."
+msgstr ""
+
+msgid "Threshold in bytes at which to reject Sidekiq jobs. Set this to 0 to if you don't want to limit Sidekiq jobs."
+msgstr ""
+
msgid "Throughput"
msgstr ""
@@ -34696,6 +35165,9 @@ msgstr ""
msgid "Time"
msgstr ""
+msgid "Time (in hours) that users are allowed to skip forced configuration of two-factor authentication."
+msgstr ""
+
msgid "Time Spent"
msgstr ""
@@ -34762,7 +35234,7 @@ msgstr ""
msgid "TimeTrackingEstimated|Est"
msgstr ""
-msgid "TimeTracking|%{startTag}Spent: %{endTag}%{timeSpentHumanReadable}"
+msgid "TimeTracking|%{spentStart}Spent: %{spentEnd}"
msgstr ""
msgid "TimeTracking|Estimated:"
@@ -34976,6 +35448,9 @@ msgstr ""
msgid "To access this domain create a new DNS record"
msgstr ""
+msgid "To add a custom suffix, set up a Service Desk email address. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "To add an SSH key you need to %{generate_link_start}generate one%{link_end} or use an %{existing_link_start}existing key%{link_end}."
msgstr ""
@@ -34997,13 +35472,16 @@ msgstr ""
msgid "To connect an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To continue using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
+msgstr ""
+
msgid "To continue, you need to select the link in the confirmation email we sent to verify your email address. If you didn't get our email, select %{strongStart}Resend confirmation email.%{strongEnd}"
msgstr ""
msgid "To define internal users, first enable new users set to external"
msgstr ""
-msgid "To enable Registration Features, make sure \"Enable service ping\" is checked."
+msgid "To enable Registration Features, first enable Service Ping."
msgstr ""
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
@@ -35030,7 +35508,7 @@ msgstr ""
msgid "To get started, use the link below to confirm your account."
msgstr ""
-msgid "To help improve GitLab and its user experience, GitLab will periodically collect usage information."
+msgid "To help improve GitLab and its user experience, GitLab periodically collects usage information."
msgstr ""
msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
@@ -35063,7 +35541,7 @@ msgstr ""
msgid "To preserve performance only %{strong_open}%{display_size} of %{real_size}%{strong_close} files are displayed."
msgstr ""
-msgid "To protect this issue's confidentiality, %{forkLink} and set the fork's visibility to private."
+msgid "To protect this issue's confidentiality, %{linkStart}fork this project%{linkEnd} and set the fork's visibility to private."
msgstr ""
msgid "To protect this issue's confidentiality, a private fork of this project was selected."
@@ -35096,12 +35574,15 @@ msgstr ""
msgid "To set up SAML authentication for your group through an identity provider like Azure, Okta, Onelogin, Ping Identity, or your custom SAML 2.0 provider:"
msgstr ""
-msgid "To set up this service:"
+msgid "To set up this integration:"
msgstr ""
msgid "To specify the notification level per project of a group you belong to, you need to visit project page and change notification level there."
msgstr ""
+msgid "To start using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
+msgstr ""
+
msgid "To unsubscribe from this issue, please paste the following link into your browser:"
msgstr ""
@@ -35689,9 +36170,6 @@ msgstr ""
msgid "Unable to fetch branches list, please close the form and try again"
msgstr ""
-msgid "Unable to fetch unscanned projects"
-msgstr ""
-
msgid "Unable to fetch vulnerable projects"
msgstr ""
@@ -35746,6 +36224,15 @@ msgstr ""
msgid "Unable to update this issue at this time."
msgstr ""
+msgid "Unapprove a merge request"
+msgstr ""
+
+msgid "Unapprove the current merge request."
+msgstr ""
+
+msgid "Unapproved the current merge request."
+msgstr ""
+
msgid "Unarchive project"
msgstr ""
@@ -35758,16 +36245,13 @@ msgstr ""
msgid "Unassigned"
msgstr ""
-msgid "Unauthenticated API request rate limit"
-msgstr ""
-
-msgid "Unauthenticated rate limit period in seconds"
+msgid "Unauthenticated API rate limit period in seconds"
msgstr ""
-msgid "Unauthenticated request rate limit"
+msgid "Unauthenticated requests"
msgstr ""
-msgid "Unauthenticated requests"
+msgid "Unauthenticated web rate limit period in seconds"
msgstr ""
msgid "Undo"
@@ -35869,18 +36353,6 @@ msgstr ""
msgid "Unresolved"
msgstr ""
-msgid "UnscannedProjects|15 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|30 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|5 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|60 or more days"
-msgstr ""
-
msgid "Unschedule job"
msgstr ""
@@ -36100,6 +36572,9 @@ msgstr ""
msgid "UsageQuota|%{help_link_start}Shared runners%{help_link_end} are disabled, so there are no limits set on pipeline usage"
msgstr ""
+msgid "UsageQuota|%{linkTitle} help link"
+msgstr ""
+
msgid "UsageQuota|%{percentageLeft} of purchased storage is available"
msgstr ""
@@ -36109,6 +36584,9 @@ msgstr ""
msgid "UsageQuota|Artifacts is a sum of build and pipeline artifacts."
msgstr ""
+msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
+msgstr ""
+
msgid "UsageQuota|Buy additional minutes"
msgstr ""
@@ -36118,9 +36596,21 @@ msgstr ""
msgid "UsageQuota|CI minutes usage by project"
msgstr ""
+msgid "UsageQuota|Code packages and container images."
+msgstr ""
+
msgid "UsageQuota|Current period usage"
msgstr ""
+msgid "UsageQuota|File attachments and smaller design graphics."
+msgstr ""
+
+msgid "UsageQuota|Git repository, managed by the Gitaly service."
+msgstr ""
+
+msgid "UsageQuota|Includes project registry, artifacts, packages, wiki, uploads and other items."
+msgstr ""
+
msgid "UsageQuota|Increase storage temporarily"
msgstr ""
@@ -36139,6 +36629,9 @@ msgstr ""
msgid "UsageQuota|Packages"
msgstr ""
+msgid "UsageQuota|Pipeline artifacts and job artifacts, created with CI/CD."
+msgstr ""
+
msgid "UsageQuota|Pipelines"
msgstr ""
@@ -36157,6 +36650,9 @@ msgstr ""
msgid "UsageQuota|Seats"
msgstr ""
+msgid "UsageQuota|Shared bits of code and text."
+msgstr ""
+
msgid "UsageQuota|Snippets"
msgstr ""
@@ -36166,6 +36662,12 @@ msgstr ""
msgid "UsageQuota|Storage"
msgstr ""
+msgid "UsageQuota|Storage type"
+msgstr ""
+
+msgid "UsageQuota|There is a known issue with Artifact storage where the total could be incorrect for some projects. More details and progress are available in %{warningLinkStart}the epic%{warningLinkEnd}."
+msgstr ""
+
msgid "UsageQuota|This is the total amount of storage used across your projects within this namespace."
msgstr ""
@@ -36205,6 +36707,9 @@ msgstr ""
msgid "UsageQuota|Usage"
msgstr ""
+msgid "UsageQuota|Usage Breakdown"
+msgstr ""
+
msgid "UsageQuota|Usage Quotas"
msgstr ""
@@ -36229,6 +36734,9 @@ msgstr ""
msgid "UsageQuota|Wiki"
msgstr ""
+msgid "UsageQuota|Wiki content."
+msgstr ""
+
msgid "UsageQuota|Wikis"
msgstr ""
@@ -36445,7 +36953,10 @@ msgstr ""
msgid "User Settings"
msgstr ""
-msgid "User and IP Rate Limits"
+msgid "User and IP rate limits"
+msgstr ""
+
+msgid "User does not have a pending request"
msgstr ""
msgid "User identity was successfully created."
@@ -36742,6 +37253,9 @@ msgstr ""
msgid "Users can launch a development environment from a GitLab browser tab when the %{linkStart}Gitpod%{linkEnd} integration is enabled."
msgstr ""
+msgid "Users can reactivate their account by signing in."
+msgstr ""
+
msgid "Users can render diagrams in AsciiDoc, Markdown, reStructuredText, and Textile documents using Kroki."
msgstr ""
@@ -36757,6 +37271,9 @@ msgstr ""
msgid "Users requesting access to"
msgstr ""
+msgid "Users to exclude from the rate limit"
+msgstr ""
+
msgid "Users were successfully added."
msgstr ""
@@ -36778,6 +37295,9 @@ msgstr ""
msgid "UsersSelect|Unassigned"
msgstr ""
+msgid "Uses GitLab as a lightweight alternative to Sentry."
+msgstr ""
+
msgid "Using %{code_start}::%{code_end} denotes a %{link_start}scoped label set%{link_end}"
msgstr ""
@@ -36808,10 +37328,7 @@ msgstr ""
msgid "Value Stream Analytics can help you determine your team’s velocity"
msgstr ""
-msgid "Value Stream Analytics gives an overview of how much time it takes to go from idea to production in your project."
-msgstr ""
-
-msgid "Value may contain a variable reference"
+msgid "Value might contain a variable reference"
msgstr ""
msgid "Value stream"
@@ -36877,10 +37394,10 @@ msgstr ""
msgid "ValueStream|The Default Value Stream cannot be deleted"
msgstr ""
-msgid "Variable"
+msgid "Values that contain the %{codeStart}$%{codeEnd} character can be considered a variable reference and expanded. %{docsLinkStart}Learn more.%{docsLinkEnd}"
msgstr ""
-msgid "Variable references indicated by %{codeStart}$%{codeEnd} may be expanded. If this is not what you want, consider %{docsLinkStart}using a workaround to prevent expansion%{docsLinkEnd}."
+msgid "Variable"
msgstr ""
msgid "Variable will be masked in job logs."
@@ -37285,6 +37802,9 @@ msgstr ""
msgid "Vulnerability|Evidence"
msgstr ""
+msgid "Vulnerability|False positive detected"
+msgstr ""
+
msgid "Vulnerability|File"
msgstr ""
@@ -37327,6 +37847,9 @@ msgstr ""
msgid "Vulnerability|Status"
msgstr ""
+msgid "Vulnerability|The scanner determined this vulnerability to be a false positive. Verify the evaluation before changing its status. %{linkStart}Learn more about false positive detection.%{linkEnd}"
+msgstr ""
+
msgid "Vulnerability|The unmodified response is the original response that had no mutations done to the request"
msgstr ""
@@ -37651,9 +38174,6 @@ msgstr ""
msgid "Welcome to GitLab,%{br_tag}%{name}!"
msgstr ""
-msgid "Welcome to the guided GitLab tour"
-msgstr ""
-
msgid "Welcome, %{name}!"
msgstr ""
@@ -37672,9 +38192,6 @@ msgstr ""
msgid "What are you searching for?"
msgstr ""
-msgid "What describes you best?"
-msgstr ""
-
msgid "What does this command do?"
msgstr ""
@@ -37696,13 +38213,13 @@ msgstr ""
msgid "What is your job title? (optional)"
msgstr ""
-msgid "What will you use this group for?"
+msgid "What templates can I create?"
msgstr ""
-msgid "What's new"
+msgid "What will you use this group for?"
msgstr ""
-msgid "What’s your experience level?"
+msgid "What's new"
msgstr ""
msgid "When a deployment job is successful, skip older deployment jobs that are still pending."
@@ -37714,6 +38231,9 @@ msgstr ""
msgid "When an event in GitLab triggers a webhook, you can use the request details to figure out if something went wrong."
msgstr ""
+msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+msgstr ""
+
msgid "When inactive, an external authentication provider must be used."
msgstr ""
@@ -37737,6 +38257,9 @@ msgstr ""
msgid "When:"
msgstr ""
+msgid "Which API requests are affected?"
+msgstr ""
+
msgid "While it's rare to have no vulnerabilities, it can happen. In any event, we ask that you please double check your settings to make sure you've set up your dashboard correctly."
msgstr ""
@@ -38016,6 +38539,9 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|Work Items"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -38091,6 +38617,9 @@ msgstr ""
msgid "You are already a member of this %{member_source}."
msgstr ""
+msgid "You are already impersonating another user"
+msgstr ""
+
msgid "You are an admin, which means granting access to %{client_name} will allow them to interact with GitLab as an admin as well. Proceed with caution."
msgstr ""
@@ -38193,6 +38722,9 @@ msgstr ""
msgid "You can also use project access tokens with Git to authenticate over HTTP(S). %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "You can always change your URL later"
+msgstr ""
+
msgid "You can always edit this later"
msgstr ""
@@ -38349,10 +38881,10 @@ msgstr ""
msgid "You can’t %{tag_start}edit%{tag_end} files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
-msgid "You could not create a new trigger."
+msgid "You can’t edit files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
-msgid "You didn't renew your subscription for %{strong}%{namespace_name}%{strong_close} so it was downgraded to the free plan."
+msgid "You could not create a new trigger."
msgstr ""
msgid "You do not have any subscriptions yet"
@@ -38520,6 +39052,12 @@ msgstr ""
msgid "You must provide your current password in order to change it."
msgstr ""
+msgid "You must sign in to search for specific projects."
+msgstr ""
+
+msgid "You must sign in to search for specific terms."
+msgstr ""
+
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
@@ -38547,6 +39085,9 @@ msgstr ""
msgid "You need to upload a GitLab project export archive (ending in .gz)."
msgstr ""
+msgid "You need to verify your primary email first before enabling Two-Factor Authentication."
+msgstr ""
+
msgid "You successfully declined the invitation"
msgstr ""
@@ -38655,10 +39196,10 @@ msgstr ""
msgid "Your %{host} account was signed in to from a new location"
msgstr ""
-msgid "Your %{strong}%{plan_name}%{strong_close} subscription for %{strong}%{namespace_name}%{strong_close} will expire on %{strong}%{expires_on}%{strong_close}."
+msgid "Your %{strong}%{plan_name}%{strong_close} subscription expires on %{strong}%{expires_on}%{strong_close}. After that date, you cannot create issues or merge requests, or use many other features."
msgstr ""
-msgid "Your %{strong}%{plan_name}%{strong_close} subscription will expire on %{strong}%{expires_on}%{strong_close}. After that, you will not be able to create issues or merge requests as well as many other features."
+msgid "Your %{strong}%{plan_name}%{strong_close} subscription for %{strong}%{namespace_name}%{strong_close} will expire on %{strong}%{expires_on}%{strong_close}."
msgstr ""
msgid "Your CI/CD configuration syntax is invalid. View Lint tab for more details."
@@ -38682,7 +39223,7 @@ msgstr ""
msgid "Your GPG keys (%{count})"
msgstr ""
-msgid "Your GitLab account has been locked due to an excessive amount of unsuccessful sign in attempts. Your account will automatically unlock in %{duration} or you may click the link below to unlock now."
+msgid "Your GitLab account has been locked due to an excessive number of unsuccessful sign in attempts. You can wait for your account to automatically unlock in %{duration} or you can click the link below to unlock now."
msgstr ""
msgid "Your GitLab account request has been approved!"
@@ -38793,6 +39334,9 @@ msgstr ""
msgid "Your commit email is used for web based operations, such as edits and merges."
msgstr ""
+msgid "Your current password is required to register a two-factor authenticator app."
+msgstr ""
+
msgid "Your dashboard has been copied. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
@@ -38892,6 +39436,9 @@ msgstr ""
msgid "Your project limit is %{limit} projects! Please contact your administrator to increase it"
msgstr ""
+msgid "Your project will be created at:"
+msgstr ""
+
msgid "Your projects"
msgstr ""
@@ -38931,11 +39478,10 @@ msgstr ""
msgid "Your subscription expired!"
msgstr ""
-msgid "Your subscription has been downgraded."
-msgstr ""
-
-msgid "Your subscription will expire in %{remaining_days}."
-msgstr ""
+msgid "Your subscription will expire in %{remaining_days} day."
+msgid_plural "Your subscription will expire in %{remaining_days} days."
+msgstr[0] ""
+msgstr[1] ""
msgid "Your username is %{username}."
msgstr ""
@@ -39142,6 +39688,9 @@ msgstr ""
msgid "cannot merge"
msgstr ""
+msgid "cannot not be used for user namespace"
+msgstr ""
+
msgid "ciReport|%{degradedNum} degraded"
msgstr ""
@@ -39465,6 +40014,9 @@ msgstr ""
msgid "created %{timeAgo}"
msgstr ""
+msgid "created %{timeAgo} by %{author}"
+msgstr ""
+
msgid "created by"
msgstr ""
@@ -39509,9 +40061,6 @@ msgstr ""
msgid "does not have a supported extension. Only %{extension_list} are supported"
msgstr ""
-msgid "domain is not authorized for sign-up."
-msgstr ""
-
msgid "download it"
msgstr ""
@@ -39529,18 +40078,13 @@ msgstr ""
msgid "email '%{email}' is not a verified email."
msgstr ""
-msgid "email does not match the allowed domain of %{email_domains}"
-msgid_plural "email does not match the allowed domains: %{email_domains}"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "enabled"
msgstr ""
msgid "encrypted: needs to be a :required, :optional or :migrating!"
msgstr ""
-msgid "ending with MIME type format is not allowed."
+msgid "ending with a reserved file extension is not allowed."
msgstr ""
msgid "entries cannot be larger than 255 characters"
@@ -39564,6 +40108,9 @@ msgstr ""
msgid "estimateCommand|%{slash_command} overwrites the total estimated time."
msgstr ""
+msgid "example.com"
+msgstr ""
+
msgid "exceeds the limit of %{bytes} bytes"
msgstr ""
@@ -39614,9 +40161,6 @@ msgstr ""
msgid "fork"
msgstr ""
-msgid "fork this project"
-msgstr ""
-
msgid "from"
msgstr ""
@@ -39625,6 +40169,9 @@ msgid_plural "from %d jobs"
msgstr[0] ""
msgstr[1] ""
+msgid "frontmatter"
+msgstr ""
+
msgid "group"
msgstr ""
@@ -39652,6 +40199,9 @@ msgstr ""
msgid "has been completed."
msgstr ""
+msgid "has too deep level of nesting"
+msgstr ""
+
msgid "help"
msgstr ""
@@ -39685,9 +40235,21 @@ msgstr ""
msgid "in"
msgstr ""
+msgid "in Infrastructure :: Kubernetes clusters"
+msgstr ""
+
+msgid "in all GitLab"
+msgstr ""
+
+msgid "in group"
+msgstr ""
+
msgid "in group %{link_to_group}"
msgstr ""
+msgid "in project"
+msgstr ""
+
msgid "in project %{link_to_project}"
msgstr ""
@@ -39729,16 +40291,19 @@ msgstr ""
msgid "is not a valid X509 certificate."
msgstr ""
-msgid "is not allowed since the group is not top-level group."
+msgid "is not allowed for sign-up."
msgstr ""
-msgid "is not allowed. Try again with a different email address, or contact your GitLab admin."
+msgid "is not allowed for this group."
msgstr ""
-msgid "is not allowed. We do not currently support project-level iterations"
+msgid "is not allowed for this project."
+msgstr ""
+
+msgid "is not allowed since the group is not top-level group."
msgstr ""
-msgid "is not from an allowed domain."
+msgid "is not allowed. We do not currently support project-level iterations"
msgstr ""
msgid "is not in the group enforcing Group Managed Account"
@@ -39831,6 +40396,9 @@ msgstr ""
msgid "log in"
msgstr ""
+msgid "managed"
+msgstr ""
+
msgid "manual"
msgstr ""
@@ -39878,6 +40446,9 @@ msgstr ""
msgid "mrWidget| Please restore it or use a different %{missingBranchName} branch"
msgstr ""
+msgid "mrWidget|%{linkStart}Set up now%{linkEnd} to analyze your source code for known security vulnerabilities."
+msgstr ""
+
msgid "mrWidget|%{mergeError}."
msgstr ""
@@ -39958,6 +40529,9 @@ msgid_plural "mrWidget|Closes issues"
msgstr[0] ""
msgstr[1] ""
+msgid "mrWidget|Create issue to resolve all threads"
+msgstr ""
+
msgid "mrWidget|Delete source branch"
msgstr ""
@@ -39967,12 +40541,18 @@ msgstr ""
msgid "mrWidget|Did not close"
msgstr ""
+msgid "mrWidget|Dismiss"
+msgstr ""
+
msgid "mrWidget|Email patches"
msgstr ""
msgid "mrWidget|Failed to load deployment statistics"
msgstr ""
+msgid "mrWidget|Hide %{widget} details"
+msgstr ""
+
msgid "mrWidget|If the %{missingBranchName} branch exists in your local repository, you can merge this merge request manually using the command line"
msgstr ""
@@ -40068,9 +40648,6 @@ msgstr ""
msgid "mrWidget|Request to merge"
msgstr ""
-msgid "mrWidget|Resolve all threads in new issue"
-msgstr ""
-
msgid "mrWidget|Resolve conflicts"
msgstr ""
@@ -40086,6 +40663,9 @@ msgstr ""
msgid "mrWidget|Revoke approval"
msgstr ""
+msgid "mrWidget|SAST and Secret Detection is not enabled."
+msgstr ""
+
msgid "mrWidget|Set by %{merge_author} to be added to the merge train when the pipeline succeeds"
msgstr ""
@@ -40095,6 +40675,9 @@ msgstr ""
msgid "mrWidget|Set by %{merge_author} to start a merge train when the pipeline succeeds"
msgstr ""
+msgid "mrWidget|Show %{widget} details"
+msgstr ""
+
msgid "mrWidget|The changes were merged into"
msgstr ""
@@ -40107,6 +40690,9 @@ msgstr ""
msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure, or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
msgstr ""
+msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure."
+msgstr ""
+
msgid "mrWidget|The source branch has been deleted"
msgstr ""
@@ -40149,6 +40735,9 @@ msgstr ""
msgid "mrWidget|You can merge after removing denied licenses"
msgstr ""
+msgid "mrWidget|You can only merge once this merge request is approved."
+msgstr ""
+
msgid "mrWidget|Your password"
msgstr ""
@@ -40185,6 +40774,9 @@ msgstr ""
msgid "must be less than the limit of %{tag_limit} tags"
msgstr ""
+msgid "must be set for a project namespace"
+msgstr ""
+
msgid "must be unique by status and elapsed time within a policy"
msgstr ""
@@ -40294,6 +40886,9 @@ msgstr ""
msgid "pipeline"
msgstr ""
+msgid "pipeline schedules documentation"
+msgstr ""
+
msgid "pod_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
msgstr ""
@@ -40343,16 +40938,25 @@ msgstr ""
msgid "project name"
msgstr ""
+msgid "project namespace cannot be the parent of another namespace"
+msgstr ""
+
msgid "projects"
msgstr ""
msgid "quick actions"
msgstr ""
-msgid "reCAPTCHA Private Key"
+msgid "reCAPTCHA"
+msgstr ""
+
+msgid "reCAPTCHA helps prevent credential stuffing."
msgstr ""
-msgid "reCAPTCHA Site Key"
+msgid "reCAPTCHA private key"
+msgstr ""
+
+msgid "reCAPTCHA site key"
msgstr ""
msgid "recent activity"
@@ -40579,6 +41183,9 @@ msgstr ""
msgid "user avatar"
msgstr ""
+msgid "user namespace cannot be the parent of another namespace"
+msgstr ""
+
msgid "user preferences"
msgstr ""
@@ -40671,3 +41278,9 @@ msgstr ""
msgid "your settings"
msgstr ""
+msgid "{group}"
+msgstr ""
+
+msgid "{project}"
+msgstr ""
+
diff --git a/locale/br_FR/gitlab.po b/locale/br_FR/gitlab.po
index a9757e284dd..d4a66813efa 100644
--- a/locale/br_FR/gitlab.po
+++ b/locale/br_FR/gitlab.po
@@ -14,10 +14,7 @@ msgstr ""
"X-Crowdin-Language: br-FR\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-09-01 22:31\n"
-
-msgid " %{name}, confirm your email address now! "
-msgstr ""
+"PO-Revision-Date: 2021-10-04 20:19\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -98,6 +95,22 @@ msgstr ""
msgid "#general, #development"
msgstr ""
+msgid "%d Alert"
+msgid_plural "%d Alerts"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+msgid "%d Alert:"
+msgid_plural "%d Alerts:"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
msgid "%d Approval"
msgid_plural "%d Approvals"
msgstr[0] ""
@@ -659,7 +672,10 @@ msgstr ""
msgid "%{code_open}Protected:%{code_close} Only exposed to protected branches or tags."
msgstr ""
-msgid "%{commit_author_link} authored %{commit_timeago}"
+msgid "%{commit_author_link} authored %{commit_authored_timeago}"
+msgstr ""
+
+msgid "%{commit_author_link} authored %{commit_authored_timeago} and %{commit_committer_avatar} %{commit_committer_link} committed %{commit_committer_timeago}"
msgstr ""
msgid "%{completedCount} completed weight"
@@ -768,6 +784,15 @@ msgstr ""
msgid "%{doc_link_start}Advanced search%{doc_link_end} is enabled."
msgstr ""
+msgid "%{docs_link_start}Learn about visibility levels.%{docs_link_end}"
+msgstr ""
+
+msgid "%{docs_link_start}What is Large File Storage?%{docs_link_end}"
+msgstr ""
+
+msgid "%{docs_link_start}What is two-factor authentication?%{docs_link_end}"
+msgstr ""
+
msgid "%{due_date} (Past due)"
msgstr ""
@@ -840,9 +865,6 @@ msgstr ""
msgid "%{issueType} actions"
msgstr ""
-msgid "%{issuesCount} issues with a limit of %{maxIssueCount}"
-msgstr ""
-
msgid "%{issuesSize} with a limit of %{maxIssueCount}"
msgstr ""
@@ -900,6 +922,12 @@ msgstr ""
msgid "%{label_for_message} unavailable"
msgstr ""
+msgid "%{learn_more_link}."
+msgstr ""
+
+msgid "%{lessThan} 1 hour"
+msgstr ""
+
msgid "%{lets_encrypt_link_start}Let's Encrypt%{lets_encrypt_link_end} is a free, automated, and open certificate authority (CA) that issues digital certificates to enable HTTPS (SSL/TLS) for sites."
msgstr ""
@@ -912,15 +940,15 @@ msgstr ""
msgid "%{link_start}Learn more%{link_end} about roles."
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
-msgstr ""
-
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
msgstr ""
msgid "%{link_start}Start the title with %{draft_snippet}%{link_end} to prevent a merge request that is a work in progress from being merged before it's ready."
msgstr ""
+msgid "%{link_start}What information does GitLab Inc. collect?%{link_end}"
+msgstr ""
+
msgid "%{listToShow}, and %{awardsListLength} more"
msgstr ""
@@ -1085,7 +1113,7 @@ msgstr[2] ""
msgstr[3] ""
msgstr[4] ""
-msgid "%{service_ping_link_start}Learn more%{service_ping_link_end} about what information is shared with GitLab Inc."
+msgid "%{service_ping_link_start}What information is shared with GitLab Inc.?%{service_ping_link_end}"
msgstr ""
msgid "%{size} %{unit}"
@@ -1121,6 +1149,9 @@ msgstr ""
msgid "%{state} epics"
msgstr ""
+msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
+msgstr ""
+
msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
msgstr ""
@@ -1201,14 +1232,6 @@ msgstr ""
msgid "%{template_project_id} is unknown or invalid"
msgstr ""
-msgid "%{text} %{files}"
-msgid_plural "%{text} %{files} files"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
-msgstr[4] ""
-
msgid "%{text} is available"
msgstr ""
@@ -1293,9 +1316,6 @@ msgstr ""
msgid "%{wildcards_link_start}Wildcards%{wildcards_link_end} such as %{code_tag_start}v*%{code_tag_end} or %{code_tag_start}*-release%{code_tag_end} are supported."
msgstr ""
-msgid "&lt; 1 hour"
-msgstr ""
-
msgid "'%{data}' at %{location} does not match format: %{format}"
msgstr ""
@@ -1382,9 +1402,6 @@ msgstr ""
msgid "(we need your current password to confirm your changes)"
msgstr ""
-msgid "* * * * *"
-msgstr ""
-
msgid "+ %{amount} more"
msgstr ""
@@ -1460,10 +1477,10 @@ msgstr ""
msgid "."
msgstr ""
-msgid "0 bytes"
+msgid "/"
msgstr ""
-msgid "0 for unlimited, only effective with remote storage enabled."
+msgid "0 bytes"
msgstr ""
msgid "0t1DgySidms"
@@ -1662,6 +1679,9 @@ msgstr ""
msgid "1000+"
msgstr ""
+msgid "192.168.0.0/24"
+msgstr ""
+
msgid "1st contribution!"
msgstr ""
@@ -1815,9 +1835,6 @@ msgstr ""
msgid "A plain HTML site that uses Netlify for CI/CD instead of GitLab, but still with all the other great GitLab features"
msgstr ""
-msgid "A plain-text response to show to clients that hit the rate limit."
-msgstr ""
-
msgid "A platform value can be web, mob or app."
msgstr ""
@@ -1899,7 +1916,7 @@ msgstr ""
msgid "APIFuzzing|Configure HTTP basic authentication values. Other authentication methods are supported. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
+msgid "APIFuzzing|Customize your project's API fuzzing configuration options and copy the code snippet to your .gitlab-ci.yml file to apply any changes. Note that this tool does not reflect or update your .gitlab-ci.yml file automatically. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
msgstr ""
msgid "APIFuzzing|Enable authentication"
@@ -1962,9 +1979,6 @@ msgstr ""
msgid "APIFuzzing|To prevent a security leak, authentication info must be added as a %{ciVariablesLinkStart}CI variable%{ciVariablesLinkEnd}. As a user with maintainer access rights, you can manage CI variables in the %{ciSettingsLinkStart}Settings%{ciSettingsLinkEnd} area."
msgstr ""
-msgid "APIFuzzing|Use this tool to generate API fuzzing configuration YAML to copy into your .gitlab-ci.yml file. This tool does not reflect or update your .gitlab-ci.yml file automatically."
-msgstr ""
-
msgid "APIFuzzing|Username for basic authentication"
msgstr ""
@@ -2016,9 +2030,6 @@ msgstr ""
msgid "Abuse reports notification email"
msgstr ""
-msgid "Abuse reports will be sent to this address if it is set. Abuse reports are always available in the admin area."
-msgstr ""
-
msgid "Accept invitation"
msgstr ""
@@ -2055,12 +2066,18 @@ msgstr ""
msgid "Access granted"
msgstr ""
+msgid "Access key ID"
+msgstr ""
+
msgid "Access requests"
msgstr ""
msgid "Access to '%{classification_label}' not allowed"
msgstr ""
+msgid "Access tokens expire after 2 hours. A refresh token may be used at any time to generate a new access token. Non-expiring access tokens are deprecated. Clear this setting to enable backward compatibility."
+msgstr ""
+
msgid "AccessDropdown|Deploy Keys"
msgstr ""
@@ -2373,6 +2390,9 @@ msgstr ""
msgid "Add new directory"
msgstr ""
+msgid "Add new service account"
+msgstr ""
+
msgid "Add or remove previously merged commits"
msgstr ""
@@ -2610,6 +2630,9 @@ msgstr ""
msgid "AdminArea|Features"
msgstr ""
+msgid "AdminArea|Get security updates from GitLab and stay up to date"
+msgstr ""
+
msgid "AdminArea|Groups"
msgstr ""
@@ -2649,6 +2672,12 @@ msgstr ""
msgid "AdminArea|Reporter"
msgstr ""
+msgid "AdminArea|Sign up for the GitLab Security Newsletter to get notified for security updates."
+msgstr ""
+
+msgid "AdminArea|Sign up for the GitLab newsletter"
+msgstr ""
+
msgid "AdminArea|Stop all jobs"
msgstr ""
@@ -2718,9 +2747,15 @@ msgstr ""
msgid "AdminSettings|Disable public access to Pages sites"
msgstr ""
+msgid "AdminSettings|Display a banner on merge requests in projects with no pipelines to initiate steps to add a .gitlab-ci.yml file."
+msgstr ""
+
msgid "AdminSettings|Domain verification is an essential security measure for public GitLab sites. Users are required to demonstrate they control a domain before it is enabled. %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "AdminSettings|Enable pipeline suggestion banner"
+msgstr ""
+
msgid "AdminSettings|Enable shared runners for new projects"
msgstr ""
@@ -3192,10 +3227,10 @@ msgstr ""
msgid "Admin|Quarterly reconciliation will occur on %{qrtlyDate}"
msgstr ""
-msgid "Admin|The number of max seats used for your namespace is currently exceeding the number of seats in your subscription. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgid "Admin|The number of max seats in your namespace exceeds the number of seats in your subscription. On %{qrtlyDate}, quarterly reconciliation occurs and you are automatically billed a prorated amount for the overage. No action is needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice. For more information about the timing of the invoicing process, view the documentation."
msgstr ""
-msgid "Admin|The number of maximum users for your instance is currently exceeding the number of users in license. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgid "Admin|The number of max users in your instance exceeds the number of users in your license. On %{qrtlyDate}, quarterly reconciliation occurs and you are automatically billed a prorated amount for the overage. No action is needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice. For more information about the timing of the invoicing process, view the documentation."
msgstr ""
msgid "Admin|View pending user approvals"
@@ -3216,9 +3251,6 @@ msgstr ""
msgid "Advanced export options"
msgstr ""
-msgid "Advanced permissions, Large File Storage and Two-Factor authentication settings."
-msgstr ""
-
msgid "After a successful password update you will be redirected to login screen."
msgstr ""
@@ -3237,16 +3269,14 @@ msgstr ""
msgid "After you've reviewed these contribution guidelines, you'll be all set to"
msgstr ""
+msgid "Akismet"
+msgstr ""
+
msgid "Akismet API Key"
msgstr ""
-msgid "Alert"
-msgid_plural "Alerts"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
-msgstr[4] ""
+msgid "Akismet helps prevent the creation of spam issues in public projects."
+msgstr ""
msgid "AlertManagement|Acknowledged"
msgstr ""
@@ -3602,6 +3632,9 @@ msgstr ""
msgid "All (default)"
msgstr ""
+msgid "All GitLab"
+msgstr ""
+
msgid "All Members"
msgstr ""
@@ -3716,6 +3749,9 @@ msgstr ""
msgid "Allow this secondary node to replicate content on Object Storage"
msgstr ""
+msgid "Allow use of licensed EE features"
+msgstr ""
+
msgid "Allow users to dismiss the broadcast message"
msgstr ""
@@ -3791,9 +3827,6 @@ msgstr ""
msgid "Amazon authentication is not %{link_start}correctly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
-msgid "Amount of time (in hours) that users are allowed to skip forced configuration of two-factor authentication"
-msgstr ""
-
msgid "An %{link_start}alert%{link_end} with the same fingerprint is already open. To change the status of this alert, resolve the linked alert."
msgstr ""
@@ -3854,12 +3887,6 @@ msgstr ""
msgid "An error occurred when removing the label."
msgstr ""
-msgid "An error occurred when toggling the notification subscription"
-msgstr ""
-
-msgid "An error occurred when updating the issue weight"
-msgstr ""
-
msgid "An error occurred when updating the title"
msgstr ""
@@ -3908,6 +3935,9 @@ msgstr ""
msgid "An error occurred while enabling Service Desk."
msgstr ""
+msgid "An error occurred while fetching Markdown preview"
+msgstr ""
+
msgid "An error occurred while fetching ancestors"
msgstr ""
@@ -3938,9 +3968,6 @@ msgstr ""
msgid "An error occurred while fetching label colors."
msgstr ""
-msgid "An error occurred while fetching markdown preview"
-msgstr ""
-
msgid "An error occurred while fetching participants"
msgstr ""
@@ -3956,9 +3983,6 @@ msgstr ""
msgid "An error occurred while fetching reference"
msgstr ""
-msgid "An error occurred while fetching sidebar data"
-msgstr ""
-
msgid "An error occurred while fetching tags. Retry the search."
msgstr ""
@@ -4034,6 +4058,9 @@ msgstr ""
msgid "An error occurred while loading merge requests."
msgstr ""
+msgid "An error occurred while loading projects."
+msgstr ""
+
msgid "An error occurred while loading the Needs tab."
msgstr ""
@@ -4268,12 +4295,6 @@ msgstr ""
msgid "Any Milestone"
msgstr ""
-msgid "Any branch"
-msgstr ""
-
-msgid "Any eligible user"
-msgstr ""
-
msgid "Any encrypted tokens"
msgstr ""
@@ -4292,6 +4313,9 @@ msgstr ""
msgid "Any namespace"
msgstr ""
+msgid "App Engine description and apps that are suitable for this deployment target"
+msgstr ""
+
msgid "App ID"
msgstr ""
@@ -4446,6 +4470,14 @@ msgstr ""
msgid "Apply"
msgstr ""
+msgid "Apply %d suggestion"
+msgid_plural "Apply %d suggestions"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
msgid "Apply a label"
msgstr ""
@@ -4455,13 +4487,10 @@ msgstr ""
msgid "Apply suggestion"
msgstr ""
-msgid "Apply suggestions"
-msgstr ""
-
msgid "Apply template"
msgstr ""
-msgid "Apply this approval rule to any branch or a specific protected branch."
+msgid "Apply this approval rule to all branches or a specific protected branch."
msgstr ""
msgid "Applying"
@@ -4616,9 +4645,6 @@ msgstr ""
msgid "ApprovalSettings|Prevent editing approval rules in projects and merge requests."
msgstr ""
-msgid "ApprovalSettings|Prevent editing approval rules in projects and merge requests. "
-msgstr ""
-
msgid "ApprovalSettings|Remove all approvals when commits are added to the source branch."
msgstr ""
@@ -4634,6 +4660,9 @@ msgstr ""
msgid "ApprovalSettings|This setting is configured at the instance level and can only be changed by an administrator."
msgstr ""
+msgid "ApprovalSettings|This setting is configured in %{groupName} and can only be changed by an administrator or group owner."
+msgstr ""
+
msgid "ApprovalStatusTooltip|Adheres to separation of duties"
msgstr ""
@@ -5129,9 +5158,6 @@ msgstr ""
msgid "Authenticated API rate limit period in seconds"
msgstr ""
-msgid "Authenticated API request rate limit"
-msgstr ""
-
msgid "Authenticated API requests"
msgstr ""
@@ -5141,10 +5167,10 @@ msgstr ""
msgid "Authenticated Git LFS request rate limit"
msgstr ""
-msgid "Authenticated web rate limit period in seconds"
+msgid "Authenticated Git LFS requests"
msgstr ""
-msgid "Authenticated web request rate limit"
+msgid "Authenticated web rate limit period in seconds"
msgstr ""
msgid "Authenticated web requests"
@@ -5522,9 +5548,6 @@ msgstr ""
msgid "Below you will find all the groups that are public."
msgstr ""
-msgid "Beta"
-msgstr ""
-
msgid "Bi-weekly code coverage"
msgstr ""
@@ -5767,6 +5790,21 @@ msgstr ""
msgid "Board scope affects which issues are displayed for anyone who visits this board"
msgstr ""
+msgid "BoardNewEpic|Groups"
+msgstr ""
+
+msgid "BoardNewEpic|Loading groups"
+msgstr ""
+
+msgid "BoardNewEpic|No matching results"
+msgstr ""
+
+msgid "BoardNewEpic|Search groups"
+msgstr ""
+
+msgid "BoardNewEpic|Select a group"
+msgstr ""
+
msgid "BoardNewIssue|No matching results"
msgstr ""
@@ -5847,6 +5885,9 @@ msgstr ""
msgid "Boards|An error occurred while creating the list. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching child groups. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching group projects. Please try again."
msgstr ""
@@ -6182,6 +6223,9 @@ msgstr ""
msgid "Bulk update"
msgstr ""
+msgid "BulkImports|Re-import creates a new group. It does not sync with the existing group."
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -6191,6 +6235,9 @@ msgstr ""
msgid "BulkImport|From source group"
msgstr ""
+msgid "BulkImport|Group import history"
+msgstr ""
+
msgid "BulkImport|Import failed: Destination cannot be a subgroup of the source group. Change the destination and try again."
msgstr ""
@@ -6203,9 +6250,18 @@ msgstr ""
msgid "BulkImport|Importing the group failed"
msgstr ""
+msgid "BulkImport|Last imported to %{link}"
+msgstr ""
+
msgid "BulkImport|Name already exists."
msgstr ""
+msgid "BulkImport|New group"
+msgstr ""
+
+msgid "BulkImport|No history is available"
+msgstr ""
+
msgid "BulkImport|No parent"
msgstr ""
@@ -6218,6 +6274,9 @@ msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} matching filter \"%{filter}\" from %{link}"
msgstr ""
+msgid "BulkImport|Source group"
+msgstr ""
+
msgid "BulkImport|To new group"
msgstr ""
@@ -6227,6 +6286,9 @@ msgstr ""
msgid "BulkImport|You have no groups to import"
msgstr ""
+msgid "BulkImport|Your imported groups will appear here."
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -6472,6 +6534,9 @@ msgstr ""
msgid "Can be manually deployed to"
msgstr ""
+msgid "Can be overridden in each project."
+msgstr ""
+
msgid "Can create groups:"
msgstr ""
@@ -6574,6 +6639,9 @@ msgstr ""
msgid "Cancelling Preview"
msgstr ""
+msgid "Cannot assign a confidential epic to a non-confidential issue. Make the issue confidential and try again"
+msgstr ""
+
msgid "Cannot be assigned to other projects."
msgstr ""
@@ -6625,9 +6693,6 @@ msgstr ""
msgid "Cannot refer to a group %{timebox_type} by an internal id!"
msgstr ""
-msgid "Cannot set confidential epic for a non-confidential issue"
-msgstr ""
-
msgid "Cannot show preview. For previews on sketch files, they must have the file format introduced by Sketch version 43 and above."
msgstr ""
@@ -6865,15 +6930,15 @@ msgstr ""
msgid "Check out, review, and merge locally"
msgstr ""
-msgid "Check the %{docs_link_start}documentation%{docs_link_end}."
-msgstr ""
-
msgid "Check the current instance configuration "
msgstr ""
msgid "Check the elasticsearch.log file to debug why the migration was halted and make any changes before retrying the migration. When you fix the cause of the failure, click \"Retry migration\", and the migration will be scheduled to be retried in the background."
msgstr ""
+msgid "Check with your administrator."
+msgstr ""
+
msgid "Check your Docker images for known vulnerabilities."
msgstr ""
@@ -6904,6 +6969,9 @@ msgstr ""
msgid "Checkout"
msgstr ""
+msgid "Checkout|$%{selectedPlanPrice} per 10 GB storage per pack"
+msgstr ""
+
msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 minutes"
msgstr ""
@@ -6927,20 +6995,26 @@ msgstr ""
msgid "Checkout|%{name}'s GitLab subscription"
msgstr ""
-msgid "Checkout|%{selectedPlanText} plan"
+msgid "Checkout|%{name}'s storage subscription"
msgstr ""
-msgid "Checkout|%{startDate} - %{endDate}"
+msgid "Checkout|%{quantity} GB of storage"
msgstr ""
-msgid "Checkout|%{totalCiMinutes} CI minute"
-msgid_plural "Checkout|%{totalCiMinutes} CI minutes"
+msgid "Checkout|%{quantity} storage pack"
+msgid_plural "Checkout|%{quantity} storage packs"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
msgstr[4] ""
+msgid "Checkout|%{selectedPlanText} plan"
+msgstr ""
+
+msgid "Checkout|%{startDate} - %{endDate}"
+msgstr ""
+
msgid "Checkout|%{totalCiMinutes} CI minutes"
msgstr ""
@@ -7016,6 +7090,9 @@ msgstr ""
msgid "Checkout|Failed to register credit card. Please try again."
msgstr ""
+msgid "Checkout|GB"
+msgstr ""
+
msgid "Checkout|GitLab group"
msgstr ""
@@ -7052,6 +7129,9 @@ msgstr ""
msgid "Checkout|State"
msgstr ""
+msgid "Checkout|Storage packs"
+msgstr ""
+
msgid "Checkout|Street address"
msgstr ""
@@ -7073,6 +7153,9 @@ msgstr ""
msgid "Checkout|Total minutes: %{quantity}"
msgstr ""
+msgid "Checkout|Total storage: %{quantity} GB"
+msgstr ""
+
msgid "Checkout|Users"
msgstr ""
@@ -7082,16 +7165,25 @@ msgstr ""
msgid "Checkout|Your organization"
msgstr ""
+msgid "Checkout|Your storage subscription has the same term as your main subscription, and the price is prorated accordingly."
+msgstr ""
+
msgid "Checkout|Your subscription will be applied to this group"
msgstr ""
msgid "Checkout|Zip code"
msgstr ""
+msgid "Checkout|a storage subscription"
+msgstr ""
+
msgid "Checkout|company or team"
msgstr ""
-msgid "Checkout|x 1,000 minutes per pack = %{strong}"
+msgid "Checkout|minutes"
+msgstr ""
+
+msgid "Checkout|x %{quantity} %{units} per pack ="
msgstr ""
msgid "Cherry-pick this commit"
@@ -7448,6 +7540,9 @@ msgstr ""
msgid "CloneIssue|Cannot clone issue to target project as it is pending deletion."
msgstr ""
+msgid "CloneIssue|Cannot clone issues of '%{issue_type}' type."
+msgstr ""
+
msgid "Cloned this issue to %{path_to_project}."
msgstr ""
@@ -7502,7 +7597,10 @@ msgstr ""
msgid "Closes this %{quick_action_target}."
msgstr ""
-msgid "Cloud licenses can not be removed."
+msgid "Cloud Functions description and apps that are suitable for this deployment target"
+msgstr ""
+
+msgid "Cloud Run description and apps that are suitable for this deployment target"
msgstr ""
msgid "Cluster"
@@ -7529,6 +7627,12 @@ msgstr ""
msgid "ClusterAgents|Access tokens"
msgstr ""
+msgid "ClusterAgents|Agent might not be connected to GitLab"
+msgstr ""
+
+msgid "ClusterAgents|Agent never connected to GitLab"
+msgstr ""
+
msgid "ClusterAgents|Alternative installation methods"
msgstr ""
@@ -7544,6 +7648,12 @@ msgstr ""
msgid "ClusterAgents|Configuration"
msgstr ""
+msgid "ClusterAgents|Connected"
+msgstr ""
+
+msgid "ClusterAgents|Connection status"
+msgstr ""
+
msgid "ClusterAgents|Copy token"
msgstr ""
@@ -7562,6 +7672,9 @@ msgstr ""
msgid "ClusterAgents|For alternative installation methods %{linkStart}go to the documentation%{linkEnd}."
msgstr ""
+msgid "ClusterAgents|For more troubleshooting information go to"
+msgstr ""
+
msgid "ClusterAgents|Go to the repository"
msgstr ""
@@ -7577,18 +7690,30 @@ msgstr ""
msgid "ClusterAgents|Integrate with the GitLab Agent"
msgstr ""
-msgid "ClusterAgents|Last used"
+msgid "ClusterAgents|Last connected %{timeAgo}."
+msgstr ""
+
+msgid "ClusterAgents|Last contact"
msgstr ""
msgid "ClusterAgents|Learn how to create an agent access token"
msgstr ""
+msgid "ClusterAgents|Make sure you are using a valid token."
+msgstr ""
+
msgid "ClusterAgents|Name"
msgstr ""
msgid "ClusterAgents|Never"
msgstr ""
+msgid "ClusterAgents|Never connected"
+msgstr ""
+
+msgid "ClusterAgents|Not connected"
+msgstr ""
+
msgid "ClusterAgents|Read more about getting started"
msgstr ""
@@ -7610,6 +7735,9 @@ msgstr ""
msgid "ClusterAgents|Select which Agent you want to install"
msgstr ""
+msgid "ClusterAgents|The Agent has not been connected in a long time. There might be a connectivity issue. Last contact was %{timeAgo}."
+msgstr ""
+
msgid "ClusterAgents|The GitLab Agent also requires %{linkStart}enabling the Agent Server%{linkEnd}"
msgstr ""
@@ -7637,9 +7765,6 @@ msgstr ""
msgid "ClusterAgents|You will need to create a token to connect to your agent"
msgstr ""
-msgid "ClusterAgent|This feature is only available for premium plans"
-msgstr ""
-
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -7829,9 +7954,6 @@ msgstr ""
msgid "ClusterIntegration|Create Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Create a provision role on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the account and external ID above. %{startMoreInfoLink}More information%{endLink}"
-msgstr ""
-
msgid "ClusterIntegration|Create cluster on"
msgstr ""
@@ -8264,7 +8386,7 @@ msgstr ""
msgid "ClusterIntegration|Subnets"
msgstr ""
-msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provisioned role, first create one on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the above account and external IDs. %{startMoreInfoLink}More information%{endLink}"
+msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provisioned role, first create one on %{awsLinkStart}Amazon Web Services %{awsLinkEnd} using the above account and external IDs. %{moreInfoStart}More information%{moreInfoEnd}"
msgstr ""
msgid "ClusterIntegration|The Kubernetes certificate used to authenticate to the cluster."
@@ -8498,6 +8620,9 @@ msgstr ""
msgid "Collapse replies"
msgstr ""
+msgid "Collapse settings section"
+msgstr ""
+
msgid "Collapse sidebar"
msgstr ""
@@ -8516,6 +8641,9 @@ msgstr ""
msgid "Comma-separated list of email addresses."
msgstr ""
+msgid "Comma-separated list of users allowed to exceed the rate limit."
+msgstr ""
+
msgid "Comma-separated, e.g. '1.1.1.1, 2.2.2.0/24'"
msgstr ""
@@ -8839,6 +8967,9 @@ msgstr ""
msgid "Configure %{repository_checks_link_start}repository checks%{link_end} and %{housekeeping_link_start}housekeeping%{link_end} on repositories."
msgstr ""
+msgid "Configure CAPTCHAs, IP address limits, and other anti-spam measures."
+msgstr ""
+
msgid "Configure Dependency Scanning in `.gitlab-ci.yml` using the GitLab managed template. You can [add variable overrides](https://docs.gitlab.com/ee/user/application_security/dependency_scanning/#customizing-the-dependency-scanning-settings) to customize Dependency Scanning settings."
msgstr ""
@@ -8875,16 +9006,13 @@ msgstr ""
msgid "Configure a %{codeStart}.gitlab-webide.yml%{codeEnd} file in the %{codeStart}.gitlab%{codeEnd} directory to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
msgstr ""
-msgid "Configure existing installation"
+msgid "Configure advanced permissions, Large File Storage, and two-factor authentication settings."
msgstr ""
-msgid "Configure limit for notes created per minute by web and API requests."
+msgid "Configure approvals by authors and committers on all projects."
msgstr ""
-msgid "Configure limits for Project/Group Import/Export."
-msgstr ""
-
-msgid "Configure limits for web and API requests."
+msgid "Configure existing installation"
msgstr ""
msgid "Configure paths to be protected by Rack Attack."
@@ -8899,10 +9027,13 @@ msgstr ""
msgid "Configure settings for Advanced Search with Elasticsearch."
msgstr ""
+msgid "Configure specific limits for Files API requests that supersede the general user and IP rate limits."
+msgstr ""
+
msgid "Configure specific limits for Git LFS requests that supersede the general user and IP rate limits."
msgstr ""
-msgid "Configure specific limits for Packages API requests that supersede the general user and IP rate limits."
+msgid "Configure specific limits for deprecated API requests that supersede the general user and IP rate limits."
msgstr ""
msgid "Configure the %{link} integration."
@@ -8914,6 +9045,9 @@ msgstr ""
msgid "Configure the way a user creates a new account."
msgstr ""
+msgid "Configure via Merge Request"
+msgstr ""
+
msgid "Configure which lists are shown for anyone who visits this board"
msgstr ""
@@ -9391,6 +9525,9 @@ msgstr ""
msgid "Content parsed with %{link}."
msgstr ""
+msgid "ContentEditor|Table of Contents"
+msgstr ""
+
msgid "ContentEditor|You have to provide a renderMarkdown function or a custom serializer"
msgstr ""
@@ -9577,6 +9714,9 @@ msgstr ""
msgid "Copy link to chart"
msgstr ""
+msgid "Copy prefix"
+msgstr ""
+
msgid "Copy reference"
msgstr ""
@@ -9607,6 +9747,9 @@ msgstr ""
msgid "Copy value"
msgstr ""
+msgid "Corpus Management"
+msgstr ""
+
msgid "Corpus Management|Are you sure you want to delete the corpus?"
msgstr ""
@@ -9835,6 +9978,9 @@ msgstr ""
msgid "Create commit"
msgstr ""
+msgid "Create common files more quickly, and standardize their format."
+msgstr ""
+
msgid "Create confidential merge request"
msgstr ""
@@ -9868,6 +10014,9 @@ msgstr ""
msgid "Create issue"
msgstr ""
+msgid "Create issue to resolve all threads"
+msgstr ""
+
msgid "Create iteration"
msgstr ""
@@ -9922,6 +10071,9 @@ msgstr ""
msgid "Create new..."
msgstr ""
+msgid "Create or import your first project"
+msgstr ""
+
msgid "Create project"
msgstr ""
@@ -10279,7 +10431,7 @@ msgstr ""
msgid "Custom notification events"
msgstr ""
-msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notificationLinkStart} notification emails%{notificationLinkEnd}."
+msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notificationLinkStart}notification emails%{notificationLinkEnd}."
msgstr ""
msgid "Custom project templates"
@@ -10484,10 +10636,10 @@ msgstr[2] ""
msgstr[3] ""
msgstr[4] ""
-msgid "CycleAnalytics|Showing data for group '%{groupName}' and %{selectedProjectCount} projects from %{startDate} to %{endDate}"
+msgid "CycleAnalytics|Showing data for group '%{groupName}' and %{selectedProjectCount} projects from %{createdAfter} to %{createdBefore}"
msgstr ""
-msgid "CycleAnalytics|Showing data for group '%{groupName}' from %{startDate} to %{endDate}"
+msgid "CycleAnalytics|Showing data for group '%{groupName}' from %{createdAfter} to %{createdBefore}"
msgstr ""
msgid "CycleAnalytics|Stages"
@@ -10721,6 +10873,9 @@ msgstr ""
msgid "DastProfiles|Manage profiles"
msgstr ""
+msgid "DastProfiles|Manage site profiles"
+msgstr ""
+
msgid "DastProfiles|Minimum = 0 (no timeout enabled), Maximum = 2880 minutes"
msgstr ""
@@ -10796,6 +10951,9 @@ msgstr ""
msgid "DastProfiles|Scanner name"
msgstr ""
+msgid "DastProfiles|Schedule"
+msgstr ""
+
msgid "DastProfiles|Select branch"
msgstr ""
@@ -10865,7 +11023,7 @@ msgstr ""
msgid "DastProfiles|Website"
msgstr ""
-msgid "DastProfiles|You can either choose a passive scan or validate the target site in your chosen site profile. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
+msgid "DastProfiles|You can either choose a passive scan or validate the target site from the site profile management page. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
msgstr ""
msgid "DastProfiles|You cannot run an active scan against an unvalidated site."
@@ -11041,7 +11199,7 @@ msgstr ""
msgid "Days to merge"
msgstr ""
-msgid "Deactivate dormant users after 90 days of inactivity. Users can return to active status by signing in to their account. While inactive, a user is not counted as an active user in the instance."
+msgid "Deactivate dormant users after 90 days of inactivity"
msgstr ""
msgid "Dear Administrator,"
@@ -11128,10 +11286,10 @@ msgstr ""
msgid "Define a custom pattern with cron syntax"
msgstr ""
-msgid "Define approval settings."
+msgid "Define approval rules."
msgstr ""
-msgid "Define approval settings. %{linkStart}Learn more.%{linkEnd}"
+msgid "Define approval rules. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "Define custom rules for what constitutes spam, independent of Akismet"
@@ -11140,7 +11298,7 @@ msgstr ""
msgid "Define environments in the deploy stage(s) in %{code_open}.gitlab-ci.yml%{code_close} to track deployments here."
msgstr ""
-msgid "Define how approval rules are applied as a merge request moves toward completion."
+msgid "Define how approval rules are applied to merge requests."
msgstr ""
msgid "Definition"
@@ -11155,6 +11313,12 @@ msgstr ""
msgid "DelayedJobs|Are you sure you want to run %{job_name} immediately? This job will run automatically after it's timer finishes."
msgstr ""
+msgid "DelayedJobs|Are you sure you want to run %{job_name} immediately? This job will run automatically after its timer finishes."
+msgstr ""
+
+msgid "DelayedJobs|Run the delayed job now?"
+msgstr ""
+
msgid "DelayedJobs|Start now"
msgstr ""
@@ -11440,6 +11604,12 @@ msgstr ""
msgid "Dependency proxy image prefix"
msgstr ""
+msgid "DependencyProxy|Create a local proxy for storing frequently used upstream images. %{docLinkStart}Learn more%{docLinkEnd} about dependency proxies."
+msgstr ""
+
+msgid "DependencyProxy|Dependency Proxy"
+msgstr ""
+
msgid "DependencyProxy|Toggle Dependency Proxy"
msgstr ""
@@ -11689,6 +11859,9 @@ msgstr ""
msgid "Deployments"
msgstr ""
+msgid "Deployments to Google Kubernetes Engine can be "
+msgstr ""
+
msgid "Deployments|%{deployments} environment impacted."
msgid_plural "Deployments|%{deployments} environments impacted."
msgstr[0] ""
@@ -11721,6 +11894,9 @@ msgstr ""
msgid "Deployment|success"
msgstr ""
+msgid "Deprecated API rate limits"
+msgstr ""
+
msgid "Deprioritize label"
msgstr ""
@@ -12123,6 +12299,22 @@ msgstr ""
msgid "DiffsCompareBaseBranch|(base)"
msgstr ""
+msgid "Diffs|%d addition"
+msgid_plural "Diffs|%d additions"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+msgid "Diffs|%d deletion"
+msgid_plural "Diffs|%d deletions"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
msgid "Diffs|No file name available"
msgstr ""
@@ -12132,9 +12324,20 @@ msgstr ""
msgid "Diffs|Show all unchanged lines"
msgstr ""
+msgid "Diffs|Showing %{dropdownStart}%{count} changed file%{dropdownEnd}"
+msgid_plural "Diffs|Showing %{dropdownStart}%{count} changed files%{dropdownEnd}"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
msgid "Diffs|Something went wrong while fetching diff lines."
msgstr ""
+msgid "Diffs|with %{additions} and %{deletions}"
+msgstr ""
+
msgid "Direct member"
msgstr ""
@@ -12263,9 +12466,6 @@ msgstr[2] ""
msgstr[3] ""
msgstr[4] ""
-msgid "Dismiss Value Stream Analytics introduction box"
-msgstr ""
-
msgid "Dismiss merge request promotion"
msgstr ""
@@ -12587,6 +12787,9 @@ msgstr ""
msgid "Edit issues"
msgstr ""
+msgid "Edit merge requests"
+msgstr ""
+
msgid "Edit public deploy key"
msgstr ""
@@ -12662,6 +12865,9 @@ msgstr ""
msgid "Elastic|None. Select projects to index."
msgstr ""
+msgid "Eligible users"
+msgstr ""
+
msgid "Email"
msgstr ""
@@ -12791,6 +12997,9 @@ msgstr ""
msgid "Enable"
msgstr ""
+msgid "Enable Amazon EKS integration"
+msgstr ""
+
msgid "Enable Auto DevOps"
msgstr ""
@@ -12824,6 +13033,9 @@ msgstr ""
msgid "Enable SSL verification"
msgstr ""
+msgid "Enable Service Ping"
+msgstr ""
+
msgid "Enable Snowplow tracking"
msgstr ""
@@ -12854,6 +13066,9 @@ msgstr ""
msgid "Enable authenticated Git LFS request rate limit"
msgstr ""
+msgid "Enable authenticated web request rate limit"
+msgstr ""
+
msgid "Enable authentication"
msgstr ""
@@ -12914,7 +13129,7 @@ msgstr ""
msgid "Enable or disable the Pseudonymizer data collection."
msgstr ""
-msgid "Enable or disable version check and service ping."
+msgid "Enable or disable version check and Service Ping."
msgstr ""
msgid "Enable protected paths rate limit"
@@ -12926,18 +13141,12 @@ msgstr ""
msgid "Enable reCAPTCHA"
msgstr ""
-msgid "Enable reCAPTCHA for login"
-msgstr ""
-
-msgid "Enable reCAPTCHA, Invisible Captcha, Akismet and set IP limits. For reCAPTCHA, we currently only support %{recaptcha_v2_link_start}v2%{recaptcha_v2_link_end}"
+msgid "Enable reCAPTCHA for login."
msgstr ""
msgid "Enable repository checks"
msgstr ""
-msgid "Enable service ping"
-msgstr ""
-
msgid "Enable shared runners for all projects and subgroups in this group."
msgstr ""
@@ -12959,7 +13168,10 @@ msgstr ""
msgid "Enable unauthenticated API request rate limit"
msgstr ""
-msgid "Enable unauthenticated request rate limit"
+msgid "Enable unauthenticated web request rate limit"
+msgstr ""
+
+msgid "Enable user deactivation emails"
msgstr ""
msgid "Enable version check"
@@ -12995,9 +13207,6 @@ msgstr ""
msgid "Enabled sources for code import during project creation. OmniAuth must be configured for GitHub"
msgstr ""
-msgid "Enabling this will only make licensed EE features available to projects if the project namespace's plan includes the feature or if the project is public."
-msgstr ""
-
msgid "Encountered an error while rendering: %{err}"
msgstr ""
@@ -13046,9 +13255,6 @@ msgstr ""
msgid "Enter Admin Mode"
msgstr ""
-msgid "Enter IP address range"
-msgstr ""
-
msgid "Enter a number"
msgstr ""
@@ -13061,9 +13267,6 @@ msgstr ""
msgid "Enter at least three characters to search"
msgstr ""
-msgid "Enter domain"
-msgstr ""
-
msgid "Enter in your Bitbucket Server URL and personal access token below"
msgstr ""
@@ -13250,9 +13453,6 @@ msgstr ""
msgid "Environments|Deployment %{status}"
msgstr ""
-msgid "Environments|Dismiss"
-msgstr ""
-
msgid "Environments|Enable review app"
msgstr ""
@@ -13265,9 +13465,6 @@ msgstr ""
msgid "Environments|Environments are places where code gets deployed, such as staging or production."
msgstr ""
-msgid "Environments|Help us improve environments"
-msgstr ""
-
msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
msgstr ""
@@ -13304,6 +13501,9 @@ msgstr ""
msgid "Environments|Note that this action will stop the environment, but it will %{emphasisStart}not%{emphasisEnd} have an effect on any existing deployment due to no “stop environment action†being defined in the %{ciConfigLinkStart}.gitlab-ci.yml%{ciConfigLinkEnd} file."
msgstr ""
+msgid "Environments|Open"
+msgstr ""
+
msgid "Environments|Open live environment"
msgstr ""
@@ -13343,9 +13543,6 @@ msgstr ""
msgid "Environments|Stopping %{environmentName}"
msgstr ""
-msgid "Environments|Take the survey"
-msgstr ""
-
msgid "Environments|There was an error fetching the logs. Please try again."
msgstr ""
@@ -13367,9 +13564,6 @@ msgstr ""
msgid "Environments|You don't have any environments right now"
msgstr ""
-msgid "Environments|Your feedback helps GitLab make environments better for you and other users. Participate and enter a sweepstake to win a USD 30 gift card."
-msgstr ""
-
msgid "Environments|by %{avatar}"
msgstr ""
@@ -13652,7 +13846,7 @@ msgstr ""
msgid "Error parsing CSV file. Please make sure it has"
msgstr ""
-msgid "Error rendering markdown preview"
+msgid "Error rendering Markdown preview"
msgstr ""
msgid "Error saving label update."
@@ -13700,6 +13894,9 @@ msgstr ""
msgid "Error: %{error_message}"
msgstr ""
+msgid "Error: Couldn't load some or all of the changes."
+msgstr ""
+
msgid "Error: No AWS credentials were supplied"
msgstr ""
@@ -13733,6 +13930,9 @@ msgstr ""
msgid "ErrorTracking|Enable error tracking"
msgstr ""
+msgid "ErrorTracking|Error tracking backend"
+msgstr ""
+
msgid "ErrorTracking|If you self-host Sentry, enter your Sentry instance's full URL. If you use Sentry's hosted solution, enter https://sentry.io"
msgstr ""
@@ -13766,6 +13966,12 @@ msgstr ""
msgid "Escalation policies must have at least one rule"
msgstr ""
+msgid "EscalationPolicies|%{clockIcon} IF alert is not %{alertStatus} in %{minutes}"
+msgstr ""
+
+msgid "EscalationPolicies|%{notificationIcon} THEN %{doAction} %{forScheduleOrUser}"
+msgstr ""
+
msgid "EscalationPolicies|+ Add an additional rule"
msgstr ""
@@ -13808,13 +14014,13 @@ msgstr ""
msgid "EscalationPolicies|Escalation policies"
msgstr ""
-msgid "EscalationPolicies|Escalation rules"
+msgid "EscalationPolicies|Escalation policy %{obstacle} in Project %{project}"
msgstr ""
-msgid "EscalationPolicies|Failed to load oncall-schedules"
+msgid "EscalationPolicies|Escalation rules"
msgstr ""
-msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} %{then} THEN %{doAction} %{scheduleOrUser}"
+msgid "EscalationPolicies|Failed to load oncall-schedules"
msgstr ""
msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} minutes"
@@ -13892,18 +14098,36 @@ msgstr ""
msgid "Every %{action} attempt has failed: %{job_error_message}. Please try again."
msgstr ""
+msgid "Every 3 months"
+msgstr ""
+
+msgid "Every 3 months on the %{day} at %{time} %{timezone}"
+msgstr ""
+
+msgid "Every 6 months"
+msgstr ""
+
+msgid "Every 6 months on the %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Every day"
msgstr ""
msgid "Every day (at %{time})"
msgstr ""
+msgid "Every day at %{time} %{timezone}"
+msgstr ""
+
msgid "Every month"
msgstr ""
msgid "Every month (Day %{day} at %{time})"
msgstr ""
+msgid "Every month on the %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Every three months"
msgstr ""
@@ -13921,6 +14145,15 @@ msgstr[4] ""
msgid "Every week (%{weekday} at %{time})"
msgstr ""
+msgid "Every week on %{day} at %{time} %{timezone}"
+msgstr ""
+
+msgid "Every year"
+msgstr ""
+
+msgid "Every year on %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Everyone"
msgstr ""
@@ -13957,9 +14190,6 @@ msgstr ""
msgid "Exactly one of %{attributes} is required"
msgstr ""
-msgid "Example: %{ip_address}. %{read_more_link}."
-msgstr ""
-
msgid "Example: @sub\\.company\\.com$"
msgstr ""
@@ -14026,13 +14256,13 @@ msgstr ""
msgid "Expand pipeline"
msgstr ""
-msgid "Expand sidebar"
+msgid "Expand settings section"
msgstr ""
-msgid "Expected documents: %{expected_documents}"
+msgid "Expand sidebar"
msgstr ""
-msgid "Experienced"
+msgid "Expected documents: %{expected_documents}"
msgstr ""
msgid "ExperimentSubject|Must have exactly one of User, Namespace, or Project."
@@ -14317,9 +14547,6 @@ msgstr ""
msgid "Failed to load related branches"
msgstr ""
-msgid "Failed to load sidebar lock status"
-msgstr ""
-
msgid "Failed to load stacktrace."
msgstr ""
@@ -14750,6 +14977,9 @@ msgstr ""
msgid "Files"
msgstr ""
+msgid "Files API Rate Limits"
+msgstr ""
+
msgid "Files breadcrumb"
msgstr ""
@@ -15749,6 +15979,9 @@ msgstr ""
msgid "GitLab group: %{source_link}"
msgstr ""
+msgid "GitLab informs you if a new version is available."
+msgstr ""
+
msgid "GitLab is a complete DevOps platform, delivered as a single application, fundamentally changing the way Development, Security, and Ops teams collaborate"
msgstr ""
@@ -15764,7 +15997,7 @@ msgstr ""
msgid "GitLab is open source software to collaborate on code."
msgstr ""
-msgid "GitLab is undergoing maintenance and is operating in a read-only mode."
+msgid "GitLab is undergoing maintenance and is operating in read-only mode."
msgstr ""
msgid "GitLab member or Email address"
@@ -15776,9 +16009,6 @@ msgstr ""
msgid "GitLab project export"
msgstr ""
-msgid "GitLab restart is required to apply changes."
-msgstr ""
-
msgid "GitLab single sign-on URL"
msgstr ""
@@ -15794,9 +16024,6 @@ msgstr ""
msgid "GitLab version"
msgstr ""
-msgid "GitLab will inform you if a new version is available."
-msgstr ""
-
msgid "GitLab will run a background job that will produce pseudonymized CSVs of the GitLab database that will be uploaded to your configured object storage directory."
msgstr ""
@@ -16061,9 +16288,21 @@ msgstr ""
msgid "Go to snippets"
msgstr ""
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check 'Allowed domains for sign-ups'."
+msgstr ""
+
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check 'Email restrictions for sign-ups'."
+msgstr ""
+
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check the 'Domain denylist'."
+msgstr ""
+
msgid "Go to the activity feed"
msgstr ""
+msgid "Go to the group’s 'Settings &gt; General' page, and check 'Restrict membership by email domain'."
+msgstr ""
+
msgid "Go to the milestone list"
msgstr ""
@@ -16100,6 +16339,12 @@ msgstr ""
msgid "Goal of the changes and what reviewers should be aware of"
msgstr ""
+msgid "Google Cloud"
+msgstr ""
+
+msgid "Google Cloud offers several deployment targets. Select the one most suitable for your project."
+msgstr ""
+
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
@@ -16184,9 +16429,6 @@ msgstr ""
msgid "Group ID"
msgstr ""
-msgid "Group ID: %{group_id}"
-msgstr ""
-
msgid "Group Owner must have signed in with SAML before enabling Group Managed Accounts"
msgstr ""
@@ -16361,6 +16603,12 @@ msgstr ""
msgid "GroupImport|Unable to process group import file"
msgstr ""
+msgid "GroupPage|Copy group ID"
+msgstr ""
+
+msgid "GroupPage|Group ID: %{group_id}"
+msgstr ""
+
msgid "GroupRoadmap|%{dateWord} – No end date"
msgstr ""
@@ -16415,6 +16663,9 @@ msgstr ""
msgid "GroupRoadmap|Within 3 years"
msgstr ""
+msgid "GroupSAML|\"persistent\" recommended"
+msgstr ""
+
msgid "GroupSAML|%{strongOpen}Warning%{strongClose} - Enabling %{linkStart}SSO enforcement%{linkEnd} can reduce security risks."
msgstr ""
@@ -16547,6 +16798,9 @@ msgstr ""
msgid "GroupSAML|To be able to prohibit outer forks, you first need to enforce dedicate group managed accounts."
msgstr ""
+msgid "GroupSAML|Use SAML group links to manage group membership using SAML."
+msgstr ""
+
msgid "GroupSAML|Valid SAML Response"
msgstr ""
@@ -16559,13 +16813,10 @@ msgstr ""
msgid "GroupSAML|as %{access_level}"
msgstr ""
-msgid "GroupSAML|must match stored NameID of \"%{extern_uid}\" as we use this to identify users. If the NameID changes users will be unable to sign in."
-msgstr ""
-
-msgid "GroupSAML|should be \"persistent\""
+msgid "GroupSAML|must match stored NameID of \"%{extern_uid}\" to identify user and allow sign in"
msgstr ""
-msgid "GroupSAML|should be a random persistent ID, emails are discouraged"
+msgid "GroupSAML|recommend persistent ID instead of email"
msgstr ""
msgid "GroupSelect|No matching results"
@@ -16580,9 +16831,15 @@ msgstr ""
msgid "GroupSettings|Allow project access token creation"
msgstr ""
+msgid "GroupSettings|Applied to all subgroups unless overridden by a group owner. Groups already added to the project lose access."
+msgstr ""
+
msgid "GroupSettings|Auto DevOps pipeline was updated for the group"
msgstr ""
+msgid "GroupSettings|Available only on the top-level group. Applies to all subgroups. Groups already shared with a group outside %{group} are still shared unless removed manually."
+msgstr ""
+
msgid "GroupSettings|Badges"
msgstr ""
@@ -16634,6 +16891,9 @@ msgstr ""
msgid "GroupSettings|New runners registration token has been generated!"
msgstr ""
+msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgstr ""
+
msgid "GroupSettings|Pipeline settings was updated for the group"
msgstr ""
@@ -16646,12 +16906,15 @@ msgstr ""
msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
-msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups."
+msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups"
msgstr ""
msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
msgstr ""
+msgid "GroupSettings|Prevents group members from being notified if the group is mentioned."
+msgstr ""
+
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
msgstr ""
@@ -16688,21 +16951,6 @@ msgstr ""
msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}."
msgstr ""
-msgid "GroupSettings|This setting is only available on the top-level group and it applies to all subgroups. Groups that have already been shared with a group outside %{group} will still be shared, and this access will have to be revoked manually."
-msgstr ""
-
-msgid "GroupSettings|This setting will be applied to all subgroups unless overridden by a group owner. Groups that already have access to the project will continue to have access unless removed manually."
-msgstr ""
-
-msgid "GroupSettings|This setting will override user notification preferences for all members of the group, subgroups, and projects."
-msgstr ""
-
-msgid "GroupSettings|This setting will prevent group members from being notified if the group is mentioned."
-msgstr ""
-
-msgid "GroupSettings|This setting will prevent group members from forking projects outside of the group."
-msgstr ""
-
msgid "GroupSettings|Transfer group"
msgstr ""
@@ -16820,7 +17068,7 @@ msgstr ""
msgid "GroupsNew|No import options available"
msgstr ""
-msgid "GroupsNew|Not all related objects are migrated, as %{docs_link_start}described here%{docs_link_end}. Please %{feedback_link_start}leave feedback%{feedback_link_end} on this feature."
+msgid "GroupsNew|Not all related objects are migrated. %{docs_link_start}More info%{docs_link_end}."
msgstr ""
msgid "GroupsNew|Personal access token"
@@ -16952,15 +17200,27 @@ msgstr ""
msgid "Hello %{name},"
msgstr ""
-msgid "Hello there"
-msgstr ""
-
msgid "Hello, %{name}!"
msgstr ""
msgid "Hello, %{username}!"
msgstr ""
+msgid "HelloMessage|%{handshake_emoji} Contribute to GitLab: %{contribute_link}"
+msgstr ""
+
+msgid "HelloMessage|%{magnifier_emoji} Create a new GitLab issue: %{new_issue_link}"
+msgstr ""
+
+msgid "HelloMessage|%{rocket_emoji} We like your curiosity! Help us improve GitLab by joining the team: %{jobs_page_link}"
+msgstr ""
+
+msgid "HelloMessage|Does this page need fixes or improvements? Open an issue or contribute a merge request to help make GitLab more lovable. At GitLab, everyone can contribute!"
+msgstr ""
+
+msgid "HelloMessage|Welcome to GitLab!"
+msgstr ""
+
msgid "Help"
msgstr ""
@@ -16970,13 +17230,10 @@ msgstr ""
msgid "Helps prevent bots from creating accounts."
msgstr ""
-msgid "Helps prevent bots from creating issues"
+msgid "Helps prevent bots from creating issues."
msgstr ""
-msgid "Helps prevent malicious users hide their activity"
-msgstr ""
-
-msgid "Helps reduce request volume (e.g. from crawlers or abusive bots)"
+msgid "Helps prevent malicious users hide their activity."
msgstr ""
msgid "Helps reduce request volume (for example, from crawlers or abusive bots)"
@@ -17106,6 +17363,12 @@ msgstr ""
msgid "Housekeeping, export, path, transfer, remove, archive."
msgstr ""
+msgid "How do I configure Akismet?"
+msgstr ""
+
+msgid "How do I configure it?"
+msgstr ""
+
msgid "How do I configure runners?"
msgstr ""
@@ -17127,19 +17390,25 @@ msgstr ""
msgid "How do I set up this service?"
msgstr ""
+msgid "How do I use a web terminal?"
+msgstr ""
+
+msgid "How do I use file templates?"
+msgstr ""
+
msgid "How it works"
msgstr ""
msgid "How many days need to pass between marking entity for deletion and actual removing it."
msgstr ""
-msgid "How many seconds an IP will be counted towards the limit"
+msgid "How many seconds an IP counts toward the IP address limit."
msgstr ""
-msgid "I accept the %{terms_link}"
+msgid "How the job limiter handles jobs exceeding the thresholds specified below. The 'track' mode only logs the jobs. The 'compress' mode compresses the jobs and raises an exception if the compressed size exceeds the limit."
msgstr ""
-msgid "I accept the|Terms of Service and Privacy Policy"
+msgid "I accept the %{terms_link}"
msgstr ""
msgid "I forgot my password"
@@ -17223,13 +17492,16 @@ msgstr ""
msgid "IP Address"
msgstr ""
-msgid "IP expiration time"
+msgid "IP address expiration time"
msgstr ""
-msgid "IP subnet restriction only allowed for top-level groups"
+msgid "IP address restrictions"
+msgstr ""
+
+msgid "IP addresses per user"
msgstr ""
-msgid "IPs per user"
+msgid "IP subnet restriction only allowed for top-level groups"
msgstr ""
msgid "Identifier"
@@ -17244,6 +17516,9 @@ msgstr ""
msgid "If any indexed field exceeds this limit it will be truncated to this number of characters and the rest will not be indexed or searchable. This does not apply to repository and wiki indexing. Setting this to 0 means it is unlimited."
msgstr ""
+msgid "If blank, defaults to %{code_open}Retry later%{code_close}."
+msgstr ""
+
msgid "If blank, set allowable lifetime to %{instance_level_policy_in_words}, as defined by the instance admin. Once set, existing tokens for users in this group may be revoked."
msgstr ""
@@ -17295,6 +17570,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 did not initiate these sign-in attempts, please reach out to your administrator or enable two-factor authentication (2FA) on your account."
+msgstr ""
+
msgid "If you did not initiate this change, please contact your administrator immediately."
msgstr ""
@@ -17392,10 +17670,10 @@ msgstr ""
msgid "Import Projects from Gitea"
msgstr ""
-msgid "Import a project"
+msgid "Import an exported GitLab project"
msgstr ""
-msgid "Import an exported GitLab project"
+msgid "Import and export rate limits"
msgstr ""
msgid "Import failed due to a GitHub error: %{original}"
@@ -17407,12 +17685,18 @@ msgstr ""
msgid "Import from Jira"
msgstr ""
+msgid "Import group"
+msgstr ""
+
msgid "Import group from file"
msgstr ""
msgid "Import groups"
msgstr ""
+msgid "Import history"
+msgstr ""
+
msgid "Import in progress"
msgstr ""
@@ -17476,7 +17760,25 @@ msgstr ""
msgid "Import timed out. Import took longer than %{import_jobs_expiration} seconds"
msgstr ""
-msgid "Import/Export Rate Limits"
+msgid "ImportAProjectModal|Import from a project"
+msgstr ""
+
+msgid "ImportAProjectModal|Import members from another project"
+msgstr ""
+
+msgid "ImportAProjectModal|Import project members"
+msgstr ""
+
+msgid "ImportAProjectModal|Only project members (not group members) are imported, and they get the same permissions as the project you import from."
+msgstr ""
+
+msgid "ImportAProjectModal|Successfully imported"
+msgstr ""
+
+msgid "ImportAProjectModal|Unable to import project members"
+msgstr ""
+
+msgid "ImportAProjectModal|You're importing members to the %{strongStart}%{name}%{strongEnd} project."
msgstr ""
msgid "ImportButtons|Connect repositories from"
@@ -17532,7 +17834,7 @@ msgstr[4] ""
msgid "Importing..."
msgstr ""
-msgid "Import|A repository URL usually ends in a .git suffix, although this is not required. Double check to make sure your repository URL is correct."
+msgid "Import|There is not a valid Git repository at this URL. If your HTTP repository is not publicly accessible, verify your credentials."
msgstr ""
msgid "Improve customer support with Service Desk"
@@ -17541,9 +17843,6 @@ msgstr ""
msgid "Improves Git cloning performance."
msgstr ""
-msgid "In %{time_to_now}"
-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 ""
@@ -17829,7 +18128,7 @@ msgstr ""
msgid "InProductMarketing|Start a GitLab Ultimate trial today in less than one minute, no credit card required."
msgstr ""
-msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no CC required"
+msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no credit card required"
msgstr ""
msgid "InProductMarketing|Start a trial"
@@ -17868,7 +18167,7 @@ msgstr ""
msgid "InProductMarketing|Team up in GitLab for greater efficiency"
msgstr ""
-msgid "InProductMarketing|Team work makes the dream work"
+msgid "InProductMarketing|Team work makes the dream work"
msgstr ""
msgid "InProductMarketing|Test, create, deploy"
@@ -18452,6 +18751,9 @@ msgstr ""
msgid "Integrations|Create new issue in Jira"
msgstr ""
+msgid "Integrations|Create new issue in ZenTao"
+msgstr ""
+
msgid "Integrations|Default settings are inherited from the group level."
msgstr ""
@@ -18545,9 +18847,15 @@ msgstr ""
msgid "Integrations|Search Jira issues"
msgstr ""
+msgid "Integrations|Search ZenTao issues"
+msgstr ""
+
msgid "Integrations|Send notifications about project events to Unify Circuit."
msgstr ""
+msgid "Integrations|Send notifications about project events to a Unify Circuit conversation. %{docs_link}"
+msgstr ""
+
msgid "Integrations|Sign in to add namespaces"
msgstr ""
@@ -18587,6 +18895,9 @@ msgstr ""
msgid "Integrations|You've activated every integration 🎉"
msgstr ""
+msgid "Integrations|ZenTao issues display here when you create issues in your project in ZenTao."
+msgstr ""
+
msgid "Interactive mode"
msgstr ""
@@ -18614,9 +18925,6 @@ msgstr ""
msgid "Interval Pattern"
msgstr ""
-msgid "Introducing Value Stream Analytics"
-msgstr ""
-
msgid "Introducing Your DevOps Report"
msgstr ""
@@ -18713,6 +19021,12 @@ msgstr ""
msgid "Investigate vulnerability: %{title}"
msgstr ""
+msgid "Invisible Captcha"
+msgstr ""
+
+msgid "Invisible Captcha helps prevent the creation of spam accounts. It adds a honeypot field and time-sensitive form submission to the account signup form."
+msgstr ""
+
msgid "Invitation"
msgstr ""
@@ -19166,12 +19480,18 @@ msgstr ""
msgid "Issues"
msgstr ""
+msgid "Issues I've created"
+msgstr ""
+
msgid "Issues Rate Limits"
msgstr ""
msgid "Issues and merge requests"
msgstr ""
+msgid "Issues assigned to me"
+msgstr ""
+
msgid "Issues can be bugs, tasks or ideas to be discussed. Also, issues are searchable and filterable."
msgstr ""
@@ -19283,7 +19603,7 @@ msgstr ""
msgid "Iterations|Create cadence"
msgstr ""
-msgid "Iterations|Create your first iteration"
+msgid "Iterations|Create iteration"
msgstr ""
msgid "Iterations|Delete cadence"
@@ -19292,6 +19612,9 @@ msgstr ""
msgid "Iterations|Delete iteration cadence?"
msgstr ""
+msgid "Iterations|Delete iteration?"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -19325,12 +19648,18 @@ msgstr ""
msgid "Iterations|New iteration cadence"
msgstr ""
+msgid "Iterations|No closed iterations."
+msgstr ""
+
msgid "Iterations|No iteration cadences to show."
msgstr ""
msgid "Iterations|No iterations in cadence."
msgstr ""
+msgid "Iterations|No open iterations."
+msgstr ""
+
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
@@ -19361,6 +19690,9 @@ msgstr ""
msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
msgstr ""
+msgid "Iterations|This will remove the iteration from any issues that are assigned to it."
+msgstr ""
+
msgid "Iterations|Title"
msgstr ""
@@ -19376,15 +19708,9 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "I’m familiar with the basics of DevOps."
-msgstr ""
-
msgid "I’m joining my team who’s already on GitLab"
msgstr ""
-msgid "I’m not familiar with the basics of DevOps."
-msgstr ""
-
msgid "Jaeger URL"
msgstr ""
@@ -19649,6 +19975,9 @@ msgstr ""
msgid "Job"
msgstr ""
+msgid "Job %{jobName}"
+msgstr ""
+
msgid "Job Failed #%{build_id}"
msgstr ""
@@ -20242,9 +20571,6 @@ msgstr ""
msgid "Learn more in the"
msgstr ""
-msgid "Learn more in the|pipeline schedules documentation"
-msgstr ""
-
msgid "Learn more."
msgstr ""
@@ -20356,9 +20682,6 @@ msgstr ""
msgid "Leave Admin Mode"
msgstr ""
-msgid "Leave blank for no limit. Once set, existing personal access tokens may be revoked."
-msgstr ""
-
msgid "Leave edit mode? All unsaved changes will be lost."
msgstr ""
@@ -20404,10 +20727,10 @@ msgstr ""
msgid "LicenseCompliance|Acceptable license to be used in the project"
msgstr ""
-msgid "LicenseCompliance|Add a license"
+msgid "LicenseCompliance|Add license and related policy"
msgstr ""
-msgid "LicenseCompliance|Add license and related policy"
+msgid "LicenseCompliance|Add license policy"
msgstr ""
msgid "LicenseCompliance|Allow"
@@ -20515,6 +20838,9 @@ msgstr ""
msgid "LicenseManagement|Uncategorized"
msgstr ""
+msgid "Licensed Enterprise Edition features can be used if the project namespace's plan includes the feature, or if the project is public."
+msgstr ""
+
msgid "Licensed Features"
msgstr ""
@@ -20581,7 +20907,10 @@ msgstr ""
msgid "Limit namespaces and projects that can be indexed"
msgstr ""
-msgid "Limit sign in from multiple ips"
+msgid "Limit project size at a global, group, and project level. %{link_start}Learn more%{link_end}."
+msgstr ""
+
+msgid "Limit sign in from multiple IP addresses"
msgstr ""
msgid "Limit the number of concurrent operations this secondary site can run in the background."
@@ -20593,6 +20922,9 @@ msgstr ""
msgid "Limit the number of issues and epics per minute a user can create through web and API requests."
msgstr ""
+msgid "Limit the size of Sidekiq jobs stored in Redis."
+msgstr ""
+
msgid "Limited to showing %d event at most"
msgid_plural "Limited to showing %d events at most"
msgstr[0] ""
@@ -20601,6 +20933,9 @@ msgstr[2] ""
msgstr[3] ""
msgstr[4] ""
+msgid "Limiting mode"
+msgstr ""
+
msgid "Line changes"
msgstr ""
@@ -20670,9 +21005,6 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
-msgid "List of users to be excluded from the limit"
-msgstr ""
-
msgid "List options"
msgstr ""
@@ -20712,9 +21044,6 @@ msgstr ""
msgid "Loading functions timed out. Please reload the page to try again."
msgstr ""
-msgid "Loading issues"
-msgstr ""
-
msgid "Loading more"
msgstr ""
@@ -21006,6 +21335,9 @@ msgstr ""
msgid "Marked For Deletion At - %{deletion_time}"
msgstr ""
+msgid "Marked as ready. Merging is now allowed."
+msgstr ""
+
msgid "Marked this %{noun} as a draft."
msgstr ""
@@ -21078,52 +21410,22 @@ msgstr ""
msgid "Max 100,000 events"
msgstr ""
-msgid "Max 20 characters"
-msgstr ""
-
-msgid "Max Group Export Download requests per minute per user"
-msgstr ""
-
-msgid "Max Group Export requests per minute per user"
-msgstr ""
-
-msgid "Max Group Import requests per minute per user"
-msgstr ""
-
-msgid "Max Project Export Download requests per minute per user"
-msgstr ""
-
-msgid "Max Project Export requests per minute per user"
-msgstr ""
-
-msgid "Max Project Import requests per minute per user"
-msgstr ""
-
-msgid "Max authenticated API requests per period per user"
-msgstr ""
-
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
-msgid "Max authenticated web requests per period per user"
-msgstr ""
-
msgid "Max file size is 200 KB."
msgstr ""
-msgid "Max requests per minute per user"
-msgstr ""
-
msgid "Max role"
msgstr ""
msgid "Max session time"
msgstr ""
-msgid "Max unauthenticated requests per period per IP"
+msgid "MaxBuilds"
msgstr ""
-msgid "MaxBuilds"
+msgid "Maximum 20 characters"
msgstr ""
msgid "Maximum Conan package file size in bytes"
@@ -21159,6 +21461,12 @@ msgstr ""
msgid "Maximum attachment size (MB)"
msgstr ""
+msgid "Maximum authenticated API requests per rate limit period per user"
+msgstr ""
+
+msgid "Maximum authenticated web requests per rate limit period per user"
+msgstr ""
+
msgid "Maximum bulk request size (MiB)"
msgstr ""
@@ -21204,6 +21512,15 @@ msgstr ""
msgid "Maximum files in a diff"
msgstr ""
+msgid "Maximum group export download requests per minute"
+msgstr ""
+
+msgid "Maximum group export requests per minute"
+msgstr ""
+
+msgid "Maximum group import requests per minute"
+msgstr ""
+
msgid "Maximum import size"
msgstr ""
@@ -21240,7 +21557,7 @@ msgstr ""
msgid "Maximum number of projects."
msgstr ""
-msgid "Maximum number of unique IPs per user"
+msgid "Maximum number of unique IP addresses per user."
msgstr ""
msgid "Maximum page reached"
@@ -21249,12 +21566,24 @@ msgstr ""
msgid "Maximum page size"
msgstr ""
+msgid "Maximum project export download requests per minute"
+msgstr ""
+
+msgid "Maximum project export requests per minute"
+msgstr ""
+
+msgid "Maximum project import requests per minute"
+msgstr ""
+
msgid "Maximum push size"
msgstr ""
msgid "Maximum push size (MB)"
msgstr ""
+msgid "Maximum requests per minute"
+msgstr ""
+
msgid "Maximum running slices"
msgstr ""
@@ -21282,10 +21611,16 @@ msgstr ""
msgid "Maximum time between updates that a mirror can have when scheduled to synchronize."
msgstr ""
-msgid "Maximum time for web terminal websocket connection (in seconds). 0 for unlimited."
+msgid "Maximum time that users are allowed to skip the setup of two-factor authentication (in hours). Set to 0 (zero) to enforce at next sign in."
msgstr ""
-msgid "Maximum time that users are allowed to skip the setup of two-factor authentication (in hours). Set to 0 (zero) to enforce at next sign in."
+msgid "Maximum time, in seconds, for a web terminal websocket connection. 0 for unlimited."
+msgstr ""
+
+msgid "Maximum unauthenticated API requests per rate limit period per IP"
+msgstr ""
+
+msgid "Maximum unauthenticated web requests per rate limit period per IP"
msgstr ""
msgid "May"
@@ -21303,9 +21638,6 @@ msgstr ""
msgid "Medium vulnerabilities present"
msgstr ""
-msgid "Member lock"
-msgstr ""
-
msgid "Member since"
msgstr ""
@@ -21342,6 +21674,9 @@ msgstr ""
msgid "Members of a group may only view projects they have permission to access"
msgstr ""
+msgid "Membership"
+msgstr ""
+
msgid "Members|%{time} by %{user}"
msgstr ""
@@ -21402,9 +21737,6 @@ msgstr ""
msgid "Members|Expiration date updated successfully."
msgstr ""
-msgid "Members|Expired"
-msgstr ""
-
msgid "Members|Filter members"
msgstr ""
@@ -21420,9 +21752,6 @@ msgstr ""
msgid "Members|Membership"
msgstr ""
-msgid "Members|No expiration set"
-msgstr ""
-
msgid "Members|Remove \"%{groupName}\""
msgstr ""
@@ -21444,9 +21773,6 @@ msgstr ""
msgid "Members|Search invited"
msgstr ""
-msgid "Members|in %{time}"
-msgstr ""
-
msgid "Member|Deny access"
msgstr ""
@@ -21522,9 +21848,6 @@ msgstr ""
msgid "Merge request %{mr_link} was reviewed by %{mr_author}"
msgstr ""
-msgid "Merge request (MR) approvals"
-msgstr ""
-
msgid "Merge request analytics"
msgstr ""
@@ -21546,12 +21869,21 @@ msgstr ""
msgid "Merge requests"
msgstr ""
+msgid "Merge requests I've created"
+msgstr ""
+
msgid "Merge requests are a place to propose changes you've made to a project and discuss those changes with others"
msgstr ""
msgid "Merge requests are read-only in a secondary Geo node"
msgstr ""
+msgid "Merge requests assigned to me"
+msgstr ""
+
+msgid "Merge requests that I'm a reviewer"
+msgstr ""
+
msgid "Merge the branch and fix any conflicts that come up"
msgstr ""
@@ -21612,10 +21944,10 @@ msgstr ""
msgid "MergeRequests|An error occurred while saving the draft comment."
msgstr ""
-msgid "MergeRequests|Failed to squash. Should be done manually."
+msgid "MergeRequests|Create issue to resolve thread"
msgstr ""
-msgid "MergeRequests|Resolve this thread in a new issue"
+msgid "MergeRequests|Failed to squash. Should be done manually."
msgstr ""
msgid "MergeRequests|Saving the comment failed"
@@ -22435,6 +22767,9 @@ msgstr ""
msgid "MoveIssue|Cannot move issue to project it originates from!"
msgstr ""
+msgid "MoveIssue|Cannot move issues of '%{issue_type}' type."
+msgstr ""
+
msgid "Moved issue to %{label} column in the board."
msgstr ""
@@ -22563,6 +22898,15 @@ 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. To learn more about reducing storage capacity please visit our docs."
msgstr ""
+msgid "NamespaceUserCap|Pending users must be reviewed and approved by a group owner. Learn more about %{user_caps_link_start}User Caps%{link_end} and %{users_pending_approval_link_start}Users Pending Approval%{link_end}."
+msgstr ""
+
+msgid "NamespaceUserCap|View pending user approvals"
+msgstr ""
+
+msgid "NamespaceUserCap|Your group has reached its billable member limit"
+msgstr ""
+
msgid "Namespaces"
msgstr ""
@@ -22605,9 +22949,6 @@ msgstr ""
msgid "Network"
msgstr ""
-msgid "Network Policy|New rule"
-msgstr ""
-
msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is inbound from a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
msgstr ""
@@ -22629,16 +22970,13 @@ msgstr ""
msgid "NetworkPolicies|%{strongOpen}any%{strongClose} port"
msgstr ""
-msgid "NetworkPolicies|+ Add alert"
-msgstr ""
-
msgid "NetworkPolicies|.yaml"
msgstr ""
msgid "NetworkPolicies|.yaml mode"
msgstr ""
-msgid "NetworkPolicies|Actions"
+msgid "NetworkPolicies|Add alert"
msgstr ""
msgid "NetworkPolicies|Alerts are intended to be selectively used for a limited number of events that are potentially concerning and warrant a manual review. Alerts should not be used as a substitute for a SIEM or a logging tool. High volume alerts are likely to be dropped so as to preserve the stability of GitLab's integration with Kubernetes."
@@ -22674,9 +23012,6 @@ msgstr ""
msgid "NetworkPolicies|Deny all traffic"
msgstr ""
-msgid "NetworkPolicies|Description"
-msgstr ""
-
msgid "NetworkPolicies|Edit policy"
msgstr ""
@@ -22689,9 +23024,6 @@ msgstr ""
msgid "NetworkPolicies|IP/subnet"
msgstr ""
-msgid "NetworkPolicies|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
-msgstr ""
-
msgid "NetworkPolicies|Invalid or empty policy"
msgstr ""
@@ -22701,19 +23033,16 @@ msgstr ""
msgid "NetworkPolicies|Kubernetes error: %{error}"
msgstr ""
-msgid "NetworkPolicies|Name"
-msgstr ""
-
msgid "NetworkPolicies|Network"
msgstr ""
-msgid "NetworkPolicies|Network traffic"
+msgid "NetworkPolicies|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
msgstr ""
-msgid "NetworkPolicies|New policy"
+msgid "NetworkPolicies|Network policy can be created after the environment is loaded successfully."
msgstr ""
-msgid "NetworkPolicies|No policies detected"
+msgid "NetworkPolicies|Network traffic"
msgstr ""
msgid "NetworkPolicies|None selected"
@@ -22722,21 +23051,12 @@ msgstr ""
msgid "NetworkPolicies|Please %{installLinkStart}install%{installLinkEnd} and %{configureLinkStart}configure a Kubernetes Agent for this project%{configureLinkEnd} to enable alerts."
msgstr ""
-msgid "NetworkPolicies|Policies are a specification of how groups of pods are allowed to communicate with each other's network endpoints."
-msgstr ""
-
msgid "NetworkPolicies|Policy %{policyName} was successfully changed"
msgstr ""
msgid "NetworkPolicies|Policy definition"
msgstr ""
-msgid "NetworkPolicies|Policy editor"
-msgstr ""
-
-msgid "NetworkPolicies|Policy preview"
-msgstr ""
-
msgid "NetworkPolicies|Rule"
msgstr ""
@@ -22746,9 +23066,6 @@ msgstr ""
msgid "NetworkPolicies|Rule mode is unavailable for this policy. In some cases, we cannot parse the YAML file back into the rules editor."
msgstr ""
-msgid "NetworkPolicies|Rules"
-msgstr ""
-
msgid "NetworkPolicies|Save changes"
msgstr ""
@@ -22761,9 +23078,6 @@ msgstr ""
msgid "NetworkPolicies|Traffic that does not match any rule will be blocked."
msgstr ""
-msgid "NetworkPolicies|Unable to parse policy"
-msgstr ""
-
msgid "NetworkPolicies|all DNS names"
msgstr ""
@@ -22946,6 +23260,9 @@ msgstr ""
msgid "New issue"
msgstr ""
+msgid "New issue in %{project}"
+msgstr ""
+
msgid "New issue title"
msgstr ""
@@ -23024,7 +23341,7 @@ msgstr ""
msgid "Newest first"
msgstr ""
-msgid "Newly registered users will by default be external"
+msgid "Newly-registered users are external by default"
msgstr ""
msgid "Next"
@@ -23339,8 +23656,13 @@ msgstr ""
msgid "No webhooks found, add one in the form above."
msgstr ""
-msgid "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} to renew your subscription."
-msgstr ""
+msgid "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} day to renew your subscription."
+msgid_plural "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} days to renew your subscription."
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
msgid "No. of commits"
msgstr ""
@@ -23357,7 +23679,7 @@ msgstr ""
msgid "Nodes"
msgstr ""
-msgid "Non-admin users can sign in with read-only access and make read-only API requests."
+msgid "Non-admin users are restricted to read-only access, in both GitLab UI and API."
msgstr ""
msgid "None"
@@ -23438,7 +23760,7 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
-msgid "Notes Rate Limits"
+msgid "Notes rate limit"
msgstr ""
msgid "Notes|Are you sure you want to cancel creating this comment?"
@@ -23617,9 +23939,6 @@ msgstr ""
msgid "November"
msgstr ""
-msgid "Novice"
-msgstr ""
-
msgid "Now, personalize your GitLab experience"
msgstr ""
@@ -23788,7 +24107,7 @@ msgstr ""
msgid "OnCallSchedules|For this rotation, on-call will be:"
msgstr ""
-msgid "OnCallSchedules|On-call schedule %{schedule} in Project %{project}"
+msgid "OnCallSchedules|On-call schedule %{obstacle} in Project %{project}"
msgstr ""
msgid "OnCallSchedules|On-call schedules"
@@ -23935,22 +24254,22 @@ msgstr ""
msgid "OnDemandScans|Scanner profile"
msgstr ""
-msgid "OnDemandScans|Select one of the existing profiles"
+msgid "OnDemandScans|Schedule scan"
msgstr ""
-msgid "OnDemandScans|Site profile"
+msgid "OnDemandScans|Select one of the existing profiles"
msgstr ""
-msgid "OnDemandScans|Use existing scanner profile"
+msgid "OnDemandScans|Site profile"
msgstr ""
-msgid "OnDemandScans|Use existing site profile"
+msgid "OnDemandScans|Start time"
msgstr ""
-msgid "OnDemandScans|You can either choose a passive scan or validate the target site in your chosen site profile. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
+msgid "OnDemandScans|Use existing scanner profile"
msgstr ""
-msgid "OnDemandScans|You cannot run an active scan against an unvalidated site."
+msgid "OnDemandScans|Use existing site profile"
msgstr ""
msgid "OnDemandScans|You must create a repository within your project to run an on-demand scan."
@@ -24018,6 +24337,9 @@ msgstr ""
msgid "Only admins can delete project"
msgstr ""
+msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
+msgstr ""
+
msgid "Only include features new to your current subscription tier."
msgstr ""
@@ -24036,6 +24358,12 @@ msgstr ""
msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
+msgid "Only reCAPTCHA v2 is supported:"
+msgstr ""
+
+msgid "Only users from the specified IP address ranges are able to reach this group, including all subgroups, projects, and Git repositories."
+msgstr ""
+
msgid "Only verified users with an email address in any of these domains can be added to the group."
msgstr ""
@@ -24222,9 +24550,6 @@ msgstr ""
msgid "Package Registry"
msgstr ""
-msgid "Package Registry Rate Limits"
-msgstr ""
-
msgid "Package Registry: authenticated API requests"
msgstr ""
@@ -24243,6 +24568,9 @@ msgstr ""
msgid "Package recipe already exists"
msgstr ""
+msgid "Package registry rate limits"
+msgstr ""
+
msgid "Package type"
msgstr ""
@@ -24309,6 +24637,9 @@ msgstr ""
msgid "PackageRegistry|Composer"
msgstr ""
+msgid "PackageRegistry|Composer.json with license: %{license} and version: %{version}"
+msgstr ""
+
msgid "PackageRegistry|Conan"
msgstr ""
@@ -24372,6 +24703,9 @@ msgstr ""
msgid "PackageRegistry|Copy require package include"
msgstr ""
+msgid "PackageRegistry|Copy target SHA"
+msgstr ""
+
msgid "PackageRegistry|Copy yarn command"
msgstr ""
@@ -24438,6 +24772,9 @@ msgstr ""
msgid "PackageRegistry|Install package version"
msgstr ""
+msgid "PackageRegistry|Instance-level"
+msgstr ""
+
msgid "PackageRegistry|Invalid Package: failed metadata extraction"
msgstr ""
@@ -24483,6 +24820,9 @@ msgstr ""
msgid "PackageRegistry|Pip Command"
msgstr ""
+msgid "PackageRegistry|Project-level"
+msgstr ""
+
msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
msgstr ""
@@ -24504,6 +24844,9 @@ msgstr ""
msgid "PackageRegistry|Remove package"
msgstr ""
+msgid "PackageRegistry|Required Python: %{pythonVersion}"
+msgstr ""
+
msgid "PackageRegistry|RubyGems"
msgstr ""
@@ -24546,6 +24889,9 @@ msgstr ""
msgid "PackageRegistry|Source project located at %{link}"
msgstr ""
+msgid "PackageRegistry|Target SHA: %{sha}"
+msgstr ""
+
msgid "PackageRegistry|There are no other versions of this package."
msgstr ""
@@ -24714,6 +25060,18 @@ msgstr ""
msgid "Password was successfully updated. Please sign in again."
msgstr ""
+msgid "PasswordPrompt|Confirm password"
+msgstr ""
+
+msgid "PasswordPrompt|Confirm password to continue"
+msgstr ""
+
+msgid "PasswordPrompt|Password is required"
+msgstr ""
+
+msgid "PasswordPrompt|Please enter your password to confirm"
+msgstr ""
+
msgid "Passwords should be unique and not used for any other sites or services."
msgstr ""
@@ -24741,6 +25099,9 @@ msgstr ""
msgid "Paste project path (i.e. gitlab-org/gitlab)"
msgstr ""
+msgid "Paste this DSN into your Sentry SDK"
+msgstr ""
+
msgid "Paste your public SSH key, which is usually contained in the file '~/.ssh/id_ed25519.pub' or '~/.ssh/id_rsa.pub' and begins with 'ssh-ed25519' or 'ssh-rsa'. Do not paste your private SSH key, as that can compromise your identity."
msgstr ""
@@ -24825,6 +25186,9 @@ msgstr ""
msgid "PerformanceBar|First Contentful Paint"
msgstr ""
+msgid "PerformanceBar|Flamegraph with mode:"
+msgstr ""
+
msgid "PerformanceBar|Frontend resources"
msgstr ""
@@ -24858,6 +25222,15 @@ msgstr ""
msgid "PerformanceBar|Trace"
msgstr ""
+msgid "PerformanceBar|cpu"
+msgstr ""
+
+msgid "PerformanceBar|object"
+msgstr ""
+
+msgid "PerformanceBar|wall"
+msgstr ""
+
msgid "Period in seconds"
msgstr ""
@@ -25086,6 +25459,48 @@ msgstr ""
msgid "PipelineSchedules|Variables"
msgstr ""
+msgid "PipelineSource|API"
+msgstr ""
+
+msgid "PipelineSource|Chat"
+msgstr ""
+
+msgid "PipelineSource|External"
+msgstr ""
+
+msgid "PipelineSource|External Pull Request"
+msgstr ""
+
+msgid "PipelineSource|Merge Request"
+msgstr ""
+
+msgid "PipelineSource|On-Demand DAST Scan"
+msgstr ""
+
+msgid "PipelineSource|On-Demand DAST Validation"
+msgstr ""
+
+msgid "PipelineSource|Parent Pipeline"
+msgstr ""
+
+msgid "PipelineSource|Pipeline"
+msgstr ""
+
+msgid "PipelineSource|Push"
+msgstr ""
+
+msgid "PipelineSource|Schedule"
+msgstr ""
+
+msgid "PipelineSource|Trigger"
+msgstr ""
+
+msgid "PipelineSource|Web"
+msgstr ""
+
+msgid "PipelineSource|Web IDE"
+msgstr ""
+
msgid "PipelineStatusTooltip|Pipeline: %{ciStatus}"
msgstr ""
@@ -25386,46 +25801,7 @@ msgstr ""
msgid "Pipeline|Source"
msgstr ""
-msgid "Pipeline|Source|API"
-msgstr ""
-
-msgid "Pipeline|Source|Chat"
-msgstr ""
-
-msgid "Pipeline|Source|External"
-msgstr ""
-
-msgid "Pipeline|Source|External Pull Request"
-msgstr ""
-
-msgid "Pipeline|Source|Merge Request"
-msgstr ""
-
-msgid "Pipeline|Source|On-Demand DAST Scan"
-msgstr ""
-
-msgid "Pipeline|Source|On-Demand DAST Validation"
-msgstr ""
-
-msgid "Pipeline|Source|Parent Pipeline"
-msgstr ""
-
-msgid "Pipeline|Source|Pipeline"
-msgstr ""
-
-msgid "Pipeline|Source|Push"
-msgstr ""
-
-msgid "Pipeline|Source|Schedule"
-msgstr ""
-
-msgid "Pipeline|Source|Trigger"
-msgstr ""
-
-msgid "Pipeline|Source|Web"
-msgstr ""
-
-msgid "Pipeline|Source|Web IDE"
+msgid "Pipeline|Source|Security Policy"
msgstr ""
msgid "Pipeline|Specify variable values to be used in this run. The values specified in %{linkStart}CI/CD settings%{linkEnd} will be used by default."
@@ -25476,7 +25852,7 @@ msgstr ""
msgid "Pipeline|We are currently unable to fetch pipeline data"
msgstr ""
-msgid "Pipeline|You’re about to stop pipeline %{pipelineId}."
+msgid "Pipeline|You’re about to stop pipeline #%{pipelineId}."
msgstr ""
msgid "Pipeline|for"
@@ -25503,6 +25879,9 @@ msgstr ""
msgid "Plain diff"
msgstr ""
+msgid "Plain-text response to send to clients that hit a rate limit"
+msgstr ""
+
msgid "Plan:"
msgstr ""
@@ -25647,9 +26026,6 @@ msgstr ""
msgid "Please provide attributes to update"
msgstr ""
-msgid "Please provide your username or email address."
-msgstr ""
-
msgid "Please reach out if you have any questions and we'll be happy to assist."
msgstr ""
@@ -25692,9 +26068,6 @@ msgstr ""
msgid "Please set a new password before proceeding."
msgstr ""
-msgid "Please share your feedback about %{featureName} %{linkStart}in this issue%{linkEnd} to help us improve the experience."
-msgstr ""
-
msgid "Please solve the captcha"
msgstr ""
@@ -25872,6 +26245,9 @@ msgstr ""
msgid "Prevent adding new members to project membership within this group"
msgstr ""
+msgid "Prevent auto-stopping"
+msgstr ""
+
msgid "Prevent editing approval rules in projects and merge requests."
msgstr ""
@@ -25884,7 +26260,7 @@ msgstr ""
msgid "Prevent users from changing their profile name"
msgstr ""
-msgid "Prevent users from performing write operations on GitLab while performing maintenance."
+msgid "Prevent users from performing write operations while GitLab maintenance is in progress."
msgstr ""
msgid "Preview"
@@ -26157,6 +26533,9 @@ msgstr ""
msgid "Profiles|Enter your name, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Enter your password to confirm the email change"
+msgstr ""
+
msgid "Profiles|Enter your pronouns to let people know how to refer to you"
msgstr ""
@@ -26391,10 +26770,10 @@ msgstr ""
msgid "Profiles|e.g. My MacBook key"
msgstr ""
-msgid "Profiles|username"
+msgid "Profiles|https://website.com"
msgstr ""
-msgid "Profiles|website.com"
+msgid "Profiles|username"
msgstr ""
msgid "Profiles|your account"
@@ -26637,9 +27016,21 @@ msgstr ""
msgid "ProjectSelect| or group"
msgstr ""
+msgid "ProjectSelect|No matching results"
+msgstr ""
+
msgid "ProjectSelect|Search for project"
msgstr ""
+msgid "ProjectSelect|Search projects"
+msgstr ""
+
+msgid "ProjectSelect|Select a project"
+msgstr ""
+
+msgid "ProjectSelect|There was an error fetching the projects. Please try again."
+msgstr ""
+
msgid "ProjectService|Drone server URL"
msgstr ""
@@ -26727,6 +27118,9 @@ msgstr ""
msgid "ProjectService|Trigger event when a new, unique alert is recorded."
msgstr ""
+msgid "ProjectService|Trigger event when a new, unique vulnerability is recorded. (Note: This feature requires an Ultimate plan.)"
+msgstr ""
+
msgid "ProjectService|Trigger event when a pipeline status changes."
msgstr ""
@@ -27141,9 +27535,15 @@ msgstr ""
msgid "Projects are graded based on the highest severity vulnerability present"
msgstr ""
+msgid "Projects are organized into groups"
+msgstr ""
+
msgid "Projects contributed to"
msgstr ""
+msgid "Projects help you organize your work. They contain your file repository, issues, merge requests, and so much more."
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr ""
@@ -27378,10 +27778,10 @@ msgstr ""
msgid "PrometheusService|Prometheus cluster integration"
msgstr ""
-msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
+msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
msgstr ""
-msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
+msgid "PrometheusService|The ID of the IAP-secured resource."
msgstr ""
msgid "PrometheusService|The Prometheus API base URL."
@@ -27999,6 +28399,9 @@ msgstr ""
msgid "Rate limit"
msgstr ""
+msgid "Rate limits can help reduce request volume (like from crawlers or abusive bots)."
+msgstr ""
+
msgid "Raw blob request rate limit per minute"
msgstr ""
@@ -28011,6 +28414,9 @@ msgstr ""
msgid "Re-authentication required"
msgstr ""
+msgid "Re-import"
+msgstr ""
+
msgid "Re-request review"
msgstr ""
@@ -28032,6 +28438,9 @@ msgstr ""
msgid "Read more about related issues"
msgstr ""
+msgid "Read their documentation."
+msgstr ""
+
msgid "Ready to get started with GitLab? Follow these steps to set up your workspace, plan and commit changes, and deploy your project."
msgstr ""
@@ -28065,6 +28474,9 @@ msgstr ""
msgid "Receive any notifications from GitLab."
msgstr ""
+msgid "Receive notification of abuse reports by email."
+msgstr ""
+
msgid "Receive notifications about your own activity"
msgstr ""
@@ -28211,9 +28623,6 @@ msgstr ""
msgid "Registry setup"
msgstr ""
-msgid "Regulate approvals by authors/committers. Affects all projects."
-msgstr ""
-
msgid "Reindexing Status: %{status} (Slice multiplier: %{multiplier}, Maximum running slices: %{max_slices})"
msgstr ""
@@ -28312,6 +28721,9 @@ msgstr ""
msgid "Release|Something went wrong while saving the release details."
msgstr ""
+msgid "Reload page"
+msgstr ""
+
msgid "Remediations"
msgstr ""
@@ -28594,6 +29006,9 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
+msgid "Repeats"
+msgstr ""
+
msgid "Replace"
msgstr ""
@@ -28968,10 +29383,7 @@ msgstr ""
msgid "Require additional authentication for administrative tasks."
msgstr ""
-msgid "Require all users in this group to setup Two-factor authentication"
-msgstr ""
-
-msgid "Require all users in this group to setup two-factor authentication"
+msgid "Require all users in this group to set up two-factor authentication"
msgstr ""
msgid "Required approvals (%{approvals_given} given)"
@@ -29023,6 +29435,9 @@ msgstr[4] ""
msgid "Requires values to meet regular expression requirements."
msgstr ""
+msgid "Requires you to deploy or set up cloud-hosted Sentry."
+msgstr ""
+
msgid "Requires your primary GitLab email address."
msgstr ""
@@ -29083,9 +29498,6 @@ msgstr ""
msgid "Resolve"
msgstr ""
-msgid "Resolve all threads in new issue"
-msgstr ""
-
msgid "Resolve conflicts"
msgstr ""
@@ -29143,6 +29555,9 @@ msgstr ""
msgid "Response text"
msgstr ""
+msgid "Restart GitLab to apply changes."
+msgstr ""
+
msgid "Restart Terminal"
msgstr ""
@@ -29161,6 +29576,9 @@ msgstr ""
msgid "Restoring the project will prevent the project from being removed on this date and restore people's ability to make changes to it."
msgstr ""
+msgid "Restrict group access by IP address. %{link_start}Learn more%{link_end}."
+msgstr ""
+
msgid "Restrict membership by email domain"
msgstr ""
@@ -29480,6 +29898,9 @@ msgstr ""
msgid "Runners|Runner #%{runner_id}"
msgstr ""
+msgid "Runners|Runner assigned to project."
+msgstr ""
+
msgid "Runners|Runner is offline, last contact was %{runner_contact} ago"
msgstr ""
@@ -29492,6 +29913,9 @@ msgstr ""
msgid "Runners|Runner registration"
msgstr ""
+msgid "Runners|Runner unassigned from project."
+msgstr ""
+
msgid "Runners|Runners"
msgstr ""
@@ -29684,7 +30108,7 @@ msgstr ""
msgid "SastEntryPoints|How do I set up SAST?"
msgstr ""
-msgid "SastEntryPoints|Learn more."
+msgid "SastEntryPoints|Learn more"
msgstr ""
msgid "Satisfied"
@@ -29726,7 +30150,7 @@ msgstr ""
msgid "Save pipeline schedule"
msgstr ""
-msgid "Save space and find images in the container Registry. remove unneeded tags and keep only the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
+msgid "Save storage space by automatically deleting tags from the container registry and keeping the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
msgstr ""
msgid "Saving"
@@ -29900,6 +30324,9 @@ msgstr ""
msgid "Search or filter results…"
msgstr ""
+msgid "Search or jump to..."
+msgstr ""
+
msgid "Search project"
msgstr ""
@@ -29960,16 +30387,16 @@ msgstr ""
msgid "SearchCodeResults|of %{link_to_project}"
msgstr ""
-msgid "SearchResults|Showing %{count} %{scope} for%{term_element}"
+msgid "SearchResults|Showing %{count} %{scope} for %{term_element}"
msgstr ""
-msgid "SearchResults|Showing %{count} %{scope} for%{term_element} in your personal and project snippets"
+msgid "SearchResults|Showing %{count} %{scope} for %{term_element} in your personal and project snippets"
msgstr ""
-msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for%{term_element}"
+msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for %{term_element}"
msgstr ""
-msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for%{term_element} in your personal and project snippets"
+msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for %{term_element} in your personal and project snippets"
msgstr ""
msgid "SearchResults|code result"
@@ -30084,6 +30511,9 @@ msgstr ""
msgid "Secret Detection"
msgstr ""
+msgid "Secret access key"
+msgstr ""
+
msgid "Secret token"
msgstr ""
@@ -30123,9 +30553,6 @@ msgstr ""
msgid "SecurityApprovals|A merge request approval is required when the license compliance report contains a denied license."
msgstr ""
-msgid "SecurityApprovals|Configurable if security scanners are enabled. %{linkStart}Learn more.%{linkEnd}"
-msgstr ""
-
msgid "SecurityApprovals|Coverage-Check"
msgstr ""
@@ -30138,24 +30565,18 @@ msgstr ""
msgid "SecurityApprovals|Learn more about Vulnerability-Check"
msgstr ""
-msgid "SecurityApprovals|License Scanning must be enabled. %{linkStart}Learn more%{linkEnd}."
-msgstr ""
-
msgid "SecurityApprovals|License-Check"
msgstr ""
msgid "SecurityApprovals|Requires approval for Denied licenses. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}More information%{linkEnd}"
+msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "SecurityApprovals|Requires approval for vulnerabilities. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
-msgid "SecurityApprovals|Test coverage must be enabled. %{linkStart}Learn more%{linkEnd}."
-msgstr ""
-
msgid "SecurityApprovals|Vulnerability-Check"
msgstr ""
@@ -30219,6 +30640,12 @@ msgstr ""
msgid "SecurityConfiguration|Immediately begin risk analysis and remediation with application security features. Start with SAST and Secret Detection, available to all plans. Upgrade to Ultimate to get all features, including:"
msgstr ""
+msgid "SecurityConfiguration|Manage corpus"
+msgstr ""
+
+msgid "SecurityConfiguration|Manage corpus files used as mutation sources in coverage fuzzing."
+msgstr ""
+
msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
msgstr ""
@@ -30273,6 +30700,12 @@ msgstr ""
msgid "SecurityOrchestration|Action"
msgstr ""
+msgid "SecurityOrchestration|Actions"
+msgstr ""
+
+msgid "SecurityOrchestration|Add rule"
+msgstr ""
+
msgid "SecurityOrchestration|All policies"
msgstr ""
@@ -30306,9 +30739,6 @@ msgstr ""
msgid "SecurityOrchestration|Network"
msgstr ""
-msgid "SecurityOrchestration|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
-msgstr ""
-
msgid "SecurityOrchestration|New policy"
msgstr ""
@@ -30324,6 +30754,9 @@ msgstr ""
msgid "SecurityOrchestration|Policy editor"
msgstr ""
+msgid "SecurityOrchestration|Policy preview"
+msgstr ""
+
msgid "SecurityOrchestration|Policy status"
msgstr ""
@@ -30333,6 +30766,9 @@ msgstr ""
msgid "SecurityOrchestration|Rule"
msgstr ""
+msgid "SecurityOrchestration|Rules"
+msgstr ""
+
msgid "SecurityOrchestration|Scan Execution"
msgstr ""
@@ -30426,6 +30862,9 @@ msgstr ""
msgid "SecurityReports|Create issue"
msgstr ""
+msgid "SecurityReports|Development vulnerabilities"
+msgstr ""
+
msgid "SecurityReports|Dismiss vulnerability"
msgstr ""
@@ -30441,6 +30880,9 @@ msgstr ""
msgid "SecurityReports|Download results"
msgstr ""
+msgid "SecurityReports|Download scanned URLs"
+msgstr ""
+
msgid "SecurityReports|Download scanned resources"
msgstr ""
@@ -30564,6 +31006,9 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
+msgid "SecurityReports|The Vulnerability Report shows the results of the lastest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "SecurityReports|The security reports below contain one or more vulnerability findings that could not be parsed and were not recorded. Download the artifacts in the job output to investigate. Ensure any security report created conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
msgstr ""
@@ -30705,10 +31150,10 @@ msgstr ""
msgid "Select a repository"
msgstr ""
-msgid "Select a role"
+msgid "Select a repository containing templates for common files."
msgstr ""
-msgid "Select a shared template repository for all projects on this instance."
+msgid "Select a role"
msgstr ""
msgid "Select a template repository"
@@ -30786,6 +31231,9 @@ msgstr ""
msgid "Select project to choose zone"
msgstr ""
+msgid "Select project to create issue"
+msgstr ""
+
msgid "Select projects"
msgstr ""
@@ -30903,6 +31351,9 @@ msgstr ""
msgid "Send emails to help guide new users through the onboarding process."
msgstr ""
+msgid "Send emails to users upon account deactivation."
+msgstr ""
+
msgid "Send message"
msgstr ""
@@ -30921,6 +31372,9 @@ msgstr ""
msgid "Send service data"
msgstr ""
+msgid "Sentry"
+msgstr ""
+
msgid "Sentry API URL"
msgstr ""
@@ -31035,6 +31489,9 @@ msgstr ""
msgid "Service"
msgstr ""
+msgid "Service Accounts keys are required to authorize GitLab to deploy your Google Cloud project."
+msgstr ""
+
msgid "Service Desk"
msgstr ""
@@ -31107,15 +31564,15 @@ msgstr ""
msgid "Set a password on your account to pull or push via %{protocol}."
msgstr ""
-msgid "Set a template repository for projects in this group"
-msgstr ""
-
msgid "Set access permissions for this token."
msgstr ""
msgid "Set an instance-wide domain that will be available to all clusters when installing Knative."
msgstr ""
+msgid "Set any rate limit to %{code_open}0%{code_close} to disable the limit."
+msgstr ""
+
msgid "Set default and restrict visibility levels. Configure import sources and git access protocol."
msgstr ""
@@ -31128,7 +31585,7 @@ msgstr ""
msgid "Set limit to 0 to allow any file size."
msgstr ""
-msgid "Set max session time for web terminal."
+msgid "Set limits for web and API requests."
msgstr ""
msgid "Set milestone"
@@ -31137,15 +31594,18 @@ msgstr ""
msgid "Set new password"
msgstr ""
-msgid "Set notification email for abuse reports."
+msgid "Set parent epic to an epic"
msgstr ""
-msgid "Set parent epic to an epic"
+msgid "Set per-user rate limits for imports and exports of projects and groups."
msgstr ""
msgid "Set projects and maximum size limits, session duration, user options, and check feature availability for namespace plan."
msgstr ""
+msgid "Set rate limits for package registry API requests that supersede the general user and IP rate limits."
+msgstr ""
+
msgid "Set severity"
msgstr ""
@@ -31164,15 +31624,24 @@ msgstr ""
msgid "Set the default branch for this project. All merge requests and commits are made against this branch unless you specify a different one."
msgstr ""
+msgid "Set the default expiration time for job artifacts in all projects. Set to %{code_open}0%{code_close} to never expire artifacts by default. If no unit is written, it defaults to seconds. For example, these are all equivalent: %{code_open}3600%{code_close}, %{code_open}60 minutes%{code_close}, or %{code_open}one hour%{code_close}."
+msgstr ""
+
msgid "Set the due date to %{due_date}."
msgstr ""
msgid "Set the iteration to %{iteration_reference}."
msgstr ""
+msgid "Set the maximum session time for a web terminal."
+msgstr ""
+
msgid "Set the milestone to %{milestone_reference}."
msgstr ""
+msgid "Set the per-user rate limit for notes created by web or API requests."
+msgstr ""
+
msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
msgstr ""
@@ -31374,6 +31843,9 @@ msgstr ""
msgid "Show Pipeline IID"
msgstr ""
+msgid "Show all %{issuable_type}."
+msgstr ""
+
msgid "Show all activity"
msgstr ""
@@ -31425,15 +31897,9 @@ msgstr ""
msgid "Show list"
msgstr ""
-msgid "Show me advanced features"
-msgstr ""
-
msgid "Show me how to add a pipeline"
msgstr ""
-msgid "Show me the basics"
-msgstr ""
-
msgid "Show one file at a time"
msgstr ""
@@ -31480,15 +31946,15 @@ msgstr ""
msgid "Showing %{pageSize} of %{total} %{issuableType}"
msgstr ""
-msgid "Showing %{pageSize} of %{total} issues"
-msgstr ""
-
msgid "Showing all epics"
msgstr ""
msgid "Showing all issues"
msgstr ""
+msgid "Showing data for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
+msgstr ""
+
msgid "Showing data for workflow items created in this date range. Date range cannot exceed %{maxDateRange} days."
msgstr ""
@@ -31528,6 +31994,15 @@ msgstr ""
msgid "Sidebar|Weight"
msgstr ""
+msgid "Sidekiq job compression threshold (bytes)"
+msgstr ""
+
+msgid "Sidekiq job size limit (bytes)"
+msgstr ""
+
+msgid "Sidekiq job size limits"
+msgstr ""
+
msgid "Sign in"
msgstr ""
@@ -31648,6 +32123,9 @@ msgstr ""
msgid "Site profile not found for given parameters"
msgstr ""
+msgid "Sites"
+msgstr ""
+
msgid "Size"
msgstr ""
@@ -31678,19 +32156,22 @@ msgstr ""
msgid "SlackIntegration|Sends notifications about project events to Slack channels."
msgstr ""
-msgid "SlackService|2. Paste the %{strong_open}Token%{strong_close} into the field below"
+msgid "SlackService|1. %{slash_command_link_start}Add a slash command%{slash_command_link_end} in your Slack team using this information:"
msgstr ""
-msgid "SlackService|3. Select the %{strong_open}Active%{strong_close} checkbox, press %{strong_open}Save changes%{strong_close} and start using GitLab inside Slack!"
+msgid "SlackService|2. Paste the token from Slack in the %{strong_open}Token%{strong_close} field below."
msgstr ""
-msgid "SlackService|Fill in the word that works best for your team."
+msgid "SlackService|3. Select the %{strong_open}Active%{strong_close} checkbox, select %{strong_open}Save changes%{strong_close}, and start using slash commands in Slack!"
+msgstr ""
+
+msgid "SlackService|After setup, get a list of available Slack slash commands by entering"
msgstr ""
-msgid "SlackService|See list of available commands in Slack after setting up this service, by entering"
+msgid "SlackService|Fill in the word that works best for your team."
msgstr ""
-msgid "SlackService|This service allows users to perform common operations on this project by entering slash commands in Slack."
+msgid "SlackService|Perform common operations in this project by entering slash commands in Slack."
msgstr ""
msgid "Slice multiplier"
@@ -31756,7 +32237,7 @@ msgstr ""
msgid "Some child epics may be hidden due to applied filters"
msgstr ""
-msgid "Some common domains are not allowed. %{read_more_link}."
+msgid "Some common domains are not allowed. %{learn_more_link}."
msgstr ""
msgid "Some of the designs you tried uploading did not change:"
@@ -31840,9 +32321,6 @@ msgstr ""
msgid "Something went wrong while exporting requirements"
msgstr ""
-msgid "Something went wrong while fetching %{listType} list"
-msgstr ""
-
msgid "Something went wrong while fetching branches"
msgstr ""
@@ -31897,15 +32375,9 @@ msgstr ""
msgid "Something went wrong while merging this merge request. Please try again."
msgstr ""
-msgid "Something went wrong while moving issues."
-msgstr ""
-
msgid "Something went wrong while obtaining the Let's Encrypt certificate."
msgstr ""
-msgid "Something went wrong while performing the action."
-msgstr ""
-
msgid "Something went wrong while promoting the issue to an epic. Please try again."
msgstr ""
@@ -32233,7 +32705,10 @@ msgstr ""
msgid "SourcegraphPreferences|Uses a custom %{linkStart}Sourcegraph instance%{linkEnd}."
msgstr ""
-msgid "Spam Check API Key"
+msgid "Spam Check"
+msgstr ""
+
+msgid "Spam Check API key"
msgstr ""
msgid "Spam Logs"
@@ -32251,7 +32726,7 @@ msgstr ""
msgid "Specified URL cannot be used: \"%{reason}\""
msgstr ""
-msgid "Specify an e-mail address regex pattern to identify default internal users."
+msgid "Specify an email address regex pattern to identify default internal users."
msgstr ""
msgid "Speed up your pipelines with Needs relationships"
@@ -32506,7 +32981,7 @@ msgstr ""
msgid "StatusCheck|An error occurred fetching the status checks."
msgstr ""
-msgid "StatusCheck|Apply this status check to any branch or a specific protected branch."
+msgid "StatusCheck|Apply this status check to all branches or a specific protected branch."
msgstr ""
msgid "StatusCheck|Check for a status response in Merge Requests. Failures do not block merges. %{link_start}Learn more%{link_end}."
@@ -32845,6 +33320,9 @@ msgstr ""
msgid "Subscriptions"
msgstr ""
+msgid "Subscription|Your subscription for %{strong}%{namespace_name}%{strong_close} has expired and you are now on %{pricing_link_start}the GitLab Free tier%{pricing_link_end}. Don't worry, your data is safe. Get in touch with our support team (%{support_email}). They'll gladly help with your subscription renewal."
+msgstr ""
+
msgid "Subtracted"
msgstr ""
@@ -33073,6 +33551,9 @@ msgstr ""
msgid "SuperSonics|Plan"
msgstr ""
+msgid "SuperSonics|Please agree to the Subscription Agreement"
+msgstr ""
+
msgid "SuperSonics|Ready to get started? A GitLab plan is ideal for scaling organizations and for multi team usage."
msgstr ""
@@ -33103,6 +33584,9 @@ msgstr ""
msgid "SuperSonics|The activation code is not valid. Please make sure to copy it exactly from the Customers Portal or confirmation email. Learn more about %{linkStart}activating your subscription%{linkEnd}."
msgstr ""
+msgid "SuperSonics|The activation code should be a 24-character alphanumeric string"
+msgstr ""
+
msgid "SuperSonics|There is a connectivity issue."
msgstr ""
@@ -33145,9 +33629,15 @@ msgstr ""
msgid "SuperSonics|You do not have an active subscription"
msgstr ""
+msgid "SuperSonics|You have successfully added a license that activates on %{date}. Please see the subscription history table below for more details."
+msgstr ""
+
msgid "SuperSonics|You'll be charged for %{trueUpLinkStart}users over license%{trueUpLinkEnd} on a quarterly or annual basis, depending on the terms of your agreement."
msgstr ""
+msgid "SuperSonics|Your future dated license was successfully added"
+msgstr ""
+
msgid "SuperSonics|Your subscription"
msgstr ""
@@ -33400,7 +33890,7 @@ msgstr ""
msgid "Template to append to all Service Desk issues"
msgstr ""
-msgid "TemplateRepository|Select a repository to make its templates available to all projects. %{link_start}What should the repository contain?%{link_end} "
+msgid "TemplateRepository|Create common files more quickly, and standardize their format."
msgstr ""
msgid "Templates"
@@ -33618,7 +34108,7 @@ msgstr ""
msgid "TestCases|Search test cases"
msgstr ""
-msgid "TestCases|Something went wrong while adding test case to Todo."
+msgid "TestCases|Something went wrong while adding test case to a to-do item."
msgstr ""
msgid "TestCases|Something went wrong while creating a test case."
@@ -33630,7 +34120,7 @@ msgstr ""
msgid "TestCases|Something went wrong while fetching test cases list."
msgstr ""
-msgid "TestCases|Something went wrong while marking test case todo as done."
+msgid "TestCases|Something went wrong while marking test case to-do item as done."
msgstr ""
msgid "TestCases|Something went wrong while moving test case."
@@ -33750,7 +34240,7 @@ msgstr ""
msgid "Thanks for your purchase!"
msgstr ""
-msgid "That is ok, I do not want to renew"
+msgid "That's OK, I don't want to renew"
msgstr ""
msgid "That's it, well done!"
@@ -33776,7 +34266,7 @@ msgstr[2] ""
msgstr[3] ""
msgstr[4] ""
-msgid "The API key used by GitLab for accessing the Spam Check service endpoint"
+msgid "The API key used by GitLab for accessing the Spam Check service endpoint."
msgstr ""
msgid "The GitLab subscription service (customers.gitlab.com) is currently experiencing an outage. You can monitor the status and get updates at %{linkStart}status.gitlab.com%{linkEnd}."
@@ -33815,9 +34305,6 @@ msgstr ""
msgid "The URL to use for connecting to Elasticsearch. Use a comma-separated list to support clustering (e.g., \"http://localhost:9200, http://localhost:9201\")."
msgstr ""
-msgid "The Vulnerability Report shows the results of the last successful pipeline run on the default branch."
-msgstr ""
-
msgid "The X509 Certificate to use when mutual TLS is required to communicate with the external authorization service. If left blank, the server certificate is still validated when accessing over HTTPS."
msgstr ""
@@ -33875,9 +34362,6 @@ msgstr ""
msgid "The default branch for this project has been changed. Please update your bookmarks."
msgstr ""
-msgid "The default expiration time for job artifacts. 0 for unlimited. The default unit is in seconds, but you can use other units, for example %{code_open}4 mins 2 sec%{code_close}, %{code_open}2h42min%{code_close}."
-msgstr ""
-
msgid "The dependency list details information about the components used within your project."
msgstr ""
@@ -34072,9 +34556,6 @@ msgstr ""
msgid "The merge conflicts for this merge request have already been resolved. Please return to the merge request."
msgstr ""
-msgid "The merge request can now be merged."
-msgstr ""
-
msgid "The metric must be one of %{metrics}."
msgstr ""
@@ -34450,7 +34931,7 @@ msgstr ""
msgid "There was a problem updating the keep latest artifacts setting."
msgstr ""
-msgid "There was an error %{message} todo."
+msgid "There was an error %{message} to-do item."
msgstr ""
msgid "There was an error adding a To Do."
@@ -34489,6 +34970,9 @@ msgstr ""
msgid "There was an error fetching projects"
msgstr ""
+msgid "There was an error fetching search autocomplete suggestions"
+msgstr ""
+
msgid "There was an error fetching stage total counts"
msgstr ""
@@ -34813,6 +35297,9 @@ msgstr ""
msgid "This field is required."
msgstr ""
+msgid "This form is disabled in preview"
+msgstr ""
+
msgid "This group"
msgstr ""
@@ -34834,9 +35321,6 @@ msgstr ""
msgid "This group is linked to a subscription"
msgstr ""
-msgid "This group, including all subgroups, projects and git repositories, will be reachable from only the specified IP address ranges."
-msgstr ""
-
msgid "This group, its subgroups and projects has been scheduled for removal on %{date}."
msgstr ""
@@ -35116,9 +35600,6 @@ msgstr ""
msgid "This user cannot be unlocked manually from GitLab"
msgstr ""
-msgid "This user does not have a pending request"
-msgstr ""
-
msgid "This user has an unconfirmed email address (%{email}). You may force a confirmation."
msgstr ""
@@ -35227,9 +35708,6 @@ msgstr ""
msgid "ThreatMonitoring|Packet Activity"
msgstr ""
-msgid "ThreatMonitoring|Policies"
-msgstr ""
-
msgid "ThreatMonitoring|Requests"
msgstr ""
@@ -35281,6 +35759,12 @@ msgstr ""
msgid "ThreatMonitoring|View documentation"
msgstr ""
+msgid "Threshold in bytes at which to compress Sidekiq job arguments."
+msgstr ""
+
+msgid "Threshold in bytes at which to reject Sidekiq jobs. Set this to 0 to if you don't want to limit Sidekiq jobs."
+msgstr ""
+
msgid "Throughput"
msgstr ""
@@ -35290,6 +35774,9 @@ msgstr ""
msgid "Time"
msgstr ""
+msgid "Time (in hours) that users are allowed to skip forced configuration of two-factor authentication."
+msgstr ""
+
msgid "Time Spent"
msgstr ""
@@ -35356,7 +35843,7 @@ msgstr ""
msgid "TimeTrackingEstimated|Est"
msgstr ""
-msgid "TimeTracking|%{startTag}Spent: %{endTag}%{timeSpentHumanReadable}"
+msgid "TimeTracking|%{spentStart}Spent: %{spentEnd}"
msgstr ""
msgid "TimeTracking|Estimated:"
@@ -35576,6 +36063,9 @@ msgstr ""
msgid "To access this domain create a new DNS record"
msgstr ""
+msgid "To add a custom suffix, set up a Service Desk email address. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "To add an SSH key you need to %{generate_link_start}generate one%{link_end} or use an %{existing_link_start}existing key%{link_end}."
msgstr ""
@@ -35597,13 +36087,16 @@ msgstr ""
msgid "To connect an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To continue using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
+msgstr ""
+
msgid "To continue, you need to select the link in the confirmation email we sent to verify your email address. If you didn't get our email, select %{strongStart}Resend confirmation email.%{strongEnd}"
msgstr ""
msgid "To define internal users, first enable new users set to external"
msgstr ""
-msgid "To enable Registration Features, make sure \"Enable service ping\" is checked."
+msgid "To enable Registration Features, first enable Service Ping."
msgstr ""
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
@@ -35630,7 +36123,7 @@ msgstr ""
msgid "To get started, use the link below to confirm your account."
msgstr ""
-msgid "To help improve GitLab and its user experience, GitLab will periodically collect usage information."
+msgid "To help improve GitLab and its user experience, GitLab periodically collects usage information."
msgstr ""
msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
@@ -35663,7 +36156,7 @@ msgstr ""
msgid "To preserve performance only %{strong_open}%{display_size} of %{real_size}%{strong_close} files are displayed."
msgstr ""
-msgid "To protect this issue's confidentiality, %{forkLink} and set the fork's visibility to private."
+msgid "To protect this issue's confidentiality, %{linkStart}fork this project%{linkEnd} and set the fork's visibility to private."
msgstr ""
msgid "To protect this issue's confidentiality, a private fork of this project was selected."
@@ -35696,12 +36189,15 @@ msgstr ""
msgid "To set up SAML authentication for your group through an identity provider like Azure, Okta, Onelogin, Ping Identity, or your custom SAML 2.0 provider:"
msgstr ""
-msgid "To set up this service:"
+msgid "To set up this integration:"
msgstr ""
msgid "To specify the notification level per project of a group you belong to, you need to visit project page and change notification level there."
msgstr ""
+msgid "To start using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
+msgstr ""
+
msgid "To unsubscribe from this issue, please paste the following link into your browser:"
msgstr ""
@@ -36292,9 +36788,6 @@ msgstr ""
msgid "Unable to fetch branches list, please close the form and try again"
msgstr ""
-msgid "Unable to fetch unscanned projects"
-msgstr ""
-
msgid "Unable to fetch vulnerable projects"
msgstr ""
@@ -36349,6 +36842,15 @@ msgstr ""
msgid "Unable to update this issue at this time."
msgstr ""
+msgid "Unapprove a merge request"
+msgstr ""
+
+msgid "Unapprove the current merge request."
+msgstr ""
+
+msgid "Unapproved the current merge request."
+msgstr ""
+
msgid "Unarchive project"
msgstr ""
@@ -36361,16 +36863,13 @@ msgstr ""
msgid "Unassigned"
msgstr ""
-msgid "Unauthenticated API request rate limit"
+msgid "Unauthenticated API rate limit period in seconds"
msgstr ""
-msgid "Unauthenticated rate limit period in seconds"
+msgid "Unauthenticated requests"
msgstr ""
-msgid "Unauthenticated request rate limit"
-msgstr ""
-
-msgid "Unauthenticated requests"
+msgid "Unauthenticated web rate limit period in seconds"
msgstr ""
msgid "Undo"
@@ -36472,18 +36971,6 @@ msgstr ""
msgid "Unresolved"
msgstr ""
-msgid "UnscannedProjects|15 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|30 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|5 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|60 or more days"
-msgstr ""
-
msgid "Unschedule job"
msgstr ""
@@ -36703,6 +37190,9 @@ msgstr ""
msgid "UsageQuota|%{help_link_start}Shared runners%{help_link_end} are disabled, so there are no limits set on pipeline usage"
msgstr ""
+msgid "UsageQuota|%{linkTitle} help link"
+msgstr ""
+
msgid "UsageQuota|%{percentageLeft} of purchased storage is available"
msgstr ""
@@ -36712,6 +37202,9 @@ msgstr ""
msgid "UsageQuota|Artifacts is a sum of build and pipeline artifacts."
msgstr ""
+msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
+msgstr ""
+
msgid "UsageQuota|Buy additional minutes"
msgstr ""
@@ -36721,9 +37214,21 @@ msgstr ""
msgid "UsageQuota|CI minutes usage by project"
msgstr ""
+msgid "UsageQuota|Code packages and container images."
+msgstr ""
+
msgid "UsageQuota|Current period usage"
msgstr ""
+msgid "UsageQuota|File attachments and smaller design graphics."
+msgstr ""
+
+msgid "UsageQuota|Git repository, managed by the Gitaly service."
+msgstr ""
+
+msgid "UsageQuota|Includes project registry, artifacts, packages, wiki, uploads and other items."
+msgstr ""
+
msgid "UsageQuota|Increase storage temporarily"
msgstr ""
@@ -36742,6 +37247,9 @@ msgstr ""
msgid "UsageQuota|Packages"
msgstr ""
+msgid "UsageQuota|Pipeline artifacts and job artifacts, created with CI/CD."
+msgstr ""
+
msgid "UsageQuota|Pipelines"
msgstr ""
@@ -36760,6 +37268,9 @@ msgstr ""
msgid "UsageQuota|Seats"
msgstr ""
+msgid "UsageQuota|Shared bits of code and text."
+msgstr ""
+
msgid "UsageQuota|Snippets"
msgstr ""
@@ -36769,6 +37280,12 @@ msgstr ""
msgid "UsageQuota|Storage"
msgstr ""
+msgid "UsageQuota|Storage type"
+msgstr ""
+
+msgid "UsageQuota|There is a known issue with Artifact storage where the total could be incorrect for some projects. More details and progress are available in %{warningLinkStart}the epic%{warningLinkEnd}."
+msgstr ""
+
msgid "UsageQuota|This is the total amount of storage used across your projects within this namespace."
msgstr ""
@@ -36808,6 +37325,9 @@ msgstr ""
msgid "UsageQuota|Usage"
msgstr ""
+msgid "UsageQuota|Usage Breakdown"
+msgstr ""
+
msgid "UsageQuota|Usage Quotas"
msgstr ""
@@ -36832,6 +37352,9 @@ msgstr ""
msgid "UsageQuota|Wiki"
msgstr ""
+msgid "UsageQuota|Wiki content."
+msgstr ""
+
msgid "UsageQuota|Wikis"
msgstr ""
@@ -37048,7 +37571,10 @@ msgstr ""
msgid "User Settings"
msgstr ""
-msgid "User and IP Rate Limits"
+msgid "User and IP rate limits"
+msgstr ""
+
+msgid "User does not have a pending request"
msgstr ""
msgid "User identity was successfully created."
@@ -37345,6 +37871,9 @@ msgstr ""
msgid "Users can launch a development environment from a GitLab browser tab when the %{linkStart}Gitpod%{linkEnd} integration is enabled."
msgstr ""
+msgid "Users can reactivate their account by signing in."
+msgstr ""
+
msgid "Users can render diagrams in AsciiDoc, Markdown, reStructuredText, and Textile documents using Kroki."
msgstr ""
@@ -37360,6 +37889,9 @@ msgstr ""
msgid "Users requesting access to"
msgstr ""
+msgid "Users to exclude from the rate limit"
+msgstr ""
+
msgid "Users were successfully added."
msgstr ""
@@ -37381,6 +37913,9 @@ msgstr ""
msgid "UsersSelect|Unassigned"
msgstr ""
+msgid "Uses GitLab as a lightweight alternative to Sentry."
+msgstr ""
+
msgid "Using %{code_start}::%{code_end} denotes a %{link_start}scoped label set%{link_end}"
msgstr ""
@@ -37411,10 +37946,7 @@ msgstr ""
msgid "Value Stream Analytics can help you determine your team’s velocity"
msgstr ""
-msgid "Value Stream Analytics gives an overview of how much time it takes to go from idea to production in your project."
-msgstr ""
-
-msgid "Value may contain a variable reference"
+msgid "Value might contain a variable reference"
msgstr ""
msgid "Value stream"
@@ -37480,10 +38012,10 @@ msgstr ""
msgid "ValueStream|The Default Value Stream cannot be deleted"
msgstr ""
-msgid "Variable"
+msgid "Values that contain the %{codeStart}$%{codeEnd} character can be considered a variable reference and expanded. %{docsLinkStart}Learn more.%{docsLinkEnd}"
msgstr ""
-msgid "Variable references indicated by %{codeStart}$%{codeEnd} may be expanded. If this is not what you want, consider %{docsLinkStart}using a workaround to prevent expansion%{docsLinkEnd}."
+msgid "Variable"
msgstr ""
msgid "Variable will be masked in job logs."
@@ -37897,6 +38429,9 @@ msgstr ""
msgid "Vulnerability|Evidence"
msgstr ""
+msgid "Vulnerability|False positive detected"
+msgstr ""
+
msgid "Vulnerability|File"
msgstr ""
@@ -37939,6 +38474,9 @@ msgstr ""
msgid "Vulnerability|Status"
msgstr ""
+msgid "Vulnerability|The scanner determined this vulnerability to be a false positive. Verify the evaluation before changing its status. %{linkStart}Learn more about false positive detection.%{linkEnd}"
+msgstr ""
+
msgid "Vulnerability|The unmodified response is the original response that had no mutations done to the request"
msgstr ""
@@ -38263,9 +38801,6 @@ msgstr ""
msgid "Welcome to GitLab,%{br_tag}%{name}!"
msgstr ""
-msgid "Welcome to the guided GitLab tour"
-msgstr ""
-
msgid "Welcome, %{name}!"
msgstr ""
@@ -38284,9 +38819,6 @@ msgstr ""
msgid "What are you searching for?"
msgstr ""
-msgid "What describes you best?"
-msgstr ""
-
msgid "What does this command do?"
msgstr ""
@@ -38308,13 +38840,13 @@ msgstr ""
msgid "What is your job title? (optional)"
msgstr ""
-msgid "What will you use this group for?"
+msgid "What templates can I create?"
msgstr ""
-msgid "What's new"
+msgid "What will you use this group for?"
msgstr ""
-msgid "What’s your experience level?"
+msgid "What's new"
msgstr ""
msgid "When a deployment job is successful, skip older deployment jobs that are still pending."
@@ -38326,6 +38858,9 @@ msgstr ""
msgid "When an event in GitLab triggers a webhook, you can use the request details to figure out if something went wrong."
msgstr ""
+msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+msgstr ""
+
msgid "When inactive, an external authentication provider must be used."
msgstr ""
@@ -38352,6 +38887,9 @@ msgstr ""
msgid "When:"
msgstr ""
+msgid "Which API requests are affected?"
+msgstr ""
+
msgid "While it's rare to have no vulnerabilities, it can happen. In any event, we ask that you please double check your settings to make sure you've set up your dashboard correctly."
msgstr ""
@@ -38631,6 +39169,9 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|Work Items"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -38706,6 +39247,9 @@ msgstr ""
msgid "You are already a member of this %{member_source}."
msgstr ""
+msgid "You are already impersonating another user"
+msgstr ""
+
msgid "You are an admin, which means granting access to %{client_name} will allow them to interact with GitLab as an admin as well. Proceed with caution."
msgstr ""
@@ -38808,6 +39352,9 @@ msgstr ""
msgid "You can also use project access tokens with Git to authenticate over HTTP(S). %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "You can always change your URL later"
+msgstr ""
+
msgid "You can always edit this later"
msgstr ""
@@ -38964,10 +39511,10 @@ msgstr ""
msgid "You can’t %{tag_start}edit%{tag_end} files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
-msgid "You could not create a new trigger."
+msgid "You can’t edit files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
-msgid "You didn't renew your subscription for %{strong}%{namespace_name}%{strong_close} so it was downgraded to the free plan."
+msgid "You could not create a new trigger."
msgstr ""
msgid "You do not have any subscriptions yet"
@@ -39135,6 +39682,12 @@ msgstr ""
msgid "You must provide your current password in order to change it."
msgstr ""
+msgid "You must sign in to search for specific projects."
+msgstr ""
+
+msgid "You must sign in to search for specific terms."
+msgstr ""
+
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
@@ -39162,6 +39715,9 @@ msgstr ""
msgid "You need to upload a GitLab project export archive (ending in .gz)."
msgstr ""
+msgid "You need to verify your primary email first before enabling Two-Factor Authentication."
+msgstr ""
+
msgid "You successfully declined the invitation"
msgstr ""
@@ -39270,10 +39826,10 @@ msgstr ""
msgid "Your %{host} account was signed in to from a new location"
msgstr ""
-msgid "Your %{strong}%{plan_name}%{strong_close} subscription for %{strong}%{namespace_name}%{strong_close} will expire on %{strong}%{expires_on}%{strong_close}."
+msgid "Your %{strong}%{plan_name}%{strong_close} subscription expires on %{strong}%{expires_on}%{strong_close}. After that date, you cannot create issues or merge requests, or use many other features."
msgstr ""
-msgid "Your %{strong}%{plan_name}%{strong_close} subscription will expire on %{strong}%{expires_on}%{strong_close}. After that, you will not be able to create issues or merge requests as well as many other features."
+msgid "Your %{strong}%{plan_name}%{strong_close} subscription for %{strong}%{namespace_name}%{strong_close} will expire on %{strong}%{expires_on}%{strong_close}."
msgstr ""
msgid "Your CI/CD configuration syntax is invalid. View Lint tab for more details."
@@ -39297,7 +39853,7 @@ msgstr ""
msgid "Your GPG keys (%{count})"
msgstr ""
-msgid "Your GitLab account has been locked due to an excessive amount of unsuccessful sign in attempts. Your account will automatically unlock in %{duration} or you may click the link below to unlock now."
+msgid "Your GitLab account has been locked due to an excessive number of unsuccessful sign in attempts. You can wait for your account to automatically unlock in %{duration} or you can click the link below to unlock now."
msgstr ""
msgid "Your GitLab account request has been approved!"
@@ -39408,6 +39964,9 @@ msgstr ""
msgid "Your commit email is used for web based operations, such as edits and merges."
msgstr ""
+msgid "Your current password is required to register a two-factor authenticator app."
+msgstr ""
+
msgid "Your dashboard has been copied. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
@@ -39507,6 +40066,9 @@ msgstr ""
msgid "Your project limit is %{limit} projects! Please contact your administrator to increase it"
msgstr ""
+msgid "Your project will be created at:"
+msgstr ""
+
msgid "Your projects"
msgstr ""
@@ -39546,11 +40108,13 @@ msgstr ""
msgid "Your subscription expired!"
msgstr ""
-msgid "Your subscription has been downgraded."
-msgstr ""
-
-msgid "Your subscription will expire in %{remaining_days}."
-msgstr ""
+msgid "Your subscription will expire in %{remaining_days} day."
+msgid_plural "Your subscription will expire in %{remaining_days} days."
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
msgid "Your username is %{username}."
msgstr ""
@@ -39763,6 +40327,9 @@ msgstr ""
msgid "cannot merge"
msgstr ""
+msgid "cannot not be used for user namespace"
+msgstr ""
+
msgid "ciReport|%{degradedNum} degraded"
msgstr ""
@@ -40089,6 +40656,9 @@ msgstr ""
msgid "created %{timeAgo}"
msgstr ""
+msgid "created %{timeAgo} by %{author}"
+msgstr ""
+
msgid "created by"
msgstr ""
@@ -40136,9 +40706,6 @@ msgstr ""
msgid "does not have a supported extension. Only %{extension_list} are supported"
msgstr ""
-msgid "domain is not authorized for sign-up."
-msgstr ""
-
msgid "download it"
msgstr ""
@@ -40159,21 +40726,13 @@ msgstr ""
msgid "email '%{email}' is not a verified email."
msgstr ""
-msgid "email does not match the allowed domain of %{email_domains}"
-msgid_plural "email does not match the allowed domains: %{email_domains}"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
-msgstr[4] ""
-
msgid "enabled"
msgstr ""
msgid "encrypted: needs to be a :required, :optional or :migrating!"
msgstr ""
-msgid "ending with MIME type format is not allowed."
+msgid "ending with a reserved file extension is not allowed."
msgstr ""
msgid "entries cannot be larger than 255 characters"
@@ -40197,6 +40756,9 @@ msgstr ""
msgid "estimateCommand|%{slash_command} overwrites the total estimated time."
msgstr ""
+msgid "example.com"
+msgstr ""
+
msgid "exceeds the limit of %{bytes} bytes"
msgstr ""
@@ -40250,9 +40812,6 @@ msgstr ""
msgid "fork"
msgstr ""
-msgid "fork this project"
-msgstr ""
-
msgid "from"
msgstr ""
@@ -40264,6 +40823,9 @@ msgstr[2] ""
msgstr[3] ""
msgstr[4] ""
+msgid "frontmatter"
+msgstr ""
+
msgid "group"
msgstr ""
@@ -40291,6 +40853,9 @@ msgstr ""
msgid "has been completed."
msgstr ""
+msgid "has too deep level of nesting"
+msgstr ""
+
msgid "help"
msgstr ""
@@ -40324,9 +40889,21 @@ msgstr ""
msgid "in"
msgstr ""
+msgid "in Infrastructure :: Kubernetes clusters"
+msgstr ""
+
+msgid "in all GitLab"
+msgstr ""
+
+msgid "in group"
+msgstr ""
+
msgid "in group %{link_to_group}"
msgstr ""
+msgid "in project"
+msgstr ""
+
msgid "in project %{link_to_project}"
msgstr ""
@@ -40371,16 +40948,19 @@ msgstr ""
msgid "is not a valid X509 certificate."
msgstr ""
-msgid "is not allowed since the group is not top-level group."
+msgid "is not allowed for sign-up."
msgstr ""
-msgid "is not allowed. Try again with a different email address, or contact your GitLab admin."
+msgid "is not allowed for this group."
msgstr ""
-msgid "is not allowed. We do not currently support project-level iterations"
+msgid "is not allowed for this project."
msgstr ""
-msgid "is not from an allowed domain."
+msgid "is not allowed since the group is not top-level group."
+msgstr ""
+
+msgid "is not allowed. We do not currently support project-level iterations"
msgstr ""
msgid "is not in the group enforcing Group Managed Account"
@@ -40473,6 +41053,9 @@ msgstr ""
msgid "log in"
msgstr ""
+msgid "managed"
+msgstr ""
+
msgid "manual"
msgstr ""
@@ -40523,6 +41106,9 @@ msgstr ""
msgid "mrWidget| Please restore it or use a different %{missingBranchName} branch"
msgstr ""
+msgid "mrWidget|%{linkStart}Set up now%{linkEnd} to analyze your source code for known security vulnerabilities."
+msgstr ""
+
msgid "mrWidget|%{mergeError}."
msgstr ""
@@ -40606,6 +41192,9 @@ msgstr[2] ""
msgstr[3] ""
msgstr[4] ""
+msgid "mrWidget|Create issue to resolve all threads"
+msgstr ""
+
msgid "mrWidget|Delete source branch"
msgstr ""
@@ -40615,12 +41204,18 @@ msgstr ""
msgid "mrWidget|Did not close"
msgstr ""
+msgid "mrWidget|Dismiss"
+msgstr ""
+
msgid "mrWidget|Email patches"
msgstr ""
msgid "mrWidget|Failed to load deployment statistics"
msgstr ""
+msgid "mrWidget|Hide %{widget} details"
+msgstr ""
+
msgid "mrWidget|If the %{missingBranchName} branch exists in your local repository, you can merge this merge request manually using the command line"
msgstr ""
@@ -40719,9 +41314,6 @@ msgstr ""
msgid "mrWidget|Request to merge"
msgstr ""
-msgid "mrWidget|Resolve all threads in new issue"
-msgstr ""
-
msgid "mrWidget|Resolve conflicts"
msgstr ""
@@ -40737,6 +41329,9 @@ msgstr ""
msgid "mrWidget|Revoke approval"
msgstr ""
+msgid "mrWidget|SAST and Secret Detection is not enabled."
+msgstr ""
+
msgid "mrWidget|Set by %{merge_author} to be added to the merge train when the pipeline succeeds"
msgstr ""
@@ -40746,6 +41341,9 @@ msgstr ""
msgid "mrWidget|Set by %{merge_author} to start a merge train when the pipeline succeeds"
msgstr ""
+msgid "mrWidget|Show %{widget} details"
+msgstr ""
+
msgid "mrWidget|The changes were merged into"
msgstr ""
@@ -40758,6 +41356,9 @@ msgstr ""
msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure, or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
msgstr ""
+msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure."
+msgstr ""
+
msgid "mrWidget|The source branch has been deleted"
msgstr ""
@@ -40800,6 +41401,9 @@ msgstr ""
msgid "mrWidget|You can merge after removing denied licenses"
msgstr ""
+msgid "mrWidget|You can only merge once this merge request is approved."
+msgstr ""
+
msgid "mrWidget|Your password"
msgstr ""
@@ -40836,6 +41440,9 @@ msgstr ""
msgid "must be less than the limit of %{tag_limit} tags"
msgstr ""
+msgid "must be set for a project namespace"
+msgstr ""
+
msgid "must be unique by status and elapsed time within a policy"
msgstr ""
@@ -40951,6 +41558,9 @@ msgstr ""
msgid "pipeline"
msgstr ""
+msgid "pipeline schedules documentation"
+msgstr ""
+
msgid "pod_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
msgstr ""
@@ -41006,16 +41616,25 @@ msgstr ""
msgid "project name"
msgstr ""
+msgid "project namespace cannot be the parent of another namespace"
+msgstr ""
+
msgid "projects"
msgstr ""
msgid "quick actions"
msgstr ""
-msgid "reCAPTCHA Private Key"
+msgid "reCAPTCHA"
+msgstr ""
+
+msgid "reCAPTCHA helps prevent credential stuffing."
msgstr ""
-msgid "reCAPTCHA Site Key"
+msgid "reCAPTCHA private key"
+msgstr ""
+
+msgid "reCAPTCHA site key"
msgstr ""
msgid "recent activity"
@@ -41245,6 +41864,9 @@ msgstr ""
msgid "user avatar"
msgstr ""
+msgid "user namespace cannot be the parent of another namespace"
+msgstr ""
+
msgid "user preferences"
msgstr ""
@@ -41340,3 +41962,9 @@ msgstr ""
msgid "your settings"
msgstr ""
+msgid "{group}"
+msgstr ""
+
+msgid "{project}"
+msgstr ""
+
diff --git a/locale/bs_BA/gitlab.po b/locale/bs_BA/gitlab.po
index 0a8cfe0f5c1..5082627699d 100644
--- a/locale/bs_BA/gitlab.po
+++ b/locale/bs_BA/gitlab.po
@@ -14,10 +14,7 @@ msgstr ""
"X-Crowdin-Language: bs\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-09-01 22:31\n"
-
-msgid " %{name}, confirm your email address now! "
-msgstr ""
+"PO-Revision-Date: 2021-10-04 20:19\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -65,7 +62,7 @@ msgstr[1] ""
msgstr[2] ""
msgid " or "
-msgstr ""
+msgstr " ili "
msgid " or %{emphasisStart}!merge request id%{emphasisEnd}"
msgstr ""
@@ -94,6 +91,18 @@ msgstr ""
msgid "#general, #development"
msgstr ""
+msgid "%d Alert"
+msgid_plural "%d Alerts"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+msgid "%d Alert:"
+msgid_plural "%d Alerts:"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
msgid "%d Approval"
msgid_plural "%d Approvals"
msgstr[0] ""
@@ -156,9 +165,9 @@ msgstr[2] ""
msgid "%d child epic"
msgid_plural "%d child epics"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "%d pod-epik"
+msgstr[1] "%d pod-epika"
+msgstr[2] "%d pod-epika"
msgid "%d code quality issue"
msgid_plural "%d code quality issues"
@@ -168,9 +177,9 @@ msgstr[2] ""
msgid "%d comment"
msgid_plural "%d comments"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "%d komentar"
+msgstr[1] "%d komentara"
+msgstr[2] "%d komentara"
msgid "%d comment on this commit"
msgid_plural "%d comments on this commit"
@@ -303,9 +312,9 @@ msgstr[2] ""
msgid "%d issue"
msgid_plural "%d issues"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "%d zadatak"
+msgstr[1] "%d zadatka"
+msgstr[2] "%d zadataka"
msgid "%d issue in this group"
msgid_plural "%d issues in this group"
@@ -523,7 +532,10 @@ msgstr ""
msgid "%{code_open}Protected:%{code_close} Only exposed to protected branches or tags."
msgstr ""
-msgid "%{commit_author_link} authored %{commit_timeago}"
+msgid "%{commit_author_link} authored %{commit_authored_timeago}"
+msgstr ""
+
+msgid "%{commit_author_link} authored %{commit_authored_timeago} and %{commit_committer_avatar} %{commit_committer_link} committed %{commit_committer_timeago}"
msgstr ""
msgid "%{completedCount} completed weight"
@@ -622,6 +634,15 @@ msgstr ""
msgid "%{doc_link_start}Advanced search%{doc_link_end} is enabled."
msgstr ""
+msgid "%{docs_link_start}Learn about visibility levels.%{docs_link_end}"
+msgstr ""
+
+msgid "%{docs_link_start}What is Large File Storage?%{docs_link_end}"
+msgstr ""
+
+msgid "%{docs_link_start}What is two-factor authentication?%{docs_link_end}"
+msgstr ""
+
msgid "%{due_date} (Past due)"
msgstr ""
@@ -694,9 +715,6 @@ msgstr ""
msgid "%{issueType} actions"
msgstr ""
-msgid "%{issuesCount} issues with a limit of %{maxIssueCount}"
-msgstr ""
-
msgid "%{issuesSize} with a limit of %{maxIssueCount}"
msgstr ""
@@ -754,6 +772,12 @@ msgstr ""
msgid "%{label_for_message} unavailable"
msgstr ""
+msgid "%{learn_more_link}."
+msgstr ""
+
+msgid "%{lessThan} 1 hour"
+msgstr ""
+
msgid "%{lets_encrypt_link_start}Let's Encrypt%{lets_encrypt_link_end} is a free, automated, and open certificate authority (CA) that issues digital certificates to enable HTTPS (SSL/TLS) for sites."
msgstr ""
@@ -766,15 +790,15 @@ msgstr ""
msgid "%{link_start}Learn more%{link_end} about roles."
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
-msgstr ""
-
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
msgstr ""
msgid "%{link_start}Start the title with %{draft_snippet}%{link_end} to prevent a merge request that is a work in progress from being merged before it's ready."
msgstr ""
+msgid "%{link_start}What information does GitLab Inc. collect?%{link_end}"
+msgstr ""
+
msgid "%{listToShow}, and %{awardsListLength} more"
msgstr ""
@@ -803,7 +827,7 @@ msgid "%{model_name} not found"
msgstr ""
msgid "%{mrText}, this issue will be closed automatically."
-msgstr ""
+msgstr "%{mrText}, ovaj zadatak će se automatski zatvoriti."
msgid "%{name_with_link} namespace has %{percent} or less Shared Runner Pipeline minutes remaining. Once it runs out, no new jobs or pipelines in its projects will run."
msgstr ""
@@ -863,7 +887,7 @@ msgid "%{openedEpics} open, %{closedEpics} closed"
msgstr "%{openedEpics} otvoreno, %{closedEpics} zatvoreno"
msgid "%{openedIssues} open, %{closedIssues} closed"
-msgstr ""
+msgstr "%{openedIssues} otvoreno, %{closedIssues} zatvoreno"
msgid "%{percentage}%% weight completed"
msgstr ""
@@ -931,7 +955,7 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
-msgid "%{service_ping_link_start}Learn more%{service_ping_link_end} about what information is shared with GitLab Inc."
+msgid "%{service_ping_link_start}What information is shared with GitLab Inc.?%{service_ping_link_end}"
msgstr ""
msgid "%{size} %{unit}"
@@ -967,6 +991,9 @@ msgstr ""
msgid "%{state} epics"
msgstr ""
+msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
+msgstr ""
+
msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
msgstr ""
@@ -1033,12 +1060,6 @@ msgstr ""
msgid "%{template_project_id} is unknown or invalid"
msgstr ""
-msgid "%{text} %{files}"
-msgid_plural "%{text} %{files} files"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-
msgid "%{text} is available"
msgstr ""
@@ -1070,7 +1091,7 @@ msgid "%{total_warnings} warning(s) found:"
msgstr ""
msgid "%{total} open issue weight"
-msgstr ""
+msgstr "%{total} težina otvorenih zadataka"
msgid "%{total} warnings found: showing first %{warningsDisplayed}"
msgstr ""
@@ -1123,9 +1144,6 @@ msgstr ""
msgid "%{wildcards_link_start}Wildcards%{wildcards_link_end} such as %{code_tag_start}v*%{code_tag_end} or %{code_tag_start}*-release%{code_tag_end} are supported."
msgstr ""
-msgid "&lt; 1 hour"
-msgstr ""
-
msgid "'%{data}' at %{location} does not match format: %{format}"
msgstr ""
@@ -1210,9 +1228,6 @@ msgstr ""
msgid "(we need your current password to confirm your changes)"
msgstr ""
-msgid "* * * * *"
-msgstr ""
-
msgid "+ %{amount} more"
msgstr ""
@@ -1282,10 +1297,10 @@ msgstr ""
msgid "."
msgstr ""
-msgid "0 bytes"
+msgid "/"
msgstr ""
-msgid "0 for unlimited, only effective with remote storage enabled."
+msgid "0 bytes"
msgstr ""
msgid "0t1DgySidms"
@@ -1305,9 +1320,9 @@ msgstr[2] ""
msgid "1 closed issue"
msgid_plural "%{issues} closed issues"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "1 zatvoren zadatak"
+msgstr[1] "%{issues} zatvorena zadatka"
+msgstr[2] "%{issues} zatvorenih zadataka"
msgid "1 closed merge request"
msgid_plural "%{merge_requests} closed merge requests"
@@ -1389,9 +1404,9 @@ msgstr[2] ""
msgid "1 open issue"
msgid_plural "%{issues} open issues"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "1 otvoren zadatak"
+msgstr[1] "%{issues} otvorena zadatka"
+msgstr[2] "%{issues} otvorenih zadataka"
msgid "1 open merge request"
msgid_plural "%{merge_requests} open merge requests"
@@ -1438,6 +1453,9 @@ msgstr ""
msgid "1000+"
msgstr ""
+msgid "192.168.0.0/24"
+msgstr ""
+
msgid "1st contribution!"
msgstr ""
@@ -1591,9 +1609,6 @@ msgstr ""
msgid "A plain HTML site that uses Netlify for CI/CD instead of GitLab, but still with all the other great GitLab features"
msgstr ""
-msgid "A plain-text response to show to clients that hit the rate limit."
-msgstr ""
-
msgid "A platform value can be web, mob or app."
msgstr ""
@@ -1675,7 +1690,7 @@ msgstr ""
msgid "APIFuzzing|Configure HTTP basic authentication values. Other authentication methods are supported. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
+msgid "APIFuzzing|Customize your project's API fuzzing configuration options and copy the code snippet to your .gitlab-ci.yml file to apply any changes. Note that this tool does not reflect or update your .gitlab-ci.yml file automatically. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
msgstr ""
msgid "APIFuzzing|Enable authentication"
@@ -1738,9 +1753,6 @@ msgstr ""
msgid "APIFuzzing|To prevent a security leak, authentication info must be added as a %{ciVariablesLinkStart}CI variable%{ciVariablesLinkEnd}. As a user with maintainer access rights, you can manage CI variables in the %{ciSettingsLinkStart}Settings%{ciSettingsLinkEnd} area."
msgstr ""
-msgid "APIFuzzing|Use this tool to generate API fuzzing configuration YAML to copy into your .gitlab-ci.yml file. This tool does not reflect or update your .gitlab-ci.yml file automatically."
-msgstr ""
-
msgid "APIFuzzing|Username for basic authentication"
msgstr ""
@@ -1792,9 +1804,6 @@ msgstr ""
msgid "Abuse reports notification email"
msgstr ""
-msgid "Abuse reports will be sent to this address if it is set. Abuse reports are always available in the admin area."
-msgstr ""
-
msgid "Accept invitation"
msgstr ""
@@ -1831,12 +1840,18 @@ msgstr ""
msgid "Access granted"
msgstr ""
+msgid "Access key ID"
+msgstr ""
+
msgid "Access requests"
msgstr ""
msgid "Access to '%{classification_label}' not allowed"
msgstr ""
+msgid "Access tokens expire after 2 hours. A refresh token may be used at any time to generate a new access token. Non-expiring access tokens are deprecated. Clear this setting to enable backward compatibility."
+msgstr ""
+
msgid "AccessDropdown|Deploy Keys"
msgstr ""
@@ -2090,7 +2105,7 @@ msgid "Add broadcast message"
msgstr ""
msgid "Add child epic to an epic"
-msgstr ""
+msgstr "Dodaj pod-epik u epik"
msgid "Add comment now"
msgstr ""
@@ -2149,6 +2164,9 @@ msgstr ""
msgid "Add new directory"
msgstr ""
+msgid "Add new service account"
+msgstr ""
+
msgid "Add or remove previously merged commits"
msgstr ""
@@ -2189,7 +2207,7 @@ msgid "Add to board"
msgstr ""
msgid "Add to epic"
-msgstr ""
+msgstr "Dodaj u epik"
msgid "Add to merge train"
msgstr ""
@@ -2258,7 +2276,7 @@ msgid "Added a to do."
msgstr ""
msgid "Added an issue to an epic."
-msgstr ""
+msgstr "Zadatak dodan epiku."
msgid "Added at"
msgstr ""
@@ -2312,7 +2330,7 @@ msgid "Adds a to do."
msgstr ""
msgid "Adds an issue to an epic."
-msgstr ""
+msgstr "Dodaje zadatak epiku."
msgid "Adds email participant(s)"
msgstr ""
@@ -2386,6 +2404,9 @@ msgstr ""
msgid "AdminArea|Features"
msgstr ""
+msgid "AdminArea|Get security updates from GitLab and stay up to date"
+msgstr ""
+
msgid "AdminArea|Groups"
msgstr ""
@@ -2425,6 +2446,12 @@ msgstr ""
msgid "AdminArea|Reporter"
msgstr ""
+msgid "AdminArea|Sign up for the GitLab Security Newsletter to get notified for security updates."
+msgstr ""
+
+msgid "AdminArea|Sign up for the GitLab newsletter"
+msgstr ""
+
msgid "AdminArea|Stop all jobs"
msgstr ""
@@ -2494,9 +2521,15 @@ msgstr ""
msgid "AdminSettings|Disable public access to Pages sites"
msgstr ""
+msgid "AdminSettings|Display a banner on merge requests in projects with no pipelines to initiate steps to add a .gitlab-ci.yml file."
+msgstr ""
+
msgid "AdminSettings|Domain verification is an essential security measure for public GitLab sites. Users are required to demonstrate they control a domain before it is enabled. %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "AdminSettings|Enable pipeline suggestion banner"
+msgstr ""
+
msgid "AdminSettings|Enable shared runners for new projects"
msgstr ""
@@ -2968,10 +3001,10 @@ msgstr ""
msgid "Admin|Quarterly reconciliation will occur on %{qrtlyDate}"
msgstr ""
-msgid "Admin|The number of max seats used for your namespace is currently exceeding the number of seats in your subscription. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgid "Admin|The number of max seats in your namespace exceeds the number of seats in your subscription. On %{qrtlyDate}, quarterly reconciliation occurs and you are automatically billed a prorated amount for the overage. No action is needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice. For more information about the timing of the invoicing process, view the documentation."
msgstr ""
-msgid "Admin|The number of maximum users for your instance is currently exceeding the number of users in license. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgid "Admin|The number of max users in your instance exceeds the number of users in your license. On %{qrtlyDate}, quarterly reconciliation occurs and you are automatically billed a prorated amount for the overage. No action is needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice. For more information about the timing of the invoicing process, view the documentation."
msgstr ""
msgid "Admin|View pending user approvals"
@@ -2992,9 +3025,6 @@ msgstr ""
msgid "Advanced export options"
msgstr ""
-msgid "Advanced permissions, Large File Storage and Two-Factor authentication settings."
-msgstr ""
-
msgid "After a successful password update you will be redirected to login screen."
msgstr ""
@@ -3013,14 +3043,14 @@ msgstr ""
msgid "After you've reviewed these contribution guidelines, you'll be all set to"
msgstr ""
+msgid "Akismet"
+msgstr ""
+
msgid "Akismet API Key"
msgstr ""
-msgid "Alert"
-msgid_plural "Alerts"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgid "Akismet helps prevent the creation of spam issues in public projects."
+msgstr ""
msgid "AlertManagement|Acknowledged"
msgstr ""
@@ -3376,6 +3406,9 @@ msgstr ""
msgid "All (default)"
msgstr ""
+msgid "All GitLab"
+msgstr ""
+
msgid "All Members"
msgstr ""
@@ -3490,6 +3523,9 @@ msgstr ""
msgid "Allow this secondary node to replicate content on Object Storage"
msgstr ""
+msgid "Allow use of licensed EE features"
+msgstr ""
+
msgid "Allow users to dismiss the broadcast message"
msgstr ""
@@ -3565,9 +3601,6 @@ msgstr ""
msgid "Amazon authentication is not %{link_start}correctly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
-msgid "Amount of time (in hours) that users are allowed to skip forced configuration of two-factor authentication"
-msgstr ""
-
msgid "An %{link_start}alert%{link_end} with the same fingerprint is already open. To change the status of this alert, resolve the linked alert."
msgstr ""
@@ -3628,12 +3661,6 @@ msgstr ""
msgid "An error occurred when removing the label."
msgstr ""
-msgid "An error occurred when toggling the notification subscription"
-msgstr ""
-
-msgid "An error occurred when updating the issue weight"
-msgstr ""
-
msgid "An error occurred when updating the title"
msgstr ""
@@ -3682,6 +3709,9 @@ msgstr ""
msgid "An error occurred while enabling Service Desk."
msgstr ""
+msgid "An error occurred while fetching Markdown preview"
+msgstr ""
+
msgid "An error occurred while fetching ancestors"
msgstr ""
@@ -3712,9 +3742,6 @@ msgstr ""
msgid "An error occurred while fetching label colors."
msgstr ""
-msgid "An error occurred while fetching markdown preview"
-msgstr ""
-
msgid "An error occurred while fetching participants"
msgstr ""
@@ -3730,9 +3757,6 @@ msgstr ""
msgid "An error occurred while fetching reference"
msgstr ""
-msgid "An error occurred while fetching sidebar data"
-msgstr ""
-
msgid "An error occurred while fetching tags. Retry the search."
msgstr ""
@@ -3808,6 +3832,9 @@ msgstr ""
msgid "An error occurred while loading merge requests."
msgstr ""
+msgid "An error occurred while loading projects."
+msgstr ""
+
msgid "An error occurred while loading the Needs tab."
msgstr ""
@@ -4042,12 +4069,6 @@ msgstr ""
msgid "Any Milestone"
msgstr ""
-msgid "Any branch"
-msgstr ""
-
-msgid "Any eligible user"
-msgstr ""
-
msgid "Any encrypted tokens"
msgstr ""
@@ -4066,6 +4087,9 @@ msgstr ""
msgid "Any namespace"
msgstr ""
+msgid "App Engine description and apps that are suitable for this deployment target"
+msgstr ""
+
msgid "App ID"
msgstr ""
@@ -4216,6 +4240,12 @@ msgstr ""
msgid "Apply"
msgstr ""
+msgid "Apply %d suggestion"
+msgid_plural "Apply %d suggestions"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
msgid "Apply a label"
msgstr ""
@@ -4225,13 +4255,10 @@ msgstr ""
msgid "Apply suggestion"
msgstr ""
-msgid "Apply suggestions"
-msgstr ""
-
msgid "Apply template"
msgstr ""
-msgid "Apply this approval rule to any branch or a specific protected branch."
+msgid "Apply this approval rule to all branches or a specific protected branch."
msgstr ""
msgid "Applying"
@@ -4378,9 +4405,6 @@ msgstr ""
msgid "ApprovalSettings|Prevent editing approval rules in projects and merge requests."
msgstr ""
-msgid "ApprovalSettings|Prevent editing approval rules in projects and merge requests. "
-msgstr ""
-
msgid "ApprovalSettings|Remove all approvals when commits are added to the source branch."
msgstr ""
@@ -4396,6 +4420,9 @@ msgstr ""
msgid "ApprovalSettings|This setting is configured at the instance level and can only be changed by an administrator."
msgstr ""
+msgid "ApprovalSettings|This setting is configured in %{groupName} and can only be changed by an administrator or group owner."
+msgstr ""
+
msgid "ApprovalStatusTooltip|Adheres to separation of duties"
msgstr ""
@@ -4718,7 +4745,7 @@ msgid "Assign reviewer(s)"
msgstr ""
msgid "Assign some issues to this milestone."
-msgstr ""
+msgstr "Dodaj neke zadatke ovom cilju."
msgid "Assign to"
msgstr ""
@@ -4739,7 +4766,7 @@ msgid "Assigned %{reviewer_users_sentence} as %{reviewer_text}."
msgstr ""
msgid "Assigned Issues"
-msgstr ""
+msgstr "Zaduženi zadaci"
msgid "Assigned merge requests"
msgstr ""
@@ -4885,9 +4912,6 @@ msgstr ""
msgid "Authenticated API rate limit period in seconds"
msgstr ""
-msgid "Authenticated API request rate limit"
-msgstr ""
-
msgid "Authenticated API requests"
msgstr ""
@@ -4897,10 +4921,10 @@ msgstr ""
msgid "Authenticated Git LFS request rate limit"
msgstr ""
-msgid "Authenticated web rate limit period in seconds"
+msgid "Authenticated Git LFS requests"
msgstr ""
-msgid "Authenticated web request rate limit"
+msgid "Authenticated web rate limit period in seconds"
msgstr ""
msgid "Authenticated web requests"
@@ -5278,9 +5302,6 @@ msgstr ""
msgid "Below you will find all the groups that are public."
msgstr ""
-msgid "Beta"
-msgstr ""
-
msgid "Bi-weekly code coverage"
msgstr ""
@@ -5504,7 +5525,7 @@ msgstr[1] ""
msgstr[2] ""
msgid "Blocked issue"
-msgstr ""
+msgstr "Blokirani zadaci"
msgid "Blocking"
msgstr ""
@@ -5521,6 +5542,21 @@ msgstr ""
msgid "Board scope affects which issues are displayed for anyone who visits this board"
msgstr ""
+msgid "BoardNewEpic|Groups"
+msgstr ""
+
+msgid "BoardNewEpic|Loading groups"
+msgstr ""
+
+msgid "BoardNewEpic|No matching results"
+msgstr ""
+
+msgid "BoardNewEpic|Search groups"
+msgstr ""
+
+msgid "BoardNewEpic|Select a group"
+msgstr ""
+
msgid "BoardNewIssue|No matching results"
msgstr ""
@@ -5599,6 +5635,9 @@ msgstr ""
msgid "Boards|An error occurred while creating the list. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching child groups. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching group projects. Please try again."
msgstr ""
@@ -5932,6 +5971,9 @@ msgstr ""
msgid "Bulk update"
msgstr ""
+msgid "BulkImports|Re-import creates a new group. It does not sync with the existing group."
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -5941,6 +5983,9 @@ msgstr ""
msgid "BulkImport|From source group"
msgstr ""
+msgid "BulkImport|Group import history"
+msgstr ""
+
msgid "BulkImport|Import failed: Destination cannot be a subgroup of the source group. Change the destination and try again."
msgstr ""
@@ -5953,9 +5998,18 @@ msgstr ""
msgid "BulkImport|Importing the group failed"
msgstr ""
+msgid "BulkImport|Last imported to %{link}"
+msgstr ""
+
msgid "BulkImport|Name already exists."
msgstr ""
+msgid "BulkImport|New group"
+msgstr ""
+
+msgid "BulkImport|No history is available"
+msgstr ""
+
msgid "BulkImport|No parent"
msgstr ""
@@ -5968,6 +6022,9 @@ msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} matching filter \"%{filter}\" from %{link}"
msgstr ""
+msgid "BulkImport|Source group"
+msgstr ""
+
msgid "BulkImport|To new group"
msgstr ""
@@ -5977,6 +6034,9 @@ msgstr ""
msgid "BulkImport|You have no groups to import"
msgstr ""
+msgid "BulkImport|Your imported groups will appear here."
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -6220,6 +6280,9 @@ msgstr ""
msgid "Can be manually deployed to"
msgstr ""
+msgid "Can be overridden in each project."
+msgstr ""
+
msgid "Can create groups:"
msgstr ""
@@ -6322,6 +6385,9 @@ msgstr ""
msgid "Cancelling Preview"
msgstr ""
+msgid "Cannot assign a confidential epic to a non-confidential issue. Make the issue confidential and try again"
+msgstr ""
+
msgid "Cannot be assigned to other projects."
msgstr ""
@@ -6373,9 +6439,6 @@ msgstr ""
msgid "Cannot refer to a group %{timebox_type} by an internal id!"
msgstr ""
-msgid "Cannot set confidential epic for a non-confidential issue"
-msgstr ""
-
msgid "Cannot show preview. For previews on sketch files, they must have the file format introduced by Sketch version 43 and above."
msgstr ""
@@ -6613,15 +6676,15 @@ msgstr ""
msgid "Check out, review, and merge locally"
msgstr ""
-msgid "Check the %{docs_link_start}documentation%{docs_link_end}."
-msgstr ""
-
msgid "Check the current instance configuration "
msgstr ""
msgid "Check the elasticsearch.log file to debug why the migration was halted and make any changes before retrying the migration. When you fix the cause of the failure, click \"Retry migration\", and the migration will be scheduled to be retried in the background."
msgstr ""
+msgid "Check with your administrator."
+msgstr ""
+
msgid "Check your Docker images for known vulnerabilities."
msgstr ""
@@ -6652,6 +6715,9 @@ msgstr ""
msgid "Checkout"
msgstr ""
+msgid "Checkout|$%{selectedPlanPrice} per 10 GB storage per pack"
+msgstr ""
+
msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 minutes"
msgstr ""
@@ -6673,18 +6739,24 @@ msgstr ""
msgid "Checkout|%{name}'s GitLab subscription"
msgstr ""
-msgid "Checkout|%{selectedPlanText} plan"
+msgid "Checkout|%{name}'s storage subscription"
msgstr ""
-msgid "Checkout|%{startDate} - %{endDate}"
+msgid "Checkout|%{quantity} GB of storage"
msgstr ""
-msgid "Checkout|%{totalCiMinutes} CI minute"
-msgid_plural "Checkout|%{totalCiMinutes} CI minutes"
+msgid "Checkout|%{quantity} storage pack"
+msgid_plural "Checkout|%{quantity} storage packs"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
+msgid "Checkout|%{selectedPlanText} plan"
+msgstr ""
+
+msgid "Checkout|%{startDate} - %{endDate}"
+msgstr ""
+
msgid "Checkout|%{totalCiMinutes} CI minutes"
msgstr ""
@@ -6760,6 +6832,9 @@ msgstr ""
msgid "Checkout|Failed to register credit card. Please try again."
msgstr ""
+msgid "Checkout|GB"
+msgstr ""
+
msgid "Checkout|GitLab group"
msgstr ""
@@ -6796,6 +6871,9 @@ msgstr ""
msgid "Checkout|State"
msgstr ""
+msgid "Checkout|Storage packs"
+msgstr ""
+
msgid "Checkout|Street address"
msgstr ""
@@ -6817,6 +6895,9 @@ msgstr ""
msgid "Checkout|Total minutes: %{quantity}"
msgstr ""
+msgid "Checkout|Total storage: %{quantity} GB"
+msgstr ""
+
msgid "Checkout|Users"
msgstr ""
@@ -6826,16 +6907,25 @@ msgstr ""
msgid "Checkout|Your organization"
msgstr ""
+msgid "Checkout|Your storage subscription has the same term as your main subscription, and the price is prorated accordingly."
+msgstr ""
+
msgid "Checkout|Your subscription will be applied to this group"
msgstr ""
msgid "Checkout|Zip code"
msgstr ""
+msgid "Checkout|a storage subscription"
+msgstr ""
+
msgid "Checkout|company or team"
msgstr ""
-msgid "Checkout|x 1,000 minutes per pack = %{strong}"
+msgid "Checkout|minutes"
+msgstr ""
+
+msgid "Checkout|x %{quantity} %{units} per pack ="
msgstr ""
msgid "Cherry-pick this commit"
@@ -7192,6 +7282,9 @@ msgstr ""
msgid "CloneIssue|Cannot clone issue to target project as it is pending deletion."
msgstr ""
+msgid "CloneIssue|Cannot clone issues of '%{issue_type}' type."
+msgstr ""
+
msgid "Cloned this issue to %{path_to_project}."
msgstr ""
@@ -7235,7 +7328,7 @@ msgid "Closed epics"
msgstr ""
msgid "Closed issues"
-msgstr ""
+msgstr "Zatvoreni zadaci"
msgid "Closed this %{quick_action_target}."
msgstr ""
@@ -7246,7 +7339,10 @@ msgstr ""
msgid "Closes this %{quick_action_target}."
msgstr ""
-msgid "Cloud licenses can not be removed."
+msgid "Cloud Functions description and apps that are suitable for this deployment target"
+msgstr ""
+
+msgid "Cloud Run description and apps that are suitable for this deployment target"
msgstr ""
msgid "Cluster"
@@ -7273,6 +7369,12 @@ msgstr ""
msgid "ClusterAgents|Access tokens"
msgstr ""
+msgid "ClusterAgents|Agent might not be connected to GitLab"
+msgstr ""
+
+msgid "ClusterAgents|Agent never connected to GitLab"
+msgstr ""
+
msgid "ClusterAgents|Alternative installation methods"
msgstr ""
@@ -7288,6 +7390,12 @@ msgstr ""
msgid "ClusterAgents|Configuration"
msgstr ""
+msgid "ClusterAgents|Connected"
+msgstr ""
+
+msgid "ClusterAgents|Connection status"
+msgstr ""
+
msgid "ClusterAgents|Copy token"
msgstr ""
@@ -7306,6 +7414,9 @@ msgstr ""
msgid "ClusterAgents|For alternative installation methods %{linkStart}go to the documentation%{linkEnd}."
msgstr ""
+msgid "ClusterAgents|For more troubleshooting information go to"
+msgstr ""
+
msgid "ClusterAgents|Go to the repository"
msgstr ""
@@ -7321,18 +7432,30 @@ msgstr ""
msgid "ClusterAgents|Integrate with the GitLab Agent"
msgstr ""
-msgid "ClusterAgents|Last used"
+msgid "ClusterAgents|Last connected %{timeAgo}."
+msgstr ""
+
+msgid "ClusterAgents|Last contact"
msgstr ""
msgid "ClusterAgents|Learn how to create an agent access token"
msgstr ""
+msgid "ClusterAgents|Make sure you are using a valid token."
+msgstr ""
+
msgid "ClusterAgents|Name"
msgstr ""
msgid "ClusterAgents|Never"
msgstr ""
+msgid "ClusterAgents|Never connected"
+msgstr ""
+
+msgid "ClusterAgents|Not connected"
+msgstr ""
+
msgid "ClusterAgents|Read more about getting started"
msgstr ""
@@ -7354,6 +7477,9 @@ msgstr ""
msgid "ClusterAgents|Select which Agent you want to install"
msgstr ""
+msgid "ClusterAgents|The Agent has not been connected in a long time. There might be a connectivity issue. Last contact was %{timeAgo}."
+msgstr ""
+
msgid "ClusterAgents|The GitLab Agent also requires %{linkStart}enabling the Agent Server%{linkEnd}"
msgstr ""
@@ -7381,9 +7507,6 @@ msgstr ""
msgid "ClusterAgents|You will need to create a token to connect to your agent"
msgstr ""
-msgid "ClusterAgent|This feature is only available for premium plans"
-msgstr ""
-
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -7573,9 +7696,6 @@ msgstr ""
msgid "ClusterIntegration|Create Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Create a provision role on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the account and external ID above. %{startMoreInfoLink}More information%{endLink}"
-msgstr ""
-
msgid "ClusterIntegration|Create cluster on"
msgstr ""
@@ -8008,7 +8128,7 @@ msgstr ""
msgid "ClusterIntegration|Subnets"
msgstr ""
-msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provisioned role, first create one on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the above account and external IDs. %{startMoreInfoLink}More information%{endLink}"
+msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provisioned role, first create one on %{awsLinkStart}Amazon Web Services %{awsLinkEnd} using the above account and external IDs. %{moreInfoStart}More information%{moreInfoEnd}"
msgstr ""
msgid "ClusterIntegration|The Kubernetes certificate used to authenticate to the cluster."
@@ -8242,6 +8362,9 @@ msgstr ""
msgid "Collapse replies"
msgstr ""
+msgid "Collapse settings section"
+msgstr ""
+
msgid "Collapse sidebar"
msgstr ""
@@ -8260,6 +8383,9 @@ msgstr ""
msgid "Comma-separated list of email addresses."
msgstr ""
+msgid "Comma-separated list of users allowed to exceed the rate limit."
+msgstr ""
+
msgid "Comma-separated, e.g. '1.1.1.1, 2.2.2.0/24'"
msgstr ""
@@ -8581,6 +8707,9 @@ msgstr ""
msgid "Configure %{repository_checks_link_start}repository checks%{link_end} and %{housekeeping_link_start}housekeeping%{link_end} on repositories."
msgstr ""
+msgid "Configure CAPTCHAs, IP address limits, and other anti-spam measures."
+msgstr ""
+
msgid "Configure Dependency Scanning in `.gitlab-ci.yml` using the GitLab managed template. You can [add variable overrides](https://docs.gitlab.com/ee/user/application_security/dependency_scanning/#customizing-the-dependency-scanning-settings) to customize Dependency Scanning settings."
msgstr ""
@@ -8617,16 +8746,13 @@ msgstr ""
msgid "Configure a %{codeStart}.gitlab-webide.yml%{codeEnd} file in the %{codeStart}.gitlab%{codeEnd} directory to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
msgstr ""
-msgid "Configure existing installation"
+msgid "Configure advanced permissions, Large File Storage, and two-factor authentication settings."
msgstr ""
-msgid "Configure limit for notes created per minute by web and API requests."
+msgid "Configure approvals by authors and committers on all projects."
msgstr ""
-msgid "Configure limits for Project/Group Import/Export."
-msgstr ""
-
-msgid "Configure limits for web and API requests."
+msgid "Configure existing installation"
msgstr ""
msgid "Configure paths to be protected by Rack Attack."
@@ -8641,10 +8767,13 @@ msgstr ""
msgid "Configure settings for Advanced Search with Elasticsearch."
msgstr ""
+msgid "Configure specific limits for Files API requests that supersede the general user and IP rate limits."
+msgstr ""
+
msgid "Configure specific limits for Git LFS requests that supersede the general user and IP rate limits."
msgstr ""
-msgid "Configure specific limits for Packages API requests that supersede the general user and IP rate limits."
+msgid "Configure specific limits for deprecated API requests that supersede the general user and IP rate limits."
msgstr ""
msgid "Configure the %{link} integration."
@@ -8656,6 +8785,9 @@ msgstr ""
msgid "Configure the way a user creates a new account."
msgstr ""
+msgid "Configure via Merge Request"
+msgstr ""
+
msgid "Configure which lists are shown for anyone who visits this board"
msgstr ""
@@ -9127,6 +9259,9 @@ msgstr ""
msgid "Content parsed with %{link}."
msgstr ""
+msgid "ContentEditor|Table of Contents"
+msgstr ""
+
msgid "ContentEditor|You have to provide a renderMarkdown function or a custom serializer"
msgstr ""
@@ -9313,6 +9448,9 @@ msgstr ""
msgid "Copy link to chart"
msgstr ""
+msgid "Copy prefix"
+msgstr ""
+
msgid "Copy reference"
msgstr ""
@@ -9343,6 +9481,9 @@ msgstr ""
msgid "Copy value"
msgstr ""
+msgid "Corpus Management"
+msgstr ""
+
msgid "Corpus Management|Are you sure you want to delete the corpus?"
msgstr ""
@@ -9548,7 +9689,7 @@ msgid "Create a new file as there are no files yet. Afterwards, you'll be able t
msgstr ""
msgid "Create a new issue"
-msgstr ""
+msgstr "Kreiraj novi zadatak"
msgid "Create a new repository"
msgstr ""
@@ -9571,6 +9712,9 @@ msgstr ""
msgid "Create commit"
msgstr ""
+msgid "Create common files more quickly, and standardize their format."
+msgstr ""
+
msgid "Create confidential merge request"
msgstr ""
@@ -9602,6 +9746,9 @@ msgid "Create incident"
msgstr ""
msgid "Create issue"
+msgstr "Kreiraj zadatak"
+
+msgid "Create issue to resolve all threads"
msgstr ""
msgid "Create iteration"
@@ -9611,7 +9758,7 @@ msgid "Create list"
msgstr ""
msgid "Create lists from labels. Issues with that label appear in that list."
-msgstr ""
+msgstr "Napravi liste od etiketa. Zadaci sa tom etiketom se pojavljuju na toj listi."
msgid "Create merge request"
msgstr ""
@@ -9658,6 +9805,9 @@ msgstr ""
msgid "Create new..."
msgstr ""
+msgid "Create or import your first project"
+msgstr ""
+
msgid "Create project"
msgstr ""
@@ -9833,16 +9983,16 @@ msgid "Created"
msgstr "Kreirano"
msgid "Created %{epicTimeagoDate}"
-msgstr ""
+msgstr "Kreirano %{epicTimeagoDate}"
msgid "Created %{timestamp}"
-msgstr ""
+msgstr "Kreirano %{timestamp}"
msgid "Created At"
-msgstr ""
+msgstr "Kreirano u"
msgid "Created On"
-msgstr ""
+msgstr "Kreirano:"
msgid "Created a branch and a merge request to resolve this issue."
msgstr ""
@@ -9863,19 +10013,19 @@ msgid "Created date"
msgstr ""
msgid "Created issue %{issueLink}"
-msgstr ""
+msgstr "Kreiran zadatak %{issueLink}"
msgid "Created issue %{issueLink} at %{projectLink}"
-msgstr ""
+msgstr "Kreiran zadatak %{issueLink} u %{projectLink}"
msgid "Created merge request %{mergeRequestLink}"
-msgstr ""
+msgstr "Kreiran merge request %{mergeRequestLink}"
msgid "Created merge request %{mergeRequestLink} at %{projectLink}"
-msgstr ""
+msgstr "Kreiran merge request %{mergeRequestLink} u %{projectLink}"
msgid "Created on"
-msgstr ""
+msgstr "Kreirano:"
msgid "Created on %{created_at}"
msgstr ""
@@ -10015,7 +10165,7 @@ msgstr ""
msgid "Custom notification events"
msgstr ""
-msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notificationLinkStart} notification emails%{notificationLinkEnd}."
+msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notificationLinkStart}notification emails%{notificationLinkEnd}."
msgstr ""
msgid "Custom project templates"
@@ -10216,10 +10366,10 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
-msgid "CycleAnalytics|Showing data for group '%{groupName}' and %{selectedProjectCount} projects from %{startDate} to %{endDate}"
+msgid "CycleAnalytics|Showing data for group '%{groupName}' and %{selectedProjectCount} projects from %{createdAfter} to %{createdBefore}"
msgstr ""
-msgid "CycleAnalytics|Showing data for group '%{groupName}' from %{startDate} to %{endDate}"
+msgid "CycleAnalytics|Showing data for group '%{groupName}' from %{createdAfter} to %{createdBefore}"
msgstr ""
msgid "CycleAnalytics|Stages"
@@ -10453,6 +10603,9 @@ msgstr ""
msgid "DastProfiles|Manage profiles"
msgstr ""
+msgid "DastProfiles|Manage site profiles"
+msgstr ""
+
msgid "DastProfiles|Minimum = 0 (no timeout enabled), Maximum = 2880 minutes"
msgstr ""
@@ -10528,6 +10681,9 @@ msgstr ""
msgid "DastProfiles|Scanner name"
msgstr ""
+msgid "DastProfiles|Schedule"
+msgstr ""
+
msgid "DastProfiles|Select branch"
msgstr ""
@@ -10597,7 +10753,7 @@ msgstr ""
msgid "DastProfiles|Website"
msgstr ""
-msgid "DastProfiles|You can either choose a passive scan or validate the target site in your chosen site profile. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
+msgid "DastProfiles|You can either choose a passive scan or validate the target site from the site profile management page. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
msgstr ""
msgid "DastProfiles|You cannot run an active scan against an unvalidated site."
@@ -10771,7 +10927,7 @@ msgstr "Dani"
msgid "Days to merge"
msgstr ""
-msgid "Deactivate dormant users after 90 days of inactivity. Users can return to active status by signing in to their account. While inactive, a user is not counted as an active user in the instance."
+msgid "Deactivate dormant users after 90 days of inactivity"
msgstr ""
msgid "Dear Administrator,"
@@ -10858,10 +11014,10 @@ msgstr ""
msgid "Define a custom pattern with cron syntax"
msgstr ""
-msgid "Define approval settings."
+msgid "Define approval rules."
msgstr ""
-msgid "Define approval settings. %{linkStart}Learn more.%{linkEnd}"
+msgid "Define approval rules. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "Define custom rules for what constitutes spam, independent of Akismet"
@@ -10870,7 +11026,7 @@ msgstr ""
msgid "Define environments in the deploy stage(s) in %{code_open}.gitlab-ci.yml%{code_close} to track deployments here."
msgstr ""
-msgid "Define how approval rules are applied as a merge request moves toward completion."
+msgid "Define how approval rules are applied to merge requests."
msgstr ""
msgid "Definition"
@@ -10885,6 +11041,12 @@ msgstr ""
msgid "DelayedJobs|Are you sure you want to run %{job_name} immediately? This job will run automatically after it's timer finishes."
msgstr ""
+msgid "DelayedJobs|Are you sure you want to run %{job_name} immediately? This job will run automatically after its timer finishes."
+msgstr ""
+
+msgid "DelayedJobs|Run the delayed job now?"
+msgstr ""
+
msgid "DelayedJobs|Start now"
msgstr ""
@@ -11164,6 +11326,12 @@ msgstr ""
msgid "Dependency proxy image prefix"
msgstr ""
+msgid "DependencyProxy|Create a local proxy for storing frequently used upstream images. %{docLinkStart}Learn more%{docLinkEnd} about dependency proxies."
+msgstr ""
+
+msgid "DependencyProxy|Dependency Proxy"
+msgstr ""
+
msgid "DependencyProxy|Toggle Dependency Proxy"
msgstr ""
@@ -11407,6 +11575,9 @@ msgstr ""
msgid "Deployments"
msgstr ""
+msgid "Deployments to Google Kubernetes Engine can be "
+msgstr ""
+
msgid "Deployments|%{deployments} environment impacted."
msgid_plural "Deployments|%{deployments} environments impacted."
msgstr[0] ""
@@ -11437,6 +11608,9 @@ msgstr ""
msgid "Deployment|success"
msgstr ""
+msgid "Deprecated API rate limits"
+msgstr ""
+
msgid "Deprioritize label"
msgstr ""
@@ -11839,6 +12013,18 @@ msgstr ""
msgid "DiffsCompareBaseBranch|(base)"
msgstr ""
+msgid "Diffs|%d addition"
+msgid_plural "Diffs|%d additions"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+msgid "Diffs|%d deletion"
+msgid_plural "Diffs|%d deletions"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
msgid "Diffs|No file name available"
msgstr ""
@@ -11848,9 +12034,18 @@ msgstr ""
msgid "Diffs|Show all unchanged lines"
msgstr ""
+msgid "Diffs|Showing %{dropdownStart}%{count} changed file%{dropdownEnd}"
+msgid_plural "Diffs|Showing %{dropdownStart}%{count} changed files%{dropdownEnd}"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
msgid "Diffs|Something went wrong while fetching diff lines."
msgstr ""
+msgid "Diffs|with %{additions} and %{deletions}"
+msgstr ""
+
msgid "Direct member"
msgstr ""
@@ -11977,9 +12172,6 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
-msgid "Dismiss Value Stream Analytics introduction box"
-msgstr ""
-
msgid "Dismiss merge request promotion"
msgstr ""
@@ -12299,6 +12491,9 @@ msgid "Edit inline"
msgstr ""
msgid "Edit issues"
+msgstr "Uredi zadatke"
+
+msgid "Edit merge requests"
msgstr ""
msgid "Edit public deploy key"
@@ -12376,6 +12571,9 @@ msgstr ""
msgid "Elastic|None. Select projects to index."
msgstr ""
+msgid "Eligible users"
+msgstr ""
+
msgid "Email"
msgstr ""
@@ -12505,6 +12703,9 @@ msgstr ""
msgid "Enable"
msgstr ""
+msgid "Enable Amazon EKS integration"
+msgstr ""
+
msgid "Enable Auto DevOps"
msgstr ""
@@ -12538,6 +12739,9 @@ msgstr ""
msgid "Enable SSL verification"
msgstr ""
+msgid "Enable Service Ping"
+msgstr ""
+
msgid "Enable Snowplow tracking"
msgstr ""
@@ -12568,6 +12772,9 @@ msgstr ""
msgid "Enable authenticated Git LFS request rate limit"
msgstr ""
+msgid "Enable authenticated web request rate limit"
+msgstr ""
+
msgid "Enable authentication"
msgstr ""
@@ -12628,7 +12835,7 @@ msgstr ""
msgid "Enable or disable the Pseudonymizer data collection."
msgstr ""
-msgid "Enable or disable version check and service ping."
+msgid "Enable or disable version check and Service Ping."
msgstr ""
msgid "Enable protected paths rate limit"
@@ -12640,18 +12847,12 @@ msgstr ""
msgid "Enable reCAPTCHA"
msgstr ""
-msgid "Enable reCAPTCHA for login"
-msgstr ""
-
-msgid "Enable reCAPTCHA, Invisible Captcha, Akismet and set IP limits. For reCAPTCHA, we currently only support %{recaptcha_v2_link_start}v2%{recaptcha_v2_link_end}"
+msgid "Enable reCAPTCHA for login."
msgstr ""
msgid "Enable repository checks"
msgstr ""
-msgid "Enable service ping"
-msgstr ""
-
msgid "Enable shared runners for all projects and subgroups in this group."
msgstr ""
@@ -12673,7 +12874,10 @@ msgstr ""
msgid "Enable unauthenticated API request rate limit"
msgstr ""
-msgid "Enable unauthenticated request rate limit"
+msgid "Enable unauthenticated web request rate limit"
+msgstr ""
+
+msgid "Enable user deactivation emails"
msgstr ""
msgid "Enable version check"
@@ -12709,9 +12913,6 @@ msgstr ""
msgid "Enabled sources for code import during project creation. OmniAuth must be configured for GitHub"
msgstr ""
-msgid "Enabling this will only make licensed EE features available to projects if the project namespace's plan includes the feature or if the project is public."
-msgstr ""
-
msgid "Encountered an error while rendering: %{err}"
msgstr ""
@@ -12760,9 +12961,6 @@ msgstr ""
msgid "Enter Admin Mode"
msgstr ""
-msgid "Enter IP address range"
-msgstr ""
-
msgid "Enter a number"
msgstr ""
@@ -12775,9 +12973,6 @@ msgstr ""
msgid "Enter at least three characters to search"
msgstr ""
-msgid "Enter domain"
-msgstr ""
-
msgid "Enter in your Bitbucket Server URL and personal access token below"
msgstr ""
@@ -12791,7 +12986,7 @@ msgid "Enter new AWS Secret Access Key"
msgstr ""
msgid "Enter number of issues"
-msgstr ""
+msgstr "Unesi broj zadataka"
msgid "Enter one or more user ID separated by commas"
msgstr ""
@@ -12964,9 +13159,6 @@ msgstr ""
msgid "Environments|Deployment %{status}"
msgstr ""
-msgid "Environments|Dismiss"
-msgstr ""
-
msgid "Environments|Enable review app"
msgstr ""
@@ -12979,9 +13171,6 @@ msgstr ""
msgid "Environments|Environments are places where code gets deployed, such as staging or production."
msgstr ""
-msgid "Environments|Help us improve environments"
-msgstr ""
-
msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
msgstr ""
@@ -13018,6 +13207,9 @@ msgstr ""
msgid "Environments|Note that this action will stop the environment, but it will %{emphasisStart}not%{emphasisEnd} have an effect on any existing deployment due to no “stop environment action†being defined in the %{ciConfigLinkStart}.gitlab-ci.yml%{ciConfigLinkEnd} file."
msgstr ""
+msgid "Environments|Open"
+msgstr ""
+
msgid "Environments|Open live environment"
msgstr ""
@@ -13057,9 +13249,6 @@ msgstr ""
msgid "Environments|Stopping %{environmentName}"
msgstr ""
-msgid "Environments|Take the survey"
-msgstr ""
-
msgid "Environments|There was an error fetching the logs. Please try again."
msgstr ""
@@ -13081,9 +13270,6 @@ msgstr ""
msgid "Environments|You don't have any environments right now"
msgstr ""
-msgid "Environments|Your feedback helps GitLab make environments better for you and other users. Participate and enter a sweepstake to win a USD 30 gift card."
-msgstr ""
-
msgid "Environments|by %{avatar}"
msgstr ""
@@ -13115,7 +13301,7 @@ msgid "Epics Roadmap"
msgstr ""
msgid "Epics and Issues"
-msgstr ""
+msgstr "Epici i Zadaci"
msgid "Epics let you manage your portfolio of projects more efficiently and with less effort"
msgstr ""
@@ -13163,7 +13349,7 @@ msgid "Epics|Remove epic"
msgstr ""
msgid "Epics|Remove issue"
-msgstr ""
+msgstr "Ukloni zadatak"
msgid "Epics|Search epics"
msgstr ""
@@ -13175,13 +13361,13 @@ msgid "Epics|Show more"
msgstr ""
msgid "Epics|Something went wrong while assigning issue to epic."
-msgstr ""
+msgstr "Problem pri dodavanju zadatka epiku."
msgid "Epics|Something went wrong while creating child epics."
msgstr ""
msgid "Epics|Something went wrong while creating issue."
-msgstr ""
+msgstr "Problem pri kreiranju zadatka."
msgid "Epics|Something went wrong while fetching child epics."
msgstr ""
@@ -13199,7 +13385,7 @@ msgid "Epics|Something went wrong while ordering item."
msgstr ""
msgid "Epics|Something went wrong while removing issue from epic."
-msgstr ""
+msgstr "Problem pri uklanjanju zadatka iz epika."
msgid "Epics|These dates affect how your epics appear in the roadmap. Dates from milestones come from the milestones assigned to issues in the epic. You can also set fixed dates or remove them entirely."
msgstr "Ovi datumi utiÄu na to kako se epici pojavljuju u planu projekta. Datumi iz ciljeva se preuzimaju iz ciljeva koji su dodijeljeni zadacima u epiku. MožeÅ¡ postaviti i fiksne datume ili ih u potpunosti ukloniti."
@@ -13366,7 +13552,7 @@ msgstr ""
msgid "Error parsing CSV file. Please make sure it has"
msgstr ""
-msgid "Error rendering markdown preview"
+msgid "Error rendering Markdown preview"
msgstr ""
msgid "Error saving label update."
@@ -13414,6 +13600,9 @@ msgstr ""
msgid "Error: %{error_message}"
msgstr ""
+msgid "Error: Couldn't load some or all of the changes."
+msgstr ""
+
msgid "Error: No AWS credentials were supplied"
msgstr ""
@@ -13447,6 +13636,9 @@ msgstr ""
msgid "ErrorTracking|Enable error tracking"
msgstr ""
+msgid "ErrorTracking|Error tracking backend"
+msgstr ""
+
msgid "ErrorTracking|If you self-host Sentry, enter your Sentry instance's full URL. If you use Sentry's hosted solution, enter https://sentry.io"
msgstr ""
@@ -13480,6 +13672,12 @@ msgstr ""
msgid "Escalation policies must have at least one rule"
msgstr ""
+msgid "EscalationPolicies|%{clockIcon} IF alert is not %{alertStatus} in %{minutes}"
+msgstr ""
+
+msgid "EscalationPolicies|%{notificationIcon} THEN %{doAction} %{forScheduleOrUser}"
+msgstr ""
+
msgid "EscalationPolicies|+ Add an additional rule"
msgstr ""
@@ -13522,13 +13720,13 @@ msgstr ""
msgid "EscalationPolicies|Escalation policies"
msgstr ""
-msgid "EscalationPolicies|Escalation rules"
+msgid "EscalationPolicies|Escalation policy %{obstacle} in Project %{project}"
msgstr ""
-msgid "EscalationPolicies|Failed to load oncall-schedules"
+msgid "EscalationPolicies|Escalation rules"
msgstr ""
-msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} %{then} THEN %{doAction} %{scheduleOrUser}"
+msgid "EscalationPolicies|Failed to load oncall-schedules"
msgstr ""
msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} minutes"
@@ -13606,18 +13804,36 @@ msgstr ""
msgid "Every %{action} attempt has failed: %{job_error_message}. Please try again."
msgstr ""
+msgid "Every 3 months"
+msgstr ""
+
+msgid "Every 3 months on the %{day} at %{time} %{timezone}"
+msgstr ""
+
+msgid "Every 6 months"
+msgstr ""
+
+msgid "Every 6 months on the %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Every day"
msgstr "Svaki dan"
msgid "Every day (at %{time})"
msgstr ""
+msgid "Every day at %{time} %{timezone}"
+msgstr ""
+
msgid "Every month"
msgstr "MjeseÄno"
msgid "Every month (Day %{day} at %{time})"
msgstr ""
+msgid "Every month on the %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Every three months"
msgstr "TromjeseÄno"
@@ -13633,6 +13849,15 @@ msgstr[2] ""
msgid "Every week (%{weekday} at %{time})"
msgstr ""
+msgid "Every week on %{day} at %{time} %{timezone}"
+msgstr ""
+
+msgid "Every year"
+msgstr ""
+
+msgid "Every year on %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Everyone"
msgstr ""
@@ -13669,9 +13894,6 @@ msgstr ""
msgid "Exactly one of %{attributes} is required"
msgstr ""
-msgid "Example: %{ip_address}. %{read_more_link}."
-msgstr ""
-
msgid "Example: @sub\\.company\\.com$"
msgstr ""
@@ -13738,13 +13960,13 @@ msgstr ""
msgid "Expand pipeline"
msgstr ""
-msgid "Expand sidebar"
+msgid "Expand settings section"
msgstr ""
-msgid "Expected documents: %{expected_documents}"
+msgid "Expand sidebar"
msgstr ""
-msgid "Experienced"
+msgid "Expected documents: %{expected_documents}"
msgstr ""
msgid "ExperimentSubject|Must have exactly one of User, Namespace, or Project."
@@ -14029,9 +14251,6 @@ msgstr ""
msgid "Failed to load related branches"
msgstr ""
-msgid "Failed to load sidebar lock status"
-msgstr ""
-
msgid "Failed to load stacktrace."
msgstr ""
@@ -14458,6 +14677,9 @@ msgstr ""
msgid "Files"
msgstr ""
+msgid "Files API Rate Limits"
+msgstr ""
+
msgid "Files breadcrumb"
msgstr ""
@@ -15422,7 +15644,7 @@ msgid "GitLab Import"
msgstr ""
msgid "GitLab Issue"
-msgstr ""
+msgstr "GitLab Zadatak"
msgid "GitLab Pages"
msgstr ""
@@ -15457,6 +15679,9 @@ msgstr ""
msgid "GitLab group: %{source_link}"
msgstr ""
+msgid "GitLab informs you if a new version is available."
+msgstr ""
+
msgid "GitLab is a complete DevOps platform, delivered as a single application, fundamentally changing the way Development, Security, and Ops teams collaborate"
msgstr ""
@@ -15472,7 +15697,7 @@ msgstr ""
msgid "GitLab is open source software to collaborate on code."
msgstr ""
-msgid "GitLab is undergoing maintenance and is operating in a read-only mode."
+msgid "GitLab is undergoing maintenance and is operating in read-only mode."
msgstr ""
msgid "GitLab member or Email address"
@@ -15484,9 +15709,6 @@ msgstr ""
msgid "GitLab project export"
msgstr ""
-msgid "GitLab restart is required to apply changes."
-msgstr ""
-
msgid "GitLab single sign-on URL"
msgstr ""
@@ -15502,9 +15724,6 @@ msgstr ""
msgid "GitLab version"
msgstr ""
-msgid "GitLab will inform you if a new version is available."
-msgstr ""
-
msgid "GitLab will run a background job that will produce pseudonymized CSVs of the GitLab database that will be uploaded to your configured object storage directory."
msgstr ""
@@ -15725,10 +15944,10 @@ msgid "Go to fork"
msgstr ""
msgid "Go to issue boards"
-msgstr ""
+msgstr "Idi na table sa zadacima"
msgid "Go to issues"
-msgstr ""
+msgstr "Idi na zadatke"
msgid "Go to jobs"
msgstr ""
@@ -15769,9 +15988,21 @@ msgstr ""
msgid "Go to snippets"
msgstr ""
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check 'Allowed domains for sign-ups'."
+msgstr ""
+
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check 'Email restrictions for sign-ups'."
+msgstr ""
+
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check the 'Domain denylist'."
+msgstr ""
+
msgid "Go to the activity feed"
msgstr ""
+msgid "Go to the group’s 'Settings &gt; General' page, and check 'Restrict membership by email domain'."
+msgstr ""
+
msgid "Go to the milestone list"
msgstr ""
@@ -15808,6 +16039,12 @@ msgstr ""
msgid "Goal of the changes and what reviewers should be aware of"
msgstr ""
+msgid "Google Cloud"
+msgstr ""
+
+msgid "Google Cloud offers several deployment targets. Select the one most suitable for your project."
+msgstr ""
+
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
@@ -15892,9 +16129,6 @@ msgstr ""
msgid "Group ID"
msgstr ""
-msgid "Group ID: %{group_id}"
-msgstr ""
-
msgid "Group Owner must have signed in with SAML before enabling Group Managed Accounts"
msgstr ""
@@ -16069,6 +16303,12 @@ msgstr ""
msgid "GroupImport|Unable to process group import file"
msgstr ""
+msgid "GroupPage|Copy group ID"
+msgstr ""
+
+msgid "GroupPage|Group ID: %{group_id}"
+msgstr ""
+
msgid "GroupRoadmap|%{dateWord} – No end date"
msgstr ""
@@ -16123,6 +16363,9 @@ msgstr ""
msgid "GroupRoadmap|Within 3 years"
msgstr ""
+msgid "GroupSAML|\"persistent\" recommended"
+msgstr ""
+
msgid "GroupSAML|%{strongOpen}Warning%{strongClose} - Enabling %{linkStart}SSO enforcement%{linkEnd} can reduce security risks."
msgstr ""
@@ -16255,6 +16498,9 @@ msgstr ""
msgid "GroupSAML|To be able to prohibit outer forks, you first need to enforce dedicate group managed accounts."
msgstr ""
+msgid "GroupSAML|Use SAML group links to manage group membership using SAML."
+msgstr ""
+
msgid "GroupSAML|Valid SAML Response"
msgstr ""
@@ -16267,13 +16513,10 @@ msgstr ""
msgid "GroupSAML|as %{access_level}"
msgstr ""
-msgid "GroupSAML|must match stored NameID of \"%{extern_uid}\" as we use this to identify users. If the NameID changes users will be unable to sign in."
-msgstr ""
-
-msgid "GroupSAML|should be \"persistent\""
+msgid "GroupSAML|must match stored NameID of \"%{extern_uid}\" to identify user and allow sign in"
msgstr ""
-msgid "GroupSAML|should be a random persistent ID, emails are discouraged"
+msgid "GroupSAML|recommend persistent ID instead of email"
msgstr ""
msgid "GroupSelect|No matching results"
@@ -16288,9 +16531,15 @@ msgstr ""
msgid "GroupSettings|Allow project access token creation"
msgstr ""
+msgid "GroupSettings|Applied to all subgroups unless overridden by a group owner. Groups already added to the project lose access."
+msgstr ""
+
msgid "GroupSettings|Auto DevOps pipeline was updated for the group"
msgstr ""
+msgid "GroupSettings|Available only on the top-level group. Applies to all subgroups. Groups already shared with a group outside %{group} are still shared unless removed manually."
+msgstr ""
+
msgid "GroupSettings|Badges"
msgstr ""
@@ -16342,6 +16591,9 @@ msgstr ""
msgid "GroupSettings|New runners registration token has been generated!"
msgstr ""
+msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgstr ""
+
msgid "GroupSettings|Pipeline settings was updated for the group"
msgstr ""
@@ -16354,12 +16606,15 @@ msgstr ""
msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
-msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups."
+msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups"
msgstr ""
msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
msgstr ""
+msgid "GroupSettings|Prevents group members from being notified if the group is mentioned."
+msgstr ""
+
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
msgstr ""
@@ -16396,21 +16651,6 @@ msgstr ""
msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}."
msgstr ""
-msgid "GroupSettings|This setting is only available on the top-level group and it applies to all subgroups. Groups that have already been shared with a group outside %{group} will still be shared, and this access will have to be revoked manually."
-msgstr ""
-
-msgid "GroupSettings|This setting will be applied to all subgroups unless overridden by a group owner. Groups that already have access to the project will continue to have access unless removed manually."
-msgstr ""
-
-msgid "GroupSettings|This setting will override user notification preferences for all members of the group, subgroups, and projects."
-msgstr ""
-
-msgid "GroupSettings|This setting will prevent group members from being notified if the group is mentioned."
-msgstr ""
-
-msgid "GroupSettings|This setting will prevent group members from forking projects outside of the group."
-msgstr ""
-
msgid "GroupSettings|Transfer group"
msgstr ""
@@ -16528,7 +16768,7 @@ msgstr ""
msgid "GroupsNew|No import options available"
msgstr ""
-msgid "GroupsNew|Not all related objects are migrated, as %{docs_link_start}described here%{docs_link_end}. Please %{feedback_link_start}leave feedback%{feedback_link_end} on this feature."
+msgid "GroupsNew|Not all related objects are migrated. %{docs_link_start}More info%{docs_link_end}."
msgstr ""
msgid "GroupsNew|Personal access token"
@@ -16660,15 +16900,27 @@ msgstr ""
msgid "Hello %{name},"
msgstr ""
-msgid "Hello there"
-msgstr ""
-
msgid "Hello, %{name}!"
msgstr ""
msgid "Hello, %{username}!"
msgstr ""
+msgid "HelloMessage|%{handshake_emoji} Contribute to GitLab: %{contribute_link}"
+msgstr ""
+
+msgid "HelloMessage|%{magnifier_emoji} Create a new GitLab issue: %{new_issue_link}"
+msgstr ""
+
+msgid "HelloMessage|%{rocket_emoji} We like your curiosity! Help us improve GitLab by joining the team: %{jobs_page_link}"
+msgstr ""
+
+msgid "HelloMessage|Does this page need fixes or improvements? Open an issue or contribute a merge request to help make GitLab more lovable. At GitLab, everyone can contribute!"
+msgstr ""
+
+msgid "HelloMessage|Welcome to GitLab!"
+msgstr ""
+
msgid "Help"
msgstr ""
@@ -16678,13 +16930,10 @@ msgstr ""
msgid "Helps prevent bots from creating accounts."
msgstr ""
-msgid "Helps prevent bots from creating issues"
+msgid "Helps prevent bots from creating issues."
msgstr ""
-msgid "Helps prevent malicious users hide their activity"
-msgstr ""
-
-msgid "Helps reduce request volume (e.g. from crawlers or abusive bots)"
+msgid "Helps prevent malicious users hide their activity."
msgstr ""
msgid "Helps reduce request volume (for example, from crawlers or abusive bots)"
@@ -16810,6 +17059,12 @@ msgstr ""
msgid "Housekeeping, export, path, transfer, remove, archive."
msgstr ""
+msgid "How do I configure Akismet?"
+msgstr ""
+
+msgid "How do I configure it?"
+msgstr ""
+
msgid "How do I configure runners?"
msgstr ""
@@ -16831,19 +17086,25 @@ msgstr ""
msgid "How do I set up this service?"
msgstr ""
+msgid "How do I use a web terminal?"
+msgstr ""
+
+msgid "How do I use file templates?"
+msgstr ""
+
msgid "How it works"
msgstr ""
msgid "How many days need to pass between marking entity for deletion and actual removing it."
msgstr ""
-msgid "How many seconds an IP will be counted towards the limit"
+msgid "How many seconds an IP counts toward the IP address limit."
msgstr ""
-msgid "I accept the %{terms_link}"
+msgid "How the job limiter handles jobs exceeding the thresholds specified below. The 'track' mode only logs the jobs. The 'compress' mode compresses the jobs and raises an exception if the compressed size exceeds the limit."
msgstr ""
-msgid "I accept the|Terms of Service and Privacy Policy"
+msgid "I accept the %{terms_link}"
msgstr ""
msgid "I forgot my password"
@@ -16927,13 +17188,16 @@ msgstr ""
msgid "IP Address"
msgstr ""
-msgid "IP expiration time"
+msgid "IP address expiration time"
msgstr ""
-msgid "IP subnet restriction only allowed for top-level groups"
+msgid "IP address restrictions"
msgstr ""
-msgid "IPs per user"
+msgid "IP addresses per user"
+msgstr ""
+
+msgid "IP subnet restriction only allowed for top-level groups"
msgstr ""
msgid "Identifier"
@@ -16948,6 +17212,9 @@ msgstr ""
msgid "If any indexed field exceeds this limit it will be truncated to this number of characters and the rest will not be indexed or searchable. This does not apply to repository and wiki indexing. Setting this to 0 means it is unlimited."
msgstr ""
+msgid "If blank, defaults to %{code_open}Retry later%{code_close}."
+msgstr ""
+
msgid "If blank, set allowable lifetime to %{instance_level_policy_in_words}, as defined by the instance admin. Once set, existing tokens for users in this group may be revoked."
msgstr ""
@@ -16999,6 +17266,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 did not initiate these sign-in attempts, please reach out to your administrator or enable two-factor authentication (2FA) on your account."
+msgstr ""
+
msgid "If you did not initiate this change, please contact your administrator immediately."
msgstr ""
@@ -17092,10 +17362,10 @@ msgstr ""
msgid "Import Projects from Gitea"
msgstr ""
-msgid "Import a project"
+msgid "Import an exported GitLab project"
msgstr ""
-msgid "Import an exported GitLab project"
+msgid "Import and export rate limits"
msgstr ""
msgid "Import failed due to a GitHub error: %{original}"
@@ -17107,12 +17377,18 @@ msgstr ""
msgid "Import from Jira"
msgstr ""
+msgid "Import group"
+msgstr ""
+
msgid "Import group from file"
msgstr ""
msgid "Import groups"
msgstr ""
+msgid "Import history"
+msgstr ""
+
msgid "Import in progress"
msgstr ""
@@ -17120,7 +17396,7 @@ msgid "Import in progress. Refresh page to see newly added issues."
msgstr ""
msgid "Import issues"
-msgstr ""
+msgstr "Uvezi zadatke"
msgid "Import members"
msgstr ""
@@ -17176,7 +17452,25 @@ msgstr ""
msgid "Import timed out. Import took longer than %{import_jobs_expiration} seconds"
msgstr ""
-msgid "Import/Export Rate Limits"
+msgid "ImportAProjectModal|Import from a project"
+msgstr ""
+
+msgid "ImportAProjectModal|Import members from another project"
+msgstr ""
+
+msgid "ImportAProjectModal|Import project members"
+msgstr ""
+
+msgid "ImportAProjectModal|Only project members (not group members) are imported, and they get the same permissions as the project you import from."
+msgstr ""
+
+msgid "ImportAProjectModal|Successfully imported"
+msgstr ""
+
+msgid "ImportAProjectModal|Unable to import project members"
+msgstr ""
+
+msgid "ImportAProjectModal|You're importing members to the %{strongStart}%{name}%{strongEnd} project."
msgstr ""
msgid "ImportButtons|Connect repositories from"
@@ -17230,7 +17524,7 @@ msgstr[2] ""
msgid "Importing..."
msgstr ""
-msgid "Import|A repository URL usually ends in a .git suffix, although this is not required. Double check to make sure your repository URL is correct."
+msgid "Import|There is not a valid Git repository at this URL. If your HTTP repository is not publicly accessible, verify your credentials."
msgstr ""
msgid "Improve customer support with Service Desk"
@@ -17239,9 +17533,6 @@ msgstr ""
msgid "Improves Git cloning performance."
msgstr ""
-msgid "In %{time_to_now}"
-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 ""
@@ -17527,7 +17818,7 @@ msgstr ""
msgid "InProductMarketing|Start a GitLab Ultimate trial today in less than one minute, no credit card required."
msgstr ""
-msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no CC required"
+msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no credit card required"
msgstr ""
msgid "InProductMarketing|Start a trial"
@@ -17566,7 +17857,7 @@ msgstr ""
msgid "InProductMarketing|Team up in GitLab for greater efficiency"
msgstr ""
-msgid "InProductMarketing|Team work makes the dream work"
+msgid "InProductMarketing|Team work makes the dream work"
msgstr ""
msgid "InProductMarketing|Test, create, deploy"
@@ -18148,6 +18439,9 @@ msgstr ""
msgid "Integrations|Create new issue in Jira"
msgstr ""
+msgid "Integrations|Create new issue in ZenTao"
+msgstr ""
+
msgid "Integrations|Default settings are inherited from the group level."
msgstr ""
@@ -18241,9 +18535,15 @@ msgstr ""
msgid "Integrations|Search Jira issues"
msgstr ""
+msgid "Integrations|Search ZenTao issues"
+msgstr ""
+
msgid "Integrations|Send notifications about project events to Unify Circuit."
msgstr ""
+msgid "Integrations|Send notifications about project events to a Unify Circuit conversation. %{docs_link}"
+msgstr ""
+
msgid "Integrations|Sign in to add namespaces"
msgstr ""
@@ -18283,6 +18583,9 @@ msgstr ""
msgid "Integrations|You've activated every integration 🎉"
msgstr ""
+msgid "Integrations|ZenTao issues display here when you create issues in your project in ZenTao."
+msgstr ""
+
msgid "Interactive mode"
msgstr ""
@@ -18310,9 +18613,6 @@ msgstr ""
msgid "Interval Pattern"
msgstr ""
-msgid "Introducing Value Stream Analytics"
-msgstr ""
-
msgid "Introducing Your DevOps Report"
msgstr ""
@@ -18409,6 +18709,12 @@ msgstr ""
msgid "Investigate vulnerability: %{title}"
msgstr ""
+msgid "Invisible Captcha"
+msgstr ""
+
+msgid "Invisible Captcha helps prevent the creation of spam accounts. It adds a honeypot field and time-sensitive form submission to the account signup form."
+msgstr ""
+
msgid "Invitation"
msgstr ""
@@ -18698,22 +19004,22 @@ msgid "Issue"
msgstr "Zadatak"
msgid "Issue %{issue_reference} has already been added to epic %{epic_reference}."
-msgstr ""
+msgstr "Zadatak %{issue_reference} je već dodan u epik %{epic_reference}."
msgid "Issue Analytics"
msgstr ""
msgid "Issue Boards"
-msgstr ""
+msgstr "Table sa zadacima"
msgid "Issue Type"
msgstr ""
msgid "Issue already promoted to epic."
-msgstr ""
+msgstr "Zadatak je već promoviran u epik."
msgid "Issue cannot be found."
-msgstr ""
+msgstr "Zadatak nije pronađen."
msgid "Issue created from vulnerability %{vulnerability_link}"
msgstr ""
@@ -18731,7 +19037,7 @@ msgid "Issue first deployed to production"
msgstr ""
msgid "Issue label"
-msgstr ""
+msgstr "Etiketa zadatka"
msgid "Issue or merge request ID is required"
msgstr ""
@@ -18746,7 +19052,7 @@ msgid "Issue update failed"
msgstr ""
msgid "Issue was closed by %{name} %{reason}"
-msgstr ""
+msgstr "Zadatak je zatvorio/la %{name} %{reason}"
msgid "Issue weight"
msgstr "Težina zadatka"
@@ -18785,25 +19091,25 @@ msgid "IssueBoards|An error occurred while setting notifications status. Please
msgstr ""
msgid "IssueBoards|Board"
-msgstr ""
+msgstr "Tabla"
msgid "IssueBoards|Boards"
-msgstr ""
+msgstr "Table"
msgid "IssueBoards|Create new board"
-msgstr ""
+msgstr "Napravi novu tablu"
msgid "IssueBoards|Delete board"
-msgstr ""
+msgstr "Ukloni tablu"
msgid "IssueBoards|No matching boards found"
-msgstr ""
+msgstr "Nisu pronađene odgovarajuće table"
msgid "IssueBoards|Some of your boards are hidden, activate a license to see them again."
msgstr "Neke tvoje table nisu vidljive, aktiviraj licencu za ponovni prikaz."
msgid "IssueBoards|Switch board"
-msgstr ""
+msgstr "Zamijeni tablu"
msgid "IssueTracker|Custom issue tracker"
msgstr ""
@@ -18860,6 +19166,9 @@ msgid "IssueTracker|Use a custom issue tracker that is not in the integration li
msgstr ""
msgid "Issues"
+msgstr "Zadaci"
+
+msgid "Issues I've created"
msgstr ""
msgid "Issues Rate Limits"
@@ -18868,11 +19177,14 @@ msgstr ""
msgid "Issues and merge requests"
msgstr ""
-msgid "Issues can be bugs, tasks or ideas to be discussed. Also, issues are searchable and filterable."
+msgid "Issues assigned to me"
msgstr ""
+msgid "Issues can be bugs, tasks or ideas to be discussed. Also, issues are searchable and filterable."
+msgstr "Zadaci mogu biti greške, aktivnosti ili ideje o kojima će se raspravljati. Zadatke možete pretraživati i filtrirati."
+
msgid "Issues closed"
-msgstr ""
+msgstr "Zatvoreni zadaci"
msgid "Issues manual ordering is temporarily disabled for technical reasons."
msgstr ""
@@ -18979,7 +19291,7 @@ msgstr ""
msgid "Iterations|Create cadence"
msgstr ""
-msgid "Iterations|Create your first iteration"
+msgid "Iterations|Create iteration"
msgstr ""
msgid "Iterations|Delete cadence"
@@ -18988,6 +19300,9 @@ msgstr ""
msgid "Iterations|Delete iteration cadence?"
msgstr ""
+msgid "Iterations|Delete iteration?"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -19021,12 +19336,18 @@ msgstr ""
msgid "Iterations|New iteration cadence"
msgstr ""
+msgid "Iterations|No closed iterations."
+msgstr ""
+
msgid "Iterations|No iteration cadences to show."
msgstr ""
msgid "Iterations|No iterations in cadence."
msgstr ""
+msgid "Iterations|No open iterations."
+msgstr ""
+
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
@@ -19057,6 +19378,9 @@ msgstr ""
msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
msgstr ""
+msgid "Iterations|This will remove the iteration from any issues that are assigned to it."
+msgstr ""
+
msgid "Iterations|Title"
msgstr ""
@@ -19072,15 +19396,9 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "I’m familiar with the basics of DevOps."
-msgstr ""
-
msgid "I’m joining my team who’s already on GitLab"
msgstr ""
-msgid "I’m not familiar with the basics of DevOps."
-msgstr ""
-
msgid "Jaeger URL"
msgstr ""
@@ -19345,6 +19663,9 @@ msgstr ""
msgid "Job"
msgstr ""
+msgid "Job %{jobName}"
+msgstr ""
+
msgid "Job Failed #%{build_id}"
msgstr ""
@@ -19936,9 +20257,6 @@ msgstr ""
msgid "Learn more in the"
msgstr ""
-msgid "Learn more in the|pipeline schedules documentation"
-msgstr ""
-
msgid "Learn more."
msgstr ""
@@ -20050,9 +20368,6 @@ msgstr ""
msgid "Leave Admin Mode"
msgstr ""
-msgid "Leave blank for no limit. Once set, existing personal access tokens may be revoked."
-msgstr ""
-
msgid "Leave edit mode? All unsaved changes will be lost."
msgstr ""
@@ -20098,10 +20413,10 @@ msgstr ""
msgid "LicenseCompliance|Acceptable license to be used in the project"
msgstr ""
-msgid "LicenseCompliance|Add a license"
+msgid "LicenseCompliance|Add license and related policy"
msgstr ""
-msgid "LicenseCompliance|Add license and related policy"
+msgid "LicenseCompliance|Add license policy"
msgstr ""
msgid "LicenseCompliance|Allow"
@@ -20197,6 +20512,9 @@ msgstr ""
msgid "LicenseManagement|Uncategorized"
msgstr ""
+msgid "Licensed Enterprise Edition features can be used if the project namespace's plan includes the feature, or if the project is public."
+msgstr ""
+
msgid "Licensed Features"
msgstr ""
@@ -20263,7 +20581,10 @@ msgstr ""
msgid "Limit namespaces and projects that can be indexed"
msgstr ""
-msgid "Limit sign in from multiple ips"
+msgid "Limit project size at a global, group, and project level. %{link_start}Learn more%{link_end}."
+msgstr ""
+
+msgid "Limit sign in from multiple IP addresses"
msgstr ""
msgid "Limit the number of concurrent operations this secondary site can run in the background."
@@ -20275,12 +20596,18 @@ msgstr ""
msgid "Limit the number of issues and epics per minute a user can create through web and API requests."
msgstr ""
+msgid "Limit the size of Sidekiq jobs stored in Redis."
+msgstr ""
+
msgid "Limited to showing %d event at most"
msgid_plural "Limited to showing %d events at most"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
+msgid "Limiting mode"
+msgstr ""
+
msgid "Line changes"
msgstr ""
@@ -20350,9 +20677,6 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
-msgid "List of users to be excluded from the limit"
-msgstr ""
-
msgid "List options"
msgstr ""
@@ -20392,9 +20716,6 @@ msgstr ""
msgid "Loading functions timed out. Please reload the page to try again."
msgstr ""
-msgid "Loading issues"
-msgstr ""
-
msgid "Loading more"
msgstr ""
@@ -20528,7 +20849,7 @@ msgid "MRDiff|Show full file"
msgstr ""
msgid "Made this issue confidential."
-msgstr ""
+msgstr "Ovaj zadatak je oznaÄen kao povjerljiv."
msgid "Mailgun"
msgstr ""
@@ -20549,13 +20870,13 @@ msgid "Make everyone on your team more productive regardless of their location.
msgstr ""
msgid "Make issue confidential"
-msgstr ""
+msgstr "OznaÄi zadatak kao povjerljiv."
msgid "Make sure you save it - you won't be able to access it again."
msgstr ""
msgid "Makes this issue confidential."
-msgstr ""
+msgstr "OznaÄava ovaj zadatak kao povjerljiv."
msgid "Manage Web IDE features."
msgstr ""
@@ -20642,10 +20963,10 @@ msgid "Mark as ready"
msgstr ""
msgid "Mark this issue as a duplicate of another issue"
-msgstr ""
+msgstr "OznaÄi ovaj zadatak kao duplikat nekog drugog zadatka"
msgid "Mark this issue as related to another issue"
-msgstr ""
+msgstr "OznaÄi da je ovaj zadatak vezan za neki drugi zadatak"
msgid "Mark to do as done"
msgstr ""
@@ -20686,6 +21007,9 @@ msgstr ""
msgid "Marked For Deletion At - %{deletion_time}"
msgstr ""
+msgid "Marked as ready. Merging is now allowed."
+msgstr ""
+
msgid "Marked this %{noun} as a draft."
msgstr ""
@@ -20758,52 +21082,22 @@ msgstr ""
msgid "Max 100,000 events"
msgstr ""
-msgid "Max 20 characters"
-msgstr ""
-
-msgid "Max Group Export Download requests per minute per user"
-msgstr ""
-
-msgid "Max Group Export requests per minute per user"
-msgstr ""
-
-msgid "Max Group Import requests per minute per user"
-msgstr ""
-
-msgid "Max Project Export Download requests per minute per user"
-msgstr ""
-
-msgid "Max Project Export requests per minute per user"
-msgstr ""
-
-msgid "Max Project Import requests per minute per user"
-msgstr ""
-
-msgid "Max authenticated API requests per period per user"
-msgstr ""
-
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
-msgid "Max authenticated web requests per period per user"
-msgstr ""
-
msgid "Max file size is 200 KB."
msgstr ""
-msgid "Max requests per minute per user"
-msgstr ""
-
msgid "Max role"
msgstr ""
msgid "Max session time"
msgstr ""
-msgid "Max unauthenticated requests per period per IP"
+msgid "MaxBuilds"
msgstr ""
-msgid "MaxBuilds"
+msgid "Maximum 20 characters"
msgstr ""
msgid "Maximum Conan package file size in bytes"
@@ -20839,6 +21133,12 @@ msgstr ""
msgid "Maximum attachment size (MB)"
msgstr ""
+msgid "Maximum authenticated API requests per rate limit period per user"
+msgstr ""
+
+msgid "Maximum authenticated web requests per rate limit period per user"
+msgstr ""
+
msgid "Maximum bulk request size (MiB)"
msgstr ""
@@ -20884,6 +21184,15 @@ msgstr ""
msgid "Maximum files in a diff"
msgstr ""
+msgid "Maximum group export download requests per minute"
+msgstr ""
+
+msgid "Maximum group export requests per minute"
+msgstr ""
+
+msgid "Maximum group import requests per minute"
+msgstr ""
+
msgid "Maximum import size"
msgstr ""
@@ -20920,7 +21229,7 @@ msgstr ""
msgid "Maximum number of projects."
msgstr ""
-msgid "Maximum number of unique IPs per user"
+msgid "Maximum number of unique IP addresses per user."
msgstr ""
msgid "Maximum page reached"
@@ -20929,12 +21238,24 @@ msgstr ""
msgid "Maximum page size"
msgstr ""
+msgid "Maximum project export download requests per minute"
+msgstr ""
+
+msgid "Maximum project export requests per minute"
+msgstr ""
+
+msgid "Maximum project import requests per minute"
+msgstr ""
+
msgid "Maximum push size"
msgstr ""
msgid "Maximum push size (MB)"
msgstr ""
+msgid "Maximum requests per minute"
+msgstr ""
+
msgid "Maximum running slices"
msgstr ""
@@ -20962,10 +21283,16 @@ msgstr ""
msgid "Maximum time between updates that a mirror can have when scheduled to synchronize."
msgstr ""
-msgid "Maximum time for web terminal websocket connection (in seconds). 0 for unlimited."
+msgid "Maximum time that users are allowed to skip the setup of two-factor authentication (in hours). Set to 0 (zero) to enforce at next sign in."
msgstr ""
-msgid "Maximum time that users are allowed to skip the setup of two-factor authentication (in hours). Set to 0 (zero) to enforce at next sign in."
+msgid "Maximum time, in seconds, for a web terminal websocket connection. 0 for unlimited."
+msgstr ""
+
+msgid "Maximum unauthenticated API requests per rate limit period per IP"
+msgstr ""
+
+msgid "Maximum unauthenticated web requests per rate limit period per IP"
msgstr ""
msgid "May"
@@ -20983,9 +21310,6 @@ msgstr ""
msgid "Medium vulnerabilities present"
msgstr ""
-msgid "Member lock"
-msgstr ""
-
msgid "Member since"
msgstr ""
@@ -21022,6 +21346,9 @@ msgstr ""
msgid "Members of a group may only view projects they have permission to access"
msgstr ""
+msgid "Membership"
+msgstr ""
+
msgid "Members|%{time} by %{user}"
msgstr ""
@@ -21082,9 +21409,6 @@ msgstr ""
msgid "Members|Expiration date updated successfully."
msgstr ""
-msgid "Members|Expired"
-msgstr ""
-
msgid "Members|Filter members"
msgstr ""
@@ -21100,9 +21424,6 @@ msgstr ""
msgid "Members|Membership"
msgstr ""
-msgid "Members|No expiration set"
-msgstr ""
-
msgid "Members|Remove \"%{groupName}\""
msgstr ""
@@ -21124,9 +21445,6 @@ msgstr ""
msgid "Members|Search invited"
msgstr ""
-msgid "Members|in %{time}"
-msgstr ""
-
msgid "Member|Deny access"
msgstr ""
@@ -21202,9 +21520,6 @@ msgstr ""
msgid "Merge request %{mr_link} was reviewed by %{mr_author}"
msgstr ""
-msgid "Merge request (MR) approvals"
-msgstr ""
-
msgid "Merge request analytics"
msgstr ""
@@ -21226,12 +21541,21 @@ msgstr ""
msgid "Merge requests"
msgstr ""
+msgid "Merge requests I've created"
+msgstr ""
+
msgid "Merge requests are a place to propose changes you've made to a project and discuss those changes with others"
msgstr ""
msgid "Merge requests are read-only in a secondary Geo node"
msgstr ""
+msgid "Merge requests assigned to me"
+msgstr ""
+
+msgid "Merge requests that I'm a reviewer"
+msgstr ""
+
msgid "Merge the branch and fix any conflicts that come up"
msgstr ""
@@ -21292,10 +21616,10 @@ msgstr ""
msgid "MergeRequests|An error occurred while saving the draft comment."
msgstr ""
-msgid "MergeRequests|Failed to squash. Should be done manually."
+msgid "MergeRequests|Create issue to resolve thread"
msgstr ""
-msgid "MergeRequests|Resolve this thread in a new issue"
+msgid "MergeRequests|Failed to squash. Should be done manually."
msgstr ""
msgid "MergeRequests|Saving the comment failed"
@@ -22085,10 +22409,10 @@ msgid "Move down"
msgstr ""
msgid "Move issue"
-msgstr ""
+msgstr "Premjesti zadatak"
msgid "Move issue from one column of the board to another"
-msgstr ""
+msgstr "Premjesti zadatak iz jednog stupca table u drugi"
msgid "Move selection down"
msgstr ""
@@ -22100,7 +22424,7 @@ msgid "Move test case"
msgstr ""
msgid "Move this issue to another project."
-msgstr ""
+msgstr "Premjesti ovaj zadatak u neki drugi projekat."
msgid "Move up"
msgstr ""
@@ -22111,6 +22435,9 @@ msgstr ""
msgid "MoveIssue|Cannot move issue to project it originates from!"
msgstr ""
+msgid "MoveIssue|Cannot move issues of '%{issue_type}' type."
+msgstr ""
+
msgid "Moved issue to %{label} column in the board."
msgstr ""
@@ -22237,6 +22564,15 @@ 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. To learn more about reducing storage capacity please visit our docs."
msgstr ""
+msgid "NamespaceUserCap|Pending users must be reviewed and approved by a group owner. Learn more about %{user_caps_link_start}User Caps%{link_end} and %{users_pending_approval_link_start}Users Pending Approval%{link_end}."
+msgstr ""
+
+msgid "NamespaceUserCap|View pending user approvals"
+msgstr ""
+
+msgid "NamespaceUserCap|Your group has reached its billable member limit"
+msgstr ""
+
msgid "Namespaces"
msgstr ""
@@ -22279,9 +22615,6 @@ msgstr ""
msgid "Network"
msgstr ""
-msgid "Network Policy|New rule"
-msgstr ""
-
msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is inbound from a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
msgstr ""
@@ -22303,16 +22636,13 @@ msgstr ""
msgid "NetworkPolicies|%{strongOpen}any%{strongClose} port"
msgstr ""
-msgid "NetworkPolicies|+ Add alert"
-msgstr ""
-
msgid "NetworkPolicies|.yaml"
msgstr ""
msgid "NetworkPolicies|.yaml mode"
msgstr ""
-msgid "NetworkPolicies|Actions"
+msgid "NetworkPolicies|Add alert"
msgstr ""
msgid "NetworkPolicies|Alerts are intended to be selectively used for a limited number of events that are potentially concerning and warrant a manual review. Alerts should not be used as a substitute for a SIEM or a logging tool. High volume alerts are likely to be dropped so as to preserve the stability of GitLab's integration with Kubernetes."
@@ -22348,9 +22678,6 @@ msgstr ""
msgid "NetworkPolicies|Deny all traffic"
msgstr ""
-msgid "NetworkPolicies|Description"
-msgstr ""
-
msgid "NetworkPolicies|Edit policy"
msgstr ""
@@ -22363,9 +22690,6 @@ msgstr ""
msgid "NetworkPolicies|IP/subnet"
msgstr ""
-msgid "NetworkPolicies|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
-msgstr ""
-
msgid "NetworkPolicies|Invalid or empty policy"
msgstr ""
@@ -22375,19 +22699,16 @@ msgstr ""
msgid "NetworkPolicies|Kubernetes error: %{error}"
msgstr ""
-msgid "NetworkPolicies|Name"
-msgstr ""
-
msgid "NetworkPolicies|Network"
msgstr ""
-msgid "NetworkPolicies|Network traffic"
+msgid "NetworkPolicies|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
msgstr ""
-msgid "NetworkPolicies|New policy"
+msgid "NetworkPolicies|Network policy can be created after the environment is loaded successfully."
msgstr ""
-msgid "NetworkPolicies|No policies detected"
+msgid "NetworkPolicies|Network traffic"
msgstr ""
msgid "NetworkPolicies|None selected"
@@ -22396,21 +22717,12 @@ msgstr ""
msgid "NetworkPolicies|Please %{installLinkStart}install%{installLinkEnd} and %{configureLinkStart}configure a Kubernetes Agent for this project%{configureLinkEnd} to enable alerts."
msgstr ""
-msgid "NetworkPolicies|Policies are a specification of how groups of pods are allowed to communicate with each other's network endpoints."
-msgstr ""
-
msgid "NetworkPolicies|Policy %{policyName} was successfully changed"
msgstr ""
msgid "NetworkPolicies|Policy definition"
msgstr ""
-msgid "NetworkPolicies|Policy editor"
-msgstr ""
-
-msgid "NetworkPolicies|Policy preview"
-msgstr ""
-
msgid "NetworkPolicies|Rule"
msgstr ""
@@ -22420,9 +22732,6 @@ msgstr ""
msgid "NetworkPolicies|Rule mode is unavailable for this policy. In some cases, we cannot parse the YAML file back into the rules editor."
msgstr ""
-msgid "NetworkPolicies|Rules"
-msgstr ""
-
msgid "NetworkPolicies|Save changes"
msgstr ""
@@ -22435,9 +22744,6 @@ msgstr ""
msgid "NetworkPolicies|Traffic that does not match any rule will be blocked."
msgstr ""
-msgid "NetworkPolicies|Unable to parse policy"
-msgstr ""
-
msgid "NetworkPolicies|all DNS names"
msgstr ""
@@ -22527,9 +22833,9 @@ msgstr ""
msgid "New Issue"
msgid_plural "New Issues"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "Novi zadatak"
+msgstr[1] "Novi zadaci"
+msgstr[2] "Novi zadaci"
msgid "New Jira import"
msgstr ""
@@ -22616,10 +22922,13 @@ msgid "New identity"
msgstr ""
msgid "New issue"
+msgstr "Novi zadatak"
+
+msgid "New issue in %{project}"
msgstr ""
msgid "New issue title"
-msgstr ""
+msgstr "Naziv novog zadatka"
msgid "New iteration created"
msgstr ""
@@ -22696,11 +23005,11 @@ msgstr ""
msgid "Newest first"
msgstr ""
-msgid "Newly registered users will by default be external"
+msgid "Newly-registered users are external by default"
msgstr ""
msgid "Next"
-msgstr ""
+msgstr "Next"
msgid "Next commit"
msgstr ""
@@ -23011,8 +23320,11 @@ msgstr ""
msgid "No webhooks found, add one in the form above."
msgstr ""
-msgid "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} to renew your subscription."
-msgstr ""
+msgid "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} day to renew your subscription."
+msgid_plural "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} days to renew your subscription."
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
msgid "No. of commits"
msgstr ""
@@ -23029,7 +23341,7 @@ msgstr ""
msgid "Nodes"
msgstr ""
-msgid "Non-admin users can sign in with read-only access and make read-only API requests."
+msgid "Non-admin users are restricted to read-only access, in both GitLab UI and API."
msgstr ""
msgid "None"
@@ -23110,7 +23422,7 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
-msgid "Notes Rate Limits"
+msgid "Notes rate limit"
msgstr ""
msgid "Notes|Are you sure you want to cancel creating this comment?"
@@ -23281,9 +23593,6 @@ msgstr ""
msgid "November"
msgstr ""
-msgid "Novice"
-msgstr ""
-
msgid "Now, personalize your GitLab experience"
msgstr ""
@@ -23452,7 +23761,7 @@ msgstr ""
msgid "OnCallSchedules|For this rotation, on-call will be:"
msgstr ""
-msgid "OnCallSchedules|On-call schedule %{schedule} in Project %{project}"
+msgid "OnCallSchedules|On-call schedule %{obstacle} in Project %{project}"
msgstr ""
msgid "OnCallSchedules|On-call schedules"
@@ -23599,22 +23908,22 @@ msgstr ""
msgid "OnDemandScans|Scanner profile"
msgstr ""
-msgid "OnDemandScans|Select one of the existing profiles"
+msgid "OnDemandScans|Schedule scan"
msgstr ""
-msgid "OnDemandScans|Site profile"
+msgid "OnDemandScans|Select one of the existing profiles"
msgstr ""
-msgid "OnDemandScans|Use existing scanner profile"
+msgid "OnDemandScans|Site profile"
msgstr ""
-msgid "OnDemandScans|Use existing site profile"
+msgid "OnDemandScans|Start time"
msgstr ""
-msgid "OnDemandScans|You can either choose a passive scan or validate the target site in your chosen site profile. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
+msgid "OnDemandScans|Use existing scanner profile"
msgstr ""
-msgid "OnDemandScans|You cannot run an active scan against an unvalidated site."
+msgid "OnDemandScans|Use existing site profile"
msgstr ""
msgid "OnDemandScans|You must create a repository within your project to run an on-demand scan."
@@ -23680,6 +23989,9 @@ msgstr ""
msgid "Only admins can delete project"
msgstr ""
+msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
+msgstr ""
+
msgid "Only include features new to your current subscription tier."
msgstr ""
@@ -23698,6 +24010,12 @@ msgstr ""
msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
+msgid "Only reCAPTCHA v2 is supported:"
+msgstr ""
+
+msgid "Only users from the specified IP address ranges are able to reach this group, including all subgroups, projects, and Git repositories."
+msgstr ""
+
msgid "Only verified users with an email address in any of these domains can be added to the group."
msgstr ""
@@ -23756,7 +24074,7 @@ msgid "Opened MRs"
msgstr ""
msgid "Opened issues"
-msgstr ""
+msgstr "Otvoreni zadaci"
msgid "OpenedNDaysAgo|Opened"
msgstr "Otvoreno"
@@ -23884,9 +24202,6 @@ msgstr ""
msgid "Package Registry"
msgstr ""
-msgid "Package Registry Rate Limits"
-msgstr ""
-
msgid "Package Registry: authenticated API requests"
msgstr ""
@@ -23905,6 +24220,9 @@ msgstr ""
msgid "Package recipe already exists"
msgstr ""
+msgid "Package registry rate limits"
+msgstr ""
+
msgid "Package type"
msgstr ""
@@ -23971,6 +24289,9 @@ msgstr ""
msgid "PackageRegistry|Composer"
msgstr ""
+msgid "PackageRegistry|Composer.json with license: %{license} and version: %{version}"
+msgstr ""
+
msgid "PackageRegistry|Conan"
msgstr ""
@@ -24034,6 +24355,9 @@ msgstr ""
msgid "PackageRegistry|Copy require package include"
msgstr ""
+msgid "PackageRegistry|Copy target SHA"
+msgstr ""
+
msgid "PackageRegistry|Copy yarn command"
msgstr ""
@@ -24100,6 +24424,9 @@ msgstr ""
msgid "PackageRegistry|Install package version"
msgstr ""
+msgid "PackageRegistry|Instance-level"
+msgstr ""
+
msgid "PackageRegistry|Invalid Package: failed metadata extraction"
msgstr ""
@@ -24145,6 +24472,9 @@ msgstr ""
msgid "PackageRegistry|Pip Command"
msgstr ""
+msgid "PackageRegistry|Project-level"
+msgstr ""
+
msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
msgstr ""
@@ -24166,6 +24496,9 @@ msgstr ""
msgid "PackageRegistry|Remove package"
msgstr ""
+msgid "PackageRegistry|Required Python: %{pythonVersion}"
+msgstr ""
+
msgid "PackageRegistry|RubyGems"
msgstr ""
@@ -24208,6 +24541,9 @@ msgstr ""
msgid "PackageRegistry|Source project located at %{link}"
msgstr ""
+msgid "PackageRegistry|Target SHA: %{sha}"
+msgstr ""
+
msgid "PackageRegistry|There are no other versions of this package."
msgstr ""
@@ -24376,6 +24712,18 @@ msgstr ""
msgid "Password was successfully updated. Please sign in again."
msgstr ""
+msgid "PasswordPrompt|Confirm password"
+msgstr ""
+
+msgid "PasswordPrompt|Confirm password to continue"
+msgstr ""
+
+msgid "PasswordPrompt|Password is required"
+msgstr ""
+
+msgid "PasswordPrompt|Please enter your password to confirm"
+msgstr ""
+
msgid "Passwords should be unique and not used for any other sites or services."
msgstr ""
@@ -24403,6 +24751,9 @@ msgstr ""
msgid "Paste project path (i.e. gitlab-org/gitlab)"
msgstr ""
+msgid "Paste this DSN into your Sentry SDK"
+msgstr ""
+
msgid "Paste your public SSH key, which is usually contained in the file '~/.ssh/id_ed25519.pub' or '~/.ssh/id_rsa.pub' and begins with 'ssh-ed25519' or 'ssh-rsa'. Do not paste your private SSH key, as that can compromise your identity."
msgstr ""
@@ -24487,6 +24838,9 @@ msgstr ""
msgid "PerformanceBar|First Contentful Paint"
msgstr ""
+msgid "PerformanceBar|Flamegraph with mode:"
+msgstr ""
+
msgid "PerformanceBar|Frontend resources"
msgstr ""
@@ -24520,6 +24874,15 @@ msgstr ""
msgid "PerformanceBar|Trace"
msgstr ""
+msgid "PerformanceBar|cpu"
+msgstr ""
+
+msgid "PerformanceBar|object"
+msgstr ""
+
+msgid "PerformanceBar|wall"
+msgstr ""
+
msgid "Period in seconds"
msgstr ""
@@ -24748,6 +25111,48 @@ msgstr ""
msgid "PipelineSchedules|Variables"
msgstr ""
+msgid "PipelineSource|API"
+msgstr ""
+
+msgid "PipelineSource|Chat"
+msgstr ""
+
+msgid "PipelineSource|External"
+msgstr ""
+
+msgid "PipelineSource|External Pull Request"
+msgstr ""
+
+msgid "PipelineSource|Merge Request"
+msgstr ""
+
+msgid "PipelineSource|On-Demand DAST Scan"
+msgstr ""
+
+msgid "PipelineSource|On-Demand DAST Validation"
+msgstr ""
+
+msgid "PipelineSource|Parent Pipeline"
+msgstr ""
+
+msgid "PipelineSource|Pipeline"
+msgstr ""
+
+msgid "PipelineSource|Push"
+msgstr ""
+
+msgid "PipelineSource|Schedule"
+msgstr ""
+
+msgid "PipelineSource|Trigger"
+msgstr ""
+
+msgid "PipelineSource|Web"
+msgstr ""
+
+msgid "PipelineSource|Web IDE"
+msgstr ""
+
msgid "PipelineStatusTooltip|Pipeline: %{ciStatus}"
msgstr ""
@@ -25048,46 +25453,7 @@ msgstr ""
msgid "Pipeline|Source"
msgstr ""
-msgid "Pipeline|Source|API"
-msgstr ""
-
-msgid "Pipeline|Source|Chat"
-msgstr ""
-
-msgid "Pipeline|Source|External"
-msgstr ""
-
-msgid "Pipeline|Source|External Pull Request"
-msgstr ""
-
-msgid "Pipeline|Source|Merge Request"
-msgstr ""
-
-msgid "Pipeline|Source|On-Demand DAST Scan"
-msgstr ""
-
-msgid "Pipeline|Source|On-Demand DAST Validation"
-msgstr ""
-
-msgid "Pipeline|Source|Parent Pipeline"
-msgstr ""
-
-msgid "Pipeline|Source|Pipeline"
-msgstr ""
-
-msgid "Pipeline|Source|Push"
-msgstr ""
-
-msgid "Pipeline|Source|Schedule"
-msgstr ""
-
-msgid "Pipeline|Source|Trigger"
-msgstr ""
-
-msgid "Pipeline|Source|Web"
-msgstr ""
-
-msgid "Pipeline|Source|Web IDE"
+msgid "Pipeline|Source|Security Policy"
msgstr ""
msgid "Pipeline|Specify variable values to be used in this run. The values specified in %{linkStart}CI/CD settings%{linkEnd} will be used by default."
@@ -25138,7 +25504,7 @@ msgstr ""
msgid "Pipeline|We are currently unable to fetch pipeline data"
msgstr ""
-msgid "Pipeline|You’re about to stop pipeline %{pipelineId}."
+msgid "Pipeline|You’re about to stop pipeline #%{pipelineId}."
msgstr ""
msgid "Pipeline|for"
@@ -25165,6 +25531,9 @@ msgstr ""
msgid "Plain diff"
msgstr ""
+msgid "Plain-text response to send to clients that hit a rate limit"
+msgstr ""
+
msgid "Plan:"
msgstr ""
@@ -25309,9 +25678,6 @@ msgstr ""
msgid "Please provide attributes to update"
msgstr ""
-msgid "Please provide your username or email address."
-msgstr ""
-
msgid "Please reach out if you have any questions and we'll be happy to assist."
msgstr ""
@@ -25354,9 +25720,6 @@ msgstr ""
msgid "Please set a new password before proceeding."
msgstr ""
-msgid "Please share your feedback about %{featureName} %{linkStart}in this issue%{linkEnd} to help us improve the experience."
-msgstr ""
-
msgid "Please solve the captcha"
msgstr ""
@@ -25534,6 +25897,9 @@ msgstr ""
msgid "Prevent adding new members to project membership within this group"
msgstr ""
+msgid "Prevent auto-stopping"
+msgstr ""
+
msgid "Prevent editing approval rules in projects and merge requests."
msgstr ""
@@ -25546,7 +25912,7 @@ msgstr ""
msgid "Prevent users from changing their profile name"
msgstr ""
-msgid "Prevent users from performing write operations on GitLab while performing maintenance."
+msgid "Prevent users from performing write operations while GitLab maintenance is in progress."
msgstr ""
msgid "Preview"
@@ -25819,6 +26185,9 @@ msgstr ""
msgid "Profiles|Enter your name, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Enter your password to confirm the email change"
+msgstr ""
+
msgid "Profiles|Enter your pronouns to let people know how to refer to you"
msgstr ""
@@ -26053,10 +26422,10 @@ msgstr ""
msgid "Profiles|e.g. My MacBook key"
msgstr ""
-msgid "Profiles|username"
+msgid "Profiles|https://website.com"
msgstr ""
-msgid "Profiles|website.com"
+msgid "Profiles|username"
msgstr ""
msgid "Profiles|your account"
@@ -26299,9 +26668,21 @@ msgstr ""
msgid "ProjectSelect| or group"
msgstr ""
+msgid "ProjectSelect|No matching results"
+msgstr ""
+
msgid "ProjectSelect|Search for project"
msgstr ""
+msgid "ProjectSelect|Search projects"
+msgstr ""
+
+msgid "ProjectSelect|Select a project"
+msgstr ""
+
+msgid "ProjectSelect|There was an error fetching the projects. Please try again."
+msgstr ""
+
msgid "ProjectService|Drone server URL"
msgstr ""
@@ -26389,6 +26770,9 @@ msgstr ""
msgid "ProjectService|Trigger event when a new, unique alert is recorded."
msgstr ""
+msgid "ProjectService|Trigger event when a new, unique vulnerability is recorded. (Note: This feature requires an Ultimate plan.)"
+msgstr ""
+
msgid "ProjectService|Trigger event when a pipeline status changes."
msgstr ""
@@ -26803,9 +27187,15 @@ msgstr ""
msgid "Projects are graded based on the highest severity vulnerability present"
msgstr ""
+msgid "Projects are organized into groups"
+msgstr ""
+
msgid "Projects contributed to"
msgstr ""
+msgid "Projects help you organize your work. They contain your file repository, issues, merge requests, and so much more."
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr ""
@@ -27040,10 +27430,10 @@ msgstr ""
msgid "PrometheusService|Prometheus cluster integration"
msgstr ""
-msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
+msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
msgstr ""
-msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
+msgid "PrometheusService|The ID of the IAP-secured resource."
msgstr ""
msgid "PrometheusService|The Prometheus API base URL."
@@ -27077,7 +27467,7 @@ msgid "Promote"
msgstr ""
msgid "Promote issue to an epic"
-msgstr ""
+msgstr "Promoviraj zadatak u epik"
msgid "Promote to epic"
msgstr ""
@@ -27095,7 +27485,7 @@ msgid "PromoteMilestone|Promotion failed - %{message}"
msgstr ""
msgid "Promoted issue to an epic."
-msgstr ""
+msgstr "Zadatak promoviran u epik."
msgid "Promotion is not supported."
msgstr ""
@@ -27661,6 +28051,9 @@ msgstr ""
msgid "Rate limit"
msgstr ""
+msgid "Rate limits can help reduce request volume (like from crawlers or abusive bots)."
+msgstr ""
+
msgid "Raw blob request rate limit per minute"
msgstr ""
@@ -27673,6 +28066,9 @@ msgstr ""
msgid "Re-authentication required"
msgstr ""
+msgid "Re-import"
+msgstr ""
+
msgid "Re-request review"
msgstr ""
@@ -27694,6 +28090,9 @@ msgstr ""
msgid "Read more about related issues"
msgstr ""
+msgid "Read their documentation."
+msgstr ""
+
msgid "Ready to get started with GitLab? Follow these steps to set up your workspace, plan and commit changes, and deploy your project."
msgstr ""
@@ -27727,6 +28126,9 @@ msgstr ""
msgid "Receive any notifications from GitLab."
msgstr ""
+msgid "Receive notification of abuse reports by email."
+msgstr ""
+
msgid "Receive notifications about your own activity"
msgstr ""
@@ -27871,9 +28273,6 @@ msgstr ""
msgid "Registry setup"
msgstr ""
-msgid "Regulate approvals by authors/committers. Affects all projects."
-msgstr ""
-
msgid "Reindexing Status: %{status} (Slice multiplier: %{multiplier}, Maximum running slices: %{max_slices})"
msgstr ""
@@ -27970,6 +28369,9 @@ msgstr ""
msgid "Release|Something went wrong while saving the release details."
msgstr ""
+msgid "Reload page"
+msgstr ""
+
msgid "Remediations"
msgstr ""
@@ -28151,7 +28553,7 @@ msgid "Removed all labels."
msgstr ""
msgid "Removed an issue from an epic."
-msgstr ""
+msgstr "Zadatak uklonjen iz epika."
msgid "Removed group can not be restored!"
msgstr ""
@@ -28196,7 +28598,7 @@ msgid "Removes all labels."
msgstr ""
msgid "Removes an issue from an epic."
-msgstr ""
+msgstr "Uklanja zadatak iz epika."
msgid "Removes parent epic %{epic_ref}."
msgstr ""
@@ -28252,6 +28654,9 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
+msgid "Repeats"
+msgstr ""
+
msgid "Replace"
msgstr ""
@@ -28618,10 +29023,7 @@ msgstr ""
msgid "Require additional authentication for administrative tasks."
msgstr ""
-msgid "Require all users in this group to setup Two-factor authentication"
-msgstr ""
-
-msgid "Require all users in this group to setup two-factor authentication"
+msgid "Require all users in this group to set up two-factor authentication"
msgstr ""
msgid "Required approvals (%{approvals_given} given)"
@@ -28669,6 +29071,9 @@ msgstr[2] ""
msgid "Requires values to meet regular expression requirements."
msgstr ""
+msgid "Requires you to deploy or set up cloud-hosted Sentry."
+msgstr ""
+
msgid "Requires your primary GitLab email address."
msgstr ""
@@ -28729,9 +29134,6 @@ msgstr ""
msgid "Resolve"
msgstr ""
-msgid "Resolve all threads in new issue"
-msgstr ""
-
msgid "Resolve conflicts"
msgstr ""
@@ -28789,6 +29191,9 @@ msgstr ""
msgid "Response text"
msgstr ""
+msgid "Restart GitLab to apply changes."
+msgstr ""
+
msgid "Restart Terminal"
msgstr ""
@@ -28807,6 +29212,9 @@ msgstr ""
msgid "Restoring the project will prevent the project from being removed on this date and restore people's ability to make changes to it."
msgstr ""
+msgid "Restrict group access by IP address. %{link_start}Learn more%{link_end}."
+msgstr ""
+
msgid "Restrict membership by email domain"
msgstr ""
@@ -29122,6 +29530,9 @@ msgstr ""
msgid "Runners|Runner #%{runner_id}"
msgstr ""
+msgid "Runners|Runner assigned to project."
+msgstr ""
+
msgid "Runners|Runner is offline, last contact was %{runner_contact} ago"
msgstr ""
@@ -29134,6 +29545,9 @@ msgstr ""
msgid "Runners|Runner registration"
msgstr ""
+msgid "Runners|Runner unassigned from project."
+msgstr ""
+
msgid "Runners|Runners"
msgstr ""
@@ -29326,7 +29740,7 @@ msgstr ""
msgid "SastEntryPoints|How do I set up SAST?"
msgstr ""
-msgid "SastEntryPoints|Learn more."
+msgid "SastEntryPoints|Learn more"
msgstr ""
msgid "Satisfied"
@@ -29368,7 +29782,7 @@ msgstr ""
msgid "Save pipeline schedule"
msgstr ""
-msgid "Save space and find images in the container Registry. remove unneeded tags and keep only the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
+msgid "Save storage space by automatically deleting tags from the container registry and keeping the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
msgstr ""
msgid "Saving"
@@ -29542,6 +29956,9 @@ msgstr ""
msgid "Search or filter results…"
msgstr ""
+msgid "Search or jump to..."
+msgstr ""
+
msgid "Search project"
msgstr ""
@@ -29602,16 +30019,16 @@ msgstr ""
msgid "SearchCodeResults|of %{link_to_project}"
msgstr ""
-msgid "SearchResults|Showing %{count} %{scope} for%{term_element}"
+msgid "SearchResults|Showing %{count} %{scope} for %{term_element}"
msgstr ""
-msgid "SearchResults|Showing %{count} %{scope} for%{term_element} in your personal and project snippets"
+msgid "SearchResults|Showing %{count} %{scope} for %{term_element} in your personal and project snippets"
msgstr ""
-msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for%{term_element}"
+msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for %{term_element}"
msgstr ""
-msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for%{term_element} in your personal and project snippets"
+msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for %{term_element} in your personal and project snippets"
msgstr ""
msgid "SearchResults|code result"
@@ -29704,6 +30121,9 @@ msgstr ""
msgid "Secret Detection"
msgstr ""
+msgid "Secret access key"
+msgstr ""
+
msgid "Secret token"
msgstr ""
@@ -29743,9 +30163,6 @@ msgstr ""
msgid "SecurityApprovals|A merge request approval is required when the license compliance report contains a denied license."
msgstr ""
-msgid "SecurityApprovals|Configurable if security scanners are enabled. %{linkStart}Learn more.%{linkEnd}"
-msgstr ""
-
msgid "SecurityApprovals|Coverage-Check"
msgstr ""
@@ -29758,24 +30175,18 @@ msgstr ""
msgid "SecurityApprovals|Learn more about Vulnerability-Check"
msgstr ""
-msgid "SecurityApprovals|License Scanning must be enabled. %{linkStart}Learn more%{linkEnd}."
-msgstr ""
-
msgid "SecurityApprovals|License-Check"
msgstr ""
msgid "SecurityApprovals|Requires approval for Denied licenses. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}More information%{linkEnd}"
+msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "SecurityApprovals|Requires approval for vulnerabilities. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
-msgid "SecurityApprovals|Test coverage must be enabled. %{linkStart}Learn more%{linkEnd}."
-msgstr ""
-
msgid "SecurityApprovals|Vulnerability-Check"
msgstr ""
@@ -29839,6 +30250,12 @@ msgstr ""
msgid "SecurityConfiguration|Immediately begin risk analysis and remediation with application security features. Start with SAST and Secret Detection, available to all plans. Upgrade to Ultimate to get all features, including:"
msgstr ""
+msgid "SecurityConfiguration|Manage corpus"
+msgstr ""
+
+msgid "SecurityConfiguration|Manage corpus files used as mutation sources in coverage fuzzing."
+msgstr ""
+
msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
msgstr ""
@@ -29893,6 +30310,12 @@ msgstr ""
msgid "SecurityOrchestration|Action"
msgstr ""
+msgid "SecurityOrchestration|Actions"
+msgstr ""
+
+msgid "SecurityOrchestration|Add rule"
+msgstr ""
+
msgid "SecurityOrchestration|All policies"
msgstr ""
@@ -29926,9 +30349,6 @@ msgstr ""
msgid "SecurityOrchestration|Network"
msgstr ""
-msgid "SecurityOrchestration|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
-msgstr ""
-
msgid "SecurityOrchestration|New policy"
msgstr ""
@@ -29944,6 +30364,9 @@ msgstr ""
msgid "SecurityOrchestration|Policy editor"
msgstr ""
+msgid "SecurityOrchestration|Policy preview"
+msgstr ""
+
msgid "SecurityOrchestration|Policy status"
msgstr ""
@@ -29953,6 +30376,9 @@ msgstr ""
msgid "SecurityOrchestration|Rule"
msgstr ""
+msgid "SecurityOrchestration|Rules"
+msgstr ""
+
msgid "SecurityOrchestration|Scan Execution"
msgstr ""
@@ -30046,6 +30472,9 @@ msgstr ""
msgid "SecurityReports|Create issue"
msgstr ""
+msgid "SecurityReports|Development vulnerabilities"
+msgstr ""
+
msgid "SecurityReports|Dismiss vulnerability"
msgstr ""
@@ -30061,6 +30490,9 @@ msgstr ""
msgid "SecurityReports|Download results"
msgstr ""
+msgid "SecurityReports|Download scanned URLs"
+msgstr ""
+
msgid "SecurityReports|Download scanned resources"
msgstr ""
@@ -30184,6 +30616,9 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
+msgid "SecurityReports|The Vulnerability Report shows the results of the lastest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "SecurityReports|The security reports below contain one or more vulnerability findings that could not be parsed and were not recorded. Download the artifacts in the job output to investigate. Ensure any security report created conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
msgstr ""
@@ -30325,10 +30760,10 @@ msgstr ""
msgid "Select a repository"
msgstr ""
-msgid "Select a role"
+msgid "Select a repository containing templates for common files."
msgstr ""
-msgid "Select a shared template repository for all projects on this instance."
+msgid "Select a role"
msgstr ""
msgid "Select a template repository"
@@ -30406,6 +30841,9 @@ msgstr ""
msgid "Select project to choose zone"
msgstr ""
+msgid "Select project to create issue"
+msgstr ""
+
msgid "Select projects"
msgstr ""
@@ -30523,6 +30961,9 @@ msgstr ""
msgid "Send emails to help guide new users through the onboarding process."
msgstr ""
+msgid "Send emails to users upon account deactivation."
+msgstr ""
+
msgid "Send message"
msgstr ""
@@ -30541,6 +30982,9 @@ msgstr ""
msgid "Send service data"
msgstr ""
+msgid "Sentry"
+msgstr ""
+
msgid "Sentry API URL"
msgstr ""
@@ -30655,6 +31099,9 @@ msgstr ""
msgid "Service"
msgstr "Usluga"
+msgid "Service Accounts keys are required to authorize GitLab to deploy your Google Cloud project."
+msgstr ""
+
msgid "Service Desk"
msgstr "TehniÄka PodrÅ¡ka"
@@ -30727,15 +31174,15 @@ msgstr ""
msgid "Set a password on your account to pull or push via %{protocol}."
msgstr ""
-msgid "Set a template repository for projects in this group"
-msgstr ""
-
msgid "Set access permissions for this token."
msgstr ""
msgid "Set an instance-wide domain that will be available to all clusters when installing Knative."
msgstr ""
+msgid "Set any rate limit to %{code_open}0%{code_close} to disable the limit."
+msgstr ""
+
msgid "Set default and restrict visibility levels. Configure import sources and git access protocol."
msgstr ""
@@ -30748,7 +31195,7 @@ msgstr ""
msgid "Set limit to 0 to allow any file size."
msgstr ""
-msgid "Set max session time for web terminal."
+msgid "Set limits for web and API requests."
msgstr ""
msgid "Set milestone"
@@ -30757,15 +31204,18 @@ msgstr ""
msgid "Set new password"
msgstr ""
-msgid "Set notification email for abuse reports."
+msgid "Set parent epic to an epic"
msgstr ""
-msgid "Set parent epic to an epic"
+msgid "Set per-user rate limits for imports and exports of projects and groups."
msgstr ""
msgid "Set projects and maximum size limits, session duration, user options, and check feature availability for namespace plan."
msgstr ""
+msgid "Set rate limits for package registry API requests that supersede the general user and IP rate limits."
+msgstr ""
+
msgid "Set severity"
msgstr ""
@@ -30784,15 +31234,24 @@ msgstr ""
msgid "Set the default branch for this project. All merge requests and commits are made against this branch unless you specify a different one."
msgstr ""
+msgid "Set the default expiration time for job artifacts in all projects. Set to %{code_open}0%{code_close} to never expire artifacts by default. If no unit is written, it defaults to seconds. For example, these are all equivalent: %{code_open}3600%{code_close}, %{code_open}60 minutes%{code_close}, or %{code_open}one hour%{code_close}."
+msgstr ""
+
msgid "Set the due date to %{due_date}."
msgstr ""
msgid "Set the iteration to %{iteration_reference}."
msgstr ""
+msgid "Set the maximum session time for a web terminal."
+msgstr ""
+
msgid "Set the milestone to %{milestone_reference}."
msgstr ""
+msgid "Set the per-user rate limit for notes created by web or API requests."
+msgstr ""
+
msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
msgstr ""
@@ -30994,6 +31453,9 @@ msgstr ""
msgid "Show Pipeline IID"
msgstr ""
+msgid "Show all %{issuable_type}."
+msgstr ""
+
msgid "Show all activity"
msgstr ""
@@ -31045,15 +31507,9 @@ msgstr ""
msgid "Show list"
msgstr ""
-msgid "Show me advanced features"
-msgstr ""
-
msgid "Show me how to add a pipeline"
msgstr ""
-msgid "Show me the basics"
-msgstr ""
-
msgid "Show one file at a time"
msgstr ""
@@ -31096,13 +31552,13 @@ msgstr ""
msgid "Showing %{pageSize} of %{total} %{issuableType}"
msgstr ""
-msgid "Showing %{pageSize} of %{total} issues"
-msgstr ""
-
msgid "Showing all epics"
msgstr ""
msgid "Showing all issues"
+msgstr "Svi zadaci prikazani"
+
+msgid "Showing data for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
msgstr ""
msgid "Showing data for workflow items created in this date range. Date range cannot exceed %{maxDateRange} days."
@@ -31144,6 +31600,15 @@ msgstr ""
msgid "Sidebar|Weight"
msgstr ""
+msgid "Sidekiq job compression threshold (bytes)"
+msgstr ""
+
+msgid "Sidekiq job size limit (bytes)"
+msgstr ""
+
+msgid "Sidekiq job size limits"
+msgstr ""
+
msgid "Sign in"
msgstr ""
@@ -31250,7 +31715,7 @@ msgid "Signing in using your %{label} account without a pre-existing GitLab acco
msgstr ""
msgid "Similar issues"
-msgstr ""
+msgstr "SliÄni zadaci"
msgid "Simulate a pipeline created for the default branch"
msgstr ""
@@ -31264,6 +31729,9 @@ msgstr ""
msgid "Site profile not found for given parameters"
msgstr ""
+msgid "Sites"
+msgstr ""
+
msgid "Size"
msgstr ""
@@ -31294,19 +31762,22 @@ msgstr ""
msgid "SlackIntegration|Sends notifications about project events to Slack channels."
msgstr ""
-msgid "SlackService|2. Paste the %{strong_open}Token%{strong_close} into the field below"
+msgid "SlackService|1. %{slash_command_link_start}Add a slash command%{slash_command_link_end} in your Slack team using this information:"
msgstr ""
-msgid "SlackService|3. Select the %{strong_open}Active%{strong_close} checkbox, press %{strong_open}Save changes%{strong_close} and start using GitLab inside Slack!"
+msgid "SlackService|2. Paste the token from Slack in the %{strong_open}Token%{strong_close} field below."
msgstr ""
-msgid "SlackService|Fill in the word that works best for your team."
+msgid "SlackService|3. Select the %{strong_open}Active%{strong_close} checkbox, select %{strong_open}Save changes%{strong_close}, and start using slash commands in Slack!"
+msgstr ""
+
+msgid "SlackService|After setup, get a list of available Slack slash commands by entering"
msgstr ""
-msgid "SlackService|See list of available commands in Slack after setting up this service, by entering"
+msgid "SlackService|Fill in the word that works best for your team."
msgstr ""
-msgid "SlackService|This service allows users to perform common operations on this project by entering slash commands in Slack."
+msgid "SlackService|Perform common operations in this project by entering slash commands in Slack."
msgstr ""
msgid "Slice multiplier"
@@ -31372,7 +31843,7 @@ msgstr ""
msgid "Some child epics may be hidden due to applied filters"
msgstr ""
-msgid "Some common domains are not allowed. %{read_more_link}."
+msgid "Some common domains are not allowed. %{learn_more_link}."
msgstr ""
msgid "Some of the designs you tried uploading did not change:"
@@ -31456,9 +31927,6 @@ msgstr ""
msgid "Something went wrong while exporting requirements"
msgstr ""
-msgid "Something went wrong while fetching %{listType} list"
-msgstr ""
-
msgid "Something went wrong while fetching branches"
msgstr ""
@@ -31513,15 +31981,9 @@ msgstr ""
msgid "Something went wrong while merging this merge request. Please try again."
msgstr ""
-msgid "Something went wrong while moving issues."
-msgstr ""
-
msgid "Something went wrong while obtaining the Let's Encrypt certificate."
msgstr ""
-msgid "Something went wrong while performing the action."
-msgstr ""
-
msgid "Something went wrong while promoting the issue to an epic. Please try again."
msgstr ""
@@ -31849,7 +32311,10 @@ msgstr ""
msgid "SourcegraphPreferences|Uses a custom %{linkStart}Sourcegraph instance%{linkEnd}."
msgstr ""
-msgid "Spam Check API Key"
+msgid "Spam Check"
+msgstr ""
+
+msgid "Spam Check API key"
msgstr ""
msgid "Spam Logs"
@@ -31867,7 +32332,7 @@ msgstr ""
msgid "Specified URL cannot be used: \"%{reason}\""
msgstr ""
-msgid "Specify an e-mail address regex pattern to identify default internal users."
+msgid "Specify an email address regex pattern to identify default internal users."
msgstr ""
msgid "Speed up your pipelines with Needs relationships"
@@ -32122,7 +32587,7 @@ msgstr ""
msgid "StatusCheck|An error occurred fetching the status checks."
msgstr ""
-msgid "StatusCheck|Apply this status check to any branch or a specific protected branch."
+msgid "StatusCheck|Apply this status check to all branches or a specific protected branch."
msgstr ""
msgid "StatusCheck|Check for a status response in Merge Requests. Failures do not block merges. %{link_start}Learn more%{link_end}."
@@ -32461,6 +32926,9 @@ msgstr ""
msgid "Subscriptions"
msgstr ""
+msgid "Subscription|Your subscription for %{strong}%{namespace_name}%{strong_close} has expired and you are now on %{pricing_link_start}the GitLab Free tier%{pricing_link_end}. Don't worry, your data is safe. Get in touch with our support team (%{support_email}). They'll gladly help with your subscription renewal."
+msgstr ""
+
msgid "Subtracted"
msgstr ""
@@ -32689,6 +33157,9 @@ msgstr ""
msgid "SuperSonics|Plan"
msgstr ""
+msgid "SuperSonics|Please agree to the Subscription Agreement"
+msgstr ""
+
msgid "SuperSonics|Ready to get started? A GitLab plan is ideal for scaling organizations and for multi team usage."
msgstr ""
@@ -32719,6 +33190,9 @@ msgstr ""
msgid "SuperSonics|The activation code is not valid. Please make sure to copy it exactly from the Customers Portal or confirmation email. Learn more about %{linkStart}activating your subscription%{linkEnd}."
msgstr ""
+msgid "SuperSonics|The activation code should be a 24-character alphanumeric string"
+msgstr ""
+
msgid "SuperSonics|There is a connectivity issue."
msgstr ""
@@ -32761,9 +33235,15 @@ msgstr ""
msgid "SuperSonics|You do not have an active subscription"
msgstr ""
+msgid "SuperSonics|You have successfully added a license that activates on %{date}. Please see the subscription history table below for more details."
+msgstr ""
+
msgid "SuperSonics|You'll be charged for %{trueUpLinkStart}users over license%{trueUpLinkEnd} on a quarterly or annual basis, depending on the terms of your agreement."
msgstr ""
+msgid "SuperSonics|Your future dated license was successfully added"
+msgstr ""
+
msgid "SuperSonics|Your subscription"
msgstr ""
@@ -33016,7 +33496,7 @@ msgstr "Å ablon"
msgid "Template to append to all Service Desk issues"
msgstr ""
-msgid "TemplateRepository|Select a repository to make its templates available to all projects. %{link_start}What should the repository contain?%{link_end} "
+msgid "TemplateRepository|Create common files more quickly, and standardize their format."
msgstr ""
msgid "Templates"
@@ -33226,7 +33706,7 @@ msgstr ""
msgid "TestCases|Search test cases"
msgstr ""
-msgid "TestCases|Something went wrong while adding test case to Todo."
+msgid "TestCases|Something went wrong while adding test case to a to-do item."
msgstr ""
msgid "TestCases|Something went wrong while creating a test case."
@@ -33238,7 +33718,7 @@ msgstr ""
msgid "TestCases|Something went wrong while fetching test cases list."
msgstr ""
-msgid "TestCases|Something went wrong while marking test case todo as done."
+msgid "TestCases|Something went wrong while marking test case to-do item as done."
msgstr ""
msgid "TestCases|Something went wrong while moving test case."
@@ -33358,7 +33838,7 @@ msgstr ""
msgid "Thanks for your purchase!"
msgstr ""
-msgid "That is ok, I do not want to renew"
+msgid "That's OK, I don't want to renew"
msgstr ""
msgid "That's it, well done!"
@@ -33382,7 +33862,7 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
-msgid "The API key used by GitLab for accessing the Spam Check service endpoint"
+msgid "The API key used by GitLab for accessing the Spam Check service endpoint."
msgstr ""
msgid "The GitLab subscription service (customers.gitlab.com) is currently experiencing an outage. You can monitor the status and get updates at %{linkStart}status.gitlab.com%{linkEnd}."
@@ -33421,9 +33901,6 @@ msgstr ""
msgid "The URL to use for connecting to Elasticsearch. Use a comma-separated list to support clustering (e.g., \"http://localhost:9200, http://localhost:9201\")."
msgstr ""
-msgid "The Vulnerability Report shows the results of the last successful pipeline run on the default branch."
-msgstr ""
-
msgid "The X509 Certificate to use when mutual TLS is required to communicate with the external authorization service. If left blank, the server certificate is still validated when accessing over HTTPS."
msgstr ""
@@ -33481,9 +33958,6 @@ msgstr ""
msgid "The default branch for this project has been changed. Please update your bookmarks."
msgstr ""
-msgid "The default expiration time for job artifacts. 0 for unlimited. The default unit is in seconds, but you can use other units, for example %{code_open}4 mins 2 sec%{code_close}, %{code_open}2h42min%{code_close}."
-msgstr ""
-
msgid "The dependency list details information about the components used within your project."
msgstr ""
@@ -33676,9 +34150,6 @@ msgstr ""
msgid "The merge conflicts for this merge request have already been resolved. Please return to the merge request."
msgstr ""
-msgid "The merge request can now be merged."
-msgstr ""
-
msgid "The metric must be one of %{metrics}."
msgstr ""
@@ -34054,7 +34525,7 @@ msgstr ""
msgid "There was a problem updating the keep latest artifacts setting."
msgstr ""
-msgid "There was an error %{message} todo."
+msgid "There was an error %{message} to-do item."
msgstr ""
msgid "There was an error adding a To Do."
@@ -34093,6 +34564,9 @@ msgstr ""
msgid "There was an error fetching projects"
msgstr ""
+msgid "There was an error fetching search autocomplete suggestions"
+msgstr ""
+
msgid "There was an error fetching stage total counts"
msgstr ""
@@ -34417,6 +34891,9 @@ msgstr ""
msgid "This field is required."
msgstr ""
+msgid "This form is disabled in preview"
+msgstr ""
+
msgid "This group"
msgstr ""
@@ -34438,9 +34915,6 @@ msgstr ""
msgid "This group is linked to a subscription"
msgstr ""
-msgid "This group, including all subgroups, projects and git repositories, will be reachable from only the specified IP address ranges."
-msgstr ""
-
msgid "This group, its subgroups and projects has been scheduled for removal on %{date}."
msgstr ""
@@ -34720,9 +35194,6 @@ msgstr ""
msgid "This user cannot be unlocked manually from GitLab"
msgstr ""
-msgid "This user does not have a pending request"
-msgstr ""
-
msgid "This user has an unconfirmed email address (%{email}). You may force a confirmation."
msgstr ""
@@ -34831,9 +35302,6 @@ msgstr ""
msgid "ThreatMonitoring|Packet Activity"
msgstr ""
-msgid "ThreatMonitoring|Policies"
-msgstr ""
-
msgid "ThreatMonitoring|Requests"
msgstr ""
@@ -34885,6 +35353,12 @@ msgstr ""
msgid "ThreatMonitoring|View documentation"
msgstr ""
+msgid "Threshold in bytes at which to compress Sidekiq job arguments."
+msgstr ""
+
+msgid "Threshold in bytes at which to reject Sidekiq jobs. Set this to 0 to if you don't want to limit Sidekiq jobs."
+msgstr ""
+
msgid "Throughput"
msgstr ""
@@ -34894,6 +35368,9 @@ msgstr "ÄŒetvrtak"
msgid "Time"
msgstr ""
+msgid "Time (in hours) that users are allowed to skip forced configuration of two-factor authentication."
+msgstr ""
+
msgid "Time Spent"
msgstr ""
@@ -34960,7 +35437,7 @@ msgstr ""
msgid "TimeTrackingEstimated|Est"
msgstr ""
-msgid "TimeTracking|%{startTag}Spent: %{endTag}%{timeSpentHumanReadable}"
+msgid "TimeTracking|%{spentStart}Spent: %{spentEnd}"
msgstr ""
msgid "TimeTracking|Estimated:"
@@ -34982,10 +35459,10 @@ msgid "Timeago|%s days remaining"
msgstr "preostalo %s dana"
msgid "Timeago|%s hours ago"
-msgstr ""
+msgstr "prije %s h"
msgid "Timeago|%s hours remaining"
-msgstr ""
+msgstr "preostalo %s h"
msgid "Timeago|%s minutes ago"
msgstr "prije %s min"
@@ -35021,10 +35498,10 @@ msgid "Timeago|1 day remaining"
msgstr "preostalo 1 dan"
msgid "Timeago|1 hour ago"
-msgstr ""
+msgstr "prije 1 h"
msgid "Timeago|1 hour remaining"
-msgstr ""
+msgstr "preostalo 1 h"
msgid "Timeago|1 minute ago"
msgstr "prije 1 min"
@@ -35051,13 +35528,13 @@ msgid "Timeago|1 year remaining"
msgstr "preostalo 1 godina"
msgid "Timeago|Past due"
-msgstr ""
+msgstr "Zakašnjelo"
msgid "Timeago|in %s days"
msgstr "za %s dana"
msgid "Timeago|in %s hours"
-msgstr ""
+msgstr "za %s h"
msgid "Timeago|in %s minutes"
msgstr "za %s min"
@@ -35078,7 +35555,7 @@ msgid "Timeago|in 1 day"
msgstr "za 1 dan"
msgid "Timeago|in 1 hour"
-msgstr ""
+msgstr "za 1 h"
msgid "Timeago|in 1 minute"
msgstr "za 1 min"
@@ -35096,7 +35573,7 @@ msgid "Timeago|just now"
msgstr "maloprije"
msgid "Timeago|right now"
-msgstr ""
+msgstr "upravo sada"
msgid "Timeline|Turn timeline view off"
msgstr ""
@@ -35176,6 +35653,9 @@ msgstr ""
msgid "To access this domain create a new DNS record"
msgstr ""
+msgid "To add a custom suffix, set up a Service Desk email address. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "To add an SSH key you need to %{generate_link_start}generate one%{link_end} or use an %{existing_link_start}existing key%{link_end}."
msgstr ""
@@ -35197,13 +35677,16 @@ msgstr ""
msgid "To connect an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To continue using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
+msgstr ""
+
msgid "To continue, you need to select the link in the confirmation email we sent to verify your email address. If you didn't get our email, select %{strongStart}Resend confirmation email.%{strongEnd}"
msgstr ""
msgid "To define internal users, first enable new users set to external"
msgstr ""
-msgid "To enable Registration Features, make sure \"Enable service ping\" is checked."
+msgid "To enable Registration Features, first enable Service Ping."
msgstr ""
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
@@ -35230,7 +35713,7 @@ msgstr ""
msgid "To get started, use the link below to confirm your account."
msgstr ""
-msgid "To help improve GitLab and its user experience, GitLab will periodically collect usage information."
+msgid "To help improve GitLab and its user experience, GitLab periodically collects usage information."
msgstr ""
msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
@@ -35263,7 +35746,7 @@ msgstr ""
msgid "To preserve performance only %{strong_open}%{display_size} of %{real_size}%{strong_close} files are displayed."
msgstr ""
-msgid "To protect this issue's confidentiality, %{forkLink} and set the fork's visibility to private."
+msgid "To protect this issue's confidentiality, %{linkStart}fork this project%{linkEnd} and set the fork's visibility to private."
msgstr ""
msgid "To protect this issue's confidentiality, a private fork of this project was selected."
@@ -35296,12 +35779,15 @@ msgstr ""
msgid "To set up SAML authentication for your group through an identity provider like Azure, Okta, Onelogin, Ping Identity, or your custom SAML 2.0 provider:"
msgstr ""
-msgid "To set up this service:"
+msgid "To set up this integration:"
msgstr ""
msgid "To specify the notification level per project of a group you belong to, you need to visit project page and change notification level there."
msgstr ""
+msgid "To start using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
+msgstr ""
+
msgid "To unsubscribe from this issue, please paste the following link into your browser:"
msgstr ""
@@ -35447,7 +35933,7 @@ msgid "Total cores (CPUs)"
msgstr ""
msgid "Total issues"
-msgstr ""
+msgstr "Ukupno zadataka"
msgid "Total memory (GB)"
msgstr ""
@@ -35890,9 +36376,6 @@ msgstr ""
msgid "Unable to fetch branches list, please close the form and try again"
msgstr ""
-msgid "Unable to fetch unscanned projects"
-msgstr ""
-
msgid "Unable to fetch vulnerable projects"
msgstr ""
@@ -35947,6 +36430,15 @@ msgstr ""
msgid "Unable to update this issue at this time."
msgstr ""
+msgid "Unapprove a merge request"
+msgstr ""
+
+msgid "Unapprove the current merge request."
+msgstr ""
+
+msgid "Unapproved the current merge request."
+msgstr ""
+
msgid "Unarchive project"
msgstr ""
@@ -35959,16 +36451,13 @@ msgstr ""
msgid "Unassigned"
msgstr ""
-msgid "Unauthenticated API request rate limit"
+msgid "Unauthenticated API rate limit period in seconds"
msgstr ""
-msgid "Unauthenticated rate limit period in seconds"
+msgid "Unauthenticated requests"
msgstr ""
-msgid "Unauthenticated request rate limit"
-msgstr ""
-
-msgid "Unauthenticated requests"
+msgid "Unauthenticated web rate limit period in seconds"
msgstr ""
msgid "Undo"
@@ -36070,18 +36559,6 @@ msgstr ""
msgid "Unresolved"
msgstr ""
-msgid "UnscannedProjects|15 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|30 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|5 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|60 or more days"
-msgstr ""
-
msgid "Unschedule job"
msgstr ""
@@ -36301,6 +36778,9 @@ msgstr ""
msgid "UsageQuota|%{help_link_start}Shared runners%{help_link_end} are disabled, so there are no limits set on pipeline usage"
msgstr ""
+msgid "UsageQuota|%{linkTitle} help link"
+msgstr ""
+
msgid "UsageQuota|%{percentageLeft} of purchased storage is available"
msgstr ""
@@ -36310,6 +36790,9 @@ msgstr ""
msgid "UsageQuota|Artifacts is a sum of build and pipeline artifacts."
msgstr ""
+msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
+msgstr ""
+
msgid "UsageQuota|Buy additional minutes"
msgstr ""
@@ -36319,9 +36802,21 @@ msgstr ""
msgid "UsageQuota|CI minutes usage by project"
msgstr ""
+msgid "UsageQuota|Code packages and container images."
+msgstr ""
+
msgid "UsageQuota|Current period usage"
msgstr ""
+msgid "UsageQuota|File attachments and smaller design graphics."
+msgstr ""
+
+msgid "UsageQuota|Git repository, managed by the Gitaly service."
+msgstr ""
+
+msgid "UsageQuota|Includes project registry, artifacts, packages, wiki, uploads and other items."
+msgstr ""
+
msgid "UsageQuota|Increase storage temporarily"
msgstr ""
@@ -36340,6 +36835,9 @@ msgstr ""
msgid "UsageQuota|Packages"
msgstr ""
+msgid "UsageQuota|Pipeline artifacts and job artifacts, created with CI/CD."
+msgstr ""
+
msgid "UsageQuota|Pipelines"
msgstr ""
@@ -36358,6 +36856,9 @@ msgstr ""
msgid "UsageQuota|Seats"
msgstr ""
+msgid "UsageQuota|Shared bits of code and text."
+msgstr ""
+
msgid "UsageQuota|Snippets"
msgstr ""
@@ -36367,6 +36868,12 @@ msgstr ""
msgid "UsageQuota|Storage"
msgstr ""
+msgid "UsageQuota|Storage type"
+msgstr ""
+
+msgid "UsageQuota|There is a known issue with Artifact storage where the total could be incorrect for some projects. More details and progress are available in %{warningLinkStart}the epic%{warningLinkEnd}."
+msgstr ""
+
msgid "UsageQuota|This is the total amount of storage used across your projects within this namespace."
msgstr ""
@@ -36406,6 +36913,9 @@ msgstr ""
msgid "UsageQuota|Usage"
msgstr ""
+msgid "UsageQuota|Usage Breakdown"
+msgstr ""
+
msgid "UsageQuota|Usage Quotas"
msgstr ""
@@ -36430,6 +36940,9 @@ msgstr ""
msgid "UsageQuota|Wiki"
msgstr ""
+msgid "UsageQuota|Wiki content."
+msgstr ""
+
msgid "UsageQuota|Wikis"
msgstr ""
@@ -36646,7 +37159,10 @@ msgstr ""
msgid "User Settings"
msgstr ""
-msgid "User and IP Rate Limits"
+msgid "User and IP rate limits"
+msgstr ""
+
+msgid "User does not have a pending request"
msgstr ""
msgid "User identity was successfully created."
@@ -36943,6 +37459,9 @@ msgstr ""
msgid "Users can launch a development environment from a GitLab browser tab when the %{linkStart}Gitpod%{linkEnd} integration is enabled."
msgstr ""
+msgid "Users can reactivate their account by signing in."
+msgstr ""
+
msgid "Users can render diagrams in AsciiDoc, Markdown, reStructuredText, and Textile documents using Kroki."
msgstr ""
@@ -36958,6 +37477,9 @@ msgstr ""
msgid "Users requesting access to"
msgstr ""
+msgid "Users to exclude from the rate limit"
+msgstr ""
+
msgid "Users were successfully added."
msgstr ""
@@ -36979,6 +37501,9 @@ msgstr ""
msgid "UsersSelect|Unassigned"
msgstr ""
+msgid "Uses GitLab as a lightweight alternative to Sentry."
+msgstr ""
+
msgid "Using %{code_start}::%{code_end} denotes a %{link_start}scoped label set%{link_end}"
msgstr ""
@@ -37009,10 +37534,7 @@ msgstr ""
msgid "Value Stream Analytics can help you determine your team’s velocity"
msgstr ""
-msgid "Value Stream Analytics gives an overview of how much time it takes to go from idea to production in your project."
-msgstr ""
-
-msgid "Value may contain a variable reference"
+msgid "Value might contain a variable reference"
msgstr ""
msgid "Value stream"
@@ -37078,10 +37600,10 @@ msgstr ""
msgid "ValueStream|The Default Value Stream cannot be deleted"
msgstr ""
-msgid "Variable"
+msgid "Values that contain the %{codeStart}$%{codeEnd} character can be considered a variable reference and expanded. %{docsLinkStart}Learn more.%{docsLinkEnd}"
msgstr ""
-msgid "Variable references indicated by %{codeStart}$%{codeEnd} may be expanded. If this is not what you want, consider %{docsLinkStart}using a workaround to prevent expansion%{docsLinkEnd}."
+msgid "Variable"
msgstr ""
msgid "Variable will be masked in job logs."
@@ -37489,6 +38011,9 @@ msgstr ""
msgid "Vulnerability|Evidence"
msgstr ""
+msgid "Vulnerability|False positive detected"
+msgstr ""
+
msgid "Vulnerability|File"
msgstr ""
@@ -37531,6 +38056,9 @@ msgstr ""
msgid "Vulnerability|Status"
msgstr ""
+msgid "Vulnerability|The scanner determined this vulnerability to be a false positive. Verify the evaluation before changing its status. %{linkStart}Learn more about false positive detection.%{linkEnd}"
+msgstr ""
+
msgid "Vulnerability|The unmodified response is the original response that had no mutations done to the request"
msgstr ""
@@ -37855,9 +38383,6 @@ msgstr ""
msgid "Welcome to GitLab,%{br_tag}%{name}!"
msgstr ""
-msgid "Welcome to the guided GitLab tour"
-msgstr ""
-
msgid "Welcome, %{name}!"
msgstr ""
@@ -37876,9 +38401,6 @@ msgstr ""
msgid "What are you searching for?"
msgstr ""
-msgid "What describes you best?"
-msgstr ""
-
msgid "What does this command do?"
msgstr ""
@@ -37900,13 +38422,13 @@ msgstr ""
msgid "What is your job title? (optional)"
msgstr ""
-msgid "What will you use this group for?"
+msgid "What templates can I create?"
msgstr ""
-msgid "What's new"
+msgid "What will you use this group for?"
msgstr ""
-msgid "What’s your experience level?"
+msgid "What's new"
msgstr ""
msgid "When a deployment job is successful, skip older deployment jobs that are still pending."
@@ -37918,6 +38440,9 @@ msgstr ""
msgid "When an event in GitLab triggers a webhook, you can use the request details to figure out if something went wrong."
msgstr ""
+msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+msgstr ""
+
msgid "When inactive, an external authentication provider must be used."
msgstr ""
@@ -37942,6 +38467,9 @@ msgstr ""
msgid "When:"
msgstr ""
+msgid "Which API requests are affected?"
+msgstr ""
+
msgid "While it's rare to have no vulnerabilities, it can happen. In any event, we ask that you please double check your settings to make sure you've set up your dashboard correctly."
msgstr ""
@@ -38221,6 +38749,9 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|Work Items"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -38296,6 +38827,9 @@ msgstr ""
msgid "You are already a member of this %{member_source}."
msgstr ""
+msgid "You are already impersonating another user"
+msgstr ""
+
msgid "You are an admin, which means granting access to %{client_name} will allow them to interact with GitLab as an admin as well. Proceed with caution."
msgstr ""
@@ -38398,6 +38932,9 @@ msgstr ""
msgid "You can also use project access tokens with Git to authenticate over HTTP(S). %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "You can always change your URL later"
+msgstr ""
+
msgid "You can always edit this later"
msgstr ""
@@ -38554,10 +39091,10 @@ msgstr ""
msgid "You can’t %{tag_start}edit%{tag_end} files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
-msgid "You could not create a new trigger."
+msgid "You can’t edit files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
-msgid "You didn't renew your subscription for %{strong}%{namespace_name}%{strong_close} so it was downgraded to the free plan."
+msgid "You could not create a new trigger."
msgstr ""
msgid "You do not have any subscriptions yet"
@@ -38725,6 +39262,12 @@ msgstr ""
msgid "You must provide your current password in order to change it."
msgstr ""
+msgid "You must sign in to search for specific projects."
+msgstr ""
+
+msgid "You must sign in to search for specific terms."
+msgstr ""
+
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
@@ -38752,6 +39295,9 @@ msgstr ""
msgid "You need to upload a GitLab project export archive (ending in .gz)."
msgstr ""
+msgid "You need to verify your primary email first before enabling Two-Factor Authentication."
+msgstr ""
+
msgid "You successfully declined the invitation"
msgstr ""
@@ -38860,10 +39406,10 @@ msgstr ""
msgid "Your %{host} account was signed in to from a new location"
msgstr ""
-msgid "Your %{strong}%{plan_name}%{strong_close} subscription for %{strong}%{namespace_name}%{strong_close} will expire on %{strong}%{expires_on}%{strong_close}."
+msgid "Your %{strong}%{plan_name}%{strong_close} subscription expires on %{strong}%{expires_on}%{strong_close}. After that date, you cannot create issues or merge requests, or use many other features."
msgstr ""
-msgid "Your %{strong}%{plan_name}%{strong_close} subscription will expire on %{strong}%{expires_on}%{strong_close}. After that, you will not be able to create issues or merge requests as well as many other features."
+msgid "Your %{strong}%{plan_name}%{strong_close} subscription for %{strong}%{namespace_name}%{strong_close} will expire on %{strong}%{expires_on}%{strong_close}."
msgstr ""
msgid "Your CI/CD configuration syntax is invalid. View Lint tab for more details."
@@ -38887,7 +39433,7 @@ msgstr ""
msgid "Your GPG keys (%{count})"
msgstr ""
-msgid "Your GitLab account has been locked due to an excessive amount of unsuccessful sign in attempts. Your account will automatically unlock in %{duration} or you may click the link below to unlock now."
+msgid "Your GitLab account has been locked due to an excessive number of unsuccessful sign in attempts. You can wait for your account to automatically unlock in %{duration} or you can click the link below to unlock now."
msgstr ""
msgid "Your GitLab account request has been approved!"
@@ -38998,6 +39544,9 @@ msgstr ""
msgid "Your commit email is used for web based operations, such as edits and merges."
msgstr ""
+msgid "Your current password is required to register a two-factor authenticator app."
+msgstr ""
+
msgid "Your dashboard has been copied. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
@@ -39097,6 +39646,9 @@ msgstr ""
msgid "Your project limit is %{limit} projects! Please contact your administrator to increase it"
msgstr ""
+msgid "Your project will be created at:"
+msgstr ""
+
msgid "Your projects"
msgstr ""
@@ -39136,11 +39688,11 @@ msgstr ""
msgid "Your subscription expired!"
msgstr ""
-msgid "Your subscription has been downgraded."
-msgstr ""
-
-msgid "Your subscription will expire in %{remaining_days}."
-msgstr ""
+msgid "Your subscription will expire in %{remaining_days} day."
+msgid_plural "Your subscription will expire in %{remaining_days} days."
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
msgid "Your username is %{username}."
msgstr ""
@@ -39349,6 +39901,9 @@ msgstr ""
msgid "cannot merge"
msgstr ""
+msgid "cannot not be used for user namespace"
+msgstr ""
+
msgid "ciReport|%{degradedNum} degraded"
msgstr ""
@@ -39673,6 +40228,9 @@ msgstr ""
msgid "created %{timeAgo}"
msgstr ""
+msgid "created %{timeAgo} by %{author}"
+msgstr ""
+
msgid "created by"
msgstr ""
@@ -39718,9 +40276,6 @@ msgstr ""
msgid "does not have a supported extension. Only %{extension_list} are supported"
msgstr ""
-msgid "domain is not authorized for sign-up."
-msgstr ""
-
msgid "download it"
msgstr ""
@@ -39739,19 +40294,13 @@ msgstr ""
msgid "email '%{email}' is not a verified email."
msgstr ""
-msgid "email does not match the allowed domain of %{email_domains}"
-msgid_plural "email does not match the allowed domains: %{email_domains}"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-
msgid "enabled"
msgstr ""
msgid "encrypted: needs to be a :required, :optional or :migrating!"
msgstr ""
-msgid "ending with MIME type format is not allowed."
+msgid "ending with a reserved file extension is not allowed."
msgstr ""
msgid "entries cannot be larger than 255 characters"
@@ -39775,6 +40324,9 @@ msgstr "greška"
msgid "estimateCommand|%{slash_command} overwrites the total estimated time."
msgstr ""
+msgid "example.com"
+msgstr ""
+
msgid "exceeds the limit of %{bytes} bytes"
msgstr ""
@@ -39826,9 +40378,6 @@ msgstr ""
msgid "fork"
msgstr ""
-msgid "fork this project"
-msgstr ""
-
msgid "from"
msgstr ""
@@ -39838,6 +40387,9 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
+msgid "frontmatter"
+msgstr ""
+
msgid "group"
msgstr "grupa"
@@ -39865,6 +40417,9 @@ msgstr ""
msgid "has been completed."
msgstr ""
+msgid "has too deep level of nesting"
+msgstr ""
+
msgid "help"
msgstr ""
@@ -39898,9 +40453,21 @@ msgstr ""
msgid "in"
msgstr ""
+msgid "in Infrastructure :: Kubernetes clusters"
+msgstr ""
+
+msgid "in all GitLab"
+msgstr ""
+
+msgid "in group"
+msgstr ""
+
msgid "in group %{link_to_group}"
msgstr ""
+msgid "in project"
+msgstr ""
+
msgid "in project %{link_to_project}"
msgstr ""
@@ -39917,7 +40484,7 @@ msgid "is"
msgstr ""
msgid "is already associated to a GitLab Issue. New issue will not be associated."
-msgstr ""
+msgstr "je već povezan s GitLab zadatkom. Novi zadatak neće biti povezan."
msgid "is an invalid IP address range"
msgstr ""
@@ -39943,16 +40510,19 @@ msgstr ""
msgid "is not a valid X509 certificate."
msgstr ""
-msgid "is not allowed since the group is not top-level group."
+msgid "is not allowed for sign-up."
msgstr ""
-msgid "is not allowed. Try again with a different email address, or contact your GitLab admin."
+msgid "is not allowed for this group."
msgstr ""
-msgid "is not allowed. We do not currently support project-level iterations"
+msgid "is not allowed for this project."
msgstr ""
-msgid "is not from an allowed domain."
+msgid "is not allowed since the group is not top-level group."
+msgstr ""
+
+msgid "is not allowed. We do not currently support project-level iterations"
msgstr ""
msgid "is not in the group enforcing Group Managed Account"
@@ -39977,16 +40547,16 @@ msgid "is too long (maximum is 1000 entries)"
msgstr ""
msgid "issue"
-msgstr ""
+msgstr "zadatak"
msgid "issues at risk"
-msgstr ""
+msgstr "pod rizikom"
msgid "issues need attention"
-msgstr ""
+msgstr "potrebna pažnja"
msgid "issues on track"
-msgstr ""
+msgstr "na pravom putu"
msgid "it is larger than %{limit}"
msgstr ""
@@ -40045,6 +40615,9 @@ msgstr ""
msgid "log in"
msgstr ""
+msgid "managed"
+msgstr ""
+
msgid "manual"
msgstr ""
@@ -40093,6 +40666,9 @@ msgstr ""
msgid "mrWidget| Please restore it or use a different %{missingBranchName} branch"
msgstr ""
+msgid "mrWidget|%{linkStart}Set up now%{linkEnd} to analyze your source code for known security vulnerabilities."
+msgstr ""
+
msgid "mrWidget|%{mergeError}."
msgstr ""
@@ -40174,6 +40750,9 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
+msgid "mrWidget|Create issue to resolve all threads"
+msgstr ""
+
msgid "mrWidget|Delete source branch"
msgstr ""
@@ -40183,12 +40762,18 @@ msgstr ""
msgid "mrWidget|Did not close"
msgstr ""
+msgid "mrWidget|Dismiss"
+msgstr ""
+
msgid "mrWidget|Email patches"
msgstr ""
msgid "mrWidget|Failed to load deployment statistics"
msgstr ""
+msgid "mrWidget|Hide %{widget} details"
+msgstr ""
+
msgid "mrWidget|If the %{missingBranchName} branch exists in your local repository, you can merge this merge request manually using the command line"
msgstr ""
@@ -40285,9 +40870,6 @@ msgstr ""
msgid "mrWidget|Request to merge"
msgstr ""
-msgid "mrWidget|Resolve all threads in new issue"
-msgstr ""
-
msgid "mrWidget|Resolve conflicts"
msgstr ""
@@ -40303,6 +40885,9 @@ msgstr ""
msgid "mrWidget|Revoke approval"
msgstr ""
+msgid "mrWidget|SAST and Secret Detection is not enabled."
+msgstr ""
+
msgid "mrWidget|Set by %{merge_author} to be added to the merge train when the pipeline succeeds"
msgstr ""
@@ -40312,6 +40897,9 @@ msgstr ""
msgid "mrWidget|Set by %{merge_author} to start a merge train when the pipeline succeeds"
msgstr ""
+msgid "mrWidget|Show %{widget} details"
+msgstr ""
+
msgid "mrWidget|The changes were merged into"
msgstr ""
@@ -40324,6 +40912,9 @@ msgstr ""
msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure, or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
msgstr ""
+msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure."
+msgstr ""
+
msgid "mrWidget|The source branch has been deleted"
msgstr ""
@@ -40366,6 +40957,9 @@ msgstr ""
msgid "mrWidget|You can merge after removing denied licenses"
msgstr ""
+msgid "mrWidget|You can only merge once this merge request is approved."
+msgstr ""
+
msgid "mrWidget|Your password"
msgstr ""
@@ -40402,6 +40996,9 @@ msgstr ""
msgid "must be less than the limit of %{tag_limit} tags"
msgstr ""
+msgid "must be set for a project namespace"
+msgstr ""
+
msgid "must be unique by status and elapsed time within a policy"
msgstr ""
@@ -40513,6 +41110,9 @@ msgstr ""
msgid "pipeline"
msgstr ""
+msgid "pipeline schedules documentation"
+msgstr ""
+
msgid "pod_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
msgstr ""
@@ -40564,16 +41164,25 @@ msgstr ""
msgid "project name"
msgstr ""
+msgid "project namespace cannot be the parent of another namespace"
+msgstr ""
+
msgid "projects"
msgstr ""
msgid "quick actions"
msgstr ""
-msgid "reCAPTCHA Private Key"
+msgid "reCAPTCHA"
+msgstr ""
+
+msgid "reCAPTCHA helps prevent credential stuffing."
msgstr ""
-msgid "reCAPTCHA Site Key"
+msgid "reCAPTCHA private key"
+msgstr ""
+
+msgid "reCAPTCHA site key"
msgstr ""
msgid "recent activity"
@@ -40745,7 +41354,7 @@ msgid "the file"
msgstr ""
msgid "the following issue(s)"
-msgstr ""
+msgstr "sljedeći zadaci"
msgid "the wiki"
msgstr ""
@@ -40801,6 +41410,9 @@ msgstr ""
msgid "user avatar"
msgstr ""
+msgid "user namespace cannot be the parent of another namespace"
+msgstr ""
+
msgid "user preferences"
msgstr ""
@@ -40894,3 +41506,9 @@ msgstr ""
msgid "your settings"
msgstr ""
+msgid "{group}"
+msgstr ""
+
+msgid "{project}"
+msgstr ""
+
diff --git a/locale/ca_ES/gitlab.po b/locale/ca_ES/gitlab.po
index 7d1fd006527..e5283111839 100644
--- a/locale/ca_ES/gitlab.po
+++ b/locale/ca_ES/gitlab.po
@@ -14,10 +14,7 @@ msgstr ""
"X-Crowdin-Language: ca\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-09-01 22:32\n"
-
-msgid " %{name}, confirm your email address now! "
-msgstr ""
+"PO-Revision-Date: 2021-10-04 20:20\n"
msgid " %{start} to %{end}"
msgstr " Des de %{start} fins %{end}"
@@ -92,6 +89,16 @@ msgstr ""
msgid "#general, #development"
msgstr ""
+msgid "%d Alert"
+msgid_plural "%d Alerts"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d Alert:"
+msgid_plural "%d Alerts:"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d Approval"
msgid_plural "%d Approvals"
msgstr[0] ""
@@ -455,7 +462,10 @@ msgstr ""
msgid "%{code_open}Protected:%{code_close} Only exposed to protected branches or tags."
msgstr ""
-msgid "%{commit_author_link} authored %{commit_timeago}"
+msgid "%{commit_author_link} authored %{commit_authored_timeago}"
+msgstr ""
+
+msgid "%{commit_author_link} authored %{commit_authored_timeago} and %{commit_committer_avatar} %{commit_committer_link} committed %{commit_committer_timeago}"
msgstr ""
msgid "%{completedCount} completed weight"
@@ -549,6 +559,15 @@ msgstr ""
msgid "%{doc_link_start}Advanced search%{doc_link_end} is enabled."
msgstr ""
+msgid "%{docs_link_start}Learn about visibility levels.%{docs_link_end}"
+msgstr ""
+
+msgid "%{docs_link_start}What is Large File Storage?%{docs_link_end}"
+msgstr ""
+
+msgid "%{docs_link_start}What is two-factor authentication?%{docs_link_end}"
+msgstr ""
+
msgid "%{due_date} (Past due)"
msgstr ""
@@ -621,9 +640,6 @@ msgstr ""
msgid "%{issueType} actions"
msgstr ""
-msgid "%{issuesCount} issues with a limit of %{maxIssueCount}"
-msgstr ""
-
msgid "%{issuesSize} with a limit of %{maxIssueCount}"
msgstr ""
@@ -681,6 +697,12 @@ msgstr ""
msgid "%{label_for_message} unavailable"
msgstr "%{label_for_message} no disponible"
+msgid "%{learn_more_link}."
+msgstr ""
+
+msgid "%{lessThan} 1 hour"
+msgstr ""
+
msgid "%{lets_encrypt_link_start}Let's Encrypt%{lets_encrypt_link_end} is a free, automated, and open certificate authority (CA) that issues digital certificates to enable HTTPS (SSL/TLS) for sites."
msgstr ""
@@ -693,15 +715,15 @@ msgstr ""
msgid "%{link_start}Learn more%{link_end} about roles."
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
-msgstr ""
-
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
msgstr ""
msgid "%{link_start}Start the title with %{draft_snippet}%{link_end} to prevent a merge request that is a work in progress from being merged before it's ready."
msgstr ""
+msgid "%{link_start}What information does GitLab Inc. collect?%{link_end}"
+msgstr ""
+
msgid "%{listToShow}, and %{awardsListLength} more"
msgstr ""
@@ -854,7 +876,7 @@ msgid_plural "%{securityScanner} results are not available because a pipeline ha
msgstr[0] ""
msgstr[1] ""
-msgid "%{service_ping_link_start}Learn more%{service_ping_link_end} about what information is shared with GitLab Inc."
+msgid "%{service_ping_link_start}What information is shared with GitLab Inc.?%{service_ping_link_end}"
msgstr ""
msgid "%{size} %{unit}"
@@ -890,6 +912,9 @@ msgstr ""
msgid "%{state} epics"
msgstr ""
+msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
+msgstr ""
+
msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
msgstr ""
@@ -949,11 +974,6 @@ msgstr ""
msgid "%{template_project_id} is unknown or invalid"
msgstr ""
-msgid "%{text} %{files}"
-msgid_plural "%{text} %{files} files"
-msgstr[0] "%{text} %{files}"
-msgstr[1] "%{text} %{files} fitxers"
-
msgid "%{text} is available"
msgstr ""
@@ -1038,9 +1058,6 @@ msgstr ""
msgid "%{wildcards_link_start}Wildcards%{wildcards_link_end} such as %{code_tag_start}v*%{code_tag_end} or %{code_tag_start}*-release%{code_tag_end} are supported."
msgstr ""
-msgid "&lt; 1 hour"
-msgstr ""
-
msgid "'%{data}' at %{location} does not match format: %{format}"
msgstr ""
@@ -1124,9 +1141,6 @@ msgstr ""
msgid "(we need your current password to confirm your changes)"
msgstr ""
-msgid "* * * * *"
-msgstr ""
-
msgid "+ %{amount} more"
msgstr ""
@@ -1193,10 +1207,10 @@ msgstr ""
msgid "."
msgstr ""
-msgid "0 bytes"
+msgid "/"
msgstr ""
-msgid "0 for unlimited, only effective with remote storage enabled."
+msgid "0 bytes"
msgstr ""
msgid "0t1DgySidms"
@@ -1326,6 +1340,9 @@ msgstr ""
msgid "1000+"
msgstr ""
+msgid "192.168.0.0/24"
+msgstr ""
+
msgid "1st contribution!"
msgstr ""
@@ -1479,9 +1496,6 @@ msgstr ""
msgid "A plain HTML site that uses Netlify for CI/CD instead of GitLab, but still with all the other great GitLab features"
msgstr ""
-msgid "A plain-text response to show to clients that hit the rate limit."
-msgstr ""
-
msgid "A platform value can be web, mob or app."
msgstr ""
@@ -1563,7 +1577,7 @@ msgstr ""
msgid "APIFuzzing|Configure HTTP basic authentication values. Other authentication methods are supported. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
+msgid "APIFuzzing|Customize your project's API fuzzing configuration options and copy the code snippet to your .gitlab-ci.yml file to apply any changes. Note that this tool does not reflect or update your .gitlab-ci.yml file automatically. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
msgstr ""
msgid "APIFuzzing|Enable authentication"
@@ -1626,9 +1640,6 @@ msgstr ""
msgid "APIFuzzing|To prevent a security leak, authentication info must be added as a %{ciVariablesLinkStart}CI variable%{ciVariablesLinkEnd}. As a user with maintainer access rights, you can manage CI variables in the %{ciSettingsLinkStart}Settings%{ciSettingsLinkEnd} area."
msgstr ""
-msgid "APIFuzzing|Use this tool to generate API fuzzing configuration YAML to copy into your .gitlab-ci.yml file. This tool does not reflect or update your .gitlab-ci.yml file automatically."
-msgstr ""
-
msgid "APIFuzzing|Username for basic authentication"
msgstr ""
@@ -1680,9 +1691,6 @@ msgstr "Informes d'abús"
msgid "Abuse reports notification email"
msgstr ""
-msgid "Abuse reports will be sent to this address if it is set. Abuse reports are always available in the admin area."
-msgstr ""
-
msgid "Accept invitation"
msgstr ""
@@ -1719,12 +1727,18 @@ msgstr ""
msgid "Access granted"
msgstr ""
+msgid "Access key ID"
+msgstr ""
+
msgid "Access requests"
msgstr ""
msgid "Access to '%{classification_label}' not allowed"
msgstr ""
+msgid "Access tokens expire after 2 hours. A refresh token may be used at any time to generate a new access token. Non-expiring access tokens are deprecated. Clear this setting to enable backward compatibility."
+msgstr ""
+
msgid "AccessDropdown|Deploy Keys"
msgstr ""
@@ -2037,6 +2051,9 @@ msgstr "Afegeix una aplicació nova"
msgid "Add new directory"
msgstr "Afegeix un directori nou"
+msgid "Add new service account"
+msgstr ""
+
msgid "Add or remove previously merged commits"
msgstr ""
@@ -2274,6 +2291,9 @@ msgstr ""
msgid "AdminArea|Features"
msgstr ""
+msgid "AdminArea|Get security updates from GitLab and stay up to date"
+msgstr ""
+
msgid "AdminArea|Groups"
msgstr ""
@@ -2313,6 +2333,12 @@ msgstr ""
msgid "AdminArea|Reporter"
msgstr ""
+msgid "AdminArea|Sign up for the GitLab Security Newsletter to get notified for security updates."
+msgstr ""
+
+msgid "AdminArea|Sign up for the GitLab newsletter"
+msgstr ""
+
msgid "AdminArea|Stop all jobs"
msgstr "Atura totes les tasques"
@@ -2382,9 +2408,15 @@ msgstr ""
msgid "AdminSettings|Disable public access to Pages sites"
msgstr ""
+msgid "AdminSettings|Display a banner on merge requests in projects with no pipelines to initiate steps to add a .gitlab-ci.yml file."
+msgstr ""
+
msgid "AdminSettings|Domain verification is an essential security measure for public GitLab sites. Users are required to demonstrate they control a domain before it is enabled. %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "AdminSettings|Enable pipeline suggestion banner"
+msgstr ""
+
msgid "AdminSettings|Enable shared runners for new projects"
msgstr ""
@@ -2856,10 +2888,10 @@ msgstr ""
msgid "Admin|Quarterly reconciliation will occur on %{qrtlyDate}"
msgstr ""
-msgid "Admin|The number of max seats used for your namespace is currently exceeding the number of seats in your subscription. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgid "Admin|The number of max seats in your namespace exceeds the number of seats in your subscription. On %{qrtlyDate}, quarterly reconciliation occurs and you are automatically billed a prorated amount for the overage. No action is needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice. For more information about the timing of the invoicing process, view the documentation."
msgstr ""
-msgid "Admin|The number of maximum users for your instance is currently exceeding the number of users in license. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgid "Admin|The number of max users in your instance exceeds the number of users in your license. On %{qrtlyDate}, quarterly reconciliation occurs and you are automatically billed a prorated amount for the overage. No action is needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice. For more information about the timing of the invoicing process, view the documentation."
msgstr ""
msgid "Admin|View pending user approvals"
@@ -2880,9 +2912,6 @@ msgstr ""
msgid "Advanced export options"
msgstr ""
-msgid "Advanced permissions, Large File Storage and Two-Factor authentication settings."
-msgstr ""
-
msgid "After a successful password update you will be redirected to login screen."
msgstr ""
@@ -2901,13 +2930,14 @@ msgstr ""
msgid "After you've reviewed these contribution guidelines, you'll be all set to"
msgstr ""
+msgid "Akismet"
+msgstr ""
+
msgid "Akismet API Key"
msgstr ""
-msgid "Alert"
-msgid_plural "Alerts"
-msgstr[0] ""
-msgstr[1] ""
+msgid "Akismet helps prevent the creation of spam issues in public projects."
+msgstr ""
msgid "AlertManagement|Acknowledged"
msgstr ""
@@ -3263,6 +3293,9 @@ msgstr ""
msgid "All (default)"
msgstr ""
+msgid "All GitLab"
+msgstr ""
+
msgid "All Members"
msgstr ""
@@ -3377,6 +3410,9 @@ msgstr ""
msgid "Allow this secondary node to replicate content on Object Storage"
msgstr ""
+msgid "Allow use of licensed EE features"
+msgstr ""
+
msgid "Allow users to dismiss the broadcast message"
msgstr ""
@@ -3452,9 +3488,6 @@ msgstr ""
msgid "Amazon authentication is not %{link_start}correctly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
-msgid "Amount of time (in hours) that users are allowed to skip forced configuration of two-factor authentication"
-msgstr ""
-
msgid "An %{link_start}alert%{link_end} with the same fingerprint is already open. To change the status of this alert, resolve the linked alert."
msgstr ""
@@ -3515,12 +3548,6 @@ msgstr ""
msgid "An error occurred when removing the label."
msgstr ""
-msgid "An error occurred when toggling the notification subscription"
-msgstr ""
-
-msgid "An error occurred when updating the issue weight"
-msgstr ""
-
msgid "An error occurred when updating the title"
msgstr ""
@@ -3569,6 +3596,9 @@ msgstr ""
msgid "An error occurred while enabling Service Desk."
msgstr ""
+msgid "An error occurred while fetching Markdown preview"
+msgstr ""
+
msgid "An error occurred while fetching ancestors"
msgstr ""
@@ -3599,9 +3629,6 @@ msgstr ""
msgid "An error occurred while fetching label colors."
msgstr ""
-msgid "An error occurred while fetching markdown preview"
-msgstr ""
-
msgid "An error occurred while fetching participants"
msgstr ""
@@ -3617,9 +3644,6 @@ msgstr ""
msgid "An error occurred while fetching reference"
msgstr ""
-msgid "An error occurred while fetching sidebar data"
-msgstr ""
-
msgid "An error occurred while fetching tags. Retry the search."
msgstr ""
@@ -3695,6 +3719,9 @@ msgstr ""
msgid "An error occurred while loading merge requests."
msgstr ""
+msgid "An error occurred while loading projects."
+msgstr ""
+
msgid "An error occurred while loading the Needs tab."
msgstr ""
@@ -3929,12 +3956,6 @@ msgstr ""
msgid "Any Milestone"
msgstr ""
-msgid "Any branch"
-msgstr ""
-
-msgid "Any eligible user"
-msgstr ""
-
msgid "Any encrypted tokens"
msgstr ""
@@ -3953,6 +3974,9 @@ msgstr ""
msgid "Any namespace"
msgstr ""
+msgid "App Engine description and apps that are suitable for this deployment target"
+msgstr ""
+
msgid "App ID"
msgstr ""
@@ -4101,6 +4125,11 @@ msgstr ""
msgid "Apply"
msgstr ""
+msgid "Apply %d suggestion"
+msgid_plural "Apply %d suggestions"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Apply a label"
msgstr ""
@@ -4110,13 +4139,10 @@ msgstr ""
msgid "Apply suggestion"
msgstr ""
-msgid "Apply suggestions"
-msgstr ""
-
msgid "Apply template"
msgstr ""
-msgid "Apply this approval rule to any branch or a specific protected branch."
+msgid "Apply this approval rule to all branches or a specific protected branch."
msgstr ""
msgid "Applying"
@@ -4259,9 +4285,6 @@ msgstr ""
msgid "ApprovalSettings|Prevent editing approval rules in projects and merge requests."
msgstr ""
-msgid "ApprovalSettings|Prevent editing approval rules in projects and merge requests. "
-msgstr ""
-
msgid "ApprovalSettings|Remove all approvals when commits are added to the source branch."
msgstr ""
@@ -4277,6 +4300,9 @@ msgstr ""
msgid "ApprovalSettings|This setting is configured at the instance level and can only be changed by an administrator."
msgstr ""
+msgid "ApprovalSettings|This setting is configured in %{groupName} and can only be changed by an administrator or group owner."
+msgstr ""
+
msgid "ApprovalStatusTooltip|Adheres to separation of duties"
msgstr ""
@@ -4763,9 +4789,6 @@ msgstr ""
msgid "Authenticated API rate limit period in seconds"
msgstr ""
-msgid "Authenticated API request rate limit"
-msgstr ""
-
msgid "Authenticated API requests"
msgstr ""
@@ -4775,10 +4798,10 @@ msgstr ""
msgid "Authenticated Git LFS request rate limit"
msgstr ""
-msgid "Authenticated web rate limit period in seconds"
+msgid "Authenticated Git LFS requests"
msgstr ""
-msgid "Authenticated web request rate limit"
+msgid "Authenticated web rate limit period in seconds"
msgstr ""
msgid "Authenticated web requests"
@@ -5156,9 +5179,6 @@ msgstr ""
msgid "Below you will find all the groups that are public."
msgstr ""
-msgid "Beta"
-msgstr ""
-
msgid "Bi-weekly code coverage"
msgstr ""
@@ -5398,6 +5418,21 @@ msgstr ""
msgid "Board scope affects which issues are displayed for anyone who visits this board"
msgstr ""
+msgid "BoardNewEpic|Groups"
+msgstr ""
+
+msgid "BoardNewEpic|Loading groups"
+msgstr ""
+
+msgid "BoardNewEpic|No matching results"
+msgstr ""
+
+msgid "BoardNewEpic|Search groups"
+msgstr ""
+
+msgid "BoardNewEpic|Select a group"
+msgstr ""
+
msgid "BoardNewIssue|No matching results"
msgstr ""
@@ -5475,6 +5510,9 @@ msgstr ""
msgid "Boards|An error occurred while creating the list. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching child groups. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching group projects. Please try again."
msgstr ""
@@ -5807,6 +5845,9 @@ msgstr ""
msgid "Bulk update"
msgstr ""
+msgid "BulkImports|Re-import creates a new group. It does not sync with the existing group."
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -5816,6 +5857,9 @@ msgstr ""
msgid "BulkImport|From source group"
msgstr ""
+msgid "BulkImport|Group import history"
+msgstr ""
+
msgid "BulkImport|Import failed: Destination cannot be a subgroup of the source group. Change the destination and try again."
msgstr ""
@@ -5828,9 +5872,18 @@ msgstr ""
msgid "BulkImport|Importing the group failed"
msgstr ""
+msgid "BulkImport|Last imported to %{link}"
+msgstr ""
+
msgid "BulkImport|Name already exists."
msgstr ""
+msgid "BulkImport|New group"
+msgstr ""
+
+msgid "BulkImport|No history is available"
+msgstr ""
+
msgid "BulkImport|No parent"
msgstr ""
@@ -5843,6 +5896,9 @@ msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} matching filter \"%{filter}\" from %{link}"
msgstr ""
+msgid "BulkImport|Source group"
+msgstr ""
+
msgid "BulkImport|To new group"
msgstr ""
@@ -5852,6 +5908,9 @@ msgstr ""
msgid "BulkImport|You have no groups to import"
msgstr ""
+msgid "BulkImport|Your imported groups will appear here."
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -6094,6 +6153,9 @@ msgstr ""
msgid "Can be manually deployed to"
msgstr ""
+msgid "Can be overridden in each project."
+msgstr ""
+
msgid "Can create groups:"
msgstr ""
@@ -6196,6 +6258,9 @@ msgstr ""
msgid "Cancelling Preview"
msgstr ""
+msgid "Cannot assign a confidential epic to a non-confidential issue. Make the issue confidential and try again"
+msgstr ""
+
msgid "Cannot be assigned to other projects."
msgstr ""
@@ -6247,9 +6312,6 @@ msgstr ""
msgid "Cannot refer to a group %{timebox_type} by an internal id!"
msgstr ""
-msgid "Cannot set confidential epic for a non-confidential issue"
-msgstr ""
-
msgid "Cannot show preview. For previews on sketch files, they must have the file format introduced by Sketch version 43 and above."
msgstr ""
@@ -6487,15 +6549,15 @@ msgstr ""
msgid "Check out, review, and merge locally"
msgstr ""
-msgid "Check the %{docs_link_start}documentation%{docs_link_end}."
-msgstr ""
-
msgid "Check the current instance configuration "
msgstr ""
msgid "Check the elasticsearch.log file to debug why the migration was halted and make any changes before retrying the migration. When you fix the cause of the failure, click \"Retry migration\", and the migration will be scheduled to be retried in the background."
msgstr ""
+msgid "Check with your administrator."
+msgstr ""
+
msgid "Check your Docker images for known vulnerabilities."
msgstr ""
@@ -6526,6 +6588,9 @@ msgstr ""
msgid "Checkout"
msgstr ""
+msgid "Checkout|$%{selectedPlanPrice} per 10 GB storage per pack"
+msgstr ""
+
msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 minutes"
msgstr ""
@@ -6546,17 +6611,23 @@ msgstr ""
msgid "Checkout|%{name}'s GitLab subscription"
msgstr ""
-msgid "Checkout|%{selectedPlanText} plan"
+msgid "Checkout|%{name}'s storage subscription"
msgstr ""
-msgid "Checkout|%{startDate} - %{endDate}"
+msgid "Checkout|%{quantity} GB of storage"
msgstr ""
-msgid "Checkout|%{totalCiMinutes} CI minute"
-msgid_plural "Checkout|%{totalCiMinutes} CI minutes"
+msgid "Checkout|%{quantity} storage pack"
+msgid_plural "Checkout|%{quantity} storage packs"
msgstr[0] ""
msgstr[1] ""
+msgid "Checkout|%{selectedPlanText} plan"
+msgstr ""
+
+msgid "Checkout|%{startDate} - %{endDate}"
+msgstr ""
+
msgid "Checkout|%{totalCiMinutes} CI minutes"
msgstr ""
@@ -6632,6 +6703,9 @@ msgstr ""
msgid "Checkout|Failed to register credit card. Please try again."
msgstr ""
+msgid "Checkout|GB"
+msgstr ""
+
msgid "Checkout|GitLab group"
msgstr ""
@@ -6668,6 +6742,9 @@ msgstr ""
msgid "Checkout|State"
msgstr ""
+msgid "Checkout|Storage packs"
+msgstr ""
+
msgid "Checkout|Street address"
msgstr ""
@@ -6689,6 +6766,9 @@ msgstr ""
msgid "Checkout|Total minutes: %{quantity}"
msgstr ""
+msgid "Checkout|Total storage: %{quantity} GB"
+msgstr ""
+
msgid "Checkout|Users"
msgstr ""
@@ -6698,16 +6778,25 @@ msgstr ""
msgid "Checkout|Your organization"
msgstr ""
+msgid "Checkout|Your storage subscription has the same term as your main subscription, and the price is prorated accordingly."
+msgstr ""
+
msgid "Checkout|Your subscription will be applied to this group"
msgstr ""
msgid "Checkout|Zip code"
msgstr ""
+msgid "Checkout|a storage subscription"
+msgstr ""
+
msgid "Checkout|company or team"
msgstr ""
-msgid "Checkout|x 1,000 minutes per pack = %{strong}"
+msgid "Checkout|minutes"
+msgstr ""
+
+msgid "Checkout|x %{quantity} %{units} per pack ="
msgstr ""
msgid "Cherry-pick this commit"
@@ -7064,6 +7153,9 @@ msgstr ""
msgid "CloneIssue|Cannot clone issue to target project as it is pending deletion."
msgstr ""
+msgid "CloneIssue|Cannot clone issues of '%{issue_type}' type."
+msgstr ""
+
msgid "Cloned this issue to %{path_to_project}."
msgstr ""
@@ -7118,7 +7210,10 @@ msgstr ""
msgid "Closes this %{quick_action_target}."
msgstr ""
-msgid "Cloud licenses can not be removed."
+msgid "Cloud Functions description and apps that are suitable for this deployment target"
+msgstr ""
+
+msgid "Cloud Run description and apps that are suitable for this deployment target"
msgstr ""
msgid "Cluster"
@@ -7145,6 +7240,12 @@ msgstr ""
msgid "ClusterAgents|Access tokens"
msgstr ""
+msgid "ClusterAgents|Agent might not be connected to GitLab"
+msgstr ""
+
+msgid "ClusterAgents|Agent never connected to GitLab"
+msgstr ""
+
msgid "ClusterAgents|Alternative installation methods"
msgstr ""
@@ -7160,6 +7261,12 @@ msgstr ""
msgid "ClusterAgents|Configuration"
msgstr ""
+msgid "ClusterAgents|Connected"
+msgstr ""
+
+msgid "ClusterAgents|Connection status"
+msgstr ""
+
msgid "ClusterAgents|Copy token"
msgstr ""
@@ -7178,6 +7285,9 @@ msgstr ""
msgid "ClusterAgents|For alternative installation methods %{linkStart}go to the documentation%{linkEnd}."
msgstr ""
+msgid "ClusterAgents|For more troubleshooting information go to"
+msgstr ""
+
msgid "ClusterAgents|Go to the repository"
msgstr ""
@@ -7193,18 +7303,30 @@ msgstr ""
msgid "ClusterAgents|Integrate with the GitLab Agent"
msgstr ""
-msgid "ClusterAgents|Last used"
+msgid "ClusterAgents|Last connected %{timeAgo}."
+msgstr ""
+
+msgid "ClusterAgents|Last contact"
msgstr ""
msgid "ClusterAgents|Learn how to create an agent access token"
msgstr ""
+msgid "ClusterAgents|Make sure you are using a valid token."
+msgstr ""
+
msgid "ClusterAgents|Name"
msgstr ""
msgid "ClusterAgents|Never"
msgstr ""
+msgid "ClusterAgents|Never connected"
+msgstr ""
+
+msgid "ClusterAgents|Not connected"
+msgstr ""
+
msgid "ClusterAgents|Read more about getting started"
msgstr ""
@@ -7226,6 +7348,9 @@ msgstr ""
msgid "ClusterAgents|Select which Agent you want to install"
msgstr ""
+msgid "ClusterAgents|The Agent has not been connected in a long time. There might be a connectivity issue. Last contact was %{timeAgo}."
+msgstr ""
+
msgid "ClusterAgents|The GitLab Agent also requires %{linkStart}enabling the Agent Server%{linkEnd}"
msgstr ""
@@ -7253,9 +7378,6 @@ msgstr ""
msgid "ClusterAgents|You will need to create a token to connect to your agent"
msgstr ""
-msgid "ClusterAgent|This feature is only available for premium plans"
-msgstr ""
-
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -7445,9 +7567,6 @@ msgstr ""
msgid "ClusterIntegration|Create Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Create a provision role on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the account and external ID above. %{startMoreInfoLink}More information%{endLink}"
-msgstr ""
-
msgid "ClusterIntegration|Create cluster on"
msgstr ""
@@ -7880,7 +7999,7 @@ msgstr ""
msgid "ClusterIntegration|Subnets"
msgstr ""
-msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provisioned role, first create one on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the above account and external IDs. %{startMoreInfoLink}More information%{endLink}"
+msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provisioned role, first create one on %{awsLinkStart}Amazon Web Services %{awsLinkEnd} using the above account and external IDs. %{moreInfoStart}More information%{moreInfoEnd}"
msgstr ""
msgid "ClusterIntegration|The Kubernetes certificate used to authenticate to the cluster."
@@ -8114,6 +8233,9 @@ msgstr ""
msgid "Collapse replies"
msgstr ""
+msgid "Collapse settings section"
+msgstr ""
+
msgid "Collapse sidebar"
msgstr ""
@@ -8132,6 +8254,9 @@ msgstr ""
msgid "Comma-separated list of email addresses."
msgstr ""
+msgid "Comma-separated list of users allowed to exceed the rate limit."
+msgstr ""
+
msgid "Comma-separated, e.g. '1.1.1.1, 2.2.2.0/24'"
msgstr ""
@@ -8452,6 +8577,9 @@ msgstr ""
msgid "Configure %{repository_checks_link_start}repository checks%{link_end} and %{housekeeping_link_start}housekeeping%{link_end} on repositories."
msgstr ""
+msgid "Configure CAPTCHAs, IP address limits, and other anti-spam measures."
+msgstr ""
+
msgid "Configure Dependency Scanning in `.gitlab-ci.yml` using the GitLab managed template. You can [add variable overrides](https://docs.gitlab.com/ee/user/application_security/dependency_scanning/#customizing-the-dependency-scanning-settings) to customize Dependency Scanning settings."
msgstr ""
@@ -8488,16 +8616,13 @@ msgstr ""
msgid "Configure a %{codeStart}.gitlab-webide.yml%{codeEnd} file in the %{codeStart}.gitlab%{codeEnd} directory to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
msgstr ""
-msgid "Configure existing installation"
-msgstr ""
-
-msgid "Configure limit for notes created per minute by web and API requests."
+msgid "Configure advanced permissions, Large File Storage, and two-factor authentication settings."
msgstr ""
-msgid "Configure limits for Project/Group Import/Export."
+msgid "Configure approvals by authors and committers on all projects."
msgstr ""
-msgid "Configure limits for web and API requests."
+msgid "Configure existing installation"
msgstr ""
msgid "Configure paths to be protected by Rack Attack."
@@ -8512,10 +8637,13 @@ msgstr ""
msgid "Configure settings for Advanced Search with Elasticsearch."
msgstr ""
+msgid "Configure specific limits for Files API requests that supersede the general user and IP rate limits."
+msgstr ""
+
msgid "Configure specific limits for Git LFS requests that supersede the general user and IP rate limits."
msgstr ""
-msgid "Configure specific limits for Packages API requests that supersede the general user and IP rate limits."
+msgid "Configure specific limits for deprecated API requests that supersede the general user and IP rate limits."
msgstr ""
msgid "Configure the %{link} integration."
@@ -8527,6 +8655,9 @@ msgstr ""
msgid "Configure the way a user creates a new account."
msgstr ""
+msgid "Configure via Merge Request"
+msgstr ""
+
msgid "Configure which lists are shown for anyone who visits this board"
msgstr ""
@@ -8995,6 +9126,9 @@ msgstr ""
msgid "Content parsed with %{link}."
msgstr ""
+msgid "ContentEditor|Table of Contents"
+msgstr ""
+
msgid "ContentEditor|You have to provide a renderMarkdown function or a custom serializer"
msgstr ""
@@ -9181,6 +9315,9 @@ msgstr ""
msgid "Copy link to chart"
msgstr ""
+msgid "Copy prefix"
+msgstr ""
+
msgid "Copy reference"
msgstr ""
@@ -9211,6 +9348,9 @@ msgstr ""
msgid "Copy value"
msgstr ""
+msgid "Corpus Management"
+msgstr ""
+
msgid "Corpus Management|Are you sure you want to delete the corpus?"
msgstr ""
@@ -9439,6 +9579,9 @@ msgstr ""
msgid "Create commit"
msgstr ""
+msgid "Create common files more quickly, and standardize their format."
+msgstr ""
+
msgid "Create confidential merge request"
msgstr ""
@@ -9472,6 +9615,9 @@ msgstr ""
msgid "Create issue"
msgstr ""
+msgid "Create issue to resolve all threads"
+msgstr ""
+
msgid "Create iteration"
msgstr ""
@@ -9526,6 +9672,9 @@ msgstr ""
msgid "Create new..."
msgstr "Crea..."
+msgid "Create or import your first project"
+msgstr ""
+
msgid "Create project"
msgstr ""
@@ -9883,7 +10032,7 @@ msgstr ""
msgid "Custom notification events"
msgstr ""
-msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notificationLinkStart} notification emails%{notificationLinkEnd}."
+msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notificationLinkStart}notification emails%{notificationLinkEnd}."
msgstr ""
msgid "Custom project templates"
@@ -10082,10 +10231,10 @@ msgid_plural "CycleAnalytics|Showing %{subjectFilterText} and %{selectedLabelsCo
msgstr[0] ""
msgstr[1] ""
-msgid "CycleAnalytics|Showing data for group '%{groupName}' and %{selectedProjectCount} projects from %{startDate} to %{endDate}"
+msgid "CycleAnalytics|Showing data for group '%{groupName}' and %{selectedProjectCount} projects from %{createdAfter} to %{createdBefore}"
msgstr ""
-msgid "CycleAnalytics|Showing data for group '%{groupName}' from %{startDate} to %{endDate}"
+msgid "CycleAnalytics|Showing data for group '%{groupName}' from %{createdAfter} to %{createdBefore}"
msgstr ""
msgid "CycleAnalytics|Stages"
@@ -10319,6 +10468,9 @@ msgstr ""
msgid "DastProfiles|Manage profiles"
msgstr ""
+msgid "DastProfiles|Manage site profiles"
+msgstr ""
+
msgid "DastProfiles|Minimum = 0 (no timeout enabled), Maximum = 2880 minutes"
msgstr ""
@@ -10394,6 +10546,9 @@ msgstr ""
msgid "DastProfiles|Scanner name"
msgstr ""
+msgid "DastProfiles|Schedule"
+msgstr ""
+
msgid "DastProfiles|Select branch"
msgstr ""
@@ -10463,7 +10618,7 @@ msgstr ""
msgid "DastProfiles|Website"
msgstr ""
-msgid "DastProfiles|You can either choose a passive scan or validate the target site in your chosen site profile. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
+msgid "DastProfiles|You can either choose a passive scan or validate the target site from the site profile management page. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
msgstr ""
msgid "DastProfiles|You cannot run an active scan against an unvalidated site."
@@ -10636,7 +10791,7 @@ msgstr ""
msgid "Days to merge"
msgstr ""
-msgid "Deactivate dormant users after 90 days of inactivity. Users can return to active status by signing in to their account. While inactive, a user is not counted as an active user in the instance."
+msgid "Deactivate dormant users after 90 days of inactivity"
msgstr ""
msgid "Dear Administrator,"
@@ -10723,10 +10878,10 @@ msgstr ""
msgid "Define a custom pattern with cron syntax"
msgstr ""
-msgid "Define approval settings."
+msgid "Define approval rules."
msgstr ""
-msgid "Define approval settings. %{linkStart}Learn more.%{linkEnd}"
+msgid "Define approval rules. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "Define custom rules for what constitutes spam, independent of Akismet"
@@ -10735,7 +10890,7 @@ msgstr ""
msgid "Define environments in the deploy stage(s) in %{code_open}.gitlab-ci.yml%{code_close} to track deployments here."
msgstr ""
-msgid "Define how approval rules are applied as a merge request moves toward completion."
+msgid "Define how approval rules are applied to merge requests."
msgstr ""
msgid "Definition"
@@ -10750,6 +10905,12 @@ msgstr ""
msgid "DelayedJobs|Are you sure you want to run %{job_name} immediately? This job will run automatically after it's timer finishes."
msgstr ""
+msgid "DelayedJobs|Are you sure you want to run %{job_name} immediately? This job will run automatically after its timer finishes."
+msgstr ""
+
+msgid "DelayedJobs|Run the delayed job now?"
+msgstr ""
+
msgid "DelayedJobs|Start now"
msgstr ""
@@ -11026,6 +11187,12 @@ msgstr ""
msgid "Dependency proxy image prefix"
msgstr ""
+msgid "DependencyProxy|Create a local proxy for storing frequently used upstream images. %{docLinkStart}Learn more%{docLinkEnd} about dependency proxies."
+msgstr ""
+
+msgid "DependencyProxy|Dependency Proxy"
+msgstr ""
+
msgid "DependencyProxy|Toggle Dependency Proxy"
msgstr ""
@@ -11266,6 +11433,9 @@ msgstr ""
msgid "Deployments"
msgstr ""
+msgid "Deployments to Google Kubernetes Engine can be "
+msgstr ""
+
msgid "Deployments|%{deployments} environment impacted."
msgid_plural "Deployments|%{deployments} environments impacted."
msgstr[0] ""
@@ -11295,6 +11465,9 @@ msgstr ""
msgid "Deployment|success"
msgstr ""
+msgid "Deprecated API rate limits"
+msgstr ""
+
msgid "Deprioritize label"
msgstr ""
@@ -11697,6 +11870,16 @@ msgstr ""
msgid "DiffsCompareBaseBranch|(base)"
msgstr ""
+msgid "Diffs|%d addition"
+msgid_plural "Diffs|%d additions"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Diffs|%d deletion"
+msgid_plural "Diffs|%d deletions"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Diffs|No file name available"
msgstr ""
@@ -11706,9 +11889,17 @@ msgstr ""
msgid "Diffs|Show all unchanged lines"
msgstr ""
+msgid "Diffs|Showing %{dropdownStart}%{count} changed file%{dropdownEnd}"
+msgid_plural "Diffs|Showing %{dropdownStart}%{count} changed files%{dropdownEnd}"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Diffs|Something went wrong while fetching diff lines."
msgstr ""
+msgid "Diffs|with %{additions} and %{deletions}"
+msgstr ""
+
msgid "Direct member"
msgstr ""
@@ -11834,9 +12025,6 @@ msgid_plural "Dismiss %d selected vulnerabilities as"
msgstr[0] ""
msgstr[1] ""
-msgid "Dismiss Value Stream Analytics introduction box"
-msgstr ""
-
msgid "Dismiss merge request promotion"
msgstr ""
@@ -12158,6 +12346,9 @@ msgstr ""
msgid "Edit issues"
msgstr ""
+msgid "Edit merge requests"
+msgstr ""
+
msgid "Edit public deploy key"
msgstr ""
@@ -12233,6 +12424,9 @@ msgstr ""
msgid "Elastic|None. Select projects to index."
msgstr ""
+msgid "Eligible users"
+msgstr ""
+
msgid "Email"
msgstr "Adreça electrònica"
@@ -12362,6 +12556,9 @@ msgstr ""
msgid "Enable"
msgstr "Activa"
+msgid "Enable Amazon EKS integration"
+msgstr ""
+
msgid "Enable Auto DevOps"
msgstr ""
@@ -12395,6 +12592,9 @@ msgstr ""
msgid "Enable SSL verification"
msgstr ""
+msgid "Enable Service Ping"
+msgstr ""
+
msgid "Enable Snowplow tracking"
msgstr ""
@@ -12425,6 +12625,9 @@ msgstr ""
msgid "Enable authenticated Git LFS request rate limit"
msgstr ""
+msgid "Enable authenticated web request rate limit"
+msgstr ""
+
msgid "Enable authentication"
msgstr ""
@@ -12485,7 +12688,7 @@ msgstr ""
msgid "Enable or disable the Pseudonymizer data collection."
msgstr ""
-msgid "Enable or disable version check and service ping."
+msgid "Enable or disable version check and Service Ping."
msgstr ""
msgid "Enable protected paths rate limit"
@@ -12497,18 +12700,12 @@ msgstr ""
msgid "Enable reCAPTCHA"
msgstr ""
-msgid "Enable reCAPTCHA for login"
-msgstr ""
-
-msgid "Enable reCAPTCHA, Invisible Captcha, Akismet and set IP limits. For reCAPTCHA, we currently only support %{recaptcha_v2_link_start}v2%{recaptcha_v2_link_end}"
+msgid "Enable reCAPTCHA for login."
msgstr ""
msgid "Enable repository checks"
msgstr ""
-msgid "Enable service ping"
-msgstr ""
-
msgid "Enable shared runners for all projects and subgroups in this group."
msgstr ""
@@ -12530,7 +12727,10 @@ msgstr ""
msgid "Enable unauthenticated API request rate limit"
msgstr ""
-msgid "Enable unauthenticated request rate limit"
+msgid "Enable unauthenticated web request rate limit"
+msgstr ""
+
+msgid "Enable user deactivation emails"
msgstr ""
msgid "Enable version check"
@@ -12566,9 +12766,6 @@ msgstr ""
msgid "Enabled sources for code import during project creation. OmniAuth must be configured for GitHub"
msgstr ""
-msgid "Enabling this will only make licensed EE features available to projects if the project namespace's plan includes the feature or if the project is public."
-msgstr ""
-
msgid "Encountered an error while rendering: %{err}"
msgstr ""
@@ -12617,9 +12814,6 @@ msgstr ""
msgid "Enter Admin Mode"
msgstr ""
-msgid "Enter IP address range"
-msgstr ""
-
msgid "Enter a number"
msgstr ""
@@ -12632,9 +12826,6 @@ msgstr ""
msgid "Enter at least three characters to search"
msgstr ""
-msgid "Enter domain"
-msgstr ""
-
msgid "Enter in your Bitbucket Server URL and personal access token below"
msgstr ""
@@ -12821,9 +13012,6 @@ msgstr ""
msgid "Environments|Deployment %{status}"
msgstr ""
-msgid "Environments|Dismiss"
-msgstr ""
-
msgid "Environments|Enable review app"
msgstr ""
@@ -12836,9 +13024,6 @@ msgstr ""
msgid "Environments|Environments are places where code gets deployed, such as staging or production."
msgstr ""
-msgid "Environments|Help us improve environments"
-msgstr ""
-
msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
msgstr ""
@@ -12875,6 +13060,9 @@ msgstr ""
msgid "Environments|Note that this action will stop the environment, but it will %{emphasisStart}not%{emphasisEnd} have an effect on any existing deployment due to no “stop environment action†being defined in the %{ciConfigLinkStart}.gitlab-ci.yml%{ciConfigLinkEnd} file."
msgstr ""
+msgid "Environments|Open"
+msgstr ""
+
msgid "Environments|Open live environment"
msgstr ""
@@ -12914,9 +13102,6 @@ msgstr ""
msgid "Environments|Stopping %{environmentName}"
msgstr ""
-msgid "Environments|Take the survey"
-msgstr ""
-
msgid "Environments|There was an error fetching the logs. Please try again."
msgstr ""
@@ -12938,9 +13123,6 @@ msgstr ""
msgid "Environments|You don't have any environments right now"
msgstr ""
-msgid "Environments|Your feedback helps GitLab make environments better for you and other users. Participate and enter a sweepstake to win a USD 30 gift card."
-msgstr ""
-
msgid "Environments|by %{avatar}"
msgstr ""
@@ -13223,7 +13405,7 @@ msgstr ""
msgid "Error parsing CSV file. Please make sure it has"
msgstr ""
-msgid "Error rendering markdown preview"
+msgid "Error rendering Markdown preview"
msgstr ""
msgid "Error saving label update."
@@ -13271,6 +13453,9 @@ msgstr ""
msgid "Error: %{error_message}"
msgstr ""
+msgid "Error: Couldn't load some or all of the changes."
+msgstr ""
+
msgid "Error: No AWS credentials were supplied"
msgstr ""
@@ -13304,6 +13489,9 @@ msgstr ""
msgid "ErrorTracking|Enable error tracking"
msgstr ""
+msgid "ErrorTracking|Error tracking backend"
+msgstr ""
+
msgid "ErrorTracking|If you self-host Sentry, enter your Sentry instance's full URL. If you use Sentry's hosted solution, enter https://sentry.io"
msgstr ""
@@ -13337,6 +13525,12 @@ msgstr ""
msgid "Escalation policies must have at least one rule"
msgstr ""
+msgid "EscalationPolicies|%{clockIcon} IF alert is not %{alertStatus} in %{minutes}"
+msgstr ""
+
+msgid "EscalationPolicies|%{notificationIcon} THEN %{doAction} %{forScheduleOrUser}"
+msgstr ""
+
msgid "EscalationPolicies|+ Add an additional rule"
msgstr ""
@@ -13379,13 +13573,13 @@ msgstr ""
msgid "EscalationPolicies|Escalation policies"
msgstr ""
-msgid "EscalationPolicies|Escalation rules"
+msgid "EscalationPolicies|Escalation policy %{obstacle} in Project %{project}"
msgstr ""
-msgid "EscalationPolicies|Failed to load oncall-schedules"
+msgid "EscalationPolicies|Escalation rules"
msgstr ""
-msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} %{then} THEN %{doAction} %{scheduleOrUser}"
+msgid "EscalationPolicies|Failed to load oncall-schedules"
msgstr ""
msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} minutes"
@@ -13463,18 +13657,36 @@ msgstr ""
msgid "Every %{action} attempt has failed: %{job_error_message}. Please try again."
msgstr ""
+msgid "Every 3 months"
+msgstr ""
+
+msgid "Every 3 months on the %{day} at %{time} %{timezone}"
+msgstr ""
+
+msgid "Every 6 months"
+msgstr ""
+
+msgid "Every 6 months on the %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Every day"
msgstr ""
msgid "Every day (at %{time})"
msgstr ""
+msgid "Every day at %{time} %{timezone}"
+msgstr ""
+
msgid "Every month"
msgstr ""
msgid "Every month (Day %{day} at %{time})"
msgstr ""
+msgid "Every month on the %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Every three months"
msgstr ""
@@ -13489,6 +13701,15 @@ msgstr[1] ""
msgid "Every week (%{weekday} at %{time})"
msgstr ""
+msgid "Every week on %{day} at %{time} %{timezone}"
+msgstr ""
+
+msgid "Every year"
+msgstr ""
+
+msgid "Every year on %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Everyone"
msgstr ""
@@ -13525,9 +13746,6 @@ msgstr ""
msgid "Exactly one of %{attributes} is required"
msgstr ""
-msgid "Example: %{ip_address}. %{read_more_link}."
-msgstr ""
-
msgid "Example: @sub\\.company\\.com$"
msgstr ""
@@ -13594,13 +13812,13 @@ msgstr ""
msgid "Expand pipeline"
msgstr ""
-msgid "Expand sidebar"
+msgid "Expand settings section"
msgstr ""
-msgid "Expected documents: %{expected_documents}"
+msgid "Expand sidebar"
msgstr ""
-msgid "Experienced"
+msgid "Expected documents: %{expected_documents}"
msgstr ""
msgid "ExperimentSubject|Must have exactly one of User, Namespace, or Project."
@@ -13885,9 +14103,6 @@ msgstr ""
msgid "Failed to load related branches"
msgstr ""
-msgid "Failed to load sidebar lock status"
-msgstr ""
-
msgid "Failed to load stacktrace."
msgstr ""
@@ -14312,6 +14527,9 @@ msgstr ""
msgid "Files"
msgstr "Fitxers"
+msgid "Files API Rate Limits"
+msgstr ""
+
msgid "Files breadcrumb"
msgstr ""
@@ -15311,6 +15529,9 @@ msgstr ""
msgid "GitLab group: %{source_link}"
msgstr ""
+msgid "GitLab informs you if a new version is available."
+msgstr ""
+
msgid "GitLab is a complete DevOps platform, delivered as a single application, fundamentally changing the way Development, Security, and Ops teams collaborate"
msgstr ""
@@ -15326,7 +15547,7 @@ msgstr ""
msgid "GitLab is open source software to collaborate on code."
msgstr ""
-msgid "GitLab is undergoing maintenance and is operating in a read-only mode."
+msgid "GitLab is undergoing maintenance and is operating in read-only mode."
msgstr ""
msgid "GitLab member or Email address"
@@ -15338,9 +15559,6 @@ msgstr ""
msgid "GitLab project export"
msgstr ""
-msgid "GitLab restart is required to apply changes."
-msgstr ""
-
msgid "GitLab single sign-on URL"
msgstr ""
@@ -15356,9 +15574,6 @@ msgstr ""
msgid "GitLab version"
msgstr ""
-msgid "GitLab will inform you if a new version is available."
-msgstr ""
-
msgid "GitLab will run a background job that will produce pseudonymized CSVs of the GitLab database that will be uploaded to your configured object storage directory."
msgstr ""
@@ -15623,9 +15838,21 @@ msgstr ""
msgid "Go to snippets"
msgstr ""
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check 'Allowed domains for sign-ups'."
+msgstr ""
+
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check 'Email restrictions for sign-ups'."
+msgstr ""
+
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check the 'Domain denylist'."
+msgstr ""
+
msgid "Go to the activity feed"
msgstr ""
+msgid "Go to the group’s 'Settings &gt; General' page, and check 'Restrict membership by email domain'."
+msgstr ""
+
msgid "Go to the milestone list"
msgstr ""
@@ -15662,6 +15889,12 @@ msgstr ""
msgid "Goal of the changes and what reviewers should be aware of"
msgstr ""
+msgid "Google Cloud"
+msgstr ""
+
+msgid "Google Cloud offers several deployment targets. Select the one most suitable for your project."
+msgstr ""
+
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
@@ -15746,9 +15979,6 @@ msgstr ""
msgid "Group ID"
msgstr ""
-msgid "Group ID: %{group_id}"
-msgstr ""
-
msgid "Group Owner must have signed in with SAML before enabling Group Managed Accounts"
msgstr ""
@@ -15923,6 +16153,12 @@ msgstr ""
msgid "GroupImport|Unable to process group import file"
msgstr ""
+msgid "GroupPage|Copy group ID"
+msgstr ""
+
+msgid "GroupPage|Group ID: %{group_id}"
+msgstr ""
+
msgid "GroupRoadmap|%{dateWord} – No end date"
msgstr ""
@@ -15977,6 +16213,9 @@ msgstr ""
msgid "GroupRoadmap|Within 3 years"
msgstr ""
+msgid "GroupSAML|\"persistent\" recommended"
+msgstr ""
+
msgid "GroupSAML|%{strongOpen}Warning%{strongClose} - Enabling %{linkStart}SSO enforcement%{linkEnd} can reduce security risks."
msgstr ""
@@ -16109,6 +16348,9 @@ msgstr ""
msgid "GroupSAML|To be able to prohibit outer forks, you first need to enforce dedicate group managed accounts."
msgstr ""
+msgid "GroupSAML|Use SAML group links to manage group membership using SAML."
+msgstr ""
+
msgid "GroupSAML|Valid SAML Response"
msgstr ""
@@ -16121,13 +16363,10 @@ msgstr ""
msgid "GroupSAML|as %{access_level}"
msgstr ""
-msgid "GroupSAML|must match stored NameID of \"%{extern_uid}\" as we use this to identify users. If the NameID changes users will be unable to sign in."
-msgstr ""
-
-msgid "GroupSAML|should be \"persistent\""
+msgid "GroupSAML|must match stored NameID of \"%{extern_uid}\" to identify user and allow sign in"
msgstr ""
-msgid "GroupSAML|should be a random persistent ID, emails are discouraged"
+msgid "GroupSAML|recommend persistent ID instead of email"
msgstr ""
msgid "GroupSelect|No matching results"
@@ -16142,9 +16381,15 @@ msgstr ""
msgid "GroupSettings|Allow project access token creation"
msgstr ""
+msgid "GroupSettings|Applied to all subgroups unless overridden by a group owner. Groups already added to the project lose access."
+msgstr ""
+
msgid "GroupSettings|Auto DevOps pipeline was updated for the group"
msgstr ""
+msgid "GroupSettings|Available only on the top-level group. Applies to all subgroups. Groups already shared with a group outside %{group} are still shared unless removed manually."
+msgstr ""
+
msgid "GroupSettings|Badges"
msgstr ""
@@ -16196,6 +16441,9 @@ msgstr ""
msgid "GroupSettings|New runners registration token has been generated!"
msgstr ""
+msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgstr ""
+
msgid "GroupSettings|Pipeline settings was updated for the group"
msgstr ""
@@ -16208,12 +16456,15 @@ msgstr ""
msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
-msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups."
+msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups"
msgstr ""
msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
msgstr ""
+msgid "GroupSettings|Prevents group members from being notified if the group is mentioned."
+msgstr ""
+
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
msgstr ""
@@ -16250,21 +16501,6 @@ msgstr ""
msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}."
msgstr ""
-msgid "GroupSettings|This setting is only available on the top-level group and it applies to all subgroups. Groups that have already been shared with a group outside %{group} will still be shared, and this access will have to be revoked manually."
-msgstr ""
-
-msgid "GroupSettings|This setting will be applied to all subgroups unless overridden by a group owner. Groups that already have access to the project will continue to have access unless removed manually."
-msgstr ""
-
-msgid "GroupSettings|This setting will override user notification preferences for all members of the group, subgroups, and projects."
-msgstr ""
-
-msgid "GroupSettings|This setting will prevent group members from being notified if the group is mentioned."
-msgstr ""
-
-msgid "GroupSettings|This setting will prevent group members from forking projects outside of the group."
-msgstr ""
-
msgid "GroupSettings|Transfer group"
msgstr ""
@@ -16382,7 +16618,7 @@ msgstr ""
msgid "GroupsNew|No import options available"
msgstr ""
-msgid "GroupsNew|Not all related objects are migrated, as %{docs_link_start}described here%{docs_link_end}. Please %{feedback_link_start}leave feedback%{feedback_link_end} on this feature."
+msgid "GroupsNew|Not all related objects are migrated. %{docs_link_start}More info%{docs_link_end}."
msgstr ""
msgid "GroupsNew|Personal access token"
@@ -16514,15 +16750,27 @@ msgstr ""
msgid "Hello %{name},"
msgstr ""
-msgid "Hello there"
-msgstr ""
-
msgid "Hello, %{name}!"
msgstr ""
msgid "Hello, %{username}!"
msgstr ""
+msgid "HelloMessage|%{handshake_emoji} Contribute to GitLab: %{contribute_link}"
+msgstr ""
+
+msgid "HelloMessage|%{magnifier_emoji} Create a new GitLab issue: %{new_issue_link}"
+msgstr ""
+
+msgid "HelloMessage|%{rocket_emoji} We like your curiosity! Help us improve GitLab by joining the team: %{jobs_page_link}"
+msgstr ""
+
+msgid "HelloMessage|Does this page need fixes or improvements? Open an issue or contribute a merge request to help make GitLab more lovable. At GitLab, everyone can contribute!"
+msgstr ""
+
+msgid "HelloMessage|Welcome to GitLab!"
+msgstr ""
+
msgid "Help"
msgstr "Ajuda"
@@ -16532,13 +16780,10 @@ msgstr ""
msgid "Helps prevent bots from creating accounts."
msgstr ""
-msgid "Helps prevent bots from creating issues"
+msgid "Helps prevent bots from creating issues."
msgstr ""
-msgid "Helps prevent malicious users hide their activity"
-msgstr ""
-
-msgid "Helps reduce request volume (e.g. from crawlers or abusive bots)"
+msgid "Helps prevent malicious users hide their activity."
msgstr ""
msgid "Helps reduce request volume (for example, from crawlers or abusive bots)"
@@ -16662,6 +16907,12 @@ msgstr ""
msgid "Housekeeping, export, path, transfer, remove, archive."
msgstr ""
+msgid "How do I configure Akismet?"
+msgstr ""
+
+msgid "How do I configure it?"
+msgstr ""
+
msgid "How do I configure runners?"
msgstr ""
@@ -16683,19 +16934,25 @@ msgstr ""
msgid "How do I set up this service?"
msgstr ""
+msgid "How do I use a web terminal?"
+msgstr ""
+
+msgid "How do I use file templates?"
+msgstr ""
+
msgid "How it works"
msgstr ""
msgid "How many days need to pass between marking entity for deletion and actual removing it."
msgstr ""
-msgid "How many seconds an IP will be counted towards the limit"
+msgid "How many seconds an IP counts toward the IP address limit."
msgstr ""
-msgid "I accept the %{terms_link}"
+msgid "How the job limiter handles jobs exceeding the thresholds specified below. The 'track' mode only logs the jobs. The 'compress' mode compresses the jobs and raises an exception if the compressed size exceeds the limit."
msgstr ""
-msgid "I accept the|Terms of Service and Privacy Policy"
+msgid "I accept the %{terms_link}"
msgstr ""
msgid "I forgot my password"
@@ -16779,13 +17036,16 @@ msgstr ""
msgid "IP Address"
msgstr "Adreça IP"
-msgid "IP expiration time"
+msgid "IP address expiration time"
msgstr ""
-msgid "IP subnet restriction only allowed for top-level groups"
+msgid "IP address restrictions"
+msgstr ""
+
+msgid "IP addresses per user"
msgstr ""
-msgid "IPs per user"
+msgid "IP subnet restriction only allowed for top-level groups"
msgstr ""
msgid "Identifier"
@@ -16800,6 +17060,9 @@ msgstr "Identitats"
msgid "If any indexed field exceeds this limit it will be truncated to this number of characters and the rest will not be indexed or searchable. This does not apply to repository and wiki indexing. Setting this to 0 means it is unlimited."
msgstr ""
+msgid "If blank, defaults to %{code_open}Retry later%{code_close}."
+msgstr ""
+
msgid "If blank, set allowable lifetime to %{instance_level_policy_in_words}, as defined by the instance admin. Once set, existing tokens for users in this group may be revoked."
msgstr ""
@@ -16851,6 +17114,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 did not initiate these sign-in attempts, please reach out to your administrator or enable two-factor authentication (2FA) on your account."
+msgstr ""
+
msgid "If you did not initiate this change, please contact your administrator immediately."
msgstr ""
@@ -16942,10 +17208,10 @@ msgstr ""
msgid "Import Projects from Gitea"
msgstr ""
-msgid "Import a project"
+msgid "Import an exported GitLab project"
msgstr ""
-msgid "Import an exported GitLab project"
+msgid "Import and export rate limits"
msgstr ""
msgid "Import failed due to a GitHub error: %{original}"
@@ -16957,12 +17223,18 @@ msgstr ""
msgid "Import from Jira"
msgstr ""
+msgid "Import group"
+msgstr ""
+
msgid "Import group from file"
msgstr ""
msgid "Import groups"
msgstr ""
+msgid "Import history"
+msgstr ""
+
msgid "Import in progress"
msgstr ""
@@ -17026,7 +17298,25 @@ msgstr ""
msgid "Import timed out. Import took longer than %{import_jobs_expiration} seconds"
msgstr ""
-msgid "Import/Export Rate Limits"
+msgid "ImportAProjectModal|Import from a project"
+msgstr ""
+
+msgid "ImportAProjectModal|Import members from another project"
+msgstr ""
+
+msgid "ImportAProjectModal|Import project members"
+msgstr ""
+
+msgid "ImportAProjectModal|Only project members (not group members) are imported, and they get the same permissions as the project you import from."
+msgstr ""
+
+msgid "ImportAProjectModal|Successfully imported"
+msgstr ""
+
+msgid "ImportAProjectModal|Unable to import project members"
+msgstr ""
+
+msgid "ImportAProjectModal|You're importing members to the %{strongStart}%{name}%{strongEnd} project."
msgstr ""
msgid "ImportButtons|Connect repositories from"
@@ -17079,7 +17369,7 @@ msgstr[1] ""
msgid "Importing..."
msgstr ""
-msgid "Import|A repository URL usually ends in a .git suffix, although this is not required. Double check to make sure your repository URL is correct."
+msgid "Import|There is not a valid Git repository at this URL. If your HTTP repository is not publicly accessible, verify your credentials."
msgstr ""
msgid "Improve customer support with Service Desk"
@@ -17088,9 +17378,6 @@ msgstr ""
msgid "Improves Git cloning performance."
msgstr ""
-msgid "In %{time_to_now}"
-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 ""
@@ -17376,7 +17663,7 @@ msgstr ""
msgid "InProductMarketing|Start a GitLab Ultimate trial today in less than one minute, no credit card required."
msgstr ""
-msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no CC required"
+msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no credit card required"
msgstr ""
msgid "InProductMarketing|Start a trial"
@@ -17415,7 +17702,7 @@ msgstr ""
msgid "InProductMarketing|Team up in GitLab for greater efficiency"
msgstr ""
-msgid "InProductMarketing|Team work makes the dream work"
+msgid "InProductMarketing|Team work makes the dream work"
msgstr ""
msgid "InProductMarketing|Test, create, deploy"
@@ -17996,6 +18283,9 @@ msgstr ""
msgid "Integrations|Create new issue in Jira"
msgstr ""
+msgid "Integrations|Create new issue in ZenTao"
+msgstr ""
+
msgid "Integrations|Default settings are inherited from the group level."
msgstr ""
@@ -18089,9 +18379,15 @@ msgstr ""
msgid "Integrations|Search Jira issues"
msgstr ""
+msgid "Integrations|Search ZenTao issues"
+msgstr ""
+
msgid "Integrations|Send notifications about project events to Unify Circuit."
msgstr ""
+msgid "Integrations|Send notifications about project events to a Unify Circuit conversation. %{docs_link}"
+msgstr ""
+
msgid "Integrations|Sign in to add namespaces"
msgstr ""
@@ -18131,6 +18427,9 @@ msgstr ""
msgid "Integrations|You've activated every integration 🎉"
msgstr ""
+msgid "Integrations|ZenTao issues display here when you create issues in your project in ZenTao."
+msgstr ""
+
msgid "Interactive mode"
msgstr ""
@@ -18158,9 +18457,6 @@ msgstr ""
msgid "Interval Pattern"
msgstr ""
-msgid "Introducing Value Stream Analytics"
-msgstr ""
-
msgid "Introducing Your DevOps Report"
msgstr ""
@@ -18257,6 +18553,12 @@ msgstr ""
msgid "Investigate vulnerability: %{title}"
msgstr ""
+msgid "Invisible Captcha"
+msgstr ""
+
+msgid "Invisible Captcha helps prevent the creation of spam accounts. It adds a honeypot field and time-sensitive form submission to the account signup form."
+msgstr ""
+
msgid "Invitation"
msgstr ""
@@ -18710,12 +19012,18 @@ msgstr ""
msgid "Issues"
msgstr ""
+msgid "Issues I've created"
+msgstr ""
+
msgid "Issues Rate Limits"
msgstr ""
msgid "Issues and merge requests"
msgstr ""
+msgid "Issues assigned to me"
+msgstr ""
+
msgid "Issues can be bugs, tasks or ideas to be discussed. Also, issues are searchable and filterable."
msgstr ""
@@ -18827,7 +19135,7 @@ msgstr ""
msgid "Iterations|Create cadence"
msgstr ""
-msgid "Iterations|Create your first iteration"
+msgid "Iterations|Create iteration"
msgstr ""
msgid "Iterations|Delete cadence"
@@ -18836,6 +19144,9 @@ msgstr ""
msgid "Iterations|Delete iteration cadence?"
msgstr ""
+msgid "Iterations|Delete iteration?"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -18869,12 +19180,18 @@ msgstr ""
msgid "Iterations|New iteration cadence"
msgstr ""
+msgid "Iterations|No closed iterations."
+msgstr ""
+
msgid "Iterations|No iteration cadences to show."
msgstr ""
msgid "Iterations|No iterations in cadence."
msgstr ""
+msgid "Iterations|No open iterations."
+msgstr ""
+
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
@@ -18905,6 +19222,9 @@ msgstr ""
msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
msgstr ""
+msgid "Iterations|This will remove the iteration from any issues that are assigned to it."
+msgstr ""
+
msgid "Iterations|Title"
msgstr ""
@@ -18920,15 +19240,9 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "I’m familiar with the basics of DevOps."
-msgstr ""
-
msgid "I’m joining my team who’s already on GitLab"
msgstr ""
-msgid "I’m not familiar with the basics of DevOps."
-msgstr ""
-
msgid "Jaeger URL"
msgstr ""
@@ -19193,6 +19507,9 @@ msgstr ""
msgid "Job"
msgstr ""
+msgid "Job %{jobName}"
+msgstr ""
+
msgid "Job Failed #%{build_id}"
msgstr ""
@@ -19783,9 +20100,6 @@ msgstr ""
msgid "Learn more in the"
msgstr ""
-msgid "Learn more in the|pipeline schedules documentation"
-msgstr ""
-
msgid "Learn more."
msgstr ""
@@ -19897,9 +20211,6 @@ msgstr ""
msgid "Leave Admin Mode"
msgstr ""
-msgid "Leave blank for no limit. Once set, existing personal access tokens may be revoked."
-msgstr ""
-
msgid "Leave edit mode? All unsaved changes will be lost."
msgstr ""
@@ -19945,10 +20256,10 @@ msgstr ""
msgid "LicenseCompliance|Acceptable license to be used in the project"
msgstr ""
-msgid "LicenseCompliance|Add a license"
+msgid "LicenseCompliance|Add license and related policy"
msgstr ""
-msgid "LicenseCompliance|Add license and related policy"
+msgid "LicenseCompliance|Add license policy"
msgstr ""
msgid "LicenseCompliance|Allow"
@@ -20038,6 +20349,9 @@ msgstr ""
msgid "LicenseManagement|Uncategorized"
msgstr ""
+msgid "Licensed Enterprise Edition features can be used if the project namespace's plan includes the feature, or if the project is public."
+msgstr ""
+
msgid "Licensed Features"
msgstr ""
@@ -20104,7 +20418,10 @@ msgstr ""
msgid "Limit namespaces and projects that can be indexed"
msgstr ""
-msgid "Limit sign in from multiple ips"
+msgid "Limit project size at a global, group, and project level. %{link_start}Learn more%{link_end}."
+msgstr ""
+
+msgid "Limit sign in from multiple IP addresses"
msgstr ""
msgid "Limit the number of concurrent operations this secondary site can run in the background."
@@ -20116,11 +20433,17 @@ msgstr ""
msgid "Limit the number of issues and epics per minute a user can create through web and API requests."
msgstr ""
+msgid "Limit the size of Sidekiq jobs stored in Redis."
+msgstr ""
+
msgid "Limited to showing %d event at most"
msgid_plural "Limited to showing %d events at most"
msgstr[0] ""
msgstr[1] ""
+msgid "Limiting mode"
+msgstr ""
+
msgid "Line changes"
msgstr ""
@@ -20190,9 +20513,6 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
-msgid "List of users to be excluded from the limit"
-msgstr ""
-
msgid "List options"
msgstr ""
@@ -20232,9 +20552,6 @@ msgstr ""
msgid "Loading functions timed out. Please reload the page to try again."
msgstr ""
-msgid "Loading issues"
-msgstr ""
-
msgid "Loading more"
msgstr ""
@@ -20526,6 +20843,9 @@ msgstr ""
msgid "Marked For Deletion At - %{deletion_time}"
msgstr ""
+msgid "Marked as ready. Merging is now allowed."
+msgstr ""
+
msgid "Marked this %{noun} as a draft."
msgstr ""
@@ -20598,52 +20918,22 @@ msgstr ""
msgid "Max 100,000 events"
msgstr ""
-msgid "Max 20 characters"
-msgstr ""
-
-msgid "Max Group Export Download requests per minute per user"
-msgstr ""
-
-msgid "Max Group Export requests per minute per user"
-msgstr ""
-
-msgid "Max Group Import requests per minute per user"
-msgstr ""
-
-msgid "Max Project Export Download requests per minute per user"
-msgstr ""
-
-msgid "Max Project Export requests per minute per user"
-msgstr ""
-
-msgid "Max Project Import requests per minute per user"
-msgstr ""
-
-msgid "Max authenticated API requests per period per user"
-msgstr ""
-
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
-msgid "Max authenticated web requests per period per user"
-msgstr ""
-
msgid "Max file size is 200 KB."
msgstr ""
-msgid "Max requests per minute per user"
-msgstr ""
-
msgid "Max role"
msgstr ""
msgid "Max session time"
msgstr ""
-msgid "Max unauthenticated requests per period per IP"
+msgid "MaxBuilds"
msgstr ""
-msgid "MaxBuilds"
+msgid "Maximum 20 characters"
msgstr ""
msgid "Maximum Conan package file size in bytes"
@@ -20679,6 +20969,12 @@ msgstr ""
msgid "Maximum attachment size (MB)"
msgstr ""
+msgid "Maximum authenticated API requests per rate limit period per user"
+msgstr ""
+
+msgid "Maximum authenticated web requests per rate limit period per user"
+msgstr ""
+
msgid "Maximum bulk request size (MiB)"
msgstr ""
@@ -20724,6 +21020,15 @@ msgstr ""
msgid "Maximum files in a diff"
msgstr ""
+msgid "Maximum group export download requests per minute"
+msgstr ""
+
+msgid "Maximum group export requests per minute"
+msgstr ""
+
+msgid "Maximum group import requests per minute"
+msgstr ""
+
msgid "Maximum import size"
msgstr ""
@@ -20760,7 +21065,7 @@ msgstr ""
msgid "Maximum number of projects."
msgstr ""
-msgid "Maximum number of unique IPs per user"
+msgid "Maximum number of unique IP addresses per user."
msgstr ""
msgid "Maximum page reached"
@@ -20769,12 +21074,24 @@ msgstr ""
msgid "Maximum page size"
msgstr ""
+msgid "Maximum project export download requests per minute"
+msgstr ""
+
+msgid "Maximum project export requests per minute"
+msgstr ""
+
+msgid "Maximum project import requests per minute"
+msgstr ""
+
msgid "Maximum push size"
msgstr ""
msgid "Maximum push size (MB)"
msgstr ""
+msgid "Maximum requests per minute"
+msgstr ""
+
msgid "Maximum running slices"
msgstr ""
@@ -20802,10 +21119,16 @@ msgstr ""
msgid "Maximum time between updates that a mirror can have when scheduled to synchronize."
msgstr ""
-msgid "Maximum time for web terminal websocket connection (in seconds). 0 for unlimited."
+msgid "Maximum time that users are allowed to skip the setup of two-factor authentication (in hours). Set to 0 (zero) to enforce at next sign in."
msgstr ""
-msgid "Maximum time that users are allowed to skip the setup of two-factor authentication (in hours). Set to 0 (zero) to enforce at next sign in."
+msgid "Maximum time, in seconds, for a web terminal websocket connection. 0 for unlimited."
+msgstr ""
+
+msgid "Maximum unauthenticated API requests per rate limit period per IP"
+msgstr ""
+
+msgid "Maximum unauthenticated web requests per rate limit period per IP"
msgstr ""
msgid "May"
@@ -20823,9 +21146,6 @@ msgstr ""
msgid "Medium vulnerabilities present"
msgstr ""
-msgid "Member lock"
-msgstr ""
-
msgid "Member since"
msgstr ""
@@ -20862,6 +21182,9 @@ msgstr ""
msgid "Members of a group may only view projects they have permission to access"
msgstr ""
+msgid "Membership"
+msgstr ""
+
msgid "Members|%{time} by %{user}"
msgstr ""
@@ -20922,9 +21245,6 @@ msgstr ""
msgid "Members|Expiration date updated successfully."
msgstr ""
-msgid "Members|Expired"
-msgstr ""
-
msgid "Members|Filter members"
msgstr ""
@@ -20940,9 +21260,6 @@ msgstr ""
msgid "Members|Membership"
msgstr ""
-msgid "Members|No expiration set"
-msgstr ""
-
msgid "Members|Remove \"%{groupName}\""
msgstr ""
@@ -20964,9 +21281,6 @@ msgstr ""
msgid "Members|Search invited"
msgstr ""
-msgid "Members|in %{time}"
-msgstr ""
-
msgid "Member|Deny access"
msgstr ""
@@ -21042,9 +21356,6 @@ msgstr "Petició de fusió"
msgid "Merge request %{mr_link} was reviewed by %{mr_author}"
msgstr ""
-msgid "Merge request (MR) approvals"
-msgstr ""
-
msgid "Merge request analytics"
msgstr ""
@@ -21066,12 +21377,21 @@ msgstr ""
msgid "Merge requests"
msgstr "Peticions de fusió"
+msgid "Merge requests I've created"
+msgstr ""
+
msgid "Merge requests are a place to propose changes you've made to a project and discuss those changes with others"
msgstr ""
msgid "Merge requests are read-only in a secondary Geo node"
msgstr ""
+msgid "Merge requests assigned to me"
+msgstr ""
+
+msgid "Merge requests that I'm a reviewer"
+msgstr ""
+
msgid "Merge the branch and fix any conflicts that come up"
msgstr ""
@@ -21132,10 +21452,10 @@ msgstr ""
msgid "MergeRequests|An error occurred while saving the draft comment."
msgstr ""
-msgid "MergeRequests|Failed to squash. Should be done manually."
+msgid "MergeRequests|Create issue to resolve thread"
msgstr ""
-msgid "MergeRequests|Resolve this thread in a new issue"
+msgid "MergeRequests|Failed to squash. Should be done manually."
msgstr ""
msgid "MergeRequests|Saving the comment failed"
@@ -21949,6 +22269,9 @@ msgstr ""
msgid "MoveIssue|Cannot move issue to project it originates from!"
msgstr ""
+msgid "MoveIssue|Cannot move issues of '%{issue_type}' type."
+msgstr ""
+
msgid "Moved issue to %{label} column in the board."
msgstr ""
@@ -22074,6 +22397,15 @@ 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. To learn more about reducing storage capacity please visit our docs."
msgstr ""
+msgid "NamespaceUserCap|Pending users must be reviewed and approved by a group owner. Learn more about %{user_caps_link_start}User Caps%{link_end} and %{users_pending_approval_link_start}Users Pending Approval%{link_end}."
+msgstr ""
+
+msgid "NamespaceUserCap|View pending user approvals"
+msgstr ""
+
+msgid "NamespaceUserCap|Your group has reached its billable member limit"
+msgstr ""
+
msgid "Namespaces"
msgstr ""
@@ -22116,9 +22448,6 @@ msgstr ""
msgid "Network"
msgstr "Xarxa"
-msgid "Network Policy|New rule"
-msgstr ""
-
msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is inbound from a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
msgstr ""
@@ -22140,16 +22469,13 @@ msgstr ""
msgid "NetworkPolicies|%{strongOpen}any%{strongClose} port"
msgstr ""
-msgid "NetworkPolicies|+ Add alert"
-msgstr ""
-
msgid "NetworkPolicies|.yaml"
msgstr ""
msgid "NetworkPolicies|.yaml mode"
msgstr ""
-msgid "NetworkPolicies|Actions"
+msgid "NetworkPolicies|Add alert"
msgstr ""
msgid "NetworkPolicies|Alerts are intended to be selectively used for a limited number of events that are potentially concerning and warrant a manual review. Alerts should not be used as a substitute for a SIEM or a logging tool. High volume alerts are likely to be dropped so as to preserve the stability of GitLab's integration with Kubernetes."
@@ -22185,9 +22511,6 @@ msgstr ""
msgid "NetworkPolicies|Deny all traffic"
msgstr ""
-msgid "NetworkPolicies|Description"
-msgstr ""
-
msgid "NetworkPolicies|Edit policy"
msgstr ""
@@ -22200,9 +22523,6 @@ msgstr ""
msgid "NetworkPolicies|IP/subnet"
msgstr ""
-msgid "NetworkPolicies|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
-msgstr ""
-
msgid "NetworkPolicies|Invalid or empty policy"
msgstr ""
@@ -22212,19 +22532,16 @@ msgstr ""
msgid "NetworkPolicies|Kubernetes error: %{error}"
msgstr ""
-msgid "NetworkPolicies|Name"
-msgstr ""
-
msgid "NetworkPolicies|Network"
msgstr ""
-msgid "NetworkPolicies|Network traffic"
+msgid "NetworkPolicies|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
msgstr ""
-msgid "NetworkPolicies|New policy"
+msgid "NetworkPolicies|Network policy can be created after the environment is loaded successfully."
msgstr ""
-msgid "NetworkPolicies|No policies detected"
+msgid "NetworkPolicies|Network traffic"
msgstr ""
msgid "NetworkPolicies|None selected"
@@ -22233,21 +22550,12 @@ msgstr ""
msgid "NetworkPolicies|Please %{installLinkStart}install%{installLinkEnd} and %{configureLinkStart}configure a Kubernetes Agent for this project%{configureLinkEnd} to enable alerts."
msgstr ""
-msgid "NetworkPolicies|Policies are a specification of how groups of pods are allowed to communicate with each other's network endpoints."
-msgstr ""
-
msgid "NetworkPolicies|Policy %{policyName} was successfully changed"
msgstr ""
msgid "NetworkPolicies|Policy definition"
msgstr ""
-msgid "NetworkPolicies|Policy editor"
-msgstr ""
-
-msgid "NetworkPolicies|Policy preview"
-msgstr ""
-
msgid "NetworkPolicies|Rule"
msgstr ""
@@ -22257,9 +22565,6 @@ msgstr ""
msgid "NetworkPolicies|Rule mode is unavailable for this policy. In some cases, we cannot parse the YAML file back into the rules editor."
msgstr ""
-msgid "NetworkPolicies|Rules"
-msgstr ""
-
msgid "NetworkPolicies|Save changes"
msgstr ""
@@ -22272,9 +22577,6 @@ msgstr ""
msgid "NetworkPolicies|Traffic that does not match any rule will be blocked."
msgstr ""
-msgid "NetworkPolicies|Unable to parse policy"
-msgstr ""
-
msgid "NetworkPolicies|all DNS names"
msgstr ""
@@ -22454,6 +22756,9 @@ msgstr ""
msgid "New issue"
msgstr ""
+msgid "New issue in %{project}"
+msgstr ""
+
msgid "New issue title"
msgstr ""
@@ -22532,7 +22837,7 @@ msgstr ""
msgid "Newest first"
msgstr ""
-msgid "Newly registered users will by default be external"
+msgid "Newly-registered users are external by default"
msgstr ""
msgid "Next"
@@ -22847,8 +23152,10 @@ msgstr ""
msgid "No webhooks found, add one in the form above."
msgstr ""
-msgid "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} to renew your subscription."
-msgstr ""
+msgid "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} day to renew your subscription."
+msgid_plural "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} days to renew your subscription."
+msgstr[0] ""
+msgstr[1] ""
msgid "No. of commits"
msgstr ""
@@ -22865,7 +23172,7 @@ msgstr ""
msgid "Nodes"
msgstr ""
-msgid "Non-admin users can sign in with read-only access and make read-only API requests."
+msgid "Non-admin users are restricted to read-only access, in both GitLab UI and API."
msgstr ""
msgid "None"
@@ -22946,7 +23253,7 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
-msgid "Notes Rate Limits"
+msgid "Notes rate limit"
msgstr ""
msgid "Notes|Are you sure you want to cancel creating this comment?"
@@ -23113,9 +23420,6 @@ msgstr ""
msgid "November"
msgstr ""
-msgid "Novice"
-msgstr ""
-
msgid "Now, personalize your GitLab experience"
msgstr ""
@@ -23284,7 +23588,7 @@ msgstr ""
msgid "OnCallSchedules|For this rotation, on-call will be:"
msgstr ""
-msgid "OnCallSchedules|On-call schedule %{schedule} in Project %{project}"
+msgid "OnCallSchedules|On-call schedule %{obstacle} in Project %{project}"
msgstr ""
msgid "OnCallSchedules|On-call schedules"
@@ -23431,22 +23735,22 @@ msgstr ""
msgid "OnDemandScans|Scanner profile"
msgstr ""
-msgid "OnDemandScans|Select one of the existing profiles"
+msgid "OnDemandScans|Schedule scan"
msgstr ""
-msgid "OnDemandScans|Site profile"
+msgid "OnDemandScans|Select one of the existing profiles"
msgstr ""
-msgid "OnDemandScans|Use existing scanner profile"
+msgid "OnDemandScans|Site profile"
msgstr ""
-msgid "OnDemandScans|Use existing site profile"
+msgid "OnDemandScans|Start time"
msgstr ""
-msgid "OnDemandScans|You can either choose a passive scan or validate the target site in your chosen site profile. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
+msgid "OnDemandScans|Use existing scanner profile"
msgstr ""
-msgid "OnDemandScans|You cannot run an active scan against an unvalidated site."
+msgid "OnDemandScans|Use existing site profile"
msgstr ""
msgid "OnDemandScans|You must create a repository within your project to run an on-demand scan."
@@ -23511,6 +23815,9 @@ msgstr ""
msgid "Only admins can delete project"
msgstr ""
+msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
+msgstr ""
+
msgid "Only include features new to your current subscription tier."
msgstr ""
@@ -23529,6 +23836,12 @@ msgstr ""
msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
+msgid "Only reCAPTCHA v2 is supported:"
+msgstr ""
+
+msgid "Only users from the specified IP address ranges are able to reach this group, including all subgroups, projects, and Git repositories."
+msgstr ""
+
msgid "Only verified users with an email address in any of these domains can be added to the group."
msgstr ""
@@ -23715,9 +24028,6 @@ msgstr ""
msgid "Package Registry"
msgstr ""
-msgid "Package Registry Rate Limits"
-msgstr ""
-
msgid "Package Registry: authenticated API requests"
msgstr ""
@@ -23736,6 +24046,9 @@ msgstr ""
msgid "Package recipe already exists"
msgstr ""
+msgid "Package registry rate limits"
+msgstr ""
+
msgid "Package type"
msgstr ""
@@ -23802,6 +24115,9 @@ msgstr ""
msgid "PackageRegistry|Composer"
msgstr ""
+msgid "PackageRegistry|Composer.json with license: %{license} and version: %{version}"
+msgstr ""
+
msgid "PackageRegistry|Conan"
msgstr ""
@@ -23865,6 +24181,9 @@ msgstr ""
msgid "PackageRegistry|Copy require package include"
msgstr ""
+msgid "PackageRegistry|Copy target SHA"
+msgstr ""
+
msgid "PackageRegistry|Copy yarn command"
msgstr ""
@@ -23931,6 +24250,9 @@ msgstr ""
msgid "PackageRegistry|Install package version"
msgstr ""
+msgid "PackageRegistry|Instance-level"
+msgstr ""
+
msgid "PackageRegistry|Invalid Package: failed metadata extraction"
msgstr ""
@@ -23976,6 +24298,9 @@ msgstr ""
msgid "PackageRegistry|Pip Command"
msgstr ""
+msgid "PackageRegistry|Project-level"
+msgstr ""
+
msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
msgstr ""
@@ -23997,6 +24322,9 @@ msgstr ""
msgid "PackageRegistry|Remove package"
msgstr ""
+msgid "PackageRegistry|Required Python: %{pythonVersion}"
+msgstr ""
+
msgid "PackageRegistry|RubyGems"
msgstr ""
@@ -24039,6 +24367,9 @@ msgstr ""
msgid "PackageRegistry|Source project located at %{link}"
msgstr ""
+msgid "PackageRegistry|Target SHA: %{sha}"
+msgstr ""
+
msgid "PackageRegistry|There are no other versions of this package."
msgstr ""
@@ -24207,6 +24538,18 @@ msgstr ""
msgid "Password was successfully updated. Please sign in again."
msgstr ""
+msgid "PasswordPrompt|Confirm password"
+msgstr ""
+
+msgid "PasswordPrompt|Confirm password to continue"
+msgstr ""
+
+msgid "PasswordPrompt|Password is required"
+msgstr ""
+
+msgid "PasswordPrompt|Please enter your password to confirm"
+msgstr ""
+
msgid "Passwords should be unique and not used for any other sites or services."
msgstr ""
@@ -24234,6 +24577,9 @@ msgstr ""
msgid "Paste project path (i.e. gitlab-org/gitlab)"
msgstr ""
+msgid "Paste this DSN into your Sentry SDK"
+msgstr ""
+
msgid "Paste your public SSH key, which is usually contained in the file '~/.ssh/id_ed25519.pub' or '~/.ssh/id_rsa.pub' and begins with 'ssh-ed25519' or 'ssh-rsa'. Do not paste your private SSH key, as that can compromise your identity."
msgstr ""
@@ -24318,6 +24664,9 @@ msgstr ""
msgid "PerformanceBar|First Contentful Paint"
msgstr ""
+msgid "PerformanceBar|Flamegraph with mode:"
+msgstr ""
+
msgid "PerformanceBar|Frontend resources"
msgstr ""
@@ -24351,6 +24700,15 @@ msgstr ""
msgid "PerformanceBar|Trace"
msgstr ""
+msgid "PerformanceBar|cpu"
+msgstr ""
+
+msgid "PerformanceBar|object"
+msgstr ""
+
+msgid "PerformanceBar|wall"
+msgstr ""
+
msgid "Period in seconds"
msgstr ""
@@ -24579,6 +24937,48 @@ msgstr ""
msgid "PipelineSchedules|Variables"
msgstr ""
+msgid "PipelineSource|API"
+msgstr ""
+
+msgid "PipelineSource|Chat"
+msgstr ""
+
+msgid "PipelineSource|External"
+msgstr ""
+
+msgid "PipelineSource|External Pull Request"
+msgstr ""
+
+msgid "PipelineSource|Merge Request"
+msgstr ""
+
+msgid "PipelineSource|On-Demand DAST Scan"
+msgstr ""
+
+msgid "PipelineSource|On-Demand DAST Validation"
+msgstr ""
+
+msgid "PipelineSource|Parent Pipeline"
+msgstr ""
+
+msgid "PipelineSource|Pipeline"
+msgstr ""
+
+msgid "PipelineSource|Push"
+msgstr ""
+
+msgid "PipelineSource|Schedule"
+msgstr ""
+
+msgid "PipelineSource|Trigger"
+msgstr ""
+
+msgid "PipelineSource|Web"
+msgstr ""
+
+msgid "PipelineSource|Web IDE"
+msgstr ""
+
msgid "PipelineStatusTooltip|Pipeline: %{ciStatus}"
msgstr ""
@@ -24879,46 +25279,7 @@ msgstr ""
msgid "Pipeline|Source"
msgstr ""
-msgid "Pipeline|Source|API"
-msgstr ""
-
-msgid "Pipeline|Source|Chat"
-msgstr ""
-
-msgid "Pipeline|Source|External"
-msgstr ""
-
-msgid "Pipeline|Source|External Pull Request"
-msgstr ""
-
-msgid "Pipeline|Source|Merge Request"
-msgstr ""
-
-msgid "Pipeline|Source|On-Demand DAST Scan"
-msgstr ""
-
-msgid "Pipeline|Source|On-Demand DAST Validation"
-msgstr ""
-
-msgid "Pipeline|Source|Parent Pipeline"
-msgstr ""
-
-msgid "Pipeline|Source|Pipeline"
-msgstr ""
-
-msgid "Pipeline|Source|Push"
-msgstr ""
-
-msgid "Pipeline|Source|Schedule"
-msgstr ""
-
-msgid "Pipeline|Source|Trigger"
-msgstr ""
-
-msgid "Pipeline|Source|Web"
-msgstr ""
-
-msgid "Pipeline|Source|Web IDE"
+msgid "Pipeline|Source|Security Policy"
msgstr ""
msgid "Pipeline|Specify variable values to be used in this run. The values specified in %{linkStart}CI/CD settings%{linkEnd} will be used by default."
@@ -24969,7 +25330,7 @@ msgstr ""
msgid "Pipeline|We are currently unable to fetch pipeline data"
msgstr ""
-msgid "Pipeline|You’re about to stop pipeline %{pipelineId}."
+msgid "Pipeline|You’re about to stop pipeline #%{pipelineId}."
msgstr ""
msgid "Pipeline|for"
@@ -24996,6 +25357,9 @@ msgstr ""
msgid "Plain diff"
msgstr ""
+msgid "Plain-text response to send to clients that hit a rate limit"
+msgstr ""
+
msgid "Plan:"
msgstr ""
@@ -25140,9 +25504,6 @@ msgstr ""
msgid "Please provide attributes to update"
msgstr ""
-msgid "Please provide your username or email address."
-msgstr ""
-
msgid "Please reach out if you have any questions and we'll be happy to assist."
msgstr ""
@@ -25185,9 +25546,6 @@ msgstr ""
msgid "Please set a new password before proceeding."
msgstr ""
-msgid "Please share your feedback about %{featureName} %{linkStart}in this issue%{linkEnd} to help us improve the experience."
-msgstr ""
-
msgid "Please solve the captcha"
msgstr ""
@@ -25365,6 +25723,9 @@ msgstr ""
msgid "Prevent adding new members to project membership within this group"
msgstr ""
+msgid "Prevent auto-stopping"
+msgstr ""
+
msgid "Prevent editing approval rules in projects and merge requests."
msgstr ""
@@ -25377,7 +25738,7 @@ msgstr ""
msgid "Prevent users from changing their profile name"
msgstr ""
-msgid "Prevent users from performing write operations on GitLab while performing maintenance."
+msgid "Prevent users from performing write operations while GitLab maintenance is in progress."
msgstr ""
msgid "Preview"
@@ -25650,6 +26011,9 @@ msgstr ""
msgid "Profiles|Enter your name, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Enter your password to confirm the email change"
+msgstr ""
+
msgid "Profiles|Enter your pronouns to let people know how to refer to you"
msgstr ""
@@ -25884,10 +26248,10 @@ msgstr ""
msgid "Profiles|e.g. My MacBook key"
msgstr ""
-msgid "Profiles|username"
+msgid "Profiles|https://website.com"
msgstr ""
-msgid "Profiles|website.com"
+msgid "Profiles|username"
msgstr ""
msgid "Profiles|your account"
@@ -26130,9 +26494,21 @@ msgstr ""
msgid "ProjectSelect| or group"
msgstr ""
+msgid "ProjectSelect|No matching results"
+msgstr ""
+
msgid "ProjectSelect|Search for project"
msgstr ""
+msgid "ProjectSelect|Search projects"
+msgstr ""
+
+msgid "ProjectSelect|Select a project"
+msgstr ""
+
+msgid "ProjectSelect|There was an error fetching the projects. Please try again."
+msgstr ""
+
msgid "ProjectService|Drone server URL"
msgstr ""
@@ -26220,6 +26596,9 @@ msgstr ""
msgid "ProjectService|Trigger event when a new, unique alert is recorded."
msgstr ""
+msgid "ProjectService|Trigger event when a new, unique vulnerability is recorded. (Note: This feature requires an Ultimate plan.)"
+msgstr ""
+
msgid "ProjectService|Trigger event when a pipeline status changes."
msgstr ""
@@ -26634,9 +27013,15 @@ msgstr ""
msgid "Projects are graded based on the highest severity vulnerability present"
msgstr ""
+msgid "Projects are organized into groups"
+msgstr ""
+
msgid "Projects contributed to"
msgstr ""
+msgid "Projects help you organize your work. They contain your file repository, issues, merge requests, and so much more."
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr ""
@@ -26871,10 +27256,10 @@ msgstr ""
msgid "PrometheusService|Prometheus cluster integration"
msgstr ""
-msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
+msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
msgstr ""
-msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
+msgid "PrometheusService|The ID of the IAP-secured resource."
msgstr ""
msgid "PrometheusService|The Prometheus API base URL."
@@ -27492,6 +27877,9 @@ msgstr ""
msgid "Rate limit"
msgstr ""
+msgid "Rate limits can help reduce request volume (like from crawlers or abusive bots)."
+msgstr ""
+
msgid "Raw blob request rate limit per minute"
msgstr ""
@@ -27504,6 +27892,9 @@ msgstr ""
msgid "Re-authentication required"
msgstr ""
+msgid "Re-import"
+msgstr ""
+
msgid "Re-request review"
msgstr ""
@@ -27525,6 +27916,9 @@ msgstr ""
msgid "Read more about related issues"
msgstr ""
+msgid "Read their documentation."
+msgstr ""
+
msgid "Ready to get started with GitLab? Follow these steps to set up your workspace, plan and commit changes, and deploy your project."
msgstr ""
@@ -27558,6 +27952,9 @@ msgstr ""
msgid "Receive any notifications from GitLab."
msgstr ""
+msgid "Receive notification of abuse reports by email."
+msgstr ""
+
msgid "Receive notifications about your own activity"
msgstr ""
@@ -27701,9 +28098,6 @@ msgstr ""
msgid "Registry setup"
msgstr ""
-msgid "Regulate approvals by authors/committers. Affects all projects."
-msgstr ""
-
msgid "Reindexing Status: %{status} (Slice multiplier: %{multiplier}, Maximum running slices: %{max_slices})"
msgstr ""
@@ -27799,6 +28193,9 @@ msgstr ""
msgid "Release|Something went wrong while saving the release details."
msgstr ""
+msgid "Reload page"
+msgstr ""
+
msgid "Remediations"
msgstr ""
@@ -28081,6 +28478,9 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
+msgid "Repeats"
+msgstr ""
+
msgid "Replace"
msgstr ""
@@ -28443,10 +28843,7 @@ msgstr ""
msgid "Require additional authentication for administrative tasks."
msgstr ""
-msgid "Require all users in this group to setup Two-factor authentication"
-msgstr ""
-
-msgid "Require all users in this group to setup two-factor authentication"
+msgid "Require all users in this group to set up two-factor authentication"
msgstr ""
msgid "Required approvals (%{approvals_given} given)"
@@ -28492,6 +28889,9 @@ msgstr[1] ""
msgid "Requires values to meet regular expression requirements."
msgstr ""
+msgid "Requires you to deploy or set up cloud-hosted Sentry."
+msgstr ""
+
msgid "Requires your primary GitLab email address."
msgstr ""
@@ -28552,9 +28952,6 @@ msgstr ""
msgid "Resolve"
msgstr ""
-msgid "Resolve all threads in new issue"
-msgstr ""
-
msgid "Resolve conflicts"
msgstr ""
@@ -28612,6 +29009,9 @@ msgstr ""
msgid "Response text"
msgstr ""
+msgid "Restart GitLab to apply changes."
+msgstr ""
+
msgid "Restart Terminal"
msgstr ""
@@ -28630,6 +29030,9 @@ msgstr ""
msgid "Restoring the project will prevent the project from being removed on this date and restore people's ability to make changes to it."
msgstr ""
+msgid "Restrict group access by IP address. %{link_start}Learn more%{link_end}."
+msgstr ""
+
msgid "Restrict membership by email domain"
msgstr ""
@@ -28943,6 +29346,9 @@ msgstr ""
msgid "Runners|Runner #%{runner_id}"
msgstr ""
+msgid "Runners|Runner assigned to project."
+msgstr ""
+
msgid "Runners|Runner is offline, last contact was %{runner_contact} ago"
msgstr ""
@@ -28955,6 +29361,9 @@ msgstr ""
msgid "Runners|Runner registration"
msgstr ""
+msgid "Runners|Runner unassigned from project."
+msgstr ""
+
msgid "Runners|Runners"
msgstr ""
@@ -29147,7 +29556,7 @@ msgstr ""
msgid "SastEntryPoints|How do I set up SAST?"
msgstr ""
-msgid "SastEntryPoints|Learn more."
+msgid "SastEntryPoints|Learn more"
msgstr ""
msgid "Satisfied"
@@ -29189,7 +29598,7 @@ msgstr ""
msgid "Save pipeline schedule"
msgstr ""
-msgid "Save space and find images in the container Registry. remove unneeded tags and keep only the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
+msgid "Save storage space by automatically deleting tags from the container registry and keeping the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
msgstr ""
msgid "Saving"
@@ -29363,6 +29772,9 @@ msgstr ""
msgid "Search or filter results…"
msgstr ""
+msgid "Search or jump to..."
+msgstr ""
+
msgid "Search project"
msgstr ""
@@ -29423,16 +29835,16 @@ msgstr ""
msgid "SearchCodeResults|of %{link_to_project}"
msgstr ""
-msgid "SearchResults|Showing %{count} %{scope} for%{term_element}"
+msgid "SearchResults|Showing %{count} %{scope} for %{term_element}"
msgstr ""
-msgid "SearchResults|Showing %{count} %{scope} for%{term_element} in your personal and project snippets"
+msgid "SearchResults|Showing %{count} %{scope} for %{term_element} in your personal and project snippets"
msgstr ""
-msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for%{term_element}"
+msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for %{term_element}"
msgstr ""
-msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for%{term_element} in your personal and project snippets"
+msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for %{term_element} in your personal and project snippets"
msgstr ""
msgid "SearchResults|code result"
@@ -29514,6 +29926,9 @@ msgstr ""
msgid "Secret Detection"
msgstr ""
+msgid "Secret access key"
+msgstr ""
+
msgid "Secret token"
msgstr ""
@@ -29553,9 +29968,6 @@ msgstr ""
msgid "SecurityApprovals|A merge request approval is required when the license compliance report contains a denied license."
msgstr ""
-msgid "SecurityApprovals|Configurable if security scanners are enabled. %{linkStart}Learn more.%{linkEnd}"
-msgstr ""
-
msgid "SecurityApprovals|Coverage-Check"
msgstr ""
@@ -29568,24 +29980,18 @@ msgstr ""
msgid "SecurityApprovals|Learn more about Vulnerability-Check"
msgstr ""
-msgid "SecurityApprovals|License Scanning must be enabled. %{linkStart}Learn more%{linkEnd}."
-msgstr ""
-
msgid "SecurityApprovals|License-Check"
msgstr ""
msgid "SecurityApprovals|Requires approval for Denied licenses. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}More information%{linkEnd}"
+msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "SecurityApprovals|Requires approval for vulnerabilities. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
-msgid "SecurityApprovals|Test coverage must be enabled. %{linkStart}Learn more%{linkEnd}."
-msgstr ""
-
msgid "SecurityApprovals|Vulnerability-Check"
msgstr ""
@@ -29649,6 +30055,12 @@ msgstr ""
msgid "SecurityConfiguration|Immediately begin risk analysis and remediation with application security features. Start with SAST and Secret Detection, available to all plans. Upgrade to Ultimate to get all features, including:"
msgstr ""
+msgid "SecurityConfiguration|Manage corpus"
+msgstr ""
+
+msgid "SecurityConfiguration|Manage corpus files used as mutation sources in coverage fuzzing."
+msgstr ""
+
msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
msgstr ""
@@ -29703,6 +30115,12 @@ msgstr ""
msgid "SecurityOrchestration|Action"
msgstr ""
+msgid "SecurityOrchestration|Actions"
+msgstr ""
+
+msgid "SecurityOrchestration|Add rule"
+msgstr ""
+
msgid "SecurityOrchestration|All policies"
msgstr ""
@@ -29736,9 +30154,6 @@ msgstr ""
msgid "SecurityOrchestration|Network"
msgstr ""
-msgid "SecurityOrchestration|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
-msgstr ""
-
msgid "SecurityOrchestration|New policy"
msgstr ""
@@ -29754,6 +30169,9 @@ msgstr ""
msgid "SecurityOrchestration|Policy editor"
msgstr ""
+msgid "SecurityOrchestration|Policy preview"
+msgstr ""
+
msgid "SecurityOrchestration|Policy status"
msgstr ""
@@ -29763,6 +30181,9 @@ msgstr ""
msgid "SecurityOrchestration|Rule"
msgstr ""
+msgid "SecurityOrchestration|Rules"
+msgstr ""
+
msgid "SecurityOrchestration|Scan Execution"
msgstr ""
@@ -29856,6 +30277,9 @@ msgstr ""
msgid "SecurityReports|Create issue"
msgstr ""
+msgid "SecurityReports|Development vulnerabilities"
+msgstr ""
+
msgid "SecurityReports|Dismiss vulnerability"
msgstr ""
@@ -29871,6 +30295,9 @@ msgstr ""
msgid "SecurityReports|Download results"
msgstr ""
+msgid "SecurityReports|Download scanned URLs"
+msgstr ""
+
msgid "SecurityReports|Download scanned resources"
msgstr ""
@@ -29994,6 +30421,9 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
+msgid "SecurityReports|The Vulnerability Report shows the results of the lastest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "SecurityReports|The security reports below contain one or more vulnerability findings that could not be parsed and were not recorded. Download the artifacts in the job output to investigate. Ensure any security report created conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
msgstr ""
@@ -30135,10 +30565,10 @@ msgstr ""
msgid "Select a repository"
msgstr ""
-msgid "Select a role"
+msgid "Select a repository containing templates for common files."
msgstr ""
-msgid "Select a shared template repository for all projects on this instance."
+msgid "Select a role"
msgstr ""
msgid "Select a template repository"
@@ -30216,6 +30646,9 @@ msgstr ""
msgid "Select project to choose zone"
msgstr ""
+msgid "Select project to create issue"
+msgstr ""
+
msgid "Select projects"
msgstr ""
@@ -30333,6 +30766,9 @@ msgstr ""
msgid "Send emails to help guide new users through the onboarding process."
msgstr ""
+msgid "Send emails to users upon account deactivation."
+msgstr ""
+
msgid "Send message"
msgstr ""
@@ -30351,6 +30787,9 @@ msgstr ""
msgid "Send service data"
msgstr ""
+msgid "Sentry"
+msgstr ""
+
msgid "Sentry API URL"
msgstr ""
@@ -30465,6 +30904,9 @@ msgstr ""
msgid "Service"
msgstr ""
+msgid "Service Accounts keys are required to authorize GitLab to deploy your Google Cloud project."
+msgstr ""
+
msgid "Service Desk"
msgstr ""
@@ -30537,15 +30979,15 @@ msgstr ""
msgid "Set a password on your account to pull or push via %{protocol}."
msgstr ""
-msgid "Set a template repository for projects in this group"
-msgstr ""
-
msgid "Set access permissions for this token."
msgstr ""
msgid "Set an instance-wide domain that will be available to all clusters when installing Knative."
msgstr ""
+msgid "Set any rate limit to %{code_open}0%{code_close} to disable the limit."
+msgstr ""
+
msgid "Set default and restrict visibility levels. Configure import sources and git access protocol."
msgstr ""
@@ -30558,7 +31000,7 @@ msgstr ""
msgid "Set limit to 0 to allow any file size."
msgstr ""
-msgid "Set max session time for web terminal."
+msgid "Set limits for web and API requests."
msgstr ""
msgid "Set milestone"
@@ -30567,15 +31009,18 @@ msgstr ""
msgid "Set new password"
msgstr ""
-msgid "Set notification email for abuse reports."
+msgid "Set parent epic to an epic"
msgstr ""
-msgid "Set parent epic to an epic"
+msgid "Set per-user rate limits for imports and exports of projects and groups."
msgstr ""
msgid "Set projects and maximum size limits, session duration, user options, and check feature availability for namespace plan."
msgstr ""
+msgid "Set rate limits for package registry API requests that supersede the general user and IP rate limits."
+msgstr ""
+
msgid "Set severity"
msgstr ""
@@ -30594,15 +31039,24 @@ msgstr ""
msgid "Set the default branch for this project. All merge requests and commits are made against this branch unless you specify a different one."
msgstr ""
+msgid "Set the default expiration time for job artifacts in all projects. Set to %{code_open}0%{code_close} to never expire artifacts by default. If no unit is written, it defaults to seconds. For example, these are all equivalent: %{code_open}3600%{code_close}, %{code_open}60 minutes%{code_close}, or %{code_open}one hour%{code_close}."
+msgstr ""
+
msgid "Set the due date to %{due_date}."
msgstr ""
msgid "Set the iteration to %{iteration_reference}."
msgstr ""
+msgid "Set the maximum session time for a web terminal."
+msgstr ""
+
msgid "Set the milestone to %{milestone_reference}."
msgstr ""
+msgid "Set the per-user rate limit for notes created by web or API requests."
+msgstr ""
+
msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
msgstr ""
@@ -30804,6 +31258,9 @@ msgstr ""
msgid "Show Pipeline IID"
msgstr ""
+msgid "Show all %{issuable_type}."
+msgstr ""
+
msgid "Show all activity"
msgstr ""
@@ -30855,15 +31312,9 @@ msgstr ""
msgid "Show list"
msgstr ""
-msgid "Show me advanced features"
-msgstr ""
-
msgid "Show me how to add a pipeline"
msgstr ""
-msgid "Show me the basics"
-msgstr ""
-
msgid "Show one file at a time"
msgstr ""
@@ -30904,15 +31355,15 @@ msgstr ""
msgid "Showing %{pageSize} of %{total} %{issuableType}"
msgstr ""
-msgid "Showing %{pageSize} of %{total} issues"
-msgstr ""
-
msgid "Showing all epics"
msgstr ""
msgid "Showing all issues"
msgstr ""
+msgid "Showing data for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
+msgstr ""
+
msgid "Showing data for workflow items created in this date range. Date range cannot exceed %{maxDateRange} days."
msgstr ""
@@ -30952,6 +31403,15 @@ msgstr ""
msgid "Sidebar|Weight"
msgstr ""
+msgid "Sidekiq job compression threshold (bytes)"
+msgstr ""
+
+msgid "Sidekiq job size limit (bytes)"
+msgstr ""
+
+msgid "Sidekiq job size limits"
+msgstr ""
+
msgid "Sign in"
msgstr ""
@@ -31072,6 +31532,9 @@ msgstr ""
msgid "Site profile not found for given parameters"
msgstr ""
+msgid "Sites"
+msgstr ""
+
msgid "Size"
msgstr ""
@@ -31102,19 +31565,22 @@ msgstr ""
msgid "SlackIntegration|Sends notifications about project events to Slack channels."
msgstr ""
-msgid "SlackService|2. Paste the %{strong_open}Token%{strong_close} into the field below"
+msgid "SlackService|1. %{slash_command_link_start}Add a slash command%{slash_command_link_end} in your Slack team using this information:"
msgstr ""
-msgid "SlackService|3. Select the %{strong_open}Active%{strong_close} checkbox, press %{strong_open}Save changes%{strong_close} and start using GitLab inside Slack!"
+msgid "SlackService|2. Paste the token from Slack in the %{strong_open}Token%{strong_close} field below."
msgstr ""
-msgid "SlackService|Fill in the word that works best for your team."
+msgid "SlackService|3. Select the %{strong_open}Active%{strong_close} checkbox, select %{strong_open}Save changes%{strong_close}, and start using slash commands in Slack!"
+msgstr ""
+
+msgid "SlackService|After setup, get a list of available Slack slash commands by entering"
msgstr ""
-msgid "SlackService|See list of available commands in Slack after setting up this service, by entering"
+msgid "SlackService|Fill in the word that works best for your team."
msgstr ""
-msgid "SlackService|This service allows users to perform common operations on this project by entering slash commands in Slack."
+msgid "SlackService|Perform common operations in this project by entering slash commands in Slack."
msgstr ""
msgid "Slice multiplier"
@@ -31180,7 +31646,7 @@ msgstr ""
msgid "Some child epics may be hidden due to applied filters"
msgstr ""
-msgid "Some common domains are not allowed. %{read_more_link}."
+msgid "Some common domains are not allowed. %{learn_more_link}."
msgstr ""
msgid "Some of the designs you tried uploading did not change:"
@@ -31264,9 +31730,6 @@ msgstr ""
msgid "Something went wrong while exporting requirements"
msgstr ""
-msgid "Something went wrong while fetching %{listType} list"
-msgstr ""
-
msgid "Something went wrong while fetching branches"
msgstr ""
@@ -31321,15 +31784,9 @@ msgstr ""
msgid "Something went wrong while merging this merge request. Please try again."
msgstr ""
-msgid "Something went wrong while moving issues."
-msgstr ""
-
msgid "Something went wrong while obtaining the Let's Encrypt certificate."
msgstr ""
-msgid "Something went wrong while performing the action."
-msgstr ""
-
msgid "Something went wrong while promoting the issue to an epic. Please try again."
msgstr ""
@@ -31657,7 +32114,10 @@ msgstr ""
msgid "SourcegraphPreferences|Uses a custom %{linkStart}Sourcegraph instance%{linkEnd}."
msgstr ""
-msgid "Spam Check API Key"
+msgid "Spam Check"
+msgstr ""
+
+msgid "Spam Check API key"
msgstr ""
msgid "Spam Logs"
@@ -31675,7 +32135,7 @@ msgstr ""
msgid "Specified URL cannot be used: \"%{reason}\""
msgstr ""
-msgid "Specify an e-mail address regex pattern to identify default internal users."
+msgid "Specify an email address regex pattern to identify default internal users."
msgstr ""
msgid "Speed up your pipelines with Needs relationships"
@@ -31930,7 +32390,7 @@ msgstr ""
msgid "StatusCheck|An error occurred fetching the status checks."
msgstr ""
-msgid "StatusCheck|Apply this status check to any branch or a specific protected branch."
+msgid "StatusCheck|Apply this status check to all branches or a specific protected branch."
msgstr ""
msgid "StatusCheck|Check for a status response in Merge Requests. Failures do not block merges. %{link_start}Learn more%{link_end}."
@@ -32269,6 +32729,9 @@ msgstr ""
msgid "Subscriptions"
msgstr ""
+msgid "Subscription|Your subscription for %{strong}%{namespace_name}%{strong_close} has expired and you are now on %{pricing_link_start}the GitLab Free tier%{pricing_link_end}. Don't worry, your data is safe. Get in touch with our support team (%{support_email}). They'll gladly help with your subscription renewal."
+msgstr ""
+
msgid "Subtracted"
msgstr ""
@@ -32497,6 +32960,9 @@ msgstr ""
msgid "SuperSonics|Plan"
msgstr ""
+msgid "SuperSonics|Please agree to the Subscription Agreement"
+msgstr ""
+
msgid "SuperSonics|Ready to get started? A GitLab plan is ideal for scaling organizations and for multi team usage."
msgstr ""
@@ -32527,6 +32993,9 @@ msgstr ""
msgid "SuperSonics|The activation code is not valid. Please make sure to copy it exactly from the Customers Portal or confirmation email. Learn more about %{linkStart}activating your subscription%{linkEnd}."
msgstr ""
+msgid "SuperSonics|The activation code should be a 24-character alphanumeric string"
+msgstr ""
+
msgid "SuperSonics|There is a connectivity issue."
msgstr ""
@@ -32569,9 +33038,15 @@ msgstr ""
msgid "SuperSonics|You do not have an active subscription"
msgstr ""
+msgid "SuperSonics|You have successfully added a license that activates on %{date}. Please see the subscription history table below for more details."
+msgstr ""
+
msgid "SuperSonics|You'll be charged for %{trueUpLinkStart}users over license%{trueUpLinkEnd} on a quarterly or annual basis, depending on the terms of your agreement."
msgstr ""
+msgid "SuperSonics|Your future dated license was successfully added"
+msgstr ""
+
msgid "SuperSonics|Your subscription"
msgstr ""
@@ -32824,7 +33299,7 @@ msgstr ""
msgid "Template to append to all Service Desk issues"
msgstr ""
-msgid "TemplateRepository|Select a repository to make its templates available to all projects. %{link_start}What should the repository contain?%{link_end} "
+msgid "TemplateRepository|Create common files more quickly, and standardize their format."
msgstr ""
msgid "Templates"
@@ -33030,7 +33505,7 @@ msgstr ""
msgid "TestCases|Search test cases"
msgstr ""
-msgid "TestCases|Something went wrong while adding test case to Todo."
+msgid "TestCases|Something went wrong while adding test case to a to-do item."
msgstr ""
msgid "TestCases|Something went wrong while creating a test case."
@@ -33042,7 +33517,7 @@ msgstr ""
msgid "TestCases|Something went wrong while fetching test cases list."
msgstr ""
-msgid "TestCases|Something went wrong while marking test case todo as done."
+msgid "TestCases|Something went wrong while marking test case to-do item as done."
msgstr ""
msgid "TestCases|Something went wrong while moving test case."
@@ -33162,7 +33637,7 @@ msgstr ""
msgid "Thanks for your purchase!"
msgstr ""
-msgid "That is ok, I do not want to renew"
+msgid "That's OK, I don't want to renew"
msgstr ""
msgid "That's it, well done!"
@@ -33185,7 +33660,7 @@ msgid_plural "The %{type} contains the following errors:"
msgstr[0] ""
msgstr[1] ""
-msgid "The API key used by GitLab for accessing the Spam Check service endpoint"
+msgid "The API key used by GitLab for accessing the Spam Check service endpoint."
msgstr ""
msgid "The GitLab subscription service (customers.gitlab.com) is currently experiencing an outage. You can monitor the status and get updates at %{linkStart}status.gitlab.com%{linkEnd}."
@@ -33224,9 +33699,6 @@ msgstr ""
msgid "The URL to use for connecting to Elasticsearch. Use a comma-separated list to support clustering (e.g., \"http://localhost:9200, http://localhost:9201\")."
msgstr ""
-msgid "The Vulnerability Report shows the results of the last successful pipeline run on the default branch."
-msgstr ""
-
msgid "The X509 Certificate to use when mutual TLS is required to communicate with the external authorization service. If left blank, the server certificate is still validated when accessing over HTTPS."
msgstr ""
@@ -33284,9 +33756,6 @@ msgstr ""
msgid "The default branch for this project has been changed. Please update your bookmarks."
msgstr ""
-msgid "The default expiration time for job artifacts. 0 for unlimited. The default unit is in seconds, but you can use other units, for example %{code_open}4 mins 2 sec%{code_close}, %{code_open}2h42min%{code_close}."
-msgstr ""
-
msgid "The dependency list details information about the components used within your project."
msgstr ""
@@ -33478,9 +33947,6 @@ msgstr ""
msgid "The merge conflicts for this merge request have already been resolved. Please return to the merge request."
msgstr ""
-msgid "The merge request can now be merged."
-msgstr ""
-
msgid "The metric must be one of %{metrics}."
msgstr ""
@@ -33856,7 +34322,7 @@ msgstr ""
msgid "There was a problem updating the keep latest artifacts setting."
msgstr ""
-msgid "There was an error %{message} todo."
+msgid "There was an error %{message} to-do item."
msgstr ""
msgid "There was an error adding a To Do."
@@ -33895,6 +34361,9 @@ msgstr ""
msgid "There was an error fetching projects"
msgstr ""
+msgid "There was an error fetching search autocomplete suggestions"
+msgstr ""
+
msgid "There was an error fetching stage total counts"
msgstr ""
@@ -34219,6 +34688,9 @@ msgstr ""
msgid "This field is required."
msgstr ""
+msgid "This form is disabled in preview"
+msgstr ""
+
msgid "This group"
msgstr ""
@@ -34240,9 +34712,6 @@ msgstr ""
msgid "This group is linked to a subscription"
msgstr ""
-msgid "This group, including all subgroups, projects and git repositories, will be reachable from only the specified IP address ranges."
-msgstr ""
-
msgid "This group, its subgroups and projects has been scheduled for removal on %{date}."
msgstr ""
@@ -34522,9 +34991,6 @@ msgstr ""
msgid "This user cannot be unlocked manually from GitLab"
msgstr ""
-msgid "This user does not have a pending request"
-msgstr ""
-
msgid "This user has an unconfirmed email address (%{email}). You may force a confirmation."
msgstr ""
@@ -34633,9 +35099,6 @@ msgstr ""
msgid "ThreatMonitoring|Packet Activity"
msgstr ""
-msgid "ThreatMonitoring|Policies"
-msgstr ""
-
msgid "ThreatMonitoring|Requests"
msgstr ""
@@ -34687,6 +35150,12 @@ msgstr ""
msgid "ThreatMonitoring|View documentation"
msgstr ""
+msgid "Threshold in bytes at which to compress Sidekiq job arguments."
+msgstr ""
+
+msgid "Threshold in bytes at which to reject Sidekiq jobs. Set this to 0 to if you don't want to limit Sidekiq jobs."
+msgstr ""
+
msgid "Throughput"
msgstr ""
@@ -34696,6 +35165,9 @@ msgstr ""
msgid "Time"
msgstr ""
+msgid "Time (in hours) that users are allowed to skip forced configuration of two-factor authentication."
+msgstr ""
+
msgid "Time Spent"
msgstr ""
@@ -34762,7 +35234,7 @@ msgstr ""
msgid "TimeTrackingEstimated|Est"
msgstr ""
-msgid "TimeTracking|%{startTag}Spent: %{endTag}%{timeSpentHumanReadable}"
+msgid "TimeTracking|%{spentStart}Spent: %{spentEnd}"
msgstr ""
msgid "TimeTracking|Estimated:"
@@ -34976,6 +35448,9 @@ msgstr ""
msgid "To access this domain create a new DNS record"
msgstr ""
+msgid "To add a custom suffix, set up a Service Desk email address. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "To add an SSH key you need to %{generate_link_start}generate one%{link_end} or use an %{existing_link_start}existing key%{link_end}."
msgstr ""
@@ -34997,13 +35472,16 @@ msgstr ""
msgid "To connect an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To continue using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
+msgstr ""
+
msgid "To continue, you need to select the link in the confirmation email we sent to verify your email address. If you didn't get our email, select %{strongStart}Resend confirmation email.%{strongEnd}"
msgstr ""
msgid "To define internal users, first enable new users set to external"
msgstr ""
-msgid "To enable Registration Features, make sure \"Enable service ping\" is checked."
+msgid "To enable Registration Features, first enable Service Ping."
msgstr ""
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
@@ -35030,7 +35508,7 @@ msgstr ""
msgid "To get started, use the link below to confirm your account."
msgstr ""
-msgid "To help improve GitLab and its user experience, GitLab will periodically collect usage information."
+msgid "To help improve GitLab and its user experience, GitLab periodically collects usage information."
msgstr ""
msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
@@ -35063,7 +35541,7 @@ msgstr ""
msgid "To preserve performance only %{strong_open}%{display_size} of %{real_size}%{strong_close} files are displayed."
msgstr ""
-msgid "To protect this issue's confidentiality, %{forkLink} and set the fork's visibility to private."
+msgid "To protect this issue's confidentiality, %{linkStart}fork this project%{linkEnd} and set the fork's visibility to private."
msgstr ""
msgid "To protect this issue's confidentiality, a private fork of this project was selected."
@@ -35096,12 +35574,15 @@ msgstr ""
msgid "To set up SAML authentication for your group through an identity provider like Azure, Okta, Onelogin, Ping Identity, or your custom SAML 2.0 provider:"
msgstr ""
-msgid "To set up this service:"
+msgid "To set up this integration:"
msgstr ""
msgid "To specify the notification level per project of a group you belong to, you need to visit project page and change notification level there."
msgstr ""
+msgid "To start using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
+msgstr ""
+
msgid "To unsubscribe from this issue, please paste the following link into your browser:"
msgstr ""
@@ -35689,9 +36170,6 @@ msgstr ""
msgid "Unable to fetch branches list, please close the form and try again"
msgstr ""
-msgid "Unable to fetch unscanned projects"
-msgstr ""
-
msgid "Unable to fetch vulnerable projects"
msgstr ""
@@ -35746,6 +36224,15 @@ msgstr ""
msgid "Unable to update this issue at this time."
msgstr ""
+msgid "Unapprove a merge request"
+msgstr ""
+
+msgid "Unapprove the current merge request."
+msgstr ""
+
+msgid "Unapproved the current merge request."
+msgstr ""
+
msgid "Unarchive project"
msgstr ""
@@ -35758,16 +36245,13 @@ msgstr ""
msgid "Unassigned"
msgstr ""
-msgid "Unauthenticated API request rate limit"
-msgstr ""
-
-msgid "Unauthenticated rate limit period in seconds"
+msgid "Unauthenticated API rate limit period in seconds"
msgstr ""
-msgid "Unauthenticated request rate limit"
+msgid "Unauthenticated requests"
msgstr ""
-msgid "Unauthenticated requests"
+msgid "Unauthenticated web rate limit period in seconds"
msgstr ""
msgid "Undo"
@@ -35869,18 +36353,6 @@ msgstr ""
msgid "Unresolved"
msgstr ""
-msgid "UnscannedProjects|15 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|30 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|5 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|60 or more days"
-msgstr ""
-
msgid "Unschedule job"
msgstr ""
@@ -36100,6 +36572,9 @@ msgstr ""
msgid "UsageQuota|%{help_link_start}Shared runners%{help_link_end} are disabled, so there are no limits set on pipeline usage"
msgstr ""
+msgid "UsageQuota|%{linkTitle} help link"
+msgstr ""
+
msgid "UsageQuota|%{percentageLeft} of purchased storage is available"
msgstr ""
@@ -36109,6 +36584,9 @@ msgstr ""
msgid "UsageQuota|Artifacts is a sum of build and pipeline artifacts."
msgstr ""
+msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
+msgstr ""
+
msgid "UsageQuota|Buy additional minutes"
msgstr ""
@@ -36118,9 +36596,21 @@ msgstr ""
msgid "UsageQuota|CI minutes usage by project"
msgstr ""
+msgid "UsageQuota|Code packages and container images."
+msgstr ""
+
msgid "UsageQuota|Current period usage"
msgstr ""
+msgid "UsageQuota|File attachments and smaller design graphics."
+msgstr ""
+
+msgid "UsageQuota|Git repository, managed by the Gitaly service."
+msgstr ""
+
+msgid "UsageQuota|Includes project registry, artifacts, packages, wiki, uploads and other items."
+msgstr ""
+
msgid "UsageQuota|Increase storage temporarily"
msgstr ""
@@ -36139,6 +36629,9 @@ msgstr ""
msgid "UsageQuota|Packages"
msgstr ""
+msgid "UsageQuota|Pipeline artifacts and job artifacts, created with CI/CD."
+msgstr ""
+
msgid "UsageQuota|Pipelines"
msgstr ""
@@ -36157,6 +36650,9 @@ msgstr ""
msgid "UsageQuota|Seats"
msgstr ""
+msgid "UsageQuota|Shared bits of code and text."
+msgstr ""
+
msgid "UsageQuota|Snippets"
msgstr ""
@@ -36166,6 +36662,12 @@ msgstr ""
msgid "UsageQuota|Storage"
msgstr ""
+msgid "UsageQuota|Storage type"
+msgstr ""
+
+msgid "UsageQuota|There is a known issue with Artifact storage where the total could be incorrect for some projects. More details and progress are available in %{warningLinkStart}the epic%{warningLinkEnd}."
+msgstr ""
+
msgid "UsageQuota|This is the total amount of storage used across your projects within this namespace."
msgstr ""
@@ -36205,6 +36707,9 @@ msgstr ""
msgid "UsageQuota|Usage"
msgstr ""
+msgid "UsageQuota|Usage Breakdown"
+msgstr ""
+
msgid "UsageQuota|Usage Quotas"
msgstr ""
@@ -36229,6 +36734,9 @@ msgstr ""
msgid "UsageQuota|Wiki"
msgstr ""
+msgid "UsageQuota|Wiki content."
+msgstr ""
+
msgid "UsageQuota|Wikis"
msgstr ""
@@ -36445,7 +36953,10 @@ msgstr ""
msgid "User Settings"
msgstr ""
-msgid "User and IP Rate Limits"
+msgid "User and IP rate limits"
+msgstr ""
+
+msgid "User does not have a pending request"
msgstr ""
msgid "User identity was successfully created."
@@ -36742,6 +37253,9 @@ msgstr ""
msgid "Users can launch a development environment from a GitLab browser tab when the %{linkStart}Gitpod%{linkEnd} integration is enabled."
msgstr ""
+msgid "Users can reactivate their account by signing in."
+msgstr ""
+
msgid "Users can render diagrams in AsciiDoc, Markdown, reStructuredText, and Textile documents using Kroki."
msgstr ""
@@ -36757,6 +37271,9 @@ msgstr ""
msgid "Users requesting access to"
msgstr ""
+msgid "Users to exclude from the rate limit"
+msgstr ""
+
msgid "Users were successfully added."
msgstr ""
@@ -36778,6 +37295,9 @@ msgstr ""
msgid "UsersSelect|Unassigned"
msgstr ""
+msgid "Uses GitLab as a lightweight alternative to Sentry."
+msgstr ""
+
msgid "Using %{code_start}::%{code_end} denotes a %{link_start}scoped label set%{link_end}"
msgstr ""
@@ -36808,10 +37328,7 @@ msgstr ""
msgid "Value Stream Analytics can help you determine your team’s velocity"
msgstr ""
-msgid "Value Stream Analytics gives an overview of how much time it takes to go from idea to production in your project."
-msgstr ""
-
-msgid "Value may contain a variable reference"
+msgid "Value might contain a variable reference"
msgstr ""
msgid "Value stream"
@@ -36877,10 +37394,10 @@ msgstr ""
msgid "ValueStream|The Default Value Stream cannot be deleted"
msgstr ""
-msgid "Variable"
+msgid "Values that contain the %{codeStart}$%{codeEnd} character can be considered a variable reference and expanded. %{docsLinkStart}Learn more.%{docsLinkEnd}"
msgstr ""
-msgid "Variable references indicated by %{codeStart}$%{codeEnd} may be expanded. If this is not what you want, consider %{docsLinkStart}using a workaround to prevent expansion%{docsLinkEnd}."
+msgid "Variable"
msgstr ""
msgid "Variable will be masked in job logs."
@@ -37285,6 +37802,9 @@ msgstr ""
msgid "Vulnerability|Evidence"
msgstr ""
+msgid "Vulnerability|False positive detected"
+msgstr ""
+
msgid "Vulnerability|File"
msgstr ""
@@ -37327,6 +37847,9 @@ msgstr ""
msgid "Vulnerability|Status"
msgstr ""
+msgid "Vulnerability|The scanner determined this vulnerability to be a false positive. Verify the evaluation before changing its status. %{linkStart}Learn more about false positive detection.%{linkEnd}"
+msgstr ""
+
msgid "Vulnerability|The unmodified response is the original response that had no mutations done to the request"
msgstr ""
@@ -37651,9 +38174,6 @@ msgstr ""
msgid "Welcome to GitLab,%{br_tag}%{name}!"
msgstr ""
-msgid "Welcome to the guided GitLab tour"
-msgstr ""
-
msgid "Welcome, %{name}!"
msgstr ""
@@ -37672,9 +38192,6 @@ msgstr ""
msgid "What are you searching for?"
msgstr ""
-msgid "What describes you best?"
-msgstr ""
-
msgid "What does this command do?"
msgstr ""
@@ -37696,13 +38213,13 @@ msgstr ""
msgid "What is your job title? (optional)"
msgstr ""
-msgid "What will you use this group for?"
+msgid "What templates can I create?"
msgstr ""
-msgid "What's new"
+msgid "What will you use this group for?"
msgstr ""
-msgid "What’s your experience level?"
+msgid "What's new"
msgstr ""
msgid "When a deployment job is successful, skip older deployment jobs that are still pending."
@@ -37714,6 +38231,9 @@ msgstr ""
msgid "When an event in GitLab triggers a webhook, you can use the request details to figure out if something went wrong."
msgstr ""
+msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+msgstr ""
+
msgid "When inactive, an external authentication provider must be used."
msgstr ""
@@ -37737,6 +38257,9 @@ msgstr ""
msgid "When:"
msgstr ""
+msgid "Which API requests are affected?"
+msgstr ""
+
msgid "While it's rare to have no vulnerabilities, it can happen. In any event, we ask that you please double check your settings to make sure you've set up your dashboard correctly."
msgstr ""
@@ -38016,6 +38539,9 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|Work Items"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -38091,6 +38617,9 @@ msgstr ""
msgid "You are already a member of this %{member_source}."
msgstr ""
+msgid "You are already impersonating another user"
+msgstr ""
+
msgid "You are an admin, which means granting access to %{client_name} will allow them to interact with GitLab as an admin as well. Proceed with caution."
msgstr ""
@@ -38193,6 +38722,9 @@ msgstr ""
msgid "You can also use project access tokens with Git to authenticate over HTTP(S). %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "You can always change your URL later"
+msgstr ""
+
msgid "You can always edit this later"
msgstr ""
@@ -38349,10 +38881,10 @@ msgstr ""
msgid "You can’t %{tag_start}edit%{tag_end} files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
-msgid "You could not create a new trigger."
+msgid "You can’t edit files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
-msgid "You didn't renew your subscription for %{strong}%{namespace_name}%{strong_close} so it was downgraded to the free plan."
+msgid "You could not create a new trigger."
msgstr ""
msgid "You do not have any subscriptions yet"
@@ -38520,6 +39052,12 @@ msgstr ""
msgid "You must provide your current password in order to change it."
msgstr ""
+msgid "You must sign in to search for specific projects."
+msgstr ""
+
+msgid "You must sign in to search for specific terms."
+msgstr ""
+
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
@@ -38547,6 +39085,9 @@ msgstr ""
msgid "You need to upload a GitLab project export archive (ending in .gz)."
msgstr ""
+msgid "You need to verify your primary email first before enabling Two-Factor Authentication."
+msgstr ""
+
msgid "You successfully declined the invitation"
msgstr ""
@@ -38655,10 +39196,10 @@ msgstr ""
msgid "Your %{host} account was signed in to from a new location"
msgstr ""
-msgid "Your %{strong}%{plan_name}%{strong_close} subscription for %{strong}%{namespace_name}%{strong_close} will expire on %{strong}%{expires_on}%{strong_close}."
+msgid "Your %{strong}%{plan_name}%{strong_close} subscription expires on %{strong}%{expires_on}%{strong_close}. After that date, you cannot create issues or merge requests, or use many other features."
msgstr ""
-msgid "Your %{strong}%{plan_name}%{strong_close} subscription will expire on %{strong}%{expires_on}%{strong_close}. After that, you will not be able to create issues or merge requests as well as many other features."
+msgid "Your %{strong}%{plan_name}%{strong_close} subscription for %{strong}%{namespace_name}%{strong_close} will expire on %{strong}%{expires_on}%{strong_close}."
msgstr ""
msgid "Your CI/CD configuration syntax is invalid. View Lint tab for more details."
@@ -38682,7 +39223,7 @@ msgstr ""
msgid "Your GPG keys (%{count})"
msgstr ""
-msgid "Your GitLab account has been locked due to an excessive amount of unsuccessful sign in attempts. Your account will automatically unlock in %{duration} or you may click the link below to unlock now."
+msgid "Your GitLab account has been locked due to an excessive number of unsuccessful sign in attempts. You can wait for your account to automatically unlock in %{duration} or you can click the link below to unlock now."
msgstr ""
msgid "Your GitLab account request has been approved!"
@@ -38793,6 +39334,9 @@ msgstr ""
msgid "Your commit email is used for web based operations, such as edits and merges."
msgstr ""
+msgid "Your current password is required to register a two-factor authenticator app."
+msgstr ""
+
msgid "Your dashboard has been copied. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
@@ -38892,6 +39436,9 @@ msgstr ""
msgid "Your project limit is %{limit} projects! Please contact your administrator to increase it"
msgstr ""
+msgid "Your project will be created at:"
+msgstr ""
+
msgid "Your projects"
msgstr ""
@@ -38931,11 +39478,10 @@ msgstr ""
msgid "Your subscription expired!"
msgstr ""
-msgid "Your subscription has been downgraded."
-msgstr ""
-
-msgid "Your subscription will expire in %{remaining_days}."
-msgstr ""
+msgid "Your subscription will expire in %{remaining_days} day."
+msgid_plural "Your subscription will expire in %{remaining_days} days."
+msgstr[0] ""
+msgstr[1] ""
msgid "Your username is %{username}."
msgstr ""
@@ -39142,6 +39688,9 @@ msgstr ""
msgid "cannot merge"
msgstr ""
+msgid "cannot not be used for user namespace"
+msgstr ""
+
msgid "ciReport|%{degradedNum} degraded"
msgstr ""
@@ -39465,6 +40014,9 @@ msgstr ""
msgid "created %{timeAgo}"
msgstr ""
+msgid "created %{timeAgo} by %{author}"
+msgstr ""
+
msgid "created by"
msgstr ""
@@ -39509,9 +40061,6 @@ msgstr ""
msgid "does not have a supported extension. Only %{extension_list} are supported"
msgstr ""
-msgid "domain is not authorized for sign-up."
-msgstr ""
-
msgid "download it"
msgstr ""
@@ -39529,18 +40078,13 @@ msgstr ""
msgid "email '%{email}' is not a verified email."
msgstr ""
-msgid "email does not match the allowed domain of %{email_domains}"
-msgid_plural "email does not match the allowed domains: %{email_domains}"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "enabled"
msgstr ""
msgid "encrypted: needs to be a :required, :optional or :migrating!"
msgstr ""
-msgid "ending with MIME type format is not allowed."
+msgid "ending with a reserved file extension is not allowed."
msgstr ""
msgid "entries cannot be larger than 255 characters"
@@ -39564,6 +40108,9 @@ msgstr ""
msgid "estimateCommand|%{slash_command} overwrites the total estimated time."
msgstr ""
+msgid "example.com"
+msgstr ""
+
msgid "exceeds the limit of %{bytes} bytes"
msgstr ""
@@ -39614,9 +40161,6 @@ msgstr ""
msgid "fork"
msgstr ""
-msgid "fork this project"
-msgstr ""
-
msgid "from"
msgstr ""
@@ -39625,6 +40169,9 @@ msgid_plural "from %d jobs"
msgstr[0] ""
msgstr[1] ""
+msgid "frontmatter"
+msgstr ""
+
msgid "group"
msgstr ""
@@ -39652,6 +40199,9 @@ msgstr ""
msgid "has been completed."
msgstr ""
+msgid "has too deep level of nesting"
+msgstr ""
+
msgid "help"
msgstr ""
@@ -39685,9 +40235,21 @@ msgstr ""
msgid "in"
msgstr ""
+msgid "in Infrastructure :: Kubernetes clusters"
+msgstr ""
+
+msgid "in all GitLab"
+msgstr ""
+
+msgid "in group"
+msgstr ""
+
msgid "in group %{link_to_group}"
msgstr ""
+msgid "in project"
+msgstr ""
+
msgid "in project %{link_to_project}"
msgstr ""
@@ -39729,16 +40291,19 @@ msgstr ""
msgid "is not a valid X509 certificate."
msgstr ""
-msgid "is not allowed since the group is not top-level group."
+msgid "is not allowed for sign-up."
msgstr ""
-msgid "is not allowed. Try again with a different email address, or contact your GitLab admin."
+msgid "is not allowed for this group."
msgstr ""
-msgid "is not allowed. We do not currently support project-level iterations"
+msgid "is not allowed for this project."
+msgstr ""
+
+msgid "is not allowed since the group is not top-level group."
msgstr ""
-msgid "is not from an allowed domain."
+msgid "is not allowed. We do not currently support project-level iterations"
msgstr ""
msgid "is not in the group enforcing Group Managed Account"
@@ -39831,6 +40396,9 @@ msgstr ""
msgid "log in"
msgstr ""
+msgid "managed"
+msgstr ""
+
msgid "manual"
msgstr ""
@@ -39878,6 +40446,9 @@ msgstr ""
msgid "mrWidget| Please restore it or use a different %{missingBranchName} branch"
msgstr ""
+msgid "mrWidget|%{linkStart}Set up now%{linkEnd} to analyze your source code for known security vulnerabilities."
+msgstr ""
+
msgid "mrWidget|%{mergeError}."
msgstr ""
@@ -39958,6 +40529,9 @@ msgid_plural "mrWidget|Closes issues"
msgstr[0] ""
msgstr[1] ""
+msgid "mrWidget|Create issue to resolve all threads"
+msgstr ""
+
msgid "mrWidget|Delete source branch"
msgstr ""
@@ -39967,12 +40541,18 @@ msgstr ""
msgid "mrWidget|Did not close"
msgstr ""
+msgid "mrWidget|Dismiss"
+msgstr ""
+
msgid "mrWidget|Email patches"
msgstr ""
msgid "mrWidget|Failed to load deployment statistics"
msgstr ""
+msgid "mrWidget|Hide %{widget} details"
+msgstr ""
+
msgid "mrWidget|If the %{missingBranchName} branch exists in your local repository, you can merge this merge request manually using the command line"
msgstr ""
@@ -40068,9 +40648,6 @@ msgstr ""
msgid "mrWidget|Request to merge"
msgstr ""
-msgid "mrWidget|Resolve all threads in new issue"
-msgstr ""
-
msgid "mrWidget|Resolve conflicts"
msgstr ""
@@ -40086,6 +40663,9 @@ msgstr ""
msgid "mrWidget|Revoke approval"
msgstr ""
+msgid "mrWidget|SAST and Secret Detection is not enabled."
+msgstr ""
+
msgid "mrWidget|Set by %{merge_author} to be added to the merge train when the pipeline succeeds"
msgstr ""
@@ -40095,6 +40675,9 @@ msgstr ""
msgid "mrWidget|Set by %{merge_author} to start a merge train when the pipeline succeeds"
msgstr ""
+msgid "mrWidget|Show %{widget} details"
+msgstr ""
+
msgid "mrWidget|The changes were merged into"
msgstr ""
@@ -40107,6 +40690,9 @@ msgstr ""
msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure, or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
msgstr ""
+msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure."
+msgstr ""
+
msgid "mrWidget|The source branch has been deleted"
msgstr ""
@@ -40149,6 +40735,9 @@ msgstr ""
msgid "mrWidget|You can merge after removing denied licenses"
msgstr ""
+msgid "mrWidget|You can only merge once this merge request is approved."
+msgstr ""
+
msgid "mrWidget|Your password"
msgstr ""
@@ -40185,6 +40774,9 @@ msgstr ""
msgid "must be less than the limit of %{tag_limit} tags"
msgstr ""
+msgid "must be set for a project namespace"
+msgstr ""
+
msgid "must be unique by status and elapsed time within a policy"
msgstr ""
@@ -40294,6 +40886,9 @@ msgstr ""
msgid "pipeline"
msgstr ""
+msgid "pipeline schedules documentation"
+msgstr ""
+
msgid "pod_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
msgstr ""
@@ -40343,16 +40938,25 @@ msgstr ""
msgid "project name"
msgstr ""
+msgid "project namespace cannot be the parent of another namespace"
+msgstr ""
+
msgid "projects"
msgstr ""
msgid "quick actions"
msgstr ""
-msgid "reCAPTCHA Private Key"
+msgid "reCAPTCHA"
+msgstr ""
+
+msgid "reCAPTCHA helps prevent credential stuffing."
msgstr ""
-msgid "reCAPTCHA Site Key"
+msgid "reCAPTCHA private key"
+msgstr ""
+
+msgid "reCAPTCHA site key"
msgstr ""
msgid "recent activity"
@@ -40579,6 +41183,9 @@ msgstr ""
msgid "user avatar"
msgstr ""
+msgid "user namespace cannot be the parent of another namespace"
+msgstr ""
+
msgid "user preferences"
msgstr ""
@@ -40671,3 +41278,9 @@ msgstr ""
msgid "your settings"
msgstr ""
+msgid "{group}"
+msgstr ""
+
+msgid "{project}"
+msgstr ""
+
diff --git a/locale/cs_CZ/gitlab.po b/locale/cs_CZ/gitlab.po
index 2b9e77ced37..aaf21b8a80a 100644
--- a/locale/cs_CZ/gitlab.po
+++ b/locale/cs_CZ/gitlab.po
@@ -14,10 +14,7 @@ msgstr ""
"X-Crowdin-Language: cs\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-09-01 22:32\n"
-
-msgid " %{name}, confirm your email address now! "
-msgstr ""
+"PO-Revision-Date: 2021-10-04 20:20\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -96,6 +93,20 @@ msgstr ""
msgid "#general, #development"
msgstr ""
+msgid "%d Alert"
+msgid_plural "%d Alerts"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
+msgid "%d Alert:"
+msgid_plural "%d Alerts:"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "%d Approval"
msgid_plural "%d Approvals"
msgstr[0] ""
@@ -591,7 +602,10 @@ msgstr ""
msgid "%{code_open}Protected:%{code_close} Only exposed to protected branches or tags."
msgstr ""
-msgid "%{commit_author_link} authored %{commit_timeago}"
+msgid "%{commit_author_link} authored %{commit_authored_timeago}"
+msgstr ""
+
+msgid "%{commit_author_link} authored %{commit_authored_timeago} and %{commit_committer_avatar} %{commit_committer_link} committed %{commit_committer_timeago}"
msgstr ""
msgid "%{completedCount} completed weight"
@@ -695,6 +709,15 @@ msgstr ""
msgid "%{doc_link_start}Advanced search%{doc_link_end} is enabled."
msgstr ""
+msgid "%{docs_link_start}Learn about visibility levels.%{docs_link_end}"
+msgstr ""
+
+msgid "%{docs_link_start}What is Large File Storage?%{docs_link_end}"
+msgstr ""
+
+msgid "%{docs_link_start}What is two-factor authentication?%{docs_link_end}"
+msgstr ""
+
msgid "%{due_date} (Past due)"
msgstr ""
@@ -767,9 +790,6 @@ msgstr ""
msgid "%{issueType} actions"
msgstr ""
-msgid "%{issuesCount} issues with a limit of %{maxIssueCount}"
-msgstr ""
-
msgid "%{issuesSize} with a limit of %{maxIssueCount}"
msgstr ""
@@ -827,6 +847,12 @@ msgstr ""
msgid "%{label_for_message} unavailable"
msgstr ""
+msgid "%{learn_more_link}."
+msgstr ""
+
+msgid "%{lessThan} 1 hour"
+msgstr ""
+
msgid "%{lets_encrypt_link_start}Let's Encrypt%{lets_encrypt_link_end} is a free, automated, and open certificate authority (CA) that issues digital certificates to enable HTTPS (SSL/TLS) for sites."
msgstr ""
@@ -839,15 +865,15 @@ msgstr ""
msgid "%{link_start}Learn more%{link_end} about roles."
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
-msgstr ""
-
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
msgstr ""
msgid "%{link_start}Start the title with %{draft_snippet}%{link_end} to prevent a merge request that is a work in progress from being merged before it's ready."
msgstr ""
+msgid "%{link_start}What information does GitLab Inc. collect?%{link_end}"
+msgstr ""
+
msgid "%{listToShow}, and %{awardsListLength} more"
msgstr ""
@@ -1008,7 +1034,7 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-msgid "%{service_ping_link_start}Learn more%{service_ping_link_end} about what information is shared with GitLab Inc."
+msgid "%{service_ping_link_start}What information is shared with GitLab Inc.?%{service_ping_link_end}"
msgstr ""
msgid "%{size} %{unit}"
@@ -1044,6 +1070,9 @@ msgstr ""
msgid "%{state} epics"
msgstr ""
+msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
+msgstr ""
+
msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
msgstr ""
@@ -1117,13 +1146,6 @@ msgstr ""
msgid "%{template_project_id} is unknown or invalid"
msgstr ""
-msgid "%{text} %{files}"
-msgid_plural "%{text} %{files} files"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
-
msgid "%{text} is available"
msgstr "%{text} je k dispozici"
@@ -1208,9 +1230,6 @@ msgstr ""
msgid "%{wildcards_link_start}Wildcards%{wildcards_link_end} such as %{code_tag_start}v*%{code_tag_end} or %{code_tag_start}*-release%{code_tag_end} are supported."
msgstr ""
-msgid "&lt; 1 hour"
-msgstr ""
-
msgid "'%{data}' at %{location} does not match format: %{format}"
msgstr ""
@@ -1296,9 +1315,6 @@ msgstr ""
msgid "(we need your current password to confirm your changes)"
msgstr ""
-msgid "* * * * *"
-msgstr ""
-
msgid "+ %{amount} more"
msgstr ""
@@ -1371,10 +1387,10 @@ msgstr ""
msgid "."
msgstr ""
-msgid "0 bytes"
+msgid "/"
msgstr ""
-msgid "0 for unlimited, only effective with remote storage enabled."
+msgid "0 bytes"
msgstr ""
msgid "0t1DgySidms"
@@ -1550,6 +1566,9 @@ msgstr ""
msgid "1000+"
msgstr ""
+msgid "192.168.0.0/24"
+msgstr ""
+
msgid "1st contribution!"
msgstr "1. příspěvek!"
@@ -1703,9 +1722,6 @@ msgstr ""
msgid "A plain HTML site that uses Netlify for CI/CD instead of GitLab, but still with all the other great GitLab features"
msgstr ""
-msgid "A plain-text response to show to clients that hit the rate limit."
-msgstr ""
-
msgid "A platform value can be web, mob or app."
msgstr ""
@@ -1787,7 +1803,7 @@ msgstr ""
msgid "APIFuzzing|Configure HTTP basic authentication values. Other authentication methods are supported. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
+msgid "APIFuzzing|Customize your project's API fuzzing configuration options and copy the code snippet to your .gitlab-ci.yml file to apply any changes. Note that this tool does not reflect or update your .gitlab-ci.yml file automatically. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
msgstr ""
msgid "APIFuzzing|Enable authentication"
@@ -1850,9 +1866,6 @@ msgstr ""
msgid "APIFuzzing|To prevent a security leak, authentication info must be added as a %{ciVariablesLinkStart}CI variable%{ciVariablesLinkEnd}. As a user with maintainer access rights, you can manage CI variables in the %{ciSettingsLinkStart}Settings%{ciSettingsLinkEnd} area."
msgstr ""
-msgid "APIFuzzing|Use this tool to generate API fuzzing configuration YAML to copy into your .gitlab-ci.yml file. This tool does not reflect or update your .gitlab-ci.yml file automatically."
-msgstr ""
-
msgid "APIFuzzing|Username for basic authentication"
msgstr ""
@@ -1904,9 +1917,6 @@ msgstr "Hlášení o zneužití"
msgid "Abuse reports notification email"
msgstr ""
-msgid "Abuse reports will be sent to this address if it is set. Abuse reports are always available in the admin area."
-msgstr ""
-
msgid "Accept invitation"
msgstr ""
@@ -1943,12 +1953,18 @@ msgstr ""
msgid "Access granted"
msgstr ""
+msgid "Access key ID"
+msgstr ""
+
msgid "Access requests"
msgstr ""
msgid "Access to '%{classification_label}' not allowed"
msgstr ""
+msgid "Access tokens expire after 2 hours. A refresh token may be used at any time to generate a new access token. Non-expiring access tokens are deprecated. Clear this setting to enable backward compatibility."
+msgstr ""
+
msgid "AccessDropdown|Deploy Keys"
msgstr ""
@@ -2261,6 +2277,9 @@ msgstr ""
msgid "Add new directory"
msgstr ""
+msgid "Add new service account"
+msgstr ""
+
msgid "Add or remove previously merged commits"
msgstr ""
@@ -2498,6 +2517,9 @@ msgstr ""
msgid "AdminArea|Features"
msgstr ""
+msgid "AdminArea|Get security updates from GitLab and stay up to date"
+msgstr ""
+
msgid "AdminArea|Groups"
msgstr ""
@@ -2537,6 +2559,12 @@ msgstr ""
msgid "AdminArea|Reporter"
msgstr ""
+msgid "AdminArea|Sign up for the GitLab Security Newsletter to get notified for security updates."
+msgstr ""
+
+msgid "AdminArea|Sign up for the GitLab newsletter"
+msgstr ""
+
msgid "AdminArea|Stop all jobs"
msgstr "Zastavit všechny úlohy"
@@ -2606,9 +2634,15 @@ msgstr ""
msgid "AdminSettings|Disable public access to Pages sites"
msgstr ""
+msgid "AdminSettings|Display a banner on merge requests in projects with no pipelines to initiate steps to add a .gitlab-ci.yml file."
+msgstr ""
+
msgid "AdminSettings|Domain verification is an essential security measure for public GitLab sites. Users are required to demonstrate they control a domain before it is enabled. %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "AdminSettings|Enable pipeline suggestion banner"
+msgstr ""
+
msgid "AdminSettings|Enable shared runners for new projects"
msgstr ""
@@ -3080,10 +3114,10 @@ msgstr ""
msgid "Admin|Quarterly reconciliation will occur on %{qrtlyDate}"
msgstr ""
-msgid "Admin|The number of max seats used for your namespace is currently exceeding the number of seats in your subscription. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgid "Admin|The number of max seats in your namespace exceeds the number of seats in your subscription. On %{qrtlyDate}, quarterly reconciliation occurs and you are automatically billed a prorated amount for the overage. No action is needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice. For more information about the timing of the invoicing process, view the documentation."
msgstr ""
-msgid "Admin|The number of maximum users for your instance is currently exceeding the number of users in license. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgid "Admin|The number of max users in your instance exceeds the number of users in your license. On %{qrtlyDate}, quarterly reconciliation occurs and you are automatically billed a prorated amount for the overage. No action is needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice. For more information about the timing of the invoicing process, view the documentation."
msgstr ""
msgid "Admin|View pending user approvals"
@@ -3104,9 +3138,6 @@ msgstr ""
msgid "Advanced export options"
msgstr ""
-msgid "Advanced permissions, Large File Storage and Two-Factor authentication settings."
-msgstr ""
-
msgid "After a successful password update you will be redirected to login screen."
msgstr ""
@@ -3125,15 +3156,14 @@ msgstr ""
msgid "After you've reviewed these contribution guidelines, you'll be all set to"
msgstr ""
+msgid "Akismet"
+msgstr ""
+
msgid "Akismet API Key"
msgstr ""
-msgid "Alert"
-msgid_plural "Alerts"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
+msgid "Akismet helps prevent the creation of spam issues in public projects."
+msgstr ""
msgid "AlertManagement|Acknowledged"
msgstr ""
@@ -3489,6 +3519,9 @@ msgstr ""
msgid "All (default)"
msgstr ""
+msgid "All GitLab"
+msgstr ""
+
msgid "All Members"
msgstr ""
@@ -3603,6 +3636,9 @@ msgstr ""
msgid "Allow this secondary node to replicate content on Object Storage"
msgstr ""
+msgid "Allow use of licensed EE features"
+msgstr ""
+
msgid "Allow users to dismiss the broadcast message"
msgstr ""
@@ -3678,9 +3714,6 @@ msgstr ""
msgid "Amazon authentication is not %{link_start}correctly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
-msgid "Amount of time (in hours) that users are allowed to skip forced configuration of two-factor authentication"
-msgstr ""
-
msgid "An %{link_start}alert%{link_end} with the same fingerprint is already open. To change the status of this alert, resolve the linked alert."
msgstr ""
@@ -3741,12 +3774,6 @@ msgstr ""
msgid "An error occurred when removing the label."
msgstr ""
-msgid "An error occurred when toggling the notification subscription"
-msgstr ""
-
-msgid "An error occurred when updating the issue weight"
-msgstr ""
-
msgid "An error occurred when updating the title"
msgstr ""
@@ -3795,6 +3822,9 @@ msgstr ""
msgid "An error occurred while enabling Service Desk."
msgstr ""
+msgid "An error occurred while fetching Markdown preview"
+msgstr ""
+
msgid "An error occurred while fetching ancestors"
msgstr ""
@@ -3825,9 +3855,6 @@ msgstr ""
msgid "An error occurred while fetching label colors."
msgstr ""
-msgid "An error occurred while fetching markdown preview"
-msgstr ""
-
msgid "An error occurred while fetching participants"
msgstr ""
@@ -3843,9 +3870,6 @@ msgstr ""
msgid "An error occurred while fetching reference"
msgstr ""
-msgid "An error occurred while fetching sidebar data"
-msgstr ""
-
msgid "An error occurred while fetching tags. Retry the search."
msgstr ""
@@ -3921,6 +3945,9 @@ msgstr ""
msgid "An error occurred while loading merge requests."
msgstr ""
+msgid "An error occurred while loading projects."
+msgstr ""
+
msgid "An error occurred while loading the Needs tab."
msgstr ""
@@ -4155,12 +4182,6 @@ msgstr ""
msgid "Any Milestone"
msgstr ""
-msgid "Any branch"
-msgstr ""
-
-msgid "Any eligible user"
-msgstr ""
-
msgid "Any encrypted tokens"
msgstr ""
@@ -4179,6 +4200,9 @@ msgstr ""
msgid "Any namespace"
msgstr ""
+msgid "App Engine description and apps that are suitable for this deployment target"
+msgstr ""
+
msgid "App ID"
msgstr ""
@@ -4331,6 +4355,13 @@ msgstr ""
msgid "Apply"
msgstr ""
+msgid "Apply %d suggestion"
+msgid_plural "Apply %d suggestions"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "Apply a label"
msgstr ""
@@ -4340,13 +4371,10 @@ msgstr ""
msgid "Apply suggestion"
msgstr ""
-msgid "Apply suggestions"
-msgstr ""
-
msgid "Apply template"
msgstr ""
-msgid "Apply this approval rule to any branch or a specific protected branch."
+msgid "Apply this approval rule to all branches or a specific protected branch."
msgstr ""
msgid "Applying"
@@ -4497,9 +4525,6 @@ msgstr ""
msgid "ApprovalSettings|Prevent editing approval rules in projects and merge requests."
msgstr ""
-msgid "ApprovalSettings|Prevent editing approval rules in projects and merge requests. "
-msgstr ""
-
msgid "ApprovalSettings|Remove all approvals when commits are added to the source branch."
msgstr ""
@@ -4515,6 +4540,9 @@ msgstr ""
msgid "ApprovalSettings|This setting is configured at the instance level and can only be changed by an administrator."
msgstr ""
+msgid "ApprovalSettings|This setting is configured in %{groupName} and can only be changed by an administrator or group owner."
+msgstr ""
+
msgid "ApprovalStatusTooltip|Adheres to separation of duties"
msgstr ""
@@ -5007,9 +5035,6 @@ msgstr ""
msgid "Authenticated API rate limit period in seconds"
msgstr ""
-msgid "Authenticated API request rate limit"
-msgstr ""
-
msgid "Authenticated API requests"
msgstr ""
@@ -5019,10 +5044,10 @@ msgstr ""
msgid "Authenticated Git LFS request rate limit"
msgstr ""
-msgid "Authenticated web rate limit period in seconds"
+msgid "Authenticated Git LFS requests"
msgstr ""
-msgid "Authenticated web request rate limit"
+msgid "Authenticated web rate limit period in seconds"
msgstr ""
msgid "Authenticated web requests"
@@ -5400,9 +5425,6 @@ msgstr ""
msgid "Below you will find all the groups that are public."
msgstr ""
-msgid "Beta"
-msgstr ""
-
msgid "Bi-weekly code coverage"
msgstr ""
@@ -5644,6 +5666,21 @@ msgstr ""
msgid "Board scope affects which issues are displayed for anyone who visits this board"
msgstr ""
+msgid "BoardNewEpic|Groups"
+msgstr ""
+
+msgid "BoardNewEpic|Loading groups"
+msgstr ""
+
+msgid "BoardNewEpic|No matching results"
+msgstr ""
+
+msgid "BoardNewEpic|Search groups"
+msgstr ""
+
+msgid "BoardNewEpic|Select a group"
+msgstr ""
+
msgid "BoardNewIssue|No matching results"
msgstr ""
@@ -5723,6 +5760,9 @@ msgstr ""
msgid "Boards|An error occurred while creating the list. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching child groups. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching group projects. Please try again."
msgstr ""
@@ -6057,6 +6097,9 @@ msgstr ""
msgid "Bulk update"
msgstr ""
+msgid "BulkImports|Re-import creates a new group. It does not sync with the existing group."
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -6066,6 +6109,9 @@ msgstr ""
msgid "BulkImport|From source group"
msgstr ""
+msgid "BulkImport|Group import history"
+msgstr ""
+
msgid "BulkImport|Import failed: Destination cannot be a subgroup of the source group. Change the destination and try again."
msgstr ""
@@ -6078,9 +6124,18 @@ msgstr ""
msgid "BulkImport|Importing the group failed"
msgstr ""
+msgid "BulkImport|Last imported to %{link}"
+msgstr ""
+
msgid "BulkImport|Name already exists."
msgstr ""
+msgid "BulkImport|New group"
+msgstr ""
+
+msgid "BulkImport|No history is available"
+msgstr ""
+
msgid "BulkImport|No parent"
msgstr ""
@@ -6093,6 +6148,9 @@ msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} matching filter \"%{filter}\" from %{link}"
msgstr ""
+msgid "BulkImport|Source group"
+msgstr ""
+
msgid "BulkImport|To new group"
msgstr ""
@@ -6102,6 +6160,9 @@ msgstr ""
msgid "BulkImport|You have no groups to import"
msgstr ""
+msgid "BulkImport|Your imported groups will appear here."
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -6346,6 +6407,9 @@ msgstr ""
msgid "Can be manually deployed to"
msgstr ""
+msgid "Can be overridden in each project."
+msgstr ""
+
msgid "Can create groups:"
msgstr ""
@@ -6448,6 +6512,9 @@ msgstr ""
msgid "Cancelling Preview"
msgstr ""
+msgid "Cannot assign a confidential epic to a non-confidential issue. Make the issue confidential and try again"
+msgstr ""
+
msgid "Cannot be assigned to other projects."
msgstr ""
@@ -6499,9 +6566,6 @@ msgstr ""
msgid "Cannot refer to a group %{timebox_type} by an internal id!"
msgstr ""
-msgid "Cannot set confidential epic for a non-confidential issue"
-msgstr ""
-
msgid "Cannot show preview. For previews on sketch files, they must have the file format introduced by Sketch version 43 and above."
msgstr ""
@@ -6739,15 +6803,15 @@ msgstr ""
msgid "Check out, review, and merge locally"
msgstr ""
-msgid "Check the %{docs_link_start}documentation%{docs_link_end}."
-msgstr ""
-
msgid "Check the current instance configuration "
msgstr ""
msgid "Check the elasticsearch.log file to debug why the migration was halted and make any changes before retrying the migration. When you fix the cause of the failure, click \"Retry migration\", and the migration will be scheduled to be retried in the background."
msgstr ""
+msgid "Check with your administrator."
+msgstr ""
+
msgid "Check your Docker images for known vulnerabilities."
msgstr ""
@@ -6778,6 +6842,9 @@ msgstr ""
msgid "Checkout"
msgstr ""
+msgid "Checkout|$%{selectedPlanPrice} per 10 GB storage per pack"
+msgstr ""
+
msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 minutes"
msgstr ""
@@ -6800,19 +6867,25 @@ msgstr ""
msgid "Checkout|%{name}'s GitLab subscription"
msgstr ""
-msgid "Checkout|%{selectedPlanText} plan"
+msgid "Checkout|%{name}'s storage subscription"
msgstr ""
-msgid "Checkout|%{startDate} - %{endDate}"
+msgid "Checkout|%{quantity} GB of storage"
msgstr ""
-msgid "Checkout|%{totalCiMinutes} CI minute"
-msgid_plural "Checkout|%{totalCiMinutes} CI minutes"
+msgid "Checkout|%{quantity} storage pack"
+msgid_plural "Checkout|%{quantity} storage packs"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "Checkout|%{selectedPlanText} plan"
+msgstr ""
+
+msgid "Checkout|%{startDate} - %{endDate}"
+msgstr ""
+
msgid "Checkout|%{totalCiMinutes} CI minutes"
msgstr ""
@@ -6888,6 +6961,9 @@ msgstr ""
msgid "Checkout|Failed to register credit card. Please try again."
msgstr ""
+msgid "Checkout|GB"
+msgstr ""
+
msgid "Checkout|GitLab group"
msgstr ""
@@ -6924,6 +7000,9 @@ msgstr ""
msgid "Checkout|State"
msgstr ""
+msgid "Checkout|Storage packs"
+msgstr ""
+
msgid "Checkout|Street address"
msgstr ""
@@ -6945,6 +7024,9 @@ msgstr ""
msgid "Checkout|Total minutes: %{quantity}"
msgstr ""
+msgid "Checkout|Total storage: %{quantity} GB"
+msgstr ""
+
msgid "Checkout|Users"
msgstr ""
@@ -6954,16 +7036,25 @@ msgstr ""
msgid "Checkout|Your organization"
msgstr ""
+msgid "Checkout|Your storage subscription has the same term as your main subscription, and the price is prorated accordingly."
+msgstr ""
+
msgid "Checkout|Your subscription will be applied to this group"
msgstr ""
msgid "Checkout|Zip code"
msgstr ""
+msgid "Checkout|a storage subscription"
+msgstr ""
+
msgid "Checkout|company or team"
msgstr ""
-msgid "Checkout|x 1,000 minutes per pack = %{strong}"
+msgid "Checkout|minutes"
+msgstr ""
+
+msgid "Checkout|x %{quantity} %{units} per pack ="
msgstr ""
msgid "Cherry-pick this commit"
@@ -7320,6 +7411,9 @@ msgstr ""
msgid "CloneIssue|Cannot clone issue to target project as it is pending deletion."
msgstr ""
+msgid "CloneIssue|Cannot clone issues of '%{issue_type}' type."
+msgstr ""
+
msgid "Cloned this issue to %{path_to_project}."
msgstr ""
@@ -7374,7 +7468,10 @@ msgstr ""
msgid "Closes this %{quick_action_target}."
msgstr ""
-msgid "Cloud licenses can not be removed."
+msgid "Cloud Functions description and apps that are suitable for this deployment target"
+msgstr ""
+
+msgid "Cloud Run description and apps that are suitable for this deployment target"
msgstr ""
msgid "Cluster"
@@ -7401,6 +7498,12 @@ msgstr ""
msgid "ClusterAgents|Access tokens"
msgstr ""
+msgid "ClusterAgents|Agent might not be connected to GitLab"
+msgstr ""
+
+msgid "ClusterAgents|Agent never connected to GitLab"
+msgstr ""
+
msgid "ClusterAgents|Alternative installation methods"
msgstr ""
@@ -7416,6 +7519,12 @@ msgstr ""
msgid "ClusterAgents|Configuration"
msgstr ""
+msgid "ClusterAgents|Connected"
+msgstr ""
+
+msgid "ClusterAgents|Connection status"
+msgstr ""
+
msgid "ClusterAgents|Copy token"
msgstr ""
@@ -7434,6 +7543,9 @@ msgstr ""
msgid "ClusterAgents|For alternative installation methods %{linkStart}go to the documentation%{linkEnd}."
msgstr ""
+msgid "ClusterAgents|For more troubleshooting information go to"
+msgstr ""
+
msgid "ClusterAgents|Go to the repository"
msgstr ""
@@ -7449,18 +7561,30 @@ msgstr ""
msgid "ClusterAgents|Integrate with the GitLab Agent"
msgstr ""
-msgid "ClusterAgents|Last used"
+msgid "ClusterAgents|Last connected %{timeAgo}."
+msgstr ""
+
+msgid "ClusterAgents|Last contact"
msgstr ""
msgid "ClusterAgents|Learn how to create an agent access token"
msgstr ""
+msgid "ClusterAgents|Make sure you are using a valid token."
+msgstr ""
+
msgid "ClusterAgents|Name"
msgstr ""
msgid "ClusterAgents|Never"
msgstr ""
+msgid "ClusterAgents|Never connected"
+msgstr ""
+
+msgid "ClusterAgents|Not connected"
+msgstr ""
+
msgid "ClusterAgents|Read more about getting started"
msgstr ""
@@ -7482,6 +7606,9 @@ msgstr ""
msgid "ClusterAgents|Select which Agent you want to install"
msgstr ""
+msgid "ClusterAgents|The Agent has not been connected in a long time. There might be a connectivity issue. Last contact was %{timeAgo}."
+msgstr ""
+
msgid "ClusterAgents|The GitLab Agent also requires %{linkStart}enabling the Agent Server%{linkEnd}"
msgstr ""
@@ -7509,9 +7636,6 @@ msgstr ""
msgid "ClusterAgents|You will need to create a token to connect to your agent"
msgstr ""
-msgid "ClusterAgent|This feature is only available for premium plans"
-msgstr ""
-
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -7701,9 +7825,6 @@ msgstr ""
msgid "ClusterIntegration|Create Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Create a provision role on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the account and external ID above. %{startMoreInfoLink}More information%{endLink}"
-msgstr ""
-
msgid "ClusterIntegration|Create cluster on"
msgstr ""
@@ -8136,7 +8257,7 @@ msgstr ""
msgid "ClusterIntegration|Subnets"
msgstr ""
-msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provisioned role, first create one on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the above account and external IDs. %{startMoreInfoLink}More information%{endLink}"
+msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provisioned role, first create one on %{awsLinkStart}Amazon Web Services %{awsLinkEnd} using the above account and external IDs. %{moreInfoStart}More information%{moreInfoEnd}"
msgstr ""
msgid "ClusterIntegration|The Kubernetes certificate used to authenticate to the cluster."
@@ -8370,6 +8491,9 @@ msgstr ""
msgid "Collapse replies"
msgstr ""
+msgid "Collapse settings section"
+msgstr ""
+
msgid "Collapse sidebar"
msgstr ""
@@ -8388,6 +8512,9 @@ msgstr ""
msgid "Comma-separated list of email addresses."
msgstr ""
+msgid "Comma-separated list of users allowed to exceed the rate limit."
+msgstr ""
+
msgid "Comma-separated, e.g. '1.1.1.1, 2.2.2.0/24'"
msgstr ""
@@ -8710,6 +8837,9 @@ msgstr ""
msgid "Configure %{repository_checks_link_start}repository checks%{link_end} and %{housekeeping_link_start}housekeeping%{link_end} on repositories."
msgstr ""
+msgid "Configure CAPTCHAs, IP address limits, and other anti-spam measures."
+msgstr ""
+
msgid "Configure Dependency Scanning in `.gitlab-ci.yml` using the GitLab managed template. You can [add variable overrides](https://docs.gitlab.com/ee/user/application_security/dependency_scanning/#customizing-the-dependency-scanning-settings) to customize Dependency Scanning settings."
msgstr ""
@@ -8746,16 +8876,13 @@ msgstr ""
msgid "Configure a %{codeStart}.gitlab-webide.yml%{codeEnd} file in the %{codeStart}.gitlab%{codeEnd} directory to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
msgstr ""
-msgid "Configure existing installation"
-msgstr ""
-
-msgid "Configure limit for notes created per minute by web and API requests."
+msgid "Configure advanced permissions, Large File Storage, and two-factor authentication settings."
msgstr ""
-msgid "Configure limits for Project/Group Import/Export."
+msgid "Configure approvals by authors and committers on all projects."
msgstr ""
-msgid "Configure limits for web and API requests."
+msgid "Configure existing installation"
msgstr ""
msgid "Configure paths to be protected by Rack Attack."
@@ -8770,10 +8897,13 @@ msgstr ""
msgid "Configure settings for Advanced Search with Elasticsearch."
msgstr ""
+msgid "Configure specific limits for Files API requests that supersede the general user and IP rate limits."
+msgstr ""
+
msgid "Configure specific limits for Git LFS requests that supersede the general user and IP rate limits."
msgstr ""
-msgid "Configure specific limits for Packages API requests that supersede the general user and IP rate limits."
+msgid "Configure specific limits for deprecated API requests that supersede the general user and IP rate limits."
msgstr ""
msgid "Configure the %{link} integration."
@@ -8785,6 +8915,9 @@ msgstr ""
msgid "Configure the way a user creates a new account."
msgstr ""
+msgid "Configure via Merge Request"
+msgstr ""
+
msgid "Configure which lists are shown for anyone who visits this board"
msgstr ""
@@ -9259,6 +9392,9 @@ msgstr ""
msgid "Content parsed with %{link}."
msgstr ""
+msgid "ContentEditor|Table of Contents"
+msgstr ""
+
msgid "ContentEditor|You have to provide a renderMarkdown function or a custom serializer"
msgstr ""
@@ -9445,6 +9581,9 @@ msgstr ""
msgid "Copy link to chart"
msgstr ""
+msgid "Copy prefix"
+msgstr ""
+
msgid "Copy reference"
msgstr ""
@@ -9475,6 +9614,9 @@ msgstr ""
msgid "Copy value"
msgstr ""
+msgid "Corpus Management"
+msgstr ""
+
msgid "Corpus Management|Are you sure you want to delete the corpus?"
msgstr ""
@@ -9703,6 +9845,9 @@ msgstr ""
msgid "Create commit"
msgstr ""
+msgid "Create common files more quickly, and standardize their format."
+msgstr ""
+
msgid "Create confidential merge request"
msgstr ""
@@ -9736,6 +9881,9 @@ msgstr ""
msgid "Create issue"
msgstr ""
+msgid "Create issue to resolve all threads"
+msgstr ""
+
msgid "Create iteration"
msgstr ""
@@ -9790,6 +9938,9 @@ msgstr ""
msgid "Create new..."
msgstr ""
+msgid "Create or import your first project"
+msgstr ""
+
msgid "Create project"
msgstr ""
@@ -10147,7 +10298,7 @@ msgstr ""
msgid "Custom notification events"
msgstr ""
-msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notificationLinkStart} notification emails%{notificationLinkEnd}."
+msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notificationLinkStart}notification emails%{notificationLinkEnd}."
msgstr ""
msgid "Custom project templates"
@@ -10350,10 +10501,10 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-msgid "CycleAnalytics|Showing data for group '%{groupName}' and %{selectedProjectCount} projects from %{startDate} to %{endDate}"
+msgid "CycleAnalytics|Showing data for group '%{groupName}' and %{selectedProjectCount} projects from %{createdAfter} to %{createdBefore}"
msgstr ""
-msgid "CycleAnalytics|Showing data for group '%{groupName}' from %{startDate} to %{endDate}"
+msgid "CycleAnalytics|Showing data for group '%{groupName}' from %{createdAfter} to %{createdBefore}"
msgstr ""
msgid "CycleAnalytics|Stages"
@@ -10587,6 +10738,9 @@ msgstr ""
msgid "DastProfiles|Manage profiles"
msgstr ""
+msgid "DastProfiles|Manage site profiles"
+msgstr ""
+
msgid "DastProfiles|Minimum = 0 (no timeout enabled), Maximum = 2880 minutes"
msgstr ""
@@ -10662,6 +10816,9 @@ msgstr ""
msgid "DastProfiles|Scanner name"
msgstr ""
+msgid "DastProfiles|Schedule"
+msgstr ""
+
msgid "DastProfiles|Select branch"
msgstr ""
@@ -10731,7 +10888,7 @@ msgstr ""
msgid "DastProfiles|Website"
msgstr ""
-msgid "DastProfiles|You can either choose a passive scan or validate the target site in your chosen site profile. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
+msgid "DastProfiles|You can either choose a passive scan or validate the target site from the site profile management page. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
msgstr ""
msgid "DastProfiles|You cannot run an active scan against an unvalidated site."
@@ -10906,7 +11063,7 @@ msgstr ""
msgid "Days to merge"
msgstr ""
-msgid "Deactivate dormant users after 90 days of inactivity. Users can return to active status by signing in to their account. While inactive, a user is not counted as an active user in the instance."
+msgid "Deactivate dormant users after 90 days of inactivity"
msgstr ""
msgid "Dear Administrator,"
@@ -10993,10 +11150,10 @@ msgstr ""
msgid "Define a custom pattern with cron syntax"
msgstr ""
-msgid "Define approval settings."
+msgid "Define approval rules."
msgstr ""
-msgid "Define approval settings. %{linkStart}Learn more.%{linkEnd}"
+msgid "Define approval rules. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "Define custom rules for what constitutes spam, independent of Akismet"
@@ -11005,7 +11162,7 @@ msgstr ""
msgid "Define environments in the deploy stage(s) in %{code_open}.gitlab-ci.yml%{code_close} to track deployments here."
msgstr ""
-msgid "Define how approval rules are applied as a merge request moves toward completion."
+msgid "Define how approval rules are applied to merge requests."
msgstr ""
msgid "Definition"
@@ -11020,6 +11177,12 @@ msgstr ""
msgid "DelayedJobs|Are you sure you want to run %{job_name} immediately? This job will run automatically after it's timer finishes."
msgstr ""
+msgid "DelayedJobs|Are you sure you want to run %{job_name} immediately? This job will run automatically after its timer finishes."
+msgstr ""
+
+msgid "DelayedJobs|Run the delayed job now?"
+msgstr ""
+
msgid "DelayedJobs|Start now"
msgstr ""
@@ -11302,6 +11465,12 @@ msgstr ""
msgid "Dependency proxy image prefix"
msgstr ""
+msgid "DependencyProxy|Create a local proxy for storing frequently used upstream images. %{docLinkStart}Learn more%{docLinkEnd} about dependency proxies."
+msgstr ""
+
+msgid "DependencyProxy|Dependency Proxy"
+msgstr ""
+
msgid "DependencyProxy|Toggle Dependency Proxy"
msgstr ""
@@ -11548,6 +11717,9 @@ msgstr ""
msgid "Deployments"
msgstr ""
+msgid "Deployments to Google Kubernetes Engine can be "
+msgstr ""
+
msgid "Deployments|%{deployments} environment impacted."
msgid_plural "Deployments|%{deployments} environments impacted."
msgstr[0] ""
@@ -11579,6 +11751,9 @@ msgstr ""
msgid "Deployment|success"
msgstr ""
+msgid "Deprecated API rate limits"
+msgstr ""
+
msgid "Deprioritize label"
msgstr ""
@@ -11981,6 +12156,20 @@ msgstr ""
msgid "DiffsCompareBaseBranch|(base)"
msgstr ""
+msgid "Diffs|%d addition"
+msgid_plural "Diffs|%d additions"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
+msgid "Diffs|%d deletion"
+msgid_plural "Diffs|%d deletions"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "Diffs|No file name available"
msgstr ""
@@ -11990,9 +12179,19 @@ msgstr ""
msgid "Diffs|Show all unchanged lines"
msgstr ""
+msgid "Diffs|Showing %{dropdownStart}%{count} changed file%{dropdownEnd}"
+msgid_plural "Diffs|Showing %{dropdownStart}%{count} changed files%{dropdownEnd}"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "Diffs|Something went wrong while fetching diff lines."
msgstr ""
+msgid "Diffs|with %{additions} and %{deletions}"
+msgstr ""
+
msgid "Direct member"
msgstr ""
@@ -12120,9 +12319,6 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-msgid "Dismiss Value Stream Analytics introduction box"
-msgstr ""
-
msgid "Dismiss merge request promotion"
msgstr ""
@@ -12444,6 +12640,9 @@ msgstr ""
msgid "Edit issues"
msgstr ""
+msgid "Edit merge requests"
+msgstr ""
+
msgid "Edit public deploy key"
msgstr ""
@@ -12519,6 +12718,9 @@ msgstr ""
msgid "Elastic|None. Select projects to index."
msgstr ""
+msgid "Eligible users"
+msgstr ""
+
msgid "Email"
msgstr ""
@@ -12648,6 +12850,9 @@ msgstr ""
msgid "Enable"
msgstr ""
+msgid "Enable Amazon EKS integration"
+msgstr ""
+
msgid "Enable Auto DevOps"
msgstr ""
@@ -12681,6 +12886,9 @@ msgstr ""
msgid "Enable SSL verification"
msgstr ""
+msgid "Enable Service Ping"
+msgstr ""
+
msgid "Enable Snowplow tracking"
msgstr ""
@@ -12711,6 +12919,9 @@ msgstr ""
msgid "Enable authenticated Git LFS request rate limit"
msgstr ""
+msgid "Enable authenticated web request rate limit"
+msgstr ""
+
msgid "Enable authentication"
msgstr ""
@@ -12771,7 +12982,7 @@ msgstr ""
msgid "Enable or disable the Pseudonymizer data collection."
msgstr ""
-msgid "Enable or disable version check and service ping."
+msgid "Enable or disable version check and Service Ping."
msgstr ""
msgid "Enable protected paths rate limit"
@@ -12783,18 +12994,12 @@ msgstr ""
msgid "Enable reCAPTCHA"
msgstr ""
-msgid "Enable reCAPTCHA for login"
-msgstr ""
-
-msgid "Enable reCAPTCHA, Invisible Captcha, Akismet and set IP limits. For reCAPTCHA, we currently only support %{recaptcha_v2_link_start}v2%{recaptcha_v2_link_end}"
+msgid "Enable reCAPTCHA for login."
msgstr ""
msgid "Enable repository checks"
msgstr ""
-msgid "Enable service ping"
-msgstr ""
-
msgid "Enable shared runners for all projects and subgroups in this group."
msgstr ""
@@ -12816,7 +13021,10 @@ msgstr ""
msgid "Enable unauthenticated API request rate limit"
msgstr ""
-msgid "Enable unauthenticated request rate limit"
+msgid "Enable unauthenticated web request rate limit"
+msgstr ""
+
+msgid "Enable user deactivation emails"
msgstr ""
msgid "Enable version check"
@@ -12852,9 +13060,6 @@ msgstr ""
msgid "Enabled sources for code import during project creation. OmniAuth must be configured for GitHub"
msgstr ""
-msgid "Enabling this will only make licensed EE features available to projects if the project namespace's plan includes the feature or if the project is public."
-msgstr ""
-
msgid "Encountered an error while rendering: %{err}"
msgstr ""
@@ -12903,9 +13108,6 @@ msgstr ""
msgid "Enter Admin Mode"
msgstr ""
-msgid "Enter IP address range"
-msgstr ""
-
msgid "Enter a number"
msgstr ""
@@ -12918,9 +13120,6 @@ msgstr ""
msgid "Enter at least three characters to search"
msgstr ""
-msgid "Enter domain"
-msgstr ""
-
msgid "Enter in your Bitbucket Server URL and personal access token below"
msgstr ""
@@ -13107,9 +13306,6 @@ msgstr ""
msgid "Environments|Deployment %{status}"
msgstr ""
-msgid "Environments|Dismiss"
-msgstr ""
-
msgid "Environments|Enable review app"
msgstr ""
@@ -13122,9 +13318,6 @@ msgstr ""
msgid "Environments|Environments are places where code gets deployed, such as staging or production."
msgstr ""
-msgid "Environments|Help us improve environments"
-msgstr ""
-
msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
msgstr ""
@@ -13161,6 +13354,9 @@ msgstr ""
msgid "Environments|Note that this action will stop the environment, but it will %{emphasisStart}not%{emphasisEnd} have an effect on any existing deployment due to no “stop environment action†being defined in the %{ciConfigLinkStart}.gitlab-ci.yml%{ciConfigLinkEnd} file."
msgstr ""
+msgid "Environments|Open"
+msgstr ""
+
msgid "Environments|Open live environment"
msgstr ""
@@ -13200,9 +13396,6 @@ msgstr ""
msgid "Environments|Stopping %{environmentName}"
msgstr ""
-msgid "Environments|Take the survey"
-msgstr ""
-
msgid "Environments|There was an error fetching the logs. Please try again."
msgstr ""
@@ -13224,9 +13417,6 @@ msgstr ""
msgid "Environments|You don't have any environments right now"
msgstr ""
-msgid "Environments|Your feedback helps GitLab make environments better for you and other users. Participate and enter a sweepstake to win a USD 30 gift card."
-msgstr ""
-
msgid "Environments|by %{avatar}"
msgstr ""
@@ -13509,7 +13699,7 @@ msgstr ""
msgid "Error parsing CSV file. Please make sure it has"
msgstr ""
-msgid "Error rendering markdown preview"
+msgid "Error rendering Markdown preview"
msgstr ""
msgid "Error saving label update."
@@ -13557,6 +13747,9 @@ msgstr ""
msgid "Error: %{error_message}"
msgstr ""
+msgid "Error: Couldn't load some or all of the changes."
+msgstr ""
+
msgid "Error: No AWS credentials were supplied"
msgstr ""
@@ -13590,6 +13783,9 @@ msgstr ""
msgid "ErrorTracking|Enable error tracking"
msgstr ""
+msgid "ErrorTracking|Error tracking backend"
+msgstr ""
+
msgid "ErrorTracking|If you self-host Sentry, enter your Sentry instance's full URL. If you use Sentry's hosted solution, enter https://sentry.io"
msgstr ""
@@ -13623,6 +13819,12 @@ msgstr ""
msgid "Escalation policies must have at least one rule"
msgstr ""
+msgid "EscalationPolicies|%{clockIcon} IF alert is not %{alertStatus} in %{minutes}"
+msgstr ""
+
+msgid "EscalationPolicies|%{notificationIcon} THEN %{doAction} %{forScheduleOrUser}"
+msgstr ""
+
msgid "EscalationPolicies|+ Add an additional rule"
msgstr ""
@@ -13665,13 +13867,13 @@ msgstr ""
msgid "EscalationPolicies|Escalation policies"
msgstr ""
-msgid "EscalationPolicies|Escalation rules"
+msgid "EscalationPolicies|Escalation policy %{obstacle} in Project %{project}"
msgstr ""
-msgid "EscalationPolicies|Failed to load oncall-schedules"
+msgid "EscalationPolicies|Escalation rules"
msgstr ""
-msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} %{then} THEN %{doAction} %{scheduleOrUser}"
+msgid "EscalationPolicies|Failed to load oncall-schedules"
msgstr ""
msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} minutes"
@@ -13749,18 +13951,36 @@ msgstr ""
msgid "Every %{action} attempt has failed: %{job_error_message}. Please try again."
msgstr ""
+msgid "Every 3 months"
+msgstr ""
+
+msgid "Every 3 months on the %{day} at %{time} %{timezone}"
+msgstr ""
+
+msgid "Every 6 months"
+msgstr ""
+
+msgid "Every 6 months on the %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Every day"
msgstr ""
msgid "Every day (at %{time})"
msgstr ""
+msgid "Every day at %{time} %{timezone}"
+msgstr ""
+
msgid "Every month"
msgstr ""
msgid "Every month (Day %{day} at %{time})"
msgstr ""
+msgid "Every month on the %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Every three months"
msgstr ""
@@ -13777,6 +13997,15 @@ msgstr[3] ""
msgid "Every week (%{weekday} at %{time})"
msgstr ""
+msgid "Every week on %{day} at %{time} %{timezone}"
+msgstr ""
+
+msgid "Every year"
+msgstr ""
+
+msgid "Every year on %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Everyone"
msgstr ""
@@ -13813,9 +14042,6 @@ msgstr ""
msgid "Exactly one of %{attributes} is required"
msgstr ""
-msgid "Example: %{ip_address}. %{read_more_link}."
-msgstr ""
-
msgid "Example: @sub\\.company\\.com$"
msgstr ""
@@ -13882,13 +14108,13 @@ msgstr ""
msgid "Expand pipeline"
msgstr ""
-msgid "Expand sidebar"
+msgid "Expand settings section"
msgstr ""
-msgid "Expected documents: %{expected_documents}"
+msgid "Expand sidebar"
msgstr ""
-msgid "Experienced"
+msgid "Expected documents: %{expected_documents}"
msgstr ""
msgid "ExperimentSubject|Must have exactly one of User, Namespace, or Project."
@@ -14173,9 +14399,6 @@ msgstr ""
msgid "Failed to load related branches"
msgstr ""
-msgid "Failed to load sidebar lock status"
-msgstr ""
-
msgid "Failed to load stacktrace."
msgstr ""
@@ -14604,6 +14827,9 @@ msgstr ""
msgid "Files"
msgstr ""
+msgid "Files API Rate Limits"
+msgstr ""
+
msgid "Files breadcrumb"
msgstr ""
@@ -15603,6 +15829,9 @@ msgstr ""
msgid "GitLab group: %{source_link}"
msgstr ""
+msgid "GitLab informs you if a new version is available."
+msgstr ""
+
msgid "GitLab is a complete DevOps platform, delivered as a single application, fundamentally changing the way Development, Security, and Ops teams collaborate"
msgstr ""
@@ -15618,7 +15847,7 @@ msgstr ""
msgid "GitLab is open source software to collaborate on code."
msgstr ""
-msgid "GitLab is undergoing maintenance and is operating in a read-only mode."
+msgid "GitLab is undergoing maintenance and is operating in read-only mode."
msgstr ""
msgid "GitLab member or Email address"
@@ -15630,9 +15859,6 @@ msgstr ""
msgid "GitLab project export"
msgstr ""
-msgid "GitLab restart is required to apply changes."
-msgstr ""
-
msgid "GitLab single sign-on URL"
msgstr ""
@@ -15648,9 +15874,6 @@ msgstr ""
msgid "GitLab version"
msgstr ""
-msgid "GitLab will inform you if a new version is available."
-msgstr ""
-
msgid "GitLab will run a background job that will produce pseudonymized CSVs of the GitLab database that will be uploaded to your configured object storage directory."
msgstr ""
@@ -15915,9 +16138,21 @@ msgstr ""
msgid "Go to snippets"
msgstr ""
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check 'Allowed domains for sign-ups'."
+msgstr ""
+
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check 'Email restrictions for sign-ups'."
+msgstr ""
+
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check the 'Domain denylist'."
+msgstr ""
+
msgid "Go to the activity feed"
msgstr ""
+msgid "Go to the group’s 'Settings &gt; General' page, and check 'Restrict membership by email domain'."
+msgstr ""
+
msgid "Go to the milestone list"
msgstr ""
@@ -15954,6 +16189,12 @@ msgstr ""
msgid "Goal of the changes and what reviewers should be aware of"
msgstr ""
+msgid "Google Cloud"
+msgstr ""
+
+msgid "Google Cloud offers several deployment targets. Select the one most suitable for your project."
+msgstr ""
+
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
@@ -16038,9 +16279,6 @@ msgstr ""
msgid "Group ID"
msgstr ""
-msgid "Group ID: %{group_id}"
-msgstr ""
-
msgid "Group Owner must have signed in with SAML before enabling Group Managed Accounts"
msgstr ""
@@ -16215,6 +16453,12 @@ msgstr ""
msgid "GroupImport|Unable to process group import file"
msgstr ""
+msgid "GroupPage|Copy group ID"
+msgstr ""
+
+msgid "GroupPage|Group ID: %{group_id}"
+msgstr ""
+
msgid "GroupRoadmap|%{dateWord} – No end date"
msgstr ""
@@ -16269,6 +16513,9 @@ msgstr ""
msgid "GroupRoadmap|Within 3 years"
msgstr ""
+msgid "GroupSAML|\"persistent\" recommended"
+msgstr ""
+
msgid "GroupSAML|%{strongOpen}Warning%{strongClose} - Enabling %{linkStart}SSO enforcement%{linkEnd} can reduce security risks."
msgstr ""
@@ -16401,6 +16648,9 @@ msgstr ""
msgid "GroupSAML|To be able to prohibit outer forks, you first need to enforce dedicate group managed accounts."
msgstr ""
+msgid "GroupSAML|Use SAML group links to manage group membership using SAML."
+msgstr ""
+
msgid "GroupSAML|Valid SAML Response"
msgstr ""
@@ -16413,13 +16663,10 @@ msgstr ""
msgid "GroupSAML|as %{access_level}"
msgstr ""
-msgid "GroupSAML|must match stored NameID of \"%{extern_uid}\" as we use this to identify users. If the NameID changes users will be unable to sign in."
-msgstr ""
-
-msgid "GroupSAML|should be \"persistent\""
+msgid "GroupSAML|must match stored NameID of \"%{extern_uid}\" to identify user and allow sign in"
msgstr ""
-msgid "GroupSAML|should be a random persistent ID, emails are discouraged"
+msgid "GroupSAML|recommend persistent ID instead of email"
msgstr ""
msgid "GroupSelect|No matching results"
@@ -16434,9 +16681,15 @@ msgstr ""
msgid "GroupSettings|Allow project access token creation"
msgstr ""
+msgid "GroupSettings|Applied to all subgroups unless overridden by a group owner. Groups already added to the project lose access."
+msgstr ""
+
msgid "GroupSettings|Auto DevOps pipeline was updated for the group"
msgstr ""
+msgid "GroupSettings|Available only on the top-level group. Applies to all subgroups. Groups already shared with a group outside %{group} are still shared unless removed manually."
+msgstr ""
+
msgid "GroupSettings|Badges"
msgstr ""
@@ -16488,6 +16741,9 @@ msgstr ""
msgid "GroupSettings|New runners registration token has been generated!"
msgstr ""
+msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgstr ""
+
msgid "GroupSettings|Pipeline settings was updated for the group"
msgstr ""
@@ -16500,12 +16756,15 @@ msgstr ""
msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
-msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups."
+msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups"
msgstr ""
msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
msgstr ""
+msgid "GroupSettings|Prevents group members from being notified if the group is mentioned."
+msgstr ""
+
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
msgstr ""
@@ -16542,21 +16801,6 @@ msgstr ""
msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}."
msgstr ""
-msgid "GroupSettings|This setting is only available on the top-level group and it applies to all subgroups. Groups that have already been shared with a group outside %{group} will still be shared, and this access will have to be revoked manually."
-msgstr ""
-
-msgid "GroupSettings|This setting will be applied to all subgroups unless overridden by a group owner. Groups that already have access to the project will continue to have access unless removed manually."
-msgstr ""
-
-msgid "GroupSettings|This setting will override user notification preferences for all members of the group, subgroups, and projects."
-msgstr ""
-
-msgid "GroupSettings|This setting will prevent group members from being notified if the group is mentioned."
-msgstr ""
-
-msgid "GroupSettings|This setting will prevent group members from forking projects outside of the group."
-msgstr ""
-
msgid "GroupSettings|Transfer group"
msgstr ""
@@ -16674,7 +16918,7 @@ msgstr ""
msgid "GroupsNew|No import options available"
msgstr ""
-msgid "GroupsNew|Not all related objects are migrated, as %{docs_link_start}described here%{docs_link_end}. Please %{feedback_link_start}leave feedback%{feedback_link_end} on this feature."
+msgid "GroupsNew|Not all related objects are migrated. %{docs_link_start}More info%{docs_link_end}."
msgstr ""
msgid "GroupsNew|Personal access token"
@@ -16806,15 +17050,27 @@ msgstr ""
msgid "Hello %{name},"
msgstr ""
-msgid "Hello there"
-msgstr ""
-
msgid "Hello, %{name}!"
msgstr ""
msgid "Hello, %{username}!"
msgstr ""
+msgid "HelloMessage|%{handshake_emoji} Contribute to GitLab: %{contribute_link}"
+msgstr ""
+
+msgid "HelloMessage|%{magnifier_emoji} Create a new GitLab issue: %{new_issue_link}"
+msgstr ""
+
+msgid "HelloMessage|%{rocket_emoji} We like your curiosity! Help us improve GitLab by joining the team: %{jobs_page_link}"
+msgstr ""
+
+msgid "HelloMessage|Does this page need fixes or improvements? Open an issue or contribute a merge request to help make GitLab more lovable. At GitLab, everyone can contribute!"
+msgstr ""
+
+msgid "HelloMessage|Welcome to GitLab!"
+msgstr ""
+
msgid "Help"
msgstr ""
@@ -16824,13 +17080,10 @@ msgstr ""
msgid "Helps prevent bots from creating accounts."
msgstr ""
-msgid "Helps prevent bots from creating issues"
+msgid "Helps prevent bots from creating issues."
msgstr ""
-msgid "Helps prevent malicious users hide their activity"
-msgstr ""
-
-msgid "Helps reduce request volume (e.g. from crawlers or abusive bots)"
+msgid "Helps prevent malicious users hide their activity."
msgstr ""
msgid "Helps reduce request volume (for example, from crawlers or abusive bots)"
@@ -16958,6 +17211,12 @@ msgstr ""
msgid "Housekeeping, export, path, transfer, remove, archive."
msgstr ""
+msgid "How do I configure Akismet?"
+msgstr ""
+
+msgid "How do I configure it?"
+msgstr ""
+
msgid "How do I configure runners?"
msgstr ""
@@ -16979,19 +17238,25 @@ msgstr ""
msgid "How do I set up this service?"
msgstr ""
+msgid "How do I use a web terminal?"
+msgstr ""
+
+msgid "How do I use file templates?"
+msgstr ""
+
msgid "How it works"
msgstr ""
msgid "How many days need to pass between marking entity for deletion and actual removing it."
msgstr ""
-msgid "How many seconds an IP will be counted towards the limit"
+msgid "How many seconds an IP counts toward the IP address limit."
msgstr ""
-msgid "I accept the %{terms_link}"
+msgid "How the job limiter handles jobs exceeding the thresholds specified below. The 'track' mode only logs the jobs. The 'compress' mode compresses the jobs and raises an exception if the compressed size exceeds the limit."
msgstr ""
-msgid "I accept the|Terms of Service and Privacy Policy"
+msgid "I accept the %{terms_link}"
msgstr ""
msgid "I forgot my password"
@@ -17075,13 +17340,16 @@ msgstr ""
msgid "IP Address"
msgstr ""
-msgid "IP expiration time"
+msgid "IP address expiration time"
msgstr ""
-msgid "IP subnet restriction only allowed for top-level groups"
+msgid "IP address restrictions"
+msgstr ""
+
+msgid "IP addresses per user"
msgstr ""
-msgid "IPs per user"
+msgid "IP subnet restriction only allowed for top-level groups"
msgstr ""
msgid "Identifier"
@@ -17096,6 +17364,9 @@ msgstr ""
msgid "If any indexed field exceeds this limit it will be truncated to this number of characters and the rest will not be indexed or searchable. This does not apply to repository and wiki indexing. Setting this to 0 means it is unlimited."
msgstr ""
+msgid "If blank, defaults to %{code_open}Retry later%{code_close}."
+msgstr ""
+
msgid "If blank, set allowable lifetime to %{instance_level_policy_in_words}, as defined by the instance admin. Once set, existing tokens for users in this group may be revoked."
msgstr ""
@@ -17147,6 +17418,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 did not initiate these sign-in attempts, please reach out to your administrator or enable two-factor authentication (2FA) on your account."
+msgstr ""
+
msgid "If you did not initiate this change, please contact your administrator immediately."
msgstr ""
@@ -17242,10 +17516,10 @@ msgstr ""
msgid "Import Projects from Gitea"
msgstr ""
-msgid "Import a project"
+msgid "Import an exported GitLab project"
msgstr ""
-msgid "Import an exported GitLab project"
+msgid "Import and export rate limits"
msgstr ""
msgid "Import failed due to a GitHub error: %{original}"
@@ -17257,12 +17531,18 @@ msgstr ""
msgid "Import from Jira"
msgstr ""
+msgid "Import group"
+msgstr ""
+
msgid "Import group from file"
msgstr ""
msgid "Import groups"
msgstr ""
+msgid "Import history"
+msgstr ""
+
msgid "Import in progress"
msgstr ""
@@ -17326,7 +17606,25 @@ msgstr ""
msgid "Import timed out. Import took longer than %{import_jobs_expiration} seconds"
msgstr ""
-msgid "Import/Export Rate Limits"
+msgid "ImportAProjectModal|Import from a project"
+msgstr ""
+
+msgid "ImportAProjectModal|Import members from another project"
+msgstr ""
+
+msgid "ImportAProjectModal|Import project members"
+msgstr ""
+
+msgid "ImportAProjectModal|Only project members (not group members) are imported, and they get the same permissions as the project you import from."
+msgstr ""
+
+msgid "ImportAProjectModal|Successfully imported"
+msgstr ""
+
+msgid "ImportAProjectModal|Unable to import project members"
+msgstr ""
+
+msgid "ImportAProjectModal|You're importing members to the %{strongStart}%{name}%{strongEnd} project."
msgstr ""
msgid "ImportButtons|Connect repositories from"
@@ -17381,7 +17679,7 @@ msgstr[3] ""
msgid "Importing..."
msgstr ""
-msgid "Import|A repository URL usually ends in a .git suffix, although this is not required. Double check to make sure your repository URL is correct."
+msgid "Import|There is not a valid Git repository at this URL. If your HTTP repository is not publicly accessible, verify your credentials."
msgstr ""
msgid "Improve customer support with Service Desk"
@@ -17390,9 +17688,6 @@ msgstr ""
msgid "Improves Git cloning performance."
msgstr ""
-msgid "In %{time_to_now}"
-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 ""
@@ -17678,7 +17973,7 @@ msgstr ""
msgid "InProductMarketing|Start a GitLab Ultimate trial today in less than one minute, no credit card required."
msgstr ""
-msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no CC required"
+msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no credit card required"
msgstr ""
msgid "InProductMarketing|Start a trial"
@@ -17717,7 +18012,7 @@ msgstr ""
msgid "InProductMarketing|Team up in GitLab for greater efficiency"
msgstr ""
-msgid "InProductMarketing|Team work makes the dream work"
+msgid "InProductMarketing|Team work makes the dream work"
msgstr ""
msgid "InProductMarketing|Test, create, deploy"
@@ -18300,6 +18595,9 @@ msgstr ""
msgid "Integrations|Create new issue in Jira"
msgstr ""
+msgid "Integrations|Create new issue in ZenTao"
+msgstr ""
+
msgid "Integrations|Default settings are inherited from the group level."
msgstr ""
@@ -18393,9 +18691,15 @@ msgstr ""
msgid "Integrations|Search Jira issues"
msgstr ""
+msgid "Integrations|Search ZenTao issues"
+msgstr ""
+
msgid "Integrations|Send notifications about project events to Unify Circuit."
msgstr ""
+msgid "Integrations|Send notifications about project events to a Unify Circuit conversation. %{docs_link}"
+msgstr ""
+
msgid "Integrations|Sign in to add namespaces"
msgstr ""
@@ -18435,6 +18739,9 @@ msgstr ""
msgid "Integrations|You've activated every integration 🎉"
msgstr ""
+msgid "Integrations|ZenTao issues display here when you create issues in your project in ZenTao."
+msgstr ""
+
msgid "Interactive mode"
msgstr ""
@@ -18462,9 +18769,6 @@ msgstr ""
msgid "Interval Pattern"
msgstr ""
-msgid "Introducing Value Stream Analytics"
-msgstr ""
-
msgid "Introducing Your DevOps Report"
msgstr ""
@@ -18561,6 +18865,12 @@ msgstr ""
msgid "Investigate vulnerability: %{title}"
msgstr ""
+msgid "Invisible Captcha"
+msgstr ""
+
+msgid "Invisible Captcha helps prevent the creation of spam accounts. It adds a honeypot field and time-sensitive form submission to the account signup form."
+msgstr ""
+
msgid "Invitation"
msgstr ""
@@ -19014,12 +19324,18 @@ msgstr ""
msgid "Issues"
msgstr ""
+msgid "Issues I've created"
+msgstr ""
+
msgid "Issues Rate Limits"
msgstr ""
msgid "Issues and merge requests"
msgstr ""
+msgid "Issues assigned to me"
+msgstr ""
+
msgid "Issues can be bugs, tasks or ideas to be discussed. Also, issues are searchable and filterable."
msgstr ""
@@ -19131,7 +19447,7 @@ msgstr ""
msgid "Iterations|Create cadence"
msgstr ""
-msgid "Iterations|Create your first iteration"
+msgid "Iterations|Create iteration"
msgstr ""
msgid "Iterations|Delete cadence"
@@ -19140,6 +19456,9 @@ msgstr ""
msgid "Iterations|Delete iteration cadence?"
msgstr ""
+msgid "Iterations|Delete iteration?"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -19173,12 +19492,18 @@ msgstr ""
msgid "Iterations|New iteration cadence"
msgstr ""
+msgid "Iterations|No closed iterations."
+msgstr ""
+
msgid "Iterations|No iteration cadences to show."
msgstr ""
msgid "Iterations|No iterations in cadence."
msgstr ""
+msgid "Iterations|No open iterations."
+msgstr ""
+
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
@@ -19209,6 +19534,9 @@ msgstr ""
msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
msgstr ""
+msgid "Iterations|This will remove the iteration from any issues that are assigned to it."
+msgstr ""
+
msgid "Iterations|Title"
msgstr ""
@@ -19224,15 +19552,9 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "I’m familiar with the basics of DevOps."
-msgstr ""
-
msgid "I’m joining my team who’s already on GitLab"
msgstr ""
-msgid "I’m not familiar with the basics of DevOps."
-msgstr ""
-
msgid "Jaeger URL"
msgstr ""
@@ -19497,6 +19819,9 @@ msgstr ""
msgid "Job"
msgstr ""
+msgid "Job %{jobName}"
+msgstr ""
+
msgid "Job Failed #%{build_id}"
msgstr ""
@@ -20089,9 +20414,6 @@ msgstr ""
msgid "Learn more in the"
msgstr ""
-msgid "Learn more in the|pipeline schedules documentation"
-msgstr ""
-
msgid "Learn more."
msgstr ""
@@ -20203,9 +20525,6 @@ msgstr ""
msgid "Leave Admin Mode"
msgstr ""
-msgid "Leave blank for no limit. Once set, existing personal access tokens may be revoked."
-msgstr ""
-
msgid "Leave edit mode? All unsaved changes will be lost."
msgstr ""
@@ -20251,10 +20570,10 @@ msgstr ""
msgid "LicenseCompliance|Acceptable license to be used in the project"
msgstr ""
-msgid "LicenseCompliance|Add a license"
+msgid "LicenseCompliance|Add license and related policy"
msgstr ""
-msgid "LicenseCompliance|Add license and related policy"
+msgid "LicenseCompliance|Add license policy"
msgstr ""
msgid "LicenseCompliance|Allow"
@@ -20356,6 +20675,9 @@ msgstr ""
msgid "LicenseManagement|Uncategorized"
msgstr ""
+msgid "Licensed Enterprise Edition features can be used if the project namespace's plan includes the feature, or if the project is public."
+msgstr ""
+
msgid "Licensed Features"
msgstr ""
@@ -20422,7 +20744,10 @@ msgstr ""
msgid "Limit namespaces and projects that can be indexed"
msgstr ""
-msgid "Limit sign in from multiple ips"
+msgid "Limit project size at a global, group, and project level. %{link_start}Learn more%{link_end}."
+msgstr ""
+
+msgid "Limit sign in from multiple IP addresses"
msgstr ""
msgid "Limit the number of concurrent operations this secondary site can run in the background."
@@ -20434,6 +20759,9 @@ msgstr ""
msgid "Limit the number of issues and epics per minute a user can create through web and API requests."
msgstr ""
+msgid "Limit the size of Sidekiq jobs stored in Redis."
+msgstr ""
+
msgid "Limited to showing %d event at most"
msgid_plural "Limited to showing %d events at most"
msgstr[0] ""
@@ -20441,6 +20769,9 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "Limiting mode"
+msgstr ""
+
msgid "Line changes"
msgstr ""
@@ -20510,9 +20841,6 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
-msgid "List of users to be excluded from the limit"
-msgstr ""
-
msgid "List options"
msgstr ""
@@ -20552,9 +20880,6 @@ msgstr ""
msgid "Loading functions timed out. Please reload the page to try again."
msgstr ""
-msgid "Loading issues"
-msgstr ""
-
msgid "Loading more"
msgstr ""
@@ -20846,6 +21171,9 @@ msgstr ""
msgid "Marked For Deletion At - %{deletion_time}"
msgstr ""
+msgid "Marked as ready. Merging is now allowed."
+msgstr ""
+
msgid "Marked this %{noun} as a draft."
msgstr ""
@@ -20918,52 +21246,22 @@ msgstr ""
msgid "Max 100,000 events"
msgstr ""
-msgid "Max 20 characters"
-msgstr ""
-
-msgid "Max Group Export Download requests per minute per user"
-msgstr ""
-
-msgid "Max Group Export requests per minute per user"
-msgstr ""
-
-msgid "Max Group Import requests per minute per user"
-msgstr ""
-
-msgid "Max Project Export Download requests per minute per user"
-msgstr ""
-
-msgid "Max Project Export requests per minute per user"
-msgstr ""
-
-msgid "Max Project Import requests per minute per user"
-msgstr ""
-
-msgid "Max authenticated API requests per period per user"
-msgstr ""
-
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
-msgid "Max authenticated web requests per period per user"
-msgstr ""
-
msgid "Max file size is 200 KB."
msgstr ""
-msgid "Max requests per minute per user"
-msgstr ""
-
msgid "Max role"
msgstr ""
msgid "Max session time"
msgstr ""
-msgid "Max unauthenticated requests per period per IP"
+msgid "MaxBuilds"
msgstr ""
-msgid "MaxBuilds"
+msgid "Maximum 20 characters"
msgstr ""
msgid "Maximum Conan package file size in bytes"
@@ -20999,6 +21297,12 @@ msgstr ""
msgid "Maximum attachment size (MB)"
msgstr ""
+msgid "Maximum authenticated API requests per rate limit period per user"
+msgstr ""
+
+msgid "Maximum authenticated web requests per rate limit period per user"
+msgstr ""
+
msgid "Maximum bulk request size (MiB)"
msgstr ""
@@ -21044,6 +21348,15 @@ msgstr ""
msgid "Maximum files in a diff"
msgstr ""
+msgid "Maximum group export download requests per minute"
+msgstr ""
+
+msgid "Maximum group export requests per minute"
+msgstr ""
+
+msgid "Maximum group import requests per minute"
+msgstr ""
+
msgid "Maximum import size"
msgstr ""
@@ -21080,7 +21393,7 @@ msgstr ""
msgid "Maximum number of projects."
msgstr ""
-msgid "Maximum number of unique IPs per user"
+msgid "Maximum number of unique IP addresses per user."
msgstr ""
msgid "Maximum page reached"
@@ -21089,12 +21402,24 @@ msgstr ""
msgid "Maximum page size"
msgstr ""
+msgid "Maximum project export download requests per minute"
+msgstr ""
+
+msgid "Maximum project export requests per minute"
+msgstr ""
+
+msgid "Maximum project import requests per minute"
+msgstr ""
+
msgid "Maximum push size"
msgstr ""
msgid "Maximum push size (MB)"
msgstr ""
+msgid "Maximum requests per minute"
+msgstr ""
+
msgid "Maximum running slices"
msgstr ""
@@ -21122,10 +21447,16 @@ msgstr ""
msgid "Maximum time between updates that a mirror can have when scheduled to synchronize."
msgstr ""
-msgid "Maximum time for web terminal websocket connection (in seconds). 0 for unlimited."
+msgid "Maximum time that users are allowed to skip the setup of two-factor authentication (in hours). Set to 0 (zero) to enforce at next sign in."
msgstr ""
-msgid "Maximum time that users are allowed to skip the setup of two-factor authentication (in hours). Set to 0 (zero) to enforce at next sign in."
+msgid "Maximum time, in seconds, for a web terminal websocket connection. 0 for unlimited."
+msgstr ""
+
+msgid "Maximum unauthenticated API requests per rate limit period per IP"
+msgstr ""
+
+msgid "Maximum unauthenticated web requests per rate limit period per IP"
msgstr ""
msgid "May"
@@ -21143,9 +21474,6 @@ msgstr ""
msgid "Medium vulnerabilities present"
msgstr ""
-msgid "Member lock"
-msgstr ""
-
msgid "Member since"
msgstr ""
@@ -21182,6 +21510,9 @@ msgstr ""
msgid "Members of a group may only view projects they have permission to access"
msgstr ""
+msgid "Membership"
+msgstr ""
+
msgid "Members|%{time} by %{user}"
msgstr ""
@@ -21242,9 +21573,6 @@ msgstr ""
msgid "Members|Expiration date updated successfully."
msgstr ""
-msgid "Members|Expired"
-msgstr ""
-
msgid "Members|Filter members"
msgstr ""
@@ -21260,9 +21588,6 @@ msgstr ""
msgid "Members|Membership"
msgstr ""
-msgid "Members|No expiration set"
-msgstr ""
-
msgid "Members|Remove \"%{groupName}\""
msgstr ""
@@ -21284,9 +21609,6 @@ msgstr ""
msgid "Members|Search invited"
msgstr ""
-msgid "Members|in %{time}"
-msgstr ""
-
msgid "Member|Deny access"
msgstr ""
@@ -21362,9 +21684,6 @@ msgstr ""
msgid "Merge request %{mr_link} was reviewed by %{mr_author}"
msgstr ""
-msgid "Merge request (MR) approvals"
-msgstr ""
-
msgid "Merge request analytics"
msgstr ""
@@ -21386,12 +21705,21 @@ msgstr ""
msgid "Merge requests"
msgstr ""
+msgid "Merge requests I've created"
+msgstr ""
+
msgid "Merge requests are a place to propose changes you've made to a project and discuss those changes with others"
msgstr ""
msgid "Merge requests are read-only in a secondary Geo node"
msgstr ""
+msgid "Merge requests assigned to me"
+msgstr ""
+
+msgid "Merge requests that I'm a reviewer"
+msgstr ""
+
msgid "Merge the branch and fix any conflicts that come up"
msgstr ""
@@ -21452,10 +21780,10 @@ msgstr ""
msgid "MergeRequests|An error occurred while saving the draft comment."
msgstr ""
-msgid "MergeRequests|Failed to squash. Should be done manually."
+msgid "MergeRequests|Create issue to resolve thread"
msgstr ""
-msgid "MergeRequests|Resolve this thread in a new issue"
+msgid "MergeRequests|Failed to squash. Should be done manually."
msgstr ""
msgid "MergeRequests|Saving the comment failed"
@@ -22273,6 +22601,9 @@ msgstr ""
msgid "MoveIssue|Cannot move issue to project it originates from!"
msgstr ""
+msgid "MoveIssue|Cannot move issues of '%{issue_type}' type."
+msgstr ""
+
msgid "Moved issue to %{label} column in the board."
msgstr ""
@@ -22400,6 +22731,15 @@ 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. To learn more about reducing storage capacity please visit our docs."
msgstr ""
+msgid "NamespaceUserCap|Pending users must be reviewed and approved by a group owner. Learn more about %{user_caps_link_start}User Caps%{link_end} and %{users_pending_approval_link_start}Users Pending Approval%{link_end}."
+msgstr ""
+
+msgid "NamespaceUserCap|View pending user approvals"
+msgstr ""
+
+msgid "NamespaceUserCap|Your group has reached its billable member limit"
+msgstr ""
+
msgid "Namespaces"
msgstr ""
@@ -22442,9 +22782,6 @@ msgstr ""
msgid "Network"
msgstr ""
-msgid "Network Policy|New rule"
-msgstr ""
-
msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is inbound from a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
msgstr ""
@@ -22466,16 +22803,13 @@ msgstr ""
msgid "NetworkPolicies|%{strongOpen}any%{strongClose} port"
msgstr ""
-msgid "NetworkPolicies|+ Add alert"
-msgstr ""
-
msgid "NetworkPolicies|.yaml"
msgstr ""
msgid "NetworkPolicies|.yaml mode"
msgstr ""
-msgid "NetworkPolicies|Actions"
+msgid "NetworkPolicies|Add alert"
msgstr ""
msgid "NetworkPolicies|Alerts are intended to be selectively used for a limited number of events that are potentially concerning and warrant a manual review. Alerts should not be used as a substitute for a SIEM or a logging tool. High volume alerts are likely to be dropped so as to preserve the stability of GitLab's integration with Kubernetes."
@@ -22511,9 +22845,6 @@ msgstr ""
msgid "NetworkPolicies|Deny all traffic"
msgstr ""
-msgid "NetworkPolicies|Description"
-msgstr ""
-
msgid "NetworkPolicies|Edit policy"
msgstr ""
@@ -22526,9 +22857,6 @@ msgstr ""
msgid "NetworkPolicies|IP/subnet"
msgstr ""
-msgid "NetworkPolicies|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
-msgstr ""
-
msgid "NetworkPolicies|Invalid or empty policy"
msgstr ""
@@ -22538,19 +22866,16 @@ msgstr ""
msgid "NetworkPolicies|Kubernetes error: %{error}"
msgstr ""
-msgid "NetworkPolicies|Name"
-msgstr ""
-
msgid "NetworkPolicies|Network"
msgstr ""
-msgid "NetworkPolicies|Network traffic"
+msgid "NetworkPolicies|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
msgstr ""
-msgid "NetworkPolicies|New policy"
+msgid "NetworkPolicies|Network policy can be created after the environment is loaded successfully."
msgstr ""
-msgid "NetworkPolicies|No policies detected"
+msgid "NetworkPolicies|Network traffic"
msgstr ""
msgid "NetworkPolicies|None selected"
@@ -22559,21 +22884,12 @@ msgstr ""
msgid "NetworkPolicies|Please %{installLinkStart}install%{installLinkEnd} and %{configureLinkStart}configure a Kubernetes Agent for this project%{configureLinkEnd} to enable alerts."
msgstr ""
-msgid "NetworkPolicies|Policies are a specification of how groups of pods are allowed to communicate with each other's network endpoints."
-msgstr ""
-
msgid "NetworkPolicies|Policy %{policyName} was successfully changed"
msgstr ""
msgid "NetworkPolicies|Policy definition"
msgstr ""
-msgid "NetworkPolicies|Policy editor"
-msgstr ""
-
-msgid "NetworkPolicies|Policy preview"
-msgstr ""
-
msgid "NetworkPolicies|Rule"
msgstr ""
@@ -22583,9 +22899,6 @@ msgstr ""
msgid "NetworkPolicies|Rule mode is unavailable for this policy. In some cases, we cannot parse the YAML file back into the rules editor."
msgstr ""
-msgid "NetworkPolicies|Rules"
-msgstr ""
-
msgid "NetworkPolicies|Save changes"
msgstr ""
@@ -22598,9 +22911,6 @@ msgstr ""
msgid "NetworkPolicies|Traffic that does not match any rule will be blocked."
msgstr ""
-msgid "NetworkPolicies|Unable to parse policy"
-msgstr ""
-
msgid "NetworkPolicies|all DNS names"
msgstr ""
@@ -22782,6 +23092,9 @@ msgstr ""
msgid "New issue"
msgstr ""
+msgid "New issue in %{project}"
+msgstr ""
+
msgid "New issue title"
msgstr ""
@@ -22860,7 +23173,7 @@ msgstr ""
msgid "Newest first"
msgstr ""
-msgid "Newly registered users will by default be external"
+msgid "Newly-registered users are external by default"
msgstr ""
msgid "Next"
@@ -23175,8 +23488,12 @@ msgstr ""
msgid "No webhooks found, add one in the form above."
msgstr ""
-msgid "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} to renew your subscription."
-msgstr ""
+msgid "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} day to renew your subscription."
+msgid_plural "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} days to renew your subscription."
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
msgid "No. of commits"
msgstr ""
@@ -23193,7 +23510,7 @@ msgstr ""
msgid "Nodes"
msgstr ""
-msgid "Non-admin users can sign in with read-only access and make read-only API requests."
+msgid "Non-admin users are restricted to read-only access, in both GitLab UI and API."
msgstr ""
msgid "None"
@@ -23274,7 +23591,7 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
-msgid "Notes Rate Limits"
+msgid "Notes rate limit"
msgstr ""
msgid "Notes|Are you sure you want to cancel creating this comment?"
@@ -23449,9 +23766,6 @@ msgstr ""
msgid "November"
msgstr ""
-msgid "Novice"
-msgstr ""
-
msgid "Now, personalize your GitLab experience"
msgstr ""
@@ -23620,7 +23934,7 @@ msgstr ""
msgid "OnCallSchedules|For this rotation, on-call will be:"
msgstr ""
-msgid "OnCallSchedules|On-call schedule %{schedule} in Project %{project}"
+msgid "OnCallSchedules|On-call schedule %{obstacle} in Project %{project}"
msgstr ""
msgid "OnCallSchedules|On-call schedules"
@@ -23767,22 +24081,22 @@ msgstr ""
msgid "OnDemandScans|Scanner profile"
msgstr ""
-msgid "OnDemandScans|Select one of the existing profiles"
+msgid "OnDemandScans|Schedule scan"
msgstr ""
-msgid "OnDemandScans|Site profile"
+msgid "OnDemandScans|Select one of the existing profiles"
msgstr ""
-msgid "OnDemandScans|Use existing scanner profile"
+msgid "OnDemandScans|Site profile"
msgstr ""
-msgid "OnDemandScans|Use existing site profile"
+msgid "OnDemandScans|Start time"
msgstr ""
-msgid "OnDemandScans|You can either choose a passive scan or validate the target site in your chosen site profile. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
+msgid "OnDemandScans|Use existing scanner profile"
msgstr ""
-msgid "OnDemandScans|You cannot run an active scan against an unvalidated site."
+msgid "OnDemandScans|Use existing site profile"
msgstr ""
msgid "OnDemandScans|You must create a repository within your project to run an on-demand scan."
@@ -23849,6 +24163,9 @@ msgstr ""
msgid "Only admins can delete project"
msgstr ""
+msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
+msgstr ""
+
msgid "Only include features new to your current subscription tier."
msgstr ""
@@ -23867,6 +24184,12 @@ msgstr ""
msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
+msgid "Only reCAPTCHA v2 is supported:"
+msgstr ""
+
+msgid "Only users from the specified IP address ranges are able to reach this group, including all subgroups, projects, and Git repositories."
+msgstr ""
+
msgid "Only verified users with an email address in any of these domains can be added to the group."
msgstr ""
@@ -24053,9 +24376,6 @@ msgstr ""
msgid "Package Registry"
msgstr ""
-msgid "Package Registry Rate Limits"
-msgstr ""
-
msgid "Package Registry: authenticated API requests"
msgstr ""
@@ -24074,6 +24394,9 @@ msgstr ""
msgid "Package recipe already exists"
msgstr ""
+msgid "Package registry rate limits"
+msgstr ""
+
msgid "Package type"
msgstr ""
@@ -24140,6 +24463,9 @@ msgstr ""
msgid "PackageRegistry|Composer"
msgstr ""
+msgid "PackageRegistry|Composer.json with license: %{license} and version: %{version}"
+msgstr ""
+
msgid "PackageRegistry|Conan"
msgstr ""
@@ -24203,6 +24529,9 @@ msgstr ""
msgid "PackageRegistry|Copy require package include"
msgstr ""
+msgid "PackageRegistry|Copy target SHA"
+msgstr ""
+
msgid "PackageRegistry|Copy yarn command"
msgstr ""
@@ -24269,6 +24598,9 @@ msgstr ""
msgid "PackageRegistry|Install package version"
msgstr ""
+msgid "PackageRegistry|Instance-level"
+msgstr ""
+
msgid "PackageRegistry|Invalid Package: failed metadata extraction"
msgstr ""
@@ -24314,6 +24646,9 @@ msgstr ""
msgid "PackageRegistry|Pip Command"
msgstr ""
+msgid "PackageRegistry|Project-level"
+msgstr ""
+
msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
msgstr ""
@@ -24335,6 +24670,9 @@ msgstr ""
msgid "PackageRegistry|Remove package"
msgstr ""
+msgid "PackageRegistry|Required Python: %{pythonVersion}"
+msgstr ""
+
msgid "PackageRegistry|RubyGems"
msgstr ""
@@ -24377,6 +24715,9 @@ msgstr ""
msgid "PackageRegistry|Source project located at %{link}"
msgstr ""
+msgid "PackageRegistry|Target SHA: %{sha}"
+msgstr ""
+
msgid "PackageRegistry|There are no other versions of this package."
msgstr ""
@@ -24545,6 +24886,18 @@ msgstr ""
msgid "Password was successfully updated. Please sign in again."
msgstr ""
+msgid "PasswordPrompt|Confirm password"
+msgstr ""
+
+msgid "PasswordPrompt|Confirm password to continue"
+msgstr ""
+
+msgid "PasswordPrompt|Password is required"
+msgstr ""
+
+msgid "PasswordPrompt|Please enter your password to confirm"
+msgstr ""
+
msgid "Passwords should be unique and not used for any other sites or services."
msgstr ""
@@ -24572,6 +24925,9 @@ msgstr ""
msgid "Paste project path (i.e. gitlab-org/gitlab)"
msgstr ""
+msgid "Paste this DSN into your Sentry SDK"
+msgstr ""
+
msgid "Paste your public SSH key, which is usually contained in the file '~/.ssh/id_ed25519.pub' or '~/.ssh/id_rsa.pub' and begins with 'ssh-ed25519' or 'ssh-rsa'. Do not paste your private SSH key, as that can compromise your identity."
msgstr ""
@@ -24656,6 +25012,9 @@ msgstr ""
msgid "PerformanceBar|First Contentful Paint"
msgstr ""
+msgid "PerformanceBar|Flamegraph with mode:"
+msgstr ""
+
msgid "PerformanceBar|Frontend resources"
msgstr ""
@@ -24689,6 +25048,15 @@ msgstr ""
msgid "PerformanceBar|Trace"
msgstr ""
+msgid "PerformanceBar|cpu"
+msgstr ""
+
+msgid "PerformanceBar|object"
+msgstr ""
+
+msgid "PerformanceBar|wall"
+msgstr ""
+
msgid "Period in seconds"
msgstr ""
@@ -24917,6 +25285,48 @@ msgstr ""
msgid "PipelineSchedules|Variables"
msgstr ""
+msgid "PipelineSource|API"
+msgstr ""
+
+msgid "PipelineSource|Chat"
+msgstr ""
+
+msgid "PipelineSource|External"
+msgstr ""
+
+msgid "PipelineSource|External Pull Request"
+msgstr ""
+
+msgid "PipelineSource|Merge Request"
+msgstr ""
+
+msgid "PipelineSource|On-Demand DAST Scan"
+msgstr ""
+
+msgid "PipelineSource|On-Demand DAST Validation"
+msgstr ""
+
+msgid "PipelineSource|Parent Pipeline"
+msgstr ""
+
+msgid "PipelineSource|Pipeline"
+msgstr ""
+
+msgid "PipelineSource|Push"
+msgstr ""
+
+msgid "PipelineSource|Schedule"
+msgstr ""
+
+msgid "PipelineSource|Trigger"
+msgstr ""
+
+msgid "PipelineSource|Web"
+msgstr ""
+
+msgid "PipelineSource|Web IDE"
+msgstr ""
+
msgid "PipelineStatusTooltip|Pipeline: %{ciStatus}"
msgstr ""
@@ -25217,46 +25627,7 @@ msgstr ""
msgid "Pipeline|Source"
msgstr ""
-msgid "Pipeline|Source|API"
-msgstr ""
-
-msgid "Pipeline|Source|Chat"
-msgstr ""
-
-msgid "Pipeline|Source|External"
-msgstr ""
-
-msgid "Pipeline|Source|External Pull Request"
-msgstr ""
-
-msgid "Pipeline|Source|Merge Request"
-msgstr ""
-
-msgid "Pipeline|Source|On-Demand DAST Scan"
-msgstr ""
-
-msgid "Pipeline|Source|On-Demand DAST Validation"
-msgstr ""
-
-msgid "Pipeline|Source|Parent Pipeline"
-msgstr ""
-
-msgid "Pipeline|Source|Pipeline"
-msgstr ""
-
-msgid "Pipeline|Source|Push"
-msgstr ""
-
-msgid "Pipeline|Source|Schedule"
-msgstr ""
-
-msgid "Pipeline|Source|Trigger"
-msgstr ""
-
-msgid "Pipeline|Source|Web"
-msgstr ""
-
-msgid "Pipeline|Source|Web IDE"
+msgid "Pipeline|Source|Security Policy"
msgstr ""
msgid "Pipeline|Specify variable values to be used in this run. The values specified in %{linkStart}CI/CD settings%{linkEnd} will be used by default."
@@ -25307,7 +25678,7 @@ msgstr ""
msgid "Pipeline|We are currently unable to fetch pipeline data"
msgstr ""
-msgid "Pipeline|You’re about to stop pipeline %{pipelineId}."
+msgid "Pipeline|You’re about to stop pipeline #%{pipelineId}."
msgstr ""
msgid "Pipeline|for"
@@ -25334,6 +25705,9 @@ msgstr ""
msgid "Plain diff"
msgstr ""
+msgid "Plain-text response to send to clients that hit a rate limit"
+msgstr ""
+
msgid "Plan:"
msgstr ""
@@ -25478,9 +25852,6 @@ msgstr ""
msgid "Please provide attributes to update"
msgstr ""
-msgid "Please provide your username or email address."
-msgstr ""
-
msgid "Please reach out if you have any questions and we'll be happy to assist."
msgstr ""
@@ -25523,9 +25894,6 @@ msgstr ""
msgid "Please set a new password before proceeding."
msgstr ""
-msgid "Please share your feedback about %{featureName} %{linkStart}in this issue%{linkEnd} to help us improve the experience."
-msgstr ""
-
msgid "Please solve the captcha"
msgstr ""
@@ -25703,6 +26071,9 @@ msgstr ""
msgid "Prevent adding new members to project membership within this group"
msgstr ""
+msgid "Prevent auto-stopping"
+msgstr ""
+
msgid "Prevent editing approval rules in projects and merge requests."
msgstr ""
@@ -25715,7 +26086,7 @@ msgstr ""
msgid "Prevent users from changing their profile name"
msgstr ""
-msgid "Prevent users from performing write operations on GitLab while performing maintenance."
+msgid "Prevent users from performing write operations while GitLab maintenance is in progress."
msgstr ""
msgid "Preview"
@@ -25988,6 +26359,9 @@ msgstr ""
msgid "Profiles|Enter your name, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Enter your password to confirm the email change"
+msgstr ""
+
msgid "Profiles|Enter your pronouns to let people know how to refer to you"
msgstr ""
@@ -26222,10 +26596,10 @@ msgstr ""
msgid "Profiles|e.g. My MacBook key"
msgstr ""
-msgid "Profiles|username"
+msgid "Profiles|https://website.com"
msgstr ""
-msgid "Profiles|website.com"
+msgid "Profiles|username"
msgstr ""
msgid "Profiles|your account"
@@ -26468,9 +26842,21 @@ msgstr ""
msgid "ProjectSelect| or group"
msgstr ""
+msgid "ProjectSelect|No matching results"
+msgstr ""
+
msgid "ProjectSelect|Search for project"
msgstr ""
+msgid "ProjectSelect|Search projects"
+msgstr ""
+
+msgid "ProjectSelect|Select a project"
+msgstr ""
+
+msgid "ProjectSelect|There was an error fetching the projects. Please try again."
+msgstr ""
+
msgid "ProjectService|Drone server URL"
msgstr ""
@@ -26558,6 +26944,9 @@ msgstr ""
msgid "ProjectService|Trigger event when a new, unique alert is recorded."
msgstr ""
+msgid "ProjectService|Trigger event when a new, unique vulnerability is recorded. (Note: This feature requires an Ultimate plan.)"
+msgstr ""
+
msgid "ProjectService|Trigger event when a pipeline status changes."
msgstr ""
@@ -26972,9 +27361,15 @@ msgstr ""
msgid "Projects are graded based on the highest severity vulnerability present"
msgstr ""
+msgid "Projects are organized into groups"
+msgstr ""
+
msgid "Projects contributed to"
msgstr ""
+msgid "Projects help you organize your work. They contain your file repository, issues, merge requests, and so much more."
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr ""
@@ -27209,10 +27604,10 @@ msgstr ""
msgid "PrometheusService|Prometheus cluster integration"
msgstr ""
-msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
+msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
msgstr ""
-msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
+msgid "PrometheusService|The ID of the IAP-secured resource."
msgstr ""
msgid "PrometheusService|The Prometheus API base URL."
@@ -27830,6 +28225,9 @@ msgstr ""
msgid "Rate limit"
msgstr ""
+msgid "Rate limits can help reduce request volume (like from crawlers or abusive bots)."
+msgstr ""
+
msgid "Raw blob request rate limit per minute"
msgstr ""
@@ -27842,6 +28240,9 @@ msgstr ""
msgid "Re-authentication required"
msgstr ""
+msgid "Re-import"
+msgstr ""
+
msgid "Re-request review"
msgstr ""
@@ -27863,6 +28264,9 @@ msgstr ""
msgid "Read more about related issues"
msgstr ""
+msgid "Read their documentation."
+msgstr ""
+
msgid "Ready to get started with GitLab? Follow these steps to set up your workspace, plan and commit changes, and deploy your project."
msgstr ""
@@ -27896,6 +28300,9 @@ msgstr ""
msgid "Receive any notifications from GitLab."
msgstr ""
+msgid "Receive notification of abuse reports by email."
+msgstr ""
+
msgid "Receive notifications about your own activity"
msgstr ""
@@ -28041,9 +28448,6 @@ msgstr ""
msgid "Registry setup"
msgstr ""
-msgid "Regulate approvals by authors/committers. Affects all projects."
-msgstr ""
-
msgid "Reindexing Status: %{status} (Slice multiplier: %{multiplier}, Maximum running slices: %{max_slices})"
msgstr ""
@@ -28141,6 +28545,9 @@ msgstr ""
msgid "Release|Something went wrong while saving the release details."
msgstr ""
+msgid "Reload page"
+msgstr ""
+
msgid "Remediations"
msgstr ""
@@ -28423,6 +28830,9 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
+msgid "Repeats"
+msgstr ""
+
msgid "Replace"
msgstr ""
@@ -28793,10 +29203,7 @@ msgstr ""
msgid "Require additional authentication for administrative tasks."
msgstr ""
-msgid "Require all users in this group to setup Two-factor authentication"
-msgstr ""
-
-msgid "Require all users in this group to setup two-factor authentication"
+msgid "Require all users in this group to set up two-factor authentication"
msgstr ""
msgid "Required approvals (%{approvals_given} given)"
@@ -28846,6 +29253,9 @@ msgstr[3] ""
msgid "Requires values to meet regular expression requirements."
msgstr ""
+msgid "Requires you to deploy or set up cloud-hosted Sentry."
+msgstr ""
+
msgid "Requires your primary GitLab email address."
msgstr ""
@@ -28906,9 +29316,6 @@ msgstr ""
msgid "Resolve"
msgstr ""
-msgid "Resolve all threads in new issue"
-msgstr ""
-
msgid "Resolve conflicts"
msgstr ""
@@ -28966,6 +29373,9 @@ msgstr ""
msgid "Response text"
msgstr ""
+msgid "Restart GitLab to apply changes."
+msgstr ""
+
msgid "Restart Terminal"
msgstr ""
@@ -28984,6 +29394,9 @@ msgstr ""
msgid "Restoring the project will prevent the project from being removed on this date and restore people's ability to make changes to it."
msgstr ""
+msgid "Restrict group access by IP address. %{link_start}Learn more%{link_end}."
+msgstr ""
+
msgid "Restrict membership by email domain"
msgstr ""
@@ -29301,6 +29714,9 @@ msgstr ""
msgid "Runners|Runner #%{runner_id}"
msgstr ""
+msgid "Runners|Runner assigned to project."
+msgstr ""
+
msgid "Runners|Runner is offline, last contact was %{runner_contact} ago"
msgstr ""
@@ -29313,6 +29729,9 @@ msgstr ""
msgid "Runners|Runner registration"
msgstr ""
+msgid "Runners|Runner unassigned from project."
+msgstr ""
+
msgid "Runners|Runners"
msgstr ""
@@ -29505,7 +29924,7 @@ msgstr ""
msgid "SastEntryPoints|How do I set up SAST?"
msgstr ""
-msgid "SastEntryPoints|Learn more."
+msgid "SastEntryPoints|Learn more"
msgstr ""
msgid "Satisfied"
@@ -29547,7 +29966,7 @@ msgstr ""
msgid "Save pipeline schedule"
msgstr ""
-msgid "Save space and find images in the container Registry. remove unneeded tags and keep only the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
+msgid "Save storage space by automatically deleting tags from the container registry and keeping the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
msgstr ""
msgid "Saving"
@@ -29721,6 +30140,9 @@ msgstr ""
msgid "Search or filter results…"
msgstr ""
+msgid "Search or jump to..."
+msgstr ""
+
msgid "Search project"
msgstr ""
@@ -29781,16 +30203,16 @@ msgstr ""
msgid "SearchCodeResults|of %{link_to_project}"
msgstr ""
-msgid "SearchResults|Showing %{count} %{scope} for%{term_element}"
+msgid "SearchResults|Showing %{count} %{scope} for %{term_element}"
msgstr ""
-msgid "SearchResults|Showing %{count} %{scope} for%{term_element} in your personal and project snippets"
+msgid "SearchResults|Showing %{count} %{scope} for %{term_element} in your personal and project snippets"
msgstr ""
-msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for%{term_element}"
+msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for %{term_element}"
msgstr ""
-msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for%{term_element} in your personal and project snippets"
+msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for %{term_element} in your personal and project snippets"
msgstr ""
msgid "SearchResults|code result"
@@ -29894,6 +30316,9 @@ msgstr ""
msgid "Secret Detection"
msgstr ""
+msgid "Secret access key"
+msgstr ""
+
msgid "Secret token"
msgstr ""
@@ -29933,9 +30358,6 @@ msgstr ""
msgid "SecurityApprovals|A merge request approval is required when the license compliance report contains a denied license."
msgstr ""
-msgid "SecurityApprovals|Configurable if security scanners are enabled. %{linkStart}Learn more.%{linkEnd}"
-msgstr ""
-
msgid "SecurityApprovals|Coverage-Check"
msgstr ""
@@ -29948,24 +30370,18 @@ msgstr ""
msgid "SecurityApprovals|Learn more about Vulnerability-Check"
msgstr ""
-msgid "SecurityApprovals|License Scanning must be enabled. %{linkStart}Learn more%{linkEnd}."
-msgstr ""
-
msgid "SecurityApprovals|License-Check"
msgstr ""
msgid "SecurityApprovals|Requires approval for Denied licenses. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}More information%{linkEnd}"
+msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "SecurityApprovals|Requires approval for vulnerabilities. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
-msgid "SecurityApprovals|Test coverage must be enabled. %{linkStart}Learn more%{linkEnd}."
-msgstr ""
-
msgid "SecurityApprovals|Vulnerability-Check"
msgstr ""
@@ -30029,6 +30445,12 @@ msgstr ""
msgid "SecurityConfiguration|Immediately begin risk analysis and remediation with application security features. Start with SAST and Secret Detection, available to all plans. Upgrade to Ultimate to get all features, including:"
msgstr ""
+msgid "SecurityConfiguration|Manage corpus"
+msgstr ""
+
+msgid "SecurityConfiguration|Manage corpus files used as mutation sources in coverage fuzzing."
+msgstr ""
+
msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
msgstr ""
@@ -30083,6 +30505,12 @@ msgstr ""
msgid "SecurityOrchestration|Action"
msgstr ""
+msgid "SecurityOrchestration|Actions"
+msgstr ""
+
+msgid "SecurityOrchestration|Add rule"
+msgstr ""
+
msgid "SecurityOrchestration|All policies"
msgstr ""
@@ -30116,9 +30544,6 @@ msgstr ""
msgid "SecurityOrchestration|Network"
msgstr ""
-msgid "SecurityOrchestration|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
-msgstr ""
-
msgid "SecurityOrchestration|New policy"
msgstr ""
@@ -30134,6 +30559,9 @@ msgstr ""
msgid "SecurityOrchestration|Policy editor"
msgstr ""
+msgid "SecurityOrchestration|Policy preview"
+msgstr ""
+
msgid "SecurityOrchestration|Policy status"
msgstr ""
@@ -30143,6 +30571,9 @@ msgstr ""
msgid "SecurityOrchestration|Rule"
msgstr ""
+msgid "SecurityOrchestration|Rules"
+msgstr ""
+
msgid "SecurityOrchestration|Scan Execution"
msgstr ""
@@ -30236,6 +30667,9 @@ msgstr ""
msgid "SecurityReports|Create issue"
msgstr ""
+msgid "SecurityReports|Development vulnerabilities"
+msgstr ""
+
msgid "SecurityReports|Dismiss vulnerability"
msgstr ""
@@ -30251,6 +30685,9 @@ msgstr ""
msgid "SecurityReports|Download results"
msgstr ""
+msgid "SecurityReports|Download scanned URLs"
+msgstr ""
+
msgid "SecurityReports|Download scanned resources"
msgstr ""
@@ -30374,6 +30811,9 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
+msgid "SecurityReports|The Vulnerability Report shows the results of the lastest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "SecurityReports|The security reports below contain one or more vulnerability findings that could not be parsed and were not recorded. Download the artifacts in the job output to investigate. Ensure any security report created conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
msgstr ""
@@ -30515,10 +30955,10 @@ msgstr ""
msgid "Select a repository"
msgstr ""
-msgid "Select a role"
+msgid "Select a repository containing templates for common files."
msgstr ""
-msgid "Select a shared template repository for all projects on this instance."
+msgid "Select a role"
msgstr ""
msgid "Select a template repository"
@@ -30596,6 +31036,9 @@ msgstr ""
msgid "Select project to choose zone"
msgstr ""
+msgid "Select project to create issue"
+msgstr ""
+
msgid "Select projects"
msgstr ""
@@ -30713,6 +31156,9 @@ msgstr ""
msgid "Send emails to help guide new users through the onboarding process."
msgstr ""
+msgid "Send emails to users upon account deactivation."
+msgstr ""
+
msgid "Send message"
msgstr ""
@@ -30731,6 +31177,9 @@ msgstr ""
msgid "Send service data"
msgstr ""
+msgid "Sentry"
+msgstr ""
+
msgid "Sentry API URL"
msgstr ""
@@ -30845,6 +31294,9 @@ msgstr ""
msgid "Service"
msgstr ""
+msgid "Service Accounts keys are required to authorize GitLab to deploy your Google Cloud project."
+msgstr ""
+
msgid "Service Desk"
msgstr ""
@@ -30917,15 +31369,15 @@ msgstr ""
msgid "Set a password on your account to pull or push via %{protocol}."
msgstr ""
-msgid "Set a template repository for projects in this group"
-msgstr ""
-
msgid "Set access permissions for this token."
msgstr ""
msgid "Set an instance-wide domain that will be available to all clusters when installing Knative."
msgstr ""
+msgid "Set any rate limit to %{code_open}0%{code_close} to disable the limit."
+msgstr ""
+
msgid "Set default and restrict visibility levels. Configure import sources and git access protocol."
msgstr ""
@@ -30938,7 +31390,7 @@ msgstr ""
msgid "Set limit to 0 to allow any file size."
msgstr ""
-msgid "Set max session time for web terminal."
+msgid "Set limits for web and API requests."
msgstr ""
msgid "Set milestone"
@@ -30947,15 +31399,18 @@ msgstr ""
msgid "Set new password"
msgstr ""
-msgid "Set notification email for abuse reports."
+msgid "Set parent epic to an epic"
msgstr ""
-msgid "Set parent epic to an epic"
+msgid "Set per-user rate limits for imports and exports of projects and groups."
msgstr ""
msgid "Set projects and maximum size limits, session duration, user options, and check feature availability for namespace plan."
msgstr ""
+msgid "Set rate limits for package registry API requests that supersede the general user and IP rate limits."
+msgstr ""
+
msgid "Set severity"
msgstr ""
@@ -30974,15 +31429,24 @@ msgstr ""
msgid "Set the default branch for this project. All merge requests and commits are made against this branch unless you specify a different one."
msgstr ""
+msgid "Set the default expiration time for job artifacts in all projects. Set to %{code_open}0%{code_close} to never expire artifacts by default. If no unit is written, it defaults to seconds. For example, these are all equivalent: %{code_open}3600%{code_close}, %{code_open}60 minutes%{code_close}, or %{code_open}one hour%{code_close}."
+msgstr ""
+
msgid "Set the due date to %{due_date}."
msgstr ""
msgid "Set the iteration to %{iteration_reference}."
msgstr ""
+msgid "Set the maximum session time for a web terminal."
+msgstr ""
+
msgid "Set the milestone to %{milestone_reference}."
msgstr ""
+msgid "Set the per-user rate limit for notes created by web or API requests."
+msgstr ""
+
msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
msgstr ""
@@ -31184,6 +31648,9 @@ msgstr ""
msgid "Show Pipeline IID"
msgstr ""
+msgid "Show all %{issuable_type}."
+msgstr ""
+
msgid "Show all activity"
msgstr ""
@@ -31235,15 +31702,9 @@ msgstr ""
msgid "Show list"
msgstr ""
-msgid "Show me advanced features"
-msgstr ""
-
msgid "Show me how to add a pipeline"
msgstr ""
-msgid "Show me the basics"
-msgstr ""
-
msgid "Show one file at a time"
msgstr ""
@@ -31288,15 +31749,15 @@ msgstr ""
msgid "Showing %{pageSize} of %{total} %{issuableType}"
msgstr ""
-msgid "Showing %{pageSize} of %{total} issues"
-msgstr ""
-
msgid "Showing all epics"
msgstr ""
msgid "Showing all issues"
msgstr ""
+msgid "Showing data for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
+msgstr ""
+
msgid "Showing data for workflow items created in this date range. Date range cannot exceed %{maxDateRange} days."
msgstr ""
@@ -31336,6 +31797,15 @@ msgstr ""
msgid "Sidebar|Weight"
msgstr ""
+msgid "Sidekiq job compression threshold (bytes)"
+msgstr ""
+
+msgid "Sidekiq job size limit (bytes)"
+msgstr ""
+
+msgid "Sidekiq job size limits"
+msgstr ""
+
msgid "Sign in"
msgstr ""
@@ -31456,6 +31926,9 @@ msgstr ""
msgid "Site profile not found for given parameters"
msgstr ""
+msgid "Sites"
+msgstr ""
+
msgid "Size"
msgstr ""
@@ -31486,19 +31959,22 @@ msgstr ""
msgid "SlackIntegration|Sends notifications about project events to Slack channels."
msgstr ""
-msgid "SlackService|2. Paste the %{strong_open}Token%{strong_close} into the field below"
+msgid "SlackService|1. %{slash_command_link_start}Add a slash command%{slash_command_link_end} in your Slack team using this information:"
msgstr ""
-msgid "SlackService|3. Select the %{strong_open}Active%{strong_close} checkbox, press %{strong_open}Save changes%{strong_close} and start using GitLab inside Slack!"
+msgid "SlackService|2. Paste the token from Slack in the %{strong_open}Token%{strong_close} field below."
msgstr ""
-msgid "SlackService|Fill in the word that works best for your team."
+msgid "SlackService|3. Select the %{strong_open}Active%{strong_close} checkbox, select %{strong_open}Save changes%{strong_close}, and start using slash commands in Slack!"
+msgstr ""
+
+msgid "SlackService|After setup, get a list of available Slack slash commands by entering"
msgstr ""
-msgid "SlackService|See list of available commands in Slack after setting up this service, by entering"
+msgid "SlackService|Fill in the word that works best for your team."
msgstr ""
-msgid "SlackService|This service allows users to perform common operations on this project by entering slash commands in Slack."
+msgid "SlackService|Perform common operations in this project by entering slash commands in Slack."
msgstr ""
msgid "Slice multiplier"
@@ -31564,7 +32040,7 @@ msgstr ""
msgid "Some child epics may be hidden due to applied filters"
msgstr ""
-msgid "Some common domains are not allowed. %{read_more_link}."
+msgid "Some common domains are not allowed. %{learn_more_link}."
msgstr ""
msgid "Some of the designs you tried uploading did not change:"
@@ -31648,9 +32124,6 @@ msgstr ""
msgid "Something went wrong while exporting requirements"
msgstr ""
-msgid "Something went wrong while fetching %{listType} list"
-msgstr ""
-
msgid "Something went wrong while fetching branches"
msgstr ""
@@ -31705,15 +32178,9 @@ msgstr ""
msgid "Something went wrong while merging this merge request. Please try again."
msgstr ""
-msgid "Something went wrong while moving issues."
-msgstr ""
-
msgid "Something went wrong while obtaining the Let's Encrypt certificate."
msgstr ""
-msgid "Something went wrong while performing the action."
-msgstr ""
-
msgid "Something went wrong while promoting the issue to an epic. Please try again."
msgstr ""
@@ -32041,7 +32508,10 @@ msgstr ""
msgid "SourcegraphPreferences|Uses a custom %{linkStart}Sourcegraph instance%{linkEnd}."
msgstr ""
-msgid "Spam Check API Key"
+msgid "Spam Check"
+msgstr ""
+
+msgid "Spam Check API key"
msgstr ""
msgid "Spam Logs"
@@ -32059,7 +32529,7 @@ msgstr ""
msgid "Specified URL cannot be used: \"%{reason}\""
msgstr ""
-msgid "Specify an e-mail address regex pattern to identify default internal users."
+msgid "Specify an email address regex pattern to identify default internal users."
msgstr ""
msgid "Speed up your pipelines with Needs relationships"
@@ -32314,7 +32784,7 @@ msgstr ""
msgid "StatusCheck|An error occurred fetching the status checks."
msgstr ""
-msgid "StatusCheck|Apply this status check to any branch or a specific protected branch."
+msgid "StatusCheck|Apply this status check to all branches or a specific protected branch."
msgstr ""
msgid "StatusCheck|Check for a status response in Merge Requests. Failures do not block merges. %{link_start}Learn more%{link_end}."
@@ -32653,6 +33123,9 @@ msgstr ""
msgid "Subscriptions"
msgstr ""
+msgid "Subscription|Your subscription for %{strong}%{namespace_name}%{strong_close} has expired and you are now on %{pricing_link_start}the GitLab Free tier%{pricing_link_end}. Don't worry, your data is safe. Get in touch with our support team (%{support_email}). They'll gladly help with your subscription renewal."
+msgstr ""
+
msgid "Subtracted"
msgstr ""
@@ -32881,6 +33354,9 @@ msgstr ""
msgid "SuperSonics|Plan"
msgstr ""
+msgid "SuperSonics|Please agree to the Subscription Agreement"
+msgstr ""
+
msgid "SuperSonics|Ready to get started? A GitLab plan is ideal for scaling organizations and for multi team usage."
msgstr ""
@@ -32911,6 +33387,9 @@ msgstr ""
msgid "SuperSonics|The activation code is not valid. Please make sure to copy it exactly from the Customers Portal or confirmation email. Learn more about %{linkStart}activating your subscription%{linkEnd}."
msgstr ""
+msgid "SuperSonics|The activation code should be a 24-character alphanumeric string"
+msgstr ""
+
msgid "SuperSonics|There is a connectivity issue."
msgstr ""
@@ -32953,9 +33432,15 @@ msgstr ""
msgid "SuperSonics|You do not have an active subscription"
msgstr ""
+msgid "SuperSonics|You have successfully added a license that activates on %{date}. Please see the subscription history table below for more details."
+msgstr ""
+
msgid "SuperSonics|You'll be charged for %{trueUpLinkStart}users over license%{trueUpLinkEnd} on a quarterly or annual basis, depending on the terms of your agreement."
msgstr ""
+msgid "SuperSonics|Your future dated license was successfully added"
+msgstr ""
+
msgid "SuperSonics|Your subscription"
msgstr ""
@@ -33208,7 +33693,7 @@ msgstr ""
msgid "Template to append to all Service Desk issues"
msgstr ""
-msgid "TemplateRepository|Select a repository to make its templates available to all projects. %{link_start}What should the repository contain?%{link_end} "
+msgid "TemplateRepository|Create common files more quickly, and standardize their format."
msgstr ""
msgid "Templates"
@@ -33422,7 +33907,7 @@ msgstr ""
msgid "TestCases|Search test cases"
msgstr ""
-msgid "TestCases|Something went wrong while adding test case to Todo."
+msgid "TestCases|Something went wrong while adding test case to a to-do item."
msgstr ""
msgid "TestCases|Something went wrong while creating a test case."
@@ -33434,7 +33919,7 @@ msgstr ""
msgid "TestCases|Something went wrong while fetching test cases list."
msgstr ""
-msgid "TestCases|Something went wrong while marking test case todo as done."
+msgid "TestCases|Something went wrong while marking test case to-do item as done."
msgstr ""
msgid "TestCases|Something went wrong while moving test case."
@@ -33554,7 +34039,7 @@ msgstr ""
msgid "Thanks for your purchase!"
msgstr ""
-msgid "That is ok, I do not want to renew"
+msgid "That's OK, I don't want to renew"
msgstr ""
msgid "That's it, well done!"
@@ -33579,7 +34064,7 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-msgid "The API key used by GitLab for accessing the Spam Check service endpoint"
+msgid "The API key used by GitLab for accessing the Spam Check service endpoint."
msgstr ""
msgid "The GitLab subscription service (customers.gitlab.com) is currently experiencing an outage. You can monitor the status and get updates at %{linkStart}status.gitlab.com%{linkEnd}."
@@ -33618,9 +34103,6 @@ msgstr ""
msgid "The URL to use for connecting to Elasticsearch. Use a comma-separated list to support clustering (e.g., \"http://localhost:9200, http://localhost:9201\")."
msgstr ""
-msgid "The Vulnerability Report shows the results of the last successful pipeline run on the default branch."
-msgstr ""
-
msgid "The X509 Certificate to use when mutual TLS is required to communicate with the external authorization service. If left blank, the server certificate is still validated when accessing over HTTPS."
msgstr ""
@@ -33678,9 +34160,6 @@ msgstr ""
msgid "The default branch for this project has been changed. Please update your bookmarks."
msgstr ""
-msgid "The default expiration time for job artifacts. 0 for unlimited. The default unit is in seconds, but you can use other units, for example %{code_open}4 mins 2 sec%{code_close}, %{code_open}2h42min%{code_close}."
-msgstr ""
-
msgid "The dependency list details information about the components used within your project."
msgstr ""
@@ -33874,9 +34353,6 @@ msgstr ""
msgid "The merge conflicts for this merge request have already been resolved. Please return to the merge request."
msgstr ""
-msgid "The merge request can now be merged."
-msgstr ""
-
msgid "The metric must be one of %{metrics}."
msgstr ""
@@ -34252,7 +34728,7 @@ msgstr ""
msgid "There was a problem updating the keep latest artifacts setting."
msgstr ""
-msgid "There was an error %{message} todo."
+msgid "There was an error %{message} to-do item."
msgstr ""
msgid "There was an error adding a To Do."
@@ -34291,6 +34767,9 @@ msgstr ""
msgid "There was an error fetching projects"
msgstr ""
+msgid "There was an error fetching search autocomplete suggestions"
+msgstr ""
+
msgid "There was an error fetching stage total counts"
msgstr ""
@@ -34615,6 +35094,9 @@ msgstr ""
msgid "This field is required."
msgstr ""
+msgid "This form is disabled in preview"
+msgstr ""
+
msgid "This group"
msgstr ""
@@ -34636,9 +35118,6 @@ msgstr ""
msgid "This group is linked to a subscription"
msgstr ""
-msgid "This group, including all subgroups, projects and git repositories, will be reachable from only the specified IP address ranges."
-msgstr ""
-
msgid "This group, its subgroups and projects has been scheduled for removal on %{date}."
msgstr ""
@@ -34918,9 +35397,6 @@ msgstr ""
msgid "This user cannot be unlocked manually from GitLab"
msgstr ""
-msgid "This user does not have a pending request"
-msgstr ""
-
msgid "This user has an unconfirmed email address (%{email}). You may force a confirmation."
msgstr ""
@@ -35029,9 +35505,6 @@ msgstr ""
msgid "ThreatMonitoring|Packet Activity"
msgstr ""
-msgid "ThreatMonitoring|Policies"
-msgstr ""
-
msgid "ThreatMonitoring|Requests"
msgstr ""
@@ -35083,6 +35556,12 @@ msgstr ""
msgid "ThreatMonitoring|View documentation"
msgstr ""
+msgid "Threshold in bytes at which to compress Sidekiq job arguments."
+msgstr ""
+
+msgid "Threshold in bytes at which to reject Sidekiq jobs. Set this to 0 to if you don't want to limit Sidekiq jobs."
+msgstr ""
+
msgid "Throughput"
msgstr ""
@@ -35092,6 +35571,9 @@ msgstr ""
msgid "Time"
msgstr ""
+msgid "Time (in hours) that users are allowed to skip forced configuration of two-factor authentication."
+msgstr ""
+
msgid "Time Spent"
msgstr ""
@@ -35158,7 +35640,7 @@ msgstr ""
msgid "TimeTrackingEstimated|Est"
msgstr ""
-msgid "TimeTracking|%{startTag}Spent: %{endTag}%{timeSpentHumanReadable}"
+msgid "TimeTracking|%{spentStart}Spent: %{spentEnd}"
msgstr ""
msgid "TimeTracking|Estimated:"
@@ -35376,6 +35858,9 @@ msgstr ""
msgid "To access this domain create a new DNS record"
msgstr ""
+msgid "To add a custom suffix, set up a Service Desk email address. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "To add an SSH key you need to %{generate_link_start}generate one%{link_end} or use an %{existing_link_start}existing key%{link_end}."
msgstr ""
@@ -35397,13 +35882,16 @@ msgstr ""
msgid "To connect an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To continue using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
+msgstr ""
+
msgid "To continue, you need to select the link in the confirmation email we sent to verify your email address. If you didn't get our email, select %{strongStart}Resend confirmation email.%{strongEnd}"
msgstr ""
msgid "To define internal users, first enable new users set to external"
msgstr ""
-msgid "To enable Registration Features, make sure \"Enable service ping\" is checked."
+msgid "To enable Registration Features, first enable Service Ping."
msgstr ""
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
@@ -35430,7 +35918,7 @@ msgstr ""
msgid "To get started, use the link below to confirm your account."
msgstr ""
-msgid "To help improve GitLab and its user experience, GitLab will periodically collect usage information."
+msgid "To help improve GitLab and its user experience, GitLab periodically collects usage information."
msgstr ""
msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
@@ -35463,7 +35951,7 @@ msgstr ""
msgid "To preserve performance only %{strong_open}%{display_size} of %{real_size}%{strong_close} files are displayed."
msgstr ""
-msgid "To protect this issue's confidentiality, %{forkLink} and set the fork's visibility to private."
+msgid "To protect this issue's confidentiality, %{linkStart}fork this project%{linkEnd} and set the fork's visibility to private."
msgstr ""
msgid "To protect this issue's confidentiality, a private fork of this project was selected."
@@ -35496,12 +35984,15 @@ msgstr ""
msgid "To set up SAML authentication for your group through an identity provider like Azure, Okta, Onelogin, Ping Identity, or your custom SAML 2.0 provider:"
msgstr ""
-msgid "To set up this service:"
+msgid "To set up this integration:"
msgstr ""
msgid "To specify the notification level per project of a group you belong to, you need to visit project page and change notification level there."
msgstr ""
+msgid "To start using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
+msgstr ""
+
msgid "To unsubscribe from this issue, please paste the following link into your browser:"
msgstr ""
@@ -36091,9 +36582,6 @@ msgstr ""
msgid "Unable to fetch branches list, please close the form and try again"
msgstr ""
-msgid "Unable to fetch unscanned projects"
-msgstr ""
-
msgid "Unable to fetch vulnerable projects"
msgstr ""
@@ -36148,6 +36636,15 @@ msgstr ""
msgid "Unable to update this issue at this time."
msgstr ""
+msgid "Unapprove a merge request"
+msgstr ""
+
+msgid "Unapprove the current merge request."
+msgstr ""
+
+msgid "Unapproved the current merge request."
+msgstr ""
+
msgid "Unarchive project"
msgstr ""
@@ -36160,16 +36657,13 @@ msgstr ""
msgid "Unassigned"
msgstr ""
-msgid "Unauthenticated API request rate limit"
-msgstr ""
-
-msgid "Unauthenticated rate limit period in seconds"
+msgid "Unauthenticated API rate limit period in seconds"
msgstr ""
-msgid "Unauthenticated request rate limit"
+msgid "Unauthenticated requests"
msgstr ""
-msgid "Unauthenticated requests"
+msgid "Unauthenticated web rate limit period in seconds"
msgstr ""
msgid "Undo"
@@ -36271,18 +36765,6 @@ msgstr ""
msgid "Unresolved"
msgstr ""
-msgid "UnscannedProjects|15 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|30 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|5 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|60 or more days"
-msgstr ""
-
msgid "Unschedule job"
msgstr ""
@@ -36502,6 +36984,9 @@ msgstr ""
msgid "UsageQuota|%{help_link_start}Shared runners%{help_link_end} are disabled, so there are no limits set on pipeline usage"
msgstr ""
+msgid "UsageQuota|%{linkTitle} help link"
+msgstr ""
+
msgid "UsageQuota|%{percentageLeft} of purchased storage is available"
msgstr ""
@@ -36511,6 +36996,9 @@ msgstr ""
msgid "UsageQuota|Artifacts is a sum of build and pipeline artifacts."
msgstr ""
+msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
+msgstr ""
+
msgid "UsageQuota|Buy additional minutes"
msgstr ""
@@ -36520,9 +37008,21 @@ msgstr ""
msgid "UsageQuota|CI minutes usage by project"
msgstr ""
+msgid "UsageQuota|Code packages and container images."
+msgstr ""
+
msgid "UsageQuota|Current period usage"
msgstr ""
+msgid "UsageQuota|File attachments and smaller design graphics."
+msgstr ""
+
+msgid "UsageQuota|Git repository, managed by the Gitaly service."
+msgstr ""
+
+msgid "UsageQuota|Includes project registry, artifacts, packages, wiki, uploads and other items."
+msgstr ""
+
msgid "UsageQuota|Increase storage temporarily"
msgstr ""
@@ -36541,6 +37041,9 @@ msgstr ""
msgid "UsageQuota|Packages"
msgstr ""
+msgid "UsageQuota|Pipeline artifacts and job artifacts, created with CI/CD."
+msgstr ""
+
msgid "UsageQuota|Pipelines"
msgstr ""
@@ -36559,6 +37062,9 @@ msgstr ""
msgid "UsageQuota|Seats"
msgstr ""
+msgid "UsageQuota|Shared bits of code and text."
+msgstr ""
+
msgid "UsageQuota|Snippets"
msgstr ""
@@ -36568,6 +37074,12 @@ msgstr ""
msgid "UsageQuota|Storage"
msgstr ""
+msgid "UsageQuota|Storage type"
+msgstr ""
+
+msgid "UsageQuota|There is a known issue with Artifact storage where the total could be incorrect for some projects. More details and progress are available in %{warningLinkStart}the epic%{warningLinkEnd}."
+msgstr ""
+
msgid "UsageQuota|This is the total amount of storage used across your projects within this namespace."
msgstr ""
@@ -36607,6 +37119,9 @@ msgstr ""
msgid "UsageQuota|Usage"
msgstr ""
+msgid "UsageQuota|Usage Breakdown"
+msgstr ""
+
msgid "UsageQuota|Usage Quotas"
msgstr ""
@@ -36631,6 +37146,9 @@ msgstr ""
msgid "UsageQuota|Wiki"
msgstr ""
+msgid "UsageQuota|Wiki content."
+msgstr ""
+
msgid "UsageQuota|Wikis"
msgstr ""
@@ -36847,7 +37365,10 @@ msgstr ""
msgid "User Settings"
msgstr ""
-msgid "User and IP Rate Limits"
+msgid "User and IP rate limits"
+msgstr ""
+
+msgid "User does not have a pending request"
msgstr ""
msgid "User identity was successfully created."
@@ -37144,6 +37665,9 @@ msgstr ""
msgid "Users can launch a development environment from a GitLab browser tab when the %{linkStart}Gitpod%{linkEnd} integration is enabled."
msgstr ""
+msgid "Users can reactivate their account by signing in."
+msgstr ""
+
msgid "Users can render diagrams in AsciiDoc, Markdown, reStructuredText, and Textile documents using Kroki."
msgstr ""
@@ -37159,6 +37683,9 @@ msgstr ""
msgid "Users requesting access to"
msgstr ""
+msgid "Users to exclude from the rate limit"
+msgstr ""
+
msgid "Users were successfully added."
msgstr ""
@@ -37180,6 +37707,9 @@ msgstr ""
msgid "UsersSelect|Unassigned"
msgstr ""
+msgid "Uses GitLab as a lightweight alternative to Sentry."
+msgstr ""
+
msgid "Using %{code_start}::%{code_end} denotes a %{link_start}scoped label set%{link_end}"
msgstr ""
@@ -37210,10 +37740,7 @@ msgstr ""
msgid "Value Stream Analytics can help you determine your team’s velocity"
msgstr ""
-msgid "Value Stream Analytics gives an overview of how much time it takes to go from idea to production in your project."
-msgstr ""
-
-msgid "Value may contain a variable reference"
+msgid "Value might contain a variable reference"
msgstr ""
msgid "Value stream"
@@ -37279,10 +37806,10 @@ msgstr ""
msgid "ValueStream|The Default Value Stream cannot be deleted"
msgstr ""
-msgid "Variable"
+msgid "Values that contain the %{codeStart}$%{codeEnd} character can be considered a variable reference and expanded. %{docsLinkStart}Learn more.%{docsLinkEnd}"
msgstr ""
-msgid "Variable references indicated by %{codeStart}$%{codeEnd} may be expanded. If this is not what you want, consider %{docsLinkStart}using a workaround to prevent expansion%{docsLinkEnd}."
+msgid "Variable"
msgstr ""
msgid "Variable will be masked in job logs."
@@ -37693,6 +38220,9 @@ msgstr ""
msgid "Vulnerability|Evidence"
msgstr ""
+msgid "Vulnerability|False positive detected"
+msgstr ""
+
msgid "Vulnerability|File"
msgstr ""
@@ -37735,6 +38265,9 @@ msgstr ""
msgid "Vulnerability|Status"
msgstr ""
+msgid "Vulnerability|The scanner determined this vulnerability to be a false positive. Verify the evaluation before changing its status. %{linkStart}Learn more about false positive detection.%{linkEnd}"
+msgstr ""
+
msgid "Vulnerability|The unmodified response is the original response that had no mutations done to the request"
msgstr ""
@@ -38059,9 +38592,6 @@ msgstr ""
msgid "Welcome to GitLab,%{br_tag}%{name}!"
msgstr ""
-msgid "Welcome to the guided GitLab tour"
-msgstr ""
-
msgid "Welcome, %{name}!"
msgstr ""
@@ -38080,9 +38610,6 @@ msgstr ""
msgid "What are you searching for?"
msgstr ""
-msgid "What describes you best?"
-msgstr ""
-
msgid "What does this command do?"
msgstr ""
@@ -38104,13 +38631,13 @@ msgstr ""
msgid "What is your job title? (optional)"
msgstr ""
-msgid "What will you use this group for?"
+msgid "What templates can I create?"
msgstr ""
-msgid "What's new"
+msgid "What will you use this group for?"
msgstr ""
-msgid "What’s your experience level?"
+msgid "What's new"
msgstr ""
msgid "When a deployment job is successful, skip older deployment jobs that are still pending."
@@ -38122,6 +38649,9 @@ msgstr ""
msgid "When an event in GitLab triggers a webhook, you can use the request details to figure out if something went wrong."
msgstr ""
+msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+msgstr ""
+
msgid "When inactive, an external authentication provider must be used."
msgstr ""
@@ -38147,6 +38677,9 @@ msgstr ""
msgid "When:"
msgstr ""
+msgid "Which API requests are affected?"
+msgstr ""
+
msgid "While it's rare to have no vulnerabilities, it can happen. In any event, we ask that you please double check your settings to make sure you've set up your dashboard correctly."
msgstr ""
@@ -38426,6 +38959,9 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|Work Items"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -38501,6 +39037,9 @@ msgstr ""
msgid "You are already a member of this %{member_source}."
msgstr ""
+msgid "You are already impersonating another user"
+msgstr ""
+
msgid "You are an admin, which means granting access to %{client_name} will allow them to interact with GitLab as an admin as well. Proceed with caution."
msgstr ""
@@ -38603,6 +39142,9 @@ msgstr ""
msgid "You can also use project access tokens with Git to authenticate over HTTP(S). %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "You can always change your URL later"
+msgstr ""
+
msgid "You can always edit this later"
msgstr ""
@@ -38759,10 +39301,10 @@ msgstr ""
msgid "You can’t %{tag_start}edit%{tag_end} files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
-msgid "You could not create a new trigger."
+msgid "You can’t edit files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
-msgid "You didn't renew your subscription for %{strong}%{namespace_name}%{strong_close} so it was downgraded to the free plan."
+msgid "You could not create a new trigger."
msgstr ""
msgid "You do not have any subscriptions yet"
@@ -38930,6 +39472,12 @@ msgstr ""
msgid "You must provide your current password in order to change it."
msgstr ""
+msgid "You must sign in to search for specific projects."
+msgstr ""
+
+msgid "You must sign in to search for specific terms."
+msgstr ""
+
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
@@ -38957,6 +39505,9 @@ msgstr ""
msgid "You need to upload a GitLab project export archive (ending in .gz)."
msgstr ""
+msgid "You need to verify your primary email first before enabling Two-Factor Authentication."
+msgstr ""
+
msgid "You successfully declined the invitation"
msgstr ""
@@ -39065,10 +39616,10 @@ msgstr ""
msgid "Your %{host} account was signed in to from a new location"
msgstr ""
-msgid "Your %{strong}%{plan_name}%{strong_close} subscription for %{strong}%{namespace_name}%{strong_close} will expire on %{strong}%{expires_on}%{strong_close}."
+msgid "Your %{strong}%{plan_name}%{strong_close} subscription expires on %{strong}%{expires_on}%{strong_close}. After that date, you cannot create issues or merge requests, or use many other features."
msgstr ""
-msgid "Your %{strong}%{plan_name}%{strong_close} subscription will expire on %{strong}%{expires_on}%{strong_close}. After that, you will not be able to create issues or merge requests as well as many other features."
+msgid "Your %{strong}%{plan_name}%{strong_close} subscription for %{strong}%{namespace_name}%{strong_close} will expire on %{strong}%{expires_on}%{strong_close}."
msgstr ""
msgid "Your CI/CD configuration syntax is invalid. View Lint tab for more details."
@@ -39092,7 +39643,7 @@ msgstr ""
msgid "Your GPG keys (%{count})"
msgstr ""
-msgid "Your GitLab account has been locked due to an excessive amount of unsuccessful sign in attempts. Your account will automatically unlock in %{duration} or you may click the link below to unlock now."
+msgid "Your GitLab account has been locked due to an excessive number of unsuccessful sign in attempts. You can wait for your account to automatically unlock in %{duration} or you can click the link below to unlock now."
msgstr ""
msgid "Your GitLab account request has been approved!"
@@ -39203,6 +39754,9 @@ msgstr ""
msgid "Your commit email is used for web based operations, such as edits and merges."
msgstr ""
+msgid "Your current password is required to register a two-factor authenticator app."
+msgstr ""
+
msgid "Your dashboard has been copied. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
@@ -39302,6 +39856,9 @@ msgstr ""
msgid "Your project limit is %{limit} projects! Please contact your administrator to increase it"
msgstr ""
+msgid "Your project will be created at:"
+msgstr ""
+
msgid "Your projects"
msgstr ""
@@ -39341,11 +39898,12 @@ msgstr ""
msgid "Your subscription expired!"
msgstr ""
-msgid "Your subscription has been downgraded."
-msgstr ""
-
-msgid "Your subscription will expire in %{remaining_days}."
-msgstr ""
+msgid "Your subscription will expire in %{remaining_days} day."
+msgid_plural "Your subscription will expire in %{remaining_days} days."
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
msgid "Your username is %{username}."
msgstr ""
@@ -39556,6 +40114,9 @@ msgstr ""
msgid "cannot merge"
msgstr ""
+msgid "cannot not be used for user namespace"
+msgstr ""
+
msgid "ciReport|%{degradedNum} degraded"
msgstr ""
@@ -39881,6 +40442,9 @@ msgstr ""
msgid "created %{timeAgo}"
msgstr ""
+msgid "created %{timeAgo} by %{author}"
+msgstr ""
+
msgid "created by"
msgstr ""
@@ -39927,9 +40491,6 @@ msgstr ""
msgid "does not have a supported extension. Only %{extension_list} are supported"
msgstr ""
-msgid "domain is not authorized for sign-up."
-msgstr ""
-
msgid "download it"
msgstr ""
@@ -39949,20 +40510,13 @@ msgstr ""
msgid "email '%{email}' is not a verified email."
msgstr ""
-msgid "email does not match the allowed domain of %{email_domains}"
-msgid_plural "email does not match the allowed domains: %{email_domains}"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
-
msgid "enabled"
msgstr ""
msgid "encrypted: needs to be a :required, :optional or :migrating!"
msgstr ""
-msgid "ending with MIME type format is not allowed."
+msgid "ending with a reserved file extension is not allowed."
msgstr ""
msgid "entries cannot be larger than 255 characters"
@@ -39986,6 +40540,9 @@ msgstr ""
msgid "estimateCommand|%{slash_command} overwrites the total estimated time."
msgstr ""
+msgid "example.com"
+msgstr ""
+
msgid "exceeds the limit of %{bytes} bytes"
msgstr ""
@@ -40038,9 +40595,6 @@ msgstr ""
msgid "fork"
msgstr ""
-msgid "fork this project"
-msgstr ""
-
msgid "from"
msgstr ""
@@ -40051,6 +40605,9 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "frontmatter"
+msgstr ""
+
msgid "group"
msgstr ""
@@ -40078,6 +40635,9 @@ msgstr ""
msgid "has been completed."
msgstr ""
+msgid "has too deep level of nesting"
+msgstr ""
+
msgid "help"
msgstr ""
@@ -40111,9 +40671,21 @@ msgstr ""
msgid "in"
msgstr ""
+msgid "in Infrastructure :: Kubernetes clusters"
+msgstr ""
+
+msgid "in all GitLab"
+msgstr ""
+
+msgid "in group"
+msgstr ""
+
msgid "in group %{link_to_group}"
msgstr ""
+msgid "in project"
+msgstr ""
+
msgid "in project %{link_to_project}"
msgstr ""
@@ -40157,16 +40729,19 @@ msgstr ""
msgid "is not a valid X509 certificate."
msgstr ""
-msgid "is not allowed since the group is not top-level group."
+msgid "is not allowed for sign-up."
msgstr ""
-msgid "is not allowed. Try again with a different email address, or contact your GitLab admin."
+msgid "is not allowed for this group."
msgstr ""
-msgid "is not allowed. We do not currently support project-level iterations"
+msgid "is not allowed for this project."
msgstr ""
-msgid "is not from an allowed domain."
+msgid "is not allowed since the group is not top-level group."
+msgstr ""
+
+msgid "is not allowed. We do not currently support project-level iterations"
msgstr ""
msgid "is not in the group enforcing Group Managed Account"
@@ -40259,6 +40834,9 @@ msgstr ""
msgid "log in"
msgstr ""
+msgid "managed"
+msgstr ""
+
msgid "manual"
msgstr ""
@@ -40308,6 +40886,9 @@ msgstr ""
msgid "mrWidget| Please restore it or use a different %{missingBranchName} branch"
msgstr ""
+msgid "mrWidget|%{linkStart}Set up now%{linkEnd} to analyze your source code for known security vulnerabilities."
+msgstr ""
+
msgid "mrWidget|%{mergeError}."
msgstr ""
@@ -40390,6 +40971,9 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "mrWidget|Create issue to resolve all threads"
+msgstr ""
+
msgid "mrWidget|Delete source branch"
msgstr ""
@@ -40399,12 +40983,18 @@ msgstr ""
msgid "mrWidget|Did not close"
msgstr ""
+msgid "mrWidget|Dismiss"
+msgstr ""
+
msgid "mrWidget|Email patches"
msgstr ""
msgid "mrWidget|Failed to load deployment statistics"
msgstr ""
+msgid "mrWidget|Hide %{widget} details"
+msgstr ""
+
msgid "mrWidget|If the %{missingBranchName} branch exists in your local repository, you can merge this merge request manually using the command line"
msgstr ""
@@ -40502,9 +41092,6 @@ msgstr ""
msgid "mrWidget|Request to merge"
msgstr ""
-msgid "mrWidget|Resolve all threads in new issue"
-msgstr ""
-
msgid "mrWidget|Resolve conflicts"
msgstr ""
@@ -40520,6 +41107,9 @@ msgstr ""
msgid "mrWidget|Revoke approval"
msgstr ""
+msgid "mrWidget|SAST and Secret Detection is not enabled."
+msgstr ""
+
msgid "mrWidget|Set by %{merge_author} to be added to the merge train when the pipeline succeeds"
msgstr ""
@@ -40529,6 +41119,9 @@ msgstr ""
msgid "mrWidget|Set by %{merge_author} to start a merge train when the pipeline succeeds"
msgstr ""
+msgid "mrWidget|Show %{widget} details"
+msgstr ""
+
msgid "mrWidget|The changes were merged into"
msgstr ""
@@ -40541,6 +41134,9 @@ msgstr ""
msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure, or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
msgstr ""
+msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure."
+msgstr ""
+
msgid "mrWidget|The source branch has been deleted"
msgstr ""
@@ -40583,6 +41179,9 @@ msgstr ""
msgid "mrWidget|You can merge after removing denied licenses"
msgstr ""
+msgid "mrWidget|You can only merge once this merge request is approved."
+msgstr ""
+
msgid "mrWidget|Your password"
msgstr ""
@@ -40619,6 +41218,9 @@ msgstr ""
msgid "must be less than the limit of %{tag_limit} tags"
msgstr ""
+msgid "must be set for a project namespace"
+msgstr ""
+
msgid "must be unique by status and elapsed time within a policy"
msgstr ""
@@ -40732,6 +41334,9 @@ msgstr ""
msgid "pipeline"
msgstr ""
+msgid "pipeline schedules documentation"
+msgstr ""
+
msgid "pod_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
msgstr ""
@@ -40785,16 +41390,25 @@ msgstr ""
msgid "project name"
msgstr ""
+msgid "project namespace cannot be the parent of another namespace"
+msgstr ""
+
msgid "projects"
msgstr ""
msgid "quick actions"
msgstr ""
-msgid "reCAPTCHA Private Key"
+msgid "reCAPTCHA"
+msgstr ""
+
+msgid "reCAPTCHA helps prevent credential stuffing."
msgstr ""
-msgid "reCAPTCHA Site Key"
+msgid "reCAPTCHA private key"
+msgstr ""
+
+msgid "reCAPTCHA site key"
msgstr ""
msgid "recent activity"
@@ -41023,6 +41637,9 @@ msgstr ""
msgid "user avatar"
msgstr ""
+msgid "user namespace cannot be the parent of another namespace"
+msgstr ""
+
msgid "user preferences"
msgstr ""
@@ -41117,3 +41734,9 @@ msgstr ""
msgid "your settings"
msgstr ""
+msgid "{group}"
+msgstr ""
+
+msgid "{project}"
+msgstr ""
+
diff --git a/locale/cy_GB/gitlab.po b/locale/cy_GB/gitlab.po
index b78476c9887..8f874ae1255 100644
--- a/locale/cy_GB/gitlab.po
+++ b/locale/cy_GB/gitlab.po
@@ -14,10 +14,7 @@ msgstr ""
"X-Crowdin-Language: cy\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-09-01 22:30\n"
-
-msgid " %{name}, confirm your email address now! "
-msgstr ""
+"PO-Revision-Date: 2021-10-04 20:18\n"
msgid " %{start} to %{end}"
msgstr " %{start} i %{end}"
@@ -100,6 +97,24 @@ msgstr ""
msgid "#general, #development"
msgstr ""
+msgid "%d Alert"
+msgid_plural "%d Alerts"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+msgstr[5] ""
+
+msgid "%d Alert:"
+msgid_plural "%d Alerts:"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+msgstr[5] ""
+
msgid "%d Approval"
msgid_plural "%d Approvals"
msgstr[0] ""
@@ -727,7 +742,10 @@ msgstr ""
msgid "%{code_open}Protected:%{code_close} Only exposed to protected branches or tags."
msgstr ""
-msgid "%{commit_author_link} authored %{commit_timeago}"
+msgid "%{commit_author_link} authored %{commit_authored_timeago}"
+msgstr ""
+
+msgid "%{commit_author_link} authored %{commit_authored_timeago} and %{commit_committer_avatar} %{commit_committer_link} committed %{commit_committer_timeago}"
msgstr ""
msgid "%{completedCount} completed weight"
@@ -841,6 +859,15 @@ msgstr ""
msgid "%{doc_link_start}Advanced search%{doc_link_end} is enabled."
msgstr ""
+msgid "%{docs_link_start}Learn about visibility levels.%{docs_link_end}"
+msgstr ""
+
+msgid "%{docs_link_start}What is Large File Storage?%{docs_link_end}"
+msgstr ""
+
+msgid "%{docs_link_start}What is two-factor authentication?%{docs_link_end}"
+msgstr ""
+
msgid "%{due_date} (Past due)"
msgstr ""
@@ -913,9 +940,6 @@ msgstr ""
msgid "%{issueType} actions"
msgstr ""
-msgid "%{issuesCount} issues with a limit of %{maxIssueCount}"
-msgstr ""
-
msgid "%{issuesSize} with a limit of %{maxIssueCount}"
msgstr ""
@@ -973,6 +997,12 @@ msgstr ""
msgid "%{label_for_message} unavailable"
msgstr ""
+msgid "%{learn_more_link}."
+msgstr ""
+
+msgid "%{lessThan} 1 hour"
+msgstr ""
+
msgid "%{lets_encrypt_link_start}Let's Encrypt%{lets_encrypt_link_end} is a free, automated, and open certificate authority (CA) that issues digital certificates to enable HTTPS (SSL/TLS) for sites."
msgstr ""
@@ -985,15 +1015,15 @@ msgstr ""
msgid "%{link_start}Learn more%{link_end} about roles."
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
-msgstr ""
-
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
msgstr ""
msgid "%{link_start}Start the title with %{draft_snippet}%{link_end} to prevent a merge request that is a work in progress from being merged before it's ready."
msgstr ""
+msgid "%{link_start}What information does GitLab Inc. collect?%{link_end}"
+msgstr ""
+
msgid "%{listToShow}, and %{awardsListLength} more"
msgstr ""
@@ -1162,7 +1192,7 @@ msgstr[3] ""
msgstr[4] ""
msgstr[5] ""
-msgid "%{service_ping_link_start}Learn more%{service_ping_link_end} about what information is shared with GitLab Inc."
+msgid "%{service_ping_link_start}What information is shared with GitLab Inc.?%{service_ping_link_end}"
msgstr ""
msgid "%{size} %{unit}"
@@ -1198,6 +1228,9 @@ msgstr ""
msgid "%{state} epics"
msgstr ""
+msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
+msgstr ""
+
msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
msgstr ""
@@ -1285,15 +1318,6 @@ msgstr ""
msgid "%{template_project_id} is unknown or invalid"
msgstr ""
-msgid "%{text} %{files}"
-msgid_plural "%{text} %{files} files"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
-msgstr[4] ""
-msgstr[5] ""
-
msgid "%{text} is available"
msgstr ""
@@ -1378,9 +1402,6 @@ msgstr ""
msgid "%{wildcards_link_start}Wildcards%{wildcards_link_end} such as %{code_tag_start}v*%{code_tag_end} or %{code_tag_start}*-release%{code_tag_end} are supported."
msgstr ""
-msgid "&lt; 1 hour"
-msgstr ""
-
msgid "'%{data}' at %{location} does not match format: %{format}"
msgstr ""
@@ -1468,9 +1489,6 @@ msgstr ""
msgid "(we need your current password to confirm your changes)"
msgstr ""
-msgid "* * * * *"
-msgstr ""
-
msgid "+ %{amount} more"
msgstr ""
@@ -1549,10 +1567,10 @@ msgstr ""
msgid "."
msgstr ""
-msgid "0 bytes"
+msgid "/"
msgstr ""
-msgid "0 for unlimited, only effective with remote storage enabled."
+msgid "0 bytes"
msgstr ""
msgid "0t1DgySidms"
@@ -1774,6 +1792,9 @@ msgstr ""
msgid "1000+"
msgstr ""
+msgid "192.168.0.0/24"
+msgstr ""
+
msgid "1st contribution!"
msgstr ""
@@ -1927,9 +1948,6 @@ msgstr ""
msgid "A plain HTML site that uses Netlify for CI/CD instead of GitLab, but still with all the other great GitLab features"
msgstr ""
-msgid "A plain-text response to show to clients that hit the rate limit."
-msgstr ""
-
msgid "A platform value can be web, mob or app."
msgstr ""
@@ -2011,7 +2029,7 @@ msgstr ""
msgid "APIFuzzing|Configure HTTP basic authentication values. Other authentication methods are supported. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
+msgid "APIFuzzing|Customize your project's API fuzzing configuration options and copy the code snippet to your .gitlab-ci.yml file to apply any changes. Note that this tool does not reflect or update your .gitlab-ci.yml file automatically. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
msgstr ""
msgid "APIFuzzing|Enable authentication"
@@ -2074,9 +2092,6 @@ msgstr ""
msgid "APIFuzzing|To prevent a security leak, authentication info must be added as a %{ciVariablesLinkStart}CI variable%{ciVariablesLinkEnd}. As a user with maintainer access rights, you can manage CI variables in the %{ciSettingsLinkStart}Settings%{ciSettingsLinkEnd} area."
msgstr ""
-msgid "APIFuzzing|Use this tool to generate API fuzzing configuration YAML to copy into your .gitlab-ci.yml file. This tool does not reflect or update your .gitlab-ci.yml file automatically."
-msgstr ""
-
msgid "APIFuzzing|Username for basic authentication"
msgstr ""
@@ -2128,9 +2143,6 @@ msgstr ""
msgid "Abuse reports notification email"
msgstr ""
-msgid "Abuse reports will be sent to this address if it is set. Abuse reports are always available in the admin area."
-msgstr ""
-
msgid "Accept invitation"
msgstr ""
@@ -2167,12 +2179,18 @@ msgstr ""
msgid "Access granted"
msgstr ""
+msgid "Access key ID"
+msgstr ""
+
msgid "Access requests"
msgstr ""
msgid "Access to '%{classification_label}' not allowed"
msgstr ""
+msgid "Access tokens expire after 2 hours. A refresh token may be used at any time to generate a new access token. Non-expiring access tokens are deprecated. Clear this setting to enable backward compatibility."
+msgstr ""
+
msgid "AccessDropdown|Deploy Keys"
msgstr ""
@@ -2485,6 +2503,9 @@ msgstr ""
msgid "Add new directory"
msgstr ""
+msgid "Add new service account"
+msgstr ""
+
msgid "Add or remove previously merged commits"
msgstr ""
@@ -2722,6 +2743,9 @@ msgstr ""
msgid "AdminArea|Features"
msgstr ""
+msgid "AdminArea|Get security updates from GitLab and stay up to date"
+msgstr ""
+
msgid "AdminArea|Groups"
msgstr ""
@@ -2761,6 +2785,12 @@ msgstr ""
msgid "AdminArea|Reporter"
msgstr ""
+msgid "AdminArea|Sign up for the GitLab Security Newsletter to get notified for security updates."
+msgstr ""
+
+msgid "AdminArea|Sign up for the GitLab newsletter"
+msgstr ""
+
msgid "AdminArea|Stop all jobs"
msgstr ""
@@ -2830,9 +2860,15 @@ msgstr ""
msgid "AdminSettings|Disable public access to Pages sites"
msgstr ""
+msgid "AdminSettings|Display a banner on merge requests in projects with no pipelines to initiate steps to add a .gitlab-ci.yml file."
+msgstr ""
+
msgid "AdminSettings|Domain verification is an essential security measure for public GitLab sites. Users are required to demonstrate they control a domain before it is enabled. %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "AdminSettings|Enable pipeline suggestion banner"
+msgstr ""
+
msgid "AdminSettings|Enable shared runners for new projects"
msgstr ""
@@ -3304,10 +3340,10 @@ msgstr ""
msgid "Admin|Quarterly reconciliation will occur on %{qrtlyDate}"
msgstr ""
-msgid "Admin|The number of max seats used for your namespace is currently exceeding the number of seats in your subscription. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgid "Admin|The number of max seats in your namespace exceeds the number of seats in your subscription. On %{qrtlyDate}, quarterly reconciliation occurs and you are automatically billed a prorated amount for the overage. No action is needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice. For more information about the timing of the invoicing process, view the documentation."
msgstr ""
-msgid "Admin|The number of maximum users for your instance is currently exceeding the number of users in license. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgid "Admin|The number of max users in your instance exceeds the number of users in your license. On %{qrtlyDate}, quarterly reconciliation occurs and you are automatically billed a prorated amount for the overage. No action is needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice. For more information about the timing of the invoicing process, view the documentation."
msgstr ""
msgid "Admin|View pending user approvals"
@@ -3328,9 +3364,6 @@ msgstr ""
msgid "Advanced export options"
msgstr ""
-msgid "Advanced permissions, Large File Storage and Two-Factor authentication settings."
-msgstr ""
-
msgid "After a successful password update you will be redirected to login screen."
msgstr ""
@@ -3349,17 +3382,14 @@ msgstr ""
msgid "After you've reviewed these contribution guidelines, you'll be all set to"
msgstr ""
+msgid "Akismet"
+msgstr ""
+
msgid "Akismet API Key"
msgstr ""
-msgid "Alert"
-msgid_plural "Alerts"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
-msgstr[4] ""
-msgstr[5] ""
+msgid "Akismet helps prevent the creation of spam issues in public projects."
+msgstr ""
msgid "AlertManagement|Acknowledged"
msgstr ""
@@ -3715,6 +3745,9 @@ msgstr ""
msgid "All (default)"
msgstr ""
+msgid "All GitLab"
+msgstr ""
+
msgid "All Members"
msgstr ""
@@ -3829,6 +3862,9 @@ msgstr ""
msgid "Allow this secondary node to replicate content on Object Storage"
msgstr ""
+msgid "Allow use of licensed EE features"
+msgstr ""
+
msgid "Allow users to dismiss the broadcast message"
msgstr ""
@@ -3904,9 +3940,6 @@ msgstr ""
msgid "Amazon authentication is not %{link_start}correctly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
-msgid "Amount of time (in hours) that users are allowed to skip forced configuration of two-factor authentication"
-msgstr ""
-
msgid "An %{link_start}alert%{link_end} with the same fingerprint is already open. To change the status of this alert, resolve the linked alert."
msgstr ""
@@ -3967,12 +4000,6 @@ msgstr ""
msgid "An error occurred when removing the label."
msgstr ""
-msgid "An error occurred when toggling the notification subscription"
-msgstr ""
-
-msgid "An error occurred when updating the issue weight"
-msgstr ""
-
msgid "An error occurred when updating the title"
msgstr ""
@@ -4021,6 +4048,9 @@ msgstr ""
msgid "An error occurred while enabling Service Desk."
msgstr ""
+msgid "An error occurred while fetching Markdown preview"
+msgstr ""
+
msgid "An error occurred while fetching ancestors"
msgstr ""
@@ -4051,9 +4081,6 @@ msgstr ""
msgid "An error occurred while fetching label colors."
msgstr ""
-msgid "An error occurred while fetching markdown preview"
-msgstr ""
-
msgid "An error occurred while fetching participants"
msgstr ""
@@ -4069,9 +4096,6 @@ msgstr ""
msgid "An error occurred while fetching reference"
msgstr ""
-msgid "An error occurred while fetching sidebar data"
-msgstr ""
-
msgid "An error occurred while fetching tags. Retry the search."
msgstr ""
@@ -4147,6 +4171,9 @@ msgstr ""
msgid "An error occurred while loading merge requests."
msgstr ""
+msgid "An error occurred while loading projects."
+msgstr ""
+
msgid "An error occurred while loading the Needs tab."
msgstr ""
@@ -4381,12 +4408,6 @@ msgstr ""
msgid "Any Milestone"
msgstr ""
-msgid "Any branch"
-msgstr ""
-
-msgid "Any eligible user"
-msgstr ""
-
msgid "Any encrypted tokens"
msgstr ""
@@ -4405,6 +4426,9 @@ msgstr ""
msgid "Any namespace"
msgstr ""
+msgid "App Engine description and apps that are suitable for this deployment target"
+msgstr ""
+
msgid "App ID"
msgstr ""
@@ -4561,6 +4585,15 @@ msgstr ""
msgid "Apply"
msgstr ""
+msgid "Apply %d suggestion"
+msgid_plural "Apply %d suggestions"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+msgstr[5] ""
+
msgid "Apply a label"
msgstr ""
@@ -4570,13 +4603,10 @@ msgstr ""
msgid "Apply suggestion"
msgstr ""
-msgid "Apply suggestions"
-msgstr ""
-
msgid "Apply template"
msgstr ""
-msgid "Apply this approval rule to any branch or a specific protected branch."
+msgid "Apply this approval rule to all branches or a specific protected branch."
msgstr ""
msgid "Applying"
@@ -4735,9 +4765,6 @@ msgstr ""
msgid "ApprovalSettings|Prevent editing approval rules in projects and merge requests."
msgstr ""
-msgid "ApprovalSettings|Prevent editing approval rules in projects and merge requests. "
-msgstr ""
-
msgid "ApprovalSettings|Remove all approvals when commits are added to the source branch."
msgstr ""
@@ -4753,6 +4780,9 @@ msgstr ""
msgid "ApprovalSettings|This setting is configured at the instance level and can only be changed by an administrator."
msgstr ""
+msgid "ApprovalSettings|This setting is configured in %{groupName} and can only be changed by an administrator or group owner."
+msgstr ""
+
msgid "ApprovalStatusTooltip|Adheres to separation of duties"
msgstr ""
@@ -5251,9 +5281,6 @@ msgstr ""
msgid "Authenticated API rate limit period in seconds"
msgstr ""
-msgid "Authenticated API request rate limit"
-msgstr ""
-
msgid "Authenticated API requests"
msgstr ""
@@ -5263,10 +5290,10 @@ msgstr ""
msgid "Authenticated Git LFS request rate limit"
msgstr ""
-msgid "Authenticated web rate limit period in seconds"
+msgid "Authenticated Git LFS requests"
msgstr ""
-msgid "Authenticated web request rate limit"
+msgid "Authenticated web rate limit period in seconds"
msgstr ""
msgid "Authenticated web requests"
@@ -5644,9 +5671,6 @@ msgstr ""
msgid "Below you will find all the groups that are public."
msgstr ""
-msgid "Beta"
-msgstr ""
-
msgid "Bi-weekly code coverage"
msgstr ""
@@ -5890,6 +5914,21 @@ msgstr ""
msgid "Board scope affects which issues are displayed for anyone who visits this board"
msgstr ""
+msgid "BoardNewEpic|Groups"
+msgstr ""
+
+msgid "BoardNewEpic|Loading groups"
+msgstr ""
+
+msgid "BoardNewEpic|No matching results"
+msgstr ""
+
+msgid "BoardNewEpic|Search groups"
+msgstr ""
+
+msgid "BoardNewEpic|Select a group"
+msgstr ""
+
msgid "BoardNewIssue|No matching results"
msgstr ""
@@ -5971,6 +6010,9 @@ msgstr ""
msgid "Boards|An error occurred while creating the list. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching child groups. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching group projects. Please try again."
msgstr ""
@@ -6307,6 +6349,9 @@ msgstr ""
msgid "Bulk update"
msgstr ""
+msgid "BulkImports|Re-import creates a new group. It does not sync with the existing group."
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -6316,6 +6361,9 @@ msgstr ""
msgid "BulkImport|From source group"
msgstr ""
+msgid "BulkImport|Group import history"
+msgstr ""
+
msgid "BulkImport|Import failed: Destination cannot be a subgroup of the source group. Change the destination and try again."
msgstr ""
@@ -6328,9 +6376,18 @@ msgstr ""
msgid "BulkImport|Importing the group failed"
msgstr ""
+msgid "BulkImport|Last imported to %{link}"
+msgstr ""
+
msgid "BulkImport|Name already exists."
msgstr ""
+msgid "BulkImport|New group"
+msgstr ""
+
+msgid "BulkImport|No history is available"
+msgstr ""
+
msgid "BulkImport|No parent"
msgstr ""
@@ -6343,6 +6400,9 @@ msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} matching filter \"%{filter}\" from %{link}"
msgstr ""
+msgid "BulkImport|Source group"
+msgstr ""
+
msgid "BulkImport|To new group"
msgstr ""
@@ -6352,6 +6412,9 @@ msgstr ""
msgid "BulkImport|You have no groups to import"
msgstr ""
+msgid "BulkImport|Your imported groups will appear here."
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -6598,6 +6661,9 @@ msgstr ""
msgid "Can be manually deployed to"
msgstr ""
+msgid "Can be overridden in each project."
+msgstr ""
+
msgid "Can create groups:"
msgstr ""
@@ -6700,6 +6766,9 @@ msgstr ""
msgid "Cancelling Preview"
msgstr ""
+msgid "Cannot assign a confidential epic to a non-confidential issue. Make the issue confidential and try again"
+msgstr ""
+
msgid "Cannot be assigned to other projects."
msgstr ""
@@ -6751,9 +6820,6 @@ msgstr ""
msgid "Cannot refer to a group %{timebox_type} by an internal id!"
msgstr ""
-msgid "Cannot set confidential epic for a non-confidential issue"
-msgstr ""
-
msgid "Cannot show preview. For previews on sketch files, they must have the file format introduced by Sketch version 43 and above."
msgstr ""
@@ -6991,15 +7057,15 @@ msgstr ""
msgid "Check out, review, and merge locally"
msgstr ""
-msgid "Check the %{docs_link_start}documentation%{docs_link_end}."
-msgstr ""
-
msgid "Check the current instance configuration "
msgstr ""
msgid "Check the elasticsearch.log file to debug why the migration was halted and make any changes before retrying the migration. When you fix the cause of the failure, click \"Retry migration\", and the migration will be scheduled to be retried in the background."
msgstr ""
+msgid "Check with your administrator."
+msgstr ""
+
msgid "Check your Docker images for known vulnerabilities."
msgstr ""
@@ -7030,6 +7096,9 @@ msgstr ""
msgid "Checkout"
msgstr ""
+msgid "Checkout|$%{selectedPlanPrice} per 10 GB storage per pack"
+msgstr ""
+
msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 minutes"
msgstr ""
@@ -7054,14 +7123,14 @@ msgstr ""
msgid "Checkout|%{name}'s GitLab subscription"
msgstr ""
-msgid "Checkout|%{selectedPlanText} plan"
+msgid "Checkout|%{name}'s storage subscription"
msgstr ""
-msgid "Checkout|%{startDate} - %{endDate}"
+msgid "Checkout|%{quantity} GB of storage"
msgstr ""
-msgid "Checkout|%{totalCiMinutes} CI minute"
-msgid_plural "Checkout|%{totalCiMinutes} CI minutes"
+msgid "Checkout|%{quantity} storage pack"
+msgid_plural "Checkout|%{quantity} storage packs"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
@@ -7069,6 +7138,12 @@ msgstr[3] ""
msgstr[4] ""
msgstr[5] ""
+msgid "Checkout|%{selectedPlanText} plan"
+msgstr ""
+
+msgid "Checkout|%{startDate} - %{endDate}"
+msgstr ""
+
msgid "Checkout|%{totalCiMinutes} CI minutes"
msgstr ""
@@ -7144,6 +7219,9 @@ msgstr ""
msgid "Checkout|Failed to register credit card. Please try again."
msgstr ""
+msgid "Checkout|GB"
+msgstr ""
+
msgid "Checkout|GitLab group"
msgstr ""
@@ -7180,6 +7258,9 @@ msgstr ""
msgid "Checkout|State"
msgstr ""
+msgid "Checkout|Storage packs"
+msgstr ""
+
msgid "Checkout|Street address"
msgstr ""
@@ -7201,6 +7282,9 @@ msgstr ""
msgid "Checkout|Total minutes: %{quantity}"
msgstr ""
+msgid "Checkout|Total storage: %{quantity} GB"
+msgstr ""
+
msgid "Checkout|Users"
msgstr ""
@@ -7210,16 +7294,25 @@ msgstr ""
msgid "Checkout|Your organization"
msgstr ""
+msgid "Checkout|Your storage subscription has the same term as your main subscription, and the price is prorated accordingly."
+msgstr ""
+
msgid "Checkout|Your subscription will be applied to this group"
msgstr ""
msgid "Checkout|Zip code"
msgstr ""
+msgid "Checkout|a storage subscription"
+msgstr ""
+
msgid "Checkout|company or team"
msgstr ""
-msgid "Checkout|x 1,000 minutes per pack = %{strong}"
+msgid "Checkout|minutes"
+msgstr ""
+
+msgid "Checkout|x %{quantity} %{units} per pack ="
msgstr ""
msgid "Cherry-pick this commit"
@@ -7576,6 +7669,9 @@ msgstr ""
msgid "CloneIssue|Cannot clone issue to target project as it is pending deletion."
msgstr ""
+msgid "CloneIssue|Cannot clone issues of '%{issue_type}' type."
+msgstr ""
+
msgid "Cloned this issue to %{path_to_project}."
msgstr ""
@@ -7630,7 +7726,10 @@ msgstr ""
msgid "Closes this %{quick_action_target}."
msgstr ""
-msgid "Cloud licenses can not be removed."
+msgid "Cloud Functions description and apps that are suitable for this deployment target"
+msgstr ""
+
+msgid "Cloud Run description and apps that are suitable for this deployment target"
msgstr ""
msgid "Cluster"
@@ -7657,6 +7756,12 @@ msgstr ""
msgid "ClusterAgents|Access tokens"
msgstr ""
+msgid "ClusterAgents|Agent might not be connected to GitLab"
+msgstr ""
+
+msgid "ClusterAgents|Agent never connected to GitLab"
+msgstr ""
+
msgid "ClusterAgents|Alternative installation methods"
msgstr ""
@@ -7672,6 +7777,12 @@ msgstr ""
msgid "ClusterAgents|Configuration"
msgstr ""
+msgid "ClusterAgents|Connected"
+msgstr ""
+
+msgid "ClusterAgents|Connection status"
+msgstr ""
+
msgid "ClusterAgents|Copy token"
msgstr ""
@@ -7690,6 +7801,9 @@ msgstr ""
msgid "ClusterAgents|For alternative installation methods %{linkStart}go to the documentation%{linkEnd}."
msgstr ""
+msgid "ClusterAgents|For more troubleshooting information go to"
+msgstr ""
+
msgid "ClusterAgents|Go to the repository"
msgstr ""
@@ -7705,18 +7819,30 @@ msgstr ""
msgid "ClusterAgents|Integrate with the GitLab Agent"
msgstr ""
-msgid "ClusterAgents|Last used"
+msgid "ClusterAgents|Last connected %{timeAgo}."
+msgstr ""
+
+msgid "ClusterAgents|Last contact"
msgstr ""
msgid "ClusterAgents|Learn how to create an agent access token"
msgstr ""
+msgid "ClusterAgents|Make sure you are using a valid token."
+msgstr ""
+
msgid "ClusterAgents|Name"
msgstr ""
msgid "ClusterAgents|Never"
msgstr ""
+msgid "ClusterAgents|Never connected"
+msgstr ""
+
+msgid "ClusterAgents|Not connected"
+msgstr ""
+
msgid "ClusterAgents|Read more about getting started"
msgstr ""
@@ -7738,6 +7864,9 @@ msgstr ""
msgid "ClusterAgents|Select which Agent you want to install"
msgstr ""
+msgid "ClusterAgents|The Agent has not been connected in a long time. There might be a connectivity issue. Last contact was %{timeAgo}."
+msgstr ""
+
msgid "ClusterAgents|The GitLab Agent also requires %{linkStart}enabling the Agent Server%{linkEnd}"
msgstr ""
@@ -7765,9 +7894,6 @@ msgstr ""
msgid "ClusterAgents|You will need to create a token to connect to your agent"
msgstr ""
-msgid "ClusterAgent|This feature is only available for premium plans"
-msgstr ""
-
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -7957,9 +8083,6 @@ msgstr ""
msgid "ClusterIntegration|Create Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Create a provision role on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the account and external ID above. %{startMoreInfoLink}More information%{endLink}"
-msgstr ""
-
msgid "ClusterIntegration|Create cluster on"
msgstr ""
@@ -8392,7 +8515,7 @@ msgstr ""
msgid "ClusterIntegration|Subnets"
msgstr ""
-msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provisioned role, first create one on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the above account and external IDs. %{startMoreInfoLink}More information%{endLink}"
+msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provisioned role, first create one on %{awsLinkStart}Amazon Web Services %{awsLinkEnd} using the above account and external IDs. %{moreInfoStart}More information%{moreInfoEnd}"
msgstr ""
msgid "ClusterIntegration|The Kubernetes certificate used to authenticate to the cluster."
@@ -8626,6 +8749,9 @@ msgstr ""
msgid "Collapse replies"
msgstr ""
+msgid "Collapse settings section"
+msgstr ""
+
msgid "Collapse sidebar"
msgstr ""
@@ -8644,6 +8770,9 @@ msgstr ""
msgid "Comma-separated list of email addresses."
msgstr ""
+msgid "Comma-separated list of users allowed to exceed the rate limit."
+msgstr ""
+
msgid "Comma-separated, e.g. '1.1.1.1, 2.2.2.0/24'"
msgstr ""
@@ -8968,6 +9097,9 @@ msgstr ""
msgid "Configure %{repository_checks_link_start}repository checks%{link_end} and %{housekeeping_link_start}housekeeping%{link_end} on repositories."
msgstr ""
+msgid "Configure CAPTCHAs, IP address limits, and other anti-spam measures."
+msgstr ""
+
msgid "Configure Dependency Scanning in `.gitlab-ci.yml` using the GitLab managed template. You can [add variable overrides](https://docs.gitlab.com/ee/user/application_security/dependency_scanning/#customizing-the-dependency-scanning-settings) to customize Dependency Scanning settings."
msgstr ""
@@ -9004,16 +9136,13 @@ msgstr ""
msgid "Configure a %{codeStart}.gitlab-webide.yml%{codeEnd} file in the %{codeStart}.gitlab%{codeEnd} directory to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
msgstr ""
-msgid "Configure existing installation"
-msgstr ""
-
-msgid "Configure limit for notes created per minute by web and API requests."
+msgid "Configure advanced permissions, Large File Storage, and two-factor authentication settings."
msgstr ""
-msgid "Configure limits for Project/Group Import/Export."
+msgid "Configure approvals by authors and committers on all projects."
msgstr ""
-msgid "Configure limits for web and API requests."
+msgid "Configure existing installation"
msgstr ""
msgid "Configure paths to be protected by Rack Attack."
@@ -9028,10 +9157,13 @@ msgstr ""
msgid "Configure settings for Advanced Search with Elasticsearch."
msgstr ""
+msgid "Configure specific limits for Files API requests that supersede the general user and IP rate limits."
+msgstr ""
+
msgid "Configure specific limits for Git LFS requests that supersede the general user and IP rate limits."
msgstr ""
-msgid "Configure specific limits for Packages API requests that supersede the general user and IP rate limits."
+msgid "Configure specific limits for deprecated API requests that supersede the general user and IP rate limits."
msgstr ""
msgid "Configure the %{link} integration."
@@ -9043,6 +9175,9 @@ msgstr ""
msgid "Configure the way a user creates a new account."
msgstr ""
+msgid "Configure via Merge Request"
+msgstr ""
+
msgid "Configure which lists are shown for anyone who visits this board"
msgstr ""
@@ -9523,6 +9658,9 @@ msgstr ""
msgid "Content parsed with %{link}."
msgstr ""
+msgid "ContentEditor|Table of Contents"
+msgstr ""
+
msgid "ContentEditor|You have to provide a renderMarkdown function or a custom serializer"
msgstr ""
@@ -9709,6 +9847,9 @@ msgstr ""
msgid "Copy link to chart"
msgstr ""
+msgid "Copy prefix"
+msgstr ""
+
msgid "Copy reference"
msgstr ""
@@ -9739,6 +9880,9 @@ msgstr ""
msgid "Copy value"
msgstr ""
+msgid "Corpus Management"
+msgstr ""
+
msgid "Corpus Management|Are you sure you want to delete the corpus?"
msgstr ""
@@ -9967,6 +10111,9 @@ msgstr ""
msgid "Create commit"
msgstr ""
+msgid "Create common files more quickly, and standardize their format."
+msgstr ""
+
msgid "Create confidential merge request"
msgstr ""
@@ -10000,6 +10147,9 @@ msgstr ""
msgid "Create issue"
msgstr ""
+msgid "Create issue to resolve all threads"
+msgstr ""
+
msgid "Create iteration"
msgstr ""
@@ -10054,6 +10204,9 @@ msgstr ""
msgid "Create new..."
msgstr ""
+msgid "Create or import your first project"
+msgstr ""
+
msgid "Create project"
msgstr ""
@@ -10411,7 +10564,7 @@ msgstr ""
msgid "Custom notification events"
msgstr ""
-msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notificationLinkStart} notification emails%{notificationLinkEnd}."
+msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notificationLinkStart}notification emails%{notificationLinkEnd}."
msgstr ""
msgid "Custom project templates"
@@ -10618,10 +10771,10 @@ msgstr[3] ""
msgstr[4] ""
msgstr[5] ""
-msgid "CycleAnalytics|Showing data for group '%{groupName}' and %{selectedProjectCount} projects from %{startDate} to %{endDate}"
+msgid "CycleAnalytics|Showing data for group '%{groupName}' and %{selectedProjectCount} projects from %{createdAfter} to %{createdBefore}"
msgstr ""
-msgid "CycleAnalytics|Showing data for group '%{groupName}' from %{startDate} to %{endDate}"
+msgid "CycleAnalytics|Showing data for group '%{groupName}' from %{createdAfter} to %{createdBefore}"
msgstr ""
msgid "CycleAnalytics|Stages"
@@ -10855,6 +11008,9 @@ msgstr ""
msgid "DastProfiles|Manage profiles"
msgstr ""
+msgid "DastProfiles|Manage site profiles"
+msgstr ""
+
msgid "DastProfiles|Minimum = 0 (no timeout enabled), Maximum = 2880 minutes"
msgstr ""
@@ -10930,6 +11086,9 @@ msgstr ""
msgid "DastProfiles|Scanner name"
msgstr ""
+msgid "DastProfiles|Schedule"
+msgstr ""
+
msgid "DastProfiles|Select branch"
msgstr ""
@@ -10999,7 +11158,7 @@ msgstr ""
msgid "DastProfiles|Website"
msgstr ""
-msgid "DastProfiles|You can either choose a passive scan or validate the target site in your chosen site profile. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
+msgid "DastProfiles|You can either choose a passive scan or validate the target site from the site profile management page. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
msgstr ""
msgid "DastProfiles|You cannot run an active scan against an unvalidated site."
@@ -11176,7 +11335,7 @@ msgstr ""
msgid "Days to merge"
msgstr ""
-msgid "Deactivate dormant users after 90 days of inactivity. Users can return to active status by signing in to their account. While inactive, a user is not counted as an active user in the instance."
+msgid "Deactivate dormant users after 90 days of inactivity"
msgstr ""
msgid "Dear Administrator,"
@@ -11263,10 +11422,10 @@ msgstr ""
msgid "Define a custom pattern with cron syntax"
msgstr ""
-msgid "Define approval settings."
+msgid "Define approval rules."
msgstr ""
-msgid "Define approval settings. %{linkStart}Learn more.%{linkEnd}"
+msgid "Define approval rules. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "Define custom rules for what constitutes spam, independent of Akismet"
@@ -11275,7 +11434,7 @@ msgstr ""
msgid "Define environments in the deploy stage(s) in %{code_open}.gitlab-ci.yml%{code_close} to track deployments here."
msgstr ""
-msgid "Define how approval rules are applied as a merge request moves toward completion."
+msgid "Define how approval rules are applied to merge requests."
msgstr ""
msgid "Definition"
@@ -11290,6 +11449,12 @@ msgstr ""
msgid "DelayedJobs|Are you sure you want to run %{job_name} immediately? This job will run automatically after it's timer finishes."
msgstr ""
+msgid "DelayedJobs|Are you sure you want to run %{job_name} immediately? This job will run automatically after its timer finishes."
+msgstr ""
+
+msgid "DelayedJobs|Run the delayed job now?"
+msgstr ""
+
msgid "DelayedJobs|Start now"
msgstr ""
@@ -11578,6 +11743,12 @@ msgstr ""
msgid "Dependency proxy image prefix"
msgstr ""
+msgid "DependencyProxy|Create a local proxy for storing frequently used upstream images. %{docLinkStart}Learn more%{docLinkEnd} about dependency proxies."
+msgstr ""
+
+msgid "DependencyProxy|Dependency Proxy"
+msgstr ""
+
msgid "DependencyProxy|Toggle Dependency Proxy"
msgstr ""
@@ -11830,6 +12001,9 @@ msgstr ""
msgid "Deployments"
msgstr ""
+msgid "Deployments to Google Kubernetes Engine can be "
+msgstr ""
+
msgid "Deployments|%{deployments} environment impacted."
msgid_plural "Deployments|%{deployments} environments impacted."
msgstr[0] ""
@@ -11863,6 +12037,9 @@ msgstr ""
msgid "Deployment|success"
msgstr ""
+msgid "Deprecated API rate limits"
+msgstr ""
+
msgid "Deprioritize label"
msgstr ""
@@ -12265,6 +12442,24 @@ msgstr ""
msgid "DiffsCompareBaseBranch|(base)"
msgstr ""
+msgid "Diffs|%d addition"
+msgid_plural "Diffs|%d additions"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+msgstr[5] ""
+
+msgid "Diffs|%d deletion"
+msgid_plural "Diffs|%d deletions"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+msgstr[5] ""
+
msgid "Diffs|No file name available"
msgstr ""
@@ -12274,9 +12469,21 @@ msgstr ""
msgid "Diffs|Show all unchanged lines"
msgstr ""
+msgid "Diffs|Showing %{dropdownStart}%{count} changed file%{dropdownEnd}"
+msgid_plural "Diffs|Showing %{dropdownStart}%{count} changed files%{dropdownEnd}"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+msgstr[5] ""
+
msgid "Diffs|Something went wrong while fetching diff lines."
msgstr ""
+msgid "Diffs|with %{additions} and %{deletions}"
+msgstr ""
+
msgid "Direct member"
msgstr ""
@@ -12406,9 +12613,6 @@ msgstr[3] ""
msgstr[4] ""
msgstr[5] ""
-msgid "Dismiss Value Stream Analytics introduction box"
-msgstr ""
-
msgid "Dismiss merge request promotion"
msgstr ""
@@ -12730,6 +12934,9 @@ msgstr ""
msgid "Edit issues"
msgstr ""
+msgid "Edit merge requests"
+msgstr ""
+
msgid "Edit public deploy key"
msgstr ""
@@ -12805,6 +13012,9 @@ msgstr ""
msgid "Elastic|None. Select projects to index."
msgstr ""
+msgid "Eligible users"
+msgstr ""
+
msgid "Email"
msgstr ""
@@ -12934,6 +13144,9 @@ msgstr ""
msgid "Enable"
msgstr ""
+msgid "Enable Amazon EKS integration"
+msgstr ""
+
msgid "Enable Auto DevOps"
msgstr ""
@@ -12967,6 +13180,9 @@ msgstr ""
msgid "Enable SSL verification"
msgstr ""
+msgid "Enable Service Ping"
+msgstr ""
+
msgid "Enable Snowplow tracking"
msgstr ""
@@ -12997,6 +13213,9 @@ msgstr ""
msgid "Enable authenticated Git LFS request rate limit"
msgstr ""
+msgid "Enable authenticated web request rate limit"
+msgstr ""
+
msgid "Enable authentication"
msgstr ""
@@ -13057,7 +13276,7 @@ msgstr ""
msgid "Enable or disable the Pseudonymizer data collection."
msgstr ""
-msgid "Enable or disable version check and service ping."
+msgid "Enable or disable version check and Service Ping."
msgstr ""
msgid "Enable protected paths rate limit"
@@ -13069,18 +13288,12 @@ msgstr ""
msgid "Enable reCAPTCHA"
msgstr ""
-msgid "Enable reCAPTCHA for login"
-msgstr ""
-
-msgid "Enable reCAPTCHA, Invisible Captcha, Akismet and set IP limits. For reCAPTCHA, we currently only support %{recaptcha_v2_link_start}v2%{recaptcha_v2_link_end}"
+msgid "Enable reCAPTCHA for login."
msgstr ""
msgid "Enable repository checks"
msgstr ""
-msgid "Enable service ping"
-msgstr ""
-
msgid "Enable shared runners for all projects and subgroups in this group."
msgstr ""
@@ -13102,7 +13315,10 @@ msgstr ""
msgid "Enable unauthenticated API request rate limit"
msgstr ""
-msgid "Enable unauthenticated request rate limit"
+msgid "Enable unauthenticated web request rate limit"
+msgstr ""
+
+msgid "Enable user deactivation emails"
msgstr ""
msgid "Enable version check"
@@ -13138,9 +13354,6 @@ msgstr ""
msgid "Enabled sources for code import during project creation. OmniAuth must be configured for GitHub"
msgstr ""
-msgid "Enabling this will only make licensed EE features available to projects if the project namespace's plan includes the feature or if the project is public."
-msgstr ""
-
msgid "Encountered an error while rendering: %{err}"
msgstr ""
@@ -13189,9 +13402,6 @@ msgstr ""
msgid "Enter Admin Mode"
msgstr ""
-msgid "Enter IP address range"
-msgstr ""
-
msgid "Enter a number"
msgstr ""
@@ -13204,9 +13414,6 @@ msgstr ""
msgid "Enter at least three characters to search"
msgstr ""
-msgid "Enter domain"
-msgstr ""
-
msgid "Enter in your Bitbucket Server URL and personal access token below"
msgstr ""
@@ -13393,9 +13600,6 @@ msgstr ""
msgid "Environments|Deployment %{status}"
msgstr ""
-msgid "Environments|Dismiss"
-msgstr ""
-
msgid "Environments|Enable review app"
msgstr ""
@@ -13408,9 +13612,6 @@ msgstr ""
msgid "Environments|Environments are places where code gets deployed, such as staging or production."
msgstr ""
-msgid "Environments|Help us improve environments"
-msgstr ""
-
msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
msgstr ""
@@ -13447,6 +13648,9 @@ msgstr ""
msgid "Environments|Note that this action will stop the environment, but it will %{emphasisStart}not%{emphasisEnd} have an effect on any existing deployment due to no “stop environment action†being defined in the %{ciConfigLinkStart}.gitlab-ci.yml%{ciConfigLinkEnd} file."
msgstr ""
+msgid "Environments|Open"
+msgstr ""
+
msgid "Environments|Open live environment"
msgstr ""
@@ -13486,9 +13690,6 @@ msgstr ""
msgid "Environments|Stopping %{environmentName}"
msgstr ""
-msgid "Environments|Take the survey"
-msgstr ""
-
msgid "Environments|There was an error fetching the logs. Please try again."
msgstr ""
@@ -13510,9 +13711,6 @@ msgstr ""
msgid "Environments|You don't have any environments right now"
msgstr ""
-msgid "Environments|Your feedback helps GitLab make environments better for you and other users. Participate and enter a sweepstake to win a USD 30 gift card."
-msgstr ""
-
msgid "Environments|by %{avatar}"
msgstr ""
@@ -13795,7 +13993,7 @@ msgstr ""
msgid "Error parsing CSV file. Please make sure it has"
msgstr ""
-msgid "Error rendering markdown preview"
+msgid "Error rendering Markdown preview"
msgstr ""
msgid "Error saving label update."
@@ -13843,6 +14041,9 @@ msgstr ""
msgid "Error: %{error_message}"
msgstr ""
+msgid "Error: Couldn't load some or all of the changes."
+msgstr ""
+
msgid "Error: No AWS credentials were supplied"
msgstr ""
@@ -13876,6 +14077,9 @@ msgstr ""
msgid "ErrorTracking|Enable error tracking"
msgstr ""
+msgid "ErrorTracking|Error tracking backend"
+msgstr ""
+
msgid "ErrorTracking|If you self-host Sentry, enter your Sentry instance's full URL. If you use Sentry's hosted solution, enter https://sentry.io"
msgstr ""
@@ -13909,6 +14113,12 @@ msgstr ""
msgid "Escalation policies must have at least one rule"
msgstr ""
+msgid "EscalationPolicies|%{clockIcon} IF alert is not %{alertStatus} in %{minutes}"
+msgstr ""
+
+msgid "EscalationPolicies|%{notificationIcon} THEN %{doAction} %{forScheduleOrUser}"
+msgstr ""
+
msgid "EscalationPolicies|+ Add an additional rule"
msgstr ""
@@ -13951,13 +14161,13 @@ msgstr ""
msgid "EscalationPolicies|Escalation policies"
msgstr ""
-msgid "EscalationPolicies|Escalation rules"
+msgid "EscalationPolicies|Escalation policy %{obstacle} in Project %{project}"
msgstr ""
-msgid "EscalationPolicies|Failed to load oncall-schedules"
+msgid "EscalationPolicies|Escalation rules"
msgstr ""
-msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} %{then} THEN %{doAction} %{scheduleOrUser}"
+msgid "EscalationPolicies|Failed to load oncall-schedules"
msgstr ""
msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} minutes"
@@ -14035,18 +14245,36 @@ msgstr ""
msgid "Every %{action} attempt has failed: %{job_error_message}. Please try again."
msgstr ""
+msgid "Every 3 months"
+msgstr ""
+
+msgid "Every 3 months on the %{day} at %{time} %{timezone}"
+msgstr ""
+
+msgid "Every 6 months"
+msgstr ""
+
+msgid "Every 6 months on the %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Every day"
msgstr ""
msgid "Every day (at %{time})"
msgstr ""
+msgid "Every day at %{time} %{timezone}"
+msgstr ""
+
msgid "Every month"
msgstr ""
msgid "Every month (Day %{day} at %{time})"
msgstr ""
+msgid "Every month on the %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Every three months"
msgstr ""
@@ -14065,6 +14293,15 @@ msgstr[5] ""
msgid "Every week (%{weekday} at %{time})"
msgstr ""
+msgid "Every week on %{day} at %{time} %{timezone}"
+msgstr ""
+
+msgid "Every year"
+msgstr ""
+
+msgid "Every year on %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Everyone"
msgstr ""
@@ -14101,9 +14338,6 @@ msgstr ""
msgid "Exactly one of %{attributes} is required"
msgstr ""
-msgid "Example: %{ip_address}. %{read_more_link}."
-msgstr ""
-
msgid "Example: @sub\\.company\\.com$"
msgstr ""
@@ -14170,13 +14404,13 @@ msgstr ""
msgid "Expand pipeline"
msgstr ""
-msgid "Expand sidebar"
+msgid "Expand settings section"
msgstr ""
-msgid "Expected documents: %{expected_documents}"
+msgid "Expand sidebar"
msgstr ""
-msgid "Experienced"
+msgid "Expected documents: %{expected_documents}"
msgstr ""
msgid "ExperimentSubject|Must have exactly one of User, Namespace, or Project."
@@ -14461,9 +14695,6 @@ msgstr ""
msgid "Failed to load related branches"
msgstr ""
-msgid "Failed to load sidebar lock status"
-msgstr ""
-
msgid "Failed to load stacktrace."
msgstr ""
@@ -14896,6 +15127,9 @@ msgstr ""
msgid "Files"
msgstr ""
+msgid "Files API Rate Limits"
+msgstr ""
+
msgid "Files breadcrumb"
msgstr ""
@@ -15895,6 +16129,9 @@ msgstr ""
msgid "GitLab group: %{source_link}"
msgstr ""
+msgid "GitLab informs you if a new version is available."
+msgstr ""
+
msgid "GitLab is a complete DevOps platform, delivered as a single application, fundamentally changing the way Development, Security, and Ops teams collaborate"
msgstr ""
@@ -15910,7 +16147,7 @@ msgstr ""
msgid "GitLab is open source software to collaborate on code."
msgstr ""
-msgid "GitLab is undergoing maintenance and is operating in a read-only mode."
+msgid "GitLab is undergoing maintenance and is operating in read-only mode."
msgstr ""
msgid "GitLab member or Email address"
@@ -15922,9 +16159,6 @@ msgstr ""
msgid "GitLab project export"
msgstr ""
-msgid "GitLab restart is required to apply changes."
-msgstr ""
-
msgid "GitLab single sign-on URL"
msgstr ""
@@ -15940,9 +16174,6 @@ msgstr ""
msgid "GitLab version"
msgstr ""
-msgid "GitLab will inform you if a new version is available."
-msgstr ""
-
msgid "GitLab will run a background job that will produce pseudonymized CSVs of the GitLab database that will be uploaded to your configured object storage directory."
msgstr ""
@@ -16207,9 +16438,21 @@ msgstr ""
msgid "Go to snippets"
msgstr ""
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check 'Allowed domains for sign-ups'."
+msgstr ""
+
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check 'Email restrictions for sign-ups'."
+msgstr ""
+
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check the 'Domain denylist'."
+msgstr ""
+
msgid "Go to the activity feed"
msgstr ""
+msgid "Go to the group’s 'Settings &gt; General' page, and check 'Restrict membership by email domain'."
+msgstr ""
+
msgid "Go to the milestone list"
msgstr ""
@@ -16246,6 +16489,12 @@ msgstr ""
msgid "Goal of the changes and what reviewers should be aware of"
msgstr ""
+msgid "Google Cloud"
+msgstr ""
+
+msgid "Google Cloud offers several deployment targets. Select the one most suitable for your project."
+msgstr ""
+
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
@@ -16330,9 +16579,6 @@ msgstr ""
msgid "Group ID"
msgstr ""
-msgid "Group ID: %{group_id}"
-msgstr ""
-
msgid "Group Owner must have signed in with SAML before enabling Group Managed Accounts"
msgstr ""
@@ -16507,6 +16753,12 @@ msgstr ""
msgid "GroupImport|Unable to process group import file"
msgstr ""
+msgid "GroupPage|Copy group ID"
+msgstr ""
+
+msgid "GroupPage|Group ID: %{group_id}"
+msgstr ""
+
msgid "GroupRoadmap|%{dateWord} – No end date"
msgstr ""
@@ -16561,6 +16813,9 @@ msgstr ""
msgid "GroupRoadmap|Within 3 years"
msgstr ""
+msgid "GroupSAML|\"persistent\" recommended"
+msgstr ""
+
msgid "GroupSAML|%{strongOpen}Warning%{strongClose} - Enabling %{linkStart}SSO enforcement%{linkEnd} can reduce security risks."
msgstr ""
@@ -16693,6 +16948,9 @@ msgstr ""
msgid "GroupSAML|To be able to prohibit outer forks, you first need to enforce dedicate group managed accounts."
msgstr ""
+msgid "GroupSAML|Use SAML group links to manage group membership using SAML."
+msgstr ""
+
msgid "GroupSAML|Valid SAML Response"
msgstr ""
@@ -16705,13 +16963,10 @@ msgstr ""
msgid "GroupSAML|as %{access_level}"
msgstr ""
-msgid "GroupSAML|must match stored NameID of \"%{extern_uid}\" as we use this to identify users. If the NameID changes users will be unable to sign in."
-msgstr ""
-
-msgid "GroupSAML|should be \"persistent\""
+msgid "GroupSAML|must match stored NameID of \"%{extern_uid}\" to identify user and allow sign in"
msgstr ""
-msgid "GroupSAML|should be a random persistent ID, emails are discouraged"
+msgid "GroupSAML|recommend persistent ID instead of email"
msgstr ""
msgid "GroupSelect|No matching results"
@@ -16726,9 +16981,15 @@ msgstr ""
msgid "GroupSettings|Allow project access token creation"
msgstr ""
+msgid "GroupSettings|Applied to all subgroups unless overridden by a group owner. Groups already added to the project lose access."
+msgstr ""
+
msgid "GroupSettings|Auto DevOps pipeline was updated for the group"
msgstr ""
+msgid "GroupSettings|Available only on the top-level group. Applies to all subgroups. Groups already shared with a group outside %{group} are still shared unless removed manually."
+msgstr ""
+
msgid "GroupSettings|Badges"
msgstr ""
@@ -16780,6 +17041,9 @@ msgstr ""
msgid "GroupSettings|New runners registration token has been generated!"
msgstr ""
+msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgstr ""
+
msgid "GroupSettings|Pipeline settings was updated for the group"
msgstr ""
@@ -16792,12 +17056,15 @@ msgstr ""
msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
-msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups."
+msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups"
msgstr ""
msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
msgstr ""
+msgid "GroupSettings|Prevents group members from being notified if the group is mentioned."
+msgstr ""
+
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
msgstr ""
@@ -16834,21 +17101,6 @@ msgstr ""
msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}."
msgstr ""
-msgid "GroupSettings|This setting is only available on the top-level group and it applies to all subgroups. Groups that have already been shared with a group outside %{group} will still be shared, and this access will have to be revoked manually."
-msgstr ""
-
-msgid "GroupSettings|This setting will be applied to all subgroups unless overridden by a group owner. Groups that already have access to the project will continue to have access unless removed manually."
-msgstr ""
-
-msgid "GroupSettings|This setting will override user notification preferences for all members of the group, subgroups, and projects."
-msgstr ""
-
-msgid "GroupSettings|This setting will prevent group members from being notified if the group is mentioned."
-msgstr ""
-
-msgid "GroupSettings|This setting will prevent group members from forking projects outside of the group."
-msgstr ""
-
msgid "GroupSettings|Transfer group"
msgstr ""
@@ -16966,7 +17218,7 @@ msgstr ""
msgid "GroupsNew|No import options available"
msgstr ""
-msgid "GroupsNew|Not all related objects are migrated, as %{docs_link_start}described here%{docs_link_end}. Please %{feedback_link_start}leave feedback%{feedback_link_end} on this feature."
+msgid "GroupsNew|Not all related objects are migrated. %{docs_link_start}More info%{docs_link_end}."
msgstr ""
msgid "GroupsNew|Personal access token"
@@ -17098,15 +17350,27 @@ msgstr ""
msgid "Hello %{name},"
msgstr ""
-msgid "Hello there"
-msgstr ""
-
msgid "Hello, %{name}!"
msgstr ""
msgid "Hello, %{username}!"
msgstr ""
+msgid "HelloMessage|%{handshake_emoji} Contribute to GitLab: %{contribute_link}"
+msgstr ""
+
+msgid "HelloMessage|%{magnifier_emoji} Create a new GitLab issue: %{new_issue_link}"
+msgstr ""
+
+msgid "HelloMessage|%{rocket_emoji} We like your curiosity! Help us improve GitLab by joining the team: %{jobs_page_link}"
+msgstr ""
+
+msgid "HelloMessage|Does this page need fixes or improvements? Open an issue or contribute a merge request to help make GitLab more lovable. At GitLab, everyone can contribute!"
+msgstr ""
+
+msgid "HelloMessage|Welcome to GitLab!"
+msgstr ""
+
msgid "Help"
msgstr ""
@@ -17116,13 +17380,10 @@ msgstr ""
msgid "Helps prevent bots from creating accounts."
msgstr ""
-msgid "Helps prevent bots from creating issues"
+msgid "Helps prevent bots from creating issues."
msgstr ""
-msgid "Helps prevent malicious users hide their activity"
-msgstr ""
-
-msgid "Helps reduce request volume (e.g. from crawlers or abusive bots)"
+msgid "Helps prevent malicious users hide their activity."
msgstr ""
msgid "Helps reduce request volume (for example, from crawlers or abusive bots)"
@@ -17254,6 +17515,12 @@ msgstr ""
msgid "Housekeeping, export, path, transfer, remove, archive."
msgstr ""
+msgid "How do I configure Akismet?"
+msgstr ""
+
+msgid "How do I configure it?"
+msgstr ""
+
msgid "How do I configure runners?"
msgstr ""
@@ -17275,19 +17542,25 @@ msgstr ""
msgid "How do I set up this service?"
msgstr ""
+msgid "How do I use a web terminal?"
+msgstr ""
+
+msgid "How do I use file templates?"
+msgstr ""
+
msgid "How it works"
msgstr ""
msgid "How many days need to pass between marking entity for deletion and actual removing it."
msgstr ""
-msgid "How many seconds an IP will be counted towards the limit"
+msgid "How many seconds an IP counts toward the IP address limit."
msgstr ""
-msgid "I accept the %{terms_link}"
+msgid "How the job limiter handles jobs exceeding the thresholds specified below. The 'track' mode only logs the jobs. The 'compress' mode compresses the jobs and raises an exception if the compressed size exceeds the limit."
msgstr ""
-msgid "I accept the|Terms of Service and Privacy Policy"
+msgid "I accept the %{terms_link}"
msgstr ""
msgid "I forgot my password"
@@ -17371,13 +17644,16 @@ msgstr ""
msgid "IP Address"
msgstr ""
-msgid "IP expiration time"
+msgid "IP address expiration time"
msgstr ""
-msgid "IP subnet restriction only allowed for top-level groups"
+msgid "IP address restrictions"
msgstr ""
-msgid "IPs per user"
+msgid "IP addresses per user"
+msgstr ""
+
+msgid "IP subnet restriction only allowed for top-level groups"
msgstr ""
msgid "Identifier"
@@ -17392,6 +17668,9 @@ msgstr ""
msgid "If any indexed field exceeds this limit it will be truncated to this number of characters and the rest will not be indexed or searchable. This does not apply to repository and wiki indexing. Setting this to 0 means it is unlimited."
msgstr ""
+msgid "If blank, defaults to %{code_open}Retry later%{code_close}."
+msgstr ""
+
msgid "If blank, set allowable lifetime to %{instance_level_policy_in_words}, as defined by the instance admin. Once set, existing tokens for users in this group may be revoked."
msgstr ""
@@ -17443,6 +17722,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 did not initiate these sign-in attempts, please reach out to your administrator or enable two-factor authentication (2FA) on your account."
+msgstr ""
+
msgid "If you did not initiate this change, please contact your administrator immediately."
msgstr ""
@@ -17542,10 +17824,10 @@ msgstr ""
msgid "Import Projects from Gitea"
msgstr ""
-msgid "Import a project"
+msgid "Import an exported GitLab project"
msgstr ""
-msgid "Import an exported GitLab project"
+msgid "Import and export rate limits"
msgstr ""
msgid "Import failed due to a GitHub error: %{original}"
@@ -17557,12 +17839,18 @@ msgstr ""
msgid "Import from Jira"
msgstr ""
+msgid "Import group"
+msgstr ""
+
msgid "Import group from file"
msgstr ""
msgid "Import groups"
msgstr ""
+msgid "Import history"
+msgstr ""
+
msgid "Import in progress"
msgstr ""
@@ -17626,7 +17914,25 @@ msgstr ""
msgid "Import timed out. Import took longer than %{import_jobs_expiration} seconds"
msgstr ""
-msgid "Import/Export Rate Limits"
+msgid "ImportAProjectModal|Import from a project"
+msgstr ""
+
+msgid "ImportAProjectModal|Import members from another project"
+msgstr ""
+
+msgid "ImportAProjectModal|Import project members"
+msgstr ""
+
+msgid "ImportAProjectModal|Only project members (not group members) are imported, and they get the same permissions as the project you import from."
+msgstr ""
+
+msgid "ImportAProjectModal|Successfully imported"
+msgstr ""
+
+msgid "ImportAProjectModal|Unable to import project members"
+msgstr ""
+
+msgid "ImportAProjectModal|You're importing members to the %{strongStart}%{name}%{strongEnd} project."
msgstr ""
msgid "ImportButtons|Connect repositories from"
@@ -17683,7 +17989,7 @@ msgstr[5] ""
msgid "Importing..."
msgstr ""
-msgid "Import|A repository URL usually ends in a .git suffix, although this is not required. Double check to make sure your repository URL is correct."
+msgid "Import|There is not a valid Git repository at this URL. If your HTTP repository is not publicly accessible, verify your credentials."
msgstr ""
msgid "Improve customer support with Service Desk"
@@ -17692,9 +17998,6 @@ msgstr ""
msgid "Improves Git cloning performance."
msgstr ""
-msgid "In %{time_to_now}"
-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 ""
@@ -17980,7 +18283,7 @@ msgstr ""
msgid "InProductMarketing|Start a GitLab Ultimate trial today in less than one minute, no credit card required."
msgstr ""
-msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no CC required"
+msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no credit card required"
msgstr ""
msgid "InProductMarketing|Start a trial"
@@ -18019,7 +18322,7 @@ msgstr ""
msgid "InProductMarketing|Team up in GitLab for greater efficiency"
msgstr ""
-msgid "InProductMarketing|Team work makes the dream work"
+msgid "InProductMarketing|Team work makes the dream work"
msgstr ""
msgid "InProductMarketing|Test, create, deploy"
@@ -18604,6 +18907,9 @@ msgstr ""
msgid "Integrations|Create new issue in Jira"
msgstr ""
+msgid "Integrations|Create new issue in ZenTao"
+msgstr ""
+
msgid "Integrations|Default settings are inherited from the group level."
msgstr ""
@@ -18697,9 +19003,15 @@ msgstr ""
msgid "Integrations|Search Jira issues"
msgstr ""
+msgid "Integrations|Search ZenTao issues"
+msgstr ""
+
msgid "Integrations|Send notifications about project events to Unify Circuit."
msgstr ""
+msgid "Integrations|Send notifications about project events to a Unify Circuit conversation. %{docs_link}"
+msgstr ""
+
msgid "Integrations|Sign in to add namespaces"
msgstr ""
@@ -18739,6 +19051,9 @@ msgstr ""
msgid "Integrations|You've activated every integration 🎉"
msgstr ""
+msgid "Integrations|ZenTao issues display here when you create issues in your project in ZenTao."
+msgstr ""
+
msgid "Interactive mode"
msgstr ""
@@ -18766,9 +19081,6 @@ msgstr ""
msgid "Interval Pattern"
msgstr ""
-msgid "Introducing Value Stream Analytics"
-msgstr ""
-
msgid "Introducing Your DevOps Report"
msgstr ""
@@ -18865,6 +19177,12 @@ msgstr ""
msgid "Investigate vulnerability: %{title}"
msgstr ""
+msgid "Invisible Captcha"
+msgstr ""
+
+msgid "Invisible Captcha helps prevent the creation of spam accounts. It adds a honeypot field and time-sensitive form submission to the account signup form."
+msgstr ""
+
msgid "Invitation"
msgstr ""
@@ -19318,12 +19636,18 @@ msgstr ""
msgid "Issues"
msgstr ""
+msgid "Issues I've created"
+msgstr ""
+
msgid "Issues Rate Limits"
msgstr ""
msgid "Issues and merge requests"
msgstr ""
+msgid "Issues assigned to me"
+msgstr ""
+
msgid "Issues can be bugs, tasks or ideas to be discussed. Also, issues are searchable and filterable."
msgstr ""
@@ -19435,7 +19759,7 @@ msgstr ""
msgid "Iterations|Create cadence"
msgstr ""
-msgid "Iterations|Create your first iteration"
+msgid "Iterations|Create iteration"
msgstr ""
msgid "Iterations|Delete cadence"
@@ -19444,6 +19768,9 @@ msgstr ""
msgid "Iterations|Delete iteration cadence?"
msgstr ""
+msgid "Iterations|Delete iteration?"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -19477,12 +19804,18 @@ msgstr ""
msgid "Iterations|New iteration cadence"
msgstr ""
+msgid "Iterations|No closed iterations."
+msgstr ""
+
msgid "Iterations|No iteration cadences to show."
msgstr ""
msgid "Iterations|No iterations in cadence."
msgstr ""
+msgid "Iterations|No open iterations."
+msgstr ""
+
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
@@ -19513,6 +19846,9 @@ msgstr ""
msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
msgstr ""
+msgid "Iterations|This will remove the iteration from any issues that are assigned to it."
+msgstr ""
+
msgid "Iterations|Title"
msgstr ""
@@ -19528,15 +19864,9 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "I’m familiar with the basics of DevOps."
-msgstr ""
-
msgid "I’m joining my team who’s already on GitLab"
msgstr ""
-msgid "I’m not familiar with the basics of DevOps."
-msgstr ""
-
msgid "Jaeger URL"
msgstr ""
@@ -19801,6 +20131,9 @@ msgstr ""
msgid "Job"
msgstr ""
+msgid "Job %{jobName}"
+msgstr ""
+
msgid "Job Failed #%{build_id}"
msgstr ""
@@ -20395,9 +20728,6 @@ msgstr ""
msgid "Learn more in the"
msgstr ""
-msgid "Learn more in the|pipeline schedules documentation"
-msgstr ""
-
msgid "Learn more."
msgstr ""
@@ -20509,9 +20839,6 @@ msgstr ""
msgid "Leave Admin Mode"
msgstr ""
-msgid "Leave blank for no limit. Once set, existing personal access tokens may be revoked."
-msgstr ""
-
msgid "Leave edit mode? All unsaved changes will be lost."
msgstr ""
@@ -20557,10 +20884,10 @@ msgstr ""
msgid "LicenseCompliance|Acceptable license to be used in the project"
msgstr ""
-msgid "LicenseCompliance|Add a license"
+msgid "LicenseCompliance|Add license and related policy"
msgstr ""
-msgid "LicenseCompliance|Add license and related policy"
+msgid "LicenseCompliance|Add license policy"
msgstr ""
msgid "LicenseCompliance|Allow"
@@ -20674,6 +21001,9 @@ msgstr ""
msgid "LicenseManagement|Uncategorized"
msgstr ""
+msgid "Licensed Enterprise Edition features can be used if the project namespace's plan includes the feature, or if the project is public."
+msgstr ""
+
msgid "Licensed Features"
msgstr ""
@@ -20740,7 +21070,10 @@ msgstr ""
msgid "Limit namespaces and projects that can be indexed"
msgstr ""
-msgid "Limit sign in from multiple ips"
+msgid "Limit project size at a global, group, and project level. %{link_start}Learn more%{link_end}."
+msgstr ""
+
+msgid "Limit sign in from multiple IP addresses"
msgstr ""
msgid "Limit the number of concurrent operations this secondary site can run in the background."
@@ -20752,6 +21085,9 @@ msgstr ""
msgid "Limit the number of issues and epics per minute a user can create through web and API requests."
msgstr ""
+msgid "Limit the size of Sidekiq jobs stored in Redis."
+msgstr ""
+
msgid "Limited to showing %d event at most"
msgid_plural "Limited to showing %d events at most"
msgstr[0] ""
@@ -20761,6 +21097,9 @@ msgstr[3] ""
msgstr[4] ""
msgstr[5] ""
+msgid "Limiting mode"
+msgstr ""
+
msgid "Line changes"
msgstr ""
@@ -20830,9 +21169,6 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
-msgid "List of users to be excluded from the limit"
-msgstr ""
-
msgid "List options"
msgstr ""
@@ -20872,9 +21208,6 @@ msgstr ""
msgid "Loading functions timed out. Please reload the page to try again."
msgstr ""
-msgid "Loading issues"
-msgstr ""
-
msgid "Loading more"
msgstr ""
@@ -21166,6 +21499,9 @@ msgstr ""
msgid "Marked For Deletion At - %{deletion_time}"
msgstr ""
+msgid "Marked as ready. Merging is now allowed."
+msgstr ""
+
msgid "Marked this %{noun} as a draft."
msgstr ""
@@ -21238,52 +21574,22 @@ msgstr ""
msgid "Max 100,000 events"
msgstr ""
-msgid "Max 20 characters"
-msgstr ""
-
-msgid "Max Group Export Download requests per minute per user"
-msgstr ""
-
-msgid "Max Group Export requests per minute per user"
-msgstr ""
-
-msgid "Max Group Import requests per minute per user"
-msgstr ""
-
-msgid "Max Project Export Download requests per minute per user"
-msgstr ""
-
-msgid "Max Project Export requests per minute per user"
-msgstr ""
-
-msgid "Max Project Import requests per minute per user"
-msgstr ""
-
-msgid "Max authenticated API requests per period per user"
-msgstr ""
-
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
-msgid "Max authenticated web requests per period per user"
-msgstr ""
-
msgid "Max file size is 200 KB."
msgstr ""
-msgid "Max requests per minute per user"
-msgstr ""
-
msgid "Max role"
msgstr ""
msgid "Max session time"
msgstr ""
-msgid "Max unauthenticated requests per period per IP"
+msgid "MaxBuilds"
msgstr ""
-msgid "MaxBuilds"
+msgid "Maximum 20 characters"
msgstr ""
msgid "Maximum Conan package file size in bytes"
@@ -21319,6 +21625,12 @@ msgstr ""
msgid "Maximum attachment size (MB)"
msgstr ""
+msgid "Maximum authenticated API requests per rate limit period per user"
+msgstr ""
+
+msgid "Maximum authenticated web requests per rate limit period per user"
+msgstr ""
+
msgid "Maximum bulk request size (MiB)"
msgstr ""
@@ -21364,6 +21676,15 @@ msgstr ""
msgid "Maximum files in a diff"
msgstr ""
+msgid "Maximum group export download requests per minute"
+msgstr ""
+
+msgid "Maximum group export requests per minute"
+msgstr ""
+
+msgid "Maximum group import requests per minute"
+msgstr ""
+
msgid "Maximum import size"
msgstr ""
@@ -21400,7 +21721,7 @@ msgstr ""
msgid "Maximum number of projects."
msgstr ""
-msgid "Maximum number of unique IPs per user"
+msgid "Maximum number of unique IP addresses per user."
msgstr ""
msgid "Maximum page reached"
@@ -21409,12 +21730,24 @@ msgstr ""
msgid "Maximum page size"
msgstr ""
+msgid "Maximum project export download requests per minute"
+msgstr ""
+
+msgid "Maximum project export requests per minute"
+msgstr ""
+
+msgid "Maximum project import requests per minute"
+msgstr ""
+
msgid "Maximum push size"
msgstr ""
msgid "Maximum push size (MB)"
msgstr ""
+msgid "Maximum requests per minute"
+msgstr ""
+
msgid "Maximum running slices"
msgstr ""
@@ -21442,10 +21775,16 @@ msgstr ""
msgid "Maximum time between updates that a mirror can have when scheduled to synchronize."
msgstr ""
-msgid "Maximum time for web terminal websocket connection (in seconds). 0 for unlimited."
+msgid "Maximum time that users are allowed to skip the setup of two-factor authentication (in hours). Set to 0 (zero) to enforce at next sign in."
+msgstr ""
+
+msgid "Maximum time, in seconds, for a web terminal websocket connection. 0 for unlimited."
msgstr ""
-msgid "Maximum 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."
+msgid "Maximum unauthenticated API requests per rate limit period per IP"
+msgstr ""
+
+msgid "Maximum unauthenticated web requests per rate limit period per IP"
msgstr ""
msgid "May"
@@ -21463,9 +21802,6 @@ msgstr ""
msgid "Medium vulnerabilities present"
msgstr ""
-msgid "Member lock"
-msgstr ""
-
msgid "Member since"
msgstr ""
@@ -21502,6 +21838,9 @@ msgstr ""
msgid "Members of a group may only view projects they have permission to access"
msgstr ""
+msgid "Membership"
+msgstr ""
+
msgid "Members|%{time} by %{user}"
msgstr ""
@@ -21562,9 +21901,6 @@ msgstr ""
msgid "Members|Expiration date updated successfully."
msgstr ""
-msgid "Members|Expired"
-msgstr ""
-
msgid "Members|Filter members"
msgstr ""
@@ -21580,9 +21916,6 @@ msgstr ""
msgid "Members|Membership"
msgstr ""
-msgid "Members|No expiration set"
-msgstr ""
-
msgid "Members|Remove \"%{groupName}\""
msgstr ""
@@ -21604,9 +21937,6 @@ msgstr ""
msgid "Members|Search invited"
msgstr ""
-msgid "Members|in %{time}"
-msgstr ""
-
msgid "Member|Deny access"
msgstr ""
@@ -21682,9 +22012,6 @@ msgstr ""
msgid "Merge request %{mr_link} was reviewed by %{mr_author}"
msgstr ""
-msgid "Merge request (MR) approvals"
-msgstr ""
-
msgid "Merge request analytics"
msgstr ""
@@ -21706,12 +22033,21 @@ msgstr ""
msgid "Merge requests"
msgstr ""
+msgid "Merge requests I've created"
+msgstr ""
+
msgid "Merge requests are a place to propose changes you've made to a project and discuss those changes with others"
msgstr ""
msgid "Merge requests are read-only in a secondary Geo node"
msgstr ""
+msgid "Merge requests assigned to me"
+msgstr ""
+
+msgid "Merge requests that I'm a reviewer"
+msgstr ""
+
msgid "Merge the branch and fix any conflicts that come up"
msgstr ""
@@ -21772,10 +22108,10 @@ msgstr ""
msgid "MergeRequests|An error occurred while saving the draft comment."
msgstr ""
-msgid "MergeRequests|Failed to squash. Should be done manually."
+msgid "MergeRequests|Create issue to resolve thread"
msgstr ""
-msgid "MergeRequests|Resolve this thread in a new issue"
+msgid "MergeRequests|Failed to squash. Should be done manually."
msgstr ""
msgid "MergeRequests|Saving the comment failed"
@@ -22597,6 +22933,9 @@ msgstr ""
msgid "MoveIssue|Cannot move issue to project it originates from!"
msgstr ""
+msgid "MoveIssue|Cannot move issues of '%{issue_type}' type."
+msgstr ""
+
msgid "Moved issue to %{label} column in the board."
msgstr ""
@@ -22726,6 +23065,15 @@ 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. To learn more about reducing storage capacity please visit our docs."
msgstr ""
+msgid "NamespaceUserCap|Pending users must be reviewed and approved by a group owner. Learn more about %{user_caps_link_start}User Caps%{link_end} and %{users_pending_approval_link_start}Users Pending Approval%{link_end}."
+msgstr ""
+
+msgid "NamespaceUserCap|View pending user approvals"
+msgstr ""
+
+msgid "NamespaceUserCap|Your group has reached its billable member limit"
+msgstr ""
+
msgid "Namespaces"
msgstr ""
@@ -22768,9 +23116,6 @@ msgstr ""
msgid "Network"
msgstr ""
-msgid "Network Policy|New rule"
-msgstr ""
-
msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is inbound from a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
msgstr ""
@@ -22792,16 +23137,13 @@ msgstr ""
msgid "NetworkPolicies|%{strongOpen}any%{strongClose} port"
msgstr ""
-msgid "NetworkPolicies|+ Add alert"
-msgstr ""
-
msgid "NetworkPolicies|.yaml"
msgstr ""
msgid "NetworkPolicies|.yaml mode"
msgstr ""
-msgid "NetworkPolicies|Actions"
+msgid "NetworkPolicies|Add alert"
msgstr ""
msgid "NetworkPolicies|Alerts are intended to be selectively used for a limited number of events that are potentially concerning and warrant a manual review. Alerts should not be used as a substitute for a SIEM or a logging tool. High volume alerts are likely to be dropped so as to preserve the stability of GitLab's integration with Kubernetes."
@@ -22837,9 +23179,6 @@ msgstr ""
msgid "NetworkPolicies|Deny all traffic"
msgstr ""
-msgid "NetworkPolicies|Description"
-msgstr ""
-
msgid "NetworkPolicies|Edit policy"
msgstr ""
@@ -22852,9 +23191,6 @@ msgstr ""
msgid "NetworkPolicies|IP/subnet"
msgstr ""
-msgid "NetworkPolicies|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
-msgstr ""
-
msgid "NetworkPolicies|Invalid or empty policy"
msgstr ""
@@ -22864,19 +23200,16 @@ msgstr ""
msgid "NetworkPolicies|Kubernetes error: %{error}"
msgstr ""
-msgid "NetworkPolicies|Name"
-msgstr ""
-
msgid "NetworkPolicies|Network"
msgstr ""
-msgid "NetworkPolicies|Network traffic"
+msgid "NetworkPolicies|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
msgstr ""
-msgid "NetworkPolicies|New policy"
+msgid "NetworkPolicies|Network policy can be created after the environment is loaded successfully."
msgstr ""
-msgid "NetworkPolicies|No policies detected"
+msgid "NetworkPolicies|Network traffic"
msgstr ""
msgid "NetworkPolicies|None selected"
@@ -22885,21 +23218,12 @@ msgstr ""
msgid "NetworkPolicies|Please %{installLinkStart}install%{installLinkEnd} and %{configureLinkStart}configure a Kubernetes Agent for this project%{configureLinkEnd} to enable alerts."
msgstr ""
-msgid "NetworkPolicies|Policies are a specification of how groups of pods are allowed to communicate with each other's network endpoints."
-msgstr ""
-
msgid "NetworkPolicies|Policy %{policyName} was successfully changed"
msgstr ""
msgid "NetworkPolicies|Policy definition"
msgstr ""
-msgid "NetworkPolicies|Policy editor"
-msgstr ""
-
-msgid "NetworkPolicies|Policy preview"
-msgstr ""
-
msgid "NetworkPolicies|Rule"
msgstr ""
@@ -22909,9 +23233,6 @@ msgstr ""
msgid "NetworkPolicies|Rule mode is unavailable for this policy. In some cases, we cannot parse the YAML file back into the rules editor."
msgstr ""
-msgid "NetworkPolicies|Rules"
-msgstr ""
-
msgid "NetworkPolicies|Save changes"
msgstr ""
@@ -22924,9 +23245,6 @@ msgstr ""
msgid "NetworkPolicies|Traffic that does not match any rule will be blocked."
msgstr ""
-msgid "NetworkPolicies|Unable to parse policy"
-msgstr ""
-
msgid "NetworkPolicies|all DNS names"
msgstr ""
@@ -23110,6 +23428,9 @@ msgstr ""
msgid "New issue"
msgstr ""
+msgid "New issue in %{project}"
+msgstr ""
+
msgid "New issue title"
msgstr ""
@@ -23188,7 +23509,7 @@ msgstr ""
msgid "Newest first"
msgstr ""
-msgid "Newly registered users will by default be external"
+msgid "Newly-registered users are external by default"
msgstr ""
msgid "Next"
@@ -23503,8 +23824,14 @@ msgstr ""
msgid "No webhooks found, add one in the form above."
msgstr ""
-msgid "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} to renew your subscription."
-msgstr ""
+msgid "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} day to renew your subscription."
+msgid_plural "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} days to renew your subscription."
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+msgstr[5] ""
msgid "No. of commits"
msgstr ""
@@ -23521,7 +23848,7 @@ msgstr ""
msgid "Nodes"
msgstr ""
-msgid "Non-admin users can sign in with read-only access and make read-only API requests."
+msgid "Non-admin users are restricted to read-only access, in both GitLab UI and API."
msgstr ""
msgid "None"
@@ -23602,7 +23929,7 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
-msgid "Notes Rate Limits"
+msgid "Notes rate limit"
msgstr ""
msgid "Notes|Are you sure you want to cancel creating this comment?"
@@ -23785,9 +24112,6 @@ msgstr ""
msgid "November"
msgstr ""
-msgid "Novice"
-msgstr ""
-
msgid "Now, personalize your GitLab experience"
msgstr ""
@@ -23956,7 +24280,7 @@ msgstr ""
msgid "OnCallSchedules|For this rotation, on-call will be:"
msgstr ""
-msgid "OnCallSchedules|On-call schedule %{schedule} in Project %{project}"
+msgid "OnCallSchedules|On-call schedule %{obstacle} in Project %{project}"
msgstr ""
msgid "OnCallSchedules|On-call schedules"
@@ -24103,22 +24427,22 @@ msgstr ""
msgid "OnDemandScans|Scanner profile"
msgstr ""
+msgid "OnDemandScans|Schedule scan"
+msgstr ""
+
msgid "OnDemandScans|Select one of the existing profiles"
msgstr ""
msgid "OnDemandScans|Site profile"
msgstr ""
-msgid "OnDemandScans|Use existing scanner profile"
+msgid "OnDemandScans|Start time"
msgstr ""
-msgid "OnDemandScans|Use existing site profile"
-msgstr ""
-
-msgid "OnDemandScans|You can either choose a passive scan or validate the target site in your chosen site profile. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
+msgid "OnDemandScans|Use existing scanner profile"
msgstr ""
-msgid "OnDemandScans|You cannot run an active scan against an unvalidated site."
+msgid "OnDemandScans|Use existing site profile"
msgstr ""
msgid "OnDemandScans|You must create a repository within your project to run an on-demand scan."
@@ -24187,6 +24511,9 @@ msgstr ""
msgid "Only admins can delete project"
msgstr ""
+msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
+msgstr ""
+
msgid "Only include features new to your current subscription tier."
msgstr ""
@@ -24205,6 +24532,12 @@ msgstr ""
msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
+msgid "Only reCAPTCHA v2 is supported:"
+msgstr ""
+
+msgid "Only users from the specified IP address ranges are able to reach this group, including all subgroups, projects, and Git repositories."
+msgstr ""
+
msgid "Only verified users with an email address in any of these domains can be added to the group."
msgstr ""
@@ -24391,9 +24724,6 @@ msgstr ""
msgid "Package Registry"
msgstr ""
-msgid "Package Registry Rate Limits"
-msgstr ""
-
msgid "Package Registry: authenticated API requests"
msgstr ""
@@ -24412,6 +24742,9 @@ msgstr ""
msgid "Package recipe already exists"
msgstr ""
+msgid "Package registry rate limits"
+msgstr ""
+
msgid "Package type"
msgstr ""
@@ -24478,6 +24811,9 @@ msgstr ""
msgid "PackageRegistry|Composer"
msgstr ""
+msgid "PackageRegistry|Composer.json with license: %{license} and version: %{version}"
+msgstr ""
+
msgid "PackageRegistry|Conan"
msgstr ""
@@ -24541,6 +24877,9 @@ msgstr ""
msgid "PackageRegistry|Copy require package include"
msgstr ""
+msgid "PackageRegistry|Copy target SHA"
+msgstr ""
+
msgid "PackageRegistry|Copy yarn command"
msgstr ""
@@ -24607,6 +24946,9 @@ msgstr ""
msgid "PackageRegistry|Install package version"
msgstr ""
+msgid "PackageRegistry|Instance-level"
+msgstr ""
+
msgid "PackageRegistry|Invalid Package: failed metadata extraction"
msgstr ""
@@ -24652,6 +24994,9 @@ msgstr ""
msgid "PackageRegistry|Pip Command"
msgstr ""
+msgid "PackageRegistry|Project-level"
+msgstr ""
+
msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
msgstr ""
@@ -24673,6 +25018,9 @@ msgstr ""
msgid "PackageRegistry|Remove package"
msgstr ""
+msgid "PackageRegistry|Required Python: %{pythonVersion}"
+msgstr ""
+
msgid "PackageRegistry|RubyGems"
msgstr ""
@@ -24715,6 +25063,9 @@ msgstr ""
msgid "PackageRegistry|Source project located at %{link}"
msgstr ""
+msgid "PackageRegistry|Target SHA: %{sha}"
+msgstr ""
+
msgid "PackageRegistry|There are no other versions of this package."
msgstr ""
@@ -24883,6 +25234,18 @@ msgstr ""
msgid "Password was successfully updated. Please sign in again."
msgstr ""
+msgid "PasswordPrompt|Confirm password"
+msgstr ""
+
+msgid "PasswordPrompt|Confirm password to continue"
+msgstr ""
+
+msgid "PasswordPrompt|Password is required"
+msgstr ""
+
+msgid "PasswordPrompt|Please enter your password to confirm"
+msgstr ""
+
msgid "Passwords should be unique and not used for any other sites or services."
msgstr ""
@@ -24910,6 +25273,9 @@ msgstr ""
msgid "Paste project path (i.e. gitlab-org/gitlab)"
msgstr ""
+msgid "Paste this DSN into your Sentry SDK"
+msgstr ""
+
msgid "Paste your public SSH key, which is usually contained in the file '~/.ssh/id_ed25519.pub' or '~/.ssh/id_rsa.pub' and begins with 'ssh-ed25519' or 'ssh-rsa'. Do not paste your private SSH key, as that can compromise your identity."
msgstr ""
@@ -24994,6 +25360,9 @@ msgstr ""
msgid "PerformanceBar|First Contentful Paint"
msgstr ""
+msgid "PerformanceBar|Flamegraph with mode:"
+msgstr ""
+
msgid "PerformanceBar|Frontend resources"
msgstr ""
@@ -25027,6 +25396,15 @@ msgstr ""
msgid "PerformanceBar|Trace"
msgstr ""
+msgid "PerformanceBar|cpu"
+msgstr ""
+
+msgid "PerformanceBar|object"
+msgstr ""
+
+msgid "PerformanceBar|wall"
+msgstr ""
+
msgid "Period in seconds"
msgstr ""
@@ -25255,6 +25633,48 @@ msgstr ""
msgid "PipelineSchedules|Variables"
msgstr ""
+msgid "PipelineSource|API"
+msgstr ""
+
+msgid "PipelineSource|Chat"
+msgstr ""
+
+msgid "PipelineSource|External"
+msgstr ""
+
+msgid "PipelineSource|External Pull Request"
+msgstr ""
+
+msgid "PipelineSource|Merge Request"
+msgstr ""
+
+msgid "PipelineSource|On-Demand DAST Scan"
+msgstr ""
+
+msgid "PipelineSource|On-Demand DAST Validation"
+msgstr ""
+
+msgid "PipelineSource|Parent Pipeline"
+msgstr ""
+
+msgid "PipelineSource|Pipeline"
+msgstr ""
+
+msgid "PipelineSource|Push"
+msgstr ""
+
+msgid "PipelineSource|Schedule"
+msgstr ""
+
+msgid "PipelineSource|Trigger"
+msgstr ""
+
+msgid "PipelineSource|Web"
+msgstr ""
+
+msgid "PipelineSource|Web IDE"
+msgstr ""
+
msgid "PipelineStatusTooltip|Pipeline: %{ciStatus}"
msgstr ""
@@ -25555,46 +25975,7 @@ msgstr ""
msgid "Pipeline|Source"
msgstr ""
-msgid "Pipeline|Source|API"
-msgstr ""
-
-msgid "Pipeline|Source|Chat"
-msgstr ""
-
-msgid "Pipeline|Source|External"
-msgstr ""
-
-msgid "Pipeline|Source|External Pull Request"
-msgstr ""
-
-msgid "Pipeline|Source|Merge Request"
-msgstr ""
-
-msgid "Pipeline|Source|On-Demand DAST Scan"
-msgstr ""
-
-msgid "Pipeline|Source|On-Demand DAST Validation"
-msgstr ""
-
-msgid "Pipeline|Source|Parent Pipeline"
-msgstr ""
-
-msgid "Pipeline|Source|Pipeline"
-msgstr ""
-
-msgid "Pipeline|Source|Push"
-msgstr ""
-
-msgid "Pipeline|Source|Schedule"
-msgstr ""
-
-msgid "Pipeline|Source|Trigger"
-msgstr ""
-
-msgid "Pipeline|Source|Web"
-msgstr ""
-
-msgid "Pipeline|Source|Web IDE"
+msgid "Pipeline|Source|Security Policy"
msgstr ""
msgid "Pipeline|Specify variable values to be used in this run. The values specified in %{linkStart}CI/CD settings%{linkEnd} will be used by default."
@@ -25645,7 +26026,7 @@ msgstr ""
msgid "Pipeline|We are currently unable to fetch pipeline data"
msgstr ""
-msgid "Pipeline|You’re about to stop pipeline %{pipelineId}."
+msgid "Pipeline|You’re about to stop pipeline #%{pipelineId}."
msgstr ""
msgid "Pipeline|for"
@@ -25672,6 +26053,9 @@ msgstr ""
msgid "Plain diff"
msgstr ""
+msgid "Plain-text response to send to clients that hit a rate limit"
+msgstr ""
+
msgid "Plan:"
msgstr ""
@@ -25816,9 +26200,6 @@ msgstr ""
msgid "Please provide attributes to update"
msgstr ""
-msgid "Please provide your username or email address."
-msgstr ""
-
msgid "Please reach out if you have any questions and we'll be happy to assist."
msgstr ""
@@ -25861,9 +26242,6 @@ msgstr ""
msgid "Please set a new password before proceeding."
msgstr ""
-msgid "Please share your feedback about %{featureName} %{linkStart}in this issue%{linkEnd} to help us improve the experience."
-msgstr ""
-
msgid "Please solve the captcha"
msgstr ""
@@ -26041,6 +26419,9 @@ msgstr ""
msgid "Prevent adding new members to project membership within this group"
msgstr ""
+msgid "Prevent auto-stopping"
+msgstr ""
+
msgid "Prevent editing approval rules in projects and merge requests."
msgstr ""
@@ -26053,7 +26434,7 @@ msgstr ""
msgid "Prevent users from changing their profile name"
msgstr ""
-msgid "Prevent users from performing write operations on GitLab while performing maintenance."
+msgid "Prevent users from performing write operations while GitLab maintenance is in progress."
msgstr ""
msgid "Preview"
@@ -26326,6 +26707,9 @@ msgstr ""
msgid "Profiles|Enter your name, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Enter your password to confirm the email change"
+msgstr ""
+
msgid "Profiles|Enter your pronouns to let people know how to refer to you"
msgstr ""
@@ -26560,10 +26944,10 @@ msgstr ""
msgid "Profiles|e.g. My MacBook key"
msgstr ""
-msgid "Profiles|username"
+msgid "Profiles|https://website.com"
msgstr ""
-msgid "Profiles|website.com"
+msgid "Profiles|username"
msgstr ""
msgid "Profiles|your account"
@@ -26806,9 +27190,21 @@ msgstr ""
msgid "ProjectSelect| or group"
msgstr ""
+msgid "ProjectSelect|No matching results"
+msgstr ""
+
msgid "ProjectSelect|Search for project"
msgstr ""
+msgid "ProjectSelect|Search projects"
+msgstr ""
+
+msgid "ProjectSelect|Select a project"
+msgstr ""
+
+msgid "ProjectSelect|There was an error fetching the projects. Please try again."
+msgstr ""
+
msgid "ProjectService|Drone server URL"
msgstr ""
@@ -26896,6 +27292,9 @@ msgstr ""
msgid "ProjectService|Trigger event when a new, unique alert is recorded."
msgstr ""
+msgid "ProjectService|Trigger event when a new, unique vulnerability is recorded. (Note: This feature requires an Ultimate plan.)"
+msgstr ""
+
msgid "ProjectService|Trigger event when a pipeline status changes."
msgstr ""
@@ -27310,9 +27709,15 @@ msgstr ""
msgid "Projects are graded based on the highest severity vulnerability present"
msgstr ""
+msgid "Projects are organized into groups"
+msgstr ""
+
msgid "Projects contributed to"
msgstr ""
+msgid "Projects help you organize your work. They contain your file repository, issues, merge requests, and so much more."
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr ""
@@ -27547,10 +27952,10 @@ msgstr ""
msgid "PrometheusService|Prometheus cluster integration"
msgstr ""
-msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
+msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
msgstr ""
-msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
+msgid "PrometheusService|The ID of the IAP-secured resource."
msgstr ""
msgid "PrometheusService|The Prometheus API base URL."
@@ -28168,6 +28573,9 @@ msgstr ""
msgid "Rate limit"
msgstr ""
+msgid "Rate limits can help reduce request volume (like from crawlers or abusive bots)."
+msgstr ""
+
msgid "Raw blob request rate limit per minute"
msgstr ""
@@ -28180,6 +28588,9 @@ msgstr ""
msgid "Re-authentication required"
msgstr ""
+msgid "Re-import"
+msgstr ""
+
msgid "Re-request review"
msgstr ""
@@ -28201,6 +28612,9 @@ msgstr ""
msgid "Read more about related issues"
msgstr ""
+msgid "Read their documentation."
+msgstr ""
+
msgid "Ready to get started with GitLab? Follow these steps to set up your workspace, plan and commit changes, and deploy your project."
msgstr ""
@@ -28234,6 +28648,9 @@ msgstr ""
msgid "Receive any notifications from GitLab."
msgstr ""
+msgid "Receive notification of abuse reports by email."
+msgstr ""
+
msgid "Receive notifications about your own activity"
msgstr ""
@@ -28381,9 +28798,6 @@ msgstr ""
msgid "Registry setup"
msgstr ""
-msgid "Regulate approvals by authors/committers. Affects all projects."
-msgstr ""
-
msgid "Reindexing Status: %{status} (Slice multiplier: %{multiplier}, Maximum running slices: %{max_slices})"
msgstr ""
@@ -28483,6 +28897,9 @@ msgstr ""
msgid "Release|Something went wrong while saving the release details."
msgstr ""
+msgid "Reload page"
+msgstr ""
+
msgid "Remediations"
msgstr ""
@@ -28765,6 +29182,9 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
+msgid "Repeats"
+msgstr ""
+
msgid "Replace"
msgstr ""
@@ -29143,10 +29563,7 @@ msgstr ""
msgid "Require additional authentication for administrative tasks."
msgstr ""
-msgid "Require all users in this group to setup Two-factor authentication"
-msgstr ""
-
-msgid "Require all users in this group to setup two-factor authentication"
+msgid "Require all users in this group to set up two-factor authentication"
msgstr ""
msgid "Required approvals (%{approvals_given} given)"
@@ -29200,6 +29617,9 @@ msgstr[5] ""
msgid "Requires values to meet regular expression requirements."
msgstr ""
+msgid "Requires you to deploy or set up cloud-hosted Sentry."
+msgstr ""
+
msgid "Requires your primary GitLab email address."
msgstr ""
@@ -29260,9 +29680,6 @@ msgstr ""
msgid "Resolve"
msgstr ""
-msgid "Resolve all threads in new issue"
-msgstr ""
-
msgid "Resolve conflicts"
msgstr ""
@@ -29320,6 +29737,9 @@ msgstr ""
msgid "Response text"
msgstr ""
+msgid "Restart GitLab to apply changes."
+msgstr ""
+
msgid "Restart Terminal"
msgstr ""
@@ -29338,6 +29758,9 @@ msgstr ""
msgid "Restoring the project will prevent the project from being removed on this date and restore people's ability to make changes to it."
msgstr ""
+msgid "Restrict group access by IP address. %{link_start}Learn more%{link_end}."
+msgstr ""
+
msgid "Restrict membership by email domain"
msgstr ""
@@ -29659,6 +30082,9 @@ msgstr ""
msgid "Runners|Runner #%{runner_id}"
msgstr ""
+msgid "Runners|Runner assigned to project."
+msgstr ""
+
msgid "Runners|Runner is offline, last contact was %{runner_contact} ago"
msgstr ""
@@ -29671,6 +30097,9 @@ msgstr ""
msgid "Runners|Runner registration"
msgstr ""
+msgid "Runners|Runner unassigned from project."
+msgstr ""
+
msgid "Runners|Runners"
msgstr ""
@@ -29863,7 +30292,7 @@ msgstr ""
msgid "SastEntryPoints|How do I set up SAST?"
msgstr ""
-msgid "SastEntryPoints|Learn more."
+msgid "SastEntryPoints|Learn more"
msgstr ""
msgid "Satisfied"
@@ -29905,7 +30334,7 @@ msgstr ""
msgid "Save pipeline schedule"
msgstr ""
-msgid "Save space and find images in the container Registry. remove unneeded tags and keep only the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
+msgid "Save storage space by automatically deleting tags from the container registry and keeping the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
msgstr ""
msgid "Saving"
@@ -30079,6 +30508,9 @@ msgstr ""
msgid "Search or filter results…"
msgstr ""
+msgid "Search or jump to..."
+msgstr ""
+
msgid "Search project"
msgstr ""
@@ -30139,16 +30571,16 @@ msgstr ""
msgid "SearchCodeResults|of %{link_to_project}"
msgstr ""
-msgid "SearchResults|Showing %{count} %{scope} for%{term_element}"
+msgid "SearchResults|Showing %{count} %{scope} for %{term_element}"
msgstr ""
-msgid "SearchResults|Showing %{count} %{scope} for%{term_element} in your personal and project snippets"
+msgid "SearchResults|Showing %{count} %{scope} for %{term_element} in your personal and project snippets"
msgstr ""
-msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for%{term_element}"
+msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for %{term_element}"
msgstr ""
-msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for%{term_element} in your personal and project snippets"
+msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for %{term_element} in your personal and project snippets"
msgstr ""
msgid "SearchResults|code result"
@@ -30274,6 +30706,9 @@ msgstr ""
msgid "Secret Detection"
msgstr ""
+msgid "Secret access key"
+msgstr ""
+
msgid "Secret token"
msgstr ""
@@ -30313,9 +30748,6 @@ msgstr ""
msgid "SecurityApprovals|A merge request approval is required when the license compliance report contains a denied license."
msgstr ""
-msgid "SecurityApprovals|Configurable if security scanners are enabled. %{linkStart}Learn more.%{linkEnd}"
-msgstr ""
-
msgid "SecurityApprovals|Coverage-Check"
msgstr ""
@@ -30328,24 +30760,18 @@ msgstr ""
msgid "SecurityApprovals|Learn more about Vulnerability-Check"
msgstr ""
-msgid "SecurityApprovals|License Scanning must be enabled. %{linkStart}Learn more%{linkEnd}."
-msgstr ""
-
msgid "SecurityApprovals|License-Check"
msgstr ""
msgid "SecurityApprovals|Requires approval for Denied licenses. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}More information%{linkEnd}"
+msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "SecurityApprovals|Requires approval for vulnerabilities. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
-msgid "SecurityApprovals|Test coverage must be enabled. %{linkStart}Learn more%{linkEnd}."
-msgstr ""
-
msgid "SecurityApprovals|Vulnerability-Check"
msgstr ""
@@ -30409,6 +30835,12 @@ msgstr ""
msgid "SecurityConfiguration|Immediately begin risk analysis and remediation with application security features. Start with SAST and Secret Detection, available to all plans. Upgrade to Ultimate to get all features, including:"
msgstr ""
+msgid "SecurityConfiguration|Manage corpus"
+msgstr ""
+
+msgid "SecurityConfiguration|Manage corpus files used as mutation sources in coverage fuzzing."
+msgstr ""
+
msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
msgstr ""
@@ -30463,6 +30895,12 @@ msgstr ""
msgid "SecurityOrchestration|Action"
msgstr ""
+msgid "SecurityOrchestration|Actions"
+msgstr ""
+
+msgid "SecurityOrchestration|Add rule"
+msgstr ""
+
msgid "SecurityOrchestration|All policies"
msgstr ""
@@ -30496,9 +30934,6 @@ msgstr ""
msgid "SecurityOrchestration|Network"
msgstr ""
-msgid "SecurityOrchestration|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
-msgstr ""
-
msgid "SecurityOrchestration|New policy"
msgstr ""
@@ -30514,6 +30949,9 @@ msgstr ""
msgid "SecurityOrchestration|Policy editor"
msgstr ""
+msgid "SecurityOrchestration|Policy preview"
+msgstr ""
+
msgid "SecurityOrchestration|Policy status"
msgstr ""
@@ -30523,6 +30961,9 @@ msgstr ""
msgid "SecurityOrchestration|Rule"
msgstr ""
+msgid "SecurityOrchestration|Rules"
+msgstr ""
+
msgid "SecurityOrchestration|Scan Execution"
msgstr ""
@@ -30616,6 +31057,9 @@ msgstr ""
msgid "SecurityReports|Create issue"
msgstr ""
+msgid "SecurityReports|Development vulnerabilities"
+msgstr ""
+
msgid "SecurityReports|Dismiss vulnerability"
msgstr ""
@@ -30631,6 +31075,9 @@ msgstr ""
msgid "SecurityReports|Download results"
msgstr ""
+msgid "SecurityReports|Download scanned URLs"
+msgstr ""
+
msgid "SecurityReports|Download scanned resources"
msgstr ""
@@ -30754,6 +31201,9 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
+msgid "SecurityReports|The Vulnerability Report shows the results of the lastest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "SecurityReports|The security reports below contain one or more vulnerability findings that could not be parsed and were not recorded. Download the artifacts in the job output to investigate. Ensure any security report created conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
msgstr ""
@@ -30895,10 +31345,10 @@ msgstr ""
msgid "Select a repository"
msgstr ""
-msgid "Select a role"
+msgid "Select a repository containing templates for common files."
msgstr ""
-msgid "Select a shared template repository for all projects on this instance."
+msgid "Select a role"
msgstr ""
msgid "Select a template repository"
@@ -30976,6 +31426,9 @@ msgstr ""
msgid "Select project to choose zone"
msgstr ""
+msgid "Select project to create issue"
+msgstr ""
+
msgid "Select projects"
msgstr ""
@@ -31093,6 +31546,9 @@ msgstr ""
msgid "Send emails to help guide new users through the onboarding process."
msgstr ""
+msgid "Send emails to users upon account deactivation."
+msgstr ""
+
msgid "Send message"
msgstr ""
@@ -31111,6 +31567,9 @@ msgstr ""
msgid "Send service data"
msgstr ""
+msgid "Sentry"
+msgstr ""
+
msgid "Sentry API URL"
msgstr ""
@@ -31225,6 +31684,9 @@ msgstr ""
msgid "Service"
msgstr ""
+msgid "Service Accounts keys are required to authorize GitLab to deploy your Google Cloud project."
+msgstr ""
+
msgid "Service Desk"
msgstr ""
@@ -31297,15 +31759,15 @@ msgstr ""
msgid "Set a password on your account to pull or push via %{protocol}."
msgstr ""
-msgid "Set a template repository for projects in this group"
-msgstr ""
-
msgid "Set access permissions for this token."
msgstr ""
msgid "Set an instance-wide domain that will be available to all clusters when installing Knative."
msgstr ""
+msgid "Set any rate limit to %{code_open}0%{code_close} to disable the limit."
+msgstr ""
+
msgid "Set default and restrict visibility levels. Configure import sources and git access protocol."
msgstr ""
@@ -31318,7 +31780,7 @@ msgstr ""
msgid "Set limit to 0 to allow any file size."
msgstr ""
-msgid "Set max session time for web terminal."
+msgid "Set limits for web and API requests."
msgstr ""
msgid "Set milestone"
@@ -31327,15 +31789,18 @@ msgstr ""
msgid "Set new password"
msgstr ""
-msgid "Set notification email for abuse reports."
+msgid "Set parent epic to an epic"
msgstr ""
-msgid "Set parent epic to an epic"
+msgid "Set per-user rate limits for imports and exports of projects and groups."
msgstr ""
msgid "Set projects and maximum size limits, session duration, user options, and check feature availability for namespace plan."
msgstr ""
+msgid "Set rate limits for package registry API requests that supersede the general user and IP rate limits."
+msgstr ""
+
msgid "Set severity"
msgstr ""
@@ -31354,15 +31819,24 @@ msgstr ""
msgid "Set the default branch for this project. All merge requests and commits are made against this branch unless you specify a different one."
msgstr ""
+msgid "Set the default expiration time for job artifacts in all projects. Set to %{code_open}0%{code_close} to never expire artifacts by default. If no unit is written, it defaults to seconds. For example, these are all equivalent: %{code_open}3600%{code_close}, %{code_open}60 minutes%{code_close}, or %{code_open}one hour%{code_close}."
+msgstr ""
+
msgid "Set the due date to %{due_date}."
msgstr ""
msgid "Set the iteration to %{iteration_reference}."
msgstr ""
+msgid "Set the maximum session time for a web terminal."
+msgstr ""
+
msgid "Set the milestone to %{milestone_reference}."
msgstr ""
+msgid "Set the per-user rate limit for notes created by web or API requests."
+msgstr ""
+
msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
msgstr ""
@@ -31564,6 +32038,9 @@ msgstr ""
msgid "Show Pipeline IID"
msgstr ""
+msgid "Show all %{issuable_type}."
+msgstr ""
+
msgid "Show all activity"
msgstr ""
@@ -31615,15 +32092,9 @@ msgstr ""
msgid "Show list"
msgstr ""
-msgid "Show me advanced features"
-msgstr ""
-
msgid "Show me how to add a pipeline"
msgstr ""
-msgid "Show me the basics"
-msgstr ""
-
msgid "Show one file at a time"
msgstr ""
@@ -31672,15 +32143,15 @@ msgstr ""
msgid "Showing %{pageSize} of %{total} %{issuableType}"
msgstr ""
-msgid "Showing %{pageSize} of %{total} issues"
-msgstr ""
-
msgid "Showing all epics"
msgstr ""
msgid "Showing all issues"
msgstr ""
+msgid "Showing data for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
+msgstr ""
+
msgid "Showing data for workflow items created in this date range. Date range cannot exceed %{maxDateRange} days."
msgstr ""
@@ -31720,6 +32191,15 @@ msgstr ""
msgid "Sidebar|Weight"
msgstr ""
+msgid "Sidekiq job compression threshold (bytes)"
+msgstr ""
+
+msgid "Sidekiq job size limit (bytes)"
+msgstr ""
+
+msgid "Sidekiq job size limits"
+msgstr ""
+
msgid "Sign in"
msgstr ""
@@ -31840,6 +32320,9 @@ msgstr ""
msgid "Site profile not found for given parameters"
msgstr ""
+msgid "Sites"
+msgstr ""
+
msgid "Size"
msgstr ""
@@ -31870,19 +32353,22 @@ msgstr ""
msgid "SlackIntegration|Sends notifications about project events to Slack channels."
msgstr ""
-msgid "SlackService|2. Paste the %{strong_open}Token%{strong_close} into the field below"
+msgid "SlackService|1. %{slash_command_link_start}Add a slash command%{slash_command_link_end} in your Slack team using this information:"
msgstr ""
-msgid "SlackService|3. Select the %{strong_open}Active%{strong_close} checkbox, press %{strong_open}Save changes%{strong_close} and start using GitLab inside Slack!"
+msgid "SlackService|2. Paste the token from Slack in the %{strong_open}Token%{strong_close} field below."
msgstr ""
-msgid "SlackService|Fill in the word that works best for your team."
+msgid "SlackService|3. Select the %{strong_open}Active%{strong_close} checkbox, select %{strong_open}Save changes%{strong_close}, and start using slash commands in Slack!"
+msgstr ""
+
+msgid "SlackService|After setup, get a list of available Slack slash commands by entering"
msgstr ""
-msgid "SlackService|See list of available commands in Slack after setting up this service, by entering"
+msgid "SlackService|Fill in the word that works best for your team."
msgstr ""
-msgid "SlackService|This service allows users to perform common operations on this project by entering slash commands in Slack."
+msgid "SlackService|Perform common operations in this project by entering slash commands in Slack."
msgstr ""
msgid "Slice multiplier"
@@ -31948,7 +32434,7 @@ msgstr ""
msgid "Some child epics may be hidden due to applied filters"
msgstr ""
-msgid "Some common domains are not allowed. %{read_more_link}."
+msgid "Some common domains are not allowed. %{learn_more_link}."
msgstr ""
msgid "Some of the designs you tried uploading did not change:"
@@ -32032,9 +32518,6 @@ msgstr ""
msgid "Something went wrong while exporting requirements"
msgstr ""
-msgid "Something went wrong while fetching %{listType} list"
-msgstr ""
-
msgid "Something went wrong while fetching branches"
msgstr ""
@@ -32089,15 +32572,9 @@ msgstr ""
msgid "Something went wrong while merging this merge request. Please try again."
msgstr ""
-msgid "Something went wrong while moving issues."
-msgstr ""
-
msgid "Something went wrong while obtaining the Let's Encrypt certificate."
msgstr ""
-msgid "Something went wrong while performing the action."
-msgstr ""
-
msgid "Something went wrong while promoting the issue to an epic. Please try again."
msgstr ""
@@ -32425,7 +32902,10 @@ msgstr ""
msgid "SourcegraphPreferences|Uses a custom %{linkStart}Sourcegraph instance%{linkEnd}."
msgstr ""
-msgid "Spam Check API Key"
+msgid "Spam Check"
+msgstr ""
+
+msgid "Spam Check API key"
msgstr ""
msgid "Spam Logs"
@@ -32443,7 +32923,7 @@ msgstr ""
msgid "Specified URL cannot be used: \"%{reason}\""
msgstr ""
-msgid "Specify an e-mail address regex pattern to identify default internal users."
+msgid "Specify an email address regex pattern to identify default internal users."
msgstr ""
msgid "Speed up your pipelines with Needs relationships"
@@ -32698,7 +33178,7 @@ msgstr ""
msgid "StatusCheck|An error occurred fetching the status checks."
msgstr ""
-msgid "StatusCheck|Apply this status check to any branch or a specific protected branch."
+msgid "StatusCheck|Apply this status check to all branches or a specific protected branch."
msgstr ""
msgid "StatusCheck|Check for a status response in Merge Requests. Failures do not block merges. %{link_start}Learn more%{link_end}."
@@ -33037,6 +33517,9 @@ msgstr ""
msgid "Subscriptions"
msgstr ""
+msgid "Subscription|Your subscription for %{strong}%{namespace_name}%{strong_close} has expired and you are now on %{pricing_link_start}the GitLab Free tier%{pricing_link_end}. Don't worry, your data is safe. Get in touch with our support team (%{support_email}). They'll gladly help with your subscription renewal."
+msgstr ""
+
msgid "Subtracted"
msgstr ""
@@ -33265,6 +33748,9 @@ msgstr ""
msgid "SuperSonics|Plan"
msgstr ""
+msgid "SuperSonics|Please agree to the Subscription Agreement"
+msgstr ""
+
msgid "SuperSonics|Ready to get started? A GitLab plan is ideal for scaling organizations and for multi team usage."
msgstr ""
@@ -33295,6 +33781,9 @@ msgstr ""
msgid "SuperSonics|The activation code is not valid. Please make sure to copy it exactly from the Customers Portal or confirmation email. Learn more about %{linkStart}activating your subscription%{linkEnd}."
msgstr ""
+msgid "SuperSonics|The activation code should be a 24-character alphanumeric string"
+msgstr ""
+
msgid "SuperSonics|There is a connectivity issue."
msgstr ""
@@ -33337,9 +33826,15 @@ msgstr ""
msgid "SuperSonics|You do not have an active subscription"
msgstr ""
+msgid "SuperSonics|You have successfully added a license that activates on %{date}. Please see the subscription history table below for more details."
+msgstr ""
+
msgid "SuperSonics|You'll be charged for %{trueUpLinkStart}users over license%{trueUpLinkEnd} on a quarterly or annual basis, depending on the terms of your agreement."
msgstr ""
+msgid "SuperSonics|Your future dated license was successfully added"
+msgstr ""
+
msgid "SuperSonics|Your subscription"
msgstr ""
@@ -33592,7 +34087,7 @@ msgstr ""
msgid "Template to append to all Service Desk issues"
msgstr ""
-msgid "TemplateRepository|Select a repository to make its templates available to all projects. %{link_start}What should the repository contain?%{link_end} "
+msgid "TemplateRepository|Create common files more quickly, and standardize their format."
msgstr ""
msgid "Templates"
@@ -33814,7 +34309,7 @@ msgstr ""
msgid "TestCases|Search test cases"
msgstr ""
-msgid "TestCases|Something went wrong while adding test case to Todo."
+msgid "TestCases|Something went wrong while adding test case to a to-do item."
msgstr ""
msgid "TestCases|Something went wrong while creating a test case."
@@ -33826,7 +34321,7 @@ msgstr ""
msgid "TestCases|Something went wrong while fetching test cases list."
msgstr ""
-msgid "TestCases|Something went wrong while marking test case todo as done."
+msgid "TestCases|Something went wrong while marking test case to-do item as done."
msgstr ""
msgid "TestCases|Something went wrong while moving test case."
@@ -33946,7 +34441,7 @@ msgstr ""
msgid "Thanks for your purchase!"
msgstr ""
-msgid "That is ok, I do not want to renew"
+msgid "That's OK, I don't want to renew"
msgstr ""
msgid "That's it, well done!"
@@ -33973,7 +34468,7 @@ msgstr[3] ""
msgstr[4] ""
msgstr[5] ""
-msgid "The API key used by GitLab for accessing the Spam Check service endpoint"
+msgid "The API key used by GitLab for accessing the Spam Check service endpoint."
msgstr ""
msgid "The GitLab subscription service (customers.gitlab.com) is currently experiencing an outage. You can monitor the status and get updates at %{linkStart}status.gitlab.com%{linkEnd}."
@@ -34012,9 +34507,6 @@ msgstr ""
msgid "The URL to use for connecting to Elasticsearch. Use a comma-separated list to support clustering (e.g., \"http://localhost:9200, http://localhost:9201\")."
msgstr ""
-msgid "The Vulnerability Report shows the results of the last successful pipeline run on the default branch."
-msgstr ""
-
msgid "The X509 Certificate to use when mutual TLS is required to communicate with the external authorization service. If left blank, the server certificate is still validated when accessing over HTTPS."
msgstr ""
@@ -34072,9 +34564,6 @@ msgstr ""
msgid "The default branch for this project has been changed. Please update your bookmarks."
msgstr ""
-msgid "The default expiration time for job artifacts. 0 for unlimited. The default unit is in seconds, but you can use other units, for example %{code_open}4 mins 2 sec%{code_close}, %{code_open}2h42min%{code_close}."
-msgstr ""
-
msgid "The dependency list details information about the components used within your project."
msgstr ""
@@ -34270,9 +34759,6 @@ msgstr ""
msgid "The merge conflicts for this merge request have already been resolved. Please return to the merge request."
msgstr ""
-msgid "The merge request can now be merged."
-msgstr ""
-
msgid "The metric must be one of %{metrics}."
msgstr ""
@@ -34648,7 +35134,7 @@ msgstr ""
msgid "There was a problem updating the keep latest artifacts setting."
msgstr ""
-msgid "There was an error %{message} todo."
+msgid "There was an error %{message} to-do item."
msgstr ""
msgid "There was an error adding a To Do."
@@ -34687,6 +35173,9 @@ msgstr ""
msgid "There was an error fetching projects"
msgstr ""
+msgid "There was an error fetching search autocomplete suggestions"
+msgstr ""
+
msgid "There was an error fetching stage total counts"
msgstr ""
@@ -35011,6 +35500,9 @@ msgstr ""
msgid "This field is required."
msgstr ""
+msgid "This form is disabled in preview"
+msgstr ""
+
msgid "This group"
msgstr ""
@@ -35032,9 +35524,6 @@ msgstr ""
msgid "This group is linked to a subscription"
msgstr ""
-msgid "This group, including all subgroups, projects and git repositories, will be reachable from only the specified IP address ranges."
-msgstr ""
-
msgid "This group, its subgroups and projects has been scheduled for removal on %{date}."
msgstr ""
@@ -35314,9 +35803,6 @@ msgstr ""
msgid "This user cannot be unlocked manually from GitLab"
msgstr ""
-msgid "This user does not have a pending request"
-msgstr ""
-
msgid "This user has an unconfirmed email address (%{email}). You may force a confirmation."
msgstr ""
@@ -35425,9 +35911,6 @@ msgstr ""
msgid "ThreatMonitoring|Packet Activity"
msgstr ""
-msgid "ThreatMonitoring|Policies"
-msgstr ""
-
msgid "ThreatMonitoring|Requests"
msgstr ""
@@ -35479,6 +35962,12 @@ msgstr ""
msgid "ThreatMonitoring|View documentation"
msgstr ""
+msgid "Threshold in bytes at which to compress Sidekiq job arguments."
+msgstr ""
+
+msgid "Threshold in bytes at which to reject Sidekiq jobs. Set this to 0 to if you don't want to limit Sidekiq jobs."
+msgstr ""
+
msgid "Throughput"
msgstr ""
@@ -35488,6 +35977,9 @@ msgstr ""
msgid "Time"
msgstr ""
+msgid "Time (in hours) that users are allowed to skip forced configuration of two-factor authentication."
+msgstr ""
+
msgid "Time Spent"
msgstr ""
@@ -35554,7 +36046,7 @@ msgstr ""
msgid "TimeTrackingEstimated|Est"
msgstr ""
-msgid "TimeTracking|%{startTag}Spent: %{endTag}%{timeSpentHumanReadable}"
+msgid "TimeTracking|%{spentStart}Spent: %{spentEnd}"
msgstr ""
msgid "TimeTracking|Estimated:"
@@ -35776,6 +36268,9 @@ msgstr ""
msgid "To access this domain create a new DNS record"
msgstr ""
+msgid "To add a custom suffix, set up a Service Desk email address. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "To add an SSH key you need to %{generate_link_start}generate one%{link_end} or use an %{existing_link_start}existing key%{link_end}."
msgstr ""
@@ -35797,13 +36292,16 @@ msgstr ""
msgid "To connect an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To continue using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
+msgstr ""
+
msgid "To continue, you need to select the link in the confirmation email we sent to verify your email address. If you didn't get our email, select %{strongStart}Resend confirmation email.%{strongEnd}"
msgstr ""
msgid "To define internal users, first enable new users set to external"
msgstr ""
-msgid "To enable Registration Features, make sure \"Enable service ping\" is checked."
+msgid "To enable Registration Features, first enable Service Ping."
msgstr ""
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
@@ -35830,7 +36328,7 @@ msgstr ""
msgid "To get started, use the link below to confirm your account."
msgstr ""
-msgid "To help improve GitLab and its user experience, GitLab will periodically collect usage information."
+msgid "To help improve GitLab and its user experience, GitLab periodically collects usage information."
msgstr ""
msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
@@ -35863,7 +36361,7 @@ msgstr ""
msgid "To preserve performance only %{strong_open}%{display_size} of %{real_size}%{strong_close} files are displayed."
msgstr ""
-msgid "To protect this issue's confidentiality, %{forkLink} and set the fork's visibility to private."
+msgid "To protect this issue's confidentiality, %{linkStart}fork this project%{linkEnd} and set the fork's visibility to private."
msgstr ""
msgid "To protect this issue's confidentiality, a private fork of this project was selected."
@@ -35896,12 +36394,15 @@ msgstr ""
msgid "To set up SAML authentication for your group through an identity provider like Azure, Okta, Onelogin, Ping Identity, or your custom SAML 2.0 provider:"
msgstr ""
-msgid "To set up this service:"
+msgid "To set up this integration:"
msgstr ""
msgid "To specify the notification level per project of a group you belong to, you need to visit project page and change notification level there."
msgstr ""
+msgid "To start using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
+msgstr ""
+
msgid "To unsubscribe from this issue, please paste the following link into your browser:"
msgstr ""
@@ -36493,9 +36994,6 @@ msgstr ""
msgid "Unable to fetch branches list, please close the form and try again"
msgstr ""
-msgid "Unable to fetch unscanned projects"
-msgstr ""
-
msgid "Unable to fetch vulnerable projects"
msgstr ""
@@ -36550,6 +37048,15 @@ msgstr ""
msgid "Unable to update this issue at this time."
msgstr ""
+msgid "Unapprove a merge request"
+msgstr ""
+
+msgid "Unapprove the current merge request."
+msgstr ""
+
+msgid "Unapproved the current merge request."
+msgstr ""
+
msgid "Unarchive project"
msgstr ""
@@ -36562,16 +37069,13 @@ msgstr ""
msgid "Unassigned"
msgstr ""
-msgid "Unauthenticated API request rate limit"
-msgstr ""
-
-msgid "Unauthenticated rate limit period in seconds"
+msgid "Unauthenticated API rate limit period in seconds"
msgstr ""
-msgid "Unauthenticated request rate limit"
+msgid "Unauthenticated requests"
msgstr ""
-msgid "Unauthenticated requests"
+msgid "Unauthenticated web rate limit period in seconds"
msgstr ""
msgid "Undo"
@@ -36673,18 +37177,6 @@ msgstr ""
msgid "Unresolved"
msgstr ""
-msgid "UnscannedProjects|15 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|30 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|5 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|60 or more days"
-msgstr ""
-
msgid "Unschedule job"
msgstr ""
@@ -36904,6 +37396,9 @@ msgstr ""
msgid "UsageQuota|%{help_link_start}Shared runners%{help_link_end} are disabled, so there are no limits set on pipeline usage"
msgstr ""
+msgid "UsageQuota|%{linkTitle} help link"
+msgstr ""
+
msgid "UsageQuota|%{percentageLeft} of purchased storage is available"
msgstr ""
@@ -36913,6 +37408,9 @@ msgstr ""
msgid "UsageQuota|Artifacts is a sum of build and pipeline artifacts."
msgstr ""
+msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
+msgstr ""
+
msgid "UsageQuota|Buy additional minutes"
msgstr ""
@@ -36922,9 +37420,21 @@ msgstr ""
msgid "UsageQuota|CI minutes usage by project"
msgstr ""
+msgid "UsageQuota|Code packages and container images."
+msgstr ""
+
msgid "UsageQuota|Current period usage"
msgstr ""
+msgid "UsageQuota|File attachments and smaller design graphics."
+msgstr ""
+
+msgid "UsageQuota|Git repository, managed by the Gitaly service."
+msgstr ""
+
+msgid "UsageQuota|Includes project registry, artifacts, packages, wiki, uploads and other items."
+msgstr ""
+
msgid "UsageQuota|Increase storage temporarily"
msgstr ""
@@ -36943,6 +37453,9 @@ msgstr ""
msgid "UsageQuota|Packages"
msgstr ""
+msgid "UsageQuota|Pipeline artifacts and job artifacts, created with CI/CD."
+msgstr ""
+
msgid "UsageQuota|Pipelines"
msgstr ""
@@ -36961,6 +37474,9 @@ msgstr ""
msgid "UsageQuota|Seats"
msgstr ""
+msgid "UsageQuota|Shared bits of code and text."
+msgstr ""
+
msgid "UsageQuota|Snippets"
msgstr ""
@@ -36970,6 +37486,12 @@ msgstr ""
msgid "UsageQuota|Storage"
msgstr ""
+msgid "UsageQuota|Storage type"
+msgstr ""
+
+msgid "UsageQuota|There is a known issue with Artifact storage where the total could be incorrect for some projects. More details and progress are available in %{warningLinkStart}the epic%{warningLinkEnd}."
+msgstr ""
+
msgid "UsageQuota|This is the total amount of storage used across your projects within this namespace."
msgstr ""
@@ -37009,6 +37531,9 @@ msgstr ""
msgid "UsageQuota|Usage"
msgstr ""
+msgid "UsageQuota|Usage Breakdown"
+msgstr ""
+
msgid "UsageQuota|Usage Quotas"
msgstr ""
@@ -37033,6 +37558,9 @@ msgstr ""
msgid "UsageQuota|Wiki"
msgstr ""
+msgid "UsageQuota|Wiki content."
+msgstr ""
+
msgid "UsageQuota|Wikis"
msgstr ""
@@ -37249,7 +37777,10 @@ msgstr ""
msgid "User Settings"
msgstr ""
-msgid "User and IP Rate Limits"
+msgid "User and IP rate limits"
+msgstr ""
+
+msgid "User does not have a pending request"
msgstr ""
msgid "User identity was successfully created."
@@ -37546,6 +38077,9 @@ msgstr ""
msgid "Users can launch a development environment from a GitLab browser tab when the %{linkStart}Gitpod%{linkEnd} integration is enabled."
msgstr ""
+msgid "Users can reactivate their account by signing in."
+msgstr ""
+
msgid "Users can render diagrams in AsciiDoc, Markdown, reStructuredText, and Textile documents using Kroki."
msgstr ""
@@ -37561,6 +38095,9 @@ msgstr ""
msgid "Users requesting access to"
msgstr ""
+msgid "Users to exclude from the rate limit"
+msgstr ""
+
msgid "Users were successfully added."
msgstr ""
@@ -37582,6 +38119,9 @@ msgstr ""
msgid "UsersSelect|Unassigned"
msgstr ""
+msgid "Uses GitLab as a lightweight alternative to Sentry."
+msgstr ""
+
msgid "Using %{code_start}::%{code_end} denotes a %{link_start}scoped label set%{link_end}"
msgstr ""
@@ -37612,10 +38152,7 @@ msgstr ""
msgid "Value Stream Analytics can help you determine your team’s velocity"
msgstr ""
-msgid "Value Stream Analytics gives an overview of how much time it takes to go from idea to production in your project."
-msgstr ""
-
-msgid "Value may contain a variable reference"
+msgid "Value might contain a variable reference"
msgstr ""
msgid "Value stream"
@@ -37681,10 +38218,10 @@ msgstr ""
msgid "ValueStream|The Default Value Stream cannot be deleted"
msgstr ""
-msgid "Variable"
+msgid "Values that contain the %{codeStart}$%{codeEnd} character can be considered a variable reference and expanded. %{docsLinkStart}Learn more.%{docsLinkEnd}"
msgstr ""
-msgid "Variable references indicated by %{codeStart}$%{codeEnd} may be expanded. If this is not what you want, consider %{docsLinkStart}using a workaround to prevent expansion%{docsLinkEnd}."
+msgid "Variable"
msgstr ""
msgid "Variable will be masked in job logs."
@@ -38101,6 +38638,9 @@ msgstr ""
msgid "Vulnerability|Evidence"
msgstr ""
+msgid "Vulnerability|False positive detected"
+msgstr ""
+
msgid "Vulnerability|File"
msgstr ""
@@ -38143,6 +38683,9 @@ msgstr ""
msgid "Vulnerability|Status"
msgstr ""
+msgid "Vulnerability|The scanner determined this vulnerability to be a false positive. Verify the evaluation before changing its status. %{linkStart}Learn more about false positive detection.%{linkEnd}"
+msgstr ""
+
msgid "Vulnerability|The unmodified response is the original response that had no mutations done to the request"
msgstr ""
@@ -38467,9 +39010,6 @@ msgstr ""
msgid "Welcome to GitLab,%{br_tag}%{name}!"
msgstr ""
-msgid "Welcome to the guided GitLab tour"
-msgstr ""
-
msgid "Welcome, %{name}!"
msgstr ""
@@ -38488,9 +39028,6 @@ msgstr ""
msgid "What are you searching for?"
msgstr ""
-msgid "What describes you best?"
-msgstr ""
-
msgid "What does this command do?"
msgstr ""
@@ -38512,13 +39049,13 @@ msgstr ""
msgid "What is your job title? (optional)"
msgstr ""
-msgid "What will you use this group for?"
+msgid "What templates can I create?"
msgstr ""
-msgid "What's new"
+msgid "What will you use this group for?"
msgstr ""
-msgid "What’s your experience level?"
+msgid "What's new"
msgstr ""
msgid "When a deployment job is successful, skip older deployment jobs that are still pending."
@@ -38530,6 +39067,9 @@ msgstr ""
msgid "When an event in GitLab triggers a webhook, you can use the request details to figure out if something went wrong."
msgstr ""
+msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+msgstr ""
+
msgid "When inactive, an external authentication provider must be used."
msgstr ""
@@ -38557,6 +39097,9 @@ msgstr ""
msgid "When:"
msgstr ""
+msgid "Which API requests are affected?"
+msgstr ""
+
msgid "While it's rare to have no vulnerabilities, it can happen. In any event, we ask that you please double check your settings to make sure you've set up your dashboard correctly."
msgstr ""
@@ -38836,6 +39379,9 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|Work Items"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -38911,6 +39457,9 @@ msgstr ""
msgid "You are already a member of this %{member_source}."
msgstr ""
+msgid "You are already impersonating another user"
+msgstr ""
+
msgid "You are an admin, which means granting access to %{client_name} will allow them to interact with GitLab as an admin as well. Proceed with caution."
msgstr ""
@@ -39013,6 +39562,9 @@ msgstr ""
msgid "You can also use project access tokens with Git to authenticate over HTTP(S). %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "You can always change your URL later"
+msgstr ""
+
msgid "You can always edit this later"
msgstr ""
@@ -39169,10 +39721,10 @@ msgstr ""
msgid "You can’t %{tag_start}edit%{tag_end} files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
-msgid "You could not create a new trigger."
+msgid "You can’t edit files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
-msgid "You didn't renew your subscription for %{strong}%{namespace_name}%{strong_close} so it was downgraded to the free plan."
+msgid "You could not create a new trigger."
msgstr ""
msgid "You do not have any subscriptions yet"
@@ -39340,6 +39892,12 @@ msgstr ""
msgid "You must provide your current password in order to change it."
msgstr ""
+msgid "You must sign in to search for specific projects."
+msgstr ""
+
+msgid "You must sign in to search for specific terms."
+msgstr ""
+
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
@@ -39367,6 +39925,9 @@ msgstr ""
msgid "You need to upload a GitLab project export archive (ending in .gz)."
msgstr ""
+msgid "You need to verify your primary email first before enabling Two-Factor Authentication."
+msgstr ""
+
msgid "You successfully declined the invitation"
msgstr ""
@@ -39475,10 +40036,10 @@ msgstr ""
msgid "Your %{host} account was signed in to from a new location"
msgstr ""
-msgid "Your %{strong}%{plan_name}%{strong_close} subscription for %{strong}%{namespace_name}%{strong_close} will expire on %{strong}%{expires_on}%{strong_close}."
+msgid "Your %{strong}%{plan_name}%{strong_close} subscription expires on %{strong}%{expires_on}%{strong_close}. After that date, you cannot create issues or merge requests, or use many other features."
msgstr ""
-msgid "Your %{strong}%{plan_name}%{strong_close} subscription will expire on %{strong}%{expires_on}%{strong_close}. After that, you will not be able to create issues or merge requests as well as many other features."
+msgid "Your %{strong}%{plan_name}%{strong_close} subscription for %{strong}%{namespace_name}%{strong_close} will expire on %{strong}%{expires_on}%{strong_close}."
msgstr ""
msgid "Your CI/CD configuration syntax is invalid. View Lint tab for more details."
@@ -39502,7 +40063,7 @@ msgstr ""
msgid "Your GPG keys (%{count})"
msgstr ""
-msgid "Your GitLab account has been locked due to an excessive amount of unsuccessful sign in attempts. Your account will automatically unlock in %{duration} or you may click the link below to unlock now."
+msgid "Your GitLab account has been locked due to an excessive number of unsuccessful sign in attempts. You can wait for your account to automatically unlock in %{duration} or you can click the link below to unlock now."
msgstr ""
msgid "Your GitLab account request has been approved!"
@@ -39613,6 +40174,9 @@ msgstr ""
msgid "Your commit email is used for web based operations, such as edits and merges."
msgstr ""
+msgid "Your current password is required to register a two-factor authenticator app."
+msgstr ""
+
msgid "Your dashboard has been copied. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
@@ -39712,6 +40276,9 @@ msgstr ""
msgid "Your project limit is %{limit} projects! Please contact your administrator to increase it"
msgstr ""
+msgid "Your project will be created at:"
+msgstr ""
+
msgid "Your projects"
msgstr ""
@@ -39751,11 +40318,14 @@ msgstr ""
msgid "Your subscription expired!"
msgstr ""
-msgid "Your subscription has been downgraded."
-msgstr ""
-
-msgid "Your subscription will expire in %{remaining_days}."
-msgstr ""
+msgid "Your subscription will expire in %{remaining_days} day."
+msgid_plural "Your subscription will expire in %{remaining_days} days."
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+msgstr[5] ""
msgid "Your username is %{username}."
msgstr ""
@@ -39970,6 +40540,9 @@ msgstr ""
msgid "cannot merge"
msgstr ""
+msgid "cannot not be used for user namespace"
+msgstr ""
+
msgid "ciReport|%{degradedNum} degraded"
msgstr ""
@@ -40297,6 +40870,9 @@ msgstr ""
msgid "created %{timeAgo}"
msgstr ""
+msgid "created %{timeAgo} by %{author}"
+msgstr ""
+
msgid "created by"
msgstr ""
@@ -40345,9 +40921,6 @@ msgstr ""
msgid "does not have a supported extension. Only %{extension_list} are supported"
msgstr ""
-msgid "domain is not authorized for sign-up."
-msgstr ""
-
msgid "download it"
msgstr ""
@@ -40369,22 +40942,13 @@ msgstr ""
msgid "email '%{email}' is not a verified email."
msgstr ""
-msgid "email does not match the allowed domain of %{email_domains}"
-msgid_plural "email does not match the allowed domains: %{email_domains}"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
-msgstr[4] ""
-msgstr[5] ""
-
msgid "enabled"
msgstr ""
msgid "encrypted: needs to be a :required, :optional or :migrating!"
msgstr ""
-msgid "ending with MIME type format is not allowed."
+msgid "ending with a reserved file extension is not allowed."
msgstr ""
msgid "entries cannot be larger than 255 characters"
@@ -40408,6 +40972,9 @@ msgstr ""
msgid "estimateCommand|%{slash_command} overwrites the total estimated time."
msgstr ""
+msgid "example.com"
+msgstr ""
+
msgid "exceeds the limit of %{bytes} bytes"
msgstr ""
@@ -40462,9 +41029,6 @@ msgstr ""
msgid "fork"
msgstr ""
-msgid "fork this project"
-msgstr ""
-
msgid "from"
msgstr ""
@@ -40477,6 +41041,9 @@ msgstr[3] ""
msgstr[4] ""
msgstr[5] ""
+msgid "frontmatter"
+msgstr ""
+
msgid "group"
msgstr ""
@@ -40504,6 +41071,9 @@ msgstr ""
msgid "has been completed."
msgstr ""
+msgid "has too deep level of nesting"
+msgstr ""
+
msgid "help"
msgstr ""
@@ -40537,9 +41107,21 @@ msgstr ""
msgid "in"
msgstr ""
+msgid "in Infrastructure :: Kubernetes clusters"
+msgstr ""
+
+msgid "in all GitLab"
+msgstr ""
+
+msgid "in group"
+msgstr ""
+
msgid "in group %{link_to_group}"
msgstr ""
+msgid "in project"
+msgstr ""
+
msgid "in project %{link_to_project}"
msgstr ""
@@ -40585,16 +41167,19 @@ msgstr ""
msgid "is not a valid X509 certificate."
msgstr ""
-msgid "is not allowed since the group is not top-level group."
+msgid "is not allowed for sign-up."
msgstr ""
-msgid "is not allowed. Try again with a different email address, or contact your GitLab admin."
+msgid "is not allowed for this group."
msgstr ""
-msgid "is not allowed. We do not currently support project-level iterations"
+msgid "is not allowed for this project."
+msgstr ""
+
+msgid "is not allowed since the group is not top-level group."
msgstr ""
-msgid "is not from an allowed domain."
+msgid "is not allowed. We do not currently support project-level iterations"
msgstr ""
msgid "is not in the group enforcing Group Managed Account"
@@ -40687,6 +41272,9 @@ msgstr ""
msgid "log in"
msgstr ""
+msgid "managed"
+msgstr ""
+
msgid "manual"
msgstr ""
@@ -40738,6 +41326,9 @@ msgstr ""
msgid "mrWidget| Please restore it or use a different %{missingBranchName} branch"
msgstr ""
+msgid "mrWidget|%{linkStart}Set up now%{linkEnd} to analyze your source code for known security vulnerabilities."
+msgstr ""
+
msgid "mrWidget|%{mergeError}."
msgstr ""
@@ -40822,6 +41413,9 @@ msgstr[3] ""
msgstr[4] ""
msgstr[5] ""
+msgid "mrWidget|Create issue to resolve all threads"
+msgstr ""
+
msgid "mrWidget|Delete source branch"
msgstr ""
@@ -40831,12 +41425,18 @@ msgstr ""
msgid "mrWidget|Did not close"
msgstr ""
+msgid "mrWidget|Dismiss"
+msgstr ""
+
msgid "mrWidget|Email patches"
msgstr ""
msgid "mrWidget|Failed to load deployment statistics"
msgstr ""
+msgid "mrWidget|Hide %{widget} details"
+msgstr ""
+
msgid "mrWidget|If the %{missingBranchName} branch exists in your local repository, you can merge this merge request manually using the command line"
msgstr ""
@@ -40936,9 +41536,6 @@ msgstr ""
msgid "mrWidget|Request to merge"
msgstr ""
-msgid "mrWidget|Resolve all threads in new issue"
-msgstr ""
-
msgid "mrWidget|Resolve conflicts"
msgstr ""
@@ -40954,6 +41551,9 @@ msgstr ""
msgid "mrWidget|Revoke approval"
msgstr ""
+msgid "mrWidget|SAST and Secret Detection is not enabled."
+msgstr ""
+
msgid "mrWidget|Set by %{merge_author} to be added to the merge train when the pipeline succeeds"
msgstr ""
@@ -40963,6 +41563,9 @@ msgstr ""
msgid "mrWidget|Set by %{merge_author} to start a merge train when the pipeline succeeds"
msgstr ""
+msgid "mrWidget|Show %{widget} details"
+msgstr ""
+
msgid "mrWidget|The changes were merged into"
msgstr ""
@@ -40975,6 +41578,9 @@ msgstr ""
msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure, or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
msgstr ""
+msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure."
+msgstr ""
+
msgid "mrWidget|The source branch has been deleted"
msgstr ""
@@ -41017,6 +41623,9 @@ msgstr ""
msgid "mrWidget|You can merge after removing denied licenses"
msgstr ""
+msgid "mrWidget|You can only merge once this merge request is approved."
+msgstr ""
+
msgid "mrWidget|Your password"
msgstr ""
@@ -41053,6 +41662,9 @@ msgstr ""
msgid "must be less than the limit of %{tag_limit} tags"
msgstr ""
+msgid "must be set for a project namespace"
+msgstr ""
+
msgid "must be unique by status and elapsed time within a policy"
msgstr ""
@@ -41170,6 +41782,9 @@ msgstr ""
msgid "pipeline"
msgstr ""
+msgid "pipeline schedules documentation"
+msgstr ""
+
msgid "pod_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
msgstr ""
@@ -41227,16 +41842,25 @@ msgstr ""
msgid "project name"
msgstr ""
+msgid "project namespace cannot be the parent of another namespace"
+msgstr ""
+
msgid "projects"
msgstr ""
msgid "quick actions"
msgstr ""
-msgid "reCAPTCHA Private Key"
+msgid "reCAPTCHA"
+msgstr ""
+
+msgid "reCAPTCHA helps prevent credential stuffing."
msgstr ""
-msgid "reCAPTCHA Site Key"
+msgid "reCAPTCHA private key"
+msgstr ""
+
+msgid "reCAPTCHA site key"
msgstr ""
msgid "recent activity"
@@ -41467,6 +42091,9 @@ msgstr ""
msgid "user avatar"
msgstr ""
+msgid "user namespace cannot be the parent of another namespace"
+msgstr ""
+
msgid "user preferences"
msgstr ""
@@ -41563,3 +42190,9 @@ msgstr ""
msgid "your settings"
msgstr ""
+msgid "{group}"
+msgstr ""
+
+msgid "{project}"
+msgstr ""
+
diff --git a/locale/da_DK/gitlab.po b/locale/da_DK/gitlab.po
index f114892c048..3c39d640884 100644
--- a/locale/da_DK/gitlab.po
+++ b/locale/da_DK/gitlab.po
@@ -14,10 +14,7 @@ msgstr ""
"X-Crowdin-Language: da\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-09-02 01:27\n"
-
-msgid " %{name}, confirm your email address now! "
-msgstr " %{name}, bekræft din e-mailadresse nu! "
+"PO-Revision-Date: 2021-10-04 20:20\n"
msgid " %{start} to %{end}"
msgstr " %{start} til %{end}"
@@ -66,16 +63,16 @@ msgid " or "
msgstr " eller "
msgid " or %{emphasisStart}!merge request id%{emphasisEnd}"
-msgstr " eller %{emphasisStart}!sammenlægningsanmodning-id%{emphasisEnd}"
+msgstr " eller %{emphasisStart}!sammenlægningsanmodnings-id%{emphasisEnd}"
msgid " or %{emphasisStart}#issue id%{emphasisEnd}"
-msgstr " eller %{emphasisStart}#problemstilling-id%{emphasisEnd}"
+msgstr " eller %{emphasisStart}#problemstillings-id%{emphasisEnd}"
msgid " or %{emphasisStart}&epic id%{emphasisEnd}"
msgstr " eller %{emphasisStart}#epic-id%{emphasisEnd}"
msgid " or references (e.g. path/to/project!merge_request_id)"
-msgstr " eller referencer (f.eks. sti/til/projekt!sammenlægningsanmodning-id)"
+msgstr " eller referencer (e.g. sti/til/projekt!sammenlægningsanmodnings-id)"
msgid " reacted with :%{name}:"
msgstr " reagerede med :%{name}:"
@@ -92,6 +89,16 @@ msgstr "Parameteren \"el\" kræves til createInstance()"
msgid "#general, #development"
msgstr "#generelt, #udvikling"
+msgid "%d Alert"
+msgid_plural "%d Alerts"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d Alert:"
+msgid_plural "%d Alerts:"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d Approval"
msgid_plural "%d Approvals"
msgstr[0] "%d godkendelse"
@@ -135,7 +142,7 @@ msgstr[1] "%d godkendere (som du har godkendt)"
msgid "%d changed file"
msgid_plural "%d changed files"
msgstr[0] "%d ændret fil"
-msgstr[1] "%d ændret filer"
+msgstr[1] "%d ændrede filer"
msgid "%d character remaining"
msgid_plural "%d characters remaining"
@@ -227,12 +234,12 @@ msgstr[1] "%d eksportører"
msgid "%d failed"
msgid_plural "%d failed"
-msgstr[0] "%d mislykkedes"
+msgstr[0] "%d mislykket"
msgstr[1] "%d mislykkedes"
msgid "%d failed security job"
msgid_plural "%d failed security jobs"
-msgstr[0] "%d mislykkedes sikkerhedsjob"
+msgstr[0] "%d mislykket sikkerhedsjob"
msgstr[1] "%d mislykkedes sikkerhedsjob"
msgid "%d file"
@@ -243,7 +250,7 @@ msgstr[1] "%d filer"
msgid "%d fixed test result"
msgid_plural "%d fixed test results"
msgstr[0] "%d rettet testresultat"
-msgstr[1] "%d rettet testresultater"
+msgstr[1] "%d rettede testresultater"
msgid "%d group"
msgid_plural "%d groups"
@@ -372,8 +379,8 @@ msgstr[1] "%d mærkater pr. billednavn"
msgid "%d token has expired"
msgid_plural "%d tokens have expired"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d token er udløbet"
+msgstr[1] "%d tokens er udløbet"
msgid "%d unassigned issue"
msgid_plural "%d unassigned issues"
@@ -446,17 +453,20 @@ msgstr[1] "%{bold_start}%{count}%{bold_end} medlemmer"
msgid "%{bold_start}%{count}%{bold_end} opened merge request"
msgid_plural "%{bold_start}%{count}%{bold_end} opened merge requests"
-msgstr[0] "%{bold_start}%{count}%{bold_end} åbnet sammenfletningsanmodning"
-msgstr[1] "%{bold_start}%{count}%{bold_end} åbnet sammenfletningsanmodninger"
+msgstr[0] "%{bold_start}%{count}%{bold_end} åbnet sammenlægningsanmodning"
+msgstr[1] "%{bold_start}%{count}%{bold_end} åbnede sammenlægningsanmodninger"
msgid "%{code_open}Masked:%{code_close} Hidden in job logs. Must match masking requirements."
-msgstr "%{code_open}Maskeret:%{code_close} Skjult i joblogge. Skal passe med maskeringskrav."
+msgstr "%{code_open}Maskeret:%{code_close} Skjult i joblogge. Skal matche maskeringskrav."
msgid "%{code_open}Protected:%{code_close} Only exposed to protected branches or tags."
+msgstr "%{code_open}Beskyttede:%{code_close} vises kun for beskyttede grene eller mærkater."
+
+msgid "%{commit_author_link} authored %{commit_authored_timeago}"
msgstr ""
-msgid "%{commit_author_link} authored %{commit_timeago}"
-msgstr "%{commit_author_link} forfattede %{commit_timeago}"
+msgid "%{commit_author_link} authored %{commit_authored_timeago} and %{commit_committer_avatar} %{commit_committer_link} committed %{commit_committer_timeago}"
+msgstr ""
msgid "%{completedCount} completed weight"
msgstr "%{completedCount} fuldført vægt"
@@ -473,7 +483,7 @@ msgid "%{cores} cores"
msgstr "%{cores} kerner"
msgid "%{count} %{scope} for term '%{term}'"
-msgstr ""
+msgstr "%{count} %{scope} for udtrykket '%{term}'"
msgid "%{count} LOC/commit"
msgstr "%{count} LOC/commit"
@@ -523,7 +533,7 @@ msgid "%{count} related %{pluralized_subject}: %{links}"
msgstr "%{count} relaterede %{pluralized_subject}: %{links}"
msgid "%{count} selected"
-msgstr ""
+msgstr "%{count} valgt"
msgid "%{count} total weight"
msgstr "%{count} vægt i alt"
@@ -544,11 +554,20 @@ msgid "%{description}- Sentry event: %{errorUrl}- First seen: %{firstSeen}- Last
msgstr "%{description}- Sentry-begivenhed: %{errorUrl}- Først set: %{firstSeen}- Sidst set: %{lastSeen} %{countLabel}: %{count}%{userCountLabel}: %{userCount}"
msgid "%{doc_link_start}Advanced search%{doc_link_end} is disabled since %{ref_elem} is not the default branch; %{default_branch_link_start}search on %{default_branch} instead%{default_branch_link_end}."
-msgstr "%{doc_link_start}Avanceret søgning%{doc_link_end} er deaktiveret eftersom %{ref_elem} ikke er standardgrenen; %{default_branch_link_start}søg i stedet på %{default_branch}%{default_branch_link_end}."
+msgstr "%{doc_link_start}Avanceret søgning%{doc_link_end} er deaktiveret eftersom %{ref_elem} ikke er standardgrenen, %{default_branch_link_start}søg i stedet på %{default_branch}%{default_branch_link_end}."
msgid "%{doc_link_start}Advanced search%{doc_link_end} is enabled."
msgstr "%{doc_link_start}Avanceret søgning%{doc_link_end} er aktiveret."
+msgid "%{docs_link_start}Learn about visibility levels.%{docs_link_end}"
+msgstr ""
+
+msgid "%{docs_link_start}What is Large File Storage?%{docs_link_end}"
+msgstr ""
+
+msgid "%{docs_link_start}What is two-factor authentication?%{docs_link_end}"
+msgstr ""
+
msgid "%{due_date} (Past due)"
msgstr "%{due_date} (overskredet)"
@@ -571,7 +590,7 @@ msgid "%{emailPrefix}@company.com"
msgstr "%{emailPrefix}@company.com"
msgid "%{extra} more downstream pipelines"
-msgstr ""
+msgstr "%{extra} downstream-pipelines mere"
msgid "%{filePath} deleted"
msgstr "%{filePath} slettet"
@@ -592,10 +611,10 @@ msgid "%{global_id} is not a valid ID for %{expected_types}."
msgstr "%{global_id} er ikke et gyldigt id til %{expected_types}."
msgid "%{group_name} activity"
-msgstr ""
+msgstr "aktivitet i %{group_name}"
msgid "%{group_name} group members"
-msgstr ""
+msgstr "gruppemedlemmer i %{group_name}"
msgid "%{group_name} uses group managed accounts. You need to create a new GitLab account which will be managed by %{group_name}."
msgstr "%{group_name} bruger gruppehåndterede kontoer. Du skal oprette en ny GitLab-konto som håndteres af %{group_name}."
@@ -619,10 +638,7 @@ msgid "%{issuableType} will be removed! Are you sure?"
msgstr "%{issuableType} fjernes! Er du sikker?"
msgid "%{issueType} actions"
-msgstr ""
-
-msgid "%{issuesCount} issues with a limit of %{maxIssueCount}"
-msgstr "%{issuesCount} problemstillinger med en grænse på %{maxIssueCount}"
+msgstr "%{issueType}-handlinger"
msgid "%{issuesSize} with a limit of %{maxIssueCount}"
msgstr "%{issuesSize} med en grænse på %{maxIssueCount}"
@@ -637,7 +653,7 @@ msgid "%{labelStart}Actual response:%{labelEnd} %{headers}"
msgstr "%{labelStart}Faktiske svar:%{labelEnd} %{headers}"
msgid "%{labelStart}Assert:%{labelEnd} %{assertion}"
-msgstr ""
+msgstr "%{labelStart}Hævd:%{labelEnd} %{assertion}"
msgid "%{labelStart}Class:%{labelEnd} %{class}"
msgstr "%{labelStart}Klasse:%{labelEnd} %{class}"
@@ -673,7 +689,7 @@ msgid "%{labelStart}Severity:%{labelEnd} %{severity}"
msgstr "%{labelStart}Alvorlighed:%{labelEnd} %{severity}"
msgid "%{labelStart}Tool:%{labelEnd} %{reportType}"
-msgstr ""
+msgstr "%{labelStart}Værktøj:%{labelEnd} %{reportType}"
msgid "%{labelStart}Unmodified response:%{labelEnd} %{headers}"
msgstr "%{labelStart}Uændret svar:%{labelEnd} %{headers}"
@@ -681,6 +697,12 @@ msgstr "%{labelStart}Uændret svar:%{labelEnd} %{headers}"
msgid "%{label_for_message} unavailable"
msgstr "%{label_for_message} utilgængelig"
+msgid "%{learn_more_link}."
+msgstr ""
+
+msgid "%{lessThan} 1 hour"
+msgstr ""
+
msgid "%{lets_encrypt_link_start}Let's Encrypt%{lets_encrypt_link_end} is a free, automated, and open certificate authority (CA) that issues digital certificates to enable HTTPS (SSL/TLS) for sites."
msgstr "%{lets_encrypt_link_start}Let's Encrypt%{lets_encrypt_link_end} er en gratis automatiserede open source certifikatmyndighed (CA) som udsteder digitale certifikater for at gøre det muligt at bruge HTTPS (SSL/TLS) på websteder."
@@ -693,15 +715,15 @@ msgstr "%{level_name} er ikke tilladt eftersom forgreningskildeprojektet har lav
msgid "%{link_start}Learn more%{link_end} about roles."
msgstr "%{link_start}Lær mere%{link_end} om roller."
-msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
-msgstr "%{link_start}Lær mere%{link_end} om hvilken information der deles med GitLab Inc."
-
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
msgstr "%{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."
msgid "%{link_start}Start the title with %{draft_snippet}%{link_end} to prevent a merge request that is a work in progress from being merged before it's ready."
msgstr "%{link_start}Start titlen med %{draft_snippet}%{link_end} for at forhindre en sammenlægningsanmodning der er under udarbejdelse i at blive sammenlagt før den er klar."
+msgid "%{link_start}What information does GitLab Inc. collect?%{link_end}"
+msgstr ""
+
msgid "%{listToShow}, and %{awardsListLength} more"
msgstr "%{listToShow} og %{awardsListLength} mere"
@@ -712,7 +734,7 @@ msgid "%{lock_path} is locked by GitLab User %{lock_user_id}"
msgstr "%{lock_path} er låst af GitLab-brugeren %{lock_user_id}"
msgid "%{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd} and %{quickActionsDocsLinkStart}quick actions%{quickActionsDocsLinkEnd} are supported"
-msgstr "%{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd} og %{quickActionsDocsLinkStart}hurtige handlinger%{quickActionsDocsLinkEnd} understøttes"
+msgstr "%{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd} og %{quickActionsDocsLinkStart}hurtighandlinger%{quickActionsDocsLinkEnd} understøttes"
msgid "%{mergeLength}/%{usersLength} can merge"
msgstr "%{mergeLength}/%{usersLength} kan sammenlægge"
@@ -733,10 +755,10 @@ msgid "%{mrText}, this issue will be closed automatically."
msgstr "%{mrText}, problemstillingen lukkes automatisk."
msgid "%{name_with_link} namespace has %{percent} or less Shared Runner Pipeline minutes remaining. Once it runs out, no new jobs or pipelines in its projects will run."
-msgstr ""
+msgstr "Navnerummet %{name_with_link} har %{percent} eller færre pipeline-minutter tilbage for delte runnere. Når det løber tør vil ingen nye job eller pipelines i dets projekter køre."
msgid "%{name_with_link} namespace has run out of Shared Runner Pipeline minutes. No new jobs or pipelines in its projects will run."
-msgstr ""
+msgstr "Navnerummet %{name_with_link} er løbet tør for pipeline-minutter for delte runnere. Ingen nye job eller pipelines i dets projekter vil køre."
msgid "%{name} (Busy)"
msgstr "%{name} (optaget)"
@@ -757,10 +779,10 @@ msgid "%{name}'s avatar"
msgstr "%{name}s avatar"
msgid "%{name}(%{url}) namespace has %{percent} or less Shared Runner Pipeline minutes remaining. After it runs out, no new jobs or pipelines in its projects will run."
-msgstr ""
+msgstr "Navnerummet %{name}(%{url}) har %{percent} eller færre pipeline-minutter tilbage for delte runnere. Når det løber tør vil ingen nye job eller pipelines i dets projekter køre."
msgid "%{name}(%{url}) namespace has run out of Shared Runner Pipeline minutes so no new jobs or pipelines in its projects will run."
-msgstr ""
+msgstr "Navnerummet %{name}(%{url}) er løbet tør for pipeline-minutter for delte runnere, så ingen nye job eller pipelines i dets projekter vil køre."
msgid "%{name}, confirm your email address now!"
msgstr "%{name}, bekræft din e-mailadresse nu!"
@@ -792,10 +814,10 @@ msgid "%{openedIssues} open, %{closedIssues} closed"
msgstr "%{openedIssues} åbne, %{closedIssues} lukkede"
msgid "%{percentage}%% weight completed"
-msgstr "%{percentage}%% vægt fuldført"
+msgstr "%{percentage} %% vægt fuldført"
msgid "%{percent}%% complete"
-msgstr "%{percent}%% fuldført"
+msgstr "%{percent} %% fuldført"
msgid "%{percent}%{percentSymbol} complete"
msgstr "%{percent} %{percentSymbol} fuldført"
@@ -814,8 +836,8 @@ msgstr "%{ref} kan ikke tilføjes: %{error}"
msgid "%{releases} release"
msgid_plural "%{releases} releases"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%{releases} udgivelse"
+msgstr[1] "%{releases} udgivelser"
msgid "%{remaining_approvals} left"
msgstr "%{remaining_approvals} tilbage"
@@ -824,7 +846,7 @@ msgid "%{reportType} %{status}"
msgstr "%{reportType} %{status}"
msgid "%{reportType} detected %{totalStart}%{total}%{totalEnd} potential %{vulnMessage}"
-msgstr "%{reportType} registrerede %{totalStart}%{total}%{totalEnd} potientielle %{vulnMessage}"
+msgstr "%{reportType} registrerede %{totalStart}%{total}%{totalEnd} potentielle %{vulnMessage}"
msgid "%{reportType} detected %{totalStart}no%{totalEnd} vulnerabilities."
msgstr "%{reportType} registrerede %{totalStart}ingen%{totalEnd} sårbarheder."
@@ -833,13 +855,13 @@ msgid "%{retryButtonStart}Try again%{retryButtonEnd} or %{newFileButtonStart}att
msgstr "%{retryButtonStart}Prøv igen%{retryButtonEnd} eller %{newFileButtonStart}vedhæft en ny fil%{newFileButtonEnd}."
msgid "%{rotation} has been recalculated with the remaining participants. Please review the new setup for %{rotation_link}. It is recommended that you reach out to the current on-call responder to ensure continuity of on-call coverage."
-msgstr ""
+msgstr "%{rotation} er blevet udregnet igen med de tilbageværende deltagere. Kontrollér venligst den nye opsætning for %{rotation_link}. Det anbefales at du tager kontakt til den nuværende vagtperson for at sikre kontinuitet i vagtdækning."
msgid "%{rotation} has been recalculated with the remaining participants. Please review the new setup for %{rotation}. It is recommended that you reach out to the current on-call responder to ensure continuity of on-call coverage."
-msgstr ""
+msgstr "%{rotation} er blevet udregnet igen med de tilbageværende deltagere. Kontrollér venligst den nye opsætning for %{rotation}. Det anbefales at du tager kontakt til den nuværende vagtperson for at sikre kontinuitet i vagtdækning."
msgid "%{scope} results for term '%{term}'"
-msgstr ""
+msgstr "%{scope} resultater for udtrykket '%{term}'"
msgid "%{seconds}s"
msgstr "%{seconds} s"
@@ -851,11 +873,11 @@ msgstr[1] "%{securityScanner} er ikke aktiveret til projektet. %{linkStart}Mere
msgid "%{securityScanner} result is not available because a pipeline has not been run since it was enabled. %{linkStart}Run a pipeline%{linkEnd}"
msgid_plural "%{securityScanner} results are not available because a pipeline has not been run since it was enabled. %{linkStart}Run a pipeline%{linkEnd}"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%{securityScanner} resultat er ikke tilgængeligt fordi en pipeline ikke er blevet kørt siden den blev aktiveret. %{linkStart}Kør en pipeline%{linkEnd}"
+msgstr[1] "%{securityScanner} resultater er ikke tilgængelige fordi en pipeline ikke er blevet kørt siden de blev aktiverede. %{linkStart}Kør en pipeline%{linkEnd}"
-msgid "%{service_ping_link_start}Learn more%{service_ping_link_end} about what information is shared with GitLab Inc."
-msgstr "%{service_ping_link_start}Lær mere%{service_ping_link_end} om hvilken information der deles med GitLab Inc."
+msgid "%{service_ping_link_start}What information is shared with GitLab Inc.?%{service_ping_link_end}"
+msgstr ""
msgid "%{size} %{unit}"
msgstr "%{size} %{unit}"
@@ -888,10 +910,13 @@ msgid "%{start} to %{end}"
msgstr "%{start} til %{end}"
msgid "%{state} epics"
+msgstr "%{state} epics"
+
+msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
msgstr ""
msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
-msgstr ""
+msgstr "%{strongStart}Tip:%{strongEnd} Du kan også checkout sammenlægningsanmodninger lokalt ved at %{linkStart}følge retningslinjerne%{linkEnd}"
msgid "%{strong_start}%{branch_count}%{strong_end} Branch"
msgid_plural "%{strong_start}%{branch_count}%{strong_end} Branches"
@@ -949,11 +974,6 @@ msgstr "%{tag}-%{evidence}-%{filename}"
msgid "%{template_project_id} is unknown or invalid"
msgstr "%{template_project_id} er ukendt eller ugyldigt"
-msgid "%{text} %{files}"
-msgid_plural "%{text} %{files} files"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%{text} is available"
msgstr "%{text} er tilgængelig"
@@ -961,7 +981,7 @@ msgid "%{timebox_name} should belong either to a project or a group."
msgstr "%{timebox_name} skal enten tilhøre et projekt eller en gruppe."
msgid "%{timebox_type} does not support burnup charts"
-msgstr ""
+msgstr "%{timebox_type} understøtter ikke burnupdiagrammer"
msgid "%{timebox_type} must have a start and due date"
msgstr "%{timebox_type} skal have en start- og forfaldsdato"
@@ -985,7 +1005,7 @@ msgid "%{total_warnings} warning(s) found:"
msgstr "%{total_warnings} advarsler fundet:"
msgid "%{total} open issue weight"
-msgstr ""
+msgstr "%{total} åben problemstillingsvægt"
msgid "%{total} warnings found: showing first %{warningsDisplayed}"
msgstr "%{total} advarsler fundet: viser første %{warningsDisplayed}"
@@ -1000,7 +1020,7 @@ msgid "%{user_name} (%{user_username}) was removed from %{rotation} in %{schedul
msgstr "%{user_name} (%{user_username}) blev fjernet fra %{rotation} i %{schedule} i %{project}. "
msgid "%{user_name} profile page"
-msgstr ""
+msgstr "%{user_name}s profilside"
msgid "%{username} changed the draft status of merge request %{mr_link}"
msgstr "%{username} ændrede udkaststatussen på sammenlægningsanmodningen %{mr_link}"
@@ -1038,9 +1058,6 @@ msgstr "%{webhooks_link_start}%{webhook_type}%{link_end} gør det muligt for dig
msgid "%{wildcards_link_start}Wildcards%{wildcards_link_end} such as %{code_tag_start}v*%{code_tag_end} or %{code_tag_start}*-release%{code_tag_end} are supported."
msgstr "%{wildcards_link_start}Jokertegn%{wildcards_link_end} såsom %{code_tag_start}v*%{code_tag_end} eller %{code_tag_start}*-release%{code_tag_end} understøttes."
-msgid "&lt; 1 hour"
-msgstr "&lt; 1 time"
-
msgid "'%{data}' at %{location} does not match format: %{format}"
msgstr "'%{data}' på %{location} passer ikke til formatet: %{format}"
@@ -1063,13 +1080,13 @@ msgid "'%{level}' is not a valid visibility level"
msgstr "'%{level}' er ikke et gyldigt synlighedsniveau"
msgid "'%{name}' Value Stream created"
-msgstr "'%{name}' Value Stream oprettet"
+msgstr "Value Stream'et '%{name}' oprettet"
msgid "'%{name}' Value Stream deleted"
-msgstr "'%{name}' Value Stream slettet"
+msgstr "Value Stream'et '%{name}' slettet"
msgid "'%{name}' Value Stream saved"
-msgstr "'%{name}' Value Stream gemt"
+msgstr "Value Stream'et '%{name}' gemt"
msgid "'%{source}' is not a import source"
msgstr "'%{source}' er ikke en importkilde"
@@ -1124,9 +1141,6 @@ msgstr "(tilbagekaldt)"
msgid "(we need your current password to confirm your changes)"
msgstr "(vi har brug for din nuværende adgangskode for at bekræfte dine ændringer)"
-msgid "* * * * *"
-msgstr "* * * * *"
-
msgid "+ %{amount} more"
msgstr "+ %{amount} mere"
@@ -1145,7 +1159,7 @@ msgstr[0] "+%d mere"
msgstr[1] "+%d mere"
msgid "+%{approvers} more approvers"
-msgstr "+%{approvers} flere godkendere"
+msgstr "+%{approvers} godkendere mere"
msgid "+%{extra} more"
msgstr "+%{extra} mere"
@@ -1188,17 +1202,17 @@ msgid "- of - weight completed"
msgstr "- af - vægt fuldført"
msgid "- show less"
-msgstr "- vis mindre"
+msgstr "- vis færre"
msgid "."
msgstr "."
+msgid "/"
+msgstr ""
+
msgid "0 bytes"
msgstr "0 byte"
-msgid "0 for unlimited, only effective with remote storage enabled."
-msgstr "0 for ubegrænset, kun gældende når fjernlager er aktiveret."
-
msgid "0t1DgySidms"
msgstr "0t1DgySidms"
@@ -1326,6 +1340,9 @@ msgstr "10-19 bidrag"
msgid "1000+"
msgstr "1000+"
+msgid "192.168.0.0/24"
+msgstr ""
+
msgid "1st contribution!"
msgstr "Første bidrag!"
@@ -1333,7 +1350,7 @@ msgid "20-29 contributions"
msgstr "20-29 bidrag"
msgid "2FA"
-msgstr "2FG"
+msgstr "2TG"
msgid "2FADevice|Registered On"
msgstr "Registreret"
@@ -1363,7 +1380,7 @@ msgid "404|Make sure the address is correct and the page hasn't moved."
msgstr "Sørg for at adressen er korrekt og at siden ikke er flyttet."
msgid "404|Page Not Found"
-msgstr "Side ikke fundet"
+msgstr "Siden blev ikke fundet"
msgid "404|Please contact your GitLab administrator if you think this is a mistake."
msgstr "Kontakt venligst din GitLab-administrator, hvis du mener, at det er en fejltagelse."
@@ -1405,7 +1422,7 @@ msgid "A Let's Encrypt SSL certificate can not be obtained until your domain is
msgstr "Et Let's Encrypt SSL-certifikat kan ikke indhentes før dit domæne er bekræftet."
msgid "A Metrics Dashboard menu item appears in the Monitoring section of the Admin Area."
-msgstr ""
+msgstr "Menupunktet målingsbetjeningspanel vises i afsnittet overvågning i administratorområdet."
msgid "A basic page and serverless function that uses AWS Lambda, AWS API Gateway, and GitLab Pages"
msgstr "En grundlæggende side og serverfri funktion der bruger AWS Lambda, AWS API Gateway og GitLab Pages"
@@ -1441,10 +1458,10 @@ msgid "A group is a collection of several projects"
msgstr "En gruppe er en samling af projekter"
msgid "A group represents your organization in GitLab. Groups allow you to manage users and collaborate across multiple projects."
-msgstr ""
+msgstr "En gruppe repræsenterer din organisation i GitLab. Grupper giver dig mulighed for at håndtere brugere og samarbejde på tværs af flere projekter."
msgid "A job artifact is an archive of files and directories saved by a job when it finishes."
-msgstr ""
+msgstr "En jobartefakt er et arkiv med filer eller mapper som gemmes af et job når det er færdigt."
msgid "A limit of %{ci_project_subscriptions_limit} subscriptions to or from a project applies."
msgstr "En grænse på %{ci_project_subscriptions_limit} abonnementer til eller fra et projekt gælder."
@@ -1459,28 +1476,25 @@ msgid "A merge request hasn't yet been merged"
msgstr "En sammenlægningsanmodning er endnu ikke blevet sammenlagt"
msgid "A new Auto DevOps pipeline has been created, go to %{pipelines_link_start}Pipelines page%{pipelines_link_end} for details"
-msgstr ""
+msgstr "En ny Auto DevOps-pipeline er blevet oprettet. GÃ¥ til %{pipelines_link_start}Pipelines-siden%{pipelines_link_end} for detaljer"
msgid "A new Release %{tag} for %{name} was published. Visit the %{release_link_start}Releases page%{release_link_end} to read more about it."
-msgstr ""
+msgstr "En ny udgivelse %{tag} for %{name} blev udgivet. Besøg %{release_link_start}Udgivelser-siden%{release_link_end} for at læse mere om det."
msgid "A new Release %{tag} for %{name} was published. Visit the Releases page to read more about it:"
-msgstr ""
+msgstr "En ny udgivelse %{tag} for %{name} blev udgivet. Besøg Udgivelser-siden for at læse mere om det:"
msgid "A new branch will be created in your fork and a new merge request will be started."
msgstr "Der oprettes en ny gren i din forgrening og en ny sammenlægningsanmodning startes."
msgid "A new impersonation token has been created."
-msgstr ""
+msgstr "En ny efterligningstoken er blevet oprettet."
msgid "A non-confidential epic cannot be assigned to a confidential parent epic"
-msgstr ""
+msgstr "En ikke-fortrolig epic kan ikke tildeles til en fortrolig forælderepic"
msgid "A plain HTML site that uses Netlify for CI/CD instead of GitLab, but still with all the other great GitLab features"
-msgstr "Et rent HTML-websted som bruger Netlify til CI/CD frem for GitLab, men stadigvæk med alle de andre gode GitLab-funktioner"
-
-msgid "A plain-text response to show to clients that hit the rate limit."
-msgstr ""
+msgstr "Et ren HTML-websted som bruger Netlify til CI/CD frem for GitLab, men stadigvæk med alle de andre gode GitLab-funktioner"
msgid "A platform value can be web, mob or app."
msgstr "En platformværdi kan være web, mob eller app."
@@ -1507,7 +1521,7 @@ msgid "A sign-in to your account has been made from the following IP address: %{
msgstr "Der blev logget ind på din konto fra følgende IP-adresse: %{ip}"
msgid "A string appended to the project path to form the Service Desk email address."
-msgstr ""
+msgstr "En streng som tilføjes til slutningen af projektstien for at danne e-mailadressen for serviceskranken."
msgid "A title is required"
msgstr "En titel kræves"
@@ -1522,10 +1536,10 @@ msgid "API"
msgstr "API"
msgid "API Fuzzing"
-msgstr ""
+msgstr "API-fuzzing"
msgid "API Fuzzing Configuration"
-msgstr ""
+msgstr "Konfiguration af API-fuzzing"
msgid "API Help"
msgstr "Hjælp for API"
@@ -1540,16 +1554,16 @@ msgid "API?"
msgstr "API?"
msgid "APIFuzzing|$VARIABLE_WITH_PASSWORD"
-msgstr ""
+msgstr "$VARIABEL_MED_ADGANGSKODE"
msgid "APIFuzzing|$VARIABLE_WITH_USERNAME"
-msgstr ""
+msgstr "$VARIABEL_MED_BRUGERNAVN"
msgid "APIFuzzing|API Fuzzing Configuration"
-msgstr ""
+msgstr "Konfiguration af API-fuzzing"
msgid "APIFuzzing|Base URL of API testing target. For example, http://www.example.com."
-msgstr ""
+msgstr "Grund-URL for API-testmål. F.eks. http://www.example.com."
msgid "APIFuzzing|Choose a method"
msgstr "Vælg en metode"
@@ -1558,34 +1572,34 @@ msgid "APIFuzzing|Choose a profile"
msgstr "Vælg en profil"
msgid "APIFuzzing|Code snippet could not be generated. Try again later."
-msgstr "Kodeuddrag kunne ikke genereres. Prøv igen senere."
+msgstr "Kodeudklip kunne ikke genereres. Prøv igen senere."
msgid "APIFuzzing|Configure HTTP basic authentication values. Other authentication methods are supported. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
+msgid "APIFuzzing|Customize your project's API fuzzing configuration options and copy the code snippet to your .gitlab-ci.yml file to apply any changes. Note that this tool does not reflect or update your .gitlab-ci.yml file automatically. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
msgstr ""
msgid "APIFuzzing|Enable authentication"
msgstr "Aktivér godkendelse"
msgid "APIFuzzing|Enter the name of the CI variable containing the password. For example, $VARIABLE_WITH_PASSWORD."
-msgstr ""
+msgstr "Indtast navnet på den CI-variabel som indeholder adgangskoden. F.eks. $VARIABEL_MED_ADGANGSKODE."
msgid "APIFuzzing|Enter the name of the CI variable containing the username. For example, $VARIABLE_WITH_USERNAME."
-msgstr ""
+msgstr "Indtast navnet på den CI-variabel som indeholder brugernavnet. F.eks. $VARIABEL_MED_BRUGERNAVN."
msgid "APIFuzzing|File path or URL to APIs to be tested. For example, folder/example_fuzz.har. HAR files may contain sensitive information such as authentication tokens, API keys, and session cookies. We recommend that you review the HAR files' contents before adding them to a repository."
msgstr ""
msgid "APIFuzzing|File path or URL to OpenAPI specification. For example, folder/openapi.json or http://www.example.com/openapi.json."
-msgstr ""
+msgstr "Filsti eller URL til OpenAPI-specifikation. F.eks. mappe/openapi.json eller http://www.example.com/openapi.json."
msgid "APIFuzzing|File path or URL to requests to be tested. For example, folder/example.postman_collection.json."
-msgstr ""
+msgstr "Filsti eller URL til anmodninger som skal testes. F.eks. mappe/eksempel.postman_samling.json."
msgid "APIFuzzing|Generate code snippet"
-msgstr "Generer kodeuddrag"
+msgstr "Generer kodeudklip"
msgid "APIFuzzing|Make sure your credentials are secured"
msgstr "Sørg for at dine loginoplysninger er sikret"
@@ -1600,10 +1614,10 @@ msgid "APIFuzzing|Scan mode"
msgstr "Skanningstilstand"
msgid "APIFuzzing|Scan profile"
-msgstr ""
+msgstr "Skanningsprofil"
msgid "APIFuzzing|Show code snippet for the profile"
-msgstr "Vis kodeuddrag for profilen"
+msgstr "Vis kodeudklip for profilen"
msgid "APIFuzzing|Target URL"
msgstr "MÃ¥l-URL"
@@ -1626,9 +1640,6 @@ msgstr ""
msgid "APIFuzzing|To prevent a security leak, authentication info must be added as a %{ciVariablesLinkStart}CI variable%{ciVariablesLinkEnd}. As a user with maintainer access rights, you can manage CI variables in the %{ciSettingsLinkStart}Settings%{ciSettingsLinkEnd} area."
msgstr ""
-msgid "APIFuzzing|Use this tool to generate API fuzzing configuration YAML to copy into your .gitlab-ci.yml file. This tool does not reflect or update your .gitlab-ci.yml file automatically."
-msgstr ""
-
msgid "APIFuzzing|Username for basic authentication"
msgstr "Brugernavn for grundlæggende godkendelse"
@@ -1636,10 +1647,10 @@ msgid "APIFuzzing|You may need a maintainer's help to secure your credentials."
msgstr "Det kan være du skal have hjælp fra en vedligeholder for at sikre dine loginoplysninger."
msgid "APIFuzzing|folder/example.postman_collection.json"
-msgstr ""
+msgstr "mappe/eksempel.postman_samling.json"
msgid "APIFuzzing|folder/example_fuzz.har"
-msgstr ""
+msgstr "mappe/eksempel_fuzz.har"
msgid "APIFuzzing|folder/openapi.json"
msgstr "mappe/openapi.json"
@@ -1678,10 +1689,7 @@ msgid "Abuse reports"
msgstr "Misbrugsrapporter"
msgid "Abuse reports notification email"
-msgstr ""
-
-msgid "Abuse reports will be sent to this address if it is set. Abuse reports are always available in the admin area."
-msgstr ""
+msgstr "Underretnings e-mail for misbrugsrapporter"
msgid "Accept invitation"
msgstr "Accepter invitation"
@@ -1719,12 +1727,18 @@ msgstr "Adgang forbudt. Tjek dit adgangsniveau."
msgid "Access granted"
msgstr "Adgang givet"
-msgid "Access requests"
+msgid "Access key ID"
msgstr ""
+msgid "Access requests"
+msgstr "Adgangsanmodninger"
+
msgid "Access to '%{classification_label}' not allowed"
msgstr "Adgang til '%{classification_label}' ikke tilladt"
+msgid "Access tokens expire after 2 hours. A refresh token may be used at any time to generate a new access token. Non-expiring access tokens are deprecated. Clear this setting to enable backward compatibility."
+msgstr ""
+
msgid "AccessDropdown|Deploy Keys"
msgstr "Udsendelsesnøgler"
@@ -1744,19 +1758,19 @@ msgid "AccessTokens|Are you sure?"
msgstr "Er du sikker?"
msgid "AccessTokens|Are you sure? Any RSS or calendar URLs currently in use will stop working."
-msgstr ""
+msgstr "Er du sikker? RSS- eller kalender-URL'er som er i brug i øjeblikket vil stoppe med at virke."
msgid "AccessTokens|Are you sure? Any issue email addresses currently in use will stop working."
-msgstr ""
+msgstr "Er du sikker? Problemstillings e-mailadresser som er i brug i øjeblikket vil stoppe med at virke."
msgid "AccessTokens|Created"
msgstr "Oprettet"
msgid "AccessTokens|Feed token"
-msgstr ""
+msgstr "Feedtoken"
msgid "AccessTokens|Incoming email token"
-msgstr ""
+msgstr "Indgående e-mailtoken"
msgid "AccessTokens|It cannot be used to access any other data."
msgstr "Den kan ikke bruges til at få adgang til andre data."
@@ -1765,19 +1779,19 @@ msgid "AccessTokens|Keep this token secret. Anyone who has it can access reposit
msgstr ""
msgid "AccessTokens|Keep this token secret. Anyone who has it can create issues as if they were you. If that happens, %{link_reset_it}."
-msgstr ""
+msgstr "Hold adgangstokenen hemmelig. Alle der har den kan oprette problemstillinger som var de dig. Hvis det sker, så %{link_reset_it}."
msgid "AccessTokens|Keep this token secret. Anyone who has it can read activity and issue RSS feeds or your calendar feed as if they were you. If that happens, %{link_reset_it}."
-msgstr ""
+msgstr "Hold adgangstokenen hemmelig. Alle der har den kan læse aktivitets- og problemstillings RSS-feeds eller din kalenderfeed som var de dig. Hvis det sker, så %{link_reset_it}."
msgid "AccessTokens|Personal Access Tokens"
-msgstr ""
+msgstr "Personlige adgangstokens"
msgid "AccessTokens|Static object token"
-msgstr ""
+msgstr "Statisk objekttoken"
msgid "AccessTokens|They are the only accepted password when you have Two-Factor Authentication (2FA) enabled."
-msgstr ""
+msgstr "De er de eneste adgangskoder som accepteres når du har totrinsgodkendelse (2TG) aktiveret."
msgid "AccessTokens|You can also use personal access tokens to authenticate against Git over HTTP."
msgstr ""
@@ -1807,7 +1821,7 @@ msgid "AccessibilityReport|New"
msgstr "Ny"
msgid "AccessibilityReport|The accessibility scanning found an error of the following type: %{code}"
-msgstr ""
+msgstr "Tilgængeligsskanningen fandt en fejl med følgende type: %{code}"
msgid "Account"
msgstr "Konto"
@@ -1828,19 +1842,19 @@ msgid "Action"
msgstr "Handling"
msgid "Action to take when receiving an alert. %{docsLink}"
-msgstr ""
+msgstr "Handling der skal tages når der modtages en alertbesked. %{docsLink}"
msgid "Actions"
msgstr "Handlinger"
msgid "Activate Service Desk"
-msgstr "Aktivér Service Desk"
+msgstr "Aktivér serviceskranke"
msgid "Active"
-msgstr "Aktiv"
+msgstr "Aktive"
msgid "Active %{type} (%{token_length})"
-msgstr "Aktiv %{type} (%{token_length})"
+msgstr "Aktive %{type} (%{token_length})"
msgid "Active Sessions"
msgstr "Aktive sessioner"
@@ -1894,10 +1908,10 @@ msgid "Add a GPG key"
msgstr "Tilføj en GPG-nøgle"
msgid "Add a Jaeger URL to replace this page with a link to your Jaeger server. You first need to %{link_start_tag}install Jaeger%{link_end_tag}."
-msgstr ""
+msgstr "Tilføj en Jaeger-URL for at erstatte siden med et link til din Jaeger-server. Du skal først %{link_start_tag}installere Jaeger%{link_end_tag}."
msgid "Add a Terms of Service agreement and Privacy Policy for users of this GitLab instance."
-msgstr ""
+msgstr "Tilføj en aftale om vilkår for tjeneste og privatlivspolitik til brugere af GitLab-instansen."
msgid "Add a bullet list"
msgstr "Tilføj en punktliste"
@@ -1915,7 +1929,7 @@ msgid "Add a custom message with details about the instance's shared runners. Th
msgstr ""
msgid "Add a general comment to this %{noteableDisplayName}."
-msgstr ""
+msgstr "Tilføj en generel kommentar til denne %{noteableDisplayName}."
msgid "Add a general comment to this %{noteable_name}."
msgstr "Tilføj en generel kommentar til %{noteable_name}."
@@ -1951,7 +1965,7 @@ msgid "Add a task list"
msgstr "Tilføj en opgaveliste"
msgid "Add a to do"
-msgstr "Tilføj en to do"
+msgstr "Tilføj et gøremål"
msgid "Add an SSH key"
msgstr "Tilføj en SSH-nøgle"
@@ -1960,7 +1974,7 @@ msgid "Add an existing issue"
msgstr "Tilføj en eksisterende problemstilling"
msgid "Add an impersonation token"
-msgstr ""
+msgstr "Tilføj en efterligningstoken"
msgid "Add another link"
msgstr "Tilføj endnu et link"
@@ -2037,11 +2051,14 @@ msgstr "Tilføj nyt program"
msgid "Add new directory"
msgstr "Tilføj ny mappe"
+msgid "Add new service account"
+msgstr ""
+
msgid "Add or remove previously merged commits"
msgstr "Tilføj eller fjern commits, som tidligere er blevet sammenlagt"
msgid "Add or subtract spent time"
-msgstr ""
+msgstr "Tilføj eller fratræk brugt tid"
msgid "Add previously merged commits"
msgstr "Tilføj commits, som tidligere er blevet sammenlagt"
@@ -2062,7 +2079,7 @@ msgid "Add strikethrough text"
msgstr "Tilføj gennemstreget tekst"
msgid "Add suggestion to batch"
-msgstr ""
+msgstr "Tilføj forslag til batch"
msgid "Add system hook"
msgstr "Tilføj systemhook"
@@ -2143,13 +2160,13 @@ msgid "Added %{label_references} %{label_text}."
msgstr "Tilføjede %{label_references} %{label_text}."
msgid "Added a to do."
-msgstr "Tilføjede en to do."
+msgstr "Tilføjede et gøremål."
msgid "Added an issue to an epic."
msgstr "Tilføjede en problemstilling til en epic."
msgid "Added at"
-msgstr "Tilføjet klokken"
+msgstr "Tilføjet kl."
msgid "Added for this merge request"
msgstr "Tilføjet for denne sammenlægningsanmodning"
@@ -2197,7 +2214,7 @@ msgid "Adds a Zoom meeting"
msgstr "Tilføjer et Zoom-møde"
msgid "Adds a to do."
-msgstr "Tilføjer en to do."
+msgstr "Tilføjer et gøremål."
msgid "Adds an issue to an epic."
msgstr "Tilføjer en problemstilling til en epic."
@@ -2274,6 +2291,9 @@ msgstr "Udvikler"
msgid "AdminArea|Features"
msgstr "Funktioner"
+msgid "AdminArea|Get security updates from GitLab and stay up to date"
+msgstr ""
+
msgid "AdminArea|Groups"
msgstr "Grupper"
@@ -2281,7 +2301,7 @@ msgid "AdminArea|Guest"
msgstr "Gæst"
msgid "AdminArea|Included Free in license"
-msgstr ""
+msgstr "Medtaget gratis i licens"
msgid "AdminArea|Latest groups"
msgstr "Seneste grupper"
@@ -2311,7 +2331,13 @@ msgid "AdminArea|Projects"
msgstr "Projekter"
msgid "AdminArea|Reporter"
-msgstr "Rapportør"
+msgstr ""
+
+msgid "AdminArea|Sign up for the GitLab Security Newsletter to get notified for security updates."
+msgstr ""
+
+msgid "AdminArea|Sign up for the GitLab newsletter"
+msgstr ""
msgid "AdminArea|Stop all jobs"
msgstr "Stop alle job"
@@ -2350,7 +2376,7 @@ msgid "AdminArea|View latest users"
msgstr "Vis seneste brugere"
msgid "AdminArea|You’re about to stop all jobs. This will halt all current jobs that are running."
-msgstr ""
+msgstr "Du er ved at stoppe alle job. Det standser alle nuværende job som kører."
msgid "AdminDashboard|Error loading the statistics. Please try again"
msgstr "Fejl ved indlæsning af statistikken. Prøv venligst igen"
@@ -2368,7 +2394,7 @@ msgid "AdminSettings|A Let's Encrypt account will be configured for this GitLab
msgstr "En Let's Encrypt-konto konfigureres til GitLab-instansen med denne e-mailadresse. Du modtager e-mails til at advare om certifikater der er ved at udløbe. %{link_start}Lær mere%{link_end}."
msgid "AdminSettings|All new projects can use the instance's shared runners by default."
-msgstr "Alle nye projekter kan bruge instansens delte runners som standard."
+msgstr "Alle nye projekter kan bruge instansens delte runnere som standard."
msgid "AdminSettings|Auto DevOps domain"
msgstr "Auto DevOps-domæne"
@@ -2377,19 +2403,25 @@ msgid "AdminSettings|Configure Let's Encrypt"
msgstr "Konfigurer Let's Encrypt"
msgid "AdminSettings|Disable feed token"
-msgstr ""
+msgstr "Deaktivér feedtoken"
msgid "AdminSettings|Disable public access to Pages sites"
msgstr "Deaktivér offentlig adgang til Pages-websteder"
+msgid "AdminSettings|Display a banner on merge requests in projects with no pipelines to initiate steps to add a .gitlab-ci.yml file."
+msgstr ""
+
msgid "AdminSettings|Domain verification is an essential security measure for public GitLab sites. Users are required to demonstrate they control a domain before it is enabled. %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "AdminSettings|Enable pipeline suggestion banner"
+msgstr ""
+
msgid "AdminSettings|Enable shared runners for new projects"
-msgstr "Aktivér delte runners til nye projekter"
+msgstr "Aktivér delte runnere til nye projekter"
msgid "AdminSettings|Feed token"
-msgstr ""
+msgstr "Feedtoken"
msgid "AdminSettings|I have read and agree to the Let's Encrypt %{link_start}Terms of Service%{link_end} (PDF)."
msgstr "Jeg har læst og accepteret Let's Encrypts %{link_start}Vilkår for tjeneste%{link_end} (PDF)."
@@ -2404,7 +2436,7 @@ msgid "AdminSettings|Let's Encrypt email"
msgstr "E-mail for Let's Encrypt"
msgid "AdminSettings|Maximum duration of a session for Git operations when 2FA is enabled."
-msgstr "Maksimale varighed på en session for Git-handlinger når 2FG er aktiveret."
+msgstr "Maksimale varighed på en session for Git-handlinger når 2TG er aktiveret."
msgid "AdminSettings|New CI/CD variables in projects and groups default to protected."
msgstr "Nye CI-/CD-variabler i projekter og grupper indstilles som standard til beskyttet."
@@ -2431,7 +2463,7 @@ msgid "AdminSettings|Select to disable public access for Pages sites, which requ
msgstr ""
msgid "AdminSettings|Session duration for Git operations when 2FA is enabled (minutes)"
-msgstr "Sessionsvarighed for Git-handlinger når 2FG er aktiveret (minutter)"
+msgstr "Sessionsvarighed for Git-handlinger når 2TG 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 ""
@@ -2449,7 +2481,7 @@ msgid "AdminSettings|The default name for the initial branch of new repositories
msgstr ""
msgid "AdminSettings|The latest artifacts for all jobs in the most recent successful pipelines in each project are stored and do not expire."
-msgstr ""
+msgstr "De seneste artefakter for alle job i de nyeste pipelines som er lykkedes i hvert projekt gemmes og udløber ikke."
msgid "AdminSettings|The projects in this group can be selected as templates for new projects created on the instance. %{link_start}Learn more.%{link_end} "
msgstr ""
@@ -2479,7 +2511,7 @@ msgid "AdminStatistics|SSH Keys"
msgstr "SSH-nøgler"
msgid "AdminStatistics|Snippets"
-msgstr "Uddrag"
+msgstr "Snippets"
msgid "AdminUsers|(Admin)"
msgstr "(administrator)"
@@ -2500,13 +2532,13 @@ msgid "AdminUsers|(Pending approval)"
msgstr "(afventer godkendelse)"
msgid "AdminUsers|2FA Disabled"
-msgstr "2FG deaktiveret"
+msgstr "2TG deaktiveret"
msgid "AdminUsers|2FA Enabled"
-msgstr "2FG aktiveret"
+msgstr "2TG aktiveret"
msgid "AdminUsers|A user can validate themselves by inputting a credit/debit card, or an admin can manually validate a user."
-msgstr ""
+msgstr "En bruger kan validere sig selv ved at indtaste et kredit-/debetkort eller en administrator kan validere en bruger manuelt."
msgid "AdminUsers|Access"
msgstr "Adgang"
@@ -2581,7 +2613,7 @@ msgid "AdminUsers|Cannot sign in or access instance information"
msgstr "Kan ikke logge ind eller tilgå instansinformation"
msgid "AdminUsers|Cannot unblock LDAP blocked users"
-msgstr "Kan ikke afblokere LDAP-blokerede brugere"
+msgstr "Kan ikke fjerne blokering af LDAP-blokerede brugere"
msgid "AdminUsers|Cohorts"
msgstr ""
@@ -2593,7 +2625,7 @@ msgid "AdminUsers|Confirm user %{username}?"
msgstr "Bekræft brugeren %{username}?"
msgid "AdminUsers|Could not load user group counts. Please refresh the page to try again."
-msgstr ""
+msgstr "Kunne ikke indlæse brugergruppetællinger. Opdater venligst siden for at prøve igen."
msgid "AdminUsers|Deactivate"
msgstr "Deaktivér"
@@ -2626,25 +2658,25 @@ msgid "AdminUsers|External"
msgstr "Eksterne"
msgid "AdminUsers|External users cannot see internal or private projects unless access is explicitly granted. Also, external users cannot create projects, groups, or personal snippets."
-msgstr "Eksterne brugere kan ikke se interne eller private projekter, medmindre der aktivt gives adgang. Desuden kan eksterne brugere ikke oprette projekter, grupper eller personlige uddrag."
+msgstr "Eksterne brugere kan ikke se interne eller private projekter, medmindre der aktivt gives adgang. Desuden kan eksterne brugere ikke oprette projekter, grupper eller personlige udklip."
msgid "AdminUsers|For more information, please refer to the %{link_start}user account deletion documentation.%{link_end}"
-msgstr ""
+msgstr "Se venligst %{link_start}dokumentationen for sletning af bruger%{link_end} for mere information."
msgid "AdminUsers|Here are some helpful links to help you manage your instance:"
-msgstr ""
+msgstr "Her er nogle nyttige links til at hjælpe dig med at håndtere din instans:"
msgid "AdminUsers|If you have any questions about this process please consult our %{doc_link} or %{support_link}."
-msgstr ""
+msgstr "Hvis du har spørgsmål om processen, så se venligst vores %{doc_link} eller %{support_link}."
msgid "AdminUsers|Important information about usage on your GitLab instance"
msgstr "Vigtig information om forbrug på din GitLab-instans"
msgid "AdminUsers|Is using seat"
-msgstr ""
+msgstr "Bruger sæde"
msgid "AdminUsers|Issues authored by this user are hidden from other users."
-msgstr ""
+msgstr "Problemstillinger som er forfattet af brugeren skjules fra andre brugere."
msgid "AdminUsers|It's you!"
msgstr "Det er dig!"
@@ -2665,7 +2697,7 @@ msgid "AdminUsers|No users found"
msgstr "Ingen brugere fundet"
msgid "AdminUsers|Owned groups will be left"
-msgstr ""
+msgstr "Ejede grupper vil være tilbage"
msgid "AdminUsers|Pending approval"
msgstr "Afventer godkendelse"
@@ -2674,7 +2706,7 @@ msgid "AdminUsers|Personal projects will be left"
msgstr "Personlige projekter efterlades"
msgid "AdminUsers|Personal projects, group and user history will be left intact"
-msgstr "Personlige projekter, grupper og brugerhistorik efterlades intakte."
+msgstr "Personlige projekter, grupper og brugerhistorik efterlades intakte"
msgid "AdminUsers|Reactivating a user will:"
msgstr "Genaktivering af en bruger vil:"
@@ -2710,10 +2742,10 @@ msgid "AdminUsers|Sort by"
msgstr "Sortér efter"
msgid "AdminUsers|The user can't access git repositories."
-msgstr ""
+msgstr "Brugeren kan ikke tilgå git-depoter."
msgid "AdminUsers|The user can't log in."
-msgstr ""
+msgstr "Brugeren kan ikke logge ind."
msgid "AdminUsers|The user will be logged out"
msgstr "Brugeren logges ud"
@@ -2737,16 +2769,16 @@ msgid "AdminUsers|To confirm, type %{username}"
msgstr "Skriv %{username} for at bekræfte"
msgid "AdminUsers|Unban user"
-msgstr ""
+msgstr "Fjern udelukkelse af bruger"
msgid "AdminUsers|Unban user %{username}?"
-msgstr ""
+msgstr "Fjern udelukkelse af brugeren %{username}?"
msgid "AdminUsers|Unblock"
-msgstr ""
+msgstr "Fjern blokering"
msgid "AdminUsers|Unblock user %{username}?"
-msgstr ""
+msgstr "Fjern blokering af brugeren %{username}?"
msgid "AdminUsers|Unlock user %{username}?"
msgstr "Oplås brugeren %{username}?"
@@ -2755,7 +2787,7 @@ msgid "AdminUsers|User administration"
msgstr "Brugeradministration"
msgid "AdminUsers|User is validated and can use free CI minutes on shared runners."
-msgstr ""
+msgstr "Brugeren er valideret og kan bruge gratis CI-minutter på delte runnere."
msgid "AdminUsers|User will not be able to access git repositories"
msgstr "Brugeren vil ikke være i stand til at tilgå git-depoter"
@@ -2770,13 +2802,13 @@ msgid "AdminUsers|Users can still be invited to your instance and/or add themsel
msgstr ""
msgid "AdminUsers|Validate user account"
-msgstr ""
+msgstr "Validér brugerkonto"
msgid "AdminUsers|View pending member requests"
msgstr "Vis afventende medlemsanmodninger"
msgid "AdminUsers|What can I do?"
-msgstr ""
+msgstr "Hvad kan jeg gøre?"
msgid "AdminUsers|What does this mean?"
msgstr "Hvad betyder det?"
@@ -2794,10 +2826,10 @@ msgid "AdminUsers|Without projects"
msgstr "Uden projekter"
msgid "AdminUsers|You are about to permanently delete the user %{username}. Issues, merge requests, and groups linked to them will be transferred to a system-wide \"Ghost-user\". To avoid data loss, consider using the %{strongStart}block user%{strongEnd} feature instead. Once you %{strongStart}Delete user%{strongEnd}, it cannot be undone or recovered."
-msgstr ""
+msgstr "Du er ved at slette brugeren %{username} permanent. Problemstillinger, sammenlægningsanmodninger og grupper som er linket til dem vil blive overført til en systembred \"spøgelsesbruger\". Overvej i stedet at bruge funktionen %{strongStart}blokér bruger%{strongEnd} for at forhindre tab af data. Når du %{strongStart}sletter brugeren%{strongEnd}, så kan det ikke fortrydes eller gendannes."
msgid "AdminUsers|You are about to permanently delete the user %{username}. This will delete all of the issues, merge requests, and groups linked to them. To avoid data loss, consider using the %{strongStart}block user%{strongEnd} feature instead. Once you %{strongStart}Delete user%{strongEnd}, it cannot be undone or recovered."
-msgstr ""
+msgstr "Du er ved at slette brugeren %{username} permanent. Det vil slette alle de problemstillinger, sammenlægningsanmodninger og grupper som er linket til dem. Overvej i stedet at bruge funktionen %{strongStart}blokér bruger%{strongEnd} for at forhindre tab af data. Når du har %{strongStart}slettet brugeren%{strongEnd}, så kan det ikke fortrydes eller gendannes."
msgid "AdminUsers|You can always block their account again if needed."
msgstr "Du kan altid blokere deres konto igen hvis det bliver nødvendigt."
@@ -2809,13 +2841,13 @@ msgid "AdminUsers|You can always re-activate their account, their data will rema
msgstr "Du kan altid genaktivere deres konto. Deres data forbliver intakte."
msgid "AdminUsers|You can always unblock their account, their data will remain intact."
-msgstr "Du kan altid afblokere deres konto. Deres data forbliver intakte."
+msgstr "Du kan altid fjerne blokering af deres konto. Deres data forbliver intakte."
msgid "AdminUsers|You can ban their account in the future if necessary."
msgstr "Du kan udelukke deres konto i fremtiden hvis det bliver nødvendigt."
msgid "AdminUsers|You can unban their account in the future. Their data remains intact."
-msgstr ""
+msgstr "Du kan fjerne udelukkelse af deres konto i fremtiden. Deres data forbliver intakte."
msgid "AdminUsers|You cannot remove your own admin rights."
msgstr "Du kan ikke fjerne dine egne administratorrettigheder."
@@ -2824,7 +2856,7 @@ msgid "AdminUsers|You must transfer ownership or delete the groups owned by this
msgstr "Du skal overføre ejerskab eller slette de grupper som ejes af brugeren inden du kan slette dens konto"
msgid "AdminUsers|Your GitLab instance has reached the maximum allowed %{user_doc_link} set by an instance admin."
-msgstr ""
+msgstr "Din GitLab-instans har nået sin højeste tilladte %{user_doc_link} som indstillet af en instansadministrator."
msgid "AdminUsers|approve them"
msgstr "godkend dem"
@@ -2842,7 +2874,7 @@ msgid "Administration"
msgstr "Administration"
msgid "Admin|Additional users must be reviewed and approved by a system administrator. Learn more about %{help_link_start}usage caps%{help_link_end}."
-msgstr ""
+msgstr "Yderligere brugere skal kontrolleres og godkendes af en systemadministrator. Lær mere om %{help_link_start}forbrugsloft%{help_link_end}."
msgid "Admin|Admin notes"
msgstr "Administratorbemærkninger"
@@ -2856,10 +2888,10 @@ msgstr "Bemærkning"
msgid "Admin|Quarterly reconciliation will occur on %{qrtlyDate}"
msgstr ""
-msgid "Admin|The number of max seats used for your namespace is currently exceeding the number of seats in your subscription. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgid "Admin|The number of max seats in your namespace exceeds the number of seats in your subscription. On %{qrtlyDate}, quarterly reconciliation occurs and you are automatically billed a prorated amount for the overage. No action is needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice. For more information about the timing of the invoicing process, view the documentation."
msgstr ""
-msgid "Admin|The number of maximum users for your instance is currently exceeding the number of users in license. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgid "Admin|The number of max users in your instance exceeds the number of users in your license. On %{qrtlyDate}, quarterly reconciliation occurs and you are automatically billed a prorated amount for the overage. No action is needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice. For more information about the timing of the invoicing process, view the documentation."
msgstr ""
msgid "Admin|View pending user approvals"
@@ -2880,61 +2912,59 @@ msgstr "Avancerede indstillinger"
msgid "Advanced export options"
msgstr ""
-msgid "Advanced permissions, Large File Storage and Two-Factor authentication settings."
-msgstr ""
-
msgid "After a successful password update you will be redirected to login screen."
-msgstr ""
+msgstr "Efter en adgangskodeopdatering vil du blive omdirigeret til indlogningsskærmen."
msgid "After a successful password update, you will be redirected to the login page where you can log in with your new password."
-msgstr ""
+msgstr "Efter en adgangskodeopdatering vil du blive omdirigeret til indlogningsskærmen hvor du kan logge ind med din nye adgangskode."
msgid "After that, you will not be able to use merge approvals or code quality as well as many other features."
-msgstr ""
+msgstr "Herefter vil du ikke være i stand til at bruge sammenlægningsgodkendelser eller kodekvalitet samt mange andre funktioner."
msgid "After that, you will not be able to use merge approvals or epics as well as many other features."
-msgstr ""
+msgstr "Herefter vil du ikke være i stand til at bruge sammenlægningsgodkendelser eller epics samt mange andre funktioner."
msgid "After that, you will not be able to use merge approvals or epics as well as many security features."
-msgstr ""
+msgstr "Herefter vil du ikke være i stand til at bruge sammenlægningsgodkendelser eller epics samt mange sikkerhedsfunktioner."
msgid "After you've reviewed these contribution guidelines, you'll be all set to"
msgstr ""
+msgid "Akismet"
+msgstr ""
+
msgid "Akismet API Key"
msgstr "Akismet API-nøgle"
-msgid "Alert"
-msgid_plural "Alerts"
-msgstr[0] ""
-msgstr[1] ""
+msgid "Akismet helps prevent the creation of spam issues in public projects."
+msgstr ""
msgid "AlertManagement|Acknowledged"
-msgstr ""
+msgstr "Tilkendegivet"
msgid "AlertManagement|Activity feed"
-msgstr ""
+msgstr "Aktivitetsfeed"
msgid "AlertManagement|Alert"
-msgstr ""
+msgstr "Alertbesked"
msgid "AlertManagement|Alert assignee(s): %{assignees}"
msgstr ""
msgid "AlertManagement|Alert detail"
-msgstr ""
+msgstr "Alertbeskeddetalje"
msgid "AlertManagement|Alert details"
-msgstr ""
+msgstr "Alertbeskeddetaljer"
msgid "AlertManagement|Alert status: %{status}"
-msgstr ""
+msgstr "Alertbeskedstatus: %{status}"
msgid "AlertManagement|Alerts"
-msgstr ""
+msgstr "Alertbeskeder"
msgid "AlertManagement|All alerts"
-msgstr ""
+msgstr "Alle alertbeskeder"
msgid "AlertManagement|Assign status"
msgstr "Tildel status"
@@ -2976,16 +3006,16 @@ msgid "AlertManagement|More information"
msgstr "Mere information"
msgid "AlertManagement|No alert data to display."
-msgstr ""
+msgstr "Ingen alertbeskeddata at vise."
msgid "AlertManagement|No alerts available to display. See %{linkStart}enabling alert management%{linkEnd} for more information on adding alerts to the list."
msgstr ""
msgid "AlertManagement|No alerts to display."
-msgstr ""
+msgstr "Ingen alertbeskeder at vise."
msgid "AlertManagement|None"
-msgstr ""
+msgstr "Ingen"
msgid "AlertManagement|Open"
msgstr ""
@@ -3003,7 +3033,7 @@ msgid "AlertManagement|Resolved"
msgstr "Løst"
msgid "AlertManagement|Runbook"
-msgstr ""
+msgstr "Runbook"
msgid "AlertManagement|Service"
msgstr "Tjeneste"
@@ -3018,28 +3048,28 @@ msgid "AlertManagement|Status"
msgstr "Status"
msgid "AlertManagement|Surface alerts in GitLab"
-msgstr ""
+msgstr "Fremfind alertbeskeder i GitLab"
msgid "AlertManagement|There was an error displaying the alert. Please refresh the page to try again."
-msgstr ""
+msgstr "Der opstod en fejl ved visning af alertbeskeden. Opdater venligst siden for at prøve igen."
msgid "AlertManagement|There was an error displaying the alerts. Confirm your endpoint's configuration details to ensure alerts appear."
-msgstr ""
+msgstr "Der opstod en fejl ved visning af alertbeskederne. Bekræft dit slutpunkts konfigurationsdetaljer for at sikre at alertbeskederne vises."
msgid "AlertManagement|There was an error while updating the assignee(s) list. Please try again."
-msgstr ""
+msgstr "Der opstod en fejl ved opdatering af tildelerlisten. Prøv venligst igen."
msgid "AlertManagement|There was an error while updating the assignee(s) of the alert. Please try again."
-msgstr ""
+msgstr "Der opstod en fejl ved opdatering af alertbeskedens tildelere. Prøv venligst igen."
msgid "AlertManagement|There was an error while updating the status of the alert."
-msgstr ""
+msgstr "Der opstod en fejl ved opdatering af alertbeskedens status."
msgid "AlertManagement|There was an error while updating the to-do item of the alert."
-msgstr ""
+msgstr "Der opstod en fejl ved opdatering af alertbeskedens gøremålselement."
msgid "AlertManagement|This assignee cannot be assigned to this alert."
-msgstr ""
+msgstr "Tildeleren kan ikke tildeles til alertbeskeden."
msgid "AlertManagement|Tool"
msgstr "Værktøj"
@@ -3060,7 +3090,7 @@ msgid "AlertMappingBuilder|GitLab alert key"
msgstr ""
msgid "AlertMappingBuilder|Make selection"
-msgstr ""
+msgstr "Foretag markering"
msgid "AlertMappingBuilder|Payload alert key"
msgstr ""
@@ -3078,7 +3108,7 @@ msgid "AlertSettings|Add new integration"
msgstr "Tilføj ny integrering"
msgid "AlertSettings|Alert settings"
-msgstr ""
+msgstr "Alertbeskedindstillinger"
msgid "AlertSettings|Authorization key"
msgstr "Godkendelsesnøgle"
@@ -3111,13 +3141,13 @@ msgid "AlertSettings|Enter integration name"
msgstr "Indtast integreringsnavn"
msgid "AlertSettings|Free versions of GitLab are limited to one integration per type. To add more, %{linkStart}upgrade your subscription%{linkEnd}."
-msgstr ""
+msgstr "Gratis versioner af GitLab er begrænset til én integrering pr. type. %{linkStart}Opgrader dit abonnement%{linkEnd} for at tilføje flere."
msgid "AlertSettings|GitLab has created a URL and authorization key for your integration. You can use them to set up a webhook and authorize your endpoint to send alerts to GitLab."
msgstr ""
msgid "AlertSettings|HTTP Endpoint"
-msgstr ""
+msgstr "HTTP-slutpunkt"
msgid "AlertSettings|If you edit the payload, you must re-map the fields again."
msgstr ""
@@ -3126,7 +3156,7 @@ msgid "AlertSettings|If you reset the authorization key for this project, you mu
msgstr ""
msgid "AlertSettings|Integration successfully saved"
-msgstr ""
+msgstr "Integrering gemt"
msgid "AlertSettings|Name integration"
msgstr ""
@@ -3141,7 +3171,7 @@ msgid "AlertSettings|Prometheus"
msgstr "Prometheus"
msgid "AlertSettings|Prometheus API base URL"
-msgstr ""
+msgstr "Grund-URL for Prometheus API"
msgid "AlertSettings|Reset Key"
msgstr "Nulstil nøgle"
@@ -3153,7 +3183,7 @@ msgid "AlertSettings|Sample payload has been parsed. You can now map the fields.
msgstr ""
msgid "AlertSettings|Save & create test alert"
-msgstr ""
+msgstr "Gem og opret testalertbesked"
msgid "AlertSettings|Save integration"
msgstr "Gem integrering"
@@ -3165,7 +3195,7 @@ msgid "AlertSettings|Select integration type"
msgstr "Vælg integreringstype"
msgid "AlertSettings|Send test alert"
-msgstr ""
+msgstr "Send testalertbesked"
msgid "AlertSettings|Send without saving"
msgstr "Send uden at gemme"
@@ -3180,7 +3210,7 @@ msgid "AlertSettings|To create a custom mapping, enter an example payload from y
msgstr ""
msgid "AlertSettings|URL cannot be blank and must start with http: or https:."
-msgstr ""
+msgstr "URL'en må ikke være tom og skal begynde med http: eller https:."
msgid "AlertSettings|Use the URL and authorization key below to configure how Prometheus sends alerts to GitLab. Review the %{linkStart}GitLab documentation%{linkEnd} to learn how to configure your endpoint."
msgstr ""
@@ -3189,13 +3219,13 @@ msgid "AlertSettings|Use the URL and authorization key below to configure how an
msgstr ""
msgid "AlertSettings|View URL and authorization key"
-msgstr ""
+msgstr "Vis URL og godkendelsesnøgle"
msgid "AlertSettings|View credentials"
msgstr "Vis loginoplysninger"
msgid "AlertSettings|Webhook URL"
-msgstr ""
+msgstr "Webhook-URL"
msgid "AlertSettings|You can map default GitLab alert fields to your payload keys in the dropdowns below."
msgstr ""
@@ -3204,52 +3234,52 @@ msgid "AlertSettings|You can now set up alert endpoints for manually configured
msgstr ""
msgid "AlertSettings|{ \"events\": [{ \"application\": \"Name of application\" }] }"
-msgstr ""
+msgstr "{ \"events\": [{ \"application\": \"Navn på program\" }] }"
msgid "Alerts"
-msgstr ""
+msgstr "Alertbeskeder"
msgid "AlertsIntegrations|Alerts will be created through this integration"
-msgstr ""
+msgstr "Alertbeskeder vil blive oprettet gennem integreringen"
msgid "AlertsIntegrations|Alerts will not be created through this integration"
-msgstr ""
+msgstr "Alertbeskeder vil ikke blive oprettet gennem integreringen"
msgid "AlertsIntegrations|If you delete the %{integrationName} integration, alerts are no longer sent from this endpoint. This action cannot be undone."
-msgstr ""
+msgstr "Hvis du sletter integreringen %{integrationName}, så sendes der ikke længere alertbeskeder fra slutpunktet. Handlingen kan ikke fortrydes."
msgid "AlertsIntegrations|Integration Name"
-msgstr ""
+msgstr "Integreringsnavn"
msgid "AlertsIntegrations|Integration payload is invalid."
msgstr ""
msgid "AlertsIntegrations|No integrations have been added yet."
-msgstr ""
+msgstr "Ingen integreringer er blevet tilføjet endnu."
msgid "AlertsIntegrations|The current integration could not be updated. Please try again."
-msgstr ""
+msgstr "Den nuværende integrering kunne ikke opdateres. Prøv venligst igen."
msgid "AlertsIntegrations|The integration could not be added. Please try again."
-msgstr ""
+msgstr "Integreringen kunne ikke tilføjes. Prøv venligst igen."
msgid "AlertsIntegrations|The integration could not be deleted. Please try again."
-msgstr ""
+msgstr "Integreringen kunne ikke slettes. Prøv venligst igen."
msgid "AlertsIntegrations|The integration is currently inactive. Enable the integration to send the test alert."
-msgstr ""
+msgstr "Integreringen er inaktiv i øjeblikket. Aktivér integreringen for at sende testalertbeskeden."
msgid "AlertsIntegrations|The integration is deleted."
-msgstr ""
+msgstr "Integreringen er slettet."
msgid "AlertsIntegrations|The integration is saved."
-msgstr ""
+msgstr "Integreringen er gemt."
msgid "AlertsIntegrations|The integration token could not be reset. Please try again."
-msgstr ""
+msgstr "Integreringstokenen kunne ikke nulstilles. Prøv venligst igen."
msgid "AlertsIntegrations|The test alert should now be visible in your alerts list."
-msgstr ""
+msgstr "Testalertbeskeden burde nu være synlig i din beskedliste."
msgid "Algorithm"
msgstr "Algoritme"
@@ -3258,11 +3288,14 @@ msgid "All"
msgstr "Alle"
msgid "All %{replicableType} are being scheduled for %{action}"
-msgstr ""
+msgstr "Alle %{replicableType} er ved at blive planlagt for %{action}"
msgid "All (default)"
msgstr "Alle (standard)"
+msgid "All GitLab"
+msgstr ""
+
msgid "All Members"
msgstr "Alle medlemmer"
@@ -3273,7 +3306,7 @@ msgid "All changes are committed"
msgstr "Alle ændringer er committed"
msgid "All email addresses will be used to identify your commits."
-msgstr ""
+msgstr "Alle e-mailadresser vil blive brugt til at identificere dine commits."
msgid "All environments"
msgstr "Alle miljøer"
@@ -3285,16 +3318,16 @@ msgid "All groups and projects"
msgstr "Alle grupper og projekter"
msgid "All issues for this milestone are closed."
-msgstr ""
+msgstr "Alle problemstillinger for milepælen er lukket."
msgid "All issues for this milestone are closed. You may close this milestone now."
msgstr "Alle problemstillinger for milepælen er lukket. Du kan nu lukke milepælen."
msgid "All merge conflicts were resolved. The merge request can now be merged."
-msgstr ""
+msgstr "Alle sammenlægningskonflikter blev løst. Sammenlægningsanmodningen kan nu sammenlægges."
msgid "All merge request dependencies have been merged"
-msgstr ""
+msgstr "Alle sammenlægningsanmodningsafhængigheder er blevet sammenlagt"
msgid "All paths are relative to the GitLab URL. Do not include %{relative_url_link_start}relative URL%{relative_url_link_end}."
msgstr ""
@@ -3309,7 +3342,7 @@ msgid "All threads resolved"
msgstr "Alle tråde løst"
msgid "All users must accept the Terms of Service and Privacy Policy to access GitLab"
-msgstr ""
+msgstr "Alle brugere skal acceptere vilkår for tjeneste og privatlivspolitik for at tilgå GitLab"
msgid "All users must have a name."
msgstr "Alle brugere skal have et navn."
@@ -3318,58 +3351,58 @@ msgid "Allow \"%{group_name}\" to sign you in"
msgstr "Tillad \"%{group_name}\" at logge dig ind"
msgid "Allow access to members of the following group"
-msgstr ""
+msgstr "Tillad adgang for medlemmer af følgende gruppe"
msgid "Allow access to the following IP addresses"
-msgstr ""
+msgstr "Tillad adgang for følgende IP-adresser"
msgid "Allow commits from members who can merge to the target branch."
msgstr "Tillad commits fra medlemmer, som kan sammenlægge til målgrenen."
msgid "Allow group owners to manage LDAP-related settings"
-msgstr ""
+msgstr "Tillad gruppeejere at håndtere LDAP-relaterede indstillinger"
msgid "Allow non-administrators to access to the performance bar"
-msgstr ""
+msgstr "Tillad ikke-administratorer at få adgang til ydelseslinjen"
msgid "Allow only the selected protocols to be used for Git access."
-msgstr ""
+msgstr "Tillad kun at de valgte protokoller bruges til Git-adgang."
msgid "Allow owners to manage default branch protection per group"
-msgstr ""
+msgstr "Tillad ejere at håndtere beskyttelse af standardgren pr. gruppe"
msgid "Allow owners to manually add users outside of LDAP"
-msgstr ""
+msgstr "Tillad ejere at tilføje brugere uden for LDAP manuelt"
msgid "Allow password authentication for Git over HTTP(S)"
-msgstr ""
+msgstr "Tillad adgangskodegodkendelse for Git over HTTP(S)"
msgid "Allow password authentication for the web interface"
-msgstr ""
+msgstr "Tillad adgangskodegodkendelse for webgrænsefladen"
msgid "Allow project maintainers to configure repository mirroring"
msgstr ""
msgid "Allow projects and subgroups to override the group setting"
-msgstr ""
+msgstr "Tillad projekter og undergrupper at tilsidesætte gruppeindstillingen"
msgid "Allow projects within this group to use Git LFS"
msgstr "Tillad projekter i gruppen at bruge Git LFS"
msgid "Allow public access to pipelines and job details, including output logs and artifacts."
-msgstr ""
+msgstr "Tillad offentlig adgang til pipelines og jobdetaljer, herunder outputlogge og artefakter."
msgid "Allow requests to the local network from hooks and services."
-msgstr ""
+msgstr "Tillad anmodninger til det lokale netværk fra hooks og tjenester."
msgid "Allow requests to the local network from system hooks"
-msgstr ""
+msgstr "Tillad anmodninger til det lokale netværk fra systemhooks"
msgid "Allow requests to the local network from web hooks and services"
-msgstr ""
+msgstr "Tillad anmodninger til det lokale netværk fra webhooks og tjenester"
msgid "Allow subgroups to set up their own two-factor authentication rules"
-msgstr ""
+msgstr "Tillad undergrupper at indstille deres egne regler for totrinsgodkendelse"
msgid "Allow this key to push to this repository"
msgstr ""
@@ -3377,9 +3410,12 @@ msgstr ""
msgid "Allow this secondary node to replicate content on Object Storage"
msgstr ""
-msgid "Allow users to dismiss the broadcast message"
+msgid "Allow use of licensed EE features"
msgstr ""
+msgid "Allow users to dismiss the broadcast message"
+msgstr "Tillad brugere at afskedig broadcastmeddelelsen"
+
msgid "Allow users to register any application to use GitLab as an OAuth provider"
msgstr ""
@@ -3399,16 +3435,16 @@ msgid "Allowed email domain restriction only permitted for top-level groups"
msgstr ""
msgid "Allowed to create:"
-msgstr ""
+msgstr "MÃ¥ oprette:"
msgid "Allowed to fail"
-msgstr ""
+msgstr "MÃ¥ mislykkes"
msgid "Allows projects or subgroups in this group to override the global setting."
-msgstr ""
+msgstr "Tillader projekter eller undergrupper i gruppen at tilsidesætte den globale indstilling."
msgid "Allows you to add and manage Kubernetes clusters."
-msgstr ""
+msgstr "Tillader dig at tilføje eller håndtere Kubernetes-klynger."
msgid "Almost there"
msgstr "Du er der næsten"
@@ -3429,16 +3465,16 @@ msgid "Also called \"Relying party service URL\" or \"Reply URL\""
msgstr ""
msgid "Also remove direct user membership from subgroups and projects"
-msgstr ""
+msgstr "Fjern også direkte brugermedlemskab fra undergrupper og projekter"
msgid "Also unassign this user from related issues and merge requests"
msgstr ""
msgid "Alternate support URL for Help page and Help dropdown."
-msgstr ""
+msgstr "Alternativ support-URL til hjælpeside og hjælperullegardin."
msgid "Alternatively, you can convert your account to a managed account by the %{group_name} group."
-msgstr ""
+msgstr "Alternativt kan du konvertere din konto til en håndteret konto af gruppen %{group_name}."
msgid "Amazon EKS"
msgstr "Amazon EKS"
@@ -3452,9 +3488,6 @@ msgstr ""
msgid "Amazon authentication is not %{link_start}correctly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
-msgid "Amount of time (in hours) that users are allowed to skip forced configuration of two-factor authentication"
-msgstr ""
-
msgid "An %{link_start}alert%{link_end} with the same fingerprint is already open. To change the status of this alert, resolve the linked alert."
msgstr ""
@@ -3462,19 +3495,19 @@ msgid "An Enterprise User GitLab account has been created for you by your organi
msgstr ""
msgid "An administrator changed the password for your GitLab account on %{link_to}."
-msgstr ""
+msgstr "En administrator ændrede adgangskoden for din GitLab-konto på %{link_to}."
msgid "An alert has been resolved in %{project_path}."
-msgstr ""
+msgstr "En alertbesked er blevet løst i %{project_path}."
msgid "An alert has been triggered in %{project_path}."
-msgstr ""
+msgstr "En alertbesked er blevet udløst i %{project_path}."
msgid "An application called %{link_to_client} is requesting access to your GitLab account."
msgstr "Et program kaldet %{link_to_client} anmoder om adgang til din GitLab-konto."
msgid "An email notification was recently sent from the admin panel. Please wait %{wait_time_in_words} before attempting to send another message."
-msgstr ""
+msgstr "En e-mail-underretning blev for nyligt sendt fra administratorpanelet. Vent venligst %{wait_time_in_words} inden der prøves på at sende en ny besked."
msgid "An empty GitLab User field will add the FogBugz user's full name (e.g. \"By John Smith\") in the description of all issues and comments. It will also associate and/or assign these issues and comments with the project creator."
msgstr "Et tomt GitLab-brugerfelt tilføjer FogBugz-brugerens fulde navn (f.eks. \"Af Ronni Ræv\") i beskrivelsen på alle problemstillinger og kommentarer. Det vil også tilknytte og/eller tildele problemstillingerne og kommentarerne med projektopretteren."
@@ -3483,7 +3516,7 @@ msgid "An empty index will be created if one does not already exist"
msgstr "Der oprettes et tomt indeks hvis der ikke allerede findes et"
msgid "An error has occurred"
-msgstr "Der opstod en fejl"
+msgstr "Der er opstået en fejl"
msgid "An error in reporting in which a test result incorrectly indicates the presence of a vulnerability in a system when the vulnerability is not present."
msgstr ""
@@ -3507,7 +3540,7 @@ msgid "An error occurred fetching the dropdown data."
msgstr "Der opstod en fejl ved hentning af rullegardinsdataene."
msgid "An error occurred fetching the project authors."
-msgstr ""
+msgstr "Der opstod en fejl ved hentning af projektforfattere."
msgid "An error occurred previewing the blob"
msgstr "Der opstod en fejl ved forhåndsvisning af blob'en"
@@ -3515,12 +3548,6 @@ msgstr "Der opstod en fejl ved forhåndsvisning af blob'en"
msgid "An error occurred when removing the label."
msgstr "Der opstod en fejl ved fjernelse af etiketten."
-msgid "An error occurred when toggling the notification subscription"
-msgstr ""
-
-msgid "An error occurred when updating the issue weight"
-msgstr "Der opstod en fejl ved opdatering af problemstillingsvægten"
-
msgid "An error occurred when updating the title"
msgstr "Der opstod en fejl ved opdatering af titlen"
@@ -3555,7 +3582,7 @@ msgid "An error occurred while detecting host keys"
msgstr "Der opstod en fejl under registrering af værtsnøgler"
msgid "An error occurred while disabling Service Desk."
-msgstr "Der opstod en fejl under deaktivering af Service Desk."
+msgstr "Der opstod en fejl under deaktivering af serviceskranke."
msgid "An error occurred while dismissing the alert. Refresh the page and try again."
msgstr "Der opstod en fejl under afskedigelse af advarslen. Opdater siden og prøv igen."
@@ -3564,19 +3591,22 @@ msgid "An error occurred while dismissing the feature highlight. Refresh the pag
msgstr "Der opstod en fejl under afskedigelse af funktionen fremhævning. Opdater siden og prøv at afskedige igen."
msgid "An error occurred while drawing job relationship links."
-msgstr ""
+msgstr "Der opstod en fejl under tegning af jobrelationslinks."
msgid "An error occurred while enabling Service Desk."
-msgstr "Der opstod en fejl under aktivering af Service Desk."
+msgstr "Der opstod en fejl under aktivering af serviceskranke."
-msgid "An error occurred while fetching ancestors"
+msgid "An error occurred while fetching Markdown preview"
msgstr ""
+msgid "An error occurred while fetching ancestors"
+msgstr "Der opstod en fejl under hentning af forfædre"
+
msgid "An error occurred while fetching branches. Retry the search."
msgstr "Der opstod en fejl under hentning af grene. Prøv søgningen igen."
msgid "An error occurred while fetching codequality mr diff reports."
-msgstr ""
+msgstr "Der opstod en fejl under hentning af kodekvalitets mr diff-rapporter."
msgid "An error occurred while fetching commits. Retry the search."
msgstr "Der opstod en fejl under hentning af commits. Prøv søgningen igen."
@@ -3588,7 +3618,7 @@ msgid "An error occurred while fetching environments."
msgstr "Der opstod en fejl under hentning af miljøer."
msgid "An error occurred while fetching exposed artifacts."
-msgstr ""
+msgstr "Der opstod en fejl under hentning af viste artefakter."
msgid "An error occurred while fetching folder content."
msgstr "Der opstod en fejl under hentning af mappeindhold."
@@ -3599,9 +3629,6 @@ msgstr "Der opstod en fejl under hentning af problemstillinger."
msgid "An error occurred while fetching label colors."
msgstr "Der opstod en fejl under hentning af etiketfarver."
-msgid "An error occurred while fetching markdown preview"
-msgstr "Der opstod en fejl under hentning af markdown-forhåndsvisning"
-
msgid "An error occurred while fetching participants"
msgstr "Der opstod en fejl under hentning af deltagere"
@@ -3612,19 +3639,16 @@ msgid "An error occurred while fetching pending comments"
msgstr "Der opstod en fejl under hentning af afventende kommentarer"
msgid "An error occurred while fetching projects autocomplete."
-msgstr ""
+msgstr "Der opstod en fejl under hentning af projekternes autofuldfør."
msgid "An error occurred while fetching reference"
msgstr "Der opstod en fejl under hentning af reference"
-msgid "An error occurred while fetching sidebar data"
-msgstr "Der opstod en fejl under hentning af sidebjælkedata"
-
msgid "An error occurred while fetching tags. Retry the search."
msgstr "Der opstod en fejl under hentning af mærkater. Prøv søgningen igen."
msgid "An error occurred while fetching terraform reports."
-msgstr "Der opstod en fejl under hentning af terraformrapporter."
+msgstr "Der opstod en fejl under hentning af terraform-rapporter."
msgid "An error occurred while fetching the job log."
msgstr "Der opstod en fejl under hentning af jobloggen."
@@ -3657,7 +3681,7 @@ msgid "An error occurred while getting files for - %{branchId}"
msgstr "Der opstod en fejl under hentning af filer for - %{branchId}"
msgid "An error occurred while getting issue counts"
-msgstr ""
+msgstr "Der opstod en fejl under hentning af problemstillingstællinger"
msgid "An error occurred while getting projects"
msgstr "Der opstod en fejl under hentning af projekter"
@@ -3675,7 +3699,7 @@ msgid "An error occurred while loading chart data"
msgstr "Der opstod en fejl under indlæsning af diagramdata"
msgid "An error occurred while loading commit signatures"
-msgstr ""
+msgstr "Der opstod en fejl under indlæsning af commit-underskrifter"
msgid "An error occurred while loading designs. Please try again."
msgstr "Der opstod en fejl under indlæsning af designs. Prøv venligst igen."
@@ -3695,14 +3719,17 @@ msgstr "Der opstod en fejl under indlæsning af problemstillinger"
msgid "An error occurred while loading merge requests."
msgstr "Der opstod en fejl under indlæsning af sammenlægningsanmodninger."
-msgid "An error occurred while loading the Needs tab."
+msgid "An error occurred while loading projects."
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 ""
+msgstr "Der opstod en fejl under indlæsning af fanebladet Testrapporter."
msgid "An error occurred while loading the access tokens form, please try again."
-msgstr "Der opstod en fejl under indlæsning af formularen til adgangstokens, prøv venligst igen."
+msgstr "Der opstod en fejl under indlæsning af formularen til adgangstokens. Prøv venligst igen."
msgid "An error occurred while loading the data. Please try again."
msgstr "Der opstod en fejl under indlæsning af dataene. Prøv venligst igen."
@@ -3744,16 +3771,16 @@ msgid "An error occurred while loading your content. Please try again."
msgstr "Der opstod en fejl under indlæsning af dit indhold. Prøv venligst igen."
msgid "An error occurred while making the request."
-msgstr ""
+msgstr "Der opstod en fejl under foretagelse af anmodningen."
msgid "An error occurred while moving the issue."
msgstr "Der opstod en fejl under flytning af problemstillingen."
msgid "An error occurred while parsing recent searches"
-msgstr ""
+msgstr "Der opstod en fejl under fortolkning af seneste søgninger"
msgid "An error occurred while parsing the file."
-msgstr ""
+msgstr "Der opstod en fejl under fortolkning af filen."
msgid "An error occurred while removing epics."
msgstr "Der opstod en fejl under fjernelse af epics."
@@ -3762,7 +3789,7 @@ msgid "An error occurred while removing issues."
msgstr "Der opstod en fejl under fjernelse af problemstillinger."
msgid "An error occurred while rendering preview broadcast message"
-msgstr ""
+msgstr "Der opstod en fejl under gengivelse af forhåndsvisning af broadcastmeddelelse"
msgid "An error occurred while rendering the editor"
msgstr "Der opstod en fejl under gengivelse af editoren"
@@ -3786,7 +3813,7 @@ msgid "An error occurred while saving changes: %{error}"
msgstr "Der opstod en fejl under gemning af ændringer: %{error}"
msgid "An error occurred while subscribing to notifications."
-msgstr ""
+msgstr "Der opstod en fejl under abonnering på underretninger."
msgid "An error occurred while triggering the job."
msgstr "Der opstod en fejl under udløsning af jobbet."
@@ -3798,7 +3825,7 @@ msgid "An error occurred while trying to run a new pipeline for this merge reque
msgstr "Der opstod en fejl under forsøg på at køre en ny pipeline til sammenlægningsanmodningen."
msgid "An error occurred while unsubscribing to notifications."
-msgstr ""
+msgstr "Der opstod en fejl under fjernelse af abonnering på underretninger."
msgid "An error occurred while updating approvers"
msgstr "Der opstod en fejl under opdatering af godkendere"
@@ -3828,7 +3855,7 @@ msgid "An error occurred while uploading the image. Please try again."
msgstr "Der opstod en fejl under upload af billedet. Prøv venligst igen."
msgid "An error occurred while validating group path"
-msgstr ""
+msgstr "Der opstod en fejl under validering af gruppesti"
msgid "An error occurred while validating username"
msgstr "Der opstod en fejl under validering af brugernavn"
@@ -3849,7 +3876,7 @@ msgid "An example showing how to use Jsonnet with GitLab dynamic child pipelines
msgstr ""
msgid "An instance-level serverless domain already exists."
-msgstr ""
+msgstr "Et serverfrit domæne på instansniveau findes allerede."
msgid "An issue already exists"
msgstr "Der findes allerede en problemstilling"
@@ -3861,19 +3888,19 @@ msgid "An unexpected error occurred while checking the project environment."
msgstr "Der opstod en uventet fejl under tjek af projektmiljøet."
msgid "An unexpected error occurred while checking the project runners."
-msgstr ""
+msgstr "Der opstod en uventet fejl under tjek af projektrunnerne."
msgid "An unexpected error occurred while communicating with the Web Terminal."
-msgstr "Der opstod en uventet fejl under kommunikation med Web Terminal."
+msgstr "Der opstod en uventet fejl under kommunikation med webterminal."
msgid "An unexpected error occurred while loading the code quality diff."
-msgstr ""
+msgstr "Der opstod en uventet fejl under indlæsning af kodekvalitets diff'en."
msgid "An unexpected error occurred while starting the Web Terminal."
-msgstr "Der opstod en uventet fejl under start af Web Terminal."
+msgstr "Der opstod en uventet fejl under start af webterminal."
msgid "An unexpected error occurred while stopping the Web Terminal."
-msgstr "Der opstod en uventet fejl under stop af Web Terminal."
+msgstr "Der opstod en uventet fejl under stop af webterminal."
msgid "An unknown error occurred while loading this graph."
msgstr "Der opstod en ukendt fejl under indlæsning af grafen."
@@ -3882,10 +3909,10 @@ msgid "An unknown error occurred."
msgstr "Der opstod en ukendt fejl."
msgid "Analytics"
-msgstr ""
+msgstr "Analyse"
msgid "Analyze a review version of your web application."
-msgstr ""
+msgstr "Analyser en kontrolversion af dit webprogram."
msgid "Analyze your dependencies for known vulnerabilities."
msgstr "Analyser dine afhængigheder for kendte sårbarheder."
@@ -3900,57 +3927,54 @@ msgid "Analyzing file…"
msgstr "Analyserer fil …"
msgid "Ancestors"
-msgstr ""
+msgstr "Forfædre"
msgid "And this registration token:"
-msgstr ""
+msgstr "Og denne registreringstoken:"
msgid "Anonymous"
msgstr "Anonym"
msgid "Another action is currently in progress"
-msgstr ""
+msgstr "En anden handling er i øjeblikket i gang"
msgid "Another issue tracker is already in use. Only one issue tracker service can be active at a time"
-msgstr ""
+msgstr "En anden problemstillingsporing er allerede i brug. Kun én problemstillingsporingstjeneste kan være aktiv ad gangen"
msgid "Anti-spam verification"
-msgstr ""
+msgstr "Bekræftelse af anti-spam"
msgid "Any"
msgstr "Alle"
msgid "Any %{header}"
-msgstr ""
+msgstr "Alle %{header}"
msgid "Any Author"
-msgstr ""
+msgstr "Alle forfattere"
msgid "Any Milestone"
-msgstr ""
-
-msgid "Any branch"
-msgstr ""
-
-msgid "Any eligible user"
-msgstr ""
+msgstr "Alle milepæle"
msgid "Any encrypted tokens"
-msgstr ""
+msgstr "Alle krypterede tokens"
msgid "Any files larger than this limit only index the file name. The file content is neither indexed nor searchable."
msgstr ""
msgid "Any label"
-msgstr ""
+msgstr "Alle etiketter"
msgid "Any member with at least Developer permissions on the project."
-msgstr ""
+msgstr "Alle medlemmer med mindst udviklertilladelser på projektet."
msgid "Any milestone"
-msgstr ""
+msgstr "Alle milepæle"
msgid "Any namespace"
+msgstr "Alle navnerum"
+
+msgid "App Engine description and apps that are suitable for this deployment target"
msgstr ""
msgid "App ID"
@@ -3966,10 +3990,10 @@ msgid "Appearance was successfully updated."
msgstr "Udseende blev opdateret."
msgid "Append the comment with %{shrug}"
-msgstr ""
+msgstr "Tilføj %{shrug} til slutningen af kommentaren"
msgid "Append the comment with %{tableflip}"
-msgstr ""
+msgstr "Tilføj %{tableflip} til slutningen af kommentaren"
msgid "Application"
msgstr "Program"
@@ -3978,22 +4002,22 @@ msgid "Application ID"
msgstr "Program-id"
msgid "Application limits saved successfully"
-msgstr ""
+msgstr "Programgrænser gemt"
msgid "Application settings saved successfully"
-msgstr ""
+msgstr "Programindstillinger gemt"
msgid "Application settings update failed"
-msgstr ""
+msgstr "Opdatering af programindstillinger mislykkedes"
msgid "Application uninstalled but failed to destroy: %{error_message}"
-msgstr ""
+msgstr "Program afinstalleret men kunne ikke ødelægge: %{error_message}"
msgid "Application was successfully destroyed."
-msgstr ""
+msgstr "Programmet blev ødelagt."
msgid "Application was successfully updated."
-msgstr ""
+msgstr "Programmet blev opdateret."
msgid "Application: %{name}"
msgstr "Program: %{name}"
@@ -4018,7 +4042,7 @@ msgstr[0] "Ved at foretage ændringen godkender du automatisk %d bruger med stat
msgstr[1] "Ved at foretage ændringen godkender du automatisk %d brugere med statussen afventer godkendelse."
msgid "ApplicationSettings|Denied domains for sign-ups"
-msgstr ""
+msgstr "Domæner som nægtes ved tilmeldinger"
msgid "ApplicationSettings|Denylist file"
msgstr ""
@@ -4101,6 +4125,11 @@ msgstr "Anvendt"
msgid "Apply"
msgstr "Anvend"
+msgid "Apply %d suggestion"
+msgid_plural "Apply %d suggestions"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Apply a label"
msgstr "Anvend en etiket"
@@ -4110,20 +4139,17 @@ msgstr "Anvend en skabelon"
msgid "Apply suggestion"
msgstr "Anvend forslag"
-msgid "Apply suggestions"
-msgstr "Anvend forslag"
-
msgid "Apply template"
msgstr "Anvend skabelon"
-msgid "Apply this approval rule to any branch or a specific protected branch."
+msgid "Apply this approval rule to all branches or a specific protected branch."
msgstr ""
msgid "Applying"
msgstr "Anvender"
msgid "Applying a template will replace the existing issue description. Any changes you have made will be lost."
-msgstr ""
+msgstr "Anvendelse af en skabelon vil erstatte den eksisterende problemstillingsbeskrivelse. Ændringer du har foretaget vil gå tabt."
msgid "Applying command"
msgstr "Anvender kommando"
@@ -4173,7 +4199,7 @@ msgstr[0] "%{count} godkendelse kræves fra %{membersCount}"
msgstr[1] "%{count} godkendelser kræves fra %{membersCount}"
msgid "ApprovalRule|%{firstLabel} +%{numberOfAdditionalLabels} more"
-msgstr ""
+msgstr "%{firstLabel} +%{numberOfAdditionalLabels} mere"
msgid "ApprovalRule|Add approvers"
msgstr "Tilføj godkendere"
@@ -4182,13 +4208,13 @@ msgid "ApprovalRule|All scanners"
msgstr "Alle skannere"
msgid "ApprovalRule|All severity levels"
-msgstr ""
+msgstr "Alle alvorlighedsniveauer"
msgid "ApprovalRule|Apply this approval rule to consider only the selected security scanners."
-msgstr ""
+msgstr "Anvend godkendelsesreglen til kun at overveje de valgte sikkerhedsskannere."
msgid "ApprovalRule|Apply this approval rule to consider only the selected severity levels."
-msgstr ""
+msgstr "Anvend godkendelsesreglen til kun at overveje de valgte alvorlighedsniveauer."
msgid "ApprovalRule|Approval rules"
msgstr "Godkendelsesregler"
@@ -4218,7 +4244,7 @@ msgid "ApprovalRule|Please select at least one security scanner"
msgstr "Vælg venligst mindst én sikkerhedsskanner"
msgid "ApprovalRule|Please select at least one severity level"
-msgstr ""
+msgstr "Vælg venligst mindst ét sikkerhedsniveau"
msgid "ApprovalRule|Rule name"
msgstr "Regelnavn"
@@ -4233,48 +4259,48 @@ msgid "ApprovalRule|Select scanners"
msgstr "Vælg skannere"
msgid "ApprovalRule|Select severity levels"
-msgstr ""
+msgstr "Vælg alvorlighedsniveauer"
msgid "ApprovalRule|Severity levels"
-msgstr ""
+msgstr "Alvorlighedsniveauer"
msgid "ApprovalRule|Target branch"
msgstr "MÃ¥lgren"
msgid "ApprovalRule|Vulnerabilities allowed"
-msgstr ""
+msgstr "SÃ¥rbarheder tilladt"
msgid "ApprovalSettings|Merge request approval settings have been updated."
-msgstr ""
+msgstr "Godkendelsesindstillinger for sammenlægningsanmodning er blevet opdateret."
msgid "ApprovalSettings|Prevent approval by author."
-msgstr ""
+msgstr "Forhindr godkendelse af forfatter."
msgid "ApprovalSettings|Prevent approvals by users who add commits."
-msgstr ""
+msgstr "Forhindr godkendelse af brugere som tilføjer commits."
msgid "ApprovalSettings|Prevent editing approval rules in merge requests."
-msgstr ""
+msgstr "Forhindr redigering af godkendelsesregler i sammenlægningsanmodninger."
msgid "ApprovalSettings|Prevent editing approval rules in projects and merge requests."
-msgstr ""
-
-msgid "ApprovalSettings|Prevent editing approval rules in projects and merge requests. "
-msgstr ""
+msgstr "Forhindr redigering af godkendelsesregler i projekter og sammenlægningsanmodninger."
msgid "ApprovalSettings|Remove all approvals when commits are added to the source branch."
-msgstr ""
+msgstr "Fjern alle godkendelser når der tilføjes commits til kildegrenen."
msgid "ApprovalSettings|Require user password to approve."
-msgstr ""
+msgstr "Kræv brugeradgangskode for at godkende."
msgid "ApprovalSettings|There was an error loading merge request approval settings."
-msgstr ""
+msgstr "Der opstod en fejl under indlæsning af godkendelsesindstillinger for sammenlægningsanmodning."
msgid "ApprovalSettings|There was an error updating merge request approval settings."
-msgstr ""
+msgstr "Der opstod en fejl under opdatering af godkendelsesindstillinger for sammenlægningsanmodning."
msgid "ApprovalSettings|This setting is configured at the instance level and can only be changed by an administrator."
+msgstr "Indstillingen er konfigureret på instansniveau og kan kun ændres af en administrator."
+
+msgid "ApprovalSettings|This setting is configured in %{groupName} and can only be changed by an administrator or group owner."
msgstr ""
msgid "ApprovalStatusTooltip|Adheres to separation of duties"
@@ -4320,7 +4346,7 @@ msgid "Approvers"
msgstr "Godkendere"
msgid "Approvers from private group(s) not shown"
-msgstr ""
+msgstr "Godkendere fra private grupper ikke vist"
msgid "Apr"
msgstr "Apr."
@@ -4329,22 +4355,22 @@ msgid "April"
msgstr "April"
msgid "Architecture not found for OS"
-msgstr ""
+msgstr "Arkitektur ikke fundet for styresystem"
msgid "Archive"
msgstr ""
msgid "Archive jobs"
-msgstr ""
+msgstr "Arkivér job"
msgid "Archive project"
-msgstr ""
+msgstr "Arkivér projekt"
msgid "Archive test case"
-msgstr ""
+msgstr "Arkivér testsag"
msgid "Archived"
-msgstr "Arkiveret"
+msgstr "Arkiverede"
msgid "Archived (%{movedToStart}moved%{movedToEnd})"
msgstr "Arkiveret (%{movedToStart}flyttet%{movedToEnd})"
@@ -4359,7 +4385,7 @@ msgid "Archived projects"
msgstr "Arkiverede projekter"
msgid "Archiving the project will make it entirely read-only. It is hidden from the dashboard and doesn't show up in searches. %{strong_start}The repository cannot be committed to, and no issues, comments, or other entities can be created.%{strong_end} %{link_start}Learn more.%{link_end}"
-msgstr ""
+msgstr "Arkivering af projektet vil gøre det fuldstændigt skrivebeskyttet. Det skjules fra betjeningspanelet og vises ikke i søgninger. %{strong_start}Der kan ikke commites til depotet og der kan ikke oprettes problemstillinger, kommentarer og andre indslag.%{strong_end} %{link_start}Lær mere%{link_end}."
msgid "Are you ABSOLUTELY SURE you wish to delete this project?"
msgstr "Er du HELT SIKKER på, at du vil slette projektet?"
@@ -4377,7 +4403,7 @@ msgid "Are you sure you want to %{action} %{name}?"
msgstr "Er du sikker på, at du vil %{action} %{name}?"
msgid "Are you sure you want to attempt to merge?"
-msgstr ""
+msgstr "Er du sikker på, at du forsøge at sammenlægge?"
msgid "Are you sure you want to cancel editing this comment?"
msgstr "Er du sikker på, at du vil annullere redigering af kommentaren?"
@@ -4392,7 +4418,7 @@ msgid "Are you sure you want to delete these artifacts?"
msgstr "Er du sikker på, at du vil slette artefakterne?"
msgid "Are you sure you want to delete this %{typeOfComment}?"
-msgstr ""
+msgstr "Er du sikker på, at du vil slette denne %{typeOfComment}?"
msgid "Are you sure you want to delete this SSH key?"
msgstr "Er du sikker på, at du vil slette SSH-nøglen?"
@@ -4401,7 +4427,7 @@ msgid "Are you sure you want to delete this device? This action cannot be undone
msgstr "Er du sikker på, at du vil slette enheden? Handlingen kan ikke fortrydes."
msgid "Are you sure you want to delete this pipeline schedule?"
-msgstr ""
+msgstr "Er du sikker på, at du vil slette pipeline-planlægningen?"
msgid "Are you sure you want to delete this pipeline? Doing so will expire all pipeline caches and delete all related objects, such as builds, logs, artifacts, and triggers. This action cannot be undone."
msgstr ""
@@ -4430,7 +4456,7 @@ msgid "Are you sure you want to lock this directory?"
msgstr "Er du sikker på, at du vil låse mappen?"
msgid "Are you sure you want to lose unsaved changes?"
-msgstr "Er du sikker på, at du vil kassere ændringer som ikke er blevet gemt?"
+msgstr "Er du sikker på, at du vil miste ændringer som ikke er blevet gemt?"
msgid "Are you sure you want to lose your issue information?"
msgstr "Er du sikker på, at du vil miste din problemstillingsinformation?"
@@ -4469,7 +4495,7 @@ msgid "Are you sure you want to remove this list?"
msgstr "Er du sikker på, at du vil fjerne listen?"
msgid "Are you sure you want to reset the SCIM token? SCIM provisioning will stop working until the new token is updated."
-msgstr ""
+msgstr "Er du sikker på, at du vil nulstille SCIM-tokenen? SCIM-provisionering vil stoppe med at virke indtil den nye token er opdateret."
msgid "Are you sure you want to reset the health check token?"
msgstr "Er du sikker på, at du vil nulstille tokenen til sundhedstjek?"
@@ -4502,28 +4528,28 @@ msgid "Are you sure you want to unlock this directory?"
msgstr "Er du sikker på, at du vil oplåse mappen?"
msgid "Are you sure you want to unsubscribe from the %{type}: %{link_to_noteable_text}?"
-msgstr ""
+msgstr "Er du sikker på, at du vil fjerne abonnering fra %{type}: %{link_to_noteable_text}?"
msgid "Are you sure?"
msgstr "Er du sikker?"
msgid "Are you sure? All commits that were signed with this GPG key will be unverified."
-msgstr ""
+msgstr "Er du sikker? Alle commits som blev underskrevet med GPG-nøglen vil være uverificeret."
msgid "Are you sure? Removing this GPG key does not affect already signed commits."
-msgstr ""
+msgstr "Er du sikker? Fjernelse af GPG-nøglen påvirker ikke commits som allerede er underskrevet."
msgid "Are you sure? The device will be signed out of GitLab and all remember me tokens revoked."
-msgstr ""
+msgstr "Er du sikker? Enheden vil blive logget ud af GitLab og alle husk mig-tokens tilbagekaldt."
msgid "Are you sure? This will invalidate your registered applications and U2F / WebAuthn devices."
-msgstr ""
+msgstr "Er du sikker? Det vil invalidere dine registrerede programmer og U2F-/WebAuthn-enheder."
msgid "Are you sure? This will invalidate your registered applications and U2F devices."
-msgstr ""
+msgstr "Er du sikker? Det vil invalidere dine registrerede programmer og U2F-enheder."
msgid "Arrange charts"
-msgstr ""
+msgstr "Opstil diagrammer"
msgid "Artifact"
msgstr "Artefakt"
@@ -4547,7 +4573,7 @@ msgid "AsanaService|Add commit messages as comments to Asana tasks."
msgstr "Tilføj commit-meddelelser som kommentarer til Asana-opgaver."
msgid "AsanaService|Comma-separated list of branches to be automatically inspected. Leave blank to include all branches."
-msgstr ""
+msgstr "Kommasepareret liste over grene som automatisk skal inspiceres. Lad den være tom for at medtage alle grene."
msgid "AsanaService|User Personal Access Token. User must have access to the task. All comments are attributed to this user."
msgstr ""
@@ -4559,19 +4585,19 @@ msgid "Ask again later"
msgstr "Spørg igen senere"
msgid "Ask someone with write access to resolve it."
-msgstr ""
+msgstr "Spørg nogen med skriveadgang om at løse den."
msgid "Ask your group maintainer to set up a group runner."
msgstr ""
msgid "Assertion consumer service URL"
-msgstr ""
+msgstr "URL for hævdelsesforbrugertjeneste"
msgid "Assets"
-msgstr ""
+msgstr "Materialer"
msgid "Assets:"
-msgstr ""
+msgstr "Materialer:"
msgid "Assign"
msgstr "Tildel"
@@ -4610,7 +4636,7 @@ msgid "Assign yourself to these issues"
msgstr ""
msgid "Assign yourself to this issue"
-msgstr ""
+msgstr "Tildel dig selv til problemstillingen"
msgid "Assigned %{assignee_users_sentence}."
msgstr "Tildelte %{assignee_users_sentence}."
@@ -4622,7 +4648,7 @@ msgid "Assigned Issues"
msgstr "Tildelte problemstillinger"
msgid "Assigned merge requests"
-msgstr ""
+msgstr "Tildelte sammenlægningsanmodninger"
msgid "Assigned projects"
msgstr "Tildelte projekter"
@@ -4644,8 +4670,8 @@ msgstr "Tildelt til dig"
msgid "Assignee"
msgid_plural "%d Assignees"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "Tildeler"
+msgstr[1] "%d tildelere"
msgid "Assignee has no permissions"
msgstr ""
@@ -4657,7 +4683,7 @@ msgid "Assignee(s)"
msgstr "Tildelte"
msgid "Assignees"
-msgstr ""
+msgstr "Tildelere"
msgid "Assigns %{assignee_users_sentence}."
msgstr "Tildeler %{assignee_users_sentence}."
@@ -4672,7 +4698,7 @@ msgid "At least one field of %{one_of_required_fields} must be present"
msgstr ""
msgid "At least one of group_id or project_id must be specified"
-msgstr ""
+msgstr "Mindst én af group_id eller project_id skal være angivet"
msgid "At least one of your Personal Access Tokens is expired, but expiration enforcement is disabled. %{generate_new}"
msgstr ""
@@ -4681,7 +4707,7 @@ msgid "At least one of your Personal Access Tokens will expire soon, but expirat
msgstr ""
msgid "At risk"
-msgstr ""
+msgstr "I fare"
msgid "Attach a file"
msgstr "Vedhæft en fil"
@@ -4716,7 +4742,7 @@ msgid "AuditLogs|Date"
msgstr "Dato"
msgid "AuditLogs|Failed to find %{type}. Please search for another %{type}."
-msgstr ""
+msgstr "Kunne ikke finde %{type}. Søg venligst efter en anden %{type}."
msgid "AuditLogs|Failed to find %{type}. Please try again."
msgstr "Kunne ikke finde %{type}. Prøv venligst igen."
@@ -4763,9 +4789,6 @@ msgstr ""
msgid "Authenticated API rate limit period in seconds"
msgstr ""
-msgid "Authenticated API request rate limit"
-msgstr ""
-
msgid "Authenticated API requests"
msgstr ""
@@ -4775,10 +4798,10 @@ msgstr ""
msgid "Authenticated Git LFS request rate limit"
msgstr ""
-msgid "Authenticated web rate limit period in seconds"
+msgid "Authenticated Git LFS requests"
msgstr ""
-msgid "Authenticated web request rate limit"
+msgid "Authenticated web rate limit period in seconds"
msgstr ""
msgid "Authenticated web requests"
@@ -4821,10 +4844,10 @@ msgid "Author: %{author_name}"
msgstr "Forfatter: %{author_name}"
msgid "Authored %{timeago}"
-msgstr ""
+msgstr "Forfattet %{timeago}"
msgid "Authored %{timeago} by %{author}"
-msgstr ""
+msgstr "Forfattet %{timeago} af %{author}"
msgid "Authorization code:"
msgstr "Godkendelseskode:"
@@ -4869,7 +4892,7 @@ msgid "Auto DevOps enabled"
msgstr "Auto DevOps aktiveret"
msgid "Auto stop successfully canceled."
-msgstr ""
+msgstr "Automatisk stop annulleret."
msgid "Auto-cancel redundant pipelines"
msgstr ""
@@ -4905,7 +4928,7 @@ msgid "AutoDevopsAlert|Security testing tools enabled with %{linkStart}Auto DevO
msgstr ""
msgid "AutoRemediation| 1 Merge Request"
-msgstr ""
+msgstr " 1 sammenlægningsanmodning"
msgid "AutoRemediation|%{mrsCount} ready for review"
msgstr ""
@@ -4929,19 +4952,19 @@ msgid "AutoRollback|Automatically roll back to the last successful deployment wh
msgstr ""
msgid "AutoRollback|Enable automatic rollbacks"
-msgstr ""
+msgstr "Aktivér automatiske tilbagerulninger"
msgid "Autocomplete"
-msgstr ""
+msgstr "Autofuldfør"
msgid "Autocomplete description"
-msgstr ""
+msgstr "Beskrivelse for autofuldfør"
msgid "Autocomplete hint"
-msgstr ""
+msgstr "Tip for autofuldfør"
msgid "Autocomplete usage hint"
-msgstr ""
+msgstr "Anvendelsestip for autofuldfør"
msgid "Automatic certificate management using %{lets_encrypt_link_start}Let's Encrypt%{lets_encrypt_link_end}"
msgstr ""
@@ -4950,7 +4973,7 @@ msgid "Automatic certificate management using Let's Encrypt"
msgstr ""
msgid "Automatic deployment rollbacks"
-msgstr ""
+msgstr "Aktivér udsendelsestilbagerulninger"
msgid "Automatic event tracking provides a traceable history for audits."
msgstr ""
@@ -4962,7 +4985,7 @@ msgid "Automatically resolved"
msgstr "Automatisk løst"
msgid "Automatically update this project's branches and tags from the upstream repository every hour."
-msgstr ""
+msgstr "Opdater automatisk projektets grene og mærkater fra upstream-depotet hver time."
msgid "Autosave|Note"
msgstr ""
@@ -4971,16 +4994,16 @@ msgid "Available"
msgstr "Tilgængelig"
msgid "Available ID"
-msgstr ""
+msgstr "Tilgængeligt id"
msgid "Available group runners: %{runners}"
msgstr ""
msgid "Available runners: %{runners}"
-msgstr ""
+msgstr "Tilgængelige runnere: %{runners}"
msgid "Available shared runners:"
-msgstr ""
+msgstr "Tilgængelige delte runnere:"
msgid "Available specific runners"
msgstr ""
@@ -4998,13 +5021,13 @@ msgid "Average per day: %{average}"
msgstr "Gennemsnit pr. dag: %{average}"
msgid "Award added"
-msgstr "Pris tilføjet"
+msgstr "Belønning tilføjet"
msgid "Award removed"
-msgstr "Pris fjernet"
+msgstr "Belønning fjernet"
msgid "AwardEmoji|No emojis found."
-msgstr "Ingen emojis fundet."
+msgstr "Ingen belønninger fundet."
msgid "Back"
msgstr "Tilbage"
@@ -5124,7 +5147,7 @@ msgid "BambooService|Run CI/CD pipelines with Atlassian Bamboo. You must set up
msgstr ""
msgid "BambooService|The user with API access to the Bamboo server."
-msgstr ""
+msgstr "Brugeren med API-adgang til Bamboo-serveren."
msgid "Based on"
msgstr "Baseret på"
@@ -5133,7 +5156,7 @@ msgid "Be careful. Changing the project's namespace can have unintended side eff
msgstr ""
msgid "Be careful. Renaming a project's repository can have unintended side effects."
-msgstr ""
+msgstr "Vær forsigtig. Omdøbning af et projekts depot kan have utilsigtede bivirkninger."
msgid "Before enabling this integration, create a webhook for the room in Google Chat where you want to receive notifications from this project. %{docs_link}"
msgstr ""
@@ -5156,9 +5179,6 @@ msgstr ""
msgid "Below you will find all the groups that are public."
msgstr "Nedenunder finder du alle de grupper, som er offentlige."
-msgid "Beta"
-msgstr "Beta"
-
msgid "Bi-weekly code coverage"
msgstr ""
@@ -5166,19 +5186,19 @@ msgid "Billable Users"
msgstr ""
msgid "Billing"
-msgstr ""
+msgstr "Fakturering"
msgid "BillingPlans|%{group_name} is currently using the %{plan_name}."
-msgstr ""
+msgstr "%{group_name} bruger i øjeblikket %{plan_name}."
msgid "BillingPlans|@%{user_name} you are currently using the %{plan_name}."
-msgstr ""
+msgstr "@%{user_name}, du bruger i øjeblikket %{plan_name}."
msgid "BillingPlans|Compare all plans"
msgstr "Sammenlign alle planer"
msgid "BillingPlans|Congratulations, your free trial is activated."
-msgstr ""
+msgstr "Tillykke, din gratis prøveperiode er aktiveret."
msgid "BillingPlans|End of availability for the Bronze Plan"
msgstr ""
@@ -5187,13 +5207,13 @@ msgid "BillingPlans|Free upgrade!"
msgstr "Gratis opgradering!"
msgid "BillingPlans|If you would like to downgrade your plan please contact %{support_link_start}Customer Support%{support_link_end}."
-msgstr ""
+msgstr "Hvis du vil nedgradere din plan, så kontakt venligst %{support_link_start}kundesupport%{support_link_end}."
msgid "BillingPlans|Learn more about each plan by reading our %{faq_link}, or start a free 30-day trial of GitLab.com Ultimate."
-msgstr ""
+msgstr "Lær mere om hver plan ved at læse vores %{faq_link} eller start en gratis 30-dages prøveperiode af GitLab.com Ultimate."
msgid "BillingPlans|Learn more about each plan by visiting our %{pricing_page_link}."
-msgstr ""
+msgstr "Lær mere om hver plan ved at besøge vores %{pricing_page_link}."
msgid "BillingPlans|Looking to purchase or manage a subscription for your group? Navigate to your %{groups_link} and go to %{strong_open}Settings &gt; Billing.%{strong_close}"
msgstr ""
@@ -5208,10 +5228,10 @@ msgid "BillingPlans|See all %{plan_name} features"
msgstr "Se alle %{plan_name}-funktioner"
msgid "BillingPlans|This group uses the plan associated with its parent group."
-msgstr ""
+msgstr "Gruppen bruger den plan som er tilknyttet med dens forældergruppe."
msgid "BillingPlans|To manage the plan for this group, visit the billing section of %{parent_billing_page_link}."
-msgstr ""
+msgstr "Besøg opkrævningsafsnittet i vores %{parent_billing_page_link} for at håndtere planen til gruppen."
msgid "BillingPlans|Upgrade to GitLab %{planNameForUpgrade}"
msgstr "Opgrader til GitLab %{planNameForUpgrade}"
@@ -5220,16 +5240,16 @@ msgid "BillingPlans|While GitLab is ending availability of the Bronze plan, you
msgstr ""
msgid "BillingPlans|Your GitLab.com %{plan} trial will %{strong_open}expire after %{expiration_date}%{strong_close}. You can retain access to the %{plan} features by upgrading below."
-msgstr ""
+msgstr "Din GitLab.com %{plan}-prøveperiode vil %{strong_open}udløbe efter %{expiration_date}%{strong_close}. Du kan bevare adgang til %{plan}-funktionerne ved at opgradere nedenunder."
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 "Din GitLab.com-prøveperiode vil udløbe %{expiration_date}. Du kan når som helst gendanne adgang til funktionerne ved at opgradere nedenunder."
msgid "BillingPlans|billed annually at %{price_per_year}"
-msgstr ""
+msgstr "opkræves årligt %{price_per_year}"
msgid "BillingPlans|for the remainder of your subscription"
-msgstr ""
+msgstr "for det der er tilbage af dit abonnement"
msgid "BillingPlans|frequently asked questions"
msgstr "ofte stillede spørgsmål"
@@ -5253,7 +5273,7 @@ msgid "BillingPlan|Upgrade for free"
msgstr "Opgrader gratis"
msgid "Billings|%{planName} plan"
-msgstr ""
+msgstr "%{planName}-plan"
msgid "Billings|An error occurred while extending your trial."
msgstr "Der opstod en fejl under forlængelse af din prøveperiode."
@@ -5262,19 +5282,19 @@ msgid "Billings|An error occurred while reactivating your trial."
msgstr "Der opstod en fejl under genaktivering af din prøveperiode."
msgid "Billings|By extending your trial, you will receive an additional 30 days of %{planName}. Your trial can be only extended once."
-msgstr ""
+msgstr "Ved at forlænge din prøveperiode vil du modtage yderligere 30 dage med %{planName}. Din prøveperiode kan kun forlænges én gang."
msgid "Billings|By reactivating your trial, you will receive an additional 30 days of %{planName}. Your trial can be only reactivated once."
-msgstr ""
+msgstr "Ved at genaktivere din prøveperiode vil du modtage yderligere 30 dage med %{planName}. Din prøveperiode kan kun aktiveres én gang."
msgid "Billings|Extend trial"
-msgstr ""
+msgstr "Forlæng plan"
msgid "Billings|Reactivate trial"
msgstr "Genaktivér prøveperiode"
msgid "Billings|Shared runners cannot be enabled until a valid credit card is on file."
-msgstr ""
+msgstr "Delte runnere kan ikke aktiveres indtil en gyldigt kreditkort er blevet registreret."
msgid "Billings|To use free pipeline minutes on shared runners, you’ll need to validate your account with a credit or debit card. If you prefer not to provide one, you can run pipelines by bringing your own runners and disabling shared runners for your project. This is required to discourage and reduce abuse on GitLab infrastructure. %{strongStart}GitLab will not charge or store your card, it will only be used for validation.%{strongEnd} %{linkStart}Learn more%{linkEnd}."
msgstr ""
@@ -5283,22 +5303,22 @@ msgid "Billings|To use free pipeline minutes on shared runners, you’ll need to
msgstr ""
msgid "Billings|User successfully validated"
-msgstr ""
+msgstr "Bruger valideret"
msgid "Billings|User validation required"
-msgstr ""
+msgstr "Brugervalidering kræves"
msgid "Billings|Validate account"
-msgstr ""
+msgstr "Validér konto"
msgid "Billings|Validate user account"
-msgstr ""
+msgstr "Validér brugerkonto"
msgid "Billings|Your user account has been successfully validated. You can now use free pipeline minutes."
msgstr ""
msgid "Billing|An email address is only visible for users with public emails."
-msgstr ""
+msgstr "En e-mailadresse er kun synlig for brugere med offentlige e-mails."
msgid "Billing|An error occurred while getting a billable member details"
msgstr ""
@@ -5316,16 +5336,16 @@ msgid "Billing|Direct memberships"
msgstr "Direkte medlemskaber"
msgid "Billing|Enter at least three characters to search."
-msgstr ""
+msgstr "Indtast mindst tre tegn for at søge."
msgid "Billing|Export list"
-msgstr ""
+msgstr "Eksportér liste"
msgid "Billing|Group"
msgstr "Gruppe"
msgid "Billing|Group invite"
-msgstr ""
+msgstr "Gruppeinvitation"
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 ""
@@ -5337,19 +5357,19 @@ msgid "Billing|Private"
msgstr "Privat"
msgid "Billing|Project invite"
-msgstr ""
+msgstr "Projektinvitation"
msgid "Billing|Remove user %{username} from your subscription"
-msgstr ""
+msgstr "Fjern brugeren %{username} fra dit abonnement"
msgid "Billing|Toggle seat details"
-msgstr ""
+msgstr "Sædedetaljer til/fra"
msgid "Billing|Type %{username} to confirm"
-msgstr ""
+msgstr "Skriv %{username} for at bekræfte"
msgid "Billing|User was successfully removed"
-msgstr ""
+msgstr "Bruger blev fjernet"
msgid "Billing|Users occupying seats in"
msgstr ""
@@ -5384,10 +5404,10 @@ msgid "Blocked issue"
msgstr "Blokeret problemstilling"
msgid "Blocking"
-msgstr "Blokerer"
+msgstr "Blokerende"
msgid "Blocking issues"
-msgstr ""
+msgstr "Blokerende problemstillinger"
msgid "Blocks"
msgstr "Blokeringer"
@@ -5398,6 +5418,21 @@ msgstr "Blog"
msgid "Board scope affects which issues are displayed for anyone who visits this board"
msgstr ""
+msgid "BoardNewEpic|Groups"
+msgstr ""
+
+msgid "BoardNewEpic|Loading groups"
+msgstr ""
+
+msgid "BoardNewEpic|No matching results"
+msgstr ""
+
+msgid "BoardNewEpic|Search groups"
+msgstr ""
+
+msgid "BoardNewEpic|Select a group"
+msgstr ""
+
msgid "BoardNewIssue|No matching results"
msgstr ""
@@ -5411,10 +5446,10 @@ msgid "BoardNewIssue|Select a project"
msgstr "Vælg et projekt"
msgid "BoardScope|An error occurred while getting milestones, please try again."
-msgstr ""
+msgstr "Der opstod en fejl under hentning af milepæle. Prøv venligst igen."
msgid "BoardScope|An error occurred while searching for users, please try again."
-msgstr ""
+msgstr "Der opstod en fejl under søgning efter brugere. Prøv venligst igen."
msgid "BoardScope|Any Milestone"
msgstr ""
@@ -5447,10 +5482,10 @@ msgid "BoardScope|Select weight"
msgstr ""
msgid "BoardScope|Started"
-msgstr ""
+msgstr "Startet"
msgid "BoardScope|Upcoming"
-msgstr ""
+msgstr "Kommende"
msgid "BoardScope|Weight"
msgstr ""
@@ -5475,41 +5510,44 @@ msgstr "Der opstod en fejl under oprettelse af problemstillingen. Prøv venligst
msgid "Boards|An error occurred while creating the list. Please try again."
msgstr "Der opstod en fejl under oprettelse af listen. Prøv venligst igen."
-msgid "Boards|An error occurred while fetching group projects. Please try again."
+msgid "Boards|An error occurred while fetching child groups. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching group projects. Please try again."
+msgstr "Der opstod en fejl under hentning af gruppeprojekter. Prøv venligst igen."
+
msgid "Boards|An error occurred while fetching issues. Please reload the page."
-msgstr ""
+msgstr "Der opstod en fejl under hentning af problemstillinger. Genindlæs venligst siden."
msgid "Boards|An error occurred while fetching labels. Please reload the page."
-msgstr ""
+msgstr "Der opstod en fejl under hentning af etiketter. Genindlæs venligst siden."
msgid "Boards|An error occurred while fetching the board epics. Please reload the page."
-msgstr ""
+msgstr "Der opstod en fejl under hentning af tavleepicsne. Genindlæs venligst siden."
msgid "Boards|An error occurred while fetching the board issues. Please reload the page."
-msgstr ""
+msgstr "Der opstod en fejl under hentning af tavleproblemstillingerne. Genindlæs venligst siden."
msgid "Boards|An error occurred while fetching the board lists. Please reload the page."
-msgstr ""
+msgstr "Der opstod en fejl under hentning af tavlelisterne. Genindlæs venligst siden."
msgid "Boards|An error occurred while fetching the board swimlanes. Please reload the page."
-msgstr ""
+msgstr "Der opstod en fejl under hentning af tavlesvømmebanerne. Genindlæs venligst siden."
msgid "Boards|An error occurred while generating lists. Please reload the page."
-msgstr ""
+msgstr "Der opstod en fejl under generering af lister. Genindlæs venligst siden."
msgid "Boards|An error occurred while moving the epic. Please try again."
-msgstr ""
+msgstr "Der opstod en fejl under flytning af epicen. Prøv venligst igen."
msgid "Boards|An error occurred while moving the issue. Please try again."
-msgstr ""
+msgstr "Der opstod en fejl under flytning af problemstillingen. Prøv venligst igen."
msgid "Boards|An error occurred while removing the list. Please try again."
-msgstr ""
+msgstr "Der opstod en fejl under fjernelse af listen. Prøv venligst igen."
msgid "Boards|An error occurred while updating the board list. Please try again."
-msgstr ""
+msgstr "Der opstod en fejl under opdatering af tavlelisten. Prøv venligst igen."
msgid "Boards|Blocked by %{blockedByCount} %{issuableType}"
msgid_plural "Boards|Blocked by %{blockedByCount} %{issuableType}s"
@@ -5523,16 +5561,16 @@ msgid "Boards|Edit board"
msgstr "Rediger tavle"
msgid "Boards|Expand"
-msgstr "Udvid"
+msgstr "Udfold"
msgid "Boards|Failed to fetch blocking %{issuableType}s"
-msgstr ""
+msgstr "Kunne ikke hente blokerende %{issuableType}s"
msgid "Boards|New epic"
msgstr "Ny epic"
msgid "Boards|Retrieving blocking %{issuableType}s"
-msgstr ""
+msgstr "Henter blokerende %{issuableType}s"
msgid "Boards|View all blocking %{issuableType}s"
msgstr "Vis alle blokerende %{issuableType}s"
@@ -5703,13 +5741,13 @@ msgid "Branches|Show stale branches"
msgstr "Vis uaktuelle grene"
msgid "Branches|Stale"
-msgstr "Uaktuel"
+msgstr "Uaktuelle"
msgid "Branches|Stale branches"
msgstr "Uaktuelle grene"
msgid "Branches|The branch could not be updated automatically because it has diverged from its upstream counterpart."
-msgstr ""
+msgstr "Grenen kunne ikke opdateres automatisk fordi den er afviget fra sin upstream-modpart."
msgid "Branches|The default branch cannot be deleted"
msgstr "Standardgrenen kan ikke slettes"
@@ -5721,31 +5759,31 @@ msgid "Branches|This branch hasn’t been merged into %{default_branch}."
msgstr "Grenen er ikke blevet sammenlagt ind i %{default_branch}."
msgid "Branches|To avoid data loss, consider merging this branch before deleting it."
-msgstr ""
+msgstr "Overvej at sammenlægge grenen inden den slettes for at forhindre tab af data."
msgid "Branches|To confirm, type %{branch_name_confirmation}:"
msgstr "Skriv %{branch_name_confirmation} for at bekræfte:"
msgid "Branches|To discard the local changes and overwrite the branch with the upstream version, delete it here and choose 'Update Now' above."
-msgstr ""
+msgstr "For at forkaste de lokale ændringer og overskrive grenen med upstream-versionen skal du slette den her og vælge 'Opdater nu' ovenover."
msgid "Branches|Yes, delete branch"
-msgstr ""
+msgstr "Ja, slet gren"
msgid "Branches|Yes, delete protected branch"
-msgstr ""
+msgstr "Ja, slet beskyttet gren"
msgid "Branches|You're about to permanently delete the branch %{strongStart}%{branchName}.%{strongEnd}"
-msgstr ""
+msgstr "Du er ved at slette %{strongStart}%{branchName}%{strongEnd} parmanent."
msgid "Branches|You're about to permanently delete the protected branch %{strongStart}%{branchName}.%{strongEnd}"
-msgstr ""
+msgstr "Du er ved at slette den beskyttede gren %{strongStart}%{branchName}%{strongEnd} permanent."
msgid "Branches|You’re about to permanently delete the protected branch %{branch_name}."
msgstr "Du er ved at slette den beskyttede gren %{branch_name} permanent."
msgid "Branches|diverged from upstream"
-msgstr ""
+msgstr "afviget fra upstream"
msgid "Branches|merged"
msgstr "sammenlagt"
@@ -5757,22 +5795,22 @@ msgid "Branches|protected"
msgstr "beskyttet"
msgid "Breadcrumbs"
-msgstr ""
+msgstr "Breadcrumbs"
msgid "Brief title about the change"
msgstr ""
msgid "Broadcast Message was successfully created."
-msgstr ""
+msgstr "Broadcastmeddelelse blev oprettet."
msgid "Broadcast Message was successfully updated."
-msgstr ""
+msgstr "Broadcastmeddelelse blev opdateret."
msgid "Broadcast Messages"
-msgstr ""
+msgstr "Broadcastmeddelelser"
msgid "Broadcast messages are displayed for every user and can be used to notify users about scheduled maintenance, recent upgrades and more."
-msgstr ""
+msgstr "Broadcastmeddelelser vises for hver bruger og kan bruges til at underrette brugere om planlagt vedligeholdelse, seneste opgraderinger mm."
msgid "Browse Directory"
msgstr "Gennemse mappe"
@@ -5807,6 +5845,9 @@ msgstr ""
msgid "Bulk update"
msgstr "Masseopdatering"
+msgid "BulkImports|Re-import creates a new group. It does not sync with the existing group."
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr "Eksisterende grupper"
@@ -5816,6 +5857,9 @@ msgstr "Filtrér efter kildegruppe"
msgid "BulkImport|From source group"
msgstr "Fra kildegruppe"
+msgid "BulkImport|Group import history"
+msgstr ""
+
msgid "BulkImport|Import failed: Destination cannot be a subgroup of the source group. Change the destination and try again."
msgstr ""
@@ -5826,23 +5870,35 @@ msgid "BulkImport|Import selected"
msgstr ""
msgid "BulkImport|Importing the group failed"
+msgstr "Importering af gruppen mislykkedes"
+
+msgid "BulkImport|Last imported to %{link}"
msgstr ""
msgid "BulkImport|Name already exists."
msgstr "Navnet findes allerede."
-msgid "BulkImport|No parent"
+msgid "BulkImport|New group"
+msgstr ""
+
+msgid "BulkImport|No history is available"
msgstr ""
+msgid "BulkImport|No parent"
+msgstr "Ingen forælder"
+
msgid "BulkImport|Showing %{start}-%{end} of %{total}"
msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} from %{link}"
-msgstr ""
+msgstr "Viser %{start}-%{end} af %{total} fra %{link}"
msgid "BulkImport|Showing %{start}-%{end} of %{total} matching filter \"%{filter}\" from %{link}"
msgstr ""
+msgid "BulkImport|Source group"
+msgstr ""
+
msgid "BulkImport|To new group"
msgstr "Til ny gruppe"
@@ -5850,19 +5906,22 @@ msgid "BulkImport|Update of import statuses with realtime changes failed"
msgstr ""
msgid "BulkImport|You have no groups to import"
+msgstr "Du har ingen grupper at importere"
+
+msgid "BulkImport|Your imported groups will appear here."
msgstr ""
msgid "BulkImport|expected an associated Group but has an associated Project"
-msgstr ""
+msgstr "forventede en tilknyttet gruppe men har et tilknyttet projekt"
msgid "BulkImport|expected an associated Project but has an associated Group"
-msgstr ""
+msgstr "forventede et tilknyttet projekt men har en tilknyttet gruppe"
msgid "BulkImport|must be a group"
msgstr "skal være en gruppe"
msgid "Burndown chart"
-msgstr ""
+msgstr "Burndowndiagram"
msgid "BurndownChartLabel|Open issue weight"
msgstr ""
@@ -5871,7 +5930,7 @@ msgid "BurndownChartLabel|Open issues"
msgstr ""
msgid "Burnup chart"
-msgstr ""
+msgstr "Burnupdiagram"
msgid "Burnup chart could not be generated due to too many events"
msgstr ""
@@ -5889,10 +5948,10 @@ msgid "Buy CI Minutes"
msgstr "Køb CI-minutter"
msgid "Buy Storage"
-msgstr ""
+msgstr "Køb lager"
msgid "Buy more Pipeline minutes"
-msgstr ""
+msgstr "Køb flere pipeline-minutter"
msgid "By %{user_name}"
msgstr "Af %{user_name}"
@@ -5931,13 +5990,13 @@ msgid "CI/CD"
msgstr "CI/CD"
msgid "CI/CD Analytics"
-msgstr ""
+msgstr "CI-/CD-analyse"
msgid "CI/CD Settings"
-msgstr ""
+msgstr "CI-/CD-indstillinger"
msgid "CI/CD configuration"
-msgstr "Konfiguration af CI/CD"
+msgstr "CI-/CD-konfiguration"
msgid "CI/CD configuration file"
msgstr ""
@@ -5962,17 +6021,17 @@ msgstr ""
msgid "CICDAnalytics|Release"
msgid_plural "CICDAnalytics|Releases"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "Udgivelse"
+msgstr[1] "Udgivelser"
msgid "CICDAnalytics|Release statistics"
-msgstr ""
+msgstr "Udgivelsesstatistik"
msgid "CICDAnalytics|Releases"
-msgstr ""
+msgstr "Udgivelser"
msgid "CICDAnalytics|Something went wrong while fetching release statistics"
-msgstr ""
+msgstr "Noget gik galt under hentning af udgivelsesstatistik"
msgid "CICD|Add a %{base_domain_link_start}base domain%{link_end} to your %{kubernetes_cluster_link_start}Kubernetes cluster%{link_end} for your deployment strategy to work."
msgstr ""
@@ -6014,7 +6073,7 @@ msgid "CICD|Select projects that can be accessed by API requests authenticated w
msgstr ""
msgid "CICD|The Auto DevOps pipeline runs by default in all projects with no CI/CD configuration file."
-msgstr ""
+msgstr "Auto DevOps-pipelinen kører som standard i alle projekter som ikke har en CI-/CD-konfigurationsfil."
msgid "CICD|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
msgstr ""
@@ -6065,19 +6124,19 @@ msgid "CVE|Why Request a CVE ID?"
msgstr ""
msgid "Cadence is not automated"
-msgstr ""
+msgstr "Kadence er ikke automatiseret"
msgid "Callback URL"
msgstr ""
msgid "Campfire room ID (optional)"
-msgstr ""
+msgstr "Campfire rum-id (valgfrit)"
msgid "Campfire subdomain (optional)"
-msgstr ""
+msgstr "Campfire-underdomæne (valgfrit)"
msgid "Campfire token"
-msgstr ""
+msgstr "Campfire-token"
msgid "CampfireService|API authentication token from Campfire."
msgstr ""
@@ -6092,37 +6151,40 @@ msgid "CampfireService|The %{code_open}.campfirenow.com%{code_close} subdomain."
msgstr ""
msgid "Can be manually deployed to"
+msgstr "Kan udsendes manuelt til"
+
+msgid "Can be overridden in each project."
msgstr ""
msgid "Can create groups:"
msgstr "Kan oprette grupper:"
msgid "Can't apply as the source branch was deleted."
-msgstr ""
+msgstr "Kan ikke anvende da kildegrenen blev slettet."
msgid "Can't apply as these lines were changed in a more recent version."
-msgstr ""
+msgstr "Kan ikke anvende fordi linjerne blev ændret i en senere version."
msgid "Can't apply as this line was changed in a more recent version."
-msgstr ""
+msgstr "Kan ikke anvende fordi linjen blev ændret i en senere version."
msgid "Can't apply this suggestion."
-msgstr ""
+msgstr "Kan ikke anvende forslaget."
msgid "Can't be empty"
-msgstr "Må ikke være tom"
+msgstr "Må ikke være tomt"
msgid "Can't create snippet: %{err}"
-msgstr "Kan ikke oprette uddrag: %{err}"
+msgstr "Kan ikke oprette udklip: %{err}"
msgid "Can't fetch content for the blob: %{err}"
-msgstr ""
+msgstr "Kan ikke hente indhold for blob'en: %{err}"
msgid "Can't find HEAD commit for this branch"
-msgstr ""
+msgstr "Kan ikke finde HEAD-commit for grenen"
msgid "Can't find variable: ZiteReader"
-msgstr ""
+msgstr "Kan ikke finde variabel: ZiteReader"
msgid "Can't load mermaid module: %{err}"
msgstr ""
@@ -6131,7 +6193,7 @@ msgid "Can't scan the code?"
msgstr "Kan koden ikke skannes?"
msgid "Can't update snippet: %{err}"
-msgstr "Kan ikke opdatere uddrag: %{err}"
+msgstr "Kan ikke opdatere udklip: %{err}"
msgid "Canary"
msgstr ""
@@ -6196,6 +6258,9 @@ msgstr "Annulleret"
msgid "Cancelling Preview"
msgstr "Annullerer forhåndsvisning"
+msgid "Cannot assign a confidential epic to a non-confidential issue. Make the issue confidential and try again"
+msgstr ""
+
msgid "Cannot be assigned to other projects."
msgstr "Kan ikke tildeles til andre projekter."
@@ -6203,16 +6268,16 @@ msgid "Cannot be merged automatically"
msgstr "Kan ikke sammenlægges automatisk"
msgid "Cannot create the abuse report. The user has been deleted."
-msgstr ""
+msgstr "Kan ikke oprette misbrugsrapporten. Brugeren er blevet slettet."
msgid "Cannot create the abuse report. This user has been blocked."
msgstr ""
msgid "Cannot delete %{profile_name} referenced in security policy"
-msgstr ""
+msgstr "Kan ikke slette %{profile_name} som er refereret til i sikkerhedsregelsæt"
msgid "Cannot have multiple Jira imports running at the same time"
-msgstr ""
+msgstr "Kan ikke have flere Jira-importer kørende på samme tid"
msgid "Cannot have multiple unresolved alerts"
msgstr ""
@@ -6230,31 +6295,28 @@ msgid "Cannot merge"
msgstr "Kan ikke sammenlægge"
msgid "Cannot modify %{profile_name} referenced in security policy"
-msgstr ""
+msgstr "Kan ikke redigere %{profile_name} som er refereret til i sikkerhedsregelsæt"
msgid "Cannot modify managed Kubernetes cluster"
msgstr "Kan ikke ændre håndteret Kubernetes-klynge"
msgid "Cannot modify provider during creation"
-msgstr ""
+msgstr "Kan ikke redigere udbyder under oprettelse"
msgid "Cannot promote issue because it does not belong to a group."
-msgstr ""
+msgstr "Kan ikke forfremme problemstilling fordi de ikke tilhører en gruppe."
msgid "Cannot promote issue due to insufficient permissions."
-msgstr ""
+msgstr "Kan ikke forfremme problemstilling pga. utilstrækkelige tilladelser."
msgid "Cannot refer to a group %{timebox_type} by an internal id!"
-msgstr ""
-
-msgid "Cannot set confidential epic for a non-confidential issue"
-msgstr ""
+msgstr "Kan ikke referere til en gruppe %{timebox_type} med et internt id!"
msgid "Cannot show preview. For previews on sketch files, they must have the file format introduced by Sketch version 43 and above."
msgstr ""
msgid "Cannot skip two factor authentication setup"
-msgstr ""
+msgstr "Kan ikke springe opsætning af totrinsgodkendelse over"
msgid "Capacity threshold"
msgstr ""
@@ -6335,7 +6397,7 @@ msgid "Change subscription"
msgstr "Ændr abonnement"
msgid "Change template"
-msgstr ""
+msgstr "Ændr skabelon"
msgid "Change title"
msgstr "Ændr titel"
@@ -6344,7 +6406,7 @@ msgid "Change your password"
msgstr "Ændr din adgangskode"
msgid "Change your password or recover your current one"
-msgstr ""
+msgstr "Ændr din adgangskode eller gendan din nuværende"
msgid "ChangeReviewer|Reviewer changed from %{old} to %{new}"
msgstr "Kontrollant ændret fra %{old} til %{new}"
@@ -6356,7 +6418,7 @@ msgid "ChangeReviewer|Unassigned"
msgstr "Utildelt"
msgid "ChangeTypeAction|A new branch will be created in your fork and a new merge request will be started."
-msgstr ""
+msgstr "En ny gren vil blive oprettet i din forgrening og en ny sammenlægningsanmodning vil blive startet."
msgid "ChangeTypeAction|Cherry-pick"
msgstr "Cherry-pick"
@@ -6380,7 +6442,7 @@ msgid "ChangeTypeAction|Search projects"
msgstr ""
msgid "ChangeTypeAction|Start a %{newMergeRequest} with these changes"
-msgstr ""
+msgstr "Start en %{newMergeRequest} med ændringerne"
msgid "ChangeTypeAction|Switch branch"
msgstr "Skift gren"
@@ -6392,7 +6454,7 @@ msgid "ChangeTypeAction|This will create a new commit in order to revert the exi
msgstr "Det vil oprette en ny commit for at tilbageføre de eksisterende ændringer."
msgid "ChangeTypeAction|Your changes will be committed to %{branchName} because a merge request is open."
-msgstr ""
+msgstr "Dine ændringer vil blive sammenlagt i %{branchName} da en sammenlægningsanmodning er åben."
msgid "Changed assignee(s)."
msgstr ""
@@ -6401,13 +6463,13 @@ msgid "Changed reviewer(s)."
msgstr "Ændrede kontrollanter."
msgid "Changed the title to \"%{title_param}\"."
-msgstr ""
+msgstr "Ændrede titlen til \"%{title_param}\"."
msgid "Changes"
msgstr "Ændringer"
msgid "Changes are shown as if the %{b_open}source%{b_close} revision was being merged into the %{b_open}target%{b_close} revision."
-msgstr ""
+msgstr "Ændringerne vises som om %{b_open}kilderevisionen%{b_close} blev sammenlagt i %{b_open}målrevisionen%{b_close}."
msgid "Changes are still tracked. Useful for cluster/index migrations."
msgstr ""
@@ -6428,7 +6490,7 @@ msgid "Changing group URL can have unintended side effects."
msgstr ""
msgid "Charts can't be displayed as the request for data has timed out. %{documentationLink}"
-msgstr ""
+msgstr "Diagrammer kan ikke vises fordi anmodningen om data har fået timeout. %{documentationLink}"
msgid "Chat"
msgstr "Chat"
@@ -6443,34 +6505,34 @@ msgid "ChatMessage|Commit"
msgstr "Commit"
msgid "ChatMessage|Failed job"
-msgstr ""
+msgstr "Mislykkede job"
msgid "ChatMessage|Failed stage"
-msgstr ""
+msgstr "Mislykkedes stadie"
msgid "ChatMessage|Invalid CI config YAML file"
-msgstr ""
+msgstr "Ugyldig YAML-fil for CI-konfiguration"
msgid "ChatMessage|Pipeline #%{pipeline_id} %{humanized_status} in %{duration}"
-msgstr ""
+msgstr "Pipeline #%{pipeline_id} %{humanized_status} om %{duration}"
msgid "ChatMessage|Pipeline %{pipeline_link} of %{ref_type} %{ref_link} by %{user_combined_name} %{humanized_status}"
-msgstr ""
+msgstr "Pipeline %{pipeline_link} af %{ref_type} %{ref_link} af %{user_combined_name} %{humanized_status}"
msgid "ChatMessage|Tag"
msgstr "Mærkat"
msgid "ChatMessage|and [%{count} more](%{pipeline_failed_jobs_url})"
-msgstr ""
+msgstr "og [%{count} mere](%{pipeline_failed_jobs_url})"
msgid "ChatMessage|has failed"
-msgstr ""
+msgstr "er mislykkede"
msgid "ChatMessage|has passed"
-msgstr ""
+msgstr "er bestået"
msgid "ChatMessage|has passed with warnings"
-msgstr ""
+msgstr "er bestået med advarsler"
msgid "ChatMessage|in %{duration}"
msgstr "om %{duration}"
@@ -6482,25 +6544,25 @@ msgid "Check again"
msgstr "Tjek igen"
msgid "Check feature availability on namespace plan"
-msgstr ""
+msgstr "Tjek tilgængeligheden af funktioner på navnerumsplan"
msgid "Check out, review, and merge locally"
msgstr ""
-msgid "Check the %{docs_link_start}documentation%{docs_link_end}."
-msgstr "Tjek %{docs_link_start}dokumentationen%{docs_link_end}."
-
msgid "Check the current instance configuration "
msgstr ""
msgid "Check the elasticsearch.log file to debug why the migration was halted and make any changes before retrying the migration. When you fix the cause of the failure, click \"Retry migration\", and the migration will be scheduled to be retried in the background."
msgstr ""
+msgid "Check with your administrator."
+msgstr ""
+
msgid "Check your Docker images for known vulnerabilities."
msgstr ""
msgid "Check your Kubernetes cluster images for known vulnerabilities."
-msgstr ""
+msgstr "Tjek dine Kubernetes-klyngeaftryk for kendte sårbarheder."
msgid "Check your source instance permissions."
msgstr ""
@@ -6526,54 +6588,63 @@ msgstr ""
msgid "Checkout"
msgstr ""
-msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 minutes"
+msgid "Checkout|$%{selectedPlanPrice} per 10 GB storage per pack"
msgstr ""
+msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 minutes"
+msgstr "$%{selectedPlanPrice} pr. pakke på 1.000 minutter"
+
msgid "Checkout|$%{selectedPlanPrice} per user per year"
msgstr ""
msgid "Checkout|%d CI minute pack"
msgid_plural "Checkout|%d CI minute packs"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d CI-minutpakke"
+msgstr[1] "%d CI-minutpakker"
msgid "Checkout|%{cardType} ending in %{lastFourDigits}"
-msgstr ""
+msgstr "%{cardType} slutter med %{lastFourDigits}"
msgid "Checkout|%{name}'s CI minutes"
msgstr ""
msgid "Checkout|%{name}'s GitLab subscription"
-msgstr ""
+msgstr "%{name}s GitLab-abonnement"
-msgid "Checkout|%{selectedPlanText} plan"
+msgid "Checkout|%{name}'s storage subscription"
msgstr ""
-msgid "Checkout|%{startDate} - %{endDate}"
-msgstr "%{startDate} - %{endDate}"
+msgid "Checkout|%{quantity} GB of storage"
+msgstr ""
-msgid "Checkout|%{totalCiMinutes} CI minute"
-msgid_plural "Checkout|%{totalCiMinutes} CI minutes"
+msgid "Checkout|%{quantity} storage pack"
+msgid_plural "Checkout|%{quantity} storage packs"
msgstr[0] ""
msgstr[1] ""
+msgid "Checkout|%{selectedPlanText} plan"
+msgstr "%{selectedPlanText}-plan"
+
+msgid "Checkout|%{startDate} - %{endDate}"
+msgstr "%{startDate} - %{endDate}"
+
msgid "Checkout|%{totalCiMinutes} CI minutes"
-msgstr ""
+msgstr "%{totalCiMinutes} CI-minutter"
msgid "Checkout|(may be %{linkStart}charged upon purchase%{linkEnd})"
msgstr ""
msgid "Checkout|(x%{numberOfUsers})"
-msgstr ""
+msgstr "(x%{numberOfUsers})"
msgid "Checkout|(x%{quantity})"
-msgstr ""
+msgstr "(x%{quantity})"
msgid "Checkout|Billing address"
msgstr ""
msgid "Checkout|CI minute pack"
-msgstr ""
+msgstr "CI-minutpakke"
msgid "Checkout|CI minute packs are only used after you've used your subscription's monthly quota. The additional minutes will roll over month to month and are valid for one year."
msgstr ""
@@ -6591,10 +6662,10 @@ msgid "Checkout|Confirming..."
msgstr "Bekræfter ..."
msgid "Checkout|Continue to billing"
-msgstr ""
+msgstr "Fortsæt til opkrævning"
msgid "Checkout|Continue to payment"
-msgstr ""
+msgstr "Fortsæt til betaling"
msgid "Checkout|Country"
msgstr "Land"
@@ -6603,7 +6674,7 @@ msgid "Checkout|Create a new group"
msgstr "Opret en ny gruppe"
msgid "Checkout|Credit card form failed to load. Please try again."
-msgstr ""
+msgstr "Kreditkortformular kunne ikke indlæses. Prøv venligst igen."
msgid "Checkout|Credit card form failed to load: %{message}"
msgstr ""
@@ -6615,21 +6686,24 @@ msgid "Checkout|Exp %{expirationMonth}/%{expirationYear}"
msgstr ""
msgid "Checkout|Failed to confirm your order! Please try again."
-msgstr ""
+msgstr "Kunne ikke bekræfte din bestilling! Prøv venligst igen."
msgid "Checkout|Failed to confirm your order: %{message}. Please try again."
-msgstr ""
+msgstr "Kunne ikke bekræfte din bestilling: %{message}. Prøv venligst igen."
msgid "Checkout|Failed to load countries. Please try again."
msgstr "Kunne ikke indlæse lande. Prøv venligst igen."
msgid "Checkout|Failed to load states. Please try again."
-msgstr ""
+msgstr "Kunne ikke indlæse tilstande. Prøv venligst igen."
msgid "Checkout|Failed to load the payment form. Please try again."
-msgstr ""
+msgstr "Kunne ikke indlæse betalingsformularen. Prøv venligst igen."
msgid "Checkout|Failed to register credit card. Please try again."
+msgstr "Kunne ikke registrere kreditkort. Prøv venligst igen."
+
+msgid "Checkout|GB"
msgstr ""
msgid "Checkout|GitLab group"
@@ -6660,13 +6734,16 @@ msgid "Checkout|Please select a state"
msgstr "Vælg venligst en stat"
msgid "Checkout|Purchase details"
-msgstr ""
+msgstr "Købsdetaljer"
msgid "Checkout|Select"
msgstr "Vælg"
msgid "Checkout|State"
-msgstr "Stat"
+msgstr "Tilstand"
+
+msgid "Checkout|Storage packs"
+msgstr ""
msgid "Checkout|Street address"
msgstr ""
@@ -6675,18 +6752,21 @@ msgid "Checkout|Submitting the credit card form failed with code %{errorCode}: %
msgstr ""
msgid "Checkout|Subscription details"
-msgstr ""
+msgstr "Abonnementsdetaljer"
msgid "Checkout|Subtotal"
msgstr ""
msgid "Checkout|Tax"
-msgstr ""
+msgstr "Afgift"
msgid "Checkout|Total"
msgstr "I alt"
msgid "Checkout|Total minutes: %{quantity}"
+msgstr "Minutter i alt: %{quantity}"
+
+msgid "Checkout|Total storage: %{quantity} GB"
msgstr ""
msgid "Checkout|Users"
@@ -6696,28 +6776,37 @@ msgid "Checkout|You'll create your new group after checkout"
msgstr ""
msgid "Checkout|Your organization"
+msgstr "Din organisation"
+
+msgid "Checkout|Your storage subscription has the same term as your main subscription, and the price is prorated accordingly."
msgstr ""
msgid "Checkout|Your subscription will be applied to this group"
-msgstr ""
+msgstr "Dit abonnement vil blive anvendt på gruppen"
msgid "Checkout|Zip code"
msgstr "Postnummer"
+msgid "Checkout|a storage subscription"
+msgstr ""
+
msgid "Checkout|company or team"
msgstr "virksomhed eller team"
-msgid "Checkout|x 1,000 minutes per pack = %{strong}"
+msgid "Checkout|minutes"
+msgstr ""
+
+msgid "Checkout|x %{quantity} %{units} per pack ="
msgstr ""
msgid "Cherry-pick this commit"
msgstr "Cherry-pick committen"
msgid "Cherry-pick this merge request"
-msgstr ""
+msgstr "Cherry-pick sammenlægningsanmodningen"
msgid "Child"
-msgstr ""
+msgstr "Barn"
msgid "Child epic does not exist."
msgstr "Underepicen findes ikke."
@@ -6732,7 +6821,7 @@ msgid "Choose File..."
msgstr "Vælg fil ..."
msgid "Choose a branch/tag (e.g. %{branch}) or enter a commit (e.g. %{sha}) to see what's changed or to create a merge request."
-msgstr ""
+msgstr "Vælg en gren/mærkat (f.eks. %{branch}) eller indtast en commit (f.eks. %{sha}) for at se hvad der er ændret eller for at oprette en sammenlægningsanmodning."
msgid "Choose a file"
msgstr "Vælg en fil"
@@ -6771,10 +6860,10 @@ msgid "Choose the preferred Runner and populate the AWS CFT."
msgstr ""
msgid "Choose the top-level group for your repository imports."
-msgstr ""
+msgstr "Vælg topniveaugruppen for dine depotimporter."
msgid "Choose visibility level, enable/disable project features and their permissions, disable email notifications, and show default award emoji."
-msgstr ""
+msgstr "Vælg synlighedsniveau, aktivér/deaktivér projektfunktioner og deres tilladelser, deaktivér e-mail-underretninger og vis standardbelønningsemoji."
msgid "Choose what content you want to see on a group’s overview page."
msgstr "Vælg hvilket indhold du vil se på en gruppes oversigtsside."
@@ -6786,7 +6875,7 @@ msgid "Choose which repositories you want to connect and run CI/CD pipelines."
msgstr ""
msgid "Choose your framework"
-msgstr ""
+msgstr "Vælg dit framework"
msgid "CiCdAnalytics|Date range: %{range}"
msgstr ""
@@ -6801,7 +6890,7 @@ msgid "CiStatusLabel|delayed"
msgstr "forsinket"
msgid "CiStatusLabel|failed"
-msgstr "mislykkedes"
+msgstr "mislykket"
msgid "CiStatusLabel|manual action"
msgstr "manuel handling"
@@ -6843,7 +6932,7 @@ msgid "CiStatusText|delayed"
msgstr "forsinket"
msgid "CiStatusText|failed"
-msgstr "mislykkedes"
+msgstr "mislykket"
msgid "CiStatusText|manual"
msgstr "manuelt"
@@ -6867,7 +6956,7 @@ msgid "CiStatus|running"
msgstr "kører"
msgid "CiVariables|Cannot use Masked Variable with current value"
-msgstr ""
+msgstr "Kan ikke bruge maskeret variabel med nuværende værdi"
msgid "CiVariables|Environments"
msgstr "Miljøer"
@@ -6885,7 +6974,7 @@ msgid "CiVariables|Masked"
msgstr "Maskeret"
msgid "CiVariables|Protected"
-msgstr ""
+msgstr "Beskyttede"
msgid "CiVariables|Remove variable"
msgstr "Fjern variabel"
@@ -6900,7 +6989,7 @@ msgid "CiVariables|Specify variable values to be used in this run. The values sp
msgstr ""
msgid "CiVariables|State"
-msgstr ""
+msgstr "Tilstand"
msgid "CiVariables|Type"
msgstr "Type"
@@ -6933,13 +7022,13 @@ msgid "CiVariable|Search environments"
msgstr "Søg i miljøer"
msgid "CiVariable|Toggle masked"
-msgstr ""
+msgstr "Maskeret til/fra"
msgid "CiVariable|Toggle protected"
-msgstr ""
+msgstr "Beskyttet til/fra"
msgid "Classification Label (optional)"
-msgstr ""
+msgstr "Klassifikationsetiket (valgfrit)"
msgid "ClassificationLabelUnavailable|is unavailable: %{reason}"
msgstr "er utilgængelig: %{reason}"
@@ -6999,22 +7088,22 @@ msgid "Clears weight."
msgstr "Rydder vægt."
msgid "Click %{link_start}here%{link_end} to view the request."
-msgstr ""
+msgstr "Klik på %{link_start}her%{link_end} for at vise anmodningen."
msgid "Click %{link_to} to view the request."
-msgstr ""
+msgstr "Klik på %{link_to} for at vise anmodningen."
msgid "Click the link below to confirm your email address (%{email})"
-msgstr ""
+msgstr "Klik på linket nedenunder for at bekræfte din e-mailadresse (%{email})"
msgid "Click the link below to confirm your email address."
-msgstr ""
+msgstr "Klik på linket nedenunder for at bekræfte din e-mailadresse."
msgid "Click to expand it."
-msgstr ""
+msgstr "Klik for at udfolde den."
msgid "Click to expand text"
-msgstr ""
+msgstr "Klik for at udfolde tekst"
msgid "Click to hide"
msgstr "Klik for at skjule"
@@ -7038,10 +7127,10 @@ msgid "Clients"
msgstr "Klienter"
msgid "Clone"
-msgstr ""
+msgstr "Klon"
msgid "Clone repository"
-msgstr ""
+msgstr "Klon depot"
msgid "Clone this issue"
msgstr "Klon problemstillingen"
@@ -7059,16 +7148,19 @@ msgid "Clone with SSH"
msgstr "Klon med SSH"
msgid "CloneIssue|Cannot clone issue due to insufficient permissions!"
-msgstr ""
+msgstr "Kan ikke klone problemstilling pga. utilstrækkelige tilladelser!"
msgid "CloneIssue|Cannot clone issue to target project as it is pending deletion."
msgstr ""
-msgid "Cloned this issue to %{path_to_project}."
+msgid "CloneIssue|Cannot clone issues of '%{issue_type}' type."
msgstr ""
+msgid "Cloned this issue to %{path_to_project}."
+msgstr "Klonede problemstillingen til %{path_to_project}."
+
msgid "Clones this issue, without comments, to %{project}."
-msgstr ""
+msgstr "Kloner problemstillingen, uden kommentarer, til %{project}."
msgid "Close"
msgstr "Luk"
@@ -7092,16 +7184,16 @@ msgid "Close sidebar"
msgstr "Luk sidebjælke"
msgid "Close this %{quick_action_target}"
-msgstr ""
+msgstr "Luk denne %{quick_action_target}"
msgid "Closed"
msgstr "Lukket"
msgid "Closed %{epicTimeagoDate}"
-msgstr ""
+msgstr "Lukket %{epicTimeagoDate}"
msgid "Closed MRs"
-msgstr ""
+msgstr "Lukkede sammenlægningsanmodninger"
msgid "Closed epics"
msgstr "Lukkede epics"
@@ -7110,31 +7202,34 @@ msgid "Closed issues"
msgstr "Lukkede problemstillinger"
msgid "Closed this %{quick_action_target}."
-msgstr ""
+msgstr "Lukkede denne %{quick_action_target}."
msgid "Closed: %{closed}"
-msgstr ""
+msgstr "Lukket: %{closed}"
msgid "Closes this %{quick_action_target}."
+msgstr "Lukker denne %{quick_action_target}."
+
+msgid "Cloud Functions description and apps that are suitable for this deployment target"
msgstr ""
-msgid "Cloud licenses can not be removed."
+msgid "Cloud Run description and apps that are suitable for this deployment target"
msgstr ""
msgid "Cluster"
msgstr "Klynge"
msgid "Cluster Health"
-msgstr ""
+msgstr "Klyngehelbred"
msgid "Cluster cache cleared."
-msgstr ""
+msgstr "Klyngemellemlager ryddet."
msgid "Cluster does not exist"
msgstr ""
msgid "Cluster is required for Stages::ClusterEndpointInserter"
-msgstr ""
+msgstr "Klynge kræves for Stages::ClusterEndpointInserter"
msgid "Cluster level"
msgstr "Klyngeniveau"
@@ -7143,26 +7238,38 @@ msgid "Cluster type must be specificed for Stages::ClusterEndpointInserter"
msgstr ""
msgid "ClusterAgents|Access tokens"
+msgstr "Adgangstokens"
+
+msgid "ClusterAgents|Agent might not be connected to GitLab"
msgstr ""
-msgid "ClusterAgents|Alternative installation methods"
+msgid "ClusterAgents|Agent never connected to GitLab"
msgstr ""
+msgid "ClusterAgents|Alternative installation methods"
+msgstr "Alternative installationsmetoder"
+
msgid "ClusterAgents|An error occurred while loading your GitLab Agents"
-msgstr ""
+msgstr "Der opstod en fejl under indlæsning af dine GitLab-agenter"
msgid "ClusterAgents|An error occurred while loading your agent"
-msgstr ""
+msgstr "Der opstod en fejl under indlæsning af din agent"
msgid "ClusterAgents|An unknown error occurred. Please try again."
-msgstr ""
+msgstr "Der opstod en ukendt fejl. Prøv venligst igen."
msgid "ClusterAgents|Configuration"
msgstr "Konfiguration"
-msgid "ClusterAgents|Copy token"
+msgid "ClusterAgents|Connected"
msgstr ""
+msgid "ClusterAgents|Connection status"
+msgstr ""
+
+msgid "ClusterAgents|Copy token"
+msgstr "Kopiér token"
+
msgid "ClusterAgents|Created by"
msgstr "Oprettet af"
@@ -7176,27 +7283,36 @@ msgid "ClusterAgents|Description"
msgstr "Beskrivelse"
msgid "ClusterAgents|For alternative installation methods %{linkStart}go to the documentation%{linkEnd}."
+msgstr "%{linkStart}GÃ¥ til dokumentationen%{linkEnd} for alternative installationsmetoder."
+
+msgid "ClusterAgents|For more troubleshooting information go to"
msgstr ""
msgid "ClusterAgents|Go to the repository"
-msgstr ""
+msgstr "GÃ¥ til depotet"
msgid "ClusterAgents|Install a new GitLab Agent"
-msgstr ""
+msgstr "Installer en ny GitLab-agent"
msgid "ClusterAgents|Install new Agent"
-msgstr ""
+msgstr "Installer ny agent"
msgid "ClusterAgents|Integrate Kubernetes with a GitLab Agent"
-msgstr ""
+msgstr "Integrer Kubernetes med en GitLab-agent"
msgid "ClusterAgents|Integrate with the GitLab Agent"
+msgstr "Integrer med GitLab-agenten"
+
+msgid "ClusterAgents|Last connected %{timeAgo}."
msgstr ""
-msgid "ClusterAgents|Last used"
-msgstr "Sidst brugt"
+msgid "ClusterAgents|Last contact"
+msgstr ""
msgid "ClusterAgents|Learn how to create an agent access token"
+msgstr "Lær at oprette en agentadgangstoken"
+
+msgid "ClusterAgents|Make sure you are using a valid token."
msgstr ""
msgid "ClusterAgents|Name"
@@ -7205,25 +7321,34 @@ msgstr "Navn"
msgid "ClusterAgents|Never"
msgstr "Aldrig"
-msgid "ClusterAgents|Read more about getting started"
+msgid "ClusterAgents|Never connected"
msgstr ""
-msgid "ClusterAgents|Recommended installation method"
+msgid "ClusterAgents|Not connected"
msgstr ""
+msgid "ClusterAgents|Read more about getting started"
+msgstr "Læs mere om at komme godt i gang"
+
+msgid "ClusterAgents|Recommended installation method"
+msgstr "Anbefalet installationsmetode"
+
msgid "ClusterAgents|Registering Agent"
-msgstr ""
+msgstr "Registreringsagent"
msgid "ClusterAgents|Registration token"
-msgstr ""
+msgstr "Registreringstoken"
msgid "ClusterAgents|Select an Agent"
-msgstr ""
+msgstr "Vælg en agent"
msgid "ClusterAgents|Select the Agent you want to register with GitLab and install on your cluster. To learn more about the Kubernetes Agent registration process %{linkStart}go to the documentation%{linkEnd}."
msgstr ""
msgid "ClusterAgents|Select which Agent you want to install"
+msgstr "Vælg hvilken agent du vil installere"
+
+msgid "ClusterAgents|The Agent has not been connected in a long time. There might be a connectivity issue. Last contact was %{timeAgo}."
msgstr ""
msgid "ClusterAgents|The GitLab Agent also requires %{linkStart}enabling the Agent Server%{linkEnd}"
@@ -7251,25 +7376,22 @@ msgid "ClusterAgents|Unknown user"
msgstr "Ukendt bruger"
msgid "ClusterAgents|You will need to create a token to connect to your agent"
-msgstr ""
-
-msgid "ClusterAgent|This feature is only available for premium plans"
-msgstr ""
+msgstr "Du skal oprette en token for at oprette forbindelse til din agent"
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
msgid "ClusterAgent|You have insufficient permissions to create a cluster agent for this project"
-msgstr ""
+msgstr "Du har ikke tilstrækkelige tilladelser til at oprette en klyngeagent for projektet"
msgid "ClusterAgent|You have insufficient permissions to delete this cluster agent"
-msgstr ""
+msgstr "Du har ikke tilstrækkelige tilladelser til at slette klyngeagenten"
msgid "ClusterApplicationsRemoved|One-click application management was removed in GitLab 14.0. Your applications are still installed in your cluster, and integrations continue working."
msgstr ""
msgid "ClusterIntegration|%{linkStart}More information%{linkEnd}"
-msgstr ""
+msgstr "%{linkStart}Mere information%{linkEnd}"
msgid "ClusterIntegration|A cluster management project can be used to run deployment jobs with Kubernetes %{code_open}cluster-admin%{code_close} privileges."
msgstr ""
@@ -7278,10 +7400,10 @@ msgid "ClusterIntegration|A service token scoped to %{code}kube-system%{end_code
msgstr ""
msgid "ClusterIntegration|API URL"
-msgstr ""
+msgstr "API-URL"
msgid "ClusterIntegration|API URL should be a valid http/https url."
-msgstr ""
+msgstr "API-URL skal være en gyldig http-/https-URL."
msgid "ClusterIntegration|Add Kubernetes cluster"
msgstr "Tilføj Kubernetes-klynge"
@@ -7290,19 +7412,19 @@ msgid "ClusterIntegration|Add a Kubernetes cluster integration"
msgstr "Tilføj en integrering af Kubernetes-klynge"
msgid "ClusterIntegration|Adding a Kubernetes cluster to your group will automatically share the cluster across all your projects. Use review apps, deploy your applications, and easily run your pipelines for all projects using the same cluster."
-msgstr "Tilføjelse af en Kubernetes-klynge til din gruppe deler automatisk klyngen på tværs af alle dine projekter. Brug gennemgå programmer, udsend dine programmer og kør nemt dine pipelines til alle projekter med den samme klynge."
+msgstr "Tilføjelse af en Kubernetes-klynge til din gruppe deler automatisk klyngen på tværs af alle dine projekter. Brug kontrol af programmer, udsend dine programmer og kør nemt dine pipelines til alle projekter med den samme klynge."
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 "Tilføjelse af en Kubernetes-klynge deler automatisk klyngen på tværs af alle projekter. Brug gennemgå programmer, udsend dine programmer og kør nemt dine pipelines til alle projekter med den samme klynge."
+msgstr "Tilføjelse af en Kubernetes-klynge deler automatisk klyngen på tværs af alle projekter. Brug kontrol af programmer, udsend dine programmer og kør nemt dine pipelines til alle projekter med den samme klynge."
msgid "ClusterIntegration|Adding an integration to your group will share the cluster across all your projects."
-msgstr ""
+msgstr "Tilføjelse af en integrering til din gruppe vil dele klyngen på tværs af alle dine projekter."
msgid "ClusterIntegration|Adding an integration will share the cluster across all projects."
-msgstr ""
+msgstr "Tilføjelse af en integrering vil dele klyngen på tværs af alle projekter."
msgid "ClusterIntegration|Advanced options on this Kubernetes cluster’s integration"
-msgstr ""
+msgstr "Avancerede valgmuligheder på Kubernetes-klyngens integrering"
msgid "ClusterIntegration|Allow GitLab to manage namespace and service accounts for this cluster. %{linkStart}More information%{linkEnd}"
msgstr ""
@@ -7320,19 +7442,19 @@ msgid "ClusterIntegration|Amazon EKS"
msgstr "Amazon EKS"
msgid "ClusterIntegration|An error occurred when trying to contact the Google Cloud API. Please try again later."
-msgstr "Der opstod en fejl ved forsøg på at kontakte Google Cloud-API'en. Prøv venligst igen senere."
+msgstr "Der opstod en fejl ved forsøg på at kontakte Google Cloud API'en. Prøv venligst igen senere."
msgid "ClusterIntegration|An error occurred while trying to fetch project zones: %{error}"
-msgstr ""
+msgstr "Der opstod en fejl under forsøg på at hente projektzoner: %{error}"
msgid "ClusterIntegration|An error occurred while trying to fetch your projects: %{error}"
msgstr "Der opstod en fejl under forsøg på at hente dine projekter: %{error}"
msgid "ClusterIntegration|An error occurred while trying to fetch zone machine types: %{error}"
-msgstr ""
+msgstr "Der opstod en fejl under forsøg på at hente zonemaskintyper: %{error}"
msgid "ClusterIntegration|An unknown error occurred while attempting to connect to Kubernetes."
-msgstr ""
+msgstr "Der opstod en ukendt fejl under forsøg på at oprette forbindelse til Kubernetes."
msgid "ClusterIntegration|Any project namespaces"
msgstr ""
@@ -7350,7 +7472,7 @@ msgid "ClusterIntegration|Authentication Error"
msgstr "Fejl ved godkendelse"
msgid "ClusterIntegration|Base domain"
-msgstr ""
+msgstr "Grunddomæne"
msgid "ClusterIntegration|CA Certificate"
msgstr "CA-certifikat"
@@ -7359,7 +7481,7 @@ msgid "ClusterIntegration|Certificate Authority bundle (PEM format)"
msgstr ""
msgid "ClusterIntegration|Check your CA certificate"
-msgstr ""
+msgstr "Tjek dit CA-certifikat"
msgid "ClusterIntegration|Check your cluster status"
msgstr "Tjek din klyngestatus"
@@ -7380,10 +7502,10 @@ msgid "ClusterIntegration|Choose which of your environments will use this cluste
msgstr ""
msgid "ClusterIntegration|Clear cluster cache"
-msgstr ""
+msgstr "Ryd klyngemellemlager"
msgid "ClusterIntegration|Clear the local cache of namespace and service accounts."
-msgstr ""
+msgstr "Ryd det lokale mellemlager af navnerum og tjenestekontoer."
msgid "ClusterIntegration|Cluster Region"
msgstr ""
@@ -7392,7 +7514,7 @@ msgid "ClusterIntegration|Cluster management project"
msgstr ""
msgid "ClusterIntegration|Cluster name is required."
-msgstr ""
+msgstr "Klyngenavn kræves."
msgid "ClusterIntegration|Clusters are utilized by selecting the nearest ancestor with a matching environment scope. For example, project clusters will override group clusters. %{linkStart}More information%{linkEnd}"
msgstr ""
@@ -7419,25 +7541,25 @@ msgid "ClusterIntegration|Copy Kubernetes cluster name"
msgstr "Kopiér Kubernetes-klyngenavn"
msgid "ClusterIntegration|Could not load IAM roles"
-msgstr ""
+msgstr "Kunne ikke indlæse IAM-roller"
msgid "ClusterIntegration|Could not load Key Pairs"
-msgstr ""
+msgstr "Kunne ikke indlæse nøglepar"
msgid "ClusterIntegration|Could not load VPCs for the selected region"
-msgstr ""
+msgstr "Kunne ikke indlæse VPC'er for den valgte region"
msgid "ClusterIntegration|Could not load instance types"
-msgstr ""
+msgstr "Kunne ikke indlæse instanstyper"
msgid "ClusterIntegration|Could not load networks"
-msgstr ""
+msgstr "Kunne ikke indlæse netværk"
msgid "ClusterIntegration|Could not load security groups for the selected VPC"
-msgstr ""
+msgstr "Kunne ikke indlæse sikkerhedsgrupper for den valgte VPC"
msgid "ClusterIntegration|Could not load subnets for the selected VPC"
-msgstr ""
+msgstr "Kunne ikke indlæse undernet for den valgte VPC"
msgid "ClusterIntegration|Could not load subnetworks"
msgstr ""
@@ -7445,26 +7567,23 @@ msgstr ""
msgid "ClusterIntegration|Create Kubernetes cluster"
msgstr "Opret Kubernetes-klynge"
-msgid "ClusterIntegration|Create a provision role on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the account and external ID above. %{startMoreInfoLink}More information%{endLink}"
-msgstr ""
-
msgid "ClusterIntegration|Create cluster on"
-msgstr ""
+msgstr "Opret klynge på"
msgid "ClusterIntegration|Create new cluster"
-msgstr ""
+msgstr "Opret ny klynge"
msgid "ClusterIntegration|Create new cluster on EKS"
-msgstr ""
+msgstr "Opret ny klynge på EKS"
msgid "ClusterIntegration|Create new cluster on GKE"
-msgstr ""
+msgstr "Opret ny klynge på GKE"
msgid "ClusterIntegration|Creating Kubernetes cluster"
-msgstr ""
+msgstr "Opretter Kubernetes-klynge"
msgid "ClusterIntegration|Deletes all GitLab resources attached to this cluster during removal"
-msgstr ""
+msgstr "Sletter alle GitLab-ressourcer som er vedhæftet til klyngen under fjernelse"
msgid "ClusterIntegration|Deploy each environment to its own namespace. Otherwise, environments within a project share a project-wide namespace. Note that anyone who can trigger a deployment of a namespace can read its secrets. If modified, existing environments will use their current namespaces until the cluster cache is cleared."
msgstr ""
@@ -7473,7 +7592,7 @@ msgid "ClusterIntegration|Deploy each environment to its own namespace. Otherwis
msgstr ""
msgid "ClusterIntegration|Did you know?"
-msgstr ""
+msgstr "Vidste du det?"
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
@@ -7494,7 +7613,7 @@ msgid "ClusterIntegration|Enable this setting if using role-based access control
msgstr "Aktivér indstillingen, hvis du bruger rollebaseret adgangsstyring (RBAC)."
msgid "ClusterIntegration|Enter new Service Token"
-msgstr ""
+msgstr "Indtast ny tjenestetoken"
msgid "ClusterIntegration|Enter the details for your Amazon EKS Kubernetes cluster"
msgstr ""
@@ -7512,7 +7631,7 @@ msgid "ClusterIntegration|Every new Google Cloud Platform (GCP) account receives
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 ""
+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}"
@@ -7524,7 +7643,7 @@ msgid "ClusterIntegration|Failed to request to Google Cloud Platform: %{message}
msgstr ""
msgid "ClusterIntegration|Failed to run Kubeclient: %{message}"
-msgstr ""
+msgstr "Kunne ikke køre Kubeclient: %{message}"
msgid "ClusterIntegration|Fetching machine types"
msgstr "Henter maskintyper"
@@ -7545,7 +7664,7 @@ msgid "ClusterIntegration|GitLab failed to authenticate."
msgstr ""
msgid "ClusterIntegration|GitLab failed to connect to the cluster."
-msgstr ""
+msgstr "GitLab kunne ikke oprette forbindelse til klyngen."
msgid "ClusterIntegration|GitLab-managed cluster"
msgstr ""
@@ -7590,10 +7709,10 @@ msgid "ClusterIntegration|Integrate with a cluster certificate"
msgstr ""
msgid "ClusterIntegration|Integration disabled"
-msgstr ""
+msgstr "Integrering deaktiveret"
msgid "ClusterIntegration|Integration enabled"
-msgstr ""
+msgstr "Integrering aktiveret"
msgid "ClusterIntegration|Integrations allow you to use applications installed in your cluster as part of your GitLab workflow."
msgstr ""
@@ -7608,10 +7727,10 @@ msgid "ClusterIntegration|Kubernetes cluster name"
msgstr "Kubernetes-klyngenavn"
msgid "ClusterIntegration|Kubernetes cluster was successfully created."
-msgstr ""
+msgstr "Kubernetes-klynge blev oprettet."
msgid "ClusterIntegration|Kubernetes clusters allow you to use review apps, deploy your applications, run your pipelines, and much more in an easy way."
-msgstr "Kubernetes-klynger giver mulighed for at bruge gennemgå programmer, udsend dine programmer, kør dine pipelines og meget mere på en nem måde."
+msgstr "Kubernetes-klynger giver mulighed for at bruge kontrol af programmer, udsend dine programmer, kør dine pipelines og meget mere på en nem måde."
msgid "ClusterIntegration|Kubernetes version"
msgstr ""
@@ -7629,7 +7748,7 @@ msgid "ClusterIntegration|Learn more about Kubernetes"
msgstr "Lær mere om Kubernetes"
msgid "ClusterIntegration|Learn more about group Kubernetes clusters"
-msgstr ""
+msgstr "Lær mere om gruppe-Kubernetes-klynger"
msgid "ClusterIntegration|Learn more about instance Kubernetes clusters"
msgstr ""
@@ -7650,13 +7769,13 @@ msgid "ClusterIntegration|Loading networks"
msgstr "Indlæser netværk"
msgid "ClusterIntegration|Loading security groups"
-msgstr ""
+msgstr "Indlæser sikkerhedsgrupper"
msgid "ClusterIntegration|Loading subnets"
msgstr ""
msgid "ClusterIntegration|Loading subnetworks"
-msgstr ""
+msgstr "Indlæser undernetværk"
msgid "ClusterIntegration|Machine type"
msgstr "Maskintype"
@@ -7665,7 +7784,7 @@ msgid "ClusterIntegration|Make sure your API endpoint is correct"
msgstr ""
msgid "ClusterIntegration|Make sure your account %{link_to_requirements} to create Kubernetes clusters"
-msgstr "Sørg for, at din konto %{link_to_requirements} for at oprette Kubernetes-klynger"
+msgstr "Sørg for at din konto %{link_to_requirements} for at oprette Kubernetes-klynger"
msgid "ClusterIntegration|Manage your Kubernetes cluster by visiting %{provider_link}"
msgstr ""
@@ -7698,7 +7817,7 @@ msgid "ClusterIntegration|No projects matched your search"
msgstr "Ingen projekter passede til din søgning"
msgid "ClusterIntegration|No security group found"
-msgstr ""
+msgstr "Ingen sikkerhedsgruppe fundet"
msgid "ClusterIntegration|No subnet found"
msgstr ""
@@ -7722,13 +7841,13 @@ msgid "ClusterIntegration|Please enter access information for your Kubernetes cl
msgstr ""
msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:"
-msgstr "Sørg for, at din Google-konto opfylder følgende krav:"
+msgstr "Sørg for at din Google-konto opfylder følgende krav:"
msgid "ClusterIntegration|Project cluster"
msgstr "Projektklynge"
msgid "ClusterIntegration|Project namespace (optional, unique)"
-msgstr "Projektnavneområde (valgfrit, unikt)"
+msgstr "Projektnavnerummet (valgfrit, unikt)"
msgid "ClusterIntegration|Project namespace prefix (optional, unique)"
msgstr ""
@@ -7743,7 +7862,7 @@ msgid "ClusterIntegration|RBAC-enabled cluster"
msgstr "RBAC-aktiveret klynge"
msgid "ClusterIntegration|Read our %{linkStart}help page%{linkEnd} on Kubernetes cluster integration."
-msgstr ""
+msgstr "Læs vores %{linkStart}hjælpeside%{linkEnd} om Kubernetes-klyngeintegrering."
msgid "ClusterIntegration|Read our %{link_start}help page%{link_end} on Kubernetes cluster integration."
msgstr ""
@@ -7758,10 +7877,10 @@ msgid "ClusterIntegration|Remove integration and resources"
msgstr ""
msgid "ClusterIntegration|Remove integration and resources?"
-msgstr ""
+msgstr "Fjern integrering og ressourcer?"
msgid "ClusterIntegration|Remove integration?"
-msgstr ""
+msgstr "Fjern integrering?"
msgid "ClusterIntegration|Remove this Kubernetes cluster's configuration from this project. This will not delete your actual Kubernetes cluster."
msgstr "Fjern Kubernetes-klyngens konfiguration fra projektet. Det sletter ikke selve Kubernetes-klyngen."
@@ -7782,7 +7901,7 @@ msgid "ClusterIntegration|Search VPCs"
msgstr ""
msgid "ClusterIntegration|Search instance types"
-msgstr ""
+msgstr "Søg efter instanstyper"
msgid "ClusterIntegration|Search machine types"
msgstr "Søg efter maskintyper"
@@ -7812,7 +7931,7 @@ msgid "ClusterIntegration|See and edit the details for your Kubernetes cluster"
msgstr "Se og rediger detaljerne til din Kubernetes-klynge"
msgid "ClusterIntegration|Select a VPC to choose a security group"
-msgstr ""
+msgstr "Vælg en VPC for at vælge en sikkerhedsgruppe"
msgid "ClusterIntegration|Select a VPC to choose a subnet"
msgstr ""
@@ -7821,7 +7940,7 @@ msgid "ClusterIntegration|Select a VPC to use for your EKS Cluster resources. To
msgstr ""
msgid "ClusterIntegration|Select a network to choose a subnetwork"
-msgstr ""
+msgstr "Vælg et netværk for at vælge et undernetværk"
msgid "ClusterIntegration|Select a region to choose a Key Pair"
msgstr ""
@@ -7869,10 +7988,10 @@ msgid "ClusterIntegration|Set a prefix for your namespaces. If not set, defaults
msgstr ""
msgid "ClusterIntegration|Something went wrong on our end."
-msgstr "Noget gik galt i vores ende."
+msgstr "Noget gik galt hos os."
msgid "ClusterIntegration|Something went wrong while creating your Kubernetes cluster"
-msgstr ""
+msgstr "Noget gik galt under oprettelse af din Kubernetes-klynge"
msgid "ClusterIntegration|Specifying a domain will allow you to use Auto Review Apps and Auto Deploy stages for %{linkStart}Auto DevOps.%{linkEnd} The domain should have a wildcard DNS configured matching the domain. "
msgstr ""
@@ -7880,7 +7999,7 @@ msgstr ""
msgid "ClusterIntegration|Subnets"
msgstr ""
-msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provisioned role, first create one on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the above account and external IDs. %{startMoreInfoLink}More information%{endLink}"
+msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provisioned role, first create one on %{awsLinkStart}Amazon Web Services %{awsLinkEnd} using the above account and external IDs. %{moreInfoStart}More information%{moreInfoEnd}"
msgstr ""
msgid "ClusterIntegration|The Kubernetes certificate used to authenticate to the cluster."
@@ -7953,19 +8072,19 @@ msgid "ClusterIntegration|Validating project billing status"
msgstr ""
msgid "ClusterIntegration|We could not verify that one of your projects on GCP has billing enabled. Please try again."
-msgstr ""
+msgstr "Vi kunne ikke verificere at et af dine projekter på GCP har fakturering aktiveret. Prøv venligst igen."
msgid "ClusterIntegration|We were unable to fetch any projects. Ensure that you have a project on %{docsLinkStart}Google Cloud Platform%{docsLinkEnd}."
msgstr ""
msgid "ClusterIntegration|With a Kubernetes cluster associated to this project, you can use review apps, deploy your applications, run your pipelines, and much more in an easy way."
-msgstr "Med en Kubernetes-klynge tilknyttet til projektet, kan du bruge gennemgå programmer, udsend dine programmer, kør dine pipelines og meget mere på en nem måde."
+msgstr "Med en Kubernetes-klynge tilknyttet til projektet, kan du bruge kontrol af programmer, udsend dine programmer, kør dine pipelines og meget mere på en nem måde."
msgid "ClusterIntegration|You are about to remove your cluster integration and all GitLab-created resources associated with this cluster."
msgstr ""
msgid "ClusterIntegration|You are about to remove your cluster integration."
-msgstr ""
+msgstr "Du er ved at fjerne din klyngeintegrering."
msgid "ClusterIntegration|You must grant access to your organization’s AWS resources in order to create a new EKS cluster. To grant access, create a provision role using the account and external ID below and provide us the ARN."
msgstr ""
@@ -8007,7 +8126,7 @@ msgid "ClusterIntergation|Select a subnet"
msgstr ""
msgid "ClusterIntergation|Select a subnetwork"
-msgstr ""
+msgstr "Vælg et undernetværk"
msgid "ClusterIntergation|Select an instance type"
msgstr "Vælg en instanstype"
@@ -8016,10 +8135,10 @@ msgid "ClusterIntergation|Select key pair"
msgstr "Vælg et nøglepar"
msgid "ClusterIntergation|Select service role"
-msgstr ""
+msgstr "Vælg tjenesterolle"
msgid "Clusters|An error occurred while loading clusters"
-msgstr ""
+msgstr "Der opstod en fejl under indlæsning af klynger"
msgid "Code"
msgstr "Kode"
@@ -8031,10 +8150,10 @@ msgid "Code Coverage: %{coveragePercentage}%{percentSymbol}"
msgstr "Kodedækning: %{coveragePercentage} %{percentSymbol}"
msgid "Code Coverage| Empty code coverage data"
-msgstr ""
+msgstr " Tom kodedækningsdata"
msgid "Code Coverage|Couldn't fetch the code coverage data"
-msgstr ""
+msgstr "Kunne ikke hente kodedækningsdataene"
msgid "Code Owner"
msgstr "Kodeejer"
@@ -8049,7 +8168,7 @@ msgid "Code Review"
msgstr "Kodekontrol"
msgid "Code Review Analytics displays a table of open merge requests considered to be in code review. There are currently no merge requests in review for this project and/or filters."
-msgstr ""
+msgstr "Kodekontrolanalyse viser en tabel over åbne sammenlægningsanmodninger, som anses for at være under kodekontrol. Der er i øjeblikket ingen sammenlægningsanmodninger under kontrol for projektet og/eller filtrene."
msgid "Code coverage statistics for %{ref} %{start_date} - %{end_date}"
msgstr ""
@@ -8064,10 +8183,10 @@ msgid "Code review"
msgstr "Kodekontrol"
msgid "Code snippet copied. Insert it in the correct location in the YAML file."
-msgstr ""
+msgstr "Kodeudklip kopieret. Indsæt det på den korrekte placering i YAML-filen."
msgid "CodeIntelligence|This is the definition"
-msgstr ""
+msgstr "Dette er definitionen"
msgid "CodeNavigation|No references found"
msgstr ""
@@ -8114,6 +8233,9 @@ msgstr "Sammenfold milepæle"
msgid "Collapse replies"
msgstr "Sammenfold svar"
+msgid "Collapse settings section"
+msgstr ""
+
msgid "Collapse sidebar"
msgstr "Sammenfold sidebjælke"
@@ -8130,6 +8252,9 @@ msgid "ComboSearch is not defined"
msgstr ""
msgid "Comma-separated list of email addresses."
+msgstr "Kommasepareret liste over e-mailadresser."
+
+msgid "Comma-separated list of users allowed to exceed the rate limit."
msgstr ""
msgid "Comma-separated, e.g. '1.1.1.1, 2.2.2.0/24'"
@@ -8142,7 +8267,7 @@ msgid "Command line instructions"
msgstr "Instruktioner for kommandolinje"
msgid "Commands applied"
-msgstr ""
+msgstr "Kommandoer anvendt"
msgid "Commands did not apply"
msgstr ""
@@ -8160,7 +8285,7 @@ msgid "Comment & resolve thread"
msgstr "Kommentér og løs tråd"
msgid "Comment & unresolve thread"
-msgstr ""
+msgstr "Kommentér og genåbn løst tråd"
msgid "Comment '%{label}' position"
msgstr ""
@@ -8172,7 +8297,7 @@ msgid "Comment is being updated"
msgstr "Kommentaren er ved at blive opdateret"
msgid "Comment on lines %{startLine} to %{endLine}"
-msgstr ""
+msgstr "Kommentér på linjerne %{startLine} til %{endLine}"
msgid "Comment/Reply (quoting selected text)"
msgstr ""
@@ -8201,7 +8326,7 @@ msgid "Commit Message"
msgstr "Commit-meddelelse"
msgid "Commit changes"
-msgstr ""
+msgstr "Commit ændringer"
msgid "Commit deleted"
msgstr "Commit slettet"
@@ -8225,7 +8350,7 @@ msgid "CommitMessage|Add %{file_name}"
msgstr "Tilføj %{file_name}"
msgid "CommitMessage|Add %{file_name} and create a code quality job"
-msgstr ""
+msgstr "Tilføj %{file_name} og opret et kodekvalitetsjob"
msgid "CommitWidget|authored"
msgstr "forfattede"
@@ -8234,7 +8359,7 @@ msgid "Commits"
msgstr "Commits"
msgid "Commits feed"
-msgstr ""
+msgstr "Commitfeed"
msgid "Commits per day hour (UTC)"
msgstr ""
@@ -8246,10 +8371,10 @@ msgid "Commits per weekday"
msgstr "Commits pr. ugedag"
msgid "Commits to"
-msgstr ""
+msgstr "Commits til"
msgid "Commits you select appear here. Go to the first tab and select commits to add to this merge request."
-msgstr ""
+msgstr "Her vises commits du vælger. Gå til det første faneblad og vælg commits for at tilføje til sammenlægningsanmodningen."
msgid "Commits|An error occurred while fetching merge requests data."
msgstr "Der opstod en fejl under hentning af data for sammenlægningsanmodninger."
@@ -8267,7 +8392,7 @@ msgid "Commit…"
msgstr "Commit …"
msgid "Community forum"
-msgstr ""
+msgstr "Fællesskabsforum"
msgid "Company"
msgstr "Virksomhed"
@@ -8276,13 +8401,13 @@ msgid "Compare"
msgstr "Sammenlign"
msgid "Compare %{oldCommitId}...%{newCommitId}"
-msgstr ""
+msgstr "Sammenlign %{oldCommitId}...%{newCommitId}"
msgid "Compare Git revisions"
msgstr "Sammenlign Git-revisioner"
msgid "Compare GitLab editions"
-msgstr ""
+msgstr "Sammenlign GitLab-udgaver"
msgid "Compare Revisions"
msgstr "Sammenlign revisioner"
@@ -8303,7 +8428,7 @@ msgid "Compare with previous version"
msgstr "Sammenlign med forrige version"
msgid "CompareBranches|%{source_branch} and %{target_branch} are the same."
-msgstr ""
+msgstr "%{source_branch} og %{target_branch} er ens."
msgid "CompareBranches|There isn't anything to compare."
msgstr "Der er intet at sammenligne."
@@ -8345,7 +8470,7 @@ msgid "CompareRevisions|There was an error while updating the branch/tag list. P
msgstr "Der opstod en fejl under opdatering af gren-/mærkatlisten. Prøv venligst igen."
msgid "CompareRevisions|View open merge request"
-msgstr ""
+msgstr "Vis åben sammenlægningsanmodning"
msgid "Complete"
msgstr "Fuldført"
@@ -8360,55 +8485,55 @@ msgid "Compliance Dashboard"
msgstr "Overholdelsesbetjeningspanel"
msgid "Compliance framework"
-msgstr ""
+msgstr "Overholdelsesframework"
msgid "ComplianceDashboard|created by:"
-msgstr ""
+msgstr "oprettet af:"
msgid "ComplianceFrameworks|Add framework"
-msgstr ""
+msgstr "Tilføj framework"
msgid "ComplianceFrameworks|Combines with the CI configuration at runtime."
msgstr ""
msgid "ComplianceFrameworks|Compliance framework deleted successfully"
-msgstr ""
+msgstr "Overholdelsesframework slettet"
msgid "ComplianceFrameworks|Compliance pipeline configuration location (optional)"
msgstr ""
msgid "ComplianceFrameworks|Could not find this configuration location, please try a different location"
-msgstr ""
+msgstr "Kunne ikke finde konfigurationsplaceringen. Prøv venligst en anden placering"
msgid "ComplianceFrameworks|Delete compliance framework %{framework}"
-msgstr ""
+msgstr "Slet overholdelsesframeworket %{framework}"
msgid "ComplianceFrameworks|Delete framework"
-msgstr ""
+msgstr "Slet framework"
msgid "ComplianceFrameworks|Edit framework"
-msgstr ""
+msgstr "Rediger framework"
msgid "ComplianceFrameworks|Error deleting the compliance framework. Please try again"
-msgstr ""
+msgstr "Fejl ved sletning af overholdelsesframeworket. Prøv venligst igen"
msgid "ComplianceFrameworks|Error fetching compliance frameworks data. Please refresh the page"
-msgstr ""
+msgstr "Fejl ved hentning af overholdelsesframeworkdata. Opdater venligst siden"
msgid "ComplianceFrameworks|Error fetching compliance frameworks data. Please refresh the page or try a different framework"
-msgstr ""
+msgstr "Fejl ved hentning af overholdelsesframeworkdata. Opdater venligst siden eller prøv et andet framework"
msgid "ComplianceFrameworks|Invalid format: it should follow the format [PATH].y(a)ml@[GROUP]/[PROJECT]"
-msgstr ""
+msgstr "Ugyldigt format: det skal følge formatet [STI].y(a)ml@[GRUPPE]/[PROJEKT]"
msgid "ComplianceFrameworks|Once a compliance framework is added it will appear here."
-msgstr ""
+msgstr "Når et overholdelsesframework er tilføjet, så vises det her."
msgid "ComplianceFrameworks|There are no compliance frameworks set up yet"
-msgstr ""
+msgstr "Der er ikke opsat nogle overholdelsesframeworks endnu"
msgid "ComplianceFrameworks|Unable to save this compliance framework. Please try again"
-msgstr ""
+msgstr "Kan ikke gemme overholdelsesframeworket. Prøv venligst igen"
msgid "ComplianceFrameworks|Use %{codeStart}::%{codeEnd} to create a %{linkStart}scoped set%{linkEnd} (eg. %{codeStart}SOX::AWS%{codeEnd})"
msgstr ""
@@ -8420,16 +8545,16 @@ msgid "ComplianceFrameworks|e.g. include-gitlab.ci.yml@group-name/project-name"
msgstr ""
msgid "ComplianceFramework|Edit Compliance Framework"
-msgstr ""
+msgstr "Rediger overholdelsesframework"
msgid "ComplianceFramework|New Compliance Framework"
-msgstr ""
+msgstr "Nyt overholdelsesframework"
msgid "Component"
msgstr "Komponent"
msgid "Confidence"
-msgstr ""
+msgstr "Selvtillid"
msgid "Confidential"
msgstr "Fortroligt"
@@ -8441,7 +8566,7 @@ msgid "Configuration"
msgstr "Konfiguration"
msgid "Configuration help"
-msgstr ""
+msgstr "Konfigurationshjælp"
msgid "Configure %{italic_start}What's new%{italic_end} drawer and content."
msgstr ""
@@ -8450,55 +8575,55 @@ msgid "Configure %{link} to track events. %{link_start}Learn more.%{link_end}"
msgstr ""
msgid "Configure %{repository_checks_link_start}repository checks%{link_end} and %{housekeeping_link_start}housekeeping%{link_end} on repositories."
+msgstr "Konfigurer %{repository_checks_link_start}depottjek%{link_end} og %{housekeeping_link_start}husarbejde%{link_end} på depoter."
+
+msgid "Configure CAPTCHAs, IP address limits, and other anti-spam measures."
msgstr ""
msgid "Configure Dependency Scanning in `.gitlab-ci.yml` using the GitLab managed template. You can [add variable overrides](https://docs.gitlab.com/ee/user/application_security/dependency_scanning/#customizing-the-dependency-scanning-settings) to customize Dependency Scanning settings."
-msgstr ""
+msgstr "Konfigurer afhængighedsskanning i `.gitlab-ci.yml` med den GitLab-håndterede skabelon. Du kan [tilføje variabeltilsidesættelser](https://docs.gitlab.com/ee/user/application_security/dependency_scanning/#customizing-the-dependency-scanning-settings) for at tilpasse indstillinger for afhængighedsskanning."
msgid "Configure Dependency Scanning in `.gitlab-ci.yml`, creating this file if it does not already exist"
msgstr ""
msgid "Configure GitLab runners to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
-msgstr "Konfigurer GitLab-runners for at komme i gang med at bruge Web Terminal. %{helpStart}Lær mere%{helpEnd}."
+msgstr "Konfigurer GitLab-runnere for at komme i gang med webterminal. %{helpStart}Lær mere%{helpEnd}."
msgid "Configure Gitaly timeouts."
msgstr "Konfigurer Gitaly-timeouts."
msgid "Configure Integrations"
-msgstr ""
+msgstr "Konfigurer integreringer"
msgid "Configure Prometheus"
-msgstr ""
+msgstr "Konfigurer Prometheus"
msgid "Configure SAST in `.gitlab-ci.yml` using the GitLab managed template. You can [add variable overrides](https://docs.gitlab.com/ee/user/application_security/sast/#customizing-the-sast-settings) to customize SAST settings."
-msgstr ""
+msgstr "Konfigurer SAST i `.gitlab-ci.yml` med den GitLab-håndterede skabelon. Du kan [tilføje variabeltilsidesættelser](https://docs.gitlab.com/ee/user/application_security/sast/#customizing-the-sast-settings) for at tilpasse indstillinger for SAST."
msgid "Configure SAST in `.gitlab-ci.yml`, creating this file if it does not already exist"
msgstr ""
msgid "Configure Secret Detection in `.gitlab-ci.yml` using the GitLab managed template. You can [add variable overrides](https://docs.gitlab.com/ee/user/application_security/secret_detection/#customizing-settings) to customize Secret Detection settings."
-msgstr ""
+msgstr "Konfigurer hemmelig registrering i `.gitlab-ci.yml` med den GitLab-håndterede skabelon. Du kan [tilføje variabeltilsidesættelser](https://docs.gitlab.com/ee/user/application_security/secret_detection/#customizing-settings) for at tilpasse indstillinger for hemmelig registrering."
msgid "Configure Secret Detection in `.gitlab-ci.yml`, creating this file if it does not already exist"
msgstr ""
msgid "Configure Tracing"
-msgstr ""
+msgstr "Konfigurer tracing"
msgid "Configure a %{codeStart}.gitlab-webide.yml%{codeEnd} file in the %{codeStart}.gitlab%{codeEnd} directory to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
-msgstr ""
+msgstr "Konfigurer en %{codeStart}.gitlab-webide.yml%{codeEnd}-fil i mappen %{codeStart}.gitlab%{codeEnd} for at komme i gang med webterminal. %{helpStart}Lær mere%{helpEnd}."
-msgid "Configure existing installation"
+msgid "Configure advanced permissions, Large File Storage, and two-factor authentication settings."
msgstr ""
-msgid "Configure limit for notes created per minute by web and API requests."
+msgid "Configure approvals by authors and committers on all projects."
msgstr ""
-msgid "Configure limits for Project/Group Import/Export."
-msgstr ""
-
-msgid "Configure limits for web and API requests."
-msgstr "Konfigurer grænser for web- og API-anmodninger."
+msgid "Configure existing installation"
+msgstr "Konfigurer eksisterende installation"
msgid "Configure paths to be protected by Rack Attack."
msgstr ""
@@ -8512,10 +8637,13 @@ msgstr ""
msgid "Configure settings for Advanced Search with Elasticsearch."
msgstr ""
+msgid "Configure specific limits for Files API requests that supersede the general user and IP rate limits."
+msgstr ""
+
msgid "Configure specific limits for Git LFS requests that supersede the general user and IP rate limits."
msgstr ""
-msgid "Configure specific limits for Packages API requests that supersede the general user and IP rate limits."
+msgid "Configure specific limits for deprecated API requests that supersede the general user and IP rate limits."
msgstr ""
msgid "Configure the %{link} integration."
@@ -8527,6 +8655,9 @@ msgstr ""
msgid "Configure the way a user creates a new account."
msgstr "Konfigurer måden en bruger opretter en ny konto."
+msgid "Configure via Merge Request"
+msgstr ""
+
msgid "Configure which lists are shown for anyone who visits this board"
msgstr ""
@@ -8552,7 +8683,7 @@ msgid "Confirmation required"
msgstr "Bekræftelse kræves"
msgid "Confirmed at:"
-msgstr ""
+msgstr "Bekræftet kl.:"
msgid "Confirmed:"
msgstr "Bekræftet:"
@@ -8570,13 +8701,13 @@ msgid "Conflict: This file was removed in the source branch, but modified in the
msgstr ""
msgid "Conflict: This file was removed in the source branch, but renamed in the target branch."
-msgstr ""
+msgstr "Konflikt: filen blev fjernet i kildegrenen men omdøbt i målgrenen."
msgid "Conflict: This file was renamed differently in the source and target branches."
msgstr ""
msgid "Conflict: This file was renamed in the source branch, but removed in the target branch."
-msgstr ""
+msgstr "Konflikt: filen blev omdøbt i kildegrenen men fjernet i målgrenen."
msgid "Confluence"
msgstr ""
@@ -8639,7 +8770,7 @@ msgid "Consistency guarantee method"
msgstr ""
msgid "Contact support"
-msgstr ""
+msgstr "Kontakt support"
msgid "Container Registry"
msgstr "Beholderregister"
@@ -8651,56 +8782,56 @@ msgid "Container does not exist"
msgstr ""
msgid "Container must be a project or a group."
-msgstr ""
+msgstr "Beholder skal være et projekt eller en gruppe."
msgid "Container registry images"
-msgstr ""
+msgstr "Beholderregisteraftryk"
msgid "Container registry is not enabled on this GitLab instance. Ask an administrator to enable it in order for Auto DevOps to work."
-msgstr ""
+msgstr "Beholderregister er ikke aktiveret på GitLab-instansen. Spørg en administrator om at aktivere den for at få Auto DevOps til at virke."
msgid "Container repositories"
-msgstr ""
+msgstr "Beholderdepoter"
msgid "Container repositories synchronization concurrency limit"
msgstr ""
msgid "Container repository"
-msgstr ""
+msgstr "Beholderdepot"
msgid "ContainerRegistry| Please visit the %{linkStart}administration settings%{linkEnd} to enable this feature."
-msgstr ""
+msgstr " Besøg venligst %{linkStart}administratorindstillingerne%{linkEnd} for at aktivere funktionen."
msgid "ContainerRegistry|%{count} Image repository"
msgid_plural "ContainerRegistry|%{count} Image repositories"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%{count} aftryksdepot"
+msgstr[1] "%{count} aftryksdepoter"
msgid "ContainerRegistry|%{count} Tag"
msgid_plural "ContainerRegistry|%{count} Tags"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%{count} mærkat"
+msgstr[1] "%{count} mærkater"
msgid "ContainerRegistry|%{strongStart}Disabled%{strongEnd} - Tags will not be automatically deleted."
-msgstr ""
+msgstr "%{strongStart}Deaktiveret%{strongEnd} - mærkater slettes ikke automatisk."
msgid "ContainerRegistry|%{strongStart}Enabled%{strongEnd} - Tags that match the rules on this page are automatically scheduled for deletion."
-msgstr ""
+msgstr "%{strongStart}Aktiveret%{strongEnd} - mærkater som matcher reglerne på siden planlægges automatisk til sletning."
msgid "ContainerRegistry|%{title} was successfully scheduled for deletion"
-msgstr ""
+msgstr "%{title} blev planlagt til sletning"
msgid "ContainerRegistry|-- tags"
msgstr ""
msgid "ContainerRegistry|Build an image"
-msgstr ""
+msgstr "Byg et aftryk"
msgid "ContainerRegistry|CLI Commands"
-msgstr ""
+msgstr "CLI-kommandoer"
msgid "ContainerRegistry|Cleanup disabled"
-msgstr ""
+msgstr "Oprydning deaktiveret"
msgid "ContainerRegistry|Cleanup in progress"
msgstr "Igangværende oprydning"
@@ -8709,19 +8840,19 @@ msgid "ContainerRegistry|Cleanup incomplete"
msgstr ""
msgid "ContainerRegistry|Cleanup is currently removing tags"
-msgstr ""
+msgstr "Oprydning er i øjeblikket ved at fjerne mærkater"
msgid "ContainerRegistry|Cleanup is disabled for this project"
-msgstr ""
+msgstr "Oprydning er deaktiveret for projektet"
msgid "ContainerRegistry|Cleanup is ongoing"
msgstr ""
msgid "ContainerRegistry|Cleanup pending"
-msgstr ""
+msgstr "Oprydning afventer"
msgid "ContainerRegistry|Cleanup policies are now available for this project. %{linkStart}Click here to get started.%{linkEnd}"
-msgstr ""
+msgstr "Oprydningsregelsæt er nu tilgængelige for projektet. %{linkStart}Klik her for at komme godt i gang.%{linkEnd}"
msgid "ContainerRegistry|Cleanup policy for tags is disabled"
msgstr ""
@@ -8739,16 +8870,16 @@ msgid "ContainerRegistry|Cleanup timed out before it could delete all tags"
msgstr ""
msgid "ContainerRegistry|Cleanup will run %{time}"
-msgstr ""
+msgstr "Oprydning vil køre %{time}"
msgid "ContainerRegistry|Cleanup will run soon"
-msgstr ""
+msgstr "Oprydning vil snart køre"
msgid "ContainerRegistry|Configuration digest: %{digest}"
msgstr ""
msgid "ContainerRegistry|Container Registry"
-msgstr ""
+msgstr "Beholderregister"
msgid "ContainerRegistry|Copy build command"
msgstr ""
@@ -8760,10 +8891,10 @@ msgid "ContainerRegistry|Copy push command"
msgstr ""
msgid "ContainerRegistry|Delete image repository?"
-msgstr ""
+msgstr "Slet aftryksdepot?"
msgid "ContainerRegistry|Delete selected tags"
-msgstr ""
+msgstr "Slet valgte mærkater"
msgid "ContainerRegistry|Deleting the image repository will delete all images and tags inside. This action cannot be undone. Please type the following to confirm: %{code}"
msgstr ""
@@ -8778,31 +8909,31 @@ msgid "ContainerRegistry|Docker connection error"
msgstr ""
msgid "ContainerRegistry|Enable expiration policy"
-msgstr ""
+msgstr "Aktivér udløbsregelsæt"
msgid "ContainerRegistry|Expiration policy is disabled"
-msgstr ""
+msgstr "Udløbsregelsæt er deaktiveret"
msgid "ContainerRegistry|Expiration policy will run in %{time}"
-msgstr ""
+msgstr "Udløbsregelsæt vil køre om %{time}"
msgid "ContainerRegistry|If you are not already logged in, you need to authenticate to the Container Registry by using your GitLab username and password. If you have %{twofaDocLinkStart}Two-Factor Authentication%{twofaDocLinkEnd} enabled, use a %{personalAccessTokensDocLinkStart}Personal Access Token%{personalAccessTokensDocLinkEnd} instead of a password."
msgstr ""
msgid "ContainerRegistry|Image repository deletion failed"
-msgstr ""
+msgstr "Sletning af aftryksdepot mislykkedes"
msgid "ContainerRegistry|Image repository not found"
-msgstr ""
+msgstr "Aftryksdepot ikke fundet"
msgid "ContainerRegistry|Image repository will be deleted"
-msgstr ""
+msgstr "Aftryksdepot vil blive slettet"
msgid "ContainerRegistry|Image repository with no name located at the project URL."
msgstr ""
msgid "ContainerRegistry|Image tags"
-msgstr ""
+msgstr "Aftryksmærkater"
msgid "ContainerRegistry|Invalid tag: missing manifest digest"
msgstr ""
@@ -8814,10 +8945,10 @@ msgid "ContainerRegistry|Keep the most recent:"
msgstr "Behold den seneste:"
msgid "ContainerRegistry|Keep these tags"
-msgstr ""
+msgstr "Behold disse mærkater"
msgid "ContainerRegistry|Last updated %{time}"
-msgstr ""
+msgstr "Sidst opdateret %{time}"
msgid "ContainerRegistry|Login"
msgstr ""
@@ -8832,16 +8963,16 @@ msgid "ContainerRegistry|Next cleanup scheduled to run on:"
msgstr ""
msgid "ContainerRegistry|Not yet scheduled"
-msgstr ""
+msgstr "Endnu ikke planlagt"
msgid "ContainerRegistry|Note: Any policy update will result in a change to the scheduled run date and time"
msgstr ""
msgid "ContainerRegistry|Published %{timeInfo}"
-msgstr ""
+msgstr "Udgivet %{timeInfo}"
msgid "ContainerRegistry|Published to the %{repositoryPath} image repository at %{time} on %{date}"
-msgstr ""
+msgstr "Udgivet til aftryksdepotet %{repositoryPath} kl. %{time} %{date}"
msgid "ContainerRegistry|Push an image"
msgstr ""
@@ -8854,20 +8985,20 @@ msgstr "Fjern depot"
msgid "ContainerRegistry|Remove tag"
msgid_plural "ContainerRegistry|Remove tags"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "Fjern mærkat"
+msgstr[1] "Fjern mærkater"
msgid "ContainerRegistry|Remove tags matching:"
-msgstr ""
+msgstr "Fjern mærkater som matcher:"
msgid "ContainerRegistry|Remove tags older than:"
-msgstr ""
+msgstr "Fjern mærkater som er ældre end:"
msgid "ContainerRegistry|Remove these tags"
-msgstr ""
+msgstr "Fjern disse mærkater"
msgid "ContainerRegistry|Root image"
-msgstr ""
+msgstr "Rodaftryk"
msgid "ContainerRegistry|Run cleanup:"
msgstr ""
@@ -8876,34 +9007,34 @@ msgid "ContainerRegistry|Some tags were not deleted"
msgstr ""
msgid "ContainerRegistry|Something went wrong while fetching the cleanup policy."
-msgstr ""
+msgstr "Noget gik galt under hentning af oprydningsregelsættet."
msgid "ContainerRegistry|Something went wrong while fetching the image details."
-msgstr ""
+msgstr "Noget gik galt under hentning af aftryksdetaljerne."
msgid "ContainerRegistry|Something went wrong while fetching the repository list."
-msgstr ""
+msgstr "Noget gik galt under hentning af depotlisten."
msgid "ContainerRegistry|Something went wrong while fetching the tags list."
-msgstr ""
+msgstr "Noget gik galt under hentning af mærkatlisten."
msgid "ContainerRegistry|Something went wrong while marking the tag for deletion."
-msgstr ""
+msgstr "Noget gik galt under mærkning af mærkatet til sletning."
msgid "ContainerRegistry|Something went wrong while marking the tags for deletion."
-msgstr ""
+msgstr "Noget gik galt under mærkning af mærkaterne til sletning."
msgid "ContainerRegistry|Something went wrong while scheduling %{title} for deletion. Please try again."
-msgstr ""
+msgstr "Noget gik galt under planlægning af %{title} til sletning. Prøv venligst igen."
msgid "ContainerRegistry|Something went wrong while scheduling the image for deletion."
-msgstr ""
+msgstr "Noget gik galt under planlægning af aftrykket til sletning."
msgid "ContainerRegistry|Something went wrong while updating the cleanup policy."
-msgstr ""
+msgstr "Noget gik galt under opdatering af oprydningsregelsættet."
msgid "ContainerRegistry|Sorry, your filter produced no results."
-msgstr ""
+msgstr "Beklager, dit filter gav ingen resultater."
msgid "ContainerRegistry|Tag successfully marked for deletion."
msgstr ""
@@ -8927,40 +9058,40 @@ msgid "ContainerRegistry|The cleanup policy timed out before it could delete all
msgstr ""
msgid "ContainerRegistry|The image repository could not be found."
-msgstr ""
+msgstr "Kunne ikke finde aftryksdepotet."
msgid "ContainerRegistry|The last tag related to this image was recently removed. This empty image and any associated data will be automatically removed as part of the regular Garbage Collection process. If you have any questions, contact your administrator."
msgstr ""
msgid "ContainerRegistry|The requested image repository does not exist or has been deleted. If you think this is an error, try refreshing the page."
-msgstr ""
+msgstr "Det anmodede aftryksdepot findes ikke eller er blevet slettet. Hvis du tror det er en fejl, så prøv at opdatere siden."
msgid "ContainerRegistry|The value of this input should be less than 256 characters"
-msgstr ""
+msgstr "Værdien af inputtet skal skal være mindre end 256 tegn"
msgid "ContainerRegistry|There are no container images available in this group"
-msgstr ""
+msgstr "Der er ingen beholderaftryk tilgængelige i gruppen"
msgid "ContainerRegistry|There are no container images stored for this project"
-msgstr ""
+msgstr "Der er ingen beholderaftryk gemt for projektet"
msgid "ContainerRegistry|There was an error during the deletion of this image repository, please try again."
-msgstr ""
+msgstr "Der opstod en fejl under sletningen af aftryksdepotet. Prøv venligst igen."
msgid "ContainerRegistry|This image has no active tags"
msgstr ""
msgid "ContainerRegistry|This image repository has failed to be deleted"
-msgstr ""
+msgstr "Aftryksdepotet kunne ikke slettes"
msgid "ContainerRegistry|This image repository is scheduled for deletion"
-msgstr ""
+msgstr "Aftryksdepotet er planlagt til sletning"
msgid "ContainerRegistry|This image repository will be deleted. %{linkStart}Learn more.%{linkEnd}"
-msgstr ""
+msgstr "Aftryksdepotet vil blive slettet. %{linkStart}Lær mere%{linkEnd}."
msgid "ContainerRegistry|This project's cleanup policy for tags is not enabled."
-msgstr ""
+msgstr "Dit projekts oprydningsregelsæt for mærkater er ikke aktiveret."
msgid "ContainerRegistry|To widen your search, change or remove the filters above."
msgstr ""
@@ -8978,16 +9109,16 @@ msgid "ContainerRegistry|With the GitLab Container Registry, every project can h
msgstr ""
msgid "ContainerRegistry|You are about to remove %{item} tags. Are you sure?"
-msgstr ""
+msgstr "Du er ved at fjerne mærkaterne %{item}. Er du sikker?"
msgid "ContainerRegistry|You are about to remove %{item}. Are you sure?"
msgstr "Du er ved at fjerne %{item}. Er du sikker?"
msgid "ContainerRegistry|You are about to remove repository %{title}. Once you confirm, this repository will be permanently deleted."
-msgstr ""
+msgstr "Du er ved at fjerne depotet %{title}. Når du bekræfter, så vil depotet blive slettet permanent."
msgid "ContainerRegistry|You can add an image to this registry with the following commands:"
-msgstr ""
+msgstr "Du kan tilføje et aftryk til registeret med følgende kommandoer:"
msgid "Contains %{count} blobs of images (%{size})"
msgstr ""
@@ -8995,6 +9126,9 @@ msgstr ""
msgid "Content parsed with %{link}."
msgstr ""
+msgid "ContentEditor|Table of Contents"
+msgstr ""
+
msgid "ContentEditor|You have to provide a renderMarkdown function or a custom serializer"
msgstr ""
@@ -9002,13 +9136,13 @@ msgid "Contents of .gitlab-ci.yml"
msgstr "Indholdet i .gitlab-ci.yml"
msgid "ContextCommits|Failed to create context commits. Please try again."
-msgstr ""
+msgstr "Kunne ikke oprette sammenhængscommits. Prøv venligst igen."
msgid "ContextCommits|Failed to create/remove context commits. Please try again."
-msgstr ""
+msgstr "Kunne ikke oprette/fjerne sammenhængscommits. Prøv venligst igen."
msgid "ContextCommits|Failed to delete context commits. Please try again."
-msgstr ""
+msgstr "Kunne ikke slette sammenhængscommits. Prøv venligst igen."
msgid "Continue"
msgstr "Fortsæt"
@@ -9026,13 +9160,13 @@ msgid "Contribution"
msgstr "Bidrag"
msgid "Contribution Analytics"
-msgstr ""
+msgstr "Bidragsanalyse"
msgid "ContributionAnalytics|%{created_count} created, %{closed_count} closed."
-msgstr ""
+msgstr "%{created_count} oprettet, %{closed_count} lukket."
msgid "ContributionAnalytics|%{created_count} created, %{merged_count} merged, %{closed_count} closed."
-msgstr ""
+msgstr "%{created_count} oprettet, %{merged_count} sammenlagt, %{closed_count} lukket."
msgid "ContributionAnalytics|%{pushes} pushes, more than %{commits} commits by %{people} contributors."
msgstr ""
@@ -9053,13 +9187,13 @@ msgid "ContributionAnalytics|Last week"
msgstr "Sidste uge"
msgid "ContributionAnalytics|Merge requests"
-msgstr ""
+msgstr "Sammenlægningsanmodninger"
msgid "ContributionAnalytics|No issues for the selected time period."
msgstr ""
msgid "ContributionAnalytics|No merge requests for the selected time period."
-msgstr ""
+msgstr "Ingen sammenlægningsanmodninger for den valgte tidsperiode."
msgid "ContributionAnalytics|No pushes for the selected time period."
msgstr ""
@@ -9077,7 +9211,7 @@ msgid "Contributors"
msgstr "Bidragsydere"
msgid "Control emails linked to your account"
-msgstr ""
+msgstr "Styr e-mails som er linket til din konto"
msgid "Control how the GitLab Package Registry functions."
msgstr ""
@@ -9095,19 +9229,19 @@ msgid "Copied"
msgstr "Kopieret"
msgid "Copied labels and milestone from %{source_issuable_reference}."
-msgstr ""
+msgstr "Kopierede etiketter og milepæle fra %{source_issuable_reference}."
msgid "Copy"
msgstr "Kopiér"
msgid "Copy %{http_label} clone URL"
-msgstr ""
+msgstr "Kopiér klonings-URL for %{http_label}"
msgid "Copy %{name}"
msgstr "Kopiér %{name}"
msgid "Copy %{protocol} clone URL"
-msgstr ""
+msgstr "Kopiér klonings-URL for %{protocol}"
msgid "Copy %{proxy_url}"
msgstr "Kopiér %{proxy_url}"
@@ -9152,7 +9286,7 @@ msgid "Copy commands"
msgstr "Kopiér kommandoer"
msgid "Copy commit SHA"
-msgstr ""
+msgstr "Kopiér commit-SHA"
msgid "Copy environment"
msgstr "Kopiér miljø"
@@ -9173,7 +9307,7 @@ msgid "Copy labels and milestone from %{source_issuable_reference}."
msgstr "Kopiér etiketter og milepæl fra %{source_issuable_reference}."
msgid "Copy labels and milestone from other issue or merge request in this project"
-msgstr ""
+msgstr "Kopiér etiketter og milepæl fra anden problemstilling eller sammenlægning i projektet"
msgid "Copy link"
msgstr "Kopiér link"
@@ -9181,6 +9315,9 @@ msgstr "Kopiér link"
msgid "Copy link to chart"
msgstr "Kopiér link til diagram"
+msgid "Copy prefix"
+msgstr ""
+
msgid "Copy reference"
msgstr "Kopiér reference"
@@ -9194,7 +9331,7 @@ msgid "Copy the code below to implement tracking in your application:"
msgstr ""
msgid "Copy this registration token."
-msgstr ""
+msgstr "Kopiér registreringstokenen."
msgid "Copy this value"
msgstr "Kopiér værdien"
@@ -9211,9 +9348,12 @@ msgstr "Kopiér udløsertoken"
msgid "Copy value"
msgstr "Kopiér værdi"
-msgid "Corpus Management|Are you sure you want to delete the corpus?"
+msgid "Corpus Management"
msgstr ""
+msgid "Corpus Management|Are you sure you want to delete the corpus?"
+msgstr "Er du sikker på, at du vil slette korpusset?"
+
msgid "CorpusManagement|Actions"
msgstr "Handlinger"
@@ -9221,7 +9361,7 @@ msgid "CorpusManagement|Corpus are used in fuzz testing as mutation source to Im
msgstr ""
msgid "CorpusManagement|Corpus name"
-msgstr ""
+msgstr "Korpusnavn"
msgid "CorpusManagement|Fuzz testing corpus management"
msgstr ""
@@ -9233,37 +9373,37 @@ msgid "CorpusManagement|Last used"
msgstr ""
msgid "CorpusManagement|Latest Job:"
-msgstr ""
+msgstr "Sidste job:"
msgid "CorpusManagement|New corpus needs to be a upload in *.zip format. Maximum 10GB"
msgstr ""
msgid "CorpusManagement|New upload"
-msgstr ""
+msgstr "Ny upload"
msgid "CorpusManagement|Not Set"
-msgstr ""
+msgstr "Ikke indstillet"
msgid "CorpusManagement|Target"
msgstr "MÃ¥l"
msgid "CorpusManagement|To use this corpus, edit the corresponding YAML file"
-msgstr ""
+msgstr "Rediger den tilhørende YAML-fil for at bruge korpusset"
msgid "CorpusManagement|Total Size: %{totalSize}"
-msgstr ""
+msgstr "Størrelse i alt: %{totalSize}"
msgid "CorpusMnagement|New corpus"
-msgstr ""
+msgstr "Nyt korpus"
msgid "Could not add admins as members"
-msgstr ""
+msgstr "Kunne ikke tilføje administratorer som medlemmer"
msgid "Could not apply %{name} command."
-msgstr ""
+msgstr "Kunne ikke anvende kommandoen %{name}."
msgid "Could not archive %{design}. Please try again."
-msgstr ""
+msgstr "Kunne ikke arkivere %{design}. Prøv venligst igen."
msgid "Could not authorize chat nickname. Try again!"
msgstr ""
@@ -9272,19 +9412,19 @@ msgid "Could not change HEAD: branch '%{branch}' does not exist"
msgstr ""
msgid "Could not commit. An unexpected error occurred."
-msgstr ""
+msgstr "Kunne ikke committe. Der opstod en uventet fejl."
msgid "Could not connect to FogBugz, check your URL"
msgstr "Kunne ikke oprette forbindelse til FogBugz, tjek din URL"
msgid "Could not connect to Sentry. Refresh the page to try again."
-msgstr "Kunne ikke oprette forbindelse til Sentry. Opdater siden og prøv igen."
+msgstr "Kunne ikke oprette forbindelse til Sentry. Opdater siden for at prøve igen."
msgid "Could not connect to Web IDE file mirror service."
msgstr ""
msgid "Could not create Wiki Repository at this time. Please try again later."
-msgstr ""
+msgstr "Kunne ikke oprette wikidepot på nuværende tidspunkt. Prøv venligst igen senere."
msgid "Could not create environment"
msgstr "Kunne ikke oprette miljø"
@@ -9308,10 +9448,10 @@ msgid "Could not delete wiki page"
msgstr "Kunne ikke slette wikiside"
msgid "Could not draw the lines for job relationships"
-msgstr ""
+msgstr "Kunne ikke tegne linjerne for jobrelationer"
msgid "Could not fetch policy because existing policy YAML is invalid"
-msgstr ""
+msgstr "Kunne ikke hente regelsæt fordi eksisterende regelsæt-YAML er ugyldig"
msgid "Could not find design."
msgstr "Kunne ikke finde design."
@@ -9323,10 +9463,10 @@ msgid "Could not get the data properly"
msgstr "Kunne ikke hente dataene ordentligt"
msgid "Could not load the user chart. Please refresh the page to try again."
-msgstr "Kunne ikke indlæse brugerdiagrammet. Opdater venligst siden og prøv igen."
+msgstr "Kunne ikke indlæse brugerdiagrammet. Opdater venligst siden for at prøve igen."
msgid "Could not load usage counts. Please refresh the page to try again."
-msgstr ""
+msgstr "Kunne ikke indlæse forbrugstællinger. Opdater venligst siden for at prøve igen."
msgid "Could not remove %{user} from %{group}. Cannot remove last group owner."
msgstr "Kunne ikke fjerne %{user} fra %{group}. Kan ikke fjerne sidste gruppeejer."
@@ -9341,10 +9481,10 @@ msgid "Could not restore the group"
msgstr "Kunne ikke gendanne gruppen"
msgid "Could not revoke impersonation token %{token_name}."
-msgstr ""
+msgstr "Kunne ikke tilbagekalde efterligningstokenen %{token_name}."
msgid "Could not revoke personal access token %{personal_access_token_name}."
-msgstr ""
+msgstr "Kunne ikke tilbagekalde den personlige adgangstoken %{personal_access_token_name}."
msgid "Could not revoke project access token %{project_access_token_name}."
msgstr ""
@@ -9407,7 +9547,7 @@ msgid "Create a merge request"
msgstr "Opret en sammenlægningsanmodning"
msgid "Create a new %{codeStart}.gitlab-ci.yml%{codeEnd} file at the root of the repository to get started."
-msgstr ""
+msgstr "Opret en ny %{codeStart}.gitlab-ci.yml%{codeEnd}-fil i roden af depotet for at komme i gang."
msgid "Create a new branch"
msgstr "Opret en ny gren"
@@ -9439,11 +9579,14 @@ msgstr "Opret branch"
msgid "Create commit"
msgstr "Opret commit"
-msgid "Create confidential merge request"
+msgid "Create common files more quickly, and standardize their format."
msgstr ""
+msgid "Create confidential merge request"
+msgstr "Opret fortrolig sammenlægningsanmodning"
+
msgid "Create confidential merge request and branch"
-msgstr ""
+msgstr "Opret fortrolig sammenlægningsanmodning og gren"
msgid "Create directory"
msgstr "Opret mappe"
@@ -9472,6 +9615,9 @@ msgstr "Opret hændelse"
msgid "Create issue"
msgstr "Opret problemstilling"
+msgid "Create issue to resolve all threads"
+msgstr ""
+
msgid "Create iteration"
msgstr "Opret gennemløb"
@@ -9479,19 +9625,19 @@ msgid "Create list"
msgstr "Opret liste"
msgid "Create lists from labels. Issues with that label appear in that list."
-msgstr ""
+msgstr "Opret lister fra etiketter. Problemstillinger med den etiket vises i den liste."
msgid "Create merge request"
msgstr "Opret sammenlægningsanmodning"
msgid "Create merge request and branch"
-msgstr ""
+msgstr "Opret sammenlægningsanmodning og gren"
msgid "Create milestone"
msgstr "Opret milepæl"
msgid "Create new"
-msgstr ""
+msgstr "Opret ny"
msgid "Create new %{name} by email"
msgstr "Opret ny %{name} via e-mail"
@@ -9506,7 +9652,7 @@ msgid "Create new branch"
msgstr "Opret ny gren"
msgid "Create new confidential %{issuableType}"
-msgstr ""
+msgstr "Opret ny fortrolig %{issuableType}"
msgid "Create new directory"
msgstr "Opret ny mappe"
@@ -9524,6 +9670,9 @@ msgid "Create new project"
msgstr "Opret nyt projekt"
msgid "Create new..."
+msgstr "Opret ny(t) ..."
+
+msgid "Create or import your first project"
msgstr ""
msgid "Create project"
@@ -9539,7 +9688,7 @@ msgid "Create requirement"
msgstr "Opret krav"
msgid "Create snippet"
-msgstr "Opret uddrag"
+msgstr "Opret udklip"
msgid "Create tag %{tagName}"
msgstr "Opret mærkatet %{tagName}"
@@ -9569,22 +9718,22 @@ msgid "CreateTag|Tag"
msgstr "Mærkat"
msgid "CreateTokenToCloneLink|create a personal access token"
-msgstr ""
+msgstr "opret en personlig adgangstoken"
msgid "CreateValueStreamForm|%{name} (default)"
msgstr "%{name} (standard)"
msgid "CreateValueStreamForm|'%{name}' Value Stream created"
-msgstr "'%{name}' Value Stream oprettet"
+msgstr "Value Stream'et '%{name}' oprettet"
msgid "CreateValueStreamForm|'%{name}' Value Stream saved"
-msgstr "'%{name}' Value Stream gemt"
+msgstr "Value Stream'et '%{name}' gemt"
msgid "CreateValueStreamForm|Add another stage"
msgstr ""
msgid "CreateValueStreamForm|Add stage"
-msgstr ""
+msgstr "Tilføj stadie"
msgid "CreateValueStreamForm|All default stages are currently visible"
msgstr ""
@@ -9596,7 +9745,7 @@ msgid "CreateValueStreamForm|Create Value Stream"
msgstr "Opret Value Stream"
msgid "CreateValueStreamForm|Create from default template"
-msgstr ""
+msgstr "Opret fra standardskabelon"
msgid "CreateValueStreamForm|Create from no template"
msgstr ""
@@ -9605,7 +9754,7 @@ msgid "CreateValueStreamForm|Create new Value Stream"
msgstr "Opret ny Value Stream"
msgid "CreateValueStreamForm|Default stages"
-msgstr ""
+msgstr "Standardstadier"
msgid "CreateValueStreamForm|Default stages can only be hidden or re-ordered"
msgstr ""
@@ -9614,7 +9763,7 @@ msgid "CreateValueStreamForm|Edit Value Stream"
msgstr "Rediger Value Stream"
msgid "CreateValueStreamForm|Editing stage"
-msgstr ""
+msgstr "Redigeringsstadie"
msgid "CreateValueStreamForm|End event"
msgstr ""
@@ -9626,40 +9775,40 @@ msgid "CreateValueStreamForm|End event: "
msgstr ""
msgid "CreateValueStreamForm|Enter stage name"
-msgstr ""
+msgstr "Indtast stadienavn"
msgid "CreateValueStreamForm|Enter value stream name"
-msgstr ""
+msgstr "Indtast value stream-navn"
msgid "CreateValueStreamForm|Issue stage end"
msgstr ""
msgid "CreateValueStreamForm|Maximum length %{maxLength} characters"
-msgstr ""
+msgstr "Maksimale længde %{maxLength} tegn"
msgid "CreateValueStreamForm|Name is required"
msgstr "Navn kræves"
msgid "CreateValueStreamForm|New stage"
-msgstr ""
+msgstr "Nyt stadie"
msgid "CreateValueStreamForm|Plan stage start"
msgstr ""
msgid "CreateValueStreamForm|Please select a start event first"
-msgstr ""
+msgstr "Vælg venligst en startbegivenhed først"
msgid "CreateValueStreamForm|Please select an end event"
-msgstr ""
+msgstr "Vælg venligst en slutbegivenhed"
msgid "CreateValueStreamForm|Recover hidden stage"
-msgstr ""
+msgstr "Gendan skjult stadie"
msgid "CreateValueStreamForm|Restore defaults"
-msgstr ""
+msgstr "Gendan standarder"
msgid "CreateValueStreamForm|Restore stage"
-msgstr ""
+msgstr "Gendannelsesstadie"
msgid "CreateValueStreamForm|Save Value Stream"
msgstr "Gem Value Stream"
@@ -9674,10 +9823,10 @@ msgid "CreateValueStreamForm|Stage %{index}"
msgstr ""
msgid "CreateValueStreamForm|Stage name already exists"
-msgstr ""
+msgstr "Stadienavn findes allerede"
msgid "CreateValueStreamForm|Stage name is required"
-msgstr ""
+msgstr "Stadienavn kræves"
msgid "CreateValueStreamForm|Start event"
msgstr ""
@@ -9692,10 +9841,10 @@ msgid "CreateValueStreamForm|Start event: "
msgstr ""
msgid "CreateValueStreamForm|Update stage"
-msgstr ""
+msgstr "Opdateringsstadie"
msgid "CreateValueStreamForm|Value Stream name"
-msgstr ""
+msgstr "Value Stream-navn"
msgid "Created"
msgstr "Oprettet"
@@ -9704,19 +9853,19 @@ msgid "Created %{epicTimeagoDate}"
msgstr "Oprettet %{epicTimeagoDate}"
msgid "Created %{timestamp}"
-msgstr ""
+msgstr "Oprettet %{timestamp}"
msgid "Created At"
-msgstr ""
+msgstr "Oprettet kl."
msgid "Created On"
-msgstr ""
+msgstr "Oprettet"
msgid "Created a branch and a merge request to resolve this issue."
-msgstr ""
+msgstr "Opret en gren og en sammenlægningsanmodning for at løse problemstillingen."
msgid "Created branch '%{branch_name}' and a merge request to resolve this issue."
-msgstr ""
+msgstr "Oprettede grenen '%{branch_name}' og en sammenlægningsanmodning for at løse problemstillingen."
msgid "Created by %{job}"
msgstr "Oprettet af %{job}"
@@ -9743,13 +9892,13 @@ msgid "Created merge request %{mergeRequestLink} at %{projectLink}"
msgstr "Oprettede sammenlægningsanmodningen %{mergeRequestLink} hos %{projectLink}"
msgid "Created on"
-msgstr ""
+msgstr "Oprettet"
msgid "Created on %{created_at}"
-msgstr ""
+msgstr "Oprettet %{created_at}"
msgid "Created on:"
-msgstr ""
+msgstr "Oprettet:"
msgid "Creates a branch and a merge request to resolve this issue."
msgstr "Oprettet en gren og en sammenlægningsanmodning til at løse problemstillingen."
@@ -9779,7 +9928,7 @@ msgid "CredentialsInventory|No credentials found"
msgstr "Ingen loginoplysninger fundet"
msgid "CredentialsInventory|Personal Access Tokens"
-msgstr ""
+msgstr "Personlige adgangstokens"
msgid "CredentialsInventory|SSH Keys"
msgstr "SSH-nøgler"
@@ -9797,7 +9946,7 @@ msgid "Cron Timezone"
msgstr "Tidszone for Cron"
msgid "Cron time zone"
-msgstr ""
+msgstr "Cron-tidszone"
msgid "Crowd"
msgstr ""
@@ -9839,7 +9988,7 @@ msgid "Current password"
msgstr "Nuværende adgangskode"
msgid "Current sign-in IP:"
-msgstr ""
+msgstr "Nuværende indlognings-IP:"
msgid "Current sign-in at:"
msgstr ""
@@ -9848,7 +9997,7 @@ msgid "Current vulnerabilities count"
msgstr ""
msgid "CurrentUser|Buy Pipeline minutes"
-msgstr ""
+msgstr "Køb pipeline-minutter"
msgid "CurrentUser|Edit profile"
msgstr "Rediger profil"
@@ -9866,67 +10015,67 @@ msgid "CurrentUser|Upgrade"
msgstr "Opgrader"
msgid "Custom Attributes"
-msgstr ""
+msgstr "Tilpassede attributter"
msgid "Custom Git clone URL for HTTP(S)"
-msgstr ""
+msgstr "Tilpasset Git-klonings-URL for HTTP(S)"
msgid "Custom analyzers: language support"
msgstr ""
msgid "Custom hostname (for private commit emails)"
-msgstr ""
+msgstr "Tilpasset værtsnavn (til private commit e-mails)"
msgid "Custom metrics"
msgstr "Tilpasset målinger"
msgid "Custom notification events"
-msgstr ""
+msgstr "Tilpassede underretningsbegivenheder"
-msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notificationLinkStart} notification emails%{notificationLinkEnd}."
+msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notificationLinkStart}notification emails%{notificationLinkEnd}."
msgstr ""
msgid "Custom project templates"
-msgstr "Tilpasset projektskabeloner"
+msgstr "Tilpassede projektskabeloner"
msgid "Custom project templates have not been set up for groups that you are a member of. They are enabled from a group’s settings page. Contact your group’s Owner or Maintainer to setup custom project templates."
-msgstr "Tilpasset projektskabeloner er ikke blevet sat op for grupper som du er et medlem af. De aktiveres fra en gruppes indstillingsside. Kontakt din gruppes ejer eller vedligeholder for at opsætte tilpasset projektskabeloner."
+msgstr "Tilpassede projektskabeloner er ikke blevet sat op for grupper som du er et medlem af. De aktiveres fra en gruppes indstillingsside. Kontakt din gruppes ejer eller vedligeholder for at opsætte tilpassede projektskabeloner."
msgid "Custom range"
-msgstr ""
+msgstr "Tilpasset område"
msgid "Custom range (UTC)"
-msgstr ""
+msgstr "Tilpasset område (UTC)"
msgid "Customizable by an administrator."
-msgstr ""
+msgstr "Kan tilpasses af en administrator."
msgid "Customizable by owners."
-msgstr ""
+msgstr "Kan tilpasses af ejere."
msgid "Customize CI/CD settings, including Auto DevOps, shared runners, and job artifacts."
-msgstr ""
+msgstr "Tilpas CI-/CD-indstillinger, herunder Auto DevOps, delte runnere og jobartefakter."
msgid "Customize colors"
msgstr "Tilpas farver"
msgid "Customize how FogBugz email addresses and usernames are imported into GitLab. In the next step, you'll be able to select the projects you want to import."
-msgstr ""
+msgstr "Tilpas hvordan e-mailadresser og brugernavne for FogBugz importeres i GitLab. I det næste trin vil du være i stand til at vælge de projekter du vil importere."
msgid "Customize icon"
msgstr "Tilpas ikon"
msgid "Customize language and region related settings."
-msgstr ""
+msgstr "Tilpas sprog og regionsrelaterede indstillinger."
msgid "Customize name"
msgstr "Tilpas navn"
msgid "Customize your pipeline configuration and coverage report."
-msgstr ""
+msgstr "Tilpas din pipelinekonfiguration og dækningsrapport."
msgid "Customize your pipeline configuration."
-msgstr ""
+msgstr "Tilpas din pipelinekonfiguration."
msgid "CustomizeHomepageBanner|Do you want to customize this page?"
msgstr "Vil du tilpasse siden?"
@@ -9935,28 +10084,28 @@ msgid "CustomizeHomepageBanner|Go to preferences"
msgstr "Gå til præferencer"
msgid "CustomizeHomepageBanner|This page shows a list of your projects by default but it can be changed to show projects' activity, groups, your to-do list, assigned issues, assigned merge requests, and more. You can change this under \"Homepage content\" in your preferences"
-msgstr ""
+msgstr "Siden viser som standard en liste over dine projekter men den kan ændres til at vise projekternes aktivitet, grupper, din gøremålsliste, tildelte problemstillinger, tildelte sammenlægningsanmodninger mm. Du kan ændre det under \"Indhold for startside\" i dine præferencer"
msgid "Cycle Time"
-msgstr ""
+msgstr "Cyklustid"
msgid "CycleAnalyticsEvent|%{label_reference} label was added to the issue"
msgstr ""
msgid "CycleAnalyticsEvent|%{label_reference} label was added to the merge request"
-msgstr ""
+msgstr "Etiketten %{label_reference} blev tilføjet til sammenlægningsanmodningen"
msgid "CycleAnalyticsEvent|%{label_reference} label was removed from the issue"
msgstr ""
msgid "CycleAnalyticsEvent|%{label_reference} label was removed from the merge request"
-msgstr ""
+msgstr "Etiketten %{label_reference} blev fjernet fra sammenlægningsanmodningen"
msgid "CycleAnalyticsEvent|Issue closed"
-msgstr ""
+msgstr "Problemstilling lukket"
msgid "CycleAnalyticsEvent|Issue created"
-msgstr ""
+msgstr "Problemstilling oprettet"
msgid "CycleAnalyticsEvent|Issue first added to a board"
msgstr ""
@@ -9974,16 +10123,16 @@ msgid "CycleAnalyticsEvent|Issue label was added"
msgstr ""
msgid "CycleAnalyticsEvent|Issue label was removed"
-msgstr ""
+msgstr "Problemstillingsetiket blev fjernet"
msgid "CycleAnalyticsEvent|Issue last edited"
msgstr ""
msgid "CycleAnalyticsEvent|Merge request closed"
-msgstr ""
+msgstr "Sammenlægningsanmodning lukket"
msgid "CycleAnalyticsEvent|Merge request created"
-msgstr ""
+msgstr "Sammenlægningsanmodning oprettet"
msgid "CycleAnalyticsEvent|Merge request first commit time"
msgstr ""
@@ -9992,10 +10141,10 @@ msgid "CycleAnalyticsEvent|Merge request first deployed to production"
msgstr ""
msgid "CycleAnalyticsEvent|Merge request label was added"
-msgstr ""
+msgstr "Sammenlægningsanmodningsetiket blev tilføjet"
msgid "CycleAnalyticsEvent|Merge request label was removed"
-msgstr ""
+msgstr "Sammenlægningsanmodningsetiket blev fjernet"
msgid "CycleAnalyticsEvent|Merge request last build finish time"
msgstr ""
@@ -10007,7 +10156,7 @@ msgid "CycleAnalyticsEvent|Merge request last edited"
msgstr ""
msgid "CycleAnalyticsEvent|Merge request merged"
-msgstr ""
+msgstr "Sammenlægningsanmodning sammenlagt"
msgid "CycleAnalyticsStage|Code"
msgstr "Kode"
@@ -10019,31 +10168,31 @@ msgid "CycleAnalyticsStage|Plan"
msgstr "Plan"
msgid "CycleAnalyticsStage|Review"
-msgstr ""
+msgstr "Kontrol"
msgid "CycleAnalyticsStage|Staging"
msgstr ""
msgid "CycleAnalyticsStage|Test"
-msgstr ""
+msgstr "Test"
msgid "CycleAnalyticsStage|Total"
-msgstr ""
+msgstr "I alt"
msgid "CycleAnalyticsStage|is not available for the selected group"
-msgstr ""
+msgstr "er ikke tilgængelig for den valgte gruppe"
msgid "CycleAnalyticsStage|should be under a group"
-msgstr ""
+msgstr "skal være under en gruppe"
msgid "CycleAnalytics|%{selectedLabelsCount} selected (%{maxLabels} max)"
-msgstr ""
+msgstr "%{selectedLabelsCount} valgte (%{maxLabels} maks.)"
msgid "CycleAnalytics|%{stageCount} stages selected"
-msgstr ""
+msgstr "%{stageCount} stadier valgt"
msgid "CycleAnalytics|All stages"
-msgstr ""
+msgstr "Alle stadier"
msgid "CycleAnalytics|Average days to completion"
msgstr ""
@@ -10055,16 +10204,16 @@ msgid "CycleAnalytics|Days to completion"
msgstr ""
msgid "CycleAnalytics|Display chart filters"
-msgstr ""
+msgstr "Vis diagramfiltre"
msgid "CycleAnalytics|No stages selected"
-msgstr ""
+msgstr "Ingen stadier valgt"
msgid "CycleAnalytics|Number of tasks"
-msgstr ""
+msgstr "Antal opgaver"
msgid "CycleAnalytics|Only %{maxLabels} labels can be selected at this time"
-msgstr ""
+msgstr "Kun %{maxLabels} etiketter kan vælges på nuværende tidspunkt"
msgid "CycleAnalytics|Project selected"
msgid_plural "CycleAnalytics|%d projects selected"
@@ -10079,17 +10228,17 @@ msgstr "Vis"
msgid "CycleAnalytics|Showing %{subjectFilterText} and %{selectedLabelsCount} label"
msgid_plural "CycleAnalytics|Showing %{subjectFilterText} and %{selectedLabelsCount} labels"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "Viser %{subjectFilterText} og %{selectedLabelsCount} etiket"
+msgstr[1] "Viser %{subjectFilterText} og %{selectedLabelsCount} etiketter"
-msgid "CycleAnalytics|Showing data for group '%{groupName}' and %{selectedProjectCount} projects from %{startDate} to %{endDate}"
+msgid "CycleAnalytics|Showing data for group '%{groupName}' and %{selectedProjectCount} projects from %{createdAfter} to %{createdBefore}"
msgstr ""
-msgid "CycleAnalytics|Showing data for group '%{groupName}' from %{startDate} to %{endDate}"
+msgid "CycleAnalytics|Showing data for group '%{groupName}' from %{createdAfter} to %{createdBefore}"
msgstr ""
msgid "CycleAnalytics|Stages"
-msgstr ""
+msgstr "Stadier"
msgid "CycleAnalytics|Tasks by type"
msgstr "Opgaver efter type"
@@ -10119,22 +10268,22 @@ msgid "DAG visualization requires at least 3 dependent jobs."
msgstr ""
msgid "DAST Configuration"
-msgstr ""
+msgstr "DAST-konfiguration"
msgid "DAST Scans"
-msgstr ""
+msgstr "DAST-skanninger"
msgid "DNS"
msgstr "DNS"
msgid "DORA4Metrics|%{startDate} - %{endDate}"
-msgstr ""
+msgstr "%{startDate} - %{endDate}"
msgid "DORA4Metrics|Date"
msgstr "Dato"
msgid "DORA4Metrics|Days from merge to deploy"
-msgstr ""
+msgstr "Dage fra sammenlægning til udsendelse"
msgid "DORA4Metrics|Deployment frequency"
msgstr ""
@@ -10146,10 +10295,10 @@ msgid "DORA4Metrics|Median lead time"
msgstr ""
msgid "DORA4Metrics|No merge requests were deployed during this period"
-msgstr ""
+msgstr "Ingen sammenlægningsanmodninger blev udsendt i perioden"
msgid "DORA4Metrics|Number of deployments"
-msgstr ""
+msgstr "Antal udsendelser"
msgid "DORA4Metrics|Something went wrong while getting deployment frequency data."
msgstr ""
@@ -10161,7 +10310,7 @@ msgid "DORA4Metrics|The chart displays the frequency of deployments to productio
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 ""
+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 "Dashboard"
msgstr "Betjeningspanel"
@@ -10176,7 +10325,7 @@ msgid "DashboardProjects|Personal"
msgstr "Personlige"
msgid "DashboardProjects|Trending"
-msgstr ""
+msgstr "Trending"
msgid "Dashboard|%{firstProject} and %{secondProject}"
msgstr "%{firstProject} og %{secondProject}"
@@ -10191,10 +10340,10 @@ msgid "DastConfig|Customize DAST settings to suit your requirements. Configurati
msgstr ""
msgid "DastConfig|DAST Settings"
-msgstr ""
+msgstr "DAST-indstillinger"
msgid "DastConfig|Generate code snippet"
-msgstr "Generer kodeuddrag"
+msgstr "Generer kodeudklip"
msgid "DastConfig|Scan Configuration"
msgstr ""
@@ -10209,7 +10358,7 @@ msgid "DastProfiles|Active"
msgstr "Aktiv"
msgid "DastProfiles|Additional request headers (Optional)"
-msgstr ""
+msgstr "Yderligere anmodningsheadere (valgfrit)"
msgid "DastProfiles|Are you sure you want to delete this profile?"
msgstr "Er du sikker på, at du vil slette profilen?"
@@ -10224,61 +10373,61 @@ msgid "DastProfiles|Branch missing"
msgstr "Gren mangler"
msgid "DastProfiles|Could not create the scanner profile. Please try again."
-msgstr ""
+msgstr "Kunne ikke oprette skannerprofilen. Prøv venligst igen."
msgid "DastProfiles|Could not create the site profile. Please try again."
-msgstr ""
+msgstr "Kunne ikke oprette webstedsprofilen. Prøv venligst igen."
msgid "DastProfiles|Could not delete saved scan. Please refresh the page, or try again later."
-msgstr ""
+msgstr "Kunne ikke slette gemt skanning. Opdater venligst siden eller prøv igen senere."
msgid "DastProfiles|Could not delete saved scans:"
-msgstr ""
+msgstr "Kunne ikke slette gemte skanninger:"
msgid "DastProfiles|Could not delete scanner profile. Please refresh the page, or try again later."
-msgstr ""
+msgstr "Kunne ikke slette skannerprofil. Opdater venligst siden eller prøv igen senere."
msgid "DastProfiles|Could not delete scanner profiles:"
-msgstr ""
+msgstr "Kunne ikke slette skannerprofiler:"
msgid "DastProfiles|Could not delete site profile. Please refresh the page, or try again later."
-msgstr ""
+msgstr "Kunne ikke slette webstedsprofil. Opdater venligst siden eller prøv igen senere."
msgid "DastProfiles|Could not delete site profiles:"
-msgstr ""
+msgstr "Kunne ikke slette webstedsprofiler:"
msgid "DastProfiles|Could not fetch saved scans. Please refresh the page, or try again later."
-msgstr ""
+msgstr "Kunne ikke hente gemte skanninger. Opdater venligst siden eller prøv igen senere."
msgid "DastProfiles|Could not fetch scanner profiles. Please refresh the page, or try again later."
-msgstr ""
+msgstr "Kunne ikke hente skannerprofiler. Opdater venligst siden eller prøv igen senere."
msgid "DastProfiles|Could not fetch site profiles. Please refresh the page, or try again later."
-msgstr ""
+msgstr "Kunne ikke hente webstedsprofiler. Opdater venligst siden eller prøv igen senere."
msgid "DastProfiles|Could not update the scanner profile. Please try again."
-msgstr ""
+msgstr "Kunne ikke opdatere skannerprofilen. Prøv venligst igen."
msgid "DastProfiles|Could not update the site profile. Please try again."
-msgstr ""
+msgstr "Kunne ikke opdatere webstedsprofilen. Prøv venligst igen."
msgid "DastProfiles|DAST Scan"
msgstr ""
msgid "DastProfiles|Debug messages"
-msgstr ""
+msgstr "Fejlfindingsmeddelelser"
msgid "DastProfiles|Delete profile"
msgstr "Slet profil"
msgid "DastProfiles|Do you want to discard this scanner profile?"
-msgstr ""
+msgstr "Vil du forkaste skannerprofilen?"
msgid "DastProfiles|Do you want to discard this site profile?"
-msgstr ""
+msgstr "Vil du forkaste webstedsprofilen?"
msgid "DastProfiles|Do you want to discard your changes?"
-msgstr ""
+msgstr "Vil du forkaste dine ændringer?"
msgid "DastProfiles|Edit profile"
msgstr "Rediger profil"
@@ -10293,10 +10442,10 @@ msgid "DastProfiles|Enable Authentication"
msgstr ""
msgid "DastProfiles|Enter URLs in a comma-separated list."
-msgstr ""
+msgstr "Indtast URL'er i en kommasepareret liste."
msgid "DastProfiles|Enter headers in a comma-separated list."
-msgstr ""
+msgstr "Indtast headere i en kommasepareret liste."
msgid "DastProfiles|Error Details"
msgstr "Fejldetaljer"
@@ -10308,15 +10457,18 @@ msgid "DastProfiles|Excluded URLs (Optional)"
msgstr ""
msgid "DastProfiles|Hide debug messages"
-msgstr ""
+msgstr "Skjul fejlfindingsmeddelelser"
msgid "DastProfiles|Include debug messages in the DAST console output."
-msgstr ""
+msgstr "Medtag fejlfindingsmeddelelser i DAST-konsoloutputtet."
msgid "DastProfiles|Manage DAST scans"
msgstr ""
msgid "DastProfiles|Manage profiles"
+msgstr "HÃ¥ndter profiler"
+
+msgid "DastProfiles|Manage site profiles"
msgstr ""
msgid "DastProfiles|Minimum = 0 (no timeout enabled), Maximum = 2880 minutes"
@@ -10380,7 +10532,7 @@ msgid "DastProfiles|Saved Scans"
msgstr ""
msgid "DastProfiles|Scan"
-msgstr ""
+msgstr "Skan"
msgid "DastProfiles|Scan mode"
msgstr ""
@@ -10394,11 +10546,14 @@ msgstr "Skannerprofiler"
msgid "DastProfiles|Scanner name"
msgstr ""
-msgid "DastProfiles|Select branch"
+msgid "DastProfiles|Schedule"
msgstr ""
+msgid "DastProfiles|Select branch"
+msgstr "Vælg gren"
+
msgid "DastProfiles|Show debug messages"
-msgstr ""
+msgstr "Vis fejlfindingsmeddelelser"
msgid "DastProfiles|Site Profile"
msgstr ""
@@ -10419,7 +10574,7 @@ msgid "DastProfiles|Target"
msgstr "MÃ¥l"
msgid "DastProfiles|Target URL"
-msgstr ""
+msgstr "MÃ¥l-URL"
msgid "DastProfiles|Target timeout"
msgstr ""
@@ -10431,16 +10586,16 @@ msgid "DastProfiles|The maximum number of seconds allowed for the site under tes
msgstr ""
msgid "DastProfiles|This profile is currently being used in a policy."
-msgstr ""
+msgstr "Profilen bruges i øjeblikket i et regelsæt."
msgid "DastProfiles|This scanner profile is currently being used by a policy. To make edits you must remove it from the active policy."
msgstr ""
msgid "DastProfiles|This site profile is currently being used by a policy. To make edits you must remove it from the active policy."
-msgstr ""
+msgstr "Webstedsprofilen bruges i øjeblikket af et regelsæt. For at redigere skal du første fjerne den fra aktivitetsregelsættet."
msgid "DastProfiles|Turn on AJAX spider"
-msgstr ""
+msgstr "Tænd for AJAX-spider"
msgid "DastProfiles|URL"
msgstr "URL"
@@ -10461,25 +10616,25 @@ msgid "DastProfiles|Validation status"
msgstr ""
msgid "DastProfiles|Website"
-msgstr ""
+msgstr "Websted"
-msgid "DastProfiles|You can either choose a passive scan or validate the target site in your chosen site profile. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
+msgid "DastProfiles|You can either choose a passive scan or validate the target site from the site profile management page. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
msgstr ""
msgid "DastProfiles|You cannot run an active scan against an unvalidated site."
msgstr ""
msgid "DastSiteValidation|Copy HTTP header to clipboard"
-msgstr ""
+msgstr "Kopiér HTTP-header til udklipsholder"
msgid "DastSiteValidation|Copy Meta tag to clipboard"
msgstr ""
msgid "DastSiteValidation|Could not create validation token. Please try again."
-msgstr ""
+msgstr "Kunne ikke oprette valideringstoken. Prøv venligst igen."
msgid "DastSiteValidation|Could not revoke validation. Please try again."
-msgstr ""
+msgstr "Kunne ikke tilbagekalde validering. Prøv venligst igen."
msgid "DastSiteValidation|Download validation text file"
msgstr ""
@@ -10521,10 +10676,10 @@ msgid "DastSiteValidation|Text file validation"
msgstr ""
msgid "DastSiteValidation|The validation has failed. Please try again."
-msgstr ""
+msgstr "Valideringen mislykkedes. Prøv venligst igen."
msgid "DastSiteValidation|The validation is in progress. Please wait..."
-msgstr ""
+msgstr "Valideringen er i gang. Vent venligst ..."
msgid "DastSiteValidation|This will affect %d other profile targeting the same URL."
msgid_plural "DastSiteValidation|This will affect %d other profiles targeting the same URL."
@@ -10565,7 +10720,7 @@ msgid "Data type"
msgstr "Datatype"
msgid "Database update failed"
-msgstr ""
+msgstr "Opdatering af database mislykkedes"
msgid "DatadogIntegration|%{linkOpen}API key%{linkClose} used for authentication with Datadog."
msgstr ""
@@ -10583,13 +10738,13 @@ msgid "DatadogIntegration|For self-managed deployments, set the %{codeOpen}env%{
msgstr ""
msgid "DatadogIntegration|How do I set up this integration?"
-msgstr ""
+msgstr "Vil du opsætte integreringen?"
msgid "DatadogIntegration|Send CI/CD pipeline information to Datadog to monitor for job failures and troubleshoot performance issues. %{docs_link}"
-msgstr ""
+msgstr "Send CI-/CD-pipelineinformation til Datadog for at overvåge for job som mislykkede og for at fejlsøge ydelsesproblemer. %{docs_link}"
msgid "DatadogIntegration|Service"
-msgstr ""
+msgstr "Tjeneste"
msgid "DatadogIntegration|Tag all data from this GitLab instance in Datadog. Useful when managing several self-managed deployments."
msgstr ""
@@ -10610,13 +10765,13 @@ msgid "Date picker"
msgstr "Datovælger"
msgid "Date range"
-msgstr ""
+msgstr "Datoområde"
msgid "Date range must be shorter than %{max_range} days."
msgstr ""
msgid "Day of month"
-msgstr ""
+msgstr "Dag i måneden"
msgid "DayTitle|F"
msgstr "F"
@@ -10625,7 +10780,7 @@ msgid "DayTitle|M"
msgstr "M"
msgid "DayTitle|S"
-msgstr ""
+msgstr "L/S"
msgid "DayTitle|W"
msgstr "O"
@@ -10636,7 +10791,7 @@ msgstr "Dage"
msgid "Days to merge"
msgstr ""
-msgid "Deactivate dormant users after 90 days of inactivity. Users can return to active status by signing in to their account. While inactive, a user is not counted as an active user in the instance."
+msgid "Deactivate dormant users after 90 days of inactivity"
msgstr ""
msgid "Dear Administrator,"
@@ -10646,7 +10801,7 @@ msgid "Debian package already exists in Distribution"
msgstr ""
msgid "Debug"
-msgstr ""
+msgstr "Fejlfinding"
msgid "Dec"
msgstr "Dec."
@@ -10691,7 +10846,7 @@ msgid "Default description template for issues"
msgstr ""
msgid "Default description template for merge requests"
-msgstr ""
+msgstr "Standardbeskrivelsesskabelon til sammenlægningsanmodninger"
msgid "Default first day of the week"
msgstr ""
@@ -10709,7 +10864,7 @@ msgid "Default projects limit"
msgstr ""
msgid "Default timeout"
-msgstr ""
+msgstr "Standardtimeout"
msgid "Default: Map a FogBugz account ID to a full name"
msgstr ""
@@ -10723,10 +10878,10 @@ msgstr ""
msgid "Define a custom pattern with cron syntax"
msgstr ""
-msgid "Define approval settings."
+msgid "Define approval rules."
msgstr ""
-msgid "Define approval settings. %{linkStart}Learn more.%{linkEnd}"
+msgid "Define approval rules. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "Define custom rules for what constitutes spam, independent of Akismet"
@@ -10735,7 +10890,7 @@ msgstr ""
msgid "Define environments in the deploy stage(s) in %{code_open}.gitlab-ci.yml%{code_close} to track deployments here."
msgstr ""
-msgid "Define how approval rules are applied as a merge request moves toward completion."
+msgid "Define how approval rules are applied to merge requests."
msgstr ""
msgid "Definition"
@@ -10745,9 +10900,15 @@ msgid "Delayed Project Deletion (%{adjourned_deletion})"
msgstr ""
msgid "DelayedJobs|Are you sure you want to run %{jobName} immediately? Otherwise this job will run automatically after its timer finishes."
-msgstr ""
+msgstr "Er du sikker på, at du vil køre %{jobName} straks? Ellers kører jobbet automatisk når dets timer er færdig."
msgid "DelayedJobs|Are you sure you want to run %{job_name} immediately? This job will run automatically after it's timer finishes."
+msgstr "Er du sikker på, at du vil køre %{job_name} straks? Jobbet kører automatisk når dets timer er færdig."
+
+msgid "DelayedJobs|Are you sure you want to run %{job_name} immediately? This job will run automatically after its timer finishes."
+msgstr ""
+
+msgid "DelayedJobs|Run the delayed job now?"
msgstr ""
msgid "DelayedJobs|Start now"
@@ -10757,7 +10918,7 @@ msgid "DelayedJobs|Unschedule"
msgstr ""
msgid "DelayedJobs|delayed"
-msgstr ""
+msgstr "forsinket"
msgid "Delete"
msgstr "Slet"
@@ -10787,13 +10948,13 @@ msgid "Delete badge"
msgstr "Slet badge"
msgid "Delete column"
-msgstr ""
+msgstr "Slet kolonne"
msgid "Delete comment"
msgstr "Slet kommentar"
msgid "Delete corpus"
-msgstr ""
+msgstr "Slet korpus"
msgid "Delete domain"
msgstr "Slet domæne"
@@ -10802,16 +10963,16 @@ msgid "Delete file"
msgstr "Slet fil"
msgid "Delete image repository"
-msgstr ""
+msgstr "Slet aftryksdepot"
msgid "Delete label"
msgstr "Slet etiket"
msgid "Delete label: %{labelName}"
-msgstr ""
+msgstr "Slet etiket: %{labelName}"
msgid "Delete pipeline"
-msgstr ""
+msgstr "Slet pipeline"
msgid "Delete project"
msgstr "Slet projekt"
@@ -10820,19 +10981,19 @@ msgid "Delete project. Are you ABSOLUTELY SURE?"
msgstr "Slet projekt. Er du HELT SIKKER?"
msgid "Delete row"
-msgstr ""
+msgstr "Slet række"
msgid "Delete self monitoring project"
-msgstr ""
+msgstr "Slet selvovervågningsprojekt"
msgid "Delete serverless domain?"
-msgstr ""
+msgstr "Slet serverfrit domæne?"
msgid "Delete snippet"
-msgstr "Slet uddrag"
+msgstr "Slet udklip"
msgid "Delete snippet?"
-msgstr "Slet uddrag?"
+msgstr "Slet udklip?"
msgid "Delete source branch"
msgstr "Slet kildegren"
@@ -10841,13 +11002,13 @@ msgid "Delete subscription"
msgstr "Slet abonnement"
msgid "Delete table"
-msgstr ""
+msgstr "Slet tabel"
msgid "Delete this attachment"
msgstr "Slet vedhæftningen"
msgid "Delete this epic and all descendants?"
-msgstr ""
+msgstr "Slet epicen og alle efterkommere?"
msgid "Delete user list"
msgstr "Slet brugerliste"
@@ -10856,31 +11017,31 @@ msgid "Delete variable"
msgstr "Slet variabel"
msgid "DeleteProject|Failed to remove project repository. Please try again or contact administrator."
-msgstr ""
+msgstr "Kunne ikke fjerne projektdepot. Prøv venligst igen eller kontakt administrator."
msgid "DeleteProject|Failed to remove project snippets. Please try again or contact administrator."
-msgstr ""
+msgstr "Kunne ikke fjerne projektudklip. Prøv venligst igen eller kontakt administrator."
msgid "DeleteProject|Failed to remove some tags in project container registry. Please try again or contact administrator."
-msgstr ""
+msgstr "Nogle mærkater kunne ikke fjernes i projektbeholderregister. Prøv venligst igen eller kontakt administrator."
msgid "DeleteProject|Failed to remove webhooks. Please try again or contact administrator."
-msgstr ""
+msgstr "Kunne ikke fjerne webhooks. Prøv venligst igen eller kontakt administrator."
msgid "DeleteProject|Failed to remove wiki repository. Please try again or contact administrator."
-msgstr ""
+msgstr "Kunne ikke fjerne wikidepot. Prøv venligst igen eller kontakt administrator."
msgid "DeleteProject|Failed to restore project repository. Please contact the administrator."
-msgstr ""
+msgstr "Kunne ikke gendanne projektdepot. Kontakt venligst administratoren."
msgid "DeleteProject|Failed to restore wiki repository. Please contact the administrator."
msgstr ""
msgid "DeleteValueStream|'%{name}' Value Stream deleted"
-msgstr "'%{name}' Value Stream slettet"
+msgstr "Value Stream'et '%{name}' slettet"
msgid "DeleteValueStream|Are you sure you want to delete the \"%{name}\" Value Stream?"
-msgstr ""
+msgstr "Er du sikker på, at du vil slette Value Stream'et \"%{name}\"?"
msgid "DeleteValueStream|Delete %{name}"
msgstr "Slet %{name}"
@@ -10904,7 +11065,7 @@ msgid "Deleting"
msgstr "Sletter"
msgid "Deleting a project places it into a read-only state until %{date}, at which point the project will be permanently deleted. Are you ABSOLUTELY sure?"
-msgstr ""
+msgstr "Sletning af et projekt placerer det i en skrivebeskyttet tilstand indtil %{date}, hvorefter projektet vil blive slettet permanent. Er du HELT sikker?"
msgid "Deleting the project will delete its repository and all related resources, including issues and merge requests."
msgstr "Sletning af projektet vil slette dets depot og alle relaterede ressourcer, herunder problemstillinger og sammenlægningsanmodninger."
@@ -10913,16 +11074,16 @@ msgid "Deletion pending. This project will be deleted on %{date}. Repository and
msgstr "Afventer sletning. Projektet vil blive slettet %{date}. Depotet og andre projektressourcer er skrivebeskyttet."
msgid "Denied"
-msgstr ""
+msgstr "Afvist"
msgid "Denied authorization of chat nickname %{user_name}."
msgstr ""
msgid "Deny"
-msgstr ""
+msgstr "Afvis"
msgid "Deny access request"
-msgstr ""
+msgstr "Afvis adgangsanmodning"
msgid "Dependencies"
msgstr "Afhængigheder"
@@ -10932,8 +11093,8 @@ msgstr ""
msgid "Dependencies|%d additional vulnerability not shown"
msgid_plural "Dependencies|%d additional vulnerabilities not shown"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d yderligere sårbarhed ikke vist"
+msgstr[1] "%d yderligere sårbarheder ikke vist"
msgid "Dependencies|%d more"
msgid_plural "Dependencies|%d more"
@@ -10942,8 +11103,8 @@ msgstr[1] "%d mere"
msgid "Dependencies|%d vulnerability detected"
msgid_plural "Dependencies|%d vulnerabilities detected"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d sårbarhed registreret"
+msgstr[1] "%d sårbarheder registreret"
msgid "Dependencies|%{remainingLicensesCount} more"
msgstr "%{remainingLicensesCount} mere"
@@ -11009,16 +11170,16 @@ msgid "Dependency List"
msgstr "Afhængighedsliste"
msgid "Dependency List has no entries"
-msgstr ""
+msgstr "Afhængighedsliste har ingen indslag"
msgid "Dependency Proxy"
-msgstr ""
+msgstr "Afhængighedsproxy"
msgid "Dependency Scanning"
msgstr ""
msgid "Dependency proxy"
-msgstr ""
+msgstr "Afhængighedsproxy"
msgid "Dependency proxy feature is limited to public groups for now."
msgstr ""
@@ -11026,18 +11187,24 @@ msgstr ""
msgid "Dependency proxy image prefix"
msgstr ""
+msgid "DependencyProxy|Create a local proxy for storing frequently used upstream images. %{docLinkStart}Learn more%{docLinkEnd} about dependency proxies."
+msgstr ""
+
+msgid "DependencyProxy|Dependency Proxy"
+msgstr ""
+
msgid "DependencyProxy|Toggle Dependency Proxy"
msgstr ""
msgid "Depends on %d merge request being merged"
msgid_plural "Depends on %d merge requests being merged"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "Afhænger af %d sammenlægningsanmodning der er ved at blive sammenlagt"
+msgstr[1] "Afhænger af %d sammenlægningsanmodninger der er ved at blive sammenlagt"
msgid "Depends on %{strongStart}%{closedCount} closed%{strongEnd} merge request."
msgid_plural "Depends on %{strongStart}%{closedCount} closed%{strongEnd} merge requests."
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "Afhænger af %{strongStart}%{closedCount} lukket%{strongEnd} sammenlægningsanmodning."
+msgstr[1] "Afhænger af %{strongStart}%{closedCount} lukkede%{strongEnd} sammenlægningsanmodninger."
msgid "Deploy"
msgid_plural "Deploys"
@@ -11048,7 +11215,7 @@ msgid "Deploy Keys"
msgstr "Udsendelsesnøgler"
msgid "Deploy freezes"
-msgstr ""
+msgstr "Udsendelsesfrysninger"
msgid "Deploy key was successfully updated."
msgstr "Udsendelsesnøglen blev opdateret."
@@ -11072,16 +11239,16 @@ msgid "DeployFreeze|Add deploy freeze"
msgstr "Tilføj udsendelsesfrysning"
msgid "DeployFreeze|Delete"
-msgstr ""
+msgstr "Slet"
msgid "DeployFreeze|Delete deploy freeze?"
-msgstr ""
+msgstr "Slet udsendelsesfrysning?"
msgid "DeployFreeze|Delete freeze period"
msgstr ""
msgid "DeployFreeze|Deploy freeze from %{start} to %{end} in %{timezone} will be removed. Are you sure?"
-msgstr ""
+msgstr "Udsendelsesfrysning fra %{start} til %{end} i %{timezone} vil blive fjernet. Er du sikker?"
msgid "DeployFreeze|Edit"
msgstr "Rediger"
@@ -11111,25 +11278,25 @@ msgid "DeployKeys|Deploy key"
msgstr ""
msgid "DeployKeys|Enabled deploy keys"
-msgstr ""
+msgstr "Aktiverede udsendelsesnøgler"
msgid "DeployKeys|Error enabling deploy key"
-msgstr ""
+msgstr "Fejl ved aktivering af udsendelsesnøgle"
msgid "DeployKeys|Error getting deploy keys"
-msgstr ""
+msgstr "Fejl ved hentning af udsendelsesnøgler"
msgid "DeployKeys|Error removing deploy key"
-msgstr ""
+msgstr "Fejl ved fjernelse af udsendelsesnøgle"
msgid "DeployKeys|Expand %{count} other projects"
-msgstr ""
+msgstr "Udfold %{count} andre projekter"
msgid "DeployKeys|Grant write permissions to this key"
msgstr ""
msgid "DeployKeys|Loading deploy keys"
-msgstr ""
+msgstr "Indlæser udsendelsesnøgler"
msgid "DeployKeys|No deploy keys found. Create one with the form above."
msgstr ""
@@ -11153,13 +11320,13 @@ msgid "DeployTokens|Allows read and write access to registry images."
msgstr "Tillader læse- og skriveadgang til registerbilleder."
msgid "DeployTokens|Allows read and write access to the package registry."
-msgstr "Tillader læse- og skriveadgang til pakkeregistret."
+msgstr "Tillader læse- og skriveadgang til pakkeregisteret."
msgid "DeployTokens|Allows read-only access to registry images."
msgstr "Tillader skrivebeskyttet adgang til registerbilleder."
msgid "DeployTokens|Allows read-only access to the package registry."
-msgstr "Tillader skrivebeskyttet adgang til pakkeregistret."
+msgstr "Tillader skrivebeskyttet adgang til pakkeregisteret."
msgid "DeployTokens|Allows read-only access to the repository."
msgstr "Tillader skrivebeskyttet adgang til depotet."
@@ -11171,7 +11338,7 @@ msgid "DeployTokens|Copy username"
msgstr "Kopiér brugernavn"
msgid "DeployTokens|Create a new deploy token for all projects in this group. %{link_start}What are deploy tokens?%{link_end}"
-msgstr ""
+msgstr "Opret en ny udsendelsestoken til alle projekter i gruppen. %{link_start}Hvad er udsendelsestokens?%{link_end}"
msgid "DeployTokens|Create deploy token"
msgstr "Opret udsendelsestoken"
@@ -11186,10 +11353,10 @@ msgid "DeployTokens|Deploy tokens allow access to packages, your repository, and
msgstr ""
msgid "DeployTokens|Enter a unique name for your deploy token."
-msgstr ""
+msgstr "Indtast et unikt navn til din udsendelsestoken."
msgid "DeployTokens|Enter a username for your token. Defaults to %{code_start}gitlab+deploy-token-{n}%{code_end}."
-msgstr ""
+msgstr "Indtast et brugernavn til din token. Er som standard %{code_start}gitlab+deploy-token-{n}%{code_end}."
msgid "DeployTokens|Enter an expiration date for your token. Defaults to never expire."
msgstr ""
@@ -11198,7 +11365,7 @@ msgid "DeployTokens|Expires"
msgstr "Udløber"
msgid "DeployTokens|Group deploy tokens allow access to the packages, repositories, and registry images within the group."
-msgstr ""
+msgstr "Gruppeudsendelsestokens giver mulighed for at tilgå pakkerne, depoterne og registeraftrykkene i gruppen."
msgid "DeployTokens|Name"
msgstr "Navn"
@@ -11210,7 +11377,7 @@ msgid "DeployTokens|Revoke"
msgstr "Tilbagekald"
msgid "DeployTokens|Revoke %{name}"
-msgstr ""
+msgstr "Tilbagekald %{name}"
msgid "DeployTokens|Scopes"
msgstr "Omfang"
@@ -11219,7 +11386,7 @@ msgid "DeployTokens|This %{entity_type} has no active Deploy Tokens."
msgstr ""
msgid "DeployTokens|This action cannot be undone."
-msgstr ""
+msgstr "Handlingen kan ikke fortrydes."
msgid "DeployTokens|This username supports access. %{link_start}What kind of access?%{link_end}"
msgstr ""
@@ -11234,7 +11401,7 @@ msgid "DeployTokens|Your new Deploy Token username"
msgstr ""
msgid "DeployTokens|Your new group deploy token has been created."
-msgstr ""
+msgstr "Din nye gruppeudsendelsestoken er blevet oprettet."
msgid "DeployTokens|Your new project deploy token has been created."
msgstr ""
@@ -11266,6 +11433,9 @@ msgstr ""
msgid "Deployments"
msgstr "Udsendelser"
+msgid "Deployments to Google Kubernetes Engine can be "
+msgstr ""
+
msgid "Deployments|%{deployments} environment impacted."
msgid_plural "Deployments|%{deployments} environments impacted."
msgstr[0] ""
@@ -11284,7 +11454,7 @@ msgid "Deployment|created"
msgstr "oprettet"
msgid "Deployment|failed"
-msgstr "mislykkedes"
+msgstr "mislykket"
msgid "Deployment|running"
msgstr "kører"
@@ -11295,6 +11465,9 @@ msgstr "sprunget over"
msgid "Deployment|success"
msgstr "lykkedes"
+msgid "Deprecated API rate limits"
+msgstr ""
+
msgid "Deprioritize label"
msgstr ""
@@ -11302,7 +11475,7 @@ msgid "Descending"
msgstr "Faldende"
msgid "Describe the goal of the changes and what reviewers should be aware of."
-msgstr ""
+msgstr "Beskriv målet for ændringerne og hvad kontrollanter skal være opmærksomme på."
msgid "Description"
msgstr "Beskrivelse"
@@ -11335,7 +11508,7 @@ msgid "Design repository"
msgstr ""
msgid "DesignManagement|%{current_design} of %{designs_count}"
-msgstr ""
+msgstr "%{current_design} af %{designs_count}"
msgid "DesignManagement|%{filename} did not change."
msgstr ""
@@ -11350,10 +11523,10 @@ msgid "DesignManagement|Archive designs"
msgstr ""
msgid "DesignManagement|Archive selected"
-msgstr ""
+msgstr "Arkivér valgte"
msgid "DesignManagement|Archived designs will still be available in previous versions of the design collection."
-msgstr ""
+msgstr "Arkiverede designs vil stadigvæk være tilgængelige i forrige versioner af designsamlingen."
msgid "DesignManagement|Are you sure you want to archive the selected designs?"
msgstr "Er du sikker på, at du vil arkivere de valgte designs?"
@@ -11383,7 +11556,7 @@ msgid "DesignManagement|Comments you resolve can be viewed and unresolved by goi
msgstr ""
msgid "DesignManagement|Could not add a new comment. Please try again."
-msgstr ""
+msgstr "Kunne ikke tilføje en ny kommentar. Prøv venligst igen."
msgid "DesignManagement|Could not create new discussion. Please try again."
msgstr "Kunne ikke oprette ny debat. Prøv venligst igen."
@@ -11392,7 +11565,7 @@ msgid "DesignManagement|Could not update discussion. Please try again."
msgstr "Kunne ikke opdatere debat. Prøv venligst igen."
msgid "DesignManagement|Could not update note. Please try again."
-msgstr ""
+msgstr "Kunne ikke opdatere note. Prøv venligst igen."
msgid "DesignManagement|Deselect all"
msgstr "Fravælg alle"
@@ -11407,7 +11580,7 @@ msgid "DesignManagement|Download design"
msgstr "Download design"
msgid "DesignManagement|Error uploading a new design. Please try again."
-msgstr ""
+msgstr "Fejl ved upload af et nyt design. Prøv venligst igen."
msgid "DesignManagement|Go back to designs"
msgstr "GÃ¥ tilbage til designs"
@@ -11425,16 +11598,16 @@ msgid "DesignManagement|Keep comment"
msgstr "Behold kommentar"
msgid "DesignManagement|Learn more about resolving comments"
-msgstr ""
+msgstr "Lær mere om at løse kommentarer"
msgid "DesignManagement|Requested design version does not exist. Showing latest version instead"
msgstr ""
msgid "DesignManagement|Resolve thread"
-msgstr ""
+msgstr "Løs tråd"
msgid "DesignManagement|Resolved Comments"
-msgstr ""
+msgstr "Løste kommentarer"
msgid "DesignManagement|Save comment"
msgstr "Gem kommentar"
@@ -11443,7 +11616,7 @@ msgid "DesignManagement|Select all"
msgstr "Vælg alle"
msgid "DesignManagement|The maximum number of designs allowed to be uploaded is %{upload_limit}. Please try again."
-msgstr ""
+msgstr "Det maksimale antal designs som kan uploades er %{upload_limit}. Prøv venligst igen."
msgid "DesignManagement|There was an error moving your designs. Please upload your designs below."
msgstr "Der opstod en fejl ved flytning af dine designs. Upload venligst dine designs nedenunder."
@@ -11452,7 +11625,7 @@ msgid "DesignManagement|To upload designs, you'll need to enable LFS and have an
msgstr ""
msgid "DesignManagement|Unresolve thread"
-msgstr ""
+msgstr "Genåbn løst tråd"
msgid "DesignManagement|Upload designs"
msgstr "Upload designs"
@@ -11461,10 +11634,10 @@ msgid "DesignManagement|Upload skipped."
msgstr "Upload sprunget over."
msgid "DesignManagement|Your designs are being copied and are on their way… Please refresh to update."
-msgstr ""
+msgstr "Dine designs er ved at blive kopieret og er på vej … opdater venligst."
msgid "DesignManagement|and %{moreCount} more."
-msgstr ""
+msgstr "og %{moreCount} mere."
msgid "Designs"
msgstr "Designs"
@@ -11500,13 +11673,13 @@ msgid "DevopsAdoption|%{adoptedCount}/%{featuresCount} %{title} features adopted
msgstr ""
msgid "DevopsAdoption|Add a group to get started"
-msgstr ""
+msgstr "Tilføj en gruppe for at komme i gang"
msgid "DevopsAdoption|Add or remove groups"
-msgstr ""
+msgstr "Tilføj eller fjern grupper"
msgid "DevopsAdoption|Add or remove subgroups"
-msgstr ""
+msgstr "Tilføj eller fjern undergrupper"
msgid "DevopsAdoption|Adopted"
msgstr ""
@@ -11518,7 +11691,7 @@ msgid "DevopsAdoption|Adoption by subgroup"
msgstr ""
msgid "DevopsAdoption|An error occurred while removing the group. Please try again."
-msgstr ""
+msgstr "Der opstod en fejl under fjernelse af gruppen. Prøv venligst igen."
msgid "DevopsAdoption|Approvals"
msgstr "Godkendelser"
@@ -11527,7 +11700,7 @@ msgid "DevopsAdoption|Are you sure that you would like to remove %{name} from th
msgstr "Er du sikker på, at du vil fjerne %{name} fra tabellen?"
msgid "DevopsAdoption|At least one approval on a merge request"
-msgstr ""
+msgstr "Mindst én godkendelse på en sammenlægningsanmodning"
msgid "DevopsAdoption|At least one deploy"
msgstr ""
@@ -11536,7 +11709,7 @@ msgid "DevopsAdoption|At least one issue opened"
msgstr ""
msgid "DevopsAdoption|At least one merge request opened"
-msgstr ""
+msgstr "Mindst én sammenlægningsanmodning åbnet"
msgid "DevopsAdoption|At least one pipeline successfully run"
msgstr ""
@@ -11590,7 +11763,7 @@ msgid "DevopsAdoption|Issues"
msgstr "Problemstillinger"
msgid "DevopsAdoption|MRs"
-msgstr ""
+msgstr "Sammenlægningsanmodninger"
msgid "DevopsAdoption|No results…"
msgstr "Ingen resultater …"
@@ -11614,10 +11787,10 @@ msgid "DevopsAdoption|Remove Group from the table."
msgstr "Fjern gruppe fra tabellen."
msgid "DevopsAdoption|Runner configured for project/group"
-msgstr ""
+msgstr "Runner konfigureret for projekt/gruppe"
msgid "DevopsAdoption|Runners"
-msgstr ""
+msgstr "Runnere"
msgid "DevopsAdoption|SAST"
msgstr "SAST"
@@ -11697,16 +11870,34 @@ msgstr ""
msgid "DiffsCompareBaseBranch|(base)"
msgstr ""
+msgid "Diffs|%d addition"
+msgid_plural "Diffs|%d additions"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Diffs|%d deletion"
+msgid_plural "Diffs|%d deletions"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Diffs|No file name available"
msgstr ""
msgid "Diffs|Show %{unfoldCount} lines"
-msgstr ""
+msgstr "Vis %{unfoldCount} linjer"
msgid "Diffs|Show all unchanged lines"
msgstr "Vis alle uændrede linjer"
+msgid "Diffs|Showing %{dropdownStart}%{count} changed file%{dropdownEnd}"
+msgid_plural "Diffs|Showing %{dropdownStart}%{count} changed files%{dropdownEnd}"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Diffs|Something went wrong while fetching diff lines."
+msgstr "Noget gik galt under hentning af diff-linjer."
+
+msgid "Diffs|with %{additions} and %{deletions}"
msgstr ""
msgid "Direct member"
@@ -11728,7 +11919,7 @@ msgid "Disable"
msgstr "Deaktivér"
msgid "Disable Two-factor Authentication"
-msgstr ""
+msgstr "Deaktivér totrinsgodkendelse"
msgid "Disable What's new"
msgstr "Deaktivér Nyheder"
@@ -11737,7 +11928,7 @@ msgid "Disable for this project"
msgstr "Deaktivér for projektet"
msgid "Disable group runners"
-msgstr ""
+msgstr "Deaktivér grupperunnere"
msgid "Disable two-factor authentication"
msgstr ""
@@ -11770,10 +11961,10 @@ msgid "Discard draft"
msgstr "Forkast kladde"
msgid "DiscordService|Discord Notifications"
-msgstr ""
+msgstr "Discord-underretninger"
msgid "DiscordService|Send notifications about project events to a Discord channel."
-msgstr ""
+msgstr "Send underretninger om projektbegivenheder til en Discord-kanal."
msgid "Discover"
msgstr "Opdag"
@@ -11791,10 +11982,10 @@ msgid "Discover|For code that's already live in production, our dashboards give
msgstr ""
msgid "Discover|GitLab will perform static and dynamic tests on the code of your application, looking for known flaws and report them in the merge request so you can fix them before merging."
-msgstr ""
+msgstr "GitLab vil udføre statiske og dynamiske tests på koden i dit program hvor der ledes efter kendte defekter og de rapporteres i sammenlægningsanmodningen, så du kan rette dem inden der sammenlægges."
msgid "Discover|Give feedback for this page"
-msgstr ""
+msgstr "Giv feedback til siden"
msgid "Discover|Security capabilities, integrated into your development lifecycle"
msgstr ""
@@ -11815,13 +12006,13 @@ msgid "Discuss a specific suggestion or question that needs to be resolved"
msgstr ""
msgid "Discuss a specific suggestion or question that needs to be resolved."
-msgstr ""
+msgstr "Debatér et bestemt forslag eller spørgsmål som har brug for at blive løst."
msgid "Discuss a specific suggestion or question."
-msgstr ""
+msgstr "Debatér et bestemt forslag eller spørgsmål."
msgid "Discussion to reply to cannot be found"
-msgstr ""
+msgstr "Kan ikke finde debatten som skal besvares"
msgid "Disk Usage"
msgstr "Diskforbrug"
@@ -11834,14 +12025,11 @@ msgid_plural "Dismiss %d selected vulnerabilities as"
msgstr[0] ""
msgstr[1] ""
-msgid "Dismiss Value Stream Analytics introduction box"
-msgstr ""
-
msgid "Dismiss merge request promotion"
msgstr ""
msgid "Dismiss selected"
-msgstr ""
+msgstr "Afskedig valgte"
msgid "Dismiss trial promotion"
msgstr ""
@@ -11865,7 +12053,7 @@ msgid "Display alerts from all configured monitoring tools."
msgstr ""
msgid "Display name"
-msgstr ""
+msgstr "Visningsnavn"
msgid "Display rendered file"
msgstr ""
@@ -11898,7 +12086,7 @@ msgid "Documentation pages URL"
msgstr ""
msgid "Documents reindexed: %{processed_documents} (%{percentage}%%)"
-msgstr "Dokumenter genindekseret: %{processed_documents} (%{percentage}%%)"
+msgstr "Dokumenter genindekseret: %{processed_documents} (%{percentage} %%)"
msgid "Does not apply to projects in personal namespaces, which are deleted immediately on request."
msgstr ""
@@ -11922,13 +12110,13 @@ msgid "Domain was successfully updated."
msgstr "Domænet blev opdateret."
msgid "Don't have an account yet?"
-msgstr "Har du ikke en konto endnu?"
+msgstr "Har du endnu ikke en konto?"
msgid "Don't include description in commit message"
msgstr "Medtag ikke beskrivelse i commit-meddelelse"
msgid "Don't paste the private part of the GPG key. Paste the public part which begins with '-----BEGIN PGP PUBLIC KEY BLOCK-----'."
-msgstr ""
+msgstr "Indsæt ikke den private del af GPG-nøglen. Indsæt den offentlige del som begynder med '-----BEGIN PGP PUBLIC KEY BLOCK-----'."
msgid "Don't send service data"
msgstr ""
@@ -11940,7 +12128,7 @@ msgid "Done"
msgstr "Færdig"
msgid "Dormant users"
-msgstr ""
+msgstr "Inaktive brugere"
msgid "Download"
msgstr "Download"
@@ -11991,52 +12179,52 @@ msgid "Download this directory"
msgstr "Download mappen"
msgid "DownloadCommit|Email Patches"
-msgstr ""
+msgstr "E-mail-patches"
msgid "DownloadCommit|Plain Diff"
-msgstr ""
+msgstr "Ren diff"
msgid "DownloadSource|Download"
msgstr "Download"
msgid "Downstream"
-msgstr ""
+msgstr "Downstream"
msgid "Downvotes"
-msgstr ""
+msgstr "Nedstemmer"
msgid "Draft"
msgstr "Udkast"
msgid "Draft merge requests can't be merged."
-msgstr ""
+msgstr "Kladdesammenlægningsanmodninger kan ikke sammenlægges."
msgid "Drag your designs here or %{linkStart}click to upload%{linkEnd}."
-msgstr ""
+msgstr "Træk dine designs hertil eller %{linkStart}klik for at uploade%{linkEnd}."
msgid "Drop or %{linkStart}upload%{linkEnd} file to attach"
-msgstr ""
+msgstr "Slip eller %{linkStart}upload%{linkEnd} fil for at vedhæfte"
msgid "Drop or %{linkStart}upload%{linkEnd} files to attach"
-msgstr ""
+msgstr "Slip eller %{linkStart}upload%{linkEnd} filer for at vedhæfte"
msgid "Drop your designs to start your upload."
-msgstr ""
+msgstr "Slip dine designs for at starte din upload."
msgid "Drop your files to start your upload."
-msgstr ""
+msgstr "Slip dine filer for at starte din upload."
msgid "DropdownWidget|An error occurred while fetching the assigned %{issuableAttribute} of the selected %{issuableType}."
-msgstr ""
+msgstr "Der opstod en fejl under hentning af den tildelte %{issuableAttribute} for den valgte %{issuableType}."
msgid "DropdownWidget|Assign %{issuableAttribute}"
-msgstr ""
+msgstr "Tildel %{issuableAttribute}"
msgid "DropdownWidget|Failed to fetch the %{issuableAttribute} for this %{issuableType}. Please try again."
-msgstr ""
+msgstr "Kunne ikke hente %{issuableAttribute} for denne %{issuableType}. Prøv venligst igen."
msgid "DropdownWidget|Failed to set %{issuableAttribute} on this %{issuableType}. Please try again."
-msgstr ""
+msgstr "Kunne ikke indstille %{issuableAttribute} på denne %{issuableType}. Prøv venligst igen."
msgid "DropdownWidget|No %{issuableAttribute}"
msgstr ""
@@ -12057,13 +12245,13 @@ msgid "During this process, you’ll be asked for URLs from GitLab’s side. Use
msgstr ""
msgid "Dynamic Application Security Testing (DAST)"
-msgstr ""
+msgstr "Dynamic Application Security Testing (DAST)"
msgid "E-mail:"
msgstr "E-mail:"
msgid "Each project can also have an issue tracker and a wiki."
-msgstr ""
+msgstr "Hvert projekt kan også have en problemstillingsporing og en wiki."
msgid "Edit"
msgstr "Rediger"
@@ -12087,7 +12275,7 @@ msgid "Edit Group Hook"
msgstr "Rediger gruppehook"
msgid "Edit Identity"
-msgstr ""
+msgstr "Rediger identitet"
msgid "Edit Label"
msgstr "Rediger etiket"
@@ -12099,7 +12287,7 @@ msgid "Edit Password"
msgstr "Rediger adgangskode"
msgid "Edit Pipeline Schedule %{id}"
-msgstr ""
+msgstr "Rediger pipelineplanlægningen %{id}"
msgid "Edit Release"
msgstr "Rediger udgivelse"
@@ -12111,7 +12299,7 @@ msgid "Edit Slack integration"
msgstr "Rediger Slack-integrering"
msgid "Edit Snippet"
-msgstr "Rediger uddrag"
+msgstr "Rediger udklip"
msgid "Edit System Hook"
msgstr "Rediger systemhook"
@@ -12150,7 +12338,7 @@ msgid "Edit in Web IDE"
msgstr "Rediger i Web IDE"
msgid "Edit in single-file editor"
-msgstr ""
+msgstr "Rediger i editor med én fil"
msgid "Edit inline"
msgstr "Rediger indlejret"
@@ -12158,6 +12346,9 @@ msgstr "Rediger indlejret"
msgid "Edit issues"
msgstr "Rediger problemstillinger"
+msgid "Edit merge requests"
+msgstr ""
+
msgid "Edit public deploy key"
msgstr "Rediger offentlig udsendelsesnøgle"
@@ -12165,7 +12356,7 @@ msgid "Edit sidebar"
msgstr "Rediger sidebjælke"
msgid "Edit table"
-msgstr ""
+msgstr "Rediger tabel"
msgid "Edit this file only."
msgstr "Rediger kun filen."
@@ -12189,13 +12380,13 @@ msgid "Edited"
msgstr "Redigeret"
msgid "Edited %{timeago}"
-msgstr "Redigerede %{timeago}"
+msgstr "Redigeret %{timeago}"
msgid "Editing"
-msgstr "Redigerer"
+msgstr "Redigering"
msgid "Elapsed time"
-msgstr ""
+msgstr "Forløbet tid"
msgid "Elasticsearch AWS IAM credentials"
msgstr ""
@@ -12233,38 +12424,41 @@ msgstr ""
msgid "Elastic|None. Select projects to index."
msgstr ""
+msgid "Eligible users"
+msgstr ""
+
msgid "Email"
msgstr "E-mail"
msgid "Email %{number}"
-msgstr ""
+msgstr "E-mail %{number}"
msgid "Email Notification"
-msgstr ""
+msgstr "E-mail-underretning"
msgid "Email a new %{name} to this project"
-msgstr ""
+msgstr "Send e-mail med en ny %{name} til projektet"
msgid "Email address to use for Support Desk"
-msgstr ""
+msgstr "E-mailadresse som skal bruges til serviceskranke"
msgid "Email could not be sent"
-msgstr ""
+msgstr "E-mail kunne ikke sendes"
msgid "Email display name"
msgstr ""
msgid "Email from GitLab - email users right from the Admin Area. %{link_start}Learn more%{link_end}."
-msgstr ""
+msgstr "Send e-mail fra GitLab - send e-mail til brugere direkte fra administratorområdet. %{link_start}Lær mere%{link_end}."
msgid "Email not verified. Please verify your email in Salesforce."
-msgstr ""
+msgstr "E-mail ikke verificeret. Verificer venligst din e-mail i Salesforce."
msgid "Email notification for unknown sign-ins"
-msgstr ""
+msgstr "E-mail-underretning for ukendte indlogninger"
msgid "Email patch"
-msgstr ""
+msgstr "E-mail-patch"
msgid "Email sent"
msgstr "E-mail sendt"
@@ -12282,43 +12476,43 @@ msgid "Email: %{email}"
msgstr "E-mail: %{email}"
msgid "EmailError|It appears that the email is blank. Make sure your reply is at the top of the email, we can't process inline replies."
-msgstr ""
+msgstr "Det ser ud til at e-mailen er tom. Sørg for at dit svar er øverst i e-mailen. Vi kan ikke behandle indlejrede svar."
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 ""
+msgstr "Tråden du besvarer findes ikke længere. Måske blev den slettet? Hvis du mener det er en fejl, så kontakt en medarbejder."
msgid "EmailError|We couldn't figure out what the email is for. Please create your issue or comment through the web interface."
-msgstr ""
+msgstr "Vi kunne ikke finde ud af hvad e-mailen er til. Opret venligst din problemstilling eller kommentar gennem webgrænsefladen."
msgid "EmailError|We couldn't figure out what the email is in reply to. Please create your comment through the web interface."
-msgstr ""
+msgstr "Vi kunne ikke finde ud af hvad e-mailen er et svar til. Opret venligst din kommentar gennem webgrænsefladen."
msgid "EmailError|We couldn't figure out what user corresponds to the email. Please create your comment through the web interface."
-msgstr ""
+msgstr "Vi kunne ikke finde ud af hvilken bruger der tilhører e-mailen. Opret venligst din kommentar gennem webgrænsefladen."
msgid "EmailError|We couldn't find the project. Please check if there's any typo."
-msgstr ""
+msgstr "Vi kunne ikke finde projektet. Tjek venligst om der er nogle stavefejl."
msgid "EmailError|You are not allowed to perform this action. If you believe this is in error, contact a staff member."
-msgstr ""
+msgstr "Du har ikke tilladelse til at udføre handlingen. Hvis du mener det er en fejl, så kontakt en medarbejder."
msgid "EmailError|Your account has been blocked. If you believe this is in error, contact a staff member."
-msgstr ""
+msgstr "Din konto er blevet blokeret. Hvis du mener det er en fejl, så kontakt en medarbejder."
msgid "EmailParticipantsWarning|%{emails} will be notified of your comment."
-msgstr ""
+msgstr "%{emails} vil blive underrettet om din kommentar."
msgid "EmailParticipantsWarning|%{emails}, %{andMore} will be notified of your comment."
-msgstr ""
+msgstr "%{emails}, %{andMore} vil blive underrettet om din kommentar."
msgid "EmailParticipantsWarning|and %{moreCount} more"
-msgstr ""
+msgstr "og %{moreCount} mere"
msgid "Emails"
msgstr "E-mails"
msgid "Emails sent from Service Desk have this name."
-msgstr ""
+msgstr "E-mails som sendes fra serviceskranken har dette navn."
msgid "Emails sent to %{email} are also supported."
msgstr ""
@@ -12345,7 +12539,7 @@ msgid "EmailsOnPushService|Send notifications from the committer's email address
msgstr ""
msgid "EmailsOnPushService|can't exceed %{recipients_limit}"
-msgstr ""
+msgstr "må ikke overstige %{recipients_limit}"
msgid "EmailsOnPushService|tanuki@example.com gitlab@example.com"
msgstr ""
@@ -12354,7 +12548,7 @@ msgid "Embed"
msgstr "Indlejr"
msgid "Embed an image of your existing Jaeger server in GitLab."
-msgstr ""
+msgstr "Indlejr et aftryk af din eksisterende Jaeger-server i GitLab."
msgid "Empty file"
msgstr "Tom fil"
@@ -12362,6 +12556,9 @@ msgstr "Tom fil"
msgid "Enable"
msgstr "Aktivér"
+msgid "Enable Amazon EKS integration"
+msgstr ""
+
msgid "Enable Auto DevOps"
msgstr "Aktivér Auto DevOps"
@@ -12375,7 +12572,7 @@ msgid "Enable Gitpod?"
msgstr "Aktivér Gitpod?"
msgid "Enable Invisible Captcha during sign up"
-msgstr ""
+msgstr "Aktivér usynlig Captcha under tilmelding"
msgid "Enable Kroki"
msgstr "Aktivér Kroki"
@@ -12393,13 +12590,16 @@ msgid "Enable Registration Features"
msgstr ""
msgid "Enable SSL verification"
+msgstr "Aktivér SSL-verificering"
+
+msgid "Enable Service Ping"
msgstr ""
msgid "Enable Snowplow tracking"
msgstr ""
msgid "Enable Spam Check via external API endpoint"
-msgstr ""
+msgstr "Aktivér spamtjek via eksternt API-slutpunkt"
msgid "Enable What's new: All tiers"
msgstr ""
@@ -12425,11 +12625,14 @@ msgstr ""
msgid "Enable authenticated Git LFS request rate limit"
msgstr ""
+msgid "Enable authenticated web request rate limit"
+msgstr ""
+
msgid "Enable authentication"
msgstr ""
msgid "Enable automatic repository housekeeping"
-msgstr ""
+msgstr "Aktivér automatisk depothusarbejde"
msgid "Enable classification control using an external service"
msgstr ""
@@ -12438,10 +12641,10 @@ msgid "Enable container expiration and retention policies for projects created e
msgstr ""
msgid "Enable delayed project deletion by default for newly-created groups."
-msgstr ""
+msgstr "Aktivér forsinket projektsletning som standard for nyligt oprettede grupper."
msgid "Enable email notification"
-msgstr ""
+msgstr "Aktivér e-mail-underretning"
msgid "Enable error tracking"
msgstr ""
@@ -12453,7 +12656,7 @@ msgid "Enable for this project"
msgstr "Aktivér for projektet"
msgid "Enable group runners"
-msgstr ""
+msgstr "Aktivér grupperunnere"
msgid "Enable header and footer in emails"
msgstr ""
@@ -12480,12 +12683,12 @@ msgid "Enable maintenance mode"
msgstr "Aktivér vedligeholdelsestilstand"
msgid "Enable multipart emails"
-msgstr ""
+msgstr "Aktivér multipart e-mails"
msgid "Enable or disable the Pseudonymizer data collection."
msgstr ""
-msgid "Enable or disable version check and service ping."
+msgid "Enable or disable version check and Service Ping."
msgstr ""
msgid "Enable protected paths rate limit"
@@ -12497,26 +12700,20 @@ msgstr "Aktivér proxy"
msgid "Enable reCAPTCHA"
msgstr "Aktivér reCAPTCHA"
-msgid "Enable reCAPTCHA for login"
-msgstr "Aktivér reCAPTCHA for indlogning"
-
-msgid "Enable reCAPTCHA, Invisible Captcha, Akismet and set IP limits. For reCAPTCHA, we currently only support %{recaptcha_v2_link_start}v2%{recaptcha_v2_link_end}"
+msgid "Enable reCAPTCHA for login."
msgstr ""
msgid "Enable repository checks"
msgstr ""
-msgid "Enable service ping"
-msgstr ""
-
msgid "Enable shared runners for all projects and subgroups in this group."
msgstr ""
msgid "Enable shared runners for this group"
-msgstr ""
+msgstr "Aktivér delte runnere for gruppen"
msgid "Enable shared runners for this project"
-msgstr ""
+msgstr "Aktivér delte runnere for projektet"
msgid "Enable smartcn custom analyzer: Indexing"
msgstr ""
@@ -12525,12 +12722,15 @@ msgid "Enable smartcn custom analyzer: Search"
msgstr ""
msgid "Enable two-factor authentication"
-msgstr "Aktivér tofaktorgodkendelse"
+msgstr "Aktivér totrinsgodkendelse"
msgid "Enable unauthenticated API request rate limit"
msgstr ""
-msgid "Enable unauthenticated request rate limit"
+msgid "Enable unauthenticated web request rate limit"
+msgstr ""
+
+msgid "Enable user deactivation emails"
msgstr ""
msgid "Enable version check"
@@ -12558,7 +12758,7 @@ msgid "Enabled"
msgstr "Aktiveret"
msgid "Enabled Git access protocols"
-msgstr ""
+msgstr "Aktivér Git-adgangsprotokoller"
msgid "Enabled OAuth authentication sources"
msgstr ""
@@ -12566,11 +12766,8 @@ msgstr ""
msgid "Enabled sources for code import during project creation. OmniAuth must be configured for GitHub"
msgstr ""
-msgid "Enabling this will only make licensed EE features available to projects if the project namespace's plan includes the feature or if the project is public."
-msgstr ""
-
msgid "Encountered an error while rendering: %{err}"
-msgstr ""
+msgstr "Stødte på en fejl under gengivelse: %{err}"
msgid "End Time"
msgstr "Sluttid"
@@ -12617,32 +12814,26 @@ msgstr ""
msgid "Enter Admin Mode"
msgstr "GÃ¥ i administratortilstand"
-msgid "Enter IP address range"
-msgstr ""
-
msgid "Enter a number"
msgstr "Indtast et tal"
msgid "Enter an integer number between 0 and 100"
-msgstr ""
+msgstr "Indtast et heltal fra 0 til 100"
msgid "Enter an integer number number between 0 and 100"
-msgstr ""
+msgstr "Indtast et heltal fra 0 til 100"
msgid "Enter at least three characters to search"
-msgstr ""
-
-msgid "Enter domain"
-msgstr "Indtast domæne"
+msgstr "Indtast mindst tre tegn for at søge"
msgid "Enter in your Bitbucket Server URL and personal access token below"
-msgstr ""
+msgstr "Indtast din Bitbucket-server-URL og personlige adgangstoken nedenunder"
msgid "Enter in your Phabricator Server URL and personal access token below"
-msgstr ""
+msgstr "Indtast URL'en til din Phabricator-server og personlige adgangstoken nedenunder"
msgid "Enter merge request URLs"
-msgstr ""
+msgstr "Indtast sammenlægningsanmodnings-URL'er"
msgid "Enter new AWS Secret Access Key"
msgstr ""
@@ -12651,13 +12842,13 @@ msgid "Enter number of issues"
msgstr "Indtast antal problemstillinger"
msgid "Enter one or more user ID separated by commas"
-msgstr ""
+msgstr "Indtast ét eller flere bruger-id'er separeret af kommaer"
msgid "Enter the %{name} description"
-msgstr ""
+msgstr "Indtast beskrivelsen for %{name}"
msgid "Enter the %{name} title"
-msgstr ""
+msgstr "Indtast titlen for %{name}"
msgid "Enter the code from the two-factor app on your mobile device. If you've lost your device, you may enter one of your recovery codes."
msgstr ""
@@ -12669,7 +12860,7 @@ msgid "Enter the number of seconds, or other human-readable input, like \"1 hour
msgstr ""
msgid "Enter your Packagist server. Defaults to https://packagist.org."
-msgstr ""
+msgstr "Indtast din Packagist-server. Er som standard https://packagist.org."
msgid "Enter your Packagist token."
msgstr ""
@@ -12690,16 +12881,16 @@ msgid "Environment does not have deployments"
msgstr ""
msgid "Environment is required for Stages::MetricEndpointInserter"
-msgstr ""
+msgstr "Miljø kræves for Stages::MetricEndpointInserter"
msgid "Environment is required for Stages::VariableEndpointInserter"
-msgstr ""
+msgstr "Miljø kræves for Stages::VariableEndpointInserter"
msgid "Environment scope"
msgstr "Miljøomfang"
msgid "Environment variable %{code_start}%{environment_variable}%{code_end} does not exist or is not pointing to a valid directory."
-msgstr ""
+msgstr "Miljøvariablen %{code_start}%{environment_variable}%{code_end} findes ikke eller peger ikke til en gyldig mappe."
msgid "Environment variables are configured by your administrator to be %{link_start}protected%{link_end} by default."
msgstr ""
@@ -12717,7 +12908,7 @@ msgid "EnvironmentDashboard|Created through the Deployment API"
msgstr ""
msgid "EnvironmentDashboard|You are looking at the last updated environment"
-msgstr ""
+msgstr "Du kigger på det sidste opdaterede miljø"
msgid "Environments"
msgstr "Miljøer"
@@ -12732,7 +12923,7 @@ msgid "Environments in %{name}"
msgstr "Miljøer i %{name}"
msgid "EnvironmentsAlert|%{severity} • %{title} %{text}. %{linkStart}View Details%{linkEnd} · %{startedAt} "
-msgstr ""
+msgstr "%{severity} • %{title} %{text}. %{linkStart}Vis detaljer%{linkEnd} · %{startedAt} "
msgid "EnvironmentsDashboard|Add a project to the dashboard"
msgstr "Tilføj et projekt til betjeningspanelet"
@@ -12762,34 +12953,34 @@ msgid "EnvironmentsDashboard|This dashboard displays 3 environments per project,
msgstr ""
msgid "Environments|An error occurred while canceling the auto stop, please try again"
-msgstr ""
+msgstr "Der opstod en fejl under annullering af det automatisk stop. Prøv venligst igen"
msgid "Environments|An error occurred while deleting the environment. Check if the environment stopped; if not, stop it and try again."
-msgstr ""
+msgstr "Der opstod en fejl under sletning af miljøet. Tjek om miljøet er stoppet. Hvis det ikke er tilfældet, så stop det og prøv igen."
msgid "Environments|An error occurred while fetching the environments."
-msgstr ""
+msgstr "Der opstod en fejl under hentning af miljøerne."
msgid "Environments|An error occurred while making the request."
msgstr ""
msgid "Environments|An error occurred while re-deploying the environment, please try again"
-msgstr ""
+msgstr "Der opstod en fejl under genudsendelse af miljøet. Prøv venligst igen"
msgid "Environments|An error occurred while rolling back the environment, please try again"
-msgstr ""
+msgstr "Der opstod en fejl under tilbagerulning af miljøet. Prøv venligst igen"
msgid "Environments|An error occurred while stopping the environment, please try again"
-msgstr ""
+msgstr "Der opstod en fejl under stop af miljøet. Prøv venligst igen"
msgid "Environments|Are you sure you want to stop this environment?"
msgstr "Er du sikker på, at du vil stoppe miljøet?"
msgid "Environments|Auto stop in"
-msgstr ""
+msgstr "Automatisk stop om"
msgid "Environments|Auto stops %{autoStopAt}"
-msgstr ""
+msgstr "Stopper automatisk %{autoStopAt}"
msgid "Environments|Commit"
msgstr "Commit"
@@ -12798,7 +12989,7 @@ msgid "Environments|Currently showing %{fetched} results."
msgstr ""
msgid "Environments|Currently showing all results."
-msgstr ""
+msgstr "Viser i øjeblikket alle resultater."
msgid "Environments|Delete"
msgstr "Slet"
@@ -12821,9 +13012,6 @@ msgstr "Udsendelse"
msgid "Environments|Deployment %{status}"
msgstr ""
-msgid "Environments|Dismiss"
-msgstr ""
-
msgid "Environments|Enable review app"
msgstr ""
@@ -12836,9 +13024,6 @@ msgstr "Miljøer"
msgid "Environments|Environments are places where code gets deployed, such as staging or production."
msgstr ""
-msgid "Environments|Help us improve environments"
-msgstr ""
-
msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
msgstr ""
@@ -12867,40 +13052,43 @@ msgid "Environments|No deployments yet"
msgstr ""
msgid "Environments|No pod selected"
-msgstr ""
+msgstr "Ingen pod valgt"
msgid "Environments|No pods to display"
-msgstr ""
+msgstr "Ingen pods at vise"
msgid "Environments|Note that this action will stop the environment, but it will %{emphasisStart}not%{emphasisEnd} have an effect on any existing deployment due to no “stop environment action†being defined in the %{ciConfigLinkStart}.gitlab-ci.yml%{ciConfigLinkEnd} file."
msgstr ""
+msgid "Environments|Open"
+msgstr ""
+
msgid "Environments|Open live environment"
msgstr ""
msgid "Environments|Pod name"
-msgstr ""
+msgstr "Podnavn"
msgid "Environments|Re-deploy"
-msgstr ""
+msgstr "Genudsend"
msgid "Environments|Re-deploy environment %{name}?"
-msgstr ""
+msgstr "Genudsend miljøet %{name}?"
msgid "Environments|Re-deploy to environment"
msgstr ""
msgid "Environments|Rollback"
-msgstr ""
+msgstr "Tilbagerul"
msgid "Environments|Rollback environment"
-msgstr ""
+msgstr "Tilbagerul miljø"
msgid "Environments|Rollback environment %{name}?"
-msgstr ""
+msgstr "Tilbagerul miljøet %{name}?"
msgid "Environments|Select pod"
-msgstr ""
+msgstr "Vælg pod"
msgid "Environments|Show all"
msgstr "Vis alle"
@@ -12914,9 +13102,6 @@ msgstr "Stop miljø"
msgid "Environments|Stopping %{environmentName}"
msgstr ""
-msgid "Environments|Take the survey"
-msgstr ""
-
msgid "Environments|There was an error fetching the logs. Please try again."
msgstr "Der opstod en fejl ved hentning af loggene. Prøv venligst igen."
@@ -12927,22 +13112,19 @@ msgid "Environments|This action will run the job defined by %{name} for commit %
msgstr ""
msgid "Environments|Upcoming"
-msgstr ""
+msgstr "Kommende"
msgid "Environments|Upcoming deployment"
-msgstr ""
+msgstr "Kommende udsendelse"
msgid "Environments|Updated"
msgstr "Opdateret"
msgid "Environments|You don't have any environments right now"
-msgstr ""
-
-msgid "Environments|Your feedback helps GitLab make environments better for you and other users. Participate and enter a sweepstake to win a USD 30 gift card."
-msgstr ""
+msgstr "Du har ikke nogle miljøer lige nu"
msgid "Environments|by %{avatar}"
-msgstr ""
+msgstr "af %{avatar}"
msgid "Environments|protected"
msgstr "beskyttet"
@@ -12954,13 +13136,13 @@ msgid "Epic Boards"
msgstr "Epictavler"
msgid "Epic cannot be found."
-msgstr ""
+msgstr "Kan ikke finde epic."
msgid "Epic details"
-msgstr ""
+msgstr "Epicdetaljer"
msgid "Epic events"
-msgstr ""
+msgstr "Epic-begivenheder"
msgid "Epic not found for given params"
msgstr ""
@@ -12978,7 +13160,7 @@ msgid "Epics let you manage your portfolio of projects more efficiently and with
msgstr ""
msgid "Epics, issues, and merge requests"
-msgstr ""
+msgstr "Epics, problemstillinger og sammenlægningsanmodninger"
msgid "Epics|%{startDate} – %{dueDate}"
msgstr "%{startDate} – %{dueDate}"
@@ -12993,25 +13175,25 @@ msgid "Epics|Add an existing epic"
msgstr "Tilføj en eksisterende epic"
msgid "Epics|An error occurred while saving the %{epicDateType} date"
-msgstr ""
+msgstr "Der opstod en fejl under gemning af %{epicDateType}-dato"
msgid "Epics|An error occurred while updating labels."
-msgstr ""
+msgstr "Der opstod en fejl under opdatering af etiketter."
msgid "Epics|Are you sure you want to remove %{bStart}%{targetIssueTitle}%{bEnd} from %{bStart}%{parentEpicTitle}%{bEnd}?"
msgstr "Er du sikker på, at du vil fjerne %{bStart}%{targetIssueTitle}%{bEnd} fra %{bStart}%{parentEpicTitle}%{bEnd}?"
msgid "Epics|Assign Epic"
-msgstr ""
+msgstr "Tildel epic"
msgid "Epics|Enter a title for your epic"
-msgstr ""
+msgstr "Indtast en titel til din epic"
msgid "Epics|How can I solve this?"
-msgstr ""
+msgstr "Hvordan kan jeg løse det?"
msgid "Epics|Leave empty to inherit from milestone dates"
-msgstr ""
+msgstr "Lad den være tom for at nedarve fra milepælsdatoer"
msgid "Epics|No start date – %{dueDate}"
msgstr "Ingen startdato – %{dueDate}"
@@ -13044,7 +13226,7 @@ msgid "Epics|Something went wrong while fetching child epics."
msgstr "Noget gik galt under hentning af underepics."
msgid "Epics|Something went wrong while fetching epics list."
-msgstr "Noget gik galt under hentning af epicsliste."
+msgstr "Noget gik galt under hentning af epicliste."
msgid "Epics|Something went wrong while fetching group epics."
msgstr "Noget gik galt under hentning af gruppeepics."
@@ -13065,13 +13247,13 @@ msgid "Epics|This epic and any containing child epics are confidential and shoul
msgstr ""
msgid "Epics|This will also remove any descendents of %{bStart}%{targetEpicTitle}%{bEnd} from %{bStart}%{parentEpicTitle}%{bEnd}. Are you sure?"
-msgstr ""
+msgstr "Det vil også fjerne efterkommere af %{bStart}%{targetEpicTitle}%{bEnd} fra %{bStart}%{parentEpicTitle}%{bEnd}. Er du sikker?"
msgid "Epics|To schedule your epic's %{epicDateType} date based on milestones, assign a milestone with a %{epicDateType} date to any issue in the epic."
msgstr ""
msgid "Epics|Unable to save epic. Please try again"
-msgstr "Kan ikke gemme epic. Prøv venligst igen."
+msgstr "Kan ikke gemme epic. Prøv venligst igen"
msgid "Epics|due"
msgstr ""
@@ -13098,10 +13280,10 @@ msgid "Error creating new iteration"
msgstr "Fejl ved oprettelse af nyt gennemløb"
msgid "Error creating repository for snippet with id %{snippet_id}"
-msgstr "Fejl ved oprettelse af depot for uddrag med id'et %{snippet_id}"
+msgstr "Fejl ved oprettelse af depot for udklip med id'et %{snippet_id}"
msgid "Error creating the snippet"
-msgstr "Fejl ved oprettelse af uddraget"
+msgstr "Fejl ved oprettelse af udklippet"
msgid "Error deleting %{issuableType}"
msgstr "Fejl ved sletning af %{issuableType}"
@@ -13113,10 +13295,10 @@ msgid "Error fetching burnup chart data"
msgstr ""
msgid "Error fetching diverging counts for branches. Please try again."
-msgstr ""
+msgstr "Fejl ved hentning af afvigende tællinger for grene. Prøv venligst igen."
msgid "Error fetching forked projects. Please try again."
-msgstr ""
+msgstr "Fejl ved hentning af forgrenede projekter. Prøv venligst igen."
msgid "Error fetching labels."
msgstr "Fejl ved hentning af etiketter."
@@ -13128,13 +13310,13 @@ msgid "Error fetching payload data."
msgstr ""
msgid "Error fetching refs"
-msgstr ""
+msgstr "Fejl ved hentning af referencer"
msgid "Error fetching the dependency list. Please check your network connection and try again."
-msgstr ""
+msgstr "Fejl ved hentning af afhængighedsliste. Tjek venligst din netværksforbindelse og prøv igen."
msgid "Error loading branch data. Please try again."
-msgstr ""
+msgstr "Fejl ved indlæsning af grendata. Prøv venligst igen."
msgid "Error loading branches."
msgstr "Fejl ved indlæsning af grene."
@@ -13158,13 +13340,13 @@ msgid "Error loading last commit."
msgstr "Fejl ved indlæsning af sidste commit."
msgid "Error loading markdown preview"
-msgstr ""
+msgstr "Fejl ved indlæsning af markdown-forhåndsvisning"
msgid "Error loading merge requests."
msgstr "Fejl ved indlæsning af sammenlægningsanmodninger."
msgid "Error loading milestone tab"
-msgstr ""
+msgstr "Fejl ved indlæsning af fanebladet milepæl"
msgid "Error loading project data. Please try again."
msgstr "Fejl ved indlæsning af projektdata. Prøv venligst igen."
@@ -13179,10 +13361,10 @@ msgid "Error loading viewer"
msgstr "Fejl ved indlæsning af fremviser"
msgid "Error occurred when fetching sidebar data"
-msgstr ""
+msgstr "Der opstod en fejl under hentning af sidebjælkedata"
msgid "Error occurred when saving assignees"
-msgstr ""
+msgstr "Der opstod en fejl ved gemning af tildelere"
msgid "Error occurred when saving reviewers"
msgstr "Der opstod en fejl under gemning af kontrollanter"
@@ -13200,7 +13382,7 @@ msgid "Error occurred. A blocked user cannot be deactivated"
msgstr "Der opstod en fejl. En blokeret bruger kan ikke deaktiveres"
msgid "Error occurred. A blocked user must be unblocked to be activated"
-msgstr ""
+msgstr "Der opstod en fejl. En blokeret bruger skal fjernes fra blokering for at kunne aktiveres"
msgid "Error occurred. User was not banned"
msgstr "Der opstod en fejl. Brugeren blev ikke udelukket"
@@ -13209,43 +13391,43 @@ msgid "Error occurred. User was not blocked"
msgstr "Der opstod en fejl. Brugeren blev ikke blokeret"
msgid "Error occurred. User was not confirmed"
-msgstr ""
+msgstr "Der opstod en fejl. Brugeren blev ikke bekræftet"
msgid "Error occurred. User was not unbanned"
-msgstr ""
+msgstr "Der opstod en fejl. Brugeren blev ikke fjernet fra udelukkelse"
msgid "Error occurred. User was not unblocked"
-msgstr ""
+msgstr "Der opstod en fejl. Brugeren blev ikke fjernet fra blokering"
msgid "Error occurred. User was not unlocked"
-msgstr ""
+msgstr "Der opstod en fejl. Brugeren blev ikke oplåst"
msgid "Error parsing CSV file. Please make sure it has"
-msgstr ""
+msgstr "Fejl ved fortolkning af CSV-fil. Sørg venligst for at den har"
-msgid "Error rendering markdown preview"
-msgstr "Fejl ved gengivelse af markdown-forhåndsvisning"
+msgid "Error rendering Markdown preview"
+msgstr ""
msgid "Error saving label update."
-msgstr ""
+msgstr "Fejl ved gemning af etiketopdatering."
msgid "Error setting up editor. Please try again."
-msgstr ""
+msgstr "Fejl ved opsætning af editor. Prøv venligst igen."
msgid "Error tracking"
-msgstr ""
+msgstr "Fejlsporing"
msgid "Error updating %{issuableType}"
msgstr "Fejl ved opdatering af %{issuableType}"
msgid "Error updating status for all to-do items."
-msgstr ""
+msgstr "Fejl ved opdatering af status for alle gøremålselementer."
msgid "Error updating status of to-do item."
-msgstr ""
+msgstr "Fejl ved opdatering af status på gøremålselement."
msgid "Error updating the snippet"
-msgstr "Fejl ved opdatering af uddraget"
+msgstr "Fejl ved opdatering af udklippet"
msgid "Error uploading file"
msgstr "Fejl ved upload af fil"
@@ -13263,17 +13445,20 @@ msgid "Error while loading the project data. Please try again."
msgstr "Fejl ved indlæsning af projektdataene. Prøv venligst igen."
msgid "Error while migrating %{upload_id}: %{error_message}"
-msgstr ""
+msgstr "Fejl ved migrering af %{upload_id}: %{error_message}"
msgid "Error with Akismet. Please check the logs for more info."
-msgstr ""
+msgstr "Fejl med Akismet. Tjek venligst loggene for mere information."
msgid "Error: %{error_message}"
msgstr "Fejl: %{error_message}"
-msgid "Error: No AWS credentials were supplied"
+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"
msgstr ""
@@ -13281,10 +13466,10 @@ msgid "Error: Unable to create deploy freeze"
msgstr "Fejl: kan ikke oprette udsendelsesfrysning"
msgid "Error: Unable to delete deploy freeze"
-msgstr ""
+msgstr "Fejl: kan ikke slette udsendelsesfrysning"
msgid "Error: Unable to find AWS role for current user"
-msgstr ""
+msgstr "Fejl: kan ikke finde AWS-rolle for nuværende bruger"
msgid "ErrorTracking|Active"
msgstr "Aktiv"
@@ -13302,13 +13487,16 @@ msgid "ErrorTracking|Connection failed. Check Auth Token and try again."
msgstr ""
msgid "ErrorTracking|Enable error tracking"
+msgstr "Aktivér fejlsporing"
+
+msgid "ErrorTracking|Error tracking backend"
msgstr ""
msgid "ErrorTracking|If you self-host Sentry, enter your Sentry instance's full URL. If you use Sentry's hosted solution, enter https://sentry.io"
msgstr ""
msgid "ErrorTracking|No projects available"
-msgstr ""
+msgstr "Ingen projekter tilgængelige"
msgid "ErrorTracking|Select project"
msgstr "Vælg projekt"
@@ -13326,20 +13514,26 @@ msgid "Errors:"
msgstr "Fejl:"
msgid "Escalation Policies"
-msgstr ""
+msgstr "Eskaleringsregelsæt"
msgid "Escalation policies"
-msgstr ""
+msgstr "Eskaleringsregelsæt"
msgid "Escalation policies may not have more than %{rule_count} rules"
-msgstr ""
+msgstr "Eksaleringsregelsæt må ikke have mere end %{rule_count} regler"
msgid "Escalation policies must have at least one rule"
msgstr ""
-msgid "EscalationPolicies|+ Add an additional rule"
+msgid "EscalationPolicies|%{clockIcon} IF alert is not %{alertStatus} in %{minutes}"
msgstr ""
+msgid "EscalationPolicies|%{notificationIcon} THEN %{doAction} %{forScheduleOrUser}"
+msgstr ""
+
+msgid "EscalationPolicies|+ Add an additional rule"
+msgstr "+ Tilføj en yderligere regel"
+
msgid "EscalationPolicies|A schedule is required for adding an escalation policy."
msgstr ""
@@ -13350,85 +13544,85 @@ msgid "EscalationPolicies|A user is required for adding an escalation policy."
msgstr ""
msgid "EscalationPolicies|Add an escalation policy"
-msgstr ""
+msgstr "Tilføj et eskaleringsregelsæt"
msgid "EscalationPolicies|Add escalation policy"
-msgstr ""
+msgstr "Tilføj eskaleringsregelsæt"
msgid "EscalationPolicies|Add policy"
msgstr "Tilføj regelsæt"
msgid "EscalationPolicies|Are you sure you want to delete the \"%{escalationPolicy}\" escalation policy? This action cannot be undone."
-msgstr ""
+msgstr "Er du sikker på, at du vil slette eskaleringsregelsættet \"%{escalationPolicy}\"? Handlingen kan ikke fortrydes."
msgid "EscalationPolicies|Create an escalation policy in GitLab"
-msgstr ""
+msgstr "Opret et eskaleringsregelsæt i GitLab"
msgid "EscalationPolicies|Delete escalation policy"
-msgstr ""
+msgstr "Slet eskaleringsregelsæt"
msgid "EscalationPolicies|Edit escalation policy"
-msgstr ""
+msgstr "Rediger eskaleringsregelsæt"
msgid "EscalationPolicies|Email on-call user in schedule"
-msgstr ""
+msgstr "Send e-mail til vagtbruger i plan"
msgid "EscalationPolicies|Email user"
-msgstr ""
+msgstr "Send e-mail til bruger"
msgid "EscalationPolicies|Escalation policies"
+msgstr "Eskaleringsregelsæt"
+
+msgid "EscalationPolicies|Escalation policy %{obstacle} in Project %{project}"
msgstr ""
msgid "EscalationPolicies|Escalation rules"
-msgstr ""
+msgstr "Eskaleringsregler"
msgid "EscalationPolicies|Failed to load oncall-schedules"
msgstr ""
-msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} %{then} THEN %{doAction} %{scheduleOrUser}"
-msgstr ""
-
msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} minutes"
-msgstr ""
+msgstr "HVIS alertbesked ikke er %{alertStatus} om %{minutes} minutter"
msgid "EscalationPolicies|Maximum of 10 rules has been reached."
msgstr ""
msgid "EscalationPolicies|Minutes must be between 0 and 1440."
-msgstr ""
+msgstr "Minutter skal være fra 0 til 1440."
msgid "EscalationPolicies|Remove escalation rule"
-msgstr ""
+msgstr "Fjern eskaleringsregel"
msgid "EscalationPolicies|Search for user"
msgstr "Søg efter bruger"
msgid "EscalationPolicies|Select schedule"
-msgstr ""
+msgstr "Vælg planlægning"
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 ""
+msgstr "SÃ… %{doAction} %{scheduleOrUser}"
msgid "EscalationPolicies|The escalation policy could not be deleted. Please try again."
-msgstr ""
+msgstr "Eskaleringsregelsættet kunne ikke slettes. Prøv venligst igen."
msgid "EscalationPolicies|The escalation policy could not be updated. Please try again"
-msgstr ""
+msgstr "Eskaleringsregelsættet kunne ikke opdateres. Prøv venligst igen"
msgid "EscalationPolicies|This policy has no escalation rules."
-msgstr ""
+msgstr "Regelsættet har ingen eskaleringsregler."
msgid "EscalationPolicies|mins"
msgstr ""
msgid "Estimate"
-msgstr ""
+msgstr "Estimat"
msgid "Estimated"
-msgstr ""
+msgstr "Estimeret"
msgid "EventFilterBy|Filter by all"
msgstr "Filtrér efter alle"
@@ -13443,10 +13637,10 @@ msgid "EventFilterBy|Filter by epic events"
msgstr ""
msgid "EventFilterBy|Filter by issue events"
-msgstr ""
+msgstr "Filtrér efter problemstillingsbegivenheder"
msgid "EventFilterBy|Filter by merge events"
-msgstr ""
+msgstr "Filtrér efter sammenlægningsbegivenheder"
msgid "EventFilterBy|Filter by push events"
msgstr ""
@@ -13461,6 +13655,18 @@ msgid "Events"
msgstr "Begivenheder"
msgid "Every %{action} attempt has failed: %{job_error_message}. Please try again."
+msgstr "Alle forsøg på %{action} mislykkedes: %{job_error_message}. Prøv venligst igen."
+
+msgid "Every 3 months"
+msgstr ""
+
+msgid "Every 3 months on the %{day} at %{time} %{timezone}"
+msgstr ""
+
+msgid "Every 6 months"
+msgstr ""
+
+msgid "Every 6 months on the %{day} at %{time} %{timezone}"
msgstr ""
msgid "Every day"
@@ -13469,12 +13675,18 @@ msgstr "Hver dag"
msgid "Every day (at %{time})"
msgstr "Hver dag (kl. %{time})"
+msgid "Every day at %{time} %{timezone}"
+msgstr ""
+
msgid "Every month"
msgstr "Hver måned"
msgid "Every month (Day %{day} at %{time})"
msgstr "Hver måned (dag %{day} kl. %{time})"
+msgid "Every month on the %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Every three months"
msgstr "Hver tredje måned"
@@ -13489,6 +13701,15 @@ msgstr[1] "Hver %d. uge"
msgid "Every week (%{weekday} at %{time})"
msgstr "Hver uge (%{weekday} kl. %{time})"
+msgid "Every week on %{day} at %{time} %{timezone}"
+msgstr ""
+
+msgid "Every year"
+msgstr ""
+
+msgid "Every year on %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Everyone"
msgstr "Alle"
@@ -13502,31 +13723,28 @@ msgid "Everything on your to-do list is marked as done."
msgstr ""
msgid "Everything you need to create a GitLab Pages site using Gatsby"
-msgstr ""
+msgstr "Alt hvad du har brug for til at oprette et GitLab Pages-websted med Gatsby"
msgid "Everything you need to create a GitLab Pages site using GitBook"
-msgstr ""
+msgstr "Alt hvad du har brug for til at oprette et GitLab Pages-websted med GitBook"
msgid "Everything you need to create a GitLab Pages site using Hexo"
-msgstr ""
+msgstr "Alt hvad du har brug for til at oprette et GitLab Pages-websted med Hexo"
msgid "Everything you need to create a GitLab Pages site using Hugo"
-msgstr ""
+msgstr "Alt hvad du har brug for til at oprette et GitLab Pages-websted med Hugo"
msgid "Everything you need to create a GitLab Pages site using Jekyll"
-msgstr ""
+msgstr "Alt hvad du har brug for til at oprette et GitLab Pages-websted med Jekyll"
msgid "Everything you need to create a GitLab Pages site using plain HTML"
-msgstr ""
+msgstr "Alt hvad du har brug for til at oprette et GitLab Pages-websted med ren HTML"
msgid "Evidence collection"
-msgstr ""
+msgstr "Bevissamling"
msgid "Exactly one of %{attributes} is required"
-msgstr ""
-
-msgid "Example: %{ip_address}. %{read_more_link}."
-msgstr "Eksempel: %{ip_address}. %{read_more_link}."
+msgstr "Præcist én af %{attributes} kræves"
msgid "Example: @sub\\.company\\.com$"
msgstr "Eksempel: @sub\\.company\\.com$"
@@ -13544,19 +13762,19 @@ msgid "Excess storage"
msgstr ""
msgid "Excluding merge commits. Limited to %{limit} commits."
-msgstr ""
+msgstr "Uden sammenlægningscommits. Begrænset til %{limit} commits."
msgid "Excluding merge commits. Limited to 6,000 commits."
-msgstr ""
+msgstr "Uden sammenlægningscommits. Begrænset til 6.000 commits."
msgid "Execution time"
-msgstr ""
+msgstr "Udførelsestid"
msgid "Existing branch name, tag, or commit SHA"
-msgstr ""
+msgstr "Eksisterende grennavn, mærkat eller commit-SHA"
msgid "Existing projects may be moved into a group"
-msgstr ""
+msgstr "Eksisterende projekter kan flyttes ind i en gruppe"
msgid "Existing projects will be able to use expiration policies. Avoid enabling this if an external Container Registry is being used, as there is a performance risk if many images exist on one project."
msgstr ""
@@ -13565,43 +13783,43 @@ msgid "Existing sign in methods may be removed"
msgstr ""
msgid "Expand"
-msgstr ""
+msgstr "Udfold"
msgid "Expand all"
-msgstr ""
+msgstr "Udfold alle"
msgid "Expand all files"
-msgstr ""
+msgstr "Udfold alle filer"
msgid "Expand all threads"
msgstr "Udfold alle tråde"
msgid "Expand approvers"
-msgstr ""
+msgstr "Udfold godkendere"
msgid "Expand file"
-msgstr ""
+msgstr "Udfold fil"
msgid "Expand issues"
-msgstr ""
+msgstr "Udfold problemstillinger"
msgid "Expand milestones"
-msgstr ""
+msgstr "Udfold milepæle"
msgid "Expand panel"
msgstr "Udfold panel"
msgid "Expand pipeline"
+msgstr "Udfold pipeline"
+
+msgid "Expand settings section"
msgstr ""
msgid "Expand sidebar"
msgstr "Udfold sidebjælke"
msgid "Expected documents: %{expected_documents}"
-msgstr ""
-
-msgid "Experienced"
-msgstr ""
+msgstr "Forventede dokumenter: %{expected_documents}"
msgid "ExperimentSubject|Must have exactly one of User, Namespace, or Project."
msgstr ""
@@ -13622,7 +13840,7 @@ msgid "Expired %{expiredOn}"
msgstr "Udløbet %{expiredOn}"
msgid "Expired:"
-msgstr ""
+msgstr "Udløbet:"
msgid "Expires"
msgstr "Udløber"
@@ -13634,7 +13852,7 @@ msgid "Expires:"
msgstr "Udløber:"
msgid "Explain the problem. If appropriate, provide a link to the relevant issue or comment."
-msgstr ""
+msgstr "Forklar problemet. Hvis det er relevant, så giv et link til den relevante problemstilling eller kommentar."
msgid "Explore"
msgstr "Udforsk"
@@ -13655,7 +13873,7 @@ msgid "Explore public groups"
msgstr "Udforsk offentlige grupper"
msgid "Export"
-msgstr ""
+msgstr "Eksportér"
msgid "Export %{name}"
msgstr "Eksportér %{name}"
@@ -13682,13 +13900,13 @@ msgid "Export this group with all related data to a new GitLab instance. Once co
msgstr ""
msgid "Export this project with all its related data in order to move it to a new GitLab instance. When the exported file is ready, you can download it from this page or from the download link in the email notification you will receive. You can then import it when creating a new project. %{link_start}Learn more.%{link_end}"
-msgstr ""
+msgstr "Eksportér projektet med alle dets relevante data for at flytte det til en ny GitLab-instans. Når den eksporterede fil er klar, så kan du downloade den fra denne side eller fra downloadlinket i den e-mail-underretning du modtager. Du kan så importere den når der oprettes et ny projekt. %{link_start}Lær mere%{link_end}."
msgid "Export variable to pipelines running on protected branches and tags only."
msgstr ""
msgid "Exported requirements"
-msgstr ""
+msgstr "Eksporterede krav"
msgid "External Classification Policy Authorization"
msgstr ""
@@ -13727,10 +13945,10 @@ msgid "ExternalAuthorizationService|When no classification label is set the defa
msgstr ""
msgid "ExternalWikiService|External wiki"
-msgstr ""
+msgstr "Ekstern wiki"
msgid "ExternalWikiService|External wiki URL"
-msgstr ""
+msgstr "URL for ekstern wiki"
msgid "ExternalWikiService|Link to an external wiki from the sidebar."
msgstr ""
@@ -13742,13 +13960,13 @@ msgid "Facebook"
msgstr "Facebook"
msgid "Failed"
-msgstr "Mislykkedes"
+msgstr "Mislykket"
msgid "Failed Jobs"
msgstr "Mislykkede job"
msgid "Failed on"
-msgstr ""
+msgstr "Mislykket"
msgid "Failed to add a Zoom meeting"
msgstr "Kunne ikke tilføje et Zoom-møde"
@@ -13757,19 +13975,19 @@ msgid "Failed to apply commands."
msgstr "Kunne ikke anvende kommandoer."
msgid "Failed to assign a reviewer because no user was found."
-msgstr ""
+msgstr "Kunne ikke tildele en kontrollant fordi der ikke blev fundet nogen bruger."
msgid "Failed to assign a user because no user was found."
msgstr ""
msgid "Failed to cancel auto stop because failed to update the environment."
-msgstr ""
+msgstr "Kunne ikke annullere automatisk stop fordi miljøet ikke kunne opdateres."
msgid "Failed to cancel auto stop because the environment is not set as auto stop."
-msgstr ""
+msgstr "Kunne ikke annullere automatisk stop fordi miljøet ikke er indstillet som automatisk stop."
msgid "Failed to cancel auto stop because you do not have permission to update the environment."
-msgstr ""
+msgstr "Kunne ikke annullere automatisk stop fordi du ikke har tilladelse til at opdatere miljøet."
msgid "Failed to change the owner"
msgstr "Kunne ikke ændre ejeren"
@@ -13784,22 +14002,22 @@ msgid "Failed to clone this issue: wrong parameters."
msgstr ""
msgid "Failed to create a branch for this issue. Please try again."
-msgstr ""
+msgstr "Kunne ikke oprette en gren for problemstillingen. Prøv venligst igen."
msgid "Failed to create a to-do item for the design."
-msgstr ""
+msgstr "Kunne ikke oprette et gøremålselement for designet."
msgid "Failed to create framework"
-msgstr ""
+msgstr "Kunne ikke oprette framework"
msgid "Failed to create import label for jira import."
msgstr ""
msgid "Failed to create merge request. Please try again."
-msgstr ""
+msgstr "Kunne ikke oprette sammenlægningsanmodning. Prøv venligst igen."
msgid "Failed to create new project access token: %{token_response_message}"
-msgstr ""
+msgstr "Kunne ikke oprette ny projektadgangstoken: %{token_response_message}"
msgid "Failed to create repository"
msgstr "Kunne ikke oprette depot"
@@ -13811,25 +14029,25 @@ msgid "Failed to create wiki"
msgstr "Kunne ikke oprette wiki"
msgid "Failed to deploy to"
-msgstr ""
+msgstr "Kunne ikke udsende til"
msgid "Failed to enqueue the rebase operation, possibly due to a long-lived transaction. Try again later."
msgstr ""
msgid "Failed to fetch the iteration for this issue. Please try again."
-msgstr ""
+msgstr "Kunne ikke hente gennemløbet for problemstillingen. Prøv venligst igen."
msgid "Failed to fetch the iterations for the group. Please try again."
-msgstr ""
+msgstr "Kunne ikke hente gennemløbene for gruppen. Prøv venligst igen."
msgid "Failed to find import label for Jira import."
msgstr ""
msgid "Failed to generate export, please try again later."
-msgstr ""
+msgstr "Kunne ikke generere eksport. Prøv venligst igen senere."
msgid "Failed to generate report, please try again after sometime"
-msgstr ""
+msgstr "Kunne ikke generere rapport. Prøv venligst igen efter noget tid"
msgid "Failed to get ref."
msgstr ""
@@ -13838,10 +14056,10 @@ msgid "Failed to install."
msgstr "Kunne ikke installere."
msgid "Failed to load assignees."
-msgstr ""
+msgstr "Kunne ikke indlæse tildelere."
msgid "Failed to load assignees. Please try again."
-msgstr ""
+msgstr "Kunne ikke indlæse tildelte. Prøv venligst igen."
msgid "Failed to load authors. Please try again."
msgstr "Kunne ikke indlæse forfattere. Prøv venligst igen."
@@ -13850,7 +14068,7 @@ msgid "Failed to load branches. Please try again."
msgstr "Kunne ikke indlæse grene. Prøv venligst igen."
msgid "Failed to load deploy keys."
-msgstr ""
+msgstr "Kunne ikke indlæse udsendelsesnøgler."
msgid "Failed to load emoji list."
msgstr "Kunne ikke indlæse emojiliste."
@@ -13859,13 +14077,13 @@ msgid "Failed to load error details from Sentry."
msgstr "Kunne ikke indlæse fejldetaljer fra Sentry."
msgid "Failed to load errors from Sentry."
-msgstr ""
+msgstr "Kunne ikke indlæse fejl fra Sentry."
msgid "Failed to load group activity metrics. Please try again."
-msgstr ""
+msgstr "Kunne ikke indlæse gruppeaktivitetsmålinger. Prøv venligst igen."
msgid "Failed to load groups, users and deploy keys."
-msgstr ""
+msgstr "Kunne ikke indlæse grupper, brugere og udsendelsesnøgler."
msgid "Failed to load iterations."
msgstr "Kunne ikke indlæse gennemløb."
@@ -13874,7 +14092,7 @@ msgid "Failed to load labels. Please try again."
msgstr "Kunne ikke indlæse etiketter. Prøv venligst igen."
msgid "Failed to load milestones."
-msgstr ""
+msgstr "Kunne ikke indlæse milepæle."
msgid "Failed to load milestones. Please try again."
msgstr "Kunne ikke indlæse milepæle. Prøv venligst igen."
@@ -13883,34 +14101,31 @@ msgid "Failed to load projects"
msgstr "Kunne ikke indlæse projekter"
msgid "Failed to load related branches"
-msgstr ""
-
-msgid "Failed to load sidebar lock status"
-msgstr ""
+msgstr "Kunne ikke indlæse relaterede grene"
msgid "Failed to load stacktrace."
-msgstr ""
+msgstr "Kunne ikke indlæse stacktrace."
msgid "Failed to make repository read-only. %{reason}"
msgstr ""
msgid "Failed to mark this issue as a duplicate because referenced issue was not found."
-msgstr ""
+msgstr "Kunne ikke mærke problemstillingen som en duplikat fordi den refererede problemstilling ikke blev fundet."
msgid "Failed to move this issue because label was not found."
-msgstr ""
+msgstr "Kunne ikke flytte problemstillingen fordi etiketten ikke blev fundet."
msgid "Failed to move this issue because only a single label can be provided."
msgstr ""
msgid "Failed to move this issue because target project doesn't exist."
-msgstr ""
+msgstr "Kunne ikke flytte problemstillingen fordi målprojektet ikke findes."
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."
msgid "Failed to protect the branch"
-msgstr ""
+msgstr "Kunne ikke beskytte grenen"
msgid "Failed to protect the environment"
msgstr "Kunne ikke beskytte miljøet"
@@ -13925,13 +14140,13 @@ msgid "Failed to remove a Zoom meeting"
msgstr "Kunne ikke fjerne et Zoom-møde"
msgid "Failed to remove a to-do item for the design."
-msgstr ""
+msgstr "Kunne ikke fjerne et gøremålselement for designet."
msgid "Failed to remove mirror."
msgstr ""
msgid "Failed to remove the pipeline schedule"
-msgstr ""
+msgstr "Kunne ikke fjerne pipelineplanlægningen"
msgid "Failed to remove user identity."
msgstr "Kunne ikke fjerne brugeridentitet."
@@ -13943,10 +14158,10 @@ msgid "Failed to reset key. Please try again."
msgstr "Kunne ikke nulstille nøgle. Prøv venligst igen."
msgid "Failed to retrieve page"
-msgstr ""
+msgstr "Kunne ikke hente side"
msgid "Failed to save merge conflicts resolutions. Please try again!"
-msgstr "Kunne ikke gemme konfliktløsninger. Prøv venligst igen!"
+msgstr "Kunne ikke gemme sammenlægningskonfliktløsninger. Prøv venligst igen!"
msgid "Failed to save new settings"
msgstr "Kunne ikke gemme nye indstillinger"
@@ -13961,7 +14176,7 @@ msgid "Failed to set due date because the date format is invalid."
msgstr ""
msgid "Failed to set iteration on this issue. Please try again."
-msgstr ""
+msgstr "Kunne ikke indstille gennemløb på problemstillingen. Prøv venligst igen."
msgid "Failed to signing using smartcard authentication"
msgstr ""
@@ -13994,10 +14209,10 @@ msgid "Failed to upload object map file"
msgstr ""
msgid "Failed to verify domain ownership"
-msgstr ""
+msgstr "Kunne ikke verificere domæneejerskab"
msgid "Failure"
-msgstr "Mislykkedes"
+msgstr "Mislykket"
msgid "False positive"
msgstr "Falsk positiv"
@@ -14009,7 +14224,7 @@ msgid "Fast-forward merge without a merge commit"
msgstr ""
msgid "Faster releases. Better code. Less pain."
-msgstr ""
+msgstr "Hurtigere udgivelser. Bedre kode. Mindre smerte."
msgid "Favicon"
msgstr "Favicon"
@@ -14038,7 +14253,7 @@ msgstr[0] "%d bruger"
msgstr[1] "%d brugere"
msgid "FeatureFlags|%{percent} by available ID"
-msgstr ""
+msgstr "%{percent} af tilgængeligt id"
msgid "FeatureFlags|%{percent} by session ID"
msgstr ""
@@ -14047,7 +14262,7 @@ msgid "FeatureFlags|%{percent} by user ID"
msgstr "%{percent} af bruger-id"
msgid "FeatureFlags|%{percent} randomly"
-msgstr ""
+msgstr "%{percent} tilfældigt"
msgid "FeatureFlags|* (All Environments)"
msgstr "* (alle miljøer)"
@@ -14098,7 +14313,7 @@ msgid "FeatureFlags|Edit User List"
msgstr "Rediger brugerliste"
msgid "FeatureFlags|Enable features for specific users and environments by configuring feature flag strategies."
-msgstr ""
+msgstr "Aktivér funktioner til bestemte brugere og miljøer ved at konfigurere funktionsflagstrategier."
msgid "FeatureFlags|Environment Specs"
msgstr ""
@@ -14107,7 +14322,7 @@ msgid "FeatureFlags|Feature Flag"
msgstr "Funktionsflag"
msgid "FeatureFlags|Feature Flag User List Details"
-msgstr ""
+msgstr "Brugerlistedetaljer for funktionsflag"
msgid "FeatureFlags|Feature Flag User Lists"
msgstr ""
@@ -14116,7 +14331,7 @@ msgid "FeatureFlags|Feature Flag behavior is built up by creating a set of rules
msgstr ""
msgid "FeatureFlags|Feature Flag has no strategies"
-msgstr ""
+msgstr "Funktionsflag har ingen strategier."
msgid "FeatureFlags|Feature Flags"
msgstr "Funktionsflag"
@@ -14256,7 +14471,7 @@ msgid "Fetch and check out the branch for this merge request"
msgstr ""
msgid "Fetching incoming email"
-msgstr ""
+msgstr "Henter indgående e-mail"
msgid "File"
msgstr "Fil"
@@ -14312,6 +14527,9 @@ msgstr "Filnavn"
msgid "Files"
msgstr "Filer"
+msgid "Files API Rate Limits"
+msgstr ""
+
msgid "Files breadcrumb"
msgstr ""
@@ -14325,52 +14543,52 @@ msgid "Fill in the fields below, turn on %{strong_open}Enable SAML authenticatio
msgstr ""
msgid "Filter"
-msgstr ""
+msgstr "Filtrér"
msgid "Filter by"
msgstr "Filtrér efter"
msgid "Filter by %{issuable_type} that are currently closed."
-msgstr ""
+msgstr "Filtrér efter %{issuable_type} som i øjeblikket er lukket."
msgid "Filter by %{issuable_type} that are currently open."
-msgstr ""
+msgstr "Filtrér efter %{issuable_type} som i øjeblikket er åbne."
msgid "Filter by %{page_context_word} that are currently open."
-msgstr ""
+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 ""
+msgstr "Filtrér efter problemstillinger som i øjeblikket er lukket."
msgid "Filter by issues that are currently opened."
-msgstr ""
+msgstr "Filtrér efter problemstillinger som i øjeblikket er åbne."
msgid "Filter by label"
msgstr "Filtrér efter etiket"
msgid "Filter by merge requests that are currently closed and unmerged."
-msgstr ""
+msgstr "Filtrér efter sammenlægningsanmodninger som i øjeblikket er lukket eller ikke-sammenlagt."
msgid "Filter by merge requests that are currently merged."
-msgstr ""
+msgstr "Filtrér efter sammenlægningsanmodninger som i øjeblikket er sammenlagt."
msgid "Filter by milestone name"
-msgstr ""
+msgstr "Filtrér efter milepælsnavn"
msgid "Filter by name"
msgstr "Filtrér efter navn"
msgid "Filter by test cases that are currently archived."
-msgstr ""
+msgstr "Filtrér efter testsager som i øjeblikket er arkiveret."
msgid "Filter by test cases that are currently open."
-msgstr ""
+msgstr "Filtrér efter testsager som i øjeblikket er åbne."
msgid "Filter by two-factor authentication"
-msgstr "Filtrér efter tofaktorgodkendelse"
+msgstr "Filtrér efter totrinsgodkendelse"
msgid "Filter by user"
msgstr "Filtrér efter bruger"
@@ -14379,7 +14597,7 @@ msgid "Filter parameters are not valid. Make sure that the end date is after the
msgstr ""
msgid "Filter pipelines"
-msgstr ""
+msgstr "Filtrér pipelines"
msgid "Filter results"
msgstr "Filtrér resultater"
@@ -14406,7 +14624,7 @@ msgid "Find File"
msgstr "Find fil"
msgid "Find bugs in your code with API fuzzing."
-msgstr ""
+msgstr "Find fejl i din kode med API-fuzzing."
msgid "Find bugs in your code with coverage-guided fuzzing."
msgstr ""
@@ -14430,10 +14648,10 @@ msgid "Finish setting up your dedicated account for %{group_name}."
msgstr ""
msgid "Finished"
-msgstr ""
+msgstr "Færdige"
msgid "Finished at"
-msgstr ""
+msgstr "Færdig kl."
msgid "First Seen"
msgstr "Først set"
@@ -14487,19 +14705,19 @@ msgid "Focus filter bar"
msgstr "Flyt fokus til filterlinje"
msgid "FogBugz Email"
-msgstr ""
+msgstr "E-mail for FogBugz"
msgid "FogBugz Import"
-msgstr ""
+msgstr "FogBugz-import"
msgid "FogBugz Password"
-msgstr ""
+msgstr "Adgangskode for FogBugz"
msgid "FogBugz URL"
msgstr "FogBugz-URL"
msgid "FogBugz import"
-msgstr ""
+msgstr "FogBugz-import"
msgid "Folder/%{name}"
msgstr "Mappe/%{name}"
@@ -14508,7 +14726,7 @@ msgid "Follow"
msgstr "Følg"
msgid "Followed Users' Activity"
-msgstr ""
+msgstr "Aktiviteter for fulgte brugere"
msgid "Followed users"
msgstr "Fulgte brugere"
@@ -14520,7 +14738,7 @@ msgid "Footer message"
msgstr ""
msgid "For a faster browsing experience, some files are collapsed by default."
-msgstr ""
+msgstr "Nogle filer er som standard sammenfoldet for at give en hurtigere browseroplevelse."
msgid "For additional information, review your %{link_to} or contact your group owner."
msgstr ""
@@ -14559,13 +14777,13 @@ msgid "For more information, see the File Hooks documentation."
msgstr ""
msgid "For more information, see the documentation on %{deactivating_service_ping_link_start}deactivating service ping%{deactivating_service_ping_link_end}."
-msgstr ""
+msgstr "Se dokumentationen om %{deactivating_service_ping_link_start}deaktivering af tjenesteping%{deactivating_service_ping_link_end} for mere information."
msgid "Forgot your password?"
msgstr "Glemt din adgangskode?"
msgid "Fork"
-msgstr ""
+msgstr "Forgren"
msgid "Fork Error!"
msgstr "Fejl ved forgrening!"
@@ -14580,7 +14798,7 @@ msgid "ForkProject|A fork is a copy of a project."
msgstr "En forgrening er en kopi af et projekt."
msgid "ForkProject|An error occurred while forking the project. Please try again."
-msgstr ""
+msgstr "Der opstod en fejl under forgrening af projektet. Prøv venligst igen."
msgid "ForkProject|Cancel"
msgstr "Annuller"
@@ -14589,19 +14807,19 @@ msgid "ForkProject|Create a group"
msgstr "Opret en gruppe"
msgid "ForkProject|Fork project"
-msgstr ""
+msgstr "Forgren projekt"
msgid "ForkProject|Forking a repository allows you to make changes without affecting the original project."
-msgstr ""
+msgstr "Forgrening af et depot giver dig mulighed for at foretage ændringer uden at påvirke det oprindelige projekt."
msgid "ForkProject|Internal"
msgstr ""
msgid "ForkProject|Please select a namespace"
-msgstr ""
+msgstr "Vælg venligst et navnerum"
msgid "ForkProject|Please select a visibility level"
-msgstr ""
+msgstr "Vælg venligst et synlighedsniveau"
msgid "ForkProject|Private"
msgstr "Privat"
@@ -14619,7 +14837,7 @@ msgid "ForkProject|Select a namespace to fork the project"
msgstr ""
msgid "ForkProject|The project can be accessed by any logged in user."
-msgstr ""
+msgstr "Projektet kan tilgås af alle brugere som er logget ind."
msgid "ForkProject|The project can be accessed without any authentication."
msgstr ""
@@ -14637,7 +14855,7 @@ msgid "ForkSuggestion|Fork"
msgstr ""
msgid "ForkSuggestion|You can’t %{edit_start}edit%{edit_end} files directly in this project. Fork this project and submit a merge request with your changes."
-msgstr ""
+msgstr "Du kan ikke %{edit_start}redigere%{edit_end} filer direkte i projektet. Forgren projektet og indsend en sammenlægningsanmodning med dine ændringer."
msgid "ForkedFromProjectPath|Forked from"
msgstr "Forgrenet fra"
@@ -14664,7 +14882,7 @@ msgid "Found errors in your .gitlab-ci.yml:"
msgstr "Fandt fejl i din .gitlab-ci.yml:"
msgid "Framework successfully deleted"
-msgstr ""
+msgstr "Framework slettet"
msgid "Free Trial of GitLab.com Ultimate"
msgstr "Gratis prøveperiode af GitLab.com Ultimate"
@@ -14697,7 +14915,7 @@ msgid "From issue creation until deploy to production"
msgstr ""
msgid "From merge request merge until deploy to production"
-msgstr ""
+msgstr "Fra sammenlægning af sammenlægningsanmodning til udsendelse til produktion"
msgid "Full"
msgstr ""
@@ -14712,10 +14930,10 @@ msgid "GPG Keys"
msgstr "GPG-nøgler"
msgid "GPG keys allow you to verify signed commits."
-msgstr ""
+msgstr "GPG-nøgler giver dig mulighed for at verificere underskrevne commits."
msgid "GPG signature (loading...)"
-msgstr ""
+msgstr "GPG-underskrift (indlæser ...)"
msgid "General"
msgstr "Generelt"
@@ -14733,7 +14951,7 @@ msgid "Generate key"
msgstr "Generer nøgle"
msgid "Generate new export"
-msgstr ""
+msgstr "Generer ny eksport"
msgid "Generate new token"
msgstr "Generer ny token"
@@ -14745,7 +14963,7 @@ msgid "Generate site and private keys at"
msgstr ""
msgid "Generic"
-msgstr ""
+msgstr "Generisk"
msgid "Generic package file size in bytes"
msgstr "Maksimale filstørrelse for generisk pakke i byte"
@@ -14766,19 +14984,19 @@ msgid "Geo Nodes"
msgstr "Geo-knudepunkter"
msgid "Geo Replication"
-msgstr ""
+msgstr "Geo-replikation"
msgid "Geo Settings"
-msgstr ""
+msgstr "Geoindstillinger"
msgid "Geo sites"
-msgstr ""
+msgstr "Geo-websteder"
msgid "Geo|%{component} synced"
msgstr ""
msgid "Geo|%{component} verified"
-msgstr ""
+msgstr "%{component} verificeret"
msgid "Geo|%{label} can't be blank"
msgstr "%{label} må ikke være tomt"
@@ -14805,7 +15023,7 @@ msgid "Geo|(%{timeAgo})"
msgstr "(%{timeAgo})"
msgid "Geo|Add site"
-msgstr ""
+msgstr "Tilføj websted"
msgid "Geo|Adjust your filters/search criteria above. If you believe this may be an error, please refer to the %{linkStart}Geo Troubleshooting%{linkEnd} documentation for more information."
msgstr ""
@@ -14817,7 +15035,7 @@ msgid "Geo|All projects"
msgstr "Alle projekter"
msgid "Geo|All projects are being scheduled for resync"
-msgstr ""
+msgstr "Alle projekter er ved at blive planlagt til gensynkronisering"
msgid "Geo|All projects are being scheduled for reverify"
msgstr ""
@@ -14835,7 +15053,7 @@ msgid "Geo|Checksummed"
msgstr ""
msgid "Geo|Connection timeout can't be blank"
-msgstr ""
+msgstr "Forbindelsestimeout må ikke være tomt"
msgid "Geo|Connection timeout must be a number"
msgstr ""
@@ -14868,7 +15086,7 @@ msgid "Geo|Does not match the primary storage configuration"
msgstr ""
msgid "Geo|Failed"
-msgstr "Mislykkedes"
+msgstr "Mislykket"
msgid "Geo|Filter by name"
msgstr "Filtrér efter navn"
@@ -14877,10 +15095,10 @@ msgid "Geo|Filter by status"
msgstr "Filtrér efter status"
msgid "Geo|Geo Status"
-msgstr ""
+msgstr "Geostatus"
msgid "Geo|Geo sites"
-msgstr ""
+msgstr "Geo-websteder"
msgid "Geo|Geo sites are paused using a command run on the site"
msgstr ""
@@ -14901,10 +15119,10 @@ msgid "Geo|In progress"
msgstr "I gang"
msgid "Geo|In sync"
-msgstr ""
+msgstr "Er synkroniseret"
msgid "Geo|Internal URL"
-msgstr ""
+msgstr "Intern URL"
msgid "Geo|Last event ID from primary"
msgstr ""
@@ -14916,7 +15134,7 @@ msgid "Geo|Last repository check run"
msgstr ""
msgid "Geo|Last successful sync"
-msgstr ""
+msgstr "Sidste synkronisering som lykkedes"
msgid "Geo|Last sync attempt"
msgstr ""
@@ -14940,7 +15158,7 @@ msgid "Geo|Next sync scheduled at"
msgstr ""
msgid "Geo|No available replication slots"
-msgstr ""
+msgstr "Ingen tilgængelige replikationspladser"
msgid "Geo|Node name can't be blank"
msgstr ""
@@ -14958,7 +15176,7 @@ msgid "Geo|Nothing to synchronize"
msgstr "Intet at synkronisere"
msgid "Geo|Nothing to verify"
-msgstr ""
+msgstr "Intet at verificere"
msgid "Geo|Offline"
msgstr "Offline"
@@ -14967,7 +15185,7 @@ msgid "Geo|Pending synchronization"
msgstr "Afventende synkronisering"
msgid "Geo|Pending verification"
-msgstr ""
+msgstr "Afventer verificering"
msgid "Geo|Primary node"
msgstr "Primære knudepunkt"
@@ -15006,7 +15224,7 @@ msgid "Geo|Remove tracking database entry"
msgstr ""
msgid "Geo|Removing a Geo node stops the synchronization to and from that node. Are you sure?"
-msgstr ""
+msgstr "Fjernelse af et Geo-knudepunkt stopper synkroniseringen til og fra knudepunktet. Er du sikker?"
msgid "Geo|Replicated data is verified with the secondary site(s) using checksums"
msgstr ""
@@ -15015,22 +15233,22 @@ msgid "Geo|Replicated data is verified with the secondary site(s) using checksum
msgstr ""
msgid "Geo|Replication Details"
-msgstr ""
+msgstr "Replikationsdetaljer"
msgid "Geo|Replication details"
-msgstr ""
+msgstr "Replikationsdetaljer"
msgid "Geo|Replication slot WAL"
msgstr ""
msgid "Geo|Replication slots"
-msgstr ""
+msgstr "Replikationspladser"
msgid "Geo|Replication status"
-msgstr ""
+msgstr "Replikationsstatus"
msgid "Geo|Replication summary"
-msgstr ""
+msgstr "Replikationsopsummering"
msgid "Geo|Resync"
msgstr "Synkroniser igen"
@@ -15048,13 +15266,13 @@ msgid "Geo|Retry count"
msgstr ""
msgid "Geo|Reverify"
-msgstr ""
+msgstr "Verificer igen"
msgid "Geo|Reverify all"
-msgstr ""
+msgstr "Verificer alle igen"
msgid "Geo|Reverify all projects"
-msgstr ""
+msgstr "Verificer alle projekter igen"
msgid "Geo|Review replication status, and resynchronize and reverify items with the primary site."
msgstr ""
@@ -15063,7 +15281,7 @@ msgid "Geo|Secondary node"
msgstr "Sekundære knudepunkt"
msgid "Geo|Secondary site"
-msgstr ""
+msgstr "Sekundært websted"
msgid "Geo|Selective (%{syncLabel})"
msgstr ""
@@ -15075,7 +15293,7 @@ msgid "Geo|Status"
msgstr "Status"
msgid "Geo|Storage config"
-msgstr ""
+msgstr "Lagerkonfiguration"
msgid "Geo|Synced"
msgstr "Synkroniseret"
@@ -15099,25 +15317,25 @@ msgid "Geo|The database is currently %{db_lag} behind the primary site."
msgstr ""
msgid "Geo|The site is currently %{minutes_behind} behind the primary site."
-msgstr ""
+msgstr "Webstedet er i øjeblikket %{minutes_behind} bag det primære websted."
msgid "Geo|There are no %{replicable_type} to show"
msgstr ""
msgid "Geo|There was an error deleting the Geo Node"
-msgstr ""
+msgstr "Der opstod en fejl under sletning af Geo-knudepunktet"
msgid "Geo|There was an error fetching the Geo Nodes"
-msgstr ""
+msgstr "Der opstod en fejl under hentning af Geo-knudepunkterne"
msgid "Geo|This will resync all %{replicableType}. It may take some time to complete. Are you sure you want to continue?"
-msgstr ""
+msgstr "Det vil synkronisere alle %{replicableType} igen. Det kan tage noget tid af fuldføre. Er du sikker på, at du vil fortsætte?"
msgid "Geo|This will resync all projects. It may take some time to complete. Are you sure you want to continue?"
-msgstr ""
+msgstr "Det vil synkronisere alle projekter igen. Det kan tage noget tid af fuldføre. Er du sikker på, at du vil fortsætte?"
msgid "Geo|This will reverify all projects. It may take some time to complete. Are you sure you want to continue?"
-msgstr ""
+msgstr "Det vil verificere alle projekter igen. Det kan tage noget tid af fuldføre. Er du sikker på, at du vil fortsætte?"
msgid "Geo|Tracking database entry will be removed. Are you sure?"
msgstr ""
@@ -15138,7 +15356,7 @@ msgid "Geo|Undefined"
msgstr "Udefineret"
msgid "Geo|Unhealthy"
-msgstr ""
+msgstr "Usund"
msgid "Geo|Unknown"
msgstr "Ukendt"
@@ -15150,19 +15368,19 @@ msgid "Geo|Updated %{timeAgo}"
msgstr "Opdateret %{timeAgo}"
msgid "Geo|Verification"
-msgstr ""
+msgstr "Verificering"
msgid "Geo|Verification failed - %{error}"
-msgstr ""
+msgstr "Verificering mislykkedes - %{error}"
msgid "Geo|Verification information"
-msgstr ""
+msgstr "Verificeringsinformation"
msgid "Geo|Verification status"
-msgstr ""
+msgstr "Verificeringsstatus"
msgid "Geo|Verified"
-msgstr ""
+msgstr "Verificeret"
msgid "Geo|Waiting for scheduler"
msgstr ""
@@ -15177,7 +15395,7 @@ msgid "Geo|You may be able to make a limited amount of changes or perform a limi
msgstr ""
msgid "Geo|misconfigured"
-msgstr ""
+msgstr "fejlkonfigureret"
msgid "Geo|primary"
msgstr "primær"
@@ -15189,7 +15407,7 @@ msgid "Get a free instance review"
msgstr ""
msgid "Get a support subscription"
-msgstr ""
+msgstr "FÃ¥ et abonnement med support"
msgid "Get started"
msgstr "Kom godt i gang"
@@ -15255,13 +15473,13 @@ msgid "GitHub import"
msgstr "GitHub-import"
msgid "GitHubImporter|*Merged by: %{author} at %{timestamp}*"
-msgstr ""
+msgstr "*Sammenlagt af: %{author} kl. %{timestamp}*"
msgid "GitLab"
msgstr "GitLab"
msgid "GitLab / Unsubscribe"
-msgstr ""
+msgstr "GitLab/fjern abonnering"
msgid "GitLab API"
msgstr ""
@@ -15270,13 +15488,13 @@ msgid "GitLab Account Request"
msgstr ""
msgid "GitLab Billing Team."
-msgstr ""
+msgstr "GitLab-opkrævningsteam."
msgid "GitLab Import"
msgstr ""
msgid "GitLab Issue"
-msgstr ""
+msgstr "GitLab-problemstilling"
msgid "GitLab Pages"
msgstr "GitLab Pages"
@@ -15303,7 +15521,7 @@ msgid "GitLab commit"
msgstr ""
msgid "GitLab export"
-msgstr ""
+msgstr "GitLab-eksport"
msgid "GitLab for Slack"
msgstr "GitLab for Slack"
@@ -15311,6 +15529,9 @@ msgstr "GitLab for Slack"
msgid "GitLab group: %{source_link}"
msgstr "GitLab-gruppe: %{source_link}"
+msgid "GitLab informs you if a new version is available."
+msgstr ""
+
msgid "GitLab is a complete DevOps platform, delivered as a single application, fundamentally changing the way Development, Security, and Ops teams collaborate"
msgstr ""
@@ -15321,13 +15542,13 @@ msgid "GitLab is a single application for the entire software development lifecy
msgstr ""
msgid "GitLab is obtaining a Let's Encrypt SSL certificate for this domain. This process can take some time. Please try again later."
-msgstr ""
+msgstr "GitLab indhenter et Let's Encrypt SSL-certifikat til domænet. Processen kan tage noget tid. Prøv venligst igen senere."
msgid "GitLab is open source software to collaborate on code."
msgstr "GitLab er open source-software til at samarbejde om kode."
-msgid "GitLab is undergoing maintenance and is operating in a read-only mode."
-msgstr "GitLab er ved at blive vedligeholdt og kører i skrivebeskyttet tilstand."
+msgid "GitLab is undergoing maintenance and is operating in read-only mode."
+msgstr ""
msgid "GitLab member or Email address"
msgstr "GitLab-medlem eller e-mailadresse"
@@ -15336,10 +15557,7 @@ msgid "GitLab metadata URL"
msgstr ""
msgid "GitLab project export"
-msgstr ""
-
-msgid "GitLab restart is required to apply changes."
-msgstr ""
+msgstr "GitLab-projekteksport"
msgid "GitLab single sign-on URL"
msgstr ""
@@ -15348,17 +15566,14 @@ msgid "GitLab username"
msgstr "GitLab-brugernavn"
msgid "GitLab uses %{jaeger_link} to monitor distributed systems."
-msgstr ""
+msgstr "GitLab bruger %{jaeger_link} til at overvåge distribuerede systemer."
msgid "GitLab uses %{linkStart}Sidekiq%{linkEnd} to process background jobs"
-msgstr ""
+msgstr "GitLab bruger %{linkStart}Sidekiq%{linkEnd} til at behandle baggrundsjob"
msgid "GitLab version"
msgstr "GitLab-version"
-msgid "GitLab will inform you if a new version is available."
-msgstr "GitLab informerer dig hvis der findes en ny version."
-
msgid "GitLab will run a background job that will produce pseudonymized CSVs of the GitLab database that will be uploaded to your configured object storage directory."
msgstr ""
@@ -15366,19 +15581,19 @@ msgid "GitLab.com"
msgstr "GitLab.com"
msgid "GitLab.com import"
-msgstr ""
+msgstr "GitLab.com-import"
msgid "GitLabPagesDomains|Retry"
msgstr "Prøv igen"
msgid "GitLabPages|%{domain} is not verified. To learn how to verify ownership, visit your %{link_start}domain details%{link_end}."
-msgstr ""
+msgstr "%{domain} er ikke verificeret. Lær mere om at verificere ejerskab ved at besøge dine %{link_start}domænedetaljer%{link_end}."
msgid "GitLabPages|Access Control is enabled for this Pages website; only authorized users will be able to access it. To make your website publicly available, navigate to your project's %{strong_start}Settings &gt; General &gt; Visibility%{strong_end} and select %{strong_start}Everyone%{strong_end} in pages section. Read the %{link_start}documentation%{link_end} for more information."
msgstr ""
msgid "GitLabPages|Access pages"
-msgstr ""
+msgstr "Tilgå sider"
msgid "GitLabPages|Are you sure?"
msgstr "Er du sikker?"
@@ -15405,16 +15620,16 @@ msgid "GitLabPages|GitLab Pages are disabled for this project. You can enable th
msgstr ""
msgid "GitLabPages|Maximum size of pages (MB)"
-msgstr ""
+msgstr "Maksimale størrelse på sider (MB)"
msgid "GitLabPages|New Domain"
msgstr "Nyt domæne"
msgid "GitLabPages|Only project maintainers can remove pages"
-msgstr ""
+msgstr "Kun projektvedligeholdere kan fjerne sider"
msgid "GitLabPages|Pages"
-msgstr "Sider"
+msgstr "Pages"
msgid "GitLabPages|Remove"
msgstr "Fjern"
@@ -15423,13 +15638,13 @@ msgid "GitLabPages|Remove pages"
msgstr "Fjern sider"
msgid "GitLabPages|Removing pages will prevent them from being exposed to the outside world."
-msgstr ""
+msgstr "Fjernelse af sider vil forhindre dem i at blive vist for omverdenen."
msgid "GitLabPages|Save changes"
msgstr "Gem ændringer"
msgid "GitLabPages|Something went wrong while obtaining the Let's Encrypt certificate for %{domain}. To retry visit your %{link_start}domain details%{link_end}."
-msgstr ""
+msgstr "Noget fik galt under indhentning af Let's Encrypt-certifikatet til %{domain}. Besøg dine %{link_start}domænedetaljer%{link_end} for at prøve igen."
msgid "GitLabPages|Support for domains and certificates is disabled. Ask your system's administrator to enable it."
msgstr ""
@@ -15438,16 +15653,16 @@ msgid "GitLabPages|The total size of deployed static content will be limited to
msgstr ""
msgid "GitLabPages|Unverified"
-msgstr ""
+msgstr "Ubekræftet"
msgid "GitLabPages|Verified"
-msgstr ""
+msgstr "Verificeret"
msgid "GitLabPages|When enabled, all attempts to visit your website through HTTP are automatically redirected to HTTPS using a response with status code 301. Requires a valid certificate for all domains. %{docs_link_start}Learn more.%{link_end}"
msgstr ""
msgid "GitLabPages|When using Pages under the general domain of a GitLab instance (%{pages_host}), you cannot use HTTPS with sub-subdomains. This means that if your username/groupname contains a dot it will not work. This is a limitation of the HTTP Over TLS protocol. HTTP pages will continue to work provided you don't redirect HTTP to HTTPS. %{docs_link_start}Learn more.%{link_end}"
-msgstr ""
+msgstr "Når Pages bruges under det generelle domæne i en GitLab-instans (%{pages_host}), så kan du ikke bruge HTTPS med under-underdomæner. Det betyder at det ikke vil virke hvis dit brugernavn/gruppenavn indeholder et punktum. Det er en begrænsning i HTTP over TLS-protokollen. HTTP-sider til fortsat virke forudsat at du ikke omdirigerede HTTP til HTTPS. %{docs_link_start}Lær mere%{link_end}."
msgid "GitLabPages|With GitLab Pages you can host your static website directly from your GitLab repository. %{docs_link_start}Learn more.%{link_end}"
msgstr ""
@@ -15456,7 +15671,7 @@ msgid "GitLabPages|Your Pages site is not configured yet. See the %{docs_link_st
msgstr ""
msgid "GitLabPages|Your pages are served under:"
-msgstr ""
+msgstr "Dine sider leveres under:"
msgid "Gitaly Servers"
msgstr "Gitaly-servere"
@@ -15468,7 +15683,7 @@ msgid "Gitaly storage name:"
msgstr ""
msgid "Gitaly timeouts"
-msgstr ""
+msgstr "Gitaly-timeouts"
msgid "Gitaly|Address"
msgstr "Adresse"
@@ -15477,7 +15692,7 @@ msgid "Gitea Host URL"
msgstr ""
msgid "Gitea Import"
-msgstr ""
+msgstr "Gitea-import"
msgid "GithubIntegration|Create a %{token_link_start}personal access token%{token_link_end} with %{status_html} access granted and paste it here."
msgstr ""
@@ -15504,7 +15719,7 @@ msgid "Gitpod|Enable Gitpod integration"
msgstr "Aktivér Gitpod-integrering"
msgid "Gitpod|Gitpod URL"
-msgstr ""
+msgstr "Gitpod-URL"
msgid "Gitpod|The URL to your Gitpod instance configured to read your GitLab projects, such as https://gitpod.example.com."
msgstr ""
@@ -15516,7 +15731,7 @@ msgid "Gitpod|https://gitpod.example.com"
msgstr "https://gitpod.example.com"
msgid "Given access %{time_ago}"
-msgstr ""
+msgstr "Fik adgang %{time_ago}"
msgid "Given epic is already related to this epic."
msgstr ""
@@ -15600,13 +15815,13 @@ msgid "Go to next page"
msgstr "Gå til næste side"
msgid "Go to parent"
-msgstr ""
+msgstr "Gå til forælder"
msgid "Go to previous page"
msgstr "GÃ¥ til forrige side"
msgid "Go to primary site"
-msgstr ""
+msgstr "Gå til primære websted"
msgid "Go to project"
msgstr "GÃ¥ til projekt"
@@ -15615,22 +15830,34 @@ msgid "Go to releases"
msgstr "GÃ¥ til udgivelser"
msgid "Go to repository charts"
-msgstr ""
+msgstr "GÃ¥ til depotdiagrammer"
msgid "Go to repository graph"
-msgstr ""
+msgstr "GÃ¥ til depotgraf"
msgid "Go to snippets"
-msgstr "GÃ¥ til uddrag"
+msgstr "GÃ¥ til udklip"
+
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check 'Allowed domains for sign-ups'."
+msgstr ""
+
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check 'Email restrictions for sign-ups'."
+msgstr ""
+
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check the 'Domain denylist'."
+msgstr ""
msgid "Go to the activity feed"
+msgstr "GÃ¥ til aktivitetsfeedet"
+
+msgid "Go to the group’s 'Settings &gt; General' page, and check 'Restrict membership by email domain'."
msgstr ""
msgid "Go to the milestone list"
msgstr "Gå til milepælslisten"
msgid "Go to the project's activity feed"
-msgstr ""
+msgstr "GÃ¥ til projektets aktivitetsfeed"
msgid "Go to the project's overview page"
msgstr "GÃ¥ til projektets oversigtsside"
@@ -15639,7 +15866,7 @@ msgid "Go to wiki"
msgstr "GÃ¥ til wiki"
msgid "Go to your To-Do list"
-msgstr "GÃ¥ til din To-Do-liste"
+msgstr "Gå til din gøremålsliste"
msgid "Go to your fork"
msgstr "GÃ¥ til din forgrening"
@@ -15657,9 +15884,15 @@ msgid "Go to your projects"
msgstr "GÃ¥ til dine projekter"
msgid "Go to your snippets"
-msgstr "GÃ¥ til dine uddrag"
+msgstr "GÃ¥ til dine udklip"
msgid "Goal of the changes and what reviewers should be aware of"
+msgstr "Målet for ændringerne og hvad kontrollanter skal være opmærksomme på"
+
+msgid "Google Cloud"
+msgstr ""
+
+msgid "Google Cloud offers several deployment targets. Select the one most suitable for your project."
msgstr ""
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
@@ -15687,7 +15920,7 @@ msgid "GrafanaIntegration|Enter the %{docLinkStart}Grafana API token%{docLinkEnd
msgstr ""
msgid "GrafanaIntegration|Enter the base URL of the Grafana instance."
-msgstr ""
+msgstr "Indtast en grund-URL på Grafana-instansen."
msgid "GrafanaIntegration|Grafana URL"
msgstr "Grafana-URL"
@@ -15714,7 +15947,7 @@ msgid "GraphViewType|Show dependencies"
msgstr ""
msgid "GraphViewType|Stage"
-msgstr ""
+msgstr "Stadie"
msgid "Gravatar"
msgstr "Gravatar"
@@ -15746,9 +15979,6 @@ msgstr "Gruppehooks"
msgid "Group ID"
msgstr "Gruppe-id"
-msgid "Group ID: %{group_id}"
-msgstr "Gruppe-id: %{group_id}"
-
msgid "Group Owner must have signed in with SAML before enabling Group Managed Accounts"
msgstr ""
@@ -15756,10 +15986,10 @@ msgid "Group SAML must be enabled to test"
msgstr ""
msgid "Group URL"
-msgstr ""
+msgstr "Gruppe-URL"
msgid "Group Wikis"
-msgstr ""
+msgstr "Gruppewikier"
msgid "Group application: %{name}"
msgstr "Gruppeprogram: %{name}"
@@ -15780,7 +16010,7 @@ msgid "Group description (optional)"
msgstr "Gruppebeskrivelse (valgfrit)"
msgid "Group export could not be started."
-msgstr ""
+msgstr "Gruppeeksport kunne ikke startes."
msgid "Group export download requests"
msgstr ""
@@ -15792,19 +16022,19 @@ msgid "Group export link has expired. Please generate a new export from your gro
msgstr ""
msgid "Group export requests"
-msgstr ""
+msgstr "Gruppeeksportanmodninger"
msgid "Group export started. A download link will be sent by email and made available on this page."
-msgstr ""
+msgstr "Gruppeeksport startet. Et downloadlink vil blive sendt med e-mail og gjort tilgængelig på siden."
msgid "Group has been already marked for deletion"
-msgstr ""
+msgstr "Gruppen er allerede blevet markeret til sletning"
msgid "Group has not been marked for deletion"
msgstr "Gruppen er blevet mærket til sletning"
msgid "Group import could not be scheduled"
-msgstr ""
+msgstr "Gruppeimport kunne ikke planlægges"
msgid "Group import requests"
msgstr ""
@@ -15819,7 +16049,7 @@ msgid "Group is required when cluster_type is :group"
msgstr ""
msgid "Group jobs by"
-msgstr ""
+msgstr "Gruppér job efter"
msgid "Group maintainers can register group runners in the %{link}"
msgstr ""
@@ -15834,7 +16064,7 @@ msgid "Group membership expiration date removed"
msgstr ""
msgid "Group milestone"
-msgstr ""
+msgstr "Gruppemilepæl"
msgid "Group name"
msgstr "Gruppenavn"
@@ -15867,13 +16097,13 @@ msgid "Group requires separate account"
msgstr ""
msgid "Group runners"
-msgstr ""
+msgstr "Grupperunnere"
msgid "Group runners can be managed with the %{link}."
-msgstr ""
+msgstr "Grupperunnere kan håndteres med %{link}."
msgid "Group sharing provides access to all group members (including members who inherited group membership from a parent group)."
-msgstr ""
+msgstr "Gruppedeling giver adgang til alle gruppemedlemmer (herunder medlemmer som nedarvede gruppemedlemskab fra en forældergruppe)."
msgid "Group variables (inherited)"
msgstr "Gruppevariabler (nedarvet)"
@@ -15900,7 +16130,7 @@ msgid "GroupActivityMetrics|Members added"
msgstr "Medlemmer tilføjet"
msgid "GroupActivityMetrics|Merge Requests opened"
-msgstr ""
+msgstr "Sammenlægningsanmodninger åbnet"
msgid "GroupActivityMetrics|Recent activity"
msgstr "Seneste aktivitet"
@@ -15915,7 +16145,7 @@ msgid "GroupImport|Group could not be imported: %{errors}"
msgstr "Gruppen kunne ikke importeres: %{errors}"
msgid "GroupImport|Please wait while we import the group for you. Refresh at will."
-msgstr ""
+msgstr "Vent venligst mens vi importerer gruppen for dig. Opdater efter ønske."
msgid "GroupImport|The group was successfully imported."
msgstr ""
@@ -15923,6 +16153,12 @@ msgstr ""
msgid "GroupImport|Unable to process group import file"
msgstr ""
+msgid "GroupPage|Copy group ID"
+msgstr ""
+
+msgid "GroupPage|Group ID: %{group_id}"
+msgstr ""
+
msgid "GroupRoadmap|%{dateWord} – No end date"
msgstr "%{dateWord} – ingen slutdato"
@@ -15951,16 +16187,16 @@ msgid "GroupRoadmap|Something went wrong while fetching milestones"
msgstr "Noget gik galt under hentning af milepæle"
msgid "GroupRoadmap|Sorry, no epics matched your search"
-msgstr ""
+msgstr "Beklager, ingen epics matchede din søgning"
msgid "GroupRoadmap|The roadmap shows the progress of your epics along a timeline"
msgstr ""
msgid "GroupRoadmap|This quarter"
-msgstr ""
+msgstr "I kvartallet"
msgid "GroupRoadmap|This year"
-msgstr ""
+msgstr "I år"
msgid "GroupRoadmap|To make your epics appear in the roadmap, add start or due dates to them."
msgstr ""
@@ -15975,6 +16211,9 @@ msgid "GroupRoadmap|To widen your search, change or remove filters; from %{start
msgstr ""
msgid "GroupRoadmap|Within 3 years"
+msgstr "Inden for 3 år"
+
+msgid "GroupSAML|\"persistent\" recommended"
msgstr ""
msgid "GroupSAML|%{strongOpen}Warning%{strongClose} - Enabling %{linkStart}SSO enforcement%{linkEnd} can reduce security risks."
@@ -15984,7 +16223,7 @@ msgid "GroupSAML|Active SAML Group Links (%{count})"
msgstr ""
msgid "GroupSAML|Are you sure you want to remove the SAML group link?"
-msgstr ""
+msgstr "Er du sikker på, at du vil fjerne SAML-gruppelinket?"
msgid "GroupSAML|Before enforcing SSO, enable SAML authentication."
msgstr ""
@@ -16002,7 +16241,7 @@ msgid "GroupSAML|Copy SAML Response XML"
msgstr ""
msgid "GroupSAML|Could not create SAML group link: %{errors}."
-msgstr ""
+msgstr "Kunne ikke oprette SAML-gruppelink: %{errors}."
msgid "GroupSAML|Default membership role"
msgstr ""
@@ -16020,7 +16259,7 @@ msgid "GroupSAML|Enforce users to have dedicated group-managed accounts for this
msgstr ""
msgid "GroupSAML|Generate a SCIM token"
-msgstr ""
+msgstr "Generer en SCIM-token"
msgid "GroupSAML|Generate a SCIM token to set up your System for Cross-Domain Identity Management."
msgstr ""
@@ -16044,10 +16283,10 @@ msgid "GroupSAML|Members will be forwarded here when signing in to your group. G
msgstr ""
msgid "GroupSAML|NameID"
-msgstr "Navn-id"
+msgstr "NameID"
msgid "GroupSAML|NameID Format"
-msgstr ""
+msgstr "NameID-format"
msgid "GroupSAML|New SAML group link saved."
msgstr ""
@@ -16089,7 +16328,7 @@ msgid "GroupSAML|SCIM API endpoint URL"
msgstr ""
msgid "GroupSAML|SCIM Token"
-msgstr ""
+msgstr "SCIM-token"
msgid "GroupSAML|SHA1 fingerprint of the SAML token signing certificate. Get this from your identity provider, where it can also be called \"Thumbprint\"."
msgstr ""
@@ -16109,6 +16348,9 @@ msgstr ""
msgid "GroupSAML|To be able to prohibit outer forks, you first need to enforce dedicate group managed accounts."
msgstr ""
+msgid "GroupSAML|Use SAML group links to manage group membership using SAML."
+msgstr ""
+
msgid "GroupSAML|Valid SAML Response"
msgstr ""
@@ -16116,18 +16358,15 @@ msgid "GroupSAML|With prohibit outer forks flag enabled group members will be ab
msgstr ""
msgid "GroupSAML|Your SCIM token"
-msgstr ""
+msgstr "Din SCIM-token"
msgid "GroupSAML|as %{access_level}"
msgstr "som %{access_level}"
-msgid "GroupSAML|must match stored NameID of \"%{extern_uid}\" as we use this to identify users. If the NameID changes users will be unable to sign in."
-msgstr ""
-
-msgid "GroupSAML|should be \"persistent\""
+msgid "GroupSAML|must match stored NameID of \"%{extern_uid}\" to identify user and allow sign in"
msgstr ""
-msgid "GroupSAML|should be a random persistent ID, emails are discouraged"
+msgid "GroupSAML|recommend persistent ID instead of email"
msgstr ""
msgid "GroupSelect|No matching results"
@@ -16142,32 +16381,38 @@ msgstr "Vælg en gruppe"
msgid "GroupSettings|Allow project access token creation"
msgstr ""
+msgid "GroupSettings|Applied to all subgroups unless overridden by a group owner. Groups already added to the project lose access."
+msgstr ""
+
msgid "GroupSettings|Auto DevOps pipeline was updated for the group"
msgstr ""
+msgid "GroupSettings|Available only on the top-level group. Applies to all subgroups. Groups already shared with a group outside %{group} are still shared unless removed manually."
+msgstr ""
+
msgid "GroupSettings|Badges"
msgstr "Badges"
msgid "GroupSettings|Be careful. Changing a group's parent can have unintended %{side_effects_link_start}side effects%{side_effects_link_end}."
-msgstr ""
+msgstr "Vær forsigtig. Ændring af en gruppes forælder kan have utilsigtede %{side_effects_link_start}bivirkninger%{side_effects_link_end}."
msgid "GroupSettings|Cannot update the path because there are projects under this group that contain Docker images in their Container Registry. Please remove the images from your projects first and try again."
-msgstr ""
+msgstr "Kan ikke opdatere stien da der er projekter under gruppen som indeholder Docker-aftryk i deres beholderregister. Fjern venligst først aftrykkene fra dine projekter og prøv igen."
msgid "GroupSettings|Change group URL"
-msgstr ""
+msgstr "Ændr gruppe-URL"
msgid "GroupSettings|Changing group URL can have unintended side effects."
msgstr ""
msgid "GroupSettings|Compliance frameworks"
-msgstr ""
+msgstr "Overholdelsesframeworks"
msgid "GroupSettings|Configure frameworks to apply enforceable rules to projects."
msgstr ""
msgid "GroupSettings|Custom project templates"
-msgstr ""
+msgstr "Tilpassede projektskabeloner"
msgid "GroupSettings|Customize this group's badges."
msgstr "Tilpas gruppens badges."
@@ -16176,13 +16421,13 @@ msgid "GroupSettings|Default to Auto DevOps pipeline for all projects within thi
msgstr ""
msgid "GroupSettings|Disable email notifications"
-msgstr ""
+msgstr "Deaktivér e-mail-underretninger"
msgid "GroupSettings|Disable group mentions"
msgstr ""
msgid "GroupSettings|Enable delayed project deletion"
-msgstr ""
+msgstr "Aktivér forsinket sletning af projekt"
msgid "GroupSettings|Export group"
msgstr "Eksportér gruppe"
@@ -16196,22 +16441,28 @@ msgstr ""
msgid "GroupSettings|New runners registration token has been generated!"
msgstr ""
-msgid "GroupSettings|Pipeline settings was updated for the group"
+msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
msgstr ""
+msgid "GroupSettings|Pipeline settings was updated for the group"
+msgstr "Pipelineindstillinger blev opdateret for gruppen"
+
msgid "GroupSettings|Please choose a group URL with no special characters or spaces."
-msgstr ""
+msgstr "Vælg venligst en gruppe-URL uden specialtegn eller mellemrum."
msgid "GroupSettings|Prevent forking outside of the group"
-msgstr ""
+msgstr "Forhindr forgrening uden for gruppen"
msgid "GroupSettings|Prevent forking setting was not saved"
-msgstr ""
+msgstr "Indstillingen forhindr forgrening blev ikke gemt"
-msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups."
+msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups"
msgstr ""
msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
+msgstr "Forhindr deling af et projekt i %{group} med andre grupper"
+
+msgid "GroupSettings|Prevents group members from being notified if the group is mentioned."
msgstr ""
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
@@ -16221,25 +16472,25 @@ msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_peri
msgstr ""
msgid "GroupSettings|Select a subgroup to use as the source for custom project templates for this group."
-msgstr ""
+msgstr "Vælg en undergruppe som skal bruges som kilden til tilpassede projektskabeloner i gruppen."
msgid "GroupSettings|Set the maximum size of GitLab Pages for this group. %{link_start}Learn more.%{link_end}"
msgstr ""
msgid "GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
-msgstr ""
+msgstr "Auto DevOps-pipelinen kører hvis ingen alternativ CI-konfigurationsfil bliver fundet."
msgid "GroupSettings|The default name for the initial branch of new repositories created in the group."
-msgstr ""
+msgstr "Standardnavnet til den indledende gren af nye depoter som oprettes i gruppen."
msgid "GroupSettings|The projects in this subgroup can be selected as templates for new projects created in the group. %{link_start}Learn more.%{link_end}"
msgstr ""
msgid "GroupSettings|There was a problem updating Auto DevOps pipeline: %{error_messages}."
-msgstr ""
+msgstr "Der var et problem med opdatering af Auto DevOps-pipeline: %{error_messages}."
msgid "GroupSettings|There was a problem updating the pipeline settings: %{error_messages}."
-msgstr ""
+msgstr "Der var et problem ved opdatering af pipelineindstillingerne: %{error_messages}."
msgid "GroupSettings|This setting is applied on %{ancestor_group} and has been overridden on this subgroup."
msgstr ""
@@ -16248,22 +16499,7 @@ msgid "GroupSettings|This setting is applied on %{ancestor_group}. To share proj
msgstr ""
msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}."
-msgstr ""
-
-msgid "GroupSettings|This setting is only available on the top-level group and it applies to all subgroups. Groups that have already been shared with a group outside %{group} will still be shared, and this access will have to be revoked manually."
-msgstr ""
-
-msgid "GroupSettings|This setting will be applied to all subgroups unless overridden by a group owner. Groups that already have access to the project will continue to have access unless removed manually."
-msgstr ""
-
-msgid "GroupSettings|This setting will override user notification preferences for all members of the group, subgroups, and projects."
-msgstr ""
-
-msgid "GroupSettings|This setting will prevent group members from being notified if the group is mentioned."
-msgstr ""
-
-msgid "GroupSettings|This setting will prevent group members from forking projects outside of the group."
-msgstr ""
+msgstr "Indstillingen anvendes på %{ancestor_group}. Du kan tilsidesætte indstillingen eller %{remove_ancestor_share_with_group_lock}."
msgid "GroupSettings|Transfer group"
msgstr "Overfør gruppe"
@@ -16275,10 +16511,10 @@ msgid "GroupSettings|What are badges?"
msgstr "Hvad er badges?"
msgid "GroupSettings|You can only transfer the group to a group you manage."
-msgstr ""
+msgstr "Du kan kun overføre gruppen til en gruppe du håndterer."
msgid "GroupSettings|You will need to update your local repositories to point to the new location."
-msgstr ""
+msgstr "Du skal opdatere dine lokale depoter så de peger på den nye placering."
msgid "GroupSettings|cannot be changed by you"
msgstr "kan ikke ændres af dig"
@@ -16287,7 +16523,7 @@ msgid "GroupSettings|cannot be disabled when the parent group \"Share with group
msgstr ""
msgid "GroupSettings|cannot change when group contains projects with NPM packages"
-msgstr ""
+msgstr "kan ikke ændre når gruppe indholder projekter med NPM-pakker"
msgid "GroupSettings|remove the share with group lock from %{ancestor_group_name}"
msgstr ""
@@ -16305,13 +16541,13 @@ msgid "Groups and subgroups"
msgstr "Grupper og undergrupper"
msgid "Groups to synchronize"
-msgstr ""
+msgstr "Grupper som skal synkroniseres"
msgid "GroupsDropdown|Frequently visited"
msgstr "Ofte besøgte"
msgid "GroupsDropdown|Groups you visit often will appear here"
-msgstr ""
+msgstr "Her vises grupper du ofte besøger"
msgid "GroupsDropdown|Loading groups"
msgstr "Indlæser grupper"
@@ -16320,19 +16556,19 @@ msgid "GroupsDropdown|Search your groups"
msgstr ""
msgid "GroupsDropdown|Something went wrong on our end."
-msgstr "Noget gik galt i vores ende."
+msgstr "Noget gik galt hos os."
msgid "GroupsDropdown|Sorry, no groups matched your search"
-msgstr ""
+msgstr "Beklager, ingen grupper matchede din søgning"
msgid "GroupsDropdown|This feature requires browser localStorage support"
msgstr ""
msgid "GroupsEmptyState|A group is a collection of several projects."
-msgstr ""
+msgstr "En gruppe er en samling af projekter."
msgid "GroupsEmptyState|If you organize your projects under a group, it works like a folder."
-msgstr ""
+msgstr "Hvis du organiserer dine projekter under en gruppe, så virker det som en mappe."
msgid "GroupsEmptyState|No groups found"
msgstr "Ingen grupper fundet"
@@ -16362,7 +16598,7 @@ msgid "GroupsNew|Export groups with all their related data and move to a new Git
msgstr ""
msgid "GroupsNew|GitLab source URL"
-msgstr ""
+msgstr "GitLab kilde-URL"
msgid "GroupsNew|Groups can also be nested by creating %{linkStart}subgroups%{linkEnd}."
msgstr ""
@@ -16382,17 +16618,17 @@ msgstr ""
msgid "GroupsNew|No import options available"
msgstr ""
-msgid "GroupsNew|Not all related objects are migrated, as %{docs_link_start}described here%{docs_link_end}. Please %{feedback_link_start}leave feedback%{feedback_link_end} on this feature."
+msgid "GroupsNew|Not all related objects are migrated. %{docs_link_start}More info%{docs_link_end}."
msgstr ""
msgid "GroupsNew|Personal access token"
-msgstr ""
+msgstr "Personlig adgangstoken"
msgid "GroupsNew|Please fill in GitLab source URL."
-msgstr ""
+msgstr "Udfyld venligst GitLab kilde-URL."
msgid "GroupsNew|Please fill in your personal access token."
-msgstr ""
+msgstr "Udfyld venligst din personlige adgangstoken."
msgid "GroupsNew|Provide credentials for another instance of GitLab to import your groups directly."
msgstr ""
@@ -16401,7 +16637,7 @@ msgid "GroupsNew|To import a group, navigate to the group settings for the GitLa
msgstr ""
msgid "GroupsNew|Upload file"
-msgstr ""
+msgstr "Upload fil"
msgid "GroupsNew|e.g. h8d3f016698e..."
msgstr "f.eks. h8d3f016698e ..."
@@ -16413,7 +16649,7 @@ msgid "GroupsTree|Edit group"
msgstr "Rediger gruppe"
msgid "GroupsTree|Failed to leave the group. Please make sure you are not the only owner."
-msgstr ""
+msgstr "Kunne ikke forlade gruppen. Sørg venligst for at du ikke er den eneste ejer."
msgid "GroupsTree|Leave this group"
msgstr "Forlad gruppen"
@@ -16422,7 +16658,7 @@ msgid "GroupsTree|Loading groups"
msgstr "Indlæser grupper"
msgid "GroupsTree|No groups matched your search"
-msgstr ""
+msgstr "Ingen grupper matchede din søgning"
msgid "GroupsTree|No groups or projects matched your search"
msgstr ""
@@ -16452,7 +16688,7 @@ msgid "Hashed storage can't be disabled anymore for new projects"
msgstr ""
msgid "Header cannot be associated with both a request and a response"
-msgstr ""
+msgstr "Header kan ikke tilknyttes med både en anmodning og et svar"
msgid "Header logo"
msgstr "Headerlogo"
@@ -16491,36 +16727,48 @@ msgid "Health Check"
msgstr "Sundhedstjek"
msgid "Health information can be retrieved from the following endpoints. More information is available"
-msgstr ""
+msgstr "Sunhedsinformation kan indhentes fra følgende slutpunkter. Mere information er tilgængelig"
msgid "Health status"
msgstr "Helbredsstatus"
msgid "Health status cannot be edited because this issue is closed"
-msgstr ""
+msgstr "Helbredsstatussen kan ikke redigeres da problemstillingen er lukket"
msgid "HealthCheck|Access token is"
-msgstr ""
+msgstr "Adgangstoken er"
msgid "HealthCheck|Healthy"
-msgstr ""
+msgstr "Sund"
msgid "HealthCheck|No Health Problems Detected"
-msgstr ""
+msgstr "Ingen sundhedsproblemer registreret"
msgid "HealthCheck|Unhealthy"
-msgstr ""
+msgstr "Usund"
msgid "Hello %{name},"
+msgstr "Hej %{name},"
+
+msgid "Hello, %{name}!"
+msgstr "Hej %{name}!"
+
+msgid "Hello, %{username}!"
msgstr ""
-msgid "Hello there"
-msgstr "Hej med dig"
+msgid "HelloMessage|%{handshake_emoji} Contribute to GitLab: %{contribute_link}"
+msgstr ""
-msgid "Hello, %{name}!"
+msgid "HelloMessage|%{magnifier_emoji} Create a new GitLab issue: %{new_issue_link}"
msgstr ""
-msgid "Hello, %{username}!"
+msgid "HelloMessage|%{rocket_emoji} We like your curiosity! Help us improve GitLab by joining the team: %{jobs_page_link}"
+msgstr ""
+
+msgid "HelloMessage|Does this page need fixes or improvements? Open an issue or contribute a merge request to help make GitLab more lovable. At GitLab, everyone can contribute!"
+msgstr ""
+
+msgid "HelloMessage|Welcome to GitLab!"
msgstr ""
msgid "Help"
@@ -16532,13 +16780,10 @@ msgstr "Hjælper med at forhindre botter i at udføre brute-force-angreb."
msgid "Helps prevent bots from creating accounts."
msgstr "Hjælper med at forhindre botter i at oprette kontoer."
-msgid "Helps prevent bots from creating issues"
-msgstr "Hjælper med at forhindre botter i at oprette problemstillinger"
-
-msgid "Helps prevent malicious users hide their activity"
-msgstr "Hjælper med at forhindre ondsindede brugere i at skjule deres aktivitet"
+msgid "Helps prevent bots from creating issues."
+msgstr ""
-msgid "Helps reduce request volume (e.g. from crawlers or abusive bots)"
+msgid "Helps prevent malicious users hide their activity."
msgstr ""
msgid "Helps reduce request volume (for example, from crawlers or abusive bots)"
@@ -16548,7 +16793,7 @@ msgid "Helps reduce request volume for protected paths"
msgstr ""
msgid "Here you will find recent merge request activity"
-msgstr ""
+msgstr "Her findes seneste sammenlægningsanmodningsaktivitet"
msgid "Hi %{username}!"
msgstr "Hej %{username}!"
@@ -16583,7 +16828,7 @@ msgid "Hide list"
msgstr "Skjul liste"
msgid "Hide marketing-related entries from the Help page"
-msgstr ""
+msgstr "Skjul marketingrelaterede indslag på hjælpesiden"
msgid "Hide payload"
msgstr ""
@@ -16592,7 +16837,7 @@ msgid "Hide shared projects"
msgstr "Skjul delte projekter"
msgid "Hide tooltips or popovers"
-msgstr ""
+msgstr "Skjul værktøjstips eller popovere"
msgid "Hide value"
msgid_plural "Hide values"
@@ -16654,17 +16899,23 @@ msgid "Hour (UTC)"
msgstr "Time (UTC)"
msgid "Housekeeping"
-msgstr ""
+msgstr "Husarbejde"
msgid "Housekeeping successfully started"
-msgstr ""
+msgstr "Husarbejde startet"
msgid "Housekeeping, export, path, transfer, remove, archive."
+msgstr "Husarbejde, eksport, sti, overfør, fjern, arkivér."
+
+msgid "How do I configure Akismet?"
msgstr ""
-msgid "How do I configure runners?"
+msgid "How do I configure it?"
msgstr ""
+msgid "How do I configure runners?"
+msgstr "Hvordan konfigurerer jeg runnere?"
+
msgid "How do I configure this integration?"
msgstr "Hvordan konfigurerer jeg integreringen?"
@@ -16675,29 +16926,35 @@ msgid "How do I mirror repositories?"
msgstr ""
msgid "How do I rename an environment?"
-msgstr ""
+msgstr "Hvordan omdøber jeg et miljø?"
msgid "How do I set up a Google Chat webhook?"
-msgstr ""
+msgstr "Hvordan opsætter jeg en Google Chat-webhook?"
msgid "How do I set up this service?"
msgstr "Hvordan opsætter jeg tjenesten?"
+msgid "How do I use a web terminal?"
+msgstr ""
+
+msgid "How do I use file templates?"
+msgstr ""
+
msgid "How it works"
msgstr ""
msgid "How many days need to pass between marking entity for deletion and actual removing it."
msgstr ""
-msgid "How many seconds an IP will be counted towards the limit"
+msgid "How many seconds an IP counts toward the IP address limit."
+msgstr ""
+
+msgid "How the job limiter handles jobs exceeding the thresholds specified below. The 'track' mode only logs the jobs. The 'compress' mode compresses the jobs and raises an exception if the compressed size exceeds the limit."
msgstr ""
msgid "I accept the %{terms_link}"
msgstr "Jeg accepterer %{terms_link}"
-msgid "I accept the|Terms of Service and Privacy Policy"
-msgstr "Jeg accepterer|vilkår for tjeneste og privatlivspolitik"
-
msgid "I forgot my password"
msgstr "Jeg har glemt min adgangskode"
@@ -16765,28 +17022,31 @@ msgid "IDE|Successful commit"
msgstr ""
msgid "IDE|This option is disabled because you are not allowed to create merge requests in this project."
-msgstr ""
+msgstr "Valgmuligheden er deaktiveret fordi du ikke har tilladelse til at oprette sammenlægningsanmodninger i projektet."
msgid "IDE|This option is disabled because you don't have write permissions for the current branch."
-msgstr ""
+msgstr "Valgmuligheden er deaktiveret fordi du ikke har skrivetilladelser til den nuværende gren."
msgid "INFO: Your SSH key has expired. Please generate a new key."
-msgstr ""
+msgstr "INFO: Din SSH-nøgle er udløbet. Generer venligst en ny nøgle."
msgid "INFO: Your SSH key is expiring soon. Please generate a new key."
-msgstr ""
+msgstr "INFO: Din SSH-nøgle udløber snart. Generer venligst en ny nøgle."
msgid "IP Address"
msgstr "IP-adresse"
-msgid "IP expiration time"
+msgid "IP address expiration time"
msgstr ""
-msgid "IP subnet restriction only allowed for top-level groups"
+msgid "IP address restrictions"
+msgstr ""
+
+msgid "IP addresses per user"
msgstr ""
-msgid "IPs per user"
-msgstr "IP'er pr. bruger"
+msgid "IP subnet restriction only allowed for top-level groups"
+msgstr ""
msgid "Identifier"
msgstr ""
@@ -16800,6 +17060,9 @@ msgstr "Identiteter"
msgid "If any indexed field exceeds this limit it will be truncated to this number of characters and the rest will not be indexed or searchable. This does not apply to repository and wiki indexing. Setting this to 0 means it is unlimited."
msgstr ""
+msgid "If blank, defaults to %{code_open}Retry later%{code_close}."
+msgstr ""
+
msgid "If blank, set allowable lifetime to %{instance_level_policy_in_words}, as defined by the instance admin. Once set, existing tokens for users in this group may be revoked."
msgstr ""
@@ -16807,7 +17070,7 @@ msgid "If checked, group owners can manage LDAP group links and LDAP member over
msgstr ""
msgid "If checked, new group memberships and permissions can only be added via LDAP synchronization"
-msgstr ""
+msgstr "Hvis den er tilvalgt, så kan nye gruppemedlemskaber og -tilladelser kun tilføjes via LDAP-synkronisering"
msgid "If disabled, a diverged local branch will not be automatically updated with commits from its remote counterpart, to prevent local data loss. If the default branch (%{default_branch}) has diverged and cannot be updated, mirroring will fail. Other diverged branches are silently ignored."
msgstr ""
@@ -16828,13 +17091,13 @@ msgid "If no options are selected, only administrators can register runners."
msgstr ""
msgid "If the YouTube URL is https://www.youtube.com/watch?v=0t1DgySidms then the video ID is %{id}"
-msgstr ""
+msgstr "Hvis YouTube-URL'en er https://www.youtube.com/watch?v=0t1DgySidms så er video-id'et %{id}"
msgid "If the number of active users exceeds the user limit, you will be charged for the number of %{users_over_license_link} at your next license reconciliation."
msgstr ""
msgid "If this email was added in error, you can remove it here:"
-msgstr ""
+msgstr "Hvis e-mailen blev tilføjet ved en fejl, så kan du fjerne den her:"
msgid "If this email was added in error, you can remove it here: %{profile_emails_url}"
msgstr ""
@@ -16849,19 +17112,22 @@ msgid "If using GitHub, you’ll see pipeline statuses on GitHub for your commit
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 did not initiate these sign-in attempts, please reach out to your administrator or enable two-factor authentication (2FA) on your account."
msgstr ""
msgid "If you did not initiate this change, please contact your administrator immediately."
msgstr ""
msgid "If you did not perform this request, you can safely ignore this email."
-msgstr ""
+msgstr "Hvis du ikke udførte anmodningen, så er det sikkert for dig at ignorere e-mailen."
msgid "If you did not recently sign in, you should immediately %{password_link_start}change your password%{password_link_end}."
-msgstr ""
+msgstr "Hvis du ikke loggede ind for nyligt, så skal du straks %{password_link_start}ændre din adgangskode%{password_link_end}."
msgid "If you did not recently sign in, you should immediately change your password: %{password_link}."
-msgstr ""
+msgstr "Hvis du ikke loggede ind for nyligt, så skal du straks ændre din adgangskode: %{password_link}."
msgid "If you get a lot of false alarms from repository checks, you can clear all repository check information from the database."
msgstr ""
@@ -16870,13 +17136,13 @@ 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 "Hvis du for nyligt har logget ind og genkender IP-adressen, så kan du se bort fra e-mailen."
msgid "If you want to re-enable two-factor authentication, visit %{two_factor_link}"
msgstr ""
msgid "If you want to re-enable two-factor authentication, visit the %{settings_link_to} page."
-msgstr ""
+msgstr "Besøg siden %{settings_link_to} hvis du vil genaktivere totrinsgodkendelse."
msgid "If you've purchased or renewed your subscription and have an activation code, please enter it below to start the activation process."
msgstr ""
@@ -16891,7 +17157,7 @@ msgid "Ignored"
msgstr "Ignoreret"
msgid "Image URL"
-msgstr ""
+msgstr "Billed-URL"
msgid "Image details"
msgstr "Billeddetaljer"
@@ -16912,16 +17178,16 @@ msgid "ImageViewerDimensions|W"
msgstr "B"
msgid "Images with incorrect dimensions are not resized automatically, and may result in unexpected behavior."
-msgstr ""
+msgstr "Billeder med forkerte dimensioner tilpasses ikke automatisk og kan give uventet opførsel."
msgid "Impersonate"
-msgstr ""
+msgstr "Efterlign"
msgid "Impersonation Tokens"
-msgstr ""
+msgstr "Efterligningstokens"
msgid "Impersonation has been disabled"
-msgstr ""
+msgstr "Efterligning er blevet deaktiveret"
msgid "Import"
msgstr "Importér"
@@ -16942,12 +17208,12 @@ msgstr "Importér CSV"
msgid "Import Projects from Gitea"
msgstr "Importér projekter fra Gitea"
-msgid "Import a project"
-msgstr "Importér et projekt"
-
msgid "Import an exported GitLab project"
msgstr ""
+msgid "Import and export rate limits"
+msgstr ""
+
msgid "Import failed due to a GitHub error: %{original}"
msgstr ""
@@ -16957,12 +17223,18 @@ msgstr "Importér fra"
msgid "Import from Jira"
msgstr "Importér fra Jira"
+msgid "Import group"
+msgstr ""
+
msgid "Import group from file"
msgstr "Importér gruppe fra fil"
msgid "Import groups"
msgstr "Importér grupper"
+msgid "Import history"
+msgstr ""
+
msgid "Import in progress"
msgstr "Import i gang"
@@ -16979,7 +17251,7 @@ msgid "Import members from another project"
msgstr "Importér medlemmer fra et andet projekt"
msgid "Import multiple repositories by uploading a manifest file."
-msgstr ""
+msgstr "Importér flere depoter ved at uploade en manifestfil."
msgid "Import project"
msgstr "Importér projekt"
@@ -17018,7 +17290,7 @@ msgid "Import started by: %{importInitiator}"
msgstr "Import startet af: %{importInitiator}"
msgid "Import tasks"
-msgstr ""
+msgstr "Importér opgaver"
msgid "Import tasks from Phabricator into issues"
msgstr ""
@@ -17026,7 +17298,25 @@ msgstr ""
msgid "Import timed out. Import took longer than %{import_jobs_expiration} seconds"
msgstr "Importen fik timeout. Importen tog længere end %{import_jobs_expiration} sekunder"
-msgid "Import/Export Rate Limits"
+msgid "ImportAProjectModal|Import from a project"
+msgstr ""
+
+msgid "ImportAProjectModal|Import members from another project"
+msgstr ""
+
+msgid "ImportAProjectModal|Import project members"
+msgstr ""
+
+msgid "ImportAProjectModal|Only project members (not group members) are imported, and they get the same permissions as the project you import from."
+msgstr ""
+
+msgid "ImportAProjectModal|Successfully imported"
+msgstr ""
+
+msgid "ImportAProjectModal|Unable to import project members"
+msgstr ""
+
+msgid "ImportAProjectModal|You're importing members to the %{strongStart}%{name}%{strongEnd} project."
msgstr ""
msgid "ImportButtons|Connect repositories from"
@@ -17045,10 +17335,10 @@ msgid "ImportProjects|Import repositories"
msgstr ""
msgid "ImportProjects|Importing the project failed"
-msgstr ""
+msgstr "Import af projektet mislykkedes"
msgid "ImportProjects|Importing the project failed: %{reason}"
-msgstr ""
+msgstr "Import af projektet mislykkedes: %{reason}"
msgid "ImportProjects|Requesting namespaces failed"
msgstr ""
@@ -17063,7 +17353,7 @@ msgid "ImportProjects|The remote data could not be imported."
msgstr ""
msgid "ImportProjects|The repository could not be created."
-msgstr ""
+msgstr "Depotet kunnes ikke oprettes."
msgid "ImportProjects|Update of imported projects with realtime changes failed"
msgstr ""
@@ -17073,24 +17363,21 @@ msgstr ""
msgid "Importing %d repository"
msgid_plural "Importing %d repositories"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "Importerer %d depot"
+msgstr[1] "Importerer %d depoter"
msgid "Importing..."
msgstr "Importerer ..."
-msgid "Import|A repository URL usually ends in a .git suffix, although this is not required. Double check to make sure your repository URL is correct."
+msgid "Import|There is not a valid Git repository at this URL. If your HTTP repository is not publicly accessible, verify your credentials."
msgstr ""
msgid "Improve customer support with Service Desk"
-msgstr ""
+msgstr "Forbedr kundesupport med serviceskranke"
msgid "Improves Git cloning performance."
msgstr ""
-msgid "In %{time_to_now}"
-msgstr "Om %{time_to_now}"
-
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 ""
@@ -17101,7 +17388,7 @@ msgid "In progress"
msgstr "I gang"
msgid "In this page you will find information about the settings that are used in your current instance."
-msgstr ""
+msgstr "På denne side finder du information om de indstillinger der bruges i din nuværende instans."
msgid "InProductMarketing|%{organization_name} logo"
msgstr ""
@@ -17119,7 +17406,7 @@ msgid "InProductMarketing|%{strong_start}GitLab Inc.%{strong_end} 268 Bush Stree
msgstr ""
msgid "InProductMarketing|%{strong_start}Multiple approval roles%{strong_end} — including code owners and required merge approvals"
-msgstr ""
+msgstr "%{strong_start}Flere godkendelsesroller%{strong_end} — herunder kodeejere og krævede sammenlægningsgodkendelser"
msgid "InProductMarketing|%{strong_start}Overall, how difficult or easy was it to get started with GitLab?%{strong_end}"
msgstr ""
@@ -17128,7 +17415,7 @@ msgid "InProductMarketing|*GitLab*, noun: a synonym for efficient teams"
msgstr ""
msgid "InProductMarketing|...and you can get a free trial of GitLab Ultimate"
-msgstr ""
+msgstr "...og du kan få en gratis prøveperiode af GitLab Ultimate"
msgid "InProductMarketing|3 ways to dive into GitLab CI/CD"
msgstr ""
@@ -17140,7 +17427,7 @@ msgid "InProductMarketing|And finally %{deploy_link} a Python application."
msgstr ""
msgid "InProductMarketing|Are your runners ready?"
-msgstr ""
+msgstr "Er dine runnere klar?"
msgid "InProductMarketing|Automated security scans directly within GitLab"
msgstr ""
@@ -17158,7 +17445,7 @@ msgid "InProductMarketing|Blog"
msgstr "Blog"
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 ""
+msgstr "Ved at aktivere kodeejere og krævede sammenlægningsgodkendelser vil den korrekte person kontrollere den rette sammenlægningsanmodning. Det har flere fordele: renere kode og en mere effektiv kontrolproces."
msgid "InProductMarketing|Click on the number below that corresponds with your answer — 1 being very difficult, 5 being very easy."
msgstr ""
@@ -17167,10 +17454,10 @@ msgid "InProductMarketing|Code owners and required merge approvals are part of t
msgstr ""
msgid "InProductMarketing|Create a custom CI runner with just a few clicks"
-msgstr ""
+msgstr "Opret en tilpasset CI-runner med få klik"
msgid "InProductMarketing|Create a custom runner"
-msgstr ""
+msgstr "Opret en tilpasset runner"
msgid "InProductMarketing|Create a project in GitLab in 5 minutes"
msgstr "Opret et projekt i GitLab på 5 minutter"
@@ -17200,10 +17487,10 @@ msgid "InProductMarketing|Expand your DevOps journey with a free GitLab trial"
msgstr ""
msgid "InProductMarketing|Explore GitLab CI/CD"
-msgstr ""
+msgstr "Udforsk GitLab CI/CD"
msgid "InProductMarketing|Explore the options"
-msgstr ""
+msgstr "Udforsk mulighederne"
msgid "InProductMarketing|Explore the power of GitLab CI/CD"
msgstr ""
@@ -17212,7 +17499,7 @@ msgid "InProductMarketing|Facebook"
msgstr "Facebook"
msgid "InProductMarketing|Feedback from users like you really improves our product. Thanks for your help!"
-msgstr ""
+msgstr "Feedback fra brugere som dig forbedrer virkelig vores produkt. Tak for din hjælp!"
msgid "InProductMarketing|Feel the need for speed?"
msgstr ""
@@ -17272,7 +17559,7 @@ msgid "InProductMarketing|Goldman Sachs went from 1 build every two weeks to tho
msgstr ""
msgid "InProductMarketing|Have a different instance you'd like to import? Here's our %{import_link}."
-msgstr ""
+msgstr "Har du en anden instans du vil importere? Her er vores %{import_link}."
msgid "InProductMarketing|Here's what you need to know"
msgstr ""
@@ -17299,28 +17586,28 @@ msgid "InProductMarketing|Import your project and code from GitHub, Bitbucket an
msgstr ""
msgid "InProductMarketing|Improve app security with a 30-day trial"
-msgstr ""
+msgstr "Forbedr programsikkerhed på en 30-dages prøveperiode"
msgid "InProductMarketing|Improve code quality and streamline reviews"
msgstr ""
msgid "InProductMarketing|Increase Operational Efficiencies"
-msgstr ""
+msgstr "Øg driftseffektivitet"
msgid "InProductMarketing|Invite your colleagues and start shipping code faster."
-msgstr ""
+msgstr "Inviter dine kollegaer og begynd at sende kode hurtigere afsted."
msgid "InProductMarketing|Invite your colleagues to join in less than one minute"
-msgstr ""
+msgstr "Inviter dine kollegaer til at deltage på under ét minut"
msgid "InProductMarketing|Invite your colleagues today"
msgstr ""
msgid "InProductMarketing|Invite your team in less than 60 seconds"
-msgstr ""
+msgstr "Inviter dit team på mindre end 60 sekunder"
msgid "InProductMarketing|Invite your team now"
-msgstr ""
+msgstr "Inviter dit team nu"
msgid "InProductMarketing|Invite your team today to build better code (and processes) together"
msgstr ""
@@ -17353,7 +17640,7 @@ msgid "InProductMarketing|Neutral"
msgstr ""
msgid "InProductMarketing|No credit card required."
-msgstr ""
+msgstr "Ingen kreditkort kræves."
msgid "InProductMarketing|Our tool brings all the things together"
msgstr ""
@@ -17376,7 +17663,7 @@ msgstr ""
msgid "InProductMarketing|Start a GitLab Ultimate trial today in less than one minute, no credit card required."
msgstr ""
-msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no CC required"
+msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no credit card required"
msgstr ""
msgid "InProductMarketing|Start a trial"
@@ -17386,7 +17673,7 @@ msgid "InProductMarketing|Start by %{performance_link}"
msgstr ""
msgid "InProductMarketing|Start by importing your projects"
-msgstr ""
+msgstr "Start med at importere dine projekter"
msgid "InProductMarketing|Start with a GitLab Ultimate free trial"
msgstr "Start med en gratis prøveperiode af GitLab Ultimate"
@@ -17415,17 +17702,17 @@ msgstr ""
msgid "InProductMarketing|Team up in GitLab for greater efficiency"
msgstr ""
-msgid "InProductMarketing|Team work makes the dream work"
+msgid "InProductMarketing|Team work makes the dream work"
msgstr ""
msgid "InProductMarketing|Test, create, deploy"
-msgstr ""
+msgstr "Test, opret, udsend"
msgid "InProductMarketing|That's all it takes to get going with GitLab, but if you're new to working with Git, check out our %{basics_link} for helpful tips and tricks for getting started."
msgstr ""
msgid "InProductMarketing|This is email %{current_series} of %{total_series} in the %{track} series."
-msgstr ""
+msgstr "Dette er e-mail %{current_series} af %{total_series} i serien %{track}."
msgid "InProductMarketing|This is email %{current_series} of %{total_series} in the %{track} series. To disable notification emails sent by your local GitLab instance, either contact your administrator or %{unsubscribe_link}."
msgstr ""
@@ -17449,7 +17736,7 @@ msgid "InProductMarketing|Try it out"
msgstr "Prøv det"
msgid "InProductMarketing|Try it yourself"
-msgstr ""
+msgstr "Prøv det selv"
msgid "InProductMarketing|Turn coworkers into collaborators"
msgstr ""
@@ -17500,7 +17787,7 @@ msgid "InProductMarketing|Your teams can be more efficient"
msgstr ""
msgid "InProductMarketing|comprehensive guide"
-msgstr ""
+msgstr "omfattende vejledning"
msgid "InProductMarketing|connect an external repository"
msgstr ""
@@ -17533,7 +17820,7 @@ msgid "InProductMarketing|testing browser performance"
msgstr ""
msgid "InProductMarketing|unsubscribe"
-msgstr ""
+msgstr "fjern abonnering"
msgid "InProductMarketing|update your preferences"
msgstr "opdater dine præferencer"
@@ -17542,7 +17829,7 @@ msgid "InProductMarketing|using a CI/CD template"
msgstr ""
msgid "InProductMarketing|you may %{unsubscribe_link} at any time."
-msgstr ""
+msgstr "du kan når som helst %{unsubscribe_link}."
msgid "Inactive"
msgstr "Inaktiv"
@@ -17572,7 +17859,7 @@ msgid "IncidentManagement|All alerts promoted to incidents will automatically be
msgstr ""
msgid "IncidentManagement|Assignees"
-msgstr ""
+msgstr "Tildelere"
msgid "IncidentManagement|Closed"
msgstr "Lukket"
@@ -17587,7 +17874,7 @@ msgid "IncidentManagement|Date created"
msgstr "Dato oprettet"
msgid "IncidentManagement|Display your incidents in a dedicated view"
-msgstr ""
+msgstr "Vis dine hændelser i en særskilt visning"
msgid "IncidentManagement|High - S2"
msgstr "Høj - S2"
@@ -17608,7 +17895,7 @@ msgid "IncidentManagement|Missed SLA"
msgstr ""
msgid "IncidentManagement|No incidents to display."
-msgstr ""
+msgstr "Ingen hændelser at vise."
msgid "IncidentManagement|Open"
msgstr ""
@@ -17623,10 +17910,10 @@ msgid "IncidentManagement|Severity"
msgstr "Alvorlighed"
msgid "IncidentManagement|There are no closed incidents"
-msgstr ""
+msgstr "Der er ingen lukkede hændelser"
msgid "IncidentManagement|There was an error displaying the incidents."
-msgstr ""
+msgstr "Der opstod en fejl under visning af hændelserne."
msgid "IncidentManagement|Time to SLA"
msgstr ""
@@ -17659,13 +17946,13 @@ msgid "IncidentSettings|Introduce a countdown timer in incident issues to better
msgstr ""
msgid "IncidentSettings|PagerDuty integration"
-msgstr ""
+msgstr "PagerDuty-integrering"
msgid "IncidentSettings|Time limit"
msgstr ""
msgid "IncidentSettings|Time limit must be a multiple of 15 minutes."
-msgstr ""
+msgstr "Tidsgrænse skal være et multiplum af 15 minutter."
msgid "IncidentSettings|Time limit must be a valid number."
msgstr ""
@@ -17704,10 +17991,10 @@ msgid "Incidents|There was an issue uploading your image."
msgstr ""
msgid "Incidents|You can optionally add a URL to link users to the original graph."
-msgstr ""
+msgstr "Du kan valgfrit tilføje en URL for at linke brugere til den oprindelige graf."
msgid "Incident|Alert details"
-msgstr ""
+msgstr "Alertbeskeddetaljer"
msgid "Incident|Are you sure you wish to delete this image?"
msgstr "Er du sikker på, at du vil slette billedet?"
@@ -17722,10 +18009,10 @@ msgid "Incident|Summary"
msgstr "Opsummering"
msgid "Incident|There was an issue loading alert data. Please try again."
-msgstr ""
+msgstr "Der opstod et problem ved indlæsning af alertbeskeddata. Prøv venligst igen."
msgid "Incident|There was an issue loading incident data. Please try again."
-msgstr ""
+msgstr "Der opstod et problem ved indlæsning af hændelsesdata. Prøv venligst igen."
msgid "Include author name in notification email body"
msgstr ""
@@ -17734,16 +18021,16 @@ msgid "Include description in commit message"
msgstr "Medtag beskrivelse i commit-meddelelse"
msgid "Include merge request description"
-msgstr ""
+msgstr "Medtag sammenlægningsanmodningsbeskrivelse"
msgid "Include new features from all tiers."
msgstr ""
msgid "Include the name of the author of the issue, merge request or comment in the email body. By default, GitLab overrides the email sender's name. Some email servers don't support that option."
-msgstr ""
+msgstr "Medtag navnet på forfatteren til problemstillingen, sammenlægningsanmodningen eller kommentaren i e-mails meddelelse. GitLab tilsidesætter afsenderens navn i e-mailen. Visse e-mailservere understøtter ikke valgmuligheden."
msgid "Include the username in the URL if required: %{code_open}https://username@gitlab.company.com/group/project.git%{code_close}."
-msgstr ""
+msgstr "Medtag brugernavnet i URL'en hvis det kræves: %{code_open}https://brugernavn@gitlab.company.com/gruppe/projekt.git%{code_close}."
msgid "Includes LFS objects. It can be overridden per group, or per project. 0 for unlimited."
msgstr ""
@@ -17758,10 +18045,10 @@ msgid "Includes an MVC structure, mvnw and pom.xml to help you get started"
msgstr ""
msgid "Incoming email"
-msgstr ""
+msgstr "Indgående e-mail"
msgid "Incoming!"
-msgstr ""
+msgstr "Indgående!"
msgid "Incompatible options set!"
msgstr ""
@@ -17779,7 +18066,7 @@ msgid "Indent"
msgstr "Indryk"
msgid "Index"
-msgstr ""
+msgstr "Indeks"
msgid "Index all projects"
msgstr "Indeksér alle projekter"
@@ -17800,10 +18087,10 @@ msgid "Infrastructure Registry"
msgstr ""
msgid "InfrastructureRegistry|Copy Terraform Command"
-msgstr ""
+msgstr "Kopiér Terraform-kommando"
msgid "InfrastructureRegistry|Copy Terraform Setup Command"
-msgstr ""
+msgstr "Kopiér Terraform-opsætningskommando"
msgid "InfrastructureRegistry|Copy and paste into your Terraform configuration, insert the variables, and run Terraform init:"
msgstr ""
@@ -17815,10 +18102,10 @@ msgid "InfrastructureRegistry|Infrastructure Registry"
msgstr ""
msgid "InfrastructureRegistry|Publish and share your modules. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
+msgstr "Udgiv og del dine moduler. %{docLinkStart}Mere information%{docLinkEnd}"
msgid "InfrastructureRegistry|Terraform"
-msgstr ""
+msgstr "Terraform"
msgid "InfrastructureRegistry|Terraform modules are the main way to package and reuse resource configurations with Terraform. Learn more about how to %{noPackagesLinkStart}create Terraform modules%{noPackagesLinkEnd} in GitLab."
msgstr ""
@@ -17827,19 +18114,19 @@ msgid "InfrastructureRegistry|To authorize access to the Terraform registry:"
msgstr ""
msgid "InfrastructureRegistry|You have no Terraform modules in your project"
-msgstr ""
+msgstr "Du har ingen Terraform-moduler i dit projekt"
msgid "Inherited"
-msgstr ""
+msgstr "Nedarvet"
msgid "Inherited:"
-msgstr ""
+msgstr "Nedarvet:"
msgid "Inline"
msgstr "Indlejret"
msgid "Input host keys manually"
-msgstr ""
+msgstr "Indtast værtsnøgler manuelt"
msgid "Input the remote repository URL"
msgstr ""
@@ -17866,10 +18153,10 @@ msgid "Insert code"
msgstr "Indsæt kode"
msgid "Insert column after"
-msgstr ""
+msgstr "Indsæt kolonne efter"
msgid "Insert column before"
-msgstr ""
+msgstr "Indsæt kolonne før"
msgid "Insert image"
msgstr "Indsæt billede"
@@ -17881,10 +18168,10 @@ msgid "Insert link"
msgstr "Indsæt link"
msgid "Insert row after"
-msgstr ""
+msgstr "Indsæt række efter"
msgid "Insert row before"
-msgstr ""
+msgstr "Indsæt række før"
msgid "Insert suggestion"
msgstr "Indsæt forslag"
@@ -17902,10 +18189,10 @@ msgid "Insights|This project is filtered out in the insights.yml file (see the p
msgstr ""
msgid "Install GitLab Runner and ensure it's running."
-msgstr ""
+msgstr "Installer GitLab Runner og sørg for at det kører."
msgid "Install on clusters"
-msgstr ""
+msgstr "Installer på klynger"
msgid "Installation"
msgstr "Installation"
@@ -17916,7 +18203,7 @@ msgstr[0] "Instans"
msgstr[1] "Instanser"
msgid "Instance Configuration"
-msgstr ""
+msgstr "Instanskonfiguration"
msgid "Instance access request"
msgstr ""
@@ -17934,19 +18221,19 @@ msgid "Instance audit events"
msgstr ""
msgid "Instance overview"
-msgstr ""
+msgstr "Instansoversigt"
msgid "Insufficient permissions"
-msgstr ""
+msgstr "Utilstrækkelige tilladelser"
msgid "Integration"
-msgstr "Integration"
+msgstr "Integrering"
msgid "Integration Settings"
msgstr "Integreringsindstillinger"
msgid "Integrations"
-msgstr "Integrationer"
+msgstr "Integreringer"
msgid "Integrations|%{integrationTitle}: active"
msgstr "%{integrationTitle}: aktiv"
@@ -17976,19 +18263,19 @@ msgid "Integrations|All projects inheriting these settings will also be reset."
msgstr "Alle projekter som nedarver indstillingerne nulstilles også."
msgid "Integrations|An error occurred while loading projects using custom settings."
-msgstr ""
+msgstr "Der opstod en fejl under indlæsning af projekter med tilpassede indstillinger."
msgid "Integrations|Browser limitations"
-msgstr ""
+msgstr "Browserbegrænsninger"
msgid "Integrations|Comment detail:"
-msgstr ""
+msgstr "Kommentardetalje:"
msgid "Integrations|Comment settings:"
-msgstr ""
+msgstr "Kommentarindstillinger:"
msgid "Integrations|Connection failed. Please check your settings."
-msgstr ""
+msgstr "Forbindelse mislykkedes. Tjek venligst dine indstillinger."
msgid "Integrations|Connection successful."
msgstr ""
@@ -17996,6 +18283,9 @@ msgstr ""
msgid "Integrations|Create new issue in Jira"
msgstr "Opret ny problemstilling i Jira"
+msgid "Integrations|Create new issue in ZenTao"
+msgstr ""
+
msgid "Integrations|Default settings are inherited from the group level."
msgstr "Standardindstillinger nedarves fra gruppeniveauet."
@@ -18003,7 +18293,7 @@ msgid "Integrations|Default settings are inherited from the instance level."
msgstr "Standardindstillinger nedarves fra instansniveauet."
msgid "Integrations|Enable GitLab.com slash commands in a Slack workspace."
-msgstr ""
+msgstr "Aktivér GitLab.com-skråstregskommandoer i et Slack-arbejdsområde."
msgid "Integrations|Enable comments"
msgstr "Aktivér kommentarer"
@@ -18018,13 +18308,13 @@ msgid "Integrations|Failed to unlink namespace. Please try again."
msgstr "Kunne ikke aflinke navnerum. Prøv venligst igen."
msgid "Integrations|GitLab administrators can set up integrations that all groups and projects inherit and use by default. These integrations apply to all groups and projects that don't already use custom settings. You can override custom settings for a group or project if the settings are necessary at that level. Learn more about %{integrations_link_start}instance-level integration management%{link_end}."
-msgstr ""
+msgstr "GitLab-administratorere kan opsætte integreringer som alle grupper og projekter nedarver og bruger som standard. Integreringerne gælder alle grupper og projekter som ikke allerede bruger tilpassede indstillinger. Du kan tilsidesætte tilpassede indstillinger for en gruppe eller projekt hvis indstillingerne er nødvendige på det niveau. Lær mere om %{integrations_link_start}håndtering af integrering på instansniveau%{link_end}."
msgid "Integrations|GitLab administrators can set up integrations that all projects in a group inherit and use by default. These integrations apply to all projects that don't already use custom settings. You can override custom settings for a project if the settings are necessary at that level. Learn more about %{integrations_link_start}group-level integration management%{link_end}."
-msgstr ""
+msgstr "GitLab-administratorere kan opsætte integreringer som alle projekter i en gruppe nedarver og bruger som standard. Integreringerne gælder alle projekter som ikke allerede bruger tilpassede indstillinger. Du kan tilsidesætte tilpassede indstillinger for et projekt hvis indstillingerne er nødvendige på det niveau. Lær mere om %{integrations_link_start}håndtering af integrering på gruppeniveau%{link_end}."
msgid "Integrations|Group-level integration management"
-msgstr ""
+msgstr "Håndtering af integrering på gruppeniveau"
msgid "Integrations|Includes Standard, plus the entire commit message, commit hash, and issue IDs"
msgstr ""
@@ -18033,22 +18323,22 @@ msgid "Integrations|Includes commit title and branch."
msgstr ""
msgid "Integrations|Instance-level integration management"
-msgstr ""
+msgstr "Håndtering af integrering på instansniveau"
msgid "Integrations|Issues created in Jira are shown here once you have created the issues in project setup in Jira."
msgstr ""
msgid "Integrations|Keep your PHP dependencies updated on Packagist."
-msgstr ""
+msgstr "Hold dine PHP-afhængigheder opdateret på Packagist."
msgid "Integrations|Link namespaces"
msgstr "Link navnerum"
msgid "Integrations|Linked namespaces"
-msgstr ""
+msgstr "Linkede navnerum"
msgid "Integrations|Namespace successfully linked"
-msgstr ""
+msgstr "Navnerum linket"
msgid "Integrations|Namespaces are the GitLab groups and subgroups you link to this Jira instance."
msgstr ""
@@ -18057,19 +18347,19 @@ msgid "Integrations|No available namespaces."
msgstr "Ingen tilgængelige navnerum."
msgid "Integrations|No linked namespaces"
-msgstr ""
+msgstr "Ingen linkede navnerum"
msgid "Integrations|Note: this integration only works with accounts on GitLab.com (SaaS)."
-msgstr ""
+msgstr "Bemærk: integreringen virker kun med kontoer på GitLab.com (SaaS)."
msgid "Integrations|Projects using custom settings"
-msgstr ""
+msgstr "Projekter som bruger tilpassede indstillinger"
msgid "Integrations|Projects using custom settings will not be affected."
-msgstr ""
+msgstr "Projekter som bruger tilpassede indstillinger påvirkes ikke."
msgid "Integrations|Projects using custom settings will not be impacted unless the project owner chooses to use parent level defaults."
-msgstr ""
+msgstr "Projekter som bruger tilpassede indstillinger vil ikke blive berørt ikke medmindre projektejeren vælger at bruge standarder på forælderniveau."
msgid "Integrations|Reset integration?"
msgstr "Nulstil integrering?"
@@ -18084,51 +18374,60 @@ msgid "Integrations|Save settings?"
msgstr "Gem indstillinger?"
msgid "Integrations|Saving will update the default settings for all projects that are not using custom settings."
-msgstr ""
+msgstr "Gemning vil opdatere standardindstillingerne for alle projekter som ikke bruger tilpassede indstillinger."
msgid "Integrations|Search Jira issues"
msgstr "Søg efter Jira-problemstillinger"
+msgid "Integrations|Search ZenTao issues"
+msgstr ""
+
msgid "Integrations|Send notifications about project events to Unify Circuit."
+msgstr "Send underretninger om projektbegivenheder til Unify Circuit."
+
+msgid "Integrations|Send notifications about project events to a Unify Circuit conversation. %{docs_link}"
msgstr ""
msgid "Integrations|Sign in to add namespaces"
-msgstr ""
+msgstr "Log ind og tilføj navnerum"
msgid "Integrations|Standard"
msgstr "Standard"
msgid "Integrations|There are no projects using custom settings"
-msgstr ""
+msgstr "Der er ingen projekter som bruger tilpassede indstillinger"
msgid "Integrations|This integration, and inheriting projects were reset."
-msgstr ""
+msgstr "Integreringen og nedarvede projekter blev nulstillet."
msgid "Integrations|To keep this project going, create a new issue."
-msgstr ""
+msgstr "Opret en ny problemstilling for at holde projektet i gang."
msgid "Integrations|Use custom settings"
-msgstr ""
+msgstr "Brug tilpassede indstillinger"
msgid "Integrations|Use default settings"
msgstr "Brug standardindstillinger"
msgid "Integrations|When you mention a Jira issue in a commit or merge request, GitLab creates a remote link and comment (if enabled)."
-msgstr ""
+msgstr "Når du nævner en Jira-problemstilling i en commit eller sammenlægningsanmodning, så opretter GitLab et fjernlink og en kommentar (hvis det er aktiveret)."
msgid "Integrations|You can now close this window and return to the GitLab for Jira application."
-msgstr ""
+msgstr "Du kan nu lukke vinduet og vende tilbage til GitLab for Jira-programmet."
msgid "Integrations|You haven't activated any integrations yet."
-msgstr ""
+msgstr "Du har endnu ikke aktiveret nogle integreringer."
msgid "Integrations|You must have owner or maintainer permissions to link namespaces."
-msgstr ""
+msgstr "Du skal have ejer- eller vedligeholdertilladelser for at linke navnerum."
msgid "Integrations|You should now see GitLab.com activity inside your Jira Cloud issues. %{linkStart}Learn more%{linkEnd}"
msgstr ""
msgid "Integrations|You've activated every integration 🎉"
+msgstr "Du har aktiveret alle integreringer 🎉"
+
+msgid "Integrations|ZenTao issues display here when you create issues in your project in ZenTao."
msgstr ""
msgid "Interactive mode"
@@ -18156,13 +18455,10 @@ msgid "Internal users cannot be deactivated"
msgstr "Interne brugere kan ikke deaktiveres"
msgid "Interval Pattern"
-msgstr ""
-
-msgid "Introducing Value Stream Analytics"
-msgstr ""
+msgstr "Intervalmønster"
msgid "Introducing Your DevOps Report"
-msgstr ""
+msgstr "Introduktion til din DevOps-rapport"
msgid "Invalid Insights config file detected"
msgstr ""
@@ -18249,7 +18545,7 @@ msgid "Invalid status"
msgstr "Ugyldig status"
msgid "Invalid two-factor code."
-msgstr "Ugyldig tofaktorkode."
+msgstr "Ugyldig totrinskode."
msgid "Invalid yaml"
msgstr "Ugyldig yaml"
@@ -18257,11 +18553,17 @@ msgstr "Ugyldig yaml"
msgid "Investigate vulnerability: %{title}"
msgstr ""
+msgid "Invisible Captcha"
+msgstr ""
+
+msgid "Invisible Captcha helps prevent the creation of spam accounts. It adds a honeypot field and time-sensitive form submission to the account signup form."
+msgstr ""
+
msgid "Invitation"
msgstr "Invitation"
msgid "Invitation declined"
-msgstr ""
+msgstr "Invitation afvist"
msgid "Invite"
msgstr "Inviter"
@@ -18291,10 +18593,10 @@ msgid "Invite members"
msgstr "Inviter medlemmer"
msgid "InviteEmail|%{inviter} invited you to join the %{project_or_group_name} %{project_or_group} as a %{role}"
-msgstr ""
+msgstr "%{inviter} inviterede dig til at deltage i %{project_or_group_name} %{project_or_group} som en %{role}"
msgid "InviteEmail|%{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} as a %{role}"
-msgstr ""
+msgstr "%{inviter} inviterede dig til at deltage i %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} som en %{role}"
msgid "InviteEmail|%{project_or_group} details"
msgstr ""
@@ -18303,13 +18605,13 @@ msgid "InviteEmail|Groups assemble related projects together and grant members a
msgstr ""
msgid "InviteEmail|Join now"
-msgstr ""
+msgstr "Deltag nu"
msgid "InviteEmail|Join your team on GitLab! %{inviter} invited you to %{project_or_group_name}"
-msgstr ""
+msgstr "Deltag i dit team på GitLab! %{inviter} inviterede dig til %{project_or_group_name}"
msgid "InviteEmail|Join your team on GitLab! You are invited to %{project_or_group_name}"
-msgstr ""
+msgstr "Deltag i dit team på GitLab! Du inviteres til %{project_or_group_name}"
msgid "InviteEmail|Projects are used to host and collaborate on code, track issues, and continuously build, test, and deploy your app with built-in GitLab CI/CD."
msgstr ""
@@ -18321,16 +18623,16 @@ msgid "InviteEmail|You are invited to join the %{strong_start}%{project_or_group
msgstr "Du inviteres til at deltage i %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} som en %{role}"
msgid "InviteEmail|You have been invited to join the %{project_or_group_name} %{project_or_group} as a %{role}"
-msgstr ""
+msgstr "Du er blevet inviteret til at deltage i %{project_or_group_name} %{project_or_group} som en %{role}"
msgid "InviteMembersBanner|Collaborate with your team"
msgstr ""
msgid "InviteMembersBanner|Invite your colleagues"
-msgstr ""
+msgstr "Inviter dine kollegaer"
msgid "InviteMembersBanner|We noticed that you haven't invited anyone to this group. Invite your colleagues so you can discuss issues, collaborate on merge requests, and share your knowledge."
-msgstr ""
+msgstr "Vi har bemærket at du ikke har inviteret nogen til gruppen. Invitér dine kollegaer, så du kan debattere problemstillinger, samarbejde på sammenlægningsanmodninger og dele din viden."
msgid "InviteMembersModal|%{linkStart}Read more%{linkEnd} about role permissions"
msgstr ""
@@ -18390,7 +18692,7 @@ msgid "InviteMembersModal|Something went wrong"
msgstr "Noget gik galt"
msgid "InviteMembersModal|What would you like new member(s) to focus on? (optional)"
-msgstr ""
+msgstr "Hvad vil du have nye medlemmer til at fokusere på? (valgfrit)"
msgid "InviteMembersModal|You're inviting a group to the %{strongStart}%{name}%{strongEnd} group."
msgstr "Du inviterer en gruppe til gruppen %{strongStart}%{name}%{strongEnd}."
@@ -18432,16 +18734,16 @@ msgid "InviteMember|Invited users will be added with developer level permissions
msgstr ""
msgid "InviteReminderEmail|%{inviter} is still waiting for you to join GitLab"
-msgstr ""
+msgstr "%{inviter} venter stadigvæk på at du deltager i GitLab"
msgid "InviteReminderEmail|%{inviter} is waiting for you to join GitLab"
-msgstr ""
+msgstr "%{inviter} venter på at du deltager i GitLab"
msgid "InviteReminderEmail|%{inviter} is waiting for you to join the %{strong_start}%{project_or_group_name}%{strong_end} %{project_or_group} as a %{role}."
-msgstr ""
+msgstr "%{inviter} venter på at du deltager i %{strong_start}%{project_or_group_name}%{strong_end} %{project_or_group} som en %{role}."
msgid "InviteReminderEmail|%{inviter}'s invitation to GitLab is pending"
-msgstr ""
+msgstr "%{inviter}s invitation til GitLab afventer"
msgid "InviteReminderEmail|Accept invitation"
msgstr "Accepter invitation"
@@ -18465,7 +18767,7 @@ msgid "InviteReminderEmail|In case you missed it..."
msgstr ""
msgid "InviteReminderEmail|Invitation pending"
-msgstr ""
+msgstr "Invitation afventer"
msgid "InviteReminderEmail|It's been %{invitation_age} days since %{inviter} invited you to join the %{strong_start}%{project_or_group_name}%{strong_end} %{project_or_group} as a %{role}. What would you like to do?"
msgstr ""
@@ -18483,16 +18785,16 @@ msgid "IrkerService|Channels and users separated by whitespaces. %{recipients_do
msgstr ""
msgid "IrkerService|Default IRC URI (optional)"
-msgstr ""
+msgstr "Standard IRC-URI (valgfrit)"
msgid "IrkerService|How to enter channels or users?"
msgstr ""
msgid "IrkerService|Recipients"
-msgstr ""
+msgstr "Modtagere"
msgid "IrkerService|Send update messages to an irker server."
-msgstr ""
+msgstr "Send opdateringsmeddelelser til en irker-server."
msgid "IrkerService|Send update messages to an irker server. Before you can use this, you need to set up the irker daemon. %{docs_link}"
msgstr ""
@@ -18504,7 +18806,7 @@ msgid "IrkerService|Server port (optional)"
msgstr "Serverport (valgfrit)"
msgid "IrkerService|URI to add before each recipient."
-msgstr ""
+msgstr "URI som skal tilføjes før hver modtager."
msgid "IrkerService|irker (IRC gateway)"
msgstr ""
@@ -18519,28 +18821,28 @@ msgid "Is blocked by"
msgstr "Blokeres af"
msgid "Is this GitLab trial for your company?"
-msgstr ""
+msgstr "Er GitLab-prøveperioden til din virksomhed?"
msgid "Is using license seat:"
-msgstr ""
+msgstr "Bruger licenssæde:"
msgid "Is using seat"
-msgstr ""
+msgstr "Bruger sæde"
msgid "IssuableStatus|Closed"
-msgstr ""
+msgstr "Lukket"
msgid "IssuableStatus|Closed (%{link})"
-msgstr ""
+msgstr "Lukket (%{link})"
msgid "IssuableStatus|duplicated"
-msgstr ""
+msgstr "duplikeret"
msgid "IssuableStatus|moved"
-msgstr ""
+msgstr "flyttet"
msgid "IssuableStatus|promoted"
-msgstr ""
+msgstr "forfremmet"
msgid "Issue"
msgstr "Problemstilling"
@@ -18549,7 +18851,7 @@ msgid "Issue %{issue_reference} has already been added to epic %{epic_reference}
msgstr ""
msgid "Issue Analytics"
-msgstr ""
+msgstr "Problemstillingsanalyse"
msgid "Issue Boards"
msgstr "Problemstillingstavler"
@@ -18558,13 +18860,13 @@ msgid "Issue Type"
msgstr "Problemstillingstype"
msgid "Issue already promoted to epic."
-msgstr ""
+msgstr "Problemstilling allerede forfremmet til epic."
msgid "Issue cannot be found."
-msgstr "Problemstillingen kan ikke findes."
+msgstr "Kan ikke finde problemstilling."
msgid "Issue created from vulnerability %{vulnerability_link}"
-msgstr ""
+msgstr "Problemstilling oprettet fra sårbarheden %{vulnerability_link}"
msgid "Issue creation requests"
msgstr ""
@@ -18573,13 +18875,13 @@ msgid "Issue details"
msgstr "Problemstillingsdetaljer"
msgid "Issue events"
-msgstr ""
+msgstr "Problemstillingsbegivenheder"
msgid "Issue first deployed to production"
msgstr ""
msgid "Issue label"
-msgstr ""
+msgstr "Problemstillingsetiket"
msgid "Issue or merge request ID is required"
msgstr ""
@@ -18591,13 +18893,13 @@ msgid "Issue types"
msgstr "Problemstillingstyper"
msgid "Issue update failed"
-msgstr ""
+msgstr "Opdatering af problemstilling mislykkedes"
msgid "Issue was closed by %{name} %{reason}"
-msgstr ""
+msgstr "Problemstilling blev lukket af %{name} %{reason}"
msgid "Issue weight"
-msgstr ""
+msgstr "Problemstillingsvægt"
msgid "Issue(s) already assigned"
msgstr ""
@@ -18606,7 +18908,7 @@ msgid "IssueAnalytics|Age"
msgstr "Alder"
msgid "IssueAnalytics|Assignees"
-msgstr ""
+msgstr "Tildelere"
msgid "IssueAnalytics|Due date"
msgstr "Forfaldsdato"
@@ -18630,7 +18932,7 @@ msgid "IssueAnalytics|Weight"
msgstr "Vægt"
msgid "IssueBoards|An error occurred while setting notifications status. Please try again."
-msgstr ""
+msgstr "Der opstod et problem under indstilling af underretningsstatus. Prøv venligst igen."
msgid "IssueBoards|Board"
msgstr "Tavle"
@@ -18645,64 +18947,64 @@ msgid "IssueBoards|Delete board"
msgstr "Slet tavle"
msgid "IssueBoards|No matching boards found"
-msgstr ""
+msgstr "Ingen matchende tavler fundet"
msgid "IssueBoards|Some of your boards are hidden, activate a license to see them again."
-msgstr ""
+msgstr "Nogle af dine tavler er skjulte. Aktivér en licens for at se dem igen."
msgid "IssueBoards|Switch board"
msgstr "Skift tavle"
msgid "IssueTracker|Custom issue tracker"
-msgstr ""
+msgstr "Tilpasset problemstillingsporing"
msgid "IssueTracker|Issue URL"
-msgstr ""
+msgstr "Problemstillings-URL"
msgid "IssueTracker|New issue URL"
msgstr ""
msgid "IssueTracker|The URL to create an issue in the external issue tracker."
-msgstr ""
+msgstr "URL'en til at oprette en problemstilling i den eksterne problemstillingsporing."
msgid "IssueTracker|The URL to the project in YouTrack."
-msgstr ""
+msgstr "URL'en til projektet i YouTrack."
msgid "IssueTracker|The URL to the project in the external issue tracker."
-msgstr ""
+msgstr "URL'en til projektet i den eksterne problemstillingsporing."
msgid "IssueTracker|The URL to view an issue in the YouTrack project. Must contain %{colon_id}."
-msgstr ""
+msgstr "URL'en til at vise en problemstilling i YouTrack-projektet. Skal indeholde %{colon_id}."
msgid "IssueTracker|The URL to view an issue in the external issue tracker. Must contain %{colon_id}."
-msgstr ""
+msgstr "URL'en til at vise en problemstilling i den eksterne problemstillingsporing. Skal indeholde %{colon_id}."
msgid "IssueTracker|Use Bugzilla as this project's issue tracker."
-msgstr ""
+msgstr "Brug Bugzilla som projektets problemstillingssporing."
msgid "IssueTracker|Use Bugzilla as this project's issue tracker. %{docs_link}"
-msgstr ""
+msgstr "Brug Bugzilla som projektets problemstillingssporing. %{docs_link}"
msgid "IssueTracker|Use IBM Engineering Workflow Management as this project's issue tracker."
-msgstr ""
+msgstr "Brug IBM Engineering Workflow Management som projektets problemstillingssporing."
msgid "IssueTracker|Use IBM Engineering Workflow Management as this project's issue tracker. %{docs_link}"
-msgstr ""
+msgstr "Brug IBM Engineering Workflow Management som projektets problemstillingssporing. %{docs_link}"
msgid "IssueTracker|Use Redmine as the issue tracker. %{docs_link}"
-msgstr ""
+msgstr "Brug Redmine som problemstillingsporingen. %{docs_link}"
msgid "IssueTracker|Use Redmine as this project's issue tracker."
-msgstr ""
+msgstr "Brug Redmine som projektets problemstillingssporing."
msgid "IssueTracker|Use YouTrack as this project's issue tracker."
-msgstr ""
+msgstr "Brug YouTrack som projektets problemstillingssporing."
msgid "IssueTracker|Use YouTrack as this project's issue tracker. %{docs_link}"
-msgstr ""
+msgstr "Brug YouTrack som projektets problemstillingssporing. %{docs_link}"
msgid "IssueTracker|Use a custom issue tracker as this project's issue tracker."
-msgstr ""
+msgstr "Brug en tilpasset problemstillingssporing som projektets problemstillingssporing."
msgid "IssueTracker|Use a custom issue tracker that is not in the integration list. %{docs_link}"
msgstr ""
@@ -18710,10 +19012,16 @@ msgstr ""
msgid "Issues"
msgstr "Problemstillinger"
+msgid "Issues I've created"
+msgstr ""
+
msgid "Issues Rate Limits"
msgstr ""
msgid "Issues and merge requests"
+msgstr "Problemstillinger og sammenlægningsanmodninger"
+
+msgid "Issues assigned to me"
msgstr ""
msgid "Issues can be bugs, tasks or ideas to be discussed. Also, issues are searchable and filterable."
@@ -18732,7 +19040,7 @@ msgid "Issues with comments, merge requests with diffs and comments, labels, mil
msgstr ""
msgid "Issues with label %{label}"
-msgstr ""
+msgstr "Problemstillinger med etiketten %{label}"
msgid "Issues with no epic assigned"
msgstr ""
@@ -18744,19 +19052,19 @@ msgid "IssuesAnalytics|After you begin creating issues for your projects, we can
msgstr ""
msgid "IssuesAnalytics|Avg/Month:"
-msgstr ""
+msgstr "Gns./måned:"
msgid "IssuesAnalytics|Issues opened"
-msgstr ""
+msgstr "Problemstillinger åbnet"
msgid "IssuesAnalytics|Issues opened per month"
-msgstr ""
+msgstr "Problemstillinger åbnet pr. måned"
msgid "IssuesAnalytics|Last 12 months"
msgstr "Sidste 12 måneder"
msgid "IssuesAnalytics|Sorry, your filter produced no results"
-msgstr ""
+msgstr "Beklager, dit filter gav ingen resultater"
msgid "IssuesAnalytics|There are no issues for the projects in your group"
msgstr ""
@@ -18765,13 +19073,13 @@ msgid "IssuesAnalytics|To widen your search, change or remove filters in the fil
msgstr ""
msgid "IssuesAnalytics|Total:"
-msgstr ""
+msgstr "I alt:"
msgid "Issue|Title"
msgstr "Titel"
msgid "It is not possible to %{action} files that are stored in LFS using the web interface"
-msgstr ""
+msgstr "Det er nu muligt at %{action} filer som er gemt i LFS med webgrænsefladen"
msgid "It looks like you have some draft commits in this branch."
msgstr ""
@@ -18789,7 +19097,7 @@ msgid "It seems that there is currently no available data for code coverage"
msgstr ""
msgid "It's you"
-msgstr ""
+msgstr "Det er dig"
msgid "Italic text"
msgstr "Kursiv tekst"
@@ -18819,43 +19127,46 @@ msgid "Iterations|Automated scheduling"
msgstr "Automatiseret planlægning"
msgid "Iterations|Cadence name"
-msgstr ""
+msgstr "Kadencenavn"
msgid "Iterations|Couldn't find iteration cadence"
-msgstr ""
+msgstr "Kunne ikke finde gennemløbskadence"
msgid "Iterations|Create cadence"
-msgstr ""
+msgstr "Opret kadence"
-msgid "Iterations|Create your first iteration"
+msgid "Iterations|Create iteration"
msgstr ""
msgid "Iterations|Delete cadence"
-msgstr ""
+msgstr "Slet kadence"
msgid "Iterations|Delete iteration cadence?"
+msgstr "Slet gennemløbskadence?"
+
+msgid "Iterations|Delete iteration?"
msgstr ""
msgid "Iterations|Duration"
msgstr "Varighed"
msgid "Iterations|Edit cadence"
-msgstr ""
+msgstr "Rediger kadence"
msgid "Iterations|Edit iteration"
msgstr "Rediger gennemløb"
msgid "Iterations|Edit iteration cadence"
-msgstr ""
+msgstr "Rediger gennemløbskadence"
msgid "Iterations|Error loading iteration cadences."
-msgstr ""
+msgstr "Fejl ved indlæsning af gennemløbskadencer."
msgid "Iterations|Future iterations"
msgstr ""
msgid "Iterations|Iteration cadences"
-msgstr ""
+msgstr "Gennemløbskadencer"
msgid "Iterations|Iteration scheduling will be handled automatically"
msgstr ""
@@ -18867,12 +19178,18 @@ msgid "Iterations|New iteration"
msgstr "Nyt gennemløb"
msgid "Iterations|New iteration cadence"
+msgstr "Ny gennemløbskadence"
+
+msgid "Iterations|No closed iterations."
msgstr ""
msgid "Iterations|No iteration cadences to show."
-msgstr ""
+msgstr "Ingen gennemløbskadencer at vise."
msgid "Iterations|No iterations in cadence."
+msgstr "Ingen gennemløb i kadence."
+
+msgid "Iterations|No open iterations."
msgstr ""
msgid "Iterations|Number of future iterations you would like to have scheduled"
@@ -18882,7 +19199,7 @@ msgid "Iterations|Roll over issues"
msgstr ""
msgid "Iterations|Save cadence"
-msgstr ""
+msgstr "Gem kadence"
msgid "Iterations|Select duration"
msgstr "Vælg varighed"
@@ -18897,12 +19214,15 @@ msgid "Iterations|Start date"
msgstr "Startdato"
msgid "Iterations|The duration for each iteration (in weeks)"
-msgstr ""
+msgstr "Varigheden af hvert gennemløb (i uger)"
msgid "Iterations|The start date of your first iteration"
msgstr ""
msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
+msgstr "Det vil slette kadencen samt alle de gennemløb der er i den."
+
+msgid "Iterations|This will remove the iteration from any issues that are assigned to it."
msgstr ""
msgid "Iterations|Title"
@@ -18915,19 +19235,13 @@ msgid "Iteration|Dates cannot overlap with other existing Iterations within this
msgstr ""
msgid "Iteration|Dates cannot overlap with other existing Iterations within this iterations cadence"
-msgstr ""
+msgstr "Datoer kan ikke overlappe andre eksisterende gennemløb i gennemløbskadencen"
msgid "Iteration|cannot be more than 500 years in the future"
msgstr "må ikke være mere end 500 år ud i fremtiden"
-msgid "I’m familiar with the basics of DevOps."
-msgstr ""
-
msgid "I’m joining my team who’s already on GitLab"
-msgstr ""
-
-msgid "I’m not familiar with the basics of DevOps."
-msgstr "Jeg er ikke bekendt med det grundlæggende i DevOps."
+msgstr "Jeg deltager i mit team som allerede er på GitLab"
msgid "Jaeger URL"
msgstr "Jaeger-URL"
@@ -18939,7 +19253,7 @@ msgid "January"
msgstr "Januar"
msgid "Japanese language support using"
-msgstr ""
+msgstr "Understøttelse af japansk med"
msgid "Jira Issues"
msgstr "Jira-problemstillinger"
@@ -18957,10 +19271,10 @@ msgid "Jira project key is not configured."
msgstr ""
msgid "Jira project: %{importProject}"
-msgstr ""
+msgstr "Jira-projekt: %{importProject}"
msgid "Jira service not configured."
-msgstr ""
+msgstr "Jira-tjeneste ikke konfigureret."
msgid "Jira user"
msgstr "Jira-bruger"
@@ -18972,7 +19286,7 @@ msgid "Jira-GitLab user mapping template"
msgstr ""
msgid "JiraConnect|Create branch for Jira issue %{jiraIssue}"
-msgstr ""
+msgstr "Opret gren til Jira-problemstillingen %{jiraIssue}"
msgid "JiraConnect|Failed to create branch."
msgstr "Kunne ikke oprette gren."
@@ -18984,7 +19298,7 @@ msgid "JiraConnect|New branch was successfully created."
msgstr ""
msgid "JiraConnect|You can now close this window and return to Jira."
-msgstr ""
+msgstr "Du kan nu lukke vinduet og vende tilbage til Jira."
msgid "JiraRequest|A connection error occurred while connecting to Jira. Try your request again."
msgstr ""
@@ -18996,10 +19310,10 @@ msgid "JiraRequest|An SSL error occurred while connecting to Jira: %{message}. T
msgstr ""
msgid "JiraRequest|An error occurred while requesting data from Jira. Check your Jira integration configuration and try again."
-msgstr ""
+msgstr "Der opstod en fejl under anmodning af data fra Jira. Tjek din konfiguration af Jira-integrering og prøv igen."
msgid "JiraRequest|An error occurred while requesting data from Jira: %{messages}. Check your Jira integration configuration and try again."
-msgstr ""
+msgstr "Der opstod en fejl under anmodning af data fra Jira: %{messages}. Tjek din konfiguration af Jira-integrering og prøv igen."
msgid "JiraRequest|The Jira API URL for connecting to Jira is not valid. Check your Jira integration API URL and try again."
msgstr ""
@@ -19011,10 +19325,10 @@ msgid "JiraRequest|The credentials for accessing Jira are not valid. Check your
msgstr ""
msgid "JiraService| on branch %{branch_link}"
-msgstr ""
+msgstr " på grenen %{branch_link}"
msgid "JiraService|%{jiraDocsLinkStart}Enable the Jira integration%{jiraDocsLinkEnd} to view your Jira issues in GitLab."
-msgstr ""
+msgstr "%{jiraDocsLinkStart}Aktivér Jira-integreringen%{jiraDocsLinkEnd} for at vise dine Jira-problemstillinger i GitLab."
msgid "JiraService|%{jira_docs_link_start}Enable the Jira integration%{jira_docs_link_end} to view your Jira issues in GitLab."
msgstr ""
@@ -19023,13 +19337,13 @@ msgid "JiraService|%{user_link} mentioned this issue in %{entity_link} of %{proj
msgstr ""
msgid "JiraService|An error occurred while fetching issue list"
-msgstr ""
+msgstr "Der opstod en fejl under hentning af problemstillingsliste"
msgid "JiraService|Automatically transitions Jira issues to the \"Done\" category. %{linkStart}Learn more%{linkEnd}"
msgstr ""
msgid "JiraService|Base URL of the Jira instance."
-msgstr ""
+msgstr "Grund-URL for Jira-instansen."
msgid "JiraService|Define the type of Jira issue to create from a vulnerability."
msgstr ""
@@ -19038,19 +19352,19 @@ msgid "JiraService|Displaying Jira issues while leaving the GitLab issue functio
msgstr ""
msgid "JiraService|Enable Jira issues"
-msgstr ""
+msgstr "Aktivér Jira-problemstillinger"
msgid "JiraService|Enable Jira issues creation from vulnerabilities"
msgstr ""
msgid "JiraService|Enable Jira transitions"
-msgstr ""
+msgstr "Aktivér Jira-overgange"
msgid "JiraService|Enter new password or API token"
-msgstr ""
+msgstr "Indtast ny adgangskode eller API-token"
msgid "JiraService|Events for %{noteable_model_name} are disabled."
-msgstr ""
+msgstr "Begivenheder for %{noteable_model_name} er deaktiveret."
msgid "JiraService|Failed to load Jira issue statuses. View the issue in Jira, or reload the page."
msgstr ""
@@ -19083,7 +19397,7 @@ msgid "JiraService|If different from Web URL."
msgstr ""
msgid "JiraService|Issue List"
-msgstr ""
+msgstr "Problemstillingsliste"
msgid "JiraService|Issues created from vulnerabilities in this project will be Jira issues, even if GitLab issues are enabled."
msgstr ""
@@ -19092,16 +19406,16 @@ msgid "JiraService|Jira API URL"
msgstr ""
msgid "JiraService|Jira Issues"
-msgstr ""
+msgstr "Jira-problemstillinger"
msgid "JiraService|Jira comments are created when an issue is referenced in a commit."
msgstr ""
msgid "JiraService|Jira comments are created when an issue is referenced in a merge request."
-msgstr ""
+msgstr "Jira-kommentarer oprettes når der refereres til en problemstilling i en sammenlægningsanmodning."
msgid "JiraService|Jira issue type"
-msgstr ""
+msgstr "Jira-problemstillingstype"
msgid "JiraService|Jira project key"
msgstr ""
@@ -19122,7 +19436,7 @@ msgid "JiraService|Open Jira"
msgstr ""
msgid "JiraService|Password or API token"
-msgstr ""
+msgstr "Adgangskode eller API-token"
msgid "JiraService|Project key changed, refresh list"
msgstr ""
@@ -19143,13 +19457,13 @@ msgid "JiraService|This feature requires a Premium plan."
msgstr ""
msgid "JiraService|This is a Premium feature"
-msgstr ""
+msgstr "Det er en Premium-funktion"
msgid "JiraService|This is an Ultimate feature"
-msgstr ""
+msgstr "Dette er en Ultimate-funktion"
msgid "JiraService|This issue is synchronized with Jira"
-msgstr ""
+msgstr "Problemstillingen er synkroniseret med Jira"
msgid "JiraService|Transition Jira issues to their final state:"
msgstr ""
@@ -19158,7 +19472,7 @@ msgid "JiraService|Upgrade your plan to enable this feature of the Jira Integrat
msgstr ""
msgid "JiraService|Use Jira as this project's issue tracker."
-msgstr ""
+msgstr "Brug Jira som projektets problemstillingssporing."
msgid "JiraService|Use a password for server version and an API token for cloud version."
msgstr ""
@@ -19173,16 +19487,16 @@ msgid "JiraService|Username or Email"
msgstr "Brugernavn eller e-mail"
msgid "JiraService|Using Jira for issue tracking?"
-msgstr ""
+msgstr "Brug Jira til problemstillingssporing?"
msgid "JiraService|View Jira issues in GitLab"
-msgstr ""
+msgstr "Vis Jira-problemstillinger i GitLab"
msgid "JiraService|Warning: All GitLab users that have access to this GitLab project are able to view all issues from the Jira project specified below."
msgstr ""
msgid "JiraService|Web URL"
-msgstr ""
+msgstr "Web-URL"
msgid "JiraService|Work on Jira issues without leaving GitLab. Adds a Jira menu to access your list of Jira issues and view any issue as read-only."
msgstr ""
@@ -19193,6 +19507,9 @@ msgstr ""
msgid "Job"
msgstr "Job"
+msgid "Job %{jobName}"
+msgstr ""
+
msgid "Job Failed #%{build_id}"
msgstr ""
@@ -19218,7 +19535,7 @@ msgid "Job is missing the `model_type` argument."
msgstr "Jobbet mangler argumentet `model_type`."
msgid "Job is stuck. Check runners."
-msgstr ""
+msgstr "Jobbet sidder fast. Tjek runnere."
msgid "Job logs and artifacts"
msgstr ""
@@ -19251,7 +19568,7 @@ msgid "Jobs|Create CI/CD configuration file"
msgstr ""
msgid "Jobs|Job is stuck. Check runners."
-msgstr ""
+msgstr "Jobbet sidder fast. Tjek runnere."
msgid "Jobs|Jobs are the building blocks of a GitLab CI/CD pipeline. Each job has a specific task, like testing code. To set up jobs in a CI/CD pipeline, add a CI/CD configuration file to your project."
msgstr ""
@@ -19308,7 +19625,7 @@ msgid "Job|The artifacts will be removed"
msgstr "Artefakterne vil blive fjernet"
msgid "Job|These artifacts are the latest. They will not be deleted (even if expired) until newer artifacts are available."
-msgstr ""
+msgstr "Artefakterne er de seneste. De vil ikke blive slettet (selv hvis de er udløbet) indtil nyere artefakter er tilgængelige."
msgid "Job|This job failed because the necessary resources were not successfully created."
msgstr ""
@@ -19323,19 +19640,19 @@ msgid "Job|This job is stuck because you don't have any active runners that can
msgstr ""
msgid "Job|allowed to fail"
-msgstr ""
+msgstr "må mislykkes"
msgid "Job|delayed"
msgstr "forsinket"
msgid "Job|for"
-msgstr ""
+msgstr "for"
msgid "Job|into"
-msgstr ""
+msgstr "i"
msgid "Job|manual"
-msgstr ""
+msgstr "manuelt"
msgid "Job|triggered"
msgstr "udløst"
@@ -19347,7 +19664,7 @@ msgid "Join Zoom meeting"
msgstr "Deltag i Zoom-møde"
msgid "Joined %{time_ago}"
-msgstr ""
+msgstr "Tilmeldt %{time_ago}"
msgid "Joined %{user_created_time}"
msgstr ""
@@ -19389,13 +19706,13 @@ msgid "Keep divergent refs"
msgstr ""
msgid "Keep editing"
-msgstr ""
+msgstr "Fortsæt redigering"
msgid "Keeping all SAST analyzers enabled future-proofs the project in case new languages are added later on. Determining which analyzers apply is a process that consumes minimal resources and adds minimal time to the pipeline. Leaving all SAST analyzers enabled ensures maximum coverage."
msgstr ""
msgid "Kerberos access denied"
-msgstr ""
+msgstr "Kerberos-adgang afvist"
msgid "Key"
msgstr "Nøgle"
@@ -19440,7 +19757,7 @@ msgid "Ki"
msgstr "Ki"
msgid "Kroki"
-msgstr ""
+msgstr "Kroki"
msgid "Kubernetes"
msgstr "Kubernetes"
@@ -19461,13 +19778,13 @@ msgid "Kubernetes cluster creation time exceeds timeout; %{timeout}"
msgstr ""
msgid "Kubernetes cluster integration and resources are being removed."
-msgstr ""
+msgstr "Kubernetes-klyngeintegrering og -ressourcer er ved at blive fjernet."
msgid "Kubernetes cluster integration was successfully removed."
msgstr ""
msgid "Kubernetes cluster was successfully updated."
-msgstr ""
+msgstr "Kubernetes-klynge blev opdateret."
msgid "Kubernetes clusters"
msgstr "Kubernetes-klynger"
@@ -19500,7 +19817,7 @@ msgid "LDAP synchronizations"
msgstr "LDAP-synkroniseringer"
msgid "LDAP uid:"
-msgstr ""
+msgstr "LDAP-uid:"
msgid "LFS"
msgstr "LFS"
@@ -19548,10 +19865,10 @@ msgid "Labels"
msgstr "Etiketter"
msgid "Labels can be applied to %{features}. Group labels are available for any project within the group."
-msgstr ""
+msgstr "Etiketter kan anvendes på %{features}. Gruppeetiketter er tilgængelige for alle projekter i gruppen."
msgid "Labels can be applied to issues and merge requests to categorize them."
-msgstr ""
+msgstr "Etiketter kan anvendes på problemstillinger og sammenlægningsanmodninger for at kategorisere dem."
msgid "Labels can be applied to issues and merge requests."
msgstr ""
@@ -19563,7 +19880,7 @@ msgid "Labels|%{spanStart}Promote label%{spanEnd} %{labelTitle} %{spanStart}to G
msgstr ""
msgid "Labels|Promote Label"
-msgstr ""
+msgstr "Forfrem etiket"
msgid "Labels|Promoting %{labelTitle} will make it available for all projects inside %{groupName}. Existing project labels with the same title will be merged. If a group label with the same title exists, it will also be merged. This action cannot be reversed."
msgstr ""
@@ -19572,7 +19889,7 @@ msgid "Language"
msgstr "Sprog"
msgid "Large File Storage"
-msgstr ""
+msgstr "Large File Storage"
msgid "Last %d day"
msgid_plural "Last %d days"
@@ -19643,7 +19960,7 @@ msgid "Last reply by"
msgstr ""
msgid "Last repository check (%{last_check_timestamp}) failed. See the 'repocheck.log' file for error messages."
-msgstr ""
+msgstr "Sidste depottjek (%{last_check_timestamp}) mislykkedes. Se filen 'repocheck.log' for fejlmeddelelser."
msgid "Last seen"
msgstr "Sidst set"
@@ -19655,7 +19972,7 @@ msgid "Last sign-in IP:"
msgstr "Sidste indlognings-IP:"
msgid "Last sign-in at:"
-msgstr ""
+msgstr "Sidste indlogning kl.:"
msgid "Last successful sync"
msgstr "Sidste synkronisering som lykkedes"
@@ -19700,7 +20017,7 @@ msgid "LastPushEvent|You pushed to"
msgstr ""
msgid "LastPushEvent|at"
-msgstr ""
+msgstr "kl."
msgid "Latest changes"
msgstr "Seneste ændringer"
@@ -19709,7 +20026,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 "Start et udviklingsmiljø som er klar til at kode til dit projekt."
msgid "Lead Time"
msgstr ""
@@ -19751,16 +20068,16 @@ msgid "Learn more about Auto DevOps"
msgstr "Lær mere om Auto DevOps"
msgid "Learn more about Needs relationships"
-msgstr ""
+msgstr "Lære mere om behovrelationer"
msgid "Learn more about Web Terminal"
-msgstr "Lær mere om Web Terminal"
+msgstr "Lær mere om webterminal"
msgid "Learn more about X.509 signed commits"
msgstr "Lær mere om X.509-underskrevne commits"
msgid "Learn more about adding certificates to your project by following the %{docs_link_start}documentation on GitLab Pages%{docs_link_end}."
-msgstr ""
+msgstr "Lær mere om at tilføje certifikater til dit projekt ved at følge %{docs_link_start}dokumentationen på GitLab Pages%{docs_link_end}."
msgid "Learn more about custom project templates"
msgstr "Lær mere om tilpassede projektskabeloner"
@@ -19775,7 +20092,7 @@ msgid "Learn more about group-level project templates"
msgstr ""
msgid "Learn more about shards and replicas in the %{configuration_link_start}Advanced search configuration%{configuration_link_end} documentation. Changes won't take place until the index is %{recreated_link_start}recreated%{recreated_link_end}."
-msgstr ""
+msgstr "Lær mere om shards og replikaer i dokumentationen %{configuration_link_start}konfiguration af avanceret søgning%{configuration_link_end}. Ændringerne ske ikke før indekset %{recreated_link_start}genoprettes%{recreated_link_end}."
msgid "Learn more about signing commits"
msgstr "Lær mere om at underskrive commits"
@@ -19783,9 +20100,6 @@ msgstr "Lær mere om at underskrive commits"
msgid "Learn more in the"
msgstr "Lær mere i"
-msgid "Learn more in the|pipeline schedules documentation"
-msgstr ""
-
msgid "Learn more."
msgstr "Lær mere."
@@ -19796,7 +20110,7 @@ msgid "LearnGitLab|Add code owners"
msgstr "Tilføj kodeejere"
msgid "LearnGitLab|Add merge request approval"
-msgstr ""
+msgstr "Tilføj sammenlægningsanmodningsgodkendelse"
msgid "LearnGitLab|Complete these tasks first so you can enjoy GitLab's features to their fullest:"
msgstr ""
@@ -19820,10 +20134,10 @@ msgid "LearnGitLab|Deploy"
msgstr "Udsend"
msgid "LearnGitLab|Enable require merge approvals"
-msgstr ""
+msgstr "Aktivér krævede sammenlægningsgodkendelser"
msgid "LearnGitLab|GitLab works best as a team. Invite your colleague to enjoy all features."
-msgstr ""
+msgstr "GitLab virker best som et team. Inviter dine kollegaer for at få glæde af alle funktionerne."
msgid "LearnGitLab|Invite your colleagues"
msgstr "Inviter dine kollegaer"
@@ -19835,7 +20149,7 @@ msgid "LearnGitLab|Plan and execute"
msgstr ""
msgid "LearnGitLab|Prevent unexpected changes to important assets by assigning ownership of files and paths."
-msgstr ""
+msgstr "Forhindr uventede ændringer til vigtige materialer ved at tildele ejerskab over filer og stier."
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 ""
@@ -19844,10 +20158,10 @@ msgid "LearnGitLab|Review and edit proposed changes to source code."
msgstr ""
msgid "LearnGitLab|Route code reviews to the right reviewers, every time."
-msgstr ""
+msgstr "Led kodekontroller til de rette kontrollanter, hver gang."
msgid "LearnGitLab|Run a Security scan using CI/CD"
-msgstr ""
+msgstr "Kør en sikkerhedsskanning med CI/CD"
msgid "LearnGitLab|Save time by automating your integration and deployment tasks."
msgstr ""
@@ -19897,11 +20211,8 @@ msgstr "Forlad"
msgid "Leave Admin Mode"
msgstr "Forlad administratortilstand"
-msgid "Leave blank for no limit. Once set, existing personal access tokens may be revoked."
-msgstr ""
-
msgid "Leave edit mode? All unsaved changes will be lost."
-msgstr ""
+msgstr "Forlad redigeringstilstand? Alle ændringer som ikke er blevet gemt vil gå tabt."
msgid "Leave group"
msgstr "Forlad gruppe"
@@ -19919,7 +20230,7 @@ msgid "Legacy burndown chart"
msgstr ""
msgid "Let's Encrypt does not accept emails on example.com"
-msgstr ""
+msgstr "Let's Encrypt accepterer ikke e-mails på example.com"
msgid "Let's Encrypt is a free, automated, and open certificate authority (CA) that gives digital certificates in order to enable HTTPS (SSL/TLS) for websites. Learn more about Let's Encrypt configuration by following the %{docs_link_start}documentation on GitLab Pages%{docs_link_end}."
msgstr "Let's Encrypt er en gratis automatiserede open source certifikatmyndighed (CA) som giver digitale certifikater for at gøre det muligt at bruge HTTPS (SSL/TLS) på websteder. Lær mere om konfigurationen af Let's Encrypt ved at følge %{docs_link_start}dokumentationen på GitLab Pages%{docs_link_end}."
@@ -19945,12 +20256,12 @@ msgstr "%{docLinkStart}Licensgodkendelser%{docLinkEnd} er inaktiv"
msgid "LicenseCompliance|Acceptable license to be used in the project"
msgstr ""
-msgid "LicenseCompliance|Add a license"
-msgstr "Tilføj en licens"
-
msgid "LicenseCompliance|Add license and related policy"
msgstr ""
+msgid "LicenseCompliance|Add license policy"
+msgstr ""
+
msgid "LicenseCompliance|Allow"
msgstr "Tillad"
@@ -19958,10 +20269,10 @@ msgid "LicenseCompliance|Allowed"
msgstr "Tilladt"
msgid "LicenseCompliance|Denied"
-msgstr ""
+msgstr "Afvist"
msgid "LicenseCompliance|Deny"
-msgstr ""
+msgstr "Afvis"
msgid "LicenseCompliance|Disallow merge request if detected and will instruct developer to remove"
msgstr ""
@@ -19979,8 +20290,8 @@ msgstr[1] "Licensoverholdelse registrerede %d overtrædelser af licenser og rege
msgid "LicenseCompliance|License Compliance detected %d license and policy violation for the source branch only; approval required"
msgid_plural "LicenseCompliance|License Compliance detected %d licenses and policy violations for the source branch only; approval required"
-msgstr[0] "Licensoverholdelse registrerede %d overtrædelse af licens og regelsæt kun for kildegrenen; kræver godkendelse"
-msgstr[1] "Licensoverholdelse registrerede %d overtrædelse af licenser og regelsæt kun for kildegrenen; kræver godkendelse"
+msgstr[0] "Licensoverholdelse registrerede %d overtrædelse af licens og regelsæt kun for kildegrenen, kræver godkendelse"
+msgstr[1] "Licensoverholdelse registrerede %d overtrædelse af licenser og regelsæt kun for kildegrenen, kræver godkendelse"
msgid "LicenseCompliance|License Compliance detected %d license for the source branch only"
msgid_plural "LicenseCompliance|License Compliance detected %d licenses for the source branch only"
@@ -19999,8 +20310,8 @@ msgstr[1] "Licensoverholdelse registrerede %d nye overtrædelser af licenser og
msgid "LicenseCompliance|License Compliance detected %d new license and policy violation; approval required"
msgid_plural "LicenseCompliance|License Compliance detected %d new licenses and policy violations; approval required"
-msgstr[0] "Licensoverholdelse registrerede %d ny overtrædelse af licens og regelsæt; kræver godkendelse"
-msgstr[1] "Licensoverholdelse registrerede %d nye overtrædelser af licenser og regelsæt; kræver godkendelse"
+msgstr[0] "Licensoverholdelse registrerede %d ny overtrædelse af licens og regelsæt, kræver godkendelse"
+msgstr[1] "Licensoverholdelse registrerede %d nye overtrædelser af licenser og regelsæt, kræver godkendelse"
msgid "LicenseCompliance|License Compliance detected no licenses for the source branch only"
msgstr "Licensoverholdelse registrerede ingen licenser kun for kildegrenen"
@@ -20033,14 +20344,17 @@ msgid "LicenseManagement|Allowed"
msgstr "Tilladt"
msgid "LicenseManagement|Denied"
-msgstr ""
+msgstr "Afvist"
msgid "LicenseManagement|Uncategorized"
msgstr ""
-msgid "Licensed Features"
+msgid "Licensed Enterprise Edition features can be used if the project namespace's plan includes the feature, or if the project is public."
msgstr ""
+msgid "Licensed Features"
+msgstr "Licenserede funktioner"
+
msgid "Licensed to:"
msgstr "Licenseret til:"
@@ -20060,7 +20374,7 @@ msgid "Licenses|Components"
msgstr "Komponenter"
msgid "Licenses|Detected in Project"
-msgstr ""
+msgstr "Tegistreret i projekt"
msgid "Licenses|Detected licenses that are out-of-compliance with the project's assigned policies"
msgstr ""
@@ -20072,7 +20386,7 @@ msgid "Licenses|Displays licenses detected in the project, based on the %{linkSt
msgstr ""
msgid "Licenses|Error fetching the license list. Please check your network connection and try again."
-msgstr ""
+msgstr "Fejl ved hentning af licenslisten. Tjek venligst din netværksforbindelse og prøv igen."
msgid "Licenses|License Compliance"
msgstr "Licensoverholdelse"
@@ -20090,7 +20404,7 @@ msgid "Licenses|Policy violation: denied"
msgstr ""
msgid "Licenses|Specified policies in this project"
-msgstr ""
+msgstr "Angivne regelsæt i projektet"
msgid "Licenses|The license list details information about the licenses used within your project."
msgstr ""
@@ -20104,7 +20418,10 @@ msgstr ""
msgid "Limit namespaces and projects that can be indexed"
msgstr ""
-msgid "Limit sign in from multiple ips"
+msgid "Limit project size at a global, group, and project level. %{link_start}Learn more%{link_end}."
+msgstr ""
+
+msgid "Limit sign in from multiple IP addresses"
msgstr ""
msgid "Limit the number of concurrent operations this secondary site can run in the background."
@@ -20116,14 +20433,20 @@ msgstr ""
msgid "Limit the number of issues and epics per minute a user can create through web and API requests."
msgstr ""
+msgid "Limit the size of Sidekiq jobs stored in Redis."
+msgstr ""
+
msgid "Limited to showing %d event at most"
msgid_plural "Limited to showing %d events at most"
msgstr[0] ""
msgstr[1] ""
-msgid "Line changes"
+msgid "Limiting mode"
msgstr ""
+msgid "Line changes"
+msgstr "Linjeændringer"
+
msgid "Link"
msgstr "Link"
@@ -20134,7 +20457,7 @@ msgid "Link Sentry to GitLab to discover and view the errors your application ge
msgstr ""
msgid "Link URL"
-msgstr ""
+msgstr "Link-URL"
msgid "Link an external wiki from the project's sidebar. %{docs_link}"
msgstr ""
@@ -20143,10 +20466,10 @@ msgid "Link copied"
msgstr "Link kopieret"
msgid "Link text"
-msgstr ""
+msgstr "Linktekst"
msgid "Link title"
-msgstr ""
+msgstr "Linktitel"
msgid "Link title is required"
msgstr "Linktitel kræves"
@@ -20161,10 +20484,10 @@ msgid "Link to your Grafana instance."
msgstr "Link til din Grafana-instans."
msgid "Linked emails (%{email_count})"
-msgstr ""
+msgstr "Linkede e-mails (%{email_count})"
msgid "Linked issues"
-msgstr ""
+msgstr "Linkede problemstillinger"
msgid "LinkedIn"
msgstr "LinkedIn"
@@ -20188,13 +20511,10 @@ msgid "List available repositories"
msgstr ""
msgid "List of all merge commits"
-msgstr ""
-
-msgid "List of users to be excluded from the limit"
-msgstr ""
+msgstr "Liste over alle sammenlægningscommits"
msgid "List options"
-msgstr ""
+msgstr "Valgmuligheder for lister"
msgid "List settings"
msgstr ""
@@ -20230,16 +20550,13 @@ msgid "Loading files, directories, and submodules in the path %{path} for commit
msgstr ""
msgid "Loading functions timed out. Please reload the page to try again."
-msgstr ""
-
-msgid "Loading issues"
-msgstr "Indlæser problemstillinger"
+msgstr "Indlæsning af funktioner fik timeout. Genindlæs venligst siden for at prøve igen."
msgid "Loading more"
-msgstr ""
+msgstr "Indlæser mere"
msgid "Loading snippet"
-msgstr "Indlæser uddrag"
+msgstr "Indlæser udklip"
msgid "Loading the GitLab IDE..."
msgstr ""
@@ -20254,7 +20571,7 @@ msgid "Local IP addresses and domain names that hooks and services may access."
msgstr ""
msgid "Localization"
-msgstr "Oversættelse"
+msgstr "Lokalisering"
msgid "Location"
msgstr "Placering"
@@ -20278,7 +20595,7 @@ msgid "Lock the discussion"
msgstr "LÃ¥s debatten"
msgid "Lock this %{issuableDisplayName}? Only %{strongStart}project members%{strongEnd} will be able to comment."
-msgstr ""
+msgstr "Lås denne %{issuableDisplayName}? Kun %{strongStart}projektmedlemmer%{strongEnd} vil være i stand til at kommentere."
msgid "Lock to current projects"
msgstr "Lås til nuværende projekter"
@@ -20299,7 +20616,7 @@ msgid "Locked to current projects"
msgstr "Låst til nuværende projekter"
msgid "Locks give the ability to lock specific file or folder."
-msgstr ""
+msgstr "Låse gør det muligt at låse en bestemte fil eller mappe."
msgid "Locks the discussion."
msgstr "LÃ¥ser debatten."
@@ -20308,7 +20625,7 @@ msgid "Login with smartcard"
msgstr ""
msgid "Logo was successfully removed."
-msgstr ""
+msgstr "Logo blev fjernet."
msgid "Logo will be removed. Are you sure?"
msgstr "Logo fjernes. Er du sikker?"
@@ -20332,7 +20649,7 @@ msgid "MERGED"
msgstr "SAMMENLAGT"
msgid "MR widget|Back to the Merge request"
-msgstr ""
+msgstr "Tilbage til sammenlægningsanmodningen"
msgid "MR widget|See your pipeline in action"
msgstr ""
@@ -20344,13 +20661,13 @@ msgid "MR widget|The pipeline will test your code on every commit. A %{codeQuali
msgstr ""
msgid "MRApprovals|Approvals"
-msgstr ""
+msgstr "Godkendelser"
msgid "MRApprovals|Approved by"
-msgstr ""
+msgstr "Godkendt af"
msgid "MRApprovals|Approvers"
-msgstr ""
+msgstr "Godkendere"
msgid "MRApprovals|Commented by"
msgstr "Kommenteret af"
@@ -20359,7 +20676,7 @@ msgid "MRDiffFile|Changes are too large to be shown."
msgstr ""
msgid "MRDiffFile|View file @ %{commitSha}"
-msgstr ""
+msgstr "Vis fil @ %{commitSha}"
msgid "MRDiff|Show changes only"
msgstr "Vis kun ændringer"
@@ -20368,16 +20685,16 @@ msgid "MRDiff|Show full file"
msgstr ""
msgid "Made this issue confidential."
-msgstr ""
+msgstr "Gjorde problemstillingen fortrolig."
msgid "Mailgun"
-msgstr ""
+msgstr "Mailgun"
msgid "Mailgun HTTP webhook signing key"
msgstr ""
msgid "Mailgun events"
-msgstr ""
+msgstr "Mailgun-begivenheder"
msgid "Maintenance mode"
msgstr "Vedligeholdelsestilstand"
@@ -20389,13 +20706,13 @@ msgid "Make everyone on your team more productive regardless of their location.
msgstr ""
msgid "Make issue confidential"
-msgstr ""
+msgstr "Gør problemstilling fortrolig"
msgid "Make sure you save it - you won't be able to access it again."
msgstr ""
msgid "Makes this issue confidential."
-msgstr ""
+msgstr "Gør problemstillingen fortrolig."
msgid "Manage Web IDE features."
msgstr "HÃ¥ndter Web IDE-funktioner."
@@ -20404,7 +20721,7 @@ msgid "Manage access"
msgstr "HÃ¥ndter adgang"
msgid "Manage all notifications"
-msgstr ""
+msgstr "HÃ¥ndter alle underretninger"
msgid "Manage applications that can use GitLab as an OAuth provider, and applications that you've authorized to use your account."
msgstr ""
@@ -20416,7 +20733,7 @@ msgid "Manage applications that you've authorized to use your account."
msgstr ""
msgid "Manage git repositories with fine-grained access controls that keep your code secure."
-msgstr ""
+msgstr "HÃ¥ndter git-depoter med finkornede adgangsstyringer der holder din kode sikker."
msgid "Manage group labels"
msgstr "HÃ¥ndter gruppeetiketter"
@@ -20434,7 +20751,7 @@ msgid "Manage projects."
msgstr "HÃ¥ndter projekter."
msgid "Manage two-factor authentication"
-msgstr "HÃ¥ndter tofaktorgodkendelse"
+msgstr "HÃ¥ndter totrinsgodkendelse"
msgid "Manage your license"
msgstr "HÃ¥ndter din licens"
@@ -20443,7 +20760,7 @@ msgid "Manage your project's triggers"
msgstr "Håndter dit projekts udløsere"
msgid "Managed Account"
-msgstr ""
+msgstr "HÃ¥ndteret konto"
msgid "Manifest"
msgstr "Manifest"
@@ -20452,10 +20769,10 @@ msgid "Manifest file import"
msgstr ""
msgid "Manifest import"
-msgstr ""
+msgstr "Manifest-import"
msgid "Manual"
-msgstr ""
+msgstr "Manuelt"
msgid "ManualOrdering|Couldn't save the order of the issues"
msgstr ""
@@ -20482,13 +20799,13 @@ msgid "Mark as ready"
msgstr "Mærk som klar"
msgid "Mark this issue as a duplicate of another issue"
-msgstr ""
+msgstr "Mærk problemstillingen som et duplikat af en anden problemstilling"
msgid "Mark this issue as related to another issue"
-msgstr ""
+msgstr "Mærk problemstillingen som relateret til en anden problemstilling"
msgid "Mark to do as done"
-msgstr "Mærk to do som færdig"
+msgstr "Mærk gøremål som færdig"
msgid "Markdown"
msgstr "Markdown"
@@ -20506,49 +20823,52 @@ msgid "Markdown supported."
msgstr "Markdown understøttes."
msgid "MarkdownEditor|Add a link (%{modifierKey}K)"
-msgstr ""
+msgstr "Tilføj et link (%{modifierKey}K)"
msgid "MarkdownEditor|Add a link (%{modifier_key}K)"
-msgstr ""
+msgstr "Tilføj et link (%{modifier_key}K)"
msgid "MarkdownEditor|Add bold text (%{modifierKey}B)"
-msgstr ""
+msgstr "Tilføj fed tekst (%{modifierKey}B)"
msgid "MarkdownEditor|Add bold text (%{modifier_key}B)"
-msgstr ""
+msgstr "Tilføj fed tekst (%{modifier_key}B)"
msgid "MarkdownEditor|Add italic text (%{modifierKey}I)"
-msgstr ""
+msgstr "Tilføj kursiv tekst (%{modifierKey}I)"
msgid "MarkdownEditor|Add italic text (%{modifier_key}I)"
-msgstr ""
+msgstr "Tilføj kursiv tekst (%{modifier_key}I)"
msgid "Marked For Deletion At - %{deletion_time}"
msgstr ""
+msgid "Marked as ready. Merging is now allowed."
+msgstr ""
+
msgid "Marked this %{noun} as a draft."
msgstr ""
msgid "Marked this issue as a duplicate of %{duplicate_param}."
-msgstr ""
+msgstr "Mærkede problemstillingen som et duplikat af %{duplicate_param}."
msgid "Marked this issue as related to %{issue_ref}."
-msgstr ""
+msgstr "Mærkede problemstillingen som relateret til %{issue_ref}."
msgid "Marked to do as done."
-msgstr "Mærkede to do som færdig."
+msgstr "Mærkede gøremål som færdig."
msgid "Marks this %{noun} as a draft."
msgstr ""
msgid "Marks this issue as a duplicate of %{duplicate_reference}."
-msgstr ""
+msgstr "Mærker problemstillingen som et duplikat af %{duplicate_reference}."
msgid "Marks this issue as related to %{issue_ref}."
-msgstr ""
+msgstr "Mærker problemstillingen som relateret til %{issue_ref}."
msgid "Marks to do as done."
-msgstr "Mærker to do som færdig."
+msgstr "Mærker gøremål som færdig."
msgid "Mask variable"
msgstr ""
@@ -20560,13 +20880,13 @@ msgid "Mattermost"
msgstr "Mattermost"
msgid "Mattermost URL:"
-msgstr ""
+msgstr "Mattermost-URL:"
msgid "Mattermost notifications"
-msgstr ""
+msgstr "Mattermost-underretninger"
msgid "MattermostService|Add to Mattermost"
-msgstr ""
+msgstr "Tilføj til Mattermost"
msgid "MattermostService|After you configure the integration, view your new Mattermost commands by entering"
msgstr ""
@@ -20596,54 +20916,24 @@ msgid "MattermostService|Use this service to perform common tasks in your projec
msgstr ""
msgid "Max 100,000 events"
-msgstr ""
-
-msgid "Max 20 characters"
-msgstr "Maks. 20 tegn"
-
-msgid "Max Group Export Download requests per minute per user"
-msgstr ""
-
-msgid "Max Group Export requests per minute per user"
-msgstr ""
-
-msgid "Max Group Import requests per minute per user"
-msgstr ""
-
-msgid "Max Project Export Download requests per minute per user"
-msgstr ""
-
-msgid "Max Project Export requests per minute per user"
-msgstr ""
-
-msgid "Max Project Import requests per minute per user"
-msgstr ""
-
-msgid "Max authenticated API requests per period per user"
-msgstr ""
+msgstr "Maks. 100.000 begivenheder"
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
-msgid "Max authenticated web requests per period per user"
-msgstr ""
-
msgid "Max file size is 200 KB."
msgstr "Maks. filstørrelse er 200 KB."
-msgid "Max requests per minute per user"
-msgstr ""
-
msgid "Max role"
-msgstr ""
+msgstr "Maks. rolle"
msgid "Max session time"
msgstr ""
-msgid "Max unauthenticated requests per period per IP"
-msgstr ""
-
msgid "MaxBuilds"
+msgstr "MaxBuilds"
+
+msgid "Maximum 20 characters"
msgstr ""
msgid "Maximum Conan package file size in bytes"
@@ -20668,15 +20958,21 @@ msgid "Maximum allowable lifetime for personal access token (days)"
msgstr ""
msgid "Maximum artifacts size"
-msgstr "Maksimal størrelse for artefakter"
+msgstr "Maksimale størrelse for artefakter"
msgid "Maximum artifacts size (MB)"
-msgstr "Maksimal størrelse for artefakter (MB)"
+msgstr "Maksimale størrelse for artefakter (MB)"
msgid "Maximum attachment size"
-msgstr ""
+msgstr "Maksimale størrelse på vedhæftning"
msgid "Maximum attachment size (MB)"
+msgstr "Maksimale størrelse på vedhæftning (MB)"
+
+msgid "Maximum authenticated API requests per rate limit period per user"
+msgstr ""
+
+msgid "Maximum authenticated web requests per rate limit period per user"
msgstr ""
msgid "Maximum bulk request size (MiB)"
@@ -20686,7 +20982,7 @@ msgid "Maximum capacity"
msgstr ""
msgid "Maximum character limit - %{limit}"
-msgstr ""
+msgstr "Maksimum tegngrænse - %{limit}"
msgid "Maximum concurrency of Elasticsearch bulk requests per indexing operation."
msgstr ""
@@ -20695,10 +20991,10 @@ msgid "Maximum delay (Minutes)"
msgstr ""
msgid "Maximum diff patch size"
-msgstr ""
+msgstr "Maksimale størrelse på diff-patch"
msgid "Maximum diff patch size (Bytes)"
-msgstr ""
+msgstr "Maksimale størrelse på diff-patch (byte)"
msgid "Maximum duration of a session."
msgstr ""
@@ -20707,31 +21003,40 @@ msgid "Maximum field length"
msgstr ""
msgid "Maximum file size indexed (KiB)"
-msgstr ""
+msgstr "Maksimale filstørrelse indekseret (KiB)"
msgid "Maximum file size is 1 MB. Image size must be 32 x 32 pixels. Allowed image formats are %{favicon_extension_whitelist}."
-msgstr ""
+msgstr "Den maksimale filstørrelse er 1 MB. Billedstørrelsen skal være 32 x 32 pixels. Tilladte billedformater er %{favicon_extension_whitelist}."
msgid "Maximum file size is 1MB. Pages are optimized for a 28px tall header logo"
-msgstr ""
+msgstr "Maksimale filstørrelse er 1 MB. Pages er optimeret til et headerlogo med en højde på 28px"
msgid "Maximum file size is 1MB. Pages are optimized for a 640x360 px logo."
-msgstr ""
+msgstr "Maksimale filstørrelse er 1 MB. Pages er optimeret til et logo på 640x360 px."
msgid "Maximum file size is 2MB. Please select a smaller file."
-msgstr ""
+msgstr "Maksimale filstørrelse er 2 MB. Vælg venligst en mindre fil."
msgid "Maximum files in a diff"
+msgstr "Maksimale filer i en diff"
+
+msgid "Maximum group export download requests per minute"
msgstr ""
-msgid "Maximum import size"
+msgid "Maximum group export requests per minute"
msgstr ""
-msgid "Maximum import size (MB)"
+msgid "Maximum group import requests per minute"
msgstr ""
+msgid "Maximum import size"
+msgstr "Maksimale størrelse på import"
+
+msgid "Maximum import size (MB)"
+msgstr "Maksimale størrelse på import (MB)"
+
msgid "Maximum job artifact size"
-msgstr ""
+msgstr "Maksimale størrelse på jobartefakt"
msgid "Maximum job timeout"
msgstr ""
@@ -20743,7 +21048,7 @@ msgid "Maximum lifetime allowable for Personal Access Tokens is active, your exp
msgstr ""
msgid "Maximum lines in a diff"
-msgstr ""
+msgstr "Maksimale linjer i en diff"
msgid "Maximum npm package file size in bytes"
msgstr "Maksimale filstørrelse for npm-pakke i byte"
@@ -20760,52 +21065,70 @@ msgstr ""
msgid "Maximum number of projects."
msgstr ""
-msgid "Maximum number of unique IPs per user"
+msgid "Maximum number of unique IP addresses per user."
msgstr ""
msgid "Maximum page reached"
msgstr ""
msgid "Maximum page size"
+msgstr "Maksimale størrelse på side"
+
+msgid "Maximum project export download requests per minute"
msgstr ""
-msgid "Maximum push size"
+msgid "Maximum project export requests per minute"
msgstr ""
+msgid "Maximum project import requests per minute"
+msgstr ""
+
+msgid "Maximum push size"
+msgstr "Maksimale størrelse på push"
+
msgid "Maximum push size (MB)"
+msgstr "Maksimale størrelse på push (MB)"
+
+msgid "Maximum requests per minute"
msgstr ""
msgid "Maximum running slices"
msgstr ""
msgid "Maximum size limit for a single commit."
-msgstr ""
+msgstr "Maksimale størrelsesgrænse for en enkelt commit."
msgid "Maximum size limit for each repository."
-msgstr ""
+msgstr "Maksimale størrelsesgrænse for hvert depot."
msgid "Maximum size of Elasticsearch bulk indexing requests."
msgstr ""
msgid "Maximum size of import files."
-msgstr ""
+msgstr "Maksimale størrelse på importfiler."
msgid "Maximum size of individual attachments in comments."
-msgstr ""
+msgstr "Maksimale størrelse på individuelle vedhæftninger i kommentarer."
msgid "Maximum size of pages (MB)"
-msgstr ""
+msgstr "Maksimale størrelse på sider (MB)"
msgid "Maximum snippet size"
-msgstr ""
+msgstr "Maksimale størrelse på udklip"
msgid "Maximum time between updates that a mirror can have when scheduled to synchronize."
msgstr ""
-msgid "Maximum time for web terminal websocket connection (in seconds). 0 for unlimited."
+msgid "Maximum time that users are allowed to skip the setup of two-factor authentication (in hours). Set to 0 (zero) to enforce at next sign in."
msgstr ""
-msgid "Maximum time that users are allowed to skip the setup of two-factor authentication (in hours). Set to 0 (zero) to enforce at next sign in."
+msgid "Maximum time, in seconds, for a web terminal websocket connection. 0 for unlimited."
+msgstr ""
+
+msgid "Maximum unauthenticated API requests per rate limit period per IP"
+msgstr ""
+
+msgid "Maximum unauthenticated web requests per rate limit period per IP"
msgstr ""
msgid "May"
@@ -20823,9 +21146,6 @@ msgstr ""
msgid "Medium vulnerabilities present"
msgstr ""
-msgid "Member lock"
-msgstr "Medlemslås"
-
msgid "Member since"
msgstr "Medlem siden"
@@ -20836,13 +21156,13 @@ msgid "Member since:"
msgstr "Medlem siden:"
msgid "MemberInviteEmail|%{member_name} invited you to join GitLab"
-msgstr ""
+msgstr "%{member_name} inviterede dig til at deltage i GitLab"
msgid "MemberInviteEmail|I've invited you to join me in GitLab"
msgstr ""
msgid "MemberInviteEmail|Invitation to join the %{project_or_group} %{project_or_group_name}"
-msgstr ""
+msgstr "Invitation til at deltage i %{project_or_group} %{project_or_group_name}"
msgid "Members"
msgstr "Medlemmer"
@@ -20862,6 +21182,9 @@ msgstr ""
msgid "Members of a group may only view projects they have permission to access"
msgstr ""
+msgid "Membership"
+msgstr ""
+
msgid "Members|%{time} by %{user}"
msgstr "%{time} af %{user}"
@@ -20869,22 +21192,22 @@ msgid "Members|%{userName} is currently an LDAP user. Editing their permissions
msgstr ""
msgid "Members|2FA"
-msgstr "2FG"
+msgstr "2TG"
msgid "Members|An error occurred while trying to enable LDAP override, please try again."
-msgstr ""
+msgstr "Der opstod en fejl under forsøg på at aktivere LDAP-tilsidesættelse. Prøv venligst igen."
msgid "Members|An error occurred while trying to revert to LDAP group sync settings, please try again."
-msgstr ""
+msgstr "Der opstod en fejl under forsøg på at tilbageføre til LDAP-gruppesynkroniseringsindstillinger. Prøv venligst igen."
msgid "Members|An error occurred while updating the member's expiration date, please try again."
-msgstr ""
+msgstr "Der opstod en fejl under opdatering af medlemmets udløbsdato. Prøv venligst igen."
msgid "Members|An error occurred while updating the member's role, please try again."
-msgstr ""
+msgstr "Der opstod en fejl under opdatering af medlemmets rolle. Prøv venligst igen."
msgid "Members|Are you sure you want to deny %{usersName}'s request to join \"%{source}\""
-msgstr ""
+msgstr "Er du sikker på, at du vil afvise %{usersName}s anmodning om at deltage i \"%{source}\""
msgid "Members|Are you sure you want to leave \"%{source}\"?"
msgstr "Er du sikker på, at du vil forlade \"%{source}\"?"
@@ -20896,10 +21219,10 @@ 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 this orphaned member from \"%{source}\"?"
-msgstr ""
+msgstr "Er du sikker på, at du vil fjerne det forældreløse medlem fra \"%{source}\"?"
msgid "Members|Are you sure you want to revoke the invitation for %{inviteEmail} to join \"%{source}\""
-msgstr ""
+msgstr "Er du sikker på, at du vil tilbagekalde invitationen til %{inviteEmail} om at deltage i \"%{source}\""
msgid "Members|Are you sure you want to withdraw your access request for \"%{source}\""
msgstr ""
@@ -20922,14 +21245,11 @@ msgstr ""
msgid "Members|Expiration date updated successfully."
msgstr ""
-msgid "Members|Expired"
-msgstr "Udløbet"
-
msgid "Members|Filter members"
msgstr "Filtrér medlemmer"
msgid "Members|Inherited"
-msgstr ""
+msgstr "Nedarvet"
msgid "Members|LDAP override enabled."
msgstr ""
@@ -20940,9 +21260,6 @@ msgstr "Forlad \"%{source}\""
msgid "Members|Membership"
msgstr "Medlemskab"
-msgid "Members|No expiration set"
-msgstr ""
-
msgid "Members|Remove \"%{groupName}\""
msgstr "Fjern \"%{groupName}\""
@@ -20964,11 +21281,8 @@ msgstr ""
msgid "Members|Search invited"
msgstr ""
-msgid "Members|in %{time}"
-msgstr ""
-
msgid "Member|Deny access"
-msgstr ""
+msgstr "Afvis adgang"
msgid "Member|Remove member"
msgstr "Fjern medlem"
@@ -20986,43 +21300,43 @@ msgid "Merge"
msgstr "Sammenlæg"
msgid "Merge Conflicts"
-msgstr ""
+msgstr "Sammenlægningskonflikter"
msgid "Merge Request"
msgstr "Sammenlægningsanmodning"
msgid "Merge Request Analytics"
-msgstr ""
+msgstr "Sammenlægningsanalyse"
msgid "Merge Requests"
-msgstr ""
+msgstr "Sammenlægningsanmodninger"
msgid "Merge Requests created"
-msgstr ""
+msgstr "Sammenlægningsanmodninger oprettet"
msgid "Merge Requests in Review"
-msgstr ""
+msgstr "Sammenlægningsanmodninger i kontrol"
msgid "Merge Requests merged"
-msgstr ""
+msgstr "Sammenlægningsanmodninger sammenlagt"
msgid "Merge automatically (%{strategy})"
-msgstr ""
+msgstr "Sammenlæg automatisk (%{strategy})"
msgid "Merge blocked: new changes were just added."
-msgstr ""
+msgstr "Sammenlægning blokeret: nye ændringer blev netop tilføjet."
msgid "Merge blocked: the source branch must be rebased onto the target branch."
msgstr ""
msgid "Merge commit SHA"
-msgstr ""
+msgstr "Sammenlægningscommit-SHA"
msgid "Merge commit message"
-msgstr "Sammenlæg commit-meddelelse"
+msgstr "Sammenlægningscommit-meddelelse"
msgid "Merge events"
-msgstr ""
+msgstr "Sammenlægningsbegivenheder"
msgid "Merge immediately"
msgstr "Sammenlæg straks"
@@ -21034,19 +21348,16 @@ msgid "Merge locally"
msgstr "Sammenlæg lokalt"
msgid "Merge options"
-msgstr ""
+msgstr "Valgmuligheder for sammenlægning"
msgid "Merge request"
msgstr "Sammenlægningsanmodning"
msgid "Merge request %{mr_link} was reviewed by %{mr_author}"
-msgstr ""
-
-msgid "Merge request (MR) approvals"
-msgstr ""
+msgstr "Sammenlægningsanmodningen %{mr_link} blev kontrolleret af %{mr_author}"
msgid "Merge request analytics"
-msgstr ""
+msgstr "Sammenlægningsanalyse"
msgid "Merge request approvals"
msgstr ""
@@ -21066,26 +21377,35 @@ msgstr ""
msgid "Merge requests"
msgstr "Sammenlægningsanmodninger"
+msgid "Merge requests I've created"
+msgstr ""
+
msgid "Merge requests are a place to propose changes you've made to a project and discuss those changes with others"
msgstr ""
msgid "Merge requests are read-only in a secondary Geo node"
msgstr ""
+msgid "Merge requests assigned to me"
+msgstr ""
+
+msgid "Merge requests that I'm a reviewer"
+msgstr ""
+
msgid "Merge the branch and fix any conflicts that come up"
msgstr ""
msgid "Merge when pipeline succeeds"
-msgstr ""
+msgstr "Sammenlæg når pipeline lykkes"
msgid "MergeConflict|Commit to source branch"
-msgstr ""
+msgstr "Commit til kildegren"
msgid "MergeConflict|Committing..."
msgstr ""
msgid "MergeConflict|HEAD//our changes"
-msgstr ""
+msgstr "HEAD//vores ændringer"
msgid "MergeConflict|Use ours"
msgstr "Brug vores"
@@ -21100,10 +21420,10 @@ msgid "MergeConflict|conflicts"
msgstr "konflikter"
msgid "MergeConflict|origin//their changes"
-msgstr ""
+msgstr "origin//deres ændringer"
msgid "MergeRequestAnalytics|Assignees"
-msgstr ""
+msgstr "Tildelere"
msgid "MergeRequestAnalytics|Date Merged"
msgstr ""
@@ -21112,13 +21432,13 @@ msgid "MergeRequestAnalytics|Line changes"
msgstr ""
msgid "MergeRequestAnalytics|Merge Request"
-msgstr ""
+msgstr "Sammenlægningsanmodning"
msgid "MergeRequestAnalytics|Milestone"
msgstr "Milepæl"
msgid "MergeRequestAnalytics|Pipelines"
-msgstr ""
+msgstr "Pipelines"
msgid "MergeRequestAnalytics|Time to merge"
msgstr ""
@@ -21130,28 +21450,28 @@ msgid "MergeRequestDiffs|Select comment starting line"
msgstr ""
msgid "MergeRequests|An error occurred while saving the draft comment."
-msgstr ""
+msgstr "Der opstod en fejl under gemning af kladdekommentaren."
-msgid "MergeRequests|Failed to squash. Should be done manually."
+msgid "MergeRequests|Create issue to resolve thread"
msgstr ""
-msgid "MergeRequests|Resolve this thread in a new issue"
-msgstr ""
+msgid "MergeRequests|Failed to squash. Should be done manually."
+msgstr "Kunne ikke squash. Skal gøres manuelt."
msgid "MergeRequests|Saving the comment failed"
-msgstr ""
+msgstr "Kunne ikke gemme kommentaren"
msgid "MergeRequests|This project does not allow squashing commits when merge requests are accepted."
msgstr ""
msgid "MergeRequests|Thread stays resolved"
-msgstr ""
+msgstr "Tråd forbliver løst"
msgid "MergeRequests|Thread stays unresolved"
-msgstr ""
+msgstr "Tråden forbliver uløst"
msgid "MergeRequests|Thread will be resolved"
-msgstr ""
+msgstr "Tråd vil forblive løst"
msgid "MergeRequests|Thread will be unresolved"
msgstr ""
@@ -21163,34 +21483,34 @@ msgid "MergeRequests|View replaced file @ %{commitId}"
msgstr "Vis erstattet fil @ %{commitId}"
msgid "MergeRequests|commented on commit %{commitLink}"
-msgstr ""
+msgstr "kommenterede på commiten %{commitLink}"
msgid "MergeRequests|started a thread"
msgstr "startede en tråd"
msgid "MergeRequests|started a thread on %{linkStart}an old version of the diff%{linkEnd}"
-msgstr ""
+msgstr "startede en tråd på %{linkStart}en gammel version af diff'en%{linkEnd}"
msgid "MergeRequests|started a thread on %{linkStart}the diff%{linkEnd}"
-msgstr ""
+msgstr "startede en tråd på %{linkStart}diff'en%{linkEnd}"
msgid "MergeRequests|started a thread on an outdated change in commit %{linkStart}%{commitDisplay}%{linkEnd}"
-msgstr ""
+msgstr "startede en tråd på en forældet ændring i committen %{linkStart}%{commitDisplay}%{linkEnd}"
msgid "MergeRequests|started a thread on commit %{linkStart}%{commitDisplay}%{linkEnd}"
-msgstr ""
+msgstr "startede en tråd på committen %{linkStart}%{commitDisplay}%{linkEnd}"
msgid "MergeRequest|Approved by @%{username}"
-msgstr ""
+msgstr "Godkendt af @%{username}"
msgid "MergeRequest|Compare %{target} and %{source}"
-msgstr ""
+msgstr "Sammenlign %{target} og %{source}"
msgid "MergeRequest|Error dismissing suggestion popover. Please try again."
-msgstr ""
+msgstr "Fejl ved afskedigelse af popover med forslag. Prøv venligst igen."
msgid "MergeRequest|Error loading full diff. Please try again."
-msgstr ""
+msgstr "Fejl ved indlæsning af hele diff'en. Prøv venligst igen."
msgid "MergeRequest|No files found"
msgstr "Ingen filer fundet"
@@ -21202,22 +21522,22 @@ msgid "Merged"
msgstr "Sammenlagt"
msgid "Merged MRs"
-msgstr ""
+msgstr "Sammenlagte sammenlægningsanmodninger"
msgid "Merged branches are being deleted. This can take some time depending on the number of branches. Please refresh the page to see changes."
-msgstr ""
+msgstr "Sammenlagte grene er ved at blive slettet. Det kan tage noget tid afhængig af antallet af grene. Opdater venligst siden for at se ændringerne."
msgid "Merged by"
msgstr "Sammenlagt af"
msgid "Merged this merge request."
-msgstr ""
+msgstr "Sammenlagde sammenlægningsanmodningen."
msgid "Merged: %{merged}"
-msgstr ""
+msgstr "Sammenlagt: %{merged}"
msgid "Merges this merge request immediately."
-msgstr ""
+msgstr "Sammenlægger straks sammenlægningsanmodningen."
msgid "Merging immediately isn't recommended as it may negatively impact the existing merge train. Read the %{docsLinkStart}documentation%{docsLinkEnd} for more information."
msgstr ""
@@ -21244,16 +21564,16 @@ msgid "Metric:"
msgstr "MÃ¥ling:"
msgid "MetricChart|Please select a metric"
-msgstr ""
+msgstr "Vælg venligst en måling"
msgid "MetricChart|Selected"
msgstr ""
msgid "MetricChart|There is no data available. Please change your selection."
-msgstr ""
+msgstr "Der er ingen data tilgængelig. Ændr venligst din markering."
msgid "MetricChart|There is too much data to calculate. Please change your selection."
-msgstr ""
+msgstr "Der er for meget data at udregne. Ændr venligst din markering."
msgid "Metrics"
msgstr "MÃ¥linger"
@@ -21262,49 +21582,49 @@ msgid "Metrics - Grafana"
msgstr "MÃ¥linger - Grafana"
msgid "Metrics - Prometheus"
-msgstr ""
+msgstr "MÃ¥linger - Prometheus"
msgid "Metrics Dashboard"
-msgstr ""
+msgstr "MÃ¥lingsbetjeningspanel"
msgid "Metrics Dashboard YAML definition"
-msgstr ""
+msgstr "YAML-definition for målingsbetjeningspanel"
msgid "Metrics Dashboard YAML definition is invalid:"
-msgstr ""
+msgstr "YAML-definition for målingsbetjeningspanel er ugyldig:"
msgid "Metrics Dashboard YAML definition is valid."
-msgstr ""
+msgstr "YAML-definition for målingsbetjeningspanel er gyldig."
msgid "Metrics and profiling"
msgstr ""
msgid "Metrics::Dashboard::Annotation|Annotation can't belong to both a cluster and an environment at the same time"
-msgstr ""
+msgstr "Annotering må ikke både tilhøre en klynge og et miljø på samme tid"
msgid "Metrics::Dashboard::Annotation|Annotation has not been deleted"
-msgstr ""
+msgstr "Annotering er ikke blevet slettet"
msgid "Metrics::Dashboard::Annotation|Annotation must belong to a cluster or an environment"
-msgstr ""
+msgstr "Annotering skal tilhøre en klynge eller et miljø"
msgid "Metrics::Dashboard::Annotation|Dashboard with requested path can not be found"
-msgstr ""
+msgstr "Kan ikke finde betjeningspanel med anmodningssti"
msgid "Metrics::Dashboard::Annotation|You are not authorized to create annotation for selected cluster"
-msgstr ""
+msgstr "Du har ikke tilladelse til at oprette annotering for den valgte klynge"
msgid "Metrics::Dashboard::Annotation|You are not authorized to create annotation for selected environment"
-msgstr ""
+msgstr "Du har ikke tilladelse til at oprette annotering for det valgte miljø"
msgid "Metrics::Dashboard::Annotation|You are not authorized to delete this annotation"
-msgstr ""
+msgstr "Du har ikke tilladelse til at slette annoteringen"
msgid "Metrics::Dashboard::Annotation|can't be before starting_at time"
-msgstr ""
+msgstr "må ikke være før starting_at-tiden"
msgid "Metrics::UsersStarredDashboards|Dashboard with requested path can not be found"
-msgstr ""
+msgstr "Kan ikke finde betjeningspanel med anmodningssti"
msgid "Metrics::UsersStarredDashboards|You are not authorized to add star to this dashboard"
msgstr ""
@@ -21313,7 +21633,7 @@ msgid "MetricsSettings|Add a button to the metrics dashboard linking directly to
msgstr ""
msgid "MetricsSettings|Choose whether to display dashboard metrics in UTC or the user's local timezone."
-msgstr ""
+msgstr "Vælg om betjeningspanelsmålinger skal vises i UTC eller brugerens lokale tidszone."
msgid "MetricsSettings|Dashboard timezone"
msgstr ""
@@ -21325,10 +21645,10 @@ msgid "MetricsSettings|Manage metrics dashboard settings."
msgstr ""
msgid "MetricsSettings|Metrics"
-msgstr ""
+msgstr "MÃ¥linger"
msgid "MetricsSettings|UTC (Coordinated Universal Time)"
-msgstr ""
+msgstr "UTC (Coordinated Universal Time)"
msgid "MetricsSettings|User's local timezone"
msgstr "Brugerens lokale tidszone"
@@ -21337,7 +21657,7 @@ msgid "Metrics|1. Define and preview panel"
msgstr ""
msgid "Metrics|2. Paste panel YAML into dashboard"
-msgstr ""
+msgstr "2. Indsæt panel-YAML i betjeningspanel"
msgid "Metrics|Add metric"
msgstr "Tilføj måling"
@@ -21346,7 +21666,7 @@ msgid "Metrics|Add panel"
msgstr "Tilføj panel"
msgid "Metrics|Avg"
-msgstr ""
+msgstr "Gns."
msgid "Metrics|Back to dashboard"
msgstr "Tilbage til betjeningspanel"
@@ -21367,10 +21687,10 @@ msgid "Metrics|Copy YAML"
msgstr "Kopiér YAML"
msgid "Metrics|Copy and paste the panel YAML into your dashboard YAML file."
-msgstr ""
+msgstr "Kopiér og indsæt panel-YAML'en i din betjeningspanel-YAML-fil."
msgid "Metrics|Create custom dashboard %{fileName}"
-msgstr ""
+msgstr "Opret tilpasset betjeningspanel %{fileName}"
msgid "Metrics|Create metric"
msgstr "Opret måling"
@@ -21388,7 +21708,7 @@ msgid "Metrics|Dashboard files can be found in %{codeStart}.gitlab/dashboards%{c
msgstr ""
msgid "Metrics|Define panel YAML below to preview panel."
-msgstr ""
+msgstr "Angiv panel-YAML nedenunder for at forhåndsvise panel."
msgid "Metrics|Delete metric"
msgstr "Slet måling"
@@ -21406,13 +21726,13 @@ msgid "Metrics|Duplicate dashboard"
msgstr "Dupliker betjeningspanel"
msgid "Metrics|Duplicate this dashboard to add panel or edit dashboard YAML."
-msgstr ""
+msgstr "Dupliker betjeningspanelet for at tilføje panel eller redigere betjeningspanel-YAML."
msgid "Metrics|Duplicating..."
msgstr "Duplikerer ..."
msgid "Metrics|Edit dashboard YAML"
-msgstr ""
+msgstr "Rediger betjeningspanel-YAML"
msgid "Metrics|Edit metric"
msgid_plural "Metrics|Edit metrics"
@@ -21423,7 +21743,7 @@ msgid "Metrics|Expand panel"
msgstr "Udfold panel"
msgid "Metrics|For grouping similar metrics"
-msgstr ""
+msgstr "Til gruppering af lignende målinger"
msgid "Metrics|GitLab-managed Prometheus is deprecated and %{linkStart}scheduled for removal%{linkEnd}. Following this removal, your existing alerts will continue to function as part of the new cluster integration. However, you will no longer be able to add new alerts or edit existing alerts from the metrics dashboard."
msgstr ""
@@ -21447,13 +21767,13 @@ msgid "Metrics|Manage chart links"
msgstr ""
msgid "Metrics|Max"
-msgstr ""
+msgstr "Maks."
msgid "Metrics|Metrics Settings"
msgstr ""
msgid "Metrics|Min"
-msgstr ""
+msgstr "Min."
msgid "Metrics|More actions"
msgstr "Flere handlinger"
@@ -21465,16 +21785,16 @@ msgid "Metrics|New metric"
msgstr "Ny måling"
msgid "Metrics|Open repository"
-msgstr ""
+msgstr "Ã…bn depot"
msgid "Metrics|Panel YAML"
-msgstr ""
+msgstr "Panel-YAML"
msgid "Metrics|Panel YAML copied"
-msgstr ""
+msgstr "Panel-YAML kopieret"
msgid "Metrics|Preview panel"
-msgstr ""
+msgstr "Forhåndsvis panel"
msgid "Metrics|PromQL query is valid"
msgstr ""
@@ -21495,7 +21815,7 @@ msgid "Metrics|Set refresh rate"
msgstr ""
msgid "Metrics|Star dashboard"
-msgstr ""
+msgstr "Stjernemarkér betjeningspanel"
msgid "Metrics|There was an error creating the dashboard."
msgstr "Der opstod en fejl ved oprettelse af betjeningspanelet."
@@ -21504,28 +21824,28 @@ msgid "Metrics|There was an error creating the dashboard. %{error}"
msgstr "Der opstod en fejl ved oprettelse af betjeningspanelet. %{error}"
msgid "Metrics|There was an error fetching annotations. Please try again."
-msgstr ""
+msgstr "Der opstod en fejl ved hentning af annoteringer. Prøv venligst igen."
msgid "Metrics|There was an error fetching the environments data, please try again"
-msgstr ""
+msgstr "Der opstod en fejl under hentning af miljødataene. Prøv venligst igen"
msgid "Metrics|There was an error getting annotations information."
-msgstr ""
+msgstr "Der var en fejl under hentning af annoteringsinformation."
msgid "Metrics|There was an error getting dashboard validation warnings information."
msgstr ""
msgid "Metrics|There was an error getting deployment information."
-msgstr ""
+msgstr "Der opstod en fejl under hentning af udsendelsesinformation."
msgid "Metrics|There was an error getting environments information."
-msgstr ""
+msgstr "Der opstod en fejl under hentning af miljøinformation."
msgid "Metrics|There was an error getting options for variable \"%{name}\"."
msgstr "Der opstod en fejl ved hentning af valgmuligheder for variablen \"%{name}\"."
msgid "Metrics|There was an error trying to validate your query"
-msgstr ""
+msgstr "Der opstod en fejl under forsøg på at validere din forespørgsel"
msgid "Metrics|There was an error while retrieving metrics"
msgstr "Der opstod en fejl under indhentning af målinger"
@@ -21534,10 +21854,10 @@ msgid "Metrics|There was an error while retrieving metrics. %{message}"
msgstr "Der opstod en fejl under indhentning af målinger. %{message}"
msgid "Metrics|To create a new dashboard, add a new YAML file to %{codeStart}.gitlab/dashboards%{codeEnd} at the root of this project."
-msgstr ""
+msgstr "For at oprette et ny betjeningspanel tilføjes en ny YAML-fil til %{codeStart}.gitlab/dashboards%{codeEnd} i roden af projektet."
msgid "Metrics|Unexpected deployment data response from prometheus endpoint"
-msgstr ""
+msgstr "Uventet udsendelsesdatasvar fra prometheus-slutpunkt"
msgid "Metrics|Unit label"
msgstr ""
@@ -21564,16 +21884,16 @@ msgid "Metrics|View logs"
msgstr "Vis logge"
msgid "Metrics|View runbook - %{label}"
-msgstr ""
+msgstr "Vis runbook - %{label}"
msgid "Metrics|Y-axis label"
msgstr ""
msgid "Metrics|You can save a copy of this dashboard to your repository so it can be customized. Select a file name and branch to save it."
-msgstr ""
+msgstr "Du kan gemme en kopi af betjeningspanelet til dit depot, så det kan tilpasses. Vælg et filnavn og en gren for at gemme det."
msgid "Metrics|You're about to permanently delete this metric. This cannot be undone."
-msgstr ""
+msgstr "Du er ved at slette målingen permanent. Det kan ikke fortrydes."
msgid "Metrics|Your dashboard schema is invalid. Edit the dashboard to correct the YAML schema."
msgstr ""
@@ -21582,7 +21902,7 @@ msgid "Metrics|e.g. HTTP requests"
msgstr ""
msgid "Metrics|e.g. Requests/second"
-msgstr ""
+msgstr "f.eks. anmodninger/sek."
msgid "Metrics|e.g. Throughput"
msgstr ""
@@ -21597,7 +21917,7 @@ msgid "Mi"
msgstr "Mi"
msgid "Middleman project with Static Site Editor support"
-msgstr ""
+msgstr "Middleman-projekt med understøttelse af editor til statisk websted"
msgid "Migrated %{success_count}/%{total_count} files."
msgstr ""
@@ -21617,13 +21937,13 @@ msgstr[0] "Milepæl"
msgstr[1] "Milepæle"
msgid "Milestone due date"
-msgstr ""
+msgstr "Forfaldsdato for milepæl"
msgid "Milestone lists not available with your current license"
-msgstr ""
+msgstr "Milepælslister er ikke tilgængelige med din nuværende licens"
msgid "MilestoneCombobox|An error occurred while searching for milestones"
-msgstr ""
+msgstr "Der opstod en fejl under søgning efter milepæle"
msgid "MilestoneCombobox|Group milestones"
msgstr ""
@@ -21707,10 +22027,10 @@ msgid "Milestones"
msgstr "Milepæle"
msgid "Milestones| You’re about to permanently delete the milestone %{milestoneTitle} and remove it from %{issuesWithCount} and %{mergeRequestsWithCount}. Once deleted, it cannot be undone or recovered."
-msgstr ""
+msgstr " Du er ved at slette milepælen %{milestoneTitle} permanent og fjerne den fra %{issuesWithCount} og %{mergeRequestsWithCount}. Når den er slettet, så kan det ikke fortrydes eller gendannes."
msgid "Milestones| You’re about to permanently delete the milestone %{milestoneTitle}. This milestone is not currently used in any issues or merge requests."
-msgstr ""
+msgstr " Du er ved at slette %{milestoneTitle} permanent. Milepælen bruges på nuværende tidspunkt ikke i nogle problemstillinger eller sammenlægningsanmodninger."
msgid "Milestones|Close Milestone"
msgstr "Luk milepæl"
@@ -21722,10 +22042,10 @@ msgid "Milestones|Delete milestone"
msgstr "Slet milepæl"
msgid "Milestones|Delete milestone %{milestoneTitle}?"
-msgstr ""
+msgstr "Slet milepælen %{milestoneTitle}?"
msgid "Milestones|Failed to delete milestone %{milestoneTitle}"
-msgstr ""
+msgstr "Kunne ikke slette milepælen %{milestoneTitle}"
msgid "Milestones|Group Milestone"
msgstr ""
@@ -21734,19 +22054,19 @@ msgid "Milestones|Milestone %{milestoneTitle} was not found"
msgstr ""
msgid "Milestones|Ongoing Issues (open and assigned)"
-msgstr ""
+msgstr "Vedvarende problemstillinger (Ã¥bne og tildelte)"
msgid "Milestones|Project Milestone"
msgstr "Projektmilepæle"
msgid "Milestones|Promote %{milestoneTitle} to group milestone?"
-msgstr ""
+msgstr "Forfrem %{milestoneTitle} til gruppemilepæl?"
msgid "Milestones|Promote Milestone"
-msgstr ""
+msgstr "Forfrem milepæl"
msgid "Milestones|Promote to Group Milestone"
-msgstr ""
+msgstr "Forfrem til gruppemilepæl"
msgid "Milestones|Promoting %{milestoneTitle} will make it available for all projects inside %{groupName}. Existing project milestones with the same title will be merged."
msgstr ""
@@ -21758,7 +22078,7 @@ msgid "Milestones|This action cannot be reversed."
msgstr ""
msgid "Milestones|Unstarted Issues (open and unassigned)"
-msgstr ""
+msgstr "Problemstillinger som har fået fjernet deres stjerne (åbne og utildelte)"
msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
msgstr ""
@@ -21809,7 +22129,7 @@ msgid "Missing"
msgstr "Mangler"
msgid "Missing OAuth configuration for GitHub."
-msgstr ""
+msgstr "Manglende OAuth-konfiguration for GitHub."
msgid "Missing OS"
msgstr "Manglende styresystem"
@@ -21848,7 +22168,7 @@ msgid "Modify commit messages"
msgstr "Rediger commit-meddelelser"
msgid "Modify merge commit"
-msgstr ""
+msgstr "Rediger sammenlægningscommit"
msgid "Monday"
msgstr "Mandag"
@@ -21860,7 +22180,7 @@ msgid "Monitor Settings"
msgstr ""
msgid "Monitor the health and performance of GitLab with Prometheus."
-msgstr ""
+msgstr "Overvåg helbredet og ydelsen af GitLab med Prometheus."
msgid "Monitor your errors by integrating with Sentry."
msgstr ""
@@ -21947,6 +22267,9 @@ msgid "MoveIssue|Cannot move issue due to insufficient permissions!"
msgstr ""
msgid "MoveIssue|Cannot move issue to project it originates from!"
+msgstr "Kan ikke flytte problemstilling til projekt som den stammer fra!"
+
+msgid "MoveIssue|Cannot move issues of '%{issue_type}' type."
msgstr ""
msgid "Moved issue to %{label} column in the board."
@@ -21998,7 +22321,7 @@ msgid "Multiplier to apply to polling intervals. Decimal values are supported. D
msgstr ""
msgid "Must match with the %{codeStart}external_url%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}."
-msgstr ""
+msgstr "Skal matche %{codeStart}external_url%{codeEnd} i %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}."
msgid "Must match with the %{codeStart}geo_node_name%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}. %{linkStart}Learn more%{linkEnd}"
msgstr ""
@@ -22037,7 +22360,7 @@ msgid "Namespace"
msgstr "Navnerum"
msgid "Namespace ID:"
-msgstr ""
+msgstr "Navnerums-id:"
msgid "Namespace is empty"
msgstr "Navnerummet er tomt"
@@ -22054,7 +22377,7 @@ msgid "NamespaceStorageSize|%{namespace_name} is now read-only. You cannot: %{ba
msgstr "%{namespace_name} er nu skrivebeskyttet. Du kan ikke: %{base_message}"
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}"
+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 %{base_message}"
msgstr ""
@@ -22074,6 +22397,15 @@ 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. To learn more about reducing storage capacity please visit our docs."
msgstr ""
+msgid "NamespaceUserCap|Pending users must be reviewed and approved by a group owner. Learn more about %{user_caps_link_start}User Caps%{link_end} and %{users_pending_approval_link_start}Users Pending Approval%{link_end}."
+msgstr ""
+
+msgid "NamespaceUserCap|View pending user approvals"
+msgstr ""
+
+msgid "NamespaceUserCap|Your group has reached its billable member limit"
+msgstr ""
+
msgid "Namespaces"
msgstr "Navnerum"
@@ -22081,7 +22413,7 @@ msgid "Namespaces to index"
msgstr "Navnerum som skal indekseres"
msgid "Naming, topics, avatar"
-msgstr ""
+msgstr "Navngivning, emner, avatar"
msgid "Naming, visibility"
msgstr ""
@@ -22108,7 +22440,7 @@ msgid "Need help?"
msgstr "Brug for hjælp?"
msgid "Needs"
-msgstr ""
+msgstr "Behov"
msgid "Needs attention"
msgstr "Behøver opmærksomhed"
@@ -22116,9 +22448,6 @@ msgstr "Behøver opmærksomhed"
msgid "Network"
msgstr "Netværk"
-msgid "Network Policy|New rule"
-msgstr "Ny regel"
-
msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is inbound from a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
msgstr ""
@@ -22129,28 +22458,25 @@ msgid "NetworkPolicies|%{labelStart}And%{labelEnd} %{spanStart}send an Alert to
msgstr ""
msgid "NetworkPolicies|%{labelStart}Then%{labelEnd} %{action} %{spanStart}the network traffic.%{spanEnd}"
-msgstr ""
+msgstr "%{action} %{labelStart}herefter%{labelEnd} %{spanStart}netværkstrafikken%{spanEnd}."
msgid "NetworkPolicies|%{number} selected"
msgstr ""
msgid "NetworkPolicies|%{strongOpen}all%{strongClose} pods"
-msgstr ""
+msgstr "%{strongOpen}alle%{strongClose} pods"
msgid "NetworkPolicies|%{strongOpen}any%{strongClose} port"
msgstr ""
-msgid "NetworkPolicies|+ Add alert"
-msgstr ""
-
msgid "NetworkPolicies|.yaml"
msgstr ".yaml"
msgid "NetworkPolicies|.yaml mode"
msgstr ".yaml-tilstand"
-msgid "NetworkPolicies|Actions"
-msgstr "Handlinger"
+msgid "NetworkPolicies|Add alert"
+msgstr ""
msgid "NetworkPolicies|Alerts are intended to be selectively used for a limited number of events that are potentially concerning and warrant a manual review. Alerts should not be used as a substitute for a SIEM or a logging tool. High volume alerts are likely to be dropped so as to preserve the stability of GitLab's integration with Kubernetes."
msgstr ""
@@ -22183,10 +22509,7 @@ msgid "NetworkPolicies|Delete policy: %{policy}"
msgstr "Slet regelsæt: %{policy}"
msgid "NetworkPolicies|Deny all traffic"
-msgstr ""
-
-msgid "NetworkPolicies|Description"
-msgstr "Beskrivelse"
+msgstr "Afvis al trafik"
msgid "NetworkPolicies|Edit policy"
msgstr "Rediger regelsæt"
@@ -22200,54 +22523,39 @@ msgstr ""
msgid "NetworkPolicies|IP/subnet"
msgstr ""
-msgid "NetworkPolicies|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
-msgstr ""
-
msgid "NetworkPolicies|Invalid or empty policy"
-msgstr ""
+msgstr "Ugyldigt eller tomt regelsæt"
msgid "NetworkPolicies|Invalid or unsupported policy kind"
msgstr ""
msgid "NetworkPolicies|Kubernetes error: %{error}"
-msgstr ""
-
-msgid "NetworkPolicies|Name"
-msgstr "Navn"
+msgstr "Fejl ved Kubernetes: %{error}"
msgid "NetworkPolicies|Network"
msgstr "Netværk"
-msgid "NetworkPolicies|Network traffic"
-msgstr "Netværkstrafik"
-
-msgid "NetworkPolicies|New policy"
-msgstr "Nyt regelsæt"
+msgid "NetworkPolicies|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
+msgstr ""
-msgid "NetworkPolicies|No policies detected"
+msgid "NetworkPolicies|Network policy can be created after the environment is loaded successfully."
msgstr ""
+msgid "NetworkPolicies|Network traffic"
+msgstr "Netværkstrafik"
+
msgid "NetworkPolicies|None selected"
msgstr ""
msgid "NetworkPolicies|Please %{installLinkStart}install%{installLinkEnd} and %{configureLinkStart}configure a Kubernetes Agent for this project%{configureLinkEnd} to enable alerts."
msgstr ""
-msgid "NetworkPolicies|Policies are a specification of how groups of pods are allowed to communicate with each other's network endpoints."
-msgstr ""
-
msgid "NetworkPolicies|Policy %{policyName} was successfully changed"
msgstr ""
msgid "NetworkPolicies|Policy definition"
msgstr ""
-msgid "NetworkPolicies|Policy editor"
-msgstr ""
-
-msgid "NetworkPolicies|Policy preview"
-msgstr ""
-
msgid "NetworkPolicies|Rule"
msgstr "Regel"
@@ -22257,23 +22565,17 @@ msgstr "Regeltilstand"
msgid "NetworkPolicies|Rule mode is unavailable for this policy. In some cases, we cannot parse the YAML file back into the rules editor."
msgstr ""
-msgid "NetworkPolicies|Rules"
-msgstr "Regler"
-
msgid "NetworkPolicies|Save changes"
msgstr "Gem ændringer"
msgid "NetworkPolicies|Something went wrong, failed to update policy"
-msgstr ""
+msgstr "Noget gik galt. Kunne ikke opdatere regelsæt"
msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
-msgstr ""
+msgstr "Noget gik galt. Kunne ikke hente regelsæt"
msgid "NetworkPolicies|Traffic that does not match any rule will be blocked."
-msgstr ""
-
-msgid "NetworkPolicies|Unable to parse policy"
-msgstr ""
+msgstr "Trafik som ikke matcher nogen regel vil blive blokeret."
msgid "NetworkPolicies|all DNS names"
msgstr "Alle DNS-navne"
@@ -22303,13 +22605,13 @@ msgid "NetworkPolicies|outbound from"
msgstr ""
msgid "NetworkPolicies|pod with labels"
-msgstr ""
+msgstr "pod med etiketter"
msgid "NetworkPolicies|pods %{pods}"
msgstr ""
msgid "NetworkPolicies|pods with labels"
-msgstr ""
+msgstr "pods med etiketter"
msgid "NetworkPolicies|ports %{ports}"
msgstr ""
@@ -22330,7 +22632,7 @@ msgid "Never"
msgstr "Aldrig"
msgid "New"
-msgstr ""
+msgstr "Ny"
msgid "New %{issueType}"
msgstr ""
@@ -22377,13 +22679,13 @@ msgid "New Milestone"
msgstr "Ny milepæl"
msgid "New Pages Domain"
-msgstr ""
+msgstr "Nyt Pages-domæne"
msgid "New Password"
msgstr "Ny adgangskode"
msgid "New Pipeline Schedule"
-msgstr ""
+msgstr "Ny pipelineplanlægning"
msgid "New Project"
msgstr "Nyt projekt"
@@ -22392,7 +22694,7 @@ msgid "New Requirement"
msgstr "Nyt krav"
msgid "New Snippet"
-msgstr "Nyt uddrag"
+msgstr "Nyt udklip"
msgid "New Test Case"
msgstr "Ny testsag"
@@ -22407,7 +22709,7 @@ msgid "New branch"
msgstr "Ny gren"
msgid "New branch unavailable"
-msgstr ""
+msgstr "Ny gren utilgængelig"
msgid "New confidential epic title "
msgstr ""
@@ -22440,10 +22742,10 @@ msgid "New group"
msgstr "Ny gruppe"
msgid "New group URL"
-msgstr ""
+msgstr "URL for ny gruppe"
msgid "New group name"
-msgstr ""
+msgstr "Navn for ny gruppe"
msgid "New health check access token has been generated!"
msgstr ""
@@ -22454,6 +22756,9 @@ msgstr "Ny identitet"
msgid "New issue"
msgstr "Ny problemstilling"
+msgid "New issue in %{project}"
+msgstr ""
+
msgid "New issue title"
msgstr ""
@@ -22488,7 +22793,7 @@ msgid "New project pages"
msgstr "Nye projektsider"
msgid "New project/repository"
-msgstr ""
+msgstr "Nyt projekt/depot"
msgid "New public deploy key"
msgstr "Ny offentlig udsendelsesnøgle"
@@ -22500,16 +22805,16 @@ msgid "New requirement"
msgstr "Nyt krav"
msgid "New response for issue #%{issue_iid}:"
-msgstr ""
+msgstr "Nyt svar til problemstilling #%{issue_iid}:"
msgid "New runners registration token has been generated!"
msgstr ""
msgid "New schedule"
-msgstr ""
+msgstr "Ny planlægning"
msgid "New snippet"
-msgstr "Nyt uddrag"
+msgstr "Nyt udklip"
msgid "New subgroup"
msgstr "Ny undergruppe"
@@ -22532,11 +22837,11 @@ msgstr "Ny(t) ..."
msgid "Newest first"
msgstr "Nyeste først"
-msgid "Newly registered users will by default be external"
+msgid "Newly-registered users are external by default"
msgstr ""
msgid "Next"
-msgstr "Næste"
+msgstr "Next"
msgid "Next commit"
msgstr "Næste commit"
@@ -22560,7 +22865,7 @@ msgid "No %{header} for this request."
msgstr ""
msgid "No %{providerTitle} repositories found"
-msgstr ""
+msgstr "Ingen %{providerTitle}-depoter fundet"
msgid "No CSV data to display."
msgstr "Ingen CSV-data at vise."
@@ -22593,7 +22898,7 @@ msgid "No approvers"
msgstr "Ingen godkendere"
msgid "No artifacts found"
-msgstr ""
+msgstr "Ingen artefakter fundet"
msgid "No assignee"
msgstr ""
@@ -22629,16 +22934,16 @@ msgid "No committers"
msgstr ""
msgid "No compliance frameworks are in use."
-msgstr ""
+msgstr "Ingen overholdelsesframeworks er i brug."
msgid "No compliance frameworks are in use. Create one from the %{link} section in Group Settings."
msgstr ""
msgid "No confirmation email received? Please check your spam folder or"
-msgstr ""
+msgstr "Ikke modtaget nogle bekræftelses e-mail? Tjek venligst din spammappe eller"
msgid "No connection could be made to a Gitaly Server, please check your logs!"
-msgstr ""
+msgstr "Der kunne ikke oprettes forbindelse til a Gitaly-server. Tjek venligst dine logge!"
msgid "No containers available"
msgstr ""
@@ -22659,7 +22964,7 @@ msgid "No data to display"
msgstr "Ingen data at vise"
msgid "No deployments detected. Use environments to control your software's continuous deployment. %{linkStart}Learn more about deployment jobs.%{linkEnd}"
-msgstr ""
+msgstr "Ingen udsendelser registreret. Brug miljøer til at styre din softwares løbende udsendelse. %{linkStart}Lær mere om udsendelsesjob%{linkEnd}."
msgid "No deployments found"
msgstr "Ingen udsendelser fundet"
@@ -22677,7 +22982,7 @@ msgid "No errors to display."
msgstr "Ingen fejl at vise."
msgid "No estimate or time spent"
-msgstr ""
+msgstr "Intet estimat eller tid brugt"
msgid "No file chosen."
msgstr "Ingen fil valgt."
@@ -22728,7 +23033,7 @@ msgid "No license. All rights reserved"
msgstr "Ingen licens. Alle rettigheder forbeholdt"
msgid "No matches found"
-msgstr ""
+msgstr "Ingen match fundet"
msgid "No matching issue found. Make sure that you are adding a valid issue URL."
msgstr ""
@@ -22764,16 +23069,16 @@ msgid "No other labels with such name or description"
msgstr ""
msgid "No panels matching properties %{opts}"
-msgstr ""
+msgstr "Ingen paneler matcher egenskaberne %{opts}"
msgid "No parent group"
-msgstr ""
+msgstr "Ingen forældergruppe"
msgid "No plan"
msgstr "Ingen plan"
msgid "No pods available"
-msgstr ""
+msgstr "Ingen pods tilgængelige"
msgid "No policy matches this license"
msgstr ""
@@ -22797,7 +23102,7 @@ msgid "No ref selected"
msgstr ""
msgid "No related merge requests found."
-msgstr ""
+msgstr "Ingen relaterede sammenlægningsanmodninger fundet."
msgid "No repository"
msgstr "Intet depot"
@@ -22806,10 +23111,10 @@ msgid "No runner executable"
msgstr ""
msgid "No runners found"
-msgstr ""
+msgstr "Ingen runnere fundet"
msgid "No schedules"
-msgstr ""
+msgstr "Ingen planlægninger"
msgid "No severity matches the provided parameter"
msgstr ""
@@ -22847,14 +23152,16 @@ msgstr "Ingen sårbarheder tilstede"
msgid "No webhooks found, add one in the form above."
msgstr "Ingen webhooks fundet, tilføj en i formularen ovenover."
-msgid "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} to renew your subscription."
-msgstr ""
+msgid "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} day to renew your subscription."
+msgid_plural "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} days to renew your subscription."
+msgstr[0] ""
+msgstr[1] ""
msgid "No. of commits"
msgstr "Antal commits"
msgid "Nobody has starred this repository yet"
-msgstr ""
+msgstr "Ingen har stjernemarkeret depotet endnu"
msgid "Node was successfully created."
msgstr "Knudepunkt blev oprettet."
@@ -22865,7 +23172,7 @@ msgstr "Knudepunkt blev opdateret."
msgid "Nodes"
msgstr "Knudepunkter"
-msgid "Non-admin users can sign in with read-only access and make read-only API requests."
+msgid "Non-admin users are restricted to read-only access, in both GitLab UI and API."
msgstr ""
msgid "None"
@@ -22911,7 +23218,7 @@ msgid "Not permitted to destroy framework"
msgstr ""
msgid "Not ready yet. Try again later."
-msgstr "Ikke klar endnu. Prøv igen senere."
+msgstr "Endnu ikke klar. Prøv igen senere."
msgid "Not started"
msgstr "Ikke startet"
@@ -22920,7 +23227,7 @@ msgid "Not supported"
msgstr "Ikke understøttet"
msgid "Note"
-msgstr ""
+msgstr "Bemærkning"
msgid "Note creation requests"
msgstr ""
@@ -22941,12 +23248,12 @@ msgid "Note: Consider asking your GitLab administrator to configure %{github_int
msgstr ""
msgid "Note: Consider asking your GitLab administrator to configure %{github_integration_link}, which will allow login via GitHub and allow importing repositories without generating a Personal Access Token."
-msgstr ""
+msgstr "Bemærk: Overvej at spørge din GitLab-administrator om at konfigurere %{github_integration_link}, hvilket vil gøre det muligt at logge ind via GitHub og tillade import af depoter uden generering af en personlig adgangstoken."
msgid "NoteForm|Note"
msgstr ""
-msgid "Notes Rate Limits"
+msgid "Notes rate limit"
msgstr ""
msgid "Notes|Are you sure you want to cancel creating this comment?"
@@ -22974,7 +23281,7 @@ msgid "Notes|This comment has changed since you started editing, please review t
msgstr ""
msgid "Notes|This comment is confidential and only visible to project members"
-msgstr ""
+msgstr "Kommentaren er fortrolig og kun synlig for projektmedlemmer"
msgid "Notes|You're only seeing %{boldStart}other activity%{boldEnd} in the feed. To add a comment, switch to one of the following options."
msgstr ""
@@ -22986,7 +23293,7 @@ msgid "Nothing to preview."
msgstr "Intet at forhåndsvise."
msgid "Notification events"
-msgstr "Underretningshændelser"
+msgstr "Underretningsbegivenheder"
msgid "Notification setting - %{notification_title}"
msgstr "Underretningsindstilling - %{notification_title}"
@@ -23024,7 +23331,7 @@ msgid "NotificationEvent|Close merge request"
msgstr "Luk sammenlægningsanmodning"
msgid "NotificationEvent|Failed pipeline"
-msgstr ""
+msgstr "Mislykket pipeline"
msgid "NotificationEvent|Fixed pipeline"
msgstr ""
@@ -23063,7 +23370,7 @@ msgid "NotificationEvent|Reassign issue"
msgstr ""
msgid "NotificationEvent|Reassign merge request"
-msgstr ""
+msgstr "Gentildel sammenlægningsanmodning"
msgid "NotificationEvent|Reopen issue"
msgstr "Genåbn problemstilling"
@@ -23081,16 +23388,16 @@ msgid "NotificationLevel|Disabled"
msgstr "Deaktiveret"
msgid "NotificationLevel|Global"
-msgstr "Global"
+msgstr "Globale"
msgid "NotificationLevel|On mention"
-msgstr ""
+msgstr "Når du nævnes"
msgid "NotificationLevel|Participate"
-msgstr "Deltag"
+msgstr "Deltager"
msgid "NotificationLevel|Watch"
-msgstr ""
+msgstr "Hold øje"
msgid "Notifications"
msgstr "Underretninger"
@@ -23105,7 +23412,7 @@ msgid "Notifications on"
msgstr "Underretninger til"
msgid "Notify users by email when sign-in location is not recognized."
-msgstr ""
+msgstr "Underret brugere med e-mail når indlogningsplacering ikke genkendes."
msgid "Nov"
msgstr "Nov."
@@ -23113,9 +23420,6 @@ msgstr "Nov."
msgid "November"
msgstr "November"
-msgid "Novice"
-msgstr "Nybegynder"
-
msgid "Now, personalize your GitLab experience"
msgstr ""
@@ -23123,7 +23427,7 @@ msgid "Nuget metadatum must have at least license_url, project_url or icon_url s
msgstr ""
msgid "Number of Elasticsearch shards and replicas (per index)"
-msgstr ""
+msgstr "Antal Elasticsearch-shards og -replikaer (pr. indeks)"
msgid "Number of Git pushes after which %{code_start}git gc%{code_end} is run."
msgstr ""
@@ -23150,16 +23454,16 @@ msgid "Number of commits per MR"
msgstr "Antal commits pr. sammenlægningsanmodning"
msgid "Number of events"
-msgstr "Antal hændelser"
+msgstr "Antal begivenheder"
msgid "Number of events for this project: %{total_count}."
-msgstr "Antal hændelser for projektet: %{total_count}."
+msgstr "Antal begivenheder for projektet: %{total_count}."
msgid "Number of files touched"
msgstr "Antal filer berørt"
msgid "Number of replicas"
-msgstr ""
+msgstr "Antal replikaer"
msgid "Number of shards"
msgstr "Antal shards"
@@ -23210,10 +23514,10 @@ msgid "On track"
msgstr ""
msgid "On-call Schedules"
-msgstr ""
+msgstr "Vagtplaner"
msgid "On-call schedules"
-msgstr ""
+msgstr "Vagtplaner"
msgid "OnCallScheduless|Any escalation rules that are using this schedule will also be deleted."
msgstr ""
@@ -23225,70 +23529,70 @@ msgid "OnCallSchedules|2 weeks"
msgstr "2 uger"
msgid "OnCallSchedules|Add a rotation"
-msgstr ""
+msgstr "Tilføj en rotation"
msgid "OnCallSchedules|Add a schedule"
-msgstr ""
+msgstr "Tilføj en plan"
msgid "OnCallSchedules|Add an additional schedule to your project"
-msgstr ""
+msgstr "Tilføj en yderligere plan til dit projekt"
msgid "OnCallSchedules|Add rotation"
-msgstr ""
+msgstr "Tilføj rotation"
msgid "OnCallSchedules|Add schedule"
-msgstr ""
+msgstr "Tilføj plan"
msgid "OnCallSchedules|Are you sure you want to delete the \"%{deleteRotation}\" rotation? This action cannot be undone."
-msgstr ""
+msgstr "Er du sikker på, at du vil slette rotationen \"%{deleteRotation}\"? Handlingen kan ikke fortrydes."
msgid "OnCallSchedules|Are you sure you want to delete the \"%{deleteSchedule}\" schedule? This action cannot be undone."
-msgstr ""
+msgstr "Er du sikker på, at du vil slette planen \"%{deleteSchedule}\"? Handlingen kan ikke fortrydes."
msgid "OnCallSchedules|Collapse schedule"
-msgstr ""
+msgstr "Sammenfold plan"
msgid "OnCallSchedules|Create on-call schedules in GitLab"
-msgstr ""
+msgstr "Opret vagtplaner i GitLab"
msgid "OnCallSchedules|Currently no rotation."
-msgstr ""
+msgstr "Ingen rotation i øjeblikket."
msgid "OnCallSchedules|Delete rotation"
-msgstr ""
+msgstr "Slet rotation"
msgid "OnCallSchedules|Delete schedule"
-msgstr ""
+msgstr "Slet plan"
msgid "OnCallSchedules|Edit rotation"
-msgstr ""
+msgstr "Rediger rotation"
msgid "OnCallSchedules|Edit schedule"
-msgstr ""
+msgstr "Rediger plan"
msgid "OnCallSchedules|Enable end date"
-msgstr ""
+msgstr "Aktivér slutdato"
msgid "OnCallSchedules|Expand schedule"
-msgstr ""
+msgstr "Udfold planlægning"
msgid "OnCallSchedules|Failed to add rotation"
-msgstr ""
+msgstr "Kunne ikke tilføje rotation"
msgid "OnCallSchedules|Failed to add schedule"
-msgstr ""
+msgstr "Kunne ikke tilføje planlægning"
msgid "OnCallSchedules|Failed to edit schedule"
-msgstr ""
+msgstr "Kunne ikke redigere planlægning"
msgid "OnCallSchedules|For this rotation, on-call will be:"
msgstr ""
-msgid "OnCallSchedules|On-call schedule %{schedule} in Project %{project}"
+msgid "OnCallSchedules|On-call schedule %{obstacle} in Project %{project}"
msgstr ""
msgid "OnCallSchedules|On-call schedules"
-msgstr ""
+msgstr "Vagtplaner"
msgid "OnCallSchedules|Please note, rotations with shifts that are less than four hours are currently not supported in the weekly view."
msgstr ""
@@ -23300,10 +23604,10 @@ msgid "OnCallSchedules|Removing yourself may put your on-call team at risk of mi
msgstr ""
msgid "OnCallSchedules|Restrict to time intervals"
-msgstr ""
+msgstr "Begræns til tidsintervaller"
msgid "OnCallSchedules|Rotation end date/time must come after start date/time"
-msgstr ""
+msgstr "Slutdato/-tidspunkt for rotation skal komme efter startdato/-tidspunkt"
msgid "OnCallSchedules|Rotation length"
msgstr ""
@@ -23318,10 +23622,10 @@ msgid "OnCallSchedules|Rotation start date cannot be empty"
msgstr ""
msgid "OnCallSchedules|Rotations"
-msgstr ""
+msgstr "Rotationer"
msgid "OnCallSchedules|Route alerts directly to specific members of your team"
-msgstr ""
+msgstr "Led alertbeskeder direkte til bestemte medlemmer i dit team"
msgid "OnCallSchedules|Select participant"
msgstr "Vælg deltager"
@@ -23339,19 +23643,19 @@ msgid "OnCallSchedules|Successfully edited your rotation"
msgstr ""
msgid "OnCallSchedules|The rotation could not be deleted. Please try again."
-msgstr ""
+msgstr "Rotationen kunne ikke slettes. Prøv venligst igen."
msgid "OnCallSchedules|The rotation could not be updated. Please try again."
-msgstr ""
+msgstr "Rotationen kunne ikke opdateres. Prøv venligst igen."
msgid "OnCallSchedules|The schedule could not be deleted. Please try again."
-msgstr ""
+msgstr "Planlægningen kunne ikke slettes. Prøv venligst igen."
msgid "OnCallSchedules|The schedule could not be updated. Please try again."
-msgstr ""
+msgstr "Planlægningen kunne ikke opdateres. Prøv venligst igen."
msgid "OnCallSchedules|Try adding a rotation"
-msgstr ""
+msgstr "Prøv at tilføje en rotation"
msgid "OnCallSchedules|User %{name} is currently part of:"
msgstr ""
@@ -23369,19 +23673,19 @@ msgid "OnCallSchedules|Your schedule has been successfully created. To add indiv
msgstr ""
msgid "OnDemandScans|Could not fetch scanner profiles. Please refresh the page, or try again later."
-msgstr ""
+msgstr "Kunne ikke hente skannerprofiler. Opdater venligst siden eller prøv igen senere."
msgid "OnDemandScans|Could not fetch site profiles. Please refresh the page, or try again later."
-msgstr ""
+msgstr "Kunne ikke hente webstedsprofiler. Opdater venligst siden eller prøv igen senere."
msgid "OnDemandScans|Could not run the scan. Please try again."
-msgstr ""
+msgstr "Kunne ikke køre skanningen. Prøv venligst igen."
msgid "OnDemandScans|Create new scanner profile"
msgstr ""
msgid "OnDemandScans|Create new site profile"
-msgstr ""
+msgstr "Opret ny webstedsprofil"
msgid "OnDemandScans|Description (optional)"
msgstr "Beskrivelse (valgfrit)"
@@ -23396,7 +23700,7 @@ msgid "OnDemandScans|Manage DAST scans"
msgstr ""
msgid "OnDemandScans|Manage scanner profiles"
-msgstr ""
+msgstr "HÃ¥ndter skannerprofiler"
msgid "OnDemandScans|Manage site profiles"
msgstr ""
@@ -23431,38 +23735,38 @@ msgstr ""
msgid "OnDemandScans|Scanner profile"
msgstr "Skannerprofil"
-msgid "OnDemandScans|Select one of the existing profiles"
+msgid "OnDemandScans|Schedule scan"
msgstr ""
-msgid "OnDemandScans|Site profile"
+msgid "OnDemandScans|Select one of the existing profiles"
msgstr ""
-msgid "OnDemandScans|Use existing scanner profile"
+msgid "OnDemandScans|Site profile"
msgstr ""
-msgid "OnDemandScans|Use existing site profile"
+msgid "OnDemandScans|Start time"
msgstr ""
-msgid "OnDemandScans|You can either choose a passive scan or validate the target site in your chosen site profile. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
-msgstr ""
+msgid "OnDemandScans|Use existing scanner profile"
+msgstr "Brug eksisterende skannerprofil"
-msgid "OnDemandScans|You cannot run an active scan against an unvalidated site."
+msgid "OnDemandScans|Use existing site profile"
msgstr ""
msgid "OnDemandScans|You must create a repository within your project to run an on-demand scan."
msgstr ""
msgid "Once a project is permanently deleted, it %{strongStart}cannot be recovered%{strongEnd}. Permanently deleting this project will %{strongStart}immediately delete%{strongEnd} its repositories and %{strongStart}all related resources%{strongEnd}, including issues, merge requests etc."
-msgstr ""
+msgstr "Når et projekt slettes permanent, så kan det %{strongStart}ikke gendannes%{strongEnd}. Permanent sletning af projektet vil %{strongStart}straks slette%{strongEnd} dets depoter og %{strongStart}alle relaterede ressourcer%{strongEnd}, herunder problemstillinger, sammenlægningsanmodninger osv."
msgid "Once a project is permanently deleted, it cannot be recovered. You will lose this project's repository and all related resources, including issues and merge requests."
-msgstr ""
+msgstr "Når et projekt slettes permanent, så kan det ikke gendannes. Du vil miste projektets depot og alle relaterede ressourcer, herunder problemstillinger og sammenlægningsanmodninger."
msgid "Once imported, repositories can be mirrored over SSH. Read more %{link_start}here%{link_end}."
msgstr ""
msgid "Once removed, the fork relationship cannot be restored. This project will no longer be able to receive or send merge requests to the source project or other forks."
-msgstr ""
+msgstr "Når den er fjernet kan forgreningsrelationen ikke gendannes. Projektet vil ikke længere være i stand til at modtage eller sende sammenlægningsanmodninger til kildeprojektet eller andre forgreninger."
msgid "Once the exported file is ready, you will receive a notification email with a download link, or you can download it from this page."
msgstr ""
@@ -23479,13 +23783,13 @@ msgid "One or more groups that you don't have access to."
msgstr ""
msgid "One or more of you personal access tokens were revoked"
-msgstr ""
+msgstr "Én eller flere af dine personlige adgangstokens blev tilbagekaldt"
msgid "One or more of your %{provider} projects cannot be imported into GitLab directly because they use Subversion or Mercurial for version control, rather than Git."
msgstr ""
msgid "One or more of your dependency files are not supported, and the dependency list may be incomplete. Below is a list of supported file types."
-msgstr ""
+msgstr "En eller flere af dine afhængighedsfiler understøttes ikke og afhængighedslisten kan være ufuldstændig. Nedenunder er en liste over understøttede filtyper."
msgid "One or more of your personal access tokens has expired."
msgstr ""
@@ -23511,6 +23815,9 @@ msgstr ""
msgid "Only admins can delete project"
msgstr "Kun administratorer kan slette projektet"
+msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
+msgstr ""
+
msgid "Only include features new to your current subscription tier."
msgstr ""
@@ -23529,6 +23836,12 @@ msgstr ""
msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
+msgid "Only reCAPTCHA v2 is supported:"
+msgstr ""
+
+msgid "Only users from the specified IP address ranges are able to reach this group, including all subgroups, projects, and Git repositories."
+msgstr ""
+
msgid "Only verified users with an email address in any of these domains can be added to the group."
msgstr ""
@@ -23539,7 +23852,7 @@ msgid "Oops, are you sure?"
msgstr "Ups, er du sikker?"
msgid "Open"
-msgstr "Ã…ben"
+msgstr "Ã…bne"
msgid "Open Selection"
msgstr "Ã…bn markering"
@@ -23572,19 +23885,19 @@ msgid "Open sidebar"
msgstr "Åbn sidebjælke"
msgid "Open: %{open}"
-msgstr ""
+msgstr "Ã…ben: %{open}"
msgid "OpenAPI"
msgstr "OpenAPI"
msgid "OpenAPI Specification file path or URL"
-msgstr ""
+msgstr "Filsti eller URL for OpenAPI-specifikation"
msgid "Opened"
msgstr ""
msgid "Opened MRs"
-msgstr ""
+msgstr "Åbnede sammenlægningsanmodninger"
msgid "Opened issues"
msgstr "Ã…bne problemstillinger"
@@ -23623,7 +23936,7 @@ msgid "OperationsDashboard|Operations Dashboard"
msgstr ""
msgid "OperationsDashboard|The operations dashboard provides a summary of each project's operational health, including pipeline and alert statuses."
-msgstr ""
+msgstr "Driftbetjeningspanelet giver en opsummering over hvert projekts driftssundhed, herunder pipeline- og alertbeskedstatusser."
msgid "Optimize your workflow with CI/CD Pipelines"
msgstr "Optimer dit workflow med CI-/CD-pipelines"
@@ -23641,22 +23954,22 @@ msgid "Options"
msgstr "Valgmuligheder"
msgid "Or you can choose one of the suggested colors below"
-msgstr ""
+msgstr "Eller du kan vælge en af de foreslåede farver nedenunder"
msgid "Orphaned member"
-msgstr ""
+msgstr "Forælderløst medlem"
msgid "Other Labels"
msgstr "Andre etiketter"
msgid "Other available runners"
-msgstr ""
+msgstr "Andre tilgængelige runnere"
msgid "Other information"
msgstr "Anden information"
msgid "Other merge requests block this MR"
-msgstr ""
+msgstr "Andre sammenlægningsanmodninger blokerer sammenlægningsanmodningen"
msgid "Other versions"
msgstr "Andre versioner"
@@ -23665,13 +23978,13 @@ msgid "Other visibility settings have been disabled by the administrator."
msgstr ""
msgid "Otherwise, click the link below to complete the process."
-msgstr ""
+msgstr "Ellers klik på linket nedenunder for at fuldføre processen."
msgid "Otherwise, click the link below to complete the process:"
-msgstr ""
+msgstr "Ellers klik på linket nedenunder for at fuldføre processen:"
msgid "Our team has been notified. Please try again."
-msgstr ""
+msgstr "Vores team er blevet underrettet. Prøv venligst igen."
msgid "Out-of-compliance with this project's policies and should be removed"
msgstr ""
@@ -23680,7 +23993,7 @@ msgid "Outbound requests"
msgstr ""
msgid "OutdatedBrowser|GitLab may not work properly, because you are using an outdated web browser."
-msgstr ""
+msgstr "GitLab virker måske ikke ordentligt fordi du bruger en forældet webbrowser."
msgid "OutdatedBrowser|Please install a %{browser_link_start}supported web browser%{browser_link_end} for a better experience."
msgstr "Installer venligst en %{browser_link_start}understøttede webbrowser%{browser_link_end} for at få en bedre oplevelse."
@@ -23715,9 +24028,6 @@ msgstr "Ejer"
msgid "Package Registry"
msgstr "Pakkeregister"
-msgid "Package Registry Rate Limits"
-msgstr ""
-
msgid "Package Registry: authenticated API requests"
msgstr ""
@@ -23736,9 +24046,12 @@ msgstr ""
msgid "Package recipe already exists"
msgstr ""
-msgid "Package type"
+msgid "Package registry rate limits"
msgstr ""
+msgid "Package type"
+msgstr "Pakketype"
+
msgid "Package type must be Conan"
msgstr "Pakketype skal være Conan"
@@ -23779,7 +24092,7 @@ msgid "PackageRegistry|Add Gradle Kotlin DSL repository command"
msgstr ""
msgid "PackageRegistry|Add NuGet Source"
-msgstr ""
+msgstr "Tilføj NuGet-kilde"
msgid "PackageRegistry|Add composer registry"
msgstr "Tilføj composer-register"
@@ -23788,7 +24101,7 @@ msgid "PackageRegistry|Allow duplicates"
msgstr ""
msgid "PackageRegistry|An error occurred while saving the settings"
-msgstr ""
+msgstr "Der opstod en fejl under gemning af indstillingerne"
msgid "PackageRegistry|App group: %{group}"
msgstr ""
@@ -23802,47 +24115,50 @@ msgstr ""
msgid "PackageRegistry|Composer"
msgstr "Composer"
-msgid "PackageRegistry|Conan"
+msgid "PackageRegistry|Composer.json with license: %{license} and version: %{version}"
msgstr ""
+msgid "PackageRegistry|Conan"
+msgstr "Conan"
+
msgid "PackageRegistry|Conan Command"
-msgstr ""
+msgstr "Conan-kommando"
msgid "PackageRegistry|Copy .pypirc content"
-msgstr ""
+msgstr "Kopiér .pypirc-indhold"
msgid "PackageRegistry|Copy Conan Command"
-msgstr ""
+msgstr "Kopiér Conan-kommando"
msgid "PackageRegistry|Copy Conan Setup Command"
-msgstr ""
+msgstr "Kopiér Conan-opsætningskommando"
msgid "PackageRegistry|Copy Gradle Groovy DSL install command"
-msgstr ""
+msgstr "Kopiér Gradle Groovy DSL-installationskommando"
msgid "PackageRegistry|Copy Gradle Kotlin DSL install command"
-msgstr ""
+msgstr "Kopiér Gradle Kotlin DSL-installationskommando"
msgid "PackageRegistry|Copy Maven XML"
-msgstr ""
+msgstr "Kopiér Maven-XML"
msgid "PackageRegistry|Copy Maven command"
-msgstr ""
+msgstr "Kopiér Maven-kommando"
msgid "PackageRegistry|Copy Maven registry XML"
msgstr ""
msgid "PackageRegistry|Copy NuGet Command"
-msgstr ""
+msgstr "Kopiér NuGet-kommando"
msgid "PackageRegistry|Copy NuGet Setup Command"
-msgstr ""
+msgstr "Kopiér NuGet-opsætningskommando"
msgid "PackageRegistry|Copy Pip command"
-msgstr ""
+msgstr "Kopiér Pip-kommando"
msgid "PackageRegistry|Copy SHA"
-msgstr ""
+msgstr "Kopiér SHA"
msgid "PackageRegistry|Copy add Gradle Groovy DSL repository command"
msgstr ""
@@ -23854,10 +24170,10 @@ msgid "PackageRegistry|Copy and paste this inside your %{codeStart}pom.xml%{code
msgstr ""
msgid "PackageRegistry|Copy npm command"
-msgstr ""
+msgstr "Kopiér npm-kommando"
msgid "PackageRegistry|Copy npm setup command"
-msgstr ""
+msgstr "Kopiér npm-opsætningskommando"
msgid "PackageRegistry|Copy registry include"
msgstr ""
@@ -23865,14 +24181,17 @@ msgstr ""
msgid "PackageRegistry|Copy require package include"
msgstr ""
+msgid "PackageRegistry|Copy target SHA"
+msgstr ""
+
msgid "PackageRegistry|Copy yarn command"
msgstr "Kopiér yarn-kommando"
msgid "PackageRegistry|Copy yarn setup command"
-msgstr ""
+msgstr "Kopiér yarn-opsætningskommando"
msgid "PackageRegistry|Created by commit %{link} on branch %{branch}"
-msgstr ""
+msgstr "Oprettet af committen %{link} på grenen %{branch}"
msgid "PackageRegistry|Debian"
msgstr "Debian"
@@ -23905,7 +24224,7 @@ msgid "PackageRegistry|For more information on the PyPi registry, %{linkStart}se
msgstr "%{linkStart}Se dokumentationen%{linkEnd} for mere information om PyPi-registeret."
msgid "PackageRegistry|Generic"
-msgstr ""
+msgstr "Generisk"
msgid "PackageRegistry|Gradle Groovy DSL"
msgstr ""
@@ -23923,25 +24242,28 @@ msgid "PackageRegistry|Helm"
msgstr ""
msgid "PackageRegistry|If you haven't already done so, you will need to add the below to your %{codeStart}.pypirc%{codeEnd} file."
-msgstr ""
+msgstr "Hvis du ikke allerede har gjort det, så skal du tilføje det nedenunder til din %{codeStart}.pypirc%{codeEnd}-fil."
msgid "PackageRegistry|If you haven't already done so, you will need to add the below to your %{codeStart}pom.xml%{codeEnd} file."
-msgstr ""
+msgstr "Hvis du ikke allerede har gjort det, så skal du tilføje det nedenunder til din %{codeStart}pom.xml%{codeEnd}-fil."
msgid "PackageRegistry|Install package version"
+msgstr "Installer pakkeversion"
+
+msgid "PackageRegistry|Instance-level"
msgstr ""
msgid "PackageRegistry|Invalid Package: failed metadata extraction"
msgstr ""
msgid "PackageRegistry|Learn how to %{noPackagesLinkStart}publish and share your packages%{noPackagesLinkEnd} with GitLab."
-msgstr ""
+msgstr "Lær at %{noPackagesLinkStart}udgive og dele dine pakker%{noPackagesLinkEnd} med GitLab."
msgid "PackageRegistry|License information located at %{link}"
-msgstr ""
+msgstr "Licensinformation placeret på %{link}"
msgid "PackageRegistry|Manually Published"
-msgstr ""
+msgstr "Udgivet manuelt"
msgid "PackageRegistry|Maven"
msgstr "Maven"
@@ -23950,7 +24272,7 @@ msgid "PackageRegistry|Maven Command"
msgstr "Maven-kommando"
msgid "PackageRegistry|Maven XML"
-msgstr ""
+msgstr "Maven-XML"
msgid "PackageRegistry|NuGet"
msgstr "NuGet"
@@ -23959,7 +24281,7 @@ msgid "PackageRegistry|NuGet Command"
msgstr "NuGet-kommando"
msgid "PackageRegistry|Package Registry"
-msgstr ""
+msgstr "Pakkeregister"
msgid "PackageRegistry|Package file deleted successfully"
msgstr ""
@@ -23968,7 +24290,7 @@ msgid "PackageRegistry|Package has %{number} archived update"
msgstr ""
msgid "PackageRegistry|Package has %{number} archived updates"
-msgstr ""
+msgstr "Pakke har %{number} arkiverede opdateringer"
msgid "PackageRegistry|Package updated by commit %{link} on branch %{branch}, built by pipeline %{pipeline}, and published to the registry %{datetime}"
msgstr ""
@@ -23976,6 +24298,9 @@ msgstr ""
msgid "PackageRegistry|Pip Command"
msgstr "Pip-kommando"
+msgid "PackageRegistry|Project-level"
+msgstr ""
+
msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
msgstr ""
@@ -23997,14 +24322,17 @@ msgstr ""
msgid "PackageRegistry|Remove package"
msgstr "Fjern pakke"
+msgid "PackageRegistry|Required Python: %{pythonVersion}"
+msgstr ""
+
msgid "PackageRegistry|RubyGems"
msgstr ""
msgid "PackageRegistry|Settings for Generic packages"
-msgstr ""
+msgstr "Indstillinger for generiske pakker"
msgid "PackageRegistry|Settings for Maven packages"
-msgstr ""
+msgstr "Indstillinger for Maven-pakker"
msgid "PackageRegistry|Settings saved successfully"
msgstr ""
@@ -24034,11 +24362,14 @@ msgid "PackageRegistry|Something went wrong while deleting the package."
msgstr "Noget gik galt under sletning af pakken."
msgid "PackageRegistry|Sorry, your filter produced no results"
-msgstr ""
+msgstr "Beklager, dit filter gav ingen resultater"
msgid "PackageRegistry|Source project located at %{link}"
msgstr ""
+msgid "PackageRegistry|Target SHA: %{sha}"
+msgstr ""
+
msgid "PackageRegistry|There are no other versions of this package."
msgstr ""
@@ -24067,10 +24398,10 @@ msgid "PackageRegistry|Use GitLab as a private registry for common package forma
msgstr ""
msgid "PackageRegistry|You are about to delete %{filename}. This is a destructive action that may render your package unusable. Are you sure?"
-msgstr ""
+msgstr "Du er ved at slette %{filename}. Det er en destruktiv handling der kan gøre din pakke ubrugelig. Er du sikker?"
msgid "PackageRegistry|You are about to delete %{name}, this operation is irreversible, are you sure?"
-msgstr ""
+msgstr "Du er ved at slette %{name}. Handlingen kan ikke gøres om. Er du sikker?"
msgid "PackageRegistry|You are about to delete version %{version} of %{name}. Are you sure?"
msgstr "Du er ved at slette version %{version} af %{name}. Er du sikker?"
@@ -24085,7 +24416,7 @@ msgid "PackageRegistry|published by %{author}"
msgstr "udgivet af %{author}"
msgid "Packages & Registries"
-msgstr ""
+msgstr "Pakker og registre"
msgid "Page not found"
msgstr "Siden blev ikke fundet"
@@ -24103,19 +24434,19 @@ msgid "PagerDutySettings|Failed to update Webhook URL"
msgstr ""
msgid "PagerDutySettings|Reset webhook URL"
-msgstr ""
+msgstr "Nulstil webhook-URL"
msgid "PagerDutySettings|Resetting the webhook URL for this project will require updating this integration's settings in PagerDuty."
msgstr ""
msgid "PagerDutySettings|Webhook URL"
-msgstr ""
+msgstr "Webhook-URL"
msgid "PagerDutySettings|Webhook URL update was successful"
-msgstr ""
+msgstr "Opdatering af webhook-URL lykkedes"
msgid "Pages"
-msgstr ""
+msgstr "Sider"
msgid "Pages Domain"
msgstr "Pages-domæne"
@@ -24157,13 +24488,13 @@ msgid "Parameter \"job_id\" cannot exceed length of %{job_id_max_size}"
msgstr ""
msgid "Parent"
-msgstr ""
+msgstr "Forælder"
msgid "Parent epic doesn't exist."
-msgstr ""
+msgstr "Forælderepic findes ikke."
msgid "Parent epic is not present."
-msgstr ""
+msgstr "Forælderepic er ikke tilstede."
msgid "Parsing error for param :embed_json. %{message}"
msgstr ""
@@ -24190,7 +24521,7 @@ msgid "Password"
msgstr "Adgangskode"
msgid "Password (for password-protected Elasticsearch servers)"
-msgstr ""
+msgstr "Adgangskode (til adgangskodebeskyttede Elasticsearch-servere)"
msgid "Password (optional)"
msgstr "Adgangskode (valgfrit)"
@@ -24199,12 +24530,24 @@ msgid "Password authentication is unavailable."
msgstr ""
msgid "Password confirmation"
-msgstr ""
+msgstr "Bekræftelse af adgangskode"
msgid "Password successfully changed"
msgstr ""
msgid "Password was successfully updated. Please sign in again."
+msgstr "Adgangskode blev opdateret. Log venligst ind igen."
+
+msgid "PasswordPrompt|Confirm password"
+msgstr ""
+
+msgid "PasswordPrompt|Confirm password to continue"
+msgstr ""
+
+msgid "PasswordPrompt|Password is required"
+msgstr ""
+
+msgid "PasswordPrompt|Please enter your password to confirm"
msgstr ""
msgid "Passwords should be unique and not used for any other sites or services."
@@ -24220,25 +24563,28 @@ msgid "Paste a public key here. %{link_start}How do I generate it?%{link_end}"
msgstr "Indsæt en offentlig nøgle her. %{link_start}Hvordan genererer jeg den?%{link_end}"
msgid "Paste confidential epic link"
-msgstr ""
+msgstr "Indsæt fortroligt epiclink"
msgid "Paste confidential issue link"
-msgstr ""
+msgstr "Indsæt fortroligt problemstillingslink"
msgid "Paste epic link"
-msgstr ""
+msgstr "Indsæt epiclink"
msgid "Paste issue link"
-msgstr ""
+msgstr "Indsæt problemstillingslink"
msgid "Paste project path (i.e. gitlab-org/gitlab)"
msgstr "Indsæt projektsti (f.eks. gitlab-org/gitlab)"
-msgid "Paste your public SSH key, which is usually contained in the file '~/.ssh/id_ed25519.pub' or '~/.ssh/id_rsa.pub' and begins with 'ssh-ed25519' or 'ssh-rsa'. Do not paste your private SSH key, as that can compromise your identity."
+msgid "Paste this DSN into your Sentry SDK"
msgstr ""
+msgid "Paste your public SSH key, which is usually contained in the file '~/.ssh/id_ed25519.pub' or '~/.ssh/id_rsa.pub' and begins with 'ssh-ed25519' or 'ssh-rsa'. Do not paste your private SSH key, as that can compromise your identity."
+msgstr "Indsæt din offentlige SSH-nøgle som typisk findes i filen '~/.ssh/id_ed25519.pub' eller '~/.ssh/id_rsa.pub' og begynder med 'ssh-ed25519' eller 'ssh-rsa'. Indsæt ikke din private SSH-nøgle da det kan kompromittere din identitet."
+
msgid "Patch to apply"
-msgstr ""
+msgstr "Patch som skal anvendes"
msgid "Path"
msgstr "Sti"
@@ -24256,7 +24602,7 @@ msgid "Pause Elasticsearch indexing"
msgstr ""
msgid "Paused"
-msgstr ""
+msgstr "Sat på pause"
msgid "Paused runners don't accept new jobs"
msgstr ""
@@ -24271,7 +24617,7 @@ msgid "Pending comments"
msgstr "Afventende kommentarer"
msgid "Pending sync…"
-msgstr ""
+msgstr "Afventer synkronisering …"
msgid "People without permission will never get a notification and won't be able to comment."
msgstr "Personer uden tilladelse får aldrig en underretning og kan ikke kommentere."
@@ -24292,7 +24638,7 @@ msgid "Perform code reviews and enhance collaboration with merge requests."
msgstr ""
msgid "Perform common operations on GitLab project"
-msgstr ""
+msgstr "Udfør almindelige operationer på GitLab-projekt"
msgid "Performance optimization"
msgstr "Ydelsesoptimering"
@@ -24318,6 +24664,9 @@ msgstr ""
msgid "PerformanceBar|First Contentful Paint"
msgstr ""
+msgid "PerformanceBar|Flamegraph with mode:"
+msgstr ""
+
msgid "PerformanceBar|Frontend resources"
msgstr ""
@@ -24349,6 +24698,15 @@ msgid "PerformanceBar|Total duration"
msgstr ""
msgid "PerformanceBar|Trace"
+msgstr "Trace"
+
+msgid "PerformanceBar|cpu"
+msgstr ""
+
+msgid "PerformanceBar|object"
+msgstr ""
+
+msgid "PerformanceBar|wall"
msgstr ""
msgid "Period in seconds"
@@ -24370,7 +24728,7 @@ msgid "Permissions, LFS, 2FA"
msgstr ""
msgid "Personal Access Token"
-msgstr ""
+msgstr "Personlig adgangstoken"
msgid "Personal Access Token prefix"
msgstr ""
@@ -24379,7 +24737,7 @@ msgid "Personal access tokens are not revoked upon expiration."
msgstr ""
msgid "Personal project creation is not allowed. Please contact your administrator with questions"
-msgstr ""
+msgstr "Oprettelse af personligt projekt er ikke tilladt. Kontakt venligst din administrator med spørgsmål"
msgid "Personal projects"
msgstr "Personlige projekter"
@@ -24394,7 +24752,7 @@ msgid "Phabricator Server URL"
msgstr ""
msgid "Phabricator Tasks"
-msgstr ""
+msgstr "Phabricator-opgaver"
msgid "Pick a name"
msgstr "Vælg et navn"
@@ -24406,7 +24764,7 @@ msgid "Pipeline"
msgstr "Pipeline"
msgid "Pipeline %{label}"
-msgstr ""
+msgstr "Pipeline %{label}"
msgid "Pipeline %{label} for \"%{dataTitle}\""
msgstr ""
@@ -24418,13 +24776,13 @@ msgid "Pipeline IID"
msgstr "Pipeline-iid"
msgid "Pipeline Schedule"
-msgstr ""
+msgstr "Pipelineplanlægning"
msgid "Pipeline Schedules"
-msgstr ""
+msgstr "Pipelineplanlægninger"
msgid "Pipeline URL"
-msgstr ""
+msgstr "Pipeline-URL"
msgid "Pipeline durations for the last 30 commits"
msgstr ""
@@ -24442,31 +24800,31 @@ msgid "Pipeline status emails"
msgstr ""
msgid "Pipeline subscriptions"
-msgstr ""
+msgstr "Pipelineabonnementer"
msgid "Pipeline subscriptions trigger a new pipeline on the default branch of this project when a pipeline successfully completes for a new tag on the %{default_branch_docs} of the subscribed project."
msgstr ""
msgid "Pipeline triggers"
-msgstr ""
+msgstr "Pipelineudløsere"
msgid "Pipeline: %{status}"
-msgstr ""
+msgstr "Pipeline: %{status}"
msgid "PipelineCharts|An error has occurred when retrieving the analytics data"
-msgstr ""
+msgstr "Der er opstået en fejl under hentning af analysedataene"
msgid "PipelineCharts|An error has occurred when retrieving the pipelines data"
-msgstr ""
+msgstr "Der er opstået en fejl under hentning af pipelinedataene"
msgid "PipelineCharts|An unknown error occurred while processing CI/CD analytics."
msgstr ""
msgid "PipelineCharts|CI/CD Analytics"
-msgstr ""
+msgstr "CI-/CD-analyse"
msgid "PipelineCharts|Failed:"
-msgstr ""
+msgstr "Mislykkede:"
msgid "PipelineCharts|Overall statistics"
msgstr ""
@@ -24478,28 +24836,28 @@ msgid "PipelineCharts|Successful:"
msgstr ""
msgid "PipelineCharts|There was an error parsing the data for the charts."
-msgstr ""
+msgstr "Der opstod en fejl ved fortolkning af dataene for diagrammerne."
msgid "PipelineCharts|Total:"
-msgstr ""
+msgstr "I alt:"
msgid "PipelineEditorTutorial|Browse %{linkStart}CI/CD examples and templates%{linkEnd}"
msgstr ""
msgid "PipelineEditorTutorial|Commit the file to your repository. The pipeline then runs automatically."
-msgstr ""
+msgstr "Commit filen til dit depot. Pipelinen kører herefter automatisk."
msgid "PipelineEditorTutorial|Get started with GitLab CI/CD"
msgstr ""
msgid "PipelineEditorTutorial|GitLab CI/CD can automatically build, test, and deploy your application."
-msgstr ""
+msgstr "GitLab CI/CD kan automatisk bygge, teste og udsende dit program."
msgid "PipelineEditorTutorial|If you’re using a self-managed GitLab instance, %{linkStart}make sure your instance has runners available.%{linkEnd}"
msgstr ""
msgid "PipelineEditorTutorial|Learn more about %{linkStart}GitLab CI/CD concepts%{linkEnd}"
-msgstr ""
+msgstr "Lær mere om %{linkStart}GitLab CI-/CD-koncepter%{linkEnd}"
msgid "PipelineEditorTutorial|Make your pipeline more efficient with the %{linkStart}Needs keyword%{linkEnd}"
msgstr ""
@@ -24514,7 +24872,7 @@ msgid "PipelineEditorTutorial|The pipeline stages and jobs are defined in a %{co
msgstr ""
msgid "PipelineEditorTutorial|The pipeline status is at the top of the page."
-msgstr ""
+msgstr "Pipelinestatussen er øverst på siden."
msgid "PipelineEditorTutorial|This template creates a simple test pipeline. To use it:"
msgstr ""
@@ -24562,13 +24920,13 @@ msgid "PipelineSchedules|Inactive"
msgstr "Inaktiv"
msgid "PipelineSchedules|Next Run"
-msgstr ""
+msgstr "Næste kørsel"
msgid "PipelineSchedules|None"
msgstr "Ingen"
msgid "PipelineSchedules|Provide a short description for this pipeline"
-msgstr ""
+msgstr "Angiv en kort beskrivelse til pipelinen"
msgid "PipelineSchedules|Take ownership"
msgstr "Tag ejerskab"
@@ -24579,6 +24937,48 @@ msgstr "MÃ¥l"
msgid "PipelineSchedules|Variables"
msgstr "Variabler"
+msgid "PipelineSource|API"
+msgstr ""
+
+msgid "PipelineSource|Chat"
+msgstr ""
+
+msgid "PipelineSource|External"
+msgstr ""
+
+msgid "PipelineSource|External Pull Request"
+msgstr ""
+
+msgid "PipelineSource|Merge Request"
+msgstr ""
+
+msgid "PipelineSource|On-Demand DAST Scan"
+msgstr ""
+
+msgid "PipelineSource|On-Demand DAST Validation"
+msgstr ""
+
+msgid "PipelineSource|Parent Pipeline"
+msgstr ""
+
+msgid "PipelineSource|Pipeline"
+msgstr ""
+
+msgid "PipelineSource|Push"
+msgstr ""
+
+msgid "PipelineSource|Schedule"
+msgstr ""
+
+msgid "PipelineSource|Trigger"
+msgstr ""
+
+msgid "PipelineSource|Web"
+msgstr ""
+
+msgid "PipelineSource|Web IDE"
+msgstr ""
+
msgid "PipelineStatusTooltip|Pipeline: %{ciStatus}"
msgstr "Pipeline: %{ciStatus}"
@@ -24589,7 +24989,7 @@ msgid "Pipelines"
msgstr "Pipelines"
msgid "Pipelines charts"
-msgstr ""
+msgstr "Pipelinediagrammer"
msgid "Pipelines for merge requests are configured. A detached pipeline runs in the context of the merge request, and not against the merged result. Learn more in the documentation for Pipelines for Merged Results."
msgstr ""
@@ -24607,7 +25007,7 @@ msgid "Pipelines|Are you sure you want to run this pipeline?"
msgstr "Er du sikker på, at du vil køre pipelinen?"
msgid "Pipelines|Build with confidence"
-msgstr ""
+msgstr "Byg med selvtillid"
msgid "Pipelines|By revoking a trigger you will break any processes making use of it. Are you sure?"
msgstr ""
@@ -24622,16 +25022,16 @@ msgid "Pipelines|Child pipeline"
msgstr ""
msgid "Pipelines|Clear runner caches"
-msgstr ""
+msgstr "Ryd runnermellemlagre"
msgid "Pipelines|Copy trigger token"
-msgstr ""
+msgstr "Kopiér udløsertoken"
msgid "Pipelines|Could not load artifacts."
msgstr "Kunne ikke indlæse artefakter."
msgid "Pipelines|Could not load merged YAML content"
-msgstr ""
+msgstr "Kunne ikke indlæse sammenlagt YAML-indhold"
msgid "Pipelines|Description"
msgstr "Beskrivelse"
@@ -24658,7 +25058,7 @@ msgid "Pipelines|Improve code quality with GitLab CI/CD"
msgstr "Forbedr kodekvalitet med GitLab CI/CD"
msgid "Pipelines|Install GitLab Runners"
-msgstr ""
+msgstr "Installer GitLab-runnere"
msgid "Pipelines|It is recommended the code is reviewed thoroughly before running this pipeline with the parent project's CI resource."
msgstr ""
@@ -24667,10 +25067,10 @@ msgid "Pipelines|Last Used"
msgstr "Sidst brugt"
msgid "Pipelines|Learn about Runners"
-msgstr ""
+msgstr "Lær om runnere"
msgid "Pipelines|Lint"
-msgstr ""
+msgstr "Lint"
msgid "Pipelines|Loading Pipelines"
msgstr "Indlæser pipelines"
@@ -24679,7 +25079,7 @@ msgid "Pipelines|Loading pipelines"
msgstr "Indlæser pipelines"
msgid "Pipelines|Merged YAML is view only"
-msgstr ""
+msgstr "Sammenlagt YAML er kun visning"
msgid "Pipelines|More Information"
msgstr "Mere information"
@@ -24697,13 +25097,13 @@ msgid "Pipelines|Pipeline Editor"
msgstr ""
msgid "Pipelines|Project cache successfully reset."
-msgstr ""
+msgstr "Projektmellemlager nulstillet."
msgid "Pipelines|Revoke"
msgstr "Tilbagekald"
msgid "Pipelines|Something went wrong while cleaning runners cache."
-msgstr ""
+msgstr "Noget gik galt under rensning af runnermellemlager."
msgid "Pipelines|The %{namespace_name} namespace has %{percentage}%% or less Shared Runner Pipeline minutes remaining. After it runs out, no new jobs or pipelines in its projects will run."
msgstr ""
@@ -24712,19 +25112,19 @@ msgid "Pipelines|The %{namespace_name} namespace has exceeded its pipeline minut
msgstr ""
msgid "Pipelines|The CI configuration was not loaded, please try again."
-msgstr ""
+msgstr "CI-konfigurationen blev ikke indlæst. Prøv venligst igen."
msgid "Pipelines|The GitLab CI configuration could not be updated."
-msgstr ""
+msgstr "GitLab CI-konfigurationen kunne ikke opdateres."
msgid "Pipelines|There are currently no finished pipelines."
-msgstr ""
+msgstr "Der er i øjeblikket ingen færdige pipelines."
msgid "Pipelines|There are currently no pipelines."
-msgstr ""
+msgstr "Der er i øjeblikket ingen pipelines."
msgid "Pipelines|There was an error fetching the pipelines. Try again in a few moments or contact your support team."
-msgstr ""
+msgstr "Der opstod en fejl under hentning af pipelinesne. Prøv igen om lidt eller kontakt dit supportteam."
msgid "Pipelines|This GitLab CI configuration is invalid."
msgstr ""
@@ -24733,25 +25133,25 @@ msgid "Pipelines|This GitLab CI configuration is invalid:"
msgstr ""
msgid "Pipelines|This GitLab CI configuration is invalid: %{reason}."
-msgstr ""
+msgstr "GitLab CI-konfigurationen er ugyldig: %{reason}."
msgid "Pipelines|This GitLab CI configuration is valid."
msgstr ""
msgid "Pipelines|This is a child pipeline within the parent pipeline"
-msgstr ""
+msgstr "Dette er en barnepipeline i forælderpipelinen"
msgid "Pipelines|This pipeline will run code originating from a forked project merge request. This means that the code can potentially have security considerations like exposing CI variables."
msgstr ""
msgid "Pipelines|This project is not currently set up to run pipelines."
-msgstr ""
+msgstr "Projektet er i øjeblikket ikke opsat til at køre pipelines."
msgid "Pipelines|To keep your codebase simple, readable, and accessible to contributors, use GitLab CI/CD to analyze your code quality with every push to your project."
msgstr ""
msgid "Pipelines|Token"
-msgstr ""
+msgstr "Token"
msgid "Pipelines|Trigger user has insufficient permissions to project"
msgstr ""
@@ -24763,28 +25163,28 @@ msgid "Pipelines|Use a sample %{codeStart}.gitlab-ci.yml%{codeEnd} template file
msgstr ""
msgid "Pipelines|Use a sample CI/CD template"
-msgstr ""
+msgstr "Brug et prøve CI-/CD-skabelon"
msgid "Pipelines|Use a template based on your project's language or framework to get started with GitLab CI/CD."
msgstr ""
msgid "Pipelines|Use template"
-msgstr ""
+msgstr "Brug skabelon"
msgid "Pipelines|Validating GitLab CI configuration…"
msgstr ""
msgid "Pipelines|View merged YAML"
-msgstr ""
+msgstr "Vis sammenlagt YAML"
msgid "Pipelines|Visualize"
-msgstr ""
+msgstr "Visualiser"
msgid "Pipelines|invalid"
msgstr "ugyldig"
msgid "Pipelines|parent"
-msgstr ""
+msgstr "forælder"
msgid "Pipeline|Actions"
msgstr "Handlinger"
@@ -24793,7 +25193,7 @@ msgid "Pipeline|Branch name"
msgstr "Grennavn"
msgid "Pipeline|Branches or tags could not be loaded."
-msgstr ""
+msgstr "Grene og mærkater kunne ikke indlæses."
msgid "Pipeline|Canceled"
msgstr "Annulleret"
@@ -24817,7 +25217,7 @@ msgid "Pipeline|Date"
msgstr "Dato"
msgid "Pipeline|Detached merge request pipeline"
-msgstr ""
+msgstr "Løsrevet sammenlægningsanmodningspipeline"
msgid "Pipeline|Duration"
msgstr "Varighed"
@@ -24847,7 +25247,7 @@ msgid "Pipeline|Passed"
msgstr ""
msgid "Pipeline|Pending"
-msgstr ""
+msgstr "Afventer"
msgid "Pipeline|Pipeline"
msgstr "Pipeline"
@@ -24862,13 +25262,13 @@ msgid "Pipeline|Pipelines"
msgstr ""
msgid "Pipeline|Raw text search is not currently supported. Please use the available search tokens."
-msgstr ""
+msgstr "Rå tekstsøgning understøttes ikke i øjeblikket. Brug venligst de tilgængelige søgetokens."
msgid "Pipeline|Run for branch name or tag"
msgstr ""
msgid "Pipeline|Run pipeline"
-msgstr ""
+msgstr "Kør pipeline"
msgid "Pipeline|Running"
msgstr "Kører"
@@ -24877,70 +25277,31 @@ msgid "Pipeline|Skipped"
msgstr "Sprunget over"
msgid "Pipeline|Source"
-msgstr ""
-
-msgid "Pipeline|Source|API"
-msgstr ""
-
-msgid "Pipeline|Source|Chat"
-msgstr ""
-
-msgid "Pipeline|Source|External"
-msgstr ""
-
-msgid "Pipeline|Source|External Pull Request"
-msgstr ""
-
-msgid "Pipeline|Source|Merge Request"
-msgstr ""
-
-msgid "Pipeline|Source|On-Demand DAST Scan"
-msgstr ""
-
-msgid "Pipeline|Source|On-Demand DAST Validation"
-msgstr ""
-
-msgid "Pipeline|Source|Parent Pipeline"
-msgstr ""
-
-msgid "Pipeline|Source|Pipeline"
-msgstr ""
-
-msgid "Pipeline|Source|Push"
-msgstr ""
-
-msgid "Pipeline|Source|Schedule"
-msgstr ""
-
-msgid "Pipeline|Source|Trigger"
-msgstr ""
-
-msgid "Pipeline|Source|Web"
-msgstr ""
+msgstr "Kilde"
-msgid "Pipeline|Source|Web IDE"
+msgid "Pipeline|Source|Security Policy"
msgstr ""
msgid "Pipeline|Specify variable values to be used in this run. The values specified in %{linkStart}CI/CD settings%{linkEnd} will be used by default."
msgstr ""
msgid "Pipeline|Stages"
-msgstr ""
+msgstr "Stadier"
msgid "Pipeline|Status"
msgstr "Status"
msgid "Pipeline|Stop pipeline"
-msgstr ""
+msgstr "Stop pipeline"
msgid "Pipeline|Stop pipeline #%{pipelineId}?"
-msgstr ""
+msgstr "Stop pipeline #%{pipelineId}?"
msgid "Pipeline|Tag name"
msgstr "Mærkatnavn"
msgid "Pipeline|Test coverage"
-msgstr ""
+msgstr "Testdækning"
msgid "Pipeline|This change will decrease the overall test coverage if merged."
msgstr ""
@@ -24952,10 +25313,10 @@ msgid "Pipeline|This change will not change the overall test coverage if merged.
msgstr ""
msgid "Pipeline|Trigger author"
-msgstr ""
+msgstr "Udløserforfatter"
msgid "Pipeline|Triggerer"
-msgstr ""
+msgstr "Udløsere"
msgid "Pipeline|Value"
msgstr "Værdi"
@@ -24969,8 +25330,8 @@ msgstr "Vis pipeline"
msgid "Pipeline|We are currently unable to fetch pipeline data"
msgstr ""
-msgid "Pipeline|You’re about to stop pipeline %{pipelineId}."
-msgstr "Du er ved at stoppe pipelinen %{pipelineId}."
+msgid "Pipeline|You’re about to stop pipeline #%{pipelineId}."
+msgstr ""
msgid "Pipeline|for"
msgstr ""
@@ -24979,10 +25340,10 @@ msgid "Pipeline|on"
msgstr ""
msgid "Pipeline|with stage"
-msgstr ""
+msgstr "med stadie"
msgid "Pipeline|with stages"
-msgstr ""
+msgstr "med stadier"
msgid "PivotalTrackerService|Add commit messages as comments to Pivotal Tracker stories."
msgstr "Tilføj commit-meddelelser som kommentarer til Pivotal Tracker-historier."
@@ -24994,6 +25355,9 @@ msgid "PivotalTrackerService|Pivotal Tracker API token. User must have access to
msgstr ""
msgid "Plain diff"
+msgstr "Ren diff"
+
+msgid "Plain-text response to send to clients that hit a rate limit"
msgstr ""
msgid "Plan:"
@@ -25009,10 +25373,10 @@ msgid "Play"
msgstr "Afspil"
msgid "Play all manual"
-msgstr ""
+msgstr "Afspil alle manuelt"
msgid "Please %{link_to_register} or %{link_to_sign_in} to comment"
-msgstr ""
+msgstr "Venligst %{link_to_register} eller %{link_to_sign_in} for at kommentere"
msgid "Please %{startTagRegister}register%{endRegisterTag} or %{startTagSignIn}sign in%{endSignInTag} to reply"
msgstr ""
@@ -25024,19 +25388,19 @@ msgid "Please add a comment in the text area above"
msgstr "Tilføj venligst en kommentar i tekstområdet ovenover"
msgid "Please check the configuration file for this chart"
-msgstr ""
+msgstr "Tjek venligst konfigurationsfilen til diagrammet"
msgid "Please check the configuration file to ensure that a collection of charts has been declared."
-msgstr ""
+msgstr "Tjek venligst konfigurationsfilen for at sikre at en samling diagrammer er blevet deklareret."
msgid "Please check the configuration file to ensure that it is available and the YAML is valid"
-msgstr ""
+msgstr "Tjek venligst konfigurationsfilen for at sikre at den er tilgængelig og at YAML'en er gyldig"
msgid "Please check your email %{email} to confirm your account"
msgstr "Tjek venligst din e-mail %{email} for at bekræfte din konto"
msgid "Please check your email (%{email}) to verify that you own this address and unlock the power of CI/CD. Didn't receive it? %{resend_link}. Wrong email address? %{update_link}."
-msgstr ""
+msgstr "Tjek venligst din e-mail (%{email}) for at bekræfte at du ejer adressen og lås op for styrken i CI/CD. Har du ikke modtages den? %{resend_link}. Forkert e-mailadresse? %{update_link}."
msgid "Please choose a file"
msgstr "Vælg venligst en fil"
@@ -25048,13 +25412,13 @@ msgid "Please confirm your email address"
msgstr "Bekræft venligst din e-mailadresse"
msgid "Please contact an admin to register runners."
-msgstr ""
+msgstr "Kontakt venligst en administrator for at registrere runnere."
msgid "Please contact your GitLab administrator if you think this is an error."
-msgstr ""
+msgstr "Kontakt venligst din GitLab-administrator hvis du tror det er en fejl."
msgid "Please contact your administrator with any questions."
-msgstr ""
+msgstr "Kontakt venligst din administrator hvis du har nogle spørgsmål."
msgid "Please contact your administrator."
msgstr "Kontakt venligst din administrator."
@@ -25063,16 +25427,16 @@ msgid "Please convert %{linkStart}them to Git%{linkEnd}, and go through the %{li
msgstr ""
msgid "Please copy, download, or print your recovery codes before proceeding."
-msgstr ""
+msgstr "Kopiér, download eller udskriv venligst dine gendannelseskoder inden du fortsætter."
msgid "Please create a password for your new account."
msgstr "Opret venligst en adgangskode til din nye konto."
msgid "Please create a username with only alphanumeric characters."
-msgstr ""
+msgstr "Opret venligst et brugernavn som kun består af alfanumeriske tegn."
msgid "Please create an index before enabling indexing"
-msgstr ""
+msgstr "Opret venligst et indeks inden aktivering af indeksering"
msgid "Please delete your current license if you want to downgrade to the free plan."
msgstr "Slet venligst din nuværende licens hvis du vil nedgradere til den gratis plan."
@@ -25084,7 +25448,7 @@ msgid "Please enter a non-negative number"
msgstr ""
msgid "Please enter a number greater than %{number} (from the project settings)"
-msgstr ""
+msgstr "Indtast venligst et tal som er større end %{number} (fra projektindstillingerne)"
msgid "Please enter a valid URL format, ex: http://www.example.com/home"
msgstr "Indtast venligst et gyldigt URL-format. F.eks.: http://www.example.com/home"
@@ -25099,7 +25463,7 @@ msgid "Please enter or upload a valid license."
msgstr "Indtast eller upload venligst en gyldig licens."
msgid "Please fill in a descriptive name for your group."
-msgstr ""
+msgstr "Udfyld venligst med et beskrivende navn på dit gruppe."
msgid "Please fill out this field."
msgstr "Udfyld venligst feltet."
@@ -25138,16 +25502,13 @@ msgid "Please provide a valid email address."
msgstr "Angiv venligst en gyldig e-mailadresse."
msgid "Please provide attributes to update"
-msgstr ""
-
-msgid "Please provide your username or email address."
-msgstr "Angiv venligst dit brugernavn eller e-mailadresse."
+msgstr "Angiv venligst attributter for at opdatere"
msgid "Please reach out if you have any questions and we'll be happy to assist."
msgstr ""
msgid "Please refer to %{docs_url}"
-msgstr ""
+msgstr "Se venligst %{docs_url}"
msgid "Please select"
msgstr "Vælg venligst"
@@ -25171,10 +25532,10 @@ msgid "Please select a valid target branch."
msgstr "Vælg venligst en gyldig målgren."
msgid "Please select and add a member"
-msgstr ""
+msgstr "Vælg og tilføj venligst et medlem"
msgid "Please select at least one filter to see results"
-msgstr ""
+msgstr "Vælg venligst mindst ét filter for at se resultater"
msgid "Please select what should be included in each exported requirement."
msgstr ""
@@ -25183,10 +25544,7 @@ msgid "Please select..."
msgstr "Vælg venligst ..."
msgid "Please set a new password before proceeding."
-msgstr ""
-
-msgid "Please share your feedback about %{featureName} %{linkStart}in this issue%{linkEnd} to help us improve the experience."
-msgstr "Del venligst din feedback om %{featureName} %{linkStart}i problemstillingen%{linkEnd} for at hjælpe os med at forbedre oplevelsen."
+msgstr "Indstil venligst en ny adgangskode inden du fortsætter."
msgid "Please solve the captcha"
msgstr "Løs venligst captcha'en"
@@ -25195,7 +25553,7 @@ msgid "Please try again"
msgstr "Prøv venligst igen"
msgid "Please try and refresh the page. If the problem persists please contact support."
-msgstr ""
+msgstr "Prøv venligst at opdatere siden. Hvis problemet fortsætter, så kontakt venligst supporten."
msgid "Please type %{phrase_code} to proceed or close this modal to cancel."
msgstr ""
@@ -25207,22 +25565,22 @@ msgid "Please use this form to report to the admin users who create spam issues,
msgstr ""
msgid "Please wait a moment, this page will automatically refresh when ready."
-msgstr ""
+msgstr "Vent venligst et øjeblik. Siden opdateres automatisk når den er klar."
msgid "Please wait while we connect to your repository. Refresh at will."
-msgstr ""
+msgstr "Vent venligst mens vi opretter forbindelse til dit depot. Opdater efter ønske."
msgid "Please wait while we import the repository for you. Refresh at will."
-msgstr ""
+msgstr "Vent venligst mens vi importerer depotet for dig. Opdater efter ønske."
msgid "Pod does not exist"
-msgstr ""
+msgstr "Pod findes ikke"
msgid "Pod not found"
-msgstr ""
+msgstr "Pod ikke fundet"
msgid "Pods in use"
-msgstr ""
+msgstr "Pods i brug"
msgid "Point to any links you like: documentation, built binaries, or other related materials. These can be internal or external links from your GitLab instance. Duplicate URLs are not allowed."
msgstr ""
@@ -25246,10 +25604,10 @@ msgid "Port"
msgstr "Port"
msgid "Postman collection"
-msgstr ""
+msgstr "Postman-samling"
msgid "Postman collection file path or URL"
-msgstr ""
+msgstr "Filsti eller URL for Postman-samling"
msgid "Pre-defined push rules."
msgstr ""
@@ -25300,7 +25658,7 @@ msgid "Preferences|Gitpod"
msgstr "Gitpod"
msgid "Preferences|Homepage content"
-msgstr "Indhold på startside"
+msgstr "Indhold for startside"
msgid "Preferences|Instead of all the files changed, show only one file at a time. To switch between files, use the file browser."
msgstr "Vis kun én fil ad gangen frem for alle de ændrede filer. Brug filvælgeren til at skifte mellem filerne."
@@ -25324,7 +25682,7 @@ msgid "Preferences|Render whitespace characters in the Web IDE"
msgstr "Gengiv blanktegn i Web IDE"
msgid "Preferences|Show one file at a time on merge request's Changes tab"
-msgstr ""
+msgstr "Vis én fil ad gangen i sammenlægningsanmodningens Ændringer-faneblad"
msgid "Preferences|Show whitespace changes in diffs"
msgstr "Vis blanktegnsændringer i diff'er"
@@ -25342,7 +25700,7 @@ msgid "Preferences|Tab width"
msgstr "Bredde på tabulatorstop"
msgid "Preferences|This feature is experimental and translations are not complete yet"
-msgstr "Funktionen er eksperimentel og oversættelserne er ikke færdige endnu"
+msgstr "Funktionen er eksperimentel og oversættelserne er endnu ikke færdig"
msgid "Preferences|This setting allows you to customize the appearance of the syntax."
msgstr "Indstillingen giver dig mulighed for at tilpasse udseendet på syntaksen."
@@ -25365,11 +25723,14 @@ msgstr "Forrige"
msgid "Prevent adding new members to project membership within this group"
msgstr ""
-msgid "Prevent editing approval rules in projects and merge requests."
+msgid "Prevent auto-stopping"
msgstr ""
+msgid "Prevent editing approval rules in projects and merge requests."
+msgstr "Forhindr redigering af godkendelsesregler i projekter og sammenlægningsanmodninger."
+
msgid "Prevent environment from auto-stopping"
-msgstr ""
+msgstr "Forhindr miljø i at stoppe automatisk"
msgid "Prevent project forking outside current group"
msgstr ""
@@ -25377,7 +25738,7 @@ msgstr ""
msgid "Prevent users from changing their profile name"
msgstr ""
-msgid "Prevent users from performing write operations on GitLab while performing maintenance."
+msgid "Prevent users from performing write operations while GitLab maintenance is in progress."
msgstr ""
msgid "Preview"
@@ -25396,7 +25757,7 @@ msgid "Preview payload"
msgstr ""
msgid "Previous Artifacts"
-msgstr "Forrige artefakter"
+msgstr "Tidligere artefakter"
msgid "Previous commit"
msgstr "Forrige commit"
@@ -25417,28 +25778,28 @@ msgid "Primary Action"
msgstr "Primær handling"
msgid "Print codes"
-msgstr ""
+msgstr "Vis koder"
msgid "Prioritize"
-msgstr ""
+msgstr "Prioriter"
msgid "Prioritize label"
-msgstr ""
+msgstr "Prioriter etiket"
msgid "Prioritized Labels"
msgstr ""
msgid "Prioritized label"
-msgstr ""
+msgstr "Prioriteret etiket"
msgid "Priority"
msgstr "Prioritet"
msgid "Private"
-msgstr "Privat"
+msgstr "Private"
msgid "Private - Guest users are not allowed to view detailed release information like title and source code."
-msgstr ""
+msgstr "Privat - gæstebrugere har ikke tilladelse til at vise detaljerede udgivelsesinformation såsom titel og kildekode."
msgid "Private - Project access must be granted explicitly to each user. If this project is part of a group, access will be granted to members of the group."
msgstr ""
@@ -25456,13 +25817,13 @@ msgid "Private projects Minutes cost factor"
msgstr ""
msgid "Private projects can be created in your personal namespace with:"
-msgstr ""
+msgstr "Private projekter kan oprettes i dit personlige navnerum med:"
msgid "Proceed"
msgstr "Fortsæt"
msgid "Product Analytics"
-msgstr ""
+msgstr "Produktanalyse"
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 ""
@@ -25471,13 +25832,13 @@ msgid "Productivity"
msgstr "Produktivitet"
msgid "Productivity Analytics"
-msgstr ""
+msgstr "Produktivitetsanalyse"
msgid "Productivity analytics can help identify the problems that are delaying your team"
msgstr ""
msgid "ProductivityAanalytics|Merge requests"
-msgstr ""
+msgstr "Sammenlægningsanmodninger"
msgid "ProductivityAanalytics|is earlier than the allowed minimum date"
msgstr ""
@@ -25504,7 +25865,7 @@ msgid "ProductivityAnalytics|Merge Requests"
msgstr "Sammenlægningsanmodninger"
msgid "ProductivityAnalytics|Merge date"
-msgstr ""
+msgstr "Sammenlægningsdato"
msgid "ProductivityAnalytics|Merge requests"
msgstr "Sammenlægningsanmodninger"
@@ -25534,10 +25895,10 @@ msgid "ProfileSession|on"
msgstr ""
msgid "Profiles| You are about to permanently delete %{yourAccount}, and all of the issues, merge requests, and groups linked to your account. Once you confirm %{deleteAccount}, it cannot be undone or recovered."
-msgstr ""
+msgstr " Du er ved at slette %{yourAccount} og alle de problemstillinger, sammenlægningsanmodninger og grupper som er linket til din konto permanent. Når du har bekræftet %{deleteAccount}, så kan det ikke fortrydes eller gendannes."
msgid "Profiles| You are going to change the username %{currentUsernameBold} to %{newUsernameBold}. Profile and projects will be redirected to the %{newUsername} namespace but this redirect will expire once the %{currentUsername} namespace is registered by another user or group. Please update your Git repository remotes as soon as possible."
-msgstr ""
+msgstr " Du er ved at ændre brugernavnet %{currentUsernameBold} til %{newUsernameBold}. Profil og projekter vil blive omdirigeret til navnerummet %{newUsername} men omdirigeringen udløber når navnerummet %{currentUsername} registreres af en anden bruger eller gruppe. Opdater venligst dit Git-depotremotes så snart som muligt."
msgid "Profiles|\"Busy\" will be shown next to your name"
msgstr "\"Optaget\" vises ved siden af dit navn"
@@ -25567,7 +25928,7 @@ msgid "Profiles|Add status emoji"
msgstr "Tilføj statusemoji"
msgid "Profiles|An error occurred while updating your username, please try again."
-msgstr "Der opstod en fejl under opdatering af dit brugernavn, prøv venligst igen."
+msgstr "Der opstod en fejl under opdatering af dit brugernavn. Prøv venligst igen."
msgid "Profiles|Avatar cropper"
msgstr "Beskæring af avatar"
@@ -25618,7 +25979,7 @@ msgid "Profiles|Current status"
msgstr "Nuværende status"
msgid "Profiles|Default notification email"
-msgstr ""
+msgstr "Standard underretnings e-mail"
msgid "Profiles|Delete account"
msgstr "Slet konto"
@@ -25648,6 +26009,9 @@ msgid "Profiles|Enter how your name is pronounced to help people address you cor
msgstr ""
msgid "Profiles|Enter your name, so people you know can recognize you"
+msgstr "Indtast dit navn, så dem du kender kan genkende dig"
+
+msgid "Profiles|Enter your password to confirm the email change"
msgstr ""
msgid "Profiles|Enter your pronouns to let people know how to refer to you"
@@ -25660,22 +26024,22 @@ msgid "Profiles|Expired:"
msgstr "Udløbet:"
msgid "Profiles|Expires at"
-msgstr ""
+msgstr "Udløber"
msgid "Profiles|Expires:"
msgstr "Udløber:"
msgid "Profiles|Feed token was successfully reset"
-msgstr ""
+msgstr "Feedtoken blev nulstillet"
msgid "Profiles|Full name"
-msgstr ""
+msgstr "Fulde navn"
msgid "Profiles|GitLab is unable to verify your identity automatically. For security purposes, you must set a password by %{openingTag}resetting your password%{closingTag} to delete your account."
msgstr ""
msgid "Profiles|Give your individual key a title. This will be publicly visible."
-msgstr ""
+msgstr "Giv din individuelle nøgle en titel. Det vil være synligt offentligt."
msgid "Profiles|If after setting a password, the option to delete your account is still not available, please email %{data_request} to begin the account deletion process."
msgstr ""
@@ -25687,7 +26051,7 @@ msgid "Profiles|Incoming email token was successfully reset"
msgstr ""
msgid "Profiles|Increase your account's security by enabling Two-Factor Authentication (2FA)"
-msgstr "Forbedr sikkerheden på din konto ved at aktivere tofaktorgodkendelse (2FG)"
+msgstr "Forbedr sikkerheden på din konto ved at aktivere totrinsgodkendelse (2TG)"
msgid "Profiles|Invalid key."
msgstr "Ugyldig nøgle."
@@ -25717,7 +26081,7 @@ msgid "Profiles|Learn more"
msgstr "Lær mere"
msgid "Profiles|Location"
-msgstr ""
+msgstr "Placering"
msgid "Profiles|Made a private contribution"
msgstr ""
@@ -25726,7 +26090,7 @@ msgid "Profiles|Main settings"
msgstr "Hovedindstillinger"
msgid "Profiles|Manage two-factor authentication"
-msgstr "HÃ¥ndter tofaktorgodkendelse"
+msgstr "HÃ¥ndter totrinsgodkendelse"
msgid "Profiles|No file chosen."
msgstr "Ingen fil valgt."
@@ -25759,7 +26123,7 @@ msgid "Profiles|Public email"
msgstr "Offentlig e-mail"
msgid "Profiles|Publicly visible private SSH keys can compromise your system."
-msgstr ""
+msgstr "Private SSH-nøgler som er synlige offentligt kan kompromittere dit system."
msgid "Profiles|Remove avatar"
msgstr "Fjern avatar"
@@ -25771,22 +26135,22 @@ msgid "Profiles|Set your local time zone"
msgstr "Indstil din lokale tidszone"
msgid "Profiles|Social sign-in"
-msgstr ""
+msgstr "Socialt indlogning"
msgid "Profiles|Some options are unavailable for LDAP accounts"
-msgstr ""
+msgstr "Nogle valgmuligheder er utilgængelige for LDAP-kontoer"
msgid "Profiles|Static object token was successfully reset"
-msgstr ""
+msgstr "Statisk objekttoken blev nulstillet"
msgid "Profiles|Tell us about yourself in fewer than 250 characters"
-msgstr ""
+msgstr "Fortæl os om dig selv med færre end 250 tegn"
msgid "Profiles|The ability to update your name has been disabled by your administrator."
msgstr ""
msgid "Profiles|The maximum file size allowed is 200KB."
-msgstr ""
+msgstr "Den maksimale tilladte filstørrelse er 200 KB."
msgid "Profiles|This email will be displayed on your public profile"
msgstr "E-mailen vises på din offentlige profil"
@@ -25795,7 +26159,7 @@ msgid "Profiles|This email will be used for web based operations, such as edits
msgstr ""
msgid "Profiles|This emoji and message will appear on your profile and throughout the interface."
-msgstr ""
+msgstr "Emojien og meddelelsen vises på din profil og overalt i brugerfladen."
msgid "Profiles|This information will appear on your profile"
msgstr "Informationen vises på din profil"
@@ -25804,10 +26168,10 @@ msgid "Profiles|Time settings"
msgstr "Tidsindstillinger"
msgid "Profiles|Two-Factor Authentication"
-msgstr "Tofaktorgodkendelse"
+msgstr "Totrinsgodkendelse"
msgid "Profiles|Type your %{confirmationValue} to confirm:"
-msgstr ""
+msgstr "Skriv din %{confirmationValue} for at bekræfte:"
msgid "Profiles|Typically starts with \"ssh-ed25519 …\" or \"ssh-rsa …\""
msgstr "Begynder typisk med \"ssh-ed25519 …\" eller \"ssh-rsa …\""
@@ -25828,7 +26192,7 @@ msgid "Profiles|User ID"
msgstr "Bruger-id"
msgid "Profiles|Username change failed - %{message}"
-msgstr ""
+msgstr "Ændring af brugernavn mislykkedes - %{message}"
msgid "Profiles|Username successfully changed"
msgstr "Brugernavnet blev ændret"
@@ -25864,7 +26228,7 @@ msgid "Profiles|You must transfer ownership or delete these groups before you ca
msgstr ""
msgid "Profiles|Your LinkedIn profile name from linkedin.com/in/profilename"
-msgstr ""
+msgstr "Dit LinkedIn-profilnavn fra linkedin.com/in/profilnavn"
msgid "Profiles|Your account is currently an owner in these groups:"
msgstr ""
@@ -25873,7 +26237,7 @@ msgid "Profiles|Your email address was automatically set based on your %{provide
msgstr ""
msgid "Profiles|Your location was automatically set based on your %{provider_label} account"
-msgstr ""
+msgstr "Din placering blev automatisk indstillet baseret på din %{provider_label}-konto"
msgid "Profiles|Your name was automatically set based on your %{provider_label} account, so people you know can recognize you"
msgstr ""
@@ -25884,12 +26248,12 @@ msgstr "Din status"
msgid "Profiles|e.g. My MacBook key"
msgstr "f.eks. Min MacBook-nøgle"
+msgid "Profiles|https://website.com"
+msgstr ""
+
msgid "Profiles|username"
msgstr "brugernavn"
-msgid "Profiles|website.com"
-msgstr ""
-
msgid "Profiles|your account"
msgstr "din konto"
@@ -25909,31 +26273,31 @@ msgid "Project"
msgstr "Projekt"
msgid "Project \"%{name}\" is no longer available. Select another project to continue."
-msgstr ""
+msgstr "Projektet \"%{name}\" er ikke længere tilgængeligt. Vælg et andet projekt for at fortsætte."
msgid "Project %{project_repo} could not be found"
msgstr "Projektet %{project_repo} kunne ikke findes"
msgid "Project & Group can not be assigned at the same time"
-msgstr ""
+msgstr "Projekt og gruppe kan ikke tildeles på samme tid"
msgid "Project '%{project_name}' is being imported."
msgstr "Projektet '%{project_name}' importeres."
msgid "Project '%{project_name}' is in the process of being deleted."
-msgstr ""
+msgstr "Projektet '%{project_name}' er ved at blive slettet."
msgid "Project '%{project_name}' is restored."
-msgstr ""
+msgstr "Projektet '%{project_name}' er gendannet."
msgid "Project '%{project_name}' queued for deletion."
msgstr "Projektet '%{project_name}' er sat i kø til sletning."
msgid "Project '%{project_name}' was successfully created."
-msgstr ""
+msgstr "Projektet '%{project_name}' blev oprettet."
msgid "Project '%{project_name}' was successfully updated."
-msgstr ""
+msgstr "Projektet '%{project_name}' blev opdateret."
msgid "Project '%{project_name}' will be deleted on %{date}"
msgstr ""
@@ -25960,19 +26324,19 @@ msgid "Project access must be granted explicitly to each user. If this project i
msgstr ""
msgid "Project access token creation is disabled in this group. You can still use and manage existing tokens. %{link_start}Learn more.%{link_end}"
-msgstr ""
+msgstr "Oprettelse af projektadgangstoken er deaktiveret i gruppen. Du kan stadigvæk bruge og håndtere eksisterende tokens. %{link_start}Lær mere%{link_end}."
msgid "Project already deleted"
msgstr "Projektet er allerede slettet"
msgid "Project and wiki repositories"
-msgstr ""
+msgstr "Projekt- og wikidepoter"
msgid "Project audit events"
msgstr ""
msgid "Project avatar"
-msgstr ""
+msgstr "Projektavatar"
msgid "Project cannot be shared with the group it is in or one of its ancestors."
msgstr ""
@@ -25990,25 +26354,25 @@ msgid "Project does not have a policy configuration"
msgstr ""
msgid "Project export could not be deleted."
-msgstr ""
+msgstr "Projekteksport kunne ikke slettes."
msgid "Project export download requests"
msgstr ""
msgid "Project export enabled"
-msgstr ""
+msgstr "Projekteksport aktiveret"
msgid "Project export has been deleted."
-msgstr ""
+msgstr "Projekteksport er blevet slettet."
msgid "Project export link has expired. Please generate a new export from your project settings."
msgstr ""
msgid "Project export requests"
-msgstr ""
+msgstr "Projekteksportanmodninger"
msgid "Project export started. A download link will be sent by email and made available on this page."
-msgstr ""
+msgstr "Projekteksport startet. Et downloadlink vil blive sendt med e-mail og gjort tilgængelig på siden."
msgid "Project has too many %{label_for_message} to search"
msgstr ""
@@ -26023,7 +26387,7 @@ msgid "Project information"
msgstr "Projektinformation"
msgid "Project is required when cluster_type is :project"
-msgstr ""
+msgstr "Projekt er krævet når cluster_type er :project"
msgid "Project members"
msgstr "Projektmedlemmer"
@@ -26038,7 +26402,7 @@ msgid "Project name suffix"
msgstr ""
msgid "Project navigation"
-msgstr ""
+msgstr "Projektnavigation"
msgid "Project order will not be saved as local storage is not available."
msgstr ""
@@ -26053,7 +26417,7 @@ msgid "Project security status help page"
msgstr ""
msgid "Project slug"
-msgstr ""
+msgstr "Projektslug"
msgid "Project uploads"
msgstr ""
@@ -26068,7 +26432,7 @@ msgid "Project: %{name}"
msgstr "Projekt: %{name}"
msgid "ProjectActivityRSS|Subscribe"
-msgstr ""
+msgstr "Abonner"
msgid "ProjectCreationLevel|Allowed to create projects"
msgstr ""
@@ -26116,10 +26480,10 @@ msgid "ProjectOverview|Unstar"
msgstr ""
msgid "ProjectOverview|You have reached your project limit"
-msgstr ""
+msgstr "Du har nået din projektgrænse"
msgid "ProjectOverview|You must sign in to star a project"
-msgstr ""
+msgstr "Du skal logge ind for at stjernemarkere et projekt"
msgid "ProjectPage|Copy project ID"
msgstr "Kopiér projekt-id"
@@ -26130,9 +26494,21 @@ msgstr "Projekt-id: %{project_id}"
msgid "ProjectSelect| or group"
msgstr " eller gruppe"
+msgid "ProjectSelect|No matching results"
+msgstr ""
+
msgid "ProjectSelect|Search for project"
msgstr "Søg efter projekt"
+msgid "ProjectSelect|Search projects"
+msgstr ""
+
+msgid "ProjectSelect|Select a project"
+msgstr ""
+
+msgid "ProjectSelect|There was an error fetching the projects. Please try again."
+msgstr ""
+
msgid "ProjectService|Drone server URL"
msgstr ""
@@ -26152,7 +26528,7 @@ msgid "ProjectService|Jenkins server URL"
msgstr ""
msgid "ProjectService|Leave blank to use your current API key"
-msgstr ""
+msgstr "Lad den være tom for at bruge din nuværende API-nøgle"
msgid "ProjectService|Leave blank to use your current password"
msgstr ""
@@ -26170,13 +26546,13 @@ msgid "ProjectService|Perform common operations on GitLab project: %{project_nam
msgstr ""
msgid "ProjectService|Run CI/CD pipelines with Buildkite."
-msgstr ""
+msgstr "Kør CI-/CD-pipelines med Buildkite."
msgid "ProjectService|Run CI/CD pipelines with Drone."
msgstr ""
msgid "ProjectService|Run CI/CD pipelines with JetBrains TeamCity."
-msgstr ""
+msgstr "Kør CI-/CD-pipelines med JetBrains TeamCity."
msgid "ProjectService|TeamCity server URL"
msgstr ""
@@ -26194,10 +26570,10 @@ msgid "ProjectService|Token for the Drone project."
msgstr ""
msgid "ProjectService|Trigger event for new comments on confidential issues."
-msgstr ""
+msgstr "Udløs begivenhed for nye kommentarer på fortrolige problemstillinger."
msgid "ProjectService|Trigger event for new comments."
-msgstr ""
+msgstr "Udløs begivenhed for nye kommentarer."
msgid "ProjectService|Trigger event for new tags pushed to the repository."
msgstr ""
@@ -26206,28 +26582,31 @@ msgid "ProjectService|Trigger event for pushes to the repository."
msgstr ""
msgid "ProjectService|Trigger event when a commit is created or updated."
-msgstr ""
+msgstr "Udløs begivenhed når en commit oprettes eller opdateres."
msgid "ProjectService|Trigger event when a confidential issue is created, updated, or closed."
-msgstr ""
+msgstr "Udløs begivenhed når en fortrolig problemstilling oprettes, opdateres eller lukkes."
msgid "ProjectService|Trigger event when a deployment starts or finishes."
-msgstr ""
+msgstr "Udløs begivenhed når en udsendelse starter eller slutter."
msgid "ProjectService|Trigger event when a merge request is created, updated, or merged."
-msgstr ""
+msgstr "Udløs begivenhed når en sammenlægningsanmodning oprettes, opdateres eller sammenlægges."
msgid "ProjectService|Trigger event when a new, unique alert is recorded."
+msgstr "Udløs begivenhed når en ny unik alertbesked optages."
+
+msgid "ProjectService|Trigger event when a new, unique vulnerability is recorded. (Note: This feature requires an Ultimate plan.)"
msgstr ""
msgid "ProjectService|Trigger event when a pipeline status changes."
-msgstr ""
+msgstr "Udløs begivenhed når en pipelinestatus ændres."
msgid "ProjectService|Trigger event when a wiki page is created or updated."
-msgstr ""
+msgstr "Udløs begivenhed når en wikiside oprettes eller opdateres."
msgid "ProjectService|Trigger event when an issue is created, updated, or closed."
-msgstr ""
+msgstr "Udløs begivenhed når en problemstilling oprettes, opdateres eller lukkes."
msgid "ProjectSettings|%{link_start}What are description templates?%{link_end}"
msgstr "%{link_start}Hvad er beskrivelsesskabeloner?%{link_end}"
@@ -26242,10 +26621,10 @@ msgid "ProjectSettings|Allow"
msgstr "Tillad"
msgid "ProjectSettings|Always show thumbs-up and thumbs-down award emoji buttons on issues, merge requests, and snippets."
-msgstr ""
+msgstr "Vis altid belønningsemojiknapper med tommelfinger-op og tommelfinger-ned på problemstillinger, sammenlægningsanmodninger og udklip."
msgid "ProjectSettings|Analytics"
-msgstr ""
+msgstr "Analyse"
msgid "ProjectSettings|Automatically resolve merge request diff discussions when they become outdated"
msgstr ""
@@ -26254,7 +26633,7 @@ msgid "ProjectSettings|Badges"
msgstr "Badges"
msgid "ProjectSettings|Build, test, and deploy your changes."
-msgstr ""
+msgstr "Byg, test og udsend dine ændringer."
msgid "ProjectSettings|Checkbox is visible and selected by default."
msgstr "Afkrydsningsboksen er som standard synlig og tilvalgt."
@@ -26275,7 +26654,7 @@ msgid "ProjectSettings|Contact an admin to change this setting."
msgstr "Kontakt en administrator for at ændre indstillingen."
msgid "ProjectSettings|Container registry"
-msgstr ""
+msgstr "Beholderregister"
msgid "ProjectSettings|Customize this project's badges."
msgstr "Tilpas projektets badges."
@@ -26284,16 +26663,16 @@ msgid "ProjectSettings|Determine what happens to the commit history when you mer
msgstr ""
msgid "ProjectSettings|Disable email notifications"
-msgstr ""
+msgstr "Deaktivér e-mail-underretninger"
msgid "ProjectSettings|Do not allow"
msgstr "Tillad ikke"
msgid "ProjectSettings|Enable \"Delete source branch\" option by default"
-msgstr ""
+msgstr "Aktivér valgmuligheden \"Slet kildegren\" som standard"
msgid "ProjectSettings|Enable merge trains"
-msgstr ""
+msgstr "Aktivér sammenlægningstog"
msgid "ProjectSettings|Enable merged results pipelines"
msgstr ""
@@ -26314,7 +26693,7 @@ msgid "ProjectSettings|Everyone"
msgstr "Alle"
msgid "ProjectSettings|Existing merge requests and protected branches are not affected."
-msgstr ""
+msgstr "Eksisterende sammenlægningsanmodninger og beskyttede grene påvirkes ikke."
msgid "ProjectSettings|Failed to protect the tag"
msgstr "Kunne ikke beskytte mærkatet"
@@ -26350,7 +26729,7 @@ msgid "ProjectSettings|Issues"
msgstr "Problemstillinger"
msgid "ProjectSettings|LFS objects from this repository are available to forks. %{linkStart}How do I remove them?%{linkEnd}"
-msgstr ""
+msgstr "LFS-objekter fra depotet er tilgængelige til forgreninger. %{linkStart}Hvordan fjerner jeg dem?%{linkEnd}"
msgid "ProjectSettings|Manages large files such as audio, video, and graphics files."
msgstr ""
@@ -26359,19 +26738,19 @@ msgid "ProjectSettings|Merge checks"
msgstr ""
msgid "ProjectSettings|Merge commit"
-msgstr ""
+msgstr "Sammenlægningscommit"
msgid "ProjectSettings|Merge commit with semi-linear history"
-msgstr ""
+msgstr "Sammenlægningscommit med halvlineær historik"
msgid "ProjectSettings|Merge method"
-msgstr ""
+msgstr "Sammenlægningsmetode"
msgid "ProjectSettings|Merge options"
msgstr ""
msgid "ProjectSettings|Merge requests"
-msgstr ""
+msgstr "Sammenlægningsanmodninger"
msgid "ProjectSettings|Merge requests approved for merge are queued, and pipelines validate the combined results of the source and target branches before merge. %{link_start}What are merge trains?%{link_end}"
msgstr ""
@@ -26380,7 +26759,7 @@ msgid "ProjectSettings|Merge suggestions"
msgstr ""
msgid "ProjectSettings|No merge commits are created."
-msgstr ""
+msgstr "Ingen sammenlægningscommits er oprettet."
msgid "ProjectSettings|Note: The container registry is always visible when a project is public and the container registry is set to '%{access_level_description}'"
msgstr ""
@@ -26431,19 +26810,19 @@ msgid "ProjectSettings|Requirements management system."
msgstr ""
msgid "ProjectSettings|Security & Compliance"
-msgstr ""
+msgstr "Sikkerhed og overholdelse"
msgid "ProjectSettings|Security & Compliance for this project"
-msgstr ""
+msgstr "Sikkerhed og overholdelse for projektet"
msgid "ProjectSettings|Set the default behavior of this option in merge requests. Changes to this are also applied to existing merge requests."
msgstr ""
msgid "ProjectSettings|Share code with others outside the project."
-msgstr ""
+msgstr "Del kode med andre uden for projeket."
msgid "ProjectSettings|Show default award emojis"
-msgstr ""
+msgstr "Vis standardbelønningsemojier"
msgid "ProjectSettings|Show link to create or view a merge request when pushing from the command line"
msgstr ""
@@ -26452,19 +26831,19 @@ msgid "ProjectSettings|Skipped pipelines are considered successful"
msgstr ""
msgid "ProjectSettings|Snippets"
-msgstr "Uddrag"
+msgstr "Snippets"
msgid "ProjectSettings|Squash commits when merging"
-msgstr ""
+msgstr "Squash commits når der sammenlægges"
msgid "ProjectSettings|Squashing is always performed. Checkbox is visible and selected, and users cannot change it."
-msgstr ""
+msgstr "Squashing udføres altid. Afkrydsningsboksen er synlig og tilvalgt, og brugerne kan ikke ændre den."
msgid "ProjectSettings|Squashing is never performed and the checkbox is hidden."
-msgstr ""
+msgstr "Squashing udføres aldrig og afkrydsningsboksen er skjult."
msgid "ProjectSettings|Submit changes to be merged upstream."
-msgstr ""
+msgstr "Indsend ændringer som skal sammenlægges upstream."
msgid "ProjectSettings|Supported variables:"
msgstr "Understøttede variabler:"
@@ -26482,7 +26861,7 @@ msgid "ProjectSettings|These checks must pass before merge requests can be merge
msgstr ""
msgid "ProjectSettings|This project"
-msgstr ""
+msgstr "Projektet"
msgid "ProjectSettings|This setting is applied on the server level and can be overridden by an admin."
msgstr ""
@@ -26500,34 +26879,34 @@ msgid "ProjectSettings|Transfer project"
msgstr "Overfør projekt"
msgid "ProjectSettings|Upstream project"
-msgstr ""
+msgstr "Upstream-projekt"
msgid "ProjectSettings|Used for every new merge request."
msgstr ""
msgid "ProjectSettings|Users can copy the repository to a new project."
-msgstr ""
+msgstr "Brugere kan kopiere depotet til et nyt projekt."
msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails."
msgstr ""
msgid "ProjectSettings|Users can request access"
-msgstr ""
+msgstr "Brugere kan anmode om adgang"
msgid "ProjectSettings|View and edit files in this project."
-msgstr ""
+msgstr "Vis og rediger filer i projektet."
msgid "ProjectSettings|View and edit files in this project. Non-project members will only have read access."
msgstr ""
msgid "ProjectSettings|View project analytics."
-msgstr ""
+msgstr "Vis projektanalyse."
msgid "ProjectSettings|Visibility options for this fork are limited by the current visibility of the source project."
msgstr ""
msgid "ProjectSettings|Visualize the project's performance metrics."
-msgstr ""
+msgstr "Visualiser projektets ydelsesmålinger."
msgid "ProjectSettings|What are badges?"
msgstr "Hvad er badges?"
@@ -26536,7 +26915,7 @@ msgid "ProjectSettings|When pipelines for merge requests are enabled in the CI/C
msgstr ""
msgid "ProjectSettings|When there is a merge conflict, the user is given the option to rebase."
-msgstr ""
+msgstr "Når der er en sammenlægningskonflikt, så får brugeren mulighed for at rebase."
msgid "ProjectSettings|Wiki"
msgstr "Wiki"
@@ -26551,76 +26930,76 @@ msgid "ProjectTemplates|Android"
msgstr "Android"
msgid "ProjectTemplates|GitLab Cluster Management"
-msgstr ""
+msgstr "GitLab-klyngehåndtering"
msgid "ProjectTemplates|Gitpod/Spring Petclinic"
-msgstr ""
+msgstr "Gitpod/Spring Petclinic"
msgid "ProjectTemplates|Go Micro"
-msgstr ""
+msgstr "Go Micro"
msgid "ProjectTemplates|HIPAA Audit Protocol"
msgstr ""
msgid "ProjectTemplates|Kotlin Native for Linux"
-msgstr ""
+msgstr "Kotlin Native for Linux"
msgid "ProjectTemplates|Netlify/GitBook"
-msgstr ""
+msgstr "Netlify/GitBook"
msgid "ProjectTemplates|Netlify/Hexo"
-msgstr ""
+msgstr "Netlify/Hexo"
msgid "ProjectTemplates|Netlify/Hugo"
-msgstr ""
+msgstr "Netlify/Hugo"
msgid "ProjectTemplates|Netlify/Jekyll"
-msgstr ""
+msgstr "Netlify/Jekyll"
msgid "ProjectTemplates|Netlify/Plain HTML"
-msgstr ""
+msgstr "Netlify/ren HTML"
msgid "ProjectTemplates|NodeJS Express"
-msgstr ""
+msgstr "NodeJS Express"
msgid "ProjectTemplates|Pages/Gatsby"
-msgstr ""
+msgstr "Pages/Gatsby"
msgid "ProjectTemplates|Pages/GitBook"
-msgstr ""
+msgstr "Pages/GitBook"
msgid "ProjectTemplates|Pages/Hexo"
-msgstr ""
+msgstr "Pages/Hexo"
msgid "ProjectTemplates|Pages/Hugo"
-msgstr ""
+msgstr "Pages/Hugo"
msgid "ProjectTemplates|Pages/Jekyll"
-msgstr ""
+msgstr "Pages/Jekyll"
msgid "ProjectTemplates|Pages/Plain HTML"
-msgstr ""
+msgstr "Pages/ren HTML"
msgid "ProjectTemplates|Ruby on Rails"
-msgstr ""
+msgstr "Ruby on Rails"
msgid "ProjectTemplates|SalesforceDX"
-msgstr ""
+msgstr "SalesforceDX"
msgid "ProjectTemplates|Sample GitLab Project"
-msgstr ""
+msgstr "Prøve GitLab-projekt"
msgid "ProjectTemplates|Serverless Framework/JS"
-msgstr ""
+msgstr "Serverfrit framework/JS"
msgid "ProjectTemplates|Spring"
-msgstr ""
+msgstr "Spring"
msgid "ProjectTemplates|Static Site Editor/Middleman"
-msgstr ""
+msgstr "Editor til statisk websted/Middleman"
msgid "ProjectTemplates|iOS (Swift)"
-msgstr ""
+msgstr "iOS (Swift)"
msgid "Projects"
msgstr "Projekter"
@@ -26634,9 +27013,15 @@ msgstr ""
msgid "Projects are graded based on the highest severity vulnerability present"
msgstr ""
+msgid "Projects are organized into groups"
+msgstr ""
+
msgid "Projects contributed to"
msgstr ""
+msgid "Projects help you organize your work. They contain your file repository, issues, merge requests, and so much more."
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr "Projekter delt med %{group_name}"
@@ -26650,10 +27035,10 @@ msgid "Projects will be permanently deleted after a %{waiting_period}-day waitin
msgstr ""
msgid "Projects will be permanently deleted immediately."
-msgstr ""
+msgstr "Projekter vil straks blive slettet permanent."
msgid "Projects with critical vulnerabilities"
-msgstr ""
+msgstr "Projekter med kritiske sårbarheder"
msgid "Projects with high or unknown vulnerabilities"
msgstr ""
@@ -26677,16 +27062,16 @@ msgid "ProjectsDropdown|Loading projects"
msgstr "Indlæser projekter"
msgid "ProjectsDropdown|Projects you visit often will appear here"
-msgstr ""
+msgstr "Her vises projekter du ofte besøger"
msgid "ProjectsDropdown|Search your projects"
-msgstr ""
+msgstr "Søg efter dine projekter"
msgid "ProjectsDropdown|Something went wrong on our end."
-msgstr "Noget gik galt i vores ende."
+msgstr "Noget gik galt hos os."
msgid "ProjectsDropdown|Sorry, no projects matched your search"
-msgstr ""
+msgstr "Beklager, ingen projekter matchede din søgning"
msgid "ProjectsDropdown|This feature requires browser localStorage support"
msgstr ""
@@ -26704,7 +27089,7 @@ msgid "ProjectsNew|Create"
msgstr "Opret"
msgid "ProjectsNew|Create a blank project to house your files, plan your work, and collaborate on code, among other things."
-msgstr ""
+msgstr "Opret et tomt projekt til blandet andet at opbevare dine filer, planlægge dit arbejde og samarbejde om kode."
msgid "ProjectsNew|Create a project pre-populated with the necessary files to get you started quickly."
msgstr ""
@@ -26737,13 +27122,13 @@ msgid "ProjectsNew|No import options available"
msgstr ""
msgid "ProjectsNew|Project description %{tag_start}(optional)%{tag_end}"
-msgstr ""
+msgstr "Projektbeskrivelse %{tag_start}(valgfrit)%{tag_end}"
msgid "ProjectsNew|Run CI/CD for external repository"
-msgstr ""
+msgstr "Kør CI/CD for eksternt depot"
msgid "ProjectsNew|Visibility Level"
-msgstr ""
+msgstr "Synlighedsniveau"
msgid "ProjectsNew|Want to house several dependent projects under the same namespace? %{link_start}Create a group.%{link_end}"
msgstr ""
@@ -26752,28 +27137,28 @@ msgid "Prometheus"
msgstr "Prometheus"
msgid "PrometheusAlerts|%{count} alerts applied"
-msgstr ""
+msgstr "%{count} alertbeskeder anvendt"
msgid "PrometheusAlerts|%{firingCount} firing"
msgstr ""
msgid "PrometheusAlerts|Add alert"
-msgstr ""
+msgstr "Tilføj alertbesked"
msgid "PrometheusAlerts|Edit alert"
-msgstr ""
+msgstr "Rediger alertbesked"
msgid "PrometheusAlerts|Error creating alert"
-msgstr ""
+msgstr "Fejl ved oprettelse af alertbesked"
msgid "PrometheusAlerts|Error deleting alert"
-msgstr ""
+msgstr "Fejl ved sletning af alertbesked"
msgid "PrometheusAlerts|Error fetching alert"
-msgstr ""
+msgstr "Fejl ved hentning af alertbesked"
msgid "PrometheusAlerts|Error saving alert"
-msgstr ""
+msgstr "Fejl ved gemning af alertbesked"
msgid "PrometheusAlerts|Firing: %{alerts}"
msgstr ""
@@ -26785,10 +27170,10 @@ msgid "PrometheusAlerts|Operator"
msgstr ""
msgid "PrometheusAlerts|Runbook URL (optional)"
-msgstr ""
+msgstr "Runbook-URL (valgfrit)"
msgid "PrometheusAlerts|Select query"
-msgstr ""
+msgstr "Vælg forespørgsel"
msgid "PrometheusAlerts|Threshold"
msgstr ""
@@ -26797,7 +27182,7 @@ msgid "PrometheusAlerts|exceeded"
msgstr ""
msgid "PrometheusAlerts|https://gitlab.com/gitlab-com/runbooks"
-msgstr ""
+msgstr "https://gitlab.com/gitlab-com/runbooks"
msgid "PrometheusAlerts|is equal to"
msgstr "er lig med"
@@ -26812,7 +27197,7 @@ msgid "PrometheusService|Active"
msgstr ""
msgid "PrometheusService|Auto configuration settings are used unless you override their values here."
-msgstr ""
+msgstr "Autokonfigurationsindstillinger bruges medmindre du tilsidesætter deres værdier her."
msgid "PrometheusService|Common metrics"
msgstr "Almindelige målinger"
@@ -26836,7 +27221,7 @@ msgid "PrometheusService|Finding and configuring metrics..."
msgstr ""
msgid "PrometheusService|Finding custom metrics..."
-msgstr ""
+msgstr "Finder tilpassede målinger ..."
msgid "PrometheusService|IAP_CLIENT_ID.apps.googleusercontent.com"
msgstr ""
@@ -26845,16 +27230,16 @@ msgid "PrometheusService|Manage clusters"
msgstr ""
msgid "PrometheusService|Manual configuration"
-msgstr ""
+msgstr "Manuel konfiguration"
msgid "PrometheusService|Metrics"
-msgstr ""
+msgstr "MÃ¥linger"
msgid "PrometheusService|Missing environment variable"
msgstr ""
msgid "PrometheusService|Monitor application health with Prometheus metrics and dashboards"
-msgstr ""
+msgstr "Overvåg programhelbred med Prometheus-målinger og -betjeningspaneler"
msgid "PrometheusService|More information"
msgstr "Mere information"
@@ -26871,10 +27256,10 @@ msgstr ""
msgid "PrometheusService|Prometheus cluster integration"
msgstr ""
-msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
+msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
msgstr ""
-msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
+msgid "PrometheusService|The ID of the IAP-secured resource."
msgstr ""
msgid "PrometheusService|The Prometheus API base URL."
@@ -26884,7 +27269,7 @@ msgid "PrometheusService|The contents of the credentials.json file of your servi
msgstr ""
msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
-msgstr ""
+msgstr "Målingerne vil kun blive overvåget efter din første udsendelse til et miljø"
msgid "PrometheusService|To use a Prometheus installed on a cluster, deactivate the manual configuration."
msgstr ""
@@ -26905,37 +27290,37 @@ msgid "PrometheusService|{ \"type\": \"service_account\", \"project_id\": ... }"
msgstr ""
msgid "Promote"
-msgstr ""
+msgstr "Forfrem"
msgid "Promote issue to an epic"
-msgstr ""
+msgstr "Forfrem problemstilling til en epic"
msgid "Promote to epic"
-msgstr ""
+msgstr "Forfrem til epic"
msgid "Promote to group label"
-msgstr ""
+msgstr "Forfrem til gruppeetiket"
msgid "PromoteMilestone|Only project milestones can be promoted."
-msgstr ""
+msgstr "Kun projektmilepæle kan forfremmes."
msgid "PromoteMilestone|Project does not belong to a group."
-msgstr ""
+msgstr "Projektet tilhører ikke en gruppe."
msgid "PromoteMilestone|Promotion failed - %{message}"
-msgstr ""
+msgstr "Forfremmelse mislykkedes - %{message}"
msgid "Promoted issue to an epic."
-msgstr ""
+msgstr "Forfrem problemstilling til en epic."
msgid "Promotion is not supported."
-msgstr ""
+msgstr "Forfremmelse understøttes ikke."
msgid "Promotions|Add Group Webhooks and GitLab Enterprise Edition."
-msgstr ""
+msgstr "Tilføj gruppe-webhooks og GitLab Enterprise Edition."
msgid "Promotions|Better Protected Branches"
-msgstr ""
+msgstr "Bedre beskyttede grene"
msgid "Promotions|Burndown Charts are visual representations of the progress of completing a milestone. At a glance, you see the current state for the completion a given milestone. Without them, you would have to organize the data from the milestone and plot it yourself to have the same sense of progress."
msgstr ""
@@ -26944,7 +27329,7 @@ msgid "Promotions|Buy EE"
msgstr "Køb EE"
msgid "Promotions|Buy GitLab Enterprise Edition"
-msgstr ""
+msgstr "Køb GitLab Enterprise Edition"
msgid "Promotions|Contact an owner of group %{namespace_name} to upgrade the plan."
msgstr "Kontakt en ejer af gruppen %{namespace_name} for at opgradere planen."
@@ -26971,7 +27356,7 @@ msgid "Promotions|Epics let you manage your portfolio of projects more efficient
msgstr ""
msgid "Promotions|Improve issues management with Issue weight and GitLab Enterprise Edition."
-msgstr ""
+msgstr "Forbedr problemstillingshåndtering med problemstillingsvægt og GitLab Enterprise Edition."
msgid "Promotions|Improve merge requests and customer support with GitLab Enterprise Edition."
msgstr ""
@@ -26980,7 +27365,7 @@ msgid "Promotions|Improve milestones with Burndown Charts."
msgstr ""
msgid "Promotions|Improve repositories with GitLab Enterprise Edition."
-msgstr ""
+msgstr "Forbedr deporter med GitLab Enterprise Edition."
msgid "Promotions|Improve search with Advanced Search and GitLab Enterprise Edition."
msgstr ""
@@ -26992,7 +27377,7 @@ msgid "Promotions|Learn more"
msgstr "Lær mere"
msgid "Promotions|Merge request approvals"
-msgstr ""
+msgstr "Sammenlægningsanmodningsgodkendelser"
msgid "Promotions|Not now, thanks!"
msgstr "Ikke nu, tak!"
@@ -27043,7 +27428,7 @@ msgid "Promotions|Upgrade your plan to activate Contribution Analytics."
msgstr ""
msgid "Promotions|Upgrade your plan to activate Group Webhooks."
-msgstr ""
+msgstr "Opgrader din plan for at aktivere gruppewebhooks."
msgid "Promotions|Upgrade your plan to improve merge requests."
msgstr "Opgrader din plan for at forbedre sammenlægningsanmodninger."
@@ -27073,10 +27458,10 @@ msgid "Promotions|You can restrict access to protected branches by choosing a ro
msgstr ""
msgid "Promotions|description templates"
-msgstr ""
+msgstr "beskrivelsesskabeloner"
msgid "Promotions|to help your contributors communicate effectively!"
-msgstr ""
+msgstr "til at hjælpe dine bidragsydere med at kommunikere effektivt!"
msgid "Prompt users to upload SSH keys"
msgstr ""
@@ -27097,31 +27482,31 @@ msgid "Protected Branch"
msgstr "Beskyttet gren"
msgid "Protected Branches"
-msgstr "Beskyttet grene"
+msgstr "Beskyttede grene"
msgid "Protected Environment"
msgstr "Beskyttet miljø"
msgid "Protected Paths"
-msgstr "Beskyttet stier"
+msgstr "Beskyttede stier"
msgid "Protected Paths: requests"
-msgstr ""
+msgstr "Beskyttede stier: anmodninger"
msgid "Protected Tag"
msgstr "Beskyttet mærkat"
msgid "Protected Tags"
-msgstr "Beskyttet mærkater"
+msgstr "Beskyttede mærkater"
msgid "Protected branches"
msgstr "Beskyttede grene"
msgid "Protected environments"
-msgstr "Beskyttet miljøer"
+msgstr "Beskyttede miljøer"
msgid "ProtectedBranch|%{wildcards_link_start}Wildcards%{wildcards_link_end} such as %{code_tag_start}*-stable%{code_tag_end} or %{code_tag_start}production/*%{code_tag_end} are supported."
-msgstr ""
+msgstr "%{wildcards_link_start}Jokertegn%{wildcards_link_end} såsom %{code_tag_start}*-stable%{code_tag_end} eller %{code_tag_start}production/*%{code_tag_end} understøttes."
msgid "ProtectedBranch|Allow all users with push access to %{tag_start}force push%{tag_end}."
msgstr ""
@@ -27136,10 +27521,10 @@ msgid "ProtectedBranch|Allowed to force push:"
msgstr ""
msgid "ProtectedBranch|Allowed to merge"
-msgstr ""
+msgstr "Må sammenlægge"
msgid "ProtectedBranch|Allowed to merge:"
-msgstr ""
+msgstr "Må sammenlægge:"
msgid "ProtectedBranch|Allowed to push"
msgstr ""
@@ -27163,7 +27548,7 @@ msgid "ProtectedBranch|Does not apply to users allowed to push. Optional section
msgstr ""
msgid "ProtectedBranch|Keep stable branches secure and force developers to use merge requests."
-msgstr ""
+msgstr "Hold stabile grene sikre og tving udviklere til at bruge sammenlægningsanmodninger."
msgid "ProtectedBranch|Learn more."
msgstr "Lær mere."
@@ -27175,10 +27560,10 @@ msgid "ProtectedBranch|Protect a branch"
msgstr "Beskyt en gren"
msgid "ProtectedBranch|Protected branch (%{protected_branches_count})"
-msgstr ""
+msgstr "Beskyttet gren (%{protected_branches_count})"
msgid "ProtectedBranch|Protected branches"
-msgstr "Beskyttet grene"
+msgstr "Beskyttede grene"
msgid "ProtectedBranch|Reject code pushes that change files listed in the CODEOWNERS file."
msgstr ""
@@ -27193,16 +27578,16 @@ msgid "ProtectedBranch|Toggle allowed to force push"
msgstr ""
msgid "ProtectedBranch|Toggle code owner approval"
-msgstr ""
+msgstr "Kodeejergodkendelse til/fra"
msgid "ProtectedBranch|What are protected branches?"
msgstr ""
msgid "ProtectedEnvironment|%{environment_name} will be writable for developers. Are you sure?"
-msgstr ""
+msgstr "%{environment_name} vil være skrivbar for udviklere. Er du sikker?"
msgid "ProtectedEnvironment|Allowed to deploy"
-msgstr ""
+msgstr "MÃ¥ udsende"
msgid "ProtectedEnvironment|Environment"
msgstr "Miljø"
@@ -27214,7 +27599,7 @@ msgid "ProtectedEnvironment|Protect"
msgstr "Beskyt"
msgid "ProtectedEnvironment|Protect an environment"
-msgstr ""
+msgstr "Beskyt et miljø"
msgid "ProtectedEnvironment|Protected Environment (%{protected_environments_count})"
msgstr ""
@@ -27229,16 +27614,16 @@ msgid "ProtectedEnvironment|There are currently no protected environments. Prote
msgstr ""
msgid "ProtectedEnvironment|Unprotect"
-msgstr ""
+msgstr "Fjern beskyttelse"
msgid "ProtectedEnvironment|Your environment can't be unprotected"
-msgstr ""
+msgstr "Dit miljø kan ikke få fjernet sin beskyttelse"
msgid "ProtectedEnvironment|Your environment has been protected."
msgstr ""
msgid "ProtectedEnvironment|Your environment has been unprotected"
-msgstr ""
+msgstr "Dit miljø har fået fjernet sin beskyttelse"
msgid "ProtectedTag|By default, protected branches restrict who can modify the tag."
msgstr ""
@@ -27250,13 +27635,13 @@ msgid "ProtectedTag|Limit access to creating and updating tags."
msgstr ""
msgid "ProtectedTag|Protected tags"
-msgstr "Beskyttet mærkater"
+msgstr "Beskyttede mærkater"
msgid "ProtectedTag|What are protected tags?"
-msgstr ""
+msgstr "Hvad er beskyttede mærkater?"
msgid "Protip: %{linkStart}Auto DevOps%{linkEnd} uses Kubernetes clusters to deploy your code!"
-msgstr ""
+msgstr "Protip: %{linkStart}Auto DevOps%{linkEnd} bruger Kubernetes-klynger til at udsende din kode!"
msgid "Provider"
msgstr "Udbyder"
@@ -27274,7 +27659,7 @@ msgid "Pseudonymizer data collection"
msgstr ""
msgid "Public"
-msgstr "Offentlig"
+msgstr "Offentlige"
msgid "Public - The group and any public projects can be viewed without any authentication."
msgstr ""
@@ -27346,7 +27731,7 @@ msgid "Push commits to the source branch or add previously merged commits to rev
msgstr ""
msgid "Push events"
-msgstr ""
+msgstr "Push-begivenheder"
msgid "Push project from command line"
msgstr ""
@@ -27418,7 +27803,7 @@ msgid "PushoverService|%{user_name} pushed new branch \"%{ref}\"."
msgstr ""
msgid "PushoverService|Enter your application key."
-msgstr ""
+msgstr "Indtast din programnøgle."
msgid "PushoverService|Enter your user key."
msgstr "Indtast din brugernøgle."
@@ -27457,22 +27842,22 @@ msgid "Query cannot be processed"
msgstr ""
msgid "Query is valid"
-msgstr ""
+msgstr "Forespørgslen er ugyldig"
msgid "Queued"
msgstr "Sat i kø"
msgid "Quick actions can be used in description and comment boxes."
-msgstr ""
+msgstr "Hurtighandlinger kan bruges i beskrivelses- og kommentarbokse."
msgid "Quick help"
-msgstr ""
+msgstr "Hurtighjælp"
msgid "Quick range"
-msgstr ""
+msgstr "Hurtigområde"
msgid "Quickly and easily edit multiple files in your project."
-msgstr ""
+msgstr "Hurtig of let redigering af flere filer i dit projekt."
msgid "README"
msgstr "README"
@@ -27492,6 +27877,9 @@ msgstr ""
msgid "Rate limit"
msgstr ""
+msgid "Rate limits can help reduce request volume (like from crawlers or abusive bots)."
+msgstr ""
+
msgid "Raw blob request rate limit per minute"
msgstr ""
@@ -27504,6 +27892,9 @@ msgstr ""
msgid "Re-authentication required"
msgstr ""
+msgid "Re-import"
+msgstr ""
+
msgid "Re-request review"
msgstr ""
@@ -27525,14 +27916,17 @@ msgstr "Læs mere om projekttilladelser %{help_link_open}her%{help_link_close}"
msgid "Read more about related issues"
msgstr "Læs mere om relaterede problemstillinger"
-msgid "Ready to get started with GitLab? Follow these steps to set up your workspace, plan and commit changes, and deploy your project."
+msgid "Read their documentation."
msgstr ""
+msgid "Ready to get started with GitLab? Follow these steps to set up your workspace, plan and commit changes, and deploy your project."
+msgstr "Klar til at komme i gang med GitLab? Følg trinnene for at opsætte dit arbejdsområde, planlægge og committe ændringer, og udsende dit projekt."
+
msgid "Ready to merge by members who can write to the target branch."
-msgstr ""
+msgstr "Klar til sammenlægning af medlemmer som kan skrive til målgrenen."
msgid "Ready to merge!"
-msgstr ""
+msgstr "Klar til at sammenlægge!"
msgid "Reauthenticating with SAML provider."
msgstr ""
@@ -27547,7 +27941,7 @@ msgid "Rebase source branch"
msgstr ""
msgid "Rebase source branch on the target branch."
-msgstr ""
+msgstr "Rebase kildegren på målgrenen."
msgid "Recaptcha verified?"
msgstr ""
@@ -27556,13 +27950,16 @@ msgid "Receive alerts from manually configured Prometheus servers."
msgstr ""
msgid "Receive any notifications from GitLab."
+msgstr "Modtag underretninger fra GitLab."
+
+msgid "Receive notification of abuse reports by email."
msgstr ""
msgid "Receive notifications about your own activity"
msgstr ""
msgid "Receive product marketing emails"
-msgstr ""
+msgstr "Modtag e-mails om markedsføring af produkter"
msgid "Recent"
msgstr "Seneste"
@@ -27629,8 +28026,8 @@ msgstr "Opdater siden og prøv igen."
msgid "Refreshing in a second to show the updated status..."
msgid_plural "Refreshing in %d seconds to show the updated status..."
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "Opdaterer om et sekund for at vise den opdateret status ..."
+msgstr[1] "Opdaterer om %d sekunder for at vise den opdateret status ..."
msgid "Regenerate export"
msgstr ""
@@ -27639,7 +28036,7 @@ msgid "Regenerate instance ID"
msgstr ""
msgid "Regenerate key"
-msgstr ""
+msgstr "Regenerer nøgle"
msgid "Regenerate recovery codes"
msgstr ""
@@ -27663,10 +28060,10 @@ msgid "Register Two-Factor Authenticator"
msgstr ""
msgid "Register Universal Two-Factor (U2F) Device"
-msgstr ""
+msgstr "Tilmeld U2F-enhed (Universal Two-Factor)"
msgid "Register WebAuthn Device"
-msgstr ""
+msgstr "Tilmeld WebAuthn-enhed"
msgid "Register as many runners as you want. You can register runners as separate users, on separate servers, and on your local machine. Runners are either:"
msgstr ""
@@ -27681,7 +28078,7 @@ msgid "Register the runner with this URL:"
msgstr ""
msgid "Register with two-factor app"
-msgstr ""
+msgstr "Tilmeld med totrinsprogram"
msgid "Registration Features include:"
msgstr ""
@@ -27699,10 +28096,7 @@ msgid "Registration|Your profile"
msgstr "Din profil"
msgid "Registry setup"
-msgstr ""
-
-msgid "Regulate approvals by authors/committers. Affects all projects."
-msgstr ""
+msgstr "Registeropsætning"
msgid "Reindexing Status: %{status} (Slice multiplier: %{multiplier}, Maximum running slices: %{max_slices})"
msgstr ""
@@ -27714,16 +28108,16 @@ msgid "Related feature flags"
msgstr "Relaterede funktionsflag"
msgid "Related issues"
-msgstr ""
+msgstr "Relaterede problemstillinger"
msgid "Related merge requests"
-msgstr ""
+msgstr "Relaterede sammenlægningsanmodninger"
msgid "Related to #%{issue_id}."
-msgstr ""
+msgstr "Relateret til #%{issue_id}."
msgid "Relates to"
-msgstr ""
+msgstr "Relateret til"
msgid "Release"
msgid_plural "Releases"
@@ -27731,22 +28125,22 @@ msgstr[0] "Udgivelse"
msgstr[1] "Udgivelser"
msgid "Release assets"
-msgstr ""
+msgstr "Udgivelsesmaterialer"
msgid "Release assets documentation"
-msgstr ""
+msgstr "Dokumentation for udgivelsesmaterialer"
msgid "Release does not have the same project as the milestone"
msgstr ""
msgid "Release notes"
-msgstr ""
+msgstr "Udgivelsesnoter"
msgid "Release notes:"
-msgstr ""
+msgstr "Udgivelsesnoter:"
msgid "Release title"
-msgstr ""
+msgstr "Udgivelsestitel"
msgid "Release with tag \"%{tag}\" was not found"
msgstr "Udgivelse med mærkatet \"%{tag}\" blev ikke fundet"
@@ -27758,7 +28152,7 @@ msgid "ReleaseAssetLinkType|Images"
msgstr "Billeder"
msgid "ReleaseAssetLinkType|Other"
-msgstr ""
+msgstr "Anden"
msgid "ReleaseAssetLinkType|Package"
msgstr "Pakke"
@@ -27767,13 +28161,13 @@ msgid "ReleaseAssetLinkType|Packages"
msgstr "Pakker"
msgid "ReleaseAssetLinkType|Runbook"
-msgstr ""
+msgstr "Runbook"
msgid "ReleaseAssetLinkType|Runbooks"
-msgstr ""
+msgstr "Runbooks"
msgid "Released date"
-msgstr ""
+msgstr "Udgivelsesdato"
msgid "Releases"
msgstr "Udgivelser"
@@ -27782,7 +28176,7 @@ msgid "Releases are based on Git tags and mark specific points in a project's de
msgstr ""
msgid "Releases are based on Git tags. We recommend tags that use semantic versioning, for example %{codeStart}v1.0.0%{codeEnd}, %{codeStart}v2.1.0-pre%{codeEnd}."
-msgstr ""
+msgstr "Udgivelser er baseret på Git-mærkater. Vi anbefaler mærkater der bruger semantisk versionering, f.eks. %{codeStart}v1.0.0%{codeEnd}, %{codeStart}v2.1.0-pre%{codeEnd}."
msgid "Releases documentation"
msgstr ""
@@ -27791,12 +28185,15 @@ msgid "Releases|New Release"
msgstr "Ny udgivelse"
msgid "Release|Something went wrong while creating a new release."
-msgstr ""
+msgstr "Noget gik galt under oprettelse af en ny udgivelse."
msgid "Release|Something went wrong while getting the release details."
-msgstr ""
+msgstr "Noget gik galt under hentning af udgivelsesdetaljerne."
msgid "Release|Something went wrong while saving the release details."
+msgstr "Noget gik galt under gemning af udgivelsesdetaljerne."
+
+msgid "Reload page"
msgstr ""
msgid "Remediations"
@@ -27842,7 +28239,7 @@ msgid "Remove approvers?"
msgstr "Fjern godkendere?"
msgid "Remove asset link"
-msgstr ""
+msgstr "Fjern materialelink"
msgid "Remove assignee"
msgstr ""
@@ -27872,10 +28269,10 @@ msgid "Remove file"
msgstr "Fjern fil"
msgid "Remove fork relationship"
-msgstr ""
+msgstr "Fjern forgreningsrelation"
msgid "Remove from batch"
-msgstr ""
+msgstr "Fjern fra batch"
msgid "Remove from epic"
msgstr "Fjern fra epic"
@@ -27914,7 +28311,7 @@ msgid "Remove milestone"
msgstr "Fjern milepæl"
msgid "Remove parent epic from an epic"
-msgstr ""
+msgstr "Fjern forælderepic fra en epic"
msgid "Remove priority"
msgstr "Fjern prioritet"
@@ -27926,16 +28323,16 @@ msgid "Remove reviewer"
msgstr "Fjern kontrollant"
msgid "Remove runner"
-msgstr ""
+msgstr "Fjern runner"
msgid "Remove secondary email"
msgstr "Fjern sekundære e-mail"
msgid "Remove spent time"
-msgstr ""
+msgstr "Fjern brugt tid"
msgid "Remove time estimate"
-msgstr ""
+msgstr "Fjern tidsestimat"
msgid "Remove user"
msgstr "Fjern bruger"
@@ -27986,16 +28383,16 @@ msgid "Removed group can not be restored!"
msgstr ""
msgid "Removed parent epic %{epic_ref}."
-msgstr ""
+msgstr "Fjernede forælderepicen %{epic_ref}."
msgid "Removed spent time."
-msgstr ""
+msgstr "Fjernede brugt tid."
msgid "Removed the due date."
msgstr "Fjernede forfaldsdatoen."
msgid "Removed time estimate."
-msgstr ""
+msgstr "Fjernede tidsestimat."
msgid "RemovedProjects|Projects which are removed and are yet to be permanently removed are visible here."
msgstr ""
@@ -28028,19 +28425,19 @@ msgid "Removes an issue from an epic."
msgstr "Fjerner en problemstilling fra en epic."
msgid "Removes parent epic %{epic_ref}."
-msgstr ""
+msgstr "Fjerner forælderepicen %{epic_ref}."
msgid "Removes spent time."
-msgstr ""
+msgstr "Fjerner brugt tid."
msgid "Removes the due date."
msgstr "Fjerner forfaldsdatoen."
msgid "Removes time estimate."
-msgstr ""
+msgstr "Fjerner tidsestimat."
msgid "Removing this group also removes all child projects, including archived projects, and their resources."
-msgstr ""
+msgstr "Fjernelse af gruppen fjerner også alle underprojekter herunder arkiverede projekter og deres ressourcer."
msgid "Rename file"
msgstr "Omdøb fil"
@@ -28073,12 +28470,15 @@ msgid "Reopen test case"
msgstr "Genåbn testsag"
msgid "Reopen this %{quick_action_target}"
-msgstr ""
+msgstr "Genåbn denne %{quick_action_target}"
msgid "Reopened this %{quick_action_target}."
-msgstr ""
+msgstr "Genåbnede denne %{quick_action_target}."
msgid "Reopens this %{quick_action_target}."
+msgstr "Genåbner denne %{quick_action_target}."
+
+msgid "Repeats"
msgstr ""
msgid "Replace"
@@ -28097,10 +28497,10 @@ msgid "Replaced all labels with %{label_references} %{label_text}."
msgstr "Erstat alle etiketter med %{label_references} %{label_text}."
msgid "Replaces the clone URL root."
-msgstr ""
+msgstr "Erstatter roden af klonings-URL."
msgid "Replication"
-msgstr ""
+msgstr "Replikation"
msgid "Reply by email"
msgstr "Besvar via e-mail"
@@ -28115,7 +28515,7 @@ msgid "Reply…"
msgstr "Besvar …"
msgid "Repo by URL"
-msgstr ""
+msgstr "Depot efter URL"
msgid "Report %{display_issuable_type} that are abusive, inappropriate or spam."
msgstr ""
@@ -28127,7 +28527,7 @@ msgid "Report abuse to admin"
msgstr "Rapportér misbrug til administrator"
msgid "Reported %{timeAgo} by %{reportedBy}"
-msgstr ""
+msgstr "Rapporteret %{timeAgo} af %{reportedBy}"
msgid "Reported by"
msgstr "Rapporteret af"
@@ -28142,7 +28542,7 @@ msgid "Reports|%{combinedString} and %{resolvedString}"
msgstr "%{combinedString} og %{resolvedString}"
msgid "Reports|%{recentlyFailed} out of %{failed} failed test has failed more than once in the last 14 days"
-msgstr ""
+msgstr "%{recentlyFailed} ud af %{failed} mislykkede test har mislykkedes mere end én gang inden for de sidste 14 dage"
msgid "Reports|%{recentlyFailed} out of %{failed} failed tests has failed more than once in the last 14 days"
msgid_plural "Reports|%{recentlyFailed} out of %{failed} failed tests have failed more than once in the last 14 days"
@@ -28173,7 +28573,7 @@ msgid "Reports|An error occurred while loading %{name} results"
msgstr ""
msgid "Reports|An error occurred while loading report"
-msgstr ""
+msgstr "Der opstod en fejl under indlæsning af rapport"
msgid "Reports|Base report parsing error:"
msgstr ""
@@ -28195,7 +28595,7 @@ msgstr[0] ""
msgstr[1] ""
msgid "Reports|Failure"
-msgstr ""
+msgstr "Mislykkedes"
msgid "Reports|Filename"
msgstr "Filnavn"
@@ -28210,34 +28610,34 @@ msgid "Reports|Metrics reports are loading"
msgstr ""
msgid "Reports|Metrics reports changed on %{numberOfChanges} %{pointsString}"
-msgstr ""
+msgstr "Målingsrapporter ændret på %{numberOfChanges} %{pointsString}"
msgid "Reports|Metrics reports did not change"
-msgstr ""
+msgstr "Målingsrapporter ændrede sig ikke"
msgid "Reports|Metrics reports failed loading results"
msgstr ""
msgid "Reports|Scanner"
-msgstr ""
+msgstr "Skanner"
msgid "Reports|Severity"
-msgstr ""
+msgstr "Alvorlighed"
msgid "Reports|System output"
msgstr ""
msgid "Reports|Test summary"
-msgstr ""
+msgstr "Testopsummering"
msgid "Reports|Test summary failed loading results"
-msgstr ""
+msgstr "Testopsummering kunne ikke indlæse resultater"
msgid "Reports|Test summary results are being parsed"
-msgstr ""
+msgstr "Testopsummeringsresultater er ved at blive fortolket"
msgid "Reports|Tool"
-msgstr ""
+msgstr "Værktøj"
msgid "Reports|Vulnerability"
msgstr "SÃ¥rbarhed"
@@ -28252,22 +28652,22 @@ msgid "Repositories"
msgstr "Depoter"
msgid "Repositories Analytics"
-msgstr ""
+msgstr "Depotanalyse"
msgid "RepositoriesAnalytics|Average Coverage by Job"
msgstr ""
msgid "RepositoriesAnalytics|Average coverage"
-msgstr ""
+msgstr "Gennemsnitlig dækning"
msgid "RepositoriesAnalytics|Average test coverage last 30 days"
msgstr ""
msgid "RepositoriesAnalytics|Coverage"
-msgstr ""
+msgstr "Dækning"
msgid "RepositoriesAnalytics|Coverage Jobs"
-msgstr ""
+msgstr "Dækningsjob"
msgid "RepositoriesAnalytics|Download historic test coverage data"
msgstr ""
@@ -28276,7 +28676,7 @@ msgid "RepositoriesAnalytics|Download historic test coverage data (.csv)"
msgstr ""
msgid "RepositoriesAnalytics|Download test coverage data (.csv)"
-msgstr ""
+msgstr "Download testdækningsdata (.csv)"
msgid "RepositoriesAnalytics|Historic Test Coverage Data is available in raw format (.csv) for further analysis."
msgstr ""
@@ -28291,13 +28691,13 @@ msgid "RepositoriesAnalytics|Latest test coverage results"
msgstr ""
msgid "RepositoriesAnalytics|No test coverage to display"
-msgstr ""
+msgstr "Ingen testdækning at vise"
msgid "RepositoriesAnalytics|Please select a project or multiple projects to display their most recent test coverage data."
msgstr ""
msgid "RepositoriesAnalytics|Please select projects to display."
-msgstr ""
+msgstr "Vælg venligst projekter som skal vises."
msgid "RepositoriesAnalytics|Projects with Coverage"
msgstr ""
@@ -28312,10 +28712,10 @@ msgid "Repository"
msgstr "Depot"
msgid "Repository Analytics"
-msgstr ""
+msgstr "Depotanalyse"
msgid "Repository Graph"
-msgstr ""
+msgstr "Depotgraf"
msgid "Repository Settings"
msgstr ""
@@ -28324,7 +28724,7 @@ msgid "Repository already read-only"
msgstr "Depotet er allerede skrivebeskyttet"
msgid "Repository check"
-msgstr ""
+msgstr "Depottjek"
msgid "Repository check was triggered."
msgstr ""
@@ -28339,7 +28739,7 @@ msgid "Repository cleanup has started. You will receive an email once the cleanu
msgstr ""
msgid "Repository clone URL"
-msgstr ""
+msgstr "Klonings-URL for depot"
msgid "Repository files count over the limit"
msgstr ""
@@ -28351,7 +28751,7 @@ msgid "Repository has more than one branch."
msgstr ""
msgid "Repository has no locks."
-msgstr ""
+msgstr "Depotet har ingen låse."
msgid "Repository has tags."
msgstr ""
@@ -28387,19 +28787,19 @@ msgid "RepositorySettingsAccessLevel|Select"
msgstr ""
msgid "Request Access"
-msgstr ""
+msgstr "Anmod om adgang"
msgid "Request a new one"
-msgstr ""
+msgstr "Anmod om en ny"
msgid "Request details"
-msgstr ""
+msgstr "Anmodningsdetaljer"
msgid "Request new confirmation email"
msgstr ""
msgid "Request parameter %{param} is missing."
-msgstr ""
+msgstr "Anmodningsparameteren %{param} mangler."
msgid "Request review from"
msgstr ""
@@ -28411,10 +28811,10 @@ msgid "Request to link SAML account must be authorized"
msgstr ""
msgid "Requested"
-msgstr ""
+msgstr "Anmodet"
msgid "Requested %{time_ago}"
-msgstr ""
+msgstr "Anmodet %{time_ago}"
msgid "Requested design version does not exist."
msgstr ""
@@ -28426,7 +28826,7 @@ msgid "Requested states are invalid"
msgstr ""
msgid "Requests"
-msgstr "Forespørgelser"
+msgstr "Anmodninger"
msgid "Requests Profiles"
msgstr ""
@@ -28435,22 +28835,19 @@ msgid "Requests for pages at %{code_start}%{help_text_url}%{code_end} redirect t
msgstr ""
msgid "Requests per period"
-msgstr ""
+msgstr "Anmodninger pr. periode"
msgid "Requests to these domain(s)/address(es) on the local network will be allowed when local requests from hooks and services are not allowed. IP ranges such as 1:0:0:0:0:0:0:0/124 or 127.0.0.0/28 are supported. Domain wildcards are not supported currently. Use comma, semicolon, or newline to separate multiple entries. The allowlist can hold a maximum of 1000 entries. Domains should use IDNA encoding. Ex: example.com, 192.168.1.1, 127.0.0.0/28, xn--itlab-j1a.com."
-msgstr ""
+msgstr "Anmodninger til domænerne/adresserne på det lokale netværk vil blive tilladt når lokale anmodninger fra hooks og tjenester ikke er tilladt. IP-områder såsom 1:0:0:0:0:0:0:0/124 eller 127.0.0.0/28 understøttes. Jokertegn for domæner understøttes ikke i øjeblikket. Brug komma, semikolon eller linjeskift til at adskille flere indslag. Tilladelseslisten kan højst indeholde 1000 indslag. Domæner skal bruge IDNA-kodning. F.eks.: example.com, 192.168.1.1, 127.0.0.0/28, xn--itlab-j1a.com."
msgid "Require additional authentication for administrative tasks."
msgstr ""
-msgid "Require all users in this group to setup Two-factor authentication"
-msgstr ""
-
-msgid "Require all users in this group to setup two-factor authentication"
+msgid "Require all users in this group to set up two-factor authentication"
msgstr ""
msgid "Required approvals (%{approvals_given} given)"
-msgstr ""
+msgstr "Krævede godkendelser (%{approvals_given} givet)"
msgid "Required approvals (%{approvals_given} given, you've approved)"
msgstr ""
@@ -28459,13 +28856,13 @@ msgid "Required in this project."
msgstr "Kræves i projektet."
msgid "Requirement %{reference} has been added"
-msgstr ""
+msgstr "Kravet %{reference} er blevet tilføjet"
msgid "Requirement %{reference} has been archived"
-msgstr ""
+msgstr "Kravet %{reference} er blevet arkiveret"
msgid "Requirement %{reference} has been reopened"
-msgstr ""
+msgstr "Kravet %{reference} er blevet genåbnet"
msgid "Requirement %{reference} has been updated"
msgstr ""
@@ -28492,6 +28889,9 @@ msgstr[1] ""
msgid "Requires values to meet regular expression requirements."
msgstr ""
+msgid "Requires you to deploy or set up cloud-hosted Sentry."
+msgstr ""
+
msgid "Requires your primary GitLab email address."
msgstr ""
@@ -28499,7 +28899,7 @@ msgid "Resend"
msgstr "Send igen"
msgid "Resend Request"
-msgstr ""
+msgstr "Send anmodning igen"
msgid "Resend confirmation email"
msgstr "Send bekræftelses e-mail igen"
@@ -28538,23 +28938,20 @@ msgid "Reset password"
msgstr "Nulstil adgangskode"
msgid "Reset registration token"
-msgstr ""
+msgstr "Nulstil registreringstoken"
msgid "Reset template"
msgstr "Nulstil skabelon"
msgid "Reset to project defaults"
-msgstr ""
+msgstr "Nulstil til projektstandarder"
msgid "Resetting the authorization key will invalidate the previous key. Existing alert configurations will need to be updated with the new key."
-msgstr ""
+msgstr "Nulstilling af godkendelsesnøglen vil invalidere den forrige nøgle. Eksisterende alertbeskedkonfigurationer skal opdateres med den nye nøgle."
msgid "Resolve"
msgstr "Løs"
-msgid "Resolve all threads in new issue"
-msgstr "Løs alle tråde i ny problemstilling"
-
msgid "Resolve conflicts"
msgstr "Løs konflikter"
@@ -28592,28 +28989,31 @@ msgid "Response didn't include `service_desk_address`"
msgstr ""
msgid "Response metrics (AWS ELB)"
-msgstr ""
+msgstr "Svarmålinger (AWS ELB)"
msgid "Response metrics (Custom)"
-msgstr ""
+msgstr "Svarmålinger (tilpasset)"
msgid "Response metrics (HA Proxy)"
-msgstr ""
+msgstr "Svarmålinger (HA-proxy)"
msgid "Response metrics (NGINX Ingress VTS)"
-msgstr ""
+msgstr "Svarmålinger (NGINX Ingress VTS)"
msgid "Response metrics (NGINX Ingress)"
-msgstr ""
+msgstr "Svarmålinger (NGINX Ingress)"
msgid "Response metrics (NGINX)"
-msgstr ""
+msgstr "Svarmålinger (NGINX)"
msgid "Response text"
+msgstr "Svartekst"
+
+msgid "Restart GitLab to apply changes."
msgstr ""
msgid "Restart Terminal"
-msgstr ""
+msgstr "Genstart terminal"
msgid "Restore"
msgstr "Gendan"
@@ -28630,6 +29030,9 @@ msgstr ""
msgid "Restoring the project will prevent the project from being removed on this date and restore people's ability to make changes to it."
msgstr ""
+msgid "Restrict group access by IP address. %{link_start}Learn more%{link_end}."
+msgstr ""
+
msgid "Restrict membership by email domain"
msgstr ""
@@ -28640,7 +29043,7 @@ msgid "Restricted shift times are not available for hourly shifts"
msgstr ""
msgid "Resume"
-msgstr ""
+msgstr "Genoptag"
msgid "Resync"
msgstr "Synkroniser igen"
@@ -28658,7 +29061,7 @@ msgid "Retry this job"
msgstr "Prøv jobbet igen"
msgid "Retry this job in order to create the necessary resources."
-msgstr ""
+msgstr "Prøv jobbet igen for at oprette de nødvendige ressourcer."
msgid "Retry verification"
msgstr ""
@@ -28675,7 +29078,7 @@ msgid "Revert this commit"
msgstr "Tilbagefør committen"
msgid "Revert this merge request"
-msgstr ""
+msgstr "Tilbagefør sammenlægningsanmodningen"
msgid "Review"
msgstr "Kontrol"
@@ -28728,7 +29131,7 @@ msgid "Reviewing"
msgstr "Kontrollerer"
msgid "Reviewing (merge request !%{mergeRequestId})"
-msgstr ""
+msgstr "Kontrollerer (sammenlægningsanmodning !%{mergeRequestId})"
msgid "Revoke"
msgstr "Tilbagekald"
@@ -28737,19 +29140,19 @@ msgid "Revoked"
msgstr "Tilbagekaldt"
msgid "Revoked impersonation token %{token_name}!"
-msgstr ""
+msgstr "Tilbagekaldt efterligningstoken %{token_name}!"
msgid "Revoked personal access token %{personal_access_token_name}!"
msgstr ""
msgid "Revoked project access token %{project_access_token_name}!"
-msgstr ""
+msgstr "Tilbagekaldte projektadgangstokenen %{project_access_token_name}!"
msgid "RightSidebar|Copy email address"
msgstr "Kopiér e-mailadresse"
msgid "RightSidebar|Issue email"
-msgstr ""
+msgstr "Problemstillings e-mail"
msgid "RightSidebar|adding a"
msgstr ""
@@ -28761,13 +29164,13 @@ msgid "Rnners|Don't see what you are looking for? See the full list of options,
msgstr ""
msgid "Roadmap"
-msgstr ""
+msgstr "Vejkort"
msgid "Role"
msgstr "Rolle"
msgid "Rollback"
-msgstr ""
+msgstr "Tilbagerul"
msgid "Ruby"
msgstr "Ruby"
@@ -28785,31 +29188,31 @@ msgid "Run %{code_start}git fsck%{code_end} periodically in all project and wiki
msgstr ""
msgid "Run CI/CD pipelines for external repositories"
-msgstr ""
+msgstr "Kør CI-/CD-pipelines for eksterne depoter"
msgid "Run CI/CD pipelines with Jenkins when you push to a repository, or when a merge request is created, updated, or merged. %{docs_link}"
msgstr ""
msgid "Run CI/CD pipelines with Jenkins."
-msgstr ""
+msgstr "Kør CI-/CD-pipelines med Jenkins."
msgid "Run housekeeping"
-msgstr ""
+msgstr "Kør husarbejde"
msgid "Run manual or delayed jobs"
-msgstr ""
+msgstr "Kør manuelle eller forsinkede job"
msgid "Run tests against your code live using the Web Terminal"
-msgstr ""
+msgstr "Kør tests mod din kode live med webterminalen"
msgid "Run untagged jobs"
-msgstr ""
+msgstr "Kør job uden mærkater"
msgid "Runner API"
-msgstr ""
+msgstr "Runner API"
msgid "Runner tokens"
-msgstr ""
+msgstr "Runnertokens"
msgid "Runner was not deleted because it is assigned to multiple projects."
msgstr ""
@@ -28821,7 +29224,7 @@ msgid "Runner was successfully updated."
msgstr ""
msgid "Runners"
-msgstr ""
+msgstr "Runnere"
msgid "Runners are processes that pick up and execute CI/CD jobs for GitLab."
msgstr ""
@@ -28836,7 +29239,7 @@ msgid "Runners page."
msgstr ""
msgid "Runners|Active"
-msgstr ""
+msgstr "Aktiv"
msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. %{percentage} spot."
msgstr ""
@@ -28845,7 +29248,7 @@ msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional schedul
msgstr ""
msgid "Runners|An error has occurred fetching instructions"
-msgstr ""
+msgstr "Der er opstået en fejl under hentning af instruktioner"
msgid "Runners|Architecture"
msgstr "Arkitektur"
@@ -28863,16 +29266,16 @@ msgid "Runners|Copy instructions"
msgstr ""
msgid "Runners|Deploy GitLab Runner in AWS"
-msgstr ""
+msgstr "Udsend GitLab Runner i AWS"
msgid "Runners|Description"
msgstr "Beskrivelse"
msgid "Runners|Download and install binary"
-msgstr ""
+msgstr "Download og installer programfil"
msgid "Runners|Download latest binary"
-msgstr ""
+msgstr "Download seneste programfil"
msgid "Runners|Enter the number of seconds. This timeout takes precedence over lower timeouts set for the project."
msgstr ""
@@ -28890,16 +29293,16 @@ msgid "Runners|If you do not select an AWS VPC, the runner will deploy to the De
msgstr ""
msgid "Runners|Install a runner"
-msgstr ""
+msgstr "Installer en runner"
msgid "Runners|Last contact"
-msgstr ""
+msgstr "Sidste kontakt"
msgid "Runners|Locked to this project"
msgstr "LÃ¥st til projektet"
msgid "Runners|Maximum job timeout"
-msgstr ""
+msgstr "Maksimum timeout for job"
msgid "Runners|Members of the %{type} can register runners"
msgstr ""
@@ -28908,7 +29311,7 @@ msgid "Runners|Name"
msgstr "Navn"
msgid "Runners|New registration token generated!"
-msgstr ""
+msgstr "Ny registreringstoken genereret!"
msgid "Runners|New runner, has not connected yet"
msgstr ""
@@ -28917,19 +29320,19 @@ msgid "Runners|Not connected"
msgstr ""
msgid "Runners|Offline"
-msgstr ""
+msgstr "Offline"
msgid "Runners|Online"
msgstr "Online"
msgid "Runners|Paused"
-msgstr ""
+msgstr "Sat på pause"
msgid "Runners|Platform"
msgstr "Platform"
msgid "Runners|Property Name"
-msgstr ""
+msgstr "Egenskabsnavn"
msgid "Runners|Protected"
msgstr "Beskyttet"
@@ -28938,28 +29341,34 @@ msgid "Runners|Revision"
msgstr "Revision"
msgid "Runners|Runner"
-msgstr ""
+msgstr "Runner"
msgid "Runners|Runner #%{runner_id}"
+msgstr "Runner #%{runner_id}"
+
+msgid "Runners|Runner assigned to project."
msgstr ""
msgid "Runners|Runner is offline, last contact was %{runner_contact} ago"
-msgstr ""
+msgstr "Runner er offline. Sidste kontakt var %{runner_contact} siden"
msgid "Runners|Runner is online, last contact was %{runner_contact} ago"
-msgstr ""
+msgstr "Runner er online. Sidste kontakt var %{runner_contact} siden"
msgid "Runners|Runner is paused, last contact was %{runner_contact} ago"
-msgstr ""
+msgstr "Runner er sat på pause. Sidste kontakt var %{runner_contact} siden"
msgid "Runners|Runner registration"
msgstr ""
-msgid "Runners|Runners"
+msgid "Runners|Runner unassigned from project."
msgstr ""
+msgid "Runners|Runners"
+msgstr "Runnere"
+
msgid "Runners|Runners in this group: %{groupRunnersCount}"
-msgstr ""
+msgstr "Runnere i gruppen: %{groupRunnersCount}"
msgid "Runners|Shared runners are available to every project in a GitLab instance. If you want a runner to build only specific projects, restrict the project in the table below. After you restrict a runner to a project, you cannot change it back to a shared runner."
msgstr ""
@@ -28968,28 +29377,28 @@ msgid "Runners|Show Runner installation instructions"
msgstr ""
msgid "Runners|Something went wrong while fetching runner data."
-msgstr ""
+msgstr "Noget gik galt under hentning af runnerdata."
msgid "Runners|Something went wrong while fetching the tags suggestions"
-msgstr ""
+msgstr "Noget fik galt under hentning af mærkatforslagene"
msgid "Runners|Stop the runner from accepting new jobs."
-msgstr ""
+msgstr "Stop runneren i at acceptere nye job."
msgid "Runners|Tags"
msgstr "Mærkater"
msgid "Runners|This runner is associated with one or more projects."
-msgstr ""
+msgstr "Runneren er tilknyttet et eller flere projekter."
msgid "Runners|This runner is associated with specific projects."
-msgstr ""
+msgstr "Runneren er tilknyttet med bestemte projekter."
msgid "Runners|This runner is available to all groups and projects in your GitLab instance."
-msgstr ""
+msgstr "Runneren er tilgængelig for alle grupper og projekter i din GitLab-instans."
msgid "Runners|This runner is available to all projects and subgroups in a group."
-msgstr ""
+msgstr "Runneren er tilgængelig i alle projekter og undergrupper i en gruppe."
msgid "Runners|To install Runner in Kubernetes follow the instructions described in the GitLab documentation."
msgstr ""
@@ -29016,7 +29425,7 @@ msgid "Runners|Version"
msgstr "Version"
msgid "Runners|View installation instructions"
-msgstr ""
+msgstr "Vis installationsinstruktioner"
msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. %{percentage} spot."
msgstr ""
@@ -29028,7 +29437,7 @@ msgid "Runners|You are about to change this instance runner to a project runner.
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 ""
+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 have used %{quotaUsed} out of %{quotaLimit} of your shared Runners pipeline minutes."
msgstr ""
@@ -29043,7 +29452,7 @@ msgid "Runners|locked"
msgstr "låst"
msgid "Runners|paused"
-msgstr ""
+msgstr "sat på pause"
msgid "Runners|project"
msgstr "projekt"
@@ -29058,13 +29467,13 @@ msgid "Running"
msgstr "Kører"
msgid "Runs a number of housekeeping tasks within the current repository, such as compressing file revisions and removing unreachable objects."
-msgstr ""
+msgstr "Kører nogle husarbejdeopgaver i det nuværende depot såsom komprimering af filrevisioner og fjernelse af objekter som ikke kan nås."
msgid "Runs jobs from all unassigned projects in its group."
msgstr ""
msgid "Runs jobs from all unassigned projects."
-msgstr ""
+msgstr "Kører job fra alle utildelte projekter."
msgid "Runs jobs from assigned projects."
msgstr ""
@@ -29079,13 +29488,13 @@ msgid "SAML SSO for %{group_name}"
msgstr ""
msgid "SAML discovery tokens"
-msgstr ""
+msgstr "SAML-opdagelsestokens"
msgid "SAML for %{group_name}"
-msgstr ""
+msgstr "SAML for %{group_name}"
msgid "SAST Configuration"
-msgstr ""
+msgstr "SAST-konfiguration"
msgid "SHA256"
msgstr "SHA256"
@@ -29106,7 +29515,7 @@ msgid "SSH host keys"
msgstr ""
msgid "SSH host keys are not available on this system. Please use %{ssh_keyscan} command or contact your GitLab administrator for more information."
-msgstr ""
+msgstr "SSH-værtsnøgler er ikke tilgængelige på systemet. Brug venligst kommandoen %{ssh_keyscan} eller kontakt din GitLab-administrator for mere information."
msgid "SSH key"
msgstr "SSH-nøgle"
@@ -29115,7 +29524,7 @@ msgid "SSH keys"
msgstr "SSH-nøgler"
msgid "SSH keys allow you to establish a secure connection between your computer and GitLab."
-msgstr ""
+msgstr "SSH-nøgler giver dig mulighed for at etablere en sikker forbindelse mellem din computer og GitLab."
msgid "SSH keys with the following fingerprints are scheduled to expire soon. Expired SSH keys can not be used:"
msgstr ""
@@ -29133,7 +29542,7 @@ msgid "SSL verification"
msgstr ""
msgid "SVG illustration"
-msgstr ""
+msgstr "SVG-illustration"
msgid "SastEntryPoints|Add Security Testing"
msgstr ""
@@ -29145,13 +29554,13 @@ msgid "SastEntryPoints|GitLab can scan your code for security vulnerabilities. S
msgstr ""
msgid "SastEntryPoints|How do I set up SAST?"
-msgstr ""
+msgstr "Hvordan opsætter jeg SAST?"
-msgid "SastEntryPoints|Learn more."
-msgstr "Lær mere."
+msgid "SastEntryPoints|Learn more"
+msgstr ""
msgid "Satisfied"
-msgstr ""
+msgstr "Opfyldt"
msgid "Saturday"
msgstr "Lørdag"
@@ -29181,15 +29590,15 @@ msgid "Save comment"
msgstr "Gem kommentar"
msgid "Save deploy freeze"
-msgstr ""
+msgstr "Gem udsendelsesfrysning"
msgid "Save password"
msgstr "Gem adgangskode"
msgid "Save pipeline schedule"
-msgstr ""
+msgstr "Gem pipelineplanlægning"
-msgid "Save space and find images in the container Registry. remove unneeded tags and keep only the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
+msgid "Save storage space by automatically deleting tags from the container registry and keeping the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
msgstr ""
msgid "Saving"
@@ -29208,34 +29617,34 @@ msgid "Scanner profile not found for given parameters"
msgstr ""
msgid "Schedule a new pipeline"
-msgstr ""
+msgstr "Planlæg en ny pipeline"
msgid "Schedule-based escalation rules must have a schedule in the same project as the policy"
msgstr ""
msgid "Scheduled"
-msgstr ""
+msgstr "Planlagt"
msgid "Scheduled Deletion At - %{permanent_deletion_time}"
msgstr ""
msgid "Scheduled a rebase of branch %{branch}."
-msgstr ""
+msgstr "Planlagde en rebase af grenen %{branch}."
msgid "Scheduled pipelines cannot run more frequently than once per %{limit} minutes. A pipeline configured to run more frequently only starts after %{limit} minutes have elapsed since the last time it ran."
msgstr ""
msgid "Scheduled to merge this merge request (%{strategy})."
-msgstr ""
+msgstr "Planlagt til at sammenlægge sammenlægningsanmodningen (%{strategy})."
msgid "Schedules"
-msgstr ""
+msgstr "Planlægger"
msgid "Schedules to merge this merge request (%{strategy})."
-msgstr ""
+msgstr "Planlægger til at sammenlægge sammenlægningsanmodningen (%{strategy})."
msgid "Scheduling Pipelines"
-msgstr ""
+msgstr "Planlægger pipelines"
msgid "Scope"
msgstr "Omfang"
@@ -29280,7 +29689,7 @@ msgid "Search GitLab"
msgstr "Søg på GitLab"
msgid "Search Jira issues"
-msgstr "Søg efter Jura-problemstillinger"
+msgstr "Søg efter Jira-problemstillinger"
msgid "Search a group"
msgstr "Søg efter en gruppe"
@@ -29289,7 +29698,7 @@ msgid "Search an environment spec"
msgstr ""
msgid "Search assignees"
-msgstr ""
+msgstr "Søg efter tildelere"
msgid "Search authors"
msgstr "Søg efter forfattere"
@@ -29310,7 +29719,7 @@ msgid "Search by author"
msgstr "Søg efter forfatter"
msgid "Search by commit title or SHA"
-msgstr ""
+msgstr "Søg efter commit-titel eller SHA"
msgid "Search by message"
msgstr "Søg efter meddelelse"
@@ -29363,6 +29772,9 @@ msgstr "Søg efter eller filtrér resultater ..."
msgid "Search or filter results…"
msgstr "Søg efter eller filtrér resultater …"
+msgid "Search or jump to..."
+msgstr ""
+
msgid "Search project"
msgstr "Søg efter projekt"
@@ -29391,10 +29803,10 @@ msgid "Search your project dependencies for their licenses and apply policies."
msgstr ""
msgid "Search your projects"
-msgstr ""
+msgstr "Søg efter dine projekter"
msgid "SearchAutocomplete|All GitLab"
-msgstr ""
+msgstr "Hele GitLab"
msgid "SearchAutocomplete|Issues I've created"
msgstr "Problemstillinger jeg har oprettet"
@@ -29409,10 +29821,10 @@ msgid "SearchAutocomplete|Merge requests assigned to me"
msgstr "Sammenlægningsanmodninger tildelt til mig"
msgid "SearchAutocomplete|Merge requests that I'm a reviewer"
-msgstr ""
+msgstr "Sammenlægningsanmodninger hvor jeg er en kontrollant"
msgid "SearchAutocomplete|in all GitLab"
-msgstr ""
+msgstr "i hele GitLab"
msgid "SearchAutocomplete|in group %{groupName}"
msgstr "i gruppen %{groupName}"
@@ -29423,16 +29835,16 @@ msgstr "i projektet %{projectName}"
msgid "SearchCodeResults|of %{link_to_project}"
msgstr ""
-msgid "SearchResults|Showing %{count} %{scope} for%{term_element}"
+msgid "SearchResults|Showing %{count} %{scope} for %{term_element}"
msgstr ""
-msgid "SearchResults|Showing %{count} %{scope} for%{term_element} in your personal and project snippets"
+msgid "SearchResults|Showing %{count} %{scope} for %{term_element} in your personal and project snippets"
msgstr ""
-msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for%{term_element}"
+msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for %{term_element}"
msgstr ""
-msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for%{term_element} in your personal and project snippets"
+msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for %{term_element} in your personal and project snippets"
msgstr ""
msgid "SearchResults|code result"
@@ -29477,8 +29889,8 @@ msgstr[1] "projekter"
msgid "SearchResults|snippet"
msgid_plural "SearchResults|snippets"
-msgstr[0] "uddrag"
-msgstr[1] "uddrag"
+msgstr[0] "udklip"
+msgstr[1] "udklip"
msgid "SearchResults|user"
msgid_plural "SearchResults|users"
@@ -29487,11 +29899,11 @@ msgstr[1] "brugere"
msgid "SearchResults|wiki result"
msgid_plural "SearchResults|wiki results"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "wikiresultat"
+msgstr[1] "wikiresultater"
msgid "Searching by both author and message is currently not supported."
-msgstr ""
+msgstr "Søgning efter både forfatter og meddelelse understøttes ikke i øjeblikket."
msgid "Seats usage data as of %{last_enqueue_time} (Updated daily)"
msgstr ""
@@ -29514,6 +29926,9 @@ msgstr "Hemmelig"
msgid "Secret Detection"
msgstr ""
+msgid "Secret access key"
+msgstr ""
+
msgid "Secret token"
msgstr "Hemmelig token"
@@ -29539,23 +29954,20 @@ msgid "Security navigation"
msgstr "Sikkerhedsnavigation"
msgid "Security report is out of date. Please update your branch with the latest changes from the target branch (%{targetBranchName})"
-msgstr ""
+msgstr "Sikkerhedsrapporten er forældet. Opdater venligst din gren med de seneste ændringer fra målgrenen (%{targetBranchName})"
msgid "Security report is out of date. Run %{newPipelineLinkStart}a new pipeline%{newPipelineLinkEnd} for the target branch (%{targetBranchName})"
-msgstr ""
+msgstr "Sikkerhedsrapporten er forældet. Kør %{newPipelineLinkStart}en ny pipeline%{newPipelineLinkEnd} for målgrenen (%{targetBranchName})"
msgid "SecurityApprovals|A merge request approval is required when a security report contains a new vulnerability."
msgstr ""
msgid "SecurityApprovals|A merge request approval is required when test coverage declines."
-msgstr ""
+msgstr "En sammenlægningsgodkendelse kræves når testdækning afviser."
msgid "SecurityApprovals|A merge request approval is required when the license compliance report contains a denied license."
msgstr ""
-msgid "SecurityApprovals|Configurable if security scanners are enabled. %{linkStart}Learn more.%{linkEnd}"
-msgstr ""
-
msgid "SecurityApprovals|Coverage-Check"
msgstr ""
@@ -29566,10 +29978,7 @@ msgid "SecurityApprovals|Learn more about License-Check"
msgstr ""
msgid "SecurityApprovals|Learn more about Vulnerability-Check"
-msgstr ""
-
-msgid "SecurityApprovals|License Scanning must be enabled. %{linkStart}Learn more%{linkEnd}."
-msgstr ""
+msgstr "Lær mere om sårbarhedstjek"
msgid "SecurityApprovals|License-Check"
msgstr ""
@@ -29577,17 +29986,14 @@ msgstr ""
msgid "SecurityApprovals|Requires approval for Denied licenses. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}More information%{linkEnd}"
+msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "SecurityApprovals|Requires approval for vulnerabilities. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
-msgid "SecurityApprovals|Test coverage must be enabled. %{linkStart}Learn more%{linkEnd}."
-msgstr ""
-
msgid "SecurityApprovals|Vulnerability-Check"
-msgstr ""
+msgstr "SÃ¥rbarhedstjek"
msgid "SecurityConfiguration|%{featureName} merge request creation mutation failed"
msgstr ""
@@ -29596,7 +30002,7 @@ msgid "SecurityConfiguration|%{scanType} configuration code snippet"
msgstr ""
msgid "SecurityConfiguration|An error occurred while creating the merge request."
-msgstr ""
+msgstr "Der opstod en fejl under oprettelse af sammenlægningsanmodningen."
msgid "SecurityConfiguration|Available with Ultimate"
msgstr "Tilgængelig med Ultimate"
@@ -29611,25 +30017,25 @@ msgid "SecurityConfiguration|Configuration guide"
msgstr ""
msgid "SecurityConfiguration|Configuration history"
-msgstr ""
+msgstr "Konfigurationshistorik"
msgid "SecurityConfiguration|Configure %{feature}"
-msgstr ""
+msgstr "Konfigurer %{feature}"
msgid "SecurityConfiguration|Configure via Merge Request"
msgstr ""
msgid "SecurityConfiguration|Copy code and open .gitlab-ci.yml file"
-msgstr ""
+msgstr "Kopiér kode og åbn .gitlab-ci.yml-fil"
msgid "SecurityConfiguration|Copy code only"
msgstr ""
msgid "SecurityConfiguration|Could not retrieve configuration data. Please refresh the page, or try again later."
-msgstr ""
+msgstr "Kunne ikke hente konfigurationsdata. Opdater venligst siden eller prøv igen senere."
msgid "SecurityConfiguration|Create Merge Request"
-msgstr ""
+msgstr "Opret sammenlægningsanmodning"
msgid "SecurityConfiguration|Customize common SAST settings to suit your requirements. Configuration changes made here override those provided by GitLab and are excluded from updates. For details of more advanced configuration options, see the %{linkStart}GitLab SAST documentation%{linkEnd}."
msgstr ""
@@ -29649,6 +30055,12 @@ msgstr ""
msgid "SecurityConfiguration|Immediately begin risk analysis and remediation with application security features. Start with SAST and Secret Detection, available to all plans. Upgrade to Ultimate to get all features, including:"
msgstr ""
+msgid "SecurityConfiguration|Manage corpus"
+msgstr ""
+
+msgid "SecurityConfiguration|Manage corpus files used as mutation sources in coverage fuzzing."
+msgstr ""
+
msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
msgstr ""
@@ -29695,14 +30107,20 @@ msgid "SecurityConfiguration|Vulnerability details and statistics in the merge r
msgstr ""
msgid "SecurityOrchestration|%{branches} %{plural}"
-msgstr ""
+msgstr "%{branches} %{plural}"
msgid "SecurityOrchestration|%{branches} and %{lastBranch} %{plural}"
-msgstr ""
+msgstr "%{branches} og %{lastBranch} %{plural}"
msgid "SecurityOrchestration|Action"
msgstr ""
+msgid "SecurityOrchestration|Actions"
+msgstr ""
+
+msgid "SecurityOrchestration|Add rule"
+msgstr ""
+
msgid "SecurityOrchestration|All policies"
msgstr ""
@@ -29736,14 +30154,11 @@ msgstr ""
msgid "SecurityOrchestration|Network"
msgstr ""
-msgid "SecurityOrchestration|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
-msgstr ""
-
msgid "SecurityOrchestration|New policy"
msgstr ""
msgid "SecurityOrchestration|Only owners can update Security Policy Project"
-msgstr ""
+msgstr "Kun ejere kan opdatere sikkerhedsregelsætprojekt"
msgid "SecurityOrchestration|Policies"
msgstr ""
@@ -29754,15 +30169,21 @@ msgstr ""
msgid "SecurityOrchestration|Policy editor"
msgstr ""
+msgid "SecurityOrchestration|Policy preview"
+msgstr ""
+
msgid "SecurityOrchestration|Policy status"
msgstr ""
msgid "SecurityOrchestration|Policy type"
-msgstr ""
+msgstr "Regelsættype"
msgid "SecurityOrchestration|Rule"
msgstr ""
+msgid "SecurityOrchestration|Rules"
+msgstr ""
+
msgid "SecurityOrchestration|Scan Execution"
msgstr ""
@@ -29770,13 +30191,13 @@ msgid "SecurityOrchestration|Scan execution"
msgstr ""
msgid "SecurityOrchestration|Scan to be performed every %{cadence} on the %{branches}"
-msgstr ""
+msgstr "Skanning som skal udføres hvert %{cadence} på %{branches}"
msgid "SecurityOrchestration|Scan to be performed on every pipeline on the %{branches}"
msgstr ""
msgid "SecurityOrchestration|Security policy project was linked successfully"
-msgstr ""
+msgstr "Sikkerhedsregelsætprojekt blev linket"
msgid "SecurityOrchestration|Select a project to store your security policies in. %{linkStart}More information.%{linkEnd}"
msgstr ""
@@ -29785,7 +30206,7 @@ msgid "SecurityOrchestration|Select security project"
msgstr "Vælg sikkerhedsprojekt"
msgid "SecurityOrchestration|Sorry, your filter produced no results."
-msgstr ""
+msgstr "Beklager, dit filter gav ingen resultater."
msgid "SecurityOrchestration|There was a problem creating the new security policy"
msgstr ""
@@ -29806,22 +30227,22 @@ msgid "SecurityOrhestration|No rules defined - policy will not run."
msgstr ""
msgid "SecurityPolicies|+%{count} more"
-msgstr ""
+msgstr "+%{count} mere"
msgid "SecurityPolicies|Environment(s)"
msgstr "Miljøer"
msgid "SecurityPolicies|Policy type"
-msgstr ""
+msgstr "Regelsættype"
msgid "SecurityReports|%{firstProject} and %{secondProject}"
-msgstr ""
+msgstr "%{firstProject} og %{secondProject}"
msgid "SecurityReports|%{firstProject}, %{secondProject}, and %{rest}"
-msgstr ""
+msgstr "%{firstProject}, %{secondProject} og %{rest}"
msgid "SecurityReports|Add or remove projects to monitor in the security area. Projects included in this list will have their results displayed in the security dashboard and vulnerability report."
-msgstr ""
+msgstr "Tilføj eller fjern projekter som skal overvåges i sikkerhedsområdet. Projekter som er medtaget i listen får deres resultater vist i sikkerhedsbetjeningspanelet og sårbarhedsrapporten."
msgid "SecurityReports|Add projects"
msgstr "Tilføj projekter"
@@ -29839,7 +30260,7 @@ msgid "SecurityReports|Change status"
msgstr "Ændr status"
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
-msgstr ""
+msgstr "Kommentar tilføjet til '%{vulnerabilityName}'"
msgid "SecurityReports|Comment deleted on '%{vulnerabilityName}'"
msgstr ""
@@ -29856,9 +30277,12 @@ msgstr "Opret Jira-problemstilling"
msgid "SecurityReports|Create issue"
msgstr "Opret problemstilling"
-msgid "SecurityReports|Dismiss vulnerability"
+msgid "SecurityReports|Development vulnerabilities"
msgstr ""
+msgid "SecurityReports|Dismiss vulnerability"
+msgstr "Afskedig sårbarhed"
+
msgid "SecurityReports|Dismissed '%{vulnerabilityName}'"
msgstr ""
@@ -29869,10 +30293,13 @@ msgid "SecurityReports|Download %{artifactName}"
msgstr "Download %{artifactName}"
msgid "SecurityReports|Download results"
+msgstr "Download resultater"
+
+msgid "SecurityReports|Download scanned URLs"
msgstr ""
msgid "SecurityReports|Download scanned resources"
-msgstr ""
+msgstr "Download skannede ressourcer"
msgid "SecurityReports|Either you don't have permission to view this dashboard or the dashboard has not been setup. Please check your permission settings with your administrator or check your dashboard configurations to proceed."
msgstr ""
@@ -29881,28 +30308,28 @@ msgid "SecurityReports|Ensure that %{trackingStart}issue tracking%{trackingEnd}
msgstr ""
msgid "SecurityReports|Error fetching the vulnerability counts. Please check your network connection and try again."
-msgstr ""
+msgstr "Fejl ved hentning af sårbarhedstællingerne. Tjek venligst din netværksforbindelse og prøv igen."
msgid "SecurityReports|Error fetching the vulnerability list. Please check your network connection and try again."
-msgstr ""
+msgstr "Fejl ved hentning af sårbarhedslisten. Tjek venligst din netværksforbindelse og prøv igen."
msgid "SecurityReports|Error parsing security reports"
-msgstr ""
+msgstr "Fejl ved fortolkning af sikkerhedsrapporter"
msgid "SecurityReports|Failed to get security report information. Please reload the page or try again later."
-msgstr ""
+msgstr "Kunne ikke hente sikkerhedsrapportinformation. Genindlæs venligst siden og prøv igen senere."
msgid "SecurityReports|Hide dismissed"
msgstr ""
msgid "SecurityReports|Issue Created"
-msgstr ""
+msgstr "Problemstilling oprettet"
msgid "SecurityReports|Issues created from a vulnerability cannot be removed."
msgstr ""
msgid "SecurityReports|Learn more about setting up your dashboard"
-msgstr ""
+msgstr "Lær mere om at opsætte dit betjeningspanel"
msgid "SecurityReports|Manage and track vulnerabilities identified in projects within your group. Vulnerabilities in projects are shown here when security testing is configured."
msgstr ""
@@ -29917,7 +30344,7 @@ msgid "SecurityReports|Maximum selected projects limit reached"
msgstr ""
msgid "SecurityReports|Monitor vulnerabilities in all of your projects"
-msgstr ""
+msgstr "Overvåg sårbarheder i alle dine projekter"
msgid "SecurityReports|Monitor vulnerabilities in your group"
msgstr ""
@@ -29926,7 +30353,7 @@ msgid "SecurityReports|Monitor vulnerabilities in your project"
msgstr ""
msgid "SecurityReports|Monitored projects"
-msgstr ""
+msgstr "Overvågede projekter"
msgid "SecurityReports|More info"
msgstr "Mere information"
@@ -29941,7 +30368,7 @@ msgid "SecurityReports|No vulnerabilities found"
msgstr ""
msgid "SecurityReports|No vulnerabilities found for this pipeline"
-msgstr ""
+msgstr "Ingen sårbarheder fundet for pipelinen"
msgid "SecurityReports|Oops, something doesn't seem right."
msgstr ""
@@ -29950,7 +30377,7 @@ msgid "SecurityReports|Project"
msgstr "Projekt"
msgid "SecurityReports|Project was not found or you do not have permission to add this project to Security Dashboards."
-msgstr ""
+msgstr "Projektet blev ikke fundet eller du har ikke tilladelse til at tilføje projektet til sikkerhedsbetjeningspanelet."
msgid "SecurityReports|Projects added"
msgstr "Projekter tilføjet"
@@ -29971,10 +30398,10 @@ msgid "SecurityReports|Security reports help page link"
msgstr ""
msgid "SecurityReports|Security scans have run"
-msgstr ""
+msgstr "Sikkerhedsskanninger har kørt"
msgid "SecurityReports|Select a project to add by using the project search field above."
-msgstr ""
+msgstr "Vælg et projekt som skal tilføjes ved at bruge projektsøgefeltet ovenover."
msgid "SecurityReports|Set status"
msgstr "Indstil status"
@@ -29986,7 +30413,7 @@ msgid "SecurityReports|Sometimes a scanner can't determine a finding's severity.
msgstr ""
msgid "SecurityReports|Sorry, your filter produced no results"
-msgstr ""
+msgstr "Beklager, dit filter gav ingen resultater"
msgid "SecurityReports|Status"
msgstr "Status"
@@ -29994,6 +30421,9 @@ msgstr "Status"
msgid "SecurityReports|Take survey"
msgstr ""
+msgid "SecurityReports|The Vulnerability Report shows the results of the lastest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "SecurityReports|The security reports below contain one or more vulnerability findings that could not be parsed and were not recorded. Download the artifacts in the job output to investigate. Ensure any security report created conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
msgstr ""
@@ -30064,7 +30494,7 @@ 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 ""
+msgstr "Din feedback er vigtig for os! Vi spørger igen om en uge."
msgid "See example DevOps Score page in our documentation."
msgstr ""
@@ -30073,7 +30503,7 @@ msgid "See metrics"
msgstr "Se målinger"
msgid "See our website for help"
-msgstr ""
+msgstr "Se vores websted for hjælp"
msgid "See the affected projects in the GitLab admin panel"
msgstr ""
@@ -30097,7 +30527,7 @@ msgid "Select Git revision"
msgstr "Vælg Git-revision"
msgid "Select GitLab project to link with your Slack team"
-msgstr ""
+msgstr "Vælg GitLab-projekt som skal linkes med dit Slack-team"
msgid "Select Page"
msgstr "Vælg side"
@@ -30106,7 +30536,7 @@ msgid "Select a branch"
msgstr "Vælg en gren"
msgid "Select a file from the left sidebar to begin editing. Afterwards, you'll be able to commit your changes."
-msgstr ""
+msgstr "Vælg en fil i den venstre sidebjælke for at begynde redigering. Herefter vil du være i stand til at committe dine ændringer."
msgid "Select a framework that applies to this project. %{linkStart}How are these added?%{linkEnd}"
msgstr ""
@@ -30127,7 +30557,7 @@ msgid "Select a project"
msgstr "Vælg et projekt"
msgid "Select a project to read Insights configuration file"
-msgstr ""
+msgstr "Vælg et projekt for at læse Insights-konfigurationsfilen"
msgid "Select a reason"
msgstr "Vælg en årsag"
@@ -30135,12 +30565,12 @@ msgstr "Vælg en årsag"
msgid "Select a repository"
msgstr "Vælg et depot"
+msgid "Select a repository containing templates for common files."
+msgstr ""
+
msgid "Select a role"
msgstr "Vælg en rolle"
-msgid "Select a shared template repository for all projects on this instance."
-msgstr ""
-
msgid "Select a template repository"
msgstr "Vælg et skabelondepot"
@@ -30184,7 +30614,7 @@ msgid "Select group or project"
msgstr "Vælg gruppe eller projekt"
msgid "Select groups to replicate"
-msgstr ""
+msgstr "Vælg grupper som skal replikeres"
msgid "Select health status"
msgstr "Vælg helbredsstatus"
@@ -30199,7 +30629,7 @@ msgid "Select labels"
msgstr "Vælg etiketter"
msgid "Select merge moment"
-msgstr ""
+msgstr "Vælg sammenlægningsøjeblik"
msgid "Select milestone"
msgstr "Vælg milepæl"
@@ -30211,11 +30641,14 @@ msgid "Select project"
msgstr "Vælg projekt"
msgid "Select project and zone to choose machine type"
-msgstr ""
+msgstr "Vælg projekt og zone for at vælge maskintype"
msgid "Select project to choose zone"
msgstr "Vælg projekt for at vælge zone"
+msgid "Select project to create issue"
+msgstr ""
+
msgid "Select projects"
msgstr "Vælg projekter"
@@ -30223,13 +30656,13 @@ msgid "Select reviewer(s)"
msgstr "Vælg kontrollanter"
msgid "Select shards to replicate"
-msgstr ""
+msgstr "Vælg shards som skal replikeres"
msgid "Select source"
msgstr "Vælg kilde"
msgid "Select source branch"
-msgstr ""
+msgstr "Vælg kildegren"
msgid "Select start date"
msgstr "Vælg startdato"
@@ -30238,7 +30671,7 @@ msgid "Select status"
msgstr "Vælg status"
msgid "Select strategy activation method"
-msgstr ""
+msgstr "Vælg strategiaktiveringsmetode"
msgid "Select subgroup"
msgstr "Vælg undergruppe"
@@ -30271,46 +30704,46 @@ msgid "Selecting a GitLab user will add a link to the GitLab user in the descrip
msgstr "Valg af en GitLab-bruger vil tilføje et link til GitLab-brugeren i beskrivelserne af problemstillinger og kommentarer (f.eks. \"Af %{link_open}@ronnierev%{link_close}\"). Det vil også tilknytte og/eller tildele problemstillingerne og kommentarerne med den valgte bruger."
msgid "Selective synchronization"
-msgstr ""
+msgstr "Selektiv synkronisering"
msgid "Self monitoring"
msgstr "Selvovervågning"
msgid "Self monitoring project does not exist"
-msgstr ""
+msgstr "Selvovervågningsprojekt findes ikke"
msgid "Self-monitoring project does not exist. Please check logs for any error messages"
-msgstr ""
+msgstr "Selvovervågningsprojekt findes ikke. Tjek venligst loggene for fejlmeddelelser"
msgid "Self-monitoring project has been successfully deleted"
-msgstr ""
+msgstr "Selvovervågningsprojekt er blevet slettet"
msgid "Self-monitoring project was not deleted. Please check logs for any error messages"
-msgstr ""
+msgstr "Selvovervågningsprojekt blev ikke slettet. Tjek venligst loggene for fejlmeddelelser"
msgid "SelfMonitoring|Activate or deactivate instance self monitoring."
-msgstr ""
+msgstr "Aktivér eller deaktivér selvovervågning af instans."
msgid "SelfMonitoring|Activate self monitoring to create a project to use to monitor the health of your instance."
-msgstr ""
+msgstr "Aktivér selvovervågning for at oprette et projekt som skal bruges til at overvåge helbredet på din instans."
msgid "SelfMonitoring|Deactivate self monitoring?"
msgstr "Deaktivér selvovervågning?"
msgid "SelfMonitoring|Deactivating self monitoring deletes the self monitoring project. Are you sure you want to deactivate self monitoring and delete the project?"
-msgstr ""
+msgstr "Deaktivering af selvovervågning sletter selvovervågningsprojektet. Er du sikker på, at du vil deaktivere selvovervågning og slette projektet?"
msgid "SelfMonitoring|Self monitoring"
msgstr "Selvovervågning"
msgid "SelfMonitoring|Self monitoring is active. Use the %{projectLinkStart}self monitoring project%{projectLinkEnd} to monitor the health of your instance."
-msgstr ""
+msgstr "Selvovervågning er aktiv. Brug %{projectLinkStart}selvovervågningsprojektet%{projectLinkEnd} til at overvåge helbredet på din instans."
msgid "SelfMonitoring|Self monitoring project successfully created."
-msgstr ""
+msgstr "Selvovervågningsprojekt oprettet."
msgid "SelfMonitoring|Self monitoring project successfully deleted."
-msgstr ""
+msgstr "Selvovervågningsprojekt slettet."
msgid "Send"
msgstr "Send"
@@ -30325,30 +30758,36 @@ msgid "Send email"
msgstr "Send e-mail"
msgid "Send email in multipart format (HTML and plain text). Uncheck to send email messages in plain text only."
-msgstr ""
+msgstr "Send e-mail i multipart-format (HTML og ren tekst). Fravælg for kun at sende e-mail-meddeleleser i ren tekst."
msgid "Send email notification"
-msgstr ""
+msgstr "Send e-mail-underretning"
msgid "Send emails to help guide new users through the onboarding process."
+msgstr "Send e-mails som hjælp til at vejlede nye brugere gennem indførelsesprocessen."
+
+msgid "Send emails to users upon account deactivation."
msgstr ""
msgid "Send message"
msgstr "Send meddelelse"
msgid "Send notifications about project events to Mattermost channels."
-msgstr ""
+msgstr "Send underretninger om projektbegivenheder til Mattermost-kanaler."
msgid "Send notifications about project events to Mattermost channels. %{docs_link}"
-msgstr ""
+msgstr "Send underretninger om projektbegivenheder til Mattermost-kanaler. %{docs_link}"
msgid "Send notifications about project events to a Discord channel. %{docs_link}"
-msgstr ""
+msgstr "Send underretninger om projektbegivenheder til en Discord-kanal. %{docs_link}"
msgid "Send report"
msgstr "Send rapport"
msgid "Send service data"
+msgstr "Send tjenestedata"
+
+msgid "Sentry"
msgstr ""
msgid "Sentry API URL"
@@ -30376,7 +30815,7 @@ msgid "Server (optional)"
msgstr "Server (valgfrit)"
msgid "Server supports batch API only, please update your Git LFS client to version 1.0.1 and up."
-msgstr ""
+msgstr "Serveren understøtter kun batch-API. Opdater venligst din Git LFS-klient til version 1.0.1 og op."
msgid "Server version"
msgstr "Serverversion"
@@ -30385,7 +30824,7 @@ msgid "Serverless"
msgstr "Serverfri"
msgid "Serverless domain"
-msgstr ""
+msgstr "Serverfrit domæne"
msgid "Serverless platform"
msgstr "Serverfri platform"
@@ -30403,22 +30842,22 @@ msgid "ServerlessDetails|Invocations"
msgstr ""
msgid "ServerlessDetails|Kubernetes Pods"
-msgstr ""
+msgstr "Kubernetes-pods"
msgid "ServerlessDetails|More information"
msgstr "Mere information"
msgid "ServerlessDetails|No pods loaded at this time."
-msgstr ""
+msgstr "Ingen pods indlæst på nuværende tidspunkt."
msgid "ServerlessDetails|Number of Kubernetes pods in use over time based on necessity."
msgstr ""
msgid "ServerlessDetails|pod in use"
-msgstr ""
+msgstr "pod i brug"
msgid "ServerlessDetails|pods in use"
-msgstr ""
+msgstr "pods i brug"
msgid "ServerlessURL|Copy URL"
msgstr "Kopiér URL"
@@ -30436,16 +30875,16 @@ msgid "Serverless|In order to start using functions as a service, you must first
msgstr ""
msgid "Serverless|Learn more about Serverless"
-msgstr ""
+msgstr "Lær mere om serverfri"
msgid "Serverless|No functions available"
-msgstr ""
+msgstr "Ingen funktioner tilgængelige"
msgid "Serverless|Sign up for First Look"
msgstr ""
msgid "Serverless|The deploy job has not finished."
-msgstr ""
+msgstr "Udsendelsesjobbet er ikke færdigt."
msgid "Serverless|The functions listed in the %{startTag}serverless.yml%{endTag} file don't match the namespace of your cluster."
msgstr ""
@@ -30457,58 +30896,61 @@ msgid "Serverless|We are continually striving to improve our Serverless function
msgstr ""
msgid "Serverless|Your %{startTag}.gitlab-ci.yml%{endTag} file is not properly configured."
-msgstr ""
+msgstr "Din %{startTag}.gitlab-ci.yml%{endTag}-fil er ikke ordentligt konfigureret."
msgid "Serverless|Your repository does not have a corresponding %{startTag}serverless.yml%{endTag} file."
-msgstr ""
+msgstr "Dit depot har ikke en tilhørende %{startTag}serverless.yml%{endTag}-fil."
msgid "Service"
msgstr "Tjeneste"
+msgid "Service Accounts keys are required to authorize GitLab to deploy your Google Cloud project."
+msgstr ""
+
msgid "Service Desk"
-msgstr "Service Desk"
+msgstr "Serviceskranke"
msgid "Service Desk allows people to create issues in your GitLab instance without their own user account. It provides a unique email address for end users to create issues in a project. Replies can be sent either through the GitLab interface or by email. End users only see threads through email."
-msgstr ""
+msgstr "Serviceskranke giver personer mulighed for at oprette problemstillinger i din GitLab-instans uden deres egen brugerkonto. Det giver en unik e-mailadressen til slutbrugeren som kan bruges til at oprette problemstillinger i et projekt. Svar kan enten sendes gennem GitLab-grænsefladen eller med e-mail. Kun slutbrugere ser tråde via e-mail."
msgid "Service URL"
-msgstr ""
+msgstr "Tjeneste-URL"
msgid "Service ping is disabled in your configuration file, and cannot be enabled through this form."
msgstr ""
msgid "ServiceDesk|Enable Service Desk"
-msgstr "Aktivér Service Desk"
+msgstr "Aktivér serviceskranke"
msgid "ServiceDesk|For help setting up the Service Desk for your instance, please contact an administrator."
-msgstr ""
+msgstr "Kontakt venligst en administrator for at få hjælp med at opsætning serviceskranken til din instans."
msgid "ServiceDesk|Issues created from Service Desk emails appear here. Each comment becomes part of the email conversation."
-msgstr ""
+msgstr "Problemstillinger som er oprettet med e-mails fra serviceskranken vises her. Hver kommentar bliver en del af e-mail-samtalen."
msgid "ServiceDesk|Issues created from Service Desk emails will appear here. Each comment becomes part of the email conversation."
-msgstr ""
+msgstr "Problemstillinger som er oprettet med e-mails fra serviceskranken vises her. Hver kommentar bliver en del af e-mail-samtalen."
msgid "ServiceDesk|Service Desk is enabled but not yet active"
-msgstr "Service Desk er aktiveret men endnu ikke aktiv"
+msgstr "Serviceskranke er aktiveret men endnu ikke aktiv"
msgid "ServiceDesk|Service Desk is not enabled"
-msgstr "Service Desk er ikke aktiveret"
+msgstr "Serviceskranke er ikke aktiveret"
msgid "ServiceDesk|Service Desk is not supported"
-msgstr "Service Desk understøttes ikke"
+msgstr "Serviceskranke understøttes ikke"
msgid "ServiceDesk|To activate Service Desk on this instance, an instance administrator must first set up incoming email."
-msgstr ""
+msgstr "For at aktivere serviceskranke i instansen skal en instansadministrator først opsætte indgående e-mail."
msgid "ServiceDesk|To enable Service Desk on this instance, an instance administrator must first set up incoming email."
-msgstr ""
+msgstr "For at aktivere serviceskranke i instansen skal en instansadministrator først opsætte indgående e-mail."
msgid "ServiceDesk|Use Service Desk to connect with your users and offer customer support through email right inside GitLab"
-msgstr ""
+msgstr "Brug serviceskranke til at skabe forbindelse med dine brugere og tilbyde kundesupport gennem e-mail direkte i GitLab"
msgid "ServiceDesk|Your users can send emails to this address:"
-msgstr ""
+msgstr "Dine brugere kan sende e-mails til denne adresse:"
msgid "ServicePing|Service ping is off"
msgstr ""
@@ -30529,23 +30971,23 @@ msgid "Session duration (minutes)"
msgstr ""
msgid "Set %{epic_ref} as the parent epic."
-msgstr ""
+msgstr "Indstil %{epic_ref} som forælderepicen."
msgid "Set a default description template to be used for new issues. %{link_start}What are description templates?%{link_end}"
msgstr ""
msgid "Set a password on your account to pull or push via %{protocol}."
-msgstr ""
-
-msgid "Set a template repository for projects in this group"
-msgstr ""
+msgstr "Indstil en adgangskode på din konto for at bruge pull eller push via %{protocol}."
msgid "Set access permissions for this token."
-msgstr ""
+msgstr "Indstil adgangstilladelser for tokenen."
msgid "Set an instance-wide domain that will be available to all clusters when installing Knative."
msgstr ""
+msgid "Set any rate limit to %{code_open}0%{code_close} to disable the limit."
+msgstr ""
+
msgid "Set default and restrict visibility levels. Configure import sources and git access protocol."
msgstr ""
@@ -30558,7 +31000,7 @@ msgstr "Indstil gennemløb"
msgid "Set limit to 0 to allow any file size."
msgstr "Indstil grænse til 0 for at tillade alle filstørrelser."
-msgid "Set max session time for web terminal."
+msgid "Set limits for web and API requests."
msgstr ""
msgid "Set milestone"
@@ -30567,15 +31009,18 @@ msgstr "Indstil milepæl"
msgid "Set new password"
msgstr "Indstil ny adgangskode"
-msgid "Set notification email for abuse reports."
-msgstr ""
-
msgid "Set parent epic to an epic"
+msgstr "Indstil forælderepic til en epic"
+
+msgid "Set per-user rate limits for imports and exports of projects and groups."
msgstr ""
msgid "Set projects and maximum size limits, session duration, user options, and check feature availability for namespace plan."
msgstr ""
+msgid "Set rate limits for package registry API requests that supersede the general user and IP rate limits."
+msgstr ""
+
msgid "Set severity"
msgstr "Indstil alvorlighed"
@@ -30594,23 +31039,32 @@ msgstr "Indstil målgren til %{branch_name}."
msgid "Set the default branch for this project. All merge requests and commits are made against this branch unless you specify a different one."
msgstr ""
+msgid "Set the default expiration time for job artifacts in all projects. Set to %{code_open}0%{code_close} to never expire artifacts by default. If no unit is written, it defaults to seconds. For example, these are all equivalent: %{code_open}3600%{code_close}, %{code_open}60 minutes%{code_close}, or %{code_open}one hour%{code_close}."
+msgstr ""
+
msgid "Set the due date to %{due_date}."
msgstr "Indstil forfaldsdatoen til %{due_date}."
msgid "Set the iteration to %{iteration_reference}."
msgstr ""
+msgid "Set the maximum session time for a web terminal."
+msgstr ""
+
msgid "Set the milestone to %{milestone_reference}."
msgstr ""
+msgid "Set the per-user rate limit for notes created by web or API requests."
+msgstr ""
+
msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
msgstr ""
msgid "Set time estimate"
-msgstr ""
+msgstr "Indstil tidsestimat"
msgid "Set time estimate to %{time_estimate}."
-msgstr ""
+msgstr "Indstil tidsestimat til %{time_estimate}."
msgid "Set up CI/CD"
msgstr "Opsæt CI/CD"
@@ -30619,7 +31073,7 @@ msgid "Set up Jira Integration"
msgstr "Opsæt Jira-integrering"
msgid "Set up a %{type} Runner for a project"
-msgstr ""
+msgstr "Opsæt en %{type}-runner til et projekt"
msgid "Set up a %{type} runner manually"
msgstr ""
@@ -30628,7 +31082,7 @@ msgid "Set up a hardware device as a second factor to sign in."
msgstr ""
msgid "Set up assertions/attributes/claims (email, first_name, last_name) and NameID according to %{docsLinkStart}the documentation %{icon}%{docsLinkEnd}"
-msgstr ""
+msgstr "Opsæt hævdelser/attributter/claims (email, first_name, last_name) og NameID i henhold til %{docsLinkStart}dokumentationen%{icon}%{docsLinkEnd}"
msgid "Set up new device"
msgstr "Opsæt ny enhed"
@@ -30652,10 +31106,10 @@ msgid "Set weight to %{weight}."
msgstr "Indstil vægt til %{weight}."
msgid "Set what should be replicated by this secondary site."
-msgstr ""
+msgstr "Indstil hvad der skal replikeres af det sekundære websted."
msgid "SetPasswordToCloneLink|set a password"
-msgstr ""
+msgstr "indstil en adgangskode"
msgid "SetStatusModal|A busy indicator is shown next to your name and avatar."
msgstr "En optaget-indikator vises ved siden af dit navn og avatar."
@@ -30685,7 +31139,7 @@ msgid "SetStatusModal|Set status"
msgstr "Indstil status"
msgid "SetStatusModal|Sorry, we weren't able to set your status. Please try again later."
-msgstr ""
+msgstr "Beklager, vi var ikke i stand til at indstille din status. Prøv venligst igen senere."
msgid "SetStatusModal|Status updated"
msgstr "Status opdateret"
@@ -30694,10 +31148,10 @@ msgid "SetStatusModal|What's your status?"
msgstr "Hvad er din status?"
msgid "SetStatusModal|Your status resets on %{date}."
-msgstr ""
+msgstr "Din status nulstilles %{date}."
msgid "Sets %{epic_ref} as parent epic."
-msgstr ""
+msgstr "Indstiller %{epic_ref} som forælderepic."
msgid "Sets target branch to %{branch_name}."
msgstr ""
@@ -30715,7 +31169,7 @@ msgid "Sets the severity"
msgstr "Indstiller alvorligheden"
msgid "Sets time estimate to %{time_estimate}."
-msgstr ""
+msgstr "Indstiller tidsestimat til %{time_estimate}."
msgid "Sets weight to %{weight}."
msgstr "Indstiller vægt til %{weight}."
@@ -30763,25 +31217,25 @@ msgid "Share the %{strong_open}GitLab single sign-on URL%{strong_close} with mem
msgstr ""
msgid "Shared Runners"
-msgstr ""
+msgstr "Delte runnere"
msgid "Shared projects"
msgstr "Delte projekter"
msgid "Shared runners"
-msgstr ""
+msgstr "Delte runnere"
msgid "Shared runners are disabled for the parent group"
-msgstr ""
+msgstr "Delte runnere are deaktiveret for forældergruppen"
msgid "Shared runners are disabled on group level"
-msgstr ""
+msgstr "Delte runnere er deaktiveret på gruppeniveau"
msgid "Shared runners details"
-msgstr ""
+msgstr "Detaljer for delte runnere"
msgid "Shared runners help link"
-msgstr ""
+msgstr "Hjælpelink for delte runnere"
msgid "SharedRunnersMinutesSettings|By resetting the pipeline minutes for this namespace, the currently used minutes will be set to zero."
msgstr ""
@@ -30804,6 +31258,9 @@ msgstr "Vis pipeline-id"
msgid "Show Pipeline IID"
msgstr "Vis pipeline-iid"
+msgid "Show all %{issuable_type}."
+msgstr ""
+
msgid "Show all activity"
msgstr "Vis al aktivitet"
@@ -30855,23 +31312,17 @@ msgstr "Vis seneste version"
msgid "Show list"
msgstr "Vis liste"
-msgid "Show me advanced features"
-msgstr ""
-
msgid "Show me how to add a pipeline"
msgstr "Vis mig hvordan en pipeline tilføjes"
-msgid "Show me the basics"
-msgstr "Vis mig det grundlæggende"
-
msgid "Show one file at a time"
msgstr "Vis én fil ad gangen"
msgid "Show parent pages"
-msgstr ""
+msgstr "Vis forældersider"
msgid "Show parent subgroups"
-msgstr ""
+msgstr "Vis forælderundergrupper"
msgid "Show the Closed list"
msgstr "Vis den lukkede liste"
@@ -30899,20 +31350,20 @@ msgstr[0] "Viser %{count} projekt"
msgstr[1] "Viser %{count} projekter"
msgid "Showing %{limit} of %{total_count} issues. "
-msgstr ""
+msgstr "Viser %{limit} af %{total_count} problemstillinger. "
msgid "Showing %{pageSize} of %{total} %{issuableType}"
msgstr ""
-msgid "Showing %{pageSize} of %{total} issues"
-msgstr ""
-
msgid "Showing all epics"
msgstr "Viser alle epics"
msgid "Showing all issues"
msgstr "Viser alle problemstillinger"
+msgid "Showing data for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
+msgstr ""
+
msgid "Showing data for workflow items created in this date range. Date range cannot exceed %{maxDateRange} days."
msgstr ""
@@ -30935,10 +31386,10 @@ msgid "Sidebar|%{name}: %{value}"
msgstr "%{name}: %{value}"
msgid "Sidebar|Assign health status"
-msgstr ""
+msgstr "Tildel helbredsstatus"
msgid "Sidebar|Health status"
-msgstr ""
+msgstr "Helbredsstatus"
msgid "Sidebar|No status"
msgstr "Ingen status"
@@ -30947,11 +31398,20 @@ msgid "Sidebar|None"
msgstr "Ingen"
msgid "Sidebar|Only numeral characters allowed"
-msgstr ""
+msgstr "Kun numeriske tegn er tilladt"
msgid "Sidebar|Weight"
msgstr "Vægt"
+msgid "Sidekiq job compression threshold (bytes)"
+msgstr ""
+
+msgid "Sidekiq job size limit (bytes)"
+msgstr ""
+
+msgid "Sidekiq job size limits"
+msgstr ""
+
msgid "Sign in"
msgstr "Log ind"
@@ -30971,10 +31431,10 @@ msgid "Sign in to GitLab"
msgstr "Log ind på GitLab"
msgid "Sign in using smart card"
-msgstr ""
+msgstr "Log ind med smartcard"
msgid "Sign in via 2FA code"
-msgstr "Log ind via 2FG-kode"
+msgstr "Log ind via 2TG-kode"
msgid "Sign in with"
msgstr "Log ind med"
@@ -30992,46 +31452,46 @@ msgid "Sign out"
msgstr "Log ud"
msgid "Sign out & Register"
-msgstr ""
+msgstr "Log ud og tilmeld"
msgid "Sign up"
msgstr "Tilmeld"
msgid "Sign up was successful! Please confirm your email to sign in."
-msgstr ""
+msgstr "Tilmeldingen lykkedes! Bekræft venligst din e-mail for at logge ind."
msgid "Sign-in and Help page"
msgstr ""
msgid "Sign-in count:"
-msgstr ""
+msgstr "Antal indlogninger:"
msgid "Sign-in page"
-msgstr ""
+msgstr "Indlogningsside"
msgid "Sign-in restrictions"
-msgstr ""
+msgstr "Begrænsninger for indlogning"
msgid "Sign-in text"
-msgstr ""
+msgstr "Indlogningstekst"
msgid "Sign-out page URL"
msgstr ""
msgid "Sign-up restrictions"
-msgstr ""
+msgstr "Begrænsninger for tilmelding"
msgid "SignUp|By clicking %{button_text}, I agree that I have read and accepted the %{link_start}Terms of Use and Privacy Policy%{link_end}"
-msgstr ""
+msgstr "Ved at klikke på %{button_text} accepterer jeg at jeg har læst og accepteret %{link_start}vilkår for tjeneste og privatlivspolitik%{link_end}"
msgid "SignUp|By clicking %{button_text}, I agree that I have read and accepted the GitLab %{link_start}Terms of Use and Privacy Policy%{link_end}"
-msgstr ""
+msgstr "Ved at klikke på %{button_text} accepterer jeg at jeg har læst og accepteret GitLabs %{link_start}vilkår for tjeneste og privatlivspolitik%{link_end}"
msgid "SignUp|First name is too long (maximum is %{max_length} characters)."
-msgstr ""
+msgstr "Fornavn er for langt (maksimum er %{max_length} tegn)."
msgid "SignUp|Last name is too long (maximum is %{max_length} characters)."
-msgstr ""
+msgstr "Efternavn er for langt (maksimum er %{max_length} tegn)."
msgid "SignUp|Minimum length is %{minimum_password_length} characters."
msgstr ""
@@ -31040,10 +31500,10 @@ msgid "SignUp|Username is too long (maximum is %{max_length} characters)."
msgstr ""
msgid "SignUp|Username is too short (minimum is %{min_length} characters)."
-msgstr ""
+msgstr "Brugernavn er for kort (minimum er %{min_length} tegn)."
msgid "Signed in"
-msgstr "logget ind"
+msgstr "Loggede ind"
msgid "Signed in to GitLab as %{user_link}"
msgstr ""
@@ -31055,7 +31515,7 @@ msgid "Signing in using %{label} has been disabled"
msgstr ""
msgid "Signing in using your %{label} account without a pre-existing GitLab account is not allowed."
-msgstr ""
+msgstr "Indlogning med din %{label}-konto uden en allerede eksisterende GitLab-konto er ikke tilladt."
msgid "Similar issues"
msgstr "Lignende problemstillinger"
@@ -31072,14 +31532,17 @@ msgstr ""
msgid "Site profile not found for given parameters"
msgstr ""
+msgid "Sites"
+msgstr ""
+
msgid "Size"
msgstr "Størrelse"
msgid "Size Limits"
-msgstr ""
+msgstr "Størrelsesgrænser"
msgid "Size limit per repository (MB)"
-msgstr ""
+msgstr "Størrelsesgrænse pr. depot (MB)"
msgid "Skip outdated deployment jobs"
msgstr ""
@@ -31094,27 +31557,30 @@ msgid "Skype:"
msgstr "Skype:"
msgid "Slack application"
-msgstr ""
+msgstr "Slack-program"
msgid "Slack integration allows you to interact with GitLab via slash commands in a chat window."
msgstr ""
msgid "SlackIntegration|Sends notifications about project events to Slack channels."
+msgstr "Sender underretninger om projektbegivenheder til Slack-kanaler."
+
+msgid "SlackService|1. %{slash_command_link_start}Add a slash command%{slash_command_link_end} in your Slack team using this information:"
msgstr ""
-msgid "SlackService|2. Paste the %{strong_open}Token%{strong_close} into the field below"
+msgid "SlackService|2. Paste the token from Slack in the %{strong_open}Token%{strong_close} field below."
msgstr ""
-msgid "SlackService|3. Select the %{strong_open}Active%{strong_close} checkbox, press %{strong_open}Save changes%{strong_close} and start using GitLab inside Slack!"
+msgid "SlackService|3. Select the %{strong_open}Active%{strong_close} checkbox, select %{strong_open}Save changes%{strong_close}, and start using slash commands in Slack!"
msgstr ""
-msgid "SlackService|Fill in the word that works best for your team."
+msgid "SlackService|After setup, get a list of available Slack slash commands by entering"
msgstr ""
-msgid "SlackService|See list of available commands in Slack after setting up this service, by entering"
+msgid "SlackService|Fill in the word that works best for your team."
msgstr ""
-msgid "SlackService|This service allows users to perform common operations on this project by entering slash commands in Slack."
+msgid "SlackService|Perform common operations in this project by entering slash commands in Slack."
msgstr ""
msgid "Slice multiplier"
@@ -31127,28 +31593,28 @@ msgid "Smartcard authentication failed: client certificate header is missing."
msgstr ""
msgid "Snippets"
-msgstr "Uddrag"
+msgstr "Snippets"
msgid "Snippets with non-text files can only be edited via Git."
msgstr ""
msgid "SnippetsEmptyState|Code snippets"
-msgstr "Kodeuddrag"
+msgstr "Kodeudklip"
msgid "SnippetsEmptyState|Documentation"
msgstr "Dokumentation"
msgid "SnippetsEmptyState|New snippet"
-msgstr "Nyt uddrag"
+msgstr "Nyt udklip"
msgid "SnippetsEmptyState|No snippets found"
-msgstr "Ingen uddrag fundet"
+msgstr "Ingen udklip fundet"
msgid "SnippetsEmptyState|Store, share, and embed small pieces of code and text."
-msgstr ""
+msgstr "Gem, del og indlejr små stykker kode og tekst."
msgid "SnippetsEmptyState|There are no snippets to show."
-msgstr "Der er ingen uddrag at vise."
+msgstr "Der er ingen udklip at vise."
msgid "Snippets|Add another file %{num}/%{total}"
msgstr "Tilføj endnu en fil %{num}/%{total}"
@@ -31166,7 +31632,7 @@ msgid "Snippets|Give your file a name to add code highlighting, e.g. example.rb
msgstr ""
msgid "Snippets|Optionally add a description about what your snippet does or how to use it…"
-msgstr ""
+msgstr "Tilføj valgfrit en beskrivelse om hvad dit udklip gør og hvordan det bruges …"
msgid "Snowplow"
msgstr "Snowplow"
@@ -31180,23 +31646,23 @@ msgstr "Nogle ændringer vises ikke"
msgid "Some child epics may be hidden due to applied filters"
msgstr ""
-msgid "Some common domains are not allowed. %{read_more_link}."
+msgid "Some common domains are not allowed. %{learn_more_link}."
msgstr ""
msgid "Some of the designs you tried uploading did not change:"
msgstr ""
msgid "Someone edited the issue at the same time you did. Please check out %{linkStart}the issue%{linkEnd} and make sure your changes will not unintentionally remove theirs."
-msgstr ""
+msgstr "Nogen redigerede problemstillingen på samme tid som dig. Tjek venligst %{linkStart}problemstillingen%{linkEnd} og sørg for at dine ændringer ikke utilsigtet fjerner deres."
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 "Nogen redigerede denne %{issueType} på samme tid som dig. Beskrivelsen er blevet opdateret og du skal foretage dine ændringer igen."
msgid "Someone edited this merge request at the same time you did. Please refresh the page to see changes."
-msgstr ""
+msgstr "Nogen redigerede sammenlægningsanmodningen på samme tid som dig. Opdater venligst siden for at se ændringerne."
msgid "Someone edited this test case at the same time you did. The description has been updated and you will need to make your changes again."
-msgstr ""
+msgstr "Nogen redigerede testsagen på samme tid som dig. Beskrivelsen er blevet opdateret og du skal foretage dine ændringer igen."
msgid "Someone, hopefully you, has requested to reset the password for your GitLab account on %{link_to_gitlab}."
msgstr ""
@@ -31205,67 +31671,64 @@ msgid "Something went wrong"
msgstr "Noget gik galt"
msgid "Something went wrong on our end"
-msgstr "Noget gik galt i vores ende"
+msgstr "Noget gik galt hos os"
msgid "Something went wrong on our end."
-msgstr "Noget gik galt i vores ende."
+msgstr "Noget gik galt hos os."
msgid "Something went wrong on our end. Please try again!"
-msgstr "Noget gik galt i vores ende. Prøv venligst igen!"
+msgstr "Noget gik galt hos os. Prøv venligst igen!"
msgid "Something went wrong on our end. Please try again."
-msgstr "Noget gik galt i vores ende. Prøv venligst igen."
+msgstr "Noget gik galt hos os. Prøv venligst igen."
msgid "Something went wrong trying to change the locked state of this %{issuableDisplayName}"
-msgstr ""
+msgstr "Noget gik galt ved forsøg på at ændre den låste tilstand af denne %{issuableDisplayName}"
msgid "Something went wrong when reordering designs. Please try again"
-msgstr ""
+msgstr "Noget gik galt ved omorganisering af designs. Prøv venligst igen"
msgid "Something went wrong when toggling the button"
msgstr ""
msgid "Something went wrong while adding your award. Please try again."
-msgstr ""
+msgstr "Noget gik galt under tilføjelse af din belønning. Prøv venligst igen."
msgid "Something went wrong while applying the batch of suggestions. Please try again."
-msgstr ""
+msgstr "Noget gik galt under anvendelse af batchen med forslag. Prøv venligst igen."
msgid "Something went wrong while applying the suggestion. Please try again."
-msgstr ""
+msgstr "Noget gik galt under anvendelse af forslaget. Prøv venligst igen."
msgid "Something went wrong while archiving a requirement."
-msgstr ""
+msgstr "Noget gik galt under arkivering af et krav."
msgid "Something went wrong while closing the epic. Please try again later."
-msgstr ""
+msgstr "Noget gik galt under lukning af epicen. Prøv venligst igen senere."
msgid "Something went wrong while closing the merge request. Please try again later."
-msgstr ""
+msgstr "Noget gik galt under lukning af sammenlægningsanmodningen. Prøv venligst igen senere."
msgid "Something went wrong while creating a requirement."
-msgstr ""
+msgstr "Noget gik galt under oprettelse af et krav."
msgid "Something went wrong while deleting description changes. Please try again."
-msgstr ""
+msgstr "Noget gik galt under sletning af beskrivelsesændringer. Prøv venligst igen."
msgid "Something went wrong while deleting the source branch. Please try again."
-msgstr ""
+msgstr "Noget gik galt under sletning af kildegrenen. Prøv venligst igen."
msgid "Something went wrong while deleting your note. Please try again."
-msgstr ""
+msgstr "Noget gik galt under sletning af din note. Prøv venligst igen."
msgid "Something went wrong while deploying this environment. Please try again."
-msgstr ""
+msgstr "Noget gik galt under udsendelse af miljøet. Prøv venligst igen."
msgid "Something went wrong while editing your comment. Please try again."
-msgstr ""
+msgstr "Noget gik galt under redigering af din kommentar. Prøv venligst igen."
msgid "Something went wrong while exporting requirements"
-msgstr ""
-
-msgid "Something went wrong while fetching %{listType} list"
-msgstr ""
+msgstr "Noget gik galt under eksport af krav"
msgid "Something went wrong while fetching branches"
msgstr "Noget gik galt under hentning af grene"
@@ -31280,7 +31743,7 @@ msgid "Something went wrong while fetching details"
msgstr "Noget gik galt under hentning af detaljer"
msgid "Something went wrong while fetching group member contributions"
-msgstr ""
+msgstr "Noget gik galt under hentning af gruppemedlemsbidrag"
msgid "Something went wrong while fetching latest comments."
msgstr "Noget gik galt under hentning af seneste kommentarer."
@@ -31295,10 +31758,10 @@ msgid "Something went wrong while fetching related merge requests."
msgstr "Noget gik galt under hentning af relaterede sammenlægningsanmodninger."
msgid "Something went wrong while fetching requirements count."
-msgstr ""
+msgstr "Noget gik galt under hentning af kravtælling."
msgid "Something went wrong while fetching requirements list."
-msgstr ""
+msgstr "Noget gik galt under hentning af kravliste."
msgid "Something went wrong while fetching source branches."
msgstr "Noget gik galt under hentning af kildegrene."
@@ -31313,7 +31776,7 @@ msgid "Something went wrong while fetching the packages list."
msgstr "Noget gik galt under hentning af pakkelisten."
msgid "Something went wrong while initializing the OpenAPI viewer"
-msgstr ""
+msgstr "Noget gik galt under hentning af initiering af OpenAPI-fremviseren"
msgid "Something went wrong while inserting your image. Please try again."
msgstr "Noget gik galt under indsættelse af dit billede. Prøv venligst igen."
@@ -31321,20 +31784,14 @@ msgstr "Noget gik galt under indsættelse af dit billede. Prøv venligst igen."
msgid "Something went wrong while merging this merge request. Please try again."
msgstr "Noget gik galt under sammenlægning af sammenlægningsanmodningen. Prøv venligst igen."
-msgid "Something went wrong while moving issues."
-msgstr "Noget gik galt under flytning af problemstillinger."
-
msgid "Something went wrong while obtaining the Let's Encrypt certificate."
msgstr "Noget gik galt under indhentelse af Let's Encrypt-certifikatet."
-msgid "Something went wrong while performing the action."
-msgstr "Noget gik galt under udførsel af handlingen."
-
msgid "Something went wrong while promoting the issue to an epic. Please try again."
-msgstr ""
+msgstr "Noget gik galt under forfremmelse af problemstillingen til en epic. Prøv venligst igen."
msgid "Something went wrong while reopening a requirement."
-msgstr ""
+msgstr "Noget gik galt under genåbning af et krav."
msgid "Something went wrong while reopening the epic. Please try again later."
msgstr "Noget gik galt under genåbning af epicen. Prøv venligst igen senere."
@@ -31349,19 +31806,19 @@ msgid "Something went wrong while setting %{issuableType} %{dateType} date."
msgstr ""
msgid "Something went wrong while setting %{issuableType} confidentiality."
-msgstr ""
+msgstr "Noget gik galt under indstilling af fortroligheden %{issuableType}."
msgid "Something went wrong while setting %{issuableType} health status."
-msgstr ""
+msgstr "Noget gik galt under indstilling af helbredsstatussen %{issuableType}."
msgid "Something went wrong while setting %{issuableType} notifications."
-msgstr ""
+msgstr "Noget gik galt under indstilling af underretningerne %{issuableType}."
msgid "Something went wrong while setting %{issuableType} to-do item."
-msgstr ""
+msgstr "Noget gik galt under indstilling af gøremålselementet %{issuableType}."
msgid "Something went wrong while setting %{issuableType} weight."
-msgstr ""
+msgstr "Noget gik galt under indstilling af vægten %{issuableType}."
msgid "Something went wrong while stopping this environment. Please try again."
msgstr "Noget gik galt under stop af miljøet. Prøv venligst igen."
@@ -31370,13 +31827,13 @@ msgid "Something went wrong while updating a requirement."
msgstr "Noget gik galt under opdatering af et krav."
msgid "Something went wrong while updating assignees"
-msgstr ""
+msgstr "Noget gik galt under opdatering af tildelere"
msgid "Something went wrong while updating your list settings"
msgstr "Noget gik galt under opdatering af dine listeindstillinger"
msgid "Something went wrong with your automatic subscription renewal."
-msgstr ""
+msgstr "Noget fik galt under fornyelse af dit automatiske abonnement."
msgid "Something went wrong, unable to add %{project} to dashboard"
msgstr "Noget gik galt, kan ikke tilføje %{project} til betjeningspanel"
@@ -31391,7 +31848,7 @@ msgid "Something went wrong, unable to get projects"
msgstr "Noget gik galt, kan ikke hente projekter"
msgid "Something went wrong, unable to search projects"
-msgstr ""
+msgstr "Noget gik galt. Kan ikke søge efter projekter"
msgid "Something went wrong. Please try again later"
msgstr "Noget gik galt. Prøv venligst igen senere"
@@ -31406,13 +31863,13 @@ msgid "Sorry, no epics matched your search"
msgstr ""
msgid "Sorry, no projects matched your search"
-msgstr ""
+msgstr "Beklager, ingen projekter matchede din søgning"
msgid "Sorry, you have exceeded the maximum browsable page number. Please use the API to explore further."
msgstr ""
msgid "Sorry, your filter produced no results"
-msgstr ""
+msgstr "Beklager, dit filter gav ingen resultater"
msgid "Sort by"
msgstr "Sortér efter"
@@ -31427,13 +31884,13 @@ msgid "Sort direction: Descending"
msgstr "Sorteringsretning: faldende"
msgid "SortOptions|Blocking"
-msgstr ""
+msgstr "Blokerende"
msgid "SortOptions|Closed date"
-msgstr ""
+msgstr "Lukningsdato"
msgid "SortOptions|Closed earlier"
-msgstr ""
+msgstr "Lukket tidligere"
msgid "SortOptions|Closed recently"
msgstr ""
@@ -31448,22 +31905,22 @@ msgid "SortOptions|Due later"
msgstr ""
msgid "SortOptions|Due soon"
-msgstr ""
+msgstr "Forfalder snart"
msgid "SortOptions|Expired date"
msgstr ""
msgid "SortOptions|Label priority"
-msgstr ""
+msgstr "Etiketprioritet"
msgid "SortOptions|Largest group"
msgstr "Største gruppe"
msgid "SortOptions|Largest repository"
-msgstr ""
+msgstr "Største depot"
msgid "SortOptions|Last Contact"
-msgstr ""
+msgstr "Sidste kontakt"
msgid "SortOptions|Last created"
msgstr ""
@@ -31472,7 +31929,7 @@ msgid "SortOptions|Last updated"
msgstr "Sidst opdateret"
msgid "SortOptions|Least popular"
-msgstr ""
+msgstr "Mindst populær"
msgid "SortOptions|Less weight"
msgstr "Mindre vægt"
@@ -31481,16 +31938,16 @@ msgid "SortOptions|Manual"
msgstr ""
msgid "SortOptions|Merged date"
-msgstr ""
+msgstr "Sammenlægningsdato"
msgid "SortOptions|Merged earlier"
-msgstr ""
+msgstr "Sammenlagt tidligere"
msgid "SortOptions|Merged recently"
msgstr "Sammenlagt for nyligt"
msgid "SortOptions|Milestone due date"
-msgstr ""
+msgstr "Forfaldsdato for milepæl"
msgid "SortOptions|Milestone due later"
msgstr ""
@@ -31586,7 +32043,7 @@ msgid "Source"
msgstr "Kilde"
msgid "Source (branch or tag)"
-msgstr ""
+msgstr "Kilde (gren eller mærkat)"
msgid "Source Branch"
msgstr "Kildegren"
@@ -31610,7 +32067,7 @@ msgid "Source is not available"
msgstr "Kilden er ikke tilgængelig"
msgid "Source project cannot be found."
-msgstr "Kildeprojektet kan ikke findes."
+msgstr "Kan ikke finde kildeprojekt."
msgid "Sourcegraph"
msgstr "Sourcegraph"
@@ -31619,10 +32076,10 @@ msgid "SourcegraphAdmin|Block on private and internal projects"
msgstr ""
msgid "SourcegraphAdmin|Configure the URL to a Sourcegraph instance which can read your GitLab projects."
-msgstr ""
+msgstr "Konfigurer URL'en til en Sourcegraph-instans som kan læse dine GitLab-projekter."
msgid "SourcegraphAdmin|Enable Sourcegraph"
-msgstr ""
+msgstr "Aktivér Sourcegraph"
msgid "SourcegraphAdmin|Enable code intelligence powered by %{link_start}Sourcegraph%{link_end} on your GitLab instance's code views and merge requests."
msgstr ""
@@ -31637,10 +32094,10 @@ msgid "SourcegraphAdmin|Save changes"
msgstr "Gem ændringer"
msgid "SourcegraphAdmin|Sourcegraph URL"
-msgstr ""
+msgstr "Sourcegraph-URL"
msgid "SourcegraphAdmin|e.g. https://sourcegraph.example.com"
-msgstr ""
+msgstr "f.eks. https://sourcegraph.example.com"
msgid "SourcegraphPreferences|This feature is experimental and currently limited to certain projects."
msgstr "Funktionen er eksperimentel og på nuværende tidspunkt begrænset til visse projekter."
@@ -31657,17 +32114,20 @@ msgstr "Bruger %{linkStart}Sourcegraph.com%{linkEnd}."
msgid "SourcegraphPreferences|Uses a custom %{linkStart}Sourcegraph instance%{linkEnd}."
msgstr "Bruger en tilpasset %{linkStart}Sourcegraph-instans%{linkEnd}."
-msgid "Spam Check API Key"
+msgid "Spam Check"
+msgstr ""
+
+msgid "Spam Check API key"
msgstr ""
msgid "Spam Logs"
msgstr "Spamlogge"
msgid "Spam and Anti-bot Protection"
-msgstr ""
+msgstr "Beskyttelse for spam og anti-bot"
msgid "Spam log successfully submitted as ham."
-msgstr ""
+msgstr "Spamlog indsendt som ham."
msgid "Specific runners"
msgstr ""
@@ -31675,29 +32135,29 @@ msgstr ""
msgid "Specified URL cannot be used: \"%{reason}\""
msgstr ""
-msgid "Specify an e-mail address regex pattern to identify default internal users."
+msgid "Specify an email address regex pattern to identify default internal users."
msgstr ""
msgid "Speed up your pipelines with Needs relationships"
-msgstr ""
+msgstr "Gør dine pipelines hurtigere med behovrelationer"
msgid "Spent At"
-msgstr ""
+msgstr "Brugt kl."
msgid "Squash commit message"
-msgstr ""
+msgstr "Squash commit-meddelelse"
msgid "Squash commits"
-msgstr ""
+msgstr "Squash commits"
msgid "Stack trace"
-msgstr ""
+msgstr "Stakspor"
msgid "Stacktrace snippet"
msgstr ""
msgid "Stage"
-msgstr ""
+msgstr "Stadie"
msgid "Standard"
msgstr "Standard"
@@ -31727,7 +32187,7 @@ msgid "StarredProjectsEmptyState|Visit a project page and press on a star icon.
msgstr ""
msgid "StarredProjectsEmptyState|You don't have starred projects yet."
-msgstr ""
+msgstr "Du har endnu ingen stjernemarkerede projekter."
msgid "Starrers"
msgstr ""
@@ -31742,7 +32202,7 @@ msgid "Start Time"
msgstr "Starttidspunkt"
msgid "Start Web Terminal"
-msgstr ""
+msgstr "Start webterminal"
msgid "Start a %{new_merge_request} with these changes"
msgstr "Start en %{new_merge_request} med disse ændringer"
@@ -31775,7 +32235,7 @@ msgid "Start date"
msgstr "Startdato"
msgid "Start merge train"
-msgstr ""
+msgstr "Start sammenlægningstog"
msgid "Start merge train when pipeline succeeds"
msgstr ""
@@ -31784,13 +32244,13 @@ msgid "Start search"
msgstr "Start søgning"
msgid "Start thread"
-msgstr ""
+msgstr "Start tråd"
msgid "Start thread & close %{noteable_name}"
-msgstr ""
+msgstr "Start tråd og luk %{noteable_name}"
msgid "Start thread & reopen %{noteable_name}"
-msgstr ""
+msgstr "Start tråd og genåbn %{noteable_name}"
msgid "Start your Free Ultimate Trial"
msgstr "Start din gratis Ultimate-prøveperiode"
@@ -31805,7 +32265,7 @@ msgid "Started"
msgstr "Startet"
msgid "Started %{startsIn}"
-msgstr ""
+msgstr "Startet %{startsIn}"
msgid "Started asynchronous removal of all repository check states."
msgstr ""
@@ -31814,88 +32274,88 @@ msgid "Starting..."
msgstr "Starter ..."
msgid "Starts"
-msgstr ""
+msgstr "Starter"
msgid "Starts %{startsIn}"
msgstr "Starter %{startsIn}"
msgid "Starts at (UTC)"
-msgstr ""
+msgstr "Starter kl. (UTC)"
msgid "Starts on"
msgstr "Starter"
msgid "Starts: %{startsAt}"
-msgstr ""
+msgstr "Starter: %{startsAt}"
msgid "State your message to activate"
msgstr ""
msgid "Static Application Security Testing (SAST)"
-msgstr ""
+msgstr "Static Application Security Testing (SAST)"
msgid "StaticSiteEditor|1. Add a clear title to describe the change."
-msgstr ""
+msgstr "1. Tilføj en klar titel og beskriv ændringen."
msgid "StaticSiteEditor|2. Add a description to explain why the change is being made."
-msgstr ""
+msgstr "2. Tilføj en beskrivelse for at forklare hvorfor ændringen foretages."
msgid "StaticSiteEditor|3. Assign a person to review and accept the merge request."
-msgstr ""
+msgstr "3. Tildel en person til at kontrollere og acceptere sammenlægningsanmodningen."
msgid "StaticSiteEditor|A link to view the merge request will appear once ready."
msgstr ""
msgid "StaticSiteEditor|An error occurred while submitting your changes."
-msgstr ""
+msgstr "Der opstod en fejl under indsendelsen af dine ændringer."
msgid "StaticSiteEditor|Automatic formatting changes"
msgstr ""
msgid "StaticSiteEditor|Branch could not be created."
-msgstr ""
+msgstr "Gren kunne ikke oprettes."
msgid "StaticSiteEditor|Copy update"
-msgstr ""
+msgstr "Kopiér opdatering"
msgid "StaticSiteEditor|Could not commit the content changes."
msgstr ""
msgid "StaticSiteEditor|Could not create merge request."
-msgstr ""
+msgstr "Kunne ikke oprette sammenlægningsanmodning."
msgid "StaticSiteEditor|Creating your merge request"
-msgstr ""
+msgstr "Opretter din sammenlægningsanmodning"
msgid "StaticSiteEditor|Incompatible file content"
-msgstr ""
+msgstr "Inkompatibelt filindhold"
msgid "StaticSiteEditor|Markdown formatting preferences introduced by the Static Site Editor"
-msgstr ""
+msgstr "Markdown-formateringspræferencer indført af editor til statisk websted"
msgid "StaticSiteEditor|Return to site"
-msgstr ""
+msgstr "Tilbage til websted"
msgid "StaticSiteEditor|Static site editor"
-msgstr ""
+msgstr "Editor til statisk websted"
msgid "StaticSiteEditor|The Static Site Editor is currently configured to only edit Markdown content on pages generated from Middleman. Visit the documentation to learn more about configuring your site to use the Static Site Editor."
-msgstr ""
+msgstr "Editor til statisk websted er i øjeblikket konfigureret til kun at redigere Markdown-indhold på sider som er genereret fra Middleman. Besøg dokumentationen for at lære mere om at konfigurere dit websted til at bruge editor til statisk websted."
msgid "StaticSiteEditor|To see your changes live you will need to do the following things:"
-msgstr ""
+msgstr "For at se dine ændringer live skal du gøre følgende:"
msgid "StaticSiteEditor|Update %{sourcePath} file"
-msgstr ""
+msgstr "Opdater %{sourcePath}-fil"
msgid "StaticSiteEditor|View documentation"
-msgstr ""
+msgstr "Vis dokumentation"
msgid "StaticSiteEditor|You can set an assignee to get your changes reviewed and deployed once your merge request is created."
msgstr ""
msgid "StaticSiteEditor|Your merge request has been created"
-msgstr ""
+msgstr "Din sammenlægningsanmodning er blevet oprettet"
msgid "Statistics"
msgstr "Statistik"
@@ -31913,28 +32373,28 @@ msgid "Status: %{title}"
msgstr "Status: %{title}"
msgid "StatusCheck|%{pending} pending"
-msgstr ""
+msgstr "%{pending} afventer"
msgid "StatusCheck|API to check"
msgstr ""
msgid "StatusCheck|Add status check"
-msgstr ""
+msgstr "Tilføj statustjek"
msgid "StatusCheck|All passed"
-msgstr ""
+msgstr "Alle bestået"
msgid "StatusCheck|An error occurred deleting the %{name} status check."
msgstr ""
msgid "StatusCheck|An error occurred fetching the status checks."
-msgstr ""
+msgstr "Der opstod en fejl ved hentning af statustjekkene."
-msgid "StatusCheck|Apply this status check to any branch or a specific protected branch."
+msgid "StatusCheck|Apply this status check to all branches or a specific protected branch."
msgstr ""
msgid "StatusCheck|Check for a status response in Merge Requests. Failures do not block merges. %{link_start}Learn more%{link_end}."
-msgstr ""
+msgstr "Tjek for et statussvar i sammenlægningsanmodninger. Mislykkede blokerer ikke sammenlægninger. %{link_start}Lær mere%{link_end}."
msgid "StatusCheck|Examples: QA, Security."
msgstr "Eksempler: kvalitetssikring, sikkerhed."
@@ -31952,31 +32412,31 @@ msgid "StatusCheck|No status checks are defined yet."
msgstr ""
msgid "StatusCheck|Remove status check"
-msgstr ""
+msgstr "Fjern statustjek"
msgid "StatusCheck|Remove status check?"
-msgstr ""
+msgstr "Fjern statustjek?"
msgid "StatusCheck|Service name"
-msgstr ""
+msgstr "Tjenestenavn"
msgid "StatusCheck|Status checks"
-msgstr ""
+msgstr "Statustjek"
msgid "StatusCheck|Status to check"
-msgstr ""
+msgstr "Status som skal tjekkes"
msgid "StatusCheck|Target branch"
-msgstr ""
+msgstr "MÃ¥lgren"
msgid "StatusCheck|Update status check"
-msgstr ""
+msgstr "Opdater statustjek"
msgid "StatusCheck|When this merge request is updated, a call is sent to the following APIs to confirm their status. %{linkStart}Learn more%{linkEnd}."
msgstr ""
msgid "StatusCheck|You are about to remove the %{name} status check."
-msgstr ""
+msgstr "Du er ved at fjerne statustjekket %{name}."
msgid "StatusPage|AWS %{docsLink}"
msgstr ""
@@ -32033,10 +32493,10 @@ msgid "Step 4."
msgstr "Trin 4."
msgid "Stop Terminal"
-msgstr ""
+msgstr "Stop terminal"
msgid "Stop impersonation"
-msgstr ""
+msgstr "Stop efterligning"
msgid "Stop this environment"
msgstr "Stop miljøet"
@@ -32054,7 +32514,7 @@ msgid "Storage nodes for new repositories"
msgstr ""
msgid "Storage:"
-msgstr "Lager"
+msgstr "Lager:"
msgid "StorageSize|Unknown"
msgstr "Ukendt"
@@ -32072,10 +32532,10 @@ msgid "Subgroup navigation"
msgstr ""
msgid "SubgroupCreationLevel|Allowed to create subgroups"
-msgstr ""
+msgstr "MÃ¥ oprette undergrupper"
msgid "SubgroupCreationlevel|Allowed to create subgroups"
-msgstr ""
+msgstr "MÃ¥ oprette undergrupper"
msgid "SubgroupCreationlevel|Maintainers"
msgstr ""
@@ -32102,7 +32562,7 @@ msgid "Submit a review"
msgstr "Indsend en kontrol"
msgid "Submit as ham"
-msgstr ""
+msgstr "Indsend som ham"
msgid "Submit as spam"
msgstr "Indsend som spam"
@@ -32129,7 +32589,7 @@ msgid "Submit your changes"
msgstr "Indsend dine ændringer"
msgid "Submitted as ham"
-msgstr ""
+msgstr "Indsendt som ham"
msgid "Submitted the current review."
msgstr "Indsendte den nuværende kontrol."
@@ -32138,13 +32598,13 @@ msgid "Subscribe"
msgstr "Abonner"
msgid "Subscribe at group level"
-msgstr ""
+msgstr "Abonner på gruppeniveau"
msgid "Subscribe at project level"
-msgstr ""
+msgstr "Abonner på projektniveau"
msgid "Subscribe to RSS feed"
-msgstr ""
+msgstr "Abonner på RSS-feed"
msgid "Subscribe to calendar"
msgstr "Abonner på kalender"
@@ -32153,40 +32613,40 @@ msgid "Subscribed"
msgstr "Abonneret"
msgid "Subscribed to this %{quick_action_target}."
-msgstr ""
+msgstr "Abonneret til denne %{quick_action_target}."
msgid "Subscribes to this %{quick_action_target}."
-msgstr ""
+msgstr "Abonnerer til denne %{quick_action_target}."
msgid "Subscription"
msgstr "Abonnement"
msgid "Subscription History"
-msgstr ""
+msgstr "Abonnementshistorik"
msgid "Subscription deletion failed."
-msgstr ""
+msgstr "Sletning af abonnement mislykkedes."
msgid "Subscription service outage"
msgstr ""
msgid "Subscription successfully applied to \"%{group_name}\""
-msgstr ""
+msgstr "Abonnement anvendt på \"%{group_name}\""
msgid "Subscription successfully created."
-msgstr ""
+msgstr "Abonnement oprettet."
msgid "Subscription successfully deleted."
-msgstr ""
+msgstr "Abonnement slettet."
msgid "SubscriptionTable|Add seats"
msgstr "Tilføj sæder"
msgid "SubscriptionTable|An error occurred while loading the subscription details."
-msgstr ""
+msgstr "Der opstod en fejl under indlæsning af abonnementsdetaljerne."
msgid "SubscriptionTable|Billing"
-msgstr ""
+msgstr "Fakturering"
msgid "SubscriptionTable|Free"
msgstr "Gratis"
@@ -32195,22 +32655,22 @@ msgid "SubscriptionTable|GitLab allows you to continue using your subscription e
msgstr ""
msgid "SubscriptionTable|Last invoice"
-msgstr ""
+msgstr "Sidste regning"
msgid "SubscriptionTable|Loading subscriptions"
-msgstr ""
+msgstr "Indlæser abonnementer"
msgid "SubscriptionTable|Manage"
msgstr "HÃ¥ndter"
msgid "SubscriptionTable|Max seats used"
-msgstr ""
+msgstr "Maks. sæder brugt"
msgid "SubscriptionTable|Next invoice"
-msgstr ""
+msgstr "Næste regning"
msgid "SubscriptionTable|Refresh Seats"
-msgstr ""
+msgstr "Opdater sæder"
msgid "SubscriptionTable|Renew"
msgstr "Forny"
@@ -32219,16 +32679,16 @@ msgid "SubscriptionTable|Seats currently in use"
msgstr ""
msgid "SubscriptionTable|Seats in subscription"
-msgstr ""
+msgstr "Sæder i abonnement"
msgid "SubscriptionTable|Seats owed"
-msgstr ""
+msgstr "Sædet ejet"
msgid "SubscriptionTable|See usage"
msgstr ""
msgid "SubscriptionTable|Something went wrong trying to refresh seats"
-msgstr ""
+msgstr "Noget gik galt under forsøg på at opdatere sæder"
msgid "SubscriptionTable|Subscription end date"
msgstr ""
@@ -32269,11 +32729,14 @@ msgstr ""
msgid "Subscriptions"
msgstr "Abonnementer"
-msgid "Subtracted"
+msgid "Subscription|Your subscription for %{strong}%{namespace_name}%{strong_close} has expired and you are now on %{pricing_link_start}the GitLab Free tier%{pricing_link_end}. Don't worry, your data is safe. Get in touch with our support team (%{support_email}). They'll gladly help with your subscription renewal."
msgstr ""
+msgid "Subtracted"
+msgstr "Fratrukket"
+
msgid "Subtracts"
-msgstr ""
+msgstr "Fratrækker"
msgid "Succeeded"
msgstr "Lykkedes"
@@ -32300,10 +32763,10 @@ msgid "Successfully deactivated"
msgstr ""
msgid "Successfully deleted U2F device."
-msgstr ""
+msgstr "Slettede U2F-enhed."
msgid "Successfully deleted WebAuthn device."
-msgstr ""
+msgstr "Slettede WebAuthn-enhed."
msgid "Successfully removed email."
msgstr ""
@@ -32315,16 +32778,16 @@ msgid "Successfully synced %{synced_timeago}."
msgstr ""
msgid "Successfully unbanned"
-msgstr ""
+msgstr "Fjernelse af udelukkelse lykkedes"
msgid "Successfully unblocked"
-msgstr ""
+msgstr "Fjernelse fra blokering lykkedes"
msgid "Successfully unlocked"
msgstr ""
msgid "Successfully updated %{last_updated_timeago}."
-msgstr ""
+msgstr "Opdateret %{last_updated_timeago}."
msgid "Successfully verified domain ownership"
msgstr ""
@@ -32357,7 +32820,7 @@ msgid "SuggestedColors|Crimson"
msgstr ""
msgid "SuggestedColors|Dark coral"
-msgstr ""
+msgstr "Mørk koral"
msgid "SuggestedColors|Dark green"
msgstr "Mørkegrøn"
@@ -32366,10 +32829,10 @@ msgid "SuggestedColors|Dark sea green"
msgstr ""
msgid "SuggestedColors|Dark violet"
-msgstr ""
+msgstr "Mørkeviolet"
msgid "SuggestedColors|Deep violet"
-msgstr ""
+msgstr "Dyb violet"
msgid "SuggestedColors|Gray"
msgstr "Grå"
@@ -32378,10 +32841,10 @@ msgid "SuggestedColors|Green screen"
msgstr ""
msgid "SuggestedColors|Green-cyan"
-msgstr ""
+msgstr "Grøn-cyan"
msgid "SuggestedColors|Lavendar"
-msgstr ""
+msgstr "Lavendel"
msgid "SuggestedColors|Magenta-pink"
msgstr "Magentapink"
@@ -32408,13 +32871,13 @@ msgid "Suggestions are not applicable as their lines cannot overlap."
msgstr ""
msgid "Suggestions must all be on the same branch."
-msgstr ""
+msgstr "Forslag skal alle være på den samme gren."
msgid "Suggestions:"
msgstr "Forslag:"
msgid "Suite"
-msgstr ""
+msgstr "Suite"
msgid "Summary"
msgstr "Opsummering"
@@ -32432,7 +32895,7 @@ msgid "SuperSonics|Activate cloud license"
msgstr ""
msgid "SuperSonics|Activate subscription"
-msgstr ""
+msgstr "Aktivér abonnement"
msgid "SuperSonics|Activated on"
msgstr ""
@@ -32441,13 +32904,13 @@ msgid "SuperSonics|Activation code"
msgstr "Aktiveringskode"
msgid "SuperSonics|An error occurred while activating your subscription."
-msgstr ""
+msgstr "Der opstod en fejl under aktivering af dit abonnement."
msgid "SuperSonics|Billable users"
msgstr ""
msgid "SuperSonics|Buy subscription"
-msgstr ""
+msgstr "Køb abonnement"
msgid "SuperSonics|Cloud license"
msgstr ""
@@ -32477,13 +32940,13 @@ msgid "SuperSonics|ID"
msgstr "Id"
msgid "SuperSonics|Last Sync"
-msgstr ""
+msgstr "Sidste synkronisering"
msgid "SuperSonics|Learn how to %{linkStart}activate your subscription%{linkEnd}."
-msgstr ""
+msgstr "Lær at %{linkStart}aktivere dit abonnement%{linkEnd}."
msgid "SuperSonics|Licensed to"
-msgstr ""
+msgstr "Licenseret til"
msgid "SuperSonics|Manage"
msgstr "HÃ¥ndter"
@@ -32492,11 +32955,14 @@ msgid "SuperSonics|Maximum users"
msgstr ""
msgid "SuperSonics|Paste your activation code"
-msgstr ""
+msgstr "Indsæt din aktiveringskode"
msgid "SuperSonics|Plan"
msgstr "Plan"
+msgid "SuperSonics|Please agree to the Subscription Agreement"
+msgstr ""
+
msgid "SuperSonics|Ready to get started? A GitLab plan is ideal for scaling organizations and for multi team usage."
msgstr ""
@@ -32510,13 +32976,13 @@ msgid "SuperSonics|Start free trial"
msgstr "Start gratis prøveperiode"
msgid "SuperSonics|Started"
-msgstr ""
+msgstr "Startet"
msgid "SuperSonics|Subscription"
msgstr ""
msgid "SuperSonics|Subscription details"
-msgstr ""
+msgstr "Abonnementsdetaljer"
msgid "SuperSonics|Sync subscription details"
msgstr ""
@@ -32527,9 +32993,12 @@ msgstr ""
msgid "SuperSonics|The activation code is not valid. Please make sure to copy it exactly from the Customers Portal or confirmation email. Learn more about %{linkStart}activating your subscription%{linkEnd}."
msgstr ""
-msgid "SuperSonics|There is a connectivity issue."
+msgid "SuperSonics|The activation code should be a 24-character alphanumeric string"
msgstr ""
+msgid "SuperSonics|There is a connectivity issue."
+msgstr "Der er problemer med forbindelsen."
+
msgid "SuperSonics|This is the highest peak of users on your installation since the license started."
msgstr ""
@@ -32546,10 +33015,10 @@ msgid "SuperSonics|Upload a license file"
msgstr "Upload en licensfil"
msgid "SuperSonics|Users in subscription"
-msgstr ""
+msgstr "Brugere i abonnement"
msgid "SuperSonics|Users over subscription"
-msgstr ""
+msgstr "Brugere over abonnement"
msgid "SuperSonics|Users with a Guest role or those who don't belong to a Project or Group will not use a seat from your license."
msgstr ""
@@ -32569,12 +33038,18 @@ msgstr ""
msgid "SuperSonics|You do not have an active subscription"
msgstr ""
+msgid "SuperSonics|You have successfully added a license that activates on %{date}. Please see the subscription history table below for more details."
+msgstr ""
+
msgid "SuperSonics|You'll be charged for %{trueUpLinkStart}users over license%{trueUpLinkEnd} on a quarterly or annual basis, depending on the terms of your agreement."
msgstr ""
-msgid "SuperSonics|Your subscription"
+msgid "SuperSonics|Your future dated license was successfully added"
msgstr ""
+msgid "SuperSonics|Your subscription"
+msgstr "Dit abonnement"
+
msgid "SuperSonics|Your subscription details will sync shortly."
msgstr ""
@@ -32588,19 +33063,19 @@ msgid "Support for custom certificates is disabled. Ask your system's administra
msgstr ""
msgid "Support page URL"
-msgstr ""
+msgstr "URL for supportside"
msgid "Survey Response"
msgstr ""
msgid "Switch branch"
-msgstr ""
+msgstr "Skift gren"
msgid "Switch branch/tag"
msgstr "Skift gren/mærkat"
msgid "Switch to GitLab Next"
-msgstr ""
+msgstr "Skift til GitLab Next"
msgid "Switch to the source to copy the file contents"
msgstr ""
@@ -32618,7 +33093,7 @@ msgid "Synced"
msgstr "Synkroniseret"
msgid "Synchronization settings"
-msgstr ""
+msgstr "Synkroniseringsindstillinger"
msgid "Synchronize LDAP"
msgstr "Synkroniser LDAP"
@@ -32651,13 +33126,13 @@ msgid "System OAuth applications don't belong to any user and can only be manage
msgstr ""
msgid "System default (%{default})"
-msgstr ""
+msgstr "Systemstandard (%{default})"
msgid "System header and footer"
msgstr ""
msgid "System hook was successfully updated."
-msgstr ""
+msgstr "Systemhooken blev opdateret."
msgid "System hooks are triggered on sets of events like creating a project or adding an SSH key. You can also enable extra triggers, such as push events."
msgstr ""
@@ -32711,7 +33186,7 @@ msgid "Tags are deleted until the timeout is reached. Any remaining tags are inc
msgstr ""
msgid "Tags feed"
-msgstr ""
+msgstr "Mærkatfeed"
msgid "Tags this commit to %{tag_name} with \"%{message}\"."
msgstr ""
@@ -32723,13 +33198,13 @@ msgid "Tags:"
msgstr "Mærkater:"
msgid "TagsPage|Browse commits"
-msgstr ""
+msgstr "Gennemse commits"
msgid "TagsPage|Browse files"
msgstr "Gennemse filer"
msgid "TagsPage|Can't find HEAD commit for this tag"
-msgstr ""
+msgstr "Kan ikke finde HEAD-commit for mærkatet"
msgid "TagsPage|Cancel"
msgstr "Annuller"
@@ -32744,16 +33219,16 @@ msgid "TagsPage|Deleting the %{tag_name} tag cannot be undone. Are you sure?"
msgstr "Sletning af mærkatet %{tag_name} kan ikke fortrydes. Er du sikker?"
msgid "TagsPage|Edit release notes"
-msgstr ""
+msgstr "Rediger udgivelsesnoter"
msgid "TagsPage|Existing branch name, tag, or commit SHA"
-msgstr ""
+msgstr "Eksisterende grennavn, mærkat eller commit-SHA"
msgid "TagsPage|Filter by tag name"
msgstr "Filtrér efter mærkatnavn"
msgid "TagsPage|New Tag"
-msgstr ""
+msgstr "Nyt mærkat"
msgid "TagsPage|New tag"
msgstr "Nyt mærkat"
@@ -32765,7 +33240,7 @@ msgid "TagsPage|Optionally, create a public Release of your project, based on th
msgstr ""
msgid "TagsPage|Release notes"
-msgstr ""
+msgstr "Udgivelsesnoter"
msgid "TagsPage|Repository has no tags yet."
msgstr ""
@@ -32774,16 +33249,16 @@ msgid "TagsPage|Tags"
msgstr "Mærkater"
msgid "TagsPage|Tags give the ability to mark specific points in history as being important"
-msgstr ""
+msgstr "Mærkater gør det muligt at mærke bestemte punkter i historik som værende vigtige"
msgid "TagsPage|This tag has no release notes."
-msgstr ""
+msgstr "Mærkatet har ingen udgivelsesnoter."
msgid "TagsPage|Use git tag command to add a new one:"
msgstr ""
msgid "TagsPage|Write your release notes or drag files here…"
-msgstr ""
+msgstr "Skriv dine udgivelsesnoter eller træk filer hertil …"
msgid "TagsPage|protected"
msgstr "beskyttet"
@@ -32798,16 +33273,16 @@ msgid "Target branch"
msgstr "MÃ¥lgren"
msgid "Target-Branch"
-msgstr ""
+msgstr "MÃ¥lgren"
msgid "Task ID: %{elastic_task}"
-msgstr ""
+msgstr "Opgave-id: %{elastic_task}"
msgid "Team"
msgstr "Team"
msgid "Team domain"
-msgstr ""
+msgstr "Teamdomæne"
msgid "TeamcityIntegration|Trigger TeamCity CI after a merge request has been created or updated"
msgstr ""
@@ -32824,17 +33299,17 @@ msgstr "Skabelon"
msgid "Template to append to all Service Desk issues"
msgstr ""
-msgid "TemplateRepository|Select a repository to make its templates available to all projects. %{link_start}What should the repository contain?%{link_end} "
+msgid "TemplateRepository|Create common files more quickly, and standardize their format."
msgstr ""
msgid "Templates"
msgstr "Skabeloner"
msgid "TemporaryStorageIncrease|can only be set once"
-msgstr ""
+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"
+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 ""
@@ -32849,16 +33324,16 @@ msgid "Terminal"
msgstr "Terminal"
msgid "Terminal for environment"
-msgstr ""
+msgstr "Terminal for miljø"
msgid "Terminal sync service is running"
msgstr ""
msgid "Terms of Service Agreement and Privacy Policy"
-msgstr ""
+msgstr "vilkår for tjeneste-aftale og privatlivspolitik"
msgid "Terms of Service and Privacy Policy"
-msgstr ""
+msgstr "Vilkår for tjeneste og privatlivspolitik"
msgid "Terraform"
msgstr "Terraform"
@@ -32873,7 +33348,7 @@ msgid "TerraformBanner|Using Terraform? Try the GitLab Managed Terraform State"
msgstr ""
msgid "Terraform|%{name} successfully removed"
-msgstr ""
+msgstr "%{name} fjernet"
msgid "Terraform|%{number} Terraform report failed to generate"
msgid_plural "Terraform|%{number} Terraform reports failed to generate"
@@ -32882,17 +33357,17 @@ msgstr[1] ""
msgid "Terraform|%{number} Terraform report was generated in your pipelines"
msgid_plural "Terraform|%{number} Terraform reports were generated in your pipelines"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%{number} Terraform-rapport blev genereret i dine pipelines"
+msgstr[1] "%{number} Terraform-rapporter blev genereret i dine pipelines"
msgid "Terraform|%{user} updated %{timeAgo}"
-msgstr ""
+msgstr "%{user} opdateret %{timeAgo}"
msgid "Terraform|A report failed to generate."
-msgstr ""
+msgstr "En rapport kunne ikke genereres."
msgid "Terraform|A report was generated in your pipelines."
-msgstr ""
+msgstr "En rapport blev genereret i dine pipelines."
msgid "Terraform|Actions"
msgstr "Handlinger"
@@ -32901,10 +33376,10 @@ msgid "Terraform|An error occurred while changing the state file"
msgstr ""
msgid "Terraform|An error occurred while loading your Terraform States"
-msgstr ""
+msgstr "Der opstod en fejl under indlæsning af dine Terraform-tilstande"
msgid "Terraform|Are you sure you want to remove the Terraform State %{name}?"
-msgstr ""
+msgstr "Er du sikker på, at du vil fjerne Terraform-tilstanden %{name}?"
msgid "Terraform|Cancel"
msgstr "Annuller"
@@ -32919,10 +33394,10 @@ msgid "Terraform|Download JSON"
msgstr "Download JSON"
msgid "Terraform|Generating the report caused an error."
-msgstr ""
+msgstr "Generering af rapporten forårsagede en fejl."
msgid "Terraform|Get started with Terraform"
-msgstr ""
+msgstr "Kom godt i gang med Terraform"
msgid "Terraform|How to use GitLab-managed Terraform State?"
msgstr ""
@@ -32937,7 +33412,7 @@ msgid "Terraform|Locked"
msgstr "LÃ¥st"
msgid "Terraform|Locked by %{user} %{timeAgo}"
-msgstr ""
+msgstr "LÃ¥st af %{user} %{timeAgo}"
msgid "Terraform|Locking state"
msgstr ""
@@ -32961,16 +33436,16 @@ msgid "Terraform|Reported Resource Changes: %{addNum} to add, %{changeNum} to ch
msgstr ""
msgid "Terraform|States"
-msgstr ""
+msgstr "Tilstande"
msgid "Terraform|Terraform init command"
msgstr ""
msgid "Terraform|The report %{name} failed to generate."
-msgstr ""
+msgstr "Rapporten %{name} kunne ikke genereres."
msgid "Terraform|The report %{name} was generated in your pipelines."
-msgstr ""
+msgstr "Rapporten %{name} blev genereret i dine pipelines."
msgid "Terraform|To get access to this terraform state from your local computer, run the following command at the command line. The first line requires a personal access token with API read and write access. %{linkStart}How do I create a personal access token?%{linkEnd}."
msgstr ""
@@ -33013,7 +33488,7 @@ msgstr[0] ""
msgstr[1] ""
msgid "Test settings"
-msgstr ""
+msgstr "Test indstillinger"
msgid "TestCases|Move test case"
msgstr "Flyt testsag"
@@ -33030,113 +33505,113 @@ msgstr "Ny testsag"
msgid "TestCases|Search test cases"
msgstr "Søg efter testsager"
-msgid "TestCases|Something went wrong while adding test case to Todo."
+msgid "TestCases|Something went wrong while adding test case to a to-do item."
msgstr ""
msgid "TestCases|Something went wrong while creating a test case."
-msgstr ""
+msgstr "Noget gik galt under oprettelse af en testsag."
msgid "TestCases|Something went wrong while fetching test case."
-msgstr ""
+msgstr "Noget gik galt under hentning af testsag."
msgid "TestCases|Something went wrong while fetching test cases list."
-msgstr ""
+msgstr "Noget gik galt under hentning af testsagliste."
-msgid "TestCases|Something went wrong while marking test case todo as done."
+msgid "TestCases|Something went wrong while marking test case to-do item as done."
msgstr ""
msgid "TestCases|Something went wrong while moving test case."
-msgstr ""
+msgstr "Noget gik galt under flytning af testsag."
msgid "TestCases|Something went wrong while updating the test case labels."
-msgstr ""
+msgstr "Noget gik galt under opdatering af testsagetiketterne."
msgid "TestCases|Something went wrong while updating the test case."
-msgstr ""
+msgstr "Noget gik galt under opdatering af testsagen."
msgid "TestCases|Submit test case"
msgstr "Indsend testsag"
msgid "TestHooks|Ensure one of your projects has merge requests."
-msgstr ""
+msgstr "Sørg for at et af dine projekter har sammenlægningsanmodninger."
msgid "TestHooks|Ensure the project has CI jobs."
-msgstr ""
+msgstr "Sørg for at projektet har CI-job."
msgid "TestHooks|Ensure the project has CI pipelines."
-msgstr ""
+msgstr "Sørg for at projektet har CI-pipelines."
msgid "TestHooks|Ensure the project has deployments."
-msgstr ""
+msgstr "Sørg for at projektet har udsendelser."
msgid "TestHooks|Ensure the project has issues."
-msgstr ""
+msgstr "Sørg for at projektet har problemstillinger."
msgid "TestHooks|Ensure the project has merge requests."
-msgstr ""
+msgstr "Sørg for at projektet har sammenlægningsanmodninger."
msgid "TestHooks|Ensure the project has notes."
msgstr ""
msgid "TestHooks|Ensure the project has releases."
-msgstr ""
+msgstr "Sørg for at projektet har udgivelser."
msgid "TestHooks|Ensure the wiki is enabled and has pages."
-msgstr ""
+msgstr "Sørg for at wikien er aktiveret og har sider."
msgid "TestReports|%{count} errors"
msgstr "%{count} fejl"
msgid "TestReports|%{count} failures"
-msgstr ""
+msgstr "%{count} mislykkede"
msgid "TestReports|%{count} tests"
-msgstr ""
+msgstr "%{count} tests"
msgid "TestReports|%{rate}%{sign} success rate"
msgstr ""
msgid "TestReports|Attachment"
-msgstr ""
+msgstr "Vedhæftning"
msgid "TestReports|Jobs"
msgstr "Job"
msgid "TestReports|Learn how to upload pipeline test reports"
-msgstr ""
+msgstr "Lær at uploade pipelinetestrapporter"
msgid "TestReports|Learn more about pipeline test reports"
-msgstr ""
+msgstr "Lær mere om pipelinetestrapporter"
msgid "TestReports|No test cases were found in the test report."
-msgstr ""
+msgstr "Der blev ikke fundet nogle testsager i testrapporten."
msgid "TestReports|Tests"
-msgstr ""
+msgstr "Tests"
msgid "TestReports|There are no test cases to display."
-msgstr ""
+msgstr "Der er ingen testsager at vise."
msgid "TestReports|There are no test reports for this pipeline"
-msgstr ""
+msgstr "Der er ingen testrapporter for pipelinen"
msgid "TestReports|There are no test suites to show."
-msgstr ""
+msgstr "Der er ingen testsuites at vise."
msgid "TestReports|There are no tests to display"
-msgstr ""
+msgstr "Der er ingen tests at vise"
msgid "TestReports|There was an error fetching the summary."
msgstr "Der opstod en fejl ved hentning af opsummeringen."
msgid "TestReports|There was an error fetching the test suite."
-msgstr ""
+msgstr "Der var en fejl ved hentning af testsuiten."
msgid "TestReports|You can configure your job to use unit test reports, and GitLab displays a report here and in the related merge request."
-msgstr ""
+msgstr "Du kan konfigurere dit job til at bruge enhedstestrapporter og GitLab viser en rapport her og i den relaterede sammenlægningsanmodning."
msgid "Tests"
-msgstr ""
+msgstr "Tests"
msgid "Text added to the body of all email messages. %{character_limit} character limit"
msgstr ""
@@ -33151,7 +33626,7 @@ msgid "Thank you for your feedback!"
msgstr "Tak for din feedback!"
msgid "Thank you for your report. A GitLab administrator will look into it shortly."
-msgstr ""
+msgstr "Tak for din rapport. En GitLab-administrator vil undersøge det om kort tid."
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 ""
@@ -33162,8 +33637,8 @@ msgstr ""
msgid "Thanks for your purchase!"
msgstr "Tak for dit køb!"
-msgid "That is ok, I do not want to renew"
-msgstr "Det er ok, jeg vil ikke forny"
+msgid "That's OK, I don't want to renew"
+msgstr ""
msgid "That's it, well done!"
msgstr "Det var det, godt gået!"
@@ -33172,7 +33647,7 @@ msgid "The \"%{group_path}\" group allows you to sign in with your Single Sign-O
msgstr ""
msgid "The %{featureName} feature is part of your GitLab Ultimate trial."
-msgstr ""
+msgstr "Funktionen %{featureName} er del af din GitLab Ultimate-prøveperiode."
msgid "The %{link_start}true-up model%{link_end} allows having more users, and additional users will incur a retroactive charge on renewal."
msgstr ""
@@ -33185,7 +33660,7 @@ msgid_plural "The %{type} contains the following errors:"
msgstr[0] ""
msgstr[1] ""
-msgid "The API key used by GitLab for accessing the Spam Check service endpoint"
+msgid "The API key used by GitLab for accessing the Spam Check service endpoint."
msgstr ""
msgid "The GitLab subscription service (customers.gitlab.com) is currently experiencing an outage. You can monitor the status and get updates at %{linkStart}status.gitlab.com%{linkEnd}."
@@ -33198,10 +33673,10 @@ msgid "The ID of the application."
msgstr ""
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project"
-msgstr ""
+msgstr "Problemstillingsporingen er stedet hvor ting tilføjes som har brug for at blive forbedret eller løst i et projekt"
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project. You can register or sign in to create issues for this project."
-msgstr ""
+msgstr "Problemstillingsporingen er stedet hvor ting tilføjes som har brug for at blive forbedret eller løst i et projekt. Du kan tilmelde eller logge ind for at oprette problemstillinger til projektet."
msgid "The Prometheus server responded with \"bad request\". Please check your queries are correct and are supported in your Prometheus version. %{documentationLink}"
msgstr ""
@@ -33224,9 +33699,6 @@ msgstr "URL'en skal begynde med http:// eller https://"
msgid "The URL to use for connecting to Elasticsearch. Use a comma-separated list to support clustering (e.g., \"http://localhost:9200, http://localhost:9201\")."
msgstr ""
-msgid "The Vulnerability Report shows the results of the last successful pipeline run on the default branch."
-msgstr ""
-
msgid "The X509 Certificate to use when mutual TLS is required to communicate with the external authorization service. If left blank, the server certificate is still validated when accessing over HTTPS."
msgstr ""
@@ -33246,13 +33718,13 @@ msgid "The character highlighter helps you keep the subject line to %{titleLengt
msgstr ""
msgid "The comment you are editing has been changed by another user. Would you like to keep your changes and overwrite the new description or discard your changes?"
-msgstr ""
+msgstr "Kommentaren du er ved at redigere er blevet ændret af en anden bruger. Vil du beholde dine ændringer og overskrive den ny beskrivelse eller forkaste dine ændringer?"
msgid "The commit does not exist"
-msgstr ""
+msgstr "Committen findes ikke"
msgid "The comparison view may be inaccurate due to merge conflicts."
-msgstr ""
+msgstr "Sammenligningsvisningen kan være upræcis pga. sammenlægningskonflikter."
msgid "The compliance report captures merged changes that violate compliance best practices."
msgstr ""
@@ -33264,7 +33736,7 @@ msgid "The content of this page is not encoded in UTF-8. Edits can only be made
msgstr ""
msgid "The contents of this group, its subgroups and projects will be permanently removed after %{deletion_adjourned_period} days on %{date}. After this point, your data cannot be recovered."
-msgstr ""
+msgstr "Indholdet i gruppen, dens undergrupper og projekter vil blive fjernet permanent efter %{deletion_adjourned_period} dage %{date}. Herefter kan dine data ikke gendannes."
msgid "The current issue"
msgstr "Den nuværende problemstilling"
@@ -33276,16 +33748,13 @@ msgid "The data in this pipeline is too old to be rendered as a graph. Please ch
msgstr ""
msgid "The data source is connected, but there is no data to display. %{documentationLink}"
-msgstr ""
+msgstr "Datakilden er tilsluttet men der er ingen data at vise. %{documentationLink}"
msgid "The default CI/CD configuration file and path for new projects."
msgstr ""
msgid "The default branch for this project has been changed. Please update your bookmarks."
-msgstr ""
-
-msgid "The default expiration time for job artifacts. 0 for unlimited. The default unit is in seconds, but you can use other units, for example %{code_open}4 mins 2 sec%{code_close}, %{code_open}2h42min%{code_close}."
-msgstr ""
+msgstr "Standardgrenen for projektet er blevet ændret. Opdater venligst dine bogmærker."
msgid "The dependency list details information about the components used within your project."
msgstr ""
@@ -33297,7 +33766,7 @@ msgid "The designs you tried uploading did not change."
msgstr ""
msgid "The directory has been successfully created."
-msgstr ""
+msgstr "Mappen er blevet oprettet."
msgid "The domain you entered is misformatted."
msgstr ""
@@ -33306,7 +33775,7 @@ msgid "The domain you entered is not allowed."
msgstr "Det domæne du indtastede er ikke tilladt."
msgid "The download link will expire in 24 hours."
-msgstr ""
+msgstr "Downloadlinket vil udløbe om 24 timer."
msgid "The environment tier must be one of %{environment_tiers}."
msgstr ""
@@ -33315,7 +33784,7 @@ msgid "The errors we encountered were:"
msgstr "Vi stødte på følgende fejl:"
msgid "The file containing the export is not available yet; it may still be transferring. Please try again later."
-msgstr ""
+msgstr "Filen som indeholder eksporten er endnu ikke tilgængelig. Det kan være den stadigvæk er ved at blive overført. Prøv venligst igen senere."
msgid "The file could not be displayed because it is empty or larger than the maximum file size indexed (%{size})."
msgstr ""
@@ -33327,7 +33796,7 @@ msgid "The file has been successfully deleted."
msgstr "Filen er blevet slettet."
msgid "The file name should have a .yml extension"
-msgstr ""
+msgstr "Filnavnet skal ikke have en .yml-endelse"
msgid "The finding is not a vulnerability because it is part of a test or is test data."
msgstr ""
@@ -33356,7 +33825,7 @@ msgstr[0] ""
msgstr[1] ""
msgid "The fork relationship has been removed."
-msgstr ""
+msgstr "Forgreningsrelationen er blevet fjernet."
msgid "The form contains the following errors:"
msgstr "Formularen indeholder følgende fejl:"
@@ -33365,7 +33834,7 @@ msgid "The form contains the following warning:"
msgstr "Formularen indeholder følgende advarsel:"
msgid "The global settings require you to enable Two-Factor Authentication for your account."
-msgstr ""
+msgstr "De globale indstillinger kræver at du aktiverer totrinsgodkendelse for din konto."
msgid "The group and any internal projects can be viewed by any logged in user except external users."
msgstr ""
@@ -33380,22 +33849,22 @@ msgid "The group can be fully restored"
msgstr ""
msgid "The group export can be downloaded from:"
-msgstr ""
+msgstr "Gruppeeksporten kan downloades fra:"
msgid "The group has already been shared with this group"
-msgstr ""
+msgstr "Gruppen er allerede blevet delt med gruppen"
msgid "The group settings for %{group_links} require you to enable Two-Factor Authentication for your account. You can %{leave_group_links}."
-msgstr ""
+msgstr "Gruppeindstillingerne for %{group_links} kræver at du aktivere totrinsgodkendelse for din konto. Du kan %{leave_group_links}."
msgid "The group will be placed in 'pending deletion' state"
msgstr ""
msgid "The group_project_ids parameter is only allowed for a group"
-msgstr ""
+msgstr "Parameteren group_project_ids er kun tilladt til en gruppe"
msgid "The hostname of your PlantUML server."
-msgstr ""
+msgstr "Værtsnavnet på din PlantUML-server."
msgid "The hostname of your Snowplow collector."
msgstr ""
@@ -33407,13 +33876,13 @@ msgid "The interval must be one of %{intervals}."
msgstr ""
msgid "The invitation can not be found with the provided invite token."
-msgstr ""
+msgstr "Kan ikke finde invitationen med den angivne invitationstoken."
msgid "The invitation could not be accepted."
-msgstr ""
+msgstr "Invitationen kunne ikke accepteres."
msgid "The invitation could not be declined."
-msgstr ""
+msgstr "Invitationen kunne ikke afvises."
msgid "The invitation has already been accepted."
msgstr "Invitationen er allerede blevet accepteret."
@@ -33422,7 +33891,7 @@ msgid "The invitation was successfully resent."
msgstr ""
msgid "The issue was successfully promoted to an epic. Redirecting to epic..."
-msgstr ""
+msgstr "Problemstillingen blev forfremmet til en epic. Omdirigerer til epic ..."
msgid "The latest artifacts created by jobs in the most recent successful pipeline will be stored."
msgstr ""
@@ -33431,10 +33900,10 @@ msgid "The latest pipeline for this merge request did not complete successfully.
msgstr ""
msgid "The latest pipeline for this merge request has failed."
-msgstr ""
+msgstr "Den seneste pipeline for sammenlægningsanmodnigen mislykkedes."
msgid "The license key is invalid. Make sure it is exactly as you received it from GitLab Inc."
-msgstr ""
+msgstr "Licensnøglen er ugyldig. Sørg for at den er præcist som du modtog den fra GitLab Inc."
msgid "The license was removed. GitLab has fallen back on the previous license."
msgstr ""
@@ -33443,19 +33912,19 @@ msgid "The license was removed. GitLab now no longer has a valid license."
msgstr ""
msgid "The license was successfully uploaded and is now active. You can see the details below."
-msgstr ""
+msgstr "Licensen blev uploadet og er nu aktiv. Du kan se detaljerne nedenunder."
msgid "The license was successfully uploaded and will be active from %{starts_at}. You can see the details below."
msgstr ""
msgid "The maximum file size allowed is %{size}."
-msgstr ""
+msgstr "Den maksimale tilladte filstørrelse er %{size}."
msgid "The maximum file size for job artifacts."
-msgstr ""
+msgstr "Den maksimale filstørrelse på jobartefakter."
msgid "The maximum file size in megabytes for individual job artifacts."
-msgstr ""
+msgstr "Den maksimale filstørrelse i megabytes for individuelle jobartefakter."
msgid "The maximum file size is %{size}."
msgstr "Den maksimale tilladte filstørrelse er %{size}."
@@ -33470,55 +33939,52 @@ msgid "The maximum number of tags that a single worker accepts for cleanup. If t
msgstr ""
msgid "The merge conflicts for this merge request cannot be resolved through GitLab. Please try to resolve them locally."
-msgstr ""
+msgstr "Sammenlægningskonflikterne for sammenlægningen kan ikke løses gennem GitLab. Prøv venligst at løs dem lokalt."
msgid "The merge conflicts for this merge request have already been resolved."
-msgstr ""
+msgstr "Sammenlægningskonflikterne for sammenlægningsanmodningen er allerede blevet løst."
msgid "The merge conflicts for this merge request have already been resolved. Please return to the merge request."
msgstr ""
-msgid "The merge request can now be merged."
-msgstr "Sammenlægningsanmodningen kan nu sammenlægges."
-
msgid "The metric must be one of %{metrics}."
-msgstr ""
+msgstr "Målingen skal være en af %{metrics}."
msgid "The name \"%{name}\" is already taken in this directory."
-msgstr ""
+msgstr "Navnet \"%{name}\" er allerede taget i mappen."
msgid "The name of the CI/CD configuration file. A path relative to the root directory is optional (for example %{code_open}my/path/.myfile.yml%{code_close})."
-msgstr ""
+msgstr "Navnet på CI-/CD-konfigurationsfilen. En sti relativ til rodmappen er valgfrit (f.eks. %{code_open}min/sti/.minfil.yml%{code_close})."
msgid "The name of the Jenkins project. Copy the name from the end of the URL to the project."
-msgstr ""
+msgstr "Navnet på Jenkins-projektet. Kopiér navnet fra slutningen af URL'en til projektet."
msgid "The number of changes to fetch from GitLab when cloning a repository. Lower values can speed up pipeline execution. Set to %{code_open}0%{code_close} or blank to fetch all branches and tags for each job"
msgstr ""
msgid "The number of merge requests merged by month."
-msgstr ""
+msgstr "Antal sammenlægningsanmodninger som er blevet sammenlagt pr. måned."
msgid "The number of times an upload record could not find its file"
msgstr ""
msgid "The page could not be displayed because it timed out."
-msgstr ""
+msgstr "Siden kunne ikke vises fordi den fik timeout."
msgid "The parent epic is confidential and can only contain confidential epics and issues"
-msgstr ""
+msgstr "Forælderepicen er fortrolig og kan kun indeholde fortrolige epics og problemstillinger"
msgid "The passphrase required to decrypt the private key. This is optional and the value is encrypted at rest."
msgstr ""
msgid "The password for the Jenkins server."
-msgstr ""
+msgstr "Adgangskoden til Jenkins-serveren."
msgid "The password for your GitLab account on %{gitlab_url} has successfully been changed."
-msgstr ""
+msgstr "Adgangskoden til din GitLab-konto på %{gitlab_url} er blevet ændret."
msgid "The password for your GitLab account on %{link_to_gitlab} has successfully been changed."
-msgstr ""
+msgstr "Adgangskoden til din GitLab-konto på %{link_to_gitlab} er blevet ændret."
msgid "The pipeline has been deleted"
msgstr "Pipelinen blev ikke slettet"
@@ -33548,13 +34014,13 @@ msgid "The project is accessible only by members of the project. Access must be
msgstr ""
msgid "The project is still being deleted. Please try again later."
-msgstr ""
+msgstr "Projektet er stadigvæk ved at blive slettet. Prøv venligst igen senere."
msgid "The project was successfully forked."
-msgstr ""
+msgstr "Projektet blev forgrenet."
msgid "The project was successfully imported."
-msgstr ""
+msgstr "Projektet blev importeret."
msgid "The pseudonymizer data collection is disabled. When enabled, GitLab will run a background job that will produce pseudonymized CSVs of the GitLab database that will be uploaded to your configured object storage directory."
msgstr ""
@@ -33578,13 +34044,13 @@ msgid "The repository for this project does not exist."
msgstr ""
msgid "The repository for this project is empty"
-msgstr ""
+msgstr "Depotet for projektet er tomt"
msgid "The repository is being updated..."
msgstr ""
msgid "The repository must be accessible over %{code_open}http://%{code_close}, %{code_open}https://%{code_close} or %{code_open}git://%{code_close}."
-msgstr ""
+msgstr "Depotet skal kunne tilgås over %{code_open}http://%{code_close}, %{code_open}https://%{code_close} eller %{code_open}git://%{code_close}."
msgid "The repository must be accessible over %{code_open}http://%{code_close}, %{code_open}https://%{code_close}, %{code_open}ssh://%{code_close} or %{code_open}git://%{code_close}."
msgstr ""
@@ -33593,16 +34059,16 @@ msgid "The same shared runner executes code from multiple projects, unless you c
msgstr ""
msgid "The schedule time must be in the future!"
-msgstr ""
+msgstr "Planlægningstiden skal være i fremtiden!"
msgid "The snippet can be accessed without any authentication."
msgstr ""
msgid "The snippet is visible only to me."
-msgstr "Uddraget er kun tilsynligt for mig."
+msgstr "Snippeten er kun synlig for mig."
msgid "The snippet is visible only to project members."
-msgstr ""
+msgstr "Udklippet er kun synligt for projektmedlemmer."
msgid "The snippet is visible to any logged in user except external users."
msgstr ""
@@ -33611,16 +34077,16 @@ msgid "The source branch will be deleted"
msgstr "Kildegrenen vil blive slettet"
msgid "The specified tab is invalid, please select another"
-msgstr ""
+msgstr "Det angivne faneblad er ugyldigt. Vælg venligst et andet"
msgid "The start date must be ealier than the end date."
-msgstr ""
+msgstr "Startdatoen skal være tidligere end slutdatoen."
msgid "The subject will be used as the title of the new issue, and the message will be the description. %{quickActionsLinkStart}Quick actions%{quickActionsLinkEnd} and styling with %{markdownLinkStart}Markdown%{markdownLinkEnd} are supported."
-msgstr ""
+msgstr "Emnet vil blive brugt som titlen på den nye problemstilling og meddelelsen vil blive beskrivelsen. %{quickActionsLinkStart}Hurtighandlinger%{quickActionsLinkEnd} og styling med %{markdownLinkStart}Markdown%{markdownLinkEnd} understøttes."
msgid "The tag name can't be changed for an existing release."
-msgstr ""
+msgstr "Mærkatnavnet kan ikke ændres for en eksisterende udgivelse."
msgid "The time period in seconds that the maximum requests per project limit applies to."
msgstr ""
@@ -33641,7 +34107,7 @@ msgid "The user map is a mapping of the FogBugz users that participated on your
msgstr ""
msgid "The user you are trying to approve is not pending approval"
-msgstr ""
+msgstr "Brugeren du forsøger at godkende afventer ikke godkendelse"
msgid "The user you are trying to deactivate has been active in the past %{minimum_inactive_days} days and cannot be deactivated"
msgstr ""
@@ -33668,10 +34134,10 @@ msgid "There are currently no events."
msgstr ""
msgid "There are merge conflicts"
-msgstr ""
+msgstr "Der er sammenlægningskonflikter"
msgid "There are no %{replicableTypeName} to show"
-msgstr ""
+msgstr "Der er ingen %{replicableTypeName} at vise"
msgid "There are no GPG keys associated with this account."
msgstr "Der er ingen GPG-nøgler tilknyttet til kontoen."
@@ -33716,7 +34182,7 @@ msgid "There are no closed merge requests"
msgstr "Der er ingen lukkede sammenlægningsanmodninger"
msgid "There are no commits yet."
-msgstr "Der er ingen commits endnu."
+msgstr "Der er endnu ingen commits."
msgid "There are no custom project templates set up for this GitLab instance. They are enabled from GitLab's Admin Area. Contact your GitLab instance administrator to setup custom project templates."
msgstr ""
@@ -33779,22 +34245,22 @@ msgid "There is already a repository with that name on disk"
msgstr ""
msgid "There is already a to-do item for this design."
-msgstr ""
+msgstr "Der er allerede et gøremålselement for designet."
msgid "There is no chart data available."
-msgstr ""
+msgstr "Der er ingen diagramdata tilgængelige."
msgid "There is no data available."
msgstr "Der er ingen tilgængelige data."
msgid "There is no data available. Please change your selection."
-msgstr ""
+msgstr "Der er ingen data tilgængelig. Ændr venligst din markering."
msgid "There is no table data available."
-msgstr ""
+msgstr "Der er ingen tabeldata tilgængelige."
msgid "There is too much data to calculate. Please change your selection."
-msgstr ""
+msgstr "Der er for meget data at udregne. Ændr venligst din markering."
msgid "There was a problem communicating with your device."
msgstr "Der var problemer med at kommunikere med din enhed."
@@ -33818,7 +34284,7 @@ msgid "There was a problem fetching labels."
msgstr "Der var problemer med at hente etiketter."
msgid "There was a problem fetching linked pipelines."
-msgstr ""
+msgstr "Der var et problem med at hente linkede pipelines."
msgid "There was a problem fetching milestones."
msgstr "Der var problemer med at hente milepæle."
@@ -33856,11 +34322,11 @@ msgstr "Der var problemer med at sende bekræftelses e-mailen"
msgid "There was a problem updating the keep latest artifacts setting."
msgstr ""
-msgid "There was an error %{message} todo."
+msgid "There was an error %{message} to-do item."
msgstr ""
msgid "There was an error adding a To Do."
-msgstr "Der opstod en fejl ved tilføjelse af To Do."
+msgstr "Der opstod en fejl ved tilføjelse af et gøremål."
msgid "There was an error creating the dashboard, branch name is invalid."
msgstr "Der opstod en fejl ved oprettelse af betjeningspanelet, grennavn er ugyldigt."
@@ -33872,7 +34338,7 @@ msgid "There was an error creating the issue"
msgstr "Der opstod en fejl ved oprettelse af problemstillingen"
msgid "There was an error deleting the To Do."
-msgstr "Der opstod en fejl ved sletning af To Do'en."
+msgstr "Der opstod en fejl ved sletning af gøremålet."
msgid "There was an error fetching configuration for charts"
msgstr "Der opstod en fejl ved hentning af konfiguration til diagrammer"
@@ -33881,7 +34347,7 @@ msgid "There was an error fetching content, please refresh the page"
msgstr "Der opstod en fejl ved hentning af indhold, opdater venligst siden"
msgid "There was an error fetching data for the selected stage"
-msgstr ""
+msgstr "Der var en fejl ved hentning af data for den valgte stage"
msgid "There was an error fetching data for the tasks by type chart"
msgstr "Der opstod en fejl ved hentning af data til opgaverne efter typediagram"
@@ -33890,11 +34356,14 @@ msgid "There was an error fetching label data for the selected group"
msgstr "Der opstod en fejl ved hentning af etiketdata til den valgte gruppe"
msgid "There was an error fetching median data for stages"
-msgstr ""
+msgstr "Der var en fejl ved hentning af mediandata for stages"
msgid "There was an error fetching projects"
msgstr "Der opstod en fejl ved hentning af projekter"
+msgid "There was an error fetching search autocomplete suggestions"
+msgstr ""
+
msgid "There was an error fetching stage total counts"
msgstr ""
@@ -33905,10 +34374,10 @@ msgid "There was an error fetching the Geo Settings"
msgstr "Der opstod en fejl ved hentning af Geo-indstillingerne"
msgid "There was an error fetching the Node's Groups"
-msgstr ""
+msgstr "Der var en fejl ved hentning af knudepunktets grupper"
msgid "There was an error fetching the deploy freezes."
-msgstr ""
+msgstr "Der opstod en fejl under hentning af udsendelsesfrysningerne."
msgid "There was an error fetching the environments information."
msgstr "Der opstod en fejl ved hentning af miljøinformationen."
@@ -33917,7 +34386,7 @@ msgid "There was an error fetching the jobs for your project."
msgstr "Der opstod en fejl ved hentning af jobbene for dit projekt."
msgid "There was an error fetching the top labels for the selected group"
-msgstr ""
+msgstr "Der var en fejl ved hentning af topetiketterne for den valgte gruppe"
msgid "There was an error fetching the variables."
msgstr "Der opstod en fejl ved hentning af variablerne."
@@ -33938,7 +34407,7 @@ msgid "There was an error loading related feature flags"
msgstr "Der opstod en fejl ved indlæsning af relaterede funktionsflag"
msgid "There was an error loading users activity calendar."
-msgstr ""
+msgstr "Der var en fejl ved indlæsning af brugernes aktivitetskalender."
msgid "There was an error parsing the data for this graph."
msgstr "Der opstod en fejl ved fortolkning af dataene til grafen."
@@ -33956,13 +34425,13 @@ msgid "There was an error retrieving the Jira users."
msgstr "Der opstod en fejl ved indhentning af Jira-brugerne."
msgid "There was an error saving this Geo Node."
-msgstr ""
+msgstr "Der opstod en fejl under gemning af Geo-knudepunktet."
msgid "There was an error saving your changes."
msgstr "Der opstod en fejl ved gemning af dine ændringer."
msgid "There was an error subscribing to this label."
-msgstr ""
+msgstr "Der var en fejl ved abonnering på etiketten."
msgid "There was an error syncing project %{name}"
msgstr "Der opstod en fejl ved synkronisering af projektet %{name}"
@@ -33971,7 +34440,7 @@ msgid "There was an error syncing the %{replicableType}"
msgstr "Der opstod en fejl ved synkronisering af %{replicableType}"
msgid "There was an error trying to validate your query"
-msgstr ""
+msgstr "Der opstod en fejl under forsøg på at validere din forespørgsel"
msgid "There was an error updating the Geo Settings"
msgstr "Der opstod en fejl ved opdatering af Geo-indstillingerne"
@@ -33986,19 +34455,19 @@ msgid "There was an error updating the dashboard, branch named: %{branch} alread
msgstr "Der opstod en fejl ved opdatering af betjeningspanelet, grenen ved navn: %{branch} findes allerede."
msgid "There was an error when reseting email token."
-msgstr ""
+msgstr "Der opstod en fejl under nulstilling af e-mailtoken."
msgid "There was an error when subscribing to this label."
-msgstr ""
+msgstr "Der var en fejl ved abonnering på etiketten."
msgid "There was an error when unsubscribing from this label."
-msgstr ""
+msgstr "Der var en fejl ved fjernelse af abonnering fra etiketten."
msgid "There was an error while fetching the chart data. Please refresh the page to try again."
-msgstr "Der opstod en fejl under hentning af diagramdataene. Opdater venligst siden og prøv igen."
+msgstr "Der opstod en fejl under hentning af diagramdataene. Opdater venligst siden for at prøve igen."
msgid "There was an error while fetching the table data. Please refresh the page to try again."
-msgstr "Der opstod en fejl under hentning af tabeldataene. Opdater venligst siden og prøv igen."
+msgstr "Der opstod en fejl under hentning af tabeldataene. Opdater venligst siden for at prøve igen."
msgid "There was an error while fetching value stream analytics data."
msgstr ""
@@ -34022,7 +34491,7 @@ msgid "These existing issues have a similar title. It might be better to comment
msgstr ""
msgid "These paths are protected for POST requests."
-msgstr ""
+msgstr "Stierne er beskyttet for POST-anmodninger."
msgid "These runners are shared across projects in this group."
msgstr ""
@@ -34034,10 +34503,10 @@ msgid "These runners are specific to this project."
msgstr ""
msgid "These variables are inherited from the parent group."
-msgstr ""
+msgstr "Variablerne er nedarvede fra forældergruppen."
msgid "These will be sent to %{email} in an attachment once finished."
-msgstr ""
+msgstr "De sendes til %{email} i en vedhæftning når det er færdigt."
msgid "Third Party Advisory Link"
msgstr ""
@@ -34049,19 +34518,19 @@ msgid "This %{issuableDisplayName} is locked. Only project members can comment."
msgstr ""
msgid "This %{issuableType} is confidential"
-msgstr ""
+msgstr "Denne %{issuableType} er fortrolig"
msgid "This %{issuable} is locked. Only %{strong_open}project members%{strong_close} can comment."
-msgstr ""
+msgstr "Denne %{issuable} er låst. Kun %{strong_open}projektmedlemmer%{strong_close} kan kommentere."
msgid "This %{noteableTypeText} is %{confidentialLinkStart}confidential%{linkEnd} and %{lockedLinkStart}locked%{linkEnd}."
-msgstr ""
+msgstr "Denne %{noteableTypeText} er %{confidentialLinkStart}fortrolig%{linkEnd} og %{lockedLinkStart}låst%{linkEnd}."
msgid "This %{noteableTypeText} is locked."
-msgstr ""
+msgstr "Denne %{noteableTypeText} er låst."
msgid "This %{viewer} could not be displayed because %{reason}. You can %{options} instead."
-msgstr ""
+msgstr "%{viewer} kunne ikke vises fordi %{reason}. Du kan i stedet %{options}."
msgid "This Cron pattern is invalid"
msgstr "Cron-mønsteret er ugyldigt"
@@ -34097,7 +34566,7 @@ msgid "This action will %{strongOpen}permanently delete%{strongClose} %{codeOpen
msgstr ""
msgid "This action will %{strongOpen}permanently remove%{strongClose} %{codeOpen}%{group}%{codeClose} %{strongOpen}immediately%{strongClose}."
-msgstr ""
+msgstr "Handlingen vil %{strongOpen}straks fjerne%{strongClose} %{codeOpen}%{group}%{codeClose} %{strongOpen}permanent%{strongClose}."
msgid "This also resolves all related threads"
msgstr ""
@@ -34115,16 +34584,16 @@ msgid "This application will be able to:"
msgstr "Programmet vil være i stand til at:"
msgid "This attachment has been truncated to avoid exceeding the maximum allowed attachment size of %{size_limit}. %{written_count} of %{count} %{issuables} have been included. Consider re-exporting with a narrower selection of %{issuables}."
-msgstr ""
+msgstr "Vedhæftningen er blevet afkortet for ikke at overstige den maksimale tilladte vedhæftningsstørrelse på %{size_limit}. %{written_count} af %{count} %{issuables} er blevet medtaget. Overvej at eksportere igen med et mindre udvalg af %{issuables}."
msgid "This attachment has been truncated to avoid exceeding the maximum allowed attachment size of %{size_limit}. %{written_count} of %{issues_count} issues have been included. Consider re-exporting with a narrower selection of issues."
-msgstr ""
+msgstr "Vedhæftningen er blevet afkortet for ikke at overstige den maksimale tilladte vedhæftningsstørrelse på %{size_limit}. %{written_count} af %{issues_count} problemstillinger er blevet medtaget. Overvej at eksportere igen med et mindre udvalg af problemstillinger."
msgid "This attachment has been truncated to avoid exceeding the maximum allowed attachment size of %{size_limit}. %{written_count} of %{merge_requests_count} merge requests have been included. Consider re-exporting with a narrower selection of merge requests."
-msgstr ""
+msgstr "Vedhæftningen er blevet afkortet for ikke at overstige den maksimale tilladte vedhæftningsstørrelse på %{size_limit}. %{written_count} af %{merge_requests_count} sammenlægningsanmodninger er blevet medtaget. Overvej at eksportere igen med et mindre udvalg af sammenlægningsanmodninger."
msgid "This attachment has been truncated to avoid exceeding the maximum allowed attachment size of %{size_limit}. %{written_count} of %{requirements_count} requirements have been included. Consider re-exporting with a narrower selection of requirements."
-msgstr ""
+msgstr "Vedhæftningen er blevet afkortet for ikke at overstige den maksimale tilladte vedhæftningsstørrelse på %{size_limit}. %{written_count} af %{requirements_count} krav er blevet medtaget. Overvej at eksportere igen med et mindre udvalg af krav."
msgid "This block is self-referential"
msgstr ""
@@ -34133,7 +34602,7 @@ msgid "This board's scope is reduced"
msgstr ""
msgid "This chart could not be displayed"
-msgstr ""
+msgstr "Diagrammet kunne ikke vises"
msgid "This clears repository check states for all projects in the database and cannot be undone. Are you sure?"
msgstr ""
@@ -34181,7 +34650,7 @@ msgid "This diff is collapsed."
msgstr "Diff'en er sammenfoldet."
msgid "This directory"
-msgstr ""
+msgstr "Mappen"
msgid "This domain is not verified. You will need to verify ownership before access is enabled."
msgstr ""
@@ -34190,7 +34659,7 @@ msgid "This endpoint has been requested too many times. Try again later."
msgstr ""
msgid "This environment has no deployments yet."
-msgstr ""
+msgstr "Miljøet har ingen udsendelser endnu."
msgid "This environment is being deployed"
msgstr "Miljøet udsendes"
@@ -34205,7 +34674,7 @@ msgid "This epic already has the maximum number of child epics."
msgstr ""
msgid "This epic does not exist or you don't have sufficient permission."
-msgstr ""
+msgstr "Epicen findes ikke eller du har ikke tilstrækkelig tilladelse."
msgid "This feature is part of your GitLab Ultimate trial."
msgstr "Funktionen er en del af din GitLab Ultimate-prøveperiode."
@@ -34219,9 +34688,12 @@ msgstr "Feltet kræves"
msgid "This field is required."
msgstr "Feltet kræves."
-msgid "This group"
+msgid "This form is disabled in preview"
msgstr ""
+msgid "This group"
+msgstr "Gruppen"
+
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 ""
@@ -34235,25 +34707,22 @@ msgid "This group does not have any group runners yet."
msgstr ""
msgid "This group has been scheduled for permanent removal on %{date}"
-msgstr ""
+msgstr "Gruppen er blevet planlagt til permanent sletning %{date}"
msgid "This group is linked to a subscription"
-msgstr ""
-
-msgid "This group, including all subgroups, projects and git repositories, will be reachable from only the specified IP address ranges."
-msgstr ""
+msgstr "Gruppen er linket til et abonnement"
msgid "This group, its subgroups and projects has been scheduled for removal on %{date}."
msgstr ""
msgid "This group, its subgroups and projects will be removed on %{date} since its parent group '%{parent_group_name}'' has been scheduled for removal."
-msgstr ""
+msgstr "Gruppen, dens undergrupper og projekter vil blive fjernet %{date} da dens forældergruppe '%{parent_group_name}'' er blevet planlagt til sletning."
msgid "This invitation was sent to %{mail_to_invite_email}, but you are signed in as %{link_to_current_user} with email %{mail_to_current_user}."
msgstr ""
msgid "This is a \"Ghost User\", created to hold all issues authored by users that have since been deleted. This user cannot be removed."
-msgstr ""
+msgstr "Dette er en \"spøgelsesbruger\" som er blevet oprettet for at holde alle problemstillinger forfattet af brugere der sidenhen er blevet slettet. Brugeren kan ikke fjernes."
msgid "This is a Jira user."
msgstr "Det er en Jira-bruger."
@@ -34277,7 +34746,7 @@ msgid "This is a security log of important events involving your account."
msgstr ""
msgid "This is a self-managed instance of GitLab."
-msgstr ""
+msgstr "Dette er en selvhåndterede instans af GitLab."
msgid "This is the highest peak of users on your installation since the license started."
msgstr ""
@@ -34292,7 +34761,7 @@ msgid "This issue is currently blocked by the following issues:"
msgstr ""
msgid "This issue is hidden because its author has been banned"
-msgstr ""
+msgstr "Problemstillingen er skjult fordi dens forfatter er blevet udelukket"
msgid "This issue is in a child epic of the filtered epic"
msgstr ""
@@ -34304,7 +34773,7 @@ msgid "This job depends on upstream jobs that need to succeed in order for this
msgstr ""
msgid "This job does not have a trace."
-msgstr ""
+msgstr "Jobbet har ikke et trace."
msgid "This job has been canceled"
msgstr "Jobbet er blevet annulleret"
@@ -34313,10 +34782,10 @@ msgid "This job has been skipped"
msgstr "Jobbet er sprunget over"
msgid "This job has not been triggered yet"
-msgstr "Jobbet er ikke udløst endnu"
+msgstr "Jobbet er endnu ikke blvet udløst"
msgid "This job has not started yet"
-msgstr "Jobbet er ikke startet endnu"
+msgstr "Jobbet er endnu ikke startet"
msgid "This job is an out-of-date deployment to %{environmentLink} using cluster %{clusterNameOrLink} and namespace %{kubernetesNamespace}."
msgstr ""
@@ -34340,10 +34809,10 @@ msgid "This job is archived. Only the complete pipeline can be retried."
msgstr ""
msgid "This job is creating a deployment to %{environmentLink} using cluster %{clusterNameOrLink} and namespace %{kubernetesNamespace}."
-msgstr ""
+msgstr "Jobbet opretter en udsendelse til %{environmentLink} med klyngen %{clusterNameOrLink} og navnerummet %{kubernetesNamespace}."
msgid "This job is creating a deployment to %{environmentLink} using cluster %{clusterNameOrLink} and namespace %{kubernetesNamespace}. This will overwrite the %{deploymentLink}."
-msgstr ""
+msgstr "Jobbet opretter en udsendelse til %{environmentLink} med klyngen %{clusterNameOrLink} og navnerummet %{kubernetesNamespace}. Det vil overskrive %{deploymentLink}."
msgid "This job is creating a deployment to %{environmentLink} using cluster %{clusterNameOrLink}."
msgstr ""
@@ -34352,13 +34821,13 @@ msgid "This job is creating a deployment to %{environmentLink} using cluster %{c
msgstr ""
msgid "This job is creating a deployment to %{environmentLink}."
-msgstr ""
+msgstr "Jobbet opretter en udsendelse til %{environmentLink}."
msgid "This job is creating a deployment to %{environmentLink}. This will overwrite the %{deploymentLink}."
msgstr ""
msgid "This job is deployed to %{environmentLink} using cluster %{clusterNameOrLink} and namespace %{kubernetesNamespace}."
-msgstr ""
+msgstr "Jobbet er udsendt til %{environmentLink} med klyngen %{clusterNameOrLink} og navnerummet %{kubernetesNamespace}."
msgid "This job is deployed to %{environmentLink} using cluster %{clusterNameOrLink}."
msgstr ""
@@ -34403,13 +34872,13 @@ msgid "This merge request cannot be rebased while there are conflicts."
msgstr ""
msgid "This merge request does not have accessibility reports"
-msgstr ""
+msgstr "Sammenlægningsanmodningen har ikke tilgængelighedsrapporter"
msgid "This merge request does not have codequality reports"
msgstr ""
msgid "This merge request is closed. To apply this suggestion, edit this file directly."
-msgstr ""
+msgstr "Sammenlægningsanmodningen er lukket. Rediger filen direkte for at anvende forslaget."
msgid "This merge request is from a private project to a public project."
msgstr "Sammenlægningsanmodningen er fra et privat projekt til et offentligt projekt."
@@ -34430,16 +34899,16 @@ msgid "This merge request was merged. To apply this suggestion, edit this file d
msgstr ""
msgid "This namespace has already been taken! Please choose another one."
-msgstr ""
+msgstr "Navnerummet er allerede blevet taget! Vælg venligst et andet."
msgid "This only applies to repository indexing operations."
msgstr ""
msgid "This option is only available on GitLab.com"
-msgstr ""
+msgstr "Valgmuligheden er kun tilgængelig på GitLab.com"
msgid "This page is unavailable because you are not allowed to read information across multiple projects."
-msgstr ""
+msgstr "Siden er utilgængelig fordi du ikke har tilladelse til at læse information på tværs af flere projekter."
msgid "This page sends a payload. Go back to the events page to see a newly created event."
msgstr ""
@@ -34451,22 +34920,22 @@ msgid "This pipeline makes use of a predefined CI/CD configuration enabled by %{
msgstr ""
msgid "This pipeline was triggered by a schedule."
-msgstr ""
+msgstr "Pipelinen blev udløst af en planlægning."
msgid "This project"
-msgstr ""
+msgstr "Projektet"
msgid "This project does not belong to a group and cannot make use of group runners."
msgstr ""
msgid "This project does not have %{service_desk_link_start}Service Desk%{service_desk_link_end} enabled, so the user who created the issue will no longer receive email notifications about new activity."
-msgstr ""
+msgstr "Projektet har ikke %{service_desk_link_start}serviceskranke%{service_desk_link_end} aktiveret, så den bruger der oprettede problemstillingen vil ikke længere modtage e-mail-underretninger om ny aktivitet."
msgid "This project does not have a wiki homepage yet"
msgstr "Projektet har endnu ikke en wikistartside"
msgid "This project has no active access tokens."
-msgstr ""
+msgstr "Projektet har ingen aktive adgangstokens."
msgid "This project is archived and cannot be commented on."
msgstr ""
@@ -34475,7 +34944,7 @@ msgid "This project is licensed under the %{strong_start}%{license_name}%{strong
msgstr ""
msgid "This project manages its dependencies using %{strong_start}%{manager_name}%{strong_end}"
-msgstr ""
+msgstr "Projektet håndterer sine afhængigheder med %{strong_start}%{manager_name}%{strong_end}"
msgid "This project path either does not exist or you do not have access."
msgstr ""
@@ -34484,16 +34953,16 @@ msgid "This project will be deleted on %{date}"
msgstr "Projektet slettes %{date}"
msgid "This project will be deleted on %{date} since its parent group '%{parent_group_name}' has been scheduled for deletion."
-msgstr ""
+msgstr "Projektet vil blive slettet %{date} eftersom dets forældergruppe '%{parent_group_name}' er blevet planlagt til sletning."
msgid "This project will live in your group %{strong_open}%{namespace}%{strong_close}. A project is where you house your files (repository), plan your work (issues), publish your documentation (wiki), and so much more."
msgstr ""
msgid "This repository"
-msgstr ""
+msgstr "Depotet"
msgid "This repository has never been checked."
-msgstr ""
+msgstr "Depotet er aldrig blevet tjekket."
msgid "This repository is currently empty. A new Auto DevOps pipeline will be created after a new file has been pushed to a branch."
msgstr ""
@@ -34505,7 +34974,7 @@ msgid "This repository was last checked %{last_check_timestamp}. The check passe
msgstr ""
msgid "This runner will only run on pipelines triggered on protected branches"
-msgstr ""
+msgstr "Runneren vil kun køre på pipelines som er udløst på beskyttede grene"
msgid "This service allows users to perform common operations on this project by entering slash commands in Slack."
msgstr ""
@@ -34514,19 +34983,16 @@ msgid "This setting can be overridden in each project."
msgstr ""
msgid "This subscription is for"
-msgstr ""
+msgstr "Abonnementet er til"
msgid "This suggestion already matches its content."
msgstr ""
msgid "This user cannot be unlocked manually from GitLab"
-msgstr ""
-
-msgid "This user does not have a pending request"
-msgstr ""
+msgstr "Brugeren kan ikke oplåses fra GitLab manuelt"
msgid "This user has an unconfirmed email address (%{email}). You may force a confirmation."
-msgstr ""
+msgstr "Brugeren har en ubekræftet e-mailadresse (%{email}). Du kan gennemtvinge en bekræftelse."
msgid "This user has an unconfirmed email address. You may force a confirmation."
msgstr ""
@@ -34544,7 +35010,7 @@ msgid "This user has previously committed to the %{name} project."
msgstr ""
msgid "This user has the %{access} role in the %{name} project."
-msgstr ""
+msgstr "Brugeren har rollen %{access} i projektet %{name}."
msgid "This user is the author of this %{noteable}."
msgstr ""
@@ -34553,16 +35019,16 @@ msgid "This variable can not be masked."
msgstr ""
msgid "This will redirect you to an external sign in page."
-msgstr ""
+msgstr "Det vil omdirigere dig til en ekstern indlogningsside."
msgid "This will remove the fork relationship between this project and %{fork_source}."
-msgstr ""
+msgstr "Det vil fjerne forgreningsrelationen mellem projektet og %{fork_source}."
msgid "This will remove the fork relationship between this project and other projects in the fork network."
-msgstr ""
+msgstr "Det vil fjerne forgreningsrelationen mellem projektet og andre projekter i forgreningsnetværket."
msgid "Thread to reply to cannot be found"
-msgstr ""
+msgstr "Kan ikke finde tråden som skal besvares"
msgid "Threat Monitoring"
msgstr ""
@@ -34604,7 +35070,7 @@ msgid "ThreatMonitoring|Events"
msgstr "Begivenheder"
msgid "ThreatMonitoring|Failed to create incident, please try again."
-msgstr ""
+msgstr "Kunne ikke oprette hændelse. Prøv venligst igen."
msgid "ThreatMonitoring|Hide dismissed alerts"
msgstr ""
@@ -34622,7 +35088,7 @@ msgid "ThreatMonitoring|No alerts available to display. See %{linkStart}enabling
msgstr ""
msgid "ThreatMonitoring|No alerts to display."
-msgstr ""
+msgstr "Ingen alertbeskeder at vise."
msgid "ThreatMonitoring|No environments detected"
msgstr ""
@@ -34633,11 +35099,8 @@ msgstr ""
msgid "ThreatMonitoring|Packet Activity"
msgstr ""
-msgid "ThreatMonitoring|Policies"
-msgstr ""
-
msgid "ThreatMonitoring|Requests"
-msgstr ""
+msgstr "Anmodninger"
msgid "ThreatMonitoring|Resolved"
msgstr ""
@@ -34646,10 +35109,10 @@ msgid "ThreatMonitoring|Show last"
msgstr "Vis sidste"
msgid "ThreatMonitoring|Something went wrong, unable to fetch environments"
-msgstr ""
+msgstr "Noget gik galt. Kan ikke hente miljøer"
msgid "ThreatMonitoring|Something went wrong, unable to fetch statistics"
-msgstr ""
+msgstr "Noget gik galt. Kan ikke hente statistik"
msgid "ThreatMonitoring|Statistics"
msgstr "Statistik"
@@ -34661,7 +35124,7 @@ msgid "ThreatMonitoring|There was an error displaying the alerts. Confirm your e
msgstr ""
msgid "ThreatMonitoring|There was an error while updating the status of the alert. Please try again."
-msgstr ""
+msgstr "Noget gik galt under opdatering af alertbeskedens status. Prøv venligst igen."
msgid "ThreatMonitoring|Threat Monitoring"
msgstr ""
@@ -34687,6 +35150,12 @@ msgstr ""
msgid "ThreatMonitoring|View documentation"
msgstr ""
+msgid "Threshold in bytes at which to compress Sidekiq job arguments."
+msgstr ""
+
+msgid "Threshold in bytes at which to reject Sidekiq jobs. Set this to 0 to if you don't want to limit Sidekiq jobs."
+msgstr ""
+
msgid "Throughput"
msgstr ""
@@ -34694,7 +35163,10 @@ msgid "Thursday"
msgstr "Torsdag"
msgid "Time"
-msgstr "Tid"
+msgstr "Tidspunkt"
+
+msgid "Time (in hours) that users are allowed to skip forced configuration of two-factor authentication."
+msgstr ""
msgid "Time Spent"
msgstr "Tid brugt"
@@ -34712,16 +35184,16 @@ msgid "Time before enforced"
msgstr ""
msgid "Time between merge request creation and merge/close"
-msgstr ""
+msgstr "Tid mellem oprettelse af sammenlægningsanmodning og sammenlægning/lukning"
msgid "Time estimate"
-msgstr ""
+msgstr "Tidsestimat"
msgid "Time from first comment to last commit"
-msgstr ""
+msgstr "Tid fra første kommentar til sidste commit"
msgid "Time from first commit until first comment"
-msgstr ""
+msgstr "Tid fra første commit til første kommentar"
msgid "Time from last commit to merge"
msgstr ""
@@ -34730,7 +35202,7 @@ msgid "Time in seconds"
msgstr "Tid i sekunder"
msgid "Time in seconds GitLab will wait for a response from the external service. When the service does not respond in time, access will be denied."
-msgstr ""
+msgstr "Tid i sekunder som GitLab vil vente på svar fra den eksterne tjeneste. Når tjenesten ikke svarer i tide vil adgangen blive nægtet."
msgid "Time of import: %{importTime}"
msgstr ""
@@ -34748,10 +35220,10 @@ msgid "Time to subtract exceeds the total time spent"
msgstr ""
msgid "Time tracking"
-msgstr ""
+msgstr "Tidssporing"
msgid "Time tracking report"
-msgstr ""
+msgstr "Tidssporingsrapport"
msgid "Time until first merge request"
msgstr ""
@@ -34760,13 +35232,13 @@ msgid "Time zone"
msgstr "Tidszone"
msgid "TimeTrackingEstimated|Est"
-msgstr ""
+msgstr "Est."
-msgid "TimeTracking|%{startTag}Spent: %{endTag}%{timeSpentHumanReadable}"
+msgid "TimeTracking|%{spentStart}Spent: %{spentEnd}"
msgstr ""
msgid "TimeTracking|Estimated:"
-msgstr ""
+msgstr "Estimatet:"
msgid "TimeTracking|Over by %{timeRemainingHumanReadable}"
msgstr ""
@@ -34895,10 +35367,10 @@ msgid "Timeago|in 1 year"
msgstr "om 1 år"
msgid "Timeago|just now"
-msgstr ""
+msgstr "lige nu"
msgid "Timeago|right now"
-msgstr ""
+msgstr "lige nu"
msgid "Timeline|Turn timeline view off"
msgstr ""
@@ -34910,7 +35382,7 @@ msgid "Timeout"
msgstr "Timeout"
msgid "Timeout connecting to the Google API. Please try again."
-msgstr ""
+msgstr "Timeout ved oprettelse af forbindelse til Google API. Prøv venligst igen."
msgid "Timeout for moderately fast Gitaly operations (in seconds). Provide a value between Default timeout and Fast timeout."
msgstr ""
@@ -34959,7 +35431,7 @@ msgid "To %{link_to_help} of your domain, add the above key to a TXT record with
msgstr ""
msgid "To Do"
-msgstr "To Do"
+msgstr "Gøremål"
msgid "To GitLab"
msgstr "Til GitLab"
@@ -34976,9 +35448,12 @@ msgstr ""
msgid "To access this domain create a new DNS record"
msgstr ""
-msgid "To add an SSH key you need to %{generate_link_start}generate one%{link_end} or use an %{existing_link_start}existing key%{link_end}."
+msgid "To add a custom suffix, set up a Service Desk email address. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
+msgid "To add an SSH key you need to %{generate_link_start}generate one%{link_end} or use an %{existing_link_start}existing key%{link_end}."
+msgstr "For at tilføje en SSH-nøgle skal du %{generate_link_start}generere en%{link_end} eller bruge en %{existing_link_start}eksisterende nøgle%{link_end}."
+
msgid "To add the entry manually, provide the following details to the application on your phone."
msgstr ""
@@ -34997,13 +35472,16 @@ msgstr ""
msgid "To connect an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To continue using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
+msgstr ""
+
msgid "To continue, you need to select the link in the confirmation email we sent to verify your email address. If you didn't get our email, select %{strongStart}Resend confirmation email.%{strongEnd}"
msgstr ""
msgid "To define internal users, first enable new users set to external"
msgstr ""
-msgid "To enable Registration Features, make sure \"Enable service ping\" is checked."
+msgid "To enable Registration Features, first enable Service Ping."
msgstr ""
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
@@ -35013,24 +35491,24 @@ 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 ""
+msgstr "For at beskytte din konto yderligere kan du overveje at konfigurere en %{mfa_link_start}totrinsgodkendelsesmetode%{mfa_link_end}."
msgid "To further protect your account, consider configuring a two-factor authentication method: %{mfa_link}."
-msgstr ""
+msgstr "For at beskytte din konto yderligere kan du overveje at konfigurere en totrinsgodkendelsesmetode: %{mfa_link}."
msgid "To get started you enter your FogBugz URL and login information below. In the next steps, you'll be able to map users and select the projects you want to import."
msgstr ""
msgid "To get started, click the link below to confirm your account."
-msgstr ""
+msgstr "Kom i gang ved at klikke på linket nedenunder for at bekræfte din konto."
msgid "To get started, please enter your Gitea Host URL and a %{link_to_personal_token}."
msgstr ""
msgid "To get started, use the link below to confirm your account."
-msgstr ""
+msgstr "Kom i gang ved at bruge linket nedenunder for at bekræfte din konto."
-msgid "To help improve GitLab and its user experience, GitLab will periodically collect usage information."
+msgid "To help improve GitLab and its user experience, GitLab periodically collects usage information."
msgstr ""
msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
@@ -35043,10 +35521,10 @@ msgid "To keep this project going, create a new issue"
msgstr ""
msgid "To keep this project going, create a new merge request"
-msgstr ""
+msgstr "Opret en ny sammenlægningsanmodning for at holde projektet i gang"
msgid "To learn more about this project, read %{link_to_wiki}."
-msgstr ""
+msgstr "Læs %{link_to_wiki} for at lære mere om projektet."
msgid "To move or copy an entire GitLab project from another GitLab installation to this one, navigate to the original project's settings page, generate an export file, and upload it here."
msgstr ""
@@ -35063,17 +35541,17 @@ msgstr ""
msgid "To preserve performance only %{strong_open}%{display_size} of %{real_size}%{strong_close} files are displayed."
msgstr ""
-msgid "To protect this issue's confidentiality, %{forkLink} and set the fork's visibility to private."
+msgid "To protect this issue's confidentiality, %{linkStart}fork this project%{linkEnd} and set the fork's visibility to private."
msgstr ""
msgid "To protect this issue's confidentiality, a private fork of this project was selected."
-msgstr ""
+msgstr "For at beskytte problemstillingens fortrolighed blev der valgt en privat forgrening af projektet."
msgid "To reactivate your account, %{gitlab_link_start}sign in to GitLab.%{link_end}"
msgstr ""
msgid "To reactivate your account, sign in to GitLab at %{gitlab_url}."
-msgstr ""
+msgstr "Log ind på GitLab på %{gitlab_url} for at genaktivere din konto."
msgid "To receive alerts from manually configured Prometheus services, add the following URL and Authorization key to your Prometheus webhook config file. Learn more about %{linkStart}configuring Prometheus%{linkEnd} to send alerts to GitLab."
msgstr ""
@@ -35085,26 +35563,29 @@ msgid "To run CI/CD pipelines with JetBrains TeamCity, input the GitLab project
msgstr ""
msgid "To see all the user's personal access tokens you must impersonate them first."
-msgstr ""
+msgstr "For at se alle brugerens personlige adgangstokens skal du først efterligne dem."
msgid "To see this project's operational details, %{linkStart}upgrade its group plan to Premium%{linkEnd}. You can also remove the project from the dashboard."
-msgstr ""
+msgstr "Se projektets driftdetaljer ved at %{linkStart}opgradere dets gruppeplan til Premium%{linkEnd}. Du kan også fjerne projektet fra betjeningspanelet."
msgid "To see this project's operational details, contact an owner of group %{groupName} to upgrade the plan. You can also remove the project from the dashboard."
-msgstr ""
+msgstr "Se projektets driftdetaljer ved at kontakte en ejer af gruppen %{groupName} for at opgradere planen. Du kan også fjerne projektet fra betjeningspanelet."
msgid "To set up SAML authentication for your group through an identity provider like Azure, Okta, Onelogin, Ping Identity, or your custom SAML 2.0 provider:"
msgstr ""
-msgid "To set up this service:"
+msgid "To set up this integration:"
msgstr ""
msgid "To specify the notification level per project of a group you belong to, you need to visit project page and change notification level there."
msgstr ""
-msgid "To unsubscribe from this issue, please paste the following link into your browser:"
+msgid "To start using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
msgstr ""
+msgid "To unsubscribe from this issue, please paste the following link into your browser:"
+msgstr "Indsæt venligst følgende link i din browser for at fjerne abonnering fra problemstillingen:"
+
msgid "To update Snippets with multiple files, you must use the `files` parameter"
msgstr ""
@@ -35127,10 +35608,10 @@ msgid "To widen your search, change or remove filters."
msgstr ""
msgid "To-Do List"
-msgstr "To-Do-liste"
+msgstr "Gøremålsliste"
msgid "To-do item successfully marked as done."
-msgstr ""
+msgstr "Gøremålselement mærket som færdig."
msgid "Today"
msgstr "I dag"
@@ -35160,16 +35641,16 @@ msgid "Toggle commit list"
msgstr "Commit-liste til/fra"
msgid "Toggle dropdown"
-msgstr ""
+msgstr "Rullegardin til/fra"
msgid "Toggle emoji award"
-msgstr "Emojipris til/fra"
+msgstr "Emojibelønning til/fra"
msgid "Toggle focus mode"
msgstr "Fokustilstand til/fra"
msgid "Toggle keyboard shortcuts help dialog"
-msgstr "Hjælpedialogen for tastaturgenveje til/fra"
+msgstr "Hjælpedialogen tastaturgenveje til/fra"
msgid "Toggle navigation"
msgstr "Navigation til/fra"
@@ -35190,16 +35671,16 @@ msgid "Toggle thread"
msgstr "Tråd til/fra"
msgid "Toggled :%{name}: emoji award."
-msgstr ""
+msgstr "Slog til/fra :%{name}: emojibelønning."
msgid "Toggles :%{name}: emoji award."
-msgstr ""
+msgstr "Slår til/fra :%{name}: emojibelønning."
msgid "Token"
msgstr "Token"
msgid "Token Access"
-msgstr ""
+msgstr "Tokenadgang"
msgid "Token name"
msgstr "Tokennavn"
@@ -35220,10 +35701,10 @@ msgid "Too many changes to show."
msgstr ""
msgid "Too many namespaces enabled. You will need to manage them via the console or the API."
-msgstr ""
+msgstr "For mange navnerum aktiveret. Du skal håndtere dem via konsollen eller API'en."
msgid "Too many projects enabled. You will need to manage them via the console or the API."
-msgstr ""
+msgstr "For mange projekter aktiveret. Du skal håndtere dem via konsollen eller API'en."
msgid "TopNav|Go back"
msgstr "GÃ¥ tilbage"
@@ -35235,7 +35716,7 @@ msgid "Total"
msgstr "I alt"
msgid "Total Contributions"
-msgstr ""
+msgstr "Bidragsydere i alt"
msgid "Total Score"
msgstr ""
@@ -35271,7 +35752,7 @@ msgid "TotalRefCountIndicator|1000+"
msgstr "1000+"
msgid "Tracing"
-msgstr ""
+msgstr "Tracing"
msgid "Track groups of issues that share a theme, across projects and milestones"
msgstr ""
@@ -35280,13 +35761,13 @@ msgid "Track important events in your GitLab instance."
msgstr ""
msgid "Track important events in your group."
-msgstr ""
+msgstr "Spor vigtige begivenheder i din gruppe."
msgid "Track important events in your project."
msgstr ""
msgid "Track time with quick actions"
-msgstr ""
+msgstr "Spor tid med hurtighandlinger"
msgid "Track your GitLab projects with GitLab for Slack."
msgstr ""
@@ -35301,28 +35782,28 @@ msgid "Transfer project"
msgstr "Overfør projekt"
msgid "Transfer your project into another namespace. %{link_start}Learn more.%{link_end}"
-msgstr ""
+msgstr "Overfør dit projekt til et andet navnerum. %{link_start}Lær mere%{link_end}."
msgid "TransferGroup|Cannot transfer group to one of its subgroup."
-msgstr ""
+msgstr "Kan ikke overføre gruppe til en af sine undergrupper."
msgid "TransferGroup|Cannot update the path because there are projects under this group that contain Docker images in their Container Registry. Please remove the images from your projects first and try again."
-msgstr ""
+msgstr "Kan ikke opdatere stien da der er projekter under gruppen som indeholder Docker-aftryk i deres beholderregister. Fjern venligst først aftrykkene fra dine projekter og prøv igen."
msgid "TransferGroup|Database is not supported."
msgstr "Databasen understøttes ikke."
msgid "TransferGroup|Group contains projects with NPM packages."
-msgstr ""
+msgstr "Gruppe indeholder projekter med NPM-pakker."
msgid "TransferGroup|Group is already a root group."
-msgstr ""
+msgstr "Gruppen er allerede en rodmappe."
msgid "TransferGroup|Group is already associated to the parent group."
-msgstr ""
+msgstr "Gruppe er allerede tilknyttet til forældergruppen."
msgid "TransferGroup|The parent group already has a subgroup with the same path."
-msgstr ""
+msgstr "Forældergruppen har allerede en undergruppe med den samme sti."
msgid "TransferGroup|Transfer failed: %{error_message}"
msgstr ""
@@ -35334,13 +35815,13 @@ msgid "TransferProject|Cannot move project"
msgstr "Kan ikke flytte projekt"
msgid "TransferProject|Please select a new namespace for your project."
-msgstr ""
+msgstr "Vælg venligst et nyt navnerum til dit projekt."
msgid "TransferProject|Project cannot be transferred, because tags are present in its container registry"
-msgstr ""
+msgstr "Projektet kan ikke overføres fordi der findes mærkater i dets beholderregister"
msgid "TransferProject|Project is already in this namespace."
-msgstr ""
+msgstr "Projektet er allerede i navnerummet."
msgid "TransferProject|Project with same name or path in target namespace already exists"
msgstr ""
@@ -35349,16 +35830,16 @@ msgid "TransferProject|Root namespace can't be updated if project has NPM packag
msgstr ""
msgid "TransferProject|You don't have permission to transfer projects into that namespace."
-msgstr ""
+msgstr "Du har ikke tilladelse til at overføre projekter ind i navnerummet."
msgid "TransferProject|You don't have permission to transfer this project."
-msgstr ""
+msgstr "Du har ikke tilladelse til at overføre projektet."
msgid "Tree view"
msgstr "Trævisning"
msgid "Trending"
-msgstr ""
+msgstr "Trending"
msgid "Trials|%{planName} Trial %{enDash} %{num} day left"
msgid_plural "Trials|%{planName} Trial %{enDash} %{num} days left"
@@ -35369,7 +35850,7 @@ msgid "Trials|Compare all plans"
msgstr ""
msgid "Trials|Create a new group to start your GitLab Ultimate trial."
-msgstr ""
+msgstr "Opret en ny gruppe for at starte din GitLab Ultimate-prøveperiode."
msgid "Trials|Go back to GitLab"
msgstr "GÃ¥ tilbage til GitLab"
@@ -35384,10 +35865,10 @@ 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 ""
+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 ""
+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 ""
@@ -35402,13 +35883,13 @@ msgid "Trial|Continue"
msgstr "Fortsæt"
msgid "Trial|Continue using the basic features of GitLab for free."
-msgstr ""
+msgstr "Fortsæt med at bruge de grundlæggende funktioner i GitLab gratis."
msgid "Trial|Country"
msgstr "Land"
msgid "Trial|Dismiss"
-msgstr ""
+msgstr "Afskedig"
msgid "Trial|First name"
msgstr "Fornavn"
@@ -35417,7 +35898,7 @@ msgid "Trial|GitLab Ultimate trial (optional)"
msgstr "GitLab Ultimate-prøveperiode (valgfrit)"
msgid "Trial|Hi%{salutation}, your GitLab Ultimate trial lasts for 30 days, but you can keep your free GitLab account forever. We just need some additional information about %{company} to activate your trial."
-msgstr ""
+msgstr "Hej%{salutation}, din GitLab Ultimate-prøveperiode varer 30 dage, men du kan beholde din gratis GitLab-konto for evigt. Vi har blot brug for nogle yderligere informationer om %{company} for at aktivere din prøveperiode."
msgid "Trial|How many employees will use Gitlab?"
msgstr "Hvor mange medarbejdere kommer til at bruge Gitlab?"
@@ -35441,7 +35922,7 @@ msgid "Trial|Telephone number"
msgstr "Telefonnummer"
msgid "Trial|Upgrade to Ultimate to keep using GitLab with advanced features."
-msgstr ""
+msgstr "Opgrader til Ultimate for at blive ved med at bruge GitLab med avancerede funktioner."
msgid "Trial|We will activate your trial on your group after you complete this step. After 30 days, you can:"
msgstr ""
@@ -35456,7 +35937,7 @@ msgid "Trigger"
msgstr "Udløser"
msgid "Trigger a pipeline for a branch or tag by generating a trigger token and using it with an API call. The token impersonates a user's project access and permissions."
-msgstr ""
+msgstr "Udløs en pipeline for en gren eller mærkat ved at generere en udløsertoken og bruge den med et API-kald. Tokenen efterligner en brugers projektadgang og tilladelser."
msgid "Trigger cluster reindexing"
msgstr ""
@@ -35483,7 +35964,7 @@ msgid "Trigger this manual action"
msgstr ""
msgid "Trigger token:"
-msgstr ""
+msgstr "Udløsertoken:"
msgid "Trigger variables:"
msgstr ""
@@ -35495,10 +35976,10 @@ msgid "Trigger was successfully updated."
msgstr ""
msgid "Triggerer"
-msgstr ""
+msgstr "Udløsere"
msgid "Troubleshoot and monitor your application with tracing"
-msgstr ""
+msgstr "Fejlsøg og overvåg dit program med tracing"
msgid "Trusted"
msgstr ""
@@ -35510,7 +35991,7 @@ msgid "Try again?"
msgstr "Prøv igen?"
msgid "Try all GitLab has to offer for 30 days."
-msgstr ""
+msgstr "Prøv alt hvad GitLab har at tilbyde i 30 dage."
msgid "Try changing or removing filters."
msgstr ""
@@ -35528,7 +36009,7 @@ msgid "Try using a different search term to find the file you are looking for."
msgstr ""
msgid "Trying to communicate with your device. Plug it in (if needed) and press the button on the device now."
-msgstr ""
+msgstr "Prøver at kommunikere med din enhed. Tilslut den (hvis det er nødvendigt) og tryk på knappen på enheden nu."
msgid "Trying to communicate with your device. Plug it in (if you haven't already) and press the button on the device now."
msgstr ""
@@ -35573,16 +36054,16 @@ msgid "Two-factor authentication disabled"
msgstr ""
msgid "Two-factor authentication has been disabled for this user"
-msgstr ""
+msgstr "Totrinsgodkendelse er blevet deaktiveret for brugeren"
msgid "Two-factor authentication has been disabled for your GitLab account."
-msgstr ""
+msgstr "Totrinsgodkendelse er blevet deaktiveret på din GitLab-konto."
msgid "Two-factor authentication has been disabled successfully!"
-msgstr ""
+msgstr "Totrinsgodkendelse er blevet deaktiveret!"
msgid "Two-factor authentication is not enabled for this user"
-msgstr ""
+msgstr "Totrinsgodkendelse er ikke aktiveret for brugeren"
msgid "Two-factor grace period"
msgstr ""
@@ -35594,10 +36075,10 @@ msgid "Type/State"
msgstr "Type/tilstand"
msgid "U2F Devices (%{length})"
-msgstr ""
+msgstr "U2F-enheder (%{length})"
msgid "U2F only works with HTTPS-enabled websites. Contact your administrator for more details."
-msgstr ""
+msgstr "U2F virker kun med HTTPS-aktiverede websteder. Kontakt din administrator for flere detaljer."
msgid "URL"
msgstr "URL"
@@ -35615,7 +36096,7 @@ msgid "URL is triggered for each branch updated to the repository"
msgstr ""
msgid "URL is triggered when a merge request is created, updated, or merged"
-msgstr ""
+msgstr "URL'en udløses når en sammenlægningsanmodning oprettes, opdateres eller sammenlægges"
msgid "URL is triggered when a new tag is pushed to the repository"
msgstr ""
@@ -35624,7 +36105,7 @@ msgid "URL is triggered when repository is updated"
msgstr ""
msgid "URL must be percent-encoded if neccessary."
-msgstr ""
+msgstr "URL'en skal være procentkodet hvis det er nødvendigt."
msgid "URL must start with %{codeStart}http://%{codeEnd}, %{codeStart}https://%{codeEnd}, or %{codeStart}ftp://%{codeEnd}"
msgstr "URL'en skal begynde med %{codeStart}http://%{codeEnd}, %{codeStart}https://%{codeEnd} eller %{codeStart}ftp://%{codeEnd}"
@@ -35639,7 +36120,7 @@ msgid "URL of the external storage to serve the repository static objects."
msgstr ""
msgid "URL or request ID"
-msgstr ""
+msgstr "URL eller anmodnings-id"
msgid "USER %{user_name} WILL BE REMOVED! Are you sure?"
msgstr "BRUGEREN %{user_name} FJERNES! Er du sikker?"
@@ -35648,7 +36129,7 @@ msgid "USER %{user} WILL BE REMOVED! Are you sure?"
msgstr "BRUGEREN %{user} FJERNES! Er du sikker?"
msgid "USER WILL BE BLOCKED! Are you sure?"
-msgstr "BRUGEREN BLOKERES! Er du sikker?"
+msgstr "BRUGEREN VIL BLIVE BLOKERET! Er du sikker?"
msgid "UTC"
msgstr "UTC"
@@ -35672,7 +36153,7 @@ msgid "Unable to connect to Prometheus server"
msgstr "Kan ikke oprette forbindelse til Prometheus-server"
msgid "Unable to connect to server: %{error}"
-msgstr "Kan ikke oprette forbindelse til serveren: %{error}"
+msgstr "Kan ikke oprette forbindelse til server: %{error}"
msgid "Unable to connect to the Jira instance. Please check your Jira integration configuration."
msgstr "Kan ikke oprette forbindelse til Jira-instansen. Tjek venligst din konfiguration af Jira-integrering."
@@ -35689,9 +36170,6 @@ msgstr "Kan ikke hente grenliste for projektet."
msgid "Unable to fetch branches list, please close the form and try again"
msgstr ""
-msgid "Unable to fetch unscanned projects"
-msgstr ""
-
msgid "Unable to fetch vulnerable projects"
msgstr ""
@@ -35717,7 +36195,7 @@ msgid "Unable to load the merge request widget. Try reloading the page."
msgstr ""
msgid "Unable to save cadence. Please try again"
-msgstr ""
+msgstr "Kan ikke gemme kadence. Prøv venligst igen"
msgid "Unable to save iteration. Please try again"
msgstr "Kan ikke gemme gennemløb. Prøv venligst igen"
@@ -35732,10 +36210,10 @@ msgid "Unable to schedule a pipeline to run immediately"
msgstr ""
msgid "Unable to sign you in to the group with SAML due to \"%{reason}\""
-msgstr ""
+msgstr "Kan ikke logge dig ind i gruppen med SAML pga. \"%{reason}\""
msgid "Unable to suggest a path. Please refresh and try again."
-msgstr ""
+msgstr "Kan ikke forslå en sti. Opdater venligst og prøv igen."
msgid "Unable to update label prioritization at this time"
msgstr ""
@@ -35746,28 +36224,34 @@ msgstr "Kan ikke opdatere epicen på nuværende tidspunkt."
msgid "Unable to update this issue at this time."
msgstr "Kan ikke opdatere problemstillingen på nuværende tidspunkt."
-msgid "Unarchive project"
+msgid "Unapprove a merge request"
msgstr ""
-msgid "Unarchiving the project will restore its members' ability to make changes to it. The repository can be committed to, and issues, comments, and other entities can be created. %{strong_start}Once active, this project shows up in the search and on the dashboard.%{strong_end} %{link_start}Learn more.%{link_end}"
+msgid "Unapprove the current merge request."
msgstr ""
+msgid "Unapproved the current merge request."
+msgstr ""
+
+msgid "Unarchive project"
+msgstr "Afarkivér projekt"
+
+msgid "Unarchiving the project will restore its members' ability to make changes to it. The repository can be committed to, and issues, comments, and other entities can be created. %{strong_start}Once active, this project shows up in the search and on the dashboard.%{strong_end} %{link_start}Learn more.%{link_end}"
+msgstr "Afarkivering af projektet vil igen give dets medlemmer mulighed for at foretage ændringer i det. Der kan commites til depotet og der kan oprettes problemstillinger, kommentarer og andre indslag. %{strong_start}Når det er aktiveret vises projektet i søgninger og på betjeningspanelet.%{strong_end} %{link_start}Lær mere%{link_end}."
+
msgid "Unassign from commenting user"
msgstr ""
msgid "Unassigned"
msgstr "Utildelt"
-msgid "Unauthenticated API request rate limit"
-msgstr ""
-
-msgid "Unauthenticated rate limit period in seconds"
+msgid "Unauthenticated API rate limit period in seconds"
msgstr ""
-msgid "Unauthenticated request rate limit"
+msgid "Unauthenticated requests"
msgstr ""
-msgid "Unauthenticated requests"
+msgid "Unauthenticated web rate limit period in seconds"
msgstr ""
msgid "Undo"
@@ -35783,13 +36267,13 @@ msgid "Unexpected error"
msgstr "Uventet fejl"
msgid "Unfollow"
-msgstr ""
+msgstr "Følg ikke"
msgid "Unfortunately, your email message to GitLab could not be processed."
msgstr ""
msgid "Unhappy?"
-msgstr ""
+msgstr "Utilfreds?"
msgid "Units|ms"
msgstr "ms"
@@ -35807,7 +36291,7 @@ msgid "Unknown cache key"
msgstr "Ukendt mellemlagernøgle"
msgid "Unknown encryption strategy: %{encrypted_strategy}!"
-msgstr ""
+msgstr "Ukendt krypteringsstrategi: %{encrypted_strategy}!"
msgid "Unknown format"
msgstr "Ukendt format"
@@ -35825,7 +36309,7 @@ msgid "Unlimited"
msgstr "Ubegrænset"
msgid "Unlink"
-msgstr ""
+msgstr "Aflink"
msgid "Unlock"
msgstr "Oplås"
@@ -35837,7 +36321,7 @@ msgid "Unlock the discussion"
msgstr "Oplås debatten"
msgid "Unlock this %{issuableDisplayName}? %{strongStart}Everyone%{strongEnd} will be able to comment."
-msgstr ""
+msgstr "Oplås denne %{issuableDisplayName}? %{strongStart}Alle%{strongEnd} vil være i stand til at kommentere."
msgid "Unlocked"
msgstr "Oplåst"
@@ -35864,61 +36348,49 @@ msgid "Unresolve"
msgstr ""
msgid "Unresolve thread"
-msgstr ""
+msgstr "Genåbn løst tråd"
msgid "Unresolved"
-msgstr ""
-
-msgid "UnscannedProjects|15 or more days"
-msgstr "15 eller flere dage"
-
-msgid "UnscannedProjects|30 or more days"
-msgstr "30 eller flere dage"
-
-msgid "UnscannedProjects|5 or more days"
-msgstr "5 eller flere dage"
-
-msgid "UnscannedProjects|60 or more days"
-msgstr "60 eller flere dage"
+msgstr "Uløst"
msgid "Unschedule job"
msgstr ""
msgid "Unstar"
-msgstr ""
+msgstr "Fjern stjernemarkering"
msgid "Unstarted"
msgstr ""
msgid "Unsubscribe"
-msgstr ""
+msgstr "Fjern abonnering"
msgid "Unsubscribe at group level"
-msgstr ""
+msgstr "Fjern abonnering på gruppeniveau"
msgid "Unsubscribe at project level"
-msgstr ""
+msgstr "Fjern abonnering på projektniveau"
msgid "Unsubscribe from %{type}"
-msgstr ""
+msgstr "Fjern abonnering fra %{type}"
msgid "Unsubscribed from this %{quick_action_target}."
-msgstr ""
+msgstr "Fjernet abonnering fra %{quick_action_target}."
msgid "Unsubscribes from this %{quick_action_target}."
-msgstr ""
+msgstr "Fjerner abonnering fra %{quick_action_target}."
msgid "Unsupported todo type passed. Supported todo types are: %{todo_types}"
msgstr ""
msgid "Until"
-msgstr ""
+msgstr "Indtil"
msgid "Until revoked, expired personal access tokens pose a security risk."
msgstr ""
msgid "Unused"
-msgstr ""
+msgstr "Ubrugt"
msgid "Unused, previous indices: %{index_names} will be deleted after %{time} automatically."
msgstr ""
@@ -35930,22 +36402,22 @@ msgid "Up to date"
msgstr ""
msgid "Upcoming"
-msgstr ""
+msgstr "Kommende"
msgid "Upcoming Release"
-msgstr ""
+msgstr "Kommende udgivelse"
msgid "Update"
msgstr "Opdater"
msgid "Update %{sourcePath} file"
-msgstr ""
+msgstr "Opdater %{sourcePath}-fil"
msgid "Update Now"
msgstr "Opdater nu"
msgid "Update Scheduled…"
-msgstr ""
+msgstr "Opdater planlagte …"
msgid "Update all"
msgstr "Opdater alle"
@@ -35957,16 +36429,16 @@ msgid "Update approval rule"
msgstr ""
msgid "Update approvers"
-msgstr ""
+msgstr "Opdater godkendere"
msgid "Update broadcast message"
-msgstr ""
+msgstr "Opdater broadcastmeddelelse"
msgid "Update failed"
-msgstr ""
+msgstr "Opdatering mislykkedes"
msgid "Update it"
-msgstr ""
+msgstr "Opdater den"
msgid "Update iteration"
msgstr "Opdater gennemløb"
@@ -35984,7 +36456,7 @@ msgid "Update variable"
msgstr "Opdater variabel"
msgid "Update your bookmarked URLs as filtered/sorted branches URL has been changed."
-msgstr ""
+msgstr "Opdater dine bogmærkede URL'er når URL for filtrerede/sorterede grene er blevet ændret."
msgid "Update your group name, description, avatar, and visibility."
msgstr ""
@@ -35996,13 +36468,13 @@ msgid "UpdateProject|Cannot rename project because it contains container registr
msgstr ""
msgid "UpdateProject|Could not set the default branch"
-msgstr ""
+msgstr "Kunne ikke indstille standardgrenen"
msgid "UpdateProject|New visibility level not allowed!"
-msgstr ""
+msgstr "Nyt synlighedsniveau ikke tilladt!"
msgid "UpdateProject|Project could not be updated!"
-msgstr ""
+msgstr "Projekt kunne ikke opdateres!"
msgid "UpdateRepositoryStorage|Failed to verify %{type} repository checksum from %{old} to %{new}"
msgstr ""
@@ -36014,7 +36486,7 @@ msgid "Updated"
msgstr "Opdateret"
msgid "Updated %{updated_at} by %{updated_by}"
-msgstr ""
+msgstr "Opdateret %{updated_at} af %{updated_by}"
msgid "Updates"
msgstr "Opdateringer"
@@ -36071,35 +36543,38 @@ msgid "UploadLink|click to upload"
msgstr "klik for at uploade"
msgid "Uploading changes to terminal"
-msgstr ""
+msgstr "Uploader ændringer til terminal"
msgid "Uploads"
msgstr "Uploads"
msgid "Upon performing this action, the contents of this group, its subgroup and projects will be permanently deleted after %{deletion_adjourned_period} days on %{date}. Until that time:"
-msgstr ""
+msgstr "Når handlingen udføres, så slettes indholdet i gruppen, dens undergrupper og projekter permanent efter %{deletion_adjourned_period} dage %{date}. Indtil da:"
msgid "Upstream"
-msgstr ""
+msgstr "Upstream"
msgid "Uptime"
msgstr "Oppetid"
msgid "Upvotes"
-msgstr ""
+msgstr "Opstemmer"
msgid "Usage"
msgstr "Forbrug"
msgid "Usage Trends"
-msgstr ""
+msgstr "Forbrugstrends"
msgid "Usage statistics"
-msgstr ""
+msgstr "Forbrugsstatistik"
msgid "UsageQuota|%{help_link_start}Shared runners%{help_link_end} are disabled, so there are no limits set on pipeline usage"
msgstr ""
+msgid "UsageQuota|%{linkTitle} help link"
+msgstr ""
+
msgid "UsageQuota|%{percentageLeft} of purchased storage is available"
msgstr ""
@@ -36109,18 +36584,33 @@ msgstr "Artefakter"
msgid "UsageQuota|Artifacts is a sum of build and pipeline artifacts."
msgstr ""
-msgid "UsageQuota|Buy additional minutes"
+msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
msgstr ""
+msgid "UsageQuota|Buy additional minutes"
+msgstr "Køb yderligere minutter"
+
msgid "UsageQuota|CI minutes usage by month"
msgstr ""
msgid "UsageQuota|CI minutes usage by project"
msgstr ""
+msgid "UsageQuota|Code packages and container images."
+msgstr ""
+
msgid "UsageQuota|Current period usage"
msgstr ""
+msgid "UsageQuota|File attachments and smaller design graphics."
+msgstr ""
+
+msgid "UsageQuota|Git repository, managed by the Gitaly service."
+msgstr ""
+
+msgid "UsageQuota|Includes project registry, artifacts, packages, wiki, uploads and other items."
+msgstr ""
+
msgid "UsageQuota|Increase storage temporarily"
msgstr ""
@@ -36139,6 +36629,9 @@ msgstr ""
msgid "UsageQuota|Packages"
msgstr "Pakker"
+msgid "UsageQuota|Pipeline artifacts and job artifacts, created with CI/CD."
+msgstr ""
+
msgid "UsageQuota|Pipelines"
msgstr ""
@@ -36155,17 +36648,26 @@ msgid "UsageQuota|Repository"
msgstr ""
msgid "UsageQuota|Seats"
+msgstr "Sæder"
+
+msgid "UsageQuota|Shared bits of code and text."
msgstr ""
msgid "UsageQuota|Snippets"
-msgstr "Uddrag"
+msgstr "Snippets"
msgid "UsageQuota|Something went wrong while fetching project storage statistics"
-msgstr ""
+msgstr "Noget fik galt under hentning af af projektlagerstatistik"
msgid "UsageQuota|Storage"
msgstr "Lager"
+msgid "UsageQuota|Storage type"
+msgstr ""
+
+msgid "UsageQuota|There is a known issue with Artifact storage where the total could be incorrect for some projects. More details and progress are available in %{warningLinkStart}the epic%{warningLinkEnd}."
+msgstr ""
+
msgid "UsageQuota|This is the total amount of storage used across your projects within this namespace."
msgstr ""
@@ -36203,6 +36705,9 @@ msgid "UsageQuota|Uploads"
msgstr ""
msgid "UsageQuota|Usage"
+msgstr "Forbrug"
+
+msgid "UsageQuota|Usage Breakdown"
msgstr ""
msgid "UsageQuota|Usage Quotas"
@@ -36229,6 +36734,9 @@ msgstr ""
msgid "UsageQuota|Wiki"
msgstr "Wiki"
+msgid "UsageQuota|Wiki content."
+msgstr ""
+
msgid "UsageQuota|Wikis"
msgstr "Wikier"
@@ -36248,28 +36756,28 @@ 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 ""
+msgstr "Kunne ikke indlæse problemstillings- og sammenlægningsanmodningsdiagrammet. Opdater venligst siden for at prøve igen."
msgid "UsageTrends|Could not load the pipelines chart. Please refresh the page to try again."
-msgstr ""
+msgstr "Kunne ikke indlæse pipelinediagrammet. Opdater venligst siden for at prøve igen."
msgid "UsageTrends|Could not load the projects and groups chart. Please refresh the page to try again."
-msgstr ""
+msgstr "Kunne ikke indlæse projekt- og gruppediagrammet. Opdater venligst siden for at prøve igen."
msgid "UsageTrends|Groups"
msgstr "Grupper"
msgid "UsageTrends|Issues"
-msgstr ""
+msgstr "Problemstillinger"
msgid "UsageTrends|Issues & merge requests"
-msgstr ""
+msgstr "Problemstillinger og sammenlægningsanmodninger"
msgid "UsageTrends|Items"
msgstr "Elementer"
msgid "UsageTrends|Merge requests"
-msgstr ""
+msgstr "Sammenlægningsanmodninger"
msgid "UsageTrends|Month"
msgstr "MÃ¥ned"
@@ -36278,22 +36786,22 @@ msgid "UsageTrends|No data available."
msgstr ""
msgid "UsageTrends|Pipelines"
-msgstr ""
+msgstr "Pipelines"
msgid "UsageTrends|Pipelines canceled"
msgstr "Pipelines annulleret"
msgid "UsageTrends|Pipelines failed"
-msgstr ""
+msgstr "Pipelines mislykkedes"
msgid "UsageTrends|Pipelines skipped"
-msgstr ""
+msgstr "Pipelines sprunget over"
msgid "UsageTrends|Pipelines succeeded"
-msgstr ""
+msgstr "Pipelines lykkedes"
msgid "UsageTrends|Pipelines total"
-msgstr ""
+msgstr "Pipelines i alt"
msgid "UsageTrends|Projects"
msgstr "Projekter"
@@ -36317,22 +36825,22 @@ msgid "UsageTrends|There was an error fetching the projects. Please try again."
msgstr "Der opstod en fejl ved hentning af projekterne. Prøv venligst igen."
msgid "UsageTrends|There was an error fetching the skipped pipelines. Please try again."
-msgstr ""
+msgstr "Der opstod en fejl under hentning af de oversprungne pipelines. Prøv venligst igen."
msgid "UsageTrends|There was an error fetching the successful pipelines. Please try again."
-msgstr ""
+msgstr "Der opstod en fejl under hentning af de pipelines som lykkedes. Prøv venligst igen."
msgid "UsageTrends|There was an error fetching the total pipelines. Please try again."
msgstr ""
msgid "UsageTrends|Total groups"
-msgstr ""
+msgstr "Grupper i alt"
msgid "UsageTrends|Total projects"
-msgstr ""
+msgstr "Projekter i alt"
msgid "UsageTrends|Total projects & groups"
-msgstr ""
+msgstr "Projekter og grupper i alt"
msgid "UsageTrends|Users"
msgstr "Brugere"
@@ -36344,13 +36852,13 @@ msgid "Use .gitlab-ci.yml"
msgstr "Brug .gitlab-ci.yml"
msgid "Use GitLab Runner in AWS"
-msgstr ""
+msgstr "Brug GitLab Runner i AWS"
msgid "Use a one-time password authenticator on your mobile device or computer to enable two-factor authentication (2FA)."
msgstr ""
msgid "Use an AWS CloudFormation Template (CFT) to install and configure GitLab Runner in AWS."
-msgstr ""
+msgstr "Brug en AWS CloudFormation Template (CFT) til at installere og konfigurere GitLab Runner i AWS."
msgid "Use cURL"
msgstr "Brug cURL"
@@ -36368,31 +36876,31 @@ msgid "Use hashed storage paths for newly created and renamed repositories. Alwa
msgstr ""
msgid "Use one line per URI"
-msgstr ""
+msgstr "Brug én linje pr. URI"
msgid "Use primary email (%{email})"
-msgstr ""
+msgstr "Brug primære e-mail (%{email})"
msgid "Use shortcuts"
msgstr "Brug genveje"
msgid "Use slash commands."
-msgstr ""
+msgstr "Brug skråstregskommandoer."
msgid "Use template"
msgstr "Brug skabelon"
msgid "Use the link below to confirm your email address (%{email})"
-msgstr ""
+msgstr "Brug linket nedenunder for at bekræfte din e-mailadresse (%{email})"
msgid "Use the link below to confirm your email address."
-msgstr ""
+msgstr "Brug linket nedenunder for at bekræfte din e-mailadresse."
msgid "Use the public cloud instance URL (%{kroki_public_url}) or %{install_link_start}install Kroki%{install_link_end} on your own infrastructure and use your own instance URL."
msgstr ""
msgid "Use the search bar on the top of this page"
-msgstr ""
+msgstr "Brug søgelinjen øverst på siden"
msgid "Use this token to validate received payloads."
msgstr ""
@@ -36401,13 +36909,13 @@ msgid "Use webhook"
msgstr "Brug webhook"
msgid "Use your global notification setting"
-msgstr ""
+msgstr "Brug din globale underretningsindstilling"
msgid "Use your smart card to authenticate with the LDAP server."
msgstr ""
msgid "Used"
-msgstr ""
+msgstr "Brugt"
msgid "Used by members to sign in to your group in GitLab"
msgstr ""
@@ -36428,13 +36936,13 @@ msgid "User"
msgstr "Bruger"
msgid "User %{current_user_username} has started impersonating %{username}"
-msgstr ""
+msgstr "Brugeren %{current_user_username} er begyndt at efterligne %{username}"
msgid "User %{username} was successfully removed."
-msgstr ""
+msgstr "Brugeren %{username} blev fjernet."
msgid "User %{user} was removed from %{group}."
-msgstr ""
+msgstr "Brugeren %{user} blev fjernet fra %{group}."
msgid "User ID"
msgstr "Bruger-id"
@@ -36445,7 +36953,10 @@ msgstr ""
msgid "User Settings"
msgstr "Brugerindstillinger"
-msgid "User and IP Rate Limits"
+msgid "User and IP rate limits"
+msgstr ""
+
+msgid "User does not have a pending request"
msgstr ""
msgid "User identity was successfully created."
@@ -36491,7 +37002,7 @@ msgid "User was successfully removed from group."
msgstr ""
msgid "User was successfully removed from project."
-msgstr ""
+msgstr "Brugeren blev fjernet fra projektet."
msgid "User was successfully updated."
msgstr ""
@@ -36590,7 +37101,7 @@ msgid "UserProfile|Activity"
msgstr "Aktivitet"
msgid "UserProfile|Already reported for abuse"
-msgstr ""
+msgstr "Allerede rapporteret for misbrug"
msgid "UserProfile|Blocked user"
msgstr "Blokeret bruger"
@@ -36599,13 +37110,13 @@ msgid "UserProfile|Bot activity"
msgstr "Botaktivitet"
msgid "UserProfile|Contributed projects"
-msgstr ""
+msgstr "Projekter med bidrag"
msgid "UserProfile|Edit profile"
msgstr "Rediger profil"
msgid "UserProfile|Explore public groups to find projects to contribute to."
-msgstr ""
+msgstr "Udforsk offentlige grupper for at finde projekter der kan bidrages til."
msgid "UserProfile|Followers"
msgstr "Følgere"
@@ -36617,16 +37128,16 @@ msgid "UserProfile|Groups"
msgstr "Grupper"
msgid "UserProfile|Groups are the best way to manage projects and members."
-msgstr ""
+msgstr "Grupper er den bedste måde til at håndtere projekter og medlemmer."
msgid "UserProfile|Join or create a group to start contributing by commenting on issues or submitting merge requests!"
-msgstr ""
+msgstr "Deltag i eller opret en gruppe for at starte med at bidrage ved at kommentere på problemstillinger eller indsende sammenlægningsanmodninger!"
msgid "UserProfile|Most Recent Activity"
msgstr "Nyeste aktivitet"
msgid "UserProfile|No snippets found."
-msgstr "Ingen uddrag fundet."
+msgstr "Ingen udklip fundet."
msgid "UserProfile|Overview"
msgstr "Oversigt"
@@ -36644,10 +37155,10 @@ msgid "UserProfile|Retry"
msgstr "Prøv igen"
msgid "UserProfile|Snippets"
-msgstr "Uddrag"
+msgstr "Snippets"
msgid "UserProfile|Snippets in GitLab can either be private, internal, or public."
-msgstr ""
+msgstr "Udklip i GitLab kan enten være private, interne eller offentlige."
msgid "UserProfile|Star projects to track their progress and show your appreciation."
msgstr ""
@@ -36659,25 +37170,25 @@ msgid "UserProfile|Subscribe"
msgstr "Abonner"
msgid "UserProfile|This user doesn't have any followers."
-msgstr ""
+msgstr "Brugeren har ikke nogen følgere."
msgid "UserProfile|This user doesn't have any personal projects"
-msgstr ""
+msgstr "Brugeren har ikke nogle personlige projekter"
msgid "UserProfile|This user has a private profile"
msgstr "Brugeren har en privat profil"
msgid "UserProfile|This user hasn't contributed to any projects"
-msgstr ""
+msgstr "Brugeren har ikke bidraget til nogle projekter"
msgid "UserProfile|This user hasn't starred any projects"
-msgstr ""
+msgstr "Brugeren har ikke stjernemarkeret nogle projekter"
msgid "UserProfile|This user is blocked"
msgstr "Brugeren er blokeret"
msgid "UserProfile|This user isn't following other users."
-msgstr ""
+msgstr "Brugeren følger ikke andre brugere."
msgid "UserProfile|Unconfirmed user"
msgstr "Ubekræftet bruger"
@@ -36698,16 +37209,16 @@ msgid "UserProfile|You do not have any followers."
msgstr "Du har ingen følgere."
msgid "UserProfile|You haven't created any personal projects."
-msgstr ""
+msgstr "Du har ikke oprettet nogle personlige projekter."
msgid "UserProfile|You haven't created any snippets."
-msgstr "Du har ikke oprettet nogle uddrag."
+msgstr "Du har ikke oprettet nogle udklip."
msgid "UserProfile|Your projects can be available publicly, internally, or privately, at your choice."
-msgstr ""
+msgstr "Dine projekter kan være tilgængelige offentligt, internt eller privat, efter eget ønske."
msgid "UserProfile|at"
-msgstr ""
+msgstr "kl."
msgid "UserProfile|made a private contribution"
msgstr ""
@@ -36716,7 +37227,7 @@ msgid "Username"
msgstr "Brugernavn"
msgid "Username (for password-protected Elasticsearch servers)"
-msgstr ""
+msgstr "Brugernavn (til adgangskodebeskyttede Elasticsearch-servere)"
msgid "Username (optional)"
msgstr "Brugernavn (valgfrit)"
@@ -36740,10 +37251,13 @@ msgid "Users"
msgstr "Brugere"
msgid "Users can launch a development environment from a GitLab browser tab when the %{linkStart}Gitpod%{linkEnd} integration is enabled."
+msgstr "Brugere kan starte et udviklingsmiljø fra et GitLab-browserfaneblad når %{linkStart}Gitpod%{linkEnd}-integreringen er aktiveret."
+
+msgid "Users can reactivate their account by signing in."
msgstr ""
msgid "Users can render diagrams in AsciiDoc, Markdown, reStructuredText, and Textile documents using Kroki."
-msgstr ""
+msgstr "Brugerne kan gengive diagrammer i AsciiDoc-, Markdown-, reStructuredText- og Textile-dokumenter med Kroki."
msgid "Users in License"
msgstr "Brugere i licens"
@@ -36752,11 +37266,14 @@ msgid "Users or groups set as approvers in the project's or merge request's sett
msgstr ""
msgid "Users over License"
-msgstr ""
+msgstr "Brugere over licens"
msgid "Users requesting access to"
msgstr ""
+msgid "Users to exclude from the rate limit"
+msgstr ""
+
msgid "Users were successfully added."
msgstr ""
@@ -36778,6 +37295,9 @@ msgstr ""
msgid "UsersSelect|Unassigned"
msgstr "Utildelt"
+msgid "Uses GitLab as a lightweight alternative to Sentry."
+msgstr ""
+
msgid "Using %{code_start}::%{code_end} denotes a %{link_start}scoped label set%{link_end}"
msgstr ""
@@ -36788,7 +37308,7 @@ msgid "Using the %{codeStart}needs%{codeEnd} keyword makes jobs run before their
msgstr ""
msgid "Validate"
-msgstr ""
+msgstr "Valider"
msgid "Validate your GitLab CI configuration"
msgstr ""
@@ -36803,22 +37323,19 @@ msgid "Value"
msgstr "Værdi"
msgid "Value Stream Analytics"
-msgstr ""
+msgstr "Value Stream-analyse"
msgid "Value Stream Analytics can help you determine your team’s velocity"
msgstr ""
-msgid "Value Stream Analytics gives an overview of how much time it takes to go from idea to production in your project."
-msgstr ""
-
-msgid "Value may contain a variable reference"
+msgid "Value might contain a variable reference"
msgstr ""
msgid "Value stream"
msgstr "Value stream"
msgid "ValueStreamAnalyticsStage|We don't have enough data to show this stage."
-msgstr ""
+msgstr "Vi har ikke nok data til at vise stadiet."
msgid "ValueStreamAnalytics|%{stageCount}+ items"
msgstr "%{stageCount}+ elementer"
@@ -36854,7 +37371,7 @@ msgid "ValueStreamAnalytics|Number of commits pushed to the default branch"
msgstr ""
msgid "ValueStreamAnalytics|Number of new issues created."
-msgstr ""
+msgstr "Antal nye problemstillinger oprettet."
msgid "ValueStreamAnalytics|There was an error while fetching value stream analytics %{requestTypeName} data."
msgstr ""
@@ -36863,7 +37380,7 @@ msgid "ValueStreamAnalytics|Total number of deploys to production."
msgstr ""
msgid "ValueStreamEvent|Items in stage"
-msgstr ""
+msgstr "Elementer i stadie"
msgid "ValueStreamEvent|Stage time (median)"
msgstr ""
@@ -36877,12 +37394,12 @@ msgstr "Stop"
msgid "ValueStream|The Default Value Stream cannot be deleted"
msgstr ""
+msgid "Values that contain the %{codeStart}$%{codeEnd} character can be considered a variable reference and expanded. %{docsLinkStart}Learn more.%{docsLinkEnd}"
+msgstr ""
+
msgid "Variable"
msgstr "Variabel"
-msgid "Variable references indicated by %{codeStart}$%{codeEnd} may be expanded. If this is not what you want, consider %{docsLinkStart}using a workaround to prevent expansion%{docsLinkEnd}."
-msgstr ""
-
msgid "Variable will be masked in job logs."
msgstr ""
@@ -36914,13 +37431,13 @@ msgid "Verification status"
msgstr ""
msgid "Verified"
-msgstr ""
+msgstr "Verificeret"
msgid "Verify SAML Configuration"
msgstr ""
msgid "Verify code"
-msgstr ""
+msgstr "Verificer kode"
msgid "Verify configuration"
msgstr ""
@@ -36941,7 +37458,7 @@ msgid "View alert details at"
msgstr ""
msgid "View alert details."
-msgstr ""
+msgstr "Vis alertbeskeddetaljer."
msgid "View all environments."
msgstr "Vis alle miljøer."
@@ -36973,7 +37490,7 @@ msgid "View documentation"
msgstr "Vis dokumentation"
msgid "View eligible approvers"
-msgstr ""
+msgstr "Vis berettigede godkendere"
msgid "View epics list"
msgstr "Vis epicliste"
@@ -36987,7 +37504,7 @@ msgid "View file @ "
msgstr "Vis fil @ "
msgid "View file @ %{commitSha}"
-msgstr ""
+msgstr "Vis fil @ %{commitSha}"
msgid "View full dashboard"
msgstr ""
@@ -37011,7 +37528,7 @@ msgid "View issues"
msgstr "Vis problemstillinger"
msgid "View it on GitLab"
-msgstr ""
+msgstr "Vis den på GitLab"
msgid "View job"
msgstr "Vis job"
@@ -37035,7 +37552,7 @@ msgid "View merge request"
msgstr "Vis sammenlægningsanmodning"
msgid "View on %{url}"
-msgstr ""
+msgstr "Vis på %{url}"
msgid "View open merge request"
msgstr "Vis åben sammenlægningsanmodning"
@@ -37057,17 +37574,17 @@ msgstr "Vis projektetiketter"
msgid "View public GPG key"
msgid_plural "View public GPG keys"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "Vis offentlig GPG-nøgle"
+msgstr[1] "Vis offentlige GPG-nøgler"
msgid "View replaced file @ "
-msgstr "Vis erstattede fil @ "
+msgstr "Vis erstattet fil @ "
msgid "View setting"
msgstr "Vis indstilling"
msgid "View supported languages and frameworks"
-msgstr ""
+msgstr "Vis understøttede sprog og frameworks"
msgid "View the documentation"
msgstr "Vis dokumentationen"
@@ -37103,16 +37620,16 @@ msgid "Visibility level:"
msgstr "Synlighedsniveau:"
msgid "Visibility settings have been disabled by the administrator."
-msgstr ""
+msgstr "Synlighedsindstillinger er blevet deaktiveret af administratoren."
msgid "Visibility, project features, permissions"
-msgstr ""
+msgstr "Synlighed, projektfunktioner, tilladelser"
msgid "Visibility:"
msgstr "Synlighed:"
msgid "VisibilityLevel|Internal"
-msgstr ""
+msgstr "Internt"
msgid "VisibilityLevel|Private"
msgstr "Privat"
@@ -37160,16 +37677,16 @@ msgid "VulnerabilityManagement, Fetching linked Jira issues"
msgstr ""
msgid "VulnerabilityManagement|%{statusStart}Confirmed%{statusEnd} %{timeago} by %{user}"
-msgstr ""
+msgstr "%{statusStart}Bekræftet%{statusEnd} %{timeago} af %{user}"
msgid "VulnerabilityManagement|%{statusStart}Detected%{statusEnd} %{timeago} in pipeline %{pipelineLink}"
-msgstr ""
+msgstr "%{statusStart}Registreret%{statusEnd} %{timeago} i pipelinen %{pipelineLink}"
msgid "VulnerabilityManagement|%{statusStart}Dismissed%{statusEnd} %{timeago} by %{user}"
-msgstr ""
+msgstr "%{statusStart}Afskediget%{statusEnd} %{timeago} af %{user}"
msgid "VulnerabilityManagement|%{statusStart}Resolved%{statusEnd} %{timeago} by %{user}"
-msgstr ""
+msgstr "%{statusStart}Løst%{statusEnd} %{timeago} af %{user}"
msgid "VulnerabilityManagement|A true-positive and will fix"
msgstr ""
@@ -37190,34 +37707,34 @@ msgid "VulnerabilityManagement|Needs triage"
msgstr ""
msgid "VulnerabilityManagement|Read more about related issues"
-msgstr ""
+msgstr "Læs mere om relaterede problemstillinger"
msgid "VulnerabilityManagement|Related Jira issues"
msgstr ""
msgid "VulnerabilityManagement|Something went wrong while trying to delete the comment. Please try again later."
-msgstr ""
+msgstr "Noget gik galt under forsøg på at slette kommentaren. Prøv venligst igen senere."
msgid "VulnerabilityManagement|Something went wrong while trying to fetch related Jira issues. Please check the %{linkStart}Jira integration settings%{linkEnd} and try again."
-msgstr ""
+msgstr "Noget fik galt under forsøg på at hente relaterede Jira-problemstillinger. Tjek venligst %{linkStart}Jira-integreringsindstillingerne%{linkEnd} og prøv igen."
msgid "VulnerabilityManagement|Something went wrong while trying to refresh the vulnerability. Please try again later."
-msgstr ""
+msgstr "Noget gik galt under forsøg på at opdatere sårbarheden. Prøv venligst igen senere."
msgid "VulnerabilityManagement|Something went wrong while trying to retrieve the vulnerability history. Please try again later."
-msgstr ""
+msgstr "Noget gik galt under forsøg på at hente sårbarhedshistorikken. Prøv venligst igen senere."
msgid "VulnerabilityManagement|Something went wrong while trying to save the comment. Please try again later."
-msgstr ""
+msgstr "Noget gik galt under forsøg på at gemme kommentaren. Prøv venligst igen senere."
msgid "VulnerabilityManagement|Something went wrong while trying to unlink the issue. Please try again later."
-msgstr ""
+msgstr "Noget gik galt under forsøg på at aflinke problemstillingen. Prøv venligst igen senere."
msgid "VulnerabilityManagement|Something went wrong, could not get user."
-msgstr ""
+msgstr "Noget gik galt. Kunne ikke hente bruger."
msgid "VulnerabilityManagement|Something went wrong, could not update vulnerability state."
-msgstr ""
+msgstr "Noget gik galt. Kunne ikke opdatere sårbarhedstilstand."
msgid "VulnerabilityManagement|Verified as fixed or mitigated"
msgstr ""
@@ -37229,7 +37746,7 @@ msgid "VulnerabilityManagement|invalid issue link or ID"
msgstr ""
msgid "VulnerabilityStatusTypes|All statuses"
-msgstr ""
+msgstr "Alle statusser"
msgid "VulnerabilityStatusTypes|Confirmed"
msgstr "Bekræftet"
@@ -37244,7 +37761,7 @@ msgid "VulnerabilityStatusTypes|Resolved"
msgstr ""
msgid "Vulnerability|%{scannerName} (version %{scannerVersion})"
-msgstr ""
+msgstr "%{scannerName} (version %{scannerVersion})"
msgid "Vulnerability|Activity"
msgstr "Aktivitet"
@@ -37280,11 +37797,14 @@ msgid "Vulnerability|Detected"
msgstr ""
msgid "Vulnerability|Download"
-msgstr ""
+msgstr "Download"
msgid "Vulnerability|Evidence"
msgstr ""
+msgid "Vulnerability|False positive detected"
+msgstr ""
+
msgid "Vulnerability|File"
msgstr "Fil"
@@ -37298,7 +37818,7 @@ msgid "Vulnerability|Image"
msgstr "Billede"
msgid "Vulnerability|Links"
-msgstr ""
+msgstr "Links"
msgid "Vulnerability|Method"
msgstr "Metode"
@@ -37313,7 +37833,7 @@ msgid "Vulnerability|Reproduction Assets"
msgstr ""
msgid "Vulnerability|Request"
-msgstr ""
+msgstr "Anmodning"
msgid "Vulnerability|Request/Response"
msgstr ""
@@ -37322,16 +37842,19 @@ msgid "Vulnerability|Scanner Provider"
msgstr ""
msgid "Vulnerability|Severity"
-msgstr ""
+msgstr "Alvorlighed"
msgid "Vulnerability|Status"
msgstr "Status"
+msgid "Vulnerability|The scanner determined this vulnerability to be a false positive. Verify the evaluation before changing its status. %{linkStart}Learn more about false positive detection.%{linkEnd}"
+msgstr ""
+
msgid "Vulnerability|The unmodified response is the original response that had no mutations done to the request"
msgstr ""
msgid "Vulnerability|Tool"
-msgstr ""
+msgstr "Værktøj"
msgid "Vulnerability|Unmodified Response"
msgstr ""
@@ -37343,13 +37866,13 @@ msgid "Wait for the file to load to copy its contents"
msgstr ""
msgid "Waiting for merge (open and assigned)"
-msgstr ""
+msgstr "Venter på sammenlægning (åbne og tildelte)"
msgid "Waiting for performance data"
-msgstr ""
+msgstr "Venter på ydelsesdata"
msgid "Want to see the data? Please ask an administrator for access."
-msgstr ""
+msgstr "Vil du se dataene? Spørg venligst en administrator om adgang."
msgid "Warning"
msgstr "Advarsel"
@@ -37358,7 +37881,7 @@ msgid "Warning:"
msgstr "Advarsel:"
msgid "Warning: Displaying this diagram might cause performance issues on this page."
-msgstr ""
+msgstr "Advarsel: Visning af diagrammet kan forårsage ydelsesproblemer på siden."
msgid "Warning: Synchronizing LDAP removes direct members' access."
msgstr ""
@@ -37385,19 +37908,19 @@ msgid "We couldn't find any %{scope} matching %{term} in group %{group}"
msgstr ""
msgid "We couldn't find any %{scope} matching %{term} in project %{project}"
-msgstr ""
+msgstr "Vi kunne ikke finde nogle %{scope} som matcher %{term} i projektet %{project}"
msgid "We couldn't reach the Prometheus server. Either the server no longer exists or the configuration details need updating."
msgstr ""
msgid "We created a sandbox project that will help you learn the basics of GitLab. You’ll be guided by issues in an issue board. You can go through the issues at your own pace."
-msgstr ""
+msgstr "Vi oprettede et sandkasseprojekt som vil hjælpe dig med at lære det grundlæggende i GitLab. Du vil blive vejledt på en problemstillingstavle. Du kan gennemgå problemstillingerne i dit eget tempo."
msgid "We detected potential spam in the %{humanized_resource_name}. Please solve the reCAPTCHA to proceed."
-msgstr ""
+msgstr "Vi registererede potentiel spam i %{humanized_resource_name}. Løs venligst reCAPTCHA'en for at fortsætte."
msgid "We don't have enough data to show this stage."
-msgstr ""
+msgstr "Vi har ikke nok data til at vise stadiet."
msgid "We have found the following errors:"
msgstr "Vi har fundet følgende fejl:"
@@ -37406,7 +37929,7 @@ msgid "We heard back from your device. You have been authenticated."
msgstr ""
msgid "We love speaking to our users. Got more to say about your GitLab experiences?"
-msgstr ""
+msgstr "Vi elsker at snakke med vores brugere. Har du mere du vil fortælle om din oplevelser med GitLab?"
msgid "We recommend cloud-based mobile authenticator apps such as Authy, Duo Mobile, and LastPass. They can restore access if you lose your hardware device."
msgstr ""
@@ -37421,16 +37944,16 @@ msgid "We recommend that you buy additional Pipeline minutes to resume normal se
msgstr ""
msgid "We sent you an email with reset password instructions"
-msgstr ""
+msgstr "Vi sendte dig en e-mail med instruktioner til at nulstille adgangskoden"
msgid "We tried to automatically renew your subscription for %{strong}%{namespace_name}%{strong_close} on %{expires_on} but something went wrong so your subscription was downgraded to the free plan. Don't worry, your data is safe. We suggest you check your payment method and get in touch with our support team (%{support_link}). They'll gladly help with your subscription renewal."
msgstr ""
msgid "We want to be sure it is you, please confirm you are not a robot."
-msgstr ""
+msgstr "Vi vil være sikker på, at det er dig. Bekræft venligst at du ikke er en robot."
msgid "We will notify %{inviter} that you declined their invitation to join GitLab. You will stop receiving reminders."
-msgstr ""
+msgstr "Vi vil underrette %{inviter} om at du afviste deres invitation til at deltage i GitLab. Du vil ikke længere modtage påmindelser."
msgid "We would like to inform you that your subscription GitLab Enterprise Edition %{plan_name} is nearing its user limit. You have %{active_user_count} active users, which is almost at the user limit of %{maximum_user_count}."
msgstr ""
@@ -37439,7 +37962,7 @@ msgid "We'll continuously validate your pipeline configuration. The validation r
msgstr ""
msgid "We'll use this to help surface the right features and information to you."
-msgstr ""
+msgstr "Vi bruger det til at hjælpe med at fremfinde de rette funktioner og information til dig."
msgid "We've found no vulnerabilities"
msgstr "Vi fandt ingen sårbarheder"
@@ -37448,25 +37971,25 @@ msgid "Web IDE"
msgstr "Web IDE"
msgid "Web Terminal"
-msgstr ""
+msgstr "Webterminal"
msgid "Web terminal"
-msgstr ""
+msgstr "Webterminal"
msgid "WebAuthn Devices (%{length})"
-msgstr ""
+msgstr "WebAuthn-enheder (%{length})"
msgid "WebAuthn only works with HTTPS-enabled websites. Contact your administrator for more details."
-msgstr ""
+msgstr "WebAuthn virker kun med HTTPS-aktiverede websteder. Kontakt din administrator for flere detaljer."
msgid "WebIDE|Fork project"
-msgstr ""
+msgstr "Forgren projekt"
msgid "WebIDE|Go to fork"
msgstr "GÃ¥ til forgrening"
msgid "WebIDE|Merge request"
-msgstr ""
+msgstr "Sammenlægningsanmodning"
msgid "WebIDE|This project does not accept unsigned commits."
msgstr ""
@@ -37475,19 +37998,19 @@ 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 ""
+msgstr "Du kan ikke redigere filer direkte i projektet. Forgren projektet og indsend en sammenlægningsanmodning med dine ændringer."
msgid "WebIDE|You can’t edit files directly in this project. Go to your fork and submit a merge request with your changes."
-msgstr ""
+msgstr "Du kan ikke redigere filer direkte i projektet. Gå til din forgrening og indsend en sammenlægningsanmodning med dine ændringer."
msgid "WebIDE|You need permission to edit files directly in this project."
-msgstr ""
+msgstr "Du skal have tilladelse til at redigere filer direkte i projektet."
msgid "WebexTeamsService|Send notifications about project events to Webex Teams."
-msgstr ""
+msgstr "Send underretninger om projektbegivenheder til Webex Teams."
msgid "WebexTeamsService|Send notifications about project events to a Webex Teams conversation. %{docs_link}"
-msgstr ""
+msgstr "Send underretninger om projektbegivenheder til en Webex Teams-samtale. %{docs_link}"
msgid "WebexTeamsService|Webex Teams"
msgstr ""
@@ -37514,49 +38037,49 @@ msgid "Webhooks|Comments"
msgstr "Kommentarer"
msgid "Webhooks|Confidential comments"
-msgstr ""
+msgstr "Fortrolige kommentarer"
msgid "Webhooks|Confidential issues events"
-msgstr ""
+msgstr "Hændelser for fortrolige problemstillinger"
msgid "Webhooks|Deployment events"
-msgstr ""
+msgstr "Hændelser for udsendelse"
msgid "Webhooks|Enable SSL verification"
msgstr ""
msgid "Webhooks|Feature flag events"
-msgstr ""
+msgstr "Hændelser for funktionsflag"
msgid "Webhooks|Issues events"
-msgstr ""
+msgstr "Hændelser for problemstillinger"
msgid "Webhooks|Job events"
-msgstr ""
+msgstr "Hændelser for job"
msgid "Webhooks|Member events"
-msgstr ""
+msgstr "Hændelser for medlem"
msgid "Webhooks|Merge request events"
-msgstr ""
+msgstr "Hændelser for sammenlægningsanmodning"
msgid "Webhooks|Pipeline events"
-msgstr ""
+msgstr "Hændelser for pipeline"
msgid "Webhooks|Push events"
-msgstr ""
+msgstr "Hændelser for push"
msgid "Webhooks|Releases events"
-msgstr ""
+msgstr "Hændelser for udgivelser"
msgid "Webhooks|SSL verification"
msgstr ""
msgid "Webhooks|Secret token"
-msgstr ""
+msgstr "Hemmelig token"
msgid "Webhooks|Subgroup events"
-msgstr ""
+msgstr "Hændelser for undergruppe"
msgid "Webhooks|Tag push events"
msgstr ""
@@ -37571,55 +38094,55 @@ msgid "Webhooks|URL is triggered by a push to the repository"
msgstr ""
msgid "Webhooks|URL is triggered when a confidential issue is created, updated, closed, or reopened"
-msgstr ""
+msgstr "URL'en udløses når en fortrolig problemstilling oprettes, opdateres, lukkes eller genåbnes"
msgid "Webhooks|URL is triggered when a deployment starts, finishes, fails, or is canceled"
msgstr ""
msgid "Webhooks|URL is triggered when a feature flag is turned on or off"
-msgstr ""
+msgstr "URL'en udløses når et funktionsflag slås til eller fra"
msgid "Webhooks|URL is triggered when a group member is created, updated, or removed"
-msgstr ""
+msgstr "URL'en udløses når et gruppemedlem oprettes, opdateres eller fjernes"
msgid "Webhooks|URL is triggered when a merge request is created, updated, or merged"
-msgstr ""
+msgstr "URL'en udløses når en sammenlægningsanmodning oprettes, opdateres eller sammenlægges"
msgid "Webhooks|URL is triggered when a new tag is pushed to the repository"
msgstr ""
msgid "Webhooks|URL is triggered when a release is created or updated"
-msgstr ""
+msgstr "URL'en udløses når en udgivelse oprettes eller opdateres"
msgid "Webhooks|URL is triggered when a subgroup is created or removed"
-msgstr ""
+msgstr "URL'en udløses når en undergruppe oprettes eller fjernes"
msgid "Webhooks|URL is triggered when a wiki page is created or updated"
-msgstr ""
+msgstr "URL'en udløses når en wikiside oprettes eller opdateres"
msgid "Webhooks|URL is triggered when an issue is created, updated, closed, or reopened"
-msgstr ""
+msgstr "URL'en udløses når en problemstilling oprettes, opdateres, lukkes eller genåbnes"
msgid "Webhooks|URL is triggered when someone adds a comment"
-msgstr ""
+msgstr "URL'en udløses når nogen tilføjer en kommentar"
msgid "Webhooks|URL is triggered when someone adds a comment on a confidential issue"
-msgstr ""
+msgstr "URL'en udløses når nogen tilføjer en kommentar til en fortrolig problemstilling"
msgid "Webhooks|URL is triggered when the job status changes"
-msgstr ""
+msgstr "URL'en udløses når jobstatussen ændres"
msgid "Webhooks|URL is triggered when the pipeline status changes"
-msgstr ""
+msgstr "URL'en udløses når pipelinestatussen ændres"
msgid "Webhooks|URL must be percent-encoded if neccessary."
-msgstr ""
+msgstr "URL'en skal være procentkodet hvis det er nødvendigt."
msgid "Webhooks|Use this token to validate received payloads. It is sent with the request in the X-Gitlab-Token HTTP header."
msgstr ""
msgid "Webhooks|Wiki page events"
-msgstr ""
+msgstr "Hændelser for wikiside"
msgid "Website:"
msgstr "Websted:"
@@ -37640,7 +38163,7 @@ msgid "Weight %{weight}"
msgstr "Vægt %{weight}"
msgid "Welcome back! Your account had been deactivated due to inactivity but is now reactivated."
-msgstr ""
+msgstr "Velkommen tilbage! Din konto var blevet deaktiveret pga. inaktivitet men er nu genaktiveret."
msgid "Welcome to GitLab"
msgstr "Velkommen til GitLab"
@@ -37649,10 +38172,7 @@ msgid "Welcome to GitLab, %{first_name}!"
msgstr "Velkommen til GitLab, %{first_name}!"
msgid "Welcome to GitLab,%{br_tag}%{name}!"
-msgstr ""
-
-msgid "Welcome to the guided GitLab tour"
-msgstr ""
+msgstr "Velkommen til GitLab,%{br_tag}%{name}!"
msgid "Welcome, %{name}!"
msgstr "Velkommen, %{name}!"
@@ -37672,14 +38192,11 @@ msgstr ""
msgid "What are you searching for?"
msgstr "Hvad søger du?"
-msgid "What describes you best?"
-msgstr "Hvad beskriver dig bedst?"
-
msgid "What does this command do?"
msgstr "Hvad gør kommandoen?"
msgid "What is Auto DevOps?"
-msgstr ""
+msgstr "Hvad er Auto DevOps?"
msgid "What is Markdown?"
msgstr "Hvad er Markdown?"
@@ -37688,23 +38205,23 @@ msgid "What is repository mirroring?"
msgstr ""
msgid "What is squashing?"
-msgstr ""
+msgstr "Hvad er squashing?"
msgid "What is time tracking?"
-msgstr ""
+msgstr "Hvad er tidssporing?"
msgid "What is your job title? (optional)"
msgstr "Hvad er din jobtitel? (valgfrit)"
-msgid "What will you use this group for?"
+msgid "What templates can I create?"
msgstr ""
+msgid "What will you use this group for?"
+msgstr "Hvad vil du bruge gruppen til?"
+
msgid "What's new"
msgstr "Nyheder"
-msgid "What’s your experience level?"
-msgstr "Hvad er dit erfaringsniveau?"
-
msgid "When a deployment job is successful, skip older deployment jobs that are still pending."
msgstr ""
@@ -37712,6 +38229,9 @@ msgid "When a runner is locked, it cannot be assigned to other projects"
msgstr ""
msgid "When an event in GitLab triggers a webhook, you can use the request details to figure out if something went wrong."
+msgstr "Når en begivenhed i GitLab udløser en webhook, så kan du bruge anmodningsdetaljerne til at finde ud af om noget gik galt."
+
+msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
msgstr ""
msgid "When inactive, an external authentication provider must be used."
@@ -37725,18 +38245,21 @@ msgstr ""
msgid "When this merge request is accepted"
msgid_plural "When these merge requests are accepted"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "Når sammenlægningsanmodningen accepteres"
+msgstr[1] "Når sammenlægningsanmodningerne accepteres"
msgid "When using the %{code_open}http://%{code_close} or %{code_open}https://%{code_close} protocols, please provide the exact URL to the repository. HTTP redirects will not be followed."
-msgstr ""
+msgstr "Når protokollerne %{code_open}http://%{code_close} eller %{code_open}https://%{code_close} bruges, så angiv venligst den præcise URL til depotet. HTTP-omdirigeringer følges ikke."
msgid "When using the %{code_open}http://%{code_close} or %{code_open}https://%{code_close} protocols, provide the exact URL to the repository. HTTP redirects will not be followed."
-msgstr ""
+msgstr "Når protokollerne %{code_open}http://%{code_close} eller %{code_open}https://%{code_close} bruges, så angiv den præcise URL til depotet. HTTP-omdirigeringer følges ikke."
msgid "When:"
msgstr "NÃ¥r:"
+msgid "Which API requests are affected?"
+msgstr ""
+
msgid "While it's rare to have no vulnerabilities, it can happen. In any event, we ask that you please double check your settings to make sure you've set up your dashboard correctly."
msgstr ""
@@ -37750,16 +38273,16 @@ msgid "Who will be able to see this group?"
msgstr "Hvem vil være i stand til at se gruppen?"
msgid "Who will be using GitLab?"
-msgstr ""
+msgstr "Hvem vil komme til at bruge GitLab?"
msgid "Who will be using this GitLab subscription?"
-msgstr ""
+msgstr "Hvem vil komme til at bruge GitLab-abonnementet?"
msgid "Who will be using this GitLab trial?"
-msgstr ""
+msgstr "Hvem vil komme til at bruge GitLab-prøveperioden?"
msgid "Who will be using this group?"
-msgstr ""
+msgstr "Hvem vil komme til at bruge gruppen?"
msgid "Why are you signing up? (Optional)"
msgstr "Hvorfor tilmelder du dig? (valgfrit)"
@@ -37768,13 +38291,13 @@ msgid "Wiki"
msgstr "Wiki"
msgid "Wiki page was successfully created."
-msgstr ""
+msgstr "Wikisiden blev oprettet."
msgid "Wiki page was successfully deleted."
-msgstr ""
+msgstr "Wikisiden blev slettet."
msgid "Wiki page was successfully updated."
-msgstr ""
+msgstr "Wikisiden blev opdateret."
msgid "WikiClone|Clone your wiki"
msgstr "Klon din wiki"
@@ -37801,10 +38324,10 @@ msgid "WikiEmptyIssueMessage|You must be a project member in order to add wiki p
msgstr ""
msgid "WikiEmptyIssueMessage|issue tracker"
-msgstr ""
+msgstr "problemstillingsporing"
msgid "WikiEmpty| Have a Confluence wiki already? Use that instead."
-msgstr ""
+msgstr " Har du allerede en Confluence-wiki? Brug den i stedet."
msgid "WikiEmpty|A wiki is where you can store all the details about your group. This can include why you've created it, its principles, how to use it, and so on."
msgstr ""
@@ -37840,7 +38363,7 @@ msgid "WikiEmpty|This project has no wiki pages"
msgstr "Projektet har ingen wikisider"
msgid "WikiEmpty|You must be a group member in order to add wiki pages."
-msgstr ""
+msgstr "Du skal være et gruppemedlem for at kunne tilføje wikisider."
msgid "WikiEmpty|You must be a project member in order to add wiki pages."
msgstr ""
@@ -37867,13 +38390,13 @@ msgid "WikiPageConfirmDelete|Delete page"
msgstr "Slet side"
msgid "WikiPageConfirmDelete|Delete page %{pageTitle}?"
-msgstr ""
+msgstr "Slet siden %{pageTitle}?"
msgid "WikiPageConflictMessage|Someone edited the page the same time you did. Please check out %{wikiLinkStart}the page%{wikiLinkEnd} and make sure your changes will not unintentionally remove theirs."
msgstr ""
msgid "WikiPage|An error occured while trying to render the content editor. Please try again later."
-msgstr ""
+msgstr "Der opstod en fejl under forsøg på at gengive indholdseditoren. Prøv venligst igen senere."
msgid "WikiPage|Are you sure you want to switch back to the classic editor?"
msgstr "Er du sikker på, at du vil skifte tilbage til den klassiske editor?"
@@ -37921,13 +38444,13 @@ msgid "WikiPage|Switch to classic editor"
msgstr "Skift til klassisk editor"
msgid "WikiPage|Switching to the classic editor will discard any changes you've made in the new editor."
-msgstr ""
+msgstr "Hvis der skiftes til den klassiske editor vil det forkaste ændringer du har foretaget i den nye editor."
msgid "WikiPage|This editor is in beta and may not display the page's contents properly. Switching back to the classic editor will discard changes you've made in the new editor."
msgstr ""
msgid "WikiPage|Tip: You can move this page by adding the path to the beginning of the title."
-msgstr ""
+msgstr "Tip: du kan flytte siden ved at tilføje stien til begyndelsen af titlen."
msgid "WikiPage|Tip: You can specify the full path for the new file. We will automatically create any missing directories."
msgstr ""
@@ -37951,7 +38474,7 @@ msgid "WikiPage|Use the new editor"
msgstr "Brug den nye editor"
msgid "WikiPage|Write your content or drag files here…"
-msgstr ""
+msgstr "Skriv dit indhold eller træk filer hertil …"
msgid "Wikis"
msgstr "Wikier"
@@ -37978,7 +38501,7 @@ msgid "Wiki|Pages"
msgstr "Sider"
msgid "Wiki|The sidebar failed to load. You can reload the page to try again."
-msgstr ""
+msgstr "Sidebjælken kunne ikke indlæses. Du kan genindlæse siden for at prøve igen."
msgid "Wiki|Title"
msgstr "Titel"
@@ -37996,7 +38519,7 @@ msgid "Will be mapped to"
msgstr ""
msgid "Will deploy to"
-msgstr ""
+msgstr "Vil udsende til"
msgid "With requirements, you can set criteria to check your products against."
msgstr ""
@@ -38011,11 +38534,14 @@ msgid "Won't fix / Accept risk"
msgstr ""
msgid "Work in progress (open and unassigned)"
-msgstr ""
+msgstr "Igangværende arbejde (åbne og tildelte)"
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|Work Items"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr "Vil du oprette en ny gren?"
@@ -38026,22 +38552,22 @@ msgid "Write"
msgstr "Skriv"
msgid "Write a comment or drag your files here…"
-msgstr ""
+msgstr "Skriv en kommentar eller træk dine filer hertil …"
msgid "Write a comment…"
msgstr "Skriv en kommentar …"
msgid "Write a description or drag your files here…"
-msgstr ""
+msgstr "Skriv en beskrivelse eller træk dine filer hertil …"
msgid "Write milestone description..."
msgstr ""
msgid "Write to \"authorized_keys\" file"
-msgstr ""
+msgstr "Skriv til \"authorized_keys\"-fil"
msgid "Write your release notes or drag your files here…"
-msgstr ""
+msgstr "Skriv dine udgivelsesnoter eller træk dine filer hertil …"
msgid "Wrong extern UID provided. Make sure Auth0 is configured correctly."
msgstr ""
@@ -38059,7 +38585,7 @@ msgid "Yes or No"
msgstr "Ja eller nej"
msgid "Yes, add it"
-msgstr ""
+msgstr "Ja, tilføj den"
msgid "Yes, close issue"
msgstr "Ja, luk problemstilling"
@@ -38071,37 +38597,40 @@ msgid "Yesterday"
msgstr "I går"
msgid "You"
-msgstr "Dig"
+msgstr "Du"
msgid "You already have pending todo for this alert"
msgstr ""
msgid "You are about to add %{usersTag} people to the discussion. They will all receive a notification."
-msgstr ""
+msgstr "Du er ved at tilføje %{usersTag} personer til debatten. De vil alle modtage en underretning."
msgid "You are about to delete %{domain} from your instance. This domain will no longer be available to any Knative application."
-msgstr ""
+msgstr "Du er ved at slette %{domain} fra din instans. Domænet vil ikke længere være tilgængeligt for nogle Knative-programmer."
msgid "You are about to permanently delete this project"
-msgstr ""
+msgstr "Du er ved at slette projektet permanent"
msgid "You are about to transfer the control of your account to %{group_name} group. This action is NOT reversible, you won't be able to access any of your groups and projects outside of %{group_name} once this transfer is complete."
-msgstr ""
+msgstr "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."
msgid "You are already a member of this %{member_source}."
+msgstr "Du er allerede et medlem af %{member_source}."
+
+msgid "You are already impersonating another user"
msgstr ""
msgid "You are an admin, which means granting access to %{client_name} will allow them to interact with GitLab as an admin as well. Proceed with caution."
msgstr ""
msgid "You are attempting to delete a file that has been previously updated."
-msgstr ""
+msgstr "Du er ved at slette en fil som tidligere er blevet opdateret."
msgid "You are attempting to update a file that has changed since you started editing it."
msgstr ""
msgid "You are connected to the Prometheus server, but there is currently no data to display."
-msgstr ""
+msgstr "Du er forbundet til Prometheus-serveren men der er i øjeblikket ingen data at vise."
msgid "You are going to delete %{project_full_name}. Deleted projects CANNOT be restored! Are you ABSOLUTELY sure?"
msgstr ""
@@ -38110,7 +38639,7 @@ msgid "You are going to remove %{group_name}. This will also delete all of its s
msgstr "Du er ved at fjerne %{group_name}. Det sletter også alle dens undergrupper og projekter. Fjernede grupper kan IKKE gendannes! Er du HELT SIKKER?"
msgid "You are going to remove the fork relationship from %{project_full_name}. Are you ABSOLUTELY sure?"
-msgstr ""
+msgstr "Du er ved at fjerne forgreningsrelationen fra %{project_full_name}. Er du HELT sikker?"
msgid "You are going to transfer %{project_full_name} to another namespace. Are you ABSOLUTELY sure?"
msgstr "Du er ved at overføre %{project_full_name} til et andet navnerum. Er du HELT SIKKER?"
@@ -38137,7 +38666,7 @@ msgid "You are not allowed to reject a user"
msgstr "Du har ikke tilladelse til at afvise en bruger"
msgid "You are not allowed to unlink your primary login account"
-msgstr ""
+msgstr "Du har ikke tilladelse til at aflinke din primære indlogningskonto"
msgid "You are not authorized to delete this site profile"
msgstr ""
@@ -38149,10 +38678,10 @@ msgid "You are not authorized to update this scanner profile"
msgstr ""
msgid "You are now impersonating %{username}"
-msgstr ""
+msgstr "Du efterligner nu %{username}"
msgid "You are on a read-only GitLab instance."
-msgstr ""
+msgstr "Du er på en skrivebeskyttet GitLab-instans."
msgid "You are receiving this message because you are a GitLab administrator for %{url}."
msgstr ""
@@ -38182,43 +38711,46 @@ msgid "You can also press ⌘-Enter"
msgstr "Du kan også trykke på ⌘-Enter"
msgid "You can also star a label to make it a priority label."
-msgstr ""
+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 ""
+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 ""
+msgstr "Du kan også uploade eksisterende filer fra din computer ved at bruge instruktionerne nedenunder."
msgid "You can also use project access tokens with Git to authenticate over HTTP(S). %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "You can always change your URL later"
+msgstr ""
+
msgid "You can always edit this later"
msgstr "Du kan altid ændre det senere"
msgid "You can create a new %{link}."
-msgstr ""
+msgstr "Du kan oprette en ny %{link}."
msgid "You can create a new %{name} inside this project by sending an email to the following email address:"
-msgstr ""
+msgstr "Du kan oprette en ny %{name} i projektet ved at sende en e-mail til følgende e-mailadresse:"
msgid "You can create a new Personal Access Token by visiting %{link}"
-msgstr ""
+msgstr "Du kan oprette en ny personlig adgangstoken ved at besøge %{link}"
msgid "You can create a new SSH key by visiting %{link}"
msgstr "Du kan oprette en ny SSH-nøgle ved at besøge %{link}"
msgid "You can create a new one or check them in your %{pat_link_start}personal access tokens%{pat_link_end} settings."
-msgstr ""
+msgstr "Du kan oprette en ny en eller tjekke dem i dine indstillinger for %{pat_link_start}personlige adgangstokens%{pat_link_end}."
msgid "You can create a new one or check them in your %{ssh_key_link_start}SSH keys%{ssh_key_link_end} settings."
-msgstr ""
+msgstr "Du kan oprette en ny en eller tjekke dem i dine indstillinger for %{ssh_key_link_start}SSH-nøgler%{ssh_key_link_end}."
msgid "You can create a new one or check them in your SSH keys settings %{ssh_key_link}."
-msgstr ""
+msgstr "Du kan oprette en ny en eller tjekke dem i dine indstillinger for SSH-nøgler %{ssh_key_link}."
msgid "You can create a new one or check them in your personal access tokens settings %{pat_link}."
-msgstr ""
+msgstr "Du kan oprette en ny en eller tjekke dem i dine indstillinger for personlige adgangstokens %{pat_link}."
msgid "You can create new ones at your %{pat_link_start}Personal Access Tokens%{pat_link_end} settings"
msgstr ""
@@ -38227,7 +38759,7 @@ msgid "You can create new ones at your Personal Access Tokens settings %{pat_lin
msgstr ""
msgid "You can easily contribute to them by requesting to join these groups."
-msgstr ""
+msgstr "Du kan let bidrage til dem ved at anmode om at deltage i grupperne."
msgid "You can enable Registration Features because Service Ping is enabled. To continue using Registration Features in the future, you will also need to register with GitLab via a new cloud licensing service."
msgstr ""
@@ -38239,7 +38771,7 @@ msgid "You can filter by 'days to merge' by clicking on the columns in the chart
msgstr ""
msgid "You can find more information about GitLab subscriptions in %{subscriptions_doc_link}."
-msgstr ""
+msgstr "Du kan finde mere information om GitLab-abonnementer i %{subscriptions_doc_link}."
msgid "You can get started by cloning the repository or start adding files to it with one of the following options."
msgstr ""
@@ -38248,19 +38780,19 @@ msgid "You can group test cases using labels. To learn about the future directio
msgstr ""
msgid "You can invite a new member to %{project_name} or invite another group."
-msgstr ""
+msgstr "Du kan invitere et nyt medlem til %{project_name} eller invitere en anden gruppe."
msgid "You can invite a new member to %{project_name}."
-msgstr ""
+msgstr "Du kan invitere et nyt medlem til %{project_name}."
msgid "You can invite a new member to %{strong_start}%{group_name}%{strong_end}."
-msgstr ""
+msgstr "Du kan invitere et nyt medlem til %{strong_start}%{group_name}%{strong_end}."
msgid "You can invite another group to %{project_name}."
-msgstr ""
+msgstr "Du kan invitere en anden gruppe til %{project_name}."
msgid "You can move around the graph by using the arrow keys."
-msgstr ""
+msgstr "Du kan flytte grafen med piletasterne."
msgid "You can notify the app / group or a project by sending them an email notification"
msgstr ""
@@ -38269,7 +38801,7 @@ msgid "You can now close this window."
msgstr "Du kan nu lukke vinduet."
msgid "You can now export your security dashboard to a CSV report."
-msgstr ""
+msgstr "Du kan nu eksportere dit sikkerhedsbetjeningspanel til en CSV-rapport."
msgid "You can now submit a merge request to get this change into the original branch."
msgstr ""
@@ -38278,7 +38810,7 @@ msgid "You can now submit a merge request to get this change into the original p
msgstr ""
msgid "You can only %{action} files when you are on a branch"
-msgstr ""
+msgstr "Du kan kun %{action} filer når du er på en gren"
msgid "You can only edit files when you are on a branch"
msgstr ""
@@ -38290,7 +38822,7 @@ msgid "You can only merge once this merge request is approved."
msgstr ""
msgid "You can only transfer the project to namespaces you manage."
-msgstr ""
+msgstr "Du kan kun overføre projektet til navnerum du håndterer."
msgid "You can only upload one design when dropping onto an existing design."
msgstr ""
@@ -38323,38 +38855,38 @@ msgid "You cannot %{action} %{state} users."
msgstr ""
msgid "You cannot access the raw file. Please wait a minute."
-msgstr ""
+msgstr "Du kan ikke tilgå den rå fil. Vent venligst et øjeblik."
msgid "You cannot impersonate a blocked user"
-msgstr ""
+msgstr "Du kan ikke efterligne en blokeret bruger"
msgid "You cannot impersonate a user who cannot log in"
-msgstr ""
+msgstr "Du kan ikke efterligne en bruger som ikke kan logge ind"
msgid "You cannot impersonate an internal user"
-msgstr ""
+msgstr "Du kan ikke efterligne en intern bruger"
msgid "You cannot play this scheduled pipeline at the moment. Please wait a minute."
msgstr ""
msgid "You cannot rename an environment after it's created."
-msgstr ""
+msgstr "Du kan ikke omdøbe et miljø efter det er blevet oprettet."
msgid "You cannot write to a read-only secondary GitLab Geo instance. Please use %{link_to_primary_node} instead."
msgstr ""
msgid "You cannot write to this read-only GitLab instance."
-msgstr ""
+msgstr "Du kan ikke skrive til denne skrivebeskyttede GitLab-instans."
msgid "You can’t %{tag_start}edit%{tag_end} files directly in this project. Fork this project and submit a merge request with your changes."
+msgstr "Du kan ikke %{tag_start}redigere%{tag_end} filer direkte i projektet. Forgren projektet og indsend en sammenlægningsanmodning med dine ændringer."
+
+msgid "You can’t edit files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
msgid "You could not create a new trigger."
msgstr "Du kunne ikke oprette en ny udløser."
-msgid "You didn't renew your subscription for %{strong}%{namespace_name}%{strong_close} so it was downgraded to the free plan."
-msgstr ""
-
msgid "You do not have any subscriptions yet"
msgstr ""
@@ -38362,28 +38894,28 @@ msgid "You do not have permission to access dora metrics."
msgstr ""
msgid "You do not have permission to leave this %{namespaceType}."
-msgstr ""
+msgstr "Du har ikke tilladelse til at forlade denne %{namespaceType}."
msgid "You do not have permission to run the Web Terminal. Please contact a project administrator."
-msgstr ""
+msgstr "Du har ikke tilladelse til at køre webterminalen. Kontakt venligst en projektadministrator."
msgid "You do not have permission to update the environment."
-msgstr ""
+msgstr "Du har ikke tilladelse til at opdatere miljøet."
msgid "You do not have permissions to run the import."
-msgstr ""
+msgstr "Du har ikke tilladelser til at køre importen."
msgid "You don't have any U2F devices registered yet."
-msgstr ""
+msgstr "Du har endnu ikke registreret nogle U2F-enheder."
msgid "You don't have any WebAuthn devices registered yet."
-msgstr ""
+msgstr "Du har endnu ikke tilmeldt nogle WebAuthn-enheder."
msgid "You don't have any active chat names."
-msgstr ""
+msgstr "Du har ikke nogle aktive chatnavne."
msgid "You don't have any applications"
-msgstr ""
+msgstr "Du har ikke nogle programmer"
msgid "You don't have any authorized applications"
msgstr ""
@@ -38401,10 +38933,10 @@ msgid "You don't have any recent searches"
msgstr "Du har ingen seneste søgninger"
msgid "You don't have any webhooks deliveries"
-msgstr ""
+msgstr "Du har ikke nogle webhooksleveringer"
msgid "You don't have sufficient permission to perform this action."
-msgstr ""
+msgstr "Du har ikke tilstrækkelig tilladelse til at udføre handlingen."
msgid "You don't have write access to the source branch."
msgstr ""
@@ -38431,43 +38963,43 @@ msgid "You have been invited by %{link_to_inviter} to join %{source_name} %{stro
msgstr "Du er blevet inviteret af %{link_to_inviter} til at deltage i %{source_name} %{strong_open}%{link_to_source}%{strong_close} som %{role}"
msgid "You have been redirected to the only result; see the %{a_start}search results%{a_end} instead."
-msgstr ""
+msgstr "Du er blevet omdirigeret til det eneste resultat. Se i stedet %{a_start}søgeresultaterne%{a_end}."
msgid "You have been unsubscribed from this thread."
-msgstr ""
+msgstr "Du har fået fjernet din abonnering fra tråden."
msgid "You have declined the invitation to join %{title} %{name}."
-msgstr ""
+msgstr "Du har afvist invitationen til at deltage i %{title} %{name}."
msgid "You have imported from this project %{numberOfPreviousImports} times before. Each new import will create duplicate issues."
msgstr ""
msgid "You have insufficient permissions to configure escalation policies for this project"
-msgstr ""
+msgstr "Du har ikke tilstrækkelige tilladelser til at konfigurere eskaleringsregelsæt for projektet"
msgid "You have insufficient permissions to create a Todo for this alert"
msgstr ""
msgid "You have insufficient permissions to create an HTTP integration for this project"
-msgstr ""
+msgstr "Du har ikke tilstrækkelige tilladelser til at oprette en HTTP-integrering for projektet"
msgid "You have insufficient permissions to create an on-call schedule for this project"
-msgstr ""
+msgstr "Du har ikke tilstrækkelige tilladelser til at oprette en vagtplan for projektet"
msgid "You have insufficient permissions to remove an on-call rotation from this project"
-msgstr ""
+msgstr "Du har ikke tilstrækkelige tilladelser til at fjerne en vagtplansrotation fra projektet"
msgid "You have insufficient permissions to remove an on-call schedule from this project"
-msgstr ""
+msgstr "Du har ikke tilstrækkelige tilladelser til at fjerne en vagtplan fra projektet"
msgid "You have insufficient permissions to remove this HTTP integration"
-msgstr ""
+msgstr "Du har ikke tilstrækkelige tilladelser til at fjerne HTTP-integreringen"
msgid "You have insufficient permissions to update an on-call schedule for this project"
-msgstr ""
+msgstr "Du har ikke tilstrækkelige tilladelser til at opdatere en vagtplan for projektet"
msgid "You have insufficient permissions to update this HTTP integration"
-msgstr ""
+msgstr "Du har ikke tilstrækkelige tilladelser til at opdatere HTTP-integreringen"
msgid "You have insufficient permissions to view shifts for this rotation"
msgstr ""
@@ -38482,7 +39014,7 @@ msgid "You have reached your project limit"
msgstr "Du har nået din projektgrænse"
msgid "You have set up 2FA for your account! If you lose access to your 2FA device, you can use your recovery codes to access your account. Alternatively, if you upload an SSH key, you can %{anchorOpen}use that key to generate additional recovery codes%{anchorClose}."
-msgstr ""
+msgstr "Du har opsat 2TG til din konto! Hvis du mister adgang til din 2TG-enhed, så kan du bruge dine gendannelseskoder til at få adgang til din konto. Ellers kan du, hvis du uploader en SSH-nøgle, %{anchorOpen}bruge nøglen til at generere yderligere gendannelseskoder%{anchorClose}."
msgid "You have successfully purchased %{product}. You'll receive a receipt by email."
msgstr ""
@@ -38491,7 +39023,7 @@ msgid "You have successfully purchased a %{plan} plan subscription for %{seats}.
msgstr ""
msgid "You left the \"%{membershipable_human_name}\" %{source_type}."
-msgstr ""
+msgstr "Du forlod \"%{membershipable_human_name}\" %{source_type}."
msgid "You may close the milestone now."
msgstr "Du kan nu lukke milepælen."
@@ -38509,22 +39041,28 @@ msgid "You must have maintainer access to force delete a lock"
msgstr ""
msgid "You must have permission to create a project in a group before forking."
-msgstr ""
+msgstr "Du skal have tilladelse til at oprette et projekt i en gruppe inden forgrening."
msgid "You must have permission to create a project in a namespace before forking."
-msgstr ""
+msgstr "Du skal have tilladelse til at oprette et projekt i et navnerum inden forgrening."
msgid "You must provide a valid current password"
-msgstr ""
+msgstr "Du skal angive en gyldig nuværende adgangskode"
msgid "You must provide your current password in order to change it."
+msgstr "Du skal angive din nuværende adgangskode for at ændre den."
+
+msgid "You must sign in to search for specific projects."
msgstr ""
-msgid "You must solve the CAPTCHA in order to submit"
+msgid "You must sign in to search for specific terms."
msgstr ""
+msgid "You must solve the CAPTCHA in order to submit"
+msgstr "Du skal løse CAPTCHA'en for at indsende"
+
msgid "You must upload a file with the same file name when dropping onto an existing design."
-msgstr ""
+msgstr "Du skal uploade en fil med det samme filnavn når der slippes på et eksisterende design."
msgid "You need a different license to enable FileLocks feature"
msgstr ""
@@ -38533,7 +39071,7 @@ msgid "You need git-lfs version %{min_git_lfs_version} (or greater) to continue.
msgstr ""
msgid "You need permission."
-msgstr ""
+msgstr "Du skal have tilladelse."
msgid "You need to register a two-factor authentication app before you can set up a device."
msgstr ""
@@ -38545,10 +39083,13 @@ msgid "You need to specify both an Access Token and a Host URL."
msgstr ""
msgid "You need to upload a GitLab project export archive (ending in .gz)."
+msgstr "Du skal uploade et GitLab-projekteksportarkiv (slutter med .gz)."
+
+msgid "You need to verify your primary email first before enabling Two-Factor Authentication."
msgstr ""
msgid "You successfully declined the invitation"
-msgstr ""
+msgstr "Du har afvist invitationen"
msgid "You tried to fork %{link_to_the_project} but it failed for the following reason:"
msgstr ""
@@ -38572,22 +39113,22 @@ msgid "You will need to update your local repositories to point to the new locat
msgstr ""
msgid "You will not get any notifications via email"
-msgstr ""
+msgstr "Du får ingen underretninger via e-mail"
msgid "You will only receive notifications for the events you choose"
-msgstr ""
+msgstr "Du vil kun modtage underretninger for begivenheder du vælger"
msgid "You will only receive notifications for threads you have participated in"
-msgstr ""
+msgstr "Du vil kun modtage underretninger for tråde du har deltaget i"
msgid "You will receive notifications for any activity"
-msgstr ""
+msgstr "Du vil modtage underretninger for al aktivitet"
msgid "You will receive notifications only for comments in which you were @mentioned"
-msgstr ""
+msgstr "Du vil kun modtage underretninger for kommentarer hvor du blev @nævnt"
msgid "You won't be able to create new projects because you have reached your project limit."
-msgstr ""
+msgstr "Du vil ikke være i stand til at oprette nye projekter fordi du har nået din projektgrænse."
msgid "You won't be able to pull or push repositories via %{protocol} until you %{set_password_link} on your account"
msgstr "Du vil ikke være i stand til at bruge pull eller push på depoter via %{protocol} før du %{set_password_link} på din konto"
@@ -38599,7 +39140,7 @@ msgid "You'll be signed out from your current account automatically."
msgstr ""
msgid "You'll need to use different branch names to get a valid comparison."
-msgstr ""
+msgstr "Du skal bruge forskellige grennavne for at få en gyldig sammenligning."
msgid "You're about to reduce the visibility of the project %{strong_start}%{project_name}%{strong_end} in %{strong_start}%{group_name}%{strong_end}."
msgstr "Du er ved at reducere synligheden af projektet %{strong_start}%{project_name}%{strong_end} i %{strong_start}%{group_name}%{strong_end}."
@@ -38614,13 +39155,13 @@ msgid "You're at the last commit"
msgstr "Du er ved den sidste commit"
msgid "You're not allowed to %{tag_start}edit%{tag_end} files in this project directly. Please fork this project, make your changes there, and submit a merge request."
-msgstr ""
+msgstr "Du har ikke tilladelse til at %{tag_start}redigere%{tag_end} filer direkte i projektet. Forgren venligst projektet, lav dine ændringer og indsend en sammenlægningsanmodning."
msgid "You're not allowed to make changes to this project directly. A fork of this project has been created that you can make changes in, so you can submit a merge request."
-msgstr ""
+msgstr "Du har ikke tilladelse til at foretage ændringer direkte i projektet. En forgrening af projektet er blevet oprettet som du kan lave ændringer i, så du kan indsende en sammenlægningsanmodning."
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 "Du har ikke tilladelse til at foretage ændringer direkte i projektet. En forgrening af projektet oprettes som du kan lave ændringer i, så du kan indsende en sammenlægningsanmodning."
msgid "You're receiving this email because of your account on %{host}."
msgstr "Du modtager e-mailen pga. din konto på %{host}."
@@ -38653,12 +39194,12 @@ msgid "Your %{group} membership will now expire in %{days}."
msgstr ""
msgid "Your %{host} account was signed in to from a new location"
-msgstr ""
+msgstr "Der blev logget ind på din %{host}-konto fra en ny placering"
-msgid "Your %{strong}%{plan_name}%{strong_close} subscription for %{strong}%{namespace_name}%{strong_close} will expire on %{strong}%{expires_on}%{strong_close}."
+msgid "Your %{strong}%{plan_name}%{strong_close} subscription expires on %{strong}%{expires_on}%{strong_close}. After that date, you cannot create issues or merge requests, or use many other features."
msgstr ""
-msgid "Your %{strong}%{plan_name}%{strong_close} subscription will expire on %{strong}%{expires_on}%{strong_close}. After that, you will not be able to create issues or merge requests as well as many other features."
+msgid "Your %{strong}%{plan_name}%{strong_close} subscription for %{strong}%{namespace_name}%{strong_close} will expire on %{strong}%{expires_on}%{strong_close}."
msgstr ""
msgid "Your CI/CD configuration syntax is invalid. View Lint tab for more details."
@@ -38671,7 +39212,7 @@ msgid "Your CSV export of %{count} from project %{project_link} has been added t
msgstr ""
msgid "Your CSV export of %{written_count} from project %{project_name} (%{project_url}) has been added to this email as an attachment."
-msgstr ""
+msgstr "Din CSV-eksport af %{written_count} fra projektet %{project_name} (%{project_url}) er blevet tilføjet til e-mailen som en vedhæftning."
msgid "Your CSV import for project"
msgstr ""
@@ -38682,7 +39223,7 @@ msgstr ""
msgid "Your GPG keys (%{count})"
msgstr "Dine GPG-nøgler (%{count})"
-msgid "Your GitLab account has been locked due to an excessive amount of unsuccessful sign in attempts. Your account will automatically unlock in %{duration} or you may click the link below to unlock now."
+msgid "Your GitLab account has been locked due to an excessive number of unsuccessful sign in attempts. You can wait for your account to automatically unlock in %{duration} or you can click the link below to unlock now."
msgstr ""
msgid "Your GitLab account request has been approved!"
@@ -38695,7 +39236,7 @@ msgid "Your Groups"
msgstr "Dine grupper"
msgid "Your Personal Access Token was revoked"
-msgstr ""
+msgstr "Din personlige adgangstoken blev tilbagekaldt"
msgid "Your Projects (default)"
msgstr "Dine projekter (standard)"
@@ -38716,19 +39257,19 @@ msgid "Your SSH keys (%{count})"
msgstr "Dine SSH-nøgler (%{count})"
msgid "Your To-Do List"
-msgstr "Din To-Do-liste"
+msgstr "Din gøremålsliste"
msgid "Your U2F device did not send a valid JSON response."
-msgstr ""
+msgstr "Din U2F-enhed sendte ikke et gyldigt JSON-svar."
msgid "Your U2F device was registered!"
-msgstr ""
+msgstr "Din U2F-enhed blev tilmeldt!"
msgid "Your WebAuthn device did not send a valid JSON response."
-msgstr ""
+msgstr "Din WebAuthn-enhed sendte ikke et gyldigt JSON-svar."
msgid "Your WebAuthn device was registered!"
-msgstr ""
+msgstr "Din WebAuthn-enhed blev tilmeldt!"
msgid "Your access request to the %{source_type} has been withdrawn."
msgstr ""
@@ -38758,13 +39299,13 @@ msgid "Your authorized applications"
msgstr ""
msgid "Your browser does not support iFrames"
-msgstr ""
+msgstr "Din browser understøtter ikke iFrames"
msgid "Your browser doesn't support U2F. Please use Google Chrome desktop (version 41 or newer)."
-msgstr ""
+msgstr "Din browser understøtter ikke U2F. Brug venligst Google Chrome desktop (version 41 eller nyere)."
msgid "Your browser doesn't support WebAuthn. Please use a supported browser, e.g. Chrome (67+) or Firefox (60+)."
-msgstr ""
+msgstr "Din browser understøtter ikke WebAuthn. Brug venligst en browser som understøttes, f.eks. Chrome (67+) eller Firefox (60+)."
msgid "Your changes can be committed to %{branch_name} because a merge request is open."
msgstr ""
@@ -38782,10 +39323,10 @@ msgid "Your comment could not be submitted because %{error}"
msgstr ""
msgid "Your comment could not be submitted! Please check your network connection and try again."
-msgstr ""
+msgstr "Din kommentar kunne ikke indsendes! Tjek venligst din netværksforbindelse og prøv igen."
msgid "Your comment could not be updated! Please check your network connection and try again."
-msgstr ""
+msgstr "Din kommentar kunne ikke opdateres! Tjek venligst din netværksforbindelse og prøv igen."
msgid "Your comment will be discarded."
msgstr "Din kommentar kasseres."
@@ -38793,6 +39334,9 @@ msgstr "Din kommentar kasseres."
msgid "Your commit email is used for web based operations, such as edits and merges."
msgstr ""
+msgid "Your current password is required to register a two-factor authenticator app."
+msgstr ""
+
msgid "Your dashboard has been copied. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
@@ -38806,7 +39350,7 @@ msgid "Your deployment services will be broken, you will need to manually fix th
msgstr ""
msgid "Your device is not compatible with GitLab. Please try another device"
-msgstr ""
+msgstr "Din enhed er ikke kompatibel med GitLab. Prøv venligst en anden enhed"
msgid "Your device needs to be set up. Plug it in (if needed) and click the button on the left."
msgstr ""
@@ -38815,7 +39359,7 @@ msgid "Your device was successfully set up! Give it a name and register it with
msgstr ""
msgid "Your file must contain a column named %{codeStart}title%{codeEnd}. A %{codeStart}description%{codeEnd} column is optional. The maximum file size allowed is 10 MB."
-msgstr ""
+msgstr "Din fil skal indeholde en kolonne ved navn %{codeStart}title%{codeEnd}. En kolonne med %{codeStart}description%{codeEnd} er valgfrit. Den maksimale tilladte filstørrelse er 10 MB."
msgid "Your first project"
msgstr "Dit første projekt"
@@ -38860,16 +39404,16 @@ msgid "Your new %{type}"
msgstr "Din nye %{type}"
msgid "Your new SCIM token"
-msgstr ""
+msgstr "Din nye SCIM-token"
msgid "Your new comment"
msgstr "Din nye kommentar"
msgid "Your new personal access token has been created."
-msgstr ""
+msgstr "Din nye personlige adgangstoken er blevet oprettet."
msgid "Your new project access token has been created."
-msgstr ""
+msgstr "Din nye projektadgangstoken er blevet oprettet."
msgid "Your password isn't required to view this page. If a password or any other personal details are requested, please contact your administrator to report abuse."
msgstr ""
@@ -38878,10 +39422,10 @@ msgid "Your password reset token has expired."
msgstr ""
msgid "Your personal access token has expired"
-msgstr ""
+msgstr "Din personlige adgangstoken er udløbet"
msgid "Your personal access tokens will expire in %{days_to_expire} days or less"
-msgstr ""
+msgstr "Din personlige adgangstoken vil udløbe om %{days_to_expire} dage eller mindre"
msgid "Your primary email is used for avatar detection. You can change it in your %{openingTag}profile settings%{closingTag}."
msgstr "Din primære e-mail bruges til registrering af avatar. Du kan ændre den i dine %{openingTag}profilindstillinger%{closingTag}."
@@ -38890,6 +39434,9 @@ msgid "Your profile"
msgstr "Din profil"
msgid "Your project limit is %{limit} projects! Please contact your administrator to increase it"
+msgstr "Din projektgrænse er %{limit} projekter! Kontakt venligst din administrator for at øge den"
+
+msgid "Your project will be created at:"
msgstr ""
msgid "Your projects"
@@ -38905,7 +39452,7 @@ msgid "Your request for access has been queued for review."
msgstr ""
msgid "Your request to join %{host} has been rejected."
-msgstr ""
+msgstr "Din anmodning om at deltage i %{host} er blevet afvist."
msgid "Your requirements are being imported. Once finished, you'll receive a confirmation email."
msgstr ""
@@ -38917,7 +39464,7 @@ msgid "Your response has been recorded."
msgstr ""
msgid "Your search didn't match any commits."
-msgstr ""
+msgstr "Din søgning matchede ikke nogen commits."
msgid "Your search didn't match any commits. Try a different query."
msgstr ""
@@ -38931,38 +39478,37 @@ msgstr ""
msgid "Your subscription expired!"
msgstr "Dit abonnement udløb!"
-msgid "Your subscription has been downgraded."
-msgstr ""
-
-msgid "Your subscription will expire in %{remaining_days}."
-msgstr ""
+msgid "Your subscription will expire in %{remaining_days} day."
+msgid_plural "Your subscription will expire in %{remaining_days} days."
+msgstr[0] ""
+msgstr[1] ""
msgid "Your username is %{username}."
msgstr "Dit brugernavn er %{username}."
msgid "ZentaoIntegration|Base URL of the Zentao instance."
-msgstr ""
+msgstr "Grund-URL på Zentao-instansen."
msgid "ZentaoIntegration|Enter API token"
-msgstr ""
+msgstr "Indtast API-token"
msgid "ZentaoIntegration|If different from Web URL."
msgstr ""
msgid "ZentaoIntegration|Use Zentao as this project's issue tracker."
-msgstr ""
+msgstr "Brug Zentao som projektets problemstillingssporing."
msgid "ZentaoIntegration|Zentao API URL (optional)"
-msgstr ""
+msgstr "URL for Zentao-API (valgfrit)"
msgid "ZentaoIntegration|Zentao API token"
-msgstr ""
+msgstr "API-token for Zentao"
msgid "ZentaoIntegration|Zentao Product ID"
-msgstr ""
+msgstr "Produkt-id for Zentao"
msgid "ZentaoIntegration|Zentao Web URL"
-msgstr ""
+msgstr "Web-URL for Zentao"
msgid "Zoom meeting added"
msgstr "Zoom-møde tilføjet"
@@ -38971,16 +39517,16 @@ msgid "Zoom meeting removed"
msgstr "Zoom-møde fjernet"
msgid "[No reason]"
-msgstr ""
+msgstr "[ingen årsag]"
msgid "[Redacted]"
msgstr ""
msgid "`end_time` should not exceed one month after `start_time`"
-msgstr ""
+msgstr "`end_time` skal ikke være mere end en måned efter `start_time`"
msgid "`start_time` should precede `end_time`"
-msgstr ""
+msgstr "`start_time` skal være før `end_time`"
msgid "a deleted user"
msgstr "en slettet bruger"
@@ -39012,16 +39558,16 @@ msgid "ago"
msgstr "siden"
msgid "alert"
-msgstr ""
+msgstr "alertbesked"
msgid "allowed to fail"
-msgstr ""
+msgstr "må mislykkes"
msgid "already being used for another group or project %{timebox_name}."
msgstr ""
msgid "already being used for another iteration within this cadence."
-msgstr ""
+msgstr "bruges allerede til et andet gennemløb i kadencen."
msgid "already has a \"created\" issue link"
msgstr ""
@@ -39051,7 +39597,7 @@ msgid "assign yourself"
msgstr "tildel dig selv"
msgid "at"
-msgstr "klokken"
+msgstr "kl."
msgid "at risk"
msgstr ""
@@ -39070,8 +39616,8 @@ msgstr "blokerer"
msgid "branch"
msgid_plural "branches"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "gren"
+msgstr[1] "grene"
msgid "branch name"
msgstr "grennavn"
@@ -39089,13 +39635,13 @@ msgid "can contain only lowercase letters, digits, and '_'."
msgstr ""
msgid "can only be changed by a group admin."
-msgstr ""
+msgstr "kan kun ændres af en gruppeadministrator."
msgid "can only have one escalation policy"
msgstr ""
msgid "can't be the same as the source project"
-msgstr ""
+msgstr "kan ikke være det samme som kildeprojektet"
msgid "can't include: %{invalid_storages}"
msgstr ""
@@ -39107,19 +39653,19 @@ msgid "cannot be changed"
msgstr "må ikke ændres"
msgid "cannot be changed if a personal project has container registry tags."
-msgstr ""
+msgstr "kan ikke ændres hvis et personligt projekt har beholderregistermærkater."
msgid "cannot be changed if shared runners are enabled"
msgstr ""
msgid "cannot be enabled because parent group does not allow it"
-msgstr ""
+msgstr "kan ikke aktiveres fordi forældergruppe ikke tillader det"
msgid "cannot be enabled because parent group has shared Runners disabled"
-msgstr ""
+msgstr "kan ikke aktiveres fordi forældergruppe har delte runnere deaktiveret"
msgid "cannot be enabled unless all domains have TLS certificates"
-msgstr ""
+msgstr "kan ikke aktiveres medmindre alle domæner har TLS-certifikater"
msgid "cannot be enabled until a valid credit card is on file"
msgstr ""
@@ -39142,6 +39688,9 @@ msgstr "må ikke selv blokeres"
msgid "cannot merge"
msgstr "kan ikke sammenlægge"
+msgid "cannot not be used for user namespace"
+msgstr ""
+
msgid "ciReport|%{degradedNum} degraded"
msgstr ""
@@ -39149,7 +39698,7 @@ msgid "ciReport|%{improvedNum} improved"
msgstr ""
msgid "ciReport|%{linkStartTag}Learn more about API Fuzzing%{linkEndTag}"
-msgstr ""
+msgstr "%{linkStartTag}Lær mere om API-fuzzing%{linkEndTag}"
msgid "ciReport|%{linkStartTag}Learn more about Container Scanning %{linkEndTag}"
msgstr ""
@@ -39185,13 +39734,13 @@ msgid "ciReport|%{sameNum} same"
msgstr ""
msgid "ciReport|: Loading resulted in an error"
-msgstr ""
+msgstr ": indlæsning resulterede i en fejl"
msgid "ciReport|API Fuzzing"
-msgstr ""
+msgstr "API-fuzzing"
msgid "ciReport|API fuzzing"
-msgstr ""
+msgstr "API-fuzzing"
msgid "ciReport|All projects"
msgstr "Alle projekter"
@@ -39200,10 +39749,10 @@ msgid "ciReport|All severities"
msgstr "Alle alvorligheder"
msgid "ciReport|All tools"
-msgstr ""
+msgstr "Alle værktøjer"
msgid "ciReport|Automatically apply the patch in a new branch"
-msgstr ""
+msgstr "Anvend automatisk patchen i en ny gren"
msgid "ciReport|Base pipeline codequality artifact not found"
msgstr ""
@@ -39215,7 +39764,7 @@ msgid "ciReport|Browser performance test metrics: No changes"
msgstr ""
msgid "ciReport|Checks"
-msgstr ""
+msgstr "Tjekker"
msgid "ciReport|Cluster Image Scanning"
msgstr ""
@@ -39254,7 +39803,7 @@ msgid "ciReport|DAST"
msgstr "DAST"
msgid "ciReport|Dependency Scanning"
-msgstr ""
+msgstr "Afhængighedsskanning"
msgid "ciReport|Dependency Scanning detects known vulnerabilities in your source code's dependencies."
msgstr ""
@@ -39266,19 +39815,19 @@ msgid "ciReport|Download patch to resolve"
msgstr ""
msgid "ciReport|Download the patch to apply it manually"
-msgstr ""
+msgstr "Download patchen for at anvende den manuelt"
msgid "ciReport|Dynamic Application Security Testing (DAST) detects known vulnerabilities in your web application."
msgstr ""
msgid "ciReport|Failed to load %{reportName} report"
-msgstr ""
+msgstr "Kunne ikke indlæse %{reportName}-rapport"
msgid "ciReport|Fixed"
-msgstr ""
+msgstr "Rettet"
msgid "ciReport|Fixed:"
-msgstr ""
+msgstr "Rettet:"
msgid "ciReport|Found %{issuesWithCount}"
msgstr "Fandt %{issuesWithCount}"
@@ -39299,7 +39848,7 @@ msgid "ciReport|Manage licenses"
msgstr "HÃ¥ndter licenser"
msgid "ciReport|New"
-msgstr ""
+msgstr "Ny"
msgid "ciReport|No changes to code quality"
msgstr ""
@@ -39385,13 +39934,13 @@ msgid "codeQualityWalkthrough|A code quality job will now run every time you or
msgstr ""
msgid "codeQualityWalkthrough|Congrats! Your first pipeline is running %{emojiStart}zap%{emojiEnd}"
-msgstr ""
+msgstr "Tillykke! Din første pipeline kører %{emojiStart}zap%{emojiEnd}"
msgid "codeQualityWalkthrough|Got it"
msgstr ""
msgid "codeQualityWalkthrough|Let's start by creating a new CI file."
-msgstr ""
+msgstr "Lad os starte, ved at oprette en ny CI-fil."
msgid "codeQualityWalkthrough|Not sure how to fix your failed job? We have compiled some tips on how to troubleshoot code quality jobs in the documentation."
msgstr ""
@@ -39400,22 +39949,22 @@ msgid "codeQualityWalkthrough|Read the documentation"
msgstr ""
msgid "codeQualityWalkthrough|Something went wrong. %{emojiStart}thinking%{emojiEnd} Let's fix it."
-msgstr ""
+msgstr "Noget gik galt. %{emojiStart}thinking%{emojiEnd} Lad os rette det."
msgid "codeQualityWalkthrough|To begin with code quality, we first need to create a new CI file using our code editor. We added a code quality template in the code editor to help you get started %{emojiStart}wink%{emojiEnd} .%{lineBreak}Take some time to review the template, when you are ready, use the %{strongStart}commit changes%{strongEnd} button at the bottom of the page."
msgstr ""
msgid "codeQualityWalkthrough|Troubleshoot your code quality job"
-msgstr ""
+msgstr "Fejlsøg dit kodekvalitetsjob"
msgid "codeQualityWalkthrough|View the logs"
msgstr ""
msgid "codeQualityWalkthrough|Well done! You've just automated your code quality review. %{emojiStart}raised_hands%{emojiEnd}"
-msgstr ""
+msgstr "Godt gået! Du har lige automatiseret din kodekvalitetskontrol. %{emojiStart}raised_hands%{emojiEnd}"
msgid "codeQualityWalkthrough|Your job failed. No worries - this happens. Let's view the logs, and see how we can fix it."
-msgstr ""
+msgstr "Dit job mislykkedes. Bare rolig, det kan ske. Lad os kigge i loggene og se hvordan vi kan rette det."
msgid "codeQualityWalkthrough|Your pipeline can take a few minutes to run. If you enabled email notifications, you'll receive an email with your pipeline status. In the meantime, why don't you get some coffee? You earned it!"
msgstr ""
@@ -39427,10 +39976,10 @@ msgid "comment"
msgstr "kommentar"
msgid "commented on %{link_to_project}"
-msgstr ""
+msgstr "kommenterede på %{link_to_project}"
msgid "commit %{commit_id}"
-msgstr ""
+msgstr "commit %{commit_id}"
msgid "committed"
msgstr "committed"
@@ -39439,7 +39988,7 @@ msgid "container_name can contain only lowercase letters, digits, '-', and '.' a
msgstr ""
msgid "container_name cannot be larger than %{max_length} chars"
-msgstr ""
+msgstr "container_name må ikke være længere end %{max_length} tegn"
msgid "contribute to this project."
msgstr "bidrag til projektet."
@@ -39451,7 +40000,7 @@ msgid "created"
msgstr "oprettet"
msgid "created %{issuable_created} by %{author}"
-msgstr ""
+msgstr "oprettet %{issuable_created} af %{author}"
msgid "created %{timeAgoString} by %{email} via %{user}"
msgstr "oprettet %{timeAgoString} af %{email} via %{user}"
@@ -39463,6 +40012,9 @@ msgid "created %{timeAgoString} by %{user} in Jira"
msgstr "oprettet %{timeAgoString} af %{user} i Jira"
msgid "created %{timeAgo}"
+msgstr "oprettet %{timeAgo}"
+
+msgid "created %{timeAgo} by %{author}"
msgstr ""
msgid "created by"
@@ -39498,7 +40050,7 @@ msgid "designs"
msgstr "designs"
msgid "detached"
-msgstr ""
+msgstr "løsrevet"
msgid "disabled"
msgstr "deaktiveret"
@@ -39509,11 +40061,8 @@ msgstr "findes ikke"
msgid "does not have a supported extension. Only %{extension_list} are supported"
msgstr ""
-msgid "domain is not authorized for sign-up."
-msgstr "domænet er ikke godkendt til tilmelding."
-
msgid "download it"
-msgstr ""
+msgstr "download den"
msgid "draft"
msgid_plural "drafts"
@@ -39529,28 +40078,23 @@ msgstr ""
msgid "email '%{email}' is not a verified email."
msgstr ""
-msgid "email does not match the allowed domain of %{email_domains}"
-msgid_plural "email does not match the allowed domains: %{email_domains}"
-msgstr[0] "e-mailen passer ikke med det tilladte domæne i %{email_domains}"
-msgstr[1] "e-mailen passer ikke med de tilladte domæner: %{email_domains}"
-
msgid "enabled"
msgstr "aktiveret"
msgid "encrypted: needs to be a :required, :optional or :migrating!"
msgstr ""
-msgid "ending with MIME type format is not allowed."
+msgid "ending with a reserved file extension is not allowed."
msgstr ""
msgid "entries cannot be larger than 255 characters"
-msgstr ""
+msgstr "indslag må ikke være længere end 255 tegn"
msgid "entries cannot be nil"
-msgstr ""
+msgstr "indslag må ikke være nul"
msgid "entries cannot contain HTML tags"
-msgstr ""
+msgstr "indslag må ikke indeholde HTML-tags"
msgid "environment_id parameter is required when type is container_policy"
msgstr ""
@@ -39562,6 +40106,9 @@ msgid "error"
msgstr "fejl"
msgid "estimateCommand|%{slash_command} overwrites the total estimated time."
+msgstr "%{slash_command} overskriver den samlede estimerede tid."
+
+msgid "example.com"
msgstr ""
msgid "exceeds the limit of %{bytes} bytes"
@@ -39577,7 +40124,7 @@ msgid "expires on %{timebox_due_date}"
msgstr "udløber %{timebox_due_date}"
msgid "failed"
-msgstr "mislykkedes"
+msgstr "mislykket"
msgid "failed to dismiss associated finding(id=%{finding_id}): %{message}"
msgstr ""
@@ -39612,10 +40159,7 @@ msgid "for this project"
msgstr "for projektet"
msgid "fork"
-msgstr ""
-
-msgid "fork this project"
-msgstr "forgren projektet"
+msgstr "forgrening"
msgid "from"
msgstr "fra"
@@ -39625,6 +40169,9 @@ msgid_plural "from %d jobs"
msgstr[0] "fra %d job"
msgstr[1] "fra %d job"
+msgid "frontmatter"
+msgstr ""
+
msgid "group"
msgstr "gruppe"
@@ -39647,11 +40194,14 @@ msgid "has already been taken as Codename"
msgstr ""
msgid "has already been taken as Suite"
-msgstr ""
+msgstr "er allerede blevet taget som suite"
msgid "has been completed."
msgstr "er fuldført."
+msgid "has too deep level of nesting"
+msgstr ""
+
msgid "help"
msgstr "hjælp"
@@ -39668,26 +40218,38 @@ msgid "https://your-bitbucket-server"
msgstr "https://din-bitbucket-server"
msgid "i18n|%{language} (%{percent_translated}%% translated)"
-msgstr "%{language} (%{percent_translated}%% oversat)"
+msgstr "%{language} (%{percent_translated} %% oversat)"
msgid "image diff"
msgstr ""
msgid "impersonation token"
-msgstr ""
+msgstr "efterligningstoken"
msgid "impersonation tokens"
-msgstr ""
+msgstr "efterligningstokens"
msgid "import flow"
-msgstr ""
+msgstr "importflow"
msgid "in"
msgstr "i"
+msgid "in Infrastructure :: Kubernetes clusters"
+msgstr ""
+
+msgid "in all GitLab"
+msgstr ""
+
+msgid "in group"
+msgstr ""
+
msgid "in group %{link_to_group}"
msgstr "i gruppen %{link_to_group}"
+msgid "in project"
+msgstr ""
+
msgid "in project %{link_to_project}"
msgstr "i projektet %{link_to_project}"
@@ -39718,7 +40280,7 @@ msgid "is invalid because there is downstream lock"
msgstr ""
msgid "is invalid because there is upstream lock"
-msgstr ""
+msgstr "er ugyldig fordi der er upstream-lås"
msgid "is not"
msgstr "er ikke"
@@ -39729,38 +40291,41 @@ msgstr ""
msgid "is not a valid X509 certificate."
msgstr "er ikke et gyldigt X509-certifikat."
-msgid "is not allowed since the group is not top-level group."
+msgid "is not allowed for sign-up."
msgstr ""
-msgid "is not allowed. Try again with a different email address, or contact your GitLab admin."
+msgid "is not allowed for this group."
msgstr ""
-msgid "is not allowed. We do not currently support project-level iterations"
+msgid "is not allowed for this project."
msgstr ""
-msgid "is not from an allowed domain."
-msgstr "er ikke fra et tilladt domæne."
+msgid "is not allowed since the group is not top-level group."
+msgstr "er ikke tilladt eftersom gruppen ikke er topniveaugruppe."
+
+msgid "is not allowed. We do not currently support project-level iterations"
+msgstr ""
msgid "is not in the group enforcing Group Managed Account"
msgstr ""
msgid "is not valid. The iteration group has to match the iteration cadence group."
-msgstr ""
+msgstr "er ikke gyldig. Gennemløbsgruppen skal matche gennmløbskadencegruppen."
msgid "is read-only"
msgstr "er skrivebeskyttet"
msgid "is too long (%{current_value}). The maximum size is %{max_size}."
-msgstr ""
+msgstr "er for lang (%{current_value}). Den maksimale størrelse er %{max_size}."
msgid "is too long (maximum is %{count} characters)"
-msgstr ""
+msgstr "er for langt (maksimum er %{count} tegn)"
msgid "is too long (maximum is 100 entries)"
-msgstr ""
+msgstr "er for lang (maksimum er 100 indslag)"
msgid "is too long (maximum is 1000 entries)"
-msgstr ""
+msgstr "er for lang (maksimum er 1000 indslag)"
msgid "issue"
msgstr "problemstilling"
@@ -39787,7 +40352,7 @@ msgid "it is stored in LFS"
msgstr ""
msgid "it is too large"
-msgstr ""
+msgstr "den er for stor"
msgid "jigsaw is not defined"
msgstr ""
@@ -39831,14 +40396,17 @@ msgstr "låst af %{path_lock_user_name} %{created_at}"
msgid "log in"
msgstr "log ind"
-msgid "manual"
+msgid "managed"
msgstr ""
+msgid "manual"
+msgstr "manuelt"
+
msgid "math|Displaying this math block may cause performance issues on this page"
-msgstr ""
+msgstr "Visning af math-blokken kan forårsage ydelsesproblemer på siden"
msgid "math|There was an error rendering this math block"
-msgstr ""
+msgstr "Der opstod en fejl ved gengivelse af math-blokken"
msgid "merge request"
msgid_plural "merge requests"
@@ -39846,7 +40414,7 @@ msgstr[0] "sammenlægningsanmodning"
msgstr[1] "sammenlægningsanmodninger"
msgid "merged %{timeAgo}"
-msgstr ""
+msgstr "sammenlagt %{timeAgo}"
msgid "metric_id must be unique across a project"
msgstr ""
@@ -39864,18 +40432,21 @@ msgid "mrWidgetCommitsAdded|%{commitCount} and %{mergeCommitCount} will be added
msgstr ""
msgid "mrWidgetCommitsAdded|%{commitCount} will be added to %{targetBranch}."
-msgstr ""
+msgstr "%{commitCount} vil blive tilføjet til %{targetBranch}."
msgid "mrWidgetCommitsAdded|1 merge commit"
-msgstr ""
+msgstr "1 sammenlægningscommit"
msgid "mrWidgetNothingToMerge|This merge request contains no changes."
-msgstr ""
+msgstr "Sammenlægningsanmodningen indeholder ingen ændringer."
msgid "mrWidgetNothingToMerge|Use merge requests to propose changes to your project and discuss them with your team. To make changes, push a commit or edit this merge request to use a different branch. With %{linkStart}CI/CD%{linkEnd}, automatically test your changes before merging."
msgstr ""
msgid "mrWidget| Please restore it or use a different %{missingBranchName} branch"
+msgstr " Gendan den venligst eller brug en anden %{missingBranchName}-gren"
+
+msgid "mrWidget|%{linkStart}Set up now%{linkEnd} to analyze your source code for known security vulnerabilities."
msgstr ""
msgid "mrWidget|%{mergeError}."
@@ -39885,13 +40456,13 @@ msgid "mrWidget|%{mergeError}. Try again."
msgstr "%{mergeError}. Prøv igen."
msgid "mrWidget|%{metricsLinkStart} Memory %{metricsLinkEnd} usage %{emphasisStart} decreased %{emphasisEnd} from %{memoryFrom}MB to %{memoryTo}MB"
-msgstr ""
+msgstr "%{metricsLinkStart} Hukommelsesforbrug %{metricsLinkEnd} %{emphasisStart} reduceret %{emphasisEnd} fra %{memoryFrom} MB til %{memoryTo} MB"
msgid "mrWidget|%{metricsLinkStart} Memory %{metricsLinkEnd} usage %{emphasisStart} increased %{emphasisEnd} from %{memoryFrom}MB to %{memoryTo}MB"
-msgstr ""
+msgstr "%{metricsLinkStart} Hukommelsesforbrug %{metricsLinkEnd} %{emphasisStart} øget %{emphasisEnd} fra %{memoryFrom} MB til %{memoryTo} MB"
msgid "mrWidget|%{metricsLinkStart} Memory %{metricsLinkEnd} usage is %{emphasisStart} unchanged %{emphasisEnd} at %{memoryFrom}MB"
-msgstr ""
+msgstr "%{metricsLinkStart} Hukommelsesforbrug %{metricsLinkEnd} er %{emphasisStart} uændret %{emphasisEnd} på %{memoryFrom} MB"
msgid "mrWidget|%{prefixToLinkStart}No pipeline%{prefixToLinkEnd} %{addPipelineLinkStart}Add the .gitlab-ci.yml file%{addPipelineLinkEnd} to create one."
msgstr ""
@@ -39900,25 +40471,25 @@ msgid "mrWidget|A new merge train has started and this merge request is the firs
msgstr ""
msgid "mrWidget|Added to the merge train by %{merge_author}"
-msgstr ""
+msgstr "Tilføjet til sammenlægningstoget af %{merge_author}"
msgid "mrWidget|Added to the merge train. There are %{mergeTrainPosition} merge requests waiting to be merged"
-msgstr ""
+msgstr "Tilføjet til sammenlægningstoget. Der er %{mergeTrainPosition} sammenlægningsanmodninger der venter på at blive sammenlagt"
msgid "mrWidget|An error occurred while removing your approval."
-msgstr ""
+msgstr "Der opstod en fejl under fjernelse af din godkendelse."
msgid "mrWidget|An error occurred while retrieving approval data for this merge request."
-msgstr ""
+msgstr "Der opstod en fejl under indhentelse af godkendelsesdata for sammenlægningsanmodningen."
msgid "mrWidget|An error occurred while submitting your approval."
-msgstr ""
+msgstr "Der opstod en fejl under indsendelse af din godkendelse."
msgid "mrWidget|Approval is optional"
-msgstr ""
+msgstr "Godkendelse er valgfrit"
msgid "mrWidget|Approval password is invalid."
-msgstr ""
+msgstr "Godkendelsesadgangskode er ugyldig."
msgid "mrWidget|Approve"
msgstr "Godkend"
@@ -39933,19 +40504,19 @@ msgid "mrWidget|Are you adding technical debt or code vulnerabilities?"
msgstr ""
msgid "mrWidget|Cancel auto-merge"
-msgstr ""
+msgstr "Annuller automatisk sammenlægning"
msgid "mrWidget|Check out branch"
msgstr ""
msgid "mrWidget|Checking if merge request can be merged…"
-msgstr ""
+msgstr "Tjekker om sammenlægningsanmodning kan sammenlægges …"
msgid "mrWidget|Cherry-pick"
-msgstr ""
+msgstr "Cherry-pick"
msgid "mrWidget|Cherry-pick this merge request in a new merge request"
-msgstr ""
+msgstr "Cherry-pick sammenlægningsanmodningen i en ny sammenlægningsanmodning"
msgid "mrWidget|Closed"
msgstr "Lukket"
@@ -39955,41 +40526,50 @@ msgstr "Lukket af"
msgid "mrWidget|Closes issue"
msgid_plural "mrWidget|Closes issues"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "Lukker problemstilling"
+msgstr[1] "Lukker problemstillinger"
+
+msgid "mrWidget|Create issue to resolve all threads"
+msgstr ""
msgid "mrWidget|Delete source branch"
msgstr "Slet kildegren"
msgid "mrWidget|Deployment statistics are not available currently"
-msgstr ""
+msgstr "Udsendelsesstatistik er ikke tilgængelig i øjeblikket"
msgid "mrWidget|Did not close"
msgstr "Lukkede ikke"
-msgid "mrWidget|Email patches"
+msgid "mrWidget|Dismiss"
msgstr ""
+msgid "mrWidget|Email patches"
+msgstr "E-mail-patches"
+
msgid "mrWidget|Failed to load deployment statistics"
+msgstr "Kunne ikke indlæse udsendelsesstatistik"
+
+msgid "mrWidget|Hide %{widget} details"
msgstr ""
msgid "mrWidget|If the %{missingBranchName} branch exists in your local repository, you can merge this merge request manually using the command line"
-msgstr ""
+msgstr "Hvis grenen %{missingBranchName} findes i dit lokale depot, så kan du sammenlægge sammenlægningsanmodningen manuelt med kommandolinjen"
msgid "mrWidget|If the last pipeline ran in the fork project, it may be inaccurate. Before merge, we advise running a pipeline in this project."
msgstr ""
msgid "mrWidget|Jump to first unresolved thread"
-msgstr ""
+msgstr "Hop til første uløste tråd"
msgid "mrWidget|Loading deployment statistics"
-msgstr ""
+msgstr "Indlæser udsendelsesstatistik"
msgid "mrWidget|Mark as ready"
msgstr "Mærk som klar"
msgid "mrWidget|Members who can merge are allowed to add commits."
-msgstr ""
+msgstr "Medlemmer som kan sammenlægge har ikke tilladelse til at tilføje commits."
msgid "mrWidget|Mentions issue"
msgid_plural "mrWidget|Mentions issues"
@@ -40000,34 +40580,34 @@ msgid "mrWidget|Merge"
msgstr "Sammenlæg"
msgid "mrWidget|Merge blocked: all threads must be resolved."
-msgstr ""
+msgstr "Sammenlægning blokeret: alle tråde skal være løst."
msgid "mrWidget|Merge blocked: fast-forward merge is not possible. To merge this request, first rebase locally."
msgstr ""
msgid "mrWidget|Merge blocked: pipeline must succeed. It's waiting for a manual action to continue."
-msgstr ""
+msgstr "Sammenlægning blokeret: pipeline skal lykkes. Den venter på en manuel handling for at fortsætte."
msgid "mrWidget|Merge failed."
-msgstr ""
+msgstr "Sammenlægning mislykkedes."
msgid "mrWidget|Merge locally"
msgstr "Sammenlæg lokalt"
msgid "mrWidget|Merge request approved."
-msgstr ""
+msgstr "Sammenlægningsanmodning godkendt."
msgid "mrWidget|Merged by"
msgstr "Sammenlagt af"
msgid "mrWidget|Merging! Changes are being shipped…"
-msgstr ""
+msgstr "Sammenlægger! Ændringer er ved at blive sendt afsted …"
msgid "mrWidget|Merging! Changes will land soon…"
msgstr ""
msgid "mrWidget|Merging! Drum roll, please…"
-msgstr ""
+msgstr "Sammenlægger! Trommehvirvel, tak …"
msgid "mrWidget|Merging! Everything's good…"
msgstr ""
@@ -40042,16 +40622,16 @@ msgid "mrWidget|More information"
msgstr "Mere information"
msgid "mrWidget|Open in Gitpod"
-msgstr ""
+msgstr "Ã…bn i Gitpod"
msgid "mrWidget|Open in Web IDE"
msgstr "Ã…bn i Web IDE"
msgid "mrWidget|Plain diff"
-msgstr ""
+msgstr "Ren diff"
msgid "mrWidget|Ready to be merged automatically. Ask someone with write access to this repository to merge this request"
-msgstr ""
+msgstr "Klar til at blive sammenlagt automatisk. Spørg nogen med skriveadgang til depotet om at sammenlægge anmodningen"
msgid "mrWidget|Refresh"
msgstr "Opdater"
@@ -40063,13 +40643,10 @@ msgid "mrWidget|Refreshing now"
msgstr "Opdaterer nu"
msgid "mrWidget|Remove from merge train"
-msgstr ""
+msgstr "Fjern fra sammenlægningstog"
msgid "mrWidget|Request to merge"
-msgstr ""
-
-msgid "mrWidget|Resolve all threads in new issue"
-msgstr ""
+msgstr "Anmod om at sammenlægge"
msgid "mrWidget|Resolve conflicts"
msgstr "Løs konflikter"
@@ -40081,32 +40658,41 @@ msgid "mrWidget|Revert"
msgstr "Tilbagefør"
msgid "mrWidget|Revert this merge request in a new merge request"
-msgstr ""
+msgstr "Tilbagefør sammenlægningsanmodningen i en ny sammenlægningsanmodning"
msgid "mrWidget|Revoke approval"
msgstr "Tilbagekald godkendelse"
-msgid "mrWidget|Set by %{merge_author} to be added to the merge train when the pipeline succeeds"
+msgid "mrWidget|SAST and Secret Detection is not enabled."
msgstr ""
+msgid "mrWidget|Set by %{merge_author} to be added to the merge train when the pipeline succeeds"
+msgstr "Indstillet af %{merge_author} til at blive tilføjet til sammenlægningstoget når pipelinen lykkes"
+
msgid "mrWidget|Set by %{merge_author} to be merged automatically when the pipeline succeeds"
-msgstr ""
+msgstr "Indstillet af %{merge_author} til at blive sammenlagt automatisk når pipelinen lykkes"
msgid "mrWidget|Set by %{merge_author} to start a merge train when the pipeline succeeds"
+msgstr "Indstillet af %{merge_author} til at starte et sammenlægningstog når pipelinen lykkes"
+
+msgid "mrWidget|Show %{widget} details"
msgstr ""
msgid "mrWidget|The changes were merged into"
-msgstr ""
+msgstr "Ændringerne blev sammenlagt i"
msgid "mrWidget|The changes were not merged into"
-msgstr ""
+msgstr "Ændringerne blev ikke sammenlagt i"
msgid "mrWidget|The changes will be merged into"
-msgstr ""
+msgstr "Ændringerne vil blive sammenlagt i"
msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure, or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
msgstr ""
+msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure."
+msgstr ""
+
msgid "mrWidget|The source branch has been deleted"
msgstr "Kildegrenen er blevet slettet"
@@ -40123,19 +40709,19 @@ msgid "mrWidget|The source branch will not be deleted"
msgstr "Kildegrenen vil ikke blive slettet"
msgid "mrWidget|There are merge conflicts"
-msgstr ""
+msgstr "Der er sammenlægningskonflikter"
msgid "mrWidget|This action will add the merge request to the merge train when pipeline %{pipelineLink} succeeds."
msgstr ""
msgid "mrWidget|This action will start a merge train when pipeline %{pipelineLink} succeeds."
-msgstr ""
+msgstr "Handlingen vil starte et sammenlægningstog når pipelinen %{pipelineLink} lykkes."
msgid "mrWidget|This merge request failed to be merged automatically"
-msgstr ""
+msgstr "Sammenlægningsanmodningen kunne ikke sammenlægges automatisk"
msgid "mrWidget|This project is archived, write access has been disabled"
-msgstr ""
+msgstr "Projektet er aktiveret. Skriveadgang er blevet deaktiveret"
msgid "mrWidget|To approve this merge request, please enter your password. This project requires all approvals to be authenticated."
msgstr ""
@@ -40149,6 +40735,9 @@ msgstr ""
msgid "mrWidget|You can merge after removing denied licenses"
msgstr ""
+msgid "mrWidget|You can only merge once this merge request is approved."
+msgstr ""
+
msgid "mrWidget|Your password"
msgstr "Din adgangskode"
@@ -40156,7 +40745,7 @@ msgid "mrWidget|branch does not exist."
msgstr "Grenen findes ikke."
msgid "mrWidget|into"
-msgstr ""
+msgstr "i"
msgid "must be a Debian package"
msgstr "skal være en Debian-pakke"
@@ -40165,7 +40754,7 @@ msgid "must be a boolean value"
msgstr "skal være en boolesk værdi"
msgid "must be a root namespace"
-msgstr "skal være et rodnavneområde"
+msgstr "skal være et rodnavnerum"
msgid "must be a valid IPv4 or IPv6 address"
msgstr "skal være en gyldig IPv4- eller IPv6-adresse"
@@ -40174,7 +40763,7 @@ msgid "must be after start"
msgstr "skal være efter start"
msgid "must be an email you have verified"
-msgstr ""
+msgstr "skal være en e-mail du har verificeret"
msgid "must be greater than start date"
msgstr "skal være større end startdato"
@@ -40185,6 +40774,9 @@ msgstr ""
msgid "must be less than the limit of %{tag_limit} tags"
msgstr ""
+msgid "must be set for a project namespace"
+msgstr ""
+
msgid "must be unique by status and elapsed time within a policy"
msgstr ""
@@ -40192,13 +40784,13 @@ msgid "my-awesome-group"
msgstr "min-fantastiske-gruppe"
msgid "my-channel"
-msgstr ""
+msgstr "min-kanal"
msgid "n/a"
msgstr "—"
msgid "need attention"
-msgstr ""
+msgstr "behøver opmærksomhed"
msgid "needs to be between 10 minutes and 1 month"
msgstr "skal være fra 10 minutter til 1 måned"
@@ -40252,10 +40844,10 @@ msgid "only available on top-level groups."
msgstr "kun tilgængelig på topniveaugrupper."
msgid "open issue"
-msgstr ""
+msgstr "Ã¥ben problemstilling"
msgid "opened %{timeAgo}"
-msgstr ""
+msgstr "Ã¥bnet %{timeAgo}"
msgid "or"
msgstr "eller"
@@ -40270,8 +40862,8 @@ msgstr[1] "ud af %d tests i alt"
msgid "parent"
msgid_plural "parents"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "forælder"
+msgstr[1] "forældre"
msgid "password"
msgstr "adgangskode"
@@ -40294,11 +40886,14 @@ msgstr "personlige adgangstokens"
msgid "pipeline"
msgstr "pipeline"
+msgid "pipeline schedules documentation"
+msgstr ""
+
msgid "pod_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
msgstr ""
msgid "pod_name cannot be larger than %{max_length} chars"
-msgstr ""
+msgstr "pod_name må ikke være længere end %{max_length} tegn"
msgid "point"
msgid_plural "points"
@@ -40309,7 +40904,7 @@ msgid "previously merged commits"
msgstr ""
msgid "private"
-msgstr "privat"
+msgstr "private"
msgid "private key does not match certificate."
msgstr "privat nøgle passer ikke med certifikat."
@@ -40329,10 +40924,10 @@ msgid "project access tokens"
msgstr ""
msgid "project avatar"
-msgstr ""
+msgstr "projektavatar"
msgid "project bots cannot be added to other groups / projects"
-msgstr ""
+msgstr "projektbotter kan ikke tilføjes til andre grupper/projekter"
msgid "project is read-only"
msgstr "projektet er skrivebeskyttet"
@@ -40343,16 +40938,25 @@ msgstr "projektmedlemmer"
msgid "project name"
msgstr "projektnavn"
+msgid "project namespace cannot be the parent of another namespace"
+msgstr ""
+
msgid "projects"
msgstr "projekter"
msgid "quick actions"
-msgstr "hurtige handlinger"
+msgstr "hurtighandlinger"
-msgid "reCAPTCHA Private Key"
+msgid "reCAPTCHA"
msgstr ""
-msgid "reCAPTCHA Site Key"
+msgid "reCAPTCHA helps prevent credential stuffing."
+msgstr ""
+
+msgid "reCAPTCHA private key"
+msgstr ""
+
+msgid "reCAPTCHA site key"
msgstr ""
msgid "recent activity"
@@ -40362,7 +40966,7 @@ msgid "register"
msgstr "tilmeld"
msgid "relates to"
-msgstr ""
+msgstr "relateret til"
msgid "remaining"
msgstr "tilbage"
@@ -40386,7 +40990,7 @@ msgid "removed a Zoom call from this issue"
msgstr "fjernede et Zoom-opkald fra problemstillingen"
msgid "rendered diff"
-msgstr ""
+msgstr "gengivet diff"
msgid "reply"
msgid_plural "replies"
@@ -40400,10 +41004,10 @@ msgid "required"
msgstr "kræves"
msgid "reset it."
-msgstr ""
+msgstr "nulstil den."
msgid "satisfied"
-msgstr "tilfreds"
+msgstr "opfyldt"
msgid "scan-execution-policy: policy not applied, %{policy_path} file is invalid"
msgstr ""
@@ -40457,7 +41061,7 @@ msgid "show fewer"
msgstr "vis færre"
msgid "show less"
-msgstr "vis mindre"
+msgstr "vis færre"
msgid "sign in"
msgstr "log ind"
@@ -40472,19 +41076,19 @@ msgid "source"
msgstr "kilde"
msgid "source diff"
-msgstr ""
+msgstr "kilde-diff"
msgid "specified top is not part of the tree"
msgstr ""
msgid "spendCommand|%{slash_command} adds or subtracts time already spent."
-msgstr ""
+msgstr "%{slash_command} tilføjer eller fratrækker tid som allerede er brugt."
msgid "ssh:"
msgstr "ssh:"
msgid "started a discussion on %{design_link}"
-msgstr ""
+msgstr "startede en debat på %{design_link}"
msgid "started on %{timebox_start_date}"
msgstr ""
@@ -40493,7 +41097,7 @@ msgid "starts on %{timebox_start_date}"
msgstr ""
msgid "stuck"
-msgstr ""
+msgstr "sidder fast"
msgid "success"
msgstr "lykkedes"
@@ -40502,7 +41106,7 @@ msgid "suggestPipeline|1/2: Choose a template"
msgstr "1/2: Vælg en skabelon"
msgid "suggestPipeline|2/2: Commit your changes"
-msgstr ""
+msgstr "2/2: Commit dine ændringer"
msgid "suggestPipeline|Choose %{boldStart}Code Quality%{boldEnd} to add a pipeline that tests the quality of your code."
msgstr ""
@@ -40517,7 +41121,7 @@ msgid "tag name"
msgstr "mærkatnavn"
msgid "the correct format."
-msgstr "det korrekte format."
+msgstr ""
msgid "the file"
msgstr "filen"
@@ -40529,7 +41133,7 @@ msgid "the wiki"
msgstr "wikien"
msgid "then"
-msgstr ""
+msgstr "efterfulgt af"
msgid "this document"
msgstr "dokumentet"
@@ -40541,19 +41145,19 @@ msgid "this issue cannot be made public since it belongs to a confidential epic"
msgstr ""
msgid "time summary"
-msgstr ""
+msgstr "tidsopsummering"
msgid "toggle collapse"
msgstr "sammenfold til/fra"
msgid "train"
-msgstr ""
+msgstr "tog"
msgid "triggered"
msgstr "udløst"
msgid "two-factor authentication settings"
-msgstr "indstillinger for tofaktorgodkendelse"
+msgstr "indstillinger for totrinsgodkendelse"
msgid "type must be Debian"
msgstr "Typen skal være Debian"
@@ -40562,7 +41166,7 @@ msgid "type parameter is missing and is required"
msgstr "parameteren type mangler og kræves"
msgid "unicode domains should use IDNA encoding"
-msgstr ""
+msgstr "unicode-domæner skal bruge IDNA-kodning"
msgid "updated"
msgstr "opdateret"
@@ -40579,6 +41183,9 @@ msgstr "uploads"
msgid "user avatar"
msgstr "brugeravatar"
+msgid "user namespace cannot be the parent of another namespace"
+msgstr ""
+
msgid "user preferences"
msgstr "brugerpræferencer"
@@ -40633,22 +41240,22 @@ msgid "vulnerability|Add comment"
msgstr "Tilføj kommentar"
msgid "vulnerability|Add comment & dismiss"
-msgstr ""
+msgstr "Tilføj kommentar og afskedig"
msgid "vulnerability|Add comment and dismiss"
-msgstr ""
+msgstr "Tilføj kommentar og afskedig"
msgid "vulnerability|Dismiss vulnerability"
-msgstr ""
+msgstr "Afskedig sårbarhed"
msgid "vulnerability|Save comment"
msgstr "Gem kommentar"
msgid "vulnerability|Undo dismiss"
-msgstr ""
+msgstr "Fortryd afskedig"
msgid "vulnerability|dismissed"
-msgstr ""
+msgstr "Afskediget"
msgid "was scheduled to merge after pipeline succeeds by"
msgstr ""
@@ -40671,3 +41278,9 @@ msgstr "yaml ugyldig"
msgid "your settings"
msgstr "dine indstillinger"
+msgid "{group}"
+msgstr ""
+
+msgid "{project}"
+msgstr ""
+
diff --git a/locale/de/gitlab.po b/locale/de/gitlab.po
index 3dc94b39d3f..c844162709d 100644
--- a/locale/de/gitlab.po
+++ b/locale/de/gitlab.po
@@ -14,10 +14,7 @@ msgstr ""
"X-Crowdin-Language: de\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-09-01 22:33\n"
-
-msgid " %{name}, confirm your email address now! "
-msgstr ""
+"PO-Revision-Date: 2021-10-04 20:21\n"
msgid " %{start} to %{end}"
msgstr " %{start} bis %{end}"
@@ -32,13 +29,13 @@ msgid " Please sign in."
msgstr " Bitte melde dich an."
msgid " Target Path"
-msgstr ""
+msgstr " Zielpfad"
msgid " Try to %{action} this file again."
msgstr " Versuche die Datei erneut zu %{action}."
msgid " Type"
-msgstr ""
+msgstr " Typ"
msgid " You need to do this before %{grace_period_deadline}."
msgstr " Das musst du vor %{grace_period_deadline} tun."
@@ -78,7 +75,7 @@ msgid " or references (e.g. path/to/project!merge_request_id)"
msgstr " oder Referenzen (z.B. Pfad/zum/Projekt!merge_request_id)"
msgid " reacted with :%{name}:"
-msgstr ""
+msgstr " reagierte mit :%{name}:"
msgid "\"%{path}\" did not exist on \"%{ref}\""
msgstr "\"%{path}\" existiert nicht auf \"%{ref}\""
@@ -90,7 +87,17 @@ msgid "\"el\" parameter is required for createInstance()"
msgstr "\"el\" Parameter wird für createInstance() benötigt"
msgid "#general, #development"
-msgstr ""
+msgstr "#allgemein, #entwicklung"
+
+msgid "%d Alert"
+msgid_plural "%d Alerts"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d Alert:"
+msgid_plural "%d Alerts:"
+msgstr[0] ""
+msgstr[1] ""
msgid "%d Approval"
msgid_plural "%d Approvals"
@@ -99,8 +106,8 @@ msgstr[1] "%d Genehmigungen"
msgid "%d Module"
msgid_plural "%d Modules"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d Modul"
+msgstr[1] "%d Module"
msgid "%d Other"
msgid_plural "%d Others"
@@ -114,23 +121,23 @@ msgstr[1] "%d Pakete"
msgid "%d Scanned URL"
msgid_plural "%d Scanned URLs"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d gescannte URL"
+msgstr[1] "%d gescannte URL"
msgid "%d URL scanned"
msgid_plural "%d URLs scanned"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d URL gescannt"
+msgstr[1] "%d URLs gescannt"
msgid "%d approver"
msgid_plural "%d approvers"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d Genehmigende(r)"
+msgstr[1] "%d Genehmigende"
msgid "%d approver (you've approved)"
msgid_plural "%d approvers (you've approved)"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d Genehmigungsberechtigte(r) (Von dir genehmigt)"
+msgstr[1] "%d Genehmigende (von dir genehmigt)"
msgid "%d changed file"
msgid_plural "%d changed files"
@@ -139,8 +146,8 @@ msgstr[1] "%d geänderte Dateien"
msgid "%d character remaining"
msgid_plural "%d characters remaining"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d Zeichen übrig"
+msgstr[1] "%d Zeichen übrig"
msgid "%d child epic"
msgid_plural "%d child epics"
@@ -149,8 +156,8 @@ msgstr[1] ""
msgid "%d code quality issue"
msgid_plural "%d code quality issues"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d Code-Qualitätsproblem"
+msgstr[1] "%d Code-Qualitätsprobleme"
msgid "%d comment"
msgid_plural "%d comments"
@@ -159,13 +166,13 @@ msgstr[1] "%d Kommentare"
msgid "%d comment on this commit"
msgid_plural "%d comments on this commit"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d Kommentar zu diesem Commit"
+msgstr[1] "%d Kommentare zu diesem Commit"
msgid "%d commenter"
msgid_plural "%d commenters"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d Kommentator(in)"
+msgstr[1] "%d Kommentator(inn)en"
msgid "%d commit"
msgid_plural "%d commits"
@@ -174,13 +181,13 @@ msgstr[1] "%d Commits"
msgid "%d commit author"
msgid_plural "%d commit authors"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d Commit-Autor(in)"
+msgstr[1] "%d Commit-Autor(inn)en"
msgid "%d commit behind"
msgid_plural "%d commits behind"
-msgstr[0] "%d Commit hinterher"
-msgstr[1] "%d Commits hinterher"
+msgstr[0] ""
+msgstr[1] ""
msgid "%d commit,"
msgid_plural "%d commits,"
@@ -192,8 +199,8 @@ msgstr "%d Commits"
msgid "%d completed issue"
msgid_plural "%d completed issues"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d erledigtes Ticket"
+msgstr[1] "%d erledigte Tickets"
msgid "%d contribution"
msgid_plural "%d contributions"
@@ -202,13 +209,13 @@ msgstr[1] "%d Beiträge"
msgid "%d day"
msgid_plural "%d days"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d Tag"
+msgstr[1] "%d Tage"
msgid "%d epic"
msgid_plural "%d epics"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d Epic"
+msgstr[1] "%d Epics"
msgid "%d error"
msgid_plural "%d errors"
@@ -232,13 +239,13 @@ msgstr[1] "%d fehlgeschlagen"
msgid "%d failed security job"
msgid_plural "%d failed security jobs"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d fehlgeschlagener Sicherheitsjob"
+msgstr[1] "%d fehlgeschlagene Sicherheitsjobs"
msgid "%d file"
msgid_plural "%d files"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d Datei"
+msgstr[1] "%d Dateien"
msgid "%d fixed test result"
msgid_plural "%d fixed test results"
@@ -272,13 +279,13 @@ msgstr[1] "%d Tickets"
msgid "%d issue in this group"
msgid_plural "%d issues in this group"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d Ticket in dieser Gruppe"
+msgstr[1] "%d Tickets in dieser Gruppe"
msgid "%d issue successfully imported with the label"
msgid_plural "%d issues successfully imported with the label"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d Ticket erfolgreich mit dem Label importiert"
+msgstr[1] "%d Tickets erfolgreich mit dem Label importiert"
msgid "%d layer"
msgid_plural "%d layers"
@@ -332,8 +339,8 @@ msgstr[1] "%d persönliche Projekte werden entfernt und können nicht wiederherg
msgid "%d previously merged commit"
msgid_plural "%d previously merged commits"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d zuvor gemergeter Commit"
+msgstr[1] "%d zuvor gemergete Commits"
msgid "%d project"
msgid_plural "%d projects"
@@ -357,8 +364,8 @@ msgstr[1] "%d Sekunden"
msgid "%d shard selected"
msgid_plural "%d shards selected"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d Fragment ausgewählt"
+msgstr[1] "%d Fragmente ausgewählt"
msgid "%d tag"
msgid_plural "%d tags"
@@ -397,13 +404,13 @@ msgstr[1] ""
msgid "%d vulnerability updated"
msgid_plural "%d vulnerabilities updated"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d Sicherheitslücke aktualisiert"
+msgstr[1] "%d Sicheitslücken aktualisiert"
msgid "%d warning found:"
msgid_plural "%d warnings found:"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d Warnung gefunden:"
+msgstr[1] "%d Warnungen gefunden:"
msgid "%s additional commit has been omitted to prevent performance issues."
msgid_plural "%s additional commits have been omitted to prevent performance issues."
@@ -417,7 +424,7 @@ msgid "%{address} is an invalid IP address range"
msgstr ""
msgid "%{anchorOpen}Learn more%{anchorClose} about how you can customize / disable registration on your instance."
-msgstr ""
+msgstr "%{anchorOpen}Erfahre mehr%{anchorClose} darüber, wie du Registrierungen für diese Instanz anpassen / deaktivieren kannst."
msgid "%{author_link} cloned %{original_issue} to %{new_issue}."
msgstr ""
@@ -426,13 +433,13 @@ msgid "%{author_link} cloned %{original_issue}. You don't have access to the new
msgstr ""
msgid "%{author_link} wrote:"
-msgstr ""
+msgstr "%{author_link} schrieb:"
msgid "%{authorsName}'s thread"
msgstr "%{authorsName}s Unterhaltung"
msgid "%{board_target} not found"
-msgstr ""
+msgstr "%{board_target} nicht gefunden"
msgid "%{bold_start}%{count}%{bold_end} issue"
msgid_plural "%{bold_start}%{count}%{bold_end} issues"
@@ -455,8 +462,11 @@ msgstr ""
msgid "%{code_open}Protected:%{code_close} Only exposed to protected branches or tags."
msgstr ""
-msgid "%{commit_author_link} authored %{commit_timeago}"
-msgstr "%{commit_author_link} verfasste %{commit_timeago}"
+msgid "%{commit_author_link} authored %{commit_authored_timeago}"
+msgstr ""
+
+msgid "%{commit_author_link} authored %{commit_authored_timeago} and %{commit_committer_avatar} %{commit_committer_link} committed %{commit_committer_timeago}"
+msgstr ""
msgid "%{completedCount} completed weight"
msgstr ""
@@ -526,7 +536,7 @@ msgid "%{count} selected"
msgstr ""
msgid "%{count} total weight"
-msgstr ""
+msgstr "%{count} Gesamtgewichtung"
msgid "%{criticalStart}%{critical} Critical%{criticalEnd} %{highStart}%{high} High%{highEnd} and %{otherStart}%{otherMessage}%{otherEnd}"
msgstr ""
@@ -538,20 +548,29 @@ msgid "%{days} days until tags are automatically removed"
msgstr "%{days} Tage, bis Tags automatisch entfernt werden"
msgid "%{deployLinkStart}Use a template to deploy to ECS%{deployLinkEnd}, or use a docker image to %{commandsLinkStart}run AWS commands in GitLab CI/CD%{commandsLinkEnd}."
-msgstr ""
+msgstr "%{deployLinkStart}Verwende eine Vorlage für die Bereitstellung in ECS%{deployLinkEnd}oder ein Docker-Image, um %{commandsLinkStart}AWS-Befehle in GitLab CI / CD%{commandsLinkEnd}auszuführen."
msgid "%{description}- Sentry event: %{errorUrl}- First seen: %{firstSeen}- Last seen: %{lastSeen} %{countLabel}: %{count}%{userCountLabel}: %{userCount}"
msgstr "%{description}- Sentry-Event: %{errorUrl}- Zuerst gesehen: %{firstSeen}- Zuletzt gesehen: %{lastSeen} %{countLabel}: %{count}%{userCountLabel}: %{userCount}"
msgid "%{doc_link_start}Advanced search%{doc_link_end} is disabled since %{ref_elem} is not the default branch; %{default_branch_link_start}search on %{default_branch} instead%{default_branch_link_end}."
-msgstr ""
+msgstr "%{doc_link_start}Erweiterte Suche%{doc_link_end} ist deaktiviert, da %{ref_elem} nicht der Standard-Branch ist. %{default_branch_link_start}Suche auf %{default_branch} statt%{default_branch_link_end}."
msgid "%{doc_link_start}Advanced search%{doc_link_end} is enabled."
msgstr ""
-msgid "%{due_date} (Past due)"
+msgid "%{docs_link_start}Learn about visibility levels.%{docs_link_end}"
+msgstr ""
+
+msgid "%{docs_link_start}What is Large File Storage?%{docs_link_end}"
+msgstr ""
+
+msgid "%{docs_link_start}What is two-factor authentication?%{docs_link_end}"
msgstr ""
+msgid "%{due_date} (Past due)"
+msgstr "%{due_date} (überfällig)"
+
msgid "%{duration}ms"
msgstr "%{duration}ms"
@@ -592,7 +611,7 @@ msgid "%{global_id} is not a valid ID for %{expected_types}."
msgstr ""
msgid "%{group_name} activity"
-msgstr ""
+msgstr "%{group_name} Aktivität"
msgid "%{group_name} group members"
msgstr ""
@@ -601,52 +620,49 @@ msgid "%{group_name} uses group managed accounts. You need to create a new GitLa
msgstr "%{group_name} nutzt Accounts, die von einer Gruppe verwaltet werden. Du musst dir einen neuen GitLab-Account erstellen, welcher von %{group_name} verwaltet wird."
msgid "%{group_name}&%{epic_iid} &middot; created %{epic_created} by %{author}"
-msgstr ""
+msgstr "%{group_name}&%{epic_iid} &middot; erstellt %{epic_created} von %{author}"
msgid "%{hook_type} was deleted"
msgstr "%{hook_type} wurde gelöscht"
msgid "%{hook_type} was scheduled for deletion"
-msgstr ""
+msgstr "%{hook_type} wurde zum Löschen vorgemerkt"
msgid "%{host} sign-in from new location"
-msgstr ""
+msgstr "%{host} meldet sich von einem neuen Ort"
msgid "%{integrations_link_start}Integrations%{link_end} enable you to make third-party applications part of your GitLab workflow. If the available integrations don't meet your needs, consider using a %{webhooks_link_start}webhook%{link_end}."
-msgstr ""
+msgstr "%{integrations_link_start}Integrationen%{link_end} ermöglichen es dir, Anwendungen von Drittanbietern in deinen GitLab-Workflow aufzunehmen. Wenn die verfügbaren Integrationen nicht deinen Anforderungen entsprechen, solltest du einen %{webhooks_link_start}Webhook%{link_end} verwenden."
msgid "%{issuableType} will be removed! Are you sure?"
msgstr "%{issuableType} wird entfernt! Bist du sicher?"
msgid "%{issueType} actions"
-msgstr ""
-
-msgid "%{issuesCount} issues with a limit of %{maxIssueCount}"
-msgstr ""
+msgstr "%{issueType}-Aktionen"
msgid "%{issuesSize} with a limit of %{maxIssueCount}"
-msgstr ""
+msgstr "%{issuesSize} mit einem Limit von %{maxIssueCount}"
msgid "%{italic_start}What's new%{italic_end} is inactive and cannot be viewed."
-msgstr ""
+msgstr "%{italic_start}Neue Funktionen%{italic_end} ist inaktiv und kann nicht angezeigt werden."
msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
-msgstr ""
+msgstr "%{itemsCount} Tickets mit einem Limit von %{maxIssueCount}"
msgid "%{labelStart}Actual response:%{labelEnd} %{headers}"
-msgstr ""
+msgstr "%{labelStart}Tatsächliche Antwort:%{labelEnd} %{headers}"
msgid "%{labelStart}Assert:%{labelEnd} %{assertion}"
-msgstr ""
+msgstr "%{labelStart}Behauptung:%{labelEnd} %{assertion}"
msgid "%{labelStart}Class:%{labelEnd} %{class}"
-msgstr ""
+msgstr "%{labelStart}Klasse:%{labelEnd} %{class}"
msgid "%{labelStart}Crash Address:%{labelEnd} %{crash_address}"
msgstr ""
msgid "%{labelStart}Crash State:%{labelEnd} %{stacktrace_snippet}"
-msgstr ""
+msgstr "%{labelStart}Absturzzustand:%{labelEnd} %{stacktrace_snippet}"
msgid "%{labelStart}Evidence:%{labelEnd} %{evidence}"
msgstr ""
@@ -681,9 +697,15 @@ msgstr ""
msgid "%{label_for_message} unavailable"
msgstr "%{label_for_message} nicht verfügbar"
-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."
+msgid "%{learn_more_link}."
+msgstr ""
+
+msgid "%{lessThan} 1 hour"
msgstr ""
+msgid "%{lets_encrypt_link_start}Let's Encrypt%{lets_encrypt_link_end} is a free, automated, and open certificate authority (CA) that issues digital certificates to enable HTTPS (SSL/TLS) for sites."
+msgstr "%{lets_encrypt_link_start}Let's Encrypt%{lets_encrypt_link_end} ist eine freie, automatisierte und offene Zertifizierungsstelle (CA), die digitale Zertifikate vergibt, um HTTPS (SSL/TLS) für Webseiten zu ermöglichen."
+
msgid "%{level_name} is not allowed in a %{group_level_name} group."
msgstr "%{level_name} ist in einer %{group_level_name} -Gruppe nicht erlaubt."
@@ -691,43 +713,43 @@ msgid "%{level_name} is not allowed since the fork source project has lower visi
msgstr "%{level_name} ist nicht zulässig, da das Fork-Quellprojekt eine geringere Sichtbarkeit hat."
msgid "%{link_start}Learn more%{link_end} about roles."
-msgstr ""
-
-msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
-msgstr ""
+msgstr "%{link_start}Erfahre mehr%{link_end} über Rollenberechtigungen."
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
-msgstr ""
+msgstr "%{link_start}Entferne das %{draft_snippet} Präfix%{link_end} aus dem Titel, damit dieser Merge Request gemerged werden kann, wenn er bereit ist."
msgid "%{link_start}Start the title with %{draft_snippet}%{link_end} to prevent a merge request that is a work in progress from being merged before it's ready."
+msgstr "%{link_start}Beginne den Titel mit %{draft_snippet}%{link_end}, um zu verhindern, dass ein Merge Request, der noch in Arbeit ist, gemerged wird, bevor er fertig ist."
+
+msgid "%{link_start}What information does GitLab Inc. collect?%{link_end}"
msgstr ""
msgid "%{listToShow}, and %{awardsListLength} more"
-msgstr ""
+msgstr "%{listToShow} und %{awardsListLength} weitere"
msgid "%{location} is missing required keys: %{keys}"
-msgstr ""
+msgstr "%{location} fehlen erforderliche Schlüssel: %{keys}"
msgid "%{lock_path} is locked by GitLab User %{lock_user_id}"
msgstr "%{lock_path} ist durch Gitlab-Benutzer(in) %{lock_user_id} gesperrt"
msgid "%{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd} and %{quickActionsDocsLinkStart}quick actions%{quickActionsDocsLinkEnd} are supported"
-msgstr ""
+msgstr "%{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd} und %{quickActionsDocsLinkStart}Schnellaktionen%{quickActionsDocsLinkEnd} werden unterstützt"
msgid "%{mergeLength}/%{usersLength} can merge"
msgstr "%{mergeLength}/%{usersLength} können zusammenführen"
msgid "%{message} showing first %{warnings_displayed}"
-msgstr ""
+msgstr "%{message} zeigt zuerst %{warnings_displayed}"
msgid "%{milestone} (expired)"
-msgstr ""
+msgstr "%{milestone} (vergangen)"
msgid "%{milliseconds}ms"
-msgstr ""
+msgstr "%{milliseconds}ms"
msgid "%{model_name} not found"
-msgstr ""
+msgstr "%{model_name} nicht gefunden"
msgid "%{mrText}, this issue will be closed automatically."
msgstr "%{mrText}, dieses Ticket wird automatisch geschlossen werden."
@@ -739,7 +761,7 @@ msgid "%{name_with_link} namespace has run out of Shared Runner Pipeline minutes
msgstr ""
msgid "%{name} (Busy)"
-msgstr ""
+msgstr "%{name} (Beschäftigt)"
msgid "%{name} contained %{resultsString}"
msgstr "%{name} enthielt %{resultsString}"
@@ -748,10 +770,10 @@ msgid "%{name} found %{resultsString}"
msgstr "%{name} gefunden %{resultsString}"
msgid "%{name} is already being used for another emoji"
-msgstr ""
+msgstr "%{name} wird bereits für ein anderes Emoji verwendet"
msgid "%{name} is scheduled for %{action}"
-msgstr ""
+msgstr "%{name} ist geplant für %{action}"
msgid "%{name}'s avatar"
msgstr "Avatar von %{name}"
@@ -767,8 +789,8 @@ msgstr ""
msgid "%{no_of_days} day"
msgid_plural "%{no_of_days} days"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%{no_of_days} Tag"
+msgstr[1] "%{no_of_days} Tage"
msgid "%{number_commits_behind} commits behind %{default_branch}, %{number_commits_ahead} commits ahead"
msgstr "%{number_commits_behind} Commits hinter %{default_branch}, %{number_commits_ahead} Commits voraus"
@@ -833,10 +855,10 @@ msgid "%{retryButtonStart}Try again%{retryButtonEnd} or %{newFileButtonStart}att
msgstr ""
msgid "%{rotation} has been recalculated with the remaining participants. Please review the new setup for %{rotation_link}. It is recommended that you reach out to the current on-call responder to ensure continuity of on-call coverage."
-msgstr ""
+msgstr "%{rotation} wurde mit den verbliebenen Beteiligten neu errechnet. Bitte den neuen Stand von %{rotation_link} überprüfen. Wir empfehlen, sich mit den aktuellen Bereitschaftsverantwortlichen in Verbindung zu setzen, um eine kontinuierliche Anrufbereitschaft sicherzustellen."
msgid "%{rotation} has been recalculated with the remaining participants. Please review the new setup for %{rotation}. It is recommended that you reach out to the current on-call responder to ensure continuity of on-call coverage."
-msgstr ""
+msgstr "%{rotation} wurde mit den verbliebenen Beteiligten neu errechnet. Bitte die neue Einrichtung für %{rotation} überprüfen. Wir empfehlen, sich mit den aktuellen Bereitschaftsverantwortlichen in Verbindung zu setzen, um eine kontinuierliche Anrufbereitschaft sicherzustellen."
msgid "%{scope} results for term '%{term}'"
msgstr ""
@@ -854,7 +876,7 @@ msgid_plural "%{securityScanner} results are not available because a pipeline ha
msgstr[0] ""
msgstr[1] ""
-msgid "%{service_ping_link_start}Learn more%{service_ping_link_end} about what information is shared with GitLab Inc."
+msgid "%{service_ping_link_start}What information is shared with GitLab Inc.?%{service_ping_link_end}"
msgstr ""
msgid "%{size} %{unit}"
@@ -890,6 +912,9 @@ msgstr "%{start} bis %{end}"
msgid "%{state} epics"
msgstr "%{state} Epics"
+msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
+msgstr ""
+
msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
msgstr ""
@@ -949,11 +974,6 @@ msgstr ""
msgid "%{template_project_id} is unknown or invalid"
msgstr "%{template_project_id} ist unbekannt oder ungültig"
-msgid "%{text} %{files}"
-msgid_plural "%{text} %{files} files"
-msgstr[0] "%{text} %{files}"
-msgstr[1] "%{text} %{files} Dateien"
-
msgid "%{text} is available"
msgstr "%{text} ist verfügbar"
@@ -1038,9 +1058,6 @@ msgstr ""
msgid "%{wildcards_link_start}Wildcards%{wildcards_link_end} such as %{code_tag_start}v*%{code_tag_end} or %{code_tag_start}*-release%{code_tag_end} are supported."
msgstr ""
-msgid "&lt; 1 hour"
-msgstr ""
-
msgid "'%{data}' at %{location} does not match format: %{format}"
msgstr ""
@@ -1119,14 +1136,11 @@ msgid "(removed)"
msgstr "(entfernt)"
msgid "(revoked)"
-msgstr ""
+msgstr "(widerrufen)"
msgid "(we need your current password to confirm your changes)"
msgstr ""
-msgid "* * * * *"
-msgstr ""
-
msgid "+ %{amount} more"
msgstr "+ %{amount} weitere"
@@ -1193,10 +1207,10 @@ msgstr "- weniger anzeigen"
msgid "."
msgstr ""
-msgid "0 bytes"
+msgid "/"
msgstr ""
-msgid "0 for unlimited, only effective with remote storage enabled."
+msgid "0 bytes"
msgstr ""
msgid "0t1DgySidms"
@@ -1326,6 +1340,9 @@ msgstr "10-19 Beiträge"
msgid "1000+"
msgstr ""
+msgid "192.168.0.0/24"
+msgstr ""
+
msgid "1st contribution!"
msgstr "Erster Beitrag!"
@@ -1345,7 +1362,7 @@ msgid "3 hours"
msgstr "3 Stunden"
msgid "30 days"
-msgstr ""
+msgstr "30 Tage"
msgid "30 minutes"
msgstr "30 Minuten"
@@ -1369,13 +1386,13 @@ msgid "404|Please contact your GitLab administrator if you think this is a mista
msgstr "Bitte kontaktiere deine(n) GitLab-Administrator(in), wenn du denkst, dass dies ein Fehler ist."
msgid "7 days"
-msgstr ""
+msgstr "7 Tage"
msgid "8 hours"
msgstr "8 Stunden"
msgid ":%{startLine} to %{endLine}"
-msgstr ""
+msgstr ":%{startLine} bis %{endLine}"
msgid "A %{incident_docs_start}modified issue%{incident_docs_end} to guide the resolution of incidents."
msgstr ""
@@ -1429,16 +1446,16 @@ msgid "A different reason"
msgstr ""
msgid "A file has been changed."
-msgstr ""
+msgstr "Eine Datei wurde geändert."
msgid "A file was not found."
-msgstr ""
+msgstr "Eine Datei wurde nicht gefunden."
msgid "A file with '%{file_name}' already exists in %{branch} branch"
-msgstr ""
+msgstr "Eine Datei mit '%{file_name}' existiert bereits in %{branch} Branch"
msgid "A group is a collection of several projects"
-msgstr ""
+msgstr "Eine Gruppe ist eine Ansammlung mehrerer Projekte"
msgid "A group represents your organization in GitLab. Groups allow you to manage users and collaborate across multiple projects."
msgstr ""
@@ -1479,9 +1496,6 @@ msgstr ""
msgid "A plain HTML site that uses Netlify for CI/CD instead of GitLab, but still with all the other great GitLab features"
msgstr ""
-msgid "A plain-text response to show to clients that hit the rate limit."
-msgstr ""
-
msgid "A platform value can be web, mob or app."
msgstr ""
@@ -1489,7 +1503,7 @@ msgid "A project boilerplate for Salesforce App development with Salesforce Deve
msgstr ""
msgid "A project containing issues for each audit inquiry in the HIPAA Audit Protocol published by the U.S. Department of Health & Human Services"
-msgstr ""
+msgstr "Ein Projekt, das Tickets für jede Prüfanfrage im HIPAA-Prüfprotokoll enthält, das vom US-Gesundheitsministerium veröffentlicht wurde"
msgid "A project’s repository name defines its URL (the one you use to access the project via a browser) and its place on the file disk where GitLab is installed. %{link_start}Learn more.%{link_end}"
msgstr ""
@@ -1563,7 +1577,7 @@ msgstr ""
msgid "APIFuzzing|Configure HTTP basic authentication values. Other authentication methods are supported. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
+msgid "APIFuzzing|Customize your project's API fuzzing configuration options and copy the code snippet to your .gitlab-ci.yml file to apply any changes. Note that this tool does not reflect or update your .gitlab-ci.yml file automatically. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
msgstr ""
msgid "APIFuzzing|Enable authentication"
@@ -1626,9 +1640,6 @@ msgstr ""
msgid "APIFuzzing|To prevent a security leak, authentication info must be added as a %{ciVariablesLinkStart}CI variable%{ciVariablesLinkEnd}. As a user with maintainer access rights, you can manage CI variables in the %{ciSettingsLinkStart}Settings%{ciSettingsLinkEnd} area."
msgstr ""
-msgid "APIFuzzing|Use this tool to generate API fuzzing configuration YAML to copy into your .gitlab-ci.yml file. This tool does not reflect or update your .gitlab-ci.yml file automatically."
-msgstr ""
-
msgid "APIFuzzing|Username for basic authentication"
msgstr ""
@@ -1680,9 +1691,6 @@ msgstr "Missbrauchsmeldungen"
msgid "Abuse reports notification email"
msgstr ""
-msgid "Abuse reports will be sent to this address if it is set. Abuse reports are always available in the admin area."
-msgstr ""
-
msgid "Accept invitation"
msgstr "Einladung annehmen"
@@ -1717,6 +1725,9 @@ msgid "Access forbidden. Check your access level."
msgstr "Zugriff verboten. Überprüfe deine Zugriffsebene."
msgid "Access granted"
+msgstr "Zugriff gewährt"
+
+msgid "Access key ID"
msgstr ""
msgid "Access requests"
@@ -1725,6 +1736,9 @@ msgstr ""
msgid "Access to '%{classification_label}' not allowed"
msgstr "Zugriff auf '%{classification_label}' nicht erlaubt"
+msgid "Access tokens expire after 2 hours. A refresh token may be used at any time to generate a new access token. Non-expiring access tokens are deprecated. Clear this setting to enable backward compatibility."
+msgstr ""
+
msgid "AccessDropdown|Deploy Keys"
msgstr ""
@@ -1831,7 +1845,7 @@ msgid "Action to take when receiving an alert. %{docsLink}"
msgstr ""
msgid "Actions"
-msgstr ""
+msgstr "Aktionen"
msgid "Activate Service Desk"
msgstr "Service-Desk aktivieren"
@@ -1855,7 +1869,7 @@ msgid "Add"
msgstr "Hinzufügen"
msgid "Add \"%{value}\""
-msgstr ""
+msgstr "\"%{value}\" hinzufügen"
msgid "Add %{linkStart}assets%{linkEnd} to your Release. GitLab automatically includes read-only assets, like source code and release evidence."
msgstr ""
@@ -1963,7 +1977,7 @@ msgid "Add an impersonation token"
msgstr ""
msgid "Add another link"
-msgstr ""
+msgstr "Weiteren Link hinzufügen"
msgid "Add approval rule"
msgstr "Füge Zustimmungsregel hinzu"
@@ -1999,7 +2013,7 @@ msgid "Add deploy keys to grant read/write access to this repository. %{link_sta
msgstr ""
msgid "Add domain"
-msgstr ""
+msgstr "Domain hinzufügen"
msgid "Add email address"
msgstr "E-Mail-Adresse hinzufügen"
@@ -2023,7 +2037,7 @@ msgid "Add italic text"
msgstr "Kursiven Text hinzufügen"
msgid "Add key"
-msgstr ""
+msgstr "Schlüssel hinzufügen"
msgid "Add label(s)"
msgstr "Label(s) hinzufügen"
@@ -2037,6 +2051,9 @@ msgstr "Neue Anwendung hinzufügen"
msgid "Add new directory"
msgstr "Erstelle eine neues Verzeichnis"
+msgid "Add new service account"
+msgstr ""
+
msgid "Add or remove previously merged commits"
msgstr ""
@@ -2101,13 +2118,13 @@ msgid "Add users to group"
msgstr "Füge Benutzer(innen) zur Gruppe hinzu"
msgid "Add variable"
-msgstr ""
+msgstr "Variable hinzufügen"
msgid "Add webhook"
msgstr "Webhook hinzufügen"
msgid "Add/remove"
-msgstr ""
+msgstr "Hinzufügen/Entfernen"
msgid "AddContextCommits|Add previously merged commits"
msgstr ""
@@ -2274,6 +2291,9 @@ msgstr ""
msgid "AdminArea|Features"
msgstr ""
+msgid "AdminArea|Get security updates from GitLab and stay up to date"
+msgstr ""
+
msgid "AdminArea|Groups"
msgstr ""
@@ -2313,6 +2333,12 @@ msgstr ""
msgid "AdminArea|Reporter"
msgstr ""
+msgid "AdminArea|Sign up for the GitLab Security Newsletter to get notified for security updates."
+msgstr ""
+
+msgid "AdminArea|Sign up for the GitLab newsletter"
+msgstr ""
+
msgid "AdminArea|Stop all jobs"
msgstr "Alle Jobs stoppen"
@@ -2382,9 +2408,15 @@ msgstr ""
msgid "AdminSettings|Disable public access to Pages sites"
msgstr ""
+msgid "AdminSettings|Display a banner on merge requests in projects with no pipelines to initiate steps to add a .gitlab-ci.yml file."
+msgstr ""
+
msgid "AdminSettings|Domain verification is an essential security measure for public GitLab sites. Users are required to demonstrate they control a domain before it is enabled. %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "AdminSettings|Enable pipeline suggestion banner"
+msgstr ""
+
msgid "AdminSettings|Enable shared runners for new projects"
msgstr "'Shared Runners' für neue Projekte aktivieren"
@@ -2856,10 +2888,10 @@ msgstr ""
msgid "Admin|Quarterly reconciliation will occur on %{qrtlyDate}"
msgstr ""
-msgid "Admin|The number of max seats used for your namespace is currently exceeding the number of seats in your subscription. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgid "Admin|The number of max seats in your namespace exceeds the number of seats in your subscription. On %{qrtlyDate}, quarterly reconciliation occurs and you are automatically billed a prorated amount for the overage. No action is needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice. For more information about the timing of the invoicing process, view the documentation."
msgstr ""
-msgid "Admin|The number of maximum users for your instance is currently exceeding the number of users in license. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgid "Admin|The number of max users in your instance exceeds the number of users in your license. On %{qrtlyDate}, quarterly reconciliation occurs and you are automatically billed a prorated amount for the overage. No action is needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice. For more information about the timing of the invoicing process, view the documentation."
msgstr ""
msgid "Admin|View pending user approvals"
@@ -2880,9 +2912,6 @@ msgstr ""
msgid "Advanced export options"
msgstr ""
-msgid "Advanced permissions, Large File Storage and Two-Factor authentication settings."
-msgstr "Erweiterte Berechtigungen, Large File Storage und Einstellungen zur Zwei-Faktor-Authentifizierung."
-
msgid "After a successful password update you will be redirected to login screen."
msgstr "Nach dem erfolgreichen Ändern des Passwortes wirst du zum Anmeldebildschirm weitergeleitet."
@@ -2901,13 +2930,14 @@ msgstr ""
msgid "After you've reviewed these contribution guidelines, you'll be all set to"
msgstr ""
+msgid "Akismet"
+msgstr ""
+
msgid "Akismet API Key"
msgstr ""
-msgid "Alert"
-msgid_plural "Alerts"
-msgstr[0] "Alarm"
-msgstr[1] "Alarme"
+msgid "Akismet helps prevent the creation of spam issues in public projects."
+msgstr ""
msgid "AlertManagement|Acknowledged"
msgstr ""
@@ -3263,6 +3293,9 @@ msgstr ""
msgid "All (default)"
msgstr ""
+msgid "All GitLab"
+msgstr ""
+
msgid "All Members"
msgstr "Alle Mitglieder"
@@ -3377,6 +3410,9 @@ msgstr ""
msgid "Allow this secondary node to replicate content on Object Storage"
msgstr ""
+msgid "Allow use of licensed EE features"
+msgstr ""
+
msgid "Allow users to dismiss the broadcast message"
msgstr ""
@@ -3452,9 +3488,6 @@ msgstr ""
msgid "Amazon authentication is not %{link_start}correctly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
-msgid "Amount of time (in hours) that users are allowed to skip forced configuration of two-factor authentication"
-msgstr "Dauer (in Stunden), für die der/die Benutzer(in) die erzwungene Konfiguration der Zwei-Faktor-Authentifizierung überspringen darf"
-
msgid "An %{link_start}alert%{link_end} with the same fingerprint is already open. To change the status of this alert, resolve the linked alert."
msgstr ""
@@ -3515,12 +3548,6 @@ msgstr "Bei der Vorschau des Blobs ist ein Fehler aufgetreten"
msgid "An error occurred when removing the label."
msgstr ""
-msgid "An error occurred when toggling the notification subscription"
-msgstr "Beim Umschalten des Benachrichtigungs-Abonnements trat ein Fehler auf"
-
-msgid "An error occurred when updating the issue weight"
-msgstr "Beim Aktualisieren der Ticket-Gewichtung ist ein Fehler aufgetreten"
-
msgid "An error occurred when updating the title"
msgstr ""
@@ -3569,6 +3596,9 @@ msgstr ""
msgid "An error occurred while enabling Service Desk."
msgstr "Beim Aktivieren des Service-Desks ist ein Fehler aufgetreten."
+msgid "An error occurred while fetching Markdown preview"
+msgstr ""
+
msgid "An error occurred while fetching ancestors"
msgstr ""
@@ -3599,9 +3629,6 @@ msgstr "Beim Abrufen von Tickets ist ein Fehler aufgetreten."
msgid "An error occurred while fetching label colors."
msgstr "Beim Abrufen der Label-Farben ist ein Fehler aufgetreten."
-msgid "An error occurred while fetching markdown preview"
-msgstr "Beim Abrufen der Markdown-Vorschau ist ein Fehler aufgetreten"
-
msgid "An error occurred while fetching participants"
msgstr ""
@@ -3617,9 +3644,6 @@ msgstr "Beim Abrufen der Projekt-Autovervollständigung ist ein Fehler aufgetret
msgid "An error occurred while fetching reference"
msgstr ""
-msgid "An error occurred while fetching sidebar data"
-msgstr "Während des Abrufens der Daten für die Seitenleiste ist ein Fehler aufgetreten"
-
msgid "An error occurred while fetching tags. Retry the search."
msgstr ""
@@ -3695,6 +3719,9 @@ msgstr ""
msgid "An error occurred while loading merge requests."
msgstr ""
+msgid "An error occurred while loading projects."
+msgstr ""
+
msgid "An error occurred while loading the Needs tab."
msgstr ""
@@ -3929,12 +3956,6 @@ msgstr ""
msgid "Any Milestone"
msgstr ""
-msgid "Any branch"
-msgstr ""
-
-msgid "Any eligible user"
-msgstr ""
-
msgid "Any encrypted tokens"
msgstr "Alle verschlüsselten Tokens"
@@ -3953,6 +3974,9 @@ msgstr ""
msgid "Any namespace"
msgstr "Jeder Namensraum"
+msgid "App Engine description and apps that are suitable for this deployment target"
+msgstr ""
+
msgid "App ID"
msgstr "App ID"
@@ -4101,6 +4125,11 @@ msgstr "Angewendet"
msgid "Apply"
msgstr "Anwenden"
+msgid "Apply %d suggestion"
+msgid_plural "Apply %d suggestions"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Apply a label"
msgstr "Label hinzufügen"
@@ -4110,13 +4139,10 @@ msgstr ""
msgid "Apply suggestion"
msgstr "Vorschlag anwenden"
-msgid "Apply suggestions"
-msgstr ""
-
msgid "Apply template"
msgstr ""
-msgid "Apply this approval rule to any branch or a specific protected branch."
+msgid "Apply this approval rule to all branches or a specific protected branch."
msgstr ""
msgid "Applying"
@@ -4259,9 +4285,6 @@ msgstr ""
msgid "ApprovalSettings|Prevent editing approval rules in projects and merge requests."
msgstr ""
-msgid "ApprovalSettings|Prevent editing approval rules in projects and merge requests. "
-msgstr ""
-
msgid "ApprovalSettings|Remove all approvals when commits are added to the source branch."
msgstr ""
@@ -4277,6 +4300,9 @@ msgstr ""
msgid "ApprovalSettings|This setting is configured at the instance level and can only be changed by an administrator."
msgstr ""
+msgid "ApprovalSettings|This setting is configured in %{groupName} and can only be changed by an administrator or group owner."
+msgstr ""
+
msgid "ApprovalStatusTooltip|Adheres to separation of duties"
msgstr ""
@@ -4763,9 +4789,6 @@ msgstr "Mit GitHub authentifizieren"
msgid "Authenticated API rate limit period in seconds"
msgstr ""
-msgid "Authenticated API request rate limit"
-msgstr ""
-
msgid "Authenticated API requests"
msgstr ""
@@ -4775,10 +4798,10 @@ msgstr ""
msgid "Authenticated Git LFS request rate limit"
msgstr ""
-msgid "Authenticated web rate limit period in seconds"
+msgid "Authenticated Git LFS requests"
msgstr ""
-msgid "Authenticated web request rate limit"
+msgid "Authenticated web rate limit period in seconds"
msgstr ""
msgid "Authenticated web requests"
@@ -4869,7 +4892,7 @@ msgid "Auto DevOps enabled"
msgstr "Auto-DevOps aktiviert"
msgid "Auto stop successfully canceled."
-msgstr ""
+msgstr "Auto-Stop erfolgreich abgebrochen."
msgid "Auto-cancel redundant pipelines"
msgstr ""
@@ -5156,9 +5179,6 @@ msgstr ""
msgid "Below you will find all the groups that are public."
msgstr "Unten findest du alle Gruppen, die öffentlich sind."
-msgid "Beta"
-msgstr ""
-
msgid "Bi-weekly code coverage"
msgstr ""
@@ -5398,6 +5418,21 @@ msgstr "Blog"
msgid "Board scope affects which issues are displayed for anyone who visits this board"
msgstr "Der Board-Bereich beeinflusst, welche Themen für jeden angezeigt werden, der dieses Board besucht"
+msgid "BoardNewEpic|Groups"
+msgstr ""
+
+msgid "BoardNewEpic|Loading groups"
+msgstr ""
+
+msgid "BoardNewEpic|No matching results"
+msgstr ""
+
+msgid "BoardNewEpic|Search groups"
+msgstr ""
+
+msgid "BoardNewEpic|Select a group"
+msgstr ""
+
msgid "BoardNewIssue|No matching results"
msgstr ""
@@ -5475,6 +5510,9 @@ msgstr ""
msgid "Boards|An error occurred while creating the list. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching child groups. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching group projects. Please try again."
msgstr ""
@@ -5807,6 +5845,9 @@ msgstr "Parallelität von Massenanfragen"
msgid "Bulk update"
msgstr ""
+msgid "BulkImports|Re-import creates a new group. It does not sync with the existing group."
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -5816,6 +5857,9 @@ msgstr ""
msgid "BulkImport|From source group"
msgstr ""
+msgid "BulkImport|Group import history"
+msgstr ""
+
msgid "BulkImport|Import failed: Destination cannot be a subgroup of the source group. Change the destination and try again."
msgstr ""
@@ -5828,9 +5872,18 @@ msgstr ""
msgid "BulkImport|Importing the group failed"
msgstr ""
+msgid "BulkImport|Last imported to %{link}"
+msgstr ""
+
msgid "BulkImport|Name already exists."
msgstr ""
+msgid "BulkImport|New group"
+msgstr ""
+
+msgid "BulkImport|No history is available"
+msgstr ""
+
msgid "BulkImport|No parent"
msgstr ""
@@ -5843,6 +5896,9 @@ msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} matching filter \"%{filter}\" from %{link}"
msgstr ""
+msgid "BulkImport|Source group"
+msgstr ""
+
msgid "BulkImport|To new group"
msgstr ""
@@ -5852,6 +5908,9 @@ msgstr ""
msgid "BulkImport|You have no groups to import"
msgstr ""
+msgid "BulkImport|Your imported groups will appear here."
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -6094,6 +6153,9 @@ msgstr ""
msgid "Can be manually deployed to"
msgstr "Kann manuell bereitgestellt werden für"
+msgid "Can be overridden in each project."
+msgstr ""
+
msgid "Can create groups:"
msgstr ""
@@ -6196,6 +6258,9 @@ msgstr ""
msgid "Cancelling Preview"
msgstr "Schließe Vorschau"
+msgid "Cannot assign a confidential epic to a non-confidential issue. Make the issue confidential and try again"
+msgstr ""
+
msgid "Cannot be assigned to other projects."
msgstr ""
@@ -6247,9 +6312,6 @@ msgstr ""
msgid "Cannot refer to a group %{timebox_type} by an internal id!"
msgstr ""
-msgid "Cannot set confidential epic for a non-confidential issue"
-msgstr ""
-
msgid "Cannot show preview. For previews on sketch files, they must have the file format introduced by Sketch version 43 and above."
msgstr ""
@@ -6487,15 +6549,15 @@ msgstr "Überprüfe die Verfügbarkeit der Funktion im Namensraum"
msgid "Check out, review, and merge locally"
msgstr ""
-msgid "Check the %{docs_link_start}documentation%{docs_link_end}."
-msgstr "Lies die %{docs_link_start}Dokumentation%{docs_link_end}."
-
msgid "Check the current instance configuration "
msgstr ""
msgid "Check the elasticsearch.log file to debug why the migration was halted and make any changes before retrying the migration. When you fix the cause of the failure, click \"Retry migration\", and the migration will be scheduled to be retried in the background."
msgstr ""
+msgid "Check with your administrator."
+msgstr ""
+
msgid "Check your Docker images for known vulnerabilities."
msgstr ""
@@ -6526,6 +6588,9 @@ msgstr "Überprüfe Verfügbarkeit des Benutzernamens..."
msgid "Checkout"
msgstr ""
+msgid "Checkout|$%{selectedPlanPrice} per 10 GB storage per pack"
+msgstr ""
+
msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 minutes"
msgstr ""
@@ -6546,17 +6611,23 @@ msgstr ""
msgid "Checkout|%{name}'s GitLab subscription"
msgstr ""
-msgid "Checkout|%{selectedPlanText} plan"
+msgid "Checkout|%{name}'s storage subscription"
msgstr ""
-msgid "Checkout|%{startDate} - %{endDate}"
-msgstr "%{startDate} - %{endDate}"
+msgid "Checkout|%{quantity} GB of storage"
+msgstr ""
-msgid "Checkout|%{totalCiMinutes} CI minute"
-msgid_plural "Checkout|%{totalCiMinutes} CI minutes"
+msgid "Checkout|%{quantity} storage pack"
+msgid_plural "Checkout|%{quantity} storage packs"
msgstr[0] ""
msgstr[1] ""
+msgid "Checkout|%{selectedPlanText} plan"
+msgstr ""
+
+msgid "Checkout|%{startDate} - %{endDate}"
+msgstr "%{startDate} - %{endDate}"
+
msgid "Checkout|%{totalCiMinutes} CI minutes"
msgstr ""
@@ -6632,6 +6703,9 @@ msgstr ""
msgid "Checkout|Failed to register credit card. Please try again."
msgstr ""
+msgid "Checkout|GB"
+msgstr ""
+
msgid "Checkout|GitLab group"
msgstr ""
@@ -6668,6 +6742,9 @@ msgstr ""
msgid "Checkout|State"
msgstr "Status"
+msgid "Checkout|Storage packs"
+msgstr ""
+
msgid "Checkout|Street address"
msgstr ""
@@ -6689,6 +6766,9 @@ msgstr ""
msgid "Checkout|Total minutes: %{quantity}"
msgstr ""
+msgid "Checkout|Total storage: %{quantity} GB"
+msgstr ""
+
msgid "Checkout|Users"
msgstr ""
@@ -6698,16 +6778,25 @@ msgstr ""
msgid "Checkout|Your organization"
msgstr ""
+msgid "Checkout|Your storage subscription has the same term as your main subscription, and the price is prorated accordingly."
+msgstr ""
+
msgid "Checkout|Your subscription will be applied to this group"
msgstr ""
msgid "Checkout|Zip code"
msgstr ""
+msgid "Checkout|a storage subscription"
+msgstr ""
+
msgid "Checkout|company or team"
msgstr ""
-msgid "Checkout|x 1,000 minutes per pack = %{strong}"
+msgid "Checkout|minutes"
+msgstr ""
+
+msgid "Checkout|x %{quantity} %{units} per pack ="
msgstr ""
msgid "Cherry-pick this commit"
@@ -6765,7 +6854,7 @@ msgid "Choose labels"
msgstr ""
msgid "Choose specific groups or storage shards"
-msgstr ""
+msgstr "Wählen Sie bestimmte Gruppen oder Speicherfragmente aus"
msgid "Choose the preferred Runner and populate the AWS CFT."
msgstr ""
@@ -7064,6 +7153,9 @@ msgstr ""
msgid "CloneIssue|Cannot clone issue to target project as it is pending deletion."
msgstr ""
+msgid "CloneIssue|Cannot clone issues of '%{issue_type}' type."
+msgstr ""
+
msgid "Cloned this issue to %{path_to_project}."
msgstr ""
@@ -7074,7 +7166,7 @@ msgid "Close"
msgstr "Schließen"
msgid "Close %{issueType}"
-msgstr ""
+msgstr "%{issueType} schließen"
msgid "Close %{tabname}"
msgstr "Schließe %{tabname}"
@@ -7118,7 +7210,10 @@ msgstr ""
msgid "Closes this %{quick_action_target}."
msgstr "Schließt dieses %{quick_action_target}."
-msgid "Cloud licenses can not be removed."
+msgid "Cloud Functions description and apps that are suitable for this deployment target"
+msgstr ""
+
+msgid "Cloud Run description and apps that are suitable for this deployment target"
msgstr ""
msgid "Cluster"
@@ -7145,6 +7240,12 @@ msgstr ""
msgid "ClusterAgents|Access tokens"
msgstr ""
+msgid "ClusterAgents|Agent might not be connected to GitLab"
+msgstr ""
+
+msgid "ClusterAgents|Agent never connected to GitLab"
+msgstr ""
+
msgid "ClusterAgents|Alternative installation methods"
msgstr ""
@@ -7160,6 +7261,12 @@ msgstr ""
msgid "ClusterAgents|Configuration"
msgstr ""
+msgid "ClusterAgents|Connected"
+msgstr ""
+
+msgid "ClusterAgents|Connection status"
+msgstr ""
+
msgid "ClusterAgents|Copy token"
msgstr ""
@@ -7178,6 +7285,9 @@ msgstr ""
msgid "ClusterAgents|For alternative installation methods %{linkStart}go to the documentation%{linkEnd}."
msgstr ""
+msgid "ClusterAgents|For more troubleshooting information go to"
+msgstr ""
+
msgid "ClusterAgents|Go to the repository"
msgstr ""
@@ -7193,18 +7303,30 @@ msgstr ""
msgid "ClusterAgents|Integrate with the GitLab Agent"
msgstr ""
-msgid "ClusterAgents|Last used"
+msgid "ClusterAgents|Last connected %{timeAgo}."
+msgstr ""
+
+msgid "ClusterAgents|Last contact"
msgstr ""
msgid "ClusterAgents|Learn how to create an agent access token"
msgstr ""
+msgid "ClusterAgents|Make sure you are using a valid token."
+msgstr ""
+
msgid "ClusterAgents|Name"
msgstr ""
msgid "ClusterAgents|Never"
msgstr ""
+msgid "ClusterAgents|Never connected"
+msgstr ""
+
+msgid "ClusterAgents|Not connected"
+msgstr ""
+
msgid "ClusterAgents|Read more about getting started"
msgstr ""
@@ -7226,6 +7348,9 @@ msgstr ""
msgid "ClusterAgents|Select which Agent you want to install"
msgstr ""
+msgid "ClusterAgents|The Agent has not been connected in a long time. There might be a connectivity issue. Last contact was %{timeAgo}."
+msgstr ""
+
msgid "ClusterAgents|The GitLab Agent also requires %{linkStart}enabling the Agent Server%{linkEnd}"
msgstr ""
@@ -7253,9 +7378,6 @@ msgstr ""
msgid "ClusterAgents|You will need to create a token to connect to your agent"
msgstr ""
-msgid "ClusterAgent|This feature is only available for premium plans"
-msgstr ""
-
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -7445,9 +7567,6 @@ msgstr "Konnte Subnetzwerke nicht laden"
msgid "ClusterIntegration|Create Kubernetes cluster"
msgstr "Kubernetes-Cluster erstellen"
-msgid "ClusterIntegration|Create a provision role on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the account and external ID above. %{startMoreInfoLink}More information%{endLink}"
-msgstr ""
-
msgid "ClusterIntegration|Create cluster on"
msgstr "Cluster erstellen auf"
@@ -7880,7 +7999,7 @@ msgstr ""
msgid "ClusterIntegration|Subnets"
msgstr ""
-msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provisioned role, first create one on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the above account and external IDs. %{startMoreInfoLink}More information%{endLink}"
+msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provisioned role, first create one on %{awsLinkStart}Amazon Web Services %{awsLinkEnd} using the above account and external IDs. %{moreInfoStart}More information%{moreInfoEnd}"
msgstr ""
msgid "ClusterIntegration|The Kubernetes certificate used to authenticate to the cluster."
@@ -8114,6 +8233,9 @@ msgstr ""
msgid "Collapse replies"
msgstr ""
+msgid "Collapse settings section"
+msgstr ""
+
msgid "Collapse sidebar"
msgstr "Seitenleiste einklappen"
@@ -8132,6 +8254,9 @@ msgstr ""
msgid "Comma-separated list of email addresses."
msgstr ""
+msgid "Comma-separated list of users allowed to exceed the rate limit."
+msgstr ""
+
msgid "Comma-separated, e.g. '1.1.1.1, 2.2.2.0/24'"
msgstr ""
@@ -8452,6 +8577,9 @@ msgstr ""
msgid "Configure %{repository_checks_link_start}repository checks%{link_end} and %{housekeeping_link_start}housekeeping%{link_end} on repositories."
msgstr ""
+msgid "Configure CAPTCHAs, IP address limits, and other anti-spam measures."
+msgstr ""
+
msgid "Configure Dependency Scanning in `.gitlab-ci.yml` using the GitLab managed template. You can [add variable overrides](https://docs.gitlab.com/ee/user/application_security/dependency_scanning/#customizing-the-dependency-scanning-settings) to customize Dependency Scanning settings."
msgstr ""
@@ -8488,17 +8616,14 @@ msgstr "Tracing konfigurieren"
msgid "Configure a %{codeStart}.gitlab-webide.yml%{codeEnd} file in the %{codeStart}.gitlab%{codeEnd} directory to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
msgstr ""
-msgid "Configure existing installation"
-msgstr "Vorhandene Installation konfigurieren"
-
-msgid "Configure limit for notes created per minute by web and API requests."
+msgid "Configure advanced permissions, Large File Storage, and two-factor authentication settings."
msgstr ""
-msgid "Configure limits for Project/Group Import/Export."
+msgid "Configure approvals by authors and committers on all projects."
msgstr ""
-msgid "Configure limits for web and API requests."
-msgstr "Einschränkungen für Web- und API-Anfragen konfigurieren."
+msgid "Configure existing installation"
+msgstr "Vorhandene Installation konfigurieren"
msgid "Configure paths to be protected by Rack Attack."
msgstr ""
@@ -8512,10 +8637,13 @@ msgstr ""
msgid "Configure settings for Advanced Search with Elasticsearch."
msgstr ""
+msgid "Configure specific limits for Files API requests that supersede the general user and IP rate limits."
+msgstr ""
+
msgid "Configure specific limits for Git LFS requests that supersede the general user and IP rate limits."
msgstr ""
-msgid "Configure specific limits for Packages API requests that supersede the general user and IP rate limits."
+msgid "Configure specific limits for deprecated API requests that supersede the general user and IP rate limits."
msgstr ""
msgid "Configure the %{link} integration."
@@ -8527,6 +8655,9 @@ msgstr ""
msgid "Configure the way a user creates a new account."
msgstr "Konfiguriere, wie ein(e) Benutzer(in) ein neues Konto erstellt."
+msgid "Configure via Merge Request"
+msgstr ""
+
msgid "Configure which lists are shown for anyone who visits this board"
msgstr ""
@@ -8995,6 +9126,9 @@ msgstr ""
msgid "Content parsed with %{link}."
msgstr ""
+msgid "ContentEditor|Table of Contents"
+msgstr ""
+
msgid "ContentEditor|You have to provide a renderMarkdown function or a custom serializer"
msgstr ""
@@ -9181,6 +9315,9 @@ msgstr "Link kopieren"
msgid "Copy link to chart"
msgstr ""
+msgid "Copy prefix"
+msgstr ""
+
msgid "Copy reference"
msgstr ""
@@ -9211,6 +9348,9 @@ msgstr ""
msgid "Copy value"
msgstr ""
+msgid "Corpus Management"
+msgstr ""
+
msgid "Corpus Management|Are you sure you want to delete the corpus?"
msgstr ""
@@ -9439,6 +9579,9 @@ msgstr "Branch erstellen"
msgid "Create commit"
msgstr "Commit erstellen"
+msgid "Create common files more quickly, and standardize their format."
+msgstr ""
+
msgid "Create confidential merge request"
msgstr ""
@@ -9472,6 +9615,9 @@ msgstr ""
msgid "Create issue"
msgstr ""
+msgid "Create issue to resolve all threads"
+msgstr ""
+
msgid "Create iteration"
msgstr ""
@@ -9526,6 +9672,9 @@ msgstr ""
msgid "Create new..."
msgstr "Neu erstellen..."
+msgid "Create or import your first project"
+msgstr ""
+
msgid "Create project"
msgstr "Projekt anlegen"
@@ -9883,7 +10032,7 @@ msgstr ""
msgid "Custom notification events"
msgstr "Benutzerdefinierte Benachrichtigungsereignisse"
-msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notificationLinkStart} notification emails%{notificationLinkEnd}."
+msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notificationLinkStart}notification emails%{notificationLinkEnd}."
msgstr ""
msgid "Custom project templates"
@@ -10082,10 +10231,10 @@ msgid_plural "CycleAnalytics|Showing %{subjectFilterText} and %{selectedLabelsCo
msgstr[0] ""
msgstr[1] ""
-msgid "CycleAnalytics|Showing data for group '%{groupName}' and %{selectedProjectCount} projects from %{startDate} to %{endDate}"
+msgid "CycleAnalytics|Showing data for group '%{groupName}' and %{selectedProjectCount} projects from %{createdAfter} to %{createdBefore}"
msgstr ""
-msgid "CycleAnalytics|Showing data for group '%{groupName}' from %{startDate} to %{endDate}"
+msgid "CycleAnalytics|Showing data for group '%{groupName}' from %{createdAfter} to %{createdBefore}"
msgstr ""
msgid "CycleAnalytics|Stages"
@@ -10319,6 +10468,9 @@ msgstr ""
msgid "DastProfiles|Manage profiles"
msgstr ""
+msgid "DastProfiles|Manage site profiles"
+msgstr ""
+
msgid "DastProfiles|Minimum = 0 (no timeout enabled), Maximum = 2880 minutes"
msgstr ""
@@ -10394,6 +10546,9 @@ msgstr ""
msgid "DastProfiles|Scanner name"
msgstr ""
+msgid "DastProfiles|Schedule"
+msgstr ""
+
msgid "DastProfiles|Select branch"
msgstr ""
@@ -10463,7 +10618,7 @@ msgstr ""
msgid "DastProfiles|Website"
msgstr ""
-msgid "DastProfiles|You can either choose a passive scan or validate the target site in your chosen site profile. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
+msgid "DastProfiles|You can either choose a passive scan or validate the target site from the site profile management page. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
msgstr ""
msgid "DastProfiles|You cannot run an active scan against an unvalidated site."
@@ -10636,7 +10791,7 @@ msgstr ""
msgid "Days to merge"
msgstr ""
-msgid "Deactivate dormant users after 90 days of inactivity. Users can return to active status by signing in to their account. While inactive, a user is not counted as an active user in the instance."
+msgid "Deactivate dormant users after 90 days of inactivity"
msgstr ""
msgid "Dear Administrator,"
@@ -10723,10 +10878,10 @@ msgstr ""
msgid "Define a custom pattern with cron syntax"
msgstr "Erstelle ein benutzerdefiniertes Muster mittels Cron-Syntax"
-msgid "Define approval settings."
+msgid "Define approval rules."
msgstr ""
-msgid "Define approval settings. %{linkStart}Learn more.%{linkEnd}"
+msgid "Define approval rules. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "Define custom rules for what constitutes spam, independent of Akismet"
@@ -10735,7 +10890,7 @@ msgstr ""
msgid "Define environments in the deploy stage(s) in %{code_open}.gitlab-ci.yml%{code_close} to track deployments here."
msgstr ""
-msgid "Define how approval rules are applied as a merge request moves toward completion."
+msgid "Define how approval rules are applied to merge requests."
msgstr ""
msgid "Definition"
@@ -10750,6 +10905,12 @@ msgstr ""
msgid "DelayedJobs|Are you sure you want to run %{job_name} immediately? This job will run automatically after it's timer finishes."
msgstr "Bist du sicher, dass du %{job_name} sofort ausführen möchtest? Dieser Job wird automatisch nach Ablauf des Timers ausgeführt."
+msgid "DelayedJobs|Are you sure you want to run %{job_name} immediately? This job will run automatically after its timer finishes."
+msgstr ""
+
+msgid "DelayedJobs|Run the delayed job now?"
+msgstr ""
+
msgid "DelayedJobs|Start now"
msgstr "Jetzt starten"
@@ -11026,6 +11187,12 @@ msgstr ""
msgid "Dependency proxy image prefix"
msgstr ""
+msgid "DependencyProxy|Create a local proxy for storing frequently used upstream images. %{docLinkStart}Learn more%{docLinkEnd} about dependency proxies."
+msgstr ""
+
+msgid "DependencyProxy|Dependency Proxy"
+msgstr ""
+
msgid "DependencyProxy|Toggle Dependency Proxy"
msgstr ""
@@ -11266,6 +11433,9 @@ msgstr ""
msgid "Deployments"
msgstr ""
+msgid "Deployments to Google Kubernetes Engine can be "
+msgstr ""
+
msgid "Deployments|%{deployments} environment impacted."
msgid_plural "Deployments|%{deployments} environments impacted."
msgstr[0] ""
@@ -11295,6 +11465,9 @@ msgstr ""
msgid "Deployment|success"
msgstr ""
+msgid "Deprecated API rate limits"
+msgstr ""
+
msgid "Deprioritize label"
msgstr "Label entpriorisieren"
@@ -11697,6 +11870,16 @@ msgstr ""
msgid "DiffsCompareBaseBranch|(base)"
msgstr ""
+msgid "Diffs|%d addition"
+msgid_plural "Diffs|%d additions"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Diffs|%d deletion"
+msgid_plural "Diffs|%d deletions"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Diffs|No file name available"
msgstr "Kein Dateiname verfügbar"
@@ -11706,9 +11889,17 @@ msgstr ""
msgid "Diffs|Show all unchanged lines"
msgstr ""
+msgid "Diffs|Showing %{dropdownStart}%{count} changed file%{dropdownEnd}"
+msgid_plural "Diffs|Showing %{dropdownStart}%{count} changed files%{dropdownEnd}"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Diffs|Something went wrong while fetching diff lines."
msgstr "Etwas ging schief, während die Diff-Zeilen abgerufen wurden."
+msgid "Diffs|with %{additions} and %{deletions}"
+msgstr ""
+
msgid "Direct member"
msgstr ""
@@ -11834,9 +12025,6 @@ msgid_plural "Dismiss %d selected vulnerabilities as"
msgstr[0] ""
msgstr[1] ""
-msgid "Dismiss Value Stream Analytics introduction box"
-msgstr ""
-
msgid "Dismiss merge request promotion"
msgstr ""
@@ -12158,6 +12346,9 @@ msgstr ""
msgid "Edit issues"
msgstr "Tickets bearbeiten"
+msgid "Edit merge requests"
+msgstr ""
+
msgid "Edit public deploy key"
msgstr "Öffentlichen Bereitstellungsschlüssel bearbeiten"
@@ -12233,6 +12424,9 @@ msgstr ""
msgid "Elastic|None. Select projects to index."
msgstr "Keine. Wähle Projekte zum Indexieren aus."
+msgid "Eligible users"
+msgstr ""
+
msgid "Email"
msgstr "E-Mail"
@@ -12362,6 +12556,9 @@ msgstr ""
msgid "Enable"
msgstr "Aktivieren"
+msgid "Enable Amazon EKS integration"
+msgstr ""
+
msgid "Enable Auto DevOps"
msgstr "Auto-DevOps aktivieren"
@@ -12395,6 +12592,9 @@ msgstr ""
msgid "Enable SSL verification"
msgstr ""
+msgid "Enable Service Ping"
+msgstr ""
+
msgid "Enable Snowplow tracking"
msgstr ""
@@ -12425,6 +12625,9 @@ msgstr ""
msgid "Enable authenticated Git LFS request rate limit"
msgstr ""
+msgid "Enable authenticated web request rate limit"
+msgstr ""
+
msgid "Enable authentication"
msgstr ""
@@ -12485,7 +12688,7 @@ msgstr ""
msgid "Enable or disable the Pseudonymizer data collection."
msgstr "Aktiviere oder deaktiviere die Pseudonymizer-Datensammlung."
-msgid "Enable or disable version check and service ping."
+msgid "Enable or disable version check and Service Ping."
msgstr ""
msgid "Enable protected paths rate limit"
@@ -12497,18 +12700,12 @@ msgstr ""
msgid "Enable reCAPTCHA"
msgstr ""
-msgid "Enable reCAPTCHA for login"
-msgstr ""
-
-msgid "Enable reCAPTCHA, Invisible Captcha, Akismet and set IP limits. For reCAPTCHA, we currently only support %{recaptcha_v2_link_start}v2%{recaptcha_v2_link_end}"
+msgid "Enable reCAPTCHA for login."
msgstr ""
msgid "Enable repository checks"
msgstr ""
-msgid "Enable service ping"
-msgstr ""
-
msgid "Enable shared runners for all projects and subgroups in this group."
msgstr ""
@@ -12525,12 +12722,15 @@ msgid "Enable smartcn custom analyzer: Search"
msgstr ""
msgid "Enable two-factor authentication"
-msgstr ""
+msgstr "Zwei-Faktor-Authentifizierung aktivieren"
msgid "Enable unauthenticated API request rate limit"
msgstr ""
-msgid "Enable unauthenticated request rate limit"
+msgid "Enable unauthenticated web request rate limit"
+msgstr ""
+
+msgid "Enable user deactivation emails"
msgstr ""
msgid "Enable version check"
@@ -12566,9 +12766,6 @@ msgstr ""
msgid "Enabled sources for code import during project creation. OmniAuth must be configured for GitHub"
msgstr ""
-msgid "Enabling this will only make licensed EE features available to projects if the project namespace's plan includes the feature or if the project is public."
-msgstr ""
-
msgid "Encountered an error while rendering: %{err}"
msgstr ""
@@ -12617,9 +12814,6 @@ msgstr ""
msgid "Enter Admin Mode"
msgstr ""
-msgid "Enter IP address range"
-msgstr ""
-
msgid "Enter a number"
msgstr ""
@@ -12632,9 +12826,6 @@ msgstr ""
msgid "Enter at least three characters to search"
msgstr ""
-msgid "Enter domain"
-msgstr ""
-
msgid "Enter in your Bitbucket Server URL and personal access token below"
msgstr "Gib unten deine Bitbucket-Server-URL und deinen persönlichen Zugriffstoken ein"
@@ -12821,9 +13012,6 @@ msgstr "Bereitstellung"
msgid "Environments|Deployment %{status}"
msgstr ""
-msgid "Environments|Dismiss"
-msgstr ""
-
msgid "Environments|Enable review app"
msgstr ""
@@ -12836,9 +13024,6 @@ msgstr "Umgebungen"
msgid "Environments|Environments are places where code gets deployed, such as staging or production."
msgstr "Umgebungen sind Orte, an denen Code bereitgestellt wird, z. B. Staging oder Produktion."
-msgid "Environments|Help us improve environments"
-msgstr ""
-
msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
msgstr ""
@@ -12875,6 +13060,9 @@ msgstr ""
msgid "Environments|Note that this action will stop the environment, but it will %{emphasisStart}not%{emphasisEnd} have an effect on any existing deployment due to no “stop environment action†being defined in the %{ciConfigLinkStart}.gitlab-ci.yml%{ciConfigLinkEnd} file."
msgstr "Beachte, dass diese Aktion die Umgebung stoppen wird, es aber %{emphasisStart}keine%{emphasisEnd} Auswirkungen auf bestehende Bereitstellung haben wird, da keine \"stop environment action\" in der Datei %{ciConfigLinkStart}.gitlab-ci.yml%{ciConfigLinkEnd} definiert ist."
+msgid "Environments|Open"
+msgstr ""
+
msgid "Environments|Open live environment"
msgstr "Öffne Live-Umgebung"
@@ -12914,9 +13102,6 @@ msgstr "Umgebung stoppen"
msgid "Environments|Stopping %{environmentName}"
msgstr ""
-msgid "Environments|Take the survey"
-msgstr ""
-
msgid "Environments|There was an error fetching the logs. Please try again."
msgstr ""
@@ -12938,9 +13123,6 @@ msgstr "Aktualisiert"
msgid "Environments|You don't have any environments right now"
msgstr "Du hast momentan keine Umgebungen"
-msgid "Environments|Your feedback helps GitLab make environments better for you and other users. Participate and enter a sweepstake to win a USD 30 gift card."
-msgstr ""
-
msgid "Environments|by %{avatar}"
msgstr ""
@@ -13223,7 +13405,7 @@ msgstr ""
msgid "Error parsing CSV file. Please make sure it has"
msgstr ""
-msgid "Error rendering markdown preview"
+msgid "Error rendering Markdown preview"
msgstr ""
msgid "Error saving label update."
@@ -13271,6 +13453,9 @@ msgstr ""
msgid "Error: %{error_message}"
msgstr ""
+msgid "Error: Couldn't load some or all of the changes."
+msgstr ""
+
msgid "Error: No AWS credentials were supplied"
msgstr ""
@@ -13304,6 +13489,9 @@ msgstr ""
msgid "ErrorTracking|Enable error tracking"
msgstr ""
+msgid "ErrorTracking|Error tracking backend"
+msgstr ""
+
msgid "ErrorTracking|If you self-host Sentry, enter your Sentry instance's full URL. If you use Sentry's hosted solution, enter https://sentry.io"
msgstr ""
@@ -13337,6 +13525,12 @@ msgstr ""
msgid "Escalation policies must have at least one rule"
msgstr ""
+msgid "EscalationPolicies|%{clockIcon} IF alert is not %{alertStatus} in %{minutes}"
+msgstr ""
+
+msgid "EscalationPolicies|%{notificationIcon} THEN %{doAction} %{forScheduleOrUser}"
+msgstr ""
+
msgid "EscalationPolicies|+ Add an additional rule"
msgstr ""
@@ -13379,13 +13573,13 @@ msgstr ""
msgid "EscalationPolicies|Escalation policies"
msgstr ""
-msgid "EscalationPolicies|Escalation rules"
+msgid "EscalationPolicies|Escalation policy %{obstacle} in Project %{project}"
msgstr ""
-msgid "EscalationPolicies|Failed to load oncall-schedules"
+msgid "EscalationPolicies|Escalation rules"
msgstr ""
-msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} %{then} THEN %{doAction} %{scheduleOrUser}"
+msgid "EscalationPolicies|Failed to load oncall-schedules"
msgstr ""
msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} minutes"
@@ -13463,18 +13657,36 @@ msgstr ""
msgid "Every %{action} attempt has failed: %{job_error_message}. Please try again."
msgstr ""
+msgid "Every 3 months"
+msgstr ""
+
+msgid "Every 3 months on the %{day} at %{time} %{timezone}"
+msgstr ""
+
+msgid "Every 6 months"
+msgstr ""
+
+msgid "Every 6 months on the %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Every day"
msgstr ""
msgid "Every day (at %{time})"
msgstr ""
+msgid "Every day at %{time} %{timezone}"
+msgstr ""
+
msgid "Every month"
msgstr ""
msgid "Every month (Day %{day} at %{time})"
msgstr ""
+msgid "Every month on the %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Every three months"
msgstr ""
@@ -13489,6 +13701,15 @@ msgstr[1] ""
msgid "Every week (%{weekday} at %{time})"
msgstr ""
+msgid "Every week on %{day} at %{time} %{timezone}"
+msgstr ""
+
+msgid "Every year"
+msgstr ""
+
+msgid "Every year on %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Everyone"
msgstr ""
@@ -13525,9 +13746,6 @@ msgstr "Beweissammlung"
msgid "Exactly one of %{attributes} is required"
msgstr ""
-msgid "Example: %{ip_address}. %{read_more_link}."
-msgstr ""
-
msgid "Example: @sub\\.company\\.com$"
msgstr ""
@@ -13594,15 +13812,15 @@ msgstr ""
msgid "Expand pipeline"
msgstr ""
+msgid "Expand settings section"
+msgstr ""
+
msgid "Expand sidebar"
msgstr "Menüleiste ausklappen"
msgid "Expected documents: %{expected_documents}"
msgstr ""
-msgid "Experienced"
-msgstr ""
-
msgid "ExperimentSubject|Must have exactly one of User, Namespace, or Project."
msgstr ""
@@ -13885,9 +14103,6 @@ msgstr ""
msgid "Failed to load related branches"
msgstr ""
-msgid "Failed to load sidebar lock status"
-msgstr ""
-
msgid "Failed to load stacktrace."
msgstr ""
@@ -14312,6 +14527,9 @@ msgstr ""
msgid "Files"
msgstr "Dateien"
+msgid "Files API Rate Limits"
+msgstr ""
+
msgid "Files breadcrumb"
msgstr ""
@@ -15311,6 +15529,9 @@ msgstr ""
msgid "GitLab group: %{source_link}"
msgstr ""
+msgid "GitLab informs you if a new version is available."
+msgstr ""
+
msgid "GitLab is a complete DevOps platform, delivered as a single application, fundamentally changing the way Development, Security, and Ops teams collaborate"
msgstr ""
@@ -15326,7 +15547,7 @@ msgstr ""
msgid "GitLab is open source software to collaborate on code."
msgstr ""
-msgid "GitLab is undergoing maintenance and is operating in a read-only mode."
+msgid "GitLab is undergoing maintenance and is operating in read-only mode."
msgstr ""
msgid "GitLab member or Email address"
@@ -15338,9 +15559,6 @@ msgstr ""
msgid "GitLab project export"
msgstr "GitLab-Projekt exportieren"
-msgid "GitLab restart is required to apply changes."
-msgstr "GitLab-Neustart nötig, um Änderungen anzuwenden."
-
msgid "GitLab single sign-on URL"
msgstr ""
@@ -15356,9 +15574,6 @@ msgstr ""
msgid "GitLab version"
msgstr ""
-msgid "GitLab will inform you if a new version is available."
-msgstr ""
-
msgid "GitLab will run a background job that will produce pseudonymized CSVs of the GitLab database that will be uploaded to your configured object storage directory."
msgstr "GitLab wird einen Hintergrundjob ausführen, der pseudonymisierte CSVs der GitLab-Datenbank erzeugt, die in dein konfiguriertes Objektspeicherverzeichnis hochgeladen werden."
@@ -15623,9 +15838,21 @@ msgstr ""
msgid "Go to snippets"
msgstr ""
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check 'Allowed domains for sign-ups'."
+msgstr ""
+
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check 'Email restrictions for sign-ups'."
+msgstr ""
+
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check the 'Domain denylist'."
+msgstr ""
+
msgid "Go to the activity feed"
msgstr ""
+msgid "Go to the group’s 'Settings &gt; General' page, and check 'Restrict membership by email domain'."
+msgstr ""
+
msgid "Go to the milestone list"
msgstr ""
@@ -15662,6 +15889,12 @@ msgstr ""
msgid "Goal of the changes and what reviewers should be aware of"
msgstr ""
+msgid "Google Cloud"
+msgstr ""
+
+msgid "Google Cloud offers several deployment targets. Select the one most suitable for your project."
+msgstr ""
+
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
@@ -15746,9 +15979,6 @@ msgstr "Gruppen-Hooks"
msgid "Group ID"
msgstr "Gruppen-ID"
-msgid "Group ID: %{group_id}"
-msgstr ""
-
msgid "Group Owner must have signed in with SAML before enabling Group Managed Accounts"
msgstr ""
@@ -15923,6 +16153,12 @@ msgstr ""
msgid "GroupImport|Unable to process group import file"
msgstr ""
+msgid "GroupPage|Copy group ID"
+msgstr ""
+
+msgid "GroupPage|Group ID: %{group_id}"
+msgstr ""
+
msgid "GroupRoadmap|%{dateWord} – No end date"
msgstr ""
@@ -15977,6 +16213,9 @@ msgstr ""
msgid "GroupRoadmap|Within 3 years"
msgstr ""
+msgid "GroupSAML|\"persistent\" recommended"
+msgstr ""
+
msgid "GroupSAML|%{strongOpen}Warning%{strongClose} - Enabling %{linkStart}SSO enforcement%{linkEnd} can reduce security risks."
msgstr ""
@@ -16109,6 +16348,9 @@ msgstr ""
msgid "GroupSAML|To be able to prohibit outer forks, you first need to enforce dedicate group managed accounts."
msgstr ""
+msgid "GroupSAML|Use SAML group links to manage group membership using SAML."
+msgstr ""
+
msgid "GroupSAML|Valid SAML Response"
msgstr ""
@@ -16121,13 +16363,10 @@ msgstr ""
msgid "GroupSAML|as %{access_level}"
msgstr ""
-msgid "GroupSAML|must match stored NameID of \"%{extern_uid}\" as we use this to identify users. If the NameID changes users will be unable to sign in."
+msgid "GroupSAML|must match stored NameID of \"%{extern_uid}\" to identify user and allow sign in"
msgstr ""
-msgid "GroupSAML|should be \"persistent\""
-msgstr ""
-
-msgid "GroupSAML|should be a random persistent ID, emails are discouraged"
+msgid "GroupSAML|recommend persistent ID instead of email"
msgstr ""
msgid "GroupSelect|No matching results"
@@ -16142,9 +16381,15 @@ msgstr ""
msgid "GroupSettings|Allow project access token creation"
msgstr ""
+msgid "GroupSettings|Applied to all subgroups unless overridden by a group owner. Groups already added to the project lose access."
+msgstr ""
+
msgid "GroupSettings|Auto DevOps pipeline was updated for the group"
msgstr ""
+msgid "GroupSettings|Available only on the top-level group. Applies to all subgroups. Groups already shared with a group outside %{group} are still shared unless removed manually."
+msgstr ""
+
msgid "GroupSettings|Badges"
msgstr "Badges"
@@ -16196,6 +16441,9 @@ msgstr ""
msgid "GroupSettings|New runners registration token has been generated!"
msgstr ""
+msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgstr ""
+
msgid "GroupSettings|Pipeline settings was updated for the group"
msgstr "Pipeline-Einstellungen wurden für die Gruppe aktualisiert"
@@ -16208,12 +16456,15 @@ msgstr ""
msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
-msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups."
+msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups"
msgstr ""
msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
msgstr "Freigabe eines Projekts innerhalb %{group} mit anderen Gruppen verhindern"
+msgid "GroupSettings|Prevents group members from being notified if the group is mentioned."
+msgstr ""
+
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
msgstr ""
@@ -16250,21 +16501,6 @@ msgstr "Diese Einstellung wird auf %{ancestor_group} angewendet. Um Projekte in
msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}."
msgstr "Diese Einstellung wird auf %{ancestor_group} angewendet. Du kannst die Einstellung überschreiben oder %{remove_ancestor_share_with_group_lock}."
-msgid "GroupSettings|This setting is only available on the top-level group and it applies to all subgroups. Groups that have already been shared with a group outside %{group} will still be shared, and this access will have to be revoked manually."
-msgstr ""
-
-msgid "GroupSettings|This setting will be applied to all subgroups unless overridden by a group owner. Groups that already have access to the project will continue to have access unless removed manually."
-msgstr "Diese Einstellung wird auf alle Untergruppen angewendet, es sei denn, sie wird von einem/einer Gruppenbesitzer(in) überschrieben. Gruppen, die bereits Zugriff auf das Projekt haben, behalten diesen, bis sie manuell entfernt werden."
-
-msgid "GroupSettings|This setting will override user notification preferences for all members of the group, subgroups, and projects."
-msgstr ""
-
-msgid "GroupSettings|This setting will prevent group members from being notified if the group is mentioned."
-msgstr "Diese Einstellung verhindert, dass Gruppenmitglieder benachrichtigt werden, wenn die Gruppe erwähnt wird."
-
-msgid "GroupSettings|This setting will prevent group members from forking projects outside of the group."
-msgstr ""
-
msgid "GroupSettings|Transfer group"
msgstr ""
@@ -16382,7 +16618,7 @@ msgstr ""
msgid "GroupsNew|No import options available"
msgstr ""
-msgid "GroupsNew|Not all related objects are migrated, as %{docs_link_start}described here%{docs_link_end}. Please %{feedback_link_start}leave feedback%{feedback_link_end} on this feature."
+msgid "GroupsNew|Not all related objects are migrated. %{docs_link_start}More info%{docs_link_end}."
msgstr ""
msgid "GroupsNew|Personal access token"
@@ -16514,15 +16750,27 @@ msgstr "Problematisch"
msgid "Hello %{name},"
msgstr ""
-msgid "Hello there"
-msgstr ""
-
msgid "Hello, %{name}!"
msgstr ""
msgid "Hello, %{username}!"
msgstr ""
+msgid "HelloMessage|%{handshake_emoji} Contribute to GitLab: %{contribute_link}"
+msgstr ""
+
+msgid "HelloMessage|%{magnifier_emoji} Create a new GitLab issue: %{new_issue_link}"
+msgstr ""
+
+msgid "HelloMessage|%{rocket_emoji} We like your curiosity! Help us improve GitLab by joining the team: %{jobs_page_link}"
+msgstr ""
+
+msgid "HelloMessage|Does this page need fixes or improvements? Open an issue or contribute a merge request to help make GitLab more lovable. At GitLab, everyone can contribute!"
+msgstr ""
+
+msgid "HelloMessage|Welcome to GitLab!"
+msgstr ""
+
msgid "Help"
msgstr "Hilfe"
@@ -16532,13 +16780,10 @@ msgstr ""
msgid "Helps prevent bots from creating accounts."
msgstr "Hilft zu verhindern, dass Bots sich Konten erstellen."
-msgid "Helps prevent bots from creating issues"
+msgid "Helps prevent bots from creating issues."
msgstr ""
-msgid "Helps prevent malicious users hide their activity"
-msgstr ""
-
-msgid "Helps reduce request volume (e.g. from crawlers or abusive bots)"
+msgid "Helps prevent malicious users hide their activity."
msgstr ""
msgid "Helps reduce request volume (for example, from crawlers or abusive bots)"
@@ -16662,6 +16907,12 @@ msgstr "Bereinigung erfolgreich gestartet"
msgid "Housekeeping, export, path, transfer, remove, archive."
msgstr ""
+msgid "How do I configure Akismet?"
+msgstr ""
+
+msgid "How do I configure it?"
+msgstr ""
+
msgid "How do I configure runners?"
msgstr ""
@@ -16683,21 +16934,27 @@ msgstr ""
msgid "How do I set up this service?"
msgstr ""
+msgid "How do I use a web terminal?"
+msgstr ""
+
+msgid "How do I use file templates?"
+msgstr ""
+
msgid "How it works"
msgstr ""
msgid "How many days need to pass between marking entity for deletion and actual removing it."
msgstr ""
-msgid "How many seconds an IP will be counted towards the limit"
+msgid "How many seconds an IP counts toward the IP address limit."
+msgstr ""
+
+msgid "How the job limiter handles jobs exceeding the thresholds specified below. The 'track' mode only logs the jobs. The 'compress' mode compresses the jobs and raises an exception if the compressed size exceeds the limit."
msgstr ""
msgid "I accept the %{terms_link}"
msgstr "Ich akzeptiere die %{terms_link}"
-msgid "I accept the|Terms of Service and Privacy Policy"
-msgstr ""
-
msgid "I forgot my password"
msgstr ""
@@ -16779,13 +17036,16 @@ msgstr ""
msgid "IP Address"
msgstr "IP-Adresse"
-msgid "IP expiration time"
+msgid "IP address expiration time"
msgstr ""
-msgid "IP subnet restriction only allowed for top-level groups"
+msgid "IP address restrictions"
+msgstr ""
+
+msgid "IP addresses per user"
msgstr ""
-msgid "IPs per user"
+msgid "IP subnet restriction only allowed for top-level groups"
msgstr ""
msgid "Identifier"
@@ -16800,6 +17060,9 @@ msgstr "Identitäten"
msgid "If any indexed field exceeds this limit it will be truncated to this number of characters and the rest will not be indexed or searchable. This does not apply to repository and wiki indexing. Setting this to 0 means it is unlimited."
msgstr ""
+msgid "If blank, defaults to %{code_open}Retry later%{code_close}."
+msgstr ""
+
msgid "If blank, set allowable lifetime to %{instance_level_policy_in_words}, as defined by the instance admin. Once set, existing tokens for users in this group may be revoked."
msgstr ""
@@ -16851,6 +17114,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 did not initiate these sign-in attempts, please reach out to your administrator or enable two-factor authentication (2FA) on your account."
+msgstr ""
+
msgid "If you did not initiate this change, please contact your administrator immediately."
msgstr ""
@@ -16942,12 +17208,12 @@ msgstr ""
msgid "Import Projects from Gitea"
msgstr "Importiere Projekte von Gitea"
-msgid "Import a project"
-msgstr ""
-
msgid "Import an exported GitLab project"
msgstr "Importiere ein exportiertes GitLab-Projekt"
+msgid "Import and export rate limits"
+msgstr ""
+
msgid "Import failed due to a GitHub error: %{original}"
msgstr ""
@@ -16957,12 +17223,18 @@ msgstr ""
msgid "Import from Jira"
msgstr "Aus Jira importieren"
+msgid "Import group"
+msgstr ""
+
msgid "Import group from file"
msgstr ""
msgid "Import groups"
msgstr ""
+msgid "Import history"
+msgstr ""
+
msgid "Import in progress"
msgstr "Import wird durchgeführt"
@@ -17026,7 +17298,25 @@ msgstr "Importieren Sie Aufgaben aus Phabricator in Tickets"
msgid "Import timed out. Import took longer than %{import_jobs_expiration} seconds"
msgstr ""
-msgid "Import/Export Rate Limits"
+msgid "ImportAProjectModal|Import from a project"
+msgstr ""
+
+msgid "ImportAProjectModal|Import members from another project"
+msgstr ""
+
+msgid "ImportAProjectModal|Import project members"
+msgstr ""
+
+msgid "ImportAProjectModal|Only project members (not group members) are imported, and they get the same permissions as the project you import from."
+msgstr ""
+
+msgid "ImportAProjectModal|Successfully imported"
+msgstr ""
+
+msgid "ImportAProjectModal|Unable to import project members"
+msgstr ""
+
+msgid "ImportAProjectModal|You're importing members to the %{strongStart}%{name}%{strongEnd} project."
msgstr ""
msgid "ImportButtons|Connect repositories from"
@@ -17079,7 +17369,7 @@ msgstr[1] ""
msgid "Importing..."
msgstr ""
-msgid "Import|A repository URL usually ends in a .git suffix, although this is not required. Double check to make sure your repository URL is correct."
+msgid "Import|There is not a valid Git repository at this URL. If your HTTP repository is not publicly accessible, verify your credentials."
msgstr ""
msgid "Improve customer support with Service Desk"
@@ -17088,9 +17378,6 @@ msgstr ""
msgid "Improves Git cloning performance."
msgstr ""
-msgid "In %{time_to_now}"
-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 ""
@@ -17376,7 +17663,7 @@ msgstr ""
msgid "InProductMarketing|Start a GitLab Ultimate trial today in less than one minute, no credit card required."
msgstr ""
-msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no CC required"
+msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no credit card required"
msgstr ""
msgid "InProductMarketing|Start a trial"
@@ -17415,7 +17702,7 @@ msgstr ""
msgid "InProductMarketing|Team up in GitLab for greater efficiency"
msgstr ""
-msgid "InProductMarketing|Team work makes the dream work"
+msgid "InProductMarketing|Team work makes the dream work"
msgstr ""
msgid "InProductMarketing|Test, create, deploy"
@@ -17996,6 +18283,9 @@ msgstr ""
msgid "Integrations|Create new issue in Jira"
msgstr ""
+msgid "Integrations|Create new issue in ZenTao"
+msgstr ""
+
msgid "Integrations|Default settings are inherited from the group level."
msgstr ""
@@ -18089,9 +18379,15 @@ msgstr ""
msgid "Integrations|Search Jira issues"
msgstr ""
+msgid "Integrations|Search ZenTao issues"
+msgstr ""
+
msgid "Integrations|Send notifications about project events to Unify Circuit."
msgstr ""
+msgid "Integrations|Send notifications about project events to a Unify Circuit conversation. %{docs_link}"
+msgstr ""
+
msgid "Integrations|Sign in to add namespaces"
msgstr ""
@@ -18131,6 +18427,9 @@ msgstr ""
msgid "Integrations|You've activated every integration 🎉"
msgstr ""
+msgid "Integrations|ZenTao issues display here when you create issues in your project in ZenTao."
+msgstr ""
+
msgid "Interactive mode"
msgstr ""
@@ -18158,9 +18457,6 @@ msgstr ""
msgid "Interval Pattern"
msgstr "Intervallmuster"
-msgid "Introducing Value Stream Analytics"
-msgstr ""
-
msgid "Introducing Your DevOps Report"
msgstr ""
@@ -18257,6 +18553,12 @@ msgstr ""
msgid "Investigate vulnerability: %{title}"
msgstr ""
+msgid "Invisible Captcha"
+msgstr ""
+
+msgid "Invisible Captcha helps prevent the creation of spam accounts. It adds a honeypot field and time-sensitive form submission to the account signup form."
+msgstr ""
+
msgid "Invitation"
msgstr ""
@@ -18710,12 +19012,18 @@ msgstr ""
msgid "Issues"
msgstr "Tickets"
+msgid "Issues I've created"
+msgstr ""
+
msgid "Issues Rate Limits"
msgstr ""
msgid "Issues and merge requests"
msgstr ""
+msgid "Issues assigned to me"
+msgstr ""
+
msgid "Issues can be bugs, tasks or ideas to be discussed. Also, issues are searchable and filterable."
msgstr "Tickets können Bugs, Tasks oder zu diskutierende Ideen sein. Tickets sind darüber hinaus auch durchsuchbar und filterbar."
@@ -18827,7 +19135,7 @@ msgstr ""
msgid "Iterations|Create cadence"
msgstr ""
-msgid "Iterations|Create your first iteration"
+msgid "Iterations|Create iteration"
msgstr ""
msgid "Iterations|Delete cadence"
@@ -18836,6 +19144,9 @@ msgstr ""
msgid "Iterations|Delete iteration cadence?"
msgstr ""
+msgid "Iterations|Delete iteration?"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -18869,12 +19180,18 @@ msgstr ""
msgid "Iterations|New iteration cadence"
msgstr ""
+msgid "Iterations|No closed iterations."
+msgstr ""
+
msgid "Iterations|No iteration cadences to show."
msgstr ""
msgid "Iterations|No iterations in cadence."
msgstr ""
+msgid "Iterations|No open iterations."
+msgstr ""
+
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
@@ -18905,6 +19222,9 @@ msgstr ""
msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
msgstr ""
+msgid "Iterations|This will remove the iteration from any issues that are assigned to it."
+msgstr ""
+
msgid "Iterations|Title"
msgstr ""
@@ -18920,15 +19240,9 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "I’m familiar with the basics of DevOps."
-msgstr ""
-
msgid "I’m joining my team who’s already on GitLab"
msgstr ""
-msgid "I’m not familiar with the basics of DevOps."
-msgstr ""
-
msgid "Jaeger URL"
msgstr "Jaeger-URL"
@@ -19193,6 +19507,9 @@ msgstr ""
msgid "Job"
msgstr "Job"
+msgid "Job %{jobName}"
+msgstr ""
+
msgid "Job Failed #%{build_id}"
msgstr ""
@@ -19783,9 +20100,6 @@ msgstr ""
msgid "Learn more in the"
msgstr "Erfahre mehr in den"
-msgid "Learn more in the|pipeline schedules documentation"
-msgstr "Pipelineplanungsdokumentation"
-
msgid "Learn more."
msgstr ""
@@ -19897,9 +20211,6 @@ msgstr "Verlassen"
msgid "Leave Admin Mode"
msgstr ""
-msgid "Leave blank for no limit. Once set, existing personal access tokens may be revoked."
-msgstr ""
-
msgid "Leave edit mode? All unsaved changes will be lost."
msgstr ""
@@ -19945,10 +20256,10 @@ msgstr ""
msgid "LicenseCompliance|Acceptable license to be used in the project"
msgstr ""
-msgid "LicenseCompliance|Add a license"
+msgid "LicenseCompliance|Add license and related policy"
msgstr ""
-msgid "LicenseCompliance|Add license and related policy"
+msgid "LicenseCompliance|Add license policy"
msgstr ""
msgid "LicenseCompliance|Allow"
@@ -20038,6 +20349,9 @@ msgstr ""
msgid "LicenseManagement|Uncategorized"
msgstr ""
+msgid "Licensed Enterprise Edition features can be used if the project namespace's plan includes the feature, or if the project is public."
+msgstr ""
+
msgid "Licensed Features"
msgstr ""
@@ -20104,7 +20418,10 @@ msgstr ""
msgid "Limit namespaces and projects that can be indexed"
msgstr ""
-msgid "Limit sign in from multiple ips"
+msgid "Limit project size at a global, group, and project level. %{link_start}Learn more%{link_end}."
+msgstr ""
+
+msgid "Limit sign in from multiple IP addresses"
msgstr ""
msgid "Limit the number of concurrent operations this secondary site can run in the background."
@@ -20116,11 +20433,17 @@ msgstr ""
msgid "Limit the number of issues and epics per minute a user can create through web and API requests."
msgstr ""
+msgid "Limit the size of Sidekiq jobs stored in Redis."
+msgstr ""
+
msgid "Limited to showing %d event at most"
msgid_plural "Limited to showing %d events at most"
msgstr[0] "Anzeige beschränkt auf maximal %d Ereignis"
msgstr[1] "Anzeige beschränkt auf maximal %d Ereignisse"
+msgid "Limiting mode"
+msgstr ""
+
msgid "Line changes"
msgstr ""
@@ -20190,9 +20513,6 @@ msgstr "Verfügbare Repositories auflisten"
msgid "List of all merge commits"
msgstr ""
-msgid "List of users to be excluded from the limit"
-msgstr ""
-
msgid "List options"
msgstr ""
@@ -20232,9 +20552,6 @@ msgstr ""
msgid "Loading functions timed out. Please reload the page to try again."
msgstr ""
-msgid "Loading issues"
-msgstr ""
-
msgid "Loading more"
msgstr ""
@@ -20526,6 +20843,9 @@ msgstr ""
msgid "Marked For Deletion At - %{deletion_time}"
msgstr ""
+msgid "Marked as ready. Merging is now allowed."
+msgstr ""
+
msgid "Marked this %{noun} as a draft."
msgstr ""
@@ -20598,52 +20918,22 @@ msgstr ""
msgid "Max 100,000 events"
msgstr ""
-msgid "Max 20 characters"
-msgstr ""
-
-msgid "Max Group Export Download requests per minute per user"
-msgstr ""
-
-msgid "Max Group Export requests per minute per user"
-msgstr ""
-
-msgid "Max Group Import requests per minute per user"
-msgstr ""
-
-msgid "Max Project Export Download requests per minute per user"
-msgstr ""
-
-msgid "Max Project Export requests per minute per user"
-msgstr ""
-
-msgid "Max Project Import requests per minute per user"
-msgstr ""
-
-msgid "Max authenticated API requests per period per user"
-msgstr ""
-
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
-msgid "Max authenticated web requests per period per user"
-msgstr ""
-
msgid "Max file size is 200 KB."
msgstr ""
-msgid "Max requests per minute per user"
-msgstr ""
-
msgid "Max role"
msgstr ""
msgid "Max session time"
msgstr ""
-msgid "Max unauthenticated requests per period per IP"
+msgid "MaxBuilds"
msgstr ""
-msgid "MaxBuilds"
+msgid "Maximum 20 characters"
msgstr ""
msgid "Maximum Conan package file size in bytes"
@@ -20679,6 +20969,12 @@ msgstr ""
msgid "Maximum attachment size (MB)"
msgstr ""
+msgid "Maximum authenticated API requests per rate limit period per user"
+msgstr ""
+
+msgid "Maximum authenticated web requests per rate limit period per user"
+msgstr ""
+
msgid "Maximum bulk request size (MiB)"
msgstr ""
@@ -20724,6 +21020,15 @@ msgstr ""
msgid "Maximum files in a diff"
msgstr ""
+msgid "Maximum group export download requests per minute"
+msgstr ""
+
+msgid "Maximum group export requests per minute"
+msgstr ""
+
+msgid "Maximum group import requests per minute"
+msgstr ""
+
msgid "Maximum import size"
msgstr ""
@@ -20760,7 +21065,7 @@ msgstr ""
msgid "Maximum number of projects."
msgstr ""
-msgid "Maximum number of unique IPs per user"
+msgid "Maximum number of unique IP addresses per user."
msgstr ""
msgid "Maximum page reached"
@@ -20769,12 +21074,24 @@ msgstr "Maximale Seite erreicht"
msgid "Maximum page size"
msgstr ""
+msgid "Maximum project export download requests per minute"
+msgstr ""
+
+msgid "Maximum project export requests per minute"
+msgstr ""
+
+msgid "Maximum project import requests per minute"
+msgstr ""
+
msgid "Maximum push size"
msgstr ""
msgid "Maximum push size (MB)"
msgstr ""
+msgid "Maximum requests per minute"
+msgstr ""
+
msgid "Maximum running slices"
msgstr ""
@@ -20802,10 +21119,16 @@ msgstr ""
msgid "Maximum time between updates that a mirror can have when scheduled to synchronize."
msgstr ""
-msgid "Maximum time for web terminal websocket connection (in seconds). 0 for unlimited."
+msgid "Maximum time that users are allowed to skip the setup of two-factor authentication (in hours). Set to 0 (zero) to enforce at next sign in."
msgstr ""
-msgid "Maximum time that users are allowed to skip the setup of two-factor authentication (in hours). Set to 0 (zero) to enforce at next sign in."
+msgid "Maximum time, in seconds, for a web terminal websocket connection. 0 for unlimited."
+msgstr ""
+
+msgid "Maximum unauthenticated API requests per rate limit period per IP"
+msgstr ""
+
+msgid "Maximum unauthenticated web requests per rate limit period per IP"
msgstr ""
msgid "May"
@@ -20823,9 +21146,6 @@ msgstr ""
msgid "Medium vulnerabilities present"
msgstr ""
-msgid "Member lock"
-msgstr "Mitgliedersperre"
-
msgid "Member since"
msgstr ""
@@ -20862,6 +21182,9 @@ msgstr ""
msgid "Members of a group may only view projects they have permission to access"
msgstr ""
+msgid "Membership"
+msgstr ""
+
msgid "Members|%{time} by %{user}"
msgstr ""
@@ -20922,9 +21245,6 @@ msgstr ""
msgid "Members|Expiration date updated successfully."
msgstr ""
-msgid "Members|Expired"
-msgstr ""
-
msgid "Members|Filter members"
msgstr ""
@@ -20940,9 +21260,6 @@ msgstr ""
msgid "Members|Membership"
msgstr ""
-msgid "Members|No expiration set"
-msgstr ""
-
msgid "Members|Remove \"%{groupName}\""
msgstr ""
@@ -20964,9 +21281,6 @@ msgstr ""
msgid "Members|Search invited"
msgstr ""
-msgid "Members|in %{time}"
-msgstr ""
-
msgid "Member|Deny access"
msgstr ""
@@ -21042,9 +21356,6 @@ msgstr "Merge-Request"
msgid "Merge request %{mr_link} was reviewed by %{mr_author}"
msgstr ""
-msgid "Merge request (MR) approvals"
-msgstr ""
-
msgid "Merge request analytics"
msgstr ""
@@ -21066,12 +21377,21 @@ msgstr ""
msgid "Merge requests"
msgstr "Merge-Requests"
+msgid "Merge requests I've created"
+msgstr ""
+
msgid "Merge requests are a place to propose changes you've made to a project and discuss those changes with others"
msgstr "Merge-Requests dienen dazu, deine Änderungsvorschläge für ein Projekt einzureichen und sie mit anderen zu diskutieren"
msgid "Merge requests are read-only in a secondary Geo node"
msgstr ""
+msgid "Merge requests assigned to me"
+msgstr ""
+
+msgid "Merge requests that I'm a reviewer"
+msgstr ""
+
msgid "Merge the branch and fix any conflicts that come up"
msgstr ""
@@ -21132,10 +21452,10 @@ msgstr ""
msgid "MergeRequests|An error occurred while saving the draft comment."
msgstr "Beim Hinzufügen des Kommentarentwurfs ist ein Fehler aufgetreten."
-msgid "MergeRequests|Failed to squash. Should be done manually."
+msgid "MergeRequests|Create issue to resolve thread"
msgstr ""
-msgid "MergeRequests|Resolve this thread in a new issue"
+msgid "MergeRequests|Failed to squash. Should be done manually."
msgstr ""
msgid "MergeRequests|Saving the comment failed"
@@ -21949,6 +22269,9 @@ msgstr ""
msgid "MoveIssue|Cannot move issue to project it originates from!"
msgstr ""
+msgid "MoveIssue|Cannot move issues of '%{issue_type}' type."
+msgstr ""
+
msgid "Moved issue to %{label} column in the board."
msgstr ""
@@ -22074,6 +22397,15 @@ 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. To learn more about reducing storage capacity please visit our docs."
msgstr ""
+msgid "NamespaceUserCap|Pending users must be reviewed and approved by a group owner. Learn more about %{user_caps_link_start}User Caps%{link_end} and %{users_pending_approval_link_start}Users Pending Approval%{link_end}."
+msgstr ""
+
+msgid "NamespaceUserCap|View pending user approvals"
+msgstr ""
+
+msgid "NamespaceUserCap|Your group has reached its billable member limit"
+msgstr ""
+
msgid "Namespaces"
msgstr ""
@@ -22116,9 +22448,6 @@ msgstr ""
msgid "Network"
msgstr "Netzwerk"
-msgid "Network Policy|New rule"
-msgstr ""
-
msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is inbound from a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
msgstr ""
@@ -22140,16 +22469,13 @@ msgstr ""
msgid "NetworkPolicies|%{strongOpen}any%{strongClose} port"
msgstr ""
-msgid "NetworkPolicies|+ Add alert"
-msgstr ""
-
msgid "NetworkPolicies|.yaml"
msgstr ""
msgid "NetworkPolicies|.yaml mode"
msgstr ""
-msgid "NetworkPolicies|Actions"
+msgid "NetworkPolicies|Add alert"
msgstr ""
msgid "NetworkPolicies|Alerts are intended to be selectively used for a limited number of events that are potentially concerning and warrant a manual review. Alerts should not be used as a substitute for a SIEM or a logging tool. High volume alerts are likely to be dropped so as to preserve the stability of GitLab's integration with Kubernetes."
@@ -22185,9 +22511,6 @@ msgstr ""
msgid "NetworkPolicies|Deny all traffic"
msgstr ""
-msgid "NetworkPolicies|Description"
-msgstr ""
-
msgid "NetworkPolicies|Edit policy"
msgstr ""
@@ -22200,9 +22523,6 @@ msgstr ""
msgid "NetworkPolicies|IP/subnet"
msgstr ""
-msgid "NetworkPolicies|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
-msgstr ""
-
msgid "NetworkPolicies|Invalid or empty policy"
msgstr ""
@@ -22212,19 +22532,16 @@ msgstr ""
msgid "NetworkPolicies|Kubernetes error: %{error}"
msgstr ""
-msgid "NetworkPolicies|Name"
-msgstr ""
-
msgid "NetworkPolicies|Network"
msgstr ""
-msgid "NetworkPolicies|Network traffic"
+msgid "NetworkPolicies|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
msgstr ""
-msgid "NetworkPolicies|New policy"
+msgid "NetworkPolicies|Network policy can be created after the environment is loaded successfully."
msgstr ""
-msgid "NetworkPolicies|No policies detected"
+msgid "NetworkPolicies|Network traffic"
msgstr ""
msgid "NetworkPolicies|None selected"
@@ -22233,21 +22550,12 @@ msgstr ""
msgid "NetworkPolicies|Please %{installLinkStart}install%{installLinkEnd} and %{configureLinkStart}configure a Kubernetes Agent for this project%{configureLinkEnd} to enable alerts."
msgstr ""
-msgid "NetworkPolicies|Policies are a specification of how groups of pods are allowed to communicate with each other's network endpoints."
-msgstr ""
-
msgid "NetworkPolicies|Policy %{policyName} was successfully changed"
msgstr ""
msgid "NetworkPolicies|Policy definition"
msgstr ""
-msgid "NetworkPolicies|Policy editor"
-msgstr ""
-
-msgid "NetworkPolicies|Policy preview"
-msgstr ""
-
msgid "NetworkPolicies|Rule"
msgstr ""
@@ -22257,9 +22565,6 @@ msgstr ""
msgid "NetworkPolicies|Rule mode is unavailable for this policy. In some cases, we cannot parse the YAML file back into the rules editor."
msgstr ""
-msgid "NetworkPolicies|Rules"
-msgstr ""
-
msgid "NetworkPolicies|Save changes"
msgstr ""
@@ -22272,9 +22577,6 @@ msgstr ""
msgid "NetworkPolicies|Traffic that does not match any rule will be blocked."
msgstr ""
-msgid "NetworkPolicies|Unable to parse policy"
-msgstr ""
-
msgid "NetworkPolicies|all DNS names"
msgstr ""
@@ -22454,6 +22756,9 @@ msgstr "Neue Identität"
msgid "New issue"
msgstr "Neues Ticket"
+msgid "New issue in %{project}"
+msgstr ""
+
msgid "New issue title"
msgstr "Neuer Ticket-Titel"
@@ -22532,7 +22837,7 @@ msgstr "Neu..."
msgid "Newest first"
msgstr ""
-msgid "Newly registered users will by default be external"
+msgid "Newly-registered users are external by default"
msgstr ""
msgid "Next"
@@ -22847,8 +23152,10 @@ msgstr ""
msgid "No webhooks found, add one in the form above."
msgstr ""
-msgid "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} to renew your subscription."
-msgstr ""
+msgid "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} day to renew your subscription."
+msgid_plural "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} days to renew your subscription."
+msgstr[0] ""
+msgstr[1] ""
msgid "No. of commits"
msgstr ""
@@ -22865,7 +23172,7 @@ msgstr ""
msgid "Nodes"
msgstr "Knoten"
-msgid "Non-admin users can sign in with read-only access and make read-only API requests."
+msgid "Non-admin users are restricted to read-only access, in both GitLab UI and API."
msgstr ""
msgid "None"
@@ -22946,7 +23253,7 @@ msgstr "Hinweis: Ãœberlege dir, deine(n) GitLab Administrator(in) zu bitten, ein
msgid "NoteForm|Note"
msgstr ""
-msgid "Notes Rate Limits"
+msgid "Notes rate limit"
msgstr ""
msgid "Notes|Are you sure you want to cancel creating this comment?"
@@ -23113,9 +23420,6 @@ msgstr "Nov"
msgid "November"
msgstr "November"
-msgid "Novice"
-msgstr ""
-
msgid "Now, personalize your GitLab experience"
msgstr ""
@@ -23284,7 +23588,7 @@ msgstr ""
msgid "OnCallSchedules|For this rotation, on-call will be:"
msgstr ""
-msgid "OnCallSchedules|On-call schedule %{schedule} in Project %{project}"
+msgid "OnCallSchedules|On-call schedule %{obstacle} in Project %{project}"
msgstr ""
msgid "OnCallSchedules|On-call schedules"
@@ -23431,22 +23735,22 @@ msgstr ""
msgid "OnDemandScans|Scanner profile"
msgstr ""
-msgid "OnDemandScans|Select one of the existing profiles"
+msgid "OnDemandScans|Schedule scan"
msgstr ""
-msgid "OnDemandScans|Site profile"
+msgid "OnDemandScans|Select one of the existing profiles"
msgstr ""
-msgid "OnDemandScans|Use existing scanner profile"
+msgid "OnDemandScans|Site profile"
msgstr ""
-msgid "OnDemandScans|Use existing site profile"
+msgid "OnDemandScans|Start time"
msgstr ""
-msgid "OnDemandScans|You can either choose a passive scan or validate the target site in your chosen site profile. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
+msgid "OnDemandScans|Use existing scanner profile"
msgstr ""
-msgid "OnDemandScans|You cannot run an active scan against an unvalidated site."
+msgid "OnDemandScans|Use existing site profile"
msgstr ""
msgid "OnDemandScans|You must create a repository within your project to run an on-demand scan."
@@ -23511,6 +23815,9 @@ msgstr ""
msgid "Only admins can delete project"
msgstr ""
+msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
+msgstr ""
+
msgid "Only include features new to your current subscription tier."
msgstr ""
@@ -23529,6 +23836,12 @@ msgstr ""
msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
+msgid "Only reCAPTCHA v2 is supported:"
+msgstr ""
+
+msgid "Only users from the specified IP address ranges are able to reach this group, including all subgroups, projects, and Git repositories."
+msgstr ""
+
msgid "Only verified users with an email address in any of these domains can be added to the group."
msgstr ""
@@ -23715,9 +24028,6 @@ msgstr "Besitzer(in)"
msgid "Package Registry"
msgstr ""
-msgid "Package Registry Rate Limits"
-msgstr ""
-
msgid "Package Registry: authenticated API requests"
msgstr ""
@@ -23736,6 +24046,9 @@ msgstr ""
msgid "Package recipe already exists"
msgstr ""
+msgid "Package registry rate limits"
+msgstr ""
+
msgid "Package type"
msgstr ""
@@ -23802,6 +24115,9 @@ msgstr ""
msgid "PackageRegistry|Composer"
msgstr ""
+msgid "PackageRegistry|Composer.json with license: %{license} and version: %{version}"
+msgstr ""
+
msgid "PackageRegistry|Conan"
msgstr ""
@@ -23865,6 +24181,9 @@ msgstr ""
msgid "PackageRegistry|Copy require package include"
msgstr ""
+msgid "PackageRegistry|Copy target SHA"
+msgstr ""
+
msgid "PackageRegistry|Copy yarn command"
msgstr ""
@@ -23931,6 +24250,9 @@ msgstr ""
msgid "PackageRegistry|Install package version"
msgstr ""
+msgid "PackageRegistry|Instance-level"
+msgstr ""
+
msgid "PackageRegistry|Invalid Package: failed metadata extraction"
msgstr ""
@@ -23976,6 +24298,9 @@ msgstr ""
msgid "PackageRegistry|Pip Command"
msgstr ""
+msgid "PackageRegistry|Project-level"
+msgstr ""
+
msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
msgstr ""
@@ -23997,6 +24322,9 @@ msgstr ""
msgid "PackageRegistry|Remove package"
msgstr ""
+msgid "PackageRegistry|Required Python: %{pythonVersion}"
+msgstr ""
+
msgid "PackageRegistry|RubyGems"
msgstr ""
@@ -24039,6 +24367,9 @@ msgstr ""
msgid "PackageRegistry|Source project located at %{link}"
msgstr ""
+msgid "PackageRegistry|Target SHA: %{sha}"
+msgstr ""
+
msgid "PackageRegistry|There are no other versions of this package."
msgstr ""
@@ -24207,6 +24538,18 @@ msgstr ""
msgid "Password was successfully updated. Please sign in again."
msgstr ""
+msgid "PasswordPrompt|Confirm password"
+msgstr ""
+
+msgid "PasswordPrompt|Confirm password to continue"
+msgstr ""
+
+msgid "PasswordPrompt|Password is required"
+msgstr ""
+
+msgid "PasswordPrompt|Please enter your password to confirm"
+msgstr ""
+
msgid "Passwords should be unique and not used for any other sites or services."
msgstr ""
@@ -24234,6 +24577,9 @@ msgstr ""
msgid "Paste project path (i.e. gitlab-org/gitlab)"
msgstr ""
+msgid "Paste this DSN into your Sentry SDK"
+msgstr ""
+
msgid "Paste your public SSH key, which is usually contained in the file '~/.ssh/id_ed25519.pub' or '~/.ssh/id_rsa.pub' and begins with 'ssh-ed25519' or 'ssh-rsa'. Do not paste your private SSH key, as that can compromise your identity."
msgstr ""
@@ -24318,6 +24664,9 @@ msgstr ""
msgid "PerformanceBar|First Contentful Paint"
msgstr ""
+msgid "PerformanceBar|Flamegraph with mode:"
+msgstr ""
+
msgid "PerformanceBar|Frontend resources"
msgstr "Frontend-Ressourcen"
@@ -24351,6 +24700,15 @@ msgstr ""
msgid "PerformanceBar|Trace"
msgstr ""
+msgid "PerformanceBar|cpu"
+msgstr ""
+
+msgid "PerformanceBar|object"
+msgstr ""
+
+msgid "PerformanceBar|wall"
+msgstr ""
+
msgid "Period in seconds"
msgstr ""
@@ -24579,6 +24937,48 @@ msgstr "Ziel"
msgid "PipelineSchedules|Variables"
msgstr "Variablen"
+msgid "PipelineSource|API"
+msgstr ""
+
+msgid "PipelineSource|Chat"
+msgstr ""
+
+msgid "PipelineSource|External"
+msgstr ""
+
+msgid "PipelineSource|External Pull Request"
+msgstr ""
+
+msgid "PipelineSource|Merge Request"
+msgstr ""
+
+msgid "PipelineSource|On-Demand DAST Scan"
+msgstr ""
+
+msgid "PipelineSource|On-Demand DAST Validation"
+msgstr ""
+
+msgid "PipelineSource|Parent Pipeline"
+msgstr ""
+
+msgid "PipelineSource|Pipeline"
+msgstr ""
+
+msgid "PipelineSource|Push"
+msgstr ""
+
+msgid "PipelineSource|Schedule"
+msgstr ""
+
+msgid "PipelineSource|Trigger"
+msgstr ""
+
+msgid "PipelineSource|Web"
+msgstr ""
+
+msgid "PipelineSource|Web IDE"
+msgstr ""
+
msgid "PipelineStatusTooltip|Pipeline: %{ciStatus}"
msgstr ""
@@ -24879,46 +25279,7 @@ msgstr ""
msgid "Pipeline|Source"
msgstr ""
-msgid "Pipeline|Source|API"
-msgstr ""
-
-msgid "Pipeline|Source|Chat"
-msgstr ""
-
-msgid "Pipeline|Source|External"
-msgstr ""
-
-msgid "Pipeline|Source|External Pull Request"
-msgstr ""
-
-msgid "Pipeline|Source|Merge Request"
-msgstr ""
-
-msgid "Pipeline|Source|On-Demand DAST Scan"
-msgstr ""
-
-msgid "Pipeline|Source|On-Demand DAST Validation"
-msgstr ""
-
-msgid "Pipeline|Source|Parent Pipeline"
-msgstr ""
-
-msgid "Pipeline|Source|Pipeline"
-msgstr ""
-
-msgid "Pipeline|Source|Push"
-msgstr ""
-
-msgid "Pipeline|Source|Schedule"
-msgstr ""
-
-msgid "Pipeline|Source|Trigger"
-msgstr ""
-
-msgid "Pipeline|Source|Web"
-msgstr ""
-
-msgid "Pipeline|Source|Web IDE"
+msgid "Pipeline|Source|Security Policy"
msgstr ""
msgid "Pipeline|Specify variable values to be used in this run. The values specified in %{linkStart}CI/CD settings%{linkEnd} will be used by default."
@@ -24969,8 +25330,8 @@ msgstr ""
msgid "Pipeline|We are currently unable to fetch pipeline data"
msgstr ""
-msgid "Pipeline|You’re about to stop pipeline %{pipelineId}."
-msgstr "Du bist dabei die Pipeline %{pipelineId} zu stoppen."
+msgid "Pipeline|You’re about to stop pipeline #%{pipelineId}."
+msgstr ""
msgid "Pipeline|for"
msgstr ""
@@ -24996,6 +25357,9 @@ msgstr ""
msgid "Plain diff"
msgstr "Unformatierter Diff"
+msgid "Plain-text response to send to clients that hit a rate limit"
+msgstr ""
+
msgid "Plan:"
msgstr ""
@@ -25140,9 +25504,6 @@ msgstr ""
msgid "Please provide attributes to update"
msgstr ""
-msgid "Please provide your username or email address."
-msgstr ""
-
msgid "Please reach out if you have any questions and we'll be happy to assist."
msgstr ""
@@ -25185,9 +25546,6 @@ msgstr ""
msgid "Please set a new password before proceeding."
msgstr ""
-msgid "Please share your feedback about %{featureName} %{linkStart}in this issue%{linkEnd} to help us improve the experience."
-msgstr ""
-
msgid "Please solve the captcha"
msgstr ""
@@ -25365,6 +25723,9 @@ msgstr ""
msgid "Prevent adding new members to project membership within this group"
msgstr "Verhindere das Hinzufügen neuer Mitglieder zur Projektmitgliedschaft in dieser Gruppe"
+msgid "Prevent auto-stopping"
+msgstr ""
+
msgid "Prevent editing approval rules in projects and merge requests."
msgstr ""
@@ -25377,7 +25738,7 @@ msgstr ""
msgid "Prevent users from changing their profile name"
msgstr ""
-msgid "Prevent users from performing write operations on GitLab while performing maintenance."
+msgid "Prevent users from performing write operations while GitLab maintenance is in progress."
msgstr ""
msgid "Preview"
@@ -25650,6 +26011,9 @@ msgstr ""
msgid "Profiles|Enter your name, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Enter your password to confirm the email change"
+msgstr ""
+
msgid "Profiles|Enter your pronouns to let people know how to refer to you"
msgstr ""
@@ -25884,10 +26248,10 @@ msgstr "Dein Status"
msgid "Profiles|e.g. My MacBook key"
msgstr "z. B. Mein MacBook-Schlüssel"
-msgid "Profiles|username"
+msgid "Profiles|https://website.com"
msgstr ""
-msgid "Profiles|website.com"
+msgid "Profiles|username"
msgstr ""
msgid "Profiles|your account"
@@ -26130,9 +26494,21 @@ msgstr "Projekt ID: %{project_id}"
msgid "ProjectSelect| or group"
msgstr ""
+msgid "ProjectSelect|No matching results"
+msgstr ""
+
msgid "ProjectSelect|Search for project"
msgstr ""
+msgid "ProjectSelect|Search projects"
+msgstr ""
+
+msgid "ProjectSelect|Select a project"
+msgstr ""
+
+msgid "ProjectSelect|There was an error fetching the projects. Please try again."
+msgstr ""
+
msgid "ProjectService|Drone server URL"
msgstr ""
@@ -26220,6 +26596,9 @@ msgstr ""
msgid "ProjectService|Trigger event when a new, unique alert is recorded."
msgstr ""
+msgid "ProjectService|Trigger event when a new, unique vulnerability is recorded. (Note: This feature requires an Ultimate plan.)"
+msgstr ""
+
msgid "ProjectService|Trigger event when a pipeline status changes."
msgstr ""
@@ -26634,9 +27013,15 @@ msgstr ""
msgid "Projects are graded based on the highest severity vulnerability present"
msgstr ""
+msgid "Projects are organized into groups"
+msgstr ""
+
msgid "Projects contributed to"
msgstr ""
+msgid "Projects help you organize your work. They contain your file repository, issues, merge requests, and so much more."
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr "Geteilte Projekte mit %{group_name}"
@@ -26871,10 +27256,10 @@ msgstr ""
msgid "PrometheusService|Prometheus cluster integration"
msgstr ""
-msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
+msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
msgstr ""
-msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
+msgid "PrometheusService|The ID of the IAP-secured resource."
msgstr ""
msgid "PrometheusService|The Prometheus API base URL."
@@ -27492,6 +27877,9 @@ msgstr ""
msgid "Rate limit"
msgstr ""
+msgid "Rate limits can help reduce request volume (like from crawlers or abusive bots)."
+msgstr ""
+
msgid "Raw blob request rate limit per minute"
msgstr ""
@@ -27504,6 +27892,9 @@ msgstr ""
msgid "Re-authentication required"
msgstr ""
+msgid "Re-import"
+msgstr ""
+
msgid "Re-request review"
msgstr ""
@@ -27525,6 +27916,9 @@ msgstr ""
msgid "Read more about related issues"
msgstr ""
+msgid "Read their documentation."
+msgstr ""
+
msgid "Ready to get started with GitLab? Follow these steps to set up your workspace, plan and commit changes, and deploy your project."
msgstr ""
@@ -27558,6 +27952,9 @@ msgstr ""
msgid "Receive any notifications from GitLab."
msgstr ""
+msgid "Receive notification of abuse reports by email."
+msgstr ""
+
msgid "Receive notifications about your own activity"
msgstr ""
@@ -27701,9 +28098,6 @@ msgstr ""
msgid "Registry setup"
msgstr ""
-msgid "Regulate approvals by authors/committers. Affects all projects."
-msgstr ""
-
msgid "Reindexing Status: %{status} (Slice multiplier: %{multiplier}, Maximum running slices: %{max_slices})"
msgstr ""
@@ -27799,6 +28193,9 @@ msgstr ""
msgid "Release|Something went wrong while saving the release details."
msgstr ""
+msgid "Reload page"
+msgstr ""
+
msgid "Remediations"
msgstr ""
@@ -28081,6 +28478,9 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
+msgid "Repeats"
+msgstr ""
+
msgid "Replace"
msgstr ""
@@ -28443,10 +28843,7 @@ msgstr ""
msgid "Require additional authentication for administrative tasks."
msgstr ""
-msgid "Require all users in this group to setup Two-factor authentication"
-msgstr ""
-
-msgid "Require all users in this group to setup two-factor authentication"
+msgid "Require all users in this group to set up two-factor authentication"
msgstr ""
msgid "Required approvals (%{approvals_given} given)"
@@ -28492,6 +28889,9 @@ msgstr[1] ""
msgid "Requires values to meet regular expression requirements."
msgstr ""
+msgid "Requires you to deploy or set up cloud-hosted Sentry."
+msgstr ""
+
msgid "Requires your primary GitLab email address."
msgstr ""
@@ -28552,9 +28952,6 @@ msgstr ""
msgid "Resolve"
msgstr ""
-msgid "Resolve all threads in new issue"
-msgstr ""
-
msgid "Resolve conflicts"
msgstr ""
@@ -28612,6 +29009,9 @@ msgstr "Antwortmesswerte (NGINX)"
msgid "Response text"
msgstr ""
+msgid "Restart GitLab to apply changes."
+msgstr ""
+
msgid "Restart Terminal"
msgstr ""
@@ -28630,6 +29030,9 @@ msgstr ""
msgid "Restoring the project will prevent the project from being removed on this date and restore people's ability to make changes to it."
msgstr ""
+msgid "Restrict group access by IP address. %{link_start}Learn more%{link_end}."
+msgstr ""
+
msgid "Restrict membership by email domain"
msgstr ""
@@ -28943,6 +29346,9 @@ msgstr ""
msgid "Runners|Runner #%{runner_id}"
msgstr ""
+msgid "Runners|Runner assigned to project."
+msgstr ""
+
msgid "Runners|Runner is offline, last contact was %{runner_contact} ago"
msgstr ""
@@ -28955,6 +29361,9 @@ msgstr ""
msgid "Runners|Runner registration"
msgstr ""
+msgid "Runners|Runner unassigned from project."
+msgstr ""
+
msgid "Runners|Runners"
msgstr ""
@@ -29147,7 +29556,7 @@ msgstr ""
msgid "SastEntryPoints|How do I set up SAST?"
msgstr ""
-msgid "SastEntryPoints|Learn more."
+msgid "SastEntryPoints|Learn more"
msgstr ""
msgid "Satisfied"
@@ -29189,7 +29598,7 @@ msgstr ""
msgid "Save pipeline schedule"
msgstr "Zeitplan der Pipeline speichern"
-msgid "Save space and find images in the container Registry. remove unneeded tags and keep only the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
+msgid "Save storage space by automatically deleting tags from the container registry and keeping the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
msgstr ""
msgid "Saving"
@@ -29363,6 +29772,9 @@ msgstr "Suche oder filtere Ergebnisse..."
msgid "Search or filter results…"
msgstr "Suchen oder Ergebnisse filtern…"
+msgid "Search or jump to..."
+msgstr ""
+
msgid "Search project"
msgstr "Projekt suchen"
@@ -29423,16 +29835,16 @@ msgstr ""
msgid "SearchCodeResults|of %{link_to_project}"
msgstr ""
-msgid "SearchResults|Showing %{count} %{scope} for%{term_element}"
+msgid "SearchResults|Showing %{count} %{scope} for %{term_element}"
msgstr ""
-msgid "SearchResults|Showing %{count} %{scope} for%{term_element} in your personal and project snippets"
+msgid "SearchResults|Showing %{count} %{scope} for %{term_element} in your personal and project snippets"
msgstr ""
-msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for%{term_element}"
+msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for %{term_element}"
msgstr ""
-msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for%{term_element} in your personal and project snippets"
+msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for %{term_element} in your personal and project snippets"
msgstr ""
msgid "SearchResults|code result"
@@ -29514,6 +29926,9 @@ msgstr "Secret"
msgid "Secret Detection"
msgstr ""
+msgid "Secret access key"
+msgstr ""
+
msgid "Secret token"
msgstr ""
@@ -29553,9 +29968,6 @@ msgstr ""
msgid "SecurityApprovals|A merge request approval is required when the license compliance report contains a denied license."
msgstr ""
-msgid "SecurityApprovals|Configurable if security scanners are enabled. %{linkStart}Learn more.%{linkEnd}"
-msgstr ""
-
msgid "SecurityApprovals|Coverage-Check"
msgstr ""
@@ -29568,24 +29980,18 @@ msgstr ""
msgid "SecurityApprovals|Learn more about Vulnerability-Check"
msgstr ""
-msgid "SecurityApprovals|License Scanning must be enabled. %{linkStart}Learn more%{linkEnd}."
-msgstr ""
-
msgid "SecurityApprovals|License-Check"
msgstr ""
msgid "SecurityApprovals|Requires approval for Denied licenses. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}More information%{linkEnd}"
+msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "SecurityApprovals|Requires approval for vulnerabilities. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
-msgid "SecurityApprovals|Test coverage must be enabled. %{linkStart}Learn more%{linkEnd}."
-msgstr ""
-
msgid "SecurityApprovals|Vulnerability-Check"
msgstr ""
@@ -29649,6 +30055,12 @@ msgstr ""
msgid "SecurityConfiguration|Immediately begin risk analysis and remediation with application security features. Start with SAST and Secret Detection, available to all plans. Upgrade to Ultimate to get all features, including:"
msgstr ""
+msgid "SecurityConfiguration|Manage corpus"
+msgstr ""
+
+msgid "SecurityConfiguration|Manage corpus files used as mutation sources in coverage fuzzing."
+msgstr ""
+
msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
msgstr ""
@@ -29703,6 +30115,12 @@ msgstr ""
msgid "SecurityOrchestration|Action"
msgstr ""
+msgid "SecurityOrchestration|Actions"
+msgstr ""
+
+msgid "SecurityOrchestration|Add rule"
+msgstr ""
+
msgid "SecurityOrchestration|All policies"
msgstr ""
@@ -29736,9 +30154,6 @@ msgstr ""
msgid "SecurityOrchestration|Network"
msgstr ""
-msgid "SecurityOrchestration|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
-msgstr ""
-
msgid "SecurityOrchestration|New policy"
msgstr ""
@@ -29754,6 +30169,9 @@ msgstr ""
msgid "SecurityOrchestration|Policy editor"
msgstr ""
+msgid "SecurityOrchestration|Policy preview"
+msgstr ""
+
msgid "SecurityOrchestration|Policy status"
msgstr ""
@@ -29763,6 +30181,9 @@ msgstr ""
msgid "SecurityOrchestration|Rule"
msgstr ""
+msgid "SecurityOrchestration|Rules"
+msgstr ""
+
msgid "SecurityOrchestration|Scan Execution"
msgstr ""
@@ -29856,6 +30277,9 @@ msgstr ""
msgid "SecurityReports|Create issue"
msgstr ""
+msgid "SecurityReports|Development vulnerabilities"
+msgstr ""
+
msgid "SecurityReports|Dismiss vulnerability"
msgstr ""
@@ -29871,6 +30295,9 @@ msgstr ""
msgid "SecurityReports|Download results"
msgstr ""
+msgid "SecurityReports|Download scanned URLs"
+msgstr ""
+
msgid "SecurityReports|Download scanned resources"
msgstr ""
@@ -29994,6 +30421,9 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
+msgid "SecurityReports|The Vulnerability Report shows the results of the lastest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "SecurityReports|The security reports below contain one or more vulnerability findings that could not be parsed and were not recorded. Download the artifacts in the job output to investigate. Ensure any security report created conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
msgstr ""
@@ -30135,10 +30565,10 @@ msgstr "Grund auswählen"
msgid "Select a repository"
msgstr ""
-msgid "Select a role"
+msgid "Select a repository containing templates for common files."
msgstr ""
-msgid "Select a shared template repository for all projects on this instance."
+msgid "Select a role"
msgstr ""
msgid "Select a template repository"
@@ -30216,6 +30646,9 @@ msgstr "Wähle ein Projekt und eine Zone, um den Maschinentyp auszuwählen"
msgid "Select project to choose zone"
msgstr "Wähle ein Projekt aus, um die Zone auszuwählen"
+msgid "Select project to create issue"
+msgstr ""
+
msgid "Select projects"
msgstr ""
@@ -30333,6 +30766,9 @@ msgstr ""
msgid "Send emails to help guide new users through the onboarding process."
msgstr ""
+msgid "Send emails to users upon account deactivation."
+msgstr ""
+
msgid "Send message"
msgstr ""
@@ -30351,6 +30787,9 @@ msgstr ""
msgid "Send service data"
msgstr ""
+msgid "Sentry"
+msgstr ""
+
msgid "Sentry API URL"
msgstr ""
@@ -30465,6 +30904,9 @@ msgstr ""
msgid "Service"
msgstr ""
+msgid "Service Accounts keys are required to authorize GitLab to deploy your Google Cloud project."
+msgstr ""
+
msgid "Service Desk"
msgstr "Service-Desk"
@@ -30537,15 +30979,15 @@ msgstr ""
msgid "Set a password on your account to pull or push via %{protocol}."
msgstr "Lege ein Passwort für dein Konto fest, um mittels %{protocol} zu übertragen (push) oder abzurufen (pull)."
-msgid "Set a template repository for projects in this group"
-msgstr "Lege ein Vorlagen-Repository für Projekte in dieser Gruppe fest"
-
msgid "Set access permissions for this token."
msgstr ""
msgid "Set an instance-wide domain that will be available to all clusters when installing Knative."
msgstr ""
+msgid "Set any rate limit to %{code_open}0%{code_close} to disable the limit."
+msgstr ""
+
msgid "Set default and restrict visibility levels. Configure import sources and git access protocol."
msgstr "Lege die Standardeinstellungen fest und beschränke die Sichtbarkeitsstufen. Konfiguriere die Importquellen und das Git-Zugriffsprotokoll."
@@ -30558,8 +31000,8 @@ msgstr ""
msgid "Set limit to 0 to allow any file size."
msgstr ""
-msgid "Set max session time for web terminal."
-msgstr "Lege die maximale Sitzungszeit für das Web-Terminal fest."
+msgid "Set limits for web and API requests."
+msgstr ""
msgid "Set milestone"
msgstr ""
@@ -30567,15 +31009,18 @@ msgstr ""
msgid "Set new password"
msgstr ""
-msgid "Set notification email for abuse reports."
-msgstr "Benachrichtigungs-E-Mail für Missbrauchsberichte festlegen."
-
msgid "Set parent epic to an epic"
msgstr ""
+msgid "Set per-user rate limits for imports and exports of projects and groups."
+msgstr ""
+
msgid "Set projects and maximum size limits, session duration, user options, and check feature availability for namespace plan."
msgstr ""
+msgid "Set rate limits for package registry API requests that supersede the general user and IP rate limits."
+msgstr ""
+
msgid "Set severity"
msgstr ""
@@ -30594,15 +31039,24 @@ msgstr ""
msgid "Set the default branch for this project. All merge requests and commits are made against this branch unless you specify a different one."
msgstr ""
+msgid "Set the default expiration time for job artifacts in all projects. Set to %{code_open}0%{code_close} to never expire artifacts by default. If no unit is written, it defaults to seconds. For example, these are all equivalent: %{code_open}3600%{code_close}, %{code_open}60 minutes%{code_close}, or %{code_open}one hour%{code_close}."
+msgstr ""
+
msgid "Set the due date to %{due_date}."
msgstr ""
msgid "Set the iteration to %{iteration_reference}."
msgstr ""
+msgid "Set the maximum session time for a web terminal."
+msgstr ""
+
msgid "Set the milestone to %{milestone_reference}."
msgstr ""
+msgid "Set the per-user rate limit for notes created by web or API requests."
+msgstr ""
+
msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
msgstr ""
@@ -30754,7 +31208,7 @@ msgid "SeverityWidget|There was an error while updating severity."
msgstr ""
msgid "Shards to synchronize"
-msgstr ""
+msgstr "Zu synchronisierende Fragmente"
msgid "Share"
msgstr "Teilen"
@@ -30804,6 +31258,9 @@ msgstr ""
msgid "Show Pipeline IID"
msgstr ""
+msgid "Show all %{issuable_type}."
+msgstr ""
+
msgid "Show all activity"
msgstr ""
@@ -30855,15 +31312,9 @@ msgstr "Neuste Version zeigen"
msgid "Show list"
msgstr ""
-msgid "Show me advanced features"
-msgstr ""
-
msgid "Show me how to add a pipeline"
msgstr ""
-msgid "Show me the basics"
-msgstr ""
-
msgid "Show one file at a time"
msgstr ""
@@ -30904,15 +31355,15 @@ msgstr "Zeige %{limit} von %{total_count} Tickets. "
msgid "Showing %{pageSize} of %{total} %{issuableType}"
msgstr ""
-msgid "Showing %{pageSize} of %{total} issues"
-msgstr ""
-
msgid "Showing all epics"
msgstr ""
msgid "Showing all issues"
msgstr ""
+msgid "Showing data for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
+msgstr ""
+
msgid "Showing data for workflow items created in this date range. Date range cannot exceed %{maxDateRange} days."
msgstr ""
@@ -30952,6 +31403,15 @@ msgstr "Nur numerische Zeichen erlaubt"
msgid "Sidebar|Weight"
msgstr "Gewichtung"
+msgid "Sidekiq job compression threshold (bytes)"
+msgstr ""
+
+msgid "Sidekiq job size limit (bytes)"
+msgstr ""
+
+msgid "Sidekiq job size limits"
+msgstr ""
+
msgid "Sign in"
msgstr "Anmelden"
@@ -31072,6 +31532,9 @@ msgstr ""
msgid "Site profile not found for given parameters"
msgstr ""
+msgid "Sites"
+msgstr ""
+
msgid "Size"
msgstr "Größe"
@@ -31102,19 +31565,22 @@ msgstr "Die Slack-Integration ermöglicht es dir, mit GitLab über Slash-Befehle
msgid "SlackIntegration|Sends notifications about project events to Slack channels."
msgstr ""
-msgid "SlackService|2. Paste the %{strong_open}Token%{strong_close} into the field below"
+msgid "SlackService|1. %{slash_command_link_start}Add a slash command%{slash_command_link_end} in your Slack team using this information:"
msgstr ""
-msgid "SlackService|3. Select the %{strong_open}Active%{strong_close} checkbox, press %{strong_open}Save changes%{strong_close} and start using GitLab inside Slack!"
+msgid "SlackService|2. Paste the token from Slack in the %{strong_open}Token%{strong_close} field below."
msgstr ""
-msgid "SlackService|Fill in the word that works best for your team."
+msgid "SlackService|3. Select the %{strong_open}Active%{strong_close} checkbox, select %{strong_open}Save changes%{strong_close}, and start using slash commands in Slack!"
msgstr ""
-msgid "SlackService|See list of available commands in Slack after setting up this service, by entering"
+msgid "SlackService|After setup, get a list of available Slack slash commands by entering"
msgstr ""
-msgid "SlackService|This service allows users to perform common operations on this project by entering slash commands in Slack."
+msgid "SlackService|Fill in the word that works best for your team."
+msgstr ""
+
+msgid "SlackService|Perform common operations in this project by entering slash commands in Slack."
msgstr ""
msgid "Slice multiplier"
@@ -31180,7 +31646,7 @@ msgstr ""
msgid "Some child epics may be hidden due to applied filters"
msgstr ""
-msgid "Some common domains are not allowed. %{read_more_link}."
+msgid "Some common domains are not allowed. %{learn_more_link}."
msgstr ""
msgid "Some of the designs you tried uploading did not change:"
@@ -31264,9 +31730,6 @@ msgstr ""
msgid "Something went wrong while exporting requirements"
msgstr ""
-msgid "Something went wrong while fetching %{listType} list"
-msgstr "Etwas ist beim Laden der Liste %{listType} fehlgeschlagen"
-
msgid "Something went wrong while fetching branches"
msgstr ""
@@ -31321,15 +31784,9 @@ msgstr ""
msgid "Something went wrong while merging this merge request. Please try again."
msgstr ""
-msgid "Something went wrong while moving issues."
-msgstr ""
-
msgid "Something went wrong while obtaining the Let's Encrypt certificate."
msgstr ""
-msgid "Something went wrong while performing the action."
-msgstr ""
-
msgid "Something went wrong while promoting the issue to an epic. Please try again."
msgstr ""
@@ -31657,7 +32114,10 @@ msgstr ""
msgid "SourcegraphPreferences|Uses a custom %{linkStart}Sourcegraph instance%{linkEnd}."
msgstr ""
-msgid "Spam Check API Key"
+msgid "Spam Check"
+msgstr ""
+
+msgid "Spam Check API key"
msgstr ""
msgid "Spam Logs"
@@ -31675,8 +32135,8 @@ msgstr ""
msgid "Specified URL cannot be used: \"%{reason}\""
msgstr ""
-msgid "Specify an e-mail address regex pattern to identify default internal users."
-msgstr "Gib ein Regex-Muster für E-Mail-Adressen an, um interne Standardbenutzer(innen) zu identifizieren."
+msgid "Specify an email address regex pattern to identify default internal users."
+msgstr ""
msgid "Speed up your pipelines with Needs relationships"
msgstr ""
@@ -31691,7 +32151,7 @@ msgid "Squash commits"
msgstr "Squash Commits"
msgid "Stack trace"
-msgstr ""
+msgstr "Stack-Trace"
msgid "Stacktrace snippet"
msgstr ""
@@ -31930,7 +32390,7 @@ msgstr ""
msgid "StatusCheck|An error occurred fetching the status checks."
msgstr ""
-msgid "StatusCheck|Apply this status check to any branch or a specific protected branch."
+msgid "StatusCheck|Apply this status check to all branches or a specific protected branch."
msgstr ""
msgid "StatusCheck|Check for a status response in Merge Requests. Failures do not block merges. %{link_start}Learn more%{link_end}."
@@ -32269,6 +32729,9 @@ msgstr ""
msgid "Subscriptions"
msgstr ""
+msgid "Subscription|Your subscription for %{strong}%{namespace_name}%{strong_close} has expired and you are now on %{pricing_link_start}the GitLab Free tier%{pricing_link_end}. Don't worry, your data is safe. Get in touch with our support team (%{support_email}). They'll gladly help with your subscription renewal."
+msgstr ""
+
msgid "Subtracted"
msgstr ""
@@ -32497,6 +32960,9 @@ msgstr ""
msgid "SuperSonics|Plan"
msgstr ""
+msgid "SuperSonics|Please agree to the Subscription Agreement"
+msgstr ""
+
msgid "SuperSonics|Ready to get started? A GitLab plan is ideal for scaling organizations and for multi team usage."
msgstr ""
@@ -32527,6 +32993,9 @@ msgstr ""
msgid "SuperSonics|The activation code is not valid. Please make sure to copy it exactly from the Customers Portal or confirmation email. Learn more about %{linkStart}activating your subscription%{linkEnd}."
msgstr ""
+msgid "SuperSonics|The activation code should be a 24-character alphanumeric string"
+msgstr ""
+
msgid "SuperSonics|There is a connectivity issue."
msgstr ""
@@ -32569,9 +33038,15 @@ msgstr ""
msgid "SuperSonics|You do not have an active subscription"
msgstr ""
+msgid "SuperSonics|You have successfully added a license that activates on %{date}. Please see the subscription history table below for more details."
+msgstr ""
+
msgid "SuperSonics|You'll be charged for %{trueUpLinkStart}users over license%{trueUpLinkEnd} on a quarterly or annual basis, depending on the terms of your agreement."
msgstr ""
+msgid "SuperSonics|Your future dated license was successfully added"
+msgstr ""
+
msgid "SuperSonics|Your subscription"
msgstr ""
@@ -32824,7 +33299,7 @@ msgstr "Vorlage"
msgid "Template to append to all Service Desk issues"
msgstr ""
-msgid "TemplateRepository|Select a repository to make its templates available to all projects. %{link_start}What should the repository contain?%{link_end} "
+msgid "TemplateRepository|Create common files more quickly, and standardize their format."
msgstr ""
msgid "Templates"
@@ -33030,7 +33505,7 @@ msgstr ""
msgid "TestCases|Search test cases"
msgstr ""
-msgid "TestCases|Something went wrong while adding test case to Todo."
+msgid "TestCases|Something went wrong while adding test case to a to-do item."
msgstr ""
msgid "TestCases|Something went wrong while creating a test case."
@@ -33042,7 +33517,7 @@ msgstr ""
msgid "TestCases|Something went wrong while fetching test cases list."
msgstr ""
-msgid "TestCases|Something went wrong while marking test case todo as done."
+msgid "TestCases|Something went wrong while marking test case to-do item as done."
msgstr ""
msgid "TestCases|Something went wrong while moving test case."
@@ -33162,7 +33637,7 @@ msgstr ""
msgid "Thanks for your purchase!"
msgstr ""
-msgid "That is ok, I do not want to renew"
+msgid "That's OK, I don't want to renew"
msgstr ""
msgid "That's it, well done!"
@@ -33185,7 +33660,7 @@ msgid_plural "The %{type} contains the following errors:"
msgstr[0] ""
msgstr[1] ""
-msgid "The API key used by GitLab for accessing the Spam Check service endpoint"
+msgid "The API key used by GitLab for accessing the Spam Check service endpoint."
msgstr ""
msgid "The GitLab subscription service (customers.gitlab.com) is currently experiencing an outage. You can monitor the status and get updates at %{linkStart}status.gitlab.com%{linkEnd}."
@@ -33224,9 +33699,6 @@ msgstr ""
msgid "The URL to use for connecting to Elasticsearch. Use a comma-separated list to support clustering (e.g., \"http://localhost:9200, http://localhost:9201\")."
msgstr ""
-msgid "The Vulnerability Report shows the results of the last successful pipeline run on the default branch."
-msgstr ""
-
msgid "The X509 Certificate to use when mutual TLS is required to communicate with the external authorization service. If left blank, the server certificate is still validated when accessing over HTTPS."
msgstr "Das zu verwendende X.509-Zertifikat, wenn über MTLS mit dem externen Autorisierungsdienst kommunizieren muss. Wenn dieses Feld leer gelassen wird, wird das Serverzertifikat beim Zugriff über HTTPS weiterhin überprüft."
@@ -33284,9 +33756,6 @@ msgstr ""
msgid "The default branch for this project has been changed. Please update your bookmarks."
msgstr ""
-msgid "The default expiration time for job artifacts. 0 for unlimited. The default unit is in seconds, but you can use other units, for example %{code_open}4 mins 2 sec%{code_close}, %{code_open}2h42min%{code_close}."
-msgstr ""
-
msgid "The dependency list details information about the components used within your project."
msgstr ""
@@ -33478,9 +33947,6 @@ msgstr ""
msgid "The merge conflicts for this merge request have already been resolved. Please return to the merge request."
msgstr ""
-msgid "The merge request can now be merged."
-msgstr ""
-
msgid "The metric must be one of %{metrics}."
msgstr ""
@@ -33856,7 +34322,7 @@ msgstr ""
msgid "There was a problem updating the keep latest artifacts setting."
msgstr ""
-msgid "There was an error %{message} todo."
+msgid "There was an error %{message} to-do item."
msgstr ""
msgid "There was an error adding a To Do."
@@ -33895,6 +34361,9 @@ msgstr ""
msgid "There was an error fetching projects"
msgstr ""
+msgid "There was an error fetching search autocomplete suggestions"
+msgstr ""
+
msgid "There was an error fetching stage total counts"
msgstr ""
@@ -34219,6 +34688,9 @@ msgstr ""
msgid "This field is required."
msgstr ""
+msgid "This form is disabled in preview"
+msgstr ""
+
msgid "This group"
msgstr "Diese Gruppe"
@@ -34240,9 +34712,6 @@ msgstr ""
msgid "This group is linked to a subscription"
msgstr ""
-msgid "This group, including all subgroups, projects and git repositories, will be reachable from only the specified IP address ranges."
-msgstr ""
-
msgid "This group, its subgroups and projects has been scheduled for removal on %{date}."
msgstr ""
@@ -34522,9 +34991,6 @@ msgstr ""
msgid "This user cannot be unlocked manually from GitLab"
msgstr ""
-msgid "This user does not have a pending request"
-msgstr ""
-
msgid "This user has an unconfirmed email address (%{email}). You may force a confirmation."
msgstr ""
@@ -34633,9 +35099,6 @@ msgstr ""
msgid "ThreatMonitoring|Packet Activity"
msgstr ""
-msgid "ThreatMonitoring|Policies"
-msgstr ""
-
msgid "ThreatMonitoring|Requests"
msgstr ""
@@ -34687,6 +35150,12 @@ msgstr ""
msgid "ThreatMonitoring|View documentation"
msgstr ""
+msgid "Threshold in bytes at which to compress Sidekiq job arguments."
+msgstr ""
+
+msgid "Threshold in bytes at which to reject Sidekiq jobs. Set this to 0 to if you don't want to limit Sidekiq jobs."
+msgstr ""
+
msgid "Throughput"
msgstr ""
@@ -34696,6 +35165,9 @@ msgstr "Donnerstag"
msgid "Time"
msgstr ""
+msgid "Time (in hours) that users are allowed to skip forced configuration of two-factor authentication."
+msgstr ""
+
msgid "Time Spent"
msgstr ""
@@ -34762,7 +35234,7 @@ msgstr ""
msgid "TimeTrackingEstimated|Est"
msgstr "Geschätzt"
-msgid "TimeTracking|%{startTag}Spent: %{endTag}%{timeSpentHumanReadable}"
+msgid "TimeTracking|%{spentStart}Spent: %{spentEnd}"
msgstr ""
msgid "TimeTracking|Estimated:"
@@ -34976,6 +35448,9 @@ msgstr ""
msgid "To access this domain create a new DNS record"
msgstr ""
+msgid "To add a custom suffix, set up a Service Desk email address. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "To add an SSH key you need to %{generate_link_start}generate one%{link_end} or use an %{existing_link_start}existing key%{link_end}."
msgstr "Um einen SSH-Schlüssel hinzuzufügen, musst du %{generate_link_start}einen generieren%{link_end} oder einen %{existing_link_start}vorhandenen Schlüssel%{link_end} verwenden."
@@ -34997,13 +35472,16 @@ msgstr "Um GitHub-Repositories zu verbinden, musst du GitLab zunächst erlauben,
msgid "To connect an SVN repository, check out %{svn_link}."
msgstr "Um ein SVN-Repository zu verbinden, lies %{svn_link}."
+msgid "To continue using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
+msgstr ""
+
msgid "To continue, you need to select the link in the confirmation email we sent to verify your email address. If you didn't get our email, select %{strongStart}Resend confirmation email.%{strongEnd}"
msgstr ""
msgid "To define internal users, first enable new users set to external"
msgstr "Um interne Benutzer(innen) zu definieren, musst du zunächst externe Benutzer(innen) aktivieren"
-msgid "To enable Registration Features, make sure \"Enable service ping\" is checked."
+msgid "To enable Registration Features, first enable Service Ping."
msgstr ""
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
@@ -35030,8 +35508,8 @@ msgstr "Gib zunächst deine Gitea-Host-URL und einen %{link_to_personal_token} e
msgid "To get started, use the link below to confirm your account."
msgstr ""
-msgid "To help improve GitLab and its user experience, GitLab will periodically collect usage information."
-msgstr "Zur Verbesserung von GitLab und seiner Benutzererfahrung sammelt GitLab regelmäßig Nutzungsinformationen."
+msgid "To help improve GitLab and its user experience, GitLab periodically collects usage information."
+msgstr ""
msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
msgstr ""
@@ -35063,7 +35541,7 @@ msgstr ""
msgid "To preserve performance only %{strong_open}%{display_size} of %{real_size}%{strong_close} files are displayed."
msgstr ""
-msgid "To protect this issue's confidentiality, %{forkLink} and set the fork's visibility to private."
+msgid "To protect this issue's confidentiality, %{linkStart}fork this project%{linkEnd} and set the fork's visibility to private."
msgstr ""
msgid "To protect this issue's confidentiality, a private fork of this project was selected."
@@ -35096,12 +35574,15 @@ msgstr ""
msgid "To set up SAML authentication for your group through an identity provider like Azure, Okta, Onelogin, Ping Identity, or your custom SAML 2.0 provider:"
msgstr "So richtest du die SAML-Authentifizierung für deine Gruppe über einen Identitätsanbieter wie Azure, Okta, Onelogin, Ping Identity oder deinen benutzerdefinierten SAML 2.0-Anbieter ein:"
-msgid "To set up this service:"
+msgid "To set up this integration:"
msgstr ""
msgid "To specify the notification level per project of a group you belong to, you need to visit project page and change notification level there."
msgstr ""
+msgid "To start using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
+msgstr ""
+
msgid "To unsubscribe from this issue, please paste the following link into your browser:"
msgstr ""
@@ -35552,7 +36033,7 @@ msgid "Twitter:"
msgstr ""
msgid "Two-Factor Authentication"
-msgstr ""
+msgstr "Zwei-Faktor-Authentifizierung"
msgid "Two-Factor Authentication code"
msgstr ""
@@ -35689,9 +36170,6 @@ msgstr ""
msgid "Unable to fetch branches list, please close the form and try again"
msgstr ""
-msgid "Unable to fetch unscanned projects"
-msgstr ""
-
msgid "Unable to fetch vulnerable projects"
msgstr ""
@@ -35746,6 +36224,15 @@ msgstr "Dieses Epic kann gerade nicht aktualisiert werden."
msgid "Unable to update this issue at this time."
msgstr "Dieses Ticket kann gerade nicht aktualisiert werden."
+msgid "Unapprove a merge request"
+msgstr ""
+
+msgid "Unapprove the current merge request."
+msgstr ""
+
+msgid "Unapproved the current merge request."
+msgstr ""
+
msgid "Unarchive project"
msgstr ""
@@ -35758,16 +36245,13 @@ msgstr ""
msgid "Unassigned"
msgstr ""
-msgid "Unauthenticated API request rate limit"
-msgstr ""
-
-msgid "Unauthenticated rate limit period in seconds"
+msgid "Unauthenticated API rate limit period in seconds"
msgstr ""
-msgid "Unauthenticated request rate limit"
+msgid "Unauthenticated requests"
msgstr ""
-msgid "Unauthenticated requests"
+msgid "Unauthenticated web rate limit period in seconds"
msgstr ""
msgid "Undo"
@@ -35869,18 +36353,6 @@ msgstr ""
msgid "Unresolved"
msgstr ""
-msgid "UnscannedProjects|15 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|30 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|5 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|60 or more days"
-msgstr ""
-
msgid "Unschedule job"
msgstr ""
@@ -36011,10 +36483,10 @@ msgid "UpdateRepositoryStorage|Timeout waiting for %{type} repository pushes"
msgstr ""
msgid "Updated"
-msgstr ""
+msgstr "Aktualisiert"
msgid "Updated %{updated_at} by %{updated_by}"
-msgstr ""
+msgstr "Aktualisiert %{updated_at} von %{updated_by}"
msgid "Updates"
msgstr ""
@@ -36100,6 +36572,9 @@ msgstr "Nutzungsstatistiken"
msgid "UsageQuota|%{help_link_start}Shared runners%{help_link_end} are disabled, so there are no limits set on pipeline usage"
msgstr ""
+msgid "UsageQuota|%{linkTitle} help link"
+msgstr ""
+
msgid "UsageQuota|%{percentageLeft} of purchased storage is available"
msgstr ""
@@ -36109,6 +36584,9 @@ msgstr ""
msgid "UsageQuota|Artifacts is a sum of build and pipeline artifacts."
msgstr ""
+msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
+msgstr ""
+
msgid "UsageQuota|Buy additional minutes"
msgstr ""
@@ -36118,9 +36596,21 @@ msgstr ""
msgid "UsageQuota|CI minutes usage by project"
msgstr ""
+msgid "UsageQuota|Code packages and container images."
+msgstr ""
+
msgid "UsageQuota|Current period usage"
msgstr ""
+msgid "UsageQuota|File attachments and smaller design graphics."
+msgstr ""
+
+msgid "UsageQuota|Git repository, managed by the Gitaly service."
+msgstr ""
+
+msgid "UsageQuota|Includes project registry, artifacts, packages, wiki, uploads and other items."
+msgstr ""
+
msgid "UsageQuota|Increase storage temporarily"
msgstr ""
@@ -36139,6 +36629,9 @@ msgstr ""
msgid "UsageQuota|Packages"
msgstr ""
+msgid "UsageQuota|Pipeline artifacts and job artifacts, created with CI/CD."
+msgstr ""
+
msgid "UsageQuota|Pipelines"
msgstr ""
@@ -36157,6 +36650,9 @@ msgstr ""
msgid "UsageQuota|Seats"
msgstr ""
+msgid "UsageQuota|Shared bits of code and text."
+msgstr ""
+
msgid "UsageQuota|Snippets"
msgstr ""
@@ -36166,6 +36662,12 @@ msgstr ""
msgid "UsageQuota|Storage"
msgstr ""
+msgid "UsageQuota|Storage type"
+msgstr ""
+
+msgid "UsageQuota|There is a known issue with Artifact storage where the total could be incorrect for some projects. More details and progress are available in %{warningLinkStart}the epic%{warningLinkEnd}."
+msgstr ""
+
msgid "UsageQuota|This is the total amount of storage used across your projects within this namespace."
msgstr ""
@@ -36205,6 +36707,9 @@ msgstr ""
msgid "UsageQuota|Usage"
msgstr ""
+msgid "UsageQuota|Usage Breakdown"
+msgstr ""
+
msgid "UsageQuota|Usage Quotas"
msgstr ""
@@ -36229,6 +36734,9 @@ msgstr ""
msgid "UsageQuota|Wiki"
msgstr ""
+msgid "UsageQuota|Wiki content."
+msgstr ""
+
msgid "UsageQuota|Wikis"
msgstr ""
@@ -36445,8 +36953,11 @@ msgstr ""
msgid "User Settings"
msgstr "Benutzereinstellungen"
-msgid "User and IP Rate Limits"
-msgstr "Benutzer- und IP-Beschränkungen"
+msgid "User and IP rate limits"
+msgstr ""
+
+msgid "User does not have a pending request"
+msgstr ""
msgid "User identity was successfully created."
msgstr ""
@@ -36742,6 +37253,9 @@ msgstr "Benutzer(innen)"
msgid "Users can launch a development environment from a GitLab browser tab when the %{linkStart}Gitpod%{linkEnd} integration is enabled."
msgstr ""
+msgid "Users can reactivate their account by signing in."
+msgstr ""
+
msgid "Users can render diagrams in AsciiDoc, Markdown, reStructuredText, and Textile documents using Kroki."
msgstr ""
@@ -36757,6 +37271,9 @@ msgstr ""
msgid "Users requesting access to"
msgstr ""
+msgid "Users to exclude from the rate limit"
+msgstr ""
+
msgid "Users were successfully added."
msgstr ""
@@ -36778,6 +37295,9 @@ msgstr ""
msgid "UsersSelect|Unassigned"
msgstr ""
+msgid "Uses GitLab as a lightweight alternative to Sentry."
+msgstr ""
+
msgid "Using %{code_start}::%{code_end} denotes a %{link_start}scoped label set%{link_end}"
msgstr ""
@@ -36808,10 +37328,7 @@ msgstr ""
msgid "Value Stream Analytics can help you determine your team’s velocity"
msgstr ""
-msgid "Value Stream Analytics gives an overview of how much time it takes to go from idea to production in your project."
-msgstr ""
-
-msgid "Value may contain a variable reference"
+msgid "Value might contain a variable reference"
msgstr ""
msgid "Value stream"
@@ -36877,10 +37394,10 @@ msgstr ""
msgid "ValueStream|The Default Value Stream cannot be deleted"
msgstr ""
-msgid "Variable"
+msgid "Values that contain the %{codeStart}$%{codeEnd} character can be considered a variable reference and expanded. %{docsLinkStart}Learn more.%{docsLinkEnd}"
msgstr ""
-msgid "Variable references indicated by %{codeStart}$%{codeEnd} may be expanded. If this is not what you want, consider %{docsLinkStart}using a workaround to prevent expansion%{docsLinkEnd}."
+msgid "Variable"
msgstr ""
msgid "Variable will be masked in job logs."
@@ -37285,6 +37802,9 @@ msgstr ""
msgid "Vulnerability|Evidence"
msgstr ""
+msgid "Vulnerability|False positive detected"
+msgstr ""
+
msgid "Vulnerability|File"
msgstr "Datei"
@@ -37327,6 +37847,9 @@ msgstr "Schweregrad"
msgid "Vulnerability|Status"
msgstr ""
+msgid "Vulnerability|The scanner determined this vulnerability to be a false positive. Verify the evaluation before changing its status. %{linkStart}Learn more about false positive detection.%{linkEnd}"
+msgstr ""
+
msgid "Vulnerability|The unmodified response is the original response that had no mutations done to the request"
msgstr ""
@@ -37651,9 +38174,6 @@ msgstr ""
msgid "Welcome to GitLab,%{br_tag}%{name}!"
msgstr ""
-msgid "Welcome to the guided GitLab tour"
-msgstr ""
-
msgid "Welcome, %{name}!"
msgstr ""
@@ -37672,9 +38192,6 @@ msgstr ""
msgid "What are you searching for?"
msgstr ""
-msgid "What describes you best?"
-msgstr ""
-
msgid "What does this command do?"
msgstr ""
@@ -37696,13 +38213,13 @@ msgstr ""
msgid "What is your job title? (optional)"
msgstr ""
-msgid "What will you use this group for?"
+msgid "What templates can I create?"
msgstr ""
-msgid "What's new"
+msgid "What will you use this group for?"
msgstr ""
-msgid "What’s your experience level?"
+msgid "What's new"
msgstr ""
msgid "When a deployment job is successful, skip older deployment jobs that are still pending."
@@ -37714,6 +38231,9 @@ msgstr "Wenn ein Runner gesperrt ist, kann er keinem anderen Projekt zugewiesen
msgid "When an event in GitLab triggers a webhook, you can use the request details to figure out if something went wrong."
msgstr ""
+msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+msgstr ""
+
msgid "When inactive, an external authentication provider must be used."
msgstr ""
@@ -37737,6 +38257,9 @@ msgstr ""
msgid "When:"
msgstr ""
+msgid "Which API requests are affected?"
+msgstr ""
+
msgid "While it's rare to have no vulnerabilities, it can happen. In any event, we ask that you please double check your settings to make sure you've set up your dashboard correctly."
msgstr ""
@@ -38016,6 +38539,9 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|Work Items"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -38023,7 +38549,7 @@ msgid "Would you like to try auto-generating a branch name?"
msgstr ""
msgid "Write"
-msgstr ""
+msgstr "Schreiben"
msgid "Write a comment or drag your files here…"
msgstr ""
@@ -38091,6 +38617,9 @@ msgstr ""
msgid "You are already a member of this %{member_source}."
msgstr ""
+msgid "You are already impersonating another user"
+msgstr ""
+
msgid "You are an admin, which means granting access to %{client_name} will allow them to interact with GitLab as an admin as well. Proceed with caution."
msgstr ""
@@ -38193,6 +38722,9 @@ msgstr ""
msgid "You can also use project access tokens with Git to authenticate over HTTP(S). %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "You can always change your URL later"
+msgstr ""
+
msgid "You can always edit this later"
msgstr ""
@@ -38349,10 +38881,10 @@ msgstr "Du kannst nicht auf dieser schreibgeschützte GitLab-Instanz schreiben."
msgid "You can’t %{tag_start}edit%{tag_end} files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
-msgid "You could not create a new trigger."
+msgid "You can’t edit files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
-msgid "You didn't renew your subscription for %{strong}%{namespace_name}%{strong_close} so it was downgraded to the free plan."
+msgid "You could not create a new trigger."
msgstr ""
msgid "You do not have any subscriptions yet"
@@ -38520,6 +39052,12 @@ msgstr ""
msgid "You must provide your current password in order to change it."
msgstr ""
+msgid "You must sign in to search for specific projects."
+msgstr ""
+
+msgid "You must sign in to search for specific terms."
+msgstr ""
+
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
@@ -38547,6 +39085,9 @@ msgstr ""
msgid "You need to upload a GitLab project export archive (ending in .gz)."
msgstr ""
+msgid "You need to verify your primary email first before enabling Two-Factor Authentication."
+msgstr ""
+
msgid "You successfully declined the invitation"
msgstr ""
@@ -38655,10 +39196,10 @@ msgstr ""
msgid "Your %{host} account was signed in to from a new location"
msgstr ""
-msgid "Your %{strong}%{plan_name}%{strong_close} subscription for %{strong}%{namespace_name}%{strong_close} will expire on %{strong}%{expires_on}%{strong_close}."
+msgid "Your %{strong}%{plan_name}%{strong_close} subscription expires on %{strong}%{expires_on}%{strong_close}. After that date, you cannot create issues or merge requests, or use many other features."
msgstr ""
-msgid "Your %{strong}%{plan_name}%{strong_close} subscription will expire on %{strong}%{expires_on}%{strong_close}. After that, you will not be able to create issues or merge requests as well as many other features."
+msgid "Your %{strong}%{plan_name}%{strong_close} subscription for %{strong}%{namespace_name}%{strong_close} will expire on %{strong}%{expires_on}%{strong_close}."
msgstr ""
msgid "Your CI/CD configuration syntax is invalid. View Lint tab for more details."
@@ -38682,7 +39223,7 @@ msgstr ""
msgid "Your GPG keys (%{count})"
msgstr ""
-msgid "Your GitLab account has been locked due to an excessive amount of unsuccessful sign in attempts. Your account will automatically unlock in %{duration} or you may click the link below to unlock now."
+msgid "Your GitLab account has been locked due to an excessive number of unsuccessful sign in attempts. You can wait for your account to automatically unlock in %{duration} or you can click the link below to unlock now."
msgstr ""
msgid "Your GitLab account request has been approved!"
@@ -38793,6 +39334,9 @@ msgstr ""
msgid "Your commit email is used for web based operations, such as edits and merges."
msgstr ""
+msgid "Your current password is required to register a two-factor authenticator app."
+msgstr ""
+
msgid "Your dashboard has been copied. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
@@ -38892,6 +39436,9 @@ msgstr ""
msgid "Your project limit is %{limit} projects! Please contact your administrator to increase it"
msgstr ""
+msgid "Your project will be created at:"
+msgstr ""
+
msgid "Your projects"
msgstr "Deine Projekte"
@@ -38931,11 +39478,10 @@ msgstr ""
msgid "Your subscription expired!"
msgstr ""
-msgid "Your subscription has been downgraded."
-msgstr ""
-
-msgid "Your subscription will expire in %{remaining_days}."
-msgstr ""
+msgid "Your subscription will expire in %{remaining_days} day."
+msgid_plural "Your subscription will expire in %{remaining_days} days."
+msgstr[0] ""
+msgstr[1] ""
msgid "Your username is %{username}."
msgstr ""
@@ -39142,6 +39688,9 @@ msgstr ""
msgid "cannot merge"
msgstr ""
+msgid "cannot not be used for user namespace"
+msgstr ""
+
msgid "ciReport|%{degradedNum} degraded"
msgstr ""
@@ -39465,6 +40014,9 @@ msgstr ""
msgid "created %{timeAgo}"
msgstr ""
+msgid "created %{timeAgo} by %{author}"
+msgstr ""
+
msgid "created by"
msgstr ""
@@ -39509,9 +40061,6 @@ msgstr ""
msgid "does not have a supported extension. Only %{extension_list} are supported"
msgstr ""
-msgid "domain is not authorized for sign-up."
-msgstr ""
-
msgid "download it"
msgstr ""
@@ -39529,18 +40078,13 @@ msgstr ""
msgid "email '%{email}' is not a verified email."
msgstr ""
-msgid "email does not match the allowed domain of %{email_domains}"
-msgid_plural "email does not match the allowed domains: %{email_domains}"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "enabled"
msgstr "aktiviert"
msgid "encrypted: needs to be a :required, :optional or :migrating!"
msgstr ""
-msgid "ending with MIME type format is not allowed."
+msgid "ending with a reserved file extension is not allowed."
msgstr ""
msgid "entries cannot be larger than 255 characters"
@@ -39564,6 +40108,9 @@ msgstr ""
msgid "estimateCommand|%{slash_command} overwrites the total estimated time."
msgstr ""
+msgid "example.com"
+msgstr ""
+
msgid "exceeds the limit of %{bytes} bytes"
msgstr ""
@@ -39614,9 +40161,6 @@ msgstr "für dieses Projekt"
msgid "fork"
msgstr ""
-msgid "fork this project"
-msgstr "dieses Projekt forken"
-
msgid "from"
msgstr "von"
@@ -39625,6 +40169,9 @@ msgid_plural "from %d jobs"
msgstr[0] ""
msgstr[1] ""
+msgid "frontmatter"
+msgstr ""
+
msgid "group"
msgstr "Gruppe"
@@ -39652,6 +40199,9 @@ msgstr ""
msgid "has been completed."
msgstr ""
+msgid "has too deep level of nesting"
+msgstr ""
+
msgid "help"
msgstr "Hilfe"
@@ -39685,9 +40235,21 @@ msgstr "Vorgehen beim Import"
msgid "in"
msgstr ""
+msgid "in Infrastructure :: Kubernetes clusters"
+msgstr ""
+
+msgid "in all GitLab"
+msgstr ""
+
+msgid "in group"
+msgstr ""
+
msgid "in group %{link_to_group}"
msgstr "In Gruppe %{link_to_group}"
+msgid "in project"
+msgstr ""
+
msgid "in project %{link_to_project}"
msgstr "im Projekt %{link_to_project}"
@@ -39729,16 +40291,19 @@ msgstr ""
msgid "is not a valid X509 certificate."
msgstr "ist kein gültiges X509-Zertifikat."
-msgid "is not allowed since the group is not top-level group."
+msgid "is not allowed for sign-up."
msgstr ""
-msgid "is not allowed. Try again with a different email address, or contact your GitLab admin."
+msgid "is not allowed for this group."
msgstr ""
-msgid "is not allowed. We do not currently support project-level iterations"
+msgid "is not allowed for this project."
+msgstr ""
+
+msgid "is not allowed since the group is not top-level group."
msgstr ""
-msgid "is not from an allowed domain."
+msgid "is not allowed. We do not currently support project-level iterations"
msgstr ""
msgid "is not in the group enforcing Group Managed Account"
@@ -39831,6 +40396,9 @@ msgstr "gesperrt durch %{path_lock_user_name} %{created_at}"
msgid "log in"
msgstr "einloggen"
+msgid "managed"
+msgstr ""
+
msgid "manual"
msgstr "manuell"
@@ -39878,6 +40446,9 @@ msgstr ""
msgid "mrWidget| Please restore it or use a different %{missingBranchName} branch"
msgstr "Bitte stelle es wieder her, oder verwende einen anderen Branch %{missingBranchName}"
+msgid "mrWidget|%{linkStart}Set up now%{linkEnd} to analyze your source code for known security vulnerabilities."
+msgstr ""
+
msgid "mrWidget|%{mergeError}."
msgstr ""
@@ -39958,6 +40529,9 @@ msgid_plural "mrWidget|Closes issues"
msgstr[0] ""
msgstr[1] ""
+msgid "mrWidget|Create issue to resolve all threads"
+msgstr ""
+
msgid "mrWidget|Delete source branch"
msgstr "Quellbranch löschen"
@@ -39967,12 +40541,18 @@ msgstr "Bereitstellungsstatistiken derzeit nicht verfügbar"
msgid "mrWidget|Did not close"
msgstr "Wurde nicht geschlossen"
+msgid "mrWidget|Dismiss"
+msgstr ""
+
msgid "mrWidget|Email patches"
msgstr "E-Mail-Patches"
msgid "mrWidget|Failed to load deployment statistics"
msgstr "Fehler beim Laden der Bereitstellungsstatistiken"
+msgid "mrWidget|Hide %{widget} details"
+msgstr ""
+
msgid "mrWidget|If the %{missingBranchName} branch exists in your local repository, you can merge this merge request manually using the command line"
msgstr "Wenn der Branch %{missingBranchName} in deinem lokalen Repository vorhanden ist, kannst du diesen Merge-Request manuell über die Befehlszeile zusammenführen"
@@ -40068,9 +40648,6 @@ msgstr ""
msgid "mrWidget|Request to merge"
msgstr "Anfrage zum Mergen"
-msgid "mrWidget|Resolve all threads in new issue"
-msgstr ""
-
msgid "mrWidget|Resolve conflicts"
msgstr "Konflikte auflösen"
@@ -40086,6 +40663,9 @@ msgstr "Diesen Merge-Request in einem neuen Merge-Request rückgängig machen"
msgid "mrWidget|Revoke approval"
msgstr "Zustimmung wiederrufen"
+msgid "mrWidget|SAST and Secret Detection is not enabled."
+msgstr ""
+
msgid "mrWidget|Set by %{merge_author} to be added to the merge train when the pipeline succeeds"
msgstr ""
@@ -40095,6 +40675,9 @@ msgstr ""
msgid "mrWidget|Set by %{merge_author} to start a merge train when the pipeline succeeds"
msgstr ""
+msgid "mrWidget|Show %{widget} details"
+msgstr ""
+
msgid "mrWidget|The changes were merged into"
msgstr "Die Änderungen wurden gemerged nach"
@@ -40107,6 +40690,9 @@ msgstr "Die Änderungen werden gemerged nach"
msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure, or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
msgstr ""
+msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure."
+msgstr ""
+
msgid "mrWidget|The source branch has been deleted"
msgstr "Der Quellbranch wurde gelöscht"
@@ -40149,6 +40735,9 @@ msgstr ""
msgid "mrWidget|You can merge after removing denied licenses"
msgstr ""
+msgid "mrWidget|You can only merge once this merge request is approved."
+msgstr ""
+
msgid "mrWidget|Your password"
msgstr "Dein Password"
@@ -40185,6 +40774,9 @@ msgstr ""
msgid "must be less than the limit of %{tag_limit} tags"
msgstr ""
+msgid "must be set for a project namespace"
+msgstr ""
+
msgid "must be unique by status and elapsed time within a policy"
msgstr ""
@@ -40294,6 +40886,9 @@ msgstr ""
msgid "pipeline"
msgstr "Pipeline"
+msgid "pipeline schedules documentation"
+msgstr ""
+
msgid "pod_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
msgstr ""
@@ -40343,16 +40938,25 @@ msgstr ""
msgid "project name"
msgstr ""
+msgid "project namespace cannot be the parent of another namespace"
+msgstr ""
+
msgid "projects"
msgstr "Projekte"
msgid "quick actions"
msgstr "Schnellzugriff"
-msgid "reCAPTCHA Private Key"
+msgid "reCAPTCHA"
+msgstr ""
+
+msgid "reCAPTCHA helps prevent credential stuffing."
msgstr ""
-msgid "reCAPTCHA Site Key"
+msgid "reCAPTCHA private key"
+msgstr ""
+
+msgid "reCAPTCHA site key"
msgstr ""
msgid "recent activity"
@@ -40579,6 +41183,9 @@ msgstr ""
msgid "user avatar"
msgstr "Benutzeravatar"
+msgid "user namespace cannot be the parent of another namespace"
+msgstr ""
+
msgid "user preferences"
msgstr ""
@@ -40671,3 +41278,9 @@ msgstr "yaml ungültig"
msgid "your settings"
msgstr ""
+msgid "{group}"
+msgstr ""
+
+msgid "{project}"
+msgstr ""
+
diff --git a/locale/el_GR/gitlab.po b/locale/el_GR/gitlab.po
index b6bb75d86a3..703c60acc61 100644
--- a/locale/el_GR/gitlab.po
+++ b/locale/el_GR/gitlab.po
@@ -14,10 +14,7 @@ msgstr ""
"X-Crowdin-Language: el\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-09-01 22:33\n"
-
-msgid " %{name}, confirm your email address now! "
-msgstr ""
+"PO-Revision-Date: 2021-10-04 20:21\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -92,6 +89,16 @@ msgstr ""
msgid "#general, #development"
msgstr ""
+msgid "%d Alert"
+msgid_plural "%d Alerts"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d Alert:"
+msgid_plural "%d Alerts:"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d Approval"
msgid_plural "%d Approvals"
msgstr[0] ""
@@ -455,7 +462,10 @@ msgstr ""
msgid "%{code_open}Protected:%{code_close} Only exposed to protected branches or tags."
msgstr ""
-msgid "%{commit_author_link} authored %{commit_timeago}"
+msgid "%{commit_author_link} authored %{commit_authored_timeago}"
+msgstr ""
+
+msgid "%{commit_author_link} authored %{commit_authored_timeago} and %{commit_committer_avatar} %{commit_committer_link} committed %{commit_committer_timeago}"
msgstr ""
msgid "%{completedCount} completed weight"
@@ -549,6 +559,15 @@ msgstr ""
msgid "%{doc_link_start}Advanced search%{doc_link_end} is enabled."
msgstr ""
+msgid "%{docs_link_start}Learn about visibility levels.%{docs_link_end}"
+msgstr ""
+
+msgid "%{docs_link_start}What is Large File Storage?%{docs_link_end}"
+msgstr ""
+
+msgid "%{docs_link_start}What is two-factor authentication?%{docs_link_end}"
+msgstr ""
+
msgid "%{due_date} (Past due)"
msgstr ""
@@ -621,9 +640,6 @@ msgstr ""
msgid "%{issueType} actions"
msgstr ""
-msgid "%{issuesCount} issues with a limit of %{maxIssueCount}"
-msgstr ""
-
msgid "%{issuesSize} with a limit of %{maxIssueCount}"
msgstr ""
@@ -681,6 +697,12 @@ msgstr ""
msgid "%{label_for_message} unavailable"
msgstr ""
+msgid "%{learn_more_link}."
+msgstr ""
+
+msgid "%{lessThan} 1 hour"
+msgstr ""
+
msgid "%{lets_encrypt_link_start}Let's Encrypt%{lets_encrypt_link_end} is a free, automated, and open certificate authority (CA) that issues digital certificates to enable HTTPS (SSL/TLS) for sites."
msgstr ""
@@ -693,15 +715,15 @@ msgstr ""
msgid "%{link_start}Learn more%{link_end} about roles."
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
-msgstr ""
-
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
msgstr ""
msgid "%{link_start}Start the title with %{draft_snippet}%{link_end} to prevent a merge request that is a work in progress from being merged before it's ready."
msgstr ""
+msgid "%{link_start}What information does GitLab Inc. collect?%{link_end}"
+msgstr ""
+
msgid "%{listToShow}, and %{awardsListLength} more"
msgstr ""
@@ -854,7 +876,7 @@ msgid_plural "%{securityScanner} results are not available because a pipeline ha
msgstr[0] ""
msgstr[1] ""
-msgid "%{service_ping_link_start}Learn more%{service_ping_link_end} about what information is shared with GitLab Inc."
+msgid "%{service_ping_link_start}What information is shared with GitLab Inc.?%{service_ping_link_end}"
msgstr ""
msgid "%{size} %{unit}"
@@ -890,6 +912,9 @@ msgstr ""
msgid "%{state} epics"
msgstr ""
+msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
+msgstr ""
+
msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
msgstr ""
@@ -949,11 +974,6 @@ msgstr ""
msgid "%{template_project_id} is unknown or invalid"
msgstr ""
-msgid "%{text} %{files}"
-msgid_plural "%{text} %{files} files"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%{text} is available"
msgstr ""
@@ -1038,9 +1058,6 @@ msgstr ""
msgid "%{wildcards_link_start}Wildcards%{wildcards_link_end} such as %{code_tag_start}v*%{code_tag_end} or %{code_tag_start}*-release%{code_tag_end} are supported."
msgstr ""
-msgid "&lt; 1 hour"
-msgstr ""
-
msgid "'%{data}' at %{location} does not match format: %{format}"
msgstr ""
@@ -1124,9 +1141,6 @@ msgstr ""
msgid "(we need your current password to confirm your changes)"
msgstr ""
-msgid "* * * * *"
-msgstr ""
-
msgid "+ %{amount} more"
msgstr ""
@@ -1193,10 +1207,10 @@ msgstr ""
msgid "."
msgstr ""
-msgid "0 bytes"
+msgid "/"
msgstr ""
-msgid "0 for unlimited, only effective with remote storage enabled."
+msgid "0 bytes"
msgstr ""
msgid "0t1DgySidms"
@@ -1326,6 +1340,9 @@ msgstr ""
msgid "1000+"
msgstr ""
+msgid "192.168.0.0/24"
+msgstr ""
+
msgid "1st contribution!"
msgstr ""
@@ -1479,9 +1496,6 @@ msgstr ""
msgid "A plain HTML site that uses Netlify for CI/CD instead of GitLab, but still with all the other great GitLab features"
msgstr ""
-msgid "A plain-text response to show to clients that hit the rate limit."
-msgstr ""
-
msgid "A platform value can be web, mob or app."
msgstr ""
@@ -1563,7 +1577,7 @@ msgstr ""
msgid "APIFuzzing|Configure HTTP basic authentication values. Other authentication methods are supported. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
+msgid "APIFuzzing|Customize your project's API fuzzing configuration options and copy the code snippet to your .gitlab-ci.yml file to apply any changes. Note that this tool does not reflect or update your .gitlab-ci.yml file automatically. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
msgstr ""
msgid "APIFuzzing|Enable authentication"
@@ -1626,9 +1640,6 @@ msgstr ""
msgid "APIFuzzing|To prevent a security leak, authentication info must be added as a %{ciVariablesLinkStart}CI variable%{ciVariablesLinkEnd}. As a user with maintainer access rights, you can manage CI variables in the %{ciSettingsLinkStart}Settings%{ciSettingsLinkEnd} area."
msgstr ""
-msgid "APIFuzzing|Use this tool to generate API fuzzing configuration YAML to copy into your .gitlab-ci.yml file. This tool does not reflect or update your .gitlab-ci.yml file automatically."
-msgstr ""
-
msgid "APIFuzzing|Username for basic authentication"
msgstr ""
@@ -1680,9 +1691,6 @@ msgstr ""
msgid "Abuse reports notification email"
msgstr ""
-msgid "Abuse reports will be sent to this address if it is set. Abuse reports are always available in the admin area."
-msgstr ""
-
msgid "Accept invitation"
msgstr ""
@@ -1719,12 +1727,18 @@ msgstr ""
msgid "Access granted"
msgstr ""
+msgid "Access key ID"
+msgstr ""
+
msgid "Access requests"
msgstr ""
msgid "Access to '%{classification_label}' not allowed"
msgstr ""
+msgid "Access tokens expire after 2 hours. A refresh token may be used at any time to generate a new access token. Non-expiring access tokens are deprecated. Clear this setting to enable backward compatibility."
+msgstr ""
+
msgid "AccessDropdown|Deploy Keys"
msgstr ""
@@ -2037,6 +2051,9 @@ msgstr ""
msgid "Add new directory"
msgstr ""
+msgid "Add new service account"
+msgstr ""
+
msgid "Add or remove previously merged commits"
msgstr ""
@@ -2274,6 +2291,9 @@ msgstr ""
msgid "AdminArea|Features"
msgstr ""
+msgid "AdminArea|Get security updates from GitLab and stay up to date"
+msgstr ""
+
msgid "AdminArea|Groups"
msgstr ""
@@ -2313,6 +2333,12 @@ msgstr ""
msgid "AdminArea|Reporter"
msgstr ""
+msgid "AdminArea|Sign up for the GitLab Security Newsletter to get notified for security updates."
+msgstr ""
+
+msgid "AdminArea|Sign up for the GitLab newsletter"
+msgstr ""
+
msgid "AdminArea|Stop all jobs"
msgstr ""
@@ -2382,9 +2408,15 @@ msgstr ""
msgid "AdminSettings|Disable public access to Pages sites"
msgstr ""
+msgid "AdminSettings|Display a banner on merge requests in projects with no pipelines to initiate steps to add a .gitlab-ci.yml file."
+msgstr ""
+
msgid "AdminSettings|Domain verification is an essential security measure for public GitLab sites. Users are required to demonstrate they control a domain before it is enabled. %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "AdminSettings|Enable pipeline suggestion banner"
+msgstr ""
+
msgid "AdminSettings|Enable shared runners for new projects"
msgstr ""
@@ -2856,10 +2888,10 @@ msgstr ""
msgid "Admin|Quarterly reconciliation will occur on %{qrtlyDate}"
msgstr ""
-msgid "Admin|The number of max seats used for your namespace is currently exceeding the number of seats in your subscription. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgid "Admin|The number of max seats in your namespace exceeds the number of seats in your subscription. On %{qrtlyDate}, quarterly reconciliation occurs and you are automatically billed a prorated amount for the overage. No action is needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice. For more information about the timing of the invoicing process, view the documentation."
msgstr ""
-msgid "Admin|The number of maximum users for your instance is currently exceeding the number of users in license. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgid "Admin|The number of max users in your instance exceeds the number of users in your license. On %{qrtlyDate}, quarterly reconciliation occurs and you are automatically billed a prorated amount for the overage. No action is needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice. For more information about the timing of the invoicing process, view the documentation."
msgstr ""
msgid "Admin|View pending user approvals"
@@ -2880,9 +2912,6 @@ msgstr ""
msgid "Advanced export options"
msgstr ""
-msgid "Advanced permissions, Large File Storage and Two-Factor authentication settings."
-msgstr ""
-
msgid "After a successful password update you will be redirected to login screen."
msgstr ""
@@ -2901,13 +2930,14 @@ msgstr ""
msgid "After you've reviewed these contribution guidelines, you'll be all set to"
msgstr ""
+msgid "Akismet"
+msgstr ""
+
msgid "Akismet API Key"
msgstr ""
-msgid "Alert"
-msgid_plural "Alerts"
-msgstr[0] ""
-msgstr[1] ""
+msgid "Akismet helps prevent the creation of spam issues in public projects."
+msgstr ""
msgid "AlertManagement|Acknowledged"
msgstr ""
@@ -3263,6 +3293,9 @@ msgstr ""
msgid "All (default)"
msgstr ""
+msgid "All GitLab"
+msgstr ""
+
msgid "All Members"
msgstr ""
@@ -3377,6 +3410,9 @@ msgstr ""
msgid "Allow this secondary node to replicate content on Object Storage"
msgstr ""
+msgid "Allow use of licensed EE features"
+msgstr ""
+
msgid "Allow users to dismiss the broadcast message"
msgstr ""
@@ -3452,9 +3488,6 @@ msgstr ""
msgid "Amazon authentication is not %{link_start}correctly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
-msgid "Amount of time (in hours) that users are allowed to skip forced configuration of two-factor authentication"
-msgstr ""
-
msgid "An %{link_start}alert%{link_end} with the same fingerprint is already open. To change the status of this alert, resolve the linked alert."
msgstr ""
@@ -3515,12 +3548,6 @@ msgstr ""
msgid "An error occurred when removing the label."
msgstr ""
-msgid "An error occurred when toggling the notification subscription"
-msgstr ""
-
-msgid "An error occurred when updating the issue weight"
-msgstr ""
-
msgid "An error occurred when updating the title"
msgstr ""
@@ -3569,6 +3596,9 @@ msgstr ""
msgid "An error occurred while enabling Service Desk."
msgstr ""
+msgid "An error occurred while fetching Markdown preview"
+msgstr ""
+
msgid "An error occurred while fetching ancestors"
msgstr ""
@@ -3599,9 +3629,6 @@ msgstr ""
msgid "An error occurred while fetching label colors."
msgstr ""
-msgid "An error occurred while fetching markdown preview"
-msgstr ""
-
msgid "An error occurred while fetching participants"
msgstr ""
@@ -3617,9 +3644,6 @@ msgstr ""
msgid "An error occurred while fetching reference"
msgstr ""
-msgid "An error occurred while fetching sidebar data"
-msgstr ""
-
msgid "An error occurred while fetching tags. Retry the search."
msgstr ""
@@ -3695,6 +3719,9 @@ msgstr ""
msgid "An error occurred while loading merge requests."
msgstr ""
+msgid "An error occurred while loading projects."
+msgstr ""
+
msgid "An error occurred while loading the Needs tab."
msgstr ""
@@ -3929,12 +3956,6 @@ msgstr ""
msgid "Any Milestone"
msgstr ""
-msgid "Any branch"
-msgstr ""
-
-msgid "Any eligible user"
-msgstr ""
-
msgid "Any encrypted tokens"
msgstr ""
@@ -3953,6 +3974,9 @@ msgstr ""
msgid "Any namespace"
msgstr ""
+msgid "App Engine description and apps that are suitable for this deployment target"
+msgstr ""
+
msgid "App ID"
msgstr ""
@@ -4101,6 +4125,11 @@ msgstr ""
msgid "Apply"
msgstr ""
+msgid "Apply %d suggestion"
+msgid_plural "Apply %d suggestions"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Apply a label"
msgstr ""
@@ -4110,13 +4139,10 @@ msgstr ""
msgid "Apply suggestion"
msgstr ""
-msgid "Apply suggestions"
-msgstr ""
-
msgid "Apply template"
msgstr ""
-msgid "Apply this approval rule to any branch or a specific protected branch."
+msgid "Apply this approval rule to all branches or a specific protected branch."
msgstr ""
msgid "Applying"
@@ -4259,9 +4285,6 @@ msgstr ""
msgid "ApprovalSettings|Prevent editing approval rules in projects and merge requests."
msgstr ""
-msgid "ApprovalSettings|Prevent editing approval rules in projects and merge requests. "
-msgstr ""
-
msgid "ApprovalSettings|Remove all approvals when commits are added to the source branch."
msgstr ""
@@ -4277,6 +4300,9 @@ msgstr ""
msgid "ApprovalSettings|This setting is configured at the instance level and can only be changed by an administrator."
msgstr ""
+msgid "ApprovalSettings|This setting is configured in %{groupName} and can only be changed by an administrator or group owner."
+msgstr ""
+
msgid "ApprovalStatusTooltip|Adheres to separation of duties"
msgstr ""
@@ -4763,9 +4789,6 @@ msgstr ""
msgid "Authenticated API rate limit period in seconds"
msgstr ""
-msgid "Authenticated API request rate limit"
-msgstr ""
-
msgid "Authenticated API requests"
msgstr ""
@@ -4775,10 +4798,10 @@ msgstr ""
msgid "Authenticated Git LFS request rate limit"
msgstr ""
-msgid "Authenticated web rate limit period in seconds"
+msgid "Authenticated Git LFS requests"
msgstr ""
-msgid "Authenticated web request rate limit"
+msgid "Authenticated web rate limit period in seconds"
msgstr ""
msgid "Authenticated web requests"
@@ -5156,9 +5179,6 @@ msgstr ""
msgid "Below you will find all the groups that are public."
msgstr ""
-msgid "Beta"
-msgstr ""
-
msgid "Bi-weekly code coverage"
msgstr ""
@@ -5398,6 +5418,21 @@ msgstr ""
msgid "Board scope affects which issues are displayed for anyone who visits this board"
msgstr ""
+msgid "BoardNewEpic|Groups"
+msgstr ""
+
+msgid "BoardNewEpic|Loading groups"
+msgstr ""
+
+msgid "BoardNewEpic|No matching results"
+msgstr ""
+
+msgid "BoardNewEpic|Search groups"
+msgstr ""
+
+msgid "BoardNewEpic|Select a group"
+msgstr ""
+
msgid "BoardNewIssue|No matching results"
msgstr ""
@@ -5475,6 +5510,9 @@ msgstr ""
msgid "Boards|An error occurred while creating the list. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching child groups. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching group projects. Please try again."
msgstr ""
@@ -5807,6 +5845,9 @@ msgstr ""
msgid "Bulk update"
msgstr ""
+msgid "BulkImports|Re-import creates a new group. It does not sync with the existing group."
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -5816,6 +5857,9 @@ msgstr ""
msgid "BulkImport|From source group"
msgstr ""
+msgid "BulkImport|Group import history"
+msgstr ""
+
msgid "BulkImport|Import failed: Destination cannot be a subgroup of the source group. Change the destination and try again."
msgstr ""
@@ -5828,9 +5872,18 @@ msgstr ""
msgid "BulkImport|Importing the group failed"
msgstr ""
+msgid "BulkImport|Last imported to %{link}"
+msgstr ""
+
msgid "BulkImport|Name already exists."
msgstr ""
+msgid "BulkImport|New group"
+msgstr ""
+
+msgid "BulkImport|No history is available"
+msgstr ""
+
msgid "BulkImport|No parent"
msgstr ""
@@ -5843,6 +5896,9 @@ msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} matching filter \"%{filter}\" from %{link}"
msgstr ""
+msgid "BulkImport|Source group"
+msgstr ""
+
msgid "BulkImport|To new group"
msgstr ""
@@ -5852,6 +5908,9 @@ msgstr ""
msgid "BulkImport|You have no groups to import"
msgstr ""
+msgid "BulkImport|Your imported groups will appear here."
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -6094,6 +6153,9 @@ msgstr ""
msgid "Can be manually deployed to"
msgstr ""
+msgid "Can be overridden in each project."
+msgstr ""
+
msgid "Can create groups:"
msgstr ""
@@ -6196,6 +6258,9 @@ msgstr ""
msgid "Cancelling Preview"
msgstr ""
+msgid "Cannot assign a confidential epic to a non-confidential issue. Make the issue confidential and try again"
+msgstr ""
+
msgid "Cannot be assigned to other projects."
msgstr ""
@@ -6247,9 +6312,6 @@ msgstr ""
msgid "Cannot refer to a group %{timebox_type} by an internal id!"
msgstr ""
-msgid "Cannot set confidential epic for a non-confidential issue"
-msgstr ""
-
msgid "Cannot show preview. For previews on sketch files, they must have the file format introduced by Sketch version 43 and above."
msgstr ""
@@ -6487,15 +6549,15 @@ msgstr ""
msgid "Check out, review, and merge locally"
msgstr ""
-msgid "Check the %{docs_link_start}documentation%{docs_link_end}."
-msgstr ""
-
msgid "Check the current instance configuration "
msgstr ""
msgid "Check the elasticsearch.log file to debug why the migration was halted and make any changes before retrying the migration. When you fix the cause of the failure, click \"Retry migration\", and the migration will be scheduled to be retried in the background."
msgstr ""
+msgid "Check with your administrator."
+msgstr ""
+
msgid "Check your Docker images for known vulnerabilities."
msgstr ""
@@ -6526,6 +6588,9 @@ msgstr ""
msgid "Checkout"
msgstr ""
+msgid "Checkout|$%{selectedPlanPrice} per 10 GB storage per pack"
+msgstr ""
+
msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 minutes"
msgstr ""
@@ -6546,17 +6611,23 @@ msgstr ""
msgid "Checkout|%{name}'s GitLab subscription"
msgstr ""
-msgid "Checkout|%{selectedPlanText} plan"
+msgid "Checkout|%{name}'s storage subscription"
msgstr ""
-msgid "Checkout|%{startDate} - %{endDate}"
+msgid "Checkout|%{quantity} GB of storage"
msgstr ""
-msgid "Checkout|%{totalCiMinutes} CI minute"
-msgid_plural "Checkout|%{totalCiMinutes} CI minutes"
+msgid "Checkout|%{quantity} storage pack"
+msgid_plural "Checkout|%{quantity} storage packs"
msgstr[0] ""
msgstr[1] ""
+msgid "Checkout|%{selectedPlanText} plan"
+msgstr ""
+
+msgid "Checkout|%{startDate} - %{endDate}"
+msgstr ""
+
msgid "Checkout|%{totalCiMinutes} CI minutes"
msgstr ""
@@ -6632,6 +6703,9 @@ msgstr ""
msgid "Checkout|Failed to register credit card. Please try again."
msgstr ""
+msgid "Checkout|GB"
+msgstr ""
+
msgid "Checkout|GitLab group"
msgstr ""
@@ -6668,6 +6742,9 @@ msgstr ""
msgid "Checkout|State"
msgstr ""
+msgid "Checkout|Storage packs"
+msgstr ""
+
msgid "Checkout|Street address"
msgstr ""
@@ -6689,6 +6766,9 @@ msgstr ""
msgid "Checkout|Total minutes: %{quantity}"
msgstr ""
+msgid "Checkout|Total storage: %{quantity} GB"
+msgstr ""
+
msgid "Checkout|Users"
msgstr ""
@@ -6698,16 +6778,25 @@ msgstr ""
msgid "Checkout|Your organization"
msgstr ""
+msgid "Checkout|Your storage subscription has the same term as your main subscription, and the price is prorated accordingly."
+msgstr ""
+
msgid "Checkout|Your subscription will be applied to this group"
msgstr ""
msgid "Checkout|Zip code"
msgstr ""
+msgid "Checkout|a storage subscription"
+msgstr ""
+
msgid "Checkout|company or team"
msgstr ""
-msgid "Checkout|x 1,000 minutes per pack = %{strong}"
+msgid "Checkout|minutes"
+msgstr ""
+
+msgid "Checkout|x %{quantity} %{units} per pack ="
msgstr ""
msgid "Cherry-pick this commit"
@@ -7064,6 +7153,9 @@ msgstr ""
msgid "CloneIssue|Cannot clone issue to target project as it is pending deletion."
msgstr ""
+msgid "CloneIssue|Cannot clone issues of '%{issue_type}' type."
+msgstr ""
+
msgid "Cloned this issue to %{path_to_project}."
msgstr ""
@@ -7118,7 +7210,10 @@ msgstr ""
msgid "Closes this %{quick_action_target}."
msgstr ""
-msgid "Cloud licenses can not be removed."
+msgid "Cloud Functions description and apps that are suitable for this deployment target"
+msgstr ""
+
+msgid "Cloud Run description and apps that are suitable for this deployment target"
msgstr ""
msgid "Cluster"
@@ -7145,6 +7240,12 @@ msgstr ""
msgid "ClusterAgents|Access tokens"
msgstr ""
+msgid "ClusterAgents|Agent might not be connected to GitLab"
+msgstr ""
+
+msgid "ClusterAgents|Agent never connected to GitLab"
+msgstr ""
+
msgid "ClusterAgents|Alternative installation methods"
msgstr ""
@@ -7160,6 +7261,12 @@ msgstr ""
msgid "ClusterAgents|Configuration"
msgstr ""
+msgid "ClusterAgents|Connected"
+msgstr ""
+
+msgid "ClusterAgents|Connection status"
+msgstr ""
+
msgid "ClusterAgents|Copy token"
msgstr ""
@@ -7178,6 +7285,9 @@ msgstr ""
msgid "ClusterAgents|For alternative installation methods %{linkStart}go to the documentation%{linkEnd}."
msgstr ""
+msgid "ClusterAgents|For more troubleshooting information go to"
+msgstr ""
+
msgid "ClusterAgents|Go to the repository"
msgstr ""
@@ -7193,18 +7303,30 @@ msgstr ""
msgid "ClusterAgents|Integrate with the GitLab Agent"
msgstr ""
-msgid "ClusterAgents|Last used"
+msgid "ClusterAgents|Last connected %{timeAgo}."
+msgstr ""
+
+msgid "ClusterAgents|Last contact"
msgstr ""
msgid "ClusterAgents|Learn how to create an agent access token"
msgstr ""
+msgid "ClusterAgents|Make sure you are using a valid token."
+msgstr ""
+
msgid "ClusterAgents|Name"
msgstr ""
msgid "ClusterAgents|Never"
msgstr ""
+msgid "ClusterAgents|Never connected"
+msgstr ""
+
+msgid "ClusterAgents|Not connected"
+msgstr ""
+
msgid "ClusterAgents|Read more about getting started"
msgstr ""
@@ -7226,6 +7348,9 @@ msgstr ""
msgid "ClusterAgents|Select which Agent you want to install"
msgstr ""
+msgid "ClusterAgents|The Agent has not been connected in a long time. There might be a connectivity issue. Last contact was %{timeAgo}."
+msgstr ""
+
msgid "ClusterAgents|The GitLab Agent also requires %{linkStart}enabling the Agent Server%{linkEnd}"
msgstr ""
@@ -7253,9 +7378,6 @@ msgstr ""
msgid "ClusterAgents|You will need to create a token to connect to your agent"
msgstr ""
-msgid "ClusterAgent|This feature is only available for premium plans"
-msgstr ""
-
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -7445,9 +7567,6 @@ msgstr ""
msgid "ClusterIntegration|Create Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Create a provision role on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the account and external ID above. %{startMoreInfoLink}More information%{endLink}"
-msgstr ""
-
msgid "ClusterIntegration|Create cluster on"
msgstr ""
@@ -7880,7 +7999,7 @@ msgstr ""
msgid "ClusterIntegration|Subnets"
msgstr ""
-msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provisioned role, first create one on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the above account and external IDs. %{startMoreInfoLink}More information%{endLink}"
+msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provisioned role, first create one on %{awsLinkStart}Amazon Web Services %{awsLinkEnd} using the above account and external IDs. %{moreInfoStart}More information%{moreInfoEnd}"
msgstr ""
msgid "ClusterIntegration|The Kubernetes certificate used to authenticate to the cluster."
@@ -8114,6 +8233,9 @@ msgstr ""
msgid "Collapse replies"
msgstr ""
+msgid "Collapse settings section"
+msgstr ""
+
msgid "Collapse sidebar"
msgstr ""
@@ -8132,6 +8254,9 @@ msgstr ""
msgid "Comma-separated list of email addresses."
msgstr ""
+msgid "Comma-separated list of users allowed to exceed the rate limit."
+msgstr ""
+
msgid "Comma-separated, e.g. '1.1.1.1, 2.2.2.0/24'"
msgstr ""
@@ -8452,6 +8577,9 @@ msgstr ""
msgid "Configure %{repository_checks_link_start}repository checks%{link_end} and %{housekeeping_link_start}housekeeping%{link_end} on repositories."
msgstr ""
+msgid "Configure CAPTCHAs, IP address limits, and other anti-spam measures."
+msgstr ""
+
msgid "Configure Dependency Scanning in `.gitlab-ci.yml` using the GitLab managed template. You can [add variable overrides](https://docs.gitlab.com/ee/user/application_security/dependency_scanning/#customizing-the-dependency-scanning-settings) to customize Dependency Scanning settings."
msgstr ""
@@ -8488,16 +8616,13 @@ msgstr ""
msgid "Configure a %{codeStart}.gitlab-webide.yml%{codeEnd} file in the %{codeStart}.gitlab%{codeEnd} directory to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
msgstr ""
-msgid "Configure existing installation"
-msgstr ""
-
-msgid "Configure limit for notes created per minute by web and API requests."
+msgid "Configure advanced permissions, Large File Storage, and two-factor authentication settings."
msgstr ""
-msgid "Configure limits for Project/Group Import/Export."
+msgid "Configure approvals by authors and committers on all projects."
msgstr ""
-msgid "Configure limits for web and API requests."
+msgid "Configure existing installation"
msgstr ""
msgid "Configure paths to be protected by Rack Attack."
@@ -8512,10 +8637,13 @@ msgstr ""
msgid "Configure settings for Advanced Search with Elasticsearch."
msgstr ""
+msgid "Configure specific limits for Files API requests that supersede the general user and IP rate limits."
+msgstr ""
+
msgid "Configure specific limits for Git LFS requests that supersede the general user and IP rate limits."
msgstr ""
-msgid "Configure specific limits for Packages API requests that supersede the general user and IP rate limits."
+msgid "Configure specific limits for deprecated API requests that supersede the general user and IP rate limits."
msgstr ""
msgid "Configure the %{link} integration."
@@ -8527,6 +8655,9 @@ msgstr ""
msgid "Configure the way a user creates a new account."
msgstr ""
+msgid "Configure via Merge Request"
+msgstr ""
+
msgid "Configure which lists are shown for anyone who visits this board"
msgstr ""
@@ -8995,6 +9126,9 @@ msgstr ""
msgid "Content parsed with %{link}."
msgstr ""
+msgid "ContentEditor|Table of Contents"
+msgstr ""
+
msgid "ContentEditor|You have to provide a renderMarkdown function or a custom serializer"
msgstr ""
@@ -9181,6 +9315,9 @@ msgstr ""
msgid "Copy link to chart"
msgstr ""
+msgid "Copy prefix"
+msgstr ""
+
msgid "Copy reference"
msgstr ""
@@ -9211,6 +9348,9 @@ msgstr ""
msgid "Copy value"
msgstr ""
+msgid "Corpus Management"
+msgstr ""
+
msgid "Corpus Management|Are you sure you want to delete the corpus?"
msgstr ""
@@ -9439,6 +9579,9 @@ msgstr ""
msgid "Create commit"
msgstr ""
+msgid "Create common files more quickly, and standardize their format."
+msgstr ""
+
msgid "Create confidential merge request"
msgstr ""
@@ -9472,6 +9615,9 @@ msgstr ""
msgid "Create issue"
msgstr ""
+msgid "Create issue to resolve all threads"
+msgstr ""
+
msgid "Create iteration"
msgstr ""
@@ -9526,6 +9672,9 @@ msgstr ""
msgid "Create new..."
msgstr ""
+msgid "Create or import your first project"
+msgstr ""
+
msgid "Create project"
msgstr ""
@@ -9883,7 +10032,7 @@ msgstr ""
msgid "Custom notification events"
msgstr ""
-msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notificationLinkStart} notification emails%{notificationLinkEnd}."
+msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notificationLinkStart}notification emails%{notificationLinkEnd}."
msgstr ""
msgid "Custom project templates"
@@ -10082,10 +10231,10 @@ msgid_plural "CycleAnalytics|Showing %{subjectFilterText} and %{selectedLabelsCo
msgstr[0] ""
msgstr[1] ""
-msgid "CycleAnalytics|Showing data for group '%{groupName}' and %{selectedProjectCount} projects from %{startDate} to %{endDate}"
+msgid "CycleAnalytics|Showing data for group '%{groupName}' and %{selectedProjectCount} projects from %{createdAfter} to %{createdBefore}"
msgstr ""
-msgid "CycleAnalytics|Showing data for group '%{groupName}' from %{startDate} to %{endDate}"
+msgid "CycleAnalytics|Showing data for group '%{groupName}' from %{createdAfter} to %{createdBefore}"
msgstr ""
msgid "CycleAnalytics|Stages"
@@ -10319,6 +10468,9 @@ msgstr ""
msgid "DastProfiles|Manage profiles"
msgstr ""
+msgid "DastProfiles|Manage site profiles"
+msgstr ""
+
msgid "DastProfiles|Minimum = 0 (no timeout enabled), Maximum = 2880 minutes"
msgstr ""
@@ -10394,6 +10546,9 @@ msgstr ""
msgid "DastProfiles|Scanner name"
msgstr ""
+msgid "DastProfiles|Schedule"
+msgstr ""
+
msgid "DastProfiles|Select branch"
msgstr ""
@@ -10463,7 +10618,7 @@ msgstr ""
msgid "DastProfiles|Website"
msgstr ""
-msgid "DastProfiles|You can either choose a passive scan or validate the target site in your chosen site profile. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
+msgid "DastProfiles|You can either choose a passive scan or validate the target site from the site profile management page. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
msgstr ""
msgid "DastProfiles|You cannot run an active scan against an unvalidated site."
@@ -10636,7 +10791,7 @@ msgstr ""
msgid "Days to merge"
msgstr ""
-msgid "Deactivate dormant users after 90 days of inactivity. Users can return to active status by signing in to their account. While inactive, a user is not counted as an active user in the instance."
+msgid "Deactivate dormant users after 90 days of inactivity"
msgstr ""
msgid "Dear Administrator,"
@@ -10723,10 +10878,10 @@ msgstr ""
msgid "Define a custom pattern with cron syntax"
msgstr ""
-msgid "Define approval settings."
+msgid "Define approval rules."
msgstr ""
-msgid "Define approval settings. %{linkStart}Learn more.%{linkEnd}"
+msgid "Define approval rules. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "Define custom rules for what constitutes spam, independent of Akismet"
@@ -10735,7 +10890,7 @@ msgstr ""
msgid "Define environments in the deploy stage(s) in %{code_open}.gitlab-ci.yml%{code_close} to track deployments here."
msgstr ""
-msgid "Define how approval rules are applied as a merge request moves toward completion."
+msgid "Define how approval rules are applied to merge requests."
msgstr ""
msgid "Definition"
@@ -10750,6 +10905,12 @@ msgstr ""
msgid "DelayedJobs|Are you sure you want to run %{job_name} immediately? This job will run automatically after it's timer finishes."
msgstr ""
+msgid "DelayedJobs|Are you sure you want to run %{job_name} immediately? This job will run automatically after its timer finishes."
+msgstr ""
+
+msgid "DelayedJobs|Run the delayed job now?"
+msgstr ""
+
msgid "DelayedJobs|Start now"
msgstr ""
@@ -11026,6 +11187,12 @@ msgstr ""
msgid "Dependency proxy image prefix"
msgstr ""
+msgid "DependencyProxy|Create a local proxy for storing frequently used upstream images. %{docLinkStart}Learn more%{docLinkEnd} about dependency proxies."
+msgstr ""
+
+msgid "DependencyProxy|Dependency Proxy"
+msgstr ""
+
msgid "DependencyProxy|Toggle Dependency Proxy"
msgstr ""
@@ -11266,6 +11433,9 @@ msgstr ""
msgid "Deployments"
msgstr ""
+msgid "Deployments to Google Kubernetes Engine can be "
+msgstr ""
+
msgid "Deployments|%{deployments} environment impacted."
msgid_plural "Deployments|%{deployments} environments impacted."
msgstr[0] ""
@@ -11295,6 +11465,9 @@ msgstr ""
msgid "Deployment|success"
msgstr ""
+msgid "Deprecated API rate limits"
+msgstr ""
+
msgid "Deprioritize label"
msgstr ""
@@ -11697,6 +11870,16 @@ msgstr ""
msgid "DiffsCompareBaseBranch|(base)"
msgstr ""
+msgid "Diffs|%d addition"
+msgid_plural "Diffs|%d additions"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Diffs|%d deletion"
+msgid_plural "Diffs|%d deletions"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Diffs|No file name available"
msgstr ""
@@ -11706,9 +11889,17 @@ msgstr ""
msgid "Diffs|Show all unchanged lines"
msgstr ""
+msgid "Diffs|Showing %{dropdownStart}%{count} changed file%{dropdownEnd}"
+msgid_plural "Diffs|Showing %{dropdownStart}%{count} changed files%{dropdownEnd}"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Diffs|Something went wrong while fetching diff lines."
msgstr ""
+msgid "Diffs|with %{additions} and %{deletions}"
+msgstr ""
+
msgid "Direct member"
msgstr ""
@@ -11834,9 +12025,6 @@ msgid_plural "Dismiss %d selected vulnerabilities as"
msgstr[0] ""
msgstr[1] ""
-msgid "Dismiss Value Stream Analytics introduction box"
-msgstr ""
-
msgid "Dismiss merge request promotion"
msgstr ""
@@ -12158,6 +12346,9 @@ msgstr ""
msgid "Edit issues"
msgstr ""
+msgid "Edit merge requests"
+msgstr ""
+
msgid "Edit public deploy key"
msgstr ""
@@ -12233,6 +12424,9 @@ msgstr ""
msgid "Elastic|None. Select projects to index."
msgstr ""
+msgid "Eligible users"
+msgstr ""
+
msgid "Email"
msgstr ""
@@ -12362,6 +12556,9 @@ msgstr ""
msgid "Enable"
msgstr ""
+msgid "Enable Amazon EKS integration"
+msgstr ""
+
msgid "Enable Auto DevOps"
msgstr ""
@@ -12395,6 +12592,9 @@ msgstr ""
msgid "Enable SSL verification"
msgstr ""
+msgid "Enable Service Ping"
+msgstr ""
+
msgid "Enable Snowplow tracking"
msgstr ""
@@ -12425,6 +12625,9 @@ msgstr ""
msgid "Enable authenticated Git LFS request rate limit"
msgstr ""
+msgid "Enable authenticated web request rate limit"
+msgstr ""
+
msgid "Enable authentication"
msgstr ""
@@ -12485,7 +12688,7 @@ msgstr ""
msgid "Enable or disable the Pseudonymizer data collection."
msgstr ""
-msgid "Enable or disable version check and service ping."
+msgid "Enable or disable version check and Service Ping."
msgstr ""
msgid "Enable protected paths rate limit"
@@ -12497,18 +12700,12 @@ msgstr ""
msgid "Enable reCAPTCHA"
msgstr ""
-msgid "Enable reCAPTCHA for login"
-msgstr ""
-
-msgid "Enable reCAPTCHA, Invisible Captcha, Akismet and set IP limits. For reCAPTCHA, we currently only support %{recaptcha_v2_link_start}v2%{recaptcha_v2_link_end}"
+msgid "Enable reCAPTCHA for login."
msgstr ""
msgid "Enable repository checks"
msgstr ""
-msgid "Enable service ping"
-msgstr ""
-
msgid "Enable shared runners for all projects and subgroups in this group."
msgstr ""
@@ -12530,7 +12727,10 @@ msgstr ""
msgid "Enable unauthenticated API request rate limit"
msgstr ""
-msgid "Enable unauthenticated request rate limit"
+msgid "Enable unauthenticated web request rate limit"
+msgstr ""
+
+msgid "Enable user deactivation emails"
msgstr ""
msgid "Enable version check"
@@ -12566,9 +12766,6 @@ msgstr ""
msgid "Enabled sources for code import during project creation. OmniAuth must be configured for GitHub"
msgstr ""
-msgid "Enabling this will only make licensed EE features available to projects if the project namespace's plan includes the feature or if the project is public."
-msgstr ""
-
msgid "Encountered an error while rendering: %{err}"
msgstr ""
@@ -12617,9 +12814,6 @@ msgstr ""
msgid "Enter Admin Mode"
msgstr ""
-msgid "Enter IP address range"
-msgstr ""
-
msgid "Enter a number"
msgstr ""
@@ -12632,9 +12826,6 @@ msgstr ""
msgid "Enter at least three characters to search"
msgstr ""
-msgid "Enter domain"
-msgstr ""
-
msgid "Enter in your Bitbucket Server URL and personal access token below"
msgstr ""
@@ -12821,9 +13012,6 @@ msgstr ""
msgid "Environments|Deployment %{status}"
msgstr ""
-msgid "Environments|Dismiss"
-msgstr ""
-
msgid "Environments|Enable review app"
msgstr ""
@@ -12836,9 +13024,6 @@ msgstr ""
msgid "Environments|Environments are places where code gets deployed, such as staging or production."
msgstr ""
-msgid "Environments|Help us improve environments"
-msgstr ""
-
msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
msgstr ""
@@ -12875,6 +13060,9 @@ msgstr ""
msgid "Environments|Note that this action will stop the environment, but it will %{emphasisStart}not%{emphasisEnd} have an effect on any existing deployment due to no “stop environment action†being defined in the %{ciConfigLinkStart}.gitlab-ci.yml%{ciConfigLinkEnd} file."
msgstr ""
+msgid "Environments|Open"
+msgstr ""
+
msgid "Environments|Open live environment"
msgstr ""
@@ -12914,9 +13102,6 @@ msgstr ""
msgid "Environments|Stopping %{environmentName}"
msgstr ""
-msgid "Environments|Take the survey"
-msgstr ""
-
msgid "Environments|There was an error fetching the logs. Please try again."
msgstr ""
@@ -12938,9 +13123,6 @@ msgstr ""
msgid "Environments|You don't have any environments right now"
msgstr ""
-msgid "Environments|Your feedback helps GitLab make environments better for you and other users. Participate and enter a sweepstake to win a USD 30 gift card."
-msgstr ""
-
msgid "Environments|by %{avatar}"
msgstr ""
@@ -13223,7 +13405,7 @@ msgstr ""
msgid "Error parsing CSV file. Please make sure it has"
msgstr ""
-msgid "Error rendering markdown preview"
+msgid "Error rendering Markdown preview"
msgstr ""
msgid "Error saving label update."
@@ -13271,6 +13453,9 @@ msgstr ""
msgid "Error: %{error_message}"
msgstr ""
+msgid "Error: Couldn't load some or all of the changes."
+msgstr ""
+
msgid "Error: No AWS credentials were supplied"
msgstr ""
@@ -13304,6 +13489,9 @@ msgstr ""
msgid "ErrorTracking|Enable error tracking"
msgstr ""
+msgid "ErrorTracking|Error tracking backend"
+msgstr ""
+
msgid "ErrorTracking|If you self-host Sentry, enter your Sentry instance's full URL. If you use Sentry's hosted solution, enter https://sentry.io"
msgstr ""
@@ -13337,6 +13525,12 @@ msgstr ""
msgid "Escalation policies must have at least one rule"
msgstr ""
+msgid "EscalationPolicies|%{clockIcon} IF alert is not %{alertStatus} in %{minutes}"
+msgstr ""
+
+msgid "EscalationPolicies|%{notificationIcon} THEN %{doAction} %{forScheduleOrUser}"
+msgstr ""
+
msgid "EscalationPolicies|+ Add an additional rule"
msgstr ""
@@ -13379,13 +13573,13 @@ msgstr ""
msgid "EscalationPolicies|Escalation policies"
msgstr ""
-msgid "EscalationPolicies|Escalation rules"
+msgid "EscalationPolicies|Escalation policy %{obstacle} in Project %{project}"
msgstr ""
-msgid "EscalationPolicies|Failed to load oncall-schedules"
+msgid "EscalationPolicies|Escalation rules"
msgstr ""
-msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} %{then} THEN %{doAction} %{scheduleOrUser}"
+msgid "EscalationPolicies|Failed to load oncall-schedules"
msgstr ""
msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} minutes"
@@ -13463,18 +13657,36 @@ msgstr ""
msgid "Every %{action} attempt has failed: %{job_error_message}. Please try again."
msgstr ""
+msgid "Every 3 months"
+msgstr ""
+
+msgid "Every 3 months on the %{day} at %{time} %{timezone}"
+msgstr ""
+
+msgid "Every 6 months"
+msgstr ""
+
+msgid "Every 6 months on the %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Every day"
msgstr ""
msgid "Every day (at %{time})"
msgstr ""
+msgid "Every day at %{time} %{timezone}"
+msgstr ""
+
msgid "Every month"
msgstr ""
msgid "Every month (Day %{day} at %{time})"
msgstr ""
+msgid "Every month on the %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Every three months"
msgstr ""
@@ -13489,6 +13701,15 @@ msgstr[1] ""
msgid "Every week (%{weekday} at %{time})"
msgstr ""
+msgid "Every week on %{day} at %{time} %{timezone}"
+msgstr ""
+
+msgid "Every year"
+msgstr ""
+
+msgid "Every year on %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Everyone"
msgstr ""
@@ -13525,9 +13746,6 @@ msgstr ""
msgid "Exactly one of %{attributes} is required"
msgstr ""
-msgid "Example: %{ip_address}. %{read_more_link}."
-msgstr ""
-
msgid "Example: @sub\\.company\\.com$"
msgstr ""
@@ -13594,13 +13812,13 @@ msgstr ""
msgid "Expand pipeline"
msgstr ""
-msgid "Expand sidebar"
+msgid "Expand settings section"
msgstr ""
-msgid "Expected documents: %{expected_documents}"
+msgid "Expand sidebar"
msgstr ""
-msgid "Experienced"
+msgid "Expected documents: %{expected_documents}"
msgstr ""
msgid "ExperimentSubject|Must have exactly one of User, Namespace, or Project."
@@ -13885,9 +14103,6 @@ msgstr ""
msgid "Failed to load related branches"
msgstr ""
-msgid "Failed to load sidebar lock status"
-msgstr ""
-
msgid "Failed to load stacktrace."
msgstr ""
@@ -14312,6 +14527,9 @@ msgstr ""
msgid "Files"
msgstr ""
+msgid "Files API Rate Limits"
+msgstr ""
+
msgid "Files breadcrumb"
msgstr ""
@@ -15311,6 +15529,9 @@ msgstr ""
msgid "GitLab group: %{source_link}"
msgstr ""
+msgid "GitLab informs you if a new version is available."
+msgstr ""
+
msgid "GitLab is a complete DevOps platform, delivered as a single application, fundamentally changing the way Development, Security, and Ops teams collaborate"
msgstr ""
@@ -15326,7 +15547,7 @@ msgstr ""
msgid "GitLab is open source software to collaborate on code."
msgstr ""
-msgid "GitLab is undergoing maintenance and is operating in a read-only mode."
+msgid "GitLab is undergoing maintenance and is operating in read-only mode."
msgstr ""
msgid "GitLab member or Email address"
@@ -15338,9 +15559,6 @@ msgstr ""
msgid "GitLab project export"
msgstr ""
-msgid "GitLab restart is required to apply changes."
-msgstr ""
-
msgid "GitLab single sign-on URL"
msgstr ""
@@ -15356,9 +15574,6 @@ msgstr ""
msgid "GitLab version"
msgstr ""
-msgid "GitLab will inform you if a new version is available."
-msgstr ""
-
msgid "GitLab will run a background job that will produce pseudonymized CSVs of the GitLab database that will be uploaded to your configured object storage directory."
msgstr ""
@@ -15623,9 +15838,21 @@ msgstr ""
msgid "Go to snippets"
msgstr ""
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check 'Allowed domains for sign-ups'."
+msgstr ""
+
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check 'Email restrictions for sign-ups'."
+msgstr ""
+
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check the 'Domain denylist'."
+msgstr ""
+
msgid "Go to the activity feed"
msgstr ""
+msgid "Go to the group’s 'Settings &gt; General' page, and check 'Restrict membership by email domain'."
+msgstr ""
+
msgid "Go to the milestone list"
msgstr ""
@@ -15662,6 +15889,12 @@ msgstr ""
msgid "Goal of the changes and what reviewers should be aware of"
msgstr ""
+msgid "Google Cloud"
+msgstr ""
+
+msgid "Google Cloud offers several deployment targets. Select the one most suitable for your project."
+msgstr ""
+
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
@@ -15746,9 +15979,6 @@ msgstr ""
msgid "Group ID"
msgstr ""
-msgid "Group ID: %{group_id}"
-msgstr ""
-
msgid "Group Owner must have signed in with SAML before enabling Group Managed Accounts"
msgstr ""
@@ -15923,6 +16153,12 @@ msgstr ""
msgid "GroupImport|Unable to process group import file"
msgstr ""
+msgid "GroupPage|Copy group ID"
+msgstr ""
+
+msgid "GroupPage|Group ID: %{group_id}"
+msgstr ""
+
msgid "GroupRoadmap|%{dateWord} – No end date"
msgstr ""
@@ -15977,6 +16213,9 @@ msgstr ""
msgid "GroupRoadmap|Within 3 years"
msgstr ""
+msgid "GroupSAML|\"persistent\" recommended"
+msgstr ""
+
msgid "GroupSAML|%{strongOpen}Warning%{strongClose} - Enabling %{linkStart}SSO enforcement%{linkEnd} can reduce security risks."
msgstr ""
@@ -16109,6 +16348,9 @@ msgstr ""
msgid "GroupSAML|To be able to prohibit outer forks, you first need to enforce dedicate group managed accounts."
msgstr ""
+msgid "GroupSAML|Use SAML group links to manage group membership using SAML."
+msgstr ""
+
msgid "GroupSAML|Valid SAML Response"
msgstr ""
@@ -16121,13 +16363,10 @@ msgstr ""
msgid "GroupSAML|as %{access_level}"
msgstr ""
-msgid "GroupSAML|must match stored NameID of \"%{extern_uid}\" as we use this to identify users. If the NameID changes users will be unable to sign in."
-msgstr ""
-
-msgid "GroupSAML|should be \"persistent\""
+msgid "GroupSAML|must match stored NameID of \"%{extern_uid}\" to identify user and allow sign in"
msgstr ""
-msgid "GroupSAML|should be a random persistent ID, emails are discouraged"
+msgid "GroupSAML|recommend persistent ID instead of email"
msgstr ""
msgid "GroupSelect|No matching results"
@@ -16142,9 +16381,15 @@ msgstr ""
msgid "GroupSettings|Allow project access token creation"
msgstr ""
+msgid "GroupSettings|Applied to all subgroups unless overridden by a group owner. Groups already added to the project lose access."
+msgstr ""
+
msgid "GroupSettings|Auto DevOps pipeline was updated for the group"
msgstr ""
+msgid "GroupSettings|Available only on the top-level group. Applies to all subgroups. Groups already shared with a group outside %{group} are still shared unless removed manually."
+msgstr ""
+
msgid "GroupSettings|Badges"
msgstr ""
@@ -16196,6 +16441,9 @@ msgstr ""
msgid "GroupSettings|New runners registration token has been generated!"
msgstr ""
+msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgstr ""
+
msgid "GroupSettings|Pipeline settings was updated for the group"
msgstr ""
@@ -16208,12 +16456,15 @@ msgstr ""
msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
-msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups."
+msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups"
msgstr ""
msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
msgstr ""
+msgid "GroupSettings|Prevents group members from being notified if the group is mentioned."
+msgstr ""
+
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
msgstr ""
@@ -16250,21 +16501,6 @@ msgstr ""
msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}."
msgstr ""
-msgid "GroupSettings|This setting is only available on the top-level group and it applies to all subgroups. Groups that have already been shared with a group outside %{group} will still be shared, and this access will have to be revoked manually."
-msgstr ""
-
-msgid "GroupSettings|This setting will be applied to all subgroups unless overridden by a group owner. Groups that already have access to the project will continue to have access unless removed manually."
-msgstr ""
-
-msgid "GroupSettings|This setting will override user notification preferences for all members of the group, subgroups, and projects."
-msgstr ""
-
-msgid "GroupSettings|This setting will prevent group members from being notified if the group is mentioned."
-msgstr ""
-
-msgid "GroupSettings|This setting will prevent group members from forking projects outside of the group."
-msgstr ""
-
msgid "GroupSettings|Transfer group"
msgstr ""
@@ -16382,7 +16618,7 @@ msgstr ""
msgid "GroupsNew|No import options available"
msgstr ""
-msgid "GroupsNew|Not all related objects are migrated, as %{docs_link_start}described here%{docs_link_end}. Please %{feedback_link_start}leave feedback%{feedback_link_end} on this feature."
+msgid "GroupsNew|Not all related objects are migrated. %{docs_link_start}More info%{docs_link_end}."
msgstr ""
msgid "GroupsNew|Personal access token"
@@ -16514,15 +16750,27 @@ msgstr ""
msgid "Hello %{name},"
msgstr ""
-msgid "Hello there"
-msgstr ""
-
msgid "Hello, %{name}!"
msgstr ""
msgid "Hello, %{username}!"
msgstr ""
+msgid "HelloMessage|%{handshake_emoji} Contribute to GitLab: %{contribute_link}"
+msgstr ""
+
+msgid "HelloMessage|%{magnifier_emoji} Create a new GitLab issue: %{new_issue_link}"
+msgstr ""
+
+msgid "HelloMessage|%{rocket_emoji} We like your curiosity! Help us improve GitLab by joining the team: %{jobs_page_link}"
+msgstr ""
+
+msgid "HelloMessage|Does this page need fixes or improvements? Open an issue or contribute a merge request to help make GitLab more lovable. At GitLab, everyone can contribute!"
+msgstr ""
+
+msgid "HelloMessage|Welcome to GitLab!"
+msgstr ""
+
msgid "Help"
msgstr ""
@@ -16532,13 +16780,10 @@ msgstr ""
msgid "Helps prevent bots from creating accounts."
msgstr ""
-msgid "Helps prevent bots from creating issues"
-msgstr ""
-
-msgid "Helps prevent malicious users hide their activity"
+msgid "Helps prevent bots from creating issues."
msgstr ""
-msgid "Helps reduce request volume (e.g. from crawlers or abusive bots)"
+msgid "Helps prevent malicious users hide their activity."
msgstr ""
msgid "Helps reduce request volume (for example, from crawlers or abusive bots)"
@@ -16662,6 +16907,12 @@ msgstr ""
msgid "Housekeeping, export, path, transfer, remove, archive."
msgstr ""
+msgid "How do I configure Akismet?"
+msgstr ""
+
+msgid "How do I configure it?"
+msgstr ""
+
msgid "How do I configure runners?"
msgstr ""
@@ -16683,19 +16934,25 @@ msgstr ""
msgid "How do I set up this service?"
msgstr ""
+msgid "How do I use a web terminal?"
+msgstr ""
+
+msgid "How do I use file templates?"
+msgstr ""
+
msgid "How it works"
msgstr ""
msgid "How many days need to pass between marking entity for deletion and actual removing it."
msgstr ""
-msgid "How many seconds an IP will be counted towards the limit"
+msgid "How many seconds an IP counts toward the IP address limit."
msgstr ""
-msgid "I accept the %{terms_link}"
+msgid "How the job limiter handles jobs exceeding the thresholds specified below. The 'track' mode only logs the jobs. The 'compress' mode compresses the jobs and raises an exception if the compressed size exceeds the limit."
msgstr ""
-msgid "I accept the|Terms of Service and Privacy Policy"
+msgid "I accept the %{terms_link}"
msgstr ""
msgid "I forgot my password"
@@ -16779,13 +17036,16 @@ msgstr ""
msgid "IP Address"
msgstr ""
-msgid "IP expiration time"
+msgid "IP address expiration time"
msgstr ""
-msgid "IP subnet restriction only allowed for top-level groups"
+msgid "IP address restrictions"
+msgstr ""
+
+msgid "IP addresses per user"
msgstr ""
-msgid "IPs per user"
+msgid "IP subnet restriction only allowed for top-level groups"
msgstr ""
msgid "Identifier"
@@ -16800,6 +17060,9 @@ msgstr ""
msgid "If any indexed field exceeds this limit it will be truncated to this number of characters and the rest will not be indexed or searchable. This does not apply to repository and wiki indexing. Setting this to 0 means it is unlimited."
msgstr ""
+msgid "If blank, defaults to %{code_open}Retry later%{code_close}."
+msgstr ""
+
msgid "If blank, set allowable lifetime to %{instance_level_policy_in_words}, as defined by the instance admin. Once set, existing tokens for users in this group may be revoked."
msgstr ""
@@ -16851,6 +17114,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 did not initiate these sign-in attempts, please reach out to your administrator or enable two-factor authentication (2FA) on your account."
+msgstr ""
+
msgid "If you did not initiate this change, please contact your administrator immediately."
msgstr ""
@@ -16942,10 +17208,10 @@ msgstr ""
msgid "Import Projects from Gitea"
msgstr ""
-msgid "Import a project"
+msgid "Import an exported GitLab project"
msgstr ""
-msgid "Import an exported GitLab project"
+msgid "Import and export rate limits"
msgstr ""
msgid "Import failed due to a GitHub error: %{original}"
@@ -16957,12 +17223,18 @@ msgstr ""
msgid "Import from Jira"
msgstr ""
+msgid "Import group"
+msgstr ""
+
msgid "Import group from file"
msgstr ""
msgid "Import groups"
msgstr ""
+msgid "Import history"
+msgstr ""
+
msgid "Import in progress"
msgstr ""
@@ -17026,7 +17298,25 @@ msgstr ""
msgid "Import timed out. Import took longer than %{import_jobs_expiration} seconds"
msgstr ""
-msgid "Import/Export Rate Limits"
+msgid "ImportAProjectModal|Import from a project"
+msgstr ""
+
+msgid "ImportAProjectModal|Import members from another project"
+msgstr ""
+
+msgid "ImportAProjectModal|Import project members"
+msgstr ""
+
+msgid "ImportAProjectModal|Only project members (not group members) are imported, and they get the same permissions as the project you import from."
+msgstr ""
+
+msgid "ImportAProjectModal|Successfully imported"
+msgstr ""
+
+msgid "ImportAProjectModal|Unable to import project members"
+msgstr ""
+
+msgid "ImportAProjectModal|You're importing members to the %{strongStart}%{name}%{strongEnd} project."
msgstr ""
msgid "ImportButtons|Connect repositories from"
@@ -17079,7 +17369,7 @@ msgstr[1] ""
msgid "Importing..."
msgstr ""
-msgid "Import|A repository URL usually ends in a .git suffix, although this is not required. Double check to make sure your repository URL is correct."
+msgid "Import|There is not a valid Git repository at this URL. If your HTTP repository is not publicly accessible, verify your credentials."
msgstr ""
msgid "Improve customer support with Service Desk"
@@ -17088,9 +17378,6 @@ msgstr ""
msgid "Improves Git cloning performance."
msgstr ""
-msgid "In %{time_to_now}"
-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 ""
@@ -17376,7 +17663,7 @@ msgstr ""
msgid "InProductMarketing|Start a GitLab Ultimate trial today in less than one minute, no credit card required."
msgstr ""
-msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no CC required"
+msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no credit card required"
msgstr ""
msgid "InProductMarketing|Start a trial"
@@ -17415,7 +17702,7 @@ msgstr ""
msgid "InProductMarketing|Team up in GitLab for greater efficiency"
msgstr ""
-msgid "InProductMarketing|Team work makes the dream work"
+msgid "InProductMarketing|Team work makes the dream work"
msgstr ""
msgid "InProductMarketing|Test, create, deploy"
@@ -17996,6 +18283,9 @@ msgstr ""
msgid "Integrations|Create new issue in Jira"
msgstr ""
+msgid "Integrations|Create new issue in ZenTao"
+msgstr ""
+
msgid "Integrations|Default settings are inherited from the group level."
msgstr ""
@@ -18089,9 +18379,15 @@ msgstr ""
msgid "Integrations|Search Jira issues"
msgstr ""
+msgid "Integrations|Search ZenTao issues"
+msgstr ""
+
msgid "Integrations|Send notifications about project events to Unify Circuit."
msgstr ""
+msgid "Integrations|Send notifications about project events to a Unify Circuit conversation. %{docs_link}"
+msgstr ""
+
msgid "Integrations|Sign in to add namespaces"
msgstr ""
@@ -18131,6 +18427,9 @@ msgstr ""
msgid "Integrations|You've activated every integration 🎉"
msgstr ""
+msgid "Integrations|ZenTao issues display here when you create issues in your project in ZenTao."
+msgstr ""
+
msgid "Interactive mode"
msgstr ""
@@ -18158,9 +18457,6 @@ msgstr ""
msgid "Interval Pattern"
msgstr ""
-msgid "Introducing Value Stream Analytics"
-msgstr ""
-
msgid "Introducing Your DevOps Report"
msgstr ""
@@ -18257,6 +18553,12 @@ msgstr ""
msgid "Investigate vulnerability: %{title}"
msgstr ""
+msgid "Invisible Captcha"
+msgstr ""
+
+msgid "Invisible Captcha helps prevent the creation of spam accounts. It adds a honeypot field and time-sensitive form submission to the account signup form."
+msgstr ""
+
msgid "Invitation"
msgstr ""
@@ -18710,12 +19012,18 @@ msgstr ""
msgid "Issues"
msgstr ""
+msgid "Issues I've created"
+msgstr ""
+
msgid "Issues Rate Limits"
msgstr ""
msgid "Issues and merge requests"
msgstr ""
+msgid "Issues assigned to me"
+msgstr ""
+
msgid "Issues can be bugs, tasks or ideas to be discussed. Also, issues are searchable and filterable."
msgstr ""
@@ -18827,7 +19135,7 @@ msgstr ""
msgid "Iterations|Create cadence"
msgstr ""
-msgid "Iterations|Create your first iteration"
+msgid "Iterations|Create iteration"
msgstr ""
msgid "Iterations|Delete cadence"
@@ -18836,6 +19144,9 @@ msgstr ""
msgid "Iterations|Delete iteration cadence?"
msgstr ""
+msgid "Iterations|Delete iteration?"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -18869,12 +19180,18 @@ msgstr ""
msgid "Iterations|New iteration cadence"
msgstr ""
+msgid "Iterations|No closed iterations."
+msgstr ""
+
msgid "Iterations|No iteration cadences to show."
msgstr ""
msgid "Iterations|No iterations in cadence."
msgstr ""
+msgid "Iterations|No open iterations."
+msgstr ""
+
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
@@ -18905,6 +19222,9 @@ msgstr ""
msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
msgstr ""
+msgid "Iterations|This will remove the iteration from any issues that are assigned to it."
+msgstr ""
+
msgid "Iterations|Title"
msgstr ""
@@ -18920,15 +19240,9 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "I’m familiar with the basics of DevOps."
-msgstr ""
-
msgid "I’m joining my team who’s already on GitLab"
msgstr ""
-msgid "I’m not familiar with the basics of DevOps."
-msgstr ""
-
msgid "Jaeger URL"
msgstr ""
@@ -19193,6 +19507,9 @@ msgstr ""
msgid "Job"
msgstr ""
+msgid "Job %{jobName}"
+msgstr ""
+
msgid "Job Failed #%{build_id}"
msgstr ""
@@ -19783,9 +20100,6 @@ msgstr ""
msgid "Learn more in the"
msgstr ""
-msgid "Learn more in the|pipeline schedules documentation"
-msgstr ""
-
msgid "Learn more."
msgstr ""
@@ -19897,9 +20211,6 @@ msgstr ""
msgid "Leave Admin Mode"
msgstr ""
-msgid "Leave blank for no limit. Once set, existing personal access tokens may be revoked."
-msgstr ""
-
msgid "Leave edit mode? All unsaved changes will be lost."
msgstr ""
@@ -19945,10 +20256,10 @@ msgstr ""
msgid "LicenseCompliance|Acceptable license to be used in the project"
msgstr ""
-msgid "LicenseCompliance|Add a license"
+msgid "LicenseCompliance|Add license and related policy"
msgstr ""
-msgid "LicenseCompliance|Add license and related policy"
+msgid "LicenseCompliance|Add license policy"
msgstr ""
msgid "LicenseCompliance|Allow"
@@ -20038,6 +20349,9 @@ msgstr ""
msgid "LicenseManagement|Uncategorized"
msgstr ""
+msgid "Licensed Enterprise Edition features can be used if the project namespace's plan includes the feature, or if the project is public."
+msgstr ""
+
msgid "Licensed Features"
msgstr ""
@@ -20104,7 +20418,10 @@ msgstr ""
msgid "Limit namespaces and projects that can be indexed"
msgstr ""
-msgid "Limit sign in from multiple ips"
+msgid "Limit project size at a global, group, and project level. %{link_start}Learn more%{link_end}."
+msgstr ""
+
+msgid "Limit sign in from multiple IP addresses"
msgstr ""
msgid "Limit the number of concurrent operations this secondary site can run in the background."
@@ -20116,11 +20433,17 @@ msgstr ""
msgid "Limit the number of issues and epics per minute a user can create through web and API requests."
msgstr ""
+msgid "Limit the size of Sidekiq jobs stored in Redis."
+msgstr ""
+
msgid "Limited to showing %d event at most"
msgid_plural "Limited to showing %d events at most"
msgstr[0] ""
msgstr[1] ""
+msgid "Limiting mode"
+msgstr ""
+
msgid "Line changes"
msgstr ""
@@ -20190,9 +20513,6 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
-msgid "List of users to be excluded from the limit"
-msgstr ""
-
msgid "List options"
msgstr ""
@@ -20232,9 +20552,6 @@ msgstr ""
msgid "Loading functions timed out. Please reload the page to try again."
msgstr ""
-msgid "Loading issues"
-msgstr ""
-
msgid "Loading more"
msgstr ""
@@ -20526,6 +20843,9 @@ msgstr ""
msgid "Marked For Deletion At - %{deletion_time}"
msgstr ""
+msgid "Marked as ready. Merging is now allowed."
+msgstr ""
+
msgid "Marked this %{noun} as a draft."
msgstr ""
@@ -20598,52 +20918,22 @@ msgstr ""
msgid "Max 100,000 events"
msgstr ""
-msgid "Max 20 characters"
-msgstr ""
-
-msgid "Max Group Export Download requests per minute per user"
-msgstr ""
-
-msgid "Max Group Export requests per minute per user"
-msgstr ""
-
-msgid "Max Group Import requests per minute per user"
-msgstr ""
-
-msgid "Max Project Export Download requests per minute per user"
-msgstr ""
-
-msgid "Max Project Export requests per minute per user"
-msgstr ""
-
-msgid "Max Project Import requests per minute per user"
-msgstr ""
-
-msgid "Max authenticated API requests per period per user"
-msgstr ""
-
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
-msgid "Max authenticated web requests per period per user"
-msgstr ""
-
msgid "Max file size is 200 KB."
msgstr ""
-msgid "Max requests per minute per user"
-msgstr ""
-
msgid "Max role"
msgstr ""
msgid "Max session time"
msgstr ""
-msgid "Max unauthenticated requests per period per IP"
+msgid "MaxBuilds"
msgstr ""
-msgid "MaxBuilds"
+msgid "Maximum 20 characters"
msgstr ""
msgid "Maximum Conan package file size in bytes"
@@ -20679,6 +20969,12 @@ msgstr ""
msgid "Maximum attachment size (MB)"
msgstr ""
+msgid "Maximum authenticated API requests per rate limit period per user"
+msgstr ""
+
+msgid "Maximum authenticated web requests per rate limit period per user"
+msgstr ""
+
msgid "Maximum bulk request size (MiB)"
msgstr ""
@@ -20724,6 +21020,15 @@ msgstr ""
msgid "Maximum files in a diff"
msgstr ""
+msgid "Maximum group export download requests per minute"
+msgstr ""
+
+msgid "Maximum group export requests per minute"
+msgstr ""
+
+msgid "Maximum group import requests per minute"
+msgstr ""
+
msgid "Maximum import size"
msgstr ""
@@ -20760,7 +21065,7 @@ msgstr ""
msgid "Maximum number of projects."
msgstr ""
-msgid "Maximum number of unique IPs per user"
+msgid "Maximum number of unique IP addresses per user."
msgstr ""
msgid "Maximum page reached"
@@ -20769,12 +21074,24 @@ msgstr ""
msgid "Maximum page size"
msgstr ""
+msgid "Maximum project export download requests per minute"
+msgstr ""
+
+msgid "Maximum project export requests per minute"
+msgstr ""
+
+msgid "Maximum project import requests per minute"
+msgstr ""
+
msgid "Maximum push size"
msgstr ""
msgid "Maximum push size (MB)"
msgstr ""
+msgid "Maximum requests per minute"
+msgstr ""
+
msgid "Maximum running slices"
msgstr ""
@@ -20802,10 +21119,16 @@ msgstr ""
msgid "Maximum time between updates that a mirror can have when scheduled to synchronize."
msgstr ""
-msgid "Maximum time for web terminal websocket connection (in seconds). 0 for unlimited."
+msgid "Maximum time that users are allowed to skip the setup of two-factor authentication (in hours). Set to 0 (zero) to enforce at next sign in."
msgstr ""
-msgid "Maximum time that users are allowed to skip the setup of two-factor authentication (in hours). Set to 0 (zero) to enforce at next sign in."
+msgid "Maximum time, in seconds, for a web terminal websocket connection. 0 for unlimited."
+msgstr ""
+
+msgid "Maximum unauthenticated API requests per rate limit period per IP"
+msgstr ""
+
+msgid "Maximum unauthenticated web requests per rate limit period per IP"
msgstr ""
msgid "May"
@@ -20823,9 +21146,6 @@ msgstr ""
msgid "Medium vulnerabilities present"
msgstr ""
-msgid "Member lock"
-msgstr ""
-
msgid "Member since"
msgstr ""
@@ -20862,6 +21182,9 @@ msgstr ""
msgid "Members of a group may only view projects they have permission to access"
msgstr ""
+msgid "Membership"
+msgstr ""
+
msgid "Members|%{time} by %{user}"
msgstr ""
@@ -20922,9 +21245,6 @@ msgstr ""
msgid "Members|Expiration date updated successfully."
msgstr ""
-msgid "Members|Expired"
-msgstr ""
-
msgid "Members|Filter members"
msgstr ""
@@ -20940,9 +21260,6 @@ msgstr ""
msgid "Members|Membership"
msgstr ""
-msgid "Members|No expiration set"
-msgstr ""
-
msgid "Members|Remove \"%{groupName}\""
msgstr ""
@@ -20964,9 +21281,6 @@ msgstr ""
msgid "Members|Search invited"
msgstr ""
-msgid "Members|in %{time}"
-msgstr ""
-
msgid "Member|Deny access"
msgstr ""
@@ -21042,9 +21356,6 @@ msgstr ""
msgid "Merge request %{mr_link} was reviewed by %{mr_author}"
msgstr ""
-msgid "Merge request (MR) approvals"
-msgstr ""
-
msgid "Merge request analytics"
msgstr ""
@@ -21066,12 +21377,21 @@ msgstr ""
msgid "Merge requests"
msgstr ""
+msgid "Merge requests I've created"
+msgstr ""
+
msgid "Merge requests are a place to propose changes you've made to a project and discuss those changes with others"
msgstr ""
msgid "Merge requests are read-only in a secondary Geo node"
msgstr ""
+msgid "Merge requests assigned to me"
+msgstr ""
+
+msgid "Merge requests that I'm a reviewer"
+msgstr ""
+
msgid "Merge the branch and fix any conflicts that come up"
msgstr ""
@@ -21132,10 +21452,10 @@ msgstr ""
msgid "MergeRequests|An error occurred while saving the draft comment."
msgstr ""
-msgid "MergeRequests|Failed to squash. Should be done manually."
+msgid "MergeRequests|Create issue to resolve thread"
msgstr ""
-msgid "MergeRequests|Resolve this thread in a new issue"
+msgid "MergeRequests|Failed to squash. Should be done manually."
msgstr ""
msgid "MergeRequests|Saving the comment failed"
@@ -21949,6 +22269,9 @@ msgstr ""
msgid "MoveIssue|Cannot move issue to project it originates from!"
msgstr ""
+msgid "MoveIssue|Cannot move issues of '%{issue_type}' type."
+msgstr ""
+
msgid "Moved issue to %{label} column in the board."
msgstr ""
@@ -22074,6 +22397,15 @@ 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. To learn more about reducing storage capacity please visit our docs."
msgstr ""
+msgid "NamespaceUserCap|Pending users must be reviewed and approved by a group owner. Learn more about %{user_caps_link_start}User Caps%{link_end} and %{users_pending_approval_link_start}Users Pending Approval%{link_end}."
+msgstr ""
+
+msgid "NamespaceUserCap|View pending user approvals"
+msgstr ""
+
+msgid "NamespaceUserCap|Your group has reached its billable member limit"
+msgstr ""
+
msgid "Namespaces"
msgstr ""
@@ -22116,9 +22448,6 @@ msgstr ""
msgid "Network"
msgstr ""
-msgid "Network Policy|New rule"
-msgstr ""
-
msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is inbound from a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
msgstr ""
@@ -22140,16 +22469,13 @@ msgstr ""
msgid "NetworkPolicies|%{strongOpen}any%{strongClose} port"
msgstr ""
-msgid "NetworkPolicies|+ Add alert"
-msgstr ""
-
msgid "NetworkPolicies|.yaml"
msgstr ""
msgid "NetworkPolicies|.yaml mode"
msgstr ""
-msgid "NetworkPolicies|Actions"
+msgid "NetworkPolicies|Add alert"
msgstr ""
msgid "NetworkPolicies|Alerts are intended to be selectively used for a limited number of events that are potentially concerning and warrant a manual review. Alerts should not be used as a substitute for a SIEM or a logging tool. High volume alerts are likely to be dropped so as to preserve the stability of GitLab's integration with Kubernetes."
@@ -22185,9 +22511,6 @@ msgstr ""
msgid "NetworkPolicies|Deny all traffic"
msgstr ""
-msgid "NetworkPolicies|Description"
-msgstr ""
-
msgid "NetworkPolicies|Edit policy"
msgstr ""
@@ -22200,9 +22523,6 @@ msgstr ""
msgid "NetworkPolicies|IP/subnet"
msgstr ""
-msgid "NetworkPolicies|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
-msgstr ""
-
msgid "NetworkPolicies|Invalid or empty policy"
msgstr ""
@@ -22212,19 +22532,16 @@ msgstr ""
msgid "NetworkPolicies|Kubernetes error: %{error}"
msgstr ""
-msgid "NetworkPolicies|Name"
-msgstr ""
-
msgid "NetworkPolicies|Network"
msgstr ""
-msgid "NetworkPolicies|Network traffic"
+msgid "NetworkPolicies|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
msgstr ""
-msgid "NetworkPolicies|New policy"
+msgid "NetworkPolicies|Network policy can be created after the environment is loaded successfully."
msgstr ""
-msgid "NetworkPolicies|No policies detected"
+msgid "NetworkPolicies|Network traffic"
msgstr ""
msgid "NetworkPolicies|None selected"
@@ -22233,21 +22550,12 @@ msgstr ""
msgid "NetworkPolicies|Please %{installLinkStart}install%{installLinkEnd} and %{configureLinkStart}configure a Kubernetes Agent for this project%{configureLinkEnd} to enable alerts."
msgstr ""
-msgid "NetworkPolicies|Policies are a specification of how groups of pods are allowed to communicate with each other's network endpoints."
-msgstr ""
-
msgid "NetworkPolicies|Policy %{policyName} was successfully changed"
msgstr ""
msgid "NetworkPolicies|Policy definition"
msgstr ""
-msgid "NetworkPolicies|Policy editor"
-msgstr ""
-
-msgid "NetworkPolicies|Policy preview"
-msgstr ""
-
msgid "NetworkPolicies|Rule"
msgstr ""
@@ -22257,9 +22565,6 @@ msgstr ""
msgid "NetworkPolicies|Rule mode is unavailable for this policy. In some cases, we cannot parse the YAML file back into the rules editor."
msgstr ""
-msgid "NetworkPolicies|Rules"
-msgstr ""
-
msgid "NetworkPolicies|Save changes"
msgstr ""
@@ -22272,9 +22577,6 @@ msgstr ""
msgid "NetworkPolicies|Traffic that does not match any rule will be blocked."
msgstr ""
-msgid "NetworkPolicies|Unable to parse policy"
-msgstr ""
-
msgid "NetworkPolicies|all DNS names"
msgstr ""
@@ -22454,6 +22756,9 @@ msgstr ""
msgid "New issue"
msgstr ""
+msgid "New issue in %{project}"
+msgstr ""
+
msgid "New issue title"
msgstr ""
@@ -22532,7 +22837,7 @@ msgstr ""
msgid "Newest first"
msgstr ""
-msgid "Newly registered users will by default be external"
+msgid "Newly-registered users are external by default"
msgstr ""
msgid "Next"
@@ -22847,8 +23152,10 @@ msgstr ""
msgid "No webhooks found, add one in the form above."
msgstr ""
-msgid "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} to renew your subscription."
-msgstr ""
+msgid "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} day to renew your subscription."
+msgid_plural "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} days to renew your subscription."
+msgstr[0] ""
+msgstr[1] ""
msgid "No. of commits"
msgstr ""
@@ -22865,7 +23172,7 @@ msgstr ""
msgid "Nodes"
msgstr ""
-msgid "Non-admin users can sign in with read-only access and make read-only API requests."
+msgid "Non-admin users are restricted to read-only access, in both GitLab UI and API."
msgstr ""
msgid "None"
@@ -22946,7 +23253,7 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
-msgid "Notes Rate Limits"
+msgid "Notes rate limit"
msgstr ""
msgid "Notes|Are you sure you want to cancel creating this comment?"
@@ -23113,9 +23420,6 @@ msgstr ""
msgid "November"
msgstr ""
-msgid "Novice"
-msgstr ""
-
msgid "Now, personalize your GitLab experience"
msgstr ""
@@ -23284,7 +23588,7 @@ msgstr ""
msgid "OnCallSchedules|For this rotation, on-call will be:"
msgstr ""
-msgid "OnCallSchedules|On-call schedule %{schedule} in Project %{project}"
+msgid "OnCallSchedules|On-call schedule %{obstacle} in Project %{project}"
msgstr ""
msgid "OnCallSchedules|On-call schedules"
@@ -23431,22 +23735,22 @@ msgstr ""
msgid "OnDemandScans|Scanner profile"
msgstr ""
-msgid "OnDemandScans|Select one of the existing profiles"
+msgid "OnDemandScans|Schedule scan"
msgstr ""
-msgid "OnDemandScans|Site profile"
+msgid "OnDemandScans|Select one of the existing profiles"
msgstr ""
-msgid "OnDemandScans|Use existing scanner profile"
+msgid "OnDemandScans|Site profile"
msgstr ""
-msgid "OnDemandScans|Use existing site profile"
+msgid "OnDemandScans|Start time"
msgstr ""
-msgid "OnDemandScans|You can either choose a passive scan or validate the target site in your chosen site profile. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
+msgid "OnDemandScans|Use existing scanner profile"
msgstr ""
-msgid "OnDemandScans|You cannot run an active scan against an unvalidated site."
+msgid "OnDemandScans|Use existing site profile"
msgstr ""
msgid "OnDemandScans|You must create a repository within your project to run an on-demand scan."
@@ -23511,6 +23815,9 @@ msgstr ""
msgid "Only admins can delete project"
msgstr ""
+msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
+msgstr ""
+
msgid "Only include features new to your current subscription tier."
msgstr ""
@@ -23529,6 +23836,12 @@ msgstr ""
msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
+msgid "Only reCAPTCHA v2 is supported:"
+msgstr ""
+
+msgid "Only users from the specified IP address ranges are able to reach this group, including all subgroups, projects, and Git repositories."
+msgstr ""
+
msgid "Only verified users with an email address in any of these domains can be added to the group."
msgstr ""
@@ -23715,9 +24028,6 @@ msgstr ""
msgid "Package Registry"
msgstr ""
-msgid "Package Registry Rate Limits"
-msgstr ""
-
msgid "Package Registry: authenticated API requests"
msgstr ""
@@ -23736,6 +24046,9 @@ msgstr ""
msgid "Package recipe already exists"
msgstr ""
+msgid "Package registry rate limits"
+msgstr ""
+
msgid "Package type"
msgstr ""
@@ -23802,6 +24115,9 @@ msgstr ""
msgid "PackageRegistry|Composer"
msgstr ""
+msgid "PackageRegistry|Composer.json with license: %{license} and version: %{version}"
+msgstr ""
+
msgid "PackageRegistry|Conan"
msgstr ""
@@ -23865,6 +24181,9 @@ msgstr ""
msgid "PackageRegistry|Copy require package include"
msgstr ""
+msgid "PackageRegistry|Copy target SHA"
+msgstr ""
+
msgid "PackageRegistry|Copy yarn command"
msgstr ""
@@ -23931,6 +24250,9 @@ msgstr ""
msgid "PackageRegistry|Install package version"
msgstr ""
+msgid "PackageRegistry|Instance-level"
+msgstr ""
+
msgid "PackageRegistry|Invalid Package: failed metadata extraction"
msgstr ""
@@ -23976,6 +24298,9 @@ msgstr ""
msgid "PackageRegistry|Pip Command"
msgstr ""
+msgid "PackageRegistry|Project-level"
+msgstr ""
+
msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
msgstr ""
@@ -23997,6 +24322,9 @@ msgstr ""
msgid "PackageRegistry|Remove package"
msgstr ""
+msgid "PackageRegistry|Required Python: %{pythonVersion}"
+msgstr ""
+
msgid "PackageRegistry|RubyGems"
msgstr ""
@@ -24039,6 +24367,9 @@ msgstr ""
msgid "PackageRegistry|Source project located at %{link}"
msgstr ""
+msgid "PackageRegistry|Target SHA: %{sha}"
+msgstr ""
+
msgid "PackageRegistry|There are no other versions of this package."
msgstr ""
@@ -24207,6 +24538,18 @@ msgstr ""
msgid "Password was successfully updated. Please sign in again."
msgstr ""
+msgid "PasswordPrompt|Confirm password"
+msgstr ""
+
+msgid "PasswordPrompt|Confirm password to continue"
+msgstr ""
+
+msgid "PasswordPrompt|Password is required"
+msgstr ""
+
+msgid "PasswordPrompt|Please enter your password to confirm"
+msgstr ""
+
msgid "Passwords should be unique and not used for any other sites or services."
msgstr ""
@@ -24234,6 +24577,9 @@ msgstr ""
msgid "Paste project path (i.e. gitlab-org/gitlab)"
msgstr ""
+msgid "Paste this DSN into your Sentry SDK"
+msgstr ""
+
msgid "Paste your public SSH key, which is usually contained in the file '~/.ssh/id_ed25519.pub' or '~/.ssh/id_rsa.pub' and begins with 'ssh-ed25519' or 'ssh-rsa'. Do not paste your private SSH key, as that can compromise your identity."
msgstr ""
@@ -24318,6 +24664,9 @@ msgstr ""
msgid "PerformanceBar|First Contentful Paint"
msgstr ""
+msgid "PerformanceBar|Flamegraph with mode:"
+msgstr ""
+
msgid "PerformanceBar|Frontend resources"
msgstr ""
@@ -24351,6 +24700,15 @@ msgstr ""
msgid "PerformanceBar|Trace"
msgstr ""
+msgid "PerformanceBar|cpu"
+msgstr ""
+
+msgid "PerformanceBar|object"
+msgstr ""
+
+msgid "PerformanceBar|wall"
+msgstr ""
+
msgid "Period in seconds"
msgstr ""
@@ -24579,6 +24937,48 @@ msgstr ""
msgid "PipelineSchedules|Variables"
msgstr ""
+msgid "PipelineSource|API"
+msgstr ""
+
+msgid "PipelineSource|Chat"
+msgstr ""
+
+msgid "PipelineSource|External"
+msgstr ""
+
+msgid "PipelineSource|External Pull Request"
+msgstr ""
+
+msgid "PipelineSource|Merge Request"
+msgstr ""
+
+msgid "PipelineSource|On-Demand DAST Scan"
+msgstr ""
+
+msgid "PipelineSource|On-Demand DAST Validation"
+msgstr ""
+
+msgid "PipelineSource|Parent Pipeline"
+msgstr ""
+
+msgid "PipelineSource|Pipeline"
+msgstr ""
+
+msgid "PipelineSource|Push"
+msgstr ""
+
+msgid "PipelineSource|Schedule"
+msgstr ""
+
+msgid "PipelineSource|Trigger"
+msgstr ""
+
+msgid "PipelineSource|Web"
+msgstr ""
+
+msgid "PipelineSource|Web IDE"
+msgstr ""
+
msgid "PipelineStatusTooltip|Pipeline: %{ciStatus}"
msgstr ""
@@ -24879,46 +25279,7 @@ msgstr ""
msgid "Pipeline|Source"
msgstr ""
-msgid "Pipeline|Source|API"
-msgstr ""
-
-msgid "Pipeline|Source|Chat"
-msgstr ""
-
-msgid "Pipeline|Source|External"
-msgstr ""
-
-msgid "Pipeline|Source|External Pull Request"
-msgstr ""
-
-msgid "Pipeline|Source|Merge Request"
-msgstr ""
-
-msgid "Pipeline|Source|On-Demand DAST Scan"
-msgstr ""
-
-msgid "Pipeline|Source|On-Demand DAST Validation"
-msgstr ""
-
-msgid "Pipeline|Source|Parent Pipeline"
-msgstr ""
-
-msgid "Pipeline|Source|Pipeline"
-msgstr ""
-
-msgid "Pipeline|Source|Push"
-msgstr ""
-
-msgid "Pipeline|Source|Schedule"
-msgstr ""
-
-msgid "Pipeline|Source|Trigger"
-msgstr ""
-
-msgid "Pipeline|Source|Web"
-msgstr ""
-
-msgid "Pipeline|Source|Web IDE"
+msgid "Pipeline|Source|Security Policy"
msgstr ""
msgid "Pipeline|Specify variable values to be used in this run. The values specified in %{linkStart}CI/CD settings%{linkEnd} will be used by default."
@@ -24969,7 +25330,7 @@ msgstr ""
msgid "Pipeline|We are currently unable to fetch pipeline data"
msgstr ""
-msgid "Pipeline|You’re about to stop pipeline %{pipelineId}."
+msgid "Pipeline|You’re about to stop pipeline #%{pipelineId}."
msgstr ""
msgid "Pipeline|for"
@@ -24996,6 +25357,9 @@ msgstr ""
msgid "Plain diff"
msgstr ""
+msgid "Plain-text response to send to clients that hit a rate limit"
+msgstr ""
+
msgid "Plan:"
msgstr ""
@@ -25140,9 +25504,6 @@ msgstr ""
msgid "Please provide attributes to update"
msgstr ""
-msgid "Please provide your username or email address."
-msgstr ""
-
msgid "Please reach out if you have any questions and we'll be happy to assist."
msgstr ""
@@ -25185,9 +25546,6 @@ msgstr ""
msgid "Please set a new password before proceeding."
msgstr ""
-msgid "Please share your feedback about %{featureName} %{linkStart}in this issue%{linkEnd} to help us improve the experience."
-msgstr ""
-
msgid "Please solve the captcha"
msgstr ""
@@ -25365,6 +25723,9 @@ msgstr ""
msgid "Prevent adding new members to project membership within this group"
msgstr ""
+msgid "Prevent auto-stopping"
+msgstr ""
+
msgid "Prevent editing approval rules in projects and merge requests."
msgstr ""
@@ -25377,7 +25738,7 @@ msgstr ""
msgid "Prevent users from changing their profile name"
msgstr ""
-msgid "Prevent users from performing write operations on GitLab while performing maintenance."
+msgid "Prevent users from performing write operations while GitLab maintenance is in progress."
msgstr ""
msgid "Preview"
@@ -25650,6 +26011,9 @@ msgstr ""
msgid "Profiles|Enter your name, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Enter your password to confirm the email change"
+msgstr ""
+
msgid "Profiles|Enter your pronouns to let people know how to refer to you"
msgstr ""
@@ -25884,10 +26248,10 @@ msgstr ""
msgid "Profiles|e.g. My MacBook key"
msgstr ""
-msgid "Profiles|username"
+msgid "Profiles|https://website.com"
msgstr ""
-msgid "Profiles|website.com"
+msgid "Profiles|username"
msgstr ""
msgid "Profiles|your account"
@@ -26130,9 +26494,21 @@ msgstr ""
msgid "ProjectSelect| or group"
msgstr ""
+msgid "ProjectSelect|No matching results"
+msgstr ""
+
msgid "ProjectSelect|Search for project"
msgstr ""
+msgid "ProjectSelect|Search projects"
+msgstr ""
+
+msgid "ProjectSelect|Select a project"
+msgstr ""
+
+msgid "ProjectSelect|There was an error fetching the projects. Please try again."
+msgstr ""
+
msgid "ProjectService|Drone server URL"
msgstr ""
@@ -26220,6 +26596,9 @@ msgstr ""
msgid "ProjectService|Trigger event when a new, unique alert is recorded."
msgstr ""
+msgid "ProjectService|Trigger event when a new, unique vulnerability is recorded. (Note: This feature requires an Ultimate plan.)"
+msgstr ""
+
msgid "ProjectService|Trigger event when a pipeline status changes."
msgstr ""
@@ -26634,9 +27013,15 @@ msgstr ""
msgid "Projects are graded based on the highest severity vulnerability present"
msgstr ""
+msgid "Projects are organized into groups"
+msgstr ""
+
msgid "Projects contributed to"
msgstr ""
+msgid "Projects help you organize your work. They contain your file repository, issues, merge requests, and so much more."
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr ""
@@ -26871,10 +27256,10 @@ msgstr ""
msgid "PrometheusService|Prometheus cluster integration"
msgstr ""
-msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
+msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
msgstr ""
-msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
+msgid "PrometheusService|The ID of the IAP-secured resource."
msgstr ""
msgid "PrometheusService|The Prometheus API base URL."
@@ -27492,6 +27877,9 @@ msgstr ""
msgid "Rate limit"
msgstr ""
+msgid "Rate limits can help reduce request volume (like from crawlers or abusive bots)."
+msgstr ""
+
msgid "Raw blob request rate limit per minute"
msgstr ""
@@ -27504,6 +27892,9 @@ msgstr ""
msgid "Re-authentication required"
msgstr ""
+msgid "Re-import"
+msgstr ""
+
msgid "Re-request review"
msgstr ""
@@ -27525,6 +27916,9 @@ msgstr ""
msgid "Read more about related issues"
msgstr ""
+msgid "Read their documentation."
+msgstr ""
+
msgid "Ready to get started with GitLab? Follow these steps to set up your workspace, plan and commit changes, and deploy your project."
msgstr ""
@@ -27558,6 +27952,9 @@ msgstr ""
msgid "Receive any notifications from GitLab."
msgstr ""
+msgid "Receive notification of abuse reports by email."
+msgstr ""
+
msgid "Receive notifications about your own activity"
msgstr ""
@@ -27701,9 +28098,6 @@ msgstr ""
msgid "Registry setup"
msgstr ""
-msgid "Regulate approvals by authors/committers. Affects all projects."
-msgstr ""
-
msgid "Reindexing Status: %{status} (Slice multiplier: %{multiplier}, Maximum running slices: %{max_slices})"
msgstr ""
@@ -27799,6 +28193,9 @@ msgstr ""
msgid "Release|Something went wrong while saving the release details."
msgstr ""
+msgid "Reload page"
+msgstr ""
+
msgid "Remediations"
msgstr ""
@@ -28081,6 +28478,9 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
+msgid "Repeats"
+msgstr ""
+
msgid "Replace"
msgstr ""
@@ -28443,10 +28843,7 @@ msgstr ""
msgid "Require additional authentication for administrative tasks."
msgstr ""
-msgid "Require all users in this group to setup Two-factor authentication"
-msgstr ""
-
-msgid "Require all users in this group to setup two-factor authentication"
+msgid "Require all users in this group to set up two-factor authentication"
msgstr ""
msgid "Required approvals (%{approvals_given} given)"
@@ -28492,6 +28889,9 @@ msgstr[1] ""
msgid "Requires values to meet regular expression requirements."
msgstr ""
+msgid "Requires you to deploy or set up cloud-hosted Sentry."
+msgstr ""
+
msgid "Requires your primary GitLab email address."
msgstr ""
@@ -28552,9 +28952,6 @@ msgstr ""
msgid "Resolve"
msgstr ""
-msgid "Resolve all threads in new issue"
-msgstr ""
-
msgid "Resolve conflicts"
msgstr ""
@@ -28612,6 +29009,9 @@ msgstr ""
msgid "Response text"
msgstr ""
+msgid "Restart GitLab to apply changes."
+msgstr ""
+
msgid "Restart Terminal"
msgstr ""
@@ -28630,6 +29030,9 @@ msgstr ""
msgid "Restoring the project will prevent the project from being removed on this date and restore people's ability to make changes to it."
msgstr ""
+msgid "Restrict group access by IP address. %{link_start}Learn more%{link_end}."
+msgstr ""
+
msgid "Restrict membership by email domain"
msgstr ""
@@ -28943,6 +29346,9 @@ msgstr ""
msgid "Runners|Runner #%{runner_id}"
msgstr ""
+msgid "Runners|Runner assigned to project."
+msgstr ""
+
msgid "Runners|Runner is offline, last contact was %{runner_contact} ago"
msgstr ""
@@ -28955,6 +29361,9 @@ msgstr ""
msgid "Runners|Runner registration"
msgstr ""
+msgid "Runners|Runner unassigned from project."
+msgstr ""
+
msgid "Runners|Runners"
msgstr ""
@@ -29147,7 +29556,7 @@ msgstr ""
msgid "SastEntryPoints|How do I set up SAST?"
msgstr ""
-msgid "SastEntryPoints|Learn more."
+msgid "SastEntryPoints|Learn more"
msgstr ""
msgid "Satisfied"
@@ -29189,7 +29598,7 @@ msgstr ""
msgid "Save pipeline schedule"
msgstr ""
-msgid "Save space and find images in the container Registry. remove unneeded tags and keep only the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
+msgid "Save storage space by automatically deleting tags from the container registry and keeping the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
msgstr ""
msgid "Saving"
@@ -29363,6 +29772,9 @@ msgstr ""
msgid "Search or filter results…"
msgstr ""
+msgid "Search or jump to..."
+msgstr ""
+
msgid "Search project"
msgstr ""
@@ -29423,16 +29835,16 @@ msgstr ""
msgid "SearchCodeResults|of %{link_to_project}"
msgstr ""
-msgid "SearchResults|Showing %{count} %{scope} for%{term_element}"
+msgid "SearchResults|Showing %{count} %{scope} for %{term_element}"
msgstr ""
-msgid "SearchResults|Showing %{count} %{scope} for%{term_element} in your personal and project snippets"
+msgid "SearchResults|Showing %{count} %{scope} for %{term_element} in your personal and project snippets"
msgstr ""
-msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for%{term_element}"
+msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for %{term_element}"
msgstr ""
-msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for%{term_element} in your personal and project snippets"
+msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for %{term_element} in your personal and project snippets"
msgstr ""
msgid "SearchResults|code result"
@@ -29514,6 +29926,9 @@ msgstr ""
msgid "Secret Detection"
msgstr ""
+msgid "Secret access key"
+msgstr ""
+
msgid "Secret token"
msgstr ""
@@ -29553,9 +29968,6 @@ msgstr ""
msgid "SecurityApprovals|A merge request approval is required when the license compliance report contains a denied license."
msgstr ""
-msgid "SecurityApprovals|Configurable if security scanners are enabled. %{linkStart}Learn more.%{linkEnd}"
-msgstr ""
-
msgid "SecurityApprovals|Coverage-Check"
msgstr ""
@@ -29568,24 +29980,18 @@ msgstr ""
msgid "SecurityApprovals|Learn more about Vulnerability-Check"
msgstr ""
-msgid "SecurityApprovals|License Scanning must be enabled. %{linkStart}Learn more%{linkEnd}."
-msgstr ""
-
msgid "SecurityApprovals|License-Check"
msgstr ""
msgid "SecurityApprovals|Requires approval for Denied licenses. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}More information%{linkEnd}"
+msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "SecurityApprovals|Requires approval for vulnerabilities. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
-msgid "SecurityApprovals|Test coverage must be enabled. %{linkStart}Learn more%{linkEnd}."
-msgstr ""
-
msgid "SecurityApprovals|Vulnerability-Check"
msgstr ""
@@ -29649,6 +30055,12 @@ msgstr ""
msgid "SecurityConfiguration|Immediately begin risk analysis and remediation with application security features. Start with SAST and Secret Detection, available to all plans. Upgrade to Ultimate to get all features, including:"
msgstr ""
+msgid "SecurityConfiguration|Manage corpus"
+msgstr ""
+
+msgid "SecurityConfiguration|Manage corpus files used as mutation sources in coverage fuzzing."
+msgstr ""
+
msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
msgstr ""
@@ -29703,6 +30115,12 @@ msgstr ""
msgid "SecurityOrchestration|Action"
msgstr ""
+msgid "SecurityOrchestration|Actions"
+msgstr ""
+
+msgid "SecurityOrchestration|Add rule"
+msgstr ""
+
msgid "SecurityOrchestration|All policies"
msgstr ""
@@ -29736,9 +30154,6 @@ msgstr ""
msgid "SecurityOrchestration|Network"
msgstr ""
-msgid "SecurityOrchestration|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
-msgstr ""
-
msgid "SecurityOrchestration|New policy"
msgstr ""
@@ -29754,6 +30169,9 @@ msgstr ""
msgid "SecurityOrchestration|Policy editor"
msgstr ""
+msgid "SecurityOrchestration|Policy preview"
+msgstr ""
+
msgid "SecurityOrchestration|Policy status"
msgstr ""
@@ -29763,6 +30181,9 @@ msgstr ""
msgid "SecurityOrchestration|Rule"
msgstr ""
+msgid "SecurityOrchestration|Rules"
+msgstr ""
+
msgid "SecurityOrchestration|Scan Execution"
msgstr ""
@@ -29856,6 +30277,9 @@ msgstr ""
msgid "SecurityReports|Create issue"
msgstr ""
+msgid "SecurityReports|Development vulnerabilities"
+msgstr ""
+
msgid "SecurityReports|Dismiss vulnerability"
msgstr ""
@@ -29871,6 +30295,9 @@ msgstr ""
msgid "SecurityReports|Download results"
msgstr ""
+msgid "SecurityReports|Download scanned URLs"
+msgstr ""
+
msgid "SecurityReports|Download scanned resources"
msgstr ""
@@ -29994,6 +30421,9 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
+msgid "SecurityReports|The Vulnerability Report shows the results of the lastest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "SecurityReports|The security reports below contain one or more vulnerability findings that could not be parsed and were not recorded. Download the artifacts in the job output to investigate. Ensure any security report created conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
msgstr ""
@@ -30135,10 +30565,10 @@ msgstr ""
msgid "Select a repository"
msgstr ""
-msgid "Select a role"
+msgid "Select a repository containing templates for common files."
msgstr ""
-msgid "Select a shared template repository for all projects on this instance."
+msgid "Select a role"
msgstr ""
msgid "Select a template repository"
@@ -30216,6 +30646,9 @@ msgstr ""
msgid "Select project to choose zone"
msgstr ""
+msgid "Select project to create issue"
+msgstr ""
+
msgid "Select projects"
msgstr ""
@@ -30333,6 +30766,9 @@ msgstr ""
msgid "Send emails to help guide new users through the onboarding process."
msgstr ""
+msgid "Send emails to users upon account deactivation."
+msgstr ""
+
msgid "Send message"
msgstr ""
@@ -30351,6 +30787,9 @@ msgstr ""
msgid "Send service data"
msgstr ""
+msgid "Sentry"
+msgstr ""
+
msgid "Sentry API URL"
msgstr ""
@@ -30465,6 +30904,9 @@ msgstr ""
msgid "Service"
msgstr ""
+msgid "Service Accounts keys are required to authorize GitLab to deploy your Google Cloud project."
+msgstr ""
+
msgid "Service Desk"
msgstr ""
@@ -30537,15 +30979,15 @@ msgstr ""
msgid "Set a password on your account to pull or push via %{protocol}."
msgstr ""
-msgid "Set a template repository for projects in this group"
-msgstr ""
-
msgid "Set access permissions for this token."
msgstr ""
msgid "Set an instance-wide domain that will be available to all clusters when installing Knative."
msgstr ""
+msgid "Set any rate limit to %{code_open}0%{code_close} to disable the limit."
+msgstr ""
+
msgid "Set default and restrict visibility levels. Configure import sources and git access protocol."
msgstr ""
@@ -30558,7 +31000,7 @@ msgstr ""
msgid "Set limit to 0 to allow any file size."
msgstr ""
-msgid "Set max session time for web terminal."
+msgid "Set limits for web and API requests."
msgstr ""
msgid "Set milestone"
@@ -30567,15 +31009,18 @@ msgstr ""
msgid "Set new password"
msgstr ""
-msgid "Set notification email for abuse reports."
+msgid "Set parent epic to an epic"
msgstr ""
-msgid "Set parent epic to an epic"
+msgid "Set per-user rate limits for imports and exports of projects and groups."
msgstr ""
msgid "Set projects and maximum size limits, session duration, user options, and check feature availability for namespace plan."
msgstr ""
+msgid "Set rate limits for package registry API requests that supersede the general user and IP rate limits."
+msgstr ""
+
msgid "Set severity"
msgstr ""
@@ -30594,15 +31039,24 @@ msgstr ""
msgid "Set the default branch for this project. All merge requests and commits are made against this branch unless you specify a different one."
msgstr ""
+msgid "Set the default expiration time for job artifacts in all projects. Set to %{code_open}0%{code_close} to never expire artifacts by default. If no unit is written, it defaults to seconds. For example, these are all equivalent: %{code_open}3600%{code_close}, %{code_open}60 minutes%{code_close}, or %{code_open}one hour%{code_close}."
+msgstr ""
+
msgid "Set the due date to %{due_date}."
msgstr ""
msgid "Set the iteration to %{iteration_reference}."
msgstr ""
+msgid "Set the maximum session time for a web terminal."
+msgstr ""
+
msgid "Set the milestone to %{milestone_reference}."
msgstr ""
+msgid "Set the per-user rate limit for notes created by web or API requests."
+msgstr ""
+
msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
msgstr ""
@@ -30804,6 +31258,9 @@ msgstr ""
msgid "Show Pipeline IID"
msgstr ""
+msgid "Show all %{issuable_type}."
+msgstr ""
+
msgid "Show all activity"
msgstr ""
@@ -30855,15 +31312,9 @@ msgstr ""
msgid "Show list"
msgstr ""
-msgid "Show me advanced features"
-msgstr ""
-
msgid "Show me how to add a pipeline"
msgstr ""
-msgid "Show me the basics"
-msgstr ""
-
msgid "Show one file at a time"
msgstr ""
@@ -30904,15 +31355,15 @@ msgstr ""
msgid "Showing %{pageSize} of %{total} %{issuableType}"
msgstr ""
-msgid "Showing %{pageSize} of %{total} issues"
-msgstr ""
-
msgid "Showing all epics"
msgstr ""
msgid "Showing all issues"
msgstr ""
+msgid "Showing data for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
+msgstr ""
+
msgid "Showing data for workflow items created in this date range. Date range cannot exceed %{maxDateRange} days."
msgstr ""
@@ -30952,6 +31403,15 @@ msgstr ""
msgid "Sidebar|Weight"
msgstr ""
+msgid "Sidekiq job compression threshold (bytes)"
+msgstr ""
+
+msgid "Sidekiq job size limit (bytes)"
+msgstr ""
+
+msgid "Sidekiq job size limits"
+msgstr ""
+
msgid "Sign in"
msgstr ""
@@ -31072,6 +31532,9 @@ msgstr ""
msgid "Site profile not found for given parameters"
msgstr ""
+msgid "Sites"
+msgstr ""
+
msgid "Size"
msgstr ""
@@ -31102,19 +31565,22 @@ msgstr ""
msgid "SlackIntegration|Sends notifications about project events to Slack channels."
msgstr ""
-msgid "SlackService|2. Paste the %{strong_open}Token%{strong_close} into the field below"
+msgid "SlackService|1. %{slash_command_link_start}Add a slash command%{slash_command_link_end} in your Slack team using this information:"
msgstr ""
-msgid "SlackService|3. Select the %{strong_open}Active%{strong_close} checkbox, press %{strong_open}Save changes%{strong_close} and start using GitLab inside Slack!"
+msgid "SlackService|2. Paste the token from Slack in the %{strong_open}Token%{strong_close} field below."
msgstr ""
-msgid "SlackService|Fill in the word that works best for your team."
+msgid "SlackService|3. Select the %{strong_open}Active%{strong_close} checkbox, select %{strong_open}Save changes%{strong_close}, and start using slash commands in Slack!"
+msgstr ""
+
+msgid "SlackService|After setup, get a list of available Slack slash commands by entering"
msgstr ""
-msgid "SlackService|See list of available commands in Slack after setting up this service, by entering"
+msgid "SlackService|Fill in the word that works best for your team."
msgstr ""
-msgid "SlackService|This service allows users to perform common operations on this project by entering slash commands in Slack."
+msgid "SlackService|Perform common operations in this project by entering slash commands in Slack."
msgstr ""
msgid "Slice multiplier"
@@ -31180,7 +31646,7 @@ msgstr ""
msgid "Some child epics may be hidden due to applied filters"
msgstr ""
-msgid "Some common domains are not allowed. %{read_more_link}."
+msgid "Some common domains are not allowed. %{learn_more_link}."
msgstr ""
msgid "Some of the designs you tried uploading did not change:"
@@ -31264,9 +31730,6 @@ msgstr ""
msgid "Something went wrong while exporting requirements"
msgstr ""
-msgid "Something went wrong while fetching %{listType} list"
-msgstr ""
-
msgid "Something went wrong while fetching branches"
msgstr ""
@@ -31321,15 +31784,9 @@ msgstr ""
msgid "Something went wrong while merging this merge request. Please try again."
msgstr ""
-msgid "Something went wrong while moving issues."
-msgstr ""
-
msgid "Something went wrong while obtaining the Let's Encrypt certificate."
msgstr ""
-msgid "Something went wrong while performing the action."
-msgstr ""
-
msgid "Something went wrong while promoting the issue to an epic. Please try again."
msgstr ""
@@ -31657,7 +32114,10 @@ msgstr ""
msgid "SourcegraphPreferences|Uses a custom %{linkStart}Sourcegraph instance%{linkEnd}."
msgstr ""
-msgid "Spam Check API Key"
+msgid "Spam Check"
+msgstr ""
+
+msgid "Spam Check API key"
msgstr ""
msgid "Spam Logs"
@@ -31675,7 +32135,7 @@ msgstr ""
msgid "Specified URL cannot be used: \"%{reason}\""
msgstr ""
-msgid "Specify an e-mail address regex pattern to identify default internal users."
+msgid "Specify an email address regex pattern to identify default internal users."
msgstr ""
msgid "Speed up your pipelines with Needs relationships"
@@ -31930,7 +32390,7 @@ msgstr ""
msgid "StatusCheck|An error occurred fetching the status checks."
msgstr ""
-msgid "StatusCheck|Apply this status check to any branch or a specific protected branch."
+msgid "StatusCheck|Apply this status check to all branches or a specific protected branch."
msgstr ""
msgid "StatusCheck|Check for a status response in Merge Requests. Failures do not block merges. %{link_start}Learn more%{link_end}."
@@ -32269,6 +32729,9 @@ msgstr ""
msgid "Subscriptions"
msgstr ""
+msgid "Subscription|Your subscription for %{strong}%{namespace_name}%{strong_close} has expired and you are now on %{pricing_link_start}the GitLab Free tier%{pricing_link_end}. Don't worry, your data is safe. Get in touch with our support team (%{support_email}). They'll gladly help with your subscription renewal."
+msgstr ""
+
msgid "Subtracted"
msgstr ""
@@ -32497,6 +32960,9 @@ msgstr ""
msgid "SuperSonics|Plan"
msgstr ""
+msgid "SuperSonics|Please agree to the Subscription Agreement"
+msgstr ""
+
msgid "SuperSonics|Ready to get started? A GitLab plan is ideal for scaling organizations and for multi team usage."
msgstr ""
@@ -32527,6 +32993,9 @@ msgstr ""
msgid "SuperSonics|The activation code is not valid. Please make sure to copy it exactly from the Customers Portal or confirmation email. Learn more about %{linkStart}activating your subscription%{linkEnd}."
msgstr ""
+msgid "SuperSonics|The activation code should be a 24-character alphanumeric string"
+msgstr ""
+
msgid "SuperSonics|There is a connectivity issue."
msgstr ""
@@ -32569,9 +33038,15 @@ msgstr ""
msgid "SuperSonics|You do not have an active subscription"
msgstr ""
+msgid "SuperSonics|You have successfully added a license that activates on %{date}. Please see the subscription history table below for more details."
+msgstr ""
+
msgid "SuperSonics|You'll be charged for %{trueUpLinkStart}users over license%{trueUpLinkEnd} on a quarterly or annual basis, depending on the terms of your agreement."
msgstr ""
+msgid "SuperSonics|Your future dated license was successfully added"
+msgstr ""
+
msgid "SuperSonics|Your subscription"
msgstr ""
@@ -32824,7 +33299,7 @@ msgstr ""
msgid "Template to append to all Service Desk issues"
msgstr ""
-msgid "TemplateRepository|Select a repository to make its templates available to all projects. %{link_start}What should the repository contain?%{link_end} "
+msgid "TemplateRepository|Create common files more quickly, and standardize their format."
msgstr ""
msgid "Templates"
@@ -33030,7 +33505,7 @@ msgstr ""
msgid "TestCases|Search test cases"
msgstr ""
-msgid "TestCases|Something went wrong while adding test case to Todo."
+msgid "TestCases|Something went wrong while adding test case to a to-do item."
msgstr ""
msgid "TestCases|Something went wrong while creating a test case."
@@ -33042,7 +33517,7 @@ msgstr ""
msgid "TestCases|Something went wrong while fetching test cases list."
msgstr ""
-msgid "TestCases|Something went wrong while marking test case todo as done."
+msgid "TestCases|Something went wrong while marking test case to-do item as done."
msgstr ""
msgid "TestCases|Something went wrong while moving test case."
@@ -33162,7 +33637,7 @@ msgstr ""
msgid "Thanks for your purchase!"
msgstr ""
-msgid "That is ok, I do not want to renew"
+msgid "That's OK, I don't want to renew"
msgstr ""
msgid "That's it, well done!"
@@ -33185,7 +33660,7 @@ msgid_plural "The %{type} contains the following errors:"
msgstr[0] ""
msgstr[1] ""
-msgid "The API key used by GitLab for accessing the Spam Check service endpoint"
+msgid "The API key used by GitLab for accessing the Spam Check service endpoint."
msgstr ""
msgid "The GitLab subscription service (customers.gitlab.com) is currently experiencing an outage. You can monitor the status and get updates at %{linkStart}status.gitlab.com%{linkEnd}."
@@ -33224,9 +33699,6 @@ msgstr ""
msgid "The URL to use for connecting to Elasticsearch. Use a comma-separated list to support clustering (e.g., \"http://localhost:9200, http://localhost:9201\")."
msgstr ""
-msgid "The Vulnerability Report shows the results of the last successful pipeline run on the default branch."
-msgstr ""
-
msgid "The X509 Certificate to use when mutual TLS is required to communicate with the external authorization service. If left blank, the server certificate is still validated when accessing over HTTPS."
msgstr ""
@@ -33284,9 +33756,6 @@ msgstr ""
msgid "The default branch for this project has been changed. Please update your bookmarks."
msgstr ""
-msgid "The default expiration time for job artifacts. 0 for unlimited. The default unit is in seconds, but you can use other units, for example %{code_open}4 mins 2 sec%{code_close}, %{code_open}2h42min%{code_close}."
-msgstr ""
-
msgid "The dependency list details information about the components used within your project."
msgstr ""
@@ -33478,9 +33947,6 @@ msgstr ""
msgid "The merge conflicts for this merge request have already been resolved. Please return to the merge request."
msgstr ""
-msgid "The merge request can now be merged."
-msgstr ""
-
msgid "The metric must be one of %{metrics}."
msgstr ""
@@ -33856,7 +34322,7 @@ msgstr ""
msgid "There was a problem updating the keep latest artifacts setting."
msgstr ""
-msgid "There was an error %{message} todo."
+msgid "There was an error %{message} to-do item."
msgstr ""
msgid "There was an error adding a To Do."
@@ -33895,6 +34361,9 @@ msgstr ""
msgid "There was an error fetching projects"
msgstr ""
+msgid "There was an error fetching search autocomplete suggestions"
+msgstr ""
+
msgid "There was an error fetching stage total counts"
msgstr ""
@@ -34219,6 +34688,9 @@ msgstr ""
msgid "This field is required."
msgstr ""
+msgid "This form is disabled in preview"
+msgstr ""
+
msgid "This group"
msgstr ""
@@ -34240,9 +34712,6 @@ msgstr ""
msgid "This group is linked to a subscription"
msgstr ""
-msgid "This group, including all subgroups, projects and git repositories, will be reachable from only the specified IP address ranges."
-msgstr ""
-
msgid "This group, its subgroups and projects has been scheduled for removal on %{date}."
msgstr ""
@@ -34522,9 +34991,6 @@ msgstr ""
msgid "This user cannot be unlocked manually from GitLab"
msgstr ""
-msgid "This user does not have a pending request"
-msgstr ""
-
msgid "This user has an unconfirmed email address (%{email}). You may force a confirmation."
msgstr ""
@@ -34633,9 +35099,6 @@ msgstr ""
msgid "ThreatMonitoring|Packet Activity"
msgstr ""
-msgid "ThreatMonitoring|Policies"
-msgstr ""
-
msgid "ThreatMonitoring|Requests"
msgstr ""
@@ -34687,6 +35150,12 @@ msgstr ""
msgid "ThreatMonitoring|View documentation"
msgstr ""
+msgid "Threshold in bytes at which to compress Sidekiq job arguments."
+msgstr ""
+
+msgid "Threshold in bytes at which to reject Sidekiq jobs. Set this to 0 to if you don't want to limit Sidekiq jobs."
+msgstr ""
+
msgid "Throughput"
msgstr ""
@@ -34696,6 +35165,9 @@ msgstr ""
msgid "Time"
msgstr ""
+msgid "Time (in hours) that users are allowed to skip forced configuration of two-factor authentication."
+msgstr ""
+
msgid "Time Spent"
msgstr ""
@@ -34762,7 +35234,7 @@ msgstr ""
msgid "TimeTrackingEstimated|Est"
msgstr ""
-msgid "TimeTracking|%{startTag}Spent: %{endTag}%{timeSpentHumanReadable}"
+msgid "TimeTracking|%{spentStart}Spent: %{spentEnd}"
msgstr ""
msgid "TimeTracking|Estimated:"
@@ -34976,6 +35448,9 @@ msgstr ""
msgid "To access this domain create a new DNS record"
msgstr ""
+msgid "To add a custom suffix, set up a Service Desk email address. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "To add an SSH key you need to %{generate_link_start}generate one%{link_end} or use an %{existing_link_start}existing key%{link_end}."
msgstr ""
@@ -34997,13 +35472,16 @@ msgstr ""
msgid "To connect an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To continue using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
+msgstr ""
+
msgid "To continue, you need to select the link in the confirmation email we sent to verify your email address. If you didn't get our email, select %{strongStart}Resend confirmation email.%{strongEnd}"
msgstr ""
msgid "To define internal users, first enable new users set to external"
msgstr ""
-msgid "To enable Registration Features, make sure \"Enable service ping\" is checked."
+msgid "To enable Registration Features, first enable Service Ping."
msgstr ""
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
@@ -35030,7 +35508,7 @@ msgstr ""
msgid "To get started, use the link below to confirm your account."
msgstr ""
-msgid "To help improve GitLab and its user experience, GitLab will periodically collect usage information."
+msgid "To help improve GitLab and its user experience, GitLab periodically collects usage information."
msgstr ""
msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
@@ -35063,7 +35541,7 @@ msgstr ""
msgid "To preserve performance only %{strong_open}%{display_size} of %{real_size}%{strong_close} files are displayed."
msgstr ""
-msgid "To protect this issue's confidentiality, %{forkLink} and set the fork's visibility to private."
+msgid "To protect this issue's confidentiality, %{linkStart}fork this project%{linkEnd} and set the fork's visibility to private."
msgstr ""
msgid "To protect this issue's confidentiality, a private fork of this project was selected."
@@ -35096,12 +35574,15 @@ msgstr ""
msgid "To set up SAML authentication for your group through an identity provider like Azure, Okta, Onelogin, Ping Identity, or your custom SAML 2.0 provider:"
msgstr ""
-msgid "To set up this service:"
+msgid "To set up this integration:"
msgstr ""
msgid "To specify the notification level per project of a group you belong to, you need to visit project page and change notification level there."
msgstr ""
+msgid "To start using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
+msgstr ""
+
msgid "To unsubscribe from this issue, please paste the following link into your browser:"
msgstr ""
@@ -35689,9 +36170,6 @@ msgstr ""
msgid "Unable to fetch branches list, please close the form and try again"
msgstr ""
-msgid "Unable to fetch unscanned projects"
-msgstr ""
-
msgid "Unable to fetch vulnerable projects"
msgstr ""
@@ -35746,6 +36224,15 @@ msgstr ""
msgid "Unable to update this issue at this time."
msgstr ""
+msgid "Unapprove a merge request"
+msgstr ""
+
+msgid "Unapprove the current merge request."
+msgstr ""
+
+msgid "Unapproved the current merge request."
+msgstr ""
+
msgid "Unarchive project"
msgstr ""
@@ -35758,16 +36245,13 @@ msgstr ""
msgid "Unassigned"
msgstr ""
-msgid "Unauthenticated API request rate limit"
-msgstr ""
-
-msgid "Unauthenticated rate limit period in seconds"
+msgid "Unauthenticated API rate limit period in seconds"
msgstr ""
-msgid "Unauthenticated request rate limit"
+msgid "Unauthenticated requests"
msgstr ""
-msgid "Unauthenticated requests"
+msgid "Unauthenticated web rate limit period in seconds"
msgstr ""
msgid "Undo"
@@ -35869,18 +36353,6 @@ msgstr ""
msgid "Unresolved"
msgstr ""
-msgid "UnscannedProjects|15 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|30 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|5 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|60 or more days"
-msgstr ""
-
msgid "Unschedule job"
msgstr ""
@@ -36100,6 +36572,9 @@ msgstr ""
msgid "UsageQuota|%{help_link_start}Shared runners%{help_link_end} are disabled, so there are no limits set on pipeline usage"
msgstr ""
+msgid "UsageQuota|%{linkTitle} help link"
+msgstr ""
+
msgid "UsageQuota|%{percentageLeft} of purchased storage is available"
msgstr ""
@@ -36109,6 +36584,9 @@ msgstr ""
msgid "UsageQuota|Artifacts is a sum of build and pipeline artifacts."
msgstr ""
+msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
+msgstr ""
+
msgid "UsageQuota|Buy additional minutes"
msgstr ""
@@ -36118,9 +36596,21 @@ msgstr ""
msgid "UsageQuota|CI minutes usage by project"
msgstr ""
+msgid "UsageQuota|Code packages and container images."
+msgstr ""
+
msgid "UsageQuota|Current period usage"
msgstr ""
+msgid "UsageQuota|File attachments and smaller design graphics."
+msgstr ""
+
+msgid "UsageQuota|Git repository, managed by the Gitaly service."
+msgstr ""
+
+msgid "UsageQuota|Includes project registry, artifacts, packages, wiki, uploads and other items."
+msgstr ""
+
msgid "UsageQuota|Increase storage temporarily"
msgstr ""
@@ -36139,6 +36629,9 @@ msgstr ""
msgid "UsageQuota|Packages"
msgstr ""
+msgid "UsageQuota|Pipeline artifacts and job artifacts, created with CI/CD."
+msgstr ""
+
msgid "UsageQuota|Pipelines"
msgstr ""
@@ -36157,6 +36650,9 @@ msgstr ""
msgid "UsageQuota|Seats"
msgstr ""
+msgid "UsageQuota|Shared bits of code and text."
+msgstr ""
+
msgid "UsageQuota|Snippets"
msgstr ""
@@ -36166,6 +36662,12 @@ msgstr ""
msgid "UsageQuota|Storage"
msgstr ""
+msgid "UsageQuota|Storage type"
+msgstr ""
+
+msgid "UsageQuota|There is a known issue with Artifact storage where the total could be incorrect for some projects. More details and progress are available in %{warningLinkStart}the epic%{warningLinkEnd}."
+msgstr ""
+
msgid "UsageQuota|This is the total amount of storage used across your projects within this namespace."
msgstr ""
@@ -36205,6 +36707,9 @@ msgstr ""
msgid "UsageQuota|Usage"
msgstr ""
+msgid "UsageQuota|Usage Breakdown"
+msgstr ""
+
msgid "UsageQuota|Usage Quotas"
msgstr ""
@@ -36229,6 +36734,9 @@ msgstr ""
msgid "UsageQuota|Wiki"
msgstr ""
+msgid "UsageQuota|Wiki content."
+msgstr ""
+
msgid "UsageQuota|Wikis"
msgstr ""
@@ -36445,7 +36953,10 @@ msgstr ""
msgid "User Settings"
msgstr ""
-msgid "User and IP Rate Limits"
+msgid "User and IP rate limits"
+msgstr ""
+
+msgid "User does not have a pending request"
msgstr ""
msgid "User identity was successfully created."
@@ -36742,6 +37253,9 @@ msgstr ""
msgid "Users can launch a development environment from a GitLab browser tab when the %{linkStart}Gitpod%{linkEnd} integration is enabled."
msgstr ""
+msgid "Users can reactivate their account by signing in."
+msgstr ""
+
msgid "Users can render diagrams in AsciiDoc, Markdown, reStructuredText, and Textile documents using Kroki."
msgstr ""
@@ -36757,6 +37271,9 @@ msgstr ""
msgid "Users requesting access to"
msgstr ""
+msgid "Users to exclude from the rate limit"
+msgstr ""
+
msgid "Users were successfully added."
msgstr ""
@@ -36778,6 +37295,9 @@ msgstr ""
msgid "UsersSelect|Unassigned"
msgstr ""
+msgid "Uses GitLab as a lightweight alternative to Sentry."
+msgstr ""
+
msgid "Using %{code_start}::%{code_end} denotes a %{link_start}scoped label set%{link_end}"
msgstr ""
@@ -36808,10 +37328,7 @@ msgstr ""
msgid "Value Stream Analytics can help you determine your team’s velocity"
msgstr ""
-msgid "Value Stream Analytics gives an overview of how much time it takes to go from idea to production in your project."
-msgstr ""
-
-msgid "Value may contain a variable reference"
+msgid "Value might contain a variable reference"
msgstr ""
msgid "Value stream"
@@ -36877,10 +37394,10 @@ msgstr ""
msgid "ValueStream|The Default Value Stream cannot be deleted"
msgstr ""
-msgid "Variable"
+msgid "Values that contain the %{codeStart}$%{codeEnd} character can be considered a variable reference and expanded. %{docsLinkStart}Learn more.%{docsLinkEnd}"
msgstr ""
-msgid "Variable references indicated by %{codeStart}$%{codeEnd} may be expanded. If this is not what you want, consider %{docsLinkStart}using a workaround to prevent expansion%{docsLinkEnd}."
+msgid "Variable"
msgstr ""
msgid "Variable will be masked in job logs."
@@ -37285,6 +37802,9 @@ msgstr ""
msgid "Vulnerability|Evidence"
msgstr ""
+msgid "Vulnerability|False positive detected"
+msgstr ""
+
msgid "Vulnerability|File"
msgstr ""
@@ -37327,6 +37847,9 @@ msgstr ""
msgid "Vulnerability|Status"
msgstr ""
+msgid "Vulnerability|The scanner determined this vulnerability to be a false positive. Verify the evaluation before changing its status. %{linkStart}Learn more about false positive detection.%{linkEnd}"
+msgstr ""
+
msgid "Vulnerability|The unmodified response is the original response that had no mutations done to the request"
msgstr ""
@@ -37651,9 +38174,6 @@ msgstr ""
msgid "Welcome to GitLab,%{br_tag}%{name}!"
msgstr ""
-msgid "Welcome to the guided GitLab tour"
-msgstr ""
-
msgid "Welcome, %{name}!"
msgstr ""
@@ -37672,9 +38192,6 @@ msgstr ""
msgid "What are you searching for?"
msgstr ""
-msgid "What describes you best?"
-msgstr ""
-
msgid "What does this command do?"
msgstr ""
@@ -37696,13 +38213,13 @@ msgstr ""
msgid "What is your job title? (optional)"
msgstr ""
-msgid "What will you use this group for?"
+msgid "What templates can I create?"
msgstr ""
-msgid "What's new"
+msgid "What will you use this group for?"
msgstr ""
-msgid "What’s your experience level?"
+msgid "What's new"
msgstr ""
msgid "When a deployment job is successful, skip older deployment jobs that are still pending."
@@ -37714,6 +38231,9 @@ msgstr ""
msgid "When an event in GitLab triggers a webhook, you can use the request details to figure out if something went wrong."
msgstr ""
+msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+msgstr ""
+
msgid "When inactive, an external authentication provider must be used."
msgstr ""
@@ -37737,6 +38257,9 @@ msgstr ""
msgid "When:"
msgstr ""
+msgid "Which API requests are affected?"
+msgstr ""
+
msgid "While it's rare to have no vulnerabilities, it can happen. In any event, we ask that you please double check your settings to make sure you've set up your dashboard correctly."
msgstr ""
@@ -38016,6 +38539,9 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|Work Items"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -38091,6 +38617,9 @@ msgstr ""
msgid "You are already a member of this %{member_source}."
msgstr ""
+msgid "You are already impersonating another user"
+msgstr ""
+
msgid "You are an admin, which means granting access to %{client_name} will allow them to interact with GitLab as an admin as well. Proceed with caution."
msgstr ""
@@ -38193,6 +38722,9 @@ msgstr ""
msgid "You can also use project access tokens with Git to authenticate over HTTP(S). %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "You can always change your URL later"
+msgstr ""
+
msgid "You can always edit this later"
msgstr ""
@@ -38349,10 +38881,10 @@ msgstr ""
msgid "You can’t %{tag_start}edit%{tag_end} files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
-msgid "You could not create a new trigger."
+msgid "You can’t edit files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
-msgid "You didn't renew your subscription for %{strong}%{namespace_name}%{strong_close} so it was downgraded to the free plan."
+msgid "You could not create a new trigger."
msgstr ""
msgid "You do not have any subscriptions yet"
@@ -38520,6 +39052,12 @@ msgstr ""
msgid "You must provide your current password in order to change it."
msgstr ""
+msgid "You must sign in to search for specific projects."
+msgstr ""
+
+msgid "You must sign in to search for specific terms."
+msgstr ""
+
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
@@ -38547,6 +39085,9 @@ msgstr ""
msgid "You need to upload a GitLab project export archive (ending in .gz)."
msgstr ""
+msgid "You need to verify your primary email first before enabling Two-Factor Authentication."
+msgstr ""
+
msgid "You successfully declined the invitation"
msgstr ""
@@ -38655,10 +39196,10 @@ msgstr ""
msgid "Your %{host} account was signed in to from a new location"
msgstr ""
-msgid "Your %{strong}%{plan_name}%{strong_close} subscription for %{strong}%{namespace_name}%{strong_close} will expire on %{strong}%{expires_on}%{strong_close}."
+msgid "Your %{strong}%{plan_name}%{strong_close} subscription expires on %{strong}%{expires_on}%{strong_close}. After that date, you cannot create issues or merge requests, or use many other features."
msgstr ""
-msgid "Your %{strong}%{plan_name}%{strong_close} subscription will expire on %{strong}%{expires_on}%{strong_close}. After that, you will not be able to create issues or merge requests as well as many other features."
+msgid "Your %{strong}%{plan_name}%{strong_close} subscription for %{strong}%{namespace_name}%{strong_close} will expire on %{strong}%{expires_on}%{strong_close}."
msgstr ""
msgid "Your CI/CD configuration syntax is invalid. View Lint tab for more details."
@@ -38682,7 +39223,7 @@ msgstr ""
msgid "Your GPG keys (%{count})"
msgstr ""
-msgid "Your GitLab account has been locked due to an excessive amount of unsuccessful sign in attempts. Your account will automatically unlock in %{duration} or you may click the link below to unlock now."
+msgid "Your GitLab account has been locked due to an excessive number of unsuccessful sign in attempts. You can wait for your account to automatically unlock in %{duration} or you can click the link below to unlock now."
msgstr ""
msgid "Your GitLab account request has been approved!"
@@ -38793,6 +39334,9 @@ msgstr ""
msgid "Your commit email is used for web based operations, such as edits and merges."
msgstr ""
+msgid "Your current password is required to register a two-factor authenticator app."
+msgstr ""
+
msgid "Your dashboard has been copied. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
@@ -38892,6 +39436,9 @@ msgstr ""
msgid "Your project limit is %{limit} projects! Please contact your administrator to increase it"
msgstr ""
+msgid "Your project will be created at:"
+msgstr ""
+
msgid "Your projects"
msgstr ""
@@ -38931,11 +39478,10 @@ msgstr ""
msgid "Your subscription expired!"
msgstr ""
-msgid "Your subscription has been downgraded."
-msgstr ""
-
-msgid "Your subscription will expire in %{remaining_days}."
-msgstr ""
+msgid "Your subscription will expire in %{remaining_days} day."
+msgid_plural "Your subscription will expire in %{remaining_days} days."
+msgstr[0] ""
+msgstr[1] ""
msgid "Your username is %{username}."
msgstr ""
@@ -39142,6 +39688,9 @@ msgstr ""
msgid "cannot merge"
msgstr ""
+msgid "cannot not be used for user namespace"
+msgstr ""
+
msgid "ciReport|%{degradedNum} degraded"
msgstr ""
@@ -39465,6 +40014,9 @@ msgstr ""
msgid "created %{timeAgo}"
msgstr ""
+msgid "created %{timeAgo} by %{author}"
+msgstr ""
+
msgid "created by"
msgstr ""
@@ -39509,9 +40061,6 @@ msgstr ""
msgid "does not have a supported extension. Only %{extension_list} are supported"
msgstr ""
-msgid "domain is not authorized for sign-up."
-msgstr ""
-
msgid "download it"
msgstr ""
@@ -39529,18 +40078,13 @@ msgstr ""
msgid "email '%{email}' is not a verified email."
msgstr ""
-msgid "email does not match the allowed domain of %{email_domains}"
-msgid_plural "email does not match the allowed domains: %{email_domains}"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "enabled"
msgstr ""
msgid "encrypted: needs to be a :required, :optional or :migrating!"
msgstr ""
-msgid "ending with MIME type format is not allowed."
+msgid "ending with a reserved file extension is not allowed."
msgstr ""
msgid "entries cannot be larger than 255 characters"
@@ -39564,6 +40108,9 @@ msgstr ""
msgid "estimateCommand|%{slash_command} overwrites the total estimated time."
msgstr ""
+msgid "example.com"
+msgstr ""
+
msgid "exceeds the limit of %{bytes} bytes"
msgstr ""
@@ -39614,9 +40161,6 @@ msgstr ""
msgid "fork"
msgstr ""
-msgid "fork this project"
-msgstr ""
-
msgid "from"
msgstr ""
@@ -39625,6 +40169,9 @@ msgid_plural "from %d jobs"
msgstr[0] ""
msgstr[1] ""
+msgid "frontmatter"
+msgstr ""
+
msgid "group"
msgstr ""
@@ -39652,6 +40199,9 @@ msgstr ""
msgid "has been completed."
msgstr ""
+msgid "has too deep level of nesting"
+msgstr ""
+
msgid "help"
msgstr ""
@@ -39685,9 +40235,21 @@ msgstr ""
msgid "in"
msgstr ""
+msgid "in Infrastructure :: Kubernetes clusters"
+msgstr ""
+
+msgid "in all GitLab"
+msgstr ""
+
+msgid "in group"
+msgstr ""
+
msgid "in group %{link_to_group}"
msgstr ""
+msgid "in project"
+msgstr ""
+
msgid "in project %{link_to_project}"
msgstr ""
@@ -39729,16 +40291,19 @@ msgstr ""
msgid "is not a valid X509 certificate."
msgstr ""
-msgid "is not allowed since the group is not top-level group."
+msgid "is not allowed for sign-up."
msgstr ""
-msgid "is not allowed. Try again with a different email address, or contact your GitLab admin."
+msgid "is not allowed for this group."
msgstr ""
-msgid "is not allowed. We do not currently support project-level iterations"
+msgid "is not allowed for this project."
+msgstr ""
+
+msgid "is not allowed since the group is not top-level group."
msgstr ""
-msgid "is not from an allowed domain."
+msgid "is not allowed. We do not currently support project-level iterations"
msgstr ""
msgid "is not in the group enforcing Group Managed Account"
@@ -39831,6 +40396,9 @@ msgstr ""
msgid "log in"
msgstr ""
+msgid "managed"
+msgstr ""
+
msgid "manual"
msgstr ""
@@ -39878,6 +40446,9 @@ msgstr ""
msgid "mrWidget| Please restore it or use a different %{missingBranchName} branch"
msgstr ""
+msgid "mrWidget|%{linkStart}Set up now%{linkEnd} to analyze your source code for known security vulnerabilities."
+msgstr ""
+
msgid "mrWidget|%{mergeError}."
msgstr ""
@@ -39958,6 +40529,9 @@ msgid_plural "mrWidget|Closes issues"
msgstr[0] ""
msgstr[1] ""
+msgid "mrWidget|Create issue to resolve all threads"
+msgstr ""
+
msgid "mrWidget|Delete source branch"
msgstr ""
@@ -39967,12 +40541,18 @@ msgstr ""
msgid "mrWidget|Did not close"
msgstr ""
+msgid "mrWidget|Dismiss"
+msgstr ""
+
msgid "mrWidget|Email patches"
msgstr ""
msgid "mrWidget|Failed to load deployment statistics"
msgstr ""
+msgid "mrWidget|Hide %{widget} details"
+msgstr ""
+
msgid "mrWidget|If the %{missingBranchName} branch exists in your local repository, you can merge this merge request manually using the command line"
msgstr ""
@@ -40068,9 +40648,6 @@ msgstr ""
msgid "mrWidget|Request to merge"
msgstr ""
-msgid "mrWidget|Resolve all threads in new issue"
-msgstr ""
-
msgid "mrWidget|Resolve conflicts"
msgstr ""
@@ -40086,6 +40663,9 @@ msgstr ""
msgid "mrWidget|Revoke approval"
msgstr ""
+msgid "mrWidget|SAST and Secret Detection is not enabled."
+msgstr ""
+
msgid "mrWidget|Set by %{merge_author} to be added to the merge train when the pipeline succeeds"
msgstr ""
@@ -40095,6 +40675,9 @@ msgstr ""
msgid "mrWidget|Set by %{merge_author} to start a merge train when the pipeline succeeds"
msgstr ""
+msgid "mrWidget|Show %{widget} details"
+msgstr ""
+
msgid "mrWidget|The changes were merged into"
msgstr ""
@@ -40107,6 +40690,9 @@ msgstr ""
msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure, or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
msgstr ""
+msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure."
+msgstr ""
+
msgid "mrWidget|The source branch has been deleted"
msgstr ""
@@ -40149,6 +40735,9 @@ msgstr ""
msgid "mrWidget|You can merge after removing denied licenses"
msgstr ""
+msgid "mrWidget|You can only merge once this merge request is approved."
+msgstr ""
+
msgid "mrWidget|Your password"
msgstr ""
@@ -40185,6 +40774,9 @@ msgstr ""
msgid "must be less than the limit of %{tag_limit} tags"
msgstr ""
+msgid "must be set for a project namespace"
+msgstr ""
+
msgid "must be unique by status and elapsed time within a policy"
msgstr ""
@@ -40294,6 +40886,9 @@ msgstr ""
msgid "pipeline"
msgstr ""
+msgid "pipeline schedules documentation"
+msgstr ""
+
msgid "pod_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
msgstr ""
@@ -40343,16 +40938,25 @@ msgstr ""
msgid "project name"
msgstr ""
+msgid "project namespace cannot be the parent of another namespace"
+msgstr ""
+
msgid "projects"
msgstr ""
msgid "quick actions"
msgstr ""
-msgid "reCAPTCHA Private Key"
+msgid "reCAPTCHA"
+msgstr ""
+
+msgid "reCAPTCHA helps prevent credential stuffing."
msgstr ""
-msgid "reCAPTCHA Site Key"
+msgid "reCAPTCHA private key"
+msgstr ""
+
+msgid "reCAPTCHA site key"
msgstr ""
msgid "recent activity"
@@ -40579,6 +41183,9 @@ msgstr ""
msgid "user avatar"
msgstr ""
+msgid "user namespace cannot be the parent of another namespace"
+msgstr ""
+
msgid "user preferences"
msgstr ""
@@ -40671,3 +41278,9 @@ msgstr ""
msgid "your settings"
msgstr ""
+msgid "{group}"
+msgstr ""
+
+msgid "{project}"
+msgstr ""
+
diff --git a/locale/eo/gitlab.po b/locale/eo/gitlab.po
index d5b4a995434..dd03557924a 100644
--- a/locale/eo/gitlab.po
+++ b/locale/eo/gitlab.po
@@ -14,10 +14,7 @@ msgstr ""
"X-Crowdin-Language: eo\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-09-01 22:31\n"
-
-msgid " %{name}, confirm your email address now! "
-msgstr ""
+"PO-Revision-Date: 2021-10-04 20:19\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -92,6 +89,16 @@ msgstr ""
msgid "#general, #development"
msgstr ""
+msgid "%d Alert"
+msgid_plural "%d Alerts"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d Alert:"
+msgid_plural "%d Alerts:"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d Approval"
msgid_plural "%d Approvals"
msgstr[0] ""
@@ -455,7 +462,10 @@ msgstr ""
msgid "%{code_open}Protected:%{code_close} Only exposed to protected branches or tags."
msgstr ""
-msgid "%{commit_author_link} authored %{commit_timeago}"
+msgid "%{commit_author_link} authored %{commit_authored_timeago}"
+msgstr ""
+
+msgid "%{commit_author_link} authored %{commit_authored_timeago} and %{commit_committer_avatar} %{commit_committer_link} committed %{commit_committer_timeago}"
msgstr ""
msgid "%{completedCount} completed weight"
@@ -549,6 +559,15 @@ msgstr ""
msgid "%{doc_link_start}Advanced search%{doc_link_end} is enabled."
msgstr ""
+msgid "%{docs_link_start}Learn about visibility levels.%{docs_link_end}"
+msgstr ""
+
+msgid "%{docs_link_start}What is Large File Storage?%{docs_link_end}"
+msgstr ""
+
+msgid "%{docs_link_start}What is two-factor authentication?%{docs_link_end}"
+msgstr ""
+
msgid "%{due_date} (Past due)"
msgstr ""
@@ -621,9 +640,6 @@ msgstr ""
msgid "%{issueType} actions"
msgstr ""
-msgid "%{issuesCount} issues with a limit of %{maxIssueCount}"
-msgstr ""
-
msgid "%{issuesSize} with a limit of %{maxIssueCount}"
msgstr ""
@@ -681,6 +697,12 @@ msgstr ""
msgid "%{label_for_message} unavailable"
msgstr ""
+msgid "%{learn_more_link}."
+msgstr ""
+
+msgid "%{lessThan} 1 hour"
+msgstr ""
+
msgid "%{lets_encrypt_link_start}Let's Encrypt%{lets_encrypt_link_end} is a free, automated, and open certificate authority (CA) that issues digital certificates to enable HTTPS (SSL/TLS) for sites."
msgstr ""
@@ -693,15 +715,15 @@ msgstr ""
msgid "%{link_start}Learn more%{link_end} about roles."
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
-msgstr ""
-
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
msgstr ""
msgid "%{link_start}Start the title with %{draft_snippet}%{link_end} to prevent a merge request that is a work in progress from being merged before it's ready."
msgstr ""
+msgid "%{link_start}What information does GitLab Inc. collect?%{link_end}"
+msgstr ""
+
msgid "%{listToShow}, and %{awardsListLength} more"
msgstr ""
@@ -854,7 +876,7 @@ msgid_plural "%{securityScanner} results are not available because a pipeline ha
msgstr[0] ""
msgstr[1] ""
-msgid "%{service_ping_link_start}Learn more%{service_ping_link_end} about what information is shared with GitLab Inc."
+msgid "%{service_ping_link_start}What information is shared with GitLab Inc.?%{service_ping_link_end}"
msgstr ""
msgid "%{size} %{unit}"
@@ -890,6 +912,9 @@ msgstr ""
msgid "%{state} epics"
msgstr ""
+msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
+msgstr ""
+
msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
msgstr ""
@@ -949,11 +974,6 @@ msgstr ""
msgid "%{template_project_id} is unknown or invalid"
msgstr ""
-msgid "%{text} %{files}"
-msgid_plural "%{text} %{files} files"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%{text} is available"
msgstr ""
@@ -1038,9 +1058,6 @@ msgstr ""
msgid "%{wildcards_link_start}Wildcards%{wildcards_link_end} such as %{code_tag_start}v*%{code_tag_end} or %{code_tag_start}*-release%{code_tag_end} are supported."
msgstr ""
-msgid "&lt; 1 hour"
-msgstr ""
-
msgid "'%{data}' at %{location} does not match format: %{format}"
msgstr ""
@@ -1124,9 +1141,6 @@ msgstr ""
msgid "(we need your current password to confirm your changes)"
msgstr ""
-msgid "* * * * *"
-msgstr ""
-
msgid "+ %{amount} more"
msgstr ""
@@ -1193,10 +1207,10 @@ msgstr ""
msgid "."
msgstr ""
-msgid "0 bytes"
+msgid "/"
msgstr ""
-msgid "0 for unlimited, only effective with remote storage enabled."
+msgid "0 bytes"
msgstr ""
msgid "0t1DgySidms"
@@ -1326,6 +1340,9 @@ msgstr ""
msgid "1000+"
msgstr ""
+msgid "192.168.0.0/24"
+msgstr ""
+
msgid "1st contribution!"
msgstr ""
@@ -1479,9 +1496,6 @@ msgstr ""
msgid "A plain HTML site that uses Netlify for CI/CD instead of GitLab, but still with all the other great GitLab features"
msgstr ""
-msgid "A plain-text response to show to clients that hit the rate limit."
-msgstr ""
-
msgid "A platform value can be web, mob or app."
msgstr ""
@@ -1563,7 +1577,7 @@ msgstr ""
msgid "APIFuzzing|Configure HTTP basic authentication values. Other authentication methods are supported. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
+msgid "APIFuzzing|Customize your project's API fuzzing configuration options and copy the code snippet to your .gitlab-ci.yml file to apply any changes. Note that this tool does not reflect or update your .gitlab-ci.yml file automatically. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
msgstr ""
msgid "APIFuzzing|Enable authentication"
@@ -1626,9 +1640,6 @@ msgstr ""
msgid "APIFuzzing|To prevent a security leak, authentication info must be added as a %{ciVariablesLinkStart}CI variable%{ciVariablesLinkEnd}. As a user with maintainer access rights, you can manage CI variables in the %{ciSettingsLinkStart}Settings%{ciSettingsLinkEnd} area."
msgstr ""
-msgid "APIFuzzing|Use this tool to generate API fuzzing configuration YAML to copy into your .gitlab-ci.yml file. This tool does not reflect or update your .gitlab-ci.yml file automatically."
-msgstr ""
-
msgid "APIFuzzing|Username for basic authentication"
msgstr ""
@@ -1680,9 +1691,6 @@ msgstr ""
msgid "Abuse reports notification email"
msgstr ""
-msgid "Abuse reports will be sent to this address if it is set. Abuse reports are always available in the admin area."
-msgstr ""
-
msgid "Accept invitation"
msgstr ""
@@ -1719,12 +1727,18 @@ msgstr ""
msgid "Access granted"
msgstr ""
+msgid "Access key ID"
+msgstr ""
+
msgid "Access requests"
msgstr ""
msgid "Access to '%{classification_label}' not allowed"
msgstr ""
+msgid "Access tokens expire after 2 hours. A refresh token may be used at any time to generate a new access token. Non-expiring access tokens are deprecated. Clear this setting to enable backward compatibility."
+msgstr ""
+
msgid "AccessDropdown|Deploy Keys"
msgstr ""
@@ -2037,6 +2051,9 @@ msgstr ""
msgid "Add new directory"
msgstr "Aldoni novan dosierujon"
+msgid "Add new service account"
+msgstr ""
+
msgid "Add or remove previously merged commits"
msgstr ""
@@ -2274,6 +2291,9 @@ msgstr ""
msgid "AdminArea|Features"
msgstr ""
+msgid "AdminArea|Get security updates from GitLab and stay up to date"
+msgstr ""
+
msgid "AdminArea|Groups"
msgstr ""
@@ -2313,6 +2333,12 @@ msgstr ""
msgid "AdminArea|Reporter"
msgstr ""
+msgid "AdminArea|Sign up for the GitLab Security Newsletter to get notified for security updates."
+msgstr ""
+
+msgid "AdminArea|Sign up for the GitLab newsletter"
+msgstr ""
+
msgid "AdminArea|Stop all jobs"
msgstr ""
@@ -2382,9 +2408,15 @@ msgstr ""
msgid "AdminSettings|Disable public access to Pages sites"
msgstr ""
+msgid "AdminSettings|Display a banner on merge requests in projects with no pipelines to initiate steps to add a .gitlab-ci.yml file."
+msgstr ""
+
msgid "AdminSettings|Domain verification is an essential security measure for public GitLab sites. Users are required to demonstrate they control a domain before it is enabled. %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "AdminSettings|Enable pipeline suggestion banner"
+msgstr ""
+
msgid "AdminSettings|Enable shared runners for new projects"
msgstr ""
@@ -2856,10 +2888,10 @@ msgstr ""
msgid "Admin|Quarterly reconciliation will occur on %{qrtlyDate}"
msgstr ""
-msgid "Admin|The number of max seats used for your namespace is currently exceeding the number of seats in your subscription. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgid "Admin|The number of max seats in your namespace exceeds the number of seats in your subscription. On %{qrtlyDate}, quarterly reconciliation occurs and you are automatically billed a prorated amount for the overage. No action is needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice. For more information about the timing of the invoicing process, view the documentation."
msgstr ""
-msgid "Admin|The number of maximum users for your instance is currently exceeding the number of users in license. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgid "Admin|The number of max users in your instance exceeds the number of users in your license. On %{qrtlyDate}, quarterly reconciliation occurs and you are automatically billed a prorated amount for the overage. No action is needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice. For more information about the timing of the invoicing process, view the documentation."
msgstr ""
msgid "Admin|View pending user approvals"
@@ -2880,9 +2912,6 @@ msgstr ""
msgid "Advanced export options"
msgstr ""
-msgid "Advanced permissions, Large File Storage and Two-Factor authentication settings."
-msgstr ""
-
msgid "After a successful password update you will be redirected to login screen."
msgstr ""
@@ -2901,13 +2930,14 @@ msgstr ""
msgid "After you've reviewed these contribution guidelines, you'll be all set to"
msgstr ""
+msgid "Akismet"
+msgstr ""
+
msgid "Akismet API Key"
msgstr ""
-msgid "Alert"
-msgid_plural "Alerts"
-msgstr[0] ""
-msgstr[1] ""
+msgid "Akismet helps prevent the creation of spam issues in public projects."
+msgstr ""
msgid "AlertManagement|Acknowledged"
msgstr ""
@@ -3263,6 +3293,9 @@ msgstr ""
msgid "All (default)"
msgstr ""
+msgid "All GitLab"
+msgstr ""
+
msgid "All Members"
msgstr ""
@@ -3377,6 +3410,9 @@ msgstr ""
msgid "Allow this secondary node to replicate content on Object Storage"
msgstr ""
+msgid "Allow use of licensed EE features"
+msgstr ""
+
msgid "Allow users to dismiss the broadcast message"
msgstr ""
@@ -3452,9 +3488,6 @@ msgstr ""
msgid "Amazon authentication is not %{link_start}correctly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
-msgid "Amount of time (in hours) that users are allowed to skip forced configuration of two-factor authentication"
-msgstr ""
-
msgid "An %{link_start}alert%{link_end} with the same fingerprint is already open. To change the status of this alert, resolve the linked alert."
msgstr ""
@@ -3515,12 +3548,6 @@ msgstr ""
msgid "An error occurred when removing the label."
msgstr ""
-msgid "An error occurred when toggling the notification subscription"
-msgstr ""
-
-msgid "An error occurred when updating the issue weight"
-msgstr ""
-
msgid "An error occurred when updating the title"
msgstr ""
@@ -3569,6 +3596,9 @@ msgstr ""
msgid "An error occurred while enabling Service Desk."
msgstr ""
+msgid "An error occurred while fetching Markdown preview"
+msgstr ""
+
msgid "An error occurred while fetching ancestors"
msgstr ""
@@ -3599,9 +3629,6 @@ msgstr ""
msgid "An error occurred while fetching label colors."
msgstr ""
-msgid "An error occurred while fetching markdown preview"
-msgstr ""
-
msgid "An error occurred while fetching participants"
msgstr ""
@@ -3617,9 +3644,6 @@ msgstr ""
msgid "An error occurred while fetching reference"
msgstr ""
-msgid "An error occurred while fetching sidebar data"
-msgstr ""
-
msgid "An error occurred while fetching tags. Retry the search."
msgstr ""
@@ -3695,6 +3719,9 @@ msgstr ""
msgid "An error occurred while loading merge requests."
msgstr ""
+msgid "An error occurred while loading projects."
+msgstr ""
+
msgid "An error occurred while loading the Needs tab."
msgstr ""
@@ -3929,12 +3956,6 @@ msgstr ""
msgid "Any Milestone"
msgstr ""
-msgid "Any branch"
-msgstr ""
-
-msgid "Any eligible user"
-msgstr ""
-
msgid "Any encrypted tokens"
msgstr ""
@@ -3953,6 +3974,9 @@ msgstr ""
msgid "Any namespace"
msgstr ""
+msgid "App Engine description and apps that are suitable for this deployment target"
+msgstr ""
+
msgid "App ID"
msgstr ""
@@ -4101,6 +4125,11 @@ msgstr ""
msgid "Apply"
msgstr ""
+msgid "Apply %d suggestion"
+msgid_plural "Apply %d suggestions"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Apply a label"
msgstr ""
@@ -4110,13 +4139,10 @@ msgstr ""
msgid "Apply suggestion"
msgstr ""
-msgid "Apply suggestions"
-msgstr ""
-
msgid "Apply template"
msgstr ""
-msgid "Apply this approval rule to any branch or a specific protected branch."
+msgid "Apply this approval rule to all branches or a specific protected branch."
msgstr ""
msgid "Applying"
@@ -4259,9 +4285,6 @@ msgstr ""
msgid "ApprovalSettings|Prevent editing approval rules in projects and merge requests."
msgstr ""
-msgid "ApprovalSettings|Prevent editing approval rules in projects and merge requests. "
-msgstr ""
-
msgid "ApprovalSettings|Remove all approvals when commits are added to the source branch."
msgstr ""
@@ -4277,6 +4300,9 @@ msgstr ""
msgid "ApprovalSettings|This setting is configured at the instance level and can only be changed by an administrator."
msgstr ""
+msgid "ApprovalSettings|This setting is configured in %{groupName} and can only be changed by an administrator or group owner."
+msgstr ""
+
msgid "ApprovalStatusTooltip|Adheres to separation of duties"
msgstr ""
@@ -4763,9 +4789,6 @@ msgstr ""
msgid "Authenticated API rate limit period in seconds"
msgstr ""
-msgid "Authenticated API request rate limit"
-msgstr ""
-
msgid "Authenticated API requests"
msgstr ""
@@ -4775,10 +4798,10 @@ msgstr ""
msgid "Authenticated Git LFS request rate limit"
msgstr ""
-msgid "Authenticated web rate limit period in seconds"
+msgid "Authenticated Git LFS requests"
msgstr ""
-msgid "Authenticated web request rate limit"
+msgid "Authenticated web rate limit period in seconds"
msgstr ""
msgid "Authenticated web requests"
@@ -5156,9 +5179,6 @@ msgstr ""
msgid "Below you will find all the groups that are public."
msgstr ""
-msgid "Beta"
-msgstr ""
-
msgid "Bi-weekly code coverage"
msgstr ""
@@ -5398,6 +5418,21 @@ msgstr ""
msgid "Board scope affects which issues are displayed for anyone who visits this board"
msgstr ""
+msgid "BoardNewEpic|Groups"
+msgstr ""
+
+msgid "BoardNewEpic|Loading groups"
+msgstr ""
+
+msgid "BoardNewEpic|No matching results"
+msgstr ""
+
+msgid "BoardNewEpic|Search groups"
+msgstr ""
+
+msgid "BoardNewEpic|Select a group"
+msgstr ""
+
msgid "BoardNewIssue|No matching results"
msgstr ""
@@ -5475,6 +5510,9 @@ msgstr ""
msgid "Boards|An error occurred while creating the list. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching child groups. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching group projects. Please try again."
msgstr ""
@@ -5807,6 +5845,9 @@ msgstr ""
msgid "Bulk update"
msgstr ""
+msgid "BulkImports|Re-import creates a new group. It does not sync with the existing group."
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -5816,6 +5857,9 @@ msgstr ""
msgid "BulkImport|From source group"
msgstr ""
+msgid "BulkImport|Group import history"
+msgstr ""
+
msgid "BulkImport|Import failed: Destination cannot be a subgroup of the source group. Change the destination and try again."
msgstr ""
@@ -5828,9 +5872,18 @@ msgstr ""
msgid "BulkImport|Importing the group failed"
msgstr ""
+msgid "BulkImport|Last imported to %{link}"
+msgstr ""
+
msgid "BulkImport|Name already exists."
msgstr ""
+msgid "BulkImport|New group"
+msgstr ""
+
+msgid "BulkImport|No history is available"
+msgstr ""
+
msgid "BulkImport|No parent"
msgstr ""
@@ -5843,6 +5896,9 @@ msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} matching filter \"%{filter}\" from %{link}"
msgstr ""
+msgid "BulkImport|Source group"
+msgstr ""
+
msgid "BulkImport|To new group"
msgstr ""
@@ -5852,6 +5908,9 @@ msgstr ""
msgid "BulkImport|You have no groups to import"
msgstr ""
+msgid "BulkImport|Your imported groups will appear here."
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -6094,6 +6153,9 @@ msgstr ""
msgid "Can be manually deployed to"
msgstr ""
+msgid "Can be overridden in each project."
+msgstr ""
+
msgid "Can create groups:"
msgstr ""
@@ -6196,6 +6258,9 @@ msgstr ""
msgid "Cancelling Preview"
msgstr ""
+msgid "Cannot assign a confidential epic to a non-confidential issue. Make the issue confidential and try again"
+msgstr ""
+
msgid "Cannot be assigned to other projects."
msgstr ""
@@ -6247,9 +6312,6 @@ msgstr ""
msgid "Cannot refer to a group %{timebox_type} by an internal id!"
msgstr ""
-msgid "Cannot set confidential epic for a non-confidential issue"
-msgstr ""
-
msgid "Cannot show preview. For previews on sketch files, they must have the file format introduced by Sketch version 43 and above."
msgstr ""
@@ -6487,15 +6549,15 @@ msgstr ""
msgid "Check out, review, and merge locally"
msgstr ""
-msgid "Check the %{docs_link_start}documentation%{docs_link_end}."
-msgstr ""
-
msgid "Check the current instance configuration "
msgstr ""
msgid "Check the elasticsearch.log file to debug why the migration was halted and make any changes before retrying the migration. When you fix the cause of the failure, click \"Retry migration\", and the migration will be scheduled to be retried in the background."
msgstr ""
+msgid "Check with your administrator."
+msgstr ""
+
msgid "Check your Docker images for known vulnerabilities."
msgstr ""
@@ -6526,6 +6588,9 @@ msgstr ""
msgid "Checkout"
msgstr ""
+msgid "Checkout|$%{selectedPlanPrice} per 10 GB storage per pack"
+msgstr ""
+
msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 minutes"
msgstr ""
@@ -6546,17 +6611,23 @@ msgstr ""
msgid "Checkout|%{name}'s GitLab subscription"
msgstr ""
-msgid "Checkout|%{selectedPlanText} plan"
+msgid "Checkout|%{name}'s storage subscription"
msgstr ""
-msgid "Checkout|%{startDate} - %{endDate}"
+msgid "Checkout|%{quantity} GB of storage"
msgstr ""
-msgid "Checkout|%{totalCiMinutes} CI minute"
-msgid_plural "Checkout|%{totalCiMinutes} CI minutes"
+msgid "Checkout|%{quantity} storage pack"
+msgid_plural "Checkout|%{quantity} storage packs"
msgstr[0] ""
msgstr[1] ""
+msgid "Checkout|%{selectedPlanText} plan"
+msgstr ""
+
+msgid "Checkout|%{startDate} - %{endDate}"
+msgstr ""
+
msgid "Checkout|%{totalCiMinutes} CI minutes"
msgstr ""
@@ -6632,6 +6703,9 @@ msgstr ""
msgid "Checkout|Failed to register credit card. Please try again."
msgstr ""
+msgid "Checkout|GB"
+msgstr ""
+
msgid "Checkout|GitLab group"
msgstr ""
@@ -6668,6 +6742,9 @@ msgstr ""
msgid "Checkout|State"
msgstr ""
+msgid "Checkout|Storage packs"
+msgstr ""
+
msgid "Checkout|Street address"
msgstr ""
@@ -6689,6 +6766,9 @@ msgstr ""
msgid "Checkout|Total minutes: %{quantity}"
msgstr ""
+msgid "Checkout|Total storage: %{quantity} GB"
+msgstr ""
+
msgid "Checkout|Users"
msgstr ""
@@ -6698,16 +6778,25 @@ msgstr ""
msgid "Checkout|Your organization"
msgstr ""
+msgid "Checkout|Your storage subscription has the same term as your main subscription, and the price is prorated accordingly."
+msgstr ""
+
msgid "Checkout|Your subscription will be applied to this group"
msgstr ""
msgid "Checkout|Zip code"
msgstr ""
+msgid "Checkout|a storage subscription"
+msgstr ""
+
msgid "Checkout|company or team"
msgstr ""
-msgid "Checkout|x 1,000 minutes per pack = %{strong}"
+msgid "Checkout|minutes"
+msgstr ""
+
+msgid "Checkout|x %{quantity} %{units} per pack ="
msgstr ""
msgid "Cherry-pick this commit"
@@ -7064,6 +7153,9 @@ msgstr ""
msgid "CloneIssue|Cannot clone issue to target project as it is pending deletion."
msgstr ""
+msgid "CloneIssue|Cannot clone issues of '%{issue_type}' type."
+msgstr ""
+
msgid "Cloned this issue to %{path_to_project}."
msgstr ""
@@ -7118,7 +7210,10 @@ msgstr ""
msgid "Closes this %{quick_action_target}."
msgstr ""
-msgid "Cloud licenses can not be removed."
+msgid "Cloud Functions description and apps that are suitable for this deployment target"
+msgstr ""
+
+msgid "Cloud Run description and apps that are suitable for this deployment target"
msgstr ""
msgid "Cluster"
@@ -7145,6 +7240,12 @@ msgstr ""
msgid "ClusterAgents|Access tokens"
msgstr ""
+msgid "ClusterAgents|Agent might not be connected to GitLab"
+msgstr ""
+
+msgid "ClusterAgents|Agent never connected to GitLab"
+msgstr ""
+
msgid "ClusterAgents|Alternative installation methods"
msgstr ""
@@ -7160,6 +7261,12 @@ msgstr ""
msgid "ClusterAgents|Configuration"
msgstr ""
+msgid "ClusterAgents|Connected"
+msgstr ""
+
+msgid "ClusterAgents|Connection status"
+msgstr ""
+
msgid "ClusterAgents|Copy token"
msgstr ""
@@ -7178,6 +7285,9 @@ msgstr ""
msgid "ClusterAgents|For alternative installation methods %{linkStart}go to the documentation%{linkEnd}."
msgstr ""
+msgid "ClusterAgents|For more troubleshooting information go to"
+msgstr ""
+
msgid "ClusterAgents|Go to the repository"
msgstr ""
@@ -7193,18 +7303,30 @@ msgstr ""
msgid "ClusterAgents|Integrate with the GitLab Agent"
msgstr ""
-msgid "ClusterAgents|Last used"
+msgid "ClusterAgents|Last connected %{timeAgo}."
+msgstr ""
+
+msgid "ClusterAgents|Last contact"
msgstr ""
msgid "ClusterAgents|Learn how to create an agent access token"
msgstr ""
+msgid "ClusterAgents|Make sure you are using a valid token."
+msgstr ""
+
msgid "ClusterAgents|Name"
msgstr ""
msgid "ClusterAgents|Never"
msgstr ""
+msgid "ClusterAgents|Never connected"
+msgstr ""
+
+msgid "ClusterAgents|Not connected"
+msgstr ""
+
msgid "ClusterAgents|Read more about getting started"
msgstr ""
@@ -7226,6 +7348,9 @@ msgstr ""
msgid "ClusterAgents|Select which Agent you want to install"
msgstr ""
+msgid "ClusterAgents|The Agent has not been connected in a long time. There might be a connectivity issue. Last contact was %{timeAgo}."
+msgstr ""
+
msgid "ClusterAgents|The GitLab Agent also requires %{linkStart}enabling the Agent Server%{linkEnd}"
msgstr ""
@@ -7253,9 +7378,6 @@ msgstr ""
msgid "ClusterAgents|You will need to create a token to connect to your agent"
msgstr ""
-msgid "ClusterAgent|This feature is only available for premium plans"
-msgstr ""
-
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -7445,9 +7567,6 @@ msgstr ""
msgid "ClusterIntegration|Create Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Create a provision role on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the account and external ID above. %{startMoreInfoLink}More information%{endLink}"
-msgstr ""
-
msgid "ClusterIntegration|Create cluster on"
msgstr ""
@@ -7880,7 +7999,7 @@ msgstr ""
msgid "ClusterIntegration|Subnets"
msgstr ""
-msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provisioned role, first create one on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the above account and external IDs. %{startMoreInfoLink}More information%{endLink}"
+msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provisioned role, first create one on %{awsLinkStart}Amazon Web Services %{awsLinkEnd} using the above account and external IDs. %{moreInfoStart}More information%{moreInfoEnd}"
msgstr ""
msgid "ClusterIntegration|The Kubernetes certificate used to authenticate to the cluster."
@@ -8114,6 +8233,9 @@ msgstr ""
msgid "Collapse replies"
msgstr ""
+msgid "Collapse settings section"
+msgstr ""
+
msgid "Collapse sidebar"
msgstr ""
@@ -8132,6 +8254,9 @@ msgstr ""
msgid "Comma-separated list of email addresses."
msgstr ""
+msgid "Comma-separated list of users allowed to exceed the rate limit."
+msgstr ""
+
msgid "Comma-separated, e.g. '1.1.1.1, 2.2.2.0/24'"
msgstr ""
@@ -8452,6 +8577,9 @@ msgstr ""
msgid "Configure %{repository_checks_link_start}repository checks%{link_end} and %{housekeeping_link_start}housekeeping%{link_end} on repositories."
msgstr ""
+msgid "Configure CAPTCHAs, IP address limits, and other anti-spam measures."
+msgstr ""
+
msgid "Configure Dependency Scanning in `.gitlab-ci.yml` using the GitLab managed template. You can [add variable overrides](https://docs.gitlab.com/ee/user/application_security/dependency_scanning/#customizing-the-dependency-scanning-settings) to customize Dependency Scanning settings."
msgstr ""
@@ -8488,16 +8616,13 @@ msgstr ""
msgid "Configure a %{codeStart}.gitlab-webide.yml%{codeEnd} file in the %{codeStart}.gitlab%{codeEnd} directory to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
msgstr ""
-msgid "Configure existing installation"
-msgstr ""
-
-msgid "Configure limit for notes created per minute by web and API requests."
+msgid "Configure advanced permissions, Large File Storage, and two-factor authentication settings."
msgstr ""
-msgid "Configure limits for Project/Group Import/Export."
+msgid "Configure approvals by authors and committers on all projects."
msgstr ""
-msgid "Configure limits for web and API requests."
+msgid "Configure existing installation"
msgstr ""
msgid "Configure paths to be protected by Rack Attack."
@@ -8512,10 +8637,13 @@ msgstr ""
msgid "Configure settings for Advanced Search with Elasticsearch."
msgstr ""
+msgid "Configure specific limits for Files API requests that supersede the general user and IP rate limits."
+msgstr ""
+
msgid "Configure specific limits for Git LFS requests that supersede the general user and IP rate limits."
msgstr ""
-msgid "Configure specific limits for Packages API requests that supersede the general user and IP rate limits."
+msgid "Configure specific limits for deprecated API requests that supersede the general user and IP rate limits."
msgstr ""
msgid "Configure the %{link} integration."
@@ -8527,6 +8655,9 @@ msgstr ""
msgid "Configure the way a user creates a new account."
msgstr ""
+msgid "Configure via Merge Request"
+msgstr ""
+
msgid "Configure which lists are shown for anyone who visits this board"
msgstr ""
@@ -8995,6 +9126,9 @@ msgstr ""
msgid "Content parsed with %{link}."
msgstr ""
+msgid "ContentEditor|Table of Contents"
+msgstr ""
+
msgid "ContentEditor|You have to provide a renderMarkdown function or a custom serializer"
msgstr ""
@@ -9181,6 +9315,9 @@ msgstr ""
msgid "Copy link to chart"
msgstr ""
+msgid "Copy prefix"
+msgstr ""
+
msgid "Copy reference"
msgstr ""
@@ -9211,6 +9348,9 @@ msgstr ""
msgid "Copy value"
msgstr ""
+msgid "Corpus Management"
+msgstr ""
+
msgid "Corpus Management|Are you sure you want to delete the corpus?"
msgstr ""
@@ -9439,6 +9579,9 @@ msgstr ""
msgid "Create commit"
msgstr ""
+msgid "Create common files more quickly, and standardize their format."
+msgstr ""
+
msgid "Create confidential merge request"
msgstr ""
@@ -9472,6 +9615,9 @@ msgstr ""
msgid "Create issue"
msgstr ""
+msgid "Create issue to resolve all threads"
+msgstr ""
+
msgid "Create iteration"
msgstr ""
@@ -9526,6 +9672,9 @@ msgstr ""
msgid "Create new..."
msgstr "Krei novan…"
+msgid "Create or import your first project"
+msgstr ""
+
msgid "Create project"
msgstr ""
@@ -9883,7 +10032,7 @@ msgstr ""
msgid "Custom notification events"
msgstr "Propraj sciigaj eventoj"
-msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notificationLinkStart} notification emails%{notificationLinkEnd}."
+msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notificationLinkStart}notification emails%{notificationLinkEnd}."
msgstr ""
msgid "Custom project templates"
@@ -10082,10 +10231,10 @@ msgid_plural "CycleAnalytics|Showing %{subjectFilterText} and %{selectedLabelsCo
msgstr[0] ""
msgstr[1] ""
-msgid "CycleAnalytics|Showing data for group '%{groupName}' and %{selectedProjectCount} projects from %{startDate} to %{endDate}"
+msgid "CycleAnalytics|Showing data for group '%{groupName}' and %{selectedProjectCount} projects from %{createdAfter} to %{createdBefore}"
msgstr ""
-msgid "CycleAnalytics|Showing data for group '%{groupName}' from %{startDate} to %{endDate}"
+msgid "CycleAnalytics|Showing data for group '%{groupName}' from %{createdAfter} to %{createdBefore}"
msgstr ""
msgid "CycleAnalytics|Stages"
@@ -10319,6 +10468,9 @@ msgstr ""
msgid "DastProfiles|Manage profiles"
msgstr ""
+msgid "DastProfiles|Manage site profiles"
+msgstr ""
+
msgid "DastProfiles|Minimum = 0 (no timeout enabled), Maximum = 2880 minutes"
msgstr ""
@@ -10394,6 +10546,9 @@ msgstr ""
msgid "DastProfiles|Scanner name"
msgstr ""
+msgid "DastProfiles|Schedule"
+msgstr ""
+
msgid "DastProfiles|Select branch"
msgstr ""
@@ -10463,7 +10618,7 @@ msgstr ""
msgid "DastProfiles|Website"
msgstr ""
-msgid "DastProfiles|You can either choose a passive scan or validate the target site in your chosen site profile. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
+msgid "DastProfiles|You can either choose a passive scan or validate the target site from the site profile management page. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
msgstr ""
msgid "DastProfiles|You cannot run an active scan against an unvalidated site."
@@ -10636,7 +10791,7 @@ msgstr ""
msgid "Days to merge"
msgstr ""
-msgid "Deactivate dormant users after 90 days of inactivity. Users can return to active status by signing in to their account. While inactive, a user is not counted as an active user in the instance."
+msgid "Deactivate dormant users after 90 days of inactivity"
msgstr ""
msgid "Dear Administrator,"
@@ -10723,10 +10878,10 @@ msgstr ""
msgid "Define a custom pattern with cron syntax"
msgstr "Difini propran Åablonon, uzante la sintakson de Cron"
-msgid "Define approval settings."
+msgid "Define approval rules."
msgstr ""
-msgid "Define approval settings. %{linkStart}Learn more.%{linkEnd}"
+msgid "Define approval rules. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "Define custom rules for what constitutes spam, independent of Akismet"
@@ -10735,7 +10890,7 @@ msgstr ""
msgid "Define environments in the deploy stage(s) in %{code_open}.gitlab-ci.yml%{code_close} to track deployments here."
msgstr ""
-msgid "Define how approval rules are applied as a merge request moves toward completion."
+msgid "Define how approval rules are applied to merge requests."
msgstr ""
msgid "Definition"
@@ -10750,6 +10905,12 @@ msgstr ""
msgid "DelayedJobs|Are you sure you want to run %{job_name} immediately? This job will run automatically after it's timer finishes."
msgstr ""
+msgid "DelayedJobs|Are you sure you want to run %{job_name} immediately? This job will run automatically after its timer finishes."
+msgstr ""
+
+msgid "DelayedJobs|Run the delayed job now?"
+msgstr ""
+
msgid "DelayedJobs|Start now"
msgstr ""
@@ -11026,6 +11187,12 @@ msgstr ""
msgid "Dependency proxy image prefix"
msgstr ""
+msgid "DependencyProxy|Create a local proxy for storing frequently used upstream images. %{docLinkStart}Learn more%{docLinkEnd} about dependency proxies."
+msgstr ""
+
+msgid "DependencyProxy|Dependency Proxy"
+msgstr ""
+
msgid "DependencyProxy|Toggle Dependency Proxy"
msgstr ""
@@ -11266,6 +11433,9 @@ msgstr ""
msgid "Deployments"
msgstr ""
+msgid "Deployments to Google Kubernetes Engine can be "
+msgstr ""
+
msgid "Deployments|%{deployments} environment impacted."
msgid_plural "Deployments|%{deployments} environments impacted."
msgstr[0] ""
@@ -11295,6 +11465,9 @@ msgstr ""
msgid "Deployment|success"
msgstr ""
+msgid "Deprecated API rate limits"
+msgstr ""
+
msgid "Deprioritize label"
msgstr ""
@@ -11697,6 +11870,16 @@ msgstr ""
msgid "DiffsCompareBaseBranch|(base)"
msgstr ""
+msgid "Diffs|%d addition"
+msgid_plural "Diffs|%d additions"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Diffs|%d deletion"
+msgid_plural "Diffs|%d deletions"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Diffs|No file name available"
msgstr ""
@@ -11706,9 +11889,17 @@ msgstr ""
msgid "Diffs|Show all unchanged lines"
msgstr ""
+msgid "Diffs|Showing %{dropdownStart}%{count} changed file%{dropdownEnd}"
+msgid_plural "Diffs|Showing %{dropdownStart}%{count} changed files%{dropdownEnd}"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Diffs|Something went wrong while fetching diff lines."
msgstr ""
+msgid "Diffs|with %{additions} and %{deletions}"
+msgstr ""
+
msgid "Direct member"
msgstr ""
@@ -11834,9 +12025,6 @@ msgid_plural "Dismiss %d selected vulnerabilities as"
msgstr[0] ""
msgstr[1] ""
-msgid "Dismiss Value Stream Analytics introduction box"
-msgstr ""
-
msgid "Dismiss merge request promotion"
msgstr ""
@@ -12158,6 +12346,9 @@ msgstr ""
msgid "Edit issues"
msgstr ""
+msgid "Edit merge requests"
+msgstr ""
+
msgid "Edit public deploy key"
msgstr ""
@@ -12233,6 +12424,9 @@ msgstr ""
msgid "Elastic|None. Select projects to index."
msgstr ""
+msgid "Eligible users"
+msgstr ""
+
msgid "Email"
msgstr ""
@@ -12362,6 +12556,9 @@ msgstr ""
msgid "Enable"
msgstr ""
+msgid "Enable Amazon EKS integration"
+msgstr ""
+
msgid "Enable Auto DevOps"
msgstr ""
@@ -12395,6 +12592,9 @@ msgstr ""
msgid "Enable SSL verification"
msgstr ""
+msgid "Enable Service Ping"
+msgstr ""
+
msgid "Enable Snowplow tracking"
msgstr ""
@@ -12425,6 +12625,9 @@ msgstr ""
msgid "Enable authenticated Git LFS request rate limit"
msgstr ""
+msgid "Enable authenticated web request rate limit"
+msgstr ""
+
msgid "Enable authentication"
msgstr ""
@@ -12485,7 +12688,7 @@ msgstr ""
msgid "Enable or disable the Pseudonymizer data collection."
msgstr ""
-msgid "Enable or disable version check and service ping."
+msgid "Enable or disable version check and Service Ping."
msgstr ""
msgid "Enable protected paths rate limit"
@@ -12497,18 +12700,12 @@ msgstr ""
msgid "Enable reCAPTCHA"
msgstr ""
-msgid "Enable reCAPTCHA for login"
-msgstr ""
-
-msgid "Enable reCAPTCHA, Invisible Captcha, Akismet and set IP limits. For reCAPTCHA, we currently only support %{recaptcha_v2_link_start}v2%{recaptcha_v2_link_end}"
+msgid "Enable reCAPTCHA for login."
msgstr ""
msgid "Enable repository checks"
msgstr ""
-msgid "Enable service ping"
-msgstr ""
-
msgid "Enable shared runners for all projects and subgroups in this group."
msgstr ""
@@ -12530,7 +12727,10 @@ msgstr ""
msgid "Enable unauthenticated API request rate limit"
msgstr ""
-msgid "Enable unauthenticated request rate limit"
+msgid "Enable unauthenticated web request rate limit"
+msgstr ""
+
+msgid "Enable user deactivation emails"
msgstr ""
msgid "Enable version check"
@@ -12566,9 +12766,6 @@ msgstr ""
msgid "Enabled sources for code import during project creation. OmniAuth must be configured for GitHub"
msgstr ""
-msgid "Enabling this will only make licensed EE features available to projects if the project namespace's plan includes the feature or if the project is public."
-msgstr ""
-
msgid "Encountered an error while rendering: %{err}"
msgstr ""
@@ -12617,9 +12814,6 @@ msgstr ""
msgid "Enter Admin Mode"
msgstr ""
-msgid "Enter IP address range"
-msgstr ""
-
msgid "Enter a number"
msgstr ""
@@ -12632,9 +12826,6 @@ msgstr ""
msgid "Enter at least three characters to search"
msgstr ""
-msgid "Enter domain"
-msgstr ""
-
msgid "Enter in your Bitbucket Server URL and personal access token below"
msgstr ""
@@ -12821,9 +13012,6 @@ msgstr ""
msgid "Environments|Deployment %{status}"
msgstr ""
-msgid "Environments|Dismiss"
-msgstr ""
-
msgid "Environments|Enable review app"
msgstr ""
@@ -12836,9 +13024,6 @@ msgstr ""
msgid "Environments|Environments are places where code gets deployed, such as staging or production."
msgstr ""
-msgid "Environments|Help us improve environments"
-msgstr ""
-
msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
msgstr ""
@@ -12875,6 +13060,9 @@ msgstr ""
msgid "Environments|Note that this action will stop the environment, but it will %{emphasisStart}not%{emphasisEnd} have an effect on any existing deployment due to no “stop environment action†being defined in the %{ciConfigLinkStart}.gitlab-ci.yml%{ciConfigLinkEnd} file."
msgstr ""
+msgid "Environments|Open"
+msgstr ""
+
msgid "Environments|Open live environment"
msgstr ""
@@ -12914,9 +13102,6 @@ msgstr ""
msgid "Environments|Stopping %{environmentName}"
msgstr ""
-msgid "Environments|Take the survey"
-msgstr ""
-
msgid "Environments|There was an error fetching the logs. Please try again."
msgstr ""
@@ -12938,9 +13123,6 @@ msgstr ""
msgid "Environments|You don't have any environments right now"
msgstr ""
-msgid "Environments|Your feedback helps GitLab make environments better for you and other users. Participate and enter a sweepstake to win a USD 30 gift card."
-msgstr ""
-
msgid "Environments|by %{avatar}"
msgstr ""
@@ -13223,7 +13405,7 @@ msgstr ""
msgid "Error parsing CSV file. Please make sure it has"
msgstr ""
-msgid "Error rendering markdown preview"
+msgid "Error rendering Markdown preview"
msgstr ""
msgid "Error saving label update."
@@ -13271,6 +13453,9 @@ msgstr ""
msgid "Error: %{error_message}"
msgstr ""
+msgid "Error: Couldn't load some or all of the changes."
+msgstr ""
+
msgid "Error: No AWS credentials were supplied"
msgstr ""
@@ -13304,6 +13489,9 @@ msgstr ""
msgid "ErrorTracking|Enable error tracking"
msgstr ""
+msgid "ErrorTracking|Error tracking backend"
+msgstr ""
+
msgid "ErrorTracking|If you self-host Sentry, enter your Sentry instance's full URL. If you use Sentry's hosted solution, enter https://sentry.io"
msgstr ""
@@ -13337,6 +13525,12 @@ msgstr ""
msgid "Escalation policies must have at least one rule"
msgstr ""
+msgid "EscalationPolicies|%{clockIcon} IF alert is not %{alertStatus} in %{minutes}"
+msgstr ""
+
+msgid "EscalationPolicies|%{notificationIcon} THEN %{doAction} %{forScheduleOrUser}"
+msgstr ""
+
msgid "EscalationPolicies|+ Add an additional rule"
msgstr ""
@@ -13379,13 +13573,13 @@ msgstr ""
msgid "EscalationPolicies|Escalation policies"
msgstr ""
-msgid "EscalationPolicies|Escalation rules"
+msgid "EscalationPolicies|Escalation policy %{obstacle} in Project %{project}"
msgstr ""
-msgid "EscalationPolicies|Failed to load oncall-schedules"
+msgid "EscalationPolicies|Escalation rules"
msgstr ""
-msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} %{then} THEN %{doAction} %{scheduleOrUser}"
+msgid "EscalationPolicies|Failed to load oncall-schedules"
msgstr ""
msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} minutes"
@@ -13463,18 +13657,36 @@ msgstr ""
msgid "Every %{action} attempt has failed: %{job_error_message}. Please try again."
msgstr ""
+msgid "Every 3 months"
+msgstr ""
+
+msgid "Every 3 months on the %{day} at %{time} %{timezone}"
+msgstr ""
+
+msgid "Every 6 months"
+msgstr ""
+
+msgid "Every 6 months on the %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Every day"
msgstr ""
msgid "Every day (at %{time})"
msgstr ""
+msgid "Every day at %{time} %{timezone}"
+msgstr ""
+
msgid "Every month"
msgstr ""
msgid "Every month (Day %{day} at %{time})"
msgstr ""
+msgid "Every month on the %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Every three months"
msgstr ""
@@ -13489,6 +13701,15 @@ msgstr[1] ""
msgid "Every week (%{weekday} at %{time})"
msgstr ""
+msgid "Every week on %{day} at %{time} %{timezone}"
+msgstr ""
+
+msgid "Every year"
+msgstr ""
+
+msgid "Every year on %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Everyone"
msgstr ""
@@ -13525,9 +13746,6 @@ msgstr ""
msgid "Exactly one of %{attributes} is required"
msgstr ""
-msgid "Example: %{ip_address}. %{read_more_link}."
-msgstr ""
-
msgid "Example: @sub\\.company\\.com$"
msgstr ""
@@ -13594,13 +13812,13 @@ msgstr ""
msgid "Expand pipeline"
msgstr ""
-msgid "Expand sidebar"
+msgid "Expand settings section"
msgstr ""
-msgid "Expected documents: %{expected_documents}"
+msgid "Expand sidebar"
msgstr ""
-msgid "Experienced"
+msgid "Expected documents: %{expected_documents}"
msgstr ""
msgid "ExperimentSubject|Must have exactly one of User, Namespace, or Project."
@@ -13885,9 +14103,6 @@ msgstr ""
msgid "Failed to load related branches"
msgstr ""
-msgid "Failed to load sidebar lock status"
-msgstr ""
-
msgid "Failed to load stacktrace."
msgstr ""
@@ -14312,6 +14527,9 @@ msgstr ""
msgid "Files"
msgstr "Dosieroj"
+msgid "Files API Rate Limits"
+msgstr ""
+
msgid "Files breadcrumb"
msgstr ""
@@ -15311,6 +15529,9 @@ msgstr ""
msgid "GitLab group: %{source_link}"
msgstr ""
+msgid "GitLab informs you if a new version is available."
+msgstr ""
+
msgid "GitLab is a complete DevOps platform, delivered as a single application, fundamentally changing the way Development, Security, and Ops teams collaborate"
msgstr ""
@@ -15326,7 +15547,7 @@ msgstr ""
msgid "GitLab is open source software to collaborate on code."
msgstr ""
-msgid "GitLab is undergoing maintenance and is operating in a read-only mode."
+msgid "GitLab is undergoing maintenance and is operating in read-only mode."
msgstr ""
msgid "GitLab member or Email address"
@@ -15338,9 +15559,6 @@ msgstr ""
msgid "GitLab project export"
msgstr ""
-msgid "GitLab restart is required to apply changes."
-msgstr ""
-
msgid "GitLab single sign-on URL"
msgstr ""
@@ -15356,9 +15574,6 @@ msgstr ""
msgid "GitLab version"
msgstr ""
-msgid "GitLab will inform you if a new version is available."
-msgstr ""
-
msgid "GitLab will run a background job that will produce pseudonymized CSVs of the GitLab database that will be uploaded to your configured object storage directory."
msgstr ""
@@ -15623,9 +15838,21 @@ msgstr ""
msgid "Go to snippets"
msgstr ""
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check 'Allowed domains for sign-ups'."
+msgstr ""
+
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check 'Email restrictions for sign-ups'."
+msgstr ""
+
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check the 'Domain denylist'."
+msgstr ""
+
msgid "Go to the activity feed"
msgstr ""
+msgid "Go to the group’s 'Settings &gt; General' page, and check 'Restrict membership by email domain'."
+msgstr ""
+
msgid "Go to the milestone list"
msgstr ""
@@ -15662,6 +15889,12 @@ msgstr ""
msgid "Goal of the changes and what reviewers should be aware of"
msgstr ""
+msgid "Google Cloud"
+msgstr ""
+
+msgid "Google Cloud offers several deployment targets. Select the one most suitable for your project."
+msgstr ""
+
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
@@ -15746,9 +15979,6 @@ msgstr ""
msgid "Group ID"
msgstr ""
-msgid "Group ID: %{group_id}"
-msgstr ""
-
msgid "Group Owner must have signed in with SAML before enabling Group Managed Accounts"
msgstr ""
@@ -15923,6 +16153,12 @@ msgstr ""
msgid "GroupImport|Unable to process group import file"
msgstr ""
+msgid "GroupPage|Copy group ID"
+msgstr ""
+
+msgid "GroupPage|Group ID: %{group_id}"
+msgstr ""
+
msgid "GroupRoadmap|%{dateWord} – No end date"
msgstr ""
@@ -15977,6 +16213,9 @@ msgstr ""
msgid "GroupRoadmap|Within 3 years"
msgstr ""
+msgid "GroupSAML|\"persistent\" recommended"
+msgstr ""
+
msgid "GroupSAML|%{strongOpen}Warning%{strongClose} - Enabling %{linkStart}SSO enforcement%{linkEnd} can reduce security risks."
msgstr ""
@@ -16109,6 +16348,9 @@ msgstr ""
msgid "GroupSAML|To be able to prohibit outer forks, you first need to enforce dedicate group managed accounts."
msgstr ""
+msgid "GroupSAML|Use SAML group links to manage group membership using SAML."
+msgstr ""
+
msgid "GroupSAML|Valid SAML Response"
msgstr ""
@@ -16121,13 +16363,10 @@ msgstr ""
msgid "GroupSAML|as %{access_level}"
msgstr ""
-msgid "GroupSAML|must match stored NameID of \"%{extern_uid}\" as we use this to identify users. If the NameID changes users will be unable to sign in."
-msgstr ""
-
-msgid "GroupSAML|should be \"persistent\""
+msgid "GroupSAML|must match stored NameID of \"%{extern_uid}\" to identify user and allow sign in"
msgstr ""
-msgid "GroupSAML|should be a random persistent ID, emails are discouraged"
+msgid "GroupSAML|recommend persistent ID instead of email"
msgstr ""
msgid "GroupSelect|No matching results"
@@ -16142,9 +16381,15 @@ msgstr ""
msgid "GroupSettings|Allow project access token creation"
msgstr ""
+msgid "GroupSettings|Applied to all subgroups unless overridden by a group owner. Groups already added to the project lose access."
+msgstr ""
+
msgid "GroupSettings|Auto DevOps pipeline was updated for the group"
msgstr ""
+msgid "GroupSettings|Available only on the top-level group. Applies to all subgroups. Groups already shared with a group outside %{group} are still shared unless removed manually."
+msgstr ""
+
msgid "GroupSettings|Badges"
msgstr ""
@@ -16196,6 +16441,9 @@ msgstr ""
msgid "GroupSettings|New runners registration token has been generated!"
msgstr ""
+msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgstr ""
+
msgid "GroupSettings|Pipeline settings was updated for the group"
msgstr ""
@@ -16208,12 +16456,15 @@ msgstr ""
msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
-msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups."
+msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups"
msgstr ""
msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
msgstr ""
+msgid "GroupSettings|Prevents group members from being notified if the group is mentioned."
+msgstr ""
+
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
msgstr ""
@@ -16250,21 +16501,6 @@ msgstr ""
msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}."
msgstr ""
-msgid "GroupSettings|This setting is only available on the top-level group and it applies to all subgroups. Groups that have already been shared with a group outside %{group} will still be shared, and this access will have to be revoked manually."
-msgstr ""
-
-msgid "GroupSettings|This setting will be applied to all subgroups unless overridden by a group owner. Groups that already have access to the project will continue to have access unless removed manually."
-msgstr ""
-
-msgid "GroupSettings|This setting will override user notification preferences for all members of the group, subgroups, and projects."
-msgstr ""
-
-msgid "GroupSettings|This setting will prevent group members from being notified if the group is mentioned."
-msgstr ""
-
-msgid "GroupSettings|This setting will prevent group members from forking projects outside of the group."
-msgstr ""
-
msgid "GroupSettings|Transfer group"
msgstr ""
@@ -16382,7 +16618,7 @@ msgstr ""
msgid "GroupsNew|No import options available"
msgstr ""
-msgid "GroupsNew|Not all related objects are migrated, as %{docs_link_start}described here%{docs_link_end}. Please %{feedback_link_start}leave feedback%{feedback_link_end} on this feature."
+msgid "GroupsNew|Not all related objects are migrated. %{docs_link_start}More info%{docs_link_end}."
msgstr ""
msgid "GroupsNew|Personal access token"
@@ -16514,15 +16750,27 @@ msgstr ""
msgid "Hello %{name},"
msgstr ""
-msgid "Hello there"
-msgstr ""
-
msgid "Hello, %{name}!"
msgstr ""
msgid "Hello, %{username}!"
msgstr ""
+msgid "HelloMessage|%{handshake_emoji} Contribute to GitLab: %{contribute_link}"
+msgstr ""
+
+msgid "HelloMessage|%{magnifier_emoji} Create a new GitLab issue: %{new_issue_link}"
+msgstr ""
+
+msgid "HelloMessage|%{rocket_emoji} We like your curiosity! Help us improve GitLab by joining the team: %{jobs_page_link}"
+msgstr ""
+
+msgid "HelloMessage|Does this page need fixes or improvements? Open an issue or contribute a merge request to help make GitLab more lovable. At GitLab, everyone can contribute!"
+msgstr ""
+
+msgid "HelloMessage|Welcome to GitLab!"
+msgstr ""
+
msgid "Help"
msgstr ""
@@ -16532,13 +16780,10 @@ msgstr ""
msgid "Helps prevent bots from creating accounts."
msgstr ""
-msgid "Helps prevent bots from creating issues"
-msgstr ""
-
-msgid "Helps prevent malicious users hide their activity"
+msgid "Helps prevent bots from creating issues."
msgstr ""
-msgid "Helps reduce request volume (e.g. from crawlers or abusive bots)"
+msgid "Helps prevent malicious users hide their activity."
msgstr ""
msgid "Helps reduce request volume (for example, from crawlers or abusive bots)"
@@ -16662,6 +16907,12 @@ msgstr "La refreÅigo komenciÄis sukcese"
msgid "Housekeeping, export, path, transfer, remove, archive."
msgstr ""
+msgid "How do I configure Akismet?"
+msgstr ""
+
+msgid "How do I configure it?"
+msgstr ""
+
msgid "How do I configure runners?"
msgstr ""
@@ -16683,19 +16934,25 @@ msgstr ""
msgid "How do I set up this service?"
msgstr ""
+msgid "How do I use a web terminal?"
+msgstr ""
+
+msgid "How do I use file templates?"
+msgstr ""
+
msgid "How it works"
msgstr ""
msgid "How many days need to pass between marking entity for deletion and actual removing it."
msgstr ""
-msgid "How many seconds an IP will be counted towards the limit"
+msgid "How many seconds an IP counts toward the IP address limit."
msgstr ""
-msgid "I accept the %{terms_link}"
+msgid "How the job limiter handles jobs exceeding the thresholds specified below. The 'track' mode only logs the jobs. The 'compress' mode compresses the jobs and raises an exception if the compressed size exceeds the limit."
msgstr ""
-msgid "I accept the|Terms of Service and Privacy Policy"
+msgid "I accept the %{terms_link}"
msgstr ""
msgid "I forgot my password"
@@ -16779,13 +17036,16 @@ msgstr ""
msgid "IP Address"
msgstr ""
-msgid "IP expiration time"
+msgid "IP address expiration time"
msgstr ""
-msgid "IP subnet restriction only allowed for top-level groups"
+msgid "IP address restrictions"
+msgstr ""
+
+msgid "IP addresses per user"
msgstr ""
-msgid "IPs per user"
+msgid "IP subnet restriction only allowed for top-level groups"
msgstr ""
msgid "Identifier"
@@ -16800,6 +17060,9 @@ msgstr ""
msgid "If any indexed field exceeds this limit it will be truncated to this number of characters and the rest will not be indexed or searchable. This does not apply to repository and wiki indexing. Setting this to 0 means it is unlimited."
msgstr ""
+msgid "If blank, defaults to %{code_open}Retry later%{code_close}."
+msgstr ""
+
msgid "If blank, set allowable lifetime to %{instance_level_policy_in_words}, as defined by the instance admin. Once set, existing tokens for users in this group may be revoked."
msgstr ""
@@ -16851,6 +17114,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 did not initiate these sign-in attempts, please reach out to your administrator or enable two-factor authentication (2FA) on your account."
+msgstr ""
+
msgid "If you did not initiate this change, please contact your administrator immediately."
msgstr ""
@@ -16942,10 +17208,10 @@ msgstr ""
msgid "Import Projects from Gitea"
msgstr ""
-msgid "Import a project"
+msgid "Import an exported GitLab project"
msgstr ""
-msgid "Import an exported GitLab project"
+msgid "Import and export rate limits"
msgstr ""
msgid "Import failed due to a GitHub error: %{original}"
@@ -16957,12 +17223,18 @@ msgstr ""
msgid "Import from Jira"
msgstr ""
+msgid "Import group"
+msgstr ""
+
msgid "Import group from file"
msgstr ""
msgid "Import groups"
msgstr ""
+msgid "Import history"
+msgstr ""
+
msgid "Import in progress"
msgstr ""
@@ -17026,7 +17298,25 @@ msgstr ""
msgid "Import timed out. Import took longer than %{import_jobs_expiration} seconds"
msgstr ""
-msgid "Import/Export Rate Limits"
+msgid "ImportAProjectModal|Import from a project"
+msgstr ""
+
+msgid "ImportAProjectModal|Import members from another project"
+msgstr ""
+
+msgid "ImportAProjectModal|Import project members"
+msgstr ""
+
+msgid "ImportAProjectModal|Only project members (not group members) are imported, and they get the same permissions as the project you import from."
+msgstr ""
+
+msgid "ImportAProjectModal|Successfully imported"
+msgstr ""
+
+msgid "ImportAProjectModal|Unable to import project members"
+msgstr ""
+
+msgid "ImportAProjectModal|You're importing members to the %{strongStart}%{name}%{strongEnd} project."
msgstr ""
msgid "ImportButtons|Connect repositories from"
@@ -17079,7 +17369,7 @@ msgstr[1] ""
msgid "Importing..."
msgstr ""
-msgid "Import|A repository URL usually ends in a .git suffix, although this is not required. Double check to make sure your repository URL is correct."
+msgid "Import|There is not a valid Git repository at this URL. If your HTTP repository is not publicly accessible, verify your credentials."
msgstr ""
msgid "Improve customer support with Service Desk"
@@ -17088,9 +17378,6 @@ msgstr ""
msgid "Improves Git cloning performance."
msgstr ""
-msgid "In %{time_to_now}"
-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 ""
@@ -17376,7 +17663,7 @@ msgstr ""
msgid "InProductMarketing|Start a GitLab Ultimate trial today in less than one minute, no credit card required."
msgstr ""
-msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no CC required"
+msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no credit card required"
msgstr ""
msgid "InProductMarketing|Start a trial"
@@ -17415,7 +17702,7 @@ msgstr ""
msgid "InProductMarketing|Team up in GitLab for greater efficiency"
msgstr ""
-msgid "InProductMarketing|Team work makes the dream work"
+msgid "InProductMarketing|Team work makes the dream work"
msgstr ""
msgid "InProductMarketing|Test, create, deploy"
@@ -17996,6 +18283,9 @@ msgstr ""
msgid "Integrations|Create new issue in Jira"
msgstr ""
+msgid "Integrations|Create new issue in ZenTao"
+msgstr ""
+
msgid "Integrations|Default settings are inherited from the group level."
msgstr ""
@@ -18089,9 +18379,15 @@ msgstr ""
msgid "Integrations|Search Jira issues"
msgstr ""
+msgid "Integrations|Search ZenTao issues"
+msgstr ""
+
msgid "Integrations|Send notifications about project events to Unify Circuit."
msgstr ""
+msgid "Integrations|Send notifications about project events to a Unify Circuit conversation. %{docs_link}"
+msgstr ""
+
msgid "Integrations|Sign in to add namespaces"
msgstr ""
@@ -18131,6 +18427,9 @@ msgstr ""
msgid "Integrations|You've activated every integration 🎉"
msgstr ""
+msgid "Integrations|ZenTao issues display here when you create issues in your project in ZenTao."
+msgstr ""
+
msgid "Interactive mode"
msgstr ""
@@ -18158,9 +18457,6 @@ msgstr ""
msgid "Interval Pattern"
msgstr "Intervala Åablono"
-msgid "Introducing Value Stream Analytics"
-msgstr ""
-
msgid "Introducing Your DevOps Report"
msgstr ""
@@ -18257,6 +18553,12 @@ msgstr ""
msgid "Investigate vulnerability: %{title}"
msgstr ""
+msgid "Invisible Captcha"
+msgstr ""
+
+msgid "Invisible Captcha helps prevent the creation of spam accounts. It adds a honeypot field and time-sensitive form submission to the account signup form."
+msgstr ""
+
msgid "Invitation"
msgstr ""
@@ -18710,12 +19012,18 @@ msgstr ""
msgid "Issues"
msgstr ""
+msgid "Issues I've created"
+msgstr ""
+
msgid "Issues Rate Limits"
msgstr ""
msgid "Issues and merge requests"
msgstr ""
+msgid "Issues assigned to me"
+msgstr ""
+
msgid "Issues can be bugs, tasks or ideas to be discussed. Also, issues are searchable and filterable."
msgstr ""
@@ -18827,7 +19135,7 @@ msgstr ""
msgid "Iterations|Create cadence"
msgstr ""
-msgid "Iterations|Create your first iteration"
+msgid "Iterations|Create iteration"
msgstr ""
msgid "Iterations|Delete cadence"
@@ -18836,6 +19144,9 @@ msgstr ""
msgid "Iterations|Delete iteration cadence?"
msgstr ""
+msgid "Iterations|Delete iteration?"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -18869,12 +19180,18 @@ msgstr ""
msgid "Iterations|New iteration cadence"
msgstr ""
+msgid "Iterations|No closed iterations."
+msgstr ""
+
msgid "Iterations|No iteration cadences to show."
msgstr ""
msgid "Iterations|No iterations in cadence."
msgstr ""
+msgid "Iterations|No open iterations."
+msgstr ""
+
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
@@ -18905,6 +19222,9 @@ msgstr ""
msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
msgstr ""
+msgid "Iterations|This will remove the iteration from any issues that are assigned to it."
+msgstr ""
+
msgid "Iterations|Title"
msgstr ""
@@ -18920,15 +19240,9 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "I’m familiar with the basics of DevOps."
-msgstr ""
-
msgid "I’m joining my team who’s already on GitLab"
msgstr ""
-msgid "I’m not familiar with the basics of DevOps."
-msgstr ""
-
msgid "Jaeger URL"
msgstr ""
@@ -19193,6 +19507,9 @@ msgstr ""
msgid "Job"
msgstr ""
+msgid "Job %{jobName}"
+msgstr ""
+
msgid "Job Failed #%{build_id}"
msgstr ""
@@ -19783,9 +20100,6 @@ msgstr ""
msgid "Learn more in the"
msgstr "Lernu pli en la"
-msgid "Learn more in the|pipeline schedules documentation"
-msgstr "dokumentado pri ĉenstablaj planoj"
-
msgid "Learn more."
msgstr ""
@@ -19897,9 +20211,6 @@ msgstr ""
msgid "Leave Admin Mode"
msgstr ""
-msgid "Leave blank for no limit. Once set, existing personal access tokens may be revoked."
-msgstr ""
-
msgid "Leave edit mode? All unsaved changes will be lost."
msgstr ""
@@ -19945,10 +20256,10 @@ msgstr ""
msgid "LicenseCompliance|Acceptable license to be used in the project"
msgstr ""
-msgid "LicenseCompliance|Add a license"
+msgid "LicenseCompliance|Add license and related policy"
msgstr ""
-msgid "LicenseCompliance|Add license and related policy"
+msgid "LicenseCompliance|Add license policy"
msgstr ""
msgid "LicenseCompliance|Allow"
@@ -20038,6 +20349,9 @@ msgstr ""
msgid "LicenseManagement|Uncategorized"
msgstr ""
+msgid "Licensed Enterprise Edition features can be used if the project namespace's plan includes the feature, or if the project is public."
+msgstr ""
+
msgid "Licensed Features"
msgstr ""
@@ -20104,7 +20418,10 @@ msgstr ""
msgid "Limit namespaces and projects that can be indexed"
msgstr ""
-msgid "Limit sign in from multiple ips"
+msgid "Limit project size at a global, group, and project level. %{link_start}Learn more%{link_end}."
+msgstr ""
+
+msgid "Limit sign in from multiple IP addresses"
msgstr ""
msgid "Limit the number of concurrent operations this secondary site can run in the background."
@@ -20116,11 +20433,17 @@ msgstr ""
msgid "Limit the number of issues and epics per minute a user can create through web and API requests."
msgstr ""
+msgid "Limit the size of Sidekiq jobs stored in Redis."
+msgstr ""
+
msgid "Limited to showing %d event at most"
msgid_plural "Limited to showing %d events at most"
msgstr[0] ""
msgstr[1] ""
+msgid "Limiting mode"
+msgstr ""
+
msgid "Line changes"
msgstr ""
@@ -20190,9 +20513,6 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
-msgid "List of users to be excluded from the limit"
-msgstr ""
-
msgid "List options"
msgstr ""
@@ -20232,9 +20552,6 @@ msgstr ""
msgid "Loading functions timed out. Please reload the page to try again."
msgstr ""
-msgid "Loading issues"
-msgstr ""
-
msgid "Loading more"
msgstr ""
@@ -20526,6 +20843,9 @@ msgstr ""
msgid "Marked For Deletion At - %{deletion_time}"
msgstr ""
+msgid "Marked as ready. Merging is now allowed."
+msgstr ""
+
msgid "Marked this %{noun} as a draft."
msgstr ""
@@ -20598,52 +20918,22 @@ msgstr ""
msgid "Max 100,000 events"
msgstr ""
-msgid "Max 20 characters"
-msgstr ""
-
-msgid "Max Group Export Download requests per minute per user"
-msgstr ""
-
-msgid "Max Group Export requests per minute per user"
-msgstr ""
-
-msgid "Max Group Import requests per minute per user"
-msgstr ""
-
-msgid "Max Project Export Download requests per minute per user"
-msgstr ""
-
-msgid "Max Project Export requests per minute per user"
-msgstr ""
-
-msgid "Max Project Import requests per minute per user"
-msgstr ""
-
-msgid "Max authenticated API requests per period per user"
-msgstr ""
-
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
-msgid "Max authenticated web requests per period per user"
-msgstr ""
-
msgid "Max file size is 200 KB."
msgstr ""
-msgid "Max requests per minute per user"
-msgstr ""
-
msgid "Max role"
msgstr ""
msgid "Max session time"
msgstr ""
-msgid "Max unauthenticated requests per period per IP"
+msgid "MaxBuilds"
msgstr ""
-msgid "MaxBuilds"
+msgid "Maximum 20 characters"
msgstr ""
msgid "Maximum Conan package file size in bytes"
@@ -20679,6 +20969,12 @@ msgstr ""
msgid "Maximum attachment size (MB)"
msgstr ""
+msgid "Maximum authenticated API requests per rate limit period per user"
+msgstr ""
+
+msgid "Maximum authenticated web requests per rate limit period per user"
+msgstr ""
+
msgid "Maximum bulk request size (MiB)"
msgstr ""
@@ -20724,6 +21020,15 @@ msgstr ""
msgid "Maximum files in a diff"
msgstr ""
+msgid "Maximum group export download requests per minute"
+msgstr ""
+
+msgid "Maximum group export requests per minute"
+msgstr ""
+
+msgid "Maximum group import requests per minute"
+msgstr ""
+
msgid "Maximum import size"
msgstr ""
@@ -20760,7 +21065,7 @@ msgstr ""
msgid "Maximum number of projects."
msgstr ""
-msgid "Maximum number of unique IPs per user"
+msgid "Maximum number of unique IP addresses per user."
msgstr ""
msgid "Maximum page reached"
@@ -20769,12 +21074,24 @@ msgstr ""
msgid "Maximum page size"
msgstr ""
+msgid "Maximum project export download requests per minute"
+msgstr ""
+
+msgid "Maximum project export requests per minute"
+msgstr ""
+
+msgid "Maximum project import requests per minute"
+msgstr ""
+
msgid "Maximum push size"
msgstr ""
msgid "Maximum push size (MB)"
msgstr ""
+msgid "Maximum requests per minute"
+msgstr ""
+
msgid "Maximum running slices"
msgstr ""
@@ -20802,10 +21119,16 @@ msgstr ""
msgid "Maximum time between updates that a mirror can have when scheduled to synchronize."
msgstr ""
-msgid "Maximum time for web terminal websocket connection (in seconds). 0 for unlimited."
+msgid "Maximum time that users are allowed to skip the setup of two-factor authentication (in hours). Set to 0 (zero) to enforce at next sign in."
msgstr ""
-msgid "Maximum time that users are allowed to skip the setup of two-factor authentication (in hours). Set to 0 (zero) to enforce at next sign in."
+msgid "Maximum time, in seconds, for a web terminal websocket connection. 0 for unlimited."
+msgstr ""
+
+msgid "Maximum unauthenticated API requests per rate limit period per IP"
+msgstr ""
+
+msgid "Maximum unauthenticated web requests per rate limit period per IP"
msgstr ""
msgid "May"
@@ -20823,9 +21146,6 @@ msgstr ""
msgid "Medium vulnerabilities present"
msgstr ""
-msgid "Member lock"
-msgstr ""
-
msgid "Member since"
msgstr ""
@@ -20862,6 +21182,9 @@ msgstr ""
msgid "Members of a group may only view projects they have permission to access"
msgstr ""
+msgid "Membership"
+msgstr ""
+
msgid "Members|%{time} by %{user}"
msgstr ""
@@ -20922,9 +21245,6 @@ msgstr ""
msgid "Members|Expiration date updated successfully."
msgstr ""
-msgid "Members|Expired"
-msgstr ""
-
msgid "Members|Filter members"
msgstr ""
@@ -20940,9 +21260,6 @@ msgstr ""
msgid "Members|Membership"
msgstr ""
-msgid "Members|No expiration set"
-msgstr ""
-
msgid "Members|Remove \"%{groupName}\""
msgstr ""
@@ -20964,9 +21281,6 @@ msgstr ""
msgid "Members|Search invited"
msgstr ""
-msgid "Members|in %{time}"
-msgstr ""
-
msgid "Member|Deny access"
msgstr ""
@@ -21042,9 +21356,6 @@ msgstr ""
msgid "Merge request %{mr_link} was reviewed by %{mr_author}"
msgstr ""
-msgid "Merge request (MR) approvals"
-msgstr ""
-
msgid "Merge request analytics"
msgstr ""
@@ -21066,12 +21377,21 @@ msgstr ""
msgid "Merge requests"
msgstr ""
+msgid "Merge requests I've created"
+msgstr ""
+
msgid "Merge requests are a place to propose changes you've made to a project and discuss those changes with others"
msgstr ""
msgid "Merge requests are read-only in a secondary Geo node"
msgstr ""
+msgid "Merge requests assigned to me"
+msgstr ""
+
+msgid "Merge requests that I'm a reviewer"
+msgstr ""
+
msgid "Merge the branch and fix any conflicts that come up"
msgstr ""
@@ -21132,10 +21452,10 @@ msgstr ""
msgid "MergeRequests|An error occurred while saving the draft comment."
msgstr ""
-msgid "MergeRequests|Failed to squash. Should be done manually."
+msgid "MergeRequests|Create issue to resolve thread"
msgstr ""
-msgid "MergeRequests|Resolve this thread in a new issue"
+msgid "MergeRequests|Failed to squash. Should be done manually."
msgstr ""
msgid "MergeRequests|Saving the comment failed"
@@ -21949,6 +22269,9 @@ msgstr ""
msgid "MoveIssue|Cannot move issue to project it originates from!"
msgstr ""
+msgid "MoveIssue|Cannot move issues of '%{issue_type}' type."
+msgstr ""
+
msgid "Moved issue to %{label} column in the board."
msgstr ""
@@ -22074,6 +22397,15 @@ 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. To learn more about reducing storage capacity please visit our docs."
msgstr ""
+msgid "NamespaceUserCap|Pending users must be reviewed and approved by a group owner. Learn more about %{user_caps_link_start}User Caps%{link_end} and %{users_pending_approval_link_start}Users Pending Approval%{link_end}."
+msgstr ""
+
+msgid "NamespaceUserCap|View pending user approvals"
+msgstr ""
+
+msgid "NamespaceUserCap|Your group has reached its billable member limit"
+msgstr ""
+
msgid "Namespaces"
msgstr ""
@@ -22116,9 +22448,6 @@ msgstr ""
msgid "Network"
msgstr ""
-msgid "Network Policy|New rule"
-msgstr ""
-
msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is inbound from a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
msgstr ""
@@ -22140,16 +22469,13 @@ msgstr ""
msgid "NetworkPolicies|%{strongOpen}any%{strongClose} port"
msgstr ""
-msgid "NetworkPolicies|+ Add alert"
-msgstr ""
-
msgid "NetworkPolicies|.yaml"
msgstr ""
msgid "NetworkPolicies|.yaml mode"
msgstr ""
-msgid "NetworkPolicies|Actions"
+msgid "NetworkPolicies|Add alert"
msgstr ""
msgid "NetworkPolicies|Alerts are intended to be selectively used for a limited number of events that are potentially concerning and warrant a manual review. Alerts should not be used as a substitute for a SIEM or a logging tool. High volume alerts are likely to be dropped so as to preserve the stability of GitLab's integration with Kubernetes."
@@ -22185,9 +22511,6 @@ msgstr ""
msgid "NetworkPolicies|Deny all traffic"
msgstr ""
-msgid "NetworkPolicies|Description"
-msgstr ""
-
msgid "NetworkPolicies|Edit policy"
msgstr ""
@@ -22200,9 +22523,6 @@ msgstr ""
msgid "NetworkPolicies|IP/subnet"
msgstr ""
-msgid "NetworkPolicies|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
-msgstr ""
-
msgid "NetworkPolicies|Invalid or empty policy"
msgstr ""
@@ -22212,19 +22532,16 @@ msgstr ""
msgid "NetworkPolicies|Kubernetes error: %{error}"
msgstr ""
-msgid "NetworkPolicies|Name"
-msgstr ""
-
msgid "NetworkPolicies|Network"
msgstr ""
-msgid "NetworkPolicies|Network traffic"
+msgid "NetworkPolicies|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
msgstr ""
-msgid "NetworkPolicies|New policy"
+msgid "NetworkPolicies|Network policy can be created after the environment is loaded successfully."
msgstr ""
-msgid "NetworkPolicies|No policies detected"
+msgid "NetworkPolicies|Network traffic"
msgstr ""
msgid "NetworkPolicies|None selected"
@@ -22233,21 +22550,12 @@ msgstr ""
msgid "NetworkPolicies|Please %{installLinkStart}install%{installLinkEnd} and %{configureLinkStart}configure a Kubernetes Agent for this project%{configureLinkEnd} to enable alerts."
msgstr ""
-msgid "NetworkPolicies|Policies are a specification of how groups of pods are allowed to communicate with each other's network endpoints."
-msgstr ""
-
msgid "NetworkPolicies|Policy %{policyName} was successfully changed"
msgstr ""
msgid "NetworkPolicies|Policy definition"
msgstr ""
-msgid "NetworkPolicies|Policy editor"
-msgstr ""
-
-msgid "NetworkPolicies|Policy preview"
-msgstr ""
-
msgid "NetworkPolicies|Rule"
msgstr ""
@@ -22257,9 +22565,6 @@ msgstr ""
msgid "NetworkPolicies|Rule mode is unavailable for this policy. In some cases, we cannot parse the YAML file back into the rules editor."
msgstr ""
-msgid "NetworkPolicies|Rules"
-msgstr ""
-
msgid "NetworkPolicies|Save changes"
msgstr ""
@@ -22272,9 +22577,6 @@ msgstr ""
msgid "NetworkPolicies|Traffic that does not match any rule will be blocked."
msgstr ""
-msgid "NetworkPolicies|Unable to parse policy"
-msgstr ""
-
msgid "NetworkPolicies|all DNS names"
msgstr ""
@@ -22454,6 +22756,9 @@ msgstr ""
msgid "New issue"
msgstr "Nova problemo"
+msgid "New issue in %{project}"
+msgstr ""
+
msgid "New issue title"
msgstr ""
@@ -22532,7 +22837,7 @@ msgstr ""
msgid "Newest first"
msgstr ""
-msgid "Newly registered users will by default be external"
+msgid "Newly-registered users are external by default"
msgstr ""
msgid "Next"
@@ -22847,8 +23152,10 @@ msgstr ""
msgid "No webhooks found, add one in the form above."
msgstr ""
-msgid "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} to renew your subscription."
-msgstr ""
+msgid "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} day to renew your subscription."
+msgid_plural "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} days to renew your subscription."
+msgstr[0] ""
+msgstr[1] ""
msgid "No. of commits"
msgstr ""
@@ -22865,7 +23172,7 @@ msgstr ""
msgid "Nodes"
msgstr ""
-msgid "Non-admin users can sign in with read-only access and make read-only API requests."
+msgid "Non-admin users are restricted to read-only access, in both GitLab UI and API."
msgstr ""
msgid "None"
@@ -22946,7 +23253,7 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
-msgid "Notes Rate Limits"
+msgid "Notes rate limit"
msgstr ""
msgid "Notes|Are you sure you want to cancel creating this comment?"
@@ -23113,9 +23420,6 @@ msgstr ""
msgid "November"
msgstr ""
-msgid "Novice"
-msgstr ""
-
msgid "Now, personalize your GitLab experience"
msgstr ""
@@ -23284,7 +23588,7 @@ msgstr ""
msgid "OnCallSchedules|For this rotation, on-call will be:"
msgstr ""
-msgid "OnCallSchedules|On-call schedule %{schedule} in Project %{project}"
+msgid "OnCallSchedules|On-call schedule %{obstacle} in Project %{project}"
msgstr ""
msgid "OnCallSchedules|On-call schedules"
@@ -23431,22 +23735,22 @@ msgstr ""
msgid "OnDemandScans|Scanner profile"
msgstr ""
-msgid "OnDemandScans|Select one of the existing profiles"
+msgid "OnDemandScans|Schedule scan"
msgstr ""
-msgid "OnDemandScans|Site profile"
+msgid "OnDemandScans|Select one of the existing profiles"
msgstr ""
-msgid "OnDemandScans|Use existing scanner profile"
+msgid "OnDemandScans|Site profile"
msgstr ""
-msgid "OnDemandScans|Use existing site profile"
+msgid "OnDemandScans|Start time"
msgstr ""
-msgid "OnDemandScans|You can either choose a passive scan or validate the target site in your chosen site profile. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
+msgid "OnDemandScans|Use existing scanner profile"
msgstr ""
-msgid "OnDemandScans|You cannot run an active scan against an unvalidated site."
+msgid "OnDemandScans|Use existing site profile"
msgstr ""
msgid "OnDemandScans|You must create a repository within your project to run an on-demand scan."
@@ -23511,6 +23815,9 @@ msgstr ""
msgid "Only admins can delete project"
msgstr ""
+msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
+msgstr ""
+
msgid "Only include features new to your current subscription tier."
msgstr ""
@@ -23529,6 +23836,12 @@ msgstr ""
msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
+msgid "Only reCAPTCHA v2 is supported:"
+msgstr ""
+
+msgid "Only users from the specified IP address ranges are able to reach this group, including all subgroups, projects, and Git repositories."
+msgstr ""
+
msgid "Only verified users with an email address in any of these domains can be added to the group."
msgstr ""
@@ -23715,9 +24028,6 @@ msgstr "Posedanto"
msgid "Package Registry"
msgstr ""
-msgid "Package Registry Rate Limits"
-msgstr ""
-
msgid "Package Registry: authenticated API requests"
msgstr ""
@@ -23736,6 +24046,9 @@ msgstr ""
msgid "Package recipe already exists"
msgstr ""
+msgid "Package registry rate limits"
+msgstr ""
+
msgid "Package type"
msgstr ""
@@ -23802,6 +24115,9 @@ msgstr ""
msgid "PackageRegistry|Composer"
msgstr ""
+msgid "PackageRegistry|Composer.json with license: %{license} and version: %{version}"
+msgstr ""
+
msgid "PackageRegistry|Conan"
msgstr ""
@@ -23865,6 +24181,9 @@ msgstr ""
msgid "PackageRegistry|Copy require package include"
msgstr ""
+msgid "PackageRegistry|Copy target SHA"
+msgstr ""
+
msgid "PackageRegistry|Copy yarn command"
msgstr ""
@@ -23931,6 +24250,9 @@ msgstr ""
msgid "PackageRegistry|Install package version"
msgstr ""
+msgid "PackageRegistry|Instance-level"
+msgstr ""
+
msgid "PackageRegistry|Invalid Package: failed metadata extraction"
msgstr ""
@@ -23976,6 +24298,9 @@ msgstr ""
msgid "PackageRegistry|Pip Command"
msgstr ""
+msgid "PackageRegistry|Project-level"
+msgstr ""
+
msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
msgstr ""
@@ -23997,6 +24322,9 @@ msgstr ""
msgid "PackageRegistry|Remove package"
msgstr ""
+msgid "PackageRegistry|Required Python: %{pythonVersion}"
+msgstr ""
+
msgid "PackageRegistry|RubyGems"
msgstr ""
@@ -24039,6 +24367,9 @@ msgstr ""
msgid "PackageRegistry|Source project located at %{link}"
msgstr ""
+msgid "PackageRegistry|Target SHA: %{sha}"
+msgstr ""
+
msgid "PackageRegistry|There are no other versions of this package."
msgstr ""
@@ -24207,6 +24538,18 @@ msgstr ""
msgid "Password was successfully updated. Please sign in again."
msgstr ""
+msgid "PasswordPrompt|Confirm password"
+msgstr ""
+
+msgid "PasswordPrompt|Confirm password to continue"
+msgstr ""
+
+msgid "PasswordPrompt|Password is required"
+msgstr ""
+
+msgid "PasswordPrompt|Please enter your password to confirm"
+msgstr ""
+
msgid "Passwords should be unique and not used for any other sites or services."
msgstr ""
@@ -24234,6 +24577,9 @@ msgstr ""
msgid "Paste project path (i.e. gitlab-org/gitlab)"
msgstr ""
+msgid "Paste this DSN into your Sentry SDK"
+msgstr ""
+
msgid "Paste your public SSH key, which is usually contained in the file '~/.ssh/id_ed25519.pub' or '~/.ssh/id_rsa.pub' and begins with 'ssh-ed25519' or 'ssh-rsa'. Do not paste your private SSH key, as that can compromise your identity."
msgstr ""
@@ -24318,6 +24664,9 @@ msgstr ""
msgid "PerformanceBar|First Contentful Paint"
msgstr ""
+msgid "PerformanceBar|Flamegraph with mode:"
+msgstr ""
+
msgid "PerformanceBar|Frontend resources"
msgstr ""
@@ -24351,6 +24700,15 @@ msgstr ""
msgid "PerformanceBar|Trace"
msgstr ""
+msgid "PerformanceBar|cpu"
+msgstr ""
+
+msgid "PerformanceBar|object"
+msgstr ""
+
+msgid "PerformanceBar|wall"
+msgstr ""
+
msgid "Period in seconds"
msgstr ""
@@ -24579,6 +24937,48 @@ msgstr "Celo"
msgid "PipelineSchedules|Variables"
msgstr "Variabloj"
+msgid "PipelineSource|API"
+msgstr ""
+
+msgid "PipelineSource|Chat"
+msgstr ""
+
+msgid "PipelineSource|External"
+msgstr ""
+
+msgid "PipelineSource|External Pull Request"
+msgstr ""
+
+msgid "PipelineSource|Merge Request"
+msgstr ""
+
+msgid "PipelineSource|On-Demand DAST Scan"
+msgstr ""
+
+msgid "PipelineSource|On-Demand DAST Validation"
+msgstr ""
+
+msgid "PipelineSource|Parent Pipeline"
+msgstr ""
+
+msgid "PipelineSource|Pipeline"
+msgstr ""
+
+msgid "PipelineSource|Push"
+msgstr ""
+
+msgid "PipelineSource|Schedule"
+msgstr ""
+
+msgid "PipelineSource|Trigger"
+msgstr ""
+
+msgid "PipelineSource|Web"
+msgstr ""
+
+msgid "PipelineSource|Web IDE"
+msgstr ""
+
msgid "PipelineStatusTooltip|Pipeline: %{ciStatus}"
msgstr ""
@@ -24879,46 +25279,7 @@ msgstr ""
msgid "Pipeline|Source"
msgstr ""
-msgid "Pipeline|Source|API"
-msgstr ""
-
-msgid "Pipeline|Source|Chat"
-msgstr ""
-
-msgid "Pipeline|Source|External"
-msgstr ""
-
-msgid "Pipeline|Source|External Pull Request"
-msgstr ""
-
-msgid "Pipeline|Source|Merge Request"
-msgstr ""
-
-msgid "Pipeline|Source|On-Demand DAST Scan"
-msgstr ""
-
-msgid "Pipeline|Source|On-Demand DAST Validation"
-msgstr ""
-
-msgid "Pipeline|Source|Parent Pipeline"
-msgstr ""
-
-msgid "Pipeline|Source|Pipeline"
-msgstr ""
-
-msgid "Pipeline|Source|Push"
-msgstr ""
-
-msgid "Pipeline|Source|Schedule"
-msgstr ""
-
-msgid "Pipeline|Source|Trigger"
-msgstr ""
-
-msgid "Pipeline|Source|Web"
-msgstr ""
-
-msgid "Pipeline|Source|Web IDE"
+msgid "Pipeline|Source|Security Policy"
msgstr ""
msgid "Pipeline|Specify variable values to be used in this run. The values specified in %{linkStart}CI/CD settings%{linkEnd} will be used by default."
@@ -24969,7 +25330,7 @@ msgstr ""
msgid "Pipeline|We are currently unable to fetch pipeline data"
msgstr ""
-msgid "Pipeline|You’re about to stop pipeline %{pipelineId}."
+msgid "Pipeline|You’re about to stop pipeline #%{pipelineId}."
msgstr ""
msgid "Pipeline|for"
@@ -24996,6 +25357,9 @@ msgstr ""
msgid "Plain diff"
msgstr ""
+msgid "Plain-text response to send to clients that hit a rate limit"
+msgstr ""
+
msgid "Plan:"
msgstr ""
@@ -25140,9 +25504,6 @@ msgstr ""
msgid "Please provide attributes to update"
msgstr ""
-msgid "Please provide your username or email address."
-msgstr ""
-
msgid "Please reach out if you have any questions and we'll be happy to assist."
msgstr ""
@@ -25185,9 +25546,6 @@ msgstr ""
msgid "Please set a new password before proceeding."
msgstr ""
-msgid "Please share your feedback about %{featureName} %{linkStart}in this issue%{linkEnd} to help us improve the experience."
-msgstr ""
-
msgid "Please solve the captcha"
msgstr ""
@@ -25365,6 +25723,9 @@ msgstr ""
msgid "Prevent adding new members to project membership within this group"
msgstr ""
+msgid "Prevent auto-stopping"
+msgstr ""
+
msgid "Prevent editing approval rules in projects and merge requests."
msgstr ""
@@ -25377,7 +25738,7 @@ msgstr ""
msgid "Prevent users from changing their profile name"
msgstr ""
-msgid "Prevent users from performing write operations on GitLab while performing maintenance."
+msgid "Prevent users from performing write operations while GitLab maintenance is in progress."
msgstr ""
msgid "Preview"
@@ -25650,6 +26011,9 @@ msgstr ""
msgid "Profiles|Enter your name, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Enter your password to confirm the email change"
+msgstr ""
+
msgid "Profiles|Enter your pronouns to let people know how to refer to you"
msgstr ""
@@ -25884,10 +26248,10 @@ msgstr ""
msgid "Profiles|e.g. My MacBook key"
msgstr ""
-msgid "Profiles|username"
+msgid "Profiles|https://website.com"
msgstr ""
-msgid "Profiles|website.com"
+msgid "Profiles|username"
msgstr ""
msgid "Profiles|your account"
@@ -26130,9 +26494,21 @@ msgstr ""
msgid "ProjectSelect| or group"
msgstr ""
+msgid "ProjectSelect|No matching results"
+msgstr ""
+
msgid "ProjectSelect|Search for project"
msgstr ""
+msgid "ProjectSelect|Search projects"
+msgstr ""
+
+msgid "ProjectSelect|Select a project"
+msgstr ""
+
+msgid "ProjectSelect|There was an error fetching the projects. Please try again."
+msgstr ""
+
msgid "ProjectService|Drone server URL"
msgstr ""
@@ -26220,6 +26596,9 @@ msgstr ""
msgid "ProjectService|Trigger event when a new, unique alert is recorded."
msgstr ""
+msgid "ProjectService|Trigger event when a new, unique vulnerability is recorded. (Note: This feature requires an Ultimate plan.)"
+msgstr ""
+
msgid "ProjectService|Trigger event when a pipeline status changes."
msgstr ""
@@ -26634,9 +27013,15 @@ msgstr ""
msgid "Projects are graded based on the highest severity vulnerability present"
msgstr ""
+msgid "Projects are organized into groups"
+msgstr ""
+
msgid "Projects contributed to"
msgstr ""
+msgid "Projects help you organize your work. They contain your file repository, issues, merge requests, and so much more."
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr ""
@@ -26871,10 +27256,10 @@ msgstr ""
msgid "PrometheusService|Prometheus cluster integration"
msgstr ""
-msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
+msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
msgstr ""
-msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
+msgid "PrometheusService|The ID of the IAP-secured resource."
msgstr ""
msgid "PrometheusService|The Prometheus API base URL."
@@ -27492,6 +27877,9 @@ msgstr ""
msgid "Rate limit"
msgstr ""
+msgid "Rate limits can help reduce request volume (like from crawlers or abusive bots)."
+msgstr ""
+
msgid "Raw blob request rate limit per minute"
msgstr ""
@@ -27504,6 +27892,9 @@ msgstr ""
msgid "Re-authentication required"
msgstr ""
+msgid "Re-import"
+msgstr ""
+
msgid "Re-request review"
msgstr ""
@@ -27525,6 +27916,9 @@ msgstr ""
msgid "Read more about related issues"
msgstr ""
+msgid "Read their documentation."
+msgstr ""
+
msgid "Ready to get started with GitLab? Follow these steps to set up your workspace, plan and commit changes, and deploy your project."
msgstr ""
@@ -27558,6 +27952,9 @@ msgstr ""
msgid "Receive any notifications from GitLab."
msgstr ""
+msgid "Receive notification of abuse reports by email."
+msgstr ""
+
msgid "Receive notifications about your own activity"
msgstr ""
@@ -27701,9 +28098,6 @@ msgstr ""
msgid "Registry setup"
msgstr ""
-msgid "Regulate approvals by authors/committers. Affects all projects."
-msgstr ""
-
msgid "Reindexing Status: %{status} (Slice multiplier: %{multiplier}, Maximum running slices: %{max_slices})"
msgstr ""
@@ -27799,6 +28193,9 @@ msgstr ""
msgid "Release|Something went wrong while saving the release details."
msgstr ""
+msgid "Reload page"
+msgstr ""
+
msgid "Remediations"
msgstr ""
@@ -28081,6 +28478,9 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
+msgid "Repeats"
+msgstr ""
+
msgid "Replace"
msgstr ""
@@ -28443,10 +28843,7 @@ msgstr ""
msgid "Require additional authentication for administrative tasks."
msgstr ""
-msgid "Require all users in this group to setup Two-factor authentication"
-msgstr ""
-
-msgid "Require all users in this group to setup two-factor authentication"
+msgid "Require all users in this group to set up two-factor authentication"
msgstr ""
msgid "Required approvals (%{approvals_given} given)"
@@ -28492,6 +28889,9 @@ msgstr[1] ""
msgid "Requires values to meet regular expression requirements."
msgstr ""
+msgid "Requires you to deploy or set up cloud-hosted Sentry."
+msgstr ""
+
msgid "Requires your primary GitLab email address."
msgstr ""
@@ -28552,9 +28952,6 @@ msgstr ""
msgid "Resolve"
msgstr ""
-msgid "Resolve all threads in new issue"
-msgstr ""
-
msgid "Resolve conflicts"
msgstr ""
@@ -28612,6 +29009,9 @@ msgstr ""
msgid "Response text"
msgstr ""
+msgid "Restart GitLab to apply changes."
+msgstr ""
+
msgid "Restart Terminal"
msgstr ""
@@ -28630,6 +29030,9 @@ msgstr ""
msgid "Restoring the project will prevent the project from being removed on this date and restore people's ability to make changes to it."
msgstr ""
+msgid "Restrict group access by IP address. %{link_start}Learn more%{link_end}."
+msgstr ""
+
msgid "Restrict membership by email domain"
msgstr ""
@@ -28943,6 +29346,9 @@ msgstr ""
msgid "Runners|Runner #%{runner_id}"
msgstr ""
+msgid "Runners|Runner assigned to project."
+msgstr ""
+
msgid "Runners|Runner is offline, last contact was %{runner_contact} ago"
msgstr ""
@@ -28955,6 +29361,9 @@ msgstr ""
msgid "Runners|Runner registration"
msgstr ""
+msgid "Runners|Runner unassigned from project."
+msgstr ""
+
msgid "Runners|Runners"
msgstr ""
@@ -29147,7 +29556,7 @@ msgstr ""
msgid "SastEntryPoints|How do I set up SAST?"
msgstr ""
-msgid "SastEntryPoints|Learn more."
+msgid "SastEntryPoints|Learn more"
msgstr ""
msgid "Satisfied"
@@ -29189,7 +29598,7 @@ msgstr ""
msgid "Save pipeline schedule"
msgstr "Konservi ĉenstablan planon"
-msgid "Save space and find images in the container Registry. remove unneeded tags and keep only the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
+msgid "Save storage space by automatically deleting tags from the container registry and keeping the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
msgstr ""
msgid "Saving"
@@ -29363,6 +29772,9 @@ msgstr ""
msgid "Search or filter results…"
msgstr ""
+msgid "Search or jump to..."
+msgstr ""
+
msgid "Search project"
msgstr ""
@@ -29423,16 +29835,16 @@ msgstr ""
msgid "SearchCodeResults|of %{link_to_project}"
msgstr ""
-msgid "SearchResults|Showing %{count} %{scope} for%{term_element}"
+msgid "SearchResults|Showing %{count} %{scope} for %{term_element}"
msgstr ""
-msgid "SearchResults|Showing %{count} %{scope} for%{term_element} in your personal and project snippets"
+msgid "SearchResults|Showing %{count} %{scope} for %{term_element} in your personal and project snippets"
msgstr ""
-msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for%{term_element}"
+msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for %{term_element}"
msgstr ""
-msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for%{term_element} in your personal and project snippets"
+msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for %{term_element} in your personal and project snippets"
msgstr ""
msgid "SearchResults|code result"
@@ -29514,6 +29926,9 @@ msgstr ""
msgid "Secret Detection"
msgstr ""
+msgid "Secret access key"
+msgstr ""
+
msgid "Secret token"
msgstr ""
@@ -29553,9 +29968,6 @@ msgstr ""
msgid "SecurityApprovals|A merge request approval is required when the license compliance report contains a denied license."
msgstr ""
-msgid "SecurityApprovals|Configurable if security scanners are enabled. %{linkStart}Learn more.%{linkEnd}"
-msgstr ""
-
msgid "SecurityApprovals|Coverage-Check"
msgstr ""
@@ -29568,24 +29980,18 @@ msgstr ""
msgid "SecurityApprovals|Learn more about Vulnerability-Check"
msgstr ""
-msgid "SecurityApprovals|License Scanning must be enabled. %{linkStart}Learn more%{linkEnd}."
-msgstr ""
-
msgid "SecurityApprovals|License-Check"
msgstr ""
msgid "SecurityApprovals|Requires approval for Denied licenses. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}More information%{linkEnd}"
+msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "SecurityApprovals|Requires approval for vulnerabilities. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
-msgid "SecurityApprovals|Test coverage must be enabled. %{linkStart}Learn more%{linkEnd}."
-msgstr ""
-
msgid "SecurityApprovals|Vulnerability-Check"
msgstr ""
@@ -29649,6 +30055,12 @@ msgstr ""
msgid "SecurityConfiguration|Immediately begin risk analysis and remediation with application security features. Start with SAST and Secret Detection, available to all plans. Upgrade to Ultimate to get all features, including:"
msgstr ""
+msgid "SecurityConfiguration|Manage corpus"
+msgstr ""
+
+msgid "SecurityConfiguration|Manage corpus files used as mutation sources in coverage fuzzing."
+msgstr ""
+
msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
msgstr ""
@@ -29703,6 +30115,12 @@ msgstr ""
msgid "SecurityOrchestration|Action"
msgstr ""
+msgid "SecurityOrchestration|Actions"
+msgstr ""
+
+msgid "SecurityOrchestration|Add rule"
+msgstr ""
+
msgid "SecurityOrchestration|All policies"
msgstr ""
@@ -29736,9 +30154,6 @@ msgstr ""
msgid "SecurityOrchestration|Network"
msgstr ""
-msgid "SecurityOrchestration|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
-msgstr ""
-
msgid "SecurityOrchestration|New policy"
msgstr ""
@@ -29754,6 +30169,9 @@ msgstr ""
msgid "SecurityOrchestration|Policy editor"
msgstr ""
+msgid "SecurityOrchestration|Policy preview"
+msgstr ""
+
msgid "SecurityOrchestration|Policy status"
msgstr ""
@@ -29763,6 +30181,9 @@ msgstr ""
msgid "SecurityOrchestration|Rule"
msgstr ""
+msgid "SecurityOrchestration|Rules"
+msgstr ""
+
msgid "SecurityOrchestration|Scan Execution"
msgstr ""
@@ -29856,6 +30277,9 @@ msgstr ""
msgid "SecurityReports|Create issue"
msgstr ""
+msgid "SecurityReports|Development vulnerabilities"
+msgstr ""
+
msgid "SecurityReports|Dismiss vulnerability"
msgstr ""
@@ -29871,6 +30295,9 @@ msgstr ""
msgid "SecurityReports|Download results"
msgstr ""
+msgid "SecurityReports|Download scanned URLs"
+msgstr ""
+
msgid "SecurityReports|Download scanned resources"
msgstr ""
@@ -29994,6 +30421,9 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
+msgid "SecurityReports|The Vulnerability Report shows the results of the lastest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "SecurityReports|The security reports below contain one or more vulnerability findings that could not be parsed and were not recorded. Download the artifacts in the job output to investigate. Ensure any security report created conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
msgstr ""
@@ -30135,10 +30565,10 @@ msgstr ""
msgid "Select a repository"
msgstr ""
-msgid "Select a role"
+msgid "Select a repository containing templates for common files."
msgstr ""
-msgid "Select a shared template repository for all projects on this instance."
+msgid "Select a role"
msgstr ""
msgid "Select a template repository"
@@ -30216,6 +30646,9 @@ msgstr ""
msgid "Select project to choose zone"
msgstr ""
+msgid "Select project to create issue"
+msgstr ""
+
msgid "Select projects"
msgstr ""
@@ -30333,6 +30766,9 @@ msgstr ""
msgid "Send emails to help guide new users through the onboarding process."
msgstr ""
+msgid "Send emails to users upon account deactivation."
+msgstr ""
+
msgid "Send message"
msgstr ""
@@ -30351,6 +30787,9 @@ msgstr ""
msgid "Send service data"
msgstr ""
+msgid "Sentry"
+msgstr ""
+
msgid "Sentry API URL"
msgstr ""
@@ -30465,6 +30904,9 @@ msgstr ""
msgid "Service"
msgstr ""
+msgid "Service Accounts keys are required to authorize GitLab to deploy your Google Cloud project."
+msgstr ""
+
msgid "Service Desk"
msgstr ""
@@ -30537,15 +30979,15 @@ msgstr ""
msgid "Set a password on your account to pull or push via %{protocol}."
msgstr "Kreu pasvorton por via konto por ebligi al vi eltiri kaj alpuÅi per %{protocol}."
-msgid "Set a template repository for projects in this group"
-msgstr ""
-
msgid "Set access permissions for this token."
msgstr ""
msgid "Set an instance-wide domain that will be available to all clusters when installing Knative."
msgstr ""
+msgid "Set any rate limit to %{code_open}0%{code_close} to disable the limit."
+msgstr ""
+
msgid "Set default and restrict visibility levels. Configure import sources and git access protocol."
msgstr ""
@@ -30558,7 +31000,7 @@ msgstr ""
msgid "Set limit to 0 to allow any file size."
msgstr ""
-msgid "Set max session time for web terminal."
+msgid "Set limits for web and API requests."
msgstr ""
msgid "Set milestone"
@@ -30567,15 +31009,18 @@ msgstr ""
msgid "Set new password"
msgstr ""
-msgid "Set notification email for abuse reports."
+msgid "Set parent epic to an epic"
msgstr ""
-msgid "Set parent epic to an epic"
+msgid "Set per-user rate limits for imports and exports of projects and groups."
msgstr ""
msgid "Set projects and maximum size limits, session duration, user options, and check feature availability for namespace plan."
msgstr ""
+msgid "Set rate limits for package registry API requests that supersede the general user and IP rate limits."
+msgstr ""
+
msgid "Set severity"
msgstr ""
@@ -30594,15 +31039,24 @@ msgstr ""
msgid "Set the default branch for this project. All merge requests and commits are made against this branch unless you specify a different one."
msgstr ""
+msgid "Set the default expiration time for job artifacts in all projects. Set to %{code_open}0%{code_close} to never expire artifacts by default. If no unit is written, it defaults to seconds. For example, these are all equivalent: %{code_open}3600%{code_close}, %{code_open}60 minutes%{code_close}, or %{code_open}one hour%{code_close}."
+msgstr ""
+
msgid "Set the due date to %{due_date}."
msgstr ""
msgid "Set the iteration to %{iteration_reference}."
msgstr ""
+msgid "Set the maximum session time for a web terminal."
+msgstr ""
+
msgid "Set the milestone to %{milestone_reference}."
msgstr ""
+msgid "Set the per-user rate limit for notes created by web or API requests."
+msgstr ""
+
msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
msgstr ""
@@ -30804,6 +31258,9 @@ msgstr ""
msgid "Show Pipeline IID"
msgstr ""
+msgid "Show all %{issuable_type}."
+msgstr ""
+
msgid "Show all activity"
msgstr ""
@@ -30855,15 +31312,9 @@ msgstr ""
msgid "Show list"
msgstr ""
-msgid "Show me advanced features"
-msgstr ""
-
msgid "Show me how to add a pipeline"
msgstr ""
-msgid "Show me the basics"
-msgstr ""
-
msgid "Show one file at a time"
msgstr ""
@@ -30904,15 +31355,15 @@ msgstr ""
msgid "Showing %{pageSize} of %{total} %{issuableType}"
msgstr ""
-msgid "Showing %{pageSize} of %{total} issues"
-msgstr ""
-
msgid "Showing all epics"
msgstr ""
msgid "Showing all issues"
msgstr ""
+msgid "Showing data for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
+msgstr ""
+
msgid "Showing data for workflow items created in this date range. Date range cannot exceed %{maxDateRange} days."
msgstr ""
@@ -30952,6 +31403,15 @@ msgstr ""
msgid "Sidebar|Weight"
msgstr ""
+msgid "Sidekiq job compression threshold (bytes)"
+msgstr ""
+
+msgid "Sidekiq job size limit (bytes)"
+msgstr ""
+
+msgid "Sidekiq job size limits"
+msgstr ""
+
msgid "Sign in"
msgstr ""
@@ -31072,6 +31532,9 @@ msgstr ""
msgid "Site profile not found for given parameters"
msgstr ""
+msgid "Sites"
+msgstr ""
+
msgid "Size"
msgstr ""
@@ -31102,19 +31565,22 @@ msgstr ""
msgid "SlackIntegration|Sends notifications about project events to Slack channels."
msgstr ""
-msgid "SlackService|2. Paste the %{strong_open}Token%{strong_close} into the field below"
+msgid "SlackService|1. %{slash_command_link_start}Add a slash command%{slash_command_link_end} in your Slack team using this information:"
msgstr ""
-msgid "SlackService|3. Select the %{strong_open}Active%{strong_close} checkbox, press %{strong_open}Save changes%{strong_close} and start using GitLab inside Slack!"
+msgid "SlackService|2. Paste the token from Slack in the %{strong_open}Token%{strong_close} field below."
msgstr ""
-msgid "SlackService|Fill in the word that works best for your team."
+msgid "SlackService|3. Select the %{strong_open}Active%{strong_close} checkbox, select %{strong_open}Save changes%{strong_close}, and start using slash commands in Slack!"
+msgstr ""
+
+msgid "SlackService|After setup, get a list of available Slack slash commands by entering"
msgstr ""
-msgid "SlackService|See list of available commands in Slack after setting up this service, by entering"
+msgid "SlackService|Fill in the word that works best for your team."
msgstr ""
-msgid "SlackService|This service allows users to perform common operations on this project by entering slash commands in Slack."
+msgid "SlackService|Perform common operations in this project by entering slash commands in Slack."
msgstr ""
msgid "Slice multiplier"
@@ -31180,7 +31646,7 @@ msgstr ""
msgid "Some child epics may be hidden due to applied filters"
msgstr ""
-msgid "Some common domains are not allowed. %{read_more_link}."
+msgid "Some common domains are not allowed. %{learn_more_link}."
msgstr ""
msgid "Some of the designs you tried uploading did not change:"
@@ -31264,9 +31730,6 @@ msgstr ""
msgid "Something went wrong while exporting requirements"
msgstr ""
-msgid "Something went wrong while fetching %{listType} list"
-msgstr ""
-
msgid "Something went wrong while fetching branches"
msgstr ""
@@ -31321,15 +31784,9 @@ msgstr ""
msgid "Something went wrong while merging this merge request. Please try again."
msgstr ""
-msgid "Something went wrong while moving issues."
-msgstr ""
-
msgid "Something went wrong while obtaining the Let's Encrypt certificate."
msgstr ""
-msgid "Something went wrong while performing the action."
-msgstr ""
-
msgid "Something went wrong while promoting the issue to an epic. Please try again."
msgstr ""
@@ -31657,7 +32114,10 @@ msgstr ""
msgid "SourcegraphPreferences|Uses a custom %{linkStart}Sourcegraph instance%{linkEnd}."
msgstr ""
-msgid "Spam Check API Key"
+msgid "Spam Check"
+msgstr ""
+
+msgid "Spam Check API key"
msgstr ""
msgid "Spam Logs"
@@ -31675,7 +32135,7 @@ msgstr ""
msgid "Specified URL cannot be used: \"%{reason}\""
msgstr ""
-msgid "Specify an e-mail address regex pattern to identify default internal users."
+msgid "Specify an email address regex pattern to identify default internal users."
msgstr ""
msgid "Speed up your pipelines with Needs relationships"
@@ -31930,7 +32390,7 @@ msgstr ""
msgid "StatusCheck|An error occurred fetching the status checks."
msgstr ""
-msgid "StatusCheck|Apply this status check to any branch or a specific protected branch."
+msgid "StatusCheck|Apply this status check to all branches or a specific protected branch."
msgstr ""
msgid "StatusCheck|Check for a status response in Merge Requests. Failures do not block merges. %{link_start}Learn more%{link_end}."
@@ -32269,6 +32729,9 @@ msgstr ""
msgid "Subscriptions"
msgstr ""
+msgid "Subscription|Your subscription for %{strong}%{namespace_name}%{strong_close} has expired and you are now on %{pricing_link_start}the GitLab Free tier%{pricing_link_end}. Don't worry, your data is safe. Get in touch with our support team (%{support_email}). They'll gladly help with your subscription renewal."
+msgstr ""
+
msgid "Subtracted"
msgstr ""
@@ -32497,6 +32960,9 @@ msgstr ""
msgid "SuperSonics|Plan"
msgstr ""
+msgid "SuperSonics|Please agree to the Subscription Agreement"
+msgstr ""
+
msgid "SuperSonics|Ready to get started? A GitLab plan is ideal for scaling organizations and for multi team usage."
msgstr ""
@@ -32527,6 +32993,9 @@ msgstr ""
msgid "SuperSonics|The activation code is not valid. Please make sure to copy it exactly from the Customers Portal or confirmation email. Learn more about %{linkStart}activating your subscription%{linkEnd}."
msgstr ""
+msgid "SuperSonics|The activation code should be a 24-character alphanumeric string"
+msgstr ""
+
msgid "SuperSonics|There is a connectivity issue."
msgstr ""
@@ -32569,9 +33038,15 @@ msgstr ""
msgid "SuperSonics|You do not have an active subscription"
msgstr ""
+msgid "SuperSonics|You have successfully added a license that activates on %{date}. Please see the subscription history table below for more details."
+msgstr ""
+
msgid "SuperSonics|You'll be charged for %{trueUpLinkStart}users over license%{trueUpLinkEnd} on a quarterly or annual basis, depending on the terms of your agreement."
msgstr ""
+msgid "SuperSonics|Your future dated license was successfully added"
+msgstr ""
+
msgid "SuperSonics|Your subscription"
msgstr ""
@@ -32824,7 +33299,7 @@ msgstr ""
msgid "Template to append to all Service Desk issues"
msgstr ""
-msgid "TemplateRepository|Select a repository to make its templates available to all projects. %{link_start}What should the repository contain?%{link_end} "
+msgid "TemplateRepository|Create common files more quickly, and standardize their format."
msgstr ""
msgid "Templates"
@@ -33030,7 +33505,7 @@ msgstr ""
msgid "TestCases|Search test cases"
msgstr ""
-msgid "TestCases|Something went wrong while adding test case to Todo."
+msgid "TestCases|Something went wrong while adding test case to a to-do item."
msgstr ""
msgid "TestCases|Something went wrong while creating a test case."
@@ -33042,7 +33517,7 @@ msgstr ""
msgid "TestCases|Something went wrong while fetching test cases list."
msgstr ""
-msgid "TestCases|Something went wrong while marking test case todo as done."
+msgid "TestCases|Something went wrong while marking test case to-do item as done."
msgstr ""
msgid "TestCases|Something went wrong while moving test case."
@@ -33162,7 +33637,7 @@ msgstr ""
msgid "Thanks for your purchase!"
msgstr ""
-msgid "That is ok, I do not want to renew"
+msgid "That's OK, I don't want to renew"
msgstr ""
msgid "That's it, well done!"
@@ -33185,7 +33660,7 @@ msgid_plural "The %{type} contains the following errors:"
msgstr[0] ""
msgstr[1] ""
-msgid "The API key used by GitLab for accessing the Spam Check service endpoint"
+msgid "The API key used by GitLab for accessing the Spam Check service endpoint."
msgstr ""
msgid "The GitLab subscription service (customers.gitlab.com) is currently experiencing an outage. You can monitor the status and get updates at %{linkStart}status.gitlab.com%{linkEnd}."
@@ -33224,9 +33699,6 @@ msgstr ""
msgid "The URL to use for connecting to Elasticsearch. Use a comma-separated list to support clustering (e.g., \"http://localhost:9200, http://localhost:9201\")."
msgstr ""
-msgid "The Vulnerability Report shows the results of the last successful pipeline run on the default branch."
-msgstr ""
-
msgid "The X509 Certificate to use when mutual TLS is required to communicate with the external authorization service. If left blank, the server certificate is still validated when accessing over HTTPS."
msgstr ""
@@ -33284,9 +33756,6 @@ msgstr ""
msgid "The default branch for this project has been changed. Please update your bookmarks."
msgstr ""
-msgid "The default expiration time for job artifacts. 0 for unlimited. The default unit is in seconds, but you can use other units, for example %{code_open}4 mins 2 sec%{code_close}, %{code_open}2h42min%{code_close}."
-msgstr ""
-
msgid "The dependency list details information about the components used within your project."
msgstr ""
@@ -33478,9 +33947,6 @@ msgstr ""
msgid "The merge conflicts for this merge request have already been resolved. Please return to the merge request."
msgstr ""
-msgid "The merge request can now be merged."
-msgstr ""
-
msgid "The metric must be one of %{metrics}."
msgstr ""
@@ -33856,7 +34322,7 @@ msgstr ""
msgid "There was a problem updating the keep latest artifacts setting."
msgstr ""
-msgid "There was an error %{message} todo."
+msgid "There was an error %{message} to-do item."
msgstr ""
msgid "There was an error adding a To Do."
@@ -33895,6 +34361,9 @@ msgstr ""
msgid "There was an error fetching projects"
msgstr ""
+msgid "There was an error fetching search autocomplete suggestions"
+msgstr ""
+
msgid "There was an error fetching stage total counts"
msgstr ""
@@ -34219,6 +34688,9 @@ msgstr ""
msgid "This field is required."
msgstr ""
+msgid "This form is disabled in preview"
+msgstr ""
+
msgid "This group"
msgstr ""
@@ -34240,9 +34712,6 @@ msgstr ""
msgid "This group is linked to a subscription"
msgstr ""
-msgid "This group, including all subgroups, projects and git repositories, will be reachable from only the specified IP address ranges."
-msgstr ""
-
msgid "This group, its subgroups and projects has been scheduled for removal on %{date}."
msgstr ""
@@ -34522,9 +34991,6 @@ msgstr ""
msgid "This user cannot be unlocked manually from GitLab"
msgstr ""
-msgid "This user does not have a pending request"
-msgstr ""
-
msgid "This user has an unconfirmed email address (%{email}). You may force a confirmation."
msgstr ""
@@ -34633,9 +35099,6 @@ msgstr ""
msgid "ThreatMonitoring|Packet Activity"
msgstr ""
-msgid "ThreatMonitoring|Policies"
-msgstr ""
-
msgid "ThreatMonitoring|Requests"
msgstr ""
@@ -34687,6 +35150,12 @@ msgstr ""
msgid "ThreatMonitoring|View documentation"
msgstr ""
+msgid "Threshold in bytes at which to compress Sidekiq job arguments."
+msgstr ""
+
+msgid "Threshold in bytes at which to reject Sidekiq jobs. Set this to 0 to if you don't want to limit Sidekiq jobs."
+msgstr ""
+
msgid "Throughput"
msgstr ""
@@ -34696,6 +35165,9 @@ msgstr ""
msgid "Time"
msgstr ""
+msgid "Time (in hours) that users are allowed to skip forced configuration of two-factor authentication."
+msgstr ""
+
msgid "Time Spent"
msgstr ""
@@ -34762,7 +35234,7 @@ msgstr ""
msgid "TimeTrackingEstimated|Est"
msgstr ""
-msgid "TimeTracking|%{startTag}Spent: %{endTag}%{timeSpentHumanReadable}"
+msgid "TimeTracking|%{spentStart}Spent: %{spentEnd}"
msgstr ""
msgid "TimeTracking|Estimated:"
@@ -34976,6 +35448,9 @@ msgstr ""
msgid "To access this domain create a new DNS record"
msgstr ""
+msgid "To add a custom suffix, set up a Service Desk email address. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "To add an SSH key you need to %{generate_link_start}generate one%{link_end} or use an %{existing_link_start}existing key%{link_end}."
msgstr ""
@@ -34997,13 +35472,16 @@ msgstr ""
msgid "To connect an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To continue using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
+msgstr ""
+
msgid "To continue, you need to select the link in the confirmation email we sent to verify your email address. If you didn't get our email, select %{strongStart}Resend confirmation email.%{strongEnd}"
msgstr ""
msgid "To define internal users, first enable new users set to external"
msgstr ""
-msgid "To enable Registration Features, make sure \"Enable service ping\" is checked."
+msgid "To enable Registration Features, first enable Service Ping."
msgstr ""
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
@@ -35030,7 +35508,7 @@ msgstr ""
msgid "To get started, use the link below to confirm your account."
msgstr ""
-msgid "To help improve GitLab and its user experience, GitLab will periodically collect usage information."
+msgid "To help improve GitLab and its user experience, GitLab periodically collects usage information."
msgstr ""
msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
@@ -35063,7 +35541,7 @@ msgstr ""
msgid "To preserve performance only %{strong_open}%{display_size} of %{real_size}%{strong_close} files are displayed."
msgstr ""
-msgid "To protect this issue's confidentiality, %{forkLink} and set the fork's visibility to private."
+msgid "To protect this issue's confidentiality, %{linkStart}fork this project%{linkEnd} and set the fork's visibility to private."
msgstr ""
msgid "To protect this issue's confidentiality, a private fork of this project was selected."
@@ -35096,12 +35574,15 @@ msgstr ""
msgid "To set up SAML authentication for your group through an identity provider like Azure, Okta, Onelogin, Ping Identity, or your custom SAML 2.0 provider:"
msgstr ""
-msgid "To set up this service:"
+msgid "To set up this integration:"
msgstr ""
msgid "To specify the notification level per project of a group you belong to, you need to visit project page and change notification level there."
msgstr ""
+msgid "To start using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
+msgstr ""
+
msgid "To unsubscribe from this issue, please paste the following link into your browser:"
msgstr ""
@@ -35689,9 +36170,6 @@ msgstr ""
msgid "Unable to fetch branches list, please close the form and try again"
msgstr ""
-msgid "Unable to fetch unscanned projects"
-msgstr ""
-
msgid "Unable to fetch vulnerable projects"
msgstr ""
@@ -35746,6 +36224,15 @@ msgstr ""
msgid "Unable to update this issue at this time."
msgstr ""
+msgid "Unapprove a merge request"
+msgstr ""
+
+msgid "Unapprove the current merge request."
+msgstr ""
+
+msgid "Unapproved the current merge request."
+msgstr ""
+
msgid "Unarchive project"
msgstr ""
@@ -35758,16 +36245,13 @@ msgstr ""
msgid "Unassigned"
msgstr ""
-msgid "Unauthenticated API request rate limit"
-msgstr ""
-
-msgid "Unauthenticated rate limit period in seconds"
+msgid "Unauthenticated API rate limit period in seconds"
msgstr ""
-msgid "Unauthenticated request rate limit"
+msgid "Unauthenticated requests"
msgstr ""
-msgid "Unauthenticated requests"
+msgid "Unauthenticated web rate limit period in seconds"
msgstr ""
msgid "Undo"
@@ -35869,18 +36353,6 @@ msgstr ""
msgid "Unresolved"
msgstr ""
-msgid "UnscannedProjects|15 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|30 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|5 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|60 or more days"
-msgstr ""
-
msgid "Unschedule job"
msgstr ""
@@ -36100,6 +36572,9 @@ msgstr ""
msgid "UsageQuota|%{help_link_start}Shared runners%{help_link_end} are disabled, so there are no limits set on pipeline usage"
msgstr ""
+msgid "UsageQuota|%{linkTitle} help link"
+msgstr ""
+
msgid "UsageQuota|%{percentageLeft} of purchased storage is available"
msgstr ""
@@ -36109,6 +36584,9 @@ msgstr ""
msgid "UsageQuota|Artifacts is a sum of build and pipeline artifacts."
msgstr ""
+msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
+msgstr ""
+
msgid "UsageQuota|Buy additional minutes"
msgstr ""
@@ -36118,9 +36596,21 @@ msgstr ""
msgid "UsageQuota|CI minutes usage by project"
msgstr ""
+msgid "UsageQuota|Code packages and container images."
+msgstr ""
+
msgid "UsageQuota|Current period usage"
msgstr ""
+msgid "UsageQuota|File attachments and smaller design graphics."
+msgstr ""
+
+msgid "UsageQuota|Git repository, managed by the Gitaly service."
+msgstr ""
+
+msgid "UsageQuota|Includes project registry, artifacts, packages, wiki, uploads and other items."
+msgstr ""
+
msgid "UsageQuota|Increase storage temporarily"
msgstr ""
@@ -36139,6 +36629,9 @@ msgstr ""
msgid "UsageQuota|Packages"
msgstr ""
+msgid "UsageQuota|Pipeline artifacts and job artifacts, created with CI/CD."
+msgstr ""
+
msgid "UsageQuota|Pipelines"
msgstr ""
@@ -36157,6 +36650,9 @@ msgstr ""
msgid "UsageQuota|Seats"
msgstr ""
+msgid "UsageQuota|Shared bits of code and text."
+msgstr ""
+
msgid "UsageQuota|Snippets"
msgstr ""
@@ -36166,6 +36662,12 @@ msgstr ""
msgid "UsageQuota|Storage"
msgstr ""
+msgid "UsageQuota|Storage type"
+msgstr ""
+
+msgid "UsageQuota|There is a known issue with Artifact storage where the total could be incorrect for some projects. More details and progress are available in %{warningLinkStart}the epic%{warningLinkEnd}."
+msgstr ""
+
msgid "UsageQuota|This is the total amount of storage used across your projects within this namespace."
msgstr ""
@@ -36205,6 +36707,9 @@ msgstr ""
msgid "UsageQuota|Usage"
msgstr ""
+msgid "UsageQuota|Usage Breakdown"
+msgstr ""
+
msgid "UsageQuota|Usage Quotas"
msgstr ""
@@ -36229,6 +36734,9 @@ msgstr ""
msgid "UsageQuota|Wiki"
msgstr ""
+msgid "UsageQuota|Wiki content."
+msgstr ""
+
msgid "UsageQuota|Wikis"
msgstr ""
@@ -36445,7 +36953,10 @@ msgstr ""
msgid "User Settings"
msgstr ""
-msgid "User and IP Rate Limits"
+msgid "User and IP rate limits"
+msgstr ""
+
+msgid "User does not have a pending request"
msgstr ""
msgid "User identity was successfully created."
@@ -36742,6 +37253,9 @@ msgstr ""
msgid "Users can launch a development environment from a GitLab browser tab when the %{linkStart}Gitpod%{linkEnd} integration is enabled."
msgstr ""
+msgid "Users can reactivate their account by signing in."
+msgstr ""
+
msgid "Users can render diagrams in AsciiDoc, Markdown, reStructuredText, and Textile documents using Kroki."
msgstr ""
@@ -36757,6 +37271,9 @@ msgstr ""
msgid "Users requesting access to"
msgstr ""
+msgid "Users to exclude from the rate limit"
+msgstr ""
+
msgid "Users were successfully added."
msgstr ""
@@ -36778,6 +37295,9 @@ msgstr ""
msgid "UsersSelect|Unassigned"
msgstr ""
+msgid "Uses GitLab as a lightweight alternative to Sentry."
+msgstr ""
+
msgid "Using %{code_start}::%{code_end} denotes a %{link_start}scoped label set%{link_end}"
msgstr ""
@@ -36808,10 +37328,7 @@ msgstr ""
msgid "Value Stream Analytics can help you determine your team’s velocity"
msgstr ""
-msgid "Value Stream Analytics gives an overview of how much time it takes to go from idea to production in your project."
-msgstr ""
-
-msgid "Value may contain a variable reference"
+msgid "Value might contain a variable reference"
msgstr ""
msgid "Value stream"
@@ -36877,10 +37394,10 @@ msgstr ""
msgid "ValueStream|The Default Value Stream cannot be deleted"
msgstr ""
-msgid "Variable"
+msgid "Values that contain the %{codeStart}$%{codeEnd} character can be considered a variable reference and expanded. %{docsLinkStart}Learn more.%{docsLinkEnd}"
msgstr ""
-msgid "Variable references indicated by %{codeStart}$%{codeEnd} may be expanded. If this is not what you want, consider %{docsLinkStart}using a workaround to prevent expansion%{docsLinkEnd}."
+msgid "Variable"
msgstr ""
msgid "Variable will be masked in job logs."
@@ -37285,6 +37802,9 @@ msgstr ""
msgid "Vulnerability|Evidence"
msgstr ""
+msgid "Vulnerability|False positive detected"
+msgstr ""
+
msgid "Vulnerability|File"
msgstr ""
@@ -37327,6 +37847,9 @@ msgstr ""
msgid "Vulnerability|Status"
msgstr ""
+msgid "Vulnerability|The scanner determined this vulnerability to be a false positive. Verify the evaluation before changing its status. %{linkStart}Learn more about false positive detection.%{linkEnd}"
+msgstr ""
+
msgid "Vulnerability|The unmodified response is the original response that had no mutations done to the request"
msgstr ""
@@ -37651,9 +38174,6 @@ msgstr ""
msgid "Welcome to GitLab,%{br_tag}%{name}!"
msgstr ""
-msgid "Welcome to the guided GitLab tour"
-msgstr ""
-
msgid "Welcome, %{name}!"
msgstr ""
@@ -37672,9 +38192,6 @@ msgstr ""
msgid "What are you searching for?"
msgstr ""
-msgid "What describes you best?"
-msgstr ""
-
msgid "What does this command do?"
msgstr ""
@@ -37696,13 +38213,13 @@ msgstr ""
msgid "What is your job title? (optional)"
msgstr ""
-msgid "What will you use this group for?"
+msgid "What templates can I create?"
msgstr ""
-msgid "What's new"
+msgid "What will you use this group for?"
msgstr ""
-msgid "What’s your experience level?"
+msgid "What's new"
msgstr ""
msgid "When a deployment job is successful, skip older deployment jobs that are still pending."
@@ -37714,6 +38231,9 @@ msgstr ""
msgid "When an event in GitLab triggers a webhook, you can use the request details to figure out if something went wrong."
msgstr ""
+msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+msgstr ""
+
msgid "When inactive, an external authentication provider must be used."
msgstr ""
@@ -37737,6 +38257,9 @@ msgstr ""
msgid "When:"
msgstr ""
+msgid "Which API requests are affected?"
+msgstr ""
+
msgid "While it's rare to have no vulnerabilities, it can happen. In any event, we ask that you please double check your settings to make sure you've set up your dashboard correctly."
msgstr ""
@@ -38016,6 +38539,9 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|Work Items"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -38091,6 +38617,9 @@ msgstr ""
msgid "You are already a member of this %{member_source}."
msgstr ""
+msgid "You are already impersonating another user"
+msgstr ""
+
msgid "You are an admin, which means granting access to %{client_name} will allow them to interact with GitLab as an admin as well. Proceed with caution."
msgstr ""
@@ -38193,6 +38722,9 @@ msgstr ""
msgid "You can also use project access tokens with Git to authenticate over HTTP(S). %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "You can always change your URL later"
+msgstr ""
+
msgid "You can always edit this later"
msgstr ""
@@ -38349,10 +38881,10 @@ msgstr ""
msgid "You can’t %{tag_start}edit%{tag_end} files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
-msgid "You could not create a new trigger."
+msgid "You can’t edit files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
-msgid "You didn't renew your subscription for %{strong}%{namespace_name}%{strong_close} so it was downgraded to the free plan."
+msgid "You could not create a new trigger."
msgstr ""
msgid "You do not have any subscriptions yet"
@@ -38520,6 +39052,12 @@ msgstr ""
msgid "You must provide your current password in order to change it."
msgstr ""
+msgid "You must sign in to search for specific projects."
+msgstr ""
+
+msgid "You must sign in to search for specific terms."
+msgstr ""
+
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
@@ -38547,6 +39085,9 @@ msgstr ""
msgid "You need to upload a GitLab project export archive (ending in .gz)."
msgstr ""
+msgid "You need to verify your primary email first before enabling Two-Factor Authentication."
+msgstr ""
+
msgid "You successfully declined the invitation"
msgstr ""
@@ -38655,10 +39196,10 @@ msgstr ""
msgid "Your %{host} account was signed in to from a new location"
msgstr ""
-msgid "Your %{strong}%{plan_name}%{strong_close} subscription for %{strong}%{namespace_name}%{strong_close} will expire on %{strong}%{expires_on}%{strong_close}."
+msgid "Your %{strong}%{plan_name}%{strong_close} subscription expires on %{strong}%{expires_on}%{strong_close}. After that date, you cannot create issues or merge requests, or use many other features."
msgstr ""
-msgid "Your %{strong}%{plan_name}%{strong_close} subscription will expire on %{strong}%{expires_on}%{strong_close}. After that, you will not be able to create issues or merge requests as well as many other features."
+msgid "Your %{strong}%{plan_name}%{strong_close} subscription for %{strong}%{namespace_name}%{strong_close} will expire on %{strong}%{expires_on}%{strong_close}."
msgstr ""
msgid "Your CI/CD configuration syntax is invalid. View Lint tab for more details."
@@ -38682,7 +39223,7 @@ msgstr ""
msgid "Your GPG keys (%{count})"
msgstr ""
-msgid "Your GitLab account has been locked due to an excessive amount of unsuccessful sign in attempts. Your account will automatically unlock in %{duration} or you may click the link below to unlock now."
+msgid "Your GitLab account has been locked due to an excessive number of unsuccessful sign in attempts. You can wait for your account to automatically unlock in %{duration} or you can click the link below to unlock now."
msgstr ""
msgid "Your GitLab account request has been approved!"
@@ -38793,6 +39334,9 @@ msgstr ""
msgid "Your commit email is used for web based operations, such as edits and merges."
msgstr ""
+msgid "Your current password is required to register a two-factor authenticator app."
+msgstr ""
+
msgid "Your dashboard has been copied. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
@@ -38892,6 +39436,9 @@ msgstr ""
msgid "Your project limit is %{limit} projects! Please contact your administrator to increase it"
msgstr ""
+msgid "Your project will be created at:"
+msgstr ""
+
msgid "Your projects"
msgstr ""
@@ -38931,11 +39478,10 @@ msgstr ""
msgid "Your subscription expired!"
msgstr ""
-msgid "Your subscription has been downgraded."
-msgstr ""
-
-msgid "Your subscription will expire in %{remaining_days}."
-msgstr ""
+msgid "Your subscription will expire in %{remaining_days} day."
+msgid_plural "Your subscription will expire in %{remaining_days} days."
+msgstr[0] ""
+msgstr[1] ""
msgid "Your username is %{username}."
msgstr ""
@@ -39142,6 +39688,9 @@ msgstr ""
msgid "cannot merge"
msgstr ""
+msgid "cannot not be used for user namespace"
+msgstr ""
+
msgid "ciReport|%{degradedNum} degraded"
msgstr ""
@@ -39465,6 +40014,9 @@ msgstr ""
msgid "created %{timeAgo}"
msgstr ""
+msgid "created %{timeAgo} by %{author}"
+msgstr ""
+
msgid "created by"
msgstr ""
@@ -39509,9 +40061,6 @@ msgstr ""
msgid "does not have a supported extension. Only %{extension_list} are supported"
msgstr ""
-msgid "domain is not authorized for sign-up."
-msgstr ""
-
msgid "download it"
msgstr ""
@@ -39529,18 +40078,13 @@ msgstr ""
msgid "email '%{email}' is not a verified email."
msgstr ""
-msgid "email does not match the allowed domain of %{email_domains}"
-msgid_plural "email does not match the allowed domains: %{email_domains}"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "enabled"
msgstr ""
msgid "encrypted: needs to be a :required, :optional or :migrating!"
msgstr ""
-msgid "ending with MIME type format is not allowed."
+msgid "ending with a reserved file extension is not allowed."
msgstr ""
msgid "entries cannot be larger than 255 characters"
@@ -39564,6 +40108,9 @@ msgstr ""
msgid "estimateCommand|%{slash_command} overwrites the total estimated time."
msgstr ""
+msgid "example.com"
+msgstr ""
+
msgid "exceeds the limit of %{bytes} bytes"
msgstr ""
@@ -39614,9 +40161,6 @@ msgstr ""
msgid "fork"
msgstr ""
-msgid "fork this project"
-msgstr ""
-
msgid "from"
msgstr ""
@@ -39625,6 +40169,9 @@ msgid_plural "from %d jobs"
msgstr[0] ""
msgstr[1] ""
+msgid "frontmatter"
+msgstr ""
+
msgid "group"
msgstr ""
@@ -39652,6 +40199,9 @@ msgstr ""
msgid "has been completed."
msgstr ""
+msgid "has too deep level of nesting"
+msgstr ""
+
msgid "help"
msgstr ""
@@ -39685,9 +40235,21 @@ msgstr ""
msgid "in"
msgstr ""
+msgid "in Infrastructure :: Kubernetes clusters"
+msgstr ""
+
+msgid "in all GitLab"
+msgstr ""
+
+msgid "in group"
+msgstr ""
+
msgid "in group %{link_to_group}"
msgstr ""
+msgid "in project"
+msgstr ""
+
msgid "in project %{link_to_project}"
msgstr ""
@@ -39729,16 +40291,19 @@ msgstr ""
msgid "is not a valid X509 certificate."
msgstr ""
-msgid "is not allowed since the group is not top-level group."
+msgid "is not allowed for sign-up."
msgstr ""
-msgid "is not allowed. Try again with a different email address, or contact your GitLab admin."
+msgid "is not allowed for this group."
msgstr ""
-msgid "is not allowed. We do not currently support project-level iterations"
+msgid "is not allowed for this project."
+msgstr ""
+
+msgid "is not allowed since the group is not top-level group."
msgstr ""
-msgid "is not from an allowed domain."
+msgid "is not allowed. We do not currently support project-level iterations"
msgstr ""
msgid "is not in the group enforcing Group Managed Account"
@@ -39831,6 +40396,9 @@ msgstr ""
msgid "log in"
msgstr ""
+msgid "managed"
+msgstr ""
+
msgid "manual"
msgstr ""
@@ -39878,6 +40446,9 @@ msgstr ""
msgid "mrWidget| Please restore it or use a different %{missingBranchName} branch"
msgstr ""
+msgid "mrWidget|%{linkStart}Set up now%{linkEnd} to analyze your source code for known security vulnerabilities."
+msgstr ""
+
msgid "mrWidget|%{mergeError}."
msgstr ""
@@ -39958,6 +40529,9 @@ msgid_plural "mrWidget|Closes issues"
msgstr[0] ""
msgstr[1] ""
+msgid "mrWidget|Create issue to resolve all threads"
+msgstr ""
+
msgid "mrWidget|Delete source branch"
msgstr ""
@@ -39967,12 +40541,18 @@ msgstr ""
msgid "mrWidget|Did not close"
msgstr ""
+msgid "mrWidget|Dismiss"
+msgstr ""
+
msgid "mrWidget|Email patches"
msgstr ""
msgid "mrWidget|Failed to load deployment statistics"
msgstr ""
+msgid "mrWidget|Hide %{widget} details"
+msgstr ""
+
msgid "mrWidget|If the %{missingBranchName} branch exists in your local repository, you can merge this merge request manually using the command line"
msgstr ""
@@ -40068,9 +40648,6 @@ msgstr ""
msgid "mrWidget|Request to merge"
msgstr ""
-msgid "mrWidget|Resolve all threads in new issue"
-msgstr ""
-
msgid "mrWidget|Resolve conflicts"
msgstr ""
@@ -40086,6 +40663,9 @@ msgstr ""
msgid "mrWidget|Revoke approval"
msgstr ""
+msgid "mrWidget|SAST and Secret Detection is not enabled."
+msgstr ""
+
msgid "mrWidget|Set by %{merge_author} to be added to the merge train when the pipeline succeeds"
msgstr ""
@@ -40095,6 +40675,9 @@ msgstr ""
msgid "mrWidget|Set by %{merge_author} to start a merge train when the pipeline succeeds"
msgstr ""
+msgid "mrWidget|Show %{widget} details"
+msgstr ""
+
msgid "mrWidget|The changes were merged into"
msgstr ""
@@ -40107,6 +40690,9 @@ msgstr ""
msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure, or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
msgstr ""
+msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure."
+msgstr ""
+
msgid "mrWidget|The source branch has been deleted"
msgstr ""
@@ -40149,6 +40735,9 @@ msgstr ""
msgid "mrWidget|You can merge after removing denied licenses"
msgstr ""
+msgid "mrWidget|You can only merge once this merge request is approved."
+msgstr ""
+
msgid "mrWidget|Your password"
msgstr ""
@@ -40185,6 +40774,9 @@ msgstr ""
msgid "must be less than the limit of %{tag_limit} tags"
msgstr ""
+msgid "must be set for a project namespace"
+msgstr ""
+
msgid "must be unique by status and elapsed time within a policy"
msgstr ""
@@ -40294,6 +40886,9 @@ msgstr ""
msgid "pipeline"
msgstr ""
+msgid "pipeline schedules documentation"
+msgstr ""
+
msgid "pod_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
msgstr ""
@@ -40343,16 +40938,25 @@ msgstr ""
msgid "project name"
msgstr ""
+msgid "project namespace cannot be the parent of another namespace"
+msgstr ""
+
msgid "projects"
msgstr ""
msgid "quick actions"
msgstr ""
-msgid "reCAPTCHA Private Key"
+msgid "reCAPTCHA"
+msgstr ""
+
+msgid "reCAPTCHA helps prevent credential stuffing."
msgstr ""
-msgid "reCAPTCHA Site Key"
+msgid "reCAPTCHA private key"
+msgstr ""
+
+msgid "reCAPTCHA site key"
msgstr ""
msgid "recent activity"
@@ -40579,6 +41183,9 @@ msgstr ""
msgid "user avatar"
msgstr ""
+msgid "user namespace cannot be the parent of another namespace"
+msgstr ""
+
msgid "user preferences"
msgstr ""
@@ -40671,3 +41278,9 @@ msgstr ""
msgid "your settings"
msgstr ""
+msgid "{group}"
+msgstr ""
+
+msgid "{project}"
+msgstr ""
+
diff --git a/locale/es/gitlab.po b/locale/es/gitlab.po
index d8677107446..202ce89bff5 100644
--- a/locale/es/gitlab.po
+++ b/locale/es/gitlab.po
@@ -14,10 +14,7 @@ msgstr ""
"X-Crowdin-Language: es-ES\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-09-01 22:32\n"
-
-msgid " %{name}, confirm your email address now! "
-msgstr " %{name}, ¡confirme su dirección de correo electrónico ahora! "
+"PO-Revision-Date: 2021-10-04 20:20\n"
msgid " %{start} to %{end}"
msgstr " %{start} hasta %{end}"
@@ -92,6 +89,16 @@ msgstr "El parámetro \"el\" es necesario para createInstance()"
msgid "#general, #development"
msgstr "#general, #desarrollo"
+msgid "%d Alert"
+msgid_plural "%d Alerts"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d Alert:"
+msgid_plural "%d Alerts:"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d Approval"
msgid_plural "%d Approvals"
msgstr[0] "%d autorización"
@@ -372,8 +379,8 @@ msgstr[1] "%d etiquetas por nombre de imagen"
msgid "%d token has expired"
msgid_plural "%d tokens have expired"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d token ha expirado"
+msgstr[1] "%d tokens han expirado"
msgid "%d unassigned issue"
msgid_plural "%d unassigned issues"
@@ -455,8 +462,11 @@ msgstr ""
msgid "%{code_open}Protected:%{code_close} Only exposed to protected branches or tags."
msgstr ""
-msgid "%{commit_author_link} authored %{commit_timeago}"
-msgstr "%{commit_author_link} escribió %{commit_timeago}"
+msgid "%{commit_author_link} authored %{commit_authored_timeago}"
+msgstr ""
+
+msgid "%{commit_author_link} authored %{commit_authored_timeago} and %{commit_committer_avatar} %{commit_committer_link} committed %{commit_committer_timeago}"
+msgstr ""
msgid "%{completedCount} completed weight"
msgstr ""
@@ -523,7 +533,7 @@ msgid "%{count} related %{pluralized_subject}: %{links}"
msgstr "%{count} %{pluralized_subject} relacionados: %{links}"
msgid "%{count} selected"
-msgstr ""
+msgstr "%{count} seleccionados"
msgid "%{count} total weight"
msgstr "%{count} peso total"
@@ -549,6 +559,15 @@ msgstr ""
msgid "%{doc_link_start}Advanced search%{doc_link_end} is enabled."
msgstr ""
+msgid "%{docs_link_start}Learn about visibility levels.%{docs_link_end}"
+msgstr ""
+
+msgid "%{docs_link_start}What is Large File Storage?%{docs_link_end}"
+msgstr ""
+
+msgid "%{docs_link_start}What is two-factor authentication?%{docs_link_end}"
+msgstr ""
+
msgid "%{due_date} (Past due)"
msgstr "%{due_date} (vencido)"
@@ -621,9 +640,6 @@ msgstr "¡Va a eliminar %{issuableType}! ¿Está seguro de que desea realizar es
msgid "%{issueType} actions"
msgstr "%{issueType} acciones"
-msgid "%{issuesCount} issues with a limit of %{maxIssueCount}"
-msgstr "%{issuesCount} incidencias con un límite de %{maxIssueCount}"
-
msgid "%{issuesSize} with a limit of %{maxIssueCount}"
msgstr "%{issuesSize} con un límite de %{maxIssueCount}"
@@ -673,7 +689,7 @@ msgid "%{labelStart}Severity:%{labelEnd} %{severity}"
msgstr "%{labelStart}Gravedad:%{labelEnd} %{severity}"
msgid "%{labelStart}Tool:%{labelEnd} %{reportType}"
-msgstr ""
+msgstr "%{labelStart}Herramienta:%{labelEnd} %{reportType}"
msgid "%{labelStart}Unmodified response:%{labelEnd} %{headers}"
msgstr "%{labelStart}Respuesta sin modificar:%{labelEnd} %{headers}"
@@ -681,6 +697,12 @@ msgstr "%{labelStart}Respuesta sin modificar:%{labelEnd} %{headers}"
msgid "%{label_for_message} unavailable"
msgstr "%{label_for_message} no disponible"
+msgid "%{learn_more_link}."
+msgstr ""
+
+msgid "%{lessThan} 1 hour"
+msgstr ""
+
msgid "%{lets_encrypt_link_start}Let's Encrypt%{lets_encrypt_link_end} is a free, automated, and open certificate authority (CA) that issues digital certificates to enable HTTPS (SSL/TLS) for sites."
msgstr "%{lets_encrypt_link_start}Let's Encrypt%{lets_encrypt_link_end} es una autoridad de certificación gratuita, automatizada, y abierta que genera certificados digitales para habilitar HTTPS para sitios web."
@@ -693,15 +715,15 @@ msgstr "%{level_name} no está permitido debido a que el fork del proyecto orige
msgid "%{link_start}Learn more%{link_end} about roles."
msgstr "%{link_start}Obtener más información%{link_end} sobre los roles."
-msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
-msgstr "%{link_start}Más información%{link_end} sobre qué información se comparte con GitLab Inc."
-
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
msgstr ""
msgid "%{link_start}Start the title with %{draft_snippet}%{link_end} to prevent a merge request that is a work in progress from being merged before it's ready."
msgstr ""
+msgid "%{link_start}What information does GitLab Inc. collect?%{link_end}"
+msgstr ""
+
msgid "%{listToShow}, and %{awardsListLength} more"
msgstr "%{listToShow}, y %{awardsListLength} más"
@@ -854,7 +876,7 @@ msgid_plural "%{securityScanner} results are not available because a pipeline ha
msgstr[0] ""
msgstr[1] ""
-msgid "%{service_ping_link_start}Learn more%{service_ping_link_end} about what information is shared with GitLab Inc."
+msgid "%{service_ping_link_start}What information is shared with GitLab Inc.?%{service_ping_link_end}"
msgstr ""
msgid "%{size} %{unit}"
@@ -890,6 +912,9 @@ msgstr "%{start} hasta %{end}"
msgid "%{state} epics"
msgstr "%{state} épicas"
+msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
+msgstr ""
+
msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
msgstr ""
@@ -949,11 +974,6 @@ msgstr "%{tag}-%{evidence}-%{filename}"
msgid "%{template_project_id} is unknown or invalid"
msgstr "%{template_project_id} es desconocido o no es válido"
-msgid "%{text} %{files}"
-msgid_plural "%{text} %{files} files"
-msgstr[0] "%{text}%{files}"
-msgstr[1] "%{text}%{files} archivos"
-
msgid "%{text} is available"
msgstr "%{text} esta disponible"
@@ -1038,9 +1058,6 @@ msgstr "%{webhooks_link_start}%{webhook_type}%{link_end} le permiten enviar noti
msgid "%{wildcards_link_start}Wildcards%{wildcards_link_end} such as %{code_tag_start}v*%{code_tag_end} or %{code_tag_start}*-release%{code_tag_end} are supported."
msgstr ""
-msgid "&lt; 1 hour"
-msgstr "&lt; 1 hora"
-
msgid "'%{data}' at %{location} does not match format: %{format}"
msgstr "'%{data}' en %{location} no coincide con el formato: %{format}"
@@ -1124,9 +1141,6 @@ msgstr "(revocado)"
msgid "(we need your current password to confirm your changes)"
msgstr "(Necesitamos su contraseña actual para confirmar sus cambios)"
-msgid "* * * * *"
-msgstr "* * * * *"
-
msgid "+ %{amount} more"
msgstr "+ %{amount} más"
@@ -1193,12 +1207,12 @@ msgstr "- mostrar menos"
msgid "."
msgstr "."
+msgid "/"
+msgstr ""
+
msgid "0 bytes"
msgstr "0 bytes"
-msgid "0 for unlimited, only effective with remote storage enabled."
-msgstr "0 para ilimitado, solo efectivo con almacenamiento remoto habilitado."
-
msgid "0t1DgySidms"
msgstr "0t1DgySidms"
@@ -1326,6 +1340,9 @@ msgstr "10-19 contribuciones"
msgid "1000+"
msgstr "1000+"
+msgid "192.168.0.0/24"
+msgstr ""
+
msgid "1st contribution!"
msgstr "¡1ra contribución!"
@@ -1479,9 +1496,6 @@ msgstr ""
msgid "A plain HTML site that uses Netlify for CI/CD instead of GitLab, but still with all the other great GitLab features"
msgstr ""
-msgid "A plain-text response to show to clients that hit the rate limit."
-msgstr ""
-
msgid "A platform value can be web, mob or app."
msgstr "Un valor de plataforma puede ser web, mob o aplicación."
@@ -1540,10 +1554,10 @@ msgid "API?"
msgstr "API?"
msgid "APIFuzzing|$VARIABLE_WITH_PASSWORD"
-msgstr ""
+msgstr "$VARIABLE_WITH_PASSWORD"
msgid "APIFuzzing|$VARIABLE_WITH_USERNAME"
-msgstr ""
+msgstr "$VARIABLE_WITH_USERNAME"
msgid "APIFuzzing|API Fuzzing Configuration"
msgstr "Configuración de API Fuzzing"
@@ -1563,7 +1577,7 @@ msgstr ""
msgid "APIFuzzing|Configure HTTP basic authentication values. Other authentication methods are supported. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
+msgid "APIFuzzing|Customize your project's API fuzzing configuration options and copy the code snippet to your .gitlab-ci.yml file to apply any changes. Note that this tool does not reflect or update your .gitlab-ci.yml file automatically. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
msgstr ""
msgid "APIFuzzing|Enable authentication"
@@ -1626,9 +1640,6 @@ msgstr ""
msgid "APIFuzzing|To prevent a security leak, authentication info must be added as a %{ciVariablesLinkStart}CI variable%{ciVariablesLinkEnd}. As a user with maintainer access rights, you can manage CI variables in the %{ciSettingsLinkStart}Settings%{ciSettingsLinkEnd} area."
msgstr ""
-msgid "APIFuzzing|Use this tool to generate API fuzzing configuration YAML to copy into your .gitlab-ci.yml file. This tool does not reflect or update your .gitlab-ci.yml file automatically."
-msgstr ""
-
msgid "APIFuzzing|Username for basic authentication"
msgstr "Nombre de usuario para autenticación básica"
@@ -1680,9 +1691,6 @@ msgstr "Informar de un abuso"
msgid "Abuse reports notification email"
msgstr "Correo de notificación de informes de abuso"
-msgid "Abuse reports will be sent to this address if it is set. Abuse reports are always available in the admin area."
-msgstr "Si se configura los informes de abuso serán enviados a esta dirección. Los informes de abuso siempre están disponibles en el área de administración."
-
msgid "Accept invitation"
msgstr "Aceptar invitación"
@@ -1719,12 +1727,18 @@ msgstr "Acceso denegado. Por favor, compruebe su nivel de acceso."
msgid "Access granted"
msgstr "Acceso permitido"
+msgid "Access key ID"
+msgstr ""
+
msgid "Access requests"
msgstr "Peticiones de acceso"
msgid "Access to '%{classification_label}' not allowed"
msgstr "El acceso a '%{classification_label}' no está permitido"
+msgid "Access tokens expire after 2 hours. A refresh token may be used at any time to generate a new access token. Non-expiring access tokens are deprecated. Clear this setting to enable backward compatibility."
+msgstr ""
+
msgid "AccessDropdown|Deploy Keys"
msgstr "Desplegar claves"
@@ -1828,7 +1842,7 @@ msgid "Action"
msgstr "Acción"
msgid "Action to take when receiving an alert. %{docsLink}"
-msgstr ""
+msgstr "Acción a realizar al recibir una alerta. %{docsLink}"
msgid "Actions"
msgstr "Acciones"
@@ -2037,6 +2051,9 @@ msgstr "Añadir una nueva aplicación"
msgid "Add new directory"
msgstr "Agregar nuevo directorio"
+msgid "Add new service account"
+msgstr ""
+
msgid "Add or remove previously merged commits"
msgstr ""
@@ -2274,6 +2291,9 @@ msgstr "Desarrollador"
msgid "AdminArea|Features"
msgstr "Características"
+msgid "AdminArea|Get security updates from GitLab and stay up to date"
+msgstr ""
+
msgid "AdminArea|Groups"
msgstr "Grupos"
@@ -2313,6 +2333,12 @@ msgstr "Proyectos"
msgid "AdminArea|Reporter"
msgstr "Reportador"
+msgid "AdminArea|Sign up for the GitLab Security Newsletter to get notified for security updates."
+msgstr ""
+
+msgid "AdminArea|Sign up for the GitLab newsletter"
+msgstr ""
+
msgid "AdminArea|Stop all jobs"
msgstr "Detener todos los trabajos"
@@ -2382,9 +2408,15 @@ msgstr "Deshabilitar el token del feed"
msgid "AdminSettings|Disable public access to Pages sites"
msgstr ""
+msgid "AdminSettings|Display a banner on merge requests in projects with no pipelines to initiate steps to add a .gitlab-ci.yml file."
+msgstr ""
+
msgid "AdminSettings|Domain verification is an essential security measure for public GitLab sites. Users are required to demonstrate they control a domain before it is enabled. %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "AdminSettings|Enable pipeline suggestion banner"
+msgstr ""
+
msgid "AdminSettings|Enable shared runners for new projects"
msgstr "Habilitar ejecutores compartidos para los nuevos proyectos"
@@ -2482,22 +2514,22 @@ msgid "AdminStatistics|Snippets"
msgstr "Fragmentos de código"
msgid "AdminUsers|(Admin)"
-msgstr ""
+msgstr "(Admin)"
msgid "AdminUsers|(Banned)"
msgstr "(Baneado)"
msgid "AdminUsers|(Blocked)"
-msgstr ""
+msgstr "(Bloqueado)"
msgid "AdminUsers|(Deactivated)"
-msgstr ""
+msgstr "(Desactivado)"
msgid "AdminUsers|(Internal)"
-msgstr ""
+msgstr "(Interno)"
msgid "AdminUsers|(Pending approval)"
-msgstr ""
+msgstr "(Pendiente de aprobación)"
msgid "AdminUsers|2FA Disabled"
msgstr "2FA desactivado"
@@ -2506,7 +2538,7 @@ msgid "AdminUsers|2FA Enabled"
msgstr "2FA Habilitado"
msgid "AdminUsers|A user can validate themselves by inputting a credit/debit card, or an admin can manually validate a user."
-msgstr ""
+msgstr "Un usuario se puede validar a sí mismo introduciendo una tarjeta de crédito/débito, o un administrador puede validar manualmente a un usuario."
msgid "AdminUsers|Access"
msgstr "Acceso"
@@ -2527,13 +2559,13 @@ msgid "AdminUsers|Active"
msgstr "Activo"
msgid "AdminUsers|Adjust the user cap setting on your instance"
-msgstr ""
+msgstr "Ajuste la configuración del límite de usuarios en tu instancia"
msgid "AdminUsers|Admin"
msgstr "Admin"
msgid "AdminUsers|Administrators have access to all groups, projects and users and can manage all features in this installation"
-msgstr ""
+msgstr "Los administradores tienen acceso a todos los grupos, proyectos y usuarios y pueden administrar todas las funcionalidades en esta instalación"
msgid "AdminUsers|Admins"
msgstr "Administradores"
@@ -2548,7 +2580,7 @@ msgid "AdminUsers|Approved users can:"
msgstr "Los usuarios aprobados pueden:"
msgid "AdminUsers|Automatically marked as default internal user"
-msgstr ""
+msgstr "Marcado automáticamente como usuario interno por defecto"
msgid "AdminUsers|Ban user"
msgstr "Banear usuario"
@@ -2856,10 +2888,10 @@ msgstr "Nota"
msgid "Admin|Quarterly reconciliation will occur on %{qrtlyDate}"
msgstr "La conciliación trimestral se producirá el %{qrtlyDate}"
-msgid "Admin|The number of max seats used for your namespace is currently exceeding the number of seats in your subscription. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgid "Admin|The number of max seats in your namespace exceeds the number of seats in your subscription. On %{qrtlyDate}, quarterly reconciliation occurs and you are automatically billed a prorated amount for the overage. No action is needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice. For more information about the timing of the invoicing process, view the documentation."
msgstr ""
-msgid "Admin|The number of maximum users for your instance is currently exceeding the number of users in license. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgid "Admin|The number of max users in your instance exceeds the number of users in your license. On %{qrtlyDate}, quarterly reconciliation occurs and you are automatically billed a prorated amount for the overage. No action is needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice. For more information about the timing of the invoicing process, view the documentation."
msgstr ""
msgid "Admin|View pending user approvals"
@@ -2880,9 +2912,6 @@ msgstr "Configuración avanzada"
msgid "Advanced export options"
msgstr "Opciones de exportación avanzadas"
-msgid "Advanced permissions, Large File Storage and Two-Factor authentication settings."
-msgstr "Permisos avanzados, almacenamiento de grandes archivos y configuraciones de autenticación de dos factores."
-
msgid "After a successful password update you will be redirected to login screen."
msgstr "Después de una actualización correcta de la contraseña, será redirigido a la pantalla de inicio de sesión."
@@ -2901,13 +2930,14 @@ msgstr ""
msgid "After you've reviewed these contribution guidelines, you'll be all set to"
msgstr ""
+msgid "Akismet"
+msgstr ""
+
msgid "Akismet API Key"
msgstr "Clave de API de Akismet"
-msgid "Alert"
-msgid_plural "Alerts"
-msgstr[0] "Alerta"
-msgstr[1] "Alertas"
+msgid "Akismet helps prevent the creation of spam issues in public projects."
+msgstr ""
msgid "AlertManagement|Acknowledged"
msgstr "Confirmado"
@@ -2955,7 +2985,7 @@ msgid "AlertManagement|Edit"
msgstr "Editar"
msgid "AlertManagement|Environment"
-msgstr ""
+msgstr "Entorno"
msgid "AlertManagement|Events"
msgstr "Eventos"
@@ -2964,10 +2994,10 @@ msgid "AlertManagement|Incident"
msgstr "Incidente"
msgid "AlertManagement|Key"
-msgstr ""
+msgstr "Clave"
msgid "AlertManagement|Metrics"
-msgstr ""
+msgstr "Métricas"
msgid "AlertManagement|Metrics weren't available in the alerts payload."
msgstr ""
@@ -3057,7 +3087,7 @@ msgid "AlertMappingBuilder|Define fallback"
msgstr ""
msgid "AlertMappingBuilder|GitLab alert key"
-msgstr ""
+msgstr "Clave de alerta de GitLab"
msgid "AlertMappingBuilder|Make selection"
msgstr "Hacer selección"
@@ -3263,6 +3293,9 @@ msgstr "Todos los %{replicableType} están siendo programados para %{action}"
msgid "All (default)"
msgstr "Todos (por defecto)"
+msgid "All GitLab"
+msgstr ""
+
msgid "All Members"
msgstr "Todos los miembros"
@@ -3309,7 +3342,7 @@ msgid "All threads resolved"
msgstr "Todos los hilos resueltos"
msgid "All users must accept the Terms of Service and Privacy Policy to access GitLab"
-msgstr ""
+msgstr "Todos los usuarios deben aceptar los términos de servicio y la política de privacidad para acceder a GitLab"
msgid "All users must have a name."
msgstr "Todos los usuarios deben tener un nombre."
@@ -3318,7 +3351,7 @@ msgid "Allow \"%{group_name}\" to sign you in"
msgstr "Permitir al grupo %{group_name} iniciar sesión"
msgid "Allow access to members of the following group"
-msgstr ""
+msgstr "Permitir el acceso a los miembros del siguiente grupo"
msgid "Allow access to the following IP addresses"
msgstr "Permitir el acceso a las siguientes direcciones IP"
@@ -3330,7 +3363,7 @@ msgid "Allow group owners to manage LDAP-related settings"
msgstr "Permitir a los propietarios de los grupos administrar configuraciones relacionadas con LDAP"
msgid "Allow non-administrators to access to the performance bar"
-msgstr ""
+msgstr "Permitir a los usuarios no administradores acceder a la barra de rendimiento"
msgid "Allow only the selected protocols to be used for Git access."
msgstr "Permitir que sólo los protocolos seleccionados tengan acceso a Git."
@@ -3377,6 +3410,9 @@ msgstr "Permitir a esta clave hacer push a este repositorio"
msgid "Allow this secondary node to replicate content on Object Storage"
msgstr ""
+msgid "Allow use of licensed EE features"
+msgstr ""
+
msgid "Allow users to dismiss the broadcast message"
msgstr ""
@@ -3452,9 +3488,6 @@ msgstr "Logo de Amazon Web Services"
msgid "Amazon authentication is not %{link_start}correctly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr "La autenticación de Amazon no está %{link_start}correctamente configurada%{link_end}. Preguntele a su administrador de GitLab sí desea utilizar este servicio."
-msgid "Amount of time (in hours) that users are allowed to skip forced configuration of two-factor authentication"
-msgstr "Cantidad de tiempo (en horas) que los usuarios pueden omitir la configuración forzada de la autenticación de dos factores"
-
msgid "An %{link_start}alert%{link_end} with the same fingerprint is already open. To change the status of this alert, resolve the linked alert."
msgstr ""
@@ -3480,7 +3513,7 @@ msgid "An empty GitLab User field will add the FogBugz user's full name (e.g. \"
msgstr "Se agregará a un campo de usuario de Gitlab el nombre completo del usuario de FogBugz (por ejemplo, \"John Smith\") en la descripción de todos los errores y los comentarios. También se asociarán o asignarán estos errores y comentarios al creador del proyecto."
msgid "An empty index will be created if one does not already exist"
-msgstr ""
+msgstr "Se creará un índice vacío si aún no existe uno"
msgid "An error has occurred"
msgstr "Se ha producido un error"
@@ -3515,12 +3548,6 @@ msgstr "Ha ocurrido un error visualizando el blob"
msgid "An error occurred when removing the label."
msgstr "Se ha producido un error al eliminar la etiqueta."
-msgid "An error occurred when toggling the notification subscription"
-msgstr "Se produjo un error al activar/desactivar la suscripción de notificación"
-
-msgid "An error occurred when updating the issue weight"
-msgstr "Se ha producido un error al actualizar el tamaño de la incidencia"
-
msgid "An error occurred when updating the title"
msgstr "Se ha producido un error al actualizar el título"
@@ -3569,6 +3596,9 @@ msgstr "Se ha producido un error al representar los enlaces de relaciones del tr
msgid "An error occurred while enabling Service Desk."
msgstr "Se ha producido un error al habilitar Service Desk."
+msgid "An error occurred while fetching Markdown preview"
+msgstr ""
+
msgid "An error occurred while fetching ancestors"
msgstr "Se ha producido un error al obtener los ancestros"
@@ -3599,9 +3629,6 @@ msgstr "Se ha producido un error al obtener las incidencias."
msgid "An error occurred while fetching label colors."
msgstr "Se ha producido un error al obtener los colores de las etiquetas."
-msgid "An error occurred while fetching markdown preview"
-msgstr "Se ha producido un error al obtener la previsualización del markdown."
-
msgid "An error occurred while fetching participants"
msgstr "Se ha producido un error al obtener los participantes"
@@ -3617,9 +3644,6 @@ msgstr "Se ha producido un error al obtener la información de autocompletado de
msgid "An error occurred while fetching reference"
msgstr "Se ha producido un error al obtener referencias"
-msgid "An error occurred while fetching sidebar data"
-msgstr "Se ha producido un error al obtener los datos de la barra lateral."
-
msgid "An error occurred while fetching tags. Retry the search."
msgstr "Se ha producido un error al recuperar los tags. Por favor, vuelva a intentar la búsqueda."
@@ -3695,6 +3719,9 @@ msgstr "Se ha producido un error al cargar las incidencias"
msgid "An error occurred while loading merge requests."
msgstr "Se ha producido un error al cargar los merge requests."
+msgid "An error occurred while loading projects."
+msgstr ""
+
msgid "An error occurred while loading the Needs tab."
msgstr ""
@@ -3741,7 +3768,7 @@ msgid "An error occurred while loading the pipelines jobs."
msgstr "Se ha producido un error al cargar los trabajos de los pipelines."
msgid "An error occurred while loading your content. Please try again."
-msgstr ""
+msgstr "Se ha producido un error al cargar su contenido. Por favor, inténtelo de nuevo."
msgid "An error occurred while making the request."
msgstr "Se ha producido un error al crear la petición."
@@ -3762,7 +3789,7 @@ msgid "An error occurred while removing issues."
msgstr "Se ha producido un error al eliminar las incidencias."
msgid "An error occurred while rendering preview broadcast message"
-msgstr ""
+msgstr "Se ha producido un error al mostrar el mensaje de emisión de la vista previa"
msgid "An error occurred while rendering the editor"
msgstr "Se ha producido un error al renderizar el editor"
@@ -3867,7 +3894,7 @@ msgid "An unexpected error occurred while communicating with the Web Terminal."
msgstr "Se ha producido un error inesperado al comunicarse con la Terminal Web."
msgid "An unexpected error occurred while loading the code quality diff."
-msgstr ""
+msgstr "Se ha producido un error inesperado al cargar los diff de calidad del código."
msgid "An unexpected error occurred while starting the Web Terminal."
msgstr "Se ha producido un error inesperado al iniciar el Terminal Web."
@@ -3929,12 +3956,6 @@ msgstr "Cualquier autor"
msgid "Any Milestone"
msgstr "Cualquier hito"
-msgid "Any branch"
-msgstr "Cualquier rama"
-
-msgid "Any eligible user"
-msgstr "Cualquier usuario elegible"
-
msgid "Any encrypted tokens"
msgstr "Cualquier token encriptado"
@@ -3953,6 +3974,9 @@ msgstr "Cualquier hito"
msgid "Any namespace"
msgstr "Cualquier espacio de nombres"
+msgid "App Engine description and apps that are suitable for this deployment target"
+msgstr ""
+
msgid "App ID"
msgstr "App ID"
@@ -3978,7 +4002,7 @@ msgid "Application ID"
msgstr "ID de la aplicación"
msgid "Application limits saved successfully"
-msgstr ""
+msgstr "Los límites de la aplicación se han guardado correctamente"
msgid "Application settings saved successfully"
msgstr "Se ha guardado correctamente la configuración de la aplicación"
@@ -4006,8 +4030,8 @@ msgstr ""
msgid "ApplicationSettings|Approve %d user"
msgid_plural "ApplicationSettings|Approve %d users"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "Aprobar %d usuario"
+msgstr[1] "Aprobar %d usuarios"
msgid "ApplicationSettings|Approve users in the pending approval status?"
msgstr ""
@@ -4101,6 +4125,11 @@ msgstr "Aplicado"
msgid "Apply"
msgstr "Aplicar"
+msgid "Apply %d suggestion"
+msgid_plural "Apply %d suggestions"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Apply a label"
msgstr "Aplicar a la etiqueta"
@@ -4110,13 +4139,10 @@ msgstr "Aplicar una plantilla"
msgid "Apply suggestion"
msgstr "Aplicar sugerencia"
-msgid "Apply suggestions"
-msgstr "Aplicar sugerencias"
-
msgid "Apply template"
msgstr "Aplicar plantilla"
-msgid "Apply this approval rule to any branch or a specific protected branch."
+msgid "Apply this approval rule to all branches or a specific protected branch."
msgstr ""
msgid "Applying"
@@ -4182,7 +4208,7 @@ msgid "ApprovalRule|All scanners"
msgstr "Todos los escáneres"
msgid "ApprovalRule|All severity levels"
-msgstr ""
+msgstr "Todos los niveles de gravedad"
msgid "ApprovalRule|Apply this approval rule to consider only the selected security scanners."
msgstr ""
@@ -4212,13 +4238,13 @@ msgid "ApprovalRule|Number of vulnerabilities allowed before approval rule is tr
msgstr ""
msgid "ApprovalRule|Please enter a number equal or greater than zero"
-msgstr ""
+msgstr "Por favor, introduzca un número igual o superior a cero"
msgid "ApprovalRule|Please select at least one security scanner"
-msgstr ""
+msgstr "Por favor, seleccione al menos un escáner de seguridad"
msgid "ApprovalRule|Please select at least one severity level"
-msgstr ""
+msgstr "Por favor seleccione al menos un nivel de gravedad"
msgid "ApprovalRule|Rule name"
msgstr "Nombre de la regla"
@@ -4233,10 +4259,10 @@ msgid "ApprovalRule|Select scanners"
msgstr "Seleccionar escáneres"
msgid "ApprovalRule|Select severity levels"
-msgstr ""
+msgstr "Seleccione los niveles de gravedad"
msgid "ApprovalRule|Severity levels"
-msgstr ""
+msgstr "Niveles de gravedad"
msgid "ApprovalRule|Target branch"
msgstr "Branch de destino"
@@ -4259,9 +4285,6 @@ msgstr ""
msgid "ApprovalSettings|Prevent editing approval rules in projects and merge requests."
msgstr ""
-msgid "ApprovalSettings|Prevent editing approval rules in projects and merge requests. "
-msgstr ""
-
msgid "ApprovalSettings|Remove all approvals when commits are added to the source branch."
msgstr ""
@@ -4277,6 +4300,9 @@ msgstr ""
msgid "ApprovalSettings|This setting is configured at the instance level and can only be changed by an administrator."
msgstr ""
+msgid "ApprovalSettings|This setting is configured in %{groupName} and can only be changed by an administrator or group owner."
+msgstr ""
+
msgid "ApprovalStatusTooltip|Adheres to separation of duties"
msgstr ""
@@ -4763,9 +4789,6 @@ msgstr "Autenticar con GitHub"
msgid "Authenticated API rate limit period in seconds"
msgstr ""
-msgid "Authenticated API request rate limit"
-msgstr "Límite de peticiones de la API autenticadas"
-
msgid "Authenticated API requests"
msgstr "Peticiones de API autenticadas"
@@ -4775,11 +4798,11 @@ msgstr ""
msgid "Authenticated Git LFS request rate limit"
msgstr ""
-msgid "Authenticated web rate limit period in seconds"
+msgid "Authenticated Git LFS requests"
msgstr ""
-msgid "Authenticated web request rate limit"
-msgstr "Límite de peticiones web autenticadas"
+msgid "Authenticated web rate limit period in seconds"
+msgstr ""
msgid "Authenticated web requests"
msgstr "Peticiones web autenticadas"
@@ -5156,9 +5179,6 @@ msgstr "A continuación se muestran los ajustes relativos a %{link_to_gitlab_pag
msgid "Below you will find all the groups that are public."
msgstr "A continuación encontrará todos los grupos públicos."
-msgid "Beta"
-msgstr "Beta"
-
msgid "Bi-weekly code coverage"
msgstr "Cobertura de código quincenal"
@@ -5398,6 +5418,21 @@ msgstr "Blog"
msgid "Board scope affects which issues are displayed for anyone who visits this board"
msgstr "El alcance del panel de control afecta qué problemas se muestran para cualquiera persona que visite este panel"
+msgid "BoardNewEpic|Groups"
+msgstr ""
+
+msgid "BoardNewEpic|Loading groups"
+msgstr ""
+
+msgid "BoardNewEpic|No matching results"
+msgstr ""
+
+msgid "BoardNewEpic|Search groups"
+msgstr ""
+
+msgid "BoardNewEpic|Select a group"
+msgstr ""
+
msgid "BoardNewIssue|No matching results"
msgstr "No hay resultados coincidentes"
@@ -5475,6 +5510,9 @@ msgstr ""
msgid "Boards|An error occurred while creating the list. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching child groups. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching group projects. Please try again."
msgstr ""
@@ -5807,30 +5845,45 @@ msgstr ""
msgid "Bulk update"
msgstr ""
+msgid "BulkImports|Re-import creates a new group. It does not sync with the existing group."
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr "Grupos existentes"
msgid "BulkImport|Filter by source group"
-msgstr ""
+msgstr "Filtrar por grupo de origen"
msgid "BulkImport|From source group"
+msgstr "Del grupo de origen"
+
+msgid "BulkImport|Group import history"
msgstr ""
msgid "BulkImport|Import failed: Destination cannot be a subgroup of the source group. Change the destination and try again."
-msgstr ""
+msgstr "Importación fallida: el destino no puede ser un subgrupo del grupo de origen. Por favor, cambie el destino y vuelva a intentarlo."
msgid "BulkImport|Import groups from GitLab"
-msgstr ""
+msgstr "Importar grupos de GitLab"
msgid "BulkImport|Import selected"
-msgstr ""
+msgstr "Importar seleccionados"
msgid "BulkImport|Importing the group failed"
msgstr ""
+msgid "BulkImport|Last imported to %{link}"
+msgstr ""
+
msgid "BulkImport|Name already exists."
msgstr "El nombre ya existe."
+msgid "BulkImport|New group"
+msgstr ""
+
+msgid "BulkImport|No history is available"
+msgstr ""
+
msgid "BulkImport|No parent"
msgstr "No hay ningún padre"
@@ -5843,6 +5896,9 @@ msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} matching filter \"%{filter}\" from %{link}"
msgstr ""
+msgid "BulkImport|Source group"
+msgstr ""
+
msgid "BulkImport|To new group"
msgstr "Para un nuevo grupo"
@@ -5850,6 +5906,9 @@ msgid "BulkImport|Update of import statuses with realtime changes failed"
msgstr ""
msgid "BulkImport|You have no groups to import"
+msgstr "No tiene grupos para importar"
+
+msgid "BulkImport|Your imported groups will appear here."
msgstr ""
msgid "BulkImport|expected an associated Group but has an associated Project"
@@ -6094,6 +6153,9 @@ msgstr ""
msgid "Can be manually deployed to"
msgstr "Puede ser desplegado manualmente en"
+msgid "Can be overridden in each project."
+msgstr ""
+
msgid "Can create groups:"
msgstr "Puede crear grupos:"
@@ -6196,6 +6258,9 @@ msgstr "Cancelado"
msgid "Cancelling Preview"
msgstr "Cancelando la vista previa"
+msgid "Cannot assign a confidential epic to a non-confidential issue. Make the issue confidential and try again"
+msgstr ""
+
msgid "Cannot be assigned to other projects."
msgstr "No se puede asignar a otros proyectos."
@@ -6247,9 +6312,6 @@ msgstr ""
msgid "Cannot refer to a group %{timebox_type} by an internal id!"
msgstr ""
-msgid "Cannot set confidential epic for a non-confidential issue"
-msgstr ""
-
msgid "Cannot show preview. For previews on sketch files, they must have the file format introduced by Sketch version 43 and above."
msgstr "No se puede mostrar la vista previa. Para las vistas previas de los archivos de Sketch, los archivos deben tener el formato introducido por Sketch versión 43 o superior."
@@ -6487,15 +6549,15 @@ msgstr "Compruebe la disponibilidad de la función en el plan de espacio de nomb
msgid "Check out, review, and merge locally"
msgstr ""
-msgid "Check the %{docs_link_start}documentation%{docs_link_end}."
-msgstr "Compruebe la documentación %{docs_link_start}%{docs_link_end}."
-
msgid "Check the current instance configuration "
msgstr "Compruebe la configuración de la instancia actual "
msgid "Check the elasticsearch.log file to debug why the migration was halted and make any changes before retrying the migration. When you fix the cause of the failure, click \"Retry migration\", and the migration will be scheduled to be retried in the background."
msgstr ""
+msgid "Check with your administrator."
+msgstr ""
+
msgid "Check your Docker images for known vulnerabilities."
msgstr "Compruebe sus imágenes de Docker para detectar vulnerabilidades conocidas."
@@ -6526,6 +6588,9 @@ msgstr "Verificando la disponibilidad del nombres de usuario..."
msgid "Checkout"
msgstr ""
+msgid "Checkout|$%{selectedPlanPrice} per 10 GB storage per pack"
+msgstr ""
+
msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 minutes"
msgstr ""
@@ -6546,17 +6611,23 @@ msgstr "Minutos de IC de%{name}"
msgid "Checkout|%{name}'s GitLab subscription"
msgstr "Suscripción de GitLab de%{name}"
+msgid "Checkout|%{name}'s storage subscription"
+msgstr ""
+
+msgid "Checkout|%{quantity} GB of storage"
+msgstr ""
+
+msgid "Checkout|%{quantity} storage pack"
+msgid_plural "Checkout|%{quantity} storage packs"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Checkout|%{selectedPlanText} plan"
msgstr "plan %{selectedPlanText}"
msgid "Checkout|%{startDate} - %{endDate}"
msgstr "%{startDate} - %{endDate}"
-msgid "Checkout|%{totalCiMinutes} CI minute"
-msgid_plural "Checkout|%{totalCiMinutes} CI minutes"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "Checkout|%{totalCiMinutes} CI minutes"
msgstr "%{totalCiMinutes} minutos de CI"
@@ -6573,7 +6644,7 @@ msgid "Checkout|Billing address"
msgstr "Dirección de facturación"
msgid "Checkout|CI minute pack"
-msgstr ""
+msgstr "Paquete de minutos CI"
msgid "Checkout|CI minute packs are only used after you've used your subscription's monthly quota. The additional minutes will roll over month to month and are valid for one year."
msgstr ""
@@ -6632,6 +6703,9 @@ msgstr ""
msgid "Checkout|Failed to register credit card. Please try again."
msgstr "Se ha producido un error al registrar la tarjeta de crédito. Por favor, inténtelo de nuevo."
+msgid "Checkout|GB"
+msgstr ""
+
msgid "Checkout|GitLab group"
msgstr "Grupo de GitLab"
@@ -6668,6 +6742,9 @@ msgstr "Seleccionar"
msgid "Checkout|State"
msgstr "Estado"
+msgid "Checkout|Storage packs"
+msgstr ""
+
msgid "Checkout|Street address"
msgstr "Dirección"
@@ -6689,6 +6766,9 @@ msgstr "Total"
msgid "Checkout|Total minutes: %{quantity}"
msgstr "Minutos totales: %{quantity}"
+msgid "Checkout|Total storage: %{quantity} GB"
+msgstr ""
+
msgid "Checkout|Users"
msgstr "Usuarios"
@@ -6698,16 +6778,25 @@ msgstr ""
msgid "Checkout|Your organization"
msgstr "Su organización"
+msgid "Checkout|Your storage subscription has the same term as your main subscription, and the price is prorated accordingly."
+msgstr ""
+
msgid "Checkout|Your subscription will be applied to this group"
msgstr "Su suscripción se aplicará a este grupo"
msgid "Checkout|Zip code"
msgstr "Código postal"
+msgid "Checkout|a storage subscription"
+msgstr ""
+
msgid "Checkout|company or team"
msgstr "empresa o equipo"
-msgid "Checkout|x 1,000 minutes per pack = %{strong}"
+msgid "Checkout|minutes"
+msgstr ""
+
+msgid "Checkout|x %{quantity} %{units} per pack ="
msgstr ""
msgid "Cherry-pick this commit"
@@ -6789,7 +6878,7 @@ msgid "Choose your framework"
msgstr "Seleccione su marco de trabajo"
msgid "CiCdAnalytics|Date range: %{range}"
-msgstr ""
+msgstr "Rango de fechas: %{range}"
msgid "CiStatusLabel|canceled"
msgstr "cancelado"
@@ -7064,6 +7153,9 @@ msgstr "¡No se puede clonar la incidencia debido a que no tiene permisos insufi
msgid "CloneIssue|Cannot clone issue to target project as it is pending deletion."
msgstr "No se puede clonar la incidencia en el proyecto de destino ya que está pendiente de eliminación."
+msgid "CloneIssue|Cannot clone issues of '%{issue_type}' type."
+msgstr ""
+
msgid "Cloned this issue to %{path_to_project}."
msgstr "Clonó esta incidencia en %{path_to_project}."
@@ -7118,8 +7210,11 @@ msgstr "Cerrado: %{closed}"
msgid "Closes this %{quick_action_target}."
msgstr "Cierra este %{quick_action_target}."
-msgid "Cloud licenses can not be removed."
-msgstr "No se pueden eliminar las licencias cloud."
+msgid "Cloud Functions description and apps that are suitable for this deployment target"
+msgstr ""
+
+msgid "Cloud Run description and apps that are suitable for this deployment target"
+msgstr ""
msgid "Cluster"
msgstr "Clúster"
@@ -7145,6 +7240,12 @@ msgstr ""
msgid "ClusterAgents|Access tokens"
msgstr "Tokens de acceso"
+msgid "ClusterAgents|Agent might not be connected to GitLab"
+msgstr ""
+
+msgid "ClusterAgents|Agent never connected to GitLab"
+msgstr ""
+
msgid "ClusterAgents|Alternative installation methods"
msgstr "Métodos de instalación alternativos"
@@ -7160,6 +7261,12 @@ msgstr "Se ha producido un error desconocido. Por favor, inténtelo de nuevo."
msgid "ClusterAgents|Configuration"
msgstr "Configuración"
+msgid "ClusterAgents|Connected"
+msgstr ""
+
+msgid "ClusterAgents|Connection status"
+msgstr ""
+
msgid "ClusterAgents|Copy token"
msgstr "Copiar token"
@@ -7178,11 +7285,14 @@ msgstr "Descripción"
msgid "ClusterAgents|For alternative installation methods %{linkStart}go to the documentation%{linkEnd}."
msgstr "Para métodos de instalación alternativos %{linkStart}vaya a la documentación%{linkEnd}."
+msgid "ClusterAgents|For more troubleshooting information go to"
+msgstr ""
+
msgid "ClusterAgents|Go to the repository"
msgstr "Ir al repositorio"
msgid "ClusterAgents|Install a new GitLab Agent"
-msgstr ""
+msgstr "Instalar un nuevo agente de GitLab"
msgid "ClusterAgents|Install new Agent"
msgstr "Instalar nuevo agente"
@@ -7193,18 +7303,30 @@ msgstr "Integrar Kubernetes con un agente de GitLab"
msgid "ClusterAgents|Integrate with the GitLab Agent"
msgstr "Integrar con el agente de GitLab"
-msgid "ClusterAgents|Last used"
-msgstr "Utilizado por última vez"
+msgid "ClusterAgents|Last connected %{timeAgo}."
+msgstr ""
+
+msgid "ClusterAgents|Last contact"
+msgstr ""
msgid "ClusterAgents|Learn how to create an agent access token"
msgstr "Aprenda cómo crear un token de acceso del agente"
+msgid "ClusterAgents|Make sure you are using a valid token."
+msgstr ""
+
msgid "ClusterAgents|Name"
msgstr "Nombre"
msgid "ClusterAgents|Never"
msgstr "Nunca"
+msgid "ClusterAgents|Never connected"
+msgstr ""
+
+msgid "ClusterAgents|Not connected"
+msgstr ""
+
msgid "ClusterAgents|Read more about getting started"
msgstr "Más información sobre cómo empezar"
@@ -7226,6 +7348,9 @@ msgstr "Seleccione el agente que desea registrar con GitLab e instálelo en su c
msgid "ClusterAgents|Select which Agent you want to install"
msgstr "Seleccione qué agente desea instalar"
+msgid "ClusterAgents|The Agent has not been connected in a long time. There might be a connectivity issue. Last contact was %{timeAgo}."
+msgstr ""
+
msgid "ClusterAgents|The GitLab Agent also requires %{linkStart}enabling the Agent Server%{linkEnd}"
msgstr "El agente de GitLab también requiere %{linkStart}habilitar el servidor de agente%{linkEnd}"
@@ -7253,9 +7378,6 @@ msgstr "Usuario desconocido"
msgid "ClusterAgents|You will need to create a token to connect to your agent"
msgstr ""
-msgid "ClusterAgent|This feature is only available for premium plans"
-msgstr "Esta función sólo está disponible para planes premium"
-
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr "El usuario no tiene permisos suficientes para crear un token para este proyecto"
@@ -7445,9 +7567,6 @@ msgstr "Se ha producido un error al cargar las subredes"
msgid "ClusterIntegration|Create Kubernetes cluster"
msgstr "Crear cluster de Kubernetes"
-msgid "ClusterIntegration|Create a provision role on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the account and external ID above. %{startMoreInfoLink}More information%{endLink}"
-msgstr "Cree un rol de provisión en %{startAwsLink}Amazon Web Services%{externalLinkIcon}%{endLink} utilizando la cuenta y el ID externo que se muestra arriba. %{startMoreInfoLink}Más información%{endLink}"
-
msgid "ClusterIntegration|Create cluster on"
msgstr "Crear clúster en"
@@ -7880,7 +7999,7 @@ msgstr ""
msgid "ClusterIntegration|Subnets"
msgstr "Subredes"
-msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provisioned role, first create one on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the above account and external IDs. %{startMoreInfoLink}More information%{endLink}"
+msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provisioned role, first create one on %{awsLinkStart}Amazon Web Services %{awsLinkEnd} using the above account and external IDs. %{moreInfoStart}More information%{moreInfoEnd}"
msgstr ""
msgid "ClusterIntegration|The Kubernetes certificate used to authenticate to the cluster."
@@ -8114,6 +8233,9 @@ msgstr "Contraer hitos"
msgid "Collapse replies"
msgstr "Colapsar respuestas"
+msgid "Collapse settings section"
+msgstr ""
+
msgid "Collapse sidebar"
msgstr "Contraer la barra lateral"
@@ -8132,6 +8254,9 @@ msgstr "ComboSearch no está definido"
msgid "Comma-separated list of email addresses."
msgstr "Lista de direcciones de correo electrónico separadas por comas."
+msgid "Comma-separated list of users allowed to exceed the rate limit."
+msgstr ""
+
msgid "Comma-separated, e.g. '1.1.1.1, 2.2.2.0/24'"
msgstr "Separados por comas, ej. '1.1.1.1, 2.2.2.0/24'"
@@ -8452,6 +8577,9 @@ msgstr ""
msgid "Configure %{repository_checks_link_start}repository checks%{link_end} and %{housekeeping_link_start}housekeeping%{link_end} on repositories."
msgstr ""
+msgid "Configure CAPTCHAs, IP address limits, and other anti-spam measures."
+msgstr ""
+
msgid "Configure Dependency Scanning in `.gitlab-ci.yml` using the GitLab managed template. You can [add variable overrides](https://docs.gitlab.com/ee/user/application_security/dependency_scanning/#customizing-the-dependency-scanning-settings) to customize Dependency Scanning settings."
msgstr ""
@@ -8488,17 +8616,14 @@ msgstr "Configurar seguimiento"
msgid "Configure a %{codeStart}.gitlab-webide.yml%{codeEnd} file in the %{codeStart}.gitlab%{codeEnd} directory to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
msgstr ""
-msgid "Configure existing installation"
-msgstr "Configurar la instalación existente"
-
-msgid "Configure limit for notes created per minute by web and API requests."
+msgid "Configure advanced permissions, Large File Storage, and two-factor authentication settings."
msgstr ""
-msgid "Configure limits for Project/Group Import/Export."
+msgid "Configure approvals by authors and committers on all projects."
msgstr ""
-msgid "Configure limits for web and API requests."
-msgstr "Configurar los límites para las peticiones web y las peticiones API."
+msgid "Configure existing installation"
+msgstr "Configurar la instalación existente"
msgid "Configure paths to be protected by Rack Attack."
msgstr ""
@@ -8512,10 +8637,13 @@ msgstr ""
msgid "Configure settings for Advanced Search with Elasticsearch."
msgstr ""
+msgid "Configure specific limits for Files API requests that supersede the general user and IP rate limits."
+msgstr ""
+
msgid "Configure specific limits for Git LFS requests that supersede the general user and IP rate limits."
msgstr ""
-msgid "Configure specific limits for Packages API requests that supersede the general user and IP rate limits."
+msgid "Configure specific limits for deprecated API requests that supersede the general user and IP rate limits."
msgstr ""
msgid "Configure the %{link} integration."
@@ -8527,6 +8655,9 @@ msgstr ""
msgid "Configure the way a user creates a new account."
msgstr "Configure la forma en la que un usuario crea una cuenta nueva."
+msgid "Configure via Merge Request"
+msgstr ""
+
msgid "Configure which lists are shown for anyone who visits this board"
msgstr ""
@@ -8995,6 +9126,9 @@ msgstr "Contiene %{count} archivos de imágenes de tipo blob con un tamaño de (
msgid "Content parsed with %{link}."
msgstr ""
+msgid "ContentEditor|Table of Contents"
+msgstr ""
+
msgid "ContentEditor|You have to provide a renderMarkdown function or a custom serializer"
msgstr ""
@@ -9181,6 +9315,9 @@ msgstr "Copiar enlace"
msgid "Copy link to chart"
msgstr "Copiar enlace al gráfico"
+msgid "Copy prefix"
+msgstr ""
+
msgid "Copy reference"
msgstr "Copiar la referencia"
@@ -9211,6 +9348,9 @@ msgstr "Copiar token de activación"
msgid "Copy value"
msgstr "Copiar valor"
+msgid "Corpus Management"
+msgstr ""
+
msgid "Corpus Management|Are you sure you want to delete the corpus?"
msgstr "¿Está seguro de que desea eliminar el corpus?"
@@ -9439,6 +9579,9 @@ msgstr "Crear rama"
msgid "Create commit"
msgstr "Crear commit"
+msgid "Create common files more quickly, and standardize their format."
+msgstr ""
+
msgid "Create confidential merge request"
msgstr "Crear un merge request confidencial"
@@ -9472,6 +9615,9 @@ msgstr "Crear incidente"
msgid "Create issue"
msgstr "Crear incidencia"
+msgid "Create issue to resolve all threads"
+msgstr ""
+
msgid "Create iteration"
msgstr "Crear iteración"
@@ -9526,6 +9672,9 @@ msgstr "Crear nuevo proyecto"
msgid "Create new..."
msgstr "Crear nuevo..."
+msgid "Create or import your first project"
+msgstr ""
+
msgid "Create project"
msgstr "Crear proyecto"
@@ -9883,7 +10032,7 @@ msgstr "Métricas personalizadas"
msgid "Custom notification events"
msgstr "Eventos de notificaciones personalizadas"
-msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notificationLinkStart} notification emails%{notificationLinkEnd}."
+msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notificationLinkStart}notification emails%{notificationLinkEnd}."
msgstr ""
msgid "Custom project templates"
@@ -10082,11 +10231,11 @@ msgid_plural "CycleAnalytics|Showing %{subjectFilterText} and %{selectedLabelsCo
msgstr[0] ""
msgstr[1] ""
-msgid "CycleAnalytics|Showing data for group '%{groupName}' and %{selectedProjectCount} projects from %{startDate} to %{endDate}"
+msgid "CycleAnalytics|Showing data for group '%{groupName}' and %{selectedProjectCount} projects from %{createdAfter} to %{createdBefore}"
msgstr ""
-msgid "CycleAnalytics|Showing data for group '%{groupName}' from %{startDate} to %{endDate}"
-msgstr "Mostrando datos para el grupo '%{groupName}' desde %{startDate} hasta %{endDate}"
+msgid "CycleAnalytics|Showing data for group '%{groupName}' from %{createdAfter} to %{createdBefore}"
+msgstr ""
msgid "CycleAnalytics|Stages"
msgstr "Etapas"
@@ -10319,6 +10468,9 @@ msgstr ""
msgid "DastProfiles|Manage profiles"
msgstr "Administrar perfiles"
+msgid "DastProfiles|Manage site profiles"
+msgstr ""
+
msgid "DastProfiles|Minimum = 0 (no timeout enabled), Maximum = 2880 minutes"
msgstr "Mínimo = 0 (sin tiempo de espera habilitado), Máximo = 2880 minutos"
@@ -10394,6 +10546,9 @@ msgstr "Perfiles de escaneo"
msgid "DastProfiles|Scanner name"
msgstr "Nombre del escáner"
+msgid "DastProfiles|Schedule"
+msgstr ""
+
msgid "DastProfiles|Select branch"
msgstr "Seleccionar branch"
@@ -10463,7 +10618,7 @@ msgstr "Estado de validación"
msgid "DastProfiles|Website"
msgstr "Sitio web"
-msgid "DastProfiles|You can either choose a passive scan or validate the target site in your chosen site profile. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
+msgid "DastProfiles|You can either choose a passive scan or validate the target site from the site profile management page. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
msgstr ""
msgid "DastProfiles|You cannot run an active scan against an unvalidated site."
@@ -10636,7 +10791,7 @@ msgstr "Días"
msgid "Days to merge"
msgstr "Días para hacer merge"
-msgid "Deactivate dormant users after 90 days of inactivity. Users can return to active status by signing in to their account. While inactive, a user is not counted as an active user in the instance."
+msgid "Deactivate dormant users after 90 days of inactivity"
msgstr ""
msgid "Dear Administrator,"
@@ -10723,10 +10878,10 @@ msgstr ""
msgid "Define a custom pattern with cron syntax"
msgstr "Definir un patrón personalizado con la sintaxis de cron"
-msgid "Define approval settings."
+msgid "Define approval rules."
msgstr ""
-msgid "Define approval settings. %{linkStart}Learn more.%{linkEnd}"
+msgid "Define approval rules. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "Define custom rules for what constitutes spam, independent of Akismet"
@@ -10735,7 +10890,7 @@ msgstr ""
msgid "Define environments in the deploy stage(s) in %{code_open}.gitlab-ci.yml%{code_close} to track deployments here."
msgstr ""
-msgid "Define how approval rules are applied as a merge request moves toward completion."
+msgid "Define how approval rules are applied to merge requests."
msgstr ""
msgid "Definition"
@@ -10750,6 +10905,12 @@ msgstr ""
msgid "DelayedJobs|Are you sure you want to run %{job_name} immediately? This job will run automatically after it's timer finishes."
msgstr "¿Está seguro de que quiere ejecutar %{job_name} inmediatamente? De lo contrario, este trabajo se ejecutará automáticamente una vez que finalice el temporizador."
+msgid "DelayedJobs|Are you sure you want to run %{job_name} immediately? This job will run automatically after its timer finishes."
+msgstr ""
+
+msgid "DelayedJobs|Run the delayed job now?"
+msgstr ""
+
msgid "DelayedJobs|Start now"
msgstr "Comenzar ahora"
@@ -11026,6 +11187,12 @@ msgstr "La funcionalidad del proxy de dependencias está limitada, por ahora, ú
msgid "Dependency proxy image prefix"
msgstr ""
+msgid "DependencyProxy|Create a local proxy for storing frequently used upstream images. %{docLinkStart}Learn more%{docLinkEnd} about dependency proxies."
+msgstr ""
+
+msgid "DependencyProxy|Dependency Proxy"
+msgstr ""
+
msgid "DependencyProxy|Toggle Dependency Proxy"
msgstr "Cambiar el proxy de dependencias"
@@ -11266,6 +11433,9 @@ msgstr ""
msgid "Deployments"
msgstr "Despliegues"
+msgid "Deployments to Google Kubernetes Engine can be "
+msgstr ""
+
msgid "Deployments|%{deployments} environment impacted."
msgid_plural "Deployments|%{deployments} environments impacted."
msgstr[0] ""
@@ -11295,6 +11465,9 @@ msgstr "omitido"
msgid "Deployment|success"
msgstr "exitoso"
+msgid "Deprecated API rate limits"
+msgstr ""
+
msgid "Deprioritize label"
msgstr "Bajar la prioridad de la etiqueta"
@@ -11697,6 +11870,16 @@ msgstr "(HEAD)"
msgid "DiffsCompareBaseBranch|(base)"
msgstr "(base)"
+msgid "Diffs|%d addition"
+msgid_plural "Diffs|%d additions"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Diffs|%d deletion"
+msgid_plural "Diffs|%d deletions"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Diffs|No file name available"
msgstr "Sin nombre de archivo disponible"
@@ -11706,9 +11889,17 @@ msgstr ""
msgid "Diffs|Show all unchanged lines"
msgstr ""
+msgid "Diffs|Showing %{dropdownStart}%{count} changed file%{dropdownEnd}"
+msgid_plural "Diffs|Showing %{dropdownStart}%{count} changed files%{dropdownEnd}"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Diffs|Something went wrong while fetching diff lines."
msgstr "Se ha producido un error mientras se obtienen las líneas del diff."
+msgid "Diffs|with %{additions} and %{deletions}"
+msgstr ""
+
msgid "Direct member"
msgstr "Miembro directo"
@@ -11834,9 +12025,6 @@ msgid_plural "Dismiss %d selected vulnerabilities as"
msgstr[0] ""
msgstr[1] ""
-msgid "Dismiss Value Stream Analytics introduction box"
-msgstr ""
-
msgid "Dismiss merge request promotion"
msgstr ""
@@ -12158,6 +12346,9 @@ msgstr ""
msgid "Edit issues"
msgstr "Editar incidencias"
+msgid "Edit merge requests"
+msgstr ""
+
msgid "Edit public deploy key"
msgstr "Editar clave pública de despliegue"
@@ -12233,6 +12424,9 @@ msgstr "Ninguno. Seleccione los espacios de nombres a indexar."
msgid "Elastic|None. Select projects to index."
msgstr "Ninguno. Seleccione los proyectos a indexar."
+msgid "Eligible users"
+msgstr ""
+
msgid "Email"
msgstr "Correo electrónico"
@@ -12362,6 +12556,9 @@ msgstr "Archivo vacío"
msgid "Enable"
msgstr "Habilitar"
+msgid "Enable Amazon EKS integration"
+msgstr ""
+
msgid "Enable Auto DevOps"
msgstr "Activar Auto DevOps"
@@ -12395,6 +12592,9 @@ msgstr ""
msgid "Enable SSL verification"
msgstr "Habilitar verificación SSL"
+msgid "Enable Service Ping"
+msgstr ""
+
msgid "Enable Snowplow tracking"
msgstr ""
@@ -12425,6 +12625,9 @@ msgstr ""
msgid "Enable authenticated Git LFS request rate limit"
msgstr ""
+msgid "Enable authenticated web request rate limit"
+msgstr ""
+
msgid "Enable authentication"
msgstr ""
@@ -12485,7 +12688,7 @@ msgstr ""
msgid "Enable or disable the Pseudonymizer data collection."
msgstr "Habilitar o deshabilitar la recolección de datos con Pseudonymizer."
-msgid "Enable or disable version check and service ping."
+msgid "Enable or disable version check and Service Ping."
msgstr ""
msgid "Enable protected paths rate limit"
@@ -12497,18 +12700,12 @@ msgstr "Habilitar el proxy"
msgid "Enable reCAPTCHA"
msgstr "Habilitar reCAPTCHA"
-msgid "Enable reCAPTCHA for login"
-msgstr "Habilitar reCAPTCHA para iniciar sesión"
-
-msgid "Enable reCAPTCHA, Invisible Captcha, Akismet and set IP limits. For reCAPTCHA, we currently only support %{recaptcha_v2_link_start}v2%{recaptcha_v2_link_end}"
+msgid "Enable reCAPTCHA for login."
msgstr ""
msgid "Enable repository checks"
msgstr ""
-msgid "Enable service ping"
-msgstr ""
-
msgid "Enable shared runners for all projects and subgroups in this group."
msgstr ""
@@ -12530,7 +12727,10 @@ msgstr "Habilitar la autenticación de dos factores"
msgid "Enable unauthenticated API request rate limit"
msgstr ""
-msgid "Enable unauthenticated request rate limit"
+msgid "Enable unauthenticated web request rate limit"
+msgstr ""
+
+msgid "Enable user deactivation emails"
msgstr ""
msgid "Enable version check"
@@ -12566,9 +12766,6 @@ msgstr ""
msgid "Enabled sources for code import during project creation. OmniAuth must be configured for GitHub"
msgstr ""
-msgid "Enabling this will only make licensed EE features available to projects if the project namespace's plan includes the feature or if the project is public."
-msgstr "Habilitar esta opción solo hará que las funciones con licencia EE estén disponibles para los proyectos si el plan del espacio de nombres del proyecto incluye esta opción o si el proyecto es público."
-
msgid "Encountered an error while rendering: %{err}"
msgstr "Se ha producido un error al renderizar: %{err}"
@@ -12617,9 +12814,6 @@ msgstr "Introduzca el 2FA para el modo de administración"
msgid "Enter Admin Mode"
msgstr "Entrar en el modo de administración"
-msgid "Enter IP address range"
-msgstr "Introduzca un rango de direcciones IP"
-
msgid "Enter a number"
msgstr "Introduzca un número"
@@ -12632,9 +12826,6 @@ msgstr ""
msgid "Enter at least three characters to search"
msgstr "Introduzca al menos tres caracteres para buscar"
-msgid "Enter domain"
-msgstr "Introduzca un dominio"
-
msgid "Enter in your Bitbucket Server URL and personal access token below"
msgstr "Introduzca a continuación, la URL de su servidor de Bitbucket y su token de acceso personal"
@@ -12821,9 +13012,6 @@ msgstr "Despliegue"
msgid "Environments|Deployment %{status}"
msgstr ""
-msgid "Environments|Dismiss"
-msgstr ""
-
msgid "Environments|Enable review app"
msgstr ""
@@ -12836,9 +13024,6 @@ msgstr "Entornos"
msgid "Environments|Environments are places where code gets deployed, such as staging or production."
msgstr "Los entornos son lugares en los que se despliega el código, como por ejemplo, los entornos de test o los entornos de producción."
-msgid "Environments|Help us improve environments"
-msgstr ""
-
msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
msgstr "Instala Elastic Stack en su clúster para habilitar capacidades de consulta avanzadas, como búsqueda de texto completo."
@@ -12875,6 +13060,9 @@ msgstr "No hay pods para mostrar"
msgid "Environments|Note that this action will stop the environment, but it will %{emphasisStart}not%{emphasisEnd} have an effect on any existing deployment due to no “stop environment action†being defined in the %{ciConfigLinkStart}.gitlab-ci.yml%{ciConfigLinkEnd} file."
msgstr "Note que esta acción detendrá el entorno, pero %{emphasisStart}no%{emphasisEnd} tendrá ningún efecto sobre cualquier instancia debido a que no hay una \"acción para detener el entorno\" definida en el archivo %{ciConfigLinkStart}.gitlab-ci.yml%{ciConfigLinkEnd}."
+msgid "Environments|Open"
+msgstr ""
+
msgid "Environments|Open live environment"
msgstr "Entorno abierto"
@@ -12914,9 +13102,6 @@ msgstr "Detener entorno"
msgid "Environments|Stopping %{environmentName}"
msgstr ""
-msgid "Environments|Take the survey"
-msgstr ""
-
msgid "Environments|There was an error fetching the logs. Please try again."
msgstr ""
@@ -12938,9 +13123,6 @@ msgstr "Actualizado"
msgid "Environments|You don't have any environments right now"
msgstr "No tiene ningún entorno ahora mismo"
-msgid "Environments|Your feedback helps GitLab make environments better for you and other users. Participate and enter a sweepstake to win a USD 30 gift card."
-msgstr ""
-
msgid "Environments|by %{avatar}"
msgstr ""
@@ -13223,8 +13405,8 @@ msgstr "Se ha producido un error. El usuario no estaba desbloqueado"
msgid "Error parsing CSV file. Please make sure it has"
msgstr ""
-msgid "Error rendering markdown preview"
-msgstr "Se ha producido un error al renderizar la vista previa de markdown"
+msgid "Error rendering Markdown preview"
+msgstr ""
msgid "Error saving label update."
msgstr "Se ha producido un error al guardar la actualización de la etiqueta."
@@ -13271,6 +13453,9 @@ msgstr "Error con Akismet. Por favor, compruebe los registros de error para obte
msgid "Error: %{error_message}"
msgstr "Error: %{error_message}"
+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"
@@ -13304,6 +13489,9 @@ msgstr ""
msgid "ErrorTracking|Enable error tracking"
msgstr ""
+msgid "ErrorTracking|Error tracking backend"
+msgstr ""
+
msgid "ErrorTracking|If you self-host Sentry, enter your Sentry instance's full URL. If you use Sentry's hosted solution, enter https://sentry.io"
msgstr ""
@@ -13337,6 +13525,12 @@ msgstr ""
msgid "Escalation policies must have at least one rule"
msgstr ""
+msgid "EscalationPolicies|%{clockIcon} IF alert is not %{alertStatus} in %{minutes}"
+msgstr ""
+
+msgid "EscalationPolicies|%{notificationIcon} THEN %{doAction} %{forScheduleOrUser}"
+msgstr ""
+
msgid "EscalationPolicies|+ Add an additional rule"
msgstr ""
@@ -13379,13 +13573,13 @@ msgstr ""
msgid "EscalationPolicies|Escalation policies"
msgstr ""
-msgid "EscalationPolicies|Escalation rules"
+msgid "EscalationPolicies|Escalation policy %{obstacle} in Project %{project}"
msgstr ""
-msgid "EscalationPolicies|Failed to load oncall-schedules"
+msgid "EscalationPolicies|Escalation rules"
msgstr ""
-msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} %{then} THEN %{doAction} %{scheduleOrUser}"
+msgid "EscalationPolicies|Failed to load oncall-schedules"
msgstr ""
msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} minutes"
@@ -13463,18 +13657,36 @@ msgstr "Eventos"
msgid "Every %{action} attempt has failed: %{job_error_message}. Please try again."
msgstr "Cada intento de %{action} ha fallado: %{job_error_message}. Por favor, inténtalo de nuevo."
+msgid "Every 3 months"
+msgstr ""
+
+msgid "Every 3 months on the %{day} at %{time} %{timezone}"
+msgstr ""
+
+msgid "Every 6 months"
+msgstr ""
+
+msgid "Every 6 months on the %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Every day"
msgstr "Diario"
msgid "Every day (at %{time})"
msgstr "Todos los días (a %{time})"
+msgid "Every day at %{time} %{timezone}"
+msgstr ""
+
msgid "Every month"
msgstr "Cada mes"
msgid "Every month (Day %{day} at %{time})"
msgstr "Todos los meses (Día %{day} a %{time})"
+msgid "Every month on the %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Every three months"
msgstr "Cada tres meses"
@@ -13489,6 +13701,15 @@ msgstr[1] "Cada %d semanas"
msgid "Every week (%{weekday} at %{time})"
msgstr "Todas las semanas (%{weekday} a %{time})"
+msgid "Every week on %{day} at %{time} %{timezone}"
+msgstr ""
+
+msgid "Every year"
+msgstr ""
+
+msgid "Every year on %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Everyone"
msgstr "Todo el mundo"
@@ -13525,9 +13746,6 @@ msgstr "Recopilación de evidencias"
msgid "Exactly one of %{attributes} is required"
msgstr "Exactamente uno de los %{attributes} es necesario"
-msgid "Example: %{ip_address}. %{read_more_link}."
-msgstr "Ejemplo: %{ip_address}. %{read_more_link}."
-
msgid "Example: @sub\\.company\\.com$"
msgstr "Ejemplo: @sub\\.empresa\\.com$"
@@ -13594,15 +13812,15 @@ msgstr ""
msgid "Expand pipeline"
msgstr ""
+msgid "Expand settings section"
+msgstr ""
+
msgid "Expand sidebar"
msgstr "Expandir barra lateral"
msgid "Expected documents: %{expected_documents}"
msgstr "Documentos esperados: %{expected_documents}"
-msgid "Experienced"
-msgstr "Experiencia"
-
msgid "ExperimentSubject|Must have exactly one of User, Namespace, or Project."
msgstr ""
@@ -13885,9 +14103,6 @@ msgstr ""
msgid "Failed to load related branches"
msgstr "Se ha producido un error al cargar ramas relacionadas"
-msgid "Failed to load sidebar lock status"
-msgstr ""
-
msgid "Failed to load stacktrace."
msgstr "Se ha producido un error al cargar el stacktrace."
@@ -14312,6 +14527,9 @@ msgstr ""
msgid "Files"
msgstr "Archivos"
+msgid "Files API Rate Limits"
+msgstr ""
+
msgid "Files breadcrumb"
msgstr ""
@@ -15311,6 +15529,9 @@ msgstr "GitLab para Slack"
msgid "GitLab group: %{source_link}"
msgstr ""
+msgid "GitLab informs you if a new version is available."
+msgstr ""
+
msgid "GitLab is a complete DevOps platform, delivered as a single application, fundamentally changing the way Development, Security, and Ops teams collaborate"
msgstr ""
@@ -15326,7 +15547,7 @@ msgstr "GitLab está obteniendo un certificado SSL desde Let's Encrypt para este
msgid "GitLab is open source software to collaborate on code."
msgstr ""
-msgid "GitLab is undergoing maintenance and is operating in a read-only mode."
+msgid "GitLab is undergoing maintenance and is operating in read-only mode."
msgstr ""
msgid "GitLab member or Email address"
@@ -15338,9 +15559,6 @@ msgstr "URL de metadatos de GitLab"
msgid "GitLab project export"
msgstr "Exportar proyecto desde GitLab"
-msgid "GitLab restart is required to apply changes."
-msgstr "Es necesario reiniciar GitLab para aplicar los cambios."
-
msgid "GitLab single sign-on URL"
msgstr ""
@@ -15356,9 +15574,6 @@ msgstr ""
msgid "GitLab version"
msgstr ""
-msgid "GitLab will inform you if a new version is available."
-msgstr ""
-
msgid "GitLab will run a background job that will produce pseudonymized CSVs of the GitLab database that will be uploaded to your configured object storage directory."
msgstr "Gitlab ejecutará un trabajo como tarea de fondo que producirá un archivo CSV seudonimizado de la base de datos de Gitlab y que se cargará a su directorio de almacenamiento de objetos que tenga configurado."
@@ -15623,9 +15838,21 @@ msgstr "Ir al gráfico del repositorio"
msgid "Go to snippets"
msgstr "Ir a los fragmentos de código"
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check 'Allowed domains for sign-ups'."
+msgstr ""
+
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check 'Email restrictions for sign-ups'."
+msgstr ""
+
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check the 'Domain denylist'."
+msgstr ""
+
msgid "Go to the activity feed"
msgstr "Ir al feed de actividad"
+msgid "Go to the group’s 'Settings &gt; General' page, and check 'Restrict membership by email domain'."
+msgstr ""
+
msgid "Go to the milestone list"
msgstr "Ir a la lista de hitos"
@@ -15662,6 +15889,12 @@ msgstr "Ir a sus fragmentos de código"
msgid "Goal of the changes and what reviewers should be aware of"
msgstr ""
+msgid "Google Cloud"
+msgstr ""
+
+msgid "Google Cloud offers several deployment targets. Select the one most suitable for your project."
+msgstr ""
+
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr "La autenticación de Google no está %{link_start}configurada correctamente%{link_end}. Pregunte a su administrador de GitLab si desea utilizar este servicio."
@@ -15746,9 +15979,6 @@ msgstr "Hooks de grupo"
msgid "Group ID"
msgstr "Id de grupo"
-msgid "Group ID: %{group_id}"
-msgstr "ID de grupo: %{group_id}"
-
msgid "Group Owner must have signed in with SAML before enabling Group Managed Accounts"
msgstr "El propietario del grupo debe haber iniciado sesión con SAML antes de habilitar las cuentas administradas de grupo"
@@ -15923,6 +16153,12 @@ msgstr ""
msgid "GroupImport|Unable to process group import file"
msgstr ""
+msgid "GroupPage|Copy group ID"
+msgstr ""
+
+msgid "GroupPage|Group ID: %{group_id}"
+msgstr ""
+
msgid "GroupRoadmap|%{dateWord} – No end date"
msgstr ""
@@ -15977,6 +16213,9 @@ msgstr "Para ampliar su búsqueda, cambie o elimine los filtros; desde %{startDa
msgid "GroupRoadmap|Within 3 years"
msgstr ""
+msgid "GroupSAML|\"persistent\" recommended"
+msgstr ""
+
msgid "GroupSAML|%{strongOpen}Warning%{strongClose} - Enabling %{linkStart}SSO enforcement%{linkEnd} can reduce security risks."
msgstr ""
@@ -16109,6 +16348,9 @@ msgstr ""
msgid "GroupSAML|To be able to prohibit outer forks, you first need to enforce dedicate group managed accounts."
msgstr ""
+msgid "GroupSAML|Use SAML group links to manage group membership using SAML."
+msgstr ""
+
msgid "GroupSAML|Valid SAML Response"
msgstr "Respuesta SAML válida"
@@ -16121,13 +16363,10 @@ msgstr "Tu token SCIM"
msgid "GroupSAML|as %{access_level}"
msgstr ""
-msgid "GroupSAML|must match stored NameID of \"%{extern_uid}\" as we use this to identify users. If the NameID changes users will be unable to sign in."
+msgid "GroupSAML|must match stored NameID of \"%{extern_uid}\" to identify user and allow sign in"
msgstr ""
-msgid "GroupSAML|should be \"persistent\""
-msgstr "debe ser \"persistente\""
-
-msgid "GroupSAML|should be a random persistent ID, emails are discouraged"
+msgid "GroupSAML|recommend persistent ID instead of email"
msgstr ""
msgid "GroupSelect|No matching results"
@@ -16142,9 +16381,15 @@ msgstr ""
msgid "GroupSettings|Allow project access token creation"
msgstr ""
+msgid "GroupSettings|Applied to all subgroups unless overridden by a group owner. Groups already added to the project lose access."
+msgstr ""
+
msgid "GroupSettings|Auto DevOps pipeline was updated for the group"
msgstr "El pipeline Auto DevOps se actualizó para el grupo"
+msgid "GroupSettings|Available only on the top-level group. Applies to all subgroups. Groups already shared with a group outside %{group} are still shared unless removed manually."
+msgstr ""
+
msgid "GroupSettings|Badges"
msgstr "Insignias"
@@ -16196,6 +16441,9 @@ msgstr "Si la visibilidad del grupo principal es menor que la visibilidad actual
msgid "GroupSettings|New runners registration token has been generated!"
msgstr "¡Se ha generado el token de registro para los nuevos ejecutores!"
+msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgstr ""
+
msgid "GroupSettings|Pipeline settings was updated for the group"
msgstr "La configuración del pipeline se actualizó para el grupo"
@@ -16208,12 +16456,15 @@ msgstr ""
msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
-msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups."
+msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups"
msgstr ""
msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
msgstr "Prevenir que se comparta un proyecto de %{group} con otros grupos"
+msgid "GroupSettings|Prevents group members from being notified if the group is mentioned."
+msgstr ""
+
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
msgstr ""
@@ -16250,21 +16501,6 @@ msgstr "Esta configuración se aplica en %{ancestor_group}. Para compartir los p
msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}."
msgstr "Esta configuración se aplica en %{ancestor_group}. Puede sobrescribir la configuración o %{remove_ancestor_share_with_group_lock}."
-msgid "GroupSettings|This setting is only available on the top-level group and it applies to all subgroups. Groups that have already been shared with a group outside %{group} will still be shared, and this access will have to be revoked manually."
-msgstr ""
-
-msgid "GroupSettings|This setting will be applied to all subgroups unless overridden by a group owner. Groups that already have access to the project will continue to have access unless removed manually."
-msgstr "Esta configuración se aplicará a todos los subgrupos a menos que se sobrescriba por el propietario de un grupo. Los grupos que ya tienen acceso al proyecto seguirán teniendo acceso, a menos que estos permisos se eliminen manualmente."
-
-msgid "GroupSettings|This setting will override user notification preferences for all members of the group, subgroups, and projects."
-msgstr "Esta configuración sobrescribirá las preferencias de notificación del usuario para todos los miembros del grupo, los subgrupos y los proyectos."
-
-msgid "GroupSettings|This setting will prevent group members from being notified if the group is mentioned."
-msgstr ""
-
-msgid "GroupSettings|This setting will prevent group members from forking projects outside of the group."
-msgstr ""
-
msgid "GroupSettings|Transfer group"
msgstr "Transferir grupo"
@@ -16382,7 +16618,7 @@ msgstr ""
msgid "GroupsNew|No import options available"
msgstr ""
-msgid "GroupsNew|Not all related objects are migrated, as %{docs_link_start}described here%{docs_link_end}. Please %{feedback_link_start}leave feedback%{feedback_link_end} on this feature."
+msgid "GroupsNew|Not all related objects are migrated. %{docs_link_start}More info%{docs_link_end}."
msgstr ""
msgid "GroupsNew|Personal access token"
@@ -16514,15 +16750,27 @@ msgstr "Poco saludable"
msgid "Hello %{name},"
msgstr "Hola %{name},"
-msgid "Hello there"
-msgstr "¡Hola!"
-
msgid "Hello, %{name}!"
msgstr "¡Hola, %{name}!"
msgid "Hello, %{username}!"
msgstr "¡Hola, %{username}!"
+msgid "HelloMessage|%{handshake_emoji} Contribute to GitLab: %{contribute_link}"
+msgstr ""
+
+msgid "HelloMessage|%{magnifier_emoji} Create a new GitLab issue: %{new_issue_link}"
+msgstr ""
+
+msgid "HelloMessage|%{rocket_emoji} We like your curiosity! Help us improve GitLab by joining the team: %{jobs_page_link}"
+msgstr ""
+
+msgid "HelloMessage|Does this page need fixes or improvements? Open an issue or contribute a merge request to help make GitLab more lovable. At GitLab, everyone can contribute!"
+msgstr ""
+
+msgid "HelloMessage|Welcome to GitLab!"
+msgstr ""
+
msgid "Help"
msgstr "Ayuda"
@@ -16532,13 +16780,10 @@ msgstr "Ayuda a evitar que los bots realicen ataques de fuerza bruta."
msgid "Helps prevent bots from creating accounts."
msgstr "Ayuda a evitar que los bots creen nuevas cuentas."
-msgid "Helps prevent bots from creating issues"
+msgid "Helps prevent bots from creating issues."
msgstr ""
-msgid "Helps prevent malicious users hide their activity"
-msgstr ""
-
-msgid "Helps reduce request volume (e.g. from crawlers or abusive bots)"
+msgid "Helps prevent malicious users hide their activity."
msgstr ""
msgid "Helps reduce request volume (for example, from crawlers or abusive bots)"
@@ -16662,6 +16907,12 @@ msgstr "Servicio de limpieza iniciado con éxito"
msgid "Housekeeping, export, path, transfer, remove, archive."
msgstr "Tareas de mantenimiento, exportación, ruta, transferencia, eliminación, archivo."
+msgid "How do I configure Akismet?"
+msgstr ""
+
+msgid "How do I configure it?"
+msgstr ""
+
msgid "How do I configure runners?"
msgstr ""
@@ -16683,21 +16934,27 @@ msgstr ""
msgid "How do I set up this service?"
msgstr ""
+msgid "How do I use a web terminal?"
+msgstr ""
+
+msgid "How do I use file templates?"
+msgstr ""
+
msgid "How it works"
msgstr "Cómo funciona"
msgid "How many days need to pass between marking entity for deletion and actual removing it."
msgstr ""
-msgid "How many seconds an IP will be counted towards the limit"
+msgid "How many seconds an IP counts toward the IP address limit."
+msgstr ""
+
+msgid "How the job limiter handles jobs exceeding the thresholds specified below. The 'track' mode only logs the jobs. The 'compress' mode compresses the jobs and raises an exception if the compressed size exceeds the limit."
msgstr ""
msgid "I accept the %{terms_link}"
msgstr "Aceptar los %{terms_link}"
-msgid "I accept the|Terms of Service and Privacy Policy"
-msgstr ""
-
msgid "I forgot my password"
msgstr "He olvidado mi contraseña"
@@ -16779,15 +17036,18 @@ msgstr "INFO: Su clave SSH caducará pronto. Por favor genere una nueva clave."
msgid "IP Address"
msgstr "Direccion IP"
-msgid "IP expiration time"
+msgid "IP address expiration time"
msgstr ""
-msgid "IP subnet restriction only allowed for top-level groups"
-msgstr "La restricción de la subred IP solo está permitida en grupos de nivel superior"
+msgid "IP address restrictions"
+msgstr ""
-msgid "IPs per user"
+msgid "IP addresses per user"
msgstr ""
+msgid "IP subnet restriction only allowed for top-level groups"
+msgstr "La restricción de la subred IP solo está permitida en grupos de nivel superior"
+
msgid "Identifier"
msgstr "Identificador"
@@ -16800,6 +17060,9 @@ msgstr "Identidades"
msgid "If any indexed field exceeds this limit it will be truncated to this number of characters and the rest will not be indexed or searchable. This does not apply to repository and wiki indexing. Setting this to 0 means it is unlimited."
msgstr ""
+msgid "If blank, defaults to %{code_open}Retry later%{code_close}."
+msgstr ""
+
msgid "If blank, set allowable lifetime to %{instance_level_policy_in_words}, as defined by the instance admin. Once set, existing tokens for users in this group may be revoked."
msgstr ""
@@ -16851,6 +17114,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 did not initiate these sign-in attempts, please reach out to your administrator or enable two-factor authentication (2FA) on your account."
+msgstr ""
+
msgid "If you did not initiate this change, please contact your administrator immediately."
msgstr ""
@@ -16942,12 +17208,12 @@ msgstr "Importar CSV"
msgid "Import Projects from Gitea"
msgstr "Importar proyectos desde Gitea"
-msgid "Import a project"
-msgstr ""
-
msgid "Import an exported GitLab project"
msgstr "Importar un proyecto exportado desde GitLab"
+msgid "Import and export rate limits"
+msgstr ""
+
msgid "Import failed due to a GitHub error: %{original}"
msgstr ""
@@ -16957,12 +17223,18 @@ msgstr "Importar desde"
msgid "Import from Jira"
msgstr "Importado desde JIRA"
+msgid "Import group"
+msgstr ""
+
msgid "Import group from file"
msgstr ""
msgid "Import groups"
msgstr "Importar grupos"
+msgid "Import history"
+msgstr ""
+
msgid "Import in progress"
msgstr "Importación en progreso"
@@ -17026,7 +17298,25 @@ msgstr "Importar tareas desde Phabricator como incidencias"
msgid "Import timed out. Import took longer than %{import_jobs_expiration} seconds"
msgstr "Se agotó el tiempo de espera para el proceso de importación. Este proceso ha tardado más de %{import_jobs_expiration} segundos"
-msgid "Import/Export Rate Limits"
+msgid "ImportAProjectModal|Import from a project"
+msgstr ""
+
+msgid "ImportAProjectModal|Import members from another project"
+msgstr ""
+
+msgid "ImportAProjectModal|Import project members"
+msgstr ""
+
+msgid "ImportAProjectModal|Only project members (not group members) are imported, and they get the same permissions as the project you import from."
+msgstr ""
+
+msgid "ImportAProjectModal|Successfully imported"
+msgstr ""
+
+msgid "ImportAProjectModal|Unable to import project members"
+msgstr ""
+
+msgid "ImportAProjectModal|You're importing members to the %{strongStart}%{name}%{strongEnd} project."
msgstr ""
msgid "ImportButtons|Connect repositories from"
@@ -17079,7 +17369,7 @@ msgstr[1] ""
msgid "Importing..."
msgstr ""
-msgid "Import|A repository URL usually ends in a .git suffix, although this is not required. Double check to make sure your repository URL is correct."
+msgid "Import|There is not a valid Git repository at this URL. If your HTTP repository is not publicly accessible, verify your credentials."
msgstr ""
msgid "Improve customer support with Service Desk"
@@ -17088,9 +17378,6 @@ msgstr ""
msgid "Improves Git cloning performance."
msgstr ""
-msgid "In %{time_to_now}"
-msgstr "En %{time_to_now}"
-
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 ""
@@ -17376,7 +17663,7 @@ msgstr ""
msgid "InProductMarketing|Start a GitLab Ultimate trial today in less than one minute, no credit card required."
msgstr ""
-msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no CC required"
+msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no credit card required"
msgstr ""
msgid "InProductMarketing|Start a trial"
@@ -17415,7 +17702,7 @@ msgstr ""
msgid "InProductMarketing|Team up in GitLab for greater efficiency"
msgstr ""
-msgid "InProductMarketing|Team work makes the dream work"
+msgid "InProductMarketing|Team work makes the dream work"
msgstr ""
msgid "InProductMarketing|Test, create, deploy"
@@ -17996,6 +18283,9 @@ msgstr "Conexión exitosa."
msgid "Integrations|Create new issue in Jira"
msgstr "Crear nueva incidencia en Jira"
+msgid "Integrations|Create new issue in ZenTao"
+msgstr ""
+
msgid "Integrations|Default settings are inherited from the group level."
msgstr ""
@@ -18089,9 +18379,15 @@ msgstr ""
msgid "Integrations|Search Jira issues"
msgstr ""
+msgid "Integrations|Search ZenTao issues"
+msgstr ""
+
msgid "Integrations|Send notifications about project events to Unify Circuit."
msgstr ""
+msgid "Integrations|Send notifications about project events to a Unify Circuit conversation. %{docs_link}"
+msgstr ""
+
msgid "Integrations|Sign in to add namespaces"
msgstr ""
@@ -18131,6 +18427,9 @@ msgstr ""
msgid "Integrations|You've activated every integration 🎉"
msgstr ""
+msgid "Integrations|ZenTao issues display here when you create issues in your project in ZenTao."
+msgstr ""
+
msgid "Interactive mode"
msgstr "Modo interactivo"
@@ -18158,9 +18457,6 @@ msgstr ""
msgid "Interval Pattern"
msgstr "Patrón de intervalo"
-msgid "Introducing Value Stream Analytics"
-msgstr ""
-
msgid "Introducing Your DevOps Report"
msgstr ""
@@ -18257,6 +18553,12 @@ msgstr "Yaml no válido"
msgid "Investigate vulnerability: %{title}"
msgstr "Investigar vulnerabilidad: %{title}"
+msgid "Invisible Captcha"
+msgstr ""
+
+msgid "Invisible Captcha helps prevent the creation of spam accounts. It adds a honeypot field and time-sensitive form submission to the account signup form."
+msgstr ""
+
msgid "Invitation"
msgstr "Invitación"
@@ -18710,12 +19012,18 @@ msgstr ""
msgid "Issues"
msgstr "Incidencias"
+msgid "Issues I've created"
+msgstr ""
+
msgid "Issues Rate Limits"
msgstr ""
msgid "Issues and merge requests"
msgstr ""
+msgid "Issues assigned to me"
+msgstr ""
+
msgid "Issues can be bugs, tasks or ideas to be discussed. Also, issues are searchable and filterable."
msgstr "Las incidencias pueden ser errores, tareas o ideas para ser discutidas. Además, las mismas, pueden ser buscadas y filtradas."
@@ -18827,7 +19135,7 @@ msgstr ""
msgid "Iterations|Create cadence"
msgstr ""
-msgid "Iterations|Create your first iteration"
+msgid "Iterations|Create iteration"
msgstr ""
msgid "Iterations|Delete cadence"
@@ -18836,6 +19144,9 @@ msgstr ""
msgid "Iterations|Delete iteration cadence?"
msgstr ""
+msgid "Iterations|Delete iteration?"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr "Duración"
@@ -18869,12 +19180,18 @@ msgstr ""
msgid "Iterations|New iteration cadence"
msgstr ""
+msgid "Iterations|No closed iterations."
+msgstr ""
+
msgid "Iterations|No iteration cadences to show."
msgstr ""
msgid "Iterations|No iterations in cadence."
msgstr ""
+msgid "Iterations|No open iterations."
+msgstr ""
+
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
@@ -18905,6 +19222,9 @@ msgstr ""
msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
msgstr ""
+msgid "Iterations|This will remove the iteration from any issues that are assigned to it."
+msgstr ""
+
msgid "Iterations|Title"
msgstr "Título"
@@ -18920,15 +19240,9 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "I’m familiar with the basics of DevOps."
-msgstr "Estoy familiarizado con los conceptos básicos de DevOps."
-
msgid "I’m joining my team who’s already on GitLab"
msgstr "Me estoy uniendo a mi equipo que ya está en GitLab"
-msgid "I’m not familiar with the basics of DevOps."
-msgstr "No estoy familiarizado con los conceptos básicos de DevOps."
-
msgid "Jaeger URL"
msgstr "URL de Jaeger"
@@ -19193,6 +19507,9 @@ msgstr ""
msgid "Job"
msgstr "Trabajo"
+msgid "Job %{jobName}"
+msgstr ""
+
msgid "Job Failed #%{build_id}"
msgstr "Trabajo fallido #%{build_id}"
@@ -19783,9 +20100,6 @@ msgstr "Más información sobre los commits firmados"
msgid "Learn more in the"
msgstr "Más información en la"
-msgid "Learn more in the|pipeline schedules documentation"
-msgstr "documentación sobre la programación de pipelines"
-
msgid "Learn more."
msgstr "Obtener mas información."
@@ -19897,9 +20211,6 @@ msgstr "Abandonar"
msgid "Leave Admin Mode"
msgstr "Salir del modo administrador"
-msgid "Leave blank for no limit. Once set, existing personal access tokens may be revoked."
-msgstr ""
-
msgid "Leave edit mode? All unsaved changes will be lost."
msgstr "¿Desea salir del modo de edición? Se perderán todos los cambios no guardados."
@@ -19945,12 +20256,12 @@ msgstr ""
msgid "LicenseCompliance|Acceptable license to be used in the project"
msgstr ""
-msgid "LicenseCompliance|Add a license"
-msgstr "Agregar una licencia"
-
msgid "LicenseCompliance|Add license and related policy"
msgstr "Añadir una licencia y una política relacionada"
+msgid "LicenseCompliance|Add license policy"
+msgstr ""
+
msgid "LicenseCompliance|Allow"
msgstr "Permitir"
@@ -20038,6 +20349,9 @@ msgstr ""
msgid "LicenseManagement|Uncategorized"
msgstr ""
+msgid "Licensed Enterprise Edition features can be used if the project namespace's plan includes the feature, or if the project is public."
+msgstr ""
+
msgid "Licensed Features"
msgstr "Características licenciadas"
@@ -20104,7 +20418,10 @@ msgstr "Limitar la visualización de las unidades de seguimiento de tiempo a hor
msgid "Limit namespaces and projects that can be indexed"
msgstr "Limitar los espacios de nombres y los proyectos que se pueden indexar"
-msgid "Limit sign in from multiple ips"
+msgid "Limit project size at a global, group, and project level. %{link_start}Learn more%{link_end}."
+msgstr ""
+
+msgid "Limit sign in from multiple IP addresses"
msgstr ""
msgid "Limit the number of concurrent operations this secondary site can run in the background."
@@ -20116,11 +20433,17 @@ msgstr ""
msgid "Limit the number of issues and epics per minute a user can create through web and API requests."
msgstr ""
+msgid "Limit the size of Sidekiq jobs stored in Redis."
+msgstr ""
+
msgid "Limited to showing %d event at most"
msgid_plural "Limited to showing %d events at most"
msgstr[0] "Limitado a mostrar %d evento como máximo"
msgstr[1] "Limitado a mostrar %d eventos como máximo"
+msgid "Limiting mode"
+msgstr ""
+
msgid "Line changes"
msgstr "Cambios de línea"
@@ -20190,9 +20513,6 @@ msgstr "Lista de repositorios disponibles"
msgid "List of all merge commits"
msgstr ""
-msgid "List of users to be excluded from the limit"
-msgstr ""
-
msgid "List options"
msgstr ""
@@ -20232,9 +20552,6 @@ msgstr "Cargando archivos, directorios y submódulos en la ruta %{path} para la
msgid "Loading functions timed out. Please reload the page to try again."
msgstr "Se agotó el tiempo de espera al cargar las funciones. Por favor, vuelva a cargar la página e inténtelo de nuevo."
-msgid "Loading issues"
-msgstr "Cargando incidencias"
-
msgid "Loading more"
msgstr ""
@@ -20526,6 +20843,9 @@ msgstr "Añadir texto en cursiva (%{modifier_key}I)"
msgid "Marked For Deletion At - %{deletion_time}"
msgstr ""
+msgid "Marked as ready. Merging is now allowed."
+msgstr ""
+
msgid "Marked this %{noun} as a draft."
msgstr ""
@@ -20598,52 +20918,22 @@ msgstr ""
msgid "Max 100,000 events"
msgstr ""
-msgid "Max 20 characters"
-msgstr ""
-
-msgid "Max Group Export Download requests per minute per user"
-msgstr ""
-
-msgid "Max Group Export requests per minute per user"
-msgstr ""
-
-msgid "Max Group Import requests per minute per user"
-msgstr ""
-
-msgid "Max Project Export Download requests per minute per user"
-msgstr ""
-
-msgid "Max Project Export requests per minute per user"
-msgstr ""
-
-msgid "Max Project Import requests per minute per user"
-msgstr ""
-
-msgid "Max authenticated API requests per period per user"
-msgstr ""
-
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
-msgid "Max authenticated web requests per period per user"
-msgstr ""
-
msgid "Max file size is 200 KB."
msgstr ""
-msgid "Max requests per minute per user"
-msgstr ""
-
msgid "Max role"
msgstr ""
msgid "Max session time"
msgstr ""
-msgid "Max unauthenticated requests per period per IP"
+msgid "MaxBuilds"
msgstr ""
-msgid "MaxBuilds"
+msgid "Maximum 20 characters"
msgstr ""
msgid "Maximum Conan package file size in bytes"
@@ -20679,6 +20969,12 @@ msgstr ""
msgid "Maximum attachment size (MB)"
msgstr "Tamaño máximo del archivo adjunto (MB)"
+msgid "Maximum authenticated API requests per rate limit period per user"
+msgstr ""
+
+msgid "Maximum authenticated web requests per rate limit period per user"
+msgstr ""
+
msgid "Maximum bulk request size (MiB)"
msgstr ""
@@ -20724,6 +21020,15 @@ msgstr ""
msgid "Maximum files in a diff"
msgstr ""
+msgid "Maximum group export download requests per minute"
+msgstr ""
+
+msgid "Maximum group export requests per minute"
+msgstr ""
+
+msgid "Maximum group import requests per minute"
+msgstr ""
+
msgid "Maximum import size"
msgstr ""
@@ -20760,7 +21065,7 @@ msgstr "Número máximo de réplicas que se pueden sincronizar al mismo tiempo."
msgid "Maximum number of projects."
msgstr "Número máximo de proyectos."
-msgid "Maximum number of unique IPs per user"
+msgid "Maximum number of unique IP addresses per user."
msgstr ""
msgid "Maximum page reached"
@@ -20769,12 +21074,24 @@ msgstr ""
msgid "Maximum page size"
msgstr ""
+msgid "Maximum project export download requests per minute"
+msgstr ""
+
+msgid "Maximum project export requests per minute"
+msgstr ""
+
+msgid "Maximum project import requests per minute"
+msgstr ""
+
msgid "Maximum push size"
msgstr ""
msgid "Maximum push size (MB)"
msgstr "Tamaño máximo para los archivos a subir al ejecutar un comando push (MB)"
+msgid "Maximum requests per minute"
+msgstr ""
+
msgid "Maximum running slices"
msgstr ""
@@ -20802,10 +21119,16 @@ msgstr ""
msgid "Maximum time between updates that a mirror can have when scheduled to synchronize."
msgstr "El tiempo máximo entre las actualizaciones que puede esperar una réplica cuando está programada para sincronizarse."
-msgid "Maximum time for web terminal websocket connection (in seconds). 0 for unlimited."
+msgid "Maximum time that users are allowed to skip the setup of two-factor authentication (in hours). Set to 0 (zero) to enforce at next sign in."
+msgstr ""
+
+msgid "Maximum time, in seconds, for a web terminal websocket connection. 0 for unlimited."
msgstr ""
-msgid "Maximum 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."
+msgid "Maximum unauthenticated API requests per rate limit period per IP"
+msgstr ""
+
+msgid "Maximum unauthenticated web requests per rate limit period per IP"
msgstr ""
msgid "May"
@@ -20823,9 +21146,6 @@ msgstr ""
msgid "Medium vulnerabilities present"
msgstr "Vulnerabilidades de tipo medio presentes"
-msgid "Member lock"
-msgstr "Bloqueo de miembros"
-
msgid "Member since"
msgstr ""
@@ -20862,6 +21182,9 @@ msgstr ""
msgid "Members of a group may only view projects they have permission to access"
msgstr ""
+msgid "Membership"
+msgstr ""
+
msgid "Members|%{time} by %{user}"
msgstr ""
@@ -20922,9 +21245,6 @@ msgstr ""
msgid "Members|Expiration date updated successfully."
msgstr ""
-msgid "Members|Expired"
-msgstr ""
-
msgid "Members|Filter members"
msgstr ""
@@ -20940,9 +21260,6 @@ msgstr ""
msgid "Members|Membership"
msgstr ""
-msgid "Members|No expiration set"
-msgstr ""
-
msgid "Members|Remove \"%{groupName}\""
msgstr ""
@@ -20964,9 +21281,6 @@ msgstr ""
msgid "Members|Search invited"
msgstr ""
-msgid "Members|in %{time}"
-msgstr ""
-
msgid "Member|Deny access"
msgstr ""
@@ -21042,9 +21356,6 @@ msgstr "Merge request"
msgid "Merge request %{mr_link} was reviewed by %{mr_author}"
msgstr ""
-msgid "Merge request (MR) approvals"
-msgstr ""
-
msgid "Merge request analytics"
msgstr ""
@@ -21066,12 +21377,21 @@ msgstr ""
msgid "Merge requests"
msgstr "Merge requests"
+msgid "Merge requests I've created"
+msgstr ""
+
msgid "Merge requests are a place to propose changes you've made to a project and discuss those changes with others"
msgstr "Los merge request son un lugar para proponer los cambios que ha realizado en un proyecto y discutir esos cambios con otros miembros"
msgid "Merge requests are read-only in a secondary Geo node"
msgstr "Los merge requests son de solo lectura en un Geo nodo secundario"
+msgid "Merge requests assigned to me"
+msgstr ""
+
+msgid "Merge requests that I'm a reviewer"
+msgstr ""
+
msgid "Merge the branch and fix any conflicts that come up"
msgstr ""
@@ -21132,12 +21452,12 @@ msgstr ""
msgid "MergeRequests|An error occurred while saving the draft comment."
msgstr "Se ha producido un error al guardar el borrador del comentario."
+msgid "MergeRequests|Create issue to resolve thread"
+msgstr ""
+
msgid "MergeRequests|Failed to squash. Should be done manually."
msgstr "Se ha producido un error al realizar el squash. Debe hacerse de forma manual."
-msgid "MergeRequests|Resolve this thread in a new issue"
-msgstr "Resolver este hilo en una nueva incidencia"
-
msgid "MergeRequests|Saving the comment failed"
msgstr "Se ha producido un error al guardar el comentario"
@@ -21949,6 +22269,9 @@ msgstr "¡No se puede mover la incidencia debido a permisos insuficientes!"
msgid "MoveIssue|Cannot move issue to project it originates from!"
msgstr "¡No se puede mover la incidencia al proyecto en el que se crea!"
+msgid "MoveIssue|Cannot move issues of '%{issue_type}' type."
+msgstr ""
+
msgid "Moved issue to %{label} column in the board."
msgstr "Se ha movido la incidencia para %{label} la columna del tablero."
@@ -22074,6 +22397,15 @@ 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. To learn more about reducing storage capacity please visit our docs."
msgstr ""
+msgid "NamespaceUserCap|Pending users must be reviewed and approved by a group owner. Learn more about %{user_caps_link_start}User Caps%{link_end} and %{users_pending_approval_link_start}Users Pending Approval%{link_end}."
+msgstr ""
+
+msgid "NamespaceUserCap|View pending user approvals"
+msgstr ""
+
+msgid "NamespaceUserCap|Your group has reached its billable member limit"
+msgstr ""
+
msgid "Namespaces"
msgstr ""
@@ -22116,9 +22448,6 @@ msgstr "Necesita atención"
msgid "Network"
msgstr "Red"
-msgid "Network Policy|New rule"
-msgstr ""
-
msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is inbound from a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
msgstr ""
@@ -22140,16 +22469,13 @@ msgstr ""
msgid "NetworkPolicies|%{strongOpen}any%{strongClose} port"
msgstr ""
-msgid "NetworkPolicies|+ Add alert"
-msgstr ""
-
msgid "NetworkPolicies|.yaml"
msgstr ""
msgid "NetworkPolicies|.yaml mode"
msgstr ""
-msgid "NetworkPolicies|Actions"
+msgid "NetworkPolicies|Add alert"
msgstr ""
msgid "NetworkPolicies|Alerts are intended to be selectively used for a limited number of events that are potentially concerning and warrant a manual review. Alerts should not be used as a substitute for a SIEM or a logging tool. High volume alerts are likely to be dropped so as to preserve the stability of GitLab's integration with Kubernetes."
@@ -22185,9 +22511,6 @@ msgstr ""
msgid "NetworkPolicies|Deny all traffic"
msgstr ""
-msgid "NetworkPolicies|Description"
-msgstr ""
-
msgid "NetworkPolicies|Edit policy"
msgstr ""
@@ -22200,9 +22523,6 @@ msgstr ""
msgid "NetworkPolicies|IP/subnet"
msgstr ""
-msgid "NetworkPolicies|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
-msgstr ""
-
msgid "NetworkPolicies|Invalid or empty policy"
msgstr "Política no válida o vacía"
@@ -22212,20 +22532,17 @@ msgstr ""
msgid "NetworkPolicies|Kubernetes error: %{error}"
msgstr "Error de Kubernetes: %{error}"
-msgid "NetworkPolicies|Name"
-msgstr "Nombre"
-
msgid "NetworkPolicies|Network"
msgstr ""
-msgid "NetworkPolicies|Network traffic"
+msgid "NetworkPolicies|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
msgstr ""
-msgid "NetworkPolicies|New policy"
+msgid "NetworkPolicies|Network policy can be created after the environment is loaded successfully."
msgstr ""
-msgid "NetworkPolicies|No policies detected"
-msgstr "No se han detectado políticas"
+msgid "NetworkPolicies|Network traffic"
+msgstr ""
msgid "NetworkPolicies|None selected"
msgstr ""
@@ -22233,21 +22550,12 @@ msgstr ""
msgid "NetworkPolicies|Please %{installLinkStart}install%{installLinkEnd} and %{configureLinkStart}configure a Kubernetes Agent for this project%{configureLinkEnd} to enable alerts."
msgstr ""
-msgid "NetworkPolicies|Policies are a specification of how groups of pods are allowed to communicate with each other's network endpoints."
-msgstr "Las políticas son una especificación de cómo se permite a los grupos de pods comunicarse con los extremos de red de los demás."
-
msgid "NetworkPolicies|Policy %{policyName} was successfully changed"
msgstr ""
msgid "NetworkPolicies|Policy definition"
msgstr "Definición de la política"
-msgid "NetworkPolicies|Policy editor"
-msgstr ""
-
-msgid "NetworkPolicies|Policy preview"
-msgstr ""
-
msgid "NetworkPolicies|Rule"
msgstr ""
@@ -22257,9 +22565,6 @@ msgstr ""
msgid "NetworkPolicies|Rule mode is unavailable for this policy. In some cases, we cannot parse the YAML file back into the rules editor."
msgstr ""
-msgid "NetworkPolicies|Rules"
-msgstr ""
-
msgid "NetworkPolicies|Save changes"
msgstr ""
@@ -22272,9 +22577,6 @@ msgstr "Algo salió mal, se ha producido un error al obtener las políticas"
msgid "NetworkPolicies|Traffic that does not match any rule will be blocked."
msgstr ""
-msgid "NetworkPolicies|Unable to parse policy"
-msgstr ""
-
msgid "NetworkPolicies|all DNS names"
msgstr ""
@@ -22454,6 +22756,9 @@ msgstr "Nueva identidad"
msgid "New issue"
msgstr "Nueva incidencia"
+msgid "New issue in %{project}"
+msgstr ""
+
msgid "New issue title"
msgstr "Nuevo título de la incidencia"
@@ -22532,8 +22837,8 @@ msgstr "Nuevo..."
msgid "Newest first"
msgstr "La más reciente primero"
-msgid "Newly registered users will by default be external"
-msgstr "Los usuarios recién registrados serán creados, por defecto, como externos"
+msgid "Newly-registered users are external by default"
+msgstr ""
msgid "Next"
msgstr "Siguiente"
@@ -22847,8 +23152,10 @@ msgstr "No se han encontrado vulnerabilidades"
msgid "No webhooks found, add one in the form above."
msgstr ""
-msgid "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} to renew your subscription."
-msgstr ""
+msgid "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} day to renew your subscription."
+msgid_plural "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} days to renew your subscription."
+msgstr[0] ""
+msgstr[1] ""
msgid "No. of commits"
msgstr "Número de commits"
@@ -22865,7 +23172,7 @@ msgstr "El nodo se actualizó correctamente."
msgid "Nodes"
msgstr "Nodos"
-msgid "Non-admin users can sign in with read-only access and make read-only API requests."
+msgid "Non-admin users are restricted to read-only access, in both GitLab UI and API."
msgstr ""
msgid "None"
@@ -22946,7 +23253,7 @@ msgstr "Nota: Considere pedirle a su administrador de GitLab que configure %{git
msgid "NoteForm|Note"
msgstr "Nota"
-msgid "Notes Rate Limits"
+msgid "Notes rate limit"
msgstr ""
msgid "Notes|Are you sure you want to cancel creating this comment?"
@@ -23113,9 +23420,6 @@ msgstr "Nov"
msgid "November"
msgstr "Noviembre"
-msgid "Novice"
-msgstr "Novato"
-
msgid "Now, personalize your GitLab experience"
msgstr ""
@@ -23284,7 +23588,7 @@ msgstr ""
msgid "OnCallSchedules|For this rotation, on-call will be:"
msgstr ""
-msgid "OnCallSchedules|On-call schedule %{schedule} in Project %{project}"
+msgid "OnCallSchedules|On-call schedule %{obstacle} in Project %{project}"
msgstr ""
msgid "OnCallSchedules|On-call schedules"
@@ -23431,22 +23735,22 @@ msgstr ""
msgid "OnDemandScans|Scanner profile"
msgstr ""
-msgid "OnDemandScans|Select one of the existing profiles"
+msgid "OnDemandScans|Schedule scan"
msgstr ""
-msgid "OnDemandScans|Site profile"
+msgid "OnDemandScans|Select one of the existing profiles"
msgstr ""
-msgid "OnDemandScans|Use existing scanner profile"
+msgid "OnDemandScans|Site profile"
msgstr ""
-msgid "OnDemandScans|Use existing site profile"
+msgid "OnDemandScans|Start time"
msgstr ""
-msgid "OnDemandScans|You can either choose a passive scan or validate the target site in your chosen site profile. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
+msgid "OnDemandScans|Use existing scanner profile"
msgstr ""
-msgid "OnDemandScans|You cannot run an active scan against an unvalidated site."
+msgid "OnDemandScans|Use existing site profile"
msgstr ""
msgid "OnDemandScans|You must create a repository within your project to run an on-demand scan."
@@ -23511,6 +23815,9 @@ msgstr ""
msgid "Only admins can delete project"
msgstr "Solo los administradores pueden borrar un proyecto"
+msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
+msgstr ""
+
msgid "Only include features new to your current subscription tier."
msgstr ""
@@ -23529,6 +23836,12 @@ msgstr "Solo se importarán los miembros del proyecto. Los miembros del grupo se
msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
+msgid "Only reCAPTCHA v2 is supported:"
+msgstr ""
+
+msgid "Only users from the specified IP address ranges are able to reach this group, including all subgroups, projects, and Git repositories."
+msgstr ""
+
msgid "Only verified users with an email address in any of these domains can be added to the group."
msgstr ""
@@ -23715,9 +24028,6 @@ msgstr "Propietario"
msgid "Package Registry"
msgstr "Registro de paquetes"
-msgid "Package Registry Rate Limits"
-msgstr ""
-
msgid "Package Registry: authenticated API requests"
msgstr ""
@@ -23736,6 +24046,9 @@ msgstr ""
msgid "Package recipe already exists"
msgstr "La receta del paquete ya existe"
+msgid "Package registry rate limits"
+msgstr ""
+
msgid "Package type"
msgstr ""
@@ -23802,6 +24115,9 @@ msgstr ""
msgid "PackageRegistry|Composer"
msgstr ""
+msgid "PackageRegistry|Composer.json with license: %{license} and version: %{version}"
+msgstr ""
+
msgid "PackageRegistry|Conan"
msgstr "Conan"
@@ -23865,6 +24181,9 @@ msgstr ""
msgid "PackageRegistry|Copy require package include"
msgstr ""
+msgid "PackageRegistry|Copy target SHA"
+msgstr ""
+
msgid "PackageRegistry|Copy yarn command"
msgstr "Copiar comando yarn"
@@ -23931,6 +24250,9 @@ msgstr "Si aún no lo ha hecho, debe añadir lo siguiente a su archivo %{codeSta
msgid "PackageRegistry|Install package version"
msgstr ""
+msgid "PackageRegistry|Instance-level"
+msgstr ""
+
msgid "PackageRegistry|Invalid Package: failed metadata extraction"
msgstr ""
@@ -23976,6 +24298,9 @@ msgstr ""
msgid "PackageRegistry|Pip Command"
msgstr "Comando Pip"
+msgid "PackageRegistry|Project-level"
+msgstr ""
+
msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
msgstr ""
@@ -23997,6 +24322,9 @@ msgstr ""
msgid "PackageRegistry|Remove package"
msgstr "Eliminar paquete"
+msgid "PackageRegistry|Required Python: %{pythonVersion}"
+msgstr ""
+
msgid "PackageRegistry|RubyGems"
msgstr ""
@@ -24039,6 +24367,9 @@ msgstr ""
msgid "PackageRegistry|Source project located at %{link}"
msgstr ""
+msgid "PackageRegistry|Target SHA: %{sha}"
+msgstr ""
+
msgid "PackageRegistry|There are no other versions of this package."
msgstr ""
@@ -24207,6 +24538,18 @@ msgstr "La contraseña se ha cambiado correctamente"
msgid "Password was successfully updated. Please sign in again."
msgstr ""
+msgid "PasswordPrompt|Confirm password"
+msgstr ""
+
+msgid "PasswordPrompt|Confirm password to continue"
+msgstr ""
+
+msgid "PasswordPrompt|Password is required"
+msgstr ""
+
+msgid "PasswordPrompt|Please enter your password to confirm"
+msgstr ""
+
msgid "Passwords should be unique and not used for any other sites or services."
msgstr ""
@@ -24234,6 +24577,9 @@ msgstr "Pegar el enlace de la incidencia"
msgid "Paste project path (i.e. gitlab-org/gitlab)"
msgstr ""
+msgid "Paste this DSN into your Sentry SDK"
+msgstr ""
+
msgid "Paste your public SSH key, which is usually contained in the file '~/.ssh/id_ed25519.pub' or '~/.ssh/id_rsa.pub' and begins with 'ssh-ed25519' or 'ssh-rsa'. Do not paste your private SSH key, as that can compromise your identity."
msgstr ""
@@ -24318,6 +24664,9 @@ msgstr ""
msgid "PerformanceBar|First Contentful Paint"
msgstr ""
+msgid "PerformanceBar|Flamegraph with mode:"
+msgstr ""
+
msgid "PerformanceBar|Frontend resources"
msgstr "Recursos de Frontend"
@@ -24351,6 +24700,15 @@ msgstr ""
msgid "PerformanceBar|Trace"
msgstr ""
+msgid "PerformanceBar|cpu"
+msgstr ""
+
+msgid "PerformanceBar|object"
+msgstr ""
+
+msgid "PerformanceBar|wall"
+msgstr ""
+
msgid "Period in seconds"
msgstr ""
@@ -24579,6 +24937,48 @@ msgstr "Destino"
msgid "PipelineSchedules|Variables"
msgstr "Variables"
+msgid "PipelineSource|API"
+msgstr ""
+
+msgid "PipelineSource|Chat"
+msgstr ""
+
+msgid "PipelineSource|External"
+msgstr ""
+
+msgid "PipelineSource|External Pull Request"
+msgstr ""
+
+msgid "PipelineSource|Merge Request"
+msgstr ""
+
+msgid "PipelineSource|On-Demand DAST Scan"
+msgstr ""
+
+msgid "PipelineSource|On-Demand DAST Validation"
+msgstr ""
+
+msgid "PipelineSource|Parent Pipeline"
+msgstr ""
+
+msgid "PipelineSource|Pipeline"
+msgstr ""
+
+msgid "PipelineSource|Push"
+msgstr ""
+
+msgid "PipelineSource|Schedule"
+msgstr ""
+
+msgid "PipelineSource|Trigger"
+msgstr ""
+
+msgid "PipelineSource|Web"
+msgstr ""
+
+msgid "PipelineSource|Web IDE"
+msgstr ""
+
msgid "PipelineStatusTooltip|Pipeline: %{ciStatus}"
msgstr "Canal: %{ciStatus}"
@@ -24879,46 +25279,7 @@ msgstr ""
msgid "Pipeline|Source"
msgstr ""
-msgid "Pipeline|Source|API"
-msgstr ""
-
-msgid "Pipeline|Source|Chat"
-msgstr ""
-
-msgid "Pipeline|Source|External"
-msgstr ""
-
-msgid "Pipeline|Source|External Pull Request"
-msgstr ""
-
-msgid "Pipeline|Source|Merge Request"
-msgstr ""
-
-msgid "Pipeline|Source|On-Demand DAST Scan"
-msgstr ""
-
-msgid "Pipeline|Source|On-Demand DAST Validation"
-msgstr ""
-
-msgid "Pipeline|Source|Parent Pipeline"
-msgstr ""
-
-msgid "Pipeline|Source|Pipeline"
-msgstr ""
-
-msgid "Pipeline|Source|Push"
-msgstr ""
-
-msgid "Pipeline|Source|Schedule"
-msgstr ""
-
-msgid "Pipeline|Source|Trigger"
-msgstr ""
-
-msgid "Pipeline|Source|Web"
-msgstr ""
-
-msgid "Pipeline|Source|Web IDE"
+msgid "Pipeline|Source|Security Policy"
msgstr ""
msgid "Pipeline|Specify variable values to be used in this run. The values specified in %{linkStart}CI/CD settings%{linkEnd} will be used by default."
@@ -24969,8 +25330,8 @@ msgstr ""
msgid "Pipeline|We are currently unable to fetch pipeline data"
msgstr ""
-msgid "Pipeline|You’re about to stop pipeline %{pipelineId}."
-msgstr "Está a punto de detener la ejecución del pipeline %{pipelineId}."
+msgid "Pipeline|You’re about to stop pipeline #%{pipelineId}."
+msgstr ""
msgid "Pipeline|for"
msgstr "para"
@@ -24996,6 +25357,9 @@ msgstr ""
msgid "Plain diff"
msgstr "Dif simple"
+msgid "Plain-text response to send to clients that hit a rate limit"
+msgstr ""
+
msgid "Plan:"
msgstr "Plan:"
@@ -25140,9 +25504,6 @@ msgstr "Por favor proporcione una dirección de correo electrónico válida."
msgid "Please provide attributes to update"
msgstr ""
-msgid "Please provide your username or email address."
-msgstr ""
-
msgid "Please reach out if you have any questions and we'll be happy to assist."
msgstr ""
@@ -25185,9 +25546,6 @@ msgstr ""
msgid "Please set a new password before proceeding."
msgstr "Por favor, establezca una nueva contraseña antes de continuar."
-msgid "Please share your feedback about %{featureName} %{linkStart}in this issue%{linkEnd} to help us improve the experience."
-msgstr ""
-
msgid "Please solve the captcha"
msgstr ""
@@ -25365,6 +25723,9 @@ msgstr "Previo"
msgid "Prevent adding new members to project membership within this group"
msgstr "Impedir que se añadan nuevos miembros al proyecto dentro de este grupo"
+msgid "Prevent auto-stopping"
+msgstr ""
+
msgid "Prevent editing approval rules in projects and merge requests."
msgstr ""
@@ -25377,7 +25738,7 @@ msgstr ""
msgid "Prevent users from changing their profile name"
msgstr ""
-msgid "Prevent users from performing write operations on GitLab while performing maintenance."
+msgid "Prevent users from performing write operations while GitLab maintenance is in progress."
msgstr ""
msgid "Preview"
@@ -25650,6 +26011,9 @@ msgstr ""
msgid "Profiles|Enter your name, so people you know can recognize you"
msgstr "Introduzca su nombre para que las personas que le conozca puedan reconocer su perfil"
+msgid "Profiles|Enter your password to confirm the email change"
+msgstr ""
+
msgid "Profiles|Enter your pronouns to let people know how to refer to you"
msgstr ""
@@ -25884,12 +26248,12 @@ msgstr "Su estado"
msgid "Profiles|e.g. My MacBook key"
msgstr "por ejemplo, mi clave MacBook"
+msgid "Profiles|https://website.com"
+msgstr ""
+
msgid "Profiles|username"
msgstr "Nombre de usuario"
-msgid "Profiles|website.com"
-msgstr "website.com"
-
msgid "Profiles|your account"
msgstr "tu cuenta"
@@ -26130,9 +26494,21 @@ msgstr "ID de proyecto: %{project_id}"
msgid "ProjectSelect| or group"
msgstr "o grupo"
+msgid "ProjectSelect|No matching results"
+msgstr ""
+
msgid "ProjectSelect|Search for project"
msgstr "Buscar proyecto"
+msgid "ProjectSelect|Search projects"
+msgstr ""
+
+msgid "ProjectSelect|Select a project"
+msgstr ""
+
+msgid "ProjectSelect|There was an error fetching the projects. Please try again."
+msgstr ""
+
msgid "ProjectService|Drone server URL"
msgstr ""
@@ -26220,6 +26596,9 @@ msgstr ""
msgid "ProjectService|Trigger event when a new, unique alert is recorded."
msgstr ""
+msgid "ProjectService|Trigger event when a new, unique vulnerability is recorded. (Note: This feature requires an Ultimate plan.)"
+msgstr ""
+
msgid "ProjectService|Trigger event when a pipeline status changes."
msgstr ""
@@ -26634,9 +27013,15 @@ msgstr "Proyectos recuperados con éxito"
msgid "Projects are graded based on the highest severity vulnerability present"
msgstr ""
+msgid "Projects are organized into groups"
+msgstr ""
+
msgid "Projects contributed to"
msgstr ""
+msgid "Projects help you organize your work. They contain your file repository, issues, merge requests, and so much more."
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr "Proyectos compartidos con %{group_name}"
@@ -26871,10 +27256,10 @@ msgstr "No se han creado métricas personalizadas. Cree una utilizando el botón
msgid "PrometheusService|Prometheus cluster integration"
msgstr ""
-msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
+msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
msgstr ""
-msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
+msgid "PrometheusService|The ID of the IAP-secured resource."
msgstr ""
msgid "PrometheusService|The Prometheus API base URL."
@@ -27492,6 +27877,9 @@ msgstr ""
msgid "Rate limit"
msgstr ""
+msgid "Rate limits can help reduce request volume (like from crawlers or abusive bots)."
+msgstr ""
+
msgid "Raw blob request rate limit per minute"
msgstr ""
@@ -27504,6 +27892,9 @@ msgstr ""
msgid "Re-authentication required"
msgstr "Se requiere autenticación"
+msgid "Re-import"
+msgstr ""
+
msgid "Re-request review"
msgstr ""
@@ -27525,6 +27916,9 @@ msgstr ""
msgid "Read more about related issues"
msgstr "Lea más acerca de las incidencias relacionadas"
+msgid "Read their documentation."
+msgstr ""
+
msgid "Ready to get started with GitLab? Follow these steps to set up your workspace, plan and commit changes, and deploy your project."
msgstr ""
@@ -27558,6 +27952,9 @@ msgstr "Recibe alertas desde los servidores de Prometheus configurados manualmen
msgid "Receive any notifications from GitLab."
msgstr ""
+msgid "Receive notification of abuse reports by email."
+msgstr ""
+
msgid "Receive notifications about your own activity"
msgstr "Recibir notificaciones acerca de su propia actividad"
@@ -27701,9 +28098,6 @@ msgstr "Su perfil"
msgid "Registry setup"
msgstr ""
-msgid "Regulate approvals by authors/committers. Affects all projects."
-msgstr ""
-
msgid "Reindexing Status: %{status} (Slice multiplier: %{multiplier}, Maximum running slices: %{max_slices})"
msgstr ""
@@ -27799,6 +28193,9 @@ msgstr ""
msgid "Release|Something went wrong while saving the release details."
msgstr ""
+msgid "Reload page"
+msgstr ""
+
msgid "Remediations"
msgstr "Remediaciones"
@@ -28081,6 +28478,9 @@ msgstr "Reabrió este %{quick_action_target}."
msgid "Reopens this %{quick_action_target}."
msgstr "Reabrir este %{quick_action_target}."
+msgid "Repeats"
+msgstr ""
+
msgid "Replace"
msgstr "Reemplazar"
@@ -28443,10 +28843,7 @@ msgstr ""
msgid "Require additional authentication for administrative tasks."
msgstr ""
-msgid "Require all users in this group to setup Two-factor authentication"
-msgstr ""
-
-msgid "Require all users in this group to setup two-factor authentication"
+msgid "Require all users in this group to set up two-factor authentication"
msgstr ""
msgid "Required approvals (%{approvals_given} given)"
@@ -28492,6 +28889,9 @@ msgstr[1] "Requiere %d aprobaciones más."
msgid "Requires values to meet regular expression requirements."
msgstr ""
+msgid "Requires you to deploy or set up cloud-hosted Sentry."
+msgstr ""
+
msgid "Requires your primary GitLab email address."
msgstr ""
@@ -28552,9 +28952,6 @@ msgstr "Al restablecer la clave de autorización se invalidará la clave anterio
msgid "Resolve"
msgstr "Resolver"
-msgid "Resolve all threads in new issue"
-msgstr "Resolver todo los hilos en una nueva incidencia"
-
msgid "Resolve conflicts"
msgstr ""
@@ -28612,6 +29009,9 @@ msgstr "Respuesta métricas (NGINX)"
msgid "Response text"
msgstr ""
+msgid "Restart GitLab to apply changes."
+msgstr ""
+
msgid "Restart Terminal"
msgstr "Reiniciar el terminal"
@@ -28630,6 +29030,9 @@ msgstr ""
msgid "Restoring the project will prevent the project from being removed on this date and restore people's ability to make changes to it."
msgstr ""
+msgid "Restrict group access by IP address. %{link_start}Learn more%{link_end}."
+msgstr ""
+
msgid "Restrict membership by email domain"
msgstr ""
@@ -28943,6 +29346,9 @@ msgstr ""
msgid "Runners|Runner #%{runner_id}"
msgstr ""
+msgid "Runners|Runner assigned to project."
+msgstr ""
+
msgid "Runners|Runner is offline, last contact was %{runner_contact} ago"
msgstr ""
@@ -28955,6 +29361,9 @@ msgstr ""
msgid "Runners|Runner registration"
msgstr ""
+msgid "Runners|Runner unassigned from project."
+msgstr ""
+
msgid "Runners|Runners"
msgstr ""
@@ -29147,7 +29556,7 @@ msgstr ""
msgid "SastEntryPoints|How do I set up SAST?"
msgstr ""
-msgid "SastEntryPoints|Learn more."
+msgid "SastEntryPoints|Learn more"
msgstr ""
msgid "Satisfied"
@@ -29189,7 +29598,7 @@ msgstr "Guardar la contraseña"
msgid "Save pipeline schedule"
msgstr "Guardar programación del pipeline"
-msgid "Save space and find images in the container Registry. remove unneeded tags and keep only the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
+msgid "Save storage space by automatically deleting tags from the container registry and keeping the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
msgstr ""
msgid "Saving"
@@ -29363,6 +29772,9 @@ msgstr "Buscar o filtrar resultados..."
msgid "Search or filter results…"
msgstr "Buscar o filtrar resultados…"
+msgid "Search or jump to..."
+msgstr ""
+
msgid "Search project"
msgstr "Buscar proyecto"
@@ -29423,17 +29835,17 @@ msgstr ""
msgid "SearchCodeResults|of %{link_to_project}"
msgstr "de %{link_to_project}"
-msgid "SearchResults|Showing %{count} %{scope} for%{term_element}"
-msgstr "Mostrando %{count} %{scope} para%{term_element}"
+msgid "SearchResults|Showing %{count} %{scope} for %{term_element}"
+msgstr ""
-msgid "SearchResults|Showing %{count} %{scope} for%{term_element} in your personal and project snippets"
-msgstr "Mostrando %{count} %{scope} para%{term_element} en sus fragmentos de código personales y de proyecto"
+msgid "SearchResults|Showing %{count} %{scope} for %{term_element} in your personal and project snippets"
+msgstr ""
-msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for%{term_element}"
-msgstr "Mostrando %{from} - %{to} de %{count} %{scope} para%{term_element}"
+msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for %{term_element}"
+msgstr ""
-msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for%{term_element} in your personal and project snippets"
-msgstr "Mostrando %{from} - %{to} de %{count} %{scope} para%{term_element} en tus fragmentos de código personales y de proyecto"
+msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for %{term_element} in your personal and project snippets"
+msgstr ""
msgid "SearchResults|code result"
msgid_plural "SearchResults|code results"
@@ -29514,6 +29926,9 @@ msgstr "Secreto"
msgid "Secret Detection"
msgstr "Detección de secretos"
+msgid "Secret access key"
+msgstr ""
+
msgid "Secret token"
msgstr ""
@@ -29553,9 +29968,6 @@ msgstr ""
msgid "SecurityApprovals|A merge request approval is required when the license compliance report contains a denied license."
msgstr ""
-msgid "SecurityApprovals|Configurable if security scanners are enabled. %{linkStart}Learn more.%{linkEnd}"
-msgstr ""
-
msgid "SecurityApprovals|Coverage-Check"
msgstr ""
@@ -29568,24 +29980,18 @@ msgstr ""
msgid "SecurityApprovals|Learn more about Vulnerability-Check"
msgstr ""
-msgid "SecurityApprovals|License Scanning must be enabled. %{linkStart}Learn more%{linkEnd}."
-msgstr ""
-
msgid "SecurityApprovals|License-Check"
msgstr ""
msgid "SecurityApprovals|Requires approval for Denied licenses. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}More information%{linkEnd}"
+msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "SecurityApprovals|Requires approval for vulnerabilities. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
-msgid "SecurityApprovals|Test coverage must be enabled. %{linkStart}Learn more%{linkEnd}."
-msgstr ""
-
msgid "SecurityApprovals|Vulnerability-Check"
msgstr ""
@@ -29649,6 +30055,12 @@ msgstr ""
msgid "SecurityConfiguration|Immediately begin risk analysis and remediation with application security features. Start with SAST and Secret Detection, available to all plans. Upgrade to Ultimate to get all features, including:"
msgstr ""
+msgid "SecurityConfiguration|Manage corpus"
+msgstr ""
+
+msgid "SecurityConfiguration|Manage corpus files used as mutation sources in coverage fuzzing."
+msgstr ""
+
msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
msgstr ""
@@ -29703,6 +30115,12 @@ msgstr ""
msgid "SecurityOrchestration|Action"
msgstr ""
+msgid "SecurityOrchestration|Actions"
+msgstr ""
+
+msgid "SecurityOrchestration|Add rule"
+msgstr ""
+
msgid "SecurityOrchestration|All policies"
msgstr ""
@@ -29736,9 +30154,6 @@ msgstr ""
msgid "SecurityOrchestration|Network"
msgstr ""
-msgid "SecurityOrchestration|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
-msgstr ""
-
msgid "SecurityOrchestration|New policy"
msgstr ""
@@ -29754,6 +30169,9 @@ msgstr ""
msgid "SecurityOrchestration|Policy editor"
msgstr ""
+msgid "SecurityOrchestration|Policy preview"
+msgstr ""
+
msgid "SecurityOrchestration|Policy status"
msgstr ""
@@ -29763,6 +30181,9 @@ msgstr ""
msgid "SecurityOrchestration|Rule"
msgstr ""
+msgid "SecurityOrchestration|Rules"
+msgstr ""
+
msgid "SecurityOrchestration|Scan Execution"
msgstr ""
@@ -29856,6 +30277,9 @@ msgstr ""
msgid "SecurityReports|Create issue"
msgstr "Crear incidencia"
+msgid "SecurityReports|Development vulnerabilities"
+msgstr ""
+
msgid "SecurityReports|Dismiss vulnerability"
msgstr "Descartar vulnerabilidad"
@@ -29871,6 +30295,9 @@ msgstr ""
msgid "SecurityReports|Download results"
msgstr ""
+msgid "SecurityReports|Download scanned URLs"
+msgstr ""
+
msgid "SecurityReports|Download scanned resources"
msgstr ""
@@ -29994,6 +30421,9 @@ msgstr "Estado"
msgid "SecurityReports|Take survey"
msgstr ""
+msgid "SecurityReports|The Vulnerability Report shows the results of the lastest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "SecurityReports|The security reports below contain one or more vulnerability findings that could not be parsed and were not recorded. Download the artifacts in the job output to investigate. Ensure any security report created conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
msgstr ""
@@ -30135,10 +30565,10 @@ msgstr "Seleccione una razón"
msgid "Select a repository"
msgstr "Seleccione un repositorio"
-msgid "Select a role"
+msgid "Select a repository containing templates for common files."
msgstr ""
-msgid "Select a shared template repository for all projects on this instance."
+msgid "Select a role"
msgstr ""
msgid "Select a template repository"
@@ -30216,6 +30646,9 @@ msgstr "Seleccione el proyecto y la zona para elegir el tipo de máquina"
msgid "Select project to choose zone"
msgstr "Seleccione el proyecto para elegir la zona"
+msgid "Select project to create issue"
+msgstr ""
+
msgid "Select projects"
msgstr "Seleccione los proyectos"
@@ -30333,6 +30766,9 @@ msgstr "Enviar notificación por correo electrónico"
msgid "Send emails to help guide new users through the onboarding process."
msgstr ""
+msgid "Send emails to users upon account deactivation."
+msgstr ""
+
msgid "Send message"
msgstr "Enviar mensaje"
@@ -30351,6 +30787,9 @@ msgstr "Enviar informe"
msgid "Send service data"
msgstr ""
+msgid "Sentry"
+msgstr ""
+
msgid "Sentry API URL"
msgstr "URL de la API de Sentry"
@@ -30465,6 +30904,9 @@ msgstr "Su repositorio no tiene un archivo correspondiente %{startTag}serverless
msgid "Service"
msgstr "Servicio"
+msgid "Service Accounts keys are required to authorize GitLab to deploy your Google Cloud project."
+msgstr ""
+
msgid "Service Desk"
msgstr "Service Desk"
@@ -30537,15 +30979,15 @@ msgstr ""
msgid "Set a password on your account to pull or push via %{protocol}."
msgstr "Establezca una contraseña en su cuenta para hacer pull o push vía %{protocol}."
-msgid "Set a template repository for projects in this group"
-msgstr "Establecer un repositorio de plantillas para los proyectos de este grupo"
-
msgid "Set access permissions for this token."
msgstr ""
msgid "Set an instance-wide domain that will be available to all clusters when installing Knative."
msgstr ""
+msgid "Set any rate limit to %{code_open}0%{code_close} to disable the limit."
+msgstr ""
+
msgid "Set default and restrict visibility levels. Configure import sources and git access protocol."
msgstr "Establecer y restringir los niveles de visibilidad por defecto. Configure origenes para la importación y el protocolo de acceso de Git."
@@ -30558,8 +31000,8 @@ msgstr "Establecer iteración"
msgid "Set limit to 0 to allow any file size."
msgstr ""
-msgid "Set max session time for web terminal."
-msgstr "Establecer el tiempo máximo de sesión para el terminal de web."
+msgid "Set limits for web and API requests."
+msgstr ""
msgid "Set milestone"
msgstr "Establecer hito"
@@ -30567,15 +31009,18 @@ msgstr "Establecer hito"
msgid "Set new password"
msgstr "Establecer una nueva contraseña"
-msgid "Set notification email for abuse reports."
-msgstr "Establecer una dirección de correo electrónico de notificación para los informes de abuso de uso."
-
msgid "Set parent epic to an epic"
msgstr "Establecer la tarea épica principal a una tarea épica"
+msgid "Set per-user rate limits for imports and exports of projects and groups."
+msgstr ""
+
msgid "Set projects and maximum size limits, session duration, user options, and check feature availability for namespace plan."
msgstr ""
+msgid "Set rate limits for package registry API requests that supersede the general user and IP rate limits."
+msgstr ""
+
msgid "Set severity"
msgstr ""
@@ -30594,15 +31039,24 @@ msgstr "Establecer la rama de destino a %{branch_name}."
msgid "Set the default branch for this project. All merge requests and commits are made against this branch unless you specify a different one."
msgstr ""
+msgid "Set the default expiration time for job artifacts in all projects. Set to %{code_open}0%{code_close} to never expire artifacts by default. If no unit is written, it defaults to seconds. For example, these are all equivalent: %{code_open}3600%{code_close}, %{code_open}60 minutes%{code_close}, or %{code_open}one hour%{code_close}."
+msgstr ""
+
msgid "Set the due date to %{due_date}."
msgstr "Establecer la fecha de vencimiento a %{due_date}."
msgid "Set the iteration to %{iteration_reference}."
msgstr "Establece la iteración a %{iteration_reference}."
+msgid "Set the maximum session time for a web terminal."
+msgstr ""
+
msgid "Set the milestone to %{milestone_reference}."
msgstr "Establecer el hito a %{milestone_reference}."
+msgid "Set the per-user rate limit for notes created by web or API requests."
+msgstr ""
+
msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
msgstr ""
@@ -30804,6 +31258,9 @@ msgstr ""
msgid "Show Pipeline IID"
msgstr ""
+msgid "Show all %{issuable_type}."
+msgstr ""
+
msgid "Show all activity"
msgstr "Mostrar toda la actividad"
@@ -30855,15 +31312,9 @@ msgstr "Mostrar la última versión"
msgid "Show list"
msgstr ""
-msgid "Show me advanced features"
-msgstr ""
-
msgid "Show me how to add a pipeline"
msgstr ""
-msgid "Show me the basics"
-msgstr ""
-
msgid "Show one file at a time"
msgstr ""
@@ -30904,15 +31355,15 @@ msgstr "Mostrando %{limit} de %{total_count} incidencias. "
msgid "Showing %{pageSize} of %{total} %{issuableType}"
msgstr ""
-msgid "Showing %{pageSize} of %{total} issues"
-msgstr "Mostrando %{pageSize} de %{total} problemas"
-
msgid "Showing all epics"
msgstr ""
msgid "Showing all issues"
msgstr "Mostrar todas las incidencias"
+msgid "Showing data for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
+msgstr ""
+
msgid "Showing data for workflow items created in this date range. Date range cannot exceed %{maxDateRange} days."
msgstr ""
@@ -30952,6 +31403,15 @@ msgstr "Solo se permiten caracteres numéricos"
msgid "Sidebar|Weight"
msgstr "Peso"
+msgid "Sidekiq job compression threshold (bytes)"
+msgstr ""
+
+msgid "Sidekiq job size limit (bytes)"
+msgstr ""
+
+msgid "Sidekiq job size limits"
+msgstr ""
+
msgid "Sign in"
msgstr "Iniciar sesión"
@@ -31072,6 +31532,9 @@ msgstr ""
msgid "Site profile not found for given parameters"
msgstr ""
+msgid "Sites"
+msgstr ""
+
msgid "Size"
msgstr "Tamaño"
@@ -31102,20 +31565,23 @@ msgstr "La integración con Slack le permite interactuar con GitLab mediante com
msgid "SlackIntegration|Sends notifications about project events to Slack channels."
msgstr ""
-msgid "SlackService|2. Paste the %{strong_open}Token%{strong_close} into the field below"
+msgid "SlackService|1. %{slash_command_link_start}Add a slash command%{slash_command_link_end} in your Slack team using this information:"
msgstr ""
-msgid "SlackService|3. Select the %{strong_open}Active%{strong_close} checkbox, press %{strong_open}Save changes%{strong_close} and start using GitLab inside Slack!"
+msgid "SlackService|2. Paste the token from Slack in the %{strong_open}Token%{strong_close} field below."
+msgstr ""
+
+msgid "SlackService|3. Select the %{strong_open}Active%{strong_close} checkbox, select %{strong_open}Save changes%{strong_close}, and start using slash commands in Slack!"
+msgstr ""
+
+msgid "SlackService|After setup, get a list of available Slack slash commands by entering"
msgstr ""
msgid "SlackService|Fill in the word that works best for your team."
msgstr "Escriba la palabra que mejor describa a su equipo."
-msgid "SlackService|See list of available commands in Slack after setting up this service, by entering"
-msgstr "Vea la lista de comandos disponibles en Slack después de configurar este servicio, introduciendo"
-
-msgid "SlackService|This service allows users to perform common operations on this project by entering slash commands in Slack."
-msgstr "Este servicio permite a los usuarios realizar operaciones comunes en este proyecto utilizando comandos en Slack."
+msgid "SlackService|Perform common operations in this project by entering slash commands in Slack."
+msgstr ""
msgid "Slice multiplier"
msgstr ""
@@ -31180,7 +31646,7 @@ msgstr ""
msgid "Some child epics may be hidden due to applied filters"
msgstr ""
-msgid "Some common domains are not allowed. %{read_more_link}."
+msgid "Some common domains are not allowed. %{learn_more_link}."
msgstr ""
msgid "Some of the designs you tried uploading did not change:"
@@ -31264,9 +31730,6 @@ msgstr "Se ha producido un error al editar su comentario. Por favor, inténtalo
msgid "Something went wrong while exporting requirements"
msgstr ""
-msgid "Something went wrong while fetching %{listType} list"
-msgstr "Algo salió mal al obtener la lista de %{listType}. ¡Por favor, inténtelo de nuevo!"
-
msgid "Something went wrong while fetching branches"
msgstr ""
@@ -31321,15 +31784,9 @@ msgstr ""
msgid "Something went wrong while merging this merge request. Please try again."
msgstr "Se ha producido un error, mientras se realizaba el merge request. Por favor, inténtelo de nuevo."
-msgid "Something went wrong while moving issues."
-msgstr "Se ha producido un error al mover las incidencias."
-
msgid "Something went wrong while obtaining the Let's Encrypt certificate."
msgstr ""
-msgid "Something went wrong while performing the action."
-msgstr "Se ha producido un error al realizar la acción."
-
msgid "Something went wrong while promoting the issue to an epic. Please try again."
msgstr ""
@@ -31657,7 +32114,10 @@ msgstr ""
msgid "SourcegraphPreferences|Uses a custom %{linkStart}Sourcegraph instance%{linkEnd}."
msgstr ""
-msgid "Spam Check API Key"
+msgid "Spam Check"
+msgstr ""
+
+msgid "Spam Check API key"
msgstr ""
msgid "Spam Logs"
@@ -31675,8 +32135,8 @@ msgstr ""
msgid "Specified URL cannot be used: \"%{reason}\""
msgstr "No se puede usar la URL especificada: \"%{reason}\""
-msgid "Specify an e-mail address regex pattern to identify default internal users."
-msgstr "Especifique un patrón para la expresión regular de direcciones de correo electrónico para identificar usuarios internos predeterminados."
+msgid "Specify an email address regex pattern to identify default internal users."
+msgstr ""
msgid "Speed up your pipelines with Needs relationships"
msgstr ""
@@ -31930,7 +32390,7 @@ msgstr ""
msgid "StatusCheck|An error occurred fetching the status checks."
msgstr ""
-msgid "StatusCheck|Apply this status check to any branch or a specific protected branch."
+msgid "StatusCheck|Apply this status check to all branches or a specific protected branch."
msgstr ""
msgid "StatusCheck|Check for a status response in Merge Requests. Failures do not block merges. %{link_start}Learn more%{link_end}."
@@ -32269,6 +32729,9 @@ msgstr "El recuento de uso se realiza una vez al día a 12:00 PM."
msgid "Subscriptions"
msgstr "Suscripciones"
+msgid "Subscription|Your subscription for %{strong}%{namespace_name}%{strong_close} has expired and you are now on %{pricing_link_start}the GitLab Free tier%{pricing_link_end}. Don't worry, your data is safe. Get in touch with our support team (%{support_email}). They'll gladly help with your subscription renewal."
+msgstr ""
+
msgid "Subtracted"
msgstr "Subtraído"
@@ -32497,6 +32960,9 @@ msgstr ""
msgid "SuperSonics|Plan"
msgstr ""
+msgid "SuperSonics|Please agree to the Subscription Agreement"
+msgstr ""
+
msgid "SuperSonics|Ready to get started? A GitLab plan is ideal for scaling organizations and for multi team usage."
msgstr ""
@@ -32527,6 +32993,9 @@ msgstr ""
msgid "SuperSonics|The activation code is not valid. Please make sure to copy it exactly from the Customers Portal or confirmation email. Learn more about %{linkStart}activating your subscription%{linkEnd}."
msgstr ""
+msgid "SuperSonics|The activation code should be a 24-character alphanumeric string"
+msgstr ""
+
msgid "SuperSonics|There is a connectivity issue."
msgstr ""
@@ -32569,9 +33038,15 @@ msgstr ""
msgid "SuperSonics|You do not have an active subscription"
msgstr ""
+msgid "SuperSonics|You have successfully added a license that activates on %{date}. Please see the subscription history table below for more details."
+msgstr ""
+
msgid "SuperSonics|You'll be charged for %{trueUpLinkStart}users over license%{trueUpLinkEnd} on a quarterly or annual basis, depending on the terms of your agreement."
msgstr ""
+msgid "SuperSonics|Your future dated license was successfully added"
+msgstr ""
+
msgid "SuperSonics|Your subscription"
msgstr ""
@@ -32824,7 +33299,7 @@ msgstr "Plantilla"
msgid "Template to append to all Service Desk issues"
msgstr ""
-msgid "TemplateRepository|Select a repository to make its templates available to all projects. %{link_start}What should the repository contain?%{link_end} "
+msgid "TemplateRepository|Create common files more quickly, and standardize their format."
msgstr ""
msgid "Templates"
@@ -33030,7 +33505,7 @@ msgstr ""
msgid "TestCases|Search test cases"
msgstr ""
-msgid "TestCases|Something went wrong while adding test case to Todo."
+msgid "TestCases|Something went wrong while adding test case to a to-do item."
msgstr ""
msgid "TestCases|Something went wrong while creating a test case."
@@ -33042,7 +33517,7 @@ msgstr ""
msgid "TestCases|Something went wrong while fetching test cases list."
msgstr ""
-msgid "TestCases|Something went wrong while marking test case todo as done."
+msgid "TestCases|Something went wrong while marking test case to-do item as done."
msgstr ""
msgid "TestCases|Something went wrong while moving test case."
@@ -33162,7 +33637,7 @@ msgstr ""
msgid "Thanks for your purchase!"
msgstr "¡Gracias por su compra!"
-msgid "That is ok, I do not want to renew"
+msgid "That's OK, I don't want to renew"
msgstr ""
msgid "That's it, well done!"
@@ -33185,7 +33660,7 @@ msgid_plural "The %{type} contains the following errors:"
msgstr[0] "El %{type} contiene el siguiente error:"
msgstr[1] "El %{type} contiene los siguientes errores:"
-msgid "The API key used by GitLab for accessing the Spam Check service endpoint"
+msgid "The API key used by GitLab for accessing the Spam Check service endpoint."
msgstr ""
msgid "The GitLab subscription service (customers.gitlab.com) is currently experiencing an outage. You can monitor the status and get updates at %{linkStart}status.gitlab.com%{linkEnd}."
@@ -33224,9 +33699,6 @@ msgstr ""
msgid "The URL to use for connecting to Elasticsearch. Use a comma-separated list to support clustering (e.g., \"http://localhost:9200, http://localhost:9201\")."
msgstr "La URL a utilizar para conectarse a Elasticsearch. Utilice una lista separada por comas para soportar clustering (por ejemplo, \"http://localhost:9200, http://localhost:9201\")."
-msgid "The Vulnerability Report shows the results of the last successful pipeline run on the default branch."
-msgstr ""
-
msgid "The X509 Certificate to use when mutual TLS is required to communicate with the external authorization service. If left blank, the server certificate is still validated when accessing over HTTPS."
msgstr "Un certificado X.509 se utiliza cuando se require una comunicación TLS con un servicio de autorización externo. Si se deja en blanco, el certificado utilizado desde el servidor es validado cuando se accedes a través del protocolo HTTPS."
@@ -33284,9 +33756,6 @@ msgstr ""
msgid "The default branch for this project has been changed. Please update your bookmarks."
msgstr ""
-msgid "The default expiration time for job artifacts. 0 for unlimited. The default unit is in seconds, but you can use other units, for example %{code_open}4 mins 2 sec%{code_close}, %{code_open}2h42min%{code_close}."
-msgstr ""
-
msgid "The dependency list details information about the components used within your project."
msgstr "La lista de dependencias detalla la información sobre los componentes utilizados en su proyecto."
@@ -33478,9 +33947,6 @@ msgstr "Los conflictos en el merge para este merge request ya se han resuelto."
msgid "The merge conflicts for this merge request have already been resolved. Please return to the merge request."
msgstr "Los conflictos en el merge para este merge request ya se han resuelto. Por favor, vuelva al merge request."
-msgid "The merge request can now be merged."
-msgstr ""
-
msgid "The metric must be one of %{metrics}."
msgstr ""
@@ -33856,8 +34322,8 @@ msgstr "Se ha producido un error al enviar el correo electrónico de confirmaciÃ
msgid "There was a problem updating the keep latest artifacts setting."
msgstr ""
-msgid "There was an error %{message} todo."
-msgstr "Se ha producido un error %{message} en la lista de tareas pendientes."
+msgid "There was an error %{message} to-do item."
+msgstr ""
msgid "There was an error adding a To Do."
msgstr "Se ha producido un error al añadir la tarea a la lista de tareas pendientes."
@@ -33895,6 +34361,9 @@ msgstr ""
msgid "There was an error fetching projects"
msgstr ""
+msgid "There was an error fetching search autocomplete suggestions"
+msgstr ""
+
msgid "There was an error fetching stage total counts"
msgstr ""
@@ -34219,6 +34688,9 @@ msgstr ""
msgid "This field is required."
msgstr "Este campo es obligatorio."
+msgid "This form is disabled in preview"
+msgstr ""
+
msgid "This group"
msgstr "Este grupo"
@@ -34240,9 +34712,6 @@ msgstr ""
msgid "This group is linked to a subscription"
msgstr ""
-msgid "This group, including all subgroups, projects and git repositories, will be reachable from only the specified IP address ranges."
-msgstr ""
-
msgid "This group, its subgroups and projects has been scheduled for removal on %{date}."
msgstr ""
@@ -34522,9 +34991,6 @@ msgstr ""
msgid "This user cannot be unlocked manually from GitLab"
msgstr "Este usuario no puede ser desbloqueado manualmente desde GitLab"
-msgid "This user does not have a pending request"
-msgstr ""
-
msgid "This user has an unconfirmed email address (%{email}). You may force a confirmation."
msgstr ""
@@ -34633,9 +35099,6 @@ msgstr "Operaciones por segundo"
msgid "ThreatMonitoring|Packet Activity"
msgstr "Actividad del paquete"
-msgid "ThreatMonitoring|Policies"
-msgstr "Políticas"
-
msgid "ThreatMonitoring|Requests"
msgstr "Peticiones"
@@ -34687,6 +35150,12 @@ msgstr ""
msgid "ThreatMonitoring|View documentation"
msgstr "Ver documentación"
+msgid "Threshold in bytes at which to compress Sidekiq job arguments."
+msgstr ""
+
+msgid "Threshold in bytes at which to reject Sidekiq jobs. Set this to 0 to if you don't want to limit Sidekiq jobs."
+msgstr ""
+
msgid "Throughput"
msgstr ""
@@ -34696,6 +35165,9 @@ msgstr "Jueves"
msgid "Time"
msgstr "Tiempo"
+msgid "Time (in hours) that users are allowed to skip forced configuration of two-factor authentication."
+msgstr ""
+
msgid "Time Spent"
msgstr ""
@@ -34762,7 +35234,7 @@ msgstr ""
msgid "TimeTrackingEstimated|Est"
msgstr "Est"
-msgid "TimeTracking|%{startTag}Spent: %{endTag}%{timeSpentHumanReadable}"
+msgid "TimeTracking|%{spentStart}Spent: %{spentEnd}"
msgstr ""
msgid "TimeTracking|Estimated:"
@@ -34976,6 +35448,9 @@ msgstr "Para aceptar esta invitación, inicie sesión."
msgid "To access this domain create a new DNS record"
msgstr "Para acceder a este dominio, cree un nuevo registro DNS"
+msgid "To add a custom suffix, set up a Service Desk email address. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "To add an SSH key you need to %{generate_link_start}generate one%{link_end} or use an %{existing_link_start}existing key%{link_end}."
msgstr "Para agregar una clave SSH necesita %{generate_link_start}generar una%{link_end} o utilizar una clave existente %{existing_link_start}%{link_end}."
@@ -34997,13 +35472,16 @@ msgstr "Para conectar a los repositorios de GitHub, primero debe autorizar a Git
msgid "To connect an SVN repository, check out %{svn_link}."
msgstr "Para conectar un repositorio SVN, eche un vistazo a %{svn_link}."
+msgid "To continue using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
+msgstr ""
+
msgid "To continue, you need to select the link in the confirmation email we sent to verify your email address. If you didn't get our email, select %{strongStart}Resend confirmation email.%{strongEnd}"
msgstr ""
msgid "To define internal users, first enable new users set to external"
msgstr "Para definir los usuarios internos, primero habilite nuevos usuarios externos"
-msgid "To enable Registration Features, make sure \"Enable service ping\" is checked."
+msgid "To enable Registration Features, first enable Service Ping."
msgstr ""
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
@@ -35030,8 +35508,8 @@ msgstr "Para comenzar, introduzca la URL de su servidor de Gitea y un %{link_to_
msgid "To get started, use the link below to confirm your account."
msgstr ""
-msgid "To help improve GitLab and its user experience, GitLab will periodically collect usage information."
-msgstr "Para ayudar a mejorar GitLab y su experiencia de usuario, GitLab recopilará periódicamente información de uso."
+msgid "To help improve GitLab and its user experience, GitLab periodically collects usage information."
+msgstr ""
msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
msgstr ""
@@ -35063,7 +35541,7 @@ msgstr ""
msgid "To preserve performance only %{strong_open}%{display_size} of %{real_size}%{strong_close} files are displayed."
msgstr ""
-msgid "To protect this issue's confidentiality, %{forkLink} and set the fork's visibility to private."
+msgid "To protect this issue's confidentiality, %{linkStart}fork this project%{linkEnd} and set the fork's visibility to private."
msgstr ""
msgid "To protect this issue's confidentiality, a private fork of this project was selected."
@@ -35096,12 +35574,15 @@ msgstr "Para ver los detalles operacionales de este proyecto, contacte con un du
msgid "To set up SAML authentication for your group through an identity provider like Azure, Okta, Onelogin, Ping Identity, or your custom SAML 2.0 provider:"
msgstr "Para configurar la autenticación SAML para su grupo a través de un proveedor de identidad como Azure, Okta, Onelogin, Ping Identity o su proveedor SAML 2.0 personalizado:"
-msgid "To set up this service:"
-msgstr "Para configurar este servicio:"
+msgid "To set up this integration:"
+msgstr ""
msgid "To specify the notification level per project of a group you belong to, you need to visit project page and change notification level there."
msgstr "Para especificar el nivel de notificación por proyecto de un grupo al que pertenece, debe visitar la página del proyecto y cambiar el nivel de las notificaciones."
+msgid "To start using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
+msgstr ""
+
msgid "To unsubscribe from this issue, please paste the following link into your browser:"
msgstr ""
@@ -35689,9 +36170,6 @@ msgstr ""
msgid "Unable to fetch branches list, please close the form and try again"
msgstr ""
-msgid "Unable to fetch unscanned projects"
-msgstr "No se pueden recuperar proyectos no escaneados"
-
msgid "Unable to fetch vulnerable projects"
msgstr "No se pueden obtener los proyectos vulnerables"
@@ -35746,6 +36224,15 @@ msgstr "No se puede actualizar la tarea epíca en este momento."
msgid "Unable to update this issue at this time."
msgstr "No se puede actualizar esta incidencia en este momento."
+msgid "Unapprove a merge request"
+msgstr ""
+
+msgid "Unapprove the current merge request."
+msgstr ""
+
+msgid "Unapproved the current merge request."
+msgstr ""
+
msgid "Unarchive project"
msgstr "Desarchivar proyecto"
@@ -35758,16 +36245,13 @@ msgstr ""
msgid "Unassigned"
msgstr ""
-msgid "Unauthenticated API request rate limit"
-msgstr ""
-
-msgid "Unauthenticated rate limit period in seconds"
+msgid "Unauthenticated API rate limit period in seconds"
msgstr ""
-msgid "Unauthenticated request rate limit"
+msgid "Unauthenticated requests"
msgstr ""
-msgid "Unauthenticated requests"
+msgid "Unauthenticated web rate limit period in seconds"
msgstr ""
msgid "Undo"
@@ -35869,18 +36353,6 @@ msgstr "Hilo sin resolver"
msgid "Unresolved"
msgstr "Sin resolver"
-msgid "UnscannedProjects|15 or more days"
-msgstr "15 días o más"
-
-msgid "UnscannedProjects|30 or more days"
-msgstr "30 días o más"
-
-msgid "UnscannedProjects|5 or more days"
-msgstr "5 días o más"
-
-msgid "UnscannedProjects|60 or more days"
-msgstr "60 días o más"
-
msgid "Unschedule job"
msgstr "No programado"
@@ -36100,6 +36572,9 @@ msgstr "Estadísticas de uso"
msgid "UsageQuota|%{help_link_start}Shared runners%{help_link_end} are disabled, so there are no limits set on pipeline usage"
msgstr "%{help_link_start}Los ejecutores compartidos%{help_link_end} están deshabilitados, por lo que no hay límites establecidos para el uso de los pipelines"
+msgid "UsageQuota|%{linkTitle} help link"
+msgstr ""
+
msgid "UsageQuota|%{percentageLeft} of purchased storage is available"
msgstr "%{percentageLeft} de almacenamiento comprado está disponible"
@@ -36109,6 +36584,9 @@ msgstr "Artefactos"
msgid "UsageQuota|Artifacts is a sum of build and pipeline artifacts."
msgstr ""
+msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
+msgstr ""
+
msgid "UsageQuota|Buy additional minutes"
msgstr "Comprar minutos adicionales"
@@ -36118,9 +36596,21 @@ msgstr ""
msgid "UsageQuota|CI minutes usage by project"
msgstr ""
+msgid "UsageQuota|Code packages and container images."
+msgstr ""
+
msgid "UsageQuota|Current period usage"
msgstr "Periodo actual de uso"
+msgid "UsageQuota|File attachments and smaller design graphics."
+msgstr ""
+
+msgid "UsageQuota|Git repository, managed by the Gitaly service."
+msgstr ""
+
+msgid "UsageQuota|Includes project registry, artifacts, packages, wiki, uploads and other items."
+msgstr ""
+
msgid "UsageQuota|Increase storage temporarily"
msgstr ""
@@ -36139,6 +36629,9 @@ msgstr ""
msgid "UsageQuota|Packages"
msgstr "Paquetes"
+msgid "UsageQuota|Pipeline artifacts and job artifacts, created with CI/CD."
+msgstr ""
+
msgid "UsageQuota|Pipelines"
msgstr "Pipelines"
@@ -36157,6 +36650,9 @@ msgstr "Repositorio"
msgid "UsageQuota|Seats"
msgstr ""
+msgid "UsageQuota|Shared bits of code and text."
+msgstr ""
+
msgid "UsageQuota|Snippets"
msgstr "Fragmentos de código"
@@ -36166,6 +36662,12 @@ msgstr ""
msgid "UsageQuota|Storage"
msgstr "Almacenamiento"
+msgid "UsageQuota|Storage type"
+msgstr ""
+
+msgid "UsageQuota|There is a known issue with Artifact storage where the total could be incorrect for some projects. More details and progress are available in %{warningLinkStart}the epic%{warningLinkEnd}."
+msgstr ""
+
msgid "UsageQuota|This is the total amount of storage used across your projects within this namespace."
msgstr ""
@@ -36205,6 +36707,9 @@ msgstr "Subidas"
msgid "UsageQuota|Usage"
msgstr "Uso"
+msgid "UsageQuota|Usage Breakdown"
+msgstr ""
+
msgid "UsageQuota|Usage Quotas"
msgstr "Cuotas de uso"
@@ -36229,6 +36734,9 @@ msgstr ""
msgid "UsageQuota|Wiki"
msgstr "Wiki"
+msgid "UsageQuota|Wiki content."
+msgstr ""
+
msgid "UsageQuota|Wikis"
msgstr "Wikis"
@@ -36445,8 +36953,11 @@ msgstr "Aplicaciones OAuth del usuario"
msgid "User Settings"
msgstr "Ajustes de usuario"
-msgid "User and IP Rate Limits"
-msgstr "Usuarios y ratio de límites de IP"
+msgid "User and IP rate limits"
+msgstr ""
+
+msgid "User does not have a pending request"
+msgstr ""
msgid "User identity was successfully created."
msgstr "La identidad de usuario se ha creado correctamente."
@@ -36742,6 +37253,9 @@ msgstr "Usuarios"
msgid "Users can launch a development environment from a GitLab browser tab when the %{linkStart}Gitpod%{linkEnd} integration is enabled."
msgstr ""
+msgid "Users can reactivate their account by signing in."
+msgstr ""
+
msgid "Users can render diagrams in AsciiDoc, Markdown, reStructuredText, and Textile documents using Kroki."
msgstr ""
@@ -36757,6 +37271,9 @@ msgstr ""
msgid "Users requesting access to"
msgstr "Usuarios que solicitan acceso a"
+msgid "Users to exclude from the rate limit"
+msgstr ""
+
msgid "Users were successfully added."
msgstr "Usuarios añadidos con éxito."
@@ -36778,6 +37295,9 @@ msgstr "Ningún asignado - %{openingTag} asignarse a usted mismo %{closingTag}"
msgid "UsersSelect|Unassigned"
msgstr "Sin asignar"
+msgid "Uses GitLab as a lightweight alternative to Sentry."
+msgstr ""
+
msgid "Using %{code_start}::%{code_end} denotes a %{link_start}scoped label set%{link_end}"
msgstr "Uso de %{code_start}::%{code_end} denota un %{link_start}con ámbito de etiqueta%{link_end}"
@@ -36808,10 +37328,7 @@ msgstr ""
msgid "Value Stream Analytics can help you determine your team’s velocity"
msgstr ""
-msgid "Value Stream Analytics gives an overview of how much time it takes to go from idea to production in your project."
-msgstr ""
-
-msgid "Value may contain a variable reference"
+msgid "Value might contain a variable reference"
msgstr ""
msgid "Value stream"
@@ -36877,12 +37394,12 @@ msgstr ""
msgid "ValueStream|The Default Value Stream cannot be deleted"
msgstr ""
+msgid "Values that contain the %{codeStart}$%{codeEnd} character can be considered a variable reference and expanded. %{docsLinkStart}Learn more.%{docsLinkEnd}"
+msgstr ""
+
msgid "Variable"
msgstr "Variable"
-msgid "Variable references indicated by %{codeStart}$%{codeEnd} may be expanded. If this is not what you want, consider %{docsLinkStart}using a workaround to prevent expansion%{docsLinkEnd}."
-msgstr ""
-
msgid "Variable will be masked in job logs."
msgstr ""
@@ -37285,6 +37802,9 @@ msgstr "Descargar"
msgid "Vulnerability|Evidence"
msgstr "Evidencia"
+msgid "Vulnerability|False positive detected"
+msgstr ""
+
msgid "Vulnerability|File"
msgstr "Archivo"
@@ -37327,6 +37847,9 @@ msgstr "Severidad"
msgid "Vulnerability|Status"
msgstr "Estado"
+msgid "Vulnerability|The scanner determined this vulnerability to be a false positive. Verify the evaluation before changing its status. %{linkStart}Learn more about false positive detection.%{linkEnd}"
+msgstr ""
+
msgid "Vulnerability|The unmodified response is the original response that had no mutations done to the request"
msgstr ""
@@ -37651,9 +38174,6 @@ msgstr "¡Bienvenido a GitLab %{first_name}!"
msgid "Welcome to GitLab,%{br_tag}%{name}!"
msgstr "¡Bienvenido a GitLab,%{br_tag}%{name}!"
-msgid "Welcome to the guided GitLab tour"
-msgstr "Bienvenido a la visita guiada de GitLab"
-
msgid "Welcome, %{name}!"
msgstr ""
@@ -37672,9 +38192,6 @@ msgstr ""
msgid "What are you searching for?"
msgstr "¿Qué está buscando?"
-msgid "What describes you best?"
-msgstr "¿Qué le describe mejor?"
-
msgid "What does this command do?"
msgstr "¿Qué hace este comando?"
@@ -37696,15 +38213,15 @@ msgstr ""
msgid "What is your job title? (optional)"
msgstr "¿Cuál es su cargo? (opcional)"
+msgid "What templates can I create?"
+msgstr ""
+
msgid "What will you use this group for?"
msgstr ""
msgid "What's new"
msgstr "¿Qué hay de nuevo?"
-msgid "What’s your experience level?"
-msgstr "¿Cuál es su nivel de experiencia?"
-
msgid "When a deployment job is successful, skip older deployment jobs that are still pending."
msgstr ""
@@ -37714,6 +38231,9 @@ msgstr "Cuando un ejecutor está bloqueado, no se puede asignar a otros proyecto
msgid "When an event in GitLab triggers a webhook, you can use the request details to figure out if something went wrong."
msgstr ""
+msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+msgstr ""
+
msgid "When inactive, an external authentication provider must be used."
msgstr ""
@@ -37737,6 +38257,9 @@ msgstr ""
msgid "When:"
msgstr "Cuando:"
+msgid "Which API requests are affected?"
+msgstr ""
+
msgid "While it's rare to have no vulnerabilities, it can happen. In any event, we ask that you please double check your settings to make sure you've set up your dashboard correctly."
msgstr ""
@@ -38016,6 +38539,9 @@ msgstr "Trabajo en curso (abierto y sin asignar)"
msgid "Work in progress Limit"
msgstr "Límite de trabajo en progreso"
+msgid "WorkItem|Work Items"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -38091,6 +38617,9 @@ msgstr "Está a punto de transferir el control de su cuenta al grupo %{group_nam
msgid "You are already a member of this %{member_source}."
msgstr ""
+msgid "You are already impersonating another user"
+msgstr ""
+
msgid "You are an admin, which means granting access to %{client_name} will allow them to interact with GitLab as an admin as well. Proceed with caution."
msgstr "Es administrador, lo que significa que conceder acceso a %{client_name} les permitirá interactuar con GitLab como un administrador también. Proceda con precaución."
@@ -38193,6 +38722,9 @@ msgstr "También puede subir archivos existentes desde su ordenador utilizando l
msgid "You can also use project access tokens with Git to authenticate over HTTP(S). %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "You can always change your URL later"
+msgstr ""
+
msgid "You can always edit this later"
msgstr "Siempre puede editar esto más tarde"
@@ -38349,12 +38881,12 @@ msgstr "No puede escribir en esta instancia de sólo lectura de GitLab."
msgid "You can’t %{tag_start}edit%{tag_end} files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
+msgid "You can’t edit files directly in this project. Fork this project and submit a merge request with your changes."
+msgstr ""
+
msgid "You could not create a new trigger."
msgstr "No es posible crear un nuevo disparador."
-msgid "You didn't renew your subscription for %{strong}%{namespace_name}%{strong_close} so it was downgraded to the free plan."
-msgstr ""
-
msgid "You do not have any subscriptions yet"
msgstr "Aún no tiene ninguna suscripción"
@@ -38520,6 +39052,12 @@ msgstr "Debe proporcionar una contraseña válida"
msgid "You must provide your current password in order to change it."
msgstr "Debe introducir su contraseña actual para poder cambiarla."
+msgid "You must sign in to search for specific projects."
+msgstr ""
+
+msgid "You must sign in to search for specific terms."
+msgstr ""
+
msgid "You must solve the CAPTCHA in order to submit"
msgstr "Debe resolver el CAPTCHA para poder enviar"
@@ -38547,6 +39085,9 @@ msgstr "Necesita especificar un token de acceso como una URL de host."
msgid "You need to upload a GitLab project export archive (ending in .gz)."
msgstr "Es necesario subir un archivo de exportación de proyecto de GitLab (en formato .gz)."
+msgid "You need to verify your primary email first before enabling Two-Factor Authentication."
+msgstr ""
+
msgid "You successfully declined the invitation"
msgstr "Ha rechazado con éxito la invitación"
@@ -38655,10 +39196,10 @@ msgstr ""
msgid "Your %{host} account was signed in to from a new location"
msgstr ""
-msgid "Your %{strong}%{plan_name}%{strong_close} subscription for %{strong}%{namespace_name}%{strong_close} will expire on %{strong}%{expires_on}%{strong_close}."
+msgid "Your %{strong}%{plan_name}%{strong_close} subscription expires on %{strong}%{expires_on}%{strong_close}. After that date, you cannot create issues or merge requests, or use many other features."
msgstr ""
-msgid "Your %{strong}%{plan_name}%{strong_close} subscription will expire on %{strong}%{expires_on}%{strong_close}. After that, you will not be able to create issues or merge requests as well as many other features."
+msgid "Your %{strong}%{plan_name}%{strong_close} subscription for %{strong}%{namespace_name}%{strong_close} will expire on %{strong}%{expires_on}%{strong_close}."
msgstr ""
msgid "Your CI/CD configuration syntax is invalid. View Lint tab for more details."
@@ -38682,7 +39223,7 @@ msgstr ""
msgid "Your GPG keys (%{count})"
msgstr "Sus claves GPG (%{count})"
-msgid "Your GitLab account has been locked due to an excessive amount of unsuccessful sign in attempts. Your account will automatically unlock in %{duration} or you may click the link below to unlock now."
+msgid "Your GitLab account has been locked due to an excessive number of unsuccessful sign in attempts. You can wait for your account to automatically unlock in %{duration} or you can click the link below to unlock now."
msgstr ""
msgid "Your GitLab account request has been approved!"
@@ -38793,6 +39334,9 @@ msgstr "Su comentario será descartado."
msgid "Your commit email is used for web based operations, such as edits and merges."
msgstr ""
+msgid "Your current password is required to register a two-factor authenticator app."
+msgstr ""
+
msgid "Your dashboard has been copied. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
@@ -38892,6 +39436,9 @@ msgstr "Su perfil"
msgid "Your project limit is %{limit} projects! Please contact your administrator to increase it"
msgstr "¡Su límite de proyecto es %{limit} proyectos! Por favor, contacte con su administrador para aumentarlo"
+msgid "Your project will be created at:"
+msgstr ""
+
msgid "Your projects"
msgstr "Tus proyectos"
@@ -38931,11 +39478,10 @@ msgstr "Su página de inicio de sesión es %{url}."
msgid "Your subscription expired!"
msgstr "¡Su suscripción ha caducado!"
-msgid "Your subscription has been downgraded."
-msgstr "Su suscripción ha sido degradada."
-
-msgid "Your subscription will expire in %{remaining_days}."
-msgstr "Su suscripción caducará en %{remaining_days}."
+msgid "Your subscription will expire in %{remaining_days} day."
+msgid_plural "Your subscription will expire in %{remaining_days} days."
+msgstr[0] ""
+msgstr[1] ""
msgid "Your username is %{username}."
msgstr "Su nombre de usuario es %{username}."
@@ -39142,6 +39688,9 @@ msgstr "no se puede bloquer"
msgid "cannot merge"
msgstr ""
+msgid "cannot not be used for user namespace"
+msgstr ""
+
msgid "ciReport|%{degradedNum} degraded"
msgstr ""
@@ -39465,6 +40014,9 @@ msgstr "creado %{timeAgoString} por %{user} en Jira"
msgid "created %{timeAgo}"
msgstr "creado el %{timeAgo}"
+msgid "created %{timeAgo} by %{author}"
+msgstr ""
+
msgid "created by"
msgstr ""
@@ -39509,9 +40061,6 @@ msgstr ""
msgid "does not have a supported extension. Only %{extension_list} are supported"
msgstr "no tiene una extensión compatible. Sólo %{extension_list} son compatibles"
-msgid "domain is not authorized for sign-up."
-msgstr ""
-
msgid "download it"
msgstr "descargarlo"
@@ -39529,18 +40078,13 @@ msgstr "el elemento no es una jerarquía"
msgid "email '%{email}' is not a verified email."
msgstr ""
-msgid "email does not match the allowed domain of %{email_domains}"
-msgid_plural "email does not match the allowed domains: %{email_domains}"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "enabled"
msgstr "habilitado"
msgid "encrypted: needs to be a :required, :optional or :migrating!"
msgstr ""
-msgid "ending with MIME type format is not allowed."
+msgid "ending with a reserved file extension is not allowed."
msgstr ""
msgid "entries cannot be larger than 255 characters"
@@ -39564,6 +40108,9 @@ msgstr "error"
msgid "estimateCommand|%{slash_command} overwrites the total estimated time."
msgstr ""
+msgid "example.com"
+msgstr ""
+
msgid "exceeds the limit of %{bytes} bytes"
msgstr ""
@@ -39614,9 +40161,6 @@ msgstr "para este proyecto"
msgid "fork"
msgstr ""
-msgid "fork this project"
-msgstr ""
-
msgid "from"
msgstr "de"
@@ -39625,6 +40169,9 @@ msgid_plural "from %d jobs"
msgstr[0] "de %d trabajo"
msgstr[1] "de %d trabajos"
+msgid "frontmatter"
+msgstr ""
+
msgid "group"
msgstr "grupo"
@@ -39652,6 +40199,9 @@ msgstr ""
msgid "has been completed."
msgstr ""
+msgid "has too deep level of nesting"
+msgstr ""
+
msgid "help"
msgstr "ayuda"
@@ -39685,9 +40235,21 @@ msgstr "flujo de importación"
msgid "in"
msgstr "en"
+msgid "in Infrastructure :: Kubernetes clusters"
+msgstr ""
+
+msgid "in all GitLab"
+msgstr ""
+
+msgid "in group"
+msgstr ""
+
msgid "in group %{link_to_group}"
msgstr "en el grupo %{link_to_group}"
+msgid "in project"
+msgstr ""
+
msgid "in project %{link_to_project}"
msgstr "en el proyecto %{link_to_project}"
@@ -39729,16 +40291,19 @@ msgstr "no es un descendiente del grupo que es propietario de la plantilla"
msgid "is not a valid X509 certificate."
msgstr "no es un certificado X509 válido."
-msgid "is not allowed since the group is not top-level group."
+msgid "is not allowed for sign-up."
msgstr ""
-msgid "is not allowed. Try again with a different email address, or contact your GitLab admin."
+msgid "is not allowed for this group."
msgstr ""
-msgid "is not allowed. We do not currently support project-level iterations"
+msgid "is not allowed for this project."
msgstr ""
-msgid "is not from an allowed domain."
+msgid "is not allowed since the group is not top-level group."
+msgstr ""
+
+msgid "is not allowed. We do not currently support project-level iterations"
msgstr ""
msgid "is not in the group enforcing Group Managed Account"
@@ -39831,6 +40396,9 @@ msgstr "bloqueado por %{path_lock_user_name} %{created_at}"
msgid "log in"
msgstr "iniciar sesión"
+msgid "managed"
+msgstr ""
+
msgid "manual"
msgstr "manual"
@@ -39878,6 +40446,9 @@ msgstr ""
msgid "mrWidget| Please restore it or use a different %{missingBranchName} branch"
msgstr "Restaure o use una rama diferente %{missingBranchName}"
+msgid "mrWidget|%{linkStart}Set up now%{linkEnd} to analyze your source code for known security vulnerabilities."
+msgstr ""
+
msgid "mrWidget|%{mergeError}."
msgstr ""
@@ -39958,6 +40529,9 @@ msgid_plural "mrWidget|Closes issues"
msgstr[0] ""
msgstr[1] ""
+msgid "mrWidget|Create issue to resolve all threads"
+msgstr ""
+
msgid "mrWidget|Delete source branch"
msgstr "Eliminar la rama de origen"
@@ -39967,12 +40541,18 @@ msgstr "Las estadísticas de los despliegues no están disponibles actualmente"
msgid "mrWidget|Did not close"
msgstr "No se cerró"
+msgid "mrWidget|Dismiss"
+msgstr ""
+
msgid "mrWidget|Email patches"
msgstr "Enviar parches por correo electrónico"
msgid "mrWidget|Failed to load deployment statistics"
msgstr "Error al cargar las estadísticas de despliegue"
+msgid "mrWidget|Hide %{widget} details"
+msgstr ""
+
msgid "mrWidget|If the %{missingBranchName} branch exists in your local repository, you can merge this merge request manually using the command line"
msgstr "Si el branch %{missingBranchName} existe en su repositorio local, puede hacer un merge de la solicitud de merge request manualmente utilizando la línea de comandos"
@@ -40068,9 +40648,6 @@ msgstr ""
msgid "mrWidget|Request to merge"
msgstr "Solicitud de merge"
-msgid "mrWidget|Resolve all threads in new issue"
-msgstr ""
-
msgid "mrWidget|Resolve conflicts"
msgstr "Resolver conflictos"
@@ -40086,6 +40663,9 @@ msgstr "Revertir esta solicitud de merge en un nuevo merge request"
msgid "mrWidget|Revoke approval"
msgstr "Revocar la aprobación"
+msgid "mrWidget|SAST and Secret Detection is not enabled."
+msgstr ""
+
msgid "mrWidget|Set by %{merge_author} to be added to the merge train when the pipeline succeeds"
msgstr ""
@@ -40095,6 +40675,9 @@ msgstr ""
msgid "mrWidget|Set by %{merge_author} to start a merge train when the pipeline succeeds"
msgstr ""
+msgid "mrWidget|Show %{widget} details"
+msgstr ""
+
msgid "mrWidget|The changes were merged into"
msgstr "Los cambios se fusionaron en"
@@ -40107,6 +40690,9 @@ msgstr "Los cambios se fusionarán en"
msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure, or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
msgstr ""
+msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure."
+msgstr ""
+
msgid "mrWidget|The source branch has been deleted"
msgstr "Se ha eliminado el branch de origen"
@@ -40149,6 +40735,9 @@ msgstr ""
msgid "mrWidget|You can merge after removing denied licenses"
msgstr ""
+msgid "mrWidget|You can only merge once this merge request is approved."
+msgstr ""
+
msgid "mrWidget|Your password"
msgstr "Su contraseña"
@@ -40185,6 +40774,9 @@ msgstr ""
msgid "must be less than the limit of %{tag_limit} tags"
msgstr ""
+msgid "must be set for a project namespace"
+msgstr ""
+
msgid "must be unique by status and elapsed time within a policy"
msgstr ""
@@ -40294,6 +40886,9 @@ msgstr "tokens de acceso personal"
msgid "pipeline"
msgstr "pipeline"
+msgid "pipeline schedules documentation"
+msgstr ""
+
msgid "pod_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
msgstr ""
@@ -40343,16 +40938,25 @@ msgstr ""
msgid "project name"
msgstr ""
+msgid "project namespace cannot be the parent of another namespace"
+msgstr ""
+
msgid "projects"
msgstr "proyectos"
msgid "quick actions"
msgstr "acciones rápidas"
-msgid "reCAPTCHA Private Key"
+msgid "reCAPTCHA"
+msgstr ""
+
+msgid "reCAPTCHA helps prevent credential stuffing."
msgstr ""
-msgid "reCAPTCHA Site Key"
+msgid "reCAPTCHA private key"
+msgstr ""
+
+msgid "reCAPTCHA site key"
msgstr ""
msgid "recent activity"
@@ -40579,6 +41183,9 @@ msgstr "subidos"
msgid "user avatar"
msgstr "avatar del usuario"
+msgid "user namespace cannot be the parent of another namespace"
+msgstr ""
+
msgid "user preferences"
msgstr "preferencias de usuario"
@@ -40671,3 +41278,9 @@ msgstr "El fichero yaml no es válido"
msgid "your settings"
msgstr "sus ajustes"
+msgid "{group}"
+msgstr ""
+
+msgid "{project}"
+msgstr ""
+
diff --git a/locale/et_EE/gitlab.po b/locale/et_EE/gitlab.po
index aa0a7833b3d..a9fb75e771b 100644
--- a/locale/et_EE/gitlab.po
+++ b/locale/et_EE/gitlab.po
@@ -14,10 +14,7 @@ msgstr ""
"X-Crowdin-Language: et\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-09-01 22:30\n"
-
-msgid " %{name}, confirm your email address now! "
-msgstr ""
+"PO-Revision-Date: 2021-10-04 20:19\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -92,6 +89,16 @@ msgstr ""
msgid "#general, #development"
msgstr ""
+msgid "%d Alert"
+msgid_plural "%d Alerts"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d Alert:"
+msgid_plural "%d Alerts:"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d Approval"
msgid_plural "%d Approvals"
msgstr[0] ""
@@ -455,7 +462,10 @@ msgstr ""
msgid "%{code_open}Protected:%{code_close} Only exposed to protected branches or tags."
msgstr ""
-msgid "%{commit_author_link} authored %{commit_timeago}"
+msgid "%{commit_author_link} authored %{commit_authored_timeago}"
+msgstr ""
+
+msgid "%{commit_author_link} authored %{commit_authored_timeago} and %{commit_committer_avatar} %{commit_committer_link} committed %{commit_committer_timeago}"
msgstr ""
msgid "%{completedCount} completed weight"
@@ -549,6 +559,15 @@ msgstr ""
msgid "%{doc_link_start}Advanced search%{doc_link_end} is enabled."
msgstr ""
+msgid "%{docs_link_start}Learn about visibility levels.%{docs_link_end}"
+msgstr ""
+
+msgid "%{docs_link_start}What is Large File Storage?%{docs_link_end}"
+msgstr ""
+
+msgid "%{docs_link_start}What is two-factor authentication?%{docs_link_end}"
+msgstr ""
+
msgid "%{due_date} (Past due)"
msgstr ""
@@ -621,9 +640,6 @@ msgstr ""
msgid "%{issueType} actions"
msgstr ""
-msgid "%{issuesCount} issues with a limit of %{maxIssueCount}"
-msgstr ""
-
msgid "%{issuesSize} with a limit of %{maxIssueCount}"
msgstr ""
@@ -681,6 +697,12 @@ msgstr ""
msgid "%{label_for_message} unavailable"
msgstr ""
+msgid "%{learn_more_link}."
+msgstr ""
+
+msgid "%{lessThan} 1 hour"
+msgstr ""
+
msgid "%{lets_encrypt_link_start}Let's Encrypt%{lets_encrypt_link_end} is a free, automated, and open certificate authority (CA) that issues digital certificates to enable HTTPS (SSL/TLS) for sites."
msgstr ""
@@ -693,15 +715,15 @@ msgstr ""
msgid "%{link_start}Learn more%{link_end} about roles."
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
-msgstr ""
-
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
msgstr ""
msgid "%{link_start}Start the title with %{draft_snippet}%{link_end} to prevent a merge request that is a work in progress from being merged before it's ready."
msgstr ""
+msgid "%{link_start}What information does GitLab Inc. collect?%{link_end}"
+msgstr ""
+
msgid "%{listToShow}, and %{awardsListLength} more"
msgstr ""
@@ -854,7 +876,7 @@ msgid_plural "%{securityScanner} results are not available because a pipeline ha
msgstr[0] ""
msgstr[1] ""
-msgid "%{service_ping_link_start}Learn more%{service_ping_link_end} about what information is shared with GitLab Inc."
+msgid "%{service_ping_link_start}What information is shared with GitLab Inc.?%{service_ping_link_end}"
msgstr ""
msgid "%{size} %{unit}"
@@ -890,6 +912,9 @@ msgstr ""
msgid "%{state} epics"
msgstr ""
+msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
+msgstr ""
+
msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
msgstr ""
@@ -949,11 +974,6 @@ msgstr ""
msgid "%{template_project_id} is unknown or invalid"
msgstr ""
-msgid "%{text} %{files}"
-msgid_plural "%{text} %{files} files"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%{text} is available"
msgstr ""
@@ -1038,9 +1058,6 @@ msgstr ""
msgid "%{wildcards_link_start}Wildcards%{wildcards_link_end} such as %{code_tag_start}v*%{code_tag_end} or %{code_tag_start}*-release%{code_tag_end} are supported."
msgstr ""
-msgid "&lt; 1 hour"
-msgstr ""
-
msgid "'%{data}' at %{location} does not match format: %{format}"
msgstr ""
@@ -1124,9 +1141,6 @@ msgstr ""
msgid "(we need your current password to confirm your changes)"
msgstr ""
-msgid "* * * * *"
-msgstr ""
-
msgid "+ %{amount} more"
msgstr ""
@@ -1193,10 +1207,10 @@ msgstr ""
msgid "."
msgstr ""
-msgid "0 bytes"
+msgid "/"
msgstr ""
-msgid "0 for unlimited, only effective with remote storage enabled."
+msgid "0 bytes"
msgstr ""
msgid "0t1DgySidms"
@@ -1326,6 +1340,9 @@ msgstr ""
msgid "1000+"
msgstr ""
+msgid "192.168.0.0/24"
+msgstr ""
+
msgid "1st contribution!"
msgstr ""
@@ -1479,9 +1496,6 @@ msgstr ""
msgid "A plain HTML site that uses Netlify for CI/CD instead of GitLab, but still with all the other great GitLab features"
msgstr ""
-msgid "A plain-text response to show to clients that hit the rate limit."
-msgstr ""
-
msgid "A platform value can be web, mob or app."
msgstr ""
@@ -1563,7 +1577,7 @@ msgstr ""
msgid "APIFuzzing|Configure HTTP basic authentication values. Other authentication methods are supported. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
+msgid "APIFuzzing|Customize your project's API fuzzing configuration options and copy the code snippet to your .gitlab-ci.yml file to apply any changes. Note that this tool does not reflect or update your .gitlab-ci.yml file automatically. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
msgstr ""
msgid "APIFuzzing|Enable authentication"
@@ -1626,9 +1640,6 @@ msgstr ""
msgid "APIFuzzing|To prevent a security leak, authentication info must be added as a %{ciVariablesLinkStart}CI variable%{ciVariablesLinkEnd}. As a user with maintainer access rights, you can manage CI variables in the %{ciSettingsLinkStart}Settings%{ciSettingsLinkEnd} area."
msgstr ""
-msgid "APIFuzzing|Use this tool to generate API fuzzing configuration YAML to copy into your .gitlab-ci.yml file. This tool does not reflect or update your .gitlab-ci.yml file automatically."
-msgstr ""
-
msgid "APIFuzzing|Username for basic authentication"
msgstr ""
@@ -1680,9 +1691,6 @@ msgstr ""
msgid "Abuse reports notification email"
msgstr ""
-msgid "Abuse reports will be sent to this address if it is set. Abuse reports are always available in the admin area."
-msgstr ""
-
msgid "Accept invitation"
msgstr ""
@@ -1719,12 +1727,18 @@ msgstr ""
msgid "Access granted"
msgstr ""
+msgid "Access key ID"
+msgstr ""
+
msgid "Access requests"
msgstr ""
msgid "Access to '%{classification_label}' not allowed"
msgstr ""
+msgid "Access tokens expire after 2 hours. A refresh token may be used at any time to generate a new access token. Non-expiring access tokens are deprecated. Clear this setting to enable backward compatibility."
+msgstr ""
+
msgid "AccessDropdown|Deploy Keys"
msgstr ""
@@ -2037,6 +2051,9 @@ msgstr ""
msgid "Add new directory"
msgstr ""
+msgid "Add new service account"
+msgstr ""
+
msgid "Add or remove previously merged commits"
msgstr ""
@@ -2274,6 +2291,9 @@ msgstr ""
msgid "AdminArea|Features"
msgstr ""
+msgid "AdminArea|Get security updates from GitLab and stay up to date"
+msgstr ""
+
msgid "AdminArea|Groups"
msgstr ""
@@ -2313,6 +2333,12 @@ msgstr ""
msgid "AdminArea|Reporter"
msgstr ""
+msgid "AdminArea|Sign up for the GitLab Security Newsletter to get notified for security updates."
+msgstr ""
+
+msgid "AdminArea|Sign up for the GitLab newsletter"
+msgstr ""
+
msgid "AdminArea|Stop all jobs"
msgstr ""
@@ -2382,9 +2408,15 @@ msgstr ""
msgid "AdminSettings|Disable public access to Pages sites"
msgstr ""
+msgid "AdminSettings|Display a banner on merge requests in projects with no pipelines to initiate steps to add a .gitlab-ci.yml file."
+msgstr ""
+
msgid "AdminSettings|Domain verification is an essential security measure for public GitLab sites. Users are required to demonstrate they control a domain before it is enabled. %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "AdminSettings|Enable pipeline suggestion banner"
+msgstr ""
+
msgid "AdminSettings|Enable shared runners for new projects"
msgstr ""
@@ -2856,10 +2888,10 @@ msgstr ""
msgid "Admin|Quarterly reconciliation will occur on %{qrtlyDate}"
msgstr ""
-msgid "Admin|The number of max seats used for your namespace is currently exceeding the number of seats in your subscription. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgid "Admin|The number of max seats in your namespace exceeds the number of seats in your subscription. On %{qrtlyDate}, quarterly reconciliation occurs and you are automatically billed a prorated amount for the overage. No action is needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice. For more information about the timing of the invoicing process, view the documentation."
msgstr ""
-msgid "Admin|The number of maximum users for your instance is currently exceeding the number of users in license. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgid "Admin|The number of max users in your instance exceeds the number of users in your license. On %{qrtlyDate}, quarterly reconciliation occurs and you are automatically billed a prorated amount for the overage. No action is needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice. For more information about the timing of the invoicing process, view the documentation."
msgstr ""
msgid "Admin|View pending user approvals"
@@ -2880,9 +2912,6 @@ msgstr ""
msgid "Advanced export options"
msgstr ""
-msgid "Advanced permissions, Large File Storage and Two-Factor authentication settings."
-msgstr ""
-
msgid "After a successful password update you will be redirected to login screen."
msgstr ""
@@ -2901,13 +2930,14 @@ msgstr ""
msgid "After you've reviewed these contribution guidelines, you'll be all set to"
msgstr ""
+msgid "Akismet"
+msgstr ""
+
msgid "Akismet API Key"
msgstr ""
-msgid "Alert"
-msgid_plural "Alerts"
-msgstr[0] ""
-msgstr[1] ""
+msgid "Akismet helps prevent the creation of spam issues in public projects."
+msgstr ""
msgid "AlertManagement|Acknowledged"
msgstr ""
@@ -3263,6 +3293,9 @@ msgstr ""
msgid "All (default)"
msgstr ""
+msgid "All GitLab"
+msgstr ""
+
msgid "All Members"
msgstr ""
@@ -3377,6 +3410,9 @@ msgstr ""
msgid "Allow this secondary node to replicate content on Object Storage"
msgstr ""
+msgid "Allow use of licensed EE features"
+msgstr ""
+
msgid "Allow users to dismiss the broadcast message"
msgstr ""
@@ -3452,9 +3488,6 @@ msgstr ""
msgid "Amazon authentication is not %{link_start}correctly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
-msgid "Amount of time (in hours) that users are allowed to skip forced configuration of two-factor authentication"
-msgstr ""
-
msgid "An %{link_start}alert%{link_end} with the same fingerprint is already open. To change the status of this alert, resolve the linked alert."
msgstr ""
@@ -3515,12 +3548,6 @@ msgstr ""
msgid "An error occurred when removing the label."
msgstr ""
-msgid "An error occurred when toggling the notification subscription"
-msgstr ""
-
-msgid "An error occurred when updating the issue weight"
-msgstr ""
-
msgid "An error occurred when updating the title"
msgstr ""
@@ -3569,6 +3596,9 @@ msgstr ""
msgid "An error occurred while enabling Service Desk."
msgstr ""
+msgid "An error occurred while fetching Markdown preview"
+msgstr ""
+
msgid "An error occurred while fetching ancestors"
msgstr ""
@@ -3599,9 +3629,6 @@ msgstr ""
msgid "An error occurred while fetching label colors."
msgstr ""
-msgid "An error occurred while fetching markdown preview"
-msgstr ""
-
msgid "An error occurred while fetching participants"
msgstr ""
@@ -3617,9 +3644,6 @@ msgstr ""
msgid "An error occurred while fetching reference"
msgstr ""
-msgid "An error occurred while fetching sidebar data"
-msgstr ""
-
msgid "An error occurred while fetching tags. Retry the search."
msgstr ""
@@ -3695,6 +3719,9 @@ msgstr ""
msgid "An error occurred while loading merge requests."
msgstr ""
+msgid "An error occurred while loading projects."
+msgstr ""
+
msgid "An error occurred while loading the Needs tab."
msgstr ""
@@ -3929,12 +3956,6 @@ msgstr ""
msgid "Any Milestone"
msgstr ""
-msgid "Any branch"
-msgstr ""
-
-msgid "Any eligible user"
-msgstr ""
-
msgid "Any encrypted tokens"
msgstr ""
@@ -3953,6 +3974,9 @@ msgstr ""
msgid "Any namespace"
msgstr ""
+msgid "App Engine description and apps that are suitable for this deployment target"
+msgstr ""
+
msgid "App ID"
msgstr ""
@@ -4101,6 +4125,11 @@ msgstr ""
msgid "Apply"
msgstr ""
+msgid "Apply %d suggestion"
+msgid_plural "Apply %d suggestions"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Apply a label"
msgstr ""
@@ -4110,13 +4139,10 @@ msgstr ""
msgid "Apply suggestion"
msgstr ""
-msgid "Apply suggestions"
-msgstr ""
-
msgid "Apply template"
msgstr ""
-msgid "Apply this approval rule to any branch or a specific protected branch."
+msgid "Apply this approval rule to all branches or a specific protected branch."
msgstr ""
msgid "Applying"
@@ -4259,9 +4285,6 @@ msgstr ""
msgid "ApprovalSettings|Prevent editing approval rules in projects and merge requests."
msgstr ""
-msgid "ApprovalSettings|Prevent editing approval rules in projects and merge requests. "
-msgstr ""
-
msgid "ApprovalSettings|Remove all approvals when commits are added to the source branch."
msgstr ""
@@ -4277,6 +4300,9 @@ msgstr ""
msgid "ApprovalSettings|This setting is configured at the instance level and can only be changed by an administrator."
msgstr ""
+msgid "ApprovalSettings|This setting is configured in %{groupName} and can only be changed by an administrator or group owner."
+msgstr ""
+
msgid "ApprovalStatusTooltip|Adheres to separation of duties"
msgstr ""
@@ -4763,9 +4789,6 @@ msgstr ""
msgid "Authenticated API rate limit period in seconds"
msgstr ""
-msgid "Authenticated API request rate limit"
-msgstr ""
-
msgid "Authenticated API requests"
msgstr ""
@@ -4775,10 +4798,10 @@ msgstr ""
msgid "Authenticated Git LFS request rate limit"
msgstr ""
-msgid "Authenticated web rate limit period in seconds"
+msgid "Authenticated Git LFS requests"
msgstr ""
-msgid "Authenticated web request rate limit"
+msgid "Authenticated web rate limit period in seconds"
msgstr ""
msgid "Authenticated web requests"
@@ -5156,9 +5179,6 @@ msgstr ""
msgid "Below you will find all the groups that are public."
msgstr ""
-msgid "Beta"
-msgstr ""
-
msgid "Bi-weekly code coverage"
msgstr ""
@@ -5398,6 +5418,21 @@ msgstr ""
msgid "Board scope affects which issues are displayed for anyone who visits this board"
msgstr ""
+msgid "BoardNewEpic|Groups"
+msgstr ""
+
+msgid "BoardNewEpic|Loading groups"
+msgstr ""
+
+msgid "BoardNewEpic|No matching results"
+msgstr ""
+
+msgid "BoardNewEpic|Search groups"
+msgstr ""
+
+msgid "BoardNewEpic|Select a group"
+msgstr ""
+
msgid "BoardNewIssue|No matching results"
msgstr ""
@@ -5475,6 +5510,9 @@ msgstr ""
msgid "Boards|An error occurred while creating the list. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching child groups. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching group projects. Please try again."
msgstr ""
@@ -5807,6 +5845,9 @@ msgstr ""
msgid "Bulk update"
msgstr ""
+msgid "BulkImports|Re-import creates a new group. It does not sync with the existing group."
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -5816,6 +5857,9 @@ msgstr ""
msgid "BulkImport|From source group"
msgstr ""
+msgid "BulkImport|Group import history"
+msgstr ""
+
msgid "BulkImport|Import failed: Destination cannot be a subgroup of the source group. Change the destination and try again."
msgstr ""
@@ -5828,9 +5872,18 @@ msgstr ""
msgid "BulkImport|Importing the group failed"
msgstr ""
+msgid "BulkImport|Last imported to %{link}"
+msgstr ""
+
msgid "BulkImport|Name already exists."
msgstr ""
+msgid "BulkImport|New group"
+msgstr ""
+
+msgid "BulkImport|No history is available"
+msgstr ""
+
msgid "BulkImport|No parent"
msgstr ""
@@ -5843,6 +5896,9 @@ msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} matching filter \"%{filter}\" from %{link}"
msgstr ""
+msgid "BulkImport|Source group"
+msgstr ""
+
msgid "BulkImport|To new group"
msgstr ""
@@ -5852,6 +5908,9 @@ msgstr ""
msgid "BulkImport|You have no groups to import"
msgstr ""
+msgid "BulkImport|Your imported groups will appear here."
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -6094,6 +6153,9 @@ msgstr ""
msgid "Can be manually deployed to"
msgstr ""
+msgid "Can be overridden in each project."
+msgstr ""
+
msgid "Can create groups:"
msgstr ""
@@ -6196,6 +6258,9 @@ msgstr ""
msgid "Cancelling Preview"
msgstr ""
+msgid "Cannot assign a confidential epic to a non-confidential issue. Make the issue confidential and try again"
+msgstr ""
+
msgid "Cannot be assigned to other projects."
msgstr ""
@@ -6247,9 +6312,6 @@ msgstr ""
msgid "Cannot refer to a group %{timebox_type} by an internal id!"
msgstr ""
-msgid "Cannot set confidential epic for a non-confidential issue"
-msgstr ""
-
msgid "Cannot show preview. For previews on sketch files, they must have the file format introduced by Sketch version 43 and above."
msgstr ""
@@ -6487,15 +6549,15 @@ msgstr ""
msgid "Check out, review, and merge locally"
msgstr ""
-msgid "Check the %{docs_link_start}documentation%{docs_link_end}."
-msgstr ""
-
msgid "Check the current instance configuration "
msgstr ""
msgid "Check the elasticsearch.log file to debug why the migration was halted and make any changes before retrying the migration. When you fix the cause of the failure, click \"Retry migration\", and the migration will be scheduled to be retried in the background."
msgstr ""
+msgid "Check with your administrator."
+msgstr ""
+
msgid "Check your Docker images for known vulnerabilities."
msgstr ""
@@ -6526,6 +6588,9 @@ msgstr ""
msgid "Checkout"
msgstr ""
+msgid "Checkout|$%{selectedPlanPrice} per 10 GB storage per pack"
+msgstr ""
+
msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 minutes"
msgstr ""
@@ -6546,17 +6611,23 @@ msgstr ""
msgid "Checkout|%{name}'s GitLab subscription"
msgstr ""
-msgid "Checkout|%{selectedPlanText} plan"
+msgid "Checkout|%{name}'s storage subscription"
msgstr ""
-msgid "Checkout|%{startDate} - %{endDate}"
+msgid "Checkout|%{quantity} GB of storage"
msgstr ""
-msgid "Checkout|%{totalCiMinutes} CI minute"
-msgid_plural "Checkout|%{totalCiMinutes} CI minutes"
+msgid "Checkout|%{quantity} storage pack"
+msgid_plural "Checkout|%{quantity} storage packs"
msgstr[0] ""
msgstr[1] ""
+msgid "Checkout|%{selectedPlanText} plan"
+msgstr ""
+
+msgid "Checkout|%{startDate} - %{endDate}"
+msgstr ""
+
msgid "Checkout|%{totalCiMinutes} CI minutes"
msgstr ""
@@ -6632,6 +6703,9 @@ msgstr ""
msgid "Checkout|Failed to register credit card. Please try again."
msgstr ""
+msgid "Checkout|GB"
+msgstr ""
+
msgid "Checkout|GitLab group"
msgstr ""
@@ -6668,6 +6742,9 @@ msgstr ""
msgid "Checkout|State"
msgstr ""
+msgid "Checkout|Storage packs"
+msgstr ""
+
msgid "Checkout|Street address"
msgstr ""
@@ -6689,6 +6766,9 @@ msgstr ""
msgid "Checkout|Total minutes: %{quantity}"
msgstr ""
+msgid "Checkout|Total storage: %{quantity} GB"
+msgstr ""
+
msgid "Checkout|Users"
msgstr ""
@@ -6698,16 +6778,25 @@ msgstr ""
msgid "Checkout|Your organization"
msgstr ""
+msgid "Checkout|Your storage subscription has the same term as your main subscription, and the price is prorated accordingly."
+msgstr ""
+
msgid "Checkout|Your subscription will be applied to this group"
msgstr ""
msgid "Checkout|Zip code"
msgstr ""
+msgid "Checkout|a storage subscription"
+msgstr ""
+
msgid "Checkout|company or team"
msgstr ""
-msgid "Checkout|x 1,000 minutes per pack = %{strong}"
+msgid "Checkout|minutes"
+msgstr ""
+
+msgid "Checkout|x %{quantity} %{units} per pack ="
msgstr ""
msgid "Cherry-pick this commit"
@@ -7064,6 +7153,9 @@ msgstr ""
msgid "CloneIssue|Cannot clone issue to target project as it is pending deletion."
msgstr ""
+msgid "CloneIssue|Cannot clone issues of '%{issue_type}' type."
+msgstr ""
+
msgid "Cloned this issue to %{path_to_project}."
msgstr ""
@@ -7118,7 +7210,10 @@ msgstr ""
msgid "Closes this %{quick_action_target}."
msgstr ""
-msgid "Cloud licenses can not be removed."
+msgid "Cloud Functions description and apps that are suitable for this deployment target"
+msgstr ""
+
+msgid "Cloud Run description and apps that are suitable for this deployment target"
msgstr ""
msgid "Cluster"
@@ -7145,6 +7240,12 @@ msgstr ""
msgid "ClusterAgents|Access tokens"
msgstr ""
+msgid "ClusterAgents|Agent might not be connected to GitLab"
+msgstr ""
+
+msgid "ClusterAgents|Agent never connected to GitLab"
+msgstr ""
+
msgid "ClusterAgents|Alternative installation methods"
msgstr ""
@@ -7160,6 +7261,12 @@ msgstr ""
msgid "ClusterAgents|Configuration"
msgstr ""
+msgid "ClusterAgents|Connected"
+msgstr ""
+
+msgid "ClusterAgents|Connection status"
+msgstr ""
+
msgid "ClusterAgents|Copy token"
msgstr ""
@@ -7178,6 +7285,9 @@ msgstr ""
msgid "ClusterAgents|For alternative installation methods %{linkStart}go to the documentation%{linkEnd}."
msgstr ""
+msgid "ClusterAgents|For more troubleshooting information go to"
+msgstr ""
+
msgid "ClusterAgents|Go to the repository"
msgstr ""
@@ -7193,18 +7303,30 @@ msgstr ""
msgid "ClusterAgents|Integrate with the GitLab Agent"
msgstr ""
-msgid "ClusterAgents|Last used"
+msgid "ClusterAgents|Last connected %{timeAgo}."
+msgstr ""
+
+msgid "ClusterAgents|Last contact"
msgstr ""
msgid "ClusterAgents|Learn how to create an agent access token"
msgstr ""
+msgid "ClusterAgents|Make sure you are using a valid token."
+msgstr ""
+
msgid "ClusterAgents|Name"
msgstr ""
msgid "ClusterAgents|Never"
msgstr ""
+msgid "ClusterAgents|Never connected"
+msgstr ""
+
+msgid "ClusterAgents|Not connected"
+msgstr ""
+
msgid "ClusterAgents|Read more about getting started"
msgstr ""
@@ -7226,6 +7348,9 @@ msgstr ""
msgid "ClusterAgents|Select which Agent you want to install"
msgstr ""
+msgid "ClusterAgents|The Agent has not been connected in a long time. There might be a connectivity issue. Last contact was %{timeAgo}."
+msgstr ""
+
msgid "ClusterAgents|The GitLab Agent also requires %{linkStart}enabling the Agent Server%{linkEnd}"
msgstr ""
@@ -7253,9 +7378,6 @@ msgstr ""
msgid "ClusterAgents|You will need to create a token to connect to your agent"
msgstr ""
-msgid "ClusterAgent|This feature is only available for premium plans"
-msgstr ""
-
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -7445,9 +7567,6 @@ msgstr ""
msgid "ClusterIntegration|Create Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Create a provision role on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the account and external ID above. %{startMoreInfoLink}More information%{endLink}"
-msgstr ""
-
msgid "ClusterIntegration|Create cluster on"
msgstr ""
@@ -7880,7 +7999,7 @@ msgstr ""
msgid "ClusterIntegration|Subnets"
msgstr ""
-msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provisioned role, first create one on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the above account and external IDs. %{startMoreInfoLink}More information%{endLink}"
+msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provisioned role, first create one on %{awsLinkStart}Amazon Web Services %{awsLinkEnd} using the above account and external IDs. %{moreInfoStart}More information%{moreInfoEnd}"
msgstr ""
msgid "ClusterIntegration|The Kubernetes certificate used to authenticate to the cluster."
@@ -8114,6 +8233,9 @@ msgstr ""
msgid "Collapse replies"
msgstr ""
+msgid "Collapse settings section"
+msgstr ""
+
msgid "Collapse sidebar"
msgstr ""
@@ -8132,6 +8254,9 @@ msgstr ""
msgid "Comma-separated list of email addresses."
msgstr ""
+msgid "Comma-separated list of users allowed to exceed the rate limit."
+msgstr ""
+
msgid "Comma-separated, e.g. '1.1.1.1, 2.2.2.0/24'"
msgstr ""
@@ -8452,6 +8577,9 @@ msgstr ""
msgid "Configure %{repository_checks_link_start}repository checks%{link_end} and %{housekeeping_link_start}housekeeping%{link_end} on repositories."
msgstr ""
+msgid "Configure CAPTCHAs, IP address limits, and other anti-spam measures."
+msgstr ""
+
msgid "Configure Dependency Scanning in `.gitlab-ci.yml` using the GitLab managed template. You can [add variable overrides](https://docs.gitlab.com/ee/user/application_security/dependency_scanning/#customizing-the-dependency-scanning-settings) to customize Dependency Scanning settings."
msgstr ""
@@ -8488,16 +8616,13 @@ msgstr ""
msgid "Configure a %{codeStart}.gitlab-webide.yml%{codeEnd} file in the %{codeStart}.gitlab%{codeEnd} directory to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
msgstr ""
-msgid "Configure existing installation"
-msgstr ""
-
-msgid "Configure limit for notes created per minute by web and API requests."
+msgid "Configure advanced permissions, Large File Storage, and two-factor authentication settings."
msgstr ""
-msgid "Configure limits for Project/Group Import/Export."
+msgid "Configure approvals by authors and committers on all projects."
msgstr ""
-msgid "Configure limits for web and API requests."
+msgid "Configure existing installation"
msgstr ""
msgid "Configure paths to be protected by Rack Attack."
@@ -8512,10 +8637,13 @@ msgstr ""
msgid "Configure settings for Advanced Search with Elasticsearch."
msgstr ""
+msgid "Configure specific limits for Files API requests that supersede the general user and IP rate limits."
+msgstr ""
+
msgid "Configure specific limits for Git LFS requests that supersede the general user and IP rate limits."
msgstr ""
-msgid "Configure specific limits for Packages API requests that supersede the general user and IP rate limits."
+msgid "Configure specific limits for deprecated API requests that supersede the general user and IP rate limits."
msgstr ""
msgid "Configure the %{link} integration."
@@ -8527,6 +8655,9 @@ msgstr ""
msgid "Configure the way a user creates a new account."
msgstr ""
+msgid "Configure via Merge Request"
+msgstr ""
+
msgid "Configure which lists are shown for anyone who visits this board"
msgstr ""
@@ -8995,6 +9126,9 @@ msgstr ""
msgid "Content parsed with %{link}."
msgstr ""
+msgid "ContentEditor|Table of Contents"
+msgstr ""
+
msgid "ContentEditor|You have to provide a renderMarkdown function or a custom serializer"
msgstr ""
@@ -9181,6 +9315,9 @@ msgstr ""
msgid "Copy link to chart"
msgstr ""
+msgid "Copy prefix"
+msgstr ""
+
msgid "Copy reference"
msgstr ""
@@ -9211,6 +9348,9 @@ msgstr ""
msgid "Copy value"
msgstr ""
+msgid "Corpus Management"
+msgstr ""
+
msgid "Corpus Management|Are you sure you want to delete the corpus?"
msgstr ""
@@ -9439,6 +9579,9 @@ msgstr ""
msgid "Create commit"
msgstr ""
+msgid "Create common files more quickly, and standardize their format."
+msgstr ""
+
msgid "Create confidential merge request"
msgstr ""
@@ -9472,6 +9615,9 @@ msgstr ""
msgid "Create issue"
msgstr ""
+msgid "Create issue to resolve all threads"
+msgstr ""
+
msgid "Create iteration"
msgstr ""
@@ -9526,6 +9672,9 @@ msgstr ""
msgid "Create new..."
msgstr ""
+msgid "Create or import your first project"
+msgstr ""
+
msgid "Create project"
msgstr ""
@@ -9883,7 +10032,7 @@ msgstr ""
msgid "Custom notification events"
msgstr ""
-msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notificationLinkStart} notification emails%{notificationLinkEnd}."
+msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notificationLinkStart}notification emails%{notificationLinkEnd}."
msgstr ""
msgid "Custom project templates"
@@ -10082,10 +10231,10 @@ msgid_plural "CycleAnalytics|Showing %{subjectFilterText} and %{selectedLabelsCo
msgstr[0] ""
msgstr[1] ""
-msgid "CycleAnalytics|Showing data for group '%{groupName}' and %{selectedProjectCount} projects from %{startDate} to %{endDate}"
+msgid "CycleAnalytics|Showing data for group '%{groupName}' and %{selectedProjectCount} projects from %{createdAfter} to %{createdBefore}"
msgstr ""
-msgid "CycleAnalytics|Showing data for group '%{groupName}' from %{startDate} to %{endDate}"
+msgid "CycleAnalytics|Showing data for group '%{groupName}' from %{createdAfter} to %{createdBefore}"
msgstr ""
msgid "CycleAnalytics|Stages"
@@ -10319,6 +10468,9 @@ msgstr ""
msgid "DastProfiles|Manage profiles"
msgstr ""
+msgid "DastProfiles|Manage site profiles"
+msgstr ""
+
msgid "DastProfiles|Minimum = 0 (no timeout enabled), Maximum = 2880 minutes"
msgstr ""
@@ -10394,6 +10546,9 @@ msgstr ""
msgid "DastProfiles|Scanner name"
msgstr ""
+msgid "DastProfiles|Schedule"
+msgstr ""
+
msgid "DastProfiles|Select branch"
msgstr ""
@@ -10463,7 +10618,7 @@ msgstr ""
msgid "DastProfiles|Website"
msgstr ""
-msgid "DastProfiles|You can either choose a passive scan or validate the target site in your chosen site profile. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
+msgid "DastProfiles|You can either choose a passive scan or validate the target site from the site profile management page. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
msgstr ""
msgid "DastProfiles|You cannot run an active scan against an unvalidated site."
@@ -10636,7 +10791,7 @@ msgstr ""
msgid "Days to merge"
msgstr ""
-msgid "Deactivate dormant users after 90 days of inactivity. Users can return to active status by signing in to their account. While inactive, a user is not counted as an active user in the instance."
+msgid "Deactivate dormant users after 90 days of inactivity"
msgstr ""
msgid "Dear Administrator,"
@@ -10723,10 +10878,10 @@ msgstr ""
msgid "Define a custom pattern with cron syntax"
msgstr ""
-msgid "Define approval settings."
+msgid "Define approval rules."
msgstr ""
-msgid "Define approval settings. %{linkStart}Learn more.%{linkEnd}"
+msgid "Define approval rules. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "Define custom rules for what constitutes spam, independent of Akismet"
@@ -10735,7 +10890,7 @@ msgstr ""
msgid "Define environments in the deploy stage(s) in %{code_open}.gitlab-ci.yml%{code_close} to track deployments here."
msgstr ""
-msgid "Define how approval rules are applied as a merge request moves toward completion."
+msgid "Define how approval rules are applied to merge requests."
msgstr ""
msgid "Definition"
@@ -10750,6 +10905,12 @@ msgstr ""
msgid "DelayedJobs|Are you sure you want to run %{job_name} immediately? This job will run automatically after it's timer finishes."
msgstr ""
+msgid "DelayedJobs|Are you sure you want to run %{job_name} immediately? This job will run automatically after its timer finishes."
+msgstr ""
+
+msgid "DelayedJobs|Run the delayed job now?"
+msgstr ""
+
msgid "DelayedJobs|Start now"
msgstr ""
@@ -11026,6 +11187,12 @@ msgstr ""
msgid "Dependency proxy image prefix"
msgstr ""
+msgid "DependencyProxy|Create a local proxy for storing frequently used upstream images. %{docLinkStart}Learn more%{docLinkEnd} about dependency proxies."
+msgstr ""
+
+msgid "DependencyProxy|Dependency Proxy"
+msgstr ""
+
msgid "DependencyProxy|Toggle Dependency Proxy"
msgstr ""
@@ -11266,6 +11433,9 @@ msgstr ""
msgid "Deployments"
msgstr ""
+msgid "Deployments to Google Kubernetes Engine can be "
+msgstr ""
+
msgid "Deployments|%{deployments} environment impacted."
msgid_plural "Deployments|%{deployments} environments impacted."
msgstr[0] ""
@@ -11295,6 +11465,9 @@ msgstr ""
msgid "Deployment|success"
msgstr ""
+msgid "Deprecated API rate limits"
+msgstr ""
+
msgid "Deprioritize label"
msgstr ""
@@ -11697,6 +11870,16 @@ msgstr ""
msgid "DiffsCompareBaseBranch|(base)"
msgstr ""
+msgid "Diffs|%d addition"
+msgid_plural "Diffs|%d additions"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Diffs|%d deletion"
+msgid_plural "Diffs|%d deletions"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Diffs|No file name available"
msgstr ""
@@ -11706,9 +11889,17 @@ msgstr ""
msgid "Diffs|Show all unchanged lines"
msgstr ""
+msgid "Diffs|Showing %{dropdownStart}%{count} changed file%{dropdownEnd}"
+msgid_plural "Diffs|Showing %{dropdownStart}%{count} changed files%{dropdownEnd}"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Diffs|Something went wrong while fetching diff lines."
msgstr ""
+msgid "Diffs|with %{additions} and %{deletions}"
+msgstr ""
+
msgid "Direct member"
msgstr ""
@@ -11834,9 +12025,6 @@ msgid_plural "Dismiss %d selected vulnerabilities as"
msgstr[0] ""
msgstr[1] ""
-msgid "Dismiss Value Stream Analytics introduction box"
-msgstr ""
-
msgid "Dismiss merge request promotion"
msgstr ""
@@ -12158,6 +12346,9 @@ msgstr ""
msgid "Edit issues"
msgstr ""
+msgid "Edit merge requests"
+msgstr ""
+
msgid "Edit public deploy key"
msgstr ""
@@ -12233,6 +12424,9 @@ msgstr ""
msgid "Elastic|None. Select projects to index."
msgstr ""
+msgid "Eligible users"
+msgstr ""
+
msgid "Email"
msgstr ""
@@ -12362,6 +12556,9 @@ msgstr ""
msgid "Enable"
msgstr ""
+msgid "Enable Amazon EKS integration"
+msgstr ""
+
msgid "Enable Auto DevOps"
msgstr ""
@@ -12395,6 +12592,9 @@ msgstr ""
msgid "Enable SSL verification"
msgstr ""
+msgid "Enable Service Ping"
+msgstr ""
+
msgid "Enable Snowplow tracking"
msgstr ""
@@ -12425,6 +12625,9 @@ msgstr ""
msgid "Enable authenticated Git LFS request rate limit"
msgstr ""
+msgid "Enable authenticated web request rate limit"
+msgstr ""
+
msgid "Enable authentication"
msgstr ""
@@ -12485,7 +12688,7 @@ msgstr ""
msgid "Enable or disable the Pseudonymizer data collection."
msgstr ""
-msgid "Enable or disable version check and service ping."
+msgid "Enable or disable version check and Service Ping."
msgstr ""
msgid "Enable protected paths rate limit"
@@ -12497,18 +12700,12 @@ msgstr ""
msgid "Enable reCAPTCHA"
msgstr ""
-msgid "Enable reCAPTCHA for login"
-msgstr ""
-
-msgid "Enable reCAPTCHA, Invisible Captcha, Akismet and set IP limits. For reCAPTCHA, we currently only support %{recaptcha_v2_link_start}v2%{recaptcha_v2_link_end}"
+msgid "Enable reCAPTCHA for login."
msgstr ""
msgid "Enable repository checks"
msgstr ""
-msgid "Enable service ping"
-msgstr ""
-
msgid "Enable shared runners for all projects and subgroups in this group."
msgstr ""
@@ -12530,7 +12727,10 @@ msgstr ""
msgid "Enable unauthenticated API request rate limit"
msgstr ""
-msgid "Enable unauthenticated request rate limit"
+msgid "Enable unauthenticated web request rate limit"
+msgstr ""
+
+msgid "Enable user deactivation emails"
msgstr ""
msgid "Enable version check"
@@ -12566,9 +12766,6 @@ msgstr ""
msgid "Enabled sources for code import during project creation. OmniAuth must be configured for GitHub"
msgstr ""
-msgid "Enabling this will only make licensed EE features available to projects if the project namespace's plan includes the feature or if the project is public."
-msgstr ""
-
msgid "Encountered an error while rendering: %{err}"
msgstr ""
@@ -12617,9 +12814,6 @@ msgstr ""
msgid "Enter Admin Mode"
msgstr ""
-msgid "Enter IP address range"
-msgstr ""
-
msgid "Enter a number"
msgstr ""
@@ -12632,9 +12826,6 @@ msgstr ""
msgid "Enter at least three characters to search"
msgstr ""
-msgid "Enter domain"
-msgstr ""
-
msgid "Enter in your Bitbucket Server URL and personal access token below"
msgstr ""
@@ -12821,9 +13012,6 @@ msgstr ""
msgid "Environments|Deployment %{status}"
msgstr ""
-msgid "Environments|Dismiss"
-msgstr ""
-
msgid "Environments|Enable review app"
msgstr ""
@@ -12836,9 +13024,6 @@ msgstr ""
msgid "Environments|Environments are places where code gets deployed, such as staging or production."
msgstr ""
-msgid "Environments|Help us improve environments"
-msgstr ""
-
msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
msgstr ""
@@ -12875,6 +13060,9 @@ msgstr ""
msgid "Environments|Note that this action will stop the environment, but it will %{emphasisStart}not%{emphasisEnd} have an effect on any existing deployment due to no “stop environment action†being defined in the %{ciConfigLinkStart}.gitlab-ci.yml%{ciConfigLinkEnd} file."
msgstr ""
+msgid "Environments|Open"
+msgstr ""
+
msgid "Environments|Open live environment"
msgstr ""
@@ -12914,9 +13102,6 @@ msgstr ""
msgid "Environments|Stopping %{environmentName}"
msgstr ""
-msgid "Environments|Take the survey"
-msgstr ""
-
msgid "Environments|There was an error fetching the logs. Please try again."
msgstr ""
@@ -12938,9 +13123,6 @@ msgstr ""
msgid "Environments|You don't have any environments right now"
msgstr ""
-msgid "Environments|Your feedback helps GitLab make environments better for you and other users. Participate and enter a sweepstake to win a USD 30 gift card."
-msgstr ""
-
msgid "Environments|by %{avatar}"
msgstr ""
@@ -13223,7 +13405,7 @@ msgstr ""
msgid "Error parsing CSV file. Please make sure it has"
msgstr ""
-msgid "Error rendering markdown preview"
+msgid "Error rendering Markdown preview"
msgstr ""
msgid "Error saving label update."
@@ -13271,6 +13453,9 @@ msgstr ""
msgid "Error: %{error_message}"
msgstr ""
+msgid "Error: Couldn't load some or all of the changes."
+msgstr ""
+
msgid "Error: No AWS credentials were supplied"
msgstr ""
@@ -13304,6 +13489,9 @@ msgstr ""
msgid "ErrorTracking|Enable error tracking"
msgstr ""
+msgid "ErrorTracking|Error tracking backend"
+msgstr ""
+
msgid "ErrorTracking|If you self-host Sentry, enter your Sentry instance's full URL. If you use Sentry's hosted solution, enter https://sentry.io"
msgstr ""
@@ -13337,6 +13525,12 @@ msgstr ""
msgid "Escalation policies must have at least one rule"
msgstr ""
+msgid "EscalationPolicies|%{clockIcon} IF alert is not %{alertStatus} in %{minutes}"
+msgstr ""
+
+msgid "EscalationPolicies|%{notificationIcon} THEN %{doAction} %{forScheduleOrUser}"
+msgstr ""
+
msgid "EscalationPolicies|+ Add an additional rule"
msgstr ""
@@ -13379,13 +13573,13 @@ msgstr ""
msgid "EscalationPolicies|Escalation policies"
msgstr ""
-msgid "EscalationPolicies|Escalation rules"
+msgid "EscalationPolicies|Escalation policy %{obstacle} in Project %{project}"
msgstr ""
-msgid "EscalationPolicies|Failed to load oncall-schedules"
+msgid "EscalationPolicies|Escalation rules"
msgstr ""
-msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} %{then} THEN %{doAction} %{scheduleOrUser}"
+msgid "EscalationPolicies|Failed to load oncall-schedules"
msgstr ""
msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} minutes"
@@ -13463,18 +13657,36 @@ msgstr ""
msgid "Every %{action} attempt has failed: %{job_error_message}. Please try again."
msgstr ""
+msgid "Every 3 months"
+msgstr ""
+
+msgid "Every 3 months on the %{day} at %{time} %{timezone}"
+msgstr ""
+
+msgid "Every 6 months"
+msgstr ""
+
+msgid "Every 6 months on the %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Every day"
msgstr ""
msgid "Every day (at %{time})"
msgstr ""
+msgid "Every day at %{time} %{timezone}"
+msgstr ""
+
msgid "Every month"
msgstr ""
msgid "Every month (Day %{day} at %{time})"
msgstr ""
+msgid "Every month on the %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Every three months"
msgstr ""
@@ -13489,6 +13701,15 @@ msgstr[1] ""
msgid "Every week (%{weekday} at %{time})"
msgstr ""
+msgid "Every week on %{day} at %{time} %{timezone}"
+msgstr ""
+
+msgid "Every year"
+msgstr ""
+
+msgid "Every year on %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Everyone"
msgstr ""
@@ -13525,9 +13746,6 @@ msgstr ""
msgid "Exactly one of %{attributes} is required"
msgstr ""
-msgid "Example: %{ip_address}. %{read_more_link}."
-msgstr ""
-
msgid "Example: @sub\\.company\\.com$"
msgstr ""
@@ -13594,13 +13812,13 @@ msgstr ""
msgid "Expand pipeline"
msgstr ""
-msgid "Expand sidebar"
+msgid "Expand settings section"
msgstr ""
-msgid "Expected documents: %{expected_documents}"
+msgid "Expand sidebar"
msgstr ""
-msgid "Experienced"
+msgid "Expected documents: %{expected_documents}"
msgstr ""
msgid "ExperimentSubject|Must have exactly one of User, Namespace, or Project."
@@ -13885,9 +14103,6 @@ msgstr ""
msgid "Failed to load related branches"
msgstr ""
-msgid "Failed to load sidebar lock status"
-msgstr ""
-
msgid "Failed to load stacktrace."
msgstr ""
@@ -14312,6 +14527,9 @@ msgstr ""
msgid "Files"
msgstr ""
+msgid "Files API Rate Limits"
+msgstr ""
+
msgid "Files breadcrumb"
msgstr ""
@@ -15311,6 +15529,9 @@ msgstr ""
msgid "GitLab group: %{source_link}"
msgstr ""
+msgid "GitLab informs you if a new version is available."
+msgstr ""
+
msgid "GitLab is a complete DevOps platform, delivered as a single application, fundamentally changing the way Development, Security, and Ops teams collaborate"
msgstr ""
@@ -15326,7 +15547,7 @@ msgstr ""
msgid "GitLab is open source software to collaborate on code."
msgstr ""
-msgid "GitLab is undergoing maintenance and is operating in a read-only mode."
+msgid "GitLab is undergoing maintenance and is operating in read-only mode."
msgstr ""
msgid "GitLab member or Email address"
@@ -15338,9 +15559,6 @@ msgstr ""
msgid "GitLab project export"
msgstr ""
-msgid "GitLab restart is required to apply changes."
-msgstr ""
-
msgid "GitLab single sign-on URL"
msgstr ""
@@ -15356,9 +15574,6 @@ msgstr ""
msgid "GitLab version"
msgstr ""
-msgid "GitLab will inform you if a new version is available."
-msgstr ""
-
msgid "GitLab will run a background job that will produce pseudonymized CSVs of the GitLab database that will be uploaded to your configured object storage directory."
msgstr ""
@@ -15623,9 +15838,21 @@ msgstr ""
msgid "Go to snippets"
msgstr ""
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check 'Allowed domains for sign-ups'."
+msgstr ""
+
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check 'Email restrictions for sign-ups'."
+msgstr ""
+
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check the 'Domain denylist'."
+msgstr ""
+
msgid "Go to the activity feed"
msgstr ""
+msgid "Go to the group’s 'Settings &gt; General' page, and check 'Restrict membership by email domain'."
+msgstr ""
+
msgid "Go to the milestone list"
msgstr ""
@@ -15662,6 +15889,12 @@ msgstr ""
msgid "Goal of the changes and what reviewers should be aware of"
msgstr ""
+msgid "Google Cloud"
+msgstr ""
+
+msgid "Google Cloud offers several deployment targets. Select the one most suitable for your project."
+msgstr ""
+
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
@@ -15746,9 +15979,6 @@ msgstr ""
msgid "Group ID"
msgstr ""
-msgid "Group ID: %{group_id}"
-msgstr ""
-
msgid "Group Owner must have signed in with SAML before enabling Group Managed Accounts"
msgstr ""
@@ -15923,6 +16153,12 @@ msgstr ""
msgid "GroupImport|Unable to process group import file"
msgstr ""
+msgid "GroupPage|Copy group ID"
+msgstr ""
+
+msgid "GroupPage|Group ID: %{group_id}"
+msgstr ""
+
msgid "GroupRoadmap|%{dateWord} – No end date"
msgstr ""
@@ -15977,6 +16213,9 @@ msgstr ""
msgid "GroupRoadmap|Within 3 years"
msgstr ""
+msgid "GroupSAML|\"persistent\" recommended"
+msgstr ""
+
msgid "GroupSAML|%{strongOpen}Warning%{strongClose} - Enabling %{linkStart}SSO enforcement%{linkEnd} can reduce security risks."
msgstr ""
@@ -16109,6 +16348,9 @@ msgstr ""
msgid "GroupSAML|To be able to prohibit outer forks, you first need to enforce dedicate group managed accounts."
msgstr ""
+msgid "GroupSAML|Use SAML group links to manage group membership using SAML."
+msgstr ""
+
msgid "GroupSAML|Valid SAML Response"
msgstr ""
@@ -16121,13 +16363,10 @@ msgstr ""
msgid "GroupSAML|as %{access_level}"
msgstr ""
-msgid "GroupSAML|must match stored NameID of \"%{extern_uid}\" as we use this to identify users. If the NameID changes users will be unable to sign in."
-msgstr ""
-
-msgid "GroupSAML|should be \"persistent\""
+msgid "GroupSAML|must match stored NameID of \"%{extern_uid}\" to identify user and allow sign in"
msgstr ""
-msgid "GroupSAML|should be a random persistent ID, emails are discouraged"
+msgid "GroupSAML|recommend persistent ID instead of email"
msgstr ""
msgid "GroupSelect|No matching results"
@@ -16142,9 +16381,15 @@ msgstr ""
msgid "GroupSettings|Allow project access token creation"
msgstr ""
+msgid "GroupSettings|Applied to all subgroups unless overridden by a group owner. Groups already added to the project lose access."
+msgstr ""
+
msgid "GroupSettings|Auto DevOps pipeline was updated for the group"
msgstr ""
+msgid "GroupSettings|Available only on the top-level group. Applies to all subgroups. Groups already shared with a group outside %{group} are still shared unless removed manually."
+msgstr ""
+
msgid "GroupSettings|Badges"
msgstr ""
@@ -16196,6 +16441,9 @@ msgstr ""
msgid "GroupSettings|New runners registration token has been generated!"
msgstr ""
+msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgstr ""
+
msgid "GroupSettings|Pipeline settings was updated for the group"
msgstr ""
@@ -16208,12 +16456,15 @@ msgstr ""
msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
-msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups."
+msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups"
msgstr ""
msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
msgstr ""
+msgid "GroupSettings|Prevents group members from being notified if the group is mentioned."
+msgstr ""
+
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
msgstr ""
@@ -16250,21 +16501,6 @@ msgstr ""
msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}."
msgstr ""
-msgid "GroupSettings|This setting is only available on the top-level group and it applies to all subgroups. Groups that have already been shared with a group outside %{group} will still be shared, and this access will have to be revoked manually."
-msgstr ""
-
-msgid "GroupSettings|This setting will be applied to all subgroups unless overridden by a group owner. Groups that already have access to the project will continue to have access unless removed manually."
-msgstr ""
-
-msgid "GroupSettings|This setting will override user notification preferences for all members of the group, subgroups, and projects."
-msgstr ""
-
-msgid "GroupSettings|This setting will prevent group members from being notified if the group is mentioned."
-msgstr ""
-
-msgid "GroupSettings|This setting will prevent group members from forking projects outside of the group."
-msgstr ""
-
msgid "GroupSettings|Transfer group"
msgstr ""
@@ -16382,7 +16618,7 @@ msgstr ""
msgid "GroupsNew|No import options available"
msgstr ""
-msgid "GroupsNew|Not all related objects are migrated, as %{docs_link_start}described here%{docs_link_end}. Please %{feedback_link_start}leave feedback%{feedback_link_end} on this feature."
+msgid "GroupsNew|Not all related objects are migrated. %{docs_link_start}More info%{docs_link_end}."
msgstr ""
msgid "GroupsNew|Personal access token"
@@ -16514,15 +16750,27 @@ msgstr ""
msgid "Hello %{name},"
msgstr ""
-msgid "Hello there"
-msgstr ""
-
msgid "Hello, %{name}!"
msgstr ""
msgid "Hello, %{username}!"
msgstr ""
+msgid "HelloMessage|%{handshake_emoji} Contribute to GitLab: %{contribute_link}"
+msgstr ""
+
+msgid "HelloMessage|%{magnifier_emoji} Create a new GitLab issue: %{new_issue_link}"
+msgstr ""
+
+msgid "HelloMessage|%{rocket_emoji} We like your curiosity! Help us improve GitLab by joining the team: %{jobs_page_link}"
+msgstr ""
+
+msgid "HelloMessage|Does this page need fixes or improvements? Open an issue or contribute a merge request to help make GitLab more lovable. At GitLab, everyone can contribute!"
+msgstr ""
+
+msgid "HelloMessage|Welcome to GitLab!"
+msgstr ""
+
msgid "Help"
msgstr ""
@@ -16532,13 +16780,10 @@ msgstr ""
msgid "Helps prevent bots from creating accounts."
msgstr ""
-msgid "Helps prevent bots from creating issues"
-msgstr ""
-
-msgid "Helps prevent malicious users hide their activity"
+msgid "Helps prevent bots from creating issues."
msgstr ""
-msgid "Helps reduce request volume (e.g. from crawlers or abusive bots)"
+msgid "Helps prevent malicious users hide their activity."
msgstr ""
msgid "Helps reduce request volume (for example, from crawlers or abusive bots)"
@@ -16662,6 +16907,12 @@ msgstr ""
msgid "Housekeeping, export, path, transfer, remove, archive."
msgstr ""
+msgid "How do I configure Akismet?"
+msgstr ""
+
+msgid "How do I configure it?"
+msgstr ""
+
msgid "How do I configure runners?"
msgstr ""
@@ -16683,19 +16934,25 @@ msgstr ""
msgid "How do I set up this service?"
msgstr ""
+msgid "How do I use a web terminal?"
+msgstr ""
+
+msgid "How do I use file templates?"
+msgstr ""
+
msgid "How it works"
msgstr ""
msgid "How many days need to pass between marking entity for deletion and actual removing it."
msgstr ""
-msgid "How many seconds an IP will be counted towards the limit"
+msgid "How many seconds an IP counts toward the IP address limit."
msgstr ""
-msgid "I accept the %{terms_link}"
+msgid "How the job limiter handles jobs exceeding the thresholds specified below. The 'track' mode only logs the jobs. The 'compress' mode compresses the jobs and raises an exception if the compressed size exceeds the limit."
msgstr ""
-msgid "I accept the|Terms of Service and Privacy Policy"
+msgid "I accept the %{terms_link}"
msgstr ""
msgid "I forgot my password"
@@ -16779,13 +17036,16 @@ msgstr ""
msgid "IP Address"
msgstr ""
-msgid "IP expiration time"
+msgid "IP address expiration time"
msgstr ""
-msgid "IP subnet restriction only allowed for top-level groups"
+msgid "IP address restrictions"
+msgstr ""
+
+msgid "IP addresses per user"
msgstr ""
-msgid "IPs per user"
+msgid "IP subnet restriction only allowed for top-level groups"
msgstr ""
msgid "Identifier"
@@ -16800,6 +17060,9 @@ msgstr ""
msgid "If any indexed field exceeds this limit it will be truncated to this number of characters and the rest will not be indexed or searchable. This does not apply to repository and wiki indexing. Setting this to 0 means it is unlimited."
msgstr ""
+msgid "If blank, defaults to %{code_open}Retry later%{code_close}."
+msgstr ""
+
msgid "If blank, set allowable lifetime to %{instance_level_policy_in_words}, as defined by the instance admin. Once set, existing tokens for users in this group may be revoked."
msgstr ""
@@ -16851,6 +17114,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 did not initiate these sign-in attempts, please reach out to your administrator or enable two-factor authentication (2FA) on your account."
+msgstr ""
+
msgid "If you did not initiate this change, please contact your administrator immediately."
msgstr ""
@@ -16942,10 +17208,10 @@ msgstr ""
msgid "Import Projects from Gitea"
msgstr ""
-msgid "Import a project"
+msgid "Import an exported GitLab project"
msgstr ""
-msgid "Import an exported GitLab project"
+msgid "Import and export rate limits"
msgstr ""
msgid "Import failed due to a GitHub error: %{original}"
@@ -16957,12 +17223,18 @@ msgstr ""
msgid "Import from Jira"
msgstr ""
+msgid "Import group"
+msgstr ""
+
msgid "Import group from file"
msgstr ""
msgid "Import groups"
msgstr ""
+msgid "Import history"
+msgstr ""
+
msgid "Import in progress"
msgstr ""
@@ -17026,7 +17298,25 @@ msgstr ""
msgid "Import timed out. Import took longer than %{import_jobs_expiration} seconds"
msgstr ""
-msgid "Import/Export Rate Limits"
+msgid "ImportAProjectModal|Import from a project"
+msgstr ""
+
+msgid "ImportAProjectModal|Import members from another project"
+msgstr ""
+
+msgid "ImportAProjectModal|Import project members"
+msgstr ""
+
+msgid "ImportAProjectModal|Only project members (not group members) are imported, and they get the same permissions as the project you import from."
+msgstr ""
+
+msgid "ImportAProjectModal|Successfully imported"
+msgstr ""
+
+msgid "ImportAProjectModal|Unable to import project members"
+msgstr ""
+
+msgid "ImportAProjectModal|You're importing members to the %{strongStart}%{name}%{strongEnd} project."
msgstr ""
msgid "ImportButtons|Connect repositories from"
@@ -17079,7 +17369,7 @@ msgstr[1] ""
msgid "Importing..."
msgstr ""
-msgid "Import|A repository URL usually ends in a .git suffix, although this is not required. Double check to make sure your repository URL is correct."
+msgid "Import|There is not a valid Git repository at this URL. If your HTTP repository is not publicly accessible, verify your credentials."
msgstr ""
msgid "Improve customer support with Service Desk"
@@ -17088,9 +17378,6 @@ msgstr ""
msgid "Improves Git cloning performance."
msgstr ""
-msgid "In %{time_to_now}"
-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 ""
@@ -17376,7 +17663,7 @@ msgstr ""
msgid "InProductMarketing|Start a GitLab Ultimate trial today in less than one minute, no credit card required."
msgstr ""
-msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no CC required"
+msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no credit card required"
msgstr ""
msgid "InProductMarketing|Start a trial"
@@ -17415,7 +17702,7 @@ msgstr ""
msgid "InProductMarketing|Team up in GitLab for greater efficiency"
msgstr ""
-msgid "InProductMarketing|Team work makes the dream work"
+msgid "InProductMarketing|Team work makes the dream work"
msgstr ""
msgid "InProductMarketing|Test, create, deploy"
@@ -17996,6 +18283,9 @@ msgstr ""
msgid "Integrations|Create new issue in Jira"
msgstr ""
+msgid "Integrations|Create new issue in ZenTao"
+msgstr ""
+
msgid "Integrations|Default settings are inherited from the group level."
msgstr ""
@@ -18089,9 +18379,15 @@ msgstr ""
msgid "Integrations|Search Jira issues"
msgstr ""
+msgid "Integrations|Search ZenTao issues"
+msgstr ""
+
msgid "Integrations|Send notifications about project events to Unify Circuit."
msgstr ""
+msgid "Integrations|Send notifications about project events to a Unify Circuit conversation. %{docs_link}"
+msgstr ""
+
msgid "Integrations|Sign in to add namespaces"
msgstr ""
@@ -18131,6 +18427,9 @@ msgstr ""
msgid "Integrations|You've activated every integration 🎉"
msgstr ""
+msgid "Integrations|ZenTao issues display here when you create issues in your project in ZenTao."
+msgstr ""
+
msgid "Interactive mode"
msgstr ""
@@ -18158,9 +18457,6 @@ msgstr ""
msgid "Interval Pattern"
msgstr ""
-msgid "Introducing Value Stream Analytics"
-msgstr ""
-
msgid "Introducing Your DevOps Report"
msgstr ""
@@ -18257,6 +18553,12 @@ msgstr ""
msgid "Investigate vulnerability: %{title}"
msgstr ""
+msgid "Invisible Captcha"
+msgstr ""
+
+msgid "Invisible Captcha helps prevent the creation of spam accounts. It adds a honeypot field and time-sensitive form submission to the account signup form."
+msgstr ""
+
msgid "Invitation"
msgstr ""
@@ -18710,12 +19012,18 @@ msgstr ""
msgid "Issues"
msgstr ""
+msgid "Issues I've created"
+msgstr ""
+
msgid "Issues Rate Limits"
msgstr ""
msgid "Issues and merge requests"
msgstr ""
+msgid "Issues assigned to me"
+msgstr ""
+
msgid "Issues can be bugs, tasks or ideas to be discussed. Also, issues are searchable and filterable."
msgstr ""
@@ -18827,7 +19135,7 @@ msgstr ""
msgid "Iterations|Create cadence"
msgstr ""
-msgid "Iterations|Create your first iteration"
+msgid "Iterations|Create iteration"
msgstr ""
msgid "Iterations|Delete cadence"
@@ -18836,6 +19144,9 @@ msgstr ""
msgid "Iterations|Delete iteration cadence?"
msgstr ""
+msgid "Iterations|Delete iteration?"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -18869,12 +19180,18 @@ msgstr ""
msgid "Iterations|New iteration cadence"
msgstr ""
+msgid "Iterations|No closed iterations."
+msgstr ""
+
msgid "Iterations|No iteration cadences to show."
msgstr ""
msgid "Iterations|No iterations in cadence."
msgstr ""
+msgid "Iterations|No open iterations."
+msgstr ""
+
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
@@ -18905,6 +19222,9 @@ msgstr ""
msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
msgstr ""
+msgid "Iterations|This will remove the iteration from any issues that are assigned to it."
+msgstr ""
+
msgid "Iterations|Title"
msgstr ""
@@ -18920,15 +19240,9 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "I’m familiar with the basics of DevOps."
-msgstr ""
-
msgid "I’m joining my team who’s already on GitLab"
msgstr ""
-msgid "I’m not familiar with the basics of DevOps."
-msgstr ""
-
msgid "Jaeger URL"
msgstr ""
@@ -19193,6 +19507,9 @@ msgstr ""
msgid "Job"
msgstr ""
+msgid "Job %{jobName}"
+msgstr ""
+
msgid "Job Failed #%{build_id}"
msgstr ""
@@ -19783,9 +20100,6 @@ msgstr ""
msgid "Learn more in the"
msgstr ""
-msgid "Learn more in the|pipeline schedules documentation"
-msgstr ""
-
msgid "Learn more."
msgstr ""
@@ -19897,9 +20211,6 @@ msgstr ""
msgid "Leave Admin Mode"
msgstr ""
-msgid "Leave blank for no limit. Once set, existing personal access tokens may be revoked."
-msgstr ""
-
msgid "Leave edit mode? All unsaved changes will be lost."
msgstr ""
@@ -19945,10 +20256,10 @@ msgstr ""
msgid "LicenseCompliance|Acceptable license to be used in the project"
msgstr ""
-msgid "LicenseCompliance|Add a license"
+msgid "LicenseCompliance|Add license and related policy"
msgstr ""
-msgid "LicenseCompliance|Add license and related policy"
+msgid "LicenseCompliance|Add license policy"
msgstr ""
msgid "LicenseCompliance|Allow"
@@ -20038,6 +20349,9 @@ msgstr ""
msgid "LicenseManagement|Uncategorized"
msgstr ""
+msgid "Licensed Enterprise Edition features can be used if the project namespace's plan includes the feature, or if the project is public."
+msgstr ""
+
msgid "Licensed Features"
msgstr ""
@@ -20104,7 +20418,10 @@ msgstr ""
msgid "Limit namespaces and projects that can be indexed"
msgstr ""
-msgid "Limit sign in from multiple ips"
+msgid "Limit project size at a global, group, and project level. %{link_start}Learn more%{link_end}."
+msgstr ""
+
+msgid "Limit sign in from multiple IP addresses"
msgstr ""
msgid "Limit the number of concurrent operations this secondary site can run in the background."
@@ -20116,11 +20433,17 @@ msgstr ""
msgid "Limit the number of issues and epics per minute a user can create through web and API requests."
msgstr ""
+msgid "Limit the size of Sidekiq jobs stored in Redis."
+msgstr ""
+
msgid "Limited to showing %d event at most"
msgid_plural "Limited to showing %d events at most"
msgstr[0] ""
msgstr[1] ""
+msgid "Limiting mode"
+msgstr ""
+
msgid "Line changes"
msgstr ""
@@ -20190,9 +20513,6 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
-msgid "List of users to be excluded from the limit"
-msgstr ""
-
msgid "List options"
msgstr ""
@@ -20232,9 +20552,6 @@ msgstr ""
msgid "Loading functions timed out. Please reload the page to try again."
msgstr ""
-msgid "Loading issues"
-msgstr ""
-
msgid "Loading more"
msgstr ""
@@ -20526,6 +20843,9 @@ msgstr ""
msgid "Marked For Deletion At - %{deletion_time}"
msgstr ""
+msgid "Marked as ready. Merging is now allowed."
+msgstr ""
+
msgid "Marked this %{noun} as a draft."
msgstr ""
@@ -20598,52 +20918,22 @@ msgstr ""
msgid "Max 100,000 events"
msgstr ""
-msgid "Max 20 characters"
-msgstr ""
-
-msgid "Max Group Export Download requests per minute per user"
-msgstr ""
-
-msgid "Max Group Export requests per minute per user"
-msgstr ""
-
-msgid "Max Group Import requests per minute per user"
-msgstr ""
-
-msgid "Max Project Export Download requests per minute per user"
-msgstr ""
-
-msgid "Max Project Export requests per minute per user"
-msgstr ""
-
-msgid "Max Project Import requests per minute per user"
-msgstr ""
-
-msgid "Max authenticated API requests per period per user"
-msgstr ""
-
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
-msgid "Max authenticated web requests per period per user"
-msgstr ""
-
msgid "Max file size is 200 KB."
msgstr ""
-msgid "Max requests per minute per user"
-msgstr ""
-
msgid "Max role"
msgstr ""
msgid "Max session time"
msgstr ""
-msgid "Max unauthenticated requests per period per IP"
+msgid "MaxBuilds"
msgstr ""
-msgid "MaxBuilds"
+msgid "Maximum 20 characters"
msgstr ""
msgid "Maximum Conan package file size in bytes"
@@ -20679,6 +20969,12 @@ msgstr ""
msgid "Maximum attachment size (MB)"
msgstr ""
+msgid "Maximum authenticated API requests per rate limit period per user"
+msgstr ""
+
+msgid "Maximum authenticated web requests per rate limit period per user"
+msgstr ""
+
msgid "Maximum bulk request size (MiB)"
msgstr ""
@@ -20724,6 +21020,15 @@ msgstr ""
msgid "Maximum files in a diff"
msgstr ""
+msgid "Maximum group export download requests per minute"
+msgstr ""
+
+msgid "Maximum group export requests per minute"
+msgstr ""
+
+msgid "Maximum group import requests per minute"
+msgstr ""
+
msgid "Maximum import size"
msgstr ""
@@ -20760,7 +21065,7 @@ msgstr ""
msgid "Maximum number of projects."
msgstr ""
-msgid "Maximum number of unique IPs per user"
+msgid "Maximum number of unique IP addresses per user."
msgstr ""
msgid "Maximum page reached"
@@ -20769,12 +21074,24 @@ msgstr ""
msgid "Maximum page size"
msgstr ""
+msgid "Maximum project export download requests per minute"
+msgstr ""
+
+msgid "Maximum project export requests per minute"
+msgstr ""
+
+msgid "Maximum project import requests per minute"
+msgstr ""
+
msgid "Maximum push size"
msgstr ""
msgid "Maximum push size (MB)"
msgstr ""
+msgid "Maximum requests per minute"
+msgstr ""
+
msgid "Maximum running slices"
msgstr ""
@@ -20802,10 +21119,16 @@ msgstr ""
msgid "Maximum time between updates that a mirror can have when scheduled to synchronize."
msgstr ""
-msgid "Maximum time for web terminal websocket connection (in seconds). 0 for unlimited."
+msgid "Maximum time that users are allowed to skip the setup of two-factor authentication (in hours). Set to 0 (zero) to enforce at next sign in."
msgstr ""
-msgid "Maximum time that users are allowed to skip the setup of two-factor authentication (in hours). Set to 0 (zero) to enforce at next sign in."
+msgid "Maximum time, in seconds, for a web terminal websocket connection. 0 for unlimited."
+msgstr ""
+
+msgid "Maximum unauthenticated API requests per rate limit period per IP"
+msgstr ""
+
+msgid "Maximum unauthenticated web requests per rate limit period per IP"
msgstr ""
msgid "May"
@@ -20823,9 +21146,6 @@ msgstr ""
msgid "Medium vulnerabilities present"
msgstr ""
-msgid "Member lock"
-msgstr ""
-
msgid "Member since"
msgstr ""
@@ -20862,6 +21182,9 @@ msgstr ""
msgid "Members of a group may only view projects they have permission to access"
msgstr ""
+msgid "Membership"
+msgstr ""
+
msgid "Members|%{time} by %{user}"
msgstr ""
@@ -20922,9 +21245,6 @@ msgstr ""
msgid "Members|Expiration date updated successfully."
msgstr ""
-msgid "Members|Expired"
-msgstr ""
-
msgid "Members|Filter members"
msgstr ""
@@ -20940,9 +21260,6 @@ msgstr ""
msgid "Members|Membership"
msgstr ""
-msgid "Members|No expiration set"
-msgstr ""
-
msgid "Members|Remove \"%{groupName}\""
msgstr ""
@@ -20964,9 +21281,6 @@ msgstr ""
msgid "Members|Search invited"
msgstr ""
-msgid "Members|in %{time}"
-msgstr ""
-
msgid "Member|Deny access"
msgstr ""
@@ -21042,9 +21356,6 @@ msgstr ""
msgid "Merge request %{mr_link} was reviewed by %{mr_author}"
msgstr ""
-msgid "Merge request (MR) approvals"
-msgstr ""
-
msgid "Merge request analytics"
msgstr ""
@@ -21066,12 +21377,21 @@ msgstr ""
msgid "Merge requests"
msgstr ""
+msgid "Merge requests I've created"
+msgstr ""
+
msgid "Merge requests are a place to propose changes you've made to a project and discuss those changes with others"
msgstr ""
msgid "Merge requests are read-only in a secondary Geo node"
msgstr ""
+msgid "Merge requests assigned to me"
+msgstr ""
+
+msgid "Merge requests that I'm a reviewer"
+msgstr ""
+
msgid "Merge the branch and fix any conflicts that come up"
msgstr ""
@@ -21132,10 +21452,10 @@ msgstr ""
msgid "MergeRequests|An error occurred while saving the draft comment."
msgstr ""
-msgid "MergeRequests|Failed to squash. Should be done manually."
+msgid "MergeRequests|Create issue to resolve thread"
msgstr ""
-msgid "MergeRequests|Resolve this thread in a new issue"
+msgid "MergeRequests|Failed to squash. Should be done manually."
msgstr ""
msgid "MergeRequests|Saving the comment failed"
@@ -21949,6 +22269,9 @@ msgstr ""
msgid "MoveIssue|Cannot move issue to project it originates from!"
msgstr ""
+msgid "MoveIssue|Cannot move issues of '%{issue_type}' type."
+msgstr ""
+
msgid "Moved issue to %{label} column in the board."
msgstr ""
@@ -22074,6 +22397,15 @@ 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. To learn more about reducing storage capacity please visit our docs."
msgstr ""
+msgid "NamespaceUserCap|Pending users must be reviewed and approved by a group owner. Learn more about %{user_caps_link_start}User Caps%{link_end} and %{users_pending_approval_link_start}Users Pending Approval%{link_end}."
+msgstr ""
+
+msgid "NamespaceUserCap|View pending user approvals"
+msgstr ""
+
+msgid "NamespaceUserCap|Your group has reached its billable member limit"
+msgstr ""
+
msgid "Namespaces"
msgstr ""
@@ -22116,9 +22448,6 @@ msgstr ""
msgid "Network"
msgstr ""
-msgid "Network Policy|New rule"
-msgstr ""
-
msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is inbound from a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
msgstr ""
@@ -22140,16 +22469,13 @@ msgstr ""
msgid "NetworkPolicies|%{strongOpen}any%{strongClose} port"
msgstr ""
-msgid "NetworkPolicies|+ Add alert"
-msgstr ""
-
msgid "NetworkPolicies|.yaml"
msgstr ""
msgid "NetworkPolicies|.yaml mode"
msgstr ""
-msgid "NetworkPolicies|Actions"
+msgid "NetworkPolicies|Add alert"
msgstr ""
msgid "NetworkPolicies|Alerts are intended to be selectively used for a limited number of events that are potentially concerning and warrant a manual review. Alerts should not be used as a substitute for a SIEM or a logging tool. High volume alerts are likely to be dropped so as to preserve the stability of GitLab's integration with Kubernetes."
@@ -22185,9 +22511,6 @@ msgstr ""
msgid "NetworkPolicies|Deny all traffic"
msgstr ""
-msgid "NetworkPolicies|Description"
-msgstr ""
-
msgid "NetworkPolicies|Edit policy"
msgstr ""
@@ -22200,9 +22523,6 @@ msgstr ""
msgid "NetworkPolicies|IP/subnet"
msgstr ""
-msgid "NetworkPolicies|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
-msgstr ""
-
msgid "NetworkPolicies|Invalid or empty policy"
msgstr ""
@@ -22212,19 +22532,16 @@ msgstr ""
msgid "NetworkPolicies|Kubernetes error: %{error}"
msgstr ""
-msgid "NetworkPolicies|Name"
-msgstr ""
-
msgid "NetworkPolicies|Network"
msgstr ""
-msgid "NetworkPolicies|Network traffic"
+msgid "NetworkPolicies|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
msgstr ""
-msgid "NetworkPolicies|New policy"
+msgid "NetworkPolicies|Network policy can be created after the environment is loaded successfully."
msgstr ""
-msgid "NetworkPolicies|No policies detected"
+msgid "NetworkPolicies|Network traffic"
msgstr ""
msgid "NetworkPolicies|None selected"
@@ -22233,21 +22550,12 @@ msgstr ""
msgid "NetworkPolicies|Please %{installLinkStart}install%{installLinkEnd} and %{configureLinkStart}configure a Kubernetes Agent for this project%{configureLinkEnd} to enable alerts."
msgstr ""
-msgid "NetworkPolicies|Policies are a specification of how groups of pods are allowed to communicate with each other's network endpoints."
-msgstr ""
-
msgid "NetworkPolicies|Policy %{policyName} was successfully changed"
msgstr ""
msgid "NetworkPolicies|Policy definition"
msgstr ""
-msgid "NetworkPolicies|Policy editor"
-msgstr ""
-
-msgid "NetworkPolicies|Policy preview"
-msgstr ""
-
msgid "NetworkPolicies|Rule"
msgstr ""
@@ -22257,9 +22565,6 @@ msgstr ""
msgid "NetworkPolicies|Rule mode is unavailable for this policy. In some cases, we cannot parse the YAML file back into the rules editor."
msgstr ""
-msgid "NetworkPolicies|Rules"
-msgstr ""
-
msgid "NetworkPolicies|Save changes"
msgstr ""
@@ -22272,9 +22577,6 @@ msgstr ""
msgid "NetworkPolicies|Traffic that does not match any rule will be blocked."
msgstr ""
-msgid "NetworkPolicies|Unable to parse policy"
-msgstr ""
-
msgid "NetworkPolicies|all DNS names"
msgstr ""
@@ -22454,6 +22756,9 @@ msgstr ""
msgid "New issue"
msgstr ""
+msgid "New issue in %{project}"
+msgstr ""
+
msgid "New issue title"
msgstr ""
@@ -22532,7 +22837,7 @@ msgstr ""
msgid "Newest first"
msgstr ""
-msgid "Newly registered users will by default be external"
+msgid "Newly-registered users are external by default"
msgstr ""
msgid "Next"
@@ -22847,8 +23152,10 @@ msgstr ""
msgid "No webhooks found, add one in the form above."
msgstr ""
-msgid "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} to renew your subscription."
-msgstr ""
+msgid "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} day to renew your subscription."
+msgid_plural "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} days to renew your subscription."
+msgstr[0] ""
+msgstr[1] ""
msgid "No. of commits"
msgstr ""
@@ -22865,7 +23172,7 @@ msgstr ""
msgid "Nodes"
msgstr ""
-msgid "Non-admin users can sign in with read-only access and make read-only API requests."
+msgid "Non-admin users are restricted to read-only access, in both GitLab UI and API."
msgstr ""
msgid "None"
@@ -22946,7 +23253,7 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
-msgid "Notes Rate Limits"
+msgid "Notes rate limit"
msgstr ""
msgid "Notes|Are you sure you want to cancel creating this comment?"
@@ -23113,9 +23420,6 @@ msgstr ""
msgid "November"
msgstr ""
-msgid "Novice"
-msgstr ""
-
msgid "Now, personalize your GitLab experience"
msgstr ""
@@ -23284,7 +23588,7 @@ msgstr ""
msgid "OnCallSchedules|For this rotation, on-call will be:"
msgstr ""
-msgid "OnCallSchedules|On-call schedule %{schedule} in Project %{project}"
+msgid "OnCallSchedules|On-call schedule %{obstacle} in Project %{project}"
msgstr ""
msgid "OnCallSchedules|On-call schedules"
@@ -23431,22 +23735,22 @@ msgstr ""
msgid "OnDemandScans|Scanner profile"
msgstr ""
-msgid "OnDemandScans|Select one of the existing profiles"
+msgid "OnDemandScans|Schedule scan"
msgstr ""
-msgid "OnDemandScans|Site profile"
+msgid "OnDemandScans|Select one of the existing profiles"
msgstr ""
-msgid "OnDemandScans|Use existing scanner profile"
+msgid "OnDemandScans|Site profile"
msgstr ""
-msgid "OnDemandScans|Use existing site profile"
+msgid "OnDemandScans|Start time"
msgstr ""
-msgid "OnDemandScans|You can either choose a passive scan or validate the target site in your chosen site profile. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
+msgid "OnDemandScans|Use existing scanner profile"
msgstr ""
-msgid "OnDemandScans|You cannot run an active scan against an unvalidated site."
+msgid "OnDemandScans|Use existing site profile"
msgstr ""
msgid "OnDemandScans|You must create a repository within your project to run an on-demand scan."
@@ -23511,6 +23815,9 @@ msgstr ""
msgid "Only admins can delete project"
msgstr ""
+msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
+msgstr ""
+
msgid "Only include features new to your current subscription tier."
msgstr ""
@@ -23529,6 +23836,12 @@ msgstr ""
msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
+msgid "Only reCAPTCHA v2 is supported:"
+msgstr ""
+
+msgid "Only users from the specified IP address ranges are able to reach this group, including all subgroups, projects, and Git repositories."
+msgstr ""
+
msgid "Only verified users with an email address in any of these domains can be added to the group."
msgstr ""
@@ -23715,9 +24028,6 @@ msgstr ""
msgid "Package Registry"
msgstr ""
-msgid "Package Registry Rate Limits"
-msgstr ""
-
msgid "Package Registry: authenticated API requests"
msgstr ""
@@ -23736,6 +24046,9 @@ msgstr ""
msgid "Package recipe already exists"
msgstr ""
+msgid "Package registry rate limits"
+msgstr ""
+
msgid "Package type"
msgstr ""
@@ -23802,6 +24115,9 @@ msgstr ""
msgid "PackageRegistry|Composer"
msgstr ""
+msgid "PackageRegistry|Composer.json with license: %{license} and version: %{version}"
+msgstr ""
+
msgid "PackageRegistry|Conan"
msgstr ""
@@ -23865,6 +24181,9 @@ msgstr ""
msgid "PackageRegistry|Copy require package include"
msgstr ""
+msgid "PackageRegistry|Copy target SHA"
+msgstr ""
+
msgid "PackageRegistry|Copy yarn command"
msgstr ""
@@ -23931,6 +24250,9 @@ msgstr ""
msgid "PackageRegistry|Install package version"
msgstr ""
+msgid "PackageRegistry|Instance-level"
+msgstr ""
+
msgid "PackageRegistry|Invalid Package: failed metadata extraction"
msgstr ""
@@ -23976,6 +24298,9 @@ msgstr ""
msgid "PackageRegistry|Pip Command"
msgstr ""
+msgid "PackageRegistry|Project-level"
+msgstr ""
+
msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
msgstr ""
@@ -23997,6 +24322,9 @@ msgstr ""
msgid "PackageRegistry|Remove package"
msgstr ""
+msgid "PackageRegistry|Required Python: %{pythonVersion}"
+msgstr ""
+
msgid "PackageRegistry|RubyGems"
msgstr ""
@@ -24039,6 +24367,9 @@ msgstr ""
msgid "PackageRegistry|Source project located at %{link}"
msgstr ""
+msgid "PackageRegistry|Target SHA: %{sha}"
+msgstr ""
+
msgid "PackageRegistry|There are no other versions of this package."
msgstr ""
@@ -24207,6 +24538,18 @@ msgstr ""
msgid "Password was successfully updated. Please sign in again."
msgstr ""
+msgid "PasswordPrompt|Confirm password"
+msgstr ""
+
+msgid "PasswordPrompt|Confirm password to continue"
+msgstr ""
+
+msgid "PasswordPrompt|Password is required"
+msgstr ""
+
+msgid "PasswordPrompt|Please enter your password to confirm"
+msgstr ""
+
msgid "Passwords should be unique and not used for any other sites or services."
msgstr ""
@@ -24234,6 +24577,9 @@ msgstr ""
msgid "Paste project path (i.e. gitlab-org/gitlab)"
msgstr ""
+msgid "Paste this DSN into your Sentry SDK"
+msgstr ""
+
msgid "Paste your public SSH key, which is usually contained in the file '~/.ssh/id_ed25519.pub' or '~/.ssh/id_rsa.pub' and begins with 'ssh-ed25519' or 'ssh-rsa'. Do not paste your private SSH key, as that can compromise your identity."
msgstr ""
@@ -24318,6 +24664,9 @@ msgstr ""
msgid "PerformanceBar|First Contentful Paint"
msgstr ""
+msgid "PerformanceBar|Flamegraph with mode:"
+msgstr ""
+
msgid "PerformanceBar|Frontend resources"
msgstr ""
@@ -24351,6 +24700,15 @@ msgstr ""
msgid "PerformanceBar|Trace"
msgstr ""
+msgid "PerformanceBar|cpu"
+msgstr ""
+
+msgid "PerformanceBar|object"
+msgstr ""
+
+msgid "PerformanceBar|wall"
+msgstr ""
+
msgid "Period in seconds"
msgstr ""
@@ -24579,6 +24937,48 @@ msgstr ""
msgid "PipelineSchedules|Variables"
msgstr ""
+msgid "PipelineSource|API"
+msgstr ""
+
+msgid "PipelineSource|Chat"
+msgstr ""
+
+msgid "PipelineSource|External"
+msgstr ""
+
+msgid "PipelineSource|External Pull Request"
+msgstr ""
+
+msgid "PipelineSource|Merge Request"
+msgstr ""
+
+msgid "PipelineSource|On-Demand DAST Scan"
+msgstr ""
+
+msgid "PipelineSource|On-Demand DAST Validation"
+msgstr ""
+
+msgid "PipelineSource|Parent Pipeline"
+msgstr ""
+
+msgid "PipelineSource|Pipeline"
+msgstr ""
+
+msgid "PipelineSource|Push"
+msgstr ""
+
+msgid "PipelineSource|Schedule"
+msgstr ""
+
+msgid "PipelineSource|Trigger"
+msgstr ""
+
+msgid "PipelineSource|Web"
+msgstr ""
+
+msgid "PipelineSource|Web IDE"
+msgstr ""
+
msgid "PipelineStatusTooltip|Pipeline: %{ciStatus}"
msgstr ""
@@ -24879,46 +25279,7 @@ msgstr ""
msgid "Pipeline|Source"
msgstr ""
-msgid "Pipeline|Source|API"
-msgstr ""
-
-msgid "Pipeline|Source|Chat"
-msgstr ""
-
-msgid "Pipeline|Source|External"
-msgstr ""
-
-msgid "Pipeline|Source|External Pull Request"
-msgstr ""
-
-msgid "Pipeline|Source|Merge Request"
-msgstr ""
-
-msgid "Pipeline|Source|On-Demand DAST Scan"
-msgstr ""
-
-msgid "Pipeline|Source|On-Demand DAST Validation"
-msgstr ""
-
-msgid "Pipeline|Source|Parent Pipeline"
-msgstr ""
-
-msgid "Pipeline|Source|Pipeline"
-msgstr ""
-
-msgid "Pipeline|Source|Push"
-msgstr ""
-
-msgid "Pipeline|Source|Schedule"
-msgstr ""
-
-msgid "Pipeline|Source|Trigger"
-msgstr ""
-
-msgid "Pipeline|Source|Web"
-msgstr ""
-
-msgid "Pipeline|Source|Web IDE"
+msgid "Pipeline|Source|Security Policy"
msgstr ""
msgid "Pipeline|Specify variable values to be used in this run. The values specified in %{linkStart}CI/CD settings%{linkEnd} will be used by default."
@@ -24969,7 +25330,7 @@ msgstr ""
msgid "Pipeline|We are currently unable to fetch pipeline data"
msgstr ""
-msgid "Pipeline|You’re about to stop pipeline %{pipelineId}."
+msgid "Pipeline|You’re about to stop pipeline #%{pipelineId}."
msgstr ""
msgid "Pipeline|for"
@@ -24996,6 +25357,9 @@ msgstr ""
msgid "Plain diff"
msgstr ""
+msgid "Plain-text response to send to clients that hit a rate limit"
+msgstr ""
+
msgid "Plan:"
msgstr ""
@@ -25140,9 +25504,6 @@ msgstr ""
msgid "Please provide attributes to update"
msgstr ""
-msgid "Please provide your username or email address."
-msgstr ""
-
msgid "Please reach out if you have any questions and we'll be happy to assist."
msgstr ""
@@ -25185,9 +25546,6 @@ msgstr ""
msgid "Please set a new password before proceeding."
msgstr ""
-msgid "Please share your feedback about %{featureName} %{linkStart}in this issue%{linkEnd} to help us improve the experience."
-msgstr ""
-
msgid "Please solve the captcha"
msgstr ""
@@ -25365,6 +25723,9 @@ msgstr ""
msgid "Prevent adding new members to project membership within this group"
msgstr ""
+msgid "Prevent auto-stopping"
+msgstr ""
+
msgid "Prevent editing approval rules in projects and merge requests."
msgstr ""
@@ -25377,7 +25738,7 @@ msgstr ""
msgid "Prevent users from changing their profile name"
msgstr ""
-msgid "Prevent users from performing write operations on GitLab while performing maintenance."
+msgid "Prevent users from performing write operations while GitLab maintenance is in progress."
msgstr ""
msgid "Preview"
@@ -25650,6 +26011,9 @@ msgstr ""
msgid "Profiles|Enter your name, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Enter your password to confirm the email change"
+msgstr ""
+
msgid "Profiles|Enter your pronouns to let people know how to refer to you"
msgstr ""
@@ -25884,10 +26248,10 @@ msgstr ""
msgid "Profiles|e.g. My MacBook key"
msgstr ""
-msgid "Profiles|username"
+msgid "Profiles|https://website.com"
msgstr ""
-msgid "Profiles|website.com"
+msgid "Profiles|username"
msgstr ""
msgid "Profiles|your account"
@@ -26130,9 +26494,21 @@ msgstr ""
msgid "ProjectSelect| or group"
msgstr ""
+msgid "ProjectSelect|No matching results"
+msgstr ""
+
msgid "ProjectSelect|Search for project"
msgstr ""
+msgid "ProjectSelect|Search projects"
+msgstr ""
+
+msgid "ProjectSelect|Select a project"
+msgstr ""
+
+msgid "ProjectSelect|There was an error fetching the projects. Please try again."
+msgstr ""
+
msgid "ProjectService|Drone server URL"
msgstr ""
@@ -26220,6 +26596,9 @@ msgstr ""
msgid "ProjectService|Trigger event when a new, unique alert is recorded."
msgstr ""
+msgid "ProjectService|Trigger event when a new, unique vulnerability is recorded. (Note: This feature requires an Ultimate plan.)"
+msgstr ""
+
msgid "ProjectService|Trigger event when a pipeline status changes."
msgstr ""
@@ -26634,9 +27013,15 @@ msgstr ""
msgid "Projects are graded based on the highest severity vulnerability present"
msgstr ""
+msgid "Projects are organized into groups"
+msgstr ""
+
msgid "Projects contributed to"
msgstr ""
+msgid "Projects help you organize your work. They contain your file repository, issues, merge requests, and so much more."
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr ""
@@ -26871,10 +27256,10 @@ msgstr ""
msgid "PrometheusService|Prometheus cluster integration"
msgstr ""
-msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
+msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
msgstr ""
-msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
+msgid "PrometheusService|The ID of the IAP-secured resource."
msgstr ""
msgid "PrometheusService|The Prometheus API base URL."
@@ -27492,6 +27877,9 @@ msgstr ""
msgid "Rate limit"
msgstr ""
+msgid "Rate limits can help reduce request volume (like from crawlers or abusive bots)."
+msgstr ""
+
msgid "Raw blob request rate limit per minute"
msgstr ""
@@ -27504,6 +27892,9 @@ msgstr ""
msgid "Re-authentication required"
msgstr ""
+msgid "Re-import"
+msgstr ""
+
msgid "Re-request review"
msgstr ""
@@ -27525,6 +27916,9 @@ msgstr ""
msgid "Read more about related issues"
msgstr ""
+msgid "Read their documentation."
+msgstr ""
+
msgid "Ready to get started with GitLab? Follow these steps to set up your workspace, plan and commit changes, and deploy your project."
msgstr ""
@@ -27558,6 +27952,9 @@ msgstr ""
msgid "Receive any notifications from GitLab."
msgstr ""
+msgid "Receive notification of abuse reports by email."
+msgstr ""
+
msgid "Receive notifications about your own activity"
msgstr ""
@@ -27701,9 +28098,6 @@ msgstr ""
msgid "Registry setup"
msgstr ""
-msgid "Regulate approvals by authors/committers. Affects all projects."
-msgstr ""
-
msgid "Reindexing Status: %{status} (Slice multiplier: %{multiplier}, Maximum running slices: %{max_slices})"
msgstr ""
@@ -27799,6 +28193,9 @@ msgstr ""
msgid "Release|Something went wrong while saving the release details."
msgstr ""
+msgid "Reload page"
+msgstr ""
+
msgid "Remediations"
msgstr ""
@@ -28081,6 +28478,9 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
+msgid "Repeats"
+msgstr ""
+
msgid "Replace"
msgstr ""
@@ -28443,10 +28843,7 @@ msgstr ""
msgid "Require additional authentication for administrative tasks."
msgstr ""
-msgid "Require all users in this group to setup Two-factor authentication"
-msgstr ""
-
-msgid "Require all users in this group to setup two-factor authentication"
+msgid "Require all users in this group to set up two-factor authentication"
msgstr ""
msgid "Required approvals (%{approvals_given} given)"
@@ -28492,6 +28889,9 @@ msgstr[1] ""
msgid "Requires values to meet regular expression requirements."
msgstr ""
+msgid "Requires you to deploy or set up cloud-hosted Sentry."
+msgstr ""
+
msgid "Requires your primary GitLab email address."
msgstr ""
@@ -28552,9 +28952,6 @@ msgstr ""
msgid "Resolve"
msgstr ""
-msgid "Resolve all threads in new issue"
-msgstr ""
-
msgid "Resolve conflicts"
msgstr ""
@@ -28612,6 +29009,9 @@ msgstr ""
msgid "Response text"
msgstr ""
+msgid "Restart GitLab to apply changes."
+msgstr ""
+
msgid "Restart Terminal"
msgstr ""
@@ -28630,6 +29030,9 @@ msgstr ""
msgid "Restoring the project will prevent the project from being removed on this date and restore people's ability to make changes to it."
msgstr ""
+msgid "Restrict group access by IP address. %{link_start}Learn more%{link_end}."
+msgstr ""
+
msgid "Restrict membership by email domain"
msgstr ""
@@ -28943,6 +29346,9 @@ msgstr ""
msgid "Runners|Runner #%{runner_id}"
msgstr ""
+msgid "Runners|Runner assigned to project."
+msgstr ""
+
msgid "Runners|Runner is offline, last contact was %{runner_contact} ago"
msgstr ""
@@ -28955,6 +29361,9 @@ msgstr ""
msgid "Runners|Runner registration"
msgstr ""
+msgid "Runners|Runner unassigned from project."
+msgstr ""
+
msgid "Runners|Runners"
msgstr ""
@@ -29147,7 +29556,7 @@ msgstr ""
msgid "SastEntryPoints|How do I set up SAST?"
msgstr ""
-msgid "SastEntryPoints|Learn more."
+msgid "SastEntryPoints|Learn more"
msgstr ""
msgid "Satisfied"
@@ -29189,7 +29598,7 @@ msgstr ""
msgid "Save pipeline schedule"
msgstr ""
-msgid "Save space and find images in the container Registry. remove unneeded tags and keep only the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
+msgid "Save storage space by automatically deleting tags from the container registry and keeping the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
msgstr ""
msgid "Saving"
@@ -29363,6 +29772,9 @@ msgstr ""
msgid "Search or filter results…"
msgstr ""
+msgid "Search or jump to..."
+msgstr ""
+
msgid "Search project"
msgstr ""
@@ -29423,16 +29835,16 @@ msgstr ""
msgid "SearchCodeResults|of %{link_to_project}"
msgstr ""
-msgid "SearchResults|Showing %{count} %{scope} for%{term_element}"
+msgid "SearchResults|Showing %{count} %{scope} for %{term_element}"
msgstr ""
-msgid "SearchResults|Showing %{count} %{scope} for%{term_element} in your personal and project snippets"
+msgid "SearchResults|Showing %{count} %{scope} for %{term_element} in your personal and project snippets"
msgstr ""
-msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for%{term_element}"
+msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for %{term_element}"
msgstr ""
-msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for%{term_element} in your personal and project snippets"
+msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for %{term_element} in your personal and project snippets"
msgstr ""
msgid "SearchResults|code result"
@@ -29514,6 +29926,9 @@ msgstr ""
msgid "Secret Detection"
msgstr ""
+msgid "Secret access key"
+msgstr ""
+
msgid "Secret token"
msgstr ""
@@ -29553,9 +29968,6 @@ msgstr ""
msgid "SecurityApprovals|A merge request approval is required when the license compliance report contains a denied license."
msgstr ""
-msgid "SecurityApprovals|Configurable if security scanners are enabled. %{linkStart}Learn more.%{linkEnd}"
-msgstr ""
-
msgid "SecurityApprovals|Coverage-Check"
msgstr ""
@@ -29568,24 +29980,18 @@ msgstr ""
msgid "SecurityApprovals|Learn more about Vulnerability-Check"
msgstr ""
-msgid "SecurityApprovals|License Scanning must be enabled. %{linkStart}Learn more%{linkEnd}."
-msgstr ""
-
msgid "SecurityApprovals|License-Check"
msgstr ""
msgid "SecurityApprovals|Requires approval for Denied licenses. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}More information%{linkEnd}"
+msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "SecurityApprovals|Requires approval for vulnerabilities. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
-msgid "SecurityApprovals|Test coverage must be enabled. %{linkStart}Learn more%{linkEnd}."
-msgstr ""
-
msgid "SecurityApprovals|Vulnerability-Check"
msgstr ""
@@ -29649,6 +30055,12 @@ msgstr ""
msgid "SecurityConfiguration|Immediately begin risk analysis and remediation with application security features. Start with SAST and Secret Detection, available to all plans. Upgrade to Ultimate to get all features, including:"
msgstr ""
+msgid "SecurityConfiguration|Manage corpus"
+msgstr ""
+
+msgid "SecurityConfiguration|Manage corpus files used as mutation sources in coverage fuzzing."
+msgstr ""
+
msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
msgstr ""
@@ -29703,6 +30115,12 @@ msgstr ""
msgid "SecurityOrchestration|Action"
msgstr ""
+msgid "SecurityOrchestration|Actions"
+msgstr ""
+
+msgid "SecurityOrchestration|Add rule"
+msgstr ""
+
msgid "SecurityOrchestration|All policies"
msgstr ""
@@ -29736,9 +30154,6 @@ msgstr ""
msgid "SecurityOrchestration|Network"
msgstr ""
-msgid "SecurityOrchestration|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
-msgstr ""
-
msgid "SecurityOrchestration|New policy"
msgstr ""
@@ -29754,6 +30169,9 @@ msgstr ""
msgid "SecurityOrchestration|Policy editor"
msgstr ""
+msgid "SecurityOrchestration|Policy preview"
+msgstr ""
+
msgid "SecurityOrchestration|Policy status"
msgstr ""
@@ -29763,6 +30181,9 @@ msgstr ""
msgid "SecurityOrchestration|Rule"
msgstr ""
+msgid "SecurityOrchestration|Rules"
+msgstr ""
+
msgid "SecurityOrchestration|Scan Execution"
msgstr ""
@@ -29856,6 +30277,9 @@ msgstr ""
msgid "SecurityReports|Create issue"
msgstr ""
+msgid "SecurityReports|Development vulnerabilities"
+msgstr ""
+
msgid "SecurityReports|Dismiss vulnerability"
msgstr ""
@@ -29871,6 +30295,9 @@ msgstr ""
msgid "SecurityReports|Download results"
msgstr ""
+msgid "SecurityReports|Download scanned URLs"
+msgstr ""
+
msgid "SecurityReports|Download scanned resources"
msgstr ""
@@ -29994,6 +30421,9 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
+msgid "SecurityReports|The Vulnerability Report shows the results of the lastest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "SecurityReports|The security reports below contain one or more vulnerability findings that could not be parsed and were not recorded. Download the artifacts in the job output to investigate. Ensure any security report created conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
msgstr ""
@@ -30135,10 +30565,10 @@ msgstr ""
msgid "Select a repository"
msgstr ""
-msgid "Select a role"
+msgid "Select a repository containing templates for common files."
msgstr ""
-msgid "Select a shared template repository for all projects on this instance."
+msgid "Select a role"
msgstr ""
msgid "Select a template repository"
@@ -30216,6 +30646,9 @@ msgstr ""
msgid "Select project to choose zone"
msgstr ""
+msgid "Select project to create issue"
+msgstr ""
+
msgid "Select projects"
msgstr ""
@@ -30333,6 +30766,9 @@ msgstr ""
msgid "Send emails to help guide new users through the onboarding process."
msgstr ""
+msgid "Send emails to users upon account deactivation."
+msgstr ""
+
msgid "Send message"
msgstr ""
@@ -30351,6 +30787,9 @@ msgstr ""
msgid "Send service data"
msgstr ""
+msgid "Sentry"
+msgstr ""
+
msgid "Sentry API URL"
msgstr ""
@@ -30465,6 +30904,9 @@ msgstr ""
msgid "Service"
msgstr ""
+msgid "Service Accounts keys are required to authorize GitLab to deploy your Google Cloud project."
+msgstr ""
+
msgid "Service Desk"
msgstr ""
@@ -30537,15 +30979,15 @@ msgstr ""
msgid "Set a password on your account to pull or push via %{protocol}."
msgstr ""
-msgid "Set a template repository for projects in this group"
-msgstr ""
-
msgid "Set access permissions for this token."
msgstr ""
msgid "Set an instance-wide domain that will be available to all clusters when installing Knative."
msgstr ""
+msgid "Set any rate limit to %{code_open}0%{code_close} to disable the limit."
+msgstr ""
+
msgid "Set default and restrict visibility levels. Configure import sources and git access protocol."
msgstr ""
@@ -30558,7 +31000,7 @@ msgstr ""
msgid "Set limit to 0 to allow any file size."
msgstr ""
-msgid "Set max session time for web terminal."
+msgid "Set limits for web and API requests."
msgstr ""
msgid "Set milestone"
@@ -30567,15 +31009,18 @@ msgstr ""
msgid "Set new password"
msgstr ""
-msgid "Set notification email for abuse reports."
+msgid "Set parent epic to an epic"
msgstr ""
-msgid "Set parent epic to an epic"
+msgid "Set per-user rate limits for imports and exports of projects and groups."
msgstr ""
msgid "Set projects and maximum size limits, session duration, user options, and check feature availability for namespace plan."
msgstr ""
+msgid "Set rate limits for package registry API requests that supersede the general user and IP rate limits."
+msgstr ""
+
msgid "Set severity"
msgstr ""
@@ -30594,15 +31039,24 @@ msgstr ""
msgid "Set the default branch for this project. All merge requests and commits are made against this branch unless you specify a different one."
msgstr ""
+msgid "Set the default expiration time for job artifacts in all projects. Set to %{code_open}0%{code_close} to never expire artifacts by default. If no unit is written, it defaults to seconds. For example, these are all equivalent: %{code_open}3600%{code_close}, %{code_open}60 minutes%{code_close}, or %{code_open}one hour%{code_close}."
+msgstr ""
+
msgid "Set the due date to %{due_date}."
msgstr ""
msgid "Set the iteration to %{iteration_reference}."
msgstr ""
+msgid "Set the maximum session time for a web terminal."
+msgstr ""
+
msgid "Set the milestone to %{milestone_reference}."
msgstr ""
+msgid "Set the per-user rate limit for notes created by web or API requests."
+msgstr ""
+
msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
msgstr ""
@@ -30804,6 +31258,9 @@ msgstr ""
msgid "Show Pipeline IID"
msgstr ""
+msgid "Show all %{issuable_type}."
+msgstr ""
+
msgid "Show all activity"
msgstr ""
@@ -30855,15 +31312,9 @@ msgstr ""
msgid "Show list"
msgstr ""
-msgid "Show me advanced features"
-msgstr ""
-
msgid "Show me how to add a pipeline"
msgstr ""
-msgid "Show me the basics"
-msgstr ""
-
msgid "Show one file at a time"
msgstr ""
@@ -30904,15 +31355,15 @@ msgstr ""
msgid "Showing %{pageSize} of %{total} %{issuableType}"
msgstr ""
-msgid "Showing %{pageSize} of %{total} issues"
-msgstr ""
-
msgid "Showing all epics"
msgstr ""
msgid "Showing all issues"
msgstr ""
+msgid "Showing data for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
+msgstr ""
+
msgid "Showing data for workflow items created in this date range. Date range cannot exceed %{maxDateRange} days."
msgstr ""
@@ -30952,6 +31403,15 @@ msgstr ""
msgid "Sidebar|Weight"
msgstr ""
+msgid "Sidekiq job compression threshold (bytes)"
+msgstr ""
+
+msgid "Sidekiq job size limit (bytes)"
+msgstr ""
+
+msgid "Sidekiq job size limits"
+msgstr ""
+
msgid "Sign in"
msgstr ""
@@ -31072,6 +31532,9 @@ msgstr ""
msgid "Site profile not found for given parameters"
msgstr ""
+msgid "Sites"
+msgstr ""
+
msgid "Size"
msgstr ""
@@ -31102,19 +31565,22 @@ msgstr ""
msgid "SlackIntegration|Sends notifications about project events to Slack channels."
msgstr ""
-msgid "SlackService|2. Paste the %{strong_open}Token%{strong_close} into the field below"
+msgid "SlackService|1. %{slash_command_link_start}Add a slash command%{slash_command_link_end} in your Slack team using this information:"
msgstr ""
-msgid "SlackService|3. Select the %{strong_open}Active%{strong_close} checkbox, press %{strong_open}Save changes%{strong_close} and start using GitLab inside Slack!"
+msgid "SlackService|2. Paste the token from Slack in the %{strong_open}Token%{strong_close} field below."
msgstr ""
-msgid "SlackService|Fill in the word that works best for your team."
+msgid "SlackService|3. Select the %{strong_open}Active%{strong_close} checkbox, select %{strong_open}Save changes%{strong_close}, and start using slash commands in Slack!"
+msgstr ""
+
+msgid "SlackService|After setup, get a list of available Slack slash commands by entering"
msgstr ""
-msgid "SlackService|See list of available commands in Slack after setting up this service, by entering"
+msgid "SlackService|Fill in the word that works best for your team."
msgstr ""
-msgid "SlackService|This service allows users to perform common operations on this project by entering slash commands in Slack."
+msgid "SlackService|Perform common operations in this project by entering slash commands in Slack."
msgstr ""
msgid "Slice multiplier"
@@ -31180,7 +31646,7 @@ msgstr ""
msgid "Some child epics may be hidden due to applied filters"
msgstr ""
-msgid "Some common domains are not allowed. %{read_more_link}."
+msgid "Some common domains are not allowed. %{learn_more_link}."
msgstr ""
msgid "Some of the designs you tried uploading did not change:"
@@ -31264,9 +31730,6 @@ msgstr ""
msgid "Something went wrong while exporting requirements"
msgstr ""
-msgid "Something went wrong while fetching %{listType} list"
-msgstr ""
-
msgid "Something went wrong while fetching branches"
msgstr ""
@@ -31321,15 +31784,9 @@ msgstr ""
msgid "Something went wrong while merging this merge request. Please try again."
msgstr ""
-msgid "Something went wrong while moving issues."
-msgstr ""
-
msgid "Something went wrong while obtaining the Let's Encrypt certificate."
msgstr ""
-msgid "Something went wrong while performing the action."
-msgstr ""
-
msgid "Something went wrong while promoting the issue to an epic. Please try again."
msgstr ""
@@ -31657,7 +32114,10 @@ msgstr ""
msgid "SourcegraphPreferences|Uses a custom %{linkStart}Sourcegraph instance%{linkEnd}."
msgstr ""
-msgid "Spam Check API Key"
+msgid "Spam Check"
+msgstr ""
+
+msgid "Spam Check API key"
msgstr ""
msgid "Spam Logs"
@@ -31675,7 +32135,7 @@ msgstr ""
msgid "Specified URL cannot be used: \"%{reason}\""
msgstr ""
-msgid "Specify an e-mail address regex pattern to identify default internal users."
+msgid "Specify an email address regex pattern to identify default internal users."
msgstr ""
msgid "Speed up your pipelines with Needs relationships"
@@ -31930,7 +32390,7 @@ msgstr ""
msgid "StatusCheck|An error occurred fetching the status checks."
msgstr ""
-msgid "StatusCheck|Apply this status check to any branch or a specific protected branch."
+msgid "StatusCheck|Apply this status check to all branches or a specific protected branch."
msgstr ""
msgid "StatusCheck|Check for a status response in Merge Requests. Failures do not block merges. %{link_start}Learn more%{link_end}."
@@ -32269,6 +32729,9 @@ msgstr ""
msgid "Subscriptions"
msgstr ""
+msgid "Subscription|Your subscription for %{strong}%{namespace_name}%{strong_close} has expired and you are now on %{pricing_link_start}the GitLab Free tier%{pricing_link_end}. Don't worry, your data is safe. Get in touch with our support team (%{support_email}). They'll gladly help with your subscription renewal."
+msgstr ""
+
msgid "Subtracted"
msgstr ""
@@ -32497,6 +32960,9 @@ msgstr ""
msgid "SuperSonics|Plan"
msgstr ""
+msgid "SuperSonics|Please agree to the Subscription Agreement"
+msgstr ""
+
msgid "SuperSonics|Ready to get started? A GitLab plan is ideal for scaling organizations and for multi team usage."
msgstr ""
@@ -32527,6 +32993,9 @@ msgstr ""
msgid "SuperSonics|The activation code is not valid. Please make sure to copy it exactly from the Customers Portal or confirmation email. Learn more about %{linkStart}activating your subscription%{linkEnd}."
msgstr ""
+msgid "SuperSonics|The activation code should be a 24-character alphanumeric string"
+msgstr ""
+
msgid "SuperSonics|There is a connectivity issue."
msgstr ""
@@ -32569,9 +33038,15 @@ msgstr ""
msgid "SuperSonics|You do not have an active subscription"
msgstr ""
+msgid "SuperSonics|You have successfully added a license that activates on %{date}. Please see the subscription history table below for more details."
+msgstr ""
+
msgid "SuperSonics|You'll be charged for %{trueUpLinkStart}users over license%{trueUpLinkEnd} on a quarterly or annual basis, depending on the terms of your agreement."
msgstr ""
+msgid "SuperSonics|Your future dated license was successfully added"
+msgstr ""
+
msgid "SuperSonics|Your subscription"
msgstr ""
@@ -32824,7 +33299,7 @@ msgstr ""
msgid "Template to append to all Service Desk issues"
msgstr ""
-msgid "TemplateRepository|Select a repository to make its templates available to all projects. %{link_start}What should the repository contain?%{link_end} "
+msgid "TemplateRepository|Create common files more quickly, and standardize their format."
msgstr ""
msgid "Templates"
@@ -33030,7 +33505,7 @@ msgstr ""
msgid "TestCases|Search test cases"
msgstr ""
-msgid "TestCases|Something went wrong while adding test case to Todo."
+msgid "TestCases|Something went wrong while adding test case to a to-do item."
msgstr ""
msgid "TestCases|Something went wrong while creating a test case."
@@ -33042,7 +33517,7 @@ msgstr ""
msgid "TestCases|Something went wrong while fetching test cases list."
msgstr ""
-msgid "TestCases|Something went wrong while marking test case todo as done."
+msgid "TestCases|Something went wrong while marking test case to-do item as done."
msgstr ""
msgid "TestCases|Something went wrong while moving test case."
@@ -33162,7 +33637,7 @@ msgstr ""
msgid "Thanks for your purchase!"
msgstr ""
-msgid "That is ok, I do not want to renew"
+msgid "That's OK, I don't want to renew"
msgstr ""
msgid "That's it, well done!"
@@ -33185,7 +33660,7 @@ msgid_plural "The %{type} contains the following errors:"
msgstr[0] ""
msgstr[1] ""
-msgid "The API key used by GitLab for accessing the Spam Check service endpoint"
+msgid "The API key used by GitLab for accessing the Spam Check service endpoint."
msgstr ""
msgid "The GitLab subscription service (customers.gitlab.com) is currently experiencing an outage. You can monitor the status and get updates at %{linkStart}status.gitlab.com%{linkEnd}."
@@ -33224,9 +33699,6 @@ msgstr ""
msgid "The URL to use for connecting to Elasticsearch. Use a comma-separated list to support clustering (e.g., \"http://localhost:9200, http://localhost:9201\")."
msgstr ""
-msgid "The Vulnerability Report shows the results of the last successful pipeline run on the default branch."
-msgstr ""
-
msgid "The X509 Certificate to use when mutual TLS is required to communicate with the external authorization service. If left blank, the server certificate is still validated when accessing over HTTPS."
msgstr ""
@@ -33284,9 +33756,6 @@ msgstr ""
msgid "The default branch for this project has been changed. Please update your bookmarks."
msgstr ""
-msgid "The default expiration time for job artifacts. 0 for unlimited. The default unit is in seconds, but you can use other units, for example %{code_open}4 mins 2 sec%{code_close}, %{code_open}2h42min%{code_close}."
-msgstr ""
-
msgid "The dependency list details information about the components used within your project."
msgstr ""
@@ -33478,9 +33947,6 @@ msgstr ""
msgid "The merge conflicts for this merge request have already been resolved. Please return to the merge request."
msgstr ""
-msgid "The merge request can now be merged."
-msgstr ""
-
msgid "The metric must be one of %{metrics}."
msgstr ""
@@ -33856,7 +34322,7 @@ msgstr ""
msgid "There was a problem updating the keep latest artifacts setting."
msgstr ""
-msgid "There was an error %{message} todo."
+msgid "There was an error %{message} to-do item."
msgstr ""
msgid "There was an error adding a To Do."
@@ -33895,6 +34361,9 @@ msgstr ""
msgid "There was an error fetching projects"
msgstr ""
+msgid "There was an error fetching search autocomplete suggestions"
+msgstr ""
+
msgid "There was an error fetching stage total counts"
msgstr ""
@@ -34219,6 +34688,9 @@ msgstr ""
msgid "This field is required."
msgstr ""
+msgid "This form is disabled in preview"
+msgstr ""
+
msgid "This group"
msgstr ""
@@ -34240,9 +34712,6 @@ msgstr ""
msgid "This group is linked to a subscription"
msgstr ""
-msgid "This group, including all subgroups, projects and git repositories, will be reachable from only the specified IP address ranges."
-msgstr ""
-
msgid "This group, its subgroups and projects has been scheduled for removal on %{date}."
msgstr ""
@@ -34522,9 +34991,6 @@ msgstr ""
msgid "This user cannot be unlocked manually from GitLab"
msgstr ""
-msgid "This user does not have a pending request"
-msgstr ""
-
msgid "This user has an unconfirmed email address (%{email}). You may force a confirmation."
msgstr ""
@@ -34633,9 +35099,6 @@ msgstr ""
msgid "ThreatMonitoring|Packet Activity"
msgstr ""
-msgid "ThreatMonitoring|Policies"
-msgstr ""
-
msgid "ThreatMonitoring|Requests"
msgstr ""
@@ -34687,6 +35150,12 @@ msgstr ""
msgid "ThreatMonitoring|View documentation"
msgstr ""
+msgid "Threshold in bytes at which to compress Sidekiq job arguments."
+msgstr ""
+
+msgid "Threshold in bytes at which to reject Sidekiq jobs. Set this to 0 to if you don't want to limit Sidekiq jobs."
+msgstr ""
+
msgid "Throughput"
msgstr ""
@@ -34696,6 +35165,9 @@ msgstr ""
msgid "Time"
msgstr ""
+msgid "Time (in hours) that users are allowed to skip forced configuration of two-factor authentication."
+msgstr ""
+
msgid "Time Spent"
msgstr ""
@@ -34762,7 +35234,7 @@ msgstr ""
msgid "TimeTrackingEstimated|Est"
msgstr ""
-msgid "TimeTracking|%{startTag}Spent: %{endTag}%{timeSpentHumanReadable}"
+msgid "TimeTracking|%{spentStart}Spent: %{spentEnd}"
msgstr ""
msgid "TimeTracking|Estimated:"
@@ -34976,6 +35448,9 @@ msgstr ""
msgid "To access this domain create a new DNS record"
msgstr ""
+msgid "To add a custom suffix, set up a Service Desk email address. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "To add an SSH key you need to %{generate_link_start}generate one%{link_end} or use an %{existing_link_start}existing key%{link_end}."
msgstr ""
@@ -34997,13 +35472,16 @@ msgstr ""
msgid "To connect an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To continue using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
+msgstr ""
+
msgid "To continue, you need to select the link in the confirmation email we sent to verify your email address. If you didn't get our email, select %{strongStart}Resend confirmation email.%{strongEnd}"
msgstr ""
msgid "To define internal users, first enable new users set to external"
msgstr ""
-msgid "To enable Registration Features, make sure \"Enable service ping\" is checked."
+msgid "To enable Registration Features, first enable Service Ping."
msgstr ""
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
@@ -35030,7 +35508,7 @@ msgstr ""
msgid "To get started, use the link below to confirm your account."
msgstr ""
-msgid "To help improve GitLab and its user experience, GitLab will periodically collect usage information."
+msgid "To help improve GitLab and its user experience, GitLab periodically collects usage information."
msgstr ""
msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
@@ -35063,7 +35541,7 @@ msgstr ""
msgid "To preserve performance only %{strong_open}%{display_size} of %{real_size}%{strong_close} files are displayed."
msgstr ""
-msgid "To protect this issue's confidentiality, %{forkLink} and set the fork's visibility to private."
+msgid "To protect this issue's confidentiality, %{linkStart}fork this project%{linkEnd} and set the fork's visibility to private."
msgstr ""
msgid "To protect this issue's confidentiality, a private fork of this project was selected."
@@ -35096,12 +35574,15 @@ msgstr ""
msgid "To set up SAML authentication for your group through an identity provider like Azure, Okta, Onelogin, Ping Identity, or your custom SAML 2.0 provider:"
msgstr ""
-msgid "To set up this service:"
+msgid "To set up this integration:"
msgstr ""
msgid "To specify the notification level per project of a group you belong to, you need to visit project page and change notification level there."
msgstr ""
+msgid "To start using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
+msgstr ""
+
msgid "To unsubscribe from this issue, please paste the following link into your browser:"
msgstr ""
@@ -35689,9 +36170,6 @@ msgstr ""
msgid "Unable to fetch branches list, please close the form and try again"
msgstr ""
-msgid "Unable to fetch unscanned projects"
-msgstr ""
-
msgid "Unable to fetch vulnerable projects"
msgstr ""
@@ -35746,6 +36224,15 @@ msgstr ""
msgid "Unable to update this issue at this time."
msgstr ""
+msgid "Unapprove a merge request"
+msgstr ""
+
+msgid "Unapprove the current merge request."
+msgstr ""
+
+msgid "Unapproved the current merge request."
+msgstr ""
+
msgid "Unarchive project"
msgstr ""
@@ -35758,16 +36245,13 @@ msgstr ""
msgid "Unassigned"
msgstr ""
-msgid "Unauthenticated API request rate limit"
-msgstr ""
-
-msgid "Unauthenticated rate limit period in seconds"
+msgid "Unauthenticated API rate limit period in seconds"
msgstr ""
-msgid "Unauthenticated request rate limit"
+msgid "Unauthenticated requests"
msgstr ""
-msgid "Unauthenticated requests"
+msgid "Unauthenticated web rate limit period in seconds"
msgstr ""
msgid "Undo"
@@ -35869,18 +36353,6 @@ msgstr ""
msgid "Unresolved"
msgstr ""
-msgid "UnscannedProjects|15 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|30 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|5 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|60 or more days"
-msgstr ""
-
msgid "Unschedule job"
msgstr ""
@@ -36100,6 +36572,9 @@ msgstr ""
msgid "UsageQuota|%{help_link_start}Shared runners%{help_link_end} are disabled, so there are no limits set on pipeline usage"
msgstr ""
+msgid "UsageQuota|%{linkTitle} help link"
+msgstr ""
+
msgid "UsageQuota|%{percentageLeft} of purchased storage is available"
msgstr ""
@@ -36109,6 +36584,9 @@ msgstr ""
msgid "UsageQuota|Artifacts is a sum of build and pipeline artifacts."
msgstr ""
+msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
+msgstr ""
+
msgid "UsageQuota|Buy additional minutes"
msgstr ""
@@ -36118,9 +36596,21 @@ msgstr ""
msgid "UsageQuota|CI minutes usage by project"
msgstr ""
+msgid "UsageQuota|Code packages and container images."
+msgstr ""
+
msgid "UsageQuota|Current period usage"
msgstr ""
+msgid "UsageQuota|File attachments and smaller design graphics."
+msgstr ""
+
+msgid "UsageQuota|Git repository, managed by the Gitaly service."
+msgstr ""
+
+msgid "UsageQuota|Includes project registry, artifacts, packages, wiki, uploads and other items."
+msgstr ""
+
msgid "UsageQuota|Increase storage temporarily"
msgstr ""
@@ -36139,6 +36629,9 @@ msgstr ""
msgid "UsageQuota|Packages"
msgstr ""
+msgid "UsageQuota|Pipeline artifacts and job artifacts, created with CI/CD."
+msgstr ""
+
msgid "UsageQuota|Pipelines"
msgstr ""
@@ -36157,6 +36650,9 @@ msgstr ""
msgid "UsageQuota|Seats"
msgstr ""
+msgid "UsageQuota|Shared bits of code and text."
+msgstr ""
+
msgid "UsageQuota|Snippets"
msgstr ""
@@ -36166,6 +36662,12 @@ msgstr ""
msgid "UsageQuota|Storage"
msgstr ""
+msgid "UsageQuota|Storage type"
+msgstr ""
+
+msgid "UsageQuota|There is a known issue with Artifact storage where the total could be incorrect for some projects. More details and progress are available in %{warningLinkStart}the epic%{warningLinkEnd}."
+msgstr ""
+
msgid "UsageQuota|This is the total amount of storage used across your projects within this namespace."
msgstr ""
@@ -36205,6 +36707,9 @@ msgstr ""
msgid "UsageQuota|Usage"
msgstr ""
+msgid "UsageQuota|Usage Breakdown"
+msgstr ""
+
msgid "UsageQuota|Usage Quotas"
msgstr ""
@@ -36229,6 +36734,9 @@ msgstr ""
msgid "UsageQuota|Wiki"
msgstr ""
+msgid "UsageQuota|Wiki content."
+msgstr ""
+
msgid "UsageQuota|Wikis"
msgstr ""
@@ -36445,7 +36953,10 @@ msgstr ""
msgid "User Settings"
msgstr ""
-msgid "User and IP Rate Limits"
+msgid "User and IP rate limits"
+msgstr ""
+
+msgid "User does not have a pending request"
msgstr ""
msgid "User identity was successfully created."
@@ -36742,6 +37253,9 @@ msgstr ""
msgid "Users can launch a development environment from a GitLab browser tab when the %{linkStart}Gitpod%{linkEnd} integration is enabled."
msgstr ""
+msgid "Users can reactivate their account by signing in."
+msgstr ""
+
msgid "Users can render diagrams in AsciiDoc, Markdown, reStructuredText, and Textile documents using Kroki."
msgstr ""
@@ -36757,6 +37271,9 @@ msgstr ""
msgid "Users requesting access to"
msgstr ""
+msgid "Users to exclude from the rate limit"
+msgstr ""
+
msgid "Users were successfully added."
msgstr ""
@@ -36778,6 +37295,9 @@ msgstr ""
msgid "UsersSelect|Unassigned"
msgstr ""
+msgid "Uses GitLab as a lightweight alternative to Sentry."
+msgstr ""
+
msgid "Using %{code_start}::%{code_end} denotes a %{link_start}scoped label set%{link_end}"
msgstr ""
@@ -36808,10 +37328,7 @@ msgstr ""
msgid "Value Stream Analytics can help you determine your team’s velocity"
msgstr ""
-msgid "Value Stream Analytics gives an overview of how much time it takes to go from idea to production in your project."
-msgstr ""
-
-msgid "Value may contain a variable reference"
+msgid "Value might contain a variable reference"
msgstr ""
msgid "Value stream"
@@ -36877,10 +37394,10 @@ msgstr ""
msgid "ValueStream|The Default Value Stream cannot be deleted"
msgstr ""
-msgid "Variable"
+msgid "Values that contain the %{codeStart}$%{codeEnd} character can be considered a variable reference and expanded. %{docsLinkStart}Learn more.%{docsLinkEnd}"
msgstr ""
-msgid "Variable references indicated by %{codeStart}$%{codeEnd} may be expanded. If this is not what you want, consider %{docsLinkStart}using a workaround to prevent expansion%{docsLinkEnd}."
+msgid "Variable"
msgstr ""
msgid "Variable will be masked in job logs."
@@ -37285,6 +37802,9 @@ msgstr ""
msgid "Vulnerability|Evidence"
msgstr ""
+msgid "Vulnerability|False positive detected"
+msgstr ""
+
msgid "Vulnerability|File"
msgstr ""
@@ -37327,6 +37847,9 @@ msgstr ""
msgid "Vulnerability|Status"
msgstr ""
+msgid "Vulnerability|The scanner determined this vulnerability to be a false positive. Verify the evaluation before changing its status. %{linkStart}Learn more about false positive detection.%{linkEnd}"
+msgstr ""
+
msgid "Vulnerability|The unmodified response is the original response that had no mutations done to the request"
msgstr ""
@@ -37651,9 +38174,6 @@ msgstr ""
msgid "Welcome to GitLab,%{br_tag}%{name}!"
msgstr ""
-msgid "Welcome to the guided GitLab tour"
-msgstr ""
-
msgid "Welcome, %{name}!"
msgstr ""
@@ -37672,9 +38192,6 @@ msgstr ""
msgid "What are you searching for?"
msgstr ""
-msgid "What describes you best?"
-msgstr ""
-
msgid "What does this command do?"
msgstr ""
@@ -37696,13 +38213,13 @@ msgstr ""
msgid "What is your job title? (optional)"
msgstr ""
-msgid "What will you use this group for?"
+msgid "What templates can I create?"
msgstr ""
-msgid "What's new"
+msgid "What will you use this group for?"
msgstr ""
-msgid "What’s your experience level?"
+msgid "What's new"
msgstr ""
msgid "When a deployment job is successful, skip older deployment jobs that are still pending."
@@ -37714,6 +38231,9 @@ msgstr ""
msgid "When an event in GitLab triggers a webhook, you can use the request details to figure out if something went wrong."
msgstr ""
+msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+msgstr ""
+
msgid "When inactive, an external authentication provider must be used."
msgstr ""
@@ -37737,6 +38257,9 @@ msgstr ""
msgid "When:"
msgstr ""
+msgid "Which API requests are affected?"
+msgstr ""
+
msgid "While it's rare to have no vulnerabilities, it can happen. In any event, we ask that you please double check your settings to make sure you've set up your dashboard correctly."
msgstr ""
@@ -38016,6 +38539,9 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|Work Items"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -38091,6 +38617,9 @@ msgstr ""
msgid "You are already a member of this %{member_source}."
msgstr ""
+msgid "You are already impersonating another user"
+msgstr ""
+
msgid "You are an admin, which means granting access to %{client_name} will allow them to interact with GitLab as an admin as well. Proceed with caution."
msgstr ""
@@ -38193,6 +38722,9 @@ msgstr ""
msgid "You can also use project access tokens with Git to authenticate over HTTP(S). %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "You can always change your URL later"
+msgstr ""
+
msgid "You can always edit this later"
msgstr ""
@@ -38349,10 +38881,10 @@ msgstr ""
msgid "You can’t %{tag_start}edit%{tag_end} files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
-msgid "You could not create a new trigger."
+msgid "You can’t edit files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
-msgid "You didn't renew your subscription for %{strong}%{namespace_name}%{strong_close} so it was downgraded to the free plan."
+msgid "You could not create a new trigger."
msgstr ""
msgid "You do not have any subscriptions yet"
@@ -38520,6 +39052,12 @@ msgstr ""
msgid "You must provide your current password in order to change it."
msgstr ""
+msgid "You must sign in to search for specific projects."
+msgstr ""
+
+msgid "You must sign in to search for specific terms."
+msgstr ""
+
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
@@ -38547,6 +39085,9 @@ msgstr ""
msgid "You need to upload a GitLab project export archive (ending in .gz)."
msgstr ""
+msgid "You need to verify your primary email first before enabling Two-Factor Authentication."
+msgstr ""
+
msgid "You successfully declined the invitation"
msgstr ""
@@ -38655,10 +39196,10 @@ msgstr ""
msgid "Your %{host} account was signed in to from a new location"
msgstr ""
-msgid "Your %{strong}%{plan_name}%{strong_close} subscription for %{strong}%{namespace_name}%{strong_close} will expire on %{strong}%{expires_on}%{strong_close}."
+msgid "Your %{strong}%{plan_name}%{strong_close} subscription expires on %{strong}%{expires_on}%{strong_close}. After that date, you cannot create issues or merge requests, or use many other features."
msgstr ""
-msgid "Your %{strong}%{plan_name}%{strong_close} subscription will expire on %{strong}%{expires_on}%{strong_close}. After that, you will not be able to create issues or merge requests as well as many other features."
+msgid "Your %{strong}%{plan_name}%{strong_close} subscription for %{strong}%{namespace_name}%{strong_close} will expire on %{strong}%{expires_on}%{strong_close}."
msgstr ""
msgid "Your CI/CD configuration syntax is invalid. View Lint tab for more details."
@@ -38682,7 +39223,7 @@ msgstr ""
msgid "Your GPG keys (%{count})"
msgstr ""
-msgid "Your GitLab account has been locked due to an excessive amount of unsuccessful sign in attempts. Your account will automatically unlock in %{duration} or you may click the link below to unlock now."
+msgid "Your GitLab account has been locked due to an excessive number of unsuccessful sign in attempts. You can wait for your account to automatically unlock in %{duration} or you can click the link below to unlock now."
msgstr ""
msgid "Your GitLab account request has been approved!"
@@ -38793,6 +39334,9 @@ msgstr ""
msgid "Your commit email is used for web based operations, such as edits and merges."
msgstr ""
+msgid "Your current password is required to register a two-factor authenticator app."
+msgstr ""
+
msgid "Your dashboard has been copied. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
@@ -38892,6 +39436,9 @@ msgstr ""
msgid "Your project limit is %{limit} projects! Please contact your administrator to increase it"
msgstr ""
+msgid "Your project will be created at:"
+msgstr ""
+
msgid "Your projects"
msgstr ""
@@ -38931,11 +39478,10 @@ msgstr ""
msgid "Your subscription expired!"
msgstr ""
-msgid "Your subscription has been downgraded."
-msgstr ""
-
-msgid "Your subscription will expire in %{remaining_days}."
-msgstr ""
+msgid "Your subscription will expire in %{remaining_days} day."
+msgid_plural "Your subscription will expire in %{remaining_days} days."
+msgstr[0] ""
+msgstr[1] ""
msgid "Your username is %{username}."
msgstr ""
@@ -39142,6 +39688,9 @@ msgstr ""
msgid "cannot merge"
msgstr ""
+msgid "cannot not be used for user namespace"
+msgstr ""
+
msgid "ciReport|%{degradedNum} degraded"
msgstr ""
@@ -39465,6 +40014,9 @@ msgstr ""
msgid "created %{timeAgo}"
msgstr ""
+msgid "created %{timeAgo} by %{author}"
+msgstr ""
+
msgid "created by"
msgstr ""
@@ -39509,9 +40061,6 @@ msgstr ""
msgid "does not have a supported extension. Only %{extension_list} are supported"
msgstr ""
-msgid "domain is not authorized for sign-up."
-msgstr ""
-
msgid "download it"
msgstr ""
@@ -39529,18 +40078,13 @@ msgstr ""
msgid "email '%{email}' is not a verified email."
msgstr ""
-msgid "email does not match the allowed domain of %{email_domains}"
-msgid_plural "email does not match the allowed domains: %{email_domains}"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "enabled"
msgstr ""
msgid "encrypted: needs to be a :required, :optional or :migrating!"
msgstr ""
-msgid "ending with MIME type format is not allowed."
+msgid "ending with a reserved file extension is not allowed."
msgstr ""
msgid "entries cannot be larger than 255 characters"
@@ -39564,6 +40108,9 @@ msgstr ""
msgid "estimateCommand|%{slash_command} overwrites the total estimated time."
msgstr ""
+msgid "example.com"
+msgstr ""
+
msgid "exceeds the limit of %{bytes} bytes"
msgstr ""
@@ -39614,9 +40161,6 @@ msgstr ""
msgid "fork"
msgstr ""
-msgid "fork this project"
-msgstr ""
-
msgid "from"
msgstr ""
@@ -39625,6 +40169,9 @@ msgid_plural "from %d jobs"
msgstr[0] ""
msgstr[1] ""
+msgid "frontmatter"
+msgstr ""
+
msgid "group"
msgstr ""
@@ -39652,6 +40199,9 @@ msgstr ""
msgid "has been completed."
msgstr ""
+msgid "has too deep level of nesting"
+msgstr ""
+
msgid "help"
msgstr ""
@@ -39685,9 +40235,21 @@ msgstr ""
msgid "in"
msgstr ""
+msgid "in Infrastructure :: Kubernetes clusters"
+msgstr ""
+
+msgid "in all GitLab"
+msgstr ""
+
+msgid "in group"
+msgstr ""
+
msgid "in group %{link_to_group}"
msgstr ""
+msgid "in project"
+msgstr ""
+
msgid "in project %{link_to_project}"
msgstr ""
@@ -39729,16 +40291,19 @@ msgstr ""
msgid "is not a valid X509 certificate."
msgstr ""
-msgid "is not allowed since the group is not top-level group."
+msgid "is not allowed for sign-up."
msgstr ""
-msgid "is not allowed. Try again with a different email address, or contact your GitLab admin."
+msgid "is not allowed for this group."
msgstr ""
-msgid "is not allowed. We do not currently support project-level iterations"
+msgid "is not allowed for this project."
+msgstr ""
+
+msgid "is not allowed since the group is not top-level group."
msgstr ""
-msgid "is not from an allowed domain."
+msgid "is not allowed. We do not currently support project-level iterations"
msgstr ""
msgid "is not in the group enforcing Group Managed Account"
@@ -39831,6 +40396,9 @@ msgstr ""
msgid "log in"
msgstr ""
+msgid "managed"
+msgstr ""
+
msgid "manual"
msgstr ""
@@ -39878,6 +40446,9 @@ msgstr ""
msgid "mrWidget| Please restore it or use a different %{missingBranchName} branch"
msgstr ""
+msgid "mrWidget|%{linkStart}Set up now%{linkEnd} to analyze your source code for known security vulnerabilities."
+msgstr ""
+
msgid "mrWidget|%{mergeError}."
msgstr ""
@@ -39958,6 +40529,9 @@ msgid_plural "mrWidget|Closes issues"
msgstr[0] ""
msgstr[1] ""
+msgid "mrWidget|Create issue to resolve all threads"
+msgstr ""
+
msgid "mrWidget|Delete source branch"
msgstr ""
@@ -39967,12 +40541,18 @@ msgstr ""
msgid "mrWidget|Did not close"
msgstr ""
+msgid "mrWidget|Dismiss"
+msgstr ""
+
msgid "mrWidget|Email patches"
msgstr ""
msgid "mrWidget|Failed to load deployment statistics"
msgstr ""
+msgid "mrWidget|Hide %{widget} details"
+msgstr ""
+
msgid "mrWidget|If the %{missingBranchName} branch exists in your local repository, you can merge this merge request manually using the command line"
msgstr ""
@@ -40068,9 +40648,6 @@ msgstr ""
msgid "mrWidget|Request to merge"
msgstr ""
-msgid "mrWidget|Resolve all threads in new issue"
-msgstr ""
-
msgid "mrWidget|Resolve conflicts"
msgstr ""
@@ -40086,6 +40663,9 @@ msgstr ""
msgid "mrWidget|Revoke approval"
msgstr ""
+msgid "mrWidget|SAST and Secret Detection is not enabled."
+msgstr ""
+
msgid "mrWidget|Set by %{merge_author} to be added to the merge train when the pipeline succeeds"
msgstr ""
@@ -40095,6 +40675,9 @@ msgstr ""
msgid "mrWidget|Set by %{merge_author} to start a merge train when the pipeline succeeds"
msgstr ""
+msgid "mrWidget|Show %{widget} details"
+msgstr ""
+
msgid "mrWidget|The changes were merged into"
msgstr ""
@@ -40107,6 +40690,9 @@ msgstr ""
msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure, or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
msgstr ""
+msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure."
+msgstr ""
+
msgid "mrWidget|The source branch has been deleted"
msgstr ""
@@ -40149,6 +40735,9 @@ msgstr ""
msgid "mrWidget|You can merge after removing denied licenses"
msgstr ""
+msgid "mrWidget|You can only merge once this merge request is approved."
+msgstr ""
+
msgid "mrWidget|Your password"
msgstr ""
@@ -40185,6 +40774,9 @@ msgstr ""
msgid "must be less than the limit of %{tag_limit} tags"
msgstr ""
+msgid "must be set for a project namespace"
+msgstr ""
+
msgid "must be unique by status and elapsed time within a policy"
msgstr ""
@@ -40294,6 +40886,9 @@ msgstr ""
msgid "pipeline"
msgstr ""
+msgid "pipeline schedules documentation"
+msgstr ""
+
msgid "pod_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
msgstr ""
@@ -40343,16 +40938,25 @@ msgstr ""
msgid "project name"
msgstr ""
+msgid "project namespace cannot be the parent of another namespace"
+msgstr ""
+
msgid "projects"
msgstr ""
msgid "quick actions"
msgstr ""
-msgid "reCAPTCHA Private Key"
+msgid "reCAPTCHA"
+msgstr ""
+
+msgid "reCAPTCHA helps prevent credential stuffing."
msgstr ""
-msgid "reCAPTCHA Site Key"
+msgid "reCAPTCHA private key"
+msgstr ""
+
+msgid "reCAPTCHA site key"
msgstr ""
msgid "recent activity"
@@ -40579,6 +41183,9 @@ msgstr ""
msgid "user avatar"
msgstr ""
+msgid "user namespace cannot be the parent of another namespace"
+msgstr ""
+
msgid "user preferences"
msgstr ""
@@ -40671,3 +41278,9 @@ msgstr ""
msgid "your settings"
msgstr ""
+msgid "{group}"
+msgstr ""
+
+msgid "{project}"
+msgstr ""
+
diff --git a/locale/fa_IR/gitlab.po b/locale/fa_IR/gitlab.po
index 7d43a9e9f83..dcf558fd9a6 100644
--- a/locale/fa_IR/gitlab.po
+++ b/locale/fa_IR/gitlab.po
@@ -14,10 +14,7 @@ msgstr ""
"X-Crowdin-Language: fa\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-09-01 22:30\n"
-
-msgid " %{name}, confirm your email address now! "
-msgstr ""
+"PO-Revision-Date: 2021-10-04 20:18\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -92,6 +89,16 @@ msgstr ""
msgid "#general, #development"
msgstr ""
+msgid "%d Alert"
+msgid_plural "%d Alerts"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d Alert:"
+msgid_plural "%d Alerts:"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d Approval"
msgid_plural "%d Approvals"
msgstr[0] ""
@@ -455,7 +462,10 @@ msgstr ""
msgid "%{code_open}Protected:%{code_close} Only exposed to protected branches or tags."
msgstr ""
-msgid "%{commit_author_link} authored %{commit_timeago}"
+msgid "%{commit_author_link} authored %{commit_authored_timeago}"
+msgstr ""
+
+msgid "%{commit_author_link} authored %{commit_authored_timeago} and %{commit_committer_avatar} %{commit_committer_link} committed %{commit_committer_timeago}"
msgstr ""
msgid "%{completedCount} completed weight"
@@ -549,6 +559,15 @@ msgstr ""
msgid "%{doc_link_start}Advanced search%{doc_link_end} is enabled."
msgstr ""
+msgid "%{docs_link_start}Learn about visibility levels.%{docs_link_end}"
+msgstr ""
+
+msgid "%{docs_link_start}What is Large File Storage?%{docs_link_end}"
+msgstr ""
+
+msgid "%{docs_link_start}What is two-factor authentication?%{docs_link_end}"
+msgstr ""
+
msgid "%{due_date} (Past due)"
msgstr ""
@@ -621,9 +640,6 @@ msgstr ""
msgid "%{issueType} actions"
msgstr ""
-msgid "%{issuesCount} issues with a limit of %{maxIssueCount}"
-msgstr ""
-
msgid "%{issuesSize} with a limit of %{maxIssueCount}"
msgstr ""
@@ -681,6 +697,12 @@ msgstr ""
msgid "%{label_for_message} unavailable"
msgstr ""
+msgid "%{learn_more_link}."
+msgstr ""
+
+msgid "%{lessThan} 1 hour"
+msgstr ""
+
msgid "%{lets_encrypt_link_start}Let's Encrypt%{lets_encrypt_link_end} is a free, automated, and open certificate authority (CA) that issues digital certificates to enable HTTPS (SSL/TLS) for sites."
msgstr ""
@@ -693,15 +715,15 @@ msgstr ""
msgid "%{link_start}Learn more%{link_end} about roles."
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
-msgstr ""
-
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
msgstr ""
msgid "%{link_start}Start the title with %{draft_snippet}%{link_end} to prevent a merge request that is a work in progress from being merged before it's ready."
msgstr ""
+msgid "%{link_start}What information does GitLab Inc. collect?%{link_end}"
+msgstr ""
+
msgid "%{listToShow}, and %{awardsListLength} more"
msgstr ""
@@ -854,7 +876,7 @@ msgid_plural "%{securityScanner} results are not available because a pipeline ha
msgstr[0] ""
msgstr[1] ""
-msgid "%{service_ping_link_start}Learn more%{service_ping_link_end} about what information is shared with GitLab Inc."
+msgid "%{service_ping_link_start}What information is shared with GitLab Inc.?%{service_ping_link_end}"
msgstr ""
msgid "%{size} %{unit}"
@@ -890,6 +912,9 @@ msgstr ""
msgid "%{state} epics"
msgstr ""
+msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
+msgstr ""
+
msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
msgstr ""
@@ -949,11 +974,6 @@ msgstr ""
msgid "%{template_project_id} is unknown or invalid"
msgstr ""
-msgid "%{text} %{files}"
-msgid_plural "%{text} %{files} files"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%{text} is available"
msgstr ""
@@ -1038,9 +1058,6 @@ msgstr ""
msgid "%{wildcards_link_start}Wildcards%{wildcards_link_end} such as %{code_tag_start}v*%{code_tag_end} or %{code_tag_start}*-release%{code_tag_end} are supported."
msgstr ""
-msgid "&lt; 1 hour"
-msgstr ""
-
msgid "'%{data}' at %{location} does not match format: %{format}"
msgstr ""
@@ -1124,9 +1141,6 @@ msgstr ""
msgid "(we need your current password to confirm your changes)"
msgstr ""
-msgid "* * * * *"
-msgstr ""
-
msgid "+ %{amount} more"
msgstr ""
@@ -1193,10 +1207,10 @@ msgstr ""
msgid "."
msgstr ""
-msgid "0 bytes"
+msgid "/"
msgstr ""
-msgid "0 for unlimited, only effective with remote storage enabled."
+msgid "0 bytes"
msgstr ""
msgid "0t1DgySidms"
@@ -1326,6 +1340,9 @@ msgstr ""
msgid "1000+"
msgstr ""
+msgid "192.168.0.0/24"
+msgstr ""
+
msgid "1st contribution!"
msgstr ""
@@ -1479,9 +1496,6 @@ msgstr ""
msgid "A plain HTML site that uses Netlify for CI/CD instead of GitLab, but still with all the other great GitLab features"
msgstr ""
-msgid "A plain-text response to show to clients that hit the rate limit."
-msgstr ""
-
msgid "A platform value can be web, mob or app."
msgstr ""
@@ -1563,7 +1577,7 @@ msgstr ""
msgid "APIFuzzing|Configure HTTP basic authentication values. Other authentication methods are supported. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
+msgid "APIFuzzing|Customize your project's API fuzzing configuration options and copy the code snippet to your .gitlab-ci.yml file to apply any changes. Note that this tool does not reflect or update your .gitlab-ci.yml file automatically. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
msgstr ""
msgid "APIFuzzing|Enable authentication"
@@ -1626,9 +1640,6 @@ msgstr ""
msgid "APIFuzzing|To prevent a security leak, authentication info must be added as a %{ciVariablesLinkStart}CI variable%{ciVariablesLinkEnd}. As a user with maintainer access rights, you can manage CI variables in the %{ciSettingsLinkStart}Settings%{ciSettingsLinkEnd} area."
msgstr ""
-msgid "APIFuzzing|Use this tool to generate API fuzzing configuration YAML to copy into your .gitlab-ci.yml file. This tool does not reflect or update your .gitlab-ci.yml file automatically."
-msgstr ""
-
msgid "APIFuzzing|Username for basic authentication"
msgstr ""
@@ -1680,9 +1691,6 @@ msgstr ""
msgid "Abuse reports notification email"
msgstr ""
-msgid "Abuse reports will be sent to this address if it is set. Abuse reports are always available in the admin area."
-msgstr ""
-
msgid "Accept invitation"
msgstr ""
@@ -1719,12 +1727,18 @@ msgstr ""
msgid "Access granted"
msgstr ""
+msgid "Access key ID"
+msgstr ""
+
msgid "Access requests"
msgstr ""
msgid "Access to '%{classification_label}' not allowed"
msgstr ""
+msgid "Access tokens expire after 2 hours. A refresh token may be used at any time to generate a new access token. Non-expiring access tokens are deprecated. Clear this setting to enable backward compatibility."
+msgstr ""
+
msgid "AccessDropdown|Deploy Keys"
msgstr ""
@@ -2037,6 +2051,9 @@ msgstr ""
msgid "Add new directory"
msgstr ""
+msgid "Add new service account"
+msgstr ""
+
msgid "Add or remove previously merged commits"
msgstr ""
@@ -2274,6 +2291,9 @@ msgstr ""
msgid "AdminArea|Features"
msgstr ""
+msgid "AdminArea|Get security updates from GitLab and stay up to date"
+msgstr ""
+
msgid "AdminArea|Groups"
msgstr ""
@@ -2313,6 +2333,12 @@ msgstr ""
msgid "AdminArea|Reporter"
msgstr ""
+msgid "AdminArea|Sign up for the GitLab Security Newsletter to get notified for security updates."
+msgstr ""
+
+msgid "AdminArea|Sign up for the GitLab newsletter"
+msgstr ""
+
msgid "AdminArea|Stop all jobs"
msgstr ""
@@ -2382,9 +2408,15 @@ msgstr ""
msgid "AdminSettings|Disable public access to Pages sites"
msgstr ""
+msgid "AdminSettings|Display a banner on merge requests in projects with no pipelines to initiate steps to add a .gitlab-ci.yml file."
+msgstr ""
+
msgid "AdminSettings|Domain verification is an essential security measure for public GitLab sites. Users are required to demonstrate they control a domain before it is enabled. %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "AdminSettings|Enable pipeline suggestion banner"
+msgstr ""
+
msgid "AdminSettings|Enable shared runners for new projects"
msgstr ""
@@ -2856,10 +2888,10 @@ msgstr ""
msgid "Admin|Quarterly reconciliation will occur on %{qrtlyDate}"
msgstr ""
-msgid "Admin|The number of max seats used for your namespace is currently exceeding the number of seats in your subscription. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgid "Admin|The number of max seats in your namespace exceeds the number of seats in your subscription. On %{qrtlyDate}, quarterly reconciliation occurs and you are automatically billed a prorated amount for the overage. No action is needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice. For more information about the timing of the invoicing process, view the documentation."
msgstr ""
-msgid "Admin|The number of maximum users for your instance is currently exceeding the number of users in license. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgid "Admin|The number of max users in your instance exceeds the number of users in your license. On %{qrtlyDate}, quarterly reconciliation occurs and you are automatically billed a prorated amount for the overage. No action is needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice. For more information about the timing of the invoicing process, view the documentation."
msgstr ""
msgid "Admin|View pending user approvals"
@@ -2880,9 +2912,6 @@ msgstr ""
msgid "Advanced export options"
msgstr ""
-msgid "Advanced permissions, Large File Storage and Two-Factor authentication settings."
-msgstr ""
-
msgid "After a successful password update you will be redirected to login screen."
msgstr ""
@@ -2901,13 +2930,14 @@ msgstr ""
msgid "After you've reviewed these contribution guidelines, you'll be all set to"
msgstr ""
+msgid "Akismet"
+msgstr ""
+
msgid "Akismet API Key"
msgstr ""
-msgid "Alert"
-msgid_plural "Alerts"
-msgstr[0] ""
-msgstr[1] ""
+msgid "Akismet helps prevent the creation of spam issues in public projects."
+msgstr ""
msgid "AlertManagement|Acknowledged"
msgstr ""
@@ -3263,6 +3293,9 @@ msgstr ""
msgid "All (default)"
msgstr ""
+msgid "All GitLab"
+msgstr ""
+
msgid "All Members"
msgstr ""
@@ -3377,6 +3410,9 @@ msgstr ""
msgid "Allow this secondary node to replicate content on Object Storage"
msgstr ""
+msgid "Allow use of licensed EE features"
+msgstr ""
+
msgid "Allow users to dismiss the broadcast message"
msgstr ""
@@ -3452,9 +3488,6 @@ msgstr ""
msgid "Amazon authentication is not %{link_start}correctly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
-msgid "Amount of time (in hours) that users are allowed to skip forced configuration of two-factor authentication"
-msgstr ""
-
msgid "An %{link_start}alert%{link_end} with the same fingerprint is already open. To change the status of this alert, resolve the linked alert."
msgstr ""
@@ -3515,12 +3548,6 @@ msgstr ""
msgid "An error occurred when removing the label."
msgstr ""
-msgid "An error occurred when toggling the notification subscription"
-msgstr ""
-
-msgid "An error occurred when updating the issue weight"
-msgstr ""
-
msgid "An error occurred when updating the title"
msgstr ""
@@ -3569,6 +3596,9 @@ msgstr ""
msgid "An error occurred while enabling Service Desk."
msgstr ""
+msgid "An error occurred while fetching Markdown preview"
+msgstr ""
+
msgid "An error occurred while fetching ancestors"
msgstr ""
@@ -3599,9 +3629,6 @@ msgstr ""
msgid "An error occurred while fetching label colors."
msgstr ""
-msgid "An error occurred while fetching markdown preview"
-msgstr ""
-
msgid "An error occurred while fetching participants"
msgstr ""
@@ -3617,9 +3644,6 @@ msgstr ""
msgid "An error occurred while fetching reference"
msgstr ""
-msgid "An error occurred while fetching sidebar data"
-msgstr ""
-
msgid "An error occurred while fetching tags. Retry the search."
msgstr ""
@@ -3695,6 +3719,9 @@ msgstr ""
msgid "An error occurred while loading merge requests."
msgstr ""
+msgid "An error occurred while loading projects."
+msgstr ""
+
msgid "An error occurred while loading the Needs tab."
msgstr ""
@@ -3929,12 +3956,6 @@ msgstr ""
msgid "Any Milestone"
msgstr ""
-msgid "Any branch"
-msgstr ""
-
-msgid "Any eligible user"
-msgstr ""
-
msgid "Any encrypted tokens"
msgstr ""
@@ -3953,6 +3974,9 @@ msgstr ""
msgid "Any namespace"
msgstr ""
+msgid "App Engine description and apps that are suitable for this deployment target"
+msgstr ""
+
msgid "App ID"
msgstr ""
@@ -4101,6 +4125,11 @@ msgstr ""
msgid "Apply"
msgstr ""
+msgid "Apply %d suggestion"
+msgid_plural "Apply %d suggestions"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Apply a label"
msgstr ""
@@ -4110,13 +4139,10 @@ msgstr ""
msgid "Apply suggestion"
msgstr ""
-msgid "Apply suggestions"
-msgstr ""
-
msgid "Apply template"
msgstr ""
-msgid "Apply this approval rule to any branch or a specific protected branch."
+msgid "Apply this approval rule to all branches or a specific protected branch."
msgstr ""
msgid "Applying"
@@ -4259,9 +4285,6 @@ msgstr ""
msgid "ApprovalSettings|Prevent editing approval rules in projects and merge requests."
msgstr ""
-msgid "ApprovalSettings|Prevent editing approval rules in projects and merge requests. "
-msgstr ""
-
msgid "ApprovalSettings|Remove all approvals when commits are added to the source branch."
msgstr ""
@@ -4277,6 +4300,9 @@ msgstr ""
msgid "ApprovalSettings|This setting is configured at the instance level and can only be changed by an administrator."
msgstr ""
+msgid "ApprovalSettings|This setting is configured in %{groupName} and can only be changed by an administrator or group owner."
+msgstr ""
+
msgid "ApprovalStatusTooltip|Adheres to separation of duties"
msgstr ""
@@ -4763,9 +4789,6 @@ msgstr ""
msgid "Authenticated API rate limit period in seconds"
msgstr ""
-msgid "Authenticated API request rate limit"
-msgstr ""
-
msgid "Authenticated API requests"
msgstr ""
@@ -4775,10 +4798,10 @@ msgstr ""
msgid "Authenticated Git LFS request rate limit"
msgstr ""
-msgid "Authenticated web rate limit period in seconds"
+msgid "Authenticated Git LFS requests"
msgstr ""
-msgid "Authenticated web request rate limit"
+msgid "Authenticated web rate limit period in seconds"
msgstr ""
msgid "Authenticated web requests"
@@ -5156,9 +5179,6 @@ msgstr ""
msgid "Below you will find all the groups that are public."
msgstr ""
-msgid "Beta"
-msgstr ""
-
msgid "Bi-weekly code coverage"
msgstr ""
@@ -5398,6 +5418,21 @@ msgstr ""
msgid "Board scope affects which issues are displayed for anyone who visits this board"
msgstr ""
+msgid "BoardNewEpic|Groups"
+msgstr ""
+
+msgid "BoardNewEpic|Loading groups"
+msgstr ""
+
+msgid "BoardNewEpic|No matching results"
+msgstr ""
+
+msgid "BoardNewEpic|Search groups"
+msgstr ""
+
+msgid "BoardNewEpic|Select a group"
+msgstr ""
+
msgid "BoardNewIssue|No matching results"
msgstr ""
@@ -5475,6 +5510,9 @@ msgstr ""
msgid "Boards|An error occurred while creating the list. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching child groups. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching group projects. Please try again."
msgstr ""
@@ -5807,6 +5845,9 @@ msgstr ""
msgid "Bulk update"
msgstr ""
+msgid "BulkImports|Re-import creates a new group. It does not sync with the existing group."
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -5816,6 +5857,9 @@ msgstr ""
msgid "BulkImport|From source group"
msgstr ""
+msgid "BulkImport|Group import history"
+msgstr ""
+
msgid "BulkImport|Import failed: Destination cannot be a subgroup of the source group. Change the destination and try again."
msgstr ""
@@ -5828,9 +5872,18 @@ msgstr ""
msgid "BulkImport|Importing the group failed"
msgstr ""
+msgid "BulkImport|Last imported to %{link}"
+msgstr ""
+
msgid "BulkImport|Name already exists."
msgstr ""
+msgid "BulkImport|New group"
+msgstr ""
+
+msgid "BulkImport|No history is available"
+msgstr ""
+
msgid "BulkImport|No parent"
msgstr ""
@@ -5843,6 +5896,9 @@ msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} matching filter \"%{filter}\" from %{link}"
msgstr ""
+msgid "BulkImport|Source group"
+msgstr ""
+
msgid "BulkImport|To new group"
msgstr ""
@@ -5852,6 +5908,9 @@ msgstr ""
msgid "BulkImport|You have no groups to import"
msgstr ""
+msgid "BulkImport|Your imported groups will appear here."
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -6094,6 +6153,9 @@ msgstr ""
msgid "Can be manually deployed to"
msgstr ""
+msgid "Can be overridden in each project."
+msgstr ""
+
msgid "Can create groups:"
msgstr ""
@@ -6196,6 +6258,9 @@ msgstr ""
msgid "Cancelling Preview"
msgstr ""
+msgid "Cannot assign a confidential epic to a non-confidential issue. Make the issue confidential and try again"
+msgstr ""
+
msgid "Cannot be assigned to other projects."
msgstr ""
@@ -6247,9 +6312,6 @@ msgstr ""
msgid "Cannot refer to a group %{timebox_type} by an internal id!"
msgstr ""
-msgid "Cannot set confidential epic for a non-confidential issue"
-msgstr ""
-
msgid "Cannot show preview. For previews on sketch files, they must have the file format introduced by Sketch version 43 and above."
msgstr ""
@@ -6487,15 +6549,15 @@ msgstr ""
msgid "Check out, review, and merge locally"
msgstr ""
-msgid "Check the %{docs_link_start}documentation%{docs_link_end}."
-msgstr ""
-
msgid "Check the current instance configuration "
msgstr ""
msgid "Check the elasticsearch.log file to debug why the migration was halted and make any changes before retrying the migration. When you fix the cause of the failure, click \"Retry migration\", and the migration will be scheduled to be retried in the background."
msgstr ""
+msgid "Check with your administrator."
+msgstr ""
+
msgid "Check your Docker images for known vulnerabilities."
msgstr ""
@@ -6526,6 +6588,9 @@ msgstr ""
msgid "Checkout"
msgstr ""
+msgid "Checkout|$%{selectedPlanPrice} per 10 GB storage per pack"
+msgstr ""
+
msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 minutes"
msgstr ""
@@ -6546,17 +6611,23 @@ msgstr ""
msgid "Checkout|%{name}'s GitLab subscription"
msgstr ""
-msgid "Checkout|%{selectedPlanText} plan"
+msgid "Checkout|%{name}'s storage subscription"
msgstr ""
-msgid "Checkout|%{startDate} - %{endDate}"
+msgid "Checkout|%{quantity} GB of storage"
msgstr ""
-msgid "Checkout|%{totalCiMinutes} CI minute"
-msgid_plural "Checkout|%{totalCiMinutes} CI minutes"
+msgid "Checkout|%{quantity} storage pack"
+msgid_plural "Checkout|%{quantity} storage packs"
msgstr[0] ""
msgstr[1] ""
+msgid "Checkout|%{selectedPlanText} plan"
+msgstr ""
+
+msgid "Checkout|%{startDate} - %{endDate}"
+msgstr ""
+
msgid "Checkout|%{totalCiMinutes} CI minutes"
msgstr ""
@@ -6632,6 +6703,9 @@ msgstr ""
msgid "Checkout|Failed to register credit card. Please try again."
msgstr ""
+msgid "Checkout|GB"
+msgstr ""
+
msgid "Checkout|GitLab group"
msgstr ""
@@ -6668,6 +6742,9 @@ msgstr ""
msgid "Checkout|State"
msgstr ""
+msgid "Checkout|Storage packs"
+msgstr ""
+
msgid "Checkout|Street address"
msgstr ""
@@ -6689,6 +6766,9 @@ msgstr ""
msgid "Checkout|Total minutes: %{quantity}"
msgstr ""
+msgid "Checkout|Total storage: %{quantity} GB"
+msgstr ""
+
msgid "Checkout|Users"
msgstr ""
@@ -6698,16 +6778,25 @@ msgstr ""
msgid "Checkout|Your organization"
msgstr ""
+msgid "Checkout|Your storage subscription has the same term as your main subscription, and the price is prorated accordingly."
+msgstr ""
+
msgid "Checkout|Your subscription will be applied to this group"
msgstr ""
msgid "Checkout|Zip code"
msgstr ""
+msgid "Checkout|a storage subscription"
+msgstr ""
+
msgid "Checkout|company or team"
msgstr ""
-msgid "Checkout|x 1,000 minutes per pack = %{strong}"
+msgid "Checkout|minutes"
+msgstr ""
+
+msgid "Checkout|x %{quantity} %{units} per pack ="
msgstr ""
msgid "Cherry-pick this commit"
@@ -7064,6 +7153,9 @@ msgstr ""
msgid "CloneIssue|Cannot clone issue to target project as it is pending deletion."
msgstr ""
+msgid "CloneIssue|Cannot clone issues of '%{issue_type}' type."
+msgstr ""
+
msgid "Cloned this issue to %{path_to_project}."
msgstr ""
@@ -7118,7 +7210,10 @@ msgstr ""
msgid "Closes this %{quick_action_target}."
msgstr ""
-msgid "Cloud licenses can not be removed."
+msgid "Cloud Functions description and apps that are suitable for this deployment target"
+msgstr ""
+
+msgid "Cloud Run description and apps that are suitable for this deployment target"
msgstr ""
msgid "Cluster"
@@ -7145,6 +7240,12 @@ msgstr ""
msgid "ClusterAgents|Access tokens"
msgstr ""
+msgid "ClusterAgents|Agent might not be connected to GitLab"
+msgstr ""
+
+msgid "ClusterAgents|Agent never connected to GitLab"
+msgstr ""
+
msgid "ClusterAgents|Alternative installation methods"
msgstr ""
@@ -7160,6 +7261,12 @@ msgstr ""
msgid "ClusterAgents|Configuration"
msgstr ""
+msgid "ClusterAgents|Connected"
+msgstr ""
+
+msgid "ClusterAgents|Connection status"
+msgstr ""
+
msgid "ClusterAgents|Copy token"
msgstr ""
@@ -7178,6 +7285,9 @@ msgstr ""
msgid "ClusterAgents|For alternative installation methods %{linkStart}go to the documentation%{linkEnd}."
msgstr ""
+msgid "ClusterAgents|For more troubleshooting information go to"
+msgstr ""
+
msgid "ClusterAgents|Go to the repository"
msgstr ""
@@ -7193,18 +7303,30 @@ msgstr ""
msgid "ClusterAgents|Integrate with the GitLab Agent"
msgstr ""
-msgid "ClusterAgents|Last used"
+msgid "ClusterAgents|Last connected %{timeAgo}."
+msgstr ""
+
+msgid "ClusterAgents|Last contact"
msgstr ""
msgid "ClusterAgents|Learn how to create an agent access token"
msgstr ""
+msgid "ClusterAgents|Make sure you are using a valid token."
+msgstr ""
+
msgid "ClusterAgents|Name"
msgstr ""
msgid "ClusterAgents|Never"
msgstr ""
+msgid "ClusterAgents|Never connected"
+msgstr ""
+
+msgid "ClusterAgents|Not connected"
+msgstr ""
+
msgid "ClusterAgents|Read more about getting started"
msgstr ""
@@ -7226,6 +7348,9 @@ msgstr ""
msgid "ClusterAgents|Select which Agent you want to install"
msgstr ""
+msgid "ClusterAgents|The Agent has not been connected in a long time. There might be a connectivity issue. Last contact was %{timeAgo}."
+msgstr ""
+
msgid "ClusterAgents|The GitLab Agent also requires %{linkStart}enabling the Agent Server%{linkEnd}"
msgstr ""
@@ -7253,9 +7378,6 @@ msgstr ""
msgid "ClusterAgents|You will need to create a token to connect to your agent"
msgstr ""
-msgid "ClusterAgent|This feature is only available for premium plans"
-msgstr ""
-
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -7445,9 +7567,6 @@ msgstr ""
msgid "ClusterIntegration|Create Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Create a provision role on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the account and external ID above. %{startMoreInfoLink}More information%{endLink}"
-msgstr ""
-
msgid "ClusterIntegration|Create cluster on"
msgstr ""
@@ -7880,7 +7999,7 @@ msgstr ""
msgid "ClusterIntegration|Subnets"
msgstr ""
-msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provisioned role, first create one on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the above account and external IDs. %{startMoreInfoLink}More information%{endLink}"
+msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provisioned role, first create one on %{awsLinkStart}Amazon Web Services %{awsLinkEnd} using the above account and external IDs. %{moreInfoStart}More information%{moreInfoEnd}"
msgstr ""
msgid "ClusterIntegration|The Kubernetes certificate used to authenticate to the cluster."
@@ -8114,6 +8233,9 @@ msgstr ""
msgid "Collapse replies"
msgstr ""
+msgid "Collapse settings section"
+msgstr ""
+
msgid "Collapse sidebar"
msgstr ""
@@ -8132,6 +8254,9 @@ msgstr ""
msgid "Comma-separated list of email addresses."
msgstr ""
+msgid "Comma-separated list of users allowed to exceed the rate limit."
+msgstr ""
+
msgid "Comma-separated, e.g. '1.1.1.1, 2.2.2.0/24'"
msgstr ""
@@ -8452,6 +8577,9 @@ msgstr ""
msgid "Configure %{repository_checks_link_start}repository checks%{link_end} and %{housekeeping_link_start}housekeeping%{link_end} on repositories."
msgstr ""
+msgid "Configure CAPTCHAs, IP address limits, and other anti-spam measures."
+msgstr ""
+
msgid "Configure Dependency Scanning in `.gitlab-ci.yml` using the GitLab managed template. You can [add variable overrides](https://docs.gitlab.com/ee/user/application_security/dependency_scanning/#customizing-the-dependency-scanning-settings) to customize Dependency Scanning settings."
msgstr ""
@@ -8488,16 +8616,13 @@ msgstr ""
msgid "Configure a %{codeStart}.gitlab-webide.yml%{codeEnd} file in the %{codeStart}.gitlab%{codeEnd} directory to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
msgstr ""
-msgid "Configure existing installation"
-msgstr ""
-
-msgid "Configure limit for notes created per minute by web and API requests."
+msgid "Configure advanced permissions, Large File Storage, and two-factor authentication settings."
msgstr ""
-msgid "Configure limits for Project/Group Import/Export."
+msgid "Configure approvals by authors and committers on all projects."
msgstr ""
-msgid "Configure limits for web and API requests."
+msgid "Configure existing installation"
msgstr ""
msgid "Configure paths to be protected by Rack Attack."
@@ -8512,10 +8637,13 @@ msgstr ""
msgid "Configure settings for Advanced Search with Elasticsearch."
msgstr ""
+msgid "Configure specific limits for Files API requests that supersede the general user and IP rate limits."
+msgstr ""
+
msgid "Configure specific limits for Git LFS requests that supersede the general user and IP rate limits."
msgstr ""
-msgid "Configure specific limits for Packages API requests that supersede the general user and IP rate limits."
+msgid "Configure specific limits for deprecated API requests that supersede the general user and IP rate limits."
msgstr ""
msgid "Configure the %{link} integration."
@@ -8527,6 +8655,9 @@ msgstr ""
msgid "Configure the way a user creates a new account."
msgstr ""
+msgid "Configure via Merge Request"
+msgstr ""
+
msgid "Configure which lists are shown for anyone who visits this board"
msgstr ""
@@ -8995,6 +9126,9 @@ msgstr ""
msgid "Content parsed with %{link}."
msgstr ""
+msgid "ContentEditor|Table of Contents"
+msgstr ""
+
msgid "ContentEditor|You have to provide a renderMarkdown function or a custom serializer"
msgstr ""
@@ -9181,6 +9315,9 @@ msgstr ""
msgid "Copy link to chart"
msgstr ""
+msgid "Copy prefix"
+msgstr ""
+
msgid "Copy reference"
msgstr ""
@@ -9211,6 +9348,9 @@ msgstr ""
msgid "Copy value"
msgstr ""
+msgid "Corpus Management"
+msgstr ""
+
msgid "Corpus Management|Are you sure you want to delete the corpus?"
msgstr ""
@@ -9439,6 +9579,9 @@ msgstr ""
msgid "Create commit"
msgstr ""
+msgid "Create common files more quickly, and standardize their format."
+msgstr ""
+
msgid "Create confidential merge request"
msgstr ""
@@ -9472,6 +9615,9 @@ msgstr ""
msgid "Create issue"
msgstr ""
+msgid "Create issue to resolve all threads"
+msgstr ""
+
msgid "Create iteration"
msgstr ""
@@ -9526,6 +9672,9 @@ msgstr ""
msgid "Create new..."
msgstr ""
+msgid "Create or import your first project"
+msgstr ""
+
msgid "Create project"
msgstr ""
@@ -9883,7 +10032,7 @@ msgstr ""
msgid "Custom notification events"
msgstr ""
-msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notificationLinkStart} notification emails%{notificationLinkEnd}."
+msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notificationLinkStart}notification emails%{notificationLinkEnd}."
msgstr ""
msgid "Custom project templates"
@@ -10082,10 +10231,10 @@ msgid_plural "CycleAnalytics|Showing %{subjectFilterText} and %{selectedLabelsCo
msgstr[0] ""
msgstr[1] ""
-msgid "CycleAnalytics|Showing data for group '%{groupName}' and %{selectedProjectCount} projects from %{startDate} to %{endDate}"
+msgid "CycleAnalytics|Showing data for group '%{groupName}' and %{selectedProjectCount} projects from %{createdAfter} to %{createdBefore}"
msgstr ""
-msgid "CycleAnalytics|Showing data for group '%{groupName}' from %{startDate} to %{endDate}"
+msgid "CycleAnalytics|Showing data for group '%{groupName}' from %{createdAfter} to %{createdBefore}"
msgstr ""
msgid "CycleAnalytics|Stages"
@@ -10319,6 +10468,9 @@ msgstr ""
msgid "DastProfiles|Manage profiles"
msgstr ""
+msgid "DastProfiles|Manage site profiles"
+msgstr ""
+
msgid "DastProfiles|Minimum = 0 (no timeout enabled), Maximum = 2880 minutes"
msgstr ""
@@ -10394,6 +10546,9 @@ msgstr ""
msgid "DastProfiles|Scanner name"
msgstr ""
+msgid "DastProfiles|Schedule"
+msgstr ""
+
msgid "DastProfiles|Select branch"
msgstr ""
@@ -10463,7 +10618,7 @@ msgstr ""
msgid "DastProfiles|Website"
msgstr ""
-msgid "DastProfiles|You can either choose a passive scan or validate the target site in your chosen site profile. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
+msgid "DastProfiles|You can either choose a passive scan or validate the target site from the site profile management page. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
msgstr ""
msgid "DastProfiles|You cannot run an active scan against an unvalidated site."
@@ -10636,7 +10791,7 @@ msgstr ""
msgid "Days to merge"
msgstr ""
-msgid "Deactivate dormant users after 90 days of inactivity. Users can return to active status by signing in to their account. While inactive, a user is not counted as an active user in the instance."
+msgid "Deactivate dormant users after 90 days of inactivity"
msgstr ""
msgid "Dear Administrator,"
@@ -10723,10 +10878,10 @@ msgstr ""
msgid "Define a custom pattern with cron syntax"
msgstr ""
-msgid "Define approval settings."
+msgid "Define approval rules."
msgstr ""
-msgid "Define approval settings. %{linkStart}Learn more.%{linkEnd}"
+msgid "Define approval rules. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "Define custom rules for what constitutes spam, independent of Akismet"
@@ -10735,7 +10890,7 @@ msgstr ""
msgid "Define environments in the deploy stage(s) in %{code_open}.gitlab-ci.yml%{code_close} to track deployments here."
msgstr ""
-msgid "Define how approval rules are applied as a merge request moves toward completion."
+msgid "Define how approval rules are applied to merge requests."
msgstr ""
msgid "Definition"
@@ -10750,6 +10905,12 @@ msgstr ""
msgid "DelayedJobs|Are you sure you want to run %{job_name} immediately? This job will run automatically after it's timer finishes."
msgstr ""
+msgid "DelayedJobs|Are you sure you want to run %{job_name} immediately? This job will run automatically after its timer finishes."
+msgstr ""
+
+msgid "DelayedJobs|Run the delayed job now?"
+msgstr ""
+
msgid "DelayedJobs|Start now"
msgstr ""
@@ -11026,6 +11187,12 @@ msgstr ""
msgid "Dependency proxy image prefix"
msgstr ""
+msgid "DependencyProxy|Create a local proxy for storing frequently used upstream images. %{docLinkStart}Learn more%{docLinkEnd} about dependency proxies."
+msgstr ""
+
+msgid "DependencyProxy|Dependency Proxy"
+msgstr ""
+
msgid "DependencyProxy|Toggle Dependency Proxy"
msgstr ""
@@ -11266,6 +11433,9 @@ msgstr ""
msgid "Deployments"
msgstr ""
+msgid "Deployments to Google Kubernetes Engine can be "
+msgstr ""
+
msgid "Deployments|%{deployments} environment impacted."
msgid_plural "Deployments|%{deployments} environments impacted."
msgstr[0] ""
@@ -11295,6 +11465,9 @@ msgstr ""
msgid "Deployment|success"
msgstr ""
+msgid "Deprecated API rate limits"
+msgstr ""
+
msgid "Deprioritize label"
msgstr ""
@@ -11697,6 +11870,16 @@ msgstr ""
msgid "DiffsCompareBaseBranch|(base)"
msgstr ""
+msgid "Diffs|%d addition"
+msgid_plural "Diffs|%d additions"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Diffs|%d deletion"
+msgid_plural "Diffs|%d deletions"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Diffs|No file name available"
msgstr ""
@@ -11706,9 +11889,17 @@ msgstr ""
msgid "Diffs|Show all unchanged lines"
msgstr ""
+msgid "Diffs|Showing %{dropdownStart}%{count} changed file%{dropdownEnd}"
+msgid_plural "Diffs|Showing %{dropdownStart}%{count} changed files%{dropdownEnd}"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Diffs|Something went wrong while fetching diff lines."
msgstr ""
+msgid "Diffs|with %{additions} and %{deletions}"
+msgstr ""
+
msgid "Direct member"
msgstr ""
@@ -11834,9 +12025,6 @@ msgid_plural "Dismiss %d selected vulnerabilities as"
msgstr[0] ""
msgstr[1] ""
-msgid "Dismiss Value Stream Analytics introduction box"
-msgstr ""
-
msgid "Dismiss merge request promotion"
msgstr ""
@@ -12158,6 +12346,9 @@ msgstr ""
msgid "Edit issues"
msgstr ""
+msgid "Edit merge requests"
+msgstr ""
+
msgid "Edit public deploy key"
msgstr ""
@@ -12233,6 +12424,9 @@ msgstr ""
msgid "Elastic|None. Select projects to index."
msgstr ""
+msgid "Eligible users"
+msgstr ""
+
msgid "Email"
msgstr ""
@@ -12362,6 +12556,9 @@ msgstr ""
msgid "Enable"
msgstr ""
+msgid "Enable Amazon EKS integration"
+msgstr ""
+
msgid "Enable Auto DevOps"
msgstr ""
@@ -12395,6 +12592,9 @@ msgstr ""
msgid "Enable SSL verification"
msgstr ""
+msgid "Enable Service Ping"
+msgstr ""
+
msgid "Enable Snowplow tracking"
msgstr ""
@@ -12425,6 +12625,9 @@ msgstr ""
msgid "Enable authenticated Git LFS request rate limit"
msgstr ""
+msgid "Enable authenticated web request rate limit"
+msgstr ""
+
msgid "Enable authentication"
msgstr ""
@@ -12485,7 +12688,7 @@ msgstr ""
msgid "Enable or disable the Pseudonymizer data collection."
msgstr ""
-msgid "Enable or disable version check and service ping."
+msgid "Enable or disable version check and Service Ping."
msgstr ""
msgid "Enable protected paths rate limit"
@@ -12497,18 +12700,12 @@ msgstr ""
msgid "Enable reCAPTCHA"
msgstr ""
-msgid "Enable reCAPTCHA for login"
-msgstr ""
-
-msgid "Enable reCAPTCHA, Invisible Captcha, Akismet and set IP limits. For reCAPTCHA, we currently only support %{recaptcha_v2_link_start}v2%{recaptcha_v2_link_end}"
+msgid "Enable reCAPTCHA for login."
msgstr ""
msgid "Enable repository checks"
msgstr ""
-msgid "Enable service ping"
-msgstr ""
-
msgid "Enable shared runners for all projects and subgroups in this group."
msgstr ""
@@ -12530,7 +12727,10 @@ msgstr ""
msgid "Enable unauthenticated API request rate limit"
msgstr ""
-msgid "Enable unauthenticated request rate limit"
+msgid "Enable unauthenticated web request rate limit"
+msgstr ""
+
+msgid "Enable user deactivation emails"
msgstr ""
msgid "Enable version check"
@@ -12566,9 +12766,6 @@ msgstr ""
msgid "Enabled sources for code import during project creation. OmniAuth must be configured for GitHub"
msgstr ""
-msgid "Enabling this will only make licensed EE features available to projects if the project namespace's plan includes the feature or if the project is public."
-msgstr ""
-
msgid "Encountered an error while rendering: %{err}"
msgstr ""
@@ -12617,9 +12814,6 @@ msgstr ""
msgid "Enter Admin Mode"
msgstr ""
-msgid "Enter IP address range"
-msgstr ""
-
msgid "Enter a number"
msgstr ""
@@ -12632,9 +12826,6 @@ msgstr ""
msgid "Enter at least three characters to search"
msgstr ""
-msgid "Enter domain"
-msgstr ""
-
msgid "Enter in your Bitbucket Server URL and personal access token below"
msgstr ""
@@ -12821,9 +13012,6 @@ msgstr ""
msgid "Environments|Deployment %{status}"
msgstr ""
-msgid "Environments|Dismiss"
-msgstr ""
-
msgid "Environments|Enable review app"
msgstr ""
@@ -12836,9 +13024,6 @@ msgstr ""
msgid "Environments|Environments are places where code gets deployed, such as staging or production."
msgstr ""
-msgid "Environments|Help us improve environments"
-msgstr ""
-
msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
msgstr ""
@@ -12875,6 +13060,9 @@ msgstr ""
msgid "Environments|Note that this action will stop the environment, but it will %{emphasisStart}not%{emphasisEnd} have an effect on any existing deployment due to no “stop environment action†being defined in the %{ciConfigLinkStart}.gitlab-ci.yml%{ciConfigLinkEnd} file."
msgstr ""
+msgid "Environments|Open"
+msgstr ""
+
msgid "Environments|Open live environment"
msgstr ""
@@ -12914,9 +13102,6 @@ msgstr ""
msgid "Environments|Stopping %{environmentName}"
msgstr ""
-msgid "Environments|Take the survey"
-msgstr ""
-
msgid "Environments|There was an error fetching the logs. Please try again."
msgstr ""
@@ -12938,9 +13123,6 @@ msgstr ""
msgid "Environments|You don't have any environments right now"
msgstr ""
-msgid "Environments|Your feedback helps GitLab make environments better for you and other users. Participate and enter a sweepstake to win a USD 30 gift card."
-msgstr ""
-
msgid "Environments|by %{avatar}"
msgstr ""
@@ -13223,7 +13405,7 @@ msgstr ""
msgid "Error parsing CSV file. Please make sure it has"
msgstr ""
-msgid "Error rendering markdown preview"
+msgid "Error rendering Markdown preview"
msgstr ""
msgid "Error saving label update."
@@ -13271,6 +13453,9 @@ msgstr ""
msgid "Error: %{error_message}"
msgstr ""
+msgid "Error: Couldn't load some or all of the changes."
+msgstr ""
+
msgid "Error: No AWS credentials were supplied"
msgstr ""
@@ -13304,6 +13489,9 @@ msgstr ""
msgid "ErrorTracking|Enable error tracking"
msgstr ""
+msgid "ErrorTracking|Error tracking backend"
+msgstr ""
+
msgid "ErrorTracking|If you self-host Sentry, enter your Sentry instance's full URL. If you use Sentry's hosted solution, enter https://sentry.io"
msgstr ""
@@ -13337,6 +13525,12 @@ msgstr ""
msgid "Escalation policies must have at least one rule"
msgstr ""
+msgid "EscalationPolicies|%{clockIcon} IF alert is not %{alertStatus} in %{minutes}"
+msgstr ""
+
+msgid "EscalationPolicies|%{notificationIcon} THEN %{doAction} %{forScheduleOrUser}"
+msgstr ""
+
msgid "EscalationPolicies|+ Add an additional rule"
msgstr ""
@@ -13379,13 +13573,13 @@ msgstr ""
msgid "EscalationPolicies|Escalation policies"
msgstr ""
-msgid "EscalationPolicies|Escalation rules"
+msgid "EscalationPolicies|Escalation policy %{obstacle} in Project %{project}"
msgstr ""
-msgid "EscalationPolicies|Failed to load oncall-schedules"
+msgid "EscalationPolicies|Escalation rules"
msgstr ""
-msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} %{then} THEN %{doAction} %{scheduleOrUser}"
+msgid "EscalationPolicies|Failed to load oncall-schedules"
msgstr ""
msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} minutes"
@@ -13463,18 +13657,36 @@ msgstr ""
msgid "Every %{action} attempt has failed: %{job_error_message}. Please try again."
msgstr ""
+msgid "Every 3 months"
+msgstr ""
+
+msgid "Every 3 months on the %{day} at %{time} %{timezone}"
+msgstr ""
+
+msgid "Every 6 months"
+msgstr ""
+
+msgid "Every 6 months on the %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Every day"
msgstr ""
msgid "Every day (at %{time})"
msgstr ""
+msgid "Every day at %{time} %{timezone}"
+msgstr ""
+
msgid "Every month"
msgstr ""
msgid "Every month (Day %{day} at %{time})"
msgstr ""
+msgid "Every month on the %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Every three months"
msgstr ""
@@ -13489,6 +13701,15 @@ msgstr[1] ""
msgid "Every week (%{weekday} at %{time})"
msgstr ""
+msgid "Every week on %{day} at %{time} %{timezone}"
+msgstr ""
+
+msgid "Every year"
+msgstr ""
+
+msgid "Every year on %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Everyone"
msgstr ""
@@ -13525,9 +13746,6 @@ msgstr ""
msgid "Exactly one of %{attributes} is required"
msgstr ""
-msgid "Example: %{ip_address}. %{read_more_link}."
-msgstr ""
-
msgid "Example: @sub\\.company\\.com$"
msgstr ""
@@ -13594,13 +13812,13 @@ msgstr ""
msgid "Expand pipeline"
msgstr ""
-msgid "Expand sidebar"
+msgid "Expand settings section"
msgstr ""
-msgid "Expected documents: %{expected_documents}"
+msgid "Expand sidebar"
msgstr ""
-msgid "Experienced"
+msgid "Expected documents: %{expected_documents}"
msgstr ""
msgid "ExperimentSubject|Must have exactly one of User, Namespace, or Project."
@@ -13885,9 +14103,6 @@ msgstr ""
msgid "Failed to load related branches"
msgstr ""
-msgid "Failed to load sidebar lock status"
-msgstr ""
-
msgid "Failed to load stacktrace."
msgstr ""
@@ -14312,6 +14527,9 @@ msgstr ""
msgid "Files"
msgstr ""
+msgid "Files API Rate Limits"
+msgstr ""
+
msgid "Files breadcrumb"
msgstr ""
@@ -15311,6 +15529,9 @@ msgstr ""
msgid "GitLab group: %{source_link}"
msgstr ""
+msgid "GitLab informs you if a new version is available."
+msgstr ""
+
msgid "GitLab is a complete DevOps platform, delivered as a single application, fundamentally changing the way Development, Security, and Ops teams collaborate"
msgstr ""
@@ -15326,7 +15547,7 @@ msgstr ""
msgid "GitLab is open source software to collaborate on code."
msgstr ""
-msgid "GitLab is undergoing maintenance and is operating in a read-only mode."
+msgid "GitLab is undergoing maintenance and is operating in read-only mode."
msgstr ""
msgid "GitLab member or Email address"
@@ -15338,9 +15559,6 @@ msgstr ""
msgid "GitLab project export"
msgstr ""
-msgid "GitLab restart is required to apply changes."
-msgstr ""
-
msgid "GitLab single sign-on URL"
msgstr ""
@@ -15356,9 +15574,6 @@ msgstr ""
msgid "GitLab version"
msgstr ""
-msgid "GitLab will inform you if a new version is available."
-msgstr ""
-
msgid "GitLab will run a background job that will produce pseudonymized CSVs of the GitLab database that will be uploaded to your configured object storage directory."
msgstr ""
@@ -15623,9 +15838,21 @@ msgstr ""
msgid "Go to snippets"
msgstr ""
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check 'Allowed domains for sign-ups'."
+msgstr ""
+
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check 'Email restrictions for sign-ups'."
+msgstr ""
+
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check the 'Domain denylist'."
+msgstr ""
+
msgid "Go to the activity feed"
msgstr ""
+msgid "Go to the group’s 'Settings &gt; General' page, and check 'Restrict membership by email domain'."
+msgstr ""
+
msgid "Go to the milestone list"
msgstr ""
@@ -15662,6 +15889,12 @@ msgstr ""
msgid "Goal of the changes and what reviewers should be aware of"
msgstr ""
+msgid "Google Cloud"
+msgstr ""
+
+msgid "Google Cloud offers several deployment targets. Select the one most suitable for your project."
+msgstr ""
+
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
@@ -15746,9 +15979,6 @@ msgstr ""
msgid "Group ID"
msgstr ""
-msgid "Group ID: %{group_id}"
-msgstr ""
-
msgid "Group Owner must have signed in with SAML before enabling Group Managed Accounts"
msgstr ""
@@ -15923,6 +16153,12 @@ msgstr ""
msgid "GroupImport|Unable to process group import file"
msgstr ""
+msgid "GroupPage|Copy group ID"
+msgstr ""
+
+msgid "GroupPage|Group ID: %{group_id}"
+msgstr ""
+
msgid "GroupRoadmap|%{dateWord} – No end date"
msgstr ""
@@ -15977,6 +16213,9 @@ msgstr ""
msgid "GroupRoadmap|Within 3 years"
msgstr ""
+msgid "GroupSAML|\"persistent\" recommended"
+msgstr ""
+
msgid "GroupSAML|%{strongOpen}Warning%{strongClose} - Enabling %{linkStart}SSO enforcement%{linkEnd} can reduce security risks."
msgstr ""
@@ -16109,6 +16348,9 @@ msgstr ""
msgid "GroupSAML|To be able to prohibit outer forks, you first need to enforce dedicate group managed accounts."
msgstr ""
+msgid "GroupSAML|Use SAML group links to manage group membership using SAML."
+msgstr ""
+
msgid "GroupSAML|Valid SAML Response"
msgstr ""
@@ -16121,13 +16363,10 @@ msgstr ""
msgid "GroupSAML|as %{access_level}"
msgstr ""
-msgid "GroupSAML|must match stored NameID of \"%{extern_uid}\" as we use this to identify users. If the NameID changes users will be unable to sign in."
-msgstr ""
-
-msgid "GroupSAML|should be \"persistent\""
+msgid "GroupSAML|must match stored NameID of \"%{extern_uid}\" to identify user and allow sign in"
msgstr ""
-msgid "GroupSAML|should be a random persistent ID, emails are discouraged"
+msgid "GroupSAML|recommend persistent ID instead of email"
msgstr ""
msgid "GroupSelect|No matching results"
@@ -16142,9 +16381,15 @@ msgstr ""
msgid "GroupSettings|Allow project access token creation"
msgstr ""
+msgid "GroupSettings|Applied to all subgroups unless overridden by a group owner. Groups already added to the project lose access."
+msgstr ""
+
msgid "GroupSettings|Auto DevOps pipeline was updated for the group"
msgstr ""
+msgid "GroupSettings|Available only on the top-level group. Applies to all subgroups. Groups already shared with a group outside %{group} are still shared unless removed manually."
+msgstr ""
+
msgid "GroupSettings|Badges"
msgstr ""
@@ -16196,6 +16441,9 @@ msgstr ""
msgid "GroupSettings|New runners registration token has been generated!"
msgstr ""
+msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgstr ""
+
msgid "GroupSettings|Pipeline settings was updated for the group"
msgstr ""
@@ -16208,12 +16456,15 @@ msgstr ""
msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
-msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups."
+msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups"
msgstr ""
msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
msgstr ""
+msgid "GroupSettings|Prevents group members from being notified if the group is mentioned."
+msgstr ""
+
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
msgstr ""
@@ -16250,21 +16501,6 @@ msgstr ""
msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}."
msgstr ""
-msgid "GroupSettings|This setting is only available on the top-level group and it applies to all subgroups. Groups that have already been shared with a group outside %{group} will still be shared, and this access will have to be revoked manually."
-msgstr ""
-
-msgid "GroupSettings|This setting will be applied to all subgroups unless overridden by a group owner. Groups that already have access to the project will continue to have access unless removed manually."
-msgstr ""
-
-msgid "GroupSettings|This setting will override user notification preferences for all members of the group, subgroups, and projects."
-msgstr ""
-
-msgid "GroupSettings|This setting will prevent group members from being notified if the group is mentioned."
-msgstr ""
-
-msgid "GroupSettings|This setting will prevent group members from forking projects outside of the group."
-msgstr ""
-
msgid "GroupSettings|Transfer group"
msgstr ""
@@ -16382,7 +16618,7 @@ msgstr ""
msgid "GroupsNew|No import options available"
msgstr ""
-msgid "GroupsNew|Not all related objects are migrated, as %{docs_link_start}described here%{docs_link_end}. Please %{feedback_link_start}leave feedback%{feedback_link_end} on this feature."
+msgid "GroupsNew|Not all related objects are migrated. %{docs_link_start}More info%{docs_link_end}."
msgstr ""
msgid "GroupsNew|Personal access token"
@@ -16514,15 +16750,27 @@ msgstr ""
msgid "Hello %{name},"
msgstr ""
-msgid "Hello there"
-msgstr ""
-
msgid "Hello, %{name}!"
msgstr ""
msgid "Hello, %{username}!"
msgstr ""
+msgid "HelloMessage|%{handshake_emoji} Contribute to GitLab: %{contribute_link}"
+msgstr ""
+
+msgid "HelloMessage|%{magnifier_emoji} Create a new GitLab issue: %{new_issue_link}"
+msgstr ""
+
+msgid "HelloMessage|%{rocket_emoji} We like your curiosity! Help us improve GitLab by joining the team: %{jobs_page_link}"
+msgstr ""
+
+msgid "HelloMessage|Does this page need fixes or improvements? Open an issue or contribute a merge request to help make GitLab more lovable. At GitLab, everyone can contribute!"
+msgstr ""
+
+msgid "HelloMessage|Welcome to GitLab!"
+msgstr ""
+
msgid "Help"
msgstr ""
@@ -16532,13 +16780,10 @@ msgstr ""
msgid "Helps prevent bots from creating accounts."
msgstr ""
-msgid "Helps prevent bots from creating issues"
-msgstr ""
-
-msgid "Helps prevent malicious users hide their activity"
+msgid "Helps prevent bots from creating issues."
msgstr ""
-msgid "Helps reduce request volume (e.g. from crawlers or abusive bots)"
+msgid "Helps prevent malicious users hide their activity."
msgstr ""
msgid "Helps reduce request volume (for example, from crawlers or abusive bots)"
@@ -16662,6 +16907,12 @@ msgstr ""
msgid "Housekeeping, export, path, transfer, remove, archive."
msgstr ""
+msgid "How do I configure Akismet?"
+msgstr ""
+
+msgid "How do I configure it?"
+msgstr ""
+
msgid "How do I configure runners?"
msgstr ""
@@ -16683,19 +16934,25 @@ msgstr ""
msgid "How do I set up this service?"
msgstr ""
+msgid "How do I use a web terminal?"
+msgstr ""
+
+msgid "How do I use file templates?"
+msgstr ""
+
msgid "How it works"
msgstr ""
msgid "How many days need to pass between marking entity for deletion and actual removing it."
msgstr ""
-msgid "How many seconds an IP will be counted towards the limit"
+msgid "How many seconds an IP counts toward the IP address limit."
msgstr ""
-msgid "I accept the %{terms_link}"
+msgid "How the job limiter handles jobs exceeding the thresholds specified below. The 'track' mode only logs the jobs. The 'compress' mode compresses the jobs and raises an exception if the compressed size exceeds the limit."
msgstr ""
-msgid "I accept the|Terms of Service and Privacy Policy"
+msgid "I accept the %{terms_link}"
msgstr ""
msgid "I forgot my password"
@@ -16779,13 +17036,16 @@ msgstr ""
msgid "IP Address"
msgstr ""
-msgid "IP expiration time"
+msgid "IP address expiration time"
msgstr ""
-msgid "IP subnet restriction only allowed for top-level groups"
+msgid "IP address restrictions"
+msgstr ""
+
+msgid "IP addresses per user"
msgstr ""
-msgid "IPs per user"
+msgid "IP subnet restriction only allowed for top-level groups"
msgstr ""
msgid "Identifier"
@@ -16800,6 +17060,9 @@ msgstr ""
msgid "If any indexed field exceeds this limit it will be truncated to this number of characters and the rest will not be indexed or searchable. This does not apply to repository and wiki indexing. Setting this to 0 means it is unlimited."
msgstr ""
+msgid "If blank, defaults to %{code_open}Retry later%{code_close}."
+msgstr ""
+
msgid "If blank, set allowable lifetime to %{instance_level_policy_in_words}, as defined by the instance admin. Once set, existing tokens for users in this group may be revoked."
msgstr ""
@@ -16851,6 +17114,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 did not initiate these sign-in attempts, please reach out to your administrator or enable two-factor authentication (2FA) on your account."
+msgstr ""
+
msgid "If you did not initiate this change, please contact your administrator immediately."
msgstr ""
@@ -16942,10 +17208,10 @@ msgstr ""
msgid "Import Projects from Gitea"
msgstr ""
-msgid "Import a project"
+msgid "Import an exported GitLab project"
msgstr ""
-msgid "Import an exported GitLab project"
+msgid "Import and export rate limits"
msgstr ""
msgid "Import failed due to a GitHub error: %{original}"
@@ -16957,12 +17223,18 @@ msgstr ""
msgid "Import from Jira"
msgstr ""
+msgid "Import group"
+msgstr ""
+
msgid "Import group from file"
msgstr ""
msgid "Import groups"
msgstr ""
+msgid "Import history"
+msgstr ""
+
msgid "Import in progress"
msgstr ""
@@ -17026,7 +17298,25 @@ msgstr ""
msgid "Import timed out. Import took longer than %{import_jobs_expiration} seconds"
msgstr ""
-msgid "Import/Export Rate Limits"
+msgid "ImportAProjectModal|Import from a project"
+msgstr ""
+
+msgid "ImportAProjectModal|Import members from another project"
+msgstr ""
+
+msgid "ImportAProjectModal|Import project members"
+msgstr ""
+
+msgid "ImportAProjectModal|Only project members (not group members) are imported, and they get the same permissions as the project you import from."
+msgstr ""
+
+msgid "ImportAProjectModal|Successfully imported"
+msgstr ""
+
+msgid "ImportAProjectModal|Unable to import project members"
+msgstr ""
+
+msgid "ImportAProjectModal|You're importing members to the %{strongStart}%{name}%{strongEnd} project."
msgstr ""
msgid "ImportButtons|Connect repositories from"
@@ -17079,7 +17369,7 @@ msgstr[1] ""
msgid "Importing..."
msgstr ""
-msgid "Import|A repository URL usually ends in a .git suffix, although this is not required. Double check to make sure your repository URL is correct."
+msgid "Import|There is not a valid Git repository at this URL. If your HTTP repository is not publicly accessible, verify your credentials."
msgstr ""
msgid "Improve customer support with Service Desk"
@@ -17088,9 +17378,6 @@ msgstr ""
msgid "Improves Git cloning performance."
msgstr ""
-msgid "In %{time_to_now}"
-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 ""
@@ -17376,7 +17663,7 @@ msgstr ""
msgid "InProductMarketing|Start a GitLab Ultimate trial today in less than one minute, no credit card required."
msgstr ""
-msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no CC required"
+msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no credit card required"
msgstr ""
msgid "InProductMarketing|Start a trial"
@@ -17415,7 +17702,7 @@ msgstr ""
msgid "InProductMarketing|Team up in GitLab for greater efficiency"
msgstr ""
-msgid "InProductMarketing|Team work makes the dream work"
+msgid "InProductMarketing|Team work makes the dream work"
msgstr ""
msgid "InProductMarketing|Test, create, deploy"
@@ -17996,6 +18283,9 @@ msgstr ""
msgid "Integrations|Create new issue in Jira"
msgstr ""
+msgid "Integrations|Create new issue in ZenTao"
+msgstr ""
+
msgid "Integrations|Default settings are inherited from the group level."
msgstr ""
@@ -18089,9 +18379,15 @@ msgstr ""
msgid "Integrations|Search Jira issues"
msgstr ""
+msgid "Integrations|Search ZenTao issues"
+msgstr ""
+
msgid "Integrations|Send notifications about project events to Unify Circuit."
msgstr ""
+msgid "Integrations|Send notifications about project events to a Unify Circuit conversation. %{docs_link}"
+msgstr ""
+
msgid "Integrations|Sign in to add namespaces"
msgstr ""
@@ -18131,6 +18427,9 @@ msgstr ""
msgid "Integrations|You've activated every integration 🎉"
msgstr ""
+msgid "Integrations|ZenTao issues display here when you create issues in your project in ZenTao."
+msgstr ""
+
msgid "Interactive mode"
msgstr ""
@@ -18158,9 +18457,6 @@ msgstr ""
msgid "Interval Pattern"
msgstr ""
-msgid "Introducing Value Stream Analytics"
-msgstr ""
-
msgid "Introducing Your DevOps Report"
msgstr ""
@@ -18257,6 +18553,12 @@ msgstr ""
msgid "Investigate vulnerability: %{title}"
msgstr ""
+msgid "Invisible Captcha"
+msgstr ""
+
+msgid "Invisible Captcha helps prevent the creation of spam accounts. It adds a honeypot field and time-sensitive form submission to the account signup form."
+msgstr ""
+
msgid "Invitation"
msgstr ""
@@ -18710,12 +19012,18 @@ msgstr ""
msgid "Issues"
msgstr ""
+msgid "Issues I've created"
+msgstr ""
+
msgid "Issues Rate Limits"
msgstr ""
msgid "Issues and merge requests"
msgstr ""
+msgid "Issues assigned to me"
+msgstr ""
+
msgid "Issues can be bugs, tasks or ideas to be discussed. Also, issues are searchable and filterable."
msgstr ""
@@ -18827,7 +19135,7 @@ msgstr ""
msgid "Iterations|Create cadence"
msgstr ""
-msgid "Iterations|Create your first iteration"
+msgid "Iterations|Create iteration"
msgstr ""
msgid "Iterations|Delete cadence"
@@ -18836,6 +19144,9 @@ msgstr ""
msgid "Iterations|Delete iteration cadence?"
msgstr ""
+msgid "Iterations|Delete iteration?"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -18869,12 +19180,18 @@ msgstr ""
msgid "Iterations|New iteration cadence"
msgstr ""
+msgid "Iterations|No closed iterations."
+msgstr ""
+
msgid "Iterations|No iteration cadences to show."
msgstr ""
msgid "Iterations|No iterations in cadence."
msgstr ""
+msgid "Iterations|No open iterations."
+msgstr ""
+
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
@@ -18905,6 +19222,9 @@ msgstr ""
msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
msgstr ""
+msgid "Iterations|This will remove the iteration from any issues that are assigned to it."
+msgstr ""
+
msgid "Iterations|Title"
msgstr ""
@@ -18920,15 +19240,9 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "I’m familiar with the basics of DevOps."
-msgstr ""
-
msgid "I’m joining my team who’s already on GitLab"
msgstr ""
-msgid "I’m not familiar with the basics of DevOps."
-msgstr ""
-
msgid "Jaeger URL"
msgstr ""
@@ -19193,6 +19507,9 @@ msgstr ""
msgid "Job"
msgstr ""
+msgid "Job %{jobName}"
+msgstr ""
+
msgid "Job Failed #%{build_id}"
msgstr ""
@@ -19783,9 +20100,6 @@ msgstr ""
msgid "Learn more in the"
msgstr ""
-msgid "Learn more in the|pipeline schedules documentation"
-msgstr ""
-
msgid "Learn more."
msgstr ""
@@ -19897,9 +20211,6 @@ msgstr ""
msgid "Leave Admin Mode"
msgstr ""
-msgid "Leave blank for no limit. Once set, existing personal access tokens may be revoked."
-msgstr ""
-
msgid "Leave edit mode? All unsaved changes will be lost."
msgstr ""
@@ -19945,10 +20256,10 @@ msgstr ""
msgid "LicenseCompliance|Acceptable license to be used in the project"
msgstr ""
-msgid "LicenseCompliance|Add a license"
+msgid "LicenseCompliance|Add license and related policy"
msgstr ""
-msgid "LicenseCompliance|Add license and related policy"
+msgid "LicenseCompliance|Add license policy"
msgstr ""
msgid "LicenseCompliance|Allow"
@@ -20038,6 +20349,9 @@ msgstr ""
msgid "LicenseManagement|Uncategorized"
msgstr ""
+msgid "Licensed Enterprise Edition features can be used if the project namespace's plan includes the feature, or if the project is public."
+msgstr ""
+
msgid "Licensed Features"
msgstr ""
@@ -20104,7 +20418,10 @@ msgstr ""
msgid "Limit namespaces and projects that can be indexed"
msgstr ""
-msgid "Limit sign in from multiple ips"
+msgid "Limit project size at a global, group, and project level. %{link_start}Learn more%{link_end}."
+msgstr ""
+
+msgid "Limit sign in from multiple IP addresses"
msgstr ""
msgid "Limit the number of concurrent operations this secondary site can run in the background."
@@ -20116,11 +20433,17 @@ msgstr ""
msgid "Limit the number of issues and epics per minute a user can create through web and API requests."
msgstr ""
+msgid "Limit the size of Sidekiq jobs stored in Redis."
+msgstr ""
+
msgid "Limited to showing %d event at most"
msgid_plural "Limited to showing %d events at most"
msgstr[0] ""
msgstr[1] ""
+msgid "Limiting mode"
+msgstr ""
+
msgid "Line changes"
msgstr ""
@@ -20190,9 +20513,6 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
-msgid "List of users to be excluded from the limit"
-msgstr ""
-
msgid "List options"
msgstr ""
@@ -20232,9 +20552,6 @@ msgstr ""
msgid "Loading functions timed out. Please reload the page to try again."
msgstr ""
-msgid "Loading issues"
-msgstr ""
-
msgid "Loading more"
msgstr ""
@@ -20526,6 +20843,9 @@ msgstr ""
msgid "Marked For Deletion At - %{deletion_time}"
msgstr ""
+msgid "Marked as ready. Merging is now allowed."
+msgstr ""
+
msgid "Marked this %{noun} as a draft."
msgstr ""
@@ -20598,52 +20918,22 @@ msgstr ""
msgid "Max 100,000 events"
msgstr ""
-msgid "Max 20 characters"
-msgstr ""
-
-msgid "Max Group Export Download requests per minute per user"
-msgstr ""
-
-msgid "Max Group Export requests per minute per user"
-msgstr ""
-
-msgid "Max Group Import requests per minute per user"
-msgstr ""
-
-msgid "Max Project Export Download requests per minute per user"
-msgstr ""
-
-msgid "Max Project Export requests per minute per user"
-msgstr ""
-
-msgid "Max Project Import requests per minute per user"
-msgstr ""
-
-msgid "Max authenticated API requests per period per user"
-msgstr ""
-
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
-msgid "Max authenticated web requests per period per user"
-msgstr ""
-
msgid "Max file size is 200 KB."
msgstr ""
-msgid "Max requests per minute per user"
-msgstr ""
-
msgid "Max role"
msgstr ""
msgid "Max session time"
msgstr ""
-msgid "Max unauthenticated requests per period per IP"
+msgid "MaxBuilds"
msgstr ""
-msgid "MaxBuilds"
+msgid "Maximum 20 characters"
msgstr ""
msgid "Maximum Conan package file size in bytes"
@@ -20679,6 +20969,12 @@ msgstr ""
msgid "Maximum attachment size (MB)"
msgstr ""
+msgid "Maximum authenticated API requests per rate limit period per user"
+msgstr ""
+
+msgid "Maximum authenticated web requests per rate limit period per user"
+msgstr ""
+
msgid "Maximum bulk request size (MiB)"
msgstr ""
@@ -20724,6 +21020,15 @@ msgstr ""
msgid "Maximum files in a diff"
msgstr ""
+msgid "Maximum group export download requests per minute"
+msgstr ""
+
+msgid "Maximum group export requests per minute"
+msgstr ""
+
+msgid "Maximum group import requests per minute"
+msgstr ""
+
msgid "Maximum import size"
msgstr ""
@@ -20760,7 +21065,7 @@ msgstr ""
msgid "Maximum number of projects."
msgstr ""
-msgid "Maximum number of unique IPs per user"
+msgid "Maximum number of unique IP addresses per user."
msgstr ""
msgid "Maximum page reached"
@@ -20769,12 +21074,24 @@ msgstr ""
msgid "Maximum page size"
msgstr ""
+msgid "Maximum project export download requests per minute"
+msgstr ""
+
+msgid "Maximum project export requests per minute"
+msgstr ""
+
+msgid "Maximum project import requests per minute"
+msgstr ""
+
msgid "Maximum push size"
msgstr ""
msgid "Maximum push size (MB)"
msgstr ""
+msgid "Maximum requests per minute"
+msgstr ""
+
msgid "Maximum running slices"
msgstr ""
@@ -20802,10 +21119,16 @@ msgstr ""
msgid "Maximum time between updates that a mirror can have when scheduled to synchronize."
msgstr ""
-msgid "Maximum time for web terminal websocket connection (in seconds). 0 for unlimited."
+msgid "Maximum time that users are allowed to skip the setup of two-factor authentication (in hours). Set to 0 (zero) to enforce at next sign in."
msgstr ""
-msgid "Maximum time that users are allowed to skip the setup of two-factor authentication (in hours). Set to 0 (zero) to enforce at next sign in."
+msgid "Maximum time, in seconds, for a web terminal websocket connection. 0 for unlimited."
+msgstr ""
+
+msgid "Maximum unauthenticated API requests per rate limit period per IP"
+msgstr ""
+
+msgid "Maximum unauthenticated web requests per rate limit period per IP"
msgstr ""
msgid "May"
@@ -20823,9 +21146,6 @@ msgstr ""
msgid "Medium vulnerabilities present"
msgstr ""
-msgid "Member lock"
-msgstr ""
-
msgid "Member since"
msgstr ""
@@ -20862,6 +21182,9 @@ msgstr ""
msgid "Members of a group may only view projects they have permission to access"
msgstr ""
+msgid "Membership"
+msgstr ""
+
msgid "Members|%{time} by %{user}"
msgstr ""
@@ -20922,9 +21245,6 @@ msgstr ""
msgid "Members|Expiration date updated successfully."
msgstr ""
-msgid "Members|Expired"
-msgstr ""
-
msgid "Members|Filter members"
msgstr ""
@@ -20940,9 +21260,6 @@ msgstr ""
msgid "Members|Membership"
msgstr ""
-msgid "Members|No expiration set"
-msgstr ""
-
msgid "Members|Remove \"%{groupName}\""
msgstr ""
@@ -20964,9 +21281,6 @@ msgstr ""
msgid "Members|Search invited"
msgstr ""
-msgid "Members|in %{time}"
-msgstr ""
-
msgid "Member|Deny access"
msgstr ""
@@ -21042,9 +21356,6 @@ msgstr ""
msgid "Merge request %{mr_link} was reviewed by %{mr_author}"
msgstr ""
-msgid "Merge request (MR) approvals"
-msgstr ""
-
msgid "Merge request analytics"
msgstr ""
@@ -21066,12 +21377,21 @@ msgstr ""
msgid "Merge requests"
msgstr ""
+msgid "Merge requests I've created"
+msgstr ""
+
msgid "Merge requests are a place to propose changes you've made to a project and discuss those changes with others"
msgstr ""
msgid "Merge requests are read-only in a secondary Geo node"
msgstr ""
+msgid "Merge requests assigned to me"
+msgstr ""
+
+msgid "Merge requests that I'm a reviewer"
+msgstr ""
+
msgid "Merge the branch and fix any conflicts that come up"
msgstr ""
@@ -21132,10 +21452,10 @@ msgstr ""
msgid "MergeRequests|An error occurred while saving the draft comment."
msgstr ""
-msgid "MergeRequests|Failed to squash. Should be done manually."
+msgid "MergeRequests|Create issue to resolve thread"
msgstr ""
-msgid "MergeRequests|Resolve this thread in a new issue"
+msgid "MergeRequests|Failed to squash. Should be done manually."
msgstr ""
msgid "MergeRequests|Saving the comment failed"
@@ -21949,6 +22269,9 @@ msgstr ""
msgid "MoveIssue|Cannot move issue to project it originates from!"
msgstr ""
+msgid "MoveIssue|Cannot move issues of '%{issue_type}' type."
+msgstr ""
+
msgid "Moved issue to %{label} column in the board."
msgstr ""
@@ -22074,6 +22397,15 @@ 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. To learn more about reducing storage capacity please visit our docs."
msgstr ""
+msgid "NamespaceUserCap|Pending users must be reviewed and approved by a group owner. Learn more about %{user_caps_link_start}User Caps%{link_end} and %{users_pending_approval_link_start}Users Pending Approval%{link_end}."
+msgstr ""
+
+msgid "NamespaceUserCap|View pending user approvals"
+msgstr ""
+
+msgid "NamespaceUserCap|Your group has reached its billable member limit"
+msgstr ""
+
msgid "Namespaces"
msgstr ""
@@ -22116,9 +22448,6 @@ msgstr ""
msgid "Network"
msgstr ""
-msgid "Network Policy|New rule"
-msgstr ""
-
msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is inbound from a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
msgstr ""
@@ -22140,16 +22469,13 @@ msgstr ""
msgid "NetworkPolicies|%{strongOpen}any%{strongClose} port"
msgstr ""
-msgid "NetworkPolicies|+ Add alert"
-msgstr ""
-
msgid "NetworkPolicies|.yaml"
msgstr ""
msgid "NetworkPolicies|.yaml mode"
msgstr ""
-msgid "NetworkPolicies|Actions"
+msgid "NetworkPolicies|Add alert"
msgstr ""
msgid "NetworkPolicies|Alerts are intended to be selectively used for a limited number of events that are potentially concerning and warrant a manual review. Alerts should not be used as a substitute for a SIEM or a logging tool. High volume alerts are likely to be dropped so as to preserve the stability of GitLab's integration with Kubernetes."
@@ -22185,9 +22511,6 @@ msgstr ""
msgid "NetworkPolicies|Deny all traffic"
msgstr ""
-msgid "NetworkPolicies|Description"
-msgstr ""
-
msgid "NetworkPolicies|Edit policy"
msgstr ""
@@ -22200,9 +22523,6 @@ msgstr ""
msgid "NetworkPolicies|IP/subnet"
msgstr ""
-msgid "NetworkPolicies|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
-msgstr ""
-
msgid "NetworkPolicies|Invalid or empty policy"
msgstr ""
@@ -22212,19 +22532,16 @@ msgstr ""
msgid "NetworkPolicies|Kubernetes error: %{error}"
msgstr ""
-msgid "NetworkPolicies|Name"
-msgstr ""
-
msgid "NetworkPolicies|Network"
msgstr ""
-msgid "NetworkPolicies|Network traffic"
+msgid "NetworkPolicies|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
msgstr ""
-msgid "NetworkPolicies|New policy"
+msgid "NetworkPolicies|Network policy can be created after the environment is loaded successfully."
msgstr ""
-msgid "NetworkPolicies|No policies detected"
+msgid "NetworkPolicies|Network traffic"
msgstr ""
msgid "NetworkPolicies|None selected"
@@ -22233,21 +22550,12 @@ msgstr ""
msgid "NetworkPolicies|Please %{installLinkStart}install%{installLinkEnd} and %{configureLinkStart}configure a Kubernetes Agent for this project%{configureLinkEnd} to enable alerts."
msgstr ""
-msgid "NetworkPolicies|Policies are a specification of how groups of pods are allowed to communicate with each other's network endpoints."
-msgstr ""
-
msgid "NetworkPolicies|Policy %{policyName} was successfully changed"
msgstr ""
msgid "NetworkPolicies|Policy definition"
msgstr ""
-msgid "NetworkPolicies|Policy editor"
-msgstr ""
-
-msgid "NetworkPolicies|Policy preview"
-msgstr ""
-
msgid "NetworkPolicies|Rule"
msgstr ""
@@ -22257,9 +22565,6 @@ msgstr ""
msgid "NetworkPolicies|Rule mode is unavailable for this policy. In some cases, we cannot parse the YAML file back into the rules editor."
msgstr ""
-msgid "NetworkPolicies|Rules"
-msgstr ""
-
msgid "NetworkPolicies|Save changes"
msgstr ""
@@ -22272,9 +22577,6 @@ msgstr ""
msgid "NetworkPolicies|Traffic that does not match any rule will be blocked."
msgstr ""
-msgid "NetworkPolicies|Unable to parse policy"
-msgstr ""
-
msgid "NetworkPolicies|all DNS names"
msgstr ""
@@ -22454,6 +22756,9 @@ msgstr ""
msgid "New issue"
msgstr ""
+msgid "New issue in %{project}"
+msgstr ""
+
msgid "New issue title"
msgstr ""
@@ -22532,7 +22837,7 @@ msgstr ""
msgid "Newest first"
msgstr ""
-msgid "Newly registered users will by default be external"
+msgid "Newly-registered users are external by default"
msgstr ""
msgid "Next"
@@ -22847,8 +23152,10 @@ msgstr ""
msgid "No webhooks found, add one in the form above."
msgstr ""
-msgid "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} to renew your subscription."
-msgstr ""
+msgid "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} day to renew your subscription."
+msgid_plural "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} days to renew your subscription."
+msgstr[0] ""
+msgstr[1] ""
msgid "No. of commits"
msgstr ""
@@ -22865,7 +23172,7 @@ msgstr ""
msgid "Nodes"
msgstr ""
-msgid "Non-admin users can sign in with read-only access and make read-only API requests."
+msgid "Non-admin users are restricted to read-only access, in both GitLab UI and API."
msgstr ""
msgid "None"
@@ -22946,7 +23253,7 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
-msgid "Notes Rate Limits"
+msgid "Notes rate limit"
msgstr ""
msgid "Notes|Are you sure you want to cancel creating this comment?"
@@ -23113,9 +23420,6 @@ msgstr ""
msgid "November"
msgstr ""
-msgid "Novice"
-msgstr ""
-
msgid "Now, personalize your GitLab experience"
msgstr ""
@@ -23284,7 +23588,7 @@ msgstr ""
msgid "OnCallSchedules|For this rotation, on-call will be:"
msgstr ""
-msgid "OnCallSchedules|On-call schedule %{schedule} in Project %{project}"
+msgid "OnCallSchedules|On-call schedule %{obstacle} in Project %{project}"
msgstr ""
msgid "OnCallSchedules|On-call schedules"
@@ -23431,22 +23735,22 @@ msgstr ""
msgid "OnDemandScans|Scanner profile"
msgstr ""
-msgid "OnDemandScans|Select one of the existing profiles"
+msgid "OnDemandScans|Schedule scan"
msgstr ""
-msgid "OnDemandScans|Site profile"
+msgid "OnDemandScans|Select one of the existing profiles"
msgstr ""
-msgid "OnDemandScans|Use existing scanner profile"
+msgid "OnDemandScans|Site profile"
msgstr ""
-msgid "OnDemandScans|Use existing site profile"
+msgid "OnDemandScans|Start time"
msgstr ""
-msgid "OnDemandScans|You can either choose a passive scan or validate the target site in your chosen site profile. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
+msgid "OnDemandScans|Use existing scanner profile"
msgstr ""
-msgid "OnDemandScans|You cannot run an active scan against an unvalidated site."
+msgid "OnDemandScans|Use existing site profile"
msgstr ""
msgid "OnDemandScans|You must create a repository within your project to run an on-demand scan."
@@ -23511,6 +23815,9 @@ msgstr ""
msgid "Only admins can delete project"
msgstr ""
+msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
+msgstr ""
+
msgid "Only include features new to your current subscription tier."
msgstr ""
@@ -23529,6 +23836,12 @@ msgstr ""
msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
+msgid "Only reCAPTCHA v2 is supported:"
+msgstr ""
+
+msgid "Only users from the specified IP address ranges are able to reach this group, including all subgroups, projects, and Git repositories."
+msgstr ""
+
msgid "Only verified users with an email address in any of these domains can be added to the group."
msgstr ""
@@ -23715,9 +24028,6 @@ msgstr ""
msgid "Package Registry"
msgstr ""
-msgid "Package Registry Rate Limits"
-msgstr ""
-
msgid "Package Registry: authenticated API requests"
msgstr ""
@@ -23736,6 +24046,9 @@ msgstr ""
msgid "Package recipe already exists"
msgstr ""
+msgid "Package registry rate limits"
+msgstr ""
+
msgid "Package type"
msgstr ""
@@ -23802,6 +24115,9 @@ msgstr ""
msgid "PackageRegistry|Composer"
msgstr ""
+msgid "PackageRegistry|Composer.json with license: %{license} and version: %{version}"
+msgstr ""
+
msgid "PackageRegistry|Conan"
msgstr ""
@@ -23865,6 +24181,9 @@ msgstr ""
msgid "PackageRegistry|Copy require package include"
msgstr ""
+msgid "PackageRegistry|Copy target SHA"
+msgstr ""
+
msgid "PackageRegistry|Copy yarn command"
msgstr ""
@@ -23931,6 +24250,9 @@ msgstr ""
msgid "PackageRegistry|Install package version"
msgstr ""
+msgid "PackageRegistry|Instance-level"
+msgstr ""
+
msgid "PackageRegistry|Invalid Package: failed metadata extraction"
msgstr ""
@@ -23976,6 +24298,9 @@ msgstr ""
msgid "PackageRegistry|Pip Command"
msgstr ""
+msgid "PackageRegistry|Project-level"
+msgstr ""
+
msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
msgstr ""
@@ -23997,6 +24322,9 @@ msgstr ""
msgid "PackageRegistry|Remove package"
msgstr ""
+msgid "PackageRegistry|Required Python: %{pythonVersion}"
+msgstr ""
+
msgid "PackageRegistry|RubyGems"
msgstr ""
@@ -24039,6 +24367,9 @@ msgstr ""
msgid "PackageRegistry|Source project located at %{link}"
msgstr ""
+msgid "PackageRegistry|Target SHA: %{sha}"
+msgstr ""
+
msgid "PackageRegistry|There are no other versions of this package."
msgstr ""
@@ -24207,6 +24538,18 @@ msgstr ""
msgid "Password was successfully updated. Please sign in again."
msgstr ""
+msgid "PasswordPrompt|Confirm password"
+msgstr ""
+
+msgid "PasswordPrompt|Confirm password to continue"
+msgstr ""
+
+msgid "PasswordPrompt|Password is required"
+msgstr ""
+
+msgid "PasswordPrompt|Please enter your password to confirm"
+msgstr ""
+
msgid "Passwords should be unique and not used for any other sites or services."
msgstr ""
@@ -24234,6 +24577,9 @@ msgstr ""
msgid "Paste project path (i.e. gitlab-org/gitlab)"
msgstr ""
+msgid "Paste this DSN into your Sentry SDK"
+msgstr ""
+
msgid "Paste your public SSH key, which is usually contained in the file '~/.ssh/id_ed25519.pub' or '~/.ssh/id_rsa.pub' and begins with 'ssh-ed25519' or 'ssh-rsa'. Do not paste your private SSH key, as that can compromise your identity."
msgstr ""
@@ -24318,6 +24664,9 @@ msgstr ""
msgid "PerformanceBar|First Contentful Paint"
msgstr ""
+msgid "PerformanceBar|Flamegraph with mode:"
+msgstr ""
+
msgid "PerformanceBar|Frontend resources"
msgstr ""
@@ -24351,6 +24700,15 @@ msgstr ""
msgid "PerformanceBar|Trace"
msgstr ""
+msgid "PerformanceBar|cpu"
+msgstr ""
+
+msgid "PerformanceBar|object"
+msgstr ""
+
+msgid "PerformanceBar|wall"
+msgstr ""
+
msgid "Period in seconds"
msgstr ""
@@ -24579,6 +24937,48 @@ msgstr ""
msgid "PipelineSchedules|Variables"
msgstr ""
+msgid "PipelineSource|API"
+msgstr ""
+
+msgid "PipelineSource|Chat"
+msgstr ""
+
+msgid "PipelineSource|External"
+msgstr ""
+
+msgid "PipelineSource|External Pull Request"
+msgstr ""
+
+msgid "PipelineSource|Merge Request"
+msgstr ""
+
+msgid "PipelineSource|On-Demand DAST Scan"
+msgstr ""
+
+msgid "PipelineSource|On-Demand DAST Validation"
+msgstr ""
+
+msgid "PipelineSource|Parent Pipeline"
+msgstr ""
+
+msgid "PipelineSource|Pipeline"
+msgstr ""
+
+msgid "PipelineSource|Push"
+msgstr ""
+
+msgid "PipelineSource|Schedule"
+msgstr ""
+
+msgid "PipelineSource|Trigger"
+msgstr ""
+
+msgid "PipelineSource|Web"
+msgstr ""
+
+msgid "PipelineSource|Web IDE"
+msgstr ""
+
msgid "PipelineStatusTooltip|Pipeline: %{ciStatus}"
msgstr ""
@@ -24879,46 +25279,7 @@ msgstr ""
msgid "Pipeline|Source"
msgstr ""
-msgid "Pipeline|Source|API"
-msgstr ""
-
-msgid "Pipeline|Source|Chat"
-msgstr ""
-
-msgid "Pipeline|Source|External"
-msgstr ""
-
-msgid "Pipeline|Source|External Pull Request"
-msgstr ""
-
-msgid "Pipeline|Source|Merge Request"
-msgstr ""
-
-msgid "Pipeline|Source|On-Demand DAST Scan"
-msgstr ""
-
-msgid "Pipeline|Source|On-Demand DAST Validation"
-msgstr ""
-
-msgid "Pipeline|Source|Parent Pipeline"
-msgstr ""
-
-msgid "Pipeline|Source|Pipeline"
-msgstr ""
-
-msgid "Pipeline|Source|Push"
-msgstr ""
-
-msgid "Pipeline|Source|Schedule"
-msgstr ""
-
-msgid "Pipeline|Source|Trigger"
-msgstr ""
-
-msgid "Pipeline|Source|Web"
-msgstr ""
-
-msgid "Pipeline|Source|Web IDE"
+msgid "Pipeline|Source|Security Policy"
msgstr ""
msgid "Pipeline|Specify variable values to be used in this run. The values specified in %{linkStart}CI/CD settings%{linkEnd} will be used by default."
@@ -24969,7 +25330,7 @@ msgstr ""
msgid "Pipeline|We are currently unable to fetch pipeline data"
msgstr ""
-msgid "Pipeline|You’re about to stop pipeline %{pipelineId}."
+msgid "Pipeline|You’re about to stop pipeline #%{pipelineId}."
msgstr ""
msgid "Pipeline|for"
@@ -24996,6 +25357,9 @@ msgstr ""
msgid "Plain diff"
msgstr ""
+msgid "Plain-text response to send to clients that hit a rate limit"
+msgstr ""
+
msgid "Plan:"
msgstr ""
@@ -25140,9 +25504,6 @@ msgstr ""
msgid "Please provide attributes to update"
msgstr ""
-msgid "Please provide your username or email address."
-msgstr ""
-
msgid "Please reach out if you have any questions and we'll be happy to assist."
msgstr ""
@@ -25185,9 +25546,6 @@ msgstr ""
msgid "Please set a new password before proceeding."
msgstr ""
-msgid "Please share your feedback about %{featureName} %{linkStart}in this issue%{linkEnd} to help us improve the experience."
-msgstr ""
-
msgid "Please solve the captcha"
msgstr ""
@@ -25365,6 +25723,9 @@ msgstr ""
msgid "Prevent adding new members to project membership within this group"
msgstr ""
+msgid "Prevent auto-stopping"
+msgstr ""
+
msgid "Prevent editing approval rules in projects and merge requests."
msgstr ""
@@ -25377,7 +25738,7 @@ msgstr ""
msgid "Prevent users from changing their profile name"
msgstr ""
-msgid "Prevent users from performing write operations on GitLab while performing maintenance."
+msgid "Prevent users from performing write operations while GitLab maintenance is in progress."
msgstr ""
msgid "Preview"
@@ -25650,6 +26011,9 @@ msgstr ""
msgid "Profiles|Enter your name, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Enter your password to confirm the email change"
+msgstr ""
+
msgid "Profiles|Enter your pronouns to let people know how to refer to you"
msgstr ""
@@ -25884,10 +26248,10 @@ msgstr ""
msgid "Profiles|e.g. My MacBook key"
msgstr ""
-msgid "Profiles|username"
+msgid "Profiles|https://website.com"
msgstr ""
-msgid "Profiles|website.com"
+msgid "Profiles|username"
msgstr ""
msgid "Profiles|your account"
@@ -26130,9 +26494,21 @@ msgstr ""
msgid "ProjectSelect| or group"
msgstr ""
+msgid "ProjectSelect|No matching results"
+msgstr ""
+
msgid "ProjectSelect|Search for project"
msgstr ""
+msgid "ProjectSelect|Search projects"
+msgstr ""
+
+msgid "ProjectSelect|Select a project"
+msgstr ""
+
+msgid "ProjectSelect|There was an error fetching the projects. Please try again."
+msgstr ""
+
msgid "ProjectService|Drone server URL"
msgstr ""
@@ -26220,6 +26596,9 @@ msgstr ""
msgid "ProjectService|Trigger event when a new, unique alert is recorded."
msgstr ""
+msgid "ProjectService|Trigger event when a new, unique vulnerability is recorded. (Note: This feature requires an Ultimate plan.)"
+msgstr ""
+
msgid "ProjectService|Trigger event when a pipeline status changes."
msgstr ""
@@ -26634,9 +27013,15 @@ msgstr ""
msgid "Projects are graded based on the highest severity vulnerability present"
msgstr ""
+msgid "Projects are organized into groups"
+msgstr ""
+
msgid "Projects contributed to"
msgstr ""
+msgid "Projects help you organize your work. They contain your file repository, issues, merge requests, and so much more."
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr ""
@@ -26871,10 +27256,10 @@ msgstr ""
msgid "PrometheusService|Prometheus cluster integration"
msgstr ""
-msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
+msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
msgstr ""
-msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
+msgid "PrometheusService|The ID of the IAP-secured resource."
msgstr ""
msgid "PrometheusService|The Prometheus API base URL."
@@ -27492,6 +27877,9 @@ msgstr ""
msgid "Rate limit"
msgstr ""
+msgid "Rate limits can help reduce request volume (like from crawlers or abusive bots)."
+msgstr ""
+
msgid "Raw blob request rate limit per minute"
msgstr ""
@@ -27504,6 +27892,9 @@ msgstr ""
msgid "Re-authentication required"
msgstr ""
+msgid "Re-import"
+msgstr ""
+
msgid "Re-request review"
msgstr ""
@@ -27525,6 +27916,9 @@ msgstr ""
msgid "Read more about related issues"
msgstr ""
+msgid "Read their documentation."
+msgstr ""
+
msgid "Ready to get started with GitLab? Follow these steps to set up your workspace, plan and commit changes, and deploy your project."
msgstr ""
@@ -27558,6 +27952,9 @@ msgstr ""
msgid "Receive any notifications from GitLab."
msgstr ""
+msgid "Receive notification of abuse reports by email."
+msgstr ""
+
msgid "Receive notifications about your own activity"
msgstr ""
@@ -27701,9 +28098,6 @@ msgstr ""
msgid "Registry setup"
msgstr ""
-msgid "Regulate approvals by authors/committers. Affects all projects."
-msgstr ""
-
msgid "Reindexing Status: %{status} (Slice multiplier: %{multiplier}, Maximum running slices: %{max_slices})"
msgstr ""
@@ -27799,6 +28193,9 @@ msgstr ""
msgid "Release|Something went wrong while saving the release details."
msgstr ""
+msgid "Reload page"
+msgstr ""
+
msgid "Remediations"
msgstr ""
@@ -28081,6 +28478,9 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
+msgid "Repeats"
+msgstr ""
+
msgid "Replace"
msgstr ""
@@ -28443,10 +28843,7 @@ msgstr ""
msgid "Require additional authentication for administrative tasks."
msgstr ""
-msgid "Require all users in this group to setup Two-factor authentication"
-msgstr ""
-
-msgid "Require all users in this group to setup two-factor authentication"
+msgid "Require all users in this group to set up two-factor authentication"
msgstr ""
msgid "Required approvals (%{approvals_given} given)"
@@ -28492,6 +28889,9 @@ msgstr[1] ""
msgid "Requires values to meet regular expression requirements."
msgstr ""
+msgid "Requires you to deploy or set up cloud-hosted Sentry."
+msgstr ""
+
msgid "Requires your primary GitLab email address."
msgstr ""
@@ -28552,9 +28952,6 @@ msgstr ""
msgid "Resolve"
msgstr ""
-msgid "Resolve all threads in new issue"
-msgstr ""
-
msgid "Resolve conflicts"
msgstr ""
@@ -28612,6 +29009,9 @@ msgstr ""
msgid "Response text"
msgstr ""
+msgid "Restart GitLab to apply changes."
+msgstr ""
+
msgid "Restart Terminal"
msgstr ""
@@ -28630,6 +29030,9 @@ msgstr ""
msgid "Restoring the project will prevent the project from being removed on this date and restore people's ability to make changes to it."
msgstr ""
+msgid "Restrict group access by IP address. %{link_start}Learn more%{link_end}."
+msgstr ""
+
msgid "Restrict membership by email domain"
msgstr ""
@@ -28943,6 +29346,9 @@ msgstr ""
msgid "Runners|Runner #%{runner_id}"
msgstr ""
+msgid "Runners|Runner assigned to project."
+msgstr ""
+
msgid "Runners|Runner is offline, last contact was %{runner_contact} ago"
msgstr ""
@@ -28955,6 +29361,9 @@ msgstr ""
msgid "Runners|Runner registration"
msgstr ""
+msgid "Runners|Runner unassigned from project."
+msgstr ""
+
msgid "Runners|Runners"
msgstr ""
@@ -29147,7 +29556,7 @@ msgstr ""
msgid "SastEntryPoints|How do I set up SAST?"
msgstr ""
-msgid "SastEntryPoints|Learn more."
+msgid "SastEntryPoints|Learn more"
msgstr ""
msgid "Satisfied"
@@ -29189,7 +29598,7 @@ msgstr ""
msgid "Save pipeline schedule"
msgstr ""
-msgid "Save space and find images in the container Registry. remove unneeded tags and keep only the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
+msgid "Save storage space by automatically deleting tags from the container registry and keeping the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
msgstr ""
msgid "Saving"
@@ -29363,6 +29772,9 @@ msgstr ""
msgid "Search or filter results…"
msgstr ""
+msgid "Search or jump to..."
+msgstr ""
+
msgid "Search project"
msgstr ""
@@ -29423,16 +29835,16 @@ msgstr ""
msgid "SearchCodeResults|of %{link_to_project}"
msgstr ""
-msgid "SearchResults|Showing %{count} %{scope} for%{term_element}"
+msgid "SearchResults|Showing %{count} %{scope} for %{term_element}"
msgstr ""
-msgid "SearchResults|Showing %{count} %{scope} for%{term_element} in your personal and project snippets"
+msgid "SearchResults|Showing %{count} %{scope} for %{term_element} in your personal and project snippets"
msgstr ""
-msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for%{term_element}"
+msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for %{term_element}"
msgstr ""
-msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for%{term_element} in your personal and project snippets"
+msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for %{term_element} in your personal and project snippets"
msgstr ""
msgid "SearchResults|code result"
@@ -29514,6 +29926,9 @@ msgstr ""
msgid "Secret Detection"
msgstr ""
+msgid "Secret access key"
+msgstr ""
+
msgid "Secret token"
msgstr ""
@@ -29553,9 +29968,6 @@ msgstr ""
msgid "SecurityApprovals|A merge request approval is required when the license compliance report contains a denied license."
msgstr ""
-msgid "SecurityApprovals|Configurable if security scanners are enabled. %{linkStart}Learn more.%{linkEnd}"
-msgstr ""
-
msgid "SecurityApprovals|Coverage-Check"
msgstr ""
@@ -29568,24 +29980,18 @@ msgstr ""
msgid "SecurityApprovals|Learn more about Vulnerability-Check"
msgstr ""
-msgid "SecurityApprovals|License Scanning must be enabled. %{linkStart}Learn more%{linkEnd}."
-msgstr ""
-
msgid "SecurityApprovals|License-Check"
msgstr ""
msgid "SecurityApprovals|Requires approval for Denied licenses. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}More information%{linkEnd}"
+msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "SecurityApprovals|Requires approval for vulnerabilities. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
-msgid "SecurityApprovals|Test coverage must be enabled. %{linkStart}Learn more%{linkEnd}."
-msgstr ""
-
msgid "SecurityApprovals|Vulnerability-Check"
msgstr ""
@@ -29649,6 +30055,12 @@ msgstr ""
msgid "SecurityConfiguration|Immediately begin risk analysis and remediation with application security features. Start with SAST and Secret Detection, available to all plans. Upgrade to Ultimate to get all features, including:"
msgstr ""
+msgid "SecurityConfiguration|Manage corpus"
+msgstr ""
+
+msgid "SecurityConfiguration|Manage corpus files used as mutation sources in coverage fuzzing."
+msgstr ""
+
msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
msgstr ""
@@ -29703,6 +30115,12 @@ msgstr ""
msgid "SecurityOrchestration|Action"
msgstr ""
+msgid "SecurityOrchestration|Actions"
+msgstr ""
+
+msgid "SecurityOrchestration|Add rule"
+msgstr ""
+
msgid "SecurityOrchestration|All policies"
msgstr ""
@@ -29736,9 +30154,6 @@ msgstr ""
msgid "SecurityOrchestration|Network"
msgstr ""
-msgid "SecurityOrchestration|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
-msgstr ""
-
msgid "SecurityOrchestration|New policy"
msgstr ""
@@ -29754,6 +30169,9 @@ msgstr ""
msgid "SecurityOrchestration|Policy editor"
msgstr ""
+msgid "SecurityOrchestration|Policy preview"
+msgstr ""
+
msgid "SecurityOrchestration|Policy status"
msgstr ""
@@ -29763,6 +30181,9 @@ msgstr ""
msgid "SecurityOrchestration|Rule"
msgstr ""
+msgid "SecurityOrchestration|Rules"
+msgstr ""
+
msgid "SecurityOrchestration|Scan Execution"
msgstr ""
@@ -29856,6 +30277,9 @@ msgstr ""
msgid "SecurityReports|Create issue"
msgstr ""
+msgid "SecurityReports|Development vulnerabilities"
+msgstr ""
+
msgid "SecurityReports|Dismiss vulnerability"
msgstr ""
@@ -29871,6 +30295,9 @@ msgstr ""
msgid "SecurityReports|Download results"
msgstr ""
+msgid "SecurityReports|Download scanned URLs"
+msgstr ""
+
msgid "SecurityReports|Download scanned resources"
msgstr ""
@@ -29994,6 +30421,9 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
+msgid "SecurityReports|The Vulnerability Report shows the results of the lastest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "SecurityReports|The security reports below contain one or more vulnerability findings that could not be parsed and were not recorded. Download the artifacts in the job output to investigate. Ensure any security report created conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
msgstr ""
@@ -30135,10 +30565,10 @@ msgstr ""
msgid "Select a repository"
msgstr ""
-msgid "Select a role"
+msgid "Select a repository containing templates for common files."
msgstr ""
-msgid "Select a shared template repository for all projects on this instance."
+msgid "Select a role"
msgstr ""
msgid "Select a template repository"
@@ -30216,6 +30646,9 @@ msgstr ""
msgid "Select project to choose zone"
msgstr ""
+msgid "Select project to create issue"
+msgstr ""
+
msgid "Select projects"
msgstr ""
@@ -30333,6 +30766,9 @@ msgstr ""
msgid "Send emails to help guide new users through the onboarding process."
msgstr ""
+msgid "Send emails to users upon account deactivation."
+msgstr ""
+
msgid "Send message"
msgstr ""
@@ -30351,6 +30787,9 @@ msgstr ""
msgid "Send service data"
msgstr ""
+msgid "Sentry"
+msgstr ""
+
msgid "Sentry API URL"
msgstr ""
@@ -30465,6 +30904,9 @@ msgstr ""
msgid "Service"
msgstr ""
+msgid "Service Accounts keys are required to authorize GitLab to deploy your Google Cloud project."
+msgstr ""
+
msgid "Service Desk"
msgstr ""
@@ -30537,15 +30979,15 @@ msgstr ""
msgid "Set a password on your account to pull or push via %{protocol}."
msgstr ""
-msgid "Set a template repository for projects in this group"
-msgstr ""
-
msgid "Set access permissions for this token."
msgstr ""
msgid "Set an instance-wide domain that will be available to all clusters when installing Knative."
msgstr ""
+msgid "Set any rate limit to %{code_open}0%{code_close} to disable the limit."
+msgstr ""
+
msgid "Set default and restrict visibility levels. Configure import sources and git access protocol."
msgstr ""
@@ -30558,7 +31000,7 @@ msgstr ""
msgid "Set limit to 0 to allow any file size."
msgstr ""
-msgid "Set max session time for web terminal."
+msgid "Set limits for web and API requests."
msgstr ""
msgid "Set milestone"
@@ -30567,15 +31009,18 @@ msgstr ""
msgid "Set new password"
msgstr ""
-msgid "Set notification email for abuse reports."
+msgid "Set parent epic to an epic"
msgstr ""
-msgid "Set parent epic to an epic"
+msgid "Set per-user rate limits for imports and exports of projects and groups."
msgstr ""
msgid "Set projects and maximum size limits, session duration, user options, and check feature availability for namespace plan."
msgstr ""
+msgid "Set rate limits for package registry API requests that supersede the general user and IP rate limits."
+msgstr ""
+
msgid "Set severity"
msgstr ""
@@ -30594,15 +31039,24 @@ msgstr ""
msgid "Set the default branch for this project. All merge requests and commits are made against this branch unless you specify a different one."
msgstr ""
+msgid "Set the default expiration time for job artifacts in all projects. Set to %{code_open}0%{code_close} to never expire artifacts by default. If no unit is written, it defaults to seconds. For example, these are all equivalent: %{code_open}3600%{code_close}, %{code_open}60 minutes%{code_close}, or %{code_open}one hour%{code_close}."
+msgstr ""
+
msgid "Set the due date to %{due_date}."
msgstr ""
msgid "Set the iteration to %{iteration_reference}."
msgstr ""
+msgid "Set the maximum session time for a web terminal."
+msgstr ""
+
msgid "Set the milestone to %{milestone_reference}."
msgstr ""
+msgid "Set the per-user rate limit for notes created by web or API requests."
+msgstr ""
+
msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
msgstr ""
@@ -30804,6 +31258,9 @@ msgstr ""
msgid "Show Pipeline IID"
msgstr ""
+msgid "Show all %{issuable_type}."
+msgstr ""
+
msgid "Show all activity"
msgstr ""
@@ -30855,15 +31312,9 @@ msgstr ""
msgid "Show list"
msgstr ""
-msgid "Show me advanced features"
-msgstr ""
-
msgid "Show me how to add a pipeline"
msgstr ""
-msgid "Show me the basics"
-msgstr ""
-
msgid "Show one file at a time"
msgstr ""
@@ -30904,15 +31355,15 @@ msgstr ""
msgid "Showing %{pageSize} of %{total} %{issuableType}"
msgstr ""
-msgid "Showing %{pageSize} of %{total} issues"
-msgstr ""
-
msgid "Showing all epics"
msgstr ""
msgid "Showing all issues"
msgstr ""
+msgid "Showing data for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
+msgstr ""
+
msgid "Showing data for workflow items created in this date range. Date range cannot exceed %{maxDateRange} days."
msgstr ""
@@ -30952,6 +31403,15 @@ msgstr ""
msgid "Sidebar|Weight"
msgstr ""
+msgid "Sidekiq job compression threshold (bytes)"
+msgstr ""
+
+msgid "Sidekiq job size limit (bytes)"
+msgstr ""
+
+msgid "Sidekiq job size limits"
+msgstr ""
+
msgid "Sign in"
msgstr ""
@@ -31072,6 +31532,9 @@ msgstr ""
msgid "Site profile not found for given parameters"
msgstr ""
+msgid "Sites"
+msgstr ""
+
msgid "Size"
msgstr ""
@@ -31102,19 +31565,22 @@ msgstr ""
msgid "SlackIntegration|Sends notifications about project events to Slack channels."
msgstr ""
-msgid "SlackService|2. Paste the %{strong_open}Token%{strong_close} into the field below"
+msgid "SlackService|1. %{slash_command_link_start}Add a slash command%{slash_command_link_end} in your Slack team using this information:"
msgstr ""
-msgid "SlackService|3. Select the %{strong_open}Active%{strong_close} checkbox, press %{strong_open}Save changes%{strong_close} and start using GitLab inside Slack!"
+msgid "SlackService|2. Paste the token from Slack in the %{strong_open}Token%{strong_close} field below."
msgstr ""
-msgid "SlackService|Fill in the word that works best for your team."
+msgid "SlackService|3. Select the %{strong_open}Active%{strong_close} checkbox, select %{strong_open}Save changes%{strong_close}, and start using slash commands in Slack!"
+msgstr ""
+
+msgid "SlackService|After setup, get a list of available Slack slash commands by entering"
msgstr ""
-msgid "SlackService|See list of available commands in Slack after setting up this service, by entering"
+msgid "SlackService|Fill in the word that works best for your team."
msgstr ""
-msgid "SlackService|This service allows users to perform common operations on this project by entering slash commands in Slack."
+msgid "SlackService|Perform common operations in this project by entering slash commands in Slack."
msgstr ""
msgid "Slice multiplier"
@@ -31180,7 +31646,7 @@ msgstr ""
msgid "Some child epics may be hidden due to applied filters"
msgstr ""
-msgid "Some common domains are not allowed. %{read_more_link}."
+msgid "Some common domains are not allowed. %{learn_more_link}."
msgstr ""
msgid "Some of the designs you tried uploading did not change:"
@@ -31264,9 +31730,6 @@ msgstr ""
msgid "Something went wrong while exporting requirements"
msgstr ""
-msgid "Something went wrong while fetching %{listType} list"
-msgstr ""
-
msgid "Something went wrong while fetching branches"
msgstr ""
@@ -31321,15 +31784,9 @@ msgstr ""
msgid "Something went wrong while merging this merge request. Please try again."
msgstr ""
-msgid "Something went wrong while moving issues."
-msgstr ""
-
msgid "Something went wrong while obtaining the Let's Encrypt certificate."
msgstr ""
-msgid "Something went wrong while performing the action."
-msgstr ""
-
msgid "Something went wrong while promoting the issue to an epic. Please try again."
msgstr ""
@@ -31657,7 +32114,10 @@ msgstr ""
msgid "SourcegraphPreferences|Uses a custom %{linkStart}Sourcegraph instance%{linkEnd}."
msgstr ""
-msgid "Spam Check API Key"
+msgid "Spam Check"
+msgstr ""
+
+msgid "Spam Check API key"
msgstr ""
msgid "Spam Logs"
@@ -31675,7 +32135,7 @@ msgstr ""
msgid "Specified URL cannot be used: \"%{reason}\""
msgstr ""
-msgid "Specify an e-mail address regex pattern to identify default internal users."
+msgid "Specify an email address regex pattern to identify default internal users."
msgstr ""
msgid "Speed up your pipelines with Needs relationships"
@@ -31930,7 +32390,7 @@ msgstr ""
msgid "StatusCheck|An error occurred fetching the status checks."
msgstr ""
-msgid "StatusCheck|Apply this status check to any branch or a specific protected branch."
+msgid "StatusCheck|Apply this status check to all branches or a specific protected branch."
msgstr ""
msgid "StatusCheck|Check for a status response in Merge Requests. Failures do not block merges. %{link_start}Learn more%{link_end}."
@@ -32269,6 +32729,9 @@ msgstr ""
msgid "Subscriptions"
msgstr ""
+msgid "Subscription|Your subscription for %{strong}%{namespace_name}%{strong_close} has expired and you are now on %{pricing_link_start}the GitLab Free tier%{pricing_link_end}. Don't worry, your data is safe. Get in touch with our support team (%{support_email}). They'll gladly help with your subscription renewal."
+msgstr ""
+
msgid "Subtracted"
msgstr ""
@@ -32497,6 +32960,9 @@ msgstr ""
msgid "SuperSonics|Plan"
msgstr ""
+msgid "SuperSonics|Please agree to the Subscription Agreement"
+msgstr ""
+
msgid "SuperSonics|Ready to get started? A GitLab plan is ideal for scaling organizations and for multi team usage."
msgstr ""
@@ -32527,6 +32993,9 @@ msgstr ""
msgid "SuperSonics|The activation code is not valid. Please make sure to copy it exactly from the Customers Portal or confirmation email. Learn more about %{linkStart}activating your subscription%{linkEnd}."
msgstr ""
+msgid "SuperSonics|The activation code should be a 24-character alphanumeric string"
+msgstr ""
+
msgid "SuperSonics|There is a connectivity issue."
msgstr ""
@@ -32569,9 +33038,15 @@ msgstr ""
msgid "SuperSonics|You do not have an active subscription"
msgstr ""
+msgid "SuperSonics|You have successfully added a license that activates on %{date}. Please see the subscription history table below for more details."
+msgstr ""
+
msgid "SuperSonics|You'll be charged for %{trueUpLinkStart}users over license%{trueUpLinkEnd} on a quarterly or annual basis, depending on the terms of your agreement."
msgstr ""
+msgid "SuperSonics|Your future dated license was successfully added"
+msgstr ""
+
msgid "SuperSonics|Your subscription"
msgstr ""
@@ -32824,7 +33299,7 @@ msgstr ""
msgid "Template to append to all Service Desk issues"
msgstr ""
-msgid "TemplateRepository|Select a repository to make its templates available to all projects. %{link_start}What should the repository contain?%{link_end} "
+msgid "TemplateRepository|Create common files more quickly, and standardize their format."
msgstr ""
msgid "Templates"
@@ -33030,7 +33505,7 @@ msgstr ""
msgid "TestCases|Search test cases"
msgstr ""
-msgid "TestCases|Something went wrong while adding test case to Todo."
+msgid "TestCases|Something went wrong while adding test case to a to-do item."
msgstr ""
msgid "TestCases|Something went wrong while creating a test case."
@@ -33042,7 +33517,7 @@ msgstr ""
msgid "TestCases|Something went wrong while fetching test cases list."
msgstr ""
-msgid "TestCases|Something went wrong while marking test case todo as done."
+msgid "TestCases|Something went wrong while marking test case to-do item as done."
msgstr ""
msgid "TestCases|Something went wrong while moving test case."
@@ -33162,7 +33637,7 @@ msgstr ""
msgid "Thanks for your purchase!"
msgstr ""
-msgid "That is ok, I do not want to renew"
+msgid "That's OK, I don't want to renew"
msgstr ""
msgid "That's it, well done!"
@@ -33185,7 +33660,7 @@ msgid_plural "The %{type} contains the following errors:"
msgstr[0] ""
msgstr[1] ""
-msgid "The API key used by GitLab for accessing the Spam Check service endpoint"
+msgid "The API key used by GitLab for accessing the Spam Check service endpoint."
msgstr ""
msgid "The GitLab subscription service (customers.gitlab.com) is currently experiencing an outage. You can monitor the status and get updates at %{linkStart}status.gitlab.com%{linkEnd}."
@@ -33224,9 +33699,6 @@ msgstr ""
msgid "The URL to use for connecting to Elasticsearch. Use a comma-separated list to support clustering (e.g., \"http://localhost:9200, http://localhost:9201\")."
msgstr ""
-msgid "The Vulnerability Report shows the results of the last successful pipeline run on the default branch."
-msgstr ""
-
msgid "The X509 Certificate to use when mutual TLS is required to communicate with the external authorization service. If left blank, the server certificate is still validated when accessing over HTTPS."
msgstr ""
@@ -33284,9 +33756,6 @@ msgstr ""
msgid "The default branch for this project has been changed. Please update your bookmarks."
msgstr ""
-msgid "The default expiration time for job artifacts. 0 for unlimited. The default unit is in seconds, but you can use other units, for example %{code_open}4 mins 2 sec%{code_close}, %{code_open}2h42min%{code_close}."
-msgstr ""
-
msgid "The dependency list details information about the components used within your project."
msgstr ""
@@ -33478,9 +33947,6 @@ msgstr ""
msgid "The merge conflicts for this merge request have already been resolved. Please return to the merge request."
msgstr ""
-msgid "The merge request can now be merged."
-msgstr ""
-
msgid "The metric must be one of %{metrics}."
msgstr ""
@@ -33856,7 +34322,7 @@ msgstr ""
msgid "There was a problem updating the keep latest artifacts setting."
msgstr ""
-msgid "There was an error %{message} todo."
+msgid "There was an error %{message} to-do item."
msgstr ""
msgid "There was an error adding a To Do."
@@ -33895,6 +34361,9 @@ msgstr ""
msgid "There was an error fetching projects"
msgstr ""
+msgid "There was an error fetching search autocomplete suggestions"
+msgstr ""
+
msgid "There was an error fetching stage total counts"
msgstr ""
@@ -34219,6 +34688,9 @@ msgstr ""
msgid "This field is required."
msgstr ""
+msgid "This form is disabled in preview"
+msgstr ""
+
msgid "This group"
msgstr ""
@@ -34240,9 +34712,6 @@ msgstr ""
msgid "This group is linked to a subscription"
msgstr ""
-msgid "This group, including all subgroups, projects and git repositories, will be reachable from only the specified IP address ranges."
-msgstr ""
-
msgid "This group, its subgroups and projects has been scheduled for removal on %{date}."
msgstr ""
@@ -34522,9 +34991,6 @@ msgstr ""
msgid "This user cannot be unlocked manually from GitLab"
msgstr ""
-msgid "This user does not have a pending request"
-msgstr ""
-
msgid "This user has an unconfirmed email address (%{email}). You may force a confirmation."
msgstr ""
@@ -34633,9 +35099,6 @@ msgstr ""
msgid "ThreatMonitoring|Packet Activity"
msgstr ""
-msgid "ThreatMonitoring|Policies"
-msgstr ""
-
msgid "ThreatMonitoring|Requests"
msgstr ""
@@ -34687,6 +35150,12 @@ msgstr ""
msgid "ThreatMonitoring|View documentation"
msgstr ""
+msgid "Threshold in bytes at which to compress Sidekiq job arguments."
+msgstr ""
+
+msgid "Threshold in bytes at which to reject Sidekiq jobs. Set this to 0 to if you don't want to limit Sidekiq jobs."
+msgstr ""
+
msgid "Throughput"
msgstr ""
@@ -34696,6 +35165,9 @@ msgstr ""
msgid "Time"
msgstr ""
+msgid "Time (in hours) that users are allowed to skip forced configuration of two-factor authentication."
+msgstr ""
+
msgid "Time Spent"
msgstr ""
@@ -34762,7 +35234,7 @@ msgstr ""
msgid "TimeTrackingEstimated|Est"
msgstr ""
-msgid "TimeTracking|%{startTag}Spent: %{endTag}%{timeSpentHumanReadable}"
+msgid "TimeTracking|%{spentStart}Spent: %{spentEnd}"
msgstr ""
msgid "TimeTracking|Estimated:"
@@ -34976,6 +35448,9 @@ msgstr ""
msgid "To access this domain create a new DNS record"
msgstr ""
+msgid "To add a custom suffix, set up a Service Desk email address. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "To add an SSH key you need to %{generate_link_start}generate one%{link_end} or use an %{existing_link_start}existing key%{link_end}."
msgstr ""
@@ -34997,13 +35472,16 @@ msgstr ""
msgid "To connect an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To continue using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
+msgstr ""
+
msgid "To continue, you need to select the link in the confirmation email we sent to verify your email address. If you didn't get our email, select %{strongStart}Resend confirmation email.%{strongEnd}"
msgstr ""
msgid "To define internal users, first enable new users set to external"
msgstr ""
-msgid "To enable Registration Features, make sure \"Enable service ping\" is checked."
+msgid "To enable Registration Features, first enable Service Ping."
msgstr ""
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
@@ -35030,7 +35508,7 @@ msgstr ""
msgid "To get started, use the link below to confirm your account."
msgstr ""
-msgid "To help improve GitLab and its user experience, GitLab will periodically collect usage information."
+msgid "To help improve GitLab and its user experience, GitLab periodically collects usage information."
msgstr ""
msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
@@ -35063,7 +35541,7 @@ msgstr ""
msgid "To preserve performance only %{strong_open}%{display_size} of %{real_size}%{strong_close} files are displayed."
msgstr ""
-msgid "To protect this issue's confidentiality, %{forkLink} and set the fork's visibility to private."
+msgid "To protect this issue's confidentiality, %{linkStart}fork this project%{linkEnd} and set the fork's visibility to private."
msgstr ""
msgid "To protect this issue's confidentiality, a private fork of this project was selected."
@@ -35096,12 +35574,15 @@ msgstr ""
msgid "To set up SAML authentication for your group through an identity provider like Azure, Okta, Onelogin, Ping Identity, or your custom SAML 2.0 provider:"
msgstr ""
-msgid "To set up this service:"
+msgid "To set up this integration:"
msgstr ""
msgid "To specify the notification level per project of a group you belong to, you need to visit project page and change notification level there."
msgstr ""
+msgid "To start using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
+msgstr ""
+
msgid "To unsubscribe from this issue, please paste the following link into your browser:"
msgstr ""
@@ -35689,9 +36170,6 @@ msgstr ""
msgid "Unable to fetch branches list, please close the form and try again"
msgstr ""
-msgid "Unable to fetch unscanned projects"
-msgstr ""
-
msgid "Unable to fetch vulnerable projects"
msgstr ""
@@ -35746,6 +36224,15 @@ msgstr ""
msgid "Unable to update this issue at this time."
msgstr ""
+msgid "Unapprove a merge request"
+msgstr ""
+
+msgid "Unapprove the current merge request."
+msgstr ""
+
+msgid "Unapproved the current merge request."
+msgstr ""
+
msgid "Unarchive project"
msgstr ""
@@ -35758,16 +36245,13 @@ msgstr ""
msgid "Unassigned"
msgstr ""
-msgid "Unauthenticated API request rate limit"
-msgstr ""
-
-msgid "Unauthenticated rate limit period in seconds"
+msgid "Unauthenticated API rate limit period in seconds"
msgstr ""
-msgid "Unauthenticated request rate limit"
+msgid "Unauthenticated requests"
msgstr ""
-msgid "Unauthenticated requests"
+msgid "Unauthenticated web rate limit period in seconds"
msgstr ""
msgid "Undo"
@@ -35869,18 +36353,6 @@ msgstr ""
msgid "Unresolved"
msgstr ""
-msgid "UnscannedProjects|15 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|30 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|5 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|60 or more days"
-msgstr ""
-
msgid "Unschedule job"
msgstr ""
@@ -36100,6 +36572,9 @@ msgstr ""
msgid "UsageQuota|%{help_link_start}Shared runners%{help_link_end} are disabled, so there are no limits set on pipeline usage"
msgstr ""
+msgid "UsageQuota|%{linkTitle} help link"
+msgstr ""
+
msgid "UsageQuota|%{percentageLeft} of purchased storage is available"
msgstr ""
@@ -36109,6 +36584,9 @@ msgstr ""
msgid "UsageQuota|Artifacts is a sum of build and pipeline artifacts."
msgstr ""
+msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
+msgstr ""
+
msgid "UsageQuota|Buy additional minutes"
msgstr ""
@@ -36118,9 +36596,21 @@ msgstr ""
msgid "UsageQuota|CI minutes usage by project"
msgstr ""
+msgid "UsageQuota|Code packages and container images."
+msgstr ""
+
msgid "UsageQuota|Current period usage"
msgstr ""
+msgid "UsageQuota|File attachments and smaller design graphics."
+msgstr ""
+
+msgid "UsageQuota|Git repository, managed by the Gitaly service."
+msgstr ""
+
+msgid "UsageQuota|Includes project registry, artifacts, packages, wiki, uploads and other items."
+msgstr ""
+
msgid "UsageQuota|Increase storage temporarily"
msgstr ""
@@ -36139,6 +36629,9 @@ msgstr ""
msgid "UsageQuota|Packages"
msgstr ""
+msgid "UsageQuota|Pipeline artifacts and job artifacts, created with CI/CD."
+msgstr ""
+
msgid "UsageQuota|Pipelines"
msgstr ""
@@ -36157,6 +36650,9 @@ msgstr ""
msgid "UsageQuota|Seats"
msgstr ""
+msgid "UsageQuota|Shared bits of code and text."
+msgstr ""
+
msgid "UsageQuota|Snippets"
msgstr ""
@@ -36166,6 +36662,12 @@ msgstr ""
msgid "UsageQuota|Storage"
msgstr ""
+msgid "UsageQuota|Storage type"
+msgstr ""
+
+msgid "UsageQuota|There is a known issue with Artifact storage where the total could be incorrect for some projects. More details and progress are available in %{warningLinkStart}the epic%{warningLinkEnd}."
+msgstr ""
+
msgid "UsageQuota|This is the total amount of storage used across your projects within this namespace."
msgstr ""
@@ -36205,6 +36707,9 @@ msgstr ""
msgid "UsageQuota|Usage"
msgstr ""
+msgid "UsageQuota|Usage Breakdown"
+msgstr ""
+
msgid "UsageQuota|Usage Quotas"
msgstr ""
@@ -36229,6 +36734,9 @@ msgstr ""
msgid "UsageQuota|Wiki"
msgstr ""
+msgid "UsageQuota|Wiki content."
+msgstr ""
+
msgid "UsageQuota|Wikis"
msgstr ""
@@ -36445,7 +36953,10 @@ msgstr ""
msgid "User Settings"
msgstr ""
-msgid "User and IP Rate Limits"
+msgid "User and IP rate limits"
+msgstr ""
+
+msgid "User does not have a pending request"
msgstr ""
msgid "User identity was successfully created."
@@ -36742,6 +37253,9 @@ msgstr ""
msgid "Users can launch a development environment from a GitLab browser tab when the %{linkStart}Gitpod%{linkEnd} integration is enabled."
msgstr ""
+msgid "Users can reactivate their account by signing in."
+msgstr ""
+
msgid "Users can render diagrams in AsciiDoc, Markdown, reStructuredText, and Textile documents using Kroki."
msgstr ""
@@ -36757,6 +37271,9 @@ msgstr ""
msgid "Users requesting access to"
msgstr ""
+msgid "Users to exclude from the rate limit"
+msgstr ""
+
msgid "Users were successfully added."
msgstr ""
@@ -36778,6 +37295,9 @@ msgstr ""
msgid "UsersSelect|Unassigned"
msgstr ""
+msgid "Uses GitLab as a lightweight alternative to Sentry."
+msgstr ""
+
msgid "Using %{code_start}::%{code_end} denotes a %{link_start}scoped label set%{link_end}"
msgstr ""
@@ -36808,10 +37328,7 @@ msgstr ""
msgid "Value Stream Analytics can help you determine your team’s velocity"
msgstr ""
-msgid "Value Stream Analytics gives an overview of how much time it takes to go from idea to production in your project."
-msgstr ""
-
-msgid "Value may contain a variable reference"
+msgid "Value might contain a variable reference"
msgstr ""
msgid "Value stream"
@@ -36877,10 +37394,10 @@ msgstr ""
msgid "ValueStream|The Default Value Stream cannot be deleted"
msgstr ""
-msgid "Variable"
+msgid "Values that contain the %{codeStart}$%{codeEnd} character can be considered a variable reference and expanded. %{docsLinkStart}Learn more.%{docsLinkEnd}"
msgstr ""
-msgid "Variable references indicated by %{codeStart}$%{codeEnd} may be expanded. If this is not what you want, consider %{docsLinkStart}using a workaround to prevent expansion%{docsLinkEnd}."
+msgid "Variable"
msgstr ""
msgid "Variable will be masked in job logs."
@@ -37285,6 +37802,9 @@ msgstr ""
msgid "Vulnerability|Evidence"
msgstr ""
+msgid "Vulnerability|False positive detected"
+msgstr ""
+
msgid "Vulnerability|File"
msgstr ""
@@ -37327,6 +37847,9 @@ msgstr ""
msgid "Vulnerability|Status"
msgstr ""
+msgid "Vulnerability|The scanner determined this vulnerability to be a false positive. Verify the evaluation before changing its status. %{linkStart}Learn more about false positive detection.%{linkEnd}"
+msgstr ""
+
msgid "Vulnerability|The unmodified response is the original response that had no mutations done to the request"
msgstr ""
@@ -37651,9 +38174,6 @@ msgstr ""
msgid "Welcome to GitLab,%{br_tag}%{name}!"
msgstr ""
-msgid "Welcome to the guided GitLab tour"
-msgstr ""
-
msgid "Welcome, %{name}!"
msgstr ""
@@ -37672,9 +38192,6 @@ msgstr ""
msgid "What are you searching for?"
msgstr ""
-msgid "What describes you best?"
-msgstr ""
-
msgid "What does this command do?"
msgstr ""
@@ -37696,13 +38213,13 @@ msgstr ""
msgid "What is your job title? (optional)"
msgstr ""
-msgid "What will you use this group for?"
+msgid "What templates can I create?"
msgstr ""
-msgid "What's new"
+msgid "What will you use this group for?"
msgstr ""
-msgid "What’s your experience level?"
+msgid "What's new"
msgstr ""
msgid "When a deployment job is successful, skip older deployment jobs that are still pending."
@@ -37714,6 +38231,9 @@ msgstr ""
msgid "When an event in GitLab triggers a webhook, you can use the request details to figure out if something went wrong."
msgstr ""
+msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+msgstr ""
+
msgid "When inactive, an external authentication provider must be used."
msgstr ""
@@ -37737,6 +38257,9 @@ msgstr ""
msgid "When:"
msgstr ""
+msgid "Which API requests are affected?"
+msgstr ""
+
msgid "While it's rare to have no vulnerabilities, it can happen. In any event, we ask that you please double check your settings to make sure you've set up your dashboard correctly."
msgstr ""
@@ -38016,6 +38539,9 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|Work Items"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -38091,6 +38617,9 @@ msgstr ""
msgid "You are already a member of this %{member_source}."
msgstr ""
+msgid "You are already impersonating another user"
+msgstr ""
+
msgid "You are an admin, which means granting access to %{client_name} will allow them to interact with GitLab as an admin as well. Proceed with caution."
msgstr ""
@@ -38193,6 +38722,9 @@ msgstr ""
msgid "You can also use project access tokens with Git to authenticate over HTTP(S). %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "You can always change your URL later"
+msgstr ""
+
msgid "You can always edit this later"
msgstr ""
@@ -38349,10 +38881,10 @@ msgstr ""
msgid "You can’t %{tag_start}edit%{tag_end} files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
-msgid "You could not create a new trigger."
+msgid "You can’t edit files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
-msgid "You didn't renew your subscription for %{strong}%{namespace_name}%{strong_close} so it was downgraded to the free plan."
+msgid "You could not create a new trigger."
msgstr ""
msgid "You do not have any subscriptions yet"
@@ -38520,6 +39052,12 @@ msgstr ""
msgid "You must provide your current password in order to change it."
msgstr ""
+msgid "You must sign in to search for specific projects."
+msgstr ""
+
+msgid "You must sign in to search for specific terms."
+msgstr ""
+
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
@@ -38547,6 +39085,9 @@ msgstr ""
msgid "You need to upload a GitLab project export archive (ending in .gz)."
msgstr ""
+msgid "You need to verify your primary email first before enabling Two-Factor Authentication."
+msgstr ""
+
msgid "You successfully declined the invitation"
msgstr ""
@@ -38655,10 +39196,10 @@ msgstr ""
msgid "Your %{host} account was signed in to from a new location"
msgstr ""
-msgid "Your %{strong}%{plan_name}%{strong_close} subscription for %{strong}%{namespace_name}%{strong_close} will expire on %{strong}%{expires_on}%{strong_close}."
+msgid "Your %{strong}%{plan_name}%{strong_close} subscription expires on %{strong}%{expires_on}%{strong_close}. After that date, you cannot create issues or merge requests, or use many other features."
msgstr ""
-msgid "Your %{strong}%{plan_name}%{strong_close} subscription will expire on %{strong}%{expires_on}%{strong_close}. After that, you will not be able to create issues or merge requests as well as many other features."
+msgid "Your %{strong}%{plan_name}%{strong_close} subscription for %{strong}%{namespace_name}%{strong_close} will expire on %{strong}%{expires_on}%{strong_close}."
msgstr ""
msgid "Your CI/CD configuration syntax is invalid. View Lint tab for more details."
@@ -38682,7 +39223,7 @@ msgstr ""
msgid "Your GPG keys (%{count})"
msgstr ""
-msgid "Your GitLab account has been locked due to an excessive amount of unsuccessful sign in attempts. Your account will automatically unlock in %{duration} or you may click the link below to unlock now."
+msgid "Your GitLab account has been locked due to an excessive number of unsuccessful sign in attempts. You can wait for your account to automatically unlock in %{duration} or you can click the link below to unlock now."
msgstr ""
msgid "Your GitLab account request has been approved!"
@@ -38793,6 +39334,9 @@ msgstr ""
msgid "Your commit email is used for web based operations, such as edits and merges."
msgstr ""
+msgid "Your current password is required to register a two-factor authenticator app."
+msgstr ""
+
msgid "Your dashboard has been copied. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
@@ -38892,6 +39436,9 @@ msgstr ""
msgid "Your project limit is %{limit} projects! Please contact your administrator to increase it"
msgstr ""
+msgid "Your project will be created at:"
+msgstr ""
+
msgid "Your projects"
msgstr ""
@@ -38931,11 +39478,10 @@ msgstr ""
msgid "Your subscription expired!"
msgstr ""
-msgid "Your subscription has been downgraded."
-msgstr ""
-
-msgid "Your subscription will expire in %{remaining_days}."
-msgstr ""
+msgid "Your subscription will expire in %{remaining_days} day."
+msgid_plural "Your subscription will expire in %{remaining_days} days."
+msgstr[0] ""
+msgstr[1] ""
msgid "Your username is %{username}."
msgstr ""
@@ -39142,6 +39688,9 @@ msgstr ""
msgid "cannot merge"
msgstr ""
+msgid "cannot not be used for user namespace"
+msgstr ""
+
msgid "ciReport|%{degradedNum} degraded"
msgstr ""
@@ -39465,6 +40014,9 @@ msgstr ""
msgid "created %{timeAgo}"
msgstr ""
+msgid "created %{timeAgo} by %{author}"
+msgstr ""
+
msgid "created by"
msgstr ""
@@ -39509,9 +40061,6 @@ msgstr ""
msgid "does not have a supported extension. Only %{extension_list} are supported"
msgstr ""
-msgid "domain is not authorized for sign-up."
-msgstr ""
-
msgid "download it"
msgstr ""
@@ -39529,18 +40078,13 @@ msgstr ""
msgid "email '%{email}' is not a verified email."
msgstr ""
-msgid "email does not match the allowed domain of %{email_domains}"
-msgid_plural "email does not match the allowed domains: %{email_domains}"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "enabled"
msgstr ""
msgid "encrypted: needs to be a :required, :optional or :migrating!"
msgstr ""
-msgid "ending with MIME type format is not allowed."
+msgid "ending with a reserved file extension is not allowed."
msgstr ""
msgid "entries cannot be larger than 255 characters"
@@ -39564,6 +40108,9 @@ msgstr ""
msgid "estimateCommand|%{slash_command} overwrites the total estimated time."
msgstr ""
+msgid "example.com"
+msgstr ""
+
msgid "exceeds the limit of %{bytes} bytes"
msgstr ""
@@ -39614,9 +40161,6 @@ msgstr ""
msgid "fork"
msgstr ""
-msgid "fork this project"
-msgstr ""
-
msgid "from"
msgstr ""
@@ -39625,6 +40169,9 @@ msgid_plural "from %d jobs"
msgstr[0] ""
msgstr[1] ""
+msgid "frontmatter"
+msgstr ""
+
msgid "group"
msgstr ""
@@ -39652,6 +40199,9 @@ msgstr ""
msgid "has been completed."
msgstr ""
+msgid "has too deep level of nesting"
+msgstr ""
+
msgid "help"
msgstr ""
@@ -39685,9 +40235,21 @@ msgstr ""
msgid "in"
msgstr ""
+msgid "in Infrastructure :: Kubernetes clusters"
+msgstr ""
+
+msgid "in all GitLab"
+msgstr ""
+
+msgid "in group"
+msgstr ""
+
msgid "in group %{link_to_group}"
msgstr ""
+msgid "in project"
+msgstr ""
+
msgid "in project %{link_to_project}"
msgstr ""
@@ -39729,16 +40291,19 @@ msgstr ""
msgid "is not a valid X509 certificate."
msgstr ""
-msgid "is not allowed since the group is not top-level group."
+msgid "is not allowed for sign-up."
msgstr ""
-msgid "is not allowed. Try again with a different email address, or contact your GitLab admin."
+msgid "is not allowed for this group."
msgstr ""
-msgid "is not allowed. We do not currently support project-level iterations"
+msgid "is not allowed for this project."
+msgstr ""
+
+msgid "is not allowed since the group is not top-level group."
msgstr ""
-msgid "is not from an allowed domain."
+msgid "is not allowed. We do not currently support project-level iterations"
msgstr ""
msgid "is not in the group enforcing Group Managed Account"
@@ -39831,6 +40396,9 @@ msgstr ""
msgid "log in"
msgstr ""
+msgid "managed"
+msgstr ""
+
msgid "manual"
msgstr ""
@@ -39878,6 +40446,9 @@ msgstr ""
msgid "mrWidget| Please restore it or use a different %{missingBranchName} branch"
msgstr ""
+msgid "mrWidget|%{linkStart}Set up now%{linkEnd} to analyze your source code for known security vulnerabilities."
+msgstr ""
+
msgid "mrWidget|%{mergeError}."
msgstr ""
@@ -39958,6 +40529,9 @@ msgid_plural "mrWidget|Closes issues"
msgstr[0] ""
msgstr[1] ""
+msgid "mrWidget|Create issue to resolve all threads"
+msgstr ""
+
msgid "mrWidget|Delete source branch"
msgstr ""
@@ -39967,12 +40541,18 @@ msgstr ""
msgid "mrWidget|Did not close"
msgstr ""
+msgid "mrWidget|Dismiss"
+msgstr ""
+
msgid "mrWidget|Email patches"
msgstr ""
msgid "mrWidget|Failed to load deployment statistics"
msgstr ""
+msgid "mrWidget|Hide %{widget} details"
+msgstr ""
+
msgid "mrWidget|If the %{missingBranchName} branch exists in your local repository, you can merge this merge request manually using the command line"
msgstr ""
@@ -40068,9 +40648,6 @@ msgstr ""
msgid "mrWidget|Request to merge"
msgstr ""
-msgid "mrWidget|Resolve all threads in new issue"
-msgstr ""
-
msgid "mrWidget|Resolve conflicts"
msgstr ""
@@ -40086,6 +40663,9 @@ msgstr ""
msgid "mrWidget|Revoke approval"
msgstr ""
+msgid "mrWidget|SAST and Secret Detection is not enabled."
+msgstr ""
+
msgid "mrWidget|Set by %{merge_author} to be added to the merge train when the pipeline succeeds"
msgstr ""
@@ -40095,6 +40675,9 @@ msgstr ""
msgid "mrWidget|Set by %{merge_author} to start a merge train when the pipeline succeeds"
msgstr ""
+msgid "mrWidget|Show %{widget} details"
+msgstr ""
+
msgid "mrWidget|The changes were merged into"
msgstr ""
@@ -40107,6 +40690,9 @@ msgstr ""
msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure, or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
msgstr ""
+msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure."
+msgstr ""
+
msgid "mrWidget|The source branch has been deleted"
msgstr ""
@@ -40149,6 +40735,9 @@ msgstr ""
msgid "mrWidget|You can merge after removing denied licenses"
msgstr ""
+msgid "mrWidget|You can only merge once this merge request is approved."
+msgstr ""
+
msgid "mrWidget|Your password"
msgstr ""
@@ -40185,6 +40774,9 @@ msgstr ""
msgid "must be less than the limit of %{tag_limit} tags"
msgstr ""
+msgid "must be set for a project namespace"
+msgstr ""
+
msgid "must be unique by status and elapsed time within a policy"
msgstr ""
@@ -40294,6 +40886,9 @@ msgstr ""
msgid "pipeline"
msgstr ""
+msgid "pipeline schedules documentation"
+msgstr ""
+
msgid "pod_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
msgstr ""
@@ -40343,16 +40938,25 @@ msgstr ""
msgid "project name"
msgstr ""
+msgid "project namespace cannot be the parent of another namespace"
+msgstr ""
+
msgid "projects"
msgstr ""
msgid "quick actions"
msgstr ""
-msgid "reCAPTCHA Private Key"
+msgid "reCAPTCHA"
+msgstr ""
+
+msgid "reCAPTCHA helps prevent credential stuffing."
msgstr ""
-msgid "reCAPTCHA Site Key"
+msgid "reCAPTCHA private key"
+msgstr ""
+
+msgid "reCAPTCHA site key"
msgstr ""
msgid "recent activity"
@@ -40579,6 +41183,9 @@ msgstr ""
msgid "user avatar"
msgstr ""
+msgid "user namespace cannot be the parent of another namespace"
+msgstr ""
+
msgid "user preferences"
msgstr ""
@@ -40671,3 +41278,9 @@ msgstr ""
msgid "your settings"
msgstr ""
+msgid "{group}"
+msgstr ""
+
+msgid "{project}"
+msgstr ""
+
diff --git a/locale/fi_FI/gitlab.po b/locale/fi_FI/gitlab.po
index 93b21bb317a..816b7fa6b1d 100644
--- a/locale/fi_FI/gitlab.po
+++ b/locale/fi_FI/gitlab.po
@@ -14,10 +14,7 @@ msgstr ""
"X-Crowdin-Language: fi\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-09-01 22:33\n"
-
-msgid " %{name}, confirm your email address now! "
-msgstr ""
+"PO-Revision-Date: 2021-10-04 20:21\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -92,6 +89,16 @@ msgstr ""
msgid "#general, #development"
msgstr ""
+msgid "%d Alert"
+msgid_plural "%d Alerts"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d Alert:"
+msgid_plural "%d Alerts:"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d Approval"
msgid_plural "%d Approvals"
msgstr[0] ""
@@ -455,7 +462,10 @@ msgstr ""
msgid "%{code_open}Protected:%{code_close} Only exposed to protected branches or tags."
msgstr ""
-msgid "%{commit_author_link} authored %{commit_timeago}"
+msgid "%{commit_author_link} authored %{commit_authored_timeago}"
+msgstr ""
+
+msgid "%{commit_author_link} authored %{commit_authored_timeago} and %{commit_committer_avatar} %{commit_committer_link} committed %{commit_committer_timeago}"
msgstr ""
msgid "%{completedCount} completed weight"
@@ -549,6 +559,15 @@ msgstr ""
msgid "%{doc_link_start}Advanced search%{doc_link_end} is enabled."
msgstr ""
+msgid "%{docs_link_start}Learn about visibility levels.%{docs_link_end}"
+msgstr ""
+
+msgid "%{docs_link_start}What is Large File Storage?%{docs_link_end}"
+msgstr ""
+
+msgid "%{docs_link_start}What is two-factor authentication?%{docs_link_end}"
+msgstr ""
+
msgid "%{due_date} (Past due)"
msgstr ""
@@ -621,9 +640,6 @@ msgstr ""
msgid "%{issueType} actions"
msgstr ""
-msgid "%{issuesCount} issues with a limit of %{maxIssueCount}"
-msgstr ""
-
msgid "%{issuesSize} with a limit of %{maxIssueCount}"
msgstr ""
@@ -681,6 +697,12 @@ msgstr ""
msgid "%{label_for_message} unavailable"
msgstr ""
+msgid "%{learn_more_link}."
+msgstr ""
+
+msgid "%{lessThan} 1 hour"
+msgstr ""
+
msgid "%{lets_encrypt_link_start}Let's Encrypt%{lets_encrypt_link_end} is a free, automated, and open certificate authority (CA) that issues digital certificates to enable HTTPS (SSL/TLS) for sites."
msgstr ""
@@ -693,15 +715,15 @@ msgstr ""
msgid "%{link_start}Learn more%{link_end} about roles."
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
-msgstr ""
-
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
msgstr ""
msgid "%{link_start}Start the title with %{draft_snippet}%{link_end} to prevent a merge request that is a work in progress from being merged before it's ready."
msgstr ""
+msgid "%{link_start}What information does GitLab Inc. collect?%{link_end}"
+msgstr ""
+
msgid "%{listToShow}, and %{awardsListLength} more"
msgstr ""
@@ -854,7 +876,7 @@ msgid_plural "%{securityScanner} results are not available because a pipeline ha
msgstr[0] ""
msgstr[1] ""
-msgid "%{service_ping_link_start}Learn more%{service_ping_link_end} about what information is shared with GitLab Inc."
+msgid "%{service_ping_link_start}What information is shared with GitLab Inc.?%{service_ping_link_end}"
msgstr ""
msgid "%{size} %{unit}"
@@ -890,6 +912,9 @@ msgstr ""
msgid "%{state} epics"
msgstr ""
+msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
+msgstr ""
+
msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
msgstr ""
@@ -949,11 +974,6 @@ msgstr ""
msgid "%{template_project_id} is unknown or invalid"
msgstr ""
-msgid "%{text} %{files}"
-msgid_plural "%{text} %{files} files"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%{text} is available"
msgstr ""
@@ -1038,9 +1058,6 @@ msgstr ""
msgid "%{wildcards_link_start}Wildcards%{wildcards_link_end} such as %{code_tag_start}v*%{code_tag_end} or %{code_tag_start}*-release%{code_tag_end} are supported."
msgstr ""
-msgid "&lt; 1 hour"
-msgstr ""
-
msgid "'%{data}' at %{location} does not match format: %{format}"
msgstr ""
@@ -1124,9 +1141,6 @@ msgstr ""
msgid "(we need your current password to confirm your changes)"
msgstr ""
-msgid "* * * * *"
-msgstr ""
-
msgid "+ %{amount} more"
msgstr ""
@@ -1193,10 +1207,10 @@ msgstr ""
msgid "."
msgstr ""
-msgid "0 bytes"
+msgid "/"
msgstr ""
-msgid "0 for unlimited, only effective with remote storage enabled."
+msgid "0 bytes"
msgstr ""
msgid "0t1DgySidms"
@@ -1326,6 +1340,9 @@ msgstr ""
msgid "1000+"
msgstr ""
+msgid "192.168.0.0/24"
+msgstr ""
+
msgid "1st contribution!"
msgstr ""
@@ -1479,9 +1496,6 @@ msgstr ""
msgid "A plain HTML site that uses Netlify for CI/CD instead of GitLab, but still with all the other great GitLab features"
msgstr ""
-msgid "A plain-text response to show to clients that hit the rate limit."
-msgstr ""
-
msgid "A platform value can be web, mob or app."
msgstr ""
@@ -1563,7 +1577,7 @@ msgstr ""
msgid "APIFuzzing|Configure HTTP basic authentication values. Other authentication methods are supported. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
+msgid "APIFuzzing|Customize your project's API fuzzing configuration options and copy the code snippet to your .gitlab-ci.yml file to apply any changes. Note that this tool does not reflect or update your .gitlab-ci.yml file automatically. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
msgstr ""
msgid "APIFuzzing|Enable authentication"
@@ -1626,9 +1640,6 @@ msgstr ""
msgid "APIFuzzing|To prevent a security leak, authentication info must be added as a %{ciVariablesLinkStart}CI variable%{ciVariablesLinkEnd}. As a user with maintainer access rights, you can manage CI variables in the %{ciSettingsLinkStart}Settings%{ciSettingsLinkEnd} area."
msgstr ""
-msgid "APIFuzzing|Use this tool to generate API fuzzing configuration YAML to copy into your .gitlab-ci.yml file. This tool does not reflect or update your .gitlab-ci.yml file automatically."
-msgstr ""
-
msgid "APIFuzzing|Username for basic authentication"
msgstr ""
@@ -1680,9 +1691,6 @@ msgstr ""
msgid "Abuse reports notification email"
msgstr ""
-msgid "Abuse reports will be sent to this address if it is set. Abuse reports are always available in the admin area."
-msgstr ""
-
msgid "Accept invitation"
msgstr ""
@@ -1719,12 +1727,18 @@ msgstr ""
msgid "Access granted"
msgstr ""
+msgid "Access key ID"
+msgstr ""
+
msgid "Access requests"
msgstr ""
msgid "Access to '%{classification_label}' not allowed"
msgstr ""
+msgid "Access tokens expire after 2 hours. A refresh token may be used at any time to generate a new access token. Non-expiring access tokens are deprecated. Clear this setting to enable backward compatibility."
+msgstr ""
+
msgid "AccessDropdown|Deploy Keys"
msgstr ""
@@ -2037,6 +2051,9 @@ msgstr ""
msgid "Add new directory"
msgstr ""
+msgid "Add new service account"
+msgstr ""
+
msgid "Add or remove previously merged commits"
msgstr ""
@@ -2274,6 +2291,9 @@ msgstr ""
msgid "AdminArea|Features"
msgstr ""
+msgid "AdminArea|Get security updates from GitLab and stay up to date"
+msgstr ""
+
msgid "AdminArea|Groups"
msgstr ""
@@ -2313,6 +2333,12 @@ msgstr ""
msgid "AdminArea|Reporter"
msgstr ""
+msgid "AdminArea|Sign up for the GitLab Security Newsletter to get notified for security updates."
+msgstr ""
+
+msgid "AdminArea|Sign up for the GitLab newsletter"
+msgstr ""
+
msgid "AdminArea|Stop all jobs"
msgstr ""
@@ -2382,9 +2408,15 @@ msgstr ""
msgid "AdminSettings|Disable public access to Pages sites"
msgstr ""
+msgid "AdminSettings|Display a banner on merge requests in projects with no pipelines to initiate steps to add a .gitlab-ci.yml file."
+msgstr ""
+
msgid "AdminSettings|Domain verification is an essential security measure for public GitLab sites. Users are required to demonstrate they control a domain before it is enabled. %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "AdminSettings|Enable pipeline suggestion banner"
+msgstr ""
+
msgid "AdminSettings|Enable shared runners for new projects"
msgstr ""
@@ -2856,10 +2888,10 @@ msgstr ""
msgid "Admin|Quarterly reconciliation will occur on %{qrtlyDate}"
msgstr ""
-msgid "Admin|The number of max seats used for your namespace is currently exceeding the number of seats in your subscription. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgid "Admin|The number of max seats in your namespace exceeds the number of seats in your subscription. On %{qrtlyDate}, quarterly reconciliation occurs and you are automatically billed a prorated amount for the overage. No action is needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice. For more information about the timing of the invoicing process, view the documentation."
msgstr ""
-msgid "Admin|The number of maximum users for your instance is currently exceeding the number of users in license. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgid "Admin|The number of max users in your instance exceeds the number of users in your license. On %{qrtlyDate}, quarterly reconciliation occurs and you are automatically billed a prorated amount for the overage. No action is needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice. For more information about the timing of the invoicing process, view the documentation."
msgstr ""
msgid "Admin|View pending user approvals"
@@ -2880,9 +2912,6 @@ msgstr ""
msgid "Advanced export options"
msgstr ""
-msgid "Advanced permissions, Large File Storage and Two-Factor authentication settings."
-msgstr ""
-
msgid "After a successful password update you will be redirected to login screen."
msgstr ""
@@ -2901,13 +2930,14 @@ msgstr ""
msgid "After you've reviewed these contribution guidelines, you'll be all set to"
msgstr ""
+msgid "Akismet"
+msgstr ""
+
msgid "Akismet API Key"
msgstr ""
-msgid "Alert"
-msgid_plural "Alerts"
-msgstr[0] ""
-msgstr[1] ""
+msgid "Akismet helps prevent the creation of spam issues in public projects."
+msgstr ""
msgid "AlertManagement|Acknowledged"
msgstr ""
@@ -3263,6 +3293,9 @@ msgstr ""
msgid "All (default)"
msgstr ""
+msgid "All GitLab"
+msgstr ""
+
msgid "All Members"
msgstr ""
@@ -3377,6 +3410,9 @@ msgstr ""
msgid "Allow this secondary node to replicate content on Object Storage"
msgstr ""
+msgid "Allow use of licensed EE features"
+msgstr ""
+
msgid "Allow users to dismiss the broadcast message"
msgstr ""
@@ -3452,9 +3488,6 @@ msgstr ""
msgid "Amazon authentication is not %{link_start}correctly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
-msgid "Amount of time (in hours) that users are allowed to skip forced configuration of two-factor authentication"
-msgstr ""
-
msgid "An %{link_start}alert%{link_end} with the same fingerprint is already open. To change the status of this alert, resolve the linked alert."
msgstr ""
@@ -3515,12 +3548,6 @@ msgstr ""
msgid "An error occurred when removing the label."
msgstr ""
-msgid "An error occurred when toggling the notification subscription"
-msgstr ""
-
-msgid "An error occurred when updating the issue weight"
-msgstr ""
-
msgid "An error occurred when updating the title"
msgstr ""
@@ -3569,6 +3596,9 @@ msgstr ""
msgid "An error occurred while enabling Service Desk."
msgstr ""
+msgid "An error occurred while fetching Markdown preview"
+msgstr ""
+
msgid "An error occurred while fetching ancestors"
msgstr ""
@@ -3599,9 +3629,6 @@ msgstr ""
msgid "An error occurred while fetching label colors."
msgstr ""
-msgid "An error occurred while fetching markdown preview"
-msgstr ""
-
msgid "An error occurred while fetching participants"
msgstr ""
@@ -3617,9 +3644,6 @@ msgstr ""
msgid "An error occurred while fetching reference"
msgstr ""
-msgid "An error occurred while fetching sidebar data"
-msgstr ""
-
msgid "An error occurred while fetching tags. Retry the search."
msgstr ""
@@ -3695,6 +3719,9 @@ msgstr ""
msgid "An error occurred while loading merge requests."
msgstr ""
+msgid "An error occurred while loading projects."
+msgstr ""
+
msgid "An error occurred while loading the Needs tab."
msgstr ""
@@ -3929,12 +3956,6 @@ msgstr ""
msgid "Any Milestone"
msgstr ""
-msgid "Any branch"
-msgstr ""
-
-msgid "Any eligible user"
-msgstr ""
-
msgid "Any encrypted tokens"
msgstr ""
@@ -3953,6 +3974,9 @@ msgstr ""
msgid "Any namespace"
msgstr ""
+msgid "App Engine description and apps that are suitable for this deployment target"
+msgstr ""
+
msgid "App ID"
msgstr ""
@@ -4101,6 +4125,11 @@ msgstr ""
msgid "Apply"
msgstr ""
+msgid "Apply %d suggestion"
+msgid_plural "Apply %d suggestions"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Apply a label"
msgstr ""
@@ -4110,13 +4139,10 @@ msgstr ""
msgid "Apply suggestion"
msgstr ""
-msgid "Apply suggestions"
-msgstr ""
-
msgid "Apply template"
msgstr ""
-msgid "Apply this approval rule to any branch or a specific protected branch."
+msgid "Apply this approval rule to all branches or a specific protected branch."
msgstr ""
msgid "Applying"
@@ -4259,9 +4285,6 @@ msgstr ""
msgid "ApprovalSettings|Prevent editing approval rules in projects and merge requests."
msgstr ""
-msgid "ApprovalSettings|Prevent editing approval rules in projects and merge requests. "
-msgstr ""
-
msgid "ApprovalSettings|Remove all approvals when commits are added to the source branch."
msgstr ""
@@ -4277,6 +4300,9 @@ msgstr ""
msgid "ApprovalSettings|This setting is configured at the instance level and can only be changed by an administrator."
msgstr ""
+msgid "ApprovalSettings|This setting is configured in %{groupName} and can only be changed by an administrator or group owner."
+msgstr ""
+
msgid "ApprovalStatusTooltip|Adheres to separation of duties"
msgstr ""
@@ -4763,9 +4789,6 @@ msgstr ""
msgid "Authenticated API rate limit period in seconds"
msgstr ""
-msgid "Authenticated API request rate limit"
-msgstr ""
-
msgid "Authenticated API requests"
msgstr ""
@@ -4775,10 +4798,10 @@ msgstr ""
msgid "Authenticated Git LFS request rate limit"
msgstr ""
-msgid "Authenticated web rate limit period in seconds"
+msgid "Authenticated Git LFS requests"
msgstr ""
-msgid "Authenticated web request rate limit"
+msgid "Authenticated web rate limit period in seconds"
msgstr ""
msgid "Authenticated web requests"
@@ -5156,9 +5179,6 @@ msgstr ""
msgid "Below you will find all the groups that are public."
msgstr ""
-msgid "Beta"
-msgstr ""
-
msgid "Bi-weekly code coverage"
msgstr ""
@@ -5398,6 +5418,21 @@ msgstr ""
msgid "Board scope affects which issues are displayed for anyone who visits this board"
msgstr ""
+msgid "BoardNewEpic|Groups"
+msgstr ""
+
+msgid "BoardNewEpic|Loading groups"
+msgstr ""
+
+msgid "BoardNewEpic|No matching results"
+msgstr ""
+
+msgid "BoardNewEpic|Search groups"
+msgstr ""
+
+msgid "BoardNewEpic|Select a group"
+msgstr ""
+
msgid "BoardNewIssue|No matching results"
msgstr ""
@@ -5475,6 +5510,9 @@ msgstr ""
msgid "Boards|An error occurred while creating the list. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching child groups. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching group projects. Please try again."
msgstr ""
@@ -5807,6 +5845,9 @@ msgstr ""
msgid "Bulk update"
msgstr ""
+msgid "BulkImports|Re-import creates a new group. It does not sync with the existing group."
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -5816,6 +5857,9 @@ msgstr ""
msgid "BulkImport|From source group"
msgstr ""
+msgid "BulkImport|Group import history"
+msgstr ""
+
msgid "BulkImport|Import failed: Destination cannot be a subgroup of the source group. Change the destination and try again."
msgstr ""
@@ -5828,9 +5872,18 @@ msgstr ""
msgid "BulkImport|Importing the group failed"
msgstr ""
+msgid "BulkImport|Last imported to %{link}"
+msgstr ""
+
msgid "BulkImport|Name already exists."
msgstr ""
+msgid "BulkImport|New group"
+msgstr ""
+
+msgid "BulkImport|No history is available"
+msgstr ""
+
msgid "BulkImport|No parent"
msgstr ""
@@ -5843,6 +5896,9 @@ msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} matching filter \"%{filter}\" from %{link}"
msgstr ""
+msgid "BulkImport|Source group"
+msgstr ""
+
msgid "BulkImport|To new group"
msgstr ""
@@ -5852,6 +5908,9 @@ msgstr ""
msgid "BulkImport|You have no groups to import"
msgstr ""
+msgid "BulkImport|Your imported groups will appear here."
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -6094,6 +6153,9 @@ msgstr ""
msgid "Can be manually deployed to"
msgstr ""
+msgid "Can be overridden in each project."
+msgstr ""
+
msgid "Can create groups:"
msgstr ""
@@ -6196,6 +6258,9 @@ msgstr ""
msgid "Cancelling Preview"
msgstr ""
+msgid "Cannot assign a confidential epic to a non-confidential issue. Make the issue confidential and try again"
+msgstr ""
+
msgid "Cannot be assigned to other projects."
msgstr ""
@@ -6247,9 +6312,6 @@ msgstr ""
msgid "Cannot refer to a group %{timebox_type} by an internal id!"
msgstr ""
-msgid "Cannot set confidential epic for a non-confidential issue"
-msgstr ""
-
msgid "Cannot show preview. For previews on sketch files, they must have the file format introduced by Sketch version 43 and above."
msgstr ""
@@ -6487,15 +6549,15 @@ msgstr ""
msgid "Check out, review, and merge locally"
msgstr ""
-msgid "Check the %{docs_link_start}documentation%{docs_link_end}."
-msgstr ""
-
msgid "Check the current instance configuration "
msgstr ""
msgid "Check the elasticsearch.log file to debug why the migration was halted and make any changes before retrying the migration. When you fix the cause of the failure, click \"Retry migration\", and the migration will be scheduled to be retried in the background."
msgstr ""
+msgid "Check with your administrator."
+msgstr ""
+
msgid "Check your Docker images for known vulnerabilities."
msgstr ""
@@ -6526,6 +6588,9 @@ msgstr ""
msgid "Checkout"
msgstr ""
+msgid "Checkout|$%{selectedPlanPrice} per 10 GB storage per pack"
+msgstr ""
+
msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 minutes"
msgstr ""
@@ -6546,17 +6611,23 @@ msgstr ""
msgid "Checkout|%{name}'s GitLab subscription"
msgstr ""
-msgid "Checkout|%{selectedPlanText} plan"
+msgid "Checkout|%{name}'s storage subscription"
msgstr ""
-msgid "Checkout|%{startDate} - %{endDate}"
+msgid "Checkout|%{quantity} GB of storage"
msgstr ""
-msgid "Checkout|%{totalCiMinutes} CI minute"
-msgid_plural "Checkout|%{totalCiMinutes} CI minutes"
+msgid "Checkout|%{quantity} storage pack"
+msgid_plural "Checkout|%{quantity} storage packs"
msgstr[0] ""
msgstr[1] ""
+msgid "Checkout|%{selectedPlanText} plan"
+msgstr ""
+
+msgid "Checkout|%{startDate} - %{endDate}"
+msgstr ""
+
msgid "Checkout|%{totalCiMinutes} CI minutes"
msgstr ""
@@ -6632,6 +6703,9 @@ msgstr ""
msgid "Checkout|Failed to register credit card. Please try again."
msgstr ""
+msgid "Checkout|GB"
+msgstr ""
+
msgid "Checkout|GitLab group"
msgstr ""
@@ -6668,6 +6742,9 @@ msgstr ""
msgid "Checkout|State"
msgstr ""
+msgid "Checkout|Storage packs"
+msgstr ""
+
msgid "Checkout|Street address"
msgstr ""
@@ -6689,6 +6766,9 @@ msgstr ""
msgid "Checkout|Total minutes: %{quantity}"
msgstr ""
+msgid "Checkout|Total storage: %{quantity} GB"
+msgstr ""
+
msgid "Checkout|Users"
msgstr ""
@@ -6698,16 +6778,25 @@ msgstr ""
msgid "Checkout|Your organization"
msgstr ""
+msgid "Checkout|Your storage subscription has the same term as your main subscription, and the price is prorated accordingly."
+msgstr ""
+
msgid "Checkout|Your subscription will be applied to this group"
msgstr ""
msgid "Checkout|Zip code"
msgstr ""
+msgid "Checkout|a storage subscription"
+msgstr ""
+
msgid "Checkout|company or team"
msgstr ""
-msgid "Checkout|x 1,000 minutes per pack = %{strong}"
+msgid "Checkout|minutes"
+msgstr ""
+
+msgid "Checkout|x %{quantity} %{units} per pack ="
msgstr ""
msgid "Cherry-pick this commit"
@@ -7064,6 +7153,9 @@ msgstr ""
msgid "CloneIssue|Cannot clone issue to target project as it is pending deletion."
msgstr ""
+msgid "CloneIssue|Cannot clone issues of '%{issue_type}' type."
+msgstr ""
+
msgid "Cloned this issue to %{path_to_project}."
msgstr ""
@@ -7118,7 +7210,10 @@ msgstr ""
msgid "Closes this %{quick_action_target}."
msgstr ""
-msgid "Cloud licenses can not be removed."
+msgid "Cloud Functions description and apps that are suitable for this deployment target"
+msgstr ""
+
+msgid "Cloud Run description and apps that are suitable for this deployment target"
msgstr ""
msgid "Cluster"
@@ -7145,6 +7240,12 @@ msgstr ""
msgid "ClusterAgents|Access tokens"
msgstr ""
+msgid "ClusterAgents|Agent might not be connected to GitLab"
+msgstr ""
+
+msgid "ClusterAgents|Agent never connected to GitLab"
+msgstr ""
+
msgid "ClusterAgents|Alternative installation methods"
msgstr ""
@@ -7160,6 +7261,12 @@ msgstr ""
msgid "ClusterAgents|Configuration"
msgstr ""
+msgid "ClusterAgents|Connected"
+msgstr ""
+
+msgid "ClusterAgents|Connection status"
+msgstr ""
+
msgid "ClusterAgents|Copy token"
msgstr ""
@@ -7178,6 +7285,9 @@ msgstr ""
msgid "ClusterAgents|For alternative installation methods %{linkStart}go to the documentation%{linkEnd}."
msgstr ""
+msgid "ClusterAgents|For more troubleshooting information go to"
+msgstr ""
+
msgid "ClusterAgents|Go to the repository"
msgstr ""
@@ -7193,18 +7303,30 @@ msgstr ""
msgid "ClusterAgents|Integrate with the GitLab Agent"
msgstr ""
-msgid "ClusterAgents|Last used"
+msgid "ClusterAgents|Last connected %{timeAgo}."
+msgstr ""
+
+msgid "ClusterAgents|Last contact"
msgstr ""
msgid "ClusterAgents|Learn how to create an agent access token"
msgstr ""
+msgid "ClusterAgents|Make sure you are using a valid token."
+msgstr ""
+
msgid "ClusterAgents|Name"
msgstr ""
msgid "ClusterAgents|Never"
msgstr ""
+msgid "ClusterAgents|Never connected"
+msgstr ""
+
+msgid "ClusterAgents|Not connected"
+msgstr ""
+
msgid "ClusterAgents|Read more about getting started"
msgstr ""
@@ -7226,6 +7348,9 @@ msgstr ""
msgid "ClusterAgents|Select which Agent you want to install"
msgstr ""
+msgid "ClusterAgents|The Agent has not been connected in a long time. There might be a connectivity issue. Last contact was %{timeAgo}."
+msgstr ""
+
msgid "ClusterAgents|The GitLab Agent also requires %{linkStart}enabling the Agent Server%{linkEnd}"
msgstr ""
@@ -7253,9 +7378,6 @@ msgstr ""
msgid "ClusterAgents|You will need to create a token to connect to your agent"
msgstr ""
-msgid "ClusterAgent|This feature is only available for premium plans"
-msgstr ""
-
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -7445,9 +7567,6 @@ msgstr ""
msgid "ClusterIntegration|Create Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Create a provision role on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the account and external ID above. %{startMoreInfoLink}More information%{endLink}"
-msgstr ""
-
msgid "ClusterIntegration|Create cluster on"
msgstr ""
@@ -7880,7 +7999,7 @@ msgstr ""
msgid "ClusterIntegration|Subnets"
msgstr ""
-msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provisioned role, first create one on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the above account and external IDs. %{startMoreInfoLink}More information%{endLink}"
+msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provisioned role, first create one on %{awsLinkStart}Amazon Web Services %{awsLinkEnd} using the above account and external IDs. %{moreInfoStart}More information%{moreInfoEnd}"
msgstr ""
msgid "ClusterIntegration|The Kubernetes certificate used to authenticate to the cluster."
@@ -8114,6 +8233,9 @@ msgstr ""
msgid "Collapse replies"
msgstr ""
+msgid "Collapse settings section"
+msgstr ""
+
msgid "Collapse sidebar"
msgstr ""
@@ -8132,6 +8254,9 @@ msgstr ""
msgid "Comma-separated list of email addresses."
msgstr ""
+msgid "Comma-separated list of users allowed to exceed the rate limit."
+msgstr ""
+
msgid "Comma-separated, e.g. '1.1.1.1, 2.2.2.0/24'"
msgstr ""
@@ -8452,6 +8577,9 @@ msgstr ""
msgid "Configure %{repository_checks_link_start}repository checks%{link_end} and %{housekeeping_link_start}housekeeping%{link_end} on repositories."
msgstr ""
+msgid "Configure CAPTCHAs, IP address limits, and other anti-spam measures."
+msgstr ""
+
msgid "Configure Dependency Scanning in `.gitlab-ci.yml` using the GitLab managed template. You can [add variable overrides](https://docs.gitlab.com/ee/user/application_security/dependency_scanning/#customizing-the-dependency-scanning-settings) to customize Dependency Scanning settings."
msgstr ""
@@ -8488,16 +8616,13 @@ msgstr ""
msgid "Configure a %{codeStart}.gitlab-webide.yml%{codeEnd} file in the %{codeStart}.gitlab%{codeEnd} directory to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
msgstr ""
-msgid "Configure existing installation"
-msgstr ""
-
-msgid "Configure limit for notes created per minute by web and API requests."
+msgid "Configure advanced permissions, Large File Storage, and two-factor authentication settings."
msgstr ""
-msgid "Configure limits for Project/Group Import/Export."
+msgid "Configure approvals by authors and committers on all projects."
msgstr ""
-msgid "Configure limits for web and API requests."
+msgid "Configure existing installation"
msgstr ""
msgid "Configure paths to be protected by Rack Attack."
@@ -8512,10 +8637,13 @@ msgstr ""
msgid "Configure settings for Advanced Search with Elasticsearch."
msgstr ""
+msgid "Configure specific limits for Files API requests that supersede the general user and IP rate limits."
+msgstr ""
+
msgid "Configure specific limits for Git LFS requests that supersede the general user and IP rate limits."
msgstr ""
-msgid "Configure specific limits for Packages API requests that supersede the general user and IP rate limits."
+msgid "Configure specific limits for deprecated API requests that supersede the general user and IP rate limits."
msgstr ""
msgid "Configure the %{link} integration."
@@ -8527,6 +8655,9 @@ msgstr ""
msgid "Configure the way a user creates a new account."
msgstr ""
+msgid "Configure via Merge Request"
+msgstr ""
+
msgid "Configure which lists are shown for anyone who visits this board"
msgstr ""
@@ -8995,6 +9126,9 @@ msgstr ""
msgid "Content parsed with %{link}."
msgstr ""
+msgid "ContentEditor|Table of Contents"
+msgstr ""
+
msgid "ContentEditor|You have to provide a renderMarkdown function or a custom serializer"
msgstr ""
@@ -9181,6 +9315,9 @@ msgstr ""
msgid "Copy link to chart"
msgstr ""
+msgid "Copy prefix"
+msgstr ""
+
msgid "Copy reference"
msgstr ""
@@ -9211,6 +9348,9 @@ msgstr ""
msgid "Copy value"
msgstr ""
+msgid "Corpus Management"
+msgstr ""
+
msgid "Corpus Management|Are you sure you want to delete the corpus?"
msgstr ""
@@ -9439,6 +9579,9 @@ msgstr ""
msgid "Create commit"
msgstr ""
+msgid "Create common files more quickly, and standardize their format."
+msgstr ""
+
msgid "Create confidential merge request"
msgstr ""
@@ -9472,6 +9615,9 @@ msgstr ""
msgid "Create issue"
msgstr ""
+msgid "Create issue to resolve all threads"
+msgstr ""
+
msgid "Create iteration"
msgstr ""
@@ -9526,6 +9672,9 @@ msgstr ""
msgid "Create new..."
msgstr ""
+msgid "Create or import your first project"
+msgstr ""
+
msgid "Create project"
msgstr ""
@@ -9883,7 +10032,7 @@ msgstr ""
msgid "Custom notification events"
msgstr ""
-msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notificationLinkStart} notification emails%{notificationLinkEnd}."
+msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notificationLinkStart}notification emails%{notificationLinkEnd}."
msgstr ""
msgid "Custom project templates"
@@ -10082,10 +10231,10 @@ msgid_plural "CycleAnalytics|Showing %{subjectFilterText} and %{selectedLabelsCo
msgstr[0] ""
msgstr[1] ""
-msgid "CycleAnalytics|Showing data for group '%{groupName}' and %{selectedProjectCount} projects from %{startDate} to %{endDate}"
+msgid "CycleAnalytics|Showing data for group '%{groupName}' and %{selectedProjectCount} projects from %{createdAfter} to %{createdBefore}"
msgstr ""
-msgid "CycleAnalytics|Showing data for group '%{groupName}' from %{startDate} to %{endDate}"
+msgid "CycleAnalytics|Showing data for group '%{groupName}' from %{createdAfter} to %{createdBefore}"
msgstr ""
msgid "CycleAnalytics|Stages"
@@ -10319,6 +10468,9 @@ msgstr ""
msgid "DastProfiles|Manage profiles"
msgstr ""
+msgid "DastProfiles|Manage site profiles"
+msgstr ""
+
msgid "DastProfiles|Minimum = 0 (no timeout enabled), Maximum = 2880 minutes"
msgstr ""
@@ -10394,6 +10546,9 @@ msgstr ""
msgid "DastProfiles|Scanner name"
msgstr ""
+msgid "DastProfiles|Schedule"
+msgstr ""
+
msgid "DastProfiles|Select branch"
msgstr ""
@@ -10463,7 +10618,7 @@ msgstr ""
msgid "DastProfiles|Website"
msgstr ""
-msgid "DastProfiles|You can either choose a passive scan or validate the target site in your chosen site profile. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
+msgid "DastProfiles|You can either choose a passive scan or validate the target site from the site profile management page. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
msgstr ""
msgid "DastProfiles|You cannot run an active scan against an unvalidated site."
@@ -10636,7 +10791,7 @@ msgstr ""
msgid "Days to merge"
msgstr ""
-msgid "Deactivate dormant users after 90 days of inactivity. Users can return to active status by signing in to their account. While inactive, a user is not counted as an active user in the instance."
+msgid "Deactivate dormant users after 90 days of inactivity"
msgstr ""
msgid "Dear Administrator,"
@@ -10723,10 +10878,10 @@ msgstr ""
msgid "Define a custom pattern with cron syntax"
msgstr ""
-msgid "Define approval settings."
+msgid "Define approval rules."
msgstr ""
-msgid "Define approval settings. %{linkStart}Learn more.%{linkEnd}"
+msgid "Define approval rules. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "Define custom rules for what constitutes spam, independent of Akismet"
@@ -10735,7 +10890,7 @@ msgstr ""
msgid "Define environments in the deploy stage(s) in %{code_open}.gitlab-ci.yml%{code_close} to track deployments here."
msgstr ""
-msgid "Define how approval rules are applied as a merge request moves toward completion."
+msgid "Define how approval rules are applied to merge requests."
msgstr ""
msgid "Definition"
@@ -10750,6 +10905,12 @@ msgstr ""
msgid "DelayedJobs|Are you sure you want to run %{job_name} immediately? This job will run automatically after it's timer finishes."
msgstr ""
+msgid "DelayedJobs|Are you sure you want to run %{job_name} immediately? This job will run automatically after its timer finishes."
+msgstr ""
+
+msgid "DelayedJobs|Run the delayed job now?"
+msgstr ""
+
msgid "DelayedJobs|Start now"
msgstr ""
@@ -11026,6 +11187,12 @@ msgstr ""
msgid "Dependency proxy image prefix"
msgstr ""
+msgid "DependencyProxy|Create a local proxy for storing frequently used upstream images. %{docLinkStart}Learn more%{docLinkEnd} about dependency proxies."
+msgstr ""
+
+msgid "DependencyProxy|Dependency Proxy"
+msgstr ""
+
msgid "DependencyProxy|Toggle Dependency Proxy"
msgstr ""
@@ -11266,6 +11433,9 @@ msgstr ""
msgid "Deployments"
msgstr ""
+msgid "Deployments to Google Kubernetes Engine can be "
+msgstr ""
+
msgid "Deployments|%{deployments} environment impacted."
msgid_plural "Deployments|%{deployments} environments impacted."
msgstr[0] ""
@@ -11295,6 +11465,9 @@ msgstr ""
msgid "Deployment|success"
msgstr ""
+msgid "Deprecated API rate limits"
+msgstr ""
+
msgid "Deprioritize label"
msgstr ""
@@ -11697,6 +11870,16 @@ msgstr ""
msgid "DiffsCompareBaseBranch|(base)"
msgstr ""
+msgid "Diffs|%d addition"
+msgid_plural "Diffs|%d additions"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Diffs|%d deletion"
+msgid_plural "Diffs|%d deletions"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Diffs|No file name available"
msgstr ""
@@ -11706,9 +11889,17 @@ msgstr ""
msgid "Diffs|Show all unchanged lines"
msgstr ""
+msgid "Diffs|Showing %{dropdownStart}%{count} changed file%{dropdownEnd}"
+msgid_plural "Diffs|Showing %{dropdownStart}%{count} changed files%{dropdownEnd}"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Diffs|Something went wrong while fetching diff lines."
msgstr ""
+msgid "Diffs|with %{additions} and %{deletions}"
+msgstr ""
+
msgid "Direct member"
msgstr ""
@@ -11834,9 +12025,6 @@ msgid_plural "Dismiss %d selected vulnerabilities as"
msgstr[0] ""
msgstr[1] ""
-msgid "Dismiss Value Stream Analytics introduction box"
-msgstr ""
-
msgid "Dismiss merge request promotion"
msgstr ""
@@ -12158,6 +12346,9 @@ msgstr ""
msgid "Edit issues"
msgstr ""
+msgid "Edit merge requests"
+msgstr ""
+
msgid "Edit public deploy key"
msgstr ""
@@ -12233,6 +12424,9 @@ msgstr ""
msgid "Elastic|None. Select projects to index."
msgstr ""
+msgid "Eligible users"
+msgstr ""
+
msgid "Email"
msgstr ""
@@ -12362,6 +12556,9 @@ msgstr ""
msgid "Enable"
msgstr ""
+msgid "Enable Amazon EKS integration"
+msgstr ""
+
msgid "Enable Auto DevOps"
msgstr ""
@@ -12395,6 +12592,9 @@ msgstr ""
msgid "Enable SSL verification"
msgstr ""
+msgid "Enable Service Ping"
+msgstr ""
+
msgid "Enable Snowplow tracking"
msgstr ""
@@ -12425,6 +12625,9 @@ msgstr ""
msgid "Enable authenticated Git LFS request rate limit"
msgstr ""
+msgid "Enable authenticated web request rate limit"
+msgstr ""
+
msgid "Enable authentication"
msgstr ""
@@ -12485,7 +12688,7 @@ msgstr ""
msgid "Enable or disable the Pseudonymizer data collection."
msgstr ""
-msgid "Enable or disable version check and service ping."
+msgid "Enable or disable version check and Service Ping."
msgstr ""
msgid "Enable protected paths rate limit"
@@ -12497,18 +12700,12 @@ msgstr ""
msgid "Enable reCAPTCHA"
msgstr ""
-msgid "Enable reCAPTCHA for login"
-msgstr ""
-
-msgid "Enable reCAPTCHA, Invisible Captcha, Akismet and set IP limits. For reCAPTCHA, we currently only support %{recaptcha_v2_link_start}v2%{recaptcha_v2_link_end}"
+msgid "Enable reCAPTCHA for login."
msgstr ""
msgid "Enable repository checks"
msgstr ""
-msgid "Enable service ping"
-msgstr ""
-
msgid "Enable shared runners for all projects and subgroups in this group."
msgstr ""
@@ -12530,7 +12727,10 @@ msgstr ""
msgid "Enable unauthenticated API request rate limit"
msgstr ""
-msgid "Enable unauthenticated request rate limit"
+msgid "Enable unauthenticated web request rate limit"
+msgstr ""
+
+msgid "Enable user deactivation emails"
msgstr ""
msgid "Enable version check"
@@ -12566,9 +12766,6 @@ msgstr ""
msgid "Enabled sources for code import during project creation. OmniAuth must be configured for GitHub"
msgstr ""
-msgid "Enabling this will only make licensed EE features available to projects if the project namespace's plan includes the feature or if the project is public."
-msgstr ""
-
msgid "Encountered an error while rendering: %{err}"
msgstr ""
@@ -12617,9 +12814,6 @@ msgstr ""
msgid "Enter Admin Mode"
msgstr ""
-msgid "Enter IP address range"
-msgstr ""
-
msgid "Enter a number"
msgstr ""
@@ -12632,9 +12826,6 @@ msgstr ""
msgid "Enter at least three characters to search"
msgstr ""
-msgid "Enter domain"
-msgstr ""
-
msgid "Enter in your Bitbucket Server URL and personal access token below"
msgstr ""
@@ -12821,9 +13012,6 @@ msgstr ""
msgid "Environments|Deployment %{status}"
msgstr ""
-msgid "Environments|Dismiss"
-msgstr ""
-
msgid "Environments|Enable review app"
msgstr ""
@@ -12836,9 +13024,6 @@ msgstr ""
msgid "Environments|Environments are places where code gets deployed, such as staging or production."
msgstr ""
-msgid "Environments|Help us improve environments"
-msgstr ""
-
msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
msgstr ""
@@ -12875,6 +13060,9 @@ msgstr ""
msgid "Environments|Note that this action will stop the environment, but it will %{emphasisStart}not%{emphasisEnd} have an effect on any existing deployment due to no “stop environment action†being defined in the %{ciConfigLinkStart}.gitlab-ci.yml%{ciConfigLinkEnd} file."
msgstr ""
+msgid "Environments|Open"
+msgstr ""
+
msgid "Environments|Open live environment"
msgstr ""
@@ -12914,9 +13102,6 @@ msgstr ""
msgid "Environments|Stopping %{environmentName}"
msgstr ""
-msgid "Environments|Take the survey"
-msgstr ""
-
msgid "Environments|There was an error fetching the logs. Please try again."
msgstr ""
@@ -12938,9 +13123,6 @@ msgstr ""
msgid "Environments|You don't have any environments right now"
msgstr ""
-msgid "Environments|Your feedback helps GitLab make environments better for you and other users. Participate and enter a sweepstake to win a USD 30 gift card."
-msgstr ""
-
msgid "Environments|by %{avatar}"
msgstr ""
@@ -13223,7 +13405,7 @@ msgstr ""
msgid "Error parsing CSV file. Please make sure it has"
msgstr ""
-msgid "Error rendering markdown preview"
+msgid "Error rendering Markdown preview"
msgstr ""
msgid "Error saving label update."
@@ -13271,6 +13453,9 @@ msgstr ""
msgid "Error: %{error_message}"
msgstr ""
+msgid "Error: Couldn't load some or all of the changes."
+msgstr ""
+
msgid "Error: No AWS credentials were supplied"
msgstr ""
@@ -13304,6 +13489,9 @@ msgstr ""
msgid "ErrorTracking|Enable error tracking"
msgstr ""
+msgid "ErrorTracking|Error tracking backend"
+msgstr ""
+
msgid "ErrorTracking|If you self-host Sentry, enter your Sentry instance's full URL. If you use Sentry's hosted solution, enter https://sentry.io"
msgstr ""
@@ -13337,6 +13525,12 @@ msgstr ""
msgid "Escalation policies must have at least one rule"
msgstr ""
+msgid "EscalationPolicies|%{clockIcon} IF alert is not %{alertStatus} in %{minutes}"
+msgstr ""
+
+msgid "EscalationPolicies|%{notificationIcon} THEN %{doAction} %{forScheduleOrUser}"
+msgstr ""
+
msgid "EscalationPolicies|+ Add an additional rule"
msgstr ""
@@ -13379,13 +13573,13 @@ msgstr ""
msgid "EscalationPolicies|Escalation policies"
msgstr ""
-msgid "EscalationPolicies|Escalation rules"
+msgid "EscalationPolicies|Escalation policy %{obstacle} in Project %{project}"
msgstr ""
-msgid "EscalationPolicies|Failed to load oncall-schedules"
+msgid "EscalationPolicies|Escalation rules"
msgstr ""
-msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} %{then} THEN %{doAction} %{scheduleOrUser}"
+msgid "EscalationPolicies|Failed to load oncall-schedules"
msgstr ""
msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} minutes"
@@ -13463,18 +13657,36 @@ msgstr ""
msgid "Every %{action} attempt has failed: %{job_error_message}. Please try again."
msgstr ""
+msgid "Every 3 months"
+msgstr ""
+
+msgid "Every 3 months on the %{day} at %{time} %{timezone}"
+msgstr ""
+
+msgid "Every 6 months"
+msgstr ""
+
+msgid "Every 6 months on the %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Every day"
msgstr ""
msgid "Every day (at %{time})"
msgstr ""
+msgid "Every day at %{time} %{timezone}"
+msgstr ""
+
msgid "Every month"
msgstr ""
msgid "Every month (Day %{day} at %{time})"
msgstr ""
+msgid "Every month on the %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Every three months"
msgstr ""
@@ -13489,6 +13701,15 @@ msgstr[1] ""
msgid "Every week (%{weekday} at %{time})"
msgstr ""
+msgid "Every week on %{day} at %{time} %{timezone}"
+msgstr ""
+
+msgid "Every year"
+msgstr ""
+
+msgid "Every year on %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Everyone"
msgstr ""
@@ -13525,9 +13746,6 @@ msgstr ""
msgid "Exactly one of %{attributes} is required"
msgstr ""
-msgid "Example: %{ip_address}. %{read_more_link}."
-msgstr ""
-
msgid "Example: @sub\\.company\\.com$"
msgstr ""
@@ -13594,13 +13812,13 @@ msgstr ""
msgid "Expand pipeline"
msgstr ""
-msgid "Expand sidebar"
+msgid "Expand settings section"
msgstr ""
-msgid "Expected documents: %{expected_documents}"
+msgid "Expand sidebar"
msgstr ""
-msgid "Experienced"
+msgid "Expected documents: %{expected_documents}"
msgstr ""
msgid "ExperimentSubject|Must have exactly one of User, Namespace, or Project."
@@ -13885,9 +14103,6 @@ msgstr ""
msgid "Failed to load related branches"
msgstr ""
-msgid "Failed to load sidebar lock status"
-msgstr ""
-
msgid "Failed to load stacktrace."
msgstr ""
@@ -14312,6 +14527,9 @@ msgstr ""
msgid "Files"
msgstr ""
+msgid "Files API Rate Limits"
+msgstr ""
+
msgid "Files breadcrumb"
msgstr ""
@@ -15311,6 +15529,9 @@ msgstr ""
msgid "GitLab group: %{source_link}"
msgstr ""
+msgid "GitLab informs you if a new version is available."
+msgstr ""
+
msgid "GitLab is a complete DevOps platform, delivered as a single application, fundamentally changing the way Development, Security, and Ops teams collaborate"
msgstr ""
@@ -15326,7 +15547,7 @@ msgstr ""
msgid "GitLab is open source software to collaborate on code."
msgstr ""
-msgid "GitLab is undergoing maintenance and is operating in a read-only mode."
+msgid "GitLab is undergoing maintenance and is operating in read-only mode."
msgstr ""
msgid "GitLab member or Email address"
@@ -15338,9 +15559,6 @@ msgstr ""
msgid "GitLab project export"
msgstr ""
-msgid "GitLab restart is required to apply changes."
-msgstr ""
-
msgid "GitLab single sign-on URL"
msgstr ""
@@ -15356,9 +15574,6 @@ msgstr ""
msgid "GitLab version"
msgstr ""
-msgid "GitLab will inform you if a new version is available."
-msgstr ""
-
msgid "GitLab will run a background job that will produce pseudonymized CSVs of the GitLab database that will be uploaded to your configured object storage directory."
msgstr ""
@@ -15623,9 +15838,21 @@ msgstr ""
msgid "Go to snippets"
msgstr ""
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check 'Allowed domains for sign-ups'."
+msgstr ""
+
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check 'Email restrictions for sign-ups'."
+msgstr ""
+
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check the 'Domain denylist'."
+msgstr ""
+
msgid "Go to the activity feed"
msgstr ""
+msgid "Go to the group’s 'Settings &gt; General' page, and check 'Restrict membership by email domain'."
+msgstr ""
+
msgid "Go to the milestone list"
msgstr ""
@@ -15662,6 +15889,12 @@ msgstr ""
msgid "Goal of the changes and what reviewers should be aware of"
msgstr ""
+msgid "Google Cloud"
+msgstr ""
+
+msgid "Google Cloud offers several deployment targets. Select the one most suitable for your project."
+msgstr ""
+
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
@@ -15746,9 +15979,6 @@ msgstr ""
msgid "Group ID"
msgstr ""
-msgid "Group ID: %{group_id}"
-msgstr ""
-
msgid "Group Owner must have signed in with SAML before enabling Group Managed Accounts"
msgstr ""
@@ -15923,6 +16153,12 @@ msgstr ""
msgid "GroupImport|Unable to process group import file"
msgstr ""
+msgid "GroupPage|Copy group ID"
+msgstr ""
+
+msgid "GroupPage|Group ID: %{group_id}"
+msgstr ""
+
msgid "GroupRoadmap|%{dateWord} – No end date"
msgstr ""
@@ -15977,6 +16213,9 @@ msgstr ""
msgid "GroupRoadmap|Within 3 years"
msgstr ""
+msgid "GroupSAML|\"persistent\" recommended"
+msgstr ""
+
msgid "GroupSAML|%{strongOpen}Warning%{strongClose} - Enabling %{linkStart}SSO enforcement%{linkEnd} can reduce security risks."
msgstr ""
@@ -16109,6 +16348,9 @@ msgstr ""
msgid "GroupSAML|To be able to prohibit outer forks, you first need to enforce dedicate group managed accounts."
msgstr ""
+msgid "GroupSAML|Use SAML group links to manage group membership using SAML."
+msgstr ""
+
msgid "GroupSAML|Valid SAML Response"
msgstr ""
@@ -16121,13 +16363,10 @@ msgstr ""
msgid "GroupSAML|as %{access_level}"
msgstr ""
-msgid "GroupSAML|must match stored NameID of \"%{extern_uid}\" as we use this to identify users. If the NameID changes users will be unable to sign in."
-msgstr ""
-
-msgid "GroupSAML|should be \"persistent\""
+msgid "GroupSAML|must match stored NameID of \"%{extern_uid}\" to identify user and allow sign in"
msgstr ""
-msgid "GroupSAML|should be a random persistent ID, emails are discouraged"
+msgid "GroupSAML|recommend persistent ID instead of email"
msgstr ""
msgid "GroupSelect|No matching results"
@@ -16142,9 +16381,15 @@ msgstr ""
msgid "GroupSettings|Allow project access token creation"
msgstr ""
+msgid "GroupSettings|Applied to all subgroups unless overridden by a group owner. Groups already added to the project lose access."
+msgstr ""
+
msgid "GroupSettings|Auto DevOps pipeline was updated for the group"
msgstr ""
+msgid "GroupSettings|Available only on the top-level group. Applies to all subgroups. Groups already shared with a group outside %{group} are still shared unless removed manually."
+msgstr ""
+
msgid "GroupSettings|Badges"
msgstr ""
@@ -16196,6 +16441,9 @@ msgstr ""
msgid "GroupSettings|New runners registration token has been generated!"
msgstr ""
+msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgstr ""
+
msgid "GroupSettings|Pipeline settings was updated for the group"
msgstr ""
@@ -16208,12 +16456,15 @@ msgstr ""
msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
-msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups."
+msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups"
msgstr ""
msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
msgstr ""
+msgid "GroupSettings|Prevents group members from being notified if the group is mentioned."
+msgstr ""
+
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
msgstr ""
@@ -16250,21 +16501,6 @@ msgstr ""
msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}."
msgstr ""
-msgid "GroupSettings|This setting is only available on the top-level group and it applies to all subgroups. Groups that have already been shared with a group outside %{group} will still be shared, and this access will have to be revoked manually."
-msgstr ""
-
-msgid "GroupSettings|This setting will be applied to all subgroups unless overridden by a group owner. Groups that already have access to the project will continue to have access unless removed manually."
-msgstr ""
-
-msgid "GroupSettings|This setting will override user notification preferences for all members of the group, subgroups, and projects."
-msgstr ""
-
-msgid "GroupSettings|This setting will prevent group members from being notified if the group is mentioned."
-msgstr ""
-
-msgid "GroupSettings|This setting will prevent group members from forking projects outside of the group."
-msgstr ""
-
msgid "GroupSettings|Transfer group"
msgstr ""
@@ -16382,7 +16618,7 @@ msgstr ""
msgid "GroupsNew|No import options available"
msgstr ""
-msgid "GroupsNew|Not all related objects are migrated, as %{docs_link_start}described here%{docs_link_end}. Please %{feedback_link_start}leave feedback%{feedback_link_end} on this feature."
+msgid "GroupsNew|Not all related objects are migrated. %{docs_link_start}More info%{docs_link_end}."
msgstr ""
msgid "GroupsNew|Personal access token"
@@ -16514,15 +16750,27 @@ msgstr ""
msgid "Hello %{name},"
msgstr ""
-msgid "Hello there"
-msgstr ""
-
msgid "Hello, %{name}!"
msgstr ""
msgid "Hello, %{username}!"
msgstr ""
+msgid "HelloMessage|%{handshake_emoji} Contribute to GitLab: %{contribute_link}"
+msgstr ""
+
+msgid "HelloMessage|%{magnifier_emoji} Create a new GitLab issue: %{new_issue_link}"
+msgstr ""
+
+msgid "HelloMessage|%{rocket_emoji} We like your curiosity! Help us improve GitLab by joining the team: %{jobs_page_link}"
+msgstr ""
+
+msgid "HelloMessage|Does this page need fixes or improvements? Open an issue or contribute a merge request to help make GitLab more lovable. At GitLab, everyone can contribute!"
+msgstr ""
+
+msgid "HelloMessage|Welcome to GitLab!"
+msgstr ""
+
msgid "Help"
msgstr ""
@@ -16532,13 +16780,10 @@ msgstr ""
msgid "Helps prevent bots from creating accounts."
msgstr ""
-msgid "Helps prevent bots from creating issues"
-msgstr ""
-
-msgid "Helps prevent malicious users hide their activity"
+msgid "Helps prevent bots from creating issues."
msgstr ""
-msgid "Helps reduce request volume (e.g. from crawlers or abusive bots)"
+msgid "Helps prevent malicious users hide their activity."
msgstr ""
msgid "Helps reduce request volume (for example, from crawlers or abusive bots)"
@@ -16662,6 +16907,12 @@ msgstr ""
msgid "Housekeeping, export, path, transfer, remove, archive."
msgstr ""
+msgid "How do I configure Akismet?"
+msgstr ""
+
+msgid "How do I configure it?"
+msgstr ""
+
msgid "How do I configure runners?"
msgstr ""
@@ -16683,19 +16934,25 @@ msgstr ""
msgid "How do I set up this service?"
msgstr ""
+msgid "How do I use a web terminal?"
+msgstr ""
+
+msgid "How do I use file templates?"
+msgstr ""
+
msgid "How it works"
msgstr ""
msgid "How many days need to pass between marking entity for deletion and actual removing it."
msgstr ""
-msgid "How many seconds an IP will be counted towards the limit"
+msgid "How many seconds an IP counts toward the IP address limit."
msgstr ""
-msgid "I accept the %{terms_link}"
+msgid "How the job limiter handles jobs exceeding the thresholds specified below. The 'track' mode only logs the jobs. The 'compress' mode compresses the jobs and raises an exception if the compressed size exceeds the limit."
msgstr ""
-msgid "I accept the|Terms of Service and Privacy Policy"
+msgid "I accept the %{terms_link}"
msgstr ""
msgid "I forgot my password"
@@ -16779,13 +17036,16 @@ msgstr ""
msgid "IP Address"
msgstr ""
-msgid "IP expiration time"
+msgid "IP address expiration time"
msgstr ""
-msgid "IP subnet restriction only allowed for top-level groups"
+msgid "IP address restrictions"
+msgstr ""
+
+msgid "IP addresses per user"
msgstr ""
-msgid "IPs per user"
+msgid "IP subnet restriction only allowed for top-level groups"
msgstr ""
msgid "Identifier"
@@ -16800,6 +17060,9 @@ msgstr ""
msgid "If any indexed field exceeds this limit it will be truncated to this number of characters and the rest will not be indexed or searchable. This does not apply to repository and wiki indexing. Setting this to 0 means it is unlimited."
msgstr ""
+msgid "If blank, defaults to %{code_open}Retry later%{code_close}."
+msgstr ""
+
msgid "If blank, set allowable lifetime to %{instance_level_policy_in_words}, as defined by the instance admin. Once set, existing tokens for users in this group may be revoked."
msgstr ""
@@ -16851,6 +17114,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 did not initiate these sign-in attempts, please reach out to your administrator or enable two-factor authentication (2FA) on your account."
+msgstr ""
+
msgid "If you did not initiate this change, please contact your administrator immediately."
msgstr ""
@@ -16942,10 +17208,10 @@ msgstr ""
msgid "Import Projects from Gitea"
msgstr ""
-msgid "Import a project"
+msgid "Import an exported GitLab project"
msgstr ""
-msgid "Import an exported GitLab project"
+msgid "Import and export rate limits"
msgstr ""
msgid "Import failed due to a GitHub error: %{original}"
@@ -16957,12 +17223,18 @@ msgstr ""
msgid "Import from Jira"
msgstr ""
+msgid "Import group"
+msgstr ""
+
msgid "Import group from file"
msgstr ""
msgid "Import groups"
msgstr ""
+msgid "Import history"
+msgstr ""
+
msgid "Import in progress"
msgstr ""
@@ -17026,7 +17298,25 @@ msgstr ""
msgid "Import timed out. Import took longer than %{import_jobs_expiration} seconds"
msgstr ""
-msgid "Import/Export Rate Limits"
+msgid "ImportAProjectModal|Import from a project"
+msgstr ""
+
+msgid "ImportAProjectModal|Import members from another project"
+msgstr ""
+
+msgid "ImportAProjectModal|Import project members"
+msgstr ""
+
+msgid "ImportAProjectModal|Only project members (not group members) are imported, and they get the same permissions as the project you import from."
+msgstr ""
+
+msgid "ImportAProjectModal|Successfully imported"
+msgstr ""
+
+msgid "ImportAProjectModal|Unable to import project members"
+msgstr ""
+
+msgid "ImportAProjectModal|You're importing members to the %{strongStart}%{name}%{strongEnd} project."
msgstr ""
msgid "ImportButtons|Connect repositories from"
@@ -17079,7 +17369,7 @@ msgstr[1] ""
msgid "Importing..."
msgstr ""
-msgid "Import|A repository URL usually ends in a .git suffix, although this is not required. Double check to make sure your repository URL is correct."
+msgid "Import|There is not a valid Git repository at this URL. If your HTTP repository is not publicly accessible, verify your credentials."
msgstr ""
msgid "Improve customer support with Service Desk"
@@ -17088,9 +17378,6 @@ msgstr ""
msgid "Improves Git cloning performance."
msgstr ""
-msgid "In %{time_to_now}"
-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 ""
@@ -17376,7 +17663,7 @@ msgstr ""
msgid "InProductMarketing|Start a GitLab Ultimate trial today in less than one minute, no credit card required."
msgstr ""
-msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no CC required"
+msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no credit card required"
msgstr ""
msgid "InProductMarketing|Start a trial"
@@ -17415,7 +17702,7 @@ msgstr ""
msgid "InProductMarketing|Team up in GitLab for greater efficiency"
msgstr ""
-msgid "InProductMarketing|Team work makes the dream work"
+msgid "InProductMarketing|Team work makes the dream work"
msgstr ""
msgid "InProductMarketing|Test, create, deploy"
@@ -17996,6 +18283,9 @@ msgstr ""
msgid "Integrations|Create new issue in Jira"
msgstr ""
+msgid "Integrations|Create new issue in ZenTao"
+msgstr ""
+
msgid "Integrations|Default settings are inherited from the group level."
msgstr ""
@@ -18089,9 +18379,15 @@ msgstr ""
msgid "Integrations|Search Jira issues"
msgstr ""
+msgid "Integrations|Search ZenTao issues"
+msgstr ""
+
msgid "Integrations|Send notifications about project events to Unify Circuit."
msgstr ""
+msgid "Integrations|Send notifications about project events to a Unify Circuit conversation. %{docs_link}"
+msgstr ""
+
msgid "Integrations|Sign in to add namespaces"
msgstr ""
@@ -18131,6 +18427,9 @@ msgstr ""
msgid "Integrations|You've activated every integration 🎉"
msgstr ""
+msgid "Integrations|ZenTao issues display here when you create issues in your project in ZenTao."
+msgstr ""
+
msgid "Interactive mode"
msgstr ""
@@ -18158,9 +18457,6 @@ msgstr ""
msgid "Interval Pattern"
msgstr ""
-msgid "Introducing Value Stream Analytics"
-msgstr ""
-
msgid "Introducing Your DevOps Report"
msgstr ""
@@ -18257,6 +18553,12 @@ msgstr ""
msgid "Investigate vulnerability: %{title}"
msgstr ""
+msgid "Invisible Captcha"
+msgstr ""
+
+msgid "Invisible Captcha helps prevent the creation of spam accounts. It adds a honeypot field and time-sensitive form submission to the account signup form."
+msgstr ""
+
msgid "Invitation"
msgstr ""
@@ -18710,12 +19012,18 @@ msgstr ""
msgid "Issues"
msgstr ""
+msgid "Issues I've created"
+msgstr ""
+
msgid "Issues Rate Limits"
msgstr ""
msgid "Issues and merge requests"
msgstr ""
+msgid "Issues assigned to me"
+msgstr ""
+
msgid "Issues can be bugs, tasks or ideas to be discussed. Also, issues are searchable and filterable."
msgstr ""
@@ -18827,7 +19135,7 @@ msgstr ""
msgid "Iterations|Create cadence"
msgstr ""
-msgid "Iterations|Create your first iteration"
+msgid "Iterations|Create iteration"
msgstr ""
msgid "Iterations|Delete cadence"
@@ -18836,6 +19144,9 @@ msgstr ""
msgid "Iterations|Delete iteration cadence?"
msgstr ""
+msgid "Iterations|Delete iteration?"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -18869,12 +19180,18 @@ msgstr ""
msgid "Iterations|New iteration cadence"
msgstr ""
+msgid "Iterations|No closed iterations."
+msgstr ""
+
msgid "Iterations|No iteration cadences to show."
msgstr ""
msgid "Iterations|No iterations in cadence."
msgstr ""
+msgid "Iterations|No open iterations."
+msgstr ""
+
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
@@ -18905,6 +19222,9 @@ msgstr ""
msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
msgstr ""
+msgid "Iterations|This will remove the iteration from any issues that are assigned to it."
+msgstr ""
+
msgid "Iterations|Title"
msgstr ""
@@ -18920,15 +19240,9 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "I’m familiar with the basics of DevOps."
-msgstr ""
-
msgid "I’m joining my team who’s already on GitLab"
msgstr ""
-msgid "I’m not familiar with the basics of DevOps."
-msgstr ""
-
msgid "Jaeger URL"
msgstr ""
@@ -19193,6 +19507,9 @@ msgstr ""
msgid "Job"
msgstr ""
+msgid "Job %{jobName}"
+msgstr ""
+
msgid "Job Failed #%{build_id}"
msgstr ""
@@ -19783,9 +20100,6 @@ msgstr ""
msgid "Learn more in the"
msgstr ""
-msgid "Learn more in the|pipeline schedules documentation"
-msgstr ""
-
msgid "Learn more."
msgstr ""
@@ -19897,9 +20211,6 @@ msgstr ""
msgid "Leave Admin Mode"
msgstr ""
-msgid "Leave blank for no limit. Once set, existing personal access tokens may be revoked."
-msgstr ""
-
msgid "Leave edit mode? All unsaved changes will be lost."
msgstr ""
@@ -19945,10 +20256,10 @@ msgstr ""
msgid "LicenseCompliance|Acceptable license to be used in the project"
msgstr ""
-msgid "LicenseCompliance|Add a license"
+msgid "LicenseCompliance|Add license and related policy"
msgstr ""
-msgid "LicenseCompliance|Add license and related policy"
+msgid "LicenseCompliance|Add license policy"
msgstr ""
msgid "LicenseCompliance|Allow"
@@ -20038,6 +20349,9 @@ msgstr ""
msgid "LicenseManagement|Uncategorized"
msgstr ""
+msgid "Licensed Enterprise Edition features can be used if the project namespace's plan includes the feature, or if the project is public."
+msgstr ""
+
msgid "Licensed Features"
msgstr ""
@@ -20104,7 +20418,10 @@ msgstr ""
msgid "Limit namespaces and projects that can be indexed"
msgstr ""
-msgid "Limit sign in from multiple ips"
+msgid "Limit project size at a global, group, and project level. %{link_start}Learn more%{link_end}."
+msgstr ""
+
+msgid "Limit sign in from multiple IP addresses"
msgstr ""
msgid "Limit the number of concurrent operations this secondary site can run in the background."
@@ -20116,11 +20433,17 @@ msgstr ""
msgid "Limit the number of issues and epics per minute a user can create through web and API requests."
msgstr ""
+msgid "Limit the size of Sidekiq jobs stored in Redis."
+msgstr ""
+
msgid "Limited to showing %d event at most"
msgid_plural "Limited to showing %d events at most"
msgstr[0] ""
msgstr[1] ""
+msgid "Limiting mode"
+msgstr ""
+
msgid "Line changes"
msgstr ""
@@ -20190,9 +20513,6 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
-msgid "List of users to be excluded from the limit"
-msgstr ""
-
msgid "List options"
msgstr ""
@@ -20232,9 +20552,6 @@ msgstr ""
msgid "Loading functions timed out. Please reload the page to try again."
msgstr ""
-msgid "Loading issues"
-msgstr ""
-
msgid "Loading more"
msgstr ""
@@ -20526,6 +20843,9 @@ msgstr ""
msgid "Marked For Deletion At - %{deletion_time}"
msgstr ""
+msgid "Marked as ready. Merging is now allowed."
+msgstr ""
+
msgid "Marked this %{noun} as a draft."
msgstr ""
@@ -20598,52 +20918,22 @@ msgstr ""
msgid "Max 100,000 events"
msgstr ""
-msgid "Max 20 characters"
-msgstr ""
-
-msgid "Max Group Export Download requests per minute per user"
-msgstr ""
-
-msgid "Max Group Export requests per minute per user"
-msgstr ""
-
-msgid "Max Group Import requests per minute per user"
-msgstr ""
-
-msgid "Max Project Export Download requests per minute per user"
-msgstr ""
-
-msgid "Max Project Export requests per minute per user"
-msgstr ""
-
-msgid "Max Project Import requests per minute per user"
-msgstr ""
-
-msgid "Max authenticated API requests per period per user"
-msgstr ""
-
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
-msgid "Max authenticated web requests per period per user"
-msgstr ""
-
msgid "Max file size is 200 KB."
msgstr ""
-msgid "Max requests per minute per user"
-msgstr ""
-
msgid "Max role"
msgstr ""
msgid "Max session time"
msgstr ""
-msgid "Max unauthenticated requests per period per IP"
+msgid "MaxBuilds"
msgstr ""
-msgid "MaxBuilds"
+msgid "Maximum 20 characters"
msgstr ""
msgid "Maximum Conan package file size in bytes"
@@ -20679,6 +20969,12 @@ msgstr ""
msgid "Maximum attachment size (MB)"
msgstr ""
+msgid "Maximum authenticated API requests per rate limit period per user"
+msgstr ""
+
+msgid "Maximum authenticated web requests per rate limit period per user"
+msgstr ""
+
msgid "Maximum bulk request size (MiB)"
msgstr ""
@@ -20724,6 +21020,15 @@ msgstr ""
msgid "Maximum files in a diff"
msgstr ""
+msgid "Maximum group export download requests per minute"
+msgstr ""
+
+msgid "Maximum group export requests per minute"
+msgstr ""
+
+msgid "Maximum group import requests per minute"
+msgstr ""
+
msgid "Maximum import size"
msgstr ""
@@ -20760,7 +21065,7 @@ msgstr ""
msgid "Maximum number of projects."
msgstr ""
-msgid "Maximum number of unique IPs per user"
+msgid "Maximum number of unique IP addresses per user."
msgstr ""
msgid "Maximum page reached"
@@ -20769,12 +21074,24 @@ msgstr ""
msgid "Maximum page size"
msgstr ""
+msgid "Maximum project export download requests per minute"
+msgstr ""
+
+msgid "Maximum project export requests per minute"
+msgstr ""
+
+msgid "Maximum project import requests per minute"
+msgstr ""
+
msgid "Maximum push size"
msgstr ""
msgid "Maximum push size (MB)"
msgstr ""
+msgid "Maximum requests per minute"
+msgstr ""
+
msgid "Maximum running slices"
msgstr ""
@@ -20802,10 +21119,16 @@ msgstr ""
msgid "Maximum time between updates that a mirror can have when scheduled to synchronize."
msgstr ""
-msgid "Maximum time for web terminal websocket connection (in seconds). 0 for unlimited."
+msgid "Maximum time that users are allowed to skip the setup of two-factor authentication (in hours). Set to 0 (zero) to enforce at next sign in."
msgstr ""
-msgid "Maximum time that users are allowed to skip the setup of two-factor authentication (in hours). Set to 0 (zero) to enforce at next sign in."
+msgid "Maximum time, in seconds, for a web terminal websocket connection. 0 for unlimited."
+msgstr ""
+
+msgid "Maximum unauthenticated API requests per rate limit period per IP"
+msgstr ""
+
+msgid "Maximum unauthenticated web requests per rate limit period per IP"
msgstr ""
msgid "May"
@@ -20823,9 +21146,6 @@ msgstr ""
msgid "Medium vulnerabilities present"
msgstr ""
-msgid "Member lock"
-msgstr ""
-
msgid "Member since"
msgstr ""
@@ -20862,6 +21182,9 @@ msgstr ""
msgid "Members of a group may only view projects they have permission to access"
msgstr ""
+msgid "Membership"
+msgstr ""
+
msgid "Members|%{time} by %{user}"
msgstr ""
@@ -20922,9 +21245,6 @@ msgstr ""
msgid "Members|Expiration date updated successfully."
msgstr ""
-msgid "Members|Expired"
-msgstr ""
-
msgid "Members|Filter members"
msgstr ""
@@ -20940,9 +21260,6 @@ msgstr ""
msgid "Members|Membership"
msgstr ""
-msgid "Members|No expiration set"
-msgstr ""
-
msgid "Members|Remove \"%{groupName}\""
msgstr ""
@@ -20964,9 +21281,6 @@ msgstr ""
msgid "Members|Search invited"
msgstr ""
-msgid "Members|in %{time}"
-msgstr ""
-
msgid "Member|Deny access"
msgstr ""
@@ -21042,9 +21356,6 @@ msgstr ""
msgid "Merge request %{mr_link} was reviewed by %{mr_author}"
msgstr ""
-msgid "Merge request (MR) approvals"
-msgstr ""
-
msgid "Merge request analytics"
msgstr ""
@@ -21066,12 +21377,21 @@ msgstr ""
msgid "Merge requests"
msgstr ""
+msgid "Merge requests I've created"
+msgstr ""
+
msgid "Merge requests are a place to propose changes you've made to a project and discuss those changes with others"
msgstr ""
msgid "Merge requests are read-only in a secondary Geo node"
msgstr ""
+msgid "Merge requests assigned to me"
+msgstr ""
+
+msgid "Merge requests that I'm a reviewer"
+msgstr ""
+
msgid "Merge the branch and fix any conflicts that come up"
msgstr ""
@@ -21132,10 +21452,10 @@ msgstr ""
msgid "MergeRequests|An error occurred while saving the draft comment."
msgstr ""
-msgid "MergeRequests|Failed to squash. Should be done manually."
+msgid "MergeRequests|Create issue to resolve thread"
msgstr ""
-msgid "MergeRequests|Resolve this thread in a new issue"
+msgid "MergeRequests|Failed to squash. Should be done manually."
msgstr ""
msgid "MergeRequests|Saving the comment failed"
@@ -21949,6 +22269,9 @@ msgstr ""
msgid "MoveIssue|Cannot move issue to project it originates from!"
msgstr ""
+msgid "MoveIssue|Cannot move issues of '%{issue_type}' type."
+msgstr ""
+
msgid "Moved issue to %{label} column in the board."
msgstr ""
@@ -22074,6 +22397,15 @@ 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. To learn more about reducing storage capacity please visit our docs."
msgstr ""
+msgid "NamespaceUserCap|Pending users must be reviewed and approved by a group owner. Learn more about %{user_caps_link_start}User Caps%{link_end} and %{users_pending_approval_link_start}Users Pending Approval%{link_end}."
+msgstr ""
+
+msgid "NamespaceUserCap|View pending user approvals"
+msgstr ""
+
+msgid "NamespaceUserCap|Your group has reached its billable member limit"
+msgstr ""
+
msgid "Namespaces"
msgstr ""
@@ -22116,9 +22448,6 @@ msgstr ""
msgid "Network"
msgstr ""
-msgid "Network Policy|New rule"
-msgstr ""
-
msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is inbound from a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
msgstr ""
@@ -22140,16 +22469,13 @@ msgstr ""
msgid "NetworkPolicies|%{strongOpen}any%{strongClose} port"
msgstr ""
-msgid "NetworkPolicies|+ Add alert"
-msgstr ""
-
msgid "NetworkPolicies|.yaml"
msgstr ""
msgid "NetworkPolicies|.yaml mode"
msgstr ""
-msgid "NetworkPolicies|Actions"
+msgid "NetworkPolicies|Add alert"
msgstr ""
msgid "NetworkPolicies|Alerts are intended to be selectively used for a limited number of events that are potentially concerning and warrant a manual review. Alerts should not be used as a substitute for a SIEM or a logging tool. High volume alerts are likely to be dropped so as to preserve the stability of GitLab's integration with Kubernetes."
@@ -22185,9 +22511,6 @@ msgstr ""
msgid "NetworkPolicies|Deny all traffic"
msgstr ""
-msgid "NetworkPolicies|Description"
-msgstr ""
-
msgid "NetworkPolicies|Edit policy"
msgstr ""
@@ -22200,9 +22523,6 @@ msgstr ""
msgid "NetworkPolicies|IP/subnet"
msgstr ""
-msgid "NetworkPolicies|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
-msgstr ""
-
msgid "NetworkPolicies|Invalid or empty policy"
msgstr ""
@@ -22212,19 +22532,16 @@ msgstr ""
msgid "NetworkPolicies|Kubernetes error: %{error}"
msgstr ""
-msgid "NetworkPolicies|Name"
-msgstr ""
-
msgid "NetworkPolicies|Network"
msgstr ""
-msgid "NetworkPolicies|Network traffic"
+msgid "NetworkPolicies|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
msgstr ""
-msgid "NetworkPolicies|New policy"
+msgid "NetworkPolicies|Network policy can be created after the environment is loaded successfully."
msgstr ""
-msgid "NetworkPolicies|No policies detected"
+msgid "NetworkPolicies|Network traffic"
msgstr ""
msgid "NetworkPolicies|None selected"
@@ -22233,21 +22550,12 @@ msgstr ""
msgid "NetworkPolicies|Please %{installLinkStart}install%{installLinkEnd} and %{configureLinkStart}configure a Kubernetes Agent for this project%{configureLinkEnd} to enable alerts."
msgstr ""
-msgid "NetworkPolicies|Policies are a specification of how groups of pods are allowed to communicate with each other's network endpoints."
-msgstr ""
-
msgid "NetworkPolicies|Policy %{policyName} was successfully changed"
msgstr ""
msgid "NetworkPolicies|Policy definition"
msgstr ""
-msgid "NetworkPolicies|Policy editor"
-msgstr ""
-
-msgid "NetworkPolicies|Policy preview"
-msgstr ""
-
msgid "NetworkPolicies|Rule"
msgstr ""
@@ -22257,9 +22565,6 @@ msgstr ""
msgid "NetworkPolicies|Rule mode is unavailable for this policy. In some cases, we cannot parse the YAML file back into the rules editor."
msgstr ""
-msgid "NetworkPolicies|Rules"
-msgstr ""
-
msgid "NetworkPolicies|Save changes"
msgstr ""
@@ -22272,9 +22577,6 @@ msgstr ""
msgid "NetworkPolicies|Traffic that does not match any rule will be blocked."
msgstr ""
-msgid "NetworkPolicies|Unable to parse policy"
-msgstr ""
-
msgid "NetworkPolicies|all DNS names"
msgstr ""
@@ -22454,6 +22756,9 @@ msgstr ""
msgid "New issue"
msgstr ""
+msgid "New issue in %{project}"
+msgstr ""
+
msgid "New issue title"
msgstr ""
@@ -22532,7 +22837,7 @@ msgstr ""
msgid "Newest first"
msgstr ""
-msgid "Newly registered users will by default be external"
+msgid "Newly-registered users are external by default"
msgstr ""
msgid "Next"
@@ -22847,8 +23152,10 @@ msgstr ""
msgid "No webhooks found, add one in the form above."
msgstr ""
-msgid "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} to renew your subscription."
-msgstr ""
+msgid "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} day to renew your subscription."
+msgid_plural "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} days to renew your subscription."
+msgstr[0] ""
+msgstr[1] ""
msgid "No. of commits"
msgstr ""
@@ -22865,7 +23172,7 @@ msgstr ""
msgid "Nodes"
msgstr ""
-msgid "Non-admin users can sign in with read-only access and make read-only API requests."
+msgid "Non-admin users are restricted to read-only access, in both GitLab UI and API."
msgstr ""
msgid "None"
@@ -22946,7 +23253,7 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
-msgid "Notes Rate Limits"
+msgid "Notes rate limit"
msgstr ""
msgid "Notes|Are you sure you want to cancel creating this comment?"
@@ -23113,9 +23420,6 @@ msgstr ""
msgid "November"
msgstr ""
-msgid "Novice"
-msgstr ""
-
msgid "Now, personalize your GitLab experience"
msgstr ""
@@ -23284,7 +23588,7 @@ msgstr ""
msgid "OnCallSchedules|For this rotation, on-call will be:"
msgstr ""
-msgid "OnCallSchedules|On-call schedule %{schedule} in Project %{project}"
+msgid "OnCallSchedules|On-call schedule %{obstacle} in Project %{project}"
msgstr ""
msgid "OnCallSchedules|On-call schedules"
@@ -23431,22 +23735,22 @@ msgstr ""
msgid "OnDemandScans|Scanner profile"
msgstr ""
-msgid "OnDemandScans|Select one of the existing profiles"
+msgid "OnDemandScans|Schedule scan"
msgstr ""
-msgid "OnDemandScans|Site profile"
+msgid "OnDemandScans|Select one of the existing profiles"
msgstr ""
-msgid "OnDemandScans|Use existing scanner profile"
+msgid "OnDemandScans|Site profile"
msgstr ""
-msgid "OnDemandScans|Use existing site profile"
+msgid "OnDemandScans|Start time"
msgstr ""
-msgid "OnDemandScans|You can either choose a passive scan or validate the target site in your chosen site profile. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
+msgid "OnDemandScans|Use existing scanner profile"
msgstr ""
-msgid "OnDemandScans|You cannot run an active scan against an unvalidated site."
+msgid "OnDemandScans|Use existing site profile"
msgstr ""
msgid "OnDemandScans|You must create a repository within your project to run an on-demand scan."
@@ -23511,6 +23815,9 @@ msgstr ""
msgid "Only admins can delete project"
msgstr ""
+msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
+msgstr ""
+
msgid "Only include features new to your current subscription tier."
msgstr ""
@@ -23529,6 +23836,12 @@ msgstr ""
msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
+msgid "Only reCAPTCHA v2 is supported:"
+msgstr ""
+
+msgid "Only users from the specified IP address ranges are able to reach this group, including all subgroups, projects, and Git repositories."
+msgstr ""
+
msgid "Only verified users with an email address in any of these domains can be added to the group."
msgstr ""
@@ -23715,9 +24028,6 @@ msgstr ""
msgid "Package Registry"
msgstr ""
-msgid "Package Registry Rate Limits"
-msgstr ""
-
msgid "Package Registry: authenticated API requests"
msgstr ""
@@ -23736,6 +24046,9 @@ msgstr ""
msgid "Package recipe already exists"
msgstr ""
+msgid "Package registry rate limits"
+msgstr ""
+
msgid "Package type"
msgstr ""
@@ -23802,6 +24115,9 @@ msgstr ""
msgid "PackageRegistry|Composer"
msgstr ""
+msgid "PackageRegistry|Composer.json with license: %{license} and version: %{version}"
+msgstr ""
+
msgid "PackageRegistry|Conan"
msgstr ""
@@ -23865,6 +24181,9 @@ msgstr ""
msgid "PackageRegistry|Copy require package include"
msgstr ""
+msgid "PackageRegistry|Copy target SHA"
+msgstr ""
+
msgid "PackageRegistry|Copy yarn command"
msgstr ""
@@ -23931,6 +24250,9 @@ msgstr ""
msgid "PackageRegistry|Install package version"
msgstr ""
+msgid "PackageRegistry|Instance-level"
+msgstr ""
+
msgid "PackageRegistry|Invalid Package: failed metadata extraction"
msgstr ""
@@ -23976,6 +24298,9 @@ msgstr ""
msgid "PackageRegistry|Pip Command"
msgstr ""
+msgid "PackageRegistry|Project-level"
+msgstr ""
+
msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
msgstr ""
@@ -23997,6 +24322,9 @@ msgstr ""
msgid "PackageRegistry|Remove package"
msgstr ""
+msgid "PackageRegistry|Required Python: %{pythonVersion}"
+msgstr ""
+
msgid "PackageRegistry|RubyGems"
msgstr ""
@@ -24039,6 +24367,9 @@ msgstr ""
msgid "PackageRegistry|Source project located at %{link}"
msgstr ""
+msgid "PackageRegistry|Target SHA: %{sha}"
+msgstr ""
+
msgid "PackageRegistry|There are no other versions of this package."
msgstr ""
@@ -24207,6 +24538,18 @@ msgstr ""
msgid "Password was successfully updated. Please sign in again."
msgstr ""
+msgid "PasswordPrompt|Confirm password"
+msgstr ""
+
+msgid "PasswordPrompt|Confirm password to continue"
+msgstr ""
+
+msgid "PasswordPrompt|Password is required"
+msgstr ""
+
+msgid "PasswordPrompt|Please enter your password to confirm"
+msgstr ""
+
msgid "Passwords should be unique and not used for any other sites or services."
msgstr ""
@@ -24234,6 +24577,9 @@ msgstr ""
msgid "Paste project path (i.e. gitlab-org/gitlab)"
msgstr ""
+msgid "Paste this DSN into your Sentry SDK"
+msgstr ""
+
msgid "Paste your public SSH key, which is usually contained in the file '~/.ssh/id_ed25519.pub' or '~/.ssh/id_rsa.pub' and begins with 'ssh-ed25519' or 'ssh-rsa'. Do not paste your private SSH key, as that can compromise your identity."
msgstr ""
@@ -24318,6 +24664,9 @@ msgstr ""
msgid "PerformanceBar|First Contentful Paint"
msgstr ""
+msgid "PerformanceBar|Flamegraph with mode:"
+msgstr ""
+
msgid "PerformanceBar|Frontend resources"
msgstr ""
@@ -24351,6 +24700,15 @@ msgstr ""
msgid "PerformanceBar|Trace"
msgstr ""
+msgid "PerformanceBar|cpu"
+msgstr ""
+
+msgid "PerformanceBar|object"
+msgstr ""
+
+msgid "PerformanceBar|wall"
+msgstr ""
+
msgid "Period in seconds"
msgstr ""
@@ -24579,6 +24937,48 @@ msgstr ""
msgid "PipelineSchedules|Variables"
msgstr ""
+msgid "PipelineSource|API"
+msgstr ""
+
+msgid "PipelineSource|Chat"
+msgstr ""
+
+msgid "PipelineSource|External"
+msgstr ""
+
+msgid "PipelineSource|External Pull Request"
+msgstr ""
+
+msgid "PipelineSource|Merge Request"
+msgstr ""
+
+msgid "PipelineSource|On-Demand DAST Scan"
+msgstr ""
+
+msgid "PipelineSource|On-Demand DAST Validation"
+msgstr ""
+
+msgid "PipelineSource|Parent Pipeline"
+msgstr ""
+
+msgid "PipelineSource|Pipeline"
+msgstr ""
+
+msgid "PipelineSource|Push"
+msgstr ""
+
+msgid "PipelineSource|Schedule"
+msgstr ""
+
+msgid "PipelineSource|Trigger"
+msgstr ""
+
+msgid "PipelineSource|Web"
+msgstr ""
+
+msgid "PipelineSource|Web IDE"
+msgstr ""
+
msgid "PipelineStatusTooltip|Pipeline: %{ciStatus}"
msgstr ""
@@ -24879,46 +25279,7 @@ msgstr ""
msgid "Pipeline|Source"
msgstr ""
-msgid "Pipeline|Source|API"
-msgstr ""
-
-msgid "Pipeline|Source|Chat"
-msgstr ""
-
-msgid "Pipeline|Source|External"
-msgstr ""
-
-msgid "Pipeline|Source|External Pull Request"
-msgstr ""
-
-msgid "Pipeline|Source|Merge Request"
-msgstr ""
-
-msgid "Pipeline|Source|On-Demand DAST Scan"
-msgstr ""
-
-msgid "Pipeline|Source|On-Demand DAST Validation"
-msgstr ""
-
-msgid "Pipeline|Source|Parent Pipeline"
-msgstr ""
-
-msgid "Pipeline|Source|Pipeline"
-msgstr ""
-
-msgid "Pipeline|Source|Push"
-msgstr ""
-
-msgid "Pipeline|Source|Schedule"
-msgstr ""
-
-msgid "Pipeline|Source|Trigger"
-msgstr ""
-
-msgid "Pipeline|Source|Web"
-msgstr ""
-
-msgid "Pipeline|Source|Web IDE"
+msgid "Pipeline|Source|Security Policy"
msgstr ""
msgid "Pipeline|Specify variable values to be used in this run. The values specified in %{linkStart}CI/CD settings%{linkEnd} will be used by default."
@@ -24969,7 +25330,7 @@ msgstr ""
msgid "Pipeline|We are currently unable to fetch pipeline data"
msgstr ""
-msgid "Pipeline|You’re about to stop pipeline %{pipelineId}."
+msgid "Pipeline|You’re about to stop pipeline #%{pipelineId}."
msgstr ""
msgid "Pipeline|for"
@@ -24996,6 +25357,9 @@ msgstr ""
msgid "Plain diff"
msgstr ""
+msgid "Plain-text response to send to clients that hit a rate limit"
+msgstr ""
+
msgid "Plan:"
msgstr ""
@@ -25140,9 +25504,6 @@ msgstr ""
msgid "Please provide attributes to update"
msgstr ""
-msgid "Please provide your username or email address."
-msgstr ""
-
msgid "Please reach out if you have any questions and we'll be happy to assist."
msgstr ""
@@ -25185,9 +25546,6 @@ msgstr ""
msgid "Please set a new password before proceeding."
msgstr ""
-msgid "Please share your feedback about %{featureName} %{linkStart}in this issue%{linkEnd} to help us improve the experience."
-msgstr ""
-
msgid "Please solve the captcha"
msgstr ""
@@ -25365,6 +25723,9 @@ msgstr ""
msgid "Prevent adding new members to project membership within this group"
msgstr ""
+msgid "Prevent auto-stopping"
+msgstr ""
+
msgid "Prevent editing approval rules in projects and merge requests."
msgstr ""
@@ -25377,7 +25738,7 @@ msgstr ""
msgid "Prevent users from changing their profile name"
msgstr ""
-msgid "Prevent users from performing write operations on GitLab while performing maintenance."
+msgid "Prevent users from performing write operations while GitLab maintenance is in progress."
msgstr ""
msgid "Preview"
@@ -25650,6 +26011,9 @@ msgstr ""
msgid "Profiles|Enter your name, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Enter your password to confirm the email change"
+msgstr ""
+
msgid "Profiles|Enter your pronouns to let people know how to refer to you"
msgstr ""
@@ -25884,10 +26248,10 @@ msgstr ""
msgid "Profiles|e.g. My MacBook key"
msgstr ""
-msgid "Profiles|username"
+msgid "Profiles|https://website.com"
msgstr ""
-msgid "Profiles|website.com"
+msgid "Profiles|username"
msgstr ""
msgid "Profiles|your account"
@@ -26130,9 +26494,21 @@ msgstr ""
msgid "ProjectSelect| or group"
msgstr ""
+msgid "ProjectSelect|No matching results"
+msgstr ""
+
msgid "ProjectSelect|Search for project"
msgstr ""
+msgid "ProjectSelect|Search projects"
+msgstr ""
+
+msgid "ProjectSelect|Select a project"
+msgstr ""
+
+msgid "ProjectSelect|There was an error fetching the projects. Please try again."
+msgstr ""
+
msgid "ProjectService|Drone server URL"
msgstr ""
@@ -26220,6 +26596,9 @@ msgstr ""
msgid "ProjectService|Trigger event when a new, unique alert is recorded."
msgstr ""
+msgid "ProjectService|Trigger event when a new, unique vulnerability is recorded. (Note: This feature requires an Ultimate plan.)"
+msgstr ""
+
msgid "ProjectService|Trigger event when a pipeline status changes."
msgstr ""
@@ -26634,9 +27013,15 @@ msgstr ""
msgid "Projects are graded based on the highest severity vulnerability present"
msgstr ""
+msgid "Projects are organized into groups"
+msgstr ""
+
msgid "Projects contributed to"
msgstr ""
+msgid "Projects help you organize your work. They contain your file repository, issues, merge requests, and so much more."
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr ""
@@ -26871,10 +27256,10 @@ msgstr ""
msgid "PrometheusService|Prometheus cluster integration"
msgstr ""
-msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
+msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
msgstr ""
-msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
+msgid "PrometheusService|The ID of the IAP-secured resource."
msgstr ""
msgid "PrometheusService|The Prometheus API base URL."
@@ -27492,6 +27877,9 @@ msgstr ""
msgid "Rate limit"
msgstr ""
+msgid "Rate limits can help reduce request volume (like from crawlers or abusive bots)."
+msgstr ""
+
msgid "Raw blob request rate limit per minute"
msgstr ""
@@ -27504,6 +27892,9 @@ msgstr ""
msgid "Re-authentication required"
msgstr ""
+msgid "Re-import"
+msgstr ""
+
msgid "Re-request review"
msgstr ""
@@ -27525,6 +27916,9 @@ msgstr ""
msgid "Read more about related issues"
msgstr ""
+msgid "Read their documentation."
+msgstr ""
+
msgid "Ready to get started with GitLab? Follow these steps to set up your workspace, plan and commit changes, and deploy your project."
msgstr ""
@@ -27558,6 +27952,9 @@ msgstr ""
msgid "Receive any notifications from GitLab."
msgstr ""
+msgid "Receive notification of abuse reports by email."
+msgstr ""
+
msgid "Receive notifications about your own activity"
msgstr ""
@@ -27701,9 +28098,6 @@ msgstr ""
msgid "Registry setup"
msgstr ""
-msgid "Regulate approvals by authors/committers. Affects all projects."
-msgstr ""
-
msgid "Reindexing Status: %{status} (Slice multiplier: %{multiplier}, Maximum running slices: %{max_slices})"
msgstr ""
@@ -27799,6 +28193,9 @@ msgstr ""
msgid "Release|Something went wrong while saving the release details."
msgstr ""
+msgid "Reload page"
+msgstr ""
+
msgid "Remediations"
msgstr ""
@@ -28081,6 +28478,9 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
+msgid "Repeats"
+msgstr ""
+
msgid "Replace"
msgstr ""
@@ -28443,10 +28843,7 @@ msgstr ""
msgid "Require additional authentication for administrative tasks."
msgstr ""
-msgid "Require all users in this group to setup Two-factor authentication"
-msgstr ""
-
-msgid "Require all users in this group to setup two-factor authentication"
+msgid "Require all users in this group to set up two-factor authentication"
msgstr ""
msgid "Required approvals (%{approvals_given} given)"
@@ -28492,6 +28889,9 @@ msgstr[1] ""
msgid "Requires values to meet regular expression requirements."
msgstr ""
+msgid "Requires you to deploy or set up cloud-hosted Sentry."
+msgstr ""
+
msgid "Requires your primary GitLab email address."
msgstr ""
@@ -28552,9 +28952,6 @@ msgstr ""
msgid "Resolve"
msgstr ""
-msgid "Resolve all threads in new issue"
-msgstr ""
-
msgid "Resolve conflicts"
msgstr ""
@@ -28612,6 +29009,9 @@ msgstr ""
msgid "Response text"
msgstr ""
+msgid "Restart GitLab to apply changes."
+msgstr ""
+
msgid "Restart Terminal"
msgstr ""
@@ -28630,6 +29030,9 @@ msgstr ""
msgid "Restoring the project will prevent the project from being removed on this date and restore people's ability to make changes to it."
msgstr ""
+msgid "Restrict group access by IP address. %{link_start}Learn more%{link_end}."
+msgstr ""
+
msgid "Restrict membership by email domain"
msgstr ""
@@ -28943,6 +29346,9 @@ msgstr ""
msgid "Runners|Runner #%{runner_id}"
msgstr ""
+msgid "Runners|Runner assigned to project."
+msgstr ""
+
msgid "Runners|Runner is offline, last contact was %{runner_contact} ago"
msgstr ""
@@ -28955,6 +29361,9 @@ msgstr ""
msgid "Runners|Runner registration"
msgstr ""
+msgid "Runners|Runner unassigned from project."
+msgstr ""
+
msgid "Runners|Runners"
msgstr ""
@@ -29147,7 +29556,7 @@ msgstr ""
msgid "SastEntryPoints|How do I set up SAST?"
msgstr ""
-msgid "SastEntryPoints|Learn more."
+msgid "SastEntryPoints|Learn more"
msgstr ""
msgid "Satisfied"
@@ -29189,7 +29598,7 @@ msgstr ""
msgid "Save pipeline schedule"
msgstr ""
-msgid "Save space and find images in the container Registry. remove unneeded tags and keep only the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
+msgid "Save storage space by automatically deleting tags from the container registry and keeping the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
msgstr ""
msgid "Saving"
@@ -29363,6 +29772,9 @@ msgstr ""
msgid "Search or filter results…"
msgstr ""
+msgid "Search or jump to..."
+msgstr ""
+
msgid "Search project"
msgstr ""
@@ -29423,16 +29835,16 @@ msgstr ""
msgid "SearchCodeResults|of %{link_to_project}"
msgstr ""
-msgid "SearchResults|Showing %{count} %{scope} for%{term_element}"
+msgid "SearchResults|Showing %{count} %{scope} for %{term_element}"
msgstr ""
-msgid "SearchResults|Showing %{count} %{scope} for%{term_element} in your personal and project snippets"
+msgid "SearchResults|Showing %{count} %{scope} for %{term_element} in your personal and project snippets"
msgstr ""
-msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for%{term_element}"
+msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for %{term_element}"
msgstr ""
-msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for%{term_element} in your personal and project snippets"
+msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for %{term_element} in your personal and project snippets"
msgstr ""
msgid "SearchResults|code result"
@@ -29514,6 +29926,9 @@ msgstr ""
msgid "Secret Detection"
msgstr ""
+msgid "Secret access key"
+msgstr ""
+
msgid "Secret token"
msgstr ""
@@ -29553,9 +29968,6 @@ msgstr ""
msgid "SecurityApprovals|A merge request approval is required when the license compliance report contains a denied license."
msgstr ""
-msgid "SecurityApprovals|Configurable if security scanners are enabled. %{linkStart}Learn more.%{linkEnd}"
-msgstr ""
-
msgid "SecurityApprovals|Coverage-Check"
msgstr ""
@@ -29568,24 +29980,18 @@ msgstr ""
msgid "SecurityApprovals|Learn more about Vulnerability-Check"
msgstr ""
-msgid "SecurityApprovals|License Scanning must be enabled. %{linkStart}Learn more%{linkEnd}."
-msgstr ""
-
msgid "SecurityApprovals|License-Check"
msgstr ""
msgid "SecurityApprovals|Requires approval for Denied licenses. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}More information%{linkEnd}"
+msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "SecurityApprovals|Requires approval for vulnerabilities. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
-msgid "SecurityApprovals|Test coverage must be enabled. %{linkStart}Learn more%{linkEnd}."
-msgstr ""
-
msgid "SecurityApprovals|Vulnerability-Check"
msgstr ""
@@ -29649,6 +30055,12 @@ msgstr ""
msgid "SecurityConfiguration|Immediately begin risk analysis and remediation with application security features. Start with SAST and Secret Detection, available to all plans. Upgrade to Ultimate to get all features, including:"
msgstr ""
+msgid "SecurityConfiguration|Manage corpus"
+msgstr ""
+
+msgid "SecurityConfiguration|Manage corpus files used as mutation sources in coverage fuzzing."
+msgstr ""
+
msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
msgstr ""
@@ -29703,6 +30115,12 @@ msgstr ""
msgid "SecurityOrchestration|Action"
msgstr ""
+msgid "SecurityOrchestration|Actions"
+msgstr ""
+
+msgid "SecurityOrchestration|Add rule"
+msgstr ""
+
msgid "SecurityOrchestration|All policies"
msgstr ""
@@ -29736,9 +30154,6 @@ msgstr ""
msgid "SecurityOrchestration|Network"
msgstr ""
-msgid "SecurityOrchestration|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
-msgstr ""
-
msgid "SecurityOrchestration|New policy"
msgstr ""
@@ -29754,6 +30169,9 @@ msgstr ""
msgid "SecurityOrchestration|Policy editor"
msgstr ""
+msgid "SecurityOrchestration|Policy preview"
+msgstr ""
+
msgid "SecurityOrchestration|Policy status"
msgstr ""
@@ -29763,6 +30181,9 @@ msgstr ""
msgid "SecurityOrchestration|Rule"
msgstr ""
+msgid "SecurityOrchestration|Rules"
+msgstr ""
+
msgid "SecurityOrchestration|Scan Execution"
msgstr ""
@@ -29856,6 +30277,9 @@ msgstr ""
msgid "SecurityReports|Create issue"
msgstr ""
+msgid "SecurityReports|Development vulnerabilities"
+msgstr ""
+
msgid "SecurityReports|Dismiss vulnerability"
msgstr ""
@@ -29871,6 +30295,9 @@ msgstr ""
msgid "SecurityReports|Download results"
msgstr ""
+msgid "SecurityReports|Download scanned URLs"
+msgstr ""
+
msgid "SecurityReports|Download scanned resources"
msgstr ""
@@ -29994,6 +30421,9 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
+msgid "SecurityReports|The Vulnerability Report shows the results of the lastest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "SecurityReports|The security reports below contain one or more vulnerability findings that could not be parsed and were not recorded. Download the artifacts in the job output to investigate. Ensure any security report created conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
msgstr ""
@@ -30135,10 +30565,10 @@ msgstr ""
msgid "Select a repository"
msgstr ""
-msgid "Select a role"
+msgid "Select a repository containing templates for common files."
msgstr ""
-msgid "Select a shared template repository for all projects on this instance."
+msgid "Select a role"
msgstr ""
msgid "Select a template repository"
@@ -30216,6 +30646,9 @@ msgstr ""
msgid "Select project to choose zone"
msgstr ""
+msgid "Select project to create issue"
+msgstr ""
+
msgid "Select projects"
msgstr ""
@@ -30333,6 +30766,9 @@ msgstr ""
msgid "Send emails to help guide new users through the onboarding process."
msgstr ""
+msgid "Send emails to users upon account deactivation."
+msgstr ""
+
msgid "Send message"
msgstr ""
@@ -30351,6 +30787,9 @@ msgstr ""
msgid "Send service data"
msgstr ""
+msgid "Sentry"
+msgstr ""
+
msgid "Sentry API URL"
msgstr ""
@@ -30465,6 +30904,9 @@ msgstr ""
msgid "Service"
msgstr ""
+msgid "Service Accounts keys are required to authorize GitLab to deploy your Google Cloud project."
+msgstr ""
+
msgid "Service Desk"
msgstr ""
@@ -30537,15 +30979,15 @@ msgstr ""
msgid "Set a password on your account to pull or push via %{protocol}."
msgstr ""
-msgid "Set a template repository for projects in this group"
-msgstr ""
-
msgid "Set access permissions for this token."
msgstr ""
msgid "Set an instance-wide domain that will be available to all clusters when installing Knative."
msgstr ""
+msgid "Set any rate limit to %{code_open}0%{code_close} to disable the limit."
+msgstr ""
+
msgid "Set default and restrict visibility levels. Configure import sources and git access protocol."
msgstr ""
@@ -30558,7 +31000,7 @@ msgstr ""
msgid "Set limit to 0 to allow any file size."
msgstr ""
-msgid "Set max session time for web terminal."
+msgid "Set limits for web and API requests."
msgstr ""
msgid "Set milestone"
@@ -30567,15 +31009,18 @@ msgstr ""
msgid "Set new password"
msgstr ""
-msgid "Set notification email for abuse reports."
+msgid "Set parent epic to an epic"
msgstr ""
-msgid "Set parent epic to an epic"
+msgid "Set per-user rate limits for imports and exports of projects and groups."
msgstr ""
msgid "Set projects and maximum size limits, session duration, user options, and check feature availability for namespace plan."
msgstr ""
+msgid "Set rate limits for package registry API requests that supersede the general user and IP rate limits."
+msgstr ""
+
msgid "Set severity"
msgstr ""
@@ -30594,15 +31039,24 @@ msgstr ""
msgid "Set the default branch for this project. All merge requests and commits are made against this branch unless you specify a different one."
msgstr ""
+msgid "Set the default expiration time for job artifacts in all projects. Set to %{code_open}0%{code_close} to never expire artifacts by default. If no unit is written, it defaults to seconds. For example, these are all equivalent: %{code_open}3600%{code_close}, %{code_open}60 minutes%{code_close}, or %{code_open}one hour%{code_close}."
+msgstr ""
+
msgid "Set the due date to %{due_date}."
msgstr ""
msgid "Set the iteration to %{iteration_reference}."
msgstr ""
+msgid "Set the maximum session time for a web terminal."
+msgstr ""
+
msgid "Set the milestone to %{milestone_reference}."
msgstr ""
+msgid "Set the per-user rate limit for notes created by web or API requests."
+msgstr ""
+
msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
msgstr ""
@@ -30804,6 +31258,9 @@ msgstr ""
msgid "Show Pipeline IID"
msgstr ""
+msgid "Show all %{issuable_type}."
+msgstr ""
+
msgid "Show all activity"
msgstr ""
@@ -30855,15 +31312,9 @@ msgstr ""
msgid "Show list"
msgstr ""
-msgid "Show me advanced features"
-msgstr ""
-
msgid "Show me how to add a pipeline"
msgstr ""
-msgid "Show me the basics"
-msgstr ""
-
msgid "Show one file at a time"
msgstr ""
@@ -30904,15 +31355,15 @@ msgstr ""
msgid "Showing %{pageSize} of %{total} %{issuableType}"
msgstr ""
-msgid "Showing %{pageSize} of %{total} issues"
-msgstr ""
-
msgid "Showing all epics"
msgstr ""
msgid "Showing all issues"
msgstr ""
+msgid "Showing data for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
+msgstr ""
+
msgid "Showing data for workflow items created in this date range. Date range cannot exceed %{maxDateRange} days."
msgstr ""
@@ -30952,6 +31403,15 @@ msgstr ""
msgid "Sidebar|Weight"
msgstr ""
+msgid "Sidekiq job compression threshold (bytes)"
+msgstr ""
+
+msgid "Sidekiq job size limit (bytes)"
+msgstr ""
+
+msgid "Sidekiq job size limits"
+msgstr ""
+
msgid "Sign in"
msgstr ""
@@ -31072,6 +31532,9 @@ msgstr ""
msgid "Site profile not found for given parameters"
msgstr ""
+msgid "Sites"
+msgstr ""
+
msgid "Size"
msgstr ""
@@ -31102,19 +31565,22 @@ msgstr ""
msgid "SlackIntegration|Sends notifications about project events to Slack channels."
msgstr ""
-msgid "SlackService|2. Paste the %{strong_open}Token%{strong_close} into the field below"
+msgid "SlackService|1. %{slash_command_link_start}Add a slash command%{slash_command_link_end} in your Slack team using this information:"
msgstr ""
-msgid "SlackService|3. Select the %{strong_open}Active%{strong_close} checkbox, press %{strong_open}Save changes%{strong_close} and start using GitLab inside Slack!"
+msgid "SlackService|2. Paste the token from Slack in the %{strong_open}Token%{strong_close} field below."
msgstr ""
-msgid "SlackService|Fill in the word that works best for your team."
+msgid "SlackService|3. Select the %{strong_open}Active%{strong_close} checkbox, select %{strong_open}Save changes%{strong_close}, and start using slash commands in Slack!"
+msgstr ""
+
+msgid "SlackService|After setup, get a list of available Slack slash commands by entering"
msgstr ""
-msgid "SlackService|See list of available commands in Slack after setting up this service, by entering"
+msgid "SlackService|Fill in the word that works best for your team."
msgstr ""
-msgid "SlackService|This service allows users to perform common operations on this project by entering slash commands in Slack."
+msgid "SlackService|Perform common operations in this project by entering slash commands in Slack."
msgstr ""
msgid "Slice multiplier"
@@ -31180,7 +31646,7 @@ msgstr ""
msgid "Some child epics may be hidden due to applied filters"
msgstr ""
-msgid "Some common domains are not allowed. %{read_more_link}."
+msgid "Some common domains are not allowed. %{learn_more_link}."
msgstr ""
msgid "Some of the designs you tried uploading did not change:"
@@ -31264,9 +31730,6 @@ msgstr ""
msgid "Something went wrong while exporting requirements"
msgstr ""
-msgid "Something went wrong while fetching %{listType} list"
-msgstr ""
-
msgid "Something went wrong while fetching branches"
msgstr ""
@@ -31321,15 +31784,9 @@ msgstr ""
msgid "Something went wrong while merging this merge request. Please try again."
msgstr ""
-msgid "Something went wrong while moving issues."
-msgstr ""
-
msgid "Something went wrong while obtaining the Let's Encrypt certificate."
msgstr ""
-msgid "Something went wrong while performing the action."
-msgstr ""
-
msgid "Something went wrong while promoting the issue to an epic. Please try again."
msgstr ""
@@ -31657,7 +32114,10 @@ msgstr ""
msgid "SourcegraphPreferences|Uses a custom %{linkStart}Sourcegraph instance%{linkEnd}."
msgstr ""
-msgid "Spam Check API Key"
+msgid "Spam Check"
+msgstr ""
+
+msgid "Spam Check API key"
msgstr ""
msgid "Spam Logs"
@@ -31675,7 +32135,7 @@ msgstr ""
msgid "Specified URL cannot be used: \"%{reason}\""
msgstr ""
-msgid "Specify an e-mail address regex pattern to identify default internal users."
+msgid "Specify an email address regex pattern to identify default internal users."
msgstr ""
msgid "Speed up your pipelines with Needs relationships"
@@ -31930,7 +32390,7 @@ msgstr ""
msgid "StatusCheck|An error occurred fetching the status checks."
msgstr ""
-msgid "StatusCheck|Apply this status check to any branch or a specific protected branch."
+msgid "StatusCheck|Apply this status check to all branches or a specific protected branch."
msgstr ""
msgid "StatusCheck|Check for a status response in Merge Requests. Failures do not block merges. %{link_start}Learn more%{link_end}."
@@ -32269,6 +32729,9 @@ msgstr ""
msgid "Subscriptions"
msgstr ""
+msgid "Subscription|Your subscription for %{strong}%{namespace_name}%{strong_close} has expired and you are now on %{pricing_link_start}the GitLab Free tier%{pricing_link_end}. Don't worry, your data is safe. Get in touch with our support team (%{support_email}). They'll gladly help with your subscription renewal."
+msgstr ""
+
msgid "Subtracted"
msgstr ""
@@ -32497,6 +32960,9 @@ msgstr ""
msgid "SuperSonics|Plan"
msgstr ""
+msgid "SuperSonics|Please agree to the Subscription Agreement"
+msgstr ""
+
msgid "SuperSonics|Ready to get started? A GitLab plan is ideal for scaling organizations and for multi team usage."
msgstr ""
@@ -32527,6 +32993,9 @@ msgstr ""
msgid "SuperSonics|The activation code is not valid. Please make sure to copy it exactly from the Customers Portal or confirmation email. Learn more about %{linkStart}activating your subscription%{linkEnd}."
msgstr ""
+msgid "SuperSonics|The activation code should be a 24-character alphanumeric string"
+msgstr ""
+
msgid "SuperSonics|There is a connectivity issue."
msgstr ""
@@ -32569,9 +33038,15 @@ msgstr ""
msgid "SuperSonics|You do not have an active subscription"
msgstr ""
+msgid "SuperSonics|You have successfully added a license that activates on %{date}. Please see the subscription history table below for more details."
+msgstr ""
+
msgid "SuperSonics|You'll be charged for %{trueUpLinkStart}users over license%{trueUpLinkEnd} on a quarterly or annual basis, depending on the terms of your agreement."
msgstr ""
+msgid "SuperSonics|Your future dated license was successfully added"
+msgstr ""
+
msgid "SuperSonics|Your subscription"
msgstr ""
@@ -32824,7 +33299,7 @@ msgstr ""
msgid "Template to append to all Service Desk issues"
msgstr ""
-msgid "TemplateRepository|Select a repository to make its templates available to all projects. %{link_start}What should the repository contain?%{link_end} "
+msgid "TemplateRepository|Create common files more quickly, and standardize their format."
msgstr ""
msgid "Templates"
@@ -33030,7 +33505,7 @@ msgstr ""
msgid "TestCases|Search test cases"
msgstr ""
-msgid "TestCases|Something went wrong while adding test case to Todo."
+msgid "TestCases|Something went wrong while adding test case to a to-do item."
msgstr ""
msgid "TestCases|Something went wrong while creating a test case."
@@ -33042,7 +33517,7 @@ msgstr ""
msgid "TestCases|Something went wrong while fetching test cases list."
msgstr ""
-msgid "TestCases|Something went wrong while marking test case todo as done."
+msgid "TestCases|Something went wrong while marking test case to-do item as done."
msgstr ""
msgid "TestCases|Something went wrong while moving test case."
@@ -33162,7 +33637,7 @@ msgstr ""
msgid "Thanks for your purchase!"
msgstr ""
-msgid "That is ok, I do not want to renew"
+msgid "That's OK, I don't want to renew"
msgstr ""
msgid "That's it, well done!"
@@ -33185,7 +33660,7 @@ msgid_plural "The %{type} contains the following errors:"
msgstr[0] ""
msgstr[1] ""
-msgid "The API key used by GitLab for accessing the Spam Check service endpoint"
+msgid "The API key used by GitLab for accessing the Spam Check service endpoint."
msgstr ""
msgid "The GitLab subscription service (customers.gitlab.com) is currently experiencing an outage. You can monitor the status and get updates at %{linkStart}status.gitlab.com%{linkEnd}."
@@ -33224,9 +33699,6 @@ msgstr ""
msgid "The URL to use for connecting to Elasticsearch. Use a comma-separated list to support clustering (e.g., \"http://localhost:9200, http://localhost:9201\")."
msgstr ""
-msgid "The Vulnerability Report shows the results of the last successful pipeline run on the default branch."
-msgstr ""
-
msgid "The X509 Certificate to use when mutual TLS is required to communicate with the external authorization service. If left blank, the server certificate is still validated when accessing over HTTPS."
msgstr ""
@@ -33284,9 +33756,6 @@ msgstr ""
msgid "The default branch for this project has been changed. Please update your bookmarks."
msgstr ""
-msgid "The default expiration time for job artifacts. 0 for unlimited. The default unit is in seconds, but you can use other units, for example %{code_open}4 mins 2 sec%{code_close}, %{code_open}2h42min%{code_close}."
-msgstr ""
-
msgid "The dependency list details information about the components used within your project."
msgstr ""
@@ -33478,9 +33947,6 @@ msgstr ""
msgid "The merge conflicts for this merge request have already been resolved. Please return to the merge request."
msgstr ""
-msgid "The merge request can now be merged."
-msgstr ""
-
msgid "The metric must be one of %{metrics}."
msgstr ""
@@ -33856,7 +34322,7 @@ msgstr ""
msgid "There was a problem updating the keep latest artifacts setting."
msgstr ""
-msgid "There was an error %{message} todo."
+msgid "There was an error %{message} to-do item."
msgstr ""
msgid "There was an error adding a To Do."
@@ -33895,6 +34361,9 @@ msgstr ""
msgid "There was an error fetching projects"
msgstr ""
+msgid "There was an error fetching search autocomplete suggestions"
+msgstr ""
+
msgid "There was an error fetching stage total counts"
msgstr ""
@@ -34219,6 +34688,9 @@ msgstr ""
msgid "This field is required."
msgstr ""
+msgid "This form is disabled in preview"
+msgstr ""
+
msgid "This group"
msgstr ""
@@ -34240,9 +34712,6 @@ msgstr ""
msgid "This group is linked to a subscription"
msgstr ""
-msgid "This group, including all subgroups, projects and git repositories, will be reachable from only the specified IP address ranges."
-msgstr ""
-
msgid "This group, its subgroups and projects has been scheduled for removal on %{date}."
msgstr ""
@@ -34522,9 +34991,6 @@ msgstr ""
msgid "This user cannot be unlocked manually from GitLab"
msgstr ""
-msgid "This user does not have a pending request"
-msgstr ""
-
msgid "This user has an unconfirmed email address (%{email}). You may force a confirmation."
msgstr ""
@@ -34633,9 +35099,6 @@ msgstr ""
msgid "ThreatMonitoring|Packet Activity"
msgstr ""
-msgid "ThreatMonitoring|Policies"
-msgstr ""
-
msgid "ThreatMonitoring|Requests"
msgstr ""
@@ -34687,6 +35150,12 @@ msgstr ""
msgid "ThreatMonitoring|View documentation"
msgstr ""
+msgid "Threshold in bytes at which to compress Sidekiq job arguments."
+msgstr ""
+
+msgid "Threshold in bytes at which to reject Sidekiq jobs. Set this to 0 to if you don't want to limit Sidekiq jobs."
+msgstr ""
+
msgid "Throughput"
msgstr ""
@@ -34696,6 +35165,9 @@ msgstr ""
msgid "Time"
msgstr ""
+msgid "Time (in hours) that users are allowed to skip forced configuration of two-factor authentication."
+msgstr ""
+
msgid "Time Spent"
msgstr ""
@@ -34762,7 +35234,7 @@ msgstr ""
msgid "TimeTrackingEstimated|Est"
msgstr ""
-msgid "TimeTracking|%{startTag}Spent: %{endTag}%{timeSpentHumanReadable}"
+msgid "TimeTracking|%{spentStart}Spent: %{spentEnd}"
msgstr ""
msgid "TimeTracking|Estimated:"
@@ -34976,6 +35448,9 @@ msgstr ""
msgid "To access this domain create a new DNS record"
msgstr ""
+msgid "To add a custom suffix, set up a Service Desk email address. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "To add an SSH key you need to %{generate_link_start}generate one%{link_end} or use an %{existing_link_start}existing key%{link_end}."
msgstr ""
@@ -34997,13 +35472,16 @@ msgstr ""
msgid "To connect an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To continue using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
+msgstr ""
+
msgid "To continue, you need to select the link in the confirmation email we sent to verify your email address. If you didn't get our email, select %{strongStart}Resend confirmation email.%{strongEnd}"
msgstr ""
msgid "To define internal users, first enable new users set to external"
msgstr ""
-msgid "To enable Registration Features, make sure \"Enable service ping\" is checked."
+msgid "To enable Registration Features, first enable Service Ping."
msgstr ""
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
@@ -35030,7 +35508,7 @@ msgstr ""
msgid "To get started, use the link below to confirm your account."
msgstr ""
-msgid "To help improve GitLab and its user experience, GitLab will periodically collect usage information."
+msgid "To help improve GitLab and its user experience, GitLab periodically collects usage information."
msgstr ""
msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
@@ -35063,7 +35541,7 @@ msgstr ""
msgid "To preserve performance only %{strong_open}%{display_size} of %{real_size}%{strong_close} files are displayed."
msgstr ""
-msgid "To protect this issue's confidentiality, %{forkLink} and set the fork's visibility to private."
+msgid "To protect this issue's confidentiality, %{linkStart}fork this project%{linkEnd} and set the fork's visibility to private."
msgstr ""
msgid "To protect this issue's confidentiality, a private fork of this project was selected."
@@ -35096,12 +35574,15 @@ msgstr ""
msgid "To set up SAML authentication for your group through an identity provider like Azure, Okta, Onelogin, Ping Identity, or your custom SAML 2.0 provider:"
msgstr ""
-msgid "To set up this service:"
+msgid "To set up this integration:"
msgstr ""
msgid "To specify the notification level per project of a group you belong to, you need to visit project page and change notification level there."
msgstr ""
+msgid "To start using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
+msgstr ""
+
msgid "To unsubscribe from this issue, please paste the following link into your browser:"
msgstr ""
@@ -35689,9 +36170,6 @@ msgstr ""
msgid "Unable to fetch branches list, please close the form and try again"
msgstr ""
-msgid "Unable to fetch unscanned projects"
-msgstr ""
-
msgid "Unable to fetch vulnerable projects"
msgstr ""
@@ -35746,6 +36224,15 @@ msgstr ""
msgid "Unable to update this issue at this time."
msgstr ""
+msgid "Unapprove a merge request"
+msgstr ""
+
+msgid "Unapprove the current merge request."
+msgstr ""
+
+msgid "Unapproved the current merge request."
+msgstr ""
+
msgid "Unarchive project"
msgstr ""
@@ -35758,16 +36245,13 @@ msgstr ""
msgid "Unassigned"
msgstr ""
-msgid "Unauthenticated API request rate limit"
-msgstr ""
-
-msgid "Unauthenticated rate limit period in seconds"
+msgid "Unauthenticated API rate limit period in seconds"
msgstr ""
-msgid "Unauthenticated request rate limit"
+msgid "Unauthenticated requests"
msgstr ""
-msgid "Unauthenticated requests"
+msgid "Unauthenticated web rate limit period in seconds"
msgstr ""
msgid "Undo"
@@ -35869,18 +36353,6 @@ msgstr ""
msgid "Unresolved"
msgstr ""
-msgid "UnscannedProjects|15 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|30 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|5 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|60 or more days"
-msgstr ""
-
msgid "Unschedule job"
msgstr ""
@@ -36100,6 +36572,9 @@ msgstr ""
msgid "UsageQuota|%{help_link_start}Shared runners%{help_link_end} are disabled, so there are no limits set on pipeline usage"
msgstr ""
+msgid "UsageQuota|%{linkTitle} help link"
+msgstr ""
+
msgid "UsageQuota|%{percentageLeft} of purchased storage is available"
msgstr ""
@@ -36109,6 +36584,9 @@ msgstr ""
msgid "UsageQuota|Artifacts is a sum of build and pipeline artifacts."
msgstr ""
+msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
+msgstr ""
+
msgid "UsageQuota|Buy additional minutes"
msgstr ""
@@ -36118,9 +36596,21 @@ msgstr ""
msgid "UsageQuota|CI minutes usage by project"
msgstr ""
+msgid "UsageQuota|Code packages and container images."
+msgstr ""
+
msgid "UsageQuota|Current period usage"
msgstr ""
+msgid "UsageQuota|File attachments and smaller design graphics."
+msgstr ""
+
+msgid "UsageQuota|Git repository, managed by the Gitaly service."
+msgstr ""
+
+msgid "UsageQuota|Includes project registry, artifacts, packages, wiki, uploads and other items."
+msgstr ""
+
msgid "UsageQuota|Increase storage temporarily"
msgstr ""
@@ -36139,6 +36629,9 @@ msgstr ""
msgid "UsageQuota|Packages"
msgstr ""
+msgid "UsageQuota|Pipeline artifacts and job artifacts, created with CI/CD."
+msgstr ""
+
msgid "UsageQuota|Pipelines"
msgstr ""
@@ -36157,6 +36650,9 @@ msgstr ""
msgid "UsageQuota|Seats"
msgstr ""
+msgid "UsageQuota|Shared bits of code and text."
+msgstr ""
+
msgid "UsageQuota|Snippets"
msgstr ""
@@ -36166,6 +36662,12 @@ msgstr ""
msgid "UsageQuota|Storage"
msgstr ""
+msgid "UsageQuota|Storage type"
+msgstr ""
+
+msgid "UsageQuota|There is a known issue with Artifact storage where the total could be incorrect for some projects. More details and progress are available in %{warningLinkStart}the epic%{warningLinkEnd}."
+msgstr ""
+
msgid "UsageQuota|This is the total amount of storage used across your projects within this namespace."
msgstr ""
@@ -36205,6 +36707,9 @@ msgstr ""
msgid "UsageQuota|Usage"
msgstr ""
+msgid "UsageQuota|Usage Breakdown"
+msgstr ""
+
msgid "UsageQuota|Usage Quotas"
msgstr ""
@@ -36229,6 +36734,9 @@ msgstr ""
msgid "UsageQuota|Wiki"
msgstr ""
+msgid "UsageQuota|Wiki content."
+msgstr ""
+
msgid "UsageQuota|Wikis"
msgstr ""
@@ -36445,7 +36953,10 @@ msgstr ""
msgid "User Settings"
msgstr ""
-msgid "User and IP Rate Limits"
+msgid "User and IP rate limits"
+msgstr ""
+
+msgid "User does not have a pending request"
msgstr ""
msgid "User identity was successfully created."
@@ -36742,6 +37253,9 @@ msgstr ""
msgid "Users can launch a development environment from a GitLab browser tab when the %{linkStart}Gitpod%{linkEnd} integration is enabled."
msgstr ""
+msgid "Users can reactivate their account by signing in."
+msgstr ""
+
msgid "Users can render diagrams in AsciiDoc, Markdown, reStructuredText, and Textile documents using Kroki."
msgstr ""
@@ -36757,6 +37271,9 @@ msgstr ""
msgid "Users requesting access to"
msgstr ""
+msgid "Users to exclude from the rate limit"
+msgstr ""
+
msgid "Users were successfully added."
msgstr ""
@@ -36778,6 +37295,9 @@ msgstr ""
msgid "UsersSelect|Unassigned"
msgstr ""
+msgid "Uses GitLab as a lightweight alternative to Sentry."
+msgstr ""
+
msgid "Using %{code_start}::%{code_end} denotes a %{link_start}scoped label set%{link_end}"
msgstr ""
@@ -36808,10 +37328,7 @@ msgstr ""
msgid "Value Stream Analytics can help you determine your team’s velocity"
msgstr ""
-msgid "Value Stream Analytics gives an overview of how much time it takes to go from idea to production in your project."
-msgstr ""
-
-msgid "Value may contain a variable reference"
+msgid "Value might contain a variable reference"
msgstr ""
msgid "Value stream"
@@ -36877,10 +37394,10 @@ msgstr ""
msgid "ValueStream|The Default Value Stream cannot be deleted"
msgstr ""
-msgid "Variable"
+msgid "Values that contain the %{codeStart}$%{codeEnd} character can be considered a variable reference and expanded. %{docsLinkStart}Learn more.%{docsLinkEnd}"
msgstr ""
-msgid "Variable references indicated by %{codeStart}$%{codeEnd} may be expanded. If this is not what you want, consider %{docsLinkStart}using a workaround to prevent expansion%{docsLinkEnd}."
+msgid "Variable"
msgstr ""
msgid "Variable will be masked in job logs."
@@ -37285,6 +37802,9 @@ msgstr ""
msgid "Vulnerability|Evidence"
msgstr ""
+msgid "Vulnerability|False positive detected"
+msgstr ""
+
msgid "Vulnerability|File"
msgstr ""
@@ -37327,6 +37847,9 @@ msgstr ""
msgid "Vulnerability|Status"
msgstr ""
+msgid "Vulnerability|The scanner determined this vulnerability to be a false positive. Verify the evaluation before changing its status. %{linkStart}Learn more about false positive detection.%{linkEnd}"
+msgstr ""
+
msgid "Vulnerability|The unmodified response is the original response that had no mutations done to the request"
msgstr ""
@@ -37651,9 +38174,6 @@ msgstr ""
msgid "Welcome to GitLab,%{br_tag}%{name}!"
msgstr ""
-msgid "Welcome to the guided GitLab tour"
-msgstr ""
-
msgid "Welcome, %{name}!"
msgstr ""
@@ -37672,9 +38192,6 @@ msgstr ""
msgid "What are you searching for?"
msgstr ""
-msgid "What describes you best?"
-msgstr ""
-
msgid "What does this command do?"
msgstr ""
@@ -37696,13 +38213,13 @@ msgstr ""
msgid "What is your job title? (optional)"
msgstr ""
-msgid "What will you use this group for?"
+msgid "What templates can I create?"
msgstr ""
-msgid "What's new"
+msgid "What will you use this group for?"
msgstr ""
-msgid "What’s your experience level?"
+msgid "What's new"
msgstr ""
msgid "When a deployment job is successful, skip older deployment jobs that are still pending."
@@ -37714,6 +38231,9 @@ msgstr ""
msgid "When an event in GitLab triggers a webhook, you can use the request details to figure out if something went wrong."
msgstr ""
+msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+msgstr ""
+
msgid "When inactive, an external authentication provider must be used."
msgstr ""
@@ -37737,6 +38257,9 @@ msgstr ""
msgid "When:"
msgstr ""
+msgid "Which API requests are affected?"
+msgstr ""
+
msgid "While it's rare to have no vulnerabilities, it can happen. In any event, we ask that you please double check your settings to make sure you've set up your dashboard correctly."
msgstr ""
@@ -38016,6 +38539,9 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|Work Items"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -38091,6 +38617,9 @@ msgstr ""
msgid "You are already a member of this %{member_source}."
msgstr ""
+msgid "You are already impersonating another user"
+msgstr ""
+
msgid "You are an admin, which means granting access to %{client_name} will allow them to interact with GitLab as an admin as well. Proceed with caution."
msgstr ""
@@ -38193,6 +38722,9 @@ msgstr ""
msgid "You can also use project access tokens with Git to authenticate over HTTP(S). %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "You can always change your URL later"
+msgstr ""
+
msgid "You can always edit this later"
msgstr ""
@@ -38349,10 +38881,10 @@ msgstr ""
msgid "You can’t %{tag_start}edit%{tag_end} files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
-msgid "You could not create a new trigger."
+msgid "You can’t edit files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
-msgid "You didn't renew your subscription for %{strong}%{namespace_name}%{strong_close} so it was downgraded to the free plan."
+msgid "You could not create a new trigger."
msgstr ""
msgid "You do not have any subscriptions yet"
@@ -38520,6 +39052,12 @@ msgstr ""
msgid "You must provide your current password in order to change it."
msgstr ""
+msgid "You must sign in to search for specific projects."
+msgstr ""
+
+msgid "You must sign in to search for specific terms."
+msgstr ""
+
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
@@ -38547,6 +39085,9 @@ msgstr ""
msgid "You need to upload a GitLab project export archive (ending in .gz)."
msgstr ""
+msgid "You need to verify your primary email first before enabling Two-Factor Authentication."
+msgstr ""
+
msgid "You successfully declined the invitation"
msgstr ""
@@ -38655,10 +39196,10 @@ msgstr ""
msgid "Your %{host} account was signed in to from a new location"
msgstr ""
-msgid "Your %{strong}%{plan_name}%{strong_close} subscription for %{strong}%{namespace_name}%{strong_close} will expire on %{strong}%{expires_on}%{strong_close}."
+msgid "Your %{strong}%{plan_name}%{strong_close} subscription expires on %{strong}%{expires_on}%{strong_close}. After that date, you cannot create issues or merge requests, or use many other features."
msgstr ""
-msgid "Your %{strong}%{plan_name}%{strong_close} subscription will expire on %{strong}%{expires_on}%{strong_close}. After that, you will not be able to create issues or merge requests as well as many other features."
+msgid "Your %{strong}%{plan_name}%{strong_close} subscription for %{strong}%{namespace_name}%{strong_close} will expire on %{strong}%{expires_on}%{strong_close}."
msgstr ""
msgid "Your CI/CD configuration syntax is invalid. View Lint tab for more details."
@@ -38682,7 +39223,7 @@ msgstr ""
msgid "Your GPG keys (%{count})"
msgstr ""
-msgid "Your GitLab account has been locked due to an excessive amount of unsuccessful sign in attempts. Your account will automatically unlock in %{duration} or you may click the link below to unlock now."
+msgid "Your GitLab account has been locked due to an excessive number of unsuccessful sign in attempts. You can wait for your account to automatically unlock in %{duration} or you can click the link below to unlock now."
msgstr ""
msgid "Your GitLab account request has been approved!"
@@ -38793,6 +39334,9 @@ msgstr ""
msgid "Your commit email is used for web based operations, such as edits and merges."
msgstr ""
+msgid "Your current password is required to register a two-factor authenticator app."
+msgstr ""
+
msgid "Your dashboard has been copied. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
@@ -38892,6 +39436,9 @@ msgstr ""
msgid "Your project limit is %{limit} projects! Please contact your administrator to increase it"
msgstr ""
+msgid "Your project will be created at:"
+msgstr ""
+
msgid "Your projects"
msgstr ""
@@ -38931,11 +39478,10 @@ msgstr ""
msgid "Your subscription expired!"
msgstr ""
-msgid "Your subscription has been downgraded."
-msgstr ""
-
-msgid "Your subscription will expire in %{remaining_days}."
-msgstr ""
+msgid "Your subscription will expire in %{remaining_days} day."
+msgid_plural "Your subscription will expire in %{remaining_days} days."
+msgstr[0] ""
+msgstr[1] ""
msgid "Your username is %{username}."
msgstr ""
@@ -39142,6 +39688,9 @@ msgstr ""
msgid "cannot merge"
msgstr ""
+msgid "cannot not be used for user namespace"
+msgstr ""
+
msgid "ciReport|%{degradedNum} degraded"
msgstr ""
@@ -39465,6 +40014,9 @@ msgstr ""
msgid "created %{timeAgo}"
msgstr ""
+msgid "created %{timeAgo} by %{author}"
+msgstr ""
+
msgid "created by"
msgstr ""
@@ -39509,9 +40061,6 @@ msgstr ""
msgid "does not have a supported extension. Only %{extension_list} are supported"
msgstr ""
-msgid "domain is not authorized for sign-up."
-msgstr ""
-
msgid "download it"
msgstr ""
@@ -39529,18 +40078,13 @@ msgstr ""
msgid "email '%{email}' is not a verified email."
msgstr ""
-msgid "email does not match the allowed domain of %{email_domains}"
-msgid_plural "email does not match the allowed domains: %{email_domains}"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "enabled"
msgstr ""
msgid "encrypted: needs to be a :required, :optional or :migrating!"
msgstr ""
-msgid "ending with MIME type format is not allowed."
+msgid "ending with a reserved file extension is not allowed."
msgstr ""
msgid "entries cannot be larger than 255 characters"
@@ -39564,6 +40108,9 @@ msgstr ""
msgid "estimateCommand|%{slash_command} overwrites the total estimated time."
msgstr ""
+msgid "example.com"
+msgstr ""
+
msgid "exceeds the limit of %{bytes} bytes"
msgstr ""
@@ -39614,9 +40161,6 @@ msgstr ""
msgid "fork"
msgstr ""
-msgid "fork this project"
-msgstr ""
-
msgid "from"
msgstr ""
@@ -39625,6 +40169,9 @@ msgid_plural "from %d jobs"
msgstr[0] ""
msgstr[1] ""
+msgid "frontmatter"
+msgstr ""
+
msgid "group"
msgstr ""
@@ -39652,6 +40199,9 @@ msgstr ""
msgid "has been completed."
msgstr ""
+msgid "has too deep level of nesting"
+msgstr ""
+
msgid "help"
msgstr ""
@@ -39685,9 +40235,21 @@ msgstr ""
msgid "in"
msgstr ""
+msgid "in Infrastructure :: Kubernetes clusters"
+msgstr ""
+
+msgid "in all GitLab"
+msgstr ""
+
+msgid "in group"
+msgstr ""
+
msgid "in group %{link_to_group}"
msgstr ""
+msgid "in project"
+msgstr ""
+
msgid "in project %{link_to_project}"
msgstr ""
@@ -39729,16 +40291,19 @@ msgstr ""
msgid "is not a valid X509 certificate."
msgstr ""
-msgid "is not allowed since the group is not top-level group."
+msgid "is not allowed for sign-up."
msgstr ""
-msgid "is not allowed. Try again with a different email address, or contact your GitLab admin."
+msgid "is not allowed for this group."
msgstr ""
-msgid "is not allowed. We do not currently support project-level iterations"
+msgid "is not allowed for this project."
+msgstr ""
+
+msgid "is not allowed since the group is not top-level group."
msgstr ""
-msgid "is not from an allowed domain."
+msgid "is not allowed. We do not currently support project-level iterations"
msgstr ""
msgid "is not in the group enforcing Group Managed Account"
@@ -39831,6 +40396,9 @@ msgstr ""
msgid "log in"
msgstr ""
+msgid "managed"
+msgstr ""
+
msgid "manual"
msgstr ""
@@ -39878,6 +40446,9 @@ msgstr ""
msgid "mrWidget| Please restore it or use a different %{missingBranchName} branch"
msgstr ""
+msgid "mrWidget|%{linkStart}Set up now%{linkEnd} to analyze your source code for known security vulnerabilities."
+msgstr ""
+
msgid "mrWidget|%{mergeError}."
msgstr ""
@@ -39958,6 +40529,9 @@ msgid_plural "mrWidget|Closes issues"
msgstr[0] ""
msgstr[1] ""
+msgid "mrWidget|Create issue to resolve all threads"
+msgstr ""
+
msgid "mrWidget|Delete source branch"
msgstr ""
@@ -39967,12 +40541,18 @@ msgstr ""
msgid "mrWidget|Did not close"
msgstr ""
+msgid "mrWidget|Dismiss"
+msgstr ""
+
msgid "mrWidget|Email patches"
msgstr ""
msgid "mrWidget|Failed to load deployment statistics"
msgstr ""
+msgid "mrWidget|Hide %{widget} details"
+msgstr ""
+
msgid "mrWidget|If the %{missingBranchName} branch exists in your local repository, you can merge this merge request manually using the command line"
msgstr ""
@@ -40068,9 +40648,6 @@ msgstr ""
msgid "mrWidget|Request to merge"
msgstr ""
-msgid "mrWidget|Resolve all threads in new issue"
-msgstr ""
-
msgid "mrWidget|Resolve conflicts"
msgstr ""
@@ -40086,6 +40663,9 @@ msgstr ""
msgid "mrWidget|Revoke approval"
msgstr ""
+msgid "mrWidget|SAST and Secret Detection is not enabled."
+msgstr ""
+
msgid "mrWidget|Set by %{merge_author} to be added to the merge train when the pipeline succeeds"
msgstr ""
@@ -40095,6 +40675,9 @@ msgstr ""
msgid "mrWidget|Set by %{merge_author} to start a merge train when the pipeline succeeds"
msgstr ""
+msgid "mrWidget|Show %{widget} details"
+msgstr ""
+
msgid "mrWidget|The changes were merged into"
msgstr ""
@@ -40107,6 +40690,9 @@ msgstr ""
msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure, or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
msgstr ""
+msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure."
+msgstr ""
+
msgid "mrWidget|The source branch has been deleted"
msgstr ""
@@ -40149,6 +40735,9 @@ msgstr ""
msgid "mrWidget|You can merge after removing denied licenses"
msgstr ""
+msgid "mrWidget|You can only merge once this merge request is approved."
+msgstr ""
+
msgid "mrWidget|Your password"
msgstr ""
@@ -40185,6 +40774,9 @@ msgstr ""
msgid "must be less than the limit of %{tag_limit} tags"
msgstr ""
+msgid "must be set for a project namespace"
+msgstr ""
+
msgid "must be unique by status and elapsed time within a policy"
msgstr ""
@@ -40294,6 +40886,9 @@ msgstr ""
msgid "pipeline"
msgstr ""
+msgid "pipeline schedules documentation"
+msgstr ""
+
msgid "pod_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
msgstr ""
@@ -40343,16 +40938,25 @@ msgstr ""
msgid "project name"
msgstr ""
+msgid "project namespace cannot be the parent of another namespace"
+msgstr ""
+
msgid "projects"
msgstr ""
msgid "quick actions"
msgstr ""
-msgid "reCAPTCHA Private Key"
+msgid "reCAPTCHA"
+msgstr ""
+
+msgid "reCAPTCHA helps prevent credential stuffing."
msgstr ""
-msgid "reCAPTCHA Site Key"
+msgid "reCAPTCHA private key"
+msgstr ""
+
+msgid "reCAPTCHA site key"
msgstr ""
msgid "recent activity"
@@ -40579,6 +41183,9 @@ msgstr ""
msgid "user avatar"
msgstr ""
+msgid "user namespace cannot be the parent of another namespace"
+msgstr ""
+
msgid "user preferences"
msgstr ""
@@ -40671,3 +41278,9 @@ msgstr ""
msgid "your settings"
msgstr ""
+msgid "{group}"
+msgstr ""
+
+msgid "{project}"
+msgstr ""
+
diff --git a/locale/fil_PH/gitlab.po b/locale/fil_PH/gitlab.po
index f08e104b3f0..5ddc2beb665 100644
--- a/locale/fil_PH/gitlab.po
+++ b/locale/fil_PH/gitlab.po
@@ -14,10 +14,7 @@ msgstr ""
"X-Crowdin-Language: fil\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-09-01 22:31\n"
-
-msgid " %{name}, confirm your email address now! "
-msgstr ""
+"PO-Revision-Date: 2021-10-04 20:19\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -92,6 +89,16 @@ msgstr ""
msgid "#general, #development"
msgstr ""
+msgid "%d Alert"
+msgid_plural "%d Alerts"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d Alert:"
+msgid_plural "%d Alerts:"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d Approval"
msgid_plural "%d Approvals"
msgstr[0] ""
@@ -455,7 +462,10 @@ msgstr ""
msgid "%{code_open}Protected:%{code_close} Only exposed to protected branches or tags."
msgstr ""
-msgid "%{commit_author_link} authored %{commit_timeago}"
+msgid "%{commit_author_link} authored %{commit_authored_timeago}"
+msgstr ""
+
+msgid "%{commit_author_link} authored %{commit_authored_timeago} and %{commit_committer_avatar} %{commit_committer_link} committed %{commit_committer_timeago}"
msgstr ""
msgid "%{completedCount} completed weight"
@@ -549,6 +559,15 @@ msgstr ""
msgid "%{doc_link_start}Advanced search%{doc_link_end} is enabled."
msgstr ""
+msgid "%{docs_link_start}Learn about visibility levels.%{docs_link_end}"
+msgstr ""
+
+msgid "%{docs_link_start}What is Large File Storage?%{docs_link_end}"
+msgstr ""
+
+msgid "%{docs_link_start}What is two-factor authentication?%{docs_link_end}"
+msgstr ""
+
msgid "%{due_date} (Past due)"
msgstr ""
@@ -621,9 +640,6 @@ msgstr ""
msgid "%{issueType} actions"
msgstr ""
-msgid "%{issuesCount} issues with a limit of %{maxIssueCount}"
-msgstr ""
-
msgid "%{issuesSize} with a limit of %{maxIssueCount}"
msgstr ""
@@ -681,6 +697,12 @@ msgstr ""
msgid "%{label_for_message} unavailable"
msgstr ""
+msgid "%{learn_more_link}."
+msgstr ""
+
+msgid "%{lessThan} 1 hour"
+msgstr ""
+
msgid "%{lets_encrypt_link_start}Let's Encrypt%{lets_encrypt_link_end} is a free, automated, and open certificate authority (CA) that issues digital certificates to enable HTTPS (SSL/TLS) for sites."
msgstr ""
@@ -693,15 +715,15 @@ msgstr ""
msgid "%{link_start}Learn more%{link_end} about roles."
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
-msgstr ""
-
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
msgstr ""
msgid "%{link_start}Start the title with %{draft_snippet}%{link_end} to prevent a merge request that is a work in progress from being merged before it's ready."
msgstr ""
+msgid "%{link_start}What information does GitLab Inc. collect?%{link_end}"
+msgstr ""
+
msgid "%{listToShow}, and %{awardsListLength} more"
msgstr ""
@@ -854,7 +876,7 @@ msgid_plural "%{securityScanner} results are not available because a pipeline ha
msgstr[0] ""
msgstr[1] ""
-msgid "%{service_ping_link_start}Learn more%{service_ping_link_end} about what information is shared with GitLab Inc."
+msgid "%{service_ping_link_start}What information is shared with GitLab Inc.?%{service_ping_link_end}"
msgstr ""
msgid "%{size} %{unit}"
@@ -890,6 +912,9 @@ msgstr ""
msgid "%{state} epics"
msgstr ""
+msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
+msgstr ""
+
msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
msgstr ""
@@ -949,11 +974,6 @@ msgstr ""
msgid "%{template_project_id} is unknown or invalid"
msgstr ""
-msgid "%{text} %{files}"
-msgid_plural "%{text} %{files} files"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%{text} is available"
msgstr ""
@@ -1038,9 +1058,6 @@ msgstr ""
msgid "%{wildcards_link_start}Wildcards%{wildcards_link_end} such as %{code_tag_start}v*%{code_tag_end} or %{code_tag_start}*-release%{code_tag_end} are supported."
msgstr ""
-msgid "&lt; 1 hour"
-msgstr ""
-
msgid "'%{data}' at %{location} does not match format: %{format}"
msgstr ""
@@ -1124,9 +1141,6 @@ msgstr ""
msgid "(we need your current password to confirm your changes)"
msgstr ""
-msgid "* * * * *"
-msgstr ""
-
msgid "+ %{amount} more"
msgstr ""
@@ -1193,10 +1207,10 @@ msgstr ""
msgid "."
msgstr ""
-msgid "0 bytes"
+msgid "/"
msgstr ""
-msgid "0 for unlimited, only effective with remote storage enabled."
+msgid "0 bytes"
msgstr ""
msgid "0t1DgySidms"
@@ -1326,6 +1340,9 @@ msgstr ""
msgid "1000+"
msgstr ""
+msgid "192.168.0.0/24"
+msgstr ""
+
msgid "1st contribution!"
msgstr ""
@@ -1479,9 +1496,6 @@ msgstr ""
msgid "A plain HTML site that uses Netlify for CI/CD instead of GitLab, but still with all the other great GitLab features"
msgstr ""
-msgid "A plain-text response to show to clients that hit the rate limit."
-msgstr ""
-
msgid "A platform value can be web, mob or app."
msgstr ""
@@ -1563,7 +1577,7 @@ msgstr ""
msgid "APIFuzzing|Configure HTTP basic authentication values. Other authentication methods are supported. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
+msgid "APIFuzzing|Customize your project's API fuzzing configuration options and copy the code snippet to your .gitlab-ci.yml file to apply any changes. Note that this tool does not reflect or update your .gitlab-ci.yml file automatically. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
msgstr ""
msgid "APIFuzzing|Enable authentication"
@@ -1626,9 +1640,6 @@ msgstr ""
msgid "APIFuzzing|To prevent a security leak, authentication info must be added as a %{ciVariablesLinkStart}CI variable%{ciVariablesLinkEnd}. As a user with maintainer access rights, you can manage CI variables in the %{ciSettingsLinkStart}Settings%{ciSettingsLinkEnd} area."
msgstr ""
-msgid "APIFuzzing|Use this tool to generate API fuzzing configuration YAML to copy into your .gitlab-ci.yml file. This tool does not reflect or update your .gitlab-ci.yml file automatically."
-msgstr ""
-
msgid "APIFuzzing|Username for basic authentication"
msgstr ""
@@ -1680,9 +1691,6 @@ msgstr ""
msgid "Abuse reports notification email"
msgstr ""
-msgid "Abuse reports will be sent to this address if it is set. Abuse reports are always available in the admin area."
-msgstr ""
-
msgid "Accept invitation"
msgstr ""
@@ -1719,12 +1727,18 @@ msgstr ""
msgid "Access granted"
msgstr ""
+msgid "Access key ID"
+msgstr ""
+
msgid "Access requests"
msgstr ""
msgid "Access to '%{classification_label}' not allowed"
msgstr ""
+msgid "Access tokens expire after 2 hours. A refresh token may be used at any time to generate a new access token. Non-expiring access tokens are deprecated. Clear this setting to enable backward compatibility."
+msgstr ""
+
msgid "AccessDropdown|Deploy Keys"
msgstr ""
@@ -2037,6 +2051,9 @@ msgstr ""
msgid "Add new directory"
msgstr ""
+msgid "Add new service account"
+msgstr ""
+
msgid "Add or remove previously merged commits"
msgstr ""
@@ -2274,6 +2291,9 @@ msgstr ""
msgid "AdminArea|Features"
msgstr ""
+msgid "AdminArea|Get security updates from GitLab and stay up to date"
+msgstr ""
+
msgid "AdminArea|Groups"
msgstr ""
@@ -2313,6 +2333,12 @@ msgstr ""
msgid "AdminArea|Reporter"
msgstr ""
+msgid "AdminArea|Sign up for the GitLab Security Newsletter to get notified for security updates."
+msgstr ""
+
+msgid "AdminArea|Sign up for the GitLab newsletter"
+msgstr ""
+
msgid "AdminArea|Stop all jobs"
msgstr ""
@@ -2382,9 +2408,15 @@ msgstr ""
msgid "AdminSettings|Disable public access to Pages sites"
msgstr ""
+msgid "AdminSettings|Display a banner on merge requests in projects with no pipelines to initiate steps to add a .gitlab-ci.yml file."
+msgstr ""
+
msgid "AdminSettings|Domain verification is an essential security measure for public GitLab sites. Users are required to demonstrate they control a domain before it is enabled. %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "AdminSettings|Enable pipeline suggestion banner"
+msgstr ""
+
msgid "AdminSettings|Enable shared runners for new projects"
msgstr ""
@@ -2856,10 +2888,10 @@ msgstr ""
msgid "Admin|Quarterly reconciliation will occur on %{qrtlyDate}"
msgstr ""
-msgid "Admin|The number of max seats used for your namespace is currently exceeding the number of seats in your subscription. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgid "Admin|The number of max seats in your namespace exceeds the number of seats in your subscription. On %{qrtlyDate}, quarterly reconciliation occurs and you are automatically billed a prorated amount for the overage. No action is needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice. For more information about the timing of the invoicing process, view the documentation."
msgstr ""
-msgid "Admin|The number of maximum users for your instance is currently exceeding the number of users in license. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgid "Admin|The number of max users in your instance exceeds the number of users in your license. On %{qrtlyDate}, quarterly reconciliation occurs and you are automatically billed a prorated amount for the overage. No action is needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice. For more information about the timing of the invoicing process, view the documentation."
msgstr ""
msgid "Admin|View pending user approvals"
@@ -2880,9 +2912,6 @@ msgstr ""
msgid "Advanced export options"
msgstr ""
-msgid "Advanced permissions, Large File Storage and Two-Factor authentication settings."
-msgstr ""
-
msgid "After a successful password update you will be redirected to login screen."
msgstr ""
@@ -2901,13 +2930,14 @@ msgstr ""
msgid "After you've reviewed these contribution guidelines, you'll be all set to"
msgstr ""
+msgid "Akismet"
+msgstr ""
+
msgid "Akismet API Key"
msgstr ""
-msgid "Alert"
-msgid_plural "Alerts"
-msgstr[0] ""
-msgstr[1] ""
+msgid "Akismet helps prevent the creation of spam issues in public projects."
+msgstr ""
msgid "AlertManagement|Acknowledged"
msgstr ""
@@ -3263,6 +3293,9 @@ msgstr ""
msgid "All (default)"
msgstr ""
+msgid "All GitLab"
+msgstr ""
+
msgid "All Members"
msgstr ""
@@ -3377,6 +3410,9 @@ msgstr ""
msgid "Allow this secondary node to replicate content on Object Storage"
msgstr ""
+msgid "Allow use of licensed EE features"
+msgstr ""
+
msgid "Allow users to dismiss the broadcast message"
msgstr ""
@@ -3452,9 +3488,6 @@ msgstr ""
msgid "Amazon authentication is not %{link_start}correctly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
-msgid "Amount of time (in hours) that users are allowed to skip forced configuration of two-factor authentication"
-msgstr ""
-
msgid "An %{link_start}alert%{link_end} with the same fingerprint is already open. To change the status of this alert, resolve the linked alert."
msgstr ""
@@ -3515,12 +3548,6 @@ msgstr ""
msgid "An error occurred when removing the label."
msgstr ""
-msgid "An error occurred when toggling the notification subscription"
-msgstr ""
-
-msgid "An error occurred when updating the issue weight"
-msgstr ""
-
msgid "An error occurred when updating the title"
msgstr ""
@@ -3569,6 +3596,9 @@ msgstr ""
msgid "An error occurred while enabling Service Desk."
msgstr ""
+msgid "An error occurred while fetching Markdown preview"
+msgstr ""
+
msgid "An error occurred while fetching ancestors"
msgstr ""
@@ -3599,9 +3629,6 @@ msgstr ""
msgid "An error occurred while fetching label colors."
msgstr ""
-msgid "An error occurred while fetching markdown preview"
-msgstr ""
-
msgid "An error occurred while fetching participants"
msgstr ""
@@ -3617,9 +3644,6 @@ msgstr ""
msgid "An error occurred while fetching reference"
msgstr ""
-msgid "An error occurred while fetching sidebar data"
-msgstr ""
-
msgid "An error occurred while fetching tags. Retry the search."
msgstr ""
@@ -3695,6 +3719,9 @@ msgstr ""
msgid "An error occurred while loading merge requests."
msgstr ""
+msgid "An error occurred while loading projects."
+msgstr ""
+
msgid "An error occurred while loading the Needs tab."
msgstr ""
@@ -3929,12 +3956,6 @@ msgstr ""
msgid "Any Milestone"
msgstr ""
-msgid "Any branch"
-msgstr ""
-
-msgid "Any eligible user"
-msgstr ""
-
msgid "Any encrypted tokens"
msgstr ""
@@ -3953,6 +3974,9 @@ msgstr ""
msgid "Any namespace"
msgstr ""
+msgid "App Engine description and apps that are suitable for this deployment target"
+msgstr ""
+
msgid "App ID"
msgstr ""
@@ -4101,6 +4125,11 @@ msgstr ""
msgid "Apply"
msgstr ""
+msgid "Apply %d suggestion"
+msgid_plural "Apply %d suggestions"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Apply a label"
msgstr ""
@@ -4110,13 +4139,10 @@ msgstr ""
msgid "Apply suggestion"
msgstr ""
-msgid "Apply suggestions"
-msgstr ""
-
msgid "Apply template"
msgstr ""
-msgid "Apply this approval rule to any branch or a specific protected branch."
+msgid "Apply this approval rule to all branches or a specific protected branch."
msgstr ""
msgid "Applying"
@@ -4259,9 +4285,6 @@ msgstr ""
msgid "ApprovalSettings|Prevent editing approval rules in projects and merge requests."
msgstr ""
-msgid "ApprovalSettings|Prevent editing approval rules in projects and merge requests. "
-msgstr ""
-
msgid "ApprovalSettings|Remove all approvals when commits are added to the source branch."
msgstr ""
@@ -4277,6 +4300,9 @@ msgstr ""
msgid "ApprovalSettings|This setting is configured at the instance level and can only be changed by an administrator."
msgstr ""
+msgid "ApprovalSettings|This setting is configured in %{groupName} and can only be changed by an administrator or group owner."
+msgstr ""
+
msgid "ApprovalStatusTooltip|Adheres to separation of duties"
msgstr ""
@@ -4763,9 +4789,6 @@ msgstr ""
msgid "Authenticated API rate limit period in seconds"
msgstr ""
-msgid "Authenticated API request rate limit"
-msgstr ""
-
msgid "Authenticated API requests"
msgstr ""
@@ -4775,10 +4798,10 @@ msgstr ""
msgid "Authenticated Git LFS request rate limit"
msgstr ""
-msgid "Authenticated web rate limit period in seconds"
+msgid "Authenticated Git LFS requests"
msgstr ""
-msgid "Authenticated web request rate limit"
+msgid "Authenticated web rate limit period in seconds"
msgstr ""
msgid "Authenticated web requests"
@@ -5156,9 +5179,6 @@ msgstr ""
msgid "Below you will find all the groups that are public."
msgstr ""
-msgid "Beta"
-msgstr ""
-
msgid "Bi-weekly code coverage"
msgstr ""
@@ -5398,6 +5418,21 @@ msgstr ""
msgid "Board scope affects which issues are displayed for anyone who visits this board"
msgstr ""
+msgid "BoardNewEpic|Groups"
+msgstr ""
+
+msgid "BoardNewEpic|Loading groups"
+msgstr ""
+
+msgid "BoardNewEpic|No matching results"
+msgstr ""
+
+msgid "BoardNewEpic|Search groups"
+msgstr ""
+
+msgid "BoardNewEpic|Select a group"
+msgstr ""
+
msgid "BoardNewIssue|No matching results"
msgstr ""
@@ -5475,6 +5510,9 @@ msgstr ""
msgid "Boards|An error occurred while creating the list. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching child groups. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching group projects. Please try again."
msgstr ""
@@ -5807,6 +5845,9 @@ msgstr ""
msgid "Bulk update"
msgstr ""
+msgid "BulkImports|Re-import creates a new group. It does not sync with the existing group."
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -5816,6 +5857,9 @@ msgstr ""
msgid "BulkImport|From source group"
msgstr ""
+msgid "BulkImport|Group import history"
+msgstr ""
+
msgid "BulkImport|Import failed: Destination cannot be a subgroup of the source group. Change the destination and try again."
msgstr ""
@@ -5828,9 +5872,18 @@ msgstr ""
msgid "BulkImport|Importing the group failed"
msgstr ""
+msgid "BulkImport|Last imported to %{link}"
+msgstr ""
+
msgid "BulkImport|Name already exists."
msgstr ""
+msgid "BulkImport|New group"
+msgstr ""
+
+msgid "BulkImport|No history is available"
+msgstr ""
+
msgid "BulkImport|No parent"
msgstr ""
@@ -5843,6 +5896,9 @@ msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} matching filter \"%{filter}\" from %{link}"
msgstr ""
+msgid "BulkImport|Source group"
+msgstr ""
+
msgid "BulkImport|To new group"
msgstr ""
@@ -5852,6 +5908,9 @@ msgstr ""
msgid "BulkImport|You have no groups to import"
msgstr ""
+msgid "BulkImport|Your imported groups will appear here."
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -6094,6 +6153,9 @@ msgstr ""
msgid "Can be manually deployed to"
msgstr ""
+msgid "Can be overridden in each project."
+msgstr ""
+
msgid "Can create groups:"
msgstr ""
@@ -6196,6 +6258,9 @@ msgstr ""
msgid "Cancelling Preview"
msgstr ""
+msgid "Cannot assign a confidential epic to a non-confidential issue. Make the issue confidential and try again"
+msgstr ""
+
msgid "Cannot be assigned to other projects."
msgstr ""
@@ -6247,9 +6312,6 @@ msgstr ""
msgid "Cannot refer to a group %{timebox_type} by an internal id!"
msgstr ""
-msgid "Cannot set confidential epic for a non-confidential issue"
-msgstr ""
-
msgid "Cannot show preview. For previews on sketch files, they must have the file format introduced by Sketch version 43 and above."
msgstr ""
@@ -6487,15 +6549,15 @@ msgstr ""
msgid "Check out, review, and merge locally"
msgstr ""
-msgid "Check the %{docs_link_start}documentation%{docs_link_end}."
-msgstr ""
-
msgid "Check the current instance configuration "
msgstr ""
msgid "Check the elasticsearch.log file to debug why the migration was halted and make any changes before retrying the migration. When you fix the cause of the failure, click \"Retry migration\", and the migration will be scheduled to be retried in the background."
msgstr ""
+msgid "Check with your administrator."
+msgstr ""
+
msgid "Check your Docker images for known vulnerabilities."
msgstr ""
@@ -6526,6 +6588,9 @@ msgstr ""
msgid "Checkout"
msgstr ""
+msgid "Checkout|$%{selectedPlanPrice} per 10 GB storage per pack"
+msgstr ""
+
msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 minutes"
msgstr ""
@@ -6546,17 +6611,23 @@ msgstr ""
msgid "Checkout|%{name}'s GitLab subscription"
msgstr ""
-msgid "Checkout|%{selectedPlanText} plan"
+msgid "Checkout|%{name}'s storage subscription"
msgstr ""
-msgid "Checkout|%{startDate} - %{endDate}"
+msgid "Checkout|%{quantity} GB of storage"
msgstr ""
-msgid "Checkout|%{totalCiMinutes} CI minute"
-msgid_plural "Checkout|%{totalCiMinutes} CI minutes"
+msgid "Checkout|%{quantity} storage pack"
+msgid_plural "Checkout|%{quantity} storage packs"
msgstr[0] ""
msgstr[1] ""
+msgid "Checkout|%{selectedPlanText} plan"
+msgstr ""
+
+msgid "Checkout|%{startDate} - %{endDate}"
+msgstr ""
+
msgid "Checkout|%{totalCiMinutes} CI minutes"
msgstr ""
@@ -6632,6 +6703,9 @@ msgstr ""
msgid "Checkout|Failed to register credit card. Please try again."
msgstr ""
+msgid "Checkout|GB"
+msgstr ""
+
msgid "Checkout|GitLab group"
msgstr ""
@@ -6668,6 +6742,9 @@ msgstr ""
msgid "Checkout|State"
msgstr ""
+msgid "Checkout|Storage packs"
+msgstr ""
+
msgid "Checkout|Street address"
msgstr ""
@@ -6689,6 +6766,9 @@ msgstr ""
msgid "Checkout|Total minutes: %{quantity}"
msgstr ""
+msgid "Checkout|Total storage: %{quantity} GB"
+msgstr ""
+
msgid "Checkout|Users"
msgstr ""
@@ -6698,16 +6778,25 @@ msgstr ""
msgid "Checkout|Your organization"
msgstr ""
+msgid "Checkout|Your storage subscription has the same term as your main subscription, and the price is prorated accordingly."
+msgstr ""
+
msgid "Checkout|Your subscription will be applied to this group"
msgstr ""
msgid "Checkout|Zip code"
msgstr ""
+msgid "Checkout|a storage subscription"
+msgstr ""
+
msgid "Checkout|company or team"
msgstr ""
-msgid "Checkout|x 1,000 minutes per pack = %{strong}"
+msgid "Checkout|minutes"
+msgstr ""
+
+msgid "Checkout|x %{quantity} %{units} per pack ="
msgstr ""
msgid "Cherry-pick this commit"
@@ -7064,6 +7153,9 @@ msgstr ""
msgid "CloneIssue|Cannot clone issue to target project as it is pending deletion."
msgstr ""
+msgid "CloneIssue|Cannot clone issues of '%{issue_type}' type."
+msgstr ""
+
msgid "Cloned this issue to %{path_to_project}."
msgstr ""
@@ -7118,7 +7210,10 @@ msgstr ""
msgid "Closes this %{quick_action_target}."
msgstr ""
-msgid "Cloud licenses can not be removed."
+msgid "Cloud Functions description and apps that are suitable for this deployment target"
+msgstr ""
+
+msgid "Cloud Run description and apps that are suitable for this deployment target"
msgstr ""
msgid "Cluster"
@@ -7145,6 +7240,12 @@ msgstr ""
msgid "ClusterAgents|Access tokens"
msgstr ""
+msgid "ClusterAgents|Agent might not be connected to GitLab"
+msgstr ""
+
+msgid "ClusterAgents|Agent never connected to GitLab"
+msgstr ""
+
msgid "ClusterAgents|Alternative installation methods"
msgstr ""
@@ -7160,6 +7261,12 @@ msgstr ""
msgid "ClusterAgents|Configuration"
msgstr ""
+msgid "ClusterAgents|Connected"
+msgstr ""
+
+msgid "ClusterAgents|Connection status"
+msgstr ""
+
msgid "ClusterAgents|Copy token"
msgstr ""
@@ -7178,6 +7285,9 @@ msgstr ""
msgid "ClusterAgents|For alternative installation methods %{linkStart}go to the documentation%{linkEnd}."
msgstr ""
+msgid "ClusterAgents|For more troubleshooting information go to"
+msgstr ""
+
msgid "ClusterAgents|Go to the repository"
msgstr ""
@@ -7193,18 +7303,30 @@ msgstr ""
msgid "ClusterAgents|Integrate with the GitLab Agent"
msgstr ""
-msgid "ClusterAgents|Last used"
+msgid "ClusterAgents|Last connected %{timeAgo}."
+msgstr ""
+
+msgid "ClusterAgents|Last contact"
msgstr ""
msgid "ClusterAgents|Learn how to create an agent access token"
msgstr ""
+msgid "ClusterAgents|Make sure you are using a valid token."
+msgstr ""
+
msgid "ClusterAgents|Name"
msgstr ""
msgid "ClusterAgents|Never"
msgstr ""
+msgid "ClusterAgents|Never connected"
+msgstr ""
+
+msgid "ClusterAgents|Not connected"
+msgstr ""
+
msgid "ClusterAgents|Read more about getting started"
msgstr ""
@@ -7226,6 +7348,9 @@ msgstr ""
msgid "ClusterAgents|Select which Agent you want to install"
msgstr ""
+msgid "ClusterAgents|The Agent has not been connected in a long time. There might be a connectivity issue. Last contact was %{timeAgo}."
+msgstr ""
+
msgid "ClusterAgents|The GitLab Agent also requires %{linkStart}enabling the Agent Server%{linkEnd}"
msgstr ""
@@ -7253,9 +7378,6 @@ msgstr ""
msgid "ClusterAgents|You will need to create a token to connect to your agent"
msgstr ""
-msgid "ClusterAgent|This feature is only available for premium plans"
-msgstr ""
-
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -7445,9 +7567,6 @@ msgstr ""
msgid "ClusterIntegration|Create Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Create a provision role on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the account and external ID above. %{startMoreInfoLink}More information%{endLink}"
-msgstr ""
-
msgid "ClusterIntegration|Create cluster on"
msgstr ""
@@ -7880,7 +7999,7 @@ msgstr ""
msgid "ClusterIntegration|Subnets"
msgstr ""
-msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provisioned role, first create one on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the above account and external IDs. %{startMoreInfoLink}More information%{endLink}"
+msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provisioned role, first create one on %{awsLinkStart}Amazon Web Services %{awsLinkEnd} using the above account and external IDs. %{moreInfoStart}More information%{moreInfoEnd}"
msgstr ""
msgid "ClusterIntegration|The Kubernetes certificate used to authenticate to the cluster."
@@ -8114,6 +8233,9 @@ msgstr ""
msgid "Collapse replies"
msgstr ""
+msgid "Collapse settings section"
+msgstr ""
+
msgid "Collapse sidebar"
msgstr ""
@@ -8132,6 +8254,9 @@ msgstr ""
msgid "Comma-separated list of email addresses."
msgstr ""
+msgid "Comma-separated list of users allowed to exceed the rate limit."
+msgstr ""
+
msgid "Comma-separated, e.g. '1.1.1.1, 2.2.2.0/24'"
msgstr ""
@@ -8452,6 +8577,9 @@ msgstr ""
msgid "Configure %{repository_checks_link_start}repository checks%{link_end} and %{housekeeping_link_start}housekeeping%{link_end} on repositories."
msgstr ""
+msgid "Configure CAPTCHAs, IP address limits, and other anti-spam measures."
+msgstr ""
+
msgid "Configure Dependency Scanning in `.gitlab-ci.yml` using the GitLab managed template. You can [add variable overrides](https://docs.gitlab.com/ee/user/application_security/dependency_scanning/#customizing-the-dependency-scanning-settings) to customize Dependency Scanning settings."
msgstr ""
@@ -8488,16 +8616,13 @@ msgstr ""
msgid "Configure a %{codeStart}.gitlab-webide.yml%{codeEnd} file in the %{codeStart}.gitlab%{codeEnd} directory to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
msgstr ""
-msgid "Configure existing installation"
-msgstr ""
-
-msgid "Configure limit for notes created per minute by web and API requests."
+msgid "Configure advanced permissions, Large File Storage, and two-factor authentication settings."
msgstr ""
-msgid "Configure limits for Project/Group Import/Export."
+msgid "Configure approvals by authors and committers on all projects."
msgstr ""
-msgid "Configure limits for web and API requests."
+msgid "Configure existing installation"
msgstr ""
msgid "Configure paths to be protected by Rack Attack."
@@ -8512,10 +8637,13 @@ msgstr ""
msgid "Configure settings for Advanced Search with Elasticsearch."
msgstr ""
+msgid "Configure specific limits for Files API requests that supersede the general user and IP rate limits."
+msgstr ""
+
msgid "Configure specific limits for Git LFS requests that supersede the general user and IP rate limits."
msgstr ""
-msgid "Configure specific limits for Packages API requests that supersede the general user and IP rate limits."
+msgid "Configure specific limits for deprecated API requests that supersede the general user and IP rate limits."
msgstr ""
msgid "Configure the %{link} integration."
@@ -8527,6 +8655,9 @@ msgstr ""
msgid "Configure the way a user creates a new account."
msgstr ""
+msgid "Configure via Merge Request"
+msgstr ""
+
msgid "Configure which lists are shown for anyone who visits this board"
msgstr ""
@@ -8995,6 +9126,9 @@ msgstr ""
msgid "Content parsed with %{link}."
msgstr ""
+msgid "ContentEditor|Table of Contents"
+msgstr ""
+
msgid "ContentEditor|You have to provide a renderMarkdown function or a custom serializer"
msgstr ""
@@ -9181,6 +9315,9 @@ msgstr ""
msgid "Copy link to chart"
msgstr ""
+msgid "Copy prefix"
+msgstr ""
+
msgid "Copy reference"
msgstr ""
@@ -9211,6 +9348,9 @@ msgstr ""
msgid "Copy value"
msgstr ""
+msgid "Corpus Management"
+msgstr ""
+
msgid "Corpus Management|Are you sure you want to delete the corpus?"
msgstr ""
@@ -9439,6 +9579,9 @@ msgstr ""
msgid "Create commit"
msgstr ""
+msgid "Create common files more quickly, and standardize their format."
+msgstr ""
+
msgid "Create confidential merge request"
msgstr ""
@@ -9472,6 +9615,9 @@ msgstr ""
msgid "Create issue"
msgstr ""
+msgid "Create issue to resolve all threads"
+msgstr ""
+
msgid "Create iteration"
msgstr ""
@@ -9526,6 +9672,9 @@ msgstr ""
msgid "Create new..."
msgstr ""
+msgid "Create or import your first project"
+msgstr ""
+
msgid "Create project"
msgstr ""
@@ -9883,7 +10032,7 @@ msgstr ""
msgid "Custom notification events"
msgstr ""
-msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notificationLinkStart} notification emails%{notificationLinkEnd}."
+msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notificationLinkStart}notification emails%{notificationLinkEnd}."
msgstr ""
msgid "Custom project templates"
@@ -10082,10 +10231,10 @@ msgid_plural "CycleAnalytics|Showing %{subjectFilterText} and %{selectedLabelsCo
msgstr[0] ""
msgstr[1] ""
-msgid "CycleAnalytics|Showing data for group '%{groupName}' and %{selectedProjectCount} projects from %{startDate} to %{endDate}"
+msgid "CycleAnalytics|Showing data for group '%{groupName}' and %{selectedProjectCount} projects from %{createdAfter} to %{createdBefore}"
msgstr ""
-msgid "CycleAnalytics|Showing data for group '%{groupName}' from %{startDate} to %{endDate}"
+msgid "CycleAnalytics|Showing data for group '%{groupName}' from %{createdAfter} to %{createdBefore}"
msgstr ""
msgid "CycleAnalytics|Stages"
@@ -10319,6 +10468,9 @@ msgstr ""
msgid "DastProfiles|Manage profiles"
msgstr ""
+msgid "DastProfiles|Manage site profiles"
+msgstr ""
+
msgid "DastProfiles|Minimum = 0 (no timeout enabled), Maximum = 2880 minutes"
msgstr ""
@@ -10394,6 +10546,9 @@ msgstr ""
msgid "DastProfiles|Scanner name"
msgstr ""
+msgid "DastProfiles|Schedule"
+msgstr ""
+
msgid "DastProfiles|Select branch"
msgstr ""
@@ -10463,7 +10618,7 @@ msgstr ""
msgid "DastProfiles|Website"
msgstr ""
-msgid "DastProfiles|You can either choose a passive scan or validate the target site in your chosen site profile. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
+msgid "DastProfiles|You can either choose a passive scan or validate the target site from the site profile management page. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
msgstr ""
msgid "DastProfiles|You cannot run an active scan against an unvalidated site."
@@ -10636,7 +10791,7 @@ msgstr ""
msgid "Days to merge"
msgstr ""
-msgid "Deactivate dormant users after 90 days of inactivity. Users can return to active status by signing in to their account. While inactive, a user is not counted as an active user in the instance."
+msgid "Deactivate dormant users after 90 days of inactivity"
msgstr ""
msgid "Dear Administrator,"
@@ -10723,10 +10878,10 @@ msgstr ""
msgid "Define a custom pattern with cron syntax"
msgstr ""
-msgid "Define approval settings."
+msgid "Define approval rules."
msgstr ""
-msgid "Define approval settings. %{linkStart}Learn more.%{linkEnd}"
+msgid "Define approval rules. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "Define custom rules for what constitutes spam, independent of Akismet"
@@ -10735,7 +10890,7 @@ msgstr ""
msgid "Define environments in the deploy stage(s) in %{code_open}.gitlab-ci.yml%{code_close} to track deployments here."
msgstr ""
-msgid "Define how approval rules are applied as a merge request moves toward completion."
+msgid "Define how approval rules are applied to merge requests."
msgstr ""
msgid "Definition"
@@ -10750,6 +10905,12 @@ msgstr ""
msgid "DelayedJobs|Are you sure you want to run %{job_name} immediately? This job will run automatically after it's timer finishes."
msgstr ""
+msgid "DelayedJobs|Are you sure you want to run %{job_name} immediately? This job will run automatically after its timer finishes."
+msgstr ""
+
+msgid "DelayedJobs|Run the delayed job now?"
+msgstr ""
+
msgid "DelayedJobs|Start now"
msgstr ""
@@ -11026,6 +11187,12 @@ msgstr ""
msgid "Dependency proxy image prefix"
msgstr ""
+msgid "DependencyProxy|Create a local proxy for storing frequently used upstream images. %{docLinkStart}Learn more%{docLinkEnd} about dependency proxies."
+msgstr ""
+
+msgid "DependencyProxy|Dependency Proxy"
+msgstr ""
+
msgid "DependencyProxy|Toggle Dependency Proxy"
msgstr ""
@@ -11266,6 +11433,9 @@ msgstr ""
msgid "Deployments"
msgstr ""
+msgid "Deployments to Google Kubernetes Engine can be "
+msgstr ""
+
msgid "Deployments|%{deployments} environment impacted."
msgid_plural "Deployments|%{deployments} environments impacted."
msgstr[0] ""
@@ -11295,6 +11465,9 @@ msgstr ""
msgid "Deployment|success"
msgstr ""
+msgid "Deprecated API rate limits"
+msgstr ""
+
msgid "Deprioritize label"
msgstr ""
@@ -11697,6 +11870,16 @@ msgstr ""
msgid "DiffsCompareBaseBranch|(base)"
msgstr ""
+msgid "Diffs|%d addition"
+msgid_plural "Diffs|%d additions"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Diffs|%d deletion"
+msgid_plural "Diffs|%d deletions"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Diffs|No file name available"
msgstr ""
@@ -11706,9 +11889,17 @@ msgstr ""
msgid "Diffs|Show all unchanged lines"
msgstr ""
+msgid "Diffs|Showing %{dropdownStart}%{count} changed file%{dropdownEnd}"
+msgid_plural "Diffs|Showing %{dropdownStart}%{count} changed files%{dropdownEnd}"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Diffs|Something went wrong while fetching diff lines."
msgstr ""
+msgid "Diffs|with %{additions} and %{deletions}"
+msgstr ""
+
msgid "Direct member"
msgstr ""
@@ -11834,9 +12025,6 @@ msgid_plural "Dismiss %d selected vulnerabilities as"
msgstr[0] ""
msgstr[1] ""
-msgid "Dismiss Value Stream Analytics introduction box"
-msgstr ""
-
msgid "Dismiss merge request promotion"
msgstr ""
@@ -12158,6 +12346,9 @@ msgstr ""
msgid "Edit issues"
msgstr ""
+msgid "Edit merge requests"
+msgstr ""
+
msgid "Edit public deploy key"
msgstr ""
@@ -12233,6 +12424,9 @@ msgstr ""
msgid "Elastic|None. Select projects to index."
msgstr ""
+msgid "Eligible users"
+msgstr ""
+
msgid "Email"
msgstr ""
@@ -12362,6 +12556,9 @@ msgstr ""
msgid "Enable"
msgstr ""
+msgid "Enable Amazon EKS integration"
+msgstr ""
+
msgid "Enable Auto DevOps"
msgstr ""
@@ -12395,6 +12592,9 @@ msgstr ""
msgid "Enable SSL verification"
msgstr ""
+msgid "Enable Service Ping"
+msgstr ""
+
msgid "Enable Snowplow tracking"
msgstr ""
@@ -12425,6 +12625,9 @@ msgstr ""
msgid "Enable authenticated Git LFS request rate limit"
msgstr ""
+msgid "Enable authenticated web request rate limit"
+msgstr ""
+
msgid "Enable authentication"
msgstr ""
@@ -12485,7 +12688,7 @@ msgstr ""
msgid "Enable or disable the Pseudonymizer data collection."
msgstr ""
-msgid "Enable or disable version check and service ping."
+msgid "Enable or disable version check and Service Ping."
msgstr ""
msgid "Enable protected paths rate limit"
@@ -12497,18 +12700,12 @@ msgstr ""
msgid "Enable reCAPTCHA"
msgstr ""
-msgid "Enable reCAPTCHA for login"
-msgstr ""
-
-msgid "Enable reCAPTCHA, Invisible Captcha, Akismet and set IP limits. For reCAPTCHA, we currently only support %{recaptcha_v2_link_start}v2%{recaptcha_v2_link_end}"
+msgid "Enable reCAPTCHA for login."
msgstr ""
msgid "Enable repository checks"
msgstr ""
-msgid "Enable service ping"
-msgstr ""
-
msgid "Enable shared runners for all projects and subgroups in this group."
msgstr ""
@@ -12530,7 +12727,10 @@ msgstr ""
msgid "Enable unauthenticated API request rate limit"
msgstr ""
-msgid "Enable unauthenticated request rate limit"
+msgid "Enable unauthenticated web request rate limit"
+msgstr ""
+
+msgid "Enable user deactivation emails"
msgstr ""
msgid "Enable version check"
@@ -12566,9 +12766,6 @@ msgstr ""
msgid "Enabled sources for code import during project creation. OmniAuth must be configured for GitHub"
msgstr ""
-msgid "Enabling this will only make licensed EE features available to projects if the project namespace's plan includes the feature or if the project is public."
-msgstr ""
-
msgid "Encountered an error while rendering: %{err}"
msgstr ""
@@ -12617,9 +12814,6 @@ msgstr ""
msgid "Enter Admin Mode"
msgstr ""
-msgid "Enter IP address range"
-msgstr ""
-
msgid "Enter a number"
msgstr ""
@@ -12632,9 +12826,6 @@ msgstr ""
msgid "Enter at least three characters to search"
msgstr ""
-msgid "Enter domain"
-msgstr ""
-
msgid "Enter in your Bitbucket Server URL and personal access token below"
msgstr ""
@@ -12821,9 +13012,6 @@ msgstr ""
msgid "Environments|Deployment %{status}"
msgstr ""
-msgid "Environments|Dismiss"
-msgstr ""
-
msgid "Environments|Enable review app"
msgstr ""
@@ -12836,9 +13024,6 @@ msgstr ""
msgid "Environments|Environments are places where code gets deployed, such as staging or production."
msgstr ""
-msgid "Environments|Help us improve environments"
-msgstr ""
-
msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
msgstr ""
@@ -12875,6 +13060,9 @@ msgstr ""
msgid "Environments|Note that this action will stop the environment, but it will %{emphasisStart}not%{emphasisEnd} have an effect on any existing deployment due to no “stop environment action†being defined in the %{ciConfigLinkStart}.gitlab-ci.yml%{ciConfigLinkEnd} file."
msgstr ""
+msgid "Environments|Open"
+msgstr ""
+
msgid "Environments|Open live environment"
msgstr ""
@@ -12914,9 +13102,6 @@ msgstr ""
msgid "Environments|Stopping %{environmentName}"
msgstr ""
-msgid "Environments|Take the survey"
-msgstr ""
-
msgid "Environments|There was an error fetching the logs. Please try again."
msgstr ""
@@ -12938,9 +13123,6 @@ msgstr ""
msgid "Environments|You don't have any environments right now"
msgstr ""
-msgid "Environments|Your feedback helps GitLab make environments better for you and other users. Participate and enter a sweepstake to win a USD 30 gift card."
-msgstr ""
-
msgid "Environments|by %{avatar}"
msgstr ""
@@ -13223,7 +13405,7 @@ msgstr ""
msgid "Error parsing CSV file. Please make sure it has"
msgstr ""
-msgid "Error rendering markdown preview"
+msgid "Error rendering Markdown preview"
msgstr ""
msgid "Error saving label update."
@@ -13271,6 +13453,9 @@ msgstr ""
msgid "Error: %{error_message}"
msgstr ""
+msgid "Error: Couldn't load some or all of the changes."
+msgstr ""
+
msgid "Error: No AWS credentials were supplied"
msgstr ""
@@ -13304,6 +13489,9 @@ msgstr ""
msgid "ErrorTracking|Enable error tracking"
msgstr ""
+msgid "ErrorTracking|Error tracking backend"
+msgstr ""
+
msgid "ErrorTracking|If you self-host Sentry, enter your Sentry instance's full URL. If you use Sentry's hosted solution, enter https://sentry.io"
msgstr ""
@@ -13337,6 +13525,12 @@ msgstr ""
msgid "Escalation policies must have at least one rule"
msgstr ""
+msgid "EscalationPolicies|%{clockIcon} IF alert is not %{alertStatus} in %{minutes}"
+msgstr ""
+
+msgid "EscalationPolicies|%{notificationIcon} THEN %{doAction} %{forScheduleOrUser}"
+msgstr ""
+
msgid "EscalationPolicies|+ Add an additional rule"
msgstr ""
@@ -13379,13 +13573,13 @@ msgstr ""
msgid "EscalationPolicies|Escalation policies"
msgstr ""
-msgid "EscalationPolicies|Escalation rules"
+msgid "EscalationPolicies|Escalation policy %{obstacle} in Project %{project}"
msgstr ""
-msgid "EscalationPolicies|Failed to load oncall-schedules"
+msgid "EscalationPolicies|Escalation rules"
msgstr ""
-msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} %{then} THEN %{doAction} %{scheduleOrUser}"
+msgid "EscalationPolicies|Failed to load oncall-schedules"
msgstr ""
msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} minutes"
@@ -13463,18 +13657,36 @@ msgstr ""
msgid "Every %{action} attempt has failed: %{job_error_message}. Please try again."
msgstr ""
+msgid "Every 3 months"
+msgstr ""
+
+msgid "Every 3 months on the %{day} at %{time} %{timezone}"
+msgstr ""
+
+msgid "Every 6 months"
+msgstr ""
+
+msgid "Every 6 months on the %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Every day"
msgstr ""
msgid "Every day (at %{time})"
msgstr ""
+msgid "Every day at %{time} %{timezone}"
+msgstr ""
+
msgid "Every month"
msgstr ""
msgid "Every month (Day %{day} at %{time})"
msgstr ""
+msgid "Every month on the %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Every three months"
msgstr ""
@@ -13489,6 +13701,15 @@ msgstr[1] ""
msgid "Every week (%{weekday} at %{time})"
msgstr ""
+msgid "Every week on %{day} at %{time} %{timezone}"
+msgstr ""
+
+msgid "Every year"
+msgstr ""
+
+msgid "Every year on %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Everyone"
msgstr ""
@@ -13525,9 +13746,6 @@ msgstr ""
msgid "Exactly one of %{attributes} is required"
msgstr ""
-msgid "Example: %{ip_address}. %{read_more_link}."
-msgstr ""
-
msgid "Example: @sub\\.company\\.com$"
msgstr ""
@@ -13594,13 +13812,13 @@ msgstr ""
msgid "Expand pipeline"
msgstr ""
-msgid "Expand sidebar"
+msgid "Expand settings section"
msgstr ""
-msgid "Expected documents: %{expected_documents}"
+msgid "Expand sidebar"
msgstr ""
-msgid "Experienced"
+msgid "Expected documents: %{expected_documents}"
msgstr ""
msgid "ExperimentSubject|Must have exactly one of User, Namespace, or Project."
@@ -13885,9 +14103,6 @@ msgstr ""
msgid "Failed to load related branches"
msgstr ""
-msgid "Failed to load sidebar lock status"
-msgstr ""
-
msgid "Failed to load stacktrace."
msgstr ""
@@ -14312,6 +14527,9 @@ msgstr ""
msgid "Files"
msgstr ""
+msgid "Files API Rate Limits"
+msgstr ""
+
msgid "Files breadcrumb"
msgstr ""
@@ -15311,6 +15529,9 @@ msgstr ""
msgid "GitLab group: %{source_link}"
msgstr ""
+msgid "GitLab informs you if a new version is available."
+msgstr ""
+
msgid "GitLab is a complete DevOps platform, delivered as a single application, fundamentally changing the way Development, Security, and Ops teams collaborate"
msgstr ""
@@ -15326,7 +15547,7 @@ msgstr ""
msgid "GitLab is open source software to collaborate on code."
msgstr ""
-msgid "GitLab is undergoing maintenance and is operating in a read-only mode."
+msgid "GitLab is undergoing maintenance and is operating in read-only mode."
msgstr ""
msgid "GitLab member or Email address"
@@ -15338,9 +15559,6 @@ msgstr ""
msgid "GitLab project export"
msgstr ""
-msgid "GitLab restart is required to apply changes."
-msgstr ""
-
msgid "GitLab single sign-on URL"
msgstr ""
@@ -15356,9 +15574,6 @@ msgstr ""
msgid "GitLab version"
msgstr ""
-msgid "GitLab will inform you if a new version is available."
-msgstr ""
-
msgid "GitLab will run a background job that will produce pseudonymized CSVs of the GitLab database that will be uploaded to your configured object storage directory."
msgstr ""
@@ -15623,9 +15838,21 @@ msgstr ""
msgid "Go to snippets"
msgstr ""
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check 'Allowed domains for sign-ups'."
+msgstr ""
+
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check 'Email restrictions for sign-ups'."
+msgstr ""
+
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check the 'Domain denylist'."
+msgstr ""
+
msgid "Go to the activity feed"
msgstr ""
+msgid "Go to the group’s 'Settings &gt; General' page, and check 'Restrict membership by email domain'."
+msgstr ""
+
msgid "Go to the milestone list"
msgstr ""
@@ -15662,6 +15889,12 @@ msgstr ""
msgid "Goal of the changes and what reviewers should be aware of"
msgstr ""
+msgid "Google Cloud"
+msgstr ""
+
+msgid "Google Cloud offers several deployment targets. Select the one most suitable for your project."
+msgstr ""
+
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
@@ -15746,9 +15979,6 @@ msgstr ""
msgid "Group ID"
msgstr ""
-msgid "Group ID: %{group_id}"
-msgstr ""
-
msgid "Group Owner must have signed in with SAML before enabling Group Managed Accounts"
msgstr ""
@@ -15923,6 +16153,12 @@ msgstr ""
msgid "GroupImport|Unable to process group import file"
msgstr ""
+msgid "GroupPage|Copy group ID"
+msgstr ""
+
+msgid "GroupPage|Group ID: %{group_id}"
+msgstr ""
+
msgid "GroupRoadmap|%{dateWord} – No end date"
msgstr ""
@@ -15977,6 +16213,9 @@ msgstr ""
msgid "GroupRoadmap|Within 3 years"
msgstr ""
+msgid "GroupSAML|\"persistent\" recommended"
+msgstr ""
+
msgid "GroupSAML|%{strongOpen}Warning%{strongClose} - Enabling %{linkStart}SSO enforcement%{linkEnd} can reduce security risks."
msgstr ""
@@ -16109,6 +16348,9 @@ msgstr ""
msgid "GroupSAML|To be able to prohibit outer forks, you first need to enforce dedicate group managed accounts."
msgstr ""
+msgid "GroupSAML|Use SAML group links to manage group membership using SAML."
+msgstr ""
+
msgid "GroupSAML|Valid SAML Response"
msgstr ""
@@ -16121,13 +16363,10 @@ msgstr ""
msgid "GroupSAML|as %{access_level}"
msgstr ""
-msgid "GroupSAML|must match stored NameID of \"%{extern_uid}\" as we use this to identify users. If the NameID changes users will be unable to sign in."
-msgstr ""
-
-msgid "GroupSAML|should be \"persistent\""
+msgid "GroupSAML|must match stored NameID of \"%{extern_uid}\" to identify user and allow sign in"
msgstr ""
-msgid "GroupSAML|should be a random persistent ID, emails are discouraged"
+msgid "GroupSAML|recommend persistent ID instead of email"
msgstr ""
msgid "GroupSelect|No matching results"
@@ -16142,9 +16381,15 @@ msgstr ""
msgid "GroupSettings|Allow project access token creation"
msgstr ""
+msgid "GroupSettings|Applied to all subgroups unless overridden by a group owner. Groups already added to the project lose access."
+msgstr ""
+
msgid "GroupSettings|Auto DevOps pipeline was updated for the group"
msgstr ""
+msgid "GroupSettings|Available only on the top-level group. Applies to all subgroups. Groups already shared with a group outside %{group} are still shared unless removed manually."
+msgstr ""
+
msgid "GroupSettings|Badges"
msgstr ""
@@ -16196,6 +16441,9 @@ msgstr ""
msgid "GroupSettings|New runners registration token has been generated!"
msgstr ""
+msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgstr ""
+
msgid "GroupSettings|Pipeline settings was updated for the group"
msgstr ""
@@ -16208,12 +16456,15 @@ msgstr ""
msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
-msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups."
+msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups"
msgstr ""
msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
msgstr ""
+msgid "GroupSettings|Prevents group members from being notified if the group is mentioned."
+msgstr ""
+
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
msgstr ""
@@ -16250,21 +16501,6 @@ msgstr ""
msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}."
msgstr ""
-msgid "GroupSettings|This setting is only available on the top-level group and it applies to all subgroups. Groups that have already been shared with a group outside %{group} will still be shared, and this access will have to be revoked manually."
-msgstr ""
-
-msgid "GroupSettings|This setting will be applied to all subgroups unless overridden by a group owner. Groups that already have access to the project will continue to have access unless removed manually."
-msgstr ""
-
-msgid "GroupSettings|This setting will override user notification preferences for all members of the group, subgroups, and projects."
-msgstr ""
-
-msgid "GroupSettings|This setting will prevent group members from being notified if the group is mentioned."
-msgstr ""
-
-msgid "GroupSettings|This setting will prevent group members from forking projects outside of the group."
-msgstr ""
-
msgid "GroupSettings|Transfer group"
msgstr ""
@@ -16382,7 +16618,7 @@ msgstr ""
msgid "GroupsNew|No import options available"
msgstr ""
-msgid "GroupsNew|Not all related objects are migrated, as %{docs_link_start}described here%{docs_link_end}. Please %{feedback_link_start}leave feedback%{feedback_link_end} on this feature."
+msgid "GroupsNew|Not all related objects are migrated. %{docs_link_start}More info%{docs_link_end}."
msgstr ""
msgid "GroupsNew|Personal access token"
@@ -16514,15 +16750,27 @@ msgstr ""
msgid "Hello %{name},"
msgstr ""
-msgid "Hello there"
-msgstr ""
-
msgid "Hello, %{name}!"
msgstr ""
msgid "Hello, %{username}!"
msgstr ""
+msgid "HelloMessage|%{handshake_emoji} Contribute to GitLab: %{contribute_link}"
+msgstr ""
+
+msgid "HelloMessage|%{magnifier_emoji} Create a new GitLab issue: %{new_issue_link}"
+msgstr ""
+
+msgid "HelloMessage|%{rocket_emoji} We like your curiosity! Help us improve GitLab by joining the team: %{jobs_page_link}"
+msgstr ""
+
+msgid "HelloMessage|Does this page need fixes or improvements? Open an issue or contribute a merge request to help make GitLab more lovable. At GitLab, everyone can contribute!"
+msgstr ""
+
+msgid "HelloMessage|Welcome to GitLab!"
+msgstr ""
+
msgid "Help"
msgstr ""
@@ -16532,13 +16780,10 @@ msgstr ""
msgid "Helps prevent bots from creating accounts."
msgstr ""
-msgid "Helps prevent bots from creating issues"
-msgstr ""
-
-msgid "Helps prevent malicious users hide their activity"
+msgid "Helps prevent bots from creating issues."
msgstr ""
-msgid "Helps reduce request volume (e.g. from crawlers or abusive bots)"
+msgid "Helps prevent malicious users hide their activity."
msgstr ""
msgid "Helps reduce request volume (for example, from crawlers or abusive bots)"
@@ -16662,6 +16907,12 @@ msgstr ""
msgid "Housekeeping, export, path, transfer, remove, archive."
msgstr ""
+msgid "How do I configure Akismet?"
+msgstr ""
+
+msgid "How do I configure it?"
+msgstr ""
+
msgid "How do I configure runners?"
msgstr ""
@@ -16683,19 +16934,25 @@ msgstr ""
msgid "How do I set up this service?"
msgstr ""
+msgid "How do I use a web terminal?"
+msgstr ""
+
+msgid "How do I use file templates?"
+msgstr ""
+
msgid "How it works"
msgstr ""
msgid "How many days need to pass between marking entity for deletion and actual removing it."
msgstr ""
-msgid "How many seconds an IP will be counted towards the limit"
+msgid "How many seconds an IP counts toward the IP address limit."
msgstr ""
-msgid "I accept the %{terms_link}"
+msgid "How the job limiter handles jobs exceeding the thresholds specified below. The 'track' mode only logs the jobs. The 'compress' mode compresses the jobs and raises an exception if the compressed size exceeds the limit."
msgstr ""
-msgid "I accept the|Terms of Service and Privacy Policy"
+msgid "I accept the %{terms_link}"
msgstr ""
msgid "I forgot my password"
@@ -16779,13 +17036,16 @@ msgstr ""
msgid "IP Address"
msgstr ""
-msgid "IP expiration time"
+msgid "IP address expiration time"
msgstr ""
-msgid "IP subnet restriction only allowed for top-level groups"
+msgid "IP address restrictions"
+msgstr ""
+
+msgid "IP addresses per user"
msgstr ""
-msgid "IPs per user"
+msgid "IP subnet restriction only allowed for top-level groups"
msgstr ""
msgid "Identifier"
@@ -16800,6 +17060,9 @@ msgstr ""
msgid "If any indexed field exceeds this limit it will be truncated to this number of characters and the rest will not be indexed or searchable. This does not apply to repository and wiki indexing. Setting this to 0 means it is unlimited."
msgstr ""
+msgid "If blank, defaults to %{code_open}Retry later%{code_close}."
+msgstr ""
+
msgid "If blank, set allowable lifetime to %{instance_level_policy_in_words}, as defined by the instance admin. Once set, existing tokens for users in this group may be revoked."
msgstr ""
@@ -16851,6 +17114,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 did not initiate these sign-in attempts, please reach out to your administrator or enable two-factor authentication (2FA) on your account."
+msgstr ""
+
msgid "If you did not initiate this change, please contact your administrator immediately."
msgstr ""
@@ -16942,10 +17208,10 @@ msgstr ""
msgid "Import Projects from Gitea"
msgstr ""
-msgid "Import a project"
+msgid "Import an exported GitLab project"
msgstr ""
-msgid "Import an exported GitLab project"
+msgid "Import and export rate limits"
msgstr ""
msgid "Import failed due to a GitHub error: %{original}"
@@ -16957,12 +17223,18 @@ msgstr ""
msgid "Import from Jira"
msgstr ""
+msgid "Import group"
+msgstr ""
+
msgid "Import group from file"
msgstr ""
msgid "Import groups"
msgstr ""
+msgid "Import history"
+msgstr ""
+
msgid "Import in progress"
msgstr ""
@@ -17026,7 +17298,25 @@ msgstr ""
msgid "Import timed out. Import took longer than %{import_jobs_expiration} seconds"
msgstr ""
-msgid "Import/Export Rate Limits"
+msgid "ImportAProjectModal|Import from a project"
+msgstr ""
+
+msgid "ImportAProjectModal|Import members from another project"
+msgstr ""
+
+msgid "ImportAProjectModal|Import project members"
+msgstr ""
+
+msgid "ImportAProjectModal|Only project members (not group members) are imported, and they get the same permissions as the project you import from."
+msgstr ""
+
+msgid "ImportAProjectModal|Successfully imported"
+msgstr ""
+
+msgid "ImportAProjectModal|Unable to import project members"
+msgstr ""
+
+msgid "ImportAProjectModal|You're importing members to the %{strongStart}%{name}%{strongEnd} project."
msgstr ""
msgid "ImportButtons|Connect repositories from"
@@ -17079,7 +17369,7 @@ msgstr[1] ""
msgid "Importing..."
msgstr ""
-msgid "Import|A repository URL usually ends in a .git suffix, although this is not required. Double check to make sure your repository URL is correct."
+msgid "Import|There is not a valid Git repository at this URL. If your HTTP repository is not publicly accessible, verify your credentials."
msgstr ""
msgid "Improve customer support with Service Desk"
@@ -17088,9 +17378,6 @@ msgstr ""
msgid "Improves Git cloning performance."
msgstr ""
-msgid "In %{time_to_now}"
-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 ""
@@ -17376,7 +17663,7 @@ msgstr ""
msgid "InProductMarketing|Start a GitLab Ultimate trial today in less than one minute, no credit card required."
msgstr ""
-msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no CC required"
+msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no credit card required"
msgstr ""
msgid "InProductMarketing|Start a trial"
@@ -17415,7 +17702,7 @@ msgstr ""
msgid "InProductMarketing|Team up in GitLab for greater efficiency"
msgstr ""
-msgid "InProductMarketing|Team work makes the dream work"
+msgid "InProductMarketing|Team work makes the dream work"
msgstr ""
msgid "InProductMarketing|Test, create, deploy"
@@ -17996,6 +18283,9 @@ msgstr ""
msgid "Integrations|Create new issue in Jira"
msgstr ""
+msgid "Integrations|Create new issue in ZenTao"
+msgstr ""
+
msgid "Integrations|Default settings are inherited from the group level."
msgstr ""
@@ -18089,9 +18379,15 @@ msgstr ""
msgid "Integrations|Search Jira issues"
msgstr ""
+msgid "Integrations|Search ZenTao issues"
+msgstr ""
+
msgid "Integrations|Send notifications about project events to Unify Circuit."
msgstr ""
+msgid "Integrations|Send notifications about project events to a Unify Circuit conversation. %{docs_link}"
+msgstr ""
+
msgid "Integrations|Sign in to add namespaces"
msgstr ""
@@ -18131,6 +18427,9 @@ msgstr ""
msgid "Integrations|You've activated every integration 🎉"
msgstr ""
+msgid "Integrations|ZenTao issues display here when you create issues in your project in ZenTao."
+msgstr ""
+
msgid "Interactive mode"
msgstr ""
@@ -18158,9 +18457,6 @@ msgstr ""
msgid "Interval Pattern"
msgstr ""
-msgid "Introducing Value Stream Analytics"
-msgstr ""
-
msgid "Introducing Your DevOps Report"
msgstr ""
@@ -18257,6 +18553,12 @@ msgstr ""
msgid "Investigate vulnerability: %{title}"
msgstr ""
+msgid "Invisible Captcha"
+msgstr ""
+
+msgid "Invisible Captcha helps prevent the creation of spam accounts. It adds a honeypot field and time-sensitive form submission to the account signup form."
+msgstr ""
+
msgid "Invitation"
msgstr ""
@@ -18710,12 +19012,18 @@ msgstr ""
msgid "Issues"
msgstr ""
+msgid "Issues I've created"
+msgstr ""
+
msgid "Issues Rate Limits"
msgstr ""
msgid "Issues and merge requests"
msgstr ""
+msgid "Issues assigned to me"
+msgstr ""
+
msgid "Issues can be bugs, tasks or ideas to be discussed. Also, issues are searchable and filterable."
msgstr ""
@@ -18827,7 +19135,7 @@ msgstr ""
msgid "Iterations|Create cadence"
msgstr ""
-msgid "Iterations|Create your first iteration"
+msgid "Iterations|Create iteration"
msgstr ""
msgid "Iterations|Delete cadence"
@@ -18836,6 +19144,9 @@ msgstr ""
msgid "Iterations|Delete iteration cadence?"
msgstr ""
+msgid "Iterations|Delete iteration?"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -18869,12 +19180,18 @@ msgstr ""
msgid "Iterations|New iteration cadence"
msgstr ""
+msgid "Iterations|No closed iterations."
+msgstr ""
+
msgid "Iterations|No iteration cadences to show."
msgstr ""
msgid "Iterations|No iterations in cadence."
msgstr ""
+msgid "Iterations|No open iterations."
+msgstr ""
+
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
@@ -18905,6 +19222,9 @@ msgstr ""
msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
msgstr ""
+msgid "Iterations|This will remove the iteration from any issues that are assigned to it."
+msgstr ""
+
msgid "Iterations|Title"
msgstr ""
@@ -18920,15 +19240,9 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "I’m familiar with the basics of DevOps."
-msgstr ""
-
msgid "I’m joining my team who’s already on GitLab"
msgstr ""
-msgid "I’m not familiar with the basics of DevOps."
-msgstr ""
-
msgid "Jaeger URL"
msgstr ""
@@ -19193,6 +19507,9 @@ msgstr ""
msgid "Job"
msgstr ""
+msgid "Job %{jobName}"
+msgstr ""
+
msgid "Job Failed #%{build_id}"
msgstr ""
@@ -19783,9 +20100,6 @@ msgstr ""
msgid "Learn more in the"
msgstr ""
-msgid "Learn more in the|pipeline schedules documentation"
-msgstr ""
-
msgid "Learn more."
msgstr ""
@@ -19897,9 +20211,6 @@ msgstr ""
msgid "Leave Admin Mode"
msgstr ""
-msgid "Leave blank for no limit. Once set, existing personal access tokens may be revoked."
-msgstr ""
-
msgid "Leave edit mode? All unsaved changes will be lost."
msgstr ""
@@ -19945,10 +20256,10 @@ msgstr ""
msgid "LicenseCompliance|Acceptable license to be used in the project"
msgstr ""
-msgid "LicenseCompliance|Add a license"
+msgid "LicenseCompliance|Add license and related policy"
msgstr ""
-msgid "LicenseCompliance|Add license and related policy"
+msgid "LicenseCompliance|Add license policy"
msgstr ""
msgid "LicenseCompliance|Allow"
@@ -20038,6 +20349,9 @@ msgstr ""
msgid "LicenseManagement|Uncategorized"
msgstr ""
+msgid "Licensed Enterprise Edition features can be used if the project namespace's plan includes the feature, or if the project is public."
+msgstr ""
+
msgid "Licensed Features"
msgstr ""
@@ -20104,7 +20418,10 @@ msgstr ""
msgid "Limit namespaces and projects that can be indexed"
msgstr ""
-msgid "Limit sign in from multiple ips"
+msgid "Limit project size at a global, group, and project level. %{link_start}Learn more%{link_end}."
+msgstr ""
+
+msgid "Limit sign in from multiple IP addresses"
msgstr ""
msgid "Limit the number of concurrent operations this secondary site can run in the background."
@@ -20116,11 +20433,17 @@ msgstr ""
msgid "Limit the number of issues and epics per minute a user can create through web and API requests."
msgstr ""
+msgid "Limit the size of Sidekiq jobs stored in Redis."
+msgstr ""
+
msgid "Limited to showing %d event at most"
msgid_plural "Limited to showing %d events at most"
msgstr[0] ""
msgstr[1] ""
+msgid "Limiting mode"
+msgstr ""
+
msgid "Line changes"
msgstr ""
@@ -20190,9 +20513,6 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
-msgid "List of users to be excluded from the limit"
-msgstr ""
-
msgid "List options"
msgstr ""
@@ -20232,9 +20552,6 @@ msgstr ""
msgid "Loading functions timed out. Please reload the page to try again."
msgstr ""
-msgid "Loading issues"
-msgstr ""
-
msgid "Loading more"
msgstr ""
@@ -20526,6 +20843,9 @@ msgstr ""
msgid "Marked For Deletion At - %{deletion_time}"
msgstr ""
+msgid "Marked as ready. Merging is now allowed."
+msgstr ""
+
msgid "Marked this %{noun} as a draft."
msgstr ""
@@ -20598,52 +20918,22 @@ msgstr ""
msgid "Max 100,000 events"
msgstr ""
-msgid "Max 20 characters"
-msgstr ""
-
-msgid "Max Group Export Download requests per minute per user"
-msgstr ""
-
-msgid "Max Group Export requests per minute per user"
-msgstr ""
-
-msgid "Max Group Import requests per minute per user"
-msgstr ""
-
-msgid "Max Project Export Download requests per minute per user"
-msgstr ""
-
-msgid "Max Project Export requests per minute per user"
-msgstr ""
-
-msgid "Max Project Import requests per minute per user"
-msgstr ""
-
-msgid "Max authenticated API requests per period per user"
-msgstr ""
-
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
-msgid "Max authenticated web requests per period per user"
-msgstr ""
-
msgid "Max file size is 200 KB."
msgstr ""
-msgid "Max requests per minute per user"
-msgstr ""
-
msgid "Max role"
msgstr ""
msgid "Max session time"
msgstr ""
-msgid "Max unauthenticated requests per period per IP"
+msgid "MaxBuilds"
msgstr ""
-msgid "MaxBuilds"
+msgid "Maximum 20 characters"
msgstr ""
msgid "Maximum Conan package file size in bytes"
@@ -20679,6 +20969,12 @@ msgstr ""
msgid "Maximum attachment size (MB)"
msgstr ""
+msgid "Maximum authenticated API requests per rate limit period per user"
+msgstr ""
+
+msgid "Maximum authenticated web requests per rate limit period per user"
+msgstr ""
+
msgid "Maximum bulk request size (MiB)"
msgstr ""
@@ -20724,6 +21020,15 @@ msgstr ""
msgid "Maximum files in a diff"
msgstr ""
+msgid "Maximum group export download requests per minute"
+msgstr ""
+
+msgid "Maximum group export requests per minute"
+msgstr ""
+
+msgid "Maximum group import requests per minute"
+msgstr ""
+
msgid "Maximum import size"
msgstr ""
@@ -20760,7 +21065,7 @@ msgstr ""
msgid "Maximum number of projects."
msgstr ""
-msgid "Maximum number of unique IPs per user"
+msgid "Maximum number of unique IP addresses per user."
msgstr ""
msgid "Maximum page reached"
@@ -20769,12 +21074,24 @@ msgstr ""
msgid "Maximum page size"
msgstr ""
+msgid "Maximum project export download requests per minute"
+msgstr ""
+
+msgid "Maximum project export requests per minute"
+msgstr ""
+
+msgid "Maximum project import requests per minute"
+msgstr ""
+
msgid "Maximum push size"
msgstr ""
msgid "Maximum push size (MB)"
msgstr ""
+msgid "Maximum requests per minute"
+msgstr ""
+
msgid "Maximum running slices"
msgstr ""
@@ -20802,10 +21119,16 @@ msgstr ""
msgid "Maximum time between updates that a mirror can have when scheduled to synchronize."
msgstr ""
-msgid "Maximum time for web terminal websocket connection (in seconds). 0 for unlimited."
+msgid "Maximum time that users are allowed to skip the setup of two-factor authentication (in hours). Set to 0 (zero) to enforce at next sign in."
msgstr ""
-msgid "Maximum time that users are allowed to skip the setup of two-factor authentication (in hours). Set to 0 (zero) to enforce at next sign in."
+msgid "Maximum time, in seconds, for a web terminal websocket connection. 0 for unlimited."
+msgstr ""
+
+msgid "Maximum unauthenticated API requests per rate limit period per IP"
+msgstr ""
+
+msgid "Maximum unauthenticated web requests per rate limit period per IP"
msgstr ""
msgid "May"
@@ -20823,9 +21146,6 @@ msgstr ""
msgid "Medium vulnerabilities present"
msgstr ""
-msgid "Member lock"
-msgstr ""
-
msgid "Member since"
msgstr ""
@@ -20862,6 +21182,9 @@ msgstr ""
msgid "Members of a group may only view projects they have permission to access"
msgstr ""
+msgid "Membership"
+msgstr ""
+
msgid "Members|%{time} by %{user}"
msgstr ""
@@ -20922,9 +21245,6 @@ msgstr ""
msgid "Members|Expiration date updated successfully."
msgstr ""
-msgid "Members|Expired"
-msgstr ""
-
msgid "Members|Filter members"
msgstr ""
@@ -20940,9 +21260,6 @@ msgstr ""
msgid "Members|Membership"
msgstr ""
-msgid "Members|No expiration set"
-msgstr ""
-
msgid "Members|Remove \"%{groupName}\""
msgstr ""
@@ -20964,9 +21281,6 @@ msgstr ""
msgid "Members|Search invited"
msgstr ""
-msgid "Members|in %{time}"
-msgstr ""
-
msgid "Member|Deny access"
msgstr ""
@@ -21042,9 +21356,6 @@ msgstr ""
msgid "Merge request %{mr_link} was reviewed by %{mr_author}"
msgstr ""
-msgid "Merge request (MR) approvals"
-msgstr ""
-
msgid "Merge request analytics"
msgstr ""
@@ -21066,12 +21377,21 @@ msgstr ""
msgid "Merge requests"
msgstr ""
+msgid "Merge requests I've created"
+msgstr ""
+
msgid "Merge requests are a place to propose changes you've made to a project and discuss those changes with others"
msgstr ""
msgid "Merge requests are read-only in a secondary Geo node"
msgstr ""
+msgid "Merge requests assigned to me"
+msgstr ""
+
+msgid "Merge requests that I'm a reviewer"
+msgstr ""
+
msgid "Merge the branch and fix any conflicts that come up"
msgstr ""
@@ -21132,10 +21452,10 @@ msgstr ""
msgid "MergeRequests|An error occurred while saving the draft comment."
msgstr ""
-msgid "MergeRequests|Failed to squash. Should be done manually."
+msgid "MergeRequests|Create issue to resolve thread"
msgstr ""
-msgid "MergeRequests|Resolve this thread in a new issue"
+msgid "MergeRequests|Failed to squash. Should be done manually."
msgstr ""
msgid "MergeRequests|Saving the comment failed"
@@ -21949,6 +22269,9 @@ msgstr ""
msgid "MoveIssue|Cannot move issue to project it originates from!"
msgstr ""
+msgid "MoveIssue|Cannot move issues of '%{issue_type}' type."
+msgstr ""
+
msgid "Moved issue to %{label} column in the board."
msgstr ""
@@ -22074,6 +22397,15 @@ 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. To learn more about reducing storage capacity please visit our docs."
msgstr ""
+msgid "NamespaceUserCap|Pending users must be reviewed and approved by a group owner. Learn more about %{user_caps_link_start}User Caps%{link_end} and %{users_pending_approval_link_start}Users Pending Approval%{link_end}."
+msgstr ""
+
+msgid "NamespaceUserCap|View pending user approvals"
+msgstr ""
+
+msgid "NamespaceUserCap|Your group has reached its billable member limit"
+msgstr ""
+
msgid "Namespaces"
msgstr ""
@@ -22116,9 +22448,6 @@ msgstr ""
msgid "Network"
msgstr ""
-msgid "Network Policy|New rule"
-msgstr ""
-
msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is inbound from a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
msgstr ""
@@ -22140,16 +22469,13 @@ msgstr ""
msgid "NetworkPolicies|%{strongOpen}any%{strongClose} port"
msgstr ""
-msgid "NetworkPolicies|+ Add alert"
-msgstr ""
-
msgid "NetworkPolicies|.yaml"
msgstr ""
msgid "NetworkPolicies|.yaml mode"
msgstr ""
-msgid "NetworkPolicies|Actions"
+msgid "NetworkPolicies|Add alert"
msgstr ""
msgid "NetworkPolicies|Alerts are intended to be selectively used for a limited number of events that are potentially concerning and warrant a manual review. Alerts should not be used as a substitute for a SIEM or a logging tool. High volume alerts are likely to be dropped so as to preserve the stability of GitLab's integration with Kubernetes."
@@ -22185,9 +22511,6 @@ msgstr ""
msgid "NetworkPolicies|Deny all traffic"
msgstr ""
-msgid "NetworkPolicies|Description"
-msgstr ""
-
msgid "NetworkPolicies|Edit policy"
msgstr ""
@@ -22200,9 +22523,6 @@ msgstr ""
msgid "NetworkPolicies|IP/subnet"
msgstr ""
-msgid "NetworkPolicies|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
-msgstr ""
-
msgid "NetworkPolicies|Invalid or empty policy"
msgstr ""
@@ -22212,19 +22532,16 @@ msgstr ""
msgid "NetworkPolicies|Kubernetes error: %{error}"
msgstr ""
-msgid "NetworkPolicies|Name"
-msgstr ""
-
msgid "NetworkPolicies|Network"
msgstr ""
-msgid "NetworkPolicies|Network traffic"
+msgid "NetworkPolicies|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
msgstr ""
-msgid "NetworkPolicies|New policy"
+msgid "NetworkPolicies|Network policy can be created after the environment is loaded successfully."
msgstr ""
-msgid "NetworkPolicies|No policies detected"
+msgid "NetworkPolicies|Network traffic"
msgstr ""
msgid "NetworkPolicies|None selected"
@@ -22233,21 +22550,12 @@ msgstr ""
msgid "NetworkPolicies|Please %{installLinkStart}install%{installLinkEnd} and %{configureLinkStart}configure a Kubernetes Agent for this project%{configureLinkEnd} to enable alerts."
msgstr ""
-msgid "NetworkPolicies|Policies are a specification of how groups of pods are allowed to communicate with each other's network endpoints."
-msgstr ""
-
msgid "NetworkPolicies|Policy %{policyName} was successfully changed"
msgstr ""
msgid "NetworkPolicies|Policy definition"
msgstr ""
-msgid "NetworkPolicies|Policy editor"
-msgstr ""
-
-msgid "NetworkPolicies|Policy preview"
-msgstr ""
-
msgid "NetworkPolicies|Rule"
msgstr ""
@@ -22257,9 +22565,6 @@ msgstr ""
msgid "NetworkPolicies|Rule mode is unavailable for this policy. In some cases, we cannot parse the YAML file back into the rules editor."
msgstr ""
-msgid "NetworkPolicies|Rules"
-msgstr ""
-
msgid "NetworkPolicies|Save changes"
msgstr ""
@@ -22272,9 +22577,6 @@ msgstr ""
msgid "NetworkPolicies|Traffic that does not match any rule will be blocked."
msgstr ""
-msgid "NetworkPolicies|Unable to parse policy"
-msgstr ""
-
msgid "NetworkPolicies|all DNS names"
msgstr ""
@@ -22454,6 +22756,9 @@ msgstr ""
msgid "New issue"
msgstr ""
+msgid "New issue in %{project}"
+msgstr ""
+
msgid "New issue title"
msgstr ""
@@ -22532,7 +22837,7 @@ msgstr ""
msgid "Newest first"
msgstr ""
-msgid "Newly registered users will by default be external"
+msgid "Newly-registered users are external by default"
msgstr ""
msgid "Next"
@@ -22847,8 +23152,10 @@ msgstr ""
msgid "No webhooks found, add one in the form above."
msgstr ""
-msgid "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} to renew your subscription."
-msgstr ""
+msgid "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} day to renew your subscription."
+msgid_plural "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} days to renew your subscription."
+msgstr[0] ""
+msgstr[1] ""
msgid "No. of commits"
msgstr ""
@@ -22865,7 +23172,7 @@ msgstr ""
msgid "Nodes"
msgstr ""
-msgid "Non-admin users can sign in with read-only access and make read-only API requests."
+msgid "Non-admin users are restricted to read-only access, in both GitLab UI and API."
msgstr ""
msgid "None"
@@ -22946,7 +23253,7 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
-msgid "Notes Rate Limits"
+msgid "Notes rate limit"
msgstr ""
msgid "Notes|Are you sure you want to cancel creating this comment?"
@@ -23113,9 +23420,6 @@ msgstr ""
msgid "November"
msgstr ""
-msgid "Novice"
-msgstr ""
-
msgid "Now, personalize your GitLab experience"
msgstr ""
@@ -23284,7 +23588,7 @@ msgstr ""
msgid "OnCallSchedules|For this rotation, on-call will be:"
msgstr ""
-msgid "OnCallSchedules|On-call schedule %{schedule} in Project %{project}"
+msgid "OnCallSchedules|On-call schedule %{obstacle} in Project %{project}"
msgstr ""
msgid "OnCallSchedules|On-call schedules"
@@ -23431,22 +23735,22 @@ msgstr ""
msgid "OnDemandScans|Scanner profile"
msgstr ""
-msgid "OnDemandScans|Select one of the existing profiles"
+msgid "OnDemandScans|Schedule scan"
msgstr ""
-msgid "OnDemandScans|Site profile"
+msgid "OnDemandScans|Select one of the existing profiles"
msgstr ""
-msgid "OnDemandScans|Use existing scanner profile"
+msgid "OnDemandScans|Site profile"
msgstr ""
-msgid "OnDemandScans|Use existing site profile"
+msgid "OnDemandScans|Start time"
msgstr ""
-msgid "OnDemandScans|You can either choose a passive scan or validate the target site in your chosen site profile. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
+msgid "OnDemandScans|Use existing scanner profile"
msgstr ""
-msgid "OnDemandScans|You cannot run an active scan against an unvalidated site."
+msgid "OnDemandScans|Use existing site profile"
msgstr ""
msgid "OnDemandScans|You must create a repository within your project to run an on-demand scan."
@@ -23511,6 +23815,9 @@ msgstr ""
msgid "Only admins can delete project"
msgstr ""
+msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
+msgstr ""
+
msgid "Only include features new to your current subscription tier."
msgstr ""
@@ -23529,6 +23836,12 @@ msgstr ""
msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
+msgid "Only reCAPTCHA v2 is supported:"
+msgstr ""
+
+msgid "Only users from the specified IP address ranges are able to reach this group, including all subgroups, projects, and Git repositories."
+msgstr ""
+
msgid "Only verified users with an email address in any of these domains can be added to the group."
msgstr ""
@@ -23715,9 +24028,6 @@ msgstr ""
msgid "Package Registry"
msgstr ""
-msgid "Package Registry Rate Limits"
-msgstr ""
-
msgid "Package Registry: authenticated API requests"
msgstr ""
@@ -23736,6 +24046,9 @@ msgstr ""
msgid "Package recipe already exists"
msgstr ""
+msgid "Package registry rate limits"
+msgstr ""
+
msgid "Package type"
msgstr ""
@@ -23802,6 +24115,9 @@ msgstr ""
msgid "PackageRegistry|Composer"
msgstr ""
+msgid "PackageRegistry|Composer.json with license: %{license} and version: %{version}"
+msgstr ""
+
msgid "PackageRegistry|Conan"
msgstr ""
@@ -23865,6 +24181,9 @@ msgstr ""
msgid "PackageRegistry|Copy require package include"
msgstr ""
+msgid "PackageRegistry|Copy target SHA"
+msgstr ""
+
msgid "PackageRegistry|Copy yarn command"
msgstr ""
@@ -23931,6 +24250,9 @@ msgstr ""
msgid "PackageRegistry|Install package version"
msgstr ""
+msgid "PackageRegistry|Instance-level"
+msgstr ""
+
msgid "PackageRegistry|Invalid Package: failed metadata extraction"
msgstr ""
@@ -23976,6 +24298,9 @@ msgstr ""
msgid "PackageRegistry|Pip Command"
msgstr ""
+msgid "PackageRegistry|Project-level"
+msgstr ""
+
msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
msgstr ""
@@ -23997,6 +24322,9 @@ msgstr ""
msgid "PackageRegistry|Remove package"
msgstr ""
+msgid "PackageRegistry|Required Python: %{pythonVersion}"
+msgstr ""
+
msgid "PackageRegistry|RubyGems"
msgstr ""
@@ -24039,6 +24367,9 @@ msgstr ""
msgid "PackageRegistry|Source project located at %{link}"
msgstr ""
+msgid "PackageRegistry|Target SHA: %{sha}"
+msgstr ""
+
msgid "PackageRegistry|There are no other versions of this package."
msgstr ""
@@ -24207,6 +24538,18 @@ msgstr ""
msgid "Password was successfully updated. Please sign in again."
msgstr ""
+msgid "PasswordPrompt|Confirm password"
+msgstr ""
+
+msgid "PasswordPrompt|Confirm password to continue"
+msgstr ""
+
+msgid "PasswordPrompt|Password is required"
+msgstr ""
+
+msgid "PasswordPrompt|Please enter your password to confirm"
+msgstr ""
+
msgid "Passwords should be unique and not used for any other sites or services."
msgstr ""
@@ -24234,6 +24577,9 @@ msgstr ""
msgid "Paste project path (i.e. gitlab-org/gitlab)"
msgstr ""
+msgid "Paste this DSN into your Sentry SDK"
+msgstr ""
+
msgid "Paste your public SSH key, which is usually contained in the file '~/.ssh/id_ed25519.pub' or '~/.ssh/id_rsa.pub' and begins with 'ssh-ed25519' or 'ssh-rsa'. Do not paste your private SSH key, as that can compromise your identity."
msgstr ""
@@ -24318,6 +24664,9 @@ msgstr ""
msgid "PerformanceBar|First Contentful Paint"
msgstr ""
+msgid "PerformanceBar|Flamegraph with mode:"
+msgstr ""
+
msgid "PerformanceBar|Frontend resources"
msgstr ""
@@ -24351,6 +24700,15 @@ msgstr ""
msgid "PerformanceBar|Trace"
msgstr ""
+msgid "PerformanceBar|cpu"
+msgstr ""
+
+msgid "PerformanceBar|object"
+msgstr ""
+
+msgid "PerformanceBar|wall"
+msgstr ""
+
msgid "Period in seconds"
msgstr ""
@@ -24579,6 +24937,48 @@ msgstr ""
msgid "PipelineSchedules|Variables"
msgstr ""
+msgid "PipelineSource|API"
+msgstr ""
+
+msgid "PipelineSource|Chat"
+msgstr ""
+
+msgid "PipelineSource|External"
+msgstr ""
+
+msgid "PipelineSource|External Pull Request"
+msgstr ""
+
+msgid "PipelineSource|Merge Request"
+msgstr ""
+
+msgid "PipelineSource|On-Demand DAST Scan"
+msgstr ""
+
+msgid "PipelineSource|On-Demand DAST Validation"
+msgstr ""
+
+msgid "PipelineSource|Parent Pipeline"
+msgstr ""
+
+msgid "PipelineSource|Pipeline"
+msgstr ""
+
+msgid "PipelineSource|Push"
+msgstr ""
+
+msgid "PipelineSource|Schedule"
+msgstr ""
+
+msgid "PipelineSource|Trigger"
+msgstr ""
+
+msgid "PipelineSource|Web"
+msgstr ""
+
+msgid "PipelineSource|Web IDE"
+msgstr ""
+
msgid "PipelineStatusTooltip|Pipeline: %{ciStatus}"
msgstr ""
@@ -24879,46 +25279,7 @@ msgstr ""
msgid "Pipeline|Source"
msgstr ""
-msgid "Pipeline|Source|API"
-msgstr ""
-
-msgid "Pipeline|Source|Chat"
-msgstr ""
-
-msgid "Pipeline|Source|External"
-msgstr ""
-
-msgid "Pipeline|Source|External Pull Request"
-msgstr ""
-
-msgid "Pipeline|Source|Merge Request"
-msgstr ""
-
-msgid "Pipeline|Source|On-Demand DAST Scan"
-msgstr ""
-
-msgid "Pipeline|Source|On-Demand DAST Validation"
-msgstr ""
-
-msgid "Pipeline|Source|Parent Pipeline"
-msgstr ""
-
-msgid "Pipeline|Source|Pipeline"
-msgstr ""
-
-msgid "Pipeline|Source|Push"
-msgstr ""
-
-msgid "Pipeline|Source|Schedule"
-msgstr ""
-
-msgid "Pipeline|Source|Trigger"
-msgstr ""
-
-msgid "Pipeline|Source|Web"
-msgstr ""
-
-msgid "Pipeline|Source|Web IDE"
+msgid "Pipeline|Source|Security Policy"
msgstr ""
msgid "Pipeline|Specify variable values to be used in this run. The values specified in %{linkStart}CI/CD settings%{linkEnd} will be used by default."
@@ -24969,7 +25330,7 @@ msgstr ""
msgid "Pipeline|We are currently unable to fetch pipeline data"
msgstr ""
-msgid "Pipeline|You’re about to stop pipeline %{pipelineId}."
+msgid "Pipeline|You’re about to stop pipeline #%{pipelineId}."
msgstr ""
msgid "Pipeline|for"
@@ -24996,6 +25357,9 @@ msgstr ""
msgid "Plain diff"
msgstr ""
+msgid "Plain-text response to send to clients that hit a rate limit"
+msgstr ""
+
msgid "Plan:"
msgstr ""
@@ -25140,9 +25504,6 @@ msgstr ""
msgid "Please provide attributes to update"
msgstr ""
-msgid "Please provide your username or email address."
-msgstr ""
-
msgid "Please reach out if you have any questions and we'll be happy to assist."
msgstr ""
@@ -25185,9 +25546,6 @@ msgstr ""
msgid "Please set a new password before proceeding."
msgstr ""
-msgid "Please share your feedback about %{featureName} %{linkStart}in this issue%{linkEnd} to help us improve the experience."
-msgstr ""
-
msgid "Please solve the captcha"
msgstr ""
@@ -25365,6 +25723,9 @@ msgstr ""
msgid "Prevent adding new members to project membership within this group"
msgstr ""
+msgid "Prevent auto-stopping"
+msgstr ""
+
msgid "Prevent editing approval rules in projects and merge requests."
msgstr ""
@@ -25377,7 +25738,7 @@ msgstr ""
msgid "Prevent users from changing their profile name"
msgstr ""
-msgid "Prevent users from performing write operations on GitLab while performing maintenance."
+msgid "Prevent users from performing write operations while GitLab maintenance is in progress."
msgstr ""
msgid "Preview"
@@ -25650,6 +26011,9 @@ msgstr ""
msgid "Profiles|Enter your name, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Enter your password to confirm the email change"
+msgstr ""
+
msgid "Profiles|Enter your pronouns to let people know how to refer to you"
msgstr ""
@@ -25884,10 +26248,10 @@ msgstr ""
msgid "Profiles|e.g. My MacBook key"
msgstr ""
-msgid "Profiles|username"
+msgid "Profiles|https://website.com"
msgstr ""
-msgid "Profiles|website.com"
+msgid "Profiles|username"
msgstr ""
msgid "Profiles|your account"
@@ -26130,9 +26494,21 @@ msgstr ""
msgid "ProjectSelect| or group"
msgstr ""
+msgid "ProjectSelect|No matching results"
+msgstr ""
+
msgid "ProjectSelect|Search for project"
msgstr ""
+msgid "ProjectSelect|Search projects"
+msgstr ""
+
+msgid "ProjectSelect|Select a project"
+msgstr ""
+
+msgid "ProjectSelect|There was an error fetching the projects. Please try again."
+msgstr ""
+
msgid "ProjectService|Drone server URL"
msgstr ""
@@ -26220,6 +26596,9 @@ msgstr ""
msgid "ProjectService|Trigger event when a new, unique alert is recorded."
msgstr ""
+msgid "ProjectService|Trigger event when a new, unique vulnerability is recorded. (Note: This feature requires an Ultimate plan.)"
+msgstr ""
+
msgid "ProjectService|Trigger event when a pipeline status changes."
msgstr ""
@@ -26634,9 +27013,15 @@ msgstr ""
msgid "Projects are graded based on the highest severity vulnerability present"
msgstr ""
+msgid "Projects are organized into groups"
+msgstr ""
+
msgid "Projects contributed to"
msgstr ""
+msgid "Projects help you organize your work. They contain your file repository, issues, merge requests, and so much more."
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr ""
@@ -26871,10 +27256,10 @@ msgstr ""
msgid "PrometheusService|Prometheus cluster integration"
msgstr ""
-msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
+msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
msgstr ""
-msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
+msgid "PrometheusService|The ID of the IAP-secured resource."
msgstr ""
msgid "PrometheusService|The Prometheus API base URL."
@@ -27492,6 +27877,9 @@ msgstr ""
msgid "Rate limit"
msgstr ""
+msgid "Rate limits can help reduce request volume (like from crawlers or abusive bots)."
+msgstr ""
+
msgid "Raw blob request rate limit per minute"
msgstr ""
@@ -27504,6 +27892,9 @@ msgstr ""
msgid "Re-authentication required"
msgstr ""
+msgid "Re-import"
+msgstr ""
+
msgid "Re-request review"
msgstr ""
@@ -27525,6 +27916,9 @@ msgstr ""
msgid "Read more about related issues"
msgstr ""
+msgid "Read their documentation."
+msgstr ""
+
msgid "Ready to get started with GitLab? Follow these steps to set up your workspace, plan and commit changes, and deploy your project."
msgstr ""
@@ -27558,6 +27952,9 @@ msgstr ""
msgid "Receive any notifications from GitLab."
msgstr ""
+msgid "Receive notification of abuse reports by email."
+msgstr ""
+
msgid "Receive notifications about your own activity"
msgstr ""
@@ -27701,9 +28098,6 @@ msgstr ""
msgid "Registry setup"
msgstr ""
-msgid "Regulate approvals by authors/committers. Affects all projects."
-msgstr ""
-
msgid "Reindexing Status: %{status} (Slice multiplier: %{multiplier}, Maximum running slices: %{max_slices})"
msgstr ""
@@ -27799,6 +28193,9 @@ msgstr ""
msgid "Release|Something went wrong while saving the release details."
msgstr ""
+msgid "Reload page"
+msgstr ""
+
msgid "Remediations"
msgstr ""
@@ -28081,6 +28478,9 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
+msgid "Repeats"
+msgstr ""
+
msgid "Replace"
msgstr ""
@@ -28443,10 +28843,7 @@ msgstr ""
msgid "Require additional authentication for administrative tasks."
msgstr ""
-msgid "Require all users in this group to setup Two-factor authentication"
-msgstr ""
-
-msgid "Require all users in this group to setup two-factor authentication"
+msgid "Require all users in this group to set up two-factor authentication"
msgstr ""
msgid "Required approvals (%{approvals_given} given)"
@@ -28492,6 +28889,9 @@ msgstr[1] ""
msgid "Requires values to meet regular expression requirements."
msgstr ""
+msgid "Requires you to deploy or set up cloud-hosted Sentry."
+msgstr ""
+
msgid "Requires your primary GitLab email address."
msgstr ""
@@ -28552,9 +28952,6 @@ msgstr ""
msgid "Resolve"
msgstr ""
-msgid "Resolve all threads in new issue"
-msgstr ""
-
msgid "Resolve conflicts"
msgstr ""
@@ -28612,6 +29009,9 @@ msgstr ""
msgid "Response text"
msgstr ""
+msgid "Restart GitLab to apply changes."
+msgstr ""
+
msgid "Restart Terminal"
msgstr ""
@@ -28630,6 +29030,9 @@ msgstr ""
msgid "Restoring the project will prevent the project from being removed on this date and restore people's ability to make changes to it."
msgstr ""
+msgid "Restrict group access by IP address. %{link_start}Learn more%{link_end}."
+msgstr ""
+
msgid "Restrict membership by email domain"
msgstr ""
@@ -28943,6 +29346,9 @@ msgstr ""
msgid "Runners|Runner #%{runner_id}"
msgstr ""
+msgid "Runners|Runner assigned to project."
+msgstr ""
+
msgid "Runners|Runner is offline, last contact was %{runner_contact} ago"
msgstr ""
@@ -28955,6 +29361,9 @@ msgstr ""
msgid "Runners|Runner registration"
msgstr ""
+msgid "Runners|Runner unassigned from project."
+msgstr ""
+
msgid "Runners|Runners"
msgstr ""
@@ -29147,7 +29556,7 @@ msgstr ""
msgid "SastEntryPoints|How do I set up SAST?"
msgstr ""
-msgid "SastEntryPoints|Learn more."
+msgid "SastEntryPoints|Learn more"
msgstr ""
msgid "Satisfied"
@@ -29189,7 +29598,7 @@ msgstr ""
msgid "Save pipeline schedule"
msgstr ""
-msgid "Save space and find images in the container Registry. remove unneeded tags and keep only the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
+msgid "Save storage space by automatically deleting tags from the container registry and keeping the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
msgstr ""
msgid "Saving"
@@ -29363,6 +29772,9 @@ msgstr ""
msgid "Search or filter results…"
msgstr ""
+msgid "Search or jump to..."
+msgstr ""
+
msgid "Search project"
msgstr ""
@@ -29423,16 +29835,16 @@ msgstr ""
msgid "SearchCodeResults|of %{link_to_project}"
msgstr ""
-msgid "SearchResults|Showing %{count} %{scope} for%{term_element}"
+msgid "SearchResults|Showing %{count} %{scope} for %{term_element}"
msgstr ""
-msgid "SearchResults|Showing %{count} %{scope} for%{term_element} in your personal and project snippets"
+msgid "SearchResults|Showing %{count} %{scope} for %{term_element} in your personal and project snippets"
msgstr ""
-msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for%{term_element}"
+msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for %{term_element}"
msgstr ""
-msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for%{term_element} in your personal and project snippets"
+msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for %{term_element} in your personal and project snippets"
msgstr ""
msgid "SearchResults|code result"
@@ -29514,6 +29926,9 @@ msgstr ""
msgid "Secret Detection"
msgstr ""
+msgid "Secret access key"
+msgstr ""
+
msgid "Secret token"
msgstr ""
@@ -29553,9 +29968,6 @@ msgstr ""
msgid "SecurityApprovals|A merge request approval is required when the license compliance report contains a denied license."
msgstr ""
-msgid "SecurityApprovals|Configurable if security scanners are enabled. %{linkStart}Learn more.%{linkEnd}"
-msgstr ""
-
msgid "SecurityApprovals|Coverage-Check"
msgstr ""
@@ -29568,24 +29980,18 @@ msgstr ""
msgid "SecurityApprovals|Learn more about Vulnerability-Check"
msgstr ""
-msgid "SecurityApprovals|License Scanning must be enabled. %{linkStart}Learn more%{linkEnd}."
-msgstr ""
-
msgid "SecurityApprovals|License-Check"
msgstr ""
msgid "SecurityApprovals|Requires approval for Denied licenses. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}More information%{linkEnd}"
+msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "SecurityApprovals|Requires approval for vulnerabilities. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
-msgid "SecurityApprovals|Test coverage must be enabled. %{linkStart}Learn more%{linkEnd}."
-msgstr ""
-
msgid "SecurityApprovals|Vulnerability-Check"
msgstr ""
@@ -29649,6 +30055,12 @@ msgstr ""
msgid "SecurityConfiguration|Immediately begin risk analysis and remediation with application security features. Start with SAST and Secret Detection, available to all plans. Upgrade to Ultimate to get all features, including:"
msgstr ""
+msgid "SecurityConfiguration|Manage corpus"
+msgstr ""
+
+msgid "SecurityConfiguration|Manage corpus files used as mutation sources in coverage fuzzing."
+msgstr ""
+
msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
msgstr ""
@@ -29703,6 +30115,12 @@ msgstr ""
msgid "SecurityOrchestration|Action"
msgstr ""
+msgid "SecurityOrchestration|Actions"
+msgstr ""
+
+msgid "SecurityOrchestration|Add rule"
+msgstr ""
+
msgid "SecurityOrchestration|All policies"
msgstr ""
@@ -29736,9 +30154,6 @@ msgstr ""
msgid "SecurityOrchestration|Network"
msgstr ""
-msgid "SecurityOrchestration|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
-msgstr ""
-
msgid "SecurityOrchestration|New policy"
msgstr ""
@@ -29754,6 +30169,9 @@ msgstr ""
msgid "SecurityOrchestration|Policy editor"
msgstr ""
+msgid "SecurityOrchestration|Policy preview"
+msgstr ""
+
msgid "SecurityOrchestration|Policy status"
msgstr ""
@@ -29763,6 +30181,9 @@ msgstr ""
msgid "SecurityOrchestration|Rule"
msgstr ""
+msgid "SecurityOrchestration|Rules"
+msgstr ""
+
msgid "SecurityOrchestration|Scan Execution"
msgstr ""
@@ -29856,6 +30277,9 @@ msgstr ""
msgid "SecurityReports|Create issue"
msgstr ""
+msgid "SecurityReports|Development vulnerabilities"
+msgstr ""
+
msgid "SecurityReports|Dismiss vulnerability"
msgstr ""
@@ -29871,6 +30295,9 @@ msgstr ""
msgid "SecurityReports|Download results"
msgstr ""
+msgid "SecurityReports|Download scanned URLs"
+msgstr ""
+
msgid "SecurityReports|Download scanned resources"
msgstr ""
@@ -29994,6 +30421,9 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
+msgid "SecurityReports|The Vulnerability Report shows the results of the lastest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "SecurityReports|The security reports below contain one or more vulnerability findings that could not be parsed and were not recorded. Download the artifacts in the job output to investigate. Ensure any security report created conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
msgstr ""
@@ -30135,10 +30565,10 @@ msgstr ""
msgid "Select a repository"
msgstr ""
-msgid "Select a role"
+msgid "Select a repository containing templates for common files."
msgstr ""
-msgid "Select a shared template repository for all projects on this instance."
+msgid "Select a role"
msgstr ""
msgid "Select a template repository"
@@ -30216,6 +30646,9 @@ msgstr ""
msgid "Select project to choose zone"
msgstr ""
+msgid "Select project to create issue"
+msgstr ""
+
msgid "Select projects"
msgstr ""
@@ -30333,6 +30766,9 @@ msgstr ""
msgid "Send emails to help guide new users through the onboarding process."
msgstr ""
+msgid "Send emails to users upon account deactivation."
+msgstr ""
+
msgid "Send message"
msgstr ""
@@ -30351,6 +30787,9 @@ msgstr ""
msgid "Send service data"
msgstr ""
+msgid "Sentry"
+msgstr ""
+
msgid "Sentry API URL"
msgstr ""
@@ -30465,6 +30904,9 @@ msgstr ""
msgid "Service"
msgstr ""
+msgid "Service Accounts keys are required to authorize GitLab to deploy your Google Cloud project."
+msgstr ""
+
msgid "Service Desk"
msgstr ""
@@ -30537,15 +30979,15 @@ msgstr ""
msgid "Set a password on your account to pull or push via %{protocol}."
msgstr ""
-msgid "Set a template repository for projects in this group"
-msgstr ""
-
msgid "Set access permissions for this token."
msgstr ""
msgid "Set an instance-wide domain that will be available to all clusters when installing Knative."
msgstr ""
+msgid "Set any rate limit to %{code_open}0%{code_close} to disable the limit."
+msgstr ""
+
msgid "Set default and restrict visibility levels. Configure import sources and git access protocol."
msgstr ""
@@ -30558,7 +31000,7 @@ msgstr ""
msgid "Set limit to 0 to allow any file size."
msgstr ""
-msgid "Set max session time for web terminal."
+msgid "Set limits for web and API requests."
msgstr ""
msgid "Set milestone"
@@ -30567,15 +31009,18 @@ msgstr ""
msgid "Set new password"
msgstr ""
-msgid "Set notification email for abuse reports."
+msgid "Set parent epic to an epic"
msgstr ""
-msgid "Set parent epic to an epic"
+msgid "Set per-user rate limits for imports and exports of projects and groups."
msgstr ""
msgid "Set projects and maximum size limits, session duration, user options, and check feature availability for namespace plan."
msgstr ""
+msgid "Set rate limits for package registry API requests that supersede the general user and IP rate limits."
+msgstr ""
+
msgid "Set severity"
msgstr ""
@@ -30594,15 +31039,24 @@ msgstr ""
msgid "Set the default branch for this project. All merge requests and commits are made against this branch unless you specify a different one."
msgstr ""
+msgid "Set the default expiration time for job artifacts in all projects. Set to %{code_open}0%{code_close} to never expire artifacts by default. If no unit is written, it defaults to seconds. For example, these are all equivalent: %{code_open}3600%{code_close}, %{code_open}60 minutes%{code_close}, or %{code_open}one hour%{code_close}."
+msgstr ""
+
msgid "Set the due date to %{due_date}."
msgstr ""
msgid "Set the iteration to %{iteration_reference}."
msgstr ""
+msgid "Set the maximum session time for a web terminal."
+msgstr ""
+
msgid "Set the milestone to %{milestone_reference}."
msgstr ""
+msgid "Set the per-user rate limit for notes created by web or API requests."
+msgstr ""
+
msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
msgstr ""
@@ -30804,6 +31258,9 @@ msgstr ""
msgid "Show Pipeline IID"
msgstr ""
+msgid "Show all %{issuable_type}."
+msgstr ""
+
msgid "Show all activity"
msgstr ""
@@ -30855,15 +31312,9 @@ msgstr ""
msgid "Show list"
msgstr ""
-msgid "Show me advanced features"
-msgstr ""
-
msgid "Show me how to add a pipeline"
msgstr ""
-msgid "Show me the basics"
-msgstr ""
-
msgid "Show one file at a time"
msgstr ""
@@ -30904,15 +31355,15 @@ msgstr ""
msgid "Showing %{pageSize} of %{total} %{issuableType}"
msgstr ""
-msgid "Showing %{pageSize} of %{total} issues"
-msgstr ""
-
msgid "Showing all epics"
msgstr ""
msgid "Showing all issues"
msgstr ""
+msgid "Showing data for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
+msgstr ""
+
msgid "Showing data for workflow items created in this date range. Date range cannot exceed %{maxDateRange} days."
msgstr ""
@@ -30952,6 +31403,15 @@ msgstr ""
msgid "Sidebar|Weight"
msgstr ""
+msgid "Sidekiq job compression threshold (bytes)"
+msgstr ""
+
+msgid "Sidekiq job size limit (bytes)"
+msgstr ""
+
+msgid "Sidekiq job size limits"
+msgstr ""
+
msgid "Sign in"
msgstr ""
@@ -31072,6 +31532,9 @@ msgstr ""
msgid "Site profile not found for given parameters"
msgstr ""
+msgid "Sites"
+msgstr ""
+
msgid "Size"
msgstr ""
@@ -31102,19 +31565,22 @@ msgstr ""
msgid "SlackIntegration|Sends notifications about project events to Slack channels."
msgstr ""
-msgid "SlackService|2. Paste the %{strong_open}Token%{strong_close} into the field below"
+msgid "SlackService|1. %{slash_command_link_start}Add a slash command%{slash_command_link_end} in your Slack team using this information:"
msgstr ""
-msgid "SlackService|3. Select the %{strong_open}Active%{strong_close} checkbox, press %{strong_open}Save changes%{strong_close} and start using GitLab inside Slack!"
+msgid "SlackService|2. Paste the token from Slack in the %{strong_open}Token%{strong_close} field below."
msgstr ""
-msgid "SlackService|Fill in the word that works best for your team."
+msgid "SlackService|3. Select the %{strong_open}Active%{strong_close} checkbox, select %{strong_open}Save changes%{strong_close}, and start using slash commands in Slack!"
+msgstr ""
+
+msgid "SlackService|After setup, get a list of available Slack slash commands by entering"
msgstr ""
-msgid "SlackService|See list of available commands in Slack after setting up this service, by entering"
+msgid "SlackService|Fill in the word that works best for your team."
msgstr ""
-msgid "SlackService|This service allows users to perform common operations on this project by entering slash commands in Slack."
+msgid "SlackService|Perform common operations in this project by entering slash commands in Slack."
msgstr ""
msgid "Slice multiplier"
@@ -31180,7 +31646,7 @@ msgstr ""
msgid "Some child epics may be hidden due to applied filters"
msgstr ""
-msgid "Some common domains are not allowed. %{read_more_link}."
+msgid "Some common domains are not allowed. %{learn_more_link}."
msgstr ""
msgid "Some of the designs you tried uploading did not change:"
@@ -31264,9 +31730,6 @@ msgstr ""
msgid "Something went wrong while exporting requirements"
msgstr ""
-msgid "Something went wrong while fetching %{listType} list"
-msgstr ""
-
msgid "Something went wrong while fetching branches"
msgstr ""
@@ -31321,15 +31784,9 @@ msgstr ""
msgid "Something went wrong while merging this merge request. Please try again."
msgstr ""
-msgid "Something went wrong while moving issues."
-msgstr ""
-
msgid "Something went wrong while obtaining the Let's Encrypt certificate."
msgstr ""
-msgid "Something went wrong while performing the action."
-msgstr ""
-
msgid "Something went wrong while promoting the issue to an epic. Please try again."
msgstr ""
@@ -31657,7 +32114,10 @@ msgstr ""
msgid "SourcegraphPreferences|Uses a custom %{linkStart}Sourcegraph instance%{linkEnd}."
msgstr ""
-msgid "Spam Check API Key"
+msgid "Spam Check"
+msgstr ""
+
+msgid "Spam Check API key"
msgstr ""
msgid "Spam Logs"
@@ -31675,7 +32135,7 @@ msgstr ""
msgid "Specified URL cannot be used: \"%{reason}\""
msgstr ""
-msgid "Specify an e-mail address regex pattern to identify default internal users."
+msgid "Specify an email address regex pattern to identify default internal users."
msgstr ""
msgid "Speed up your pipelines with Needs relationships"
@@ -31930,7 +32390,7 @@ msgstr ""
msgid "StatusCheck|An error occurred fetching the status checks."
msgstr ""
-msgid "StatusCheck|Apply this status check to any branch or a specific protected branch."
+msgid "StatusCheck|Apply this status check to all branches or a specific protected branch."
msgstr ""
msgid "StatusCheck|Check for a status response in Merge Requests. Failures do not block merges. %{link_start}Learn more%{link_end}."
@@ -32269,6 +32729,9 @@ msgstr ""
msgid "Subscriptions"
msgstr ""
+msgid "Subscription|Your subscription for %{strong}%{namespace_name}%{strong_close} has expired and you are now on %{pricing_link_start}the GitLab Free tier%{pricing_link_end}. Don't worry, your data is safe. Get in touch with our support team (%{support_email}). They'll gladly help with your subscription renewal."
+msgstr ""
+
msgid "Subtracted"
msgstr ""
@@ -32497,6 +32960,9 @@ msgstr ""
msgid "SuperSonics|Plan"
msgstr ""
+msgid "SuperSonics|Please agree to the Subscription Agreement"
+msgstr ""
+
msgid "SuperSonics|Ready to get started? A GitLab plan is ideal for scaling organizations and for multi team usage."
msgstr ""
@@ -32527,6 +32993,9 @@ msgstr ""
msgid "SuperSonics|The activation code is not valid. Please make sure to copy it exactly from the Customers Portal or confirmation email. Learn more about %{linkStart}activating your subscription%{linkEnd}."
msgstr ""
+msgid "SuperSonics|The activation code should be a 24-character alphanumeric string"
+msgstr ""
+
msgid "SuperSonics|There is a connectivity issue."
msgstr ""
@@ -32569,9 +33038,15 @@ msgstr ""
msgid "SuperSonics|You do not have an active subscription"
msgstr ""
+msgid "SuperSonics|You have successfully added a license that activates on %{date}. Please see the subscription history table below for more details."
+msgstr ""
+
msgid "SuperSonics|You'll be charged for %{trueUpLinkStart}users over license%{trueUpLinkEnd} on a quarterly or annual basis, depending on the terms of your agreement."
msgstr ""
+msgid "SuperSonics|Your future dated license was successfully added"
+msgstr ""
+
msgid "SuperSonics|Your subscription"
msgstr ""
@@ -32824,7 +33299,7 @@ msgstr ""
msgid "Template to append to all Service Desk issues"
msgstr ""
-msgid "TemplateRepository|Select a repository to make its templates available to all projects. %{link_start}What should the repository contain?%{link_end} "
+msgid "TemplateRepository|Create common files more quickly, and standardize their format."
msgstr ""
msgid "Templates"
@@ -33030,7 +33505,7 @@ msgstr ""
msgid "TestCases|Search test cases"
msgstr ""
-msgid "TestCases|Something went wrong while adding test case to Todo."
+msgid "TestCases|Something went wrong while adding test case to a to-do item."
msgstr ""
msgid "TestCases|Something went wrong while creating a test case."
@@ -33042,7 +33517,7 @@ msgstr ""
msgid "TestCases|Something went wrong while fetching test cases list."
msgstr ""
-msgid "TestCases|Something went wrong while marking test case todo as done."
+msgid "TestCases|Something went wrong while marking test case to-do item as done."
msgstr ""
msgid "TestCases|Something went wrong while moving test case."
@@ -33162,7 +33637,7 @@ msgstr ""
msgid "Thanks for your purchase!"
msgstr ""
-msgid "That is ok, I do not want to renew"
+msgid "That's OK, I don't want to renew"
msgstr ""
msgid "That's it, well done!"
@@ -33185,7 +33660,7 @@ msgid_plural "The %{type} contains the following errors:"
msgstr[0] ""
msgstr[1] ""
-msgid "The API key used by GitLab for accessing the Spam Check service endpoint"
+msgid "The API key used by GitLab for accessing the Spam Check service endpoint."
msgstr ""
msgid "The GitLab subscription service (customers.gitlab.com) is currently experiencing an outage. You can monitor the status and get updates at %{linkStart}status.gitlab.com%{linkEnd}."
@@ -33224,9 +33699,6 @@ msgstr ""
msgid "The URL to use for connecting to Elasticsearch. Use a comma-separated list to support clustering (e.g., \"http://localhost:9200, http://localhost:9201\")."
msgstr ""
-msgid "The Vulnerability Report shows the results of the last successful pipeline run on the default branch."
-msgstr ""
-
msgid "The X509 Certificate to use when mutual TLS is required to communicate with the external authorization service. If left blank, the server certificate is still validated when accessing over HTTPS."
msgstr ""
@@ -33284,9 +33756,6 @@ msgstr ""
msgid "The default branch for this project has been changed. Please update your bookmarks."
msgstr ""
-msgid "The default expiration time for job artifacts. 0 for unlimited. The default unit is in seconds, but you can use other units, for example %{code_open}4 mins 2 sec%{code_close}, %{code_open}2h42min%{code_close}."
-msgstr ""
-
msgid "The dependency list details information about the components used within your project."
msgstr ""
@@ -33478,9 +33947,6 @@ msgstr ""
msgid "The merge conflicts for this merge request have already been resolved. Please return to the merge request."
msgstr ""
-msgid "The merge request can now be merged."
-msgstr ""
-
msgid "The metric must be one of %{metrics}."
msgstr ""
@@ -33856,7 +34322,7 @@ msgstr ""
msgid "There was a problem updating the keep latest artifacts setting."
msgstr ""
-msgid "There was an error %{message} todo."
+msgid "There was an error %{message} to-do item."
msgstr ""
msgid "There was an error adding a To Do."
@@ -33895,6 +34361,9 @@ msgstr ""
msgid "There was an error fetching projects"
msgstr ""
+msgid "There was an error fetching search autocomplete suggestions"
+msgstr ""
+
msgid "There was an error fetching stage total counts"
msgstr ""
@@ -34219,6 +34688,9 @@ msgstr ""
msgid "This field is required."
msgstr ""
+msgid "This form is disabled in preview"
+msgstr ""
+
msgid "This group"
msgstr ""
@@ -34240,9 +34712,6 @@ msgstr ""
msgid "This group is linked to a subscription"
msgstr ""
-msgid "This group, including all subgroups, projects and git repositories, will be reachable from only the specified IP address ranges."
-msgstr ""
-
msgid "This group, its subgroups and projects has been scheduled for removal on %{date}."
msgstr ""
@@ -34522,9 +34991,6 @@ msgstr ""
msgid "This user cannot be unlocked manually from GitLab"
msgstr ""
-msgid "This user does not have a pending request"
-msgstr ""
-
msgid "This user has an unconfirmed email address (%{email}). You may force a confirmation."
msgstr ""
@@ -34633,9 +35099,6 @@ msgstr ""
msgid "ThreatMonitoring|Packet Activity"
msgstr ""
-msgid "ThreatMonitoring|Policies"
-msgstr ""
-
msgid "ThreatMonitoring|Requests"
msgstr ""
@@ -34687,6 +35150,12 @@ msgstr ""
msgid "ThreatMonitoring|View documentation"
msgstr ""
+msgid "Threshold in bytes at which to compress Sidekiq job arguments."
+msgstr ""
+
+msgid "Threshold in bytes at which to reject Sidekiq jobs. Set this to 0 to if you don't want to limit Sidekiq jobs."
+msgstr ""
+
msgid "Throughput"
msgstr ""
@@ -34696,6 +35165,9 @@ msgstr ""
msgid "Time"
msgstr ""
+msgid "Time (in hours) that users are allowed to skip forced configuration of two-factor authentication."
+msgstr ""
+
msgid "Time Spent"
msgstr ""
@@ -34762,7 +35234,7 @@ msgstr ""
msgid "TimeTrackingEstimated|Est"
msgstr ""
-msgid "TimeTracking|%{startTag}Spent: %{endTag}%{timeSpentHumanReadable}"
+msgid "TimeTracking|%{spentStart}Spent: %{spentEnd}"
msgstr ""
msgid "TimeTracking|Estimated:"
@@ -34976,6 +35448,9 @@ msgstr ""
msgid "To access this domain create a new DNS record"
msgstr ""
+msgid "To add a custom suffix, set up a Service Desk email address. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "To add an SSH key you need to %{generate_link_start}generate one%{link_end} or use an %{existing_link_start}existing key%{link_end}."
msgstr ""
@@ -34997,13 +35472,16 @@ msgstr ""
msgid "To connect an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To continue using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
+msgstr ""
+
msgid "To continue, you need to select the link in the confirmation email we sent to verify your email address. If you didn't get our email, select %{strongStart}Resend confirmation email.%{strongEnd}"
msgstr ""
msgid "To define internal users, first enable new users set to external"
msgstr ""
-msgid "To enable Registration Features, make sure \"Enable service ping\" is checked."
+msgid "To enable Registration Features, first enable Service Ping."
msgstr ""
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
@@ -35030,7 +35508,7 @@ msgstr ""
msgid "To get started, use the link below to confirm your account."
msgstr ""
-msgid "To help improve GitLab and its user experience, GitLab will periodically collect usage information."
+msgid "To help improve GitLab and its user experience, GitLab periodically collects usage information."
msgstr ""
msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
@@ -35063,7 +35541,7 @@ msgstr ""
msgid "To preserve performance only %{strong_open}%{display_size} of %{real_size}%{strong_close} files are displayed."
msgstr ""
-msgid "To protect this issue's confidentiality, %{forkLink} and set the fork's visibility to private."
+msgid "To protect this issue's confidentiality, %{linkStart}fork this project%{linkEnd} and set the fork's visibility to private."
msgstr ""
msgid "To protect this issue's confidentiality, a private fork of this project was selected."
@@ -35096,12 +35574,15 @@ msgstr ""
msgid "To set up SAML authentication for your group through an identity provider like Azure, Okta, Onelogin, Ping Identity, or your custom SAML 2.0 provider:"
msgstr ""
-msgid "To set up this service:"
+msgid "To set up this integration:"
msgstr ""
msgid "To specify the notification level per project of a group you belong to, you need to visit project page and change notification level there."
msgstr ""
+msgid "To start using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
+msgstr ""
+
msgid "To unsubscribe from this issue, please paste the following link into your browser:"
msgstr ""
@@ -35689,9 +36170,6 @@ msgstr ""
msgid "Unable to fetch branches list, please close the form and try again"
msgstr ""
-msgid "Unable to fetch unscanned projects"
-msgstr ""
-
msgid "Unable to fetch vulnerable projects"
msgstr ""
@@ -35746,6 +36224,15 @@ msgstr ""
msgid "Unable to update this issue at this time."
msgstr ""
+msgid "Unapprove a merge request"
+msgstr ""
+
+msgid "Unapprove the current merge request."
+msgstr ""
+
+msgid "Unapproved the current merge request."
+msgstr ""
+
msgid "Unarchive project"
msgstr ""
@@ -35758,16 +36245,13 @@ msgstr ""
msgid "Unassigned"
msgstr ""
-msgid "Unauthenticated API request rate limit"
-msgstr ""
-
-msgid "Unauthenticated rate limit period in seconds"
+msgid "Unauthenticated API rate limit period in seconds"
msgstr ""
-msgid "Unauthenticated request rate limit"
+msgid "Unauthenticated requests"
msgstr ""
-msgid "Unauthenticated requests"
+msgid "Unauthenticated web rate limit period in seconds"
msgstr ""
msgid "Undo"
@@ -35869,18 +36353,6 @@ msgstr ""
msgid "Unresolved"
msgstr ""
-msgid "UnscannedProjects|15 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|30 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|5 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|60 or more days"
-msgstr ""
-
msgid "Unschedule job"
msgstr ""
@@ -36100,6 +36572,9 @@ msgstr ""
msgid "UsageQuota|%{help_link_start}Shared runners%{help_link_end} are disabled, so there are no limits set on pipeline usage"
msgstr ""
+msgid "UsageQuota|%{linkTitle} help link"
+msgstr ""
+
msgid "UsageQuota|%{percentageLeft} of purchased storage is available"
msgstr ""
@@ -36109,6 +36584,9 @@ msgstr ""
msgid "UsageQuota|Artifacts is a sum of build and pipeline artifacts."
msgstr ""
+msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
+msgstr ""
+
msgid "UsageQuota|Buy additional minutes"
msgstr ""
@@ -36118,9 +36596,21 @@ msgstr ""
msgid "UsageQuota|CI minutes usage by project"
msgstr ""
+msgid "UsageQuota|Code packages and container images."
+msgstr ""
+
msgid "UsageQuota|Current period usage"
msgstr ""
+msgid "UsageQuota|File attachments and smaller design graphics."
+msgstr ""
+
+msgid "UsageQuota|Git repository, managed by the Gitaly service."
+msgstr ""
+
+msgid "UsageQuota|Includes project registry, artifacts, packages, wiki, uploads and other items."
+msgstr ""
+
msgid "UsageQuota|Increase storage temporarily"
msgstr ""
@@ -36139,6 +36629,9 @@ msgstr ""
msgid "UsageQuota|Packages"
msgstr ""
+msgid "UsageQuota|Pipeline artifacts and job artifacts, created with CI/CD."
+msgstr ""
+
msgid "UsageQuota|Pipelines"
msgstr ""
@@ -36157,6 +36650,9 @@ msgstr ""
msgid "UsageQuota|Seats"
msgstr ""
+msgid "UsageQuota|Shared bits of code and text."
+msgstr ""
+
msgid "UsageQuota|Snippets"
msgstr ""
@@ -36166,6 +36662,12 @@ msgstr ""
msgid "UsageQuota|Storage"
msgstr ""
+msgid "UsageQuota|Storage type"
+msgstr ""
+
+msgid "UsageQuota|There is a known issue with Artifact storage where the total could be incorrect for some projects. More details and progress are available in %{warningLinkStart}the epic%{warningLinkEnd}."
+msgstr ""
+
msgid "UsageQuota|This is the total amount of storage used across your projects within this namespace."
msgstr ""
@@ -36205,6 +36707,9 @@ msgstr ""
msgid "UsageQuota|Usage"
msgstr ""
+msgid "UsageQuota|Usage Breakdown"
+msgstr ""
+
msgid "UsageQuota|Usage Quotas"
msgstr ""
@@ -36229,6 +36734,9 @@ msgstr ""
msgid "UsageQuota|Wiki"
msgstr ""
+msgid "UsageQuota|Wiki content."
+msgstr ""
+
msgid "UsageQuota|Wikis"
msgstr ""
@@ -36445,7 +36953,10 @@ msgstr ""
msgid "User Settings"
msgstr ""
-msgid "User and IP Rate Limits"
+msgid "User and IP rate limits"
+msgstr ""
+
+msgid "User does not have a pending request"
msgstr ""
msgid "User identity was successfully created."
@@ -36742,6 +37253,9 @@ msgstr ""
msgid "Users can launch a development environment from a GitLab browser tab when the %{linkStart}Gitpod%{linkEnd} integration is enabled."
msgstr ""
+msgid "Users can reactivate their account by signing in."
+msgstr ""
+
msgid "Users can render diagrams in AsciiDoc, Markdown, reStructuredText, and Textile documents using Kroki."
msgstr ""
@@ -36757,6 +37271,9 @@ msgstr ""
msgid "Users requesting access to"
msgstr ""
+msgid "Users to exclude from the rate limit"
+msgstr ""
+
msgid "Users were successfully added."
msgstr ""
@@ -36778,6 +37295,9 @@ msgstr ""
msgid "UsersSelect|Unassigned"
msgstr ""
+msgid "Uses GitLab as a lightweight alternative to Sentry."
+msgstr ""
+
msgid "Using %{code_start}::%{code_end} denotes a %{link_start}scoped label set%{link_end}"
msgstr ""
@@ -36808,10 +37328,7 @@ msgstr ""
msgid "Value Stream Analytics can help you determine your team’s velocity"
msgstr ""
-msgid "Value Stream Analytics gives an overview of how much time it takes to go from idea to production in your project."
-msgstr ""
-
-msgid "Value may contain a variable reference"
+msgid "Value might contain a variable reference"
msgstr ""
msgid "Value stream"
@@ -36877,10 +37394,10 @@ msgstr ""
msgid "ValueStream|The Default Value Stream cannot be deleted"
msgstr ""
-msgid "Variable"
+msgid "Values that contain the %{codeStart}$%{codeEnd} character can be considered a variable reference and expanded. %{docsLinkStart}Learn more.%{docsLinkEnd}"
msgstr ""
-msgid "Variable references indicated by %{codeStart}$%{codeEnd} may be expanded. If this is not what you want, consider %{docsLinkStart}using a workaround to prevent expansion%{docsLinkEnd}."
+msgid "Variable"
msgstr ""
msgid "Variable will be masked in job logs."
@@ -37285,6 +37802,9 @@ msgstr ""
msgid "Vulnerability|Evidence"
msgstr ""
+msgid "Vulnerability|False positive detected"
+msgstr ""
+
msgid "Vulnerability|File"
msgstr ""
@@ -37327,6 +37847,9 @@ msgstr ""
msgid "Vulnerability|Status"
msgstr ""
+msgid "Vulnerability|The scanner determined this vulnerability to be a false positive. Verify the evaluation before changing its status. %{linkStart}Learn more about false positive detection.%{linkEnd}"
+msgstr ""
+
msgid "Vulnerability|The unmodified response is the original response that had no mutations done to the request"
msgstr ""
@@ -37651,9 +38174,6 @@ msgstr ""
msgid "Welcome to GitLab,%{br_tag}%{name}!"
msgstr ""
-msgid "Welcome to the guided GitLab tour"
-msgstr ""
-
msgid "Welcome, %{name}!"
msgstr ""
@@ -37672,9 +38192,6 @@ msgstr ""
msgid "What are you searching for?"
msgstr ""
-msgid "What describes you best?"
-msgstr ""
-
msgid "What does this command do?"
msgstr ""
@@ -37696,13 +38213,13 @@ msgstr ""
msgid "What is your job title? (optional)"
msgstr ""
-msgid "What will you use this group for?"
+msgid "What templates can I create?"
msgstr ""
-msgid "What's new"
+msgid "What will you use this group for?"
msgstr ""
-msgid "What’s your experience level?"
+msgid "What's new"
msgstr ""
msgid "When a deployment job is successful, skip older deployment jobs that are still pending."
@@ -37714,6 +38231,9 @@ msgstr ""
msgid "When an event in GitLab triggers a webhook, you can use the request details to figure out if something went wrong."
msgstr ""
+msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+msgstr ""
+
msgid "When inactive, an external authentication provider must be used."
msgstr ""
@@ -37737,6 +38257,9 @@ msgstr ""
msgid "When:"
msgstr ""
+msgid "Which API requests are affected?"
+msgstr ""
+
msgid "While it's rare to have no vulnerabilities, it can happen. In any event, we ask that you please double check your settings to make sure you've set up your dashboard correctly."
msgstr ""
@@ -38016,6 +38539,9 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|Work Items"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -38091,6 +38617,9 @@ msgstr ""
msgid "You are already a member of this %{member_source}."
msgstr ""
+msgid "You are already impersonating another user"
+msgstr ""
+
msgid "You are an admin, which means granting access to %{client_name} will allow them to interact with GitLab as an admin as well. Proceed with caution."
msgstr ""
@@ -38193,6 +38722,9 @@ msgstr ""
msgid "You can also use project access tokens with Git to authenticate over HTTP(S). %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "You can always change your URL later"
+msgstr ""
+
msgid "You can always edit this later"
msgstr ""
@@ -38349,10 +38881,10 @@ msgstr ""
msgid "You can’t %{tag_start}edit%{tag_end} files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
-msgid "You could not create a new trigger."
+msgid "You can’t edit files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
-msgid "You didn't renew your subscription for %{strong}%{namespace_name}%{strong_close} so it was downgraded to the free plan."
+msgid "You could not create a new trigger."
msgstr ""
msgid "You do not have any subscriptions yet"
@@ -38520,6 +39052,12 @@ msgstr ""
msgid "You must provide your current password in order to change it."
msgstr ""
+msgid "You must sign in to search for specific projects."
+msgstr ""
+
+msgid "You must sign in to search for specific terms."
+msgstr ""
+
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
@@ -38547,6 +39085,9 @@ msgstr ""
msgid "You need to upload a GitLab project export archive (ending in .gz)."
msgstr ""
+msgid "You need to verify your primary email first before enabling Two-Factor Authentication."
+msgstr ""
+
msgid "You successfully declined the invitation"
msgstr ""
@@ -38655,10 +39196,10 @@ msgstr ""
msgid "Your %{host} account was signed in to from a new location"
msgstr ""
-msgid "Your %{strong}%{plan_name}%{strong_close} subscription for %{strong}%{namespace_name}%{strong_close} will expire on %{strong}%{expires_on}%{strong_close}."
+msgid "Your %{strong}%{plan_name}%{strong_close} subscription expires on %{strong}%{expires_on}%{strong_close}. After that date, you cannot create issues or merge requests, or use many other features."
msgstr ""
-msgid "Your %{strong}%{plan_name}%{strong_close} subscription will expire on %{strong}%{expires_on}%{strong_close}. After that, you will not be able to create issues or merge requests as well as many other features."
+msgid "Your %{strong}%{plan_name}%{strong_close} subscription for %{strong}%{namespace_name}%{strong_close} will expire on %{strong}%{expires_on}%{strong_close}."
msgstr ""
msgid "Your CI/CD configuration syntax is invalid. View Lint tab for more details."
@@ -38682,7 +39223,7 @@ msgstr ""
msgid "Your GPG keys (%{count})"
msgstr ""
-msgid "Your GitLab account has been locked due to an excessive amount of unsuccessful sign in attempts. Your account will automatically unlock in %{duration} or you may click the link below to unlock now."
+msgid "Your GitLab account has been locked due to an excessive number of unsuccessful sign in attempts. You can wait for your account to automatically unlock in %{duration} or you can click the link below to unlock now."
msgstr ""
msgid "Your GitLab account request has been approved!"
@@ -38793,6 +39334,9 @@ msgstr ""
msgid "Your commit email is used for web based operations, such as edits and merges."
msgstr ""
+msgid "Your current password is required to register a two-factor authenticator app."
+msgstr ""
+
msgid "Your dashboard has been copied. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
@@ -38892,6 +39436,9 @@ msgstr ""
msgid "Your project limit is %{limit} projects! Please contact your administrator to increase it"
msgstr ""
+msgid "Your project will be created at:"
+msgstr ""
+
msgid "Your projects"
msgstr ""
@@ -38931,11 +39478,10 @@ msgstr ""
msgid "Your subscription expired!"
msgstr ""
-msgid "Your subscription has been downgraded."
-msgstr ""
-
-msgid "Your subscription will expire in %{remaining_days}."
-msgstr ""
+msgid "Your subscription will expire in %{remaining_days} day."
+msgid_plural "Your subscription will expire in %{remaining_days} days."
+msgstr[0] ""
+msgstr[1] ""
msgid "Your username is %{username}."
msgstr ""
@@ -39142,6 +39688,9 @@ msgstr ""
msgid "cannot merge"
msgstr ""
+msgid "cannot not be used for user namespace"
+msgstr ""
+
msgid "ciReport|%{degradedNum} degraded"
msgstr ""
@@ -39465,6 +40014,9 @@ msgstr ""
msgid "created %{timeAgo}"
msgstr ""
+msgid "created %{timeAgo} by %{author}"
+msgstr ""
+
msgid "created by"
msgstr ""
@@ -39509,9 +40061,6 @@ msgstr ""
msgid "does not have a supported extension. Only %{extension_list} are supported"
msgstr ""
-msgid "domain is not authorized for sign-up."
-msgstr ""
-
msgid "download it"
msgstr ""
@@ -39529,18 +40078,13 @@ msgstr ""
msgid "email '%{email}' is not a verified email."
msgstr ""
-msgid "email does not match the allowed domain of %{email_domains}"
-msgid_plural "email does not match the allowed domains: %{email_domains}"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "enabled"
msgstr ""
msgid "encrypted: needs to be a :required, :optional or :migrating!"
msgstr ""
-msgid "ending with MIME type format is not allowed."
+msgid "ending with a reserved file extension is not allowed."
msgstr ""
msgid "entries cannot be larger than 255 characters"
@@ -39564,6 +40108,9 @@ msgstr ""
msgid "estimateCommand|%{slash_command} overwrites the total estimated time."
msgstr ""
+msgid "example.com"
+msgstr ""
+
msgid "exceeds the limit of %{bytes} bytes"
msgstr ""
@@ -39614,9 +40161,6 @@ msgstr ""
msgid "fork"
msgstr ""
-msgid "fork this project"
-msgstr ""
-
msgid "from"
msgstr ""
@@ -39625,6 +40169,9 @@ msgid_plural "from %d jobs"
msgstr[0] ""
msgstr[1] ""
+msgid "frontmatter"
+msgstr ""
+
msgid "group"
msgstr ""
@@ -39652,6 +40199,9 @@ msgstr ""
msgid "has been completed."
msgstr ""
+msgid "has too deep level of nesting"
+msgstr ""
+
msgid "help"
msgstr ""
@@ -39685,9 +40235,21 @@ msgstr ""
msgid "in"
msgstr ""
+msgid "in Infrastructure :: Kubernetes clusters"
+msgstr ""
+
+msgid "in all GitLab"
+msgstr ""
+
+msgid "in group"
+msgstr ""
+
msgid "in group %{link_to_group}"
msgstr ""
+msgid "in project"
+msgstr ""
+
msgid "in project %{link_to_project}"
msgstr ""
@@ -39729,16 +40291,19 @@ msgstr ""
msgid "is not a valid X509 certificate."
msgstr ""
-msgid "is not allowed since the group is not top-level group."
+msgid "is not allowed for sign-up."
msgstr ""
-msgid "is not allowed. Try again with a different email address, or contact your GitLab admin."
+msgid "is not allowed for this group."
msgstr ""
-msgid "is not allowed. We do not currently support project-level iterations"
+msgid "is not allowed for this project."
+msgstr ""
+
+msgid "is not allowed since the group is not top-level group."
msgstr ""
-msgid "is not from an allowed domain."
+msgid "is not allowed. We do not currently support project-level iterations"
msgstr ""
msgid "is not in the group enforcing Group Managed Account"
@@ -39831,6 +40396,9 @@ msgstr ""
msgid "log in"
msgstr ""
+msgid "managed"
+msgstr ""
+
msgid "manual"
msgstr ""
@@ -39878,6 +40446,9 @@ msgstr ""
msgid "mrWidget| Please restore it or use a different %{missingBranchName} branch"
msgstr ""
+msgid "mrWidget|%{linkStart}Set up now%{linkEnd} to analyze your source code for known security vulnerabilities."
+msgstr ""
+
msgid "mrWidget|%{mergeError}."
msgstr ""
@@ -39958,6 +40529,9 @@ msgid_plural "mrWidget|Closes issues"
msgstr[0] ""
msgstr[1] ""
+msgid "mrWidget|Create issue to resolve all threads"
+msgstr ""
+
msgid "mrWidget|Delete source branch"
msgstr ""
@@ -39967,12 +40541,18 @@ msgstr ""
msgid "mrWidget|Did not close"
msgstr ""
+msgid "mrWidget|Dismiss"
+msgstr ""
+
msgid "mrWidget|Email patches"
msgstr ""
msgid "mrWidget|Failed to load deployment statistics"
msgstr ""
+msgid "mrWidget|Hide %{widget} details"
+msgstr ""
+
msgid "mrWidget|If the %{missingBranchName} branch exists in your local repository, you can merge this merge request manually using the command line"
msgstr ""
@@ -40068,9 +40648,6 @@ msgstr ""
msgid "mrWidget|Request to merge"
msgstr ""
-msgid "mrWidget|Resolve all threads in new issue"
-msgstr ""
-
msgid "mrWidget|Resolve conflicts"
msgstr ""
@@ -40086,6 +40663,9 @@ msgstr ""
msgid "mrWidget|Revoke approval"
msgstr ""
+msgid "mrWidget|SAST and Secret Detection is not enabled."
+msgstr ""
+
msgid "mrWidget|Set by %{merge_author} to be added to the merge train when the pipeline succeeds"
msgstr ""
@@ -40095,6 +40675,9 @@ msgstr ""
msgid "mrWidget|Set by %{merge_author} to start a merge train when the pipeline succeeds"
msgstr ""
+msgid "mrWidget|Show %{widget} details"
+msgstr ""
+
msgid "mrWidget|The changes were merged into"
msgstr ""
@@ -40107,6 +40690,9 @@ msgstr ""
msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure, or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
msgstr ""
+msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure."
+msgstr ""
+
msgid "mrWidget|The source branch has been deleted"
msgstr ""
@@ -40149,6 +40735,9 @@ msgstr ""
msgid "mrWidget|You can merge after removing denied licenses"
msgstr ""
+msgid "mrWidget|You can only merge once this merge request is approved."
+msgstr ""
+
msgid "mrWidget|Your password"
msgstr ""
@@ -40185,6 +40774,9 @@ msgstr ""
msgid "must be less than the limit of %{tag_limit} tags"
msgstr ""
+msgid "must be set for a project namespace"
+msgstr ""
+
msgid "must be unique by status and elapsed time within a policy"
msgstr ""
@@ -40294,6 +40886,9 @@ msgstr ""
msgid "pipeline"
msgstr ""
+msgid "pipeline schedules documentation"
+msgstr ""
+
msgid "pod_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
msgstr ""
@@ -40343,16 +40938,25 @@ msgstr ""
msgid "project name"
msgstr ""
+msgid "project namespace cannot be the parent of another namespace"
+msgstr ""
+
msgid "projects"
msgstr ""
msgid "quick actions"
msgstr ""
-msgid "reCAPTCHA Private Key"
+msgid "reCAPTCHA"
+msgstr ""
+
+msgid "reCAPTCHA helps prevent credential stuffing."
msgstr ""
-msgid "reCAPTCHA Site Key"
+msgid "reCAPTCHA private key"
+msgstr ""
+
+msgid "reCAPTCHA site key"
msgstr ""
msgid "recent activity"
@@ -40579,6 +41183,9 @@ msgstr ""
msgid "user avatar"
msgstr ""
+msgid "user namespace cannot be the parent of another namespace"
+msgstr ""
+
msgid "user preferences"
msgstr ""
@@ -40671,3 +41278,9 @@ msgstr ""
msgid "your settings"
msgstr ""
+msgid "{group}"
+msgstr ""
+
+msgid "{project}"
+msgstr ""
+
diff --git a/locale/fr/gitlab.po b/locale/fr/gitlab.po
index 0add0ed26e4..8220aaa1aca 100644
--- a/locale/fr/gitlab.po
+++ b/locale/fr/gitlab.po
@@ -14,10 +14,7 @@ msgstr ""
"X-Crowdin-Language: fr\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-09-01 22:32\n"
-
-msgid " %{name}, confirm your email address now! "
-msgstr ""
+"PO-Revision-Date: 2021-10-04 20:20\n"
msgid " %{start} to %{end}"
msgstr " %{start} à %{end}"
@@ -92,6 +89,16 @@ msgstr ""
msgid "#general, #development"
msgstr ""
+msgid "%d Alert"
+msgid_plural "%d Alerts"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d Alert:"
+msgid_plural "%d Alerts:"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d Approval"
msgid_plural "%d Approvals"
msgstr[0] ""
@@ -455,8 +462,11 @@ msgstr ""
msgid "%{code_open}Protected:%{code_close} Only exposed to protected branches or tags."
msgstr ""
-msgid "%{commit_author_link} authored %{commit_timeago}"
-msgstr "%{commit_author_link} a créé %{commit_timeago}"
+msgid "%{commit_author_link} authored %{commit_authored_timeago}"
+msgstr ""
+
+msgid "%{commit_author_link} authored %{commit_authored_timeago} and %{commit_committer_avatar} %{commit_committer_link} committed %{commit_committer_timeago}"
+msgstr ""
msgid "%{completedCount} completed weight"
msgstr ""
@@ -549,6 +559,15 @@ msgstr ""
msgid "%{doc_link_start}Advanced search%{doc_link_end} is enabled."
msgstr ""
+msgid "%{docs_link_start}Learn about visibility levels.%{docs_link_end}"
+msgstr ""
+
+msgid "%{docs_link_start}What is Large File Storage?%{docs_link_end}"
+msgstr ""
+
+msgid "%{docs_link_start}What is two-factor authentication?%{docs_link_end}"
+msgstr ""
+
msgid "%{due_date} (Past due)"
msgstr ""
@@ -621,9 +640,6 @@ msgstr "%{issuableType} sera supprimé ! Êtesâ€vous sûr ?"
msgid "%{issueType} actions"
msgstr ""
-msgid "%{issuesCount} issues with a limit of %{maxIssueCount}"
-msgstr ""
-
msgid "%{issuesSize} with a limit of %{maxIssueCount}"
msgstr ""
@@ -681,6 +697,12 @@ msgstr ""
msgid "%{label_for_message} unavailable"
msgstr "%{label_for_message} indisponible"
+msgid "%{learn_more_link}."
+msgstr ""
+
+msgid "%{lessThan} 1 hour"
+msgstr ""
+
msgid "%{lets_encrypt_link_start}Let's Encrypt%{lets_encrypt_link_end} is a free, automated, and open certificate authority (CA) that issues digital certificates to enable HTTPS (SSL/TLS) for sites."
msgstr ""
@@ -693,15 +715,15 @@ msgstr ""
msgid "%{link_start}Learn more%{link_end} about roles."
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
-msgstr ""
-
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
msgstr ""
msgid "%{link_start}Start the title with %{draft_snippet}%{link_end} to prevent a merge request that is a work in progress from being merged before it's ready."
msgstr ""
+msgid "%{link_start}What information does GitLab Inc. collect?%{link_end}"
+msgstr ""
+
msgid "%{listToShow}, and %{awardsListLength} more"
msgstr ""
@@ -854,7 +876,7 @@ msgid_plural "%{securityScanner} results are not available because a pipeline ha
msgstr[0] ""
msgstr[1] ""
-msgid "%{service_ping_link_start}Learn more%{service_ping_link_end} about what information is shared with GitLab Inc."
+msgid "%{service_ping_link_start}What information is shared with GitLab Inc.?%{service_ping_link_end}"
msgstr ""
msgid "%{size} %{unit}"
@@ -890,6 +912,9 @@ msgstr ""
msgid "%{state} epics"
msgstr "épopées %{state}"
+msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
+msgstr ""
+
msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
msgstr ""
@@ -949,11 +974,6 @@ msgstr ""
msgid "%{template_project_id} is unknown or invalid"
msgstr ""
-msgid "%{text} %{files}"
-msgid_plural "%{text} %{files} files"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%{text} is available"
msgstr "%{text} est disponible"
@@ -1038,9 +1058,6 @@ msgstr ""
msgid "%{wildcards_link_start}Wildcards%{wildcards_link_end} such as %{code_tag_start}v*%{code_tag_end} or %{code_tag_start}*-release%{code_tag_end} are supported."
msgstr ""
-msgid "&lt; 1 hour"
-msgstr ""
-
msgid "'%{data}' at %{location} does not match format: %{format}"
msgstr ""
@@ -1124,9 +1141,6 @@ msgstr ""
msgid "(we need your current password to confirm your changes)"
msgstr ""
-msgid "* * * * *"
-msgstr ""
-
msgid "+ %{amount} more"
msgstr ""
@@ -1193,10 +1207,10 @@ msgstr "- en montrer moins"
msgid "."
msgstr ""
-msgid "0 bytes"
+msgid "/"
msgstr ""
-msgid "0 for unlimited, only effective with remote storage enabled."
+msgid "0 bytes"
msgstr ""
msgid "0t1DgySidms"
@@ -1326,6 +1340,9 @@ msgstr ""
msgid "1000+"
msgstr ""
+msgid "192.168.0.0/24"
+msgstr ""
+
msgid "1st contribution!"
msgstr "1ʳᵉ contribution !"
@@ -1479,9 +1496,6 @@ msgstr ""
msgid "A plain HTML site that uses Netlify for CI/CD instead of GitLab, but still with all the other great GitLab features"
msgstr ""
-msgid "A plain-text response to show to clients that hit the rate limit."
-msgstr ""
-
msgid "A platform value can be web, mob or app."
msgstr ""
@@ -1563,7 +1577,7 @@ msgstr ""
msgid "APIFuzzing|Configure HTTP basic authentication values. Other authentication methods are supported. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
+msgid "APIFuzzing|Customize your project's API fuzzing configuration options and copy the code snippet to your .gitlab-ci.yml file to apply any changes. Note that this tool does not reflect or update your .gitlab-ci.yml file automatically. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
msgstr ""
msgid "APIFuzzing|Enable authentication"
@@ -1626,9 +1640,6 @@ msgstr ""
msgid "APIFuzzing|To prevent a security leak, authentication info must be added as a %{ciVariablesLinkStart}CI variable%{ciVariablesLinkEnd}. As a user with maintainer access rights, you can manage CI variables in the %{ciSettingsLinkStart}Settings%{ciSettingsLinkEnd} area."
msgstr ""
-msgid "APIFuzzing|Use this tool to generate API fuzzing configuration YAML to copy into your .gitlab-ci.yml file. This tool does not reflect or update your .gitlab-ci.yml file automatically."
-msgstr ""
-
msgid "APIFuzzing|Username for basic authentication"
msgstr ""
@@ -1680,9 +1691,6 @@ msgstr "Rapports d’abus"
msgid "Abuse reports notification email"
msgstr ""
-msgid "Abuse reports will be sent to this address if it is set. Abuse reports are always available in the admin area."
-msgstr ""
-
msgid "Accept invitation"
msgstr "Accepter l’invitation"
@@ -1719,12 +1727,18 @@ msgstr ""
msgid "Access granted"
msgstr ""
+msgid "Access key ID"
+msgstr ""
+
msgid "Access requests"
msgstr ""
msgid "Access to '%{classification_label}' not allowed"
msgstr "Accès à « %{classification_label} » non autorisé"
+msgid "Access tokens expire after 2 hours. A refresh token may be used at any time to generate a new access token. Non-expiring access tokens are deprecated. Clear this setting to enable backward compatibility."
+msgstr ""
+
msgid "AccessDropdown|Deploy Keys"
msgstr ""
@@ -2037,6 +2051,9 @@ msgstr "Ajouter une nouvelle application"
msgid "Add new directory"
msgstr "Ajouter un nouveau dossier"
+msgid "Add new service account"
+msgstr ""
+
msgid "Add or remove previously merged commits"
msgstr ""
@@ -2274,6 +2291,9 @@ msgstr ""
msgid "AdminArea|Features"
msgstr ""
+msgid "AdminArea|Get security updates from GitLab and stay up to date"
+msgstr ""
+
msgid "AdminArea|Groups"
msgstr ""
@@ -2313,6 +2333,12 @@ msgstr ""
msgid "AdminArea|Reporter"
msgstr ""
+msgid "AdminArea|Sign up for the GitLab Security Newsletter to get notified for security updates."
+msgstr ""
+
+msgid "AdminArea|Sign up for the GitLab newsletter"
+msgstr ""
+
msgid "AdminArea|Stop all jobs"
msgstr "Arrêter toutes les tâches"
@@ -2382,9 +2408,15 @@ msgstr ""
msgid "AdminSettings|Disable public access to Pages sites"
msgstr ""
+msgid "AdminSettings|Display a banner on merge requests in projects with no pipelines to initiate steps to add a .gitlab-ci.yml file."
+msgstr ""
+
msgid "AdminSettings|Domain verification is an essential security measure for public GitLab sites. Users are required to demonstrate they control a domain before it is enabled. %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "AdminSettings|Enable pipeline suggestion banner"
+msgstr ""
+
msgid "AdminSettings|Enable shared runners for new projects"
msgstr ""
@@ -2856,10 +2888,10 @@ msgstr ""
msgid "Admin|Quarterly reconciliation will occur on %{qrtlyDate}"
msgstr ""
-msgid "Admin|The number of max seats used for your namespace is currently exceeding the number of seats in your subscription. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgid "Admin|The number of max seats in your namespace exceeds the number of seats in your subscription. On %{qrtlyDate}, quarterly reconciliation occurs and you are automatically billed a prorated amount for the overage. No action is needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice. For more information about the timing of the invoicing process, view the documentation."
msgstr ""
-msgid "Admin|The number of maximum users for your instance is currently exceeding the number of users in license. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgid "Admin|The number of max users in your instance exceeds the number of users in your license. On %{qrtlyDate}, quarterly reconciliation occurs and you are automatically billed a prorated amount for the overage. No action is needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice. For more information about the timing of the invoicing process, view the documentation."
msgstr ""
msgid "Admin|View pending user approvals"
@@ -2880,9 +2912,6 @@ msgstr ""
msgid "Advanced export options"
msgstr ""
-msgid "Advanced permissions, Large File Storage and Two-Factor authentication settings."
-msgstr "Autorisations avancées, stockage de fichiers volumineux et paramètres d’authentification à double facteur."
-
msgid "After a successful password update you will be redirected to login screen."
msgstr "Après modification de votre mot de passe, vous serez redirigé vers l’écran de connexion."
@@ -2901,13 +2930,14 @@ msgstr ""
msgid "After you've reviewed these contribution guidelines, you'll be all set to"
msgstr ""
+msgid "Akismet"
+msgstr ""
+
msgid "Akismet API Key"
msgstr ""
-msgid "Alert"
-msgid_plural "Alerts"
-msgstr[0] "Alerte"
-msgstr[1] "Alertes"
+msgid "Akismet helps prevent the creation of spam issues in public projects."
+msgstr ""
msgid "AlertManagement|Acknowledged"
msgstr ""
@@ -3263,6 +3293,9 @@ msgstr ""
msgid "All (default)"
msgstr ""
+msgid "All GitLab"
+msgstr ""
+
msgid "All Members"
msgstr "Tous les membres"
@@ -3377,6 +3410,9 @@ msgstr ""
msgid "Allow this secondary node to replicate content on Object Storage"
msgstr ""
+msgid "Allow use of licensed EE features"
+msgstr ""
+
msgid "Allow users to dismiss the broadcast message"
msgstr ""
@@ -3452,9 +3488,6 @@ msgstr ""
msgid "Amazon authentication is not %{link_start}correctly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
-msgid "Amount of time (in hours) that users are allowed to skip forced configuration of two-factor authentication"
-msgstr "Durée (en heures) durant laquelle les utilisateurs sont autorisés à outrepasser la configuration de l’authentification à double facteur obligatoire"
-
msgid "An %{link_start}alert%{link_end} with the same fingerprint is already open. To change the status of this alert, resolve the linked alert."
msgstr ""
@@ -3515,12 +3548,6 @@ msgstr "Une erreur s’est produite lors de la prévisualisation du blob"
msgid "An error occurred when removing the label."
msgstr ""
-msgid "An error occurred when toggling the notification subscription"
-msgstr "Une erreur s’est produite lors de l’activation ou la désactivation de l’abonnement aux notifications"
-
-msgid "An error occurred when updating the issue weight"
-msgstr "Une erreur est survenue lors de la mise à jour du poids du ticket"
-
msgid "An error occurred when updating the title"
msgstr ""
@@ -3569,6 +3596,9 @@ msgstr ""
msgid "An error occurred while enabling Service Desk."
msgstr ""
+msgid "An error occurred while fetching Markdown preview"
+msgstr ""
+
msgid "An error occurred while fetching ancestors"
msgstr ""
@@ -3599,9 +3629,6 @@ msgstr ""
msgid "An error occurred while fetching label colors."
msgstr ""
-msgid "An error occurred while fetching markdown preview"
-msgstr "Une erreur s’est produite lors de la prévisualisation markdown"
-
msgid "An error occurred while fetching participants"
msgstr ""
@@ -3617,9 +3644,6 @@ msgstr ""
msgid "An error occurred while fetching reference"
msgstr ""
-msgid "An error occurred while fetching sidebar data"
-msgstr "Une erreur s’est produite lors de la récupération des données de la barre latérale"
-
msgid "An error occurred while fetching tags. Retry the search."
msgstr ""
@@ -3695,6 +3719,9 @@ msgstr ""
msgid "An error occurred while loading merge requests."
msgstr ""
+msgid "An error occurred while loading projects."
+msgstr ""
+
msgid "An error occurred while loading the Needs tab."
msgstr ""
@@ -3929,12 +3956,6 @@ msgstr ""
msgid "Any Milestone"
msgstr ""
-msgid "Any branch"
-msgstr ""
-
-msgid "Any eligible user"
-msgstr ""
-
msgid "Any encrypted tokens"
msgstr ""
@@ -3953,6 +3974,9 @@ msgstr ""
msgid "Any namespace"
msgstr ""
+msgid "App Engine description and apps that are suitable for this deployment target"
+msgstr ""
+
msgid "App ID"
msgstr ""
@@ -4101,6 +4125,11 @@ msgstr ""
msgid "Apply"
msgstr ""
+msgid "Apply %d suggestion"
+msgid_plural "Apply %d suggestions"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Apply a label"
msgstr ""
@@ -4110,13 +4139,10 @@ msgstr ""
msgid "Apply suggestion"
msgstr ""
-msgid "Apply suggestions"
-msgstr ""
-
msgid "Apply template"
msgstr ""
-msgid "Apply this approval rule to any branch or a specific protected branch."
+msgid "Apply this approval rule to all branches or a specific protected branch."
msgstr ""
msgid "Applying"
@@ -4259,9 +4285,6 @@ msgstr ""
msgid "ApprovalSettings|Prevent editing approval rules in projects and merge requests."
msgstr ""
-msgid "ApprovalSettings|Prevent editing approval rules in projects and merge requests. "
-msgstr ""
-
msgid "ApprovalSettings|Remove all approvals when commits are added to the source branch."
msgstr ""
@@ -4277,6 +4300,9 @@ msgstr ""
msgid "ApprovalSettings|This setting is configured at the instance level and can only be changed by an administrator."
msgstr ""
+msgid "ApprovalSettings|This setting is configured in %{groupName} and can only be changed by an administrator or group owner."
+msgstr ""
+
msgid "ApprovalStatusTooltip|Adheres to separation of duties"
msgstr ""
@@ -4763,9 +4789,6 @@ msgstr ""
msgid "Authenticated API rate limit period in seconds"
msgstr ""
-msgid "Authenticated API request rate limit"
-msgstr ""
-
msgid "Authenticated API requests"
msgstr ""
@@ -4775,10 +4798,10 @@ msgstr ""
msgid "Authenticated Git LFS request rate limit"
msgstr ""
-msgid "Authenticated web rate limit period in seconds"
+msgid "Authenticated Git LFS requests"
msgstr ""
-msgid "Authenticated web request rate limit"
+msgid "Authenticated web rate limit period in seconds"
msgstr ""
msgid "Authenticated web requests"
@@ -5156,9 +5179,6 @@ msgstr ""
msgid "Below you will find all the groups that are public."
msgstr "Vous trouverez ciâ€dessous tous les groupes publics."
-msgid "Beta"
-msgstr ""
-
msgid "Bi-weekly code coverage"
msgstr ""
@@ -5398,6 +5418,21 @@ msgstr "Blog"
msgid "Board scope affects which issues are displayed for anyone who visits this board"
msgstr ""
+msgid "BoardNewEpic|Groups"
+msgstr ""
+
+msgid "BoardNewEpic|Loading groups"
+msgstr ""
+
+msgid "BoardNewEpic|No matching results"
+msgstr ""
+
+msgid "BoardNewEpic|Search groups"
+msgstr ""
+
+msgid "BoardNewEpic|Select a group"
+msgstr ""
+
msgid "BoardNewIssue|No matching results"
msgstr ""
@@ -5475,6 +5510,9 @@ msgstr ""
msgid "Boards|An error occurred while creating the list. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching child groups. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching group projects. Please try again."
msgstr ""
@@ -5807,6 +5845,9 @@ msgstr ""
msgid "Bulk update"
msgstr ""
+msgid "BulkImports|Re-import creates a new group. It does not sync with the existing group."
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -5816,6 +5857,9 @@ msgstr ""
msgid "BulkImport|From source group"
msgstr ""
+msgid "BulkImport|Group import history"
+msgstr ""
+
msgid "BulkImport|Import failed: Destination cannot be a subgroup of the source group. Change the destination and try again."
msgstr ""
@@ -5828,9 +5872,18 @@ msgstr ""
msgid "BulkImport|Importing the group failed"
msgstr ""
+msgid "BulkImport|Last imported to %{link}"
+msgstr ""
+
msgid "BulkImport|Name already exists."
msgstr ""
+msgid "BulkImport|New group"
+msgstr ""
+
+msgid "BulkImport|No history is available"
+msgstr ""
+
msgid "BulkImport|No parent"
msgstr ""
@@ -5843,6 +5896,9 @@ msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} matching filter \"%{filter}\" from %{link}"
msgstr ""
+msgid "BulkImport|Source group"
+msgstr ""
+
msgid "BulkImport|To new group"
msgstr ""
@@ -5852,6 +5908,9 @@ msgstr ""
msgid "BulkImport|You have no groups to import"
msgstr ""
+msgid "BulkImport|Your imported groups will appear here."
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -6094,6 +6153,9 @@ msgstr ""
msgid "Can be manually deployed to"
msgstr ""
+msgid "Can be overridden in each project."
+msgstr ""
+
msgid "Can create groups:"
msgstr ""
@@ -6196,6 +6258,9 @@ msgstr ""
msgid "Cancelling Preview"
msgstr ""
+msgid "Cannot assign a confidential epic to a non-confidential issue. Make the issue confidential and try again"
+msgstr ""
+
msgid "Cannot be assigned to other projects."
msgstr ""
@@ -6247,9 +6312,6 @@ msgstr ""
msgid "Cannot refer to a group %{timebox_type} by an internal id!"
msgstr ""
-msgid "Cannot set confidential epic for a non-confidential issue"
-msgstr ""
-
msgid "Cannot show preview. For previews on sketch files, they must have the file format introduced by Sketch version 43 and above."
msgstr ""
@@ -6487,15 +6549,15 @@ msgstr ""
msgid "Check out, review, and merge locally"
msgstr ""
-msgid "Check the %{docs_link_start}documentation%{docs_link_end}."
-msgstr "Veuillez vérifier la %{docs_link_start}documentation%{docs_link_end}."
-
msgid "Check the current instance configuration "
msgstr ""
msgid "Check the elasticsearch.log file to debug why the migration was halted and make any changes before retrying the migration. When you fix the cause of the failure, click \"Retry migration\", and the migration will be scheduled to be retried in the background."
msgstr ""
+msgid "Check with your administrator."
+msgstr ""
+
msgid "Check your Docker images for known vulnerabilities."
msgstr ""
@@ -6526,6 +6588,9 @@ msgstr ""
msgid "Checkout"
msgstr ""
+msgid "Checkout|$%{selectedPlanPrice} per 10 GB storage per pack"
+msgstr ""
+
msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 minutes"
msgstr ""
@@ -6546,17 +6611,23 @@ msgstr ""
msgid "Checkout|%{name}'s GitLab subscription"
msgstr ""
-msgid "Checkout|%{selectedPlanText} plan"
+msgid "Checkout|%{name}'s storage subscription"
msgstr ""
-msgid "Checkout|%{startDate} - %{endDate}"
+msgid "Checkout|%{quantity} GB of storage"
msgstr ""
-msgid "Checkout|%{totalCiMinutes} CI minute"
-msgid_plural "Checkout|%{totalCiMinutes} CI minutes"
+msgid "Checkout|%{quantity} storage pack"
+msgid_plural "Checkout|%{quantity} storage packs"
msgstr[0] ""
msgstr[1] ""
+msgid "Checkout|%{selectedPlanText} plan"
+msgstr ""
+
+msgid "Checkout|%{startDate} - %{endDate}"
+msgstr ""
+
msgid "Checkout|%{totalCiMinutes} CI minutes"
msgstr ""
@@ -6632,6 +6703,9 @@ msgstr ""
msgid "Checkout|Failed to register credit card. Please try again."
msgstr ""
+msgid "Checkout|GB"
+msgstr ""
+
msgid "Checkout|GitLab group"
msgstr ""
@@ -6668,6 +6742,9 @@ msgstr ""
msgid "Checkout|State"
msgstr ""
+msgid "Checkout|Storage packs"
+msgstr ""
+
msgid "Checkout|Street address"
msgstr ""
@@ -6689,6 +6766,9 @@ msgstr ""
msgid "Checkout|Total minutes: %{quantity}"
msgstr ""
+msgid "Checkout|Total storage: %{quantity} GB"
+msgstr ""
+
msgid "Checkout|Users"
msgstr ""
@@ -6698,16 +6778,25 @@ msgstr ""
msgid "Checkout|Your organization"
msgstr ""
+msgid "Checkout|Your storage subscription has the same term as your main subscription, and the price is prorated accordingly."
+msgstr ""
+
msgid "Checkout|Your subscription will be applied to this group"
msgstr ""
msgid "Checkout|Zip code"
msgstr ""
+msgid "Checkout|a storage subscription"
+msgstr ""
+
msgid "Checkout|company or team"
msgstr ""
-msgid "Checkout|x 1,000 minutes per pack = %{strong}"
+msgid "Checkout|minutes"
+msgstr ""
+
+msgid "Checkout|x %{quantity} %{units} per pack ="
msgstr ""
msgid "Cherry-pick this commit"
@@ -7064,6 +7153,9 @@ msgstr ""
msgid "CloneIssue|Cannot clone issue to target project as it is pending deletion."
msgstr ""
+msgid "CloneIssue|Cannot clone issues of '%{issue_type}' type."
+msgstr ""
+
msgid "Cloned this issue to %{path_to_project}."
msgstr ""
@@ -7118,7 +7210,10 @@ msgstr ""
msgid "Closes this %{quick_action_target}."
msgstr ""
-msgid "Cloud licenses can not be removed."
+msgid "Cloud Functions description and apps that are suitable for this deployment target"
+msgstr ""
+
+msgid "Cloud Run description and apps that are suitable for this deployment target"
msgstr ""
msgid "Cluster"
@@ -7145,6 +7240,12 @@ msgstr ""
msgid "ClusterAgents|Access tokens"
msgstr ""
+msgid "ClusterAgents|Agent might not be connected to GitLab"
+msgstr ""
+
+msgid "ClusterAgents|Agent never connected to GitLab"
+msgstr ""
+
msgid "ClusterAgents|Alternative installation methods"
msgstr ""
@@ -7160,6 +7261,12 @@ msgstr ""
msgid "ClusterAgents|Configuration"
msgstr ""
+msgid "ClusterAgents|Connected"
+msgstr ""
+
+msgid "ClusterAgents|Connection status"
+msgstr ""
+
msgid "ClusterAgents|Copy token"
msgstr ""
@@ -7178,6 +7285,9 @@ msgstr ""
msgid "ClusterAgents|For alternative installation methods %{linkStart}go to the documentation%{linkEnd}."
msgstr ""
+msgid "ClusterAgents|For more troubleshooting information go to"
+msgstr ""
+
msgid "ClusterAgents|Go to the repository"
msgstr ""
@@ -7193,18 +7303,30 @@ msgstr ""
msgid "ClusterAgents|Integrate with the GitLab Agent"
msgstr ""
-msgid "ClusterAgents|Last used"
+msgid "ClusterAgents|Last connected %{timeAgo}."
+msgstr ""
+
+msgid "ClusterAgents|Last contact"
msgstr ""
msgid "ClusterAgents|Learn how to create an agent access token"
msgstr ""
+msgid "ClusterAgents|Make sure you are using a valid token."
+msgstr ""
+
msgid "ClusterAgents|Name"
msgstr ""
msgid "ClusterAgents|Never"
msgstr ""
+msgid "ClusterAgents|Never connected"
+msgstr ""
+
+msgid "ClusterAgents|Not connected"
+msgstr ""
+
msgid "ClusterAgents|Read more about getting started"
msgstr ""
@@ -7226,6 +7348,9 @@ msgstr ""
msgid "ClusterAgents|Select which Agent you want to install"
msgstr ""
+msgid "ClusterAgents|The Agent has not been connected in a long time. There might be a connectivity issue. Last contact was %{timeAgo}."
+msgstr ""
+
msgid "ClusterAgents|The GitLab Agent also requires %{linkStart}enabling the Agent Server%{linkEnd}"
msgstr ""
@@ -7253,9 +7378,6 @@ msgstr ""
msgid "ClusterAgents|You will need to create a token to connect to your agent"
msgstr ""
-msgid "ClusterAgent|This feature is only available for premium plans"
-msgstr ""
-
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -7445,9 +7567,6 @@ msgstr ""
msgid "ClusterIntegration|Create Kubernetes cluster"
msgstr "Créer une grappe de serveurs Kubernetes"
-msgid "ClusterIntegration|Create a provision role on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the account and external ID above. %{startMoreInfoLink}More information%{endLink}"
-msgstr ""
-
msgid "ClusterIntegration|Create cluster on"
msgstr ""
@@ -7880,7 +7999,7 @@ msgstr ""
msgid "ClusterIntegration|Subnets"
msgstr ""
-msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provisioned role, first create one on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the above account and external IDs. %{startMoreInfoLink}More information%{endLink}"
+msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provisioned role, first create one on %{awsLinkStart}Amazon Web Services %{awsLinkEnd} using the above account and external IDs. %{moreInfoStart}More information%{moreInfoEnd}"
msgstr ""
msgid "ClusterIntegration|The Kubernetes certificate used to authenticate to the cluster."
@@ -8114,6 +8233,9 @@ msgstr ""
msgid "Collapse replies"
msgstr ""
+msgid "Collapse settings section"
+msgstr ""
+
msgid "Collapse sidebar"
msgstr "Masquer la barre latérale"
@@ -8132,6 +8254,9 @@ msgstr ""
msgid "Comma-separated list of email addresses."
msgstr ""
+msgid "Comma-separated list of users allowed to exceed the rate limit."
+msgstr ""
+
msgid "Comma-separated, e.g. '1.1.1.1, 2.2.2.0/24'"
msgstr ""
@@ -8452,6 +8577,9 @@ msgstr ""
msgid "Configure %{repository_checks_link_start}repository checks%{link_end} and %{housekeeping_link_start}housekeeping%{link_end} on repositories."
msgstr ""
+msgid "Configure CAPTCHAs, IP address limits, and other anti-spam measures."
+msgstr ""
+
msgid "Configure Dependency Scanning in `.gitlab-ci.yml` using the GitLab managed template. You can [add variable overrides](https://docs.gitlab.com/ee/user/application_security/dependency_scanning/#customizing-the-dependency-scanning-settings) to customize Dependency Scanning settings."
msgstr ""
@@ -8488,18 +8616,15 @@ msgstr "Configurer le traçage"
msgid "Configure a %{codeStart}.gitlab-webide.yml%{codeEnd} file in the %{codeStart}.gitlab%{codeEnd} directory to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
msgstr ""
-msgid "Configure existing installation"
+msgid "Configure advanced permissions, Large File Storage, and two-factor authentication settings."
msgstr ""
-msgid "Configure limit for notes created per minute by web and API requests."
+msgid "Configure approvals by authors and committers on all projects."
msgstr ""
-msgid "Configure limits for Project/Group Import/Export."
+msgid "Configure existing installation"
msgstr ""
-msgid "Configure limits for web and API requests."
-msgstr "Configurer les limites pour les requêtes Web et d’API."
-
msgid "Configure paths to be protected by Rack Attack."
msgstr ""
@@ -8512,10 +8637,13 @@ msgstr ""
msgid "Configure settings for Advanced Search with Elasticsearch."
msgstr ""
+msgid "Configure specific limits for Files API requests that supersede the general user and IP rate limits."
+msgstr ""
+
msgid "Configure specific limits for Git LFS requests that supersede the general user and IP rate limits."
msgstr ""
-msgid "Configure specific limits for Packages API requests that supersede the general user and IP rate limits."
+msgid "Configure specific limits for deprecated API requests that supersede the general user and IP rate limits."
msgstr ""
msgid "Configure the %{link} integration."
@@ -8527,6 +8655,9 @@ msgstr ""
msgid "Configure the way a user creates a new account."
msgstr "Configurez la manière dont une personne crée un nouveau compte."
+msgid "Configure via Merge Request"
+msgstr ""
+
msgid "Configure which lists are shown for anyone who visits this board"
msgstr ""
@@ -8995,6 +9126,9 @@ msgstr ""
msgid "Content parsed with %{link}."
msgstr ""
+msgid "ContentEditor|Table of Contents"
+msgstr ""
+
msgid "ContentEditor|You have to provide a renderMarkdown function or a custom serializer"
msgstr ""
@@ -9181,6 +9315,9 @@ msgstr "Copier le lien"
msgid "Copy link to chart"
msgstr ""
+msgid "Copy prefix"
+msgstr ""
+
msgid "Copy reference"
msgstr ""
@@ -9211,6 +9348,9 @@ msgstr ""
msgid "Copy value"
msgstr ""
+msgid "Corpus Management"
+msgstr ""
+
msgid "Corpus Management|Are you sure you want to delete the corpus?"
msgstr ""
@@ -9439,6 +9579,9 @@ msgstr "Créer une branche"
msgid "Create commit"
msgstr "Créer un commit"
+msgid "Create common files more quickly, and standardize their format."
+msgstr ""
+
msgid "Create confidential merge request"
msgstr ""
@@ -9472,6 +9615,9 @@ msgstr ""
msgid "Create issue"
msgstr ""
+msgid "Create issue to resolve all threads"
+msgstr ""
+
msgid "Create iteration"
msgstr ""
@@ -9526,6 +9672,9 @@ msgstr ""
msgid "Create new..."
msgstr "Créer un nouveau…"
+msgid "Create or import your first project"
+msgstr ""
+
msgid "Create project"
msgstr ""
@@ -9883,7 +10032,7 @@ msgstr ""
msgid "Custom notification events"
msgstr "Événements de notification personnalisés"
-msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notificationLinkStart} notification emails%{notificationLinkEnd}."
+msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notificationLinkStart}notification emails%{notificationLinkEnd}."
msgstr ""
msgid "Custom project templates"
@@ -10082,10 +10231,10 @@ msgid_plural "CycleAnalytics|Showing %{subjectFilterText} and %{selectedLabelsCo
msgstr[0] ""
msgstr[1] ""
-msgid "CycleAnalytics|Showing data for group '%{groupName}' and %{selectedProjectCount} projects from %{startDate} to %{endDate}"
+msgid "CycleAnalytics|Showing data for group '%{groupName}' and %{selectedProjectCount} projects from %{createdAfter} to %{createdBefore}"
msgstr ""
-msgid "CycleAnalytics|Showing data for group '%{groupName}' from %{startDate} to %{endDate}"
+msgid "CycleAnalytics|Showing data for group '%{groupName}' from %{createdAfter} to %{createdBefore}"
msgstr ""
msgid "CycleAnalytics|Stages"
@@ -10319,6 +10468,9 @@ msgstr ""
msgid "DastProfiles|Manage profiles"
msgstr ""
+msgid "DastProfiles|Manage site profiles"
+msgstr ""
+
msgid "DastProfiles|Minimum = 0 (no timeout enabled), Maximum = 2880 minutes"
msgstr ""
@@ -10394,6 +10546,9 @@ msgstr ""
msgid "DastProfiles|Scanner name"
msgstr ""
+msgid "DastProfiles|Schedule"
+msgstr ""
+
msgid "DastProfiles|Select branch"
msgstr ""
@@ -10463,7 +10618,7 @@ msgstr ""
msgid "DastProfiles|Website"
msgstr ""
-msgid "DastProfiles|You can either choose a passive scan or validate the target site in your chosen site profile. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
+msgid "DastProfiles|You can either choose a passive scan or validate the target site from the site profile management page. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
msgstr ""
msgid "DastProfiles|You cannot run an active scan against an unvalidated site."
@@ -10636,7 +10791,7 @@ msgstr ""
msgid "Days to merge"
msgstr ""
-msgid "Deactivate dormant users after 90 days of inactivity. Users can return to active status by signing in to their account. While inactive, a user is not counted as an active user in the instance."
+msgid "Deactivate dormant users after 90 days of inactivity"
msgstr ""
msgid "Dear Administrator,"
@@ -10723,10 +10878,10 @@ msgstr ""
msgid "Define a custom pattern with cron syntax"
msgstr "Définir un schéma personnalisé avec une syntaxe Cron"
-msgid "Define approval settings."
+msgid "Define approval rules."
msgstr ""
-msgid "Define approval settings. %{linkStart}Learn more.%{linkEnd}"
+msgid "Define approval rules. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "Define custom rules for what constitutes spam, independent of Akismet"
@@ -10735,7 +10890,7 @@ msgstr ""
msgid "Define environments in the deploy stage(s) in %{code_open}.gitlab-ci.yml%{code_close} to track deployments here."
msgstr ""
-msgid "Define how approval rules are applied as a merge request moves toward completion."
+msgid "Define how approval rules are applied to merge requests."
msgstr ""
msgid "Definition"
@@ -10750,6 +10905,12 @@ msgstr ""
msgid "DelayedJobs|Are you sure you want to run %{job_name} immediately? This job will run automatically after it's timer finishes."
msgstr "Êtesâ€vous sûr(e) de vouloir exécuter %{job_name} immédiatement ? Dans le cas contraire, cette tâche sera automatiquement exécutée à l’heure programmée."
+msgid "DelayedJobs|Are you sure you want to run %{job_name} immediately? This job will run automatically after its timer finishes."
+msgstr ""
+
+msgid "DelayedJobs|Run the delayed job now?"
+msgstr ""
+
msgid "DelayedJobs|Start now"
msgstr "Commencer maintenant"
@@ -11026,6 +11187,12 @@ msgstr ""
msgid "Dependency proxy image prefix"
msgstr ""
+msgid "DependencyProxy|Create a local proxy for storing frequently used upstream images. %{docLinkStart}Learn more%{docLinkEnd} about dependency proxies."
+msgstr ""
+
+msgid "DependencyProxy|Dependency Proxy"
+msgstr ""
+
msgid "DependencyProxy|Toggle Dependency Proxy"
msgstr ""
@@ -11266,6 +11433,9 @@ msgstr ""
msgid "Deployments"
msgstr ""
+msgid "Deployments to Google Kubernetes Engine can be "
+msgstr ""
+
msgid "Deployments|%{deployments} environment impacted."
msgid_plural "Deployments|%{deployments} environments impacted."
msgstr[0] ""
@@ -11295,6 +11465,9 @@ msgstr ""
msgid "Deployment|success"
msgstr ""
+msgid "Deprecated API rate limits"
+msgstr ""
+
msgid "Deprioritize label"
msgstr "Déprioriser l’étiquette"
@@ -11697,6 +11870,16 @@ msgstr ""
msgid "DiffsCompareBaseBranch|(base)"
msgstr ""
+msgid "Diffs|%d addition"
+msgid_plural "Diffs|%d additions"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Diffs|%d deletion"
+msgid_plural "Diffs|%d deletions"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Diffs|No file name available"
msgstr "Aucun nom de fichier disponible"
@@ -11706,9 +11889,17 @@ msgstr ""
msgid "Diffs|Show all unchanged lines"
msgstr ""
+msgid "Diffs|Showing %{dropdownStart}%{count} changed file%{dropdownEnd}"
+msgid_plural "Diffs|Showing %{dropdownStart}%{count} changed files%{dropdownEnd}"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Diffs|Something went wrong while fetching diff lines."
msgstr "Quelque chose s’est mal passé lors de la rapatriement des lignes du diff."
+msgid "Diffs|with %{additions} and %{deletions}"
+msgstr ""
+
msgid "Direct member"
msgstr ""
@@ -11834,9 +12025,6 @@ msgid_plural "Dismiss %d selected vulnerabilities as"
msgstr[0] ""
msgstr[1] ""
-msgid "Dismiss Value Stream Analytics introduction box"
-msgstr ""
-
msgid "Dismiss merge request promotion"
msgstr ""
@@ -12158,6 +12346,9 @@ msgstr ""
msgid "Edit issues"
msgstr ""
+msgid "Edit merge requests"
+msgstr ""
+
msgid "Edit public deploy key"
msgstr ""
@@ -12233,6 +12424,9 @@ msgstr ""
msgid "Elastic|None. Select projects to index."
msgstr ""
+msgid "Eligible users"
+msgstr ""
+
msgid "Email"
msgstr "Courriel"
@@ -12362,6 +12556,9 @@ msgstr ""
msgid "Enable"
msgstr "Activer"
+msgid "Enable Amazon EKS integration"
+msgstr ""
+
msgid "Enable Auto DevOps"
msgstr "Activer Auto DevOps"
@@ -12395,6 +12592,9 @@ msgstr ""
msgid "Enable SSL verification"
msgstr ""
+msgid "Enable Service Ping"
+msgstr ""
+
msgid "Enable Snowplow tracking"
msgstr ""
@@ -12425,6 +12625,9 @@ msgstr ""
msgid "Enable authenticated Git LFS request rate limit"
msgstr ""
+msgid "Enable authenticated web request rate limit"
+msgstr ""
+
msgid "Enable authentication"
msgstr ""
@@ -12485,7 +12688,7 @@ msgstr ""
msgid "Enable or disable the Pseudonymizer data collection."
msgstr "Activer ou désactiver la collecte de données Pseudonymizer."
-msgid "Enable or disable version check and service ping."
+msgid "Enable or disable version check and Service Ping."
msgstr ""
msgid "Enable protected paths rate limit"
@@ -12497,18 +12700,12 @@ msgstr ""
msgid "Enable reCAPTCHA"
msgstr ""
-msgid "Enable reCAPTCHA for login"
-msgstr ""
-
-msgid "Enable reCAPTCHA, Invisible Captcha, Akismet and set IP limits. For reCAPTCHA, we currently only support %{recaptcha_v2_link_start}v2%{recaptcha_v2_link_end}"
+msgid "Enable reCAPTCHA for login."
msgstr ""
msgid "Enable repository checks"
msgstr ""
-msgid "Enable service ping"
-msgstr ""
-
msgid "Enable shared runners for all projects and subgroups in this group."
msgstr ""
@@ -12530,7 +12727,10 @@ msgstr ""
msgid "Enable unauthenticated API request rate limit"
msgstr ""
-msgid "Enable unauthenticated request rate limit"
+msgid "Enable unauthenticated web request rate limit"
+msgstr ""
+
+msgid "Enable user deactivation emails"
msgstr ""
msgid "Enable version check"
@@ -12566,9 +12766,6 @@ msgstr ""
msgid "Enabled sources for code import during project creation. OmniAuth must be configured for GitHub"
msgstr ""
-msgid "Enabling this will only make licensed EE features available to projects if the project namespace's plan includes the feature or if the project is public."
-msgstr ""
-
msgid "Encountered an error while rendering: %{err}"
msgstr ""
@@ -12617,9 +12814,6 @@ msgstr ""
msgid "Enter Admin Mode"
msgstr ""
-msgid "Enter IP address range"
-msgstr ""
-
msgid "Enter a number"
msgstr ""
@@ -12632,9 +12826,6 @@ msgstr ""
msgid "Enter at least three characters to search"
msgstr ""
-msgid "Enter domain"
-msgstr ""
-
msgid "Enter in your Bitbucket Server URL and personal access token below"
msgstr "Entrez l’URL de votre serveur Bitbucket et votre jeton d’accès personnel ciâ€dessous"
@@ -12821,9 +13012,6 @@ msgstr "Déploiement"
msgid "Environments|Deployment %{status}"
msgstr ""
-msgid "Environments|Dismiss"
-msgstr ""
-
msgid "Environments|Enable review app"
msgstr ""
@@ -12836,9 +13024,6 @@ 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."
-msgid "Environments|Help us improve environments"
-msgstr ""
-
msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
msgstr ""
@@ -12875,6 +13060,9 @@ msgstr ""
msgid "Environments|Note that this action will stop the environment, but it will %{emphasisStart}not%{emphasisEnd} have an effect on any existing deployment due to no “stop environment action†being defined in the %{ciConfigLinkStart}.gitlab-ci.yml%{ciConfigLinkEnd} file."
msgstr "Notez que cette action arrêtera l’environnement, mais n’aura %{emphasisStart}aucun%{emphasisEnd} effet sur les déploiements existants en raison de l’absence de directive « arrêter l’action de l’environnement » dans le fichier de configuration %{ciConfigLinkEnd}.gitlab-ci.yml%{ciConfigLinkStart}."
+msgid "Environments|Open"
+msgstr ""
+
msgid "Environments|Open live environment"
msgstr "Ouvrir l’environnement en cours"
@@ -12914,9 +13102,6 @@ msgstr "Arrêter l’environnement"
msgid "Environments|Stopping %{environmentName}"
msgstr ""
-msgid "Environments|Take the survey"
-msgstr ""
-
msgid "Environments|There was an error fetching the logs. Please try again."
msgstr ""
@@ -12938,9 +13123,6 @@ msgstr "Mis à jour"
msgid "Environments|You don't have any environments right now"
msgstr "Vous n’avez pour le moment aucun environnement"
-msgid "Environments|Your feedback helps GitLab make environments better for you and other users. Participate and enter a sweepstake to win a USD 30 gift card."
-msgstr ""
-
msgid "Environments|by %{avatar}"
msgstr ""
@@ -13223,7 +13405,7 @@ msgstr ""
msgid "Error parsing CSV file. Please make sure it has"
msgstr ""
-msgid "Error rendering markdown preview"
+msgid "Error rendering Markdown preview"
msgstr ""
msgid "Error saving label update."
@@ -13271,6 +13453,9 @@ msgstr ""
msgid "Error: %{error_message}"
msgstr ""
+msgid "Error: Couldn't load some or all of the changes."
+msgstr ""
+
msgid "Error: No AWS credentials were supplied"
msgstr ""
@@ -13304,6 +13489,9 @@ msgstr ""
msgid "ErrorTracking|Enable error tracking"
msgstr ""
+msgid "ErrorTracking|Error tracking backend"
+msgstr ""
+
msgid "ErrorTracking|If you self-host Sentry, enter your Sentry instance's full URL. If you use Sentry's hosted solution, enter https://sentry.io"
msgstr ""
@@ -13337,6 +13525,12 @@ msgstr ""
msgid "Escalation policies must have at least one rule"
msgstr ""
+msgid "EscalationPolicies|%{clockIcon} IF alert is not %{alertStatus} in %{minutes}"
+msgstr ""
+
+msgid "EscalationPolicies|%{notificationIcon} THEN %{doAction} %{forScheduleOrUser}"
+msgstr ""
+
msgid "EscalationPolicies|+ Add an additional rule"
msgstr ""
@@ -13379,13 +13573,13 @@ msgstr ""
msgid "EscalationPolicies|Escalation policies"
msgstr ""
-msgid "EscalationPolicies|Escalation rules"
+msgid "EscalationPolicies|Escalation policy %{obstacle} in Project %{project}"
msgstr ""
-msgid "EscalationPolicies|Failed to load oncall-schedules"
+msgid "EscalationPolicies|Escalation rules"
msgstr ""
-msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} %{then} THEN %{doAction} %{scheduleOrUser}"
+msgid "EscalationPolicies|Failed to load oncall-schedules"
msgstr ""
msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} minutes"
@@ -13463,18 +13657,36 @@ msgstr ""
msgid "Every %{action} attempt has failed: %{job_error_message}. Please try again."
msgstr ""
+msgid "Every 3 months"
+msgstr ""
+
+msgid "Every 3 months on the %{day} at %{time} %{timezone}"
+msgstr ""
+
+msgid "Every 6 months"
+msgstr ""
+
+msgid "Every 6 months on the %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Every day"
msgstr ""
msgid "Every day (at %{time})"
msgstr ""
+msgid "Every day at %{time} %{timezone}"
+msgstr ""
+
msgid "Every month"
msgstr ""
msgid "Every month (Day %{day} at %{time})"
msgstr ""
+msgid "Every month on the %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Every three months"
msgstr ""
@@ -13489,6 +13701,15 @@ msgstr[1] ""
msgid "Every week (%{weekday} at %{time})"
msgstr ""
+msgid "Every week on %{day} at %{time} %{timezone}"
+msgstr ""
+
+msgid "Every year"
+msgstr ""
+
+msgid "Every year on %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Everyone"
msgstr ""
@@ -13525,9 +13746,6 @@ msgstr ""
msgid "Exactly one of %{attributes} is required"
msgstr ""
-msgid "Example: %{ip_address}. %{read_more_link}."
-msgstr ""
-
msgid "Example: @sub\\.company\\.com$"
msgstr ""
@@ -13594,15 +13812,15 @@ msgstr ""
msgid "Expand pipeline"
msgstr ""
+msgid "Expand settings section"
+msgstr ""
+
msgid "Expand sidebar"
msgstr "Étendre la barre latérale"
msgid "Expected documents: %{expected_documents}"
msgstr ""
-msgid "Experienced"
-msgstr ""
-
msgid "ExperimentSubject|Must have exactly one of User, Namespace, or Project."
msgstr ""
@@ -13885,9 +14103,6 @@ msgstr ""
msgid "Failed to load related branches"
msgstr ""
-msgid "Failed to load sidebar lock status"
-msgstr ""
-
msgid "Failed to load stacktrace."
msgstr ""
@@ -14312,6 +14527,9 @@ msgstr ""
msgid "Files"
msgstr "Fichiers"
+msgid "Files API Rate Limits"
+msgstr ""
+
msgid "Files breadcrumb"
msgstr ""
@@ -15311,6 +15529,9 @@ msgstr ""
msgid "GitLab group: %{source_link}"
msgstr ""
+msgid "GitLab informs you if a new version is available."
+msgstr ""
+
msgid "GitLab is a complete DevOps platform, delivered as a single application, fundamentally changing the way Development, Security, and Ops teams collaborate"
msgstr ""
@@ -15326,7 +15547,7 @@ msgstr ""
msgid "GitLab is open source software to collaborate on code."
msgstr ""
-msgid "GitLab is undergoing maintenance and is operating in a read-only mode."
+msgid "GitLab is undergoing maintenance and is operating in read-only mode."
msgstr ""
msgid "GitLab member or Email address"
@@ -15338,9 +15559,6 @@ msgstr ""
msgid "GitLab project export"
msgstr "Exportation de projet GitLab"
-msgid "GitLab restart is required to apply changes."
-msgstr ""
-
msgid "GitLab single sign-on URL"
msgstr ""
@@ -15356,9 +15574,6 @@ msgstr ""
msgid "GitLab version"
msgstr ""
-msgid "GitLab will inform you if a new version is available."
-msgstr ""
-
msgid "GitLab will run a background job that will produce pseudonymized CSVs of the GitLab database that will be uploaded to your configured object storage directory."
msgstr "GitLab va exécuter une tâche en arrièreâ€plan qui permettra de produire des fichiers CSV contenant des pseudonymes de la base de données GitLab qui seront téléversés dans le répertoire de stockage d’objets que vous avez configuré."
@@ -15623,9 +15838,21 @@ msgstr ""
msgid "Go to snippets"
msgstr ""
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check 'Allowed domains for sign-ups'."
+msgstr ""
+
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check 'Email restrictions for sign-ups'."
+msgstr ""
+
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check the 'Domain denylist'."
+msgstr ""
+
msgid "Go to the activity feed"
msgstr ""
+msgid "Go to the group’s 'Settings &gt; General' page, and check 'Restrict membership by email domain'."
+msgstr ""
+
msgid "Go to the milestone list"
msgstr ""
@@ -15662,6 +15889,12 @@ msgstr ""
msgid "Goal of the changes and what reviewers should be aware of"
msgstr ""
+msgid "Google Cloud"
+msgstr ""
+
+msgid "Google Cloud offers several deployment targets. Select the one most suitable for your project."
+msgstr ""
+
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
@@ -15746,9 +15979,6 @@ msgstr ""
msgid "Group ID"
msgstr "Identifiant du groupe"
-msgid "Group ID: %{group_id}"
-msgstr ""
-
msgid "Group Owner must have signed in with SAML before enabling Group Managed Accounts"
msgstr ""
@@ -15923,6 +16153,12 @@ msgstr ""
msgid "GroupImport|Unable to process group import file"
msgstr ""
+msgid "GroupPage|Copy group ID"
+msgstr ""
+
+msgid "GroupPage|Group ID: %{group_id}"
+msgstr ""
+
msgid "GroupRoadmap|%{dateWord} – No end date"
msgstr ""
@@ -15977,6 +16213,9 @@ msgstr ""
msgid "GroupRoadmap|Within 3 years"
msgstr ""
+msgid "GroupSAML|\"persistent\" recommended"
+msgstr ""
+
msgid "GroupSAML|%{strongOpen}Warning%{strongClose} - Enabling %{linkStart}SSO enforcement%{linkEnd} can reduce security risks."
msgstr ""
@@ -16109,6 +16348,9 @@ msgstr ""
msgid "GroupSAML|To be able to prohibit outer forks, you first need to enforce dedicate group managed accounts."
msgstr ""
+msgid "GroupSAML|Use SAML group links to manage group membership using SAML."
+msgstr ""
+
msgid "GroupSAML|Valid SAML Response"
msgstr ""
@@ -16121,13 +16363,10 @@ msgstr ""
msgid "GroupSAML|as %{access_level}"
msgstr ""
-msgid "GroupSAML|must match stored NameID of \"%{extern_uid}\" as we use this to identify users. If the NameID changes users will be unable to sign in."
+msgid "GroupSAML|must match stored NameID of \"%{extern_uid}\" to identify user and allow sign in"
msgstr ""
-msgid "GroupSAML|should be \"persistent\""
-msgstr ""
-
-msgid "GroupSAML|should be a random persistent ID, emails are discouraged"
+msgid "GroupSAML|recommend persistent ID instead of email"
msgstr ""
msgid "GroupSelect|No matching results"
@@ -16142,9 +16381,15 @@ msgstr ""
msgid "GroupSettings|Allow project access token creation"
msgstr ""
+msgid "GroupSettings|Applied to all subgroups unless overridden by a group owner. Groups already added to the project lose access."
+msgstr ""
+
msgid "GroupSettings|Auto DevOps pipeline was updated for the group"
msgstr ""
+msgid "GroupSettings|Available only on the top-level group. Applies to all subgroups. Groups already shared with a group outside %{group} are still shared unless removed manually."
+msgstr ""
+
msgid "GroupSettings|Badges"
msgstr "Badges numériques"
@@ -16196,6 +16441,9 @@ msgstr ""
msgid "GroupSettings|New runners registration token has been generated!"
msgstr ""
+msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgstr ""
+
msgid "GroupSettings|Pipeline settings was updated for the group"
msgstr ""
@@ -16208,12 +16456,15 @@ msgstr ""
msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
-msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups."
+msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups"
msgstr ""
msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
msgstr "Empêcher le partage d’un projet du groupe %{group} avec d’autres groupes"
+msgid "GroupSettings|Prevents group members from being notified if the group is mentioned."
+msgstr ""
+
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
msgstr ""
@@ -16250,21 +16501,6 @@ msgstr "Ce paramètre s’applique au groupe %{ancestor_group}. Pour partager de
msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}."
msgstr "Ce paramètre s’applique au groupe %{ancestor_group}. Vous pouvez écraser le paramètre ou le %{remove_ancestor_share_with_group_lock}."
-msgid "GroupSettings|This setting is only available on the top-level group and it applies to all subgroups. Groups that have already been shared with a group outside %{group} will still be shared, and this access will have to be revoked manually."
-msgstr ""
-
-msgid "GroupSettings|This setting will be applied to all subgroups unless overridden by a group owner. Groups that already have access to the project will continue to have access unless removed manually."
-msgstr "Ce paramètre s’appliquera à tous les sousâ€groupes, sauf s’il est modifié par un propriétaire du groupe. Les groupes déjà liés au projet continueront d’y avoir accès à moins d’être retirés manuellement."
-
-msgid "GroupSettings|This setting will override user notification preferences for all members of the group, subgroups, and projects."
-msgstr ""
-
-msgid "GroupSettings|This setting will prevent group members from being notified if the group is mentioned."
-msgstr ""
-
-msgid "GroupSettings|This setting will prevent group members from forking projects outside of the group."
-msgstr ""
-
msgid "GroupSettings|Transfer group"
msgstr ""
@@ -16382,7 +16618,7 @@ msgstr ""
msgid "GroupsNew|No import options available"
msgstr ""
-msgid "GroupsNew|Not all related objects are migrated, as %{docs_link_start}described here%{docs_link_end}. Please %{feedback_link_start}leave feedback%{feedback_link_end} on this feature."
+msgid "GroupsNew|Not all related objects are migrated. %{docs_link_start}More info%{docs_link_end}."
msgstr ""
msgid "GroupsNew|Personal access token"
@@ -16514,15 +16750,27 @@ msgstr "En mauvaise santé"
msgid "Hello %{name},"
msgstr ""
-msgid "Hello there"
-msgstr ""
-
msgid "Hello, %{name}!"
msgstr ""
msgid "Hello, %{username}!"
msgstr ""
+msgid "HelloMessage|%{handshake_emoji} Contribute to GitLab: %{contribute_link}"
+msgstr ""
+
+msgid "HelloMessage|%{magnifier_emoji} Create a new GitLab issue: %{new_issue_link}"
+msgstr ""
+
+msgid "HelloMessage|%{rocket_emoji} We like your curiosity! Help us improve GitLab by joining the team: %{jobs_page_link}"
+msgstr ""
+
+msgid "HelloMessage|Does this page need fixes or improvements? Open an issue or contribute a merge request to help make GitLab more lovable. At GitLab, everyone can contribute!"
+msgstr ""
+
+msgid "HelloMessage|Welcome to GitLab!"
+msgstr ""
+
msgid "Help"
msgstr "Aide"
@@ -16532,13 +16780,10 @@ msgstr ""
msgid "Helps prevent bots from creating accounts."
msgstr ""
-msgid "Helps prevent bots from creating issues"
-msgstr ""
-
-msgid "Helps prevent malicious users hide their activity"
+msgid "Helps prevent bots from creating issues."
msgstr ""
-msgid "Helps reduce request volume (e.g. from crawlers or abusive bots)"
+msgid "Helps prevent malicious users hide their activity."
msgstr ""
msgid "Helps reduce request volume (for example, from crawlers or abusive bots)"
@@ -16662,6 +16907,12 @@ msgstr "Maintenance démarrée avec succès"
msgid "Housekeeping, export, path, transfer, remove, archive."
msgstr ""
+msgid "How do I configure Akismet?"
+msgstr ""
+
+msgid "How do I configure it?"
+msgstr ""
+
msgid "How do I configure runners?"
msgstr ""
@@ -16683,21 +16934,27 @@ msgstr ""
msgid "How do I set up this service?"
msgstr ""
+msgid "How do I use a web terminal?"
+msgstr ""
+
+msgid "How do I use file templates?"
+msgstr ""
+
msgid "How it works"
msgstr ""
msgid "How many days need to pass between marking entity for deletion and actual removing it."
msgstr ""
-msgid "How many seconds an IP will be counted towards the limit"
+msgid "How many seconds an IP counts toward the IP address limit."
+msgstr ""
+
+msgid "How the job limiter handles jobs exceeding the thresholds specified below. The 'track' mode only logs the jobs. The 'compress' mode compresses the jobs and raises an exception if the compressed size exceeds the limit."
msgstr ""
msgid "I accept the %{terms_link}"
msgstr "J’accepte les %{terms_link}"
-msgid "I accept the|Terms of Service and Privacy Policy"
-msgstr ""
-
msgid "I forgot my password"
msgstr ""
@@ -16779,13 +17036,16 @@ msgstr ""
msgid "IP Address"
msgstr "Adresse IP"
-msgid "IP expiration time"
+msgid "IP address expiration time"
msgstr ""
-msgid "IP subnet restriction only allowed for top-level groups"
+msgid "IP address restrictions"
+msgstr ""
+
+msgid "IP addresses per user"
msgstr ""
-msgid "IPs per user"
+msgid "IP subnet restriction only allowed for top-level groups"
msgstr ""
msgid "Identifier"
@@ -16800,6 +17060,9 @@ msgstr "Identités"
msgid "If any indexed field exceeds this limit it will be truncated to this number of characters and the rest will not be indexed or searchable. This does not apply to repository and wiki indexing. Setting this to 0 means it is unlimited."
msgstr ""
+msgid "If blank, defaults to %{code_open}Retry later%{code_close}."
+msgstr ""
+
msgid "If blank, set allowable lifetime to %{instance_level_policy_in_words}, as defined by the instance admin. Once set, existing tokens for users in this group may be revoked."
msgstr ""
@@ -16851,6 +17114,9 @@ msgstr "Si vous utilisez GitHub, vous verrez les statuts des pipelines sur GitHu
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 did not initiate these sign-in attempts, please reach out to your administrator or enable two-factor authentication (2FA) on your account."
+msgstr ""
+
msgid "If you did not initiate this change, please contact your administrator immediately."
msgstr ""
@@ -16942,12 +17208,12 @@ msgstr ""
msgid "Import Projects from Gitea"
msgstr "Importe des projets depuis Gitea"
-msgid "Import a project"
-msgstr ""
-
msgid "Import an exported GitLab project"
msgstr "Importer un projet GitLab exporté"
+msgid "Import and export rate limits"
+msgstr ""
+
msgid "Import failed due to a GitHub error: %{original}"
msgstr ""
@@ -16957,12 +17223,18 @@ msgstr ""
msgid "Import from Jira"
msgstr ""
+msgid "Import group"
+msgstr ""
+
msgid "Import group from file"
msgstr ""
msgid "Import groups"
msgstr ""
+msgid "Import history"
+msgstr ""
+
msgid "Import in progress"
msgstr "Importation en cours"
@@ -17026,7 +17298,25 @@ msgstr ""
msgid "Import timed out. Import took longer than %{import_jobs_expiration} seconds"
msgstr ""
-msgid "Import/Export Rate Limits"
+msgid "ImportAProjectModal|Import from a project"
+msgstr ""
+
+msgid "ImportAProjectModal|Import members from another project"
+msgstr ""
+
+msgid "ImportAProjectModal|Import project members"
+msgstr ""
+
+msgid "ImportAProjectModal|Only project members (not group members) are imported, and they get the same permissions as the project you import from."
+msgstr ""
+
+msgid "ImportAProjectModal|Successfully imported"
+msgstr ""
+
+msgid "ImportAProjectModal|Unable to import project members"
+msgstr ""
+
+msgid "ImportAProjectModal|You're importing members to the %{strongStart}%{name}%{strongEnd} project."
msgstr ""
msgid "ImportButtons|Connect repositories from"
@@ -17079,7 +17369,7 @@ msgstr[1] ""
msgid "Importing..."
msgstr ""
-msgid "Import|A repository URL usually ends in a .git suffix, although this is not required. Double check to make sure your repository URL is correct."
+msgid "Import|There is not a valid Git repository at this URL. If your HTTP repository is not publicly accessible, verify your credentials."
msgstr ""
msgid "Improve customer support with Service Desk"
@@ -17088,9 +17378,6 @@ msgstr ""
msgid "Improves Git cloning performance."
msgstr ""
-msgid "In %{time_to_now}"
-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 ""
@@ -17376,7 +17663,7 @@ msgstr ""
msgid "InProductMarketing|Start a GitLab Ultimate trial today in less than one minute, no credit card required."
msgstr ""
-msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no CC required"
+msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no credit card required"
msgstr ""
msgid "InProductMarketing|Start a trial"
@@ -17415,7 +17702,7 @@ msgstr ""
msgid "InProductMarketing|Team up in GitLab for greater efficiency"
msgstr ""
-msgid "InProductMarketing|Team work makes the dream work"
+msgid "InProductMarketing|Team work makes the dream work"
msgstr ""
msgid "InProductMarketing|Test, create, deploy"
@@ -17996,6 +18283,9 @@ msgstr ""
msgid "Integrations|Create new issue in Jira"
msgstr ""
+msgid "Integrations|Create new issue in ZenTao"
+msgstr ""
+
msgid "Integrations|Default settings are inherited from the group level."
msgstr ""
@@ -18089,9 +18379,15 @@ msgstr ""
msgid "Integrations|Search Jira issues"
msgstr ""
+msgid "Integrations|Search ZenTao issues"
+msgstr ""
+
msgid "Integrations|Send notifications about project events to Unify Circuit."
msgstr ""
+msgid "Integrations|Send notifications about project events to a Unify Circuit conversation. %{docs_link}"
+msgstr ""
+
msgid "Integrations|Sign in to add namespaces"
msgstr ""
@@ -18131,6 +18427,9 @@ msgstr ""
msgid "Integrations|You've activated every integration 🎉"
msgstr ""
+msgid "Integrations|ZenTao issues display here when you create issues in your project in ZenTao."
+msgstr ""
+
msgid "Interactive mode"
msgstr ""
@@ -18158,9 +18457,6 @@ msgstr ""
msgid "Interval Pattern"
msgstr "Modèle d’intervalle"
-msgid "Introducing Value Stream Analytics"
-msgstr ""
-
msgid "Introducing Your DevOps Report"
msgstr ""
@@ -18257,6 +18553,12 @@ msgstr ""
msgid "Investigate vulnerability: %{title}"
msgstr ""
+msgid "Invisible Captcha"
+msgstr ""
+
+msgid "Invisible Captcha helps prevent the creation of spam accounts. It adds a honeypot field and time-sensitive form submission to the account signup form."
+msgstr ""
+
msgid "Invitation"
msgstr ""
@@ -18710,12 +19012,18 @@ msgstr ""
msgid "Issues"
msgstr "Tickets"
+msgid "Issues I've created"
+msgstr ""
+
msgid "Issues Rate Limits"
msgstr ""
msgid "Issues and merge requests"
msgstr ""
+msgid "Issues assigned to me"
+msgstr ""
+
msgid "Issues can be bugs, tasks or ideas to be discussed. Also, issues are searchable and filterable."
msgstr "Les tickets peuvent être des bogues, des tâches ou des sujets de discussion. De plus, les tickets sont consultables et filtrables."
@@ -18827,7 +19135,7 @@ msgstr ""
msgid "Iterations|Create cadence"
msgstr ""
-msgid "Iterations|Create your first iteration"
+msgid "Iterations|Create iteration"
msgstr ""
msgid "Iterations|Delete cadence"
@@ -18836,6 +19144,9 @@ msgstr ""
msgid "Iterations|Delete iteration cadence?"
msgstr ""
+msgid "Iterations|Delete iteration?"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -18869,12 +19180,18 @@ msgstr ""
msgid "Iterations|New iteration cadence"
msgstr ""
+msgid "Iterations|No closed iterations."
+msgstr ""
+
msgid "Iterations|No iteration cadences to show."
msgstr ""
msgid "Iterations|No iterations in cadence."
msgstr ""
+msgid "Iterations|No open iterations."
+msgstr ""
+
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
@@ -18905,6 +19222,9 @@ msgstr ""
msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
msgstr ""
+msgid "Iterations|This will remove the iteration from any issues that are assigned to it."
+msgstr ""
+
msgid "Iterations|Title"
msgstr ""
@@ -18920,15 +19240,9 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "I’m familiar with the basics of DevOps."
-msgstr ""
-
msgid "I’m joining my team who’s already on GitLab"
msgstr ""
-msgid "I’m not familiar with the basics of DevOps."
-msgstr ""
-
msgid "Jaeger URL"
msgstr "URL Jaeger"
@@ -19193,6 +19507,9 @@ msgstr ""
msgid "Job"
msgstr "Tâche"
+msgid "Job %{jobName}"
+msgstr ""
+
msgid "Job Failed #%{build_id}"
msgstr ""
@@ -19783,9 +20100,6 @@ msgstr ""
msgid "Learn more in the"
msgstr "Apprenezâ€en plus dans la"
-msgid "Learn more in the|pipeline schedules documentation"
-msgstr "documentation sur la programmation de pipelines"
-
msgid "Learn more."
msgstr ""
@@ -19897,9 +20211,6 @@ msgstr "Quitter"
msgid "Leave Admin Mode"
msgstr ""
-msgid "Leave blank for no limit. Once set, existing personal access tokens may be revoked."
-msgstr ""
-
msgid "Leave edit mode? All unsaved changes will be lost."
msgstr ""
@@ -19945,10 +20256,10 @@ msgstr ""
msgid "LicenseCompliance|Acceptable license to be used in the project"
msgstr ""
-msgid "LicenseCompliance|Add a license"
+msgid "LicenseCompliance|Add license and related policy"
msgstr ""
-msgid "LicenseCompliance|Add license and related policy"
+msgid "LicenseCompliance|Add license policy"
msgstr ""
msgid "LicenseCompliance|Allow"
@@ -20038,6 +20349,9 @@ msgstr ""
msgid "LicenseManagement|Uncategorized"
msgstr ""
+msgid "Licensed Enterprise Edition features can be used if the project namespace's plan includes the feature, or if the project is public."
+msgstr ""
+
msgid "Licensed Features"
msgstr ""
@@ -20104,7 +20418,10 @@ msgstr ""
msgid "Limit namespaces and projects that can be indexed"
msgstr ""
-msgid "Limit sign in from multiple ips"
+msgid "Limit project size at a global, group, and project level. %{link_start}Learn more%{link_end}."
+msgstr ""
+
+msgid "Limit sign in from multiple IP addresses"
msgstr ""
msgid "Limit the number of concurrent operations this secondary site can run in the background."
@@ -20116,11 +20433,17 @@ msgstr ""
msgid "Limit the number of issues and epics per minute a user can create through web and API requests."
msgstr ""
+msgid "Limit the size of Sidekiq jobs stored in Redis."
+msgstr ""
+
msgid "Limited to showing %d event at most"
msgid_plural "Limited to showing %d events at most"
msgstr[0] "Affichage limité à %d événement maximum"
msgstr[1] "Affichage limité à %d événements maximum"
+msgid "Limiting mode"
+msgstr ""
+
msgid "Line changes"
msgstr ""
@@ -20190,9 +20513,6 @@ msgstr "Lister les dépôts disponibles"
msgid "List of all merge commits"
msgstr ""
-msgid "List of users to be excluded from the limit"
-msgstr ""
-
msgid "List options"
msgstr ""
@@ -20232,9 +20552,6 @@ msgstr ""
msgid "Loading functions timed out. Please reload the page to try again."
msgstr ""
-msgid "Loading issues"
-msgstr ""
-
msgid "Loading more"
msgstr ""
@@ -20526,6 +20843,9 @@ msgstr ""
msgid "Marked For Deletion At - %{deletion_time}"
msgstr ""
+msgid "Marked as ready. Merging is now allowed."
+msgstr ""
+
msgid "Marked this %{noun} as a draft."
msgstr ""
@@ -20598,52 +20918,22 @@ msgstr ""
msgid "Max 100,000 events"
msgstr ""
-msgid "Max 20 characters"
-msgstr ""
-
-msgid "Max Group Export Download requests per minute per user"
-msgstr ""
-
-msgid "Max Group Export requests per minute per user"
-msgstr ""
-
-msgid "Max Group Import requests per minute per user"
-msgstr ""
-
-msgid "Max Project Export Download requests per minute per user"
-msgstr ""
-
-msgid "Max Project Export requests per minute per user"
-msgstr ""
-
-msgid "Max Project Import requests per minute per user"
-msgstr ""
-
-msgid "Max authenticated API requests per period per user"
-msgstr ""
-
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
-msgid "Max authenticated web requests per period per user"
-msgstr ""
-
msgid "Max file size is 200 KB."
msgstr ""
-msgid "Max requests per minute per user"
-msgstr ""
-
msgid "Max role"
msgstr ""
msgid "Max session time"
msgstr ""
-msgid "Max unauthenticated requests per period per IP"
+msgid "MaxBuilds"
msgstr ""
-msgid "MaxBuilds"
+msgid "Maximum 20 characters"
msgstr ""
msgid "Maximum Conan package file size in bytes"
@@ -20679,6 +20969,12 @@ msgstr ""
msgid "Maximum attachment size (MB)"
msgstr ""
+msgid "Maximum authenticated API requests per rate limit period per user"
+msgstr ""
+
+msgid "Maximum authenticated web requests per rate limit period per user"
+msgstr ""
+
msgid "Maximum bulk request size (MiB)"
msgstr ""
@@ -20724,6 +21020,15 @@ msgstr ""
msgid "Maximum files in a diff"
msgstr ""
+msgid "Maximum group export download requests per minute"
+msgstr ""
+
+msgid "Maximum group export requests per minute"
+msgstr ""
+
+msgid "Maximum group import requests per minute"
+msgstr ""
+
msgid "Maximum import size"
msgstr ""
@@ -20760,7 +21065,7 @@ msgstr ""
msgid "Maximum number of projects."
msgstr ""
-msgid "Maximum number of unique IPs per user"
+msgid "Maximum number of unique IP addresses per user."
msgstr ""
msgid "Maximum page reached"
@@ -20769,12 +21074,24 @@ msgstr ""
msgid "Maximum page size"
msgstr ""
+msgid "Maximum project export download requests per minute"
+msgstr ""
+
+msgid "Maximum project export requests per minute"
+msgstr ""
+
+msgid "Maximum project import requests per minute"
+msgstr ""
+
msgid "Maximum push size"
msgstr ""
msgid "Maximum push size (MB)"
msgstr ""
+msgid "Maximum requests per minute"
+msgstr ""
+
msgid "Maximum running slices"
msgstr ""
@@ -20802,10 +21119,16 @@ msgstr ""
msgid "Maximum time between updates that a mirror can have when scheduled to synchronize."
msgstr ""
-msgid "Maximum time for web terminal websocket connection (in seconds). 0 for unlimited."
+msgid "Maximum time that users are allowed to skip the setup of two-factor authentication (in hours). Set to 0 (zero) to enforce at next sign in."
msgstr ""
-msgid "Maximum time that users are allowed to skip the setup of two-factor authentication (in hours). Set to 0 (zero) to enforce at next sign in."
+msgid "Maximum time, in seconds, for a web terminal websocket connection. 0 for unlimited."
+msgstr ""
+
+msgid "Maximum unauthenticated API requests per rate limit period per IP"
+msgstr ""
+
+msgid "Maximum unauthenticated web requests per rate limit period per IP"
msgstr ""
msgid "May"
@@ -20823,9 +21146,6 @@ msgstr ""
msgid "Medium vulnerabilities present"
msgstr ""
-msgid "Member lock"
-msgstr "Verrouillage des membres"
-
msgid "Member since"
msgstr ""
@@ -20862,6 +21182,9 @@ msgstr ""
msgid "Members of a group may only view projects they have permission to access"
msgstr ""
+msgid "Membership"
+msgstr ""
+
msgid "Members|%{time} by %{user}"
msgstr ""
@@ -20922,9 +21245,6 @@ msgstr ""
msgid "Members|Expiration date updated successfully."
msgstr ""
-msgid "Members|Expired"
-msgstr ""
-
msgid "Members|Filter members"
msgstr ""
@@ -20940,9 +21260,6 @@ msgstr ""
msgid "Members|Membership"
msgstr ""
-msgid "Members|No expiration set"
-msgstr ""
-
msgid "Members|Remove \"%{groupName}\""
msgstr ""
@@ -20964,9 +21281,6 @@ msgstr ""
msgid "Members|Search invited"
msgstr ""
-msgid "Members|in %{time}"
-msgstr ""
-
msgid "Member|Deny access"
msgstr ""
@@ -21042,9 +21356,6 @@ msgstr "Demande de fusion"
msgid "Merge request %{mr_link} was reviewed by %{mr_author}"
msgstr ""
-msgid "Merge request (MR) approvals"
-msgstr ""
-
msgid "Merge request analytics"
msgstr ""
@@ -21066,12 +21377,21 @@ msgstr ""
msgid "Merge requests"
msgstr "Demandes de fusion"
+msgid "Merge requests I've created"
+msgstr ""
+
msgid "Merge requests are a place to propose changes you've made to a project and discuss those changes with others"
msgstr "Les demandes de fusion permettent de proposer les modifications que vous avez apportées à un projet et de discuter de ces modifications avec les autres"
msgid "Merge requests are read-only in a secondary Geo node"
msgstr ""
+msgid "Merge requests assigned to me"
+msgstr ""
+
+msgid "Merge requests that I'm a reviewer"
+msgstr ""
+
msgid "Merge the branch and fix any conflicts that come up"
msgstr ""
@@ -21132,10 +21452,10 @@ msgstr ""
msgid "MergeRequests|An error occurred while saving the draft comment."
msgstr "Une erreur est survenue lors de l’enregistrement du brouillon du commentaire."
-msgid "MergeRequests|Failed to squash. Should be done manually."
+msgid "MergeRequests|Create issue to resolve thread"
msgstr ""
-msgid "MergeRequests|Resolve this thread in a new issue"
+msgid "MergeRequests|Failed to squash. Should be done manually."
msgstr ""
msgid "MergeRequests|Saving the comment failed"
@@ -21949,6 +22269,9 @@ msgstr ""
msgid "MoveIssue|Cannot move issue to project it originates from!"
msgstr ""
+msgid "MoveIssue|Cannot move issues of '%{issue_type}' type."
+msgstr ""
+
msgid "Moved issue to %{label} column in the board."
msgstr ""
@@ -22074,6 +22397,15 @@ 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. To learn more about reducing storage capacity please visit our docs."
msgstr ""
+msgid "NamespaceUserCap|Pending users must be reviewed and approved by a group owner. Learn more about %{user_caps_link_start}User Caps%{link_end} and %{users_pending_approval_link_start}Users Pending Approval%{link_end}."
+msgstr ""
+
+msgid "NamespaceUserCap|View pending user approvals"
+msgstr ""
+
+msgid "NamespaceUserCap|Your group has reached its billable member limit"
+msgstr ""
+
msgid "Namespaces"
msgstr ""
@@ -22116,9 +22448,6 @@ msgstr ""
msgid "Network"
msgstr "Réseau"
-msgid "Network Policy|New rule"
-msgstr ""
-
msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is inbound from a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
msgstr ""
@@ -22140,16 +22469,13 @@ msgstr ""
msgid "NetworkPolicies|%{strongOpen}any%{strongClose} port"
msgstr ""
-msgid "NetworkPolicies|+ Add alert"
-msgstr ""
-
msgid "NetworkPolicies|.yaml"
msgstr ""
msgid "NetworkPolicies|.yaml mode"
msgstr ""
-msgid "NetworkPolicies|Actions"
+msgid "NetworkPolicies|Add alert"
msgstr ""
msgid "NetworkPolicies|Alerts are intended to be selectively used for a limited number of events that are potentially concerning and warrant a manual review. Alerts should not be used as a substitute for a SIEM or a logging tool. High volume alerts are likely to be dropped so as to preserve the stability of GitLab's integration with Kubernetes."
@@ -22185,9 +22511,6 @@ msgstr ""
msgid "NetworkPolicies|Deny all traffic"
msgstr ""
-msgid "NetworkPolicies|Description"
-msgstr ""
-
msgid "NetworkPolicies|Edit policy"
msgstr ""
@@ -22200,9 +22523,6 @@ msgstr ""
msgid "NetworkPolicies|IP/subnet"
msgstr ""
-msgid "NetworkPolicies|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
-msgstr ""
-
msgid "NetworkPolicies|Invalid or empty policy"
msgstr ""
@@ -22212,19 +22532,16 @@ msgstr ""
msgid "NetworkPolicies|Kubernetes error: %{error}"
msgstr ""
-msgid "NetworkPolicies|Name"
-msgstr ""
-
msgid "NetworkPolicies|Network"
msgstr ""
-msgid "NetworkPolicies|Network traffic"
+msgid "NetworkPolicies|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
msgstr ""
-msgid "NetworkPolicies|New policy"
+msgid "NetworkPolicies|Network policy can be created after the environment is loaded successfully."
msgstr ""
-msgid "NetworkPolicies|No policies detected"
+msgid "NetworkPolicies|Network traffic"
msgstr ""
msgid "NetworkPolicies|None selected"
@@ -22233,21 +22550,12 @@ msgstr ""
msgid "NetworkPolicies|Please %{installLinkStart}install%{installLinkEnd} and %{configureLinkStart}configure a Kubernetes Agent for this project%{configureLinkEnd} to enable alerts."
msgstr ""
-msgid "NetworkPolicies|Policies are a specification of how groups of pods are allowed to communicate with each other's network endpoints."
-msgstr ""
-
msgid "NetworkPolicies|Policy %{policyName} was successfully changed"
msgstr ""
msgid "NetworkPolicies|Policy definition"
msgstr ""
-msgid "NetworkPolicies|Policy editor"
-msgstr ""
-
-msgid "NetworkPolicies|Policy preview"
-msgstr ""
-
msgid "NetworkPolicies|Rule"
msgstr ""
@@ -22257,9 +22565,6 @@ msgstr ""
msgid "NetworkPolicies|Rule mode is unavailable for this policy. In some cases, we cannot parse the YAML file back into the rules editor."
msgstr ""
-msgid "NetworkPolicies|Rules"
-msgstr ""
-
msgid "NetworkPolicies|Save changes"
msgstr ""
@@ -22272,9 +22577,6 @@ msgstr ""
msgid "NetworkPolicies|Traffic that does not match any rule will be blocked."
msgstr ""
-msgid "NetworkPolicies|Unable to parse policy"
-msgstr ""
-
msgid "NetworkPolicies|all DNS names"
msgstr ""
@@ -22454,6 +22756,9 @@ msgstr "Nouvelle identité"
msgid "New issue"
msgstr "Nouveau ticket"
+msgid "New issue in %{project}"
+msgstr ""
+
msgid "New issue title"
msgstr ""
@@ -22532,7 +22837,7 @@ msgstr "Nouveau…"
msgid "Newest first"
msgstr ""
-msgid "Newly registered users will by default be external"
+msgid "Newly-registered users are external by default"
msgstr ""
msgid "Next"
@@ -22847,8 +23152,10 @@ msgstr ""
msgid "No webhooks found, add one in the form above."
msgstr ""
-msgid "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} to renew your subscription."
-msgstr ""
+msgid "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} day to renew your subscription."
+msgid_plural "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} days to renew your subscription."
+msgstr[0] ""
+msgstr[1] ""
msgid "No. of commits"
msgstr ""
@@ -22865,11 +23172,11 @@ msgstr ""
msgid "Nodes"
msgstr "NÅ“uds"
-msgid "Non-admin users can sign in with read-only access and make read-only API requests."
+msgid "Non-admin users are restricted to read-only access, in both GitLab UI and API."
msgstr ""
msgid "None"
-msgstr "Aucun·e"
+msgstr ""
msgid "None of the group milestones have the same project as the release"
msgstr ""
@@ -22902,7 +23209,7 @@ msgid "Not available to run jobs."
msgstr ""
msgid "Not confidential"
-msgstr "Pas confidentiel·le"
+msgstr ""
msgid "Not found."
msgstr ""
@@ -22946,7 +23253,7 @@ msgstr "Remarque : Envisagez de demander à votre administra·teur·trice GitLa
msgid "NoteForm|Note"
msgstr ""
-msgid "Notes Rate Limits"
+msgid "Notes rate limit"
msgstr ""
msgid "Notes|Are you sure you want to cancel creating this comment?"
@@ -23113,9 +23420,6 @@ msgstr "nov."
msgid "November"
msgstr "novembre"
-msgid "Novice"
-msgstr ""
-
msgid "Now, personalize your GitLab experience"
msgstr ""
@@ -23284,7 +23588,7 @@ msgstr ""
msgid "OnCallSchedules|For this rotation, on-call will be:"
msgstr ""
-msgid "OnCallSchedules|On-call schedule %{schedule} in Project %{project}"
+msgid "OnCallSchedules|On-call schedule %{obstacle} in Project %{project}"
msgstr ""
msgid "OnCallSchedules|On-call schedules"
@@ -23431,22 +23735,22 @@ msgstr ""
msgid "OnDemandScans|Scanner profile"
msgstr ""
-msgid "OnDemandScans|Select one of the existing profiles"
+msgid "OnDemandScans|Schedule scan"
msgstr ""
-msgid "OnDemandScans|Site profile"
+msgid "OnDemandScans|Select one of the existing profiles"
msgstr ""
-msgid "OnDemandScans|Use existing scanner profile"
+msgid "OnDemandScans|Site profile"
msgstr ""
-msgid "OnDemandScans|Use existing site profile"
+msgid "OnDemandScans|Start time"
msgstr ""
-msgid "OnDemandScans|You can either choose a passive scan or validate the target site in your chosen site profile. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
+msgid "OnDemandScans|Use existing scanner profile"
msgstr ""
-msgid "OnDemandScans|You cannot run an active scan against an unvalidated site."
+msgid "OnDemandScans|Use existing site profile"
msgstr ""
msgid "OnDemandScans|You must create a repository within your project to run an on-demand scan."
@@ -23511,6 +23815,9 @@ msgstr ""
msgid "Only admins can delete project"
msgstr ""
+msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
+msgstr ""
+
msgid "Only include features new to your current subscription tier."
msgstr ""
@@ -23529,6 +23836,12 @@ msgstr ""
msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
+msgid "Only reCAPTCHA v2 is supported:"
+msgstr ""
+
+msgid "Only users from the specified IP address ranges are able to reach this group, including all subgroups, projects, and Git repositories."
+msgstr ""
+
msgid "Only verified users with an email address in any of these domains can be added to the group."
msgstr ""
@@ -23715,9 +24028,6 @@ msgstr "Propriétaire"
msgid "Package Registry"
msgstr ""
-msgid "Package Registry Rate Limits"
-msgstr ""
-
msgid "Package Registry: authenticated API requests"
msgstr ""
@@ -23736,6 +24046,9 @@ msgstr ""
msgid "Package recipe already exists"
msgstr ""
+msgid "Package registry rate limits"
+msgstr ""
+
msgid "Package type"
msgstr ""
@@ -23802,6 +24115,9 @@ msgstr ""
msgid "PackageRegistry|Composer"
msgstr ""
+msgid "PackageRegistry|Composer.json with license: %{license} and version: %{version}"
+msgstr ""
+
msgid "PackageRegistry|Conan"
msgstr ""
@@ -23865,6 +24181,9 @@ msgstr ""
msgid "PackageRegistry|Copy require package include"
msgstr ""
+msgid "PackageRegistry|Copy target SHA"
+msgstr ""
+
msgid "PackageRegistry|Copy yarn command"
msgstr ""
@@ -23931,6 +24250,9 @@ msgstr ""
msgid "PackageRegistry|Install package version"
msgstr ""
+msgid "PackageRegistry|Instance-level"
+msgstr ""
+
msgid "PackageRegistry|Invalid Package: failed metadata extraction"
msgstr ""
@@ -23976,6 +24298,9 @@ msgstr ""
msgid "PackageRegistry|Pip Command"
msgstr ""
+msgid "PackageRegistry|Project-level"
+msgstr ""
+
msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
msgstr ""
@@ -23997,6 +24322,9 @@ msgstr ""
msgid "PackageRegistry|Remove package"
msgstr ""
+msgid "PackageRegistry|Required Python: %{pythonVersion}"
+msgstr ""
+
msgid "PackageRegistry|RubyGems"
msgstr ""
@@ -24039,6 +24367,9 @@ msgstr ""
msgid "PackageRegistry|Source project located at %{link}"
msgstr ""
+msgid "PackageRegistry|Target SHA: %{sha}"
+msgstr ""
+
msgid "PackageRegistry|There are no other versions of this package."
msgstr ""
@@ -24207,6 +24538,18 @@ msgstr ""
msgid "Password was successfully updated. Please sign in again."
msgstr ""
+msgid "PasswordPrompt|Confirm password"
+msgstr ""
+
+msgid "PasswordPrompt|Confirm password to continue"
+msgstr ""
+
+msgid "PasswordPrompt|Password is required"
+msgstr ""
+
+msgid "PasswordPrompt|Please enter your password to confirm"
+msgstr ""
+
msgid "Passwords should be unique and not used for any other sites or services."
msgstr ""
@@ -24234,6 +24577,9 @@ msgstr ""
msgid "Paste project path (i.e. gitlab-org/gitlab)"
msgstr ""
+msgid "Paste this DSN into your Sentry SDK"
+msgstr ""
+
msgid "Paste your public SSH key, which is usually contained in the file '~/.ssh/id_ed25519.pub' or '~/.ssh/id_rsa.pub' and begins with 'ssh-ed25519' or 'ssh-rsa'. Do not paste your private SSH key, as that can compromise your identity."
msgstr ""
@@ -24318,6 +24664,9 @@ msgstr ""
msgid "PerformanceBar|First Contentful Paint"
msgstr ""
+msgid "PerformanceBar|Flamegraph with mode:"
+msgstr ""
+
msgid "PerformanceBar|Frontend resources"
msgstr ""
@@ -24351,6 +24700,15 @@ msgstr ""
msgid "PerformanceBar|Trace"
msgstr ""
+msgid "PerformanceBar|cpu"
+msgstr ""
+
+msgid "PerformanceBar|object"
+msgstr ""
+
+msgid "PerformanceBar|wall"
+msgstr ""
+
msgid "Period in seconds"
msgstr ""
@@ -24579,6 +24937,48 @@ msgstr "Cible"
msgid "PipelineSchedules|Variables"
msgstr "Variables"
+msgid "PipelineSource|API"
+msgstr ""
+
+msgid "PipelineSource|Chat"
+msgstr ""
+
+msgid "PipelineSource|External"
+msgstr ""
+
+msgid "PipelineSource|External Pull Request"
+msgstr ""
+
+msgid "PipelineSource|Merge Request"
+msgstr ""
+
+msgid "PipelineSource|On-Demand DAST Scan"
+msgstr ""
+
+msgid "PipelineSource|On-Demand DAST Validation"
+msgstr ""
+
+msgid "PipelineSource|Parent Pipeline"
+msgstr ""
+
+msgid "PipelineSource|Pipeline"
+msgstr ""
+
+msgid "PipelineSource|Push"
+msgstr ""
+
+msgid "PipelineSource|Schedule"
+msgstr ""
+
+msgid "PipelineSource|Trigger"
+msgstr ""
+
+msgid "PipelineSource|Web"
+msgstr ""
+
+msgid "PipelineSource|Web IDE"
+msgstr ""
+
msgid "PipelineStatusTooltip|Pipeline: %{ciStatus}"
msgstr ""
@@ -24879,46 +25279,7 @@ msgstr ""
msgid "Pipeline|Source"
msgstr ""
-msgid "Pipeline|Source|API"
-msgstr ""
-
-msgid "Pipeline|Source|Chat"
-msgstr ""
-
-msgid "Pipeline|Source|External"
-msgstr ""
-
-msgid "Pipeline|Source|External Pull Request"
-msgstr ""
-
-msgid "Pipeline|Source|Merge Request"
-msgstr ""
-
-msgid "Pipeline|Source|On-Demand DAST Scan"
-msgstr ""
-
-msgid "Pipeline|Source|On-Demand DAST Validation"
-msgstr ""
-
-msgid "Pipeline|Source|Parent Pipeline"
-msgstr ""
-
-msgid "Pipeline|Source|Pipeline"
-msgstr ""
-
-msgid "Pipeline|Source|Push"
-msgstr ""
-
-msgid "Pipeline|Source|Schedule"
-msgstr ""
-
-msgid "Pipeline|Source|Trigger"
-msgstr ""
-
-msgid "Pipeline|Source|Web"
-msgstr ""
-
-msgid "Pipeline|Source|Web IDE"
+msgid "Pipeline|Source|Security Policy"
msgstr ""
msgid "Pipeline|Specify variable values to be used in this run. The values specified in %{linkStart}CI/CD settings%{linkEnd} will be used by default."
@@ -24969,8 +25330,8 @@ msgstr ""
msgid "Pipeline|We are currently unable to fetch pipeline data"
msgstr ""
-msgid "Pipeline|You’re about to stop pipeline %{pipelineId}."
-msgstr "Vous êtes sur le point d’arrêter le pipeline %{pipelineId}."
+msgid "Pipeline|You’re about to stop pipeline #%{pipelineId}."
+msgstr ""
msgid "Pipeline|for"
msgstr ""
@@ -24996,6 +25357,9 @@ msgstr ""
msgid "Plain diff"
msgstr "Diff brut"
+msgid "Plain-text response to send to clients that hit a rate limit"
+msgstr ""
+
msgid "Plan:"
msgstr ""
@@ -25140,9 +25504,6 @@ msgstr ""
msgid "Please provide attributes to update"
msgstr ""
-msgid "Please provide your username or email address."
-msgstr ""
-
msgid "Please reach out if you have any questions and we'll be happy to assist."
msgstr ""
@@ -25185,9 +25546,6 @@ msgstr ""
msgid "Please set a new password before proceeding."
msgstr ""
-msgid "Please share your feedback about %{featureName} %{linkStart}in this issue%{linkEnd} to help us improve the experience."
-msgstr ""
-
msgid "Please solve the captcha"
msgstr ""
@@ -25365,6 +25723,9 @@ msgstr ""
msgid "Prevent adding new members to project membership within this group"
msgstr "Empêcher l’ajout de nouveaux membres au projet au sein de ce groupe"
+msgid "Prevent auto-stopping"
+msgstr ""
+
msgid "Prevent editing approval rules in projects and merge requests."
msgstr ""
@@ -25377,7 +25738,7 @@ msgstr ""
msgid "Prevent users from changing their profile name"
msgstr ""
-msgid "Prevent users from performing write operations on GitLab while performing maintenance."
+msgid "Prevent users from performing write operations while GitLab maintenance is in progress."
msgstr ""
msgid "Preview"
@@ -25650,6 +26011,9 @@ msgstr ""
msgid "Profiles|Enter your name, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Enter your password to confirm the email change"
+msgstr ""
+
msgid "Profiles|Enter your pronouns to let people know how to refer to you"
msgstr ""
@@ -25884,10 +26248,10 @@ msgstr "Votre statut"
msgid "Profiles|e.g. My MacBook key"
msgstr "p. ex., Ma clef MacBook"
-msgid "Profiles|username"
+msgid "Profiles|https://website.com"
msgstr ""
-msgid "Profiles|website.com"
+msgid "Profiles|username"
msgstr ""
msgid "Profiles|your account"
@@ -26130,9 +26494,21 @@ msgstr "Identifiant de projet : %{project_id}"
msgid "ProjectSelect| or group"
msgstr ""
+msgid "ProjectSelect|No matching results"
+msgstr ""
+
msgid "ProjectSelect|Search for project"
msgstr ""
+msgid "ProjectSelect|Search projects"
+msgstr ""
+
+msgid "ProjectSelect|Select a project"
+msgstr ""
+
+msgid "ProjectSelect|There was an error fetching the projects. Please try again."
+msgstr ""
+
msgid "ProjectService|Drone server URL"
msgstr ""
@@ -26220,6 +26596,9 @@ msgstr ""
msgid "ProjectService|Trigger event when a new, unique alert is recorded."
msgstr ""
+msgid "ProjectService|Trigger event when a new, unique vulnerability is recorded. (Note: This feature requires an Ultimate plan.)"
+msgstr ""
+
msgid "ProjectService|Trigger event when a pipeline status changes."
msgstr ""
@@ -26634,9 +27013,15 @@ msgstr ""
msgid "Projects are graded based on the highest severity vulnerability present"
msgstr ""
+msgid "Projects are organized into groups"
+msgstr ""
+
msgid "Projects contributed to"
msgstr ""
+msgid "Projects help you organize your work. They contain your file repository, issues, merge requests, and so much more."
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr "Projets partagés avec %{group_name}"
@@ -26871,10 +27256,10 @@ msgstr ""
msgid "PrometheusService|Prometheus cluster integration"
msgstr ""
-msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
+msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
msgstr ""
-msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
+msgid "PrometheusService|The ID of the IAP-secured resource."
msgstr ""
msgid "PrometheusService|The Prometheus API base URL."
@@ -27492,6 +27877,9 @@ msgstr ""
msgid "Rate limit"
msgstr ""
+msgid "Rate limits can help reduce request volume (like from crawlers or abusive bots)."
+msgstr ""
+
msgid "Raw blob request rate limit per minute"
msgstr ""
@@ -27504,6 +27892,9 @@ msgstr ""
msgid "Re-authentication required"
msgstr ""
+msgid "Re-import"
+msgstr ""
+
msgid "Re-request review"
msgstr ""
@@ -27525,6 +27916,9 @@ msgstr ""
msgid "Read more about related issues"
msgstr ""
+msgid "Read their documentation."
+msgstr ""
+
msgid "Ready to get started with GitLab? Follow these steps to set up your workspace, plan and commit changes, and deploy your project."
msgstr ""
@@ -27558,6 +27952,9 @@ msgstr ""
msgid "Receive any notifications from GitLab."
msgstr ""
+msgid "Receive notification of abuse reports by email."
+msgstr ""
+
msgid "Receive notifications about your own activity"
msgstr ""
@@ -27701,9 +28098,6 @@ msgstr ""
msgid "Registry setup"
msgstr ""
-msgid "Regulate approvals by authors/committers. Affects all projects."
-msgstr ""
-
msgid "Reindexing Status: %{status} (Slice multiplier: %{multiplier}, Maximum running slices: %{max_slices})"
msgstr ""
@@ -27799,6 +28193,9 @@ msgstr ""
msgid "Release|Something went wrong while saving the release details."
msgstr ""
+msgid "Reload page"
+msgstr ""
+
msgid "Remediations"
msgstr ""
@@ -28081,6 +28478,9 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
+msgid "Repeats"
+msgstr ""
+
msgid "Replace"
msgstr ""
@@ -28443,10 +28843,7 @@ msgstr ""
msgid "Require additional authentication for administrative tasks."
msgstr ""
-msgid "Require all users in this group to setup Two-factor authentication"
-msgstr ""
-
-msgid "Require all users in this group to setup two-factor authentication"
+msgid "Require all users in this group to set up two-factor authentication"
msgstr ""
msgid "Required approvals (%{approvals_given} given)"
@@ -28492,6 +28889,9 @@ msgstr[1] ""
msgid "Requires values to meet regular expression requirements."
msgstr ""
+msgid "Requires you to deploy or set up cloud-hosted Sentry."
+msgstr ""
+
msgid "Requires your primary GitLab email address."
msgstr ""
@@ -28552,9 +28952,6 @@ msgstr ""
msgid "Resolve"
msgstr ""
-msgid "Resolve all threads in new issue"
-msgstr ""
-
msgid "Resolve conflicts"
msgstr ""
@@ -28612,6 +29009,9 @@ msgstr "Métriques de réponse (nginx)"
msgid "Response text"
msgstr ""
+msgid "Restart GitLab to apply changes."
+msgstr ""
+
msgid "Restart Terminal"
msgstr ""
@@ -28630,6 +29030,9 @@ msgstr ""
msgid "Restoring the project will prevent the project from being removed on this date and restore people's ability to make changes to it."
msgstr ""
+msgid "Restrict group access by IP address. %{link_start}Learn more%{link_end}."
+msgstr ""
+
msgid "Restrict membership by email domain"
msgstr ""
@@ -28943,6 +29346,9 @@ msgstr ""
msgid "Runners|Runner #%{runner_id}"
msgstr ""
+msgid "Runners|Runner assigned to project."
+msgstr ""
+
msgid "Runners|Runner is offline, last contact was %{runner_contact} ago"
msgstr ""
@@ -28955,6 +29361,9 @@ msgstr ""
msgid "Runners|Runner registration"
msgstr ""
+msgid "Runners|Runner unassigned from project."
+msgstr ""
+
msgid "Runners|Runners"
msgstr ""
@@ -29147,7 +29556,7 @@ msgstr ""
msgid "SastEntryPoints|How do I set up SAST?"
msgstr ""
-msgid "SastEntryPoints|Learn more."
+msgid "SastEntryPoints|Learn more"
msgstr ""
msgid "Satisfied"
@@ -29189,7 +29598,7 @@ msgstr ""
msgid "Save pipeline schedule"
msgstr "Sauvegarder la planification du pipeline"
-msgid "Save space and find images in the container Registry. remove unneeded tags and keep only the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
+msgid "Save storage space by automatically deleting tags from the container registry and keeping the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
msgstr ""
msgid "Saving"
@@ -29363,6 +29772,9 @@ msgstr "Rechercher ou filtrer les résultats…"
msgid "Search or filter results…"
msgstr ""
+msgid "Search or jump to..."
+msgstr ""
+
msgid "Search project"
msgstr "Rechercher des projets"
@@ -29423,16 +29835,16 @@ msgstr ""
msgid "SearchCodeResults|of %{link_to_project}"
msgstr ""
-msgid "SearchResults|Showing %{count} %{scope} for%{term_element}"
+msgid "SearchResults|Showing %{count} %{scope} for %{term_element}"
msgstr ""
-msgid "SearchResults|Showing %{count} %{scope} for%{term_element} in your personal and project snippets"
+msgid "SearchResults|Showing %{count} %{scope} for %{term_element} in your personal and project snippets"
msgstr ""
-msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for%{term_element}"
+msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for %{term_element}"
msgstr ""
-msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for%{term_element} in your personal and project snippets"
+msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for %{term_element} in your personal and project snippets"
msgstr ""
msgid "SearchResults|code result"
@@ -29514,6 +29926,9 @@ msgstr "Secret"
msgid "Secret Detection"
msgstr ""
+msgid "Secret access key"
+msgstr ""
+
msgid "Secret token"
msgstr ""
@@ -29553,9 +29968,6 @@ msgstr ""
msgid "SecurityApprovals|A merge request approval is required when the license compliance report contains a denied license."
msgstr ""
-msgid "SecurityApprovals|Configurable if security scanners are enabled. %{linkStart}Learn more.%{linkEnd}"
-msgstr ""
-
msgid "SecurityApprovals|Coverage-Check"
msgstr ""
@@ -29568,24 +29980,18 @@ msgstr ""
msgid "SecurityApprovals|Learn more about Vulnerability-Check"
msgstr ""
-msgid "SecurityApprovals|License Scanning must be enabled. %{linkStart}Learn more%{linkEnd}."
-msgstr ""
-
msgid "SecurityApprovals|License-Check"
msgstr ""
msgid "SecurityApprovals|Requires approval for Denied licenses. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}More information%{linkEnd}"
+msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "SecurityApprovals|Requires approval for vulnerabilities. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
-msgid "SecurityApprovals|Test coverage must be enabled. %{linkStart}Learn more%{linkEnd}."
-msgstr ""
-
msgid "SecurityApprovals|Vulnerability-Check"
msgstr ""
@@ -29649,6 +30055,12 @@ msgstr ""
msgid "SecurityConfiguration|Immediately begin risk analysis and remediation with application security features. Start with SAST and Secret Detection, available to all plans. Upgrade to Ultimate to get all features, including:"
msgstr ""
+msgid "SecurityConfiguration|Manage corpus"
+msgstr ""
+
+msgid "SecurityConfiguration|Manage corpus files used as mutation sources in coverage fuzzing."
+msgstr ""
+
msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
msgstr ""
@@ -29703,6 +30115,12 @@ msgstr ""
msgid "SecurityOrchestration|Action"
msgstr ""
+msgid "SecurityOrchestration|Actions"
+msgstr ""
+
+msgid "SecurityOrchestration|Add rule"
+msgstr ""
+
msgid "SecurityOrchestration|All policies"
msgstr ""
@@ -29736,9 +30154,6 @@ msgstr ""
msgid "SecurityOrchestration|Network"
msgstr ""
-msgid "SecurityOrchestration|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
-msgstr ""
-
msgid "SecurityOrchestration|New policy"
msgstr ""
@@ -29754,6 +30169,9 @@ msgstr ""
msgid "SecurityOrchestration|Policy editor"
msgstr ""
+msgid "SecurityOrchestration|Policy preview"
+msgstr ""
+
msgid "SecurityOrchestration|Policy status"
msgstr ""
@@ -29763,6 +30181,9 @@ msgstr ""
msgid "SecurityOrchestration|Rule"
msgstr ""
+msgid "SecurityOrchestration|Rules"
+msgstr ""
+
msgid "SecurityOrchestration|Scan Execution"
msgstr ""
@@ -29856,6 +30277,9 @@ msgstr ""
msgid "SecurityReports|Create issue"
msgstr ""
+msgid "SecurityReports|Development vulnerabilities"
+msgstr ""
+
msgid "SecurityReports|Dismiss vulnerability"
msgstr ""
@@ -29871,6 +30295,9 @@ msgstr ""
msgid "SecurityReports|Download results"
msgstr ""
+msgid "SecurityReports|Download scanned URLs"
+msgstr ""
+
msgid "SecurityReports|Download scanned resources"
msgstr ""
@@ -29994,6 +30421,9 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
+msgid "SecurityReports|The Vulnerability Report shows the results of the lastest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "SecurityReports|The security reports below contain one or more vulnerability findings that could not be parsed and were not recorded. Download the artifacts in the job output to investigate. Ensure any security report created conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
msgstr ""
@@ -30135,10 +30565,10 @@ msgstr ""
msgid "Select a repository"
msgstr ""
-msgid "Select a role"
+msgid "Select a repository containing templates for common files."
msgstr ""
-msgid "Select a shared template repository for all projects on this instance."
+msgid "Select a role"
msgstr ""
msgid "Select a template repository"
@@ -30216,6 +30646,9 @@ msgstr "Sélectionnez le projet et la zone afin de choisir le type de machine"
msgid "Select project to choose zone"
msgstr "Sélectionnez le projet afin de choisir la zone"
+msgid "Select project to create issue"
+msgstr ""
+
msgid "Select projects"
msgstr ""
@@ -30333,6 +30766,9 @@ msgstr ""
msgid "Send emails to help guide new users through the onboarding process."
msgstr ""
+msgid "Send emails to users upon account deactivation."
+msgstr ""
+
msgid "Send message"
msgstr ""
@@ -30351,6 +30787,9 @@ msgstr ""
msgid "Send service data"
msgstr ""
+msgid "Sentry"
+msgstr ""
+
msgid "Sentry API URL"
msgstr ""
@@ -30465,6 +30904,9 @@ msgstr ""
msgid "Service"
msgstr ""
+msgid "Service Accounts keys are required to authorize GitLab to deploy your Google Cloud project."
+msgstr ""
+
msgid "Service Desk"
msgstr "Service d’assistance"
@@ -30537,15 +30979,15 @@ msgstr ""
msgid "Set a password on your account to pull or push via %{protocol}."
msgstr "Définissez un mot de passe pour votre compte afin de pouvoir récupérer ou pousser vos modification via %{protocol}."
-msgid "Set a template repository for projects in this group"
-msgstr "Définir un modèle de dépôt pour les projets de ce groupe"
-
msgid "Set access permissions for this token."
msgstr ""
msgid "Set an instance-wide domain that will be available to all clusters when installing Knative."
msgstr ""
+msgid "Set any rate limit to %{code_open}0%{code_close} to disable the limit."
+msgstr ""
+
msgid "Set default and restrict visibility levels. Configure import sources and git access protocol."
msgstr "Définissez les valeurs par défaut et restreignez les niveaux de visibilité. Configurez les sources d’importation et le protocole d’accès pour Git."
@@ -30558,8 +31000,8 @@ msgstr ""
msgid "Set limit to 0 to allow any file size."
msgstr ""
-msgid "Set max session time for web terminal."
-msgstr "Définissez le temps maximal de la session pour le terminal Web."
+msgid "Set limits for web and API requests."
+msgstr ""
msgid "Set milestone"
msgstr ""
@@ -30567,15 +31009,18 @@ msgstr ""
msgid "Set new password"
msgstr ""
-msgid "Set notification email for abuse reports."
-msgstr "Définissez un courriel de notification pour les rapports d’abus."
-
msgid "Set parent epic to an epic"
msgstr ""
+msgid "Set per-user rate limits for imports and exports of projects and groups."
+msgstr ""
+
msgid "Set projects and maximum size limits, session duration, user options, and check feature availability for namespace plan."
msgstr ""
+msgid "Set rate limits for package registry API requests that supersede the general user and IP rate limits."
+msgstr ""
+
msgid "Set severity"
msgstr ""
@@ -30594,15 +31039,24 @@ msgstr ""
msgid "Set the default branch for this project. All merge requests and commits are made against this branch unless you specify a different one."
msgstr ""
+msgid "Set the default expiration time for job artifacts in all projects. Set to %{code_open}0%{code_close} to never expire artifacts by default. If no unit is written, it defaults to seconds. For example, these are all equivalent: %{code_open}3600%{code_close}, %{code_open}60 minutes%{code_close}, or %{code_open}one hour%{code_close}."
+msgstr ""
+
msgid "Set the due date to %{due_date}."
msgstr ""
msgid "Set the iteration to %{iteration_reference}."
msgstr ""
+msgid "Set the maximum session time for a web terminal."
+msgstr ""
+
msgid "Set the milestone to %{milestone_reference}."
msgstr ""
+msgid "Set the per-user rate limit for notes created by web or API requests."
+msgstr ""
+
msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
msgstr ""
@@ -30804,6 +31258,9 @@ msgstr ""
msgid "Show Pipeline IID"
msgstr ""
+msgid "Show all %{issuable_type}."
+msgstr ""
+
msgid "Show all activity"
msgstr ""
@@ -30855,15 +31312,9 @@ msgstr "Afficher la dernière version"
msgid "Show list"
msgstr ""
-msgid "Show me advanced features"
-msgstr ""
-
msgid "Show me how to add a pipeline"
msgstr ""
-msgid "Show me the basics"
-msgstr ""
-
msgid "Show one file at a time"
msgstr ""
@@ -30904,15 +31355,15 @@ msgstr ""
msgid "Showing %{pageSize} of %{total} %{issuableType}"
msgstr ""
-msgid "Showing %{pageSize} of %{total} issues"
-msgstr ""
-
msgid "Showing all epics"
msgstr ""
msgid "Showing all issues"
msgstr ""
+msgid "Showing data for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
+msgstr ""
+
msgid "Showing data for workflow items created in this date range. Date range cannot exceed %{maxDateRange} days."
msgstr ""
@@ -30952,6 +31403,15 @@ msgstr "Seuls les caractères numériques sont autorisés"
msgid "Sidebar|Weight"
msgstr "Poids"
+msgid "Sidekiq job compression threshold (bytes)"
+msgstr ""
+
+msgid "Sidekiq job size limit (bytes)"
+msgstr ""
+
+msgid "Sidekiq job size limits"
+msgstr ""
+
msgid "Sign in"
msgstr "Connexion"
@@ -31072,6 +31532,9 @@ msgstr ""
msgid "Site profile not found for given parameters"
msgstr ""
+msgid "Sites"
+msgstr ""
+
msgid "Size"
msgstr "Taille"
@@ -31102,19 +31565,22 @@ msgstr "L’intégration de Slack permet d’interagir avec GitLab via des comma
msgid "SlackIntegration|Sends notifications about project events to Slack channels."
msgstr ""
-msgid "SlackService|2. Paste the %{strong_open}Token%{strong_close} into the field below"
+msgid "SlackService|1. %{slash_command_link_start}Add a slash command%{slash_command_link_end} in your Slack team using this information:"
msgstr ""
-msgid "SlackService|3. Select the %{strong_open}Active%{strong_close} checkbox, press %{strong_open}Save changes%{strong_close} and start using GitLab inside Slack!"
+msgid "SlackService|2. Paste the token from Slack in the %{strong_open}Token%{strong_close} field below."
msgstr ""
-msgid "SlackService|Fill in the word that works best for your team."
+msgid "SlackService|3. Select the %{strong_open}Active%{strong_close} checkbox, select %{strong_open}Save changes%{strong_close}, and start using slash commands in Slack!"
+msgstr ""
+
+msgid "SlackService|After setup, get a list of available Slack slash commands by entering"
msgstr ""
-msgid "SlackService|See list of available commands in Slack after setting up this service, by entering"
+msgid "SlackService|Fill in the word that works best for your team."
msgstr ""
-msgid "SlackService|This service allows users to perform common operations on this project by entering slash commands in Slack."
+msgid "SlackService|Perform common operations in this project by entering slash commands in Slack."
msgstr ""
msgid "Slice multiplier"
@@ -31180,7 +31646,7 @@ msgstr ""
msgid "Some child epics may be hidden due to applied filters"
msgstr ""
-msgid "Some common domains are not allowed. %{read_more_link}."
+msgid "Some common domains are not allowed. %{learn_more_link}."
msgstr ""
msgid "Some of the designs you tried uploading did not change:"
@@ -31264,9 +31730,6 @@ msgstr ""
msgid "Something went wrong while exporting requirements"
msgstr ""
-msgid "Something went wrong while fetching %{listType} list"
-msgstr "Une erreur est survenue lors de la récupération de la liste de %{listType}"
-
msgid "Something went wrong while fetching branches"
msgstr ""
@@ -31321,15 +31784,9 @@ msgstr ""
msgid "Something went wrong while merging this merge request. Please try again."
msgstr ""
-msgid "Something went wrong while moving issues."
-msgstr ""
-
msgid "Something went wrong while obtaining the Let's Encrypt certificate."
msgstr ""
-msgid "Something went wrong while performing the action."
-msgstr ""
-
msgid "Something went wrong while promoting the issue to an epic. Please try again."
msgstr ""
@@ -31657,7 +32114,10 @@ msgstr ""
msgid "SourcegraphPreferences|Uses a custom %{linkStart}Sourcegraph instance%{linkEnd}."
msgstr ""
-msgid "Spam Check API Key"
+msgid "Spam Check"
+msgstr ""
+
+msgid "Spam Check API key"
msgstr ""
msgid "Spam Logs"
@@ -31675,8 +32135,8 @@ msgstr ""
msgid "Specified URL cannot be used: \"%{reason}\""
msgstr ""
-msgid "Specify an e-mail address regex pattern to identify default internal users."
-msgstr "Spécifiez un motif d’expression rationnelle permettant l’identification des adresses de courriel des utilisateurs internes."
+msgid "Specify an email address regex pattern to identify default internal users."
+msgstr ""
msgid "Speed up your pipelines with Needs relationships"
msgstr ""
@@ -31930,7 +32390,7 @@ msgstr ""
msgid "StatusCheck|An error occurred fetching the status checks."
msgstr ""
-msgid "StatusCheck|Apply this status check to any branch or a specific protected branch."
+msgid "StatusCheck|Apply this status check to all branches or a specific protected branch."
msgstr ""
msgid "StatusCheck|Check for a status response in Merge Requests. Failures do not block merges. %{link_start}Learn more%{link_end}."
@@ -32269,6 +32729,9 @@ msgstr ""
msgid "Subscriptions"
msgstr ""
+msgid "Subscription|Your subscription for %{strong}%{namespace_name}%{strong_close} has expired and you are now on %{pricing_link_start}the GitLab Free tier%{pricing_link_end}. Don't worry, your data is safe. Get in touch with our support team (%{support_email}). They'll gladly help with your subscription renewal."
+msgstr ""
+
msgid "Subtracted"
msgstr ""
@@ -32497,6 +32960,9 @@ msgstr ""
msgid "SuperSonics|Plan"
msgstr ""
+msgid "SuperSonics|Please agree to the Subscription Agreement"
+msgstr ""
+
msgid "SuperSonics|Ready to get started? A GitLab plan is ideal for scaling organizations and for multi team usage."
msgstr ""
@@ -32527,6 +32993,9 @@ msgstr ""
msgid "SuperSonics|The activation code is not valid. Please make sure to copy it exactly from the Customers Portal or confirmation email. Learn more about %{linkStart}activating your subscription%{linkEnd}."
msgstr ""
+msgid "SuperSonics|The activation code should be a 24-character alphanumeric string"
+msgstr ""
+
msgid "SuperSonics|There is a connectivity issue."
msgstr ""
@@ -32569,9 +33038,15 @@ msgstr ""
msgid "SuperSonics|You do not have an active subscription"
msgstr ""
+msgid "SuperSonics|You have successfully added a license that activates on %{date}. Please see the subscription history table below for more details."
+msgstr ""
+
msgid "SuperSonics|You'll be charged for %{trueUpLinkStart}users over license%{trueUpLinkEnd} on a quarterly or annual basis, depending on the terms of your agreement."
msgstr ""
+msgid "SuperSonics|Your future dated license was successfully added"
+msgstr ""
+
msgid "SuperSonics|Your subscription"
msgstr ""
@@ -32824,7 +33299,7 @@ msgstr "Modèle"
msgid "Template to append to all Service Desk issues"
msgstr ""
-msgid "TemplateRepository|Select a repository to make its templates available to all projects. %{link_start}What should the repository contain?%{link_end} "
+msgid "TemplateRepository|Create common files more quickly, and standardize their format."
msgstr ""
msgid "Templates"
@@ -33030,7 +33505,7 @@ msgstr ""
msgid "TestCases|Search test cases"
msgstr ""
-msgid "TestCases|Something went wrong while adding test case to Todo."
+msgid "TestCases|Something went wrong while adding test case to a to-do item."
msgstr ""
msgid "TestCases|Something went wrong while creating a test case."
@@ -33042,7 +33517,7 @@ msgstr ""
msgid "TestCases|Something went wrong while fetching test cases list."
msgstr ""
-msgid "TestCases|Something went wrong while marking test case todo as done."
+msgid "TestCases|Something went wrong while marking test case to-do item as done."
msgstr ""
msgid "TestCases|Something went wrong while moving test case."
@@ -33162,7 +33637,7 @@ msgstr ""
msgid "Thanks for your purchase!"
msgstr ""
-msgid "That is ok, I do not want to renew"
+msgid "That's OK, I don't want to renew"
msgstr ""
msgid "That's it, well done!"
@@ -33185,7 +33660,7 @@ msgid_plural "The %{type} contains the following errors:"
msgstr[0] ""
msgstr[1] ""
-msgid "The API key used by GitLab for accessing the Spam Check service endpoint"
+msgid "The API key used by GitLab for accessing the Spam Check service endpoint."
msgstr ""
msgid "The GitLab subscription service (customers.gitlab.com) is currently experiencing an outage. You can monitor the status and get updates at %{linkStart}status.gitlab.com%{linkEnd}."
@@ -33224,9 +33699,6 @@ msgstr ""
msgid "The URL to use for connecting to Elasticsearch. Use a comma-separated list to support clustering (e.g., \"http://localhost:9200, http://localhost:9201\")."
msgstr ""
-msgid "The Vulnerability Report shows the results of the last successful pipeline run on the default branch."
-msgstr ""
-
msgid "The X509 Certificate to use when mutual TLS is required to communicate with the external authorization service. If left blank, the server certificate is still validated when accessing over HTTPS."
msgstr "Le certificat X.509 à utiliser lorsque l’authentification TLS mutuelle est requise pour communiquer avec le service d’autorisation externe. Si ce champ est vide, le certificat du serveur est tout de même validé lors de l’accès via HTTPS."
@@ -33284,9 +33756,6 @@ msgstr ""
msgid "The default branch for this project has been changed. Please update your bookmarks."
msgstr ""
-msgid "The default expiration time for job artifacts. 0 for unlimited. The default unit is in seconds, but you can use other units, for example %{code_open}4 mins 2 sec%{code_close}, %{code_open}2h42min%{code_close}."
-msgstr ""
-
msgid "The dependency list details information about the components used within your project."
msgstr ""
@@ -33478,9 +33947,6 @@ msgstr ""
msgid "The merge conflicts for this merge request have already been resolved. Please return to the merge request."
msgstr ""
-msgid "The merge request can now be merged."
-msgstr ""
-
msgid "The metric must be one of %{metrics}."
msgstr ""
@@ -33856,7 +34322,7 @@ msgstr ""
msgid "There was a problem updating the keep latest artifacts setting."
msgstr ""
-msgid "There was an error %{message} todo."
+msgid "There was an error %{message} to-do item."
msgstr ""
msgid "There was an error adding a To Do."
@@ -33895,6 +34361,9 @@ msgstr ""
msgid "There was an error fetching projects"
msgstr ""
+msgid "There was an error fetching search autocomplete suggestions"
+msgstr ""
+
msgid "There was an error fetching stage total counts"
msgstr ""
@@ -34219,6 +34688,9 @@ msgstr ""
msgid "This field is required."
msgstr ""
+msgid "This form is disabled in preview"
+msgstr ""
+
msgid "This group"
msgstr "Ce groupe"
@@ -34240,9 +34712,6 @@ msgstr ""
msgid "This group is linked to a subscription"
msgstr ""
-msgid "This group, including all subgroups, projects and git repositories, will be reachable from only the specified IP address ranges."
-msgstr ""
-
msgid "This group, its subgroups and projects has been scheduled for removal on %{date}."
msgstr ""
@@ -34522,9 +34991,6 @@ msgstr ""
msgid "This user cannot be unlocked manually from GitLab"
msgstr ""
-msgid "This user does not have a pending request"
-msgstr ""
-
msgid "This user has an unconfirmed email address (%{email}). You may force a confirmation."
msgstr ""
@@ -34633,9 +35099,6 @@ msgstr ""
msgid "ThreatMonitoring|Packet Activity"
msgstr ""
-msgid "ThreatMonitoring|Policies"
-msgstr ""
-
msgid "ThreatMonitoring|Requests"
msgstr ""
@@ -34687,6 +35150,12 @@ msgstr ""
msgid "ThreatMonitoring|View documentation"
msgstr ""
+msgid "Threshold in bytes at which to compress Sidekiq job arguments."
+msgstr ""
+
+msgid "Threshold in bytes at which to reject Sidekiq jobs. Set this to 0 to if you don't want to limit Sidekiq jobs."
+msgstr ""
+
msgid "Throughput"
msgstr ""
@@ -34696,6 +35165,9 @@ msgstr ""
msgid "Time"
msgstr ""
+msgid "Time (in hours) that users are allowed to skip forced configuration of two-factor authentication."
+msgstr ""
+
msgid "Time Spent"
msgstr ""
@@ -34762,7 +35234,7 @@ msgstr ""
msgid "TimeTrackingEstimated|Est"
msgstr "Est"
-msgid "TimeTracking|%{startTag}Spent: %{endTag}%{timeSpentHumanReadable}"
+msgid "TimeTracking|%{spentStart}Spent: %{spentEnd}"
msgstr ""
msgid "TimeTracking|Estimated:"
@@ -34976,6 +35448,9 @@ msgstr ""
msgid "To access this domain create a new DNS record"
msgstr ""
+msgid "To add a custom suffix, set up a Service Desk email address. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "To add an SSH key you need to %{generate_link_start}generate one%{link_end} or use an %{existing_link_start}existing key%{link_end}."
msgstr "Afin d’ajouter une clef SSH, vous devez soit %{generate_link_start}en génèrer une%{link_end}, soit utiliser une %{existing_link_start}clef existante%{link_end}."
@@ -34997,13 +35472,16 @@ msgstr "Afin de connecter des dépôts GitHub, vous devez d’abord autoriser Gi
msgid "To connect an SVN repository, check out %{svn_link}."
msgstr "Pour connecter un dépôt SVN, veuillez consulter %{svn_link}."
+msgid "To continue using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
+msgstr ""
+
msgid "To continue, you need to select the link in the confirmation email we sent to verify your email address. If you didn't get our email, select %{strongStart}Resend confirmation email.%{strongEnd}"
msgstr ""
msgid "To define internal users, first enable new users set to external"
msgstr "Afin de définir les utilisateurs internes, veuillez d’abord activer les nouveaux utilisateurs définis comme externes"
-msgid "To enable Registration Features, make sure \"Enable service ping\" is checked."
+msgid "To enable Registration Features, first enable Service Ping."
msgstr ""
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
@@ -35030,8 +35508,8 @@ msgstr "Pour commencer, entrez l’URL de votre hôte Gitea et un %{link_to_pers
msgid "To get started, use the link below to confirm your account."
msgstr ""
-msgid "To help improve GitLab and its user experience, GitLab will periodically collect usage information."
-msgstr "Afin d’aider à améliorer GitLab et son expérience utilisateur, GitLab va recueillir périodiquement des informations sur son utilisation."
+msgid "To help improve GitLab and its user experience, GitLab periodically collects usage information."
+msgstr ""
msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
msgstr ""
@@ -35063,7 +35541,7 @@ msgstr ""
msgid "To preserve performance only %{strong_open}%{display_size} of %{real_size}%{strong_close} files are displayed."
msgstr ""
-msgid "To protect this issue's confidentiality, %{forkLink} and set the fork's visibility to private."
+msgid "To protect this issue's confidentiality, %{linkStart}fork this project%{linkEnd} and set the fork's visibility to private."
msgstr ""
msgid "To protect this issue's confidentiality, a private fork of this project was selected."
@@ -35096,12 +35574,15 @@ msgstr ""
msgid "To set up SAML authentication for your group through an identity provider like Azure, Okta, Onelogin, Ping Identity, or your custom SAML 2.0 provider:"
msgstr "Pour configurer l’authentification SAML pour votre groupe via un fournisseur d’identité tel qu’Azure, Okta, Onelogin, Ping Identity ou votre fournisseur SAML 2.0 personnalisé :"
-msgid "To set up this service:"
+msgid "To set up this integration:"
msgstr ""
msgid "To specify the notification level per project of a group you belong to, you need to visit project page and change notification level there."
msgstr ""
+msgid "To start using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
+msgstr ""
+
msgid "To unsubscribe from this issue, please paste the following link into your browser:"
msgstr ""
@@ -35689,9 +36170,6 @@ msgstr ""
msgid "Unable to fetch branches list, please close the form and try again"
msgstr ""
-msgid "Unable to fetch unscanned projects"
-msgstr ""
-
msgid "Unable to fetch vulnerable projects"
msgstr ""
@@ -35746,6 +36224,15 @@ msgstr "Impossible de mettre à jour cette épopée pour le moment."
msgid "Unable to update this issue at this time."
msgstr ""
+msgid "Unapprove a merge request"
+msgstr ""
+
+msgid "Unapprove the current merge request."
+msgstr ""
+
+msgid "Unapproved the current merge request."
+msgstr ""
+
msgid "Unarchive project"
msgstr ""
@@ -35758,16 +36245,13 @@ msgstr ""
msgid "Unassigned"
msgstr ""
-msgid "Unauthenticated API request rate limit"
-msgstr ""
-
-msgid "Unauthenticated rate limit period in seconds"
+msgid "Unauthenticated API rate limit period in seconds"
msgstr ""
-msgid "Unauthenticated request rate limit"
+msgid "Unauthenticated requests"
msgstr ""
-msgid "Unauthenticated requests"
+msgid "Unauthenticated web rate limit period in seconds"
msgstr ""
msgid "Undo"
@@ -35869,18 +36353,6 @@ msgstr ""
msgid "Unresolved"
msgstr ""
-msgid "UnscannedProjects|15 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|30 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|5 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|60 or more days"
-msgstr ""
-
msgid "Unschedule job"
msgstr "Déprogrammer la tâche"
@@ -36100,6 +36572,9 @@ msgstr "Statistiques d’utilisation"
msgid "UsageQuota|%{help_link_start}Shared runners%{help_link_end} are disabled, so there are no limits set on pipeline usage"
msgstr ""
+msgid "UsageQuota|%{linkTitle} help link"
+msgstr ""
+
msgid "UsageQuota|%{percentageLeft} of purchased storage is available"
msgstr ""
@@ -36109,6 +36584,9 @@ msgstr ""
msgid "UsageQuota|Artifacts is a sum of build and pipeline artifacts."
msgstr ""
+msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
+msgstr ""
+
msgid "UsageQuota|Buy additional minutes"
msgstr ""
@@ -36118,9 +36596,21 @@ msgstr ""
msgid "UsageQuota|CI minutes usage by project"
msgstr ""
+msgid "UsageQuota|Code packages and container images."
+msgstr ""
+
msgid "UsageQuota|Current period usage"
msgstr ""
+msgid "UsageQuota|File attachments and smaller design graphics."
+msgstr ""
+
+msgid "UsageQuota|Git repository, managed by the Gitaly service."
+msgstr ""
+
+msgid "UsageQuota|Includes project registry, artifacts, packages, wiki, uploads and other items."
+msgstr ""
+
msgid "UsageQuota|Increase storage temporarily"
msgstr ""
@@ -36139,6 +36629,9 @@ msgstr ""
msgid "UsageQuota|Packages"
msgstr ""
+msgid "UsageQuota|Pipeline artifacts and job artifacts, created with CI/CD."
+msgstr ""
+
msgid "UsageQuota|Pipelines"
msgstr ""
@@ -36157,6 +36650,9 @@ msgstr ""
msgid "UsageQuota|Seats"
msgstr ""
+msgid "UsageQuota|Shared bits of code and text."
+msgstr ""
+
msgid "UsageQuota|Snippets"
msgstr ""
@@ -36166,6 +36662,12 @@ msgstr ""
msgid "UsageQuota|Storage"
msgstr ""
+msgid "UsageQuota|Storage type"
+msgstr ""
+
+msgid "UsageQuota|There is a known issue with Artifact storage where the total could be incorrect for some projects. More details and progress are available in %{warningLinkStart}the epic%{warningLinkEnd}."
+msgstr ""
+
msgid "UsageQuota|This is the total amount of storage used across your projects within this namespace."
msgstr ""
@@ -36205,6 +36707,9 @@ msgstr ""
msgid "UsageQuota|Usage"
msgstr ""
+msgid "UsageQuota|Usage Breakdown"
+msgstr ""
+
msgid "UsageQuota|Usage Quotas"
msgstr ""
@@ -36229,6 +36734,9 @@ msgstr ""
msgid "UsageQuota|Wiki"
msgstr ""
+msgid "UsageQuota|Wiki content."
+msgstr ""
+
msgid "UsageQuota|Wikis"
msgstr ""
@@ -36445,8 +36953,11 @@ msgstr ""
msgid "User Settings"
msgstr "Paramètres de l’utilisateur"
-msgid "User and IP Rate Limits"
-msgstr "Limites de l’utilisateur et du débit IP"
+msgid "User and IP rate limits"
+msgstr ""
+
+msgid "User does not have a pending request"
+msgstr ""
msgid "User identity was successfully created."
msgstr ""
@@ -36742,6 +37253,9 @@ msgstr "Utilisateurs et utilisatrices"
msgid "Users can launch a development environment from a GitLab browser tab when the %{linkStart}Gitpod%{linkEnd} integration is enabled."
msgstr ""
+msgid "Users can reactivate their account by signing in."
+msgstr ""
+
msgid "Users can render diagrams in AsciiDoc, Markdown, reStructuredText, and Textile documents using Kroki."
msgstr ""
@@ -36757,6 +37271,9 @@ msgstr ""
msgid "Users requesting access to"
msgstr ""
+msgid "Users to exclude from the rate limit"
+msgstr ""
+
msgid "Users were successfully added."
msgstr ""
@@ -36778,6 +37295,9 @@ msgstr ""
msgid "UsersSelect|Unassigned"
msgstr ""
+msgid "Uses GitLab as a lightweight alternative to Sentry."
+msgstr ""
+
msgid "Using %{code_start}::%{code_end} denotes a %{link_start}scoped label set%{link_end}"
msgstr ""
@@ -36808,10 +37328,7 @@ msgstr ""
msgid "Value Stream Analytics can help you determine your team’s velocity"
msgstr ""
-msgid "Value Stream Analytics gives an overview of how much time it takes to go from idea to production in your project."
-msgstr ""
-
-msgid "Value may contain a variable reference"
+msgid "Value might contain a variable reference"
msgstr ""
msgid "Value stream"
@@ -36877,10 +37394,10 @@ msgstr ""
msgid "ValueStream|The Default Value Stream cannot be deleted"
msgstr ""
-msgid "Variable"
+msgid "Values that contain the %{codeStart}$%{codeEnd} character can be considered a variable reference and expanded. %{docsLinkStart}Learn more.%{docsLinkEnd}"
msgstr ""
-msgid "Variable references indicated by %{codeStart}$%{codeEnd} may be expanded. If this is not what you want, consider %{docsLinkStart}using a workaround to prevent expansion%{docsLinkEnd}."
+msgid "Variable"
msgstr ""
msgid "Variable will be masked in job logs."
@@ -37285,6 +37802,9 @@ msgstr ""
msgid "Vulnerability|Evidence"
msgstr ""
+msgid "Vulnerability|False positive detected"
+msgstr ""
+
msgid "Vulnerability|File"
msgstr "Fichier"
@@ -37327,6 +37847,9 @@ msgstr "Gravité"
msgid "Vulnerability|Status"
msgstr ""
+msgid "Vulnerability|The scanner determined this vulnerability to be a false positive. Verify the evaluation before changing its status. %{linkStart}Learn more about false positive detection.%{linkEnd}"
+msgstr ""
+
msgid "Vulnerability|The unmodified response is the original response that had no mutations done to the request"
msgstr ""
@@ -37651,9 +38174,6 @@ msgstr ""
msgid "Welcome to GitLab,%{br_tag}%{name}!"
msgstr ""
-msgid "Welcome to the guided GitLab tour"
-msgstr ""
-
msgid "Welcome, %{name}!"
msgstr ""
@@ -37672,9 +38192,6 @@ msgstr ""
msgid "What are you searching for?"
msgstr ""
-msgid "What describes you best?"
-msgstr ""
-
msgid "What does this command do?"
msgstr ""
@@ -37696,13 +38213,13 @@ msgstr ""
msgid "What is your job title? (optional)"
msgstr ""
-msgid "What will you use this group for?"
+msgid "What templates can I create?"
msgstr ""
-msgid "What's new"
+msgid "What will you use this group for?"
msgstr ""
-msgid "What’s your experience level?"
+msgid "What's new"
msgstr ""
msgid "When a deployment job is successful, skip older deployment jobs that are still pending."
@@ -37714,6 +38231,9 @@ msgstr "Lorsqu’un exécuteur est verrouillé, il ne peut pas être affecté à
msgid "When an event in GitLab triggers a webhook, you can use the request details to figure out if something went wrong."
msgstr ""
+msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+msgstr ""
+
msgid "When inactive, an external authentication provider must be used."
msgstr ""
@@ -37737,6 +38257,9 @@ msgstr ""
msgid "When:"
msgstr ""
+msgid "Which API requests are affected?"
+msgstr ""
+
msgid "While it's rare to have no vulnerabilities, it can happen. In any event, we ask that you please double check your settings to make sure you've set up your dashboard correctly."
msgstr ""
@@ -38016,6 +38539,9 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|Work Items"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -38091,6 +38617,9 @@ msgstr ""
msgid "You are already a member of this %{member_source}."
msgstr ""
+msgid "You are already impersonating another user"
+msgstr ""
+
msgid "You are an admin, which means granting access to %{client_name} will allow them to interact with GitLab as an admin as well. Proceed with caution."
msgstr ""
@@ -38193,6 +38722,9 @@ msgstr ""
msgid "You can also use project access tokens with Git to authenticate over HTTP(S). %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "You can always change your URL later"
+msgstr ""
+
msgid "You can always edit this later"
msgstr ""
@@ -38349,10 +38881,10 @@ msgstr "Vous ne pouvez pas écrire sur cette instance GitLab en lecture seule."
msgid "You can’t %{tag_start}edit%{tag_end} files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
-msgid "You could not create a new trigger."
+msgid "You can’t edit files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
-msgid "You didn't renew your subscription for %{strong}%{namespace_name}%{strong_close} so it was downgraded to the free plan."
+msgid "You could not create a new trigger."
msgstr ""
msgid "You do not have any subscriptions yet"
@@ -38520,6 +39052,12 @@ msgstr ""
msgid "You must provide your current password in order to change it."
msgstr ""
+msgid "You must sign in to search for specific projects."
+msgstr ""
+
+msgid "You must sign in to search for specific terms."
+msgstr ""
+
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
@@ -38547,6 +39085,9 @@ msgstr ""
msgid "You need to upload a GitLab project export archive (ending in .gz)."
msgstr ""
+msgid "You need to verify your primary email first before enabling Two-Factor Authentication."
+msgstr ""
+
msgid "You successfully declined the invitation"
msgstr ""
@@ -38655,10 +39196,10 @@ msgstr ""
msgid "Your %{host} account was signed in to from a new location"
msgstr ""
-msgid "Your %{strong}%{plan_name}%{strong_close} subscription for %{strong}%{namespace_name}%{strong_close} will expire on %{strong}%{expires_on}%{strong_close}."
+msgid "Your %{strong}%{plan_name}%{strong_close} subscription expires on %{strong}%{expires_on}%{strong_close}. After that date, you cannot create issues or merge requests, or use many other features."
msgstr ""
-msgid "Your %{strong}%{plan_name}%{strong_close} subscription will expire on %{strong}%{expires_on}%{strong_close}. After that, you will not be able to create issues or merge requests as well as many other features."
+msgid "Your %{strong}%{plan_name}%{strong_close} subscription for %{strong}%{namespace_name}%{strong_close} will expire on %{strong}%{expires_on}%{strong_close}."
msgstr ""
msgid "Your CI/CD configuration syntax is invalid. View Lint tab for more details."
@@ -38682,7 +39223,7 @@ msgstr ""
msgid "Your GPG keys (%{count})"
msgstr ""
-msgid "Your GitLab account has been locked due to an excessive amount of unsuccessful sign in attempts. Your account will automatically unlock in %{duration} or you may click the link below to unlock now."
+msgid "Your GitLab account has been locked due to an excessive number of unsuccessful sign in attempts. You can wait for your account to automatically unlock in %{duration} or you can click the link below to unlock now."
msgstr ""
msgid "Your GitLab account request has been approved!"
@@ -38793,6 +39334,9 @@ msgstr ""
msgid "Your commit email is used for web based operations, such as edits and merges."
msgstr ""
+msgid "Your current password is required to register a two-factor authenticator app."
+msgstr ""
+
msgid "Your dashboard has been copied. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
@@ -38892,6 +39436,9 @@ msgstr ""
msgid "Your project limit is %{limit} projects! Please contact your administrator to increase it"
msgstr ""
+msgid "Your project will be created at:"
+msgstr ""
+
msgid "Your projects"
msgstr "Vos projets"
@@ -38931,11 +39478,10 @@ msgstr ""
msgid "Your subscription expired!"
msgstr ""
-msgid "Your subscription has been downgraded."
-msgstr ""
-
-msgid "Your subscription will expire in %{remaining_days}."
-msgstr ""
+msgid "Your subscription will expire in %{remaining_days} day."
+msgid_plural "Your subscription will expire in %{remaining_days} days."
+msgstr[0] ""
+msgstr[1] ""
msgid "Your username is %{username}."
msgstr ""
@@ -39142,6 +39688,9 @@ msgstr ""
msgid "cannot merge"
msgstr ""
+msgid "cannot not be used for user namespace"
+msgstr ""
+
msgid "ciReport|%{degradedNum} degraded"
msgstr ""
@@ -39465,6 +40014,9 @@ msgstr ""
msgid "created %{timeAgo}"
msgstr ""
+msgid "created %{timeAgo} by %{author}"
+msgstr ""
+
msgid "created by"
msgstr ""
@@ -39509,9 +40061,6 @@ msgstr ""
msgid "does not have a supported extension. Only %{extension_list} are supported"
msgstr ""
-msgid "domain is not authorized for sign-up."
-msgstr ""
-
msgid "download it"
msgstr ""
@@ -39529,18 +40078,13 @@ msgstr ""
msgid "email '%{email}' is not a verified email."
msgstr ""
-msgid "email does not match the allowed domain of %{email_domains}"
-msgid_plural "email does not match the allowed domains: %{email_domains}"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "enabled"
msgstr "activé"
msgid "encrypted: needs to be a :required, :optional or :migrating!"
msgstr ""
-msgid "ending with MIME type format is not allowed."
+msgid "ending with a reserved file extension is not allowed."
msgstr ""
msgid "entries cannot be larger than 255 characters"
@@ -39564,6 +40108,9 @@ msgstr ""
msgid "estimateCommand|%{slash_command} overwrites the total estimated time."
msgstr ""
+msgid "example.com"
+msgstr ""
+
msgid "exceeds the limit of %{bytes} bytes"
msgstr ""
@@ -39614,9 +40161,6 @@ msgstr "pour ce projet"
msgid "fork"
msgstr ""
-msgid "fork this project"
-msgstr ""
-
msgid "from"
msgstr "de"
@@ -39625,6 +40169,9 @@ msgid_plural "from %d jobs"
msgstr[0] ""
msgstr[1] ""
+msgid "frontmatter"
+msgstr ""
+
msgid "group"
msgstr ""
@@ -39652,6 +40199,9 @@ msgstr ""
msgid "has been completed."
msgstr ""
+msgid "has too deep level of nesting"
+msgstr ""
+
msgid "help"
msgstr ""
@@ -39685,9 +40235,21 @@ msgstr "flux d’importation"
msgid "in"
msgstr ""
+msgid "in Infrastructure :: Kubernetes clusters"
+msgstr ""
+
+msgid "in all GitLab"
+msgstr ""
+
+msgid "in group"
+msgstr ""
+
msgid "in group %{link_to_group}"
msgstr ""
+msgid "in project"
+msgstr ""
+
msgid "in project %{link_to_project}"
msgstr ""
@@ -39729,16 +40291,19 @@ msgstr ""
msgid "is not a valid X509 certificate."
msgstr "n’est pas un certificat X.509 valide."
-msgid "is not allowed since the group is not top-level group."
+msgid "is not allowed for sign-up."
msgstr ""
-msgid "is not allowed. Try again with a different email address, or contact your GitLab admin."
+msgid "is not allowed for this group."
msgstr ""
-msgid "is not allowed. We do not currently support project-level iterations"
+msgid "is not allowed for this project."
+msgstr ""
+
+msgid "is not allowed since the group is not top-level group."
msgstr ""
-msgid "is not from an allowed domain."
+msgid "is not allowed. We do not currently support project-level iterations"
msgstr ""
msgid "is not in the group enforcing Group Managed Account"
@@ -39831,6 +40396,9 @@ msgstr "verrouillé par %{path_lock_user_name} %{created_at}"
msgid "log in"
msgstr ""
+msgid "managed"
+msgstr ""
+
msgid "manual"
msgstr ""
@@ -39878,6 +40446,9 @@ msgstr ""
msgid "mrWidget| Please restore it or use a different %{missingBranchName} branch"
msgstr "Veuillez la restaurer ou utiliser une autre branche %{missingBranchName}"
+msgid "mrWidget|%{linkStart}Set up now%{linkEnd} to analyze your source code for known security vulnerabilities."
+msgstr ""
+
msgid "mrWidget|%{mergeError}."
msgstr ""
@@ -39958,6 +40529,9 @@ msgid_plural "mrWidget|Closes issues"
msgstr[0] ""
msgstr[1] ""
+msgid "mrWidget|Create issue to resolve all threads"
+msgstr ""
+
msgid "mrWidget|Delete source branch"
msgstr ""
@@ -39967,12 +40541,18 @@ msgstr "Les statistiques de déploiement ne sont pas disponibles pour le moment"
msgid "mrWidget|Did not close"
msgstr "N’a pas résolu"
+msgid "mrWidget|Dismiss"
+msgstr ""
+
msgid "mrWidget|Email patches"
msgstr "Patchs par courriel"
msgid "mrWidget|Failed to load deployment statistics"
msgstr "Impossible de charger les statistiques de déploiement"
+msgid "mrWidget|Hide %{widget} details"
+msgstr ""
+
msgid "mrWidget|If the %{missingBranchName} branch exists in your local repository, you can merge this merge request manually using the command line"
msgstr "Si la branche %{missingBranchName} existe dans votre dépôt local, vous pouvez fusionner cette demande de fusion manuellement en ligne de commande"
@@ -40068,9 +40648,6 @@ msgstr ""
msgid "mrWidget|Request to merge"
msgstr "Demande de fusion de"
-msgid "mrWidget|Resolve all threads in new issue"
-msgstr ""
-
msgid "mrWidget|Resolve conflicts"
msgstr "Résoudre les conflits"
@@ -40086,6 +40663,9 @@ msgstr "Défaire cette demande de fusion dans une nouvelle demande de fusion"
msgid "mrWidget|Revoke approval"
msgstr ""
+msgid "mrWidget|SAST and Secret Detection is not enabled."
+msgstr ""
+
msgid "mrWidget|Set by %{merge_author} to be added to the merge train when the pipeline succeeds"
msgstr ""
@@ -40095,6 +40675,9 @@ msgstr ""
msgid "mrWidget|Set by %{merge_author} to start a merge train when the pipeline succeeds"
msgstr ""
+msgid "mrWidget|Show %{widget} details"
+msgstr ""
+
msgid "mrWidget|The changes were merged into"
msgstr "Les modifications ont été fusionnées dans"
@@ -40107,6 +40690,9 @@ msgstr "Les modifications seront fusionnées dans"
msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure, or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
msgstr ""
+msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure."
+msgstr ""
+
msgid "mrWidget|The source branch has been deleted"
msgstr ""
@@ -40149,6 +40735,9 @@ msgstr ""
msgid "mrWidget|You can merge after removing denied licenses"
msgstr ""
+msgid "mrWidget|You can only merge once this merge request is approved."
+msgstr ""
+
msgid "mrWidget|Your password"
msgstr ""
@@ -40185,6 +40774,9 @@ msgstr ""
msgid "must be less than the limit of %{tag_limit} tags"
msgstr ""
+msgid "must be set for a project namespace"
+msgstr ""
+
msgid "must be unique by status and elapsed time within a policy"
msgstr ""
@@ -40294,6 +40886,9 @@ msgstr ""
msgid "pipeline"
msgstr ""
+msgid "pipeline schedules documentation"
+msgstr ""
+
msgid "pod_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
msgstr ""
@@ -40343,16 +40938,25 @@ msgstr ""
msgid "project name"
msgstr ""
+msgid "project namespace cannot be the parent of another namespace"
+msgstr ""
+
msgid "projects"
msgstr ""
msgid "quick actions"
msgstr ""
-msgid "reCAPTCHA Private Key"
+msgid "reCAPTCHA"
+msgstr ""
+
+msgid "reCAPTCHA helps prevent credential stuffing."
msgstr ""
-msgid "reCAPTCHA Site Key"
+msgid "reCAPTCHA private key"
+msgstr ""
+
+msgid "reCAPTCHA site key"
msgstr ""
msgid "recent activity"
@@ -40579,6 +41183,9 @@ msgstr ""
msgid "user avatar"
msgstr ""
+msgid "user namespace cannot be the parent of another namespace"
+msgstr ""
+
msgid "user preferences"
msgstr ""
@@ -40671,3 +41278,9 @@ msgstr ""
msgid "your settings"
msgstr ""
+msgid "{group}"
+msgstr ""
+
+msgid "{project}"
+msgstr ""
+
diff --git a/locale/gitlab.pot b/locale/gitlab.pot
index 03a26c01cd5..7d758ceca88 100644
--- a/locale/gitlab.pot
+++ b/locale/gitlab.pot
@@ -16,9 +16,6 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"
-msgid " %{name}, confirm your email address now! "
-msgstr ""
-
msgid " %{start} to %{end}"
msgstr ""
@@ -43,25 +40,12 @@ msgstr ""
msgid " You need to do this before %{grace_period_deadline}."
msgstr ""
-msgid " and"
-msgstr ""
-
msgid " and "
msgstr ""
msgid " and %{sliced}"
msgstr ""
-msgid " degraded on %d point"
-msgid_plural " degraded on %d points"
-msgstr[0] ""
-msgstr[1] ""
-
-msgid " improved on %d point"
-msgid_plural " improved on %d points"
-msgstr[0] ""
-msgstr[1] ""
-
msgid " or "
msgstr ""
@@ -89,6 +73,9 @@ msgstr ""
msgid "\"el\" parameter is required for createInstance()"
msgstr ""
+msgid "#%{issueIid} (closed)"
+msgstr ""
+
msgid "#general, #development"
msgstr ""
@@ -197,9 +184,6 @@ msgid_plural "%d commits,"
msgstr[0] ""
msgstr[1] ""
-msgid "%d commits"
-msgstr ""
-
msgid "%d completed issue"
msgid_plural "%d completed issues"
msgstr[0] ""
@@ -465,7 +449,10 @@ msgstr ""
msgid "%{code_open}Protected:%{code_close} Only exposed to protected branches or tags."
msgstr ""
-msgid "%{commit_author_link} authored %{commit_timeago}"
+msgid "%{commit_author_link} authored %{commit_authored_timeago}"
+msgstr ""
+
+msgid "%{commit_author_link} authored %{commit_authored_timeago} and %{commit_committer_avatar} %{commit_committer_link} committed %{commit_committer_timeago}"
msgstr ""
msgid "%{completedCount} completed weight"
@@ -562,6 +549,12 @@ msgstr ""
msgid "%{docs_link_start}Learn about visibility levels.%{docs_link_end}"
msgstr ""
+msgid "%{docs_link_start}What is Large File Storage?%{docs_link_end}"
+msgstr ""
+
+msgid "%{docs_link_start}What is two-factor authentication?%{docs_link_end}"
+msgstr ""
+
msgid "%{due_date} (Past due)"
msgstr ""
@@ -691,6 +684,12 @@ msgstr ""
msgid "%{label_for_message} unavailable"
msgstr ""
+msgid "%{learn_more_link}."
+msgstr ""
+
+msgid "%{lessThan} 1 hour"
+msgstr ""
+
msgid "%{lets_encrypt_link_start}Let's Encrypt%{lets_encrypt_link_end} is a free, automated, and open certificate authority (CA) that issues digital certificates to enable HTTPS (SSL/TLS) for sites."
msgstr ""
@@ -703,15 +702,15 @@ msgstr ""
msgid "%{link_start}Learn more%{link_end} about roles."
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
-msgstr ""
-
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
msgstr ""
msgid "%{link_start}Start the title with %{draft_snippet}%{link_end} to prevent a merge request that is a work in progress from being merged before it's ready."
msgstr ""
+msgid "%{link_start}What information does GitLab Inc. collect?%{link_end}"
+msgstr ""
+
msgid "%{listToShow}, and %{awardsListLength} more"
msgstr ""
@@ -864,7 +863,7 @@ msgid_plural "%{securityScanner} results are not available because a pipeline ha
msgstr[0] ""
msgstr[1] ""
-msgid "%{service_ping_link_start}Learn more%{service_ping_link_end} about what information is shared with GitLab Inc."
+msgid "%{service_ping_link_start}What information is shared with GitLab Inc.?%{service_ping_link_end}"
msgstr ""
msgid "%{size} %{unit}"
@@ -962,11 +961,6 @@ msgstr ""
msgid "%{template_project_id} is unknown or invalid"
msgstr ""
-msgid "%{text} %{files}"
-msgid_plural "%{text} %{files} files"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%{text} is available"
msgstr ""
@@ -1048,10 +1042,10 @@ msgstr ""
msgid "%{webhooks_link_start}%{webhook_type}%{link_end} enable you to send notifications to web applications in response to events in a group or project. We recommend using an %{integrations_link_start}integration%{link_end} in preference to a webhook."
msgstr ""
-msgid "%{wildcards_link_start}Wildcards%{wildcards_link_end} such as %{code_tag_start}v*%{code_tag_end} or %{code_tag_start}*-release%{code_tag_end} are supported."
+msgid "%{widget} options"
msgstr ""
-msgid "&lt; 1 hour"
+msgid "%{wildcards_link_start}Wildcards%{wildcards_link_end} such as %{code_tag_start}v*%{code_tag_end} or %{code_tag_start}*-release%{code_tag_end} are supported."
msgstr ""
msgid "'%{data}' at %{location} does not match format: %{format}"
@@ -1134,10 +1128,10 @@ msgstr ""
msgid "(revoked)"
msgstr ""
-msgid "(we need your current password to confirm your changes)"
+msgid "(target)"
msgstr ""
-msgid "* * * * *"
+msgid "(we need your current password to confirm your changes)"
msgstr ""
msgid "+ %{amount} more"
@@ -1192,6 +1186,9 @@ msgstr[1] ""
msgid "- Not available to run jobs."
msgstr ""
+msgid "- Select -"
+msgstr ""
+
msgid "- User"
msgid_plural "- Users"
msgstr[0] ""
@@ -1212,9 +1209,6 @@ msgstr ""
msgid "0 bytes"
msgstr ""
-msgid "0 for unlimited, only effective with remote storage enabled."
-msgstr ""
-
msgid "0t1DgySidms"
msgstr ""
@@ -1342,6 +1336,9 @@ msgstr ""
msgid "1000+"
msgstr ""
+msgid "192.168.0.0/24"
+msgstr ""
+
msgid "1st contribution!"
msgstr ""
@@ -1438,9 +1435,6 @@ msgstr ""
msgid "A deleted user"
msgstr ""
-msgid "A description is required"
-msgstr ""
-
msgid "A different reason"
msgstr ""
@@ -1690,9 +1684,6 @@ msgstr ""
msgid "Abuse reports notification email"
msgstr ""
-msgid "Abuse reports will be sent to this address if it is set. Abuse reports are always available in the admin area."
-msgstr ""
-
msgid "Accept invitation"
msgstr ""
@@ -1933,9 +1924,6 @@ msgstr ""
msgid "Add a general comment to this %{noteableDisplayName}."
msgstr ""
-msgid "Add a general comment to this %{noteable_name}."
-msgstr ""
-
msgid "Add a homepage to your wiki that contains information about your project and GitLab will display it here instead of this message."
msgstr ""
@@ -2014,9 +2002,6 @@ msgstr ""
msgid "Add deploy keys to grant read/write access to this repository. %{link_start}What are deploy keys?%{link_end}"
msgstr ""
-msgid "Add domain"
-msgstr ""
-
msgid "Add email address"
msgstr ""
@@ -2053,6 +2038,9 @@ msgstr ""
msgid "Add new directory"
msgstr ""
+msgid "Add new service account"
+msgstr ""
+
msgid "Add or remove previously merged commits"
msgstr ""
@@ -2107,6 +2095,9 @@ msgstr ""
msgid "Add to tree"
msgstr ""
+msgid "Add topics to projects to help users find them."
+msgstr ""
+
msgid "Add trigger"
msgstr ""
@@ -2290,6 +2281,9 @@ msgstr ""
msgid "AdminArea|Features"
msgstr ""
+msgid "AdminArea|Get security updates from GitLab and stay up to date"
+msgstr ""
+
msgid "AdminArea|Groups"
msgstr ""
@@ -2329,6 +2323,12 @@ msgstr ""
msgid "AdminArea|Reporter"
msgstr ""
+msgid "AdminArea|Sign up for the GitLab Security Newsletter to get notified for security updates."
+msgstr ""
+
+msgid "AdminArea|Sign up for the GitLab newsletter"
+msgstr ""
+
msgid "AdminArea|Stop all jobs"
msgstr ""
@@ -2398,9 +2398,15 @@ msgstr ""
msgid "AdminSettings|Disable public access to Pages sites"
msgstr ""
+msgid "AdminSettings|Display a banner on merge requests in projects with no pipelines to initiate steps to add a .gitlab-ci.yml file."
+msgstr ""
+
msgid "AdminSettings|Domain verification is an essential security measure for public GitLab sites. Users are required to demonstrate they control a domain before it is enabled. %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "AdminSettings|Enable pipeline suggestion banner"
+msgstr ""
+
msgid "AdminSettings|Enable shared runners for new projects"
msgstr ""
@@ -2548,7 +2554,7 @@ msgstr ""
msgid "AdminUsers|Admin"
msgstr ""
-msgid "AdminUsers|Administrators have access to all groups, projects and users and can manage all features in this installation"
+msgid "AdminUsers|Administrators have access to all groups, projects and users and can manage all features in this installation."
msgstr ""
msgid "AdminUsers|Admins"
@@ -2563,6 +2569,12 @@ msgstr ""
msgid "AdminUsers|Approved users can:"
msgstr ""
+msgid "AdminUsers|Auditor"
+msgstr ""
+
+msgid "AdminUsers|Auditors have read-only access to all groups, projects, and users."
+msgstr ""
+
msgid "AdminUsers|Automatically marked as default internal user"
msgstr ""
@@ -2698,7 +2710,7 @@ msgstr ""
msgid "AdminUsers|Regular"
msgstr ""
-msgid "AdminUsers|Regular users have access to their groups and projects"
+msgid "AdminUsers|Regular users have access to their groups and projects."
msgstr ""
msgid "AdminUsers|Reject"
@@ -2896,9 +2908,6 @@ msgstr ""
msgid "Advanced export options"
msgstr ""
-msgid "Advanced permissions, Large File Storage and Two-Factor authentication settings."
-msgstr ""
-
msgid "After a successful password update you will be redirected to login screen."
msgstr ""
@@ -2917,9 +2926,15 @@ msgstr ""
msgid "After you've reviewed these contribution guidelines, you'll be all set to"
msgstr ""
+msgid "Akismet"
+msgstr ""
+
msgid "Akismet API Key"
msgstr ""
+msgid "Akismet helps prevent the creation of spam issues in public projects."
+msgstr ""
+
msgid "AlertManagement|Acknowledged"
msgstr ""
@@ -3328,6 +3343,9 @@ msgstr ""
msgid "All users must have a name."
msgstr ""
+msgid "All users with matching cards"
+msgstr ""
+
msgid "Allow \"%{group_name}\" to sign you in"
msgstr ""
@@ -3391,6 +3409,9 @@ msgstr ""
msgid "Allow this secondary node to replicate content on Object Storage"
msgstr ""
+msgid "Allow use of licensed EE features"
+msgstr ""
+
msgid "Allow users to dismiss the broadcast message"
msgstr ""
@@ -3466,9 +3487,6 @@ msgstr ""
msgid "Amazon authentication is not %{link_start}correctly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
-msgid "Amount of time (in hours) that users are allowed to skip forced configuration of two-factor authentication"
-msgstr ""
-
msgid "An %{link_start}alert%{link_end} with the same fingerprint is already open. To change the status of this alert, resolve the linked alert."
msgstr ""
@@ -3577,6 +3595,9 @@ msgstr ""
msgid "An error occurred while enabling Service Desk."
msgstr ""
+msgid "An error occurred while fetching Markdown preview"
+msgstr ""
+
msgid "An error occurred while fetching ancestors"
msgstr ""
@@ -3586,6 +3607,9 @@ msgstr ""
msgid "An error occurred while fetching codequality mr diff reports."
msgstr ""
+msgid "An error occurred while fetching commit data."
+msgstr ""
+
msgid "An error occurred while fetching commits. Retry the search."
msgstr ""
@@ -3607,9 +3631,6 @@ msgstr ""
msgid "An error occurred while fetching label colors."
msgstr ""
-msgid "An error occurred while fetching markdown preview"
-msgstr ""
-
msgid "An error occurred while fetching participants"
msgstr ""
@@ -3700,6 +3721,9 @@ msgstr ""
msgid "An error occurred while loading merge requests."
msgstr ""
+msgid "An error occurred while loading projects."
+msgstr ""
+
msgid "An error occurred while loading the Needs tab."
msgstr ""
@@ -3790,6 +3814,11 @@ msgstr ""
msgid "An error occurred while saving changes: %{error}"
msgstr ""
+msgid "An error occurred while saving the setting"
+msgid_plural "An error occurred while saving the settings"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "An error occurred while subscribing to notifications."
msgstr ""
@@ -3853,9 +3882,6 @@ msgstr ""
msgid "An example showing how to use Jsonnet with GitLab dynamic child pipelines"
msgstr ""
-msgid "An instance-level serverless domain already exists."
-msgstr ""
-
msgid "An issue already exists"
msgstr ""
@@ -3934,12 +3960,6 @@ msgstr ""
msgid "Any Milestone"
msgstr ""
-msgid "Any branch"
-msgstr ""
-
-msgid "Any eligible user"
-msgstr ""
-
msgid "Any encrypted tokens"
msgstr ""
@@ -3958,6 +3978,9 @@ msgstr ""
msgid "Any namespace"
msgstr ""
+msgid "App Engine description and apps that are suitable for this deployment target"
+msgstr ""
+
msgid "App ID"
msgstr ""
@@ -4106,6 +4129,11 @@ msgstr ""
msgid "Apply"
msgstr ""
+msgid "Apply %d suggestion"
+msgid_plural "Apply %d suggestions"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Apply a label"
msgstr ""
@@ -4115,13 +4143,10 @@ msgstr ""
msgid "Apply suggestion"
msgstr ""
-msgid "Apply suggestions"
-msgstr ""
-
msgid "Apply template"
msgstr ""
-msgid "Apply this approval rule to any branch or a specific protected branch."
+msgid "Apply this approval rule to all branches or a specific protected branch."
msgstr ""
msgid "Applying"
@@ -4264,9 +4289,6 @@ msgstr ""
msgid "ApprovalSettings|Prevent editing approval rules in projects and merge requests."
msgstr ""
-msgid "ApprovalSettings|Prevent editing approval rules in projects and merge requests. "
-msgstr ""
-
msgid "ApprovalSettings|Remove all approvals when commits are added to the source branch."
msgstr ""
@@ -4282,6 +4304,9 @@ msgstr ""
msgid "ApprovalSettings|This setting is configured at the instance level and can only be changed by an administrator."
msgstr ""
+msgid "ApprovalSettings|This setting is configured in %{groupName} and can only be changed by an administrator or group owner."
+msgstr ""
+
msgid "ApprovalStatusTooltip|Adheres to separation of duties"
msgstr ""
@@ -4762,13 +4787,13 @@ msgstr ""
msgid "Authenticate"
msgstr ""
-msgid "Authenticate with GitHub"
+msgid "Authenticate user SSH keys without requiring additional configuration. Performance of GitLab can be improved by using the GitLab database instead."
msgstr ""
-msgid "Authenticated API rate limit period in seconds"
+msgid "Authenticate with GitHub"
msgstr ""
-msgid "Authenticated API request rate limit"
+msgid "Authenticated API rate limit period in seconds"
msgstr ""
msgid "Authenticated API requests"
@@ -4780,6 +4805,9 @@ msgstr ""
msgid "Authenticated Git LFS request rate limit"
msgstr ""
+msgid "Authenticated Git LFS requests"
+msgstr ""
+
msgid "Authenticated web rate limit period in seconds"
msgstr ""
@@ -5158,9 +5186,6 @@ msgstr ""
msgid "Below you will find all the groups that are public."
msgstr ""
-msgid "Beta"
-msgstr ""
-
msgid "Bi-weekly code coverage"
msgstr ""
@@ -5749,6 +5774,9 @@ msgstr ""
msgid "Branches|To discard the local changes and overwrite the branch with the upstream version, delete it here and choose 'Update Now' above."
msgstr ""
+msgid "Branches|Unable to load branches"
+msgstr ""
+
msgid "Branches|Yes, delete branch"
msgstr ""
@@ -5839,6 +5867,9 @@ msgstr ""
msgid "BulkImport|From source group"
msgstr ""
+msgid "BulkImport|Group import history"
+msgstr ""
+
msgid "BulkImport|Import failed: Destination cannot be a subgroup of the source group. Change the destination and try again."
msgstr ""
@@ -5857,6 +5888,12 @@ msgstr ""
msgid "BulkImport|Name already exists."
msgstr ""
+msgid "BulkImport|New group"
+msgstr ""
+
+msgid "BulkImport|No history is available"
+msgstr ""
+
msgid "BulkImport|No parent"
msgstr ""
@@ -5869,6 +5906,9 @@ msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} matching filter \"%{filter}\" from %{link}"
msgstr ""
+msgid "BulkImport|Source group"
+msgstr ""
+
msgid "BulkImport|To new group"
msgstr ""
@@ -5878,6 +5918,9 @@ msgstr ""
msgid "BulkImport|You have no groups to import"
msgstr ""
+msgid "BulkImport|Your imported groups will appear here."
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -5941,9 +5984,6 @@ msgstr ""
msgid "CI configuration validated, including all configuration added with the %{codeStart}includes%{codeEnd} keyword. %{link}"
msgstr ""
-msgid "CI minutes"
-msgstr ""
-
msgid "CI settings"
msgstr ""
@@ -6120,6 +6160,9 @@ msgstr ""
msgid "Can be manually deployed to"
msgstr ""
+msgid "Can be overridden in each project."
+msgstr ""
+
msgid "Can create groups:"
msgstr ""
@@ -6225,9 +6268,6 @@ msgstr ""
msgid "Cannot assign a confidential epic to a non-confidential issue. Make the issue confidential and try again"
msgstr ""
-msgid "Cannot be assigned to other projects."
-msgstr ""
-
msgid "Cannot be merged automatically"
msgstr ""
@@ -6285,6 +6325,9 @@ msgstr ""
msgid "Capacity threshold"
msgstr ""
+msgid "Card number:"
+msgstr ""
+
msgid "CascadingSettings|Enforce for all subgroups"
msgstr ""
@@ -6513,15 +6556,15 @@ msgstr ""
msgid "Check out, review, and merge locally"
msgstr ""
-msgid "Check the %{docs_link_start}documentation%{docs_link_end}."
-msgstr ""
-
msgid "Check the current instance configuration "
msgstr ""
msgid "Check the elasticsearch.log file to debug why the migration was halted and make any changes before retrying the migration. When you fix the cause of the failure, click \"Retry migration\", and the migration will be scheduled to be retried in the background."
msgstr ""
+msgid "Check with your administrator."
+msgstr ""
+
msgid "Check your Docker images for known vulnerabilities."
msgstr ""
@@ -6552,6 +6595,9 @@ msgstr ""
msgid "Checkout"
msgstr ""
+msgid "Checkout|$%{selectedPlanPrice} per 10 GB storage per pack"
+msgstr ""
+
msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 minutes"
msgstr ""
@@ -6572,17 +6618,23 @@ msgstr ""
msgid "Checkout|%{name}'s GitLab subscription"
msgstr ""
-msgid "Checkout|%{selectedPlanText} plan"
+msgid "Checkout|%{name}'s storage subscription"
msgstr ""
-msgid "Checkout|%{startDate} - %{endDate}"
+msgid "Checkout|%{quantity} GB of storage"
msgstr ""
-msgid "Checkout|%{totalCiMinutes} CI minute"
-msgid_plural "Checkout|%{totalCiMinutes} CI minutes"
+msgid "Checkout|%{quantity} storage pack"
+msgid_plural "Checkout|%{quantity} storage packs"
msgstr[0] ""
msgstr[1] ""
+msgid "Checkout|%{selectedPlanText} plan"
+msgstr ""
+
+msgid "Checkout|%{startDate} - %{endDate}"
+msgstr ""
+
msgid "Checkout|%{totalCiMinutes} CI minutes"
msgstr ""
@@ -6604,6 +6656,9 @@ msgstr ""
msgid "Checkout|CI minute packs are only used after you've used your subscription's monthly quota. The additional minutes will roll over month to month and are valid for one year."
msgstr ""
+msgid "Checkout|CI minutes"
+msgstr ""
+
msgid "Checkout|Checkout"
msgstr ""
@@ -6637,6 +6692,9 @@ msgstr ""
msgid "Checkout|Edit"
msgstr ""
+msgid "Checkout|Enter a number greater than 0"
+msgstr ""
+
msgid "Checkout|Exp %{expirationMonth}/%{expirationYear}"
msgstr ""
@@ -6658,6 +6716,9 @@ msgstr ""
msgid "Checkout|Failed to register credit card. Please try again."
msgstr ""
+msgid "Checkout|GB"
+msgstr ""
+
msgid "Checkout|GitLab group"
msgstr ""
@@ -6694,6 +6755,9 @@ msgstr ""
msgid "Checkout|State"
msgstr ""
+msgid "Checkout|Storage packs"
+msgstr ""
+
msgid "Checkout|Street address"
msgstr ""
@@ -6715,6 +6779,9 @@ msgstr ""
msgid "Checkout|Total minutes: %{quantity}"
msgstr ""
+msgid "Checkout|Total storage: %{quantity} GB"
+msgstr ""
+
msgid "Checkout|Users"
msgstr ""
@@ -6724,16 +6791,28 @@ msgstr ""
msgid "Checkout|Your organization"
msgstr ""
+msgid "Checkout|Your storage subscription has the same term as your main subscription, and the price is prorated accordingly."
+msgstr ""
+
msgid "Checkout|Your subscription will be applied to this group"
msgstr ""
msgid "Checkout|Zip code"
msgstr ""
+msgid "Checkout|a storage subscription"
+msgstr ""
+
msgid "Checkout|company or team"
msgstr ""
-msgid "Checkout|x 1,000 minutes per pack = %{strong}"
+msgid "Checkout|minutes"
+msgstr ""
+
+msgid "Checkout|x %{quantity} %{units} per pack"
+msgstr ""
+
+msgid "Checkout|x %{quantity} %{units} per pack ="
msgstr ""
msgid "Cherry-pick this commit"
@@ -6775,15 +6854,9 @@ msgstr ""
msgid "Choose a type..."
msgstr ""
-msgid "Choose any color"
-msgstr ""
-
msgid "Choose any color."
msgstr ""
-msgid "Choose any color. Or you can choose one of the suggested colors below"
-msgstr ""
-
msgid "Choose file…"
msgstr ""
@@ -7090,6 +7163,9 @@ msgstr ""
msgid "CloneIssue|Cannot clone issue to target project as it is pending deletion."
msgstr ""
+msgid "CloneIssue|Cannot clone issues of '%{issue_type}' type."
+msgstr ""
+
msgid "Cloned this issue to %{path_to_project}."
msgstr ""
@@ -7144,7 +7220,10 @@ msgstr ""
msgid "Closes this %{quick_action_target}."
msgstr ""
-msgid "Cloud licenses can not be removed."
+msgid "Cloud Functions description and apps that are suitable for this deployment target"
+msgstr ""
+
+msgid "Cloud Run description and apps that are suitable for this deployment target"
msgstr ""
msgid "Cluster"
@@ -7240,9 +7319,6 @@ msgstr ""
msgid "ClusterAgents|Last contact"
msgstr ""
-msgid "ClusterAgents|Last used"
-msgstr ""
-
msgid "ClusterAgents|Learn how to create an agent access token"
msgstr ""
@@ -7312,9 +7388,6 @@ msgstr ""
msgid "ClusterAgents|You will need to create a token to connect to your agent"
msgstr ""
-msgid "ClusterAgent|This feature is only available for premium plans"
-msgstr ""
-
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -7867,6 +7940,9 @@ msgstr ""
msgid "ClusterIntegration|See and edit the details for your Kubernetes cluster"
msgstr ""
+msgid "ClusterIntegration|Select a VPC"
+msgstr ""
+
msgid "ClusterIntegration|Select a VPC to choose a security group"
msgstr ""
@@ -7876,6 +7952,9 @@ msgstr ""
msgid "ClusterIntegration|Select a VPC to use for your EKS Cluster resources. To use a new VPC, first create one on %{linkStart}Amazon Web Services %{linkEnd}."
msgstr ""
+msgid "ClusterIntegration|Select a network"
+msgstr ""
+
msgid "ClusterIntegration|Select a network to choose a subnetwork"
msgstr ""
@@ -7885,9 +7964,24 @@ msgstr ""
msgid "ClusterIntegration|Select a region to choose a VPC"
msgstr ""
+msgid "ClusterIntegration|Select a security group"
+msgstr ""
+
+msgid "ClusterIntegration|Select a subnet"
+msgstr ""
+
+msgid "ClusterIntegration|Select a subnetwork"
+msgstr ""
+
msgid "ClusterIntegration|Select a zone to choose a network"
msgstr ""
+msgid "ClusterIntegration|Select an instance type"
+msgstr ""
+
+msgid "ClusterIntegration|Select key pair"
+msgstr ""
+
msgid "ClusterIntegration|Select machine type"
msgstr ""
@@ -7900,6 +7994,9 @@ msgstr ""
msgid "ClusterIntegration|Select project to choose zone"
msgstr ""
+msgid "ClusterIntegration|Select service role"
+msgstr ""
+
msgid "ClusterIntegration|Select the key pair name that will be used to create EC2 nodes. To use a new key pair name, first create one on %{linkStart}Amazon Web Services%{linkEnd}."
msgstr ""
@@ -8050,30 +8147,6 @@ msgstr ""
msgid "ClusterIntegration|sign up"
msgstr ""
-msgid "ClusterIntergation|Select a VPC"
-msgstr ""
-
-msgid "ClusterIntergation|Select a network"
-msgstr ""
-
-msgid "ClusterIntergation|Select a security group"
-msgstr ""
-
-msgid "ClusterIntergation|Select a subnet"
-msgstr ""
-
-msgid "ClusterIntergation|Select a subnetwork"
-msgstr ""
-
-msgid "ClusterIntergation|Select an instance type"
-msgstr ""
-
-msgid "ClusterIntergation|Select key pair"
-msgstr ""
-
-msgid "ClusterIntergation|Select service role"
-msgstr ""
-
msgid "Clusters|An error occurred while loading clusters"
msgstr ""
@@ -8212,12 +8285,6 @@ msgstr ""
msgid "Comment"
msgstr ""
-msgid "Comment & close %{noteable_name}"
-msgstr ""
-
-msgid "Comment & reopen %{noteable_name}"
-msgstr ""
-
msgid "Comment & resolve thread"
msgstr ""
@@ -8334,6 +8401,9 @@ msgstr ""
msgid "Company"
msgstr ""
+msgid "Company Name"
+msgstr ""
+
msgid "Compare"
msgstr ""
@@ -8415,13 +8485,10 @@ msgstr ""
msgid "Completed"
msgstr ""
-msgid "Compliance"
+msgid "Compliance framework"
msgstr ""
-msgid "Compliance Dashboard"
-msgstr ""
-
-msgid "Compliance framework"
+msgid "Compliance report"
msgstr ""
msgid "ComplianceDashboard|created by:"
@@ -8430,16 +8497,22 @@ msgstr ""
msgid "ComplianceFrameworks|Add framework"
msgstr ""
-msgid "ComplianceFrameworks|Combines with the CI configuration at runtime."
+msgid "ComplianceFrameworks|Background color"
+msgstr ""
+
+msgid "ComplianceFrameworks|Cancel"
msgstr ""
msgid "ComplianceFrameworks|Compliance framework deleted successfully"
msgstr ""
-msgid "ComplianceFrameworks|Compliance pipeline configuration location (optional)"
+msgid "ComplianceFrameworks|Compliance pipeline configuration (optional)"
msgstr ""
-msgid "ComplianceFrameworks|Could not find this configuration location, please try a different location"
+msgid "ComplianceFrameworks|Configuration not found"
+msgstr ""
+
+msgid "ComplianceFrameworks|Configured compliance frameworks appear here."
msgstr ""
msgid "ComplianceFrameworks|Delete compliance framework %{framework}"
@@ -8448,6 +8521,12 @@ msgstr ""
msgid "ComplianceFrameworks|Delete framework"
msgstr ""
+msgid "ComplianceFrameworks|Description"
+msgstr ""
+
+msgid "ComplianceFrameworks|Description is required"
+msgstr ""
+
msgid "ComplianceFrameworks|Edit framework"
msgstr ""
@@ -8460,31 +8539,31 @@ msgstr ""
msgid "ComplianceFrameworks|Error fetching compliance frameworks data. Please refresh the page or try a different framework"
msgstr ""
-msgid "ComplianceFrameworks|Invalid format: it should follow the format [PATH].y(a)ml@[GROUP]/[PROJECT]"
+msgid "ComplianceFrameworks|Invalid format"
msgstr ""
-msgid "ComplianceFrameworks|Once a compliance framework is added it will appear here."
+msgid "ComplianceFrameworks|Name"
msgstr ""
-msgid "ComplianceFrameworks|There are no compliance frameworks set up yet"
+msgid "ComplianceFrameworks|Name is required"
msgstr ""
-msgid "ComplianceFrameworks|Unable to save this compliance framework. Please try again"
+msgid "ComplianceFrameworks|No compliance frameworks are configured"
msgstr ""
-msgid "ComplianceFrameworks|Use %{codeStart}::%{codeEnd} to create a %{linkStart}scoped set%{linkEnd} (eg. %{codeStart}SOX::AWS%{codeEnd})"
+msgid "ComplianceFrameworks|Required format: %{codeStart}path/file.y[a]ml@group-name/project-name%{codeEnd}. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
-msgid "ComplianceFrameworks|You are about to permanently delete the compliance framework %{framework} from all projects which currently have it applied, which may remove other functionality. This cannot be undone."
+msgid "ComplianceFrameworks|Unable to save this compliance framework. Please try again"
msgstr ""
-msgid "ComplianceFrameworks|e.g. include-gitlab.ci.yml@group-name/project-name"
+msgid "ComplianceFrameworks|You are about to permanently delete the compliance framework %{framework} from all projects which currently have it applied, which may remove other functionality. This cannot be undone."
msgstr ""
-msgid "ComplianceFramework|Edit Compliance Framework"
+msgid "ComplianceFramework|Edit compliance framework"
msgstr ""
-msgid "ComplianceFramework|New Compliance Framework"
+msgid "ComplianceFramework|New compliance framework"
msgstr ""
msgid "Component"
@@ -8514,6 +8593,9 @@ msgstr ""
msgid "Configure %{repository_checks_link_start}repository checks%{link_end} and %{housekeeping_link_start}housekeeping%{link_end} on repositories."
msgstr ""
+msgid "Configure CAPTCHAs, IP address limits, and other anti-spam measures."
+msgstr ""
+
msgid "Configure Dependency Scanning in `.gitlab-ci.yml` using the GitLab managed template. You can [add variable overrides](https://docs.gitlab.com/ee/user/application_security/dependency_scanning/#customizing-the-dependency-scanning-settings) to customize Dependency Scanning settings."
msgstr ""
@@ -8550,6 +8632,9 @@ msgstr ""
msgid "Configure a %{codeStart}.gitlab-webide.yml%{codeEnd} file in the %{codeStart}.gitlab%{codeEnd} directory to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
msgstr ""
+msgid "Configure advanced permissions, Large File Storage, and two-factor authentication settings."
+msgstr ""
+
msgid "Configure approvals by authors and committers on all projects."
msgstr ""
@@ -8574,6 +8659,9 @@ msgstr ""
msgid "Configure specific limits for Git LFS requests that supersede the general user and IP rate limits."
msgstr ""
+msgid "Configure specific limits for deprecated API requests that supersede the general user and IP rate limits."
+msgstr ""
+
msgid "Configure the %{link} integration."
msgstr ""
@@ -8583,6 +8671,9 @@ msgstr ""
msgid "Configure the way a user creates a new account."
msgstr ""
+msgid "Configure via Merge Request"
+msgstr ""
+
msgid "Configure which lists are shown for anyone who visits this board"
msgstr ""
@@ -8821,10 +8912,10 @@ msgstr ""
msgid "ContainerRegistry|Delete selected tags"
msgstr ""
-msgid "ContainerRegistry|Deleting the image repository will delete all images and tags inside. This action cannot be undone. Please type the following to confirm: %{code}"
+msgid "ContainerRegistry|Delete tag"
msgstr ""
-msgid "ContainerRegistry|Deletion disabled due to missing or insufficient permissions."
+msgid "ContainerRegistry|Deleting the image repository will delete all images and tags inside. This action cannot be undone. Please type the following to confirm: %{code}"
msgstr ""
msgid "ContainerRegistry|Digest: %{imageId}"
@@ -9021,7 +9112,7 @@ msgstr ""
msgid "ContainerRegistry|To widen your search, change or remove the filters above."
msgstr ""
-msgid "ContainerRegistry|We are having trouble connecting to the Registry, which could be due to an issue with your project name or path. %{docLinkStart}More information%{docLinkEnd}"
+msgid "ContainerRegistry|We are having trouble connecting to the Container Registry. Please try refreshing the page. If this error persists, please review %{docLinkStart}the troubleshooting documentation%{docLinkEnd}."
msgstr ""
msgid "ContainerRegistry|With the Container Registry, every project can have its own space to store its Docker images. %{docLinkStart}More Information%{docLinkEnd}"
@@ -9051,6 +9142,9 @@ msgstr ""
msgid "Content parsed with %{link}."
msgstr ""
+msgid "ContentEditor|Table of Contents"
+msgstr ""
+
msgid "ContentEditor|You have to provide a renderMarkdown function or a custom serializer"
msgstr ""
@@ -9165,9 +9259,6 @@ msgstr ""
msgid "Copy %{protocol} clone URL"
msgstr ""
-msgid "Copy %{proxy_url}"
-msgstr ""
-
msgid "Copy %{type}"
msgstr ""
@@ -9237,6 +9328,9 @@ msgstr ""
msgid "Copy link to chart"
msgstr ""
+msgid "Copy prefix"
+msgstr ""
+
msgid "Copy reference"
msgstr ""
@@ -9321,9 +9415,6 @@ msgstr ""
msgid "Could not apply %{name} command."
msgstr ""
-msgid "Could not archive %{design}. Please try again."
-msgstr ""
-
msgid "Could not authorize chat nickname. Try again!"
msgstr ""
@@ -9429,6 +9520,9 @@ msgstr ""
msgid "Couldn't assign policy to project"
msgstr ""
+msgid "Country"
+msgstr ""
+
msgid "Coverage"
msgstr ""
@@ -9447,6 +9541,9 @@ msgstr ""
msgid "Create %{type}"
msgstr ""
+msgid "Create %{workspace} label"
+msgstr ""
+
msgid "Create New Directory"
msgstr ""
@@ -9459,9 +9556,6 @@ msgstr ""
msgid "Create a Mattermost team for this group"
msgstr ""
-msgid "Create a local proxy for storing frequently used upstream images. %{link_start}Learn more%{link_end} about dependency proxies."
-msgstr ""
-
msgid "Create a merge request"
msgstr ""
@@ -9498,6 +9592,9 @@ msgstr ""
msgid "Create commit"
msgstr ""
+msgid "Create common files more quickly, and standardize their format."
+msgstr ""
+
msgid "Create confidential merge request"
msgstr ""
@@ -9609,6 +9706,9 @@ msgstr ""
msgid "Create tag %{tagName}"
msgstr ""
+msgid "Create topic"
+msgstr ""
+
msgid "Create user"
msgstr ""
@@ -9849,10 +9949,7 @@ msgstr ""
msgid "CredentialsInventory|SSH Keys"
msgstr ""
-msgid "Credit card validated at:"
-msgstr ""
-
-msgid "Credit card validated:"
+msgid "Credit card:"
msgstr ""
msgid "Critical vulnerabilities present"
@@ -9909,6 +10006,9 @@ msgstr ""
msgid "Current sign-in at:"
msgstr ""
+msgid "Current sign-in ip"
+msgstr ""
+
msgid "Current vulnerabilities count"
msgstr ""
@@ -9948,7 +10048,7 @@ msgstr ""
msgid "Custom notification events"
msgstr ""
-msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notificationLinkStart} notification emails%{notificationLinkEnd}."
+msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notificationLinkStart}notification emails%{notificationLinkEnd}."
msgstr ""
msgid "Custom project templates"
@@ -10147,10 +10247,10 @@ msgid_plural "CycleAnalytics|Showing %{subjectFilterText} and %{selectedLabelsCo
msgstr[0] ""
msgstr[1] ""
-msgid "CycleAnalytics|Showing data for group '%{groupName}' and %{selectedProjectCount} projects from %{startDate} to %{endDate}"
+msgid "CycleAnalytics|Showing data for group '%{groupName}' and %{selectedProjectCount} projects from %{createdAfter} to %{createdBefore}"
msgstr ""
-msgid "CycleAnalytics|Showing data for group '%{groupName}' from %{startDate} to %{endDate}"
+msgid "CycleAnalytics|Showing data for group '%{groupName}' from %{createdAfter} to %{createdBefore}"
msgstr ""
msgid "CycleAnalytics|Stages"
@@ -10707,7 +10807,7 @@ msgstr ""
msgid "Days to merge"
msgstr ""
-msgid "Deactivate dormant users after 90 days of inactivity. Users can return to active status by signing in to their account. While inactive, a user is not counted as an active user in the instance."
+msgid "Deactivate dormant users after 90 days of inactivity"
msgstr ""
msgid "Dear Administrator,"
@@ -10872,9 +10972,6 @@ msgstr ""
msgid "Delete corpus"
msgstr ""
-msgid "Delete domain"
-msgstr ""
-
msgid "Delete file"
msgstr ""
@@ -10902,9 +10999,6 @@ msgstr ""
msgid "Delete self monitoring project"
msgstr ""
-msgid "Delete serverless domain?"
-msgstr ""
-
msgid "Delete snippet"
msgstr ""
@@ -11091,19 +11185,25 @@ msgstr ""
msgid "Dependency Proxy"
msgstr ""
-msgid "Dependency Scanning"
+msgid "Dependency Proxy disabled. To enable it, contact the group owner."
+msgstr ""
+
+msgid "Dependency Proxy feature is limited to public groups for now."
+msgstr ""
+
+msgid "Dependency Proxy image prefix"
msgstr ""
-msgid "Dependency proxy"
+msgid "Dependency Scanning"
msgstr ""
-msgid "Dependency proxy feature is limited to public groups for now."
+msgid "DependencyProxy|Create a local proxy for storing frequently used upstream images. %{docLinkStart}Learn more%{docLinkEnd} about dependency proxies."
msgstr ""
-msgid "Dependency proxy image prefix"
+msgid "DependencyProxy|Dependency Proxy"
msgstr ""
-msgid "DependencyProxy|Toggle Dependency Proxy"
+msgid "DependencyProxy|Enable Proxy"
msgstr ""
msgid "Depends on %d merge request being merged"
@@ -11343,6 +11443,9 @@ msgstr ""
msgid "Deployments"
msgstr ""
+msgid "Deployments to Google Kubernetes Engine can be "
+msgstr ""
+
msgid "Deployments|%{deployments} environment impacted."
msgid_plural "Deployments|%{deployments} environments impacted."
msgstr[0] ""
@@ -11372,6 +11475,9 @@ msgstr ""
msgid "Deployment|success"
msgstr ""
+msgid "Deprecated API rate limits"
+msgstr ""
+
msgid "Deprioritize label"
msgstr ""
@@ -11415,7 +11521,9 @@ msgid "DesignManagement|%{current_design} of %{designs_count}"
msgstr ""
msgid "DesignManagement|%{filename} did not change."
-msgstr ""
+msgid_plural "DesignManagement|The designs you tried uploading did not change."
+msgstr[0] ""
+msgstr[1] ""
msgid "DesignManagement|Adding a design with the same filename replaces the file in a new version."
msgstr ""
@@ -11519,6 +11627,12 @@ msgstr ""
msgid "DesignManagement|Select all"
msgstr ""
+msgid "DesignManagement|Some of the designs you tried uploading did not change: %{skippedFiles} and %{moreCount} more."
+msgstr ""
+
+msgid "DesignManagement|Some of the designs you tried uploading did not change: %{skippedFiles}."
+msgstr ""
+
msgid "DesignManagement|The maximum number of designs allowed to be uploaded is %{upload_limit}. Please try again."
msgstr ""
@@ -11534,15 +11648,12 @@ msgstr ""
msgid "DesignManagement|Upload designs"
msgstr ""
-msgid "DesignManagement|Upload skipped."
+msgid "DesignManagement|Upload skipped. %{reason}"
msgstr ""
msgid "DesignManagement|Your designs are being copied and are on their way… Please refresh to update."
msgstr ""
-msgid "DesignManagement|and %{moreCount} more."
-msgstr ""
-
msgid "Designs"
msgstr ""
@@ -11594,6 +11705,9 @@ msgstr ""
msgid "DevopsAdoption|Adoption by subgroup"
msgstr ""
+msgid "DevopsAdoption|Adoption over time"
+msgstr ""
+
msgid "DevopsAdoption|An error occurred while removing the group. Please try again."
msgstr ""
@@ -11672,6 +11786,9 @@ msgstr ""
msgid "DevopsAdoption|No results…"
msgstr ""
+msgid "DevopsAdoption|No tracked features"
+msgstr ""
+
msgid "DevopsAdoption|Not adopted"
msgstr ""
@@ -11717,6 +11834,9 @@ msgstr ""
msgid "DevopsAdoption|This group has no subgroups"
msgstr ""
+msgid "DevopsAdoption|Total number of features adopted"
+msgstr ""
+
msgid "DevopsAdoption|You cannot remove the group you are currently in."
msgstr ""
@@ -11903,12 +12023,6 @@ msgstr ""
msgid "Discover|Upgrade now"
msgstr ""
-msgid "Discuss a specific suggestion or question"
-msgstr ""
-
-msgid "Discuss a specific suggestion or question that needs to be resolved"
-msgstr ""
-
msgid "Discuss a specific suggestion or question that needs to be resolved."
msgstr ""
@@ -12001,18 +12115,6 @@ msgstr ""
msgid "Domain Name"
msgstr ""
-msgid "Domain cannot be deleted while associated to one or more clusters."
-msgstr ""
-
-msgid "Domain was successfully created."
-msgstr ""
-
-msgid "Domain was successfully deleted."
-msgstr ""
-
-msgid "Domain was successfully updated."
-msgstr ""
-
msgid "Don't have an account yet?"
msgstr ""
@@ -12043,9 +12145,6 @@ msgstr ""
msgid "Download %{format}:"
msgstr ""
-msgid "Download %{name} artifact"
-msgstr ""
-
msgid "Download (%{fileSizeReadable})"
msgstr ""
@@ -12250,6 +12349,9 @@ msgstr ""
msgid "Edit issues"
msgstr ""
+msgid "Edit merge requests"
+msgstr ""
+
msgid "Edit public deploy key"
msgstr ""
@@ -12268,6 +12370,9 @@ msgstr ""
msgid "Edit title and description"
msgstr ""
+msgid "Edit topic: %{topic_name}"
+msgstr ""
+
msgid "Edit user: %{user_name}"
msgstr ""
@@ -12325,6 +12430,9 @@ msgstr ""
msgid "Elastic|None. Select projects to index."
msgstr ""
+msgid "Eligible users"
+msgstr ""
+
msgid "Email"
msgstr ""
@@ -12490,6 +12598,9 @@ msgstr ""
msgid "Enable SSL verification"
msgstr ""
+msgid "Enable Service Ping"
+msgstr ""
+
msgid "Enable Snowplow tracking"
msgstr ""
@@ -12583,30 +12694,21 @@ msgstr ""
msgid "Enable or disable the Pseudonymizer data collection."
msgstr ""
-msgid "Enable or disable version check and service ping."
+msgid "Enable or disable version check and Service Ping."
msgstr ""
msgid "Enable protected paths rate limit"
msgstr ""
-msgid "Enable proxy"
-msgstr ""
-
msgid "Enable reCAPTCHA"
msgstr ""
-msgid "Enable reCAPTCHA for login"
-msgstr ""
-
-msgid "Enable reCAPTCHA, Invisible Captcha, Akismet and set IP limits. For reCAPTCHA, we currently only support %{recaptcha_v2_link_start}v2%{recaptcha_v2_link_end}"
+msgid "Enable reCAPTCHA for login."
msgstr ""
msgid "Enable repository checks"
msgstr ""
-msgid "Enable service ping"
-msgstr ""
-
msgid "Enable shared runners for all projects and subgroups in this group."
msgstr ""
@@ -12667,9 +12769,6 @@ msgstr ""
msgid "Enabled sources for code import during project creation. OmniAuth must be configured for GitHub"
msgstr ""
-msgid "Enabling this will only make licensed EE features available to projects if the project namespace's plan includes the feature or if the project is public."
-msgstr ""
-
msgid "Encountered an error while rendering: %{err}"
msgstr ""
@@ -12718,22 +12817,19 @@ msgstr ""
msgid "Enter Admin Mode"
msgstr ""
-msgid "Enter IP address range"
-msgstr ""
-
msgid "Enter a number"
msgstr ""
msgid "Enter an integer number between 0 and 100"
msgstr ""
-msgid "Enter an integer number number between 0 and 100"
+msgid "Enter any color or choose one of the suggested colors below."
msgstr ""
-msgid "Enter at least three characters to search"
+msgid "Enter any color."
msgstr ""
-msgid "Enter domain"
+msgid "Enter at least three characters to search"
msgstr ""
msgid "Enter in your Bitbucket Server URL and personal access token below"
@@ -12886,7 +12982,7 @@ msgstr ""
msgid "Environments|Are you sure you want to stop this environment?"
msgstr ""
-msgid "Environments|Auto stop in"
+msgid "Environments|Auto stop"
msgstr ""
msgid "Environments|Auto stops %{autoStopAt}"
@@ -12970,6 +13066,9 @@ msgstr ""
msgid "Environments|Note that this action will stop the environment, but it will %{emphasisStart}not%{emphasisEnd} have an effect on any existing deployment due to no “stop environment action†being defined in the %{ciConfigLinkStart}.gitlab-ci.yml%{ciConfigLinkEnd} file."
msgstr ""
+msgid "Environments|Open"
+msgstr ""
+
msgid "Environments|Open live environment"
msgstr ""
@@ -13183,6 +13282,9 @@ msgstr ""
msgid "Error creating label."
msgstr ""
+msgid "Error creating new directory. Please try again."
+msgstr ""
+
msgid "Error creating new iteration"
msgstr ""
@@ -13312,7 +13414,7 @@ msgstr ""
msgid "Error parsing CSV file. Please make sure it has"
msgstr ""
-msgid "Error rendering markdown preview"
+msgid "Error rendering Markdown preview"
msgstr ""
msgid "Error saving label update."
@@ -13480,6 +13582,9 @@ msgstr ""
msgid "EscalationPolicies|Escalation policies"
msgstr ""
+msgid "EscalationPolicies|Escalation policy %{obstacle} in Project %{project}"
+msgstr ""
+
msgid "EscalationPolicies|Escalation rules"
msgstr ""
@@ -13650,9 +13755,6 @@ msgstr ""
msgid "Exactly one of %{attributes} is required"
msgstr ""
-msgid "Example: %{ip_address}. %{read_more_link}."
-msgstr ""
-
msgid "Example: @sub\\.company\\.com$"
msgstr ""
@@ -13740,6 +13842,9 @@ msgstr ""
msgid "Expiration date (optional)"
msgstr ""
+msgid "Expiration date:"
+msgstr ""
+
msgid "Expired"
msgstr ""
@@ -13782,9 +13887,6 @@ msgstr ""
msgid "Export"
msgstr ""
-msgid "Export %{name}"
-msgstr ""
-
msgid "Export %{requirementsCount} requirements?"
msgstr ""
@@ -13797,6 +13899,12 @@ msgstr ""
msgid "Export group"
msgstr ""
+msgid "Export issues"
+msgstr ""
+
+msgid "Export merge requests"
+msgstr ""
+
msgid "Export project"
msgstr ""
@@ -13881,6 +13989,11 @@ msgstr ""
msgid "Failed to apply commands."
msgstr ""
+msgid "Failed to archive a design. Please try again."
+msgid_plural "Failed to archive designs. Please try again."
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Failed to assign a reviewer because no user was found."
msgstr ""
@@ -14115,9 +14228,6 @@ msgstr ""
msgid "Failed to upload object map file"
msgstr ""
-msgid "Failed to verify domain ownership"
-msgstr ""
-
msgid "Failure"
msgstr ""
@@ -14309,6 +14419,9 @@ msgstr ""
msgid "FeatureFlags|Remove"
msgstr ""
+msgid "FeatureFlags|Search code references"
+msgstr ""
+
msgid "FeatureFlags|Set the Unleash client application name to the name of the environment your application runs in. This value is used to match environment scopes. See the %{linkStart}example client configuration%{linkEnd}."
msgstr ""
@@ -14560,6 +14673,9 @@ msgstr ""
msgid "Finished at"
msgstr ""
+msgid "First Name"
+msgstr ""
+
msgid "First Seen"
msgstr ""
@@ -14791,6 +14907,9 @@ msgstr ""
msgid "Framework successfully deleted"
msgstr ""
+msgid "Free"
+msgstr ""
+
msgid "Free Trial of GitLab.com Ultimate"
msgstr ""
@@ -14851,6 +14970,9 @@ msgstr ""
msgid "General pipelines"
msgstr ""
+msgid "General settings"
+msgstr ""
+
msgid "Generate a default set of labels"
msgstr ""
@@ -15427,6 +15549,9 @@ msgstr ""
msgid "GitLab commit"
msgstr ""
+msgid "GitLab events trigger webhooks. Use the request details of a webhook to help troubleshoot problems. %{link_start}How do I troubleshoot?%{link_end}"
+msgstr ""
+
msgid "GitLab export"
msgstr ""
@@ -15436,6 +15561,9 @@ msgstr ""
msgid "GitLab group: %{source_link}"
msgstr ""
+msgid "GitLab informs you if a new version is available."
+msgstr ""
+
msgid "GitLab is a complete DevOps platform, delivered as a single application, fundamentally changing the way Development, Security, and Ops teams collaborate"
msgstr ""
@@ -15463,9 +15591,6 @@ msgstr ""
msgid "GitLab project export"
msgstr ""
-msgid "GitLab restart is required to apply changes."
-msgstr ""
-
msgid "GitLab single sign-on URL"
msgstr ""
@@ -15481,9 +15606,6 @@ msgstr ""
msgid "GitLab version"
msgstr ""
-msgid "GitLab will inform you if a new version is available."
-msgstr ""
-
msgid "GitLab will run a background job that will produce pseudonymized CSVs of the GitLab database that will be uploaded to your configured object storage directory."
msgstr ""
@@ -15748,9 +15870,21 @@ msgstr ""
msgid "Go to snippets"
msgstr ""
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check 'Allowed domains for sign-ups'."
+msgstr ""
+
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check 'Email restrictions for sign-ups'."
+msgstr ""
+
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check the 'Domain denylist'."
+msgstr ""
+
msgid "Go to the activity feed"
msgstr ""
+msgid "Go to the group’s 'Settings &gt; General' page, and check 'Restrict membership by email domain'."
+msgstr ""
+
msgid "Go to the milestone list"
msgstr ""
@@ -15787,6 +15921,12 @@ msgstr ""
msgid "Goal of the changes and what reviewers should be aware of"
msgstr ""
+msgid "Google Cloud"
+msgstr ""
+
+msgid "Google Cloud offers several deployment targets. Select the one most suitable for your project."
+msgstr ""
+
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
@@ -15871,9 +16011,6 @@ msgstr ""
msgid "Group ID"
msgstr ""
-msgid "Group ID: %{group_id}"
-msgstr ""
-
msgid "Group Owner must have signed in with SAML before enabling Group Managed Accounts"
msgstr ""
@@ -15901,6 +16038,9 @@ msgstr ""
msgid "Group by"
msgstr ""
+msgid "Group description"
+msgstr ""
+
msgid "Group description (optional)"
msgstr ""
@@ -16048,6 +16188,12 @@ msgstr ""
msgid "GroupImport|Unable to process group import file"
msgstr ""
+msgid "GroupPage|Copy group ID"
+msgstr ""
+
+msgid "GroupPage|Group ID: %{group_id}"
+msgstr ""
+
msgid "GroupRoadmap|%{dateWord} – No end date"
msgstr ""
@@ -16270,9 +16416,15 @@ msgstr ""
msgid "GroupSettings|Allow project access token creation"
msgstr ""
+msgid "GroupSettings|Applied to all subgroups unless overridden by a group owner. Groups already added to the project lose access."
+msgstr ""
+
msgid "GroupSettings|Auto DevOps pipeline was updated for the group"
msgstr ""
+msgid "GroupSettings|Available only on the top-level group. Applies to all subgroups. Groups already shared with a group outside %{group} are still shared unless removed manually."
+msgstr ""
+
msgid "GroupSettings|Badges"
msgstr ""
@@ -16291,7 +16443,7 @@ msgstr ""
msgid "GroupSettings|Compliance frameworks"
msgstr ""
-msgid "GroupSettings|Configure frameworks to apply enforceable rules to projects."
+msgid "GroupSettings|Configure compliance frameworks to make them available to projects in this group. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "GroupSettings|Custom project templates"
@@ -16324,6 +16476,9 @@ msgstr ""
msgid "GroupSettings|New runners registration token has been generated!"
msgstr ""
+msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgstr ""
+
msgid "GroupSettings|Pipeline settings was updated for the group"
msgstr ""
@@ -16336,21 +16491,30 @@ msgstr ""
msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
-msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups."
+msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups"
msgstr ""
msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
msgstr ""
+msgid "GroupSettings|Prevents group members from being notified if the group is mentioned."
+msgstr ""
+
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
msgstr ""
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. This delay can be %{link_start}customized by an admin%{link_end} in instance settings. Inherited by subgroups."
msgstr ""
+msgid "GroupSettings|Select a project with the %{code_start}.gitlab/insights.yml%{code_end} file"
+msgstr ""
+
msgid "GroupSettings|Select a subgroup to use as the source for custom project templates for this group."
msgstr ""
+msgid "GroupSettings|Select the project that contains your custom Insights file."
+msgstr ""
+
msgid "GroupSettings|Set the maximum size of GitLab Pages for this group. %{link_start}Learn more.%{link_end}"
msgstr ""
@@ -16378,21 +16542,6 @@ msgstr ""
msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}."
msgstr ""
-msgid "GroupSettings|This setting is only available on the top-level group and it applies to all subgroups. Groups that have already been shared with a group outside %{group} will still be shared, and this access will have to be revoked manually."
-msgstr ""
-
-msgid "GroupSettings|This setting will be applied to all subgroups unless overridden by a group owner. Groups that already have access to the project will continue to have access unless removed manually."
-msgstr ""
-
-msgid "GroupSettings|This setting will override user notification preferences for all members of the group, subgroups, and projects."
-msgstr ""
-
-msgid "GroupSettings|This setting will prevent group members from being notified if the group is mentioned."
-msgstr ""
-
-msgid "GroupSettings|This setting will prevent group members from forking projects outside of the group."
-msgstr ""
-
msgid "GroupSettings|Transfer group"
msgstr ""
@@ -16510,7 +16659,7 @@ msgstr ""
msgid "GroupsNew|No import options available"
msgstr ""
-msgid "GroupsNew|Not all related objects are migrated, as %{docs_link_start}described here%{docs_link_end}. Please %{feedback_link_start}leave feedback%{feedback_link_end} on this feature."
+msgid "GroupsNew|Not all related objects are migrated. %{docs_link_start}More info%{docs_link_end}."
msgstr ""
msgid "GroupsNew|Personal access token"
@@ -16648,6 +16797,21 @@ msgstr ""
msgid "Hello, %{username}!"
msgstr ""
+msgid "HelloMessage|%{handshake_emoji} Contribute to GitLab: %{contribute_link}"
+msgstr ""
+
+msgid "HelloMessage|%{magnifier_emoji} Create a new GitLab issue: %{new_issue_link}"
+msgstr ""
+
+msgid "HelloMessage|%{rocket_emoji} We like your curiosity! Help us improve GitLab by joining the team: %{jobs_page_link}"
+msgstr ""
+
+msgid "HelloMessage|Does this page need fixes or improvements? Open an issue or contribute a merge request to help make GitLab more lovable. At GitLab, everyone can contribute!"
+msgstr ""
+
+msgid "HelloMessage|Welcome to GitLab!"
+msgstr ""
+
msgid "Help"
msgstr ""
@@ -16657,13 +16821,10 @@ msgstr ""
msgid "Helps prevent bots from creating accounts."
msgstr ""
-msgid "Helps prevent bots from creating issues"
-msgstr ""
-
-msgid "Helps prevent malicious users hide their activity"
+msgid "Helps prevent bots from creating issues."
msgstr ""
-msgid "Helps reduce request volume (e.g. from crawlers or abusive bots)"
+msgid "Helps prevent malicious users hide their activity."
msgstr ""
msgid "Helps reduce request volume (for example, from crawlers or abusive bots)"
@@ -16730,9 +16891,6 @@ msgstr ""
msgid "High or unknown vulnerabilities present"
msgstr ""
-msgid "Highest number of requests per minute for each raw path, default to 300. To disable throttling set to 0."
-msgstr ""
-
msgid "Highest role:"
msgstr ""
@@ -16754,6 +16912,9 @@ msgstr ""
msgid "History of authentications"
msgstr ""
+msgid "Holder name:"
+msgstr ""
+
msgid "Home page URL"
msgstr ""
@@ -16787,6 +16948,15 @@ msgstr ""
msgid "Housekeeping, export, path, transfer, remove, archive."
msgstr ""
+msgid "How do I configure Akismet?"
+msgstr ""
+
+msgid "How do I configure authentication using the GitLab database?"
+msgstr ""
+
+msgid "How do I configure it?"
+msgstr ""
+
msgid "How do I configure runners?"
msgstr ""
@@ -16808,13 +16978,19 @@ msgstr ""
msgid "How do I set up this service?"
msgstr ""
+msgid "How do I use a web terminal?"
+msgstr ""
+
+msgid "How do I use file templates?"
+msgstr ""
+
msgid "How it works"
msgstr ""
msgid "How many days need to pass between marking entity for deletion and actual removing it."
msgstr ""
-msgid "How many seconds an IP will be counted towards the limit"
+msgid "How many seconds an IP counts toward the IP address limit."
msgstr ""
msgid "How the job limiter handles jobs exceeding the thresholds specified below. The 'track' mode only logs the jobs. The 'compress' mode compresses the jobs and raises an exception if the compressed size exceeds the limit."
@@ -16904,13 +17080,16 @@ msgstr ""
msgid "IP Address"
msgstr ""
-msgid "IP expiration time"
+msgid "IP address expiration time"
msgstr ""
-msgid "IP subnet restriction only allowed for top-level groups"
+msgid "IP address restrictions"
+msgstr ""
+
+msgid "IP addresses per user"
msgstr ""
-msgid "IPs per user"
+msgid "IP subnet restriction only allowed for top-level groups"
msgstr ""
msgid "Identifier"
@@ -17088,12 +17267,18 @@ msgstr ""
msgid "Import from Jira"
msgstr ""
+msgid "Import group"
+msgstr ""
+
msgid "Import group from file"
msgstr ""
msgid "Import groups"
msgstr ""
+msgid "Import history"
+msgstr ""
+
msgid "Import in progress"
msgstr ""
@@ -17228,7 +17413,7 @@ msgstr[1] ""
msgid "Importing..."
msgstr ""
-msgid "Import|A repository URL usually ends in a .git suffix, although this is not required. Double check to make sure your repository URL is correct."
+msgid "Import|There is not a valid Git repository at this URL. If your HTTP repository is not publicly accessible, verify your credentials."
msgstr ""
msgid "Improve customer support with Service Desk"
@@ -17522,7 +17707,7 @@ msgstr ""
msgid "InProductMarketing|Start a GitLab Ultimate trial today in less than one minute, no credit card required."
msgstr ""
-msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no CC required"
+msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no credit card required"
msgstr ""
msgid "InProductMarketing|Start a trial"
@@ -17984,6 +18169,9 @@ msgstr ""
msgid "Inline"
msgstr ""
+msgid "Inline math"
+msgstr ""
+
msgid "Input host keys manually"
msgstr ""
@@ -18142,6 +18330,9 @@ msgstr ""
msgid "Integrations|Create new issue in Jira"
msgstr ""
+msgid "Integrations|Create new issue in ZenTao"
+msgstr ""
+
msgid "Integrations|Default settings are inherited from the group level."
msgstr ""
@@ -18235,9 +18426,15 @@ msgstr ""
msgid "Integrations|Search Jira issues"
msgstr ""
+msgid "Integrations|Search ZenTao issues"
+msgstr ""
+
msgid "Integrations|Send notifications about project events to Unify Circuit."
msgstr ""
+msgid "Integrations|Send notifications about project events to a Unify Circuit conversation. %{docs_link}"
+msgstr ""
+
msgid "Integrations|Sign in to add namespaces"
msgstr ""
@@ -18277,6 +18474,9 @@ msgstr ""
msgid "Integrations|You've activated every integration 🎉"
msgstr ""
+msgid "Integrations|ZenTao issues display here when you create issues in your project in ZenTao."
+msgstr ""
+
msgid "Interactive mode"
msgstr ""
@@ -18400,6 +18600,12 @@ msgstr ""
msgid "Investigate vulnerability: %{title}"
msgstr ""
+msgid "Invisible Captcha"
+msgstr ""
+
+msgid "Invisible Captcha helps prevent the creation of spam accounts. It adds a honeypot field and time-sensitive form submission to the account signup form."
+msgstr ""
+
msgid "Invitation"
msgstr ""
@@ -19057,6 +19263,9 @@ msgstr ""
msgid "Iterations|The duration for each iteration (in weeks)"
msgstr ""
+msgid "Iterations|The iteration has been deleted."
+msgstr ""
+
msgid "Iterations|The start date of your first iteration"
msgstr ""
@@ -19758,6 +19967,9 @@ msgstr ""
msgid "Last Activity"
msgstr ""
+msgid "Last Name"
+msgstr ""
+
msgid "Last Pipeline"
msgstr ""
@@ -19932,6 +20144,9 @@ msgstr ""
msgid "Learn more about group-level project templates"
msgstr ""
+msgid "Learn more about groups."
+msgstr ""
+
msgid "Learn more about shards and replicas in the %{configuration_link_start}Advanced search configuration%{configuration_link_end} documentation. Changes won't take place until the index is %{recreated_link_start}recreated%{recreated_link_end}."
msgstr ""
@@ -20052,9 +20267,6 @@ msgstr ""
msgid "Leave Admin Mode"
msgstr ""
-msgid "Leave blank for no limit. Once set, existing personal access tokens may be revoked."
-msgstr ""
-
msgid "Leave edit mode? All unsaved changes will be lost."
msgstr ""
@@ -20100,10 +20312,10 @@ msgstr ""
msgid "LicenseCompliance|Acceptable license to be used in the project"
msgstr ""
-msgid "LicenseCompliance|Add a license"
+msgid "LicenseCompliance|Add license and related policy"
msgstr ""
-msgid "LicenseCompliance|Add license and related policy"
+msgid "LicenseCompliance|Add license policy"
msgstr ""
msgid "LicenseCompliance|Allow"
@@ -20193,6 +20405,9 @@ msgstr ""
msgid "LicenseManagement|Uncategorized"
msgstr ""
+msgid "Licensed Enterprise Edition features can be used if the project namespace's plan includes the feature, or if the project is public."
+msgstr ""
+
msgid "Licensed Features"
msgstr ""
@@ -20259,7 +20474,10 @@ msgstr ""
msgid "Limit namespaces and projects that can be indexed"
msgstr ""
-msgid "Limit sign in from multiple ips"
+msgid "Limit project size at a global, group, and project level. %{link_start}Learn more%{link_end}."
+msgstr ""
+
+msgid "Limit sign in from multiple IP addresses"
msgstr ""
msgid "Limit the number of concurrent operations this secondary site can run in the background."
@@ -20552,6 +20770,9 @@ msgstr ""
msgid "Makes this issue confidential."
msgstr ""
+msgid "Manage %{workspace} labels"
+msgstr ""
+
msgid "Manage Web IDE features."
msgstr ""
@@ -20681,6 +20902,9 @@ msgstr ""
msgid "Marked For Deletion At - %{deletion_time}"
msgstr ""
+msgid "Marked as draft. Can only be merged when marked as ready."
+msgstr ""
+
msgid "Marked as ready. Merging is now allowed."
msgstr ""
@@ -20756,9 +20980,6 @@ msgstr ""
msgid "Max 100,000 events"
msgstr ""
-msgid "Max 20 characters"
-msgstr ""
-
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
@@ -20774,6 +20995,9 @@ msgstr ""
msgid "MaxBuilds"
msgstr ""
+msgid "Maximum 20 characters"
+msgstr ""
+
msgid "Maximum Conan package file size in bytes"
msgstr ""
@@ -20894,6 +21118,9 @@ msgstr ""
msgid "Maximum number of %{name} (%{count}) exceeded"
msgstr ""
+msgid "Maximum number of changes (branches or tags) in a single push for which webhooks and services trigger (default is 3)."
+msgstr ""
+
msgid "Maximum number of comments exceeded"
msgstr ""
@@ -20903,7 +21130,10 @@ msgstr ""
msgid "Maximum number of projects."
msgstr ""
-msgid "Maximum number of unique IPs per user"
+msgid "Maximum number of requests per minute for each raw path (default is 300). Set to 0 to disable throttling."
+msgstr ""
+
+msgid "Maximum number of unique IP addresses per user."
msgstr ""
msgid "Maximum page reached"
@@ -20957,10 +21187,10 @@ msgstr ""
msgid "Maximum time between updates that a mirror can have when scheduled to synchronize."
msgstr ""
-msgid "Maximum time for web terminal websocket connection (in seconds). 0 for unlimited."
+msgid "Maximum time that users are allowed to skip the setup of two-factor authentication (in hours). Set to 0 (zero) to enforce at next sign in."
msgstr ""
-msgid "Maximum time that users are allowed to skip the setup of two-factor authentication (in hours). Set to 0 (zero) to enforce at next sign in."
+msgid "Maximum time, in seconds, for a web terminal websocket connection. 0 for unlimited."
msgstr ""
msgid "Maximum unauthenticated API requests per rate limit period per IP"
@@ -21083,9 +21313,6 @@ msgstr ""
msgid "Members|Expiration date updated successfully."
msgstr ""
-msgid "Members|Expired"
-msgstr ""
-
msgid "Members|Filter members"
msgstr ""
@@ -21101,9 +21328,6 @@ msgstr ""
msgid "Members|Membership"
msgstr ""
-msgid "Members|No expiration set"
-msgstr ""
-
msgid "Members|Remove \"%{groupName}\""
msgstr ""
@@ -21125,9 +21349,6 @@ msgstr ""
msgid "Members|Search invited"
msgstr ""
-msgid "Members|in %{time}"
-msgstr ""
-
msgid "Member|Deny access"
msgstr ""
@@ -21218,6 +21439,9 @@ msgstr ""
msgid "Merge request events"
msgstr ""
+msgid "Merge request reports"
+msgstr ""
+
msgid "Merge request was scheduled to merge after pipeline succeeds"
msgstr ""
@@ -21446,34 +21670,28 @@ msgstr ""
msgid "Metrics and profiling"
msgstr ""
-msgid "Metrics::Dashboard::Annotation|Annotation can't belong to both a cluster and an environment at the same time"
-msgstr ""
-
-msgid "Metrics::Dashboard::Annotation|Annotation has not been deleted"
-msgstr ""
-
-msgid "Metrics::Dashboard::Annotation|Annotation must belong to a cluster or an environment"
+msgid "MetricsDashboardAnnotation|Annotation can't belong to both a cluster and an environment at the same time"
msgstr ""
-msgid "Metrics::Dashboard::Annotation|Dashboard with requested path can not be found"
+msgid "MetricsDashboardAnnotation|Annotation has not been deleted"
msgstr ""
-msgid "Metrics::Dashboard::Annotation|You are not authorized to create annotation for selected cluster"
+msgid "MetricsDashboardAnnotation|Annotation must belong to a cluster or an environment"
msgstr ""
-msgid "Metrics::Dashboard::Annotation|You are not authorized to create annotation for selected environment"
+msgid "MetricsDashboardAnnotation|Dashboard with requested path can not be found"
msgstr ""
-msgid "Metrics::Dashboard::Annotation|You are not authorized to delete this annotation"
+msgid "MetricsDashboardAnnotation|You are not authorized to create annotation for selected cluster"
msgstr ""
-msgid "Metrics::Dashboard::Annotation|can't be before starting_at time"
+msgid "MetricsDashboardAnnotation|You are not authorized to create annotation for selected environment"
msgstr ""
-msgid "Metrics::UsersStarredDashboards|Dashboard with requested path can not be found"
+msgid "MetricsDashboardAnnotation|You are not authorized to delete this annotation"
msgstr ""
-msgid "Metrics::UsersStarredDashboards|You are not authorized to add star to this dashboard"
+msgid "MetricsDashboardAnnotation|can't be before starting_at time"
msgstr ""
msgid "MetricsSettings|Add a button to the metrics dashboard linking directly to your existing external dashboard."
@@ -21500,6 +21718,12 @@ msgstr ""
msgid "MetricsSettings|User's local timezone"
msgstr ""
+msgid "MetricsUsersStarredDashboards|Dashboard with requested path can not be found"
+msgstr ""
+
+msgid "MetricsUsersStarredDashboards|You are not authorized to add star to this dashboard"
+msgstr ""
+
msgid "Metrics|1. Define and preview panel"
msgstr ""
@@ -22116,6 +22340,9 @@ msgstr ""
msgid "MoveIssue|Cannot move issue to project it originates from!"
msgstr ""
+msgid "MoveIssue|Cannot move issues of '%{issue_type}' type."
+msgstr ""
+
msgid "Moved issue to %{label} column in the board."
msgstr ""
@@ -22176,6 +22403,9 @@ msgstr ""
msgid "My company or team"
msgstr ""
+msgid "My topic"
+msgstr ""
+
msgid "My-Reaction"
msgstr ""
@@ -22241,6 +22471,15 @@ 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. To learn more about reducing storage capacity please visit our docs."
msgstr ""
+msgid "NamespaceUserCap|Pending users must be reviewed and approved by a group owner. Learn more about %{user_caps_link_start}User Caps%{link_end} and %{users_pending_approval_link_start}Users Pending Approval%{link_end}."
+msgstr ""
+
+msgid "NamespaceUserCap|View pending user approvals"
+msgstr ""
+
+msgid "NamespaceUserCap|Your group has reached its billable member limit"
+msgstr ""
+
msgid "Namespaces"
msgstr ""
@@ -22358,9 +22597,6 @@ msgstr ""
msgid "NetworkPolicies|IP/subnet"
msgstr ""
-msgid "NetworkPolicies|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
-msgstr ""
-
msgid "NetworkPolicies|Invalid or empty policy"
msgstr ""
@@ -22382,30 +22618,18 @@ msgstr ""
msgid "NetworkPolicies|Network traffic"
msgstr ""
-msgid "NetworkPolicies|New policy"
-msgstr ""
-
-msgid "NetworkPolicies|No policies detected"
-msgstr ""
-
msgid "NetworkPolicies|None selected"
msgstr ""
msgid "NetworkPolicies|Please %{installLinkStart}install%{installLinkEnd} and %{configureLinkStart}configure a Kubernetes Agent for this project%{configureLinkEnd} to enable alerts."
msgstr ""
-msgid "NetworkPolicies|Policies are a specification of how groups of pods are allowed to communicate with each other's network endpoints."
-msgstr ""
-
msgid "NetworkPolicies|Policy %{policyName} was successfully changed"
msgstr ""
msgid "NetworkPolicies|Policy definition"
msgstr ""
-msgid "NetworkPolicies|Policy editor"
-msgstr ""
-
msgid "NetworkPolicies|Rule"
msgstr ""
@@ -22606,6 +22830,9 @@ msgstr ""
msgid "New issue"
msgstr ""
+msgid "New issue in %{project}"
+msgstr ""
+
msgid "New issue title"
msgstr ""
@@ -22672,6 +22899,9 @@ msgstr ""
msgid "New test case"
msgstr ""
+msgid "New topic"
+msgstr ""
+
msgid "New users set to external"
msgstr ""
@@ -22684,7 +22914,7 @@ msgstr ""
msgid "Newest first"
msgstr ""
-msgid "Newly registered users will by default be external"
+msgid "Newly-registered users are external by default"
msgstr ""
msgid "Next"
@@ -22786,7 +23016,7 @@ msgstr ""
msgid "No compliance frameworks are in use. Create one from the %{link} section in Group Settings."
msgstr ""
-msgid "No confirmation email received? Please check your spam folder or"
+msgid "No confirmation email received? Check your spam folder or %{request_link_start}request new confirmation email%{request_link_end}."
msgstr ""
msgid "No connection could be made to a Gitaly Server, please check your logs!"
@@ -22801,6 +23031,9 @@ msgstr ""
msgid "No contributions were found"
msgstr ""
+msgid "No credit card data for matching"
+msgstr ""
+
msgid "No credit card required."
msgstr ""
@@ -22996,6 +23229,9 @@ msgstr ""
msgid "No vulnerabilities present"
msgstr ""
+msgid "No webhook events"
+msgstr ""
+
msgid "No webhooks found, add one in the form above."
msgstr ""
@@ -23052,9 +23288,6 @@ msgstr ""
msgid "Not available for protected branches"
msgstr ""
-msgid "Not available to run jobs."
-msgstr ""
-
msgid "Not confidential"
msgstr ""
@@ -23288,18 +23521,15 @@ msgstr ""
msgid "Number of LOCs per commit"
msgstr ""
-msgid "Number of changes (branches or tags) in a single push to determine whether individual push events or bulk push event will be created. Bulk push event will be created if it surpasses that value."
-msgstr ""
-
-msgid "Number of changes (branches or tags) in a single push to determine whether webhooks and services will be fired or not. Webhooks and services won't be submitted if it surpasses that value."
-msgstr ""
-
msgid "Number of commits"
msgstr ""
msgid "Number of commits per MR"
msgstr ""
+msgid "Number of employees"
+msgstr ""
+
msgid "Number of events"
msgstr ""
@@ -23435,7 +23665,7 @@ msgstr ""
msgid "OnCallSchedules|For this rotation, on-call will be:"
msgstr ""
-msgid "OnCallSchedules|On-call schedule %{schedule} in Project %{project}"
+msgid "OnCallSchedules|On-call schedule %{obstacle} in Project %{project}"
msgstr ""
msgid "OnCallSchedules|On-call schedules"
@@ -23519,6 +23749,9 @@ msgstr ""
msgid "OnCallSchedules|Your schedule has been successfully created. To add individual users to this schedule, use the Add a rotation button. To enable notifications for this schedule, you must also create an %{linkStart}escalation policy%{linkEnd}."
msgstr ""
+msgid "OnDemandScans|%{learnMoreLinkStart}Lean more about on-demand scans%{learnMoreLinkEnd}."
+msgstr ""
+
msgid "OnDemandScans|Could not fetch scanner profiles. Please refresh the page, or try again later."
msgstr ""
@@ -23555,6 +23788,9 @@ msgstr ""
msgid "OnDemandScans|My daily scan"
msgstr ""
+msgid "OnDemandScans|New DAST scan"
+msgstr ""
+
msgid "OnDemandScans|New on-demand DAST scan"
msgstr ""
@@ -23567,6 +23803,12 @@ msgstr ""
msgid "OnDemandScans|On-demand Scans"
msgstr ""
+msgid "OnDemandScans|On-demand scans"
+msgstr ""
+
+msgid "OnDemandScans|On-demand scans run outside of DevOps cycle and find vulnerabilities in your projects. %{learnMoreLinkStart}Learn more%{learnMoreLinkEnd}."
+msgstr ""
+
msgid "OnDemandScans|On-demand scans run outside the DevOps cycle and find vulnerabilities in your projects. %{learnMoreLinkStart}Learn more%{learnMoreLinkEnd}"
msgstr ""
@@ -23594,6 +23836,15 @@ msgstr ""
msgid "OnDemandScans|Start time"
msgstr ""
+msgid "OnDemandScans|There are no finished scans."
+msgstr ""
+
+msgid "OnDemandScans|There are no running scans."
+msgstr ""
+
+msgid "OnDemandScans|There are no scheduled scans."
+msgstr ""
+
msgid "OnDemandScans|Use existing scanner profile"
msgstr ""
@@ -23662,6 +23913,9 @@ msgstr ""
msgid "Only admins can delete project"
msgstr ""
+msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
+msgstr ""
+
msgid "Only include features new to your current subscription tier."
msgstr ""
@@ -23680,6 +23934,12 @@ msgstr ""
msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
+msgid "Only reCAPTCHA v2 is supported:"
+msgstr ""
+
+msgid "Only users from the specified IP address ranges are able to reach this group, including all subgroups, projects, and Git repositories."
+msgstr ""
+
msgid "Only verified users with an email address in any of these domains can be added to the group."
msgstr ""
@@ -23698,15 +23958,15 @@ msgstr ""
msgid "Open a CLI and connect to the cluster you want to install the Agent in. Use this installation method to minimize any manual steps. The token is already included in the command."
msgstr ""
-msgid "Open comment type dropdown"
-msgstr ""
-
msgid "Open epics"
msgstr ""
msgid "Open errors"
msgstr ""
+msgid "Open in Web IDE"
+msgstr ""
+
msgid "Open in file view"
msgstr ""
@@ -23755,9 +24015,6 @@ msgstr ""
msgid "Operation timed out. Check pod logs for %{pod_name} for more details."
msgstr ""
-msgid "Operations"
-msgstr ""
-
msgid "Operations Dashboard"
msgstr ""
@@ -23785,6 +24042,9 @@ msgstr ""
msgid "Optional parameter \"variables\" must be a Hash. Ex: variables[key1]=value1"
msgstr ""
+msgid "Optional."
+msgstr ""
+
msgid "Optionally, you can %{link_to_customize} how FogBugz email addresses and usernames are imported into GitLab."
msgstr ""
@@ -23863,6 +24123,36 @@ msgstr ""
msgid "Owner"
msgstr ""
+msgid "PQL|An error occurred while sending hand raise lead."
+msgstr ""
+
+msgid "PQL|By providing my contact information, I agree GitLab may contact me via email about its product, services and events. You may opt-out at any time by unsubscribing in emails or visiting our communication preference center."
+msgstr ""
+
+msgid "PQL|Cancel"
+msgstr ""
+
+msgid "PQL|Contact our Sales team"
+msgstr ""
+
+msgid "PQL|Contact sales"
+msgstr ""
+
+msgid "PQL|Hello %{userName}. Before putting you in touch with our sales team, we would like you to verify and complete the information below."
+msgstr ""
+
+msgid "PQL|Message for the Sales team (optional)"
+msgstr ""
+
+msgid "PQL|Please select a city or state"
+msgstr ""
+
+msgid "PQL|Submit information"
+msgstr ""
+
+msgid "PQL|Thank you for reaching out! Our sales team will get back to you soon."
+msgstr ""
+
msgid "Package Registry"
msgstr ""
@@ -23938,9 +24228,6 @@ msgstr ""
msgid "PackageRegistry|Allow duplicates"
msgstr ""
-msgid "PackageRegistry|An error occurred while saving the settings"
-msgstr ""
-
msgid "PackageRegistry|App group: %{group}"
msgstr ""
@@ -24088,6 +24375,9 @@ msgstr ""
msgid "PackageRegistry|Install package version"
msgstr ""
+msgid "PackageRegistry|Instance-level"
+msgstr ""
+
msgid "PackageRegistry|Invalid Package: failed metadata extraction"
msgstr ""
@@ -24121,11 +24411,10 @@ msgstr ""
msgid "PackageRegistry|Package file deleted successfully"
msgstr ""
-msgid "PackageRegistry|Package has %{number} archived update"
-msgstr ""
-
-msgid "PackageRegistry|Package has %{number} archived updates"
-msgstr ""
+msgid "PackageRegistry|Package has %{updatesCount} archived update"
+msgid_plural "PackageRegistry|Package has %{updatesCount} archived updates"
+msgstr[0] ""
+msgstr[1] ""
msgid "PackageRegistry|Package updated by commit %{link} on branch %{branch}, built by pipeline %{pipeline}, and published to the registry %{datetime}"
msgstr ""
@@ -24133,6 +24422,9 @@ msgstr ""
msgid "PackageRegistry|Pip Command"
msgstr ""
+msgid "PackageRegistry|Project-level"
+msgstr ""
+
msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
msgstr ""
@@ -24166,9 +24458,6 @@ msgstr ""
msgid "PackageRegistry|Settings for Maven packages"
msgstr ""
-msgid "PackageRegistry|Settings saved successfully"
-msgstr ""
-
msgid "PackageRegistry|Show Composer commands"
msgstr ""
@@ -24370,6 +24659,18 @@ msgstr ""
msgid "Password was successfully updated. Please sign in again."
msgstr ""
+msgid "PasswordPrompt|Confirm password"
+msgstr ""
+
+msgid "PasswordPrompt|Confirm password to continue"
+msgstr ""
+
+msgid "PasswordPrompt|Password is required"
+msgstr ""
+
+msgid "PasswordPrompt|Please enter your password to confirm"
+msgstr ""
+
msgid "Passwords should be unique and not used for any other sites or services."
msgstr ""
@@ -24397,6 +24698,9 @@ msgstr ""
msgid "Paste project path (i.e. gitlab-org/gitlab)"
msgstr ""
+msgid "Paste this DSN into your Sentry SDK"
+msgstr ""
+
msgid "Paste your public SSH key, which is usually contained in the file '~/.ssh/id_ed25519.pub' or '~/.ssh/id_rsa.pub' and begins with 'ssh-ed25519' or 'ssh-rsa'. Do not paste your private SSH key, as that can compromise your identity."
msgstr ""
@@ -24433,6 +24737,9 @@ msgstr ""
msgid "Pending comments"
msgstr ""
+msgid "Pending owner approval"
+msgstr ""
+
msgid "Pending sync…"
msgstr ""
@@ -24481,6 +24788,9 @@ msgstr ""
msgid "PerformanceBar|First Contentful Paint"
msgstr ""
+msgid "PerformanceBar|Flamegraph with mode:"
+msgstr ""
+
msgid "PerformanceBar|Frontend resources"
msgstr ""
@@ -24514,6 +24824,15 @@ msgstr ""
msgid "PerformanceBar|Trace"
msgstr ""
+msgid "PerformanceBar|cpu"
+msgstr ""
+
+msgid "PerformanceBar|object"
+msgstr ""
+
+msgid "PerformanceBar|wall"
+msgstr ""
+
msgid "Period in seconds"
msgstr ""
@@ -24742,6 +25061,48 @@ msgstr ""
msgid "PipelineSchedules|Variables"
msgstr ""
+msgid "PipelineSource|API"
+msgstr ""
+
+msgid "PipelineSource|Chat"
+msgstr ""
+
+msgid "PipelineSource|External"
+msgstr ""
+
+msgid "PipelineSource|External Pull Request"
+msgstr ""
+
+msgid "PipelineSource|Merge Request"
+msgstr ""
+
+msgid "PipelineSource|On-Demand DAST Scan"
+msgstr ""
+
+msgid "PipelineSource|On-Demand DAST Validation"
+msgstr ""
+
+msgid "PipelineSource|Parent Pipeline"
+msgstr ""
+
+msgid "PipelineSource|Pipeline"
+msgstr ""
+
+msgid "PipelineSource|Push"
+msgstr ""
+
+msgid "PipelineSource|Schedule"
+msgstr ""
+
+msgid "PipelineSource|Trigger"
+msgstr ""
+
+msgid "PipelineSource|Web"
+msgstr ""
+
+msgid "PipelineSource|Web IDE"
+msgstr ""
+
msgid "PipelineStatusTooltip|Pipeline: %{ciStatus}"
msgstr ""
@@ -25042,46 +25403,7 @@ msgstr ""
msgid "Pipeline|Source"
msgstr ""
-msgid "Pipeline|Source|API"
-msgstr ""
-
-msgid "Pipeline|Source|Chat"
-msgstr ""
-
-msgid "Pipeline|Source|External"
-msgstr ""
-
-msgid "Pipeline|Source|External Pull Request"
-msgstr ""
-
-msgid "Pipeline|Source|Merge Request"
-msgstr ""
-
-msgid "Pipeline|Source|On-Demand DAST Scan"
-msgstr ""
-
-msgid "Pipeline|Source|On-Demand DAST Validation"
-msgstr ""
-
-msgid "Pipeline|Source|Parent Pipeline"
-msgstr ""
-
-msgid "Pipeline|Source|Pipeline"
-msgstr ""
-
-msgid "Pipeline|Source|Push"
-msgstr ""
-
-msgid "Pipeline|Source|Schedule"
-msgstr ""
-
-msgid "Pipeline|Source|Trigger"
-msgstr ""
-
-msgid "Pipeline|Source|Web"
-msgstr ""
-
-msgid "Pipeline|Source|Web IDE"
+msgid "Pipeline|Source|Security Policy"
msgstr ""
msgid "Pipeline|Specify variable values to be used in this run. The values specified in %{linkStart}CI/CD settings%{linkEnd} will be used by default."
@@ -25132,7 +25454,7 @@ msgstr ""
msgid "Pipeline|We are currently unable to fetch pipeline data"
msgstr ""
-msgid "Pipeline|You’re about to stop pipeline %{pipelineId}."
+msgid "Pipeline|You’re about to stop pipeline #%{pipelineId}."
msgstr ""
msgid "Pipeline|for"
@@ -25267,6 +25589,9 @@ msgstr ""
msgid "Please fill in a descriptive name for your group."
msgstr ""
+msgid "Please fill in a name for your topic."
+msgstr ""
+
msgid "Please fill out this field."
msgstr ""
@@ -25306,9 +25631,6 @@ msgstr ""
msgid "Please provide attributes to update"
msgstr ""
-msgid "Please provide your username or email address."
-msgstr ""
-
msgid "Please reach out if you have any questions and we'll be happy to assist."
msgstr ""
@@ -25351,9 +25673,6 @@ msgstr ""
msgid "Please set a new password before proceeding."
msgstr ""
-msgid "Please share your feedback about %{featureName} %{linkStart}in this issue%{linkEnd} to help us improve the experience."
-msgstr ""
-
msgid "Please solve the captcha"
msgstr ""
@@ -25531,6 +25850,9 @@ msgstr ""
msgid "Prevent adding new members to project membership within this group"
msgstr ""
+msgid "Prevent auto-stopping"
+msgstr ""
+
msgid "Prevent editing approval rules in projects and merge requests."
msgstr ""
@@ -25816,6 +26138,9 @@ msgstr ""
msgid "Profiles|Enter your name, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Enter your password to confirm the email change"
+msgstr ""
+
msgid "Profiles|Enter your pronouns to let people know how to refer to you"
msgstr ""
@@ -26023,6 +26348,9 @@ msgstr ""
msgid "Profiles|You don't have access to delete this user."
msgstr ""
+msgid "Profiles|You must accept the Terms of Service in order to perform this action."
+msgstr ""
+
msgid "Profiles|You must transfer ownership or delete groups you are an owner of before you can delete your account"
msgstr ""
@@ -26881,6 +27209,9 @@ msgstr ""
msgid "ProjectsNew|Allows you to immediately clone this project’s repository. Skip this if you plan to push up an existing repository."
msgstr ""
+msgid "ProjectsNew|Analyze your source code for known security vulnerabilities."
+msgstr ""
+
msgid "ProjectsNew|Connect your external repository to GitLab CI/CD."
msgstr ""
@@ -26908,6 +27239,9 @@ msgstr ""
msgid "ProjectsNew|Description format"
msgstr ""
+msgid "ProjectsNew|Enable Static Application Security Testing (SAST)"
+msgstr ""
+
msgid "ProjectsNew|Import"
msgstr ""
@@ -26923,6 +27257,9 @@ msgstr ""
msgid "ProjectsNew|No import options available"
msgstr ""
+msgid "ProjectsNew|Project Configuration"
+msgstr ""
+
msgid "ProjectsNew|Project description %{tag_start}(optional)%{tag_end}"
msgstr ""
@@ -27718,6 +28055,9 @@ msgstr ""
msgid "Read more about related issues"
msgstr ""
+msgid "Read their documentation."
+msgstr ""
+
msgid "Ready to get started with GitLab? Follow these steps to set up your workspace, plan and commit changes, and deploy your project."
msgstr ""
@@ -27751,6 +28091,9 @@ msgstr ""
msgid "Receive any notifications from GitLab."
msgstr ""
+msgid "Receive notification of abuse reports by email."
+msgstr ""
+
msgid "Receive notifications about your own activity"
msgstr ""
@@ -27760,15 +28103,15 @@ msgstr ""
msgid "Recent"
msgstr ""
-msgid "Recent Deliveries"
-msgstr ""
-
msgid "Recent Project Activity"
msgstr ""
msgid "Recent Searches Service is unavailable"
msgstr ""
+msgid "Recent events"
+msgstr ""
+
msgid "Recent jobs served by this runner"
msgstr ""
@@ -28591,9 +28934,6 @@ msgstr ""
msgid "Request details"
msgstr ""
-msgid "Request new confirmation email"
-msgstr ""
-
msgid "Request parameter %{param} is missing."
msgstr ""
@@ -28642,9 +28982,6 @@ msgstr ""
msgid "Require all users in this group to set up two-factor authentication"
msgstr ""
-msgid "Require all users in this group to setup two-factor authentication"
-msgstr ""
-
msgid "Required approvals (%{approvals_given} given)"
msgstr ""
@@ -28675,13 +29012,13 @@ msgstr ""
msgid "Requirements can be based on users, stakeholders, system, software, or anything else you find important to capture."
msgstr ""
-msgid "Requires approval from %{names}."
-msgid_plural "Requires %{count} more approvals from %{names}."
+msgid "Requires %d approval from eligible users."
+msgid_plural "Requires %d approvals from eligible users."
msgstr[0] ""
msgstr[1] ""
-msgid "Requires approval."
-msgid_plural "Requires %d more approvals."
+msgid "Requires %{count} approval from %{names}."
+msgid_plural "Requires %{count} approvals from %{names}."
msgstr[0] ""
msgstr[1] ""
@@ -28808,6 +29145,9 @@ msgstr ""
msgid "Response text"
msgstr ""
+msgid "Restart GitLab to apply changes."
+msgstr ""
+
msgid "Restart Terminal"
msgstr ""
@@ -28826,6 +29166,9 @@ msgstr ""
msgid "Restoring the project will prevent the project from being removed on this date and restore people's ability to make changes to it."
msgstr ""
+msgid "Restrict group access by IP address. %{link_start}Learn more%{link_end}."
+msgstr ""
+
msgid "Restrict membership by email domain"
msgstr ""
@@ -29022,9 +29365,6 @@ msgstr ""
msgid "Runners are processes that pick up and execute CI/CD jobs for GitLab."
msgstr ""
-msgid "Runners can be:"
-msgstr ""
-
msgid "Runners currently online: %{active_runners_count}"
msgstr ""
@@ -29049,6 +29389,15 @@ msgstr ""
msgid "Runners|Are you sure you want to delete this runner?"
msgstr ""
+msgid "Runners|Associated with one or more projects"
+msgstr ""
+
+msgid "Runners|Available to all projects"
+msgstr ""
+
+msgid "Runners|Available to all projects and subgroups in the group"
+msgstr ""
+
msgid "Runners|Can run untagged jobs"
msgstr ""
@@ -29109,6 +29458,9 @@ msgstr ""
msgid "Runners|New runner, has not connected yet"
msgstr ""
+msgid "Runners|Not available to run jobs"
+msgstr ""
+
msgid "Runners|Not connected"
msgstr ""
@@ -29232,6 +29584,9 @@ 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 cannot assign to other projects"
+msgstr ""
+
msgid "Runners|You have used %{quotaUsed} out of %{quotaLimit} of your shared Runners pipeline minutes."
msgstr ""
@@ -29262,15 +29617,6 @@ msgstr ""
msgid "Runs a number of housekeeping tasks within the current repository, such as compressing file revisions and removing unreachable objects."
msgstr ""
-msgid "Runs jobs from all unassigned projects in its group."
-msgstr ""
-
-msgid "Runs jobs from all unassigned projects."
-msgstr ""
-
-msgid "Runs jobs from assigned projects."
-msgstr ""
-
msgid "SAML"
msgstr ""
@@ -29391,7 +29737,7 @@ msgstr ""
msgid "Save pipeline schedule"
msgstr ""
-msgid "Save space and find images in the container Registry. remove unneeded tags and keep only the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
+msgid "Save storage space by automatically deleting tags from the container registry and keeping the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
msgstr ""
msgid "Saving"
@@ -29628,16 +29974,16 @@ msgstr ""
msgid "SearchCodeResults|of %{link_to_project}"
msgstr ""
-msgid "SearchResults|Showing %{count} %{scope} for%{term_element}"
+msgid "SearchResults|Showing %{count} %{scope} for %{term_element}"
msgstr ""
-msgid "SearchResults|Showing %{count} %{scope} for%{term_element} in your personal and project snippets"
+msgid "SearchResults|Showing %{count} %{scope} for %{term_element} in your personal and project snippets"
msgstr ""
-msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for%{term_element}"
+msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for %{term_element}"
msgstr ""
-msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for%{term_element} in your personal and project snippets"
+msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for %{term_element} in your personal and project snippets"
msgstr ""
msgid "SearchResults|code result"
@@ -29761,9 +30107,6 @@ msgstr ""
msgid "SecurityApprovals|A merge request approval is required when the license compliance report contains a denied license."
msgstr ""
-msgid "SecurityApprovals|Configurable if security scanners are enabled. %{linkStart}Learn more.%{linkEnd}"
-msgstr ""
-
msgid "SecurityApprovals|Coverage-Check"
msgstr ""
@@ -29776,9 +30119,6 @@ msgstr ""
msgid "SecurityApprovals|Learn more about Vulnerability-Check"
msgstr ""
-msgid "SecurityApprovals|License Scanning must be enabled. %{linkStart}Learn more%{linkEnd}."
-msgstr ""
-
msgid "SecurityApprovals|License-Check"
msgstr ""
@@ -29791,9 +30131,6 @@ msgstr ""
msgid "SecurityApprovals|Requires approval for vulnerabilities. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
-msgid "SecurityApprovals|Test coverage must be enabled. %{linkStart}Learn more%{linkEnd}."
-msgstr ""
-
msgid "SecurityApprovals|Vulnerability-Check"
msgstr ""
@@ -30079,6 +30416,9 @@ msgstr ""
msgid "SecurityReports|Create issue"
msgstr ""
+msgid "SecurityReports|Development vulnerabilities"
+msgstr ""
+
msgid "SecurityReports|Dismiss vulnerability"
msgstr ""
@@ -30172,6 +30512,9 @@ msgstr ""
msgid "SecurityReports|Oops, something doesn't seem right."
msgstr ""
+msgid "SecurityReports|Operational vulnerabilities"
+msgstr ""
+
msgid "SecurityReports|Project"
msgstr ""
@@ -30220,6 +30563,9 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
+msgid "SecurityReports|The Vulnerability Report shows the results of the lastest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "SecurityReports|The security reports below contain one or more vulnerability findings that could not be parsed and were not recorded. Download the artifacts in the job output to investigate. Ensure any security report created conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
msgstr ""
@@ -30331,10 +30677,10 @@ msgstr ""
msgid "Select a branch"
msgstr ""
-msgid "Select a file from the left sidebar to begin editing. Afterwards, you'll be able to commit your changes."
+msgid "Select a compliance framework to apply to this project. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
-msgid "Select a framework that applies to this project. %{linkStart}How are these added?%{linkEnd}"
+msgid "Select a file from the left sidebar to begin editing. Afterwards, you'll be able to commit your changes."
msgstr ""
msgid "Select a group to invite"
@@ -30352,21 +30698,15 @@ msgstr ""
msgid "Select a project"
msgstr ""
-msgid "Select a project to read Insights configuration file"
-msgstr ""
-
msgid "Select a reason"
msgstr ""
-msgid "Select a repository"
+msgid "Select a repository containing templates for common files."
msgstr ""
msgid "Select a role"
msgstr ""
-msgid "Select a shared template repository for all projects on this instance."
-msgstr ""
-
msgid "Select a template repository"
msgstr ""
@@ -30442,6 +30782,9 @@ msgstr ""
msgid "Select project to choose zone"
msgstr ""
+msgid "Select project to create issue"
+msgstr ""
+
msgid "Select projects"
msgstr ""
@@ -30616,9 +30959,6 @@ msgstr ""
msgid "Serverless"
msgstr ""
-msgid "Serverless domain"
-msgstr ""
-
msgid "Serverless platform"
msgstr ""
@@ -30697,6 +31037,9 @@ msgstr ""
msgid "Service"
msgstr ""
+msgid "Service Accounts keys are required to authorize GitLab to deploy your Google Cloud project."
+msgstr ""
+
msgid "Service Desk"
msgstr ""
@@ -30769,15 +31112,9 @@ msgstr ""
msgid "Set a password on your account to pull or push via %{protocol}."
msgstr ""
-msgid "Set a template repository for projects in this group"
-msgstr ""
-
msgid "Set access permissions for this token."
msgstr ""
-msgid "Set an instance-wide domain that will be available to all clusters when installing Knative."
-msgstr ""
-
msgid "Set any rate limit to %{code_open}0%{code_close} to disable the limit."
msgstr ""
@@ -30796,18 +31133,12 @@ msgstr ""
msgid "Set limits for web and API requests."
msgstr ""
-msgid "Set max session time for web terminal."
-msgstr ""
-
msgid "Set milestone"
msgstr ""
msgid "Set new password"
msgstr ""
-msgid "Set notification email for abuse reports."
-msgstr ""
-
msgid "Set parent epic to an epic"
msgstr ""
@@ -30847,6 +31178,9 @@ msgstr ""
msgid "Set the iteration to %{iteration_reference}."
msgstr ""
+msgid "Set the maximum session time for a web terminal."
+msgstr ""
+
msgid "Set the milestone to %{milestone_reference}."
msgstr ""
@@ -30976,6 +31310,11 @@ msgstr ""
msgid "Setting enforced"
msgstr ""
+msgid "Setting saved successfully"
+msgid_plural "Settings saved successfully"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Setting this to 0 means using the system default timeout value."
msgstr ""
@@ -31054,6 +31393,9 @@ msgstr ""
msgid "Show Pipeline IID"
msgstr ""
+msgid "Show all %{issuable_type}."
+msgstr ""
+
msgid "Show all activity"
msgstr ""
@@ -31154,6 +31496,9 @@ msgstr ""
msgid "Showing all issues"
msgstr ""
+msgid "Showing data for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
+msgstr ""
+
msgid "Showing data for workflow items created in this date range. Date range cannot exceed %{maxDateRange} days."
msgstr ""
@@ -31322,6 +31667,9 @@ msgstr ""
msgid "Site profile not found for given parameters"
msgstr ""
+msgid "Sites"
+msgstr ""
+
msgid "Size"
msgstr ""
@@ -31379,6 +31727,9 @@ msgstr ""
msgid "Smartcard authentication failed: client certificate header is missing."
msgstr ""
+msgid "Snippet"
+msgstr ""
+
msgid "Snippets"
msgstr ""
@@ -31403,6 +31754,9 @@ msgstr ""
msgid "SnippetsEmptyState|There are no snippets to show."
msgstr ""
+msgid "Snippets|%{spammable_titlecase} was submitted to Akismet successfully."
+msgstr ""
+
msgid "Snippets|Add another file %{num}/%{total}"
msgstr ""
@@ -31412,6 +31766,9 @@ msgstr ""
msgid "Snippets|Description (optional)"
msgstr ""
+msgid "Snippets|Error with Akismet. Please check the logs for more info."
+msgstr ""
+
msgid "Snippets|Files"
msgstr ""
@@ -31433,10 +31790,7 @@ msgstr ""
msgid "Some child epics may be hidden due to applied filters"
msgstr ""
-msgid "Some common domains are not allowed. %{read_more_link}."
-msgstr ""
-
-msgid "Some of the designs you tried uploading did not change:"
+msgid "Some common domains are not allowed. %{learn_more_link}."
msgstr ""
msgid "Someone edited the issue at the same time you did. Please check out %{linkStart}the issue%{linkEnd} and make sure your changes will not unintentionally remove theirs."
@@ -31901,7 +32255,10 @@ msgstr ""
msgid "SourcegraphPreferences|Uses a custom %{linkStart}Sourcegraph instance%{linkEnd}."
msgstr ""
-msgid "Spam Check API Key"
+msgid "Spam Check"
+msgstr ""
+
+msgid "Spam Check API key"
msgstr ""
msgid "Spam Logs"
@@ -31919,7 +32276,7 @@ msgstr ""
msgid "Specified URL cannot be used: \"%{reason}\""
msgstr ""
-msgid "Specify an e-mail address regex pattern to identify default internal users."
+msgid "Specify an email address regex pattern to identify default internal users."
msgstr ""
msgid "Speed up your pipelines with Needs relationships"
@@ -32030,12 +32387,6 @@ msgstr ""
msgid "Start thread"
msgstr ""
-msgid "Start thread & close %{noteable_name}"
-msgstr ""
-
-msgid "Start thread & reopen %{noteable_name}"
-msgstr ""
-
msgid "Start your Free Ultimate Trial"
msgstr ""
@@ -32075,6 +32426,9 @@ msgstr ""
msgid "State your message to activate"
msgstr ""
+msgid "State/Province/City"
+msgstr ""
+
msgid "Static Application Security Testing (SAST)"
msgstr ""
@@ -32174,7 +32528,7 @@ msgstr ""
msgid "StatusCheck|An error occurred fetching the status checks."
msgstr ""
-msgid "StatusCheck|Apply this status check to any branch or a specific protected branch."
+msgid "StatusCheck|Apply this status check to all branches or a specific protected branch."
msgstr ""
msgid "StatusCheck|Check for a status response in Merge Requests. Failures do not block merges. %{link_start}Learn more%{link_end}."
@@ -32513,9 +32867,6 @@ msgstr ""
msgid "Subscriptions"
msgstr ""
-msgid "Subscription|Renew your subscription"
-msgstr ""
-
msgid "Subscription|Your subscription for %{strong}%{namespace_name}%{strong_close} has expired and you are now on %{pricing_link_start}the GitLab Free tier%{pricing_link_end}. Don't worry, your data is safe. Get in touch with our support team (%{support_email}). They'll gladly help with your subscription renewal."
msgstr ""
@@ -32576,7 +32927,7 @@ msgstr ""
msgid "Successfully updated %{last_updated_timeago}."
msgstr ""
-msgid "Successfully verified domain ownership"
+msgid "Successfully updated the environment."
msgstr ""
msgid "Suggest code changes which can be immediately applied in one click. Try it out!"
@@ -32747,6 +33098,9 @@ msgstr ""
msgid "SuperSonics|Plan"
msgstr ""
+msgid "SuperSonics|Please agree to the Subscription Agreement"
+msgstr ""
+
msgid "SuperSonics|Ready to get started? A GitLab plan is ideal for scaling organizations and for multi team usage."
msgstr ""
@@ -32777,6 +33131,9 @@ msgstr ""
msgid "SuperSonics|The activation code is not valid. Please make sure to copy it exactly from the Customers Portal or confirmation email. Learn more about %{linkStart}activating your subscription%{linkEnd}."
msgstr ""
+msgid "SuperSonics|The activation code should be a 24-character alphanumeric string"
+msgstr ""
+
msgid "SuperSonics|There is a connectivity issue."
msgstr ""
@@ -32819,9 +33176,15 @@ msgstr ""
msgid "SuperSonics|You do not have an active subscription"
msgstr ""
+msgid "SuperSonics|You have successfully added a license that activates on %{date}. Please see the subscription history table below for more details."
+msgstr ""
+
msgid "SuperSonics|You'll be charged for %{trueUpLinkStart}users over license%{trueUpLinkEnd} on a quarterly or annual basis, depending on the terms of your agreement."
msgstr ""
+msgid "SuperSonics|Your future dated license was successfully added"
+msgstr ""
+
msgid "SuperSonics|Your subscription"
msgstr ""
@@ -33029,6 +33392,9 @@ msgstr ""
msgid "TagsPage|This tag has no release notes."
msgstr ""
+msgid "TagsPage|Unable to load tags"
+msgstr ""
+
msgid "TagsPage|Use git tag command to add a new one:"
msgstr ""
@@ -33065,6 +33431,9 @@ msgstr ""
msgid "TeamcityIntegration|Trigger TeamCity CI after every push to the repository, except branch delete"
msgstr ""
+msgid "Telephone number"
+msgstr ""
+
msgid "Tell us your experiences with the new Markdown editor %{linkStart}in this feedback issue%{linkEnd}."
msgstr ""
@@ -33074,7 +33443,7 @@ msgstr ""
msgid "Template to append to all Service Desk issues"
msgstr ""
-msgid "TemplateRepository|Select a repository to make its templates available to all projects. %{link_start}What should the repository contain?%{link_end} "
+msgid "TemplateRepository|Create common files more quickly, and standardize their format."
msgstr ""
msgid "Templates"
@@ -33435,7 +33804,10 @@ msgid_plural "The %{type} contains the following errors:"
msgstr[0] ""
msgstr[1] ""
-msgid "The API key used by GitLab for accessing the Spam Check service endpoint"
+msgid "The API key used by GitLab for accessing the Spam Check service endpoint."
+msgstr ""
+
+msgid "The CSV export will be created in the background. Once finished, it will be sent to %{email} in an attachment."
msgstr ""
msgid "The GitLab subscription service (customers.gitlab.com) is currently experiencing an outage. You can monitor the status and get updates at %{linkStart}status.gitlab.com%{linkEnd}."
@@ -33474,9 +33846,6 @@ msgstr ""
msgid "The URL to use for connecting to Elasticsearch. Use a comma-separated list to support clustering (e.g., \"http://localhost:9200, http://localhost:9201\")."
msgstr ""
-msgid "The Vulnerability Report shows the results of the last successful pipeline run on the default branch."
-msgstr ""
-
msgid "The X509 Certificate to use when mutual TLS is required to communicate with the external authorization service. If left blank, the server certificate is still validated when accessing over HTTPS."
msgstr ""
@@ -33540,9 +33909,6 @@ msgstr ""
msgid "The deployment of this job to %{environmentLink} did not succeed."
msgstr ""
-msgid "The designs you tried uploading did not change."
-msgstr ""
-
msgid "The directory has been successfully created."
msgstr ""
@@ -33611,6 +33977,9 @@ msgstr ""
msgid "The form contains the following warning:"
msgstr ""
+msgid "The git server, Gitaly, is not available at this time. Please contact your administrator."
+msgstr ""
+
msgid "The global settings require you to enable Two-Factor Authentication for your account."
msgstr ""
@@ -33695,6 +34064,9 @@ msgstr ""
msgid "The license was successfully uploaded and will be active from %{starts_at}. You can see the details below."
msgstr ""
+msgid "The list creation wizard is already open"
+msgstr ""
+
msgid "The maximum file size allowed is %{size}."
msgstr ""
@@ -33746,9 +34118,6 @@ msgstr ""
msgid "The number of times an upload record could not find its file"
msgstr ""
-msgid "The package registry rate limits can help reduce request volume (like from crawlers or abusive bots)."
-msgstr ""
-
msgid "The page could not be displayed because it timed out."
msgstr ""
@@ -34001,6 +34370,9 @@ msgstr ""
msgid "There are no projects shared with this group yet"
msgstr ""
+msgid "There are no topics to show."
+msgstr ""
+
msgid "There are no variables yet."
msgstr ""
@@ -34142,6 +34514,9 @@ msgstr ""
msgid "There was an error fetching projects"
msgstr ""
+msgid "There was an error fetching search autocomplete suggestions"
+msgstr ""
+
msgid "There was an error fetching stage total counts"
msgstr ""
@@ -34466,6 +34841,9 @@ msgstr ""
msgid "This field is required."
msgstr ""
+msgid "This form is disabled in preview"
+msgstr ""
+
msgid "This group"
msgstr ""
@@ -34487,9 +34865,6 @@ msgstr ""
msgid "This group is linked to a subscription"
msgstr ""
-msgid "This group, including all subgroups, projects and git repositories, will be reachable from only the specified IP address ranges."
-msgstr ""
-
msgid "This group, its subgroups and projects has been scheduled for removal on %{date}."
msgstr ""
@@ -34877,9 +35252,6 @@ msgstr ""
msgid "ThreatMonitoring|Packet Activity"
msgstr ""
-msgid "ThreatMonitoring|Policies"
-msgstr ""
-
msgid "ThreatMonitoring|Requests"
msgstr ""
@@ -34937,6 +35309,9 @@ msgstr ""
msgid "Threshold in bytes at which to reject Sidekiq jobs. Set this to 0 to if you don't want to limit Sidekiq jobs."
msgstr ""
+msgid "Threshold number of changes (branches or tags) in a single push above which a bulk push event is created (default is 3)."
+msgstr ""
+
msgid "Throughput"
msgstr ""
@@ -34946,6 +35321,9 @@ msgstr ""
msgid "Time"
msgstr ""
+msgid "Time (in hours) that users are allowed to skip forced configuration of two-factor authentication."
+msgstr ""
+
msgid "Time Spent"
msgstr ""
@@ -35012,7 +35390,7 @@ msgstr ""
msgid "TimeTrackingEstimated|Est"
msgstr ""
-msgid "TimeTracking|%{startTag}Spent: %{endTag}%{timeSpentHumanReadable}"
+msgid "TimeTracking|%{spentStart}Spent: %{spentEnd}"
msgstr ""
msgid "TimeTracking|Estimated:"
@@ -35250,13 +35628,16 @@ msgstr ""
msgid "To connect an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To continue using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
+msgstr ""
+
msgid "To continue, you need to select the link in the confirmation email we sent to verify your email address. If you didn't get our email, select %{strongStart}Resend confirmation email.%{strongEnd}"
msgstr ""
msgid "To define internal users, first enable new users set to external"
msgstr ""
-msgid "To enable Registration Features, make sure \"Enable service ping\" is checked."
+msgid "To enable Registration Features, first enable Service Ping."
msgstr ""
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
@@ -35283,7 +35664,7 @@ msgstr ""
msgid "To get started, use the link below to confirm your account."
msgstr ""
-msgid "To help improve GitLab and its user experience, GitLab will periodically collect usage information."
+msgid "To help improve GitLab and its user experience, GitLab periodically collects usage information."
msgstr ""
msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
@@ -35355,6 +35736,9 @@ msgstr ""
msgid "To specify the notification level per project of a group you belong to, you need to visit project page and change notification level there."
msgstr ""
+msgid "To start using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
+msgstr ""
+
msgid "To unsubscribe from this issue, please paste the following link into your browser:"
msgstr ""
@@ -35481,6 +35865,21 @@ msgstr ""
msgid "TopNav|Go back"
msgstr ""
+msgid "Topic %{topic_name} was successfully created."
+msgstr ""
+
+msgid "Topic avatar"
+msgstr ""
+
+msgid "Topic name"
+msgstr ""
+
+msgid "Topic was successfully updated."
+msgstr ""
+
+msgid "Topics"
+msgstr ""
+
msgid "Topics (optional)"
msgstr ""
@@ -36020,9 +36419,6 @@ msgstr ""
msgid "Unauthenticated API rate limit period in seconds"
msgstr ""
-msgid "Unauthenticated API request rate limit"
-msgstr ""
-
msgid "Unauthenticated requests"
msgstr ""
@@ -36635,6 +37031,9 @@ msgstr ""
msgid "Use an AWS CloudFormation Template (CFT) to install and configure GitLab Runner in AWS."
msgstr ""
+msgid "Use authorized_keys file to authenticate SSH keys"
+msgstr ""
+
msgid "Use cURL"
msgstr ""
@@ -36665,6 +37064,9 @@ msgstr ""
msgid "Use template"
msgstr ""
+msgid "Use the %{strongStart}Test%{strongEnd} option above to create an event."
+msgstr ""
+
msgid "Use the link below to confirm your email address (%{email})"
msgstr ""
@@ -36731,6 +37133,9 @@ msgstr ""
msgid "User and IP rate limits"
msgstr ""
+msgid "User created at"
+msgstr ""
+
msgid "User does not have a pending request"
msgstr ""
@@ -37028,6 +37433,9 @@ msgstr ""
msgid "Users can launch a development environment from a GitLab browser tab when the %{linkStart}Gitpod%{linkEnd} integration is enabled."
msgstr ""
+msgid "Users can reactivate their account by signing in."
+msgstr ""
+
msgid "Users can render diagrams in AsciiDoc, Markdown, reStructuredText, and Textile documents using Kroki."
msgstr ""
@@ -37088,6 +37496,15 @@ msgstr ""
msgid "Validate your GitLab CI configuration file"
msgstr ""
+msgid "Validated at"
+msgstr ""
+
+msgid "Validated at:"
+msgstr ""
+
+msgid "Validated:"
+msgstr ""
+
msgid "Validations failed."
msgstr ""
@@ -37136,7 +37553,7 @@ msgstr ""
msgid "ValueStreamAnalytics|Median time from issue created to issue closed."
msgstr ""
-msgid "ValueStreamAnalytics|Median time from issue first merge request created to issue closed."
+msgid "ValueStreamAnalytics|Median time from the earliest commit of a linked issue's merge request to when that issue is closed."
msgstr ""
msgid "ValueStreamAnalytics|Number of commits pushed to the default branch"
@@ -37796,6 +38213,9 @@ msgstr ""
msgid "Webhook Settings"
msgstr ""
+msgid "Webhook events will be displayed here."
+msgstr ""
+
msgid "Webhook:"
msgstr ""
@@ -37985,6 +38405,9 @@ msgstr ""
msgid "What is your job title? (optional)"
msgstr ""
+msgid "What templates can I create?"
+msgstr ""
+
msgid "What will you use this group for?"
msgstr ""
@@ -37997,7 +38420,7 @@ msgstr ""
msgid "When a runner is locked, it cannot be assigned to other projects"
msgstr ""
-msgid "When an event in GitLab triggers a webhook, you can use the request details to figure out if something went wrong."
+msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
msgstr ""
msgid "When inactive, an external authentication provider must be used."
@@ -38023,6 +38446,9 @@ msgstr ""
msgid "When:"
msgstr ""
+msgid "Which API requests are affected?"
+msgstr ""
+
msgid "While it's rare to have no vulnerabilities, it can happen. In any event, we ask that you please double check your settings to make sure you've set up your dashboard correctly."
msgstr ""
@@ -38323,10 +38749,10 @@ msgstr ""
msgid "Write a description or drag your files here…"
msgstr ""
-msgid "Write milestone description..."
+msgid "Write a description…"
msgstr ""
-msgid "Write to \"authorized_keys\" file"
+msgid "Write milestone description..."
msgstr ""
msgid "Write your release notes or drag your files here…"
@@ -38368,9 +38794,6 @@ msgstr ""
msgid "You are about to add %{usersTag} people to the discussion. They will all receive a notification."
msgstr ""
-msgid "You are about to delete %{domain} from your instance. This domain will no longer be available to any Knative application."
-msgstr ""
-
msgid "You are about to permanently delete this project"
msgstr ""
@@ -38593,9 +39016,6 @@ msgstr ""
msgid "You can recover this project until %{date}"
msgstr ""
-msgid "You can register runners as separate users, on separate servers, and on your local machine. Register as many runners as you want."
-msgstr ""
-
msgid "You can resolve the merge conflict using either the Interactive mode, by choosing %{use_ours} or %{use_theirs} buttons, or by editing the files directly. Commit these changes into %{branch_name}"
msgstr ""
@@ -38644,6 +39064,9 @@ msgstr ""
msgid "You can’t %{tag_start}edit%{tag_end} files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
+msgid "You can’t edit files directly in this project. Fork this project and submit a merge request with your changes."
+msgstr ""
+
msgid "You could not create a new trigger."
msgstr ""
@@ -38692,9 +39115,6 @@ msgstr ""
msgid "You don't have any recent searches"
msgstr ""
-msgid "You don't have any webhooks deliveries"
-msgstr ""
-
msgid "You don't have sufficient permission to perform this action."
msgstr ""
@@ -38791,9 +39211,6 @@ msgstr ""
msgid "You must be logged in to search across all of GitLab"
msgstr ""
-msgid "You must disassociate %{domain} from all clusters it is attached to before deletion."
-msgstr ""
-
msgid "You must have developer or higher permissions in the associated project to view job logs when debug trace is enabled. To disable debug trace, set the 'CI_DEBUG_TRACE' variable to 'false' in your pipeline configuration or CI/CD settings. If you need to view this job log, a project maintainer must add you to the project with developer permissions or higher."
msgstr ""
@@ -39246,6 +39663,21 @@ msgstr[1] ""
msgid "Your username is %{username}."
msgstr ""
+msgid "ZenTaoIntegration|Failed to load ZenTao issue. View the issue in ZenTao, or reload the page."
+msgstr ""
+
+msgid "ZenTaoIntegration|Not all data may be displayed here. To view more details or make changes to this issue, go to %{linkStart}ZenTao%{linkEnd}."
+msgstr ""
+
+msgid "ZenTaoIntegration|This is a ZenTao user."
+msgstr ""
+
+msgid "ZenTaoIntegration|This issue is synchronized with ZenTao"
+msgstr ""
+
+msgid "ZenTaoIntegration|ZenTao user"
+msgstr ""
+
msgid "ZentaoIntegration|Base URL of the Zentao instance."
msgstr ""
@@ -39291,9 +39723,6 @@ msgstr ""
msgid "a deleted user"
msgstr ""
-msgid "a design"
-msgstr ""
-
msgid "about 1 hour"
msgid_plural "about %d hours"
msgstr[0] ""
@@ -39481,6 +39910,9 @@ msgstr ""
msgid "ciReport|%{linkStartTag}Learn more about codequality reports %{linkEndTag}"
msgstr ""
+msgid "ciReport|%{prefix} %{strongStart}%{score}%{strongEnd} %{delta} %{deltaPercent} in %{path}"
+msgstr ""
+
msgid "ciReport|%{remainingPackagesCount} more"
msgstr ""
@@ -39517,9 +39949,20 @@ msgstr ""
msgid "ciReport|Base pipeline codequality artifact not found"
msgstr ""
+msgid "ciReport|Browser Performance"
+msgstr ""
+
+msgid "ciReport|Browser performance test metrics results are being parsed"
+msgstr ""
+
msgid "ciReport|Browser performance test metrics: "
msgstr ""
+msgid "ciReport|Browser performance test metrics: %{strongStart}%{changesFound}%{strongEnd} change"
+msgid_plural "ciReport|Browser performance test metrics: %{strongStart}%{changesFound}%{strongEnd} changes"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "ciReport|Browser performance test metrics: No changes"
msgstr ""
@@ -39529,7 +39972,13 @@ msgstr ""
msgid "ciReport|Cluster Image Scanning"
msgstr ""
-msgid "ciReport|Code quality"
+msgid "ciReport|Code quality degraded"
+msgstr ""
+
+msgid "ciReport|Code quality improved"
+msgstr ""
+
+msgid "ciReport|Code quality scanning detected %{issueCount} changes in merged results"
msgstr ""
msgid "ciReport|Container Scanning"
@@ -39595,6 +40044,17 @@ msgstr ""
msgid "ciReport|Investigate this vulnerability by creating an issue"
msgstr ""
+msgid "ciReport|Load Performance"
+msgstr ""
+
+msgid "ciReport|Load performance test metrics detected %{strongStart}%{changesFound}%{strongEnd} change"
+msgid_plural "ciReport|Load performance test metrics detected %{strongStart}%{changesFound}%{strongEnd} changes"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "ciReport|Load performance test metrics results are being parsed"
+msgstr ""
+
msgid "ciReport|Load performance test metrics: "
msgstr ""
@@ -39628,10 +40088,10 @@ msgstr ""
msgid "ciReport|Secret Detection"
msgstr ""
-msgid "ciReport|Secret scanning"
+msgid "ciReport|Secret Detection detects secrets and credentials vulnerabilities in your source code."
msgstr ""
-msgid "ciReport|Secret scanning detects secrets and credentials vulnerabilities in your source code."
+msgid "ciReport|Secret detection"
msgstr ""
msgid "ciReport|Security scanning"
@@ -39774,6 +40234,9 @@ msgstr ""
msgid "created %{timeAgo}"
msgstr ""
+msgid "created %{timeAgo} by %{author}"
+msgstr ""
+
msgid "created by"
msgstr ""
@@ -39803,9 +40266,6 @@ msgstr ""
msgid "design"
msgstr ""
-msgid "designs"
-msgstr ""
-
msgid "detached"
msgstr ""
@@ -39818,9 +40278,6 @@ msgstr ""
msgid "does not have a supported extension. Only %{extension_list} are supported"
msgstr ""
-msgid "domain is not authorized for sign-up."
-msgstr ""
-
msgid "download it"
msgstr ""
@@ -39835,13 +40292,11 @@ msgstr ""
msgid "element is not a hierarchy"
msgstr ""
-msgid "email '%{email}' is not a verified email."
+msgid "eligible users"
msgstr ""
-msgid "email does not match the allowed domain of %{email_domains}"
-msgid_plural "email does not match the allowed domains: %{email_domains}"
-msgstr[0] ""
-msgstr[1] ""
+msgid "email '%{email}' is not a verified email."
+msgstr ""
msgid "enabled"
msgstr ""
@@ -39849,7 +40304,7 @@ msgstr ""
msgid "encrypted: needs to be a :required, :optional or :migrating!"
msgstr ""
-msgid "ending with a file extension is not allowed."
+msgid "ending with a reserved file extension is not allowed."
msgstr ""
msgid "entries cannot be larger than 255 characters"
@@ -39873,6 +40328,9 @@ msgstr ""
msgid "estimateCommand|%{slash_command} overwrites the total estimated time."
msgstr ""
+msgid "example.com"
+msgstr ""
+
msgid "exceeds the limit of %{bytes} bytes"
msgstr ""
@@ -39931,6 +40389,9 @@ msgid_plural "from %d jobs"
msgstr[0] ""
msgstr[1] ""
+msgid "frontmatter"
+msgstr ""
+
msgid "group"
msgstr ""
@@ -39994,6 +40455,9 @@ msgstr ""
msgid "in"
msgstr ""
+msgid "in Infrastructure :: Kubernetes clusters"
+msgstr ""
+
msgid "in all GitLab"
msgstr ""
@@ -40047,16 +40511,19 @@ msgstr ""
msgid "is not a valid X509 certificate."
msgstr ""
-msgid "is not allowed since the group is not top-level group."
+msgid "is not allowed for sign-up."
msgstr ""
-msgid "is not allowed. Try again with a different email address, or contact your GitLab admin."
+msgid "is not allowed for this group."
msgstr ""
-msgid "is not allowed. We do not currently support project-level iterations"
+msgid "is not allowed for this project."
+msgstr ""
+
+msgid "is not allowed since the group is not top-level group."
msgstr ""
-msgid "is not from an allowed domain."
+msgid "is not allowed. We do not currently support project-level iterations"
msgstr ""
msgid "is not in the group enforcing Group Managed Account"
@@ -40149,6 +40616,9 @@ msgstr ""
msgid "log in"
msgstr ""
+msgid "managed"
+msgstr ""
+
msgid "manual"
msgstr ""
@@ -40217,6 +40687,9 @@ msgstr ""
msgid "mrWidget|%{prefixToLinkStart}No pipeline%{prefixToLinkEnd} %{addPipelineLinkStart}Add the .gitlab-ci.yml file%{addPipelineLinkEnd} to create one."
msgstr ""
+msgid "mrWidget|A merge train is a queued list of merge requests waiting to be merged into the target branch. The changes in each merge request are combined with the changes in earlier merge requests and tested before merge."
+msgstr ""
+
msgid "mrWidget|A new merge train has started and this merge request is the first of the queue."
msgstr ""
@@ -40300,6 +40773,9 @@ msgstr ""
msgid "mrWidget|Failed to load deployment statistics"
msgstr ""
+msgid "mrWidget|Hide %{widget} details"
+msgstr ""
+
msgid "mrWidget|If the %{missingBranchName} branch exists in your local repository, you can merge this merge request manually using the command line"
msgstr ""
@@ -40309,6 +40785,9 @@ msgstr ""
msgid "mrWidget|Jump to first unresolved thread"
msgstr ""
+msgid "mrWidget|Learn more"
+msgstr ""
+
msgid "mrWidget|Loading deployment statistics"
msgstr ""
@@ -40422,6 +40901,9 @@ msgstr ""
msgid "mrWidget|Set by %{merge_author} to start a merge train when the pipeline succeeds"
msgstr ""
+msgid "mrWidget|Show %{widget} details"
+msgstr ""
+
msgid "mrWidget|The changes were merged into"
msgstr ""
@@ -40455,12 +40937,6 @@ msgstr ""
msgid "mrWidget|There are merge conflicts"
msgstr ""
-msgid "mrWidget|This action will add the merge request to the merge train when pipeline %{pipelineLink} succeeds."
-msgstr ""
-
-msgid "mrWidget|This action will start a merge train when pipeline %{pipelineLink} succeeds."
-msgstr ""
-
msgid "mrWidget|This merge request failed to be merged automatically"
msgstr ""
@@ -40476,6 +40952,9 @@ msgstr ""
msgid "mrWidget|Use %{linkStart}CI pipelines to test your code%{linkEnd} by simply adding a GitLab CI configuration file to your project. It only takes a minute to make your code more secure and robust."
msgstr ""
+msgid "mrWidget|What is a merge train?"
+msgstr ""
+
msgid "mrWidget|You can merge after removing denied licenses"
msgstr ""
@@ -40599,6 +41078,9 @@ msgstr ""
msgid "originating vulnerability"
msgstr ""
+msgid "other card matches"
+msgstr ""
+
msgid "out of %d total test"
msgid_plural "out of %d total tests"
msgstr[0] ""
@@ -40691,10 +41173,16 @@ msgstr ""
msgid "quick actions"
msgstr ""
-msgid "reCAPTCHA Private Key"
+msgid "reCAPTCHA"
+msgstr ""
+
+msgid "reCAPTCHA helps prevent credential stuffing."
+msgstr ""
+
+msgid "reCAPTCHA private key"
msgstr ""
-msgid "reCAPTCHA Site Key"
+msgid "reCAPTCHA site key"
msgstr ""
msgid "recent activity"
diff --git a/locale/gl_ES/gitlab.po b/locale/gl_ES/gitlab.po
index 52e5f0795f7..de57c0423bf 100644
--- a/locale/gl_ES/gitlab.po
+++ b/locale/gl_ES/gitlab.po
@@ -14,10 +14,7 @@ msgstr ""
"X-Crowdin-Language: gl\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-09-01 22:30\n"
-
-msgid " %{name}, confirm your email address now! "
-msgstr ""
+"PO-Revision-Date: 2021-10-04 20:18\n"
msgid " %{start} to %{end}"
msgstr " %{start} a %{end}"
@@ -92,6 +89,16 @@ msgstr ""
msgid "#general, #development"
msgstr ""
+msgid "%d Alert"
+msgid_plural "%d Alerts"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d Alert:"
+msgid_plural "%d Alerts:"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d Approval"
msgid_plural "%d Approvals"
msgstr[0] ""
@@ -287,8 +294,8 @@ msgstr[1] "%d capas"
msgid "%d merge request"
msgid_plural "%d merge requests"
-msgstr[0] "%d merge request"
-msgstr[1] "%d merge requests"
+msgstr[0] ""
+msgstr[1] ""
msgid "%d merge request that you don't have access to."
msgid_plural "%d merge requests that you don't have access to."
@@ -455,7 +462,10 @@ msgstr ""
msgid "%{code_open}Protected:%{code_close} Only exposed to protected branches or tags."
msgstr ""
-msgid "%{commit_author_link} authored %{commit_timeago}"
+msgid "%{commit_author_link} authored %{commit_authored_timeago}"
+msgstr ""
+
+msgid "%{commit_author_link} authored %{commit_authored_timeago} and %{commit_committer_avatar} %{commit_committer_link} committed %{commit_committer_timeago}"
msgstr ""
msgid "%{completedCount} completed weight"
@@ -549,6 +559,15 @@ msgstr ""
msgid "%{doc_link_start}Advanced search%{doc_link_end} is enabled."
msgstr ""
+msgid "%{docs_link_start}Learn about visibility levels.%{docs_link_end}"
+msgstr ""
+
+msgid "%{docs_link_start}What is Large File Storage?%{docs_link_end}"
+msgstr ""
+
+msgid "%{docs_link_start}What is two-factor authentication?%{docs_link_end}"
+msgstr ""
+
msgid "%{due_date} (Past due)"
msgstr ""
@@ -621,9 +640,6 @@ msgstr ""
msgid "%{issueType} actions"
msgstr ""
-msgid "%{issuesCount} issues with a limit of %{maxIssueCount}"
-msgstr ""
-
msgid "%{issuesSize} with a limit of %{maxIssueCount}"
msgstr ""
@@ -681,6 +697,12 @@ msgstr ""
msgid "%{label_for_message} unavailable"
msgstr ""
+msgid "%{learn_more_link}."
+msgstr ""
+
+msgid "%{lessThan} 1 hour"
+msgstr ""
+
msgid "%{lets_encrypt_link_start}Let's Encrypt%{lets_encrypt_link_end} is a free, automated, and open certificate authority (CA) that issues digital certificates to enable HTTPS (SSL/TLS) for sites."
msgstr ""
@@ -693,15 +715,15 @@ msgstr ""
msgid "%{link_start}Learn more%{link_end} about roles."
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
-msgstr ""
-
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
msgstr ""
msgid "%{link_start}Start the title with %{draft_snippet}%{link_end} to prevent a merge request that is a work in progress from being merged before it's ready."
msgstr ""
+msgid "%{link_start}What information does GitLab Inc. collect?%{link_end}"
+msgstr ""
+
msgid "%{listToShow}, and %{awardsListLength} more"
msgstr ""
@@ -854,7 +876,7 @@ msgid_plural "%{securityScanner} results are not available because a pipeline ha
msgstr[0] ""
msgstr[1] ""
-msgid "%{service_ping_link_start}Learn more%{service_ping_link_end} about what information is shared with GitLab Inc."
+msgid "%{service_ping_link_start}What information is shared with GitLab Inc.?%{service_ping_link_end}"
msgstr ""
msgid "%{size} %{unit}"
@@ -890,6 +912,9 @@ msgstr ""
msgid "%{state} epics"
msgstr ""
+msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
+msgstr ""
+
msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
msgstr ""
@@ -949,11 +974,6 @@ msgstr ""
msgid "%{template_project_id} is unknown or invalid"
msgstr ""
-msgid "%{text} %{files}"
-msgid_plural "%{text} %{files} files"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%{text} is available"
msgstr ""
@@ -1038,9 +1058,6 @@ msgstr ""
msgid "%{wildcards_link_start}Wildcards%{wildcards_link_end} such as %{code_tag_start}v*%{code_tag_end} or %{code_tag_start}*-release%{code_tag_end} are supported."
msgstr ""
-msgid "&lt; 1 hour"
-msgstr ""
-
msgid "'%{data}' at %{location} does not match format: %{format}"
msgstr ""
@@ -1124,9 +1141,6 @@ msgstr ""
msgid "(we need your current password to confirm your changes)"
msgstr ""
-msgid "* * * * *"
-msgstr ""
-
msgid "+ %{amount} more"
msgstr ""
@@ -1193,10 +1207,10 @@ msgstr ""
msgid "."
msgstr ""
-msgid "0 bytes"
+msgid "/"
msgstr ""
-msgid "0 for unlimited, only effective with remote storage enabled."
+msgid "0 bytes"
msgstr ""
msgid "0t1DgySidms"
@@ -1326,6 +1340,9 @@ msgstr ""
msgid "1000+"
msgstr ""
+msgid "192.168.0.0/24"
+msgstr ""
+
msgid "1st contribution!"
msgstr ""
@@ -1479,9 +1496,6 @@ msgstr ""
msgid "A plain HTML site that uses Netlify for CI/CD instead of GitLab, but still with all the other great GitLab features"
msgstr ""
-msgid "A plain-text response to show to clients that hit the rate limit."
-msgstr ""
-
msgid "A platform value can be web, mob or app."
msgstr ""
@@ -1563,7 +1577,7 @@ msgstr ""
msgid "APIFuzzing|Configure HTTP basic authentication values. Other authentication methods are supported. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
+msgid "APIFuzzing|Customize your project's API fuzzing configuration options and copy the code snippet to your .gitlab-ci.yml file to apply any changes. Note that this tool does not reflect or update your .gitlab-ci.yml file automatically. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
msgstr ""
msgid "APIFuzzing|Enable authentication"
@@ -1626,9 +1640,6 @@ msgstr ""
msgid "APIFuzzing|To prevent a security leak, authentication info must be added as a %{ciVariablesLinkStart}CI variable%{ciVariablesLinkEnd}. As a user with maintainer access rights, you can manage CI variables in the %{ciSettingsLinkStart}Settings%{ciSettingsLinkEnd} area."
msgstr ""
-msgid "APIFuzzing|Use this tool to generate API fuzzing configuration YAML to copy into your .gitlab-ci.yml file. This tool does not reflect or update your .gitlab-ci.yml file automatically."
-msgstr ""
-
msgid "APIFuzzing|Username for basic authentication"
msgstr ""
@@ -1680,9 +1691,6 @@ msgstr ""
msgid "Abuse reports notification email"
msgstr ""
-msgid "Abuse reports will be sent to this address if it is set. Abuse reports are always available in the admin area."
-msgstr ""
-
msgid "Accept invitation"
msgstr ""
@@ -1719,12 +1727,18 @@ msgstr ""
msgid "Access granted"
msgstr ""
+msgid "Access key ID"
+msgstr ""
+
msgid "Access requests"
msgstr ""
msgid "Access to '%{classification_label}' not allowed"
msgstr ""
+msgid "Access tokens expire after 2 hours. A refresh token may be used at any time to generate a new access token. Non-expiring access tokens are deprecated. Clear this setting to enable backward compatibility."
+msgstr ""
+
msgid "AccessDropdown|Deploy Keys"
msgstr ""
@@ -2037,6 +2051,9 @@ msgstr ""
msgid "Add new directory"
msgstr ""
+msgid "Add new service account"
+msgstr ""
+
msgid "Add or remove previously merged commits"
msgstr ""
@@ -2274,6 +2291,9 @@ msgstr ""
msgid "AdminArea|Features"
msgstr ""
+msgid "AdminArea|Get security updates from GitLab and stay up to date"
+msgstr ""
+
msgid "AdminArea|Groups"
msgstr ""
@@ -2313,6 +2333,12 @@ msgstr ""
msgid "AdminArea|Reporter"
msgstr ""
+msgid "AdminArea|Sign up for the GitLab Security Newsletter to get notified for security updates."
+msgstr ""
+
+msgid "AdminArea|Sign up for the GitLab newsletter"
+msgstr ""
+
msgid "AdminArea|Stop all jobs"
msgstr ""
@@ -2382,9 +2408,15 @@ msgstr ""
msgid "AdminSettings|Disable public access to Pages sites"
msgstr ""
+msgid "AdminSettings|Display a banner on merge requests in projects with no pipelines to initiate steps to add a .gitlab-ci.yml file."
+msgstr ""
+
msgid "AdminSettings|Domain verification is an essential security measure for public GitLab sites. Users are required to demonstrate they control a domain before it is enabled. %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "AdminSettings|Enable pipeline suggestion banner"
+msgstr ""
+
msgid "AdminSettings|Enable shared runners for new projects"
msgstr ""
@@ -2856,10 +2888,10 @@ msgstr ""
msgid "Admin|Quarterly reconciliation will occur on %{qrtlyDate}"
msgstr ""
-msgid "Admin|The number of max seats used for your namespace is currently exceeding the number of seats in your subscription. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgid "Admin|The number of max seats in your namespace exceeds the number of seats in your subscription. On %{qrtlyDate}, quarterly reconciliation occurs and you are automatically billed a prorated amount for the overage. No action is needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice. For more information about the timing of the invoicing process, view the documentation."
msgstr ""
-msgid "Admin|The number of maximum users for your instance is currently exceeding the number of users in license. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgid "Admin|The number of max users in your instance exceeds the number of users in your license. On %{qrtlyDate}, quarterly reconciliation occurs and you are automatically billed a prorated amount for the overage. No action is needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice. For more information about the timing of the invoicing process, view the documentation."
msgstr ""
msgid "Admin|View pending user approvals"
@@ -2880,9 +2912,6 @@ msgstr ""
msgid "Advanced export options"
msgstr ""
-msgid "Advanced permissions, Large File Storage and Two-Factor authentication settings."
-msgstr ""
-
msgid "After a successful password update you will be redirected to login screen."
msgstr ""
@@ -2901,13 +2930,14 @@ msgstr ""
msgid "After you've reviewed these contribution guidelines, you'll be all set to"
msgstr ""
+msgid "Akismet"
+msgstr ""
+
msgid "Akismet API Key"
msgstr ""
-msgid "Alert"
-msgid_plural "Alerts"
-msgstr[0] ""
-msgstr[1] ""
+msgid "Akismet helps prevent the creation of spam issues in public projects."
+msgstr ""
msgid "AlertManagement|Acknowledged"
msgstr ""
@@ -3263,6 +3293,9 @@ msgstr ""
msgid "All (default)"
msgstr ""
+msgid "All GitLab"
+msgstr ""
+
msgid "All Members"
msgstr ""
@@ -3377,6 +3410,9 @@ msgstr ""
msgid "Allow this secondary node to replicate content on Object Storage"
msgstr ""
+msgid "Allow use of licensed EE features"
+msgstr ""
+
msgid "Allow users to dismiss the broadcast message"
msgstr ""
@@ -3452,9 +3488,6 @@ msgstr ""
msgid "Amazon authentication is not %{link_start}correctly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
-msgid "Amount of time (in hours) that users are allowed to skip forced configuration of two-factor authentication"
-msgstr ""
-
msgid "An %{link_start}alert%{link_end} with the same fingerprint is already open. To change the status of this alert, resolve the linked alert."
msgstr ""
@@ -3515,12 +3548,6 @@ msgstr ""
msgid "An error occurred when removing the label."
msgstr ""
-msgid "An error occurred when toggling the notification subscription"
-msgstr ""
-
-msgid "An error occurred when updating the issue weight"
-msgstr ""
-
msgid "An error occurred when updating the title"
msgstr ""
@@ -3569,6 +3596,9 @@ msgstr ""
msgid "An error occurred while enabling Service Desk."
msgstr ""
+msgid "An error occurred while fetching Markdown preview"
+msgstr ""
+
msgid "An error occurred while fetching ancestors"
msgstr ""
@@ -3599,9 +3629,6 @@ msgstr ""
msgid "An error occurred while fetching label colors."
msgstr ""
-msgid "An error occurred while fetching markdown preview"
-msgstr ""
-
msgid "An error occurred while fetching participants"
msgstr ""
@@ -3617,9 +3644,6 @@ msgstr ""
msgid "An error occurred while fetching reference"
msgstr ""
-msgid "An error occurred while fetching sidebar data"
-msgstr ""
-
msgid "An error occurred while fetching tags. Retry the search."
msgstr ""
@@ -3695,6 +3719,9 @@ msgstr ""
msgid "An error occurred while loading merge requests."
msgstr ""
+msgid "An error occurred while loading projects."
+msgstr ""
+
msgid "An error occurred while loading the Needs tab."
msgstr ""
@@ -3929,12 +3956,6 @@ msgstr ""
msgid "Any Milestone"
msgstr ""
-msgid "Any branch"
-msgstr ""
-
-msgid "Any eligible user"
-msgstr ""
-
msgid "Any encrypted tokens"
msgstr ""
@@ -3953,6 +3974,9 @@ msgstr ""
msgid "Any namespace"
msgstr ""
+msgid "App Engine description and apps that are suitable for this deployment target"
+msgstr ""
+
msgid "App ID"
msgstr ""
@@ -4101,6 +4125,11 @@ msgstr ""
msgid "Apply"
msgstr ""
+msgid "Apply %d suggestion"
+msgid_plural "Apply %d suggestions"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Apply a label"
msgstr ""
@@ -4110,13 +4139,10 @@ msgstr ""
msgid "Apply suggestion"
msgstr ""
-msgid "Apply suggestions"
-msgstr ""
-
msgid "Apply template"
msgstr ""
-msgid "Apply this approval rule to any branch or a specific protected branch."
+msgid "Apply this approval rule to all branches or a specific protected branch."
msgstr ""
msgid "Applying"
@@ -4259,9 +4285,6 @@ msgstr ""
msgid "ApprovalSettings|Prevent editing approval rules in projects and merge requests."
msgstr ""
-msgid "ApprovalSettings|Prevent editing approval rules in projects and merge requests. "
-msgstr ""
-
msgid "ApprovalSettings|Remove all approvals when commits are added to the source branch."
msgstr ""
@@ -4277,6 +4300,9 @@ msgstr ""
msgid "ApprovalSettings|This setting is configured at the instance level and can only be changed by an administrator."
msgstr ""
+msgid "ApprovalSettings|This setting is configured in %{groupName} and can only be changed by an administrator or group owner."
+msgstr ""
+
msgid "ApprovalStatusTooltip|Adheres to separation of duties"
msgstr ""
@@ -4763,9 +4789,6 @@ msgstr ""
msgid "Authenticated API rate limit period in seconds"
msgstr ""
-msgid "Authenticated API request rate limit"
-msgstr ""
-
msgid "Authenticated API requests"
msgstr ""
@@ -4775,10 +4798,10 @@ msgstr ""
msgid "Authenticated Git LFS request rate limit"
msgstr ""
-msgid "Authenticated web rate limit period in seconds"
+msgid "Authenticated Git LFS requests"
msgstr ""
-msgid "Authenticated web request rate limit"
+msgid "Authenticated web rate limit period in seconds"
msgstr ""
msgid "Authenticated web requests"
@@ -5156,9 +5179,6 @@ msgstr ""
msgid "Below you will find all the groups that are public."
msgstr ""
-msgid "Beta"
-msgstr ""
-
msgid "Bi-weekly code coverage"
msgstr ""
@@ -5398,6 +5418,21 @@ msgstr ""
msgid "Board scope affects which issues are displayed for anyone who visits this board"
msgstr ""
+msgid "BoardNewEpic|Groups"
+msgstr ""
+
+msgid "BoardNewEpic|Loading groups"
+msgstr ""
+
+msgid "BoardNewEpic|No matching results"
+msgstr ""
+
+msgid "BoardNewEpic|Search groups"
+msgstr ""
+
+msgid "BoardNewEpic|Select a group"
+msgstr ""
+
msgid "BoardNewIssue|No matching results"
msgstr ""
@@ -5475,6 +5510,9 @@ msgstr ""
msgid "Boards|An error occurred while creating the list. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching child groups. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching group projects. Please try again."
msgstr ""
@@ -5807,6 +5845,9 @@ msgstr ""
msgid "Bulk update"
msgstr ""
+msgid "BulkImports|Re-import creates a new group. It does not sync with the existing group."
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -5816,6 +5857,9 @@ msgstr ""
msgid "BulkImport|From source group"
msgstr ""
+msgid "BulkImport|Group import history"
+msgstr ""
+
msgid "BulkImport|Import failed: Destination cannot be a subgroup of the source group. Change the destination and try again."
msgstr ""
@@ -5828,9 +5872,18 @@ msgstr ""
msgid "BulkImport|Importing the group failed"
msgstr ""
+msgid "BulkImport|Last imported to %{link}"
+msgstr ""
+
msgid "BulkImport|Name already exists."
msgstr ""
+msgid "BulkImport|New group"
+msgstr ""
+
+msgid "BulkImport|No history is available"
+msgstr ""
+
msgid "BulkImport|No parent"
msgstr ""
@@ -5843,6 +5896,9 @@ msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} matching filter \"%{filter}\" from %{link}"
msgstr ""
+msgid "BulkImport|Source group"
+msgstr ""
+
msgid "BulkImport|To new group"
msgstr ""
@@ -5852,6 +5908,9 @@ msgstr ""
msgid "BulkImport|You have no groups to import"
msgstr ""
+msgid "BulkImport|Your imported groups will appear here."
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -6094,6 +6153,9 @@ msgstr ""
msgid "Can be manually deployed to"
msgstr ""
+msgid "Can be overridden in each project."
+msgstr ""
+
msgid "Can create groups:"
msgstr ""
@@ -6196,6 +6258,9 @@ msgstr ""
msgid "Cancelling Preview"
msgstr ""
+msgid "Cannot assign a confidential epic to a non-confidential issue. Make the issue confidential and try again"
+msgstr ""
+
msgid "Cannot be assigned to other projects."
msgstr ""
@@ -6247,9 +6312,6 @@ msgstr ""
msgid "Cannot refer to a group %{timebox_type} by an internal id!"
msgstr ""
-msgid "Cannot set confidential epic for a non-confidential issue"
-msgstr ""
-
msgid "Cannot show preview. For previews on sketch files, they must have the file format introduced by Sketch version 43 and above."
msgstr ""
@@ -6487,15 +6549,15 @@ msgstr ""
msgid "Check out, review, and merge locally"
msgstr ""
-msgid "Check the %{docs_link_start}documentation%{docs_link_end}."
-msgstr ""
-
msgid "Check the current instance configuration "
msgstr ""
msgid "Check the elasticsearch.log file to debug why the migration was halted and make any changes before retrying the migration. When you fix the cause of the failure, click \"Retry migration\", and the migration will be scheduled to be retried in the background."
msgstr ""
+msgid "Check with your administrator."
+msgstr ""
+
msgid "Check your Docker images for known vulnerabilities."
msgstr ""
@@ -6526,6 +6588,9 @@ msgstr ""
msgid "Checkout"
msgstr ""
+msgid "Checkout|$%{selectedPlanPrice} per 10 GB storage per pack"
+msgstr ""
+
msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 minutes"
msgstr ""
@@ -6546,17 +6611,23 @@ msgstr ""
msgid "Checkout|%{name}'s GitLab subscription"
msgstr ""
-msgid "Checkout|%{selectedPlanText} plan"
+msgid "Checkout|%{name}'s storage subscription"
msgstr ""
-msgid "Checkout|%{startDate} - %{endDate}"
+msgid "Checkout|%{quantity} GB of storage"
msgstr ""
-msgid "Checkout|%{totalCiMinutes} CI minute"
-msgid_plural "Checkout|%{totalCiMinutes} CI minutes"
+msgid "Checkout|%{quantity} storage pack"
+msgid_plural "Checkout|%{quantity} storage packs"
msgstr[0] ""
msgstr[1] ""
+msgid "Checkout|%{selectedPlanText} plan"
+msgstr ""
+
+msgid "Checkout|%{startDate} - %{endDate}"
+msgstr ""
+
msgid "Checkout|%{totalCiMinutes} CI minutes"
msgstr ""
@@ -6632,6 +6703,9 @@ msgstr ""
msgid "Checkout|Failed to register credit card. Please try again."
msgstr ""
+msgid "Checkout|GB"
+msgstr ""
+
msgid "Checkout|GitLab group"
msgstr ""
@@ -6668,6 +6742,9 @@ msgstr ""
msgid "Checkout|State"
msgstr ""
+msgid "Checkout|Storage packs"
+msgstr ""
+
msgid "Checkout|Street address"
msgstr ""
@@ -6689,6 +6766,9 @@ msgstr ""
msgid "Checkout|Total minutes: %{quantity}"
msgstr ""
+msgid "Checkout|Total storage: %{quantity} GB"
+msgstr ""
+
msgid "Checkout|Users"
msgstr ""
@@ -6698,16 +6778,25 @@ msgstr ""
msgid "Checkout|Your organization"
msgstr ""
+msgid "Checkout|Your storage subscription has the same term as your main subscription, and the price is prorated accordingly."
+msgstr ""
+
msgid "Checkout|Your subscription will be applied to this group"
msgstr ""
msgid "Checkout|Zip code"
msgstr ""
+msgid "Checkout|a storage subscription"
+msgstr ""
+
msgid "Checkout|company or team"
msgstr ""
-msgid "Checkout|x 1,000 minutes per pack = %{strong}"
+msgid "Checkout|minutes"
+msgstr ""
+
+msgid "Checkout|x %{quantity} %{units} per pack ="
msgstr ""
msgid "Cherry-pick this commit"
@@ -7064,6 +7153,9 @@ msgstr ""
msgid "CloneIssue|Cannot clone issue to target project as it is pending deletion."
msgstr ""
+msgid "CloneIssue|Cannot clone issues of '%{issue_type}' type."
+msgstr ""
+
msgid "Cloned this issue to %{path_to_project}."
msgstr ""
@@ -7118,7 +7210,10 @@ msgstr ""
msgid "Closes this %{quick_action_target}."
msgstr ""
-msgid "Cloud licenses can not be removed."
+msgid "Cloud Functions description and apps that are suitable for this deployment target"
+msgstr ""
+
+msgid "Cloud Run description and apps that are suitable for this deployment target"
msgstr ""
msgid "Cluster"
@@ -7145,6 +7240,12 @@ msgstr ""
msgid "ClusterAgents|Access tokens"
msgstr ""
+msgid "ClusterAgents|Agent might not be connected to GitLab"
+msgstr ""
+
+msgid "ClusterAgents|Agent never connected to GitLab"
+msgstr ""
+
msgid "ClusterAgents|Alternative installation methods"
msgstr ""
@@ -7160,6 +7261,12 @@ msgstr ""
msgid "ClusterAgents|Configuration"
msgstr ""
+msgid "ClusterAgents|Connected"
+msgstr ""
+
+msgid "ClusterAgents|Connection status"
+msgstr ""
+
msgid "ClusterAgents|Copy token"
msgstr ""
@@ -7178,6 +7285,9 @@ msgstr ""
msgid "ClusterAgents|For alternative installation methods %{linkStart}go to the documentation%{linkEnd}."
msgstr ""
+msgid "ClusterAgents|For more troubleshooting information go to"
+msgstr ""
+
msgid "ClusterAgents|Go to the repository"
msgstr ""
@@ -7193,18 +7303,30 @@ msgstr ""
msgid "ClusterAgents|Integrate with the GitLab Agent"
msgstr ""
-msgid "ClusterAgents|Last used"
+msgid "ClusterAgents|Last connected %{timeAgo}."
+msgstr ""
+
+msgid "ClusterAgents|Last contact"
msgstr ""
msgid "ClusterAgents|Learn how to create an agent access token"
msgstr ""
+msgid "ClusterAgents|Make sure you are using a valid token."
+msgstr ""
+
msgid "ClusterAgents|Name"
msgstr ""
msgid "ClusterAgents|Never"
msgstr ""
+msgid "ClusterAgents|Never connected"
+msgstr ""
+
+msgid "ClusterAgents|Not connected"
+msgstr ""
+
msgid "ClusterAgents|Read more about getting started"
msgstr ""
@@ -7226,6 +7348,9 @@ msgstr ""
msgid "ClusterAgents|Select which Agent you want to install"
msgstr ""
+msgid "ClusterAgents|The Agent has not been connected in a long time. There might be a connectivity issue. Last contact was %{timeAgo}."
+msgstr ""
+
msgid "ClusterAgents|The GitLab Agent also requires %{linkStart}enabling the Agent Server%{linkEnd}"
msgstr ""
@@ -7253,9 +7378,6 @@ msgstr ""
msgid "ClusterAgents|You will need to create a token to connect to your agent"
msgstr ""
-msgid "ClusterAgent|This feature is only available for premium plans"
-msgstr ""
-
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -7445,9 +7567,6 @@ msgstr ""
msgid "ClusterIntegration|Create Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Create a provision role on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the account and external ID above. %{startMoreInfoLink}More information%{endLink}"
-msgstr ""
-
msgid "ClusterIntegration|Create cluster on"
msgstr ""
@@ -7880,7 +7999,7 @@ msgstr ""
msgid "ClusterIntegration|Subnets"
msgstr ""
-msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provisioned role, first create one on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the above account and external IDs. %{startMoreInfoLink}More information%{endLink}"
+msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provisioned role, first create one on %{awsLinkStart}Amazon Web Services %{awsLinkEnd} using the above account and external IDs. %{moreInfoStart}More information%{moreInfoEnd}"
msgstr ""
msgid "ClusterIntegration|The Kubernetes certificate used to authenticate to the cluster."
@@ -8114,6 +8233,9 @@ msgstr ""
msgid "Collapse replies"
msgstr ""
+msgid "Collapse settings section"
+msgstr ""
+
msgid "Collapse sidebar"
msgstr ""
@@ -8132,6 +8254,9 @@ msgstr ""
msgid "Comma-separated list of email addresses."
msgstr ""
+msgid "Comma-separated list of users allowed to exceed the rate limit."
+msgstr ""
+
msgid "Comma-separated, e.g. '1.1.1.1, 2.2.2.0/24'"
msgstr ""
@@ -8452,6 +8577,9 @@ msgstr ""
msgid "Configure %{repository_checks_link_start}repository checks%{link_end} and %{housekeeping_link_start}housekeeping%{link_end} on repositories."
msgstr ""
+msgid "Configure CAPTCHAs, IP address limits, and other anti-spam measures."
+msgstr ""
+
msgid "Configure Dependency Scanning in `.gitlab-ci.yml` using the GitLab managed template. You can [add variable overrides](https://docs.gitlab.com/ee/user/application_security/dependency_scanning/#customizing-the-dependency-scanning-settings) to customize Dependency Scanning settings."
msgstr ""
@@ -8488,16 +8616,13 @@ msgstr ""
msgid "Configure a %{codeStart}.gitlab-webide.yml%{codeEnd} file in the %{codeStart}.gitlab%{codeEnd} directory to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
msgstr ""
-msgid "Configure existing installation"
-msgstr ""
-
-msgid "Configure limit for notes created per minute by web and API requests."
+msgid "Configure advanced permissions, Large File Storage, and two-factor authentication settings."
msgstr ""
-msgid "Configure limits for Project/Group Import/Export."
+msgid "Configure approvals by authors and committers on all projects."
msgstr ""
-msgid "Configure limits for web and API requests."
+msgid "Configure existing installation"
msgstr ""
msgid "Configure paths to be protected by Rack Attack."
@@ -8512,10 +8637,13 @@ msgstr ""
msgid "Configure settings for Advanced Search with Elasticsearch."
msgstr ""
+msgid "Configure specific limits for Files API requests that supersede the general user and IP rate limits."
+msgstr ""
+
msgid "Configure specific limits for Git LFS requests that supersede the general user and IP rate limits."
msgstr ""
-msgid "Configure specific limits for Packages API requests that supersede the general user and IP rate limits."
+msgid "Configure specific limits for deprecated API requests that supersede the general user and IP rate limits."
msgstr ""
msgid "Configure the %{link} integration."
@@ -8527,6 +8655,9 @@ msgstr ""
msgid "Configure the way a user creates a new account."
msgstr ""
+msgid "Configure via Merge Request"
+msgstr ""
+
msgid "Configure which lists are shown for anyone who visits this board"
msgstr ""
@@ -8995,6 +9126,9 @@ msgstr ""
msgid "Content parsed with %{link}."
msgstr ""
+msgid "ContentEditor|Table of Contents"
+msgstr ""
+
msgid "ContentEditor|You have to provide a renderMarkdown function or a custom serializer"
msgstr ""
@@ -9181,6 +9315,9 @@ msgstr ""
msgid "Copy link to chart"
msgstr ""
+msgid "Copy prefix"
+msgstr ""
+
msgid "Copy reference"
msgstr ""
@@ -9211,6 +9348,9 @@ msgstr ""
msgid "Copy value"
msgstr ""
+msgid "Corpus Management"
+msgstr ""
+
msgid "Corpus Management|Are you sure you want to delete the corpus?"
msgstr ""
@@ -9439,6 +9579,9 @@ msgstr ""
msgid "Create commit"
msgstr ""
+msgid "Create common files more quickly, and standardize their format."
+msgstr ""
+
msgid "Create confidential merge request"
msgstr ""
@@ -9472,6 +9615,9 @@ msgstr ""
msgid "Create issue"
msgstr ""
+msgid "Create issue to resolve all threads"
+msgstr ""
+
msgid "Create iteration"
msgstr ""
@@ -9526,6 +9672,9 @@ msgstr ""
msgid "Create new..."
msgstr ""
+msgid "Create or import your first project"
+msgstr ""
+
msgid "Create project"
msgstr ""
@@ -9883,7 +10032,7 @@ msgstr ""
msgid "Custom notification events"
msgstr ""
-msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notificationLinkStart} notification emails%{notificationLinkEnd}."
+msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notificationLinkStart}notification emails%{notificationLinkEnd}."
msgstr ""
msgid "Custom project templates"
@@ -10082,10 +10231,10 @@ msgid_plural "CycleAnalytics|Showing %{subjectFilterText} and %{selectedLabelsCo
msgstr[0] ""
msgstr[1] ""
-msgid "CycleAnalytics|Showing data for group '%{groupName}' and %{selectedProjectCount} projects from %{startDate} to %{endDate}"
+msgid "CycleAnalytics|Showing data for group '%{groupName}' and %{selectedProjectCount} projects from %{createdAfter} to %{createdBefore}"
msgstr ""
-msgid "CycleAnalytics|Showing data for group '%{groupName}' from %{startDate} to %{endDate}"
+msgid "CycleAnalytics|Showing data for group '%{groupName}' from %{createdAfter} to %{createdBefore}"
msgstr ""
msgid "CycleAnalytics|Stages"
@@ -10319,6 +10468,9 @@ msgstr ""
msgid "DastProfiles|Manage profiles"
msgstr ""
+msgid "DastProfiles|Manage site profiles"
+msgstr ""
+
msgid "DastProfiles|Minimum = 0 (no timeout enabled), Maximum = 2880 minutes"
msgstr ""
@@ -10394,6 +10546,9 @@ msgstr ""
msgid "DastProfiles|Scanner name"
msgstr ""
+msgid "DastProfiles|Schedule"
+msgstr ""
+
msgid "DastProfiles|Select branch"
msgstr ""
@@ -10463,7 +10618,7 @@ msgstr ""
msgid "DastProfiles|Website"
msgstr ""
-msgid "DastProfiles|You can either choose a passive scan or validate the target site in your chosen site profile. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
+msgid "DastProfiles|You can either choose a passive scan or validate the target site from the site profile management page. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
msgstr ""
msgid "DastProfiles|You cannot run an active scan against an unvalidated site."
@@ -10636,7 +10791,7 @@ msgstr ""
msgid "Days to merge"
msgstr ""
-msgid "Deactivate dormant users after 90 days of inactivity. Users can return to active status by signing in to their account. While inactive, a user is not counted as an active user in the instance."
+msgid "Deactivate dormant users after 90 days of inactivity"
msgstr ""
msgid "Dear Administrator,"
@@ -10723,10 +10878,10 @@ msgstr ""
msgid "Define a custom pattern with cron syntax"
msgstr ""
-msgid "Define approval settings."
+msgid "Define approval rules."
msgstr ""
-msgid "Define approval settings. %{linkStart}Learn more.%{linkEnd}"
+msgid "Define approval rules. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "Define custom rules for what constitutes spam, independent of Akismet"
@@ -10735,7 +10890,7 @@ msgstr ""
msgid "Define environments in the deploy stage(s) in %{code_open}.gitlab-ci.yml%{code_close} to track deployments here."
msgstr ""
-msgid "Define how approval rules are applied as a merge request moves toward completion."
+msgid "Define how approval rules are applied to merge requests."
msgstr ""
msgid "Definition"
@@ -10750,6 +10905,12 @@ msgstr ""
msgid "DelayedJobs|Are you sure you want to run %{job_name} immediately? This job will run automatically after it's timer finishes."
msgstr ""
+msgid "DelayedJobs|Are you sure you want to run %{job_name} immediately? This job will run automatically after its timer finishes."
+msgstr ""
+
+msgid "DelayedJobs|Run the delayed job now?"
+msgstr ""
+
msgid "DelayedJobs|Start now"
msgstr ""
@@ -11026,6 +11187,12 @@ msgstr ""
msgid "Dependency proxy image prefix"
msgstr ""
+msgid "DependencyProxy|Create a local proxy for storing frequently used upstream images. %{docLinkStart}Learn more%{docLinkEnd} about dependency proxies."
+msgstr ""
+
+msgid "DependencyProxy|Dependency Proxy"
+msgstr ""
+
msgid "DependencyProxy|Toggle Dependency Proxy"
msgstr ""
@@ -11266,6 +11433,9 @@ msgstr ""
msgid "Deployments"
msgstr ""
+msgid "Deployments to Google Kubernetes Engine can be "
+msgstr ""
+
msgid "Deployments|%{deployments} environment impacted."
msgid_plural "Deployments|%{deployments} environments impacted."
msgstr[0] ""
@@ -11295,6 +11465,9 @@ msgstr ""
msgid "Deployment|success"
msgstr ""
+msgid "Deprecated API rate limits"
+msgstr ""
+
msgid "Deprioritize label"
msgstr ""
@@ -11697,6 +11870,16 @@ msgstr ""
msgid "DiffsCompareBaseBranch|(base)"
msgstr ""
+msgid "Diffs|%d addition"
+msgid_plural "Diffs|%d additions"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Diffs|%d deletion"
+msgid_plural "Diffs|%d deletions"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Diffs|No file name available"
msgstr ""
@@ -11706,9 +11889,17 @@ msgstr ""
msgid "Diffs|Show all unchanged lines"
msgstr ""
+msgid "Diffs|Showing %{dropdownStart}%{count} changed file%{dropdownEnd}"
+msgid_plural "Diffs|Showing %{dropdownStart}%{count} changed files%{dropdownEnd}"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Diffs|Something went wrong while fetching diff lines."
msgstr ""
+msgid "Diffs|with %{additions} and %{deletions}"
+msgstr ""
+
msgid "Direct member"
msgstr ""
@@ -11834,9 +12025,6 @@ msgid_plural "Dismiss %d selected vulnerabilities as"
msgstr[0] ""
msgstr[1] ""
-msgid "Dismiss Value Stream Analytics introduction box"
-msgstr ""
-
msgid "Dismiss merge request promotion"
msgstr ""
@@ -12158,6 +12346,9 @@ msgstr ""
msgid "Edit issues"
msgstr ""
+msgid "Edit merge requests"
+msgstr ""
+
msgid "Edit public deploy key"
msgstr ""
@@ -12233,6 +12424,9 @@ msgstr ""
msgid "Elastic|None. Select projects to index."
msgstr ""
+msgid "Eligible users"
+msgstr ""
+
msgid "Email"
msgstr ""
@@ -12362,6 +12556,9 @@ msgstr ""
msgid "Enable"
msgstr ""
+msgid "Enable Amazon EKS integration"
+msgstr ""
+
msgid "Enable Auto DevOps"
msgstr ""
@@ -12395,6 +12592,9 @@ msgstr ""
msgid "Enable SSL verification"
msgstr ""
+msgid "Enable Service Ping"
+msgstr ""
+
msgid "Enable Snowplow tracking"
msgstr ""
@@ -12425,6 +12625,9 @@ msgstr ""
msgid "Enable authenticated Git LFS request rate limit"
msgstr ""
+msgid "Enable authenticated web request rate limit"
+msgstr ""
+
msgid "Enable authentication"
msgstr ""
@@ -12485,7 +12688,7 @@ msgstr ""
msgid "Enable or disable the Pseudonymizer data collection."
msgstr ""
-msgid "Enable or disable version check and service ping."
+msgid "Enable or disable version check and Service Ping."
msgstr ""
msgid "Enable protected paths rate limit"
@@ -12497,18 +12700,12 @@ msgstr ""
msgid "Enable reCAPTCHA"
msgstr ""
-msgid "Enable reCAPTCHA for login"
-msgstr ""
-
-msgid "Enable reCAPTCHA, Invisible Captcha, Akismet and set IP limits. For reCAPTCHA, we currently only support %{recaptcha_v2_link_start}v2%{recaptcha_v2_link_end}"
+msgid "Enable reCAPTCHA for login."
msgstr ""
msgid "Enable repository checks"
msgstr ""
-msgid "Enable service ping"
-msgstr ""
-
msgid "Enable shared runners for all projects and subgroups in this group."
msgstr ""
@@ -12530,7 +12727,10 @@ msgstr ""
msgid "Enable unauthenticated API request rate limit"
msgstr ""
-msgid "Enable unauthenticated request rate limit"
+msgid "Enable unauthenticated web request rate limit"
+msgstr ""
+
+msgid "Enable user deactivation emails"
msgstr ""
msgid "Enable version check"
@@ -12566,9 +12766,6 @@ msgstr ""
msgid "Enabled sources for code import during project creation. OmniAuth must be configured for GitHub"
msgstr ""
-msgid "Enabling this will only make licensed EE features available to projects if the project namespace's plan includes the feature or if the project is public."
-msgstr ""
-
msgid "Encountered an error while rendering: %{err}"
msgstr ""
@@ -12617,9 +12814,6 @@ msgstr ""
msgid "Enter Admin Mode"
msgstr ""
-msgid "Enter IP address range"
-msgstr ""
-
msgid "Enter a number"
msgstr ""
@@ -12632,9 +12826,6 @@ msgstr ""
msgid "Enter at least three characters to search"
msgstr ""
-msgid "Enter domain"
-msgstr ""
-
msgid "Enter in your Bitbucket Server URL and personal access token below"
msgstr ""
@@ -12821,9 +13012,6 @@ msgstr ""
msgid "Environments|Deployment %{status}"
msgstr ""
-msgid "Environments|Dismiss"
-msgstr ""
-
msgid "Environments|Enable review app"
msgstr ""
@@ -12836,9 +13024,6 @@ msgstr ""
msgid "Environments|Environments are places where code gets deployed, such as staging or production."
msgstr ""
-msgid "Environments|Help us improve environments"
-msgstr ""
-
msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
msgstr ""
@@ -12875,6 +13060,9 @@ msgstr ""
msgid "Environments|Note that this action will stop the environment, but it will %{emphasisStart}not%{emphasisEnd} have an effect on any existing deployment due to no “stop environment action†being defined in the %{ciConfigLinkStart}.gitlab-ci.yml%{ciConfigLinkEnd} file."
msgstr ""
+msgid "Environments|Open"
+msgstr ""
+
msgid "Environments|Open live environment"
msgstr ""
@@ -12914,9 +13102,6 @@ msgstr ""
msgid "Environments|Stopping %{environmentName}"
msgstr ""
-msgid "Environments|Take the survey"
-msgstr ""
-
msgid "Environments|There was an error fetching the logs. Please try again."
msgstr ""
@@ -12938,9 +13123,6 @@ msgstr ""
msgid "Environments|You don't have any environments right now"
msgstr ""
-msgid "Environments|Your feedback helps GitLab make environments better for you and other users. Participate and enter a sweepstake to win a USD 30 gift card."
-msgstr ""
-
msgid "Environments|by %{avatar}"
msgstr ""
@@ -13223,7 +13405,7 @@ msgstr ""
msgid "Error parsing CSV file. Please make sure it has"
msgstr ""
-msgid "Error rendering markdown preview"
+msgid "Error rendering Markdown preview"
msgstr ""
msgid "Error saving label update."
@@ -13271,6 +13453,9 @@ msgstr ""
msgid "Error: %{error_message}"
msgstr ""
+msgid "Error: Couldn't load some or all of the changes."
+msgstr ""
+
msgid "Error: No AWS credentials were supplied"
msgstr ""
@@ -13304,6 +13489,9 @@ msgstr ""
msgid "ErrorTracking|Enable error tracking"
msgstr ""
+msgid "ErrorTracking|Error tracking backend"
+msgstr ""
+
msgid "ErrorTracking|If you self-host Sentry, enter your Sentry instance's full URL. If you use Sentry's hosted solution, enter https://sentry.io"
msgstr ""
@@ -13337,6 +13525,12 @@ msgstr ""
msgid "Escalation policies must have at least one rule"
msgstr ""
+msgid "EscalationPolicies|%{clockIcon} IF alert is not %{alertStatus} in %{minutes}"
+msgstr ""
+
+msgid "EscalationPolicies|%{notificationIcon} THEN %{doAction} %{forScheduleOrUser}"
+msgstr ""
+
msgid "EscalationPolicies|+ Add an additional rule"
msgstr ""
@@ -13379,13 +13573,13 @@ msgstr ""
msgid "EscalationPolicies|Escalation policies"
msgstr ""
-msgid "EscalationPolicies|Escalation rules"
+msgid "EscalationPolicies|Escalation policy %{obstacle} in Project %{project}"
msgstr ""
-msgid "EscalationPolicies|Failed to load oncall-schedules"
+msgid "EscalationPolicies|Escalation rules"
msgstr ""
-msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} %{then} THEN %{doAction} %{scheduleOrUser}"
+msgid "EscalationPolicies|Failed to load oncall-schedules"
msgstr ""
msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} minutes"
@@ -13463,18 +13657,36 @@ msgstr ""
msgid "Every %{action} attempt has failed: %{job_error_message}. Please try again."
msgstr ""
+msgid "Every 3 months"
+msgstr ""
+
+msgid "Every 3 months on the %{day} at %{time} %{timezone}"
+msgstr ""
+
+msgid "Every 6 months"
+msgstr ""
+
+msgid "Every 6 months on the %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Every day"
msgstr ""
msgid "Every day (at %{time})"
msgstr ""
+msgid "Every day at %{time} %{timezone}"
+msgstr ""
+
msgid "Every month"
msgstr ""
msgid "Every month (Day %{day} at %{time})"
msgstr ""
+msgid "Every month on the %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Every three months"
msgstr ""
@@ -13489,6 +13701,15 @@ msgstr[1] ""
msgid "Every week (%{weekday} at %{time})"
msgstr ""
+msgid "Every week on %{day} at %{time} %{timezone}"
+msgstr ""
+
+msgid "Every year"
+msgstr ""
+
+msgid "Every year on %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Everyone"
msgstr ""
@@ -13525,9 +13746,6 @@ msgstr ""
msgid "Exactly one of %{attributes} is required"
msgstr ""
-msgid "Example: %{ip_address}. %{read_more_link}."
-msgstr ""
-
msgid "Example: @sub\\.company\\.com$"
msgstr ""
@@ -13594,13 +13812,13 @@ msgstr ""
msgid "Expand pipeline"
msgstr ""
-msgid "Expand sidebar"
+msgid "Expand settings section"
msgstr ""
-msgid "Expected documents: %{expected_documents}"
+msgid "Expand sidebar"
msgstr ""
-msgid "Experienced"
+msgid "Expected documents: %{expected_documents}"
msgstr ""
msgid "ExperimentSubject|Must have exactly one of User, Namespace, or Project."
@@ -13885,9 +14103,6 @@ msgstr ""
msgid "Failed to load related branches"
msgstr ""
-msgid "Failed to load sidebar lock status"
-msgstr ""
-
msgid "Failed to load stacktrace."
msgstr ""
@@ -14312,6 +14527,9 @@ msgstr ""
msgid "Files"
msgstr ""
+msgid "Files API Rate Limits"
+msgstr ""
+
msgid "Files breadcrumb"
msgstr ""
@@ -15311,6 +15529,9 @@ msgstr ""
msgid "GitLab group: %{source_link}"
msgstr ""
+msgid "GitLab informs you if a new version is available."
+msgstr ""
+
msgid "GitLab is a complete DevOps platform, delivered as a single application, fundamentally changing the way Development, Security, and Ops teams collaborate"
msgstr ""
@@ -15326,7 +15547,7 @@ msgstr ""
msgid "GitLab is open source software to collaborate on code."
msgstr ""
-msgid "GitLab is undergoing maintenance and is operating in a read-only mode."
+msgid "GitLab is undergoing maintenance and is operating in read-only mode."
msgstr ""
msgid "GitLab member or Email address"
@@ -15338,9 +15559,6 @@ msgstr ""
msgid "GitLab project export"
msgstr ""
-msgid "GitLab restart is required to apply changes."
-msgstr ""
-
msgid "GitLab single sign-on URL"
msgstr ""
@@ -15356,9 +15574,6 @@ msgstr ""
msgid "GitLab version"
msgstr ""
-msgid "GitLab will inform you if a new version is available."
-msgstr ""
-
msgid "GitLab will run a background job that will produce pseudonymized CSVs of the GitLab database that will be uploaded to your configured object storage directory."
msgstr ""
@@ -15623,9 +15838,21 @@ msgstr ""
msgid "Go to snippets"
msgstr ""
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check 'Allowed domains for sign-ups'."
+msgstr ""
+
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check 'Email restrictions for sign-ups'."
+msgstr ""
+
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check the 'Domain denylist'."
+msgstr ""
+
msgid "Go to the activity feed"
msgstr ""
+msgid "Go to the group’s 'Settings &gt; General' page, and check 'Restrict membership by email domain'."
+msgstr ""
+
msgid "Go to the milestone list"
msgstr ""
@@ -15662,6 +15889,12 @@ msgstr ""
msgid "Goal of the changes and what reviewers should be aware of"
msgstr ""
+msgid "Google Cloud"
+msgstr ""
+
+msgid "Google Cloud offers several deployment targets. Select the one most suitable for your project."
+msgstr ""
+
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
@@ -15746,9 +15979,6 @@ msgstr ""
msgid "Group ID"
msgstr ""
-msgid "Group ID: %{group_id}"
-msgstr ""
-
msgid "Group Owner must have signed in with SAML before enabling Group Managed Accounts"
msgstr ""
@@ -15923,6 +16153,12 @@ msgstr ""
msgid "GroupImport|Unable to process group import file"
msgstr ""
+msgid "GroupPage|Copy group ID"
+msgstr ""
+
+msgid "GroupPage|Group ID: %{group_id}"
+msgstr ""
+
msgid "GroupRoadmap|%{dateWord} – No end date"
msgstr ""
@@ -15977,6 +16213,9 @@ msgstr ""
msgid "GroupRoadmap|Within 3 years"
msgstr ""
+msgid "GroupSAML|\"persistent\" recommended"
+msgstr ""
+
msgid "GroupSAML|%{strongOpen}Warning%{strongClose} - Enabling %{linkStart}SSO enforcement%{linkEnd} can reduce security risks."
msgstr ""
@@ -16109,6 +16348,9 @@ msgstr ""
msgid "GroupSAML|To be able to prohibit outer forks, you first need to enforce dedicate group managed accounts."
msgstr ""
+msgid "GroupSAML|Use SAML group links to manage group membership using SAML."
+msgstr ""
+
msgid "GroupSAML|Valid SAML Response"
msgstr ""
@@ -16121,13 +16363,10 @@ msgstr ""
msgid "GroupSAML|as %{access_level}"
msgstr ""
-msgid "GroupSAML|must match stored NameID of \"%{extern_uid}\" as we use this to identify users. If the NameID changes users will be unable to sign in."
-msgstr ""
-
-msgid "GroupSAML|should be \"persistent\""
+msgid "GroupSAML|must match stored NameID of \"%{extern_uid}\" to identify user and allow sign in"
msgstr ""
-msgid "GroupSAML|should be a random persistent ID, emails are discouraged"
+msgid "GroupSAML|recommend persistent ID instead of email"
msgstr ""
msgid "GroupSelect|No matching results"
@@ -16142,9 +16381,15 @@ msgstr ""
msgid "GroupSettings|Allow project access token creation"
msgstr ""
+msgid "GroupSettings|Applied to all subgroups unless overridden by a group owner. Groups already added to the project lose access."
+msgstr ""
+
msgid "GroupSettings|Auto DevOps pipeline was updated for the group"
msgstr ""
+msgid "GroupSettings|Available only on the top-level group. Applies to all subgroups. Groups already shared with a group outside %{group} are still shared unless removed manually."
+msgstr ""
+
msgid "GroupSettings|Badges"
msgstr ""
@@ -16196,6 +16441,9 @@ msgstr ""
msgid "GroupSettings|New runners registration token has been generated!"
msgstr ""
+msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgstr ""
+
msgid "GroupSettings|Pipeline settings was updated for the group"
msgstr ""
@@ -16208,12 +16456,15 @@ msgstr ""
msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
-msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups."
+msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups"
msgstr ""
msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
msgstr ""
+msgid "GroupSettings|Prevents group members from being notified if the group is mentioned."
+msgstr ""
+
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
msgstr ""
@@ -16250,21 +16501,6 @@ msgstr ""
msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}."
msgstr ""
-msgid "GroupSettings|This setting is only available on the top-level group and it applies to all subgroups. Groups that have already been shared with a group outside %{group} will still be shared, and this access will have to be revoked manually."
-msgstr ""
-
-msgid "GroupSettings|This setting will be applied to all subgroups unless overridden by a group owner. Groups that already have access to the project will continue to have access unless removed manually."
-msgstr ""
-
-msgid "GroupSettings|This setting will override user notification preferences for all members of the group, subgroups, and projects."
-msgstr ""
-
-msgid "GroupSettings|This setting will prevent group members from being notified if the group is mentioned."
-msgstr ""
-
-msgid "GroupSettings|This setting will prevent group members from forking projects outside of the group."
-msgstr ""
-
msgid "GroupSettings|Transfer group"
msgstr ""
@@ -16382,7 +16618,7 @@ msgstr ""
msgid "GroupsNew|No import options available"
msgstr ""
-msgid "GroupsNew|Not all related objects are migrated, as %{docs_link_start}described here%{docs_link_end}. Please %{feedback_link_start}leave feedback%{feedback_link_end} on this feature."
+msgid "GroupsNew|Not all related objects are migrated. %{docs_link_start}More info%{docs_link_end}."
msgstr ""
msgid "GroupsNew|Personal access token"
@@ -16514,15 +16750,27 @@ msgstr ""
msgid "Hello %{name},"
msgstr ""
-msgid "Hello there"
-msgstr ""
-
msgid "Hello, %{name}!"
msgstr ""
msgid "Hello, %{username}!"
msgstr ""
+msgid "HelloMessage|%{handshake_emoji} Contribute to GitLab: %{contribute_link}"
+msgstr ""
+
+msgid "HelloMessage|%{magnifier_emoji} Create a new GitLab issue: %{new_issue_link}"
+msgstr ""
+
+msgid "HelloMessage|%{rocket_emoji} We like your curiosity! Help us improve GitLab by joining the team: %{jobs_page_link}"
+msgstr ""
+
+msgid "HelloMessage|Does this page need fixes or improvements? Open an issue or contribute a merge request to help make GitLab more lovable. At GitLab, everyone can contribute!"
+msgstr ""
+
+msgid "HelloMessage|Welcome to GitLab!"
+msgstr ""
+
msgid "Help"
msgstr ""
@@ -16532,13 +16780,10 @@ msgstr ""
msgid "Helps prevent bots from creating accounts."
msgstr ""
-msgid "Helps prevent bots from creating issues"
-msgstr ""
-
-msgid "Helps prevent malicious users hide their activity"
+msgid "Helps prevent bots from creating issues."
msgstr ""
-msgid "Helps reduce request volume (e.g. from crawlers or abusive bots)"
+msgid "Helps prevent malicious users hide their activity."
msgstr ""
msgid "Helps reduce request volume (for example, from crawlers or abusive bots)"
@@ -16662,6 +16907,12 @@ msgstr ""
msgid "Housekeeping, export, path, transfer, remove, archive."
msgstr ""
+msgid "How do I configure Akismet?"
+msgstr ""
+
+msgid "How do I configure it?"
+msgstr ""
+
msgid "How do I configure runners?"
msgstr ""
@@ -16683,19 +16934,25 @@ msgstr ""
msgid "How do I set up this service?"
msgstr ""
+msgid "How do I use a web terminal?"
+msgstr ""
+
+msgid "How do I use file templates?"
+msgstr ""
+
msgid "How it works"
msgstr ""
msgid "How many days need to pass between marking entity for deletion and actual removing it."
msgstr ""
-msgid "How many seconds an IP will be counted towards the limit"
+msgid "How many seconds an IP counts toward the IP address limit."
msgstr ""
-msgid "I accept the %{terms_link}"
+msgid "How the job limiter handles jobs exceeding the thresholds specified below. The 'track' mode only logs the jobs. The 'compress' mode compresses the jobs and raises an exception if the compressed size exceeds the limit."
msgstr ""
-msgid "I accept the|Terms of Service and Privacy Policy"
+msgid "I accept the %{terms_link}"
msgstr ""
msgid "I forgot my password"
@@ -16779,13 +17036,16 @@ msgstr ""
msgid "IP Address"
msgstr ""
-msgid "IP expiration time"
+msgid "IP address expiration time"
msgstr ""
-msgid "IP subnet restriction only allowed for top-level groups"
+msgid "IP address restrictions"
+msgstr ""
+
+msgid "IP addresses per user"
msgstr ""
-msgid "IPs per user"
+msgid "IP subnet restriction only allowed for top-level groups"
msgstr ""
msgid "Identifier"
@@ -16800,6 +17060,9 @@ msgstr ""
msgid "If any indexed field exceeds this limit it will be truncated to this number of characters and the rest will not be indexed or searchable. This does not apply to repository and wiki indexing. Setting this to 0 means it is unlimited."
msgstr ""
+msgid "If blank, defaults to %{code_open}Retry later%{code_close}."
+msgstr ""
+
msgid "If blank, set allowable lifetime to %{instance_level_policy_in_words}, as defined by the instance admin. Once set, existing tokens for users in this group may be revoked."
msgstr ""
@@ -16851,6 +17114,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 did not initiate these sign-in attempts, please reach out to your administrator or enable two-factor authentication (2FA) on your account."
+msgstr ""
+
msgid "If you did not initiate this change, please contact your administrator immediately."
msgstr ""
@@ -16942,10 +17208,10 @@ msgstr ""
msgid "Import Projects from Gitea"
msgstr ""
-msgid "Import a project"
+msgid "Import an exported GitLab project"
msgstr ""
-msgid "Import an exported GitLab project"
+msgid "Import and export rate limits"
msgstr ""
msgid "Import failed due to a GitHub error: %{original}"
@@ -16957,12 +17223,18 @@ msgstr ""
msgid "Import from Jira"
msgstr ""
+msgid "Import group"
+msgstr ""
+
msgid "Import group from file"
msgstr ""
msgid "Import groups"
msgstr ""
+msgid "Import history"
+msgstr ""
+
msgid "Import in progress"
msgstr ""
@@ -17026,7 +17298,25 @@ msgstr ""
msgid "Import timed out. Import took longer than %{import_jobs_expiration} seconds"
msgstr ""
-msgid "Import/Export Rate Limits"
+msgid "ImportAProjectModal|Import from a project"
+msgstr ""
+
+msgid "ImportAProjectModal|Import members from another project"
+msgstr ""
+
+msgid "ImportAProjectModal|Import project members"
+msgstr ""
+
+msgid "ImportAProjectModal|Only project members (not group members) are imported, and they get the same permissions as the project you import from."
+msgstr ""
+
+msgid "ImportAProjectModal|Successfully imported"
+msgstr ""
+
+msgid "ImportAProjectModal|Unable to import project members"
+msgstr ""
+
+msgid "ImportAProjectModal|You're importing members to the %{strongStart}%{name}%{strongEnd} project."
msgstr ""
msgid "ImportButtons|Connect repositories from"
@@ -17079,7 +17369,7 @@ msgstr[1] ""
msgid "Importing..."
msgstr ""
-msgid "Import|A repository URL usually ends in a .git suffix, although this is not required. Double check to make sure your repository URL is correct."
+msgid "Import|There is not a valid Git repository at this URL. If your HTTP repository is not publicly accessible, verify your credentials."
msgstr ""
msgid "Improve customer support with Service Desk"
@@ -17088,9 +17378,6 @@ msgstr ""
msgid "Improves Git cloning performance."
msgstr ""
-msgid "In %{time_to_now}"
-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 ""
@@ -17376,7 +17663,7 @@ msgstr ""
msgid "InProductMarketing|Start a GitLab Ultimate trial today in less than one minute, no credit card required."
msgstr ""
-msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no CC required"
+msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no credit card required"
msgstr ""
msgid "InProductMarketing|Start a trial"
@@ -17415,7 +17702,7 @@ msgstr ""
msgid "InProductMarketing|Team up in GitLab for greater efficiency"
msgstr ""
-msgid "InProductMarketing|Team work makes the dream work"
+msgid "InProductMarketing|Team work makes the dream work"
msgstr ""
msgid "InProductMarketing|Test, create, deploy"
@@ -17996,6 +18283,9 @@ msgstr ""
msgid "Integrations|Create new issue in Jira"
msgstr ""
+msgid "Integrations|Create new issue in ZenTao"
+msgstr ""
+
msgid "Integrations|Default settings are inherited from the group level."
msgstr ""
@@ -18089,9 +18379,15 @@ msgstr ""
msgid "Integrations|Search Jira issues"
msgstr ""
+msgid "Integrations|Search ZenTao issues"
+msgstr ""
+
msgid "Integrations|Send notifications about project events to Unify Circuit."
msgstr ""
+msgid "Integrations|Send notifications about project events to a Unify Circuit conversation. %{docs_link}"
+msgstr ""
+
msgid "Integrations|Sign in to add namespaces"
msgstr ""
@@ -18131,6 +18427,9 @@ msgstr ""
msgid "Integrations|You've activated every integration 🎉"
msgstr ""
+msgid "Integrations|ZenTao issues display here when you create issues in your project in ZenTao."
+msgstr ""
+
msgid "Interactive mode"
msgstr ""
@@ -18158,9 +18457,6 @@ msgstr ""
msgid "Interval Pattern"
msgstr ""
-msgid "Introducing Value Stream Analytics"
-msgstr ""
-
msgid "Introducing Your DevOps Report"
msgstr ""
@@ -18257,6 +18553,12 @@ msgstr ""
msgid "Investigate vulnerability: %{title}"
msgstr ""
+msgid "Invisible Captcha"
+msgstr ""
+
+msgid "Invisible Captcha helps prevent the creation of spam accounts. It adds a honeypot field and time-sensitive form submission to the account signup form."
+msgstr ""
+
msgid "Invitation"
msgstr ""
@@ -18710,12 +19012,18 @@ msgstr ""
msgid "Issues"
msgstr ""
+msgid "Issues I've created"
+msgstr ""
+
msgid "Issues Rate Limits"
msgstr ""
msgid "Issues and merge requests"
msgstr ""
+msgid "Issues assigned to me"
+msgstr ""
+
msgid "Issues can be bugs, tasks or ideas to be discussed. Also, issues are searchable and filterable."
msgstr ""
@@ -18827,7 +19135,7 @@ msgstr ""
msgid "Iterations|Create cadence"
msgstr ""
-msgid "Iterations|Create your first iteration"
+msgid "Iterations|Create iteration"
msgstr ""
msgid "Iterations|Delete cadence"
@@ -18836,6 +19144,9 @@ msgstr ""
msgid "Iterations|Delete iteration cadence?"
msgstr ""
+msgid "Iterations|Delete iteration?"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -18869,12 +19180,18 @@ msgstr ""
msgid "Iterations|New iteration cadence"
msgstr ""
+msgid "Iterations|No closed iterations."
+msgstr ""
+
msgid "Iterations|No iteration cadences to show."
msgstr ""
msgid "Iterations|No iterations in cadence."
msgstr ""
+msgid "Iterations|No open iterations."
+msgstr ""
+
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
@@ -18905,6 +19222,9 @@ msgstr ""
msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
msgstr ""
+msgid "Iterations|This will remove the iteration from any issues that are assigned to it."
+msgstr ""
+
msgid "Iterations|Title"
msgstr ""
@@ -18920,15 +19240,9 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "I’m familiar with the basics of DevOps."
-msgstr ""
-
msgid "I’m joining my team who’s already on GitLab"
msgstr ""
-msgid "I’m not familiar with the basics of DevOps."
-msgstr ""
-
msgid "Jaeger URL"
msgstr ""
@@ -19193,6 +19507,9 @@ msgstr ""
msgid "Job"
msgstr ""
+msgid "Job %{jobName}"
+msgstr ""
+
msgid "Job Failed #%{build_id}"
msgstr ""
@@ -19783,9 +20100,6 @@ msgstr ""
msgid "Learn more in the"
msgstr ""
-msgid "Learn more in the|pipeline schedules documentation"
-msgstr ""
-
msgid "Learn more."
msgstr ""
@@ -19897,9 +20211,6 @@ msgstr ""
msgid "Leave Admin Mode"
msgstr ""
-msgid "Leave blank for no limit. Once set, existing personal access tokens may be revoked."
-msgstr ""
-
msgid "Leave edit mode? All unsaved changes will be lost."
msgstr ""
@@ -19945,10 +20256,10 @@ msgstr ""
msgid "LicenseCompliance|Acceptable license to be used in the project"
msgstr ""
-msgid "LicenseCompliance|Add a license"
+msgid "LicenseCompliance|Add license and related policy"
msgstr ""
-msgid "LicenseCompliance|Add license and related policy"
+msgid "LicenseCompliance|Add license policy"
msgstr ""
msgid "LicenseCompliance|Allow"
@@ -20038,6 +20349,9 @@ msgstr ""
msgid "LicenseManagement|Uncategorized"
msgstr ""
+msgid "Licensed Enterprise Edition features can be used if the project namespace's plan includes the feature, or if the project is public."
+msgstr ""
+
msgid "Licensed Features"
msgstr ""
@@ -20104,7 +20418,10 @@ msgstr ""
msgid "Limit namespaces and projects that can be indexed"
msgstr ""
-msgid "Limit sign in from multiple ips"
+msgid "Limit project size at a global, group, and project level. %{link_start}Learn more%{link_end}."
+msgstr ""
+
+msgid "Limit sign in from multiple IP addresses"
msgstr ""
msgid "Limit the number of concurrent operations this secondary site can run in the background."
@@ -20116,11 +20433,17 @@ msgstr ""
msgid "Limit the number of issues and epics per minute a user can create through web and API requests."
msgstr ""
+msgid "Limit the size of Sidekiq jobs stored in Redis."
+msgstr ""
+
msgid "Limited to showing %d event at most"
msgid_plural "Limited to showing %d events at most"
msgstr[0] ""
msgstr[1] ""
+msgid "Limiting mode"
+msgstr ""
+
msgid "Line changes"
msgstr ""
@@ -20190,9 +20513,6 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
-msgid "List of users to be excluded from the limit"
-msgstr ""
-
msgid "List options"
msgstr ""
@@ -20232,9 +20552,6 @@ msgstr ""
msgid "Loading functions timed out. Please reload the page to try again."
msgstr ""
-msgid "Loading issues"
-msgstr ""
-
msgid "Loading more"
msgstr ""
@@ -20526,6 +20843,9 @@ msgstr ""
msgid "Marked For Deletion At - %{deletion_time}"
msgstr ""
+msgid "Marked as ready. Merging is now allowed."
+msgstr ""
+
msgid "Marked this %{noun} as a draft."
msgstr ""
@@ -20598,52 +20918,22 @@ msgstr ""
msgid "Max 100,000 events"
msgstr ""
-msgid "Max 20 characters"
-msgstr ""
-
-msgid "Max Group Export Download requests per minute per user"
-msgstr ""
-
-msgid "Max Group Export requests per minute per user"
-msgstr ""
-
-msgid "Max Group Import requests per minute per user"
-msgstr ""
-
-msgid "Max Project Export Download requests per minute per user"
-msgstr ""
-
-msgid "Max Project Export requests per minute per user"
-msgstr ""
-
-msgid "Max Project Import requests per minute per user"
-msgstr ""
-
-msgid "Max authenticated API requests per period per user"
-msgstr ""
-
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
-msgid "Max authenticated web requests per period per user"
-msgstr ""
-
msgid "Max file size is 200 KB."
msgstr ""
-msgid "Max requests per minute per user"
-msgstr ""
-
msgid "Max role"
msgstr ""
msgid "Max session time"
msgstr ""
-msgid "Max unauthenticated requests per period per IP"
+msgid "MaxBuilds"
msgstr ""
-msgid "MaxBuilds"
+msgid "Maximum 20 characters"
msgstr ""
msgid "Maximum Conan package file size in bytes"
@@ -20679,6 +20969,12 @@ msgstr ""
msgid "Maximum attachment size (MB)"
msgstr ""
+msgid "Maximum authenticated API requests per rate limit period per user"
+msgstr ""
+
+msgid "Maximum authenticated web requests per rate limit period per user"
+msgstr ""
+
msgid "Maximum bulk request size (MiB)"
msgstr ""
@@ -20724,6 +21020,15 @@ msgstr ""
msgid "Maximum files in a diff"
msgstr ""
+msgid "Maximum group export download requests per minute"
+msgstr ""
+
+msgid "Maximum group export requests per minute"
+msgstr ""
+
+msgid "Maximum group import requests per minute"
+msgstr ""
+
msgid "Maximum import size"
msgstr ""
@@ -20760,7 +21065,7 @@ msgstr ""
msgid "Maximum number of projects."
msgstr ""
-msgid "Maximum number of unique IPs per user"
+msgid "Maximum number of unique IP addresses per user."
msgstr ""
msgid "Maximum page reached"
@@ -20769,12 +21074,24 @@ msgstr ""
msgid "Maximum page size"
msgstr ""
+msgid "Maximum project export download requests per minute"
+msgstr ""
+
+msgid "Maximum project export requests per minute"
+msgstr ""
+
+msgid "Maximum project import requests per minute"
+msgstr ""
+
msgid "Maximum push size"
msgstr ""
msgid "Maximum push size (MB)"
msgstr ""
+msgid "Maximum requests per minute"
+msgstr ""
+
msgid "Maximum running slices"
msgstr ""
@@ -20802,10 +21119,16 @@ msgstr ""
msgid "Maximum time between updates that a mirror can have when scheduled to synchronize."
msgstr ""
-msgid "Maximum time for web terminal websocket connection (in seconds). 0 for unlimited."
+msgid "Maximum time that users are allowed to skip the setup of two-factor authentication (in hours). Set to 0 (zero) to enforce at next sign in."
+msgstr ""
+
+msgid "Maximum time, in seconds, for a web terminal websocket connection. 0 for unlimited."
msgstr ""
-msgid "Maximum 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."
+msgid "Maximum unauthenticated API requests per rate limit period per IP"
+msgstr ""
+
+msgid "Maximum unauthenticated web requests per rate limit period per IP"
msgstr ""
msgid "May"
@@ -20823,9 +21146,6 @@ msgstr ""
msgid "Medium vulnerabilities present"
msgstr ""
-msgid "Member lock"
-msgstr ""
-
msgid "Member since"
msgstr ""
@@ -20862,6 +21182,9 @@ msgstr ""
msgid "Members of a group may only view projects they have permission to access"
msgstr ""
+msgid "Membership"
+msgstr ""
+
msgid "Members|%{time} by %{user}"
msgstr ""
@@ -20922,9 +21245,6 @@ msgstr ""
msgid "Members|Expiration date updated successfully."
msgstr ""
-msgid "Members|Expired"
-msgstr ""
-
msgid "Members|Filter members"
msgstr ""
@@ -20940,9 +21260,6 @@ msgstr ""
msgid "Members|Membership"
msgstr ""
-msgid "Members|No expiration set"
-msgstr ""
-
msgid "Members|Remove \"%{groupName}\""
msgstr ""
@@ -20964,9 +21281,6 @@ msgstr ""
msgid "Members|Search invited"
msgstr ""
-msgid "Members|in %{time}"
-msgstr ""
-
msgid "Member|Deny access"
msgstr ""
@@ -21042,9 +21356,6 @@ msgstr ""
msgid "Merge request %{mr_link} was reviewed by %{mr_author}"
msgstr ""
-msgid "Merge request (MR) approvals"
-msgstr ""
-
msgid "Merge request analytics"
msgstr ""
@@ -21066,12 +21377,21 @@ msgstr ""
msgid "Merge requests"
msgstr ""
+msgid "Merge requests I've created"
+msgstr ""
+
msgid "Merge requests are a place to propose changes you've made to a project and discuss those changes with others"
msgstr ""
msgid "Merge requests are read-only in a secondary Geo node"
msgstr ""
+msgid "Merge requests assigned to me"
+msgstr ""
+
+msgid "Merge requests that I'm a reviewer"
+msgstr ""
+
msgid "Merge the branch and fix any conflicts that come up"
msgstr ""
@@ -21132,10 +21452,10 @@ msgstr ""
msgid "MergeRequests|An error occurred while saving the draft comment."
msgstr ""
-msgid "MergeRequests|Failed to squash. Should be done manually."
+msgid "MergeRequests|Create issue to resolve thread"
msgstr ""
-msgid "MergeRequests|Resolve this thread in a new issue"
+msgid "MergeRequests|Failed to squash. Should be done manually."
msgstr ""
msgid "MergeRequests|Saving the comment failed"
@@ -21949,6 +22269,9 @@ msgstr ""
msgid "MoveIssue|Cannot move issue to project it originates from!"
msgstr ""
+msgid "MoveIssue|Cannot move issues of '%{issue_type}' type."
+msgstr ""
+
msgid "Moved issue to %{label} column in the board."
msgstr ""
@@ -22074,6 +22397,15 @@ 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. To learn more about reducing storage capacity please visit our docs."
msgstr ""
+msgid "NamespaceUserCap|Pending users must be reviewed and approved by a group owner. Learn more about %{user_caps_link_start}User Caps%{link_end} and %{users_pending_approval_link_start}Users Pending Approval%{link_end}."
+msgstr ""
+
+msgid "NamespaceUserCap|View pending user approvals"
+msgstr ""
+
+msgid "NamespaceUserCap|Your group has reached its billable member limit"
+msgstr ""
+
msgid "Namespaces"
msgstr ""
@@ -22116,9 +22448,6 @@ msgstr ""
msgid "Network"
msgstr ""
-msgid "Network Policy|New rule"
-msgstr ""
-
msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is inbound from a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
msgstr ""
@@ -22140,16 +22469,13 @@ msgstr ""
msgid "NetworkPolicies|%{strongOpen}any%{strongClose} port"
msgstr ""
-msgid "NetworkPolicies|+ Add alert"
-msgstr ""
-
msgid "NetworkPolicies|.yaml"
msgstr ""
msgid "NetworkPolicies|.yaml mode"
msgstr ""
-msgid "NetworkPolicies|Actions"
+msgid "NetworkPolicies|Add alert"
msgstr ""
msgid "NetworkPolicies|Alerts are intended to be selectively used for a limited number of events that are potentially concerning and warrant a manual review. Alerts should not be used as a substitute for a SIEM or a logging tool. High volume alerts are likely to be dropped so as to preserve the stability of GitLab's integration with Kubernetes."
@@ -22185,9 +22511,6 @@ msgstr ""
msgid "NetworkPolicies|Deny all traffic"
msgstr ""
-msgid "NetworkPolicies|Description"
-msgstr ""
-
msgid "NetworkPolicies|Edit policy"
msgstr ""
@@ -22200,9 +22523,6 @@ msgstr ""
msgid "NetworkPolicies|IP/subnet"
msgstr ""
-msgid "NetworkPolicies|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
-msgstr ""
-
msgid "NetworkPolicies|Invalid or empty policy"
msgstr ""
@@ -22212,19 +22532,16 @@ msgstr ""
msgid "NetworkPolicies|Kubernetes error: %{error}"
msgstr ""
-msgid "NetworkPolicies|Name"
-msgstr ""
-
msgid "NetworkPolicies|Network"
msgstr ""
-msgid "NetworkPolicies|Network traffic"
+msgid "NetworkPolicies|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
msgstr ""
-msgid "NetworkPolicies|New policy"
+msgid "NetworkPolicies|Network policy can be created after the environment is loaded successfully."
msgstr ""
-msgid "NetworkPolicies|No policies detected"
+msgid "NetworkPolicies|Network traffic"
msgstr ""
msgid "NetworkPolicies|None selected"
@@ -22233,21 +22550,12 @@ msgstr ""
msgid "NetworkPolicies|Please %{installLinkStart}install%{installLinkEnd} and %{configureLinkStart}configure a Kubernetes Agent for this project%{configureLinkEnd} to enable alerts."
msgstr ""
-msgid "NetworkPolicies|Policies are a specification of how groups of pods are allowed to communicate with each other's network endpoints."
-msgstr ""
-
msgid "NetworkPolicies|Policy %{policyName} was successfully changed"
msgstr ""
msgid "NetworkPolicies|Policy definition"
msgstr ""
-msgid "NetworkPolicies|Policy editor"
-msgstr ""
-
-msgid "NetworkPolicies|Policy preview"
-msgstr ""
-
msgid "NetworkPolicies|Rule"
msgstr ""
@@ -22257,9 +22565,6 @@ msgstr ""
msgid "NetworkPolicies|Rule mode is unavailable for this policy. In some cases, we cannot parse the YAML file back into the rules editor."
msgstr ""
-msgid "NetworkPolicies|Rules"
-msgstr ""
-
msgid "NetworkPolicies|Save changes"
msgstr ""
@@ -22272,9 +22577,6 @@ msgstr ""
msgid "NetworkPolicies|Traffic that does not match any rule will be blocked."
msgstr ""
-msgid "NetworkPolicies|Unable to parse policy"
-msgstr ""
-
msgid "NetworkPolicies|all DNS names"
msgstr ""
@@ -22454,6 +22756,9 @@ msgstr ""
msgid "New issue"
msgstr ""
+msgid "New issue in %{project}"
+msgstr ""
+
msgid "New issue title"
msgstr ""
@@ -22532,7 +22837,7 @@ msgstr ""
msgid "Newest first"
msgstr ""
-msgid "Newly registered users will by default be external"
+msgid "Newly-registered users are external by default"
msgstr ""
msgid "Next"
@@ -22847,8 +23152,10 @@ msgstr ""
msgid "No webhooks found, add one in the form above."
msgstr ""
-msgid "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} to renew your subscription."
-msgstr ""
+msgid "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} day to renew your subscription."
+msgid_plural "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} days to renew your subscription."
+msgstr[0] ""
+msgstr[1] ""
msgid "No. of commits"
msgstr ""
@@ -22865,7 +23172,7 @@ msgstr ""
msgid "Nodes"
msgstr ""
-msgid "Non-admin users can sign in with read-only access and make read-only API requests."
+msgid "Non-admin users are restricted to read-only access, in both GitLab UI and API."
msgstr ""
msgid "None"
@@ -22946,7 +23253,7 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
-msgid "Notes Rate Limits"
+msgid "Notes rate limit"
msgstr ""
msgid "Notes|Are you sure you want to cancel creating this comment?"
@@ -23113,9 +23420,6 @@ msgstr ""
msgid "November"
msgstr ""
-msgid "Novice"
-msgstr ""
-
msgid "Now, personalize your GitLab experience"
msgstr ""
@@ -23284,7 +23588,7 @@ msgstr ""
msgid "OnCallSchedules|For this rotation, on-call will be:"
msgstr ""
-msgid "OnCallSchedules|On-call schedule %{schedule} in Project %{project}"
+msgid "OnCallSchedules|On-call schedule %{obstacle} in Project %{project}"
msgstr ""
msgid "OnCallSchedules|On-call schedules"
@@ -23431,22 +23735,22 @@ msgstr ""
msgid "OnDemandScans|Scanner profile"
msgstr ""
-msgid "OnDemandScans|Select one of the existing profiles"
+msgid "OnDemandScans|Schedule scan"
msgstr ""
-msgid "OnDemandScans|Site profile"
+msgid "OnDemandScans|Select one of the existing profiles"
msgstr ""
-msgid "OnDemandScans|Use existing scanner profile"
+msgid "OnDemandScans|Site profile"
msgstr ""
-msgid "OnDemandScans|Use existing site profile"
+msgid "OnDemandScans|Start time"
msgstr ""
-msgid "OnDemandScans|You can either choose a passive scan or validate the target site in your chosen site profile. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
+msgid "OnDemandScans|Use existing scanner profile"
msgstr ""
-msgid "OnDemandScans|You cannot run an active scan against an unvalidated site."
+msgid "OnDemandScans|Use existing site profile"
msgstr ""
msgid "OnDemandScans|You must create a repository within your project to run an on-demand scan."
@@ -23511,6 +23815,9 @@ msgstr ""
msgid "Only admins can delete project"
msgstr ""
+msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
+msgstr ""
+
msgid "Only include features new to your current subscription tier."
msgstr ""
@@ -23529,6 +23836,12 @@ msgstr ""
msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
+msgid "Only reCAPTCHA v2 is supported:"
+msgstr ""
+
+msgid "Only users from the specified IP address ranges are able to reach this group, including all subgroups, projects, and Git repositories."
+msgstr ""
+
msgid "Only verified users with an email address in any of these domains can be added to the group."
msgstr ""
@@ -23715,9 +24028,6 @@ msgstr ""
msgid "Package Registry"
msgstr ""
-msgid "Package Registry Rate Limits"
-msgstr ""
-
msgid "Package Registry: authenticated API requests"
msgstr ""
@@ -23736,6 +24046,9 @@ msgstr ""
msgid "Package recipe already exists"
msgstr ""
+msgid "Package registry rate limits"
+msgstr ""
+
msgid "Package type"
msgstr ""
@@ -23802,6 +24115,9 @@ msgstr ""
msgid "PackageRegistry|Composer"
msgstr ""
+msgid "PackageRegistry|Composer.json with license: %{license} and version: %{version}"
+msgstr ""
+
msgid "PackageRegistry|Conan"
msgstr ""
@@ -23865,6 +24181,9 @@ msgstr ""
msgid "PackageRegistry|Copy require package include"
msgstr ""
+msgid "PackageRegistry|Copy target SHA"
+msgstr ""
+
msgid "PackageRegistry|Copy yarn command"
msgstr ""
@@ -23931,6 +24250,9 @@ msgstr ""
msgid "PackageRegistry|Install package version"
msgstr ""
+msgid "PackageRegistry|Instance-level"
+msgstr ""
+
msgid "PackageRegistry|Invalid Package: failed metadata extraction"
msgstr ""
@@ -23976,6 +24298,9 @@ msgstr ""
msgid "PackageRegistry|Pip Command"
msgstr ""
+msgid "PackageRegistry|Project-level"
+msgstr ""
+
msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
msgstr ""
@@ -23997,6 +24322,9 @@ msgstr ""
msgid "PackageRegistry|Remove package"
msgstr ""
+msgid "PackageRegistry|Required Python: %{pythonVersion}"
+msgstr ""
+
msgid "PackageRegistry|RubyGems"
msgstr ""
@@ -24039,6 +24367,9 @@ msgstr ""
msgid "PackageRegistry|Source project located at %{link}"
msgstr ""
+msgid "PackageRegistry|Target SHA: %{sha}"
+msgstr ""
+
msgid "PackageRegistry|There are no other versions of this package."
msgstr ""
@@ -24207,6 +24538,18 @@ msgstr ""
msgid "Password was successfully updated. Please sign in again."
msgstr ""
+msgid "PasswordPrompt|Confirm password"
+msgstr ""
+
+msgid "PasswordPrompt|Confirm password to continue"
+msgstr ""
+
+msgid "PasswordPrompt|Password is required"
+msgstr ""
+
+msgid "PasswordPrompt|Please enter your password to confirm"
+msgstr ""
+
msgid "Passwords should be unique and not used for any other sites or services."
msgstr ""
@@ -24234,6 +24577,9 @@ msgstr ""
msgid "Paste project path (i.e. gitlab-org/gitlab)"
msgstr ""
+msgid "Paste this DSN into your Sentry SDK"
+msgstr ""
+
msgid "Paste your public SSH key, which is usually contained in the file '~/.ssh/id_ed25519.pub' or '~/.ssh/id_rsa.pub' and begins with 'ssh-ed25519' or 'ssh-rsa'. Do not paste your private SSH key, as that can compromise your identity."
msgstr ""
@@ -24318,6 +24664,9 @@ msgstr ""
msgid "PerformanceBar|First Contentful Paint"
msgstr ""
+msgid "PerformanceBar|Flamegraph with mode:"
+msgstr ""
+
msgid "PerformanceBar|Frontend resources"
msgstr ""
@@ -24351,6 +24700,15 @@ msgstr ""
msgid "PerformanceBar|Trace"
msgstr ""
+msgid "PerformanceBar|cpu"
+msgstr ""
+
+msgid "PerformanceBar|object"
+msgstr ""
+
+msgid "PerformanceBar|wall"
+msgstr ""
+
msgid "Period in seconds"
msgstr ""
@@ -24579,6 +24937,48 @@ msgstr ""
msgid "PipelineSchedules|Variables"
msgstr ""
+msgid "PipelineSource|API"
+msgstr ""
+
+msgid "PipelineSource|Chat"
+msgstr ""
+
+msgid "PipelineSource|External"
+msgstr ""
+
+msgid "PipelineSource|External Pull Request"
+msgstr ""
+
+msgid "PipelineSource|Merge Request"
+msgstr ""
+
+msgid "PipelineSource|On-Demand DAST Scan"
+msgstr ""
+
+msgid "PipelineSource|On-Demand DAST Validation"
+msgstr ""
+
+msgid "PipelineSource|Parent Pipeline"
+msgstr ""
+
+msgid "PipelineSource|Pipeline"
+msgstr ""
+
+msgid "PipelineSource|Push"
+msgstr ""
+
+msgid "PipelineSource|Schedule"
+msgstr ""
+
+msgid "PipelineSource|Trigger"
+msgstr ""
+
+msgid "PipelineSource|Web"
+msgstr ""
+
+msgid "PipelineSource|Web IDE"
+msgstr ""
+
msgid "PipelineStatusTooltip|Pipeline: %{ciStatus}"
msgstr ""
@@ -24879,46 +25279,7 @@ msgstr ""
msgid "Pipeline|Source"
msgstr ""
-msgid "Pipeline|Source|API"
-msgstr ""
-
-msgid "Pipeline|Source|Chat"
-msgstr ""
-
-msgid "Pipeline|Source|External"
-msgstr ""
-
-msgid "Pipeline|Source|External Pull Request"
-msgstr ""
-
-msgid "Pipeline|Source|Merge Request"
-msgstr ""
-
-msgid "Pipeline|Source|On-Demand DAST Scan"
-msgstr ""
-
-msgid "Pipeline|Source|On-Demand DAST Validation"
-msgstr ""
-
-msgid "Pipeline|Source|Parent Pipeline"
-msgstr ""
-
-msgid "Pipeline|Source|Pipeline"
-msgstr ""
-
-msgid "Pipeline|Source|Push"
-msgstr ""
-
-msgid "Pipeline|Source|Schedule"
-msgstr ""
-
-msgid "Pipeline|Source|Trigger"
-msgstr ""
-
-msgid "Pipeline|Source|Web"
-msgstr ""
-
-msgid "Pipeline|Source|Web IDE"
+msgid "Pipeline|Source|Security Policy"
msgstr ""
msgid "Pipeline|Specify variable values to be used in this run. The values specified in %{linkStart}CI/CD settings%{linkEnd} will be used by default."
@@ -24969,7 +25330,7 @@ msgstr ""
msgid "Pipeline|We are currently unable to fetch pipeline data"
msgstr ""
-msgid "Pipeline|You’re about to stop pipeline %{pipelineId}."
+msgid "Pipeline|You’re about to stop pipeline #%{pipelineId}."
msgstr ""
msgid "Pipeline|for"
@@ -24996,6 +25357,9 @@ msgstr ""
msgid "Plain diff"
msgstr ""
+msgid "Plain-text response to send to clients that hit a rate limit"
+msgstr ""
+
msgid "Plan:"
msgstr ""
@@ -25140,9 +25504,6 @@ msgstr ""
msgid "Please provide attributes to update"
msgstr ""
-msgid "Please provide your username or email address."
-msgstr ""
-
msgid "Please reach out if you have any questions and we'll be happy to assist."
msgstr ""
@@ -25185,9 +25546,6 @@ msgstr ""
msgid "Please set a new password before proceeding."
msgstr ""
-msgid "Please share your feedback about %{featureName} %{linkStart}in this issue%{linkEnd} to help us improve the experience."
-msgstr ""
-
msgid "Please solve the captcha"
msgstr ""
@@ -25365,6 +25723,9 @@ msgstr ""
msgid "Prevent adding new members to project membership within this group"
msgstr ""
+msgid "Prevent auto-stopping"
+msgstr ""
+
msgid "Prevent editing approval rules in projects and merge requests."
msgstr ""
@@ -25377,7 +25738,7 @@ msgstr ""
msgid "Prevent users from changing their profile name"
msgstr ""
-msgid "Prevent users from performing write operations on GitLab while performing maintenance."
+msgid "Prevent users from performing write operations while GitLab maintenance is in progress."
msgstr ""
msgid "Preview"
@@ -25650,6 +26011,9 @@ msgstr ""
msgid "Profiles|Enter your name, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Enter your password to confirm the email change"
+msgstr ""
+
msgid "Profiles|Enter your pronouns to let people know how to refer to you"
msgstr ""
@@ -25884,10 +26248,10 @@ msgstr ""
msgid "Profiles|e.g. My MacBook key"
msgstr ""
-msgid "Profiles|username"
+msgid "Profiles|https://website.com"
msgstr ""
-msgid "Profiles|website.com"
+msgid "Profiles|username"
msgstr ""
msgid "Profiles|your account"
@@ -26130,9 +26494,21 @@ msgstr ""
msgid "ProjectSelect| or group"
msgstr ""
+msgid "ProjectSelect|No matching results"
+msgstr ""
+
msgid "ProjectSelect|Search for project"
msgstr ""
+msgid "ProjectSelect|Search projects"
+msgstr ""
+
+msgid "ProjectSelect|Select a project"
+msgstr ""
+
+msgid "ProjectSelect|There was an error fetching the projects. Please try again."
+msgstr ""
+
msgid "ProjectService|Drone server URL"
msgstr ""
@@ -26220,6 +26596,9 @@ msgstr ""
msgid "ProjectService|Trigger event when a new, unique alert is recorded."
msgstr ""
+msgid "ProjectService|Trigger event when a new, unique vulnerability is recorded. (Note: This feature requires an Ultimate plan.)"
+msgstr ""
+
msgid "ProjectService|Trigger event when a pipeline status changes."
msgstr ""
@@ -26634,9 +27013,15 @@ msgstr ""
msgid "Projects are graded based on the highest severity vulnerability present"
msgstr ""
+msgid "Projects are organized into groups"
+msgstr ""
+
msgid "Projects contributed to"
msgstr ""
+msgid "Projects help you organize your work. They contain your file repository, issues, merge requests, and so much more."
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr ""
@@ -26871,10 +27256,10 @@ msgstr ""
msgid "PrometheusService|Prometheus cluster integration"
msgstr ""
-msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
+msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
msgstr ""
-msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
+msgid "PrometheusService|The ID of the IAP-secured resource."
msgstr ""
msgid "PrometheusService|The Prometheus API base URL."
@@ -27492,6 +27877,9 @@ msgstr ""
msgid "Rate limit"
msgstr ""
+msgid "Rate limits can help reduce request volume (like from crawlers or abusive bots)."
+msgstr ""
+
msgid "Raw blob request rate limit per minute"
msgstr ""
@@ -27504,6 +27892,9 @@ msgstr ""
msgid "Re-authentication required"
msgstr ""
+msgid "Re-import"
+msgstr ""
+
msgid "Re-request review"
msgstr ""
@@ -27525,6 +27916,9 @@ msgstr ""
msgid "Read more about related issues"
msgstr ""
+msgid "Read their documentation."
+msgstr ""
+
msgid "Ready to get started with GitLab? Follow these steps to set up your workspace, plan and commit changes, and deploy your project."
msgstr ""
@@ -27558,6 +27952,9 @@ msgstr ""
msgid "Receive any notifications from GitLab."
msgstr ""
+msgid "Receive notification of abuse reports by email."
+msgstr ""
+
msgid "Receive notifications about your own activity"
msgstr ""
@@ -27701,9 +28098,6 @@ msgstr ""
msgid "Registry setup"
msgstr ""
-msgid "Regulate approvals by authors/committers. Affects all projects."
-msgstr ""
-
msgid "Reindexing Status: %{status} (Slice multiplier: %{multiplier}, Maximum running slices: %{max_slices})"
msgstr ""
@@ -27799,6 +28193,9 @@ msgstr ""
msgid "Release|Something went wrong while saving the release details."
msgstr ""
+msgid "Reload page"
+msgstr ""
+
msgid "Remediations"
msgstr ""
@@ -28081,6 +28478,9 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
+msgid "Repeats"
+msgstr ""
+
msgid "Replace"
msgstr ""
@@ -28443,10 +28843,7 @@ msgstr ""
msgid "Require additional authentication for administrative tasks."
msgstr ""
-msgid "Require all users in this group to setup Two-factor authentication"
-msgstr ""
-
-msgid "Require all users in this group to setup two-factor authentication"
+msgid "Require all users in this group to set up two-factor authentication"
msgstr ""
msgid "Required approvals (%{approvals_given} given)"
@@ -28492,6 +28889,9 @@ msgstr[1] ""
msgid "Requires values to meet regular expression requirements."
msgstr ""
+msgid "Requires you to deploy or set up cloud-hosted Sentry."
+msgstr ""
+
msgid "Requires your primary GitLab email address."
msgstr ""
@@ -28552,9 +28952,6 @@ msgstr ""
msgid "Resolve"
msgstr ""
-msgid "Resolve all threads in new issue"
-msgstr ""
-
msgid "Resolve conflicts"
msgstr ""
@@ -28612,6 +29009,9 @@ msgstr ""
msgid "Response text"
msgstr ""
+msgid "Restart GitLab to apply changes."
+msgstr ""
+
msgid "Restart Terminal"
msgstr ""
@@ -28630,6 +29030,9 @@ msgstr ""
msgid "Restoring the project will prevent the project from being removed on this date and restore people's ability to make changes to it."
msgstr ""
+msgid "Restrict group access by IP address. %{link_start}Learn more%{link_end}."
+msgstr ""
+
msgid "Restrict membership by email domain"
msgstr ""
@@ -28943,6 +29346,9 @@ msgstr ""
msgid "Runners|Runner #%{runner_id}"
msgstr ""
+msgid "Runners|Runner assigned to project."
+msgstr ""
+
msgid "Runners|Runner is offline, last contact was %{runner_contact} ago"
msgstr ""
@@ -28955,6 +29361,9 @@ msgstr ""
msgid "Runners|Runner registration"
msgstr ""
+msgid "Runners|Runner unassigned from project."
+msgstr ""
+
msgid "Runners|Runners"
msgstr ""
@@ -29147,7 +29556,7 @@ msgstr ""
msgid "SastEntryPoints|How do I set up SAST?"
msgstr ""
-msgid "SastEntryPoints|Learn more."
+msgid "SastEntryPoints|Learn more"
msgstr ""
msgid "Satisfied"
@@ -29189,7 +29598,7 @@ msgstr ""
msgid "Save pipeline schedule"
msgstr ""
-msgid "Save space and find images in the container Registry. remove unneeded tags and keep only the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
+msgid "Save storage space by automatically deleting tags from the container registry and keeping the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
msgstr ""
msgid "Saving"
@@ -29363,6 +29772,9 @@ msgstr ""
msgid "Search or filter results…"
msgstr ""
+msgid "Search or jump to..."
+msgstr ""
+
msgid "Search project"
msgstr ""
@@ -29423,16 +29835,16 @@ msgstr ""
msgid "SearchCodeResults|of %{link_to_project}"
msgstr ""
-msgid "SearchResults|Showing %{count} %{scope} for%{term_element}"
+msgid "SearchResults|Showing %{count} %{scope} for %{term_element}"
msgstr ""
-msgid "SearchResults|Showing %{count} %{scope} for%{term_element} in your personal and project snippets"
+msgid "SearchResults|Showing %{count} %{scope} for %{term_element} in your personal and project snippets"
msgstr ""
-msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for%{term_element}"
+msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for %{term_element}"
msgstr ""
-msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for%{term_element} in your personal and project snippets"
+msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for %{term_element} in your personal and project snippets"
msgstr ""
msgid "SearchResults|code result"
@@ -29514,6 +29926,9 @@ msgstr ""
msgid "Secret Detection"
msgstr ""
+msgid "Secret access key"
+msgstr ""
+
msgid "Secret token"
msgstr ""
@@ -29553,9 +29968,6 @@ msgstr ""
msgid "SecurityApprovals|A merge request approval is required when the license compliance report contains a denied license."
msgstr ""
-msgid "SecurityApprovals|Configurable if security scanners are enabled. %{linkStart}Learn more.%{linkEnd}"
-msgstr ""
-
msgid "SecurityApprovals|Coverage-Check"
msgstr ""
@@ -29568,24 +29980,18 @@ msgstr ""
msgid "SecurityApprovals|Learn more about Vulnerability-Check"
msgstr ""
-msgid "SecurityApprovals|License Scanning must be enabled. %{linkStart}Learn more%{linkEnd}."
-msgstr ""
-
msgid "SecurityApprovals|License-Check"
msgstr ""
msgid "SecurityApprovals|Requires approval for Denied licenses. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}More information%{linkEnd}"
+msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "SecurityApprovals|Requires approval for vulnerabilities. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
-msgid "SecurityApprovals|Test coverage must be enabled. %{linkStart}Learn more%{linkEnd}."
-msgstr ""
-
msgid "SecurityApprovals|Vulnerability-Check"
msgstr ""
@@ -29649,6 +30055,12 @@ msgstr ""
msgid "SecurityConfiguration|Immediately begin risk analysis and remediation with application security features. Start with SAST and Secret Detection, available to all plans. Upgrade to Ultimate to get all features, including:"
msgstr ""
+msgid "SecurityConfiguration|Manage corpus"
+msgstr ""
+
+msgid "SecurityConfiguration|Manage corpus files used as mutation sources in coverage fuzzing."
+msgstr ""
+
msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
msgstr ""
@@ -29703,6 +30115,12 @@ msgstr ""
msgid "SecurityOrchestration|Action"
msgstr ""
+msgid "SecurityOrchestration|Actions"
+msgstr ""
+
+msgid "SecurityOrchestration|Add rule"
+msgstr ""
+
msgid "SecurityOrchestration|All policies"
msgstr ""
@@ -29736,9 +30154,6 @@ msgstr ""
msgid "SecurityOrchestration|Network"
msgstr ""
-msgid "SecurityOrchestration|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
-msgstr ""
-
msgid "SecurityOrchestration|New policy"
msgstr ""
@@ -29754,6 +30169,9 @@ msgstr ""
msgid "SecurityOrchestration|Policy editor"
msgstr ""
+msgid "SecurityOrchestration|Policy preview"
+msgstr ""
+
msgid "SecurityOrchestration|Policy status"
msgstr ""
@@ -29763,6 +30181,9 @@ msgstr ""
msgid "SecurityOrchestration|Rule"
msgstr ""
+msgid "SecurityOrchestration|Rules"
+msgstr ""
+
msgid "SecurityOrchestration|Scan Execution"
msgstr ""
@@ -29856,6 +30277,9 @@ msgstr ""
msgid "SecurityReports|Create issue"
msgstr ""
+msgid "SecurityReports|Development vulnerabilities"
+msgstr ""
+
msgid "SecurityReports|Dismiss vulnerability"
msgstr ""
@@ -29871,6 +30295,9 @@ msgstr ""
msgid "SecurityReports|Download results"
msgstr ""
+msgid "SecurityReports|Download scanned URLs"
+msgstr ""
+
msgid "SecurityReports|Download scanned resources"
msgstr ""
@@ -29994,6 +30421,9 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
+msgid "SecurityReports|The Vulnerability Report shows the results of the lastest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "SecurityReports|The security reports below contain one or more vulnerability findings that could not be parsed and were not recorded. Download the artifacts in the job output to investigate. Ensure any security report created conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
msgstr ""
@@ -30135,10 +30565,10 @@ msgstr ""
msgid "Select a repository"
msgstr ""
-msgid "Select a role"
+msgid "Select a repository containing templates for common files."
msgstr ""
-msgid "Select a shared template repository for all projects on this instance."
+msgid "Select a role"
msgstr ""
msgid "Select a template repository"
@@ -30216,6 +30646,9 @@ msgstr ""
msgid "Select project to choose zone"
msgstr ""
+msgid "Select project to create issue"
+msgstr ""
+
msgid "Select projects"
msgstr ""
@@ -30333,6 +30766,9 @@ msgstr ""
msgid "Send emails to help guide new users through the onboarding process."
msgstr ""
+msgid "Send emails to users upon account deactivation."
+msgstr ""
+
msgid "Send message"
msgstr ""
@@ -30351,6 +30787,9 @@ msgstr ""
msgid "Send service data"
msgstr ""
+msgid "Sentry"
+msgstr ""
+
msgid "Sentry API URL"
msgstr ""
@@ -30465,6 +30904,9 @@ msgstr ""
msgid "Service"
msgstr ""
+msgid "Service Accounts keys are required to authorize GitLab to deploy your Google Cloud project."
+msgstr ""
+
msgid "Service Desk"
msgstr ""
@@ -30537,15 +30979,15 @@ msgstr ""
msgid "Set a password on your account to pull or push via %{protocol}."
msgstr ""
-msgid "Set a template repository for projects in this group"
-msgstr ""
-
msgid "Set access permissions for this token."
msgstr ""
msgid "Set an instance-wide domain that will be available to all clusters when installing Knative."
msgstr ""
+msgid "Set any rate limit to %{code_open}0%{code_close} to disable the limit."
+msgstr ""
+
msgid "Set default and restrict visibility levels. Configure import sources and git access protocol."
msgstr ""
@@ -30558,7 +31000,7 @@ msgstr ""
msgid "Set limit to 0 to allow any file size."
msgstr ""
-msgid "Set max session time for web terminal."
+msgid "Set limits for web and API requests."
msgstr ""
msgid "Set milestone"
@@ -30567,15 +31009,18 @@ msgstr ""
msgid "Set new password"
msgstr ""
-msgid "Set notification email for abuse reports."
+msgid "Set parent epic to an epic"
msgstr ""
-msgid "Set parent epic to an epic"
+msgid "Set per-user rate limits for imports and exports of projects and groups."
msgstr ""
msgid "Set projects and maximum size limits, session duration, user options, and check feature availability for namespace plan."
msgstr ""
+msgid "Set rate limits for package registry API requests that supersede the general user and IP rate limits."
+msgstr ""
+
msgid "Set severity"
msgstr ""
@@ -30594,15 +31039,24 @@ msgstr ""
msgid "Set the default branch for this project. All merge requests and commits are made against this branch unless you specify a different one."
msgstr ""
+msgid "Set the default expiration time for job artifacts in all projects. Set to %{code_open}0%{code_close} to never expire artifacts by default. If no unit is written, it defaults to seconds. For example, these are all equivalent: %{code_open}3600%{code_close}, %{code_open}60 minutes%{code_close}, or %{code_open}one hour%{code_close}."
+msgstr ""
+
msgid "Set the due date to %{due_date}."
msgstr ""
msgid "Set the iteration to %{iteration_reference}."
msgstr ""
+msgid "Set the maximum session time for a web terminal."
+msgstr ""
+
msgid "Set the milestone to %{milestone_reference}."
msgstr ""
+msgid "Set the per-user rate limit for notes created by web or API requests."
+msgstr ""
+
msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
msgstr ""
@@ -30804,6 +31258,9 @@ msgstr ""
msgid "Show Pipeline IID"
msgstr ""
+msgid "Show all %{issuable_type}."
+msgstr ""
+
msgid "Show all activity"
msgstr ""
@@ -30855,15 +31312,9 @@ msgstr ""
msgid "Show list"
msgstr ""
-msgid "Show me advanced features"
-msgstr ""
-
msgid "Show me how to add a pipeline"
msgstr ""
-msgid "Show me the basics"
-msgstr ""
-
msgid "Show one file at a time"
msgstr ""
@@ -30904,15 +31355,15 @@ msgstr ""
msgid "Showing %{pageSize} of %{total} %{issuableType}"
msgstr ""
-msgid "Showing %{pageSize} of %{total} issues"
-msgstr ""
-
msgid "Showing all epics"
msgstr ""
msgid "Showing all issues"
msgstr ""
+msgid "Showing data for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
+msgstr ""
+
msgid "Showing data for workflow items created in this date range. Date range cannot exceed %{maxDateRange} days."
msgstr ""
@@ -30952,6 +31403,15 @@ msgstr ""
msgid "Sidebar|Weight"
msgstr ""
+msgid "Sidekiq job compression threshold (bytes)"
+msgstr ""
+
+msgid "Sidekiq job size limit (bytes)"
+msgstr ""
+
+msgid "Sidekiq job size limits"
+msgstr ""
+
msgid "Sign in"
msgstr ""
@@ -31072,6 +31532,9 @@ msgstr ""
msgid "Site profile not found for given parameters"
msgstr ""
+msgid "Sites"
+msgstr ""
+
msgid "Size"
msgstr ""
@@ -31102,19 +31565,22 @@ msgstr ""
msgid "SlackIntegration|Sends notifications about project events to Slack channels."
msgstr ""
-msgid "SlackService|2. Paste the %{strong_open}Token%{strong_close} into the field below"
+msgid "SlackService|1. %{slash_command_link_start}Add a slash command%{slash_command_link_end} in your Slack team using this information:"
msgstr ""
-msgid "SlackService|3. Select the %{strong_open}Active%{strong_close} checkbox, press %{strong_open}Save changes%{strong_close} and start using GitLab inside Slack!"
+msgid "SlackService|2. Paste the token from Slack in the %{strong_open}Token%{strong_close} field below."
msgstr ""
-msgid "SlackService|Fill in the word that works best for your team."
+msgid "SlackService|3. Select the %{strong_open}Active%{strong_close} checkbox, select %{strong_open}Save changes%{strong_close}, and start using slash commands in Slack!"
+msgstr ""
+
+msgid "SlackService|After setup, get a list of available Slack slash commands by entering"
msgstr ""
-msgid "SlackService|See list of available commands in Slack after setting up this service, by entering"
+msgid "SlackService|Fill in the word that works best for your team."
msgstr ""
-msgid "SlackService|This service allows users to perform common operations on this project by entering slash commands in Slack."
+msgid "SlackService|Perform common operations in this project by entering slash commands in Slack."
msgstr ""
msgid "Slice multiplier"
@@ -31180,7 +31646,7 @@ msgstr ""
msgid "Some child epics may be hidden due to applied filters"
msgstr ""
-msgid "Some common domains are not allowed. %{read_more_link}."
+msgid "Some common domains are not allowed. %{learn_more_link}."
msgstr ""
msgid "Some of the designs you tried uploading did not change:"
@@ -31264,9 +31730,6 @@ msgstr ""
msgid "Something went wrong while exporting requirements"
msgstr ""
-msgid "Something went wrong while fetching %{listType} list"
-msgstr ""
-
msgid "Something went wrong while fetching branches"
msgstr ""
@@ -31321,15 +31784,9 @@ msgstr ""
msgid "Something went wrong while merging this merge request. Please try again."
msgstr ""
-msgid "Something went wrong while moving issues."
-msgstr ""
-
msgid "Something went wrong while obtaining the Let's Encrypt certificate."
msgstr ""
-msgid "Something went wrong while performing the action."
-msgstr ""
-
msgid "Something went wrong while promoting the issue to an epic. Please try again."
msgstr ""
@@ -31657,7 +32114,10 @@ msgstr ""
msgid "SourcegraphPreferences|Uses a custom %{linkStart}Sourcegraph instance%{linkEnd}."
msgstr ""
-msgid "Spam Check API Key"
+msgid "Spam Check"
+msgstr ""
+
+msgid "Spam Check API key"
msgstr ""
msgid "Spam Logs"
@@ -31675,7 +32135,7 @@ msgstr ""
msgid "Specified URL cannot be used: \"%{reason}\""
msgstr ""
-msgid "Specify an e-mail address regex pattern to identify default internal users."
+msgid "Specify an email address regex pattern to identify default internal users."
msgstr ""
msgid "Speed up your pipelines with Needs relationships"
@@ -31930,7 +32390,7 @@ msgstr ""
msgid "StatusCheck|An error occurred fetching the status checks."
msgstr ""
-msgid "StatusCheck|Apply this status check to any branch or a specific protected branch."
+msgid "StatusCheck|Apply this status check to all branches or a specific protected branch."
msgstr ""
msgid "StatusCheck|Check for a status response in Merge Requests. Failures do not block merges. %{link_start}Learn more%{link_end}."
@@ -32269,6 +32729,9 @@ msgstr ""
msgid "Subscriptions"
msgstr ""
+msgid "Subscription|Your subscription for %{strong}%{namespace_name}%{strong_close} has expired and you are now on %{pricing_link_start}the GitLab Free tier%{pricing_link_end}. Don't worry, your data is safe. Get in touch with our support team (%{support_email}). They'll gladly help with your subscription renewal."
+msgstr ""
+
msgid "Subtracted"
msgstr ""
@@ -32497,6 +32960,9 @@ msgstr ""
msgid "SuperSonics|Plan"
msgstr ""
+msgid "SuperSonics|Please agree to the Subscription Agreement"
+msgstr ""
+
msgid "SuperSonics|Ready to get started? A GitLab plan is ideal for scaling organizations and for multi team usage."
msgstr ""
@@ -32527,6 +32993,9 @@ msgstr ""
msgid "SuperSonics|The activation code is not valid. Please make sure to copy it exactly from the Customers Portal or confirmation email. Learn more about %{linkStart}activating your subscription%{linkEnd}."
msgstr ""
+msgid "SuperSonics|The activation code should be a 24-character alphanumeric string"
+msgstr ""
+
msgid "SuperSonics|There is a connectivity issue."
msgstr ""
@@ -32569,9 +33038,15 @@ msgstr ""
msgid "SuperSonics|You do not have an active subscription"
msgstr ""
+msgid "SuperSonics|You have successfully added a license that activates on %{date}. Please see the subscription history table below for more details."
+msgstr ""
+
msgid "SuperSonics|You'll be charged for %{trueUpLinkStart}users over license%{trueUpLinkEnd} on a quarterly or annual basis, depending on the terms of your agreement."
msgstr ""
+msgid "SuperSonics|Your future dated license was successfully added"
+msgstr ""
+
msgid "SuperSonics|Your subscription"
msgstr ""
@@ -32824,7 +33299,7 @@ msgstr ""
msgid "Template to append to all Service Desk issues"
msgstr ""
-msgid "TemplateRepository|Select a repository to make its templates available to all projects. %{link_start}What should the repository contain?%{link_end} "
+msgid "TemplateRepository|Create common files more quickly, and standardize their format."
msgstr ""
msgid "Templates"
@@ -33030,7 +33505,7 @@ msgstr ""
msgid "TestCases|Search test cases"
msgstr ""
-msgid "TestCases|Something went wrong while adding test case to Todo."
+msgid "TestCases|Something went wrong while adding test case to a to-do item."
msgstr ""
msgid "TestCases|Something went wrong while creating a test case."
@@ -33042,7 +33517,7 @@ msgstr ""
msgid "TestCases|Something went wrong while fetching test cases list."
msgstr ""
-msgid "TestCases|Something went wrong while marking test case todo as done."
+msgid "TestCases|Something went wrong while marking test case to-do item as done."
msgstr ""
msgid "TestCases|Something went wrong while moving test case."
@@ -33162,7 +33637,7 @@ msgstr ""
msgid "Thanks for your purchase!"
msgstr ""
-msgid "That is ok, I do not want to renew"
+msgid "That's OK, I don't want to renew"
msgstr ""
msgid "That's it, well done!"
@@ -33185,7 +33660,7 @@ msgid_plural "The %{type} contains the following errors:"
msgstr[0] ""
msgstr[1] ""
-msgid "The API key used by GitLab for accessing the Spam Check service endpoint"
+msgid "The API key used by GitLab for accessing the Spam Check service endpoint."
msgstr ""
msgid "The GitLab subscription service (customers.gitlab.com) is currently experiencing an outage. You can monitor the status and get updates at %{linkStart}status.gitlab.com%{linkEnd}."
@@ -33224,9 +33699,6 @@ msgstr ""
msgid "The URL to use for connecting to Elasticsearch. Use a comma-separated list to support clustering (e.g., \"http://localhost:9200, http://localhost:9201\")."
msgstr ""
-msgid "The Vulnerability Report shows the results of the last successful pipeline run on the default branch."
-msgstr ""
-
msgid "The X509 Certificate to use when mutual TLS is required to communicate with the external authorization service. If left blank, the server certificate is still validated when accessing over HTTPS."
msgstr ""
@@ -33284,9 +33756,6 @@ msgstr ""
msgid "The default branch for this project has been changed. Please update your bookmarks."
msgstr ""
-msgid "The default expiration time for job artifacts. 0 for unlimited. The default unit is in seconds, but you can use other units, for example %{code_open}4 mins 2 sec%{code_close}, %{code_open}2h42min%{code_close}."
-msgstr ""
-
msgid "The dependency list details information about the components used within your project."
msgstr ""
@@ -33478,9 +33947,6 @@ msgstr ""
msgid "The merge conflicts for this merge request have already been resolved. Please return to the merge request."
msgstr ""
-msgid "The merge request can now be merged."
-msgstr ""
-
msgid "The metric must be one of %{metrics}."
msgstr ""
@@ -33856,7 +34322,7 @@ msgstr ""
msgid "There was a problem updating the keep latest artifacts setting."
msgstr ""
-msgid "There was an error %{message} todo."
+msgid "There was an error %{message} to-do item."
msgstr ""
msgid "There was an error adding a To Do."
@@ -33895,6 +34361,9 @@ msgstr ""
msgid "There was an error fetching projects"
msgstr ""
+msgid "There was an error fetching search autocomplete suggestions"
+msgstr ""
+
msgid "There was an error fetching stage total counts"
msgstr ""
@@ -34219,6 +34688,9 @@ msgstr ""
msgid "This field is required."
msgstr ""
+msgid "This form is disabled in preview"
+msgstr ""
+
msgid "This group"
msgstr ""
@@ -34240,9 +34712,6 @@ msgstr ""
msgid "This group is linked to a subscription"
msgstr ""
-msgid "This group, including all subgroups, projects and git repositories, will be reachable from only the specified IP address ranges."
-msgstr ""
-
msgid "This group, its subgroups and projects has been scheduled for removal on %{date}."
msgstr ""
@@ -34522,9 +34991,6 @@ msgstr ""
msgid "This user cannot be unlocked manually from GitLab"
msgstr ""
-msgid "This user does not have a pending request"
-msgstr ""
-
msgid "This user has an unconfirmed email address (%{email}). You may force a confirmation."
msgstr ""
@@ -34633,9 +35099,6 @@ msgstr ""
msgid "ThreatMonitoring|Packet Activity"
msgstr ""
-msgid "ThreatMonitoring|Policies"
-msgstr ""
-
msgid "ThreatMonitoring|Requests"
msgstr ""
@@ -34687,6 +35150,12 @@ msgstr ""
msgid "ThreatMonitoring|View documentation"
msgstr ""
+msgid "Threshold in bytes at which to compress Sidekiq job arguments."
+msgstr ""
+
+msgid "Threshold in bytes at which to reject Sidekiq jobs. Set this to 0 to if you don't want to limit Sidekiq jobs."
+msgstr ""
+
msgid "Throughput"
msgstr ""
@@ -34696,6 +35165,9 @@ msgstr ""
msgid "Time"
msgstr ""
+msgid "Time (in hours) that users are allowed to skip forced configuration of two-factor authentication."
+msgstr ""
+
msgid "Time Spent"
msgstr ""
@@ -34762,7 +35234,7 @@ msgstr ""
msgid "TimeTrackingEstimated|Est"
msgstr ""
-msgid "TimeTracking|%{startTag}Spent: %{endTag}%{timeSpentHumanReadable}"
+msgid "TimeTracking|%{spentStart}Spent: %{spentEnd}"
msgstr ""
msgid "TimeTracking|Estimated:"
@@ -34976,6 +35448,9 @@ msgstr ""
msgid "To access this domain create a new DNS record"
msgstr ""
+msgid "To add a custom suffix, set up a Service Desk email address. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "To add an SSH key you need to %{generate_link_start}generate one%{link_end} or use an %{existing_link_start}existing key%{link_end}."
msgstr ""
@@ -34997,13 +35472,16 @@ msgstr ""
msgid "To connect an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To continue using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
+msgstr ""
+
msgid "To continue, you need to select the link in the confirmation email we sent to verify your email address. If you didn't get our email, select %{strongStart}Resend confirmation email.%{strongEnd}"
msgstr ""
msgid "To define internal users, first enable new users set to external"
msgstr ""
-msgid "To enable Registration Features, make sure \"Enable service ping\" is checked."
+msgid "To enable Registration Features, first enable Service Ping."
msgstr ""
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
@@ -35030,7 +35508,7 @@ msgstr ""
msgid "To get started, use the link below to confirm your account."
msgstr ""
-msgid "To help improve GitLab and its user experience, GitLab will periodically collect usage information."
+msgid "To help improve GitLab and its user experience, GitLab periodically collects usage information."
msgstr ""
msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
@@ -35063,7 +35541,7 @@ msgstr ""
msgid "To preserve performance only %{strong_open}%{display_size} of %{real_size}%{strong_close} files are displayed."
msgstr ""
-msgid "To protect this issue's confidentiality, %{forkLink} and set the fork's visibility to private."
+msgid "To protect this issue's confidentiality, %{linkStart}fork this project%{linkEnd} and set the fork's visibility to private."
msgstr ""
msgid "To protect this issue's confidentiality, a private fork of this project was selected."
@@ -35096,12 +35574,15 @@ msgstr ""
msgid "To set up SAML authentication for your group through an identity provider like Azure, Okta, Onelogin, Ping Identity, or your custom SAML 2.0 provider:"
msgstr ""
-msgid "To set up this service:"
+msgid "To set up this integration:"
msgstr ""
msgid "To specify the notification level per project of a group you belong to, you need to visit project page and change notification level there."
msgstr ""
+msgid "To start using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
+msgstr ""
+
msgid "To unsubscribe from this issue, please paste the following link into your browser:"
msgstr ""
@@ -35689,9 +36170,6 @@ msgstr ""
msgid "Unable to fetch branches list, please close the form and try again"
msgstr ""
-msgid "Unable to fetch unscanned projects"
-msgstr ""
-
msgid "Unable to fetch vulnerable projects"
msgstr ""
@@ -35746,6 +36224,15 @@ msgstr ""
msgid "Unable to update this issue at this time."
msgstr ""
+msgid "Unapprove a merge request"
+msgstr ""
+
+msgid "Unapprove the current merge request."
+msgstr ""
+
+msgid "Unapproved the current merge request."
+msgstr ""
+
msgid "Unarchive project"
msgstr ""
@@ -35758,16 +36245,13 @@ msgstr ""
msgid "Unassigned"
msgstr ""
-msgid "Unauthenticated API request rate limit"
-msgstr ""
-
-msgid "Unauthenticated rate limit period in seconds"
+msgid "Unauthenticated API rate limit period in seconds"
msgstr ""
-msgid "Unauthenticated request rate limit"
+msgid "Unauthenticated requests"
msgstr ""
-msgid "Unauthenticated requests"
+msgid "Unauthenticated web rate limit period in seconds"
msgstr ""
msgid "Undo"
@@ -35869,18 +36353,6 @@ msgstr ""
msgid "Unresolved"
msgstr ""
-msgid "UnscannedProjects|15 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|30 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|5 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|60 or more days"
-msgstr ""
-
msgid "Unschedule job"
msgstr ""
@@ -36100,6 +36572,9 @@ msgstr ""
msgid "UsageQuota|%{help_link_start}Shared runners%{help_link_end} are disabled, so there are no limits set on pipeline usage"
msgstr ""
+msgid "UsageQuota|%{linkTitle} help link"
+msgstr ""
+
msgid "UsageQuota|%{percentageLeft} of purchased storage is available"
msgstr ""
@@ -36109,6 +36584,9 @@ msgstr ""
msgid "UsageQuota|Artifacts is a sum of build and pipeline artifacts."
msgstr ""
+msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
+msgstr ""
+
msgid "UsageQuota|Buy additional minutes"
msgstr ""
@@ -36118,9 +36596,21 @@ msgstr ""
msgid "UsageQuota|CI minutes usage by project"
msgstr ""
+msgid "UsageQuota|Code packages and container images."
+msgstr ""
+
msgid "UsageQuota|Current period usage"
msgstr ""
+msgid "UsageQuota|File attachments and smaller design graphics."
+msgstr ""
+
+msgid "UsageQuota|Git repository, managed by the Gitaly service."
+msgstr ""
+
+msgid "UsageQuota|Includes project registry, artifacts, packages, wiki, uploads and other items."
+msgstr ""
+
msgid "UsageQuota|Increase storage temporarily"
msgstr ""
@@ -36139,6 +36629,9 @@ msgstr ""
msgid "UsageQuota|Packages"
msgstr ""
+msgid "UsageQuota|Pipeline artifacts and job artifacts, created with CI/CD."
+msgstr ""
+
msgid "UsageQuota|Pipelines"
msgstr ""
@@ -36157,6 +36650,9 @@ msgstr ""
msgid "UsageQuota|Seats"
msgstr ""
+msgid "UsageQuota|Shared bits of code and text."
+msgstr ""
+
msgid "UsageQuota|Snippets"
msgstr ""
@@ -36166,6 +36662,12 @@ msgstr ""
msgid "UsageQuota|Storage"
msgstr ""
+msgid "UsageQuota|Storage type"
+msgstr ""
+
+msgid "UsageQuota|There is a known issue with Artifact storage where the total could be incorrect for some projects. More details and progress are available in %{warningLinkStart}the epic%{warningLinkEnd}."
+msgstr ""
+
msgid "UsageQuota|This is the total amount of storage used across your projects within this namespace."
msgstr ""
@@ -36205,6 +36707,9 @@ msgstr ""
msgid "UsageQuota|Usage"
msgstr ""
+msgid "UsageQuota|Usage Breakdown"
+msgstr ""
+
msgid "UsageQuota|Usage Quotas"
msgstr ""
@@ -36229,6 +36734,9 @@ msgstr ""
msgid "UsageQuota|Wiki"
msgstr ""
+msgid "UsageQuota|Wiki content."
+msgstr ""
+
msgid "UsageQuota|Wikis"
msgstr ""
@@ -36445,7 +36953,10 @@ msgstr ""
msgid "User Settings"
msgstr ""
-msgid "User and IP Rate Limits"
+msgid "User and IP rate limits"
+msgstr ""
+
+msgid "User does not have a pending request"
msgstr ""
msgid "User identity was successfully created."
@@ -36742,6 +37253,9 @@ msgstr ""
msgid "Users can launch a development environment from a GitLab browser tab when the %{linkStart}Gitpod%{linkEnd} integration is enabled."
msgstr ""
+msgid "Users can reactivate their account by signing in."
+msgstr ""
+
msgid "Users can render diagrams in AsciiDoc, Markdown, reStructuredText, and Textile documents using Kroki."
msgstr ""
@@ -36757,6 +37271,9 @@ msgstr ""
msgid "Users requesting access to"
msgstr ""
+msgid "Users to exclude from the rate limit"
+msgstr ""
+
msgid "Users were successfully added."
msgstr ""
@@ -36778,6 +37295,9 @@ msgstr ""
msgid "UsersSelect|Unassigned"
msgstr ""
+msgid "Uses GitLab as a lightweight alternative to Sentry."
+msgstr ""
+
msgid "Using %{code_start}::%{code_end} denotes a %{link_start}scoped label set%{link_end}"
msgstr ""
@@ -36808,10 +37328,7 @@ msgstr ""
msgid "Value Stream Analytics can help you determine your team’s velocity"
msgstr ""
-msgid "Value Stream Analytics gives an overview of how much time it takes to go from idea to production in your project."
-msgstr ""
-
-msgid "Value may contain a variable reference"
+msgid "Value might contain a variable reference"
msgstr ""
msgid "Value stream"
@@ -36877,10 +37394,10 @@ msgstr ""
msgid "ValueStream|The Default Value Stream cannot be deleted"
msgstr ""
-msgid "Variable"
+msgid "Values that contain the %{codeStart}$%{codeEnd} character can be considered a variable reference and expanded. %{docsLinkStart}Learn more.%{docsLinkEnd}"
msgstr ""
-msgid "Variable references indicated by %{codeStart}$%{codeEnd} may be expanded. If this is not what you want, consider %{docsLinkStart}using a workaround to prevent expansion%{docsLinkEnd}."
+msgid "Variable"
msgstr ""
msgid "Variable will be masked in job logs."
@@ -37285,6 +37802,9 @@ msgstr ""
msgid "Vulnerability|Evidence"
msgstr ""
+msgid "Vulnerability|False positive detected"
+msgstr ""
+
msgid "Vulnerability|File"
msgstr ""
@@ -37327,6 +37847,9 @@ msgstr ""
msgid "Vulnerability|Status"
msgstr ""
+msgid "Vulnerability|The scanner determined this vulnerability to be a false positive. Verify the evaluation before changing its status. %{linkStart}Learn more about false positive detection.%{linkEnd}"
+msgstr ""
+
msgid "Vulnerability|The unmodified response is the original response that had no mutations done to the request"
msgstr ""
@@ -37651,9 +38174,6 @@ msgstr ""
msgid "Welcome to GitLab,%{br_tag}%{name}!"
msgstr ""
-msgid "Welcome to the guided GitLab tour"
-msgstr ""
-
msgid "Welcome, %{name}!"
msgstr ""
@@ -37672,9 +38192,6 @@ msgstr ""
msgid "What are you searching for?"
msgstr ""
-msgid "What describes you best?"
-msgstr ""
-
msgid "What does this command do?"
msgstr ""
@@ -37696,13 +38213,13 @@ msgstr ""
msgid "What is your job title? (optional)"
msgstr ""
-msgid "What will you use this group for?"
+msgid "What templates can I create?"
msgstr ""
-msgid "What's new"
+msgid "What will you use this group for?"
msgstr ""
-msgid "What’s your experience level?"
+msgid "What's new"
msgstr ""
msgid "When a deployment job is successful, skip older deployment jobs that are still pending."
@@ -37714,6 +38231,9 @@ msgstr ""
msgid "When an event in GitLab triggers a webhook, you can use the request details to figure out if something went wrong."
msgstr ""
+msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+msgstr ""
+
msgid "When inactive, an external authentication provider must be used."
msgstr ""
@@ -37737,6 +38257,9 @@ msgstr ""
msgid "When:"
msgstr ""
+msgid "Which API requests are affected?"
+msgstr ""
+
msgid "While it's rare to have no vulnerabilities, it can happen. In any event, we ask that you please double check your settings to make sure you've set up your dashboard correctly."
msgstr ""
@@ -38016,6 +38539,9 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|Work Items"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -38091,6 +38617,9 @@ msgstr ""
msgid "You are already a member of this %{member_source}."
msgstr ""
+msgid "You are already impersonating another user"
+msgstr ""
+
msgid "You are an admin, which means granting access to %{client_name} will allow them to interact with GitLab as an admin as well. Proceed with caution."
msgstr ""
@@ -38193,6 +38722,9 @@ msgstr ""
msgid "You can also use project access tokens with Git to authenticate over HTTP(S). %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "You can always change your URL later"
+msgstr ""
+
msgid "You can always edit this later"
msgstr ""
@@ -38349,10 +38881,10 @@ msgstr ""
msgid "You can’t %{tag_start}edit%{tag_end} files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
-msgid "You could not create a new trigger."
+msgid "You can’t edit files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
-msgid "You didn't renew your subscription for %{strong}%{namespace_name}%{strong_close} so it was downgraded to the free plan."
+msgid "You could not create a new trigger."
msgstr ""
msgid "You do not have any subscriptions yet"
@@ -38520,6 +39052,12 @@ msgstr ""
msgid "You must provide your current password in order to change it."
msgstr ""
+msgid "You must sign in to search for specific projects."
+msgstr ""
+
+msgid "You must sign in to search for specific terms."
+msgstr ""
+
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
@@ -38547,6 +39085,9 @@ msgstr ""
msgid "You need to upload a GitLab project export archive (ending in .gz)."
msgstr ""
+msgid "You need to verify your primary email first before enabling Two-Factor Authentication."
+msgstr ""
+
msgid "You successfully declined the invitation"
msgstr ""
@@ -38655,10 +39196,10 @@ msgstr ""
msgid "Your %{host} account was signed in to from a new location"
msgstr ""
-msgid "Your %{strong}%{plan_name}%{strong_close} subscription for %{strong}%{namespace_name}%{strong_close} will expire on %{strong}%{expires_on}%{strong_close}."
+msgid "Your %{strong}%{plan_name}%{strong_close} subscription expires on %{strong}%{expires_on}%{strong_close}. After that date, you cannot create issues or merge requests, or use many other features."
msgstr ""
-msgid "Your %{strong}%{plan_name}%{strong_close} subscription will expire on %{strong}%{expires_on}%{strong_close}. After that, you will not be able to create issues or merge requests as well as many other features."
+msgid "Your %{strong}%{plan_name}%{strong_close} subscription for %{strong}%{namespace_name}%{strong_close} will expire on %{strong}%{expires_on}%{strong_close}."
msgstr ""
msgid "Your CI/CD configuration syntax is invalid. View Lint tab for more details."
@@ -38682,7 +39223,7 @@ msgstr ""
msgid "Your GPG keys (%{count})"
msgstr ""
-msgid "Your GitLab account has been locked due to an excessive amount of unsuccessful sign in attempts. Your account will automatically unlock in %{duration} or you may click the link below to unlock now."
+msgid "Your GitLab account has been locked due to an excessive number of unsuccessful sign in attempts. You can wait for your account to automatically unlock in %{duration} or you can click the link below to unlock now."
msgstr ""
msgid "Your GitLab account request has been approved!"
@@ -38793,6 +39334,9 @@ msgstr ""
msgid "Your commit email is used for web based operations, such as edits and merges."
msgstr ""
+msgid "Your current password is required to register a two-factor authenticator app."
+msgstr ""
+
msgid "Your dashboard has been copied. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
@@ -38892,6 +39436,9 @@ msgstr ""
msgid "Your project limit is %{limit} projects! Please contact your administrator to increase it"
msgstr ""
+msgid "Your project will be created at:"
+msgstr ""
+
msgid "Your projects"
msgstr ""
@@ -38931,11 +39478,10 @@ msgstr ""
msgid "Your subscription expired!"
msgstr ""
-msgid "Your subscription has been downgraded."
-msgstr ""
-
-msgid "Your subscription will expire in %{remaining_days}."
-msgstr ""
+msgid "Your subscription will expire in %{remaining_days} day."
+msgid_plural "Your subscription will expire in %{remaining_days} days."
+msgstr[0] ""
+msgstr[1] ""
msgid "Your username is %{username}."
msgstr ""
@@ -39142,6 +39688,9 @@ msgstr ""
msgid "cannot merge"
msgstr ""
+msgid "cannot not be used for user namespace"
+msgstr ""
+
msgid "ciReport|%{degradedNum} degraded"
msgstr ""
@@ -39465,6 +40014,9 @@ msgstr ""
msgid "created %{timeAgo}"
msgstr ""
+msgid "created %{timeAgo} by %{author}"
+msgstr ""
+
msgid "created by"
msgstr ""
@@ -39509,9 +40061,6 @@ msgstr ""
msgid "does not have a supported extension. Only %{extension_list} are supported"
msgstr ""
-msgid "domain is not authorized for sign-up."
-msgstr ""
-
msgid "download it"
msgstr ""
@@ -39529,18 +40078,13 @@ msgstr ""
msgid "email '%{email}' is not a verified email."
msgstr ""
-msgid "email does not match the allowed domain of %{email_domains}"
-msgid_plural "email does not match the allowed domains: %{email_domains}"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "enabled"
msgstr ""
msgid "encrypted: needs to be a :required, :optional or :migrating!"
msgstr ""
-msgid "ending with MIME type format is not allowed."
+msgid "ending with a reserved file extension is not allowed."
msgstr ""
msgid "entries cannot be larger than 255 characters"
@@ -39564,6 +40108,9 @@ msgstr ""
msgid "estimateCommand|%{slash_command} overwrites the total estimated time."
msgstr ""
+msgid "example.com"
+msgstr ""
+
msgid "exceeds the limit of %{bytes} bytes"
msgstr ""
@@ -39614,9 +40161,6 @@ msgstr ""
msgid "fork"
msgstr ""
-msgid "fork this project"
-msgstr ""
-
msgid "from"
msgstr ""
@@ -39625,6 +40169,9 @@ msgid_plural "from %d jobs"
msgstr[0] ""
msgstr[1] ""
+msgid "frontmatter"
+msgstr ""
+
msgid "group"
msgstr ""
@@ -39652,6 +40199,9 @@ msgstr ""
msgid "has been completed."
msgstr ""
+msgid "has too deep level of nesting"
+msgstr ""
+
msgid "help"
msgstr ""
@@ -39685,9 +40235,21 @@ msgstr ""
msgid "in"
msgstr ""
+msgid "in Infrastructure :: Kubernetes clusters"
+msgstr ""
+
+msgid "in all GitLab"
+msgstr ""
+
+msgid "in group"
+msgstr ""
+
msgid "in group %{link_to_group}"
msgstr ""
+msgid "in project"
+msgstr ""
+
msgid "in project %{link_to_project}"
msgstr ""
@@ -39729,16 +40291,19 @@ msgstr ""
msgid "is not a valid X509 certificate."
msgstr ""
-msgid "is not allowed since the group is not top-level group."
+msgid "is not allowed for sign-up."
msgstr ""
-msgid "is not allowed. Try again with a different email address, or contact your GitLab admin."
+msgid "is not allowed for this group."
msgstr ""
-msgid "is not allowed. We do not currently support project-level iterations"
+msgid "is not allowed for this project."
+msgstr ""
+
+msgid "is not allowed since the group is not top-level group."
msgstr ""
-msgid "is not from an allowed domain."
+msgid "is not allowed. We do not currently support project-level iterations"
msgstr ""
msgid "is not in the group enforcing Group Managed Account"
@@ -39831,6 +40396,9 @@ msgstr ""
msgid "log in"
msgstr ""
+msgid "managed"
+msgstr ""
+
msgid "manual"
msgstr ""
@@ -39878,6 +40446,9 @@ msgstr ""
msgid "mrWidget| Please restore it or use a different %{missingBranchName} branch"
msgstr ""
+msgid "mrWidget|%{linkStart}Set up now%{linkEnd} to analyze your source code for known security vulnerabilities."
+msgstr ""
+
msgid "mrWidget|%{mergeError}."
msgstr ""
@@ -39958,6 +40529,9 @@ msgid_plural "mrWidget|Closes issues"
msgstr[0] ""
msgstr[1] ""
+msgid "mrWidget|Create issue to resolve all threads"
+msgstr ""
+
msgid "mrWidget|Delete source branch"
msgstr ""
@@ -39967,12 +40541,18 @@ msgstr ""
msgid "mrWidget|Did not close"
msgstr ""
+msgid "mrWidget|Dismiss"
+msgstr ""
+
msgid "mrWidget|Email patches"
msgstr ""
msgid "mrWidget|Failed to load deployment statistics"
msgstr ""
+msgid "mrWidget|Hide %{widget} details"
+msgstr ""
+
msgid "mrWidget|If the %{missingBranchName} branch exists in your local repository, you can merge this merge request manually using the command line"
msgstr ""
@@ -40068,9 +40648,6 @@ msgstr ""
msgid "mrWidget|Request to merge"
msgstr ""
-msgid "mrWidget|Resolve all threads in new issue"
-msgstr ""
-
msgid "mrWidget|Resolve conflicts"
msgstr ""
@@ -40086,6 +40663,9 @@ msgstr ""
msgid "mrWidget|Revoke approval"
msgstr ""
+msgid "mrWidget|SAST and Secret Detection is not enabled."
+msgstr ""
+
msgid "mrWidget|Set by %{merge_author} to be added to the merge train when the pipeline succeeds"
msgstr ""
@@ -40095,6 +40675,9 @@ msgstr ""
msgid "mrWidget|Set by %{merge_author} to start a merge train when the pipeline succeeds"
msgstr ""
+msgid "mrWidget|Show %{widget} details"
+msgstr ""
+
msgid "mrWidget|The changes were merged into"
msgstr ""
@@ -40107,6 +40690,9 @@ msgstr ""
msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure, or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
msgstr ""
+msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure."
+msgstr ""
+
msgid "mrWidget|The source branch has been deleted"
msgstr ""
@@ -40149,6 +40735,9 @@ msgstr ""
msgid "mrWidget|You can merge after removing denied licenses"
msgstr ""
+msgid "mrWidget|You can only merge once this merge request is approved."
+msgstr ""
+
msgid "mrWidget|Your password"
msgstr ""
@@ -40185,6 +40774,9 @@ msgstr ""
msgid "must be less than the limit of %{tag_limit} tags"
msgstr ""
+msgid "must be set for a project namespace"
+msgstr ""
+
msgid "must be unique by status and elapsed time within a policy"
msgstr ""
@@ -40294,6 +40886,9 @@ msgstr ""
msgid "pipeline"
msgstr ""
+msgid "pipeline schedules documentation"
+msgstr ""
+
msgid "pod_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
msgstr ""
@@ -40343,16 +40938,25 @@ msgstr ""
msgid "project name"
msgstr ""
+msgid "project namespace cannot be the parent of another namespace"
+msgstr ""
+
msgid "projects"
msgstr ""
msgid "quick actions"
msgstr ""
-msgid "reCAPTCHA Private Key"
+msgid "reCAPTCHA"
+msgstr ""
+
+msgid "reCAPTCHA helps prevent credential stuffing."
msgstr ""
-msgid "reCAPTCHA Site Key"
+msgid "reCAPTCHA private key"
+msgstr ""
+
+msgid "reCAPTCHA site key"
msgstr ""
msgid "recent activity"
@@ -40579,6 +41183,9 @@ msgstr ""
msgid "user avatar"
msgstr ""
+msgid "user namespace cannot be the parent of another namespace"
+msgstr ""
+
msgid "user preferences"
msgstr ""
@@ -40671,3 +41278,9 @@ msgstr ""
msgid "your settings"
msgstr ""
+msgid "{group}"
+msgstr ""
+
+msgid "{project}"
+msgstr ""
+
diff --git a/locale/he_IL/gitlab.po b/locale/he_IL/gitlab.po
index fef2ae24708..820581c103e 100644
--- a/locale/he_IL/gitlab.po
+++ b/locale/he_IL/gitlab.po
@@ -14,10 +14,7 @@ msgstr ""
"X-Crowdin-Language: he\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-09-02 01:27\n"
-
-msgid " %{name}, confirm your email address now! "
-msgstr ""
+"PO-Revision-Date: 2021-10-04 20:21\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -96,6 +93,20 @@ msgstr ""
msgid "#general, #development"
msgstr ""
+msgid "%d Alert"
+msgid_plural "%d Alerts"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
+msgid "%d Alert:"
+msgid_plural "%d Alerts:"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "%d Approval"
msgid_plural "%d Approvals"
msgstr[0] ""
@@ -591,7 +602,10 @@ msgstr ""
msgid "%{code_open}Protected:%{code_close} Only exposed to protected branches or tags."
msgstr ""
-msgid "%{commit_author_link} authored %{commit_timeago}"
+msgid "%{commit_author_link} authored %{commit_authored_timeago}"
+msgstr ""
+
+msgid "%{commit_author_link} authored %{commit_authored_timeago} and %{commit_committer_avatar} %{commit_committer_link} committed %{commit_committer_timeago}"
msgstr ""
msgid "%{completedCount} completed weight"
@@ -695,6 +709,15 @@ msgstr ""
msgid "%{doc_link_start}Advanced search%{doc_link_end} is enabled."
msgstr ""
+msgid "%{docs_link_start}Learn about visibility levels.%{docs_link_end}"
+msgstr ""
+
+msgid "%{docs_link_start}What is Large File Storage?%{docs_link_end}"
+msgstr ""
+
+msgid "%{docs_link_start}What is two-factor authentication?%{docs_link_end}"
+msgstr ""
+
msgid "%{due_date} (Past due)"
msgstr ""
@@ -767,9 +790,6 @@ msgstr ""
msgid "%{issueType} actions"
msgstr ""
-msgid "%{issuesCount} issues with a limit of %{maxIssueCount}"
-msgstr ""
-
msgid "%{issuesSize} with a limit of %{maxIssueCount}"
msgstr ""
@@ -827,6 +847,12 @@ msgstr ""
msgid "%{label_for_message} unavailable"
msgstr ""
+msgid "%{learn_more_link}."
+msgstr ""
+
+msgid "%{lessThan} 1 hour"
+msgstr ""
+
msgid "%{lets_encrypt_link_start}Let's Encrypt%{lets_encrypt_link_end} is a free, automated, and open certificate authority (CA) that issues digital certificates to enable HTTPS (SSL/TLS) for sites."
msgstr ""
@@ -839,15 +865,15 @@ msgstr ""
msgid "%{link_start}Learn more%{link_end} about roles."
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
-msgstr ""
-
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
msgstr ""
msgid "%{link_start}Start the title with %{draft_snippet}%{link_end} to prevent a merge request that is a work in progress from being merged before it's ready."
msgstr ""
+msgid "%{link_start}What information does GitLab Inc. collect?%{link_end}"
+msgstr ""
+
msgid "%{listToShow}, and %{awardsListLength} more"
msgstr ""
@@ -1008,7 +1034,7 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-msgid "%{service_ping_link_start}Learn more%{service_ping_link_end} about what information is shared with GitLab Inc."
+msgid "%{service_ping_link_start}What information is shared with GitLab Inc.?%{service_ping_link_end}"
msgstr ""
msgid "%{size} %{unit}"
@@ -1044,6 +1070,9 @@ msgstr ""
msgid "%{state} epics"
msgstr ""
+msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
+msgstr ""
+
msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
msgstr ""
@@ -1117,13 +1146,6 @@ msgstr ""
msgid "%{template_project_id} is unknown or invalid"
msgstr ""
-msgid "%{text} %{files}"
-msgid_plural "%{text} %{files} files"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
-
msgid "%{text} is available"
msgstr "%{text} זמין"
@@ -1208,9 +1230,6 @@ msgstr ""
msgid "%{wildcards_link_start}Wildcards%{wildcards_link_end} such as %{code_tag_start}v*%{code_tag_end} or %{code_tag_start}*-release%{code_tag_end} are supported."
msgstr ""
-msgid "&lt; 1 hour"
-msgstr ""
-
msgid "'%{data}' at %{location} does not match format: %{format}"
msgstr ""
@@ -1296,9 +1315,6 @@ msgstr ""
msgid "(we need your current password to confirm your changes)"
msgstr ""
-msgid "* * * * *"
-msgstr ""
-
msgid "+ %{amount} more"
msgstr ""
@@ -1371,10 +1387,10 @@ msgstr ""
msgid "."
msgstr ""
-msgid "0 bytes"
+msgid "/"
msgstr ""
-msgid "0 for unlimited, only effective with remote storage enabled."
+msgid "0 bytes"
msgstr ""
msgid "0t1DgySidms"
@@ -1550,6 +1566,9 @@ msgstr "10â€-19 תרומות"
msgid "1000+"
msgstr ""
+msgid "192.168.0.0/24"
+msgstr ""
+
msgid "1st contribution!"
msgstr "תרומה ר×שונה!"
@@ -1703,9 +1722,6 @@ msgstr ""
msgid "A plain HTML site that uses Netlify for CI/CD instead of GitLab, but still with all the other great GitLab features"
msgstr ""
-msgid "A plain-text response to show to clients that hit the rate limit."
-msgstr ""
-
msgid "A platform value can be web, mob or app."
msgstr ""
@@ -1787,7 +1803,7 @@ msgstr ""
msgid "APIFuzzing|Configure HTTP basic authentication values. Other authentication methods are supported. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
+msgid "APIFuzzing|Customize your project's API fuzzing configuration options and copy the code snippet to your .gitlab-ci.yml file to apply any changes. Note that this tool does not reflect or update your .gitlab-ci.yml file automatically. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
msgstr ""
msgid "APIFuzzing|Enable authentication"
@@ -1850,9 +1866,6 @@ msgstr ""
msgid "APIFuzzing|To prevent a security leak, authentication info must be added as a %{ciVariablesLinkStart}CI variable%{ciVariablesLinkEnd}. As a user with maintainer access rights, you can manage CI variables in the %{ciSettingsLinkStart}Settings%{ciSettingsLinkEnd} area."
msgstr ""
-msgid "APIFuzzing|Use this tool to generate API fuzzing configuration YAML to copy into your .gitlab-ci.yml file. This tool does not reflect or update your .gitlab-ci.yml file automatically."
-msgstr ""
-
msgid "APIFuzzing|Username for basic authentication"
msgstr ""
@@ -1904,9 +1917,6 @@ msgstr "×“×™×•×•×—×™× ×¢×œ שימוש לרעה"
msgid "Abuse reports notification email"
msgstr ""
-msgid "Abuse reports will be sent to this address if it is set. Abuse reports are always available in the admin area."
-msgstr ""
-
msgid "Accept invitation"
msgstr "קבלת הזמנה"
@@ -1943,12 +1953,18 @@ msgstr "הגישה נדחתה. × × ×œ×‘×“×•×§ ×ת רמת הגישה שלך."
msgid "Access granted"
msgstr "הוענקה גישה"
+msgid "Access key ID"
+msgstr ""
+
msgid "Access requests"
msgstr "בקשות גישה"
msgid "Access to '%{classification_label}' not allowed"
msgstr "הגישה ×ל ‚%{classification_label}’ ×סורה"
+msgid "Access tokens expire after 2 hours. A refresh token may be used at any time to generate a new access token. Non-expiring access tokens are deprecated. Clear this setting to enable backward compatibility."
+msgstr ""
+
msgid "AccessDropdown|Deploy Keys"
msgstr "מפתחות הטמעה"
@@ -2261,6 +2277,9 @@ msgstr ""
msgid "Add new directory"
msgstr ""
+msgid "Add new service account"
+msgstr ""
+
msgid "Add or remove previously merged commits"
msgstr ""
@@ -2498,6 +2517,9 @@ msgstr ""
msgid "AdminArea|Features"
msgstr "תכונות"
+msgid "AdminArea|Get security updates from GitLab and stay up to date"
+msgstr ""
+
msgid "AdminArea|Groups"
msgstr "קבוצות"
@@ -2537,6 +2559,12 @@ msgstr "מיזמי×"
msgid "AdminArea|Reporter"
msgstr ""
+msgid "AdminArea|Sign up for the GitLab Security Newsletter to get notified for security updates."
+msgstr ""
+
+msgid "AdminArea|Sign up for the GitLab newsletter"
+msgstr ""
+
msgid "AdminArea|Stop all jobs"
msgstr "לעצור ×ת כל המשימות"
@@ -2606,9 +2634,15 @@ msgstr ""
msgid "AdminSettings|Disable public access to Pages sites"
msgstr ""
+msgid "AdminSettings|Display a banner on merge requests in projects with no pipelines to initiate steps to add a .gitlab-ci.yml file."
+msgstr ""
+
msgid "AdminSettings|Domain verification is an essential security measure for public GitLab sites. Users are required to demonstrate they control a domain before it is enabled. %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "AdminSettings|Enable pipeline suggestion banner"
+msgstr ""
+
msgid "AdminSettings|Enable shared runners for new projects"
msgstr ""
@@ -3080,10 +3114,10 @@ msgstr ""
msgid "Admin|Quarterly reconciliation will occur on %{qrtlyDate}"
msgstr ""
-msgid "Admin|The number of max seats used for your namespace is currently exceeding the number of seats in your subscription. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgid "Admin|The number of max seats in your namespace exceeds the number of seats in your subscription. On %{qrtlyDate}, quarterly reconciliation occurs and you are automatically billed a prorated amount for the overage. No action is needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice. For more information about the timing of the invoicing process, view the documentation."
msgstr ""
-msgid "Admin|The number of maximum users for your instance is currently exceeding the number of users in license. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgid "Admin|The number of max users in your instance exceeds the number of users in your license. On %{qrtlyDate}, quarterly reconciliation occurs and you are automatically billed a prorated amount for the overage. No action is needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice. For more information about the timing of the invoicing process, view the documentation."
msgstr ""
msgid "Admin|View pending user approvals"
@@ -3104,9 +3138,6 @@ msgstr ""
msgid "Advanced export options"
msgstr ""
-msgid "Advanced permissions, Large File Storage and Two-Factor authentication settings."
-msgstr ""
-
msgid "After a successful password update you will be redirected to login screen."
msgstr ""
@@ -3125,15 +3156,14 @@ msgstr ""
msgid "After you've reviewed these contribution guidelines, you'll be all set to"
msgstr ""
+msgid "Akismet"
+msgstr ""
+
msgid "Akismet API Key"
msgstr ""
-msgid "Alert"
-msgid_plural "Alerts"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
+msgid "Akismet helps prevent the creation of spam issues in public projects."
+msgstr ""
msgid "AlertManagement|Acknowledged"
msgstr ""
@@ -3489,6 +3519,9 @@ msgstr ""
msgid "All (default)"
msgstr ""
+msgid "All GitLab"
+msgstr ""
+
msgid "All Members"
msgstr ""
@@ -3603,6 +3636,9 @@ msgstr ""
msgid "Allow this secondary node to replicate content on Object Storage"
msgstr ""
+msgid "Allow use of licensed EE features"
+msgstr ""
+
msgid "Allow users to dismiss the broadcast message"
msgstr ""
@@ -3678,9 +3714,6 @@ msgstr ""
msgid "Amazon authentication is not %{link_start}correctly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
-msgid "Amount of time (in hours) that users are allowed to skip forced configuration of two-factor authentication"
-msgstr ""
-
msgid "An %{link_start}alert%{link_end} with the same fingerprint is already open. To change the status of this alert, resolve the linked alert."
msgstr ""
@@ -3741,12 +3774,6 @@ msgstr ""
msgid "An error occurred when removing the label."
msgstr ""
-msgid "An error occurred when toggling the notification subscription"
-msgstr ""
-
-msgid "An error occurred when updating the issue weight"
-msgstr ""
-
msgid "An error occurred when updating the title"
msgstr ""
@@ -3795,6 +3822,9 @@ msgstr ""
msgid "An error occurred while enabling Service Desk."
msgstr ""
+msgid "An error occurred while fetching Markdown preview"
+msgstr ""
+
msgid "An error occurred while fetching ancestors"
msgstr ""
@@ -3825,9 +3855,6 @@ msgstr ""
msgid "An error occurred while fetching label colors."
msgstr ""
-msgid "An error occurred while fetching markdown preview"
-msgstr ""
-
msgid "An error occurred while fetching participants"
msgstr ""
@@ -3843,9 +3870,6 @@ msgstr ""
msgid "An error occurred while fetching reference"
msgstr ""
-msgid "An error occurred while fetching sidebar data"
-msgstr ""
-
msgid "An error occurred while fetching tags. Retry the search."
msgstr ""
@@ -3921,6 +3945,9 @@ msgstr ""
msgid "An error occurred while loading merge requests."
msgstr ""
+msgid "An error occurred while loading projects."
+msgstr ""
+
msgid "An error occurred while loading the Needs tab."
msgstr ""
@@ -4155,12 +4182,6 @@ msgstr ""
msgid "Any Milestone"
msgstr ""
-msgid "Any branch"
-msgstr ""
-
-msgid "Any eligible user"
-msgstr ""
-
msgid "Any encrypted tokens"
msgstr ""
@@ -4179,6 +4200,9 @@ msgstr ""
msgid "Any namespace"
msgstr ""
+msgid "App Engine description and apps that are suitable for this deployment target"
+msgstr ""
+
msgid "App ID"
msgstr ""
@@ -4331,6 +4355,13 @@ msgstr ""
msgid "Apply"
msgstr ""
+msgid "Apply %d suggestion"
+msgid_plural "Apply %d suggestions"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "Apply a label"
msgstr ""
@@ -4340,13 +4371,10 @@ msgstr ""
msgid "Apply suggestion"
msgstr ""
-msgid "Apply suggestions"
-msgstr ""
-
msgid "Apply template"
msgstr ""
-msgid "Apply this approval rule to any branch or a specific protected branch."
+msgid "Apply this approval rule to all branches or a specific protected branch."
msgstr ""
msgid "Applying"
@@ -4497,9 +4525,6 @@ msgstr ""
msgid "ApprovalSettings|Prevent editing approval rules in projects and merge requests."
msgstr ""
-msgid "ApprovalSettings|Prevent editing approval rules in projects and merge requests. "
-msgstr ""
-
msgid "ApprovalSettings|Remove all approvals when commits are added to the source branch."
msgstr ""
@@ -4515,6 +4540,9 @@ msgstr ""
msgid "ApprovalSettings|This setting is configured at the instance level and can only be changed by an administrator."
msgstr ""
+msgid "ApprovalSettings|This setting is configured in %{groupName} and can only be changed by an administrator or group owner."
+msgstr ""
+
msgid "ApprovalStatusTooltip|Adheres to separation of duties"
msgstr ""
@@ -5007,9 +5035,6 @@ msgstr ""
msgid "Authenticated API rate limit period in seconds"
msgstr ""
-msgid "Authenticated API request rate limit"
-msgstr ""
-
msgid "Authenticated API requests"
msgstr ""
@@ -5019,10 +5044,10 @@ msgstr ""
msgid "Authenticated Git LFS request rate limit"
msgstr ""
-msgid "Authenticated web rate limit period in seconds"
+msgid "Authenticated Git LFS requests"
msgstr ""
-msgid "Authenticated web request rate limit"
+msgid "Authenticated web rate limit period in seconds"
msgstr ""
msgid "Authenticated web requests"
@@ -5400,9 +5425,6 @@ msgstr ""
msgid "Below you will find all the groups that are public."
msgstr ""
-msgid "Beta"
-msgstr ""
-
msgid "Bi-weekly code coverage"
msgstr ""
@@ -5644,6 +5666,21 @@ msgstr ""
msgid "Board scope affects which issues are displayed for anyone who visits this board"
msgstr ""
+msgid "BoardNewEpic|Groups"
+msgstr ""
+
+msgid "BoardNewEpic|Loading groups"
+msgstr ""
+
+msgid "BoardNewEpic|No matching results"
+msgstr ""
+
+msgid "BoardNewEpic|Search groups"
+msgstr ""
+
+msgid "BoardNewEpic|Select a group"
+msgstr ""
+
msgid "BoardNewIssue|No matching results"
msgstr ""
@@ -5723,6 +5760,9 @@ msgstr ""
msgid "Boards|An error occurred while creating the list. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching child groups. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching group projects. Please try again."
msgstr ""
@@ -6057,6 +6097,9 @@ msgstr ""
msgid "Bulk update"
msgstr ""
+msgid "BulkImports|Re-import creates a new group. It does not sync with the existing group."
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -6066,6 +6109,9 @@ msgstr ""
msgid "BulkImport|From source group"
msgstr ""
+msgid "BulkImport|Group import history"
+msgstr ""
+
msgid "BulkImport|Import failed: Destination cannot be a subgroup of the source group. Change the destination and try again."
msgstr ""
@@ -6078,9 +6124,18 @@ msgstr ""
msgid "BulkImport|Importing the group failed"
msgstr ""
+msgid "BulkImport|Last imported to %{link}"
+msgstr ""
+
msgid "BulkImport|Name already exists."
msgstr ""
+msgid "BulkImport|New group"
+msgstr ""
+
+msgid "BulkImport|No history is available"
+msgstr ""
+
msgid "BulkImport|No parent"
msgstr ""
@@ -6093,6 +6148,9 @@ msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} matching filter \"%{filter}\" from %{link}"
msgstr ""
+msgid "BulkImport|Source group"
+msgstr ""
+
msgid "BulkImport|To new group"
msgstr ""
@@ -6102,6 +6160,9 @@ msgstr ""
msgid "BulkImport|You have no groups to import"
msgstr ""
+msgid "BulkImport|Your imported groups will appear here."
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -6346,6 +6407,9 @@ msgstr ""
msgid "Can be manually deployed to"
msgstr ""
+msgid "Can be overridden in each project."
+msgstr ""
+
msgid "Can create groups:"
msgstr ""
@@ -6448,6 +6512,9 @@ msgstr ""
msgid "Cancelling Preview"
msgstr ""
+msgid "Cannot assign a confidential epic to a non-confidential issue. Make the issue confidential and try again"
+msgstr ""
+
msgid "Cannot be assigned to other projects."
msgstr ""
@@ -6499,9 +6566,6 @@ msgstr ""
msgid "Cannot refer to a group %{timebox_type} by an internal id!"
msgstr ""
-msgid "Cannot set confidential epic for a non-confidential issue"
-msgstr ""
-
msgid "Cannot show preview. For previews on sketch files, they must have the file format introduced by Sketch version 43 and above."
msgstr ""
@@ -6739,15 +6803,15 @@ msgstr ""
msgid "Check out, review, and merge locally"
msgstr ""
-msgid "Check the %{docs_link_start}documentation%{docs_link_end}."
-msgstr ""
-
msgid "Check the current instance configuration "
msgstr ""
msgid "Check the elasticsearch.log file to debug why the migration was halted and make any changes before retrying the migration. When you fix the cause of the failure, click \"Retry migration\", and the migration will be scheduled to be retried in the background."
msgstr ""
+msgid "Check with your administrator."
+msgstr ""
+
msgid "Check your Docker images for known vulnerabilities."
msgstr ""
@@ -6778,6 +6842,9 @@ msgstr ""
msgid "Checkout"
msgstr ""
+msgid "Checkout|$%{selectedPlanPrice} per 10 GB storage per pack"
+msgstr ""
+
msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 minutes"
msgstr ""
@@ -6800,19 +6867,25 @@ msgstr ""
msgid "Checkout|%{name}'s GitLab subscription"
msgstr ""
-msgid "Checkout|%{selectedPlanText} plan"
+msgid "Checkout|%{name}'s storage subscription"
msgstr ""
-msgid "Checkout|%{startDate} - %{endDate}"
+msgid "Checkout|%{quantity} GB of storage"
msgstr ""
-msgid "Checkout|%{totalCiMinutes} CI minute"
-msgid_plural "Checkout|%{totalCiMinutes} CI minutes"
+msgid "Checkout|%{quantity} storage pack"
+msgid_plural "Checkout|%{quantity} storage packs"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "Checkout|%{selectedPlanText} plan"
+msgstr ""
+
+msgid "Checkout|%{startDate} - %{endDate}"
+msgstr ""
+
msgid "Checkout|%{totalCiMinutes} CI minutes"
msgstr ""
@@ -6888,6 +6961,9 @@ msgstr ""
msgid "Checkout|Failed to register credit card. Please try again."
msgstr ""
+msgid "Checkout|GB"
+msgstr ""
+
msgid "Checkout|GitLab group"
msgstr ""
@@ -6924,6 +7000,9 @@ msgstr ""
msgid "Checkout|State"
msgstr ""
+msgid "Checkout|Storage packs"
+msgstr ""
+
msgid "Checkout|Street address"
msgstr ""
@@ -6945,6 +7024,9 @@ msgstr ""
msgid "Checkout|Total minutes: %{quantity}"
msgstr ""
+msgid "Checkout|Total storage: %{quantity} GB"
+msgstr ""
+
msgid "Checkout|Users"
msgstr ""
@@ -6954,16 +7036,25 @@ msgstr ""
msgid "Checkout|Your organization"
msgstr ""
+msgid "Checkout|Your storage subscription has the same term as your main subscription, and the price is prorated accordingly."
+msgstr ""
+
msgid "Checkout|Your subscription will be applied to this group"
msgstr ""
msgid "Checkout|Zip code"
msgstr ""
+msgid "Checkout|a storage subscription"
+msgstr ""
+
msgid "Checkout|company or team"
msgstr ""
-msgid "Checkout|x 1,000 minutes per pack = %{strong}"
+msgid "Checkout|minutes"
+msgstr ""
+
+msgid "Checkout|x %{quantity} %{units} per pack ="
msgstr ""
msgid "Cherry-pick this commit"
@@ -7320,6 +7411,9 @@ msgstr ""
msgid "CloneIssue|Cannot clone issue to target project as it is pending deletion."
msgstr ""
+msgid "CloneIssue|Cannot clone issues of '%{issue_type}' type."
+msgstr ""
+
msgid "Cloned this issue to %{path_to_project}."
msgstr ""
@@ -7374,7 +7468,10 @@ msgstr ""
msgid "Closes this %{quick_action_target}."
msgstr ""
-msgid "Cloud licenses can not be removed."
+msgid "Cloud Functions description and apps that are suitable for this deployment target"
+msgstr ""
+
+msgid "Cloud Run description and apps that are suitable for this deployment target"
msgstr ""
msgid "Cluster"
@@ -7401,6 +7498,12 @@ msgstr ""
msgid "ClusterAgents|Access tokens"
msgstr ""
+msgid "ClusterAgents|Agent might not be connected to GitLab"
+msgstr ""
+
+msgid "ClusterAgents|Agent never connected to GitLab"
+msgstr ""
+
msgid "ClusterAgents|Alternative installation methods"
msgstr ""
@@ -7416,6 +7519,12 @@ msgstr ""
msgid "ClusterAgents|Configuration"
msgstr ""
+msgid "ClusterAgents|Connected"
+msgstr ""
+
+msgid "ClusterAgents|Connection status"
+msgstr ""
+
msgid "ClusterAgents|Copy token"
msgstr ""
@@ -7434,6 +7543,9 @@ msgstr ""
msgid "ClusterAgents|For alternative installation methods %{linkStart}go to the documentation%{linkEnd}."
msgstr ""
+msgid "ClusterAgents|For more troubleshooting information go to"
+msgstr ""
+
msgid "ClusterAgents|Go to the repository"
msgstr ""
@@ -7449,18 +7561,30 @@ msgstr ""
msgid "ClusterAgents|Integrate with the GitLab Agent"
msgstr ""
-msgid "ClusterAgents|Last used"
+msgid "ClusterAgents|Last connected %{timeAgo}."
+msgstr ""
+
+msgid "ClusterAgents|Last contact"
msgstr ""
msgid "ClusterAgents|Learn how to create an agent access token"
msgstr ""
+msgid "ClusterAgents|Make sure you are using a valid token."
+msgstr ""
+
msgid "ClusterAgents|Name"
msgstr ""
msgid "ClusterAgents|Never"
msgstr ""
+msgid "ClusterAgents|Never connected"
+msgstr ""
+
+msgid "ClusterAgents|Not connected"
+msgstr ""
+
msgid "ClusterAgents|Read more about getting started"
msgstr ""
@@ -7482,6 +7606,9 @@ msgstr ""
msgid "ClusterAgents|Select which Agent you want to install"
msgstr ""
+msgid "ClusterAgents|The Agent has not been connected in a long time. There might be a connectivity issue. Last contact was %{timeAgo}."
+msgstr ""
+
msgid "ClusterAgents|The GitLab Agent also requires %{linkStart}enabling the Agent Server%{linkEnd}"
msgstr ""
@@ -7509,9 +7636,6 @@ msgstr ""
msgid "ClusterAgents|You will need to create a token to connect to your agent"
msgstr ""
-msgid "ClusterAgent|This feature is only available for premium plans"
-msgstr ""
-
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -7701,9 +7825,6 @@ msgstr ""
msgid "ClusterIntegration|Create Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Create a provision role on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the account and external ID above. %{startMoreInfoLink}More information%{endLink}"
-msgstr ""
-
msgid "ClusterIntegration|Create cluster on"
msgstr ""
@@ -8136,7 +8257,7 @@ msgstr ""
msgid "ClusterIntegration|Subnets"
msgstr ""
-msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provisioned role, first create one on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the above account and external IDs. %{startMoreInfoLink}More information%{endLink}"
+msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provisioned role, first create one on %{awsLinkStart}Amazon Web Services %{awsLinkEnd} using the above account and external IDs. %{moreInfoStart}More information%{moreInfoEnd}"
msgstr ""
msgid "ClusterIntegration|The Kubernetes certificate used to authenticate to the cluster."
@@ -8370,6 +8491,9 @@ msgstr ""
msgid "Collapse replies"
msgstr ""
+msgid "Collapse settings section"
+msgstr ""
+
msgid "Collapse sidebar"
msgstr ""
@@ -8388,6 +8512,9 @@ msgstr ""
msgid "Comma-separated list of email addresses."
msgstr ""
+msgid "Comma-separated list of users allowed to exceed the rate limit."
+msgstr ""
+
msgid "Comma-separated, e.g. '1.1.1.1, 2.2.2.0/24'"
msgstr ""
@@ -8710,6 +8837,9 @@ msgstr ""
msgid "Configure %{repository_checks_link_start}repository checks%{link_end} and %{housekeeping_link_start}housekeeping%{link_end} on repositories."
msgstr ""
+msgid "Configure CAPTCHAs, IP address limits, and other anti-spam measures."
+msgstr ""
+
msgid "Configure Dependency Scanning in `.gitlab-ci.yml` using the GitLab managed template. You can [add variable overrides](https://docs.gitlab.com/ee/user/application_security/dependency_scanning/#customizing-the-dependency-scanning-settings) to customize Dependency Scanning settings."
msgstr ""
@@ -8746,16 +8876,13 @@ msgstr ""
msgid "Configure a %{codeStart}.gitlab-webide.yml%{codeEnd} file in the %{codeStart}.gitlab%{codeEnd} directory to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
msgstr ""
-msgid "Configure existing installation"
-msgstr ""
-
-msgid "Configure limit for notes created per minute by web and API requests."
+msgid "Configure advanced permissions, Large File Storage, and two-factor authentication settings."
msgstr ""
-msgid "Configure limits for Project/Group Import/Export."
+msgid "Configure approvals by authors and committers on all projects."
msgstr ""
-msgid "Configure limits for web and API requests."
+msgid "Configure existing installation"
msgstr ""
msgid "Configure paths to be protected by Rack Attack."
@@ -8770,10 +8897,13 @@ msgstr ""
msgid "Configure settings for Advanced Search with Elasticsearch."
msgstr ""
+msgid "Configure specific limits for Files API requests that supersede the general user and IP rate limits."
+msgstr ""
+
msgid "Configure specific limits for Git LFS requests that supersede the general user and IP rate limits."
msgstr ""
-msgid "Configure specific limits for Packages API requests that supersede the general user and IP rate limits."
+msgid "Configure specific limits for deprecated API requests that supersede the general user and IP rate limits."
msgstr ""
msgid "Configure the %{link} integration."
@@ -8785,6 +8915,9 @@ msgstr ""
msgid "Configure the way a user creates a new account."
msgstr ""
+msgid "Configure via Merge Request"
+msgstr ""
+
msgid "Configure which lists are shown for anyone who visits this board"
msgstr ""
@@ -9259,6 +9392,9 @@ msgstr ""
msgid "Content parsed with %{link}."
msgstr ""
+msgid "ContentEditor|Table of Contents"
+msgstr ""
+
msgid "ContentEditor|You have to provide a renderMarkdown function or a custom serializer"
msgstr ""
@@ -9445,6 +9581,9 @@ msgstr ""
msgid "Copy link to chart"
msgstr ""
+msgid "Copy prefix"
+msgstr ""
+
msgid "Copy reference"
msgstr ""
@@ -9475,6 +9614,9 @@ msgstr ""
msgid "Copy value"
msgstr ""
+msgid "Corpus Management"
+msgstr ""
+
msgid "Corpus Management|Are you sure you want to delete the corpus?"
msgstr ""
@@ -9703,6 +9845,9 @@ msgstr ""
msgid "Create commit"
msgstr ""
+msgid "Create common files more quickly, and standardize their format."
+msgstr ""
+
msgid "Create confidential merge request"
msgstr ""
@@ -9736,6 +9881,9 @@ msgstr ""
msgid "Create issue"
msgstr ""
+msgid "Create issue to resolve all threads"
+msgstr ""
+
msgid "Create iteration"
msgstr ""
@@ -9790,6 +9938,9 @@ msgstr ""
msgid "Create new..."
msgstr ""
+msgid "Create or import your first project"
+msgstr ""
+
msgid "Create project"
msgstr ""
@@ -10147,7 +10298,7 @@ msgstr ""
msgid "Custom notification events"
msgstr ""
-msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notificationLinkStart} notification emails%{notificationLinkEnd}."
+msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notificationLinkStart}notification emails%{notificationLinkEnd}."
msgstr ""
msgid "Custom project templates"
@@ -10350,10 +10501,10 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-msgid "CycleAnalytics|Showing data for group '%{groupName}' and %{selectedProjectCount} projects from %{startDate} to %{endDate}"
+msgid "CycleAnalytics|Showing data for group '%{groupName}' and %{selectedProjectCount} projects from %{createdAfter} to %{createdBefore}"
msgstr ""
-msgid "CycleAnalytics|Showing data for group '%{groupName}' from %{startDate} to %{endDate}"
+msgid "CycleAnalytics|Showing data for group '%{groupName}' from %{createdAfter} to %{createdBefore}"
msgstr ""
msgid "CycleAnalytics|Stages"
@@ -10587,6 +10738,9 @@ msgstr ""
msgid "DastProfiles|Manage profiles"
msgstr ""
+msgid "DastProfiles|Manage site profiles"
+msgstr ""
+
msgid "DastProfiles|Minimum = 0 (no timeout enabled), Maximum = 2880 minutes"
msgstr ""
@@ -10662,6 +10816,9 @@ msgstr ""
msgid "DastProfiles|Scanner name"
msgstr ""
+msgid "DastProfiles|Schedule"
+msgstr ""
+
msgid "DastProfiles|Select branch"
msgstr ""
@@ -10731,7 +10888,7 @@ msgstr ""
msgid "DastProfiles|Website"
msgstr ""
-msgid "DastProfiles|You can either choose a passive scan or validate the target site in your chosen site profile. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
+msgid "DastProfiles|You can either choose a passive scan or validate the target site from the site profile management page. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
msgstr ""
msgid "DastProfiles|You cannot run an active scan against an unvalidated site."
@@ -10906,7 +11063,7 @@ msgstr ""
msgid "Days to merge"
msgstr ""
-msgid "Deactivate dormant users after 90 days of inactivity. Users can return to active status by signing in to their account. While inactive, a user is not counted as an active user in the instance."
+msgid "Deactivate dormant users after 90 days of inactivity"
msgstr ""
msgid "Dear Administrator,"
@@ -10993,10 +11150,10 @@ msgstr ""
msgid "Define a custom pattern with cron syntax"
msgstr ""
-msgid "Define approval settings."
+msgid "Define approval rules."
msgstr ""
-msgid "Define approval settings. %{linkStart}Learn more.%{linkEnd}"
+msgid "Define approval rules. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "Define custom rules for what constitutes spam, independent of Akismet"
@@ -11005,7 +11162,7 @@ msgstr ""
msgid "Define environments in the deploy stage(s) in %{code_open}.gitlab-ci.yml%{code_close} to track deployments here."
msgstr ""
-msgid "Define how approval rules are applied as a merge request moves toward completion."
+msgid "Define how approval rules are applied to merge requests."
msgstr ""
msgid "Definition"
@@ -11020,6 +11177,12 @@ msgstr ""
msgid "DelayedJobs|Are you sure you want to run %{job_name} immediately? This job will run automatically after it's timer finishes."
msgstr ""
+msgid "DelayedJobs|Are you sure you want to run %{job_name} immediately? This job will run automatically after its timer finishes."
+msgstr ""
+
+msgid "DelayedJobs|Run the delayed job now?"
+msgstr ""
+
msgid "DelayedJobs|Start now"
msgstr ""
@@ -11302,6 +11465,12 @@ msgstr ""
msgid "Dependency proxy image prefix"
msgstr ""
+msgid "DependencyProxy|Create a local proxy for storing frequently used upstream images. %{docLinkStart}Learn more%{docLinkEnd} about dependency proxies."
+msgstr ""
+
+msgid "DependencyProxy|Dependency Proxy"
+msgstr ""
+
msgid "DependencyProxy|Toggle Dependency Proxy"
msgstr ""
@@ -11548,6 +11717,9 @@ msgstr ""
msgid "Deployments"
msgstr ""
+msgid "Deployments to Google Kubernetes Engine can be "
+msgstr ""
+
msgid "Deployments|%{deployments} environment impacted."
msgid_plural "Deployments|%{deployments} environments impacted."
msgstr[0] ""
@@ -11579,6 +11751,9 @@ msgstr ""
msgid "Deployment|success"
msgstr ""
+msgid "Deprecated API rate limits"
+msgstr ""
+
msgid "Deprioritize label"
msgstr ""
@@ -11981,6 +12156,20 @@ msgstr ""
msgid "DiffsCompareBaseBranch|(base)"
msgstr ""
+msgid "Diffs|%d addition"
+msgid_plural "Diffs|%d additions"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
+msgid "Diffs|%d deletion"
+msgid_plural "Diffs|%d deletions"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "Diffs|No file name available"
msgstr ""
@@ -11990,9 +12179,19 @@ msgstr ""
msgid "Diffs|Show all unchanged lines"
msgstr ""
+msgid "Diffs|Showing %{dropdownStart}%{count} changed file%{dropdownEnd}"
+msgid_plural "Diffs|Showing %{dropdownStart}%{count} changed files%{dropdownEnd}"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "Diffs|Something went wrong while fetching diff lines."
msgstr ""
+msgid "Diffs|with %{additions} and %{deletions}"
+msgstr ""
+
msgid "Direct member"
msgstr ""
@@ -12120,9 +12319,6 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-msgid "Dismiss Value Stream Analytics introduction box"
-msgstr ""
-
msgid "Dismiss merge request promotion"
msgstr ""
@@ -12444,6 +12640,9 @@ msgstr ""
msgid "Edit issues"
msgstr ""
+msgid "Edit merge requests"
+msgstr ""
+
msgid "Edit public deploy key"
msgstr ""
@@ -12519,6 +12718,9 @@ msgstr ""
msgid "Elastic|None. Select projects to index."
msgstr ""
+msgid "Eligible users"
+msgstr ""
+
msgid "Email"
msgstr ""
@@ -12648,6 +12850,9 @@ msgstr ""
msgid "Enable"
msgstr ""
+msgid "Enable Amazon EKS integration"
+msgstr ""
+
msgid "Enable Auto DevOps"
msgstr ""
@@ -12681,6 +12886,9 @@ msgstr ""
msgid "Enable SSL verification"
msgstr ""
+msgid "Enable Service Ping"
+msgstr ""
+
msgid "Enable Snowplow tracking"
msgstr ""
@@ -12711,6 +12919,9 @@ msgstr ""
msgid "Enable authenticated Git LFS request rate limit"
msgstr ""
+msgid "Enable authenticated web request rate limit"
+msgstr ""
+
msgid "Enable authentication"
msgstr ""
@@ -12771,7 +12982,7 @@ msgstr ""
msgid "Enable or disable the Pseudonymizer data collection."
msgstr ""
-msgid "Enable or disable version check and service ping."
+msgid "Enable or disable version check and Service Ping."
msgstr ""
msgid "Enable protected paths rate limit"
@@ -12783,18 +12994,12 @@ msgstr ""
msgid "Enable reCAPTCHA"
msgstr ""
-msgid "Enable reCAPTCHA for login"
-msgstr ""
-
-msgid "Enable reCAPTCHA, Invisible Captcha, Akismet and set IP limits. For reCAPTCHA, we currently only support %{recaptcha_v2_link_start}v2%{recaptcha_v2_link_end}"
+msgid "Enable reCAPTCHA for login."
msgstr ""
msgid "Enable repository checks"
msgstr ""
-msgid "Enable service ping"
-msgstr ""
-
msgid "Enable shared runners for all projects and subgroups in this group."
msgstr ""
@@ -12816,7 +13021,10 @@ msgstr ""
msgid "Enable unauthenticated API request rate limit"
msgstr ""
-msgid "Enable unauthenticated request rate limit"
+msgid "Enable unauthenticated web request rate limit"
+msgstr ""
+
+msgid "Enable user deactivation emails"
msgstr ""
msgid "Enable version check"
@@ -12852,9 +13060,6 @@ msgstr ""
msgid "Enabled sources for code import during project creation. OmniAuth must be configured for GitHub"
msgstr ""
-msgid "Enabling this will only make licensed EE features available to projects if the project namespace's plan includes the feature or if the project is public."
-msgstr ""
-
msgid "Encountered an error while rendering: %{err}"
msgstr ""
@@ -12903,9 +13108,6 @@ msgstr ""
msgid "Enter Admin Mode"
msgstr ""
-msgid "Enter IP address range"
-msgstr ""
-
msgid "Enter a number"
msgstr ""
@@ -12918,9 +13120,6 @@ msgstr ""
msgid "Enter at least three characters to search"
msgstr ""
-msgid "Enter domain"
-msgstr ""
-
msgid "Enter in your Bitbucket Server URL and personal access token below"
msgstr ""
@@ -13107,9 +13306,6 @@ msgstr ""
msgid "Environments|Deployment %{status}"
msgstr ""
-msgid "Environments|Dismiss"
-msgstr ""
-
msgid "Environments|Enable review app"
msgstr ""
@@ -13122,9 +13318,6 @@ msgstr ""
msgid "Environments|Environments are places where code gets deployed, such as staging or production."
msgstr ""
-msgid "Environments|Help us improve environments"
-msgstr ""
-
msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
msgstr ""
@@ -13161,6 +13354,9 @@ msgstr ""
msgid "Environments|Note that this action will stop the environment, but it will %{emphasisStart}not%{emphasisEnd} have an effect on any existing deployment due to no “stop environment action†being defined in the %{ciConfigLinkStart}.gitlab-ci.yml%{ciConfigLinkEnd} file."
msgstr ""
+msgid "Environments|Open"
+msgstr ""
+
msgid "Environments|Open live environment"
msgstr ""
@@ -13200,9 +13396,6 @@ msgstr ""
msgid "Environments|Stopping %{environmentName}"
msgstr ""
-msgid "Environments|Take the survey"
-msgstr ""
-
msgid "Environments|There was an error fetching the logs. Please try again."
msgstr ""
@@ -13224,9 +13417,6 @@ msgstr ""
msgid "Environments|You don't have any environments right now"
msgstr ""
-msgid "Environments|Your feedback helps GitLab make environments better for you and other users. Participate and enter a sweepstake to win a USD 30 gift card."
-msgstr ""
-
msgid "Environments|by %{avatar}"
msgstr ""
@@ -13509,7 +13699,7 @@ msgstr ""
msgid "Error parsing CSV file. Please make sure it has"
msgstr ""
-msgid "Error rendering markdown preview"
+msgid "Error rendering Markdown preview"
msgstr ""
msgid "Error saving label update."
@@ -13557,6 +13747,9 @@ msgstr ""
msgid "Error: %{error_message}"
msgstr ""
+msgid "Error: Couldn't load some or all of the changes."
+msgstr ""
+
msgid "Error: No AWS credentials were supplied"
msgstr ""
@@ -13590,6 +13783,9 @@ msgstr ""
msgid "ErrorTracking|Enable error tracking"
msgstr ""
+msgid "ErrorTracking|Error tracking backend"
+msgstr ""
+
msgid "ErrorTracking|If you self-host Sentry, enter your Sentry instance's full URL. If you use Sentry's hosted solution, enter https://sentry.io"
msgstr ""
@@ -13623,6 +13819,12 @@ msgstr ""
msgid "Escalation policies must have at least one rule"
msgstr ""
+msgid "EscalationPolicies|%{clockIcon} IF alert is not %{alertStatus} in %{minutes}"
+msgstr ""
+
+msgid "EscalationPolicies|%{notificationIcon} THEN %{doAction} %{forScheduleOrUser}"
+msgstr ""
+
msgid "EscalationPolicies|+ Add an additional rule"
msgstr ""
@@ -13665,13 +13867,13 @@ msgstr ""
msgid "EscalationPolicies|Escalation policies"
msgstr ""
-msgid "EscalationPolicies|Escalation rules"
+msgid "EscalationPolicies|Escalation policy %{obstacle} in Project %{project}"
msgstr ""
-msgid "EscalationPolicies|Failed to load oncall-schedules"
+msgid "EscalationPolicies|Escalation rules"
msgstr ""
-msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} %{then} THEN %{doAction} %{scheduleOrUser}"
+msgid "EscalationPolicies|Failed to load oncall-schedules"
msgstr ""
msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} minutes"
@@ -13749,18 +13951,36 @@ msgstr ""
msgid "Every %{action} attempt has failed: %{job_error_message}. Please try again."
msgstr ""
+msgid "Every 3 months"
+msgstr ""
+
+msgid "Every 3 months on the %{day} at %{time} %{timezone}"
+msgstr ""
+
+msgid "Every 6 months"
+msgstr ""
+
+msgid "Every 6 months on the %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Every day"
msgstr ""
msgid "Every day (at %{time})"
msgstr ""
+msgid "Every day at %{time} %{timezone}"
+msgstr ""
+
msgid "Every month"
msgstr ""
msgid "Every month (Day %{day} at %{time})"
msgstr ""
+msgid "Every month on the %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Every three months"
msgstr ""
@@ -13777,6 +13997,15 @@ msgstr[3] ""
msgid "Every week (%{weekday} at %{time})"
msgstr ""
+msgid "Every week on %{day} at %{time} %{timezone}"
+msgstr ""
+
+msgid "Every year"
+msgstr ""
+
+msgid "Every year on %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Everyone"
msgstr ""
@@ -13813,9 +14042,6 @@ msgstr ""
msgid "Exactly one of %{attributes} is required"
msgstr ""
-msgid "Example: %{ip_address}. %{read_more_link}."
-msgstr ""
-
msgid "Example: @sub\\.company\\.com$"
msgstr ""
@@ -13882,13 +14108,13 @@ msgstr ""
msgid "Expand pipeline"
msgstr ""
-msgid "Expand sidebar"
+msgid "Expand settings section"
msgstr ""
-msgid "Expected documents: %{expected_documents}"
+msgid "Expand sidebar"
msgstr ""
-msgid "Experienced"
+msgid "Expected documents: %{expected_documents}"
msgstr ""
msgid "ExperimentSubject|Must have exactly one of User, Namespace, or Project."
@@ -14173,9 +14399,6 @@ msgstr ""
msgid "Failed to load related branches"
msgstr ""
-msgid "Failed to load sidebar lock status"
-msgstr ""
-
msgid "Failed to load stacktrace."
msgstr ""
@@ -14604,6 +14827,9 @@ msgstr ""
msgid "Files"
msgstr ""
+msgid "Files API Rate Limits"
+msgstr ""
+
msgid "Files breadcrumb"
msgstr ""
@@ -15603,6 +15829,9 @@ msgstr ""
msgid "GitLab group: %{source_link}"
msgstr ""
+msgid "GitLab informs you if a new version is available."
+msgstr ""
+
msgid "GitLab is a complete DevOps platform, delivered as a single application, fundamentally changing the way Development, Security, and Ops teams collaborate"
msgstr ""
@@ -15618,7 +15847,7 @@ msgstr ""
msgid "GitLab is open source software to collaborate on code."
msgstr ""
-msgid "GitLab is undergoing maintenance and is operating in a read-only mode."
+msgid "GitLab is undergoing maintenance and is operating in read-only mode."
msgstr ""
msgid "GitLab member or Email address"
@@ -15630,9 +15859,6 @@ msgstr ""
msgid "GitLab project export"
msgstr ""
-msgid "GitLab restart is required to apply changes."
-msgstr ""
-
msgid "GitLab single sign-on URL"
msgstr ""
@@ -15648,9 +15874,6 @@ msgstr ""
msgid "GitLab version"
msgstr ""
-msgid "GitLab will inform you if a new version is available."
-msgstr ""
-
msgid "GitLab will run a background job that will produce pseudonymized CSVs of the GitLab database that will be uploaded to your configured object storage directory."
msgstr ""
@@ -15915,9 +16138,21 @@ msgstr ""
msgid "Go to snippets"
msgstr ""
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check 'Allowed domains for sign-ups'."
+msgstr ""
+
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check 'Email restrictions for sign-ups'."
+msgstr ""
+
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check the 'Domain denylist'."
+msgstr ""
+
msgid "Go to the activity feed"
msgstr ""
+msgid "Go to the group’s 'Settings &gt; General' page, and check 'Restrict membership by email domain'."
+msgstr ""
+
msgid "Go to the milestone list"
msgstr ""
@@ -15954,6 +16189,12 @@ msgstr ""
msgid "Goal of the changes and what reviewers should be aware of"
msgstr ""
+msgid "Google Cloud"
+msgstr ""
+
+msgid "Google Cloud offers several deployment targets. Select the one most suitable for your project."
+msgstr ""
+
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
@@ -16038,9 +16279,6 @@ msgstr ""
msgid "Group ID"
msgstr ""
-msgid "Group ID: %{group_id}"
-msgstr ""
-
msgid "Group Owner must have signed in with SAML before enabling Group Managed Accounts"
msgstr ""
@@ -16215,6 +16453,12 @@ msgstr ""
msgid "GroupImport|Unable to process group import file"
msgstr ""
+msgid "GroupPage|Copy group ID"
+msgstr ""
+
+msgid "GroupPage|Group ID: %{group_id}"
+msgstr ""
+
msgid "GroupRoadmap|%{dateWord} – No end date"
msgstr ""
@@ -16269,6 +16513,9 @@ msgstr ""
msgid "GroupRoadmap|Within 3 years"
msgstr ""
+msgid "GroupSAML|\"persistent\" recommended"
+msgstr ""
+
msgid "GroupSAML|%{strongOpen}Warning%{strongClose} - Enabling %{linkStart}SSO enforcement%{linkEnd} can reduce security risks."
msgstr ""
@@ -16401,6 +16648,9 @@ msgstr ""
msgid "GroupSAML|To be able to prohibit outer forks, you first need to enforce dedicate group managed accounts."
msgstr ""
+msgid "GroupSAML|Use SAML group links to manage group membership using SAML."
+msgstr ""
+
msgid "GroupSAML|Valid SAML Response"
msgstr ""
@@ -16413,13 +16663,10 @@ msgstr ""
msgid "GroupSAML|as %{access_level}"
msgstr ""
-msgid "GroupSAML|must match stored NameID of \"%{extern_uid}\" as we use this to identify users. If the NameID changes users will be unable to sign in."
-msgstr ""
-
-msgid "GroupSAML|should be \"persistent\""
+msgid "GroupSAML|must match stored NameID of \"%{extern_uid}\" to identify user and allow sign in"
msgstr ""
-msgid "GroupSAML|should be a random persistent ID, emails are discouraged"
+msgid "GroupSAML|recommend persistent ID instead of email"
msgstr ""
msgid "GroupSelect|No matching results"
@@ -16434,9 +16681,15 @@ msgstr ""
msgid "GroupSettings|Allow project access token creation"
msgstr ""
+msgid "GroupSettings|Applied to all subgroups unless overridden by a group owner. Groups already added to the project lose access."
+msgstr ""
+
msgid "GroupSettings|Auto DevOps pipeline was updated for the group"
msgstr ""
+msgid "GroupSettings|Available only on the top-level group. Applies to all subgroups. Groups already shared with a group outside %{group} are still shared unless removed manually."
+msgstr ""
+
msgid "GroupSettings|Badges"
msgstr ""
@@ -16488,6 +16741,9 @@ msgstr ""
msgid "GroupSettings|New runners registration token has been generated!"
msgstr ""
+msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgstr ""
+
msgid "GroupSettings|Pipeline settings was updated for the group"
msgstr ""
@@ -16500,12 +16756,15 @@ msgstr ""
msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
-msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups."
+msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups"
msgstr ""
msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
msgstr ""
+msgid "GroupSettings|Prevents group members from being notified if the group is mentioned."
+msgstr ""
+
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
msgstr ""
@@ -16542,21 +16801,6 @@ msgstr ""
msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}."
msgstr ""
-msgid "GroupSettings|This setting is only available on the top-level group and it applies to all subgroups. Groups that have already been shared with a group outside %{group} will still be shared, and this access will have to be revoked manually."
-msgstr ""
-
-msgid "GroupSettings|This setting will be applied to all subgroups unless overridden by a group owner. Groups that already have access to the project will continue to have access unless removed manually."
-msgstr ""
-
-msgid "GroupSettings|This setting will override user notification preferences for all members of the group, subgroups, and projects."
-msgstr ""
-
-msgid "GroupSettings|This setting will prevent group members from being notified if the group is mentioned."
-msgstr ""
-
-msgid "GroupSettings|This setting will prevent group members from forking projects outside of the group."
-msgstr ""
-
msgid "GroupSettings|Transfer group"
msgstr ""
@@ -16674,7 +16918,7 @@ msgstr ""
msgid "GroupsNew|No import options available"
msgstr ""
-msgid "GroupsNew|Not all related objects are migrated, as %{docs_link_start}described here%{docs_link_end}. Please %{feedback_link_start}leave feedback%{feedback_link_end} on this feature."
+msgid "GroupsNew|Not all related objects are migrated. %{docs_link_start}More info%{docs_link_end}."
msgstr ""
msgid "GroupsNew|Personal access token"
@@ -16806,15 +17050,27 @@ msgstr ""
msgid "Hello %{name},"
msgstr ""
-msgid "Hello there"
-msgstr ""
-
msgid "Hello, %{name}!"
msgstr ""
msgid "Hello, %{username}!"
msgstr ""
+msgid "HelloMessage|%{handshake_emoji} Contribute to GitLab: %{contribute_link}"
+msgstr ""
+
+msgid "HelloMessage|%{magnifier_emoji} Create a new GitLab issue: %{new_issue_link}"
+msgstr ""
+
+msgid "HelloMessage|%{rocket_emoji} We like your curiosity! Help us improve GitLab by joining the team: %{jobs_page_link}"
+msgstr ""
+
+msgid "HelloMessage|Does this page need fixes or improvements? Open an issue or contribute a merge request to help make GitLab more lovable. At GitLab, everyone can contribute!"
+msgstr ""
+
+msgid "HelloMessage|Welcome to GitLab!"
+msgstr ""
+
msgid "Help"
msgstr ""
@@ -16824,13 +17080,10 @@ msgstr ""
msgid "Helps prevent bots from creating accounts."
msgstr ""
-msgid "Helps prevent bots from creating issues"
+msgid "Helps prevent bots from creating issues."
msgstr ""
-msgid "Helps prevent malicious users hide their activity"
-msgstr ""
-
-msgid "Helps reduce request volume (e.g. from crawlers or abusive bots)"
+msgid "Helps prevent malicious users hide their activity."
msgstr ""
msgid "Helps reduce request volume (for example, from crawlers or abusive bots)"
@@ -16958,6 +17211,12 @@ msgstr ""
msgid "Housekeeping, export, path, transfer, remove, archive."
msgstr ""
+msgid "How do I configure Akismet?"
+msgstr ""
+
+msgid "How do I configure it?"
+msgstr ""
+
msgid "How do I configure runners?"
msgstr ""
@@ -16979,19 +17238,25 @@ msgstr ""
msgid "How do I set up this service?"
msgstr ""
+msgid "How do I use a web terminal?"
+msgstr ""
+
+msgid "How do I use file templates?"
+msgstr ""
+
msgid "How it works"
msgstr ""
msgid "How many days need to pass between marking entity for deletion and actual removing it."
msgstr ""
-msgid "How many seconds an IP will be counted towards the limit"
+msgid "How many seconds an IP counts toward the IP address limit."
msgstr ""
-msgid "I accept the %{terms_link}"
+msgid "How the job limiter handles jobs exceeding the thresholds specified below. The 'track' mode only logs the jobs. The 'compress' mode compresses the jobs and raises an exception if the compressed size exceeds the limit."
msgstr ""
-msgid "I accept the|Terms of Service and Privacy Policy"
+msgid "I accept the %{terms_link}"
msgstr ""
msgid "I forgot my password"
@@ -17075,13 +17340,16 @@ msgstr ""
msgid "IP Address"
msgstr ""
-msgid "IP expiration time"
+msgid "IP address expiration time"
msgstr ""
-msgid "IP subnet restriction only allowed for top-level groups"
+msgid "IP address restrictions"
+msgstr ""
+
+msgid "IP addresses per user"
msgstr ""
-msgid "IPs per user"
+msgid "IP subnet restriction only allowed for top-level groups"
msgstr ""
msgid "Identifier"
@@ -17096,6 +17364,9 @@ msgstr ""
msgid "If any indexed field exceeds this limit it will be truncated to this number of characters and the rest will not be indexed or searchable. This does not apply to repository and wiki indexing. Setting this to 0 means it is unlimited."
msgstr ""
+msgid "If blank, defaults to %{code_open}Retry later%{code_close}."
+msgstr ""
+
msgid "If blank, set allowable lifetime to %{instance_level_policy_in_words}, as defined by the instance admin. Once set, existing tokens for users in this group may be revoked."
msgstr ""
@@ -17147,6 +17418,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 did not initiate these sign-in attempts, please reach out to your administrator or enable two-factor authentication (2FA) on your account."
+msgstr ""
+
msgid "If you did not initiate this change, please contact your administrator immediately."
msgstr ""
@@ -17242,10 +17516,10 @@ msgstr ""
msgid "Import Projects from Gitea"
msgstr ""
-msgid "Import a project"
+msgid "Import an exported GitLab project"
msgstr ""
-msgid "Import an exported GitLab project"
+msgid "Import and export rate limits"
msgstr ""
msgid "Import failed due to a GitHub error: %{original}"
@@ -17257,12 +17531,18 @@ msgstr ""
msgid "Import from Jira"
msgstr ""
+msgid "Import group"
+msgstr ""
+
msgid "Import group from file"
msgstr ""
msgid "Import groups"
msgstr ""
+msgid "Import history"
+msgstr ""
+
msgid "Import in progress"
msgstr ""
@@ -17326,7 +17606,25 @@ msgstr ""
msgid "Import timed out. Import took longer than %{import_jobs_expiration} seconds"
msgstr ""
-msgid "Import/Export Rate Limits"
+msgid "ImportAProjectModal|Import from a project"
+msgstr ""
+
+msgid "ImportAProjectModal|Import members from another project"
+msgstr ""
+
+msgid "ImportAProjectModal|Import project members"
+msgstr ""
+
+msgid "ImportAProjectModal|Only project members (not group members) are imported, and they get the same permissions as the project you import from."
+msgstr ""
+
+msgid "ImportAProjectModal|Successfully imported"
+msgstr ""
+
+msgid "ImportAProjectModal|Unable to import project members"
+msgstr ""
+
+msgid "ImportAProjectModal|You're importing members to the %{strongStart}%{name}%{strongEnd} project."
msgstr ""
msgid "ImportButtons|Connect repositories from"
@@ -17381,7 +17679,7 @@ msgstr[3] ""
msgid "Importing..."
msgstr ""
-msgid "Import|A repository URL usually ends in a .git suffix, although this is not required. Double check to make sure your repository URL is correct."
+msgid "Import|There is not a valid Git repository at this URL. If your HTTP repository is not publicly accessible, verify your credentials."
msgstr ""
msgid "Improve customer support with Service Desk"
@@ -17390,9 +17688,6 @@ msgstr ""
msgid "Improves Git cloning performance."
msgstr ""
-msgid "In %{time_to_now}"
-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 ""
@@ -17678,7 +17973,7 @@ msgstr ""
msgid "InProductMarketing|Start a GitLab Ultimate trial today in less than one minute, no credit card required."
msgstr ""
-msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no CC required"
+msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no credit card required"
msgstr ""
msgid "InProductMarketing|Start a trial"
@@ -17717,7 +18012,7 @@ msgstr ""
msgid "InProductMarketing|Team up in GitLab for greater efficiency"
msgstr ""
-msgid "InProductMarketing|Team work makes the dream work"
+msgid "InProductMarketing|Team work makes the dream work"
msgstr ""
msgid "InProductMarketing|Test, create, deploy"
@@ -18300,6 +18595,9 @@ msgstr ""
msgid "Integrations|Create new issue in Jira"
msgstr ""
+msgid "Integrations|Create new issue in ZenTao"
+msgstr ""
+
msgid "Integrations|Default settings are inherited from the group level."
msgstr ""
@@ -18393,9 +18691,15 @@ msgstr ""
msgid "Integrations|Search Jira issues"
msgstr ""
+msgid "Integrations|Search ZenTao issues"
+msgstr ""
+
msgid "Integrations|Send notifications about project events to Unify Circuit."
msgstr ""
+msgid "Integrations|Send notifications about project events to a Unify Circuit conversation. %{docs_link}"
+msgstr ""
+
msgid "Integrations|Sign in to add namespaces"
msgstr ""
@@ -18435,6 +18739,9 @@ msgstr ""
msgid "Integrations|You've activated every integration 🎉"
msgstr ""
+msgid "Integrations|ZenTao issues display here when you create issues in your project in ZenTao."
+msgstr ""
+
msgid "Interactive mode"
msgstr ""
@@ -18462,9 +18769,6 @@ msgstr ""
msgid "Interval Pattern"
msgstr ""
-msgid "Introducing Value Stream Analytics"
-msgstr ""
-
msgid "Introducing Your DevOps Report"
msgstr ""
@@ -18561,6 +18865,12 @@ msgstr ""
msgid "Investigate vulnerability: %{title}"
msgstr ""
+msgid "Invisible Captcha"
+msgstr ""
+
+msgid "Invisible Captcha helps prevent the creation of spam accounts. It adds a honeypot field and time-sensitive form submission to the account signup form."
+msgstr ""
+
msgid "Invitation"
msgstr ""
@@ -19014,12 +19324,18 @@ msgstr ""
msgid "Issues"
msgstr ""
+msgid "Issues I've created"
+msgstr ""
+
msgid "Issues Rate Limits"
msgstr ""
msgid "Issues and merge requests"
msgstr ""
+msgid "Issues assigned to me"
+msgstr ""
+
msgid "Issues can be bugs, tasks or ideas to be discussed. Also, issues are searchable and filterable."
msgstr ""
@@ -19131,7 +19447,7 @@ msgstr ""
msgid "Iterations|Create cadence"
msgstr ""
-msgid "Iterations|Create your first iteration"
+msgid "Iterations|Create iteration"
msgstr ""
msgid "Iterations|Delete cadence"
@@ -19140,6 +19456,9 @@ msgstr ""
msgid "Iterations|Delete iteration cadence?"
msgstr ""
+msgid "Iterations|Delete iteration?"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -19173,12 +19492,18 @@ msgstr ""
msgid "Iterations|New iteration cadence"
msgstr ""
+msgid "Iterations|No closed iterations."
+msgstr ""
+
msgid "Iterations|No iteration cadences to show."
msgstr ""
msgid "Iterations|No iterations in cadence."
msgstr ""
+msgid "Iterations|No open iterations."
+msgstr ""
+
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
@@ -19209,6 +19534,9 @@ msgstr ""
msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
msgstr ""
+msgid "Iterations|This will remove the iteration from any issues that are assigned to it."
+msgstr ""
+
msgid "Iterations|Title"
msgstr ""
@@ -19224,15 +19552,9 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "I’m familiar with the basics of DevOps."
-msgstr ""
-
msgid "I’m joining my team who’s already on GitLab"
msgstr ""
-msgid "I’m not familiar with the basics of DevOps."
-msgstr ""
-
msgid "Jaeger URL"
msgstr ""
@@ -19497,6 +19819,9 @@ msgstr ""
msgid "Job"
msgstr ""
+msgid "Job %{jobName}"
+msgstr ""
+
msgid "Job Failed #%{build_id}"
msgstr ""
@@ -20089,9 +20414,6 @@ msgstr ""
msgid "Learn more in the"
msgstr ""
-msgid "Learn more in the|pipeline schedules documentation"
-msgstr ""
-
msgid "Learn more."
msgstr ""
@@ -20203,9 +20525,6 @@ msgstr ""
msgid "Leave Admin Mode"
msgstr ""
-msgid "Leave blank for no limit. Once set, existing personal access tokens may be revoked."
-msgstr ""
-
msgid "Leave edit mode? All unsaved changes will be lost."
msgstr ""
@@ -20251,10 +20570,10 @@ msgstr ""
msgid "LicenseCompliance|Acceptable license to be used in the project"
msgstr ""
-msgid "LicenseCompliance|Add a license"
+msgid "LicenseCompliance|Add license and related policy"
msgstr ""
-msgid "LicenseCompliance|Add license and related policy"
+msgid "LicenseCompliance|Add license policy"
msgstr ""
msgid "LicenseCompliance|Allow"
@@ -20356,6 +20675,9 @@ msgstr ""
msgid "LicenseManagement|Uncategorized"
msgstr ""
+msgid "Licensed Enterprise Edition features can be used if the project namespace's plan includes the feature, or if the project is public."
+msgstr ""
+
msgid "Licensed Features"
msgstr ""
@@ -20422,7 +20744,10 @@ msgstr ""
msgid "Limit namespaces and projects that can be indexed"
msgstr ""
-msgid "Limit sign in from multiple ips"
+msgid "Limit project size at a global, group, and project level. %{link_start}Learn more%{link_end}."
+msgstr ""
+
+msgid "Limit sign in from multiple IP addresses"
msgstr ""
msgid "Limit the number of concurrent operations this secondary site can run in the background."
@@ -20434,6 +20759,9 @@ msgstr ""
msgid "Limit the number of issues and epics per minute a user can create through web and API requests."
msgstr ""
+msgid "Limit the size of Sidekiq jobs stored in Redis."
+msgstr ""
+
msgid "Limited to showing %d event at most"
msgid_plural "Limited to showing %d events at most"
msgstr[0] ""
@@ -20441,6 +20769,9 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "Limiting mode"
+msgstr ""
+
msgid "Line changes"
msgstr ""
@@ -20510,9 +20841,6 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
-msgid "List of users to be excluded from the limit"
-msgstr ""
-
msgid "List options"
msgstr ""
@@ -20552,9 +20880,6 @@ msgstr ""
msgid "Loading functions timed out. Please reload the page to try again."
msgstr ""
-msgid "Loading issues"
-msgstr ""
-
msgid "Loading more"
msgstr ""
@@ -20846,6 +21171,9 @@ msgstr ""
msgid "Marked For Deletion At - %{deletion_time}"
msgstr ""
+msgid "Marked as ready. Merging is now allowed."
+msgstr ""
+
msgid "Marked this %{noun} as a draft."
msgstr ""
@@ -20918,52 +21246,22 @@ msgstr ""
msgid "Max 100,000 events"
msgstr ""
-msgid "Max 20 characters"
-msgstr ""
-
-msgid "Max Group Export Download requests per minute per user"
-msgstr ""
-
-msgid "Max Group Export requests per minute per user"
-msgstr ""
-
-msgid "Max Group Import requests per minute per user"
-msgstr ""
-
-msgid "Max Project Export Download requests per minute per user"
-msgstr ""
-
-msgid "Max Project Export requests per minute per user"
-msgstr ""
-
-msgid "Max Project Import requests per minute per user"
-msgstr ""
-
-msgid "Max authenticated API requests per period per user"
-msgstr ""
-
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
-msgid "Max authenticated web requests per period per user"
-msgstr ""
-
msgid "Max file size is 200 KB."
msgstr ""
-msgid "Max requests per minute per user"
-msgstr ""
-
msgid "Max role"
msgstr ""
msgid "Max session time"
msgstr ""
-msgid "Max unauthenticated requests per period per IP"
+msgid "MaxBuilds"
msgstr ""
-msgid "MaxBuilds"
+msgid "Maximum 20 characters"
msgstr ""
msgid "Maximum Conan package file size in bytes"
@@ -20999,6 +21297,12 @@ msgstr ""
msgid "Maximum attachment size (MB)"
msgstr ""
+msgid "Maximum authenticated API requests per rate limit period per user"
+msgstr ""
+
+msgid "Maximum authenticated web requests per rate limit period per user"
+msgstr ""
+
msgid "Maximum bulk request size (MiB)"
msgstr ""
@@ -21044,6 +21348,15 @@ msgstr ""
msgid "Maximum files in a diff"
msgstr ""
+msgid "Maximum group export download requests per minute"
+msgstr ""
+
+msgid "Maximum group export requests per minute"
+msgstr ""
+
+msgid "Maximum group import requests per minute"
+msgstr ""
+
msgid "Maximum import size"
msgstr ""
@@ -21080,7 +21393,7 @@ msgstr ""
msgid "Maximum number of projects."
msgstr ""
-msgid "Maximum number of unique IPs per user"
+msgid "Maximum number of unique IP addresses per user."
msgstr ""
msgid "Maximum page reached"
@@ -21089,12 +21402,24 @@ msgstr ""
msgid "Maximum page size"
msgstr ""
+msgid "Maximum project export download requests per minute"
+msgstr ""
+
+msgid "Maximum project export requests per minute"
+msgstr ""
+
+msgid "Maximum project import requests per minute"
+msgstr ""
+
msgid "Maximum push size"
msgstr ""
msgid "Maximum push size (MB)"
msgstr ""
+msgid "Maximum requests per minute"
+msgstr ""
+
msgid "Maximum running slices"
msgstr ""
@@ -21122,10 +21447,16 @@ msgstr ""
msgid "Maximum time between updates that a mirror can have when scheduled to synchronize."
msgstr ""
-msgid "Maximum time for web terminal websocket connection (in seconds). 0 for unlimited."
+msgid "Maximum time that users are allowed to skip the setup of two-factor authentication (in hours). Set to 0 (zero) to enforce at next sign in."
msgstr ""
-msgid "Maximum time that users are allowed to skip the setup of two-factor authentication (in hours). Set to 0 (zero) to enforce at next sign in."
+msgid "Maximum time, in seconds, for a web terminal websocket connection. 0 for unlimited."
+msgstr ""
+
+msgid "Maximum unauthenticated API requests per rate limit period per IP"
+msgstr ""
+
+msgid "Maximum unauthenticated web requests per rate limit period per IP"
msgstr ""
msgid "May"
@@ -21143,9 +21474,6 @@ msgstr ""
msgid "Medium vulnerabilities present"
msgstr ""
-msgid "Member lock"
-msgstr ""
-
msgid "Member since"
msgstr ""
@@ -21182,6 +21510,9 @@ msgstr ""
msgid "Members of a group may only view projects they have permission to access"
msgstr ""
+msgid "Membership"
+msgstr ""
+
msgid "Members|%{time} by %{user}"
msgstr ""
@@ -21242,9 +21573,6 @@ msgstr ""
msgid "Members|Expiration date updated successfully."
msgstr ""
-msgid "Members|Expired"
-msgstr ""
-
msgid "Members|Filter members"
msgstr ""
@@ -21260,9 +21588,6 @@ msgstr ""
msgid "Members|Membership"
msgstr ""
-msgid "Members|No expiration set"
-msgstr ""
-
msgid "Members|Remove \"%{groupName}\""
msgstr ""
@@ -21284,9 +21609,6 @@ msgstr ""
msgid "Members|Search invited"
msgstr ""
-msgid "Members|in %{time}"
-msgstr ""
-
msgid "Member|Deny access"
msgstr ""
@@ -21362,9 +21684,6 @@ msgstr ""
msgid "Merge request %{mr_link} was reviewed by %{mr_author}"
msgstr ""
-msgid "Merge request (MR) approvals"
-msgstr ""
-
msgid "Merge request analytics"
msgstr ""
@@ -21386,12 +21705,21 @@ msgstr ""
msgid "Merge requests"
msgstr ""
+msgid "Merge requests I've created"
+msgstr ""
+
msgid "Merge requests are a place to propose changes you've made to a project and discuss those changes with others"
msgstr ""
msgid "Merge requests are read-only in a secondary Geo node"
msgstr ""
+msgid "Merge requests assigned to me"
+msgstr ""
+
+msgid "Merge requests that I'm a reviewer"
+msgstr ""
+
msgid "Merge the branch and fix any conflicts that come up"
msgstr ""
@@ -21452,10 +21780,10 @@ msgstr ""
msgid "MergeRequests|An error occurred while saving the draft comment."
msgstr ""
-msgid "MergeRequests|Failed to squash. Should be done manually."
+msgid "MergeRequests|Create issue to resolve thread"
msgstr ""
-msgid "MergeRequests|Resolve this thread in a new issue"
+msgid "MergeRequests|Failed to squash. Should be done manually."
msgstr ""
msgid "MergeRequests|Saving the comment failed"
@@ -22273,6 +22601,9 @@ msgstr ""
msgid "MoveIssue|Cannot move issue to project it originates from!"
msgstr ""
+msgid "MoveIssue|Cannot move issues of '%{issue_type}' type."
+msgstr ""
+
msgid "Moved issue to %{label} column in the board."
msgstr ""
@@ -22400,6 +22731,15 @@ 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. To learn more about reducing storage capacity please visit our docs."
msgstr ""
+msgid "NamespaceUserCap|Pending users must be reviewed and approved by a group owner. Learn more about %{user_caps_link_start}User Caps%{link_end} and %{users_pending_approval_link_start}Users Pending Approval%{link_end}."
+msgstr ""
+
+msgid "NamespaceUserCap|View pending user approvals"
+msgstr ""
+
+msgid "NamespaceUserCap|Your group has reached its billable member limit"
+msgstr ""
+
msgid "Namespaces"
msgstr ""
@@ -22442,9 +22782,6 @@ msgstr ""
msgid "Network"
msgstr ""
-msgid "Network Policy|New rule"
-msgstr ""
-
msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is inbound from a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
msgstr ""
@@ -22466,16 +22803,13 @@ msgstr ""
msgid "NetworkPolicies|%{strongOpen}any%{strongClose} port"
msgstr ""
-msgid "NetworkPolicies|+ Add alert"
-msgstr ""
-
msgid "NetworkPolicies|.yaml"
msgstr ""
msgid "NetworkPolicies|.yaml mode"
msgstr ""
-msgid "NetworkPolicies|Actions"
+msgid "NetworkPolicies|Add alert"
msgstr ""
msgid "NetworkPolicies|Alerts are intended to be selectively used for a limited number of events that are potentially concerning and warrant a manual review. Alerts should not be used as a substitute for a SIEM or a logging tool. High volume alerts are likely to be dropped so as to preserve the stability of GitLab's integration with Kubernetes."
@@ -22511,9 +22845,6 @@ msgstr ""
msgid "NetworkPolicies|Deny all traffic"
msgstr ""
-msgid "NetworkPolicies|Description"
-msgstr ""
-
msgid "NetworkPolicies|Edit policy"
msgstr ""
@@ -22526,9 +22857,6 @@ msgstr ""
msgid "NetworkPolicies|IP/subnet"
msgstr ""
-msgid "NetworkPolicies|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
-msgstr ""
-
msgid "NetworkPolicies|Invalid or empty policy"
msgstr ""
@@ -22538,19 +22866,16 @@ msgstr ""
msgid "NetworkPolicies|Kubernetes error: %{error}"
msgstr ""
-msgid "NetworkPolicies|Name"
-msgstr ""
-
msgid "NetworkPolicies|Network"
msgstr ""
-msgid "NetworkPolicies|Network traffic"
+msgid "NetworkPolicies|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
msgstr ""
-msgid "NetworkPolicies|New policy"
+msgid "NetworkPolicies|Network policy can be created after the environment is loaded successfully."
msgstr ""
-msgid "NetworkPolicies|No policies detected"
+msgid "NetworkPolicies|Network traffic"
msgstr ""
msgid "NetworkPolicies|None selected"
@@ -22559,21 +22884,12 @@ msgstr ""
msgid "NetworkPolicies|Please %{installLinkStart}install%{installLinkEnd} and %{configureLinkStart}configure a Kubernetes Agent for this project%{configureLinkEnd} to enable alerts."
msgstr ""
-msgid "NetworkPolicies|Policies are a specification of how groups of pods are allowed to communicate with each other's network endpoints."
-msgstr ""
-
msgid "NetworkPolicies|Policy %{policyName} was successfully changed"
msgstr ""
msgid "NetworkPolicies|Policy definition"
msgstr ""
-msgid "NetworkPolicies|Policy editor"
-msgstr ""
-
-msgid "NetworkPolicies|Policy preview"
-msgstr ""
-
msgid "NetworkPolicies|Rule"
msgstr ""
@@ -22583,9 +22899,6 @@ msgstr ""
msgid "NetworkPolicies|Rule mode is unavailable for this policy. In some cases, we cannot parse the YAML file back into the rules editor."
msgstr ""
-msgid "NetworkPolicies|Rules"
-msgstr ""
-
msgid "NetworkPolicies|Save changes"
msgstr ""
@@ -22598,9 +22911,6 @@ msgstr ""
msgid "NetworkPolicies|Traffic that does not match any rule will be blocked."
msgstr ""
-msgid "NetworkPolicies|Unable to parse policy"
-msgstr ""
-
msgid "NetworkPolicies|all DNS names"
msgstr ""
@@ -22782,6 +23092,9 @@ msgstr ""
msgid "New issue"
msgstr ""
+msgid "New issue in %{project}"
+msgstr ""
+
msgid "New issue title"
msgstr ""
@@ -22860,7 +23173,7 @@ msgstr ""
msgid "Newest first"
msgstr ""
-msgid "Newly registered users will by default be external"
+msgid "Newly-registered users are external by default"
msgstr ""
msgid "Next"
@@ -23175,8 +23488,12 @@ msgstr ""
msgid "No webhooks found, add one in the form above."
msgstr ""
-msgid "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} to renew your subscription."
-msgstr ""
+msgid "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} day to renew your subscription."
+msgid_plural "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} days to renew your subscription."
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
msgid "No. of commits"
msgstr ""
@@ -23193,7 +23510,7 @@ msgstr ""
msgid "Nodes"
msgstr ""
-msgid "Non-admin users can sign in with read-only access and make read-only API requests."
+msgid "Non-admin users are restricted to read-only access, in both GitLab UI and API."
msgstr ""
msgid "None"
@@ -23274,7 +23591,7 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
-msgid "Notes Rate Limits"
+msgid "Notes rate limit"
msgstr ""
msgid "Notes|Are you sure you want to cancel creating this comment?"
@@ -23449,9 +23766,6 @@ msgstr ""
msgid "November"
msgstr ""
-msgid "Novice"
-msgstr ""
-
msgid "Now, personalize your GitLab experience"
msgstr ""
@@ -23620,7 +23934,7 @@ msgstr ""
msgid "OnCallSchedules|For this rotation, on-call will be:"
msgstr ""
-msgid "OnCallSchedules|On-call schedule %{schedule} in Project %{project}"
+msgid "OnCallSchedules|On-call schedule %{obstacle} in Project %{project}"
msgstr ""
msgid "OnCallSchedules|On-call schedules"
@@ -23767,22 +24081,22 @@ msgstr ""
msgid "OnDemandScans|Scanner profile"
msgstr ""
-msgid "OnDemandScans|Select one of the existing profiles"
+msgid "OnDemandScans|Schedule scan"
msgstr ""
-msgid "OnDemandScans|Site profile"
+msgid "OnDemandScans|Select one of the existing profiles"
msgstr ""
-msgid "OnDemandScans|Use existing scanner profile"
+msgid "OnDemandScans|Site profile"
msgstr ""
-msgid "OnDemandScans|Use existing site profile"
+msgid "OnDemandScans|Start time"
msgstr ""
-msgid "OnDemandScans|You can either choose a passive scan or validate the target site in your chosen site profile. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
+msgid "OnDemandScans|Use existing scanner profile"
msgstr ""
-msgid "OnDemandScans|You cannot run an active scan against an unvalidated site."
+msgid "OnDemandScans|Use existing site profile"
msgstr ""
msgid "OnDemandScans|You must create a repository within your project to run an on-demand scan."
@@ -23849,6 +24163,9 @@ msgstr ""
msgid "Only admins can delete project"
msgstr ""
+msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
+msgstr ""
+
msgid "Only include features new to your current subscription tier."
msgstr ""
@@ -23867,6 +24184,12 @@ msgstr ""
msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
+msgid "Only reCAPTCHA v2 is supported:"
+msgstr ""
+
+msgid "Only users from the specified IP address ranges are able to reach this group, including all subgroups, projects, and Git repositories."
+msgstr ""
+
msgid "Only verified users with an email address in any of these domains can be added to the group."
msgstr ""
@@ -24053,9 +24376,6 @@ msgstr ""
msgid "Package Registry"
msgstr ""
-msgid "Package Registry Rate Limits"
-msgstr ""
-
msgid "Package Registry: authenticated API requests"
msgstr ""
@@ -24074,6 +24394,9 @@ msgstr ""
msgid "Package recipe already exists"
msgstr ""
+msgid "Package registry rate limits"
+msgstr ""
+
msgid "Package type"
msgstr ""
@@ -24140,6 +24463,9 @@ msgstr ""
msgid "PackageRegistry|Composer"
msgstr ""
+msgid "PackageRegistry|Composer.json with license: %{license} and version: %{version}"
+msgstr ""
+
msgid "PackageRegistry|Conan"
msgstr ""
@@ -24203,6 +24529,9 @@ msgstr ""
msgid "PackageRegistry|Copy require package include"
msgstr ""
+msgid "PackageRegistry|Copy target SHA"
+msgstr ""
+
msgid "PackageRegistry|Copy yarn command"
msgstr ""
@@ -24269,6 +24598,9 @@ msgstr ""
msgid "PackageRegistry|Install package version"
msgstr ""
+msgid "PackageRegistry|Instance-level"
+msgstr ""
+
msgid "PackageRegistry|Invalid Package: failed metadata extraction"
msgstr ""
@@ -24314,6 +24646,9 @@ msgstr ""
msgid "PackageRegistry|Pip Command"
msgstr ""
+msgid "PackageRegistry|Project-level"
+msgstr ""
+
msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
msgstr ""
@@ -24335,6 +24670,9 @@ msgstr ""
msgid "PackageRegistry|Remove package"
msgstr ""
+msgid "PackageRegistry|Required Python: %{pythonVersion}"
+msgstr ""
+
msgid "PackageRegistry|RubyGems"
msgstr ""
@@ -24377,6 +24715,9 @@ msgstr ""
msgid "PackageRegistry|Source project located at %{link}"
msgstr ""
+msgid "PackageRegistry|Target SHA: %{sha}"
+msgstr ""
+
msgid "PackageRegistry|There are no other versions of this package."
msgstr ""
@@ -24545,6 +24886,18 @@ msgstr ""
msgid "Password was successfully updated. Please sign in again."
msgstr ""
+msgid "PasswordPrompt|Confirm password"
+msgstr ""
+
+msgid "PasswordPrompt|Confirm password to continue"
+msgstr ""
+
+msgid "PasswordPrompt|Password is required"
+msgstr ""
+
+msgid "PasswordPrompt|Please enter your password to confirm"
+msgstr ""
+
msgid "Passwords should be unique and not used for any other sites or services."
msgstr ""
@@ -24572,6 +24925,9 @@ msgstr ""
msgid "Paste project path (i.e. gitlab-org/gitlab)"
msgstr ""
+msgid "Paste this DSN into your Sentry SDK"
+msgstr ""
+
msgid "Paste your public SSH key, which is usually contained in the file '~/.ssh/id_ed25519.pub' or '~/.ssh/id_rsa.pub' and begins with 'ssh-ed25519' or 'ssh-rsa'. Do not paste your private SSH key, as that can compromise your identity."
msgstr ""
@@ -24656,6 +25012,9 @@ msgstr ""
msgid "PerformanceBar|First Contentful Paint"
msgstr ""
+msgid "PerformanceBar|Flamegraph with mode:"
+msgstr ""
+
msgid "PerformanceBar|Frontend resources"
msgstr ""
@@ -24689,6 +25048,15 @@ msgstr ""
msgid "PerformanceBar|Trace"
msgstr ""
+msgid "PerformanceBar|cpu"
+msgstr ""
+
+msgid "PerformanceBar|object"
+msgstr ""
+
+msgid "PerformanceBar|wall"
+msgstr ""
+
msgid "Period in seconds"
msgstr ""
@@ -24917,6 +25285,48 @@ msgstr ""
msgid "PipelineSchedules|Variables"
msgstr ""
+msgid "PipelineSource|API"
+msgstr ""
+
+msgid "PipelineSource|Chat"
+msgstr ""
+
+msgid "PipelineSource|External"
+msgstr ""
+
+msgid "PipelineSource|External Pull Request"
+msgstr ""
+
+msgid "PipelineSource|Merge Request"
+msgstr ""
+
+msgid "PipelineSource|On-Demand DAST Scan"
+msgstr ""
+
+msgid "PipelineSource|On-Demand DAST Validation"
+msgstr ""
+
+msgid "PipelineSource|Parent Pipeline"
+msgstr ""
+
+msgid "PipelineSource|Pipeline"
+msgstr ""
+
+msgid "PipelineSource|Push"
+msgstr ""
+
+msgid "PipelineSource|Schedule"
+msgstr ""
+
+msgid "PipelineSource|Trigger"
+msgstr ""
+
+msgid "PipelineSource|Web"
+msgstr ""
+
+msgid "PipelineSource|Web IDE"
+msgstr ""
+
msgid "PipelineStatusTooltip|Pipeline: %{ciStatus}"
msgstr ""
@@ -25217,46 +25627,7 @@ msgstr ""
msgid "Pipeline|Source"
msgstr ""
-msgid "Pipeline|Source|API"
-msgstr ""
-
-msgid "Pipeline|Source|Chat"
-msgstr ""
-
-msgid "Pipeline|Source|External"
-msgstr ""
-
-msgid "Pipeline|Source|External Pull Request"
-msgstr ""
-
-msgid "Pipeline|Source|Merge Request"
-msgstr ""
-
-msgid "Pipeline|Source|On-Demand DAST Scan"
-msgstr ""
-
-msgid "Pipeline|Source|On-Demand DAST Validation"
-msgstr ""
-
-msgid "Pipeline|Source|Parent Pipeline"
-msgstr ""
-
-msgid "Pipeline|Source|Pipeline"
-msgstr ""
-
-msgid "Pipeline|Source|Push"
-msgstr ""
-
-msgid "Pipeline|Source|Schedule"
-msgstr ""
-
-msgid "Pipeline|Source|Trigger"
-msgstr ""
-
-msgid "Pipeline|Source|Web"
-msgstr ""
-
-msgid "Pipeline|Source|Web IDE"
+msgid "Pipeline|Source|Security Policy"
msgstr ""
msgid "Pipeline|Specify variable values to be used in this run. The values specified in %{linkStart}CI/CD settings%{linkEnd} will be used by default."
@@ -25307,7 +25678,7 @@ msgstr ""
msgid "Pipeline|We are currently unable to fetch pipeline data"
msgstr ""
-msgid "Pipeline|You’re about to stop pipeline %{pipelineId}."
+msgid "Pipeline|You’re about to stop pipeline #%{pipelineId}."
msgstr ""
msgid "Pipeline|for"
@@ -25334,6 +25705,9 @@ msgstr ""
msgid "Plain diff"
msgstr ""
+msgid "Plain-text response to send to clients that hit a rate limit"
+msgstr ""
+
msgid "Plan:"
msgstr ""
@@ -25478,9 +25852,6 @@ msgstr ""
msgid "Please provide attributes to update"
msgstr ""
-msgid "Please provide your username or email address."
-msgstr ""
-
msgid "Please reach out if you have any questions and we'll be happy to assist."
msgstr ""
@@ -25523,9 +25894,6 @@ msgstr ""
msgid "Please set a new password before proceeding."
msgstr ""
-msgid "Please share your feedback about %{featureName} %{linkStart}in this issue%{linkEnd} to help us improve the experience."
-msgstr ""
-
msgid "Please solve the captcha"
msgstr ""
@@ -25703,6 +26071,9 @@ msgstr ""
msgid "Prevent adding new members to project membership within this group"
msgstr ""
+msgid "Prevent auto-stopping"
+msgstr ""
+
msgid "Prevent editing approval rules in projects and merge requests."
msgstr ""
@@ -25715,7 +26086,7 @@ msgstr ""
msgid "Prevent users from changing their profile name"
msgstr ""
-msgid "Prevent users from performing write operations on GitLab while performing maintenance."
+msgid "Prevent users from performing write operations while GitLab maintenance is in progress."
msgstr ""
msgid "Preview"
@@ -25988,6 +26359,9 @@ msgstr ""
msgid "Profiles|Enter your name, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Enter your password to confirm the email change"
+msgstr ""
+
msgid "Profiles|Enter your pronouns to let people know how to refer to you"
msgstr ""
@@ -26222,10 +26596,10 @@ msgstr ""
msgid "Profiles|e.g. My MacBook key"
msgstr ""
-msgid "Profiles|username"
+msgid "Profiles|https://website.com"
msgstr ""
-msgid "Profiles|website.com"
+msgid "Profiles|username"
msgstr ""
msgid "Profiles|your account"
@@ -26468,9 +26842,21 @@ msgstr ""
msgid "ProjectSelect| or group"
msgstr ""
+msgid "ProjectSelect|No matching results"
+msgstr ""
+
msgid "ProjectSelect|Search for project"
msgstr ""
+msgid "ProjectSelect|Search projects"
+msgstr ""
+
+msgid "ProjectSelect|Select a project"
+msgstr ""
+
+msgid "ProjectSelect|There was an error fetching the projects. Please try again."
+msgstr ""
+
msgid "ProjectService|Drone server URL"
msgstr ""
@@ -26558,6 +26944,9 @@ msgstr ""
msgid "ProjectService|Trigger event when a new, unique alert is recorded."
msgstr ""
+msgid "ProjectService|Trigger event when a new, unique vulnerability is recorded. (Note: This feature requires an Ultimate plan.)"
+msgstr ""
+
msgid "ProjectService|Trigger event when a pipeline status changes."
msgstr ""
@@ -26972,9 +27361,15 @@ msgstr ""
msgid "Projects are graded based on the highest severity vulnerability present"
msgstr ""
+msgid "Projects are organized into groups"
+msgstr ""
+
msgid "Projects contributed to"
msgstr ""
+msgid "Projects help you organize your work. They contain your file repository, issues, merge requests, and so much more."
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr ""
@@ -27209,10 +27604,10 @@ msgstr ""
msgid "PrometheusService|Prometheus cluster integration"
msgstr ""
-msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
+msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
msgstr ""
-msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
+msgid "PrometheusService|The ID of the IAP-secured resource."
msgstr ""
msgid "PrometheusService|The Prometheus API base URL."
@@ -27830,6 +28225,9 @@ msgstr ""
msgid "Rate limit"
msgstr ""
+msgid "Rate limits can help reduce request volume (like from crawlers or abusive bots)."
+msgstr ""
+
msgid "Raw blob request rate limit per minute"
msgstr ""
@@ -27842,6 +28240,9 @@ msgstr ""
msgid "Re-authentication required"
msgstr ""
+msgid "Re-import"
+msgstr ""
+
msgid "Re-request review"
msgstr ""
@@ -27863,6 +28264,9 @@ msgstr ""
msgid "Read more about related issues"
msgstr ""
+msgid "Read their documentation."
+msgstr ""
+
msgid "Ready to get started with GitLab? Follow these steps to set up your workspace, plan and commit changes, and deploy your project."
msgstr ""
@@ -27896,6 +28300,9 @@ msgstr ""
msgid "Receive any notifications from GitLab."
msgstr ""
+msgid "Receive notification of abuse reports by email."
+msgstr ""
+
msgid "Receive notifications about your own activity"
msgstr ""
@@ -28041,9 +28448,6 @@ msgstr ""
msgid "Registry setup"
msgstr ""
-msgid "Regulate approvals by authors/committers. Affects all projects."
-msgstr ""
-
msgid "Reindexing Status: %{status} (Slice multiplier: %{multiplier}, Maximum running slices: %{max_slices})"
msgstr ""
@@ -28141,6 +28545,9 @@ msgstr ""
msgid "Release|Something went wrong while saving the release details."
msgstr ""
+msgid "Reload page"
+msgstr ""
+
msgid "Remediations"
msgstr ""
@@ -28423,6 +28830,9 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
+msgid "Repeats"
+msgstr ""
+
msgid "Replace"
msgstr ""
@@ -28793,10 +29203,7 @@ msgstr ""
msgid "Require additional authentication for administrative tasks."
msgstr ""
-msgid "Require all users in this group to setup Two-factor authentication"
-msgstr ""
-
-msgid "Require all users in this group to setup two-factor authentication"
+msgid "Require all users in this group to set up two-factor authentication"
msgstr ""
msgid "Required approvals (%{approvals_given} given)"
@@ -28846,6 +29253,9 @@ msgstr[3] ""
msgid "Requires values to meet regular expression requirements."
msgstr ""
+msgid "Requires you to deploy or set up cloud-hosted Sentry."
+msgstr ""
+
msgid "Requires your primary GitLab email address."
msgstr ""
@@ -28906,9 +29316,6 @@ msgstr ""
msgid "Resolve"
msgstr ""
-msgid "Resolve all threads in new issue"
-msgstr ""
-
msgid "Resolve conflicts"
msgstr ""
@@ -28966,6 +29373,9 @@ msgstr ""
msgid "Response text"
msgstr ""
+msgid "Restart GitLab to apply changes."
+msgstr ""
+
msgid "Restart Terminal"
msgstr ""
@@ -28984,6 +29394,9 @@ msgstr ""
msgid "Restoring the project will prevent the project from being removed on this date and restore people's ability to make changes to it."
msgstr ""
+msgid "Restrict group access by IP address. %{link_start}Learn more%{link_end}."
+msgstr ""
+
msgid "Restrict membership by email domain"
msgstr ""
@@ -29301,6 +29714,9 @@ msgstr ""
msgid "Runners|Runner #%{runner_id}"
msgstr ""
+msgid "Runners|Runner assigned to project."
+msgstr ""
+
msgid "Runners|Runner is offline, last contact was %{runner_contact} ago"
msgstr ""
@@ -29313,6 +29729,9 @@ msgstr ""
msgid "Runners|Runner registration"
msgstr ""
+msgid "Runners|Runner unassigned from project."
+msgstr ""
+
msgid "Runners|Runners"
msgstr ""
@@ -29505,7 +29924,7 @@ msgstr ""
msgid "SastEntryPoints|How do I set up SAST?"
msgstr ""
-msgid "SastEntryPoints|Learn more."
+msgid "SastEntryPoints|Learn more"
msgstr ""
msgid "Satisfied"
@@ -29547,7 +29966,7 @@ msgstr ""
msgid "Save pipeline schedule"
msgstr ""
-msgid "Save space and find images in the container Registry. remove unneeded tags and keep only the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
+msgid "Save storage space by automatically deleting tags from the container registry and keeping the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
msgstr ""
msgid "Saving"
@@ -29721,6 +30140,9 @@ msgstr ""
msgid "Search or filter results…"
msgstr ""
+msgid "Search or jump to..."
+msgstr ""
+
msgid "Search project"
msgstr ""
@@ -29781,16 +30203,16 @@ msgstr ""
msgid "SearchCodeResults|of %{link_to_project}"
msgstr ""
-msgid "SearchResults|Showing %{count} %{scope} for%{term_element}"
+msgid "SearchResults|Showing %{count} %{scope} for %{term_element}"
msgstr ""
-msgid "SearchResults|Showing %{count} %{scope} for%{term_element} in your personal and project snippets"
+msgid "SearchResults|Showing %{count} %{scope} for %{term_element} in your personal and project snippets"
msgstr ""
-msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for%{term_element}"
+msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for %{term_element}"
msgstr ""
-msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for%{term_element} in your personal and project snippets"
+msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for %{term_element} in your personal and project snippets"
msgstr ""
msgid "SearchResults|code result"
@@ -29894,6 +30316,9 @@ msgstr ""
msgid "Secret Detection"
msgstr ""
+msgid "Secret access key"
+msgstr ""
+
msgid "Secret token"
msgstr ""
@@ -29933,9 +30358,6 @@ msgstr ""
msgid "SecurityApprovals|A merge request approval is required when the license compliance report contains a denied license."
msgstr ""
-msgid "SecurityApprovals|Configurable if security scanners are enabled. %{linkStart}Learn more.%{linkEnd}"
-msgstr ""
-
msgid "SecurityApprovals|Coverage-Check"
msgstr ""
@@ -29948,24 +30370,18 @@ msgstr ""
msgid "SecurityApprovals|Learn more about Vulnerability-Check"
msgstr ""
-msgid "SecurityApprovals|License Scanning must be enabled. %{linkStart}Learn more%{linkEnd}."
-msgstr ""
-
msgid "SecurityApprovals|License-Check"
msgstr ""
msgid "SecurityApprovals|Requires approval for Denied licenses. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}More information%{linkEnd}"
+msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "SecurityApprovals|Requires approval for vulnerabilities. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
-msgid "SecurityApprovals|Test coverage must be enabled. %{linkStart}Learn more%{linkEnd}."
-msgstr ""
-
msgid "SecurityApprovals|Vulnerability-Check"
msgstr ""
@@ -30029,6 +30445,12 @@ msgstr ""
msgid "SecurityConfiguration|Immediately begin risk analysis and remediation with application security features. Start with SAST and Secret Detection, available to all plans. Upgrade to Ultimate to get all features, including:"
msgstr ""
+msgid "SecurityConfiguration|Manage corpus"
+msgstr ""
+
+msgid "SecurityConfiguration|Manage corpus files used as mutation sources in coverage fuzzing."
+msgstr ""
+
msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
msgstr ""
@@ -30083,6 +30505,12 @@ msgstr ""
msgid "SecurityOrchestration|Action"
msgstr ""
+msgid "SecurityOrchestration|Actions"
+msgstr ""
+
+msgid "SecurityOrchestration|Add rule"
+msgstr ""
+
msgid "SecurityOrchestration|All policies"
msgstr ""
@@ -30116,9 +30544,6 @@ msgstr ""
msgid "SecurityOrchestration|Network"
msgstr ""
-msgid "SecurityOrchestration|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
-msgstr ""
-
msgid "SecurityOrchestration|New policy"
msgstr ""
@@ -30134,6 +30559,9 @@ msgstr ""
msgid "SecurityOrchestration|Policy editor"
msgstr ""
+msgid "SecurityOrchestration|Policy preview"
+msgstr ""
+
msgid "SecurityOrchestration|Policy status"
msgstr ""
@@ -30143,6 +30571,9 @@ msgstr ""
msgid "SecurityOrchestration|Rule"
msgstr ""
+msgid "SecurityOrchestration|Rules"
+msgstr ""
+
msgid "SecurityOrchestration|Scan Execution"
msgstr ""
@@ -30236,6 +30667,9 @@ msgstr ""
msgid "SecurityReports|Create issue"
msgstr ""
+msgid "SecurityReports|Development vulnerabilities"
+msgstr ""
+
msgid "SecurityReports|Dismiss vulnerability"
msgstr ""
@@ -30251,6 +30685,9 @@ msgstr ""
msgid "SecurityReports|Download results"
msgstr ""
+msgid "SecurityReports|Download scanned URLs"
+msgstr ""
+
msgid "SecurityReports|Download scanned resources"
msgstr ""
@@ -30374,6 +30811,9 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
+msgid "SecurityReports|The Vulnerability Report shows the results of the lastest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "SecurityReports|The security reports below contain one or more vulnerability findings that could not be parsed and were not recorded. Download the artifacts in the job output to investigate. Ensure any security report created conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
msgstr ""
@@ -30515,10 +30955,10 @@ msgstr ""
msgid "Select a repository"
msgstr ""
-msgid "Select a role"
+msgid "Select a repository containing templates for common files."
msgstr ""
-msgid "Select a shared template repository for all projects on this instance."
+msgid "Select a role"
msgstr ""
msgid "Select a template repository"
@@ -30596,6 +31036,9 @@ msgstr ""
msgid "Select project to choose zone"
msgstr ""
+msgid "Select project to create issue"
+msgstr ""
+
msgid "Select projects"
msgstr ""
@@ -30713,6 +31156,9 @@ msgstr ""
msgid "Send emails to help guide new users through the onboarding process."
msgstr ""
+msgid "Send emails to users upon account deactivation."
+msgstr ""
+
msgid "Send message"
msgstr ""
@@ -30731,6 +31177,9 @@ msgstr ""
msgid "Send service data"
msgstr ""
+msgid "Sentry"
+msgstr ""
+
msgid "Sentry API URL"
msgstr ""
@@ -30845,6 +31294,9 @@ msgstr ""
msgid "Service"
msgstr ""
+msgid "Service Accounts keys are required to authorize GitLab to deploy your Google Cloud project."
+msgstr ""
+
msgid "Service Desk"
msgstr ""
@@ -30917,15 +31369,15 @@ msgstr ""
msgid "Set a password on your account to pull or push via %{protocol}."
msgstr ""
-msgid "Set a template repository for projects in this group"
-msgstr ""
-
msgid "Set access permissions for this token."
msgstr ""
msgid "Set an instance-wide domain that will be available to all clusters when installing Knative."
msgstr ""
+msgid "Set any rate limit to %{code_open}0%{code_close} to disable the limit."
+msgstr ""
+
msgid "Set default and restrict visibility levels. Configure import sources and git access protocol."
msgstr ""
@@ -30938,7 +31390,7 @@ msgstr ""
msgid "Set limit to 0 to allow any file size."
msgstr ""
-msgid "Set max session time for web terminal."
+msgid "Set limits for web and API requests."
msgstr ""
msgid "Set milestone"
@@ -30947,15 +31399,18 @@ msgstr ""
msgid "Set new password"
msgstr ""
-msgid "Set notification email for abuse reports."
+msgid "Set parent epic to an epic"
msgstr ""
-msgid "Set parent epic to an epic"
+msgid "Set per-user rate limits for imports and exports of projects and groups."
msgstr ""
msgid "Set projects and maximum size limits, session duration, user options, and check feature availability for namespace plan."
msgstr ""
+msgid "Set rate limits for package registry API requests that supersede the general user and IP rate limits."
+msgstr ""
+
msgid "Set severity"
msgstr ""
@@ -30974,15 +31429,24 @@ msgstr ""
msgid "Set the default branch for this project. All merge requests and commits are made against this branch unless you specify a different one."
msgstr ""
+msgid "Set the default expiration time for job artifacts in all projects. Set to %{code_open}0%{code_close} to never expire artifacts by default. If no unit is written, it defaults to seconds. For example, these are all equivalent: %{code_open}3600%{code_close}, %{code_open}60 minutes%{code_close}, or %{code_open}one hour%{code_close}."
+msgstr ""
+
msgid "Set the due date to %{due_date}."
msgstr ""
msgid "Set the iteration to %{iteration_reference}."
msgstr ""
+msgid "Set the maximum session time for a web terminal."
+msgstr ""
+
msgid "Set the milestone to %{milestone_reference}."
msgstr ""
+msgid "Set the per-user rate limit for notes created by web or API requests."
+msgstr ""
+
msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
msgstr ""
@@ -31184,6 +31648,9 @@ msgstr ""
msgid "Show Pipeline IID"
msgstr ""
+msgid "Show all %{issuable_type}."
+msgstr ""
+
msgid "Show all activity"
msgstr ""
@@ -31235,15 +31702,9 @@ msgstr ""
msgid "Show list"
msgstr ""
-msgid "Show me advanced features"
-msgstr ""
-
msgid "Show me how to add a pipeline"
msgstr ""
-msgid "Show me the basics"
-msgstr ""
-
msgid "Show one file at a time"
msgstr ""
@@ -31288,15 +31749,15 @@ msgstr ""
msgid "Showing %{pageSize} of %{total} %{issuableType}"
msgstr ""
-msgid "Showing %{pageSize} of %{total} issues"
-msgstr ""
-
msgid "Showing all epics"
msgstr ""
msgid "Showing all issues"
msgstr ""
+msgid "Showing data for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
+msgstr ""
+
msgid "Showing data for workflow items created in this date range. Date range cannot exceed %{maxDateRange} days."
msgstr ""
@@ -31336,6 +31797,15 @@ msgstr ""
msgid "Sidebar|Weight"
msgstr ""
+msgid "Sidekiq job compression threshold (bytes)"
+msgstr ""
+
+msgid "Sidekiq job size limit (bytes)"
+msgstr ""
+
+msgid "Sidekiq job size limits"
+msgstr ""
+
msgid "Sign in"
msgstr ""
@@ -31456,6 +31926,9 @@ msgstr ""
msgid "Site profile not found for given parameters"
msgstr ""
+msgid "Sites"
+msgstr ""
+
msgid "Size"
msgstr ""
@@ -31486,19 +31959,22 @@ msgstr ""
msgid "SlackIntegration|Sends notifications about project events to Slack channels."
msgstr ""
-msgid "SlackService|2. Paste the %{strong_open}Token%{strong_close} into the field below"
+msgid "SlackService|1. %{slash_command_link_start}Add a slash command%{slash_command_link_end} in your Slack team using this information:"
msgstr ""
-msgid "SlackService|3. Select the %{strong_open}Active%{strong_close} checkbox, press %{strong_open}Save changes%{strong_close} and start using GitLab inside Slack!"
+msgid "SlackService|2. Paste the token from Slack in the %{strong_open}Token%{strong_close} field below."
msgstr ""
-msgid "SlackService|Fill in the word that works best for your team."
+msgid "SlackService|3. Select the %{strong_open}Active%{strong_close} checkbox, select %{strong_open}Save changes%{strong_close}, and start using slash commands in Slack!"
+msgstr ""
+
+msgid "SlackService|After setup, get a list of available Slack slash commands by entering"
msgstr ""
-msgid "SlackService|See list of available commands in Slack after setting up this service, by entering"
+msgid "SlackService|Fill in the word that works best for your team."
msgstr ""
-msgid "SlackService|This service allows users to perform common operations on this project by entering slash commands in Slack."
+msgid "SlackService|Perform common operations in this project by entering slash commands in Slack."
msgstr ""
msgid "Slice multiplier"
@@ -31564,7 +32040,7 @@ msgstr ""
msgid "Some child epics may be hidden due to applied filters"
msgstr ""
-msgid "Some common domains are not allowed. %{read_more_link}."
+msgid "Some common domains are not allowed. %{learn_more_link}."
msgstr ""
msgid "Some of the designs you tried uploading did not change:"
@@ -31648,9 +32124,6 @@ msgstr ""
msgid "Something went wrong while exporting requirements"
msgstr ""
-msgid "Something went wrong while fetching %{listType} list"
-msgstr ""
-
msgid "Something went wrong while fetching branches"
msgstr ""
@@ -31705,15 +32178,9 @@ msgstr ""
msgid "Something went wrong while merging this merge request. Please try again."
msgstr ""
-msgid "Something went wrong while moving issues."
-msgstr ""
-
msgid "Something went wrong while obtaining the Let's Encrypt certificate."
msgstr ""
-msgid "Something went wrong while performing the action."
-msgstr ""
-
msgid "Something went wrong while promoting the issue to an epic. Please try again."
msgstr ""
@@ -32041,7 +32508,10 @@ msgstr ""
msgid "SourcegraphPreferences|Uses a custom %{linkStart}Sourcegraph instance%{linkEnd}."
msgstr ""
-msgid "Spam Check API Key"
+msgid "Spam Check"
+msgstr ""
+
+msgid "Spam Check API key"
msgstr ""
msgid "Spam Logs"
@@ -32059,7 +32529,7 @@ msgstr ""
msgid "Specified URL cannot be used: \"%{reason}\""
msgstr ""
-msgid "Specify an e-mail address regex pattern to identify default internal users."
+msgid "Specify an email address regex pattern to identify default internal users."
msgstr ""
msgid "Speed up your pipelines with Needs relationships"
@@ -32314,7 +32784,7 @@ msgstr ""
msgid "StatusCheck|An error occurred fetching the status checks."
msgstr ""
-msgid "StatusCheck|Apply this status check to any branch or a specific protected branch."
+msgid "StatusCheck|Apply this status check to all branches or a specific protected branch."
msgstr ""
msgid "StatusCheck|Check for a status response in Merge Requests. Failures do not block merges. %{link_start}Learn more%{link_end}."
@@ -32653,6 +33123,9 @@ msgstr ""
msgid "Subscriptions"
msgstr ""
+msgid "Subscription|Your subscription for %{strong}%{namespace_name}%{strong_close} has expired and you are now on %{pricing_link_start}the GitLab Free tier%{pricing_link_end}. Don't worry, your data is safe. Get in touch with our support team (%{support_email}). They'll gladly help with your subscription renewal."
+msgstr ""
+
msgid "Subtracted"
msgstr ""
@@ -32881,6 +33354,9 @@ msgstr ""
msgid "SuperSonics|Plan"
msgstr ""
+msgid "SuperSonics|Please agree to the Subscription Agreement"
+msgstr ""
+
msgid "SuperSonics|Ready to get started? A GitLab plan is ideal for scaling organizations and for multi team usage."
msgstr ""
@@ -32911,6 +33387,9 @@ msgstr ""
msgid "SuperSonics|The activation code is not valid. Please make sure to copy it exactly from the Customers Portal or confirmation email. Learn more about %{linkStart}activating your subscription%{linkEnd}."
msgstr ""
+msgid "SuperSonics|The activation code should be a 24-character alphanumeric string"
+msgstr ""
+
msgid "SuperSonics|There is a connectivity issue."
msgstr ""
@@ -32953,9 +33432,15 @@ msgstr ""
msgid "SuperSonics|You do not have an active subscription"
msgstr ""
+msgid "SuperSonics|You have successfully added a license that activates on %{date}. Please see the subscription history table below for more details."
+msgstr ""
+
msgid "SuperSonics|You'll be charged for %{trueUpLinkStart}users over license%{trueUpLinkEnd} on a quarterly or annual basis, depending on the terms of your agreement."
msgstr ""
+msgid "SuperSonics|Your future dated license was successfully added"
+msgstr ""
+
msgid "SuperSonics|Your subscription"
msgstr ""
@@ -33208,7 +33693,7 @@ msgstr ""
msgid "Template to append to all Service Desk issues"
msgstr ""
-msgid "TemplateRepository|Select a repository to make its templates available to all projects. %{link_start}What should the repository contain?%{link_end} "
+msgid "TemplateRepository|Create common files more quickly, and standardize their format."
msgstr ""
msgid "Templates"
@@ -33422,7 +33907,7 @@ msgstr ""
msgid "TestCases|Search test cases"
msgstr ""
-msgid "TestCases|Something went wrong while adding test case to Todo."
+msgid "TestCases|Something went wrong while adding test case to a to-do item."
msgstr ""
msgid "TestCases|Something went wrong while creating a test case."
@@ -33434,7 +33919,7 @@ msgstr ""
msgid "TestCases|Something went wrong while fetching test cases list."
msgstr ""
-msgid "TestCases|Something went wrong while marking test case todo as done."
+msgid "TestCases|Something went wrong while marking test case to-do item as done."
msgstr ""
msgid "TestCases|Something went wrong while moving test case."
@@ -33554,7 +34039,7 @@ msgstr ""
msgid "Thanks for your purchase!"
msgstr ""
-msgid "That is ok, I do not want to renew"
+msgid "That's OK, I don't want to renew"
msgstr ""
msgid "That's it, well done!"
@@ -33579,7 +34064,7 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-msgid "The API key used by GitLab for accessing the Spam Check service endpoint"
+msgid "The API key used by GitLab for accessing the Spam Check service endpoint."
msgstr ""
msgid "The GitLab subscription service (customers.gitlab.com) is currently experiencing an outage. You can monitor the status and get updates at %{linkStart}status.gitlab.com%{linkEnd}."
@@ -33618,9 +34103,6 @@ msgstr ""
msgid "The URL to use for connecting to Elasticsearch. Use a comma-separated list to support clustering (e.g., \"http://localhost:9200, http://localhost:9201\")."
msgstr ""
-msgid "The Vulnerability Report shows the results of the last successful pipeline run on the default branch."
-msgstr ""
-
msgid "The X509 Certificate to use when mutual TLS is required to communicate with the external authorization service. If left blank, the server certificate is still validated when accessing over HTTPS."
msgstr ""
@@ -33678,9 +34160,6 @@ msgstr ""
msgid "The default branch for this project has been changed. Please update your bookmarks."
msgstr ""
-msgid "The default expiration time for job artifacts. 0 for unlimited. The default unit is in seconds, but you can use other units, for example %{code_open}4 mins 2 sec%{code_close}, %{code_open}2h42min%{code_close}."
-msgstr ""
-
msgid "The dependency list details information about the components used within your project."
msgstr ""
@@ -33874,9 +34353,6 @@ msgstr ""
msgid "The merge conflicts for this merge request have already been resolved. Please return to the merge request."
msgstr ""
-msgid "The merge request can now be merged."
-msgstr ""
-
msgid "The metric must be one of %{metrics}."
msgstr ""
@@ -34252,7 +34728,7 @@ msgstr ""
msgid "There was a problem updating the keep latest artifacts setting."
msgstr ""
-msgid "There was an error %{message} todo."
+msgid "There was an error %{message} to-do item."
msgstr ""
msgid "There was an error adding a To Do."
@@ -34291,6 +34767,9 @@ msgstr ""
msgid "There was an error fetching projects"
msgstr ""
+msgid "There was an error fetching search autocomplete suggestions"
+msgstr ""
+
msgid "There was an error fetching stage total counts"
msgstr ""
@@ -34615,6 +35094,9 @@ msgstr ""
msgid "This field is required."
msgstr ""
+msgid "This form is disabled in preview"
+msgstr ""
+
msgid "This group"
msgstr ""
@@ -34636,9 +35118,6 @@ msgstr ""
msgid "This group is linked to a subscription"
msgstr ""
-msgid "This group, including all subgroups, projects and git repositories, will be reachable from only the specified IP address ranges."
-msgstr ""
-
msgid "This group, its subgroups and projects has been scheduled for removal on %{date}."
msgstr ""
@@ -34918,9 +35397,6 @@ msgstr ""
msgid "This user cannot be unlocked manually from GitLab"
msgstr ""
-msgid "This user does not have a pending request"
-msgstr ""
-
msgid "This user has an unconfirmed email address (%{email}). You may force a confirmation."
msgstr ""
@@ -35029,9 +35505,6 @@ msgstr ""
msgid "ThreatMonitoring|Packet Activity"
msgstr ""
-msgid "ThreatMonitoring|Policies"
-msgstr ""
-
msgid "ThreatMonitoring|Requests"
msgstr ""
@@ -35083,6 +35556,12 @@ msgstr ""
msgid "ThreatMonitoring|View documentation"
msgstr ""
+msgid "Threshold in bytes at which to compress Sidekiq job arguments."
+msgstr ""
+
+msgid "Threshold in bytes at which to reject Sidekiq jobs. Set this to 0 to if you don't want to limit Sidekiq jobs."
+msgstr ""
+
msgid "Throughput"
msgstr ""
@@ -35092,6 +35571,9 @@ msgstr ""
msgid "Time"
msgstr ""
+msgid "Time (in hours) that users are allowed to skip forced configuration of two-factor authentication."
+msgstr ""
+
msgid "Time Spent"
msgstr ""
@@ -35158,7 +35640,7 @@ msgstr ""
msgid "TimeTrackingEstimated|Est"
msgstr ""
-msgid "TimeTracking|%{startTag}Spent: %{endTag}%{timeSpentHumanReadable}"
+msgid "TimeTracking|%{spentStart}Spent: %{spentEnd}"
msgstr ""
msgid "TimeTracking|Estimated:"
@@ -35376,6 +35858,9 @@ msgstr ""
msgid "To access this domain create a new DNS record"
msgstr ""
+msgid "To add a custom suffix, set up a Service Desk email address. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "To add an SSH key you need to %{generate_link_start}generate one%{link_end} or use an %{existing_link_start}existing key%{link_end}."
msgstr ""
@@ -35397,13 +35882,16 @@ msgstr ""
msgid "To connect an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To continue using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
+msgstr ""
+
msgid "To continue, you need to select the link in the confirmation email we sent to verify your email address. If you didn't get our email, select %{strongStart}Resend confirmation email.%{strongEnd}"
msgstr ""
msgid "To define internal users, first enable new users set to external"
msgstr ""
-msgid "To enable Registration Features, make sure \"Enable service ping\" is checked."
+msgid "To enable Registration Features, first enable Service Ping."
msgstr ""
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
@@ -35430,7 +35918,7 @@ msgstr ""
msgid "To get started, use the link below to confirm your account."
msgstr ""
-msgid "To help improve GitLab and its user experience, GitLab will periodically collect usage information."
+msgid "To help improve GitLab and its user experience, GitLab periodically collects usage information."
msgstr ""
msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
@@ -35463,7 +35951,7 @@ msgstr ""
msgid "To preserve performance only %{strong_open}%{display_size} of %{real_size}%{strong_close} files are displayed."
msgstr ""
-msgid "To protect this issue's confidentiality, %{forkLink} and set the fork's visibility to private."
+msgid "To protect this issue's confidentiality, %{linkStart}fork this project%{linkEnd} and set the fork's visibility to private."
msgstr ""
msgid "To protect this issue's confidentiality, a private fork of this project was selected."
@@ -35496,12 +35984,15 @@ msgstr ""
msgid "To set up SAML authentication for your group through an identity provider like Azure, Okta, Onelogin, Ping Identity, or your custom SAML 2.0 provider:"
msgstr ""
-msgid "To set up this service:"
+msgid "To set up this integration:"
msgstr ""
msgid "To specify the notification level per project of a group you belong to, you need to visit project page and change notification level there."
msgstr ""
+msgid "To start using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
+msgstr ""
+
msgid "To unsubscribe from this issue, please paste the following link into your browser:"
msgstr ""
@@ -36091,9 +36582,6 @@ msgstr ""
msgid "Unable to fetch branches list, please close the form and try again"
msgstr ""
-msgid "Unable to fetch unscanned projects"
-msgstr ""
-
msgid "Unable to fetch vulnerable projects"
msgstr ""
@@ -36148,6 +36636,15 @@ msgstr ""
msgid "Unable to update this issue at this time."
msgstr ""
+msgid "Unapprove a merge request"
+msgstr ""
+
+msgid "Unapprove the current merge request."
+msgstr ""
+
+msgid "Unapproved the current merge request."
+msgstr ""
+
msgid "Unarchive project"
msgstr ""
@@ -36160,16 +36657,13 @@ msgstr ""
msgid "Unassigned"
msgstr ""
-msgid "Unauthenticated API request rate limit"
-msgstr ""
-
-msgid "Unauthenticated rate limit period in seconds"
+msgid "Unauthenticated API rate limit period in seconds"
msgstr ""
-msgid "Unauthenticated request rate limit"
+msgid "Unauthenticated requests"
msgstr ""
-msgid "Unauthenticated requests"
+msgid "Unauthenticated web rate limit period in seconds"
msgstr ""
msgid "Undo"
@@ -36271,18 +36765,6 @@ msgstr ""
msgid "Unresolved"
msgstr ""
-msgid "UnscannedProjects|15 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|30 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|5 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|60 or more days"
-msgstr ""
-
msgid "Unschedule job"
msgstr ""
@@ -36502,6 +36984,9 @@ msgstr ""
msgid "UsageQuota|%{help_link_start}Shared runners%{help_link_end} are disabled, so there are no limits set on pipeline usage"
msgstr ""
+msgid "UsageQuota|%{linkTitle} help link"
+msgstr ""
+
msgid "UsageQuota|%{percentageLeft} of purchased storage is available"
msgstr ""
@@ -36511,6 +36996,9 @@ msgstr ""
msgid "UsageQuota|Artifacts is a sum of build and pipeline artifacts."
msgstr ""
+msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
+msgstr ""
+
msgid "UsageQuota|Buy additional minutes"
msgstr ""
@@ -36520,9 +37008,21 @@ msgstr ""
msgid "UsageQuota|CI minutes usage by project"
msgstr ""
+msgid "UsageQuota|Code packages and container images."
+msgstr ""
+
msgid "UsageQuota|Current period usage"
msgstr ""
+msgid "UsageQuota|File attachments and smaller design graphics."
+msgstr ""
+
+msgid "UsageQuota|Git repository, managed by the Gitaly service."
+msgstr ""
+
+msgid "UsageQuota|Includes project registry, artifacts, packages, wiki, uploads and other items."
+msgstr ""
+
msgid "UsageQuota|Increase storage temporarily"
msgstr ""
@@ -36541,6 +37041,9 @@ msgstr ""
msgid "UsageQuota|Packages"
msgstr ""
+msgid "UsageQuota|Pipeline artifacts and job artifacts, created with CI/CD."
+msgstr ""
+
msgid "UsageQuota|Pipelines"
msgstr ""
@@ -36559,6 +37062,9 @@ msgstr ""
msgid "UsageQuota|Seats"
msgstr ""
+msgid "UsageQuota|Shared bits of code and text."
+msgstr ""
+
msgid "UsageQuota|Snippets"
msgstr ""
@@ -36568,6 +37074,12 @@ msgstr ""
msgid "UsageQuota|Storage"
msgstr ""
+msgid "UsageQuota|Storage type"
+msgstr ""
+
+msgid "UsageQuota|There is a known issue with Artifact storage where the total could be incorrect for some projects. More details and progress are available in %{warningLinkStart}the epic%{warningLinkEnd}."
+msgstr ""
+
msgid "UsageQuota|This is the total amount of storage used across your projects within this namespace."
msgstr ""
@@ -36607,6 +37119,9 @@ msgstr ""
msgid "UsageQuota|Usage"
msgstr ""
+msgid "UsageQuota|Usage Breakdown"
+msgstr ""
+
msgid "UsageQuota|Usage Quotas"
msgstr ""
@@ -36631,6 +37146,9 @@ msgstr ""
msgid "UsageQuota|Wiki"
msgstr ""
+msgid "UsageQuota|Wiki content."
+msgstr ""
+
msgid "UsageQuota|Wikis"
msgstr ""
@@ -36847,7 +37365,10 @@ msgstr ""
msgid "User Settings"
msgstr ""
-msgid "User and IP Rate Limits"
+msgid "User and IP rate limits"
+msgstr ""
+
+msgid "User does not have a pending request"
msgstr ""
msgid "User identity was successfully created."
@@ -37144,6 +37665,9 @@ msgstr ""
msgid "Users can launch a development environment from a GitLab browser tab when the %{linkStart}Gitpod%{linkEnd} integration is enabled."
msgstr ""
+msgid "Users can reactivate their account by signing in."
+msgstr ""
+
msgid "Users can render diagrams in AsciiDoc, Markdown, reStructuredText, and Textile documents using Kroki."
msgstr ""
@@ -37159,6 +37683,9 @@ msgstr ""
msgid "Users requesting access to"
msgstr ""
+msgid "Users to exclude from the rate limit"
+msgstr ""
+
msgid "Users were successfully added."
msgstr ""
@@ -37180,6 +37707,9 @@ msgstr ""
msgid "UsersSelect|Unassigned"
msgstr ""
+msgid "Uses GitLab as a lightweight alternative to Sentry."
+msgstr ""
+
msgid "Using %{code_start}::%{code_end} denotes a %{link_start}scoped label set%{link_end}"
msgstr ""
@@ -37210,10 +37740,7 @@ msgstr ""
msgid "Value Stream Analytics can help you determine your team’s velocity"
msgstr ""
-msgid "Value Stream Analytics gives an overview of how much time it takes to go from idea to production in your project."
-msgstr ""
-
-msgid "Value may contain a variable reference"
+msgid "Value might contain a variable reference"
msgstr ""
msgid "Value stream"
@@ -37279,10 +37806,10 @@ msgstr ""
msgid "ValueStream|The Default Value Stream cannot be deleted"
msgstr ""
-msgid "Variable"
+msgid "Values that contain the %{codeStart}$%{codeEnd} character can be considered a variable reference and expanded. %{docsLinkStart}Learn more.%{docsLinkEnd}"
msgstr ""
-msgid "Variable references indicated by %{codeStart}$%{codeEnd} may be expanded. If this is not what you want, consider %{docsLinkStart}using a workaround to prevent expansion%{docsLinkEnd}."
+msgid "Variable"
msgstr ""
msgid "Variable will be masked in job logs."
@@ -37693,6 +38220,9 @@ msgstr ""
msgid "Vulnerability|Evidence"
msgstr ""
+msgid "Vulnerability|False positive detected"
+msgstr ""
+
msgid "Vulnerability|File"
msgstr ""
@@ -37735,6 +38265,9 @@ msgstr ""
msgid "Vulnerability|Status"
msgstr ""
+msgid "Vulnerability|The scanner determined this vulnerability to be a false positive. Verify the evaluation before changing its status. %{linkStart}Learn more about false positive detection.%{linkEnd}"
+msgstr ""
+
msgid "Vulnerability|The unmodified response is the original response that had no mutations done to the request"
msgstr ""
@@ -38059,9 +38592,6 @@ msgstr ""
msgid "Welcome to GitLab,%{br_tag}%{name}!"
msgstr ""
-msgid "Welcome to the guided GitLab tour"
-msgstr ""
-
msgid "Welcome, %{name}!"
msgstr ""
@@ -38080,9 +38610,6 @@ msgstr ""
msgid "What are you searching for?"
msgstr ""
-msgid "What describes you best?"
-msgstr ""
-
msgid "What does this command do?"
msgstr ""
@@ -38104,13 +38631,13 @@ msgstr ""
msgid "What is your job title? (optional)"
msgstr ""
-msgid "What will you use this group for?"
+msgid "What templates can I create?"
msgstr ""
-msgid "What's new"
+msgid "What will you use this group for?"
msgstr ""
-msgid "What’s your experience level?"
+msgid "What's new"
msgstr ""
msgid "When a deployment job is successful, skip older deployment jobs that are still pending."
@@ -38122,6 +38649,9 @@ msgstr ""
msgid "When an event in GitLab triggers a webhook, you can use the request details to figure out if something went wrong."
msgstr ""
+msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+msgstr ""
+
msgid "When inactive, an external authentication provider must be used."
msgstr ""
@@ -38147,6 +38677,9 @@ msgstr ""
msgid "When:"
msgstr ""
+msgid "Which API requests are affected?"
+msgstr ""
+
msgid "While it's rare to have no vulnerabilities, it can happen. In any event, we ask that you please double check your settings to make sure you've set up your dashboard correctly."
msgstr ""
@@ -38426,6 +38959,9 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|Work Items"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -38501,6 +39037,9 @@ msgstr ""
msgid "You are already a member of this %{member_source}."
msgstr ""
+msgid "You are already impersonating another user"
+msgstr ""
+
msgid "You are an admin, which means granting access to %{client_name} will allow them to interact with GitLab as an admin as well. Proceed with caution."
msgstr ""
@@ -38603,6 +39142,9 @@ msgstr ""
msgid "You can also use project access tokens with Git to authenticate over HTTP(S). %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "You can always change your URL later"
+msgstr ""
+
msgid "You can always edit this later"
msgstr ""
@@ -38759,10 +39301,10 @@ msgstr ""
msgid "You can’t %{tag_start}edit%{tag_end} files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
-msgid "You could not create a new trigger."
+msgid "You can’t edit files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
-msgid "You didn't renew your subscription for %{strong}%{namespace_name}%{strong_close} so it was downgraded to the free plan."
+msgid "You could not create a new trigger."
msgstr ""
msgid "You do not have any subscriptions yet"
@@ -38930,6 +39472,12 @@ msgstr ""
msgid "You must provide your current password in order to change it."
msgstr ""
+msgid "You must sign in to search for specific projects."
+msgstr ""
+
+msgid "You must sign in to search for specific terms."
+msgstr ""
+
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
@@ -38957,6 +39505,9 @@ msgstr ""
msgid "You need to upload a GitLab project export archive (ending in .gz)."
msgstr ""
+msgid "You need to verify your primary email first before enabling Two-Factor Authentication."
+msgstr ""
+
msgid "You successfully declined the invitation"
msgstr ""
@@ -39065,10 +39616,10 @@ msgstr ""
msgid "Your %{host} account was signed in to from a new location"
msgstr ""
-msgid "Your %{strong}%{plan_name}%{strong_close} subscription for %{strong}%{namespace_name}%{strong_close} will expire on %{strong}%{expires_on}%{strong_close}."
+msgid "Your %{strong}%{plan_name}%{strong_close} subscription expires on %{strong}%{expires_on}%{strong_close}. After that date, you cannot create issues or merge requests, or use many other features."
msgstr ""
-msgid "Your %{strong}%{plan_name}%{strong_close} subscription will expire on %{strong}%{expires_on}%{strong_close}. After that, you will not be able to create issues or merge requests as well as many other features."
+msgid "Your %{strong}%{plan_name}%{strong_close} subscription for %{strong}%{namespace_name}%{strong_close} will expire on %{strong}%{expires_on}%{strong_close}."
msgstr ""
msgid "Your CI/CD configuration syntax is invalid. View Lint tab for more details."
@@ -39092,7 +39643,7 @@ msgstr ""
msgid "Your GPG keys (%{count})"
msgstr ""
-msgid "Your GitLab account has been locked due to an excessive amount of unsuccessful sign in attempts. Your account will automatically unlock in %{duration} or you may click the link below to unlock now."
+msgid "Your GitLab account has been locked due to an excessive number of unsuccessful sign in attempts. You can wait for your account to automatically unlock in %{duration} or you can click the link below to unlock now."
msgstr ""
msgid "Your GitLab account request has been approved!"
@@ -39203,6 +39754,9 @@ msgstr ""
msgid "Your commit email is used for web based operations, such as edits and merges."
msgstr ""
+msgid "Your current password is required to register a two-factor authenticator app."
+msgstr ""
+
msgid "Your dashboard has been copied. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
@@ -39302,6 +39856,9 @@ msgstr ""
msgid "Your project limit is %{limit} projects! Please contact your administrator to increase it"
msgstr ""
+msgid "Your project will be created at:"
+msgstr ""
+
msgid "Your projects"
msgstr ""
@@ -39341,11 +39898,12 @@ msgstr ""
msgid "Your subscription expired!"
msgstr ""
-msgid "Your subscription has been downgraded."
-msgstr ""
-
-msgid "Your subscription will expire in %{remaining_days}."
-msgstr ""
+msgid "Your subscription will expire in %{remaining_days} day."
+msgid_plural "Your subscription will expire in %{remaining_days} days."
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
msgid "Your username is %{username}."
msgstr ""
@@ -39556,6 +40114,9 @@ msgstr ""
msgid "cannot merge"
msgstr ""
+msgid "cannot not be used for user namespace"
+msgstr ""
+
msgid "ciReport|%{degradedNum} degraded"
msgstr ""
@@ -39881,6 +40442,9 @@ msgstr ""
msgid "created %{timeAgo}"
msgstr ""
+msgid "created %{timeAgo} by %{author}"
+msgstr ""
+
msgid "created by"
msgstr ""
@@ -39927,9 +40491,6 @@ msgstr ""
msgid "does not have a supported extension. Only %{extension_list} are supported"
msgstr ""
-msgid "domain is not authorized for sign-up."
-msgstr ""
-
msgid "download it"
msgstr ""
@@ -39949,20 +40510,13 @@ msgstr ""
msgid "email '%{email}' is not a verified email."
msgstr ""
-msgid "email does not match the allowed domain of %{email_domains}"
-msgid_plural "email does not match the allowed domains: %{email_domains}"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
-
msgid "enabled"
msgstr ""
msgid "encrypted: needs to be a :required, :optional or :migrating!"
msgstr ""
-msgid "ending with MIME type format is not allowed."
+msgid "ending with a reserved file extension is not allowed."
msgstr ""
msgid "entries cannot be larger than 255 characters"
@@ -39986,6 +40540,9 @@ msgstr ""
msgid "estimateCommand|%{slash_command} overwrites the total estimated time."
msgstr ""
+msgid "example.com"
+msgstr ""
+
msgid "exceeds the limit of %{bytes} bytes"
msgstr ""
@@ -40038,9 +40595,6 @@ msgstr ""
msgid "fork"
msgstr ""
-msgid "fork this project"
-msgstr ""
-
msgid "from"
msgstr ""
@@ -40051,6 +40605,9 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "frontmatter"
+msgstr ""
+
msgid "group"
msgstr ""
@@ -40078,6 +40635,9 @@ msgstr ""
msgid "has been completed."
msgstr ""
+msgid "has too deep level of nesting"
+msgstr ""
+
msgid "help"
msgstr ""
@@ -40111,9 +40671,21 @@ msgstr ""
msgid "in"
msgstr ""
+msgid "in Infrastructure :: Kubernetes clusters"
+msgstr ""
+
+msgid "in all GitLab"
+msgstr ""
+
+msgid "in group"
+msgstr ""
+
msgid "in group %{link_to_group}"
msgstr ""
+msgid "in project"
+msgstr ""
+
msgid "in project %{link_to_project}"
msgstr ""
@@ -40157,16 +40729,19 @@ msgstr ""
msgid "is not a valid X509 certificate."
msgstr ""
-msgid "is not allowed since the group is not top-level group."
+msgid "is not allowed for sign-up."
msgstr ""
-msgid "is not allowed. Try again with a different email address, or contact your GitLab admin."
+msgid "is not allowed for this group."
msgstr ""
-msgid "is not allowed. We do not currently support project-level iterations"
+msgid "is not allowed for this project."
msgstr ""
-msgid "is not from an allowed domain."
+msgid "is not allowed since the group is not top-level group."
+msgstr ""
+
+msgid "is not allowed. We do not currently support project-level iterations"
msgstr ""
msgid "is not in the group enforcing Group Managed Account"
@@ -40259,6 +40834,9 @@ msgstr ""
msgid "log in"
msgstr ""
+msgid "managed"
+msgstr ""
+
msgid "manual"
msgstr ""
@@ -40308,6 +40886,9 @@ msgstr ""
msgid "mrWidget| Please restore it or use a different %{missingBranchName} branch"
msgstr ""
+msgid "mrWidget|%{linkStart}Set up now%{linkEnd} to analyze your source code for known security vulnerabilities."
+msgstr ""
+
msgid "mrWidget|%{mergeError}."
msgstr ""
@@ -40390,6 +40971,9 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "mrWidget|Create issue to resolve all threads"
+msgstr ""
+
msgid "mrWidget|Delete source branch"
msgstr ""
@@ -40399,12 +40983,18 @@ msgstr ""
msgid "mrWidget|Did not close"
msgstr ""
+msgid "mrWidget|Dismiss"
+msgstr ""
+
msgid "mrWidget|Email patches"
msgstr ""
msgid "mrWidget|Failed to load deployment statistics"
msgstr ""
+msgid "mrWidget|Hide %{widget} details"
+msgstr ""
+
msgid "mrWidget|If the %{missingBranchName} branch exists in your local repository, you can merge this merge request manually using the command line"
msgstr ""
@@ -40502,9 +41092,6 @@ msgstr ""
msgid "mrWidget|Request to merge"
msgstr ""
-msgid "mrWidget|Resolve all threads in new issue"
-msgstr ""
-
msgid "mrWidget|Resolve conflicts"
msgstr ""
@@ -40520,6 +41107,9 @@ msgstr ""
msgid "mrWidget|Revoke approval"
msgstr ""
+msgid "mrWidget|SAST and Secret Detection is not enabled."
+msgstr ""
+
msgid "mrWidget|Set by %{merge_author} to be added to the merge train when the pipeline succeeds"
msgstr ""
@@ -40529,6 +41119,9 @@ msgstr ""
msgid "mrWidget|Set by %{merge_author} to start a merge train when the pipeline succeeds"
msgstr ""
+msgid "mrWidget|Show %{widget} details"
+msgstr ""
+
msgid "mrWidget|The changes were merged into"
msgstr ""
@@ -40541,6 +41134,9 @@ msgstr ""
msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure, or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
msgstr ""
+msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure."
+msgstr ""
+
msgid "mrWidget|The source branch has been deleted"
msgstr ""
@@ -40583,6 +41179,9 @@ msgstr ""
msgid "mrWidget|You can merge after removing denied licenses"
msgstr ""
+msgid "mrWidget|You can only merge once this merge request is approved."
+msgstr ""
+
msgid "mrWidget|Your password"
msgstr ""
@@ -40619,6 +41218,9 @@ msgstr ""
msgid "must be less than the limit of %{tag_limit} tags"
msgstr ""
+msgid "must be set for a project namespace"
+msgstr ""
+
msgid "must be unique by status and elapsed time within a policy"
msgstr ""
@@ -40732,6 +41334,9 @@ msgstr ""
msgid "pipeline"
msgstr ""
+msgid "pipeline schedules documentation"
+msgstr ""
+
msgid "pod_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
msgstr ""
@@ -40785,16 +41390,25 @@ msgstr ""
msgid "project name"
msgstr ""
+msgid "project namespace cannot be the parent of another namespace"
+msgstr ""
+
msgid "projects"
msgstr ""
msgid "quick actions"
msgstr ""
-msgid "reCAPTCHA Private Key"
+msgid "reCAPTCHA"
+msgstr ""
+
+msgid "reCAPTCHA helps prevent credential stuffing."
msgstr ""
-msgid "reCAPTCHA Site Key"
+msgid "reCAPTCHA private key"
+msgstr ""
+
+msgid "reCAPTCHA site key"
msgstr ""
msgid "recent activity"
@@ -41023,6 +41637,9 @@ msgstr ""
msgid "user avatar"
msgstr ""
+msgid "user namespace cannot be the parent of another namespace"
+msgstr ""
+
msgid "user preferences"
msgstr ""
@@ -41117,3 +41734,9 @@ msgstr ""
msgid "your settings"
msgstr ""
+msgid "{group}"
+msgstr ""
+
+msgid "{project}"
+msgstr ""
+
diff --git a/locale/hi_IN/gitlab.po b/locale/hi_IN/gitlab.po
index 489c9899942..68470d14033 100644
--- a/locale/hi_IN/gitlab.po
+++ b/locale/hi_IN/gitlab.po
@@ -14,10 +14,7 @@ msgstr ""
"X-Crowdin-Language: hi\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-09-01 22:31\n"
-
-msgid " %{name}, confirm your email address now! "
-msgstr ""
+"PO-Revision-Date: 2021-10-04 20:19\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -92,6 +89,16 @@ msgstr ""
msgid "#general, #development"
msgstr ""
+msgid "%d Alert"
+msgid_plural "%d Alerts"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d Alert:"
+msgid_plural "%d Alerts:"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d Approval"
msgid_plural "%d Approvals"
msgstr[0] ""
@@ -455,7 +462,10 @@ msgstr ""
msgid "%{code_open}Protected:%{code_close} Only exposed to protected branches or tags."
msgstr ""
-msgid "%{commit_author_link} authored %{commit_timeago}"
+msgid "%{commit_author_link} authored %{commit_authored_timeago}"
+msgstr ""
+
+msgid "%{commit_author_link} authored %{commit_authored_timeago} and %{commit_committer_avatar} %{commit_committer_link} committed %{commit_committer_timeago}"
msgstr ""
msgid "%{completedCount} completed weight"
@@ -549,6 +559,15 @@ msgstr ""
msgid "%{doc_link_start}Advanced search%{doc_link_end} is enabled."
msgstr ""
+msgid "%{docs_link_start}Learn about visibility levels.%{docs_link_end}"
+msgstr ""
+
+msgid "%{docs_link_start}What is Large File Storage?%{docs_link_end}"
+msgstr ""
+
+msgid "%{docs_link_start}What is two-factor authentication?%{docs_link_end}"
+msgstr ""
+
msgid "%{due_date} (Past due)"
msgstr ""
@@ -621,9 +640,6 @@ msgstr ""
msgid "%{issueType} actions"
msgstr ""
-msgid "%{issuesCount} issues with a limit of %{maxIssueCount}"
-msgstr ""
-
msgid "%{issuesSize} with a limit of %{maxIssueCount}"
msgstr ""
@@ -681,6 +697,12 @@ msgstr ""
msgid "%{label_for_message} unavailable"
msgstr ""
+msgid "%{learn_more_link}."
+msgstr ""
+
+msgid "%{lessThan} 1 hour"
+msgstr ""
+
msgid "%{lets_encrypt_link_start}Let's Encrypt%{lets_encrypt_link_end} is a free, automated, and open certificate authority (CA) that issues digital certificates to enable HTTPS (SSL/TLS) for sites."
msgstr ""
@@ -693,15 +715,15 @@ msgstr ""
msgid "%{link_start}Learn more%{link_end} about roles."
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
-msgstr ""
-
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
msgstr ""
msgid "%{link_start}Start the title with %{draft_snippet}%{link_end} to prevent a merge request that is a work in progress from being merged before it's ready."
msgstr ""
+msgid "%{link_start}What information does GitLab Inc. collect?%{link_end}"
+msgstr ""
+
msgid "%{listToShow}, and %{awardsListLength} more"
msgstr ""
@@ -854,7 +876,7 @@ msgid_plural "%{securityScanner} results are not available because a pipeline ha
msgstr[0] ""
msgstr[1] ""
-msgid "%{service_ping_link_start}Learn more%{service_ping_link_end} about what information is shared with GitLab Inc."
+msgid "%{service_ping_link_start}What information is shared with GitLab Inc.?%{service_ping_link_end}"
msgstr ""
msgid "%{size} %{unit}"
@@ -890,6 +912,9 @@ msgstr ""
msgid "%{state} epics"
msgstr ""
+msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
+msgstr ""
+
msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
msgstr ""
@@ -949,11 +974,6 @@ msgstr ""
msgid "%{template_project_id} is unknown or invalid"
msgstr ""
-msgid "%{text} %{files}"
-msgid_plural "%{text} %{files} files"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%{text} is available"
msgstr ""
@@ -1038,9 +1058,6 @@ msgstr ""
msgid "%{wildcards_link_start}Wildcards%{wildcards_link_end} such as %{code_tag_start}v*%{code_tag_end} or %{code_tag_start}*-release%{code_tag_end} are supported."
msgstr ""
-msgid "&lt; 1 hour"
-msgstr ""
-
msgid "'%{data}' at %{location} does not match format: %{format}"
msgstr ""
@@ -1124,9 +1141,6 @@ msgstr ""
msgid "(we need your current password to confirm your changes)"
msgstr ""
-msgid "* * * * *"
-msgstr ""
-
msgid "+ %{amount} more"
msgstr ""
@@ -1193,10 +1207,10 @@ msgstr ""
msgid "."
msgstr ""
-msgid "0 bytes"
+msgid "/"
msgstr ""
-msgid "0 for unlimited, only effective with remote storage enabled."
+msgid "0 bytes"
msgstr ""
msgid "0t1DgySidms"
@@ -1326,6 +1340,9 @@ msgstr ""
msgid "1000+"
msgstr ""
+msgid "192.168.0.0/24"
+msgstr ""
+
msgid "1st contribution!"
msgstr ""
@@ -1479,9 +1496,6 @@ msgstr ""
msgid "A plain HTML site that uses Netlify for CI/CD instead of GitLab, but still with all the other great GitLab features"
msgstr ""
-msgid "A plain-text response to show to clients that hit the rate limit."
-msgstr ""
-
msgid "A platform value can be web, mob or app."
msgstr ""
@@ -1563,7 +1577,7 @@ msgstr ""
msgid "APIFuzzing|Configure HTTP basic authentication values. Other authentication methods are supported. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
+msgid "APIFuzzing|Customize your project's API fuzzing configuration options and copy the code snippet to your .gitlab-ci.yml file to apply any changes. Note that this tool does not reflect or update your .gitlab-ci.yml file automatically. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
msgstr ""
msgid "APIFuzzing|Enable authentication"
@@ -1626,9 +1640,6 @@ msgstr ""
msgid "APIFuzzing|To prevent a security leak, authentication info must be added as a %{ciVariablesLinkStart}CI variable%{ciVariablesLinkEnd}. As a user with maintainer access rights, you can manage CI variables in the %{ciSettingsLinkStart}Settings%{ciSettingsLinkEnd} area."
msgstr ""
-msgid "APIFuzzing|Use this tool to generate API fuzzing configuration YAML to copy into your .gitlab-ci.yml file. This tool does not reflect or update your .gitlab-ci.yml file automatically."
-msgstr ""
-
msgid "APIFuzzing|Username for basic authentication"
msgstr ""
@@ -1680,9 +1691,6 @@ msgstr ""
msgid "Abuse reports notification email"
msgstr ""
-msgid "Abuse reports will be sent to this address if it is set. Abuse reports are always available in the admin area."
-msgstr ""
-
msgid "Accept invitation"
msgstr ""
@@ -1719,12 +1727,18 @@ msgstr ""
msgid "Access granted"
msgstr ""
+msgid "Access key ID"
+msgstr ""
+
msgid "Access requests"
msgstr ""
msgid "Access to '%{classification_label}' not allowed"
msgstr ""
+msgid "Access tokens expire after 2 hours. A refresh token may be used at any time to generate a new access token. Non-expiring access tokens are deprecated. Clear this setting to enable backward compatibility."
+msgstr ""
+
msgid "AccessDropdown|Deploy Keys"
msgstr ""
@@ -2037,6 +2051,9 @@ msgstr ""
msgid "Add new directory"
msgstr ""
+msgid "Add new service account"
+msgstr ""
+
msgid "Add or remove previously merged commits"
msgstr ""
@@ -2274,6 +2291,9 @@ msgstr ""
msgid "AdminArea|Features"
msgstr ""
+msgid "AdminArea|Get security updates from GitLab and stay up to date"
+msgstr ""
+
msgid "AdminArea|Groups"
msgstr ""
@@ -2313,6 +2333,12 @@ msgstr ""
msgid "AdminArea|Reporter"
msgstr ""
+msgid "AdminArea|Sign up for the GitLab Security Newsletter to get notified for security updates."
+msgstr ""
+
+msgid "AdminArea|Sign up for the GitLab newsletter"
+msgstr ""
+
msgid "AdminArea|Stop all jobs"
msgstr ""
@@ -2382,9 +2408,15 @@ msgstr ""
msgid "AdminSettings|Disable public access to Pages sites"
msgstr ""
+msgid "AdminSettings|Display a banner on merge requests in projects with no pipelines to initiate steps to add a .gitlab-ci.yml file."
+msgstr ""
+
msgid "AdminSettings|Domain verification is an essential security measure for public GitLab sites. Users are required to demonstrate they control a domain before it is enabled. %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "AdminSettings|Enable pipeline suggestion banner"
+msgstr ""
+
msgid "AdminSettings|Enable shared runners for new projects"
msgstr ""
@@ -2856,10 +2888,10 @@ msgstr ""
msgid "Admin|Quarterly reconciliation will occur on %{qrtlyDate}"
msgstr ""
-msgid "Admin|The number of max seats used for your namespace is currently exceeding the number of seats in your subscription. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgid "Admin|The number of max seats in your namespace exceeds the number of seats in your subscription. On %{qrtlyDate}, quarterly reconciliation occurs and you are automatically billed a prorated amount for the overage. No action is needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice. For more information about the timing of the invoicing process, view the documentation."
msgstr ""
-msgid "Admin|The number of maximum users for your instance is currently exceeding the number of users in license. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgid "Admin|The number of max users in your instance exceeds the number of users in your license. On %{qrtlyDate}, quarterly reconciliation occurs and you are automatically billed a prorated amount for the overage. No action is needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice. For more information about the timing of the invoicing process, view the documentation."
msgstr ""
msgid "Admin|View pending user approvals"
@@ -2880,9 +2912,6 @@ msgstr ""
msgid "Advanced export options"
msgstr ""
-msgid "Advanced permissions, Large File Storage and Two-Factor authentication settings."
-msgstr ""
-
msgid "After a successful password update you will be redirected to login screen."
msgstr ""
@@ -2901,13 +2930,14 @@ msgstr ""
msgid "After you've reviewed these contribution guidelines, you'll be all set to"
msgstr ""
+msgid "Akismet"
+msgstr ""
+
msgid "Akismet API Key"
msgstr ""
-msgid "Alert"
-msgid_plural "Alerts"
-msgstr[0] ""
-msgstr[1] ""
+msgid "Akismet helps prevent the creation of spam issues in public projects."
+msgstr ""
msgid "AlertManagement|Acknowledged"
msgstr ""
@@ -3263,6 +3293,9 @@ msgstr ""
msgid "All (default)"
msgstr ""
+msgid "All GitLab"
+msgstr ""
+
msgid "All Members"
msgstr ""
@@ -3377,6 +3410,9 @@ msgstr ""
msgid "Allow this secondary node to replicate content on Object Storage"
msgstr ""
+msgid "Allow use of licensed EE features"
+msgstr ""
+
msgid "Allow users to dismiss the broadcast message"
msgstr ""
@@ -3452,9 +3488,6 @@ msgstr ""
msgid "Amazon authentication is not %{link_start}correctly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
-msgid "Amount of time (in hours) that users are allowed to skip forced configuration of two-factor authentication"
-msgstr ""
-
msgid "An %{link_start}alert%{link_end} with the same fingerprint is already open. To change the status of this alert, resolve the linked alert."
msgstr ""
@@ -3515,12 +3548,6 @@ msgstr ""
msgid "An error occurred when removing the label."
msgstr ""
-msgid "An error occurred when toggling the notification subscription"
-msgstr ""
-
-msgid "An error occurred when updating the issue weight"
-msgstr ""
-
msgid "An error occurred when updating the title"
msgstr ""
@@ -3569,6 +3596,9 @@ msgstr ""
msgid "An error occurred while enabling Service Desk."
msgstr ""
+msgid "An error occurred while fetching Markdown preview"
+msgstr ""
+
msgid "An error occurred while fetching ancestors"
msgstr ""
@@ -3599,9 +3629,6 @@ msgstr ""
msgid "An error occurred while fetching label colors."
msgstr ""
-msgid "An error occurred while fetching markdown preview"
-msgstr ""
-
msgid "An error occurred while fetching participants"
msgstr ""
@@ -3617,9 +3644,6 @@ msgstr ""
msgid "An error occurred while fetching reference"
msgstr ""
-msgid "An error occurred while fetching sidebar data"
-msgstr ""
-
msgid "An error occurred while fetching tags. Retry the search."
msgstr ""
@@ -3695,6 +3719,9 @@ msgstr ""
msgid "An error occurred while loading merge requests."
msgstr ""
+msgid "An error occurred while loading projects."
+msgstr ""
+
msgid "An error occurred while loading the Needs tab."
msgstr ""
@@ -3929,12 +3956,6 @@ msgstr ""
msgid "Any Milestone"
msgstr ""
-msgid "Any branch"
-msgstr ""
-
-msgid "Any eligible user"
-msgstr ""
-
msgid "Any encrypted tokens"
msgstr ""
@@ -3953,6 +3974,9 @@ msgstr ""
msgid "Any namespace"
msgstr ""
+msgid "App Engine description and apps that are suitable for this deployment target"
+msgstr ""
+
msgid "App ID"
msgstr ""
@@ -4101,6 +4125,11 @@ msgstr ""
msgid "Apply"
msgstr ""
+msgid "Apply %d suggestion"
+msgid_plural "Apply %d suggestions"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Apply a label"
msgstr ""
@@ -4110,13 +4139,10 @@ msgstr ""
msgid "Apply suggestion"
msgstr ""
-msgid "Apply suggestions"
-msgstr ""
-
msgid "Apply template"
msgstr ""
-msgid "Apply this approval rule to any branch or a specific protected branch."
+msgid "Apply this approval rule to all branches or a specific protected branch."
msgstr ""
msgid "Applying"
@@ -4259,9 +4285,6 @@ msgstr ""
msgid "ApprovalSettings|Prevent editing approval rules in projects and merge requests."
msgstr ""
-msgid "ApprovalSettings|Prevent editing approval rules in projects and merge requests. "
-msgstr ""
-
msgid "ApprovalSettings|Remove all approvals when commits are added to the source branch."
msgstr ""
@@ -4277,6 +4300,9 @@ msgstr ""
msgid "ApprovalSettings|This setting is configured at the instance level and can only be changed by an administrator."
msgstr ""
+msgid "ApprovalSettings|This setting is configured in %{groupName} and can only be changed by an administrator or group owner."
+msgstr ""
+
msgid "ApprovalStatusTooltip|Adheres to separation of duties"
msgstr ""
@@ -4763,9 +4789,6 @@ msgstr ""
msgid "Authenticated API rate limit period in seconds"
msgstr ""
-msgid "Authenticated API request rate limit"
-msgstr ""
-
msgid "Authenticated API requests"
msgstr ""
@@ -4775,10 +4798,10 @@ msgstr ""
msgid "Authenticated Git LFS request rate limit"
msgstr ""
-msgid "Authenticated web rate limit period in seconds"
+msgid "Authenticated Git LFS requests"
msgstr ""
-msgid "Authenticated web request rate limit"
+msgid "Authenticated web rate limit period in seconds"
msgstr ""
msgid "Authenticated web requests"
@@ -5156,9 +5179,6 @@ msgstr ""
msgid "Below you will find all the groups that are public."
msgstr ""
-msgid "Beta"
-msgstr ""
-
msgid "Bi-weekly code coverage"
msgstr ""
@@ -5398,6 +5418,21 @@ msgstr ""
msgid "Board scope affects which issues are displayed for anyone who visits this board"
msgstr ""
+msgid "BoardNewEpic|Groups"
+msgstr ""
+
+msgid "BoardNewEpic|Loading groups"
+msgstr ""
+
+msgid "BoardNewEpic|No matching results"
+msgstr ""
+
+msgid "BoardNewEpic|Search groups"
+msgstr ""
+
+msgid "BoardNewEpic|Select a group"
+msgstr ""
+
msgid "BoardNewIssue|No matching results"
msgstr ""
@@ -5475,6 +5510,9 @@ msgstr ""
msgid "Boards|An error occurred while creating the list. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching child groups. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching group projects. Please try again."
msgstr ""
@@ -5807,6 +5845,9 @@ msgstr ""
msgid "Bulk update"
msgstr ""
+msgid "BulkImports|Re-import creates a new group. It does not sync with the existing group."
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -5816,6 +5857,9 @@ msgstr ""
msgid "BulkImport|From source group"
msgstr ""
+msgid "BulkImport|Group import history"
+msgstr ""
+
msgid "BulkImport|Import failed: Destination cannot be a subgroup of the source group. Change the destination and try again."
msgstr ""
@@ -5828,9 +5872,18 @@ msgstr ""
msgid "BulkImport|Importing the group failed"
msgstr ""
+msgid "BulkImport|Last imported to %{link}"
+msgstr ""
+
msgid "BulkImport|Name already exists."
msgstr ""
+msgid "BulkImport|New group"
+msgstr ""
+
+msgid "BulkImport|No history is available"
+msgstr ""
+
msgid "BulkImport|No parent"
msgstr ""
@@ -5843,6 +5896,9 @@ msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} matching filter \"%{filter}\" from %{link}"
msgstr ""
+msgid "BulkImport|Source group"
+msgstr ""
+
msgid "BulkImport|To new group"
msgstr ""
@@ -5852,6 +5908,9 @@ msgstr ""
msgid "BulkImport|You have no groups to import"
msgstr ""
+msgid "BulkImport|Your imported groups will appear here."
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -6094,6 +6153,9 @@ msgstr ""
msgid "Can be manually deployed to"
msgstr ""
+msgid "Can be overridden in each project."
+msgstr ""
+
msgid "Can create groups:"
msgstr ""
@@ -6196,6 +6258,9 @@ msgstr ""
msgid "Cancelling Preview"
msgstr ""
+msgid "Cannot assign a confidential epic to a non-confidential issue. Make the issue confidential and try again"
+msgstr ""
+
msgid "Cannot be assigned to other projects."
msgstr ""
@@ -6247,9 +6312,6 @@ msgstr ""
msgid "Cannot refer to a group %{timebox_type} by an internal id!"
msgstr ""
-msgid "Cannot set confidential epic for a non-confidential issue"
-msgstr ""
-
msgid "Cannot show preview. For previews on sketch files, they must have the file format introduced by Sketch version 43 and above."
msgstr ""
@@ -6487,15 +6549,15 @@ msgstr ""
msgid "Check out, review, and merge locally"
msgstr ""
-msgid "Check the %{docs_link_start}documentation%{docs_link_end}."
-msgstr ""
-
msgid "Check the current instance configuration "
msgstr ""
msgid "Check the elasticsearch.log file to debug why the migration was halted and make any changes before retrying the migration. When you fix the cause of the failure, click \"Retry migration\", and the migration will be scheduled to be retried in the background."
msgstr ""
+msgid "Check with your administrator."
+msgstr ""
+
msgid "Check your Docker images for known vulnerabilities."
msgstr ""
@@ -6526,6 +6588,9 @@ msgstr ""
msgid "Checkout"
msgstr ""
+msgid "Checkout|$%{selectedPlanPrice} per 10 GB storage per pack"
+msgstr ""
+
msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 minutes"
msgstr ""
@@ -6546,17 +6611,23 @@ msgstr ""
msgid "Checkout|%{name}'s GitLab subscription"
msgstr ""
-msgid "Checkout|%{selectedPlanText} plan"
+msgid "Checkout|%{name}'s storage subscription"
msgstr ""
-msgid "Checkout|%{startDate} - %{endDate}"
+msgid "Checkout|%{quantity} GB of storage"
msgstr ""
-msgid "Checkout|%{totalCiMinutes} CI minute"
-msgid_plural "Checkout|%{totalCiMinutes} CI minutes"
+msgid "Checkout|%{quantity} storage pack"
+msgid_plural "Checkout|%{quantity} storage packs"
msgstr[0] ""
msgstr[1] ""
+msgid "Checkout|%{selectedPlanText} plan"
+msgstr ""
+
+msgid "Checkout|%{startDate} - %{endDate}"
+msgstr ""
+
msgid "Checkout|%{totalCiMinutes} CI minutes"
msgstr ""
@@ -6632,6 +6703,9 @@ msgstr ""
msgid "Checkout|Failed to register credit card. Please try again."
msgstr ""
+msgid "Checkout|GB"
+msgstr ""
+
msgid "Checkout|GitLab group"
msgstr ""
@@ -6668,6 +6742,9 @@ msgstr ""
msgid "Checkout|State"
msgstr ""
+msgid "Checkout|Storage packs"
+msgstr ""
+
msgid "Checkout|Street address"
msgstr ""
@@ -6689,6 +6766,9 @@ msgstr ""
msgid "Checkout|Total minutes: %{quantity}"
msgstr ""
+msgid "Checkout|Total storage: %{quantity} GB"
+msgstr ""
+
msgid "Checkout|Users"
msgstr ""
@@ -6698,16 +6778,25 @@ msgstr ""
msgid "Checkout|Your organization"
msgstr ""
+msgid "Checkout|Your storage subscription has the same term as your main subscription, and the price is prorated accordingly."
+msgstr ""
+
msgid "Checkout|Your subscription will be applied to this group"
msgstr ""
msgid "Checkout|Zip code"
msgstr ""
+msgid "Checkout|a storage subscription"
+msgstr ""
+
msgid "Checkout|company or team"
msgstr ""
-msgid "Checkout|x 1,000 minutes per pack = %{strong}"
+msgid "Checkout|minutes"
+msgstr ""
+
+msgid "Checkout|x %{quantity} %{units} per pack ="
msgstr ""
msgid "Cherry-pick this commit"
@@ -7064,6 +7153,9 @@ msgstr ""
msgid "CloneIssue|Cannot clone issue to target project as it is pending deletion."
msgstr ""
+msgid "CloneIssue|Cannot clone issues of '%{issue_type}' type."
+msgstr ""
+
msgid "Cloned this issue to %{path_to_project}."
msgstr ""
@@ -7118,7 +7210,10 @@ msgstr ""
msgid "Closes this %{quick_action_target}."
msgstr ""
-msgid "Cloud licenses can not be removed."
+msgid "Cloud Functions description and apps that are suitable for this deployment target"
+msgstr ""
+
+msgid "Cloud Run description and apps that are suitable for this deployment target"
msgstr ""
msgid "Cluster"
@@ -7145,6 +7240,12 @@ msgstr ""
msgid "ClusterAgents|Access tokens"
msgstr ""
+msgid "ClusterAgents|Agent might not be connected to GitLab"
+msgstr ""
+
+msgid "ClusterAgents|Agent never connected to GitLab"
+msgstr ""
+
msgid "ClusterAgents|Alternative installation methods"
msgstr ""
@@ -7160,6 +7261,12 @@ msgstr ""
msgid "ClusterAgents|Configuration"
msgstr ""
+msgid "ClusterAgents|Connected"
+msgstr ""
+
+msgid "ClusterAgents|Connection status"
+msgstr ""
+
msgid "ClusterAgents|Copy token"
msgstr ""
@@ -7178,6 +7285,9 @@ msgstr ""
msgid "ClusterAgents|For alternative installation methods %{linkStart}go to the documentation%{linkEnd}."
msgstr ""
+msgid "ClusterAgents|For more troubleshooting information go to"
+msgstr ""
+
msgid "ClusterAgents|Go to the repository"
msgstr ""
@@ -7193,18 +7303,30 @@ msgstr ""
msgid "ClusterAgents|Integrate with the GitLab Agent"
msgstr ""
-msgid "ClusterAgents|Last used"
+msgid "ClusterAgents|Last connected %{timeAgo}."
+msgstr ""
+
+msgid "ClusterAgents|Last contact"
msgstr ""
msgid "ClusterAgents|Learn how to create an agent access token"
msgstr ""
+msgid "ClusterAgents|Make sure you are using a valid token."
+msgstr ""
+
msgid "ClusterAgents|Name"
msgstr ""
msgid "ClusterAgents|Never"
msgstr ""
+msgid "ClusterAgents|Never connected"
+msgstr ""
+
+msgid "ClusterAgents|Not connected"
+msgstr ""
+
msgid "ClusterAgents|Read more about getting started"
msgstr ""
@@ -7226,6 +7348,9 @@ msgstr ""
msgid "ClusterAgents|Select which Agent you want to install"
msgstr ""
+msgid "ClusterAgents|The Agent has not been connected in a long time. There might be a connectivity issue. Last contact was %{timeAgo}."
+msgstr ""
+
msgid "ClusterAgents|The GitLab Agent also requires %{linkStart}enabling the Agent Server%{linkEnd}"
msgstr ""
@@ -7253,9 +7378,6 @@ msgstr ""
msgid "ClusterAgents|You will need to create a token to connect to your agent"
msgstr ""
-msgid "ClusterAgent|This feature is only available for premium plans"
-msgstr ""
-
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -7445,9 +7567,6 @@ msgstr ""
msgid "ClusterIntegration|Create Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Create a provision role on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the account and external ID above. %{startMoreInfoLink}More information%{endLink}"
-msgstr ""
-
msgid "ClusterIntegration|Create cluster on"
msgstr ""
@@ -7880,7 +7999,7 @@ msgstr ""
msgid "ClusterIntegration|Subnets"
msgstr ""
-msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provisioned role, first create one on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the above account and external IDs. %{startMoreInfoLink}More information%{endLink}"
+msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provisioned role, first create one on %{awsLinkStart}Amazon Web Services %{awsLinkEnd} using the above account and external IDs. %{moreInfoStart}More information%{moreInfoEnd}"
msgstr ""
msgid "ClusterIntegration|The Kubernetes certificate used to authenticate to the cluster."
@@ -8114,6 +8233,9 @@ msgstr ""
msgid "Collapse replies"
msgstr ""
+msgid "Collapse settings section"
+msgstr ""
+
msgid "Collapse sidebar"
msgstr ""
@@ -8132,6 +8254,9 @@ msgstr ""
msgid "Comma-separated list of email addresses."
msgstr ""
+msgid "Comma-separated list of users allowed to exceed the rate limit."
+msgstr ""
+
msgid "Comma-separated, e.g. '1.1.1.1, 2.2.2.0/24'"
msgstr ""
@@ -8452,6 +8577,9 @@ msgstr ""
msgid "Configure %{repository_checks_link_start}repository checks%{link_end} and %{housekeeping_link_start}housekeeping%{link_end} on repositories."
msgstr ""
+msgid "Configure CAPTCHAs, IP address limits, and other anti-spam measures."
+msgstr ""
+
msgid "Configure Dependency Scanning in `.gitlab-ci.yml` using the GitLab managed template. You can [add variable overrides](https://docs.gitlab.com/ee/user/application_security/dependency_scanning/#customizing-the-dependency-scanning-settings) to customize Dependency Scanning settings."
msgstr ""
@@ -8488,16 +8616,13 @@ msgstr ""
msgid "Configure a %{codeStart}.gitlab-webide.yml%{codeEnd} file in the %{codeStart}.gitlab%{codeEnd} directory to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
msgstr ""
-msgid "Configure existing installation"
-msgstr ""
-
-msgid "Configure limit for notes created per minute by web and API requests."
+msgid "Configure advanced permissions, Large File Storage, and two-factor authentication settings."
msgstr ""
-msgid "Configure limits for Project/Group Import/Export."
+msgid "Configure approvals by authors and committers on all projects."
msgstr ""
-msgid "Configure limits for web and API requests."
+msgid "Configure existing installation"
msgstr ""
msgid "Configure paths to be protected by Rack Attack."
@@ -8512,10 +8637,13 @@ msgstr ""
msgid "Configure settings for Advanced Search with Elasticsearch."
msgstr ""
+msgid "Configure specific limits for Files API requests that supersede the general user and IP rate limits."
+msgstr ""
+
msgid "Configure specific limits for Git LFS requests that supersede the general user and IP rate limits."
msgstr ""
-msgid "Configure specific limits for Packages API requests that supersede the general user and IP rate limits."
+msgid "Configure specific limits for deprecated API requests that supersede the general user and IP rate limits."
msgstr ""
msgid "Configure the %{link} integration."
@@ -8527,6 +8655,9 @@ msgstr ""
msgid "Configure the way a user creates a new account."
msgstr ""
+msgid "Configure via Merge Request"
+msgstr ""
+
msgid "Configure which lists are shown for anyone who visits this board"
msgstr ""
@@ -8995,6 +9126,9 @@ msgstr ""
msgid "Content parsed with %{link}."
msgstr ""
+msgid "ContentEditor|Table of Contents"
+msgstr ""
+
msgid "ContentEditor|You have to provide a renderMarkdown function or a custom serializer"
msgstr ""
@@ -9181,6 +9315,9 @@ msgstr ""
msgid "Copy link to chart"
msgstr ""
+msgid "Copy prefix"
+msgstr ""
+
msgid "Copy reference"
msgstr ""
@@ -9211,6 +9348,9 @@ msgstr ""
msgid "Copy value"
msgstr ""
+msgid "Corpus Management"
+msgstr ""
+
msgid "Corpus Management|Are you sure you want to delete the corpus?"
msgstr ""
@@ -9439,6 +9579,9 @@ msgstr ""
msgid "Create commit"
msgstr ""
+msgid "Create common files more quickly, and standardize their format."
+msgstr ""
+
msgid "Create confidential merge request"
msgstr ""
@@ -9472,6 +9615,9 @@ msgstr ""
msgid "Create issue"
msgstr ""
+msgid "Create issue to resolve all threads"
+msgstr ""
+
msgid "Create iteration"
msgstr ""
@@ -9526,6 +9672,9 @@ msgstr ""
msgid "Create new..."
msgstr ""
+msgid "Create or import your first project"
+msgstr ""
+
msgid "Create project"
msgstr ""
@@ -9883,7 +10032,7 @@ msgstr ""
msgid "Custom notification events"
msgstr ""
-msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notificationLinkStart} notification emails%{notificationLinkEnd}."
+msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notificationLinkStart}notification emails%{notificationLinkEnd}."
msgstr ""
msgid "Custom project templates"
@@ -10082,10 +10231,10 @@ msgid_plural "CycleAnalytics|Showing %{subjectFilterText} and %{selectedLabelsCo
msgstr[0] ""
msgstr[1] ""
-msgid "CycleAnalytics|Showing data for group '%{groupName}' and %{selectedProjectCount} projects from %{startDate} to %{endDate}"
+msgid "CycleAnalytics|Showing data for group '%{groupName}' and %{selectedProjectCount} projects from %{createdAfter} to %{createdBefore}"
msgstr ""
-msgid "CycleAnalytics|Showing data for group '%{groupName}' from %{startDate} to %{endDate}"
+msgid "CycleAnalytics|Showing data for group '%{groupName}' from %{createdAfter} to %{createdBefore}"
msgstr ""
msgid "CycleAnalytics|Stages"
@@ -10319,6 +10468,9 @@ msgstr ""
msgid "DastProfiles|Manage profiles"
msgstr ""
+msgid "DastProfiles|Manage site profiles"
+msgstr ""
+
msgid "DastProfiles|Minimum = 0 (no timeout enabled), Maximum = 2880 minutes"
msgstr ""
@@ -10394,6 +10546,9 @@ msgstr ""
msgid "DastProfiles|Scanner name"
msgstr ""
+msgid "DastProfiles|Schedule"
+msgstr ""
+
msgid "DastProfiles|Select branch"
msgstr ""
@@ -10463,7 +10618,7 @@ msgstr ""
msgid "DastProfiles|Website"
msgstr ""
-msgid "DastProfiles|You can either choose a passive scan or validate the target site in your chosen site profile. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
+msgid "DastProfiles|You can either choose a passive scan or validate the target site from the site profile management page. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
msgstr ""
msgid "DastProfiles|You cannot run an active scan against an unvalidated site."
@@ -10636,7 +10791,7 @@ msgstr ""
msgid "Days to merge"
msgstr ""
-msgid "Deactivate dormant users after 90 days of inactivity. Users can return to active status by signing in to their account. While inactive, a user is not counted as an active user in the instance."
+msgid "Deactivate dormant users after 90 days of inactivity"
msgstr ""
msgid "Dear Administrator,"
@@ -10723,10 +10878,10 @@ msgstr ""
msgid "Define a custom pattern with cron syntax"
msgstr ""
-msgid "Define approval settings."
+msgid "Define approval rules."
msgstr ""
-msgid "Define approval settings. %{linkStart}Learn more.%{linkEnd}"
+msgid "Define approval rules. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "Define custom rules for what constitutes spam, independent of Akismet"
@@ -10735,7 +10890,7 @@ msgstr ""
msgid "Define environments in the deploy stage(s) in %{code_open}.gitlab-ci.yml%{code_close} to track deployments here."
msgstr ""
-msgid "Define how approval rules are applied as a merge request moves toward completion."
+msgid "Define how approval rules are applied to merge requests."
msgstr ""
msgid "Definition"
@@ -10750,6 +10905,12 @@ msgstr ""
msgid "DelayedJobs|Are you sure you want to run %{job_name} immediately? This job will run automatically after it's timer finishes."
msgstr ""
+msgid "DelayedJobs|Are you sure you want to run %{job_name} immediately? This job will run automatically after its timer finishes."
+msgstr ""
+
+msgid "DelayedJobs|Run the delayed job now?"
+msgstr ""
+
msgid "DelayedJobs|Start now"
msgstr ""
@@ -11026,6 +11187,12 @@ msgstr ""
msgid "Dependency proxy image prefix"
msgstr ""
+msgid "DependencyProxy|Create a local proxy for storing frequently used upstream images. %{docLinkStart}Learn more%{docLinkEnd} about dependency proxies."
+msgstr ""
+
+msgid "DependencyProxy|Dependency Proxy"
+msgstr ""
+
msgid "DependencyProxy|Toggle Dependency Proxy"
msgstr ""
@@ -11266,6 +11433,9 @@ msgstr ""
msgid "Deployments"
msgstr ""
+msgid "Deployments to Google Kubernetes Engine can be "
+msgstr ""
+
msgid "Deployments|%{deployments} environment impacted."
msgid_plural "Deployments|%{deployments} environments impacted."
msgstr[0] ""
@@ -11295,6 +11465,9 @@ msgstr ""
msgid "Deployment|success"
msgstr ""
+msgid "Deprecated API rate limits"
+msgstr ""
+
msgid "Deprioritize label"
msgstr ""
@@ -11697,6 +11870,16 @@ msgstr ""
msgid "DiffsCompareBaseBranch|(base)"
msgstr ""
+msgid "Diffs|%d addition"
+msgid_plural "Diffs|%d additions"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Diffs|%d deletion"
+msgid_plural "Diffs|%d deletions"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Diffs|No file name available"
msgstr ""
@@ -11706,9 +11889,17 @@ msgstr ""
msgid "Diffs|Show all unchanged lines"
msgstr ""
+msgid "Diffs|Showing %{dropdownStart}%{count} changed file%{dropdownEnd}"
+msgid_plural "Diffs|Showing %{dropdownStart}%{count} changed files%{dropdownEnd}"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Diffs|Something went wrong while fetching diff lines."
msgstr ""
+msgid "Diffs|with %{additions} and %{deletions}"
+msgstr ""
+
msgid "Direct member"
msgstr ""
@@ -11834,9 +12025,6 @@ msgid_plural "Dismiss %d selected vulnerabilities as"
msgstr[0] ""
msgstr[1] ""
-msgid "Dismiss Value Stream Analytics introduction box"
-msgstr ""
-
msgid "Dismiss merge request promotion"
msgstr ""
@@ -12158,6 +12346,9 @@ msgstr ""
msgid "Edit issues"
msgstr ""
+msgid "Edit merge requests"
+msgstr ""
+
msgid "Edit public deploy key"
msgstr ""
@@ -12233,6 +12424,9 @@ msgstr ""
msgid "Elastic|None. Select projects to index."
msgstr ""
+msgid "Eligible users"
+msgstr ""
+
msgid "Email"
msgstr ""
@@ -12362,6 +12556,9 @@ msgstr ""
msgid "Enable"
msgstr ""
+msgid "Enable Amazon EKS integration"
+msgstr ""
+
msgid "Enable Auto DevOps"
msgstr ""
@@ -12395,6 +12592,9 @@ msgstr ""
msgid "Enable SSL verification"
msgstr ""
+msgid "Enable Service Ping"
+msgstr ""
+
msgid "Enable Snowplow tracking"
msgstr ""
@@ -12425,6 +12625,9 @@ msgstr ""
msgid "Enable authenticated Git LFS request rate limit"
msgstr ""
+msgid "Enable authenticated web request rate limit"
+msgstr ""
+
msgid "Enable authentication"
msgstr ""
@@ -12485,7 +12688,7 @@ msgstr ""
msgid "Enable or disable the Pseudonymizer data collection."
msgstr ""
-msgid "Enable or disable version check and service ping."
+msgid "Enable or disable version check and Service Ping."
msgstr ""
msgid "Enable protected paths rate limit"
@@ -12497,18 +12700,12 @@ msgstr ""
msgid "Enable reCAPTCHA"
msgstr ""
-msgid "Enable reCAPTCHA for login"
-msgstr ""
-
-msgid "Enable reCAPTCHA, Invisible Captcha, Akismet and set IP limits. For reCAPTCHA, we currently only support %{recaptcha_v2_link_start}v2%{recaptcha_v2_link_end}"
+msgid "Enable reCAPTCHA for login."
msgstr ""
msgid "Enable repository checks"
msgstr ""
-msgid "Enable service ping"
-msgstr ""
-
msgid "Enable shared runners for all projects and subgroups in this group."
msgstr ""
@@ -12530,7 +12727,10 @@ msgstr ""
msgid "Enable unauthenticated API request rate limit"
msgstr ""
-msgid "Enable unauthenticated request rate limit"
+msgid "Enable unauthenticated web request rate limit"
+msgstr ""
+
+msgid "Enable user deactivation emails"
msgstr ""
msgid "Enable version check"
@@ -12566,9 +12766,6 @@ msgstr ""
msgid "Enabled sources for code import during project creation. OmniAuth must be configured for GitHub"
msgstr ""
-msgid "Enabling this will only make licensed EE features available to projects if the project namespace's plan includes the feature or if the project is public."
-msgstr ""
-
msgid "Encountered an error while rendering: %{err}"
msgstr ""
@@ -12617,9 +12814,6 @@ msgstr ""
msgid "Enter Admin Mode"
msgstr ""
-msgid "Enter IP address range"
-msgstr ""
-
msgid "Enter a number"
msgstr ""
@@ -12632,9 +12826,6 @@ msgstr ""
msgid "Enter at least three characters to search"
msgstr ""
-msgid "Enter domain"
-msgstr ""
-
msgid "Enter in your Bitbucket Server URL and personal access token below"
msgstr ""
@@ -12821,9 +13012,6 @@ msgstr ""
msgid "Environments|Deployment %{status}"
msgstr ""
-msgid "Environments|Dismiss"
-msgstr ""
-
msgid "Environments|Enable review app"
msgstr ""
@@ -12836,9 +13024,6 @@ msgstr ""
msgid "Environments|Environments are places where code gets deployed, such as staging or production."
msgstr ""
-msgid "Environments|Help us improve environments"
-msgstr ""
-
msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
msgstr ""
@@ -12875,6 +13060,9 @@ msgstr ""
msgid "Environments|Note that this action will stop the environment, but it will %{emphasisStart}not%{emphasisEnd} have an effect on any existing deployment due to no “stop environment action†being defined in the %{ciConfigLinkStart}.gitlab-ci.yml%{ciConfigLinkEnd} file."
msgstr ""
+msgid "Environments|Open"
+msgstr ""
+
msgid "Environments|Open live environment"
msgstr ""
@@ -12914,9 +13102,6 @@ msgstr ""
msgid "Environments|Stopping %{environmentName}"
msgstr ""
-msgid "Environments|Take the survey"
-msgstr ""
-
msgid "Environments|There was an error fetching the logs. Please try again."
msgstr ""
@@ -12938,9 +13123,6 @@ msgstr ""
msgid "Environments|You don't have any environments right now"
msgstr ""
-msgid "Environments|Your feedback helps GitLab make environments better for you and other users. Participate and enter a sweepstake to win a USD 30 gift card."
-msgstr ""
-
msgid "Environments|by %{avatar}"
msgstr ""
@@ -13223,7 +13405,7 @@ msgstr ""
msgid "Error parsing CSV file. Please make sure it has"
msgstr ""
-msgid "Error rendering markdown preview"
+msgid "Error rendering Markdown preview"
msgstr ""
msgid "Error saving label update."
@@ -13271,6 +13453,9 @@ msgstr ""
msgid "Error: %{error_message}"
msgstr ""
+msgid "Error: Couldn't load some or all of the changes."
+msgstr ""
+
msgid "Error: No AWS credentials were supplied"
msgstr ""
@@ -13304,6 +13489,9 @@ msgstr ""
msgid "ErrorTracking|Enable error tracking"
msgstr ""
+msgid "ErrorTracking|Error tracking backend"
+msgstr ""
+
msgid "ErrorTracking|If you self-host Sentry, enter your Sentry instance's full URL. If you use Sentry's hosted solution, enter https://sentry.io"
msgstr ""
@@ -13337,6 +13525,12 @@ msgstr ""
msgid "Escalation policies must have at least one rule"
msgstr ""
+msgid "EscalationPolicies|%{clockIcon} IF alert is not %{alertStatus} in %{minutes}"
+msgstr ""
+
+msgid "EscalationPolicies|%{notificationIcon} THEN %{doAction} %{forScheduleOrUser}"
+msgstr ""
+
msgid "EscalationPolicies|+ Add an additional rule"
msgstr ""
@@ -13379,13 +13573,13 @@ msgstr ""
msgid "EscalationPolicies|Escalation policies"
msgstr ""
-msgid "EscalationPolicies|Escalation rules"
+msgid "EscalationPolicies|Escalation policy %{obstacle} in Project %{project}"
msgstr ""
-msgid "EscalationPolicies|Failed to load oncall-schedules"
+msgid "EscalationPolicies|Escalation rules"
msgstr ""
-msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} %{then} THEN %{doAction} %{scheduleOrUser}"
+msgid "EscalationPolicies|Failed to load oncall-schedules"
msgstr ""
msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} minutes"
@@ -13463,18 +13657,36 @@ msgstr ""
msgid "Every %{action} attempt has failed: %{job_error_message}. Please try again."
msgstr ""
+msgid "Every 3 months"
+msgstr ""
+
+msgid "Every 3 months on the %{day} at %{time} %{timezone}"
+msgstr ""
+
+msgid "Every 6 months"
+msgstr ""
+
+msgid "Every 6 months on the %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Every day"
msgstr ""
msgid "Every day (at %{time})"
msgstr ""
+msgid "Every day at %{time} %{timezone}"
+msgstr ""
+
msgid "Every month"
msgstr ""
msgid "Every month (Day %{day} at %{time})"
msgstr ""
+msgid "Every month on the %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Every three months"
msgstr ""
@@ -13489,6 +13701,15 @@ msgstr[1] ""
msgid "Every week (%{weekday} at %{time})"
msgstr ""
+msgid "Every week on %{day} at %{time} %{timezone}"
+msgstr ""
+
+msgid "Every year"
+msgstr ""
+
+msgid "Every year on %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Everyone"
msgstr ""
@@ -13525,9 +13746,6 @@ msgstr ""
msgid "Exactly one of %{attributes} is required"
msgstr ""
-msgid "Example: %{ip_address}. %{read_more_link}."
-msgstr ""
-
msgid "Example: @sub\\.company\\.com$"
msgstr ""
@@ -13594,13 +13812,13 @@ msgstr ""
msgid "Expand pipeline"
msgstr ""
-msgid "Expand sidebar"
+msgid "Expand settings section"
msgstr ""
-msgid "Expected documents: %{expected_documents}"
+msgid "Expand sidebar"
msgstr ""
-msgid "Experienced"
+msgid "Expected documents: %{expected_documents}"
msgstr ""
msgid "ExperimentSubject|Must have exactly one of User, Namespace, or Project."
@@ -13885,9 +14103,6 @@ msgstr ""
msgid "Failed to load related branches"
msgstr ""
-msgid "Failed to load sidebar lock status"
-msgstr ""
-
msgid "Failed to load stacktrace."
msgstr ""
@@ -14312,6 +14527,9 @@ msgstr ""
msgid "Files"
msgstr ""
+msgid "Files API Rate Limits"
+msgstr ""
+
msgid "Files breadcrumb"
msgstr ""
@@ -15311,6 +15529,9 @@ msgstr ""
msgid "GitLab group: %{source_link}"
msgstr ""
+msgid "GitLab informs you if a new version is available."
+msgstr ""
+
msgid "GitLab is a complete DevOps platform, delivered as a single application, fundamentally changing the way Development, Security, and Ops teams collaborate"
msgstr ""
@@ -15326,7 +15547,7 @@ msgstr ""
msgid "GitLab is open source software to collaborate on code."
msgstr ""
-msgid "GitLab is undergoing maintenance and is operating in a read-only mode."
+msgid "GitLab is undergoing maintenance and is operating in read-only mode."
msgstr ""
msgid "GitLab member or Email address"
@@ -15338,9 +15559,6 @@ msgstr ""
msgid "GitLab project export"
msgstr ""
-msgid "GitLab restart is required to apply changes."
-msgstr ""
-
msgid "GitLab single sign-on URL"
msgstr ""
@@ -15356,9 +15574,6 @@ msgstr ""
msgid "GitLab version"
msgstr ""
-msgid "GitLab will inform you if a new version is available."
-msgstr ""
-
msgid "GitLab will run a background job that will produce pseudonymized CSVs of the GitLab database that will be uploaded to your configured object storage directory."
msgstr ""
@@ -15623,9 +15838,21 @@ msgstr ""
msgid "Go to snippets"
msgstr ""
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check 'Allowed domains for sign-ups'."
+msgstr ""
+
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check 'Email restrictions for sign-ups'."
+msgstr ""
+
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check the 'Domain denylist'."
+msgstr ""
+
msgid "Go to the activity feed"
msgstr ""
+msgid "Go to the group’s 'Settings &gt; General' page, and check 'Restrict membership by email domain'."
+msgstr ""
+
msgid "Go to the milestone list"
msgstr ""
@@ -15662,6 +15889,12 @@ msgstr ""
msgid "Goal of the changes and what reviewers should be aware of"
msgstr ""
+msgid "Google Cloud"
+msgstr ""
+
+msgid "Google Cloud offers several deployment targets. Select the one most suitable for your project."
+msgstr ""
+
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
@@ -15746,9 +15979,6 @@ msgstr ""
msgid "Group ID"
msgstr ""
-msgid "Group ID: %{group_id}"
-msgstr ""
-
msgid "Group Owner must have signed in with SAML before enabling Group Managed Accounts"
msgstr ""
@@ -15923,6 +16153,12 @@ msgstr ""
msgid "GroupImport|Unable to process group import file"
msgstr ""
+msgid "GroupPage|Copy group ID"
+msgstr ""
+
+msgid "GroupPage|Group ID: %{group_id}"
+msgstr ""
+
msgid "GroupRoadmap|%{dateWord} – No end date"
msgstr ""
@@ -15977,6 +16213,9 @@ msgstr ""
msgid "GroupRoadmap|Within 3 years"
msgstr ""
+msgid "GroupSAML|\"persistent\" recommended"
+msgstr ""
+
msgid "GroupSAML|%{strongOpen}Warning%{strongClose} - Enabling %{linkStart}SSO enforcement%{linkEnd} can reduce security risks."
msgstr ""
@@ -16109,6 +16348,9 @@ msgstr ""
msgid "GroupSAML|To be able to prohibit outer forks, you first need to enforce dedicate group managed accounts."
msgstr ""
+msgid "GroupSAML|Use SAML group links to manage group membership using SAML."
+msgstr ""
+
msgid "GroupSAML|Valid SAML Response"
msgstr ""
@@ -16121,13 +16363,10 @@ msgstr ""
msgid "GroupSAML|as %{access_level}"
msgstr ""
-msgid "GroupSAML|must match stored NameID of \"%{extern_uid}\" as we use this to identify users. If the NameID changes users will be unable to sign in."
-msgstr ""
-
-msgid "GroupSAML|should be \"persistent\""
+msgid "GroupSAML|must match stored NameID of \"%{extern_uid}\" to identify user and allow sign in"
msgstr ""
-msgid "GroupSAML|should be a random persistent ID, emails are discouraged"
+msgid "GroupSAML|recommend persistent ID instead of email"
msgstr ""
msgid "GroupSelect|No matching results"
@@ -16142,9 +16381,15 @@ msgstr ""
msgid "GroupSettings|Allow project access token creation"
msgstr ""
+msgid "GroupSettings|Applied to all subgroups unless overridden by a group owner. Groups already added to the project lose access."
+msgstr ""
+
msgid "GroupSettings|Auto DevOps pipeline was updated for the group"
msgstr ""
+msgid "GroupSettings|Available only on the top-level group. Applies to all subgroups. Groups already shared with a group outside %{group} are still shared unless removed manually."
+msgstr ""
+
msgid "GroupSettings|Badges"
msgstr ""
@@ -16196,6 +16441,9 @@ msgstr ""
msgid "GroupSettings|New runners registration token has been generated!"
msgstr ""
+msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgstr ""
+
msgid "GroupSettings|Pipeline settings was updated for the group"
msgstr ""
@@ -16208,12 +16456,15 @@ msgstr ""
msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
-msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups."
+msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups"
msgstr ""
msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
msgstr ""
+msgid "GroupSettings|Prevents group members from being notified if the group is mentioned."
+msgstr ""
+
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
msgstr ""
@@ -16250,21 +16501,6 @@ msgstr ""
msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}."
msgstr ""
-msgid "GroupSettings|This setting is only available on the top-level group and it applies to all subgroups. Groups that have already been shared with a group outside %{group} will still be shared, and this access will have to be revoked manually."
-msgstr ""
-
-msgid "GroupSettings|This setting will be applied to all subgroups unless overridden by a group owner. Groups that already have access to the project will continue to have access unless removed manually."
-msgstr ""
-
-msgid "GroupSettings|This setting will override user notification preferences for all members of the group, subgroups, and projects."
-msgstr ""
-
-msgid "GroupSettings|This setting will prevent group members from being notified if the group is mentioned."
-msgstr ""
-
-msgid "GroupSettings|This setting will prevent group members from forking projects outside of the group."
-msgstr ""
-
msgid "GroupSettings|Transfer group"
msgstr ""
@@ -16382,7 +16618,7 @@ msgstr ""
msgid "GroupsNew|No import options available"
msgstr ""
-msgid "GroupsNew|Not all related objects are migrated, as %{docs_link_start}described here%{docs_link_end}. Please %{feedback_link_start}leave feedback%{feedback_link_end} on this feature."
+msgid "GroupsNew|Not all related objects are migrated. %{docs_link_start}More info%{docs_link_end}."
msgstr ""
msgid "GroupsNew|Personal access token"
@@ -16514,15 +16750,27 @@ msgstr ""
msgid "Hello %{name},"
msgstr ""
-msgid "Hello there"
-msgstr ""
-
msgid "Hello, %{name}!"
msgstr ""
msgid "Hello, %{username}!"
msgstr ""
+msgid "HelloMessage|%{handshake_emoji} Contribute to GitLab: %{contribute_link}"
+msgstr ""
+
+msgid "HelloMessage|%{magnifier_emoji} Create a new GitLab issue: %{new_issue_link}"
+msgstr ""
+
+msgid "HelloMessage|%{rocket_emoji} We like your curiosity! Help us improve GitLab by joining the team: %{jobs_page_link}"
+msgstr ""
+
+msgid "HelloMessage|Does this page need fixes or improvements? Open an issue or contribute a merge request to help make GitLab more lovable. At GitLab, everyone can contribute!"
+msgstr ""
+
+msgid "HelloMessage|Welcome to GitLab!"
+msgstr ""
+
msgid "Help"
msgstr ""
@@ -16532,13 +16780,10 @@ msgstr ""
msgid "Helps prevent bots from creating accounts."
msgstr ""
-msgid "Helps prevent bots from creating issues"
-msgstr ""
-
-msgid "Helps prevent malicious users hide their activity"
+msgid "Helps prevent bots from creating issues."
msgstr ""
-msgid "Helps reduce request volume (e.g. from crawlers or abusive bots)"
+msgid "Helps prevent malicious users hide their activity."
msgstr ""
msgid "Helps reduce request volume (for example, from crawlers or abusive bots)"
@@ -16662,6 +16907,12 @@ msgstr ""
msgid "Housekeeping, export, path, transfer, remove, archive."
msgstr ""
+msgid "How do I configure Akismet?"
+msgstr ""
+
+msgid "How do I configure it?"
+msgstr ""
+
msgid "How do I configure runners?"
msgstr ""
@@ -16683,19 +16934,25 @@ msgstr ""
msgid "How do I set up this service?"
msgstr ""
+msgid "How do I use a web terminal?"
+msgstr ""
+
+msgid "How do I use file templates?"
+msgstr ""
+
msgid "How it works"
msgstr ""
msgid "How many days need to pass between marking entity for deletion and actual removing it."
msgstr ""
-msgid "How many seconds an IP will be counted towards the limit"
+msgid "How many seconds an IP counts toward the IP address limit."
msgstr ""
-msgid "I accept the %{terms_link}"
+msgid "How the job limiter handles jobs exceeding the thresholds specified below. The 'track' mode only logs the jobs. The 'compress' mode compresses the jobs and raises an exception if the compressed size exceeds the limit."
msgstr ""
-msgid "I accept the|Terms of Service and Privacy Policy"
+msgid "I accept the %{terms_link}"
msgstr ""
msgid "I forgot my password"
@@ -16779,13 +17036,16 @@ msgstr ""
msgid "IP Address"
msgstr ""
-msgid "IP expiration time"
+msgid "IP address expiration time"
msgstr ""
-msgid "IP subnet restriction only allowed for top-level groups"
+msgid "IP address restrictions"
+msgstr ""
+
+msgid "IP addresses per user"
msgstr ""
-msgid "IPs per user"
+msgid "IP subnet restriction only allowed for top-level groups"
msgstr ""
msgid "Identifier"
@@ -16800,6 +17060,9 @@ msgstr ""
msgid "If any indexed field exceeds this limit it will be truncated to this number of characters and the rest will not be indexed or searchable. This does not apply to repository and wiki indexing. Setting this to 0 means it is unlimited."
msgstr ""
+msgid "If blank, defaults to %{code_open}Retry later%{code_close}."
+msgstr ""
+
msgid "If blank, set allowable lifetime to %{instance_level_policy_in_words}, as defined by the instance admin. Once set, existing tokens for users in this group may be revoked."
msgstr ""
@@ -16851,6 +17114,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 did not initiate these sign-in attempts, please reach out to your administrator or enable two-factor authentication (2FA) on your account."
+msgstr ""
+
msgid "If you did not initiate this change, please contact your administrator immediately."
msgstr ""
@@ -16942,10 +17208,10 @@ msgstr ""
msgid "Import Projects from Gitea"
msgstr ""
-msgid "Import a project"
+msgid "Import an exported GitLab project"
msgstr ""
-msgid "Import an exported GitLab project"
+msgid "Import and export rate limits"
msgstr ""
msgid "Import failed due to a GitHub error: %{original}"
@@ -16957,12 +17223,18 @@ msgstr ""
msgid "Import from Jira"
msgstr ""
+msgid "Import group"
+msgstr ""
+
msgid "Import group from file"
msgstr ""
msgid "Import groups"
msgstr ""
+msgid "Import history"
+msgstr ""
+
msgid "Import in progress"
msgstr ""
@@ -17026,7 +17298,25 @@ msgstr ""
msgid "Import timed out. Import took longer than %{import_jobs_expiration} seconds"
msgstr ""
-msgid "Import/Export Rate Limits"
+msgid "ImportAProjectModal|Import from a project"
+msgstr ""
+
+msgid "ImportAProjectModal|Import members from another project"
+msgstr ""
+
+msgid "ImportAProjectModal|Import project members"
+msgstr ""
+
+msgid "ImportAProjectModal|Only project members (not group members) are imported, and they get the same permissions as the project you import from."
+msgstr ""
+
+msgid "ImportAProjectModal|Successfully imported"
+msgstr ""
+
+msgid "ImportAProjectModal|Unable to import project members"
+msgstr ""
+
+msgid "ImportAProjectModal|You're importing members to the %{strongStart}%{name}%{strongEnd} project."
msgstr ""
msgid "ImportButtons|Connect repositories from"
@@ -17079,7 +17369,7 @@ msgstr[1] ""
msgid "Importing..."
msgstr ""
-msgid "Import|A repository URL usually ends in a .git suffix, although this is not required. Double check to make sure your repository URL is correct."
+msgid "Import|There is not a valid Git repository at this URL. If your HTTP repository is not publicly accessible, verify your credentials."
msgstr ""
msgid "Improve customer support with Service Desk"
@@ -17088,9 +17378,6 @@ msgstr ""
msgid "Improves Git cloning performance."
msgstr ""
-msgid "In %{time_to_now}"
-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 ""
@@ -17376,7 +17663,7 @@ msgstr ""
msgid "InProductMarketing|Start a GitLab Ultimate trial today in less than one minute, no credit card required."
msgstr ""
-msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no CC required"
+msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no credit card required"
msgstr ""
msgid "InProductMarketing|Start a trial"
@@ -17415,7 +17702,7 @@ msgstr ""
msgid "InProductMarketing|Team up in GitLab for greater efficiency"
msgstr ""
-msgid "InProductMarketing|Team work makes the dream work"
+msgid "InProductMarketing|Team work makes the dream work"
msgstr ""
msgid "InProductMarketing|Test, create, deploy"
@@ -17996,6 +18283,9 @@ msgstr ""
msgid "Integrations|Create new issue in Jira"
msgstr ""
+msgid "Integrations|Create new issue in ZenTao"
+msgstr ""
+
msgid "Integrations|Default settings are inherited from the group level."
msgstr ""
@@ -18089,9 +18379,15 @@ msgstr ""
msgid "Integrations|Search Jira issues"
msgstr ""
+msgid "Integrations|Search ZenTao issues"
+msgstr ""
+
msgid "Integrations|Send notifications about project events to Unify Circuit."
msgstr ""
+msgid "Integrations|Send notifications about project events to a Unify Circuit conversation. %{docs_link}"
+msgstr ""
+
msgid "Integrations|Sign in to add namespaces"
msgstr ""
@@ -18131,6 +18427,9 @@ msgstr ""
msgid "Integrations|You've activated every integration 🎉"
msgstr ""
+msgid "Integrations|ZenTao issues display here when you create issues in your project in ZenTao."
+msgstr ""
+
msgid "Interactive mode"
msgstr ""
@@ -18158,9 +18457,6 @@ msgstr ""
msgid "Interval Pattern"
msgstr ""
-msgid "Introducing Value Stream Analytics"
-msgstr ""
-
msgid "Introducing Your DevOps Report"
msgstr ""
@@ -18257,6 +18553,12 @@ msgstr ""
msgid "Investigate vulnerability: %{title}"
msgstr ""
+msgid "Invisible Captcha"
+msgstr ""
+
+msgid "Invisible Captcha helps prevent the creation of spam accounts. It adds a honeypot field and time-sensitive form submission to the account signup form."
+msgstr ""
+
msgid "Invitation"
msgstr ""
@@ -18710,12 +19012,18 @@ msgstr ""
msgid "Issues"
msgstr ""
+msgid "Issues I've created"
+msgstr ""
+
msgid "Issues Rate Limits"
msgstr ""
msgid "Issues and merge requests"
msgstr ""
+msgid "Issues assigned to me"
+msgstr ""
+
msgid "Issues can be bugs, tasks or ideas to be discussed. Also, issues are searchable and filterable."
msgstr ""
@@ -18827,7 +19135,7 @@ msgstr ""
msgid "Iterations|Create cadence"
msgstr ""
-msgid "Iterations|Create your first iteration"
+msgid "Iterations|Create iteration"
msgstr ""
msgid "Iterations|Delete cadence"
@@ -18836,6 +19144,9 @@ msgstr ""
msgid "Iterations|Delete iteration cadence?"
msgstr ""
+msgid "Iterations|Delete iteration?"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -18869,12 +19180,18 @@ msgstr ""
msgid "Iterations|New iteration cadence"
msgstr ""
+msgid "Iterations|No closed iterations."
+msgstr ""
+
msgid "Iterations|No iteration cadences to show."
msgstr ""
msgid "Iterations|No iterations in cadence."
msgstr ""
+msgid "Iterations|No open iterations."
+msgstr ""
+
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
@@ -18905,6 +19222,9 @@ msgstr ""
msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
msgstr ""
+msgid "Iterations|This will remove the iteration from any issues that are assigned to it."
+msgstr ""
+
msgid "Iterations|Title"
msgstr ""
@@ -18920,15 +19240,9 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "I’m familiar with the basics of DevOps."
-msgstr ""
-
msgid "I’m joining my team who’s already on GitLab"
msgstr ""
-msgid "I’m not familiar with the basics of DevOps."
-msgstr ""
-
msgid "Jaeger URL"
msgstr ""
@@ -19193,6 +19507,9 @@ msgstr ""
msgid "Job"
msgstr ""
+msgid "Job %{jobName}"
+msgstr ""
+
msgid "Job Failed #%{build_id}"
msgstr ""
@@ -19783,9 +20100,6 @@ msgstr ""
msgid "Learn more in the"
msgstr ""
-msgid "Learn more in the|pipeline schedules documentation"
-msgstr ""
-
msgid "Learn more."
msgstr ""
@@ -19897,9 +20211,6 @@ msgstr ""
msgid "Leave Admin Mode"
msgstr ""
-msgid "Leave blank for no limit. Once set, existing personal access tokens may be revoked."
-msgstr ""
-
msgid "Leave edit mode? All unsaved changes will be lost."
msgstr ""
@@ -19945,10 +20256,10 @@ msgstr ""
msgid "LicenseCompliance|Acceptable license to be used in the project"
msgstr ""
-msgid "LicenseCompliance|Add a license"
+msgid "LicenseCompliance|Add license and related policy"
msgstr ""
-msgid "LicenseCompliance|Add license and related policy"
+msgid "LicenseCompliance|Add license policy"
msgstr ""
msgid "LicenseCompliance|Allow"
@@ -20038,6 +20349,9 @@ msgstr ""
msgid "LicenseManagement|Uncategorized"
msgstr ""
+msgid "Licensed Enterprise Edition features can be used if the project namespace's plan includes the feature, or if the project is public."
+msgstr ""
+
msgid "Licensed Features"
msgstr ""
@@ -20104,7 +20418,10 @@ msgstr ""
msgid "Limit namespaces and projects that can be indexed"
msgstr ""
-msgid "Limit sign in from multiple ips"
+msgid "Limit project size at a global, group, and project level. %{link_start}Learn more%{link_end}."
+msgstr ""
+
+msgid "Limit sign in from multiple IP addresses"
msgstr ""
msgid "Limit the number of concurrent operations this secondary site can run in the background."
@@ -20116,11 +20433,17 @@ msgstr ""
msgid "Limit the number of issues and epics per minute a user can create through web and API requests."
msgstr ""
+msgid "Limit the size of Sidekiq jobs stored in Redis."
+msgstr ""
+
msgid "Limited to showing %d event at most"
msgid_plural "Limited to showing %d events at most"
msgstr[0] ""
msgstr[1] ""
+msgid "Limiting mode"
+msgstr ""
+
msgid "Line changes"
msgstr ""
@@ -20190,9 +20513,6 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
-msgid "List of users to be excluded from the limit"
-msgstr ""
-
msgid "List options"
msgstr ""
@@ -20232,9 +20552,6 @@ msgstr ""
msgid "Loading functions timed out. Please reload the page to try again."
msgstr ""
-msgid "Loading issues"
-msgstr ""
-
msgid "Loading more"
msgstr ""
@@ -20526,6 +20843,9 @@ msgstr ""
msgid "Marked For Deletion At - %{deletion_time}"
msgstr ""
+msgid "Marked as ready. Merging is now allowed."
+msgstr ""
+
msgid "Marked this %{noun} as a draft."
msgstr ""
@@ -20598,52 +20918,22 @@ msgstr ""
msgid "Max 100,000 events"
msgstr ""
-msgid "Max 20 characters"
-msgstr ""
-
-msgid "Max Group Export Download requests per minute per user"
-msgstr ""
-
-msgid "Max Group Export requests per minute per user"
-msgstr ""
-
-msgid "Max Group Import requests per minute per user"
-msgstr ""
-
-msgid "Max Project Export Download requests per minute per user"
-msgstr ""
-
-msgid "Max Project Export requests per minute per user"
-msgstr ""
-
-msgid "Max Project Import requests per minute per user"
-msgstr ""
-
-msgid "Max authenticated API requests per period per user"
-msgstr ""
-
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
-msgid "Max authenticated web requests per period per user"
-msgstr ""
-
msgid "Max file size is 200 KB."
msgstr ""
-msgid "Max requests per minute per user"
-msgstr ""
-
msgid "Max role"
msgstr ""
msgid "Max session time"
msgstr ""
-msgid "Max unauthenticated requests per period per IP"
+msgid "MaxBuilds"
msgstr ""
-msgid "MaxBuilds"
+msgid "Maximum 20 characters"
msgstr ""
msgid "Maximum Conan package file size in bytes"
@@ -20679,6 +20969,12 @@ msgstr ""
msgid "Maximum attachment size (MB)"
msgstr ""
+msgid "Maximum authenticated API requests per rate limit period per user"
+msgstr ""
+
+msgid "Maximum authenticated web requests per rate limit period per user"
+msgstr ""
+
msgid "Maximum bulk request size (MiB)"
msgstr ""
@@ -20724,6 +21020,15 @@ msgstr ""
msgid "Maximum files in a diff"
msgstr ""
+msgid "Maximum group export download requests per minute"
+msgstr ""
+
+msgid "Maximum group export requests per minute"
+msgstr ""
+
+msgid "Maximum group import requests per minute"
+msgstr ""
+
msgid "Maximum import size"
msgstr ""
@@ -20760,7 +21065,7 @@ msgstr ""
msgid "Maximum number of projects."
msgstr ""
-msgid "Maximum number of unique IPs per user"
+msgid "Maximum number of unique IP addresses per user."
msgstr ""
msgid "Maximum page reached"
@@ -20769,12 +21074,24 @@ msgstr ""
msgid "Maximum page size"
msgstr ""
+msgid "Maximum project export download requests per minute"
+msgstr ""
+
+msgid "Maximum project export requests per minute"
+msgstr ""
+
+msgid "Maximum project import requests per minute"
+msgstr ""
+
msgid "Maximum push size"
msgstr ""
msgid "Maximum push size (MB)"
msgstr ""
+msgid "Maximum requests per minute"
+msgstr ""
+
msgid "Maximum running slices"
msgstr ""
@@ -20802,10 +21119,16 @@ msgstr ""
msgid "Maximum time between updates that a mirror can have when scheduled to synchronize."
msgstr ""
-msgid "Maximum time for web terminal websocket connection (in seconds). 0 for unlimited."
+msgid "Maximum time that users are allowed to skip the setup of two-factor authentication (in hours). Set to 0 (zero) to enforce at next sign in."
msgstr ""
-msgid "Maximum time that users are allowed to skip the setup of two-factor authentication (in hours). Set to 0 (zero) to enforce at next sign in."
+msgid "Maximum time, in seconds, for a web terminal websocket connection. 0 for unlimited."
+msgstr ""
+
+msgid "Maximum unauthenticated API requests per rate limit period per IP"
+msgstr ""
+
+msgid "Maximum unauthenticated web requests per rate limit period per IP"
msgstr ""
msgid "May"
@@ -20823,9 +21146,6 @@ msgstr ""
msgid "Medium vulnerabilities present"
msgstr ""
-msgid "Member lock"
-msgstr ""
-
msgid "Member since"
msgstr ""
@@ -20862,6 +21182,9 @@ msgstr ""
msgid "Members of a group may only view projects they have permission to access"
msgstr ""
+msgid "Membership"
+msgstr ""
+
msgid "Members|%{time} by %{user}"
msgstr ""
@@ -20922,9 +21245,6 @@ msgstr ""
msgid "Members|Expiration date updated successfully."
msgstr ""
-msgid "Members|Expired"
-msgstr ""
-
msgid "Members|Filter members"
msgstr ""
@@ -20940,9 +21260,6 @@ msgstr ""
msgid "Members|Membership"
msgstr ""
-msgid "Members|No expiration set"
-msgstr ""
-
msgid "Members|Remove \"%{groupName}\""
msgstr ""
@@ -20964,9 +21281,6 @@ msgstr ""
msgid "Members|Search invited"
msgstr ""
-msgid "Members|in %{time}"
-msgstr ""
-
msgid "Member|Deny access"
msgstr ""
@@ -21042,9 +21356,6 @@ msgstr ""
msgid "Merge request %{mr_link} was reviewed by %{mr_author}"
msgstr ""
-msgid "Merge request (MR) approvals"
-msgstr ""
-
msgid "Merge request analytics"
msgstr ""
@@ -21066,12 +21377,21 @@ msgstr ""
msgid "Merge requests"
msgstr ""
+msgid "Merge requests I've created"
+msgstr ""
+
msgid "Merge requests are a place to propose changes you've made to a project and discuss those changes with others"
msgstr ""
msgid "Merge requests are read-only in a secondary Geo node"
msgstr ""
+msgid "Merge requests assigned to me"
+msgstr ""
+
+msgid "Merge requests that I'm a reviewer"
+msgstr ""
+
msgid "Merge the branch and fix any conflicts that come up"
msgstr ""
@@ -21132,10 +21452,10 @@ msgstr ""
msgid "MergeRequests|An error occurred while saving the draft comment."
msgstr ""
-msgid "MergeRequests|Failed to squash. Should be done manually."
+msgid "MergeRequests|Create issue to resolve thread"
msgstr ""
-msgid "MergeRequests|Resolve this thread in a new issue"
+msgid "MergeRequests|Failed to squash. Should be done manually."
msgstr ""
msgid "MergeRequests|Saving the comment failed"
@@ -21949,6 +22269,9 @@ msgstr ""
msgid "MoveIssue|Cannot move issue to project it originates from!"
msgstr ""
+msgid "MoveIssue|Cannot move issues of '%{issue_type}' type."
+msgstr ""
+
msgid "Moved issue to %{label} column in the board."
msgstr ""
@@ -22074,6 +22397,15 @@ 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. To learn more about reducing storage capacity please visit our docs."
msgstr ""
+msgid "NamespaceUserCap|Pending users must be reviewed and approved by a group owner. Learn more about %{user_caps_link_start}User Caps%{link_end} and %{users_pending_approval_link_start}Users Pending Approval%{link_end}."
+msgstr ""
+
+msgid "NamespaceUserCap|View pending user approvals"
+msgstr ""
+
+msgid "NamespaceUserCap|Your group has reached its billable member limit"
+msgstr ""
+
msgid "Namespaces"
msgstr ""
@@ -22116,9 +22448,6 @@ msgstr ""
msgid "Network"
msgstr ""
-msgid "Network Policy|New rule"
-msgstr ""
-
msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is inbound from a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
msgstr ""
@@ -22140,16 +22469,13 @@ msgstr ""
msgid "NetworkPolicies|%{strongOpen}any%{strongClose} port"
msgstr ""
-msgid "NetworkPolicies|+ Add alert"
-msgstr ""
-
msgid "NetworkPolicies|.yaml"
msgstr ""
msgid "NetworkPolicies|.yaml mode"
msgstr ""
-msgid "NetworkPolicies|Actions"
+msgid "NetworkPolicies|Add alert"
msgstr ""
msgid "NetworkPolicies|Alerts are intended to be selectively used for a limited number of events that are potentially concerning and warrant a manual review. Alerts should not be used as a substitute for a SIEM or a logging tool. High volume alerts are likely to be dropped so as to preserve the stability of GitLab's integration with Kubernetes."
@@ -22185,9 +22511,6 @@ msgstr ""
msgid "NetworkPolicies|Deny all traffic"
msgstr ""
-msgid "NetworkPolicies|Description"
-msgstr ""
-
msgid "NetworkPolicies|Edit policy"
msgstr ""
@@ -22200,9 +22523,6 @@ msgstr ""
msgid "NetworkPolicies|IP/subnet"
msgstr ""
-msgid "NetworkPolicies|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
-msgstr ""
-
msgid "NetworkPolicies|Invalid or empty policy"
msgstr ""
@@ -22212,19 +22532,16 @@ msgstr ""
msgid "NetworkPolicies|Kubernetes error: %{error}"
msgstr ""
-msgid "NetworkPolicies|Name"
-msgstr ""
-
msgid "NetworkPolicies|Network"
msgstr ""
-msgid "NetworkPolicies|Network traffic"
+msgid "NetworkPolicies|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
msgstr ""
-msgid "NetworkPolicies|New policy"
+msgid "NetworkPolicies|Network policy can be created after the environment is loaded successfully."
msgstr ""
-msgid "NetworkPolicies|No policies detected"
+msgid "NetworkPolicies|Network traffic"
msgstr ""
msgid "NetworkPolicies|None selected"
@@ -22233,21 +22550,12 @@ msgstr ""
msgid "NetworkPolicies|Please %{installLinkStart}install%{installLinkEnd} and %{configureLinkStart}configure a Kubernetes Agent for this project%{configureLinkEnd} to enable alerts."
msgstr ""
-msgid "NetworkPolicies|Policies are a specification of how groups of pods are allowed to communicate with each other's network endpoints."
-msgstr ""
-
msgid "NetworkPolicies|Policy %{policyName} was successfully changed"
msgstr ""
msgid "NetworkPolicies|Policy definition"
msgstr ""
-msgid "NetworkPolicies|Policy editor"
-msgstr ""
-
-msgid "NetworkPolicies|Policy preview"
-msgstr ""
-
msgid "NetworkPolicies|Rule"
msgstr ""
@@ -22257,9 +22565,6 @@ msgstr ""
msgid "NetworkPolicies|Rule mode is unavailable for this policy. In some cases, we cannot parse the YAML file back into the rules editor."
msgstr ""
-msgid "NetworkPolicies|Rules"
-msgstr ""
-
msgid "NetworkPolicies|Save changes"
msgstr ""
@@ -22272,9 +22577,6 @@ msgstr ""
msgid "NetworkPolicies|Traffic that does not match any rule will be blocked."
msgstr ""
-msgid "NetworkPolicies|Unable to parse policy"
-msgstr ""
-
msgid "NetworkPolicies|all DNS names"
msgstr ""
@@ -22454,6 +22756,9 @@ msgstr ""
msgid "New issue"
msgstr ""
+msgid "New issue in %{project}"
+msgstr ""
+
msgid "New issue title"
msgstr ""
@@ -22532,7 +22837,7 @@ msgstr ""
msgid "Newest first"
msgstr ""
-msgid "Newly registered users will by default be external"
+msgid "Newly-registered users are external by default"
msgstr ""
msgid "Next"
@@ -22847,8 +23152,10 @@ msgstr ""
msgid "No webhooks found, add one in the form above."
msgstr ""
-msgid "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} to renew your subscription."
-msgstr ""
+msgid "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} day to renew your subscription."
+msgid_plural "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} days to renew your subscription."
+msgstr[0] ""
+msgstr[1] ""
msgid "No. of commits"
msgstr ""
@@ -22865,7 +23172,7 @@ msgstr ""
msgid "Nodes"
msgstr ""
-msgid "Non-admin users can sign in with read-only access and make read-only API requests."
+msgid "Non-admin users are restricted to read-only access, in both GitLab UI and API."
msgstr ""
msgid "None"
@@ -22946,7 +23253,7 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
-msgid "Notes Rate Limits"
+msgid "Notes rate limit"
msgstr ""
msgid "Notes|Are you sure you want to cancel creating this comment?"
@@ -23113,9 +23420,6 @@ msgstr ""
msgid "November"
msgstr ""
-msgid "Novice"
-msgstr ""
-
msgid "Now, personalize your GitLab experience"
msgstr ""
@@ -23284,7 +23588,7 @@ msgstr ""
msgid "OnCallSchedules|For this rotation, on-call will be:"
msgstr ""
-msgid "OnCallSchedules|On-call schedule %{schedule} in Project %{project}"
+msgid "OnCallSchedules|On-call schedule %{obstacle} in Project %{project}"
msgstr ""
msgid "OnCallSchedules|On-call schedules"
@@ -23431,22 +23735,22 @@ msgstr ""
msgid "OnDemandScans|Scanner profile"
msgstr ""
-msgid "OnDemandScans|Select one of the existing profiles"
+msgid "OnDemandScans|Schedule scan"
msgstr ""
-msgid "OnDemandScans|Site profile"
+msgid "OnDemandScans|Select one of the existing profiles"
msgstr ""
-msgid "OnDemandScans|Use existing scanner profile"
+msgid "OnDemandScans|Site profile"
msgstr ""
-msgid "OnDemandScans|Use existing site profile"
+msgid "OnDemandScans|Start time"
msgstr ""
-msgid "OnDemandScans|You can either choose a passive scan or validate the target site in your chosen site profile. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
+msgid "OnDemandScans|Use existing scanner profile"
msgstr ""
-msgid "OnDemandScans|You cannot run an active scan against an unvalidated site."
+msgid "OnDemandScans|Use existing site profile"
msgstr ""
msgid "OnDemandScans|You must create a repository within your project to run an on-demand scan."
@@ -23511,6 +23815,9 @@ msgstr ""
msgid "Only admins can delete project"
msgstr ""
+msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
+msgstr ""
+
msgid "Only include features new to your current subscription tier."
msgstr ""
@@ -23529,6 +23836,12 @@ msgstr ""
msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
+msgid "Only reCAPTCHA v2 is supported:"
+msgstr ""
+
+msgid "Only users from the specified IP address ranges are able to reach this group, including all subgroups, projects, and Git repositories."
+msgstr ""
+
msgid "Only verified users with an email address in any of these domains can be added to the group."
msgstr ""
@@ -23715,9 +24028,6 @@ msgstr ""
msgid "Package Registry"
msgstr ""
-msgid "Package Registry Rate Limits"
-msgstr ""
-
msgid "Package Registry: authenticated API requests"
msgstr ""
@@ -23736,6 +24046,9 @@ msgstr ""
msgid "Package recipe already exists"
msgstr ""
+msgid "Package registry rate limits"
+msgstr ""
+
msgid "Package type"
msgstr ""
@@ -23802,6 +24115,9 @@ msgstr ""
msgid "PackageRegistry|Composer"
msgstr ""
+msgid "PackageRegistry|Composer.json with license: %{license} and version: %{version}"
+msgstr ""
+
msgid "PackageRegistry|Conan"
msgstr ""
@@ -23865,6 +24181,9 @@ msgstr ""
msgid "PackageRegistry|Copy require package include"
msgstr ""
+msgid "PackageRegistry|Copy target SHA"
+msgstr ""
+
msgid "PackageRegistry|Copy yarn command"
msgstr ""
@@ -23931,6 +24250,9 @@ msgstr ""
msgid "PackageRegistry|Install package version"
msgstr ""
+msgid "PackageRegistry|Instance-level"
+msgstr ""
+
msgid "PackageRegistry|Invalid Package: failed metadata extraction"
msgstr ""
@@ -23976,6 +24298,9 @@ msgstr ""
msgid "PackageRegistry|Pip Command"
msgstr ""
+msgid "PackageRegistry|Project-level"
+msgstr ""
+
msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
msgstr ""
@@ -23997,6 +24322,9 @@ msgstr ""
msgid "PackageRegistry|Remove package"
msgstr ""
+msgid "PackageRegistry|Required Python: %{pythonVersion}"
+msgstr ""
+
msgid "PackageRegistry|RubyGems"
msgstr ""
@@ -24039,6 +24367,9 @@ msgstr ""
msgid "PackageRegistry|Source project located at %{link}"
msgstr ""
+msgid "PackageRegistry|Target SHA: %{sha}"
+msgstr ""
+
msgid "PackageRegistry|There are no other versions of this package."
msgstr ""
@@ -24207,6 +24538,18 @@ msgstr ""
msgid "Password was successfully updated. Please sign in again."
msgstr ""
+msgid "PasswordPrompt|Confirm password"
+msgstr ""
+
+msgid "PasswordPrompt|Confirm password to continue"
+msgstr ""
+
+msgid "PasswordPrompt|Password is required"
+msgstr ""
+
+msgid "PasswordPrompt|Please enter your password to confirm"
+msgstr ""
+
msgid "Passwords should be unique and not used for any other sites or services."
msgstr ""
@@ -24234,6 +24577,9 @@ msgstr ""
msgid "Paste project path (i.e. gitlab-org/gitlab)"
msgstr ""
+msgid "Paste this DSN into your Sentry SDK"
+msgstr ""
+
msgid "Paste your public SSH key, which is usually contained in the file '~/.ssh/id_ed25519.pub' or '~/.ssh/id_rsa.pub' and begins with 'ssh-ed25519' or 'ssh-rsa'. Do not paste your private SSH key, as that can compromise your identity."
msgstr ""
@@ -24318,6 +24664,9 @@ msgstr ""
msgid "PerformanceBar|First Contentful Paint"
msgstr ""
+msgid "PerformanceBar|Flamegraph with mode:"
+msgstr ""
+
msgid "PerformanceBar|Frontend resources"
msgstr ""
@@ -24351,6 +24700,15 @@ msgstr ""
msgid "PerformanceBar|Trace"
msgstr ""
+msgid "PerformanceBar|cpu"
+msgstr ""
+
+msgid "PerformanceBar|object"
+msgstr ""
+
+msgid "PerformanceBar|wall"
+msgstr ""
+
msgid "Period in seconds"
msgstr ""
@@ -24579,6 +24937,48 @@ msgstr ""
msgid "PipelineSchedules|Variables"
msgstr ""
+msgid "PipelineSource|API"
+msgstr ""
+
+msgid "PipelineSource|Chat"
+msgstr ""
+
+msgid "PipelineSource|External"
+msgstr ""
+
+msgid "PipelineSource|External Pull Request"
+msgstr ""
+
+msgid "PipelineSource|Merge Request"
+msgstr ""
+
+msgid "PipelineSource|On-Demand DAST Scan"
+msgstr ""
+
+msgid "PipelineSource|On-Demand DAST Validation"
+msgstr ""
+
+msgid "PipelineSource|Parent Pipeline"
+msgstr ""
+
+msgid "PipelineSource|Pipeline"
+msgstr ""
+
+msgid "PipelineSource|Push"
+msgstr ""
+
+msgid "PipelineSource|Schedule"
+msgstr ""
+
+msgid "PipelineSource|Trigger"
+msgstr ""
+
+msgid "PipelineSource|Web"
+msgstr ""
+
+msgid "PipelineSource|Web IDE"
+msgstr ""
+
msgid "PipelineStatusTooltip|Pipeline: %{ciStatus}"
msgstr ""
@@ -24879,46 +25279,7 @@ msgstr ""
msgid "Pipeline|Source"
msgstr ""
-msgid "Pipeline|Source|API"
-msgstr ""
-
-msgid "Pipeline|Source|Chat"
-msgstr ""
-
-msgid "Pipeline|Source|External"
-msgstr ""
-
-msgid "Pipeline|Source|External Pull Request"
-msgstr ""
-
-msgid "Pipeline|Source|Merge Request"
-msgstr ""
-
-msgid "Pipeline|Source|On-Demand DAST Scan"
-msgstr ""
-
-msgid "Pipeline|Source|On-Demand DAST Validation"
-msgstr ""
-
-msgid "Pipeline|Source|Parent Pipeline"
-msgstr ""
-
-msgid "Pipeline|Source|Pipeline"
-msgstr ""
-
-msgid "Pipeline|Source|Push"
-msgstr ""
-
-msgid "Pipeline|Source|Schedule"
-msgstr ""
-
-msgid "Pipeline|Source|Trigger"
-msgstr ""
-
-msgid "Pipeline|Source|Web"
-msgstr ""
-
-msgid "Pipeline|Source|Web IDE"
+msgid "Pipeline|Source|Security Policy"
msgstr ""
msgid "Pipeline|Specify variable values to be used in this run. The values specified in %{linkStart}CI/CD settings%{linkEnd} will be used by default."
@@ -24969,7 +25330,7 @@ msgstr ""
msgid "Pipeline|We are currently unable to fetch pipeline data"
msgstr ""
-msgid "Pipeline|You’re about to stop pipeline %{pipelineId}."
+msgid "Pipeline|You’re about to stop pipeline #%{pipelineId}."
msgstr ""
msgid "Pipeline|for"
@@ -24996,6 +25357,9 @@ msgstr ""
msgid "Plain diff"
msgstr ""
+msgid "Plain-text response to send to clients that hit a rate limit"
+msgstr ""
+
msgid "Plan:"
msgstr ""
@@ -25140,9 +25504,6 @@ msgstr ""
msgid "Please provide attributes to update"
msgstr ""
-msgid "Please provide your username or email address."
-msgstr ""
-
msgid "Please reach out if you have any questions and we'll be happy to assist."
msgstr ""
@@ -25185,9 +25546,6 @@ msgstr ""
msgid "Please set a new password before proceeding."
msgstr ""
-msgid "Please share your feedback about %{featureName} %{linkStart}in this issue%{linkEnd} to help us improve the experience."
-msgstr ""
-
msgid "Please solve the captcha"
msgstr ""
@@ -25365,6 +25723,9 @@ msgstr ""
msgid "Prevent adding new members to project membership within this group"
msgstr ""
+msgid "Prevent auto-stopping"
+msgstr ""
+
msgid "Prevent editing approval rules in projects and merge requests."
msgstr ""
@@ -25377,7 +25738,7 @@ msgstr ""
msgid "Prevent users from changing their profile name"
msgstr ""
-msgid "Prevent users from performing write operations on GitLab while performing maintenance."
+msgid "Prevent users from performing write operations while GitLab maintenance is in progress."
msgstr ""
msgid "Preview"
@@ -25650,6 +26011,9 @@ msgstr ""
msgid "Profiles|Enter your name, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Enter your password to confirm the email change"
+msgstr ""
+
msgid "Profiles|Enter your pronouns to let people know how to refer to you"
msgstr ""
@@ -25884,10 +26248,10 @@ msgstr ""
msgid "Profiles|e.g. My MacBook key"
msgstr ""
-msgid "Profiles|username"
+msgid "Profiles|https://website.com"
msgstr ""
-msgid "Profiles|website.com"
+msgid "Profiles|username"
msgstr ""
msgid "Profiles|your account"
@@ -26130,9 +26494,21 @@ msgstr ""
msgid "ProjectSelect| or group"
msgstr ""
+msgid "ProjectSelect|No matching results"
+msgstr ""
+
msgid "ProjectSelect|Search for project"
msgstr ""
+msgid "ProjectSelect|Search projects"
+msgstr ""
+
+msgid "ProjectSelect|Select a project"
+msgstr ""
+
+msgid "ProjectSelect|There was an error fetching the projects. Please try again."
+msgstr ""
+
msgid "ProjectService|Drone server URL"
msgstr ""
@@ -26220,6 +26596,9 @@ msgstr ""
msgid "ProjectService|Trigger event when a new, unique alert is recorded."
msgstr ""
+msgid "ProjectService|Trigger event when a new, unique vulnerability is recorded. (Note: This feature requires an Ultimate plan.)"
+msgstr ""
+
msgid "ProjectService|Trigger event when a pipeline status changes."
msgstr ""
@@ -26634,9 +27013,15 @@ msgstr ""
msgid "Projects are graded based on the highest severity vulnerability present"
msgstr ""
+msgid "Projects are organized into groups"
+msgstr ""
+
msgid "Projects contributed to"
msgstr ""
+msgid "Projects help you organize your work. They contain your file repository, issues, merge requests, and so much more."
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr ""
@@ -26871,10 +27256,10 @@ msgstr ""
msgid "PrometheusService|Prometheus cluster integration"
msgstr ""
-msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
+msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
msgstr ""
-msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
+msgid "PrometheusService|The ID of the IAP-secured resource."
msgstr ""
msgid "PrometheusService|The Prometheus API base URL."
@@ -27492,6 +27877,9 @@ msgstr ""
msgid "Rate limit"
msgstr ""
+msgid "Rate limits can help reduce request volume (like from crawlers or abusive bots)."
+msgstr ""
+
msgid "Raw blob request rate limit per minute"
msgstr ""
@@ -27504,6 +27892,9 @@ msgstr ""
msgid "Re-authentication required"
msgstr ""
+msgid "Re-import"
+msgstr ""
+
msgid "Re-request review"
msgstr ""
@@ -27525,6 +27916,9 @@ msgstr ""
msgid "Read more about related issues"
msgstr ""
+msgid "Read their documentation."
+msgstr ""
+
msgid "Ready to get started with GitLab? Follow these steps to set up your workspace, plan and commit changes, and deploy your project."
msgstr ""
@@ -27558,6 +27952,9 @@ msgstr ""
msgid "Receive any notifications from GitLab."
msgstr ""
+msgid "Receive notification of abuse reports by email."
+msgstr ""
+
msgid "Receive notifications about your own activity"
msgstr ""
@@ -27701,9 +28098,6 @@ msgstr ""
msgid "Registry setup"
msgstr ""
-msgid "Regulate approvals by authors/committers. Affects all projects."
-msgstr ""
-
msgid "Reindexing Status: %{status} (Slice multiplier: %{multiplier}, Maximum running slices: %{max_slices})"
msgstr ""
@@ -27799,6 +28193,9 @@ msgstr ""
msgid "Release|Something went wrong while saving the release details."
msgstr ""
+msgid "Reload page"
+msgstr ""
+
msgid "Remediations"
msgstr ""
@@ -28081,6 +28478,9 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
+msgid "Repeats"
+msgstr ""
+
msgid "Replace"
msgstr ""
@@ -28443,10 +28843,7 @@ msgstr ""
msgid "Require additional authentication for administrative tasks."
msgstr ""
-msgid "Require all users in this group to setup Two-factor authentication"
-msgstr ""
-
-msgid "Require all users in this group to setup two-factor authentication"
+msgid "Require all users in this group to set up two-factor authentication"
msgstr ""
msgid "Required approvals (%{approvals_given} given)"
@@ -28492,6 +28889,9 @@ msgstr[1] ""
msgid "Requires values to meet regular expression requirements."
msgstr ""
+msgid "Requires you to deploy or set up cloud-hosted Sentry."
+msgstr ""
+
msgid "Requires your primary GitLab email address."
msgstr ""
@@ -28552,9 +28952,6 @@ msgstr ""
msgid "Resolve"
msgstr ""
-msgid "Resolve all threads in new issue"
-msgstr ""
-
msgid "Resolve conflicts"
msgstr ""
@@ -28612,6 +29009,9 @@ msgstr ""
msgid "Response text"
msgstr ""
+msgid "Restart GitLab to apply changes."
+msgstr ""
+
msgid "Restart Terminal"
msgstr ""
@@ -28630,6 +29030,9 @@ msgstr ""
msgid "Restoring the project will prevent the project from being removed on this date and restore people's ability to make changes to it."
msgstr ""
+msgid "Restrict group access by IP address. %{link_start}Learn more%{link_end}."
+msgstr ""
+
msgid "Restrict membership by email domain"
msgstr ""
@@ -28943,6 +29346,9 @@ msgstr ""
msgid "Runners|Runner #%{runner_id}"
msgstr ""
+msgid "Runners|Runner assigned to project."
+msgstr ""
+
msgid "Runners|Runner is offline, last contact was %{runner_contact} ago"
msgstr ""
@@ -28955,6 +29361,9 @@ msgstr ""
msgid "Runners|Runner registration"
msgstr ""
+msgid "Runners|Runner unassigned from project."
+msgstr ""
+
msgid "Runners|Runners"
msgstr ""
@@ -29147,7 +29556,7 @@ msgstr ""
msgid "SastEntryPoints|How do I set up SAST?"
msgstr ""
-msgid "SastEntryPoints|Learn more."
+msgid "SastEntryPoints|Learn more"
msgstr ""
msgid "Satisfied"
@@ -29189,7 +29598,7 @@ msgstr ""
msgid "Save pipeline schedule"
msgstr ""
-msgid "Save space and find images in the container Registry. remove unneeded tags and keep only the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
+msgid "Save storage space by automatically deleting tags from the container registry and keeping the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
msgstr ""
msgid "Saving"
@@ -29363,6 +29772,9 @@ msgstr ""
msgid "Search or filter results…"
msgstr ""
+msgid "Search or jump to..."
+msgstr ""
+
msgid "Search project"
msgstr ""
@@ -29423,16 +29835,16 @@ msgstr ""
msgid "SearchCodeResults|of %{link_to_project}"
msgstr ""
-msgid "SearchResults|Showing %{count} %{scope} for%{term_element}"
+msgid "SearchResults|Showing %{count} %{scope} for %{term_element}"
msgstr ""
-msgid "SearchResults|Showing %{count} %{scope} for%{term_element} in your personal and project snippets"
+msgid "SearchResults|Showing %{count} %{scope} for %{term_element} in your personal and project snippets"
msgstr ""
-msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for%{term_element}"
+msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for %{term_element}"
msgstr ""
-msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for%{term_element} in your personal and project snippets"
+msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for %{term_element} in your personal and project snippets"
msgstr ""
msgid "SearchResults|code result"
@@ -29514,6 +29926,9 @@ msgstr ""
msgid "Secret Detection"
msgstr ""
+msgid "Secret access key"
+msgstr ""
+
msgid "Secret token"
msgstr ""
@@ -29553,9 +29968,6 @@ msgstr ""
msgid "SecurityApprovals|A merge request approval is required when the license compliance report contains a denied license."
msgstr ""
-msgid "SecurityApprovals|Configurable if security scanners are enabled. %{linkStart}Learn more.%{linkEnd}"
-msgstr ""
-
msgid "SecurityApprovals|Coverage-Check"
msgstr ""
@@ -29568,24 +29980,18 @@ msgstr ""
msgid "SecurityApprovals|Learn more about Vulnerability-Check"
msgstr ""
-msgid "SecurityApprovals|License Scanning must be enabled. %{linkStart}Learn more%{linkEnd}."
-msgstr ""
-
msgid "SecurityApprovals|License-Check"
msgstr ""
msgid "SecurityApprovals|Requires approval for Denied licenses. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}More information%{linkEnd}"
+msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "SecurityApprovals|Requires approval for vulnerabilities. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
-msgid "SecurityApprovals|Test coverage must be enabled. %{linkStart}Learn more%{linkEnd}."
-msgstr ""
-
msgid "SecurityApprovals|Vulnerability-Check"
msgstr ""
@@ -29649,6 +30055,12 @@ msgstr ""
msgid "SecurityConfiguration|Immediately begin risk analysis and remediation with application security features. Start with SAST and Secret Detection, available to all plans. Upgrade to Ultimate to get all features, including:"
msgstr ""
+msgid "SecurityConfiguration|Manage corpus"
+msgstr ""
+
+msgid "SecurityConfiguration|Manage corpus files used as mutation sources in coverage fuzzing."
+msgstr ""
+
msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
msgstr ""
@@ -29703,6 +30115,12 @@ msgstr ""
msgid "SecurityOrchestration|Action"
msgstr ""
+msgid "SecurityOrchestration|Actions"
+msgstr ""
+
+msgid "SecurityOrchestration|Add rule"
+msgstr ""
+
msgid "SecurityOrchestration|All policies"
msgstr ""
@@ -29736,9 +30154,6 @@ msgstr ""
msgid "SecurityOrchestration|Network"
msgstr ""
-msgid "SecurityOrchestration|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
-msgstr ""
-
msgid "SecurityOrchestration|New policy"
msgstr ""
@@ -29754,6 +30169,9 @@ msgstr ""
msgid "SecurityOrchestration|Policy editor"
msgstr ""
+msgid "SecurityOrchestration|Policy preview"
+msgstr ""
+
msgid "SecurityOrchestration|Policy status"
msgstr ""
@@ -29763,6 +30181,9 @@ msgstr ""
msgid "SecurityOrchestration|Rule"
msgstr ""
+msgid "SecurityOrchestration|Rules"
+msgstr ""
+
msgid "SecurityOrchestration|Scan Execution"
msgstr ""
@@ -29856,6 +30277,9 @@ msgstr ""
msgid "SecurityReports|Create issue"
msgstr ""
+msgid "SecurityReports|Development vulnerabilities"
+msgstr ""
+
msgid "SecurityReports|Dismiss vulnerability"
msgstr ""
@@ -29871,6 +30295,9 @@ msgstr ""
msgid "SecurityReports|Download results"
msgstr ""
+msgid "SecurityReports|Download scanned URLs"
+msgstr ""
+
msgid "SecurityReports|Download scanned resources"
msgstr ""
@@ -29994,6 +30421,9 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
+msgid "SecurityReports|The Vulnerability Report shows the results of the lastest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "SecurityReports|The security reports below contain one or more vulnerability findings that could not be parsed and were not recorded. Download the artifacts in the job output to investigate. Ensure any security report created conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
msgstr ""
@@ -30135,10 +30565,10 @@ msgstr ""
msgid "Select a repository"
msgstr ""
-msgid "Select a role"
+msgid "Select a repository containing templates for common files."
msgstr ""
-msgid "Select a shared template repository for all projects on this instance."
+msgid "Select a role"
msgstr ""
msgid "Select a template repository"
@@ -30216,6 +30646,9 @@ msgstr ""
msgid "Select project to choose zone"
msgstr ""
+msgid "Select project to create issue"
+msgstr ""
+
msgid "Select projects"
msgstr ""
@@ -30333,6 +30766,9 @@ msgstr ""
msgid "Send emails to help guide new users through the onboarding process."
msgstr ""
+msgid "Send emails to users upon account deactivation."
+msgstr ""
+
msgid "Send message"
msgstr ""
@@ -30351,6 +30787,9 @@ msgstr ""
msgid "Send service data"
msgstr ""
+msgid "Sentry"
+msgstr ""
+
msgid "Sentry API URL"
msgstr ""
@@ -30465,6 +30904,9 @@ msgstr ""
msgid "Service"
msgstr ""
+msgid "Service Accounts keys are required to authorize GitLab to deploy your Google Cloud project."
+msgstr ""
+
msgid "Service Desk"
msgstr ""
@@ -30537,15 +30979,15 @@ msgstr ""
msgid "Set a password on your account to pull or push via %{protocol}."
msgstr ""
-msgid "Set a template repository for projects in this group"
-msgstr ""
-
msgid "Set access permissions for this token."
msgstr ""
msgid "Set an instance-wide domain that will be available to all clusters when installing Knative."
msgstr ""
+msgid "Set any rate limit to %{code_open}0%{code_close} to disable the limit."
+msgstr ""
+
msgid "Set default and restrict visibility levels. Configure import sources and git access protocol."
msgstr ""
@@ -30558,7 +31000,7 @@ msgstr ""
msgid "Set limit to 0 to allow any file size."
msgstr ""
-msgid "Set max session time for web terminal."
+msgid "Set limits for web and API requests."
msgstr ""
msgid "Set milestone"
@@ -30567,15 +31009,18 @@ msgstr ""
msgid "Set new password"
msgstr ""
-msgid "Set notification email for abuse reports."
+msgid "Set parent epic to an epic"
msgstr ""
-msgid "Set parent epic to an epic"
+msgid "Set per-user rate limits for imports and exports of projects and groups."
msgstr ""
msgid "Set projects and maximum size limits, session duration, user options, and check feature availability for namespace plan."
msgstr ""
+msgid "Set rate limits for package registry API requests that supersede the general user and IP rate limits."
+msgstr ""
+
msgid "Set severity"
msgstr ""
@@ -30594,15 +31039,24 @@ msgstr ""
msgid "Set the default branch for this project. All merge requests and commits are made against this branch unless you specify a different one."
msgstr ""
+msgid "Set the default expiration time for job artifacts in all projects. Set to %{code_open}0%{code_close} to never expire artifacts by default. If no unit is written, it defaults to seconds. For example, these are all equivalent: %{code_open}3600%{code_close}, %{code_open}60 minutes%{code_close}, or %{code_open}one hour%{code_close}."
+msgstr ""
+
msgid "Set the due date to %{due_date}."
msgstr ""
msgid "Set the iteration to %{iteration_reference}."
msgstr ""
+msgid "Set the maximum session time for a web terminal."
+msgstr ""
+
msgid "Set the milestone to %{milestone_reference}."
msgstr ""
+msgid "Set the per-user rate limit for notes created by web or API requests."
+msgstr ""
+
msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
msgstr ""
@@ -30804,6 +31258,9 @@ msgstr ""
msgid "Show Pipeline IID"
msgstr ""
+msgid "Show all %{issuable_type}."
+msgstr ""
+
msgid "Show all activity"
msgstr ""
@@ -30855,15 +31312,9 @@ msgstr ""
msgid "Show list"
msgstr ""
-msgid "Show me advanced features"
-msgstr ""
-
msgid "Show me how to add a pipeline"
msgstr ""
-msgid "Show me the basics"
-msgstr ""
-
msgid "Show one file at a time"
msgstr ""
@@ -30904,15 +31355,15 @@ msgstr ""
msgid "Showing %{pageSize} of %{total} %{issuableType}"
msgstr ""
-msgid "Showing %{pageSize} of %{total} issues"
-msgstr ""
-
msgid "Showing all epics"
msgstr ""
msgid "Showing all issues"
msgstr ""
+msgid "Showing data for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
+msgstr ""
+
msgid "Showing data for workflow items created in this date range. Date range cannot exceed %{maxDateRange} days."
msgstr ""
@@ -30952,6 +31403,15 @@ msgstr ""
msgid "Sidebar|Weight"
msgstr ""
+msgid "Sidekiq job compression threshold (bytes)"
+msgstr ""
+
+msgid "Sidekiq job size limit (bytes)"
+msgstr ""
+
+msgid "Sidekiq job size limits"
+msgstr ""
+
msgid "Sign in"
msgstr ""
@@ -31072,6 +31532,9 @@ msgstr ""
msgid "Site profile not found for given parameters"
msgstr ""
+msgid "Sites"
+msgstr ""
+
msgid "Size"
msgstr ""
@@ -31102,19 +31565,22 @@ msgstr ""
msgid "SlackIntegration|Sends notifications about project events to Slack channels."
msgstr ""
-msgid "SlackService|2. Paste the %{strong_open}Token%{strong_close} into the field below"
+msgid "SlackService|1. %{slash_command_link_start}Add a slash command%{slash_command_link_end} in your Slack team using this information:"
msgstr ""
-msgid "SlackService|3. Select the %{strong_open}Active%{strong_close} checkbox, press %{strong_open}Save changes%{strong_close} and start using GitLab inside Slack!"
+msgid "SlackService|2. Paste the token from Slack in the %{strong_open}Token%{strong_close} field below."
msgstr ""
-msgid "SlackService|Fill in the word that works best for your team."
+msgid "SlackService|3. Select the %{strong_open}Active%{strong_close} checkbox, select %{strong_open}Save changes%{strong_close}, and start using slash commands in Slack!"
+msgstr ""
+
+msgid "SlackService|After setup, get a list of available Slack slash commands by entering"
msgstr ""
-msgid "SlackService|See list of available commands in Slack after setting up this service, by entering"
+msgid "SlackService|Fill in the word that works best for your team."
msgstr ""
-msgid "SlackService|This service allows users to perform common operations on this project by entering slash commands in Slack."
+msgid "SlackService|Perform common operations in this project by entering slash commands in Slack."
msgstr ""
msgid "Slice multiplier"
@@ -31180,7 +31646,7 @@ msgstr ""
msgid "Some child epics may be hidden due to applied filters"
msgstr ""
-msgid "Some common domains are not allowed. %{read_more_link}."
+msgid "Some common domains are not allowed. %{learn_more_link}."
msgstr ""
msgid "Some of the designs you tried uploading did not change:"
@@ -31264,9 +31730,6 @@ msgstr ""
msgid "Something went wrong while exporting requirements"
msgstr ""
-msgid "Something went wrong while fetching %{listType} list"
-msgstr ""
-
msgid "Something went wrong while fetching branches"
msgstr ""
@@ -31321,15 +31784,9 @@ msgstr ""
msgid "Something went wrong while merging this merge request. Please try again."
msgstr ""
-msgid "Something went wrong while moving issues."
-msgstr ""
-
msgid "Something went wrong while obtaining the Let's Encrypt certificate."
msgstr ""
-msgid "Something went wrong while performing the action."
-msgstr ""
-
msgid "Something went wrong while promoting the issue to an epic. Please try again."
msgstr ""
@@ -31657,7 +32114,10 @@ msgstr ""
msgid "SourcegraphPreferences|Uses a custom %{linkStart}Sourcegraph instance%{linkEnd}."
msgstr ""
-msgid "Spam Check API Key"
+msgid "Spam Check"
+msgstr ""
+
+msgid "Spam Check API key"
msgstr ""
msgid "Spam Logs"
@@ -31675,7 +32135,7 @@ msgstr ""
msgid "Specified URL cannot be used: \"%{reason}\""
msgstr ""
-msgid "Specify an e-mail address regex pattern to identify default internal users."
+msgid "Specify an email address regex pattern to identify default internal users."
msgstr ""
msgid "Speed up your pipelines with Needs relationships"
@@ -31930,7 +32390,7 @@ msgstr ""
msgid "StatusCheck|An error occurred fetching the status checks."
msgstr ""
-msgid "StatusCheck|Apply this status check to any branch or a specific protected branch."
+msgid "StatusCheck|Apply this status check to all branches or a specific protected branch."
msgstr ""
msgid "StatusCheck|Check for a status response in Merge Requests. Failures do not block merges. %{link_start}Learn more%{link_end}."
@@ -32269,6 +32729,9 @@ msgstr ""
msgid "Subscriptions"
msgstr ""
+msgid "Subscription|Your subscription for %{strong}%{namespace_name}%{strong_close} has expired and you are now on %{pricing_link_start}the GitLab Free tier%{pricing_link_end}. Don't worry, your data is safe. Get in touch with our support team (%{support_email}). They'll gladly help with your subscription renewal."
+msgstr ""
+
msgid "Subtracted"
msgstr ""
@@ -32497,6 +32960,9 @@ msgstr ""
msgid "SuperSonics|Plan"
msgstr ""
+msgid "SuperSonics|Please agree to the Subscription Agreement"
+msgstr ""
+
msgid "SuperSonics|Ready to get started? A GitLab plan is ideal for scaling organizations and for multi team usage."
msgstr ""
@@ -32527,6 +32993,9 @@ msgstr ""
msgid "SuperSonics|The activation code is not valid. Please make sure to copy it exactly from the Customers Portal or confirmation email. Learn more about %{linkStart}activating your subscription%{linkEnd}."
msgstr ""
+msgid "SuperSonics|The activation code should be a 24-character alphanumeric string"
+msgstr ""
+
msgid "SuperSonics|There is a connectivity issue."
msgstr ""
@@ -32569,9 +33038,15 @@ msgstr ""
msgid "SuperSonics|You do not have an active subscription"
msgstr ""
+msgid "SuperSonics|You have successfully added a license that activates on %{date}. Please see the subscription history table below for more details."
+msgstr ""
+
msgid "SuperSonics|You'll be charged for %{trueUpLinkStart}users over license%{trueUpLinkEnd} on a quarterly or annual basis, depending on the terms of your agreement."
msgstr ""
+msgid "SuperSonics|Your future dated license was successfully added"
+msgstr ""
+
msgid "SuperSonics|Your subscription"
msgstr ""
@@ -32824,7 +33299,7 @@ msgstr ""
msgid "Template to append to all Service Desk issues"
msgstr ""
-msgid "TemplateRepository|Select a repository to make its templates available to all projects. %{link_start}What should the repository contain?%{link_end} "
+msgid "TemplateRepository|Create common files more quickly, and standardize their format."
msgstr ""
msgid "Templates"
@@ -33030,7 +33505,7 @@ msgstr ""
msgid "TestCases|Search test cases"
msgstr ""
-msgid "TestCases|Something went wrong while adding test case to Todo."
+msgid "TestCases|Something went wrong while adding test case to a to-do item."
msgstr ""
msgid "TestCases|Something went wrong while creating a test case."
@@ -33042,7 +33517,7 @@ msgstr ""
msgid "TestCases|Something went wrong while fetching test cases list."
msgstr ""
-msgid "TestCases|Something went wrong while marking test case todo as done."
+msgid "TestCases|Something went wrong while marking test case to-do item as done."
msgstr ""
msgid "TestCases|Something went wrong while moving test case."
@@ -33162,7 +33637,7 @@ msgstr ""
msgid "Thanks for your purchase!"
msgstr ""
-msgid "That is ok, I do not want to renew"
+msgid "That's OK, I don't want to renew"
msgstr ""
msgid "That's it, well done!"
@@ -33185,7 +33660,7 @@ msgid_plural "The %{type} contains the following errors:"
msgstr[0] ""
msgstr[1] ""
-msgid "The API key used by GitLab for accessing the Spam Check service endpoint"
+msgid "The API key used by GitLab for accessing the Spam Check service endpoint."
msgstr ""
msgid "The GitLab subscription service (customers.gitlab.com) is currently experiencing an outage. You can monitor the status and get updates at %{linkStart}status.gitlab.com%{linkEnd}."
@@ -33224,9 +33699,6 @@ msgstr ""
msgid "The URL to use for connecting to Elasticsearch. Use a comma-separated list to support clustering (e.g., \"http://localhost:9200, http://localhost:9201\")."
msgstr ""
-msgid "The Vulnerability Report shows the results of the last successful pipeline run on the default branch."
-msgstr ""
-
msgid "The X509 Certificate to use when mutual TLS is required to communicate with the external authorization service. If left blank, the server certificate is still validated when accessing over HTTPS."
msgstr ""
@@ -33284,9 +33756,6 @@ msgstr ""
msgid "The default branch for this project has been changed. Please update your bookmarks."
msgstr ""
-msgid "The default expiration time for job artifacts. 0 for unlimited. The default unit is in seconds, but you can use other units, for example %{code_open}4 mins 2 sec%{code_close}, %{code_open}2h42min%{code_close}."
-msgstr ""
-
msgid "The dependency list details information about the components used within your project."
msgstr ""
@@ -33478,9 +33947,6 @@ msgstr ""
msgid "The merge conflicts for this merge request have already been resolved. Please return to the merge request."
msgstr ""
-msgid "The merge request can now be merged."
-msgstr ""
-
msgid "The metric must be one of %{metrics}."
msgstr ""
@@ -33856,7 +34322,7 @@ msgstr ""
msgid "There was a problem updating the keep latest artifacts setting."
msgstr ""
-msgid "There was an error %{message} todo."
+msgid "There was an error %{message} to-do item."
msgstr ""
msgid "There was an error adding a To Do."
@@ -33895,6 +34361,9 @@ msgstr ""
msgid "There was an error fetching projects"
msgstr ""
+msgid "There was an error fetching search autocomplete suggestions"
+msgstr ""
+
msgid "There was an error fetching stage total counts"
msgstr ""
@@ -34219,6 +34688,9 @@ msgstr ""
msgid "This field is required."
msgstr ""
+msgid "This form is disabled in preview"
+msgstr ""
+
msgid "This group"
msgstr ""
@@ -34240,9 +34712,6 @@ msgstr ""
msgid "This group is linked to a subscription"
msgstr ""
-msgid "This group, including all subgroups, projects and git repositories, will be reachable from only the specified IP address ranges."
-msgstr ""
-
msgid "This group, its subgroups and projects has been scheduled for removal on %{date}."
msgstr ""
@@ -34522,9 +34991,6 @@ msgstr ""
msgid "This user cannot be unlocked manually from GitLab"
msgstr ""
-msgid "This user does not have a pending request"
-msgstr ""
-
msgid "This user has an unconfirmed email address (%{email}). You may force a confirmation."
msgstr ""
@@ -34633,9 +35099,6 @@ msgstr ""
msgid "ThreatMonitoring|Packet Activity"
msgstr ""
-msgid "ThreatMonitoring|Policies"
-msgstr ""
-
msgid "ThreatMonitoring|Requests"
msgstr ""
@@ -34687,6 +35150,12 @@ msgstr ""
msgid "ThreatMonitoring|View documentation"
msgstr ""
+msgid "Threshold in bytes at which to compress Sidekiq job arguments."
+msgstr ""
+
+msgid "Threshold in bytes at which to reject Sidekiq jobs. Set this to 0 to if you don't want to limit Sidekiq jobs."
+msgstr ""
+
msgid "Throughput"
msgstr ""
@@ -34696,6 +35165,9 @@ msgstr ""
msgid "Time"
msgstr ""
+msgid "Time (in hours) that users are allowed to skip forced configuration of two-factor authentication."
+msgstr ""
+
msgid "Time Spent"
msgstr ""
@@ -34762,7 +35234,7 @@ msgstr ""
msgid "TimeTrackingEstimated|Est"
msgstr ""
-msgid "TimeTracking|%{startTag}Spent: %{endTag}%{timeSpentHumanReadable}"
+msgid "TimeTracking|%{spentStart}Spent: %{spentEnd}"
msgstr ""
msgid "TimeTracking|Estimated:"
@@ -34976,6 +35448,9 @@ msgstr ""
msgid "To access this domain create a new DNS record"
msgstr ""
+msgid "To add a custom suffix, set up a Service Desk email address. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "To add an SSH key you need to %{generate_link_start}generate one%{link_end} or use an %{existing_link_start}existing key%{link_end}."
msgstr ""
@@ -34997,13 +35472,16 @@ msgstr ""
msgid "To connect an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To continue using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
+msgstr ""
+
msgid "To continue, you need to select the link in the confirmation email we sent to verify your email address. If you didn't get our email, select %{strongStart}Resend confirmation email.%{strongEnd}"
msgstr ""
msgid "To define internal users, first enable new users set to external"
msgstr ""
-msgid "To enable Registration Features, make sure \"Enable service ping\" is checked."
+msgid "To enable Registration Features, first enable Service Ping."
msgstr ""
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
@@ -35030,7 +35508,7 @@ msgstr ""
msgid "To get started, use the link below to confirm your account."
msgstr ""
-msgid "To help improve GitLab and its user experience, GitLab will periodically collect usage information."
+msgid "To help improve GitLab and its user experience, GitLab periodically collects usage information."
msgstr ""
msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
@@ -35063,7 +35541,7 @@ msgstr ""
msgid "To preserve performance only %{strong_open}%{display_size} of %{real_size}%{strong_close} files are displayed."
msgstr ""
-msgid "To protect this issue's confidentiality, %{forkLink} and set the fork's visibility to private."
+msgid "To protect this issue's confidentiality, %{linkStart}fork this project%{linkEnd} and set the fork's visibility to private."
msgstr ""
msgid "To protect this issue's confidentiality, a private fork of this project was selected."
@@ -35096,12 +35574,15 @@ msgstr ""
msgid "To set up SAML authentication for your group through an identity provider like Azure, Okta, Onelogin, Ping Identity, or your custom SAML 2.0 provider:"
msgstr ""
-msgid "To set up this service:"
+msgid "To set up this integration:"
msgstr ""
msgid "To specify the notification level per project of a group you belong to, you need to visit project page and change notification level there."
msgstr ""
+msgid "To start using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
+msgstr ""
+
msgid "To unsubscribe from this issue, please paste the following link into your browser:"
msgstr ""
@@ -35689,9 +36170,6 @@ msgstr ""
msgid "Unable to fetch branches list, please close the form and try again"
msgstr ""
-msgid "Unable to fetch unscanned projects"
-msgstr ""
-
msgid "Unable to fetch vulnerable projects"
msgstr ""
@@ -35746,6 +36224,15 @@ msgstr ""
msgid "Unable to update this issue at this time."
msgstr ""
+msgid "Unapprove a merge request"
+msgstr ""
+
+msgid "Unapprove the current merge request."
+msgstr ""
+
+msgid "Unapproved the current merge request."
+msgstr ""
+
msgid "Unarchive project"
msgstr ""
@@ -35758,16 +36245,13 @@ msgstr ""
msgid "Unassigned"
msgstr ""
-msgid "Unauthenticated API request rate limit"
-msgstr ""
-
-msgid "Unauthenticated rate limit period in seconds"
+msgid "Unauthenticated API rate limit period in seconds"
msgstr ""
-msgid "Unauthenticated request rate limit"
+msgid "Unauthenticated requests"
msgstr ""
-msgid "Unauthenticated requests"
+msgid "Unauthenticated web rate limit period in seconds"
msgstr ""
msgid "Undo"
@@ -35869,18 +36353,6 @@ msgstr ""
msgid "Unresolved"
msgstr ""
-msgid "UnscannedProjects|15 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|30 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|5 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|60 or more days"
-msgstr ""
-
msgid "Unschedule job"
msgstr ""
@@ -36100,6 +36572,9 @@ msgstr ""
msgid "UsageQuota|%{help_link_start}Shared runners%{help_link_end} are disabled, so there are no limits set on pipeline usage"
msgstr ""
+msgid "UsageQuota|%{linkTitle} help link"
+msgstr ""
+
msgid "UsageQuota|%{percentageLeft} of purchased storage is available"
msgstr ""
@@ -36109,6 +36584,9 @@ msgstr ""
msgid "UsageQuota|Artifacts is a sum of build and pipeline artifacts."
msgstr ""
+msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
+msgstr ""
+
msgid "UsageQuota|Buy additional minutes"
msgstr ""
@@ -36118,9 +36596,21 @@ msgstr ""
msgid "UsageQuota|CI minutes usage by project"
msgstr ""
+msgid "UsageQuota|Code packages and container images."
+msgstr ""
+
msgid "UsageQuota|Current period usage"
msgstr ""
+msgid "UsageQuota|File attachments and smaller design graphics."
+msgstr ""
+
+msgid "UsageQuota|Git repository, managed by the Gitaly service."
+msgstr ""
+
+msgid "UsageQuota|Includes project registry, artifacts, packages, wiki, uploads and other items."
+msgstr ""
+
msgid "UsageQuota|Increase storage temporarily"
msgstr ""
@@ -36139,6 +36629,9 @@ msgstr ""
msgid "UsageQuota|Packages"
msgstr ""
+msgid "UsageQuota|Pipeline artifacts and job artifacts, created with CI/CD."
+msgstr ""
+
msgid "UsageQuota|Pipelines"
msgstr ""
@@ -36157,6 +36650,9 @@ msgstr ""
msgid "UsageQuota|Seats"
msgstr ""
+msgid "UsageQuota|Shared bits of code and text."
+msgstr ""
+
msgid "UsageQuota|Snippets"
msgstr ""
@@ -36166,6 +36662,12 @@ msgstr ""
msgid "UsageQuota|Storage"
msgstr ""
+msgid "UsageQuota|Storage type"
+msgstr ""
+
+msgid "UsageQuota|There is a known issue with Artifact storage where the total could be incorrect for some projects. More details and progress are available in %{warningLinkStart}the epic%{warningLinkEnd}."
+msgstr ""
+
msgid "UsageQuota|This is the total amount of storage used across your projects within this namespace."
msgstr ""
@@ -36205,6 +36707,9 @@ msgstr ""
msgid "UsageQuota|Usage"
msgstr ""
+msgid "UsageQuota|Usage Breakdown"
+msgstr ""
+
msgid "UsageQuota|Usage Quotas"
msgstr ""
@@ -36229,6 +36734,9 @@ msgstr ""
msgid "UsageQuota|Wiki"
msgstr ""
+msgid "UsageQuota|Wiki content."
+msgstr ""
+
msgid "UsageQuota|Wikis"
msgstr ""
@@ -36445,7 +36953,10 @@ msgstr ""
msgid "User Settings"
msgstr ""
-msgid "User and IP Rate Limits"
+msgid "User and IP rate limits"
+msgstr ""
+
+msgid "User does not have a pending request"
msgstr ""
msgid "User identity was successfully created."
@@ -36742,6 +37253,9 @@ msgstr ""
msgid "Users can launch a development environment from a GitLab browser tab when the %{linkStart}Gitpod%{linkEnd} integration is enabled."
msgstr ""
+msgid "Users can reactivate their account by signing in."
+msgstr ""
+
msgid "Users can render diagrams in AsciiDoc, Markdown, reStructuredText, and Textile documents using Kroki."
msgstr ""
@@ -36757,6 +37271,9 @@ msgstr ""
msgid "Users requesting access to"
msgstr ""
+msgid "Users to exclude from the rate limit"
+msgstr ""
+
msgid "Users were successfully added."
msgstr ""
@@ -36778,6 +37295,9 @@ msgstr ""
msgid "UsersSelect|Unassigned"
msgstr ""
+msgid "Uses GitLab as a lightweight alternative to Sentry."
+msgstr ""
+
msgid "Using %{code_start}::%{code_end} denotes a %{link_start}scoped label set%{link_end}"
msgstr ""
@@ -36808,10 +37328,7 @@ msgstr ""
msgid "Value Stream Analytics can help you determine your team’s velocity"
msgstr ""
-msgid "Value Stream Analytics gives an overview of how much time it takes to go from idea to production in your project."
-msgstr ""
-
-msgid "Value may contain a variable reference"
+msgid "Value might contain a variable reference"
msgstr ""
msgid "Value stream"
@@ -36877,10 +37394,10 @@ msgstr ""
msgid "ValueStream|The Default Value Stream cannot be deleted"
msgstr ""
-msgid "Variable"
+msgid "Values that contain the %{codeStart}$%{codeEnd} character can be considered a variable reference and expanded. %{docsLinkStart}Learn more.%{docsLinkEnd}"
msgstr ""
-msgid "Variable references indicated by %{codeStart}$%{codeEnd} may be expanded. If this is not what you want, consider %{docsLinkStart}using a workaround to prevent expansion%{docsLinkEnd}."
+msgid "Variable"
msgstr ""
msgid "Variable will be masked in job logs."
@@ -37285,6 +37802,9 @@ msgstr ""
msgid "Vulnerability|Evidence"
msgstr ""
+msgid "Vulnerability|False positive detected"
+msgstr ""
+
msgid "Vulnerability|File"
msgstr ""
@@ -37327,6 +37847,9 @@ msgstr ""
msgid "Vulnerability|Status"
msgstr ""
+msgid "Vulnerability|The scanner determined this vulnerability to be a false positive. Verify the evaluation before changing its status. %{linkStart}Learn more about false positive detection.%{linkEnd}"
+msgstr ""
+
msgid "Vulnerability|The unmodified response is the original response that had no mutations done to the request"
msgstr ""
@@ -37651,9 +38174,6 @@ msgstr ""
msgid "Welcome to GitLab,%{br_tag}%{name}!"
msgstr ""
-msgid "Welcome to the guided GitLab tour"
-msgstr ""
-
msgid "Welcome, %{name}!"
msgstr ""
@@ -37672,9 +38192,6 @@ msgstr ""
msgid "What are you searching for?"
msgstr ""
-msgid "What describes you best?"
-msgstr ""
-
msgid "What does this command do?"
msgstr ""
@@ -37696,13 +38213,13 @@ msgstr ""
msgid "What is your job title? (optional)"
msgstr ""
-msgid "What will you use this group for?"
+msgid "What templates can I create?"
msgstr ""
-msgid "What's new"
+msgid "What will you use this group for?"
msgstr ""
-msgid "What’s your experience level?"
+msgid "What's new"
msgstr ""
msgid "When a deployment job is successful, skip older deployment jobs that are still pending."
@@ -37714,6 +38231,9 @@ msgstr ""
msgid "When an event in GitLab triggers a webhook, you can use the request details to figure out if something went wrong."
msgstr ""
+msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+msgstr ""
+
msgid "When inactive, an external authentication provider must be used."
msgstr ""
@@ -37737,6 +38257,9 @@ msgstr ""
msgid "When:"
msgstr ""
+msgid "Which API requests are affected?"
+msgstr ""
+
msgid "While it's rare to have no vulnerabilities, it can happen. In any event, we ask that you please double check your settings to make sure you've set up your dashboard correctly."
msgstr ""
@@ -38016,6 +38539,9 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|Work Items"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -38091,6 +38617,9 @@ msgstr ""
msgid "You are already a member of this %{member_source}."
msgstr ""
+msgid "You are already impersonating another user"
+msgstr ""
+
msgid "You are an admin, which means granting access to %{client_name} will allow them to interact with GitLab as an admin as well. Proceed with caution."
msgstr ""
@@ -38193,6 +38722,9 @@ msgstr ""
msgid "You can also use project access tokens with Git to authenticate over HTTP(S). %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "You can always change your URL later"
+msgstr ""
+
msgid "You can always edit this later"
msgstr ""
@@ -38349,10 +38881,10 @@ msgstr ""
msgid "You can’t %{tag_start}edit%{tag_end} files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
-msgid "You could not create a new trigger."
+msgid "You can’t edit files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
-msgid "You didn't renew your subscription for %{strong}%{namespace_name}%{strong_close} so it was downgraded to the free plan."
+msgid "You could not create a new trigger."
msgstr ""
msgid "You do not have any subscriptions yet"
@@ -38520,6 +39052,12 @@ msgstr ""
msgid "You must provide your current password in order to change it."
msgstr ""
+msgid "You must sign in to search for specific projects."
+msgstr ""
+
+msgid "You must sign in to search for specific terms."
+msgstr ""
+
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
@@ -38547,6 +39085,9 @@ msgstr ""
msgid "You need to upload a GitLab project export archive (ending in .gz)."
msgstr ""
+msgid "You need to verify your primary email first before enabling Two-Factor Authentication."
+msgstr ""
+
msgid "You successfully declined the invitation"
msgstr ""
@@ -38655,10 +39196,10 @@ msgstr ""
msgid "Your %{host} account was signed in to from a new location"
msgstr ""
-msgid "Your %{strong}%{plan_name}%{strong_close} subscription for %{strong}%{namespace_name}%{strong_close} will expire on %{strong}%{expires_on}%{strong_close}."
+msgid "Your %{strong}%{plan_name}%{strong_close} subscription expires on %{strong}%{expires_on}%{strong_close}. After that date, you cannot create issues or merge requests, or use many other features."
msgstr ""
-msgid "Your %{strong}%{plan_name}%{strong_close} subscription will expire on %{strong}%{expires_on}%{strong_close}. After that, you will not be able to create issues or merge requests as well as many other features."
+msgid "Your %{strong}%{plan_name}%{strong_close} subscription for %{strong}%{namespace_name}%{strong_close} will expire on %{strong}%{expires_on}%{strong_close}."
msgstr ""
msgid "Your CI/CD configuration syntax is invalid. View Lint tab for more details."
@@ -38682,7 +39223,7 @@ msgstr ""
msgid "Your GPG keys (%{count})"
msgstr ""
-msgid "Your GitLab account has been locked due to an excessive amount of unsuccessful sign in attempts. Your account will automatically unlock in %{duration} or you may click the link below to unlock now."
+msgid "Your GitLab account has been locked due to an excessive number of unsuccessful sign in attempts. You can wait for your account to automatically unlock in %{duration} or you can click the link below to unlock now."
msgstr ""
msgid "Your GitLab account request has been approved!"
@@ -38793,6 +39334,9 @@ msgstr ""
msgid "Your commit email is used for web based operations, such as edits and merges."
msgstr ""
+msgid "Your current password is required to register a two-factor authenticator app."
+msgstr ""
+
msgid "Your dashboard has been copied. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
@@ -38892,6 +39436,9 @@ msgstr ""
msgid "Your project limit is %{limit} projects! Please contact your administrator to increase it"
msgstr ""
+msgid "Your project will be created at:"
+msgstr ""
+
msgid "Your projects"
msgstr ""
@@ -38931,11 +39478,10 @@ msgstr ""
msgid "Your subscription expired!"
msgstr ""
-msgid "Your subscription has been downgraded."
-msgstr ""
-
-msgid "Your subscription will expire in %{remaining_days}."
-msgstr ""
+msgid "Your subscription will expire in %{remaining_days} day."
+msgid_plural "Your subscription will expire in %{remaining_days} days."
+msgstr[0] ""
+msgstr[1] ""
msgid "Your username is %{username}."
msgstr ""
@@ -39142,6 +39688,9 @@ msgstr ""
msgid "cannot merge"
msgstr ""
+msgid "cannot not be used for user namespace"
+msgstr ""
+
msgid "ciReport|%{degradedNum} degraded"
msgstr ""
@@ -39465,6 +40014,9 @@ msgstr ""
msgid "created %{timeAgo}"
msgstr ""
+msgid "created %{timeAgo} by %{author}"
+msgstr ""
+
msgid "created by"
msgstr ""
@@ -39509,9 +40061,6 @@ msgstr ""
msgid "does not have a supported extension. Only %{extension_list} are supported"
msgstr ""
-msgid "domain is not authorized for sign-up."
-msgstr ""
-
msgid "download it"
msgstr ""
@@ -39529,18 +40078,13 @@ msgstr ""
msgid "email '%{email}' is not a verified email."
msgstr ""
-msgid "email does not match the allowed domain of %{email_domains}"
-msgid_plural "email does not match the allowed domains: %{email_domains}"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "enabled"
msgstr ""
msgid "encrypted: needs to be a :required, :optional or :migrating!"
msgstr ""
-msgid "ending with MIME type format is not allowed."
+msgid "ending with a reserved file extension is not allowed."
msgstr ""
msgid "entries cannot be larger than 255 characters"
@@ -39564,6 +40108,9 @@ msgstr ""
msgid "estimateCommand|%{slash_command} overwrites the total estimated time."
msgstr ""
+msgid "example.com"
+msgstr ""
+
msgid "exceeds the limit of %{bytes} bytes"
msgstr ""
@@ -39614,9 +40161,6 @@ msgstr ""
msgid "fork"
msgstr ""
-msgid "fork this project"
-msgstr ""
-
msgid "from"
msgstr ""
@@ -39625,6 +40169,9 @@ msgid_plural "from %d jobs"
msgstr[0] ""
msgstr[1] ""
+msgid "frontmatter"
+msgstr ""
+
msgid "group"
msgstr ""
@@ -39652,6 +40199,9 @@ msgstr ""
msgid "has been completed."
msgstr ""
+msgid "has too deep level of nesting"
+msgstr ""
+
msgid "help"
msgstr ""
@@ -39685,9 +40235,21 @@ msgstr ""
msgid "in"
msgstr ""
+msgid "in Infrastructure :: Kubernetes clusters"
+msgstr ""
+
+msgid "in all GitLab"
+msgstr ""
+
+msgid "in group"
+msgstr ""
+
msgid "in group %{link_to_group}"
msgstr ""
+msgid "in project"
+msgstr ""
+
msgid "in project %{link_to_project}"
msgstr ""
@@ -39729,16 +40291,19 @@ msgstr ""
msgid "is not a valid X509 certificate."
msgstr ""
-msgid "is not allowed since the group is not top-level group."
+msgid "is not allowed for sign-up."
msgstr ""
-msgid "is not allowed. Try again with a different email address, or contact your GitLab admin."
+msgid "is not allowed for this group."
msgstr ""
-msgid "is not allowed. We do not currently support project-level iterations"
+msgid "is not allowed for this project."
+msgstr ""
+
+msgid "is not allowed since the group is not top-level group."
msgstr ""
-msgid "is not from an allowed domain."
+msgid "is not allowed. We do not currently support project-level iterations"
msgstr ""
msgid "is not in the group enforcing Group Managed Account"
@@ -39831,6 +40396,9 @@ msgstr ""
msgid "log in"
msgstr ""
+msgid "managed"
+msgstr ""
+
msgid "manual"
msgstr ""
@@ -39878,6 +40446,9 @@ msgstr ""
msgid "mrWidget| Please restore it or use a different %{missingBranchName} branch"
msgstr ""
+msgid "mrWidget|%{linkStart}Set up now%{linkEnd} to analyze your source code for known security vulnerabilities."
+msgstr ""
+
msgid "mrWidget|%{mergeError}."
msgstr ""
@@ -39958,6 +40529,9 @@ msgid_plural "mrWidget|Closes issues"
msgstr[0] ""
msgstr[1] ""
+msgid "mrWidget|Create issue to resolve all threads"
+msgstr ""
+
msgid "mrWidget|Delete source branch"
msgstr ""
@@ -39967,12 +40541,18 @@ msgstr ""
msgid "mrWidget|Did not close"
msgstr ""
+msgid "mrWidget|Dismiss"
+msgstr ""
+
msgid "mrWidget|Email patches"
msgstr ""
msgid "mrWidget|Failed to load deployment statistics"
msgstr ""
+msgid "mrWidget|Hide %{widget} details"
+msgstr ""
+
msgid "mrWidget|If the %{missingBranchName} branch exists in your local repository, you can merge this merge request manually using the command line"
msgstr ""
@@ -40068,9 +40648,6 @@ msgstr ""
msgid "mrWidget|Request to merge"
msgstr ""
-msgid "mrWidget|Resolve all threads in new issue"
-msgstr ""
-
msgid "mrWidget|Resolve conflicts"
msgstr ""
@@ -40086,6 +40663,9 @@ msgstr ""
msgid "mrWidget|Revoke approval"
msgstr ""
+msgid "mrWidget|SAST and Secret Detection is not enabled."
+msgstr ""
+
msgid "mrWidget|Set by %{merge_author} to be added to the merge train when the pipeline succeeds"
msgstr ""
@@ -40095,6 +40675,9 @@ msgstr ""
msgid "mrWidget|Set by %{merge_author} to start a merge train when the pipeline succeeds"
msgstr ""
+msgid "mrWidget|Show %{widget} details"
+msgstr ""
+
msgid "mrWidget|The changes were merged into"
msgstr ""
@@ -40107,6 +40690,9 @@ msgstr ""
msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure, or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
msgstr ""
+msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure."
+msgstr ""
+
msgid "mrWidget|The source branch has been deleted"
msgstr ""
@@ -40149,6 +40735,9 @@ msgstr ""
msgid "mrWidget|You can merge after removing denied licenses"
msgstr ""
+msgid "mrWidget|You can only merge once this merge request is approved."
+msgstr ""
+
msgid "mrWidget|Your password"
msgstr ""
@@ -40185,6 +40774,9 @@ msgstr ""
msgid "must be less than the limit of %{tag_limit} tags"
msgstr ""
+msgid "must be set for a project namespace"
+msgstr ""
+
msgid "must be unique by status and elapsed time within a policy"
msgstr ""
@@ -40294,6 +40886,9 @@ msgstr ""
msgid "pipeline"
msgstr ""
+msgid "pipeline schedules documentation"
+msgstr ""
+
msgid "pod_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
msgstr ""
@@ -40343,16 +40938,25 @@ msgstr ""
msgid "project name"
msgstr ""
+msgid "project namespace cannot be the parent of another namespace"
+msgstr ""
+
msgid "projects"
msgstr ""
msgid "quick actions"
msgstr ""
-msgid "reCAPTCHA Private Key"
+msgid "reCAPTCHA"
+msgstr ""
+
+msgid "reCAPTCHA helps prevent credential stuffing."
msgstr ""
-msgid "reCAPTCHA Site Key"
+msgid "reCAPTCHA private key"
+msgstr ""
+
+msgid "reCAPTCHA site key"
msgstr ""
msgid "recent activity"
@@ -40579,6 +41183,9 @@ msgstr ""
msgid "user avatar"
msgstr ""
+msgid "user namespace cannot be the parent of another namespace"
+msgstr ""
+
msgid "user preferences"
msgstr ""
@@ -40671,3 +41278,9 @@ msgstr ""
msgid "your settings"
msgstr ""
+msgid "{group}"
+msgstr ""
+
+msgid "{project}"
+msgstr ""
+
diff --git a/locale/hr_HR/gitlab.po b/locale/hr_HR/gitlab.po
index 823d66635af..510343664e1 100644
--- a/locale/hr_HR/gitlab.po
+++ b/locale/hr_HR/gitlab.po
@@ -14,10 +14,7 @@ msgstr ""
"X-Crowdin-Language: hr\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-09-01 22:30\n"
-
-msgid " %{name}, confirm your email address now! "
-msgstr ""
+"PO-Revision-Date: 2021-10-04 20:18\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -94,6 +91,18 @@ msgstr ""
msgid "#general, #development"
msgstr ""
+msgid "%d Alert"
+msgid_plural "%d Alerts"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+msgid "%d Alert:"
+msgid_plural "%d Alerts:"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
msgid "%d Approval"
msgid_plural "%d Approvals"
msgstr[0] ""
@@ -523,7 +532,10 @@ msgstr ""
msgid "%{code_open}Protected:%{code_close} Only exposed to protected branches or tags."
msgstr ""
-msgid "%{commit_author_link} authored %{commit_timeago}"
+msgid "%{commit_author_link} authored %{commit_authored_timeago}"
+msgstr ""
+
+msgid "%{commit_author_link} authored %{commit_authored_timeago} and %{commit_committer_avatar} %{commit_committer_link} committed %{commit_committer_timeago}"
msgstr ""
msgid "%{completedCount} completed weight"
@@ -622,6 +634,15 @@ msgstr ""
msgid "%{doc_link_start}Advanced search%{doc_link_end} is enabled."
msgstr ""
+msgid "%{docs_link_start}Learn about visibility levels.%{docs_link_end}"
+msgstr ""
+
+msgid "%{docs_link_start}What is Large File Storage?%{docs_link_end}"
+msgstr ""
+
+msgid "%{docs_link_start}What is two-factor authentication?%{docs_link_end}"
+msgstr ""
+
msgid "%{due_date} (Past due)"
msgstr ""
@@ -694,9 +715,6 @@ msgstr ""
msgid "%{issueType} actions"
msgstr ""
-msgid "%{issuesCount} issues with a limit of %{maxIssueCount}"
-msgstr ""
-
msgid "%{issuesSize} with a limit of %{maxIssueCount}"
msgstr ""
@@ -754,6 +772,12 @@ msgstr ""
msgid "%{label_for_message} unavailable"
msgstr ""
+msgid "%{learn_more_link}."
+msgstr ""
+
+msgid "%{lessThan} 1 hour"
+msgstr ""
+
msgid "%{lets_encrypt_link_start}Let's Encrypt%{lets_encrypt_link_end} is a free, automated, and open certificate authority (CA) that issues digital certificates to enable HTTPS (SSL/TLS) for sites."
msgstr ""
@@ -766,15 +790,15 @@ msgstr ""
msgid "%{link_start}Learn more%{link_end} about roles."
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
-msgstr ""
-
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
msgstr ""
msgid "%{link_start}Start the title with %{draft_snippet}%{link_end} to prevent a merge request that is a work in progress from being merged before it's ready."
msgstr ""
+msgid "%{link_start}What information does GitLab Inc. collect?%{link_end}"
+msgstr ""
+
msgid "%{listToShow}, and %{awardsListLength} more"
msgstr ""
@@ -931,7 +955,7 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
-msgid "%{service_ping_link_start}Learn more%{service_ping_link_end} about what information is shared with GitLab Inc."
+msgid "%{service_ping_link_start}What information is shared with GitLab Inc.?%{service_ping_link_end}"
msgstr ""
msgid "%{size} %{unit}"
@@ -967,6 +991,9 @@ msgstr ""
msgid "%{state} epics"
msgstr ""
+msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
+msgstr ""
+
msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
msgstr ""
@@ -1033,12 +1060,6 @@ msgstr ""
msgid "%{template_project_id} is unknown or invalid"
msgstr ""
-msgid "%{text} %{files}"
-msgid_plural "%{text} %{files} files"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-
msgid "%{text} is available"
msgstr ""
@@ -1123,9 +1144,6 @@ msgstr ""
msgid "%{wildcards_link_start}Wildcards%{wildcards_link_end} such as %{code_tag_start}v*%{code_tag_end} or %{code_tag_start}*-release%{code_tag_end} are supported."
msgstr ""
-msgid "&lt; 1 hour"
-msgstr ""
-
msgid "'%{data}' at %{location} does not match format: %{format}"
msgstr ""
@@ -1210,9 +1228,6 @@ msgstr ""
msgid "(we need your current password to confirm your changes)"
msgstr ""
-msgid "* * * * *"
-msgstr ""
-
msgid "+ %{amount} more"
msgstr ""
@@ -1282,10 +1297,10 @@ msgstr ""
msgid "."
msgstr ""
-msgid "0 bytes"
+msgid "/"
msgstr ""
-msgid "0 for unlimited, only effective with remote storage enabled."
+msgid "0 bytes"
msgstr ""
msgid "0t1DgySidms"
@@ -1438,6 +1453,9 @@ msgstr ""
msgid "1000+"
msgstr ""
+msgid "192.168.0.0/24"
+msgstr ""
+
msgid "1st contribution!"
msgstr ""
@@ -1591,9 +1609,6 @@ msgstr ""
msgid "A plain HTML site that uses Netlify for CI/CD instead of GitLab, but still with all the other great GitLab features"
msgstr ""
-msgid "A plain-text response to show to clients that hit the rate limit."
-msgstr ""
-
msgid "A platform value can be web, mob or app."
msgstr ""
@@ -1675,7 +1690,7 @@ msgstr ""
msgid "APIFuzzing|Configure HTTP basic authentication values. Other authentication methods are supported. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
+msgid "APIFuzzing|Customize your project's API fuzzing configuration options and copy the code snippet to your .gitlab-ci.yml file to apply any changes. Note that this tool does not reflect or update your .gitlab-ci.yml file automatically. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
msgstr ""
msgid "APIFuzzing|Enable authentication"
@@ -1738,9 +1753,6 @@ msgstr ""
msgid "APIFuzzing|To prevent a security leak, authentication info must be added as a %{ciVariablesLinkStart}CI variable%{ciVariablesLinkEnd}. As a user with maintainer access rights, you can manage CI variables in the %{ciSettingsLinkStart}Settings%{ciSettingsLinkEnd} area."
msgstr ""
-msgid "APIFuzzing|Use this tool to generate API fuzzing configuration YAML to copy into your .gitlab-ci.yml file. This tool does not reflect or update your .gitlab-ci.yml file automatically."
-msgstr ""
-
msgid "APIFuzzing|Username for basic authentication"
msgstr ""
@@ -1792,9 +1804,6 @@ msgstr ""
msgid "Abuse reports notification email"
msgstr ""
-msgid "Abuse reports will be sent to this address if it is set. Abuse reports are always available in the admin area."
-msgstr ""
-
msgid "Accept invitation"
msgstr ""
@@ -1831,12 +1840,18 @@ msgstr ""
msgid "Access granted"
msgstr ""
+msgid "Access key ID"
+msgstr ""
+
msgid "Access requests"
msgstr ""
msgid "Access to '%{classification_label}' not allowed"
msgstr ""
+msgid "Access tokens expire after 2 hours. A refresh token may be used at any time to generate a new access token. Non-expiring access tokens are deprecated. Clear this setting to enable backward compatibility."
+msgstr ""
+
msgid "AccessDropdown|Deploy Keys"
msgstr ""
@@ -2149,6 +2164,9 @@ msgstr ""
msgid "Add new directory"
msgstr ""
+msgid "Add new service account"
+msgstr ""
+
msgid "Add or remove previously merged commits"
msgstr ""
@@ -2386,6 +2404,9 @@ msgstr ""
msgid "AdminArea|Features"
msgstr ""
+msgid "AdminArea|Get security updates from GitLab and stay up to date"
+msgstr ""
+
msgid "AdminArea|Groups"
msgstr ""
@@ -2425,6 +2446,12 @@ msgstr ""
msgid "AdminArea|Reporter"
msgstr ""
+msgid "AdminArea|Sign up for the GitLab Security Newsletter to get notified for security updates."
+msgstr ""
+
+msgid "AdminArea|Sign up for the GitLab newsletter"
+msgstr ""
+
msgid "AdminArea|Stop all jobs"
msgstr ""
@@ -2494,9 +2521,15 @@ msgstr ""
msgid "AdminSettings|Disable public access to Pages sites"
msgstr ""
+msgid "AdminSettings|Display a banner on merge requests in projects with no pipelines to initiate steps to add a .gitlab-ci.yml file."
+msgstr ""
+
msgid "AdminSettings|Domain verification is an essential security measure for public GitLab sites. Users are required to demonstrate they control a domain before it is enabled. %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "AdminSettings|Enable pipeline suggestion banner"
+msgstr ""
+
msgid "AdminSettings|Enable shared runners for new projects"
msgstr ""
@@ -2968,10 +3001,10 @@ msgstr ""
msgid "Admin|Quarterly reconciliation will occur on %{qrtlyDate}"
msgstr ""
-msgid "Admin|The number of max seats used for your namespace is currently exceeding the number of seats in your subscription. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgid "Admin|The number of max seats in your namespace exceeds the number of seats in your subscription. On %{qrtlyDate}, quarterly reconciliation occurs and you are automatically billed a prorated amount for the overage. No action is needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice. For more information about the timing of the invoicing process, view the documentation."
msgstr ""
-msgid "Admin|The number of maximum users for your instance is currently exceeding the number of users in license. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgid "Admin|The number of max users in your instance exceeds the number of users in your license. On %{qrtlyDate}, quarterly reconciliation occurs and you are automatically billed a prorated amount for the overage. No action is needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice. For more information about the timing of the invoicing process, view the documentation."
msgstr ""
msgid "Admin|View pending user approvals"
@@ -2992,9 +3025,6 @@ msgstr ""
msgid "Advanced export options"
msgstr ""
-msgid "Advanced permissions, Large File Storage and Two-Factor authentication settings."
-msgstr ""
-
msgid "After a successful password update you will be redirected to login screen."
msgstr ""
@@ -3013,14 +3043,14 @@ msgstr ""
msgid "After you've reviewed these contribution guidelines, you'll be all set to"
msgstr ""
+msgid "Akismet"
+msgstr ""
+
msgid "Akismet API Key"
msgstr ""
-msgid "Alert"
-msgid_plural "Alerts"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgid "Akismet helps prevent the creation of spam issues in public projects."
+msgstr ""
msgid "AlertManagement|Acknowledged"
msgstr ""
@@ -3376,6 +3406,9 @@ msgstr ""
msgid "All (default)"
msgstr ""
+msgid "All GitLab"
+msgstr ""
+
msgid "All Members"
msgstr ""
@@ -3490,6 +3523,9 @@ msgstr ""
msgid "Allow this secondary node to replicate content on Object Storage"
msgstr ""
+msgid "Allow use of licensed EE features"
+msgstr ""
+
msgid "Allow users to dismiss the broadcast message"
msgstr ""
@@ -3565,9 +3601,6 @@ msgstr ""
msgid "Amazon authentication is not %{link_start}correctly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
-msgid "Amount of time (in hours) that users are allowed to skip forced configuration of two-factor authentication"
-msgstr ""
-
msgid "An %{link_start}alert%{link_end} with the same fingerprint is already open. To change the status of this alert, resolve the linked alert."
msgstr ""
@@ -3628,12 +3661,6 @@ msgstr ""
msgid "An error occurred when removing the label."
msgstr ""
-msgid "An error occurred when toggling the notification subscription"
-msgstr ""
-
-msgid "An error occurred when updating the issue weight"
-msgstr ""
-
msgid "An error occurred when updating the title"
msgstr ""
@@ -3682,6 +3709,9 @@ msgstr ""
msgid "An error occurred while enabling Service Desk."
msgstr ""
+msgid "An error occurred while fetching Markdown preview"
+msgstr ""
+
msgid "An error occurred while fetching ancestors"
msgstr ""
@@ -3712,9 +3742,6 @@ msgstr ""
msgid "An error occurred while fetching label colors."
msgstr ""
-msgid "An error occurred while fetching markdown preview"
-msgstr ""
-
msgid "An error occurred while fetching participants"
msgstr ""
@@ -3730,9 +3757,6 @@ msgstr ""
msgid "An error occurred while fetching reference"
msgstr ""
-msgid "An error occurred while fetching sidebar data"
-msgstr ""
-
msgid "An error occurred while fetching tags. Retry the search."
msgstr ""
@@ -3808,6 +3832,9 @@ msgstr ""
msgid "An error occurred while loading merge requests."
msgstr ""
+msgid "An error occurred while loading projects."
+msgstr ""
+
msgid "An error occurred while loading the Needs tab."
msgstr ""
@@ -4042,12 +4069,6 @@ msgstr ""
msgid "Any Milestone"
msgstr ""
-msgid "Any branch"
-msgstr ""
-
-msgid "Any eligible user"
-msgstr ""
-
msgid "Any encrypted tokens"
msgstr ""
@@ -4066,6 +4087,9 @@ msgstr ""
msgid "Any namespace"
msgstr ""
+msgid "App Engine description and apps that are suitable for this deployment target"
+msgstr ""
+
msgid "App ID"
msgstr ""
@@ -4216,6 +4240,12 @@ msgstr ""
msgid "Apply"
msgstr ""
+msgid "Apply %d suggestion"
+msgid_plural "Apply %d suggestions"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
msgid "Apply a label"
msgstr ""
@@ -4225,13 +4255,10 @@ msgstr ""
msgid "Apply suggestion"
msgstr ""
-msgid "Apply suggestions"
-msgstr ""
-
msgid "Apply template"
msgstr ""
-msgid "Apply this approval rule to any branch or a specific protected branch."
+msgid "Apply this approval rule to all branches or a specific protected branch."
msgstr ""
msgid "Applying"
@@ -4378,9 +4405,6 @@ msgstr ""
msgid "ApprovalSettings|Prevent editing approval rules in projects and merge requests."
msgstr ""
-msgid "ApprovalSettings|Prevent editing approval rules in projects and merge requests. "
-msgstr ""
-
msgid "ApprovalSettings|Remove all approvals when commits are added to the source branch."
msgstr ""
@@ -4396,6 +4420,9 @@ msgstr ""
msgid "ApprovalSettings|This setting is configured at the instance level and can only be changed by an administrator."
msgstr ""
+msgid "ApprovalSettings|This setting is configured in %{groupName} and can only be changed by an administrator or group owner."
+msgstr ""
+
msgid "ApprovalStatusTooltip|Adheres to separation of duties"
msgstr ""
@@ -4885,9 +4912,6 @@ msgstr ""
msgid "Authenticated API rate limit period in seconds"
msgstr ""
-msgid "Authenticated API request rate limit"
-msgstr ""
-
msgid "Authenticated API requests"
msgstr ""
@@ -4897,10 +4921,10 @@ msgstr ""
msgid "Authenticated Git LFS request rate limit"
msgstr ""
-msgid "Authenticated web rate limit period in seconds"
+msgid "Authenticated Git LFS requests"
msgstr ""
-msgid "Authenticated web request rate limit"
+msgid "Authenticated web rate limit period in seconds"
msgstr ""
msgid "Authenticated web requests"
@@ -5278,9 +5302,6 @@ msgstr ""
msgid "Below you will find all the groups that are public."
msgstr ""
-msgid "Beta"
-msgstr ""
-
msgid "Bi-weekly code coverage"
msgstr ""
@@ -5521,6 +5542,21 @@ msgstr ""
msgid "Board scope affects which issues are displayed for anyone who visits this board"
msgstr ""
+msgid "BoardNewEpic|Groups"
+msgstr ""
+
+msgid "BoardNewEpic|Loading groups"
+msgstr ""
+
+msgid "BoardNewEpic|No matching results"
+msgstr ""
+
+msgid "BoardNewEpic|Search groups"
+msgstr ""
+
+msgid "BoardNewEpic|Select a group"
+msgstr ""
+
msgid "BoardNewIssue|No matching results"
msgstr ""
@@ -5599,6 +5635,9 @@ msgstr ""
msgid "Boards|An error occurred while creating the list. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching child groups. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching group projects. Please try again."
msgstr ""
@@ -5932,6 +5971,9 @@ msgstr ""
msgid "Bulk update"
msgstr ""
+msgid "BulkImports|Re-import creates a new group. It does not sync with the existing group."
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -5941,6 +5983,9 @@ msgstr ""
msgid "BulkImport|From source group"
msgstr ""
+msgid "BulkImport|Group import history"
+msgstr ""
+
msgid "BulkImport|Import failed: Destination cannot be a subgroup of the source group. Change the destination and try again."
msgstr ""
@@ -5953,9 +5998,18 @@ msgstr ""
msgid "BulkImport|Importing the group failed"
msgstr ""
+msgid "BulkImport|Last imported to %{link}"
+msgstr ""
+
msgid "BulkImport|Name already exists."
msgstr ""
+msgid "BulkImport|New group"
+msgstr ""
+
+msgid "BulkImport|No history is available"
+msgstr ""
+
msgid "BulkImport|No parent"
msgstr ""
@@ -5968,6 +6022,9 @@ msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} matching filter \"%{filter}\" from %{link}"
msgstr ""
+msgid "BulkImport|Source group"
+msgstr ""
+
msgid "BulkImport|To new group"
msgstr ""
@@ -5977,6 +6034,9 @@ msgstr ""
msgid "BulkImport|You have no groups to import"
msgstr ""
+msgid "BulkImport|Your imported groups will appear here."
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -6220,6 +6280,9 @@ msgstr ""
msgid "Can be manually deployed to"
msgstr ""
+msgid "Can be overridden in each project."
+msgstr ""
+
msgid "Can create groups:"
msgstr ""
@@ -6322,6 +6385,9 @@ msgstr ""
msgid "Cancelling Preview"
msgstr ""
+msgid "Cannot assign a confidential epic to a non-confidential issue. Make the issue confidential and try again"
+msgstr ""
+
msgid "Cannot be assigned to other projects."
msgstr ""
@@ -6373,9 +6439,6 @@ msgstr ""
msgid "Cannot refer to a group %{timebox_type} by an internal id!"
msgstr ""
-msgid "Cannot set confidential epic for a non-confidential issue"
-msgstr ""
-
msgid "Cannot show preview. For previews on sketch files, they must have the file format introduced by Sketch version 43 and above."
msgstr ""
@@ -6613,15 +6676,15 @@ msgstr ""
msgid "Check out, review, and merge locally"
msgstr ""
-msgid "Check the %{docs_link_start}documentation%{docs_link_end}."
-msgstr ""
-
msgid "Check the current instance configuration "
msgstr ""
msgid "Check the elasticsearch.log file to debug why the migration was halted and make any changes before retrying the migration. When you fix the cause of the failure, click \"Retry migration\", and the migration will be scheduled to be retried in the background."
msgstr ""
+msgid "Check with your administrator."
+msgstr ""
+
msgid "Check your Docker images for known vulnerabilities."
msgstr ""
@@ -6652,6 +6715,9 @@ msgstr ""
msgid "Checkout"
msgstr ""
+msgid "Checkout|$%{selectedPlanPrice} per 10 GB storage per pack"
+msgstr ""
+
msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 minutes"
msgstr ""
@@ -6673,18 +6739,24 @@ msgstr ""
msgid "Checkout|%{name}'s GitLab subscription"
msgstr ""
-msgid "Checkout|%{selectedPlanText} plan"
+msgid "Checkout|%{name}'s storage subscription"
msgstr ""
-msgid "Checkout|%{startDate} - %{endDate}"
+msgid "Checkout|%{quantity} GB of storage"
msgstr ""
-msgid "Checkout|%{totalCiMinutes} CI minute"
-msgid_plural "Checkout|%{totalCiMinutes} CI minutes"
+msgid "Checkout|%{quantity} storage pack"
+msgid_plural "Checkout|%{quantity} storage packs"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
+msgid "Checkout|%{selectedPlanText} plan"
+msgstr ""
+
+msgid "Checkout|%{startDate} - %{endDate}"
+msgstr ""
+
msgid "Checkout|%{totalCiMinutes} CI minutes"
msgstr ""
@@ -6760,6 +6832,9 @@ msgstr ""
msgid "Checkout|Failed to register credit card. Please try again."
msgstr ""
+msgid "Checkout|GB"
+msgstr ""
+
msgid "Checkout|GitLab group"
msgstr ""
@@ -6796,6 +6871,9 @@ msgstr ""
msgid "Checkout|State"
msgstr ""
+msgid "Checkout|Storage packs"
+msgstr ""
+
msgid "Checkout|Street address"
msgstr ""
@@ -6817,6 +6895,9 @@ msgstr ""
msgid "Checkout|Total minutes: %{quantity}"
msgstr ""
+msgid "Checkout|Total storage: %{quantity} GB"
+msgstr ""
+
msgid "Checkout|Users"
msgstr ""
@@ -6826,16 +6907,25 @@ msgstr ""
msgid "Checkout|Your organization"
msgstr ""
+msgid "Checkout|Your storage subscription has the same term as your main subscription, and the price is prorated accordingly."
+msgstr ""
+
msgid "Checkout|Your subscription will be applied to this group"
msgstr ""
msgid "Checkout|Zip code"
msgstr ""
+msgid "Checkout|a storage subscription"
+msgstr ""
+
msgid "Checkout|company or team"
msgstr ""
-msgid "Checkout|x 1,000 minutes per pack = %{strong}"
+msgid "Checkout|minutes"
+msgstr ""
+
+msgid "Checkout|x %{quantity} %{units} per pack ="
msgstr ""
msgid "Cherry-pick this commit"
@@ -7192,6 +7282,9 @@ msgstr ""
msgid "CloneIssue|Cannot clone issue to target project as it is pending deletion."
msgstr ""
+msgid "CloneIssue|Cannot clone issues of '%{issue_type}' type."
+msgstr ""
+
msgid "Cloned this issue to %{path_to_project}."
msgstr ""
@@ -7246,7 +7339,10 @@ msgstr ""
msgid "Closes this %{quick_action_target}."
msgstr ""
-msgid "Cloud licenses can not be removed."
+msgid "Cloud Functions description and apps that are suitable for this deployment target"
+msgstr ""
+
+msgid "Cloud Run description and apps that are suitable for this deployment target"
msgstr ""
msgid "Cluster"
@@ -7273,6 +7369,12 @@ msgstr ""
msgid "ClusterAgents|Access tokens"
msgstr ""
+msgid "ClusterAgents|Agent might not be connected to GitLab"
+msgstr ""
+
+msgid "ClusterAgents|Agent never connected to GitLab"
+msgstr ""
+
msgid "ClusterAgents|Alternative installation methods"
msgstr ""
@@ -7288,6 +7390,12 @@ msgstr ""
msgid "ClusterAgents|Configuration"
msgstr ""
+msgid "ClusterAgents|Connected"
+msgstr ""
+
+msgid "ClusterAgents|Connection status"
+msgstr ""
+
msgid "ClusterAgents|Copy token"
msgstr ""
@@ -7306,6 +7414,9 @@ msgstr ""
msgid "ClusterAgents|For alternative installation methods %{linkStart}go to the documentation%{linkEnd}."
msgstr ""
+msgid "ClusterAgents|For more troubleshooting information go to"
+msgstr ""
+
msgid "ClusterAgents|Go to the repository"
msgstr ""
@@ -7321,18 +7432,30 @@ msgstr ""
msgid "ClusterAgents|Integrate with the GitLab Agent"
msgstr ""
-msgid "ClusterAgents|Last used"
+msgid "ClusterAgents|Last connected %{timeAgo}."
+msgstr ""
+
+msgid "ClusterAgents|Last contact"
msgstr ""
msgid "ClusterAgents|Learn how to create an agent access token"
msgstr ""
+msgid "ClusterAgents|Make sure you are using a valid token."
+msgstr ""
+
msgid "ClusterAgents|Name"
msgstr ""
msgid "ClusterAgents|Never"
msgstr ""
+msgid "ClusterAgents|Never connected"
+msgstr ""
+
+msgid "ClusterAgents|Not connected"
+msgstr ""
+
msgid "ClusterAgents|Read more about getting started"
msgstr ""
@@ -7354,6 +7477,9 @@ msgstr ""
msgid "ClusterAgents|Select which Agent you want to install"
msgstr ""
+msgid "ClusterAgents|The Agent has not been connected in a long time. There might be a connectivity issue. Last contact was %{timeAgo}."
+msgstr ""
+
msgid "ClusterAgents|The GitLab Agent also requires %{linkStart}enabling the Agent Server%{linkEnd}"
msgstr ""
@@ -7381,9 +7507,6 @@ msgstr ""
msgid "ClusterAgents|You will need to create a token to connect to your agent"
msgstr ""
-msgid "ClusterAgent|This feature is only available for premium plans"
-msgstr ""
-
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -7573,9 +7696,6 @@ msgstr ""
msgid "ClusterIntegration|Create Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Create a provision role on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the account and external ID above. %{startMoreInfoLink}More information%{endLink}"
-msgstr ""
-
msgid "ClusterIntegration|Create cluster on"
msgstr ""
@@ -8008,7 +8128,7 @@ msgstr ""
msgid "ClusterIntegration|Subnets"
msgstr ""
-msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provisioned role, first create one on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the above account and external IDs. %{startMoreInfoLink}More information%{endLink}"
+msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provisioned role, first create one on %{awsLinkStart}Amazon Web Services %{awsLinkEnd} using the above account and external IDs. %{moreInfoStart}More information%{moreInfoEnd}"
msgstr ""
msgid "ClusterIntegration|The Kubernetes certificate used to authenticate to the cluster."
@@ -8242,6 +8362,9 @@ msgstr ""
msgid "Collapse replies"
msgstr ""
+msgid "Collapse settings section"
+msgstr ""
+
msgid "Collapse sidebar"
msgstr ""
@@ -8260,6 +8383,9 @@ msgstr ""
msgid "Comma-separated list of email addresses."
msgstr ""
+msgid "Comma-separated list of users allowed to exceed the rate limit."
+msgstr ""
+
msgid "Comma-separated, e.g. '1.1.1.1, 2.2.2.0/24'"
msgstr ""
@@ -8581,6 +8707,9 @@ msgstr ""
msgid "Configure %{repository_checks_link_start}repository checks%{link_end} and %{housekeeping_link_start}housekeeping%{link_end} on repositories."
msgstr ""
+msgid "Configure CAPTCHAs, IP address limits, and other anti-spam measures."
+msgstr ""
+
msgid "Configure Dependency Scanning in `.gitlab-ci.yml` using the GitLab managed template. You can [add variable overrides](https://docs.gitlab.com/ee/user/application_security/dependency_scanning/#customizing-the-dependency-scanning-settings) to customize Dependency Scanning settings."
msgstr ""
@@ -8617,16 +8746,13 @@ msgstr ""
msgid "Configure a %{codeStart}.gitlab-webide.yml%{codeEnd} file in the %{codeStart}.gitlab%{codeEnd} directory to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
msgstr ""
-msgid "Configure existing installation"
-msgstr ""
-
-msgid "Configure limit for notes created per minute by web and API requests."
+msgid "Configure advanced permissions, Large File Storage, and two-factor authentication settings."
msgstr ""
-msgid "Configure limits for Project/Group Import/Export."
+msgid "Configure approvals by authors and committers on all projects."
msgstr ""
-msgid "Configure limits for web and API requests."
+msgid "Configure existing installation"
msgstr ""
msgid "Configure paths to be protected by Rack Attack."
@@ -8641,10 +8767,13 @@ msgstr ""
msgid "Configure settings for Advanced Search with Elasticsearch."
msgstr ""
+msgid "Configure specific limits for Files API requests that supersede the general user and IP rate limits."
+msgstr ""
+
msgid "Configure specific limits for Git LFS requests that supersede the general user and IP rate limits."
msgstr ""
-msgid "Configure specific limits for Packages API requests that supersede the general user and IP rate limits."
+msgid "Configure specific limits for deprecated API requests that supersede the general user and IP rate limits."
msgstr ""
msgid "Configure the %{link} integration."
@@ -8656,6 +8785,9 @@ msgstr ""
msgid "Configure the way a user creates a new account."
msgstr ""
+msgid "Configure via Merge Request"
+msgstr ""
+
msgid "Configure which lists are shown for anyone who visits this board"
msgstr ""
@@ -9127,6 +9259,9 @@ msgstr ""
msgid "Content parsed with %{link}."
msgstr ""
+msgid "ContentEditor|Table of Contents"
+msgstr ""
+
msgid "ContentEditor|You have to provide a renderMarkdown function or a custom serializer"
msgstr ""
@@ -9313,6 +9448,9 @@ msgstr ""
msgid "Copy link to chart"
msgstr ""
+msgid "Copy prefix"
+msgstr ""
+
msgid "Copy reference"
msgstr ""
@@ -9343,6 +9481,9 @@ msgstr ""
msgid "Copy value"
msgstr ""
+msgid "Corpus Management"
+msgstr ""
+
msgid "Corpus Management|Are you sure you want to delete the corpus?"
msgstr ""
@@ -9571,6 +9712,9 @@ msgstr ""
msgid "Create commit"
msgstr ""
+msgid "Create common files more quickly, and standardize their format."
+msgstr ""
+
msgid "Create confidential merge request"
msgstr ""
@@ -9604,6 +9748,9 @@ msgstr ""
msgid "Create issue"
msgstr ""
+msgid "Create issue to resolve all threads"
+msgstr ""
+
msgid "Create iteration"
msgstr ""
@@ -9658,6 +9805,9 @@ msgstr ""
msgid "Create new..."
msgstr ""
+msgid "Create or import your first project"
+msgstr ""
+
msgid "Create project"
msgstr ""
@@ -10015,7 +10165,7 @@ msgstr ""
msgid "Custom notification events"
msgstr ""
-msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notificationLinkStart} notification emails%{notificationLinkEnd}."
+msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notificationLinkStart}notification emails%{notificationLinkEnd}."
msgstr ""
msgid "Custom project templates"
@@ -10216,10 +10366,10 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
-msgid "CycleAnalytics|Showing data for group '%{groupName}' and %{selectedProjectCount} projects from %{startDate} to %{endDate}"
+msgid "CycleAnalytics|Showing data for group '%{groupName}' and %{selectedProjectCount} projects from %{createdAfter} to %{createdBefore}"
msgstr ""
-msgid "CycleAnalytics|Showing data for group '%{groupName}' from %{startDate} to %{endDate}"
+msgid "CycleAnalytics|Showing data for group '%{groupName}' from %{createdAfter} to %{createdBefore}"
msgstr ""
msgid "CycleAnalytics|Stages"
@@ -10453,6 +10603,9 @@ msgstr ""
msgid "DastProfiles|Manage profiles"
msgstr ""
+msgid "DastProfiles|Manage site profiles"
+msgstr ""
+
msgid "DastProfiles|Minimum = 0 (no timeout enabled), Maximum = 2880 minutes"
msgstr ""
@@ -10528,6 +10681,9 @@ msgstr ""
msgid "DastProfiles|Scanner name"
msgstr ""
+msgid "DastProfiles|Schedule"
+msgstr ""
+
msgid "DastProfiles|Select branch"
msgstr ""
@@ -10597,7 +10753,7 @@ msgstr ""
msgid "DastProfiles|Website"
msgstr ""
-msgid "DastProfiles|You can either choose a passive scan or validate the target site in your chosen site profile. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
+msgid "DastProfiles|You can either choose a passive scan or validate the target site from the site profile management page. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
msgstr ""
msgid "DastProfiles|You cannot run an active scan against an unvalidated site."
@@ -10771,7 +10927,7 @@ msgstr ""
msgid "Days to merge"
msgstr ""
-msgid "Deactivate dormant users after 90 days of inactivity. Users can return to active status by signing in to their account. While inactive, a user is not counted as an active user in the instance."
+msgid "Deactivate dormant users after 90 days of inactivity"
msgstr ""
msgid "Dear Administrator,"
@@ -10858,10 +11014,10 @@ msgstr ""
msgid "Define a custom pattern with cron syntax"
msgstr ""
-msgid "Define approval settings."
+msgid "Define approval rules."
msgstr ""
-msgid "Define approval settings. %{linkStart}Learn more.%{linkEnd}"
+msgid "Define approval rules. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "Define custom rules for what constitutes spam, independent of Akismet"
@@ -10870,7 +11026,7 @@ msgstr ""
msgid "Define environments in the deploy stage(s) in %{code_open}.gitlab-ci.yml%{code_close} to track deployments here."
msgstr ""
-msgid "Define how approval rules are applied as a merge request moves toward completion."
+msgid "Define how approval rules are applied to merge requests."
msgstr ""
msgid "Definition"
@@ -10885,6 +11041,12 @@ msgstr ""
msgid "DelayedJobs|Are you sure you want to run %{job_name} immediately? This job will run automatically after it's timer finishes."
msgstr ""
+msgid "DelayedJobs|Are you sure you want to run %{job_name} immediately? This job will run automatically after its timer finishes."
+msgstr ""
+
+msgid "DelayedJobs|Run the delayed job now?"
+msgstr ""
+
msgid "DelayedJobs|Start now"
msgstr ""
@@ -11164,6 +11326,12 @@ msgstr ""
msgid "Dependency proxy image prefix"
msgstr ""
+msgid "DependencyProxy|Create a local proxy for storing frequently used upstream images. %{docLinkStart}Learn more%{docLinkEnd} about dependency proxies."
+msgstr ""
+
+msgid "DependencyProxy|Dependency Proxy"
+msgstr ""
+
msgid "DependencyProxy|Toggle Dependency Proxy"
msgstr ""
@@ -11407,6 +11575,9 @@ msgstr ""
msgid "Deployments"
msgstr ""
+msgid "Deployments to Google Kubernetes Engine can be "
+msgstr ""
+
msgid "Deployments|%{deployments} environment impacted."
msgid_plural "Deployments|%{deployments} environments impacted."
msgstr[0] ""
@@ -11437,6 +11608,9 @@ msgstr ""
msgid "Deployment|success"
msgstr ""
+msgid "Deprecated API rate limits"
+msgstr ""
+
msgid "Deprioritize label"
msgstr ""
@@ -11839,6 +12013,18 @@ msgstr ""
msgid "DiffsCompareBaseBranch|(base)"
msgstr ""
+msgid "Diffs|%d addition"
+msgid_plural "Diffs|%d additions"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+msgid "Diffs|%d deletion"
+msgid_plural "Diffs|%d deletions"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
msgid "Diffs|No file name available"
msgstr ""
@@ -11848,9 +12034,18 @@ msgstr ""
msgid "Diffs|Show all unchanged lines"
msgstr ""
+msgid "Diffs|Showing %{dropdownStart}%{count} changed file%{dropdownEnd}"
+msgid_plural "Diffs|Showing %{dropdownStart}%{count} changed files%{dropdownEnd}"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
msgid "Diffs|Something went wrong while fetching diff lines."
msgstr ""
+msgid "Diffs|with %{additions} and %{deletions}"
+msgstr ""
+
msgid "Direct member"
msgstr ""
@@ -11977,9 +12172,6 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
-msgid "Dismiss Value Stream Analytics introduction box"
-msgstr ""
-
msgid "Dismiss merge request promotion"
msgstr ""
@@ -12301,6 +12493,9 @@ msgstr ""
msgid "Edit issues"
msgstr ""
+msgid "Edit merge requests"
+msgstr ""
+
msgid "Edit public deploy key"
msgstr ""
@@ -12376,6 +12571,9 @@ msgstr ""
msgid "Elastic|None. Select projects to index."
msgstr ""
+msgid "Eligible users"
+msgstr ""
+
msgid "Email"
msgstr ""
@@ -12505,6 +12703,9 @@ msgstr ""
msgid "Enable"
msgstr ""
+msgid "Enable Amazon EKS integration"
+msgstr ""
+
msgid "Enable Auto DevOps"
msgstr ""
@@ -12538,6 +12739,9 @@ msgstr ""
msgid "Enable SSL verification"
msgstr ""
+msgid "Enable Service Ping"
+msgstr ""
+
msgid "Enable Snowplow tracking"
msgstr ""
@@ -12568,6 +12772,9 @@ msgstr ""
msgid "Enable authenticated Git LFS request rate limit"
msgstr ""
+msgid "Enable authenticated web request rate limit"
+msgstr ""
+
msgid "Enable authentication"
msgstr ""
@@ -12628,7 +12835,7 @@ msgstr ""
msgid "Enable or disable the Pseudonymizer data collection."
msgstr ""
-msgid "Enable or disable version check and service ping."
+msgid "Enable or disable version check and Service Ping."
msgstr ""
msgid "Enable protected paths rate limit"
@@ -12640,18 +12847,12 @@ msgstr ""
msgid "Enable reCAPTCHA"
msgstr ""
-msgid "Enable reCAPTCHA for login"
-msgstr ""
-
-msgid "Enable reCAPTCHA, Invisible Captcha, Akismet and set IP limits. For reCAPTCHA, we currently only support %{recaptcha_v2_link_start}v2%{recaptcha_v2_link_end}"
+msgid "Enable reCAPTCHA for login."
msgstr ""
msgid "Enable repository checks"
msgstr ""
-msgid "Enable service ping"
-msgstr ""
-
msgid "Enable shared runners for all projects and subgroups in this group."
msgstr ""
@@ -12673,7 +12874,10 @@ msgstr ""
msgid "Enable unauthenticated API request rate limit"
msgstr ""
-msgid "Enable unauthenticated request rate limit"
+msgid "Enable unauthenticated web request rate limit"
+msgstr ""
+
+msgid "Enable user deactivation emails"
msgstr ""
msgid "Enable version check"
@@ -12709,9 +12913,6 @@ msgstr ""
msgid "Enabled sources for code import during project creation. OmniAuth must be configured for GitHub"
msgstr ""
-msgid "Enabling this will only make licensed EE features available to projects if the project namespace's plan includes the feature or if the project is public."
-msgstr ""
-
msgid "Encountered an error while rendering: %{err}"
msgstr ""
@@ -12760,9 +12961,6 @@ msgstr ""
msgid "Enter Admin Mode"
msgstr ""
-msgid "Enter IP address range"
-msgstr ""
-
msgid "Enter a number"
msgstr ""
@@ -12775,9 +12973,6 @@ msgstr ""
msgid "Enter at least three characters to search"
msgstr ""
-msgid "Enter domain"
-msgstr ""
-
msgid "Enter in your Bitbucket Server URL and personal access token below"
msgstr ""
@@ -12964,9 +13159,6 @@ msgstr ""
msgid "Environments|Deployment %{status}"
msgstr ""
-msgid "Environments|Dismiss"
-msgstr ""
-
msgid "Environments|Enable review app"
msgstr ""
@@ -12979,9 +13171,6 @@ msgstr ""
msgid "Environments|Environments are places where code gets deployed, such as staging or production."
msgstr ""
-msgid "Environments|Help us improve environments"
-msgstr ""
-
msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
msgstr ""
@@ -13018,6 +13207,9 @@ msgstr ""
msgid "Environments|Note that this action will stop the environment, but it will %{emphasisStart}not%{emphasisEnd} have an effect on any existing deployment due to no “stop environment action†being defined in the %{ciConfigLinkStart}.gitlab-ci.yml%{ciConfigLinkEnd} file."
msgstr ""
+msgid "Environments|Open"
+msgstr ""
+
msgid "Environments|Open live environment"
msgstr ""
@@ -13057,9 +13249,6 @@ msgstr ""
msgid "Environments|Stopping %{environmentName}"
msgstr ""
-msgid "Environments|Take the survey"
-msgstr ""
-
msgid "Environments|There was an error fetching the logs. Please try again."
msgstr ""
@@ -13081,9 +13270,6 @@ msgstr ""
msgid "Environments|You don't have any environments right now"
msgstr ""
-msgid "Environments|Your feedback helps GitLab make environments better for you and other users. Participate and enter a sweepstake to win a USD 30 gift card."
-msgstr ""
-
msgid "Environments|by %{avatar}"
msgstr ""
@@ -13366,7 +13552,7 @@ msgstr ""
msgid "Error parsing CSV file. Please make sure it has"
msgstr ""
-msgid "Error rendering markdown preview"
+msgid "Error rendering Markdown preview"
msgstr ""
msgid "Error saving label update."
@@ -13414,6 +13600,9 @@ msgstr ""
msgid "Error: %{error_message}"
msgstr ""
+msgid "Error: Couldn't load some or all of the changes."
+msgstr ""
+
msgid "Error: No AWS credentials were supplied"
msgstr ""
@@ -13447,6 +13636,9 @@ msgstr ""
msgid "ErrorTracking|Enable error tracking"
msgstr ""
+msgid "ErrorTracking|Error tracking backend"
+msgstr ""
+
msgid "ErrorTracking|If you self-host Sentry, enter your Sentry instance's full URL. If you use Sentry's hosted solution, enter https://sentry.io"
msgstr ""
@@ -13480,6 +13672,12 @@ msgstr ""
msgid "Escalation policies must have at least one rule"
msgstr ""
+msgid "EscalationPolicies|%{clockIcon} IF alert is not %{alertStatus} in %{minutes}"
+msgstr ""
+
+msgid "EscalationPolicies|%{notificationIcon} THEN %{doAction} %{forScheduleOrUser}"
+msgstr ""
+
msgid "EscalationPolicies|+ Add an additional rule"
msgstr ""
@@ -13522,13 +13720,13 @@ msgstr ""
msgid "EscalationPolicies|Escalation policies"
msgstr ""
-msgid "EscalationPolicies|Escalation rules"
+msgid "EscalationPolicies|Escalation policy %{obstacle} in Project %{project}"
msgstr ""
-msgid "EscalationPolicies|Failed to load oncall-schedules"
+msgid "EscalationPolicies|Escalation rules"
msgstr ""
-msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} %{then} THEN %{doAction} %{scheduleOrUser}"
+msgid "EscalationPolicies|Failed to load oncall-schedules"
msgstr ""
msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} minutes"
@@ -13606,18 +13804,36 @@ msgstr ""
msgid "Every %{action} attempt has failed: %{job_error_message}. Please try again."
msgstr ""
+msgid "Every 3 months"
+msgstr ""
+
+msgid "Every 3 months on the %{day} at %{time} %{timezone}"
+msgstr ""
+
+msgid "Every 6 months"
+msgstr ""
+
+msgid "Every 6 months on the %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Every day"
msgstr ""
msgid "Every day (at %{time})"
msgstr ""
+msgid "Every day at %{time} %{timezone}"
+msgstr ""
+
msgid "Every month"
msgstr ""
msgid "Every month (Day %{day} at %{time})"
msgstr ""
+msgid "Every month on the %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Every three months"
msgstr ""
@@ -13633,6 +13849,15 @@ msgstr[2] ""
msgid "Every week (%{weekday} at %{time})"
msgstr ""
+msgid "Every week on %{day} at %{time} %{timezone}"
+msgstr ""
+
+msgid "Every year"
+msgstr ""
+
+msgid "Every year on %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Everyone"
msgstr ""
@@ -13669,9 +13894,6 @@ msgstr ""
msgid "Exactly one of %{attributes} is required"
msgstr ""
-msgid "Example: %{ip_address}. %{read_more_link}."
-msgstr ""
-
msgid "Example: @sub\\.company\\.com$"
msgstr ""
@@ -13738,13 +13960,13 @@ msgstr ""
msgid "Expand pipeline"
msgstr ""
-msgid "Expand sidebar"
+msgid "Expand settings section"
msgstr ""
-msgid "Expected documents: %{expected_documents}"
+msgid "Expand sidebar"
msgstr ""
-msgid "Experienced"
+msgid "Expected documents: %{expected_documents}"
msgstr ""
msgid "ExperimentSubject|Must have exactly one of User, Namespace, or Project."
@@ -14029,9 +14251,6 @@ msgstr ""
msgid "Failed to load related branches"
msgstr ""
-msgid "Failed to load sidebar lock status"
-msgstr ""
-
msgid "Failed to load stacktrace."
msgstr ""
@@ -14458,6 +14677,9 @@ msgstr ""
msgid "Files"
msgstr ""
+msgid "Files API Rate Limits"
+msgstr ""
+
msgid "Files breadcrumb"
msgstr ""
@@ -15457,6 +15679,9 @@ msgstr ""
msgid "GitLab group: %{source_link}"
msgstr ""
+msgid "GitLab informs you if a new version is available."
+msgstr ""
+
msgid "GitLab is a complete DevOps platform, delivered as a single application, fundamentally changing the way Development, Security, and Ops teams collaborate"
msgstr ""
@@ -15472,7 +15697,7 @@ msgstr ""
msgid "GitLab is open source software to collaborate on code."
msgstr ""
-msgid "GitLab is undergoing maintenance and is operating in a read-only mode."
+msgid "GitLab is undergoing maintenance and is operating in read-only mode."
msgstr ""
msgid "GitLab member or Email address"
@@ -15484,9 +15709,6 @@ msgstr ""
msgid "GitLab project export"
msgstr ""
-msgid "GitLab restart is required to apply changes."
-msgstr ""
-
msgid "GitLab single sign-on URL"
msgstr ""
@@ -15502,9 +15724,6 @@ msgstr ""
msgid "GitLab version"
msgstr ""
-msgid "GitLab will inform you if a new version is available."
-msgstr ""
-
msgid "GitLab will run a background job that will produce pseudonymized CSVs of the GitLab database that will be uploaded to your configured object storage directory."
msgstr ""
@@ -15769,9 +15988,21 @@ msgstr ""
msgid "Go to snippets"
msgstr ""
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check 'Allowed domains for sign-ups'."
+msgstr ""
+
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check 'Email restrictions for sign-ups'."
+msgstr ""
+
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check the 'Domain denylist'."
+msgstr ""
+
msgid "Go to the activity feed"
msgstr ""
+msgid "Go to the group’s 'Settings &gt; General' page, and check 'Restrict membership by email domain'."
+msgstr ""
+
msgid "Go to the milestone list"
msgstr ""
@@ -15808,6 +16039,12 @@ msgstr ""
msgid "Goal of the changes and what reviewers should be aware of"
msgstr ""
+msgid "Google Cloud"
+msgstr ""
+
+msgid "Google Cloud offers several deployment targets. Select the one most suitable for your project."
+msgstr ""
+
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
@@ -15892,9 +16129,6 @@ msgstr ""
msgid "Group ID"
msgstr ""
-msgid "Group ID: %{group_id}"
-msgstr ""
-
msgid "Group Owner must have signed in with SAML before enabling Group Managed Accounts"
msgstr ""
@@ -16069,6 +16303,12 @@ msgstr ""
msgid "GroupImport|Unable to process group import file"
msgstr ""
+msgid "GroupPage|Copy group ID"
+msgstr ""
+
+msgid "GroupPage|Group ID: %{group_id}"
+msgstr ""
+
msgid "GroupRoadmap|%{dateWord} – No end date"
msgstr ""
@@ -16123,6 +16363,9 @@ msgstr ""
msgid "GroupRoadmap|Within 3 years"
msgstr ""
+msgid "GroupSAML|\"persistent\" recommended"
+msgstr ""
+
msgid "GroupSAML|%{strongOpen}Warning%{strongClose} - Enabling %{linkStart}SSO enforcement%{linkEnd} can reduce security risks."
msgstr ""
@@ -16255,6 +16498,9 @@ msgstr ""
msgid "GroupSAML|To be able to prohibit outer forks, you first need to enforce dedicate group managed accounts."
msgstr ""
+msgid "GroupSAML|Use SAML group links to manage group membership using SAML."
+msgstr ""
+
msgid "GroupSAML|Valid SAML Response"
msgstr ""
@@ -16267,13 +16513,10 @@ msgstr ""
msgid "GroupSAML|as %{access_level}"
msgstr ""
-msgid "GroupSAML|must match stored NameID of \"%{extern_uid}\" as we use this to identify users. If the NameID changes users will be unable to sign in."
-msgstr ""
-
-msgid "GroupSAML|should be \"persistent\""
+msgid "GroupSAML|must match stored NameID of \"%{extern_uid}\" to identify user and allow sign in"
msgstr ""
-msgid "GroupSAML|should be a random persistent ID, emails are discouraged"
+msgid "GroupSAML|recommend persistent ID instead of email"
msgstr ""
msgid "GroupSelect|No matching results"
@@ -16288,9 +16531,15 @@ msgstr ""
msgid "GroupSettings|Allow project access token creation"
msgstr ""
+msgid "GroupSettings|Applied to all subgroups unless overridden by a group owner. Groups already added to the project lose access."
+msgstr ""
+
msgid "GroupSettings|Auto DevOps pipeline was updated for the group"
msgstr ""
+msgid "GroupSettings|Available only on the top-level group. Applies to all subgroups. Groups already shared with a group outside %{group} are still shared unless removed manually."
+msgstr ""
+
msgid "GroupSettings|Badges"
msgstr ""
@@ -16342,6 +16591,9 @@ msgstr ""
msgid "GroupSettings|New runners registration token has been generated!"
msgstr ""
+msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgstr ""
+
msgid "GroupSettings|Pipeline settings was updated for the group"
msgstr ""
@@ -16354,12 +16606,15 @@ msgstr ""
msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
-msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups."
+msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups"
msgstr ""
msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
msgstr ""
+msgid "GroupSettings|Prevents group members from being notified if the group is mentioned."
+msgstr ""
+
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
msgstr ""
@@ -16396,21 +16651,6 @@ msgstr ""
msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}."
msgstr ""
-msgid "GroupSettings|This setting is only available on the top-level group and it applies to all subgroups. Groups that have already been shared with a group outside %{group} will still be shared, and this access will have to be revoked manually."
-msgstr ""
-
-msgid "GroupSettings|This setting will be applied to all subgroups unless overridden by a group owner. Groups that already have access to the project will continue to have access unless removed manually."
-msgstr ""
-
-msgid "GroupSettings|This setting will override user notification preferences for all members of the group, subgroups, and projects."
-msgstr ""
-
-msgid "GroupSettings|This setting will prevent group members from being notified if the group is mentioned."
-msgstr ""
-
-msgid "GroupSettings|This setting will prevent group members from forking projects outside of the group."
-msgstr ""
-
msgid "GroupSettings|Transfer group"
msgstr ""
@@ -16528,7 +16768,7 @@ msgstr ""
msgid "GroupsNew|No import options available"
msgstr ""
-msgid "GroupsNew|Not all related objects are migrated, as %{docs_link_start}described here%{docs_link_end}. Please %{feedback_link_start}leave feedback%{feedback_link_end} on this feature."
+msgid "GroupsNew|Not all related objects are migrated. %{docs_link_start}More info%{docs_link_end}."
msgstr ""
msgid "GroupsNew|Personal access token"
@@ -16660,15 +16900,27 @@ msgstr ""
msgid "Hello %{name},"
msgstr ""
-msgid "Hello there"
-msgstr ""
-
msgid "Hello, %{name}!"
msgstr ""
msgid "Hello, %{username}!"
msgstr ""
+msgid "HelloMessage|%{handshake_emoji} Contribute to GitLab: %{contribute_link}"
+msgstr ""
+
+msgid "HelloMessage|%{magnifier_emoji} Create a new GitLab issue: %{new_issue_link}"
+msgstr ""
+
+msgid "HelloMessage|%{rocket_emoji} We like your curiosity! Help us improve GitLab by joining the team: %{jobs_page_link}"
+msgstr ""
+
+msgid "HelloMessage|Does this page need fixes or improvements? Open an issue or contribute a merge request to help make GitLab more lovable. At GitLab, everyone can contribute!"
+msgstr ""
+
+msgid "HelloMessage|Welcome to GitLab!"
+msgstr ""
+
msgid "Help"
msgstr ""
@@ -16678,13 +16930,10 @@ msgstr ""
msgid "Helps prevent bots from creating accounts."
msgstr ""
-msgid "Helps prevent bots from creating issues"
-msgstr ""
-
-msgid "Helps prevent malicious users hide their activity"
+msgid "Helps prevent bots from creating issues."
msgstr ""
-msgid "Helps reduce request volume (e.g. from crawlers or abusive bots)"
+msgid "Helps prevent malicious users hide their activity."
msgstr ""
msgid "Helps reduce request volume (for example, from crawlers or abusive bots)"
@@ -16810,6 +17059,12 @@ msgstr ""
msgid "Housekeeping, export, path, transfer, remove, archive."
msgstr ""
+msgid "How do I configure Akismet?"
+msgstr ""
+
+msgid "How do I configure it?"
+msgstr ""
+
msgid "How do I configure runners?"
msgstr ""
@@ -16831,19 +17086,25 @@ msgstr ""
msgid "How do I set up this service?"
msgstr ""
+msgid "How do I use a web terminal?"
+msgstr ""
+
+msgid "How do I use file templates?"
+msgstr ""
+
msgid "How it works"
msgstr ""
msgid "How many days need to pass between marking entity for deletion and actual removing it."
msgstr ""
-msgid "How many seconds an IP will be counted towards the limit"
+msgid "How many seconds an IP counts toward the IP address limit."
msgstr ""
-msgid "I accept the %{terms_link}"
+msgid "How the job limiter handles jobs exceeding the thresholds specified below. The 'track' mode only logs the jobs. The 'compress' mode compresses the jobs and raises an exception if the compressed size exceeds the limit."
msgstr ""
-msgid "I accept the|Terms of Service and Privacy Policy"
+msgid "I accept the %{terms_link}"
msgstr ""
msgid "I forgot my password"
@@ -16927,13 +17188,16 @@ msgstr ""
msgid "IP Address"
msgstr ""
-msgid "IP expiration time"
+msgid "IP address expiration time"
msgstr ""
-msgid "IP subnet restriction only allowed for top-level groups"
+msgid "IP address restrictions"
+msgstr ""
+
+msgid "IP addresses per user"
msgstr ""
-msgid "IPs per user"
+msgid "IP subnet restriction only allowed for top-level groups"
msgstr ""
msgid "Identifier"
@@ -16948,6 +17212,9 @@ msgstr ""
msgid "If any indexed field exceeds this limit it will be truncated to this number of characters and the rest will not be indexed or searchable. This does not apply to repository and wiki indexing. Setting this to 0 means it is unlimited."
msgstr ""
+msgid "If blank, defaults to %{code_open}Retry later%{code_close}."
+msgstr ""
+
msgid "If blank, set allowable lifetime to %{instance_level_policy_in_words}, as defined by the instance admin. Once set, existing tokens for users in this group may be revoked."
msgstr ""
@@ -16999,6 +17266,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 did not initiate these sign-in attempts, please reach out to your administrator or enable two-factor authentication (2FA) on your account."
+msgstr ""
+
msgid "If you did not initiate this change, please contact your administrator immediately."
msgstr ""
@@ -17092,10 +17362,10 @@ msgstr ""
msgid "Import Projects from Gitea"
msgstr ""
-msgid "Import a project"
+msgid "Import an exported GitLab project"
msgstr ""
-msgid "Import an exported GitLab project"
+msgid "Import and export rate limits"
msgstr ""
msgid "Import failed due to a GitHub error: %{original}"
@@ -17107,12 +17377,18 @@ msgstr ""
msgid "Import from Jira"
msgstr ""
+msgid "Import group"
+msgstr ""
+
msgid "Import group from file"
msgstr ""
msgid "Import groups"
msgstr ""
+msgid "Import history"
+msgstr ""
+
msgid "Import in progress"
msgstr ""
@@ -17176,7 +17452,25 @@ msgstr ""
msgid "Import timed out. Import took longer than %{import_jobs_expiration} seconds"
msgstr ""
-msgid "Import/Export Rate Limits"
+msgid "ImportAProjectModal|Import from a project"
+msgstr ""
+
+msgid "ImportAProjectModal|Import members from another project"
+msgstr ""
+
+msgid "ImportAProjectModal|Import project members"
+msgstr ""
+
+msgid "ImportAProjectModal|Only project members (not group members) are imported, and they get the same permissions as the project you import from."
+msgstr ""
+
+msgid "ImportAProjectModal|Successfully imported"
+msgstr ""
+
+msgid "ImportAProjectModal|Unable to import project members"
+msgstr ""
+
+msgid "ImportAProjectModal|You're importing members to the %{strongStart}%{name}%{strongEnd} project."
msgstr ""
msgid "ImportButtons|Connect repositories from"
@@ -17230,7 +17524,7 @@ msgstr[2] ""
msgid "Importing..."
msgstr ""
-msgid "Import|A repository URL usually ends in a .git suffix, although this is not required. Double check to make sure your repository URL is correct."
+msgid "Import|There is not a valid Git repository at this URL. If your HTTP repository is not publicly accessible, verify your credentials."
msgstr ""
msgid "Improve customer support with Service Desk"
@@ -17239,9 +17533,6 @@ msgstr ""
msgid "Improves Git cloning performance."
msgstr ""
-msgid "In %{time_to_now}"
-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 ""
@@ -17527,7 +17818,7 @@ msgstr ""
msgid "InProductMarketing|Start a GitLab Ultimate trial today in less than one minute, no credit card required."
msgstr ""
-msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no CC required"
+msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no credit card required"
msgstr ""
msgid "InProductMarketing|Start a trial"
@@ -17566,7 +17857,7 @@ msgstr ""
msgid "InProductMarketing|Team up in GitLab for greater efficiency"
msgstr ""
-msgid "InProductMarketing|Team work makes the dream work"
+msgid "InProductMarketing|Team work makes the dream work"
msgstr ""
msgid "InProductMarketing|Test, create, deploy"
@@ -18148,6 +18439,9 @@ msgstr ""
msgid "Integrations|Create new issue in Jira"
msgstr ""
+msgid "Integrations|Create new issue in ZenTao"
+msgstr ""
+
msgid "Integrations|Default settings are inherited from the group level."
msgstr ""
@@ -18241,9 +18535,15 @@ msgstr ""
msgid "Integrations|Search Jira issues"
msgstr ""
+msgid "Integrations|Search ZenTao issues"
+msgstr ""
+
msgid "Integrations|Send notifications about project events to Unify Circuit."
msgstr ""
+msgid "Integrations|Send notifications about project events to a Unify Circuit conversation. %{docs_link}"
+msgstr ""
+
msgid "Integrations|Sign in to add namespaces"
msgstr ""
@@ -18283,6 +18583,9 @@ msgstr ""
msgid "Integrations|You've activated every integration 🎉"
msgstr ""
+msgid "Integrations|ZenTao issues display here when you create issues in your project in ZenTao."
+msgstr ""
+
msgid "Interactive mode"
msgstr ""
@@ -18310,9 +18613,6 @@ msgstr ""
msgid "Interval Pattern"
msgstr ""
-msgid "Introducing Value Stream Analytics"
-msgstr ""
-
msgid "Introducing Your DevOps Report"
msgstr ""
@@ -18409,6 +18709,12 @@ msgstr ""
msgid "Investigate vulnerability: %{title}"
msgstr ""
+msgid "Invisible Captcha"
+msgstr ""
+
+msgid "Invisible Captcha helps prevent the creation of spam accounts. It adds a honeypot field and time-sensitive form submission to the account signup form."
+msgstr ""
+
msgid "Invitation"
msgstr ""
@@ -18862,12 +19168,18 @@ msgstr ""
msgid "Issues"
msgstr ""
+msgid "Issues I've created"
+msgstr ""
+
msgid "Issues Rate Limits"
msgstr ""
msgid "Issues and merge requests"
msgstr ""
+msgid "Issues assigned to me"
+msgstr ""
+
msgid "Issues can be bugs, tasks or ideas to be discussed. Also, issues are searchable and filterable."
msgstr ""
@@ -18979,7 +19291,7 @@ msgstr ""
msgid "Iterations|Create cadence"
msgstr ""
-msgid "Iterations|Create your first iteration"
+msgid "Iterations|Create iteration"
msgstr ""
msgid "Iterations|Delete cadence"
@@ -18988,6 +19300,9 @@ msgstr ""
msgid "Iterations|Delete iteration cadence?"
msgstr ""
+msgid "Iterations|Delete iteration?"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -19021,12 +19336,18 @@ msgstr ""
msgid "Iterations|New iteration cadence"
msgstr ""
+msgid "Iterations|No closed iterations."
+msgstr ""
+
msgid "Iterations|No iteration cadences to show."
msgstr ""
msgid "Iterations|No iterations in cadence."
msgstr ""
+msgid "Iterations|No open iterations."
+msgstr ""
+
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
@@ -19057,6 +19378,9 @@ msgstr ""
msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
msgstr ""
+msgid "Iterations|This will remove the iteration from any issues that are assigned to it."
+msgstr ""
+
msgid "Iterations|Title"
msgstr ""
@@ -19072,15 +19396,9 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "I’m familiar with the basics of DevOps."
-msgstr ""
-
msgid "I’m joining my team who’s already on GitLab"
msgstr ""
-msgid "I’m not familiar with the basics of DevOps."
-msgstr ""
-
msgid "Jaeger URL"
msgstr ""
@@ -19345,6 +19663,9 @@ msgstr ""
msgid "Job"
msgstr ""
+msgid "Job %{jobName}"
+msgstr ""
+
msgid "Job Failed #%{build_id}"
msgstr ""
@@ -19936,9 +20257,6 @@ msgstr ""
msgid "Learn more in the"
msgstr ""
-msgid "Learn more in the|pipeline schedules documentation"
-msgstr ""
-
msgid "Learn more."
msgstr ""
@@ -20050,9 +20368,6 @@ msgstr ""
msgid "Leave Admin Mode"
msgstr ""
-msgid "Leave blank for no limit. Once set, existing personal access tokens may be revoked."
-msgstr ""
-
msgid "Leave edit mode? All unsaved changes will be lost."
msgstr ""
@@ -20098,10 +20413,10 @@ msgstr ""
msgid "LicenseCompliance|Acceptable license to be used in the project"
msgstr ""
-msgid "LicenseCompliance|Add a license"
+msgid "LicenseCompliance|Add license and related policy"
msgstr ""
-msgid "LicenseCompliance|Add license and related policy"
+msgid "LicenseCompliance|Add license policy"
msgstr ""
msgid "LicenseCompliance|Allow"
@@ -20197,6 +20512,9 @@ msgstr ""
msgid "LicenseManagement|Uncategorized"
msgstr ""
+msgid "Licensed Enterprise Edition features can be used if the project namespace's plan includes the feature, or if the project is public."
+msgstr ""
+
msgid "Licensed Features"
msgstr ""
@@ -20263,7 +20581,10 @@ msgstr ""
msgid "Limit namespaces and projects that can be indexed"
msgstr ""
-msgid "Limit sign in from multiple ips"
+msgid "Limit project size at a global, group, and project level. %{link_start}Learn more%{link_end}."
+msgstr ""
+
+msgid "Limit sign in from multiple IP addresses"
msgstr ""
msgid "Limit the number of concurrent operations this secondary site can run in the background."
@@ -20275,12 +20596,18 @@ msgstr ""
msgid "Limit the number of issues and epics per minute a user can create through web and API requests."
msgstr ""
+msgid "Limit the size of Sidekiq jobs stored in Redis."
+msgstr ""
+
msgid "Limited to showing %d event at most"
msgid_plural "Limited to showing %d events at most"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
+msgid "Limiting mode"
+msgstr ""
+
msgid "Line changes"
msgstr ""
@@ -20350,9 +20677,6 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
-msgid "List of users to be excluded from the limit"
-msgstr ""
-
msgid "List options"
msgstr ""
@@ -20392,9 +20716,6 @@ msgstr ""
msgid "Loading functions timed out. Please reload the page to try again."
msgstr ""
-msgid "Loading issues"
-msgstr ""
-
msgid "Loading more"
msgstr ""
@@ -20686,6 +21007,9 @@ msgstr ""
msgid "Marked For Deletion At - %{deletion_time}"
msgstr ""
+msgid "Marked as ready. Merging is now allowed."
+msgstr ""
+
msgid "Marked this %{noun} as a draft."
msgstr ""
@@ -20758,52 +21082,22 @@ msgstr ""
msgid "Max 100,000 events"
msgstr ""
-msgid "Max 20 characters"
-msgstr ""
-
-msgid "Max Group Export Download requests per minute per user"
-msgstr ""
-
-msgid "Max Group Export requests per minute per user"
-msgstr ""
-
-msgid "Max Group Import requests per minute per user"
-msgstr ""
-
-msgid "Max Project Export Download requests per minute per user"
-msgstr ""
-
-msgid "Max Project Export requests per minute per user"
-msgstr ""
-
-msgid "Max Project Import requests per minute per user"
-msgstr ""
-
-msgid "Max authenticated API requests per period per user"
-msgstr ""
-
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
-msgid "Max authenticated web requests per period per user"
-msgstr ""
-
msgid "Max file size is 200 KB."
msgstr ""
-msgid "Max requests per minute per user"
-msgstr ""
-
msgid "Max role"
msgstr ""
msgid "Max session time"
msgstr ""
-msgid "Max unauthenticated requests per period per IP"
+msgid "MaxBuilds"
msgstr ""
-msgid "MaxBuilds"
+msgid "Maximum 20 characters"
msgstr ""
msgid "Maximum Conan package file size in bytes"
@@ -20839,6 +21133,12 @@ msgstr ""
msgid "Maximum attachment size (MB)"
msgstr ""
+msgid "Maximum authenticated API requests per rate limit period per user"
+msgstr ""
+
+msgid "Maximum authenticated web requests per rate limit period per user"
+msgstr ""
+
msgid "Maximum bulk request size (MiB)"
msgstr ""
@@ -20884,6 +21184,15 @@ msgstr ""
msgid "Maximum files in a diff"
msgstr ""
+msgid "Maximum group export download requests per minute"
+msgstr ""
+
+msgid "Maximum group export requests per minute"
+msgstr ""
+
+msgid "Maximum group import requests per minute"
+msgstr ""
+
msgid "Maximum import size"
msgstr ""
@@ -20920,7 +21229,7 @@ msgstr ""
msgid "Maximum number of projects."
msgstr ""
-msgid "Maximum number of unique IPs per user"
+msgid "Maximum number of unique IP addresses per user."
msgstr ""
msgid "Maximum page reached"
@@ -20929,12 +21238,24 @@ msgstr ""
msgid "Maximum page size"
msgstr ""
+msgid "Maximum project export download requests per minute"
+msgstr ""
+
+msgid "Maximum project export requests per minute"
+msgstr ""
+
+msgid "Maximum project import requests per minute"
+msgstr ""
+
msgid "Maximum push size"
msgstr ""
msgid "Maximum push size (MB)"
msgstr ""
+msgid "Maximum requests per minute"
+msgstr ""
+
msgid "Maximum running slices"
msgstr ""
@@ -20962,10 +21283,16 @@ msgstr ""
msgid "Maximum time between updates that a mirror can have when scheduled to synchronize."
msgstr ""
-msgid "Maximum time for web terminal websocket connection (in seconds). 0 for unlimited."
+msgid "Maximum time that users are allowed to skip the setup of two-factor authentication (in hours). Set to 0 (zero) to enforce at next sign in."
msgstr ""
-msgid "Maximum time that users are allowed to skip the setup of two-factor authentication (in hours). Set to 0 (zero) to enforce at next sign in."
+msgid "Maximum time, in seconds, for a web terminal websocket connection. 0 for unlimited."
+msgstr ""
+
+msgid "Maximum unauthenticated API requests per rate limit period per IP"
+msgstr ""
+
+msgid "Maximum unauthenticated web requests per rate limit period per IP"
msgstr ""
msgid "May"
@@ -20983,9 +21310,6 @@ msgstr ""
msgid "Medium vulnerabilities present"
msgstr ""
-msgid "Member lock"
-msgstr ""
-
msgid "Member since"
msgstr ""
@@ -21022,6 +21346,9 @@ msgstr ""
msgid "Members of a group may only view projects they have permission to access"
msgstr ""
+msgid "Membership"
+msgstr ""
+
msgid "Members|%{time} by %{user}"
msgstr ""
@@ -21082,9 +21409,6 @@ msgstr ""
msgid "Members|Expiration date updated successfully."
msgstr ""
-msgid "Members|Expired"
-msgstr ""
-
msgid "Members|Filter members"
msgstr ""
@@ -21100,9 +21424,6 @@ msgstr ""
msgid "Members|Membership"
msgstr ""
-msgid "Members|No expiration set"
-msgstr ""
-
msgid "Members|Remove \"%{groupName}\""
msgstr ""
@@ -21124,9 +21445,6 @@ msgstr ""
msgid "Members|Search invited"
msgstr ""
-msgid "Members|in %{time}"
-msgstr ""
-
msgid "Member|Deny access"
msgstr ""
@@ -21202,9 +21520,6 @@ msgstr ""
msgid "Merge request %{mr_link} was reviewed by %{mr_author}"
msgstr ""
-msgid "Merge request (MR) approvals"
-msgstr ""
-
msgid "Merge request analytics"
msgstr ""
@@ -21226,12 +21541,21 @@ msgstr ""
msgid "Merge requests"
msgstr ""
+msgid "Merge requests I've created"
+msgstr ""
+
msgid "Merge requests are a place to propose changes you've made to a project and discuss those changes with others"
msgstr ""
msgid "Merge requests are read-only in a secondary Geo node"
msgstr ""
+msgid "Merge requests assigned to me"
+msgstr ""
+
+msgid "Merge requests that I'm a reviewer"
+msgstr ""
+
msgid "Merge the branch and fix any conflicts that come up"
msgstr ""
@@ -21292,10 +21616,10 @@ msgstr ""
msgid "MergeRequests|An error occurred while saving the draft comment."
msgstr ""
-msgid "MergeRequests|Failed to squash. Should be done manually."
+msgid "MergeRequests|Create issue to resolve thread"
msgstr ""
-msgid "MergeRequests|Resolve this thread in a new issue"
+msgid "MergeRequests|Failed to squash. Should be done manually."
msgstr ""
msgid "MergeRequests|Saving the comment failed"
@@ -22111,6 +22435,9 @@ msgstr ""
msgid "MoveIssue|Cannot move issue to project it originates from!"
msgstr ""
+msgid "MoveIssue|Cannot move issues of '%{issue_type}' type."
+msgstr ""
+
msgid "Moved issue to %{label} column in the board."
msgstr ""
@@ -22237,6 +22564,15 @@ 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. To learn more about reducing storage capacity please visit our docs."
msgstr ""
+msgid "NamespaceUserCap|Pending users must be reviewed and approved by a group owner. Learn more about %{user_caps_link_start}User Caps%{link_end} and %{users_pending_approval_link_start}Users Pending Approval%{link_end}."
+msgstr ""
+
+msgid "NamespaceUserCap|View pending user approvals"
+msgstr ""
+
+msgid "NamespaceUserCap|Your group has reached its billable member limit"
+msgstr ""
+
msgid "Namespaces"
msgstr ""
@@ -22279,9 +22615,6 @@ msgstr ""
msgid "Network"
msgstr ""
-msgid "Network Policy|New rule"
-msgstr ""
-
msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is inbound from a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
msgstr ""
@@ -22303,16 +22636,13 @@ msgstr ""
msgid "NetworkPolicies|%{strongOpen}any%{strongClose} port"
msgstr ""
-msgid "NetworkPolicies|+ Add alert"
-msgstr ""
-
msgid "NetworkPolicies|.yaml"
msgstr ""
msgid "NetworkPolicies|.yaml mode"
msgstr ""
-msgid "NetworkPolicies|Actions"
+msgid "NetworkPolicies|Add alert"
msgstr ""
msgid "NetworkPolicies|Alerts are intended to be selectively used for a limited number of events that are potentially concerning and warrant a manual review. Alerts should not be used as a substitute for a SIEM or a logging tool. High volume alerts are likely to be dropped so as to preserve the stability of GitLab's integration with Kubernetes."
@@ -22348,9 +22678,6 @@ msgstr ""
msgid "NetworkPolicies|Deny all traffic"
msgstr ""
-msgid "NetworkPolicies|Description"
-msgstr ""
-
msgid "NetworkPolicies|Edit policy"
msgstr ""
@@ -22363,9 +22690,6 @@ msgstr ""
msgid "NetworkPolicies|IP/subnet"
msgstr ""
-msgid "NetworkPolicies|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
-msgstr ""
-
msgid "NetworkPolicies|Invalid or empty policy"
msgstr ""
@@ -22375,19 +22699,16 @@ msgstr ""
msgid "NetworkPolicies|Kubernetes error: %{error}"
msgstr ""
-msgid "NetworkPolicies|Name"
-msgstr ""
-
msgid "NetworkPolicies|Network"
msgstr ""
-msgid "NetworkPolicies|Network traffic"
+msgid "NetworkPolicies|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
msgstr ""
-msgid "NetworkPolicies|New policy"
+msgid "NetworkPolicies|Network policy can be created after the environment is loaded successfully."
msgstr ""
-msgid "NetworkPolicies|No policies detected"
+msgid "NetworkPolicies|Network traffic"
msgstr ""
msgid "NetworkPolicies|None selected"
@@ -22396,21 +22717,12 @@ msgstr ""
msgid "NetworkPolicies|Please %{installLinkStart}install%{installLinkEnd} and %{configureLinkStart}configure a Kubernetes Agent for this project%{configureLinkEnd} to enable alerts."
msgstr ""
-msgid "NetworkPolicies|Policies are a specification of how groups of pods are allowed to communicate with each other's network endpoints."
-msgstr ""
-
msgid "NetworkPolicies|Policy %{policyName} was successfully changed"
msgstr ""
msgid "NetworkPolicies|Policy definition"
msgstr ""
-msgid "NetworkPolicies|Policy editor"
-msgstr ""
-
-msgid "NetworkPolicies|Policy preview"
-msgstr ""
-
msgid "NetworkPolicies|Rule"
msgstr ""
@@ -22420,9 +22732,6 @@ msgstr ""
msgid "NetworkPolicies|Rule mode is unavailable for this policy. In some cases, we cannot parse the YAML file back into the rules editor."
msgstr ""
-msgid "NetworkPolicies|Rules"
-msgstr ""
-
msgid "NetworkPolicies|Save changes"
msgstr ""
@@ -22435,9 +22744,6 @@ msgstr ""
msgid "NetworkPolicies|Traffic that does not match any rule will be blocked."
msgstr ""
-msgid "NetworkPolicies|Unable to parse policy"
-msgstr ""
-
msgid "NetworkPolicies|all DNS names"
msgstr ""
@@ -22618,6 +22924,9 @@ msgstr ""
msgid "New issue"
msgstr ""
+msgid "New issue in %{project}"
+msgstr ""
+
msgid "New issue title"
msgstr ""
@@ -22696,7 +23005,7 @@ msgstr ""
msgid "Newest first"
msgstr ""
-msgid "Newly registered users will by default be external"
+msgid "Newly-registered users are external by default"
msgstr ""
msgid "Next"
@@ -23011,8 +23320,11 @@ msgstr ""
msgid "No webhooks found, add one in the form above."
msgstr ""
-msgid "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} to renew your subscription."
-msgstr ""
+msgid "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} day to renew your subscription."
+msgid_plural "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} days to renew your subscription."
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
msgid "No. of commits"
msgstr ""
@@ -23029,7 +23341,7 @@ msgstr ""
msgid "Nodes"
msgstr ""
-msgid "Non-admin users can sign in with read-only access and make read-only API requests."
+msgid "Non-admin users are restricted to read-only access, in both GitLab UI and API."
msgstr ""
msgid "None"
@@ -23110,7 +23422,7 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
-msgid "Notes Rate Limits"
+msgid "Notes rate limit"
msgstr ""
msgid "Notes|Are you sure you want to cancel creating this comment?"
@@ -23281,9 +23593,6 @@ msgstr ""
msgid "November"
msgstr ""
-msgid "Novice"
-msgstr ""
-
msgid "Now, personalize your GitLab experience"
msgstr ""
@@ -23452,7 +23761,7 @@ msgstr ""
msgid "OnCallSchedules|For this rotation, on-call will be:"
msgstr ""
-msgid "OnCallSchedules|On-call schedule %{schedule} in Project %{project}"
+msgid "OnCallSchedules|On-call schedule %{obstacle} in Project %{project}"
msgstr ""
msgid "OnCallSchedules|On-call schedules"
@@ -23599,22 +23908,22 @@ msgstr ""
msgid "OnDemandScans|Scanner profile"
msgstr ""
-msgid "OnDemandScans|Select one of the existing profiles"
+msgid "OnDemandScans|Schedule scan"
msgstr ""
-msgid "OnDemandScans|Site profile"
+msgid "OnDemandScans|Select one of the existing profiles"
msgstr ""
-msgid "OnDemandScans|Use existing scanner profile"
+msgid "OnDemandScans|Site profile"
msgstr ""
-msgid "OnDemandScans|Use existing site profile"
+msgid "OnDemandScans|Start time"
msgstr ""
-msgid "OnDemandScans|You can either choose a passive scan or validate the target site in your chosen site profile. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
+msgid "OnDemandScans|Use existing scanner profile"
msgstr ""
-msgid "OnDemandScans|You cannot run an active scan against an unvalidated site."
+msgid "OnDemandScans|Use existing site profile"
msgstr ""
msgid "OnDemandScans|You must create a repository within your project to run an on-demand scan."
@@ -23680,6 +23989,9 @@ msgstr ""
msgid "Only admins can delete project"
msgstr ""
+msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
+msgstr ""
+
msgid "Only include features new to your current subscription tier."
msgstr ""
@@ -23698,6 +24010,12 @@ msgstr ""
msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
+msgid "Only reCAPTCHA v2 is supported:"
+msgstr ""
+
+msgid "Only users from the specified IP address ranges are able to reach this group, including all subgroups, projects, and Git repositories."
+msgstr ""
+
msgid "Only verified users with an email address in any of these domains can be added to the group."
msgstr ""
@@ -23884,9 +24202,6 @@ msgstr ""
msgid "Package Registry"
msgstr ""
-msgid "Package Registry Rate Limits"
-msgstr ""
-
msgid "Package Registry: authenticated API requests"
msgstr ""
@@ -23905,6 +24220,9 @@ msgstr ""
msgid "Package recipe already exists"
msgstr ""
+msgid "Package registry rate limits"
+msgstr ""
+
msgid "Package type"
msgstr ""
@@ -23971,6 +24289,9 @@ msgstr ""
msgid "PackageRegistry|Composer"
msgstr ""
+msgid "PackageRegistry|Composer.json with license: %{license} and version: %{version}"
+msgstr ""
+
msgid "PackageRegistry|Conan"
msgstr ""
@@ -24034,6 +24355,9 @@ msgstr ""
msgid "PackageRegistry|Copy require package include"
msgstr ""
+msgid "PackageRegistry|Copy target SHA"
+msgstr ""
+
msgid "PackageRegistry|Copy yarn command"
msgstr ""
@@ -24100,6 +24424,9 @@ msgstr ""
msgid "PackageRegistry|Install package version"
msgstr ""
+msgid "PackageRegistry|Instance-level"
+msgstr ""
+
msgid "PackageRegistry|Invalid Package: failed metadata extraction"
msgstr ""
@@ -24145,6 +24472,9 @@ msgstr ""
msgid "PackageRegistry|Pip Command"
msgstr ""
+msgid "PackageRegistry|Project-level"
+msgstr ""
+
msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
msgstr ""
@@ -24166,6 +24496,9 @@ msgstr ""
msgid "PackageRegistry|Remove package"
msgstr ""
+msgid "PackageRegistry|Required Python: %{pythonVersion}"
+msgstr ""
+
msgid "PackageRegistry|RubyGems"
msgstr ""
@@ -24208,6 +24541,9 @@ msgstr ""
msgid "PackageRegistry|Source project located at %{link}"
msgstr ""
+msgid "PackageRegistry|Target SHA: %{sha}"
+msgstr ""
+
msgid "PackageRegistry|There are no other versions of this package."
msgstr ""
@@ -24376,6 +24712,18 @@ msgstr ""
msgid "Password was successfully updated. Please sign in again."
msgstr ""
+msgid "PasswordPrompt|Confirm password"
+msgstr ""
+
+msgid "PasswordPrompt|Confirm password to continue"
+msgstr ""
+
+msgid "PasswordPrompt|Password is required"
+msgstr ""
+
+msgid "PasswordPrompt|Please enter your password to confirm"
+msgstr ""
+
msgid "Passwords should be unique and not used for any other sites or services."
msgstr ""
@@ -24403,6 +24751,9 @@ msgstr ""
msgid "Paste project path (i.e. gitlab-org/gitlab)"
msgstr ""
+msgid "Paste this DSN into your Sentry SDK"
+msgstr ""
+
msgid "Paste your public SSH key, which is usually contained in the file '~/.ssh/id_ed25519.pub' or '~/.ssh/id_rsa.pub' and begins with 'ssh-ed25519' or 'ssh-rsa'. Do not paste your private SSH key, as that can compromise your identity."
msgstr ""
@@ -24487,6 +24838,9 @@ msgstr ""
msgid "PerformanceBar|First Contentful Paint"
msgstr ""
+msgid "PerformanceBar|Flamegraph with mode:"
+msgstr ""
+
msgid "PerformanceBar|Frontend resources"
msgstr ""
@@ -24520,6 +24874,15 @@ msgstr ""
msgid "PerformanceBar|Trace"
msgstr ""
+msgid "PerformanceBar|cpu"
+msgstr ""
+
+msgid "PerformanceBar|object"
+msgstr ""
+
+msgid "PerformanceBar|wall"
+msgstr ""
+
msgid "Period in seconds"
msgstr ""
@@ -24748,6 +25111,48 @@ msgstr ""
msgid "PipelineSchedules|Variables"
msgstr ""
+msgid "PipelineSource|API"
+msgstr ""
+
+msgid "PipelineSource|Chat"
+msgstr ""
+
+msgid "PipelineSource|External"
+msgstr ""
+
+msgid "PipelineSource|External Pull Request"
+msgstr ""
+
+msgid "PipelineSource|Merge Request"
+msgstr ""
+
+msgid "PipelineSource|On-Demand DAST Scan"
+msgstr ""
+
+msgid "PipelineSource|On-Demand DAST Validation"
+msgstr ""
+
+msgid "PipelineSource|Parent Pipeline"
+msgstr ""
+
+msgid "PipelineSource|Pipeline"
+msgstr ""
+
+msgid "PipelineSource|Push"
+msgstr ""
+
+msgid "PipelineSource|Schedule"
+msgstr ""
+
+msgid "PipelineSource|Trigger"
+msgstr ""
+
+msgid "PipelineSource|Web"
+msgstr ""
+
+msgid "PipelineSource|Web IDE"
+msgstr ""
+
msgid "PipelineStatusTooltip|Pipeline: %{ciStatus}"
msgstr ""
@@ -25048,46 +25453,7 @@ msgstr ""
msgid "Pipeline|Source"
msgstr ""
-msgid "Pipeline|Source|API"
-msgstr ""
-
-msgid "Pipeline|Source|Chat"
-msgstr ""
-
-msgid "Pipeline|Source|External"
-msgstr ""
-
-msgid "Pipeline|Source|External Pull Request"
-msgstr ""
-
-msgid "Pipeline|Source|Merge Request"
-msgstr ""
-
-msgid "Pipeline|Source|On-Demand DAST Scan"
-msgstr ""
-
-msgid "Pipeline|Source|On-Demand DAST Validation"
-msgstr ""
-
-msgid "Pipeline|Source|Parent Pipeline"
-msgstr ""
-
-msgid "Pipeline|Source|Pipeline"
-msgstr ""
-
-msgid "Pipeline|Source|Push"
-msgstr ""
-
-msgid "Pipeline|Source|Schedule"
-msgstr ""
-
-msgid "Pipeline|Source|Trigger"
-msgstr ""
-
-msgid "Pipeline|Source|Web"
-msgstr ""
-
-msgid "Pipeline|Source|Web IDE"
+msgid "Pipeline|Source|Security Policy"
msgstr ""
msgid "Pipeline|Specify variable values to be used in this run. The values specified in %{linkStart}CI/CD settings%{linkEnd} will be used by default."
@@ -25138,7 +25504,7 @@ msgstr ""
msgid "Pipeline|We are currently unable to fetch pipeline data"
msgstr ""
-msgid "Pipeline|You’re about to stop pipeline %{pipelineId}."
+msgid "Pipeline|You’re about to stop pipeline #%{pipelineId}."
msgstr ""
msgid "Pipeline|for"
@@ -25165,6 +25531,9 @@ msgstr ""
msgid "Plain diff"
msgstr ""
+msgid "Plain-text response to send to clients that hit a rate limit"
+msgstr ""
+
msgid "Plan:"
msgstr ""
@@ -25309,9 +25678,6 @@ msgstr ""
msgid "Please provide attributes to update"
msgstr ""
-msgid "Please provide your username or email address."
-msgstr ""
-
msgid "Please reach out if you have any questions and we'll be happy to assist."
msgstr ""
@@ -25354,9 +25720,6 @@ msgstr ""
msgid "Please set a new password before proceeding."
msgstr ""
-msgid "Please share your feedback about %{featureName} %{linkStart}in this issue%{linkEnd} to help us improve the experience."
-msgstr ""
-
msgid "Please solve the captcha"
msgstr ""
@@ -25534,6 +25897,9 @@ msgstr ""
msgid "Prevent adding new members to project membership within this group"
msgstr ""
+msgid "Prevent auto-stopping"
+msgstr ""
+
msgid "Prevent editing approval rules in projects and merge requests."
msgstr ""
@@ -25546,7 +25912,7 @@ msgstr ""
msgid "Prevent users from changing their profile name"
msgstr ""
-msgid "Prevent users from performing write operations on GitLab while performing maintenance."
+msgid "Prevent users from performing write operations while GitLab maintenance is in progress."
msgstr ""
msgid "Preview"
@@ -25819,6 +26185,9 @@ msgstr ""
msgid "Profiles|Enter your name, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Enter your password to confirm the email change"
+msgstr ""
+
msgid "Profiles|Enter your pronouns to let people know how to refer to you"
msgstr ""
@@ -26053,10 +26422,10 @@ msgstr ""
msgid "Profiles|e.g. My MacBook key"
msgstr ""
-msgid "Profiles|username"
+msgid "Profiles|https://website.com"
msgstr ""
-msgid "Profiles|website.com"
+msgid "Profiles|username"
msgstr ""
msgid "Profiles|your account"
@@ -26299,9 +26668,21 @@ msgstr ""
msgid "ProjectSelect| or group"
msgstr ""
+msgid "ProjectSelect|No matching results"
+msgstr ""
+
msgid "ProjectSelect|Search for project"
msgstr ""
+msgid "ProjectSelect|Search projects"
+msgstr ""
+
+msgid "ProjectSelect|Select a project"
+msgstr ""
+
+msgid "ProjectSelect|There was an error fetching the projects. Please try again."
+msgstr ""
+
msgid "ProjectService|Drone server URL"
msgstr ""
@@ -26389,6 +26770,9 @@ msgstr ""
msgid "ProjectService|Trigger event when a new, unique alert is recorded."
msgstr ""
+msgid "ProjectService|Trigger event when a new, unique vulnerability is recorded. (Note: This feature requires an Ultimate plan.)"
+msgstr ""
+
msgid "ProjectService|Trigger event when a pipeline status changes."
msgstr ""
@@ -26803,9 +27187,15 @@ msgstr ""
msgid "Projects are graded based on the highest severity vulnerability present"
msgstr ""
+msgid "Projects are organized into groups"
+msgstr ""
+
msgid "Projects contributed to"
msgstr ""
+msgid "Projects help you organize your work. They contain your file repository, issues, merge requests, and so much more."
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr ""
@@ -27040,10 +27430,10 @@ msgstr ""
msgid "PrometheusService|Prometheus cluster integration"
msgstr ""
-msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
+msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
msgstr ""
-msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
+msgid "PrometheusService|The ID of the IAP-secured resource."
msgstr ""
msgid "PrometheusService|The Prometheus API base URL."
@@ -27661,6 +28051,9 @@ msgstr ""
msgid "Rate limit"
msgstr ""
+msgid "Rate limits can help reduce request volume (like from crawlers or abusive bots)."
+msgstr ""
+
msgid "Raw blob request rate limit per minute"
msgstr ""
@@ -27673,6 +28066,9 @@ msgstr ""
msgid "Re-authentication required"
msgstr ""
+msgid "Re-import"
+msgstr ""
+
msgid "Re-request review"
msgstr ""
@@ -27694,6 +28090,9 @@ msgstr ""
msgid "Read more about related issues"
msgstr ""
+msgid "Read their documentation."
+msgstr ""
+
msgid "Ready to get started with GitLab? Follow these steps to set up your workspace, plan and commit changes, and deploy your project."
msgstr ""
@@ -27727,6 +28126,9 @@ msgstr ""
msgid "Receive any notifications from GitLab."
msgstr ""
+msgid "Receive notification of abuse reports by email."
+msgstr ""
+
msgid "Receive notifications about your own activity"
msgstr ""
@@ -27871,9 +28273,6 @@ msgstr ""
msgid "Registry setup"
msgstr ""
-msgid "Regulate approvals by authors/committers. Affects all projects."
-msgstr ""
-
msgid "Reindexing Status: %{status} (Slice multiplier: %{multiplier}, Maximum running slices: %{max_slices})"
msgstr ""
@@ -27970,6 +28369,9 @@ msgstr ""
msgid "Release|Something went wrong while saving the release details."
msgstr ""
+msgid "Reload page"
+msgstr ""
+
msgid "Remediations"
msgstr ""
@@ -28252,6 +28654,9 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
+msgid "Repeats"
+msgstr ""
+
msgid "Replace"
msgstr ""
@@ -28618,10 +29023,7 @@ msgstr ""
msgid "Require additional authentication for administrative tasks."
msgstr ""
-msgid "Require all users in this group to setup Two-factor authentication"
-msgstr ""
-
-msgid "Require all users in this group to setup two-factor authentication"
+msgid "Require all users in this group to set up two-factor authentication"
msgstr ""
msgid "Required approvals (%{approvals_given} given)"
@@ -28669,6 +29071,9 @@ msgstr[2] ""
msgid "Requires values to meet regular expression requirements."
msgstr ""
+msgid "Requires you to deploy or set up cloud-hosted Sentry."
+msgstr ""
+
msgid "Requires your primary GitLab email address."
msgstr ""
@@ -28729,9 +29134,6 @@ msgstr ""
msgid "Resolve"
msgstr ""
-msgid "Resolve all threads in new issue"
-msgstr ""
-
msgid "Resolve conflicts"
msgstr ""
@@ -28789,6 +29191,9 @@ msgstr ""
msgid "Response text"
msgstr ""
+msgid "Restart GitLab to apply changes."
+msgstr ""
+
msgid "Restart Terminal"
msgstr ""
@@ -28807,6 +29212,9 @@ msgstr ""
msgid "Restoring the project will prevent the project from being removed on this date and restore people's ability to make changes to it."
msgstr ""
+msgid "Restrict group access by IP address. %{link_start}Learn more%{link_end}."
+msgstr ""
+
msgid "Restrict membership by email domain"
msgstr ""
@@ -29122,6 +29530,9 @@ msgstr ""
msgid "Runners|Runner #%{runner_id}"
msgstr ""
+msgid "Runners|Runner assigned to project."
+msgstr ""
+
msgid "Runners|Runner is offline, last contact was %{runner_contact} ago"
msgstr ""
@@ -29134,6 +29545,9 @@ msgstr ""
msgid "Runners|Runner registration"
msgstr ""
+msgid "Runners|Runner unassigned from project."
+msgstr ""
+
msgid "Runners|Runners"
msgstr ""
@@ -29326,7 +29740,7 @@ msgstr ""
msgid "SastEntryPoints|How do I set up SAST?"
msgstr ""
-msgid "SastEntryPoints|Learn more."
+msgid "SastEntryPoints|Learn more"
msgstr ""
msgid "Satisfied"
@@ -29368,7 +29782,7 @@ msgstr ""
msgid "Save pipeline schedule"
msgstr ""
-msgid "Save space and find images in the container Registry. remove unneeded tags and keep only the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
+msgid "Save storage space by automatically deleting tags from the container registry and keeping the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
msgstr ""
msgid "Saving"
@@ -29542,6 +29956,9 @@ msgstr ""
msgid "Search or filter results…"
msgstr ""
+msgid "Search or jump to..."
+msgstr ""
+
msgid "Search project"
msgstr ""
@@ -29602,16 +30019,16 @@ msgstr ""
msgid "SearchCodeResults|of %{link_to_project}"
msgstr ""
-msgid "SearchResults|Showing %{count} %{scope} for%{term_element}"
+msgid "SearchResults|Showing %{count} %{scope} for %{term_element}"
msgstr ""
-msgid "SearchResults|Showing %{count} %{scope} for%{term_element} in your personal and project snippets"
+msgid "SearchResults|Showing %{count} %{scope} for %{term_element} in your personal and project snippets"
msgstr ""
-msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for%{term_element}"
+msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for %{term_element}"
msgstr ""
-msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for%{term_element} in your personal and project snippets"
+msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for %{term_element} in your personal and project snippets"
msgstr ""
msgid "SearchResults|code result"
@@ -29704,6 +30121,9 @@ msgstr ""
msgid "Secret Detection"
msgstr ""
+msgid "Secret access key"
+msgstr ""
+
msgid "Secret token"
msgstr ""
@@ -29743,9 +30163,6 @@ msgstr ""
msgid "SecurityApprovals|A merge request approval is required when the license compliance report contains a denied license."
msgstr ""
-msgid "SecurityApprovals|Configurable if security scanners are enabled. %{linkStart}Learn more.%{linkEnd}"
-msgstr ""
-
msgid "SecurityApprovals|Coverage-Check"
msgstr ""
@@ -29758,24 +30175,18 @@ msgstr ""
msgid "SecurityApprovals|Learn more about Vulnerability-Check"
msgstr ""
-msgid "SecurityApprovals|License Scanning must be enabled. %{linkStart}Learn more%{linkEnd}."
-msgstr ""
-
msgid "SecurityApprovals|License-Check"
msgstr ""
msgid "SecurityApprovals|Requires approval for Denied licenses. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}More information%{linkEnd}"
+msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "SecurityApprovals|Requires approval for vulnerabilities. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
-msgid "SecurityApprovals|Test coverage must be enabled. %{linkStart}Learn more%{linkEnd}."
-msgstr ""
-
msgid "SecurityApprovals|Vulnerability-Check"
msgstr ""
@@ -29839,6 +30250,12 @@ msgstr ""
msgid "SecurityConfiguration|Immediately begin risk analysis and remediation with application security features. Start with SAST and Secret Detection, available to all plans. Upgrade to Ultimate to get all features, including:"
msgstr ""
+msgid "SecurityConfiguration|Manage corpus"
+msgstr ""
+
+msgid "SecurityConfiguration|Manage corpus files used as mutation sources in coverage fuzzing."
+msgstr ""
+
msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
msgstr ""
@@ -29893,6 +30310,12 @@ msgstr ""
msgid "SecurityOrchestration|Action"
msgstr ""
+msgid "SecurityOrchestration|Actions"
+msgstr ""
+
+msgid "SecurityOrchestration|Add rule"
+msgstr ""
+
msgid "SecurityOrchestration|All policies"
msgstr ""
@@ -29926,9 +30349,6 @@ msgstr ""
msgid "SecurityOrchestration|Network"
msgstr ""
-msgid "SecurityOrchestration|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
-msgstr ""
-
msgid "SecurityOrchestration|New policy"
msgstr ""
@@ -29944,6 +30364,9 @@ msgstr ""
msgid "SecurityOrchestration|Policy editor"
msgstr ""
+msgid "SecurityOrchestration|Policy preview"
+msgstr ""
+
msgid "SecurityOrchestration|Policy status"
msgstr ""
@@ -29953,6 +30376,9 @@ msgstr ""
msgid "SecurityOrchestration|Rule"
msgstr ""
+msgid "SecurityOrchestration|Rules"
+msgstr ""
+
msgid "SecurityOrchestration|Scan Execution"
msgstr ""
@@ -30046,6 +30472,9 @@ msgstr ""
msgid "SecurityReports|Create issue"
msgstr ""
+msgid "SecurityReports|Development vulnerabilities"
+msgstr ""
+
msgid "SecurityReports|Dismiss vulnerability"
msgstr ""
@@ -30061,6 +30490,9 @@ msgstr ""
msgid "SecurityReports|Download results"
msgstr ""
+msgid "SecurityReports|Download scanned URLs"
+msgstr ""
+
msgid "SecurityReports|Download scanned resources"
msgstr ""
@@ -30184,6 +30616,9 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
+msgid "SecurityReports|The Vulnerability Report shows the results of the lastest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "SecurityReports|The security reports below contain one or more vulnerability findings that could not be parsed and were not recorded. Download the artifacts in the job output to investigate. Ensure any security report created conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
msgstr ""
@@ -30325,10 +30760,10 @@ msgstr ""
msgid "Select a repository"
msgstr ""
-msgid "Select a role"
+msgid "Select a repository containing templates for common files."
msgstr ""
-msgid "Select a shared template repository for all projects on this instance."
+msgid "Select a role"
msgstr ""
msgid "Select a template repository"
@@ -30406,6 +30841,9 @@ msgstr ""
msgid "Select project to choose zone"
msgstr ""
+msgid "Select project to create issue"
+msgstr ""
+
msgid "Select projects"
msgstr ""
@@ -30523,6 +30961,9 @@ msgstr ""
msgid "Send emails to help guide new users through the onboarding process."
msgstr ""
+msgid "Send emails to users upon account deactivation."
+msgstr ""
+
msgid "Send message"
msgstr ""
@@ -30541,6 +30982,9 @@ msgstr ""
msgid "Send service data"
msgstr ""
+msgid "Sentry"
+msgstr ""
+
msgid "Sentry API URL"
msgstr ""
@@ -30655,6 +31099,9 @@ msgstr ""
msgid "Service"
msgstr ""
+msgid "Service Accounts keys are required to authorize GitLab to deploy your Google Cloud project."
+msgstr ""
+
msgid "Service Desk"
msgstr ""
@@ -30727,15 +31174,15 @@ msgstr ""
msgid "Set a password on your account to pull or push via %{protocol}."
msgstr ""
-msgid "Set a template repository for projects in this group"
-msgstr ""
-
msgid "Set access permissions for this token."
msgstr ""
msgid "Set an instance-wide domain that will be available to all clusters when installing Knative."
msgstr ""
+msgid "Set any rate limit to %{code_open}0%{code_close} to disable the limit."
+msgstr ""
+
msgid "Set default and restrict visibility levels. Configure import sources and git access protocol."
msgstr ""
@@ -30748,7 +31195,7 @@ msgstr ""
msgid "Set limit to 0 to allow any file size."
msgstr ""
-msgid "Set max session time for web terminal."
+msgid "Set limits for web and API requests."
msgstr ""
msgid "Set milestone"
@@ -30757,15 +31204,18 @@ msgstr ""
msgid "Set new password"
msgstr ""
-msgid "Set notification email for abuse reports."
+msgid "Set parent epic to an epic"
msgstr ""
-msgid "Set parent epic to an epic"
+msgid "Set per-user rate limits for imports and exports of projects and groups."
msgstr ""
msgid "Set projects and maximum size limits, session duration, user options, and check feature availability for namespace plan."
msgstr ""
+msgid "Set rate limits for package registry API requests that supersede the general user and IP rate limits."
+msgstr ""
+
msgid "Set severity"
msgstr ""
@@ -30784,15 +31234,24 @@ msgstr ""
msgid "Set the default branch for this project. All merge requests and commits are made against this branch unless you specify a different one."
msgstr ""
+msgid "Set the default expiration time for job artifacts in all projects. Set to %{code_open}0%{code_close} to never expire artifacts by default. If no unit is written, it defaults to seconds. For example, these are all equivalent: %{code_open}3600%{code_close}, %{code_open}60 minutes%{code_close}, or %{code_open}one hour%{code_close}."
+msgstr ""
+
msgid "Set the due date to %{due_date}."
msgstr ""
msgid "Set the iteration to %{iteration_reference}."
msgstr ""
+msgid "Set the maximum session time for a web terminal."
+msgstr ""
+
msgid "Set the milestone to %{milestone_reference}."
msgstr ""
+msgid "Set the per-user rate limit for notes created by web or API requests."
+msgstr ""
+
msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
msgstr ""
@@ -30994,6 +31453,9 @@ msgstr ""
msgid "Show Pipeline IID"
msgstr ""
+msgid "Show all %{issuable_type}."
+msgstr ""
+
msgid "Show all activity"
msgstr ""
@@ -31045,15 +31507,9 @@ msgstr ""
msgid "Show list"
msgstr ""
-msgid "Show me advanced features"
-msgstr ""
-
msgid "Show me how to add a pipeline"
msgstr ""
-msgid "Show me the basics"
-msgstr ""
-
msgid "Show one file at a time"
msgstr ""
@@ -31096,15 +31552,15 @@ msgstr ""
msgid "Showing %{pageSize} of %{total} %{issuableType}"
msgstr ""
-msgid "Showing %{pageSize} of %{total} issues"
-msgstr ""
-
msgid "Showing all epics"
msgstr ""
msgid "Showing all issues"
msgstr ""
+msgid "Showing data for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
+msgstr ""
+
msgid "Showing data for workflow items created in this date range. Date range cannot exceed %{maxDateRange} days."
msgstr ""
@@ -31144,6 +31600,15 @@ msgstr ""
msgid "Sidebar|Weight"
msgstr ""
+msgid "Sidekiq job compression threshold (bytes)"
+msgstr ""
+
+msgid "Sidekiq job size limit (bytes)"
+msgstr ""
+
+msgid "Sidekiq job size limits"
+msgstr ""
+
msgid "Sign in"
msgstr ""
@@ -31264,6 +31729,9 @@ msgstr ""
msgid "Site profile not found for given parameters"
msgstr ""
+msgid "Sites"
+msgstr ""
+
msgid "Size"
msgstr ""
@@ -31294,19 +31762,22 @@ msgstr ""
msgid "SlackIntegration|Sends notifications about project events to Slack channels."
msgstr ""
-msgid "SlackService|2. Paste the %{strong_open}Token%{strong_close} into the field below"
+msgid "SlackService|1. %{slash_command_link_start}Add a slash command%{slash_command_link_end} in your Slack team using this information:"
msgstr ""
-msgid "SlackService|3. Select the %{strong_open}Active%{strong_close} checkbox, press %{strong_open}Save changes%{strong_close} and start using GitLab inside Slack!"
+msgid "SlackService|2. Paste the token from Slack in the %{strong_open}Token%{strong_close} field below."
msgstr ""
-msgid "SlackService|Fill in the word that works best for your team."
+msgid "SlackService|3. Select the %{strong_open}Active%{strong_close} checkbox, select %{strong_open}Save changes%{strong_close}, and start using slash commands in Slack!"
+msgstr ""
+
+msgid "SlackService|After setup, get a list of available Slack slash commands by entering"
msgstr ""
-msgid "SlackService|See list of available commands in Slack after setting up this service, by entering"
+msgid "SlackService|Fill in the word that works best for your team."
msgstr ""
-msgid "SlackService|This service allows users to perform common operations on this project by entering slash commands in Slack."
+msgid "SlackService|Perform common operations in this project by entering slash commands in Slack."
msgstr ""
msgid "Slice multiplier"
@@ -31372,7 +31843,7 @@ msgstr ""
msgid "Some child epics may be hidden due to applied filters"
msgstr ""
-msgid "Some common domains are not allowed. %{read_more_link}."
+msgid "Some common domains are not allowed. %{learn_more_link}."
msgstr ""
msgid "Some of the designs you tried uploading did not change:"
@@ -31456,9 +31927,6 @@ msgstr ""
msgid "Something went wrong while exporting requirements"
msgstr ""
-msgid "Something went wrong while fetching %{listType} list"
-msgstr ""
-
msgid "Something went wrong while fetching branches"
msgstr ""
@@ -31513,15 +31981,9 @@ msgstr ""
msgid "Something went wrong while merging this merge request. Please try again."
msgstr ""
-msgid "Something went wrong while moving issues."
-msgstr ""
-
msgid "Something went wrong while obtaining the Let's Encrypt certificate."
msgstr ""
-msgid "Something went wrong while performing the action."
-msgstr ""
-
msgid "Something went wrong while promoting the issue to an epic. Please try again."
msgstr ""
@@ -31849,7 +32311,10 @@ msgstr ""
msgid "SourcegraphPreferences|Uses a custom %{linkStart}Sourcegraph instance%{linkEnd}."
msgstr ""
-msgid "Spam Check API Key"
+msgid "Spam Check"
+msgstr ""
+
+msgid "Spam Check API key"
msgstr ""
msgid "Spam Logs"
@@ -31867,7 +32332,7 @@ msgstr ""
msgid "Specified URL cannot be used: \"%{reason}\""
msgstr ""
-msgid "Specify an e-mail address regex pattern to identify default internal users."
+msgid "Specify an email address regex pattern to identify default internal users."
msgstr ""
msgid "Speed up your pipelines with Needs relationships"
@@ -32122,7 +32587,7 @@ msgstr ""
msgid "StatusCheck|An error occurred fetching the status checks."
msgstr ""
-msgid "StatusCheck|Apply this status check to any branch or a specific protected branch."
+msgid "StatusCheck|Apply this status check to all branches or a specific protected branch."
msgstr ""
msgid "StatusCheck|Check for a status response in Merge Requests. Failures do not block merges. %{link_start}Learn more%{link_end}."
@@ -32461,6 +32926,9 @@ msgstr ""
msgid "Subscriptions"
msgstr ""
+msgid "Subscription|Your subscription for %{strong}%{namespace_name}%{strong_close} has expired and you are now on %{pricing_link_start}the GitLab Free tier%{pricing_link_end}. Don't worry, your data is safe. Get in touch with our support team (%{support_email}). They'll gladly help with your subscription renewal."
+msgstr ""
+
msgid "Subtracted"
msgstr ""
@@ -32689,6 +33157,9 @@ msgstr ""
msgid "SuperSonics|Plan"
msgstr ""
+msgid "SuperSonics|Please agree to the Subscription Agreement"
+msgstr ""
+
msgid "SuperSonics|Ready to get started? A GitLab plan is ideal for scaling organizations and for multi team usage."
msgstr ""
@@ -32719,6 +33190,9 @@ msgstr ""
msgid "SuperSonics|The activation code is not valid. Please make sure to copy it exactly from the Customers Portal or confirmation email. Learn more about %{linkStart}activating your subscription%{linkEnd}."
msgstr ""
+msgid "SuperSonics|The activation code should be a 24-character alphanumeric string"
+msgstr ""
+
msgid "SuperSonics|There is a connectivity issue."
msgstr ""
@@ -32761,9 +33235,15 @@ msgstr ""
msgid "SuperSonics|You do not have an active subscription"
msgstr ""
+msgid "SuperSonics|You have successfully added a license that activates on %{date}. Please see the subscription history table below for more details."
+msgstr ""
+
msgid "SuperSonics|You'll be charged for %{trueUpLinkStart}users over license%{trueUpLinkEnd} on a quarterly or annual basis, depending on the terms of your agreement."
msgstr ""
+msgid "SuperSonics|Your future dated license was successfully added"
+msgstr ""
+
msgid "SuperSonics|Your subscription"
msgstr ""
@@ -33016,7 +33496,7 @@ msgstr ""
msgid "Template to append to all Service Desk issues"
msgstr ""
-msgid "TemplateRepository|Select a repository to make its templates available to all projects. %{link_start}What should the repository contain?%{link_end} "
+msgid "TemplateRepository|Create common files more quickly, and standardize their format."
msgstr ""
msgid "Templates"
@@ -33226,7 +33706,7 @@ msgstr ""
msgid "TestCases|Search test cases"
msgstr ""
-msgid "TestCases|Something went wrong while adding test case to Todo."
+msgid "TestCases|Something went wrong while adding test case to a to-do item."
msgstr ""
msgid "TestCases|Something went wrong while creating a test case."
@@ -33238,7 +33718,7 @@ msgstr ""
msgid "TestCases|Something went wrong while fetching test cases list."
msgstr ""
-msgid "TestCases|Something went wrong while marking test case todo as done."
+msgid "TestCases|Something went wrong while marking test case to-do item as done."
msgstr ""
msgid "TestCases|Something went wrong while moving test case."
@@ -33358,7 +33838,7 @@ msgstr ""
msgid "Thanks for your purchase!"
msgstr ""
-msgid "That is ok, I do not want to renew"
+msgid "That's OK, I don't want to renew"
msgstr ""
msgid "That's it, well done!"
@@ -33382,7 +33862,7 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
-msgid "The API key used by GitLab for accessing the Spam Check service endpoint"
+msgid "The API key used by GitLab for accessing the Spam Check service endpoint."
msgstr ""
msgid "The GitLab subscription service (customers.gitlab.com) is currently experiencing an outage. You can monitor the status and get updates at %{linkStart}status.gitlab.com%{linkEnd}."
@@ -33421,9 +33901,6 @@ msgstr ""
msgid "The URL to use for connecting to Elasticsearch. Use a comma-separated list to support clustering (e.g., \"http://localhost:9200, http://localhost:9201\")."
msgstr ""
-msgid "The Vulnerability Report shows the results of the last successful pipeline run on the default branch."
-msgstr ""
-
msgid "The X509 Certificate to use when mutual TLS is required to communicate with the external authorization service. If left blank, the server certificate is still validated when accessing over HTTPS."
msgstr ""
@@ -33481,9 +33958,6 @@ msgstr ""
msgid "The default branch for this project has been changed. Please update your bookmarks."
msgstr ""
-msgid "The default expiration time for job artifacts. 0 for unlimited. The default unit is in seconds, but you can use other units, for example %{code_open}4 mins 2 sec%{code_close}, %{code_open}2h42min%{code_close}."
-msgstr ""
-
msgid "The dependency list details information about the components used within your project."
msgstr ""
@@ -33676,9 +34150,6 @@ msgstr ""
msgid "The merge conflicts for this merge request have already been resolved. Please return to the merge request."
msgstr ""
-msgid "The merge request can now be merged."
-msgstr ""
-
msgid "The metric must be one of %{metrics}."
msgstr ""
@@ -34054,7 +34525,7 @@ msgstr ""
msgid "There was a problem updating the keep latest artifacts setting."
msgstr ""
-msgid "There was an error %{message} todo."
+msgid "There was an error %{message} to-do item."
msgstr ""
msgid "There was an error adding a To Do."
@@ -34093,6 +34564,9 @@ msgstr ""
msgid "There was an error fetching projects"
msgstr ""
+msgid "There was an error fetching search autocomplete suggestions"
+msgstr ""
+
msgid "There was an error fetching stage total counts"
msgstr ""
@@ -34417,6 +34891,9 @@ msgstr ""
msgid "This field is required."
msgstr ""
+msgid "This form is disabled in preview"
+msgstr ""
+
msgid "This group"
msgstr ""
@@ -34438,9 +34915,6 @@ msgstr ""
msgid "This group is linked to a subscription"
msgstr ""
-msgid "This group, including all subgroups, projects and git repositories, will be reachable from only the specified IP address ranges."
-msgstr ""
-
msgid "This group, its subgroups and projects has been scheduled for removal on %{date}."
msgstr ""
@@ -34720,9 +35194,6 @@ msgstr ""
msgid "This user cannot be unlocked manually from GitLab"
msgstr ""
-msgid "This user does not have a pending request"
-msgstr ""
-
msgid "This user has an unconfirmed email address (%{email}). You may force a confirmation."
msgstr ""
@@ -34831,9 +35302,6 @@ msgstr ""
msgid "ThreatMonitoring|Packet Activity"
msgstr ""
-msgid "ThreatMonitoring|Policies"
-msgstr ""
-
msgid "ThreatMonitoring|Requests"
msgstr ""
@@ -34885,6 +35353,12 @@ msgstr ""
msgid "ThreatMonitoring|View documentation"
msgstr ""
+msgid "Threshold in bytes at which to compress Sidekiq job arguments."
+msgstr ""
+
+msgid "Threshold in bytes at which to reject Sidekiq jobs. Set this to 0 to if you don't want to limit Sidekiq jobs."
+msgstr ""
+
msgid "Throughput"
msgstr ""
@@ -34894,6 +35368,9 @@ msgstr ""
msgid "Time"
msgstr ""
+msgid "Time (in hours) that users are allowed to skip forced configuration of two-factor authentication."
+msgstr ""
+
msgid "Time Spent"
msgstr ""
@@ -34960,7 +35437,7 @@ msgstr ""
msgid "TimeTrackingEstimated|Est"
msgstr ""
-msgid "TimeTracking|%{startTag}Spent: %{endTag}%{timeSpentHumanReadable}"
+msgid "TimeTracking|%{spentStart}Spent: %{spentEnd}"
msgstr ""
msgid "TimeTracking|Estimated:"
@@ -35176,6 +35653,9 @@ msgstr ""
msgid "To access this domain create a new DNS record"
msgstr ""
+msgid "To add a custom suffix, set up a Service Desk email address. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "To add an SSH key you need to %{generate_link_start}generate one%{link_end} or use an %{existing_link_start}existing key%{link_end}."
msgstr ""
@@ -35197,13 +35677,16 @@ msgstr ""
msgid "To connect an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To continue using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
+msgstr ""
+
msgid "To continue, you need to select the link in the confirmation email we sent to verify your email address. If you didn't get our email, select %{strongStart}Resend confirmation email.%{strongEnd}"
msgstr ""
msgid "To define internal users, first enable new users set to external"
msgstr ""
-msgid "To enable Registration Features, make sure \"Enable service ping\" is checked."
+msgid "To enable Registration Features, first enable Service Ping."
msgstr ""
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
@@ -35230,7 +35713,7 @@ msgstr ""
msgid "To get started, use the link below to confirm your account."
msgstr ""
-msgid "To help improve GitLab and its user experience, GitLab will periodically collect usage information."
+msgid "To help improve GitLab and its user experience, GitLab periodically collects usage information."
msgstr ""
msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
@@ -35263,7 +35746,7 @@ msgstr ""
msgid "To preserve performance only %{strong_open}%{display_size} of %{real_size}%{strong_close} files are displayed."
msgstr ""
-msgid "To protect this issue's confidentiality, %{forkLink} and set the fork's visibility to private."
+msgid "To protect this issue's confidentiality, %{linkStart}fork this project%{linkEnd} and set the fork's visibility to private."
msgstr ""
msgid "To protect this issue's confidentiality, a private fork of this project was selected."
@@ -35296,12 +35779,15 @@ msgstr ""
msgid "To set up SAML authentication for your group through an identity provider like Azure, Okta, Onelogin, Ping Identity, or your custom SAML 2.0 provider:"
msgstr ""
-msgid "To set up this service:"
+msgid "To set up this integration:"
msgstr ""
msgid "To specify the notification level per project of a group you belong to, you need to visit project page and change notification level there."
msgstr ""
+msgid "To start using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
+msgstr ""
+
msgid "To unsubscribe from this issue, please paste the following link into your browser:"
msgstr ""
@@ -35890,9 +36376,6 @@ msgstr ""
msgid "Unable to fetch branches list, please close the form and try again"
msgstr ""
-msgid "Unable to fetch unscanned projects"
-msgstr ""
-
msgid "Unable to fetch vulnerable projects"
msgstr ""
@@ -35947,6 +36430,15 @@ msgstr ""
msgid "Unable to update this issue at this time."
msgstr ""
+msgid "Unapprove a merge request"
+msgstr ""
+
+msgid "Unapprove the current merge request."
+msgstr ""
+
+msgid "Unapproved the current merge request."
+msgstr ""
+
msgid "Unarchive project"
msgstr ""
@@ -35959,16 +36451,13 @@ msgstr ""
msgid "Unassigned"
msgstr ""
-msgid "Unauthenticated API request rate limit"
-msgstr ""
-
-msgid "Unauthenticated rate limit period in seconds"
+msgid "Unauthenticated API rate limit period in seconds"
msgstr ""
-msgid "Unauthenticated request rate limit"
+msgid "Unauthenticated requests"
msgstr ""
-msgid "Unauthenticated requests"
+msgid "Unauthenticated web rate limit period in seconds"
msgstr ""
msgid "Undo"
@@ -36070,18 +36559,6 @@ msgstr ""
msgid "Unresolved"
msgstr ""
-msgid "UnscannedProjects|15 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|30 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|5 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|60 or more days"
-msgstr ""
-
msgid "Unschedule job"
msgstr ""
@@ -36301,6 +36778,9 @@ msgstr ""
msgid "UsageQuota|%{help_link_start}Shared runners%{help_link_end} are disabled, so there are no limits set on pipeline usage"
msgstr ""
+msgid "UsageQuota|%{linkTitle} help link"
+msgstr ""
+
msgid "UsageQuota|%{percentageLeft} of purchased storage is available"
msgstr ""
@@ -36310,6 +36790,9 @@ msgstr ""
msgid "UsageQuota|Artifacts is a sum of build and pipeline artifacts."
msgstr ""
+msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
+msgstr ""
+
msgid "UsageQuota|Buy additional minutes"
msgstr ""
@@ -36319,9 +36802,21 @@ msgstr ""
msgid "UsageQuota|CI minutes usage by project"
msgstr ""
+msgid "UsageQuota|Code packages and container images."
+msgstr ""
+
msgid "UsageQuota|Current period usage"
msgstr ""
+msgid "UsageQuota|File attachments and smaller design graphics."
+msgstr ""
+
+msgid "UsageQuota|Git repository, managed by the Gitaly service."
+msgstr ""
+
+msgid "UsageQuota|Includes project registry, artifacts, packages, wiki, uploads and other items."
+msgstr ""
+
msgid "UsageQuota|Increase storage temporarily"
msgstr ""
@@ -36340,6 +36835,9 @@ msgstr ""
msgid "UsageQuota|Packages"
msgstr ""
+msgid "UsageQuota|Pipeline artifacts and job artifacts, created with CI/CD."
+msgstr ""
+
msgid "UsageQuota|Pipelines"
msgstr ""
@@ -36358,6 +36856,9 @@ msgstr ""
msgid "UsageQuota|Seats"
msgstr ""
+msgid "UsageQuota|Shared bits of code and text."
+msgstr ""
+
msgid "UsageQuota|Snippets"
msgstr ""
@@ -36367,6 +36868,12 @@ msgstr ""
msgid "UsageQuota|Storage"
msgstr ""
+msgid "UsageQuota|Storage type"
+msgstr ""
+
+msgid "UsageQuota|There is a known issue with Artifact storage where the total could be incorrect for some projects. More details and progress are available in %{warningLinkStart}the epic%{warningLinkEnd}."
+msgstr ""
+
msgid "UsageQuota|This is the total amount of storage used across your projects within this namespace."
msgstr ""
@@ -36406,6 +36913,9 @@ msgstr ""
msgid "UsageQuota|Usage"
msgstr ""
+msgid "UsageQuota|Usage Breakdown"
+msgstr ""
+
msgid "UsageQuota|Usage Quotas"
msgstr ""
@@ -36430,6 +36940,9 @@ msgstr ""
msgid "UsageQuota|Wiki"
msgstr ""
+msgid "UsageQuota|Wiki content."
+msgstr ""
+
msgid "UsageQuota|Wikis"
msgstr ""
@@ -36646,7 +37159,10 @@ msgstr ""
msgid "User Settings"
msgstr ""
-msgid "User and IP Rate Limits"
+msgid "User and IP rate limits"
+msgstr ""
+
+msgid "User does not have a pending request"
msgstr ""
msgid "User identity was successfully created."
@@ -36943,6 +37459,9 @@ msgstr ""
msgid "Users can launch a development environment from a GitLab browser tab when the %{linkStart}Gitpod%{linkEnd} integration is enabled."
msgstr ""
+msgid "Users can reactivate their account by signing in."
+msgstr ""
+
msgid "Users can render diagrams in AsciiDoc, Markdown, reStructuredText, and Textile documents using Kroki."
msgstr ""
@@ -36958,6 +37477,9 @@ msgstr ""
msgid "Users requesting access to"
msgstr ""
+msgid "Users to exclude from the rate limit"
+msgstr ""
+
msgid "Users were successfully added."
msgstr ""
@@ -36979,6 +37501,9 @@ msgstr ""
msgid "UsersSelect|Unassigned"
msgstr ""
+msgid "Uses GitLab as a lightweight alternative to Sentry."
+msgstr ""
+
msgid "Using %{code_start}::%{code_end} denotes a %{link_start}scoped label set%{link_end}"
msgstr ""
@@ -37009,10 +37534,7 @@ msgstr ""
msgid "Value Stream Analytics can help you determine your team’s velocity"
msgstr ""
-msgid "Value Stream Analytics gives an overview of how much time it takes to go from idea to production in your project."
-msgstr ""
-
-msgid "Value may contain a variable reference"
+msgid "Value might contain a variable reference"
msgstr ""
msgid "Value stream"
@@ -37078,10 +37600,10 @@ msgstr ""
msgid "ValueStream|The Default Value Stream cannot be deleted"
msgstr ""
-msgid "Variable"
+msgid "Values that contain the %{codeStart}$%{codeEnd} character can be considered a variable reference and expanded. %{docsLinkStart}Learn more.%{docsLinkEnd}"
msgstr ""
-msgid "Variable references indicated by %{codeStart}$%{codeEnd} may be expanded. If this is not what you want, consider %{docsLinkStart}using a workaround to prevent expansion%{docsLinkEnd}."
+msgid "Variable"
msgstr ""
msgid "Variable will be masked in job logs."
@@ -37489,6 +38011,9 @@ msgstr ""
msgid "Vulnerability|Evidence"
msgstr ""
+msgid "Vulnerability|False positive detected"
+msgstr ""
+
msgid "Vulnerability|File"
msgstr ""
@@ -37531,6 +38056,9 @@ msgstr ""
msgid "Vulnerability|Status"
msgstr ""
+msgid "Vulnerability|The scanner determined this vulnerability to be a false positive. Verify the evaluation before changing its status. %{linkStart}Learn more about false positive detection.%{linkEnd}"
+msgstr ""
+
msgid "Vulnerability|The unmodified response is the original response that had no mutations done to the request"
msgstr ""
@@ -37855,9 +38383,6 @@ msgstr ""
msgid "Welcome to GitLab,%{br_tag}%{name}!"
msgstr ""
-msgid "Welcome to the guided GitLab tour"
-msgstr ""
-
msgid "Welcome, %{name}!"
msgstr ""
@@ -37876,9 +38401,6 @@ msgstr ""
msgid "What are you searching for?"
msgstr ""
-msgid "What describes you best?"
-msgstr ""
-
msgid "What does this command do?"
msgstr ""
@@ -37900,13 +38422,13 @@ msgstr ""
msgid "What is your job title? (optional)"
msgstr ""
-msgid "What will you use this group for?"
+msgid "What templates can I create?"
msgstr ""
-msgid "What's new"
+msgid "What will you use this group for?"
msgstr ""
-msgid "What’s your experience level?"
+msgid "What's new"
msgstr ""
msgid "When a deployment job is successful, skip older deployment jobs that are still pending."
@@ -37918,6 +38440,9 @@ msgstr ""
msgid "When an event in GitLab triggers a webhook, you can use the request details to figure out if something went wrong."
msgstr ""
+msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+msgstr ""
+
msgid "When inactive, an external authentication provider must be used."
msgstr ""
@@ -37942,6 +38467,9 @@ msgstr ""
msgid "When:"
msgstr ""
+msgid "Which API requests are affected?"
+msgstr ""
+
msgid "While it's rare to have no vulnerabilities, it can happen. In any event, we ask that you please double check your settings to make sure you've set up your dashboard correctly."
msgstr ""
@@ -38221,6 +38749,9 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|Work Items"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -38296,6 +38827,9 @@ msgstr ""
msgid "You are already a member of this %{member_source}."
msgstr ""
+msgid "You are already impersonating another user"
+msgstr ""
+
msgid "You are an admin, which means granting access to %{client_name} will allow them to interact with GitLab as an admin as well. Proceed with caution."
msgstr ""
@@ -38398,6 +38932,9 @@ msgstr ""
msgid "You can also use project access tokens with Git to authenticate over HTTP(S). %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "You can always change your URL later"
+msgstr ""
+
msgid "You can always edit this later"
msgstr ""
@@ -38554,10 +39091,10 @@ msgstr ""
msgid "You can’t %{tag_start}edit%{tag_end} files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
-msgid "You could not create a new trigger."
+msgid "You can’t edit files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
-msgid "You didn't renew your subscription for %{strong}%{namespace_name}%{strong_close} so it was downgraded to the free plan."
+msgid "You could not create a new trigger."
msgstr ""
msgid "You do not have any subscriptions yet"
@@ -38725,6 +39262,12 @@ msgstr ""
msgid "You must provide your current password in order to change it."
msgstr ""
+msgid "You must sign in to search for specific projects."
+msgstr ""
+
+msgid "You must sign in to search for specific terms."
+msgstr ""
+
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
@@ -38752,6 +39295,9 @@ msgstr ""
msgid "You need to upload a GitLab project export archive (ending in .gz)."
msgstr ""
+msgid "You need to verify your primary email first before enabling Two-Factor Authentication."
+msgstr ""
+
msgid "You successfully declined the invitation"
msgstr ""
@@ -38860,10 +39406,10 @@ msgstr ""
msgid "Your %{host} account was signed in to from a new location"
msgstr ""
-msgid "Your %{strong}%{plan_name}%{strong_close} subscription for %{strong}%{namespace_name}%{strong_close} will expire on %{strong}%{expires_on}%{strong_close}."
+msgid "Your %{strong}%{plan_name}%{strong_close} subscription expires on %{strong}%{expires_on}%{strong_close}. After that date, you cannot create issues or merge requests, or use many other features."
msgstr ""
-msgid "Your %{strong}%{plan_name}%{strong_close} subscription will expire on %{strong}%{expires_on}%{strong_close}. After that, you will not be able to create issues or merge requests as well as many other features."
+msgid "Your %{strong}%{plan_name}%{strong_close} subscription for %{strong}%{namespace_name}%{strong_close} will expire on %{strong}%{expires_on}%{strong_close}."
msgstr ""
msgid "Your CI/CD configuration syntax is invalid. View Lint tab for more details."
@@ -38887,7 +39433,7 @@ msgstr ""
msgid "Your GPG keys (%{count})"
msgstr ""
-msgid "Your GitLab account has been locked due to an excessive amount of unsuccessful sign in attempts. Your account will automatically unlock in %{duration} or you may click the link below to unlock now."
+msgid "Your GitLab account has been locked due to an excessive number of unsuccessful sign in attempts. You can wait for your account to automatically unlock in %{duration} or you can click the link below to unlock now."
msgstr ""
msgid "Your GitLab account request has been approved!"
@@ -38998,6 +39544,9 @@ msgstr ""
msgid "Your commit email is used for web based operations, such as edits and merges."
msgstr ""
+msgid "Your current password is required to register a two-factor authenticator app."
+msgstr ""
+
msgid "Your dashboard has been copied. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
@@ -39097,6 +39646,9 @@ msgstr ""
msgid "Your project limit is %{limit} projects! Please contact your administrator to increase it"
msgstr ""
+msgid "Your project will be created at:"
+msgstr ""
+
msgid "Your projects"
msgstr ""
@@ -39136,11 +39688,11 @@ msgstr ""
msgid "Your subscription expired!"
msgstr ""
-msgid "Your subscription has been downgraded."
-msgstr ""
-
-msgid "Your subscription will expire in %{remaining_days}."
-msgstr ""
+msgid "Your subscription will expire in %{remaining_days} day."
+msgid_plural "Your subscription will expire in %{remaining_days} days."
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
msgid "Your username is %{username}."
msgstr ""
@@ -39349,6 +39901,9 @@ msgstr ""
msgid "cannot merge"
msgstr ""
+msgid "cannot not be used for user namespace"
+msgstr ""
+
msgid "ciReport|%{degradedNum} degraded"
msgstr ""
@@ -39673,6 +40228,9 @@ msgstr ""
msgid "created %{timeAgo}"
msgstr ""
+msgid "created %{timeAgo} by %{author}"
+msgstr ""
+
msgid "created by"
msgstr ""
@@ -39718,9 +40276,6 @@ msgstr ""
msgid "does not have a supported extension. Only %{extension_list} are supported"
msgstr ""
-msgid "domain is not authorized for sign-up."
-msgstr ""
-
msgid "download it"
msgstr ""
@@ -39739,19 +40294,13 @@ msgstr ""
msgid "email '%{email}' is not a verified email."
msgstr ""
-msgid "email does not match the allowed domain of %{email_domains}"
-msgid_plural "email does not match the allowed domains: %{email_domains}"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-
msgid "enabled"
msgstr ""
msgid "encrypted: needs to be a :required, :optional or :migrating!"
msgstr ""
-msgid "ending with MIME type format is not allowed."
+msgid "ending with a reserved file extension is not allowed."
msgstr ""
msgid "entries cannot be larger than 255 characters"
@@ -39775,6 +40324,9 @@ msgstr ""
msgid "estimateCommand|%{slash_command} overwrites the total estimated time."
msgstr ""
+msgid "example.com"
+msgstr ""
+
msgid "exceeds the limit of %{bytes} bytes"
msgstr ""
@@ -39826,9 +40378,6 @@ msgstr ""
msgid "fork"
msgstr ""
-msgid "fork this project"
-msgstr ""
-
msgid "from"
msgstr ""
@@ -39838,6 +40387,9 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
+msgid "frontmatter"
+msgstr ""
+
msgid "group"
msgstr ""
@@ -39865,6 +40417,9 @@ msgstr ""
msgid "has been completed."
msgstr ""
+msgid "has too deep level of nesting"
+msgstr ""
+
msgid "help"
msgstr ""
@@ -39898,9 +40453,21 @@ msgstr ""
msgid "in"
msgstr ""
+msgid "in Infrastructure :: Kubernetes clusters"
+msgstr ""
+
+msgid "in all GitLab"
+msgstr ""
+
+msgid "in group"
+msgstr ""
+
msgid "in group %{link_to_group}"
msgstr ""
+msgid "in project"
+msgstr ""
+
msgid "in project %{link_to_project}"
msgstr ""
@@ -39943,16 +40510,19 @@ msgstr ""
msgid "is not a valid X509 certificate."
msgstr ""
-msgid "is not allowed since the group is not top-level group."
+msgid "is not allowed for sign-up."
msgstr ""
-msgid "is not allowed. Try again with a different email address, or contact your GitLab admin."
+msgid "is not allowed for this group."
msgstr ""
-msgid "is not allowed. We do not currently support project-level iterations"
+msgid "is not allowed for this project."
msgstr ""
-msgid "is not from an allowed domain."
+msgid "is not allowed since the group is not top-level group."
+msgstr ""
+
+msgid "is not allowed. We do not currently support project-level iterations"
msgstr ""
msgid "is not in the group enforcing Group Managed Account"
@@ -40045,6 +40615,9 @@ msgstr ""
msgid "log in"
msgstr ""
+msgid "managed"
+msgstr ""
+
msgid "manual"
msgstr ""
@@ -40093,6 +40666,9 @@ msgstr ""
msgid "mrWidget| Please restore it or use a different %{missingBranchName} branch"
msgstr ""
+msgid "mrWidget|%{linkStart}Set up now%{linkEnd} to analyze your source code for known security vulnerabilities."
+msgstr ""
+
msgid "mrWidget|%{mergeError}."
msgstr ""
@@ -40174,6 +40750,9 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
+msgid "mrWidget|Create issue to resolve all threads"
+msgstr ""
+
msgid "mrWidget|Delete source branch"
msgstr ""
@@ -40183,12 +40762,18 @@ msgstr ""
msgid "mrWidget|Did not close"
msgstr ""
+msgid "mrWidget|Dismiss"
+msgstr ""
+
msgid "mrWidget|Email patches"
msgstr ""
msgid "mrWidget|Failed to load deployment statistics"
msgstr ""
+msgid "mrWidget|Hide %{widget} details"
+msgstr ""
+
msgid "mrWidget|If the %{missingBranchName} branch exists in your local repository, you can merge this merge request manually using the command line"
msgstr ""
@@ -40285,9 +40870,6 @@ msgstr ""
msgid "mrWidget|Request to merge"
msgstr ""
-msgid "mrWidget|Resolve all threads in new issue"
-msgstr ""
-
msgid "mrWidget|Resolve conflicts"
msgstr ""
@@ -40303,6 +40885,9 @@ msgstr ""
msgid "mrWidget|Revoke approval"
msgstr ""
+msgid "mrWidget|SAST and Secret Detection is not enabled."
+msgstr ""
+
msgid "mrWidget|Set by %{merge_author} to be added to the merge train when the pipeline succeeds"
msgstr ""
@@ -40312,6 +40897,9 @@ msgstr ""
msgid "mrWidget|Set by %{merge_author} to start a merge train when the pipeline succeeds"
msgstr ""
+msgid "mrWidget|Show %{widget} details"
+msgstr ""
+
msgid "mrWidget|The changes were merged into"
msgstr ""
@@ -40324,6 +40912,9 @@ msgstr ""
msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure, or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
msgstr ""
+msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure."
+msgstr ""
+
msgid "mrWidget|The source branch has been deleted"
msgstr ""
@@ -40366,6 +40957,9 @@ msgstr ""
msgid "mrWidget|You can merge after removing denied licenses"
msgstr ""
+msgid "mrWidget|You can only merge once this merge request is approved."
+msgstr ""
+
msgid "mrWidget|Your password"
msgstr ""
@@ -40402,6 +40996,9 @@ msgstr ""
msgid "must be less than the limit of %{tag_limit} tags"
msgstr ""
+msgid "must be set for a project namespace"
+msgstr ""
+
msgid "must be unique by status and elapsed time within a policy"
msgstr ""
@@ -40513,6 +41110,9 @@ msgstr ""
msgid "pipeline"
msgstr ""
+msgid "pipeline schedules documentation"
+msgstr ""
+
msgid "pod_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
msgstr ""
@@ -40564,16 +41164,25 @@ msgstr ""
msgid "project name"
msgstr ""
+msgid "project namespace cannot be the parent of another namespace"
+msgstr ""
+
msgid "projects"
msgstr ""
msgid "quick actions"
msgstr ""
-msgid "reCAPTCHA Private Key"
+msgid "reCAPTCHA"
+msgstr ""
+
+msgid "reCAPTCHA helps prevent credential stuffing."
msgstr ""
-msgid "reCAPTCHA Site Key"
+msgid "reCAPTCHA private key"
+msgstr ""
+
+msgid "reCAPTCHA site key"
msgstr ""
msgid "recent activity"
@@ -40801,6 +41410,9 @@ msgstr ""
msgid "user avatar"
msgstr ""
+msgid "user namespace cannot be the parent of another namespace"
+msgstr ""
+
msgid "user preferences"
msgstr ""
@@ -40894,3 +41506,9 @@ msgstr ""
msgid "your settings"
msgstr ""
+msgid "{group}"
+msgstr ""
+
+msgid "{project}"
+msgstr ""
+
diff --git a/locale/hu_HU/gitlab.po b/locale/hu_HU/gitlab.po
index b60bde8d7ea..c7c5e387754 100644
--- a/locale/hu_HU/gitlab.po
+++ b/locale/hu_HU/gitlab.po
@@ -14,10 +14,7 @@ msgstr ""
"X-Crowdin-Language: hu\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-09-01 22:33\n"
-
-msgid " %{name}, confirm your email address now! "
-msgstr ""
+"PO-Revision-Date: 2021-10-04 20:21\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -92,6 +89,16 @@ msgstr ""
msgid "#general, #development"
msgstr ""
+msgid "%d Alert"
+msgid_plural "%d Alerts"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d Alert:"
+msgid_plural "%d Alerts:"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d Approval"
msgid_plural "%d Approvals"
msgstr[0] ""
@@ -455,7 +462,10 @@ msgstr ""
msgid "%{code_open}Protected:%{code_close} Only exposed to protected branches or tags."
msgstr ""
-msgid "%{commit_author_link} authored %{commit_timeago}"
+msgid "%{commit_author_link} authored %{commit_authored_timeago}"
+msgstr ""
+
+msgid "%{commit_author_link} authored %{commit_authored_timeago} and %{commit_committer_avatar} %{commit_committer_link} committed %{commit_committer_timeago}"
msgstr ""
msgid "%{completedCount} completed weight"
@@ -549,6 +559,15 @@ msgstr ""
msgid "%{doc_link_start}Advanced search%{doc_link_end} is enabled."
msgstr ""
+msgid "%{docs_link_start}Learn about visibility levels.%{docs_link_end}"
+msgstr ""
+
+msgid "%{docs_link_start}What is Large File Storage?%{docs_link_end}"
+msgstr ""
+
+msgid "%{docs_link_start}What is two-factor authentication?%{docs_link_end}"
+msgstr ""
+
msgid "%{due_date} (Past due)"
msgstr ""
@@ -621,9 +640,6 @@ msgstr ""
msgid "%{issueType} actions"
msgstr ""
-msgid "%{issuesCount} issues with a limit of %{maxIssueCount}"
-msgstr ""
-
msgid "%{issuesSize} with a limit of %{maxIssueCount}"
msgstr ""
@@ -681,6 +697,12 @@ msgstr ""
msgid "%{label_for_message} unavailable"
msgstr ""
+msgid "%{learn_more_link}."
+msgstr ""
+
+msgid "%{lessThan} 1 hour"
+msgstr ""
+
msgid "%{lets_encrypt_link_start}Let's Encrypt%{lets_encrypt_link_end} is a free, automated, and open certificate authority (CA) that issues digital certificates to enable HTTPS (SSL/TLS) for sites."
msgstr ""
@@ -693,15 +715,15 @@ msgstr ""
msgid "%{link_start}Learn more%{link_end} about roles."
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
-msgstr ""
-
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
msgstr ""
msgid "%{link_start}Start the title with %{draft_snippet}%{link_end} to prevent a merge request that is a work in progress from being merged before it's ready."
msgstr ""
+msgid "%{link_start}What information does GitLab Inc. collect?%{link_end}"
+msgstr ""
+
msgid "%{listToShow}, and %{awardsListLength} more"
msgstr ""
@@ -854,7 +876,7 @@ msgid_plural "%{securityScanner} results are not available because a pipeline ha
msgstr[0] ""
msgstr[1] ""
-msgid "%{service_ping_link_start}Learn more%{service_ping_link_end} about what information is shared with GitLab Inc."
+msgid "%{service_ping_link_start}What information is shared with GitLab Inc.?%{service_ping_link_end}"
msgstr ""
msgid "%{size} %{unit}"
@@ -890,6 +912,9 @@ msgstr ""
msgid "%{state} epics"
msgstr ""
+msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
+msgstr ""
+
msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
msgstr ""
@@ -949,11 +974,6 @@ msgstr ""
msgid "%{template_project_id} is unknown or invalid"
msgstr ""
-msgid "%{text} %{files}"
-msgid_plural "%{text} %{files} files"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%{text} is available"
msgstr ""
@@ -1038,9 +1058,6 @@ msgstr ""
msgid "%{wildcards_link_start}Wildcards%{wildcards_link_end} such as %{code_tag_start}v*%{code_tag_end} or %{code_tag_start}*-release%{code_tag_end} are supported."
msgstr ""
-msgid "&lt; 1 hour"
-msgstr ""
-
msgid "'%{data}' at %{location} does not match format: %{format}"
msgstr ""
@@ -1124,9 +1141,6 @@ msgstr ""
msgid "(we need your current password to confirm your changes)"
msgstr ""
-msgid "* * * * *"
-msgstr ""
-
msgid "+ %{amount} more"
msgstr ""
@@ -1193,10 +1207,10 @@ msgstr ""
msgid "."
msgstr ""
-msgid "0 bytes"
+msgid "/"
msgstr ""
-msgid "0 for unlimited, only effective with remote storage enabled."
+msgid "0 bytes"
msgstr ""
msgid "0t1DgySidms"
@@ -1326,6 +1340,9 @@ msgstr ""
msgid "1000+"
msgstr ""
+msgid "192.168.0.0/24"
+msgstr ""
+
msgid "1st contribution!"
msgstr ""
@@ -1479,9 +1496,6 @@ msgstr ""
msgid "A plain HTML site that uses Netlify for CI/CD instead of GitLab, but still with all the other great GitLab features"
msgstr ""
-msgid "A plain-text response to show to clients that hit the rate limit."
-msgstr ""
-
msgid "A platform value can be web, mob or app."
msgstr ""
@@ -1563,7 +1577,7 @@ msgstr ""
msgid "APIFuzzing|Configure HTTP basic authentication values. Other authentication methods are supported. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
+msgid "APIFuzzing|Customize your project's API fuzzing configuration options and copy the code snippet to your .gitlab-ci.yml file to apply any changes. Note that this tool does not reflect or update your .gitlab-ci.yml file automatically. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
msgstr ""
msgid "APIFuzzing|Enable authentication"
@@ -1626,9 +1640,6 @@ msgstr ""
msgid "APIFuzzing|To prevent a security leak, authentication info must be added as a %{ciVariablesLinkStart}CI variable%{ciVariablesLinkEnd}. As a user with maintainer access rights, you can manage CI variables in the %{ciSettingsLinkStart}Settings%{ciSettingsLinkEnd} area."
msgstr ""
-msgid "APIFuzzing|Use this tool to generate API fuzzing configuration YAML to copy into your .gitlab-ci.yml file. This tool does not reflect or update your .gitlab-ci.yml file automatically."
-msgstr ""
-
msgid "APIFuzzing|Username for basic authentication"
msgstr ""
@@ -1680,9 +1691,6 @@ msgstr ""
msgid "Abuse reports notification email"
msgstr ""
-msgid "Abuse reports will be sent to this address if it is set. Abuse reports are always available in the admin area."
-msgstr ""
-
msgid "Accept invitation"
msgstr ""
@@ -1719,12 +1727,18 @@ msgstr ""
msgid "Access granted"
msgstr ""
+msgid "Access key ID"
+msgstr ""
+
msgid "Access requests"
msgstr ""
msgid "Access to '%{classification_label}' not allowed"
msgstr ""
+msgid "Access tokens expire after 2 hours. A refresh token may be used at any time to generate a new access token. Non-expiring access tokens are deprecated. Clear this setting to enable backward compatibility."
+msgstr ""
+
msgid "AccessDropdown|Deploy Keys"
msgstr ""
@@ -2037,6 +2051,9 @@ msgstr ""
msgid "Add new directory"
msgstr ""
+msgid "Add new service account"
+msgstr ""
+
msgid "Add or remove previously merged commits"
msgstr ""
@@ -2274,6 +2291,9 @@ msgstr ""
msgid "AdminArea|Features"
msgstr ""
+msgid "AdminArea|Get security updates from GitLab and stay up to date"
+msgstr ""
+
msgid "AdminArea|Groups"
msgstr ""
@@ -2313,6 +2333,12 @@ msgstr ""
msgid "AdminArea|Reporter"
msgstr ""
+msgid "AdminArea|Sign up for the GitLab Security Newsletter to get notified for security updates."
+msgstr ""
+
+msgid "AdminArea|Sign up for the GitLab newsletter"
+msgstr ""
+
msgid "AdminArea|Stop all jobs"
msgstr ""
@@ -2382,9 +2408,15 @@ msgstr ""
msgid "AdminSettings|Disable public access to Pages sites"
msgstr ""
+msgid "AdminSettings|Display a banner on merge requests in projects with no pipelines to initiate steps to add a .gitlab-ci.yml file."
+msgstr ""
+
msgid "AdminSettings|Domain verification is an essential security measure for public GitLab sites. Users are required to demonstrate they control a domain before it is enabled. %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "AdminSettings|Enable pipeline suggestion banner"
+msgstr ""
+
msgid "AdminSettings|Enable shared runners for new projects"
msgstr ""
@@ -2856,10 +2888,10 @@ msgstr ""
msgid "Admin|Quarterly reconciliation will occur on %{qrtlyDate}"
msgstr ""
-msgid "Admin|The number of max seats used for your namespace is currently exceeding the number of seats in your subscription. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgid "Admin|The number of max seats in your namespace exceeds the number of seats in your subscription. On %{qrtlyDate}, quarterly reconciliation occurs and you are automatically billed a prorated amount for the overage. No action is needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice. For more information about the timing of the invoicing process, view the documentation."
msgstr ""
-msgid "Admin|The number of maximum users for your instance is currently exceeding the number of users in license. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgid "Admin|The number of max users in your instance exceeds the number of users in your license. On %{qrtlyDate}, quarterly reconciliation occurs and you are automatically billed a prorated amount for the overage. No action is needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice. For more information about the timing of the invoicing process, view the documentation."
msgstr ""
msgid "Admin|View pending user approvals"
@@ -2880,9 +2912,6 @@ msgstr ""
msgid "Advanced export options"
msgstr ""
-msgid "Advanced permissions, Large File Storage and Two-Factor authentication settings."
-msgstr ""
-
msgid "After a successful password update you will be redirected to login screen."
msgstr ""
@@ -2901,13 +2930,14 @@ msgstr ""
msgid "After you've reviewed these contribution guidelines, you'll be all set to"
msgstr ""
+msgid "Akismet"
+msgstr ""
+
msgid "Akismet API Key"
msgstr ""
-msgid "Alert"
-msgid_plural "Alerts"
-msgstr[0] ""
-msgstr[1] ""
+msgid "Akismet helps prevent the creation of spam issues in public projects."
+msgstr ""
msgid "AlertManagement|Acknowledged"
msgstr ""
@@ -3263,6 +3293,9 @@ msgstr ""
msgid "All (default)"
msgstr ""
+msgid "All GitLab"
+msgstr ""
+
msgid "All Members"
msgstr ""
@@ -3377,6 +3410,9 @@ msgstr ""
msgid "Allow this secondary node to replicate content on Object Storage"
msgstr ""
+msgid "Allow use of licensed EE features"
+msgstr ""
+
msgid "Allow users to dismiss the broadcast message"
msgstr ""
@@ -3452,9 +3488,6 @@ msgstr ""
msgid "Amazon authentication is not %{link_start}correctly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
-msgid "Amount of time (in hours) that users are allowed to skip forced configuration of two-factor authentication"
-msgstr ""
-
msgid "An %{link_start}alert%{link_end} with the same fingerprint is already open. To change the status of this alert, resolve the linked alert."
msgstr ""
@@ -3515,12 +3548,6 @@ msgstr ""
msgid "An error occurred when removing the label."
msgstr ""
-msgid "An error occurred when toggling the notification subscription"
-msgstr ""
-
-msgid "An error occurred when updating the issue weight"
-msgstr ""
-
msgid "An error occurred when updating the title"
msgstr ""
@@ -3569,6 +3596,9 @@ msgstr ""
msgid "An error occurred while enabling Service Desk."
msgstr ""
+msgid "An error occurred while fetching Markdown preview"
+msgstr ""
+
msgid "An error occurred while fetching ancestors"
msgstr ""
@@ -3599,9 +3629,6 @@ msgstr ""
msgid "An error occurred while fetching label colors."
msgstr ""
-msgid "An error occurred while fetching markdown preview"
-msgstr ""
-
msgid "An error occurred while fetching participants"
msgstr ""
@@ -3617,9 +3644,6 @@ msgstr ""
msgid "An error occurred while fetching reference"
msgstr ""
-msgid "An error occurred while fetching sidebar data"
-msgstr ""
-
msgid "An error occurred while fetching tags. Retry the search."
msgstr ""
@@ -3695,6 +3719,9 @@ msgstr ""
msgid "An error occurred while loading merge requests."
msgstr ""
+msgid "An error occurred while loading projects."
+msgstr ""
+
msgid "An error occurred while loading the Needs tab."
msgstr ""
@@ -3929,12 +3956,6 @@ msgstr ""
msgid "Any Milestone"
msgstr ""
-msgid "Any branch"
-msgstr ""
-
-msgid "Any eligible user"
-msgstr ""
-
msgid "Any encrypted tokens"
msgstr ""
@@ -3953,6 +3974,9 @@ msgstr ""
msgid "Any namespace"
msgstr ""
+msgid "App Engine description and apps that are suitable for this deployment target"
+msgstr ""
+
msgid "App ID"
msgstr ""
@@ -4101,6 +4125,11 @@ msgstr ""
msgid "Apply"
msgstr ""
+msgid "Apply %d suggestion"
+msgid_plural "Apply %d suggestions"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Apply a label"
msgstr ""
@@ -4110,13 +4139,10 @@ msgstr ""
msgid "Apply suggestion"
msgstr ""
-msgid "Apply suggestions"
-msgstr ""
-
msgid "Apply template"
msgstr ""
-msgid "Apply this approval rule to any branch or a specific protected branch."
+msgid "Apply this approval rule to all branches or a specific protected branch."
msgstr ""
msgid "Applying"
@@ -4259,9 +4285,6 @@ msgstr ""
msgid "ApprovalSettings|Prevent editing approval rules in projects and merge requests."
msgstr ""
-msgid "ApprovalSettings|Prevent editing approval rules in projects and merge requests. "
-msgstr ""
-
msgid "ApprovalSettings|Remove all approvals when commits are added to the source branch."
msgstr ""
@@ -4277,6 +4300,9 @@ msgstr ""
msgid "ApprovalSettings|This setting is configured at the instance level and can only be changed by an administrator."
msgstr ""
+msgid "ApprovalSettings|This setting is configured in %{groupName} and can only be changed by an administrator or group owner."
+msgstr ""
+
msgid "ApprovalStatusTooltip|Adheres to separation of duties"
msgstr ""
@@ -4763,9 +4789,6 @@ msgstr ""
msgid "Authenticated API rate limit period in seconds"
msgstr ""
-msgid "Authenticated API request rate limit"
-msgstr ""
-
msgid "Authenticated API requests"
msgstr ""
@@ -4775,10 +4798,10 @@ msgstr ""
msgid "Authenticated Git LFS request rate limit"
msgstr ""
-msgid "Authenticated web rate limit period in seconds"
+msgid "Authenticated Git LFS requests"
msgstr ""
-msgid "Authenticated web request rate limit"
+msgid "Authenticated web rate limit period in seconds"
msgstr ""
msgid "Authenticated web requests"
@@ -5156,9 +5179,6 @@ msgstr ""
msgid "Below you will find all the groups that are public."
msgstr ""
-msgid "Beta"
-msgstr ""
-
msgid "Bi-weekly code coverage"
msgstr ""
@@ -5398,6 +5418,21 @@ msgstr ""
msgid "Board scope affects which issues are displayed for anyone who visits this board"
msgstr ""
+msgid "BoardNewEpic|Groups"
+msgstr ""
+
+msgid "BoardNewEpic|Loading groups"
+msgstr ""
+
+msgid "BoardNewEpic|No matching results"
+msgstr ""
+
+msgid "BoardNewEpic|Search groups"
+msgstr ""
+
+msgid "BoardNewEpic|Select a group"
+msgstr ""
+
msgid "BoardNewIssue|No matching results"
msgstr ""
@@ -5475,6 +5510,9 @@ msgstr ""
msgid "Boards|An error occurred while creating the list. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching child groups. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching group projects. Please try again."
msgstr ""
@@ -5807,6 +5845,9 @@ msgstr ""
msgid "Bulk update"
msgstr ""
+msgid "BulkImports|Re-import creates a new group. It does not sync with the existing group."
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -5816,6 +5857,9 @@ msgstr ""
msgid "BulkImport|From source group"
msgstr ""
+msgid "BulkImport|Group import history"
+msgstr ""
+
msgid "BulkImport|Import failed: Destination cannot be a subgroup of the source group. Change the destination and try again."
msgstr ""
@@ -5828,9 +5872,18 @@ msgstr ""
msgid "BulkImport|Importing the group failed"
msgstr ""
+msgid "BulkImport|Last imported to %{link}"
+msgstr ""
+
msgid "BulkImport|Name already exists."
msgstr ""
+msgid "BulkImport|New group"
+msgstr ""
+
+msgid "BulkImport|No history is available"
+msgstr ""
+
msgid "BulkImport|No parent"
msgstr ""
@@ -5843,6 +5896,9 @@ msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} matching filter \"%{filter}\" from %{link}"
msgstr ""
+msgid "BulkImport|Source group"
+msgstr ""
+
msgid "BulkImport|To new group"
msgstr ""
@@ -5852,6 +5908,9 @@ msgstr ""
msgid "BulkImport|You have no groups to import"
msgstr ""
+msgid "BulkImport|Your imported groups will appear here."
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -6094,6 +6153,9 @@ msgstr ""
msgid "Can be manually deployed to"
msgstr ""
+msgid "Can be overridden in each project."
+msgstr ""
+
msgid "Can create groups:"
msgstr ""
@@ -6196,6 +6258,9 @@ msgstr ""
msgid "Cancelling Preview"
msgstr ""
+msgid "Cannot assign a confidential epic to a non-confidential issue. Make the issue confidential and try again"
+msgstr ""
+
msgid "Cannot be assigned to other projects."
msgstr ""
@@ -6247,9 +6312,6 @@ msgstr ""
msgid "Cannot refer to a group %{timebox_type} by an internal id!"
msgstr ""
-msgid "Cannot set confidential epic for a non-confidential issue"
-msgstr ""
-
msgid "Cannot show preview. For previews on sketch files, they must have the file format introduced by Sketch version 43 and above."
msgstr ""
@@ -6487,15 +6549,15 @@ msgstr ""
msgid "Check out, review, and merge locally"
msgstr ""
-msgid "Check the %{docs_link_start}documentation%{docs_link_end}."
-msgstr ""
-
msgid "Check the current instance configuration "
msgstr ""
msgid "Check the elasticsearch.log file to debug why the migration was halted and make any changes before retrying the migration. When you fix the cause of the failure, click \"Retry migration\", and the migration will be scheduled to be retried in the background."
msgstr ""
+msgid "Check with your administrator."
+msgstr ""
+
msgid "Check your Docker images for known vulnerabilities."
msgstr ""
@@ -6526,6 +6588,9 @@ msgstr ""
msgid "Checkout"
msgstr ""
+msgid "Checkout|$%{selectedPlanPrice} per 10 GB storage per pack"
+msgstr ""
+
msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 minutes"
msgstr ""
@@ -6546,17 +6611,23 @@ msgstr ""
msgid "Checkout|%{name}'s GitLab subscription"
msgstr ""
-msgid "Checkout|%{selectedPlanText} plan"
+msgid "Checkout|%{name}'s storage subscription"
msgstr ""
-msgid "Checkout|%{startDate} - %{endDate}"
+msgid "Checkout|%{quantity} GB of storage"
msgstr ""
-msgid "Checkout|%{totalCiMinutes} CI minute"
-msgid_plural "Checkout|%{totalCiMinutes} CI minutes"
+msgid "Checkout|%{quantity} storage pack"
+msgid_plural "Checkout|%{quantity} storage packs"
msgstr[0] ""
msgstr[1] ""
+msgid "Checkout|%{selectedPlanText} plan"
+msgstr ""
+
+msgid "Checkout|%{startDate} - %{endDate}"
+msgstr ""
+
msgid "Checkout|%{totalCiMinutes} CI minutes"
msgstr ""
@@ -6632,6 +6703,9 @@ msgstr ""
msgid "Checkout|Failed to register credit card. Please try again."
msgstr ""
+msgid "Checkout|GB"
+msgstr ""
+
msgid "Checkout|GitLab group"
msgstr ""
@@ -6668,6 +6742,9 @@ msgstr ""
msgid "Checkout|State"
msgstr ""
+msgid "Checkout|Storage packs"
+msgstr ""
+
msgid "Checkout|Street address"
msgstr ""
@@ -6689,6 +6766,9 @@ msgstr ""
msgid "Checkout|Total minutes: %{quantity}"
msgstr ""
+msgid "Checkout|Total storage: %{quantity} GB"
+msgstr ""
+
msgid "Checkout|Users"
msgstr ""
@@ -6698,16 +6778,25 @@ msgstr ""
msgid "Checkout|Your organization"
msgstr ""
+msgid "Checkout|Your storage subscription has the same term as your main subscription, and the price is prorated accordingly."
+msgstr ""
+
msgid "Checkout|Your subscription will be applied to this group"
msgstr ""
msgid "Checkout|Zip code"
msgstr ""
+msgid "Checkout|a storage subscription"
+msgstr ""
+
msgid "Checkout|company or team"
msgstr ""
-msgid "Checkout|x 1,000 minutes per pack = %{strong}"
+msgid "Checkout|minutes"
+msgstr ""
+
+msgid "Checkout|x %{quantity} %{units} per pack ="
msgstr ""
msgid "Cherry-pick this commit"
@@ -7064,6 +7153,9 @@ msgstr ""
msgid "CloneIssue|Cannot clone issue to target project as it is pending deletion."
msgstr ""
+msgid "CloneIssue|Cannot clone issues of '%{issue_type}' type."
+msgstr ""
+
msgid "Cloned this issue to %{path_to_project}."
msgstr ""
@@ -7118,7 +7210,10 @@ msgstr ""
msgid "Closes this %{quick_action_target}."
msgstr ""
-msgid "Cloud licenses can not be removed."
+msgid "Cloud Functions description and apps that are suitable for this deployment target"
+msgstr ""
+
+msgid "Cloud Run description and apps that are suitable for this deployment target"
msgstr ""
msgid "Cluster"
@@ -7145,6 +7240,12 @@ msgstr ""
msgid "ClusterAgents|Access tokens"
msgstr ""
+msgid "ClusterAgents|Agent might not be connected to GitLab"
+msgstr ""
+
+msgid "ClusterAgents|Agent never connected to GitLab"
+msgstr ""
+
msgid "ClusterAgents|Alternative installation methods"
msgstr ""
@@ -7160,6 +7261,12 @@ msgstr ""
msgid "ClusterAgents|Configuration"
msgstr ""
+msgid "ClusterAgents|Connected"
+msgstr ""
+
+msgid "ClusterAgents|Connection status"
+msgstr ""
+
msgid "ClusterAgents|Copy token"
msgstr ""
@@ -7178,6 +7285,9 @@ msgstr ""
msgid "ClusterAgents|For alternative installation methods %{linkStart}go to the documentation%{linkEnd}."
msgstr ""
+msgid "ClusterAgents|For more troubleshooting information go to"
+msgstr ""
+
msgid "ClusterAgents|Go to the repository"
msgstr ""
@@ -7193,18 +7303,30 @@ msgstr ""
msgid "ClusterAgents|Integrate with the GitLab Agent"
msgstr ""
-msgid "ClusterAgents|Last used"
+msgid "ClusterAgents|Last connected %{timeAgo}."
+msgstr ""
+
+msgid "ClusterAgents|Last contact"
msgstr ""
msgid "ClusterAgents|Learn how to create an agent access token"
msgstr ""
+msgid "ClusterAgents|Make sure you are using a valid token."
+msgstr ""
+
msgid "ClusterAgents|Name"
msgstr ""
msgid "ClusterAgents|Never"
msgstr ""
+msgid "ClusterAgents|Never connected"
+msgstr ""
+
+msgid "ClusterAgents|Not connected"
+msgstr ""
+
msgid "ClusterAgents|Read more about getting started"
msgstr ""
@@ -7226,6 +7348,9 @@ msgstr ""
msgid "ClusterAgents|Select which Agent you want to install"
msgstr ""
+msgid "ClusterAgents|The Agent has not been connected in a long time. There might be a connectivity issue. Last contact was %{timeAgo}."
+msgstr ""
+
msgid "ClusterAgents|The GitLab Agent also requires %{linkStart}enabling the Agent Server%{linkEnd}"
msgstr ""
@@ -7253,9 +7378,6 @@ msgstr ""
msgid "ClusterAgents|You will need to create a token to connect to your agent"
msgstr ""
-msgid "ClusterAgent|This feature is only available for premium plans"
-msgstr ""
-
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -7445,9 +7567,6 @@ msgstr ""
msgid "ClusterIntegration|Create Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Create a provision role on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the account and external ID above. %{startMoreInfoLink}More information%{endLink}"
-msgstr ""
-
msgid "ClusterIntegration|Create cluster on"
msgstr ""
@@ -7880,7 +7999,7 @@ msgstr ""
msgid "ClusterIntegration|Subnets"
msgstr ""
-msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provisioned role, first create one on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the above account and external IDs. %{startMoreInfoLink}More information%{endLink}"
+msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provisioned role, first create one on %{awsLinkStart}Amazon Web Services %{awsLinkEnd} using the above account and external IDs. %{moreInfoStart}More information%{moreInfoEnd}"
msgstr ""
msgid "ClusterIntegration|The Kubernetes certificate used to authenticate to the cluster."
@@ -8114,6 +8233,9 @@ msgstr ""
msgid "Collapse replies"
msgstr ""
+msgid "Collapse settings section"
+msgstr ""
+
msgid "Collapse sidebar"
msgstr ""
@@ -8132,6 +8254,9 @@ msgstr ""
msgid "Comma-separated list of email addresses."
msgstr ""
+msgid "Comma-separated list of users allowed to exceed the rate limit."
+msgstr ""
+
msgid "Comma-separated, e.g. '1.1.1.1, 2.2.2.0/24'"
msgstr ""
@@ -8452,6 +8577,9 @@ msgstr ""
msgid "Configure %{repository_checks_link_start}repository checks%{link_end} and %{housekeeping_link_start}housekeeping%{link_end} on repositories."
msgstr ""
+msgid "Configure CAPTCHAs, IP address limits, and other anti-spam measures."
+msgstr ""
+
msgid "Configure Dependency Scanning in `.gitlab-ci.yml` using the GitLab managed template. You can [add variable overrides](https://docs.gitlab.com/ee/user/application_security/dependency_scanning/#customizing-the-dependency-scanning-settings) to customize Dependency Scanning settings."
msgstr ""
@@ -8488,16 +8616,13 @@ msgstr ""
msgid "Configure a %{codeStart}.gitlab-webide.yml%{codeEnd} file in the %{codeStart}.gitlab%{codeEnd} directory to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
msgstr ""
-msgid "Configure existing installation"
-msgstr ""
-
-msgid "Configure limit for notes created per minute by web and API requests."
+msgid "Configure advanced permissions, Large File Storage, and two-factor authentication settings."
msgstr ""
-msgid "Configure limits for Project/Group Import/Export."
+msgid "Configure approvals by authors and committers on all projects."
msgstr ""
-msgid "Configure limits for web and API requests."
+msgid "Configure existing installation"
msgstr ""
msgid "Configure paths to be protected by Rack Attack."
@@ -8512,10 +8637,13 @@ msgstr ""
msgid "Configure settings for Advanced Search with Elasticsearch."
msgstr ""
+msgid "Configure specific limits for Files API requests that supersede the general user and IP rate limits."
+msgstr ""
+
msgid "Configure specific limits for Git LFS requests that supersede the general user and IP rate limits."
msgstr ""
-msgid "Configure specific limits for Packages API requests that supersede the general user and IP rate limits."
+msgid "Configure specific limits for deprecated API requests that supersede the general user and IP rate limits."
msgstr ""
msgid "Configure the %{link} integration."
@@ -8527,6 +8655,9 @@ msgstr ""
msgid "Configure the way a user creates a new account."
msgstr ""
+msgid "Configure via Merge Request"
+msgstr ""
+
msgid "Configure which lists are shown for anyone who visits this board"
msgstr ""
@@ -8995,6 +9126,9 @@ msgstr ""
msgid "Content parsed with %{link}."
msgstr ""
+msgid "ContentEditor|Table of Contents"
+msgstr ""
+
msgid "ContentEditor|You have to provide a renderMarkdown function or a custom serializer"
msgstr ""
@@ -9181,6 +9315,9 @@ msgstr ""
msgid "Copy link to chart"
msgstr ""
+msgid "Copy prefix"
+msgstr ""
+
msgid "Copy reference"
msgstr ""
@@ -9211,6 +9348,9 @@ msgstr ""
msgid "Copy value"
msgstr ""
+msgid "Corpus Management"
+msgstr ""
+
msgid "Corpus Management|Are you sure you want to delete the corpus?"
msgstr ""
@@ -9439,6 +9579,9 @@ msgstr ""
msgid "Create commit"
msgstr ""
+msgid "Create common files more quickly, and standardize their format."
+msgstr ""
+
msgid "Create confidential merge request"
msgstr ""
@@ -9472,6 +9615,9 @@ msgstr ""
msgid "Create issue"
msgstr ""
+msgid "Create issue to resolve all threads"
+msgstr ""
+
msgid "Create iteration"
msgstr ""
@@ -9526,6 +9672,9 @@ msgstr ""
msgid "Create new..."
msgstr ""
+msgid "Create or import your first project"
+msgstr ""
+
msgid "Create project"
msgstr ""
@@ -9883,7 +10032,7 @@ msgstr ""
msgid "Custom notification events"
msgstr ""
-msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notificationLinkStart} notification emails%{notificationLinkEnd}."
+msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notificationLinkStart}notification emails%{notificationLinkEnd}."
msgstr ""
msgid "Custom project templates"
@@ -10082,10 +10231,10 @@ msgid_plural "CycleAnalytics|Showing %{subjectFilterText} and %{selectedLabelsCo
msgstr[0] ""
msgstr[1] ""
-msgid "CycleAnalytics|Showing data for group '%{groupName}' and %{selectedProjectCount} projects from %{startDate} to %{endDate}"
+msgid "CycleAnalytics|Showing data for group '%{groupName}' and %{selectedProjectCount} projects from %{createdAfter} to %{createdBefore}"
msgstr ""
-msgid "CycleAnalytics|Showing data for group '%{groupName}' from %{startDate} to %{endDate}"
+msgid "CycleAnalytics|Showing data for group '%{groupName}' from %{createdAfter} to %{createdBefore}"
msgstr ""
msgid "CycleAnalytics|Stages"
@@ -10319,6 +10468,9 @@ msgstr ""
msgid "DastProfiles|Manage profiles"
msgstr ""
+msgid "DastProfiles|Manage site profiles"
+msgstr ""
+
msgid "DastProfiles|Minimum = 0 (no timeout enabled), Maximum = 2880 minutes"
msgstr ""
@@ -10394,6 +10546,9 @@ msgstr ""
msgid "DastProfiles|Scanner name"
msgstr ""
+msgid "DastProfiles|Schedule"
+msgstr ""
+
msgid "DastProfiles|Select branch"
msgstr ""
@@ -10463,7 +10618,7 @@ msgstr ""
msgid "DastProfiles|Website"
msgstr ""
-msgid "DastProfiles|You can either choose a passive scan or validate the target site in your chosen site profile. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
+msgid "DastProfiles|You can either choose a passive scan or validate the target site from the site profile management page. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
msgstr ""
msgid "DastProfiles|You cannot run an active scan against an unvalidated site."
@@ -10636,7 +10791,7 @@ msgstr ""
msgid "Days to merge"
msgstr ""
-msgid "Deactivate dormant users after 90 days of inactivity. Users can return to active status by signing in to their account. While inactive, a user is not counted as an active user in the instance."
+msgid "Deactivate dormant users after 90 days of inactivity"
msgstr ""
msgid "Dear Administrator,"
@@ -10723,10 +10878,10 @@ msgstr ""
msgid "Define a custom pattern with cron syntax"
msgstr ""
-msgid "Define approval settings."
+msgid "Define approval rules."
msgstr ""
-msgid "Define approval settings. %{linkStart}Learn more.%{linkEnd}"
+msgid "Define approval rules. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "Define custom rules for what constitutes spam, independent of Akismet"
@@ -10735,7 +10890,7 @@ msgstr ""
msgid "Define environments in the deploy stage(s) in %{code_open}.gitlab-ci.yml%{code_close} to track deployments here."
msgstr ""
-msgid "Define how approval rules are applied as a merge request moves toward completion."
+msgid "Define how approval rules are applied to merge requests."
msgstr ""
msgid "Definition"
@@ -10750,6 +10905,12 @@ msgstr ""
msgid "DelayedJobs|Are you sure you want to run %{job_name} immediately? This job will run automatically after it's timer finishes."
msgstr ""
+msgid "DelayedJobs|Are you sure you want to run %{job_name} immediately? This job will run automatically after its timer finishes."
+msgstr ""
+
+msgid "DelayedJobs|Run the delayed job now?"
+msgstr ""
+
msgid "DelayedJobs|Start now"
msgstr ""
@@ -11026,6 +11187,12 @@ msgstr ""
msgid "Dependency proxy image prefix"
msgstr ""
+msgid "DependencyProxy|Create a local proxy for storing frequently used upstream images. %{docLinkStart}Learn more%{docLinkEnd} about dependency proxies."
+msgstr ""
+
+msgid "DependencyProxy|Dependency Proxy"
+msgstr ""
+
msgid "DependencyProxy|Toggle Dependency Proxy"
msgstr ""
@@ -11266,6 +11433,9 @@ msgstr ""
msgid "Deployments"
msgstr ""
+msgid "Deployments to Google Kubernetes Engine can be "
+msgstr ""
+
msgid "Deployments|%{deployments} environment impacted."
msgid_plural "Deployments|%{deployments} environments impacted."
msgstr[0] ""
@@ -11295,6 +11465,9 @@ msgstr ""
msgid "Deployment|success"
msgstr ""
+msgid "Deprecated API rate limits"
+msgstr ""
+
msgid "Deprioritize label"
msgstr ""
@@ -11697,6 +11870,16 @@ msgstr ""
msgid "DiffsCompareBaseBranch|(base)"
msgstr ""
+msgid "Diffs|%d addition"
+msgid_plural "Diffs|%d additions"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Diffs|%d deletion"
+msgid_plural "Diffs|%d deletions"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Diffs|No file name available"
msgstr ""
@@ -11706,9 +11889,17 @@ msgstr ""
msgid "Diffs|Show all unchanged lines"
msgstr ""
+msgid "Diffs|Showing %{dropdownStart}%{count} changed file%{dropdownEnd}"
+msgid_plural "Diffs|Showing %{dropdownStart}%{count} changed files%{dropdownEnd}"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Diffs|Something went wrong while fetching diff lines."
msgstr ""
+msgid "Diffs|with %{additions} and %{deletions}"
+msgstr ""
+
msgid "Direct member"
msgstr ""
@@ -11834,9 +12025,6 @@ msgid_plural "Dismiss %d selected vulnerabilities as"
msgstr[0] ""
msgstr[1] ""
-msgid "Dismiss Value Stream Analytics introduction box"
-msgstr ""
-
msgid "Dismiss merge request promotion"
msgstr ""
@@ -12158,6 +12346,9 @@ msgstr ""
msgid "Edit issues"
msgstr ""
+msgid "Edit merge requests"
+msgstr ""
+
msgid "Edit public deploy key"
msgstr ""
@@ -12233,6 +12424,9 @@ msgstr ""
msgid "Elastic|None. Select projects to index."
msgstr ""
+msgid "Eligible users"
+msgstr ""
+
msgid "Email"
msgstr ""
@@ -12362,6 +12556,9 @@ msgstr ""
msgid "Enable"
msgstr ""
+msgid "Enable Amazon EKS integration"
+msgstr ""
+
msgid "Enable Auto DevOps"
msgstr ""
@@ -12395,6 +12592,9 @@ msgstr ""
msgid "Enable SSL verification"
msgstr ""
+msgid "Enable Service Ping"
+msgstr ""
+
msgid "Enable Snowplow tracking"
msgstr ""
@@ -12425,6 +12625,9 @@ msgstr ""
msgid "Enable authenticated Git LFS request rate limit"
msgstr ""
+msgid "Enable authenticated web request rate limit"
+msgstr ""
+
msgid "Enable authentication"
msgstr ""
@@ -12485,7 +12688,7 @@ msgstr ""
msgid "Enable or disable the Pseudonymizer data collection."
msgstr ""
-msgid "Enable or disable version check and service ping."
+msgid "Enable or disable version check and Service Ping."
msgstr ""
msgid "Enable protected paths rate limit"
@@ -12497,18 +12700,12 @@ msgstr ""
msgid "Enable reCAPTCHA"
msgstr ""
-msgid "Enable reCAPTCHA for login"
-msgstr ""
-
-msgid "Enable reCAPTCHA, Invisible Captcha, Akismet and set IP limits. For reCAPTCHA, we currently only support %{recaptcha_v2_link_start}v2%{recaptcha_v2_link_end}"
+msgid "Enable reCAPTCHA for login."
msgstr ""
msgid "Enable repository checks"
msgstr ""
-msgid "Enable service ping"
-msgstr ""
-
msgid "Enable shared runners for all projects and subgroups in this group."
msgstr ""
@@ -12530,7 +12727,10 @@ msgstr ""
msgid "Enable unauthenticated API request rate limit"
msgstr ""
-msgid "Enable unauthenticated request rate limit"
+msgid "Enable unauthenticated web request rate limit"
+msgstr ""
+
+msgid "Enable user deactivation emails"
msgstr ""
msgid "Enable version check"
@@ -12566,9 +12766,6 @@ msgstr ""
msgid "Enabled sources for code import during project creation. OmniAuth must be configured for GitHub"
msgstr ""
-msgid "Enabling this will only make licensed EE features available to projects if the project namespace's plan includes the feature or if the project is public."
-msgstr ""
-
msgid "Encountered an error while rendering: %{err}"
msgstr ""
@@ -12617,9 +12814,6 @@ msgstr ""
msgid "Enter Admin Mode"
msgstr ""
-msgid "Enter IP address range"
-msgstr ""
-
msgid "Enter a number"
msgstr ""
@@ -12632,9 +12826,6 @@ msgstr ""
msgid "Enter at least three characters to search"
msgstr ""
-msgid "Enter domain"
-msgstr ""
-
msgid "Enter in your Bitbucket Server URL and personal access token below"
msgstr ""
@@ -12821,9 +13012,6 @@ msgstr ""
msgid "Environments|Deployment %{status}"
msgstr ""
-msgid "Environments|Dismiss"
-msgstr ""
-
msgid "Environments|Enable review app"
msgstr ""
@@ -12836,9 +13024,6 @@ msgstr ""
msgid "Environments|Environments are places where code gets deployed, such as staging or production."
msgstr ""
-msgid "Environments|Help us improve environments"
-msgstr ""
-
msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
msgstr ""
@@ -12875,6 +13060,9 @@ msgstr ""
msgid "Environments|Note that this action will stop the environment, but it will %{emphasisStart}not%{emphasisEnd} have an effect on any existing deployment due to no “stop environment action†being defined in the %{ciConfigLinkStart}.gitlab-ci.yml%{ciConfigLinkEnd} file."
msgstr ""
+msgid "Environments|Open"
+msgstr ""
+
msgid "Environments|Open live environment"
msgstr ""
@@ -12914,9 +13102,6 @@ msgstr ""
msgid "Environments|Stopping %{environmentName}"
msgstr ""
-msgid "Environments|Take the survey"
-msgstr ""
-
msgid "Environments|There was an error fetching the logs. Please try again."
msgstr ""
@@ -12938,9 +13123,6 @@ msgstr ""
msgid "Environments|You don't have any environments right now"
msgstr ""
-msgid "Environments|Your feedback helps GitLab make environments better for you and other users. Participate and enter a sweepstake to win a USD 30 gift card."
-msgstr ""
-
msgid "Environments|by %{avatar}"
msgstr ""
@@ -13223,7 +13405,7 @@ msgstr ""
msgid "Error parsing CSV file. Please make sure it has"
msgstr ""
-msgid "Error rendering markdown preview"
+msgid "Error rendering Markdown preview"
msgstr ""
msgid "Error saving label update."
@@ -13271,6 +13453,9 @@ msgstr ""
msgid "Error: %{error_message}"
msgstr ""
+msgid "Error: Couldn't load some or all of the changes."
+msgstr ""
+
msgid "Error: No AWS credentials were supplied"
msgstr ""
@@ -13304,6 +13489,9 @@ msgstr ""
msgid "ErrorTracking|Enable error tracking"
msgstr ""
+msgid "ErrorTracking|Error tracking backend"
+msgstr ""
+
msgid "ErrorTracking|If you self-host Sentry, enter your Sentry instance's full URL. If you use Sentry's hosted solution, enter https://sentry.io"
msgstr ""
@@ -13337,6 +13525,12 @@ msgstr ""
msgid "Escalation policies must have at least one rule"
msgstr ""
+msgid "EscalationPolicies|%{clockIcon} IF alert is not %{alertStatus} in %{minutes}"
+msgstr ""
+
+msgid "EscalationPolicies|%{notificationIcon} THEN %{doAction} %{forScheduleOrUser}"
+msgstr ""
+
msgid "EscalationPolicies|+ Add an additional rule"
msgstr ""
@@ -13379,13 +13573,13 @@ msgstr ""
msgid "EscalationPolicies|Escalation policies"
msgstr ""
-msgid "EscalationPolicies|Escalation rules"
+msgid "EscalationPolicies|Escalation policy %{obstacle} in Project %{project}"
msgstr ""
-msgid "EscalationPolicies|Failed to load oncall-schedules"
+msgid "EscalationPolicies|Escalation rules"
msgstr ""
-msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} %{then} THEN %{doAction} %{scheduleOrUser}"
+msgid "EscalationPolicies|Failed to load oncall-schedules"
msgstr ""
msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} minutes"
@@ -13463,18 +13657,36 @@ msgstr ""
msgid "Every %{action} attempt has failed: %{job_error_message}. Please try again."
msgstr ""
+msgid "Every 3 months"
+msgstr ""
+
+msgid "Every 3 months on the %{day} at %{time} %{timezone}"
+msgstr ""
+
+msgid "Every 6 months"
+msgstr ""
+
+msgid "Every 6 months on the %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Every day"
msgstr ""
msgid "Every day (at %{time})"
msgstr ""
+msgid "Every day at %{time} %{timezone}"
+msgstr ""
+
msgid "Every month"
msgstr ""
msgid "Every month (Day %{day} at %{time})"
msgstr ""
+msgid "Every month on the %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Every three months"
msgstr ""
@@ -13489,6 +13701,15 @@ msgstr[1] ""
msgid "Every week (%{weekday} at %{time})"
msgstr ""
+msgid "Every week on %{day} at %{time} %{timezone}"
+msgstr ""
+
+msgid "Every year"
+msgstr ""
+
+msgid "Every year on %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Everyone"
msgstr ""
@@ -13525,9 +13746,6 @@ msgstr ""
msgid "Exactly one of %{attributes} is required"
msgstr ""
-msgid "Example: %{ip_address}. %{read_more_link}."
-msgstr ""
-
msgid "Example: @sub\\.company\\.com$"
msgstr ""
@@ -13594,13 +13812,13 @@ msgstr ""
msgid "Expand pipeline"
msgstr ""
-msgid "Expand sidebar"
+msgid "Expand settings section"
msgstr ""
-msgid "Expected documents: %{expected_documents}"
+msgid "Expand sidebar"
msgstr ""
-msgid "Experienced"
+msgid "Expected documents: %{expected_documents}"
msgstr ""
msgid "ExperimentSubject|Must have exactly one of User, Namespace, or Project."
@@ -13885,9 +14103,6 @@ msgstr ""
msgid "Failed to load related branches"
msgstr ""
-msgid "Failed to load sidebar lock status"
-msgstr ""
-
msgid "Failed to load stacktrace."
msgstr ""
@@ -14312,6 +14527,9 @@ msgstr ""
msgid "Files"
msgstr ""
+msgid "Files API Rate Limits"
+msgstr ""
+
msgid "Files breadcrumb"
msgstr ""
@@ -15311,6 +15529,9 @@ msgstr ""
msgid "GitLab group: %{source_link}"
msgstr ""
+msgid "GitLab informs you if a new version is available."
+msgstr ""
+
msgid "GitLab is a complete DevOps platform, delivered as a single application, fundamentally changing the way Development, Security, and Ops teams collaborate"
msgstr ""
@@ -15326,7 +15547,7 @@ msgstr ""
msgid "GitLab is open source software to collaborate on code."
msgstr ""
-msgid "GitLab is undergoing maintenance and is operating in a read-only mode."
+msgid "GitLab is undergoing maintenance and is operating in read-only mode."
msgstr ""
msgid "GitLab member or Email address"
@@ -15338,9 +15559,6 @@ msgstr ""
msgid "GitLab project export"
msgstr ""
-msgid "GitLab restart is required to apply changes."
-msgstr ""
-
msgid "GitLab single sign-on URL"
msgstr ""
@@ -15356,9 +15574,6 @@ msgstr ""
msgid "GitLab version"
msgstr ""
-msgid "GitLab will inform you if a new version is available."
-msgstr ""
-
msgid "GitLab will run a background job that will produce pseudonymized CSVs of the GitLab database that will be uploaded to your configured object storage directory."
msgstr ""
@@ -15623,9 +15838,21 @@ msgstr ""
msgid "Go to snippets"
msgstr ""
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check 'Allowed domains for sign-ups'."
+msgstr ""
+
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check 'Email restrictions for sign-ups'."
+msgstr ""
+
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check the 'Domain denylist'."
+msgstr ""
+
msgid "Go to the activity feed"
msgstr ""
+msgid "Go to the group’s 'Settings &gt; General' page, and check 'Restrict membership by email domain'."
+msgstr ""
+
msgid "Go to the milestone list"
msgstr ""
@@ -15662,6 +15889,12 @@ msgstr ""
msgid "Goal of the changes and what reviewers should be aware of"
msgstr ""
+msgid "Google Cloud"
+msgstr ""
+
+msgid "Google Cloud offers several deployment targets. Select the one most suitable for your project."
+msgstr ""
+
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
@@ -15746,9 +15979,6 @@ msgstr ""
msgid "Group ID"
msgstr ""
-msgid "Group ID: %{group_id}"
-msgstr ""
-
msgid "Group Owner must have signed in with SAML before enabling Group Managed Accounts"
msgstr ""
@@ -15923,6 +16153,12 @@ msgstr ""
msgid "GroupImport|Unable to process group import file"
msgstr ""
+msgid "GroupPage|Copy group ID"
+msgstr ""
+
+msgid "GroupPage|Group ID: %{group_id}"
+msgstr ""
+
msgid "GroupRoadmap|%{dateWord} – No end date"
msgstr ""
@@ -15977,6 +16213,9 @@ msgstr ""
msgid "GroupRoadmap|Within 3 years"
msgstr ""
+msgid "GroupSAML|\"persistent\" recommended"
+msgstr ""
+
msgid "GroupSAML|%{strongOpen}Warning%{strongClose} - Enabling %{linkStart}SSO enforcement%{linkEnd} can reduce security risks."
msgstr ""
@@ -16109,6 +16348,9 @@ msgstr ""
msgid "GroupSAML|To be able to prohibit outer forks, you first need to enforce dedicate group managed accounts."
msgstr ""
+msgid "GroupSAML|Use SAML group links to manage group membership using SAML."
+msgstr ""
+
msgid "GroupSAML|Valid SAML Response"
msgstr ""
@@ -16121,13 +16363,10 @@ msgstr ""
msgid "GroupSAML|as %{access_level}"
msgstr ""
-msgid "GroupSAML|must match stored NameID of \"%{extern_uid}\" as we use this to identify users. If the NameID changes users will be unable to sign in."
-msgstr ""
-
-msgid "GroupSAML|should be \"persistent\""
+msgid "GroupSAML|must match stored NameID of \"%{extern_uid}\" to identify user and allow sign in"
msgstr ""
-msgid "GroupSAML|should be a random persistent ID, emails are discouraged"
+msgid "GroupSAML|recommend persistent ID instead of email"
msgstr ""
msgid "GroupSelect|No matching results"
@@ -16142,9 +16381,15 @@ msgstr ""
msgid "GroupSettings|Allow project access token creation"
msgstr ""
+msgid "GroupSettings|Applied to all subgroups unless overridden by a group owner. Groups already added to the project lose access."
+msgstr ""
+
msgid "GroupSettings|Auto DevOps pipeline was updated for the group"
msgstr ""
+msgid "GroupSettings|Available only on the top-level group. Applies to all subgroups. Groups already shared with a group outside %{group} are still shared unless removed manually."
+msgstr ""
+
msgid "GroupSettings|Badges"
msgstr ""
@@ -16196,6 +16441,9 @@ msgstr ""
msgid "GroupSettings|New runners registration token has been generated!"
msgstr ""
+msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgstr ""
+
msgid "GroupSettings|Pipeline settings was updated for the group"
msgstr ""
@@ -16208,12 +16456,15 @@ msgstr ""
msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
-msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups."
+msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups"
msgstr ""
msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
msgstr ""
+msgid "GroupSettings|Prevents group members from being notified if the group is mentioned."
+msgstr ""
+
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
msgstr ""
@@ -16250,21 +16501,6 @@ msgstr ""
msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}."
msgstr ""
-msgid "GroupSettings|This setting is only available on the top-level group and it applies to all subgroups. Groups that have already been shared with a group outside %{group} will still be shared, and this access will have to be revoked manually."
-msgstr ""
-
-msgid "GroupSettings|This setting will be applied to all subgroups unless overridden by a group owner. Groups that already have access to the project will continue to have access unless removed manually."
-msgstr ""
-
-msgid "GroupSettings|This setting will override user notification preferences for all members of the group, subgroups, and projects."
-msgstr ""
-
-msgid "GroupSettings|This setting will prevent group members from being notified if the group is mentioned."
-msgstr ""
-
-msgid "GroupSettings|This setting will prevent group members from forking projects outside of the group."
-msgstr ""
-
msgid "GroupSettings|Transfer group"
msgstr ""
@@ -16382,7 +16618,7 @@ msgstr ""
msgid "GroupsNew|No import options available"
msgstr ""
-msgid "GroupsNew|Not all related objects are migrated, as %{docs_link_start}described here%{docs_link_end}. Please %{feedback_link_start}leave feedback%{feedback_link_end} on this feature."
+msgid "GroupsNew|Not all related objects are migrated. %{docs_link_start}More info%{docs_link_end}."
msgstr ""
msgid "GroupsNew|Personal access token"
@@ -16514,15 +16750,27 @@ msgstr ""
msgid "Hello %{name},"
msgstr ""
-msgid "Hello there"
-msgstr ""
-
msgid "Hello, %{name}!"
msgstr ""
msgid "Hello, %{username}!"
msgstr ""
+msgid "HelloMessage|%{handshake_emoji} Contribute to GitLab: %{contribute_link}"
+msgstr ""
+
+msgid "HelloMessage|%{magnifier_emoji} Create a new GitLab issue: %{new_issue_link}"
+msgstr ""
+
+msgid "HelloMessage|%{rocket_emoji} We like your curiosity! Help us improve GitLab by joining the team: %{jobs_page_link}"
+msgstr ""
+
+msgid "HelloMessage|Does this page need fixes or improvements? Open an issue or contribute a merge request to help make GitLab more lovable. At GitLab, everyone can contribute!"
+msgstr ""
+
+msgid "HelloMessage|Welcome to GitLab!"
+msgstr ""
+
msgid "Help"
msgstr ""
@@ -16532,13 +16780,10 @@ msgstr ""
msgid "Helps prevent bots from creating accounts."
msgstr ""
-msgid "Helps prevent bots from creating issues"
-msgstr ""
-
-msgid "Helps prevent malicious users hide their activity"
+msgid "Helps prevent bots from creating issues."
msgstr ""
-msgid "Helps reduce request volume (e.g. from crawlers or abusive bots)"
+msgid "Helps prevent malicious users hide their activity."
msgstr ""
msgid "Helps reduce request volume (for example, from crawlers or abusive bots)"
@@ -16662,6 +16907,12 @@ msgstr ""
msgid "Housekeeping, export, path, transfer, remove, archive."
msgstr ""
+msgid "How do I configure Akismet?"
+msgstr ""
+
+msgid "How do I configure it?"
+msgstr ""
+
msgid "How do I configure runners?"
msgstr ""
@@ -16683,19 +16934,25 @@ msgstr ""
msgid "How do I set up this service?"
msgstr ""
+msgid "How do I use a web terminal?"
+msgstr ""
+
+msgid "How do I use file templates?"
+msgstr ""
+
msgid "How it works"
msgstr ""
msgid "How many days need to pass between marking entity for deletion and actual removing it."
msgstr ""
-msgid "How many seconds an IP will be counted towards the limit"
+msgid "How many seconds an IP counts toward the IP address limit."
msgstr ""
-msgid "I accept the %{terms_link}"
+msgid "How the job limiter handles jobs exceeding the thresholds specified below. The 'track' mode only logs the jobs. The 'compress' mode compresses the jobs and raises an exception if the compressed size exceeds the limit."
msgstr ""
-msgid "I accept the|Terms of Service and Privacy Policy"
+msgid "I accept the %{terms_link}"
msgstr ""
msgid "I forgot my password"
@@ -16779,13 +17036,16 @@ msgstr ""
msgid "IP Address"
msgstr ""
-msgid "IP expiration time"
+msgid "IP address expiration time"
msgstr ""
-msgid "IP subnet restriction only allowed for top-level groups"
+msgid "IP address restrictions"
+msgstr ""
+
+msgid "IP addresses per user"
msgstr ""
-msgid "IPs per user"
+msgid "IP subnet restriction only allowed for top-level groups"
msgstr ""
msgid "Identifier"
@@ -16800,6 +17060,9 @@ msgstr ""
msgid "If any indexed field exceeds this limit it will be truncated to this number of characters and the rest will not be indexed or searchable. This does not apply to repository and wiki indexing. Setting this to 0 means it is unlimited."
msgstr ""
+msgid "If blank, defaults to %{code_open}Retry later%{code_close}."
+msgstr ""
+
msgid "If blank, set allowable lifetime to %{instance_level_policy_in_words}, as defined by the instance admin. Once set, existing tokens for users in this group may be revoked."
msgstr ""
@@ -16851,6 +17114,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 did not initiate these sign-in attempts, please reach out to your administrator or enable two-factor authentication (2FA) on your account."
+msgstr ""
+
msgid "If you did not initiate this change, please contact your administrator immediately."
msgstr ""
@@ -16942,10 +17208,10 @@ msgstr ""
msgid "Import Projects from Gitea"
msgstr ""
-msgid "Import a project"
+msgid "Import an exported GitLab project"
msgstr ""
-msgid "Import an exported GitLab project"
+msgid "Import and export rate limits"
msgstr ""
msgid "Import failed due to a GitHub error: %{original}"
@@ -16957,12 +17223,18 @@ msgstr ""
msgid "Import from Jira"
msgstr ""
+msgid "Import group"
+msgstr ""
+
msgid "Import group from file"
msgstr ""
msgid "Import groups"
msgstr ""
+msgid "Import history"
+msgstr ""
+
msgid "Import in progress"
msgstr ""
@@ -17026,7 +17298,25 @@ msgstr ""
msgid "Import timed out. Import took longer than %{import_jobs_expiration} seconds"
msgstr ""
-msgid "Import/Export Rate Limits"
+msgid "ImportAProjectModal|Import from a project"
+msgstr ""
+
+msgid "ImportAProjectModal|Import members from another project"
+msgstr ""
+
+msgid "ImportAProjectModal|Import project members"
+msgstr ""
+
+msgid "ImportAProjectModal|Only project members (not group members) are imported, and they get the same permissions as the project you import from."
+msgstr ""
+
+msgid "ImportAProjectModal|Successfully imported"
+msgstr ""
+
+msgid "ImportAProjectModal|Unable to import project members"
+msgstr ""
+
+msgid "ImportAProjectModal|You're importing members to the %{strongStart}%{name}%{strongEnd} project."
msgstr ""
msgid "ImportButtons|Connect repositories from"
@@ -17079,7 +17369,7 @@ msgstr[1] ""
msgid "Importing..."
msgstr ""
-msgid "Import|A repository URL usually ends in a .git suffix, although this is not required. Double check to make sure your repository URL is correct."
+msgid "Import|There is not a valid Git repository at this URL. If your HTTP repository is not publicly accessible, verify your credentials."
msgstr ""
msgid "Improve customer support with Service Desk"
@@ -17088,9 +17378,6 @@ msgstr ""
msgid "Improves Git cloning performance."
msgstr ""
-msgid "In %{time_to_now}"
-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 ""
@@ -17376,7 +17663,7 @@ msgstr ""
msgid "InProductMarketing|Start a GitLab Ultimate trial today in less than one minute, no credit card required."
msgstr ""
-msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no CC required"
+msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no credit card required"
msgstr ""
msgid "InProductMarketing|Start a trial"
@@ -17415,7 +17702,7 @@ msgstr ""
msgid "InProductMarketing|Team up in GitLab for greater efficiency"
msgstr ""
-msgid "InProductMarketing|Team work makes the dream work"
+msgid "InProductMarketing|Team work makes the dream work"
msgstr ""
msgid "InProductMarketing|Test, create, deploy"
@@ -17996,6 +18283,9 @@ msgstr ""
msgid "Integrations|Create new issue in Jira"
msgstr ""
+msgid "Integrations|Create new issue in ZenTao"
+msgstr ""
+
msgid "Integrations|Default settings are inherited from the group level."
msgstr ""
@@ -18089,9 +18379,15 @@ msgstr ""
msgid "Integrations|Search Jira issues"
msgstr ""
+msgid "Integrations|Search ZenTao issues"
+msgstr ""
+
msgid "Integrations|Send notifications about project events to Unify Circuit."
msgstr ""
+msgid "Integrations|Send notifications about project events to a Unify Circuit conversation. %{docs_link}"
+msgstr ""
+
msgid "Integrations|Sign in to add namespaces"
msgstr ""
@@ -18131,6 +18427,9 @@ msgstr ""
msgid "Integrations|You've activated every integration 🎉"
msgstr ""
+msgid "Integrations|ZenTao issues display here when you create issues in your project in ZenTao."
+msgstr ""
+
msgid "Interactive mode"
msgstr ""
@@ -18158,9 +18457,6 @@ msgstr ""
msgid "Interval Pattern"
msgstr ""
-msgid "Introducing Value Stream Analytics"
-msgstr ""
-
msgid "Introducing Your DevOps Report"
msgstr ""
@@ -18257,6 +18553,12 @@ msgstr ""
msgid "Investigate vulnerability: %{title}"
msgstr ""
+msgid "Invisible Captcha"
+msgstr ""
+
+msgid "Invisible Captcha helps prevent the creation of spam accounts. It adds a honeypot field and time-sensitive form submission to the account signup form."
+msgstr ""
+
msgid "Invitation"
msgstr ""
@@ -18710,12 +19012,18 @@ msgstr ""
msgid "Issues"
msgstr ""
+msgid "Issues I've created"
+msgstr ""
+
msgid "Issues Rate Limits"
msgstr ""
msgid "Issues and merge requests"
msgstr ""
+msgid "Issues assigned to me"
+msgstr ""
+
msgid "Issues can be bugs, tasks or ideas to be discussed. Also, issues are searchable and filterable."
msgstr ""
@@ -18827,7 +19135,7 @@ msgstr ""
msgid "Iterations|Create cadence"
msgstr ""
-msgid "Iterations|Create your first iteration"
+msgid "Iterations|Create iteration"
msgstr ""
msgid "Iterations|Delete cadence"
@@ -18836,6 +19144,9 @@ msgstr ""
msgid "Iterations|Delete iteration cadence?"
msgstr ""
+msgid "Iterations|Delete iteration?"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -18869,12 +19180,18 @@ msgstr ""
msgid "Iterations|New iteration cadence"
msgstr ""
+msgid "Iterations|No closed iterations."
+msgstr ""
+
msgid "Iterations|No iteration cadences to show."
msgstr ""
msgid "Iterations|No iterations in cadence."
msgstr ""
+msgid "Iterations|No open iterations."
+msgstr ""
+
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
@@ -18905,6 +19222,9 @@ msgstr ""
msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
msgstr ""
+msgid "Iterations|This will remove the iteration from any issues that are assigned to it."
+msgstr ""
+
msgid "Iterations|Title"
msgstr ""
@@ -18920,15 +19240,9 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "I’m familiar with the basics of DevOps."
-msgstr ""
-
msgid "I’m joining my team who’s already on GitLab"
msgstr ""
-msgid "I’m not familiar with the basics of DevOps."
-msgstr ""
-
msgid "Jaeger URL"
msgstr ""
@@ -19193,6 +19507,9 @@ msgstr ""
msgid "Job"
msgstr ""
+msgid "Job %{jobName}"
+msgstr ""
+
msgid "Job Failed #%{build_id}"
msgstr ""
@@ -19783,9 +20100,6 @@ msgstr ""
msgid "Learn more in the"
msgstr ""
-msgid "Learn more in the|pipeline schedules documentation"
-msgstr ""
-
msgid "Learn more."
msgstr ""
@@ -19897,9 +20211,6 @@ msgstr ""
msgid "Leave Admin Mode"
msgstr ""
-msgid "Leave blank for no limit. Once set, existing personal access tokens may be revoked."
-msgstr ""
-
msgid "Leave edit mode? All unsaved changes will be lost."
msgstr ""
@@ -19945,10 +20256,10 @@ msgstr ""
msgid "LicenseCompliance|Acceptable license to be used in the project"
msgstr ""
-msgid "LicenseCompliance|Add a license"
+msgid "LicenseCompliance|Add license and related policy"
msgstr ""
-msgid "LicenseCompliance|Add license and related policy"
+msgid "LicenseCompliance|Add license policy"
msgstr ""
msgid "LicenseCompliance|Allow"
@@ -20038,6 +20349,9 @@ msgstr ""
msgid "LicenseManagement|Uncategorized"
msgstr ""
+msgid "Licensed Enterprise Edition features can be used if the project namespace's plan includes the feature, or if the project is public."
+msgstr ""
+
msgid "Licensed Features"
msgstr ""
@@ -20104,7 +20418,10 @@ msgstr ""
msgid "Limit namespaces and projects that can be indexed"
msgstr ""
-msgid "Limit sign in from multiple ips"
+msgid "Limit project size at a global, group, and project level. %{link_start}Learn more%{link_end}."
+msgstr ""
+
+msgid "Limit sign in from multiple IP addresses"
msgstr ""
msgid "Limit the number of concurrent operations this secondary site can run in the background."
@@ -20116,11 +20433,17 @@ msgstr ""
msgid "Limit the number of issues and epics per minute a user can create through web and API requests."
msgstr ""
+msgid "Limit the size of Sidekiq jobs stored in Redis."
+msgstr ""
+
msgid "Limited to showing %d event at most"
msgid_plural "Limited to showing %d events at most"
msgstr[0] ""
msgstr[1] ""
+msgid "Limiting mode"
+msgstr ""
+
msgid "Line changes"
msgstr ""
@@ -20190,9 +20513,6 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
-msgid "List of users to be excluded from the limit"
-msgstr ""
-
msgid "List options"
msgstr ""
@@ -20232,9 +20552,6 @@ msgstr ""
msgid "Loading functions timed out. Please reload the page to try again."
msgstr ""
-msgid "Loading issues"
-msgstr ""
-
msgid "Loading more"
msgstr ""
@@ -20526,6 +20843,9 @@ msgstr ""
msgid "Marked For Deletion At - %{deletion_time}"
msgstr ""
+msgid "Marked as ready. Merging is now allowed."
+msgstr ""
+
msgid "Marked this %{noun} as a draft."
msgstr ""
@@ -20598,52 +20918,22 @@ msgstr ""
msgid "Max 100,000 events"
msgstr ""
-msgid "Max 20 characters"
-msgstr ""
-
-msgid "Max Group Export Download requests per minute per user"
-msgstr ""
-
-msgid "Max Group Export requests per minute per user"
-msgstr ""
-
-msgid "Max Group Import requests per minute per user"
-msgstr ""
-
-msgid "Max Project Export Download requests per minute per user"
-msgstr ""
-
-msgid "Max Project Export requests per minute per user"
-msgstr ""
-
-msgid "Max Project Import requests per minute per user"
-msgstr ""
-
-msgid "Max authenticated API requests per period per user"
-msgstr ""
-
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
-msgid "Max authenticated web requests per period per user"
-msgstr ""
-
msgid "Max file size is 200 KB."
msgstr ""
-msgid "Max requests per minute per user"
-msgstr ""
-
msgid "Max role"
msgstr ""
msgid "Max session time"
msgstr ""
-msgid "Max unauthenticated requests per period per IP"
+msgid "MaxBuilds"
msgstr ""
-msgid "MaxBuilds"
+msgid "Maximum 20 characters"
msgstr ""
msgid "Maximum Conan package file size in bytes"
@@ -20679,6 +20969,12 @@ msgstr ""
msgid "Maximum attachment size (MB)"
msgstr ""
+msgid "Maximum authenticated API requests per rate limit period per user"
+msgstr ""
+
+msgid "Maximum authenticated web requests per rate limit period per user"
+msgstr ""
+
msgid "Maximum bulk request size (MiB)"
msgstr ""
@@ -20724,6 +21020,15 @@ msgstr ""
msgid "Maximum files in a diff"
msgstr ""
+msgid "Maximum group export download requests per minute"
+msgstr ""
+
+msgid "Maximum group export requests per minute"
+msgstr ""
+
+msgid "Maximum group import requests per minute"
+msgstr ""
+
msgid "Maximum import size"
msgstr ""
@@ -20760,7 +21065,7 @@ msgstr ""
msgid "Maximum number of projects."
msgstr ""
-msgid "Maximum number of unique IPs per user"
+msgid "Maximum number of unique IP addresses per user."
msgstr ""
msgid "Maximum page reached"
@@ -20769,12 +21074,24 @@ msgstr ""
msgid "Maximum page size"
msgstr ""
+msgid "Maximum project export download requests per minute"
+msgstr ""
+
+msgid "Maximum project export requests per minute"
+msgstr ""
+
+msgid "Maximum project import requests per minute"
+msgstr ""
+
msgid "Maximum push size"
msgstr ""
msgid "Maximum push size (MB)"
msgstr ""
+msgid "Maximum requests per minute"
+msgstr ""
+
msgid "Maximum running slices"
msgstr ""
@@ -20802,10 +21119,16 @@ msgstr ""
msgid "Maximum time between updates that a mirror can have when scheduled to synchronize."
msgstr ""
-msgid "Maximum time for web terminal websocket connection (in seconds). 0 for unlimited."
+msgid "Maximum time that users are allowed to skip the setup of two-factor authentication (in hours). Set to 0 (zero) to enforce at next sign in."
msgstr ""
-msgid "Maximum time that users are allowed to skip the setup of two-factor authentication (in hours). Set to 0 (zero) to enforce at next sign in."
+msgid "Maximum time, in seconds, for a web terminal websocket connection. 0 for unlimited."
+msgstr ""
+
+msgid "Maximum unauthenticated API requests per rate limit period per IP"
+msgstr ""
+
+msgid "Maximum unauthenticated web requests per rate limit period per IP"
msgstr ""
msgid "May"
@@ -20823,9 +21146,6 @@ msgstr ""
msgid "Medium vulnerabilities present"
msgstr ""
-msgid "Member lock"
-msgstr ""
-
msgid "Member since"
msgstr ""
@@ -20862,6 +21182,9 @@ msgstr ""
msgid "Members of a group may only view projects they have permission to access"
msgstr ""
+msgid "Membership"
+msgstr ""
+
msgid "Members|%{time} by %{user}"
msgstr ""
@@ -20922,9 +21245,6 @@ msgstr ""
msgid "Members|Expiration date updated successfully."
msgstr ""
-msgid "Members|Expired"
-msgstr ""
-
msgid "Members|Filter members"
msgstr ""
@@ -20940,9 +21260,6 @@ msgstr ""
msgid "Members|Membership"
msgstr ""
-msgid "Members|No expiration set"
-msgstr ""
-
msgid "Members|Remove \"%{groupName}\""
msgstr ""
@@ -20964,9 +21281,6 @@ msgstr ""
msgid "Members|Search invited"
msgstr ""
-msgid "Members|in %{time}"
-msgstr ""
-
msgid "Member|Deny access"
msgstr ""
@@ -21042,9 +21356,6 @@ msgstr ""
msgid "Merge request %{mr_link} was reviewed by %{mr_author}"
msgstr ""
-msgid "Merge request (MR) approvals"
-msgstr ""
-
msgid "Merge request analytics"
msgstr ""
@@ -21066,12 +21377,21 @@ msgstr ""
msgid "Merge requests"
msgstr ""
+msgid "Merge requests I've created"
+msgstr ""
+
msgid "Merge requests are a place to propose changes you've made to a project and discuss those changes with others"
msgstr ""
msgid "Merge requests are read-only in a secondary Geo node"
msgstr ""
+msgid "Merge requests assigned to me"
+msgstr ""
+
+msgid "Merge requests that I'm a reviewer"
+msgstr ""
+
msgid "Merge the branch and fix any conflicts that come up"
msgstr ""
@@ -21132,10 +21452,10 @@ msgstr ""
msgid "MergeRequests|An error occurred while saving the draft comment."
msgstr ""
-msgid "MergeRequests|Failed to squash. Should be done manually."
+msgid "MergeRequests|Create issue to resolve thread"
msgstr ""
-msgid "MergeRequests|Resolve this thread in a new issue"
+msgid "MergeRequests|Failed to squash. Should be done manually."
msgstr ""
msgid "MergeRequests|Saving the comment failed"
@@ -21949,6 +22269,9 @@ msgstr ""
msgid "MoveIssue|Cannot move issue to project it originates from!"
msgstr ""
+msgid "MoveIssue|Cannot move issues of '%{issue_type}' type."
+msgstr ""
+
msgid "Moved issue to %{label} column in the board."
msgstr ""
@@ -22074,6 +22397,15 @@ 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. To learn more about reducing storage capacity please visit our docs."
msgstr ""
+msgid "NamespaceUserCap|Pending users must be reviewed and approved by a group owner. Learn more about %{user_caps_link_start}User Caps%{link_end} and %{users_pending_approval_link_start}Users Pending Approval%{link_end}."
+msgstr ""
+
+msgid "NamespaceUserCap|View pending user approvals"
+msgstr ""
+
+msgid "NamespaceUserCap|Your group has reached its billable member limit"
+msgstr ""
+
msgid "Namespaces"
msgstr ""
@@ -22116,9 +22448,6 @@ msgstr ""
msgid "Network"
msgstr ""
-msgid "Network Policy|New rule"
-msgstr ""
-
msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is inbound from a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
msgstr ""
@@ -22140,16 +22469,13 @@ msgstr ""
msgid "NetworkPolicies|%{strongOpen}any%{strongClose} port"
msgstr ""
-msgid "NetworkPolicies|+ Add alert"
-msgstr ""
-
msgid "NetworkPolicies|.yaml"
msgstr ""
msgid "NetworkPolicies|.yaml mode"
msgstr ""
-msgid "NetworkPolicies|Actions"
+msgid "NetworkPolicies|Add alert"
msgstr ""
msgid "NetworkPolicies|Alerts are intended to be selectively used for a limited number of events that are potentially concerning and warrant a manual review. Alerts should not be used as a substitute for a SIEM or a logging tool. High volume alerts are likely to be dropped so as to preserve the stability of GitLab's integration with Kubernetes."
@@ -22185,9 +22511,6 @@ msgstr ""
msgid "NetworkPolicies|Deny all traffic"
msgstr ""
-msgid "NetworkPolicies|Description"
-msgstr ""
-
msgid "NetworkPolicies|Edit policy"
msgstr ""
@@ -22200,9 +22523,6 @@ msgstr ""
msgid "NetworkPolicies|IP/subnet"
msgstr ""
-msgid "NetworkPolicies|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
-msgstr ""
-
msgid "NetworkPolicies|Invalid or empty policy"
msgstr ""
@@ -22212,19 +22532,16 @@ msgstr ""
msgid "NetworkPolicies|Kubernetes error: %{error}"
msgstr ""
-msgid "NetworkPolicies|Name"
-msgstr ""
-
msgid "NetworkPolicies|Network"
msgstr ""
-msgid "NetworkPolicies|Network traffic"
+msgid "NetworkPolicies|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
msgstr ""
-msgid "NetworkPolicies|New policy"
+msgid "NetworkPolicies|Network policy can be created after the environment is loaded successfully."
msgstr ""
-msgid "NetworkPolicies|No policies detected"
+msgid "NetworkPolicies|Network traffic"
msgstr ""
msgid "NetworkPolicies|None selected"
@@ -22233,21 +22550,12 @@ msgstr ""
msgid "NetworkPolicies|Please %{installLinkStart}install%{installLinkEnd} and %{configureLinkStart}configure a Kubernetes Agent for this project%{configureLinkEnd} to enable alerts."
msgstr ""
-msgid "NetworkPolicies|Policies are a specification of how groups of pods are allowed to communicate with each other's network endpoints."
-msgstr ""
-
msgid "NetworkPolicies|Policy %{policyName} was successfully changed"
msgstr ""
msgid "NetworkPolicies|Policy definition"
msgstr ""
-msgid "NetworkPolicies|Policy editor"
-msgstr ""
-
-msgid "NetworkPolicies|Policy preview"
-msgstr ""
-
msgid "NetworkPolicies|Rule"
msgstr ""
@@ -22257,9 +22565,6 @@ msgstr ""
msgid "NetworkPolicies|Rule mode is unavailable for this policy. In some cases, we cannot parse the YAML file back into the rules editor."
msgstr ""
-msgid "NetworkPolicies|Rules"
-msgstr ""
-
msgid "NetworkPolicies|Save changes"
msgstr ""
@@ -22272,9 +22577,6 @@ msgstr ""
msgid "NetworkPolicies|Traffic that does not match any rule will be blocked."
msgstr ""
-msgid "NetworkPolicies|Unable to parse policy"
-msgstr ""
-
msgid "NetworkPolicies|all DNS names"
msgstr ""
@@ -22454,6 +22756,9 @@ msgstr ""
msgid "New issue"
msgstr ""
+msgid "New issue in %{project}"
+msgstr ""
+
msgid "New issue title"
msgstr ""
@@ -22532,7 +22837,7 @@ msgstr ""
msgid "Newest first"
msgstr ""
-msgid "Newly registered users will by default be external"
+msgid "Newly-registered users are external by default"
msgstr ""
msgid "Next"
@@ -22847,8 +23152,10 @@ msgstr ""
msgid "No webhooks found, add one in the form above."
msgstr ""
-msgid "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} to renew your subscription."
-msgstr ""
+msgid "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} day to renew your subscription."
+msgid_plural "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} days to renew your subscription."
+msgstr[0] ""
+msgstr[1] ""
msgid "No. of commits"
msgstr ""
@@ -22865,7 +23172,7 @@ msgstr ""
msgid "Nodes"
msgstr ""
-msgid "Non-admin users can sign in with read-only access and make read-only API requests."
+msgid "Non-admin users are restricted to read-only access, in both GitLab UI and API."
msgstr ""
msgid "None"
@@ -22946,7 +23253,7 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
-msgid "Notes Rate Limits"
+msgid "Notes rate limit"
msgstr ""
msgid "Notes|Are you sure you want to cancel creating this comment?"
@@ -23113,9 +23420,6 @@ msgstr ""
msgid "November"
msgstr ""
-msgid "Novice"
-msgstr ""
-
msgid "Now, personalize your GitLab experience"
msgstr ""
@@ -23284,7 +23588,7 @@ msgstr ""
msgid "OnCallSchedules|For this rotation, on-call will be:"
msgstr ""
-msgid "OnCallSchedules|On-call schedule %{schedule} in Project %{project}"
+msgid "OnCallSchedules|On-call schedule %{obstacle} in Project %{project}"
msgstr ""
msgid "OnCallSchedules|On-call schedules"
@@ -23431,22 +23735,22 @@ msgstr ""
msgid "OnDemandScans|Scanner profile"
msgstr ""
-msgid "OnDemandScans|Select one of the existing profiles"
+msgid "OnDemandScans|Schedule scan"
msgstr ""
-msgid "OnDemandScans|Site profile"
+msgid "OnDemandScans|Select one of the existing profiles"
msgstr ""
-msgid "OnDemandScans|Use existing scanner profile"
+msgid "OnDemandScans|Site profile"
msgstr ""
-msgid "OnDemandScans|Use existing site profile"
+msgid "OnDemandScans|Start time"
msgstr ""
-msgid "OnDemandScans|You can either choose a passive scan or validate the target site in your chosen site profile. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
+msgid "OnDemandScans|Use existing scanner profile"
msgstr ""
-msgid "OnDemandScans|You cannot run an active scan against an unvalidated site."
+msgid "OnDemandScans|Use existing site profile"
msgstr ""
msgid "OnDemandScans|You must create a repository within your project to run an on-demand scan."
@@ -23511,6 +23815,9 @@ msgstr ""
msgid "Only admins can delete project"
msgstr ""
+msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
+msgstr ""
+
msgid "Only include features new to your current subscription tier."
msgstr ""
@@ -23529,6 +23836,12 @@ msgstr ""
msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
+msgid "Only reCAPTCHA v2 is supported:"
+msgstr ""
+
+msgid "Only users from the specified IP address ranges are able to reach this group, including all subgroups, projects, and Git repositories."
+msgstr ""
+
msgid "Only verified users with an email address in any of these domains can be added to the group."
msgstr ""
@@ -23715,9 +24028,6 @@ msgstr ""
msgid "Package Registry"
msgstr ""
-msgid "Package Registry Rate Limits"
-msgstr ""
-
msgid "Package Registry: authenticated API requests"
msgstr ""
@@ -23736,6 +24046,9 @@ msgstr ""
msgid "Package recipe already exists"
msgstr ""
+msgid "Package registry rate limits"
+msgstr ""
+
msgid "Package type"
msgstr ""
@@ -23802,6 +24115,9 @@ msgstr ""
msgid "PackageRegistry|Composer"
msgstr ""
+msgid "PackageRegistry|Composer.json with license: %{license} and version: %{version}"
+msgstr ""
+
msgid "PackageRegistry|Conan"
msgstr ""
@@ -23865,6 +24181,9 @@ msgstr ""
msgid "PackageRegistry|Copy require package include"
msgstr ""
+msgid "PackageRegistry|Copy target SHA"
+msgstr ""
+
msgid "PackageRegistry|Copy yarn command"
msgstr ""
@@ -23931,6 +24250,9 @@ msgstr ""
msgid "PackageRegistry|Install package version"
msgstr ""
+msgid "PackageRegistry|Instance-level"
+msgstr ""
+
msgid "PackageRegistry|Invalid Package: failed metadata extraction"
msgstr ""
@@ -23976,6 +24298,9 @@ msgstr ""
msgid "PackageRegistry|Pip Command"
msgstr ""
+msgid "PackageRegistry|Project-level"
+msgstr ""
+
msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
msgstr ""
@@ -23997,6 +24322,9 @@ msgstr ""
msgid "PackageRegistry|Remove package"
msgstr ""
+msgid "PackageRegistry|Required Python: %{pythonVersion}"
+msgstr ""
+
msgid "PackageRegistry|RubyGems"
msgstr ""
@@ -24039,6 +24367,9 @@ msgstr ""
msgid "PackageRegistry|Source project located at %{link}"
msgstr ""
+msgid "PackageRegistry|Target SHA: %{sha}"
+msgstr ""
+
msgid "PackageRegistry|There are no other versions of this package."
msgstr ""
@@ -24207,6 +24538,18 @@ msgstr ""
msgid "Password was successfully updated. Please sign in again."
msgstr ""
+msgid "PasswordPrompt|Confirm password"
+msgstr ""
+
+msgid "PasswordPrompt|Confirm password to continue"
+msgstr ""
+
+msgid "PasswordPrompt|Password is required"
+msgstr ""
+
+msgid "PasswordPrompt|Please enter your password to confirm"
+msgstr ""
+
msgid "Passwords should be unique and not used for any other sites or services."
msgstr ""
@@ -24234,6 +24577,9 @@ msgstr ""
msgid "Paste project path (i.e. gitlab-org/gitlab)"
msgstr ""
+msgid "Paste this DSN into your Sentry SDK"
+msgstr ""
+
msgid "Paste your public SSH key, which is usually contained in the file '~/.ssh/id_ed25519.pub' or '~/.ssh/id_rsa.pub' and begins with 'ssh-ed25519' or 'ssh-rsa'. Do not paste your private SSH key, as that can compromise your identity."
msgstr ""
@@ -24318,6 +24664,9 @@ msgstr ""
msgid "PerformanceBar|First Contentful Paint"
msgstr ""
+msgid "PerformanceBar|Flamegraph with mode:"
+msgstr ""
+
msgid "PerformanceBar|Frontend resources"
msgstr ""
@@ -24351,6 +24700,15 @@ msgstr ""
msgid "PerformanceBar|Trace"
msgstr ""
+msgid "PerformanceBar|cpu"
+msgstr ""
+
+msgid "PerformanceBar|object"
+msgstr ""
+
+msgid "PerformanceBar|wall"
+msgstr ""
+
msgid "Period in seconds"
msgstr ""
@@ -24579,6 +24937,48 @@ msgstr ""
msgid "PipelineSchedules|Variables"
msgstr ""
+msgid "PipelineSource|API"
+msgstr ""
+
+msgid "PipelineSource|Chat"
+msgstr ""
+
+msgid "PipelineSource|External"
+msgstr ""
+
+msgid "PipelineSource|External Pull Request"
+msgstr ""
+
+msgid "PipelineSource|Merge Request"
+msgstr ""
+
+msgid "PipelineSource|On-Demand DAST Scan"
+msgstr ""
+
+msgid "PipelineSource|On-Demand DAST Validation"
+msgstr ""
+
+msgid "PipelineSource|Parent Pipeline"
+msgstr ""
+
+msgid "PipelineSource|Pipeline"
+msgstr ""
+
+msgid "PipelineSource|Push"
+msgstr ""
+
+msgid "PipelineSource|Schedule"
+msgstr ""
+
+msgid "PipelineSource|Trigger"
+msgstr ""
+
+msgid "PipelineSource|Web"
+msgstr ""
+
+msgid "PipelineSource|Web IDE"
+msgstr ""
+
msgid "PipelineStatusTooltip|Pipeline: %{ciStatus}"
msgstr ""
@@ -24879,46 +25279,7 @@ msgstr ""
msgid "Pipeline|Source"
msgstr ""
-msgid "Pipeline|Source|API"
-msgstr ""
-
-msgid "Pipeline|Source|Chat"
-msgstr ""
-
-msgid "Pipeline|Source|External"
-msgstr ""
-
-msgid "Pipeline|Source|External Pull Request"
-msgstr ""
-
-msgid "Pipeline|Source|Merge Request"
-msgstr ""
-
-msgid "Pipeline|Source|On-Demand DAST Scan"
-msgstr ""
-
-msgid "Pipeline|Source|On-Demand DAST Validation"
-msgstr ""
-
-msgid "Pipeline|Source|Parent Pipeline"
-msgstr ""
-
-msgid "Pipeline|Source|Pipeline"
-msgstr ""
-
-msgid "Pipeline|Source|Push"
-msgstr ""
-
-msgid "Pipeline|Source|Schedule"
-msgstr ""
-
-msgid "Pipeline|Source|Trigger"
-msgstr ""
-
-msgid "Pipeline|Source|Web"
-msgstr ""
-
-msgid "Pipeline|Source|Web IDE"
+msgid "Pipeline|Source|Security Policy"
msgstr ""
msgid "Pipeline|Specify variable values to be used in this run. The values specified in %{linkStart}CI/CD settings%{linkEnd} will be used by default."
@@ -24969,7 +25330,7 @@ msgstr ""
msgid "Pipeline|We are currently unable to fetch pipeline data"
msgstr ""
-msgid "Pipeline|You’re about to stop pipeline %{pipelineId}."
+msgid "Pipeline|You’re about to stop pipeline #%{pipelineId}."
msgstr ""
msgid "Pipeline|for"
@@ -24996,6 +25357,9 @@ msgstr ""
msgid "Plain diff"
msgstr ""
+msgid "Plain-text response to send to clients that hit a rate limit"
+msgstr ""
+
msgid "Plan:"
msgstr ""
@@ -25140,9 +25504,6 @@ msgstr ""
msgid "Please provide attributes to update"
msgstr ""
-msgid "Please provide your username or email address."
-msgstr ""
-
msgid "Please reach out if you have any questions and we'll be happy to assist."
msgstr ""
@@ -25185,9 +25546,6 @@ msgstr ""
msgid "Please set a new password before proceeding."
msgstr ""
-msgid "Please share your feedback about %{featureName} %{linkStart}in this issue%{linkEnd} to help us improve the experience."
-msgstr ""
-
msgid "Please solve the captcha"
msgstr ""
@@ -25365,6 +25723,9 @@ msgstr ""
msgid "Prevent adding new members to project membership within this group"
msgstr ""
+msgid "Prevent auto-stopping"
+msgstr ""
+
msgid "Prevent editing approval rules in projects and merge requests."
msgstr ""
@@ -25377,7 +25738,7 @@ msgstr ""
msgid "Prevent users from changing their profile name"
msgstr ""
-msgid "Prevent users from performing write operations on GitLab while performing maintenance."
+msgid "Prevent users from performing write operations while GitLab maintenance is in progress."
msgstr ""
msgid "Preview"
@@ -25650,6 +26011,9 @@ msgstr ""
msgid "Profiles|Enter your name, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Enter your password to confirm the email change"
+msgstr ""
+
msgid "Profiles|Enter your pronouns to let people know how to refer to you"
msgstr ""
@@ -25884,10 +26248,10 @@ msgstr ""
msgid "Profiles|e.g. My MacBook key"
msgstr ""
-msgid "Profiles|username"
+msgid "Profiles|https://website.com"
msgstr ""
-msgid "Profiles|website.com"
+msgid "Profiles|username"
msgstr ""
msgid "Profiles|your account"
@@ -26130,9 +26494,21 @@ msgstr ""
msgid "ProjectSelect| or group"
msgstr ""
+msgid "ProjectSelect|No matching results"
+msgstr ""
+
msgid "ProjectSelect|Search for project"
msgstr ""
+msgid "ProjectSelect|Search projects"
+msgstr ""
+
+msgid "ProjectSelect|Select a project"
+msgstr ""
+
+msgid "ProjectSelect|There was an error fetching the projects. Please try again."
+msgstr ""
+
msgid "ProjectService|Drone server URL"
msgstr ""
@@ -26220,6 +26596,9 @@ msgstr ""
msgid "ProjectService|Trigger event when a new, unique alert is recorded."
msgstr ""
+msgid "ProjectService|Trigger event when a new, unique vulnerability is recorded. (Note: This feature requires an Ultimate plan.)"
+msgstr ""
+
msgid "ProjectService|Trigger event when a pipeline status changes."
msgstr ""
@@ -26634,9 +27013,15 @@ msgstr ""
msgid "Projects are graded based on the highest severity vulnerability present"
msgstr ""
+msgid "Projects are organized into groups"
+msgstr ""
+
msgid "Projects contributed to"
msgstr ""
+msgid "Projects help you organize your work. They contain your file repository, issues, merge requests, and so much more."
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr ""
@@ -26871,10 +27256,10 @@ msgstr ""
msgid "PrometheusService|Prometheus cluster integration"
msgstr ""
-msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
+msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
msgstr ""
-msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
+msgid "PrometheusService|The ID of the IAP-secured resource."
msgstr ""
msgid "PrometheusService|The Prometheus API base URL."
@@ -27492,6 +27877,9 @@ msgstr ""
msgid "Rate limit"
msgstr ""
+msgid "Rate limits can help reduce request volume (like from crawlers or abusive bots)."
+msgstr ""
+
msgid "Raw blob request rate limit per minute"
msgstr ""
@@ -27504,6 +27892,9 @@ msgstr ""
msgid "Re-authentication required"
msgstr ""
+msgid "Re-import"
+msgstr ""
+
msgid "Re-request review"
msgstr ""
@@ -27525,6 +27916,9 @@ msgstr ""
msgid "Read more about related issues"
msgstr ""
+msgid "Read their documentation."
+msgstr ""
+
msgid "Ready to get started with GitLab? Follow these steps to set up your workspace, plan and commit changes, and deploy your project."
msgstr ""
@@ -27558,6 +27952,9 @@ msgstr ""
msgid "Receive any notifications from GitLab."
msgstr ""
+msgid "Receive notification of abuse reports by email."
+msgstr ""
+
msgid "Receive notifications about your own activity"
msgstr ""
@@ -27701,9 +28098,6 @@ msgstr ""
msgid "Registry setup"
msgstr ""
-msgid "Regulate approvals by authors/committers. Affects all projects."
-msgstr ""
-
msgid "Reindexing Status: %{status} (Slice multiplier: %{multiplier}, Maximum running slices: %{max_slices})"
msgstr ""
@@ -27799,6 +28193,9 @@ msgstr ""
msgid "Release|Something went wrong while saving the release details."
msgstr ""
+msgid "Reload page"
+msgstr ""
+
msgid "Remediations"
msgstr ""
@@ -28081,6 +28478,9 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
+msgid "Repeats"
+msgstr ""
+
msgid "Replace"
msgstr ""
@@ -28443,10 +28843,7 @@ msgstr ""
msgid "Require additional authentication for administrative tasks."
msgstr ""
-msgid "Require all users in this group to setup Two-factor authentication"
-msgstr ""
-
-msgid "Require all users in this group to setup two-factor authentication"
+msgid "Require all users in this group to set up two-factor authentication"
msgstr ""
msgid "Required approvals (%{approvals_given} given)"
@@ -28492,6 +28889,9 @@ msgstr[1] ""
msgid "Requires values to meet regular expression requirements."
msgstr ""
+msgid "Requires you to deploy or set up cloud-hosted Sentry."
+msgstr ""
+
msgid "Requires your primary GitLab email address."
msgstr ""
@@ -28552,9 +28952,6 @@ msgstr ""
msgid "Resolve"
msgstr ""
-msgid "Resolve all threads in new issue"
-msgstr ""
-
msgid "Resolve conflicts"
msgstr ""
@@ -28612,6 +29009,9 @@ msgstr ""
msgid "Response text"
msgstr ""
+msgid "Restart GitLab to apply changes."
+msgstr ""
+
msgid "Restart Terminal"
msgstr ""
@@ -28630,6 +29030,9 @@ msgstr ""
msgid "Restoring the project will prevent the project from being removed on this date and restore people's ability to make changes to it."
msgstr ""
+msgid "Restrict group access by IP address. %{link_start}Learn more%{link_end}."
+msgstr ""
+
msgid "Restrict membership by email domain"
msgstr ""
@@ -28943,6 +29346,9 @@ msgstr ""
msgid "Runners|Runner #%{runner_id}"
msgstr ""
+msgid "Runners|Runner assigned to project."
+msgstr ""
+
msgid "Runners|Runner is offline, last contact was %{runner_contact} ago"
msgstr ""
@@ -28955,6 +29361,9 @@ msgstr ""
msgid "Runners|Runner registration"
msgstr ""
+msgid "Runners|Runner unassigned from project."
+msgstr ""
+
msgid "Runners|Runners"
msgstr ""
@@ -29147,7 +29556,7 @@ msgstr ""
msgid "SastEntryPoints|How do I set up SAST?"
msgstr ""
-msgid "SastEntryPoints|Learn more."
+msgid "SastEntryPoints|Learn more"
msgstr ""
msgid "Satisfied"
@@ -29189,7 +29598,7 @@ msgstr ""
msgid "Save pipeline schedule"
msgstr ""
-msgid "Save space and find images in the container Registry. remove unneeded tags and keep only the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
+msgid "Save storage space by automatically deleting tags from the container registry and keeping the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
msgstr ""
msgid "Saving"
@@ -29363,6 +29772,9 @@ msgstr ""
msgid "Search or filter results…"
msgstr ""
+msgid "Search or jump to..."
+msgstr ""
+
msgid "Search project"
msgstr ""
@@ -29423,16 +29835,16 @@ msgstr ""
msgid "SearchCodeResults|of %{link_to_project}"
msgstr ""
-msgid "SearchResults|Showing %{count} %{scope} for%{term_element}"
+msgid "SearchResults|Showing %{count} %{scope} for %{term_element}"
msgstr ""
-msgid "SearchResults|Showing %{count} %{scope} for%{term_element} in your personal and project snippets"
+msgid "SearchResults|Showing %{count} %{scope} for %{term_element} in your personal and project snippets"
msgstr ""
-msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for%{term_element}"
+msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for %{term_element}"
msgstr ""
-msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for%{term_element} in your personal and project snippets"
+msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for %{term_element} in your personal and project snippets"
msgstr ""
msgid "SearchResults|code result"
@@ -29514,6 +29926,9 @@ msgstr ""
msgid "Secret Detection"
msgstr ""
+msgid "Secret access key"
+msgstr ""
+
msgid "Secret token"
msgstr ""
@@ -29553,9 +29968,6 @@ msgstr ""
msgid "SecurityApprovals|A merge request approval is required when the license compliance report contains a denied license."
msgstr ""
-msgid "SecurityApprovals|Configurable if security scanners are enabled. %{linkStart}Learn more.%{linkEnd}"
-msgstr ""
-
msgid "SecurityApprovals|Coverage-Check"
msgstr ""
@@ -29568,24 +29980,18 @@ msgstr ""
msgid "SecurityApprovals|Learn more about Vulnerability-Check"
msgstr ""
-msgid "SecurityApprovals|License Scanning must be enabled. %{linkStart}Learn more%{linkEnd}."
-msgstr ""
-
msgid "SecurityApprovals|License-Check"
msgstr ""
msgid "SecurityApprovals|Requires approval for Denied licenses. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}More information%{linkEnd}"
+msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "SecurityApprovals|Requires approval for vulnerabilities. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
-msgid "SecurityApprovals|Test coverage must be enabled. %{linkStart}Learn more%{linkEnd}."
-msgstr ""
-
msgid "SecurityApprovals|Vulnerability-Check"
msgstr ""
@@ -29649,6 +30055,12 @@ msgstr ""
msgid "SecurityConfiguration|Immediately begin risk analysis and remediation with application security features. Start with SAST and Secret Detection, available to all plans. Upgrade to Ultimate to get all features, including:"
msgstr ""
+msgid "SecurityConfiguration|Manage corpus"
+msgstr ""
+
+msgid "SecurityConfiguration|Manage corpus files used as mutation sources in coverage fuzzing."
+msgstr ""
+
msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
msgstr ""
@@ -29703,6 +30115,12 @@ msgstr ""
msgid "SecurityOrchestration|Action"
msgstr ""
+msgid "SecurityOrchestration|Actions"
+msgstr ""
+
+msgid "SecurityOrchestration|Add rule"
+msgstr ""
+
msgid "SecurityOrchestration|All policies"
msgstr ""
@@ -29736,9 +30154,6 @@ msgstr ""
msgid "SecurityOrchestration|Network"
msgstr ""
-msgid "SecurityOrchestration|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
-msgstr ""
-
msgid "SecurityOrchestration|New policy"
msgstr ""
@@ -29754,6 +30169,9 @@ msgstr ""
msgid "SecurityOrchestration|Policy editor"
msgstr ""
+msgid "SecurityOrchestration|Policy preview"
+msgstr ""
+
msgid "SecurityOrchestration|Policy status"
msgstr ""
@@ -29763,6 +30181,9 @@ msgstr ""
msgid "SecurityOrchestration|Rule"
msgstr ""
+msgid "SecurityOrchestration|Rules"
+msgstr ""
+
msgid "SecurityOrchestration|Scan Execution"
msgstr ""
@@ -29856,6 +30277,9 @@ msgstr ""
msgid "SecurityReports|Create issue"
msgstr ""
+msgid "SecurityReports|Development vulnerabilities"
+msgstr ""
+
msgid "SecurityReports|Dismiss vulnerability"
msgstr ""
@@ -29871,6 +30295,9 @@ msgstr ""
msgid "SecurityReports|Download results"
msgstr ""
+msgid "SecurityReports|Download scanned URLs"
+msgstr ""
+
msgid "SecurityReports|Download scanned resources"
msgstr ""
@@ -29994,6 +30421,9 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
+msgid "SecurityReports|The Vulnerability Report shows the results of the lastest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "SecurityReports|The security reports below contain one or more vulnerability findings that could not be parsed and were not recorded. Download the artifacts in the job output to investigate. Ensure any security report created conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
msgstr ""
@@ -30135,10 +30565,10 @@ msgstr ""
msgid "Select a repository"
msgstr ""
-msgid "Select a role"
+msgid "Select a repository containing templates for common files."
msgstr ""
-msgid "Select a shared template repository for all projects on this instance."
+msgid "Select a role"
msgstr ""
msgid "Select a template repository"
@@ -30216,6 +30646,9 @@ msgstr ""
msgid "Select project to choose zone"
msgstr ""
+msgid "Select project to create issue"
+msgstr ""
+
msgid "Select projects"
msgstr ""
@@ -30333,6 +30766,9 @@ msgstr ""
msgid "Send emails to help guide new users through the onboarding process."
msgstr ""
+msgid "Send emails to users upon account deactivation."
+msgstr ""
+
msgid "Send message"
msgstr ""
@@ -30351,6 +30787,9 @@ msgstr ""
msgid "Send service data"
msgstr ""
+msgid "Sentry"
+msgstr ""
+
msgid "Sentry API URL"
msgstr ""
@@ -30465,6 +30904,9 @@ msgstr ""
msgid "Service"
msgstr ""
+msgid "Service Accounts keys are required to authorize GitLab to deploy your Google Cloud project."
+msgstr ""
+
msgid "Service Desk"
msgstr ""
@@ -30537,15 +30979,15 @@ msgstr ""
msgid "Set a password on your account to pull or push via %{protocol}."
msgstr ""
-msgid "Set a template repository for projects in this group"
-msgstr ""
-
msgid "Set access permissions for this token."
msgstr ""
msgid "Set an instance-wide domain that will be available to all clusters when installing Knative."
msgstr ""
+msgid "Set any rate limit to %{code_open}0%{code_close} to disable the limit."
+msgstr ""
+
msgid "Set default and restrict visibility levels. Configure import sources and git access protocol."
msgstr ""
@@ -30558,7 +31000,7 @@ msgstr ""
msgid "Set limit to 0 to allow any file size."
msgstr ""
-msgid "Set max session time for web terminal."
+msgid "Set limits for web and API requests."
msgstr ""
msgid "Set milestone"
@@ -30567,15 +31009,18 @@ msgstr ""
msgid "Set new password"
msgstr ""
-msgid "Set notification email for abuse reports."
+msgid "Set parent epic to an epic"
msgstr ""
-msgid "Set parent epic to an epic"
+msgid "Set per-user rate limits for imports and exports of projects and groups."
msgstr ""
msgid "Set projects and maximum size limits, session duration, user options, and check feature availability for namespace plan."
msgstr ""
+msgid "Set rate limits for package registry API requests that supersede the general user and IP rate limits."
+msgstr ""
+
msgid "Set severity"
msgstr ""
@@ -30594,15 +31039,24 @@ msgstr ""
msgid "Set the default branch for this project. All merge requests and commits are made against this branch unless you specify a different one."
msgstr ""
+msgid "Set the default expiration time for job artifacts in all projects. Set to %{code_open}0%{code_close} to never expire artifacts by default. If no unit is written, it defaults to seconds. For example, these are all equivalent: %{code_open}3600%{code_close}, %{code_open}60 minutes%{code_close}, or %{code_open}one hour%{code_close}."
+msgstr ""
+
msgid "Set the due date to %{due_date}."
msgstr ""
msgid "Set the iteration to %{iteration_reference}."
msgstr ""
+msgid "Set the maximum session time for a web terminal."
+msgstr ""
+
msgid "Set the milestone to %{milestone_reference}."
msgstr ""
+msgid "Set the per-user rate limit for notes created by web or API requests."
+msgstr ""
+
msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
msgstr ""
@@ -30804,6 +31258,9 @@ msgstr ""
msgid "Show Pipeline IID"
msgstr ""
+msgid "Show all %{issuable_type}."
+msgstr ""
+
msgid "Show all activity"
msgstr ""
@@ -30855,15 +31312,9 @@ msgstr ""
msgid "Show list"
msgstr ""
-msgid "Show me advanced features"
-msgstr ""
-
msgid "Show me how to add a pipeline"
msgstr ""
-msgid "Show me the basics"
-msgstr ""
-
msgid "Show one file at a time"
msgstr ""
@@ -30904,15 +31355,15 @@ msgstr ""
msgid "Showing %{pageSize} of %{total} %{issuableType}"
msgstr ""
-msgid "Showing %{pageSize} of %{total} issues"
-msgstr ""
-
msgid "Showing all epics"
msgstr ""
msgid "Showing all issues"
msgstr ""
+msgid "Showing data for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
+msgstr ""
+
msgid "Showing data for workflow items created in this date range. Date range cannot exceed %{maxDateRange} days."
msgstr ""
@@ -30952,6 +31403,15 @@ msgstr ""
msgid "Sidebar|Weight"
msgstr ""
+msgid "Sidekiq job compression threshold (bytes)"
+msgstr ""
+
+msgid "Sidekiq job size limit (bytes)"
+msgstr ""
+
+msgid "Sidekiq job size limits"
+msgstr ""
+
msgid "Sign in"
msgstr ""
@@ -31072,6 +31532,9 @@ msgstr ""
msgid "Site profile not found for given parameters"
msgstr ""
+msgid "Sites"
+msgstr ""
+
msgid "Size"
msgstr ""
@@ -31102,19 +31565,22 @@ msgstr ""
msgid "SlackIntegration|Sends notifications about project events to Slack channels."
msgstr ""
-msgid "SlackService|2. Paste the %{strong_open}Token%{strong_close} into the field below"
+msgid "SlackService|1. %{slash_command_link_start}Add a slash command%{slash_command_link_end} in your Slack team using this information:"
msgstr ""
-msgid "SlackService|3. Select the %{strong_open}Active%{strong_close} checkbox, press %{strong_open}Save changes%{strong_close} and start using GitLab inside Slack!"
+msgid "SlackService|2. Paste the token from Slack in the %{strong_open}Token%{strong_close} field below."
msgstr ""
-msgid "SlackService|Fill in the word that works best for your team."
+msgid "SlackService|3. Select the %{strong_open}Active%{strong_close} checkbox, select %{strong_open}Save changes%{strong_close}, and start using slash commands in Slack!"
+msgstr ""
+
+msgid "SlackService|After setup, get a list of available Slack slash commands by entering"
msgstr ""
-msgid "SlackService|See list of available commands in Slack after setting up this service, by entering"
+msgid "SlackService|Fill in the word that works best for your team."
msgstr ""
-msgid "SlackService|This service allows users to perform common operations on this project by entering slash commands in Slack."
+msgid "SlackService|Perform common operations in this project by entering slash commands in Slack."
msgstr ""
msgid "Slice multiplier"
@@ -31180,7 +31646,7 @@ msgstr ""
msgid "Some child epics may be hidden due to applied filters"
msgstr ""
-msgid "Some common domains are not allowed. %{read_more_link}."
+msgid "Some common domains are not allowed. %{learn_more_link}."
msgstr ""
msgid "Some of the designs you tried uploading did not change:"
@@ -31264,9 +31730,6 @@ msgstr ""
msgid "Something went wrong while exporting requirements"
msgstr ""
-msgid "Something went wrong while fetching %{listType} list"
-msgstr ""
-
msgid "Something went wrong while fetching branches"
msgstr ""
@@ -31321,15 +31784,9 @@ msgstr ""
msgid "Something went wrong while merging this merge request. Please try again."
msgstr ""
-msgid "Something went wrong while moving issues."
-msgstr ""
-
msgid "Something went wrong while obtaining the Let's Encrypt certificate."
msgstr ""
-msgid "Something went wrong while performing the action."
-msgstr ""
-
msgid "Something went wrong while promoting the issue to an epic. Please try again."
msgstr ""
@@ -31657,7 +32114,10 @@ msgstr ""
msgid "SourcegraphPreferences|Uses a custom %{linkStart}Sourcegraph instance%{linkEnd}."
msgstr ""
-msgid "Spam Check API Key"
+msgid "Spam Check"
+msgstr ""
+
+msgid "Spam Check API key"
msgstr ""
msgid "Spam Logs"
@@ -31675,7 +32135,7 @@ msgstr ""
msgid "Specified URL cannot be used: \"%{reason}\""
msgstr ""
-msgid "Specify an e-mail address regex pattern to identify default internal users."
+msgid "Specify an email address regex pattern to identify default internal users."
msgstr ""
msgid "Speed up your pipelines with Needs relationships"
@@ -31930,7 +32390,7 @@ msgstr ""
msgid "StatusCheck|An error occurred fetching the status checks."
msgstr ""
-msgid "StatusCheck|Apply this status check to any branch or a specific protected branch."
+msgid "StatusCheck|Apply this status check to all branches or a specific protected branch."
msgstr ""
msgid "StatusCheck|Check for a status response in Merge Requests. Failures do not block merges. %{link_start}Learn more%{link_end}."
@@ -32269,6 +32729,9 @@ msgstr ""
msgid "Subscriptions"
msgstr ""
+msgid "Subscription|Your subscription for %{strong}%{namespace_name}%{strong_close} has expired and you are now on %{pricing_link_start}the GitLab Free tier%{pricing_link_end}. Don't worry, your data is safe. Get in touch with our support team (%{support_email}). They'll gladly help with your subscription renewal."
+msgstr ""
+
msgid "Subtracted"
msgstr ""
@@ -32497,6 +32960,9 @@ msgstr ""
msgid "SuperSonics|Plan"
msgstr ""
+msgid "SuperSonics|Please agree to the Subscription Agreement"
+msgstr ""
+
msgid "SuperSonics|Ready to get started? A GitLab plan is ideal for scaling organizations and for multi team usage."
msgstr ""
@@ -32527,6 +32993,9 @@ msgstr ""
msgid "SuperSonics|The activation code is not valid. Please make sure to copy it exactly from the Customers Portal or confirmation email. Learn more about %{linkStart}activating your subscription%{linkEnd}."
msgstr ""
+msgid "SuperSonics|The activation code should be a 24-character alphanumeric string"
+msgstr ""
+
msgid "SuperSonics|There is a connectivity issue."
msgstr ""
@@ -32569,9 +33038,15 @@ msgstr ""
msgid "SuperSonics|You do not have an active subscription"
msgstr ""
+msgid "SuperSonics|You have successfully added a license that activates on %{date}. Please see the subscription history table below for more details."
+msgstr ""
+
msgid "SuperSonics|You'll be charged for %{trueUpLinkStart}users over license%{trueUpLinkEnd} on a quarterly or annual basis, depending on the terms of your agreement."
msgstr ""
+msgid "SuperSonics|Your future dated license was successfully added"
+msgstr ""
+
msgid "SuperSonics|Your subscription"
msgstr ""
@@ -32824,7 +33299,7 @@ msgstr ""
msgid "Template to append to all Service Desk issues"
msgstr ""
-msgid "TemplateRepository|Select a repository to make its templates available to all projects. %{link_start}What should the repository contain?%{link_end} "
+msgid "TemplateRepository|Create common files more quickly, and standardize their format."
msgstr ""
msgid "Templates"
@@ -33030,7 +33505,7 @@ msgstr ""
msgid "TestCases|Search test cases"
msgstr ""
-msgid "TestCases|Something went wrong while adding test case to Todo."
+msgid "TestCases|Something went wrong while adding test case to a to-do item."
msgstr ""
msgid "TestCases|Something went wrong while creating a test case."
@@ -33042,7 +33517,7 @@ msgstr ""
msgid "TestCases|Something went wrong while fetching test cases list."
msgstr ""
-msgid "TestCases|Something went wrong while marking test case todo as done."
+msgid "TestCases|Something went wrong while marking test case to-do item as done."
msgstr ""
msgid "TestCases|Something went wrong while moving test case."
@@ -33162,7 +33637,7 @@ msgstr ""
msgid "Thanks for your purchase!"
msgstr ""
-msgid "That is ok, I do not want to renew"
+msgid "That's OK, I don't want to renew"
msgstr ""
msgid "That's it, well done!"
@@ -33185,7 +33660,7 @@ msgid_plural "The %{type} contains the following errors:"
msgstr[0] ""
msgstr[1] ""
-msgid "The API key used by GitLab for accessing the Spam Check service endpoint"
+msgid "The API key used by GitLab for accessing the Spam Check service endpoint."
msgstr ""
msgid "The GitLab subscription service (customers.gitlab.com) is currently experiencing an outage. You can monitor the status and get updates at %{linkStart}status.gitlab.com%{linkEnd}."
@@ -33224,9 +33699,6 @@ msgstr ""
msgid "The URL to use for connecting to Elasticsearch. Use a comma-separated list to support clustering (e.g., \"http://localhost:9200, http://localhost:9201\")."
msgstr ""
-msgid "The Vulnerability Report shows the results of the last successful pipeline run on the default branch."
-msgstr ""
-
msgid "The X509 Certificate to use when mutual TLS is required to communicate with the external authorization service. If left blank, the server certificate is still validated when accessing over HTTPS."
msgstr ""
@@ -33284,9 +33756,6 @@ msgstr ""
msgid "The default branch for this project has been changed. Please update your bookmarks."
msgstr ""
-msgid "The default expiration time for job artifacts. 0 for unlimited. The default unit is in seconds, but you can use other units, for example %{code_open}4 mins 2 sec%{code_close}, %{code_open}2h42min%{code_close}."
-msgstr ""
-
msgid "The dependency list details information about the components used within your project."
msgstr ""
@@ -33478,9 +33947,6 @@ msgstr ""
msgid "The merge conflicts for this merge request have already been resolved. Please return to the merge request."
msgstr ""
-msgid "The merge request can now be merged."
-msgstr ""
-
msgid "The metric must be one of %{metrics}."
msgstr ""
@@ -33856,7 +34322,7 @@ msgstr ""
msgid "There was a problem updating the keep latest artifacts setting."
msgstr ""
-msgid "There was an error %{message} todo."
+msgid "There was an error %{message} to-do item."
msgstr ""
msgid "There was an error adding a To Do."
@@ -33895,6 +34361,9 @@ msgstr ""
msgid "There was an error fetching projects"
msgstr ""
+msgid "There was an error fetching search autocomplete suggestions"
+msgstr ""
+
msgid "There was an error fetching stage total counts"
msgstr ""
@@ -34219,6 +34688,9 @@ msgstr ""
msgid "This field is required."
msgstr ""
+msgid "This form is disabled in preview"
+msgstr ""
+
msgid "This group"
msgstr ""
@@ -34240,9 +34712,6 @@ msgstr ""
msgid "This group is linked to a subscription"
msgstr ""
-msgid "This group, including all subgroups, projects and git repositories, will be reachable from only the specified IP address ranges."
-msgstr ""
-
msgid "This group, its subgroups and projects has been scheduled for removal on %{date}."
msgstr ""
@@ -34522,9 +34991,6 @@ msgstr ""
msgid "This user cannot be unlocked manually from GitLab"
msgstr ""
-msgid "This user does not have a pending request"
-msgstr ""
-
msgid "This user has an unconfirmed email address (%{email}). You may force a confirmation."
msgstr ""
@@ -34633,9 +35099,6 @@ msgstr ""
msgid "ThreatMonitoring|Packet Activity"
msgstr ""
-msgid "ThreatMonitoring|Policies"
-msgstr ""
-
msgid "ThreatMonitoring|Requests"
msgstr ""
@@ -34687,6 +35150,12 @@ msgstr ""
msgid "ThreatMonitoring|View documentation"
msgstr ""
+msgid "Threshold in bytes at which to compress Sidekiq job arguments."
+msgstr ""
+
+msgid "Threshold in bytes at which to reject Sidekiq jobs. Set this to 0 to if you don't want to limit Sidekiq jobs."
+msgstr ""
+
msgid "Throughput"
msgstr ""
@@ -34696,6 +35165,9 @@ msgstr ""
msgid "Time"
msgstr ""
+msgid "Time (in hours) that users are allowed to skip forced configuration of two-factor authentication."
+msgstr ""
+
msgid "Time Spent"
msgstr ""
@@ -34762,7 +35234,7 @@ msgstr ""
msgid "TimeTrackingEstimated|Est"
msgstr ""
-msgid "TimeTracking|%{startTag}Spent: %{endTag}%{timeSpentHumanReadable}"
+msgid "TimeTracking|%{spentStart}Spent: %{spentEnd}"
msgstr ""
msgid "TimeTracking|Estimated:"
@@ -34976,6 +35448,9 @@ msgstr ""
msgid "To access this domain create a new DNS record"
msgstr ""
+msgid "To add a custom suffix, set up a Service Desk email address. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "To add an SSH key you need to %{generate_link_start}generate one%{link_end} or use an %{existing_link_start}existing key%{link_end}."
msgstr ""
@@ -34997,13 +35472,16 @@ msgstr ""
msgid "To connect an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To continue using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
+msgstr ""
+
msgid "To continue, you need to select the link in the confirmation email we sent to verify your email address. If you didn't get our email, select %{strongStart}Resend confirmation email.%{strongEnd}"
msgstr ""
msgid "To define internal users, first enable new users set to external"
msgstr ""
-msgid "To enable Registration Features, make sure \"Enable service ping\" is checked."
+msgid "To enable Registration Features, first enable Service Ping."
msgstr ""
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
@@ -35030,7 +35508,7 @@ msgstr ""
msgid "To get started, use the link below to confirm your account."
msgstr ""
-msgid "To help improve GitLab and its user experience, GitLab will periodically collect usage information."
+msgid "To help improve GitLab and its user experience, GitLab periodically collects usage information."
msgstr ""
msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
@@ -35063,7 +35541,7 @@ msgstr ""
msgid "To preserve performance only %{strong_open}%{display_size} of %{real_size}%{strong_close} files are displayed."
msgstr ""
-msgid "To protect this issue's confidentiality, %{forkLink} and set the fork's visibility to private."
+msgid "To protect this issue's confidentiality, %{linkStart}fork this project%{linkEnd} and set the fork's visibility to private."
msgstr ""
msgid "To protect this issue's confidentiality, a private fork of this project was selected."
@@ -35096,12 +35574,15 @@ msgstr ""
msgid "To set up SAML authentication for your group through an identity provider like Azure, Okta, Onelogin, Ping Identity, or your custom SAML 2.0 provider:"
msgstr ""
-msgid "To set up this service:"
+msgid "To set up this integration:"
msgstr ""
msgid "To specify the notification level per project of a group you belong to, you need to visit project page and change notification level there."
msgstr ""
+msgid "To start using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
+msgstr ""
+
msgid "To unsubscribe from this issue, please paste the following link into your browser:"
msgstr ""
@@ -35689,9 +36170,6 @@ msgstr ""
msgid "Unable to fetch branches list, please close the form and try again"
msgstr ""
-msgid "Unable to fetch unscanned projects"
-msgstr ""
-
msgid "Unable to fetch vulnerable projects"
msgstr ""
@@ -35746,6 +36224,15 @@ msgstr ""
msgid "Unable to update this issue at this time."
msgstr ""
+msgid "Unapprove a merge request"
+msgstr ""
+
+msgid "Unapprove the current merge request."
+msgstr ""
+
+msgid "Unapproved the current merge request."
+msgstr ""
+
msgid "Unarchive project"
msgstr ""
@@ -35758,16 +36245,13 @@ msgstr ""
msgid "Unassigned"
msgstr ""
-msgid "Unauthenticated API request rate limit"
-msgstr ""
-
-msgid "Unauthenticated rate limit period in seconds"
+msgid "Unauthenticated API rate limit period in seconds"
msgstr ""
-msgid "Unauthenticated request rate limit"
+msgid "Unauthenticated requests"
msgstr ""
-msgid "Unauthenticated requests"
+msgid "Unauthenticated web rate limit period in seconds"
msgstr ""
msgid "Undo"
@@ -35869,18 +36353,6 @@ msgstr ""
msgid "Unresolved"
msgstr ""
-msgid "UnscannedProjects|15 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|30 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|5 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|60 or more days"
-msgstr ""
-
msgid "Unschedule job"
msgstr ""
@@ -36100,6 +36572,9 @@ msgstr ""
msgid "UsageQuota|%{help_link_start}Shared runners%{help_link_end} are disabled, so there are no limits set on pipeline usage"
msgstr ""
+msgid "UsageQuota|%{linkTitle} help link"
+msgstr ""
+
msgid "UsageQuota|%{percentageLeft} of purchased storage is available"
msgstr ""
@@ -36109,6 +36584,9 @@ msgstr ""
msgid "UsageQuota|Artifacts is a sum of build and pipeline artifacts."
msgstr ""
+msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
+msgstr ""
+
msgid "UsageQuota|Buy additional minutes"
msgstr ""
@@ -36118,9 +36596,21 @@ msgstr ""
msgid "UsageQuota|CI minutes usage by project"
msgstr ""
+msgid "UsageQuota|Code packages and container images."
+msgstr ""
+
msgid "UsageQuota|Current period usage"
msgstr ""
+msgid "UsageQuota|File attachments and smaller design graphics."
+msgstr ""
+
+msgid "UsageQuota|Git repository, managed by the Gitaly service."
+msgstr ""
+
+msgid "UsageQuota|Includes project registry, artifacts, packages, wiki, uploads and other items."
+msgstr ""
+
msgid "UsageQuota|Increase storage temporarily"
msgstr ""
@@ -36139,6 +36629,9 @@ msgstr ""
msgid "UsageQuota|Packages"
msgstr ""
+msgid "UsageQuota|Pipeline artifacts and job artifacts, created with CI/CD."
+msgstr ""
+
msgid "UsageQuota|Pipelines"
msgstr ""
@@ -36157,6 +36650,9 @@ msgstr ""
msgid "UsageQuota|Seats"
msgstr ""
+msgid "UsageQuota|Shared bits of code and text."
+msgstr ""
+
msgid "UsageQuota|Snippets"
msgstr ""
@@ -36166,6 +36662,12 @@ msgstr ""
msgid "UsageQuota|Storage"
msgstr ""
+msgid "UsageQuota|Storage type"
+msgstr ""
+
+msgid "UsageQuota|There is a known issue with Artifact storage where the total could be incorrect for some projects. More details and progress are available in %{warningLinkStart}the epic%{warningLinkEnd}."
+msgstr ""
+
msgid "UsageQuota|This is the total amount of storage used across your projects within this namespace."
msgstr ""
@@ -36205,6 +36707,9 @@ msgstr ""
msgid "UsageQuota|Usage"
msgstr ""
+msgid "UsageQuota|Usage Breakdown"
+msgstr ""
+
msgid "UsageQuota|Usage Quotas"
msgstr ""
@@ -36229,6 +36734,9 @@ msgstr ""
msgid "UsageQuota|Wiki"
msgstr ""
+msgid "UsageQuota|Wiki content."
+msgstr ""
+
msgid "UsageQuota|Wikis"
msgstr ""
@@ -36445,7 +36953,10 @@ msgstr ""
msgid "User Settings"
msgstr ""
-msgid "User and IP Rate Limits"
+msgid "User and IP rate limits"
+msgstr ""
+
+msgid "User does not have a pending request"
msgstr ""
msgid "User identity was successfully created."
@@ -36742,6 +37253,9 @@ msgstr ""
msgid "Users can launch a development environment from a GitLab browser tab when the %{linkStart}Gitpod%{linkEnd} integration is enabled."
msgstr ""
+msgid "Users can reactivate their account by signing in."
+msgstr ""
+
msgid "Users can render diagrams in AsciiDoc, Markdown, reStructuredText, and Textile documents using Kroki."
msgstr ""
@@ -36757,6 +37271,9 @@ msgstr ""
msgid "Users requesting access to"
msgstr ""
+msgid "Users to exclude from the rate limit"
+msgstr ""
+
msgid "Users were successfully added."
msgstr ""
@@ -36778,6 +37295,9 @@ msgstr ""
msgid "UsersSelect|Unassigned"
msgstr ""
+msgid "Uses GitLab as a lightweight alternative to Sentry."
+msgstr ""
+
msgid "Using %{code_start}::%{code_end} denotes a %{link_start}scoped label set%{link_end}"
msgstr ""
@@ -36808,10 +37328,7 @@ msgstr ""
msgid "Value Stream Analytics can help you determine your team’s velocity"
msgstr ""
-msgid "Value Stream Analytics gives an overview of how much time it takes to go from idea to production in your project."
-msgstr ""
-
-msgid "Value may contain a variable reference"
+msgid "Value might contain a variable reference"
msgstr ""
msgid "Value stream"
@@ -36877,10 +37394,10 @@ msgstr ""
msgid "ValueStream|The Default Value Stream cannot be deleted"
msgstr ""
-msgid "Variable"
+msgid "Values that contain the %{codeStart}$%{codeEnd} character can be considered a variable reference and expanded. %{docsLinkStart}Learn more.%{docsLinkEnd}"
msgstr ""
-msgid "Variable references indicated by %{codeStart}$%{codeEnd} may be expanded. If this is not what you want, consider %{docsLinkStart}using a workaround to prevent expansion%{docsLinkEnd}."
+msgid "Variable"
msgstr ""
msgid "Variable will be masked in job logs."
@@ -37285,6 +37802,9 @@ msgstr ""
msgid "Vulnerability|Evidence"
msgstr ""
+msgid "Vulnerability|False positive detected"
+msgstr ""
+
msgid "Vulnerability|File"
msgstr ""
@@ -37327,6 +37847,9 @@ msgstr ""
msgid "Vulnerability|Status"
msgstr ""
+msgid "Vulnerability|The scanner determined this vulnerability to be a false positive. Verify the evaluation before changing its status. %{linkStart}Learn more about false positive detection.%{linkEnd}"
+msgstr ""
+
msgid "Vulnerability|The unmodified response is the original response that had no mutations done to the request"
msgstr ""
@@ -37651,9 +38174,6 @@ msgstr ""
msgid "Welcome to GitLab,%{br_tag}%{name}!"
msgstr ""
-msgid "Welcome to the guided GitLab tour"
-msgstr ""
-
msgid "Welcome, %{name}!"
msgstr ""
@@ -37672,9 +38192,6 @@ msgstr ""
msgid "What are you searching for?"
msgstr ""
-msgid "What describes you best?"
-msgstr ""
-
msgid "What does this command do?"
msgstr ""
@@ -37696,13 +38213,13 @@ msgstr ""
msgid "What is your job title? (optional)"
msgstr ""
-msgid "What will you use this group for?"
+msgid "What templates can I create?"
msgstr ""
-msgid "What's new"
+msgid "What will you use this group for?"
msgstr ""
-msgid "What’s your experience level?"
+msgid "What's new"
msgstr ""
msgid "When a deployment job is successful, skip older deployment jobs that are still pending."
@@ -37714,6 +38231,9 @@ msgstr ""
msgid "When an event in GitLab triggers a webhook, you can use the request details to figure out if something went wrong."
msgstr ""
+msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+msgstr ""
+
msgid "When inactive, an external authentication provider must be used."
msgstr ""
@@ -37737,6 +38257,9 @@ msgstr ""
msgid "When:"
msgstr ""
+msgid "Which API requests are affected?"
+msgstr ""
+
msgid "While it's rare to have no vulnerabilities, it can happen. In any event, we ask that you please double check your settings to make sure you've set up your dashboard correctly."
msgstr ""
@@ -38016,6 +38539,9 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|Work Items"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -38091,6 +38617,9 @@ msgstr ""
msgid "You are already a member of this %{member_source}."
msgstr ""
+msgid "You are already impersonating another user"
+msgstr ""
+
msgid "You are an admin, which means granting access to %{client_name} will allow them to interact with GitLab as an admin as well. Proceed with caution."
msgstr ""
@@ -38193,6 +38722,9 @@ msgstr ""
msgid "You can also use project access tokens with Git to authenticate over HTTP(S). %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "You can always change your URL later"
+msgstr ""
+
msgid "You can always edit this later"
msgstr ""
@@ -38349,10 +38881,10 @@ msgstr ""
msgid "You can’t %{tag_start}edit%{tag_end} files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
-msgid "You could not create a new trigger."
+msgid "You can’t edit files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
-msgid "You didn't renew your subscription for %{strong}%{namespace_name}%{strong_close} so it was downgraded to the free plan."
+msgid "You could not create a new trigger."
msgstr ""
msgid "You do not have any subscriptions yet"
@@ -38520,6 +39052,12 @@ msgstr ""
msgid "You must provide your current password in order to change it."
msgstr ""
+msgid "You must sign in to search for specific projects."
+msgstr ""
+
+msgid "You must sign in to search for specific terms."
+msgstr ""
+
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
@@ -38547,6 +39085,9 @@ msgstr ""
msgid "You need to upload a GitLab project export archive (ending in .gz)."
msgstr ""
+msgid "You need to verify your primary email first before enabling Two-Factor Authentication."
+msgstr ""
+
msgid "You successfully declined the invitation"
msgstr ""
@@ -38655,10 +39196,10 @@ msgstr ""
msgid "Your %{host} account was signed in to from a new location"
msgstr ""
-msgid "Your %{strong}%{plan_name}%{strong_close} subscription for %{strong}%{namespace_name}%{strong_close} will expire on %{strong}%{expires_on}%{strong_close}."
+msgid "Your %{strong}%{plan_name}%{strong_close} subscription expires on %{strong}%{expires_on}%{strong_close}. After that date, you cannot create issues or merge requests, or use many other features."
msgstr ""
-msgid "Your %{strong}%{plan_name}%{strong_close} subscription will expire on %{strong}%{expires_on}%{strong_close}. After that, you will not be able to create issues or merge requests as well as many other features."
+msgid "Your %{strong}%{plan_name}%{strong_close} subscription for %{strong}%{namespace_name}%{strong_close} will expire on %{strong}%{expires_on}%{strong_close}."
msgstr ""
msgid "Your CI/CD configuration syntax is invalid. View Lint tab for more details."
@@ -38682,7 +39223,7 @@ msgstr ""
msgid "Your GPG keys (%{count})"
msgstr ""
-msgid "Your GitLab account has been locked due to an excessive amount of unsuccessful sign in attempts. Your account will automatically unlock in %{duration} or you may click the link below to unlock now."
+msgid "Your GitLab account has been locked due to an excessive number of unsuccessful sign in attempts. You can wait for your account to automatically unlock in %{duration} or you can click the link below to unlock now."
msgstr ""
msgid "Your GitLab account request has been approved!"
@@ -38793,6 +39334,9 @@ msgstr ""
msgid "Your commit email is used for web based operations, such as edits and merges."
msgstr ""
+msgid "Your current password is required to register a two-factor authenticator app."
+msgstr ""
+
msgid "Your dashboard has been copied. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
@@ -38892,6 +39436,9 @@ msgstr ""
msgid "Your project limit is %{limit} projects! Please contact your administrator to increase it"
msgstr ""
+msgid "Your project will be created at:"
+msgstr ""
+
msgid "Your projects"
msgstr ""
@@ -38931,11 +39478,10 @@ msgstr ""
msgid "Your subscription expired!"
msgstr ""
-msgid "Your subscription has been downgraded."
-msgstr ""
-
-msgid "Your subscription will expire in %{remaining_days}."
-msgstr ""
+msgid "Your subscription will expire in %{remaining_days} day."
+msgid_plural "Your subscription will expire in %{remaining_days} days."
+msgstr[0] ""
+msgstr[1] ""
msgid "Your username is %{username}."
msgstr ""
@@ -39142,6 +39688,9 @@ msgstr ""
msgid "cannot merge"
msgstr ""
+msgid "cannot not be used for user namespace"
+msgstr ""
+
msgid "ciReport|%{degradedNum} degraded"
msgstr ""
@@ -39465,6 +40014,9 @@ msgstr ""
msgid "created %{timeAgo}"
msgstr ""
+msgid "created %{timeAgo} by %{author}"
+msgstr ""
+
msgid "created by"
msgstr ""
@@ -39509,9 +40061,6 @@ msgstr ""
msgid "does not have a supported extension. Only %{extension_list} are supported"
msgstr ""
-msgid "domain is not authorized for sign-up."
-msgstr ""
-
msgid "download it"
msgstr ""
@@ -39529,18 +40078,13 @@ msgstr ""
msgid "email '%{email}' is not a verified email."
msgstr ""
-msgid "email does not match the allowed domain of %{email_domains}"
-msgid_plural "email does not match the allowed domains: %{email_domains}"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "enabled"
msgstr ""
msgid "encrypted: needs to be a :required, :optional or :migrating!"
msgstr ""
-msgid "ending with MIME type format is not allowed."
+msgid "ending with a reserved file extension is not allowed."
msgstr ""
msgid "entries cannot be larger than 255 characters"
@@ -39564,6 +40108,9 @@ msgstr ""
msgid "estimateCommand|%{slash_command} overwrites the total estimated time."
msgstr ""
+msgid "example.com"
+msgstr ""
+
msgid "exceeds the limit of %{bytes} bytes"
msgstr ""
@@ -39614,9 +40161,6 @@ msgstr ""
msgid "fork"
msgstr ""
-msgid "fork this project"
-msgstr ""
-
msgid "from"
msgstr ""
@@ -39625,6 +40169,9 @@ msgid_plural "from %d jobs"
msgstr[0] ""
msgstr[1] ""
+msgid "frontmatter"
+msgstr ""
+
msgid "group"
msgstr ""
@@ -39652,6 +40199,9 @@ msgstr ""
msgid "has been completed."
msgstr ""
+msgid "has too deep level of nesting"
+msgstr ""
+
msgid "help"
msgstr ""
@@ -39685,9 +40235,21 @@ msgstr ""
msgid "in"
msgstr ""
+msgid "in Infrastructure :: Kubernetes clusters"
+msgstr ""
+
+msgid "in all GitLab"
+msgstr ""
+
+msgid "in group"
+msgstr ""
+
msgid "in group %{link_to_group}"
msgstr ""
+msgid "in project"
+msgstr ""
+
msgid "in project %{link_to_project}"
msgstr ""
@@ -39729,16 +40291,19 @@ msgstr ""
msgid "is not a valid X509 certificate."
msgstr ""
-msgid "is not allowed since the group is not top-level group."
+msgid "is not allowed for sign-up."
msgstr ""
-msgid "is not allowed. Try again with a different email address, or contact your GitLab admin."
+msgid "is not allowed for this group."
msgstr ""
-msgid "is not allowed. We do not currently support project-level iterations"
+msgid "is not allowed for this project."
+msgstr ""
+
+msgid "is not allowed since the group is not top-level group."
msgstr ""
-msgid "is not from an allowed domain."
+msgid "is not allowed. We do not currently support project-level iterations"
msgstr ""
msgid "is not in the group enforcing Group Managed Account"
@@ -39831,6 +40396,9 @@ msgstr ""
msgid "log in"
msgstr ""
+msgid "managed"
+msgstr ""
+
msgid "manual"
msgstr ""
@@ -39878,6 +40446,9 @@ msgstr ""
msgid "mrWidget| Please restore it or use a different %{missingBranchName} branch"
msgstr ""
+msgid "mrWidget|%{linkStart}Set up now%{linkEnd} to analyze your source code for known security vulnerabilities."
+msgstr ""
+
msgid "mrWidget|%{mergeError}."
msgstr ""
@@ -39958,6 +40529,9 @@ msgid_plural "mrWidget|Closes issues"
msgstr[0] ""
msgstr[1] ""
+msgid "mrWidget|Create issue to resolve all threads"
+msgstr ""
+
msgid "mrWidget|Delete source branch"
msgstr ""
@@ -39967,12 +40541,18 @@ msgstr ""
msgid "mrWidget|Did not close"
msgstr ""
+msgid "mrWidget|Dismiss"
+msgstr ""
+
msgid "mrWidget|Email patches"
msgstr ""
msgid "mrWidget|Failed to load deployment statistics"
msgstr ""
+msgid "mrWidget|Hide %{widget} details"
+msgstr ""
+
msgid "mrWidget|If the %{missingBranchName} branch exists in your local repository, you can merge this merge request manually using the command line"
msgstr ""
@@ -40068,9 +40648,6 @@ msgstr ""
msgid "mrWidget|Request to merge"
msgstr ""
-msgid "mrWidget|Resolve all threads in new issue"
-msgstr ""
-
msgid "mrWidget|Resolve conflicts"
msgstr ""
@@ -40086,6 +40663,9 @@ msgstr ""
msgid "mrWidget|Revoke approval"
msgstr ""
+msgid "mrWidget|SAST and Secret Detection is not enabled."
+msgstr ""
+
msgid "mrWidget|Set by %{merge_author} to be added to the merge train when the pipeline succeeds"
msgstr ""
@@ -40095,6 +40675,9 @@ msgstr ""
msgid "mrWidget|Set by %{merge_author} to start a merge train when the pipeline succeeds"
msgstr ""
+msgid "mrWidget|Show %{widget} details"
+msgstr ""
+
msgid "mrWidget|The changes were merged into"
msgstr ""
@@ -40107,6 +40690,9 @@ msgstr ""
msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure, or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
msgstr ""
+msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure."
+msgstr ""
+
msgid "mrWidget|The source branch has been deleted"
msgstr ""
@@ -40149,6 +40735,9 @@ msgstr ""
msgid "mrWidget|You can merge after removing denied licenses"
msgstr ""
+msgid "mrWidget|You can only merge once this merge request is approved."
+msgstr ""
+
msgid "mrWidget|Your password"
msgstr ""
@@ -40185,6 +40774,9 @@ msgstr ""
msgid "must be less than the limit of %{tag_limit} tags"
msgstr ""
+msgid "must be set for a project namespace"
+msgstr ""
+
msgid "must be unique by status and elapsed time within a policy"
msgstr ""
@@ -40294,6 +40886,9 @@ msgstr ""
msgid "pipeline"
msgstr ""
+msgid "pipeline schedules documentation"
+msgstr ""
+
msgid "pod_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
msgstr ""
@@ -40343,16 +40938,25 @@ msgstr ""
msgid "project name"
msgstr ""
+msgid "project namespace cannot be the parent of another namespace"
+msgstr ""
+
msgid "projects"
msgstr ""
msgid "quick actions"
msgstr ""
-msgid "reCAPTCHA Private Key"
+msgid "reCAPTCHA"
+msgstr ""
+
+msgid "reCAPTCHA helps prevent credential stuffing."
msgstr ""
-msgid "reCAPTCHA Site Key"
+msgid "reCAPTCHA private key"
+msgstr ""
+
+msgid "reCAPTCHA site key"
msgstr ""
msgid "recent activity"
@@ -40579,6 +41183,9 @@ msgstr ""
msgid "user avatar"
msgstr ""
+msgid "user namespace cannot be the parent of another namespace"
+msgstr ""
+
msgid "user preferences"
msgstr ""
@@ -40671,3 +41278,9 @@ msgstr ""
msgid "your settings"
msgstr ""
+msgid "{group}"
+msgstr ""
+
+msgid "{project}"
+msgstr ""
+
diff --git a/locale/hy_AM/gitlab.po b/locale/hy_AM/gitlab.po
index 1d476cf73ba..5219d91bbfe 100644
--- a/locale/hy_AM/gitlab.po
+++ b/locale/hy_AM/gitlab.po
@@ -14,10 +14,7 @@ msgstr ""
"X-Crowdin-Language: hy-AM\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-09-01 22:33\n"
-
-msgid " %{name}, confirm your email address now! "
-msgstr ""
+"PO-Revision-Date: 2021-10-04 20:21\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -92,6 +89,16 @@ msgstr ""
msgid "#general, #development"
msgstr ""
+msgid "%d Alert"
+msgid_plural "%d Alerts"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d Alert:"
+msgid_plural "%d Alerts:"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d Approval"
msgid_plural "%d Approvals"
msgstr[0] ""
@@ -455,7 +462,10 @@ msgstr ""
msgid "%{code_open}Protected:%{code_close} Only exposed to protected branches or tags."
msgstr ""
-msgid "%{commit_author_link} authored %{commit_timeago}"
+msgid "%{commit_author_link} authored %{commit_authored_timeago}"
+msgstr ""
+
+msgid "%{commit_author_link} authored %{commit_authored_timeago} and %{commit_committer_avatar} %{commit_committer_link} committed %{commit_committer_timeago}"
msgstr ""
msgid "%{completedCount} completed weight"
@@ -549,6 +559,15 @@ msgstr ""
msgid "%{doc_link_start}Advanced search%{doc_link_end} is enabled."
msgstr ""
+msgid "%{docs_link_start}Learn about visibility levels.%{docs_link_end}"
+msgstr ""
+
+msgid "%{docs_link_start}What is Large File Storage?%{docs_link_end}"
+msgstr ""
+
+msgid "%{docs_link_start}What is two-factor authentication?%{docs_link_end}"
+msgstr ""
+
msgid "%{due_date} (Past due)"
msgstr ""
@@ -621,9 +640,6 @@ msgstr ""
msgid "%{issueType} actions"
msgstr ""
-msgid "%{issuesCount} issues with a limit of %{maxIssueCount}"
-msgstr ""
-
msgid "%{issuesSize} with a limit of %{maxIssueCount}"
msgstr ""
@@ -681,6 +697,12 @@ msgstr ""
msgid "%{label_for_message} unavailable"
msgstr ""
+msgid "%{learn_more_link}."
+msgstr ""
+
+msgid "%{lessThan} 1 hour"
+msgstr ""
+
msgid "%{lets_encrypt_link_start}Let's Encrypt%{lets_encrypt_link_end} is a free, automated, and open certificate authority (CA) that issues digital certificates to enable HTTPS (SSL/TLS) for sites."
msgstr ""
@@ -693,15 +715,15 @@ msgstr ""
msgid "%{link_start}Learn more%{link_end} about roles."
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
-msgstr ""
-
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
msgstr ""
msgid "%{link_start}Start the title with %{draft_snippet}%{link_end} to prevent a merge request that is a work in progress from being merged before it's ready."
msgstr ""
+msgid "%{link_start}What information does GitLab Inc. collect?%{link_end}"
+msgstr ""
+
msgid "%{listToShow}, and %{awardsListLength} more"
msgstr ""
@@ -854,7 +876,7 @@ msgid_plural "%{securityScanner} results are not available because a pipeline ha
msgstr[0] ""
msgstr[1] ""
-msgid "%{service_ping_link_start}Learn more%{service_ping_link_end} about what information is shared with GitLab Inc."
+msgid "%{service_ping_link_start}What information is shared with GitLab Inc.?%{service_ping_link_end}"
msgstr ""
msgid "%{size} %{unit}"
@@ -890,6 +912,9 @@ msgstr ""
msgid "%{state} epics"
msgstr ""
+msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
+msgstr ""
+
msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
msgstr ""
@@ -949,11 +974,6 @@ msgstr ""
msgid "%{template_project_id} is unknown or invalid"
msgstr ""
-msgid "%{text} %{files}"
-msgid_plural "%{text} %{files} files"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%{text} is available"
msgstr ""
@@ -1038,9 +1058,6 @@ msgstr ""
msgid "%{wildcards_link_start}Wildcards%{wildcards_link_end} such as %{code_tag_start}v*%{code_tag_end} or %{code_tag_start}*-release%{code_tag_end} are supported."
msgstr ""
-msgid "&lt; 1 hour"
-msgstr ""
-
msgid "'%{data}' at %{location} does not match format: %{format}"
msgstr ""
@@ -1124,9 +1141,6 @@ msgstr ""
msgid "(we need your current password to confirm your changes)"
msgstr ""
-msgid "* * * * *"
-msgstr ""
-
msgid "+ %{amount} more"
msgstr ""
@@ -1193,10 +1207,10 @@ msgstr ""
msgid "."
msgstr ""
-msgid "0 bytes"
+msgid "/"
msgstr ""
-msgid "0 for unlimited, only effective with remote storage enabled."
+msgid "0 bytes"
msgstr ""
msgid "0t1DgySidms"
@@ -1326,6 +1340,9 @@ msgstr ""
msgid "1000+"
msgstr ""
+msgid "192.168.0.0/24"
+msgstr ""
+
msgid "1st contribution!"
msgstr ""
@@ -1479,9 +1496,6 @@ msgstr ""
msgid "A plain HTML site that uses Netlify for CI/CD instead of GitLab, but still with all the other great GitLab features"
msgstr ""
-msgid "A plain-text response to show to clients that hit the rate limit."
-msgstr ""
-
msgid "A platform value can be web, mob or app."
msgstr ""
@@ -1563,7 +1577,7 @@ msgstr ""
msgid "APIFuzzing|Configure HTTP basic authentication values. Other authentication methods are supported. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
+msgid "APIFuzzing|Customize your project's API fuzzing configuration options and copy the code snippet to your .gitlab-ci.yml file to apply any changes. Note that this tool does not reflect or update your .gitlab-ci.yml file automatically. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
msgstr ""
msgid "APIFuzzing|Enable authentication"
@@ -1626,9 +1640,6 @@ msgstr ""
msgid "APIFuzzing|To prevent a security leak, authentication info must be added as a %{ciVariablesLinkStart}CI variable%{ciVariablesLinkEnd}. As a user with maintainer access rights, you can manage CI variables in the %{ciSettingsLinkStart}Settings%{ciSettingsLinkEnd} area."
msgstr ""
-msgid "APIFuzzing|Use this tool to generate API fuzzing configuration YAML to copy into your .gitlab-ci.yml file. This tool does not reflect or update your .gitlab-ci.yml file automatically."
-msgstr ""
-
msgid "APIFuzzing|Username for basic authentication"
msgstr ""
@@ -1680,9 +1691,6 @@ msgstr ""
msgid "Abuse reports notification email"
msgstr ""
-msgid "Abuse reports will be sent to this address if it is set. Abuse reports are always available in the admin area."
-msgstr ""
-
msgid "Accept invitation"
msgstr ""
@@ -1719,12 +1727,18 @@ msgstr ""
msgid "Access granted"
msgstr ""
+msgid "Access key ID"
+msgstr ""
+
msgid "Access requests"
msgstr ""
msgid "Access to '%{classification_label}' not allowed"
msgstr ""
+msgid "Access tokens expire after 2 hours. A refresh token may be used at any time to generate a new access token. Non-expiring access tokens are deprecated. Clear this setting to enable backward compatibility."
+msgstr ""
+
msgid "AccessDropdown|Deploy Keys"
msgstr ""
@@ -2037,6 +2051,9 @@ msgstr ""
msgid "Add new directory"
msgstr ""
+msgid "Add new service account"
+msgstr ""
+
msgid "Add or remove previously merged commits"
msgstr ""
@@ -2274,6 +2291,9 @@ msgstr ""
msgid "AdminArea|Features"
msgstr ""
+msgid "AdminArea|Get security updates from GitLab and stay up to date"
+msgstr ""
+
msgid "AdminArea|Groups"
msgstr ""
@@ -2313,6 +2333,12 @@ msgstr ""
msgid "AdminArea|Reporter"
msgstr ""
+msgid "AdminArea|Sign up for the GitLab Security Newsletter to get notified for security updates."
+msgstr ""
+
+msgid "AdminArea|Sign up for the GitLab newsletter"
+msgstr ""
+
msgid "AdminArea|Stop all jobs"
msgstr ""
@@ -2382,9 +2408,15 @@ msgstr ""
msgid "AdminSettings|Disable public access to Pages sites"
msgstr ""
+msgid "AdminSettings|Display a banner on merge requests in projects with no pipelines to initiate steps to add a .gitlab-ci.yml file."
+msgstr ""
+
msgid "AdminSettings|Domain verification is an essential security measure for public GitLab sites. Users are required to demonstrate they control a domain before it is enabled. %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "AdminSettings|Enable pipeline suggestion banner"
+msgstr ""
+
msgid "AdminSettings|Enable shared runners for new projects"
msgstr ""
@@ -2856,10 +2888,10 @@ msgstr ""
msgid "Admin|Quarterly reconciliation will occur on %{qrtlyDate}"
msgstr ""
-msgid "Admin|The number of max seats used for your namespace is currently exceeding the number of seats in your subscription. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgid "Admin|The number of max seats in your namespace exceeds the number of seats in your subscription. On %{qrtlyDate}, quarterly reconciliation occurs and you are automatically billed a prorated amount for the overage. No action is needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice. For more information about the timing of the invoicing process, view the documentation."
msgstr ""
-msgid "Admin|The number of maximum users for your instance is currently exceeding the number of users in license. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgid "Admin|The number of max users in your instance exceeds the number of users in your license. On %{qrtlyDate}, quarterly reconciliation occurs and you are automatically billed a prorated amount for the overage. No action is needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice. For more information about the timing of the invoicing process, view the documentation."
msgstr ""
msgid "Admin|View pending user approvals"
@@ -2880,9 +2912,6 @@ msgstr ""
msgid "Advanced export options"
msgstr ""
-msgid "Advanced permissions, Large File Storage and Two-Factor authentication settings."
-msgstr ""
-
msgid "After a successful password update you will be redirected to login screen."
msgstr ""
@@ -2901,13 +2930,14 @@ msgstr ""
msgid "After you've reviewed these contribution guidelines, you'll be all set to"
msgstr ""
+msgid "Akismet"
+msgstr ""
+
msgid "Akismet API Key"
msgstr ""
-msgid "Alert"
-msgid_plural "Alerts"
-msgstr[0] ""
-msgstr[1] ""
+msgid "Akismet helps prevent the creation of spam issues in public projects."
+msgstr ""
msgid "AlertManagement|Acknowledged"
msgstr ""
@@ -3263,6 +3293,9 @@ msgstr ""
msgid "All (default)"
msgstr ""
+msgid "All GitLab"
+msgstr ""
+
msgid "All Members"
msgstr ""
@@ -3377,6 +3410,9 @@ msgstr ""
msgid "Allow this secondary node to replicate content on Object Storage"
msgstr ""
+msgid "Allow use of licensed EE features"
+msgstr ""
+
msgid "Allow users to dismiss the broadcast message"
msgstr ""
@@ -3452,9 +3488,6 @@ msgstr ""
msgid "Amazon authentication is not %{link_start}correctly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
-msgid "Amount of time (in hours) that users are allowed to skip forced configuration of two-factor authentication"
-msgstr ""
-
msgid "An %{link_start}alert%{link_end} with the same fingerprint is already open. To change the status of this alert, resolve the linked alert."
msgstr ""
@@ -3515,12 +3548,6 @@ msgstr ""
msgid "An error occurred when removing the label."
msgstr ""
-msgid "An error occurred when toggling the notification subscription"
-msgstr ""
-
-msgid "An error occurred when updating the issue weight"
-msgstr ""
-
msgid "An error occurred when updating the title"
msgstr ""
@@ -3569,6 +3596,9 @@ msgstr ""
msgid "An error occurred while enabling Service Desk."
msgstr ""
+msgid "An error occurred while fetching Markdown preview"
+msgstr ""
+
msgid "An error occurred while fetching ancestors"
msgstr ""
@@ -3599,9 +3629,6 @@ msgstr ""
msgid "An error occurred while fetching label colors."
msgstr ""
-msgid "An error occurred while fetching markdown preview"
-msgstr ""
-
msgid "An error occurred while fetching participants"
msgstr ""
@@ -3617,9 +3644,6 @@ msgstr ""
msgid "An error occurred while fetching reference"
msgstr ""
-msgid "An error occurred while fetching sidebar data"
-msgstr ""
-
msgid "An error occurred while fetching tags. Retry the search."
msgstr ""
@@ -3695,6 +3719,9 @@ msgstr ""
msgid "An error occurred while loading merge requests."
msgstr ""
+msgid "An error occurred while loading projects."
+msgstr ""
+
msgid "An error occurred while loading the Needs tab."
msgstr ""
@@ -3929,12 +3956,6 @@ msgstr ""
msgid "Any Milestone"
msgstr ""
-msgid "Any branch"
-msgstr ""
-
-msgid "Any eligible user"
-msgstr ""
-
msgid "Any encrypted tokens"
msgstr ""
@@ -3953,6 +3974,9 @@ msgstr ""
msgid "Any namespace"
msgstr ""
+msgid "App Engine description and apps that are suitable for this deployment target"
+msgstr ""
+
msgid "App ID"
msgstr ""
@@ -4101,6 +4125,11 @@ msgstr ""
msgid "Apply"
msgstr ""
+msgid "Apply %d suggestion"
+msgid_plural "Apply %d suggestions"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Apply a label"
msgstr ""
@@ -4110,13 +4139,10 @@ msgstr ""
msgid "Apply suggestion"
msgstr ""
-msgid "Apply suggestions"
-msgstr ""
-
msgid "Apply template"
msgstr ""
-msgid "Apply this approval rule to any branch or a specific protected branch."
+msgid "Apply this approval rule to all branches or a specific protected branch."
msgstr ""
msgid "Applying"
@@ -4259,9 +4285,6 @@ msgstr ""
msgid "ApprovalSettings|Prevent editing approval rules in projects and merge requests."
msgstr ""
-msgid "ApprovalSettings|Prevent editing approval rules in projects and merge requests. "
-msgstr ""
-
msgid "ApprovalSettings|Remove all approvals when commits are added to the source branch."
msgstr ""
@@ -4277,6 +4300,9 @@ msgstr ""
msgid "ApprovalSettings|This setting is configured at the instance level and can only be changed by an administrator."
msgstr ""
+msgid "ApprovalSettings|This setting is configured in %{groupName} and can only be changed by an administrator or group owner."
+msgstr ""
+
msgid "ApprovalStatusTooltip|Adheres to separation of duties"
msgstr ""
@@ -4763,9 +4789,6 @@ msgstr ""
msgid "Authenticated API rate limit period in seconds"
msgstr ""
-msgid "Authenticated API request rate limit"
-msgstr ""
-
msgid "Authenticated API requests"
msgstr ""
@@ -4775,10 +4798,10 @@ msgstr ""
msgid "Authenticated Git LFS request rate limit"
msgstr ""
-msgid "Authenticated web rate limit period in seconds"
+msgid "Authenticated Git LFS requests"
msgstr ""
-msgid "Authenticated web request rate limit"
+msgid "Authenticated web rate limit period in seconds"
msgstr ""
msgid "Authenticated web requests"
@@ -5156,9 +5179,6 @@ msgstr ""
msgid "Below you will find all the groups that are public."
msgstr ""
-msgid "Beta"
-msgstr ""
-
msgid "Bi-weekly code coverage"
msgstr ""
@@ -5398,6 +5418,21 @@ msgstr ""
msgid "Board scope affects which issues are displayed for anyone who visits this board"
msgstr ""
+msgid "BoardNewEpic|Groups"
+msgstr ""
+
+msgid "BoardNewEpic|Loading groups"
+msgstr ""
+
+msgid "BoardNewEpic|No matching results"
+msgstr ""
+
+msgid "BoardNewEpic|Search groups"
+msgstr ""
+
+msgid "BoardNewEpic|Select a group"
+msgstr ""
+
msgid "BoardNewIssue|No matching results"
msgstr ""
@@ -5475,6 +5510,9 @@ msgstr ""
msgid "Boards|An error occurred while creating the list. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching child groups. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching group projects. Please try again."
msgstr ""
@@ -5807,6 +5845,9 @@ msgstr ""
msgid "Bulk update"
msgstr ""
+msgid "BulkImports|Re-import creates a new group. It does not sync with the existing group."
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -5816,6 +5857,9 @@ msgstr ""
msgid "BulkImport|From source group"
msgstr ""
+msgid "BulkImport|Group import history"
+msgstr ""
+
msgid "BulkImport|Import failed: Destination cannot be a subgroup of the source group. Change the destination and try again."
msgstr ""
@@ -5828,9 +5872,18 @@ msgstr ""
msgid "BulkImport|Importing the group failed"
msgstr ""
+msgid "BulkImport|Last imported to %{link}"
+msgstr ""
+
msgid "BulkImport|Name already exists."
msgstr ""
+msgid "BulkImport|New group"
+msgstr ""
+
+msgid "BulkImport|No history is available"
+msgstr ""
+
msgid "BulkImport|No parent"
msgstr ""
@@ -5843,6 +5896,9 @@ msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} matching filter \"%{filter}\" from %{link}"
msgstr ""
+msgid "BulkImport|Source group"
+msgstr ""
+
msgid "BulkImport|To new group"
msgstr ""
@@ -5852,6 +5908,9 @@ msgstr ""
msgid "BulkImport|You have no groups to import"
msgstr ""
+msgid "BulkImport|Your imported groups will appear here."
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -6094,6 +6153,9 @@ msgstr ""
msgid "Can be manually deployed to"
msgstr ""
+msgid "Can be overridden in each project."
+msgstr ""
+
msgid "Can create groups:"
msgstr ""
@@ -6196,6 +6258,9 @@ msgstr ""
msgid "Cancelling Preview"
msgstr ""
+msgid "Cannot assign a confidential epic to a non-confidential issue. Make the issue confidential and try again"
+msgstr ""
+
msgid "Cannot be assigned to other projects."
msgstr ""
@@ -6247,9 +6312,6 @@ msgstr ""
msgid "Cannot refer to a group %{timebox_type} by an internal id!"
msgstr ""
-msgid "Cannot set confidential epic for a non-confidential issue"
-msgstr ""
-
msgid "Cannot show preview. For previews on sketch files, they must have the file format introduced by Sketch version 43 and above."
msgstr ""
@@ -6487,15 +6549,15 @@ msgstr ""
msgid "Check out, review, and merge locally"
msgstr ""
-msgid "Check the %{docs_link_start}documentation%{docs_link_end}."
-msgstr ""
-
msgid "Check the current instance configuration "
msgstr ""
msgid "Check the elasticsearch.log file to debug why the migration was halted and make any changes before retrying the migration. When you fix the cause of the failure, click \"Retry migration\", and the migration will be scheduled to be retried in the background."
msgstr ""
+msgid "Check with your administrator."
+msgstr ""
+
msgid "Check your Docker images for known vulnerabilities."
msgstr ""
@@ -6526,6 +6588,9 @@ msgstr ""
msgid "Checkout"
msgstr ""
+msgid "Checkout|$%{selectedPlanPrice} per 10 GB storage per pack"
+msgstr ""
+
msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 minutes"
msgstr ""
@@ -6546,17 +6611,23 @@ msgstr ""
msgid "Checkout|%{name}'s GitLab subscription"
msgstr ""
-msgid "Checkout|%{selectedPlanText} plan"
+msgid "Checkout|%{name}'s storage subscription"
msgstr ""
-msgid "Checkout|%{startDate} - %{endDate}"
+msgid "Checkout|%{quantity} GB of storage"
msgstr ""
-msgid "Checkout|%{totalCiMinutes} CI minute"
-msgid_plural "Checkout|%{totalCiMinutes} CI minutes"
+msgid "Checkout|%{quantity} storage pack"
+msgid_plural "Checkout|%{quantity} storage packs"
msgstr[0] ""
msgstr[1] ""
+msgid "Checkout|%{selectedPlanText} plan"
+msgstr ""
+
+msgid "Checkout|%{startDate} - %{endDate}"
+msgstr ""
+
msgid "Checkout|%{totalCiMinutes} CI minutes"
msgstr ""
@@ -6632,6 +6703,9 @@ msgstr ""
msgid "Checkout|Failed to register credit card. Please try again."
msgstr ""
+msgid "Checkout|GB"
+msgstr ""
+
msgid "Checkout|GitLab group"
msgstr ""
@@ -6668,6 +6742,9 @@ msgstr ""
msgid "Checkout|State"
msgstr ""
+msgid "Checkout|Storage packs"
+msgstr ""
+
msgid "Checkout|Street address"
msgstr ""
@@ -6689,6 +6766,9 @@ msgstr ""
msgid "Checkout|Total minutes: %{quantity}"
msgstr ""
+msgid "Checkout|Total storage: %{quantity} GB"
+msgstr ""
+
msgid "Checkout|Users"
msgstr ""
@@ -6698,16 +6778,25 @@ msgstr ""
msgid "Checkout|Your organization"
msgstr ""
+msgid "Checkout|Your storage subscription has the same term as your main subscription, and the price is prorated accordingly."
+msgstr ""
+
msgid "Checkout|Your subscription will be applied to this group"
msgstr ""
msgid "Checkout|Zip code"
msgstr ""
+msgid "Checkout|a storage subscription"
+msgstr ""
+
msgid "Checkout|company or team"
msgstr ""
-msgid "Checkout|x 1,000 minutes per pack = %{strong}"
+msgid "Checkout|minutes"
+msgstr ""
+
+msgid "Checkout|x %{quantity} %{units} per pack ="
msgstr ""
msgid "Cherry-pick this commit"
@@ -7064,6 +7153,9 @@ msgstr ""
msgid "CloneIssue|Cannot clone issue to target project as it is pending deletion."
msgstr ""
+msgid "CloneIssue|Cannot clone issues of '%{issue_type}' type."
+msgstr ""
+
msgid "Cloned this issue to %{path_to_project}."
msgstr ""
@@ -7118,7 +7210,10 @@ msgstr ""
msgid "Closes this %{quick_action_target}."
msgstr ""
-msgid "Cloud licenses can not be removed."
+msgid "Cloud Functions description and apps that are suitable for this deployment target"
+msgstr ""
+
+msgid "Cloud Run description and apps that are suitable for this deployment target"
msgstr ""
msgid "Cluster"
@@ -7145,6 +7240,12 @@ msgstr ""
msgid "ClusterAgents|Access tokens"
msgstr ""
+msgid "ClusterAgents|Agent might not be connected to GitLab"
+msgstr ""
+
+msgid "ClusterAgents|Agent never connected to GitLab"
+msgstr ""
+
msgid "ClusterAgents|Alternative installation methods"
msgstr ""
@@ -7160,6 +7261,12 @@ msgstr ""
msgid "ClusterAgents|Configuration"
msgstr ""
+msgid "ClusterAgents|Connected"
+msgstr ""
+
+msgid "ClusterAgents|Connection status"
+msgstr ""
+
msgid "ClusterAgents|Copy token"
msgstr ""
@@ -7178,6 +7285,9 @@ msgstr ""
msgid "ClusterAgents|For alternative installation methods %{linkStart}go to the documentation%{linkEnd}."
msgstr ""
+msgid "ClusterAgents|For more troubleshooting information go to"
+msgstr ""
+
msgid "ClusterAgents|Go to the repository"
msgstr ""
@@ -7193,18 +7303,30 @@ msgstr ""
msgid "ClusterAgents|Integrate with the GitLab Agent"
msgstr ""
-msgid "ClusterAgents|Last used"
+msgid "ClusterAgents|Last connected %{timeAgo}."
+msgstr ""
+
+msgid "ClusterAgents|Last contact"
msgstr ""
msgid "ClusterAgents|Learn how to create an agent access token"
msgstr ""
+msgid "ClusterAgents|Make sure you are using a valid token."
+msgstr ""
+
msgid "ClusterAgents|Name"
msgstr ""
msgid "ClusterAgents|Never"
msgstr ""
+msgid "ClusterAgents|Never connected"
+msgstr ""
+
+msgid "ClusterAgents|Not connected"
+msgstr ""
+
msgid "ClusterAgents|Read more about getting started"
msgstr ""
@@ -7226,6 +7348,9 @@ msgstr ""
msgid "ClusterAgents|Select which Agent you want to install"
msgstr ""
+msgid "ClusterAgents|The Agent has not been connected in a long time. There might be a connectivity issue. Last contact was %{timeAgo}."
+msgstr ""
+
msgid "ClusterAgents|The GitLab Agent also requires %{linkStart}enabling the Agent Server%{linkEnd}"
msgstr ""
@@ -7253,9 +7378,6 @@ msgstr ""
msgid "ClusterAgents|You will need to create a token to connect to your agent"
msgstr ""
-msgid "ClusterAgent|This feature is only available for premium plans"
-msgstr ""
-
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -7445,9 +7567,6 @@ msgstr ""
msgid "ClusterIntegration|Create Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Create a provision role on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the account and external ID above. %{startMoreInfoLink}More information%{endLink}"
-msgstr ""
-
msgid "ClusterIntegration|Create cluster on"
msgstr ""
@@ -7880,7 +7999,7 @@ msgstr ""
msgid "ClusterIntegration|Subnets"
msgstr ""
-msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provisioned role, first create one on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the above account and external IDs. %{startMoreInfoLink}More information%{endLink}"
+msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provisioned role, first create one on %{awsLinkStart}Amazon Web Services %{awsLinkEnd} using the above account and external IDs. %{moreInfoStart}More information%{moreInfoEnd}"
msgstr ""
msgid "ClusterIntegration|The Kubernetes certificate used to authenticate to the cluster."
@@ -8114,6 +8233,9 @@ msgstr ""
msgid "Collapse replies"
msgstr ""
+msgid "Collapse settings section"
+msgstr ""
+
msgid "Collapse sidebar"
msgstr ""
@@ -8132,6 +8254,9 @@ msgstr ""
msgid "Comma-separated list of email addresses."
msgstr ""
+msgid "Comma-separated list of users allowed to exceed the rate limit."
+msgstr ""
+
msgid "Comma-separated, e.g. '1.1.1.1, 2.2.2.0/24'"
msgstr ""
@@ -8452,6 +8577,9 @@ msgstr ""
msgid "Configure %{repository_checks_link_start}repository checks%{link_end} and %{housekeeping_link_start}housekeeping%{link_end} on repositories."
msgstr ""
+msgid "Configure CAPTCHAs, IP address limits, and other anti-spam measures."
+msgstr ""
+
msgid "Configure Dependency Scanning in `.gitlab-ci.yml` using the GitLab managed template. You can [add variable overrides](https://docs.gitlab.com/ee/user/application_security/dependency_scanning/#customizing-the-dependency-scanning-settings) to customize Dependency Scanning settings."
msgstr ""
@@ -8488,16 +8616,13 @@ msgstr ""
msgid "Configure a %{codeStart}.gitlab-webide.yml%{codeEnd} file in the %{codeStart}.gitlab%{codeEnd} directory to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
msgstr ""
-msgid "Configure existing installation"
-msgstr ""
-
-msgid "Configure limit for notes created per minute by web and API requests."
+msgid "Configure advanced permissions, Large File Storage, and two-factor authentication settings."
msgstr ""
-msgid "Configure limits for Project/Group Import/Export."
+msgid "Configure approvals by authors and committers on all projects."
msgstr ""
-msgid "Configure limits for web and API requests."
+msgid "Configure existing installation"
msgstr ""
msgid "Configure paths to be protected by Rack Attack."
@@ -8512,10 +8637,13 @@ msgstr ""
msgid "Configure settings for Advanced Search with Elasticsearch."
msgstr ""
+msgid "Configure specific limits for Files API requests that supersede the general user and IP rate limits."
+msgstr ""
+
msgid "Configure specific limits for Git LFS requests that supersede the general user and IP rate limits."
msgstr ""
-msgid "Configure specific limits for Packages API requests that supersede the general user and IP rate limits."
+msgid "Configure specific limits for deprecated API requests that supersede the general user and IP rate limits."
msgstr ""
msgid "Configure the %{link} integration."
@@ -8527,6 +8655,9 @@ msgstr ""
msgid "Configure the way a user creates a new account."
msgstr ""
+msgid "Configure via Merge Request"
+msgstr ""
+
msgid "Configure which lists are shown for anyone who visits this board"
msgstr ""
@@ -8995,6 +9126,9 @@ msgstr ""
msgid "Content parsed with %{link}."
msgstr ""
+msgid "ContentEditor|Table of Contents"
+msgstr ""
+
msgid "ContentEditor|You have to provide a renderMarkdown function or a custom serializer"
msgstr ""
@@ -9181,6 +9315,9 @@ msgstr ""
msgid "Copy link to chart"
msgstr ""
+msgid "Copy prefix"
+msgstr ""
+
msgid "Copy reference"
msgstr ""
@@ -9211,6 +9348,9 @@ msgstr ""
msgid "Copy value"
msgstr ""
+msgid "Corpus Management"
+msgstr ""
+
msgid "Corpus Management|Are you sure you want to delete the corpus?"
msgstr ""
@@ -9439,6 +9579,9 @@ msgstr ""
msgid "Create commit"
msgstr ""
+msgid "Create common files more quickly, and standardize their format."
+msgstr ""
+
msgid "Create confidential merge request"
msgstr ""
@@ -9472,6 +9615,9 @@ msgstr ""
msgid "Create issue"
msgstr ""
+msgid "Create issue to resolve all threads"
+msgstr ""
+
msgid "Create iteration"
msgstr ""
@@ -9526,6 +9672,9 @@ msgstr ""
msgid "Create new..."
msgstr ""
+msgid "Create or import your first project"
+msgstr ""
+
msgid "Create project"
msgstr ""
@@ -9883,7 +10032,7 @@ msgstr ""
msgid "Custom notification events"
msgstr ""
-msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notificationLinkStart} notification emails%{notificationLinkEnd}."
+msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notificationLinkStart}notification emails%{notificationLinkEnd}."
msgstr ""
msgid "Custom project templates"
@@ -10082,10 +10231,10 @@ msgid_plural "CycleAnalytics|Showing %{subjectFilterText} and %{selectedLabelsCo
msgstr[0] ""
msgstr[1] ""
-msgid "CycleAnalytics|Showing data for group '%{groupName}' and %{selectedProjectCount} projects from %{startDate} to %{endDate}"
+msgid "CycleAnalytics|Showing data for group '%{groupName}' and %{selectedProjectCount} projects from %{createdAfter} to %{createdBefore}"
msgstr ""
-msgid "CycleAnalytics|Showing data for group '%{groupName}' from %{startDate} to %{endDate}"
+msgid "CycleAnalytics|Showing data for group '%{groupName}' from %{createdAfter} to %{createdBefore}"
msgstr ""
msgid "CycleAnalytics|Stages"
@@ -10319,6 +10468,9 @@ msgstr ""
msgid "DastProfiles|Manage profiles"
msgstr ""
+msgid "DastProfiles|Manage site profiles"
+msgstr ""
+
msgid "DastProfiles|Minimum = 0 (no timeout enabled), Maximum = 2880 minutes"
msgstr ""
@@ -10394,6 +10546,9 @@ msgstr ""
msgid "DastProfiles|Scanner name"
msgstr ""
+msgid "DastProfiles|Schedule"
+msgstr ""
+
msgid "DastProfiles|Select branch"
msgstr ""
@@ -10463,7 +10618,7 @@ msgstr ""
msgid "DastProfiles|Website"
msgstr ""
-msgid "DastProfiles|You can either choose a passive scan or validate the target site in your chosen site profile. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
+msgid "DastProfiles|You can either choose a passive scan or validate the target site from the site profile management page. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
msgstr ""
msgid "DastProfiles|You cannot run an active scan against an unvalidated site."
@@ -10636,7 +10791,7 @@ msgstr ""
msgid "Days to merge"
msgstr ""
-msgid "Deactivate dormant users after 90 days of inactivity. Users can return to active status by signing in to their account. While inactive, a user is not counted as an active user in the instance."
+msgid "Deactivate dormant users after 90 days of inactivity"
msgstr ""
msgid "Dear Administrator,"
@@ -10723,10 +10878,10 @@ msgstr ""
msgid "Define a custom pattern with cron syntax"
msgstr ""
-msgid "Define approval settings."
+msgid "Define approval rules."
msgstr ""
-msgid "Define approval settings. %{linkStart}Learn more.%{linkEnd}"
+msgid "Define approval rules. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "Define custom rules for what constitutes spam, independent of Akismet"
@@ -10735,7 +10890,7 @@ msgstr ""
msgid "Define environments in the deploy stage(s) in %{code_open}.gitlab-ci.yml%{code_close} to track deployments here."
msgstr ""
-msgid "Define how approval rules are applied as a merge request moves toward completion."
+msgid "Define how approval rules are applied to merge requests."
msgstr ""
msgid "Definition"
@@ -10750,6 +10905,12 @@ msgstr ""
msgid "DelayedJobs|Are you sure you want to run %{job_name} immediately? This job will run automatically after it's timer finishes."
msgstr ""
+msgid "DelayedJobs|Are you sure you want to run %{job_name} immediately? This job will run automatically after its timer finishes."
+msgstr ""
+
+msgid "DelayedJobs|Run the delayed job now?"
+msgstr ""
+
msgid "DelayedJobs|Start now"
msgstr ""
@@ -11026,6 +11187,12 @@ msgstr ""
msgid "Dependency proxy image prefix"
msgstr ""
+msgid "DependencyProxy|Create a local proxy for storing frequently used upstream images. %{docLinkStart}Learn more%{docLinkEnd} about dependency proxies."
+msgstr ""
+
+msgid "DependencyProxy|Dependency Proxy"
+msgstr ""
+
msgid "DependencyProxy|Toggle Dependency Proxy"
msgstr ""
@@ -11266,6 +11433,9 @@ msgstr ""
msgid "Deployments"
msgstr ""
+msgid "Deployments to Google Kubernetes Engine can be "
+msgstr ""
+
msgid "Deployments|%{deployments} environment impacted."
msgid_plural "Deployments|%{deployments} environments impacted."
msgstr[0] ""
@@ -11295,6 +11465,9 @@ msgstr ""
msgid "Deployment|success"
msgstr ""
+msgid "Deprecated API rate limits"
+msgstr ""
+
msgid "Deprioritize label"
msgstr ""
@@ -11697,6 +11870,16 @@ msgstr ""
msgid "DiffsCompareBaseBranch|(base)"
msgstr ""
+msgid "Diffs|%d addition"
+msgid_plural "Diffs|%d additions"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Diffs|%d deletion"
+msgid_plural "Diffs|%d deletions"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Diffs|No file name available"
msgstr ""
@@ -11706,9 +11889,17 @@ msgstr ""
msgid "Diffs|Show all unchanged lines"
msgstr ""
+msgid "Diffs|Showing %{dropdownStart}%{count} changed file%{dropdownEnd}"
+msgid_plural "Diffs|Showing %{dropdownStart}%{count} changed files%{dropdownEnd}"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Diffs|Something went wrong while fetching diff lines."
msgstr ""
+msgid "Diffs|with %{additions} and %{deletions}"
+msgstr ""
+
msgid "Direct member"
msgstr ""
@@ -11834,9 +12025,6 @@ msgid_plural "Dismiss %d selected vulnerabilities as"
msgstr[0] ""
msgstr[1] ""
-msgid "Dismiss Value Stream Analytics introduction box"
-msgstr ""
-
msgid "Dismiss merge request promotion"
msgstr ""
@@ -12158,6 +12346,9 @@ msgstr ""
msgid "Edit issues"
msgstr ""
+msgid "Edit merge requests"
+msgstr ""
+
msgid "Edit public deploy key"
msgstr ""
@@ -12233,6 +12424,9 @@ msgstr ""
msgid "Elastic|None. Select projects to index."
msgstr ""
+msgid "Eligible users"
+msgstr ""
+
msgid "Email"
msgstr ""
@@ -12362,6 +12556,9 @@ msgstr ""
msgid "Enable"
msgstr ""
+msgid "Enable Amazon EKS integration"
+msgstr ""
+
msgid "Enable Auto DevOps"
msgstr ""
@@ -12395,6 +12592,9 @@ msgstr ""
msgid "Enable SSL verification"
msgstr ""
+msgid "Enable Service Ping"
+msgstr ""
+
msgid "Enable Snowplow tracking"
msgstr ""
@@ -12425,6 +12625,9 @@ msgstr ""
msgid "Enable authenticated Git LFS request rate limit"
msgstr ""
+msgid "Enable authenticated web request rate limit"
+msgstr ""
+
msgid "Enable authentication"
msgstr ""
@@ -12485,7 +12688,7 @@ msgstr ""
msgid "Enable or disable the Pseudonymizer data collection."
msgstr ""
-msgid "Enable or disable version check and service ping."
+msgid "Enable or disable version check and Service Ping."
msgstr ""
msgid "Enable protected paths rate limit"
@@ -12497,18 +12700,12 @@ msgstr ""
msgid "Enable reCAPTCHA"
msgstr ""
-msgid "Enable reCAPTCHA for login"
-msgstr ""
-
-msgid "Enable reCAPTCHA, Invisible Captcha, Akismet and set IP limits. For reCAPTCHA, we currently only support %{recaptcha_v2_link_start}v2%{recaptcha_v2_link_end}"
+msgid "Enable reCAPTCHA for login."
msgstr ""
msgid "Enable repository checks"
msgstr ""
-msgid "Enable service ping"
-msgstr ""
-
msgid "Enable shared runners for all projects and subgroups in this group."
msgstr ""
@@ -12530,7 +12727,10 @@ msgstr ""
msgid "Enable unauthenticated API request rate limit"
msgstr ""
-msgid "Enable unauthenticated request rate limit"
+msgid "Enable unauthenticated web request rate limit"
+msgstr ""
+
+msgid "Enable user deactivation emails"
msgstr ""
msgid "Enable version check"
@@ -12566,9 +12766,6 @@ msgstr ""
msgid "Enabled sources for code import during project creation. OmniAuth must be configured for GitHub"
msgstr ""
-msgid "Enabling this will only make licensed EE features available to projects if the project namespace's plan includes the feature or if the project is public."
-msgstr ""
-
msgid "Encountered an error while rendering: %{err}"
msgstr ""
@@ -12617,9 +12814,6 @@ msgstr ""
msgid "Enter Admin Mode"
msgstr ""
-msgid "Enter IP address range"
-msgstr ""
-
msgid "Enter a number"
msgstr ""
@@ -12632,9 +12826,6 @@ msgstr ""
msgid "Enter at least three characters to search"
msgstr ""
-msgid "Enter domain"
-msgstr ""
-
msgid "Enter in your Bitbucket Server URL and personal access token below"
msgstr ""
@@ -12821,9 +13012,6 @@ msgstr ""
msgid "Environments|Deployment %{status}"
msgstr ""
-msgid "Environments|Dismiss"
-msgstr ""
-
msgid "Environments|Enable review app"
msgstr ""
@@ -12836,9 +13024,6 @@ msgstr ""
msgid "Environments|Environments are places where code gets deployed, such as staging or production."
msgstr ""
-msgid "Environments|Help us improve environments"
-msgstr ""
-
msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
msgstr ""
@@ -12875,6 +13060,9 @@ msgstr ""
msgid "Environments|Note that this action will stop the environment, but it will %{emphasisStart}not%{emphasisEnd} have an effect on any existing deployment due to no “stop environment action†being defined in the %{ciConfigLinkStart}.gitlab-ci.yml%{ciConfigLinkEnd} file."
msgstr ""
+msgid "Environments|Open"
+msgstr ""
+
msgid "Environments|Open live environment"
msgstr ""
@@ -12914,9 +13102,6 @@ msgstr ""
msgid "Environments|Stopping %{environmentName}"
msgstr ""
-msgid "Environments|Take the survey"
-msgstr ""
-
msgid "Environments|There was an error fetching the logs. Please try again."
msgstr ""
@@ -12938,9 +13123,6 @@ msgstr ""
msgid "Environments|You don't have any environments right now"
msgstr ""
-msgid "Environments|Your feedback helps GitLab make environments better for you and other users. Participate and enter a sweepstake to win a USD 30 gift card."
-msgstr ""
-
msgid "Environments|by %{avatar}"
msgstr ""
@@ -13223,7 +13405,7 @@ msgstr ""
msgid "Error parsing CSV file. Please make sure it has"
msgstr ""
-msgid "Error rendering markdown preview"
+msgid "Error rendering Markdown preview"
msgstr ""
msgid "Error saving label update."
@@ -13271,6 +13453,9 @@ msgstr ""
msgid "Error: %{error_message}"
msgstr ""
+msgid "Error: Couldn't load some or all of the changes."
+msgstr ""
+
msgid "Error: No AWS credentials were supplied"
msgstr ""
@@ -13304,6 +13489,9 @@ msgstr ""
msgid "ErrorTracking|Enable error tracking"
msgstr ""
+msgid "ErrorTracking|Error tracking backend"
+msgstr ""
+
msgid "ErrorTracking|If you self-host Sentry, enter your Sentry instance's full URL. If you use Sentry's hosted solution, enter https://sentry.io"
msgstr ""
@@ -13337,6 +13525,12 @@ msgstr ""
msgid "Escalation policies must have at least one rule"
msgstr ""
+msgid "EscalationPolicies|%{clockIcon} IF alert is not %{alertStatus} in %{minutes}"
+msgstr ""
+
+msgid "EscalationPolicies|%{notificationIcon} THEN %{doAction} %{forScheduleOrUser}"
+msgstr ""
+
msgid "EscalationPolicies|+ Add an additional rule"
msgstr ""
@@ -13379,13 +13573,13 @@ msgstr ""
msgid "EscalationPolicies|Escalation policies"
msgstr ""
-msgid "EscalationPolicies|Escalation rules"
+msgid "EscalationPolicies|Escalation policy %{obstacle} in Project %{project}"
msgstr ""
-msgid "EscalationPolicies|Failed to load oncall-schedules"
+msgid "EscalationPolicies|Escalation rules"
msgstr ""
-msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} %{then} THEN %{doAction} %{scheduleOrUser}"
+msgid "EscalationPolicies|Failed to load oncall-schedules"
msgstr ""
msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} minutes"
@@ -13463,18 +13657,36 @@ msgstr ""
msgid "Every %{action} attempt has failed: %{job_error_message}. Please try again."
msgstr ""
+msgid "Every 3 months"
+msgstr ""
+
+msgid "Every 3 months on the %{day} at %{time} %{timezone}"
+msgstr ""
+
+msgid "Every 6 months"
+msgstr ""
+
+msgid "Every 6 months on the %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Every day"
msgstr ""
msgid "Every day (at %{time})"
msgstr ""
+msgid "Every day at %{time} %{timezone}"
+msgstr ""
+
msgid "Every month"
msgstr ""
msgid "Every month (Day %{day} at %{time})"
msgstr ""
+msgid "Every month on the %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Every three months"
msgstr ""
@@ -13489,6 +13701,15 @@ msgstr[1] ""
msgid "Every week (%{weekday} at %{time})"
msgstr ""
+msgid "Every week on %{day} at %{time} %{timezone}"
+msgstr ""
+
+msgid "Every year"
+msgstr ""
+
+msgid "Every year on %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Everyone"
msgstr ""
@@ -13525,9 +13746,6 @@ msgstr ""
msgid "Exactly one of %{attributes} is required"
msgstr ""
-msgid "Example: %{ip_address}. %{read_more_link}."
-msgstr ""
-
msgid "Example: @sub\\.company\\.com$"
msgstr ""
@@ -13594,13 +13812,13 @@ msgstr ""
msgid "Expand pipeline"
msgstr ""
-msgid "Expand sidebar"
+msgid "Expand settings section"
msgstr ""
-msgid "Expected documents: %{expected_documents}"
+msgid "Expand sidebar"
msgstr ""
-msgid "Experienced"
+msgid "Expected documents: %{expected_documents}"
msgstr ""
msgid "ExperimentSubject|Must have exactly one of User, Namespace, or Project."
@@ -13885,9 +14103,6 @@ msgstr ""
msgid "Failed to load related branches"
msgstr ""
-msgid "Failed to load sidebar lock status"
-msgstr ""
-
msgid "Failed to load stacktrace."
msgstr ""
@@ -14312,6 +14527,9 @@ msgstr ""
msgid "Files"
msgstr ""
+msgid "Files API Rate Limits"
+msgstr ""
+
msgid "Files breadcrumb"
msgstr ""
@@ -15311,6 +15529,9 @@ msgstr ""
msgid "GitLab group: %{source_link}"
msgstr ""
+msgid "GitLab informs you if a new version is available."
+msgstr ""
+
msgid "GitLab is a complete DevOps platform, delivered as a single application, fundamentally changing the way Development, Security, and Ops teams collaborate"
msgstr ""
@@ -15326,7 +15547,7 @@ msgstr ""
msgid "GitLab is open source software to collaborate on code."
msgstr ""
-msgid "GitLab is undergoing maintenance and is operating in a read-only mode."
+msgid "GitLab is undergoing maintenance and is operating in read-only mode."
msgstr ""
msgid "GitLab member or Email address"
@@ -15338,9 +15559,6 @@ msgstr ""
msgid "GitLab project export"
msgstr ""
-msgid "GitLab restart is required to apply changes."
-msgstr ""
-
msgid "GitLab single sign-on URL"
msgstr ""
@@ -15356,9 +15574,6 @@ msgstr ""
msgid "GitLab version"
msgstr ""
-msgid "GitLab will inform you if a new version is available."
-msgstr ""
-
msgid "GitLab will run a background job that will produce pseudonymized CSVs of the GitLab database that will be uploaded to your configured object storage directory."
msgstr ""
@@ -15623,9 +15838,21 @@ msgstr ""
msgid "Go to snippets"
msgstr ""
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check 'Allowed domains for sign-ups'."
+msgstr ""
+
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check 'Email restrictions for sign-ups'."
+msgstr ""
+
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check the 'Domain denylist'."
+msgstr ""
+
msgid "Go to the activity feed"
msgstr ""
+msgid "Go to the group’s 'Settings &gt; General' page, and check 'Restrict membership by email domain'."
+msgstr ""
+
msgid "Go to the milestone list"
msgstr ""
@@ -15662,6 +15889,12 @@ msgstr ""
msgid "Goal of the changes and what reviewers should be aware of"
msgstr ""
+msgid "Google Cloud"
+msgstr ""
+
+msgid "Google Cloud offers several deployment targets. Select the one most suitable for your project."
+msgstr ""
+
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
@@ -15746,9 +15979,6 @@ msgstr ""
msgid "Group ID"
msgstr ""
-msgid "Group ID: %{group_id}"
-msgstr ""
-
msgid "Group Owner must have signed in with SAML before enabling Group Managed Accounts"
msgstr ""
@@ -15923,6 +16153,12 @@ msgstr ""
msgid "GroupImport|Unable to process group import file"
msgstr ""
+msgid "GroupPage|Copy group ID"
+msgstr ""
+
+msgid "GroupPage|Group ID: %{group_id}"
+msgstr ""
+
msgid "GroupRoadmap|%{dateWord} – No end date"
msgstr ""
@@ -15977,6 +16213,9 @@ msgstr ""
msgid "GroupRoadmap|Within 3 years"
msgstr ""
+msgid "GroupSAML|\"persistent\" recommended"
+msgstr ""
+
msgid "GroupSAML|%{strongOpen}Warning%{strongClose} - Enabling %{linkStart}SSO enforcement%{linkEnd} can reduce security risks."
msgstr ""
@@ -16109,6 +16348,9 @@ msgstr ""
msgid "GroupSAML|To be able to prohibit outer forks, you first need to enforce dedicate group managed accounts."
msgstr ""
+msgid "GroupSAML|Use SAML group links to manage group membership using SAML."
+msgstr ""
+
msgid "GroupSAML|Valid SAML Response"
msgstr ""
@@ -16121,13 +16363,10 @@ msgstr ""
msgid "GroupSAML|as %{access_level}"
msgstr ""
-msgid "GroupSAML|must match stored NameID of \"%{extern_uid}\" as we use this to identify users. If the NameID changes users will be unable to sign in."
-msgstr ""
-
-msgid "GroupSAML|should be \"persistent\""
+msgid "GroupSAML|must match stored NameID of \"%{extern_uid}\" to identify user and allow sign in"
msgstr ""
-msgid "GroupSAML|should be a random persistent ID, emails are discouraged"
+msgid "GroupSAML|recommend persistent ID instead of email"
msgstr ""
msgid "GroupSelect|No matching results"
@@ -16142,9 +16381,15 @@ msgstr ""
msgid "GroupSettings|Allow project access token creation"
msgstr ""
+msgid "GroupSettings|Applied to all subgroups unless overridden by a group owner. Groups already added to the project lose access."
+msgstr ""
+
msgid "GroupSettings|Auto DevOps pipeline was updated for the group"
msgstr ""
+msgid "GroupSettings|Available only on the top-level group. Applies to all subgroups. Groups already shared with a group outside %{group} are still shared unless removed manually."
+msgstr ""
+
msgid "GroupSettings|Badges"
msgstr ""
@@ -16196,6 +16441,9 @@ msgstr ""
msgid "GroupSettings|New runners registration token has been generated!"
msgstr ""
+msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgstr ""
+
msgid "GroupSettings|Pipeline settings was updated for the group"
msgstr ""
@@ -16208,12 +16456,15 @@ msgstr ""
msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
-msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups."
+msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups"
msgstr ""
msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
msgstr ""
+msgid "GroupSettings|Prevents group members from being notified if the group is mentioned."
+msgstr ""
+
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
msgstr ""
@@ -16250,21 +16501,6 @@ msgstr ""
msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}."
msgstr ""
-msgid "GroupSettings|This setting is only available on the top-level group and it applies to all subgroups. Groups that have already been shared with a group outside %{group} will still be shared, and this access will have to be revoked manually."
-msgstr ""
-
-msgid "GroupSettings|This setting will be applied to all subgroups unless overridden by a group owner. Groups that already have access to the project will continue to have access unless removed manually."
-msgstr ""
-
-msgid "GroupSettings|This setting will override user notification preferences for all members of the group, subgroups, and projects."
-msgstr ""
-
-msgid "GroupSettings|This setting will prevent group members from being notified if the group is mentioned."
-msgstr ""
-
-msgid "GroupSettings|This setting will prevent group members from forking projects outside of the group."
-msgstr ""
-
msgid "GroupSettings|Transfer group"
msgstr ""
@@ -16382,7 +16618,7 @@ msgstr ""
msgid "GroupsNew|No import options available"
msgstr ""
-msgid "GroupsNew|Not all related objects are migrated, as %{docs_link_start}described here%{docs_link_end}. Please %{feedback_link_start}leave feedback%{feedback_link_end} on this feature."
+msgid "GroupsNew|Not all related objects are migrated. %{docs_link_start}More info%{docs_link_end}."
msgstr ""
msgid "GroupsNew|Personal access token"
@@ -16514,15 +16750,27 @@ msgstr ""
msgid "Hello %{name},"
msgstr ""
-msgid "Hello there"
-msgstr ""
-
msgid "Hello, %{name}!"
msgstr ""
msgid "Hello, %{username}!"
msgstr ""
+msgid "HelloMessage|%{handshake_emoji} Contribute to GitLab: %{contribute_link}"
+msgstr ""
+
+msgid "HelloMessage|%{magnifier_emoji} Create a new GitLab issue: %{new_issue_link}"
+msgstr ""
+
+msgid "HelloMessage|%{rocket_emoji} We like your curiosity! Help us improve GitLab by joining the team: %{jobs_page_link}"
+msgstr ""
+
+msgid "HelloMessage|Does this page need fixes or improvements? Open an issue or contribute a merge request to help make GitLab more lovable. At GitLab, everyone can contribute!"
+msgstr ""
+
+msgid "HelloMessage|Welcome to GitLab!"
+msgstr ""
+
msgid "Help"
msgstr ""
@@ -16532,13 +16780,10 @@ msgstr ""
msgid "Helps prevent bots from creating accounts."
msgstr ""
-msgid "Helps prevent bots from creating issues"
-msgstr ""
-
-msgid "Helps prevent malicious users hide their activity"
+msgid "Helps prevent bots from creating issues."
msgstr ""
-msgid "Helps reduce request volume (e.g. from crawlers or abusive bots)"
+msgid "Helps prevent malicious users hide their activity."
msgstr ""
msgid "Helps reduce request volume (for example, from crawlers or abusive bots)"
@@ -16662,6 +16907,12 @@ msgstr ""
msgid "Housekeeping, export, path, transfer, remove, archive."
msgstr ""
+msgid "How do I configure Akismet?"
+msgstr ""
+
+msgid "How do I configure it?"
+msgstr ""
+
msgid "How do I configure runners?"
msgstr ""
@@ -16683,19 +16934,25 @@ msgstr ""
msgid "How do I set up this service?"
msgstr ""
+msgid "How do I use a web terminal?"
+msgstr ""
+
+msgid "How do I use file templates?"
+msgstr ""
+
msgid "How it works"
msgstr ""
msgid "How many days need to pass between marking entity for deletion and actual removing it."
msgstr ""
-msgid "How many seconds an IP will be counted towards the limit"
+msgid "How many seconds an IP counts toward the IP address limit."
msgstr ""
-msgid "I accept the %{terms_link}"
+msgid "How the job limiter handles jobs exceeding the thresholds specified below. The 'track' mode only logs the jobs. The 'compress' mode compresses the jobs and raises an exception if the compressed size exceeds the limit."
msgstr ""
-msgid "I accept the|Terms of Service and Privacy Policy"
+msgid "I accept the %{terms_link}"
msgstr ""
msgid "I forgot my password"
@@ -16779,13 +17036,16 @@ msgstr ""
msgid "IP Address"
msgstr ""
-msgid "IP expiration time"
+msgid "IP address expiration time"
msgstr ""
-msgid "IP subnet restriction only allowed for top-level groups"
+msgid "IP address restrictions"
+msgstr ""
+
+msgid "IP addresses per user"
msgstr ""
-msgid "IPs per user"
+msgid "IP subnet restriction only allowed for top-level groups"
msgstr ""
msgid "Identifier"
@@ -16800,6 +17060,9 @@ msgstr ""
msgid "If any indexed field exceeds this limit it will be truncated to this number of characters and the rest will not be indexed or searchable. This does not apply to repository and wiki indexing. Setting this to 0 means it is unlimited."
msgstr ""
+msgid "If blank, defaults to %{code_open}Retry later%{code_close}."
+msgstr ""
+
msgid "If blank, set allowable lifetime to %{instance_level_policy_in_words}, as defined by the instance admin. Once set, existing tokens for users in this group may be revoked."
msgstr ""
@@ -16851,6 +17114,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 did not initiate these sign-in attempts, please reach out to your administrator or enable two-factor authentication (2FA) on your account."
+msgstr ""
+
msgid "If you did not initiate this change, please contact your administrator immediately."
msgstr ""
@@ -16942,10 +17208,10 @@ msgstr ""
msgid "Import Projects from Gitea"
msgstr ""
-msgid "Import a project"
+msgid "Import an exported GitLab project"
msgstr ""
-msgid "Import an exported GitLab project"
+msgid "Import and export rate limits"
msgstr ""
msgid "Import failed due to a GitHub error: %{original}"
@@ -16957,12 +17223,18 @@ msgstr ""
msgid "Import from Jira"
msgstr ""
+msgid "Import group"
+msgstr ""
+
msgid "Import group from file"
msgstr ""
msgid "Import groups"
msgstr ""
+msgid "Import history"
+msgstr ""
+
msgid "Import in progress"
msgstr ""
@@ -17026,7 +17298,25 @@ msgstr ""
msgid "Import timed out. Import took longer than %{import_jobs_expiration} seconds"
msgstr ""
-msgid "Import/Export Rate Limits"
+msgid "ImportAProjectModal|Import from a project"
+msgstr ""
+
+msgid "ImportAProjectModal|Import members from another project"
+msgstr ""
+
+msgid "ImportAProjectModal|Import project members"
+msgstr ""
+
+msgid "ImportAProjectModal|Only project members (not group members) are imported, and they get the same permissions as the project you import from."
+msgstr ""
+
+msgid "ImportAProjectModal|Successfully imported"
+msgstr ""
+
+msgid "ImportAProjectModal|Unable to import project members"
+msgstr ""
+
+msgid "ImportAProjectModal|You're importing members to the %{strongStart}%{name}%{strongEnd} project."
msgstr ""
msgid "ImportButtons|Connect repositories from"
@@ -17079,7 +17369,7 @@ msgstr[1] ""
msgid "Importing..."
msgstr ""
-msgid "Import|A repository URL usually ends in a .git suffix, although this is not required. Double check to make sure your repository URL is correct."
+msgid "Import|There is not a valid Git repository at this URL. If your HTTP repository is not publicly accessible, verify your credentials."
msgstr ""
msgid "Improve customer support with Service Desk"
@@ -17088,9 +17378,6 @@ msgstr ""
msgid "Improves Git cloning performance."
msgstr ""
-msgid "In %{time_to_now}"
-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 ""
@@ -17376,7 +17663,7 @@ msgstr ""
msgid "InProductMarketing|Start a GitLab Ultimate trial today in less than one minute, no credit card required."
msgstr ""
-msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no CC required"
+msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no credit card required"
msgstr ""
msgid "InProductMarketing|Start a trial"
@@ -17415,7 +17702,7 @@ msgstr ""
msgid "InProductMarketing|Team up in GitLab for greater efficiency"
msgstr ""
-msgid "InProductMarketing|Team work makes the dream work"
+msgid "InProductMarketing|Team work makes the dream work"
msgstr ""
msgid "InProductMarketing|Test, create, deploy"
@@ -17996,6 +18283,9 @@ msgstr ""
msgid "Integrations|Create new issue in Jira"
msgstr ""
+msgid "Integrations|Create new issue in ZenTao"
+msgstr ""
+
msgid "Integrations|Default settings are inherited from the group level."
msgstr ""
@@ -18089,9 +18379,15 @@ msgstr ""
msgid "Integrations|Search Jira issues"
msgstr ""
+msgid "Integrations|Search ZenTao issues"
+msgstr ""
+
msgid "Integrations|Send notifications about project events to Unify Circuit."
msgstr ""
+msgid "Integrations|Send notifications about project events to a Unify Circuit conversation. %{docs_link}"
+msgstr ""
+
msgid "Integrations|Sign in to add namespaces"
msgstr ""
@@ -18131,6 +18427,9 @@ msgstr ""
msgid "Integrations|You've activated every integration 🎉"
msgstr ""
+msgid "Integrations|ZenTao issues display here when you create issues in your project in ZenTao."
+msgstr ""
+
msgid "Interactive mode"
msgstr ""
@@ -18158,9 +18457,6 @@ msgstr ""
msgid "Interval Pattern"
msgstr ""
-msgid "Introducing Value Stream Analytics"
-msgstr ""
-
msgid "Introducing Your DevOps Report"
msgstr ""
@@ -18257,6 +18553,12 @@ msgstr ""
msgid "Investigate vulnerability: %{title}"
msgstr ""
+msgid "Invisible Captcha"
+msgstr ""
+
+msgid "Invisible Captcha helps prevent the creation of spam accounts. It adds a honeypot field and time-sensitive form submission to the account signup form."
+msgstr ""
+
msgid "Invitation"
msgstr ""
@@ -18710,12 +19012,18 @@ msgstr ""
msgid "Issues"
msgstr ""
+msgid "Issues I've created"
+msgstr ""
+
msgid "Issues Rate Limits"
msgstr ""
msgid "Issues and merge requests"
msgstr ""
+msgid "Issues assigned to me"
+msgstr ""
+
msgid "Issues can be bugs, tasks or ideas to be discussed. Also, issues are searchable and filterable."
msgstr ""
@@ -18827,7 +19135,7 @@ msgstr ""
msgid "Iterations|Create cadence"
msgstr ""
-msgid "Iterations|Create your first iteration"
+msgid "Iterations|Create iteration"
msgstr ""
msgid "Iterations|Delete cadence"
@@ -18836,6 +19144,9 @@ msgstr ""
msgid "Iterations|Delete iteration cadence?"
msgstr ""
+msgid "Iterations|Delete iteration?"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -18869,12 +19180,18 @@ msgstr ""
msgid "Iterations|New iteration cadence"
msgstr ""
+msgid "Iterations|No closed iterations."
+msgstr ""
+
msgid "Iterations|No iteration cadences to show."
msgstr ""
msgid "Iterations|No iterations in cadence."
msgstr ""
+msgid "Iterations|No open iterations."
+msgstr ""
+
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
@@ -18905,6 +19222,9 @@ msgstr ""
msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
msgstr ""
+msgid "Iterations|This will remove the iteration from any issues that are assigned to it."
+msgstr ""
+
msgid "Iterations|Title"
msgstr ""
@@ -18920,15 +19240,9 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "I’m familiar with the basics of DevOps."
-msgstr ""
-
msgid "I’m joining my team who’s already on GitLab"
msgstr ""
-msgid "I’m not familiar with the basics of DevOps."
-msgstr ""
-
msgid "Jaeger URL"
msgstr ""
@@ -19193,6 +19507,9 @@ msgstr ""
msgid "Job"
msgstr ""
+msgid "Job %{jobName}"
+msgstr ""
+
msgid "Job Failed #%{build_id}"
msgstr ""
@@ -19783,9 +20100,6 @@ msgstr ""
msgid "Learn more in the"
msgstr ""
-msgid "Learn more in the|pipeline schedules documentation"
-msgstr ""
-
msgid "Learn more."
msgstr ""
@@ -19897,9 +20211,6 @@ msgstr ""
msgid "Leave Admin Mode"
msgstr ""
-msgid "Leave blank for no limit. Once set, existing personal access tokens may be revoked."
-msgstr ""
-
msgid "Leave edit mode? All unsaved changes will be lost."
msgstr ""
@@ -19945,10 +20256,10 @@ msgstr ""
msgid "LicenseCompliance|Acceptable license to be used in the project"
msgstr ""
-msgid "LicenseCompliance|Add a license"
+msgid "LicenseCompliance|Add license and related policy"
msgstr ""
-msgid "LicenseCompliance|Add license and related policy"
+msgid "LicenseCompliance|Add license policy"
msgstr ""
msgid "LicenseCompliance|Allow"
@@ -20038,6 +20349,9 @@ msgstr ""
msgid "LicenseManagement|Uncategorized"
msgstr ""
+msgid "Licensed Enterprise Edition features can be used if the project namespace's plan includes the feature, or if the project is public."
+msgstr ""
+
msgid "Licensed Features"
msgstr ""
@@ -20104,7 +20418,10 @@ msgstr ""
msgid "Limit namespaces and projects that can be indexed"
msgstr ""
-msgid "Limit sign in from multiple ips"
+msgid "Limit project size at a global, group, and project level. %{link_start}Learn more%{link_end}."
+msgstr ""
+
+msgid "Limit sign in from multiple IP addresses"
msgstr ""
msgid "Limit the number of concurrent operations this secondary site can run in the background."
@@ -20116,11 +20433,17 @@ msgstr ""
msgid "Limit the number of issues and epics per minute a user can create through web and API requests."
msgstr ""
+msgid "Limit the size of Sidekiq jobs stored in Redis."
+msgstr ""
+
msgid "Limited to showing %d event at most"
msgid_plural "Limited to showing %d events at most"
msgstr[0] ""
msgstr[1] ""
+msgid "Limiting mode"
+msgstr ""
+
msgid "Line changes"
msgstr ""
@@ -20190,9 +20513,6 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
-msgid "List of users to be excluded from the limit"
-msgstr ""
-
msgid "List options"
msgstr ""
@@ -20232,9 +20552,6 @@ msgstr ""
msgid "Loading functions timed out. Please reload the page to try again."
msgstr ""
-msgid "Loading issues"
-msgstr ""
-
msgid "Loading more"
msgstr ""
@@ -20526,6 +20843,9 @@ msgstr ""
msgid "Marked For Deletion At - %{deletion_time}"
msgstr ""
+msgid "Marked as ready. Merging is now allowed."
+msgstr ""
+
msgid "Marked this %{noun} as a draft."
msgstr ""
@@ -20598,52 +20918,22 @@ msgstr ""
msgid "Max 100,000 events"
msgstr ""
-msgid "Max 20 characters"
-msgstr ""
-
-msgid "Max Group Export Download requests per minute per user"
-msgstr ""
-
-msgid "Max Group Export requests per minute per user"
-msgstr ""
-
-msgid "Max Group Import requests per minute per user"
-msgstr ""
-
-msgid "Max Project Export Download requests per minute per user"
-msgstr ""
-
-msgid "Max Project Export requests per minute per user"
-msgstr ""
-
-msgid "Max Project Import requests per minute per user"
-msgstr ""
-
-msgid "Max authenticated API requests per period per user"
-msgstr ""
-
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
-msgid "Max authenticated web requests per period per user"
-msgstr ""
-
msgid "Max file size is 200 KB."
msgstr ""
-msgid "Max requests per minute per user"
-msgstr ""
-
msgid "Max role"
msgstr ""
msgid "Max session time"
msgstr ""
-msgid "Max unauthenticated requests per period per IP"
+msgid "MaxBuilds"
msgstr ""
-msgid "MaxBuilds"
+msgid "Maximum 20 characters"
msgstr ""
msgid "Maximum Conan package file size in bytes"
@@ -20679,6 +20969,12 @@ msgstr ""
msgid "Maximum attachment size (MB)"
msgstr ""
+msgid "Maximum authenticated API requests per rate limit period per user"
+msgstr ""
+
+msgid "Maximum authenticated web requests per rate limit period per user"
+msgstr ""
+
msgid "Maximum bulk request size (MiB)"
msgstr ""
@@ -20724,6 +21020,15 @@ msgstr ""
msgid "Maximum files in a diff"
msgstr ""
+msgid "Maximum group export download requests per minute"
+msgstr ""
+
+msgid "Maximum group export requests per minute"
+msgstr ""
+
+msgid "Maximum group import requests per minute"
+msgstr ""
+
msgid "Maximum import size"
msgstr ""
@@ -20760,7 +21065,7 @@ msgstr ""
msgid "Maximum number of projects."
msgstr ""
-msgid "Maximum number of unique IPs per user"
+msgid "Maximum number of unique IP addresses per user."
msgstr ""
msgid "Maximum page reached"
@@ -20769,12 +21074,24 @@ msgstr ""
msgid "Maximum page size"
msgstr ""
+msgid "Maximum project export download requests per minute"
+msgstr ""
+
+msgid "Maximum project export requests per minute"
+msgstr ""
+
+msgid "Maximum project import requests per minute"
+msgstr ""
+
msgid "Maximum push size"
msgstr ""
msgid "Maximum push size (MB)"
msgstr ""
+msgid "Maximum requests per minute"
+msgstr ""
+
msgid "Maximum running slices"
msgstr ""
@@ -20802,10 +21119,16 @@ msgstr ""
msgid "Maximum time between updates that a mirror can have when scheduled to synchronize."
msgstr ""
-msgid "Maximum time for web terminal websocket connection (in seconds). 0 for unlimited."
+msgid "Maximum time that users are allowed to skip the setup of two-factor authentication (in hours). Set to 0 (zero) to enforce at next sign in."
msgstr ""
-msgid "Maximum time that users are allowed to skip the setup of two-factor authentication (in hours). Set to 0 (zero) to enforce at next sign in."
+msgid "Maximum time, in seconds, for a web terminal websocket connection. 0 for unlimited."
+msgstr ""
+
+msgid "Maximum unauthenticated API requests per rate limit period per IP"
+msgstr ""
+
+msgid "Maximum unauthenticated web requests per rate limit period per IP"
msgstr ""
msgid "May"
@@ -20823,9 +21146,6 @@ msgstr ""
msgid "Medium vulnerabilities present"
msgstr ""
-msgid "Member lock"
-msgstr ""
-
msgid "Member since"
msgstr ""
@@ -20862,6 +21182,9 @@ msgstr ""
msgid "Members of a group may only view projects they have permission to access"
msgstr ""
+msgid "Membership"
+msgstr ""
+
msgid "Members|%{time} by %{user}"
msgstr ""
@@ -20922,9 +21245,6 @@ msgstr ""
msgid "Members|Expiration date updated successfully."
msgstr ""
-msgid "Members|Expired"
-msgstr ""
-
msgid "Members|Filter members"
msgstr ""
@@ -20940,9 +21260,6 @@ msgstr ""
msgid "Members|Membership"
msgstr ""
-msgid "Members|No expiration set"
-msgstr ""
-
msgid "Members|Remove \"%{groupName}\""
msgstr ""
@@ -20964,9 +21281,6 @@ msgstr ""
msgid "Members|Search invited"
msgstr ""
-msgid "Members|in %{time}"
-msgstr ""
-
msgid "Member|Deny access"
msgstr ""
@@ -21042,9 +21356,6 @@ msgstr ""
msgid "Merge request %{mr_link} was reviewed by %{mr_author}"
msgstr ""
-msgid "Merge request (MR) approvals"
-msgstr ""
-
msgid "Merge request analytics"
msgstr ""
@@ -21066,12 +21377,21 @@ msgstr ""
msgid "Merge requests"
msgstr ""
+msgid "Merge requests I've created"
+msgstr ""
+
msgid "Merge requests are a place to propose changes you've made to a project and discuss those changes with others"
msgstr ""
msgid "Merge requests are read-only in a secondary Geo node"
msgstr ""
+msgid "Merge requests assigned to me"
+msgstr ""
+
+msgid "Merge requests that I'm a reviewer"
+msgstr ""
+
msgid "Merge the branch and fix any conflicts that come up"
msgstr ""
@@ -21132,10 +21452,10 @@ msgstr ""
msgid "MergeRequests|An error occurred while saving the draft comment."
msgstr ""
-msgid "MergeRequests|Failed to squash. Should be done manually."
+msgid "MergeRequests|Create issue to resolve thread"
msgstr ""
-msgid "MergeRequests|Resolve this thread in a new issue"
+msgid "MergeRequests|Failed to squash. Should be done manually."
msgstr ""
msgid "MergeRequests|Saving the comment failed"
@@ -21949,6 +22269,9 @@ msgstr ""
msgid "MoveIssue|Cannot move issue to project it originates from!"
msgstr ""
+msgid "MoveIssue|Cannot move issues of '%{issue_type}' type."
+msgstr ""
+
msgid "Moved issue to %{label} column in the board."
msgstr ""
@@ -22074,6 +22397,15 @@ 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. To learn more about reducing storage capacity please visit our docs."
msgstr ""
+msgid "NamespaceUserCap|Pending users must be reviewed and approved by a group owner. Learn more about %{user_caps_link_start}User Caps%{link_end} and %{users_pending_approval_link_start}Users Pending Approval%{link_end}."
+msgstr ""
+
+msgid "NamespaceUserCap|View pending user approvals"
+msgstr ""
+
+msgid "NamespaceUserCap|Your group has reached its billable member limit"
+msgstr ""
+
msgid "Namespaces"
msgstr ""
@@ -22116,9 +22448,6 @@ msgstr ""
msgid "Network"
msgstr ""
-msgid "Network Policy|New rule"
-msgstr ""
-
msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is inbound from a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
msgstr ""
@@ -22140,16 +22469,13 @@ msgstr ""
msgid "NetworkPolicies|%{strongOpen}any%{strongClose} port"
msgstr ""
-msgid "NetworkPolicies|+ Add alert"
-msgstr ""
-
msgid "NetworkPolicies|.yaml"
msgstr ""
msgid "NetworkPolicies|.yaml mode"
msgstr ""
-msgid "NetworkPolicies|Actions"
+msgid "NetworkPolicies|Add alert"
msgstr ""
msgid "NetworkPolicies|Alerts are intended to be selectively used for a limited number of events that are potentially concerning and warrant a manual review. Alerts should not be used as a substitute for a SIEM or a logging tool. High volume alerts are likely to be dropped so as to preserve the stability of GitLab's integration with Kubernetes."
@@ -22185,9 +22511,6 @@ msgstr ""
msgid "NetworkPolicies|Deny all traffic"
msgstr ""
-msgid "NetworkPolicies|Description"
-msgstr ""
-
msgid "NetworkPolicies|Edit policy"
msgstr ""
@@ -22200,9 +22523,6 @@ msgstr ""
msgid "NetworkPolicies|IP/subnet"
msgstr ""
-msgid "NetworkPolicies|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
-msgstr ""
-
msgid "NetworkPolicies|Invalid or empty policy"
msgstr ""
@@ -22212,19 +22532,16 @@ msgstr ""
msgid "NetworkPolicies|Kubernetes error: %{error}"
msgstr ""
-msgid "NetworkPolicies|Name"
-msgstr ""
-
msgid "NetworkPolicies|Network"
msgstr ""
-msgid "NetworkPolicies|Network traffic"
+msgid "NetworkPolicies|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
msgstr ""
-msgid "NetworkPolicies|New policy"
+msgid "NetworkPolicies|Network policy can be created after the environment is loaded successfully."
msgstr ""
-msgid "NetworkPolicies|No policies detected"
+msgid "NetworkPolicies|Network traffic"
msgstr ""
msgid "NetworkPolicies|None selected"
@@ -22233,21 +22550,12 @@ msgstr ""
msgid "NetworkPolicies|Please %{installLinkStart}install%{installLinkEnd} and %{configureLinkStart}configure a Kubernetes Agent for this project%{configureLinkEnd} to enable alerts."
msgstr ""
-msgid "NetworkPolicies|Policies are a specification of how groups of pods are allowed to communicate with each other's network endpoints."
-msgstr ""
-
msgid "NetworkPolicies|Policy %{policyName} was successfully changed"
msgstr ""
msgid "NetworkPolicies|Policy definition"
msgstr ""
-msgid "NetworkPolicies|Policy editor"
-msgstr ""
-
-msgid "NetworkPolicies|Policy preview"
-msgstr ""
-
msgid "NetworkPolicies|Rule"
msgstr ""
@@ -22257,9 +22565,6 @@ msgstr ""
msgid "NetworkPolicies|Rule mode is unavailable for this policy. In some cases, we cannot parse the YAML file back into the rules editor."
msgstr ""
-msgid "NetworkPolicies|Rules"
-msgstr ""
-
msgid "NetworkPolicies|Save changes"
msgstr ""
@@ -22272,9 +22577,6 @@ msgstr ""
msgid "NetworkPolicies|Traffic that does not match any rule will be blocked."
msgstr ""
-msgid "NetworkPolicies|Unable to parse policy"
-msgstr ""
-
msgid "NetworkPolicies|all DNS names"
msgstr ""
@@ -22454,6 +22756,9 @@ msgstr ""
msgid "New issue"
msgstr ""
+msgid "New issue in %{project}"
+msgstr ""
+
msgid "New issue title"
msgstr ""
@@ -22532,7 +22837,7 @@ msgstr ""
msgid "Newest first"
msgstr ""
-msgid "Newly registered users will by default be external"
+msgid "Newly-registered users are external by default"
msgstr ""
msgid "Next"
@@ -22847,8 +23152,10 @@ msgstr ""
msgid "No webhooks found, add one in the form above."
msgstr ""
-msgid "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} to renew your subscription."
-msgstr ""
+msgid "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} day to renew your subscription."
+msgid_plural "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} days to renew your subscription."
+msgstr[0] ""
+msgstr[1] ""
msgid "No. of commits"
msgstr ""
@@ -22865,7 +23172,7 @@ msgstr ""
msgid "Nodes"
msgstr ""
-msgid "Non-admin users can sign in with read-only access and make read-only API requests."
+msgid "Non-admin users are restricted to read-only access, in both GitLab UI and API."
msgstr ""
msgid "None"
@@ -22946,7 +23253,7 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
-msgid "Notes Rate Limits"
+msgid "Notes rate limit"
msgstr ""
msgid "Notes|Are you sure you want to cancel creating this comment?"
@@ -23113,9 +23420,6 @@ msgstr ""
msgid "November"
msgstr ""
-msgid "Novice"
-msgstr ""
-
msgid "Now, personalize your GitLab experience"
msgstr ""
@@ -23284,7 +23588,7 @@ msgstr ""
msgid "OnCallSchedules|For this rotation, on-call will be:"
msgstr ""
-msgid "OnCallSchedules|On-call schedule %{schedule} in Project %{project}"
+msgid "OnCallSchedules|On-call schedule %{obstacle} in Project %{project}"
msgstr ""
msgid "OnCallSchedules|On-call schedules"
@@ -23431,22 +23735,22 @@ msgstr ""
msgid "OnDemandScans|Scanner profile"
msgstr ""
-msgid "OnDemandScans|Select one of the existing profiles"
+msgid "OnDemandScans|Schedule scan"
msgstr ""
-msgid "OnDemandScans|Site profile"
+msgid "OnDemandScans|Select one of the existing profiles"
msgstr ""
-msgid "OnDemandScans|Use existing scanner profile"
+msgid "OnDemandScans|Site profile"
msgstr ""
-msgid "OnDemandScans|Use existing site profile"
+msgid "OnDemandScans|Start time"
msgstr ""
-msgid "OnDemandScans|You can either choose a passive scan or validate the target site in your chosen site profile. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
+msgid "OnDemandScans|Use existing scanner profile"
msgstr ""
-msgid "OnDemandScans|You cannot run an active scan against an unvalidated site."
+msgid "OnDemandScans|Use existing site profile"
msgstr ""
msgid "OnDemandScans|You must create a repository within your project to run an on-demand scan."
@@ -23511,6 +23815,9 @@ msgstr ""
msgid "Only admins can delete project"
msgstr ""
+msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
+msgstr ""
+
msgid "Only include features new to your current subscription tier."
msgstr ""
@@ -23529,6 +23836,12 @@ msgstr ""
msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
+msgid "Only reCAPTCHA v2 is supported:"
+msgstr ""
+
+msgid "Only users from the specified IP address ranges are able to reach this group, including all subgroups, projects, and Git repositories."
+msgstr ""
+
msgid "Only verified users with an email address in any of these domains can be added to the group."
msgstr ""
@@ -23715,9 +24028,6 @@ msgstr ""
msgid "Package Registry"
msgstr ""
-msgid "Package Registry Rate Limits"
-msgstr ""
-
msgid "Package Registry: authenticated API requests"
msgstr ""
@@ -23736,6 +24046,9 @@ msgstr ""
msgid "Package recipe already exists"
msgstr ""
+msgid "Package registry rate limits"
+msgstr ""
+
msgid "Package type"
msgstr ""
@@ -23802,6 +24115,9 @@ msgstr ""
msgid "PackageRegistry|Composer"
msgstr ""
+msgid "PackageRegistry|Composer.json with license: %{license} and version: %{version}"
+msgstr ""
+
msgid "PackageRegistry|Conan"
msgstr ""
@@ -23865,6 +24181,9 @@ msgstr ""
msgid "PackageRegistry|Copy require package include"
msgstr ""
+msgid "PackageRegistry|Copy target SHA"
+msgstr ""
+
msgid "PackageRegistry|Copy yarn command"
msgstr ""
@@ -23931,6 +24250,9 @@ msgstr ""
msgid "PackageRegistry|Install package version"
msgstr ""
+msgid "PackageRegistry|Instance-level"
+msgstr ""
+
msgid "PackageRegistry|Invalid Package: failed metadata extraction"
msgstr ""
@@ -23976,6 +24298,9 @@ msgstr ""
msgid "PackageRegistry|Pip Command"
msgstr ""
+msgid "PackageRegistry|Project-level"
+msgstr ""
+
msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
msgstr ""
@@ -23997,6 +24322,9 @@ msgstr ""
msgid "PackageRegistry|Remove package"
msgstr ""
+msgid "PackageRegistry|Required Python: %{pythonVersion}"
+msgstr ""
+
msgid "PackageRegistry|RubyGems"
msgstr ""
@@ -24039,6 +24367,9 @@ msgstr ""
msgid "PackageRegistry|Source project located at %{link}"
msgstr ""
+msgid "PackageRegistry|Target SHA: %{sha}"
+msgstr ""
+
msgid "PackageRegistry|There are no other versions of this package."
msgstr ""
@@ -24207,6 +24538,18 @@ msgstr ""
msgid "Password was successfully updated. Please sign in again."
msgstr ""
+msgid "PasswordPrompt|Confirm password"
+msgstr ""
+
+msgid "PasswordPrompt|Confirm password to continue"
+msgstr ""
+
+msgid "PasswordPrompt|Password is required"
+msgstr ""
+
+msgid "PasswordPrompt|Please enter your password to confirm"
+msgstr ""
+
msgid "Passwords should be unique and not used for any other sites or services."
msgstr ""
@@ -24234,6 +24577,9 @@ msgstr ""
msgid "Paste project path (i.e. gitlab-org/gitlab)"
msgstr ""
+msgid "Paste this DSN into your Sentry SDK"
+msgstr ""
+
msgid "Paste your public SSH key, which is usually contained in the file '~/.ssh/id_ed25519.pub' or '~/.ssh/id_rsa.pub' and begins with 'ssh-ed25519' or 'ssh-rsa'. Do not paste your private SSH key, as that can compromise your identity."
msgstr ""
@@ -24318,6 +24664,9 @@ msgstr ""
msgid "PerformanceBar|First Contentful Paint"
msgstr ""
+msgid "PerformanceBar|Flamegraph with mode:"
+msgstr ""
+
msgid "PerformanceBar|Frontend resources"
msgstr ""
@@ -24351,6 +24700,15 @@ msgstr ""
msgid "PerformanceBar|Trace"
msgstr ""
+msgid "PerformanceBar|cpu"
+msgstr ""
+
+msgid "PerformanceBar|object"
+msgstr ""
+
+msgid "PerformanceBar|wall"
+msgstr ""
+
msgid "Period in seconds"
msgstr ""
@@ -24579,6 +24937,48 @@ msgstr ""
msgid "PipelineSchedules|Variables"
msgstr ""
+msgid "PipelineSource|API"
+msgstr ""
+
+msgid "PipelineSource|Chat"
+msgstr ""
+
+msgid "PipelineSource|External"
+msgstr ""
+
+msgid "PipelineSource|External Pull Request"
+msgstr ""
+
+msgid "PipelineSource|Merge Request"
+msgstr ""
+
+msgid "PipelineSource|On-Demand DAST Scan"
+msgstr ""
+
+msgid "PipelineSource|On-Demand DAST Validation"
+msgstr ""
+
+msgid "PipelineSource|Parent Pipeline"
+msgstr ""
+
+msgid "PipelineSource|Pipeline"
+msgstr ""
+
+msgid "PipelineSource|Push"
+msgstr ""
+
+msgid "PipelineSource|Schedule"
+msgstr ""
+
+msgid "PipelineSource|Trigger"
+msgstr ""
+
+msgid "PipelineSource|Web"
+msgstr ""
+
+msgid "PipelineSource|Web IDE"
+msgstr ""
+
msgid "PipelineStatusTooltip|Pipeline: %{ciStatus}"
msgstr ""
@@ -24879,46 +25279,7 @@ msgstr ""
msgid "Pipeline|Source"
msgstr ""
-msgid "Pipeline|Source|API"
-msgstr ""
-
-msgid "Pipeline|Source|Chat"
-msgstr ""
-
-msgid "Pipeline|Source|External"
-msgstr ""
-
-msgid "Pipeline|Source|External Pull Request"
-msgstr ""
-
-msgid "Pipeline|Source|Merge Request"
-msgstr ""
-
-msgid "Pipeline|Source|On-Demand DAST Scan"
-msgstr ""
-
-msgid "Pipeline|Source|On-Demand DAST Validation"
-msgstr ""
-
-msgid "Pipeline|Source|Parent Pipeline"
-msgstr ""
-
-msgid "Pipeline|Source|Pipeline"
-msgstr ""
-
-msgid "Pipeline|Source|Push"
-msgstr ""
-
-msgid "Pipeline|Source|Schedule"
-msgstr ""
-
-msgid "Pipeline|Source|Trigger"
-msgstr ""
-
-msgid "Pipeline|Source|Web"
-msgstr ""
-
-msgid "Pipeline|Source|Web IDE"
+msgid "Pipeline|Source|Security Policy"
msgstr ""
msgid "Pipeline|Specify variable values to be used in this run. The values specified in %{linkStart}CI/CD settings%{linkEnd} will be used by default."
@@ -24969,7 +25330,7 @@ msgstr ""
msgid "Pipeline|We are currently unable to fetch pipeline data"
msgstr ""
-msgid "Pipeline|You’re about to stop pipeline %{pipelineId}."
+msgid "Pipeline|You’re about to stop pipeline #%{pipelineId}."
msgstr ""
msgid "Pipeline|for"
@@ -24996,6 +25357,9 @@ msgstr ""
msgid "Plain diff"
msgstr ""
+msgid "Plain-text response to send to clients that hit a rate limit"
+msgstr ""
+
msgid "Plan:"
msgstr ""
@@ -25140,9 +25504,6 @@ msgstr ""
msgid "Please provide attributes to update"
msgstr ""
-msgid "Please provide your username or email address."
-msgstr ""
-
msgid "Please reach out if you have any questions and we'll be happy to assist."
msgstr ""
@@ -25185,9 +25546,6 @@ msgstr ""
msgid "Please set a new password before proceeding."
msgstr ""
-msgid "Please share your feedback about %{featureName} %{linkStart}in this issue%{linkEnd} to help us improve the experience."
-msgstr ""
-
msgid "Please solve the captcha"
msgstr ""
@@ -25365,6 +25723,9 @@ msgstr ""
msgid "Prevent adding new members to project membership within this group"
msgstr ""
+msgid "Prevent auto-stopping"
+msgstr ""
+
msgid "Prevent editing approval rules in projects and merge requests."
msgstr ""
@@ -25377,7 +25738,7 @@ msgstr ""
msgid "Prevent users from changing their profile name"
msgstr ""
-msgid "Prevent users from performing write operations on GitLab while performing maintenance."
+msgid "Prevent users from performing write operations while GitLab maintenance is in progress."
msgstr ""
msgid "Preview"
@@ -25650,6 +26011,9 @@ msgstr ""
msgid "Profiles|Enter your name, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Enter your password to confirm the email change"
+msgstr ""
+
msgid "Profiles|Enter your pronouns to let people know how to refer to you"
msgstr ""
@@ -25884,10 +26248,10 @@ msgstr ""
msgid "Profiles|e.g. My MacBook key"
msgstr ""
-msgid "Profiles|username"
+msgid "Profiles|https://website.com"
msgstr ""
-msgid "Profiles|website.com"
+msgid "Profiles|username"
msgstr ""
msgid "Profiles|your account"
@@ -26130,9 +26494,21 @@ msgstr ""
msgid "ProjectSelect| or group"
msgstr ""
+msgid "ProjectSelect|No matching results"
+msgstr ""
+
msgid "ProjectSelect|Search for project"
msgstr ""
+msgid "ProjectSelect|Search projects"
+msgstr ""
+
+msgid "ProjectSelect|Select a project"
+msgstr ""
+
+msgid "ProjectSelect|There was an error fetching the projects. Please try again."
+msgstr ""
+
msgid "ProjectService|Drone server URL"
msgstr ""
@@ -26220,6 +26596,9 @@ msgstr ""
msgid "ProjectService|Trigger event when a new, unique alert is recorded."
msgstr ""
+msgid "ProjectService|Trigger event when a new, unique vulnerability is recorded. (Note: This feature requires an Ultimate plan.)"
+msgstr ""
+
msgid "ProjectService|Trigger event when a pipeline status changes."
msgstr ""
@@ -26634,9 +27013,15 @@ msgstr ""
msgid "Projects are graded based on the highest severity vulnerability present"
msgstr ""
+msgid "Projects are organized into groups"
+msgstr ""
+
msgid "Projects contributed to"
msgstr ""
+msgid "Projects help you organize your work. They contain your file repository, issues, merge requests, and so much more."
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr ""
@@ -26871,10 +27256,10 @@ msgstr ""
msgid "PrometheusService|Prometheus cluster integration"
msgstr ""
-msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
+msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
msgstr ""
-msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
+msgid "PrometheusService|The ID of the IAP-secured resource."
msgstr ""
msgid "PrometheusService|The Prometheus API base URL."
@@ -27492,6 +27877,9 @@ msgstr ""
msgid "Rate limit"
msgstr ""
+msgid "Rate limits can help reduce request volume (like from crawlers or abusive bots)."
+msgstr ""
+
msgid "Raw blob request rate limit per minute"
msgstr ""
@@ -27504,6 +27892,9 @@ msgstr ""
msgid "Re-authentication required"
msgstr ""
+msgid "Re-import"
+msgstr ""
+
msgid "Re-request review"
msgstr ""
@@ -27525,6 +27916,9 @@ msgstr ""
msgid "Read more about related issues"
msgstr ""
+msgid "Read their documentation."
+msgstr ""
+
msgid "Ready to get started with GitLab? Follow these steps to set up your workspace, plan and commit changes, and deploy your project."
msgstr ""
@@ -27558,6 +27952,9 @@ msgstr ""
msgid "Receive any notifications from GitLab."
msgstr ""
+msgid "Receive notification of abuse reports by email."
+msgstr ""
+
msgid "Receive notifications about your own activity"
msgstr ""
@@ -27701,9 +28098,6 @@ msgstr ""
msgid "Registry setup"
msgstr ""
-msgid "Regulate approvals by authors/committers. Affects all projects."
-msgstr ""
-
msgid "Reindexing Status: %{status} (Slice multiplier: %{multiplier}, Maximum running slices: %{max_slices})"
msgstr ""
@@ -27799,6 +28193,9 @@ msgstr ""
msgid "Release|Something went wrong while saving the release details."
msgstr ""
+msgid "Reload page"
+msgstr ""
+
msgid "Remediations"
msgstr ""
@@ -28081,6 +28478,9 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
+msgid "Repeats"
+msgstr ""
+
msgid "Replace"
msgstr ""
@@ -28443,10 +28843,7 @@ msgstr ""
msgid "Require additional authentication for administrative tasks."
msgstr ""
-msgid "Require all users in this group to setup Two-factor authentication"
-msgstr ""
-
-msgid "Require all users in this group to setup two-factor authentication"
+msgid "Require all users in this group to set up two-factor authentication"
msgstr ""
msgid "Required approvals (%{approvals_given} given)"
@@ -28492,6 +28889,9 @@ msgstr[1] ""
msgid "Requires values to meet regular expression requirements."
msgstr ""
+msgid "Requires you to deploy or set up cloud-hosted Sentry."
+msgstr ""
+
msgid "Requires your primary GitLab email address."
msgstr ""
@@ -28552,9 +28952,6 @@ msgstr ""
msgid "Resolve"
msgstr ""
-msgid "Resolve all threads in new issue"
-msgstr ""
-
msgid "Resolve conflicts"
msgstr ""
@@ -28612,6 +29009,9 @@ msgstr ""
msgid "Response text"
msgstr ""
+msgid "Restart GitLab to apply changes."
+msgstr ""
+
msgid "Restart Terminal"
msgstr ""
@@ -28630,6 +29030,9 @@ msgstr ""
msgid "Restoring the project will prevent the project from being removed on this date and restore people's ability to make changes to it."
msgstr ""
+msgid "Restrict group access by IP address. %{link_start}Learn more%{link_end}."
+msgstr ""
+
msgid "Restrict membership by email domain"
msgstr ""
@@ -28943,6 +29346,9 @@ msgstr ""
msgid "Runners|Runner #%{runner_id}"
msgstr ""
+msgid "Runners|Runner assigned to project."
+msgstr ""
+
msgid "Runners|Runner is offline, last contact was %{runner_contact} ago"
msgstr ""
@@ -28955,6 +29361,9 @@ msgstr ""
msgid "Runners|Runner registration"
msgstr ""
+msgid "Runners|Runner unassigned from project."
+msgstr ""
+
msgid "Runners|Runners"
msgstr ""
@@ -29147,7 +29556,7 @@ msgstr ""
msgid "SastEntryPoints|How do I set up SAST?"
msgstr ""
-msgid "SastEntryPoints|Learn more."
+msgid "SastEntryPoints|Learn more"
msgstr ""
msgid "Satisfied"
@@ -29189,7 +29598,7 @@ msgstr ""
msgid "Save pipeline schedule"
msgstr ""
-msgid "Save space and find images in the container Registry. remove unneeded tags and keep only the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
+msgid "Save storage space by automatically deleting tags from the container registry and keeping the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
msgstr ""
msgid "Saving"
@@ -29363,6 +29772,9 @@ msgstr ""
msgid "Search or filter results…"
msgstr ""
+msgid "Search or jump to..."
+msgstr ""
+
msgid "Search project"
msgstr ""
@@ -29423,16 +29835,16 @@ msgstr ""
msgid "SearchCodeResults|of %{link_to_project}"
msgstr ""
-msgid "SearchResults|Showing %{count} %{scope} for%{term_element}"
+msgid "SearchResults|Showing %{count} %{scope} for %{term_element}"
msgstr ""
-msgid "SearchResults|Showing %{count} %{scope} for%{term_element} in your personal and project snippets"
+msgid "SearchResults|Showing %{count} %{scope} for %{term_element} in your personal and project snippets"
msgstr ""
-msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for%{term_element}"
+msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for %{term_element}"
msgstr ""
-msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for%{term_element} in your personal and project snippets"
+msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for %{term_element} in your personal and project snippets"
msgstr ""
msgid "SearchResults|code result"
@@ -29514,6 +29926,9 @@ msgstr ""
msgid "Secret Detection"
msgstr ""
+msgid "Secret access key"
+msgstr ""
+
msgid "Secret token"
msgstr ""
@@ -29553,9 +29968,6 @@ msgstr ""
msgid "SecurityApprovals|A merge request approval is required when the license compliance report contains a denied license."
msgstr ""
-msgid "SecurityApprovals|Configurable if security scanners are enabled. %{linkStart}Learn more.%{linkEnd}"
-msgstr ""
-
msgid "SecurityApprovals|Coverage-Check"
msgstr ""
@@ -29568,24 +29980,18 @@ msgstr ""
msgid "SecurityApprovals|Learn more about Vulnerability-Check"
msgstr ""
-msgid "SecurityApprovals|License Scanning must be enabled. %{linkStart}Learn more%{linkEnd}."
-msgstr ""
-
msgid "SecurityApprovals|License-Check"
msgstr ""
msgid "SecurityApprovals|Requires approval for Denied licenses. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}More information%{linkEnd}"
+msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "SecurityApprovals|Requires approval for vulnerabilities. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
-msgid "SecurityApprovals|Test coverage must be enabled. %{linkStart}Learn more%{linkEnd}."
-msgstr ""
-
msgid "SecurityApprovals|Vulnerability-Check"
msgstr ""
@@ -29649,6 +30055,12 @@ msgstr ""
msgid "SecurityConfiguration|Immediately begin risk analysis and remediation with application security features. Start with SAST and Secret Detection, available to all plans. Upgrade to Ultimate to get all features, including:"
msgstr ""
+msgid "SecurityConfiguration|Manage corpus"
+msgstr ""
+
+msgid "SecurityConfiguration|Manage corpus files used as mutation sources in coverage fuzzing."
+msgstr ""
+
msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
msgstr ""
@@ -29703,6 +30115,12 @@ msgstr ""
msgid "SecurityOrchestration|Action"
msgstr ""
+msgid "SecurityOrchestration|Actions"
+msgstr ""
+
+msgid "SecurityOrchestration|Add rule"
+msgstr ""
+
msgid "SecurityOrchestration|All policies"
msgstr ""
@@ -29736,9 +30154,6 @@ msgstr ""
msgid "SecurityOrchestration|Network"
msgstr ""
-msgid "SecurityOrchestration|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
-msgstr ""
-
msgid "SecurityOrchestration|New policy"
msgstr ""
@@ -29754,6 +30169,9 @@ msgstr ""
msgid "SecurityOrchestration|Policy editor"
msgstr ""
+msgid "SecurityOrchestration|Policy preview"
+msgstr ""
+
msgid "SecurityOrchestration|Policy status"
msgstr ""
@@ -29763,6 +30181,9 @@ msgstr ""
msgid "SecurityOrchestration|Rule"
msgstr ""
+msgid "SecurityOrchestration|Rules"
+msgstr ""
+
msgid "SecurityOrchestration|Scan Execution"
msgstr ""
@@ -29856,6 +30277,9 @@ msgstr ""
msgid "SecurityReports|Create issue"
msgstr ""
+msgid "SecurityReports|Development vulnerabilities"
+msgstr ""
+
msgid "SecurityReports|Dismiss vulnerability"
msgstr ""
@@ -29871,6 +30295,9 @@ msgstr ""
msgid "SecurityReports|Download results"
msgstr ""
+msgid "SecurityReports|Download scanned URLs"
+msgstr ""
+
msgid "SecurityReports|Download scanned resources"
msgstr ""
@@ -29994,6 +30421,9 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
+msgid "SecurityReports|The Vulnerability Report shows the results of the lastest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "SecurityReports|The security reports below contain one or more vulnerability findings that could not be parsed and were not recorded. Download the artifacts in the job output to investigate. Ensure any security report created conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
msgstr ""
@@ -30135,10 +30565,10 @@ msgstr ""
msgid "Select a repository"
msgstr ""
-msgid "Select a role"
+msgid "Select a repository containing templates for common files."
msgstr ""
-msgid "Select a shared template repository for all projects on this instance."
+msgid "Select a role"
msgstr ""
msgid "Select a template repository"
@@ -30216,6 +30646,9 @@ msgstr ""
msgid "Select project to choose zone"
msgstr ""
+msgid "Select project to create issue"
+msgstr ""
+
msgid "Select projects"
msgstr ""
@@ -30333,6 +30766,9 @@ msgstr ""
msgid "Send emails to help guide new users through the onboarding process."
msgstr ""
+msgid "Send emails to users upon account deactivation."
+msgstr ""
+
msgid "Send message"
msgstr ""
@@ -30351,6 +30787,9 @@ msgstr ""
msgid "Send service data"
msgstr ""
+msgid "Sentry"
+msgstr ""
+
msgid "Sentry API URL"
msgstr ""
@@ -30465,6 +30904,9 @@ msgstr ""
msgid "Service"
msgstr ""
+msgid "Service Accounts keys are required to authorize GitLab to deploy your Google Cloud project."
+msgstr ""
+
msgid "Service Desk"
msgstr ""
@@ -30537,15 +30979,15 @@ msgstr ""
msgid "Set a password on your account to pull or push via %{protocol}."
msgstr ""
-msgid "Set a template repository for projects in this group"
-msgstr ""
-
msgid "Set access permissions for this token."
msgstr ""
msgid "Set an instance-wide domain that will be available to all clusters when installing Knative."
msgstr ""
+msgid "Set any rate limit to %{code_open}0%{code_close} to disable the limit."
+msgstr ""
+
msgid "Set default and restrict visibility levels. Configure import sources and git access protocol."
msgstr ""
@@ -30558,7 +31000,7 @@ msgstr ""
msgid "Set limit to 0 to allow any file size."
msgstr ""
-msgid "Set max session time for web terminal."
+msgid "Set limits for web and API requests."
msgstr ""
msgid "Set milestone"
@@ -30567,15 +31009,18 @@ msgstr ""
msgid "Set new password"
msgstr ""
-msgid "Set notification email for abuse reports."
+msgid "Set parent epic to an epic"
msgstr ""
-msgid "Set parent epic to an epic"
+msgid "Set per-user rate limits for imports and exports of projects and groups."
msgstr ""
msgid "Set projects and maximum size limits, session duration, user options, and check feature availability for namespace plan."
msgstr ""
+msgid "Set rate limits for package registry API requests that supersede the general user and IP rate limits."
+msgstr ""
+
msgid "Set severity"
msgstr ""
@@ -30594,15 +31039,24 @@ msgstr ""
msgid "Set the default branch for this project. All merge requests and commits are made against this branch unless you specify a different one."
msgstr ""
+msgid "Set the default expiration time for job artifacts in all projects. Set to %{code_open}0%{code_close} to never expire artifacts by default. If no unit is written, it defaults to seconds. For example, these are all equivalent: %{code_open}3600%{code_close}, %{code_open}60 minutes%{code_close}, or %{code_open}one hour%{code_close}."
+msgstr ""
+
msgid "Set the due date to %{due_date}."
msgstr ""
msgid "Set the iteration to %{iteration_reference}."
msgstr ""
+msgid "Set the maximum session time for a web terminal."
+msgstr ""
+
msgid "Set the milestone to %{milestone_reference}."
msgstr ""
+msgid "Set the per-user rate limit for notes created by web or API requests."
+msgstr ""
+
msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
msgstr ""
@@ -30804,6 +31258,9 @@ msgstr ""
msgid "Show Pipeline IID"
msgstr ""
+msgid "Show all %{issuable_type}."
+msgstr ""
+
msgid "Show all activity"
msgstr ""
@@ -30855,15 +31312,9 @@ msgstr ""
msgid "Show list"
msgstr ""
-msgid "Show me advanced features"
-msgstr ""
-
msgid "Show me how to add a pipeline"
msgstr ""
-msgid "Show me the basics"
-msgstr ""
-
msgid "Show one file at a time"
msgstr ""
@@ -30904,15 +31355,15 @@ msgstr ""
msgid "Showing %{pageSize} of %{total} %{issuableType}"
msgstr ""
-msgid "Showing %{pageSize} of %{total} issues"
-msgstr ""
-
msgid "Showing all epics"
msgstr ""
msgid "Showing all issues"
msgstr ""
+msgid "Showing data for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
+msgstr ""
+
msgid "Showing data for workflow items created in this date range. Date range cannot exceed %{maxDateRange} days."
msgstr ""
@@ -30952,6 +31403,15 @@ msgstr ""
msgid "Sidebar|Weight"
msgstr ""
+msgid "Sidekiq job compression threshold (bytes)"
+msgstr ""
+
+msgid "Sidekiq job size limit (bytes)"
+msgstr ""
+
+msgid "Sidekiq job size limits"
+msgstr ""
+
msgid "Sign in"
msgstr ""
@@ -31072,6 +31532,9 @@ msgstr ""
msgid "Site profile not found for given parameters"
msgstr ""
+msgid "Sites"
+msgstr ""
+
msgid "Size"
msgstr ""
@@ -31102,19 +31565,22 @@ msgstr ""
msgid "SlackIntegration|Sends notifications about project events to Slack channels."
msgstr ""
-msgid "SlackService|2. Paste the %{strong_open}Token%{strong_close} into the field below"
+msgid "SlackService|1. %{slash_command_link_start}Add a slash command%{slash_command_link_end} in your Slack team using this information:"
msgstr ""
-msgid "SlackService|3. Select the %{strong_open}Active%{strong_close} checkbox, press %{strong_open}Save changes%{strong_close} and start using GitLab inside Slack!"
+msgid "SlackService|2. Paste the token from Slack in the %{strong_open}Token%{strong_close} field below."
msgstr ""
-msgid "SlackService|Fill in the word that works best for your team."
+msgid "SlackService|3. Select the %{strong_open}Active%{strong_close} checkbox, select %{strong_open}Save changes%{strong_close}, and start using slash commands in Slack!"
+msgstr ""
+
+msgid "SlackService|After setup, get a list of available Slack slash commands by entering"
msgstr ""
-msgid "SlackService|See list of available commands in Slack after setting up this service, by entering"
+msgid "SlackService|Fill in the word that works best for your team."
msgstr ""
-msgid "SlackService|This service allows users to perform common operations on this project by entering slash commands in Slack."
+msgid "SlackService|Perform common operations in this project by entering slash commands in Slack."
msgstr ""
msgid "Slice multiplier"
@@ -31180,7 +31646,7 @@ msgstr ""
msgid "Some child epics may be hidden due to applied filters"
msgstr ""
-msgid "Some common domains are not allowed. %{read_more_link}."
+msgid "Some common domains are not allowed. %{learn_more_link}."
msgstr ""
msgid "Some of the designs you tried uploading did not change:"
@@ -31264,9 +31730,6 @@ msgstr ""
msgid "Something went wrong while exporting requirements"
msgstr ""
-msgid "Something went wrong while fetching %{listType} list"
-msgstr ""
-
msgid "Something went wrong while fetching branches"
msgstr ""
@@ -31321,15 +31784,9 @@ msgstr ""
msgid "Something went wrong while merging this merge request. Please try again."
msgstr ""
-msgid "Something went wrong while moving issues."
-msgstr ""
-
msgid "Something went wrong while obtaining the Let's Encrypt certificate."
msgstr ""
-msgid "Something went wrong while performing the action."
-msgstr ""
-
msgid "Something went wrong while promoting the issue to an epic. Please try again."
msgstr ""
@@ -31657,7 +32114,10 @@ msgstr ""
msgid "SourcegraphPreferences|Uses a custom %{linkStart}Sourcegraph instance%{linkEnd}."
msgstr ""
-msgid "Spam Check API Key"
+msgid "Spam Check"
+msgstr ""
+
+msgid "Spam Check API key"
msgstr ""
msgid "Spam Logs"
@@ -31675,7 +32135,7 @@ msgstr ""
msgid "Specified URL cannot be used: \"%{reason}\""
msgstr ""
-msgid "Specify an e-mail address regex pattern to identify default internal users."
+msgid "Specify an email address regex pattern to identify default internal users."
msgstr ""
msgid "Speed up your pipelines with Needs relationships"
@@ -31930,7 +32390,7 @@ msgstr ""
msgid "StatusCheck|An error occurred fetching the status checks."
msgstr ""
-msgid "StatusCheck|Apply this status check to any branch or a specific protected branch."
+msgid "StatusCheck|Apply this status check to all branches or a specific protected branch."
msgstr ""
msgid "StatusCheck|Check for a status response in Merge Requests. Failures do not block merges. %{link_start}Learn more%{link_end}."
@@ -32269,6 +32729,9 @@ msgstr ""
msgid "Subscriptions"
msgstr ""
+msgid "Subscription|Your subscription for %{strong}%{namespace_name}%{strong_close} has expired and you are now on %{pricing_link_start}the GitLab Free tier%{pricing_link_end}. Don't worry, your data is safe. Get in touch with our support team (%{support_email}). They'll gladly help with your subscription renewal."
+msgstr ""
+
msgid "Subtracted"
msgstr ""
@@ -32497,6 +32960,9 @@ msgstr ""
msgid "SuperSonics|Plan"
msgstr ""
+msgid "SuperSonics|Please agree to the Subscription Agreement"
+msgstr ""
+
msgid "SuperSonics|Ready to get started? A GitLab plan is ideal for scaling organizations and for multi team usage."
msgstr ""
@@ -32527,6 +32993,9 @@ msgstr ""
msgid "SuperSonics|The activation code is not valid. Please make sure to copy it exactly from the Customers Portal or confirmation email. Learn more about %{linkStart}activating your subscription%{linkEnd}."
msgstr ""
+msgid "SuperSonics|The activation code should be a 24-character alphanumeric string"
+msgstr ""
+
msgid "SuperSonics|There is a connectivity issue."
msgstr ""
@@ -32569,9 +33038,15 @@ msgstr ""
msgid "SuperSonics|You do not have an active subscription"
msgstr ""
+msgid "SuperSonics|You have successfully added a license that activates on %{date}. Please see the subscription history table below for more details."
+msgstr ""
+
msgid "SuperSonics|You'll be charged for %{trueUpLinkStart}users over license%{trueUpLinkEnd} on a quarterly or annual basis, depending on the terms of your agreement."
msgstr ""
+msgid "SuperSonics|Your future dated license was successfully added"
+msgstr ""
+
msgid "SuperSonics|Your subscription"
msgstr ""
@@ -32824,7 +33299,7 @@ msgstr ""
msgid "Template to append to all Service Desk issues"
msgstr ""
-msgid "TemplateRepository|Select a repository to make its templates available to all projects. %{link_start}What should the repository contain?%{link_end} "
+msgid "TemplateRepository|Create common files more quickly, and standardize their format."
msgstr ""
msgid "Templates"
@@ -33030,7 +33505,7 @@ msgstr ""
msgid "TestCases|Search test cases"
msgstr ""
-msgid "TestCases|Something went wrong while adding test case to Todo."
+msgid "TestCases|Something went wrong while adding test case to a to-do item."
msgstr ""
msgid "TestCases|Something went wrong while creating a test case."
@@ -33042,7 +33517,7 @@ msgstr ""
msgid "TestCases|Something went wrong while fetching test cases list."
msgstr ""
-msgid "TestCases|Something went wrong while marking test case todo as done."
+msgid "TestCases|Something went wrong while marking test case to-do item as done."
msgstr ""
msgid "TestCases|Something went wrong while moving test case."
@@ -33162,7 +33637,7 @@ msgstr ""
msgid "Thanks for your purchase!"
msgstr ""
-msgid "That is ok, I do not want to renew"
+msgid "That's OK, I don't want to renew"
msgstr ""
msgid "That's it, well done!"
@@ -33185,7 +33660,7 @@ msgid_plural "The %{type} contains the following errors:"
msgstr[0] ""
msgstr[1] ""
-msgid "The API key used by GitLab for accessing the Spam Check service endpoint"
+msgid "The API key used by GitLab for accessing the Spam Check service endpoint."
msgstr ""
msgid "The GitLab subscription service (customers.gitlab.com) is currently experiencing an outage. You can monitor the status and get updates at %{linkStart}status.gitlab.com%{linkEnd}."
@@ -33224,9 +33699,6 @@ msgstr ""
msgid "The URL to use for connecting to Elasticsearch. Use a comma-separated list to support clustering (e.g., \"http://localhost:9200, http://localhost:9201\")."
msgstr ""
-msgid "The Vulnerability Report shows the results of the last successful pipeline run on the default branch."
-msgstr ""
-
msgid "The X509 Certificate to use when mutual TLS is required to communicate with the external authorization service. If left blank, the server certificate is still validated when accessing over HTTPS."
msgstr ""
@@ -33284,9 +33756,6 @@ msgstr ""
msgid "The default branch for this project has been changed. Please update your bookmarks."
msgstr ""
-msgid "The default expiration time for job artifacts. 0 for unlimited. The default unit is in seconds, but you can use other units, for example %{code_open}4 mins 2 sec%{code_close}, %{code_open}2h42min%{code_close}."
-msgstr ""
-
msgid "The dependency list details information about the components used within your project."
msgstr ""
@@ -33478,9 +33947,6 @@ msgstr ""
msgid "The merge conflicts for this merge request have already been resolved. Please return to the merge request."
msgstr ""
-msgid "The merge request can now be merged."
-msgstr ""
-
msgid "The metric must be one of %{metrics}."
msgstr ""
@@ -33856,7 +34322,7 @@ msgstr ""
msgid "There was a problem updating the keep latest artifacts setting."
msgstr ""
-msgid "There was an error %{message} todo."
+msgid "There was an error %{message} to-do item."
msgstr ""
msgid "There was an error adding a To Do."
@@ -33895,6 +34361,9 @@ msgstr ""
msgid "There was an error fetching projects"
msgstr ""
+msgid "There was an error fetching search autocomplete suggestions"
+msgstr ""
+
msgid "There was an error fetching stage total counts"
msgstr ""
@@ -34219,6 +34688,9 @@ msgstr ""
msgid "This field is required."
msgstr ""
+msgid "This form is disabled in preview"
+msgstr ""
+
msgid "This group"
msgstr ""
@@ -34240,9 +34712,6 @@ msgstr ""
msgid "This group is linked to a subscription"
msgstr ""
-msgid "This group, including all subgroups, projects and git repositories, will be reachable from only the specified IP address ranges."
-msgstr ""
-
msgid "This group, its subgroups and projects has been scheduled for removal on %{date}."
msgstr ""
@@ -34522,9 +34991,6 @@ msgstr ""
msgid "This user cannot be unlocked manually from GitLab"
msgstr ""
-msgid "This user does not have a pending request"
-msgstr ""
-
msgid "This user has an unconfirmed email address (%{email}). You may force a confirmation."
msgstr ""
@@ -34633,9 +35099,6 @@ msgstr ""
msgid "ThreatMonitoring|Packet Activity"
msgstr ""
-msgid "ThreatMonitoring|Policies"
-msgstr ""
-
msgid "ThreatMonitoring|Requests"
msgstr ""
@@ -34687,6 +35150,12 @@ msgstr ""
msgid "ThreatMonitoring|View documentation"
msgstr ""
+msgid "Threshold in bytes at which to compress Sidekiq job arguments."
+msgstr ""
+
+msgid "Threshold in bytes at which to reject Sidekiq jobs. Set this to 0 to if you don't want to limit Sidekiq jobs."
+msgstr ""
+
msgid "Throughput"
msgstr ""
@@ -34696,6 +35165,9 @@ msgstr ""
msgid "Time"
msgstr ""
+msgid "Time (in hours) that users are allowed to skip forced configuration of two-factor authentication."
+msgstr ""
+
msgid "Time Spent"
msgstr ""
@@ -34762,7 +35234,7 @@ msgstr ""
msgid "TimeTrackingEstimated|Est"
msgstr ""
-msgid "TimeTracking|%{startTag}Spent: %{endTag}%{timeSpentHumanReadable}"
+msgid "TimeTracking|%{spentStart}Spent: %{spentEnd}"
msgstr ""
msgid "TimeTracking|Estimated:"
@@ -34976,6 +35448,9 @@ msgstr ""
msgid "To access this domain create a new DNS record"
msgstr ""
+msgid "To add a custom suffix, set up a Service Desk email address. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "To add an SSH key you need to %{generate_link_start}generate one%{link_end} or use an %{existing_link_start}existing key%{link_end}."
msgstr ""
@@ -34997,13 +35472,16 @@ msgstr ""
msgid "To connect an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To continue using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
+msgstr ""
+
msgid "To continue, you need to select the link in the confirmation email we sent to verify your email address. If you didn't get our email, select %{strongStart}Resend confirmation email.%{strongEnd}"
msgstr ""
msgid "To define internal users, first enable new users set to external"
msgstr ""
-msgid "To enable Registration Features, make sure \"Enable service ping\" is checked."
+msgid "To enable Registration Features, first enable Service Ping."
msgstr ""
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
@@ -35030,7 +35508,7 @@ msgstr ""
msgid "To get started, use the link below to confirm your account."
msgstr ""
-msgid "To help improve GitLab and its user experience, GitLab will periodically collect usage information."
+msgid "To help improve GitLab and its user experience, GitLab periodically collects usage information."
msgstr ""
msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
@@ -35063,7 +35541,7 @@ msgstr ""
msgid "To preserve performance only %{strong_open}%{display_size} of %{real_size}%{strong_close} files are displayed."
msgstr ""
-msgid "To protect this issue's confidentiality, %{forkLink} and set the fork's visibility to private."
+msgid "To protect this issue's confidentiality, %{linkStart}fork this project%{linkEnd} and set the fork's visibility to private."
msgstr ""
msgid "To protect this issue's confidentiality, a private fork of this project was selected."
@@ -35096,12 +35574,15 @@ msgstr ""
msgid "To set up SAML authentication for your group through an identity provider like Azure, Okta, Onelogin, Ping Identity, or your custom SAML 2.0 provider:"
msgstr ""
-msgid "To set up this service:"
+msgid "To set up this integration:"
msgstr ""
msgid "To specify the notification level per project of a group you belong to, you need to visit project page and change notification level there."
msgstr ""
+msgid "To start using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
+msgstr ""
+
msgid "To unsubscribe from this issue, please paste the following link into your browser:"
msgstr ""
@@ -35689,9 +36170,6 @@ msgstr ""
msgid "Unable to fetch branches list, please close the form and try again"
msgstr ""
-msgid "Unable to fetch unscanned projects"
-msgstr ""
-
msgid "Unable to fetch vulnerable projects"
msgstr ""
@@ -35746,6 +36224,15 @@ msgstr ""
msgid "Unable to update this issue at this time."
msgstr ""
+msgid "Unapprove a merge request"
+msgstr ""
+
+msgid "Unapprove the current merge request."
+msgstr ""
+
+msgid "Unapproved the current merge request."
+msgstr ""
+
msgid "Unarchive project"
msgstr ""
@@ -35758,16 +36245,13 @@ msgstr ""
msgid "Unassigned"
msgstr ""
-msgid "Unauthenticated API request rate limit"
-msgstr ""
-
-msgid "Unauthenticated rate limit period in seconds"
+msgid "Unauthenticated API rate limit period in seconds"
msgstr ""
-msgid "Unauthenticated request rate limit"
+msgid "Unauthenticated requests"
msgstr ""
-msgid "Unauthenticated requests"
+msgid "Unauthenticated web rate limit period in seconds"
msgstr ""
msgid "Undo"
@@ -35869,18 +36353,6 @@ msgstr ""
msgid "Unresolved"
msgstr ""
-msgid "UnscannedProjects|15 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|30 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|5 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|60 or more days"
-msgstr ""
-
msgid "Unschedule job"
msgstr ""
@@ -36100,6 +36572,9 @@ msgstr ""
msgid "UsageQuota|%{help_link_start}Shared runners%{help_link_end} are disabled, so there are no limits set on pipeline usage"
msgstr ""
+msgid "UsageQuota|%{linkTitle} help link"
+msgstr ""
+
msgid "UsageQuota|%{percentageLeft} of purchased storage is available"
msgstr ""
@@ -36109,6 +36584,9 @@ msgstr ""
msgid "UsageQuota|Artifacts is a sum of build and pipeline artifacts."
msgstr ""
+msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
+msgstr ""
+
msgid "UsageQuota|Buy additional minutes"
msgstr ""
@@ -36118,9 +36596,21 @@ msgstr ""
msgid "UsageQuota|CI minutes usage by project"
msgstr ""
+msgid "UsageQuota|Code packages and container images."
+msgstr ""
+
msgid "UsageQuota|Current period usage"
msgstr ""
+msgid "UsageQuota|File attachments and smaller design graphics."
+msgstr ""
+
+msgid "UsageQuota|Git repository, managed by the Gitaly service."
+msgstr ""
+
+msgid "UsageQuota|Includes project registry, artifacts, packages, wiki, uploads and other items."
+msgstr ""
+
msgid "UsageQuota|Increase storage temporarily"
msgstr ""
@@ -36139,6 +36629,9 @@ msgstr ""
msgid "UsageQuota|Packages"
msgstr ""
+msgid "UsageQuota|Pipeline artifacts and job artifacts, created with CI/CD."
+msgstr ""
+
msgid "UsageQuota|Pipelines"
msgstr ""
@@ -36157,6 +36650,9 @@ msgstr ""
msgid "UsageQuota|Seats"
msgstr ""
+msgid "UsageQuota|Shared bits of code and text."
+msgstr ""
+
msgid "UsageQuota|Snippets"
msgstr ""
@@ -36166,6 +36662,12 @@ msgstr ""
msgid "UsageQuota|Storage"
msgstr ""
+msgid "UsageQuota|Storage type"
+msgstr ""
+
+msgid "UsageQuota|There is a known issue with Artifact storage where the total could be incorrect for some projects. More details and progress are available in %{warningLinkStart}the epic%{warningLinkEnd}."
+msgstr ""
+
msgid "UsageQuota|This is the total amount of storage used across your projects within this namespace."
msgstr ""
@@ -36205,6 +36707,9 @@ msgstr ""
msgid "UsageQuota|Usage"
msgstr ""
+msgid "UsageQuota|Usage Breakdown"
+msgstr ""
+
msgid "UsageQuota|Usage Quotas"
msgstr ""
@@ -36229,6 +36734,9 @@ msgstr ""
msgid "UsageQuota|Wiki"
msgstr ""
+msgid "UsageQuota|Wiki content."
+msgstr ""
+
msgid "UsageQuota|Wikis"
msgstr ""
@@ -36445,7 +36953,10 @@ msgstr ""
msgid "User Settings"
msgstr ""
-msgid "User and IP Rate Limits"
+msgid "User and IP rate limits"
+msgstr ""
+
+msgid "User does not have a pending request"
msgstr ""
msgid "User identity was successfully created."
@@ -36742,6 +37253,9 @@ msgstr ""
msgid "Users can launch a development environment from a GitLab browser tab when the %{linkStart}Gitpod%{linkEnd} integration is enabled."
msgstr ""
+msgid "Users can reactivate their account by signing in."
+msgstr ""
+
msgid "Users can render diagrams in AsciiDoc, Markdown, reStructuredText, and Textile documents using Kroki."
msgstr ""
@@ -36757,6 +37271,9 @@ msgstr ""
msgid "Users requesting access to"
msgstr ""
+msgid "Users to exclude from the rate limit"
+msgstr ""
+
msgid "Users were successfully added."
msgstr ""
@@ -36778,6 +37295,9 @@ msgstr ""
msgid "UsersSelect|Unassigned"
msgstr ""
+msgid "Uses GitLab as a lightweight alternative to Sentry."
+msgstr ""
+
msgid "Using %{code_start}::%{code_end} denotes a %{link_start}scoped label set%{link_end}"
msgstr ""
@@ -36808,10 +37328,7 @@ msgstr ""
msgid "Value Stream Analytics can help you determine your team’s velocity"
msgstr ""
-msgid "Value Stream Analytics gives an overview of how much time it takes to go from idea to production in your project."
-msgstr ""
-
-msgid "Value may contain a variable reference"
+msgid "Value might contain a variable reference"
msgstr ""
msgid "Value stream"
@@ -36877,10 +37394,10 @@ msgstr ""
msgid "ValueStream|The Default Value Stream cannot be deleted"
msgstr ""
-msgid "Variable"
+msgid "Values that contain the %{codeStart}$%{codeEnd} character can be considered a variable reference and expanded. %{docsLinkStart}Learn more.%{docsLinkEnd}"
msgstr ""
-msgid "Variable references indicated by %{codeStart}$%{codeEnd} may be expanded. If this is not what you want, consider %{docsLinkStart}using a workaround to prevent expansion%{docsLinkEnd}."
+msgid "Variable"
msgstr ""
msgid "Variable will be masked in job logs."
@@ -37285,6 +37802,9 @@ msgstr ""
msgid "Vulnerability|Evidence"
msgstr ""
+msgid "Vulnerability|False positive detected"
+msgstr ""
+
msgid "Vulnerability|File"
msgstr ""
@@ -37327,6 +37847,9 @@ msgstr ""
msgid "Vulnerability|Status"
msgstr ""
+msgid "Vulnerability|The scanner determined this vulnerability to be a false positive. Verify the evaluation before changing its status. %{linkStart}Learn more about false positive detection.%{linkEnd}"
+msgstr ""
+
msgid "Vulnerability|The unmodified response is the original response that had no mutations done to the request"
msgstr ""
@@ -37651,9 +38174,6 @@ msgstr ""
msgid "Welcome to GitLab,%{br_tag}%{name}!"
msgstr ""
-msgid "Welcome to the guided GitLab tour"
-msgstr ""
-
msgid "Welcome, %{name}!"
msgstr ""
@@ -37672,9 +38192,6 @@ msgstr ""
msgid "What are you searching for?"
msgstr ""
-msgid "What describes you best?"
-msgstr ""
-
msgid "What does this command do?"
msgstr ""
@@ -37696,13 +38213,13 @@ msgstr ""
msgid "What is your job title? (optional)"
msgstr ""
-msgid "What will you use this group for?"
+msgid "What templates can I create?"
msgstr ""
-msgid "What's new"
+msgid "What will you use this group for?"
msgstr ""
-msgid "What’s your experience level?"
+msgid "What's new"
msgstr ""
msgid "When a deployment job is successful, skip older deployment jobs that are still pending."
@@ -37714,6 +38231,9 @@ msgstr ""
msgid "When an event in GitLab triggers a webhook, you can use the request details to figure out if something went wrong."
msgstr ""
+msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+msgstr ""
+
msgid "When inactive, an external authentication provider must be used."
msgstr ""
@@ -37737,6 +38257,9 @@ msgstr ""
msgid "When:"
msgstr ""
+msgid "Which API requests are affected?"
+msgstr ""
+
msgid "While it's rare to have no vulnerabilities, it can happen. In any event, we ask that you please double check your settings to make sure you've set up your dashboard correctly."
msgstr ""
@@ -38016,6 +38539,9 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|Work Items"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -38091,6 +38617,9 @@ msgstr ""
msgid "You are already a member of this %{member_source}."
msgstr ""
+msgid "You are already impersonating another user"
+msgstr ""
+
msgid "You are an admin, which means granting access to %{client_name} will allow them to interact with GitLab as an admin as well. Proceed with caution."
msgstr ""
@@ -38193,6 +38722,9 @@ msgstr ""
msgid "You can also use project access tokens with Git to authenticate over HTTP(S). %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "You can always change your URL later"
+msgstr ""
+
msgid "You can always edit this later"
msgstr ""
@@ -38349,10 +38881,10 @@ msgstr ""
msgid "You can’t %{tag_start}edit%{tag_end} files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
-msgid "You could not create a new trigger."
+msgid "You can’t edit files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
-msgid "You didn't renew your subscription for %{strong}%{namespace_name}%{strong_close} so it was downgraded to the free plan."
+msgid "You could not create a new trigger."
msgstr ""
msgid "You do not have any subscriptions yet"
@@ -38520,6 +39052,12 @@ msgstr ""
msgid "You must provide your current password in order to change it."
msgstr ""
+msgid "You must sign in to search for specific projects."
+msgstr ""
+
+msgid "You must sign in to search for specific terms."
+msgstr ""
+
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
@@ -38547,6 +39085,9 @@ msgstr ""
msgid "You need to upload a GitLab project export archive (ending in .gz)."
msgstr ""
+msgid "You need to verify your primary email first before enabling Two-Factor Authentication."
+msgstr ""
+
msgid "You successfully declined the invitation"
msgstr ""
@@ -38655,10 +39196,10 @@ msgstr ""
msgid "Your %{host} account was signed in to from a new location"
msgstr ""
-msgid "Your %{strong}%{plan_name}%{strong_close} subscription for %{strong}%{namespace_name}%{strong_close} will expire on %{strong}%{expires_on}%{strong_close}."
+msgid "Your %{strong}%{plan_name}%{strong_close} subscription expires on %{strong}%{expires_on}%{strong_close}. After that date, you cannot create issues or merge requests, or use many other features."
msgstr ""
-msgid "Your %{strong}%{plan_name}%{strong_close} subscription will expire on %{strong}%{expires_on}%{strong_close}. After that, you will not be able to create issues or merge requests as well as many other features."
+msgid "Your %{strong}%{plan_name}%{strong_close} subscription for %{strong}%{namespace_name}%{strong_close} will expire on %{strong}%{expires_on}%{strong_close}."
msgstr ""
msgid "Your CI/CD configuration syntax is invalid. View Lint tab for more details."
@@ -38682,7 +39223,7 @@ msgstr ""
msgid "Your GPG keys (%{count})"
msgstr ""
-msgid "Your GitLab account has been locked due to an excessive amount of unsuccessful sign in attempts. Your account will automatically unlock in %{duration} or you may click the link below to unlock now."
+msgid "Your GitLab account has been locked due to an excessive number of unsuccessful sign in attempts. You can wait for your account to automatically unlock in %{duration} or you can click the link below to unlock now."
msgstr ""
msgid "Your GitLab account request has been approved!"
@@ -38793,6 +39334,9 @@ msgstr ""
msgid "Your commit email is used for web based operations, such as edits and merges."
msgstr ""
+msgid "Your current password is required to register a two-factor authenticator app."
+msgstr ""
+
msgid "Your dashboard has been copied. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
@@ -38892,6 +39436,9 @@ msgstr ""
msgid "Your project limit is %{limit} projects! Please contact your administrator to increase it"
msgstr ""
+msgid "Your project will be created at:"
+msgstr ""
+
msgid "Your projects"
msgstr ""
@@ -38931,11 +39478,10 @@ msgstr ""
msgid "Your subscription expired!"
msgstr ""
-msgid "Your subscription has been downgraded."
-msgstr ""
-
-msgid "Your subscription will expire in %{remaining_days}."
-msgstr ""
+msgid "Your subscription will expire in %{remaining_days} day."
+msgid_plural "Your subscription will expire in %{remaining_days} days."
+msgstr[0] ""
+msgstr[1] ""
msgid "Your username is %{username}."
msgstr ""
@@ -39142,6 +39688,9 @@ msgstr ""
msgid "cannot merge"
msgstr ""
+msgid "cannot not be used for user namespace"
+msgstr ""
+
msgid "ciReport|%{degradedNum} degraded"
msgstr ""
@@ -39465,6 +40014,9 @@ msgstr ""
msgid "created %{timeAgo}"
msgstr ""
+msgid "created %{timeAgo} by %{author}"
+msgstr ""
+
msgid "created by"
msgstr ""
@@ -39509,9 +40061,6 @@ msgstr ""
msgid "does not have a supported extension. Only %{extension_list} are supported"
msgstr ""
-msgid "domain is not authorized for sign-up."
-msgstr ""
-
msgid "download it"
msgstr ""
@@ -39529,18 +40078,13 @@ msgstr ""
msgid "email '%{email}' is not a verified email."
msgstr ""
-msgid "email does not match the allowed domain of %{email_domains}"
-msgid_plural "email does not match the allowed domains: %{email_domains}"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "enabled"
msgstr ""
msgid "encrypted: needs to be a :required, :optional or :migrating!"
msgstr ""
-msgid "ending with MIME type format is not allowed."
+msgid "ending with a reserved file extension is not allowed."
msgstr ""
msgid "entries cannot be larger than 255 characters"
@@ -39564,6 +40108,9 @@ msgstr ""
msgid "estimateCommand|%{slash_command} overwrites the total estimated time."
msgstr ""
+msgid "example.com"
+msgstr ""
+
msgid "exceeds the limit of %{bytes} bytes"
msgstr ""
@@ -39614,9 +40161,6 @@ msgstr ""
msgid "fork"
msgstr ""
-msgid "fork this project"
-msgstr ""
-
msgid "from"
msgstr ""
@@ -39625,6 +40169,9 @@ msgid_plural "from %d jobs"
msgstr[0] ""
msgstr[1] ""
+msgid "frontmatter"
+msgstr ""
+
msgid "group"
msgstr ""
@@ -39652,6 +40199,9 @@ msgstr ""
msgid "has been completed."
msgstr ""
+msgid "has too deep level of nesting"
+msgstr ""
+
msgid "help"
msgstr ""
@@ -39685,9 +40235,21 @@ msgstr ""
msgid "in"
msgstr ""
+msgid "in Infrastructure :: Kubernetes clusters"
+msgstr ""
+
+msgid "in all GitLab"
+msgstr ""
+
+msgid "in group"
+msgstr ""
+
msgid "in group %{link_to_group}"
msgstr ""
+msgid "in project"
+msgstr ""
+
msgid "in project %{link_to_project}"
msgstr ""
@@ -39729,16 +40291,19 @@ msgstr ""
msgid "is not a valid X509 certificate."
msgstr ""
-msgid "is not allowed since the group is not top-level group."
+msgid "is not allowed for sign-up."
msgstr ""
-msgid "is not allowed. Try again with a different email address, or contact your GitLab admin."
+msgid "is not allowed for this group."
msgstr ""
-msgid "is not allowed. We do not currently support project-level iterations"
+msgid "is not allowed for this project."
+msgstr ""
+
+msgid "is not allowed since the group is not top-level group."
msgstr ""
-msgid "is not from an allowed domain."
+msgid "is not allowed. We do not currently support project-level iterations"
msgstr ""
msgid "is not in the group enforcing Group Managed Account"
@@ -39831,6 +40396,9 @@ msgstr ""
msgid "log in"
msgstr ""
+msgid "managed"
+msgstr ""
+
msgid "manual"
msgstr ""
@@ -39878,6 +40446,9 @@ msgstr ""
msgid "mrWidget| Please restore it or use a different %{missingBranchName} branch"
msgstr ""
+msgid "mrWidget|%{linkStart}Set up now%{linkEnd} to analyze your source code for known security vulnerabilities."
+msgstr ""
+
msgid "mrWidget|%{mergeError}."
msgstr ""
@@ -39958,6 +40529,9 @@ msgid_plural "mrWidget|Closes issues"
msgstr[0] ""
msgstr[1] ""
+msgid "mrWidget|Create issue to resolve all threads"
+msgstr ""
+
msgid "mrWidget|Delete source branch"
msgstr ""
@@ -39967,12 +40541,18 @@ msgstr ""
msgid "mrWidget|Did not close"
msgstr ""
+msgid "mrWidget|Dismiss"
+msgstr ""
+
msgid "mrWidget|Email patches"
msgstr ""
msgid "mrWidget|Failed to load deployment statistics"
msgstr ""
+msgid "mrWidget|Hide %{widget} details"
+msgstr ""
+
msgid "mrWidget|If the %{missingBranchName} branch exists in your local repository, you can merge this merge request manually using the command line"
msgstr ""
@@ -40068,9 +40648,6 @@ msgstr ""
msgid "mrWidget|Request to merge"
msgstr ""
-msgid "mrWidget|Resolve all threads in new issue"
-msgstr ""
-
msgid "mrWidget|Resolve conflicts"
msgstr ""
@@ -40086,6 +40663,9 @@ msgstr ""
msgid "mrWidget|Revoke approval"
msgstr ""
+msgid "mrWidget|SAST and Secret Detection is not enabled."
+msgstr ""
+
msgid "mrWidget|Set by %{merge_author} to be added to the merge train when the pipeline succeeds"
msgstr ""
@@ -40095,6 +40675,9 @@ msgstr ""
msgid "mrWidget|Set by %{merge_author} to start a merge train when the pipeline succeeds"
msgstr ""
+msgid "mrWidget|Show %{widget} details"
+msgstr ""
+
msgid "mrWidget|The changes were merged into"
msgstr ""
@@ -40107,6 +40690,9 @@ msgstr ""
msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure, or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
msgstr ""
+msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure."
+msgstr ""
+
msgid "mrWidget|The source branch has been deleted"
msgstr ""
@@ -40149,6 +40735,9 @@ msgstr ""
msgid "mrWidget|You can merge after removing denied licenses"
msgstr ""
+msgid "mrWidget|You can only merge once this merge request is approved."
+msgstr ""
+
msgid "mrWidget|Your password"
msgstr ""
@@ -40185,6 +40774,9 @@ msgstr ""
msgid "must be less than the limit of %{tag_limit} tags"
msgstr ""
+msgid "must be set for a project namespace"
+msgstr ""
+
msgid "must be unique by status and elapsed time within a policy"
msgstr ""
@@ -40294,6 +40886,9 @@ msgstr ""
msgid "pipeline"
msgstr ""
+msgid "pipeline schedules documentation"
+msgstr ""
+
msgid "pod_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
msgstr ""
@@ -40343,16 +40938,25 @@ msgstr ""
msgid "project name"
msgstr ""
+msgid "project namespace cannot be the parent of another namespace"
+msgstr ""
+
msgid "projects"
msgstr ""
msgid "quick actions"
msgstr ""
-msgid "reCAPTCHA Private Key"
+msgid "reCAPTCHA"
+msgstr ""
+
+msgid "reCAPTCHA helps prevent credential stuffing."
msgstr ""
-msgid "reCAPTCHA Site Key"
+msgid "reCAPTCHA private key"
+msgstr ""
+
+msgid "reCAPTCHA site key"
msgstr ""
msgid "recent activity"
@@ -40579,6 +41183,9 @@ msgstr ""
msgid "user avatar"
msgstr ""
+msgid "user namespace cannot be the parent of another namespace"
+msgstr ""
+
msgid "user preferences"
msgstr ""
@@ -40671,3 +41278,9 @@ msgstr ""
msgid "your settings"
msgstr ""
+msgid "{group}"
+msgstr ""
+
+msgid "{project}"
+msgstr ""
+
diff --git a/locale/id_ID/gitlab.po b/locale/id_ID/gitlab.po
index 101e740fb4e..7555a705a95 100644
--- a/locale/id_ID/gitlab.po
+++ b/locale/id_ID/gitlab.po
@@ -14,10 +14,7 @@ msgstr ""
"X-Crowdin-Language: id\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-09-01 22:30\n"
-
-msgid " %{name}, confirm your email address now! "
-msgstr ""
+"PO-Revision-Date: 2021-10-04 20:18\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -90,6 +87,14 @@ msgstr ""
msgid "#general, #development"
msgstr ""
+msgid "%d Alert"
+msgid_plural "%d Alerts"
+msgstr[0] ""
+
+msgid "%d Alert:"
+msgid_plural "%d Alerts:"
+msgstr[0] ""
+
msgid "%d Approval"
msgid_plural "%d Approvals"
msgstr[0] ""
@@ -387,7 +392,10 @@ msgstr ""
msgid "%{code_open}Protected:%{code_close} Only exposed to protected branches or tags."
msgstr ""
-msgid "%{commit_author_link} authored %{commit_timeago}"
+msgid "%{commit_author_link} authored %{commit_authored_timeago}"
+msgstr ""
+
+msgid "%{commit_author_link} authored %{commit_authored_timeago} and %{commit_committer_avatar} %{commit_committer_link} committed %{commit_committer_timeago}"
msgstr ""
msgid "%{completedCount} completed weight"
@@ -476,6 +484,15 @@ msgstr ""
msgid "%{doc_link_start}Advanced search%{doc_link_end} is enabled."
msgstr ""
+msgid "%{docs_link_start}Learn about visibility levels.%{docs_link_end}"
+msgstr ""
+
+msgid "%{docs_link_start}What is Large File Storage?%{docs_link_end}"
+msgstr ""
+
+msgid "%{docs_link_start}What is two-factor authentication?%{docs_link_end}"
+msgstr ""
+
msgid "%{due_date} (Past due)"
msgstr ""
@@ -548,9 +565,6 @@ msgstr ""
msgid "%{issueType} actions"
msgstr ""
-msgid "%{issuesCount} issues with a limit of %{maxIssueCount}"
-msgstr ""
-
msgid "%{issuesSize} with a limit of %{maxIssueCount}"
msgstr ""
@@ -608,6 +622,12 @@ msgstr ""
msgid "%{label_for_message} unavailable"
msgstr ""
+msgid "%{learn_more_link}."
+msgstr ""
+
+msgid "%{lessThan} 1 hour"
+msgstr ""
+
msgid "%{lets_encrypt_link_start}Let's Encrypt%{lets_encrypt_link_end} is a free, automated, and open certificate authority (CA) that issues digital certificates to enable HTTPS (SSL/TLS) for sites."
msgstr ""
@@ -620,15 +640,15 @@ msgstr ""
msgid "%{link_start}Learn more%{link_end} about roles."
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
-msgstr ""
-
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
msgstr ""
msgid "%{link_start}Start the title with %{draft_snippet}%{link_end} to prevent a merge request that is a work in progress from being merged before it's ready."
msgstr ""
+msgid "%{link_start}What information does GitLab Inc. collect?%{link_end}"
+msgstr ""
+
msgid "%{listToShow}, and %{awardsListLength} more"
msgstr ""
@@ -777,7 +797,7 @@ msgid "%{securityScanner} result is not available because a pipeline has not bee
msgid_plural "%{securityScanner} results are not available because a pipeline has not been run since it was enabled. %{linkStart}Run a pipeline%{linkEnd}"
msgstr[0] ""
-msgid "%{service_ping_link_start}Learn more%{service_ping_link_end} about what information is shared with GitLab Inc."
+msgid "%{service_ping_link_start}What information is shared with GitLab Inc.?%{service_ping_link_end}"
msgstr ""
msgid "%{size} %{unit}"
@@ -813,6 +833,9 @@ msgstr ""
msgid "%{state} epics"
msgstr ""
+msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
+msgstr ""
+
msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
msgstr ""
@@ -865,10 +888,6 @@ msgstr ""
msgid "%{template_project_id} is unknown or invalid"
msgstr ""
-msgid "%{text} %{files}"
-msgid_plural "%{text} %{files} files"
-msgstr[0] ""
-
msgid "%{text} is available"
msgstr ""
@@ -953,9 +972,6 @@ msgstr ""
msgid "%{wildcards_link_start}Wildcards%{wildcards_link_end} such as %{code_tag_start}v*%{code_tag_end} or %{code_tag_start}*-release%{code_tag_end} are supported."
msgstr ""
-msgid "&lt; 1 hour"
-msgstr ""
-
msgid "'%{data}' at %{location} does not match format: %{format}"
msgstr ""
@@ -1038,9 +1054,6 @@ msgstr ""
msgid "(we need your current password to confirm your changes)"
msgstr ""
-msgid "* * * * *"
-msgstr ""
-
msgid "+ %{amount} more"
msgstr ""
@@ -1104,10 +1117,10 @@ msgstr ""
msgid "."
msgstr ""
-msgid "0 bytes"
+msgid "/"
msgstr ""
-msgid "0 for unlimited, only effective with remote storage enabled."
+msgid "0 bytes"
msgstr ""
msgid "0t1DgySidms"
@@ -1214,6 +1227,9 @@ msgstr ""
msgid "1000+"
msgstr ""
+msgid "192.168.0.0/24"
+msgstr ""
+
msgid "1st contribution!"
msgstr ""
@@ -1367,9 +1383,6 @@ msgstr ""
msgid "A plain HTML site that uses Netlify for CI/CD instead of GitLab, but still with all the other great GitLab features"
msgstr ""
-msgid "A plain-text response to show to clients that hit the rate limit."
-msgstr ""
-
msgid "A platform value can be web, mob or app."
msgstr ""
@@ -1451,7 +1464,7 @@ msgstr ""
msgid "APIFuzzing|Configure HTTP basic authentication values. Other authentication methods are supported. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
+msgid "APIFuzzing|Customize your project's API fuzzing configuration options and copy the code snippet to your .gitlab-ci.yml file to apply any changes. Note that this tool does not reflect or update your .gitlab-ci.yml file automatically. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
msgstr ""
msgid "APIFuzzing|Enable authentication"
@@ -1514,9 +1527,6 @@ msgstr ""
msgid "APIFuzzing|To prevent a security leak, authentication info must be added as a %{ciVariablesLinkStart}CI variable%{ciVariablesLinkEnd}. As a user with maintainer access rights, you can manage CI variables in the %{ciSettingsLinkStart}Settings%{ciSettingsLinkEnd} area."
msgstr ""
-msgid "APIFuzzing|Use this tool to generate API fuzzing configuration YAML to copy into your .gitlab-ci.yml file. This tool does not reflect or update your .gitlab-ci.yml file automatically."
-msgstr ""
-
msgid "APIFuzzing|Username for basic authentication"
msgstr ""
@@ -1568,9 +1578,6 @@ msgstr ""
msgid "Abuse reports notification email"
msgstr ""
-msgid "Abuse reports will be sent to this address if it is set. Abuse reports are always available in the admin area."
-msgstr ""
-
msgid "Accept invitation"
msgstr ""
@@ -1607,12 +1614,18 @@ msgstr ""
msgid "Access granted"
msgstr ""
+msgid "Access key ID"
+msgstr ""
+
msgid "Access requests"
msgstr ""
msgid "Access to '%{classification_label}' not allowed"
msgstr ""
+msgid "Access tokens expire after 2 hours. A refresh token may be used at any time to generate a new access token. Non-expiring access tokens are deprecated. Clear this setting to enable backward compatibility."
+msgstr ""
+
msgid "AccessDropdown|Deploy Keys"
msgstr ""
@@ -1925,6 +1938,9 @@ msgstr ""
msgid "Add new directory"
msgstr ""
+msgid "Add new service account"
+msgstr ""
+
msgid "Add or remove previously merged commits"
msgstr ""
@@ -2162,6 +2178,9 @@ msgstr ""
msgid "AdminArea|Features"
msgstr ""
+msgid "AdminArea|Get security updates from GitLab and stay up to date"
+msgstr ""
+
msgid "AdminArea|Groups"
msgstr ""
@@ -2201,6 +2220,12 @@ msgstr ""
msgid "AdminArea|Reporter"
msgstr ""
+msgid "AdminArea|Sign up for the GitLab Security Newsletter to get notified for security updates."
+msgstr ""
+
+msgid "AdminArea|Sign up for the GitLab newsletter"
+msgstr ""
+
msgid "AdminArea|Stop all jobs"
msgstr ""
@@ -2270,9 +2295,15 @@ msgstr ""
msgid "AdminSettings|Disable public access to Pages sites"
msgstr ""
+msgid "AdminSettings|Display a banner on merge requests in projects with no pipelines to initiate steps to add a .gitlab-ci.yml file."
+msgstr ""
+
msgid "AdminSettings|Domain verification is an essential security measure for public GitLab sites. Users are required to demonstrate they control a domain before it is enabled. %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "AdminSettings|Enable pipeline suggestion banner"
+msgstr ""
+
msgid "AdminSettings|Enable shared runners for new projects"
msgstr ""
@@ -2744,10 +2775,10 @@ msgstr ""
msgid "Admin|Quarterly reconciliation will occur on %{qrtlyDate}"
msgstr ""
-msgid "Admin|The number of max seats used for your namespace is currently exceeding the number of seats in your subscription. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgid "Admin|The number of max seats in your namespace exceeds the number of seats in your subscription. On %{qrtlyDate}, quarterly reconciliation occurs and you are automatically billed a prorated amount for the overage. No action is needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice. For more information about the timing of the invoicing process, view the documentation."
msgstr ""
-msgid "Admin|The number of maximum users for your instance is currently exceeding the number of users in license. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgid "Admin|The number of max users in your instance exceeds the number of users in your license. On %{qrtlyDate}, quarterly reconciliation occurs and you are automatically billed a prorated amount for the overage. No action is needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice. For more information about the timing of the invoicing process, view the documentation."
msgstr ""
msgid "Admin|View pending user approvals"
@@ -2768,9 +2799,6 @@ msgstr ""
msgid "Advanced export options"
msgstr ""
-msgid "Advanced permissions, Large File Storage and Two-Factor authentication settings."
-msgstr ""
-
msgid "After a successful password update you will be redirected to login screen."
msgstr ""
@@ -2789,12 +2817,14 @@ msgstr ""
msgid "After you've reviewed these contribution guidelines, you'll be all set to"
msgstr ""
+msgid "Akismet"
+msgstr ""
+
msgid "Akismet API Key"
msgstr ""
-msgid "Alert"
-msgid_plural "Alerts"
-msgstr[0] ""
+msgid "Akismet helps prevent the creation of spam issues in public projects."
+msgstr ""
msgid "AlertManagement|Acknowledged"
msgstr ""
@@ -3150,6 +3180,9 @@ msgstr ""
msgid "All (default)"
msgstr ""
+msgid "All GitLab"
+msgstr ""
+
msgid "All Members"
msgstr ""
@@ -3264,6 +3297,9 @@ msgstr ""
msgid "Allow this secondary node to replicate content on Object Storage"
msgstr ""
+msgid "Allow use of licensed EE features"
+msgstr ""
+
msgid "Allow users to dismiss the broadcast message"
msgstr ""
@@ -3339,9 +3375,6 @@ msgstr ""
msgid "Amazon authentication is not %{link_start}correctly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
-msgid "Amount of time (in hours) that users are allowed to skip forced configuration of two-factor authentication"
-msgstr ""
-
msgid "An %{link_start}alert%{link_end} with the same fingerprint is already open. To change the status of this alert, resolve the linked alert."
msgstr ""
@@ -3402,12 +3435,6 @@ msgstr ""
msgid "An error occurred when removing the label."
msgstr ""
-msgid "An error occurred when toggling the notification subscription"
-msgstr ""
-
-msgid "An error occurred when updating the issue weight"
-msgstr ""
-
msgid "An error occurred when updating the title"
msgstr ""
@@ -3456,6 +3483,9 @@ msgstr ""
msgid "An error occurred while enabling Service Desk."
msgstr ""
+msgid "An error occurred while fetching Markdown preview"
+msgstr ""
+
msgid "An error occurred while fetching ancestors"
msgstr ""
@@ -3486,9 +3516,6 @@ msgstr ""
msgid "An error occurred while fetching label colors."
msgstr ""
-msgid "An error occurred while fetching markdown preview"
-msgstr ""
-
msgid "An error occurred while fetching participants"
msgstr ""
@@ -3504,9 +3531,6 @@ msgstr ""
msgid "An error occurred while fetching reference"
msgstr ""
-msgid "An error occurred while fetching sidebar data"
-msgstr ""
-
msgid "An error occurred while fetching tags. Retry the search."
msgstr ""
@@ -3582,6 +3606,9 @@ msgstr ""
msgid "An error occurred while loading merge requests."
msgstr ""
+msgid "An error occurred while loading projects."
+msgstr ""
+
msgid "An error occurred while loading the Needs tab."
msgstr ""
@@ -3816,12 +3843,6 @@ msgstr ""
msgid "Any Milestone"
msgstr ""
-msgid "Any branch"
-msgstr ""
-
-msgid "Any eligible user"
-msgstr ""
-
msgid "Any encrypted tokens"
msgstr ""
@@ -3840,6 +3861,9 @@ msgstr ""
msgid "Any namespace"
msgstr ""
+msgid "App Engine description and apps that are suitable for this deployment target"
+msgstr ""
+
msgid "App ID"
msgstr ""
@@ -3986,6 +4010,10 @@ msgstr ""
msgid "Apply"
msgstr ""
+msgid "Apply %d suggestion"
+msgid_plural "Apply %d suggestions"
+msgstr[0] ""
+
msgid "Apply a label"
msgstr ""
@@ -3995,13 +4023,10 @@ msgstr ""
msgid "Apply suggestion"
msgstr ""
-msgid "Apply suggestions"
-msgstr ""
-
msgid "Apply template"
msgstr ""
-msgid "Apply this approval rule to any branch or a specific protected branch."
+msgid "Apply this approval rule to all branches or a specific protected branch."
msgstr ""
msgid "Applying"
@@ -4140,9 +4165,6 @@ msgstr ""
msgid "ApprovalSettings|Prevent editing approval rules in projects and merge requests."
msgstr ""
-msgid "ApprovalSettings|Prevent editing approval rules in projects and merge requests. "
-msgstr ""
-
msgid "ApprovalSettings|Remove all approvals when commits are added to the source branch."
msgstr ""
@@ -4158,6 +4180,9 @@ msgstr ""
msgid "ApprovalSettings|This setting is configured at the instance level and can only be changed by an administrator."
msgstr ""
+msgid "ApprovalSettings|This setting is configured in %{groupName} and can only be changed by an administrator or group owner."
+msgstr ""
+
msgid "ApprovalStatusTooltip|Adheres to separation of duties"
msgstr ""
@@ -4641,9 +4666,6 @@ msgstr ""
msgid "Authenticated API rate limit period in seconds"
msgstr ""
-msgid "Authenticated API request rate limit"
-msgstr ""
-
msgid "Authenticated API requests"
msgstr ""
@@ -4653,10 +4675,10 @@ msgstr ""
msgid "Authenticated Git LFS request rate limit"
msgstr ""
-msgid "Authenticated web rate limit period in seconds"
+msgid "Authenticated Git LFS requests"
msgstr ""
-msgid "Authenticated web request rate limit"
+msgid "Authenticated web rate limit period in seconds"
msgstr ""
msgid "Authenticated web requests"
@@ -5034,9 +5056,6 @@ msgstr ""
msgid "Below you will find all the groups that are public."
msgstr ""
-msgid "Beta"
-msgstr ""
-
msgid "Bi-weekly code coverage"
msgstr ""
@@ -5275,6 +5294,21 @@ msgstr ""
msgid "Board scope affects which issues are displayed for anyone who visits this board"
msgstr ""
+msgid "BoardNewEpic|Groups"
+msgstr ""
+
+msgid "BoardNewEpic|Loading groups"
+msgstr ""
+
+msgid "BoardNewEpic|No matching results"
+msgstr ""
+
+msgid "BoardNewEpic|Search groups"
+msgstr ""
+
+msgid "BoardNewEpic|Select a group"
+msgstr ""
+
msgid "BoardNewIssue|No matching results"
msgstr ""
@@ -5351,6 +5385,9 @@ msgstr ""
msgid "Boards|An error occurred while creating the list. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching child groups. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching group projects. Please try again."
msgstr ""
@@ -5682,6 +5719,9 @@ msgstr ""
msgid "Bulk update"
msgstr ""
+msgid "BulkImports|Re-import creates a new group. It does not sync with the existing group."
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -5691,6 +5731,9 @@ msgstr ""
msgid "BulkImport|From source group"
msgstr ""
+msgid "BulkImport|Group import history"
+msgstr ""
+
msgid "BulkImport|Import failed: Destination cannot be a subgroup of the source group. Change the destination and try again."
msgstr ""
@@ -5703,9 +5746,18 @@ msgstr ""
msgid "BulkImport|Importing the group failed"
msgstr ""
+msgid "BulkImport|Last imported to %{link}"
+msgstr ""
+
msgid "BulkImport|Name already exists."
msgstr ""
+msgid "BulkImport|New group"
+msgstr ""
+
+msgid "BulkImport|No history is available"
+msgstr ""
+
msgid "BulkImport|No parent"
msgstr ""
@@ -5718,6 +5770,9 @@ msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} matching filter \"%{filter}\" from %{link}"
msgstr ""
+msgid "BulkImport|Source group"
+msgstr ""
+
msgid "BulkImport|To new group"
msgstr ""
@@ -5727,6 +5782,9 @@ msgstr ""
msgid "BulkImport|You have no groups to import"
msgstr ""
+msgid "BulkImport|Your imported groups will appear here."
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -5968,6 +6026,9 @@ msgstr ""
msgid "Can be manually deployed to"
msgstr ""
+msgid "Can be overridden in each project."
+msgstr ""
+
msgid "Can create groups:"
msgstr ""
@@ -6070,6 +6131,9 @@ msgstr ""
msgid "Cancelling Preview"
msgstr ""
+msgid "Cannot assign a confidential epic to a non-confidential issue. Make the issue confidential and try again"
+msgstr ""
+
msgid "Cannot be assigned to other projects."
msgstr ""
@@ -6121,9 +6185,6 @@ msgstr ""
msgid "Cannot refer to a group %{timebox_type} by an internal id!"
msgstr ""
-msgid "Cannot set confidential epic for a non-confidential issue"
-msgstr ""
-
msgid "Cannot show preview. For previews on sketch files, they must have the file format introduced by Sketch version 43 and above."
msgstr ""
@@ -6361,15 +6422,15 @@ msgstr ""
msgid "Check out, review, and merge locally"
msgstr ""
-msgid "Check the %{docs_link_start}documentation%{docs_link_end}."
-msgstr ""
-
msgid "Check the current instance configuration "
msgstr ""
msgid "Check the elasticsearch.log file to debug why the migration was halted and make any changes before retrying the migration. When you fix the cause of the failure, click \"Retry migration\", and the migration will be scheduled to be retried in the background."
msgstr ""
+msgid "Check with your administrator."
+msgstr ""
+
msgid "Check your Docker images for known vulnerabilities."
msgstr ""
@@ -6400,6 +6461,9 @@ msgstr ""
msgid "Checkout"
msgstr ""
+msgid "Checkout|$%{selectedPlanPrice} per 10 GB storage per pack"
+msgstr ""
+
msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 minutes"
msgstr ""
@@ -6419,16 +6483,22 @@ msgstr ""
msgid "Checkout|%{name}'s GitLab subscription"
msgstr ""
-msgid "Checkout|%{selectedPlanText} plan"
+msgid "Checkout|%{name}'s storage subscription"
msgstr ""
-msgid "Checkout|%{startDate} - %{endDate}"
+msgid "Checkout|%{quantity} GB of storage"
msgstr ""
-msgid "Checkout|%{totalCiMinutes} CI minute"
-msgid_plural "Checkout|%{totalCiMinutes} CI minutes"
+msgid "Checkout|%{quantity} storage pack"
+msgid_plural "Checkout|%{quantity} storage packs"
msgstr[0] ""
+msgid "Checkout|%{selectedPlanText} plan"
+msgstr ""
+
+msgid "Checkout|%{startDate} - %{endDate}"
+msgstr ""
+
msgid "Checkout|%{totalCiMinutes} CI minutes"
msgstr ""
@@ -6504,6 +6574,9 @@ msgstr ""
msgid "Checkout|Failed to register credit card. Please try again."
msgstr ""
+msgid "Checkout|GB"
+msgstr ""
+
msgid "Checkout|GitLab group"
msgstr ""
@@ -6540,6 +6613,9 @@ msgstr ""
msgid "Checkout|State"
msgstr ""
+msgid "Checkout|Storage packs"
+msgstr ""
+
msgid "Checkout|Street address"
msgstr ""
@@ -6561,6 +6637,9 @@ msgstr ""
msgid "Checkout|Total minutes: %{quantity}"
msgstr ""
+msgid "Checkout|Total storage: %{quantity} GB"
+msgstr ""
+
msgid "Checkout|Users"
msgstr ""
@@ -6570,16 +6649,25 @@ msgstr ""
msgid "Checkout|Your organization"
msgstr ""
+msgid "Checkout|Your storage subscription has the same term as your main subscription, and the price is prorated accordingly."
+msgstr ""
+
msgid "Checkout|Your subscription will be applied to this group"
msgstr ""
msgid "Checkout|Zip code"
msgstr ""
+msgid "Checkout|a storage subscription"
+msgstr ""
+
msgid "Checkout|company or team"
msgstr ""
-msgid "Checkout|x 1,000 minutes per pack = %{strong}"
+msgid "Checkout|minutes"
+msgstr ""
+
+msgid "Checkout|x %{quantity} %{units} per pack ="
msgstr ""
msgid "Cherry-pick this commit"
@@ -6936,6 +7024,9 @@ msgstr ""
msgid "CloneIssue|Cannot clone issue to target project as it is pending deletion."
msgstr ""
+msgid "CloneIssue|Cannot clone issues of '%{issue_type}' type."
+msgstr ""
+
msgid "Cloned this issue to %{path_to_project}."
msgstr ""
@@ -6990,7 +7081,10 @@ msgstr ""
msgid "Closes this %{quick_action_target}."
msgstr ""
-msgid "Cloud licenses can not be removed."
+msgid "Cloud Functions description and apps that are suitable for this deployment target"
+msgstr ""
+
+msgid "Cloud Run description and apps that are suitable for this deployment target"
msgstr ""
msgid "Cluster"
@@ -7017,6 +7111,12 @@ msgstr ""
msgid "ClusterAgents|Access tokens"
msgstr ""
+msgid "ClusterAgents|Agent might not be connected to GitLab"
+msgstr ""
+
+msgid "ClusterAgents|Agent never connected to GitLab"
+msgstr ""
+
msgid "ClusterAgents|Alternative installation methods"
msgstr ""
@@ -7032,6 +7132,12 @@ msgstr ""
msgid "ClusterAgents|Configuration"
msgstr ""
+msgid "ClusterAgents|Connected"
+msgstr ""
+
+msgid "ClusterAgents|Connection status"
+msgstr ""
+
msgid "ClusterAgents|Copy token"
msgstr ""
@@ -7050,6 +7156,9 @@ msgstr ""
msgid "ClusterAgents|For alternative installation methods %{linkStart}go to the documentation%{linkEnd}."
msgstr ""
+msgid "ClusterAgents|For more troubleshooting information go to"
+msgstr ""
+
msgid "ClusterAgents|Go to the repository"
msgstr ""
@@ -7065,18 +7174,30 @@ msgstr ""
msgid "ClusterAgents|Integrate with the GitLab Agent"
msgstr ""
-msgid "ClusterAgents|Last used"
+msgid "ClusterAgents|Last connected %{timeAgo}."
+msgstr ""
+
+msgid "ClusterAgents|Last contact"
msgstr ""
msgid "ClusterAgents|Learn how to create an agent access token"
msgstr ""
+msgid "ClusterAgents|Make sure you are using a valid token."
+msgstr ""
+
msgid "ClusterAgents|Name"
msgstr ""
msgid "ClusterAgents|Never"
msgstr ""
+msgid "ClusterAgents|Never connected"
+msgstr ""
+
+msgid "ClusterAgents|Not connected"
+msgstr ""
+
msgid "ClusterAgents|Read more about getting started"
msgstr ""
@@ -7098,6 +7219,9 @@ msgstr ""
msgid "ClusterAgents|Select which Agent you want to install"
msgstr ""
+msgid "ClusterAgents|The Agent has not been connected in a long time. There might be a connectivity issue. Last contact was %{timeAgo}."
+msgstr ""
+
msgid "ClusterAgents|The GitLab Agent also requires %{linkStart}enabling the Agent Server%{linkEnd}"
msgstr ""
@@ -7125,9 +7249,6 @@ msgstr ""
msgid "ClusterAgents|You will need to create a token to connect to your agent"
msgstr ""
-msgid "ClusterAgent|This feature is only available for premium plans"
-msgstr ""
-
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -7317,9 +7438,6 @@ msgstr ""
msgid "ClusterIntegration|Create Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Create a provision role on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the account and external ID above. %{startMoreInfoLink}More information%{endLink}"
-msgstr ""
-
msgid "ClusterIntegration|Create cluster on"
msgstr ""
@@ -7752,7 +7870,7 @@ msgstr ""
msgid "ClusterIntegration|Subnets"
msgstr ""
-msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provisioned role, first create one on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the above account and external IDs. %{startMoreInfoLink}More information%{endLink}"
+msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provisioned role, first create one on %{awsLinkStart}Amazon Web Services %{awsLinkEnd} using the above account and external IDs. %{moreInfoStart}More information%{moreInfoEnd}"
msgstr ""
msgid "ClusterIntegration|The Kubernetes certificate used to authenticate to the cluster."
@@ -7986,6 +8104,9 @@ msgstr ""
msgid "Collapse replies"
msgstr ""
+msgid "Collapse settings section"
+msgstr ""
+
msgid "Collapse sidebar"
msgstr ""
@@ -8004,6 +8125,9 @@ msgstr ""
msgid "Comma-separated list of email addresses."
msgstr ""
+msgid "Comma-separated list of users allowed to exceed the rate limit."
+msgstr ""
+
msgid "Comma-separated, e.g. '1.1.1.1, 2.2.2.0/24'"
msgstr ""
@@ -8323,6 +8447,9 @@ msgstr ""
msgid "Configure %{repository_checks_link_start}repository checks%{link_end} and %{housekeeping_link_start}housekeeping%{link_end} on repositories."
msgstr ""
+msgid "Configure CAPTCHAs, IP address limits, and other anti-spam measures."
+msgstr ""
+
msgid "Configure Dependency Scanning in `.gitlab-ci.yml` using the GitLab managed template. You can [add variable overrides](https://docs.gitlab.com/ee/user/application_security/dependency_scanning/#customizing-the-dependency-scanning-settings) to customize Dependency Scanning settings."
msgstr ""
@@ -8359,16 +8486,13 @@ msgstr ""
msgid "Configure a %{codeStart}.gitlab-webide.yml%{codeEnd} file in the %{codeStart}.gitlab%{codeEnd} directory to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
msgstr ""
-msgid "Configure existing installation"
-msgstr ""
-
-msgid "Configure limit for notes created per minute by web and API requests."
+msgid "Configure advanced permissions, Large File Storage, and two-factor authentication settings."
msgstr ""
-msgid "Configure limits for Project/Group Import/Export."
+msgid "Configure approvals by authors and committers on all projects."
msgstr ""
-msgid "Configure limits for web and API requests."
+msgid "Configure existing installation"
msgstr ""
msgid "Configure paths to be protected by Rack Attack."
@@ -8383,10 +8507,13 @@ msgstr ""
msgid "Configure settings for Advanced Search with Elasticsearch."
msgstr ""
+msgid "Configure specific limits for Files API requests that supersede the general user and IP rate limits."
+msgstr ""
+
msgid "Configure specific limits for Git LFS requests that supersede the general user and IP rate limits."
msgstr ""
-msgid "Configure specific limits for Packages API requests that supersede the general user and IP rate limits."
+msgid "Configure specific limits for deprecated API requests that supersede the general user and IP rate limits."
msgstr ""
msgid "Configure the %{link} integration."
@@ -8398,6 +8525,9 @@ msgstr ""
msgid "Configure the way a user creates a new account."
msgstr ""
+msgid "Configure via Merge Request"
+msgstr ""
+
msgid "Configure which lists are shown for anyone who visits this board"
msgstr ""
@@ -8863,6 +8993,9 @@ msgstr ""
msgid "Content parsed with %{link}."
msgstr ""
+msgid "ContentEditor|Table of Contents"
+msgstr ""
+
msgid "ContentEditor|You have to provide a renderMarkdown function or a custom serializer"
msgstr ""
@@ -9049,6 +9182,9 @@ msgstr ""
msgid "Copy link to chart"
msgstr ""
+msgid "Copy prefix"
+msgstr ""
+
msgid "Copy reference"
msgstr ""
@@ -9079,6 +9215,9 @@ msgstr ""
msgid "Copy value"
msgstr ""
+msgid "Corpus Management"
+msgstr ""
+
msgid "Corpus Management|Are you sure you want to delete the corpus?"
msgstr ""
@@ -9307,6 +9446,9 @@ msgstr ""
msgid "Create commit"
msgstr ""
+msgid "Create common files more quickly, and standardize their format."
+msgstr ""
+
msgid "Create confidential merge request"
msgstr ""
@@ -9340,6 +9482,9 @@ msgstr ""
msgid "Create issue"
msgstr ""
+msgid "Create issue to resolve all threads"
+msgstr ""
+
msgid "Create iteration"
msgstr ""
@@ -9394,6 +9539,9 @@ msgstr ""
msgid "Create new..."
msgstr ""
+msgid "Create or import your first project"
+msgstr ""
+
msgid "Create project"
msgstr ""
@@ -9751,7 +9899,7 @@ msgstr ""
msgid "Custom notification events"
msgstr ""
-msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notificationLinkStart} notification emails%{notificationLinkEnd}."
+msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notificationLinkStart}notification emails%{notificationLinkEnd}."
msgstr ""
msgid "Custom project templates"
@@ -9948,10 +10096,10 @@ msgid "CycleAnalytics|Showing %{subjectFilterText} and %{selectedLabelsCount} la
msgid_plural "CycleAnalytics|Showing %{subjectFilterText} and %{selectedLabelsCount} labels"
msgstr[0] ""
-msgid "CycleAnalytics|Showing data for group '%{groupName}' and %{selectedProjectCount} projects from %{startDate} to %{endDate}"
+msgid "CycleAnalytics|Showing data for group '%{groupName}' and %{selectedProjectCount} projects from %{createdAfter} to %{createdBefore}"
msgstr ""
-msgid "CycleAnalytics|Showing data for group '%{groupName}' from %{startDate} to %{endDate}"
+msgid "CycleAnalytics|Showing data for group '%{groupName}' from %{createdAfter} to %{createdBefore}"
msgstr ""
msgid "CycleAnalytics|Stages"
@@ -10185,6 +10333,9 @@ msgstr ""
msgid "DastProfiles|Manage profiles"
msgstr ""
+msgid "DastProfiles|Manage site profiles"
+msgstr ""
+
msgid "DastProfiles|Minimum = 0 (no timeout enabled), Maximum = 2880 minutes"
msgstr ""
@@ -10260,6 +10411,9 @@ msgstr ""
msgid "DastProfiles|Scanner name"
msgstr ""
+msgid "DastProfiles|Schedule"
+msgstr ""
+
msgid "DastProfiles|Select branch"
msgstr ""
@@ -10329,7 +10483,7 @@ msgstr ""
msgid "DastProfiles|Website"
msgstr ""
-msgid "DastProfiles|You can either choose a passive scan or validate the target site in your chosen site profile. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
+msgid "DastProfiles|You can either choose a passive scan or validate the target site from the site profile management page. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
msgstr ""
msgid "DastProfiles|You cannot run an active scan against an unvalidated site."
@@ -10501,7 +10655,7 @@ msgstr ""
msgid "Days to merge"
msgstr ""
-msgid "Deactivate dormant users after 90 days of inactivity. Users can return to active status by signing in to their account. While inactive, a user is not counted as an active user in the instance."
+msgid "Deactivate dormant users after 90 days of inactivity"
msgstr ""
msgid "Dear Administrator,"
@@ -10588,10 +10742,10 @@ msgstr ""
msgid "Define a custom pattern with cron syntax"
msgstr ""
-msgid "Define approval settings."
+msgid "Define approval rules."
msgstr ""
-msgid "Define approval settings. %{linkStart}Learn more.%{linkEnd}"
+msgid "Define approval rules. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "Define custom rules for what constitutes spam, independent of Akismet"
@@ -10600,7 +10754,7 @@ msgstr ""
msgid "Define environments in the deploy stage(s) in %{code_open}.gitlab-ci.yml%{code_close} to track deployments here."
msgstr ""
-msgid "Define how approval rules are applied as a merge request moves toward completion."
+msgid "Define how approval rules are applied to merge requests."
msgstr ""
msgid "Definition"
@@ -10615,6 +10769,12 @@ msgstr ""
msgid "DelayedJobs|Are you sure you want to run %{job_name} immediately? This job will run automatically after it's timer finishes."
msgstr ""
+msgid "DelayedJobs|Are you sure you want to run %{job_name} immediately? This job will run automatically after its timer finishes."
+msgstr ""
+
+msgid "DelayedJobs|Run the delayed job now?"
+msgstr ""
+
msgid "DelayedJobs|Start now"
msgstr ""
@@ -10888,6 +11048,12 @@ msgstr ""
msgid "Dependency proxy image prefix"
msgstr ""
+msgid "DependencyProxy|Create a local proxy for storing frequently used upstream images. %{docLinkStart}Learn more%{docLinkEnd} about dependency proxies."
+msgstr ""
+
+msgid "DependencyProxy|Dependency Proxy"
+msgstr ""
+
msgid "DependencyProxy|Toggle Dependency Proxy"
msgstr ""
@@ -11125,6 +11291,9 @@ msgstr ""
msgid "Deployments"
msgstr ""
+msgid "Deployments to Google Kubernetes Engine can be "
+msgstr ""
+
msgid "Deployments|%{deployments} environment impacted."
msgid_plural "Deployments|%{deployments} environments impacted."
msgstr[0] ""
@@ -11153,6 +11322,9 @@ msgstr ""
msgid "Deployment|success"
msgstr ""
+msgid "Deprecated API rate limits"
+msgstr ""
+
msgid "Deprioritize label"
msgstr ""
@@ -11555,6 +11727,14 @@ msgstr ""
msgid "DiffsCompareBaseBranch|(base)"
msgstr ""
+msgid "Diffs|%d addition"
+msgid_plural "Diffs|%d additions"
+msgstr[0] ""
+
+msgid "Diffs|%d deletion"
+msgid_plural "Diffs|%d deletions"
+msgstr[0] ""
+
msgid "Diffs|No file name available"
msgstr ""
@@ -11564,9 +11744,16 @@ msgstr ""
msgid "Diffs|Show all unchanged lines"
msgstr ""
+msgid "Diffs|Showing %{dropdownStart}%{count} changed file%{dropdownEnd}"
+msgid_plural "Diffs|Showing %{dropdownStart}%{count} changed files%{dropdownEnd}"
+msgstr[0] ""
+
msgid "Diffs|Something went wrong while fetching diff lines."
msgstr ""
+msgid "Diffs|with %{additions} and %{deletions}"
+msgstr ""
+
msgid "Direct member"
msgstr ""
@@ -11691,9 +11878,6 @@ msgid "Dismiss %d selected vulnerability as"
msgid_plural "Dismiss %d selected vulnerabilities as"
msgstr[0] ""
-msgid "Dismiss Value Stream Analytics introduction box"
-msgstr ""
-
msgid "Dismiss merge request promotion"
msgstr ""
@@ -12015,6 +12199,9 @@ msgstr ""
msgid "Edit issues"
msgstr ""
+msgid "Edit merge requests"
+msgstr ""
+
msgid "Edit public deploy key"
msgstr ""
@@ -12090,6 +12277,9 @@ msgstr ""
msgid "Elastic|None. Select projects to index."
msgstr ""
+msgid "Eligible users"
+msgstr ""
+
msgid "Email"
msgstr ""
@@ -12219,6 +12409,9 @@ msgstr ""
msgid "Enable"
msgstr ""
+msgid "Enable Amazon EKS integration"
+msgstr ""
+
msgid "Enable Auto DevOps"
msgstr ""
@@ -12252,6 +12445,9 @@ msgstr ""
msgid "Enable SSL verification"
msgstr ""
+msgid "Enable Service Ping"
+msgstr ""
+
msgid "Enable Snowplow tracking"
msgstr ""
@@ -12282,6 +12478,9 @@ msgstr ""
msgid "Enable authenticated Git LFS request rate limit"
msgstr ""
+msgid "Enable authenticated web request rate limit"
+msgstr ""
+
msgid "Enable authentication"
msgstr ""
@@ -12342,7 +12541,7 @@ msgstr ""
msgid "Enable or disable the Pseudonymizer data collection."
msgstr ""
-msgid "Enable or disable version check and service ping."
+msgid "Enable or disable version check and Service Ping."
msgstr ""
msgid "Enable protected paths rate limit"
@@ -12354,18 +12553,12 @@ msgstr ""
msgid "Enable reCAPTCHA"
msgstr ""
-msgid "Enable reCAPTCHA for login"
-msgstr ""
-
-msgid "Enable reCAPTCHA, Invisible Captcha, Akismet and set IP limits. For reCAPTCHA, we currently only support %{recaptcha_v2_link_start}v2%{recaptcha_v2_link_end}"
+msgid "Enable reCAPTCHA for login."
msgstr ""
msgid "Enable repository checks"
msgstr ""
-msgid "Enable service ping"
-msgstr ""
-
msgid "Enable shared runners for all projects and subgroups in this group."
msgstr ""
@@ -12387,7 +12580,10 @@ msgstr ""
msgid "Enable unauthenticated API request rate limit"
msgstr ""
-msgid "Enable unauthenticated request rate limit"
+msgid "Enable unauthenticated web request rate limit"
+msgstr ""
+
+msgid "Enable user deactivation emails"
msgstr ""
msgid "Enable version check"
@@ -12423,9 +12619,6 @@ msgstr ""
msgid "Enabled sources for code import during project creation. OmniAuth must be configured for GitHub"
msgstr ""
-msgid "Enabling this will only make licensed EE features available to projects if the project namespace's plan includes the feature or if the project is public."
-msgstr ""
-
msgid "Encountered an error while rendering: %{err}"
msgstr ""
@@ -12474,9 +12667,6 @@ msgstr ""
msgid "Enter Admin Mode"
msgstr ""
-msgid "Enter IP address range"
-msgstr ""
-
msgid "Enter a number"
msgstr ""
@@ -12489,9 +12679,6 @@ msgstr ""
msgid "Enter at least three characters to search"
msgstr ""
-msgid "Enter domain"
-msgstr ""
-
msgid "Enter in your Bitbucket Server URL and personal access token below"
msgstr ""
@@ -12678,9 +12865,6 @@ msgstr ""
msgid "Environments|Deployment %{status}"
msgstr ""
-msgid "Environments|Dismiss"
-msgstr ""
-
msgid "Environments|Enable review app"
msgstr ""
@@ -12693,9 +12877,6 @@ msgstr ""
msgid "Environments|Environments are places where code gets deployed, such as staging or production."
msgstr ""
-msgid "Environments|Help us improve environments"
-msgstr ""
-
msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
msgstr ""
@@ -12732,6 +12913,9 @@ msgstr ""
msgid "Environments|Note that this action will stop the environment, but it will %{emphasisStart}not%{emphasisEnd} have an effect on any existing deployment due to no “stop environment action†being defined in the %{ciConfigLinkStart}.gitlab-ci.yml%{ciConfigLinkEnd} file."
msgstr ""
+msgid "Environments|Open"
+msgstr ""
+
msgid "Environments|Open live environment"
msgstr ""
@@ -12771,9 +12955,6 @@ msgstr ""
msgid "Environments|Stopping %{environmentName}"
msgstr ""
-msgid "Environments|Take the survey"
-msgstr ""
-
msgid "Environments|There was an error fetching the logs. Please try again."
msgstr ""
@@ -12795,9 +12976,6 @@ msgstr ""
msgid "Environments|You don't have any environments right now"
msgstr ""
-msgid "Environments|Your feedback helps GitLab make environments better for you and other users. Participate and enter a sweepstake to win a USD 30 gift card."
-msgstr ""
-
msgid "Environments|by %{avatar}"
msgstr ""
@@ -13080,7 +13258,7 @@ msgstr ""
msgid "Error parsing CSV file. Please make sure it has"
msgstr ""
-msgid "Error rendering markdown preview"
+msgid "Error rendering Markdown preview"
msgstr ""
msgid "Error saving label update."
@@ -13128,6 +13306,9 @@ msgstr ""
msgid "Error: %{error_message}"
msgstr ""
+msgid "Error: Couldn't load some or all of the changes."
+msgstr ""
+
msgid "Error: No AWS credentials were supplied"
msgstr ""
@@ -13161,6 +13342,9 @@ msgstr ""
msgid "ErrorTracking|Enable error tracking"
msgstr ""
+msgid "ErrorTracking|Error tracking backend"
+msgstr ""
+
msgid "ErrorTracking|If you self-host Sentry, enter your Sentry instance's full URL. If you use Sentry's hosted solution, enter https://sentry.io"
msgstr ""
@@ -13194,6 +13378,12 @@ msgstr ""
msgid "Escalation policies must have at least one rule"
msgstr ""
+msgid "EscalationPolicies|%{clockIcon} IF alert is not %{alertStatus} in %{minutes}"
+msgstr ""
+
+msgid "EscalationPolicies|%{notificationIcon} THEN %{doAction} %{forScheduleOrUser}"
+msgstr ""
+
msgid "EscalationPolicies|+ Add an additional rule"
msgstr ""
@@ -13236,13 +13426,13 @@ msgstr ""
msgid "EscalationPolicies|Escalation policies"
msgstr ""
-msgid "EscalationPolicies|Escalation rules"
+msgid "EscalationPolicies|Escalation policy %{obstacle} in Project %{project}"
msgstr ""
-msgid "EscalationPolicies|Failed to load oncall-schedules"
+msgid "EscalationPolicies|Escalation rules"
msgstr ""
-msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} %{then} THEN %{doAction} %{scheduleOrUser}"
+msgid "EscalationPolicies|Failed to load oncall-schedules"
msgstr ""
msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} minutes"
@@ -13320,18 +13510,36 @@ msgstr ""
msgid "Every %{action} attempt has failed: %{job_error_message}. Please try again."
msgstr ""
+msgid "Every 3 months"
+msgstr ""
+
+msgid "Every 3 months on the %{day} at %{time} %{timezone}"
+msgstr ""
+
+msgid "Every 6 months"
+msgstr ""
+
+msgid "Every 6 months on the %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Every day"
msgstr ""
msgid "Every day (at %{time})"
msgstr ""
+msgid "Every day at %{time} %{timezone}"
+msgstr ""
+
msgid "Every month"
msgstr ""
msgid "Every month (Day %{day} at %{time})"
msgstr ""
+msgid "Every month on the %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Every three months"
msgstr ""
@@ -13345,6 +13553,15 @@ msgstr[0] ""
msgid "Every week (%{weekday} at %{time})"
msgstr ""
+msgid "Every week on %{day} at %{time} %{timezone}"
+msgstr ""
+
+msgid "Every year"
+msgstr ""
+
+msgid "Every year on %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Everyone"
msgstr ""
@@ -13381,9 +13598,6 @@ msgstr ""
msgid "Exactly one of %{attributes} is required"
msgstr ""
-msgid "Example: %{ip_address}. %{read_more_link}."
-msgstr ""
-
msgid "Example: @sub\\.company\\.com$"
msgstr ""
@@ -13450,13 +13664,13 @@ msgstr ""
msgid "Expand pipeline"
msgstr ""
-msgid "Expand sidebar"
+msgid "Expand settings section"
msgstr ""
-msgid "Expected documents: %{expected_documents}"
+msgid "Expand sidebar"
msgstr ""
-msgid "Experienced"
+msgid "Expected documents: %{expected_documents}"
msgstr ""
msgid "ExperimentSubject|Must have exactly one of User, Namespace, or Project."
@@ -13741,9 +13955,6 @@ msgstr ""
msgid "Failed to load related branches"
msgstr ""
-msgid "Failed to load sidebar lock status"
-msgstr ""
-
msgid "Failed to load stacktrace."
msgstr ""
@@ -14166,6 +14377,9 @@ msgstr ""
msgid "Files"
msgstr ""
+msgid "Files API Rate Limits"
+msgstr ""
+
msgid "Files breadcrumb"
msgstr ""
@@ -15165,6 +15379,9 @@ msgstr ""
msgid "GitLab group: %{source_link}"
msgstr ""
+msgid "GitLab informs you if a new version is available."
+msgstr ""
+
msgid "GitLab is a complete DevOps platform, delivered as a single application, fundamentally changing the way Development, Security, and Ops teams collaborate"
msgstr ""
@@ -15180,7 +15397,7 @@ msgstr ""
msgid "GitLab is open source software to collaborate on code."
msgstr ""
-msgid "GitLab is undergoing maintenance and is operating in a read-only mode."
+msgid "GitLab is undergoing maintenance and is operating in read-only mode."
msgstr ""
msgid "GitLab member or Email address"
@@ -15192,9 +15409,6 @@ msgstr ""
msgid "GitLab project export"
msgstr ""
-msgid "GitLab restart is required to apply changes."
-msgstr ""
-
msgid "GitLab single sign-on URL"
msgstr ""
@@ -15210,9 +15424,6 @@ msgstr ""
msgid "GitLab version"
msgstr ""
-msgid "GitLab will inform you if a new version is available."
-msgstr ""
-
msgid "GitLab will run a background job that will produce pseudonymized CSVs of the GitLab database that will be uploaded to your configured object storage directory."
msgstr ""
@@ -15477,9 +15688,21 @@ msgstr ""
msgid "Go to snippets"
msgstr ""
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check 'Allowed domains for sign-ups'."
+msgstr ""
+
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check 'Email restrictions for sign-ups'."
+msgstr ""
+
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check the 'Domain denylist'."
+msgstr ""
+
msgid "Go to the activity feed"
msgstr ""
+msgid "Go to the group’s 'Settings &gt; General' page, and check 'Restrict membership by email domain'."
+msgstr ""
+
msgid "Go to the milestone list"
msgstr ""
@@ -15516,6 +15739,12 @@ msgstr ""
msgid "Goal of the changes and what reviewers should be aware of"
msgstr ""
+msgid "Google Cloud"
+msgstr ""
+
+msgid "Google Cloud offers several deployment targets. Select the one most suitable for your project."
+msgstr ""
+
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
@@ -15600,9 +15829,6 @@ msgstr ""
msgid "Group ID"
msgstr ""
-msgid "Group ID: %{group_id}"
-msgstr ""
-
msgid "Group Owner must have signed in with SAML before enabling Group Managed Accounts"
msgstr ""
@@ -15777,6 +16003,12 @@ msgstr ""
msgid "GroupImport|Unable to process group import file"
msgstr ""
+msgid "GroupPage|Copy group ID"
+msgstr ""
+
+msgid "GroupPage|Group ID: %{group_id}"
+msgstr ""
+
msgid "GroupRoadmap|%{dateWord} – No end date"
msgstr ""
@@ -15831,6 +16063,9 @@ msgstr ""
msgid "GroupRoadmap|Within 3 years"
msgstr ""
+msgid "GroupSAML|\"persistent\" recommended"
+msgstr ""
+
msgid "GroupSAML|%{strongOpen}Warning%{strongClose} - Enabling %{linkStart}SSO enforcement%{linkEnd} can reduce security risks."
msgstr ""
@@ -15963,6 +16198,9 @@ msgstr ""
msgid "GroupSAML|To be able to prohibit outer forks, you first need to enforce dedicate group managed accounts."
msgstr ""
+msgid "GroupSAML|Use SAML group links to manage group membership using SAML."
+msgstr ""
+
msgid "GroupSAML|Valid SAML Response"
msgstr ""
@@ -15975,13 +16213,10 @@ msgstr ""
msgid "GroupSAML|as %{access_level}"
msgstr ""
-msgid "GroupSAML|must match stored NameID of \"%{extern_uid}\" as we use this to identify users. If the NameID changes users will be unable to sign in."
-msgstr ""
-
-msgid "GroupSAML|should be \"persistent\""
+msgid "GroupSAML|must match stored NameID of \"%{extern_uid}\" to identify user and allow sign in"
msgstr ""
-msgid "GroupSAML|should be a random persistent ID, emails are discouraged"
+msgid "GroupSAML|recommend persistent ID instead of email"
msgstr ""
msgid "GroupSelect|No matching results"
@@ -15996,9 +16231,15 @@ msgstr ""
msgid "GroupSettings|Allow project access token creation"
msgstr ""
+msgid "GroupSettings|Applied to all subgroups unless overridden by a group owner. Groups already added to the project lose access."
+msgstr ""
+
msgid "GroupSettings|Auto DevOps pipeline was updated for the group"
msgstr ""
+msgid "GroupSettings|Available only on the top-level group. Applies to all subgroups. Groups already shared with a group outside %{group} are still shared unless removed manually."
+msgstr ""
+
msgid "GroupSettings|Badges"
msgstr ""
@@ -16050,6 +16291,9 @@ msgstr ""
msgid "GroupSettings|New runners registration token has been generated!"
msgstr ""
+msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgstr ""
+
msgid "GroupSettings|Pipeline settings was updated for the group"
msgstr ""
@@ -16062,12 +16306,15 @@ msgstr ""
msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
-msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups."
+msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups"
msgstr ""
msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
msgstr ""
+msgid "GroupSettings|Prevents group members from being notified if the group is mentioned."
+msgstr ""
+
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
msgstr ""
@@ -16104,21 +16351,6 @@ msgstr ""
msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}."
msgstr ""
-msgid "GroupSettings|This setting is only available on the top-level group and it applies to all subgroups. Groups that have already been shared with a group outside %{group} will still be shared, and this access will have to be revoked manually."
-msgstr ""
-
-msgid "GroupSettings|This setting will be applied to all subgroups unless overridden by a group owner. Groups that already have access to the project will continue to have access unless removed manually."
-msgstr ""
-
-msgid "GroupSettings|This setting will override user notification preferences for all members of the group, subgroups, and projects."
-msgstr ""
-
-msgid "GroupSettings|This setting will prevent group members from being notified if the group is mentioned."
-msgstr ""
-
-msgid "GroupSettings|This setting will prevent group members from forking projects outside of the group."
-msgstr ""
-
msgid "GroupSettings|Transfer group"
msgstr ""
@@ -16236,7 +16468,7 @@ msgstr ""
msgid "GroupsNew|No import options available"
msgstr ""
-msgid "GroupsNew|Not all related objects are migrated, as %{docs_link_start}described here%{docs_link_end}. Please %{feedback_link_start}leave feedback%{feedback_link_end} on this feature."
+msgid "GroupsNew|Not all related objects are migrated. %{docs_link_start}More info%{docs_link_end}."
msgstr ""
msgid "GroupsNew|Personal access token"
@@ -16368,15 +16600,27 @@ msgstr ""
msgid "Hello %{name},"
msgstr ""
-msgid "Hello there"
-msgstr ""
-
msgid "Hello, %{name}!"
msgstr ""
msgid "Hello, %{username}!"
msgstr ""
+msgid "HelloMessage|%{handshake_emoji} Contribute to GitLab: %{contribute_link}"
+msgstr ""
+
+msgid "HelloMessage|%{magnifier_emoji} Create a new GitLab issue: %{new_issue_link}"
+msgstr ""
+
+msgid "HelloMessage|%{rocket_emoji} We like your curiosity! Help us improve GitLab by joining the team: %{jobs_page_link}"
+msgstr ""
+
+msgid "HelloMessage|Does this page need fixes or improvements? Open an issue or contribute a merge request to help make GitLab more lovable. At GitLab, everyone can contribute!"
+msgstr ""
+
+msgid "HelloMessage|Welcome to GitLab!"
+msgstr ""
+
msgid "Help"
msgstr ""
@@ -16386,13 +16630,10 @@ msgstr ""
msgid "Helps prevent bots from creating accounts."
msgstr ""
-msgid "Helps prevent bots from creating issues"
-msgstr ""
-
-msgid "Helps prevent malicious users hide their activity"
+msgid "Helps prevent bots from creating issues."
msgstr ""
-msgid "Helps reduce request volume (e.g. from crawlers or abusive bots)"
+msgid "Helps prevent malicious users hide their activity."
msgstr ""
msgid "Helps reduce request volume (for example, from crawlers or abusive bots)"
@@ -16514,6 +16755,12 @@ msgstr ""
msgid "Housekeeping, export, path, transfer, remove, archive."
msgstr ""
+msgid "How do I configure Akismet?"
+msgstr ""
+
+msgid "How do I configure it?"
+msgstr ""
+
msgid "How do I configure runners?"
msgstr ""
@@ -16535,19 +16782,25 @@ msgstr ""
msgid "How do I set up this service?"
msgstr ""
+msgid "How do I use a web terminal?"
+msgstr ""
+
+msgid "How do I use file templates?"
+msgstr ""
+
msgid "How it works"
msgstr ""
msgid "How many days need to pass between marking entity for deletion and actual removing it."
msgstr ""
-msgid "How many seconds an IP will be counted towards the limit"
+msgid "How many seconds an IP counts toward the IP address limit."
msgstr ""
-msgid "I accept the %{terms_link}"
+msgid "How the job limiter handles jobs exceeding the thresholds specified below. The 'track' mode only logs the jobs. The 'compress' mode compresses the jobs and raises an exception if the compressed size exceeds the limit."
msgstr ""
-msgid "I accept the|Terms of Service and Privacy Policy"
+msgid "I accept the %{terms_link}"
msgstr ""
msgid "I forgot my password"
@@ -16631,13 +16884,16 @@ msgstr ""
msgid "IP Address"
msgstr ""
-msgid "IP expiration time"
+msgid "IP address expiration time"
msgstr ""
-msgid "IP subnet restriction only allowed for top-level groups"
+msgid "IP address restrictions"
+msgstr ""
+
+msgid "IP addresses per user"
msgstr ""
-msgid "IPs per user"
+msgid "IP subnet restriction only allowed for top-level groups"
msgstr ""
msgid "Identifier"
@@ -16652,6 +16908,9 @@ msgstr ""
msgid "If any indexed field exceeds this limit it will be truncated to this number of characters and the rest will not be indexed or searchable. This does not apply to repository and wiki indexing. Setting this to 0 means it is unlimited."
msgstr ""
+msgid "If blank, defaults to %{code_open}Retry later%{code_close}."
+msgstr ""
+
msgid "If blank, set allowable lifetime to %{instance_level_policy_in_words}, as defined by the instance admin. Once set, existing tokens for users in this group may be revoked."
msgstr ""
@@ -16703,6 +16962,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 did not initiate these sign-in attempts, please reach out to your administrator or enable two-factor authentication (2FA) on your account."
+msgstr ""
+
msgid "If you did not initiate this change, please contact your administrator immediately."
msgstr ""
@@ -16792,10 +17054,10 @@ msgstr ""
msgid "Import Projects from Gitea"
msgstr ""
-msgid "Import a project"
+msgid "Import an exported GitLab project"
msgstr ""
-msgid "Import an exported GitLab project"
+msgid "Import and export rate limits"
msgstr ""
msgid "Import failed due to a GitHub error: %{original}"
@@ -16807,12 +17069,18 @@ msgstr ""
msgid "Import from Jira"
msgstr ""
+msgid "Import group"
+msgstr ""
+
msgid "Import group from file"
msgstr ""
msgid "Import groups"
msgstr ""
+msgid "Import history"
+msgstr ""
+
msgid "Import in progress"
msgstr ""
@@ -16876,7 +17144,25 @@ msgstr ""
msgid "Import timed out. Import took longer than %{import_jobs_expiration} seconds"
msgstr ""
-msgid "Import/Export Rate Limits"
+msgid "ImportAProjectModal|Import from a project"
+msgstr ""
+
+msgid "ImportAProjectModal|Import members from another project"
+msgstr ""
+
+msgid "ImportAProjectModal|Import project members"
+msgstr ""
+
+msgid "ImportAProjectModal|Only project members (not group members) are imported, and they get the same permissions as the project you import from."
+msgstr ""
+
+msgid "ImportAProjectModal|Successfully imported"
+msgstr ""
+
+msgid "ImportAProjectModal|Unable to import project members"
+msgstr ""
+
+msgid "ImportAProjectModal|You're importing members to the %{strongStart}%{name}%{strongEnd} project."
msgstr ""
msgid "ImportButtons|Connect repositories from"
@@ -16928,7 +17214,7 @@ msgstr[0] ""
msgid "Importing..."
msgstr ""
-msgid "Import|A repository URL usually ends in a .git suffix, although this is not required. Double check to make sure your repository URL is correct."
+msgid "Import|There is not a valid Git repository at this URL. If your HTTP repository is not publicly accessible, verify your credentials."
msgstr ""
msgid "Improve customer support with Service Desk"
@@ -16937,9 +17223,6 @@ msgstr ""
msgid "Improves Git cloning performance."
msgstr ""
-msgid "In %{time_to_now}"
-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 ""
@@ -17225,7 +17508,7 @@ msgstr ""
msgid "InProductMarketing|Start a GitLab Ultimate trial today in less than one minute, no credit card required."
msgstr ""
-msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no CC required"
+msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no credit card required"
msgstr ""
msgid "InProductMarketing|Start a trial"
@@ -17264,7 +17547,7 @@ msgstr ""
msgid "InProductMarketing|Team up in GitLab for greater efficiency"
msgstr ""
-msgid "InProductMarketing|Team work makes the dream work"
+msgid "InProductMarketing|Team work makes the dream work"
msgstr ""
msgid "InProductMarketing|Test, create, deploy"
@@ -17844,6 +18127,9 @@ msgstr ""
msgid "Integrations|Create new issue in Jira"
msgstr ""
+msgid "Integrations|Create new issue in ZenTao"
+msgstr ""
+
msgid "Integrations|Default settings are inherited from the group level."
msgstr ""
@@ -17937,9 +18223,15 @@ msgstr ""
msgid "Integrations|Search Jira issues"
msgstr ""
+msgid "Integrations|Search ZenTao issues"
+msgstr ""
+
msgid "Integrations|Send notifications about project events to Unify Circuit."
msgstr ""
+msgid "Integrations|Send notifications about project events to a Unify Circuit conversation. %{docs_link}"
+msgstr ""
+
msgid "Integrations|Sign in to add namespaces"
msgstr ""
@@ -17979,6 +18271,9 @@ msgstr ""
msgid "Integrations|You've activated every integration 🎉"
msgstr ""
+msgid "Integrations|ZenTao issues display here when you create issues in your project in ZenTao."
+msgstr ""
+
msgid "Interactive mode"
msgstr ""
@@ -18006,9 +18301,6 @@ msgstr ""
msgid "Interval Pattern"
msgstr ""
-msgid "Introducing Value Stream Analytics"
-msgstr ""
-
msgid "Introducing Your DevOps Report"
msgstr ""
@@ -18105,6 +18397,12 @@ msgstr ""
msgid "Investigate vulnerability: %{title}"
msgstr ""
+msgid "Invisible Captcha"
+msgstr ""
+
+msgid "Invisible Captcha helps prevent the creation of spam accounts. It adds a honeypot field and time-sensitive form submission to the account signup form."
+msgstr ""
+
msgid "Invitation"
msgstr ""
@@ -18558,12 +18856,18 @@ msgstr ""
msgid "Issues"
msgstr ""
+msgid "Issues I've created"
+msgstr ""
+
msgid "Issues Rate Limits"
msgstr ""
msgid "Issues and merge requests"
msgstr ""
+msgid "Issues assigned to me"
+msgstr ""
+
msgid "Issues can be bugs, tasks or ideas to be discussed. Also, issues are searchable and filterable."
msgstr ""
@@ -18675,7 +18979,7 @@ msgstr ""
msgid "Iterations|Create cadence"
msgstr ""
-msgid "Iterations|Create your first iteration"
+msgid "Iterations|Create iteration"
msgstr ""
msgid "Iterations|Delete cadence"
@@ -18684,6 +18988,9 @@ msgstr ""
msgid "Iterations|Delete iteration cadence?"
msgstr ""
+msgid "Iterations|Delete iteration?"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -18717,12 +19024,18 @@ msgstr ""
msgid "Iterations|New iteration cadence"
msgstr ""
+msgid "Iterations|No closed iterations."
+msgstr ""
+
msgid "Iterations|No iteration cadences to show."
msgstr ""
msgid "Iterations|No iterations in cadence."
msgstr ""
+msgid "Iterations|No open iterations."
+msgstr ""
+
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
@@ -18753,6 +19066,9 @@ msgstr ""
msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
msgstr ""
+msgid "Iterations|This will remove the iteration from any issues that are assigned to it."
+msgstr ""
+
msgid "Iterations|Title"
msgstr ""
@@ -18768,15 +19084,9 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "I’m familiar with the basics of DevOps."
-msgstr ""
-
msgid "I’m joining my team who’s already on GitLab"
msgstr ""
-msgid "I’m not familiar with the basics of DevOps."
-msgstr ""
-
msgid "Jaeger URL"
msgstr ""
@@ -19041,6 +19351,9 @@ msgstr ""
msgid "Job"
msgstr ""
+msgid "Job %{jobName}"
+msgstr ""
+
msgid "Job Failed #%{build_id}"
msgstr ""
@@ -19630,9 +19943,6 @@ msgstr ""
msgid "Learn more in the"
msgstr ""
-msgid "Learn more in the|pipeline schedules documentation"
-msgstr ""
-
msgid "Learn more."
msgstr ""
@@ -19744,9 +20054,6 @@ msgstr ""
msgid "Leave Admin Mode"
msgstr ""
-msgid "Leave blank for no limit. Once set, existing personal access tokens may be revoked."
-msgstr ""
-
msgid "Leave edit mode? All unsaved changes will be lost."
msgstr ""
@@ -19792,10 +20099,10 @@ msgstr ""
msgid "LicenseCompliance|Acceptable license to be used in the project"
msgstr ""
-msgid "LicenseCompliance|Add a license"
+msgid "LicenseCompliance|Add license and related policy"
msgstr ""
-msgid "LicenseCompliance|Add license and related policy"
+msgid "LicenseCompliance|Add license policy"
msgstr ""
msgid "LicenseCompliance|Allow"
@@ -19879,6 +20186,9 @@ msgstr ""
msgid "LicenseManagement|Uncategorized"
msgstr ""
+msgid "Licensed Enterprise Edition features can be used if the project namespace's plan includes the feature, or if the project is public."
+msgstr ""
+
msgid "Licensed Features"
msgstr ""
@@ -19945,7 +20255,10 @@ msgstr ""
msgid "Limit namespaces and projects that can be indexed"
msgstr ""
-msgid "Limit sign in from multiple ips"
+msgid "Limit project size at a global, group, and project level. %{link_start}Learn more%{link_end}."
+msgstr ""
+
+msgid "Limit sign in from multiple IP addresses"
msgstr ""
msgid "Limit the number of concurrent operations this secondary site can run in the background."
@@ -19957,10 +20270,16 @@ msgstr ""
msgid "Limit the number of issues and epics per minute a user can create through web and API requests."
msgstr ""
+msgid "Limit the size of Sidekiq jobs stored in Redis."
+msgstr ""
+
msgid "Limited to showing %d event at most"
msgid_plural "Limited to showing %d events at most"
msgstr[0] ""
+msgid "Limiting mode"
+msgstr ""
+
msgid "Line changes"
msgstr ""
@@ -20030,9 +20349,6 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
-msgid "List of users to be excluded from the limit"
-msgstr ""
-
msgid "List options"
msgstr ""
@@ -20072,9 +20388,6 @@ msgstr ""
msgid "Loading functions timed out. Please reload the page to try again."
msgstr ""
-msgid "Loading issues"
-msgstr ""
-
msgid "Loading more"
msgstr ""
@@ -20366,6 +20679,9 @@ msgstr ""
msgid "Marked For Deletion At - %{deletion_time}"
msgstr ""
+msgid "Marked as ready. Merging is now allowed."
+msgstr ""
+
msgid "Marked this %{noun} as a draft."
msgstr ""
@@ -20438,52 +20754,22 @@ msgstr ""
msgid "Max 100,000 events"
msgstr ""
-msgid "Max 20 characters"
-msgstr ""
-
-msgid "Max Group Export Download requests per minute per user"
-msgstr ""
-
-msgid "Max Group Export requests per minute per user"
-msgstr ""
-
-msgid "Max Group Import requests per minute per user"
-msgstr ""
-
-msgid "Max Project Export Download requests per minute per user"
-msgstr ""
-
-msgid "Max Project Export requests per minute per user"
-msgstr ""
-
-msgid "Max Project Import requests per minute per user"
-msgstr ""
-
-msgid "Max authenticated API requests per period per user"
-msgstr ""
-
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
-msgid "Max authenticated web requests per period per user"
-msgstr ""
-
msgid "Max file size is 200 KB."
msgstr ""
-msgid "Max requests per minute per user"
-msgstr ""
-
msgid "Max role"
msgstr ""
msgid "Max session time"
msgstr ""
-msgid "Max unauthenticated requests per period per IP"
+msgid "MaxBuilds"
msgstr ""
-msgid "MaxBuilds"
+msgid "Maximum 20 characters"
msgstr ""
msgid "Maximum Conan package file size in bytes"
@@ -20519,6 +20805,12 @@ msgstr ""
msgid "Maximum attachment size (MB)"
msgstr ""
+msgid "Maximum authenticated API requests per rate limit period per user"
+msgstr ""
+
+msgid "Maximum authenticated web requests per rate limit period per user"
+msgstr ""
+
msgid "Maximum bulk request size (MiB)"
msgstr ""
@@ -20564,6 +20856,15 @@ msgstr ""
msgid "Maximum files in a diff"
msgstr ""
+msgid "Maximum group export download requests per minute"
+msgstr ""
+
+msgid "Maximum group export requests per minute"
+msgstr ""
+
+msgid "Maximum group import requests per minute"
+msgstr ""
+
msgid "Maximum import size"
msgstr ""
@@ -20600,7 +20901,7 @@ msgstr ""
msgid "Maximum number of projects."
msgstr ""
-msgid "Maximum number of unique IPs per user"
+msgid "Maximum number of unique IP addresses per user."
msgstr ""
msgid "Maximum page reached"
@@ -20609,12 +20910,24 @@ msgstr ""
msgid "Maximum page size"
msgstr ""
+msgid "Maximum project export download requests per minute"
+msgstr ""
+
+msgid "Maximum project export requests per minute"
+msgstr ""
+
+msgid "Maximum project import requests per minute"
+msgstr ""
+
msgid "Maximum push size"
msgstr ""
msgid "Maximum push size (MB)"
msgstr ""
+msgid "Maximum requests per minute"
+msgstr ""
+
msgid "Maximum running slices"
msgstr ""
@@ -20642,10 +20955,16 @@ msgstr ""
msgid "Maximum time between updates that a mirror can have when scheduled to synchronize."
msgstr ""
-msgid "Maximum time for web terminal websocket connection (in seconds). 0 for unlimited."
+msgid "Maximum time that users are allowed to skip the setup of two-factor authentication (in hours). Set to 0 (zero) to enforce at next sign in."
msgstr ""
-msgid "Maximum time that users are allowed to skip the setup of two-factor authentication (in hours). Set to 0 (zero) to enforce at next sign in."
+msgid "Maximum time, in seconds, for a web terminal websocket connection. 0 for unlimited."
+msgstr ""
+
+msgid "Maximum unauthenticated API requests per rate limit period per IP"
+msgstr ""
+
+msgid "Maximum unauthenticated web requests per rate limit period per IP"
msgstr ""
msgid "May"
@@ -20663,9 +20982,6 @@ msgstr ""
msgid "Medium vulnerabilities present"
msgstr ""
-msgid "Member lock"
-msgstr ""
-
msgid "Member since"
msgstr ""
@@ -20702,6 +21018,9 @@ msgstr ""
msgid "Members of a group may only view projects they have permission to access"
msgstr ""
+msgid "Membership"
+msgstr ""
+
msgid "Members|%{time} by %{user}"
msgstr ""
@@ -20762,9 +21081,6 @@ msgstr ""
msgid "Members|Expiration date updated successfully."
msgstr ""
-msgid "Members|Expired"
-msgstr ""
-
msgid "Members|Filter members"
msgstr ""
@@ -20780,9 +21096,6 @@ msgstr ""
msgid "Members|Membership"
msgstr ""
-msgid "Members|No expiration set"
-msgstr ""
-
msgid "Members|Remove \"%{groupName}\""
msgstr ""
@@ -20804,9 +21117,6 @@ msgstr ""
msgid "Members|Search invited"
msgstr ""
-msgid "Members|in %{time}"
-msgstr ""
-
msgid "Member|Deny access"
msgstr ""
@@ -20882,9 +21192,6 @@ msgstr ""
msgid "Merge request %{mr_link} was reviewed by %{mr_author}"
msgstr ""
-msgid "Merge request (MR) approvals"
-msgstr ""
-
msgid "Merge request analytics"
msgstr ""
@@ -20906,12 +21213,21 @@ msgstr ""
msgid "Merge requests"
msgstr ""
+msgid "Merge requests I've created"
+msgstr ""
+
msgid "Merge requests are a place to propose changes you've made to a project and discuss those changes with others"
msgstr ""
msgid "Merge requests are read-only in a secondary Geo node"
msgstr ""
+msgid "Merge requests assigned to me"
+msgstr ""
+
+msgid "Merge requests that I'm a reviewer"
+msgstr ""
+
msgid "Merge the branch and fix any conflicts that come up"
msgstr ""
@@ -20972,10 +21288,10 @@ msgstr ""
msgid "MergeRequests|An error occurred while saving the draft comment."
msgstr ""
-msgid "MergeRequests|Failed to squash. Should be done manually."
+msgid "MergeRequests|Create issue to resolve thread"
msgstr ""
-msgid "MergeRequests|Resolve this thread in a new issue"
+msgid "MergeRequests|Failed to squash. Should be done manually."
msgstr ""
msgid "MergeRequests|Saving the comment failed"
@@ -21787,6 +22103,9 @@ msgstr ""
msgid "MoveIssue|Cannot move issue to project it originates from!"
msgstr ""
+msgid "MoveIssue|Cannot move issues of '%{issue_type}' type."
+msgstr ""
+
msgid "Moved issue to %{label} column in the board."
msgstr ""
@@ -21911,6 +22230,15 @@ 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. To learn more about reducing storage capacity please visit our docs."
msgstr ""
+msgid "NamespaceUserCap|Pending users must be reviewed and approved by a group owner. Learn more about %{user_caps_link_start}User Caps%{link_end} and %{users_pending_approval_link_start}Users Pending Approval%{link_end}."
+msgstr ""
+
+msgid "NamespaceUserCap|View pending user approvals"
+msgstr ""
+
+msgid "NamespaceUserCap|Your group has reached its billable member limit"
+msgstr ""
+
msgid "Namespaces"
msgstr ""
@@ -21953,9 +22281,6 @@ msgstr ""
msgid "Network"
msgstr ""
-msgid "Network Policy|New rule"
-msgstr ""
-
msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is inbound from a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
msgstr ""
@@ -21977,16 +22302,13 @@ msgstr ""
msgid "NetworkPolicies|%{strongOpen}any%{strongClose} port"
msgstr ""
-msgid "NetworkPolicies|+ Add alert"
-msgstr ""
-
msgid "NetworkPolicies|.yaml"
msgstr ""
msgid "NetworkPolicies|.yaml mode"
msgstr ""
-msgid "NetworkPolicies|Actions"
+msgid "NetworkPolicies|Add alert"
msgstr ""
msgid "NetworkPolicies|Alerts are intended to be selectively used for a limited number of events that are potentially concerning and warrant a manual review. Alerts should not be used as a substitute for a SIEM or a logging tool. High volume alerts are likely to be dropped so as to preserve the stability of GitLab's integration with Kubernetes."
@@ -22022,9 +22344,6 @@ msgstr ""
msgid "NetworkPolicies|Deny all traffic"
msgstr ""
-msgid "NetworkPolicies|Description"
-msgstr ""
-
msgid "NetworkPolicies|Edit policy"
msgstr ""
@@ -22037,9 +22356,6 @@ msgstr ""
msgid "NetworkPolicies|IP/subnet"
msgstr ""
-msgid "NetworkPolicies|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
-msgstr ""
-
msgid "NetworkPolicies|Invalid or empty policy"
msgstr ""
@@ -22049,19 +22365,16 @@ msgstr ""
msgid "NetworkPolicies|Kubernetes error: %{error}"
msgstr ""
-msgid "NetworkPolicies|Name"
-msgstr ""
-
msgid "NetworkPolicies|Network"
msgstr ""
-msgid "NetworkPolicies|Network traffic"
+msgid "NetworkPolicies|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
msgstr ""
-msgid "NetworkPolicies|New policy"
+msgid "NetworkPolicies|Network policy can be created after the environment is loaded successfully."
msgstr ""
-msgid "NetworkPolicies|No policies detected"
+msgid "NetworkPolicies|Network traffic"
msgstr ""
msgid "NetworkPolicies|None selected"
@@ -22070,21 +22383,12 @@ msgstr ""
msgid "NetworkPolicies|Please %{installLinkStart}install%{installLinkEnd} and %{configureLinkStart}configure a Kubernetes Agent for this project%{configureLinkEnd} to enable alerts."
msgstr ""
-msgid "NetworkPolicies|Policies are a specification of how groups of pods are allowed to communicate with each other's network endpoints."
-msgstr ""
-
msgid "NetworkPolicies|Policy %{policyName} was successfully changed"
msgstr ""
msgid "NetworkPolicies|Policy definition"
msgstr ""
-msgid "NetworkPolicies|Policy editor"
-msgstr ""
-
-msgid "NetworkPolicies|Policy preview"
-msgstr ""
-
msgid "NetworkPolicies|Rule"
msgstr ""
@@ -22094,9 +22398,6 @@ msgstr ""
msgid "NetworkPolicies|Rule mode is unavailable for this policy. In some cases, we cannot parse the YAML file back into the rules editor."
msgstr ""
-msgid "NetworkPolicies|Rules"
-msgstr ""
-
msgid "NetworkPolicies|Save changes"
msgstr ""
@@ -22109,9 +22410,6 @@ msgstr ""
msgid "NetworkPolicies|Traffic that does not match any rule will be blocked."
msgstr ""
-msgid "NetworkPolicies|Unable to parse policy"
-msgstr ""
-
msgid "NetworkPolicies|all DNS names"
msgstr ""
@@ -22290,6 +22588,9 @@ msgstr ""
msgid "New issue"
msgstr ""
+msgid "New issue in %{project}"
+msgstr ""
+
msgid "New issue title"
msgstr ""
@@ -22368,7 +22669,7 @@ msgstr ""
msgid "Newest first"
msgstr ""
-msgid "Newly registered users will by default be external"
+msgid "Newly-registered users are external by default"
msgstr ""
msgid "Next"
@@ -22683,8 +22984,9 @@ msgstr ""
msgid "No webhooks found, add one in the form above."
msgstr ""
-msgid "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} to renew your subscription."
-msgstr ""
+msgid "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} day to renew your subscription."
+msgid_plural "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} days to renew your subscription."
+msgstr[0] ""
msgid "No. of commits"
msgstr ""
@@ -22701,7 +23003,7 @@ msgstr ""
msgid "Nodes"
msgstr ""
-msgid "Non-admin users can sign in with read-only access and make read-only API requests."
+msgid "Non-admin users are restricted to read-only access, in both GitLab UI and API."
msgstr ""
msgid "None"
@@ -22782,7 +23084,7 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
-msgid "Notes Rate Limits"
+msgid "Notes rate limit"
msgstr ""
msgid "Notes|Are you sure you want to cancel creating this comment?"
@@ -22945,9 +23247,6 @@ msgstr ""
msgid "November"
msgstr ""
-msgid "Novice"
-msgstr ""
-
msgid "Now, personalize your GitLab experience"
msgstr ""
@@ -23116,7 +23415,7 @@ msgstr ""
msgid "OnCallSchedules|For this rotation, on-call will be:"
msgstr ""
-msgid "OnCallSchedules|On-call schedule %{schedule} in Project %{project}"
+msgid "OnCallSchedules|On-call schedule %{obstacle} in Project %{project}"
msgstr ""
msgid "OnCallSchedules|On-call schedules"
@@ -23263,22 +23562,22 @@ msgstr ""
msgid "OnDemandScans|Scanner profile"
msgstr ""
-msgid "OnDemandScans|Select one of the existing profiles"
+msgid "OnDemandScans|Schedule scan"
msgstr ""
-msgid "OnDemandScans|Site profile"
+msgid "OnDemandScans|Select one of the existing profiles"
msgstr ""
-msgid "OnDemandScans|Use existing scanner profile"
+msgid "OnDemandScans|Site profile"
msgstr ""
-msgid "OnDemandScans|Use existing site profile"
+msgid "OnDemandScans|Start time"
msgstr ""
-msgid "OnDemandScans|You can either choose a passive scan or validate the target site in your chosen site profile. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
+msgid "OnDemandScans|Use existing scanner profile"
msgstr ""
-msgid "OnDemandScans|You cannot run an active scan against an unvalidated site."
+msgid "OnDemandScans|Use existing site profile"
msgstr ""
msgid "OnDemandScans|You must create a repository within your project to run an on-demand scan."
@@ -23342,6 +23641,9 @@ msgstr ""
msgid "Only admins can delete project"
msgstr ""
+msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
+msgstr ""
+
msgid "Only include features new to your current subscription tier."
msgstr ""
@@ -23360,6 +23662,12 @@ msgstr ""
msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
+msgid "Only reCAPTCHA v2 is supported:"
+msgstr ""
+
+msgid "Only users from the specified IP address ranges are able to reach this group, including all subgroups, projects, and Git repositories."
+msgstr ""
+
msgid "Only verified users with an email address in any of these domains can be added to the group."
msgstr ""
@@ -23546,9 +23854,6 @@ msgstr ""
msgid "Package Registry"
msgstr ""
-msgid "Package Registry Rate Limits"
-msgstr ""
-
msgid "Package Registry: authenticated API requests"
msgstr ""
@@ -23567,6 +23872,9 @@ msgstr ""
msgid "Package recipe already exists"
msgstr ""
+msgid "Package registry rate limits"
+msgstr ""
+
msgid "Package type"
msgstr ""
@@ -23633,6 +23941,9 @@ msgstr ""
msgid "PackageRegistry|Composer"
msgstr ""
+msgid "PackageRegistry|Composer.json with license: %{license} and version: %{version}"
+msgstr ""
+
msgid "PackageRegistry|Conan"
msgstr ""
@@ -23696,6 +24007,9 @@ msgstr ""
msgid "PackageRegistry|Copy require package include"
msgstr ""
+msgid "PackageRegistry|Copy target SHA"
+msgstr ""
+
msgid "PackageRegistry|Copy yarn command"
msgstr ""
@@ -23762,6 +24076,9 @@ msgstr ""
msgid "PackageRegistry|Install package version"
msgstr ""
+msgid "PackageRegistry|Instance-level"
+msgstr ""
+
msgid "PackageRegistry|Invalid Package: failed metadata extraction"
msgstr ""
@@ -23807,6 +24124,9 @@ msgstr ""
msgid "PackageRegistry|Pip Command"
msgstr ""
+msgid "PackageRegistry|Project-level"
+msgstr ""
+
msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
msgstr ""
@@ -23828,6 +24148,9 @@ msgstr ""
msgid "PackageRegistry|Remove package"
msgstr ""
+msgid "PackageRegistry|Required Python: %{pythonVersion}"
+msgstr ""
+
msgid "PackageRegistry|RubyGems"
msgstr ""
@@ -23870,6 +24193,9 @@ msgstr ""
msgid "PackageRegistry|Source project located at %{link}"
msgstr ""
+msgid "PackageRegistry|Target SHA: %{sha}"
+msgstr ""
+
msgid "PackageRegistry|There are no other versions of this package."
msgstr ""
@@ -24038,6 +24364,18 @@ msgstr ""
msgid "Password was successfully updated. Please sign in again."
msgstr ""
+msgid "PasswordPrompt|Confirm password"
+msgstr ""
+
+msgid "PasswordPrompt|Confirm password to continue"
+msgstr ""
+
+msgid "PasswordPrompt|Password is required"
+msgstr ""
+
+msgid "PasswordPrompt|Please enter your password to confirm"
+msgstr ""
+
msgid "Passwords should be unique and not used for any other sites or services."
msgstr ""
@@ -24065,6 +24403,9 @@ msgstr ""
msgid "Paste project path (i.e. gitlab-org/gitlab)"
msgstr ""
+msgid "Paste this DSN into your Sentry SDK"
+msgstr ""
+
msgid "Paste your public SSH key, which is usually contained in the file '~/.ssh/id_ed25519.pub' or '~/.ssh/id_rsa.pub' and begins with 'ssh-ed25519' or 'ssh-rsa'. Do not paste your private SSH key, as that can compromise your identity."
msgstr ""
@@ -24149,6 +24490,9 @@ msgstr ""
msgid "PerformanceBar|First Contentful Paint"
msgstr ""
+msgid "PerformanceBar|Flamegraph with mode:"
+msgstr ""
+
msgid "PerformanceBar|Frontend resources"
msgstr ""
@@ -24182,6 +24526,15 @@ msgstr ""
msgid "PerformanceBar|Trace"
msgstr ""
+msgid "PerformanceBar|cpu"
+msgstr ""
+
+msgid "PerformanceBar|object"
+msgstr ""
+
+msgid "PerformanceBar|wall"
+msgstr ""
+
msgid "Period in seconds"
msgstr ""
@@ -24410,6 +24763,48 @@ msgstr ""
msgid "PipelineSchedules|Variables"
msgstr ""
+msgid "PipelineSource|API"
+msgstr ""
+
+msgid "PipelineSource|Chat"
+msgstr ""
+
+msgid "PipelineSource|External"
+msgstr ""
+
+msgid "PipelineSource|External Pull Request"
+msgstr ""
+
+msgid "PipelineSource|Merge Request"
+msgstr ""
+
+msgid "PipelineSource|On-Demand DAST Scan"
+msgstr ""
+
+msgid "PipelineSource|On-Demand DAST Validation"
+msgstr ""
+
+msgid "PipelineSource|Parent Pipeline"
+msgstr ""
+
+msgid "PipelineSource|Pipeline"
+msgstr ""
+
+msgid "PipelineSource|Push"
+msgstr ""
+
+msgid "PipelineSource|Schedule"
+msgstr ""
+
+msgid "PipelineSource|Trigger"
+msgstr ""
+
+msgid "PipelineSource|Web"
+msgstr ""
+
+msgid "PipelineSource|Web IDE"
+msgstr ""
+
msgid "PipelineStatusTooltip|Pipeline: %{ciStatus}"
msgstr ""
@@ -24710,46 +25105,7 @@ msgstr ""
msgid "Pipeline|Source"
msgstr ""
-msgid "Pipeline|Source|API"
-msgstr ""
-
-msgid "Pipeline|Source|Chat"
-msgstr ""
-
-msgid "Pipeline|Source|External"
-msgstr ""
-
-msgid "Pipeline|Source|External Pull Request"
-msgstr ""
-
-msgid "Pipeline|Source|Merge Request"
-msgstr ""
-
-msgid "Pipeline|Source|On-Demand DAST Scan"
-msgstr ""
-
-msgid "Pipeline|Source|On-Demand DAST Validation"
-msgstr ""
-
-msgid "Pipeline|Source|Parent Pipeline"
-msgstr ""
-
-msgid "Pipeline|Source|Pipeline"
-msgstr ""
-
-msgid "Pipeline|Source|Push"
-msgstr ""
-
-msgid "Pipeline|Source|Schedule"
-msgstr ""
-
-msgid "Pipeline|Source|Trigger"
-msgstr ""
-
-msgid "Pipeline|Source|Web"
-msgstr ""
-
-msgid "Pipeline|Source|Web IDE"
+msgid "Pipeline|Source|Security Policy"
msgstr ""
msgid "Pipeline|Specify variable values to be used in this run. The values specified in %{linkStart}CI/CD settings%{linkEnd} will be used by default."
@@ -24800,7 +25156,7 @@ msgstr ""
msgid "Pipeline|We are currently unable to fetch pipeline data"
msgstr ""
-msgid "Pipeline|You’re about to stop pipeline %{pipelineId}."
+msgid "Pipeline|You’re about to stop pipeline #%{pipelineId}."
msgstr ""
msgid "Pipeline|for"
@@ -24827,6 +25183,9 @@ msgstr ""
msgid "Plain diff"
msgstr ""
+msgid "Plain-text response to send to clients that hit a rate limit"
+msgstr ""
+
msgid "Plan:"
msgstr ""
@@ -24971,9 +25330,6 @@ msgstr ""
msgid "Please provide attributes to update"
msgstr ""
-msgid "Please provide your username or email address."
-msgstr ""
-
msgid "Please reach out if you have any questions and we'll be happy to assist."
msgstr ""
@@ -25016,9 +25372,6 @@ msgstr ""
msgid "Please set a new password before proceeding."
msgstr ""
-msgid "Please share your feedback about %{featureName} %{linkStart}in this issue%{linkEnd} to help us improve the experience."
-msgstr ""
-
msgid "Please solve the captcha"
msgstr ""
@@ -25196,6 +25549,9 @@ msgstr ""
msgid "Prevent adding new members to project membership within this group"
msgstr ""
+msgid "Prevent auto-stopping"
+msgstr ""
+
msgid "Prevent editing approval rules in projects and merge requests."
msgstr ""
@@ -25208,7 +25564,7 @@ msgstr ""
msgid "Prevent users from changing their profile name"
msgstr ""
-msgid "Prevent users from performing write operations on GitLab while performing maintenance."
+msgid "Prevent users from performing write operations while GitLab maintenance is in progress."
msgstr ""
msgid "Preview"
@@ -25481,6 +25837,9 @@ msgstr ""
msgid "Profiles|Enter your name, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Enter your password to confirm the email change"
+msgstr ""
+
msgid "Profiles|Enter your pronouns to let people know how to refer to you"
msgstr ""
@@ -25715,10 +26074,10 @@ msgstr ""
msgid "Profiles|e.g. My MacBook key"
msgstr ""
-msgid "Profiles|username"
+msgid "Profiles|https://website.com"
msgstr ""
-msgid "Profiles|website.com"
+msgid "Profiles|username"
msgstr ""
msgid "Profiles|your account"
@@ -25961,9 +26320,21 @@ msgstr ""
msgid "ProjectSelect| or group"
msgstr ""
+msgid "ProjectSelect|No matching results"
+msgstr ""
+
msgid "ProjectSelect|Search for project"
msgstr ""
+msgid "ProjectSelect|Search projects"
+msgstr ""
+
+msgid "ProjectSelect|Select a project"
+msgstr ""
+
+msgid "ProjectSelect|There was an error fetching the projects. Please try again."
+msgstr ""
+
msgid "ProjectService|Drone server URL"
msgstr ""
@@ -26051,6 +26422,9 @@ msgstr ""
msgid "ProjectService|Trigger event when a new, unique alert is recorded."
msgstr ""
+msgid "ProjectService|Trigger event when a new, unique vulnerability is recorded. (Note: This feature requires an Ultimate plan.)"
+msgstr ""
+
msgid "ProjectService|Trigger event when a pipeline status changes."
msgstr ""
@@ -26465,9 +26839,15 @@ msgstr ""
msgid "Projects are graded based on the highest severity vulnerability present"
msgstr ""
+msgid "Projects are organized into groups"
+msgstr ""
+
msgid "Projects contributed to"
msgstr ""
+msgid "Projects help you organize your work. They contain your file repository, issues, merge requests, and so much more."
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr ""
@@ -26702,10 +27082,10 @@ msgstr ""
msgid "PrometheusService|Prometheus cluster integration"
msgstr ""
-msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
+msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
msgstr ""
-msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
+msgid "PrometheusService|The ID of the IAP-secured resource."
msgstr ""
msgid "PrometheusService|The Prometheus API base URL."
@@ -27323,6 +27703,9 @@ msgstr ""
msgid "Rate limit"
msgstr ""
+msgid "Rate limits can help reduce request volume (like from crawlers or abusive bots)."
+msgstr ""
+
msgid "Raw blob request rate limit per minute"
msgstr ""
@@ -27335,6 +27718,9 @@ msgstr ""
msgid "Re-authentication required"
msgstr ""
+msgid "Re-import"
+msgstr ""
+
msgid "Re-request review"
msgstr ""
@@ -27356,6 +27742,9 @@ msgstr ""
msgid "Read more about related issues"
msgstr ""
+msgid "Read their documentation."
+msgstr ""
+
msgid "Ready to get started with GitLab? Follow these steps to set up your workspace, plan and commit changes, and deploy your project."
msgstr ""
@@ -27389,6 +27778,9 @@ msgstr ""
msgid "Receive any notifications from GitLab."
msgstr ""
+msgid "Receive notification of abuse reports by email."
+msgstr ""
+
msgid "Receive notifications about your own activity"
msgstr ""
@@ -27531,9 +27923,6 @@ msgstr ""
msgid "Registry setup"
msgstr ""
-msgid "Regulate approvals by authors/committers. Affects all projects."
-msgstr ""
-
msgid "Reindexing Status: %{status} (Slice multiplier: %{multiplier}, Maximum running slices: %{max_slices})"
msgstr ""
@@ -27628,6 +28017,9 @@ msgstr ""
msgid "Release|Something went wrong while saving the release details."
msgstr ""
+msgid "Reload page"
+msgstr ""
+
msgid "Remediations"
msgstr ""
@@ -27910,6 +28302,9 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
+msgid "Repeats"
+msgstr ""
+
msgid "Replace"
msgstr ""
@@ -28268,10 +28663,7 @@ msgstr ""
msgid "Require additional authentication for administrative tasks."
msgstr ""
-msgid "Require all users in this group to setup Two-factor authentication"
-msgstr ""
-
-msgid "Require all users in this group to setup two-factor authentication"
+msgid "Require all users in this group to set up two-factor authentication"
msgstr ""
msgid "Required approvals (%{approvals_given} given)"
@@ -28315,6 +28707,9 @@ msgstr[0] ""
msgid "Requires values to meet regular expression requirements."
msgstr ""
+msgid "Requires you to deploy or set up cloud-hosted Sentry."
+msgstr ""
+
msgid "Requires your primary GitLab email address."
msgstr ""
@@ -28375,9 +28770,6 @@ msgstr ""
msgid "Resolve"
msgstr ""
-msgid "Resolve all threads in new issue"
-msgstr ""
-
msgid "Resolve conflicts"
msgstr ""
@@ -28435,6 +28827,9 @@ msgstr ""
msgid "Response text"
msgstr ""
+msgid "Restart GitLab to apply changes."
+msgstr ""
+
msgid "Restart Terminal"
msgstr ""
@@ -28453,6 +28848,9 @@ msgstr ""
msgid "Restoring the project will prevent the project from being removed on this date and restore people's ability to make changes to it."
msgstr ""
+msgid "Restrict group access by IP address. %{link_start}Learn more%{link_end}."
+msgstr ""
+
msgid "Restrict membership by email domain"
msgstr ""
@@ -28764,6 +29162,9 @@ msgstr ""
msgid "Runners|Runner #%{runner_id}"
msgstr ""
+msgid "Runners|Runner assigned to project."
+msgstr ""
+
msgid "Runners|Runner is offline, last contact was %{runner_contact} ago"
msgstr ""
@@ -28776,6 +29177,9 @@ msgstr ""
msgid "Runners|Runner registration"
msgstr ""
+msgid "Runners|Runner unassigned from project."
+msgstr ""
+
msgid "Runners|Runners"
msgstr ""
@@ -28968,7 +29372,7 @@ msgstr ""
msgid "SastEntryPoints|How do I set up SAST?"
msgstr ""
-msgid "SastEntryPoints|Learn more."
+msgid "SastEntryPoints|Learn more"
msgstr ""
msgid "Satisfied"
@@ -29010,7 +29414,7 @@ msgstr ""
msgid "Save pipeline schedule"
msgstr ""
-msgid "Save space and find images in the container Registry. remove unneeded tags and keep only the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
+msgid "Save storage space by automatically deleting tags from the container registry and keeping the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
msgstr ""
msgid "Saving"
@@ -29184,6 +29588,9 @@ msgstr ""
msgid "Search or filter results…"
msgstr ""
+msgid "Search or jump to..."
+msgstr ""
+
msgid "Search project"
msgstr ""
@@ -29244,16 +29651,16 @@ msgstr ""
msgid "SearchCodeResults|of %{link_to_project}"
msgstr ""
-msgid "SearchResults|Showing %{count} %{scope} for%{term_element}"
+msgid "SearchResults|Showing %{count} %{scope} for %{term_element}"
msgstr ""
-msgid "SearchResults|Showing %{count} %{scope} for%{term_element} in your personal and project snippets"
+msgid "SearchResults|Showing %{count} %{scope} for %{term_element} in your personal and project snippets"
msgstr ""
-msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for%{term_element}"
+msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for %{term_element}"
msgstr ""
-msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for%{term_element} in your personal and project snippets"
+msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for %{term_element} in your personal and project snippets"
msgstr ""
msgid "SearchResults|code result"
@@ -29324,6 +29731,9 @@ msgstr ""
msgid "Secret Detection"
msgstr ""
+msgid "Secret access key"
+msgstr ""
+
msgid "Secret token"
msgstr ""
@@ -29363,9 +29773,6 @@ msgstr ""
msgid "SecurityApprovals|A merge request approval is required when the license compliance report contains a denied license."
msgstr ""
-msgid "SecurityApprovals|Configurable if security scanners are enabled. %{linkStart}Learn more.%{linkEnd}"
-msgstr ""
-
msgid "SecurityApprovals|Coverage-Check"
msgstr ""
@@ -29378,24 +29785,18 @@ msgstr ""
msgid "SecurityApprovals|Learn more about Vulnerability-Check"
msgstr ""
-msgid "SecurityApprovals|License Scanning must be enabled. %{linkStart}Learn more%{linkEnd}."
-msgstr ""
-
msgid "SecurityApprovals|License-Check"
msgstr ""
msgid "SecurityApprovals|Requires approval for Denied licenses. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}More information%{linkEnd}"
+msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "SecurityApprovals|Requires approval for vulnerabilities. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
-msgid "SecurityApprovals|Test coverage must be enabled. %{linkStart}Learn more%{linkEnd}."
-msgstr ""
-
msgid "SecurityApprovals|Vulnerability-Check"
msgstr ""
@@ -29459,6 +29860,12 @@ msgstr ""
msgid "SecurityConfiguration|Immediately begin risk analysis and remediation with application security features. Start with SAST and Secret Detection, available to all plans. Upgrade to Ultimate to get all features, including:"
msgstr ""
+msgid "SecurityConfiguration|Manage corpus"
+msgstr ""
+
+msgid "SecurityConfiguration|Manage corpus files used as mutation sources in coverage fuzzing."
+msgstr ""
+
msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
msgstr ""
@@ -29513,6 +29920,12 @@ msgstr ""
msgid "SecurityOrchestration|Action"
msgstr ""
+msgid "SecurityOrchestration|Actions"
+msgstr ""
+
+msgid "SecurityOrchestration|Add rule"
+msgstr ""
+
msgid "SecurityOrchestration|All policies"
msgstr ""
@@ -29546,9 +29959,6 @@ msgstr ""
msgid "SecurityOrchestration|Network"
msgstr ""
-msgid "SecurityOrchestration|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
-msgstr ""
-
msgid "SecurityOrchestration|New policy"
msgstr ""
@@ -29564,6 +29974,9 @@ msgstr ""
msgid "SecurityOrchestration|Policy editor"
msgstr ""
+msgid "SecurityOrchestration|Policy preview"
+msgstr ""
+
msgid "SecurityOrchestration|Policy status"
msgstr ""
@@ -29573,6 +29986,9 @@ msgstr ""
msgid "SecurityOrchestration|Rule"
msgstr ""
+msgid "SecurityOrchestration|Rules"
+msgstr ""
+
msgid "SecurityOrchestration|Scan Execution"
msgstr ""
@@ -29666,6 +30082,9 @@ msgstr ""
msgid "SecurityReports|Create issue"
msgstr ""
+msgid "SecurityReports|Development vulnerabilities"
+msgstr ""
+
msgid "SecurityReports|Dismiss vulnerability"
msgstr ""
@@ -29681,6 +30100,9 @@ msgstr ""
msgid "SecurityReports|Download results"
msgstr ""
+msgid "SecurityReports|Download scanned URLs"
+msgstr ""
+
msgid "SecurityReports|Download scanned resources"
msgstr ""
@@ -29804,6 +30226,9 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
+msgid "SecurityReports|The Vulnerability Report shows the results of the lastest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "SecurityReports|The security reports below contain one or more vulnerability findings that could not be parsed and were not recorded. Download the artifacts in the job output to investigate. Ensure any security report created conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
msgstr ""
@@ -29945,10 +30370,10 @@ msgstr ""
msgid "Select a repository"
msgstr ""
-msgid "Select a role"
+msgid "Select a repository containing templates for common files."
msgstr ""
-msgid "Select a shared template repository for all projects on this instance."
+msgid "Select a role"
msgstr ""
msgid "Select a template repository"
@@ -30026,6 +30451,9 @@ msgstr ""
msgid "Select project to choose zone"
msgstr ""
+msgid "Select project to create issue"
+msgstr ""
+
msgid "Select projects"
msgstr ""
@@ -30143,6 +30571,9 @@ msgstr ""
msgid "Send emails to help guide new users through the onboarding process."
msgstr ""
+msgid "Send emails to users upon account deactivation."
+msgstr ""
+
msgid "Send message"
msgstr ""
@@ -30161,6 +30592,9 @@ msgstr ""
msgid "Send service data"
msgstr ""
+msgid "Sentry"
+msgstr ""
+
msgid "Sentry API URL"
msgstr ""
@@ -30275,6 +30709,9 @@ msgstr ""
msgid "Service"
msgstr ""
+msgid "Service Accounts keys are required to authorize GitLab to deploy your Google Cloud project."
+msgstr ""
+
msgid "Service Desk"
msgstr ""
@@ -30347,15 +30784,15 @@ msgstr ""
msgid "Set a password on your account to pull or push via %{protocol}."
msgstr ""
-msgid "Set a template repository for projects in this group"
-msgstr ""
-
msgid "Set access permissions for this token."
msgstr ""
msgid "Set an instance-wide domain that will be available to all clusters when installing Knative."
msgstr ""
+msgid "Set any rate limit to %{code_open}0%{code_close} to disable the limit."
+msgstr ""
+
msgid "Set default and restrict visibility levels. Configure import sources and git access protocol."
msgstr ""
@@ -30368,7 +30805,7 @@ msgstr ""
msgid "Set limit to 0 to allow any file size."
msgstr ""
-msgid "Set max session time for web terminal."
+msgid "Set limits for web and API requests."
msgstr ""
msgid "Set milestone"
@@ -30377,15 +30814,18 @@ msgstr ""
msgid "Set new password"
msgstr ""
-msgid "Set notification email for abuse reports."
+msgid "Set parent epic to an epic"
msgstr ""
-msgid "Set parent epic to an epic"
+msgid "Set per-user rate limits for imports and exports of projects and groups."
msgstr ""
msgid "Set projects and maximum size limits, session duration, user options, and check feature availability for namespace plan."
msgstr ""
+msgid "Set rate limits for package registry API requests that supersede the general user and IP rate limits."
+msgstr ""
+
msgid "Set severity"
msgstr ""
@@ -30404,15 +30844,24 @@ msgstr ""
msgid "Set the default branch for this project. All merge requests and commits are made against this branch unless you specify a different one."
msgstr ""
+msgid "Set the default expiration time for job artifacts in all projects. Set to %{code_open}0%{code_close} to never expire artifacts by default. If no unit is written, it defaults to seconds. For example, these are all equivalent: %{code_open}3600%{code_close}, %{code_open}60 minutes%{code_close}, or %{code_open}one hour%{code_close}."
+msgstr ""
+
msgid "Set the due date to %{due_date}."
msgstr ""
msgid "Set the iteration to %{iteration_reference}."
msgstr ""
+msgid "Set the maximum session time for a web terminal."
+msgstr ""
+
msgid "Set the milestone to %{milestone_reference}."
msgstr ""
+msgid "Set the per-user rate limit for notes created by web or API requests."
+msgstr ""
+
msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
msgstr ""
@@ -30614,6 +31063,9 @@ msgstr ""
msgid "Show Pipeline IID"
msgstr ""
+msgid "Show all %{issuable_type}."
+msgstr ""
+
msgid "Show all activity"
msgstr ""
@@ -30665,15 +31117,9 @@ msgstr ""
msgid "Show list"
msgstr ""
-msgid "Show me advanced features"
-msgstr ""
-
msgid "Show me how to add a pipeline"
msgstr ""
-msgid "Show me the basics"
-msgstr ""
-
msgid "Show one file at a time"
msgstr ""
@@ -30712,15 +31158,15 @@ msgstr ""
msgid "Showing %{pageSize} of %{total} %{issuableType}"
msgstr ""
-msgid "Showing %{pageSize} of %{total} issues"
-msgstr ""
-
msgid "Showing all epics"
msgstr ""
msgid "Showing all issues"
msgstr ""
+msgid "Showing data for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
+msgstr ""
+
msgid "Showing data for workflow items created in this date range. Date range cannot exceed %{maxDateRange} days."
msgstr ""
@@ -30760,6 +31206,15 @@ msgstr ""
msgid "Sidebar|Weight"
msgstr ""
+msgid "Sidekiq job compression threshold (bytes)"
+msgstr ""
+
+msgid "Sidekiq job size limit (bytes)"
+msgstr ""
+
+msgid "Sidekiq job size limits"
+msgstr ""
+
msgid "Sign in"
msgstr ""
@@ -30880,6 +31335,9 @@ msgstr ""
msgid "Site profile not found for given parameters"
msgstr ""
+msgid "Sites"
+msgstr ""
+
msgid "Size"
msgstr ""
@@ -30910,19 +31368,22 @@ msgstr ""
msgid "SlackIntegration|Sends notifications about project events to Slack channels."
msgstr ""
-msgid "SlackService|2. Paste the %{strong_open}Token%{strong_close} into the field below"
+msgid "SlackService|1. %{slash_command_link_start}Add a slash command%{slash_command_link_end} in your Slack team using this information:"
msgstr ""
-msgid "SlackService|3. Select the %{strong_open}Active%{strong_close} checkbox, press %{strong_open}Save changes%{strong_close} and start using GitLab inside Slack!"
+msgid "SlackService|2. Paste the token from Slack in the %{strong_open}Token%{strong_close} field below."
msgstr ""
-msgid "SlackService|Fill in the word that works best for your team."
+msgid "SlackService|3. Select the %{strong_open}Active%{strong_close} checkbox, select %{strong_open}Save changes%{strong_close}, and start using slash commands in Slack!"
+msgstr ""
+
+msgid "SlackService|After setup, get a list of available Slack slash commands by entering"
msgstr ""
-msgid "SlackService|See list of available commands in Slack after setting up this service, by entering"
+msgid "SlackService|Fill in the word that works best for your team."
msgstr ""
-msgid "SlackService|This service allows users to perform common operations on this project by entering slash commands in Slack."
+msgid "SlackService|Perform common operations in this project by entering slash commands in Slack."
msgstr ""
msgid "Slice multiplier"
@@ -30988,7 +31449,7 @@ msgstr ""
msgid "Some child epics may be hidden due to applied filters"
msgstr ""
-msgid "Some common domains are not allowed. %{read_more_link}."
+msgid "Some common domains are not allowed. %{learn_more_link}."
msgstr ""
msgid "Some of the designs you tried uploading did not change:"
@@ -31072,9 +31533,6 @@ msgstr ""
msgid "Something went wrong while exporting requirements"
msgstr ""
-msgid "Something went wrong while fetching %{listType} list"
-msgstr ""
-
msgid "Something went wrong while fetching branches"
msgstr ""
@@ -31129,15 +31587,9 @@ msgstr ""
msgid "Something went wrong while merging this merge request. Please try again."
msgstr ""
-msgid "Something went wrong while moving issues."
-msgstr ""
-
msgid "Something went wrong while obtaining the Let's Encrypt certificate."
msgstr ""
-msgid "Something went wrong while performing the action."
-msgstr ""
-
msgid "Something went wrong while promoting the issue to an epic. Please try again."
msgstr ""
@@ -31465,7 +31917,10 @@ msgstr ""
msgid "SourcegraphPreferences|Uses a custom %{linkStart}Sourcegraph instance%{linkEnd}."
msgstr ""
-msgid "Spam Check API Key"
+msgid "Spam Check"
+msgstr ""
+
+msgid "Spam Check API key"
msgstr ""
msgid "Spam Logs"
@@ -31483,7 +31938,7 @@ msgstr ""
msgid "Specified URL cannot be used: \"%{reason}\""
msgstr ""
-msgid "Specify an e-mail address regex pattern to identify default internal users."
+msgid "Specify an email address regex pattern to identify default internal users."
msgstr ""
msgid "Speed up your pipelines with Needs relationships"
@@ -31738,7 +32193,7 @@ msgstr ""
msgid "StatusCheck|An error occurred fetching the status checks."
msgstr ""
-msgid "StatusCheck|Apply this status check to any branch or a specific protected branch."
+msgid "StatusCheck|Apply this status check to all branches or a specific protected branch."
msgstr ""
msgid "StatusCheck|Check for a status response in Merge Requests. Failures do not block merges. %{link_start}Learn more%{link_end}."
@@ -32077,6 +32532,9 @@ msgstr ""
msgid "Subscriptions"
msgstr ""
+msgid "Subscription|Your subscription for %{strong}%{namespace_name}%{strong_close} has expired and you are now on %{pricing_link_start}the GitLab Free tier%{pricing_link_end}. Don't worry, your data is safe. Get in touch with our support team (%{support_email}). They'll gladly help with your subscription renewal."
+msgstr ""
+
msgid "Subtracted"
msgstr ""
@@ -32305,6 +32763,9 @@ msgstr ""
msgid "SuperSonics|Plan"
msgstr ""
+msgid "SuperSonics|Please agree to the Subscription Agreement"
+msgstr ""
+
msgid "SuperSonics|Ready to get started? A GitLab plan is ideal for scaling organizations and for multi team usage."
msgstr ""
@@ -32335,6 +32796,9 @@ msgstr ""
msgid "SuperSonics|The activation code is not valid. Please make sure to copy it exactly from the Customers Portal or confirmation email. Learn more about %{linkStart}activating your subscription%{linkEnd}."
msgstr ""
+msgid "SuperSonics|The activation code should be a 24-character alphanumeric string"
+msgstr ""
+
msgid "SuperSonics|There is a connectivity issue."
msgstr ""
@@ -32377,9 +32841,15 @@ msgstr ""
msgid "SuperSonics|You do not have an active subscription"
msgstr ""
+msgid "SuperSonics|You have successfully added a license that activates on %{date}. Please see the subscription history table below for more details."
+msgstr ""
+
msgid "SuperSonics|You'll be charged for %{trueUpLinkStart}users over license%{trueUpLinkEnd} on a quarterly or annual basis, depending on the terms of your agreement."
msgstr ""
+msgid "SuperSonics|Your future dated license was successfully added"
+msgstr ""
+
msgid "SuperSonics|Your subscription"
msgstr ""
@@ -32632,7 +33102,7 @@ msgstr ""
msgid "Template to append to all Service Desk issues"
msgstr ""
-msgid "TemplateRepository|Select a repository to make its templates available to all projects. %{link_start}What should the repository contain?%{link_end} "
+msgid "TemplateRepository|Create common files more quickly, and standardize their format."
msgstr ""
msgid "Templates"
@@ -32834,7 +33304,7 @@ msgstr ""
msgid "TestCases|Search test cases"
msgstr ""
-msgid "TestCases|Something went wrong while adding test case to Todo."
+msgid "TestCases|Something went wrong while adding test case to a to-do item."
msgstr ""
msgid "TestCases|Something went wrong while creating a test case."
@@ -32846,7 +33316,7 @@ msgstr ""
msgid "TestCases|Something went wrong while fetching test cases list."
msgstr ""
-msgid "TestCases|Something went wrong while marking test case todo as done."
+msgid "TestCases|Something went wrong while marking test case to-do item as done."
msgstr ""
msgid "TestCases|Something went wrong while moving test case."
@@ -32966,7 +33436,7 @@ msgstr ""
msgid "Thanks for your purchase!"
msgstr ""
-msgid "That is ok, I do not want to renew"
+msgid "That's OK, I don't want to renew"
msgstr ""
msgid "That's it, well done!"
@@ -32988,7 +33458,7 @@ msgid "The %{type} contains the following error:"
msgid_plural "The %{type} contains the following errors:"
msgstr[0] ""
-msgid "The API key used by GitLab for accessing the Spam Check service endpoint"
+msgid "The API key used by GitLab for accessing the Spam Check service endpoint."
msgstr ""
msgid "The GitLab subscription service (customers.gitlab.com) is currently experiencing an outage. You can monitor the status and get updates at %{linkStart}status.gitlab.com%{linkEnd}."
@@ -33027,9 +33497,6 @@ msgstr ""
msgid "The URL to use for connecting to Elasticsearch. Use a comma-separated list to support clustering (e.g., \"http://localhost:9200, http://localhost:9201\")."
msgstr ""
-msgid "The Vulnerability Report shows the results of the last successful pipeline run on the default branch."
-msgstr ""
-
msgid "The X509 Certificate to use when mutual TLS is required to communicate with the external authorization service. If left blank, the server certificate is still validated when accessing over HTTPS."
msgstr ""
@@ -33087,9 +33554,6 @@ msgstr ""
msgid "The default branch for this project has been changed. Please update your bookmarks."
msgstr ""
-msgid "The default expiration time for job artifacts. 0 for unlimited. The default unit is in seconds, but you can use other units, for example %{code_open}4 mins 2 sec%{code_close}, %{code_open}2h42min%{code_close}."
-msgstr ""
-
msgid "The dependency list details information about the components used within your project."
msgstr ""
@@ -33280,9 +33744,6 @@ msgstr ""
msgid "The merge conflicts for this merge request have already been resolved. Please return to the merge request."
msgstr ""
-msgid "The merge request can now be merged."
-msgstr ""
-
msgid "The metric must be one of %{metrics}."
msgstr ""
@@ -33658,7 +34119,7 @@ msgstr ""
msgid "There was a problem updating the keep latest artifacts setting."
msgstr ""
-msgid "There was an error %{message} todo."
+msgid "There was an error %{message} to-do item."
msgstr ""
msgid "There was an error adding a To Do."
@@ -33697,6 +34158,9 @@ msgstr ""
msgid "There was an error fetching projects"
msgstr ""
+msgid "There was an error fetching search autocomplete suggestions"
+msgstr ""
+
msgid "There was an error fetching stage total counts"
msgstr ""
@@ -34021,6 +34485,9 @@ msgstr ""
msgid "This field is required."
msgstr ""
+msgid "This form is disabled in preview"
+msgstr ""
+
msgid "This group"
msgstr ""
@@ -34042,9 +34509,6 @@ msgstr ""
msgid "This group is linked to a subscription"
msgstr ""
-msgid "This group, including all subgroups, projects and git repositories, will be reachable from only the specified IP address ranges."
-msgstr ""
-
msgid "This group, its subgroups and projects has been scheduled for removal on %{date}."
msgstr ""
@@ -34324,9 +34788,6 @@ msgstr ""
msgid "This user cannot be unlocked manually from GitLab"
msgstr ""
-msgid "This user does not have a pending request"
-msgstr ""
-
msgid "This user has an unconfirmed email address (%{email}). You may force a confirmation."
msgstr ""
@@ -34435,9 +34896,6 @@ msgstr ""
msgid "ThreatMonitoring|Packet Activity"
msgstr ""
-msgid "ThreatMonitoring|Policies"
-msgstr ""
-
msgid "ThreatMonitoring|Requests"
msgstr ""
@@ -34489,6 +34947,12 @@ msgstr ""
msgid "ThreatMonitoring|View documentation"
msgstr ""
+msgid "Threshold in bytes at which to compress Sidekiq job arguments."
+msgstr ""
+
+msgid "Threshold in bytes at which to reject Sidekiq jobs. Set this to 0 to if you don't want to limit Sidekiq jobs."
+msgstr ""
+
msgid "Throughput"
msgstr ""
@@ -34498,6 +34962,9 @@ msgstr ""
msgid "Time"
msgstr ""
+msgid "Time (in hours) that users are allowed to skip forced configuration of two-factor authentication."
+msgstr ""
+
msgid "Time Spent"
msgstr ""
@@ -34564,7 +35031,7 @@ msgstr ""
msgid "TimeTrackingEstimated|Est"
msgstr ""
-msgid "TimeTracking|%{startTag}Spent: %{endTag}%{timeSpentHumanReadable}"
+msgid "TimeTracking|%{spentStart}Spent: %{spentEnd}"
msgstr ""
msgid "TimeTracking|Estimated:"
@@ -34776,6 +35243,9 @@ msgstr ""
msgid "To access this domain create a new DNS record"
msgstr ""
+msgid "To add a custom suffix, set up a Service Desk email address. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "To add an SSH key you need to %{generate_link_start}generate one%{link_end} or use an %{existing_link_start}existing key%{link_end}."
msgstr ""
@@ -34797,13 +35267,16 @@ msgstr ""
msgid "To connect an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To continue using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
+msgstr ""
+
msgid "To continue, you need to select the link in the confirmation email we sent to verify your email address. If you didn't get our email, select %{strongStart}Resend confirmation email.%{strongEnd}"
msgstr ""
msgid "To define internal users, first enable new users set to external"
msgstr ""
-msgid "To enable Registration Features, make sure \"Enable service ping\" is checked."
+msgid "To enable Registration Features, first enable Service Ping."
msgstr ""
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
@@ -34830,7 +35303,7 @@ msgstr ""
msgid "To get started, use the link below to confirm your account."
msgstr ""
-msgid "To help improve GitLab and its user experience, GitLab will periodically collect usage information."
+msgid "To help improve GitLab and its user experience, GitLab periodically collects usage information."
msgstr ""
msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
@@ -34863,7 +35336,7 @@ msgstr ""
msgid "To preserve performance only %{strong_open}%{display_size} of %{real_size}%{strong_close} files are displayed."
msgstr ""
-msgid "To protect this issue's confidentiality, %{forkLink} and set the fork's visibility to private."
+msgid "To protect this issue's confidentiality, %{linkStart}fork this project%{linkEnd} and set the fork's visibility to private."
msgstr ""
msgid "To protect this issue's confidentiality, a private fork of this project was selected."
@@ -34896,12 +35369,15 @@ msgstr ""
msgid "To set up SAML authentication for your group through an identity provider like Azure, Okta, Onelogin, Ping Identity, or your custom SAML 2.0 provider:"
msgstr ""
-msgid "To set up this service:"
+msgid "To set up this integration:"
msgstr ""
msgid "To specify the notification level per project of a group you belong to, you need to visit project page and change notification level there."
msgstr ""
+msgid "To start using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
+msgstr ""
+
msgid "To unsubscribe from this issue, please paste the following link into your browser:"
msgstr ""
@@ -35488,9 +35964,6 @@ msgstr ""
msgid "Unable to fetch branches list, please close the form and try again"
msgstr ""
-msgid "Unable to fetch unscanned projects"
-msgstr ""
-
msgid "Unable to fetch vulnerable projects"
msgstr ""
@@ -35545,6 +36018,15 @@ msgstr ""
msgid "Unable to update this issue at this time."
msgstr ""
+msgid "Unapprove a merge request"
+msgstr ""
+
+msgid "Unapprove the current merge request."
+msgstr ""
+
+msgid "Unapproved the current merge request."
+msgstr ""
+
msgid "Unarchive project"
msgstr ""
@@ -35557,16 +36039,13 @@ msgstr ""
msgid "Unassigned"
msgstr ""
-msgid "Unauthenticated API request rate limit"
-msgstr ""
-
-msgid "Unauthenticated rate limit period in seconds"
+msgid "Unauthenticated API rate limit period in seconds"
msgstr ""
-msgid "Unauthenticated request rate limit"
+msgid "Unauthenticated requests"
msgstr ""
-msgid "Unauthenticated requests"
+msgid "Unauthenticated web rate limit period in seconds"
msgstr ""
msgid "Undo"
@@ -35668,18 +36147,6 @@ msgstr ""
msgid "Unresolved"
msgstr ""
-msgid "UnscannedProjects|15 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|30 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|5 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|60 or more days"
-msgstr ""
-
msgid "Unschedule job"
msgstr ""
@@ -35899,6 +36366,9 @@ msgstr ""
msgid "UsageQuota|%{help_link_start}Shared runners%{help_link_end} are disabled, so there are no limits set on pipeline usage"
msgstr ""
+msgid "UsageQuota|%{linkTitle} help link"
+msgstr ""
+
msgid "UsageQuota|%{percentageLeft} of purchased storage is available"
msgstr ""
@@ -35908,6 +36378,9 @@ msgstr ""
msgid "UsageQuota|Artifacts is a sum of build and pipeline artifacts."
msgstr ""
+msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
+msgstr ""
+
msgid "UsageQuota|Buy additional minutes"
msgstr ""
@@ -35917,9 +36390,21 @@ msgstr ""
msgid "UsageQuota|CI minutes usage by project"
msgstr ""
+msgid "UsageQuota|Code packages and container images."
+msgstr ""
+
msgid "UsageQuota|Current period usage"
msgstr ""
+msgid "UsageQuota|File attachments and smaller design graphics."
+msgstr ""
+
+msgid "UsageQuota|Git repository, managed by the Gitaly service."
+msgstr ""
+
+msgid "UsageQuota|Includes project registry, artifacts, packages, wiki, uploads and other items."
+msgstr ""
+
msgid "UsageQuota|Increase storage temporarily"
msgstr ""
@@ -35938,6 +36423,9 @@ msgstr ""
msgid "UsageQuota|Packages"
msgstr ""
+msgid "UsageQuota|Pipeline artifacts and job artifacts, created with CI/CD."
+msgstr ""
+
msgid "UsageQuota|Pipelines"
msgstr ""
@@ -35956,6 +36444,9 @@ msgstr ""
msgid "UsageQuota|Seats"
msgstr ""
+msgid "UsageQuota|Shared bits of code and text."
+msgstr ""
+
msgid "UsageQuota|Snippets"
msgstr ""
@@ -35965,6 +36456,12 @@ msgstr ""
msgid "UsageQuota|Storage"
msgstr ""
+msgid "UsageQuota|Storage type"
+msgstr ""
+
+msgid "UsageQuota|There is a known issue with Artifact storage where the total could be incorrect for some projects. More details and progress are available in %{warningLinkStart}the epic%{warningLinkEnd}."
+msgstr ""
+
msgid "UsageQuota|This is the total amount of storage used across your projects within this namespace."
msgstr ""
@@ -36004,6 +36501,9 @@ msgstr ""
msgid "UsageQuota|Usage"
msgstr ""
+msgid "UsageQuota|Usage Breakdown"
+msgstr ""
+
msgid "UsageQuota|Usage Quotas"
msgstr ""
@@ -36028,6 +36528,9 @@ msgstr ""
msgid "UsageQuota|Wiki"
msgstr ""
+msgid "UsageQuota|Wiki content."
+msgstr ""
+
msgid "UsageQuota|Wikis"
msgstr ""
@@ -36244,7 +36747,10 @@ msgstr ""
msgid "User Settings"
msgstr ""
-msgid "User and IP Rate Limits"
+msgid "User and IP rate limits"
+msgstr ""
+
+msgid "User does not have a pending request"
msgstr ""
msgid "User identity was successfully created."
@@ -36541,6 +37047,9 @@ msgstr ""
msgid "Users can launch a development environment from a GitLab browser tab when the %{linkStart}Gitpod%{linkEnd} integration is enabled."
msgstr ""
+msgid "Users can reactivate their account by signing in."
+msgstr ""
+
msgid "Users can render diagrams in AsciiDoc, Markdown, reStructuredText, and Textile documents using Kroki."
msgstr ""
@@ -36556,6 +37065,9 @@ msgstr ""
msgid "Users requesting access to"
msgstr ""
+msgid "Users to exclude from the rate limit"
+msgstr ""
+
msgid "Users were successfully added."
msgstr ""
@@ -36577,6 +37089,9 @@ msgstr ""
msgid "UsersSelect|Unassigned"
msgstr ""
+msgid "Uses GitLab as a lightweight alternative to Sentry."
+msgstr ""
+
msgid "Using %{code_start}::%{code_end} denotes a %{link_start}scoped label set%{link_end}"
msgstr ""
@@ -36607,10 +37122,7 @@ msgstr ""
msgid "Value Stream Analytics can help you determine your team’s velocity"
msgstr ""
-msgid "Value Stream Analytics gives an overview of how much time it takes to go from idea to production in your project."
-msgstr ""
-
-msgid "Value may contain a variable reference"
+msgid "Value might contain a variable reference"
msgstr ""
msgid "Value stream"
@@ -36676,10 +37188,10 @@ msgstr ""
msgid "ValueStream|The Default Value Stream cannot be deleted"
msgstr ""
-msgid "Variable"
+msgid "Values that contain the %{codeStart}$%{codeEnd} character can be considered a variable reference and expanded. %{docsLinkStart}Learn more.%{docsLinkEnd}"
msgstr ""
-msgid "Variable references indicated by %{codeStart}$%{codeEnd} may be expanded. If this is not what you want, consider %{docsLinkStart}using a workaround to prevent expansion%{docsLinkEnd}."
+msgid "Variable"
msgstr ""
msgid "Variable will be masked in job logs."
@@ -37081,6 +37593,9 @@ msgstr ""
msgid "Vulnerability|Evidence"
msgstr ""
+msgid "Vulnerability|False positive detected"
+msgstr ""
+
msgid "Vulnerability|File"
msgstr ""
@@ -37123,6 +37638,9 @@ msgstr ""
msgid "Vulnerability|Status"
msgstr ""
+msgid "Vulnerability|The scanner determined this vulnerability to be a false positive. Verify the evaluation before changing its status. %{linkStart}Learn more about false positive detection.%{linkEnd}"
+msgstr ""
+
msgid "Vulnerability|The unmodified response is the original response that had no mutations done to the request"
msgstr ""
@@ -37447,9 +37965,6 @@ msgstr ""
msgid "Welcome to GitLab,%{br_tag}%{name}!"
msgstr ""
-msgid "Welcome to the guided GitLab tour"
-msgstr ""
-
msgid "Welcome, %{name}!"
msgstr ""
@@ -37468,9 +37983,6 @@ msgstr ""
msgid "What are you searching for?"
msgstr ""
-msgid "What describes you best?"
-msgstr ""
-
msgid "What does this command do?"
msgstr ""
@@ -37492,13 +38004,13 @@ msgstr ""
msgid "What is your job title? (optional)"
msgstr ""
-msgid "What will you use this group for?"
+msgid "What templates can I create?"
msgstr ""
-msgid "What's new"
+msgid "What will you use this group for?"
msgstr ""
-msgid "What’s your experience level?"
+msgid "What's new"
msgstr ""
msgid "When a deployment job is successful, skip older deployment jobs that are still pending."
@@ -37510,6 +38022,9 @@ msgstr ""
msgid "When an event in GitLab triggers a webhook, you can use the request details to figure out if something went wrong."
msgstr ""
+msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+msgstr ""
+
msgid "When inactive, an external authentication provider must be used."
msgstr ""
@@ -37532,6 +38047,9 @@ msgstr ""
msgid "When:"
msgstr ""
+msgid "Which API requests are affected?"
+msgstr ""
+
msgid "While it's rare to have no vulnerabilities, it can happen. In any event, we ask that you please double check your settings to make sure you've set up your dashboard correctly."
msgstr ""
@@ -37811,6 +38329,9 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|Work Items"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -37886,6 +38407,9 @@ msgstr ""
msgid "You are already a member of this %{member_source}."
msgstr ""
+msgid "You are already impersonating another user"
+msgstr ""
+
msgid "You are an admin, which means granting access to %{client_name} will allow them to interact with GitLab as an admin as well. Proceed with caution."
msgstr ""
@@ -37988,6 +38512,9 @@ msgstr ""
msgid "You can also use project access tokens with Git to authenticate over HTTP(S). %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "You can always change your URL later"
+msgstr ""
+
msgid "You can always edit this later"
msgstr ""
@@ -38144,10 +38671,10 @@ msgstr ""
msgid "You can’t %{tag_start}edit%{tag_end} files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
-msgid "You could not create a new trigger."
+msgid "You can’t edit files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
-msgid "You didn't renew your subscription for %{strong}%{namespace_name}%{strong_close} so it was downgraded to the free plan."
+msgid "You could not create a new trigger."
msgstr ""
msgid "You do not have any subscriptions yet"
@@ -38315,6 +38842,12 @@ msgstr ""
msgid "You must provide your current password in order to change it."
msgstr ""
+msgid "You must sign in to search for specific projects."
+msgstr ""
+
+msgid "You must sign in to search for specific terms."
+msgstr ""
+
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
@@ -38342,6 +38875,9 @@ msgstr ""
msgid "You need to upload a GitLab project export archive (ending in .gz)."
msgstr ""
+msgid "You need to verify your primary email first before enabling Two-Factor Authentication."
+msgstr ""
+
msgid "You successfully declined the invitation"
msgstr ""
@@ -38450,10 +38986,10 @@ msgstr ""
msgid "Your %{host} account was signed in to from a new location"
msgstr ""
-msgid "Your %{strong}%{plan_name}%{strong_close} subscription for %{strong}%{namespace_name}%{strong_close} will expire on %{strong}%{expires_on}%{strong_close}."
+msgid "Your %{strong}%{plan_name}%{strong_close} subscription expires on %{strong}%{expires_on}%{strong_close}. After that date, you cannot create issues or merge requests, or use many other features."
msgstr ""
-msgid "Your %{strong}%{plan_name}%{strong_close} subscription will expire on %{strong}%{expires_on}%{strong_close}. After that, you will not be able to create issues or merge requests as well as many other features."
+msgid "Your %{strong}%{plan_name}%{strong_close} subscription for %{strong}%{namespace_name}%{strong_close} will expire on %{strong}%{expires_on}%{strong_close}."
msgstr ""
msgid "Your CI/CD configuration syntax is invalid. View Lint tab for more details."
@@ -38477,7 +39013,7 @@ msgstr ""
msgid "Your GPG keys (%{count})"
msgstr ""
-msgid "Your GitLab account has been locked due to an excessive amount of unsuccessful sign in attempts. Your account will automatically unlock in %{duration} or you may click the link below to unlock now."
+msgid "Your GitLab account has been locked due to an excessive number of unsuccessful sign in attempts. You can wait for your account to automatically unlock in %{duration} or you can click the link below to unlock now."
msgstr ""
msgid "Your GitLab account request has been approved!"
@@ -38588,6 +39124,9 @@ msgstr ""
msgid "Your commit email is used for web based operations, such as edits and merges."
msgstr ""
+msgid "Your current password is required to register a two-factor authenticator app."
+msgstr ""
+
msgid "Your dashboard has been copied. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
@@ -38687,6 +39226,9 @@ msgstr ""
msgid "Your project limit is %{limit} projects! Please contact your administrator to increase it"
msgstr ""
+msgid "Your project will be created at:"
+msgstr ""
+
msgid "Your projects"
msgstr ""
@@ -38726,11 +39268,9 @@ msgstr ""
msgid "Your subscription expired!"
msgstr ""
-msgid "Your subscription has been downgraded."
-msgstr ""
-
-msgid "Your subscription will expire in %{remaining_days}."
-msgstr ""
+msgid "Your subscription will expire in %{remaining_days} day."
+msgid_plural "Your subscription will expire in %{remaining_days} days."
+msgstr[0] ""
msgid "Your username is %{username}."
msgstr ""
@@ -38935,6 +39475,9 @@ msgstr ""
msgid "cannot merge"
msgstr ""
+msgid "cannot not be used for user namespace"
+msgstr ""
+
msgid "ciReport|%{degradedNum} degraded"
msgstr ""
@@ -39257,6 +39800,9 @@ msgstr ""
msgid "created %{timeAgo}"
msgstr ""
+msgid "created %{timeAgo} by %{author}"
+msgstr ""
+
msgid "created by"
msgstr ""
@@ -39300,9 +39846,6 @@ msgstr ""
msgid "does not have a supported extension. Only %{extension_list} are supported"
msgstr ""
-msgid "domain is not authorized for sign-up."
-msgstr ""
-
msgid "download it"
msgstr ""
@@ -39319,17 +39862,13 @@ msgstr ""
msgid "email '%{email}' is not a verified email."
msgstr ""
-msgid "email does not match the allowed domain of %{email_domains}"
-msgid_plural "email does not match the allowed domains: %{email_domains}"
-msgstr[0] ""
-
msgid "enabled"
msgstr ""
msgid "encrypted: needs to be a :required, :optional or :migrating!"
msgstr ""
-msgid "ending with MIME type format is not allowed."
+msgid "ending with a reserved file extension is not allowed."
msgstr ""
msgid "entries cannot be larger than 255 characters"
@@ -39353,6 +39892,9 @@ msgstr ""
msgid "estimateCommand|%{slash_command} overwrites the total estimated time."
msgstr ""
+msgid "example.com"
+msgstr ""
+
msgid "exceeds the limit of %{bytes} bytes"
msgstr ""
@@ -39402,9 +39944,6 @@ msgstr ""
msgid "fork"
msgstr ""
-msgid "fork this project"
-msgstr ""
-
msgid "from"
msgstr ""
@@ -39412,6 +39951,9 @@ msgid "from %d job"
msgid_plural "from %d jobs"
msgstr[0] ""
+msgid "frontmatter"
+msgstr ""
+
msgid "group"
msgstr ""
@@ -39439,6 +39981,9 @@ msgstr ""
msgid "has been completed."
msgstr ""
+msgid "has too deep level of nesting"
+msgstr ""
+
msgid "help"
msgstr ""
@@ -39472,9 +40017,21 @@ msgstr ""
msgid "in"
msgstr ""
+msgid "in Infrastructure :: Kubernetes clusters"
+msgstr ""
+
+msgid "in all GitLab"
+msgstr ""
+
+msgid "in group"
+msgstr ""
+
msgid "in group %{link_to_group}"
msgstr ""
+msgid "in project"
+msgstr ""
+
msgid "in project %{link_to_project}"
msgstr ""
@@ -39515,16 +40072,19 @@ msgstr ""
msgid "is not a valid X509 certificate."
msgstr ""
-msgid "is not allowed since the group is not top-level group."
+msgid "is not allowed for sign-up."
msgstr ""
-msgid "is not allowed. Try again with a different email address, or contact your GitLab admin."
+msgid "is not allowed for this group."
msgstr ""
-msgid "is not allowed. We do not currently support project-level iterations"
+msgid "is not allowed for this project."
+msgstr ""
+
+msgid "is not allowed since the group is not top-level group."
msgstr ""
-msgid "is not from an allowed domain."
+msgid "is not allowed. We do not currently support project-level iterations"
msgstr ""
msgid "is not in the group enforcing Group Managed Account"
@@ -39617,6 +40177,9 @@ msgstr ""
msgid "log in"
msgstr ""
+msgid "managed"
+msgstr ""
+
msgid "manual"
msgstr ""
@@ -39663,6 +40226,9 @@ msgstr ""
msgid "mrWidget| Please restore it or use a different %{missingBranchName} branch"
msgstr ""
+msgid "mrWidget|%{linkStart}Set up now%{linkEnd} to analyze your source code for known security vulnerabilities."
+msgstr ""
+
msgid "mrWidget|%{mergeError}."
msgstr ""
@@ -39742,6 +40308,9 @@ msgid "mrWidget|Closes issue"
msgid_plural "mrWidget|Closes issues"
msgstr[0] ""
+msgid "mrWidget|Create issue to resolve all threads"
+msgstr ""
+
msgid "mrWidget|Delete source branch"
msgstr ""
@@ -39751,12 +40320,18 @@ msgstr ""
msgid "mrWidget|Did not close"
msgstr ""
+msgid "mrWidget|Dismiss"
+msgstr ""
+
msgid "mrWidget|Email patches"
msgstr ""
msgid "mrWidget|Failed to load deployment statistics"
msgstr ""
+msgid "mrWidget|Hide %{widget} details"
+msgstr ""
+
msgid "mrWidget|If the %{missingBranchName} branch exists in your local repository, you can merge this merge request manually using the command line"
msgstr ""
@@ -39851,9 +40426,6 @@ msgstr ""
msgid "mrWidget|Request to merge"
msgstr ""
-msgid "mrWidget|Resolve all threads in new issue"
-msgstr ""
-
msgid "mrWidget|Resolve conflicts"
msgstr ""
@@ -39869,6 +40441,9 @@ msgstr ""
msgid "mrWidget|Revoke approval"
msgstr ""
+msgid "mrWidget|SAST and Secret Detection is not enabled."
+msgstr ""
+
msgid "mrWidget|Set by %{merge_author} to be added to the merge train when the pipeline succeeds"
msgstr ""
@@ -39878,6 +40453,9 @@ msgstr ""
msgid "mrWidget|Set by %{merge_author} to start a merge train when the pipeline succeeds"
msgstr ""
+msgid "mrWidget|Show %{widget} details"
+msgstr ""
+
msgid "mrWidget|The changes were merged into"
msgstr ""
@@ -39890,6 +40468,9 @@ msgstr ""
msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure, or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
msgstr ""
+msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure."
+msgstr ""
+
msgid "mrWidget|The source branch has been deleted"
msgstr ""
@@ -39932,6 +40513,9 @@ msgstr ""
msgid "mrWidget|You can merge after removing denied licenses"
msgstr ""
+msgid "mrWidget|You can only merge once this merge request is approved."
+msgstr ""
+
msgid "mrWidget|Your password"
msgstr ""
@@ -39968,6 +40552,9 @@ msgstr ""
msgid "must be less than the limit of %{tag_limit} tags"
msgstr ""
+msgid "must be set for a project namespace"
+msgstr ""
+
msgid "must be unique by status and elapsed time within a policy"
msgstr ""
@@ -40075,6 +40662,9 @@ msgstr ""
msgid "pipeline"
msgstr ""
+msgid "pipeline schedules documentation"
+msgstr ""
+
msgid "pod_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
msgstr ""
@@ -40122,16 +40712,25 @@ msgstr ""
msgid "project name"
msgstr ""
+msgid "project namespace cannot be the parent of another namespace"
+msgstr ""
+
msgid "projects"
msgstr ""
msgid "quick actions"
msgstr ""
-msgid "reCAPTCHA Private Key"
+msgid "reCAPTCHA"
+msgstr ""
+
+msgid "reCAPTCHA helps prevent credential stuffing."
msgstr ""
-msgid "reCAPTCHA Site Key"
+msgid "reCAPTCHA private key"
+msgstr ""
+
+msgid "reCAPTCHA site key"
msgstr ""
msgid "recent activity"
@@ -40357,6 +40956,9 @@ msgstr ""
msgid "user avatar"
msgstr ""
+msgid "user namespace cannot be the parent of another namespace"
+msgstr ""
+
msgid "user preferences"
msgstr ""
@@ -40448,3 +41050,9 @@ msgstr ""
msgid "your settings"
msgstr ""
+msgid "{group}"
+msgstr ""
+
+msgid "{project}"
+msgstr ""
+
diff --git a/locale/ig_NG/gitlab.po b/locale/ig_NG/gitlab.po
index e2495654b0c..dca470ff8a7 100644
--- a/locale/ig_NG/gitlab.po
+++ b/locale/ig_NG/gitlab.po
@@ -14,10 +14,7 @@ msgstr ""
"X-Crowdin-Language: ig\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-09-01 22:32\n"
-
-msgid " %{name}, confirm your email address now! "
-msgstr ""
+"PO-Revision-Date: 2021-10-04 20:20\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -90,6 +87,14 @@ msgstr ""
msgid "#general, #development"
msgstr ""
+msgid "%d Alert"
+msgid_plural "%d Alerts"
+msgstr[0] ""
+
+msgid "%d Alert:"
+msgid_plural "%d Alerts:"
+msgstr[0] ""
+
msgid "%d Approval"
msgid_plural "%d Approvals"
msgstr[0] ""
@@ -387,7 +392,10 @@ msgstr ""
msgid "%{code_open}Protected:%{code_close} Only exposed to protected branches or tags."
msgstr ""
-msgid "%{commit_author_link} authored %{commit_timeago}"
+msgid "%{commit_author_link} authored %{commit_authored_timeago}"
+msgstr ""
+
+msgid "%{commit_author_link} authored %{commit_authored_timeago} and %{commit_committer_avatar} %{commit_committer_link} committed %{commit_committer_timeago}"
msgstr ""
msgid "%{completedCount} completed weight"
@@ -476,6 +484,15 @@ msgstr ""
msgid "%{doc_link_start}Advanced search%{doc_link_end} is enabled."
msgstr ""
+msgid "%{docs_link_start}Learn about visibility levels.%{docs_link_end}"
+msgstr ""
+
+msgid "%{docs_link_start}What is Large File Storage?%{docs_link_end}"
+msgstr ""
+
+msgid "%{docs_link_start}What is two-factor authentication?%{docs_link_end}"
+msgstr ""
+
msgid "%{due_date} (Past due)"
msgstr ""
@@ -548,9 +565,6 @@ msgstr ""
msgid "%{issueType} actions"
msgstr ""
-msgid "%{issuesCount} issues with a limit of %{maxIssueCount}"
-msgstr ""
-
msgid "%{issuesSize} with a limit of %{maxIssueCount}"
msgstr ""
@@ -608,6 +622,12 @@ msgstr ""
msgid "%{label_for_message} unavailable"
msgstr ""
+msgid "%{learn_more_link}."
+msgstr ""
+
+msgid "%{lessThan} 1 hour"
+msgstr ""
+
msgid "%{lets_encrypt_link_start}Let's Encrypt%{lets_encrypt_link_end} is a free, automated, and open certificate authority (CA) that issues digital certificates to enable HTTPS (SSL/TLS) for sites."
msgstr ""
@@ -620,15 +640,15 @@ msgstr ""
msgid "%{link_start}Learn more%{link_end} about roles."
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
-msgstr ""
-
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
msgstr ""
msgid "%{link_start}Start the title with %{draft_snippet}%{link_end} to prevent a merge request that is a work in progress from being merged before it's ready."
msgstr ""
+msgid "%{link_start}What information does GitLab Inc. collect?%{link_end}"
+msgstr ""
+
msgid "%{listToShow}, and %{awardsListLength} more"
msgstr ""
@@ -777,7 +797,7 @@ msgid "%{securityScanner} result is not available because a pipeline has not bee
msgid_plural "%{securityScanner} results are not available because a pipeline has not been run since it was enabled. %{linkStart}Run a pipeline%{linkEnd}"
msgstr[0] ""
-msgid "%{service_ping_link_start}Learn more%{service_ping_link_end} about what information is shared with GitLab Inc."
+msgid "%{service_ping_link_start}What information is shared with GitLab Inc.?%{service_ping_link_end}"
msgstr ""
msgid "%{size} %{unit}"
@@ -813,6 +833,9 @@ msgstr ""
msgid "%{state} epics"
msgstr ""
+msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
+msgstr ""
+
msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
msgstr ""
@@ -865,10 +888,6 @@ msgstr ""
msgid "%{template_project_id} is unknown or invalid"
msgstr ""
-msgid "%{text} %{files}"
-msgid_plural "%{text} %{files} files"
-msgstr[0] ""
-
msgid "%{text} is available"
msgstr ""
@@ -953,9 +972,6 @@ msgstr ""
msgid "%{wildcards_link_start}Wildcards%{wildcards_link_end} such as %{code_tag_start}v*%{code_tag_end} or %{code_tag_start}*-release%{code_tag_end} are supported."
msgstr ""
-msgid "&lt; 1 hour"
-msgstr ""
-
msgid "'%{data}' at %{location} does not match format: %{format}"
msgstr ""
@@ -1038,9 +1054,6 @@ msgstr ""
msgid "(we need your current password to confirm your changes)"
msgstr ""
-msgid "* * * * *"
-msgstr ""
-
msgid "+ %{amount} more"
msgstr ""
@@ -1104,10 +1117,10 @@ msgstr ""
msgid "."
msgstr ""
-msgid "0 bytes"
+msgid "/"
msgstr ""
-msgid "0 for unlimited, only effective with remote storage enabled."
+msgid "0 bytes"
msgstr ""
msgid "0t1DgySidms"
@@ -1214,6 +1227,9 @@ msgstr ""
msgid "1000+"
msgstr ""
+msgid "192.168.0.0/24"
+msgstr ""
+
msgid "1st contribution!"
msgstr ""
@@ -1367,9 +1383,6 @@ msgstr ""
msgid "A plain HTML site that uses Netlify for CI/CD instead of GitLab, but still with all the other great GitLab features"
msgstr ""
-msgid "A plain-text response to show to clients that hit the rate limit."
-msgstr ""
-
msgid "A platform value can be web, mob or app."
msgstr ""
@@ -1451,7 +1464,7 @@ msgstr ""
msgid "APIFuzzing|Configure HTTP basic authentication values. Other authentication methods are supported. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
+msgid "APIFuzzing|Customize your project's API fuzzing configuration options and copy the code snippet to your .gitlab-ci.yml file to apply any changes. Note that this tool does not reflect or update your .gitlab-ci.yml file automatically. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
msgstr ""
msgid "APIFuzzing|Enable authentication"
@@ -1514,9 +1527,6 @@ msgstr ""
msgid "APIFuzzing|To prevent a security leak, authentication info must be added as a %{ciVariablesLinkStart}CI variable%{ciVariablesLinkEnd}. As a user with maintainer access rights, you can manage CI variables in the %{ciSettingsLinkStart}Settings%{ciSettingsLinkEnd} area."
msgstr ""
-msgid "APIFuzzing|Use this tool to generate API fuzzing configuration YAML to copy into your .gitlab-ci.yml file. This tool does not reflect or update your .gitlab-ci.yml file automatically."
-msgstr ""
-
msgid "APIFuzzing|Username for basic authentication"
msgstr ""
@@ -1568,9 +1578,6 @@ msgstr ""
msgid "Abuse reports notification email"
msgstr ""
-msgid "Abuse reports will be sent to this address if it is set. Abuse reports are always available in the admin area."
-msgstr ""
-
msgid "Accept invitation"
msgstr ""
@@ -1607,12 +1614,18 @@ msgstr ""
msgid "Access granted"
msgstr ""
+msgid "Access key ID"
+msgstr ""
+
msgid "Access requests"
msgstr ""
msgid "Access to '%{classification_label}' not allowed"
msgstr ""
+msgid "Access tokens expire after 2 hours. A refresh token may be used at any time to generate a new access token. Non-expiring access tokens are deprecated. Clear this setting to enable backward compatibility."
+msgstr ""
+
msgid "AccessDropdown|Deploy Keys"
msgstr ""
@@ -1925,6 +1938,9 @@ msgstr ""
msgid "Add new directory"
msgstr ""
+msgid "Add new service account"
+msgstr ""
+
msgid "Add or remove previously merged commits"
msgstr ""
@@ -2162,6 +2178,9 @@ msgstr ""
msgid "AdminArea|Features"
msgstr ""
+msgid "AdminArea|Get security updates from GitLab and stay up to date"
+msgstr ""
+
msgid "AdminArea|Groups"
msgstr ""
@@ -2201,6 +2220,12 @@ msgstr ""
msgid "AdminArea|Reporter"
msgstr ""
+msgid "AdminArea|Sign up for the GitLab Security Newsletter to get notified for security updates."
+msgstr ""
+
+msgid "AdminArea|Sign up for the GitLab newsletter"
+msgstr ""
+
msgid "AdminArea|Stop all jobs"
msgstr ""
@@ -2270,9 +2295,15 @@ msgstr ""
msgid "AdminSettings|Disable public access to Pages sites"
msgstr ""
+msgid "AdminSettings|Display a banner on merge requests in projects with no pipelines to initiate steps to add a .gitlab-ci.yml file."
+msgstr ""
+
msgid "AdminSettings|Domain verification is an essential security measure for public GitLab sites. Users are required to demonstrate they control a domain before it is enabled. %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "AdminSettings|Enable pipeline suggestion banner"
+msgstr ""
+
msgid "AdminSettings|Enable shared runners for new projects"
msgstr ""
@@ -2744,10 +2775,10 @@ msgstr ""
msgid "Admin|Quarterly reconciliation will occur on %{qrtlyDate}"
msgstr ""
-msgid "Admin|The number of max seats used for your namespace is currently exceeding the number of seats in your subscription. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgid "Admin|The number of max seats in your namespace exceeds the number of seats in your subscription. On %{qrtlyDate}, quarterly reconciliation occurs and you are automatically billed a prorated amount for the overage. No action is needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice. For more information about the timing of the invoicing process, view the documentation."
msgstr ""
-msgid "Admin|The number of maximum users for your instance is currently exceeding the number of users in license. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgid "Admin|The number of max users in your instance exceeds the number of users in your license. On %{qrtlyDate}, quarterly reconciliation occurs and you are automatically billed a prorated amount for the overage. No action is needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice. For more information about the timing of the invoicing process, view the documentation."
msgstr ""
msgid "Admin|View pending user approvals"
@@ -2768,9 +2799,6 @@ msgstr ""
msgid "Advanced export options"
msgstr ""
-msgid "Advanced permissions, Large File Storage and Two-Factor authentication settings."
-msgstr ""
-
msgid "After a successful password update you will be redirected to login screen."
msgstr ""
@@ -2789,12 +2817,14 @@ msgstr ""
msgid "After you've reviewed these contribution guidelines, you'll be all set to"
msgstr ""
+msgid "Akismet"
+msgstr ""
+
msgid "Akismet API Key"
msgstr ""
-msgid "Alert"
-msgid_plural "Alerts"
-msgstr[0] ""
+msgid "Akismet helps prevent the creation of spam issues in public projects."
+msgstr ""
msgid "AlertManagement|Acknowledged"
msgstr ""
@@ -3150,6 +3180,9 @@ msgstr ""
msgid "All (default)"
msgstr ""
+msgid "All GitLab"
+msgstr ""
+
msgid "All Members"
msgstr ""
@@ -3264,6 +3297,9 @@ msgstr ""
msgid "Allow this secondary node to replicate content on Object Storage"
msgstr ""
+msgid "Allow use of licensed EE features"
+msgstr ""
+
msgid "Allow users to dismiss the broadcast message"
msgstr ""
@@ -3339,9 +3375,6 @@ msgstr ""
msgid "Amazon authentication is not %{link_start}correctly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
-msgid "Amount of time (in hours) that users are allowed to skip forced configuration of two-factor authentication"
-msgstr ""
-
msgid "An %{link_start}alert%{link_end} with the same fingerprint is already open. To change the status of this alert, resolve the linked alert."
msgstr ""
@@ -3402,12 +3435,6 @@ msgstr ""
msgid "An error occurred when removing the label."
msgstr ""
-msgid "An error occurred when toggling the notification subscription"
-msgstr ""
-
-msgid "An error occurred when updating the issue weight"
-msgstr ""
-
msgid "An error occurred when updating the title"
msgstr ""
@@ -3456,6 +3483,9 @@ msgstr ""
msgid "An error occurred while enabling Service Desk."
msgstr ""
+msgid "An error occurred while fetching Markdown preview"
+msgstr ""
+
msgid "An error occurred while fetching ancestors"
msgstr ""
@@ -3486,9 +3516,6 @@ msgstr ""
msgid "An error occurred while fetching label colors."
msgstr ""
-msgid "An error occurred while fetching markdown preview"
-msgstr ""
-
msgid "An error occurred while fetching participants"
msgstr ""
@@ -3504,9 +3531,6 @@ msgstr ""
msgid "An error occurred while fetching reference"
msgstr ""
-msgid "An error occurred while fetching sidebar data"
-msgstr ""
-
msgid "An error occurred while fetching tags. Retry the search."
msgstr ""
@@ -3582,6 +3606,9 @@ msgstr ""
msgid "An error occurred while loading merge requests."
msgstr ""
+msgid "An error occurred while loading projects."
+msgstr ""
+
msgid "An error occurred while loading the Needs tab."
msgstr ""
@@ -3816,12 +3843,6 @@ msgstr ""
msgid "Any Milestone"
msgstr ""
-msgid "Any branch"
-msgstr ""
-
-msgid "Any eligible user"
-msgstr ""
-
msgid "Any encrypted tokens"
msgstr ""
@@ -3840,6 +3861,9 @@ msgstr ""
msgid "Any namespace"
msgstr ""
+msgid "App Engine description and apps that are suitable for this deployment target"
+msgstr ""
+
msgid "App ID"
msgstr ""
@@ -3986,6 +4010,10 @@ msgstr ""
msgid "Apply"
msgstr ""
+msgid "Apply %d suggestion"
+msgid_plural "Apply %d suggestions"
+msgstr[0] ""
+
msgid "Apply a label"
msgstr ""
@@ -3995,13 +4023,10 @@ msgstr ""
msgid "Apply suggestion"
msgstr ""
-msgid "Apply suggestions"
-msgstr ""
-
msgid "Apply template"
msgstr ""
-msgid "Apply this approval rule to any branch or a specific protected branch."
+msgid "Apply this approval rule to all branches or a specific protected branch."
msgstr ""
msgid "Applying"
@@ -4140,9 +4165,6 @@ msgstr ""
msgid "ApprovalSettings|Prevent editing approval rules in projects and merge requests."
msgstr ""
-msgid "ApprovalSettings|Prevent editing approval rules in projects and merge requests. "
-msgstr ""
-
msgid "ApprovalSettings|Remove all approvals when commits are added to the source branch."
msgstr ""
@@ -4158,6 +4180,9 @@ msgstr ""
msgid "ApprovalSettings|This setting is configured at the instance level and can only be changed by an administrator."
msgstr ""
+msgid "ApprovalSettings|This setting is configured in %{groupName} and can only be changed by an administrator or group owner."
+msgstr ""
+
msgid "ApprovalStatusTooltip|Adheres to separation of duties"
msgstr ""
@@ -4641,9 +4666,6 @@ msgstr ""
msgid "Authenticated API rate limit period in seconds"
msgstr ""
-msgid "Authenticated API request rate limit"
-msgstr ""
-
msgid "Authenticated API requests"
msgstr ""
@@ -4653,10 +4675,10 @@ msgstr ""
msgid "Authenticated Git LFS request rate limit"
msgstr ""
-msgid "Authenticated web rate limit period in seconds"
+msgid "Authenticated Git LFS requests"
msgstr ""
-msgid "Authenticated web request rate limit"
+msgid "Authenticated web rate limit period in seconds"
msgstr ""
msgid "Authenticated web requests"
@@ -5034,9 +5056,6 @@ msgstr ""
msgid "Below you will find all the groups that are public."
msgstr ""
-msgid "Beta"
-msgstr ""
-
msgid "Bi-weekly code coverage"
msgstr ""
@@ -5275,6 +5294,21 @@ msgstr ""
msgid "Board scope affects which issues are displayed for anyone who visits this board"
msgstr ""
+msgid "BoardNewEpic|Groups"
+msgstr ""
+
+msgid "BoardNewEpic|Loading groups"
+msgstr ""
+
+msgid "BoardNewEpic|No matching results"
+msgstr ""
+
+msgid "BoardNewEpic|Search groups"
+msgstr ""
+
+msgid "BoardNewEpic|Select a group"
+msgstr ""
+
msgid "BoardNewIssue|No matching results"
msgstr ""
@@ -5351,6 +5385,9 @@ msgstr ""
msgid "Boards|An error occurred while creating the list. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching child groups. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching group projects. Please try again."
msgstr ""
@@ -5682,6 +5719,9 @@ msgstr ""
msgid "Bulk update"
msgstr ""
+msgid "BulkImports|Re-import creates a new group. It does not sync with the existing group."
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -5691,6 +5731,9 @@ msgstr ""
msgid "BulkImport|From source group"
msgstr ""
+msgid "BulkImport|Group import history"
+msgstr ""
+
msgid "BulkImport|Import failed: Destination cannot be a subgroup of the source group. Change the destination and try again."
msgstr ""
@@ -5703,9 +5746,18 @@ msgstr ""
msgid "BulkImport|Importing the group failed"
msgstr ""
+msgid "BulkImport|Last imported to %{link}"
+msgstr ""
+
msgid "BulkImport|Name already exists."
msgstr ""
+msgid "BulkImport|New group"
+msgstr ""
+
+msgid "BulkImport|No history is available"
+msgstr ""
+
msgid "BulkImport|No parent"
msgstr ""
@@ -5718,6 +5770,9 @@ msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} matching filter \"%{filter}\" from %{link}"
msgstr ""
+msgid "BulkImport|Source group"
+msgstr ""
+
msgid "BulkImport|To new group"
msgstr ""
@@ -5727,6 +5782,9 @@ msgstr ""
msgid "BulkImport|You have no groups to import"
msgstr ""
+msgid "BulkImport|Your imported groups will appear here."
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -5968,6 +6026,9 @@ msgstr ""
msgid "Can be manually deployed to"
msgstr ""
+msgid "Can be overridden in each project."
+msgstr ""
+
msgid "Can create groups:"
msgstr ""
@@ -6070,6 +6131,9 @@ msgstr ""
msgid "Cancelling Preview"
msgstr ""
+msgid "Cannot assign a confidential epic to a non-confidential issue. Make the issue confidential and try again"
+msgstr ""
+
msgid "Cannot be assigned to other projects."
msgstr ""
@@ -6121,9 +6185,6 @@ msgstr ""
msgid "Cannot refer to a group %{timebox_type} by an internal id!"
msgstr ""
-msgid "Cannot set confidential epic for a non-confidential issue"
-msgstr ""
-
msgid "Cannot show preview. For previews on sketch files, they must have the file format introduced by Sketch version 43 and above."
msgstr ""
@@ -6361,15 +6422,15 @@ msgstr ""
msgid "Check out, review, and merge locally"
msgstr ""
-msgid "Check the %{docs_link_start}documentation%{docs_link_end}."
-msgstr ""
-
msgid "Check the current instance configuration "
msgstr ""
msgid "Check the elasticsearch.log file to debug why the migration was halted and make any changes before retrying the migration. When you fix the cause of the failure, click \"Retry migration\", and the migration will be scheduled to be retried in the background."
msgstr ""
+msgid "Check with your administrator."
+msgstr ""
+
msgid "Check your Docker images for known vulnerabilities."
msgstr ""
@@ -6400,6 +6461,9 @@ msgstr ""
msgid "Checkout"
msgstr ""
+msgid "Checkout|$%{selectedPlanPrice} per 10 GB storage per pack"
+msgstr ""
+
msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 minutes"
msgstr ""
@@ -6419,16 +6483,22 @@ msgstr ""
msgid "Checkout|%{name}'s GitLab subscription"
msgstr ""
-msgid "Checkout|%{selectedPlanText} plan"
+msgid "Checkout|%{name}'s storage subscription"
msgstr ""
-msgid "Checkout|%{startDate} - %{endDate}"
+msgid "Checkout|%{quantity} GB of storage"
msgstr ""
-msgid "Checkout|%{totalCiMinutes} CI minute"
-msgid_plural "Checkout|%{totalCiMinutes} CI minutes"
+msgid "Checkout|%{quantity} storage pack"
+msgid_plural "Checkout|%{quantity} storage packs"
msgstr[0] ""
+msgid "Checkout|%{selectedPlanText} plan"
+msgstr ""
+
+msgid "Checkout|%{startDate} - %{endDate}"
+msgstr ""
+
msgid "Checkout|%{totalCiMinutes} CI minutes"
msgstr ""
@@ -6504,6 +6574,9 @@ msgstr ""
msgid "Checkout|Failed to register credit card. Please try again."
msgstr ""
+msgid "Checkout|GB"
+msgstr ""
+
msgid "Checkout|GitLab group"
msgstr ""
@@ -6540,6 +6613,9 @@ msgstr ""
msgid "Checkout|State"
msgstr ""
+msgid "Checkout|Storage packs"
+msgstr ""
+
msgid "Checkout|Street address"
msgstr ""
@@ -6561,6 +6637,9 @@ msgstr ""
msgid "Checkout|Total minutes: %{quantity}"
msgstr ""
+msgid "Checkout|Total storage: %{quantity} GB"
+msgstr ""
+
msgid "Checkout|Users"
msgstr ""
@@ -6570,16 +6649,25 @@ msgstr ""
msgid "Checkout|Your organization"
msgstr ""
+msgid "Checkout|Your storage subscription has the same term as your main subscription, and the price is prorated accordingly."
+msgstr ""
+
msgid "Checkout|Your subscription will be applied to this group"
msgstr ""
msgid "Checkout|Zip code"
msgstr ""
+msgid "Checkout|a storage subscription"
+msgstr ""
+
msgid "Checkout|company or team"
msgstr ""
-msgid "Checkout|x 1,000 minutes per pack = %{strong}"
+msgid "Checkout|minutes"
+msgstr ""
+
+msgid "Checkout|x %{quantity} %{units} per pack ="
msgstr ""
msgid "Cherry-pick this commit"
@@ -6936,6 +7024,9 @@ msgstr ""
msgid "CloneIssue|Cannot clone issue to target project as it is pending deletion."
msgstr ""
+msgid "CloneIssue|Cannot clone issues of '%{issue_type}' type."
+msgstr ""
+
msgid "Cloned this issue to %{path_to_project}."
msgstr ""
@@ -6990,7 +7081,10 @@ msgstr ""
msgid "Closes this %{quick_action_target}."
msgstr ""
-msgid "Cloud licenses can not be removed."
+msgid "Cloud Functions description and apps that are suitable for this deployment target"
+msgstr ""
+
+msgid "Cloud Run description and apps that are suitable for this deployment target"
msgstr ""
msgid "Cluster"
@@ -7017,6 +7111,12 @@ msgstr ""
msgid "ClusterAgents|Access tokens"
msgstr ""
+msgid "ClusterAgents|Agent might not be connected to GitLab"
+msgstr ""
+
+msgid "ClusterAgents|Agent never connected to GitLab"
+msgstr ""
+
msgid "ClusterAgents|Alternative installation methods"
msgstr ""
@@ -7032,6 +7132,12 @@ msgstr ""
msgid "ClusterAgents|Configuration"
msgstr ""
+msgid "ClusterAgents|Connected"
+msgstr ""
+
+msgid "ClusterAgents|Connection status"
+msgstr ""
+
msgid "ClusterAgents|Copy token"
msgstr ""
@@ -7050,6 +7156,9 @@ msgstr ""
msgid "ClusterAgents|For alternative installation methods %{linkStart}go to the documentation%{linkEnd}."
msgstr ""
+msgid "ClusterAgents|For more troubleshooting information go to"
+msgstr ""
+
msgid "ClusterAgents|Go to the repository"
msgstr ""
@@ -7065,18 +7174,30 @@ msgstr ""
msgid "ClusterAgents|Integrate with the GitLab Agent"
msgstr ""
-msgid "ClusterAgents|Last used"
+msgid "ClusterAgents|Last connected %{timeAgo}."
+msgstr ""
+
+msgid "ClusterAgents|Last contact"
msgstr ""
msgid "ClusterAgents|Learn how to create an agent access token"
msgstr ""
+msgid "ClusterAgents|Make sure you are using a valid token."
+msgstr ""
+
msgid "ClusterAgents|Name"
msgstr ""
msgid "ClusterAgents|Never"
msgstr ""
+msgid "ClusterAgents|Never connected"
+msgstr ""
+
+msgid "ClusterAgents|Not connected"
+msgstr ""
+
msgid "ClusterAgents|Read more about getting started"
msgstr ""
@@ -7098,6 +7219,9 @@ msgstr ""
msgid "ClusterAgents|Select which Agent you want to install"
msgstr ""
+msgid "ClusterAgents|The Agent has not been connected in a long time. There might be a connectivity issue. Last contact was %{timeAgo}."
+msgstr ""
+
msgid "ClusterAgents|The GitLab Agent also requires %{linkStart}enabling the Agent Server%{linkEnd}"
msgstr ""
@@ -7125,9 +7249,6 @@ msgstr ""
msgid "ClusterAgents|You will need to create a token to connect to your agent"
msgstr ""
-msgid "ClusterAgent|This feature is only available for premium plans"
-msgstr ""
-
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -7317,9 +7438,6 @@ msgstr ""
msgid "ClusterIntegration|Create Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Create a provision role on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the account and external ID above. %{startMoreInfoLink}More information%{endLink}"
-msgstr ""
-
msgid "ClusterIntegration|Create cluster on"
msgstr ""
@@ -7752,7 +7870,7 @@ msgstr ""
msgid "ClusterIntegration|Subnets"
msgstr ""
-msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provisioned role, first create one on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the above account and external IDs. %{startMoreInfoLink}More information%{endLink}"
+msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provisioned role, first create one on %{awsLinkStart}Amazon Web Services %{awsLinkEnd} using the above account and external IDs. %{moreInfoStart}More information%{moreInfoEnd}"
msgstr ""
msgid "ClusterIntegration|The Kubernetes certificate used to authenticate to the cluster."
@@ -7986,6 +8104,9 @@ msgstr ""
msgid "Collapse replies"
msgstr ""
+msgid "Collapse settings section"
+msgstr ""
+
msgid "Collapse sidebar"
msgstr ""
@@ -8004,6 +8125,9 @@ msgstr ""
msgid "Comma-separated list of email addresses."
msgstr ""
+msgid "Comma-separated list of users allowed to exceed the rate limit."
+msgstr ""
+
msgid "Comma-separated, e.g. '1.1.1.1, 2.2.2.0/24'"
msgstr ""
@@ -8323,6 +8447,9 @@ msgstr ""
msgid "Configure %{repository_checks_link_start}repository checks%{link_end} and %{housekeeping_link_start}housekeeping%{link_end} on repositories."
msgstr ""
+msgid "Configure CAPTCHAs, IP address limits, and other anti-spam measures."
+msgstr ""
+
msgid "Configure Dependency Scanning in `.gitlab-ci.yml` using the GitLab managed template. You can [add variable overrides](https://docs.gitlab.com/ee/user/application_security/dependency_scanning/#customizing-the-dependency-scanning-settings) to customize Dependency Scanning settings."
msgstr ""
@@ -8359,16 +8486,13 @@ msgstr ""
msgid "Configure a %{codeStart}.gitlab-webide.yml%{codeEnd} file in the %{codeStart}.gitlab%{codeEnd} directory to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
msgstr ""
-msgid "Configure existing installation"
-msgstr ""
-
-msgid "Configure limit for notes created per minute by web and API requests."
+msgid "Configure advanced permissions, Large File Storage, and two-factor authentication settings."
msgstr ""
-msgid "Configure limits for Project/Group Import/Export."
+msgid "Configure approvals by authors and committers on all projects."
msgstr ""
-msgid "Configure limits for web and API requests."
+msgid "Configure existing installation"
msgstr ""
msgid "Configure paths to be protected by Rack Attack."
@@ -8383,10 +8507,13 @@ msgstr ""
msgid "Configure settings for Advanced Search with Elasticsearch."
msgstr ""
+msgid "Configure specific limits for Files API requests that supersede the general user and IP rate limits."
+msgstr ""
+
msgid "Configure specific limits for Git LFS requests that supersede the general user and IP rate limits."
msgstr ""
-msgid "Configure specific limits for Packages API requests that supersede the general user and IP rate limits."
+msgid "Configure specific limits for deprecated API requests that supersede the general user and IP rate limits."
msgstr ""
msgid "Configure the %{link} integration."
@@ -8398,6 +8525,9 @@ msgstr ""
msgid "Configure the way a user creates a new account."
msgstr ""
+msgid "Configure via Merge Request"
+msgstr ""
+
msgid "Configure which lists are shown for anyone who visits this board"
msgstr ""
@@ -8863,6 +8993,9 @@ msgstr ""
msgid "Content parsed with %{link}."
msgstr ""
+msgid "ContentEditor|Table of Contents"
+msgstr ""
+
msgid "ContentEditor|You have to provide a renderMarkdown function or a custom serializer"
msgstr ""
@@ -9049,6 +9182,9 @@ msgstr ""
msgid "Copy link to chart"
msgstr ""
+msgid "Copy prefix"
+msgstr ""
+
msgid "Copy reference"
msgstr ""
@@ -9079,6 +9215,9 @@ msgstr ""
msgid "Copy value"
msgstr ""
+msgid "Corpus Management"
+msgstr ""
+
msgid "Corpus Management|Are you sure you want to delete the corpus?"
msgstr ""
@@ -9307,6 +9446,9 @@ msgstr ""
msgid "Create commit"
msgstr ""
+msgid "Create common files more quickly, and standardize their format."
+msgstr ""
+
msgid "Create confidential merge request"
msgstr ""
@@ -9340,6 +9482,9 @@ msgstr ""
msgid "Create issue"
msgstr ""
+msgid "Create issue to resolve all threads"
+msgstr ""
+
msgid "Create iteration"
msgstr ""
@@ -9394,6 +9539,9 @@ msgstr ""
msgid "Create new..."
msgstr ""
+msgid "Create or import your first project"
+msgstr ""
+
msgid "Create project"
msgstr ""
@@ -9751,7 +9899,7 @@ msgstr ""
msgid "Custom notification events"
msgstr ""
-msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notificationLinkStart} notification emails%{notificationLinkEnd}."
+msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notificationLinkStart}notification emails%{notificationLinkEnd}."
msgstr ""
msgid "Custom project templates"
@@ -9948,10 +10096,10 @@ msgid "CycleAnalytics|Showing %{subjectFilterText} and %{selectedLabelsCount} la
msgid_plural "CycleAnalytics|Showing %{subjectFilterText} and %{selectedLabelsCount} labels"
msgstr[0] ""
-msgid "CycleAnalytics|Showing data for group '%{groupName}' and %{selectedProjectCount} projects from %{startDate} to %{endDate}"
+msgid "CycleAnalytics|Showing data for group '%{groupName}' and %{selectedProjectCount} projects from %{createdAfter} to %{createdBefore}"
msgstr ""
-msgid "CycleAnalytics|Showing data for group '%{groupName}' from %{startDate} to %{endDate}"
+msgid "CycleAnalytics|Showing data for group '%{groupName}' from %{createdAfter} to %{createdBefore}"
msgstr ""
msgid "CycleAnalytics|Stages"
@@ -10185,6 +10333,9 @@ msgstr ""
msgid "DastProfiles|Manage profiles"
msgstr ""
+msgid "DastProfiles|Manage site profiles"
+msgstr ""
+
msgid "DastProfiles|Minimum = 0 (no timeout enabled), Maximum = 2880 minutes"
msgstr ""
@@ -10260,6 +10411,9 @@ msgstr ""
msgid "DastProfiles|Scanner name"
msgstr ""
+msgid "DastProfiles|Schedule"
+msgstr ""
+
msgid "DastProfiles|Select branch"
msgstr ""
@@ -10329,7 +10483,7 @@ msgstr ""
msgid "DastProfiles|Website"
msgstr ""
-msgid "DastProfiles|You can either choose a passive scan or validate the target site in your chosen site profile. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
+msgid "DastProfiles|You can either choose a passive scan or validate the target site from the site profile management page. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
msgstr ""
msgid "DastProfiles|You cannot run an active scan against an unvalidated site."
@@ -10501,7 +10655,7 @@ msgstr ""
msgid "Days to merge"
msgstr ""
-msgid "Deactivate dormant users after 90 days of inactivity. Users can return to active status by signing in to their account. While inactive, a user is not counted as an active user in the instance."
+msgid "Deactivate dormant users after 90 days of inactivity"
msgstr ""
msgid "Dear Administrator,"
@@ -10588,10 +10742,10 @@ msgstr ""
msgid "Define a custom pattern with cron syntax"
msgstr ""
-msgid "Define approval settings."
+msgid "Define approval rules."
msgstr ""
-msgid "Define approval settings. %{linkStart}Learn more.%{linkEnd}"
+msgid "Define approval rules. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "Define custom rules for what constitutes spam, independent of Akismet"
@@ -10600,7 +10754,7 @@ msgstr ""
msgid "Define environments in the deploy stage(s) in %{code_open}.gitlab-ci.yml%{code_close} to track deployments here."
msgstr ""
-msgid "Define how approval rules are applied as a merge request moves toward completion."
+msgid "Define how approval rules are applied to merge requests."
msgstr ""
msgid "Definition"
@@ -10615,6 +10769,12 @@ msgstr ""
msgid "DelayedJobs|Are you sure you want to run %{job_name} immediately? This job will run automatically after it's timer finishes."
msgstr ""
+msgid "DelayedJobs|Are you sure you want to run %{job_name} immediately? This job will run automatically after its timer finishes."
+msgstr ""
+
+msgid "DelayedJobs|Run the delayed job now?"
+msgstr ""
+
msgid "DelayedJobs|Start now"
msgstr ""
@@ -10888,6 +11048,12 @@ msgstr ""
msgid "Dependency proxy image prefix"
msgstr ""
+msgid "DependencyProxy|Create a local proxy for storing frequently used upstream images. %{docLinkStart}Learn more%{docLinkEnd} about dependency proxies."
+msgstr ""
+
+msgid "DependencyProxy|Dependency Proxy"
+msgstr ""
+
msgid "DependencyProxy|Toggle Dependency Proxy"
msgstr ""
@@ -11125,6 +11291,9 @@ msgstr ""
msgid "Deployments"
msgstr ""
+msgid "Deployments to Google Kubernetes Engine can be "
+msgstr ""
+
msgid "Deployments|%{deployments} environment impacted."
msgid_plural "Deployments|%{deployments} environments impacted."
msgstr[0] ""
@@ -11153,6 +11322,9 @@ msgstr ""
msgid "Deployment|success"
msgstr ""
+msgid "Deprecated API rate limits"
+msgstr ""
+
msgid "Deprioritize label"
msgstr ""
@@ -11555,6 +11727,14 @@ msgstr ""
msgid "DiffsCompareBaseBranch|(base)"
msgstr ""
+msgid "Diffs|%d addition"
+msgid_plural "Diffs|%d additions"
+msgstr[0] ""
+
+msgid "Diffs|%d deletion"
+msgid_plural "Diffs|%d deletions"
+msgstr[0] ""
+
msgid "Diffs|No file name available"
msgstr ""
@@ -11564,9 +11744,16 @@ msgstr ""
msgid "Diffs|Show all unchanged lines"
msgstr ""
+msgid "Diffs|Showing %{dropdownStart}%{count} changed file%{dropdownEnd}"
+msgid_plural "Diffs|Showing %{dropdownStart}%{count} changed files%{dropdownEnd}"
+msgstr[0] ""
+
msgid "Diffs|Something went wrong while fetching diff lines."
msgstr ""
+msgid "Diffs|with %{additions} and %{deletions}"
+msgstr ""
+
msgid "Direct member"
msgstr ""
@@ -11691,9 +11878,6 @@ msgid "Dismiss %d selected vulnerability as"
msgid_plural "Dismiss %d selected vulnerabilities as"
msgstr[0] ""
-msgid "Dismiss Value Stream Analytics introduction box"
-msgstr ""
-
msgid "Dismiss merge request promotion"
msgstr ""
@@ -12015,6 +12199,9 @@ msgstr ""
msgid "Edit issues"
msgstr ""
+msgid "Edit merge requests"
+msgstr ""
+
msgid "Edit public deploy key"
msgstr ""
@@ -12090,6 +12277,9 @@ msgstr ""
msgid "Elastic|None. Select projects to index."
msgstr ""
+msgid "Eligible users"
+msgstr ""
+
msgid "Email"
msgstr ""
@@ -12219,6 +12409,9 @@ msgstr ""
msgid "Enable"
msgstr ""
+msgid "Enable Amazon EKS integration"
+msgstr ""
+
msgid "Enable Auto DevOps"
msgstr ""
@@ -12252,6 +12445,9 @@ msgstr ""
msgid "Enable SSL verification"
msgstr ""
+msgid "Enable Service Ping"
+msgstr ""
+
msgid "Enable Snowplow tracking"
msgstr ""
@@ -12282,6 +12478,9 @@ msgstr ""
msgid "Enable authenticated Git LFS request rate limit"
msgstr ""
+msgid "Enable authenticated web request rate limit"
+msgstr ""
+
msgid "Enable authentication"
msgstr ""
@@ -12342,7 +12541,7 @@ msgstr ""
msgid "Enable or disable the Pseudonymizer data collection."
msgstr ""
-msgid "Enable or disable version check and service ping."
+msgid "Enable or disable version check and Service Ping."
msgstr ""
msgid "Enable protected paths rate limit"
@@ -12354,18 +12553,12 @@ msgstr ""
msgid "Enable reCAPTCHA"
msgstr ""
-msgid "Enable reCAPTCHA for login"
-msgstr ""
-
-msgid "Enable reCAPTCHA, Invisible Captcha, Akismet and set IP limits. For reCAPTCHA, we currently only support %{recaptcha_v2_link_start}v2%{recaptcha_v2_link_end}"
+msgid "Enable reCAPTCHA for login."
msgstr ""
msgid "Enable repository checks"
msgstr ""
-msgid "Enable service ping"
-msgstr ""
-
msgid "Enable shared runners for all projects and subgroups in this group."
msgstr ""
@@ -12387,7 +12580,10 @@ msgstr ""
msgid "Enable unauthenticated API request rate limit"
msgstr ""
-msgid "Enable unauthenticated request rate limit"
+msgid "Enable unauthenticated web request rate limit"
+msgstr ""
+
+msgid "Enable user deactivation emails"
msgstr ""
msgid "Enable version check"
@@ -12423,9 +12619,6 @@ msgstr ""
msgid "Enabled sources for code import during project creation. OmniAuth must be configured for GitHub"
msgstr ""
-msgid "Enabling this will only make licensed EE features available to projects if the project namespace's plan includes the feature or if the project is public."
-msgstr ""
-
msgid "Encountered an error while rendering: %{err}"
msgstr ""
@@ -12474,9 +12667,6 @@ msgstr ""
msgid "Enter Admin Mode"
msgstr ""
-msgid "Enter IP address range"
-msgstr ""
-
msgid "Enter a number"
msgstr ""
@@ -12489,9 +12679,6 @@ msgstr ""
msgid "Enter at least three characters to search"
msgstr ""
-msgid "Enter domain"
-msgstr ""
-
msgid "Enter in your Bitbucket Server URL and personal access token below"
msgstr ""
@@ -12678,9 +12865,6 @@ msgstr ""
msgid "Environments|Deployment %{status}"
msgstr ""
-msgid "Environments|Dismiss"
-msgstr ""
-
msgid "Environments|Enable review app"
msgstr ""
@@ -12693,9 +12877,6 @@ msgstr ""
msgid "Environments|Environments are places where code gets deployed, such as staging or production."
msgstr ""
-msgid "Environments|Help us improve environments"
-msgstr ""
-
msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
msgstr ""
@@ -12732,6 +12913,9 @@ msgstr ""
msgid "Environments|Note that this action will stop the environment, but it will %{emphasisStart}not%{emphasisEnd} have an effect on any existing deployment due to no “stop environment action†being defined in the %{ciConfigLinkStart}.gitlab-ci.yml%{ciConfigLinkEnd} file."
msgstr ""
+msgid "Environments|Open"
+msgstr ""
+
msgid "Environments|Open live environment"
msgstr ""
@@ -12771,9 +12955,6 @@ msgstr ""
msgid "Environments|Stopping %{environmentName}"
msgstr ""
-msgid "Environments|Take the survey"
-msgstr ""
-
msgid "Environments|There was an error fetching the logs. Please try again."
msgstr ""
@@ -12795,9 +12976,6 @@ msgstr ""
msgid "Environments|You don't have any environments right now"
msgstr ""
-msgid "Environments|Your feedback helps GitLab make environments better for you and other users. Participate and enter a sweepstake to win a USD 30 gift card."
-msgstr ""
-
msgid "Environments|by %{avatar}"
msgstr ""
@@ -13080,7 +13258,7 @@ msgstr ""
msgid "Error parsing CSV file. Please make sure it has"
msgstr ""
-msgid "Error rendering markdown preview"
+msgid "Error rendering Markdown preview"
msgstr ""
msgid "Error saving label update."
@@ -13128,6 +13306,9 @@ msgstr ""
msgid "Error: %{error_message}"
msgstr ""
+msgid "Error: Couldn't load some or all of the changes."
+msgstr ""
+
msgid "Error: No AWS credentials were supplied"
msgstr ""
@@ -13161,6 +13342,9 @@ msgstr ""
msgid "ErrorTracking|Enable error tracking"
msgstr ""
+msgid "ErrorTracking|Error tracking backend"
+msgstr ""
+
msgid "ErrorTracking|If you self-host Sentry, enter your Sentry instance's full URL. If you use Sentry's hosted solution, enter https://sentry.io"
msgstr ""
@@ -13194,6 +13378,12 @@ msgstr ""
msgid "Escalation policies must have at least one rule"
msgstr ""
+msgid "EscalationPolicies|%{clockIcon} IF alert is not %{alertStatus} in %{minutes}"
+msgstr ""
+
+msgid "EscalationPolicies|%{notificationIcon} THEN %{doAction} %{forScheduleOrUser}"
+msgstr ""
+
msgid "EscalationPolicies|+ Add an additional rule"
msgstr ""
@@ -13236,13 +13426,13 @@ msgstr ""
msgid "EscalationPolicies|Escalation policies"
msgstr ""
-msgid "EscalationPolicies|Escalation rules"
+msgid "EscalationPolicies|Escalation policy %{obstacle} in Project %{project}"
msgstr ""
-msgid "EscalationPolicies|Failed to load oncall-schedules"
+msgid "EscalationPolicies|Escalation rules"
msgstr ""
-msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} %{then} THEN %{doAction} %{scheduleOrUser}"
+msgid "EscalationPolicies|Failed to load oncall-schedules"
msgstr ""
msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} minutes"
@@ -13320,18 +13510,36 @@ msgstr ""
msgid "Every %{action} attempt has failed: %{job_error_message}. Please try again."
msgstr ""
+msgid "Every 3 months"
+msgstr ""
+
+msgid "Every 3 months on the %{day} at %{time} %{timezone}"
+msgstr ""
+
+msgid "Every 6 months"
+msgstr ""
+
+msgid "Every 6 months on the %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Every day"
msgstr ""
msgid "Every day (at %{time})"
msgstr ""
+msgid "Every day at %{time} %{timezone}"
+msgstr ""
+
msgid "Every month"
msgstr ""
msgid "Every month (Day %{day} at %{time})"
msgstr ""
+msgid "Every month on the %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Every three months"
msgstr ""
@@ -13345,6 +13553,15 @@ msgstr[0] ""
msgid "Every week (%{weekday} at %{time})"
msgstr ""
+msgid "Every week on %{day} at %{time} %{timezone}"
+msgstr ""
+
+msgid "Every year"
+msgstr ""
+
+msgid "Every year on %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Everyone"
msgstr ""
@@ -13381,9 +13598,6 @@ msgstr ""
msgid "Exactly one of %{attributes} is required"
msgstr ""
-msgid "Example: %{ip_address}. %{read_more_link}."
-msgstr ""
-
msgid "Example: @sub\\.company\\.com$"
msgstr ""
@@ -13450,13 +13664,13 @@ msgstr ""
msgid "Expand pipeline"
msgstr ""
-msgid "Expand sidebar"
+msgid "Expand settings section"
msgstr ""
-msgid "Expected documents: %{expected_documents}"
+msgid "Expand sidebar"
msgstr ""
-msgid "Experienced"
+msgid "Expected documents: %{expected_documents}"
msgstr ""
msgid "ExperimentSubject|Must have exactly one of User, Namespace, or Project."
@@ -13741,9 +13955,6 @@ msgstr ""
msgid "Failed to load related branches"
msgstr ""
-msgid "Failed to load sidebar lock status"
-msgstr ""
-
msgid "Failed to load stacktrace."
msgstr ""
@@ -14166,6 +14377,9 @@ msgstr ""
msgid "Files"
msgstr ""
+msgid "Files API Rate Limits"
+msgstr ""
+
msgid "Files breadcrumb"
msgstr ""
@@ -15165,6 +15379,9 @@ msgstr ""
msgid "GitLab group: %{source_link}"
msgstr ""
+msgid "GitLab informs you if a new version is available."
+msgstr ""
+
msgid "GitLab is a complete DevOps platform, delivered as a single application, fundamentally changing the way Development, Security, and Ops teams collaborate"
msgstr ""
@@ -15180,7 +15397,7 @@ msgstr ""
msgid "GitLab is open source software to collaborate on code."
msgstr ""
-msgid "GitLab is undergoing maintenance and is operating in a read-only mode."
+msgid "GitLab is undergoing maintenance and is operating in read-only mode."
msgstr ""
msgid "GitLab member or Email address"
@@ -15192,9 +15409,6 @@ msgstr ""
msgid "GitLab project export"
msgstr ""
-msgid "GitLab restart is required to apply changes."
-msgstr ""
-
msgid "GitLab single sign-on URL"
msgstr ""
@@ -15210,9 +15424,6 @@ msgstr ""
msgid "GitLab version"
msgstr ""
-msgid "GitLab will inform you if a new version is available."
-msgstr ""
-
msgid "GitLab will run a background job that will produce pseudonymized CSVs of the GitLab database that will be uploaded to your configured object storage directory."
msgstr ""
@@ -15477,9 +15688,21 @@ msgstr ""
msgid "Go to snippets"
msgstr ""
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check 'Allowed domains for sign-ups'."
+msgstr ""
+
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check 'Email restrictions for sign-ups'."
+msgstr ""
+
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check the 'Domain denylist'."
+msgstr ""
+
msgid "Go to the activity feed"
msgstr ""
+msgid "Go to the group’s 'Settings &gt; General' page, and check 'Restrict membership by email domain'."
+msgstr ""
+
msgid "Go to the milestone list"
msgstr ""
@@ -15516,6 +15739,12 @@ msgstr ""
msgid "Goal of the changes and what reviewers should be aware of"
msgstr ""
+msgid "Google Cloud"
+msgstr ""
+
+msgid "Google Cloud offers several deployment targets. Select the one most suitable for your project."
+msgstr ""
+
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
@@ -15600,9 +15829,6 @@ msgstr ""
msgid "Group ID"
msgstr ""
-msgid "Group ID: %{group_id}"
-msgstr ""
-
msgid "Group Owner must have signed in with SAML before enabling Group Managed Accounts"
msgstr ""
@@ -15777,6 +16003,12 @@ msgstr ""
msgid "GroupImport|Unable to process group import file"
msgstr ""
+msgid "GroupPage|Copy group ID"
+msgstr ""
+
+msgid "GroupPage|Group ID: %{group_id}"
+msgstr ""
+
msgid "GroupRoadmap|%{dateWord} – No end date"
msgstr ""
@@ -15831,6 +16063,9 @@ msgstr ""
msgid "GroupRoadmap|Within 3 years"
msgstr ""
+msgid "GroupSAML|\"persistent\" recommended"
+msgstr ""
+
msgid "GroupSAML|%{strongOpen}Warning%{strongClose} - Enabling %{linkStart}SSO enforcement%{linkEnd} can reduce security risks."
msgstr ""
@@ -15963,6 +16198,9 @@ msgstr ""
msgid "GroupSAML|To be able to prohibit outer forks, you first need to enforce dedicate group managed accounts."
msgstr ""
+msgid "GroupSAML|Use SAML group links to manage group membership using SAML."
+msgstr ""
+
msgid "GroupSAML|Valid SAML Response"
msgstr ""
@@ -15975,13 +16213,10 @@ msgstr ""
msgid "GroupSAML|as %{access_level}"
msgstr ""
-msgid "GroupSAML|must match stored NameID of \"%{extern_uid}\" as we use this to identify users. If the NameID changes users will be unable to sign in."
-msgstr ""
-
-msgid "GroupSAML|should be \"persistent\""
+msgid "GroupSAML|must match stored NameID of \"%{extern_uid}\" to identify user and allow sign in"
msgstr ""
-msgid "GroupSAML|should be a random persistent ID, emails are discouraged"
+msgid "GroupSAML|recommend persistent ID instead of email"
msgstr ""
msgid "GroupSelect|No matching results"
@@ -15996,9 +16231,15 @@ msgstr ""
msgid "GroupSettings|Allow project access token creation"
msgstr ""
+msgid "GroupSettings|Applied to all subgroups unless overridden by a group owner. Groups already added to the project lose access."
+msgstr ""
+
msgid "GroupSettings|Auto DevOps pipeline was updated for the group"
msgstr ""
+msgid "GroupSettings|Available only on the top-level group. Applies to all subgroups. Groups already shared with a group outside %{group} are still shared unless removed manually."
+msgstr ""
+
msgid "GroupSettings|Badges"
msgstr ""
@@ -16050,6 +16291,9 @@ msgstr ""
msgid "GroupSettings|New runners registration token has been generated!"
msgstr ""
+msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgstr ""
+
msgid "GroupSettings|Pipeline settings was updated for the group"
msgstr ""
@@ -16062,12 +16306,15 @@ msgstr ""
msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
-msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups."
+msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups"
msgstr ""
msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
msgstr ""
+msgid "GroupSettings|Prevents group members from being notified if the group is mentioned."
+msgstr ""
+
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
msgstr ""
@@ -16104,21 +16351,6 @@ msgstr ""
msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}."
msgstr ""
-msgid "GroupSettings|This setting is only available on the top-level group and it applies to all subgroups. Groups that have already been shared with a group outside %{group} will still be shared, and this access will have to be revoked manually."
-msgstr ""
-
-msgid "GroupSettings|This setting will be applied to all subgroups unless overridden by a group owner. Groups that already have access to the project will continue to have access unless removed manually."
-msgstr ""
-
-msgid "GroupSettings|This setting will override user notification preferences for all members of the group, subgroups, and projects."
-msgstr ""
-
-msgid "GroupSettings|This setting will prevent group members from being notified if the group is mentioned."
-msgstr ""
-
-msgid "GroupSettings|This setting will prevent group members from forking projects outside of the group."
-msgstr ""
-
msgid "GroupSettings|Transfer group"
msgstr ""
@@ -16236,7 +16468,7 @@ msgstr ""
msgid "GroupsNew|No import options available"
msgstr ""
-msgid "GroupsNew|Not all related objects are migrated, as %{docs_link_start}described here%{docs_link_end}. Please %{feedback_link_start}leave feedback%{feedback_link_end} on this feature."
+msgid "GroupsNew|Not all related objects are migrated. %{docs_link_start}More info%{docs_link_end}."
msgstr ""
msgid "GroupsNew|Personal access token"
@@ -16368,15 +16600,27 @@ msgstr ""
msgid "Hello %{name},"
msgstr ""
-msgid "Hello there"
-msgstr ""
-
msgid "Hello, %{name}!"
msgstr ""
msgid "Hello, %{username}!"
msgstr ""
+msgid "HelloMessage|%{handshake_emoji} Contribute to GitLab: %{contribute_link}"
+msgstr ""
+
+msgid "HelloMessage|%{magnifier_emoji} Create a new GitLab issue: %{new_issue_link}"
+msgstr ""
+
+msgid "HelloMessage|%{rocket_emoji} We like your curiosity! Help us improve GitLab by joining the team: %{jobs_page_link}"
+msgstr ""
+
+msgid "HelloMessage|Does this page need fixes or improvements? Open an issue or contribute a merge request to help make GitLab more lovable. At GitLab, everyone can contribute!"
+msgstr ""
+
+msgid "HelloMessage|Welcome to GitLab!"
+msgstr ""
+
msgid "Help"
msgstr ""
@@ -16386,13 +16630,10 @@ msgstr ""
msgid "Helps prevent bots from creating accounts."
msgstr ""
-msgid "Helps prevent bots from creating issues"
-msgstr ""
-
-msgid "Helps prevent malicious users hide their activity"
+msgid "Helps prevent bots from creating issues."
msgstr ""
-msgid "Helps reduce request volume (e.g. from crawlers or abusive bots)"
+msgid "Helps prevent malicious users hide their activity."
msgstr ""
msgid "Helps reduce request volume (for example, from crawlers or abusive bots)"
@@ -16514,6 +16755,12 @@ msgstr ""
msgid "Housekeeping, export, path, transfer, remove, archive."
msgstr ""
+msgid "How do I configure Akismet?"
+msgstr ""
+
+msgid "How do I configure it?"
+msgstr ""
+
msgid "How do I configure runners?"
msgstr ""
@@ -16535,19 +16782,25 @@ msgstr ""
msgid "How do I set up this service?"
msgstr ""
+msgid "How do I use a web terminal?"
+msgstr ""
+
+msgid "How do I use file templates?"
+msgstr ""
+
msgid "How it works"
msgstr ""
msgid "How many days need to pass between marking entity for deletion and actual removing it."
msgstr ""
-msgid "How many seconds an IP will be counted towards the limit"
+msgid "How many seconds an IP counts toward the IP address limit."
msgstr ""
-msgid "I accept the %{terms_link}"
+msgid "How the job limiter handles jobs exceeding the thresholds specified below. The 'track' mode only logs the jobs. The 'compress' mode compresses the jobs and raises an exception if the compressed size exceeds the limit."
msgstr ""
-msgid "I accept the|Terms of Service and Privacy Policy"
+msgid "I accept the %{terms_link}"
msgstr ""
msgid "I forgot my password"
@@ -16631,13 +16884,16 @@ msgstr ""
msgid "IP Address"
msgstr ""
-msgid "IP expiration time"
+msgid "IP address expiration time"
msgstr ""
-msgid "IP subnet restriction only allowed for top-level groups"
+msgid "IP address restrictions"
+msgstr ""
+
+msgid "IP addresses per user"
msgstr ""
-msgid "IPs per user"
+msgid "IP subnet restriction only allowed for top-level groups"
msgstr ""
msgid "Identifier"
@@ -16652,6 +16908,9 @@ msgstr ""
msgid "If any indexed field exceeds this limit it will be truncated to this number of characters and the rest will not be indexed or searchable. This does not apply to repository and wiki indexing. Setting this to 0 means it is unlimited."
msgstr ""
+msgid "If blank, defaults to %{code_open}Retry later%{code_close}."
+msgstr ""
+
msgid "If blank, set allowable lifetime to %{instance_level_policy_in_words}, as defined by the instance admin. Once set, existing tokens for users in this group may be revoked."
msgstr ""
@@ -16703,6 +16962,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 did not initiate these sign-in attempts, please reach out to your administrator or enable two-factor authentication (2FA) on your account."
+msgstr ""
+
msgid "If you did not initiate this change, please contact your administrator immediately."
msgstr ""
@@ -16792,10 +17054,10 @@ msgstr ""
msgid "Import Projects from Gitea"
msgstr ""
-msgid "Import a project"
+msgid "Import an exported GitLab project"
msgstr ""
-msgid "Import an exported GitLab project"
+msgid "Import and export rate limits"
msgstr ""
msgid "Import failed due to a GitHub error: %{original}"
@@ -16807,12 +17069,18 @@ msgstr ""
msgid "Import from Jira"
msgstr ""
+msgid "Import group"
+msgstr ""
+
msgid "Import group from file"
msgstr ""
msgid "Import groups"
msgstr ""
+msgid "Import history"
+msgstr ""
+
msgid "Import in progress"
msgstr ""
@@ -16876,7 +17144,25 @@ msgstr ""
msgid "Import timed out. Import took longer than %{import_jobs_expiration} seconds"
msgstr ""
-msgid "Import/Export Rate Limits"
+msgid "ImportAProjectModal|Import from a project"
+msgstr ""
+
+msgid "ImportAProjectModal|Import members from another project"
+msgstr ""
+
+msgid "ImportAProjectModal|Import project members"
+msgstr ""
+
+msgid "ImportAProjectModal|Only project members (not group members) are imported, and they get the same permissions as the project you import from."
+msgstr ""
+
+msgid "ImportAProjectModal|Successfully imported"
+msgstr ""
+
+msgid "ImportAProjectModal|Unable to import project members"
+msgstr ""
+
+msgid "ImportAProjectModal|You're importing members to the %{strongStart}%{name}%{strongEnd} project."
msgstr ""
msgid "ImportButtons|Connect repositories from"
@@ -16928,7 +17214,7 @@ msgstr[0] ""
msgid "Importing..."
msgstr ""
-msgid "Import|A repository URL usually ends in a .git suffix, although this is not required. Double check to make sure your repository URL is correct."
+msgid "Import|There is not a valid Git repository at this URL. If your HTTP repository is not publicly accessible, verify your credentials."
msgstr ""
msgid "Improve customer support with Service Desk"
@@ -16937,9 +17223,6 @@ msgstr ""
msgid "Improves Git cloning performance."
msgstr ""
-msgid "In %{time_to_now}"
-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 ""
@@ -17225,7 +17508,7 @@ msgstr ""
msgid "InProductMarketing|Start a GitLab Ultimate trial today in less than one minute, no credit card required."
msgstr ""
-msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no CC required"
+msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no credit card required"
msgstr ""
msgid "InProductMarketing|Start a trial"
@@ -17264,7 +17547,7 @@ msgstr ""
msgid "InProductMarketing|Team up in GitLab for greater efficiency"
msgstr ""
-msgid "InProductMarketing|Team work makes the dream work"
+msgid "InProductMarketing|Team work makes the dream work"
msgstr ""
msgid "InProductMarketing|Test, create, deploy"
@@ -17844,6 +18127,9 @@ msgstr ""
msgid "Integrations|Create new issue in Jira"
msgstr ""
+msgid "Integrations|Create new issue in ZenTao"
+msgstr ""
+
msgid "Integrations|Default settings are inherited from the group level."
msgstr ""
@@ -17937,9 +18223,15 @@ msgstr ""
msgid "Integrations|Search Jira issues"
msgstr ""
+msgid "Integrations|Search ZenTao issues"
+msgstr ""
+
msgid "Integrations|Send notifications about project events to Unify Circuit."
msgstr ""
+msgid "Integrations|Send notifications about project events to a Unify Circuit conversation. %{docs_link}"
+msgstr ""
+
msgid "Integrations|Sign in to add namespaces"
msgstr ""
@@ -17979,6 +18271,9 @@ msgstr ""
msgid "Integrations|You've activated every integration 🎉"
msgstr ""
+msgid "Integrations|ZenTao issues display here when you create issues in your project in ZenTao."
+msgstr ""
+
msgid "Interactive mode"
msgstr ""
@@ -18006,9 +18301,6 @@ msgstr ""
msgid "Interval Pattern"
msgstr ""
-msgid "Introducing Value Stream Analytics"
-msgstr ""
-
msgid "Introducing Your DevOps Report"
msgstr ""
@@ -18105,6 +18397,12 @@ msgstr ""
msgid "Investigate vulnerability: %{title}"
msgstr ""
+msgid "Invisible Captcha"
+msgstr ""
+
+msgid "Invisible Captcha helps prevent the creation of spam accounts. It adds a honeypot field and time-sensitive form submission to the account signup form."
+msgstr ""
+
msgid "Invitation"
msgstr ""
@@ -18558,12 +18856,18 @@ msgstr ""
msgid "Issues"
msgstr ""
+msgid "Issues I've created"
+msgstr ""
+
msgid "Issues Rate Limits"
msgstr ""
msgid "Issues and merge requests"
msgstr ""
+msgid "Issues assigned to me"
+msgstr ""
+
msgid "Issues can be bugs, tasks or ideas to be discussed. Also, issues are searchable and filterable."
msgstr ""
@@ -18675,7 +18979,7 @@ msgstr ""
msgid "Iterations|Create cadence"
msgstr ""
-msgid "Iterations|Create your first iteration"
+msgid "Iterations|Create iteration"
msgstr ""
msgid "Iterations|Delete cadence"
@@ -18684,6 +18988,9 @@ msgstr ""
msgid "Iterations|Delete iteration cadence?"
msgstr ""
+msgid "Iterations|Delete iteration?"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -18717,12 +19024,18 @@ msgstr ""
msgid "Iterations|New iteration cadence"
msgstr ""
+msgid "Iterations|No closed iterations."
+msgstr ""
+
msgid "Iterations|No iteration cadences to show."
msgstr ""
msgid "Iterations|No iterations in cadence."
msgstr ""
+msgid "Iterations|No open iterations."
+msgstr ""
+
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
@@ -18753,6 +19066,9 @@ msgstr ""
msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
msgstr ""
+msgid "Iterations|This will remove the iteration from any issues that are assigned to it."
+msgstr ""
+
msgid "Iterations|Title"
msgstr ""
@@ -18768,15 +19084,9 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "I’m familiar with the basics of DevOps."
-msgstr ""
-
msgid "I’m joining my team who’s already on GitLab"
msgstr ""
-msgid "I’m not familiar with the basics of DevOps."
-msgstr ""
-
msgid "Jaeger URL"
msgstr ""
@@ -19041,6 +19351,9 @@ msgstr ""
msgid "Job"
msgstr ""
+msgid "Job %{jobName}"
+msgstr ""
+
msgid "Job Failed #%{build_id}"
msgstr ""
@@ -19630,9 +19943,6 @@ msgstr ""
msgid "Learn more in the"
msgstr ""
-msgid "Learn more in the|pipeline schedules documentation"
-msgstr ""
-
msgid "Learn more."
msgstr ""
@@ -19744,9 +20054,6 @@ msgstr ""
msgid "Leave Admin Mode"
msgstr ""
-msgid "Leave blank for no limit. Once set, existing personal access tokens may be revoked."
-msgstr ""
-
msgid "Leave edit mode? All unsaved changes will be lost."
msgstr ""
@@ -19792,10 +20099,10 @@ msgstr ""
msgid "LicenseCompliance|Acceptable license to be used in the project"
msgstr ""
-msgid "LicenseCompliance|Add a license"
+msgid "LicenseCompliance|Add license and related policy"
msgstr ""
-msgid "LicenseCompliance|Add license and related policy"
+msgid "LicenseCompliance|Add license policy"
msgstr ""
msgid "LicenseCompliance|Allow"
@@ -19879,6 +20186,9 @@ msgstr ""
msgid "LicenseManagement|Uncategorized"
msgstr ""
+msgid "Licensed Enterprise Edition features can be used if the project namespace's plan includes the feature, or if the project is public."
+msgstr ""
+
msgid "Licensed Features"
msgstr ""
@@ -19945,7 +20255,10 @@ msgstr ""
msgid "Limit namespaces and projects that can be indexed"
msgstr ""
-msgid "Limit sign in from multiple ips"
+msgid "Limit project size at a global, group, and project level. %{link_start}Learn more%{link_end}."
+msgstr ""
+
+msgid "Limit sign in from multiple IP addresses"
msgstr ""
msgid "Limit the number of concurrent operations this secondary site can run in the background."
@@ -19957,10 +20270,16 @@ msgstr ""
msgid "Limit the number of issues and epics per minute a user can create through web and API requests."
msgstr ""
+msgid "Limit the size of Sidekiq jobs stored in Redis."
+msgstr ""
+
msgid "Limited to showing %d event at most"
msgid_plural "Limited to showing %d events at most"
msgstr[0] ""
+msgid "Limiting mode"
+msgstr ""
+
msgid "Line changes"
msgstr ""
@@ -20030,9 +20349,6 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
-msgid "List of users to be excluded from the limit"
-msgstr ""
-
msgid "List options"
msgstr ""
@@ -20072,9 +20388,6 @@ msgstr ""
msgid "Loading functions timed out. Please reload the page to try again."
msgstr ""
-msgid "Loading issues"
-msgstr ""
-
msgid "Loading more"
msgstr ""
@@ -20366,6 +20679,9 @@ msgstr ""
msgid "Marked For Deletion At - %{deletion_time}"
msgstr ""
+msgid "Marked as ready. Merging is now allowed."
+msgstr ""
+
msgid "Marked this %{noun} as a draft."
msgstr ""
@@ -20438,52 +20754,22 @@ msgstr ""
msgid "Max 100,000 events"
msgstr ""
-msgid "Max 20 characters"
-msgstr ""
-
-msgid "Max Group Export Download requests per minute per user"
-msgstr ""
-
-msgid "Max Group Export requests per minute per user"
-msgstr ""
-
-msgid "Max Group Import requests per minute per user"
-msgstr ""
-
-msgid "Max Project Export Download requests per minute per user"
-msgstr ""
-
-msgid "Max Project Export requests per minute per user"
-msgstr ""
-
-msgid "Max Project Import requests per minute per user"
-msgstr ""
-
-msgid "Max authenticated API requests per period per user"
-msgstr ""
-
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
-msgid "Max authenticated web requests per period per user"
-msgstr ""
-
msgid "Max file size is 200 KB."
msgstr ""
-msgid "Max requests per minute per user"
-msgstr ""
-
msgid "Max role"
msgstr ""
msgid "Max session time"
msgstr ""
-msgid "Max unauthenticated requests per period per IP"
+msgid "MaxBuilds"
msgstr ""
-msgid "MaxBuilds"
+msgid "Maximum 20 characters"
msgstr ""
msgid "Maximum Conan package file size in bytes"
@@ -20519,6 +20805,12 @@ msgstr ""
msgid "Maximum attachment size (MB)"
msgstr ""
+msgid "Maximum authenticated API requests per rate limit period per user"
+msgstr ""
+
+msgid "Maximum authenticated web requests per rate limit period per user"
+msgstr ""
+
msgid "Maximum bulk request size (MiB)"
msgstr ""
@@ -20564,6 +20856,15 @@ msgstr ""
msgid "Maximum files in a diff"
msgstr ""
+msgid "Maximum group export download requests per minute"
+msgstr ""
+
+msgid "Maximum group export requests per minute"
+msgstr ""
+
+msgid "Maximum group import requests per minute"
+msgstr ""
+
msgid "Maximum import size"
msgstr ""
@@ -20600,7 +20901,7 @@ msgstr ""
msgid "Maximum number of projects."
msgstr ""
-msgid "Maximum number of unique IPs per user"
+msgid "Maximum number of unique IP addresses per user."
msgstr ""
msgid "Maximum page reached"
@@ -20609,12 +20910,24 @@ msgstr ""
msgid "Maximum page size"
msgstr ""
+msgid "Maximum project export download requests per minute"
+msgstr ""
+
+msgid "Maximum project export requests per minute"
+msgstr ""
+
+msgid "Maximum project import requests per minute"
+msgstr ""
+
msgid "Maximum push size"
msgstr ""
msgid "Maximum push size (MB)"
msgstr ""
+msgid "Maximum requests per minute"
+msgstr ""
+
msgid "Maximum running slices"
msgstr ""
@@ -20642,10 +20955,16 @@ msgstr ""
msgid "Maximum time between updates that a mirror can have when scheduled to synchronize."
msgstr ""
-msgid "Maximum time for web terminal websocket connection (in seconds). 0 for unlimited."
+msgid "Maximum time that users are allowed to skip the setup of two-factor authentication (in hours). Set to 0 (zero) to enforce at next sign in."
msgstr ""
-msgid "Maximum time that users are allowed to skip the setup of two-factor authentication (in hours). Set to 0 (zero) to enforce at next sign in."
+msgid "Maximum time, in seconds, for a web terminal websocket connection. 0 for unlimited."
+msgstr ""
+
+msgid "Maximum unauthenticated API requests per rate limit period per IP"
+msgstr ""
+
+msgid "Maximum unauthenticated web requests per rate limit period per IP"
msgstr ""
msgid "May"
@@ -20663,9 +20982,6 @@ msgstr ""
msgid "Medium vulnerabilities present"
msgstr ""
-msgid "Member lock"
-msgstr ""
-
msgid "Member since"
msgstr ""
@@ -20702,6 +21018,9 @@ msgstr ""
msgid "Members of a group may only view projects they have permission to access"
msgstr ""
+msgid "Membership"
+msgstr ""
+
msgid "Members|%{time} by %{user}"
msgstr ""
@@ -20762,9 +21081,6 @@ msgstr ""
msgid "Members|Expiration date updated successfully."
msgstr ""
-msgid "Members|Expired"
-msgstr ""
-
msgid "Members|Filter members"
msgstr ""
@@ -20780,9 +21096,6 @@ msgstr ""
msgid "Members|Membership"
msgstr ""
-msgid "Members|No expiration set"
-msgstr ""
-
msgid "Members|Remove \"%{groupName}\""
msgstr ""
@@ -20804,9 +21117,6 @@ msgstr ""
msgid "Members|Search invited"
msgstr ""
-msgid "Members|in %{time}"
-msgstr ""
-
msgid "Member|Deny access"
msgstr ""
@@ -20882,9 +21192,6 @@ msgstr ""
msgid "Merge request %{mr_link} was reviewed by %{mr_author}"
msgstr ""
-msgid "Merge request (MR) approvals"
-msgstr ""
-
msgid "Merge request analytics"
msgstr ""
@@ -20906,12 +21213,21 @@ msgstr ""
msgid "Merge requests"
msgstr ""
+msgid "Merge requests I've created"
+msgstr ""
+
msgid "Merge requests are a place to propose changes you've made to a project and discuss those changes with others"
msgstr ""
msgid "Merge requests are read-only in a secondary Geo node"
msgstr ""
+msgid "Merge requests assigned to me"
+msgstr ""
+
+msgid "Merge requests that I'm a reviewer"
+msgstr ""
+
msgid "Merge the branch and fix any conflicts that come up"
msgstr ""
@@ -20972,10 +21288,10 @@ msgstr ""
msgid "MergeRequests|An error occurred while saving the draft comment."
msgstr ""
-msgid "MergeRequests|Failed to squash. Should be done manually."
+msgid "MergeRequests|Create issue to resolve thread"
msgstr ""
-msgid "MergeRequests|Resolve this thread in a new issue"
+msgid "MergeRequests|Failed to squash. Should be done manually."
msgstr ""
msgid "MergeRequests|Saving the comment failed"
@@ -21787,6 +22103,9 @@ msgstr ""
msgid "MoveIssue|Cannot move issue to project it originates from!"
msgstr ""
+msgid "MoveIssue|Cannot move issues of '%{issue_type}' type."
+msgstr ""
+
msgid "Moved issue to %{label} column in the board."
msgstr ""
@@ -21911,6 +22230,15 @@ 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. To learn more about reducing storage capacity please visit our docs."
msgstr ""
+msgid "NamespaceUserCap|Pending users must be reviewed and approved by a group owner. Learn more about %{user_caps_link_start}User Caps%{link_end} and %{users_pending_approval_link_start}Users Pending Approval%{link_end}."
+msgstr ""
+
+msgid "NamespaceUserCap|View pending user approvals"
+msgstr ""
+
+msgid "NamespaceUserCap|Your group has reached its billable member limit"
+msgstr ""
+
msgid "Namespaces"
msgstr ""
@@ -21953,9 +22281,6 @@ msgstr ""
msgid "Network"
msgstr ""
-msgid "Network Policy|New rule"
-msgstr ""
-
msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is inbound from a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
msgstr ""
@@ -21977,16 +22302,13 @@ msgstr ""
msgid "NetworkPolicies|%{strongOpen}any%{strongClose} port"
msgstr ""
-msgid "NetworkPolicies|+ Add alert"
-msgstr ""
-
msgid "NetworkPolicies|.yaml"
msgstr ""
msgid "NetworkPolicies|.yaml mode"
msgstr ""
-msgid "NetworkPolicies|Actions"
+msgid "NetworkPolicies|Add alert"
msgstr ""
msgid "NetworkPolicies|Alerts are intended to be selectively used for a limited number of events that are potentially concerning and warrant a manual review. Alerts should not be used as a substitute for a SIEM or a logging tool. High volume alerts are likely to be dropped so as to preserve the stability of GitLab's integration with Kubernetes."
@@ -22022,9 +22344,6 @@ msgstr ""
msgid "NetworkPolicies|Deny all traffic"
msgstr ""
-msgid "NetworkPolicies|Description"
-msgstr ""
-
msgid "NetworkPolicies|Edit policy"
msgstr ""
@@ -22037,9 +22356,6 @@ msgstr ""
msgid "NetworkPolicies|IP/subnet"
msgstr ""
-msgid "NetworkPolicies|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
-msgstr ""
-
msgid "NetworkPolicies|Invalid or empty policy"
msgstr ""
@@ -22049,19 +22365,16 @@ msgstr ""
msgid "NetworkPolicies|Kubernetes error: %{error}"
msgstr ""
-msgid "NetworkPolicies|Name"
-msgstr ""
-
msgid "NetworkPolicies|Network"
msgstr ""
-msgid "NetworkPolicies|Network traffic"
+msgid "NetworkPolicies|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
msgstr ""
-msgid "NetworkPolicies|New policy"
+msgid "NetworkPolicies|Network policy can be created after the environment is loaded successfully."
msgstr ""
-msgid "NetworkPolicies|No policies detected"
+msgid "NetworkPolicies|Network traffic"
msgstr ""
msgid "NetworkPolicies|None selected"
@@ -22070,21 +22383,12 @@ msgstr ""
msgid "NetworkPolicies|Please %{installLinkStart}install%{installLinkEnd} and %{configureLinkStart}configure a Kubernetes Agent for this project%{configureLinkEnd} to enable alerts."
msgstr ""
-msgid "NetworkPolicies|Policies are a specification of how groups of pods are allowed to communicate with each other's network endpoints."
-msgstr ""
-
msgid "NetworkPolicies|Policy %{policyName} was successfully changed"
msgstr ""
msgid "NetworkPolicies|Policy definition"
msgstr ""
-msgid "NetworkPolicies|Policy editor"
-msgstr ""
-
-msgid "NetworkPolicies|Policy preview"
-msgstr ""
-
msgid "NetworkPolicies|Rule"
msgstr ""
@@ -22094,9 +22398,6 @@ msgstr ""
msgid "NetworkPolicies|Rule mode is unavailable for this policy. In some cases, we cannot parse the YAML file back into the rules editor."
msgstr ""
-msgid "NetworkPolicies|Rules"
-msgstr ""
-
msgid "NetworkPolicies|Save changes"
msgstr ""
@@ -22109,9 +22410,6 @@ msgstr ""
msgid "NetworkPolicies|Traffic that does not match any rule will be blocked."
msgstr ""
-msgid "NetworkPolicies|Unable to parse policy"
-msgstr ""
-
msgid "NetworkPolicies|all DNS names"
msgstr ""
@@ -22290,6 +22588,9 @@ msgstr ""
msgid "New issue"
msgstr ""
+msgid "New issue in %{project}"
+msgstr ""
+
msgid "New issue title"
msgstr ""
@@ -22368,7 +22669,7 @@ msgstr ""
msgid "Newest first"
msgstr ""
-msgid "Newly registered users will by default be external"
+msgid "Newly-registered users are external by default"
msgstr ""
msgid "Next"
@@ -22683,8 +22984,9 @@ msgstr ""
msgid "No webhooks found, add one in the form above."
msgstr ""
-msgid "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} to renew your subscription."
-msgstr ""
+msgid "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} day to renew your subscription."
+msgid_plural "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} days to renew your subscription."
+msgstr[0] ""
msgid "No. of commits"
msgstr ""
@@ -22701,7 +23003,7 @@ msgstr ""
msgid "Nodes"
msgstr ""
-msgid "Non-admin users can sign in with read-only access and make read-only API requests."
+msgid "Non-admin users are restricted to read-only access, in both GitLab UI and API."
msgstr ""
msgid "None"
@@ -22782,7 +23084,7 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
-msgid "Notes Rate Limits"
+msgid "Notes rate limit"
msgstr ""
msgid "Notes|Are you sure you want to cancel creating this comment?"
@@ -22945,9 +23247,6 @@ msgstr ""
msgid "November"
msgstr ""
-msgid "Novice"
-msgstr ""
-
msgid "Now, personalize your GitLab experience"
msgstr ""
@@ -23116,7 +23415,7 @@ msgstr ""
msgid "OnCallSchedules|For this rotation, on-call will be:"
msgstr ""
-msgid "OnCallSchedules|On-call schedule %{schedule} in Project %{project}"
+msgid "OnCallSchedules|On-call schedule %{obstacle} in Project %{project}"
msgstr ""
msgid "OnCallSchedules|On-call schedules"
@@ -23263,22 +23562,22 @@ msgstr ""
msgid "OnDemandScans|Scanner profile"
msgstr ""
-msgid "OnDemandScans|Select one of the existing profiles"
+msgid "OnDemandScans|Schedule scan"
msgstr ""
-msgid "OnDemandScans|Site profile"
+msgid "OnDemandScans|Select one of the existing profiles"
msgstr ""
-msgid "OnDemandScans|Use existing scanner profile"
+msgid "OnDemandScans|Site profile"
msgstr ""
-msgid "OnDemandScans|Use existing site profile"
+msgid "OnDemandScans|Start time"
msgstr ""
-msgid "OnDemandScans|You can either choose a passive scan or validate the target site in your chosen site profile. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
+msgid "OnDemandScans|Use existing scanner profile"
msgstr ""
-msgid "OnDemandScans|You cannot run an active scan against an unvalidated site."
+msgid "OnDemandScans|Use existing site profile"
msgstr ""
msgid "OnDemandScans|You must create a repository within your project to run an on-demand scan."
@@ -23342,6 +23641,9 @@ msgstr ""
msgid "Only admins can delete project"
msgstr ""
+msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
+msgstr ""
+
msgid "Only include features new to your current subscription tier."
msgstr ""
@@ -23360,6 +23662,12 @@ msgstr ""
msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
+msgid "Only reCAPTCHA v2 is supported:"
+msgstr ""
+
+msgid "Only users from the specified IP address ranges are able to reach this group, including all subgroups, projects, and Git repositories."
+msgstr ""
+
msgid "Only verified users with an email address in any of these domains can be added to the group."
msgstr ""
@@ -23546,9 +23854,6 @@ msgstr ""
msgid "Package Registry"
msgstr ""
-msgid "Package Registry Rate Limits"
-msgstr ""
-
msgid "Package Registry: authenticated API requests"
msgstr ""
@@ -23567,6 +23872,9 @@ msgstr ""
msgid "Package recipe already exists"
msgstr ""
+msgid "Package registry rate limits"
+msgstr ""
+
msgid "Package type"
msgstr ""
@@ -23633,6 +23941,9 @@ msgstr ""
msgid "PackageRegistry|Composer"
msgstr ""
+msgid "PackageRegistry|Composer.json with license: %{license} and version: %{version}"
+msgstr ""
+
msgid "PackageRegistry|Conan"
msgstr ""
@@ -23696,6 +24007,9 @@ msgstr ""
msgid "PackageRegistry|Copy require package include"
msgstr ""
+msgid "PackageRegistry|Copy target SHA"
+msgstr ""
+
msgid "PackageRegistry|Copy yarn command"
msgstr ""
@@ -23762,6 +24076,9 @@ msgstr ""
msgid "PackageRegistry|Install package version"
msgstr ""
+msgid "PackageRegistry|Instance-level"
+msgstr ""
+
msgid "PackageRegistry|Invalid Package: failed metadata extraction"
msgstr ""
@@ -23807,6 +24124,9 @@ msgstr ""
msgid "PackageRegistry|Pip Command"
msgstr ""
+msgid "PackageRegistry|Project-level"
+msgstr ""
+
msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
msgstr ""
@@ -23828,6 +24148,9 @@ msgstr ""
msgid "PackageRegistry|Remove package"
msgstr ""
+msgid "PackageRegistry|Required Python: %{pythonVersion}"
+msgstr ""
+
msgid "PackageRegistry|RubyGems"
msgstr ""
@@ -23870,6 +24193,9 @@ msgstr ""
msgid "PackageRegistry|Source project located at %{link}"
msgstr ""
+msgid "PackageRegistry|Target SHA: %{sha}"
+msgstr ""
+
msgid "PackageRegistry|There are no other versions of this package."
msgstr ""
@@ -24038,6 +24364,18 @@ msgstr ""
msgid "Password was successfully updated. Please sign in again."
msgstr ""
+msgid "PasswordPrompt|Confirm password"
+msgstr ""
+
+msgid "PasswordPrompt|Confirm password to continue"
+msgstr ""
+
+msgid "PasswordPrompt|Password is required"
+msgstr ""
+
+msgid "PasswordPrompt|Please enter your password to confirm"
+msgstr ""
+
msgid "Passwords should be unique and not used for any other sites or services."
msgstr ""
@@ -24065,6 +24403,9 @@ msgstr ""
msgid "Paste project path (i.e. gitlab-org/gitlab)"
msgstr ""
+msgid "Paste this DSN into your Sentry SDK"
+msgstr ""
+
msgid "Paste your public SSH key, which is usually contained in the file '~/.ssh/id_ed25519.pub' or '~/.ssh/id_rsa.pub' and begins with 'ssh-ed25519' or 'ssh-rsa'. Do not paste your private SSH key, as that can compromise your identity."
msgstr ""
@@ -24149,6 +24490,9 @@ msgstr ""
msgid "PerformanceBar|First Contentful Paint"
msgstr ""
+msgid "PerformanceBar|Flamegraph with mode:"
+msgstr ""
+
msgid "PerformanceBar|Frontend resources"
msgstr ""
@@ -24182,6 +24526,15 @@ msgstr ""
msgid "PerformanceBar|Trace"
msgstr ""
+msgid "PerformanceBar|cpu"
+msgstr ""
+
+msgid "PerformanceBar|object"
+msgstr ""
+
+msgid "PerformanceBar|wall"
+msgstr ""
+
msgid "Period in seconds"
msgstr ""
@@ -24410,6 +24763,48 @@ msgstr ""
msgid "PipelineSchedules|Variables"
msgstr ""
+msgid "PipelineSource|API"
+msgstr ""
+
+msgid "PipelineSource|Chat"
+msgstr ""
+
+msgid "PipelineSource|External"
+msgstr ""
+
+msgid "PipelineSource|External Pull Request"
+msgstr ""
+
+msgid "PipelineSource|Merge Request"
+msgstr ""
+
+msgid "PipelineSource|On-Demand DAST Scan"
+msgstr ""
+
+msgid "PipelineSource|On-Demand DAST Validation"
+msgstr ""
+
+msgid "PipelineSource|Parent Pipeline"
+msgstr ""
+
+msgid "PipelineSource|Pipeline"
+msgstr ""
+
+msgid "PipelineSource|Push"
+msgstr ""
+
+msgid "PipelineSource|Schedule"
+msgstr ""
+
+msgid "PipelineSource|Trigger"
+msgstr ""
+
+msgid "PipelineSource|Web"
+msgstr ""
+
+msgid "PipelineSource|Web IDE"
+msgstr ""
+
msgid "PipelineStatusTooltip|Pipeline: %{ciStatus}"
msgstr ""
@@ -24710,46 +25105,7 @@ msgstr ""
msgid "Pipeline|Source"
msgstr ""
-msgid "Pipeline|Source|API"
-msgstr ""
-
-msgid "Pipeline|Source|Chat"
-msgstr ""
-
-msgid "Pipeline|Source|External"
-msgstr ""
-
-msgid "Pipeline|Source|External Pull Request"
-msgstr ""
-
-msgid "Pipeline|Source|Merge Request"
-msgstr ""
-
-msgid "Pipeline|Source|On-Demand DAST Scan"
-msgstr ""
-
-msgid "Pipeline|Source|On-Demand DAST Validation"
-msgstr ""
-
-msgid "Pipeline|Source|Parent Pipeline"
-msgstr ""
-
-msgid "Pipeline|Source|Pipeline"
-msgstr ""
-
-msgid "Pipeline|Source|Push"
-msgstr ""
-
-msgid "Pipeline|Source|Schedule"
-msgstr ""
-
-msgid "Pipeline|Source|Trigger"
-msgstr ""
-
-msgid "Pipeline|Source|Web"
-msgstr ""
-
-msgid "Pipeline|Source|Web IDE"
+msgid "Pipeline|Source|Security Policy"
msgstr ""
msgid "Pipeline|Specify variable values to be used in this run. The values specified in %{linkStart}CI/CD settings%{linkEnd} will be used by default."
@@ -24800,7 +25156,7 @@ msgstr ""
msgid "Pipeline|We are currently unable to fetch pipeline data"
msgstr ""
-msgid "Pipeline|You’re about to stop pipeline %{pipelineId}."
+msgid "Pipeline|You’re about to stop pipeline #%{pipelineId}."
msgstr ""
msgid "Pipeline|for"
@@ -24827,6 +25183,9 @@ msgstr ""
msgid "Plain diff"
msgstr ""
+msgid "Plain-text response to send to clients that hit a rate limit"
+msgstr ""
+
msgid "Plan:"
msgstr ""
@@ -24971,9 +25330,6 @@ msgstr ""
msgid "Please provide attributes to update"
msgstr ""
-msgid "Please provide your username or email address."
-msgstr ""
-
msgid "Please reach out if you have any questions and we'll be happy to assist."
msgstr ""
@@ -25016,9 +25372,6 @@ msgstr ""
msgid "Please set a new password before proceeding."
msgstr ""
-msgid "Please share your feedback about %{featureName} %{linkStart}in this issue%{linkEnd} to help us improve the experience."
-msgstr ""
-
msgid "Please solve the captcha"
msgstr ""
@@ -25196,6 +25549,9 @@ msgstr ""
msgid "Prevent adding new members to project membership within this group"
msgstr ""
+msgid "Prevent auto-stopping"
+msgstr ""
+
msgid "Prevent editing approval rules in projects and merge requests."
msgstr ""
@@ -25208,7 +25564,7 @@ msgstr ""
msgid "Prevent users from changing their profile name"
msgstr ""
-msgid "Prevent users from performing write operations on GitLab while performing maintenance."
+msgid "Prevent users from performing write operations while GitLab maintenance is in progress."
msgstr ""
msgid "Preview"
@@ -25481,6 +25837,9 @@ msgstr ""
msgid "Profiles|Enter your name, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Enter your password to confirm the email change"
+msgstr ""
+
msgid "Profiles|Enter your pronouns to let people know how to refer to you"
msgstr ""
@@ -25715,10 +26074,10 @@ msgstr ""
msgid "Profiles|e.g. My MacBook key"
msgstr ""
-msgid "Profiles|username"
+msgid "Profiles|https://website.com"
msgstr ""
-msgid "Profiles|website.com"
+msgid "Profiles|username"
msgstr ""
msgid "Profiles|your account"
@@ -25961,9 +26320,21 @@ msgstr ""
msgid "ProjectSelect| or group"
msgstr ""
+msgid "ProjectSelect|No matching results"
+msgstr ""
+
msgid "ProjectSelect|Search for project"
msgstr ""
+msgid "ProjectSelect|Search projects"
+msgstr ""
+
+msgid "ProjectSelect|Select a project"
+msgstr ""
+
+msgid "ProjectSelect|There was an error fetching the projects. Please try again."
+msgstr ""
+
msgid "ProjectService|Drone server URL"
msgstr ""
@@ -26051,6 +26422,9 @@ msgstr ""
msgid "ProjectService|Trigger event when a new, unique alert is recorded."
msgstr ""
+msgid "ProjectService|Trigger event when a new, unique vulnerability is recorded. (Note: This feature requires an Ultimate plan.)"
+msgstr ""
+
msgid "ProjectService|Trigger event when a pipeline status changes."
msgstr ""
@@ -26465,9 +26839,15 @@ msgstr ""
msgid "Projects are graded based on the highest severity vulnerability present"
msgstr ""
+msgid "Projects are organized into groups"
+msgstr ""
+
msgid "Projects contributed to"
msgstr ""
+msgid "Projects help you organize your work. They contain your file repository, issues, merge requests, and so much more."
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr ""
@@ -26702,10 +27082,10 @@ msgstr ""
msgid "PrometheusService|Prometheus cluster integration"
msgstr ""
-msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
+msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
msgstr ""
-msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
+msgid "PrometheusService|The ID of the IAP-secured resource."
msgstr ""
msgid "PrometheusService|The Prometheus API base URL."
@@ -27323,6 +27703,9 @@ msgstr ""
msgid "Rate limit"
msgstr ""
+msgid "Rate limits can help reduce request volume (like from crawlers or abusive bots)."
+msgstr ""
+
msgid "Raw blob request rate limit per minute"
msgstr ""
@@ -27335,6 +27718,9 @@ msgstr ""
msgid "Re-authentication required"
msgstr ""
+msgid "Re-import"
+msgstr ""
+
msgid "Re-request review"
msgstr ""
@@ -27356,6 +27742,9 @@ msgstr ""
msgid "Read more about related issues"
msgstr ""
+msgid "Read their documentation."
+msgstr ""
+
msgid "Ready to get started with GitLab? Follow these steps to set up your workspace, plan and commit changes, and deploy your project."
msgstr ""
@@ -27389,6 +27778,9 @@ msgstr ""
msgid "Receive any notifications from GitLab."
msgstr ""
+msgid "Receive notification of abuse reports by email."
+msgstr ""
+
msgid "Receive notifications about your own activity"
msgstr ""
@@ -27531,9 +27923,6 @@ msgstr ""
msgid "Registry setup"
msgstr ""
-msgid "Regulate approvals by authors/committers. Affects all projects."
-msgstr ""
-
msgid "Reindexing Status: %{status} (Slice multiplier: %{multiplier}, Maximum running slices: %{max_slices})"
msgstr ""
@@ -27628,6 +28017,9 @@ msgstr ""
msgid "Release|Something went wrong while saving the release details."
msgstr ""
+msgid "Reload page"
+msgstr ""
+
msgid "Remediations"
msgstr ""
@@ -27910,6 +28302,9 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
+msgid "Repeats"
+msgstr ""
+
msgid "Replace"
msgstr ""
@@ -28268,10 +28663,7 @@ msgstr ""
msgid "Require additional authentication for administrative tasks."
msgstr ""
-msgid "Require all users in this group to setup Two-factor authentication"
-msgstr ""
-
-msgid "Require all users in this group to setup two-factor authentication"
+msgid "Require all users in this group to set up two-factor authentication"
msgstr ""
msgid "Required approvals (%{approvals_given} given)"
@@ -28315,6 +28707,9 @@ msgstr[0] ""
msgid "Requires values to meet regular expression requirements."
msgstr ""
+msgid "Requires you to deploy or set up cloud-hosted Sentry."
+msgstr ""
+
msgid "Requires your primary GitLab email address."
msgstr ""
@@ -28375,9 +28770,6 @@ msgstr ""
msgid "Resolve"
msgstr ""
-msgid "Resolve all threads in new issue"
-msgstr ""
-
msgid "Resolve conflicts"
msgstr ""
@@ -28435,6 +28827,9 @@ msgstr ""
msgid "Response text"
msgstr ""
+msgid "Restart GitLab to apply changes."
+msgstr ""
+
msgid "Restart Terminal"
msgstr ""
@@ -28453,6 +28848,9 @@ msgstr ""
msgid "Restoring the project will prevent the project from being removed on this date and restore people's ability to make changes to it."
msgstr ""
+msgid "Restrict group access by IP address. %{link_start}Learn more%{link_end}."
+msgstr ""
+
msgid "Restrict membership by email domain"
msgstr ""
@@ -28764,6 +29162,9 @@ msgstr ""
msgid "Runners|Runner #%{runner_id}"
msgstr ""
+msgid "Runners|Runner assigned to project."
+msgstr ""
+
msgid "Runners|Runner is offline, last contact was %{runner_contact} ago"
msgstr ""
@@ -28776,6 +29177,9 @@ msgstr ""
msgid "Runners|Runner registration"
msgstr ""
+msgid "Runners|Runner unassigned from project."
+msgstr ""
+
msgid "Runners|Runners"
msgstr ""
@@ -28968,7 +29372,7 @@ msgstr ""
msgid "SastEntryPoints|How do I set up SAST?"
msgstr ""
-msgid "SastEntryPoints|Learn more."
+msgid "SastEntryPoints|Learn more"
msgstr ""
msgid "Satisfied"
@@ -29010,7 +29414,7 @@ msgstr ""
msgid "Save pipeline schedule"
msgstr ""
-msgid "Save space and find images in the container Registry. remove unneeded tags and keep only the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
+msgid "Save storage space by automatically deleting tags from the container registry and keeping the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
msgstr ""
msgid "Saving"
@@ -29184,6 +29588,9 @@ msgstr ""
msgid "Search or filter results…"
msgstr ""
+msgid "Search or jump to..."
+msgstr ""
+
msgid "Search project"
msgstr ""
@@ -29244,16 +29651,16 @@ msgstr ""
msgid "SearchCodeResults|of %{link_to_project}"
msgstr ""
-msgid "SearchResults|Showing %{count} %{scope} for%{term_element}"
+msgid "SearchResults|Showing %{count} %{scope} for %{term_element}"
msgstr ""
-msgid "SearchResults|Showing %{count} %{scope} for%{term_element} in your personal and project snippets"
+msgid "SearchResults|Showing %{count} %{scope} for %{term_element} in your personal and project snippets"
msgstr ""
-msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for%{term_element}"
+msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for %{term_element}"
msgstr ""
-msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for%{term_element} in your personal and project snippets"
+msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for %{term_element} in your personal and project snippets"
msgstr ""
msgid "SearchResults|code result"
@@ -29324,6 +29731,9 @@ msgstr ""
msgid "Secret Detection"
msgstr ""
+msgid "Secret access key"
+msgstr ""
+
msgid "Secret token"
msgstr ""
@@ -29363,9 +29773,6 @@ msgstr ""
msgid "SecurityApprovals|A merge request approval is required when the license compliance report contains a denied license."
msgstr ""
-msgid "SecurityApprovals|Configurable if security scanners are enabled. %{linkStart}Learn more.%{linkEnd}"
-msgstr ""
-
msgid "SecurityApprovals|Coverage-Check"
msgstr ""
@@ -29378,24 +29785,18 @@ msgstr ""
msgid "SecurityApprovals|Learn more about Vulnerability-Check"
msgstr ""
-msgid "SecurityApprovals|License Scanning must be enabled. %{linkStart}Learn more%{linkEnd}."
-msgstr ""
-
msgid "SecurityApprovals|License-Check"
msgstr ""
msgid "SecurityApprovals|Requires approval for Denied licenses. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}More information%{linkEnd}"
+msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "SecurityApprovals|Requires approval for vulnerabilities. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
-msgid "SecurityApprovals|Test coverage must be enabled. %{linkStart}Learn more%{linkEnd}."
-msgstr ""
-
msgid "SecurityApprovals|Vulnerability-Check"
msgstr ""
@@ -29459,6 +29860,12 @@ msgstr ""
msgid "SecurityConfiguration|Immediately begin risk analysis and remediation with application security features. Start with SAST and Secret Detection, available to all plans. Upgrade to Ultimate to get all features, including:"
msgstr ""
+msgid "SecurityConfiguration|Manage corpus"
+msgstr ""
+
+msgid "SecurityConfiguration|Manage corpus files used as mutation sources in coverage fuzzing."
+msgstr ""
+
msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
msgstr ""
@@ -29513,6 +29920,12 @@ msgstr ""
msgid "SecurityOrchestration|Action"
msgstr ""
+msgid "SecurityOrchestration|Actions"
+msgstr ""
+
+msgid "SecurityOrchestration|Add rule"
+msgstr ""
+
msgid "SecurityOrchestration|All policies"
msgstr ""
@@ -29546,9 +29959,6 @@ msgstr ""
msgid "SecurityOrchestration|Network"
msgstr ""
-msgid "SecurityOrchestration|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
-msgstr ""
-
msgid "SecurityOrchestration|New policy"
msgstr ""
@@ -29564,6 +29974,9 @@ msgstr ""
msgid "SecurityOrchestration|Policy editor"
msgstr ""
+msgid "SecurityOrchestration|Policy preview"
+msgstr ""
+
msgid "SecurityOrchestration|Policy status"
msgstr ""
@@ -29573,6 +29986,9 @@ msgstr ""
msgid "SecurityOrchestration|Rule"
msgstr ""
+msgid "SecurityOrchestration|Rules"
+msgstr ""
+
msgid "SecurityOrchestration|Scan Execution"
msgstr ""
@@ -29666,6 +30082,9 @@ msgstr ""
msgid "SecurityReports|Create issue"
msgstr ""
+msgid "SecurityReports|Development vulnerabilities"
+msgstr ""
+
msgid "SecurityReports|Dismiss vulnerability"
msgstr ""
@@ -29681,6 +30100,9 @@ msgstr ""
msgid "SecurityReports|Download results"
msgstr ""
+msgid "SecurityReports|Download scanned URLs"
+msgstr ""
+
msgid "SecurityReports|Download scanned resources"
msgstr ""
@@ -29804,6 +30226,9 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
+msgid "SecurityReports|The Vulnerability Report shows the results of the lastest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "SecurityReports|The security reports below contain one or more vulnerability findings that could not be parsed and were not recorded. Download the artifacts in the job output to investigate. Ensure any security report created conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
msgstr ""
@@ -29945,10 +30370,10 @@ msgstr ""
msgid "Select a repository"
msgstr ""
-msgid "Select a role"
+msgid "Select a repository containing templates for common files."
msgstr ""
-msgid "Select a shared template repository for all projects on this instance."
+msgid "Select a role"
msgstr ""
msgid "Select a template repository"
@@ -30026,6 +30451,9 @@ msgstr ""
msgid "Select project to choose zone"
msgstr ""
+msgid "Select project to create issue"
+msgstr ""
+
msgid "Select projects"
msgstr ""
@@ -30143,6 +30571,9 @@ msgstr ""
msgid "Send emails to help guide new users through the onboarding process."
msgstr ""
+msgid "Send emails to users upon account deactivation."
+msgstr ""
+
msgid "Send message"
msgstr ""
@@ -30161,6 +30592,9 @@ msgstr ""
msgid "Send service data"
msgstr ""
+msgid "Sentry"
+msgstr ""
+
msgid "Sentry API URL"
msgstr ""
@@ -30275,6 +30709,9 @@ msgstr ""
msgid "Service"
msgstr ""
+msgid "Service Accounts keys are required to authorize GitLab to deploy your Google Cloud project."
+msgstr ""
+
msgid "Service Desk"
msgstr ""
@@ -30347,15 +30784,15 @@ msgstr ""
msgid "Set a password on your account to pull or push via %{protocol}."
msgstr ""
-msgid "Set a template repository for projects in this group"
-msgstr ""
-
msgid "Set access permissions for this token."
msgstr ""
msgid "Set an instance-wide domain that will be available to all clusters when installing Knative."
msgstr ""
+msgid "Set any rate limit to %{code_open}0%{code_close} to disable the limit."
+msgstr ""
+
msgid "Set default and restrict visibility levels. Configure import sources and git access protocol."
msgstr ""
@@ -30368,7 +30805,7 @@ msgstr ""
msgid "Set limit to 0 to allow any file size."
msgstr ""
-msgid "Set max session time for web terminal."
+msgid "Set limits for web and API requests."
msgstr ""
msgid "Set milestone"
@@ -30377,15 +30814,18 @@ msgstr ""
msgid "Set new password"
msgstr ""
-msgid "Set notification email for abuse reports."
+msgid "Set parent epic to an epic"
msgstr ""
-msgid "Set parent epic to an epic"
+msgid "Set per-user rate limits for imports and exports of projects and groups."
msgstr ""
msgid "Set projects and maximum size limits, session duration, user options, and check feature availability for namespace plan."
msgstr ""
+msgid "Set rate limits for package registry API requests that supersede the general user and IP rate limits."
+msgstr ""
+
msgid "Set severity"
msgstr ""
@@ -30404,15 +30844,24 @@ msgstr ""
msgid "Set the default branch for this project. All merge requests and commits are made against this branch unless you specify a different one."
msgstr ""
+msgid "Set the default expiration time for job artifacts in all projects. Set to %{code_open}0%{code_close} to never expire artifacts by default. If no unit is written, it defaults to seconds. For example, these are all equivalent: %{code_open}3600%{code_close}, %{code_open}60 minutes%{code_close}, or %{code_open}one hour%{code_close}."
+msgstr ""
+
msgid "Set the due date to %{due_date}."
msgstr ""
msgid "Set the iteration to %{iteration_reference}."
msgstr ""
+msgid "Set the maximum session time for a web terminal."
+msgstr ""
+
msgid "Set the milestone to %{milestone_reference}."
msgstr ""
+msgid "Set the per-user rate limit for notes created by web or API requests."
+msgstr ""
+
msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
msgstr ""
@@ -30614,6 +31063,9 @@ msgstr ""
msgid "Show Pipeline IID"
msgstr ""
+msgid "Show all %{issuable_type}."
+msgstr ""
+
msgid "Show all activity"
msgstr ""
@@ -30665,15 +31117,9 @@ msgstr ""
msgid "Show list"
msgstr ""
-msgid "Show me advanced features"
-msgstr ""
-
msgid "Show me how to add a pipeline"
msgstr ""
-msgid "Show me the basics"
-msgstr ""
-
msgid "Show one file at a time"
msgstr ""
@@ -30712,15 +31158,15 @@ msgstr ""
msgid "Showing %{pageSize} of %{total} %{issuableType}"
msgstr ""
-msgid "Showing %{pageSize} of %{total} issues"
-msgstr ""
-
msgid "Showing all epics"
msgstr ""
msgid "Showing all issues"
msgstr ""
+msgid "Showing data for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
+msgstr ""
+
msgid "Showing data for workflow items created in this date range. Date range cannot exceed %{maxDateRange} days."
msgstr ""
@@ -30760,6 +31206,15 @@ msgstr ""
msgid "Sidebar|Weight"
msgstr ""
+msgid "Sidekiq job compression threshold (bytes)"
+msgstr ""
+
+msgid "Sidekiq job size limit (bytes)"
+msgstr ""
+
+msgid "Sidekiq job size limits"
+msgstr ""
+
msgid "Sign in"
msgstr ""
@@ -30880,6 +31335,9 @@ msgstr ""
msgid "Site profile not found for given parameters"
msgstr ""
+msgid "Sites"
+msgstr ""
+
msgid "Size"
msgstr ""
@@ -30910,19 +31368,22 @@ msgstr ""
msgid "SlackIntegration|Sends notifications about project events to Slack channels."
msgstr ""
-msgid "SlackService|2. Paste the %{strong_open}Token%{strong_close} into the field below"
+msgid "SlackService|1. %{slash_command_link_start}Add a slash command%{slash_command_link_end} in your Slack team using this information:"
msgstr ""
-msgid "SlackService|3. Select the %{strong_open}Active%{strong_close} checkbox, press %{strong_open}Save changes%{strong_close} and start using GitLab inside Slack!"
+msgid "SlackService|2. Paste the token from Slack in the %{strong_open}Token%{strong_close} field below."
msgstr ""
-msgid "SlackService|Fill in the word that works best for your team."
+msgid "SlackService|3. Select the %{strong_open}Active%{strong_close} checkbox, select %{strong_open}Save changes%{strong_close}, and start using slash commands in Slack!"
+msgstr ""
+
+msgid "SlackService|After setup, get a list of available Slack slash commands by entering"
msgstr ""
-msgid "SlackService|See list of available commands in Slack after setting up this service, by entering"
+msgid "SlackService|Fill in the word that works best for your team."
msgstr ""
-msgid "SlackService|This service allows users to perform common operations on this project by entering slash commands in Slack."
+msgid "SlackService|Perform common operations in this project by entering slash commands in Slack."
msgstr ""
msgid "Slice multiplier"
@@ -30988,7 +31449,7 @@ msgstr ""
msgid "Some child epics may be hidden due to applied filters"
msgstr ""
-msgid "Some common domains are not allowed. %{read_more_link}."
+msgid "Some common domains are not allowed. %{learn_more_link}."
msgstr ""
msgid "Some of the designs you tried uploading did not change:"
@@ -31072,9 +31533,6 @@ msgstr ""
msgid "Something went wrong while exporting requirements"
msgstr ""
-msgid "Something went wrong while fetching %{listType} list"
-msgstr ""
-
msgid "Something went wrong while fetching branches"
msgstr ""
@@ -31129,15 +31587,9 @@ msgstr ""
msgid "Something went wrong while merging this merge request. Please try again."
msgstr ""
-msgid "Something went wrong while moving issues."
-msgstr ""
-
msgid "Something went wrong while obtaining the Let's Encrypt certificate."
msgstr ""
-msgid "Something went wrong while performing the action."
-msgstr ""
-
msgid "Something went wrong while promoting the issue to an epic. Please try again."
msgstr ""
@@ -31465,7 +31917,10 @@ msgstr ""
msgid "SourcegraphPreferences|Uses a custom %{linkStart}Sourcegraph instance%{linkEnd}."
msgstr ""
-msgid "Spam Check API Key"
+msgid "Spam Check"
+msgstr ""
+
+msgid "Spam Check API key"
msgstr ""
msgid "Spam Logs"
@@ -31483,7 +31938,7 @@ msgstr ""
msgid "Specified URL cannot be used: \"%{reason}\""
msgstr ""
-msgid "Specify an e-mail address regex pattern to identify default internal users."
+msgid "Specify an email address regex pattern to identify default internal users."
msgstr ""
msgid "Speed up your pipelines with Needs relationships"
@@ -31738,7 +32193,7 @@ msgstr ""
msgid "StatusCheck|An error occurred fetching the status checks."
msgstr ""
-msgid "StatusCheck|Apply this status check to any branch or a specific protected branch."
+msgid "StatusCheck|Apply this status check to all branches or a specific protected branch."
msgstr ""
msgid "StatusCheck|Check for a status response in Merge Requests. Failures do not block merges. %{link_start}Learn more%{link_end}."
@@ -32077,6 +32532,9 @@ msgstr ""
msgid "Subscriptions"
msgstr ""
+msgid "Subscription|Your subscription for %{strong}%{namespace_name}%{strong_close} has expired and you are now on %{pricing_link_start}the GitLab Free tier%{pricing_link_end}. Don't worry, your data is safe. Get in touch with our support team (%{support_email}). They'll gladly help with your subscription renewal."
+msgstr ""
+
msgid "Subtracted"
msgstr ""
@@ -32305,6 +32763,9 @@ msgstr ""
msgid "SuperSonics|Plan"
msgstr ""
+msgid "SuperSonics|Please agree to the Subscription Agreement"
+msgstr ""
+
msgid "SuperSonics|Ready to get started? A GitLab plan is ideal for scaling organizations and for multi team usage."
msgstr ""
@@ -32335,6 +32796,9 @@ msgstr ""
msgid "SuperSonics|The activation code is not valid. Please make sure to copy it exactly from the Customers Portal or confirmation email. Learn more about %{linkStart}activating your subscription%{linkEnd}."
msgstr ""
+msgid "SuperSonics|The activation code should be a 24-character alphanumeric string"
+msgstr ""
+
msgid "SuperSonics|There is a connectivity issue."
msgstr ""
@@ -32377,9 +32841,15 @@ msgstr ""
msgid "SuperSonics|You do not have an active subscription"
msgstr ""
+msgid "SuperSonics|You have successfully added a license that activates on %{date}. Please see the subscription history table below for more details."
+msgstr ""
+
msgid "SuperSonics|You'll be charged for %{trueUpLinkStart}users over license%{trueUpLinkEnd} on a quarterly or annual basis, depending on the terms of your agreement."
msgstr ""
+msgid "SuperSonics|Your future dated license was successfully added"
+msgstr ""
+
msgid "SuperSonics|Your subscription"
msgstr ""
@@ -32632,7 +33102,7 @@ msgstr ""
msgid "Template to append to all Service Desk issues"
msgstr ""
-msgid "TemplateRepository|Select a repository to make its templates available to all projects. %{link_start}What should the repository contain?%{link_end} "
+msgid "TemplateRepository|Create common files more quickly, and standardize their format."
msgstr ""
msgid "Templates"
@@ -32834,7 +33304,7 @@ msgstr ""
msgid "TestCases|Search test cases"
msgstr ""
-msgid "TestCases|Something went wrong while adding test case to Todo."
+msgid "TestCases|Something went wrong while adding test case to a to-do item."
msgstr ""
msgid "TestCases|Something went wrong while creating a test case."
@@ -32846,7 +33316,7 @@ msgstr ""
msgid "TestCases|Something went wrong while fetching test cases list."
msgstr ""
-msgid "TestCases|Something went wrong while marking test case todo as done."
+msgid "TestCases|Something went wrong while marking test case to-do item as done."
msgstr ""
msgid "TestCases|Something went wrong while moving test case."
@@ -32966,7 +33436,7 @@ msgstr ""
msgid "Thanks for your purchase!"
msgstr ""
-msgid "That is ok, I do not want to renew"
+msgid "That's OK, I don't want to renew"
msgstr ""
msgid "That's it, well done!"
@@ -32988,7 +33458,7 @@ msgid "The %{type} contains the following error:"
msgid_plural "The %{type} contains the following errors:"
msgstr[0] ""
-msgid "The API key used by GitLab for accessing the Spam Check service endpoint"
+msgid "The API key used by GitLab for accessing the Spam Check service endpoint."
msgstr ""
msgid "The GitLab subscription service (customers.gitlab.com) is currently experiencing an outage. You can monitor the status and get updates at %{linkStart}status.gitlab.com%{linkEnd}."
@@ -33027,9 +33497,6 @@ msgstr ""
msgid "The URL to use for connecting to Elasticsearch. Use a comma-separated list to support clustering (e.g., \"http://localhost:9200, http://localhost:9201\")."
msgstr ""
-msgid "The Vulnerability Report shows the results of the last successful pipeline run on the default branch."
-msgstr ""
-
msgid "The X509 Certificate to use when mutual TLS is required to communicate with the external authorization service. If left blank, the server certificate is still validated when accessing over HTTPS."
msgstr ""
@@ -33087,9 +33554,6 @@ msgstr ""
msgid "The default branch for this project has been changed. Please update your bookmarks."
msgstr ""
-msgid "The default expiration time for job artifacts. 0 for unlimited. The default unit is in seconds, but you can use other units, for example %{code_open}4 mins 2 sec%{code_close}, %{code_open}2h42min%{code_close}."
-msgstr ""
-
msgid "The dependency list details information about the components used within your project."
msgstr ""
@@ -33280,9 +33744,6 @@ msgstr ""
msgid "The merge conflicts for this merge request have already been resolved. Please return to the merge request."
msgstr ""
-msgid "The merge request can now be merged."
-msgstr ""
-
msgid "The metric must be one of %{metrics}."
msgstr ""
@@ -33658,7 +34119,7 @@ msgstr ""
msgid "There was a problem updating the keep latest artifacts setting."
msgstr ""
-msgid "There was an error %{message} todo."
+msgid "There was an error %{message} to-do item."
msgstr ""
msgid "There was an error adding a To Do."
@@ -33697,6 +34158,9 @@ msgstr ""
msgid "There was an error fetching projects"
msgstr ""
+msgid "There was an error fetching search autocomplete suggestions"
+msgstr ""
+
msgid "There was an error fetching stage total counts"
msgstr ""
@@ -34021,6 +34485,9 @@ msgstr ""
msgid "This field is required."
msgstr ""
+msgid "This form is disabled in preview"
+msgstr ""
+
msgid "This group"
msgstr ""
@@ -34042,9 +34509,6 @@ msgstr ""
msgid "This group is linked to a subscription"
msgstr ""
-msgid "This group, including all subgroups, projects and git repositories, will be reachable from only the specified IP address ranges."
-msgstr ""
-
msgid "This group, its subgroups and projects has been scheduled for removal on %{date}."
msgstr ""
@@ -34324,9 +34788,6 @@ msgstr ""
msgid "This user cannot be unlocked manually from GitLab"
msgstr ""
-msgid "This user does not have a pending request"
-msgstr ""
-
msgid "This user has an unconfirmed email address (%{email}). You may force a confirmation."
msgstr ""
@@ -34435,9 +34896,6 @@ msgstr ""
msgid "ThreatMonitoring|Packet Activity"
msgstr ""
-msgid "ThreatMonitoring|Policies"
-msgstr ""
-
msgid "ThreatMonitoring|Requests"
msgstr ""
@@ -34489,6 +34947,12 @@ msgstr ""
msgid "ThreatMonitoring|View documentation"
msgstr ""
+msgid "Threshold in bytes at which to compress Sidekiq job arguments."
+msgstr ""
+
+msgid "Threshold in bytes at which to reject Sidekiq jobs. Set this to 0 to if you don't want to limit Sidekiq jobs."
+msgstr ""
+
msgid "Throughput"
msgstr ""
@@ -34498,6 +34962,9 @@ msgstr ""
msgid "Time"
msgstr ""
+msgid "Time (in hours) that users are allowed to skip forced configuration of two-factor authentication."
+msgstr ""
+
msgid "Time Spent"
msgstr ""
@@ -34564,7 +35031,7 @@ msgstr ""
msgid "TimeTrackingEstimated|Est"
msgstr ""
-msgid "TimeTracking|%{startTag}Spent: %{endTag}%{timeSpentHumanReadable}"
+msgid "TimeTracking|%{spentStart}Spent: %{spentEnd}"
msgstr ""
msgid "TimeTracking|Estimated:"
@@ -34776,6 +35243,9 @@ msgstr ""
msgid "To access this domain create a new DNS record"
msgstr ""
+msgid "To add a custom suffix, set up a Service Desk email address. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "To add an SSH key you need to %{generate_link_start}generate one%{link_end} or use an %{existing_link_start}existing key%{link_end}."
msgstr ""
@@ -34797,13 +35267,16 @@ msgstr ""
msgid "To connect an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To continue using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
+msgstr ""
+
msgid "To continue, you need to select the link in the confirmation email we sent to verify your email address. If you didn't get our email, select %{strongStart}Resend confirmation email.%{strongEnd}"
msgstr ""
msgid "To define internal users, first enable new users set to external"
msgstr ""
-msgid "To enable Registration Features, make sure \"Enable service ping\" is checked."
+msgid "To enable Registration Features, first enable Service Ping."
msgstr ""
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
@@ -34830,7 +35303,7 @@ msgstr ""
msgid "To get started, use the link below to confirm your account."
msgstr ""
-msgid "To help improve GitLab and its user experience, GitLab will periodically collect usage information."
+msgid "To help improve GitLab and its user experience, GitLab periodically collects usage information."
msgstr ""
msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
@@ -34863,7 +35336,7 @@ msgstr ""
msgid "To preserve performance only %{strong_open}%{display_size} of %{real_size}%{strong_close} files are displayed."
msgstr ""
-msgid "To protect this issue's confidentiality, %{forkLink} and set the fork's visibility to private."
+msgid "To protect this issue's confidentiality, %{linkStart}fork this project%{linkEnd} and set the fork's visibility to private."
msgstr ""
msgid "To protect this issue's confidentiality, a private fork of this project was selected."
@@ -34896,12 +35369,15 @@ msgstr ""
msgid "To set up SAML authentication for your group through an identity provider like Azure, Okta, Onelogin, Ping Identity, or your custom SAML 2.0 provider:"
msgstr ""
-msgid "To set up this service:"
+msgid "To set up this integration:"
msgstr ""
msgid "To specify the notification level per project of a group you belong to, you need to visit project page and change notification level there."
msgstr ""
+msgid "To start using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
+msgstr ""
+
msgid "To unsubscribe from this issue, please paste the following link into your browser:"
msgstr ""
@@ -35488,9 +35964,6 @@ msgstr ""
msgid "Unable to fetch branches list, please close the form and try again"
msgstr ""
-msgid "Unable to fetch unscanned projects"
-msgstr ""
-
msgid "Unable to fetch vulnerable projects"
msgstr ""
@@ -35545,6 +36018,15 @@ msgstr ""
msgid "Unable to update this issue at this time."
msgstr ""
+msgid "Unapprove a merge request"
+msgstr ""
+
+msgid "Unapprove the current merge request."
+msgstr ""
+
+msgid "Unapproved the current merge request."
+msgstr ""
+
msgid "Unarchive project"
msgstr ""
@@ -35557,16 +36039,13 @@ msgstr ""
msgid "Unassigned"
msgstr ""
-msgid "Unauthenticated API request rate limit"
-msgstr ""
-
-msgid "Unauthenticated rate limit period in seconds"
+msgid "Unauthenticated API rate limit period in seconds"
msgstr ""
-msgid "Unauthenticated request rate limit"
+msgid "Unauthenticated requests"
msgstr ""
-msgid "Unauthenticated requests"
+msgid "Unauthenticated web rate limit period in seconds"
msgstr ""
msgid "Undo"
@@ -35668,18 +36147,6 @@ msgstr ""
msgid "Unresolved"
msgstr ""
-msgid "UnscannedProjects|15 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|30 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|5 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|60 or more days"
-msgstr ""
-
msgid "Unschedule job"
msgstr ""
@@ -35899,6 +36366,9 @@ msgstr ""
msgid "UsageQuota|%{help_link_start}Shared runners%{help_link_end} are disabled, so there are no limits set on pipeline usage"
msgstr ""
+msgid "UsageQuota|%{linkTitle} help link"
+msgstr ""
+
msgid "UsageQuota|%{percentageLeft} of purchased storage is available"
msgstr ""
@@ -35908,6 +36378,9 @@ msgstr ""
msgid "UsageQuota|Artifacts is a sum of build and pipeline artifacts."
msgstr ""
+msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
+msgstr ""
+
msgid "UsageQuota|Buy additional minutes"
msgstr ""
@@ -35917,9 +36390,21 @@ msgstr ""
msgid "UsageQuota|CI minutes usage by project"
msgstr ""
+msgid "UsageQuota|Code packages and container images."
+msgstr ""
+
msgid "UsageQuota|Current period usage"
msgstr ""
+msgid "UsageQuota|File attachments and smaller design graphics."
+msgstr ""
+
+msgid "UsageQuota|Git repository, managed by the Gitaly service."
+msgstr ""
+
+msgid "UsageQuota|Includes project registry, artifacts, packages, wiki, uploads and other items."
+msgstr ""
+
msgid "UsageQuota|Increase storage temporarily"
msgstr ""
@@ -35938,6 +36423,9 @@ msgstr ""
msgid "UsageQuota|Packages"
msgstr ""
+msgid "UsageQuota|Pipeline artifacts and job artifacts, created with CI/CD."
+msgstr ""
+
msgid "UsageQuota|Pipelines"
msgstr ""
@@ -35956,6 +36444,9 @@ msgstr ""
msgid "UsageQuota|Seats"
msgstr ""
+msgid "UsageQuota|Shared bits of code and text."
+msgstr ""
+
msgid "UsageQuota|Snippets"
msgstr ""
@@ -35965,6 +36456,12 @@ msgstr ""
msgid "UsageQuota|Storage"
msgstr ""
+msgid "UsageQuota|Storage type"
+msgstr ""
+
+msgid "UsageQuota|There is a known issue with Artifact storage where the total could be incorrect for some projects. More details and progress are available in %{warningLinkStart}the epic%{warningLinkEnd}."
+msgstr ""
+
msgid "UsageQuota|This is the total amount of storage used across your projects within this namespace."
msgstr ""
@@ -36004,6 +36501,9 @@ msgstr ""
msgid "UsageQuota|Usage"
msgstr ""
+msgid "UsageQuota|Usage Breakdown"
+msgstr ""
+
msgid "UsageQuota|Usage Quotas"
msgstr ""
@@ -36028,6 +36528,9 @@ msgstr ""
msgid "UsageQuota|Wiki"
msgstr ""
+msgid "UsageQuota|Wiki content."
+msgstr ""
+
msgid "UsageQuota|Wikis"
msgstr ""
@@ -36244,7 +36747,10 @@ msgstr ""
msgid "User Settings"
msgstr ""
-msgid "User and IP Rate Limits"
+msgid "User and IP rate limits"
+msgstr ""
+
+msgid "User does not have a pending request"
msgstr ""
msgid "User identity was successfully created."
@@ -36541,6 +37047,9 @@ msgstr ""
msgid "Users can launch a development environment from a GitLab browser tab when the %{linkStart}Gitpod%{linkEnd} integration is enabled."
msgstr ""
+msgid "Users can reactivate their account by signing in."
+msgstr ""
+
msgid "Users can render diagrams in AsciiDoc, Markdown, reStructuredText, and Textile documents using Kroki."
msgstr ""
@@ -36556,6 +37065,9 @@ msgstr ""
msgid "Users requesting access to"
msgstr ""
+msgid "Users to exclude from the rate limit"
+msgstr ""
+
msgid "Users were successfully added."
msgstr ""
@@ -36577,6 +37089,9 @@ msgstr ""
msgid "UsersSelect|Unassigned"
msgstr ""
+msgid "Uses GitLab as a lightweight alternative to Sentry."
+msgstr ""
+
msgid "Using %{code_start}::%{code_end} denotes a %{link_start}scoped label set%{link_end}"
msgstr ""
@@ -36607,10 +37122,7 @@ msgstr ""
msgid "Value Stream Analytics can help you determine your team’s velocity"
msgstr ""
-msgid "Value Stream Analytics gives an overview of how much time it takes to go from idea to production in your project."
-msgstr ""
-
-msgid "Value may contain a variable reference"
+msgid "Value might contain a variable reference"
msgstr ""
msgid "Value stream"
@@ -36676,10 +37188,10 @@ msgstr ""
msgid "ValueStream|The Default Value Stream cannot be deleted"
msgstr ""
-msgid "Variable"
+msgid "Values that contain the %{codeStart}$%{codeEnd} character can be considered a variable reference and expanded. %{docsLinkStart}Learn more.%{docsLinkEnd}"
msgstr ""
-msgid "Variable references indicated by %{codeStart}$%{codeEnd} may be expanded. If this is not what you want, consider %{docsLinkStart}using a workaround to prevent expansion%{docsLinkEnd}."
+msgid "Variable"
msgstr ""
msgid "Variable will be masked in job logs."
@@ -37081,6 +37593,9 @@ msgstr ""
msgid "Vulnerability|Evidence"
msgstr ""
+msgid "Vulnerability|False positive detected"
+msgstr ""
+
msgid "Vulnerability|File"
msgstr ""
@@ -37123,6 +37638,9 @@ msgstr ""
msgid "Vulnerability|Status"
msgstr ""
+msgid "Vulnerability|The scanner determined this vulnerability to be a false positive. Verify the evaluation before changing its status. %{linkStart}Learn more about false positive detection.%{linkEnd}"
+msgstr ""
+
msgid "Vulnerability|The unmodified response is the original response that had no mutations done to the request"
msgstr ""
@@ -37447,9 +37965,6 @@ msgstr ""
msgid "Welcome to GitLab,%{br_tag}%{name}!"
msgstr ""
-msgid "Welcome to the guided GitLab tour"
-msgstr ""
-
msgid "Welcome, %{name}!"
msgstr ""
@@ -37468,9 +37983,6 @@ msgstr ""
msgid "What are you searching for?"
msgstr ""
-msgid "What describes you best?"
-msgstr ""
-
msgid "What does this command do?"
msgstr ""
@@ -37492,13 +38004,13 @@ msgstr ""
msgid "What is your job title? (optional)"
msgstr ""
-msgid "What will you use this group for?"
+msgid "What templates can I create?"
msgstr ""
-msgid "What's new"
+msgid "What will you use this group for?"
msgstr ""
-msgid "What’s your experience level?"
+msgid "What's new"
msgstr ""
msgid "When a deployment job is successful, skip older deployment jobs that are still pending."
@@ -37510,6 +38022,9 @@ msgstr ""
msgid "When an event in GitLab triggers a webhook, you can use the request details to figure out if something went wrong."
msgstr ""
+msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+msgstr ""
+
msgid "When inactive, an external authentication provider must be used."
msgstr ""
@@ -37532,6 +38047,9 @@ msgstr ""
msgid "When:"
msgstr ""
+msgid "Which API requests are affected?"
+msgstr ""
+
msgid "While it's rare to have no vulnerabilities, it can happen. In any event, we ask that you please double check your settings to make sure you've set up your dashboard correctly."
msgstr ""
@@ -37811,6 +38329,9 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|Work Items"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -37886,6 +38407,9 @@ msgstr ""
msgid "You are already a member of this %{member_source}."
msgstr ""
+msgid "You are already impersonating another user"
+msgstr ""
+
msgid "You are an admin, which means granting access to %{client_name} will allow them to interact with GitLab as an admin as well. Proceed with caution."
msgstr ""
@@ -37988,6 +38512,9 @@ msgstr ""
msgid "You can also use project access tokens with Git to authenticate over HTTP(S). %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "You can always change your URL later"
+msgstr ""
+
msgid "You can always edit this later"
msgstr ""
@@ -38144,10 +38671,10 @@ msgstr ""
msgid "You can’t %{tag_start}edit%{tag_end} files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
-msgid "You could not create a new trigger."
+msgid "You can’t edit files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
-msgid "You didn't renew your subscription for %{strong}%{namespace_name}%{strong_close} so it was downgraded to the free plan."
+msgid "You could not create a new trigger."
msgstr ""
msgid "You do not have any subscriptions yet"
@@ -38315,6 +38842,12 @@ msgstr ""
msgid "You must provide your current password in order to change it."
msgstr ""
+msgid "You must sign in to search for specific projects."
+msgstr ""
+
+msgid "You must sign in to search for specific terms."
+msgstr ""
+
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
@@ -38342,6 +38875,9 @@ msgstr ""
msgid "You need to upload a GitLab project export archive (ending in .gz)."
msgstr ""
+msgid "You need to verify your primary email first before enabling Two-Factor Authentication."
+msgstr ""
+
msgid "You successfully declined the invitation"
msgstr ""
@@ -38450,10 +38986,10 @@ msgstr ""
msgid "Your %{host} account was signed in to from a new location"
msgstr ""
-msgid "Your %{strong}%{plan_name}%{strong_close} subscription for %{strong}%{namespace_name}%{strong_close} will expire on %{strong}%{expires_on}%{strong_close}."
+msgid "Your %{strong}%{plan_name}%{strong_close} subscription expires on %{strong}%{expires_on}%{strong_close}. After that date, you cannot create issues or merge requests, or use many other features."
msgstr ""
-msgid "Your %{strong}%{plan_name}%{strong_close} subscription will expire on %{strong}%{expires_on}%{strong_close}. After that, you will not be able to create issues or merge requests as well as many other features."
+msgid "Your %{strong}%{plan_name}%{strong_close} subscription for %{strong}%{namespace_name}%{strong_close} will expire on %{strong}%{expires_on}%{strong_close}."
msgstr ""
msgid "Your CI/CD configuration syntax is invalid. View Lint tab for more details."
@@ -38477,7 +39013,7 @@ msgstr ""
msgid "Your GPG keys (%{count})"
msgstr ""
-msgid "Your GitLab account has been locked due to an excessive amount of unsuccessful sign in attempts. Your account will automatically unlock in %{duration} or you may click the link below to unlock now."
+msgid "Your GitLab account has been locked due to an excessive number of unsuccessful sign in attempts. You can wait for your account to automatically unlock in %{duration} or you can click the link below to unlock now."
msgstr ""
msgid "Your GitLab account request has been approved!"
@@ -38588,6 +39124,9 @@ msgstr ""
msgid "Your commit email is used for web based operations, such as edits and merges."
msgstr ""
+msgid "Your current password is required to register a two-factor authenticator app."
+msgstr ""
+
msgid "Your dashboard has been copied. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
@@ -38687,6 +39226,9 @@ msgstr ""
msgid "Your project limit is %{limit} projects! Please contact your administrator to increase it"
msgstr ""
+msgid "Your project will be created at:"
+msgstr ""
+
msgid "Your projects"
msgstr ""
@@ -38726,11 +39268,9 @@ msgstr ""
msgid "Your subscription expired!"
msgstr ""
-msgid "Your subscription has been downgraded."
-msgstr ""
-
-msgid "Your subscription will expire in %{remaining_days}."
-msgstr ""
+msgid "Your subscription will expire in %{remaining_days} day."
+msgid_plural "Your subscription will expire in %{remaining_days} days."
+msgstr[0] ""
msgid "Your username is %{username}."
msgstr ""
@@ -38935,6 +39475,9 @@ msgstr ""
msgid "cannot merge"
msgstr ""
+msgid "cannot not be used for user namespace"
+msgstr ""
+
msgid "ciReport|%{degradedNum} degraded"
msgstr ""
@@ -39257,6 +39800,9 @@ msgstr ""
msgid "created %{timeAgo}"
msgstr ""
+msgid "created %{timeAgo} by %{author}"
+msgstr ""
+
msgid "created by"
msgstr ""
@@ -39300,9 +39846,6 @@ msgstr ""
msgid "does not have a supported extension. Only %{extension_list} are supported"
msgstr ""
-msgid "domain is not authorized for sign-up."
-msgstr ""
-
msgid "download it"
msgstr ""
@@ -39319,17 +39862,13 @@ msgstr ""
msgid "email '%{email}' is not a verified email."
msgstr ""
-msgid "email does not match the allowed domain of %{email_domains}"
-msgid_plural "email does not match the allowed domains: %{email_domains}"
-msgstr[0] ""
-
msgid "enabled"
msgstr ""
msgid "encrypted: needs to be a :required, :optional or :migrating!"
msgstr ""
-msgid "ending with MIME type format is not allowed."
+msgid "ending with a reserved file extension is not allowed."
msgstr ""
msgid "entries cannot be larger than 255 characters"
@@ -39353,6 +39892,9 @@ msgstr ""
msgid "estimateCommand|%{slash_command} overwrites the total estimated time."
msgstr ""
+msgid "example.com"
+msgstr ""
+
msgid "exceeds the limit of %{bytes} bytes"
msgstr ""
@@ -39402,9 +39944,6 @@ msgstr ""
msgid "fork"
msgstr ""
-msgid "fork this project"
-msgstr ""
-
msgid "from"
msgstr ""
@@ -39412,6 +39951,9 @@ msgid "from %d job"
msgid_plural "from %d jobs"
msgstr[0] ""
+msgid "frontmatter"
+msgstr ""
+
msgid "group"
msgstr ""
@@ -39439,6 +39981,9 @@ msgstr ""
msgid "has been completed."
msgstr ""
+msgid "has too deep level of nesting"
+msgstr ""
+
msgid "help"
msgstr ""
@@ -39472,9 +40017,21 @@ msgstr ""
msgid "in"
msgstr ""
+msgid "in Infrastructure :: Kubernetes clusters"
+msgstr ""
+
+msgid "in all GitLab"
+msgstr ""
+
+msgid "in group"
+msgstr ""
+
msgid "in group %{link_to_group}"
msgstr ""
+msgid "in project"
+msgstr ""
+
msgid "in project %{link_to_project}"
msgstr ""
@@ -39515,16 +40072,19 @@ msgstr ""
msgid "is not a valid X509 certificate."
msgstr ""
-msgid "is not allowed since the group is not top-level group."
+msgid "is not allowed for sign-up."
msgstr ""
-msgid "is not allowed. Try again with a different email address, or contact your GitLab admin."
+msgid "is not allowed for this group."
msgstr ""
-msgid "is not allowed. We do not currently support project-level iterations"
+msgid "is not allowed for this project."
+msgstr ""
+
+msgid "is not allowed since the group is not top-level group."
msgstr ""
-msgid "is not from an allowed domain."
+msgid "is not allowed. We do not currently support project-level iterations"
msgstr ""
msgid "is not in the group enforcing Group Managed Account"
@@ -39617,6 +40177,9 @@ msgstr ""
msgid "log in"
msgstr ""
+msgid "managed"
+msgstr ""
+
msgid "manual"
msgstr ""
@@ -39663,6 +40226,9 @@ msgstr ""
msgid "mrWidget| Please restore it or use a different %{missingBranchName} branch"
msgstr ""
+msgid "mrWidget|%{linkStart}Set up now%{linkEnd} to analyze your source code for known security vulnerabilities."
+msgstr ""
+
msgid "mrWidget|%{mergeError}."
msgstr ""
@@ -39742,6 +40308,9 @@ msgid "mrWidget|Closes issue"
msgid_plural "mrWidget|Closes issues"
msgstr[0] ""
+msgid "mrWidget|Create issue to resolve all threads"
+msgstr ""
+
msgid "mrWidget|Delete source branch"
msgstr ""
@@ -39751,12 +40320,18 @@ msgstr ""
msgid "mrWidget|Did not close"
msgstr ""
+msgid "mrWidget|Dismiss"
+msgstr ""
+
msgid "mrWidget|Email patches"
msgstr ""
msgid "mrWidget|Failed to load deployment statistics"
msgstr ""
+msgid "mrWidget|Hide %{widget} details"
+msgstr ""
+
msgid "mrWidget|If the %{missingBranchName} branch exists in your local repository, you can merge this merge request manually using the command line"
msgstr ""
@@ -39851,9 +40426,6 @@ msgstr ""
msgid "mrWidget|Request to merge"
msgstr ""
-msgid "mrWidget|Resolve all threads in new issue"
-msgstr ""
-
msgid "mrWidget|Resolve conflicts"
msgstr ""
@@ -39869,6 +40441,9 @@ msgstr ""
msgid "mrWidget|Revoke approval"
msgstr ""
+msgid "mrWidget|SAST and Secret Detection is not enabled."
+msgstr ""
+
msgid "mrWidget|Set by %{merge_author} to be added to the merge train when the pipeline succeeds"
msgstr ""
@@ -39878,6 +40453,9 @@ msgstr ""
msgid "mrWidget|Set by %{merge_author} to start a merge train when the pipeline succeeds"
msgstr ""
+msgid "mrWidget|Show %{widget} details"
+msgstr ""
+
msgid "mrWidget|The changes were merged into"
msgstr ""
@@ -39890,6 +40468,9 @@ msgstr ""
msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure, or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
msgstr ""
+msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure."
+msgstr ""
+
msgid "mrWidget|The source branch has been deleted"
msgstr ""
@@ -39932,6 +40513,9 @@ msgstr ""
msgid "mrWidget|You can merge after removing denied licenses"
msgstr ""
+msgid "mrWidget|You can only merge once this merge request is approved."
+msgstr ""
+
msgid "mrWidget|Your password"
msgstr ""
@@ -39968,6 +40552,9 @@ msgstr ""
msgid "must be less than the limit of %{tag_limit} tags"
msgstr ""
+msgid "must be set for a project namespace"
+msgstr ""
+
msgid "must be unique by status and elapsed time within a policy"
msgstr ""
@@ -40075,6 +40662,9 @@ msgstr ""
msgid "pipeline"
msgstr ""
+msgid "pipeline schedules documentation"
+msgstr ""
+
msgid "pod_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
msgstr ""
@@ -40122,16 +40712,25 @@ msgstr ""
msgid "project name"
msgstr ""
+msgid "project namespace cannot be the parent of another namespace"
+msgstr ""
+
msgid "projects"
msgstr ""
msgid "quick actions"
msgstr ""
-msgid "reCAPTCHA Private Key"
+msgid "reCAPTCHA"
+msgstr ""
+
+msgid "reCAPTCHA helps prevent credential stuffing."
msgstr ""
-msgid "reCAPTCHA Site Key"
+msgid "reCAPTCHA private key"
+msgstr ""
+
+msgid "reCAPTCHA site key"
msgstr ""
msgid "recent activity"
@@ -40357,6 +40956,9 @@ msgstr ""
msgid "user avatar"
msgstr ""
+msgid "user namespace cannot be the parent of another namespace"
+msgstr ""
+
msgid "user preferences"
msgstr ""
@@ -40448,3 +41050,9 @@ msgstr ""
msgid "your settings"
msgstr ""
+msgid "{group}"
+msgstr ""
+
+msgid "{project}"
+msgstr ""
+
diff --git a/locale/is_IS/gitlab.po b/locale/is_IS/gitlab.po
index 91986148ea0..d35fb042464 100644
--- a/locale/is_IS/gitlab.po
+++ b/locale/is_IS/gitlab.po
@@ -14,10 +14,7 @@ msgstr ""
"X-Crowdin-Language: is\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-09-01 22:30\n"
-
-msgid " %{name}, confirm your email address now! "
-msgstr ""
+"PO-Revision-Date: 2021-10-04 20:18\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -92,6 +89,16 @@ msgstr ""
msgid "#general, #development"
msgstr ""
+msgid "%d Alert"
+msgid_plural "%d Alerts"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d Alert:"
+msgid_plural "%d Alerts:"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d Approval"
msgid_plural "%d Approvals"
msgstr[0] ""
@@ -455,7 +462,10 @@ msgstr ""
msgid "%{code_open}Protected:%{code_close} Only exposed to protected branches or tags."
msgstr ""
-msgid "%{commit_author_link} authored %{commit_timeago}"
+msgid "%{commit_author_link} authored %{commit_authored_timeago}"
+msgstr ""
+
+msgid "%{commit_author_link} authored %{commit_authored_timeago} and %{commit_committer_avatar} %{commit_committer_link} committed %{commit_committer_timeago}"
msgstr ""
msgid "%{completedCount} completed weight"
@@ -549,6 +559,15 @@ msgstr ""
msgid "%{doc_link_start}Advanced search%{doc_link_end} is enabled."
msgstr ""
+msgid "%{docs_link_start}Learn about visibility levels.%{docs_link_end}"
+msgstr ""
+
+msgid "%{docs_link_start}What is Large File Storage?%{docs_link_end}"
+msgstr ""
+
+msgid "%{docs_link_start}What is two-factor authentication?%{docs_link_end}"
+msgstr ""
+
msgid "%{due_date} (Past due)"
msgstr ""
@@ -621,9 +640,6 @@ msgstr ""
msgid "%{issueType} actions"
msgstr ""
-msgid "%{issuesCount} issues with a limit of %{maxIssueCount}"
-msgstr ""
-
msgid "%{issuesSize} with a limit of %{maxIssueCount}"
msgstr ""
@@ -681,6 +697,12 @@ msgstr ""
msgid "%{label_for_message} unavailable"
msgstr ""
+msgid "%{learn_more_link}."
+msgstr ""
+
+msgid "%{lessThan} 1 hour"
+msgstr ""
+
msgid "%{lets_encrypt_link_start}Let's Encrypt%{lets_encrypt_link_end} is a free, automated, and open certificate authority (CA) that issues digital certificates to enable HTTPS (SSL/TLS) for sites."
msgstr ""
@@ -693,15 +715,15 @@ msgstr ""
msgid "%{link_start}Learn more%{link_end} about roles."
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
-msgstr ""
-
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
msgstr ""
msgid "%{link_start}Start the title with %{draft_snippet}%{link_end} to prevent a merge request that is a work in progress from being merged before it's ready."
msgstr ""
+msgid "%{link_start}What information does GitLab Inc. collect?%{link_end}"
+msgstr ""
+
msgid "%{listToShow}, and %{awardsListLength} more"
msgstr ""
@@ -854,7 +876,7 @@ msgid_plural "%{securityScanner} results are not available because a pipeline ha
msgstr[0] ""
msgstr[1] ""
-msgid "%{service_ping_link_start}Learn more%{service_ping_link_end} about what information is shared with GitLab Inc."
+msgid "%{service_ping_link_start}What information is shared with GitLab Inc.?%{service_ping_link_end}"
msgstr ""
msgid "%{size} %{unit}"
@@ -890,6 +912,9 @@ msgstr ""
msgid "%{state} epics"
msgstr ""
+msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
+msgstr ""
+
msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
msgstr ""
@@ -949,11 +974,6 @@ msgstr ""
msgid "%{template_project_id} is unknown or invalid"
msgstr ""
-msgid "%{text} %{files}"
-msgid_plural "%{text} %{files} files"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%{text} is available"
msgstr ""
@@ -1038,9 +1058,6 @@ msgstr ""
msgid "%{wildcards_link_start}Wildcards%{wildcards_link_end} such as %{code_tag_start}v*%{code_tag_end} or %{code_tag_start}*-release%{code_tag_end} are supported."
msgstr ""
-msgid "&lt; 1 hour"
-msgstr ""
-
msgid "'%{data}' at %{location} does not match format: %{format}"
msgstr ""
@@ -1124,9 +1141,6 @@ msgstr ""
msgid "(we need your current password to confirm your changes)"
msgstr ""
-msgid "* * * * *"
-msgstr ""
-
msgid "+ %{amount} more"
msgstr ""
@@ -1193,10 +1207,10 @@ msgstr ""
msgid "."
msgstr ""
-msgid "0 bytes"
+msgid "/"
msgstr ""
-msgid "0 for unlimited, only effective with remote storage enabled."
+msgid "0 bytes"
msgstr ""
msgid "0t1DgySidms"
@@ -1326,6 +1340,9 @@ msgstr ""
msgid "1000+"
msgstr ""
+msgid "192.168.0.0/24"
+msgstr ""
+
msgid "1st contribution!"
msgstr ""
@@ -1479,9 +1496,6 @@ msgstr ""
msgid "A plain HTML site that uses Netlify for CI/CD instead of GitLab, but still with all the other great GitLab features"
msgstr ""
-msgid "A plain-text response to show to clients that hit the rate limit."
-msgstr ""
-
msgid "A platform value can be web, mob or app."
msgstr ""
@@ -1563,7 +1577,7 @@ msgstr ""
msgid "APIFuzzing|Configure HTTP basic authentication values. Other authentication methods are supported. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
+msgid "APIFuzzing|Customize your project's API fuzzing configuration options and copy the code snippet to your .gitlab-ci.yml file to apply any changes. Note that this tool does not reflect or update your .gitlab-ci.yml file automatically. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
msgstr ""
msgid "APIFuzzing|Enable authentication"
@@ -1626,9 +1640,6 @@ msgstr ""
msgid "APIFuzzing|To prevent a security leak, authentication info must be added as a %{ciVariablesLinkStart}CI variable%{ciVariablesLinkEnd}. As a user with maintainer access rights, you can manage CI variables in the %{ciSettingsLinkStart}Settings%{ciSettingsLinkEnd} area."
msgstr ""
-msgid "APIFuzzing|Use this tool to generate API fuzzing configuration YAML to copy into your .gitlab-ci.yml file. This tool does not reflect or update your .gitlab-ci.yml file automatically."
-msgstr ""
-
msgid "APIFuzzing|Username for basic authentication"
msgstr ""
@@ -1680,9 +1691,6 @@ msgstr ""
msgid "Abuse reports notification email"
msgstr ""
-msgid "Abuse reports will be sent to this address if it is set. Abuse reports are always available in the admin area."
-msgstr ""
-
msgid "Accept invitation"
msgstr ""
@@ -1719,12 +1727,18 @@ msgstr ""
msgid "Access granted"
msgstr ""
+msgid "Access key ID"
+msgstr ""
+
msgid "Access requests"
msgstr ""
msgid "Access to '%{classification_label}' not allowed"
msgstr ""
+msgid "Access tokens expire after 2 hours. A refresh token may be used at any time to generate a new access token. Non-expiring access tokens are deprecated. Clear this setting to enable backward compatibility."
+msgstr ""
+
msgid "AccessDropdown|Deploy Keys"
msgstr ""
@@ -2037,6 +2051,9 @@ msgstr ""
msgid "Add new directory"
msgstr ""
+msgid "Add new service account"
+msgstr ""
+
msgid "Add or remove previously merged commits"
msgstr ""
@@ -2274,6 +2291,9 @@ msgstr ""
msgid "AdminArea|Features"
msgstr ""
+msgid "AdminArea|Get security updates from GitLab and stay up to date"
+msgstr ""
+
msgid "AdminArea|Groups"
msgstr ""
@@ -2313,6 +2333,12 @@ msgstr ""
msgid "AdminArea|Reporter"
msgstr ""
+msgid "AdminArea|Sign up for the GitLab Security Newsletter to get notified for security updates."
+msgstr ""
+
+msgid "AdminArea|Sign up for the GitLab newsletter"
+msgstr ""
+
msgid "AdminArea|Stop all jobs"
msgstr ""
@@ -2382,9 +2408,15 @@ msgstr ""
msgid "AdminSettings|Disable public access to Pages sites"
msgstr ""
+msgid "AdminSettings|Display a banner on merge requests in projects with no pipelines to initiate steps to add a .gitlab-ci.yml file."
+msgstr ""
+
msgid "AdminSettings|Domain verification is an essential security measure for public GitLab sites. Users are required to demonstrate they control a domain before it is enabled. %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "AdminSettings|Enable pipeline suggestion banner"
+msgstr ""
+
msgid "AdminSettings|Enable shared runners for new projects"
msgstr ""
@@ -2856,10 +2888,10 @@ msgstr ""
msgid "Admin|Quarterly reconciliation will occur on %{qrtlyDate}"
msgstr ""
-msgid "Admin|The number of max seats used for your namespace is currently exceeding the number of seats in your subscription. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgid "Admin|The number of max seats in your namespace exceeds the number of seats in your subscription. On %{qrtlyDate}, quarterly reconciliation occurs and you are automatically billed a prorated amount for the overage. No action is needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice. For more information about the timing of the invoicing process, view the documentation."
msgstr ""
-msgid "Admin|The number of maximum users for your instance is currently exceeding the number of users in license. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgid "Admin|The number of max users in your instance exceeds the number of users in your license. On %{qrtlyDate}, quarterly reconciliation occurs and you are automatically billed a prorated amount for the overage. No action is needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice. For more information about the timing of the invoicing process, view the documentation."
msgstr ""
msgid "Admin|View pending user approvals"
@@ -2880,9 +2912,6 @@ msgstr ""
msgid "Advanced export options"
msgstr ""
-msgid "Advanced permissions, Large File Storage and Two-Factor authentication settings."
-msgstr ""
-
msgid "After a successful password update you will be redirected to login screen."
msgstr ""
@@ -2901,13 +2930,14 @@ msgstr ""
msgid "After you've reviewed these contribution guidelines, you'll be all set to"
msgstr ""
+msgid "Akismet"
+msgstr ""
+
msgid "Akismet API Key"
msgstr ""
-msgid "Alert"
-msgid_plural "Alerts"
-msgstr[0] ""
-msgstr[1] ""
+msgid "Akismet helps prevent the creation of spam issues in public projects."
+msgstr ""
msgid "AlertManagement|Acknowledged"
msgstr ""
@@ -3263,6 +3293,9 @@ msgstr ""
msgid "All (default)"
msgstr ""
+msgid "All GitLab"
+msgstr ""
+
msgid "All Members"
msgstr ""
@@ -3377,6 +3410,9 @@ msgstr ""
msgid "Allow this secondary node to replicate content on Object Storage"
msgstr ""
+msgid "Allow use of licensed EE features"
+msgstr ""
+
msgid "Allow users to dismiss the broadcast message"
msgstr ""
@@ -3452,9 +3488,6 @@ msgstr ""
msgid "Amazon authentication is not %{link_start}correctly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
-msgid "Amount of time (in hours) that users are allowed to skip forced configuration of two-factor authentication"
-msgstr ""
-
msgid "An %{link_start}alert%{link_end} with the same fingerprint is already open. To change the status of this alert, resolve the linked alert."
msgstr ""
@@ -3515,12 +3548,6 @@ msgstr ""
msgid "An error occurred when removing the label."
msgstr ""
-msgid "An error occurred when toggling the notification subscription"
-msgstr ""
-
-msgid "An error occurred when updating the issue weight"
-msgstr ""
-
msgid "An error occurred when updating the title"
msgstr ""
@@ -3569,6 +3596,9 @@ msgstr ""
msgid "An error occurred while enabling Service Desk."
msgstr ""
+msgid "An error occurred while fetching Markdown preview"
+msgstr ""
+
msgid "An error occurred while fetching ancestors"
msgstr ""
@@ -3599,9 +3629,6 @@ msgstr ""
msgid "An error occurred while fetching label colors."
msgstr ""
-msgid "An error occurred while fetching markdown preview"
-msgstr ""
-
msgid "An error occurred while fetching participants"
msgstr ""
@@ -3617,9 +3644,6 @@ msgstr ""
msgid "An error occurred while fetching reference"
msgstr ""
-msgid "An error occurred while fetching sidebar data"
-msgstr ""
-
msgid "An error occurred while fetching tags. Retry the search."
msgstr ""
@@ -3695,6 +3719,9 @@ msgstr ""
msgid "An error occurred while loading merge requests."
msgstr ""
+msgid "An error occurred while loading projects."
+msgstr ""
+
msgid "An error occurred while loading the Needs tab."
msgstr ""
@@ -3929,12 +3956,6 @@ msgstr ""
msgid "Any Milestone"
msgstr ""
-msgid "Any branch"
-msgstr ""
-
-msgid "Any eligible user"
-msgstr ""
-
msgid "Any encrypted tokens"
msgstr ""
@@ -3953,6 +3974,9 @@ msgstr ""
msgid "Any namespace"
msgstr ""
+msgid "App Engine description and apps that are suitable for this deployment target"
+msgstr ""
+
msgid "App ID"
msgstr ""
@@ -4101,6 +4125,11 @@ msgstr ""
msgid "Apply"
msgstr ""
+msgid "Apply %d suggestion"
+msgid_plural "Apply %d suggestions"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Apply a label"
msgstr ""
@@ -4110,13 +4139,10 @@ msgstr ""
msgid "Apply suggestion"
msgstr ""
-msgid "Apply suggestions"
-msgstr ""
-
msgid "Apply template"
msgstr ""
-msgid "Apply this approval rule to any branch or a specific protected branch."
+msgid "Apply this approval rule to all branches or a specific protected branch."
msgstr ""
msgid "Applying"
@@ -4259,9 +4285,6 @@ msgstr ""
msgid "ApprovalSettings|Prevent editing approval rules in projects and merge requests."
msgstr ""
-msgid "ApprovalSettings|Prevent editing approval rules in projects and merge requests. "
-msgstr ""
-
msgid "ApprovalSettings|Remove all approvals when commits are added to the source branch."
msgstr ""
@@ -4277,6 +4300,9 @@ msgstr ""
msgid "ApprovalSettings|This setting is configured at the instance level and can only be changed by an administrator."
msgstr ""
+msgid "ApprovalSettings|This setting is configured in %{groupName} and can only be changed by an administrator or group owner."
+msgstr ""
+
msgid "ApprovalStatusTooltip|Adheres to separation of duties"
msgstr ""
@@ -4763,9 +4789,6 @@ msgstr ""
msgid "Authenticated API rate limit period in seconds"
msgstr ""
-msgid "Authenticated API request rate limit"
-msgstr ""
-
msgid "Authenticated API requests"
msgstr ""
@@ -4775,10 +4798,10 @@ msgstr ""
msgid "Authenticated Git LFS request rate limit"
msgstr ""
-msgid "Authenticated web rate limit period in seconds"
+msgid "Authenticated Git LFS requests"
msgstr ""
-msgid "Authenticated web request rate limit"
+msgid "Authenticated web rate limit period in seconds"
msgstr ""
msgid "Authenticated web requests"
@@ -5156,9 +5179,6 @@ msgstr ""
msgid "Below you will find all the groups that are public."
msgstr ""
-msgid "Beta"
-msgstr ""
-
msgid "Bi-weekly code coverage"
msgstr ""
@@ -5398,6 +5418,21 @@ msgstr ""
msgid "Board scope affects which issues are displayed for anyone who visits this board"
msgstr ""
+msgid "BoardNewEpic|Groups"
+msgstr ""
+
+msgid "BoardNewEpic|Loading groups"
+msgstr ""
+
+msgid "BoardNewEpic|No matching results"
+msgstr ""
+
+msgid "BoardNewEpic|Search groups"
+msgstr ""
+
+msgid "BoardNewEpic|Select a group"
+msgstr ""
+
msgid "BoardNewIssue|No matching results"
msgstr ""
@@ -5475,6 +5510,9 @@ msgstr ""
msgid "Boards|An error occurred while creating the list. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching child groups. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching group projects. Please try again."
msgstr ""
@@ -5807,6 +5845,9 @@ msgstr ""
msgid "Bulk update"
msgstr ""
+msgid "BulkImports|Re-import creates a new group. It does not sync with the existing group."
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -5816,6 +5857,9 @@ msgstr ""
msgid "BulkImport|From source group"
msgstr ""
+msgid "BulkImport|Group import history"
+msgstr ""
+
msgid "BulkImport|Import failed: Destination cannot be a subgroup of the source group. Change the destination and try again."
msgstr ""
@@ -5828,9 +5872,18 @@ msgstr ""
msgid "BulkImport|Importing the group failed"
msgstr ""
+msgid "BulkImport|Last imported to %{link}"
+msgstr ""
+
msgid "BulkImport|Name already exists."
msgstr ""
+msgid "BulkImport|New group"
+msgstr ""
+
+msgid "BulkImport|No history is available"
+msgstr ""
+
msgid "BulkImport|No parent"
msgstr ""
@@ -5843,6 +5896,9 @@ msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} matching filter \"%{filter}\" from %{link}"
msgstr ""
+msgid "BulkImport|Source group"
+msgstr ""
+
msgid "BulkImport|To new group"
msgstr ""
@@ -5852,6 +5908,9 @@ msgstr ""
msgid "BulkImport|You have no groups to import"
msgstr ""
+msgid "BulkImport|Your imported groups will appear here."
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -6094,6 +6153,9 @@ msgstr ""
msgid "Can be manually deployed to"
msgstr ""
+msgid "Can be overridden in each project."
+msgstr ""
+
msgid "Can create groups:"
msgstr ""
@@ -6196,6 +6258,9 @@ msgstr ""
msgid "Cancelling Preview"
msgstr ""
+msgid "Cannot assign a confidential epic to a non-confidential issue. Make the issue confidential and try again"
+msgstr ""
+
msgid "Cannot be assigned to other projects."
msgstr ""
@@ -6247,9 +6312,6 @@ msgstr ""
msgid "Cannot refer to a group %{timebox_type} by an internal id!"
msgstr ""
-msgid "Cannot set confidential epic for a non-confidential issue"
-msgstr ""
-
msgid "Cannot show preview. For previews on sketch files, they must have the file format introduced by Sketch version 43 and above."
msgstr ""
@@ -6487,15 +6549,15 @@ msgstr ""
msgid "Check out, review, and merge locally"
msgstr ""
-msgid "Check the %{docs_link_start}documentation%{docs_link_end}."
-msgstr ""
-
msgid "Check the current instance configuration "
msgstr ""
msgid "Check the elasticsearch.log file to debug why the migration was halted and make any changes before retrying the migration. When you fix the cause of the failure, click \"Retry migration\", and the migration will be scheduled to be retried in the background."
msgstr ""
+msgid "Check with your administrator."
+msgstr ""
+
msgid "Check your Docker images for known vulnerabilities."
msgstr ""
@@ -6526,6 +6588,9 @@ msgstr ""
msgid "Checkout"
msgstr ""
+msgid "Checkout|$%{selectedPlanPrice} per 10 GB storage per pack"
+msgstr ""
+
msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 minutes"
msgstr ""
@@ -6546,17 +6611,23 @@ msgstr ""
msgid "Checkout|%{name}'s GitLab subscription"
msgstr ""
-msgid "Checkout|%{selectedPlanText} plan"
+msgid "Checkout|%{name}'s storage subscription"
msgstr ""
-msgid "Checkout|%{startDate} - %{endDate}"
+msgid "Checkout|%{quantity} GB of storage"
msgstr ""
-msgid "Checkout|%{totalCiMinutes} CI minute"
-msgid_plural "Checkout|%{totalCiMinutes} CI minutes"
+msgid "Checkout|%{quantity} storage pack"
+msgid_plural "Checkout|%{quantity} storage packs"
msgstr[0] ""
msgstr[1] ""
+msgid "Checkout|%{selectedPlanText} plan"
+msgstr ""
+
+msgid "Checkout|%{startDate} - %{endDate}"
+msgstr ""
+
msgid "Checkout|%{totalCiMinutes} CI minutes"
msgstr ""
@@ -6632,6 +6703,9 @@ msgstr ""
msgid "Checkout|Failed to register credit card. Please try again."
msgstr ""
+msgid "Checkout|GB"
+msgstr ""
+
msgid "Checkout|GitLab group"
msgstr ""
@@ -6668,6 +6742,9 @@ msgstr ""
msgid "Checkout|State"
msgstr ""
+msgid "Checkout|Storage packs"
+msgstr ""
+
msgid "Checkout|Street address"
msgstr ""
@@ -6689,6 +6766,9 @@ msgstr ""
msgid "Checkout|Total minutes: %{quantity}"
msgstr ""
+msgid "Checkout|Total storage: %{quantity} GB"
+msgstr ""
+
msgid "Checkout|Users"
msgstr ""
@@ -6698,16 +6778,25 @@ msgstr ""
msgid "Checkout|Your organization"
msgstr ""
+msgid "Checkout|Your storage subscription has the same term as your main subscription, and the price is prorated accordingly."
+msgstr ""
+
msgid "Checkout|Your subscription will be applied to this group"
msgstr ""
msgid "Checkout|Zip code"
msgstr ""
+msgid "Checkout|a storage subscription"
+msgstr ""
+
msgid "Checkout|company or team"
msgstr ""
-msgid "Checkout|x 1,000 minutes per pack = %{strong}"
+msgid "Checkout|minutes"
+msgstr ""
+
+msgid "Checkout|x %{quantity} %{units} per pack ="
msgstr ""
msgid "Cherry-pick this commit"
@@ -7064,6 +7153,9 @@ msgstr ""
msgid "CloneIssue|Cannot clone issue to target project as it is pending deletion."
msgstr ""
+msgid "CloneIssue|Cannot clone issues of '%{issue_type}' type."
+msgstr ""
+
msgid "Cloned this issue to %{path_to_project}."
msgstr ""
@@ -7118,7 +7210,10 @@ msgstr ""
msgid "Closes this %{quick_action_target}."
msgstr ""
-msgid "Cloud licenses can not be removed."
+msgid "Cloud Functions description and apps that are suitable for this deployment target"
+msgstr ""
+
+msgid "Cloud Run description and apps that are suitable for this deployment target"
msgstr ""
msgid "Cluster"
@@ -7145,6 +7240,12 @@ msgstr ""
msgid "ClusterAgents|Access tokens"
msgstr ""
+msgid "ClusterAgents|Agent might not be connected to GitLab"
+msgstr ""
+
+msgid "ClusterAgents|Agent never connected to GitLab"
+msgstr ""
+
msgid "ClusterAgents|Alternative installation methods"
msgstr ""
@@ -7160,6 +7261,12 @@ msgstr ""
msgid "ClusterAgents|Configuration"
msgstr ""
+msgid "ClusterAgents|Connected"
+msgstr ""
+
+msgid "ClusterAgents|Connection status"
+msgstr ""
+
msgid "ClusterAgents|Copy token"
msgstr ""
@@ -7178,6 +7285,9 @@ msgstr ""
msgid "ClusterAgents|For alternative installation methods %{linkStart}go to the documentation%{linkEnd}."
msgstr ""
+msgid "ClusterAgents|For more troubleshooting information go to"
+msgstr ""
+
msgid "ClusterAgents|Go to the repository"
msgstr ""
@@ -7193,18 +7303,30 @@ msgstr ""
msgid "ClusterAgents|Integrate with the GitLab Agent"
msgstr ""
-msgid "ClusterAgents|Last used"
+msgid "ClusterAgents|Last connected %{timeAgo}."
+msgstr ""
+
+msgid "ClusterAgents|Last contact"
msgstr ""
msgid "ClusterAgents|Learn how to create an agent access token"
msgstr ""
+msgid "ClusterAgents|Make sure you are using a valid token."
+msgstr ""
+
msgid "ClusterAgents|Name"
msgstr ""
msgid "ClusterAgents|Never"
msgstr ""
+msgid "ClusterAgents|Never connected"
+msgstr ""
+
+msgid "ClusterAgents|Not connected"
+msgstr ""
+
msgid "ClusterAgents|Read more about getting started"
msgstr ""
@@ -7226,6 +7348,9 @@ msgstr ""
msgid "ClusterAgents|Select which Agent you want to install"
msgstr ""
+msgid "ClusterAgents|The Agent has not been connected in a long time. There might be a connectivity issue. Last contact was %{timeAgo}."
+msgstr ""
+
msgid "ClusterAgents|The GitLab Agent also requires %{linkStart}enabling the Agent Server%{linkEnd}"
msgstr ""
@@ -7253,9 +7378,6 @@ msgstr ""
msgid "ClusterAgents|You will need to create a token to connect to your agent"
msgstr ""
-msgid "ClusterAgent|This feature is only available for premium plans"
-msgstr ""
-
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -7445,9 +7567,6 @@ msgstr ""
msgid "ClusterIntegration|Create Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Create a provision role on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the account and external ID above. %{startMoreInfoLink}More information%{endLink}"
-msgstr ""
-
msgid "ClusterIntegration|Create cluster on"
msgstr ""
@@ -7880,7 +7999,7 @@ msgstr ""
msgid "ClusterIntegration|Subnets"
msgstr ""
-msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provisioned role, first create one on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the above account and external IDs. %{startMoreInfoLink}More information%{endLink}"
+msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provisioned role, first create one on %{awsLinkStart}Amazon Web Services %{awsLinkEnd} using the above account and external IDs. %{moreInfoStart}More information%{moreInfoEnd}"
msgstr ""
msgid "ClusterIntegration|The Kubernetes certificate used to authenticate to the cluster."
@@ -8114,6 +8233,9 @@ msgstr ""
msgid "Collapse replies"
msgstr ""
+msgid "Collapse settings section"
+msgstr ""
+
msgid "Collapse sidebar"
msgstr ""
@@ -8132,6 +8254,9 @@ msgstr ""
msgid "Comma-separated list of email addresses."
msgstr ""
+msgid "Comma-separated list of users allowed to exceed the rate limit."
+msgstr ""
+
msgid "Comma-separated, e.g. '1.1.1.1, 2.2.2.0/24'"
msgstr ""
@@ -8452,6 +8577,9 @@ msgstr ""
msgid "Configure %{repository_checks_link_start}repository checks%{link_end} and %{housekeeping_link_start}housekeeping%{link_end} on repositories."
msgstr ""
+msgid "Configure CAPTCHAs, IP address limits, and other anti-spam measures."
+msgstr ""
+
msgid "Configure Dependency Scanning in `.gitlab-ci.yml` using the GitLab managed template. You can [add variable overrides](https://docs.gitlab.com/ee/user/application_security/dependency_scanning/#customizing-the-dependency-scanning-settings) to customize Dependency Scanning settings."
msgstr ""
@@ -8488,16 +8616,13 @@ msgstr ""
msgid "Configure a %{codeStart}.gitlab-webide.yml%{codeEnd} file in the %{codeStart}.gitlab%{codeEnd} directory to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
msgstr ""
-msgid "Configure existing installation"
-msgstr ""
-
-msgid "Configure limit for notes created per minute by web and API requests."
+msgid "Configure advanced permissions, Large File Storage, and two-factor authentication settings."
msgstr ""
-msgid "Configure limits for Project/Group Import/Export."
+msgid "Configure approvals by authors and committers on all projects."
msgstr ""
-msgid "Configure limits for web and API requests."
+msgid "Configure existing installation"
msgstr ""
msgid "Configure paths to be protected by Rack Attack."
@@ -8512,10 +8637,13 @@ msgstr ""
msgid "Configure settings for Advanced Search with Elasticsearch."
msgstr ""
+msgid "Configure specific limits for Files API requests that supersede the general user and IP rate limits."
+msgstr ""
+
msgid "Configure specific limits for Git LFS requests that supersede the general user and IP rate limits."
msgstr ""
-msgid "Configure specific limits for Packages API requests that supersede the general user and IP rate limits."
+msgid "Configure specific limits for deprecated API requests that supersede the general user and IP rate limits."
msgstr ""
msgid "Configure the %{link} integration."
@@ -8527,6 +8655,9 @@ msgstr ""
msgid "Configure the way a user creates a new account."
msgstr ""
+msgid "Configure via Merge Request"
+msgstr ""
+
msgid "Configure which lists are shown for anyone who visits this board"
msgstr ""
@@ -8995,6 +9126,9 @@ msgstr ""
msgid "Content parsed with %{link}."
msgstr ""
+msgid "ContentEditor|Table of Contents"
+msgstr ""
+
msgid "ContentEditor|You have to provide a renderMarkdown function or a custom serializer"
msgstr ""
@@ -9181,6 +9315,9 @@ msgstr ""
msgid "Copy link to chart"
msgstr ""
+msgid "Copy prefix"
+msgstr ""
+
msgid "Copy reference"
msgstr ""
@@ -9211,6 +9348,9 @@ msgstr ""
msgid "Copy value"
msgstr ""
+msgid "Corpus Management"
+msgstr ""
+
msgid "Corpus Management|Are you sure you want to delete the corpus?"
msgstr ""
@@ -9439,6 +9579,9 @@ msgstr ""
msgid "Create commit"
msgstr ""
+msgid "Create common files more quickly, and standardize their format."
+msgstr ""
+
msgid "Create confidential merge request"
msgstr ""
@@ -9472,6 +9615,9 @@ msgstr ""
msgid "Create issue"
msgstr ""
+msgid "Create issue to resolve all threads"
+msgstr ""
+
msgid "Create iteration"
msgstr ""
@@ -9526,6 +9672,9 @@ msgstr ""
msgid "Create new..."
msgstr ""
+msgid "Create or import your first project"
+msgstr ""
+
msgid "Create project"
msgstr ""
@@ -9883,7 +10032,7 @@ msgstr ""
msgid "Custom notification events"
msgstr ""
-msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notificationLinkStart} notification emails%{notificationLinkEnd}."
+msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notificationLinkStart}notification emails%{notificationLinkEnd}."
msgstr ""
msgid "Custom project templates"
@@ -10082,10 +10231,10 @@ msgid_plural "CycleAnalytics|Showing %{subjectFilterText} and %{selectedLabelsCo
msgstr[0] ""
msgstr[1] ""
-msgid "CycleAnalytics|Showing data for group '%{groupName}' and %{selectedProjectCount} projects from %{startDate} to %{endDate}"
+msgid "CycleAnalytics|Showing data for group '%{groupName}' and %{selectedProjectCount} projects from %{createdAfter} to %{createdBefore}"
msgstr ""
-msgid "CycleAnalytics|Showing data for group '%{groupName}' from %{startDate} to %{endDate}"
+msgid "CycleAnalytics|Showing data for group '%{groupName}' from %{createdAfter} to %{createdBefore}"
msgstr ""
msgid "CycleAnalytics|Stages"
@@ -10319,6 +10468,9 @@ msgstr ""
msgid "DastProfiles|Manage profiles"
msgstr ""
+msgid "DastProfiles|Manage site profiles"
+msgstr ""
+
msgid "DastProfiles|Minimum = 0 (no timeout enabled), Maximum = 2880 minutes"
msgstr ""
@@ -10394,6 +10546,9 @@ msgstr ""
msgid "DastProfiles|Scanner name"
msgstr ""
+msgid "DastProfiles|Schedule"
+msgstr ""
+
msgid "DastProfiles|Select branch"
msgstr ""
@@ -10463,7 +10618,7 @@ msgstr ""
msgid "DastProfiles|Website"
msgstr ""
-msgid "DastProfiles|You can either choose a passive scan or validate the target site in your chosen site profile. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
+msgid "DastProfiles|You can either choose a passive scan or validate the target site from the site profile management page. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
msgstr ""
msgid "DastProfiles|You cannot run an active scan against an unvalidated site."
@@ -10636,7 +10791,7 @@ msgstr ""
msgid "Days to merge"
msgstr ""
-msgid "Deactivate dormant users after 90 days of inactivity. Users can return to active status by signing in to their account. While inactive, a user is not counted as an active user in the instance."
+msgid "Deactivate dormant users after 90 days of inactivity"
msgstr ""
msgid "Dear Administrator,"
@@ -10723,10 +10878,10 @@ msgstr ""
msgid "Define a custom pattern with cron syntax"
msgstr ""
-msgid "Define approval settings."
+msgid "Define approval rules."
msgstr ""
-msgid "Define approval settings. %{linkStart}Learn more.%{linkEnd}"
+msgid "Define approval rules. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "Define custom rules for what constitutes spam, independent of Akismet"
@@ -10735,7 +10890,7 @@ msgstr ""
msgid "Define environments in the deploy stage(s) in %{code_open}.gitlab-ci.yml%{code_close} to track deployments here."
msgstr ""
-msgid "Define how approval rules are applied as a merge request moves toward completion."
+msgid "Define how approval rules are applied to merge requests."
msgstr ""
msgid "Definition"
@@ -10750,6 +10905,12 @@ msgstr ""
msgid "DelayedJobs|Are you sure you want to run %{job_name} immediately? This job will run automatically after it's timer finishes."
msgstr ""
+msgid "DelayedJobs|Are you sure you want to run %{job_name} immediately? This job will run automatically after its timer finishes."
+msgstr ""
+
+msgid "DelayedJobs|Run the delayed job now?"
+msgstr ""
+
msgid "DelayedJobs|Start now"
msgstr ""
@@ -11026,6 +11187,12 @@ msgstr ""
msgid "Dependency proxy image prefix"
msgstr ""
+msgid "DependencyProxy|Create a local proxy for storing frequently used upstream images. %{docLinkStart}Learn more%{docLinkEnd} about dependency proxies."
+msgstr ""
+
+msgid "DependencyProxy|Dependency Proxy"
+msgstr ""
+
msgid "DependencyProxy|Toggle Dependency Proxy"
msgstr ""
@@ -11266,6 +11433,9 @@ msgstr ""
msgid "Deployments"
msgstr ""
+msgid "Deployments to Google Kubernetes Engine can be "
+msgstr ""
+
msgid "Deployments|%{deployments} environment impacted."
msgid_plural "Deployments|%{deployments} environments impacted."
msgstr[0] ""
@@ -11295,6 +11465,9 @@ msgstr ""
msgid "Deployment|success"
msgstr ""
+msgid "Deprecated API rate limits"
+msgstr ""
+
msgid "Deprioritize label"
msgstr ""
@@ -11697,6 +11870,16 @@ msgstr ""
msgid "DiffsCompareBaseBranch|(base)"
msgstr ""
+msgid "Diffs|%d addition"
+msgid_plural "Diffs|%d additions"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Diffs|%d deletion"
+msgid_plural "Diffs|%d deletions"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Diffs|No file name available"
msgstr ""
@@ -11706,9 +11889,17 @@ msgstr ""
msgid "Diffs|Show all unchanged lines"
msgstr ""
+msgid "Diffs|Showing %{dropdownStart}%{count} changed file%{dropdownEnd}"
+msgid_plural "Diffs|Showing %{dropdownStart}%{count} changed files%{dropdownEnd}"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Diffs|Something went wrong while fetching diff lines."
msgstr ""
+msgid "Diffs|with %{additions} and %{deletions}"
+msgstr ""
+
msgid "Direct member"
msgstr ""
@@ -11834,9 +12025,6 @@ msgid_plural "Dismiss %d selected vulnerabilities as"
msgstr[0] ""
msgstr[1] ""
-msgid "Dismiss Value Stream Analytics introduction box"
-msgstr ""
-
msgid "Dismiss merge request promotion"
msgstr ""
@@ -12158,6 +12346,9 @@ msgstr ""
msgid "Edit issues"
msgstr ""
+msgid "Edit merge requests"
+msgstr ""
+
msgid "Edit public deploy key"
msgstr ""
@@ -12233,6 +12424,9 @@ msgstr ""
msgid "Elastic|None. Select projects to index."
msgstr ""
+msgid "Eligible users"
+msgstr ""
+
msgid "Email"
msgstr ""
@@ -12362,6 +12556,9 @@ msgstr ""
msgid "Enable"
msgstr ""
+msgid "Enable Amazon EKS integration"
+msgstr ""
+
msgid "Enable Auto DevOps"
msgstr ""
@@ -12395,6 +12592,9 @@ msgstr ""
msgid "Enable SSL verification"
msgstr ""
+msgid "Enable Service Ping"
+msgstr ""
+
msgid "Enable Snowplow tracking"
msgstr ""
@@ -12425,6 +12625,9 @@ msgstr ""
msgid "Enable authenticated Git LFS request rate limit"
msgstr ""
+msgid "Enable authenticated web request rate limit"
+msgstr ""
+
msgid "Enable authentication"
msgstr ""
@@ -12485,7 +12688,7 @@ msgstr ""
msgid "Enable or disable the Pseudonymizer data collection."
msgstr ""
-msgid "Enable or disable version check and service ping."
+msgid "Enable or disable version check and Service Ping."
msgstr ""
msgid "Enable protected paths rate limit"
@@ -12497,18 +12700,12 @@ msgstr ""
msgid "Enable reCAPTCHA"
msgstr ""
-msgid "Enable reCAPTCHA for login"
-msgstr ""
-
-msgid "Enable reCAPTCHA, Invisible Captcha, Akismet and set IP limits. For reCAPTCHA, we currently only support %{recaptcha_v2_link_start}v2%{recaptcha_v2_link_end}"
+msgid "Enable reCAPTCHA for login."
msgstr ""
msgid "Enable repository checks"
msgstr ""
-msgid "Enable service ping"
-msgstr ""
-
msgid "Enable shared runners for all projects and subgroups in this group."
msgstr ""
@@ -12530,7 +12727,10 @@ msgstr ""
msgid "Enable unauthenticated API request rate limit"
msgstr ""
-msgid "Enable unauthenticated request rate limit"
+msgid "Enable unauthenticated web request rate limit"
+msgstr ""
+
+msgid "Enable user deactivation emails"
msgstr ""
msgid "Enable version check"
@@ -12566,9 +12766,6 @@ msgstr ""
msgid "Enabled sources for code import during project creation. OmniAuth must be configured for GitHub"
msgstr ""
-msgid "Enabling this will only make licensed EE features available to projects if the project namespace's plan includes the feature or if the project is public."
-msgstr ""
-
msgid "Encountered an error while rendering: %{err}"
msgstr ""
@@ -12617,9 +12814,6 @@ msgstr ""
msgid "Enter Admin Mode"
msgstr ""
-msgid "Enter IP address range"
-msgstr ""
-
msgid "Enter a number"
msgstr ""
@@ -12632,9 +12826,6 @@ msgstr ""
msgid "Enter at least three characters to search"
msgstr ""
-msgid "Enter domain"
-msgstr ""
-
msgid "Enter in your Bitbucket Server URL and personal access token below"
msgstr ""
@@ -12821,9 +13012,6 @@ msgstr ""
msgid "Environments|Deployment %{status}"
msgstr ""
-msgid "Environments|Dismiss"
-msgstr ""
-
msgid "Environments|Enable review app"
msgstr ""
@@ -12836,9 +13024,6 @@ msgstr ""
msgid "Environments|Environments are places where code gets deployed, such as staging or production."
msgstr ""
-msgid "Environments|Help us improve environments"
-msgstr ""
-
msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
msgstr ""
@@ -12875,6 +13060,9 @@ msgstr ""
msgid "Environments|Note that this action will stop the environment, but it will %{emphasisStart}not%{emphasisEnd} have an effect on any existing deployment due to no “stop environment action†being defined in the %{ciConfigLinkStart}.gitlab-ci.yml%{ciConfigLinkEnd} file."
msgstr ""
+msgid "Environments|Open"
+msgstr ""
+
msgid "Environments|Open live environment"
msgstr ""
@@ -12914,9 +13102,6 @@ msgstr ""
msgid "Environments|Stopping %{environmentName}"
msgstr ""
-msgid "Environments|Take the survey"
-msgstr ""
-
msgid "Environments|There was an error fetching the logs. Please try again."
msgstr ""
@@ -12938,9 +13123,6 @@ msgstr ""
msgid "Environments|You don't have any environments right now"
msgstr ""
-msgid "Environments|Your feedback helps GitLab make environments better for you and other users. Participate and enter a sweepstake to win a USD 30 gift card."
-msgstr ""
-
msgid "Environments|by %{avatar}"
msgstr ""
@@ -13223,7 +13405,7 @@ msgstr ""
msgid "Error parsing CSV file. Please make sure it has"
msgstr ""
-msgid "Error rendering markdown preview"
+msgid "Error rendering Markdown preview"
msgstr ""
msgid "Error saving label update."
@@ -13271,6 +13453,9 @@ msgstr ""
msgid "Error: %{error_message}"
msgstr ""
+msgid "Error: Couldn't load some or all of the changes."
+msgstr ""
+
msgid "Error: No AWS credentials were supplied"
msgstr ""
@@ -13304,6 +13489,9 @@ msgstr ""
msgid "ErrorTracking|Enable error tracking"
msgstr ""
+msgid "ErrorTracking|Error tracking backend"
+msgstr ""
+
msgid "ErrorTracking|If you self-host Sentry, enter your Sentry instance's full URL. If you use Sentry's hosted solution, enter https://sentry.io"
msgstr ""
@@ -13337,6 +13525,12 @@ msgstr ""
msgid "Escalation policies must have at least one rule"
msgstr ""
+msgid "EscalationPolicies|%{clockIcon} IF alert is not %{alertStatus} in %{minutes}"
+msgstr ""
+
+msgid "EscalationPolicies|%{notificationIcon} THEN %{doAction} %{forScheduleOrUser}"
+msgstr ""
+
msgid "EscalationPolicies|+ Add an additional rule"
msgstr ""
@@ -13379,13 +13573,13 @@ msgstr ""
msgid "EscalationPolicies|Escalation policies"
msgstr ""
-msgid "EscalationPolicies|Escalation rules"
+msgid "EscalationPolicies|Escalation policy %{obstacle} in Project %{project}"
msgstr ""
-msgid "EscalationPolicies|Failed to load oncall-schedules"
+msgid "EscalationPolicies|Escalation rules"
msgstr ""
-msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} %{then} THEN %{doAction} %{scheduleOrUser}"
+msgid "EscalationPolicies|Failed to load oncall-schedules"
msgstr ""
msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} minutes"
@@ -13463,18 +13657,36 @@ msgstr ""
msgid "Every %{action} attempt has failed: %{job_error_message}. Please try again."
msgstr ""
+msgid "Every 3 months"
+msgstr ""
+
+msgid "Every 3 months on the %{day} at %{time} %{timezone}"
+msgstr ""
+
+msgid "Every 6 months"
+msgstr ""
+
+msgid "Every 6 months on the %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Every day"
msgstr ""
msgid "Every day (at %{time})"
msgstr ""
+msgid "Every day at %{time} %{timezone}"
+msgstr ""
+
msgid "Every month"
msgstr ""
msgid "Every month (Day %{day} at %{time})"
msgstr ""
+msgid "Every month on the %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Every three months"
msgstr ""
@@ -13489,6 +13701,15 @@ msgstr[1] ""
msgid "Every week (%{weekday} at %{time})"
msgstr ""
+msgid "Every week on %{day} at %{time} %{timezone}"
+msgstr ""
+
+msgid "Every year"
+msgstr ""
+
+msgid "Every year on %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Everyone"
msgstr ""
@@ -13525,9 +13746,6 @@ msgstr ""
msgid "Exactly one of %{attributes} is required"
msgstr ""
-msgid "Example: %{ip_address}. %{read_more_link}."
-msgstr ""
-
msgid "Example: @sub\\.company\\.com$"
msgstr ""
@@ -13594,13 +13812,13 @@ msgstr ""
msgid "Expand pipeline"
msgstr ""
-msgid "Expand sidebar"
+msgid "Expand settings section"
msgstr ""
-msgid "Expected documents: %{expected_documents}"
+msgid "Expand sidebar"
msgstr ""
-msgid "Experienced"
+msgid "Expected documents: %{expected_documents}"
msgstr ""
msgid "ExperimentSubject|Must have exactly one of User, Namespace, or Project."
@@ -13885,9 +14103,6 @@ msgstr ""
msgid "Failed to load related branches"
msgstr ""
-msgid "Failed to load sidebar lock status"
-msgstr ""
-
msgid "Failed to load stacktrace."
msgstr ""
@@ -14312,6 +14527,9 @@ msgstr ""
msgid "Files"
msgstr ""
+msgid "Files API Rate Limits"
+msgstr ""
+
msgid "Files breadcrumb"
msgstr ""
@@ -15311,6 +15529,9 @@ msgstr ""
msgid "GitLab group: %{source_link}"
msgstr ""
+msgid "GitLab informs you if a new version is available."
+msgstr ""
+
msgid "GitLab is a complete DevOps platform, delivered as a single application, fundamentally changing the way Development, Security, and Ops teams collaborate"
msgstr ""
@@ -15326,7 +15547,7 @@ msgstr ""
msgid "GitLab is open source software to collaborate on code."
msgstr ""
-msgid "GitLab is undergoing maintenance and is operating in a read-only mode."
+msgid "GitLab is undergoing maintenance and is operating in read-only mode."
msgstr ""
msgid "GitLab member or Email address"
@@ -15338,9 +15559,6 @@ msgstr ""
msgid "GitLab project export"
msgstr ""
-msgid "GitLab restart is required to apply changes."
-msgstr ""
-
msgid "GitLab single sign-on URL"
msgstr ""
@@ -15356,9 +15574,6 @@ msgstr ""
msgid "GitLab version"
msgstr ""
-msgid "GitLab will inform you if a new version is available."
-msgstr ""
-
msgid "GitLab will run a background job that will produce pseudonymized CSVs of the GitLab database that will be uploaded to your configured object storage directory."
msgstr ""
@@ -15623,9 +15838,21 @@ msgstr ""
msgid "Go to snippets"
msgstr ""
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check 'Allowed domains for sign-ups'."
+msgstr ""
+
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check 'Email restrictions for sign-ups'."
+msgstr ""
+
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check the 'Domain denylist'."
+msgstr ""
+
msgid "Go to the activity feed"
msgstr ""
+msgid "Go to the group’s 'Settings &gt; General' page, and check 'Restrict membership by email domain'."
+msgstr ""
+
msgid "Go to the milestone list"
msgstr ""
@@ -15662,6 +15889,12 @@ msgstr ""
msgid "Goal of the changes and what reviewers should be aware of"
msgstr ""
+msgid "Google Cloud"
+msgstr ""
+
+msgid "Google Cloud offers several deployment targets. Select the one most suitable for your project."
+msgstr ""
+
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
@@ -15746,9 +15979,6 @@ msgstr ""
msgid "Group ID"
msgstr ""
-msgid "Group ID: %{group_id}"
-msgstr ""
-
msgid "Group Owner must have signed in with SAML before enabling Group Managed Accounts"
msgstr ""
@@ -15923,6 +16153,12 @@ msgstr ""
msgid "GroupImport|Unable to process group import file"
msgstr ""
+msgid "GroupPage|Copy group ID"
+msgstr ""
+
+msgid "GroupPage|Group ID: %{group_id}"
+msgstr ""
+
msgid "GroupRoadmap|%{dateWord} – No end date"
msgstr ""
@@ -15977,6 +16213,9 @@ msgstr ""
msgid "GroupRoadmap|Within 3 years"
msgstr ""
+msgid "GroupSAML|\"persistent\" recommended"
+msgstr ""
+
msgid "GroupSAML|%{strongOpen}Warning%{strongClose} - Enabling %{linkStart}SSO enforcement%{linkEnd} can reduce security risks."
msgstr ""
@@ -16109,6 +16348,9 @@ msgstr ""
msgid "GroupSAML|To be able to prohibit outer forks, you first need to enforce dedicate group managed accounts."
msgstr ""
+msgid "GroupSAML|Use SAML group links to manage group membership using SAML."
+msgstr ""
+
msgid "GroupSAML|Valid SAML Response"
msgstr ""
@@ -16121,13 +16363,10 @@ msgstr ""
msgid "GroupSAML|as %{access_level}"
msgstr ""
-msgid "GroupSAML|must match stored NameID of \"%{extern_uid}\" as we use this to identify users. If the NameID changes users will be unable to sign in."
-msgstr ""
-
-msgid "GroupSAML|should be \"persistent\""
+msgid "GroupSAML|must match stored NameID of \"%{extern_uid}\" to identify user and allow sign in"
msgstr ""
-msgid "GroupSAML|should be a random persistent ID, emails are discouraged"
+msgid "GroupSAML|recommend persistent ID instead of email"
msgstr ""
msgid "GroupSelect|No matching results"
@@ -16142,9 +16381,15 @@ msgstr ""
msgid "GroupSettings|Allow project access token creation"
msgstr ""
+msgid "GroupSettings|Applied to all subgroups unless overridden by a group owner. Groups already added to the project lose access."
+msgstr ""
+
msgid "GroupSettings|Auto DevOps pipeline was updated for the group"
msgstr ""
+msgid "GroupSettings|Available only on the top-level group. Applies to all subgroups. Groups already shared with a group outside %{group} are still shared unless removed manually."
+msgstr ""
+
msgid "GroupSettings|Badges"
msgstr ""
@@ -16196,6 +16441,9 @@ msgstr ""
msgid "GroupSettings|New runners registration token has been generated!"
msgstr ""
+msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgstr ""
+
msgid "GroupSettings|Pipeline settings was updated for the group"
msgstr ""
@@ -16208,12 +16456,15 @@ msgstr ""
msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
-msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups."
+msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups"
msgstr ""
msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
msgstr ""
+msgid "GroupSettings|Prevents group members from being notified if the group is mentioned."
+msgstr ""
+
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
msgstr ""
@@ -16250,21 +16501,6 @@ msgstr ""
msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}."
msgstr ""
-msgid "GroupSettings|This setting is only available on the top-level group and it applies to all subgroups. Groups that have already been shared with a group outside %{group} will still be shared, and this access will have to be revoked manually."
-msgstr ""
-
-msgid "GroupSettings|This setting will be applied to all subgroups unless overridden by a group owner. Groups that already have access to the project will continue to have access unless removed manually."
-msgstr ""
-
-msgid "GroupSettings|This setting will override user notification preferences for all members of the group, subgroups, and projects."
-msgstr ""
-
-msgid "GroupSettings|This setting will prevent group members from being notified if the group is mentioned."
-msgstr ""
-
-msgid "GroupSettings|This setting will prevent group members from forking projects outside of the group."
-msgstr ""
-
msgid "GroupSettings|Transfer group"
msgstr ""
@@ -16382,7 +16618,7 @@ msgstr ""
msgid "GroupsNew|No import options available"
msgstr ""
-msgid "GroupsNew|Not all related objects are migrated, as %{docs_link_start}described here%{docs_link_end}. Please %{feedback_link_start}leave feedback%{feedback_link_end} on this feature."
+msgid "GroupsNew|Not all related objects are migrated. %{docs_link_start}More info%{docs_link_end}."
msgstr ""
msgid "GroupsNew|Personal access token"
@@ -16514,15 +16750,27 @@ msgstr ""
msgid "Hello %{name},"
msgstr ""
-msgid "Hello there"
-msgstr ""
-
msgid "Hello, %{name}!"
msgstr ""
msgid "Hello, %{username}!"
msgstr ""
+msgid "HelloMessage|%{handshake_emoji} Contribute to GitLab: %{contribute_link}"
+msgstr ""
+
+msgid "HelloMessage|%{magnifier_emoji} Create a new GitLab issue: %{new_issue_link}"
+msgstr ""
+
+msgid "HelloMessage|%{rocket_emoji} We like your curiosity! Help us improve GitLab by joining the team: %{jobs_page_link}"
+msgstr ""
+
+msgid "HelloMessage|Does this page need fixes or improvements? Open an issue or contribute a merge request to help make GitLab more lovable. At GitLab, everyone can contribute!"
+msgstr ""
+
+msgid "HelloMessage|Welcome to GitLab!"
+msgstr ""
+
msgid "Help"
msgstr ""
@@ -16532,13 +16780,10 @@ msgstr ""
msgid "Helps prevent bots from creating accounts."
msgstr ""
-msgid "Helps prevent bots from creating issues"
-msgstr ""
-
-msgid "Helps prevent malicious users hide their activity"
+msgid "Helps prevent bots from creating issues."
msgstr ""
-msgid "Helps reduce request volume (e.g. from crawlers or abusive bots)"
+msgid "Helps prevent malicious users hide their activity."
msgstr ""
msgid "Helps reduce request volume (for example, from crawlers or abusive bots)"
@@ -16662,6 +16907,12 @@ msgstr ""
msgid "Housekeeping, export, path, transfer, remove, archive."
msgstr ""
+msgid "How do I configure Akismet?"
+msgstr ""
+
+msgid "How do I configure it?"
+msgstr ""
+
msgid "How do I configure runners?"
msgstr ""
@@ -16683,19 +16934,25 @@ msgstr ""
msgid "How do I set up this service?"
msgstr ""
+msgid "How do I use a web terminal?"
+msgstr ""
+
+msgid "How do I use file templates?"
+msgstr ""
+
msgid "How it works"
msgstr ""
msgid "How many days need to pass between marking entity for deletion and actual removing it."
msgstr ""
-msgid "How many seconds an IP will be counted towards the limit"
+msgid "How many seconds an IP counts toward the IP address limit."
msgstr ""
-msgid "I accept the %{terms_link}"
+msgid "How the job limiter handles jobs exceeding the thresholds specified below. The 'track' mode only logs the jobs. The 'compress' mode compresses the jobs and raises an exception if the compressed size exceeds the limit."
msgstr ""
-msgid "I accept the|Terms of Service and Privacy Policy"
+msgid "I accept the %{terms_link}"
msgstr ""
msgid "I forgot my password"
@@ -16779,13 +17036,16 @@ msgstr ""
msgid "IP Address"
msgstr ""
-msgid "IP expiration time"
+msgid "IP address expiration time"
msgstr ""
-msgid "IP subnet restriction only allowed for top-level groups"
+msgid "IP address restrictions"
+msgstr ""
+
+msgid "IP addresses per user"
msgstr ""
-msgid "IPs per user"
+msgid "IP subnet restriction only allowed for top-level groups"
msgstr ""
msgid "Identifier"
@@ -16800,6 +17060,9 @@ msgstr ""
msgid "If any indexed field exceeds this limit it will be truncated to this number of characters and the rest will not be indexed or searchable. This does not apply to repository and wiki indexing. Setting this to 0 means it is unlimited."
msgstr ""
+msgid "If blank, defaults to %{code_open}Retry later%{code_close}."
+msgstr ""
+
msgid "If blank, set allowable lifetime to %{instance_level_policy_in_words}, as defined by the instance admin. Once set, existing tokens for users in this group may be revoked."
msgstr ""
@@ -16851,6 +17114,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 did not initiate these sign-in attempts, please reach out to your administrator or enable two-factor authentication (2FA) on your account."
+msgstr ""
+
msgid "If you did not initiate this change, please contact your administrator immediately."
msgstr ""
@@ -16942,10 +17208,10 @@ msgstr ""
msgid "Import Projects from Gitea"
msgstr ""
-msgid "Import a project"
+msgid "Import an exported GitLab project"
msgstr ""
-msgid "Import an exported GitLab project"
+msgid "Import and export rate limits"
msgstr ""
msgid "Import failed due to a GitHub error: %{original}"
@@ -16957,12 +17223,18 @@ msgstr ""
msgid "Import from Jira"
msgstr ""
+msgid "Import group"
+msgstr ""
+
msgid "Import group from file"
msgstr ""
msgid "Import groups"
msgstr ""
+msgid "Import history"
+msgstr ""
+
msgid "Import in progress"
msgstr ""
@@ -17026,7 +17298,25 @@ msgstr ""
msgid "Import timed out. Import took longer than %{import_jobs_expiration} seconds"
msgstr ""
-msgid "Import/Export Rate Limits"
+msgid "ImportAProjectModal|Import from a project"
+msgstr ""
+
+msgid "ImportAProjectModal|Import members from another project"
+msgstr ""
+
+msgid "ImportAProjectModal|Import project members"
+msgstr ""
+
+msgid "ImportAProjectModal|Only project members (not group members) are imported, and they get the same permissions as the project you import from."
+msgstr ""
+
+msgid "ImportAProjectModal|Successfully imported"
+msgstr ""
+
+msgid "ImportAProjectModal|Unable to import project members"
+msgstr ""
+
+msgid "ImportAProjectModal|You're importing members to the %{strongStart}%{name}%{strongEnd} project."
msgstr ""
msgid "ImportButtons|Connect repositories from"
@@ -17079,7 +17369,7 @@ msgstr[1] ""
msgid "Importing..."
msgstr ""
-msgid "Import|A repository URL usually ends in a .git suffix, although this is not required. Double check to make sure your repository URL is correct."
+msgid "Import|There is not a valid Git repository at this URL. If your HTTP repository is not publicly accessible, verify your credentials."
msgstr ""
msgid "Improve customer support with Service Desk"
@@ -17088,9 +17378,6 @@ msgstr ""
msgid "Improves Git cloning performance."
msgstr ""
-msgid "In %{time_to_now}"
-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 ""
@@ -17376,7 +17663,7 @@ msgstr ""
msgid "InProductMarketing|Start a GitLab Ultimate trial today in less than one minute, no credit card required."
msgstr ""
-msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no CC required"
+msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no credit card required"
msgstr ""
msgid "InProductMarketing|Start a trial"
@@ -17415,7 +17702,7 @@ msgstr ""
msgid "InProductMarketing|Team up in GitLab for greater efficiency"
msgstr ""
-msgid "InProductMarketing|Team work makes the dream work"
+msgid "InProductMarketing|Team work makes the dream work"
msgstr ""
msgid "InProductMarketing|Test, create, deploy"
@@ -17996,6 +18283,9 @@ msgstr ""
msgid "Integrations|Create new issue in Jira"
msgstr ""
+msgid "Integrations|Create new issue in ZenTao"
+msgstr ""
+
msgid "Integrations|Default settings are inherited from the group level."
msgstr ""
@@ -18089,9 +18379,15 @@ msgstr ""
msgid "Integrations|Search Jira issues"
msgstr ""
+msgid "Integrations|Search ZenTao issues"
+msgstr ""
+
msgid "Integrations|Send notifications about project events to Unify Circuit."
msgstr ""
+msgid "Integrations|Send notifications about project events to a Unify Circuit conversation. %{docs_link}"
+msgstr ""
+
msgid "Integrations|Sign in to add namespaces"
msgstr ""
@@ -18131,6 +18427,9 @@ msgstr ""
msgid "Integrations|You've activated every integration 🎉"
msgstr ""
+msgid "Integrations|ZenTao issues display here when you create issues in your project in ZenTao."
+msgstr ""
+
msgid "Interactive mode"
msgstr ""
@@ -18158,9 +18457,6 @@ msgstr ""
msgid "Interval Pattern"
msgstr ""
-msgid "Introducing Value Stream Analytics"
-msgstr ""
-
msgid "Introducing Your DevOps Report"
msgstr ""
@@ -18257,6 +18553,12 @@ msgstr ""
msgid "Investigate vulnerability: %{title}"
msgstr ""
+msgid "Invisible Captcha"
+msgstr ""
+
+msgid "Invisible Captcha helps prevent the creation of spam accounts. It adds a honeypot field and time-sensitive form submission to the account signup form."
+msgstr ""
+
msgid "Invitation"
msgstr ""
@@ -18710,12 +19012,18 @@ msgstr ""
msgid "Issues"
msgstr ""
+msgid "Issues I've created"
+msgstr ""
+
msgid "Issues Rate Limits"
msgstr ""
msgid "Issues and merge requests"
msgstr ""
+msgid "Issues assigned to me"
+msgstr ""
+
msgid "Issues can be bugs, tasks or ideas to be discussed. Also, issues are searchable and filterable."
msgstr ""
@@ -18827,7 +19135,7 @@ msgstr ""
msgid "Iterations|Create cadence"
msgstr ""
-msgid "Iterations|Create your first iteration"
+msgid "Iterations|Create iteration"
msgstr ""
msgid "Iterations|Delete cadence"
@@ -18836,6 +19144,9 @@ msgstr ""
msgid "Iterations|Delete iteration cadence?"
msgstr ""
+msgid "Iterations|Delete iteration?"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -18869,12 +19180,18 @@ msgstr ""
msgid "Iterations|New iteration cadence"
msgstr ""
+msgid "Iterations|No closed iterations."
+msgstr ""
+
msgid "Iterations|No iteration cadences to show."
msgstr ""
msgid "Iterations|No iterations in cadence."
msgstr ""
+msgid "Iterations|No open iterations."
+msgstr ""
+
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
@@ -18905,6 +19222,9 @@ msgstr ""
msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
msgstr ""
+msgid "Iterations|This will remove the iteration from any issues that are assigned to it."
+msgstr ""
+
msgid "Iterations|Title"
msgstr ""
@@ -18920,15 +19240,9 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "I’m familiar with the basics of DevOps."
-msgstr ""
-
msgid "I’m joining my team who’s already on GitLab"
msgstr ""
-msgid "I’m not familiar with the basics of DevOps."
-msgstr ""
-
msgid "Jaeger URL"
msgstr ""
@@ -19193,6 +19507,9 @@ msgstr ""
msgid "Job"
msgstr ""
+msgid "Job %{jobName}"
+msgstr ""
+
msgid "Job Failed #%{build_id}"
msgstr ""
@@ -19783,9 +20100,6 @@ msgstr ""
msgid "Learn more in the"
msgstr ""
-msgid "Learn more in the|pipeline schedules documentation"
-msgstr ""
-
msgid "Learn more."
msgstr ""
@@ -19897,9 +20211,6 @@ msgstr ""
msgid "Leave Admin Mode"
msgstr ""
-msgid "Leave blank for no limit. Once set, existing personal access tokens may be revoked."
-msgstr ""
-
msgid "Leave edit mode? All unsaved changes will be lost."
msgstr ""
@@ -19945,10 +20256,10 @@ msgstr ""
msgid "LicenseCompliance|Acceptable license to be used in the project"
msgstr ""
-msgid "LicenseCompliance|Add a license"
+msgid "LicenseCompliance|Add license and related policy"
msgstr ""
-msgid "LicenseCompliance|Add license and related policy"
+msgid "LicenseCompliance|Add license policy"
msgstr ""
msgid "LicenseCompliance|Allow"
@@ -20038,6 +20349,9 @@ msgstr ""
msgid "LicenseManagement|Uncategorized"
msgstr ""
+msgid "Licensed Enterprise Edition features can be used if the project namespace's plan includes the feature, or if the project is public."
+msgstr ""
+
msgid "Licensed Features"
msgstr ""
@@ -20104,7 +20418,10 @@ msgstr ""
msgid "Limit namespaces and projects that can be indexed"
msgstr ""
-msgid "Limit sign in from multiple ips"
+msgid "Limit project size at a global, group, and project level. %{link_start}Learn more%{link_end}."
+msgstr ""
+
+msgid "Limit sign in from multiple IP addresses"
msgstr ""
msgid "Limit the number of concurrent operations this secondary site can run in the background."
@@ -20116,11 +20433,17 @@ msgstr ""
msgid "Limit the number of issues and epics per minute a user can create through web and API requests."
msgstr ""
+msgid "Limit the size of Sidekiq jobs stored in Redis."
+msgstr ""
+
msgid "Limited to showing %d event at most"
msgid_plural "Limited to showing %d events at most"
msgstr[0] ""
msgstr[1] ""
+msgid "Limiting mode"
+msgstr ""
+
msgid "Line changes"
msgstr ""
@@ -20190,9 +20513,6 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
-msgid "List of users to be excluded from the limit"
-msgstr ""
-
msgid "List options"
msgstr ""
@@ -20232,9 +20552,6 @@ msgstr ""
msgid "Loading functions timed out. Please reload the page to try again."
msgstr ""
-msgid "Loading issues"
-msgstr ""
-
msgid "Loading more"
msgstr ""
@@ -20526,6 +20843,9 @@ msgstr ""
msgid "Marked For Deletion At - %{deletion_time}"
msgstr ""
+msgid "Marked as ready. Merging is now allowed."
+msgstr ""
+
msgid "Marked this %{noun} as a draft."
msgstr ""
@@ -20598,52 +20918,22 @@ msgstr ""
msgid "Max 100,000 events"
msgstr ""
-msgid "Max 20 characters"
-msgstr ""
-
-msgid "Max Group Export Download requests per minute per user"
-msgstr ""
-
-msgid "Max Group Export requests per minute per user"
-msgstr ""
-
-msgid "Max Group Import requests per minute per user"
-msgstr ""
-
-msgid "Max Project Export Download requests per minute per user"
-msgstr ""
-
-msgid "Max Project Export requests per minute per user"
-msgstr ""
-
-msgid "Max Project Import requests per minute per user"
-msgstr ""
-
-msgid "Max authenticated API requests per period per user"
-msgstr ""
-
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
-msgid "Max authenticated web requests per period per user"
-msgstr ""
-
msgid "Max file size is 200 KB."
msgstr ""
-msgid "Max requests per minute per user"
-msgstr ""
-
msgid "Max role"
msgstr ""
msgid "Max session time"
msgstr ""
-msgid "Max unauthenticated requests per period per IP"
+msgid "MaxBuilds"
msgstr ""
-msgid "MaxBuilds"
+msgid "Maximum 20 characters"
msgstr ""
msgid "Maximum Conan package file size in bytes"
@@ -20679,6 +20969,12 @@ msgstr ""
msgid "Maximum attachment size (MB)"
msgstr ""
+msgid "Maximum authenticated API requests per rate limit period per user"
+msgstr ""
+
+msgid "Maximum authenticated web requests per rate limit period per user"
+msgstr ""
+
msgid "Maximum bulk request size (MiB)"
msgstr ""
@@ -20724,6 +21020,15 @@ msgstr ""
msgid "Maximum files in a diff"
msgstr ""
+msgid "Maximum group export download requests per minute"
+msgstr ""
+
+msgid "Maximum group export requests per minute"
+msgstr ""
+
+msgid "Maximum group import requests per minute"
+msgstr ""
+
msgid "Maximum import size"
msgstr ""
@@ -20760,7 +21065,7 @@ msgstr ""
msgid "Maximum number of projects."
msgstr ""
-msgid "Maximum number of unique IPs per user"
+msgid "Maximum number of unique IP addresses per user."
msgstr ""
msgid "Maximum page reached"
@@ -20769,12 +21074,24 @@ msgstr ""
msgid "Maximum page size"
msgstr ""
+msgid "Maximum project export download requests per minute"
+msgstr ""
+
+msgid "Maximum project export requests per minute"
+msgstr ""
+
+msgid "Maximum project import requests per minute"
+msgstr ""
+
msgid "Maximum push size"
msgstr ""
msgid "Maximum push size (MB)"
msgstr ""
+msgid "Maximum requests per minute"
+msgstr ""
+
msgid "Maximum running slices"
msgstr ""
@@ -20802,10 +21119,16 @@ msgstr ""
msgid "Maximum time between updates that a mirror can have when scheduled to synchronize."
msgstr ""
-msgid "Maximum time for web terminal websocket connection (in seconds). 0 for unlimited."
+msgid "Maximum time that users are allowed to skip the setup of two-factor authentication (in hours). Set to 0 (zero) to enforce at next sign in."
msgstr ""
-msgid "Maximum time that users are allowed to skip the setup of two-factor authentication (in hours). Set to 0 (zero) to enforce at next sign in."
+msgid "Maximum time, in seconds, for a web terminal websocket connection. 0 for unlimited."
+msgstr ""
+
+msgid "Maximum unauthenticated API requests per rate limit period per IP"
+msgstr ""
+
+msgid "Maximum unauthenticated web requests per rate limit period per IP"
msgstr ""
msgid "May"
@@ -20823,9 +21146,6 @@ msgstr ""
msgid "Medium vulnerabilities present"
msgstr ""
-msgid "Member lock"
-msgstr ""
-
msgid "Member since"
msgstr ""
@@ -20862,6 +21182,9 @@ msgstr ""
msgid "Members of a group may only view projects they have permission to access"
msgstr ""
+msgid "Membership"
+msgstr ""
+
msgid "Members|%{time} by %{user}"
msgstr ""
@@ -20922,9 +21245,6 @@ msgstr ""
msgid "Members|Expiration date updated successfully."
msgstr ""
-msgid "Members|Expired"
-msgstr ""
-
msgid "Members|Filter members"
msgstr ""
@@ -20940,9 +21260,6 @@ msgstr ""
msgid "Members|Membership"
msgstr ""
-msgid "Members|No expiration set"
-msgstr ""
-
msgid "Members|Remove \"%{groupName}\""
msgstr ""
@@ -20964,9 +21281,6 @@ msgstr ""
msgid "Members|Search invited"
msgstr ""
-msgid "Members|in %{time}"
-msgstr ""
-
msgid "Member|Deny access"
msgstr ""
@@ -21042,9 +21356,6 @@ msgstr ""
msgid "Merge request %{mr_link} was reviewed by %{mr_author}"
msgstr ""
-msgid "Merge request (MR) approvals"
-msgstr ""
-
msgid "Merge request analytics"
msgstr ""
@@ -21066,12 +21377,21 @@ msgstr ""
msgid "Merge requests"
msgstr ""
+msgid "Merge requests I've created"
+msgstr ""
+
msgid "Merge requests are a place to propose changes you've made to a project and discuss those changes with others"
msgstr ""
msgid "Merge requests are read-only in a secondary Geo node"
msgstr ""
+msgid "Merge requests assigned to me"
+msgstr ""
+
+msgid "Merge requests that I'm a reviewer"
+msgstr ""
+
msgid "Merge the branch and fix any conflicts that come up"
msgstr ""
@@ -21132,10 +21452,10 @@ msgstr ""
msgid "MergeRequests|An error occurred while saving the draft comment."
msgstr ""
-msgid "MergeRequests|Failed to squash. Should be done manually."
+msgid "MergeRequests|Create issue to resolve thread"
msgstr ""
-msgid "MergeRequests|Resolve this thread in a new issue"
+msgid "MergeRequests|Failed to squash. Should be done manually."
msgstr ""
msgid "MergeRequests|Saving the comment failed"
@@ -21949,6 +22269,9 @@ msgstr ""
msgid "MoveIssue|Cannot move issue to project it originates from!"
msgstr ""
+msgid "MoveIssue|Cannot move issues of '%{issue_type}' type."
+msgstr ""
+
msgid "Moved issue to %{label} column in the board."
msgstr ""
@@ -22074,6 +22397,15 @@ 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. To learn more about reducing storage capacity please visit our docs."
msgstr ""
+msgid "NamespaceUserCap|Pending users must be reviewed and approved by a group owner. Learn more about %{user_caps_link_start}User Caps%{link_end} and %{users_pending_approval_link_start}Users Pending Approval%{link_end}."
+msgstr ""
+
+msgid "NamespaceUserCap|View pending user approvals"
+msgstr ""
+
+msgid "NamespaceUserCap|Your group has reached its billable member limit"
+msgstr ""
+
msgid "Namespaces"
msgstr ""
@@ -22116,9 +22448,6 @@ msgstr ""
msgid "Network"
msgstr ""
-msgid "Network Policy|New rule"
-msgstr ""
-
msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is inbound from a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
msgstr ""
@@ -22140,16 +22469,13 @@ msgstr ""
msgid "NetworkPolicies|%{strongOpen}any%{strongClose} port"
msgstr ""
-msgid "NetworkPolicies|+ Add alert"
-msgstr ""
-
msgid "NetworkPolicies|.yaml"
msgstr ""
msgid "NetworkPolicies|.yaml mode"
msgstr ""
-msgid "NetworkPolicies|Actions"
+msgid "NetworkPolicies|Add alert"
msgstr ""
msgid "NetworkPolicies|Alerts are intended to be selectively used for a limited number of events that are potentially concerning and warrant a manual review. Alerts should not be used as a substitute for a SIEM or a logging tool. High volume alerts are likely to be dropped so as to preserve the stability of GitLab's integration with Kubernetes."
@@ -22185,9 +22511,6 @@ msgstr ""
msgid "NetworkPolicies|Deny all traffic"
msgstr ""
-msgid "NetworkPolicies|Description"
-msgstr ""
-
msgid "NetworkPolicies|Edit policy"
msgstr ""
@@ -22200,9 +22523,6 @@ msgstr ""
msgid "NetworkPolicies|IP/subnet"
msgstr ""
-msgid "NetworkPolicies|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
-msgstr ""
-
msgid "NetworkPolicies|Invalid or empty policy"
msgstr ""
@@ -22212,19 +22532,16 @@ msgstr ""
msgid "NetworkPolicies|Kubernetes error: %{error}"
msgstr ""
-msgid "NetworkPolicies|Name"
-msgstr ""
-
msgid "NetworkPolicies|Network"
msgstr ""
-msgid "NetworkPolicies|Network traffic"
+msgid "NetworkPolicies|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
msgstr ""
-msgid "NetworkPolicies|New policy"
+msgid "NetworkPolicies|Network policy can be created after the environment is loaded successfully."
msgstr ""
-msgid "NetworkPolicies|No policies detected"
+msgid "NetworkPolicies|Network traffic"
msgstr ""
msgid "NetworkPolicies|None selected"
@@ -22233,21 +22550,12 @@ msgstr ""
msgid "NetworkPolicies|Please %{installLinkStart}install%{installLinkEnd} and %{configureLinkStart}configure a Kubernetes Agent for this project%{configureLinkEnd} to enable alerts."
msgstr ""
-msgid "NetworkPolicies|Policies are a specification of how groups of pods are allowed to communicate with each other's network endpoints."
-msgstr ""
-
msgid "NetworkPolicies|Policy %{policyName} was successfully changed"
msgstr ""
msgid "NetworkPolicies|Policy definition"
msgstr ""
-msgid "NetworkPolicies|Policy editor"
-msgstr ""
-
-msgid "NetworkPolicies|Policy preview"
-msgstr ""
-
msgid "NetworkPolicies|Rule"
msgstr ""
@@ -22257,9 +22565,6 @@ msgstr ""
msgid "NetworkPolicies|Rule mode is unavailable for this policy. In some cases, we cannot parse the YAML file back into the rules editor."
msgstr ""
-msgid "NetworkPolicies|Rules"
-msgstr ""
-
msgid "NetworkPolicies|Save changes"
msgstr ""
@@ -22272,9 +22577,6 @@ msgstr ""
msgid "NetworkPolicies|Traffic that does not match any rule will be blocked."
msgstr ""
-msgid "NetworkPolicies|Unable to parse policy"
-msgstr ""
-
msgid "NetworkPolicies|all DNS names"
msgstr ""
@@ -22454,6 +22756,9 @@ msgstr ""
msgid "New issue"
msgstr ""
+msgid "New issue in %{project}"
+msgstr ""
+
msgid "New issue title"
msgstr ""
@@ -22532,7 +22837,7 @@ msgstr ""
msgid "Newest first"
msgstr ""
-msgid "Newly registered users will by default be external"
+msgid "Newly-registered users are external by default"
msgstr ""
msgid "Next"
@@ -22847,8 +23152,10 @@ msgstr ""
msgid "No webhooks found, add one in the form above."
msgstr ""
-msgid "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} to renew your subscription."
-msgstr ""
+msgid "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} day to renew your subscription."
+msgid_plural "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} days to renew your subscription."
+msgstr[0] ""
+msgstr[1] ""
msgid "No. of commits"
msgstr ""
@@ -22865,7 +23172,7 @@ msgstr ""
msgid "Nodes"
msgstr ""
-msgid "Non-admin users can sign in with read-only access and make read-only API requests."
+msgid "Non-admin users are restricted to read-only access, in both GitLab UI and API."
msgstr ""
msgid "None"
@@ -22946,7 +23253,7 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
-msgid "Notes Rate Limits"
+msgid "Notes rate limit"
msgstr ""
msgid "Notes|Are you sure you want to cancel creating this comment?"
@@ -23113,9 +23420,6 @@ msgstr ""
msgid "November"
msgstr ""
-msgid "Novice"
-msgstr ""
-
msgid "Now, personalize your GitLab experience"
msgstr ""
@@ -23284,7 +23588,7 @@ msgstr ""
msgid "OnCallSchedules|For this rotation, on-call will be:"
msgstr ""
-msgid "OnCallSchedules|On-call schedule %{schedule} in Project %{project}"
+msgid "OnCallSchedules|On-call schedule %{obstacle} in Project %{project}"
msgstr ""
msgid "OnCallSchedules|On-call schedules"
@@ -23431,22 +23735,22 @@ msgstr ""
msgid "OnDemandScans|Scanner profile"
msgstr ""
-msgid "OnDemandScans|Select one of the existing profiles"
+msgid "OnDemandScans|Schedule scan"
msgstr ""
-msgid "OnDemandScans|Site profile"
+msgid "OnDemandScans|Select one of the existing profiles"
msgstr ""
-msgid "OnDemandScans|Use existing scanner profile"
+msgid "OnDemandScans|Site profile"
msgstr ""
-msgid "OnDemandScans|Use existing site profile"
+msgid "OnDemandScans|Start time"
msgstr ""
-msgid "OnDemandScans|You can either choose a passive scan or validate the target site in your chosen site profile. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
+msgid "OnDemandScans|Use existing scanner profile"
msgstr ""
-msgid "OnDemandScans|You cannot run an active scan against an unvalidated site."
+msgid "OnDemandScans|Use existing site profile"
msgstr ""
msgid "OnDemandScans|You must create a repository within your project to run an on-demand scan."
@@ -23511,6 +23815,9 @@ msgstr ""
msgid "Only admins can delete project"
msgstr ""
+msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
+msgstr ""
+
msgid "Only include features new to your current subscription tier."
msgstr ""
@@ -23529,6 +23836,12 @@ msgstr ""
msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
+msgid "Only reCAPTCHA v2 is supported:"
+msgstr ""
+
+msgid "Only users from the specified IP address ranges are able to reach this group, including all subgroups, projects, and Git repositories."
+msgstr ""
+
msgid "Only verified users with an email address in any of these domains can be added to the group."
msgstr ""
@@ -23715,9 +24028,6 @@ msgstr ""
msgid "Package Registry"
msgstr ""
-msgid "Package Registry Rate Limits"
-msgstr ""
-
msgid "Package Registry: authenticated API requests"
msgstr ""
@@ -23736,6 +24046,9 @@ msgstr ""
msgid "Package recipe already exists"
msgstr ""
+msgid "Package registry rate limits"
+msgstr ""
+
msgid "Package type"
msgstr ""
@@ -23802,6 +24115,9 @@ msgstr ""
msgid "PackageRegistry|Composer"
msgstr ""
+msgid "PackageRegistry|Composer.json with license: %{license} and version: %{version}"
+msgstr ""
+
msgid "PackageRegistry|Conan"
msgstr ""
@@ -23865,6 +24181,9 @@ msgstr ""
msgid "PackageRegistry|Copy require package include"
msgstr ""
+msgid "PackageRegistry|Copy target SHA"
+msgstr ""
+
msgid "PackageRegistry|Copy yarn command"
msgstr ""
@@ -23931,6 +24250,9 @@ msgstr ""
msgid "PackageRegistry|Install package version"
msgstr ""
+msgid "PackageRegistry|Instance-level"
+msgstr ""
+
msgid "PackageRegistry|Invalid Package: failed metadata extraction"
msgstr ""
@@ -23976,6 +24298,9 @@ msgstr ""
msgid "PackageRegistry|Pip Command"
msgstr ""
+msgid "PackageRegistry|Project-level"
+msgstr ""
+
msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
msgstr ""
@@ -23997,6 +24322,9 @@ msgstr ""
msgid "PackageRegistry|Remove package"
msgstr ""
+msgid "PackageRegistry|Required Python: %{pythonVersion}"
+msgstr ""
+
msgid "PackageRegistry|RubyGems"
msgstr ""
@@ -24039,6 +24367,9 @@ msgstr ""
msgid "PackageRegistry|Source project located at %{link}"
msgstr ""
+msgid "PackageRegistry|Target SHA: %{sha}"
+msgstr ""
+
msgid "PackageRegistry|There are no other versions of this package."
msgstr ""
@@ -24207,6 +24538,18 @@ msgstr ""
msgid "Password was successfully updated. Please sign in again."
msgstr ""
+msgid "PasswordPrompt|Confirm password"
+msgstr ""
+
+msgid "PasswordPrompt|Confirm password to continue"
+msgstr ""
+
+msgid "PasswordPrompt|Password is required"
+msgstr ""
+
+msgid "PasswordPrompt|Please enter your password to confirm"
+msgstr ""
+
msgid "Passwords should be unique and not used for any other sites or services."
msgstr ""
@@ -24234,6 +24577,9 @@ msgstr ""
msgid "Paste project path (i.e. gitlab-org/gitlab)"
msgstr ""
+msgid "Paste this DSN into your Sentry SDK"
+msgstr ""
+
msgid "Paste your public SSH key, which is usually contained in the file '~/.ssh/id_ed25519.pub' or '~/.ssh/id_rsa.pub' and begins with 'ssh-ed25519' or 'ssh-rsa'. Do not paste your private SSH key, as that can compromise your identity."
msgstr ""
@@ -24318,6 +24664,9 @@ msgstr ""
msgid "PerformanceBar|First Contentful Paint"
msgstr ""
+msgid "PerformanceBar|Flamegraph with mode:"
+msgstr ""
+
msgid "PerformanceBar|Frontend resources"
msgstr ""
@@ -24351,6 +24700,15 @@ msgstr ""
msgid "PerformanceBar|Trace"
msgstr ""
+msgid "PerformanceBar|cpu"
+msgstr ""
+
+msgid "PerformanceBar|object"
+msgstr ""
+
+msgid "PerformanceBar|wall"
+msgstr ""
+
msgid "Period in seconds"
msgstr ""
@@ -24579,6 +24937,48 @@ msgstr ""
msgid "PipelineSchedules|Variables"
msgstr ""
+msgid "PipelineSource|API"
+msgstr ""
+
+msgid "PipelineSource|Chat"
+msgstr ""
+
+msgid "PipelineSource|External"
+msgstr ""
+
+msgid "PipelineSource|External Pull Request"
+msgstr ""
+
+msgid "PipelineSource|Merge Request"
+msgstr ""
+
+msgid "PipelineSource|On-Demand DAST Scan"
+msgstr ""
+
+msgid "PipelineSource|On-Demand DAST Validation"
+msgstr ""
+
+msgid "PipelineSource|Parent Pipeline"
+msgstr ""
+
+msgid "PipelineSource|Pipeline"
+msgstr ""
+
+msgid "PipelineSource|Push"
+msgstr ""
+
+msgid "PipelineSource|Schedule"
+msgstr ""
+
+msgid "PipelineSource|Trigger"
+msgstr ""
+
+msgid "PipelineSource|Web"
+msgstr ""
+
+msgid "PipelineSource|Web IDE"
+msgstr ""
+
msgid "PipelineStatusTooltip|Pipeline: %{ciStatus}"
msgstr ""
@@ -24879,46 +25279,7 @@ msgstr ""
msgid "Pipeline|Source"
msgstr ""
-msgid "Pipeline|Source|API"
-msgstr ""
-
-msgid "Pipeline|Source|Chat"
-msgstr ""
-
-msgid "Pipeline|Source|External"
-msgstr ""
-
-msgid "Pipeline|Source|External Pull Request"
-msgstr ""
-
-msgid "Pipeline|Source|Merge Request"
-msgstr ""
-
-msgid "Pipeline|Source|On-Demand DAST Scan"
-msgstr ""
-
-msgid "Pipeline|Source|On-Demand DAST Validation"
-msgstr ""
-
-msgid "Pipeline|Source|Parent Pipeline"
-msgstr ""
-
-msgid "Pipeline|Source|Pipeline"
-msgstr ""
-
-msgid "Pipeline|Source|Push"
-msgstr ""
-
-msgid "Pipeline|Source|Schedule"
-msgstr ""
-
-msgid "Pipeline|Source|Trigger"
-msgstr ""
-
-msgid "Pipeline|Source|Web"
-msgstr ""
-
-msgid "Pipeline|Source|Web IDE"
+msgid "Pipeline|Source|Security Policy"
msgstr ""
msgid "Pipeline|Specify variable values to be used in this run. The values specified in %{linkStart}CI/CD settings%{linkEnd} will be used by default."
@@ -24969,7 +25330,7 @@ msgstr ""
msgid "Pipeline|We are currently unable to fetch pipeline data"
msgstr ""
-msgid "Pipeline|You’re about to stop pipeline %{pipelineId}."
+msgid "Pipeline|You’re about to stop pipeline #%{pipelineId}."
msgstr ""
msgid "Pipeline|for"
@@ -24996,6 +25357,9 @@ msgstr ""
msgid "Plain diff"
msgstr ""
+msgid "Plain-text response to send to clients that hit a rate limit"
+msgstr ""
+
msgid "Plan:"
msgstr ""
@@ -25140,9 +25504,6 @@ msgstr ""
msgid "Please provide attributes to update"
msgstr ""
-msgid "Please provide your username or email address."
-msgstr ""
-
msgid "Please reach out if you have any questions and we'll be happy to assist."
msgstr ""
@@ -25185,9 +25546,6 @@ msgstr ""
msgid "Please set a new password before proceeding."
msgstr ""
-msgid "Please share your feedback about %{featureName} %{linkStart}in this issue%{linkEnd} to help us improve the experience."
-msgstr ""
-
msgid "Please solve the captcha"
msgstr ""
@@ -25365,6 +25723,9 @@ msgstr ""
msgid "Prevent adding new members to project membership within this group"
msgstr ""
+msgid "Prevent auto-stopping"
+msgstr ""
+
msgid "Prevent editing approval rules in projects and merge requests."
msgstr ""
@@ -25377,7 +25738,7 @@ msgstr ""
msgid "Prevent users from changing their profile name"
msgstr ""
-msgid "Prevent users from performing write operations on GitLab while performing maintenance."
+msgid "Prevent users from performing write operations while GitLab maintenance is in progress."
msgstr ""
msgid "Preview"
@@ -25650,6 +26011,9 @@ msgstr ""
msgid "Profiles|Enter your name, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Enter your password to confirm the email change"
+msgstr ""
+
msgid "Profiles|Enter your pronouns to let people know how to refer to you"
msgstr ""
@@ -25884,10 +26248,10 @@ msgstr ""
msgid "Profiles|e.g. My MacBook key"
msgstr ""
-msgid "Profiles|username"
+msgid "Profiles|https://website.com"
msgstr ""
-msgid "Profiles|website.com"
+msgid "Profiles|username"
msgstr ""
msgid "Profiles|your account"
@@ -26130,9 +26494,21 @@ msgstr ""
msgid "ProjectSelect| or group"
msgstr ""
+msgid "ProjectSelect|No matching results"
+msgstr ""
+
msgid "ProjectSelect|Search for project"
msgstr ""
+msgid "ProjectSelect|Search projects"
+msgstr ""
+
+msgid "ProjectSelect|Select a project"
+msgstr ""
+
+msgid "ProjectSelect|There was an error fetching the projects. Please try again."
+msgstr ""
+
msgid "ProjectService|Drone server URL"
msgstr ""
@@ -26220,6 +26596,9 @@ msgstr ""
msgid "ProjectService|Trigger event when a new, unique alert is recorded."
msgstr ""
+msgid "ProjectService|Trigger event when a new, unique vulnerability is recorded. (Note: This feature requires an Ultimate plan.)"
+msgstr ""
+
msgid "ProjectService|Trigger event when a pipeline status changes."
msgstr ""
@@ -26634,9 +27013,15 @@ msgstr ""
msgid "Projects are graded based on the highest severity vulnerability present"
msgstr ""
+msgid "Projects are organized into groups"
+msgstr ""
+
msgid "Projects contributed to"
msgstr ""
+msgid "Projects help you organize your work. They contain your file repository, issues, merge requests, and so much more."
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr ""
@@ -26871,10 +27256,10 @@ msgstr ""
msgid "PrometheusService|Prometheus cluster integration"
msgstr ""
-msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
+msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
msgstr ""
-msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
+msgid "PrometheusService|The ID of the IAP-secured resource."
msgstr ""
msgid "PrometheusService|The Prometheus API base URL."
@@ -27492,6 +27877,9 @@ msgstr ""
msgid "Rate limit"
msgstr ""
+msgid "Rate limits can help reduce request volume (like from crawlers or abusive bots)."
+msgstr ""
+
msgid "Raw blob request rate limit per minute"
msgstr ""
@@ -27504,6 +27892,9 @@ msgstr ""
msgid "Re-authentication required"
msgstr ""
+msgid "Re-import"
+msgstr ""
+
msgid "Re-request review"
msgstr ""
@@ -27525,6 +27916,9 @@ msgstr ""
msgid "Read more about related issues"
msgstr ""
+msgid "Read their documentation."
+msgstr ""
+
msgid "Ready to get started with GitLab? Follow these steps to set up your workspace, plan and commit changes, and deploy your project."
msgstr ""
@@ -27558,6 +27952,9 @@ msgstr ""
msgid "Receive any notifications from GitLab."
msgstr ""
+msgid "Receive notification of abuse reports by email."
+msgstr ""
+
msgid "Receive notifications about your own activity"
msgstr ""
@@ -27701,9 +28098,6 @@ msgstr ""
msgid "Registry setup"
msgstr ""
-msgid "Regulate approvals by authors/committers. Affects all projects."
-msgstr ""
-
msgid "Reindexing Status: %{status} (Slice multiplier: %{multiplier}, Maximum running slices: %{max_slices})"
msgstr ""
@@ -27799,6 +28193,9 @@ msgstr ""
msgid "Release|Something went wrong while saving the release details."
msgstr ""
+msgid "Reload page"
+msgstr ""
+
msgid "Remediations"
msgstr ""
@@ -28081,6 +28478,9 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
+msgid "Repeats"
+msgstr ""
+
msgid "Replace"
msgstr ""
@@ -28443,10 +28843,7 @@ msgstr ""
msgid "Require additional authentication for administrative tasks."
msgstr ""
-msgid "Require all users in this group to setup Two-factor authentication"
-msgstr ""
-
-msgid "Require all users in this group to setup two-factor authentication"
+msgid "Require all users in this group to set up two-factor authentication"
msgstr ""
msgid "Required approvals (%{approvals_given} given)"
@@ -28492,6 +28889,9 @@ msgstr[1] ""
msgid "Requires values to meet regular expression requirements."
msgstr ""
+msgid "Requires you to deploy or set up cloud-hosted Sentry."
+msgstr ""
+
msgid "Requires your primary GitLab email address."
msgstr ""
@@ -28552,9 +28952,6 @@ msgstr ""
msgid "Resolve"
msgstr ""
-msgid "Resolve all threads in new issue"
-msgstr ""
-
msgid "Resolve conflicts"
msgstr ""
@@ -28612,6 +29009,9 @@ msgstr ""
msgid "Response text"
msgstr ""
+msgid "Restart GitLab to apply changes."
+msgstr ""
+
msgid "Restart Terminal"
msgstr ""
@@ -28630,6 +29030,9 @@ msgstr ""
msgid "Restoring the project will prevent the project from being removed on this date and restore people's ability to make changes to it."
msgstr ""
+msgid "Restrict group access by IP address. %{link_start}Learn more%{link_end}."
+msgstr ""
+
msgid "Restrict membership by email domain"
msgstr ""
@@ -28943,6 +29346,9 @@ msgstr ""
msgid "Runners|Runner #%{runner_id}"
msgstr ""
+msgid "Runners|Runner assigned to project."
+msgstr ""
+
msgid "Runners|Runner is offline, last contact was %{runner_contact} ago"
msgstr ""
@@ -28955,6 +29361,9 @@ msgstr ""
msgid "Runners|Runner registration"
msgstr ""
+msgid "Runners|Runner unassigned from project."
+msgstr ""
+
msgid "Runners|Runners"
msgstr ""
@@ -29147,7 +29556,7 @@ msgstr ""
msgid "SastEntryPoints|How do I set up SAST?"
msgstr ""
-msgid "SastEntryPoints|Learn more."
+msgid "SastEntryPoints|Learn more"
msgstr ""
msgid "Satisfied"
@@ -29189,7 +29598,7 @@ msgstr ""
msgid "Save pipeline schedule"
msgstr ""
-msgid "Save space and find images in the container Registry. remove unneeded tags and keep only the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
+msgid "Save storage space by automatically deleting tags from the container registry and keeping the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
msgstr ""
msgid "Saving"
@@ -29363,6 +29772,9 @@ msgstr ""
msgid "Search or filter results…"
msgstr ""
+msgid "Search or jump to..."
+msgstr ""
+
msgid "Search project"
msgstr ""
@@ -29423,16 +29835,16 @@ msgstr ""
msgid "SearchCodeResults|of %{link_to_project}"
msgstr ""
-msgid "SearchResults|Showing %{count} %{scope} for%{term_element}"
+msgid "SearchResults|Showing %{count} %{scope} for %{term_element}"
msgstr ""
-msgid "SearchResults|Showing %{count} %{scope} for%{term_element} in your personal and project snippets"
+msgid "SearchResults|Showing %{count} %{scope} for %{term_element} in your personal and project snippets"
msgstr ""
-msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for%{term_element}"
+msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for %{term_element}"
msgstr ""
-msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for%{term_element} in your personal and project snippets"
+msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for %{term_element} in your personal and project snippets"
msgstr ""
msgid "SearchResults|code result"
@@ -29514,6 +29926,9 @@ msgstr ""
msgid "Secret Detection"
msgstr ""
+msgid "Secret access key"
+msgstr ""
+
msgid "Secret token"
msgstr ""
@@ -29553,9 +29968,6 @@ msgstr ""
msgid "SecurityApprovals|A merge request approval is required when the license compliance report contains a denied license."
msgstr ""
-msgid "SecurityApprovals|Configurable if security scanners are enabled. %{linkStart}Learn more.%{linkEnd}"
-msgstr ""
-
msgid "SecurityApprovals|Coverage-Check"
msgstr ""
@@ -29568,24 +29980,18 @@ msgstr ""
msgid "SecurityApprovals|Learn more about Vulnerability-Check"
msgstr ""
-msgid "SecurityApprovals|License Scanning must be enabled. %{linkStart}Learn more%{linkEnd}."
-msgstr ""
-
msgid "SecurityApprovals|License-Check"
msgstr ""
msgid "SecurityApprovals|Requires approval for Denied licenses. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}More information%{linkEnd}"
+msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "SecurityApprovals|Requires approval for vulnerabilities. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
-msgid "SecurityApprovals|Test coverage must be enabled. %{linkStart}Learn more%{linkEnd}."
-msgstr ""
-
msgid "SecurityApprovals|Vulnerability-Check"
msgstr ""
@@ -29649,6 +30055,12 @@ msgstr ""
msgid "SecurityConfiguration|Immediately begin risk analysis and remediation with application security features. Start with SAST and Secret Detection, available to all plans. Upgrade to Ultimate to get all features, including:"
msgstr ""
+msgid "SecurityConfiguration|Manage corpus"
+msgstr ""
+
+msgid "SecurityConfiguration|Manage corpus files used as mutation sources in coverage fuzzing."
+msgstr ""
+
msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
msgstr ""
@@ -29703,6 +30115,12 @@ msgstr ""
msgid "SecurityOrchestration|Action"
msgstr ""
+msgid "SecurityOrchestration|Actions"
+msgstr ""
+
+msgid "SecurityOrchestration|Add rule"
+msgstr ""
+
msgid "SecurityOrchestration|All policies"
msgstr ""
@@ -29736,9 +30154,6 @@ msgstr ""
msgid "SecurityOrchestration|Network"
msgstr ""
-msgid "SecurityOrchestration|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
-msgstr ""
-
msgid "SecurityOrchestration|New policy"
msgstr ""
@@ -29754,6 +30169,9 @@ msgstr ""
msgid "SecurityOrchestration|Policy editor"
msgstr ""
+msgid "SecurityOrchestration|Policy preview"
+msgstr ""
+
msgid "SecurityOrchestration|Policy status"
msgstr ""
@@ -29763,6 +30181,9 @@ msgstr ""
msgid "SecurityOrchestration|Rule"
msgstr ""
+msgid "SecurityOrchestration|Rules"
+msgstr ""
+
msgid "SecurityOrchestration|Scan Execution"
msgstr ""
@@ -29856,6 +30277,9 @@ msgstr ""
msgid "SecurityReports|Create issue"
msgstr ""
+msgid "SecurityReports|Development vulnerabilities"
+msgstr ""
+
msgid "SecurityReports|Dismiss vulnerability"
msgstr ""
@@ -29871,6 +30295,9 @@ msgstr ""
msgid "SecurityReports|Download results"
msgstr ""
+msgid "SecurityReports|Download scanned URLs"
+msgstr ""
+
msgid "SecurityReports|Download scanned resources"
msgstr ""
@@ -29994,6 +30421,9 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
+msgid "SecurityReports|The Vulnerability Report shows the results of the lastest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "SecurityReports|The security reports below contain one or more vulnerability findings that could not be parsed and were not recorded. Download the artifacts in the job output to investigate. Ensure any security report created conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
msgstr ""
@@ -30135,10 +30565,10 @@ msgstr ""
msgid "Select a repository"
msgstr ""
-msgid "Select a role"
+msgid "Select a repository containing templates for common files."
msgstr ""
-msgid "Select a shared template repository for all projects on this instance."
+msgid "Select a role"
msgstr ""
msgid "Select a template repository"
@@ -30216,6 +30646,9 @@ msgstr ""
msgid "Select project to choose zone"
msgstr ""
+msgid "Select project to create issue"
+msgstr ""
+
msgid "Select projects"
msgstr ""
@@ -30333,6 +30766,9 @@ msgstr ""
msgid "Send emails to help guide new users through the onboarding process."
msgstr ""
+msgid "Send emails to users upon account deactivation."
+msgstr ""
+
msgid "Send message"
msgstr ""
@@ -30351,6 +30787,9 @@ msgstr ""
msgid "Send service data"
msgstr ""
+msgid "Sentry"
+msgstr ""
+
msgid "Sentry API URL"
msgstr ""
@@ -30465,6 +30904,9 @@ msgstr ""
msgid "Service"
msgstr ""
+msgid "Service Accounts keys are required to authorize GitLab to deploy your Google Cloud project."
+msgstr ""
+
msgid "Service Desk"
msgstr ""
@@ -30537,15 +30979,15 @@ msgstr ""
msgid "Set a password on your account to pull or push via %{protocol}."
msgstr ""
-msgid "Set a template repository for projects in this group"
-msgstr ""
-
msgid "Set access permissions for this token."
msgstr ""
msgid "Set an instance-wide domain that will be available to all clusters when installing Knative."
msgstr ""
+msgid "Set any rate limit to %{code_open}0%{code_close} to disable the limit."
+msgstr ""
+
msgid "Set default and restrict visibility levels. Configure import sources and git access protocol."
msgstr ""
@@ -30558,7 +31000,7 @@ msgstr ""
msgid "Set limit to 0 to allow any file size."
msgstr ""
-msgid "Set max session time for web terminal."
+msgid "Set limits for web and API requests."
msgstr ""
msgid "Set milestone"
@@ -30567,15 +31009,18 @@ msgstr ""
msgid "Set new password"
msgstr ""
-msgid "Set notification email for abuse reports."
+msgid "Set parent epic to an epic"
msgstr ""
-msgid "Set parent epic to an epic"
+msgid "Set per-user rate limits for imports and exports of projects and groups."
msgstr ""
msgid "Set projects and maximum size limits, session duration, user options, and check feature availability for namespace plan."
msgstr ""
+msgid "Set rate limits for package registry API requests that supersede the general user and IP rate limits."
+msgstr ""
+
msgid "Set severity"
msgstr ""
@@ -30594,15 +31039,24 @@ msgstr ""
msgid "Set the default branch for this project. All merge requests and commits are made against this branch unless you specify a different one."
msgstr ""
+msgid "Set the default expiration time for job artifacts in all projects. Set to %{code_open}0%{code_close} to never expire artifacts by default. If no unit is written, it defaults to seconds. For example, these are all equivalent: %{code_open}3600%{code_close}, %{code_open}60 minutes%{code_close}, or %{code_open}one hour%{code_close}."
+msgstr ""
+
msgid "Set the due date to %{due_date}."
msgstr ""
msgid "Set the iteration to %{iteration_reference}."
msgstr ""
+msgid "Set the maximum session time for a web terminal."
+msgstr ""
+
msgid "Set the milestone to %{milestone_reference}."
msgstr ""
+msgid "Set the per-user rate limit for notes created by web or API requests."
+msgstr ""
+
msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
msgstr ""
@@ -30804,6 +31258,9 @@ msgstr ""
msgid "Show Pipeline IID"
msgstr ""
+msgid "Show all %{issuable_type}."
+msgstr ""
+
msgid "Show all activity"
msgstr ""
@@ -30855,15 +31312,9 @@ msgstr ""
msgid "Show list"
msgstr ""
-msgid "Show me advanced features"
-msgstr ""
-
msgid "Show me how to add a pipeline"
msgstr ""
-msgid "Show me the basics"
-msgstr ""
-
msgid "Show one file at a time"
msgstr ""
@@ -30904,15 +31355,15 @@ msgstr ""
msgid "Showing %{pageSize} of %{total} %{issuableType}"
msgstr ""
-msgid "Showing %{pageSize} of %{total} issues"
-msgstr ""
-
msgid "Showing all epics"
msgstr ""
msgid "Showing all issues"
msgstr ""
+msgid "Showing data for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
+msgstr ""
+
msgid "Showing data for workflow items created in this date range. Date range cannot exceed %{maxDateRange} days."
msgstr ""
@@ -30952,6 +31403,15 @@ msgstr ""
msgid "Sidebar|Weight"
msgstr ""
+msgid "Sidekiq job compression threshold (bytes)"
+msgstr ""
+
+msgid "Sidekiq job size limit (bytes)"
+msgstr ""
+
+msgid "Sidekiq job size limits"
+msgstr ""
+
msgid "Sign in"
msgstr ""
@@ -31072,6 +31532,9 @@ msgstr ""
msgid "Site profile not found for given parameters"
msgstr ""
+msgid "Sites"
+msgstr ""
+
msgid "Size"
msgstr ""
@@ -31102,19 +31565,22 @@ msgstr ""
msgid "SlackIntegration|Sends notifications about project events to Slack channels."
msgstr ""
-msgid "SlackService|2. Paste the %{strong_open}Token%{strong_close} into the field below"
+msgid "SlackService|1. %{slash_command_link_start}Add a slash command%{slash_command_link_end} in your Slack team using this information:"
msgstr ""
-msgid "SlackService|3. Select the %{strong_open}Active%{strong_close} checkbox, press %{strong_open}Save changes%{strong_close} and start using GitLab inside Slack!"
+msgid "SlackService|2. Paste the token from Slack in the %{strong_open}Token%{strong_close} field below."
msgstr ""
-msgid "SlackService|Fill in the word that works best for your team."
+msgid "SlackService|3. Select the %{strong_open}Active%{strong_close} checkbox, select %{strong_open}Save changes%{strong_close}, and start using slash commands in Slack!"
+msgstr ""
+
+msgid "SlackService|After setup, get a list of available Slack slash commands by entering"
msgstr ""
-msgid "SlackService|See list of available commands in Slack after setting up this service, by entering"
+msgid "SlackService|Fill in the word that works best for your team."
msgstr ""
-msgid "SlackService|This service allows users to perform common operations on this project by entering slash commands in Slack."
+msgid "SlackService|Perform common operations in this project by entering slash commands in Slack."
msgstr ""
msgid "Slice multiplier"
@@ -31180,7 +31646,7 @@ msgstr ""
msgid "Some child epics may be hidden due to applied filters"
msgstr ""
-msgid "Some common domains are not allowed. %{read_more_link}."
+msgid "Some common domains are not allowed. %{learn_more_link}."
msgstr ""
msgid "Some of the designs you tried uploading did not change:"
@@ -31264,9 +31730,6 @@ msgstr ""
msgid "Something went wrong while exporting requirements"
msgstr ""
-msgid "Something went wrong while fetching %{listType} list"
-msgstr ""
-
msgid "Something went wrong while fetching branches"
msgstr ""
@@ -31321,15 +31784,9 @@ msgstr ""
msgid "Something went wrong while merging this merge request. Please try again."
msgstr ""
-msgid "Something went wrong while moving issues."
-msgstr ""
-
msgid "Something went wrong while obtaining the Let's Encrypt certificate."
msgstr ""
-msgid "Something went wrong while performing the action."
-msgstr ""
-
msgid "Something went wrong while promoting the issue to an epic. Please try again."
msgstr ""
@@ -31657,7 +32114,10 @@ msgstr ""
msgid "SourcegraphPreferences|Uses a custom %{linkStart}Sourcegraph instance%{linkEnd}."
msgstr ""
-msgid "Spam Check API Key"
+msgid "Spam Check"
+msgstr ""
+
+msgid "Spam Check API key"
msgstr ""
msgid "Spam Logs"
@@ -31675,7 +32135,7 @@ msgstr ""
msgid "Specified URL cannot be used: \"%{reason}\""
msgstr ""
-msgid "Specify an e-mail address regex pattern to identify default internal users."
+msgid "Specify an email address regex pattern to identify default internal users."
msgstr ""
msgid "Speed up your pipelines with Needs relationships"
@@ -31930,7 +32390,7 @@ msgstr ""
msgid "StatusCheck|An error occurred fetching the status checks."
msgstr ""
-msgid "StatusCheck|Apply this status check to any branch or a specific protected branch."
+msgid "StatusCheck|Apply this status check to all branches or a specific protected branch."
msgstr ""
msgid "StatusCheck|Check for a status response in Merge Requests. Failures do not block merges. %{link_start}Learn more%{link_end}."
@@ -32269,6 +32729,9 @@ msgstr ""
msgid "Subscriptions"
msgstr ""
+msgid "Subscription|Your subscription for %{strong}%{namespace_name}%{strong_close} has expired and you are now on %{pricing_link_start}the GitLab Free tier%{pricing_link_end}. Don't worry, your data is safe. Get in touch with our support team (%{support_email}). They'll gladly help with your subscription renewal."
+msgstr ""
+
msgid "Subtracted"
msgstr ""
@@ -32497,6 +32960,9 @@ msgstr ""
msgid "SuperSonics|Plan"
msgstr ""
+msgid "SuperSonics|Please agree to the Subscription Agreement"
+msgstr ""
+
msgid "SuperSonics|Ready to get started? A GitLab plan is ideal for scaling organizations and for multi team usage."
msgstr ""
@@ -32527,6 +32993,9 @@ msgstr ""
msgid "SuperSonics|The activation code is not valid. Please make sure to copy it exactly from the Customers Portal or confirmation email. Learn more about %{linkStart}activating your subscription%{linkEnd}."
msgstr ""
+msgid "SuperSonics|The activation code should be a 24-character alphanumeric string"
+msgstr ""
+
msgid "SuperSonics|There is a connectivity issue."
msgstr ""
@@ -32569,9 +33038,15 @@ msgstr ""
msgid "SuperSonics|You do not have an active subscription"
msgstr ""
+msgid "SuperSonics|You have successfully added a license that activates on %{date}. Please see the subscription history table below for more details."
+msgstr ""
+
msgid "SuperSonics|You'll be charged for %{trueUpLinkStart}users over license%{trueUpLinkEnd} on a quarterly or annual basis, depending on the terms of your agreement."
msgstr ""
+msgid "SuperSonics|Your future dated license was successfully added"
+msgstr ""
+
msgid "SuperSonics|Your subscription"
msgstr ""
@@ -32824,7 +33299,7 @@ msgstr ""
msgid "Template to append to all Service Desk issues"
msgstr ""
-msgid "TemplateRepository|Select a repository to make its templates available to all projects. %{link_start}What should the repository contain?%{link_end} "
+msgid "TemplateRepository|Create common files more quickly, and standardize their format."
msgstr ""
msgid "Templates"
@@ -33030,7 +33505,7 @@ msgstr ""
msgid "TestCases|Search test cases"
msgstr ""
-msgid "TestCases|Something went wrong while adding test case to Todo."
+msgid "TestCases|Something went wrong while adding test case to a to-do item."
msgstr ""
msgid "TestCases|Something went wrong while creating a test case."
@@ -33042,7 +33517,7 @@ msgstr ""
msgid "TestCases|Something went wrong while fetching test cases list."
msgstr ""
-msgid "TestCases|Something went wrong while marking test case todo as done."
+msgid "TestCases|Something went wrong while marking test case to-do item as done."
msgstr ""
msgid "TestCases|Something went wrong while moving test case."
@@ -33162,7 +33637,7 @@ msgstr ""
msgid "Thanks for your purchase!"
msgstr ""
-msgid "That is ok, I do not want to renew"
+msgid "That's OK, I don't want to renew"
msgstr ""
msgid "That's it, well done!"
@@ -33185,7 +33660,7 @@ msgid_plural "The %{type} contains the following errors:"
msgstr[0] ""
msgstr[1] ""
-msgid "The API key used by GitLab for accessing the Spam Check service endpoint"
+msgid "The API key used by GitLab for accessing the Spam Check service endpoint."
msgstr ""
msgid "The GitLab subscription service (customers.gitlab.com) is currently experiencing an outage. You can monitor the status and get updates at %{linkStart}status.gitlab.com%{linkEnd}."
@@ -33224,9 +33699,6 @@ msgstr ""
msgid "The URL to use for connecting to Elasticsearch. Use a comma-separated list to support clustering (e.g., \"http://localhost:9200, http://localhost:9201\")."
msgstr ""
-msgid "The Vulnerability Report shows the results of the last successful pipeline run on the default branch."
-msgstr ""
-
msgid "The X509 Certificate to use when mutual TLS is required to communicate with the external authorization service. If left blank, the server certificate is still validated when accessing over HTTPS."
msgstr ""
@@ -33284,9 +33756,6 @@ msgstr ""
msgid "The default branch for this project has been changed. Please update your bookmarks."
msgstr ""
-msgid "The default expiration time for job artifacts. 0 for unlimited. The default unit is in seconds, but you can use other units, for example %{code_open}4 mins 2 sec%{code_close}, %{code_open}2h42min%{code_close}."
-msgstr ""
-
msgid "The dependency list details information about the components used within your project."
msgstr ""
@@ -33478,9 +33947,6 @@ msgstr ""
msgid "The merge conflicts for this merge request have already been resolved. Please return to the merge request."
msgstr ""
-msgid "The merge request can now be merged."
-msgstr ""
-
msgid "The metric must be one of %{metrics}."
msgstr ""
@@ -33856,7 +34322,7 @@ msgstr ""
msgid "There was a problem updating the keep latest artifacts setting."
msgstr ""
-msgid "There was an error %{message} todo."
+msgid "There was an error %{message} to-do item."
msgstr ""
msgid "There was an error adding a To Do."
@@ -33895,6 +34361,9 @@ msgstr ""
msgid "There was an error fetching projects"
msgstr ""
+msgid "There was an error fetching search autocomplete suggestions"
+msgstr ""
+
msgid "There was an error fetching stage total counts"
msgstr ""
@@ -34219,6 +34688,9 @@ msgstr ""
msgid "This field is required."
msgstr ""
+msgid "This form is disabled in preview"
+msgstr ""
+
msgid "This group"
msgstr ""
@@ -34240,9 +34712,6 @@ msgstr ""
msgid "This group is linked to a subscription"
msgstr ""
-msgid "This group, including all subgroups, projects and git repositories, will be reachable from only the specified IP address ranges."
-msgstr ""
-
msgid "This group, its subgroups and projects has been scheduled for removal on %{date}."
msgstr ""
@@ -34522,9 +34991,6 @@ msgstr ""
msgid "This user cannot be unlocked manually from GitLab"
msgstr ""
-msgid "This user does not have a pending request"
-msgstr ""
-
msgid "This user has an unconfirmed email address (%{email}). You may force a confirmation."
msgstr ""
@@ -34633,9 +35099,6 @@ msgstr ""
msgid "ThreatMonitoring|Packet Activity"
msgstr ""
-msgid "ThreatMonitoring|Policies"
-msgstr ""
-
msgid "ThreatMonitoring|Requests"
msgstr ""
@@ -34687,6 +35150,12 @@ msgstr ""
msgid "ThreatMonitoring|View documentation"
msgstr ""
+msgid "Threshold in bytes at which to compress Sidekiq job arguments."
+msgstr ""
+
+msgid "Threshold in bytes at which to reject Sidekiq jobs. Set this to 0 to if you don't want to limit Sidekiq jobs."
+msgstr ""
+
msgid "Throughput"
msgstr ""
@@ -34696,6 +35165,9 @@ msgstr ""
msgid "Time"
msgstr ""
+msgid "Time (in hours) that users are allowed to skip forced configuration of two-factor authentication."
+msgstr ""
+
msgid "Time Spent"
msgstr ""
@@ -34762,7 +35234,7 @@ msgstr ""
msgid "TimeTrackingEstimated|Est"
msgstr ""
-msgid "TimeTracking|%{startTag}Spent: %{endTag}%{timeSpentHumanReadable}"
+msgid "TimeTracking|%{spentStart}Spent: %{spentEnd}"
msgstr ""
msgid "TimeTracking|Estimated:"
@@ -34976,6 +35448,9 @@ msgstr ""
msgid "To access this domain create a new DNS record"
msgstr ""
+msgid "To add a custom suffix, set up a Service Desk email address. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "To add an SSH key you need to %{generate_link_start}generate one%{link_end} or use an %{existing_link_start}existing key%{link_end}."
msgstr ""
@@ -34997,13 +35472,16 @@ msgstr ""
msgid "To connect an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To continue using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
+msgstr ""
+
msgid "To continue, you need to select the link in the confirmation email we sent to verify your email address. If you didn't get our email, select %{strongStart}Resend confirmation email.%{strongEnd}"
msgstr ""
msgid "To define internal users, first enable new users set to external"
msgstr ""
-msgid "To enable Registration Features, make sure \"Enable service ping\" is checked."
+msgid "To enable Registration Features, first enable Service Ping."
msgstr ""
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
@@ -35030,7 +35508,7 @@ msgstr ""
msgid "To get started, use the link below to confirm your account."
msgstr ""
-msgid "To help improve GitLab and its user experience, GitLab will periodically collect usage information."
+msgid "To help improve GitLab and its user experience, GitLab periodically collects usage information."
msgstr ""
msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
@@ -35063,7 +35541,7 @@ msgstr ""
msgid "To preserve performance only %{strong_open}%{display_size} of %{real_size}%{strong_close} files are displayed."
msgstr ""
-msgid "To protect this issue's confidentiality, %{forkLink} and set the fork's visibility to private."
+msgid "To protect this issue's confidentiality, %{linkStart}fork this project%{linkEnd} and set the fork's visibility to private."
msgstr ""
msgid "To protect this issue's confidentiality, a private fork of this project was selected."
@@ -35096,12 +35574,15 @@ msgstr ""
msgid "To set up SAML authentication for your group through an identity provider like Azure, Okta, Onelogin, Ping Identity, or your custom SAML 2.0 provider:"
msgstr ""
-msgid "To set up this service:"
+msgid "To set up this integration:"
msgstr ""
msgid "To specify the notification level per project of a group you belong to, you need to visit project page and change notification level there."
msgstr ""
+msgid "To start using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
+msgstr ""
+
msgid "To unsubscribe from this issue, please paste the following link into your browser:"
msgstr ""
@@ -35689,9 +36170,6 @@ msgstr ""
msgid "Unable to fetch branches list, please close the form and try again"
msgstr ""
-msgid "Unable to fetch unscanned projects"
-msgstr ""
-
msgid "Unable to fetch vulnerable projects"
msgstr ""
@@ -35746,6 +36224,15 @@ msgstr ""
msgid "Unable to update this issue at this time."
msgstr ""
+msgid "Unapprove a merge request"
+msgstr ""
+
+msgid "Unapprove the current merge request."
+msgstr ""
+
+msgid "Unapproved the current merge request."
+msgstr ""
+
msgid "Unarchive project"
msgstr ""
@@ -35758,16 +36245,13 @@ msgstr ""
msgid "Unassigned"
msgstr ""
-msgid "Unauthenticated API request rate limit"
-msgstr ""
-
-msgid "Unauthenticated rate limit period in seconds"
+msgid "Unauthenticated API rate limit period in seconds"
msgstr ""
-msgid "Unauthenticated request rate limit"
+msgid "Unauthenticated requests"
msgstr ""
-msgid "Unauthenticated requests"
+msgid "Unauthenticated web rate limit period in seconds"
msgstr ""
msgid "Undo"
@@ -35869,18 +36353,6 @@ msgstr ""
msgid "Unresolved"
msgstr ""
-msgid "UnscannedProjects|15 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|30 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|5 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|60 or more days"
-msgstr ""
-
msgid "Unschedule job"
msgstr ""
@@ -36100,6 +36572,9 @@ msgstr ""
msgid "UsageQuota|%{help_link_start}Shared runners%{help_link_end} are disabled, so there are no limits set on pipeline usage"
msgstr ""
+msgid "UsageQuota|%{linkTitle} help link"
+msgstr ""
+
msgid "UsageQuota|%{percentageLeft} of purchased storage is available"
msgstr ""
@@ -36109,6 +36584,9 @@ msgstr ""
msgid "UsageQuota|Artifacts is a sum of build and pipeline artifacts."
msgstr ""
+msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
+msgstr ""
+
msgid "UsageQuota|Buy additional minutes"
msgstr ""
@@ -36118,9 +36596,21 @@ msgstr ""
msgid "UsageQuota|CI minutes usage by project"
msgstr ""
+msgid "UsageQuota|Code packages and container images."
+msgstr ""
+
msgid "UsageQuota|Current period usage"
msgstr ""
+msgid "UsageQuota|File attachments and smaller design graphics."
+msgstr ""
+
+msgid "UsageQuota|Git repository, managed by the Gitaly service."
+msgstr ""
+
+msgid "UsageQuota|Includes project registry, artifacts, packages, wiki, uploads and other items."
+msgstr ""
+
msgid "UsageQuota|Increase storage temporarily"
msgstr ""
@@ -36139,6 +36629,9 @@ msgstr ""
msgid "UsageQuota|Packages"
msgstr ""
+msgid "UsageQuota|Pipeline artifacts and job artifacts, created with CI/CD."
+msgstr ""
+
msgid "UsageQuota|Pipelines"
msgstr ""
@@ -36157,6 +36650,9 @@ msgstr ""
msgid "UsageQuota|Seats"
msgstr ""
+msgid "UsageQuota|Shared bits of code and text."
+msgstr ""
+
msgid "UsageQuota|Snippets"
msgstr ""
@@ -36166,6 +36662,12 @@ msgstr ""
msgid "UsageQuota|Storage"
msgstr ""
+msgid "UsageQuota|Storage type"
+msgstr ""
+
+msgid "UsageQuota|There is a known issue with Artifact storage where the total could be incorrect for some projects. More details and progress are available in %{warningLinkStart}the epic%{warningLinkEnd}."
+msgstr ""
+
msgid "UsageQuota|This is the total amount of storage used across your projects within this namespace."
msgstr ""
@@ -36205,6 +36707,9 @@ msgstr ""
msgid "UsageQuota|Usage"
msgstr ""
+msgid "UsageQuota|Usage Breakdown"
+msgstr ""
+
msgid "UsageQuota|Usage Quotas"
msgstr ""
@@ -36229,6 +36734,9 @@ msgstr ""
msgid "UsageQuota|Wiki"
msgstr ""
+msgid "UsageQuota|Wiki content."
+msgstr ""
+
msgid "UsageQuota|Wikis"
msgstr ""
@@ -36445,7 +36953,10 @@ msgstr ""
msgid "User Settings"
msgstr ""
-msgid "User and IP Rate Limits"
+msgid "User and IP rate limits"
+msgstr ""
+
+msgid "User does not have a pending request"
msgstr ""
msgid "User identity was successfully created."
@@ -36742,6 +37253,9 @@ msgstr ""
msgid "Users can launch a development environment from a GitLab browser tab when the %{linkStart}Gitpod%{linkEnd} integration is enabled."
msgstr ""
+msgid "Users can reactivate their account by signing in."
+msgstr ""
+
msgid "Users can render diagrams in AsciiDoc, Markdown, reStructuredText, and Textile documents using Kroki."
msgstr ""
@@ -36757,6 +37271,9 @@ msgstr ""
msgid "Users requesting access to"
msgstr ""
+msgid "Users to exclude from the rate limit"
+msgstr ""
+
msgid "Users were successfully added."
msgstr ""
@@ -36778,6 +37295,9 @@ msgstr ""
msgid "UsersSelect|Unassigned"
msgstr ""
+msgid "Uses GitLab as a lightweight alternative to Sentry."
+msgstr ""
+
msgid "Using %{code_start}::%{code_end} denotes a %{link_start}scoped label set%{link_end}"
msgstr ""
@@ -36808,10 +37328,7 @@ msgstr ""
msgid "Value Stream Analytics can help you determine your team’s velocity"
msgstr ""
-msgid "Value Stream Analytics gives an overview of how much time it takes to go from idea to production in your project."
-msgstr ""
-
-msgid "Value may contain a variable reference"
+msgid "Value might contain a variable reference"
msgstr ""
msgid "Value stream"
@@ -36877,10 +37394,10 @@ msgstr ""
msgid "ValueStream|The Default Value Stream cannot be deleted"
msgstr ""
-msgid "Variable"
+msgid "Values that contain the %{codeStart}$%{codeEnd} character can be considered a variable reference and expanded. %{docsLinkStart}Learn more.%{docsLinkEnd}"
msgstr ""
-msgid "Variable references indicated by %{codeStart}$%{codeEnd} may be expanded. If this is not what you want, consider %{docsLinkStart}using a workaround to prevent expansion%{docsLinkEnd}."
+msgid "Variable"
msgstr ""
msgid "Variable will be masked in job logs."
@@ -37285,6 +37802,9 @@ msgstr ""
msgid "Vulnerability|Evidence"
msgstr ""
+msgid "Vulnerability|False positive detected"
+msgstr ""
+
msgid "Vulnerability|File"
msgstr ""
@@ -37327,6 +37847,9 @@ msgstr ""
msgid "Vulnerability|Status"
msgstr ""
+msgid "Vulnerability|The scanner determined this vulnerability to be a false positive. Verify the evaluation before changing its status. %{linkStart}Learn more about false positive detection.%{linkEnd}"
+msgstr ""
+
msgid "Vulnerability|The unmodified response is the original response that had no mutations done to the request"
msgstr ""
@@ -37651,9 +38174,6 @@ msgstr ""
msgid "Welcome to GitLab,%{br_tag}%{name}!"
msgstr ""
-msgid "Welcome to the guided GitLab tour"
-msgstr ""
-
msgid "Welcome, %{name}!"
msgstr ""
@@ -37672,9 +38192,6 @@ msgstr ""
msgid "What are you searching for?"
msgstr ""
-msgid "What describes you best?"
-msgstr ""
-
msgid "What does this command do?"
msgstr ""
@@ -37696,13 +38213,13 @@ msgstr ""
msgid "What is your job title? (optional)"
msgstr ""
-msgid "What will you use this group for?"
+msgid "What templates can I create?"
msgstr ""
-msgid "What's new"
+msgid "What will you use this group for?"
msgstr ""
-msgid "What’s your experience level?"
+msgid "What's new"
msgstr ""
msgid "When a deployment job is successful, skip older deployment jobs that are still pending."
@@ -37714,6 +38231,9 @@ msgstr ""
msgid "When an event in GitLab triggers a webhook, you can use the request details to figure out if something went wrong."
msgstr ""
+msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+msgstr ""
+
msgid "When inactive, an external authentication provider must be used."
msgstr ""
@@ -37737,6 +38257,9 @@ msgstr ""
msgid "When:"
msgstr ""
+msgid "Which API requests are affected?"
+msgstr ""
+
msgid "While it's rare to have no vulnerabilities, it can happen. In any event, we ask that you please double check your settings to make sure you've set up your dashboard correctly."
msgstr ""
@@ -38016,6 +38539,9 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|Work Items"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -38091,6 +38617,9 @@ msgstr ""
msgid "You are already a member of this %{member_source}."
msgstr ""
+msgid "You are already impersonating another user"
+msgstr ""
+
msgid "You are an admin, which means granting access to %{client_name} will allow them to interact with GitLab as an admin as well. Proceed with caution."
msgstr ""
@@ -38193,6 +38722,9 @@ msgstr ""
msgid "You can also use project access tokens with Git to authenticate over HTTP(S). %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "You can always change your URL later"
+msgstr ""
+
msgid "You can always edit this later"
msgstr ""
@@ -38349,10 +38881,10 @@ msgstr ""
msgid "You can’t %{tag_start}edit%{tag_end} files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
-msgid "You could not create a new trigger."
+msgid "You can’t edit files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
-msgid "You didn't renew your subscription for %{strong}%{namespace_name}%{strong_close} so it was downgraded to the free plan."
+msgid "You could not create a new trigger."
msgstr ""
msgid "You do not have any subscriptions yet"
@@ -38520,6 +39052,12 @@ msgstr ""
msgid "You must provide your current password in order to change it."
msgstr ""
+msgid "You must sign in to search for specific projects."
+msgstr ""
+
+msgid "You must sign in to search for specific terms."
+msgstr ""
+
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
@@ -38547,6 +39085,9 @@ msgstr ""
msgid "You need to upload a GitLab project export archive (ending in .gz)."
msgstr ""
+msgid "You need to verify your primary email first before enabling Two-Factor Authentication."
+msgstr ""
+
msgid "You successfully declined the invitation"
msgstr ""
@@ -38655,10 +39196,10 @@ msgstr ""
msgid "Your %{host} account was signed in to from a new location"
msgstr ""
-msgid "Your %{strong}%{plan_name}%{strong_close} subscription for %{strong}%{namespace_name}%{strong_close} will expire on %{strong}%{expires_on}%{strong_close}."
+msgid "Your %{strong}%{plan_name}%{strong_close} subscription expires on %{strong}%{expires_on}%{strong_close}. After that date, you cannot create issues or merge requests, or use many other features."
msgstr ""
-msgid "Your %{strong}%{plan_name}%{strong_close} subscription will expire on %{strong}%{expires_on}%{strong_close}. After that, you will not be able to create issues or merge requests as well as many other features."
+msgid "Your %{strong}%{plan_name}%{strong_close} subscription for %{strong}%{namespace_name}%{strong_close} will expire on %{strong}%{expires_on}%{strong_close}."
msgstr ""
msgid "Your CI/CD configuration syntax is invalid. View Lint tab for more details."
@@ -38682,7 +39223,7 @@ msgstr ""
msgid "Your GPG keys (%{count})"
msgstr ""
-msgid "Your GitLab account has been locked due to an excessive amount of unsuccessful sign in attempts. Your account will automatically unlock in %{duration} or you may click the link below to unlock now."
+msgid "Your GitLab account has been locked due to an excessive number of unsuccessful sign in attempts. You can wait for your account to automatically unlock in %{duration} or you can click the link below to unlock now."
msgstr ""
msgid "Your GitLab account request has been approved!"
@@ -38793,6 +39334,9 @@ msgstr ""
msgid "Your commit email is used for web based operations, such as edits and merges."
msgstr ""
+msgid "Your current password is required to register a two-factor authenticator app."
+msgstr ""
+
msgid "Your dashboard has been copied. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
@@ -38892,6 +39436,9 @@ msgstr ""
msgid "Your project limit is %{limit} projects! Please contact your administrator to increase it"
msgstr ""
+msgid "Your project will be created at:"
+msgstr ""
+
msgid "Your projects"
msgstr ""
@@ -38931,11 +39478,10 @@ msgstr ""
msgid "Your subscription expired!"
msgstr ""
-msgid "Your subscription has been downgraded."
-msgstr ""
-
-msgid "Your subscription will expire in %{remaining_days}."
-msgstr ""
+msgid "Your subscription will expire in %{remaining_days} day."
+msgid_plural "Your subscription will expire in %{remaining_days} days."
+msgstr[0] ""
+msgstr[1] ""
msgid "Your username is %{username}."
msgstr ""
@@ -39142,6 +39688,9 @@ msgstr ""
msgid "cannot merge"
msgstr ""
+msgid "cannot not be used for user namespace"
+msgstr ""
+
msgid "ciReport|%{degradedNum} degraded"
msgstr ""
@@ -39465,6 +40014,9 @@ msgstr ""
msgid "created %{timeAgo}"
msgstr ""
+msgid "created %{timeAgo} by %{author}"
+msgstr ""
+
msgid "created by"
msgstr ""
@@ -39509,9 +40061,6 @@ msgstr ""
msgid "does not have a supported extension. Only %{extension_list} are supported"
msgstr ""
-msgid "domain is not authorized for sign-up."
-msgstr ""
-
msgid "download it"
msgstr ""
@@ -39529,18 +40078,13 @@ msgstr ""
msgid "email '%{email}' is not a verified email."
msgstr ""
-msgid "email does not match the allowed domain of %{email_domains}"
-msgid_plural "email does not match the allowed domains: %{email_domains}"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "enabled"
msgstr ""
msgid "encrypted: needs to be a :required, :optional or :migrating!"
msgstr ""
-msgid "ending with MIME type format is not allowed."
+msgid "ending with a reserved file extension is not allowed."
msgstr ""
msgid "entries cannot be larger than 255 characters"
@@ -39564,6 +40108,9 @@ msgstr ""
msgid "estimateCommand|%{slash_command} overwrites the total estimated time."
msgstr ""
+msgid "example.com"
+msgstr ""
+
msgid "exceeds the limit of %{bytes} bytes"
msgstr ""
@@ -39614,9 +40161,6 @@ msgstr ""
msgid "fork"
msgstr ""
-msgid "fork this project"
-msgstr ""
-
msgid "from"
msgstr ""
@@ -39625,6 +40169,9 @@ msgid_plural "from %d jobs"
msgstr[0] ""
msgstr[1] ""
+msgid "frontmatter"
+msgstr ""
+
msgid "group"
msgstr ""
@@ -39652,6 +40199,9 @@ msgstr ""
msgid "has been completed."
msgstr ""
+msgid "has too deep level of nesting"
+msgstr ""
+
msgid "help"
msgstr ""
@@ -39685,9 +40235,21 @@ msgstr ""
msgid "in"
msgstr ""
+msgid "in Infrastructure :: Kubernetes clusters"
+msgstr ""
+
+msgid "in all GitLab"
+msgstr ""
+
+msgid "in group"
+msgstr ""
+
msgid "in group %{link_to_group}"
msgstr ""
+msgid "in project"
+msgstr ""
+
msgid "in project %{link_to_project}"
msgstr ""
@@ -39729,16 +40291,19 @@ msgstr ""
msgid "is not a valid X509 certificate."
msgstr ""
-msgid "is not allowed since the group is not top-level group."
+msgid "is not allowed for sign-up."
msgstr ""
-msgid "is not allowed. Try again with a different email address, or contact your GitLab admin."
+msgid "is not allowed for this group."
msgstr ""
-msgid "is not allowed. We do not currently support project-level iterations"
+msgid "is not allowed for this project."
+msgstr ""
+
+msgid "is not allowed since the group is not top-level group."
msgstr ""
-msgid "is not from an allowed domain."
+msgid "is not allowed. We do not currently support project-level iterations"
msgstr ""
msgid "is not in the group enforcing Group Managed Account"
@@ -39831,6 +40396,9 @@ msgstr ""
msgid "log in"
msgstr ""
+msgid "managed"
+msgstr ""
+
msgid "manual"
msgstr ""
@@ -39878,6 +40446,9 @@ msgstr ""
msgid "mrWidget| Please restore it or use a different %{missingBranchName} branch"
msgstr ""
+msgid "mrWidget|%{linkStart}Set up now%{linkEnd} to analyze your source code for known security vulnerabilities."
+msgstr ""
+
msgid "mrWidget|%{mergeError}."
msgstr ""
@@ -39958,6 +40529,9 @@ msgid_plural "mrWidget|Closes issues"
msgstr[0] ""
msgstr[1] ""
+msgid "mrWidget|Create issue to resolve all threads"
+msgstr ""
+
msgid "mrWidget|Delete source branch"
msgstr ""
@@ -39967,12 +40541,18 @@ msgstr ""
msgid "mrWidget|Did not close"
msgstr ""
+msgid "mrWidget|Dismiss"
+msgstr ""
+
msgid "mrWidget|Email patches"
msgstr ""
msgid "mrWidget|Failed to load deployment statistics"
msgstr ""
+msgid "mrWidget|Hide %{widget} details"
+msgstr ""
+
msgid "mrWidget|If the %{missingBranchName} branch exists in your local repository, you can merge this merge request manually using the command line"
msgstr ""
@@ -40068,9 +40648,6 @@ msgstr ""
msgid "mrWidget|Request to merge"
msgstr ""
-msgid "mrWidget|Resolve all threads in new issue"
-msgstr ""
-
msgid "mrWidget|Resolve conflicts"
msgstr ""
@@ -40086,6 +40663,9 @@ msgstr ""
msgid "mrWidget|Revoke approval"
msgstr ""
+msgid "mrWidget|SAST and Secret Detection is not enabled."
+msgstr ""
+
msgid "mrWidget|Set by %{merge_author} to be added to the merge train when the pipeline succeeds"
msgstr ""
@@ -40095,6 +40675,9 @@ msgstr ""
msgid "mrWidget|Set by %{merge_author} to start a merge train when the pipeline succeeds"
msgstr ""
+msgid "mrWidget|Show %{widget} details"
+msgstr ""
+
msgid "mrWidget|The changes were merged into"
msgstr ""
@@ -40107,6 +40690,9 @@ msgstr ""
msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure, or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
msgstr ""
+msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure."
+msgstr ""
+
msgid "mrWidget|The source branch has been deleted"
msgstr ""
@@ -40149,6 +40735,9 @@ msgstr ""
msgid "mrWidget|You can merge after removing denied licenses"
msgstr ""
+msgid "mrWidget|You can only merge once this merge request is approved."
+msgstr ""
+
msgid "mrWidget|Your password"
msgstr ""
@@ -40185,6 +40774,9 @@ msgstr ""
msgid "must be less than the limit of %{tag_limit} tags"
msgstr ""
+msgid "must be set for a project namespace"
+msgstr ""
+
msgid "must be unique by status and elapsed time within a policy"
msgstr ""
@@ -40294,6 +40886,9 @@ msgstr ""
msgid "pipeline"
msgstr ""
+msgid "pipeline schedules documentation"
+msgstr ""
+
msgid "pod_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
msgstr ""
@@ -40343,16 +40938,25 @@ msgstr ""
msgid "project name"
msgstr ""
+msgid "project namespace cannot be the parent of another namespace"
+msgstr ""
+
msgid "projects"
msgstr ""
msgid "quick actions"
msgstr ""
-msgid "reCAPTCHA Private Key"
+msgid "reCAPTCHA"
+msgstr ""
+
+msgid "reCAPTCHA helps prevent credential stuffing."
msgstr ""
-msgid "reCAPTCHA Site Key"
+msgid "reCAPTCHA private key"
+msgstr ""
+
+msgid "reCAPTCHA site key"
msgstr ""
msgid "recent activity"
@@ -40579,6 +41183,9 @@ msgstr ""
msgid "user avatar"
msgstr ""
+msgid "user namespace cannot be the parent of another namespace"
+msgstr ""
+
msgid "user preferences"
msgstr ""
@@ -40671,3 +41278,9 @@ msgstr ""
msgid "your settings"
msgstr ""
+msgid "{group}"
+msgstr ""
+
+msgid "{project}"
+msgstr ""
+
diff --git a/locale/it/gitlab.po b/locale/it/gitlab.po
index 14842248cbc..2193c3d525a 100644
--- a/locale/it/gitlab.po
+++ b/locale/it/gitlab.po
@@ -14,10 +14,7 @@ msgstr ""
"X-Crowdin-Language: it\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-09-01 22:33\n"
-
-msgid " %{name}, confirm your email address now! "
-msgstr ""
+"PO-Revision-Date: 2021-10-04 20:21\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -92,6 +89,16 @@ msgstr ""
msgid "#general, #development"
msgstr ""
+msgid "%d Alert"
+msgid_plural "%d Alerts"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d Alert:"
+msgid_plural "%d Alerts:"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d Approval"
msgid_plural "%d Approvals"
msgstr[0] ""
@@ -455,8 +462,11 @@ msgstr ""
msgid "%{code_open}Protected:%{code_close} Only exposed to protected branches or tags."
msgstr ""
-msgid "%{commit_author_link} authored %{commit_timeago}"
-msgstr "%{commit_author_link} fatto %{commit_timeago}"
+msgid "%{commit_author_link} authored %{commit_authored_timeago}"
+msgstr ""
+
+msgid "%{commit_author_link} authored %{commit_authored_timeago} and %{commit_committer_avatar} %{commit_committer_link} committed %{commit_committer_timeago}"
+msgstr ""
msgid "%{completedCount} completed weight"
msgstr ""
@@ -549,6 +559,15 @@ msgstr ""
msgid "%{doc_link_start}Advanced search%{doc_link_end} is enabled."
msgstr ""
+msgid "%{docs_link_start}Learn about visibility levels.%{docs_link_end}"
+msgstr ""
+
+msgid "%{docs_link_start}What is Large File Storage?%{docs_link_end}"
+msgstr ""
+
+msgid "%{docs_link_start}What is two-factor authentication?%{docs_link_end}"
+msgstr ""
+
msgid "%{due_date} (Past due)"
msgstr ""
@@ -621,9 +640,6 @@ msgstr "%{issuableType} sarà rimosso! Sei sicuro?"
msgid "%{issueType} actions"
msgstr ""
-msgid "%{issuesCount} issues with a limit of %{maxIssueCount}"
-msgstr ""
-
msgid "%{issuesSize} with a limit of %{maxIssueCount}"
msgstr ""
@@ -681,6 +697,12 @@ msgstr ""
msgid "%{label_for_message} unavailable"
msgstr "%{label_for_message} non disponibile"
+msgid "%{learn_more_link}."
+msgstr ""
+
+msgid "%{lessThan} 1 hour"
+msgstr ""
+
msgid "%{lets_encrypt_link_start}Let's Encrypt%{lets_encrypt_link_end} is a free, automated, and open certificate authority (CA) that issues digital certificates to enable HTTPS (SSL/TLS) for sites."
msgstr ""
@@ -693,15 +715,15 @@ msgstr ""
msgid "%{link_start}Learn more%{link_end} about roles."
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
-msgstr ""
-
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
msgstr ""
msgid "%{link_start}Start the title with %{draft_snippet}%{link_end} to prevent a merge request that is a work in progress from being merged before it's ready."
msgstr ""
+msgid "%{link_start}What information does GitLab Inc. collect?%{link_end}"
+msgstr ""
+
msgid "%{listToShow}, and %{awardsListLength} more"
msgstr ""
@@ -854,7 +876,7 @@ msgid_plural "%{securityScanner} results are not available because a pipeline ha
msgstr[0] ""
msgstr[1] ""
-msgid "%{service_ping_link_start}Learn more%{service_ping_link_end} about what information is shared with GitLab Inc."
+msgid "%{service_ping_link_start}What information is shared with GitLab Inc.?%{service_ping_link_end}"
msgstr ""
msgid "%{size} %{unit}"
@@ -890,6 +912,9 @@ msgstr ""
msgid "%{state} epics"
msgstr "%{state} epici"
+msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
+msgstr ""
+
msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
msgstr ""
@@ -949,11 +974,6 @@ msgstr ""
msgid "%{template_project_id} is unknown or invalid"
msgstr ""
-msgid "%{text} %{files}"
-msgid_plural "%{text} %{files} files"
-msgstr[0] "%{text}%{files}"
-msgstr[1] "%{text}%{files} file"
-
msgid "%{text} is available"
msgstr "%{text} è disponibile"
@@ -1038,9 +1058,6 @@ msgstr ""
msgid "%{wildcards_link_start}Wildcards%{wildcards_link_end} such as %{code_tag_start}v*%{code_tag_end} or %{code_tag_start}*-release%{code_tag_end} are supported."
msgstr ""
-msgid "&lt; 1 hour"
-msgstr ""
-
msgid "'%{data}' at %{location} does not match format: %{format}"
msgstr ""
@@ -1124,9 +1141,6 @@ msgstr ""
msgid "(we need your current password to confirm your changes)"
msgstr ""
-msgid "* * * * *"
-msgstr ""
-
msgid "+ %{amount} more"
msgstr ""
@@ -1193,10 +1207,10 @@ msgstr "- riduci"
msgid "."
msgstr ""
-msgid "0 bytes"
+msgid "/"
msgstr ""
-msgid "0 for unlimited, only effective with remote storage enabled."
+msgid "0 bytes"
msgstr ""
msgid "0t1DgySidms"
@@ -1326,6 +1340,9 @@ msgstr "10-19 contributi"
msgid "1000+"
msgstr ""
+msgid "192.168.0.0/24"
+msgstr ""
+
msgid "1st contribution!"
msgstr "Primo contributo!"
@@ -1479,9 +1496,6 @@ msgstr ""
msgid "A plain HTML site that uses Netlify for CI/CD instead of GitLab, but still with all the other great GitLab features"
msgstr ""
-msgid "A plain-text response to show to clients that hit the rate limit."
-msgstr ""
-
msgid "A platform value can be web, mob or app."
msgstr ""
@@ -1563,7 +1577,7 @@ msgstr ""
msgid "APIFuzzing|Configure HTTP basic authentication values. Other authentication methods are supported. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
+msgid "APIFuzzing|Customize your project's API fuzzing configuration options and copy the code snippet to your .gitlab-ci.yml file to apply any changes. Note that this tool does not reflect or update your .gitlab-ci.yml file automatically. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
msgstr ""
msgid "APIFuzzing|Enable authentication"
@@ -1626,9 +1640,6 @@ msgstr ""
msgid "APIFuzzing|To prevent a security leak, authentication info must be added as a %{ciVariablesLinkStart}CI variable%{ciVariablesLinkEnd}. As a user with maintainer access rights, you can manage CI variables in the %{ciSettingsLinkStart}Settings%{ciSettingsLinkEnd} area."
msgstr ""
-msgid "APIFuzzing|Use this tool to generate API fuzzing configuration YAML to copy into your .gitlab-ci.yml file. This tool does not reflect or update your .gitlab-ci.yml file automatically."
-msgstr ""
-
msgid "APIFuzzing|Username for basic authentication"
msgstr ""
@@ -1680,9 +1691,6 @@ msgstr ""
msgid "Abuse reports notification email"
msgstr ""
-msgid "Abuse reports will be sent to this address if it is set. Abuse reports are always available in the admin area."
-msgstr ""
-
msgid "Accept invitation"
msgstr ""
@@ -1719,12 +1727,18 @@ msgstr ""
msgid "Access granted"
msgstr ""
+msgid "Access key ID"
+msgstr ""
+
msgid "Access requests"
msgstr ""
msgid "Access to '%{classification_label}' not allowed"
msgstr ""
+msgid "Access tokens expire after 2 hours. A refresh token may be used at any time to generate a new access token. Non-expiring access tokens are deprecated. Clear this setting to enable backward compatibility."
+msgstr ""
+
msgid "AccessDropdown|Deploy Keys"
msgstr ""
@@ -2037,6 +2051,9 @@ msgstr ""
msgid "Add new directory"
msgstr "Aggiungi una directory (cartella)"
+msgid "Add new service account"
+msgstr ""
+
msgid "Add or remove previously merged commits"
msgstr ""
@@ -2274,6 +2291,9 @@ msgstr ""
msgid "AdminArea|Features"
msgstr ""
+msgid "AdminArea|Get security updates from GitLab and stay up to date"
+msgstr ""
+
msgid "AdminArea|Groups"
msgstr ""
@@ -2313,6 +2333,12 @@ msgstr ""
msgid "AdminArea|Reporter"
msgstr ""
+msgid "AdminArea|Sign up for the GitLab Security Newsletter to get notified for security updates."
+msgstr ""
+
+msgid "AdminArea|Sign up for the GitLab newsletter"
+msgstr ""
+
msgid "AdminArea|Stop all jobs"
msgstr ""
@@ -2382,9 +2408,15 @@ msgstr ""
msgid "AdminSettings|Disable public access to Pages sites"
msgstr ""
+msgid "AdminSettings|Display a banner on merge requests in projects with no pipelines to initiate steps to add a .gitlab-ci.yml file."
+msgstr ""
+
msgid "AdminSettings|Domain verification is an essential security measure for public GitLab sites. Users are required to demonstrate they control a domain before it is enabled. %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "AdminSettings|Enable pipeline suggestion banner"
+msgstr ""
+
msgid "AdminSettings|Enable shared runners for new projects"
msgstr ""
@@ -2856,10 +2888,10 @@ msgstr ""
msgid "Admin|Quarterly reconciliation will occur on %{qrtlyDate}"
msgstr ""
-msgid "Admin|The number of max seats used for your namespace is currently exceeding the number of seats in your subscription. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgid "Admin|The number of max seats in your namespace exceeds the number of seats in your subscription. On %{qrtlyDate}, quarterly reconciliation occurs and you are automatically billed a prorated amount for the overage. No action is needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice. For more information about the timing of the invoicing process, view the documentation."
msgstr ""
-msgid "Admin|The number of maximum users for your instance is currently exceeding the number of users in license. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgid "Admin|The number of max users in your instance exceeds the number of users in your license. On %{qrtlyDate}, quarterly reconciliation occurs and you are automatically billed a prorated amount for the overage. No action is needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice. For more information about the timing of the invoicing process, view the documentation."
msgstr ""
msgid "Admin|View pending user approvals"
@@ -2880,9 +2912,6 @@ msgstr ""
msgid "Advanced export options"
msgstr ""
-msgid "Advanced permissions, Large File Storage and Two-Factor authentication settings."
-msgstr ""
-
msgid "After a successful password update you will be redirected to login screen."
msgstr ""
@@ -2901,13 +2930,14 @@ msgstr ""
msgid "After you've reviewed these contribution guidelines, you'll be all set to"
msgstr ""
+msgid "Akismet"
+msgstr ""
+
msgid "Akismet API Key"
msgstr ""
-msgid "Alert"
-msgid_plural "Alerts"
-msgstr[0] ""
-msgstr[1] ""
+msgid "Akismet helps prevent the creation of spam issues in public projects."
+msgstr ""
msgid "AlertManagement|Acknowledged"
msgstr ""
@@ -3263,6 +3293,9 @@ msgstr ""
msgid "All (default)"
msgstr ""
+msgid "All GitLab"
+msgstr ""
+
msgid "All Members"
msgstr ""
@@ -3377,6 +3410,9 @@ msgstr ""
msgid "Allow this secondary node to replicate content on Object Storage"
msgstr ""
+msgid "Allow use of licensed EE features"
+msgstr ""
+
msgid "Allow users to dismiss the broadcast message"
msgstr ""
@@ -3452,9 +3488,6 @@ msgstr ""
msgid "Amazon authentication is not %{link_start}correctly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
-msgid "Amount of time (in hours) that users are allowed to skip forced configuration of two-factor authentication"
-msgstr ""
-
msgid "An %{link_start}alert%{link_end} with the same fingerprint is already open. To change the status of this alert, resolve the linked alert."
msgstr ""
@@ -3515,12 +3548,6 @@ msgstr ""
msgid "An error occurred when removing the label."
msgstr ""
-msgid "An error occurred when toggling the notification subscription"
-msgstr "Errore durante l'attivazione/disattivazione della sottoscrizione per l'iscrizione"
-
-msgid "An error occurred when updating the issue weight"
-msgstr ""
-
msgid "An error occurred when updating the title"
msgstr ""
@@ -3569,6 +3596,9 @@ msgstr ""
msgid "An error occurred while enabling Service Desk."
msgstr ""
+msgid "An error occurred while fetching Markdown preview"
+msgstr ""
+
msgid "An error occurred while fetching ancestors"
msgstr ""
@@ -3599,9 +3629,6 @@ msgstr ""
msgid "An error occurred while fetching label colors."
msgstr ""
-msgid "An error occurred while fetching markdown preview"
-msgstr ""
-
msgid "An error occurred while fetching participants"
msgstr ""
@@ -3617,9 +3644,6 @@ msgstr ""
msgid "An error occurred while fetching reference"
msgstr ""
-msgid "An error occurred while fetching sidebar data"
-msgstr "Errore durante il recupero dei dati della barra laterale"
-
msgid "An error occurred while fetching tags. Retry the search."
msgstr ""
@@ -3695,6 +3719,9 @@ msgstr ""
msgid "An error occurred while loading merge requests."
msgstr ""
+msgid "An error occurred while loading projects."
+msgstr ""
+
msgid "An error occurred while loading the Needs tab."
msgstr ""
@@ -3929,12 +3956,6 @@ msgstr ""
msgid "Any Milestone"
msgstr ""
-msgid "Any branch"
-msgstr ""
-
-msgid "Any eligible user"
-msgstr ""
-
msgid "Any encrypted tokens"
msgstr ""
@@ -3953,6 +3974,9 @@ msgstr ""
msgid "Any namespace"
msgstr ""
+msgid "App Engine description and apps that are suitable for this deployment target"
+msgstr ""
+
msgid "App ID"
msgstr ""
@@ -4101,6 +4125,11 @@ msgstr ""
msgid "Apply"
msgstr ""
+msgid "Apply %d suggestion"
+msgid_plural "Apply %d suggestions"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Apply a label"
msgstr ""
@@ -4110,13 +4139,10 @@ msgstr ""
msgid "Apply suggestion"
msgstr ""
-msgid "Apply suggestions"
-msgstr ""
-
msgid "Apply template"
msgstr ""
-msgid "Apply this approval rule to any branch or a specific protected branch."
+msgid "Apply this approval rule to all branches or a specific protected branch."
msgstr ""
msgid "Applying"
@@ -4259,9 +4285,6 @@ msgstr ""
msgid "ApprovalSettings|Prevent editing approval rules in projects and merge requests."
msgstr ""
-msgid "ApprovalSettings|Prevent editing approval rules in projects and merge requests. "
-msgstr ""
-
msgid "ApprovalSettings|Remove all approvals when commits are added to the source branch."
msgstr ""
@@ -4277,6 +4300,9 @@ msgstr ""
msgid "ApprovalSettings|This setting is configured at the instance level and can only be changed by an administrator."
msgstr ""
+msgid "ApprovalSettings|This setting is configured in %{groupName} and can only be changed by an administrator or group owner."
+msgstr ""
+
msgid "ApprovalStatusTooltip|Adheres to separation of duties"
msgstr ""
@@ -4763,9 +4789,6 @@ msgstr ""
msgid "Authenticated API rate limit period in seconds"
msgstr ""
-msgid "Authenticated API request rate limit"
-msgstr ""
-
msgid "Authenticated API requests"
msgstr ""
@@ -4775,10 +4798,10 @@ msgstr ""
msgid "Authenticated Git LFS request rate limit"
msgstr ""
-msgid "Authenticated web rate limit period in seconds"
+msgid "Authenticated Git LFS requests"
msgstr ""
-msgid "Authenticated web request rate limit"
+msgid "Authenticated web rate limit period in seconds"
msgstr ""
msgid "Authenticated web requests"
@@ -5156,9 +5179,6 @@ msgstr ""
msgid "Below you will find all the groups that are public."
msgstr ""
-msgid "Beta"
-msgstr ""
-
msgid "Bi-weekly code coverage"
msgstr ""
@@ -5398,6 +5418,21 @@ msgstr ""
msgid "Board scope affects which issues are displayed for anyone who visits this board"
msgstr ""
+msgid "BoardNewEpic|Groups"
+msgstr ""
+
+msgid "BoardNewEpic|Loading groups"
+msgstr ""
+
+msgid "BoardNewEpic|No matching results"
+msgstr ""
+
+msgid "BoardNewEpic|Search groups"
+msgstr ""
+
+msgid "BoardNewEpic|Select a group"
+msgstr ""
+
msgid "BoardNewIssue|No matching results"
msgstr ""
@@ -5475,6 +5510,9 @@ msgstr ""
msgid "Boards|An error occurred while creating the list. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching child groups. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching group projects. Please try again."
msgstr ""
@@ -5807,6 +5845,9 @@ msgstr ""
msgid "Bulk update"
msgstr ""
+msgid "BulkImports|Re-import creates a new group. It does not sync with the existing group."
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -5816,6 +5857,9 @@ msgstr ""
msgid "BulkImport|From source group"
msgstr ""
+msgid "BulkImport|Group import history"
+msgstr ""
+
msgid "BulkImport|Import failed: Destination cannot be a subgroup of the source group. Change the destination and try again."
msgstr ""
@@ -5828,9 +5872,18 @@ msgstr ""
msgid "BulkImport|Importing the group failed"
msgstr ""
+msgid "BulkImport|Last imported to %{link}"
+msgstr ""
+
msgid "BulkImport|Name already exists."
msgstr ""
+msgid "BulkImport|New group"
+msgstr ""
+
+msgid "BulkImport|No history is available"
+msgstr ""
+
msgid "BulkImport|No parent"
msgstr ""
@@ -5843,6 +5896,9 @@ msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} matching filter \"%{filter}\" from %{link}"
msgstr ""
+msgid "BulkImport|Source group"
+msgstr ""
+
msgid "BulkImport|To new group"
msgstr ""
@@ -5852,6 +5908,9 @@ msgstr ""
msgid "BulkImport|You have no groups to import"
msgstr ""
+msgid "BulkImport|Your imported groups will appear here."
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -6094,6 +6153,9 @@ msgstr ""
msgid "Can be manually deployed to"
msgstr ""
+msgid "Can be overridden in each project."
+msgstr ""
+
msgid "Can create groups:"
msgstr ""
@@ -6196,6 +6258,9 @@ msgstr ""
msgid "Cancelling Preview"
msgstr ""
+msgid "Cannot assign a confidential epic to a non-confidential issue. Make the issue confidential and try again"
+msgstr ""
+
msgid "Cannot be assigned to other projects."
msgstr ""
@@ -6247,9 +6312,6 @@ msgstr ""
msgid "Cannot refer to a group %{timebox_type} by an internal id!"
msgstr ""
-msgid "Cannot set confidential epic for a non-confidential issue"
-msgstr ""
-
msgid "Cannot show preview. For previews on sketch files, they must have the file format introduced by Sketch version 43 and above."
msgstr ""
@@ -6487,15 +6549,15 @@ msgstr ""
msgid "Check out, review, and merge locally"
msgstr ""
-msgid "Check the %{docs_link_start}documentation%{docs_link_end}."
-msgstr ""
-
msgid "Check the current instance configuration "
msgstr ""
msgid "Check the elasticsearch.log file to debug why the migration was halted and make any changes before retrying the migration. When you fix the cause of the failure, click \"Retry migration\", and the migration will be scheduled to be retried in the background."
msgstr ""
+msgid "Check with your administrator."
+msgstr ""
+
msgid "Check your Docker images for known vulnerabilities."
msgstr ""
@@ -6526,6 +6588,9 @@ msgstr ""
msgid "Checkout"
msgstr ""
+msgid "Checkout|$%{selectedPlanPrice} per 10 GB storage per pack"
+msgstr ""
+
msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 minutes"
msgstr ""
@@ -6546,17 +6611,23 @@ msgstr ""
msgid "Checkout|%{name}'s GitLab subscription"
msgstr ""
-msgid "Checkout|%{selectedPlanText} plan"
+msgid "Checkout|%{name}'s storage subscription"
msgstr ""
-msgid "Checkout|%{startDate} - %{endDate}"
+msgid "Checkout|%{quantity} GB of storage"
msgstr ""
-msgid "Checkout|%{totalCiMinutes} CI minute"
-msgid_plural "Checkout|%{totalCiMinutes} CI minutes"
+msgid "Checkout|%{quantity} storage pack"
+msgid_plural "Checkout|%{quantity} storage packs"
msgstr[0] ""
msgstr[1] ""
+msgid "Checkout|%{selectedPlanText} plan"
+msgstr ""
+
+msgid "Checkout|%{startDate} - %{endDate}"
+msgstr ""
+
msgid "Checkout|%{totalCiMinutes} CI minutes"
msgstr ""
@@ -6632,6 +6703,9 @@ msgstr ""
msgid "Checkout|Failed to register credit card. Please try again."
msgstr ""
+msgid "Checkout|GB"
+msgstr ""
+
msgid "Checkout|GitLab group"
msgstr ""
@@ -6668,6 +6742,9 @@ msgstr ""
msgid "Checkout|State"
msgstr ""
+msgid "Checkout|Storage packs"
+msgstr ""
+
msgid "Checkout|Street address"
msgstr ""
@@ -6689,6 +6766,9 @@ msgstr ""
msgid "Checkout|Total minutes: %{quantity}"
msgstr ""
+msgid "Checkout|Total storage: %{quantity} GB"
+msgstr ""
+
msgid "Checkout|Users"
msgstr ""
@@ -6698,16 +6778,25 @@ msgstr ""
msgid "Checkout|Your organization"
msgstr ""
+msgid "Checkout|Your storage subscription has the same term as your main subscription, and the price is prorated accordingly."
+msgstr ""
+
msgid "Checkout|Your subscription will be applied to this group"
msgstr ""
msgid "Checkout|Zip code"
msgstr ""
+msgid "Checkout|a storage subscription"
+msgstr ""
+
msgid "Checkout|company or team"
msgstr ""
-msgid "Checkout|x 1,000 minutes per pack = %{strong}"
+msgid "Checkout|minutes"
+msgstr ""
+
+msgid "Checkout|x %{quantity} %{units} per pack ="
msgstr ""
msgid "Cherry-pick this commit"
@@ -7064,6 +7153,9 @@ msgstr ""
msgid "CloneIssue|Cannot clone issue to target project as it is pending deletion."
msgstr ""
+msgid "CloneIssue|Cannot clone issues of '%{issue_type}' type."
+msgstr ""
+
msgid "Cloned this issue to %{path_to_project}."
msgstr ""
@@ -7118,7 +7210,10 @@ msgstr ""
msgid "Closes this %{quick_action_target}."
msgstr ""
-msgid "Cloud licenses can not be removed."
+msgid "Cloud Functions description and apps that are suitable for this deployment target"
+msgstr ""
+
+msgid "Cloud Run description and apps that are suitable for this deployment target"
msgstr ""
msgid "Cluster"
@@ -7145,6 +7240,12 @@ msgstr ""
msgid "ClusterAgents|Access tokens"
msgstr ""
+msgid "ClusterAgents|Agent might not be connected to GitLab"
+msgstr ""
+
+msgid "ClusterAgents|Agent never connected to GitLab"
+msgstr ""
+
msgid "ClusterAgents|Alternative installation methods"
msgstr ""
@@ -7160,6 +7261,12 @@ msgstr ""
msgid "ClusterAgents|Configuration"
msgstr ""
+msgid "ClusterAgents|Connected"
+msgstr ""
+
+msgid "ClusterAgents|Connection status"
+msgstr ""
+
msgid "ClusterAgents|Copy token"
msgstr ""
@@ -7178,6 +7285,9 @@ msgstr ""
msgid "ClusterAgents|For alternative installation methods %{linkStart}go to the documentation%{linkEnd}."
msgstr ""
+msgid "ClusterAgents|For more troubleshooting information go to"
+msgstr ""
+
msgid "ClusterAgents|Go to the repository"
msgstr ""
@@ -7193,18 +7303,30 @@ msgstr ""
msgid "ClusterAgents|Integrate with the GitLab Agent"
msgstr ""
-msgid "ClusterAgents|Last used"
+msgid "ClusterAgents|Last connected %{timeAgo}."
+msgstr ""
+
+msgid "ClusterAgents|Last contact"
msgstr ""
msgid "ClusterAgents|Learn how to create an agent access token"
msgstr ""
+msgid "ClusterAgents|Make sure you are using a valid token."
+msgstr ""
+
msgid "ClusterAgents|Name"
msgstr ""
msgid "ClusterAgents|Never"
msgstr ""
+msgid "ClusterAgents|Never connected"
+msgstr ""
+
+msgid "ClusterAgents|Not connected"
+msgstr ""
+
msgid "ClusterAgents|Read more about getting started"
msgstr ""
@@ -7226,6 +7348,9 @@ msgstr ""
msgid "ClusterAgents|Select which Agent you want to install"
msgstr ""
+msgid "ClusterAgents|The Agent has not been connected in a long time. There might be a connectivity issue. Last contact was %{timeAgo}."
+msgstr ""
+
msgid "ClusterAgents|The GitLab Agent also requires %{linkStart}enabling the Agent Server%{linkEnd}"
msgstr ""
@@ -7253,9 +7378,6 @@ msgstr ""
msgid "ClusterAgents|You will need to create a token to connect to your agent"
msgstr ""
-msgid "ClusterAgent|This feature is only available for premium plans"
-msgstr ""
-
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -7445,9 +7567,6 @@ msgstr ""
msgid "ClusterIntegration|Create Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Create a provision role on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the account and external ID above. %{startMoreInfoLink}More information%{endLink}"
-msgstr ""
-
msgid "ClusterIntegration|Create cluster on"
msgstr ""
@@ -7880,7 +7999,7 @@ msgstr ""
msgid "ClusterIntegration|Subnets"
msgstr ""
-msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provisioned role, first create one on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the above account and external IDs. %{startMoreInfoLink}More information%{endLink}"
+msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provisioned role, first create one on %{awsLinkStart}Amazon Web Services %{awsLinkEnd} using the above account and external IDs. %{moreInfoStart}More information%{moreInfoEnd}"
msgstr ""
msgid "ClusterIntegration|The Kubernetes certificate used to authenticate to the cluster."
@@ -8114,6 +8233,9 @@ msgstr ""
msgid "Collapse replies"
msgstr ""
+msgid "Collapse settings section"
+msgstr ""
+
msgid "Collapse sidebar"
msgstr ""
@@ -8132,6 +8254,9 @@ msgstr ""
msgid "Comma-separated list of email addresses."
msgstr ""
+msgid "Comma-separated list of users allowed to exceed the rate limit."
+msgstr ""
+
msgid "Comma-separated, e.g. '1.1.1.1, 2.2.2.0/24'"
msgstr ""
@@ -8452,6 +8577,9 @@ msgstr ""
msgid "Configure %{repository_checks_link_start}repository checks%{link_end} and %{housekeeping_link_start}housekeeping%{link_end} on repositories."
msgstr ""
+msgid "Configure CAPTCHAs, IP address limits, and other anti-spam measures."
+msgstr ""
+
msgid "Configure Dependency Scanning in `.gitlab-ci.yml` using the GitLab managed template. You can [add variable overrides](https://docs.gitlab.com/ee/user/application_security/dependency_scanning/#customizing-the-dependency-scanning-settings) to customize Dependency Scanning settings."
msgstr ""
@@ -8488,16 +8616,13 @@ msgstr ""
msgid "Configure a %{codeStart}.gitlab-webide.yml%{codeEnd} file in the %{codeStart}.gitlab%{codeEnd} directory to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
msgstr ""
-msgid "Configure existing installation"
-msgstr ""
-
-msgid "Configure limit for notes created per minute by web and API requests."
+msgid "Configure advanced permissions, Large File Storage, and two-factor authentication settings."
msgstr ""
-msgid "Configure limits for Project/Group Import/Export."
+msgid "Configure approvals by authors and committers on all projects."
msgstr ""
-msgid "Configure limits for web and API requests."
+msgid "Configure existing installation"
msgstr ""
msgid "Configure paths to be protected by Rack Attack."
@@ -8512,10 +8637,13 @@ msgstr ""
msgid "Configure settings for Advanced Search with Elasticsearch."
msgstr ""
+msgid "Configure specific limits for Files API requests that supersede the general user and IP rate limits."
+msgstr ""
+
msgid "Configure specific limits for Git LFS requests that supersede the general user and IP rate limits."
msgstr ""
-msgid "Configure specific limits for Packages API requests that supersede the general user and IP rate limits."
+msgid "Configure specific limits for deprecated API requests that supersede the general user and IP rate limits."
msgstr ""
msgid "Configure the %{link} integration."
@@ -8527,6 +8655,9 @@ msgstr ""
msgid "Configure the way a user creates a new account."
msgstr ""
+msgid "Configure via Merge Request"
+msgstr ""
+
msgid "Configure which lists are shown for anyone who visits this board"
msgstr ""
@@ -8995,6 +9126,9 @@ msgstr ""
msgid "Content parsed with %{link}."
msgstr ""
+msgid "ContentEditor|Table of Contents"
+msgstr ""
+
msgid "ContentEditor|You have to provide a renderMarkdown function or a custom serializer"
msgstr ""
@@ -9181,6 +9315,9 @@ msgstr ""
msgid "Copy link to chart"
msgstr ""
+msgid "Copy prefix"
+msgstr ""
+
msgid "Copy reference"
msgstr ""
@@ -9211,6 +9348,9 @@ msgstr ""
msgid "Copy value"
msgstr ""
+msgid "Corpus Management"
+msgstr ""
+
msgid "Corpus Management|Are you sure you want to delete the corpus?"
msgstr ""
@@ -9439,6 +9579,9 @@ msgstr ""
msgid "Create commit"
msgstr ""
+msgid "Create common files more quickly, and standardize their format."
+msgstr ""
+
msgid "Create confidential merge request"
msgstr ""
@@ -9472,6 +9615,9 @@ msgstr ""
msgid "Create issue"
msgstr ""
+msgid "Create issue to resolve all threads"
+msgstr ""
+
msgid "Create iteration"
msgstr ""
@@ -9482,7 +9628,7 @@ msgid "Create lists from labels. Issues with that label appear in that list."
msgstr ""
msgid "Create merge request"
-msgstr "Crea una richiesta di merge"
+msgstr ""
msgid "Create merge request and branch"
msgstr ""
@@ -9526,6 +9672,9 @@ msgstr ""
msgid "Create new..."
msgstr "Crea nuovo..."
+msgid "Create or import your first project"
+msgstr ""
+
msgid "Create project"
msgstr ""
@@ -9883,7 +10032,7 @@ msgstr ""
msgid "Custom notification events"
msgstr "Eventi-Notifica personalizzati"
-msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notificationLinkStart} notification emails%{notificationLinkEnd}."
+msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notificationLinkStart}notification emails%{notificationLinkEnd}."
msgstr ""
msgid "Custom project templates"
@@ -10016,7 +10165,7 @@ msgid "CycleAnalyticsStage|Issue"
msgstr "Issue"
msgid "CycleAnalyticsStage|Plan"
-msgstr "Pianificazione"
+msgstr ""
msgid "CycleAnalyticsStage|Review"
msgstr "Revisione"
@@ -10082,10 +10231,10 @@ msgid_plural "CycleAnalytics|Showing %{subjectFilterText} and %{selectedLabelsCo
msgstr[0] ""
msgstr[1] ""
-msgid "CycleAnalytics|Showing data for group '%{groupName}' and %{selectedProjectCount} projects from %{startDate} to %{endDate}"
+msgid "CycleAnalytics|Showing data for group '%{groupName}' and %{selectedProjectCount} projects from %{createdAfter} to %{createdBefore}"
msgstr ""
-msgid "CycleAnalytics|Showing data for group '%{groupName}' from %{startDate} to %{endDate}"
+msgid "CycleAnalytics|Showing data for group '%{groupName}' from %{createdAfter} to %{createdBefore}"
msgstr ""
msgid "CycleAnalytics|Stages"
@@ -10319,6 +10468,9 @@ msgstr ""
msgid "DastProfiles|Manage profiles"
msgstr ""
+msgid "DastProfiles|Manage site profiles"
+msgstr ""
+
msgid "DastProfiles|Minimum = 0 (no timeout enabled), Maximum = 2880 minutes"
msgstr ""
@@ -10394,6 +10546,9 @@ msgstr ""
msgid "DastProfiles|Scanner name"
msgstr ""
+msgid "DastProfiles|Schedule"
+msgstr ""
+
msgid "DastProfiles|Select branch"
msgstr ""
@@ -10463,7 +10618,7 @@ msgstr ""
msgid "DastProfiles|Website"
msgstr ""
-msgid "DastProfiles|You can either choose a passive scan or validate the target site in your chosen site profile. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
+msgid "DastProfiles|You can either choose a passive scan or validate the target site from the site profile management page. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
msgstr ""
msgid "DastProfiles|You cannot run an active scan against an unvalidated site."
@@ -10636,7 +10791,7 @@ msgstr ""
msgid "Days to merge"
msgstr ""
-msgid "Deactivate dormant users after 90 days of inactivity. Users can return to active status by signing in to their account. While inactive, a user is not counted as an active user in the instance."
+msgid "Deactivate dormant users after 90 days of inactivity"
msgstr ""
msgid "Dear Administrator,"
@@ -10723,10 +10878,10 @@ msgstr ""
msgid "Define a custom pattern with cron syntax"
msgstr "Definisci un patter personalizzato mediante la sintassi cron"
-msgid "Define approval settings."
+msgid "Define approval rules."
msgstr ""
-msgid "Define approval settings. %{linkStart}Learn more.%{linkEnd}"
+msgid "Define approval rules. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "Define custom rules for what constitutes spam, independent of Akismet"
@@ -10735,7 +10890,7 @@ msgstr ""
msgid "Define environments in the deploy stage(s) in %{code_open}.gitlab-ci.yml%{code_close} to track deployments here."
msgstr ""
-msgid "Define how approval rules are applied as a merge request moves toward completion."
+msgid "Define how approval rules are applied to merge requests."
msgstr ""
msgid "Definition"
@@ -10750,6 +10905,12 @@ msgstr ""
msgid "DelayedJobs|Are you sure you want to run %{job_name} immediately? This job will run automatically after it's timer finishes."
msgstr ""
+msgid "DelayedJobs|Are you sure you want to run %{job_name} immediately? This job will run automatically after its timer finishes."
+msgstr ""
+
+msgid "DelayedJobs|Run the delayed job now?"
+msgstr ""
+
msgid "DelayedJobs|Start now"
msgstr ""
@@ -11026,6 +11187,12 @@ msgstr ""
msgid "Dependency proxy image prefix"
msgstr ""
+msgid "DependencyProxy|Create a local proxy for storing frequently used upstream images. %{docLinkStart}Learn more%{docLinkEnd} about dependency proxies."
+msgstr ""
+
+msgid "DependencyProxy|Dependency Proxy"
+msgstr ""
+
msgid "DependencyProxy|Toggle Dependency Proxy"
msgstr ""
@@ -11266,6 +11433,9 @@ msgstr ""
msgid "Deployments"
msgstr ""
+msgid "Deployments to Google Kubernetes Engine can be "
+msgstr ""
+
msgid "Deployments|%{deployments} environment impacted."
msgid_plural "Deployments|%{deployments} environments impacted."
msgstr[0] ""
@@ -11295,6 +11465,9 @@ msgstr ""
msgid "Deployment|success"
msgstr ""
+msgid "Deprecated API rate limits"
+msgstr ""
+
msgid "Deprioritize label"
msgstr ""
@@ -11697,6 +11870,16 @@ msgstr ""
msgid "DiffsCompareBaseBranch|(base)"
msgstr ""
+msgid "Diffs|%d addition"
+msgid_plural "Diffs|%d additions"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Diffs|%d deletion"
+msgid_plural "Diffs|%d deletions"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Diffs|No file name available"
msgstr ""
@@ -11706,9 +11889,17 @@ msgstr ""
msgid "Diffs|Show all unchanged lines"
msgstr ""
+msgid "Diffs|Showing %{dropdownStart}%{count} changed file%{dropdownEnd}"
+msgid_plural "Diffs|Showing %{dropdownStart}%{count} changed files%{dropdownEnd}"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Diffs|Something went wrong while fetching diff lines."
msgstr ""
+msgid "Diffs|with %{additions} and %{deletions}"
+msgstr ""
+
msgid "Direct member"
msgstr ""
@@ -11834,9 +12025,6 @@ msgid_plural "Dismiss %d selected vulnerabilities as"
msgstr[0] ""
msgstr[1] ""
-msgid "Dismiss Value Stream Analytics introduction box"
-msgstr ""
-
msgid "Dismiss merge request promotion"
msgstr ""
@@ -12158,6 +12346,9 @@ msgstr ""
msgid "Edit issues"
msgstr ""
+msgid "Edit merge requests"
+msgstr ""
+
msgid "Edit public deploy key"
msgstr ""
@@ -12233,6 +12424,9 @@ msgstr ""
msgid "Elastic|None. Select projects to index."
msgstr ""
+msgid "Eligible users"
+msgstr ""
+
msgid "Email"
msgstr ""
@@ -12362,6 +12556,9 @@ msgstr ""
msgid "Enable"
msgstr ""
+msgid "Enable Amazon EKS integration"
+msgstr ""
+
msgid "Enable Auto DevOps"
msgstr ""
@@ -12395,6 +12592,9 @@ msgstr ""
msgid "Enable SSL verification"
msgstr ""
+msgid "Enable Service Ping"
+msgstr ""
+
msgid "Enable Snowplow tracking"
msgstr ""
@@ -12425,6 +12625,9 @@ msgstr ""
msgid "Enable authenticated Git LFS request rate limit"
msgstr ""
+msgid "Enable authenticated web request rate limit"
+msgstr ""
+
msgid "Enable authentication"
msgstr ""
@@ -12485,7 +12688,7 @@ msgstr ""
msgid "Enable or disable the Pseudonymizer data collection."
msgstr ""
-msgid "Enable or disable version check and service ping."
+msgid "Enable or disable version check and Service Ping."
msgstr ""
msgid "Enable protected paths rate limit"
@@ -12497,18 +12700,12 @@ msgstr ""
msgid "Enable reCAPTCHA"
msgstr ""
-msgid "Enable reCAPTCHA for login"
-msgstr ""
-
-msgid "Enable reCAPTCHA, Invisible Captcha, Akismet and set IP limits. For reCAPTCHA, we currently only support %{recaptcha_v2_link_start}v2%{recaptcha_v2_link_end}"
+msgid "Enable reCAPTCHA for login."
msgstr ""
msgid "Enable repository checks"
msgstr ""
-msgid "Enable service ping"
-msgstr ""
-
msgid "Enable shared runners for all projects and subgroups in this group."
msgstr ""
@@ -12530,7 +12727,10 @@ msgstr ""
msgid "Enable unauthenticated API request rate limit"
msgstr ""
-msgid "Enable unauthenticated request rate limit"
+msgid "Enable unauthenticated web request rate limit"
+msgstr ""
+
+msgid "Enable user deactivation emails"
msgstr ""
msgid "Enable version check"
@@ -12566,9 +12766,6 @@ msgstr ""
msgid "Enabled sources for code import during project creation. OmniAuth must be configured for GitHub"
msgstr ""
-msgid "Enabling this will only make licensed EE features available to projects if the project namespace's plan includes the feature or if the project is public."
-msgstr ""
-
msgid "Encountered an error while rendering: %{err}"
msgstr ""
@@ -12617,9 +12814,6 @@ msgstr ""
msgid "Enter Admin Mode"
msgstr ""
-msgid "Enter IP address range"
-msgstr ""
-
msgid "Enter a number"
msgstr ""
@@ -12632,9 +12826,6 @@ msgstr ""
msgid "Enter at least three characters to search"
msgstr ""
-msgid "Enter domain"
-msgstr ""
-
msgid "Enter in your Bitbucket Server URL and personal access token below"
msgstr ""
@@ -12821,9 +13012,6 @@ msgstr "Rilascio"
msgid "Environments|Deployment %{status}"
msgstr ""
-msgid "Environments|Dismiss"
-msgstr ""
-
msgid "Environments|Enable review app"
msgstr ""
@@ -12836,9 +13024,6 @@ msgstr "Ambienti"
msgid "Environments|Environments are places where code gets deployed, such as staging or production."
msgstr ""
-msgid "Environments|Help us improve environments"
-msgstr ""
-
msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
msgstr ""
@@ -12875,6 +13060,9 @@ msgstr ""
msgid "Environments|Note that this action will stop the environment, but it will %{emphasisStart}not%{emphasisEnd} have an effect on any existing deployment due to no “stop environment action†being defined in the %{ciConfigLinkStart}.gitlab-ci.yml%{ciConfigLinkEnd} file."
msgstr ""
+msgid "Environments|Open"
+msgstr ""
+
msgid "Environments|Open live environment"
msgstr ""
@@ -12914,9 +13102,6 @@ msgstr ""
msgid "Environments|Stopping %{environmentName}"
msgstr ""
-msgid "Environments|Take the survey"
-msgstr ""
-
msgid "Environments|There was an error fetching the logs. Please try again."
msgstr ""
@@ -12938,9 +13123,6 @@ msgstr "Aggiornato"
msgid "Environments|You don't have any environments right now"
msgstr ""
-msgid "Environments|Your feedback helps GitLab make environments better for you and other users. Participate and enter a sweepstake to win a USD 30 gift card."
-msgstr ""
-
msgid "Environments|by %{avatar}"
msgstr ""
@@ -13223,7 +13405,7 @@ msgstr ""
msgid "Error parsing CSV file. Please make sure it has"
msgstr ""
-msgid "Error rendering markdown preview"
+msgid "Error rendering Markdown preview"
msgstr ""
msgid "Error saving label update."
@@ -13271,6 +13453,9 @@ msgstr ""
msgid "Error: %{error_message}"
msgstr ""
+msgid "Error: Couldn't load some or all of the changes."
+msgstr ""
+
msgid "Error: No AWS credentials were supplied"
msgstr ""
@@ -13304,6 +13489,9 @@ msgstr ""
msgid "ErrorTracking|Enable error tracking"
msgstr ""
+msgid "ErrorTracking|Error tracking backend"
+msgstr ""
+
msgid "ErrorTracking|If you self-host Sentry, enter your Sentry instance's full URL. If you use Sentry's hosted solution, enter https://sentry.io"
msgstr ""
@@ -13337,6 +13525,12 @@ msgstr ""
msgid "Escalation policies must have at least one rule"
msgstr ""
+msgid "EscalationPolicies|%{clockIcon} IF alert is not %{alertStatus} in %{minutes}"
+msgstr ""
+
+msgid "EscalationPolicies|%{notificationIcon} THEN %{doAction} %{forScheduleOrUser}"
+msgstr ""
+
msgid "EscalationPolicies|+ Add an additional rule"
msgstr ""
@@ -13379,13 +13573,13 @@ msgstr ""
msgid "EscalationPolicies|Escalation policies"
msgstr ""
-msgid "EscalationPolicies|Escalation rules"
+msgid "EscalationPolicies|Escalation policy %{obstacle} in Project %{project}"
msgstr ""
-msgid "EscalationPolicies|Failed to load oncall-schedules"
+msgid "EscalationPolicies|Escalation rules"
msgstr ""
-msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} %{then} THEN %{doAction} %{scheduleOrUser}"
+msgid "EscalationPolicies|Failed to load oncall-schedules"
msgstr ""
msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} minutes"
@@ -13463,18 +13657,36 @@ msgstr ""
msgid "Every %{action} attempt has failed: %{job_error_message}. Please try again."
msgstr ""
+msgid "Every 3 months"
+msgstr ""
+
+msgid "Every 3 months on the %{day} at %{time} %{timezone}"
+msgstr ""
+
+msgid "Every 6 months"
+msgstr ""
+
+msgid "Every 6 months on the %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Every day"
msgstr ""
msgid "Every day (at %{time})"
msgstr ""
+msgid "Every day at %{time} %{timezone}"
+msgstr ""
+
msgid "Every month"
msgstr ""
msgid "Every month (Day %{day} at %{time})"
msgstr ""
+msgid "Every month on the %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Every three months"
msgstr ""
@@ -13489,6 +13701,15 @@ msgstr[1] ""
msgid "Every week (%{weekday} at %{time})"
msgstr ""
+msgid "Every week on %{day} at %{time} %{timezone}"
+msgstr ""
+
+msgid "Every year"
+msgstr ""
+
+msgid "Every year on %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Everyone"
msgstr ""
@@ -13525,9 +13746,6 @@ msgstr ""
msgid "Exactly one of %{attributes} is required"
msgstr ""
-msgid "Example: %{ip_address}. %{read_more_link}."
-msgstr ""
-
msgid "Example: @sub\\.company\\.com$"
msgstr ""
@@ -13594,13 +13812,13 @@ msgstr ""
msgid "Expand pipeline"
msgstr ""
-msgid "Expand sidebar"
+msgid "Expand settings section"
msgstr ""
-msgid "Expected documents: %{expected_documents}"
+msgid "Expand sidebar"
msgstr ""
-msgid "Experienced"
+msgid "Expected documents: %{expected_documents}"
msgstr ""
msgid "ExperimentSubject|Must have exactly one of User, Namespace, or Project."
@@ -13885,9 +14103,6 @@ msgstr ""
msgid "Failed to load related branches"
msgstr ""
-msgid "Failed to load sidebar lock status"
-msgstr ""
-
msgid "Failed to load stacktrace."
msgstr ""
@@ -14312,6 +14527,9 @@ msgstr ""
msgid "Files"
msgstr "Files"
+msgid "Files API Rate Limits"
+msgstr ""
+
msgid "Files breadcrumb"
msgstr ""
@@ -15311,6 +15529,9 @@ msgstr ""
msgid "GitLab group: %{source_link}"
msgstr ""
+msgid "GitLab informs you if a new version is available."
+msgstr ""
+
msgid "GitLab is a complete DevOps platform, delivered as a single application, fundamentally changing the way Development, Security, and Ops teams collaborate"
msgstr ""
@@ -15326,7 +15547,7 @@ msgstr ""
msgid "GitLab is open source software to collaborate on code."
msgstr ""
-msgid "GitLab is undergoing maintenance and is operating in a read-only mode."
+msgid "GitLab is undergoing maintenance and is operating in read-only mode."
msgstr ""
msgid "GitLab member or Email address"
@@ -15338,9 +15559,6 @@ msgstr ""
msgid "GitLab project export"
msgstr ""
-msgid "GitLab restart is required to apply changes."
-msgstr ""
-
msgid "GitLab single sign-on URL"
msgstr ""
@@ -15356,9 +15574,6 @@ msgstr ""
msgid "GitLab version"
msgstr ""
-msgid "GitLab will inform you if a new version is available."
-msgstr ""
-
msgid "GitLab will run a background job that will produce pseudonymized CSVs of the GitLab database that will be uploaded to your configured object storage directory."
msgstr ""
@@ -15623,9 +15838,21 @@ msgstr ""
msgid "Go to snippets"
msgstr ""
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check 'Allowed domains for sign-ups'."
+msgstr ""
+
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check 'Email restrictions for sign-ups'."
+msgstr ""
+
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check the 'Domain denylist'."
+msgstr ""
+
msgid "Go to the activity feed"
msgstr ""
+msgid "Go to the group’s 'Settings &gt; General' page, and check 'Restrict membership by email domain'."
+msgstr ""
+
msgid "Go to the milestone list"
msgstr ""
@@ -15662,6 +15889,12 @@ msgstr ""
msgid "Goal of the changes and what reviewers should be aware of"
msgstr ""
+msgid "Google Cloud"
+msgstr ""
+
+msgid "Google Cloud offers several deployment targets. Select the one most suitable for your project."
+msgstr ""
+
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
@@ -15746,9 +15979,6 @@ msgstr ""
msgid "Group ID"
msgstr ""
-msgid "Group ID: %{group_id}"
-msgstr ""
-
msgid "Group Owner must have signed in with SAML before enabling Group Managed Accounts"
msgstr ""
@@ -15923,6 +16153,12 @@ msgstr ""
msgid "GroupImport|Unable to process group import file"
msgstr ""
+msgid "GroupPage|Copy group ID"
+msgstr ""
+
+msgid "GroupPage|Group ID: %{group_id}"
+msgstr ""
+
msgid "GroupRoadmap|%{dateWord} – No end date"
msgstr ""
@@ -15977,6 +16213,9 @@ msgstr ""
msgid "GroupRoadmap|Within 3 years"
msgstr ""
+msgid "GroupSAML|\"persistent\" recommended"
+msgstr ""
+
msgid "GroupSAML|%{strongOpen}Warning%{strongClose} - Enabling %{linkStart}SSO enforcement%{linkEnd} can reduce security risks."
msgstr ""
@@ -16109,6 +16348,9 @@ msgstr ""
msgid "GroupSAML|To be able to prohibit outer forks, you first need to enforce dedicate group managed accounts."
msgstr ""
+msgid "GroupSAML|Use SAML group links to manage group membership using SAML."
+msgstr ""
+
msgid "GroupSAML|Valid SAML Response"
msgstr ""
@@ -16121,13 +16363,10 @@ msgstr ""
msgid "GroupSAML|as %{access_level}"
msgstr ""
-msgid "GroupSAML|must match stored NameID of \"%{extern_uid}\" as we use this to identify users. If the NameID changes users will be unable to sign in."
+msgid "GroupSAML|must match stored NameID of \"%{extern_uid}\" to identify user and allow sign in"
msgstr ""
-msgid "GroupSAML|should be \"persistent\""
-msgstr ""
-
-msgid "GroupSAML|should be a random persistent ID, emails are discouraged"
+msgid "GroupSAML|recommend persistent ID instead of email"
msgstr ""
msgid "GroupSelect|No matching results"
@@ -16142,9 +16381,15 @@ msgstr ""
msgid "GroupSettings|Allow project access token creation"
msgstr ""
+msgid "GroupSettings|Applied to all subgroups unless overridden by a group owner. Groups already added to the project lose access."
+msgstr ""
+
msgid "GroupSettings|Auto DevOps pipeline was updated for the group"
msgstr ""
+msgid "GroupSettings|Available only on the top-level group. Applies to all subgroups. Groups already shared with a group outside %{group} are still shared unless removed manually."
+msgstr ""
+
msgid "GroupSettings|Badges"
msgstr ""
@@ -16196,6 +16441,9 @@ msgstr ""
msgid "GroupSettings|New runners registration token has been generated!"
msgstr ""
+msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgstr ""
+
msgid "GroupSettings|Pipeline settings was updated for the group"
msgstr ""
@@ -16208,12 +16456,15 @@ msgstr ""
msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
-msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups."
+msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups"
msgstr ""
msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
msgstr "Blocca la condivisione di un progetto di %{group} con altri gruppi"
+msgid "GroupSettings|Prevents group members from being notified if the group is mentioned."
+msgstr ""
+
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
msgstr ""
@@ -16250,21 +16501,6 @@ msgstr "Questa impostazione è stata applicata a %{ancestor_group}. Per condivid
msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}."
msgstr "Questa impostazione è stata applicata a %{ancestor_group}. Puoi eseguire l'override delle impostazioni o %{remove_ancestor_share_with_group_lock}."
-msgid "GroupSettings|This setting is only available on the top-level group and it applies to all subgroups. Groups that have already been shared with a group outside %{group} will still be shared, and this access will have to be revoked manually."
-msgstr ""
-
-msgid "GroupSettings|This setting will be applied to all subgroups unless overridden by a group owner. Groups that already have access to the project will continue to have access unless removed manually."
-msgstr ""
-
-msgid "GroupSettings|This setting will override user notification preferences for all members of the group, subgroups, and projects."
-msgstr ""
-
-msgid "GroupSettings|This setting will prevent group members from being notified if the group is mentioned."
-msgstr ""
-
-msgid "GroupSettings|This setting will prevent group members from forking projects outside of the group."
-msgstr ""
-
msgid "GroupSettings|Transfer group"
msgstr ""
@@ -16382,7 +16618,7 @@ msgstr ""
msgid "GroupsNew|No import options available"
msgstr ""
-msgid "GroupsNew|Not all related objects are migrated, as %{docs_link_start}described here%{docs_link_end}. Please %{feedback_link_start}leave feedback%{feedback_link_end} on this feature."
+msgid "GroupsNew|Not all related objects are migrated. %{docs_link_start}More info%{docs_link_end}."
msgstr ""
msgid "GroupsNew|Personal access token"
@@ -16514,15 +16750,27 @@ msgstr ""
msgid "Hello %{name},"
msgstr ""
-msgid "Hello there"
-msgstr ""
-
msgid "Hello, %{name}!"
msgstr ""
msgid "Hello, %{username}!"
msgstr ""
+msgid "HelloMessage|%{handshake_emoji} Contribute to GitLab: %{contribute_link}"
+msgstr ""
+
+msgid "HelloMessage|%{magnifier_emoji} Create a new GitLab issue: %{new_issue_link}"
+msgstr ""
+
+msgid "HelloMessage|%{rocket_emoji} We like your curiosity! Help us improve GitLab by joining the team: %{jobs_page_link}"
+msgstr ""
+
+msgid "HelloMessage|Does this page need fixes or improvements? Open an issue or contribute a merge request to help make GitLab more lovable. At GitLab, everyone can contribute!"
+msgstr ""
+
+msgid "HelloMessage|Welcome to GitLab!"
+msgstr ""
+
msgid "Help"
msgstr ""
@@ -16532,13 +16780,10 @@ msgstr ""
msgid "Helps prevent bots from creating accounts."
msgstr ""
-msgid "Helps prevent bots from creating issues"
+msgid "Helps prevent bots from creating issues."
msgstr ""
-msgid "Helps prevent malicious users hide their activity"
-msgstr ""
-
-msgid "Helps reduce request volume (e.g. from crawlers or abusive bots)"
+msgid "Helps prevent malicious users hide their activity."
msgstr ""
msgid "Helps reduce request volume (for example, from crawlers or abusive bots)"
@@ -16662,6 +16907,12 @@ msgstr "Housekeeping iniziato con successo"
msgid "Housekeeping, export, path, transfer, remove, archive."
msgstr ""
+msgid "How do I configure Akismet?"
+msgstr ""
+
+msgid "How do I configure it?"
+msgstr ""
+
msgid "How do I configure runners?"
msgstr ""
@@ -16683,19 +16934,25 @@ msgstr ""
msgid "How do I set up this service?"
msgstr ""
+msgid "How do I use a web terminal?"
+msgstr ""
+
+msgid "How do I use file templates?"
+msgstr ""
+
msgid "How it works"
msgstr ""
msgid "How many days need to pass between marking entity for deletion and actual removing it."
msgstr ""
-msgid "How many seconds an IP will be counted towards the limit"
+msgid "How many seconds an IP counts toward the IP address limit."
msgstr ""
-msgid "I accept the %{terms_link}"
+msgid "How the job limiter handles jobs exceeding the thresholds specified below. The 'track' mode only logs the jobs. The 'compress' mode compresses the jobs and raises an exception if the compressed size exceeds the limit."
msgstr ""
-msgid "I accept the|Terms of Service and Privacy Policy"
+msgid "I accept the %{terms_link}"
msgstr ""
msgid "I forgot my password"
@@ -16779,13 +17036,16 @@ msgstr ""
msgid "IP Address"
msgstr ""
-msgid "IP expiration time"
+msgid "IP address expiration time"
msgstr ""
-msgid "IP subnet restriction only allowed for top-level groups"
+msgid "IP address restrictions"
+msgstr ""
+
+msgid "IP addresses per user"
msgstr ""
-msgid "IPs per user"
+msgid "IP subnet restriction only allowed for top-level groups"
msgstr ""
msgid "Identifier"
@@ -16800,6 +17060,9 @@ msgstr ""
msgid "If any indexed field exceeds this limit it will be truncated to this number of characters and the rest will not be indexed or searchable. This does not apply to repository and wiki indexing. Setting this to 0 means it is unlimited."
msgstr ""
+msgid "If blank, defaults to %{code_open}Retry later%{code_close}."
+msgstr ""
+
msgid "If blank, set allowable lifetime to %{instance_level_policy_in_words}, as defined by the instance admin. Once set, existing tokens for users in this group may be revoked."
msgstr ""
@@ -16851,6 +17114,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 did not initiate these sign-in attempts, please reach out to your administrator or enable two-factor authentication (2FA) on your account."
+msgstr ""
+
msgid "If you did not initiate this change, please contact your administrator immediately."
msgstr ""
@@ -16942,10 +17208,10 @@ msgstr ""
msgid "Import Projects from Gitea"
msgstr ""
-msgid "Import a project"
+msgid "Import an exported GitLab project"
msgstr ""
-msgid "Import an exported GitLab project"
+msgid "Import and export rate limits"
msgstr ""
msgid "Import failed due to a GitHub error: %{original}"
@@ -16957,12 +17223,18 @@ msgstr ""
msgid "Import from Jira"
msgstr ""
+msgid "Import group"
+msgstr ""
+
msgid "Import group from file"
msgstr ""
msgid "Import groups"
msgstr ""
+msgid "Import history"
+msgstr ""
+
msgid "Import in progress"
msgstr ""
@@ -17026,7 +17298,25 @@ msgstr ""
msgid "Import timed out. Import took longer than %{import_jobs_expiration} seconds"
msgstr ""
-msgid "Import/Export Rate Limits"
+msgid "ImportAProjectModal|Import from a project"
+msgstr ""
+
+msgid "ImportAProjectModal|Import members from another project"
+msgstr ""
+
+msgid "ImportAProjectModal|Import project members"
+msgstr ""
+
+msgid "ImportAProjectModal|Only project members (not group members) are imported, and they get the same permissions as the project you import from."
+msgstr ""
+
+msgid "ImportAProjectModal|Successfully imported"
+msgstr ""
+
+msgid "ImportAProjectModal|Unable to import project members"
+msgstr ""
+
+msgid "ImportAProjectModal|You're importing members to the %{strongStart}%{name}%{strongEnd} project."
msgstr ""
msgid "ImportButtons|Connect repositories from"
@@ -17079,7 +17369,7 @@ msgstr[1] ""
msgid "Importing..."
msgstr ""
-msgid "Import|A repository URL usually ends in a .git suffix, although this is not required. Double check to make sure your repository URL is correct."
+msgid "Import|There is not a valid Git repository at this URL. If your HTTP repository is not publicly accessible, verify your credentials."
msgstr ""
msgid "Improve customer support with Service Desk"
@@ -17088,9 +17378,6 @@ msgstr ""
msgid "Improves Git cloning performance."
msgstr ""
-msgid "In %{time_to_now}"
-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 ""
@@ -17376,7 +17663,7 @@ msgstr ""
msgid "InProductMarketing|Start a GitLab Ultimate trial today in less than one minute, no credit card required."
msgstr ""
-msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no CC required"
+msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no credit card required"
msgstr ""
msgid "InProductMarketing|Start a trial"
@@ -17415,7 +17702,7 @@ msgstr ""
msgid "InProductMarketing|Team up in GitLab for greater efficiency"
msgstr ""
-msgid "InProductMarketing|Team work makes the dream work"
+msgid "InProductMarketing|Team work makes the dream work"
msgstr ""
msgid "InProductMarketing|Test, create, deploy"
@@ -17996,6 +18283,9 @@ msgstr ""
msgid "Integrations|Create new issue in Jira"
msgstr ""
+msgid "Integrations|Create new issue in ZenTao"
+msgstr ""
+
msgid "Integrations|Default settings are inherited from the group level."
msgstr ""
@@ -18089,9 +18379,15 @@ msgstr ""
msgid "Integrations|Search Jira issues"
msgstr ""
+msgid "Integrations|Search ZenTao issues"
+msgstr ""
+
msgid "Integrations|Send notifications about project events to Unify Circuit."
msgstr ""
+msgid "Integrations|Send notifications about project events to a Unify Circuit conversation. %{docs_link}"
+msgstr ""
+
msgid "Integrations|Sign in to add namespaces"
msgstr ""
@@ -18131,6 +18427,9 @@ msgstr ""
msgid "Integrations|You've activated every integration 🎉"
msgstr ""
+msgid "Integrations|ZenTao issues display here when you create issues in your project in ZenTao."
+msgstr ""
+
msgid "Interactive mode"
msgstr ""
@@ -18158,9 +18457,6 @@ msgstr ""
msgid "Interval Pattern"
msgstr "Intervallo di Pattern"
-msgid "Introducing Value Stream Analytics"
-msgstr ""
-
msgid "Introducing Your DevOps Report"
msgstr ""
@@ -18257,6 +18553,12 @@ msgstr ""
msgid "Investigate vulnerability: %{title}"
msgstr ""
+msgid "Invisible Captcha"
+msgstr ""
+
+msgid "Invisible Captcha helps prevent the creation of spam accounts. It adds a honeypot field and time-sensitive form submission to the account signup form."
+msgstr ""
+
msgid "Invitation"
msgstr ""
@@ -18710,12 +19012,18 @@ msgstr ""
msgid "Issues"
msgstr ""
+msgid "Issues I've created"
+msgstr ""
+
msgid "Issues Rate Limits"
msgstr ""
msgid "Issues and merge requests"
msgstr ""
+msgid "Issues assigned to me"
+msgstr ""
+
msgid "Issues can be bugs, tasks or ideas to be discussed. Also, issues are searchable and filterable."
msgstr ""
@@ -18827,7 +19135,7 @@ msgstr ""
msgid "Iterations|Create cadence"
msgstr ""
-msgid "Iterations|Create your first iteration"
+msgid "Iterations|Create iteration"
msgstr ""
msgid "Iterations|Delete cadence"
@@ -18836,6 +19144,9 @@ msgstr ""
msgid "Iterations|Delete iteration cadence?"
msgstr ""
+msgid "Iterations|Delete iteration?"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -18869,12 +19180,18 @@ msgstr ""
msgid "Iterations|New iteration cadence"
msgstr ""
+msgid "Iterations|No closed iterations."
+msgstr ""
+
msgid "Iterations|No iteration cadences to show."
msgstr ""
msgid "Iterations|No iterations in cadence."
msgstr ""
+msgid "Iterations|No open iterations."
+msgstr ""
+
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
@@ -18905,6 +19222,9 @@ msgstr ""
msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
msgstr ""
+msgid "Iterations|This will remove the iteration from any issues that are assigned to it."
+msgstr ""
+
msgid "Iterations|Title"
msgstr ""
@@ -18920,15 +19240,9 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "I’m familiar with the basics of DevOps."
-msgstr ""
-
msgid "I’m joining my team who’s already on GitLab"
msgstr ""
-msgid "I’m not familiar with the basics of DevOps."
-msgstr ""
-
msgid "Jaeger URL"
msgstr ""
@@ -19193,6 +19507,9 @@ msgstr ""
msgid "Job"
msgstr ""
+msgid "Job %{jobName}"
+msgstr ""
+
msgid "Job Failed #%{build_id}"
msgstr ""
@@ -19783,9 +20100,6 @@ msgstr ""
msgid "Learn more in the"
msgstr "Leggi di più su"
-msgid "Learn more in the|pipeline schedules documentation"
-msgstr "documentazione sulla pianificazione delle pipelines"
-
msgid "Learn more."
msgstr ""
@@ -19897,9 +20211,6 @@ msgstr ""
msgid "Leave Admin Mode"
msgstr ""
-msgid "Leave blank for no limit. Once set, existing personal access tokens may be revoked."
-msgstr ""
-
msgid "Leave edit mode? All unsaved changes will be lost."
msgstr ""
@@ -19945,10 +20256,10 @@ msgstr ""
msgid "LicenseCompliance|Acceptable license to be used in the project"
msgstr ""
-msgid "LicenseCompliance|Add a license"
+msgid "LicenseCompliance|Add license and related policy"
msgstr ""
-msgid "LicenseCompliance|Add license and related policy"
+msgid "LicenseCompliance|Add license policy"
msgstr ""
msgid "LicenseCompliance|Allow"
@@ -20038,6 +20349,9 @@ msgstr ""
msgid "LicenseManagement|Uncategorized"
msgstr ""
+msgid "Licensed Enterprise Edition features can be used if the project namespace's plan includes the feature, or if the project is public."
+msgstr ""
+
msgid "Licensed Features"
msgstr ""
@@ -20104,7 +20418,10 @@ msgstr ""
msgid "Limit namespaces and projects that can be indexed"
msgstr ""
-msgid "Limit sign in from multiple ips"
+msgid "Limit project size at a global, group, and project level. %{link_start}Learn more%{link_end}."
+msgstr ""
+
+msgid "Limit sign in from multiple IP addresses"
msgstr ""
msgid "Limit the number of concurrent operations this secondary site can run in the background."
@@ -20116,11 +20433,17 @@ msgstr ""
msgid "Limit the number of issues and epics per minute a user can create through web and API requests."
msgstr ""
+msgid "Limit the size of Sidekiq jobs stored in Redis."
+msgstr ""
+
msgid "Limited to showing %d event at most"
msgid_plural "Limited to showing %d events at most"
msgstr[0] ""
msgstr[1] ""
+msgid "Limiting mode"
+msgstr ""
+
msgid "Line changes"
msgstr ""
@@ -20190,9 +20513,6 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
-msgid "List of users to be excluded from the limit"
-msgstr ""
-
msgid "List options"
msgstr ""
@@ -20232,9 +20552,6 @@ msgstr ""
msgid "Loading functions timed out. Please reload the page to try again."
msgstr ""
-msgid "Loading issues"
-msgstr ""
-
msgid "Loading more"
msgstr ""
@@ -20526,6 +20843,9 @@ msgstr ""
msgid "Marked For Deletion At - %{deletion_time}"
msgstr ""
+msgid "Marked as ready. Merging is now allowed."
+msgstr ""
+
msgid "Marked this %{noun} as a draft."
msgstr ""
@@ -20598,52 +20918,22 @@ msgstr ""
msgid "Max 100,000 events"
msgstr ""
-msgid "Max 20 characters"
-msgstr ""
-
-msgid "Max Group Export Download requests per minute per user"
-msgstr ""
-
-msgid "Max Group Export requests per minute per user"
-msgstr ""
-
-msgid "Max Group Import requests per minute per user"
-msgstr ""
-
-msgid "Max Project Export Download requests per minute per user"
-msgstr ""
-
-msgid "Max Project Export requests per minute per user"
-msgstr ""
-
-msgid "Max Project Import requests per minute per user"
-msgstr ""
-
-msgid "Max authenticated API requests per period per user"
-msgstr ""
-
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
-msgid "Max authenticated web requests per period per user"
-msgstr ""
-
msgid "Max file size is 200 KB."
msgstr ""
-msgid "Max requests per minute per user"
-msgstr ""
-
msgid "Max role"
msgstr ""
msgid "Max session time"
msgstr ""
-msgid "Max unauthenticated requests per period per IP"
+msgid "MaxBuilds"
msgstr ""
-msgid "MaxBuilds"
+msgid "Maximum 20 characters"
msgstr ""
msgid "Maximum Conan package file size in bytes"
@@ -20679,6 +20969,12 @@ msgstr ""
msgid "Maximum attachment size (MB)"
msgstr ""
+msgid "Maximum authenticated API requests per rate limit period per user"
+msgstr ""
+
+msgid "Maximum authenticated web requests per rate limit period per user"
+msgstr ""
+
msgid "Maximum bulk request size (MiB)"
msgstr ""
@@ -20724,6 +21020,15 @@ msgstr ""
msgid "Maximum files in a diff"
msgstr ""
+msgid "Maximum group export download requests per minute"
+msgstr ""
+
+msgid "Maximum group export requests per minute"
+msgstr ""
+
+msgid "Maximum group import requests per minute"
+msgstr ""
+
msgid "Maximum import size"
msgstr ""
@@ -20760,7 +21065,7 @@ msgstr ""
msgid "Maximum number of projects."
msgstr ""
-msgid "Maximum number of unique IPs per user"
+msgid "Maximum number of unique IP addresses per user."
msgstr ""
msgid "Maximum page reached"
@@ -20769,12 +21074,24 @@ msgstr ""
msgid "Maximum page size"
msgstr ""
+msgid "Maximum project export download requests per minute"
+msgstr ""
+
+msgid "Maximum project export requests per minute"
+msgstr ""
+
+msgid "Maximum project import requests per minute"
+msgstr ""
+
msgid "Maximum push size"
msgstr ""
msgid "Maximum push size (MB)"
msgstr ""
+msgid "Maximum requests per minute"
+msgstr ""
+
msgid "Maximum running slices"
msgstr ""
@@ -20802,10 +21119,16 @@ msgstr ""
msgid "Maximum time between updates that a mirror can have when scheduled to synchronize."
msgstr ""
-msgid "Maximum time for web terminal websocket connection (in seconds). 0 for unlimited."
+msgid "Maximum time that users are allowed to skip the setup of two-factor authentication (in hours). Set to 0 (zero) to enforce at next sign in."
msgstr ""
-msgid "Maximum time that users are allowed to skip the setup of two-factor authentication (in hours). Set to 0 (zero) to enforce at next sign in."
+msgid "Maximum time, in seconds, for a web terminal websocket connection. 0 for unlimited."
+msgstr ""
+
+msgid "Maximum unauthenticated API requests per rate limit period per IP"
+msgstr ""
+
+msgid "Maximum unauthenticated web requests per rate limit period per IP"
msgstr ""
msgid "May"
@@ -20823,9 +21146,6 @@ msgstr ""
msgid "Medium vulnerabilities present"
msgstr ""
-msgid "Member lock"
-msgstr ""
-
msgid "Member since"
msgstr ""
@@ -20862,6 +21182,9 @@ msgstr ""
msgid "Members of a group may only view projects they have permission to access"
msgstr ""
+msgid "Membership"
+msgstr ""
+
msgid "Members|%{time} by %{user}"
msgstr ""
@@ -20922,9 +21245,6 @@ msgstr ""
msgid "Members|Expiration date updated successfully."
msgstr ""
-msgid "Members|Expired"
-msgstr ""
-
msgid "Members|Filter members"
msgstr ""
@@ -20940,9 +21260,6 @@ msgstr ""
msgid "Members|Membership"
msgstr ""
-msgid "Members|No expiration set"
-msgstr ""
-
msgid "Members|Remove \"%{groupName}\""
msgstr ""
@@ -20964,9 +21281,6 @@ msgstr ""
msgid "Members|Search invited"
msgstr ""
-msgid "Members|in %{time}"
-msgstr ""
-
msgid "Member|Deny access"
msgstr ""
@@ -21042,9 +21356,6 @@ msgstr "Richiesta di merge"
msgid "Merge request %{mr_link} was reviewed by %{mr_author}"
msgstr ""
-msgid "Merge request (MR) approvals"
-msgstr ""
-
msgid "Merge request analytics"
msgstr ""
@@ -21066,12 +21377,21 @@ msgstr ""
msgid "Merge requests"
msgstr ""
+msgid "Merge requests I've created"
+msgstr ""
+
msgid "Merge requests are a place to propose changes you've made to a project and discuss those changes with others"
msgstr ""
msgid "Merge requests are read-only in a secondary Geo node"
msgstr ""
+msgid "Merge requests assigned to me"
+msgstr ""
+
+msgid "Merge requests that I'm a reviewer"
+msgstr ""
+
msgid "Merge the branch and fix any conflicts that come up"
msgstr ""
@@ -21132,10 +21452,10 @@ msgstr ""
msgid "MergeRequests|An error occurred while saving the draft comment."
msgstr ""
-msgid "MergeRequests|Failed to squash. Should be done manually."
+msgid "MergeRequests|Create issue to resolve thread"
msgstr ""
-msgid "MergeRequests|Resolve this thread in a new issue"
+msgid "MergeRequests|Failed to squash. Should be done manually."
msgstr ""
msgid "MergeRequests|Saving the comment failed"
@@ -21949,6 +22269,9 @@ msgstr ""
msgid "MoveIssue|Cannot move issue to project it originates from!"
msgstr ""
+msgid "MoveIssue|Cannot move issues of '%{issue_type}' type."
+msgstr ""
+
msgid "Moved issue to %{label} column in the board."
msgstr ""
@@ -22074,6 +22397,15 @@ 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. To learn more about reducing storage capacity please visit our docs."
msgstr ""
+msgid "NamespaceUserCap|Pending users must be reviewed and approved by a group owner. Learn more about %{user_caps_link_start}User Caps%{link_end} and %{users_pending_approval_link_start}Users Pending Approval%{link_end}."
+msgstr ""
+
+msgid "NamespaceUserCap|View pending user approvals"
+msgstr ""
+
+msgid "NamespaceUserCap|Your group has reached its billable member limit"
+msgstr ""
+
msgid "Namespaces"
msgstr ""
@@ -22116,9 +22448,6 @@ msgstr ""
msgid "Network"
msgstr ""
-msgid "Network Policy|New rule"
-msgstr ""
-
msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is inbound from a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
msgstr ""
@@ -22140,16 +22469,13 @@ msgstr ""
msgid "NetworkPolicies|%{strongOpen}any%{strongClose} port"
msgstr ""
-msgid "NetworkPolicies|+ Add alert"
-msgstr ""
-
msgid "NetworkPolicies|.yaml"
msgstr ""
msgid "NetworkPolicies|.yaml mode"
msgstr ""
-msgid "NetworkPolicies|Actions"
+msgid "NetworkPolicies|Add alert"
msgstr ""
msgid "NetworkPolicies|Alerts are intended to be selectively used for a limited number of events that are potentially concerning and warrant a manual review. Alerts should not be used as a substitute for a SIEM or a logging tool. High volume alerts are likely to be dropped so as to preserve the stability of GitLab's integration with Kubernetes."
@@ -22185,9 +22511,6 @@ msgstr ""
msgid "NetworkPolicies|Deny all traffic"
msgstr ""
-msgid "NetworkPolicies|Description"
-msgstr ""
-
msgid "NetworkPolicies|Edit policy"
msgstr ""
@@ -22200,9 +22523,6 @@ msgstr ""
msgid "NetworkPolicies|IP/subnet"
msgstr ""
-msgid "NetworkPolicies|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
-msgstr ""
-
msgid "NetworkPolicies|Invalid or empty policy"
msgstr ""
@@ -22212,19 +22532,16 @@ msgstr ""
msgid "NetworkPolicies|Kubernetes error: %{error}"
msgstr ""
-msgid "NetworkPolicies|Name"
-msgstr ""
-
msgid "NetworkPolicies|Network"
msgstr ""
-msgid "NetworkPolicies|Network traffic"
+msgid "NetworkPolicies|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
msgstr ""
-msgid "NetworkPolicies|New policy"
+msgid "NetworkPolicies|Network policy can be created after the environment is loaded successfully."
msgstr ""
-msgid "NetworkPolicies|No policies detected"
+msgid "NetworkPolicies|Network traffic"
msgstr ""
msgid "NetworkPolicies|None selected"
@@ -22233,21 +22550,12 @@ msgstr ""
msgid "NetworkPolicies|Please %{installLinkStart}install%{installLinkEnd} and %{configureLinkStart}configure a Kubernetes Agent for this project%{configureLinkEnd} to enable alerts."
msgstr ""
-msgid "NetworkPolicies|Policies are a specification of how groups of pods are allowed to communicate with each other's network endpoints."
-msgstr ""
-
msgid "NetworkPolicies|Policy %{policyName} was successfully changed"
msgstr ""
msgid "NetworkPolicies|Policy definition"
msgstr ""
-msgid "NetworkPolicies|Policy editor"
-msgstr ""
-
-msgid "NetworkPolicies|Policy preview"
-msgstr ""
-
msgid "NetworkPolicies|Rule"
msgstr ""
@@ -22257,9 +22565,6 @@ msgstr ""
msgid "NetworkPolicies|Rule mode is unavailable for this policy. In some cases, we cannot parse the YAML file back into the rules editor."
msgstr ""
-msgid "NetworkPolicies|Rules"
-msgstr ""
-
msgid "NetworkPolicies|Save changes"
msgstr ""
@@ -22272,9 +22577,6 @@ msgstr ""
msgid "NetworkPolicies|Traffic that does not match any rule will be blocked."
msgstr ""
-msgid "NetworkPolicies|Unable to parse policy"
-msgstr ""
-
msgid "NetworkPolicies|all DNS names"
msgstr ""
@@ -22454,6 +22756,9 @@ msgstr ""
msgid "New issue"
msgstr "Nuovo Issue"
+msgid "New issue in %{project}"
+msgstr ""
+
msgid "New issue title"
msgstr ""
@@ -22532,7 +22837,7 @@ msgstr ""
msgid "Newest first"
msgstr ""
-msgid "Newly registered users will by default be external"
+msgid "Newly-registered users are external by default"
msgstr ""
msgid "Next"
@@ -22847,8 +23152,10 @@ msgstr ""
msgid "No webhooks found, add one in the form above."
msgstr ""
-msgid "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} to renew your subscription."
-msgstr ""
+msgid "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} day to renew your subscription."
+msgid_plural "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} days to renew your subscription."
+msgstr[0] ""
+msgstr[1] ""
msgid "No. of commits"
msgstr ""
@@ -22865,7 +23172,7 @@ msgstr ""
msgid "Nodes"
msgstr ""
-msgid "Non-admin users can sign in with read-only access and make read-only API requests."
+msgid "Non-admin users are restricted to read-only access, in both GitLab UI and API."
msgstr ""
msgid "None"
@@ -22946,7 +23253,7 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
-msgid "Notes Rate Limits"
+msgid "Notes rate limit"
msgstr ""
msgid "Notes|Are you sure you want to cancel creating this comment?"
@@ -23113,9 +23420,6 @@ msgstr "Nov"
msgid "November"
msgstr "Novembre"
-msgid "Novice"
-msgstr ""
-
msgid "Now, personalize your GitLab experience"
msgstr ""
@@ -23284,7 +23588,7 @@ msgstr ""
msgid "OnCallSchedules|For this rotation, on-call will be:"
msgstr ""
-msgid "OnCallSchedules|On-call schedule %{schedule} in Project %{project}"
+msgid "OnCallSchedules|On-call schedule %{obstacle} in Project %{project}"
msgstr ""
msgid "OnCallSchedules|On-call schedules"
@@ -23431,22 +23735,22 @@ msgstr ""
msgid "OnDemandScans|Scanner profile"
msgstr ""
-msgid "OnDemandScans|Select one of the existing profiles"
+msgid "OnDemandScans|Schedule scan"
msgstr ""
-msgid "OnDemandScans|Site profile"
+msgid "OnDemandScans|Select one of the existing profiles"
msgstr ""
-msgid "OnDemandScans|Use existing scanner profile"
+msgid "OnDemandScans|Site profile"
msgstr ""
-msgid "OnDemandScans|Use existing site profile"
+msgid "OnDemandScans|Start time"
msgstr ""
-msgid "OnDemandScans|You can either choose a passive scan or validate the target site in your chosen site profile. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
+msgid "OnDemandScans|Use existing scanner profile"
msgstr ""
-msgid "OnDemandScans|You cannot run an active scan against an unvalidated site."
+msgid "OnDemandScans|Use existing site profile"
msgstr ""
msgid "OnDemandScans|You must create a repository within your project to run an on-demand scan."
@@ -23511,6 +23815,9 @@ msgstr ""
msgid "Only admins can delete project"
msgstr ""
+msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
+msgstr ""
+
msgid "Only include features new to your current subscription tier."
msgstr ""
@@ -23529,6 +23836,12 @@ msgstr ""
msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
+msgid "Only reCAPTCHA v2 is supported:"
+msgstr ""
+
+msgid "Only users from the specified IP address ranges are able to reach this group, including all subgroups, projects, and Git repositories."
+msgstr ""
+
msgid "Only verified users with an email address in any of these domains can be added to the group."
msgstr ""
@@ -23715,9 +24028,6 @@ msgstr "Proprietario"
msgid "Package Registry"
msgstr ""
-msgid "Package Registry Rate Limits"
-msgstr ""
-
msgid "Package Registry: authenticated API requests"
msgstr ""
@@ -23736,6 +24046,9 @@ msgstr ""
msgid "Package recipe already exists"
msgstr ""
+msgid "Package registry rate limits"
+msgstr ""
+
msgid "Package type"
msgstr ""
@@ -23802,6 +24115,9 @@ msgstr ""
msgid "PackageRegistry|Composer"
msgstr ""
+msgid "PackageRegistry|Composer.json with license: %{license} and version: %{version}"
+msgstr ""
+
msgid "PackageRegistry|Conan"
msgstr ""
@@ -23865,6 +24181,9 @@ msgstr ""
msgid "PackageRegistry|Copy require package include"
msgstr ""
+msgid "PackageRegistry|Copy target SHA"
+msgstr ""
+
msgid "PackageRegistry|Copy yarn command"
msgstr ""
@@ -23931,6 +24250,9 @@ msgstr ""
msgid "PackageRegistry|Install package version"
msgstr ""
+msgid "PackageRegistry|Instance-level"
+msgstr ""
+
msgid "PackageRegistry|Invalid Package: failed metadata extraction"
msgstr ""
@@ -23976,6 +24298,9 @@ msgstr ""
msgid "PackageRegistry|Pip Command"
msgstr ""
+msgid "PackageRegistry|Project-level"
+msgstr ""
+
msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
msgstr ""
@@ -23997,6 +24322,9 @@ msgstr ""
msgid "PackageRegistry|Remove package"
msgstr ""
+msgid "PackageRegistry|Required Python: %{pythonVersion}"
+msgstr ""
+
msgid "PackageRegistry|RubyGems"
msgstr ""
@@ -24039,6 +24367,9 @@ msgstr ""
msgid "PackageRegistry|Source project located at %{link}"
msgstr ""
+msgid "PackageRegistry|Target SHA: %{sha}"
+msgstr ""
+
msgid "PackageRegistry|There are no other versions of this package."
msgstr ""
@@ -24207,6 +24538,18 @@ msgstr ""
msgid "Password was successfully updated. Please sign in again."
msgstr ""
+msgid "PasswordPrompt|Confirm password"
+msgstr ""
+
+msgid "PasswordPrompt|Confirm password to continue"
+msgstr ""
+
+msgid "PasswordPrompt|Password is required"
+msgstr ""
+
+msgid "PasswordPrompt|Please enter your password to confirm"
+msgstr ""
+
msgid "Passwords should be unique and not used for any other sites or services."
msgstr ""
@@ -24234,6 +24577,9 @@ msgstr ""
msgid "Paste project path (i.e. gitlab-org/gitlab)"
msgstr ""
+msgid "Paste this DSN into your Sentry SDK"
+msgstr ""
+
msgid "Paste your public SSH key, which is usually contained in the file '~/.ssh/id_ed25519.pub' or '~/.ssh/id_rsa.pub' and begins with 'ssh-ed25519' or 'ssh-rsa'. Do not paste your private SSH key, as that can compromise your identity."
msgstr ""
@@ -24318,6 +24664,9 @@ msgstr ""
msgid "PerformanceBar|First Contentful Paint"
msgstr ""
+msgid "PerformanceBar|Flamegraph with mode:"
+msgstr ""
+
msgid "PerformanceBar|Frontend resources"
msgstr ""
@@ -24351,6 +24700,15 @@ msgstr ""
msgid "PerformanceBar|Trace"
msgstr ""
+msgid "PerformanceBar|cpu"
+msgstr ""
+
+msgid "PerformanceBar|object"
+msgstr ""
+
+msgid "PerformanceBar|wall"
+msgstr ""
+
msgid "Period in seconds"
msgstr ""
@@ -24579,6 +24937,48 @@ msgstr "Target"
msgid "PipelineSchedules|Variables"
msgstr "Variabili"
+msgid "PipelineSource|API"
+msgstr ""
+
+msgid "PipelineSource|Chat"
+msgstr ""
+
+msgid "PipelineSource|External"
+msgstr ""
+
+msgid "PipelineSource|External Pull Request"
+msgstr ""
+
+msgid "PipelineSource|Merge Request"
+msgstr ""
+
+msgid "PipelineSource|On-Demand DAST Scan"
+msgstr ""
+
+msgid "PipelineSource|On-Demand DAST Validation"
+msgstr ""
+
+msgid "PipelineSource|Parent Pipeline"
+msgstr ""
+
+msgid "PipelineSource|Pipeline"
+msgstr ""
+
+msgid "PipelineSource|Push"
+msgstr ""
+
+msgid "PipelineSource|Schedule"
+msgstr ""
+
+msgid "PipelineSource|Trigger"
+msgstr ""
+
+msgid "PipelineSource|Web"
+msgstr ""
+
+msgid "PipelineSource|Web IDE"
+msgstr ""
+
msgid "PipelineStatusTooltip|Pipeline: %{ciStatus}"
msgstr ""
@@ -24879,46 +25279,7 @@ msgstr ""
msgid "Pipeline|Source"
msgstr ""
-msgid "Pipeline|Source|API"
-msgstr ""
-
-msgid "Pipeline|Source|Chat"
-msgstr ""
-
-msgid "Pipeline|Source|External"
-msgstr ""
-
-msgid "Pipeline|Source|External Pull Request"
-msgstr ""
-
-msgid "Pipeline|Source|Merge Request"
-msgstr ""
-
-msgid "Pipeline|Source|On-Demand DAST Scan"
-msgstr ""
-
-msgid "Pipeline|Source|On-Demand DAST Validation"
-msgstr ""
-
-msgid "Pipeline|Source|Parent Pipeline"
-msgstr ""
-
-msgid "Pipeline|Source|Pipeline"
-msgstr ""
-
-msgid "Pipeline|Source|Push"
-msgstr ""
-
-msgid "Pipeline|Source|Schedule"
-msgstr ""
-
-msgid "Pipeline|Source|Trigger"
-msgstr ""
-
-msgid "Pipeline|Source|Web"
-msgstr ""
-
-msgid "Pipeline|Source|Web IDE"
+msgid "Pipeline|Source|Security Policy"
msgstr ""
msgid "Pipeline|Specify variable values to be used in this run. The values specified in %{linkStart}CI/CD settings%{linkEnd} will be used by default."
@@ -24969,7 +25330,7 @@ msgstr ""
msgid "Pipeline|We are currently unable to fetch pipeline data"
msgstr ""
-msgid "Pipeline|You’re about to stop pipeline %{pipelineId}."
+msgid "Pipeline|You’re about to stop pipeline #%{pipelineId}."
msgstr ""
msgid "Pipeline|for"
@@ -24996,6 +25357,9 @@ msgstr ""
msgid "Plain diff"
msgstr ""
+msgid "Plain-text response to send to clients that hit a rate limit"
+msgstr ""
+
msgid "Plan:"
msgstr ""
@@ -25140,9 +25504,6 @@ msgstr ""
msgid "Please provide attributes to update"
msgstr ""
-msgid "Please provide your username or email address."
-msgstr ""
-
msgid "Please reach out if you have any questions and we'll be happy to assist."
msgstr ""
@@ -25185,9 +25546,6 @@ msgstr ""
msgid "Please set a new password before proceeding."
msgstr ""
-msgid "Please share your feedback about %{featureName} %{linkStart}in this issue%{linkEnd} to help us improve the experience."
-msgstr ""
-
msgid "Please solve the captcha"
msgstr ""
@@ -25365,6 +25723,9 @@ msgstr ""
msgid "Prevent adding new members to project membership within this group"
msgstr ""
+msgid "Prevent auto-stopping"
+msgstr ""
+
msgid "Prevent editing approval rules in projects and merge requests."
msgstr ""
@@ -25377,7 +25738,7 @@ msgstr ""
msgid "Prevent users from changing their profile name"
msgstr ""
-msgid "Prevent users from performing write operations on GitLab while performing maintenance."
+msgid "Prevent users from performing write operations while GitLab maintenance is in progress."
msgstr ""
msgid "Preview"
@@ -25650,6 +26011,9 @@ msgstr ""
msgid "Profiles|Enter your name, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Enter your password to confirm the email change"
+msgstr ""
+
msgid "Profiles|Enter your pronouns to let people know how to refer to you"
msgstr ""
@@ -25884,10 +26248,10 @@ msgstr ""
msgid "Profiles|e.g. My MacBook key"
msgstr ""
-msgid "Profiles|username"
+msgid "Profiles|https://website.com"
msgstr ""
-msgid "Profiles|website.com"
+msgid "Profiles|username"
msgstr ""
msgid "Profiles|your account"
@@ -26130,9 +26494,21 @@ msgstr ""
msgid "ProjectSelect| or group"
msgstr ""
+msgid "ProjectSelect|No matching results"
+msgstr ""
+
msgid "ProjectSelect|Search for project"
msgstr ""
+msgid "ProjectSelect|Search projects"
+msgstr ""
+
+msgid "ProjectSelect|Select a project"
+msgstr ""
+
+msgid "ProjectSelect|There was an error fetching the projects. Please try again."
+msgstr ""
+
msgid "ProjectService|Drone server URL"
msgstr ""
@@ -26220,6 +26596,9 @@ msgstr ""
msgid "ProjectService|Trigger event when a new, unique alert is recorded."
msgstr ""
+msgid "ProjectService|Trigger event when a new, unique vulnerability is recorded. (Note: This feature requires an Ultimate plan.)"
+msgstr ""
+
msgid "ProjectService|Trigger event when a pipeline status changes."
msgstr ""
@@ -26634,9 +27013,15 @@ msgstr ""
msgid "Projects are graded based on the highest severity vulnerability present"
msgstr ""
+msgid "Projects are organized into groups"
+msgstr ""
+
msgid "Projects contributed to"
msgstr ""
+msgid "Projects help you organize your work. They contain your file repository, issues, merge requests, and so much more."
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr ""
@@ -26871,10 +27256,10 @@ msgstr ""
msgid "PrometheusService|Prometheus cluster integration"
msgstr ""
-msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
+msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
msgstr ""
-msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
+msgid "PrometheusService|The ID of the IAP-secured resource."
msgstr ""
msgid "PrometheusService|The Prometheus API base URL."
@@ -27492,6 +27877,9 @@ msgstr ""
msgid "Rate limit"
msgstr ""
+msgid "Rate limits can help reduce request volume (like from crawlers or abusive bots)."
+msgstr ""
+
msgid "Raw blob request rate limit per minute"
msgstr ""
@@ -27504,6 +27892,9 @@ msgstr ""
msgid "Re-authentication required"
msgstr ""
+msgid "Re-import"
+msgstr ""
+
msgid "Re-request review"
msgstr ""
@@ -27525,6 +27916,9 @@ msgstr ""
msgid "Read more about related issues"
msgstr ""
+msgid "Read their documentation."
+msgstr ""
+
msgid "Ready to get started with GitLab? Follow these steps to set up your workspace, plan and commit changes, and deploy your project."
msgstr ""
@@ -27558,6 +27952,9 @@ msgstr ""
msgid "Receive any notifications from GitLab."
msgstr ""
+msgid "Receive notification of abuse reports by email."
+msgstr ""
+
msgid "Receive notifications about your own activity"
msgstr ""
@@ -27701,9 +28098,6 @@ msgstr ""
msgid "Registry setup"
msgstr ""
-msgid "Regulate approvals by authors/committers. Affects all projects."
-msgstr ""
-
msgid "Reindexing Status: %{status} (Slice multiplier: %{multiplier}, Maximum running slices: %{max_slices})"
msgstr ""
@@ -27799,6 +28193,9 @@ msgstr ""
msgid "Release|Something went wrong while saving the release details."
msgstr ""
+msgid "Reload page"
+msgstr ""
+
msgid "Remediations"
msgstr ""
@@ -28081,6 +28478,9 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
+msgid "Repeats"
+msgstr ""
+
msgid "Replace"
msgstr ""
@@ -28443,10 +28843,7 @@ msgstr ""
msgid "Require additional authentication for administrative tasks."
msgstr ""
-msgid "Require all users in this group to setup Two-factor authentication"
-msgstr ""
-
-msgid "Require all users in this group to setup two-factor authentication"
+msgid "Require all users in this group to set up two-factor authentication"
msgstr ""
msgid "Required approvals (%{approvals_given} given)"
@@ -28492,6 +28889,9 @@ msgstr[1] ""
msgid "Requires values to meet regular expression requirements."
msgstr ""
+msgid "Requires you to deploy or set up cloud-hosted Sentry."
+msgstr ""
+
msgid "Requires your primary GitLab email address."
msgstr ""
@@ -28552,9 +28952,6 @@ msgstr ""
msgid "Resolve"
msgstr ""
-msgid "Resolve all threads in new issue"
-msgstr ""
-
msgid "Resolve conflicts"
msgstr ""
@@ -28612,6 +29009,9 @@ msgstr ""
msgid "Response text"
msgstr ""
+msgid "Restart GitLab to apply changes."
+msgstr ""
+
msgid "Restart Terminal"
msgstr ""
@@ -28630,6 +29030,9 @@ msgstr ""
msgid "Restoring the project will prevent the project from being removed on this date and restore people's ability to make changes to it."
msgstr ""
+msgid "Restrict group access by IP address. %{link_start}Learn more%{link_end}."
+msgstr ""
+
msgid "Restrict membership by email domain"
msgstr ""
@@ -28943,6 +29346,9 @@ msgstr ""
msgid "Runners|Runner #%{runner_id}"
msgstr ""
+msgid "Runners|Runner assigned to project."
+msgstr ""
+
msgid "Runners|Runner is offline, last contact was %{runner_contact} ago"
msgstr ""
@@ -28955,6 +29361,9 @@ msgstr ""
msgid "Runners|Runner registration"
msgstr ""
+msgid "Runners|Runner unassigned from project."
+msgstr ""
+
msgid "Runners|Runners"
msgstr ""
@@ -29147,7 +29556,7 @@ msgstr ""
msgid "SastEntryPoints|How do I set up SAST?"
msgstr ""
-msgid "SastEntryPoints|Learn more."
+msgid "SastEntryPoints|Learn more"
msgstr ""
msgid "Satisfied"
@@ -29189,7 +29598,7 @@ msgstr ""
msgid "Save pipeline schedule"
msgstr "Salva pianificazione pipeline"
-msgid "Save space and find images in the container Registry. remove unneeded tags and keep only the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
+msgid "Save storage space by automatically deleting tags from the container registry and keeping the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
msgstr ""
msgid "Saving"
@@ -29363,6 +29772,9 @@ msgstr ""
msgid "Search or filter results…"
msgstr ""
+msgid "Search or jump to..."
+msgstr ""
+
msgid "Search project"
msgstr ""
@@ -29423,16 +29835,16 @@ msgstr ""
msgid "SearchCodeResults|of %{link_to_project}"
msgstr ""
-msgid "SearchResults|Showing %{count} %{scope} for%{term_element}"
+msgid "SearchResults|Showing %{count} %{scope} for %{term_element}"
msgstr ""
-msgid "SearchResults|Showing %{count} %{scope} for%{term_element} in your personal and project snippets"
+msgid "SearchResults|Showing %{count} %{scope} for %{term_element} in your personal and project snippets"
msgstr ""
-msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for%{term_element}"
+msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for %{term_element}"
msgstr ""
-msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for%{term_element} in your personal and project snippets"
+msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for %{term_element} in your personal and project snippets"
msgstr ""
msgid "SearchResults|code result"
@@ -29514,6 +29926,9 @@ msgstr ""
msgid "Secret Detection"
msgstr ""
+msgid "Secret access key"
+msgstr ""
+
msgid "Secret token"
msgstr ""
@@ -29553,9 +29968,6 @@ msgstr ""
msgid "SecurityApprovals|A merge request approval is required when the license compliance report contains a denied license."
msgstr ""
-msgid "SecurityApprovals|Configurable if security scanners are enabled. %{linkStart}Learn more.%{linkEnd}"
-msgstr ""
-
msgid "SecurityApprovals|Coverage-Check"
msgstr ""
@@ -29568,24 +29980,18 @@ msgstr ""
msgid "SecurityApprovals|Learn more about Vulnerability-Check"
msgstr ""
-msgid "SecurityApprovals|License Scanning must be enabled. %{linkStart}Learn more%{linkEnd}."
-msgstr ""
-
msgid "SecurityApprovals|License-Check"
msgstr ""
msgid "SecurityApprovals|Requires approval for Denied licenses. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}More information%{linkEnd}"
+msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "SecurityApprovals|Requires approval for vulnerabilities. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
-msgid "SecurityApprovals|Test coverage must be enabled. %{linkStart}Learn more%{linkEnd}."
-msgstr ""
-
msgid "SecurityApprovals|Vulnerability-Check"
msgstr ""
@@ -29649,6 +30055,12 @@ msgstr ""
msgid "SecurityConfiguration|Immediately begin risk analysis and remediation with application security features. Start with SAST and Secret Detection, available to all plans. Upgrade to Ultimate to get all features, including:"
msgstr ""
+msgid "SecurityConfiguration|Manage corpus"
+msgstr ""
+
+msgid "SecurityConfiguration|Manage corpus files used as mutation sources in coverage fuzzing."
+msgstr ""
+
msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
msgstr ""
@@ -29703,6 +30115,12 @@ msgstr ""
msgid "SecurityOrchestration|Action"
msgstr ""
+msgid "SecurityOrchestration|Actions"
+msgstr ""
+
+msgid "SecurityOrchestration|Add rule"
+msgstr ""
+
msgid "SecurityOrchestration|All policies"
msgstr ""
@@ -29736,9 +30154,6 @@ msgstr ""
msgid "SecurityOrchestration|Network"
msgstr ""
-msgid "SecurityOrchestration|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
-msgstr ""
-
msgid "SecurityOrchestration|New policy"
msgstr ""
@@ -29754,6 +30169,9 @@ msgstr ""
msgid "SecurityOrchestration|Policy editor"
msgstr ""
+msgid "SecurityOrchestration|Policy preview"
+msgstr ""
+
msgid "SecurityOrchestration|Policy status"
msgstr ""
@@ -29763,6 +30181,9 @@ msgstr ""
msgid "SecurityOrchestration|Rule"
msgstr ""
+msgid "SecurityOrchestration|Rules"
+msgstr ""
+
msgid "SecurityOrchestration|Scan Execution"
msgstr ""
@@ -29856,6 +30277,9 @@ msgstr ""
msgid "SecurityReports|Create issue"
msgstr ""
+msgid "SecurityReports|Development vulnerabilities"
+msgstr ""
+
msgid "SecurityReports|Dismiss vulnerability"
msgstr ""
@@ -29871,6 +30295,9 @@ msgstr ""
msgid "SecurityReports|Download results"
msgstr ""
+msgid "SecurityReports|Download scanned URLs"
+msgstr ""
+
msgid "SecurityReports|Download scanned resources"
msgstr ""
@@ -29994,6 +30421,9 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
+msgid "SecurityReports|The Vulnerability Report shows the results of the lastest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "SecurityReports|The security reports below contain one or more vulnerability findings that could not be parsed and were not recorded. Download the artifacts in the job output to investigate. Ensure any security report created conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
msgstr ""
@@ -30135,10 +30565,10 @@ msgstr ""
msgid "Select a repository"
msgstr ""
-msgid "Select a role"
+msgid "Select a repository containing templates for common files."
msgstr ""
-msgid "Select a shared template repository for all projects on this instance."
+msgid "Select a role"
msgstr ""
msgid "Select a template repository"
@@ -30216,6 +30646,9 @@ msgstr ""
msgid "Select project to choose zone"
msgstr ""
+msgid "Select project to create issue"
+msgstr ""
+
msgid "Select projects"
msgstr ""
@@ -30333,6 +30766,9 @@ msgstr ""
msgid "Send emails to help guide new users through the onboarding process."
msgstr ""
+msgid "Send emails to users upon account deactivation."
+msgstr ""
+
msgid "Send message"
msgstr ""
@@ -30351,6 +30787,9 @@ msgstr ""
msgid "Send service data"
msgstr ""
+msgid "Sentry"
+msgstr ""
+
msgid "Sentry API URL"
msgstr ""
@@ -30465,6 +30904,9 @@ msgstr ""
msgid "Service"
msgstr ""
+msgid "Service Accounts keys are required to authorize GitLab to deploy your Google Cloud project."
+msgstr ""
+
msgid "Service Desk"
msgstr ""
@@ -30537,15 +30979,15 @@ msgstr ""
msgid "Set a password on your account to pull or push via %{protocol}."
msgstr "Establezca una contraseña en su cuenta para actualizar o enviar a través de %{protocol}."
-msgid "Set a template repository for projects in this group"
-msgstr ""
-
msgid "Set access permissions for this token."
msgstr ""
msgid "Set an instance-wide domain that will be available to all clusters when installing Knative."
msgstr ""
+msgid "Set any rate limit to %{code_open}0%{code_close} to disable the limit."
+msgstr ""
+
msgid "Set default and restrict visibility levels. Configure import sources and git access protocol."
msgstr ""
@@ -30558,7 +31000,7 @@ msgstr ""
msgid "Set limit to 0 to allow any file size."
msgstr ""
-msgid "Set max session time for web terminal."
+msgid "Set limits for web and API requests."
msgstr ""
msgid "Set milestone"
@@ -30567,15 +31009,18 @@ msgstr ""
msgid "Set new password"
msgstr ""
-msgid "Set notification email for abuse reports."
+msgid "Set parent epic to an epic"
msgstr ""
-msgid "Set parent epic to an epic"
+msgid "Set per-user rate limits for imports and exports of projects and groups."
msgstr ""
msgid "Set projects and maximum size limits, session duration, user options, and check feature availability for namespace plan."
msgstr ""
+msgid "Set rate limits for package registry API requests that supersede the general user and IP rate limits."
+msgstr ""
+
msgid "Set severity"
msgstr ""
@@ -30594,15 +31039,24 @@ msgstr ""
msgid "Set the default branch for this project. All merge requests and commits are made against this branch unless you specify a different one."
msgstr ""
+msgid "Set the default expiration time for job artifacts in all projects. Set to %{code_open}0%{code_close} to never expire artifacts by default. If no unit is written, it defaults to seconds. For example, these are all equivalent: %{code_open}3600%{code_close}, %{code_open}60 minutes%{code_close}, or %{code_open}one hour%{code_close}."
+msgstr ""
+
msgid "Set the due date to %{due_date}."
msgstr ""
msgid "Set the iteration to %{iteration_reference}."
msgstr ""
+msgid "Set the maximum session time for a web terminal."
+msgstr ""
+
msgid "Set the milestone to %{milestone_reference}."
msgstr ""
+msgid "Set the per-user rate limit for notes created by web or API requests."
+msgstr ""
+
msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
msgstr ""
@@ -30804,6 +31258,9 @@ msgstr ""
msgid "Show Pipeline IID"
msgstr ""
+msgid "Show all %{issuable_type}."
+msgstr ""
+
msgid "Show all activity"
msgstr ""
@@ -30855,15 +31312,9 @@ msgstr ""
msgid "Show list"
msgstr ""
-msgid "Show me advanced features"
-msgstr ""
-
msgid "Show me how to add a pipeline"
msgstr ""
-msgid "Show me the basics"
-msgstr ""
-
msgid "Show one file at a time"
msgstr ""
@@ -30904,15 +31355,15 @@ msgstr ""
msgid "Showing %{pageSize} of %{total} %{issuableType}"
msgstr ""
-msgid "Showing %{pageSize} of %{total} issues"
-msgstr ""
-
msgid "Showing all epics"
msgstr ""
msgid "Showing all issues"
msgstr ""
+msgid "Showing data for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
+msgstr ""
+
msgid "Showing data for workflow items created in this date range. Date range cannot exceed %{maxDateRange} days."
msgstr ""
@@ -30952,6 +31403,15 @@ msgstr ""
msgid "Sidebar|Weight"
msgstr ""
+msgid "Sidekiq job compression threshold (bytes)"
+msgstr ""
+
+msgid "Sidekiq job size limit (bytes)"
+msgstr ""
+
+msgid "Sidekiq job size limits"
+msgstr ""
+
msgid "Sign in"
msgstr ""
@@ -31072,6 +31532,9 @@ msgstr ""
msgid "Site profile not found for given parameters"
msgstr ""
+msgid "Sites"
+msgstr ""
+
msgid "Size"
msgstr ""
@@ -31102,19 +31565,22 @@ msgstr ""
msgid "SlackIntegration|Sends notifications about project events to Slack channels."
msgstr ""
-msgid "SlackService|2. Paste the %{strong_open}Token%{strong_close} into the field below"
+msgid "SlackService|1. %{slash_command_link_start}Add a slash command%{slash_command_link_end} in your Slack team using this information:"
msgstr ""
-msgid "SlackService|3. Select the %{strong_open}Active%{strong_close} checkbox, press %{strong_open}Save changes%{strong_close} and start using GitLab inside Slack!"
+msgid "SlackService|2. Paste the token from Slack in the %{strong_open}Token%{strong_close} field below."
msgstr ""
-msgid "SlackService|Fill in the word that works best for your team."
+msgid "SlackService|3. Select the %{strong_open}Active%{strong_close} checkbox, select %{strong_open}Save changes%{strong_close}, and start using slash commands in Slack!"
+msgstr ""
+
+msgid "SlackService|After setup, get a list of available Slack slash commands by entering"
msgstr ""
-msgid "SlackService|See list of available commands in Slack after setting up this service, by entering"
+msgid "SlackService|Fill in the word that works best for your team."
msgstr ""
-msgid "SlackService|This service allows users to perform common operations on this project by entering slash commands in Slack."
+msgid "SlackService|Perform common operations in this project by entering slash commands in Slack."
msgstr ""
msgid "Slice multiplier"
@@ -31180,7 +31646,7 @@ msgstr ""
msgid "Some child epics may be hidden due to applied filters"
msgstr ""
-msgid "Some common domains are not allowed. %{read_more_link}."
+msgid "Some common domains are not allowed. %{learn_more_link}."
msgstr ""
msgid "Some of the designs you tried uploading did not change:"
@@ -31264,9 +31730,6 @@ msgstr ""
msgid "Something went wrong while exporting requirements"
msgstr ""
-msgid "Something went wrong while fetching %{listType} list"
-msgstr ""
-
msgid "Something went wrong while fetching branches"
msgstr ""
@@ -31321,15 +31784,9 @@ msgstr ""
msgid "Something went wrong while merging this merge request. Please try again."
msgstr ""
-msgid "Something went wrong while moving issues."
-msgstr ""
-
msgid "Something went wrong while obtaining the Let's Encrypt certificate."
msgstr ""
-msgid "Something went wrong while performing the action."
-msgstr ""
-
msgid "Something went wrong while promoting the issue to an epic. Please try again."
msgstr ""
@@ -31657,7 +32114,10 @@ msgstr ""
msgid "SourcegraphPreferences|Uses a custom %{linkStart}Sourcegraph instance%{linkEnd}."
msgstr ""
-msgid "Spam Check API Key"
+msgid "Spam Check"
+msgstr ""
+
+msgid "Spam Check API key"
msgstr ""
msgid "Spam Logs"
@@ -31675,7 +32135,7 @@ msgstr ""
msgid "Specified URL cannot be used: \"%{reason}\""
msgstr ""
-msgid "Specify an e-mail address regex pattern to identify default internal users."
+msgid "Specify an email address regex pattern to identify default internal users."
msgstr ""
msgid "Speed up your pipelines with Needs relationships"
@@ -31930,7 +32390,7 @@ msgstr ""
msgid "StatusCheck|An error occurred fetching the status checks."
msgstr ""
-msgid "StatusCheck|Apply this status check to any branch or a specific protected branch."
+msgid "StatusCheck|Apply this status check to all branches or a specific protected branch."
msgstr ""
msgid "StatusCheck|Check for a status response in Merge Requests. Failures do not block merges. %{link_start}Learn more%{link_end}."
@@ -32269,6 +32729,9 @@ msgstr ""
msgid "Subscriptions"
msgstr ""
+msgid "Subscription|Your subscription for %{strong}%{namespace_name}%{strong_close} has expired and you are now on %{pricing_link_start}the GitLab Free tier%{pricing_link_end}. Don't worry, your data is safe. Get in touch with our support team (%{support_email}). They'll gladly help with your subscription renewal."
+msgstr ""
+
msgid "Subtracted"
msgstr ""
@@ -32497,6 +32960,9 @@ msgstr ""
msgid "SuperSonics|Plan"
msgstr ""
+msgid "SuperSonics|Please agree to the Subscription Agreement"
+msgstr ""
+
msgid "SuperSonics|Ready to get started? A GitLab plan is ideal for scaling organizations and for multi team usage."
msgstr ""
@@ -32527,6 +32993,9 @@ msgstr ""
msgid "SuperSonics|The activation code is not valid. Please make sure to copy it exactly from the Customers Portal or confirmation email. Learn more about %{linkStart}activating your subscription%{linkEnd}."
msgstr ""
+msgid "SuperSonics|The activation code should be a 24-character alphanumeric string"
+msgstr ""
+
msgid "SuperSonics|There is a connectivity issue."
msgstr ""
@@ -32569,9 +33038,15 @@ msgstr ""
msgid "SuperSonics|You do not have an active subscription"
msgstr ""
+msgid "SuperSonics|You have successfully added a license that activates on %{date}. Please see the subscription history table below for more details."
+msgstr ""
+
msgid "SuperSonics|You'll be charged for %{trueUpLinkStart}users over license%{trueUpLinkEnd} on a quarterly or annual basis, depending on the terms of your agreement."
msgstr ""
+msgid "SuperSonics|Your future dated license was successfully added"
+msgstr ""
+
msgid "SuperSonics|Your subscription"
msgstr ""
@@ -32824,7 +33299,7 @@ msgstr ""
msgid "Template to append to all Service Desk issues"
msgstr ""
-msgid "TemplateRepository|Select a repository to make its templates available to all projects. %{link_start}What should the repository contain?%{link_end} "
+msgid "TemplateRepository|Create common files more quickly, and standardize their format."
msgstr ""
msgid "Templates"
@@ -33030,7 +33505,7 @@ msgstr ""
msgid "TestCases|Search test cases"
msgstr ""
-msgid "TestCases|Something went wrong while adding test case to Todo."
+msgid "TestCases|Something went wrong while adding test case to a to-do item."
msgstr ""
msgid "TestCases|Something went wrong while creating a test case."
@@ -33042,7 +33517,7 @@ msgstr ""
msgid "TestCases|Something went wrong while fetching test cases list."
msgstr ""
-msgid "TestCases|Something went wrong while marking test case todo as done."
+msgid "TestCases|Something went wrong while marking test case to-do item as done."
msgstr ""
msgid "TestCases|Something went wrong while moving test case."
@@ -33162,7 +33637,7 @@ msgstr ""
msgid "Thanks for your purchase!"
msgstr ""
-msgid "That is ok, I do not want to renew"
+msgid "That's OK, I don't want to renew"
msgstr ""
msgid "That's it, well done!"
@@ -33185,7 +33660,7 @@ msgid_plural "The %{type} contains the following errors:"
msgstr[0] ""
msgstr[1] ""
-msgid "The API key used by GitLab for accessing the Spam Check service endpoint"
+msgid "The API key used by GitLab for accessing the Spam Check service endpoint."
msgstr ""
msgid "The GitLab subscription service (customers.gitlab.com) is currently experiencing an outage. You can monitor the status and get updates at %{linkStart}status.gitlab.com%{linkEnd}."
@@ -33224,9 +33699,6 @@ msgstr ""
msgid "The URL to use for connecting to Elasticsearch. Use a comma-separated list to support clustering (e.g., \"http://localhost:9200, http://localhost:9201\")."
msgstr ""
-msgid "The Vulnerability Report shows the results of the last successful pipeline run on the default branch."
-msgstr ""
-
msgid "The X509 Certificate to use when mutual TLS is required to communicate with the external authorization service. If left blank, the server certificate is still validated when accessing over HTTPS."
msgstr ""
@@ -33284,9 +33756,6 @@ msgstr ""
msgid "The default branch for this project has been changed. Please update your bookmarks."
msgstr ""
-msgid "The default expiration time for job artifacts. 0 for unlimited. The default unit is in seconds, but you can use other units, for example %{code_open}4 mins 2 sec%{code_close}, %{code_open}2h42min%{code_close}."
-msgstr ""
-
msgid "The dependency list details information about the components used within your project."
msgstr ""
@@ -33478,9 +33947,6 @@ msgstr ""
msgid "The merge conflicts for this merge request have already been resolved. Please return to the merge request."
msgstr ""
-msgid "The merge request can now be merged."
-msgstr ""
-
msgid "The metric must be one of %{metrics}."
msgstr ""
@@ -33856,7 +34322,7 @@ msgstr ""
msgid "There was a problem updating the keep latest artifacts setting."
msgstr ""
-msgid "There was an error %{message} todo."
+msgid "There was an error %{message} to-do item."
msgstr ""
msgid "There was an error adding a To Do."
@@ -33895,6 +34361,9 @@ msgstr ""
msgid "There was an error fetching projects"
msgstr ""
+msgid "There was an error fetching search autocomplete suggestions"
+msgstr ""
+
msgid "There was an error fetching stage total counts"
msgstr ""
@@ -34219,6 +34688,9 @@ msgstr ""
msgid "This field is required."
msgstr ""
+msgid "This form is disabled in preview"
+msgstr ""
+
msgid "This group"
msgstr ""
@@ -34240,9 +34712,6 @@ msgstr ""
msgid "This group is linked to a subscription"
msgstr ""
-msgid "This group, including all subgroups, projects and git repositories, will be reachable from only the specified IP address ranges."
-msgstr ""
-
msgid "This group, its subgroups and projects has been scheduled for removal on %{date}."
msgstr ""
@@ -34522,9 +34991,6 @@ msgstr ""
msgid "This user cannot be unlocked manually from GitLab"
msgstr ""
-msgid "This user does not have a pending request"
-msgstr ""
-
msgid "This user has an unconfirmed email address (%{email}). You may force a confirmation."
msgstr ""
@@ -34633,9 +35099,6 @@ msgstr ""
msgid "ThreatMonitoring|Packet Activity"
msgstr ""
-msgid "ThreatMonitoring|Policies"
-msgstr ""
-
msgid "ThreatMonitoring|Requests"
msgstr ""
@@ -34687,6 +35150,12 @@ msgstr ""
msgid "ThreatMonitoring|View documentation"
msgstr ""
+msgid "Threshold in bytes at which to compress Sidekiq job arguments."
+msgstr ""
+
+msgid "Threshold in bytes at which to reject Sidekiq jobs. Set this to 0 to if you don't want to limit Sidekiq jobs."
+msgstr ""
+
msgid "Throughput"
msgstr ""
@@ -34696,6 +35165,9 @@ msgstr ""
msgid "Time"
msgstr ""
+msgid "Time (in hours) that users are allowed to skip forced configuration of two-factor authentication."
+msgstr ""
+
msgid "Time Spent"
msgstr ""
@@ -34762,7 +35234,7 @@ msgstr ""
msgid "TimeTrackingEstimated|Est"
msgstr ""
-msgid "TimeTracking|%{startTag}Spent: %{endTag}%{timeSpentHumanReadable}"
+msgid "TimeTracking|%{spentStart}Spent: %{spentEnd}"
msgstr ""
msgid "TimeTracking|Estimated:"
@@ -34976,6 +35448,9 @@ msgstr ""
msgid "To access this domain create a new DNS record"
msgstr ""
+msgid "To add a custom suffix, set up a Service Desk email address. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "To add an SSH key you need to %{generate_link_start}generate one%{link_end} or use an %{existing_link_start}existing key%{link_end}."
msgstr ""
@@ -34997,13 +35472,16 @@ msgstr ""
msgid "To connect an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To continue using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
+msgstr ""
+
msgid "To continue, you need to select the link in the confirmation email we sent to verify your email address. If you didn't get our email, select %{strongStart}Resend confirmation email.%{strongEnd}"
msgstr ""
msgid "To define internal users, first enable new users set to external"
msgstr ""
-msgid "To enable Registration Features, make sure \"Enable service ping\" is checked."
+msgid "To enable Registration Features, first enable Service Ping."
msgstr ""
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
@@ -35030,7 +35508,7 @@ msgstr ""
msgid "To get started, use the link below to confirm your account."
msgstr ""
-msgid "To help improve GitLab and its user experience, GitLab will periodically collect usage information."
+msgid "To help improve GitLab and its user experience, GitLab periodically collects usage information."
msgstr ""
msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
@@ -35063,7 +35541,7 @@ msgstr ""
msgid "To preserve performance only %{strong_open}%{display_size} of %{real_size}%{strong_close} files are displayed."
msgstr ""
-msgid "To protect this issue's confidentiality, %{forkLink} and set the fork's visibility to private."
+msgid "To protect this issue's confidentiality, %{linkStart}fork this project%{linkEnd} and set the fork's visibility to private."
msgstr ""
msgid "To protect this issue's confidentiality, a private fork of this project was selected."
@@ -35096,12 +35574,15 @@ msgstr ""
msgid "To set up SAML authentication for your group through an identity provider like Azure, Okta, Onelogin, Ping Identity, or your custom SAML 2.0 provider:"
msgstr ""
-msgid "To set up this service:"
+msgid "To set up this integration:"
msgstr ""
msgid "To specify the notification level per project of a group you belong to, you need to visit project page and change notification level there."
msgstr ""
+msgid "To start using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
+msgstr ""
+
msgid "To unsubscribe from this issue, please paste the following link into your browser:"
msgstr ""
@@ -35689,9 +36170,6 @@ msgstr ""
msgid "Unable to fetch branches list, please close the form and try again"
msgstr ""
-msgid "Unable to fetch unscanned projects"
-msgstr ""
-
msgid "Unable to fetch vulnerable projects"
msgstr ""
@@ -35746,6 +36224,15 @@ msgstr ""
msgid "Unable to update this issue at this time."
msgstr ""
+msgid "Unapprove a merge request"
+msgstr ""
+
+msgid "Unapprove the current merge request."
+msgstr ""
+
+msgid "Unapproved the current merge request."
+msgstr ""
+
msgid "Unarchive project"
msgstr ""
@@ -35758,16 +36245,13 @@ msgstr ""
msgid "Unassigned"
msgstr ""
-msgid "Unauthenticated API request rate limit"
-msgstr ""
-
-msgid "Unauthenticated rate limit period in seconds"
+msgid "Unauthenticated API rate limit period in seconds"
msgstr ""
-msgid "Unauthenticated request rate limit"
+msgid "Unauthenticated requests"
msgstr ""
-msgid "Unauthenticated requests"
+msgid "Unauthenticated web rate limit period in seconds"
msgstr ""
msgid "Undo"
@@ -35869,18 +36353,6 @@ msgstr ""
msgid "Unresolved"
msgstr ""
-msgid "UnscannedProjects|15 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|30 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|5 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|60 or more days"
-msgstr ""
-
msgid "Unschedule job"
msgstr ""
@@ -36100,6 +36572,9 @@ msgstr ""
msgid "UsageQuota|%{help_link_start}Shared runners%{help_link_end} are disabled, so there are no limits set on pipeline usage"
msgstr ""
+msgid "UsageQuota|%{linkTitle} help link"
+msgstr ""
+
msgid "UsageQuota|%{percentageLeft} of purchased storage is available"
msgstr ""
@@ -36109,6 +36584,9 @@ msgstr ""
msgid "UsageQuota|Artifacts is a sum of build and pipeline artifacts."
msgstr ""
+msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
+msgstr ""
+
msgid "UsageQuota|Buy additional minutes"
msgstr ""
@@ -36118,9 +36596,21 @@ msgstr ""
msgid "UsageQuota|CI minutes usage by project"
msgstr ""
+msgid "UsageQuota|Code packages and container images."
+msgstr ""
+
msgid "UsageQuota|Current period usage"
msgstr ""
+msgid "UsageQuota|File attachments and smaller design graphics."
+msgstr ""
+
+msgid "UsageQuota|Git repository, managed by the Gitaly service."
+msgstr ""
+
+msgid "UsageQuota|Includes project registry, artifacts, packages, wiki, uploads and other items."
+msgstr ""
+
msgid "UsageQuota|Increase storage temporarily"
msgstr ""
@@ -36139,6 +36629,9 @@ msgstr ""
msgid "UsageQuota|Packages"
msgstr ""
+msgid "UsageQuota|Pipeline artifacts and job artifacts, created with CI/CD."
+msgstr ""
+
msgid "UsageQuota|Pipelines"
msgstr ""
@@ -36157,6 +36650,9 @@ msgstr ""
msgid "UsageQuota|Seats"
msgstr ""
+msgid "UsageQuota|Shared bits of code and text."
+msgstr ""
+
msgid "UsageQuota|Snippets"
msgstr ""
@@ -36166,6 +36662,12 @@ msgstr ""
msgid "UsageQuota|Storage"
msgstr ""
+msgid "UsageQuota|Storage type"
+msgstr ""
+
+msgid "UsageQuota|There is a known issue with Artifact storage where the total could be incorrect for some projects. More details and progress are available in %{warningLinkStart}the epic%{warningLinkEnd}."
+msgstr ""
+
msgid "UsageQuota|This is the total amount of storage used across your projects within this namespace."
msgstr ""
@@ -36205,6 +36707,9 @@ msgstr ""
msgid "UsageQuota|Usage"
msgstr ""
+msgid "UsageQuota|Usage Breakdown"
+msgstr ""
+
msgid "UsageQuota|Usage Quotas"
msgstr ""
@@ -36229,6 +36734,9 @@ msgstr ""
msgid "UsageQuota|Wiki"
msgstr ""
+msgid "UsageQuota|Wiki content."
+msgstr ""
+
msgid "UsageQuota|Wikis"
msgstr ""
@@ -36445,7 +36953,10 @@ msgstr ""
msgid "User Settings"
msgstr ""
-msgid "User and IP Rate Limits"
+msgid "User and IP rate limits"
+msgstr ""
+
+msgid "User does not have a pending request"
msgstr ""
msgid "User identity was successfully created."
@@ -36742,6 +37253,9 @@ msgstr ""
msgid "Users can launch a development environment from a GitLab browser tab when the %{linkStart}Gitpod%{linkEnd} integration is enabled."
msgstr ""
+msgid "Users can reactivate their account by signing in."
+msgstr ""
+
msgid "Users can render diagrams in AsciiDoc, Markdown, reStructuredText, and Textile documents using Kroki."
msgstr ""
@@ -36757,6 +37271,9 @@ msgstr ""
msgid "Users requesting access to"
msgstr ""
+msgid "Users to exclude from the rate limit"
+msgstr ""
+
msgid "Users were successfully added."
msgstr ""
@@ -36778,6 +37295,9 @@ msgstr ""
msgid "UsersSelect|Unassigned"
msgstr ""
+msgid "Uses GitLab as a lightweight alternative to Sentry."
+msgstr ""
+
msgid "Using %{code_start}::%{code_end} denotes a %{link_start}scoped label set%{link_end}"
msgstr ""
@@ -36808,10 +37328,7 @@ msgstr ""
msgid "Value Stream Analytics can help you determine your team’s velocity"
msgstr ""
-msgid "Value Stream Analytics gives an overview of how much time it takes to go from idea to production in your project."
-msgstr ""
-
-msgid "Value may contain a variable reference"
+msgid "Value might contain a variable reference"
msgstr ""
msgid "Value stream"
@@ -36877,10 +37394,10 @@ msgstr ""
msgid "ValueStream|The Default Value Stream cannot be deleted"
msgstr ""
-msgid "Variable"
+msgid "Values that contain the %{codeStart}$%{codeEnd} character can be considered a variable reference and expanded. %{docsLinkStart}Learn more.%{docsLinkEnd}"
msgstr ""
-msgid "Variable references indicated by %{codeStart}$%{codeEnd} may be expanded. If this is not what you want, consider %{docsLinkStart}using a workaround to prevent expansion%{docsLinkEnd}."
+msgid "Variable"
msgstr ""
msgid "Variable will be masked in job logs."
@@ -37285,6 +37802,9 @@ msgstr ""
msgid "Vulnerability|Evidence"
msgstr ""
+msgid "Vulnerability|False positive detected"
+msgstr ""
+
msgid "Vulnerability|File"
msgstr ""
@@ -37327,6 +37847,9 @@ msgstr ""
msgid "Vulnerability|Status"
msgstr ""
+msgid "Vulnerability|The scanner determined this vulnerability to be a false positive. Verify the evaluation before changing its status. %{linkStart}Learn more about false positive detection.%{linkEnd}"
+msgstr ""
+
msgid "Vulnerability|The unmodified response is the original response that had no mutations done to the request"
msgstr ""
@@ -37651,9 +38174,6 @@ msgstr ""
msgid "Welcome to GitLab,%{br_tag}%{name}!"
msgstr ""
-msgid "Welcome to the guided GitLab tour"
-msgstr ""
-
msgid "Welcome, %{name}!"
msgstr ""
@@ -37672,9 +38192,6 @@ msgstr ""
msgid "What are you searching for?"
msgstr ""
-msgid "What describes you best?"
-msgstr ""
-
msgid "What does this command do?"
msgstr ""
@@ -37696,13 +38213,13 @@ msgstr ""
msgid "What is your job title? (optional)"
msgstr ""
-msgid "What will you use this group for?"
+msgid "What templates can I create?"
msgstr ""
-msgid "What's new"
+msgid "What will you use this group for?"
msgstr ""
-msgid "What’s your experience level?"
+msgid "What's new"
msgstr ""
msgid "When a deployment job is successful, skip older deployment jobs that are still pending."
@@ -37714,6 +38231,9 @@ msgstr ""
msgid "When an event in GitLab triggers a webhook, you can use the request details to figure out if something went wrong."
msgstr ""
+msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+msgstr ""
+
msgid "When inactive, an external authentication provider must be used."
msgstr ""
@@ -37737,6 +38257,9 @@ msgstr ""
msgid "When:"
msgstr ""
+msgid "Which API requests are affected?"
+msgstr ""
+
msgid "While it's rare to have no vulnerabilities, it can happen. In any event, we ask that you please double check your settings to make sure you've set up your dashboard correctly."
msgstr ""
@@ -38016,6 +38539,9 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|Work Items"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -38091,6 +38617,9 @@ msgstr ""
msgid "You are already a member of this %{member_source}."
msgstr ""
+msgid "You are already impersonating another user"
+msgstr ""
+
msgid "You are an admin, which means granting access to %{client_name} will allow them to interact with GitLab as an admin as well. Proceed with caution."
msgstr ""
@@ -38193,6 +38722,9 @@ msgstr ""
msgid "You can also use project access tokens with Git to authenticate over HTTP(S). %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "You can always change your URL later"
+msgstr ""
+
msgid "You can always edit this later"
msgstr ""
@@ -38349,10 +38881,10 @@ msgstr ""
msgid "You can’t %{tag_start}edit%{tag_end} files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
-msgid "You could not create a new trigger."
+msgid "You can’t edit files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
-msgid "You didn't renew your subscription for %{strong}%{namespace_name}%{strong_close} so it was downgraded to the free plan."
+msgid "You could not create a new trigger."
msgstr ""
msgid "You do not have any subscriptions yet"
@@ -38520,6 +39052,12 @@ msgstr ""
msgid "You must provide your current password in order to change it."
msgstr ""
+msgid "You must sign in to search for specific projects."
+msgstr ""
+
+msgid "You must sign in to search for specific terms."
+msgstr ""
+
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
@@ -38547,6 +39085,9 @@ msgstr ""
msgid "You need to upload a GitLab project export archive (ending in .gz)."
msgstr ""
+msgid "You need to verify your primary email first before enabling Two-Factor Authentication."
+msgstr ""
+
msgid "You successfully declined the invitation"
msgstr ""
@@ -38655,10 +39196,10 @@ msgstr ""
msgid "Your %{host} account was signed in to from a new location"
msgstr ""
-msgid "Your %{strong}%{plan_name}%{strong_close} subscription for %{strong}%{namespace_name}%{strong_close} will expire on %{strong}%{expires_on}%{strong_close}."
+msgid "Your %{strong}%{plan_name}%{strong_close} subscription expires on %{strong}%{expires_on}%{strong_close}. After that date, you cannot create issues or merge requests, or use many other features."
msgstr ""
-msgid "Your %{strong}%{plan_name}%{strong_close} subscription will expire on %{strong}%{expires_on}%{strong_close}. After that, you will not be able to create issues or merge requests as well as many other features."
+msgid "Your %{strong}%{plan_name}%{strong_close} subscription for %{strong}%{namespace_name}%{strong_close} will expire on %{strong}%{expires_on}%{strong_close}."
msgstr ""
msgid "Your CI/CD configuration syntax is invalid. View Lint tab for more details."
@@ -38682,7 +39223,7 @@ msgstr ""
msgid "Your GPG keys (%{count})"
msgstr ""
-msgid "Your GitLab account has been locked due to an excessive amount of unsuccessful sign in attempts. Your account will automatically unlock in %{duration} or you may click the link below to unlock now."
+msgid "Your GitLab account has been locked due to an excessive number of unsuccessful sign in attempts. You can wait for your account to automatically unlock in %{duration} or you can click the link below to unlock now."
msgstr ""
msgid "Your GitLab account request has been approved!"
@@ -38793,6 +39334,9 @@ msgstr ""
msgid "Your commit email is used for web based operations, such as edits and merges."
msgstr ""
+msgid "Your current password is required to register a two-factor authenticator app."
+msgstr ""
+
msgid "Your dashboard has been copied. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
@@ -38892,6 +39436,9 @@ msgstr ""
msgid "Your project limit is %{limit} projects! Please contact your administrator to increase it"
msgstr ""
+msgid "Your project will be created at:"
+msgstr ""
+
msgid "Your projects"
msgstr ""
@@ -38931,11 +39478,10 @@ msgstr ""
msgid "Your subscription expired!"
msgstr ""
-msgid "Your subscription has been downgraded."
-msgstr ""
-
-msgid "Your subscription will expire in %{remaining_days}."
-msgstr ""
+msgid "Your subscription will expire in %{remaining_days} day."
+msgid_plural "Your subscription will expire in %{remaining_days} days."
+msgstr[0] ""
+msgstr[1] ""
msgid "Your username is %{username}."
msgstr ""
@@ -39142,6 +39688,9 @@ msgstr ""
msgid "cannot merge"
msgstr ""
+msgid "cannot not be used for user namespace"
+msgstr ""
+
msgid "ciReport|%{degradedNum} degraded"
msgstr ""
@@ -39465,6 +40014,9 @@ msgstr ""
msgid "created %{timeAgo}"
msgstr ""
+msgid "created %{timeAgo} by %{author}"
+msgstr ""
+
msgid "created by"
msgstr ""
@@ -39509,9 +40061,6 @@ msgstr ""
msgid "does not have a supported extension. Only %{extension_list} are supported"
msgstr ""
-msgid "domain is not authorized for sign-up."
-msgstr ""
-
msgid "download it"
msgstr ""
@@ -39529,18 +40078,13 @@ msgstr ""
msgid "email '%{email}' is not a verified email."
msgstr ""
-msgid "email does not match the allowed domain of %{email_domains}"
-msgid_plural "email does not match the allowed domains: %{email_domains}"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "enabled"
msgstr ""
msgid "encrypted: needs to be a :required, :optional or :migrating!"
msgstr ""
-msgid "ending with MIME type format is not allowed."
+msgid "ending with a reserved file extension is not allowed."
msgstr ""
msgid "entries cannot be larger than 255 characters"
@@ -39564,6 +40108,9 @@ msgstr ""
msgid "estimateCommand|%{slash_command} overwrites the total estimated time."
msgstr ""
+msgid "example.com"
+msgstr ""
+
msgid "exceeds the limit of %{bytes} bytes"
msgstr ""
@@ -39614,9 +40161,6 @@ msgstr ""
msgid "fork"
msgstr ""
-msgid "fork this project"
-msgstr ""
-
msgid "from"
msgstr ""
@@ -39625,6 +40169,9 @@ msgid_plural "from %d jobs"
msgstr[0] ""
msgstr[1] ""
+msgid "frontmatter"
+msgstr ""
+
msgid "group"
msgstr ""
@@ -39652,6 +40199,9 @@ msgstr ""
msgid "has been completed."
msgstr ""
+msgid "has too deep level of nesting"
+msgstr ""
+
msgid "help"
msgstr ""
@@ -39685,9 +40235,21 @@ msgstr ""
msgid "in"
msgstr ""
+msgid "in Infrastructure :: Kubernetes clusters"
+msgstr ""
+
+msgid "in all GitLab"
+msgstr ""
+
+msgid "in group"
+msgstr ""
+
msgid "in group %{link_to_group}"
msgstr ""
+msgid "in project"
+msgstr ""
+
msgid "in project %{link_to_project}"
msgstr ""
@@ -39729,16 +40291,19 @@ msgstr ""
msgid "is not a valid X509 certificate."
msgstr ""
-msgid "is not allowed since the group is not top-level group."
+msgid "is not allowed for sign-up."
msgstr ""
-msgid "is not allowed. Try again with a different email address, or contact your GitLab admin."
+msgid "is not allowed for this group."
msgstr ""
-msgid "is not allowed. We do not currently support project-level iterations"
+msgid "is not allowed for this project."
+msgstr ""
+
+msgid "is not allowed since the group is not top-level group."
msgstr ""
-msgid "is not from an allowed domain."
+msgid "is not allowed. We do not currently support project-level iterations"
msgstr ""
msgid "is not in the group enforcing Group Managed Account"
@@ -39831,6 +40396,9 @@ msgstr ""
msgid "log in"
msgstr ""
+msgid "managed"
+msgstr ""
+
msgid "manual"
msgstr ""
@@ -39878,6 +40446,9 @@ msgstr ""
msgid "mrWidget| Please restore it or use a different %{missingBranchName} branch"
msgstr ""
+msgid "mrWidget|%{linkStart}Set up now%{linkEnd} to analyze your source code for known security vulnerabilities."
+msgstr ""
+
msgid "mrWidget|%{mergeError}."
msgstr ""
@@ -39958,6 +40529,9 @@ msgid_plural "mrWidget|Closes issues"
msgstr[0] ""
msgstr[1] ""
+msgid "mrWidget|Create issue to resolve all threads"
+msgstr ""
+
msgid "mrWidget|Delete source branch"
msgstr ""
@@ -39967,12 +40541,18 @@ msgstr ""
msgid "mrWidget|Did not close"
msgstr ""
+msgid "mrWidget|Dismiss"
+msgstr ""
+
msgid "mrWidget|Email patches"
msgstr ""
msgid "mrWidget|Failed to load deployment statistics"
msgstr ""
+msgid "mrWidget|Hide %{widget} details"
+msgstr ""
+
msgid "mrWidget|If the %{missingBranchName} branch exists in your local repository, you can merge this merge request manually using the command line"
msgstr ""
@@ -40068,9 +40648,6 @@ msgstr ""
msgid "mrWidget|Request to merge"
msgstr ""
-msgid "mrWidget|Resolve all threads in new issue"
-msgstr ""
-
msgid "mrWidget|Resolve conflicts"
msgstr ""
@@ -40086,6 +40663,9 @@ msgstr ""
msgid "mrWidget|Revoke approval"
msgstr ""
+msgid "mrWidget|SAST and Secret Detection is not enabled."
+msgstr ""
+
msgid "mrWidget|Set by %{merge_author} to be added to the merge train when the pipeline succeeds"
msgstr ""
@@ -40095,6 +40675,9 @@ msgstr ""
msgid "mrWidget|Set by %{merge_author} to start a merge train when the pipeline succeeds"
msgstr ""
+msgid "mrWidget|Show %{widget} details"
+msgstr ""
+
msgid "mrWidget|The changes were merged into"
msgstr ""
@@ -40107,6 +40690,9 @@ msgstr ""
msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure, or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
msgstr ""
+msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure."
+msgstr ""
+
msgid "mrWidget|The source branch has been deleted"
msgstr ""
@@ -40149,6 +40735,9 @@ msgstr ""
msgid "mrWidget|You can merge after removing denied licenses"
msgstr ""
+msgid "mrWidget|You can only merge once this merge request is approved."
+msgstr ""
+
msgid "mrWidget|Your password"
msgstr ""
@@ -40185,6 +40774,9 @@ msgstr ""
msgid "must be less than the limit of %{tag_limit} tags"
msgstr ""
+msgid "must be set for a project namespace"
+msgstr ""
+
msgid "must be unique by status and elapsed time within a policy"
msgstr ""
@@ -40294,6 +40886,9 @@ msgstr ""
msgid "pipeline"
msgstr ""
+msgid "pipeline schedules documentation"
+msgstr ""
+
msgid "pod_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
msgstr ""
@@ -40343,16 +40938,25 @@ msgstr ""
msgid "project name"
msgstr ""
+msgid "project namespace cannot be the parent of another namespace"
+msgstr ""
+
msgid "projects"
msgstr ""
msgid "quick actions"
msgstr ""
-msgid "reCAPTCHA Private Key"
+msgid "reCAPTCHA"
+msgstr ""
+
+msgid "reCAPTCHA helps prevent credential stuffing."
msgstr ""
-msgid "reCAPTCHA Site Key"
+msgid "reCAPTCHA private key"
+msgstr ""
+
+msgid "reCAPTCHA site key"
msgstr ""
msgid "recent activity"
@@ -40579,6 +41183,9 @@ msgstr ""
msgid "user avatar"
msgstr ""
+msgid "user namespace cannot be the parent of another namespace"
+msgstr ""
+
msgid "user preferences"
msgstr ""
@@ -40671,3 +41278,9 @@ msgstr ""
msgid "your settings"
msgstr ""
+msgid "{group}"
+msgstr ""
+
+msgid "{project}"
+msgstr ""
+
diff --git a/locale/ja/gitlab.po b/locale/ja/gitlab.po
index d4e6ec7e03f..e417900b458 100644
--- a/locale/ja/gitlab.po
+++ b/locale/ja/gitlab.po
@@ -14,13 +14,10 @@ msgstr ""
"X-Crowdin-Language: ja\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-09-01 22:33\n"
-
-msgid " %{name}, confirm your email address now! "
-msgstr ""
+"PO-Revision-Date: 2021-10-04 20:21\n"
msgid " %{start} to %{end}"
-msgstr ""
+msgstr " %{start} ã‹ã‚‰ %{end} ã¾ã§"
msgid " (from %{timeoutSource})"
msgstr " (%{timeoutSource} ã‹ã‚‰)"
@@ -90,13 +87,21 @@ msgstr "createInstance() ã«ã¯ \"el\" パラメータãŒå¿…è¦ã§ã™"
msgid "#general, #development"
msgstr ""
+msgid "%d Alert"
+msgid_plural "%d Alerts"
+msgstr[0] ""
+
+msgid "%d Alert:"
+msgid_plural "%d Alerts:"
+msgstr[0] ""
+
msgid "%d Approval"
msgid_plural "%d Approvals"
msgstr[0] "%d 件ã®æ‰¿èª"
msgid "%d Module"
msgid_plural "%d Modules"
-msgstr[0] ""
+msgstr[0] "%d モジュール"
msgid "%d Other"
msgid_plural "%d Others"
@@ -387,8 +392,11 @@ msgstr ""
msgid "%{code_open}Protected:%{code_close} Only exposed to protected branches or tags."
msgstr ""
-msgid "%{commit_author_link} authored %{commit_timeago}"
-msgstr "%{commit_author_link} ㌠%{commit_timeago} ã«ã‚³ãƒŸãƒƒãƒˆã—ã¾ã—ãŸ"
+msgid "%{commit_author_link} authored %{commit_authored_timeago}"
+msgstr ""
+
+msgid "%{commit_author_link} authored %{commit_authored_timeago} and %{commit_committer_avatar} %{commit_committer_link} committed %{commit_committer_timeago}"
+msgstr ""
msgid "%{completedCount} completed weight"
msgstr "%{completedCount} ウェイトãŒå®Œäº†ã—ã¾ã—ãŸ"
@@ -476,6 +484,15 @@ msgstr "%{doc_link_start}高度ãªæ¤œç´¢%{doc_link_end} ã¯ã€ç„¡åŠ¹ã«ãªã£ã¦
msgid "%{doc_link_start}Advanced search%{doc_link_end} is enabled."
msgstr "%{doc_link_start}高度ãªæ¤œç´¢%{doc_link_end} ãŒæœ‰åŠ¹ã§ã™ã€‚"
+msgid "%{docs_link_start}Learn about visibility levels.%{docs_link_end}"
+msgstr ""
+
+msgid "%{docs_link_start}What is Large File Storage?%{docs_link_end}"
+msgstr ""
+
+msgid "%{docs_link_start}What is two-factor authentication?%{docs_link_end}"
+msgstr ""
+
msgid "%{due_date} (Past due)"
msgstr "%{due_date} (期é™åˆ‡ã‚Œ)"
@@ -548,9 +565,6 @@ msgstr "%{issuableType}を削除ã—ã¾ã™ï¼ã‚ˆã‚ã—ã„ã§ã™ã‹ï¼Ÿ"
msgid "%{issueType} actions"
msgstr "%{issueType} アクション"
-msgid "%{issuesCount} issues with a limit of %{maxIssueCount}"
-msgstr "最大 %{maxIssueCount} 件中ã€%{issuesCount} 件ã®ã‚¤ã‚·ãƒ¥ãƒ¼"
-
msgid "%{issuesSize} with a limit of %{maxIssueCount}"
msgstr "最大 %{maxIssueCount} 件中〠%{issuesSize} 件"
@@ -608,6 +622,12 @@ msgstr "%{labelStart}修正ã•ã‚Œã¦ã„ãªã„レスãƒãƒ³ã‚¹:%{labelEnd} %{heade
msgid "%{label_for_message} unavailable"
msgstr "%{label_for_message} ã¯åˆ©ç”¨ä¸å¯"
+msgid "%{learn_more_link}."
+msgstr ""
+
+msgid "%{lessThan} 1 hour"
+msgstr ""
+
msgid "%{lets_encrypt_link_start}Let's Encrypt%{lets_encrypt_link_end} is a free, automated, and open certificate authority (CA) that issues digital certificates to enable HTTPS (SSL/TLS) for sites."
msgstr ""
@@ -620,15 +640,15 @@ msgstr "%{level_name} ã¯è¨±å¯ã•ã‚Œã¾ã›ã‚“。フォークã—ãŸã‚½ãƒ¼ã‚¹ãƒ—ã
msgid "%{link_start}Learn more%{link_end} about roles."
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
-msgstr "GitLab Inc. ã«ã©ã®ã‚ˆã†ãªæƒ…報を共有ã™ã‚‹ã‹ã«ã¤ã„ã¦ã¯ %{link_start}ã“ã¡ã‚‰%{link_end} ã‚’å‚ç…§ã—ã¦ãã ã•ã„。"
-
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
msgstr ""
msgid "%{link_start}Start the title with %{draft_snippet}%{link_end} to prevent a merge request that is a work in progress from being merged before it's ready."
msgstr ""
+msgid "%{link_start}What information does GitLab Inc. collect?%{link_end}"
+msgstr ""
+
msgid "%{listToShow}, and %{awardsListLength} more"
msgstr ""
@@ -777,7 +797,7 @@ msgid "%{securityScanner} result is not available because a pipeline has not bee
msgid_plural "%{securityScanner} results are not available because a pipeline has not been run since it was enabled. %{linkStart}Run a pipeline%{linkEnd}"
msgstr[0] "%{securityScanner} ã®çµæžœã¯åˆ©ç”¨ã§ãã¾ã›ã‚“。パイプラインãŒæœ‰åŠ¹ã«ãªã£ã¦ã‹ã‚‰ã¾ã å®Ÿè¡Œã•ã‚Œã¦ã„ãªã„ãŸã‚ã§ã™ã€‚ %{linkStart}パイプラインを実行%{linkEnd}"
-msgid "%{service_ping_link_start}Learn more%{service_ping_link_end} about what information is shared with GitLab Inc."
+msgid "%{service_ping_link_start}What information is shared with GitLab Inc.?%{service_ping_link_end}"
msgstr ""
msgid "%{size} %{unit}"
@@ -813,6 +833,9 @@ msgstr "%{start} ã‹ã‚‰ %{end} ã¾ã§"
msgid "%{state} epics"
msgstr "%{state}エピック"
+msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
+msgstr ""
+
msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
msgstr ""
@@ -865,10 +888,6 @@ msgstr "%{tag}-%{evidence}-%{filename}"
msgid "%{template_project_id} is unknown or invalid"
msgstr "%{template_project_id} ã¯ä¸æ˜Žã€ã¾ãŸã¯ç„¡åŠ¹ã§ã™"
-msgid "%{text} %{files}"
-msgid_plural "%{text} %{files} files"
-msgstr[0] "%{text} %{files} ファイル"
-
msgid "%{text} is available"
msgstr "%{text} ãŒåˆ©ç”¨ã§ãã¾ã™ã€‚"
@@ -953,9 +972,6 @@ msgstr ""
msgid "%{wildcards_link_start}Wildcards%{wildcards_link_end} such as %{code_tag_start}v*%{code_tag_end} or %{code_tag_start}*-release%{code_tag_end} are supported."
msgstr ""
-msgid "&lt; 1 hour"
-msgstr "&lt; 1時間"
-
msgid "'%{data}' at %{location} does not match format: %{format}"
msgstr "%{location} ã«ã‚ã‚‹ '%{data}' ㌠%{format} フォーマットã¨ä¸€è‡´ã—ã¾ã›ã‚“。"
@@ -1038,9 +1054,6 @@ msgstr "(失効)"
msgid "(we need your current password to confirm your changes)"
msgstr ""
-msgid "* * * * *"
-msgstr "* * * * *"
-
msgid "+ %{amount} more"
msgstr "+ %{amount} 件以上"
@@ -1104,12 +1117,12 @@ msgstr "- 折りãŸãŸã‚€"
msgid "."
msgstr "."
+msgid "/"
+msgstr ""
+
msgid "0 bytes"
msgstr "0 ãƒã‚¤ãƒˆ"
-msgid "0 for unlimited, only effective with remote storage enabled."
-msgstr "リモートストレージãŒæœ‰åŠ¹ã«ãªã£ã¦ã„ã‚‹å ´åˆã«ã®ã¿ã€0ã¯ç„¡åˆ¶é™ã«ãªã‚Šã¾ã™ã€‚"
-
msgid "0t1DgySidms"
msgstr "0t1DgySidms"
@@ -1212,6 +1225,9 @@ msgid "10-19 contributions"
msgstr "貢献 10-19 件"
msgid "1000+"
+msgstr "1000 以上"
+
+msgid "192.168.0.0/24"
msgstr ""
msgid "1st contribution!"
@@ -1367,9 +1383,6 @@ msgstr "公開エピックã®è¦ªã‚¨ãƒ”ックã«éžå…¬é–‹ã‚¨ãƒ”ックã«å‰²ã‚Šå½“
msgid "A plain HTML site that uses Netlify for CI/CD instead of GitLab, but still with all the other great GitLab features"
msgstr ""
-msgid "A plain-text response to show to clients that hit the rate limit."
-msgstr ""
-
msgid "A platform value can be web, mob or app."
msgstr "プラットフォームã®å€¤ã¯ã€ã‚¦ã‚§ãƒ–ã€ãƒ¢ãƒã‚¤ãƒ«ã€ã¾ãŸã¯ã‚¢ãƒ—リã§ã™ã€‚"
@@ -1451,7 +1464,7 @@ msgstr ""
msgid "APIFuzzing|Configure HTTP basic authentication values. Other authentication methods are supported. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
+msgid "APIFuzzing|Customize your project's API fuzzing configuration options and copy the code snippet to your .gitlab-ci.yml file to apply any changes. Note that this tool does not reflect or update your .gitlab-ci.yml file automatically. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
msgstr ""
msgid "APIFuzzing|Enable authentication"
@@ -1514,9 +1527,6 @@ msgstr ""
msgid "APIFuzzing|To prevent a security leak, authentication info must be added as a %{ciVariablesLinkStart}CI variable%{ciVariablesLinkEnd}. As a user with maintainer access rights, you can manage CI variables in the %{ciSettingsLinkStart}Settings%{ciSettingsLinkEnd} area."
msgstr ""
-msgid "APIFuzzing|Use this tool to generate API fuzzing configuration YAML to copy into your .gitlab-ci.yml file. This tool does not reflect or update your .gitlab-ci.yml file automatically."
-msgstr ""
-
msgid "APIFuzzing|Username for basic authentication"
msgstr ""
@@ -1568,9 +1578,6 @@ msgstr "ä¸æ­£åˆ©ç”¨ãƒ¬ãƒãƒ¼ãƒˆ"
msgid "Abuse reports notification email"
msgstr ""
-msgid "Abuse reports will be sent to this address if it is set. Abuse reports are always available in the admin area."
-msgstr ""
-
msgid "Accept invitation"
msgstr "招待をå—ã‘入れる"
@@ -1607,12 +1614,18 @@ msgstr "アクセスã¯ç¦æ­¢ã•ã‚Œã¦ã„ã¾ã™ã€‚アクセスレベルを確èª
msgid "Access granted"
msgstr "アクセスãŒè¨±å¯ã•ã‚Œã¾ã—ãŸ"
+msgid "Access key ID"
+msgstr ""
+
msgid "Access requests"
msgstr "アクセスリクエスト"
msgid "Access to '%{classification_label}' not allowed"
msgstr "'%{classification_label}'ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ã¯è¨±å¯ã•ã‚Œã¦ã„ã¾ã›ã‚“"
+msgid "Access tokens expire after 2 hours. A refresh token may be used at any time to generate a new access token. Non-expiring access tokens are deprecated. Clear this setting to enable backward compatibility."
+msgstr ""
+
msgid "AccessDropdown|Deploy Keys"
msgstr "デプロイキー"
@@ -1925,6 +1938,9 @@ msgstr "æ–°ã—ã„アプリケーションを追加"
msgid "Add new directory"
msgstr "æ–°è¦ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã‚’追加"
+msgid "Add new service account"
+msgstr ""
+
msgid "Add or remove previously merged commits"
msgstr "以å‰ã«ãƒžãƒ¼ã‚¸ã—ãŸã‚³ãƒŸãƒƒãƒˆã‚’追加ã¾ãŸã¯å‰Šé™¤"
@@ -2162,6 +2178,9 @@ msgstr "開発者"
msgid "AdminArea|Features"
msgstr "機能"
+msgid "AdminArea|Get security updates from GitLab and stay up to date"
+msgstr ""
+
msgid "AdminArea|Groups"
msgstr ""
@@ -2201,6 +2220,12 @@ msgstr ""
msgid "AdminArea|Reporter"
msgstr "レãƒãƒ¼ã‚¿ãƒ¼"
+msgid "AdminArea|Sign up for the GitLab Security Newsletter to get notified for security updates."
+msgstr ""
+
+msgid "AdminArea|Sign up for the GitLab newsletter"
+msgstr ""
+
msgid "AdminArea|Stop all jobs"
msgstr "å…¨ã¦ã®ã‚¸ãƒ§ãƒ–ã‚’åœæ­¢"
@@ -2270,9 +2295,15 @@ msgstr ""
msgid "AdminSettings|Disable public access to Pages sites"
msgstr ""
+msgid "AdminSettings|Display a banner on merge requests in projects with no pipelines to initiate steps to add a .gitlab-ci.yml file."
+msgstr ""
+
msgid "AdminSettings|Domain verification is an essential security measure for public GitLab sites. Users are required to demonstrate they control a domain before it is enabled. %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "AdminSettings|Enable pipeline suggestion banner"
+msgstr ""
+
msgid "AdminSettings|Enable shared runners for new projects"
msgstr "æ–°ã—ã„プロジェクトã§å…±æœ‰ Runner を有効ã«ã™ã‚‹"
@@ -2744,10 +2775,10 @@ msgstr ""
msgid "Admin|Quarterly reconciliation will occur on %{qrtlyDate}"
msgstr ""
-msgid "Admin|The number of max seats used for your namespace is currently exceeding the number of seats in your subscription. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgid "Admin|The number of max seats in your namespace exceeds the number of seats in your subscription. On %{qrtlyDate}, quarterly reconciliation occurs and you are automatically billed a prorated amount for the overage. No action is needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice. For more information about the timing of the invoicing process, view the documentation."
msgstr ""
-msgid "Admin|The number of maximum users for your instance is currently exceeding the number of users in license. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgid "Admin|The number of max users in your instance exceeds the number of users in your license. On %{qrtlyDate}, quarterly reconciliation occurs and you are automatically billed a prorated amount for the overage. No action is needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice. For more information about the timing of the invoicing process, view the documentation."
msgstr ""
msgid "Admin|View pending user approvals"
@@ -2768,9 +2799,6 @@ msgstr "高度ãªè¨­å®š"
msgid "Advanced export options"
msgstr ""
-msgid "Advanced permissions, Large File Storage and Two-Factor authentication settings."
-msgstr "高度ãªæ¨©é™ã€ãƒ©ãƒ¼ã‚¸ãƒ•ã‚¡ã‚¤ãƒ«ã‚¹ãƒˆãƒ¬ãƒ¼ã‚¸ã€2è¦ç´ èªè¨¼ã®è¨­å®š"
-
msgid "After a successful password update you will be redirected to login screen."
msgstr "パスワードã®æ›´æ–°ã«æˆåŠŸã™ã‚‹ã¨ã€ãƒ­ã‚°ã‚¤ãƒ³ç”»é¢ã«ãƒªãƒ€ã‚¤ãƒ¬ã‚¯ãƒˆã•ã‚Œã¾ã™ã€‚"
@@ -2789,12 +2817,14 @@ msgstr ""
msgid "After you've reviewed these contribution guidelines, you'll be all set to"
msgstr ""
+msgid "Akismet"
+msgstr ""
+
msgid "Akismet API Key"
msgstr ""
-msgid "Alert"
-msgid_plural "Alerts"
-msgstr[0] "アラート"
+msgid "Akismet helps prevent the creation of spam issues in public projects."
+msgstr ""
msgid "AlertManagement|Acknowledged"
msgstr "確èªæ¸ˆã¿"
@@ -3150,6 +3180,9 @@ msgstr "%{replicableType} ã¯ã™ã¹ã¦ã€%{action}ã«ã‚¹ã‚±ã‚¸ãƒ¥ãƒ¼ãƒ«ã•ã‚Œã¦
msgid "All (default)"
msgstr "å…¨ã¦(デフォルト)"
+msgid "All GitLab"
+msgstr ""
+
msgid "All Members"
msgstr "ã™ã¹ã¦ã®ãƒ¡ãƒ³ãƒãƒ¼"
@@ -3264,6 +3297,9 @@ msgstr ""
msgid "Allow this secondary node to replicate content on Object Storage"
msgstr "ã“ã®ã‚»ã‚«ãƒ³ãƒ€ãƒªãƒŽãƒ¼ãƒ‰ãŒã‚ªãƒ–ジェクトストレージ上ã«ã‚³ãƒ³ãƒ†ãƒ³ãƒ„を複製ã™ã‚‹ã“ã¨ã‚’許å¯ã—ã¾ã™"
+msgid "Allow use of licensed EE features"
+msgstr ""
+
msgid "Allow users to dismiss the broadcast message"
msgstr ""
@@ -3339,9 +3375,6 @@ msgstr ""
msgid "Amazon authentication is not %{link_start}correctly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr "Amazon èªè¨¼ã¯ %{link_start} æ­£ã—ã設定 %{link_end} ã§ãã¦ã„ã¾ã›ã‚“。ã“ã®ã‚µãƒ¼ãƒ“スを使用ã—ãŸã„å ´åˆã€ GitLab ã®ç®¡ç†è€…ã«å•ã„åˆã‚ã›ã¦ãã ã•ã„。"
-msgid "Amount of time (in hours) that users are allowed to skip forced configuration of two-factor authentication"
-msgstr "ユーザーãŒå¼·åˆ¶çš„ãª2è¦ç´ èªè¨¼ã‚’無視ã§ãる時間(時間å˜ä½)"
-
msgid "An %{link_start}alert%{link_end} with the same fingerprint is already open. To change the status of this alert, resolve the linked alert."
msgstr ""
@@ -3402,12 +3435,6 @@ msgstr "Blobã®ãƒ—レビュー中ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸ"
msgid "An error occurred when removing the label."
msgstr ""
-msgid "An error occurred when toggling the notification subscription"
-msgstr "通知購読ã®åˆ‡ã‚Šæ›¿ãˆæ™‚ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸ"
-
-msgid "An error occurred when updating the issue weight"
-msgstr "イシューã®ã‚¦ã‚§ã‚¤ãƒˆæ›´æ–°æ™‚ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸ"
-
msgid "An error occurred when updating the title"
msgstr ""
@@ -3456,6 +3483,9 @@ msgstr ""
msgid "An error occurred while enabling Service Desk."
msgstr "サービスデスクã®æœ‰åŠ¹åŒ–中ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚"
+msgid "An error occurred while fetching Markdown preview"
+msgstr ""
+
msgid "An error occurred while fetching ancestors"
msgstr ""
@@ -3486,9 +3516,6 @@ msgstr "イシューã®å–得中ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚"
msgid "An error occurred while fetching label colors."
msgstr "ラベルã®è‰²ã®å–得中ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚"
-msgid "An error occurred while fetching markdown preview"
-msgstr "Markdown プレビューã®å–得中ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸ"
-
msgid "An error occurred while fetching participants"
msgstr ""
@@ -3504,9 +3531,6 @@ msgstr "プロジェクトã®ã‚ªãƒ¼ãƒˆã‚³ãƒ³ãƒ—リートå–得中ã«ã‚¨ãƒ©ãƒ¼ãŒ
msgid "An error occurred while fetching reference"
msgstr ""
-msgid "An error occurred while fetching sidebar data"
-msgstr "サイドãƒãƒ¼ã®ãƒ‡ãƒ¼ã‚¿å–得中ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚"
-
msgid "An error occurred while fetching tags. Retry the search."
msgstr ""
@@ -3582,6 +3606,9 @@ msgstr "イシューã®èª­ã¿è¾¼ã¿ä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸ"
msgid "An error occurred while loading merge requests."
msgstr "マージリクエストã®ãƒ­ãƒ¼ãƒ‰ä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚"
+msgid "An error occurred while loading projects."
+msgstr ""
+
msgid "An error occurred while loading the Needs tab."
msgstr ""
@@ -3816,12 +3843,6 @@ msgstr "ä»»æ„ã®ä½œæˆè€…"
msgid "Any Milestone"
msgstr ""
-msgid "Any branch"
-msgstr "ä»»æ„ブランãƒ"
-
-msgid "Any eligible user"
-msgstr "資格ã®ã‚るユーザー"
-
msgid "Any encrypted tokens"
msgstr "æš—å·åŒ–済ã¿ãƒˆãƒ¼ã‚¯ãƒ³"
@@ -3840,6 +3861,9 @@ msgstr "ä»»æ„ã®ãƒžã‚¤ãƒ«ã‚¹ãƒˆãƒ¼ãƒ³"
msgid "Any namespace"
msgstr "ä»»æ„ã®ãƒãƒ¼ãƒ ã‚¹ãƒšãƒ¼ã‚¹"
+msgid "App Engine description and apps that are suitable for this deployment target"
+msgstr ""
+
msgid "App ID"
msgstr "アプリID"
@@ -3986,6 +4010,10 @@ msgstr "é©ç”¨æ¸ˆã¿"
msgid "Apply"
msgstr "é©ç”¨"
+msgid "Apply %d suggestion"
+msgid_plural "Apply %d suggestions"
+msgstr[0] ""
+
msgid "Apply a label"
msgstr "ラベルをé©ç”¨"
@@ -3995,14 +4023,11 @@ msgstr "テンプレートをé©ç”¨"
msgid "Apply suggestion"
msgstr "æ案をé©ç”¨"
-msgid "Apply suggestions"
-msgstr "æ案をé©ç”¨"
-
msgid "Apply template"
msgstr "テンプレートをé©ç”¨"
-msgid "Apply this approval rule to any branch or a specific protected branch."
-msgstr "承èªãƒ«ãƒ¼ãƒ«ã‚’ä»»æ„ã®ãƒ–ランãƒã¾ãŸã¯ç‰¹å®šã®ä¿è­·ãƒ–ランãƒã«é©ç”¨ã—ã¾ã™ã€‚"
+msgid "Apply this approval rule to all branches or a specific protected branch."
+msgstr ""
msgid "Applying"
msgstr "é©ç”¨"
@@ -4140,9 +4165,6 @@ msgstr ""
msgid "ApprovalSettings|Prevent editing approval rules in projects and merge requests."
msgstr ""
-msgid "ApprovalSettings|Prevent editing approval rules in projects and merge requests. "
-msgstr ""
-
msgid "ApprovalSettings|Remove all approvals when commits are added to the source branch."
msgstr ""
@@ -4158,6 +4180,9 @@ msgstr ""
msgid "ApprovalSettings|This setting is configured at the instance level and can only be changed by an administrator."
msgstr ""
+msgid "ApprovalSettings|This setting is configured in %{groupName} and can only be changed by an administrator or group owner."
+msgstr ""
+
msgid "ApprovalStatusTooltip|Adheres to separation of duties"
msgstr ""
@@ -4641,9 +4666,6 @@ msgstr "GitHub ã§èªè¨¼ã—ã¾ã™"
msgid "Authenticated API rate limit period in seconds"
msgstr ""
-msgid "Authenticated API request rate limit"
-msgstr ""
-
msgid "Authenticated API requests"
msgstr ""
@@ -4653,10 +4675,10 @@ msgstr ""
msgid "Authenticated Git LFS request rate limit"
msgstr ""
-msgid "Authenticated web rate limit period in seconds"
+msgid "Authenticated Git LFS requests"
msgstr ""
-msgid "Authenticated web request rate limit"
+msgid "Authenticated web rate limit period in seconds"
msgstr ""
msgid "Authenticated web requests"
@@ -5034,9 +5056,6 @@ msgstr ""
msgid "Below you will find all the groups that are public."
msgstr "以下ã«å…¬é–‹ã•ã‚Œã¦ã„る全グループを表示ã—ã¾ã™ã€‚"
-msgid "Beta"
-msgstr ""
-
msgid "Bi-weekly code coverage"
msgstr ""
@@ -5275,6 +5294,21 @@ msgstr "ブログ"
msgid "Board scope affects which issues are displayed for anyone who visits this board"
msgstr "ボードã®ç¯„囲ã¯ã€ã“ã®ãƒœãƒ¼ãƒ‰ã«ã‚¢ã‚¯ã‚»ã‚¹ã—ãŸä»»æ„ã®äººã«è¡¨ç¤ºã•ã‚Œã‚‹ã€ã‚¤ã‚·ãƒ¥ãƒ¼ã«å½±éŸ¿ã—ã¾ã™"
+msgid "BoardNewEpic|Groups"
+msgstr ""
+
+msgid "BoardNewEpic|Loading groups"
+msgstr ""
+
+msgid "BoardNewEpic|No matching results"
+msgstr ""
+
+msgid "BoardNewEpic|Search groups"
+msgstr ""
+
+msgid "BoardNewEpic|Select a group"
+msgstr ""
+
msgid "BoardNewIssue|No matching results"
msgstr ""
@@ -5351,6 +5385,9 @@ msgstr ""
msgid "Boards|An error occurred while creating the list. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching child groups. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching group projects. Please try again."
msgstr ""
@@ -5682,6 +5719,9 @@ msgstr ""
msgid "Bulk update"
msgstr ""
+msgid "BulkImports|Re-import creates a new group. It does not sync with the existing group."
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -5691,6 +5731,9 @@ msgstr ""
msgid "BulkImport|From source group"
msgstr ""
+msgid "BulkImport|Group import history"
+msgstr ""
+
msgid "BulkImport|Import failed: Destination cannot be a subgroup of the source group. Change the destination and try again."
msgstr ""
@@ -5703,9 +5746,18 @@ msgstr ""
msgid "BulkImport|Importing the group failed"
msgstr ""
+msgid "BulkImport|Last imported to %{link}"
+msgstr ""
+
msgid "BulkImport|Name already exists."
msgstr ""
+msgid "BulkImport|New group"
+msgstr ""
+
+msgid "BulkImport|No history is available"
+msgstr ""
+
msgid "BulkImport|No parent"
msgstr ""
@@ -5718,6 +5770,9 @@ msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} matching filter \"%{filter}\" from %{link}"
msgstr ""
+msgid "BulkImport|Source group"
+msgstr ""
+
msgid "BulkImport|To new group"
msgstr ""
@@ -5727,6 +5782,9 @@ msgstr ""
msgid "BulkImport|You have no groups to import"
msgstr ""
+msgid "BulkImport|Your imported groups will appear here."
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -5968,6 +6026,9 @@ msgstr ""
msgid "Can be manually deployed to"
msgstr ""
+msgid "Can be overridden in each project."
+msgstr ""
+
msgid "Can create groups:"
msgstr ""
@@ -6070,6 +6131,9 @@ msgstr ""
msgid "Cancelling Preview"
msgstr "プレビューをキャンセル"
+msgid "Cannot assign a confidential epic to a non-confidential issue. Make the issue confidential and try again"
+msgstr ""
+
msgid "Cannot be assigned to other projects."
msgstr ""
@@ -6121,9 +6185,6 @@ msgstr "権é™ãŒä¸å分ãªãŸã‚ã€ã‚¤ã‚·ãƒ¥ãƒ¼ã‚’プロモートã§ãã¾ã›
msgid "Cannot refer to a group %{timebox_type} by an internal id!"
msgstr ""
-msgid "Cannot set confidential epic for a non-confidential issue"
-msgstr "公開ã•ã‚Œã¦ã„るイシューã®ãŸã‚ã€ã‚¨ãƒ”ックをéžå…¬é–‹ã«ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“"
-
msgid "Cannot show preview. For previews on sketch files, they must have the file format introduced by Sketch version 43 and above."
msgstr "プレビューを表示ã§ãã¾ã›ã‚“。Sketch ファイルをプレビューã™ã‚‹ã«ã¯ã€Sketch ãƒãƒ¼ã‚¸ãƒ§ãƒ³43以é™ã§å°Žå…¥ã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«å½¢å¼ãŒå¿…è¦ã§ã™ã€‚"
@@ -6361,15 +6422,15 @@ msgstr "åå‰ç©ºé–“ã®è¨ˆç”»ã§æ©Ÿèƒ½ãŒåˆ©ç”¨ã§ãã‚‹ã‹ãƒã‚§ãƒƒã‚¯ã™ã‚‹"
msgid "Check out, review, and merge locally"
msgstr ""
-msgid "Check the %{docs_link_start}documentation%{docs_link_end}."
-msgstr "%{docs_link_start}ドキュメント%{docs_link_end}を確èª"
-
msgid "Check the current instance configuration "
msgstr ""
msgid "Check the elasticsearch.log file to debug why the migration was halted and make any changes before retrying the migration. When you fix the cause of the failure, click \"Retry migration\", and the migration will be scheduled to be retried in the background."
msgstr ""
+msgid "Check with your administrator."
+msgstr ""
+
msgid "Check your Docker images for known vulnerabilities."
msgstr "既知ã®è„†å¼±æ€§ã«å¯¾ã—ã¦ã€Dockerイメージをãƒã‚§ãƒƒã‚¯ã™ã‚‹."
@@ -6400,6 +6461,9 @@ msgstr "ユーザーåãŒåˆ©ç”¨å¯èƒ½ã‹ç¢ºèªã—ã¦ã„ã¾ã™..."
msgid "Checkout"
msgstr "Checkout"
+msgid "Checkout|$%{selectedPlanPrice} per 10 GB storage per pack"
+msgstr ""
+
msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 minutes"
msgstr ""
@@ -6419,16 +6483,22 @@ msgstr ""
msgid "Checkout|%{name}'s GitLab subscription"
msgstr "%{name} 㮠GitLab サブスクリプション"
+msgid "Checkout|%{name}'s storage subscription"
+msgstr ""
+
+msgid "Checkout|%{quantity} GB of storage"
+msgstr ""
+
+msgid "Checkout|%{quantity} storage pack"
+msgid_plural "Checkout|%{quantity} storage packs"
+msgstr[0] ""
+
msgid "Checkout|%{selectedPlanText} plan"
msgstr "%{selectedPlanText} プラン"
msgid "Checkout|%{startDate} - %{endDate}"
msgstr "%{startDate} ã‹ã‚‰ %{endDate} ã¾ã§"
-msgid "Checkout|%{totalCiMinutes} CI minute"
-msgid_plural "Checkout|%{totalCiMinutes} CI minutes"
-msgstr[0] ""
-
msgid "Checkout|%{totalCiMinutes} CI minutes"
msgstr ""
@@ -6504,6 +6574,9 @@ msgstr ""
msgid "Checkout|Failed to register credit card. Please try again."
msgstr "クレジットカードã®ç™»éŒ²ã«å¤±æ•—ã—ã¾ã—ãŸã€‚ã‚‚ã†ä¸€åº¦ã‚„ã‚Šç›´ã—ã¦ãã ã•ã„。"
+msgid "Checkout|GB"
+msgstr ""
+
msgid "Checkout|GitLab group"
msgstr "GitLab グループ"
@@ -6540,6 +6613,9 @@ msgstr "é¸æŠž"
msgid "Checkout|State"
msgstr "都é“府県ã¾ãŸã¯å·ž"
+msgid "Checkout|Storage packs"
+msgstr ""
+
msgid "Checkout|Street address"
msgstr ""
@@ -6561,6 +6637,9 @@ msgstr "åˆè¨ˆ"
msgid "Checkout|Total minutes: %{quantity}"
msgstr ""
+msgid "Checkout|Total storage: %{quantity} GB"
+msgstr ""
+
msgid "Checkout|Users"
msgstr "ユーザー"
@@ -6570,16 +6649,25 @@ msgstr "ãƒã‚§ãƒƒã‚¯ã‚¢ã‚¦ãƒˆå¾Œã«æ–°ã—ã„グループを作æˆã—ã¾ã™ã€‚"
msgid "Checkout|Your organization"
msgstr "組織"
+msgid "Checkout|Your storage subscription has the same term as your main subscription, and the price is prorated accordingly."
+msgstr ""
+
msgid "Checkout|Your subscription will be applied to this group"
msgstr "ã‚ãªãŸã®ã‚µãƒ–スクリプションã¯ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«é©ç”¨ã•ã‚Œã¾ã™"
msgid "Checkout|Zip code"
msgstr ""
+msgid "Checkout|a storage subscription"
+msgstr ""
+
msgid "Checkout|company or team"
msgstr "会社ã¾ãŸã¯ãƒãƒ¼ãƒ "
-msgid "Checkout|x 1,000 minutes per pack = %{strong}"
+msgid "Checkout|minutes"
+msgstr ""
+
+msgid "Checkout|x %{quantity} %{units} per pack ="
msgstr ""
msgid "Cherry-pick this commit"
@@ -6936,6 +7024,9 @@ msgstr ""
msgid "CloneIssue|Cannot clone issue to target project as it is pending deletion."
msgstr ""
+msgid "CloneIssue|Cannot clone issues of '%{issue_type}' type."
+msgstr ""
+
msgid "Cloned this issue to %{path_to_project}."
msgstr ""
@@ -6990,7 +7081,10 @@ msgstr ""
msgid "Closes this %{quick_action_target}."
msgstr "ã“ã® %{quick_action_target} ã‚’é–‰ã˜ã‚‹ã€‚"
-msgid "Cloud licenses can not be removed."
+msgid "Cloud Functions description and apps that are suitable for this deployment target"
+msgstr ""
+
+msgid "Cloud Run description and apps that are suitable for this deployment target"
msgstr ""
msgid "Cluster"
@@ -7017,6 +7111,12 @@ msgstr ""
msgid "ClusterAgents|Access tokens"
msgstr ""
+msgid "ClusterAgents|Agent might not be connected to GitLab"
+msgstr ""
+
+msgid "ClusterAgents|Agent never connected to GitLab"
+msgstr ""
+
msgid "ClusterAgents|Alternative installation methods"
msgstr ""
@@ -7032,6 +7132,12 @@ msgstr ""
msgid "ClusterAgents|Configuration"
msgstr ""
+msgid "ClusterAgents|Connected"
+msgstr ""
+
+msgid "ClusterAgents|Connection status"
+msgstr ""
+
msgid "ClusterAgents|Copy token"
msgstr ""
@@ -7050,6 +7156,9 @@ msgstr ""
msgid "ClusterAgents|For alternative installation methods %{linkStart}go to the documentation%{linkEnd}."
msgstr ""
+msgid "ClusterAgents|For more troubleshooting information go to"
+msgstr ""
+
msgid "ClusterAgents|Go to the repository"
msgstr ""
@@ -7065,18 +7174,30 @@ msgstr ""
msgid "ClusterAgents|Integrate with the GitLab Agent"
msgstr ""
-msgid "ClusterAgents|Last used"
+msgid "ClusterAgents|Last connected %{timeAgo}."
+msgstr ""
+
+msgid "ClusterAgents|Last contact"
msgstr ""
msgid "ClusterAgents|Learn how to create an agent access token"
msgstr ""
+msgid "ClusterAgents|Make sure you are using a valid token."
+msgstr ""
+
msgid "ClusterAgents|Name"
msgstr ""
msgid "ClusterAgents|Never"
msgstr ""
+msgid "ClusterAgents|Never connected"
+msgstr ""
+
+msgid "ClusterAgents|Not connected"
+msgstr ""
+
msgid "ClusterAgents|Read more about getting started"
msgstr ""
@@ -7098,6 +7219,9 @@ msgstr ""
msgid "ClusterAgents|Select which Agent you want to install"
msgstr ""
+msgid "ClusterAgents|The Agent has not been connected in a long time. There might be a connectivity issue. Last contact was %{timeAgo}."
+msgstr ""
+
msgid "ClusterAgents|The GitLab Agent also requires %{linkStart}enabling the Agent Server%{linkEnd}"
msgstr ""
@@ -7125,9 +7249,6 @@ msgstr ""
msgid "ClusterAgents|You will need to create a token to connect to your agent"
msgstr ""
-msgid "ClusterAgent|This feature is only available for premium plans"
-msgstr ""
-
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -7317,9 +7438,6 @@ msgstr "サブãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚’ロードã§ãã¾ã›ã‚“ã§ã—ãŸ"
msgid "ClusterIntegration|Create Kubernetes cluster"
msgstr "Kubernetes クラスターを作æˆ"
-msgid "ClusterIntegration|Create a provision role on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the account and external ID above. %{startMoreInfoLink}More information%{endLink}"
-msgstr "上記ã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã¨å¤–部IDを使用ã—ã¦ã€%{startAwsLink} Amazon Web Services%{externalLinkIcon}%{endLink}ã«ãƒ—ロビジョニングロールを作æˆã—ã¾ã™ã€‚ %{startMoreInfoLink}詳細情報%{endLink}"
-
msgid "ClusterIntegration|Create cluster on"
msgstr "クラスターを作æˆ"
@@ -7752,7 +7870,7 @@ msgstr "ドメインを指定ã™ã‚‹ã¨ã€Auto Review App 㨠Auto Deployステãƒ
msgid "ClusterIntegration|Subnets"
msgstr "サブãƒãƒƒãƒˆ"
-msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provisioned role, first create one on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the above account and external IDs. %{startMoreInfoLink}More information%{endLink}"
+msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provisioned role, first create one on %{awsLinkStart}Amazon Web Services %{awsLinkEnd} using the above account and external IDs. %{moreInfoStart}More information%{moreInfoEnd}"
msgstr ""
msgid "ClusterIntegration|The Kubernetes certificate used to authenticate to the cluster."
@@ -7986,6 +8104,9 @@ msgstr "マイルストーンを折りãŸãŸã‚€"
msgid "Collapse replies"
msgstr ""
+msgid "Collapse settings section"
+msgstr ""
+
msgid "Collapse sidebar"
msgstr "サイドãƒãƒ¼ã‚’éš ã™"
@@ -8004,6 +8125,9 @@ msgstr "ComboSearch ãŒå®šç¾©ã•ã‚Œã¦ã„ã¾ã›ã‚“"
msgid "Comma-separated list of email addresses."
msgstr ""
+msgid "Comma-separated list of users allowed to exceed the rate limit."
+msgstr ""
+
msgid "Comma-separated, e.g. '1.1.1.1, 2.2.2.0/24'"
msgstr ""
@@ -8323,6 +8447,9 @@ msgstr ""
msgid "Configure %{repository_checks_link_start}repository checks%{link_end} and %{housekeeping_link_start}housekeeping%{link_end} on repositories."
msgstr ""
+msgid "Configure CAPTCHAs, IP address limits, and other anti-spam measures."
+msgstr ""
+
msgid "Configure Dependency Scanning in `.gitlab-ci.yml` using the GitLab managed template. You can [add variable overrides](https://docs.gitlab.com/ee/user/application_security/dependency_scanning/#customizing-the-dependency-scanning-settings) to customize Dependency Scanning settings."
msgstr ""
@@ -8359,17 +8486,14 @@ msgstr "トレーシングã®è¨­å®š"
msgid "Configure a %{codeStart}.gitlab-webide.yml%{codeEnd} file in the %{codeStart}.gitlab%{codeEnd} directory to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
msgstr ""
-msgid "Configure existing installation"
-msgstr "既存ã®ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã‚’設定ã™ã‚‹"
-
-msgid "Configure limit for notes created per minute by web and API requests."
+msgid "Configure advanced permissions, Large File Storage, and two-factor authentication settings."
msgstr ""
-msgid "Configure limits for Project/Group Import/Export."
+msgid "Configure approvals by authors and committers on all projects."
msgstr ""
-msgid "Configure limits for web and API requests."
-msgstr "ウェブãŠã‚ˆã³APIリクエストã®åˆ¶é™ã‚’設定ã™ã‚‹ã€‚"
+msgid "Configure existing installation"
+msgstr "既存ã®ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã‚’設定ã™ã‚‹"
msgid "Configure paths to be protected by Rack Attack."
msgstr "Rack 攻撃を防御ã™ã‚‹ãƒ‘スを設定ã—ã¾ã™ã€‚"
@@ -8383,10 +8507,13 @@ msgstr ""
msgid "Configure settings for Advanced Search with Elasticsearch."
msgstr ""
+msgid "Configure specific limits for Files API requests that supersede the general user and IP rate limits."
+msgstr ""
+
msgid "Configure specific limits for Git LFS requests that supersede the general user and IP rate limits."
msgstr ""
-msgid "Configure specific limits for Packages API requests that supersede the general user and IP rate limits."
+msgid "Configure specific limits for deprecated API requests that supersede the general user and IP rate limits."
msgstr ""
msgid "Configure the %{link} integration."
@@ -8398,6 +8525,9 @@ msgstr ""
msgid "Configure the way a user creates a new account."
msgstr "ユーザーãŒæ–°ã—ã„アカウントを作æˆã™ã‚‹æ–¹æ³•ã‚’設定ã—ã¾ã™ã€‚"
+msgid "Configure via Merge Request"
+msgstr ""
+
msgid "Configure which lists are shown for anyone who visits this board"
msgstr ""
@@ -8863,6 +8993,9 @@ msgstr "%{count} 個ã®ã‚¤ãƒ¡ãƒ¼ã‚¸ãŒå«ã¾ã‚Œã¦ã„ã¾ã™(%{size})"
msgid "Content parsed with %{link}."
msgstr ""
+msgid "ContentEditor|Table of Contents"
+msgstr ""
+
msgid "ContentEditor|You have to provide a renderMarkdown function or a custom serializer"
msgstr ""
@@ -9049,6 +9182,9 @@ msgstr "リンクをコピー"
msgid "Copy link to chart"
msgstr "ãƒãƒ£ãƒ¼ãƒˆã¸ã®ãƒªãƒ³ã‚¯ã‚’コピー"
+msgid "Copy prefix"
+msgstr ""
+
msgid "Copy reference"
msgstr "å‚ç…§ã®ã‚³ãƒ”ー"
@@ -9079,6 +9215,9 @@ msgstr "トリガートークンをコピー"
msgid "Copy value"
msgstr "値ã®ã‚³ãƒ”ー"
+msgid "Corpus Management"
+msgstr ""
+
msgid "Corpus Management|Are you sure you want to delete the corpus?"
msgstr ""
@@ -9307,6 +9446,9 @@ msgstr "ブランãƒä½œæˆ"
msgid "Create commit"
msgstr "コミットã®ä½œæˆ"
+msgid "Create common files more quickly, and standardize their format."
+msgstr ""
+
msgid "Create confidential merge request"
msgstr "機密性ã®ã‚るマージリクエストを作æˆã™ã‚‹"
@@ -9340,6 +9482,9 @@ msgstr ""
msgid "Create issue"
msgstr "イシューã®ä½œæˆ"
+msgid "Create issue to resolve all threads"
+msgstr ""
+
msgid "Create iteration"
msgstr "イテレーションã®ä½œæˆ"
@@ -9394,6 +9539,9 @@ msgstr ""
msgid "Create new..."
msgstr "æ–°è¦ä½œæˆ"
+msgid "Create or import your first project"
+msgstr ""
+
msgid "Create project"
msgstr "プロジェクトを作æˆ"
@@ -9751,7 +9899,7 @@ msgstr ""
msgid "Custom notification events"
msgstr "カスタム通知設定"
-msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notificationLinkStart} notification emails%{notificationLinkEnd}."
+msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notificationLinkStart}notification emails%{notificationLinkEnd}."
msgstr ""
msgid "Custom project templates"
@@ -9948,11 +10096,11 @@ msgid "CycleAnalytics|Showing %{subjectFilterText} and %{selectedLabelsCount} la
msgid_plural "CycleAnalytics|Showing %{subjectFilterText} and %{selectedLabelsCount} labels"
msgstr[0] ""
-msgid "CycleAnalytics|Showing data for group '%{groupName}' and %{selectedProjectCount} projects from %{startDate} to %{endDate}"
-msgstr "'%{groupName}' グループ㨠%{selectedProjectCount} プロジェクト㮠%{startDate} ã‹ã‚‰ %{endDate} ã¾ã§ã®ãƒ‡ãƒ¼ã‚¿ã‚’表示"
+msgid "CycleAnalytics|Showing data for group '%{groupName}' and %{selectedProjectCount} projects from %{createdAfter} to %{createdBefore}"
+msgstr ""
-msgid "CycleAnalytics|Showing data for group '%{groupName}' from %{startDate} to %{endDate}"
-msgstr "'%{groupName}' グループ㮠%{startDate} ã‹ã‚‰%{endDate} ã¾ã§ã®ãƒ‡ãƒ¼ã‚¿ã‚’表示"
+msgid "CycleAnalytics|Showing data for group '%{groupName}' from %{createdAfter} to %{createdBefore}"
+msgstr ""
msgid "CycleAnalytics|Stages"
msgstr "ステージ"
@@ -10185,6 +10333,9 @@ msgstr ""
msgid "DastProfiles|Manage profiles"
msgstr ""
+msgid "DastProfiles|Manage site profiles"
+msgstr ""
+
msgid "DastProfiles|Minimum = 0 (no timeout enabled), Maximum = 2880 minutes"
msgstr ""
@@ -10260,6 +10411,9 @@ msgstr ""
msgid "DastProfiles|Scanner name"
msgstr ""
+msgid "DastProfiles|Schedule"
+msgstr ""
+
msgid "DastProfiles|Select branch"
msgstr ""
@@ -10329,7 +10483,7 @@ msgstr ""
msgid "DastProfiles|Website"
msgstr ""
-msgid "DastProfiles|You can either choose a passive scan or validate the target site in your chosen site profile. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
+msgid "DastProfiles|You can either choose a passive scan or validate the target site from the site profile management page. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
msgstr ""
msgid "DastProfiles|You cannot run an active scan against an unvalidated site."
@@ -10501,7 +10655,7 @@ msgstr "æ—¥"
msgid "Days to merge"
msgstr "マージã¾ã§ã®æ—¥æ•°"
-msgid "Deactivate dormant users after 90 days of inactivity. Users can return to active status by signing in to their account. While inactive, a user is not counted as an active user in the instance."
+msgid "Deactivate dormant users after 90 days of inactivity"
msgstr ""
msgid "Dear Administrator,"
@@ -10588,10 +10742,10 @@ msgstr ""
msgid "Define a custom pattern with cron syntax"
msgstr "Cron 構文ã§ã‚«ã‚¹ã‚¿ãƒ ãªãƒ‘ターンを指定ã™ã‚‹"
-msgid "Define approval settings."
+msgid "Define approval rules."
msgstr ""
-msgid "Define approval settings. %{linkStart}Learn more.%{linkEnd}"
+msgid "Define approval rules. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "Define custom rules for what constitutes spam, independent of Akismet"
@@ -10600,7 +10754,7 @@ msgstr ""
msgid "Define environments in the deploy stage(s) in %{code_open}.gitlab-ci.yml%{code_close} to track deployments here."
msgstr ""
-msgid "Define how approval rules are applied as a merge request moves toward completion."
+msgid "Define how approval rules are applied to merge requests."
msgstr ""
msgid "Definition"
@@ -10615,6 +10769,12 @@ msgstr ""
msgid "DelayedJobs|Are you sure you want to run %{job_name} immediately? This job will run automatically after it's timer finishes."
msgstr "%{job_name} ã‚’ã™ãã«å®Ÿè¡Œã—ã¦ã‚‚よã‚ã—ã„ã§ã™ã‹ï¼Ÿã“ã®ã‚¸ãƒ§ãƒ–ã¯ã‚¿ã‚¤ãƒžãƒ¼çµ‚了後自動的ã«å®Ÿè¡Œã•ã‚Œã¾ã™ã€‚"
+msgid "DelayedJobs|Are you sure you want to run %{job_name} immediately? This job will run automatically after its timer finishes."
+msgstr ""
+
+msgid "DelayedJobs|Run the delayed job now?"
+msgstr ""
+
msgid "DelayedJobs|Start now"
msgstr "今ã™ã始ã‚ã‚‹"
@@ -10888,6 +11048,12 @@ msgstr "ä¾å­˜é–¢ä¿‚プロキシ機能ã¯ã€ç¾åœ¨å…¬é–‹ã‚°ãƒ«ãƒ¼ãƒ—ã«åˆ¶é™ã•
msgid "Dependency proxy image prefix"
msgstr ""
+msgid "DependencyProxy|Create a local proxy for storing frequently used upstream images. %{docLinkStart}Learn more%{docLinkEnd} about dependency proxies."
+msgstr ""
+
+msgid "DependencyProxy|Dependency Proxy"
+msgstr ""
+
msgid "DependencyProxy|Toggle Dependency Proxy"
msgstr "ä¾å­˜é–¢ä¿‚プロキシã®åˆ‡ã‚Šæ›¿ãˆ"
@@ -11125,6 +11291,9 @@ msgstr ""
msgid "Deployments"
msgstr ""
+msgid "Deployments to Google Kubernetes Engine can be "
+msgstr ""
+
msgid "Deployments|%{deployments} environment impacted."
msgid_plural "Deployments|%{deployments} environments impacted."
msgstr[0] ""
@@ -11153,6 +11322,9 @@ msgstr ""
msgid "Deployment|success"
msgstr "æˆåŠŸ"
+msgid "Deprecated API rate limits"
+msgstr ""
+
msgid "Deprioritize label"
msgstr "éžå„ªå…ˆãƒ©ãƒ™ãƒ«"
@@ -11555,6 +11727,14 @@ msgstr "(HEAD)"
msgid "DiffsCompareBaseBranch|(base)"
msgstr "(ベース)"
+msgid "Diffs|%d addition"
+msgid_plural "Diffs|%d additions"
+msgstr[0] ""
+
+msgid "Diffs|%d deletion"
+msgid_plural "Diffs|%d deletions"
+msgstr[0] ""
+
msgid "Diffs|No file name available"
msgstr "使用å¯èƒ½ãªãƒ•ã‚¡ã‚¤ãƒ«åãŒã‚ã‚Šã¾ã›ã‚“"
@@ -11564,9 +11744,16 @@ msgstr ""
msgid "Diffs|Show all unchanged lines"
msgstr ""
+msgid "Diffs|Showing %{dropdownStart}%{count} changed file%{dropdownEnd}"
+msgid_plural "Diffs|Showing %{dropdownStart}%{count} changed files%{dropdownEnd}"
+msgstr[0] ""
+
msgid "Diffs|Something went wrong while fetching diff lines."
msgstr "差分行をå–得中ã«ä½•ã‹å•é¡ŒãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚"
+msgid "Diffs|with %{additions} and %{deletions}"
+msgstr ""
+
msgid "Direct member"
msgstr ""
@@ -11691,9 +11878,6 @@ msgid "Dismiss %d selected vulnerability as"
msgid_plural "Dismiss %d selected vulnerabilities as"
msgstr[0] "é¸æŠžã—㟠%d 件脆弱性を無視。ç†ç”±: "
-msgid "Dismiss Value Stream Analytics introduction box"
-msgstr "ãƒãƒªãƒ¥ãƒ¼ã‚¹ãƒˆãƒªãƒ¼ãƒ åˆ†æžã®ç´¹ä»‹ã‚’é–‰ã˜ã‚‹"
-
msgid "Dismiss merge request promotion"
msgstr ""
@@ -12015,6 +12199,9 @@ msgstr ""
msgid "Edit issues"
msgstr "イシューを編集"
+msgid "Edit merge requests"
+msgstr ""
+
msgid "Edit public deploy key"
msgstr "公開デプロイキーã®ç·¨é›†"
@@ -12090,6 +12277,9 @@ msgstr "ãªã—。インデックスã«åå‰ç©ºé–“ã‚’é¸æŠžã—ã¦ãã ã•ã„"
msgid "Elastic|None. Select projects to index."
msgstr "ãªã—。インデックスã™ã‚‹ãƒ—ロジェクトをé¸æŠžã—ã¦ãã ã•ã„"
+msgid "Eligible users"
+msgstr ""
+
msgid "Email"
msgstr "メール"
@@ -12219,6 +12409,9 @@ msgstr "空ã®ãƒ•ã‚¡ã‚¤ãƒ«"
msgid "Enable"
msgstr "有効化ã™ã‚‹"
+msgid "Enable Amazon EKS integration"
+msgstr ""
+
msgid "Enable Auto DevOps"
msgstr "Auto DevOps を有効ã«ã™ã‚‹"
@@ -12252,6 +12445,9 @@ msgstr ""
msgid "Enable SSL verification"
msgstr ""
+msgid "Enable Service Ping"
+msgstr ""
+
msgid "Enable Snowplow tracking"
msgstr ""
@@ -12282,6 +12478,9 @@ msgstr ""
msgid "Enable authenticated Git LFS request rate limit"
msgstr ""
+msgid "Enable authenticated web request rate limit"
+msgstr ""
+
msgid "Enable authentication"
msgstr ""
@@ -12342,7 +12541,7 @@ msgstr ""
msgid "Enable or disable the Pseudonymizer data collection."
msgstr "匿å化データコレクション機能ã®æœ‰åŠ¹åŒ–ã¾ãŸã¯ç„¡åŠ¹åŒ–"
-msgid "Enable or disable version check and service ping."
+msgid "Enable or disable version check and Service Ping."
msgstr ""
msgid "Enable protected paths rate limit"
@@ -12354,18 +12553,12 @@ msgstr "プロキシを有効ã«ã™ã‚‹"
msgid "Enable reCAPTCHA"
msgstr ""
-msgid "Enable reCAPTCHA for login"
-msgstr ""
-
-msgid "Enable reCAPTCHA, Invisible Captcha, Akismet and set IP limits. For reCAPTCHA, we currently only support %{recaptcha_v2_link_start}v2%{recaptcha_v2_link_end}"
+msgid "Enable reCAPTCHA for login."
msgstr ""
msgid "Enable repository checks"
msgstr ""
-msgid "Enable service ping"
-msgstr ""
-
msgid "Enable shared runners for all projects and subgroups in this group."
msgstr ""
@@ -12387,7 +12580,10 @@ msgstr "2è¦ç´ èªè¨¼ã‚’有効ã«ã™ã‚‹"
msgid "Enable unauthenticated API request rate limit"
msgstr ""
-msgid "Enable unauthenticated request rate limit"
+msgid "Enable unauthenticated web request rate limit"
+msgstr ""
+
+msgid "Enable user deactivation emails"
msgstr ""
msgid "Enable version check"
@@ -12423,9 +12619,6 @@ msgstr ""
msgid "Enabled sources for code import during project creation. OmniAuth must be configured for GitHub"
msgstr "プロジェクト作æˆä¸­ã®ã‚³ãƒ¼ãƒ‰ã‚¤ãƒ³ãƒãƒ¼ãƒˆã«æœ‰åŠ¹ãªã‚½ãƒ¼ã‚¹ã€‚ OmniAuth 㯠GitHub 用ã«è¨­å®šã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™"
-msgid "Enabling this will only make licensed EE features available to projects if the project namespace's plan includes the feature or if the project is public."
-msgstr "ã“れを有効ã«ã™ã‚‹ã¨ã€ãƒ—ロジェクトåå‰ç©ºé–“ã®è¨ˆç”»ã«ãã®æ©Ÿèƒ½ãŒå«ã¾ã‚Œã¦ã„ã‚‹å ´åˆã€ã¾ãŸã¯ãƒ—ロジェクトãŒå…¬é–‹ã•ã‚Œã¦ã„ã‚‹å ´åˆã«ã®ã¿ã€ãƒ©ã‚¤ã‚»ãƒ³ã‚¹ã•ã‚ŒãŸEE機能ãŒãã®ãƒ—ロジェクトã§ä½¿ç”¨å¯èƒ½ã«ãªã‚Šã¾ã™ã€‚"
-
msgid "Encountered an error while rendering: %{err}"
msgstr "レンダリング中ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸ: %{err}"
@@ -12474,9 +12667,6 @@ msgstr ""
msgid "Enter Admin Mode"
msgstr "管ç†è€…モードã«ã—ã¾ã™"
-msgid "Enter IP address range"
-msgstr "IPアドレスã®ç¯„囲を入力"
-
msgid "Enter a number"
msgstr "数値ã®å…¥åŠ›"
@@ -12489,9 +12679,6 @@ msgstr ""
msgid "Enter at least three characters to search"
msgstr "å°‘ãªãã¨ã‚‚3文字以上ã§æ¤œç´¢ã—ã¦ãã ã•ã„"
-msgid "Enter domain"
-msgstr "ドメインを入力"
-
msgid "Enter in your Bitbucket Server URL and personal access token below"
msgstr "ã‚ãªãŸã® Bitbucket Server ã® URL ã¨ä»¥ä¸‹ã®å€‹äººã‚¢ã‚¯ã‚»ã‚¹ãƒˆãƒ¼ã‚¯ãƒ³ã‚’入力ã—ã¦ãã ã•ã„"
@@ -12678,9 +12865,6 @@ msgstr "デプロイ"
msgid "Environments|Deployment %{status}"
msgstr ""
-msgid "Environments|Dismiss"
-msgstr ""
-
msgid "Environments|Enable review app"
msgstr "Review Appを有効ã«ã™ã‚‹"
@@ -12693,9 +12877,6 @@ msgstr "環境一覧"
msgid "Environments|Environments are places where code gets deployed, such as staging or production."
msgstr "環境ã¨ã¯ã€staging ã‚„ production ã¨ã„ã£ãŸã‚³ãƒ¼ãƒ‰ã‚’デプロイã™ã‚‹å…ˆã§ã™ã€‚"
-msgid "Environments|Help us improve environments"
-msgstr ""
-
msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
msgstr "クラスターã«Elastic Stackをインストールã—ã¦ã€å…¨æ–‡æ¤œç´¢ç­‰ã®é«˜åº¦ãªæ‹¡å¼µã‚¯ã‚¨ãƒªæ©Ÿèƒ½ã‚’有効ã«ã—ã¾ã™ã€‚"
@@ -12732,6 +12913,9 @@ msgstr "表示ã™ã‚‹ãƒãƒƒãƒ‰ã¯ã‚ã‚Šã¾ã›ã‚“"
msgid "Environments|Note that this action will stop the environment, but it will %{emphasisStart}not%{emphasisEnd} have an effect on any existing deployment due to no “stop environment action†being defined in the %{ciConfigLinkStart}.gitlab-ci.yml%{ciConfigLinkEnd} file."
msgstr "ã“ã®ã‚¢ã‚¯ã‚·ãƒ§ãƒ³ã¯ç’°å¢ƒã‚’åœæ­¢ã™ã‚‹ã“ã¨ã«æ³¨æ„ã—ã¦ãã ã•ã„。ã—ã‹ã—ã€%{ciConfigLinkStart}.gitlab-ci.yml%{ciConfigLinkEnd} ファイルã§å®šç¾©ã•ã‚Œã¦ã„ã‚‹ã€ç’°å¢ƒåœæ­¢ã‚¢ã‚¯ã‚·ãƒ§ãƒ³ä»¥å¤–ã«ã‚ˆã‚‹ã€ã‚らゆる既存ã®ãƒ‡ãƒ—ロイメントã«å½±éŸ¿ã‚’ %{emphasisStart}与ãˆã¾ã›ã‚“%{emphasisEnd}。"
+msgid "Environments|Open"
+msgstr ""
+
msgid "Environments|Open live environment"
msgstr "ライブ環境を開ã"
@@ -12771,9 +12955,6 @@ msgstr "環境ã®åœæ­¢"
msgid "Environments|Stopping %{environmentName}"
msgstr ""
-msgid "Environments|Take the survey"
-msgstr ""
-
msgid "Environments|There was an error fetching the logs. Please try again."
msgstr ""
@@ -12795,9 +12976,6 @@ msgstr "更新済ã¿"
msgid "Environments|You don't have any environments right now"
msgstr "ã¾ã ç’°å¢ƒãŒã‚ã‚Šã¾ã›ã‚“。"
-msgid "Environments|Your feedback helps GitLab make environments better for you and other users. Participate and enter a sweepstake to win a USD 30 gift card."
-msgstr ""
-
msgid "Environments|by %{avatar}"
msgstr ""
@@ -13080,8 +13258,8 @@ msgstr "エラーãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚ユーザーã¯ãƒ­ãƒƒã‚¯è§£é™¤ã•ã‚Œã¾
msgid "Error parsing CSV file. Please make sure it has"
msgstr ""
-msgid "Error rendering markdown preview"
-msgstr "Markdownプレビューã®ãƒ¬ãƒ³ãƒ€ãƒªãƒ³ã‚°ã‚¨ãƒ©ãƒ¼"
+msgid "Error rendering Markdown preview"
+msgstr ""
msgid "Error saving label update."
msgstr "ラベルã®æ›´æ–°ä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚"
@@ -13128,6 +13306,9 @@ msgstr "Akismet ã§ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚詳細ã«ã¤ã„ã¦ã¯ãƒ­ã‚°ã
msgid "Error: %{error_message}"
msgstr ""
+msgid "Error: Couldn't load some or all of the changes."
+msgstr ""
+
msgid "Error: No AWS credentials were supplied"
msgstr ""
@@ -13161,6 +13342,9 @@ msgstr ""
msgid "ErrorTracking|Enable error tracking"
msgstr ""
+msgid "ErrorTracking|Error tracking backend"
+msgstr ""
+
msgid "ErrorTracking|If you self-host Sentry, enter your Sentry instance's full URL. If you use Sentry's hosted solution, enter https://sentry.io"
msgstr ""
@@ -13194,6 +13378,12 @@ msgstr ""
msgid "Escalation policies must have at least one rule"
msgstr ""
+msgid "EscalationPolicies|%{clockIcon} IF alert is not %{alertStatus} in %{minutes}"
+msgstr ""
+
+msgid "EscalationPolicies|%{notificationIcon} THEN %{doAction} %{forScheduleOrUser}"
+msgstr ""
+
msgid "EscalationPolicies|+ Add an additional rule"
msgstr ""
@@ -13236,13 +13426,13 @@ msgstr ""
msgid "EscalationPolicies|Escalation policies"
msgstr ""
-msgid "EscalationPolicies|Escalation rules"
+msgid "EscalationPolicies|Escalation policy %{obstacle} in Project %{project}"
msgstr ""
-msgid "EscalationPolicies|Failed to load oncall-schedules"
+msgid "EscalationPolicies|Escalation rules"
msgstr ""
-msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} %{then} THEN %{doAction} %{scheduleOrUser}"
+msgid "EscalationPolicies|Failed to load oncall-schedules"
msgstr ""
msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} minutes"
@@ -13320,18 +13510,36 @@ msgstr "イベント"
msgid "Every %{action} attempt has failed: %{job_error_message}. Please try again."
msgstr "ã™ã¹ã¦ã® %{action} ãŒå¤±æ•—ã—ã¾ã—ãŸï¼š %{job_error_message}。もã†ä¸€åº¦ã‚„ã‚Šç›´ã—ã¦ãã ã•ã„。"
+msgid "Every 3 months"
+msgstr ""
+
+msgid "Every 3 months on the %{day} at %{time} %{timezone}"
+msgstr ""
+
+msgid "Every 6 months"
+msgstr ""
+
+msgid "Every 6 months on the %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Every day"
msgstr "毎日"
msgid "Every day (at %{time})"
msgstr ""
+msgid "Every day at %{time} %{timezone}"
+msgstr ""
+
msgid "Every month"
msgstr "毎月"
msgid "Every month (Day %{day} at %{time})"
msgstr ""
+msgid "Every month on the %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Every three months"
msgstr "3ヶ月毎"
@@ -13345,6 +13553,15 @@ msgstr[0] ""
msgid "Every week (%{weekday} at %{time})"
msgstr ""
+msgid "Every week on %{day} at %{time} %{timezone}"
+msgstr ""
+
+msgid "Every year"
+msgstr ""
+
+msgid "Every year on %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Everyone"
msgstr "全員"
@@ -13381,9 +13598,6 @@ msgstr "証拠集ã‚"
msgid "Exactly one of %{attributes} is required"
msgstr ""
-msgid "Example: %{ip_address}. %{read_more_link}."
-msgstr ""
-
msgid "Example: @sub\\.company\\.com$"
msgstr "例: @sub\\.company\\.com$"
@@ -13450,15 +13664,15 @@ msgstr ""
msgid "Expand pipeline"
msgstr ""
+msgid "Expand settings section"
+msgstr ""
+
msgid "Expand sidebar"
msgstr "サイドãƒãƒ¼ã‚’é–‹ã"
msgid "Expected documents: %{expected_documents}"
msgstr ""
-msgid "Experienced"
-msgstr ""
-
msgid "ExperimentSubject|Must have exactly one of User, Namespace, or Project."
msgstr ""
@@ -13741,9 +13955,6 @@ msgstr ""
msgid "Failed to load related branches"
msgstr "関連ã™ã‚‹ãƒ–ランãƒã®èª­ã¿è¾¼ã¿ã«å¤±æ•—ã—ã¾ã—ãŸ"
-msgid "Failed to load sidebar lock status"
-msgstr ""
-
msgid "Failed to load stacktrace."
msgstr "スタックトレースã®ãƒ­ãƒ¼ãƒ‰ã«å¤±æ•—ã—ã¾ã—ãŸã€‚"
@@ -14166,6 +14377,9 @@ msgstr ""
msgid "Files"
msgstr "ファイル"
+msgid "Files API Rate Limits"
+msgstr ""
+
msgid "Files breadcrumb"
msgstr "ファイルã®ãƒ‘ンããšãƒªã‚¹ãƒˆ"
@@ -14578,7 +14792,7 @@ msgid "General Settings"
msgstr "全般設定"
msgid "General pipelines"
-msgstr "一般ã®ãƒ‘イプライン"
+msgstr ""
msgid "Generate a default set of labels"
msgstr "åˆæœŸè¨­å®šãƒ©ãƒ™ãƒ«ã‚»ãƒƒãƒˆã‚’生æˆã™ã‚‹"
@@ -15165,6 +15379,9 @@ msgstr "GitLab for Slack"
msgid "GitLab group: %{source_link}"
msgstr ""
+msgid "GitLab informs you if a new version is available."
+msgstr ""
+
msgid "GitLab is a complete DevOps platform, delivered as a single application, fundamentally changing the way Development, Security, and Ops teams collaborate"
msgstr ""
@@ -15180,7 +15397,7 @@ msgstr "GitLab ã¯ã€ã“ã®ãƒ‰ãƒ¡ã‚¤ãƒ³ã® Let's Encrypt ã® SSL 証明書をå–
msgid "GitLab is open source software to collaborate on code."
msgstr ""
-msgid "GitLab is undergoing maintenance and is operating in a read-only mode."
+msgid "GitLab is undergoing maintenance and is operating in read-only mode."
msgstr ""
msgid "GitLab member or Email address"
@@ -15192,9 +15409,6 @@ msgstr "GitLab メタデータ URL"
msgid "GitLab project export"
msgstr "GitLab プロジェクトã®ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆ"
-msgid "GitLab restart is required to apply changes."
-msgstr ""
-
msgid "GitLab single sign-on URL"
msgstr ""
@@ -15210,9 +15424,6 @@ msgstr ""
msgid "GitLab version"
msgstr ""
-msgid "GitLab will inform you if a new version is available."
-msgstr ""
-
msgid "GitLab will run a background job that will produce pseudonymized CSVs of the GitLab database that will be uploaded to your configured object storage directory."
msgstr "Gitlabã¯ã€ã‚ãªãŸãŒè¨­å®šã—ãŸã‚ªãƒ–ジェクトストレージディレクトリã«ã‚¢ãƒƒãƒ—ロードã™ã‚‹ Gitlabデータベースã®åŒ¿å化ã—ãŸCSVを生æˆã™ã‚‹ã‚¸ãƒ§ãƒ–ã‚’ãƒãƒƒã‚¯ã‚°ãƒ©ã‚¦ãƒ³ãƒ‰ã§å®Ÿè¡Œã—ã¾ã™ã€‚"
@@ -15477,9 +15688,21 @@ msgstr "リãƒã‚¸ãƒˆãƒªã‚°ãƒ©ãƒ•ã«ç§»å‹•"
msgid "Go to snippets"
msgstr "スニペットã¸ç§»å‹•"
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check 'Allowed domains for sign-ups'."
+msgstr ""
+
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check 'Email restrictions for sign-ups'."
+msgstr ""
+
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check the 'Domain denylist'."
+msgstr ""
+
msgid "Go to the activity feed"
msgstr "アクティビティーフィードã«ç§»å‹•"
+msgid "Go to the group’s 'Settings &gt; General' page, and check 'Restrict membership by email domain'."
+msgstr ""
+
msgid "Go to the milestone list"
msgstr "マイルストーンã®ãƒªã‚¹ãƒˆã«ç§»å‹•"
@@ -15516,6 +15739,12 @@ msgstr "ã‚ãªãŸã®ã‚¹ãƒ‹ãƒšãƒƒãƒˆã¸ç§»å‹•"
msgid "Goal of the changes and what reviewers should be aware of"
msgstr ""
+msgid "Google Cloud"
+msgstr ""
+
+msgid "Google Cloud offers several deployment targets. Select the one most suitable for your project."
+msgstr ""
+
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr "Google èªè¨¼ãŒ %{link_start} é©åˆ‡ã«è¨­å®šã•ã‚Œã¦ã„ã¾ã›ã‚“。%{link_end} ã“ã®ã‚µãƒ¼ãƒ“スを使用ã™ã‚‹ãªã‚‰ GitLab ã®ç®¡ç†è€…ã«å°‹ã­ã¦ãã ã•ã„。"
@@ -15600,9 +15829,6 @@ msgstr "グループフック"
msgid "Group ID"
msgstr "グループ ID"
-msgid "Group ID: %{group_id}"
-msgstr "グループID:%{group_id}"
-
msgid "Group Owner must have signed in with SAML before enabling Group Managed Accounts"
msgstr "グループ管ç†ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã‚’有効ã«ã™ã‚‹å‰ã«ã€ã‚°ãƒ«ãƒ¼ãƒ—所有者ãŒSAMLã§ã‚µã‚¤ãƒ³ã‚¤ãƒ³ã—ã¦ã„ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™"
@@ -15777,6 +16003,12 @@ msgstr ""
msgid "GroupImport|Unable to process group import file"
msgstr ""
+msgid "GroupPage|Copy group ID"
+msgstr ""
+
+msgid "GroupPage|Group ID: %{group_id}"
+msgstr ""
+
msgid "GroupRoadmap|%{dateWord} – No end date"
msgstr ""
@@ -15831,6 +16063,9 @@ msgstr "検索範囲を広ã’ã‚‹ã«ã¯ã€ãƒ•ã‚£ãƒ«ã‚¿ã‚’変更ã¾ãŸã¯å‰Šé™¤ã—
msgid "GroupRoadmap|Within 3 years"
msgstr ""
+msgid "GroupSAML|\"persistent\" recommended"
+msgstr ""
+
msgid "GroupSAML|%{strongOpen}Warning%{strongClose} - Enabling %{linkStart}SSO enforcement%{linkEnd} can reduce security risks."
msgstr ""
@@ -15963,6 +16198,9 @@ msgstr ""
msgid "GroupSAML|To be able to prohibit outer forks, you first need to enforce dedicate group managed accounts."
msgstr ""
+msgid "GroupSAML|Use SAML group links to manage group membership using SAML."
+msgstr ""
+
msgid "GroupSAML|Valid SAML Response"
msgstr "妥当ãªSAMLレスãƒãƒ³ã‚¹"
@@ -15975,14 +16213,11 @@ msgstr "SCIMトークン"
msgid "GroupSAML|as %{access_level}"
msgstr ""
-msgid "GroupSAML|must match stored NameID of \"%{extern_uid}\" as we use this to identify users. If the NameID changes users will be unable to sign in."
+msgid "GroupSAML|must match stored NameID of \"%{extern_uid}\" to identify user and allow sign in"
msgstr ""
-msgid "GroupSAML|should be \"persistent\""
-msgstr "\"永続的\"ã§ã‚ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™"
-
-msgid "GroupSAML|should be a random persistent ID, emails are discouraged"
-msgstr "ランダムãªæ°¸ç¶šçš„IDã§ã‚ã‚‹å¿…è¦ãŒã‚ã‚Šã€ãƒ¡ãƒ¼ãƒ«ã¯æŽ¨å¥¨ã•ã‚Œã¾ã›ã‚“"
+msgid "GroupSAML|recommend persistent ID instead of email"
+msgstr ""
msgid "GroupSelect|No matching results"
msgstr ""
@@ -15996,9 +16231,15 @@ msgstr ""
msgid "GroupSettings|Allow project access token creation"
msgstr ""
+msgid "GroupSettings|Applied to all subgroups unless overridden by a group owner. Groups already added to the project lose access."
+msgstr ""
+
msgid "GroupSettings|Auto DevOps pipeline was updated for the group"
msgstr "Auto DevOps パイプラインãŒã‚°ãƒ«ãƒ¼ãƒ—用ã«æ›´æ–°ã•ã‚Œã¾ã—ãŸ"
+msgid "GroupSettings|Available only on the top-level group. Applies to all subgroups. Groups already shared with a group outside %{group} are still shared unless removed manually."
+msgstr ""
+
msgid "GroupSettings|Badges"
msgstr "ãƒãƒƒã‚¸"
@@ -16050,6 +16291,9 @@ msgstr "親グループã®å¯è¦–性ãŒã‚°ãƒ«ãƒ¼ãƒ—ã®ç¾åœ¨ã®å¯è¦–性より低
msgid "GroupSettings|New runners registration token has been generated!"
msgstr "æ–°ã—ã„ランナー登録トークンを生æˆã—ã¾ã—ãŸï¼"
+msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgstr ""
+
msgid "GroupSettings|Pipeline settings was updated for the group"
msgstr "グループã®ãƒ‘イプライン設定ãŒæ›´æ–°ã•ã‚Œã¾ã—ãŸ"
@@ -16062,12 +16306,15 @@ msgstr ""
msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
-msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups."
+msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups"
msgstr ""
msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
msgstr "%{group} 内ã®ãƒ—ロジェクトを他ã®ã‚°ãƒ«ãƒ¼ãƒ—ã¨å…±æœ‰ã—ãªã„よã†ã«ã™ã‚‹"
+msgid "GroupSettings|Prevents group members from being notified if the group is mentioned."
+msgstr ""
+
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
msgstr ""
@@ -16104,21 +16351,6 @@ msgstr "ã“ã®è¨­å®šã¯ %{ancestor_group} ã«é©ç”¨ã•ã‚Œã¾ã™ã€‚ã“ã®ã‚°ãƒ«ãƒ
msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}."
msgstr "ã“ã®è¨­å®šã¯ %{ancestor_group} ã«é©ç”¨ã•ã‚Œã¾ã™ã€‚設定を上書ãã€ã¾ãŸã¯ %{remove_ancestor_share_with_group_lock} ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚"
-msgid "GroupSettings|This setting is only available on the top-level group and it applies to all subgroups. Groups that have already been shared with a group outside %{group} will still be shared, and this access will have to be revoked manually."
-msgstr ""
-
-msgid "GroupSettings|This setting will be applied to all subgroups unless overridden by a group owner. Groups that already have access to the project will continue to have access unless removed manually."
-msgstr "ã“ã®è¨­å®šã¯ã‚°ãƒ«ãƒ¼ãƒ—オーナーã«ã‚ˆã£ã¦ä¸Šæ›¸ãã•ã‚Œãªã„é™ã‚Šã€ã™ã¹ã¦ã®ã‚µãƒ–グループã«é©ç”¨ã•ã‚Œã¾ã™ã€‚プロジェクトã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ãŒæ—¢ã«ã‚るグループã¯ã€æ‰‹å‹•ã§å‰Šé™¤ã—ãªã„é™ã‚Šå¼•ã続ãアクセスã§ãã¾ã™ã€‚"
-
-msgid "GroupSettings|This setting will override user notification preferences for all members of the group, subgroups, and projects."
-msgstr "ã“ã®è¨­å®šã¯ã€ã‚°ãƒ«ãƒ¼ãƒ—ã€ã‚µãƒ–グループã€ãŠã‚ˆã³ãƒ—ロジェクトã®ã™ã¹ã¦ã®ãƒ¡ãƒ³ãƒãƒ¼ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼é€šçŸ¥è¨­å®šã‚’上書ãã—ã¾ã™ã€‚"
-
-msgid "GroupSettings|This setting will prevent group members from being notified if the group is mentioned."
-msgstr "ã“ã‚Œã¯ã€ã‚°ãƒ«ãƒ¼ãƒ—ãŒè¨€åŠã•ã‚ŒãŸå ´åˆã«ã‚°ãƒ«ãƒ¼ãƒ—メンãƒãƒ¼ã«é€šçŸ¥ã—ãªã„よã†ã«è¨­å®šã—ã¾ã™ã€‚"
-
-msgid "GroupSettings|This setting will prevent group members from forking projects outside of the group."
-msgstr ""
-
msgid "GroupSettings|Transfer group"
msgstr "グループã®è»¢é€"
@@ -16236,7 +16468,7 @@ msgstr ""
msgid "GroupsNew|No import options available"
msgstr ""
-msgid "GroupsNew|Not all related objects are migrated, as %{docs_link_start}described here%{docs_link_end}. Please %{feedback_link_start}leave feedback%{feedback_link_end} on this feature."
+msgid "GroupsNew|Not all related objects are migrated. %{docs_link_start}More info%{docs_link_end}."
msgstr ""
msgid "GroupsNew|Personal access token"
@@ -16368,15 +16600,27 @@ msgstr "異常"
msgid "Hello %{name},"
msgstr ""
-msgid "Hello there"
-msgstr "ã“ã‚“ã«ã¡ã¯"
-
msgid "Hello, %{name}!"
msgstr ""
msgid "Hello, %{username}!"
msgstr ""
+msgid "HelloMessage|%{handshake_emoji} Contribute to GitLab: %{contribute_link}"
+msgstr ""
+
+msgid "HelloMessage|%{magnifier_emoji} Create a new GitLab issue: %{new_issue_link}"
+msgstr ""
+
+msgid "HelloMessage|%{rocket_emoji} We like your curiosity! Help us improve GitLab by joining the team: %{jobs_page_link}"
+msgstr ""
+
+msgid "HelloMessage|Does this page need fixes or improvements? Open an issue or contribute a merge request to help make GitLab more lovable. At GitLab, everyone can contribute!"
+msgstr ""
+
+msgid "HelloMessage|Welcome to GitLab!"
+msgstr ""
+
msgid "Help"
msgstr "ヘルプ"
@@ -16386,13 +16630,10 @@ msgstr "ボットãŒãƒ–ルートフォース攻撃を防ãã®ã«å½¹ç«‹ã¡ã¾ã™
msgid "Helps prevent bots from creating accounts."
msgstr "ボットãŒã‚¢ã‚«ã‚¦ãƒ³ãƒˆã‚’作æˆã§ããªã„よã†ã«ã—ã¾ã™ã€‚"
-msgid "Helps prevent bots from creating issues"
-msgstr ""
-
-msgid "Helps prevent malicious users hide their activity"
+msgid "Helps prevent bots from creating issues."
msgstr ""
-msgid "Helps reduce request volume (e.g. from crawlers or abusive bots)"
+msgid "Helps prevent malicious users hide their activity."
msgstr ""
msgid "Helps reduce request volume (for example, from crawlers or abusive bots)"
@@ -16514,6 +16755,12 @@ msgstr "ãƒã‚¦ã‚¹ã‚­ãƒ¼ãƒ”ングã¯æ­£å¸¸ã«èµ·å‹•ã—ã¾ã—ãŸã€‚"
msgid "Housekeeping, export, path, transfer, remove, archive."
msgstr "ãƒã‚¦ã‚¹ã‚­ãƒ¼ãƒ”ングã€ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆã€ãƒ‘スã€è»¢é€ã€å‰Šé™¤ã€ã‚¢ãƒ¼ã‚«ã‚¤ãƒ–。"
+msgid "How do I configure Akismet?"
+msgstr ""
+
+msgid "How do I configure it?"
+msgstr ""
+
msgid "How do I configure runners?"
msgstr ""
@@ -16535,21 +16782,27 @@ msgstr ""
msgid "How do I set up this service?"
msgstr ""
+msgid "How do I use a web terminal?"
+msgstr ""
+
+msgid "How do I use file templates?"
+msgstr ""
+
msgid "How it works"
msgstr "仕組ã¿"
msgid "How many days need to pass between marking entity for deletion and actual removing it."
msgstr ""
-msgid "How many seconds an IP will be counted towards the limit"
+msgid "How many seconds an IP counts toward the IP address limit."
+msgstr ""
+
+msgid "How the job limiter handles jobs exceeding the thresholds specified below. The 'track' mode only logs the jobs. The 'compress' mode compresses the jobs and raises an exception if the compressed size exceeds the limit."
msgstr ""
msgid "I accept the %{terms_link}"
msgstr "%{terms_link} ã«åŒæ„ã™ã‚‹"
-msgid "I accept the|Terms of Service and Privacy Policy"
-msgstr ""
-
msgid "I forgot my password"
msgstr "パスワードを忘れã¾ã—ãŸ"
@@ -16631,15 +16884,18 @@ msgstr "情報: SSHéµãŒã¾ã‚‚ãªã期é™åˆ‡ã‚Œã«ãªã‚Šã¾ã™ã€‚æ–°ã—ã„ SSH
msgid "IP Address"
msgstr "IP アドレス"
-msgid "IP expiration time"
+msgid "IP address expiration time"
msgstr ""
-msgid "IP subnet restriction only allowed for top-level groups"
-msgstr "IPサブãƒãƒƒãƒˆåˆ¶é™ã¯æœ€ä¸Šä½ã‚°ãƒ«ãƒ¼ãƒ—ã«ã®ã¿è¨±å¯ã•ã‚Œã¾ã™"
+msgid "IP address restrictions"
+msgstr ""
-msgid "IPs per user"
+msgid "IP addresses per user"
msgstr ""
+msgid "IP subnet restriction only allowed for top-level groups"
+msgstr "IPサブãƒãƒƒãƒˆåˆ¶é™ã¯æœ€ä¸Šä½ã‚°ãƒ«ãƒ¼ãƒ—ã«ã®ã¿è¨±å¯ã•ã‚Œã¾ã™"
+
msgid "Identifier"
msgstr "識別å­"
@@ -16652,6 +16908,9 @@ msgstr "ID"
msgid "If any indexed field exceeds this limit it will be truncated to this number of characters and the rest will not be indexed or searchable. This does not apply to repository and wiki indexing. Setting this to 0 means it is unlimited."
msgstr ""
+msgid "If blank, defaults to %{code_open}Retry later%{code_close}."
+msgstr ""
+
msgid "If blank, set allowable lifetime to %{instance_level_policy_in_words}, as defined by the instance admin. Once set, existing tokens for users in this group may be revoked."
msgstr ""
@@ -16703,6 +16962,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 did not initiate these sign-in attempts, please reach out to your administrator or enable two-factor authentication (2FA) on your account."
+msgstr ""
+
msgid "If you did not initiate this change, please contact your administrator immediately."
msgstr ""
@@ -16792,12 +17054,12 @@ msgstr "CSV ã®å–ã‚Šè¾¼ã¿"
msgid "Import Projects from Gitea"
msgstr "Gitea ã‹ã‚‰ãƒ—ロジェクトã®ã‚¤ãƒ³ãƒãƒ¼ãƒˆ"
-msgid "Import a project"
-msgstr ""
-
msgid "Import an exported GitLab project"
msgstr "エクスãƒãƒ¼ãƒˆã—㟠GItLab プロジェクトã®ã‚¤ãƒ³ãƒãƒ¼ãƒˆ"
+msgid "Import and export rate limits"
+msgstr ""
+
msgid "Import failed due to a GitHub error: %{original}"
msgstr ""
@@ -16807,12 +17069,18 @@ msgstr ""
msgid "Import from Jira"
msgstr ""
+msgid "Import group"
+msgstr ""
+
msgid "Import group from file"
msgstr ""
msgid "Import groups"
msgstr ""
+msgid "Import history"
+msgstr ""
+
msgid "Import in progress"
msgstr "インãƒãƒ¼ãƒˆä¸­ã§ã™"
@@ -16859,7 +17127,7 @@ msgid "Import repositories from GitHub"
msgstr "リãƒã‚¸ãƒˆãƒªã‚’ GitHub ã‹ã‚‰ã‚¤ãƒ³ãƒãƒ¼ãƒˆã™ã‚‹"
msgid "Import repository"
-msgstr "リãƒã‚¸ãƒˆãƒªã‚’インãƒãƒ¼ãƒˆ"
+msgstr ""
msgid "Import requirements"
msgstr ""
@@ -16876,7 +17144,25 @@ msgstr "Phabricatorã‹ã‚‰ã‚¤ã‚·ãƒ¥ãƒ¼ã¸ã‚¿ã‚¹ã‚¯ã‚’インãƒãƒ¼ãƒˆã™ã‚‹"
msgid "Import timed out. Import took longer than %{import_jobs_expiration} seconds"
msgstr "インãƒãƒ¼ãƒˆãŒã‚¿ã‚¤ãƒ ã‚¢ã‚¦ãƒˆã—ã¾ã—ãŸã€‚インãƒãƒ¼ãƒˆã« %{import_jobs_expiration} 秒以上ã‹ã‹ã‚Šã¾ã—ãŸ"
-msgid "Import/Export Rate Limits"
+msgid "ImportAProjectModal|Import from a project"
+msgstr ""
+
+msgid "ImportAProjectModal|Import members from another project"
+msgstr ""
+
+msgid "ImportAProjectModal|Import project members"
+msgstr ""
+
+msgid "ImportAProjectModal|Only project members (not group members) are imported, and they get the same permissions as the project you import from."
+msgstr ""
+
+msgid "ImportAProjectModal|Successfully imported"
+msgstr ""
+
+msgid "ImportAProjectModal|Unable to import project members"
+msgstr ""
+
+msgid "ImportAProjectModal|You're importing members to the %{strongStart}%{name}%{strongEnd} project."
msgstr ""
msgid "ImportButtons|Connect repositories from"
@@ -16928,7 +17214,7 @@ msgstr[0] ""
msgid "Importing..."
msgstr ""
-msgid "Import|A repository URL usually ends in a .git suffix, although this is not required. Double check to make sure your repository URL is correct."
+msgid "Import|There is not a valid Git repository at this URL. If your HTTP repository is not publicly accessible, verify your credentials."
msgstr ""
msgid "Improve customer support with Service Desk"
@@ -16937,9 +17223,6 @@ msgstr ""
msgid "Improves Git cloning performance."
msgstr ""
-msgid "In %{time_to_now}"
-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 ""
@@ -17225,7 +17508,7 @@ msgstr ""
msgid "InProductMarketing|Start a GitLab Ultimate trial today in less than one minute, no credit card required."
msgstr ""
-msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no CC required"
+msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no credit card required"
msgstr ""
msgid "InProductMarketing|Start a trial"
@@ -17264,7 +17547,7 @@ msgstr ""
msgid "InProductMarketing|Team up in GitLab for greater efficiency"
msgstr ""
-msgid "InProductMarketing|Team work makes the dream work"
+msgid "InProductMarketing|Team work makes the dream work"
msgstr ""
msgid "InProductMarketing|Test, create, deploy"
@@ -17844,6 +18127,9 @@ msgstr ""
msgid "Integrations|Create new issue in Jira"
msgstr ""
+msgid "Integrations|Create new issue in ZenTao"
+msgstr ""
+
msgid "Integrations|Default settings are inherited from the group level."
msgstr ""
@@ -17937,9 +18223,15 @@ msgstr ""
msgid "Integrations|Search Jira issues"
msgstr ""
+msgid "Integrations|Search ZenTao issues"
+msgstr ""
+
msgid "Integrations|Send notifications about project events to Unify Circuit."
msgstr ""
+msgid "Integrations|Send notifications about project events to a Unify Circuit conversation. %{docs_link}"
+msgstr ""
+
msgid "Integrations|Sign in to add namespaces"
msgstr ""
@@ -17979,6 +18271,9 @@ msgstr ""
msgid "Integrations|You've activated every integration 🎉"
msgstr ""
+msgid "Integrations|ZenTao issues display here when you create issues in your project in ZenTao."
+msgstr ""
+
msgid "Interactive mode"
msgstr ""
@@ -18006,9 +18301,6 @@ msgstr ""
msgid "Interval Pattern"
msgstr "é–“éš”ã®ãƒ‘ターン"
-msgid "Introducing Value Stream Analytics"
-msgstr "ãƒãƒªãƒ¥ãƒ¼ã‚¹ãƒˆãƒªãƒ¼ãƒ åˆ†æžã®ç´¹ä»‹"
-
msgid "Introducing Your DevOps Report"
msgstr ""
@@ -18105,6 +18397,12 @@ msgstr ""
msgid "Investigate vulnerability: %{title}"
msgstr ""
+msgid "Invisible Captcha"
+msgstr ""
+
+msgid "Invisible Captcha helps prevent the creation of spam accounts. It adds a honeypot field and time-sensitive form submission to the account signup form."
+msgstr ""
+
msgid "Invitation"
msgstr "招待状"
@@ -18558,12 +18856,18 @@ msgstr ""
msgid "Issues"
msgstr "イシュー"
+msgid "Issues I've created"
+msgstr ""
+
msgid "Issues Rate Limits"
msgstr "イシューレートリミット"
msgid "Issues and merge requests"
msgstr ""
+msgid "Issues assigned to me"
+msgstr ""
+
msgid "Issues can be bugs, tasks or ideas to be discussed. Also, issues are searchable and filterable."
msgstr "イシューã¨ã¯ãƒã‚°ã€ã‚¿ã‚¹ã‚¯ã€ã¾ãŸã¯è­°è«–ã®å¿…è¦ãªã‚¢ã‚¤ãƒ‡ã‚¢ã§ã™ã€‚ã¾ãŸã€ã‚¤ã‚·ãƒ¥ãƒ¼ã¯æ¤œç´¢ã‚„フィルター処ç†ãŒå¯èƒ½ã§ã™ã€‚"
@@ -18675,7 +18979,7 @@ msgstr ""
msgid "Iterations|Create cadence"
msgstr ""
-msgid "Iterations|Create your first iteration"
+msgid "Iterations|Create iteration"
msgstr ""
msgid "Iterations|Delete cadence"
@@ -18684,6 +18988,9 @@ msgstr ""
msgid "Iterations|Delete iteration cadence?"
msgstr ""
+msgid "Iterations|Delete iteration?"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -18717,12 +19024,18 @@ msgstr ""
msgid "Iterations|New iteration cadence"
msgstr ""
+msgid "Iterations|No closed iterations."
+msgstr ""
+
msgid "Iterations|No iteration cadences to show."
msgstr ""
msgid "Iterations|No iterations in cadence."
msgstr ""
+msgid "Iterations|No open iterations."
+msgstr ""
+
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
@@ -18753,6 +19066,9 @@ msgstr ""
msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
msgstr ""
+msgid "Iterations|This will remove the iteration from any issues that are assigned to it."
+msgstr ""
+
msgid "Iterations|Title"
msgstr ""
@@ -18768,15 +19084,9 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr "500年以上先ã«ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“"
-msgid "I’m familiar with the basics of DevOps."
-msgstr ""
-
msgid "I’m joining my team who’s already on GitLab"
msgstr ""
-msgid "I’m not familiar with the basics of DevOps."
-msgstr ""
-
msgid "Jaeger URL"
msgstr "Jaeger URL"
@@ -19041,6 +19351,9 @@ msgstr ""
msgid "Job"
msgstr "ジョブ"
+msgid "Job %{jobName}"
+msgstr ""
+
msgid "Job Failed #%{build_id}"
msgstr "#%{build_id} ã®ã‚¸ãƒ§ãƒ–ãŒå¤±æ•—"
@@ -19630,9 +19943,6 @@ msgstr "コミットã¸ã®ç½²åã®è©³ç´°"
msgid "Learn more in the"
msgstr "詳ã—ã見る:"
-msgid "Learn more in the|pipeline schedules documentation"
-msgstr "詳ã—ãã¯ãƒ‘イプラインスケジュールã®ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆã‚’å‚ç…§"
-
msgid "Learn more."
msgstr ""
@@ -19744,9 +20054,6 @@ msgstr "離れる"
msgid "Leave Admin Mode"
msgstr "管ç†è€…モードを終ãˆã‚‹"
-msgid "Leave blank for no limit. Once set, existing personal access tokens may be revoked."
-msgstr ""
-
msgid "Leave edit mode? All unsaved changes will be lost."
msgstr "編集モードを終了ã—ã¾ã™ã‹ï¼Ÿãã®å ´åˆã€ä¿å­˜ã—ã¦ã„ãªã„変更ã¯ã™ã¹ã¦å¤±ã‚ã‚Œã¾ã™ã€‚"
@@ -19792,12 +20099,12 @@ msgstr ""
msgid "LicenseCompliance|Acceptable license to be used in the project"
msgstr ""
-msgid "LicenseCompliance|Add a license"
-msgstr "ライセンスを追加"
-
msgid "LicenseCompliance|Add license and related policy"
msgstr ""
+msgid "LicenseCompliance|Add license policy"
+msgstr ""
+
msgid "LicenseCompliance|Allow"
msgstr ""
@@ -19879,6 +20186,9 @@ msgstr ""
msgid "LicenseManagement|Uncategorized"
msgstr ""
+msgid "Licensed Enterprise Edition features can be used if the project namespace's plan includes the feature, or if the project is public."
+msgstr ""
+
msgid "Licensed Features"
msgstr ""
@@ -19945,7 +20255,10 @@ msgstr "タイムトラッキングã®å˜ä½è¡¨ç¤ºã‚’1時間å˜ä½ã«åˆ¶é™ã™ã‚
msgid "Limit namespaces and projects that can be indexed"
msgstr "インデックスã§ãã‚‹åå‰ç©ºé–“ã¨ãƒ—ロジェクトを制é™ã™ã‚‹"
-msgid "Limit sign in from multiple ips"
+msgid "Limit project size at a global, group, and project level. %{link_start}Learn more%{link_end}."
+msgstr ""
+
+msgid "Limit sign in from multiple IP addresses"
msgstr ""
msgid "Limit the number of concurrent operations this secondary site can run in the background."
@@ -19957,10 +20270,16 @@ msgstr ""
msgid "Limit the number of issues and epics per minute a user can create through web and API requests."
msgstr ""
+msgid "Limit the size of Sidekiq jobs stored in Redis."
+msgstr ""
+
msgid "Limited to showing %d event at most"
msgid_plural "Limited to showing %d events at most"
msgstr[0] "イベント表示数を最大 %d 個ã«åˆ¶é™"
+msgid "Limiting mode"
+msgstr ""
+
msgid "Line changes"
msgstr ""
@@ -20030,9 +20349,6 @@ msgstr "利用å¯èƒ½ãªãƒªãƒã‚¸ãƒˆãƒªã®ä¸€è¦§"
msgid "List of all merge commits"
msgstr ""
-msgid "List of users to be excluded from the limit"
-msgstr ""
-
msgid "List options"
msgstr ""
@@ -20072,9 +20388,6 @@ msgstr "コミットå‚ç…§ %{ref} 㮠パス %{path} ã«ãŠã‘るファイルã€
msgid "Loading functions timed out. Please reload the page to try again."
msgstr "Fcuntionã®èª­ã¿è¾¼ã¿ãŒã‚¿ã‚¤ãƒ ã‚¢ã‚¦ãƒˆã—ã¾ã—ãŸã€‚ã‚‚ã†ä¸€åº¦ã€ãƒšãƒ¼ã‚¸ã‚’リロードã—ã¦ãã ã•ã„。"
-msgid "Loading issues"
-msgstr "イシューã®ãƒ­ãƒ¼ãƒ‰"
-
msgid "Loading more"
msgstr ""
@@ -20366,6 +20679,9 @@ msgstr ""
msgid "Marked For Deletion At - %{deletion_time}"
msgstr ""
+msgid "Marked as ready. Merging is now allowed."
+msgstr ""
+
msgid "Marked this %{noun} as a draft."
msgstr ""
@@ -20438,52 +20754,22 @@ msgstr ""
msgid "Max 100,000 events"
msgstr ""
-msgid "Max 20 characters"
-msgstr ""
-
-msgid "Max Group Export Download requests per minute per user"
-msgstr ""
-
-msgid "Max Group Export requests per minute per user"
-msgstr ""
-
-msgid "Max Group Import requests per minute per user"
-msgstr ""
-
-msgid "Max Project Export Download requests per minute per user"
-msgstr ""
-
-msgid "Max Project Export requests per minute per user"
-msgstr ""
-
-msgid "Max Project Import requests per minute per user"
-msgstr ""
-
-msgid "Max authenticated API requests per period per user"
-msgstr ""
-
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
-msgid "Max authenticated web requests per period per user"
-msgstr ""
-
msgid "Max file size is 200 KB."
msgstr ""
-msgid "Max requests per minute per user"
-msgstr ""
-
msgid "Max role"
msgstr ""
msgid "Max session time"
msgstr ""
-msgid "Max unauthenticated requests per period per IP"
+msgid "MaxBuilds"
msgstr ""
-msgid "MaxBuilds"
+msgid "Maximum 20 characters"
msgstr ""
msgid "Maximum Conan package file size in bytes"
@@ -20519,6 +20805,12 @@ msgstr ""
msgid "Maximum attachment size (MB)"
msgstr "添付ファイルサイズã®ä¸Šé™ (MB)"
+msgid "Maximum authenticated API requests per rate limit period per user"
+msgstr ""
+
+msgid "Maximum authenticated web requests per rate limit period per user"
+msgstr ""
+
msgid "Maximum bulk request size (MiB)"
msgstr ""
@@ -20564,6 +20856,15 @@ msgstr ""
msgid "Maximum files in a diff"
msgstr ""
+msgid "Maximum group export download requests per minute"
+msgstr ""
+
+msgid "Maximum group export requests per minute"
+msgstr ""
+
+msgid "Maximum group import requests per minute"
+msgstr ""
+
msgid "Maximum import size"
msgstr ""
@@ -20600,7 +20901,7 @@ msgstr "åŒæ™‚ã«åŒæœŸã§ãるミラーã®æœ€å¤§æ•°ã€‚"
msgid "Maximum number of projects."
msgstr ""
-msgid "Maximum number of unique IPs per user"
+msgid "Maximum number of unique IP addresses per user."
msgstr ""
msgid "Maximum page reached"
@@ -20609,12 +20910,24 @@ msgstr ""
msgid "Maximum page size"
msgstr ""
+msgid "Maximum project export download requests per minute"
+msgstr ""
+
+msgid "Maximum project export requests per minute"
+msgstr ""
+
+msgid "Maximum project import requests per minute"
+msgstr ""
+
msgid "Maximum push size"
msgstr ""
msgid "Maximum push size (MB)"
msgstr "最大プッシュサイズ (MB)"
+msgid "Maximum requests per minute"
+msgstr ""
+
msgid "Maximum running slices"
msgstr ""
@@ -20642,10 +20955,16 @@ msgstr ""
msgid "Maximum time between updates that a mirror can have when scheduled to synchronize."
msgstr "åŒæœŸãŒã‚¹ã‚±ã‚¸ãƒ¥ãƒ¼ãƒ«ã•ã‚Œã¦ã„ã‚‹ã¨ãã«ãƒŸãƒ©ãƒ¼ãƒªãƒ³ã‚°ã®æ›´æ–°é–“ã®æœ€å¤§æ™‚間。"
-msgid "Maximum time for web terminal websocket connection (in seconds). 0 for unlimited."
+msgid "Maximum time that users are allowed to skip the setup of two-factor authentication (in hours). Set to 0 (zero) to enforce at next sign in."
msgstr ""
-msgid "Maximum time that users are allowed to skip the setup of two-factor authentication (in hours). Set to 0 (zero) to enforce at next sign in."
+msgid "Maximum time, in seconds, for a web terminal websocket connection. 0 for unlimited."
+msgstr ""
+
+msgid "Maximum unauthenticated API requests per rate limit period per IP"
+msgstr ""
+
+msgid "Maximum unauthenticated web requests per rate limit period per IP"
msgstr ""
msgid "May"
@@ -20663,9 +20982,6 @@ msgstr ""
msgid "Medium vulnerabilities present"
msgstr "中程度ã®è„†å¼±æ€§ã®å­˜åœ¨"
-msgid "Member lock"
-msgstr "メンãƒãƒ¼ã®ãƒ­ãƒƒã‚¯"
-
msgid "Member since"
msgstr ""
@@ -20702,6 +21018,9 @@ msgstr ""
msgid "Members of a group may only view projects they have permission to access"
msgstr ""
+msgid "Membership"
+msgstr ""
+
msgid "Members|%{time} by %{user}"
msgstr ""
@@ -20762,9 +21081,6 @@ msgstr ""
msgid "Members|Expiration date updated successfully."
msgstr ""
-msgid "Members|Expired"
-msgstr ""
-
msgid "Members|Filter members"
msgstr ""
@@ -20780,9 +21096,6 @@ msgstr ""
msgid "Members|Membership"
msgstr ""
-msgid "Members|No expiration set"
-msgstr ""
-
msgid "Members|Remove \"%{groupName}\""
msgstr ""
@@ -20804,9 +21117,6 @@ msgstr ""
msgid "Members|Search invited"
msgstr ""
-msgid "Members|in %{time}"
-msgstr ""
-
msgid "Member|Deny access"
msgstr ""
@@ -20882,9 +21192,6 @@ msgstr "マージリクエスト"
msgid "Merge request %{mr_link} was reviewed by %{mr_author}"
msgstr "マージリクエスト %{mr_link} 㯠%{mr_author}ã«ã‚ˆã£ã¦ãƒ¬ãƒ“ューã•ã‚Œã¾ã—ãŸ"
-msgid "Merge request (MR) approvals"
-msgstr ""
-
msgid "Merge request analytics"
msgstr ""
@@ -20906,12 +21213,21 @@ msgstr ""
msgid "Merge requests"
msgstr "マージリクエスト"
+msgid "Merge requests I've created"
+msgstr ""
+
msgid "Merge requests are a place to propose changes you've made to a project and discuss those changes with others"
msgstr "マージリクエストã¨ã¯ã€ãƒ—ロジェクトã«åŠ ãˆãŸå¤‰æ›´ã‚’æ示ã—ã€ãã®å¤‰æ›´ã«ã¤ã„ã¦ä»–ã®ãƒ¡ãƒ³ãƒãƒ¼ã¨è©±ã—åˆã†ãŸã‚ã®å ´æ‰€ã§ã™"
msgid "Merge requests are read-only in a secondary Geo node"
msgstr "マージリクエストã¯ã‚»ã‚«ãƒ³ãƒ€ãƒªã‚¸ã‚ªãƒŽãƒ¼ãƒ‰ã§ã¯èª­ã¿å–り専用ã§ã™"
+msgid "Merge requests assigned to me"
+msgstr ""
+
+msgid "Merge requests that I'm a reviewer"
+msgstr ""
+
msgid "Merge the branch and fix any conflicts that come up"
msgstr ""
@@ -20972,12 +21288,12 @@ msgstr "コメントã®é–‹å§‹è¡Œã‚’é¸æŠž"
msgid "MergeRequests|An error occurred while saving the draft comment."
msgstr "下書ãコメントã®ä¿å­˜ä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚"
+msgid "MergeRequests|Create issue to resolve thread"
+msgstr ""
+
msgid "MergeRequests|Failed to squash. Should be done manually."
msgstr "スカッシュã«å¤±æ•—ã—ã¾ã—ãŸã€‚手動ã§è¡Œã†å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚"
-msgid "MergeRequests|Resolve this thread in a new issue"
-msgstr "æ–°ã—ã„イシューã§ã“ã®ã‚¹ãƒ¬ãƒƒãƒ‰ã‚’解決ã™ã‚‹"
-
msgid "MergeRequests|Saving the comment failed"
msgstr "コメントã®ä¿å­˜ã«å¤±æ•—ã—ã¾ã—ãŸ"
@@ -21787,6 +22103,9 @@ msgstr "権é™ãŒä¸å分ãªãŸã‚ã€ã‚¤ã‚·ãƒ¥ãƒ¼ã‚’移動ã§ãã¾ã›ã‚“。"
msgid "MoveIssue|Cannot move issue to project it originates from!"
msgstr "発行元ã®ãƒ—ロジェクトã«ã‚¤ã‚·ãƒ¥ãƒ¼ã‚’移動ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。"
+msgid "MoveIssue|Cannot move issues of '%{issue_type}' type."
+msgstr ""
+
msgid "Moved issue to %{label} column in the board."
msgstr "イシューをボード㮠%{label} 列ã«ç§»å‹•ã—ã¾ã—ãŸã€‚"
@@ -21911,6 +22230,15 @@ 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. To learn more about reducing storage capacity please visit our docs."
msgstr ""
+msgid "NamespaceUserCap|Pending users must be reviewed and approved by a group owner. Learn more about %{user_caps_link_start}User Caps%{link_end} and %{users_pending_approval_link_start}Users Pending Approval%{link_end}."
+msgstr ""
+
+msgid "NamespaceUserCap|View pending user approvals"
+msgstr ""
+
+msgid "NamespaceUserCap|Your group has reached its billable member limit"
+msgstr ""
+
msgid "Namespaces"
msgstr ""
@@ -21953,9 +22281,6 @@ msgstr ""
msgid "Network"
msgstr "ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯"
-msgid "Network Policy|New rule"
-msgstr ""
-
msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is inbound from a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
msgstr ""
@@ -21977,16 +22302,13 @@ msgstr ""
msgid "NetworkPolicies|%{strongOpen}any%{strongClose} port"
msgstr ""
-msgid "NetworkPolicies|+ Add alert"
-msgstr ""
-
msgid "NetworkPolicies|.yaml"
msgstr ""
msgid "NetworkPolicies|.yaml mode"
msgstr ""
-msgid "NetworkPolicies|Actions"
+msgid "NetworkPolicies|Add alert"
msgstr ""
msgid "NetworkPolicies|Alerts are intended to be selectively used for a limited number of events that are potentially concerning and warrant a manual review. Alerts should not be used as a substitute for a SIEM or a logging tool. High volume alerts are likely to be dropped so as to preserve the stability of GitLab's integration with Kubernetes."
@@ -22022,9 +22344,6 @@ msgstr ""
msgid "NetworkPolicies|Deny all traffic"
msgstr ""
-msgid "NetworkPolicies|Description"
-msgstr "説明"
-
msgid "NetworkPolicies|Edit policy"
msgstr ""
@@ -22037,9 +22356,6 @@ msgstr ""
msgid "NetworkPolicies|IP/subnet"
msgstr ""
-msgid "NetworkPolicies|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
-msgstr ""
-
msgid "NetworkPolicies|Invalid or empty policy"
msgstr ""
@@ -22049,19 +22365,16 @@ msgstr ""
msgid "NetworkPolicies|Kubernetes error: %{error}"
msgstr ""
-msgid "NetworkPolicies|Name"
-msgstr ""
-
msgid "NetworkPolicies|Network"
msgstr ""
-msgid "NetworkPolicies|Network traffic"
+msgid "NetworkPolicies|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
msgstr ""
-msgid "NetworkPolicies|New policy"
+msgid "NetworkPolicies|Network policy can be created after the environment is loaded successfully."
msgstr ""
-msgid "NetworkPolicies|No policies detected"
+msgid "NetworkPolicies|Network traffic"
msgstr ""
msgid "NetworkPolicies|None selected"
@@ -22070,21 +22383,12 @@ msgstr ""
msgid "NetworkPolicies|Please %{installLinkStart}install%{installLinkEnd} and %{configureLinkStart}configure a Kubernetes Agent for this project%{configureLinkEnd} to enable alerts."
msgstr ""
-msgid "NetworkPolicies|Policies are a specification of how groups of pods are allowed to communicate with each other's network endpoints."
-msgstr ""
-
msgid "NetworkPolicies|Policy %{policyName} was successfully changed"
msgstr ""
msgid "NetworkPolicies|Policy definition"
msgstr ""
-msgid "NetworkPolicies|Policy editor"
-msgstr ""
-
-msgid "NetworkPolicies|Policy preview"
-msgstr ""
-
msgid "NetworkPolicies|Rule"
msgstr ""
@@ -22094,9 +22398,6 @@ msgstr ""
msgid "NetworkPolicies|Rule mode is unavailable for this policy. In some cases, we cannot parse the YAML file back into the rules editor."
msgstr ""
-msgid "NetworkPolicies|Rules"
-msgstr ""
-
msgid "NetworkPolicies|Save changes"
msgstr ""
@@ -22109,9 +22410,6 @@ msgstr ""
msgid "NetworkPolicies|Traffic that does not match any rule will be blocked."
msgstr ""
-msgid "NetworkPolicies|Unable to parse policy"
-msgstr ""
-
msgid "NetworkPolicies|all DNS names"
msgstr ""
@@ -22290,6 +22588,9 @@ msgstr "æ–°ã—ã„ ID"
msgid "New issue"
msgstr "æ–°è¦ã‚¤ã‚·ãƒ¥ãƒ¼"
+msgid "New issue in %{project}"
+msgstr ""
+
msgid "New issue title"
msgstr "æ–°è¦ã‚¤ã‚·ãƒ¥ãƒ¼ã®ã‚¿ã‚¤ãƒˆãƒ«"
@@ -22368,8 +22669,8 @@ msgstr ""
msgid "Newest first"
msgstr "æ–°ã—ã„é †"
-msgid "Newly registered users will by default be external"
-msgstr "æ–°ã—ã登録ã•ã‚ŒãŸãƒ¦ãƒ¼ã‚¶ãƒ¼ã¯ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆã§å¤–部ユーザーã«ãªã‚Šã¾ã™"
+msgid "Newly-registered users are external by default"
+msgstr ""
msgid "Next"
msgstr "Next"
@@ -22683,8 +22984,9 @@ msgstr "脆弱性ã¯ç™ºè¦‹ã•ã‚Œã¾ã›ã‚“ã§ã—ãŸã€‚"
msgid "No webhooks found, add one in the form above."
msgstr "ウェブフックãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚上記ã®ãƒ•ã‚©ãƒ¼ãƒ ã«ã‚¦ã‚§ãƒ–フックを追加ã—ã¦ãã ã•ã„。"
-msgid "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} to renew your subscription."
-msgstr ""
+msgid "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} day to renew your subscription."
+msgid_plural "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} days to renew your subscription."
+msgstr[0] ""
msgid "No. of commits"
msgstr ""
@@ -22701,8 +23003,8 @@ msgstr "ノードã¯æ­£å¸¸ã«æ›´æ–°ã—ã¾ã—ãŸã€‚"
msgid "Nodes"
msgstr "ノード"
-msgid "Non-admin users can sign in with read-only access and make read-only API requests."
-msgstr "管ç†è€…ã§ã¯ãªã„ユーザーã¯ã€èª­ã¿å–り専用アクセスã§ã‚µã‚¤ãƒ³ã‚¤ãƒ³ã—ã¦ã€èª­ã¿å–り専用APIをリクエストã§ãã¾ã™ã€‚"
+msgid "Non-admin users are restricted to read-only access, in both GitLab UI and API."
+msgstr ""
msgid "None"
msgstr "ãªã—"
@@ -22782,7 +23084,7 @@ msgstr "注: GitLab ã®ç®¡ç†è€…ã«%{github_integration_link} を設定ã—ã¦ã€
msgid "NoteForm|Note"
msgstr "メモ"
-msgid "Notes Rate Limits"
+msgid "Notes rate limit"
msgstr ""
msgid "Notes|Are you sure you want to cancel creating this comment?"
@@ -22945,9 +23247,6 @@ msgstr "11月"
msgid "November"
msgstr "11月"
-msgid "Novice"
-msgstr ""
-
msgid "Now, personalize your GitLab experience"
msgstr ""
@@ -23116,7 +23415,7 @@ msgstr ""
msgid "OnCallSchedules|For this rotation, on-call will be:"
msgstr ""
-msgid "OnCallSchedules|On-call schedule %{schedule} in Project %{project}"
+msgid "OnCallSchedules|On-call schedule %{obstacle} in Project %{project}"
msgstr ""
msgid "OnCallSchedules|On-call schedules"
@@ -23263,22 +23562,22 @@ msgstr ""
msgid "OnDemandScans|Scanner profile"
msgstr ""
+msgid "OnDemandScans|Schedule scan"
+msgstr ""
+
msgid "OnDemandScans|Select one of the existing profiles"
msgstr ""
msgid "OnDemandScans|Site profile"
msgstr ""
-msgid "OnDemandScans|Use existing scanner profile"
+msgid "OnDemandScans|Start time"
msgstr ""
-msgid "OnDemandScans|Use existing site profile"
-msgstr ""
-
-msgid "OnDemandScans|You can either choose a passive scan or validate the target site in your chosen site profile. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
+msgid "OnDemandScans|Use existing scanner profile"
msgstr ""
-msgid "OnDemandScans|You cannot run an active scan against an unvalidated site."
+msgid "OnDemandScans|Use existing site profile"
msgstr ""
msgid "OnDemandScans|You must create a repository within your project to run an on-demand scan."
@@ -23342,6 +23641,9 @@ msgstr ""
msgid "Only admins can delete project"
msgstr "管ç†è€…ã ã‘ãŒãƒ—ロジェクトを削除ã§ãã¾ã™"
+msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
+msgstr ""
+
msgid "Only include features new to your current subscription tier."
msgstr ""
@@ -23360,6 +23662,12 @@ msgstr "プロジェクトメンãƒãƒ¼ã®ã¿ãŒã‚¤ãƒ³ãƒãƒ¼ãƒˆã•ã‚Œã¾ã™ã€‚ã‚°
msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
+msgid "Only reCAPTCHA v2 is supported:"
+msgstr ""
+
+msgid "Only users from the specified IP address ranges are able to reach this group, including all subgroups, projects, and Git repositories."
+msgstr ""
+
msgid "Only verified users with an email address in any of these domains can be added to the group."
msgstr ""
@@ -23546,9 +23854,6 @@ msgstr "オーナー"
msgid "Package Registry"
msgstr "パッケージレジストリ"
-msgid "Package Registry Rate Limits"
-msgstr ""
-
msgid "Package Registry: authenticated API requests"
msgstr ""
@@ -23567,6 +23872,9 @@ msgstr ""
msgid "Package recipe already exists"
msgstr "パッケージã®ãƒ¬ã‚·ãƒ”ã¯æ—¢ã«å­˜åœ¨ã—ã¦ã„ã¾ã™"
+msgid "Package registry rate limits"
+msgstr ""
+
msgid "Package type"
msgstr ""
@@ -23633,6 +23941,9 @@ msgstr ""
msgid "PackageRegistry|Composer"
msgstr ""
+msgid "PackageRegistry|Composer.json with license: %{license} and version: %{version}"
+msgstr ""
+
msgid "PackageRegistry|Conan"
msgstr "Conan"
@@ -23696,6 +24007,9 @@ msgstr ""
msgid "PackageRegistry|Copy require package include"
msgstr ""
+msgid "PackageRegistry|Copy target SHA"
+msgstr ""
+
msgid "PackageRegistry|Copy yarn command"
msgstr "Yarn コマンドをコピー"
@@ -23762,6 +24076,9 @@ msgstr "ã¾ã è¡Œã£ã¦ã„ãªã„å ´åˆã¯ã€ %{codeStart}pom.xml%{codeEnd} フã‚
msgid "PackageRegistry|Install package version"
msgstr ""
+msgid "PackageRegistry|Instance-level"
+msgstr ""
+
msgid "PackageRegistry|Invalid Package: failed metadata extraction"
msgstr ""
@@ -23807,6 +24124,9 @@ msgstr ""
msgid "PackageRegistry|Pip Command"
msgstr "pip コマンド"
+msgid "PackageRegistry|Project-level"
+msgstr ""
+
msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
msgstr ""
@@ -23828,6 +24148,9 @@ msgstr ""
msgid "PackageRegistry|Remove package"
msgstr "パッケージを削除"
+msgid "PackageRegistry|Required Python: %{pythonVersion}"
+msgstr ""
+
msgid "PackageRegistry|RubyGems"
msgstr ""
@@ -23870,6 +24193,9 @@ msgstr ""
msgid "PackageRegistry|Source project located at %{link}"
msgstr ""
+msgid "PackageRegistry|Target SHA: %{sha}"
+msgstr ""
+
msgid "PackageRegistry|There are no other versions of this package."
msgstr ""
@@ -24038,6 +24364,18 @@ msgstr "パスワードãŒæ­£å¸¸ã«å¤‰æ›´ã•ã‚Œã¾ã—ãŸ"
msgid "Password was successfully updated. Please sign in again."
msgstr ""
+msgid "PasswordPrompt|Confirm password"
+msgstr ""
+
+msgid "PasswordPrompt|Confirm password to continue"
+msgstr ""
+
+msgid "PasswordPrompt|Password is required"
+msgstr ""
+
+msgid "PasswordPrompt|Please enter your password to confirm"
+msgstr ""
+
msgid "Passwords should be unique and not used for any other sites or services."
msgstr ""
@@ -24065,6 +24403,9 @@ msgstr "イシューã®ãƒªãƒ³ã‚¯ã‚’貼り付ã‘"
msgid "Paste project path (i.e. gitlab-org/gitlab)"
msgstr ""
+msgid "Paste this DSN into your Sentry SDK"
+msgstr ""
+
msgid "Paste your public SSH key, which is usually contained in the file '~/.ssh/id_ed25519.pub' or '~/.ssh/id_rsa.pub' and begins with 'ssh-ed25519' or 'ssh-rsa'. Do not paste your private SSH key, as that can compromise your identity."
msgstr ""
@@ -24149,6 +24490,9 @@ msgstr ""
msgid "PerformanceBar|First Contentful Paint"
msgstr ""
+msgid "PerformanceBar|Flamegraph with mode:"
+msgstr ""
+
msgid "PerformanceBar|Frontend resources"
msgstr "フロントエンドリソース"
@@ -24182,6 +24526,15 @@ msgstr ""
msgid "PerformanceBar|Trace"
msgstr ""
+msgid "PerformanceBar|cpu"
+msgstr ""
+
+msgid "PerformanceBar|object"
+msgstr ""
+
+msgid "PerformanceBar|wall"
+msgstr ""
+
msgid "Period in seconds"
msgstr ""
@@ -24410,6 +24763,48 @@ msgstr "ターゲット"
msgid "PipelineSchedules|Variables"
msgstr "変数"
+msgid "PipelineSource|API"
+msgstr ""
+
+msgid "PipelineSource|Chat"
+msgstr ""
+
+msgid "PipelineSource|External"
+msgstr ""
+
+msgid "PipelineSource|External Pull Request"
+msgstr ""
+
+msgid "PipelineSource|Merge Request"
+msgstr ""
+
+msgid "PipelineSource|On-Demand DAST Scan"
+msgstr ""
+
+msgid "PipelineSource|On-Demand DAST Validation"
+msgstr ""
+
+msgid "PipelineSource|Parent Pipeline"
+msgstr ""
+
+msgid "PipelineSource|Pipeline"
+msgstr ""
+
+msgid "PipelineSource|Push"
+msgstr ""
+
+msgid "PipelineSource|Schedule"
+msgstr ""
+
+msgid "PipelineSource|Trigger"
+msgstr ""
+
+msgid "PipelineSource|Web"
+msgstr ""
+
+msgid "PipelineSource|Web IDE"
+msgstr ""
+
msgid "PipelineStatusTooltip|Pipeline: %{ciStatus}"
msgstr "パイプライン: %{ciStatus}"
@@ -24710,46 +25105,7 @@ msgstr ""
msgid "Pipeline|Source"
msgstr ""
-msgid "Pipeline|Source|API"
-msgstr ""
-
-msgid "Pipeline|Source|Chat"
-msgstr ""
-
-msgid "Pipeline|Source|External"
-msgstr ""
-
-msgid "Pipeline|Source|External Pull Request"
-msgstr ""
-
-msgid "Pipeline|Source|Merge Request"
-msgstr ""
-
-msgid "Pipeline|Source|On-Demand DAST Scan"
-msgstr ""
-
-msgid "Pipeline|Source|On-Demand DAST Validation"
-msgstr ""
-
-msgid "Pipeline|Source|Parent Pipeline"
-msgstr ""
-
-msgid "Pipeline|Source|Pipeline"
-msgstr ""
-
-msgid "Pipeline|Source|Push"
-msgstr ""
-
-msgid "Pipeline|Source|Schedule"
-msgstr ""
-
-msgid "Pipeline|Source|Trigger"
-msgstr ""
-
-msgid "Pipeline|Source|Web"
-msgstr ""
-
-msgid "Pipeline|Source|Web IDE"
+msgid "Pipeline|Source|Security Policy"
msgstr ""
msgid "Pipeline|Specify variable values to be used in this run. The values specified in %{linkStart}CI/CD settings%{linkEnd} will be used by default."
@@ -24800,8 +25156,8 @@ msgstr ""
msgid "Pipeline|We are currently unable to fetch pipeline data"
msgstr ""
-msgid "Pipeline|You’re about to stop pipeline %{pipelineId}."
-msgstr "%{pipelineId} パイプラインをåœæ­¢ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚"
+msgid "Pipeline|You’re about to stop pipeline #%{pipelineId}."
+msgstr ""
msgid "Pipeline|for"
msgstr ""
@@ -24827,6 +25183,9 @@ msgstr ""
msgid "Plain diff"
msgstr "テキスト差分"
+msgid "Plain-text response to send to clients that hit a rate limit"
+msgstr ""
+
msgid "Plan:"
msgstr ""
@@ -24971,9 +25330,6 @@ msgstr "有効ãªãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’入力ã—ã¦ãã ã•ã„"
msgid "Please provide attributes to update"
msgstr ""
-msgid "Please provide your username or email address."
-msgstr ""
-
msgid "Please reach out if you have any questions and we'll be happy to assist."
msgstr ""
@@ -25016,9 +25372,6 @@ msgstr ""
msgid "Please set a new password before proceeding."
msgstr "続ã‘ã‚‹å‰ã«æ–°ã—ã„パスワードを設定ã—ã¦ãã ã•ã„。"
-msgid "Please share your feedback about %{featureName} %{linkStart}in this issue%{linkEnd} to help us improve the experience."
-msgstr ""
-
msgid "Please solve the captcha"
msgstr ""
@@ -25196,6 +25549,9 @@ msgstr ""
msgid "Prevent adding new members to project membership within this group"
msgstr ""
+msgid "Prevent auto-stopping"
+msgstr ""
+
msgid "Prevent editing approval rules in projects and merge requests."
msgstr ""
@@ -25208,8 +25564,8 @@ msgstr ""
msgid "Prevent users from changing their profile name"
msgstr "ユーザーãŒãƒ—ロファイルåを変更ã§ããªã„よã†ã«è¨­å®šã™ã‚‹"
-msgid "Prevent users from performing write operations on GitLab while performing maintenance."
-msgstr "ユーザーãŒãƒ¡ãƒ³ãƒ†ãƒŠãƒ³ã‚¹ã®é–“ã« GitLab ã§æ›¸ãè¾¼ã¿æ“作をã§ããªã„よã†ã«ã—ã¾ã™ã€‚"
+msgid "Prevent users from performing write operations while GitLab maintenance is in progress."
+msgstr ""
msgid "Preview"
msgstr "プレビュー"
@@ -25481,6 +25837,9 @@ msgstr ""
msgid "Profiles|Enter your name, so people you know can recognize you"
msgstr "ä»–ã®äººãŒã‚ãªãŸã ã¨ã‚ã‹ã‚‹åå‰ã‚’入力ã—ã¦ãã ã•ã„。"
+msgid "Profiles|Enter your password to confirm the email change"
+msgstr ""
+
msgid "Profiles|Enter your pronouns to let people know how to refer to you"
msgstr ""
@@ -25715,12 +26074,12 @@ msgstr "ã‚ãªãŸã®ã‚¹ãƒ†ãƒ¼ã‚¿ã‚¹"
msgid "Profiles|e.g. My MacBook key"
msgstr "例:MacBook ã®ã‚­ãƒ¼"
+msgid "Profiles|https://website.com"
+msgstr ""
+
msgid "Profiles|username"
msgstr "ユーザーå"
-msgid "Profiles|website.com"
-msgstr "website.com"
-
msgid "Profiles|your account"
msgstr "ã‚ãªãŸã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆ"
@@ -25961,9 +26320,21 @@ msgstr "プロジェクトID: %{project_id}"
msgid "ProjectSelect| or group"
msgstr "ã¾ãŸã¯ã‚°ãƒ«ãƒ¼ãƒ—"
+msgid "ProjectSelect|No matching results"
+msgstr ""
+
msgid "ProjectSelect|Search for project"
msgstr "プロジェクトã®æ¤œç´¢"
+msgid "ProjectSelect|Search projects"
+msgstr ""
+
+msgid "ProjectSelect|Select a project"
+msgstr ""
+
+msgid "ProjectSelect|There was an error fetching the projects. Please try again."
+msgstr ""
+
msgid "ProjectService|Drone server URL"
msgstr ""
@@ -26051,6 +26422,9 @@ msgstr ""
msgid "ProjectService|Trigger event when a new, unique alert is recorded."
msgstr ""
+msgid "ProjectService|Trigger event when a new, unique vulnerability is recorded. (Note: This feature requires an Ultimate plan.)"
+msgstr ""
+
msgid "ProjectService|Trigger event when a pipeline status changes."
msgstr ""
@@ -26465,9 +26839,15 @@ msgstr "正常ã«å–å¾—ã—ãŸãƒ—ロジェクト"
msgid "Projects are graded based on the highest severity vulnerability present"
msgstr "プロジェクトã¯ã€å­˜åœ¨ã™ã‚‹æœ€ã‚‚é‡è¦åº¦ã®é«˜ã„脆弱性ã«åŸºã¥ã„ã¦è©•ä¾¡ã•ã‚Œã¾ã™"
+msgid "Projects are organized into groups"
+msgstr ""
+
msgid "Projects contributed to"
msgstr ""
+msgid "Projects help you organize your work. They contain your file repository, issues, merge requests, and so much more."
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr "%{group_name} グループã§å…±æœ‰ã•ã‚ŒãŸãƒ—ロジェクト"
@@ -26702,10 +27082,10 @@ msgstr "カスタムメトリックã¯ä½œæˆã•ã‚Œã¦ã„ã¾ã›ã‚“。 上ã®ãƒœã‚
msgid "PrometheusService|Prometheus cluster integration"
msgstr ""
-msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
+msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
msgstr ""
-msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
+msgid "PrometheusService|The ID of the IAP-secured resource."
msgstr ""
msgid "PrometheusService|The Prometheus API base URL."
@@ -27323,6 +27703,9 @@ msgstr ""
msgid "Rate limit"
msgstr ""
+msgid "Rate limits can help reduce request volume (like from crawlers or abusive bots)."
+msgstr ""
+
msgid "Raw blob request rate limit per minute"
msgstr "1分ã‚ãŸã‚Šã®ç”Ÿblobリクエストレート制é™"
@@ -27335,6 +27718,9 @@ msgstr "å†èªè¨¼æœŸé–“ãŒæº€äº†ã—ãŸã‹ã€ãƒªã‚¯ã‚¨ã‚¹ãƒˆã•ã‚Œã¾ã›ã‚“ã§ã—
msgid "Re-authentication required"
msgstr "å†èªè¨¼ãŒå¿…è¦ã§ã™"
+msgid "Re-import"
+msgstr ""
+
msgid "Re-request review"
msgstr ""
@@ -27356,6 +27742,9 @@ msgstr ""
msgid "Read more about related issues"
msgstr "関連ã™ã‚‹ã‚¤ã‚·ãƒ¥ãƒ¼ã«ã¤ã„ã¦ã‚‚ã£ã¨èª­ã‚€"
+msgid "Read their documentation."
+msgstr ""
+
msgid "Ready to get started with GitLab? Follow these steps to set up your workspace, plan and commit changes, and deploy your project."
msgstr ""
@@ -27389,6 +27778,9 @@ msgstr "手動ã§è¨­å®šã—ãŸPrometheusサーãƒãƒ¼ã‹ã‚‰ã‚¢ãƒ©ãƒ¼ãƒˆã‚’å—ã‘å
msgid "Receive any notifications from GitLab."
msgstr ""
+msgid "Receive notification of abuse reports by email."
+msgstr ""
+
msgid "Receive notifications about your own activity"
msgstr "自身ã®ã‚¢ã‚¯ãƒ†ã‚£ãƒ“ティーã«é–¢ã™ã‚‹é€šçŸ¥ã‚’å—ä¿¡ã™ã‚‹"
@@ -27531,9 +27923,6 @@ msgstr ""
msgid "Registry setup"
msgstr ""
-msgid "Regulate approvals by authors/committers. Affects all projects."
-msgstr ""
-
msgid "Reindexing Status: %{status} (Slice multiplier: %{multiplier}, Maximum running slices: %{max_slices})"
msgstr ""
@@ -27628,6 +28017,9 @@ msgstr ""
msgid "Release|Something went wrong while saving the release details."
msgstr ""
+msgid "Reload page"
+msgstr ""
+
msgid "Remediations"
msgstr ""
@@ -27910,6 +28302,9 @@ msgstr "ã“ã® %{quick_action_target} ã‚’å†ã³é–‹ã„ãŸã€‚"
msgid "Reopens this %{quick_action_target}."
msgstr "ã“ã® %{quick_action_target} ã‚’å†ã³é–‹ã。"
+msgid "Repeats"
+msgstr ""
+
msgid "Replace"
msgstr "ç½®ãæ›ãˆ"
@@ -28268,10 +28663,7 @@ msgstr ""
msgid "Require additional authentication for administrative tasks."
msgstr ""
-msgid "Require all users in this group to setup Two-factor authentication"
-msgstr ""
-
-msgid "Require all users in this group to setup two-factor authentication"
+msgid "Require all users in this group to set up two-factor authentication"
msgstr ""
msgid "Required approvals (%{approvals_given} given)"
@@ -28315,6 +28707,9 @@ msgstr[0] "もㆠ%d 件ã®æ‰¿èªãŒå¿…è¦ã§ã™ã€‚"
msgid "Requires values to meet regular expression requirements."
msgstr "æ­£è¦è¡¨ç¾ã®æ¡ä»¶ã‚’満ãŸã™å€¤ãŒå¿…è¦ã§ã™ã€‚"
+msgid "Requires you to deploy or set up cloud-hosted Sentry."
+msgstr ""
+
msgid "Requires your primary GitLab email address."
msgstr ""
@@ -28375,9 +28770,6 @@ msgstr "èªè¨¼ã‚­ãƒ¼ã‚’リセットã™ã‚‹ã¨ã€ä»Šã¾ã§ã®ã‚­ãƒ¼ã¯ç„¡åŠ¹ã«ãª
msgid "Resolve"
msgstr "解決ã™ã‚‹"
-msgid "Resolve all threads in new issue"
-msgstr "æ–°ã—ã„イシューã®ã™ã¹ã¦ã®ã‚¹ãƒ¬ãƒƒãƒ‰ã‚’解決ã™ã‚‹"
-
msgid "Resolve conflicts"
msgstr ""
@@ -28435,6 +28827,9 @@ msgstr "レスãƒãƒ³ã‚¹ãƒ¡ãƒˆãƒªã‚¯ã‚¹ (NGINX)"
msgid "Response text"
msgstr ""
+msgid "Restart GitLab to apply changes."
+msgstr ""
+
msgid "Restart Terminal"
msgstr "ターミナルをå†èµ·å‹•"
@@ -28453,6 +28848,9 @@ msgstr "グループを復元ã™ã‚‹ã¨ã€ã‚°ãƒ«ãƒ¼ãƒ—ã€ãã®ã‚µãƒ–グループ
msgid "Restoring the project will prevent the project from being removed on this date and restore people's ability to make changes to it."
msgstr ""
+msgid "Restrict group access by IP address. %{link_start}Learn more%{link_end}."
+msgstr ""
+
msgid "Restrict membership by email domain"
msgstr ""
@@ -28764,6 +29162,9 @@ msgstr ""
msgid "Runners|Runner #%{runner_id}"
msgstr ""
+msgid "Runners|Runner assigned to project."
+msgstr ""
+
msgid "Runners|Runner is offline, last contact was %{runner_contact} ago"
msgstr ""
@@ -28776,6 +29177,9 @@ msgstr ""
msgid "Runners|Runner registration"
msgstr ""
+msgid "Runners|Runner unassigned from project."
+msgstr ""
+
msgid "Runners|Runners"
msgstr ""
@@ -28968,7 +29372,7 @@ msgstr ""
msgid "SastEntryPoints|How do I set up SAST?"
msgstr ""
-msgid "SastEntryPoints|Learn more."
+msgid "SastEntryPoints|Learn more"
msgstr ""
msgid "Satisfied"
@@ -29010,7 +29414,7 @@ msgstr "パスワードをä¿å­˜"
msgid "Save pipeline schedule"
msgstr "パイプラインスケジュールをä¿å­˜"
-msgid "Save space and find images in the container Registry. remove unneeded tags and keep only the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
+msgid "Save storage space by automatically deleting tags from the container registry and keeping the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
msgstr ""
msgid "Saving"
@@ -29184,6 +29588,9 @@ msgstr "çµæžœã‚’検索ã¾ãŸã¯ãƒ•ã‚£ãƒ«ã‚¿ã™ã‚‹..."
msgid "Search or filter results…"
msgstr "çµæžœã‚’検索ã¾ãŸã¯ãƒ•ã‚£ãƒ«ã‚¿ã™ã‚‹..."
+msgid "Search or jump to..."
+msgstr ""
+
msgid "Search project"
msgstr "プロジェクトを検索"
@@ -29244,16 +29651,16 @@ msgstr "プロジェクト %{projectName}"
msgid "SearchCodeResults|of %{link_to_project}"
msgstr ""
-msgid "SearchResults|Showing %{count} %{scope} for%{term_element}"
-msgstr "%{term_element} ã®%{count} %{scope} を表示ã—ã¦ã„ã¾ã™"
+msgid "SearchResults|Showing %{count} %{scope} for %{term_element}"
+msgstr ""
-msgid "SearchResults|Showing %{count} %{scope} for%{term_element} in your personal and project snippets"
+msgid "SearchResults|Showing %{count} %{scope} for %{term_element} in your personal and project snippets"
msgstr ""
-msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for%{term_element}"
-msgstr "%{from} ã‹ã‚‰ %{to} ã¾ã§ã®%{term_element}ã®%{count}%{scope} を表示ã—ã¦ã„ã¾ã™"
+msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for %{term_element}"
+msgstr ""
-msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for%{term_element} in your personal and project snippets"
+msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for %{term_element} in your personal and project snippets"
msgstr ""
msgid "SearchResults|code result"
@@ -29324,6 +29731,9 @@ msgstr "秘密"
msgid "Secret Detection"
msgstr ""
+msgid "Secret access key"
+msgstr ""
+
msgid "Secret token"
msgstr ""
@@ -29363,9 +29773,6 @@ msgstr ""
msgid "SecurityApprovals|A merge request approval is required when the license compliance report contains a denied license."
msgstr ""
-msgid "SecurityApprovals|Configurable if security scanners are enabled. %{linkStart}Learn more.%{linkEnd}"
-msgstr ""
-
msgid "SecurityApprovals|Coverage-Check"
msgstr ""
@@ -29378,24 +29785,18 @@ msgstr ""
msgid "SecurityApprovals|Learn more about Vulnerability-Check"
msgstr ""
-msgid "SecurityApprovals|License Scanning must be enabled. %{linkStart}Learn more%{linkEnd}."
-msgstr ""
-
msgid "SecurityApprovals|License-Check"
msgstr ""
msgid "SecurityApprovals|Requires approval for Denied licenses. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}More information%{linkEnd}"
+msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "SecurityApprovals|Requires approval for vulnerabilities. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
-msgid "SecurityApprovals|Test coverage must be enabled. %{linkStart}Learn more%{linkEnd}."
-msgstr ""
-
msgid "SecurityApprovals|Vulnerability-Check"
msgstr ""
@@ -29459,6 +29860,12 @@ msgstr ""
msgid "SecurityConfiguration|Immediately begin risk analysis and remediation with application security features. Start with SAST and Secret Detection, available to all plans. Upgrade to Ultimate to get all features, including:"
msgstr ""
+msgid "SecurityConfiguration|Manage corpus"
+msgstr ""
+
+msgid "SecurityConfiguration|Manage corpus files used as mutation sources in coverage fuzzing."
+msgstr ""
+
msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
msgstr ""
@@ -29513,6 +29920,12 @@ msgstr ""
msgid "SecurityOrchestration|Action"
msgstr ""
+msgid "SecurityOrchestration|Actions"
+msgstr ""
+
+msgid "SecurityOrchestration|Add rule"
+msgstr ""
+
msgid "SecurityOrchestration|All policies"
msgstr ""
@@ -29546,9 +29959,6 @@ msgstr ""
msgid "SecurityOrchestration|Network"
msgstr ""
-msgid "SecurityOrchestration|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
-msgstr ""
-
msgid "SecurityOrchestration|New policy"
msgstr ""
@@ -29564,6 +29974,9 @@ msgstr ""
msgid "SecurityOrchestration|Policy editor"
msgstr ""
+msgid "SecurityOrchestration|Policy preview"
+msgstr ""
+
msgid "SecurityOrchestration|Policy status"
msgstr ""
@@ -29573,6 +29986,9 @@ msgstr ""
msgid "SecurityOrchestration|Rule"
msgstr ""
+msgid "SecurityOrchestration|Rules"
+msgstr ""
+
msgid "SecurityOrchestration|Scan Execution"
msgstr ""
@@ -29666,6 +30082,9 @@ msgstr ""
msgid "SecurityReports|Create issue"
msgstr "イシューを作æˆã™ã‚‹"
+msgid "SecurityReports|Development vulnerabilities"
+msgstr ""
+
msgid "SecurityReports|Dismiss vulnerability"
msgstr "脆弱性をéžè¡¨ç¤ºã«ã™ã‚‹"
@@ -29681,6 +30100,9 @@ msgstr ""
msgid "SecurityReports|Download results"
msgstr ""
+msgid "SecurityReports|Download scanned URLs"
+msgstr ""
+
msgid "SecurityReports|Download scanned resources"
msgstr ""
@@ -29804,6 +30226,9 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
+msgid "SecurityReports|The Vulnerability Report shows the results of the lastest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "SecurityReports|The security reports below contain one or more vulnerability findings that could not be parsed and were not recorded. Download the artifacts in the job output to investigate. Ensure any security report created conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
msgstr ""
@@ -29945,10 +30370,10 @@ msgstr ""
msgid "Select a repository"
msgstr "リãƒã‚¸ãƒˆãƒªã‚’é¸æŠž"
-msgid "Select a role"
+msgid "Select a repository containing templates for common files."
msgstr ""
-msgid "Select a shared template repository for all projects on this instance."
+msgid "Select a role"
msgstr ""
msgid "Select a template repository"
@@ -30026,6 +30451,9 @@ msgstr "マシンタイプをé¸æŠžã™ã‚‹ãŸã‚ã«ã€ãƒ—ロジェクトã¨ã‚¾ãƒ¼
msgid "Select project to choose zone"
msgstr "プロジェクトをé¸æŠžã—ã¦ã‚¾ãƒ¼ãƒ³ã‚’é¸æŠž"
+msgid "Select project to create issue"
+msgstr ""
+
msgid "Select projects"
msgstr "プロジェクトã®é¸æŠž"
@@ -30143,6 +30571,9 @@ msgstr ""
msgid "Send emails to help guide new users through the onboarding process."
msgstr ""
+msgid "Send emails to users upon account deactivation."
+msgstr ""
+
msgid "Send message"
msgstr ""
@@ -30161,6 +30592,9 @@ msgstr "レãƒãƒ¼ãƒˆã‚’é€ä¿¡"
msgid "Send service data"
msgstr ""
+msgid "Sentry"
+msgstr ""
+
msgid "Sentry API URL"
msgstr "Sentry API URL"
@@ -30275,6 +30709,9 @@ msgstr "リãƒã‚¸ãƒˆãƒªã«ã€å¯¾å¿œã™ã‚‹ %{startTag}serverless.yml%{endTag} フ
msgid "Service"
msgstr "サービス"
+msgid "Service Accounts keys are required to authorize GitLab to deploy your Google Cloud project."
+msgstr ""
+
msgid "Service Desk"
msgstr "サービスデスク"
@@ -30347,15 +30784,15 @@ msgstr ""
msgid "Set a password on your account to pull or push via %{protocol}."
msgstr "%{protocol} プロコトル経由ã§ãƒ—ルã€ãƒ—ッシュã™ã‚‹ãŸã‚ã«ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã®ãƒ‘スワードを設定。"
-msgid "Set a template repository for projects in this group"
-msgstr "ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã®ãƒ—ロジェクトã®ã€ãƒ†ãƒ³ãƒ—レートリãƒã‚¸ãƒˆãƒªã‚’設定ã™ã‚‹"
-
msgid "Set access permissions for this token."
msgstr ""
msgid "Set an instance-wide domain that will be available to all clusters when installing Knative."
msgstr ""
+msgid "Set any rate limit to %{code_open}0%{code_close} to disable the limit."
+msgstr ""
+
msgid "Set default and restrict visibility levels. Configure import sources and git access protocol."
msgstr "デフォルトを設定ã—ã€å¯è¦–性レベルを制é™ã—ã¾ã™ã€‚インãƒãƒ¼ãƒˆã‚½ãƒ¼ã‚¹ã¨ git アクセスプロトコルを設定ã—ã¾ã™ã€‚"
@@ -30368,8 +30805,8 @@ msgstr "イテレーションを設定"
msgid "Set limit to 0 to allow any file size."
msgstr ""
-msgid "Set max session time for web terminal."
-msgstr "ウェブターミナルã®æœ€å¤§ã‚»ãƒƒã‚·ãƒ§ãƒ³ã‚¿ã‚¤ãƒ ã‚’設定ã™ã‚‹ã€‚"
+msgid "Set limits for web and API requests."
+msgstr ""
msgid "Set milestone"
msgstr "マイルストーンã®è¨­å®š"
@@ -30377,15 +30814,18 @@ msgstr "マイルストーンã®è¨­å®š"
msgid "Set new password"
msgstr "æ–°ã—ã„パスワードを設定"
-msgid "Set notification email for abuse reports."
-msgstr "ä¸æ­£åˆ©ç”¨ãƒ¬ãƒãƒ¼ãƒˆã®é€šçŸ¥ãƒ¡ãƒ¼ãƒ«ã‚’設定ã™ã‚‹ã€‚"
-
msgid "Set parent epic to an epic"
msgstr "親エピックをエピックã«è¨­å®š"
+msgid "Set per-user rate limits for imports and exports of projects and groups."
+msgstr ""
+
msgid "Set projects and maximum size limits, session duration, user options, and check feature availability for namespace plan."
msgstr ""
+msgid "Set rate limits for package registry API requests that supersede the general user and IP rate limits."
+msgstr ""
+
msgid "Set severity"
msgstr ""
@@ -30404,15 +30844,24 @@ msgstr "ターゲットブランãƒã‚’ %{branch_name} ã«è¨­å®šã—ã¾ã—ãŸã€‚"
msgid "Set the default branch for this project. All merge requests and commits are made against this branch unless you specify a different one."
msgstr ""
+msgid "Set the default expiration time for job artifacts in all projects. Set to %{code_open}0%{code_close} to never expire artifacts by default. If no unit is written, it defaults to seconds. For example, these are all equivalent: %{code_open}3600%{code_close}, %{code_open}60 minutes%{code_close}, or %{code_open}one hour%{code_close}."
+msgstr ""
+
msgid "Set the due date to %{due_date}."
msgstr "期日を %{due_date} ã«è¨­å®šã€‚"
msgid "Set the iteration to %{iteration_reference}."
msgstr "イテレーションを %{iteration_reference} ã«è¨­å®šã—ã¾ã—ãŸã€‚"
+msgid "Set the maximum session time for a web terminal."
+msgstr ""
+
msgid "Set the milestone to %{milestone_reference}."
msgstr "マイルストーンを %{milestone_reference} ã«è¨­å®šã€‚"
+msgid "Set the per-user rate limit for notes created by web or API requests."
+msgstr ""
+
msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
msgstr ""
@@ -30614,6 +31063,9 @@ msgstr ""
msgid "Show Pipeline IID"
msgstr ""
+msgid "Show all %{issuable_type}."
+msgstr ""
+
msgid "Show all activity"
msgstr "ã™ã¹ã¦ã®ã‚¢ã‚¯ãƒ†ã‚£ãƒ“ティを表示"
@@ -30665,15 +31117,9 @@ msgstr "最新ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’表示"
msgid "Show list"
msgstr ""
-msgid "Show me advanced features"
-msgstr ""
-
msgid "Show me how to add a pipeline"
msgstr ""
-msgid "Show me the basics"
-msgstr ""
-
msgid "Show one file at a time"
msgstr ""
@@ -30712,15 +31158,15 @@ msgstr "%{total_count} 件中 %{limit} ã®ã‚¤ã‚·ãƒ¥ãƒ¼ã‚’表示. "
msgid "Showing %{pageSize} of %{total} %{issuableType}"
msgstr ""
-msgid "Showing %{pageSize} of %{total} issues"
-msgstr "%{total} 件中 %{pageSize} ã®ã‚¤ã‚·ãƒ¥ãƒ¼ã‚’表示"
-
msgid "Showing all epics"
msgstr ""
msgid "Showing all issues"
msgstr "ã™ã¹ã¦ã®ã‚¤ã‚·ãƒ¥ãƒ¼ã‚’表示"
+msgid "Showing data for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
+msgstr ""
+
msgid "Showing data for workflow items created in this date range. Date range cannot exceed %{maxDateRange} days."
msgstr ""
@@ -30760,6 +31206,15 @@ msgstr "æ•°å­—ã®ã¿ä½¿ç”¨ã§ãã¾ã™"
msgid "Sidebar|Weight"
msgstr "ウェイト"
+msgid "Sidekiq job compression threshold (bytes)"
+msgstr ""
+
+msgid "Sidekiq job size limit (bytes)"
+msgstr ""
+
+msgid "Sidekiq job size limits"
+msgstr ""
+
msgid "Sign in"
msgstr "サインイン"
@@ -30880,6 +31335,9 @@ msgstr ""
msgid "Site profile not found for given parameters"
msgstr ""
+msgid "Sites"
+msgstr ""
+
msgid "Size"
msgstr "サイズ"
@@ -30910,20 +31368,23 @@ msgstr "Slackçµ±åˆã§ã¯ã€Slackã®ãƒãƒ£ãƒƒãƒˆã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã‹ã‚‰ slash コã
msgid "SlackIntegration|Sends notifications about project events to Slack channels."
msgstr ""
-msgid "SlackService|2. Paste the %{strong_open}Token%{strong_close} into the field below"
+msgid "SlackService|1. %{slash_command_link_start}Add a slash command%{slash_command_link_end} in your Slack team using this information:"
+msgstr ""
+
+msgid "SlackService|2. Paste the token from Slack in the %{strong_open}Token%{strong_close} field below."
+msgstr ""
+
+msgid "SlackService|3. Select the %{strong_open}Active%{strong_close} checkbox, select %{strong_open}Save changes%{strong_close}, and start using slash commands in Slack!"
msgstr ""
-msgid "SlackService|3. Select the %{strong_open}Active%{strong_close} checkbox, press %{strong_open}Save changes%{strong_close} and start using GitLab inside Slack!"
+msgid "SlackService|After setup, get a list of available Slack slash commands by entering"
msgstr ""
msgid "SlackService|Fill in the word that works best for your team."
msgstr "ãƒãƒ¼ãƒ ã«æœ€é©ãªãƒ¯ãƒ¼ãƒ‰ã‚’入力ã—ã¦ãã ã•ã„。"
-msgid "SlackService|See list of available commands in Slack after setting up this service, by entering"
-msgstr "ã“ã®ã‚µãƒ¼ãƒ“スを設定ã—ãŸå¾Œã« Slack 上ã§ä½¿ç”¨ã§ãるコマンドã®ãƒªã‚¹ãƒˆã‚’表示ã™ã‚‹ã«ã¯ã€æ¬¡ã‚’入力ã—ã¾ã™ã€‚"
-
-msgid "SlackService|This service allows users to perform common operations on this project by entering slash commands in Slack."
-msgstr "ã“ã®ã‚µãƒ¼ãƒ“スã«ã‚ˆã‚Šã€ãƒ¦ãƒ¼ã‚¶ãƒ¼ã¯ Slack ã«ã‚¹ãƒ©ãƒƒã‚·ãƒ¥ã‚³ãƒžãƒ³ãƒ‰ã‚’入力ã—ã¦ã€ã“ã®ãƒ—ロジェクト上ã®ä¸€èˆ¬çš„ãªæ“作ãŒå®Ÿè¡Œã§ãã¾ã™ã€‚"
+msgid "SlackService|Perform common operations in this project by entering slash commands in Slack."
+msgstr ""
msgid "Slice multiplier"
msgstr ""
@@ -30988,8 +31449,8 @@ msgstr ""
msgid "Some child epics may be hidden due to applied filters"
msgstr ""
-msgid "Some common domains are not allowed. %{read_more_link}."
-msgstr "ã„ãã¤ã‹ã®ä¸€èˆ¬çš„ãªãƒ‰ãƒ¡ã‚¤ãƒ³ã¯è¨±å¯ã•ã‚Œã¦ã„ã¾ã›ã‚“。 %{read_more_link}."
+msgid "Some common domains are not allowed. %{learn_more_link}."
+msgstr ""
msgid "Some of the designs you tried uploading did not change:"
msgstr ""
@@ -31072,9 +31533,6 @@ msgstr "コメントを編集ã™ã‚‹é–“ã«å•é¡ŒãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚ã‚‚ã†ä¸€
msgid "Something went wrong while exporting requirements"
msgstr ""
-msgid "Something went wrong while fetching %{listType} list"
-msgstr "%{listType} ã®ãƒªã‚¹ãƒˆå–得中ã«å•é¡ŒãŒç™ºç”Ÿã—ã¾ã—ãŸ"
-
msgid "Something went wrong while fetching branches"
msgstr ""
@@ -31129,15 +31587,9 @@ msgstr ""
msgid "Something went wrong while merging this merge request. Please try again."
msgstr "ã“ã®ãƒžãƒ¼ã‚¸ãƒªã‚¯ã‚¨ã‚¹ãƒˆã®ãƒžãƒ¼ã‚¸ä¸­ã«å•é¡ŒãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚ã‚‚ã†ä¸€åº¦ã‚„ã‚Šç›´ã—ã¦ãã ã•ã„。"
-msgid "Something went wrong while moving issues."
-msgstr "イシューを移動ã™ã‚‹éš›ã«å•é¡ŒãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚"
-
msgid "Something went wrong while obtaining the Let's Encrypt certificate."
msgstr "Let's Encrypt ã®è¨¼æ˜Žæ›¸ã‚’å–å¾—ã™ã‚‹éš›ã«å•é¡ŒãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚"
-msgid "Something went wrong while performing the action."
-msgstr "アクションã«å®Ÿæ–½ä¸­ã«å•é¡ŒãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚"
-
msgid "Something went wrong while promoting the issue to an epic. Please try again."
msgstr ""
@@ -31465,7 +31917,10 @@ msgstr ""
msgid "SourcegraphPreferences|Uses a custom %{linkStart}Sourcegraph instance%{linkEnd}."
msgstr ""
-msgid "Spam Check API Key"
+msgid "Spam Check"
+msgstr ""
+
+msgid "Spam Check API key"
msgstr ""
msgid "Spam Logs"
@@ -31483,8 +31938,8 @@ msgstr ""
msgid "Specified URL cannot be used: \"%{reason}\""
msgstr "指定ã®URLã¯ä½¿ç”¨ã§ãã¾ã›ã‚“: \"%{reason}\""
-msgid "Specify an e-mail address regex pattern to identify default internal users."
-msgstr "メールアドレスã®æ­£è¦è¡¨ç¾ãƒ‘ターンを指定ã—ã¦ã€ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆã®å†…部ユーザーを区別ã—ã¾ã™ã€‚"
+msgid "Specify an email address regex pattern to identify default internal users."
+msgstr ""
msgid "Speed up your pipelines with Needs relationships"
msgstr ""
@@ -31738,7 +32193,7 @@ msgstr ""
msgid "StatusCheck|An error occurred fetching the status checks."
msgstr ""
-msgid "StatusCheck|Apply this status check to any branch or a specific protected branch."
+msgid "StatusCheck|Apply this status check to all branches or a specific protected branch."
msgstr ""
msgid "StatusCheck|Check for a status response in Merge Requests. Failures do not block merges. %{link_start}Learn more%{link_end}."
@@ -32077,6 +32532,9 @@ msgstr "使用数ã®ã‚«ã‚¦ãƒ³ãƒˆã¯1æ—¥1回ã€åˆå¾Œ12:00ã«å®Ÿè¡Œã•ã‚Œã¾ã™ã€
msgid "Subscriptions"
msgstr "サブスクリプション"
+msgid "Subscription|Your subscription for %{strong}%{namespace_name}%{strong_close} has expired and you are now on %{pricing_link_start}the GitLab Free tier%{pricing_link_end}. Don't worry, your data is safe. Get in touch with our support team (%{support_email}). They'll gladly help with your subscription renewal."
+msgstr ""
+
msgid "Subtracted"
msgstr "減算"
@@ -32305,6 +32763,9 @@ msgstr ""
msgid "SuperSonics|Plan"
msgstr ""
+msgid "SuperSonics|Please agree to the Subscription Agreement"
+msgstr ""
+
msgid "SuperSonics|Ready to get started? A GitLab plan is ideal for scaling organizations and for multi team usage."
msgstr ""
@@ -32335,6 +32796,9 @@ msgstr ""
msgid "SuperSonics|The activation code is not valid. Please make sure to copy it exactly from the Customers Portal or confirmation email. Learn more about %{linkStart}activating your subscription%{linkEnd}."
msgstr ""
+msgid "SuperSonics|The activation code should be a 24-character alphanumeric string"
+msgstr ""
+
msgid "SuperSonics|There is a connectivity issue."
msgstr ""
@@ -32377,9 +32841,15 @@ msgstr ""
msgid "SuperSonics|You do not have an active subscription"
msgstr ""
+msgid "SuperSonics|You have successfully added a license that activates on %{date}. Please see the subscription history table below for more details."
+msgstr ""
+
msgid "SuperSonics|You'll be charged for %{trueUpLinkStart}users over license%{trueUpLinkEnd} on a quarterly or annual basis, depending on the terms of your agreement."
msgstr ""
+msgid "SuperSonics|Your future dated license was successfully added"
+msgstr ""
+
msgid "SuperSonics|Your subscription"
msgstr ""
@@ -32632,7 +33102,7 @@ msgstr "テンプレート"
msgid "Template to append to all Service Desk issues"
msgstr "å…¨ã¦ã®ã‚µãƒ¼ãƒ“スデスクã®ã‚¤ã‚·ãƒ¥ãƒ¼ã«è¿½åŠ ã™ã‚‹ãƒ†ãƒ³ãƒ—レート"
-msgid "TemplateRepository|Select a repository to make its templates available to all projects. %{link_start}What should the repository contain?%{link_end} "
+msgid "TemplateRepository|Create common files more quickly, and standardize their format."
msgstr ""
msgid "Templates"
@@ -32834,7 +33304,7 @@ msgstr ""
msgid "TestCases|Search test cases"
msgstr ""
-msgid "TestCases|Something went wrong while adding test case to Todo."
+msgid "TestCases|Something went wrong while adding test case to a to-do item."
msgstr ""
msgid "TestCases|Something went wrong while creating a test case."
@@ -32846,7 +33316,7 @@ msgstr ""
msgid "TestCases|Something went wrong while fetching test cases list."
msgstr ""
-msgid "TestCases|Something went wrong while marking test case todo as done."
+msgid "TestCases|Something went wrong while marking test case to-do item as done."
msgstr ""
msgid "TestCases|Something went wrong while moving test case."
@@ -32966,7 +33436,7 @@ msgstr ""
msgid "Thanks for your purchase!"
msgstr ""
-msgid "That is ok, I do not want to renew"
+msgid "That's OK, I don't want to renew"
msgstr ""
msgid "That's it, well done!"
@@ -32988,7 +33458,7 @@ msgid "The %{type} contains the following error:"
msgid_plural "The %{type} contains the following errors:"
msgstr[0] "%{type} ã«æ¬¡ã®ã‚¨ãƒ©ãƒ¼ãŒå«ã¾ã‚Œã¦ã„ã¾ã™ã€‚"
-msgid "The API key used by GitLab for accessing the Spam Check service endpoint"
+msgid "The API key used by GitLab for accessing the Spam Check service endpoint."
msgstr ""
msgid "The GitLab subscription service (customers.gitlab.com) is currently experiencing an outage. You can monitor the status and get updates at %{linkStart}status.gitlab.com%{linkEnd}."
@@ -33027,9 +33497,6 @@ msgstr ""
msgid "The URL to use for connecting to Elasticsearch. Use a comma-separated list to support clustering (e.g., \"http://localhost:9200, http://localhost:9201\")."
msgstr "Elasticsearchã¸ã®æŽ¥ç¶šã«ä½¿ç”¨ã™ã‚‹URL。クラスタリングをサãƒãƒ¼ãƒˆã™ã‚‹ã«ã¯ã€ã‚³ãƒ³ãƒžåŒºåˆ‡ã‚Šãƒªã‚¹ãƒˆã‚’使用ã—ã¾ã™(例: http://localhost:9200, http://localhost:9201)。"
-msgid "The Vulnerability Report shows the results of the last successful pipeline run on the default branch."
-msgstr "脆弱性レãƒãƒ¼ãƒˆã«ã¯ã€ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆãƒ–ランãƒã§æœ€å¾Œã«æˆåŠŸã—ãŸãƒ‘イプラインã®å®Ÿè¡ŒçµæžœãŒè¡¨ç¤ºã•ã‚Œã¾ã™ã€‚"
-
msgid "The X509 Certificate to use when mutual TLS is required to communicate with the external authorization service. If left blank, the server certificate is still validated when accessing over HTTPS."
msgstr "外部èªè¨¼ã‚µãƒ¼ãƒ“スã¨ã®é€šä¿¡ã«ç›¸äº’ TLS ãŒå¿…è¦ãªå ´åˆã«ä½¿ç”¨ã™ã‚‹ X509 証明書。空白ã®ã¾ã¾ã«ã™ã‚‹ã¨ã€HTTPS 経由ã§ã‚¢ã‚¯ã‚»ã‚¹ã™ã‚‹ã¨ãã«ã‚µãƒ¼ãƒè¨¼æ˜Žæ›¸ã®æ¤œè¨¼ãŒè¡Œã‚ã‚Œã¾ã™ã€‚"
@@ -33087,9 +33554,6 @@ msgstr ""
msgid "The default branch for this project has been changed. Please update your bookmarks."
msgstr ""
-msgid "The default expiration time for job artifacts. 0 for unlimited. The default unit is in seconds, but you can use other units, for example %{code_open}4 mins 2 sec%{code_close}, %{code_open}2h42min%{code_close}."
-msgstr ""
-
msgid "The dependency list details information about the components used within your project."
msgstr "ä¾å­˜é–¢ä¿‚リストã«ã¯ãƒ—ロジェクト内ã§ä½¿ç”¨ã•ã‚Œã¦ã„るコンãƒãƒ¼ãƒãƒ³ãƒˆã«é–¢ã™ã‚‹è©³ç´°æƒ…å ±ãŒè¨˜è¼‰ã•ã‚Œã¦ã„ã¾ã™ã€‚"
@@ -33280,9 +33744,6 @@ msgstr "ã“ã®ãƒžãƒ¼ã‚¸ãƒªã‚¯ã‚¨ã‚¹ãƒˆã«å¯¾ã™ã‚‹ãƒžãƒ¼ã‚¸ã®ç«¶åˆã¯ã™ã§ã«
msgid "The merge conflicts for this merge request have already been resolved. Please return to the merge request."
msgstr "ã“ã®ãƒžãƒ¼ã‚¸ãƒªã‚¯ã‚¨ã‚¹ãƒˆã«å¯¾ã™ã‚‹ãƒžãƒ¼ã‚¸ã®ç«¶åˆã¯ã™ã§ã«è§£æ±ºã•ã‚Œã¦ã„ã¾ã™ã€‚マージリクエストã«æˆ»ã£ã¦ãã ã•ã„。"
-msgid "The merge request can now be merged."
-msgstr "ã“ã®ãƒžãƒ¼ã‚¸ãƒªã‚¯ã‚¨ã‚¹ãƒˆã¯ä»Šã€ãƒžãƒ¼ã‚¸ã§ãã¾ã™ã€‚"
-
msgid "The metric must be one of %{metrics}."
msgstr ""
@@ -33658,8 +34119,8 @@ msgstr "確èªãƒ¡ãƒ¼ãƒ«ã®é€ä¿¡ä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚"
msgid "There was a problem updating the keep latest artifacts setting."
msgstr ""
-msgid "There was an error %{message} todo."
-msgstr "Todoã® %{message} ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚"
+msgid "There was an error %{message} to-do item."
+msgstr ""
msgid "There was an error adding a To Do."
msgstr "To Doã®è¿½åŠ ã§ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚"
@@ -33697,6 +34158,9 @@ msgstr ""
msgid "There was an error fetching projects"
msgstr ""
+msgid "There was an error fetching search autocomplete suggestions"
+msgstr ""
+
msgid "There was an error fetching stage total counts"
msgstr ""
@@ -34021,6 +34485,9 @@ msgstr ""
msgid "This field is required."
msgstr "ã“ã®ãƒ•ã‚£ãƒ¼ãƒ«ãƒ‰ã¯å¿…é ˆã§ã™ã€‚"
+msgid "This form is disabled in preview"
+msgstr ""
+
msgid "This group"
msgstr "ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—"
@@ -34042,9 +34509,6 @@ msgstr ""
msgid "This group is linked to a subscription"
msgstr ""
-msgid "This group, including all subgroups, projects and git repositories, will be reachable from only the specified IP address ranges."
-msgstr ""
-
msgid "This group, its subgroups and projects has been scheduled for removal on %{date}."
msgstr ""
@@ -34324,9 +34788,6 @@ msgstr ""
msgid "This user cannot be unlocked manually from GitLab"
msgstr "ã“ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã¯ GitLab ã‹ã‚‰ãƒžãƒ‹ãƒ¥ã‚¢ãƒ«æ“作ã§ãƒ­ãƒƒã‚¯ã‚’解除ã§ãã¾ã›ã‚“"
-msgid "This user does not have a pending request"
-msgstr ""
-
msgid "This user has an unconfirmed email address (%{email}). You may force a confirmation."
msgstr ""
@@ -34435,9 +34896,6 @@ msgstr "1秒ã‚ãŸã‚Šã®æ“作数"
msgid "ThreatMonitoring|Packet Activity"
msgstr ""
-msgid "ThreatMonitoring|Policies"
-msgstr ""
-
msgid "ThreatMonitoring|Requests"
msgstr ""
@@ -34489,6 +34947,12 @@ msgstr ""
msgid "ThreatMonitoring|View documentation"
msgstr ""
+msgid "Threshold in bytes at which to compress Sidekiq job arguments."
+msgstr ""
+
+msgid "Threshold in bytes at which to reject Sidekiq jobs. Set this to 0 to if you don't want to limit Sidekiq jobs."
+msgstr ""
+
msgid "Throughput"
msgstr ""
@@ -34498,6 +34962,9 @@ msgstr "木曜日"
msgid "Time"
msgstr "時間"
+msgid "Time (in hours) that users are allowed to skip forced configuration of two-factor authentication."
+msgstr ""
+
msgid "Time Spent"
msgstr ""
@@ -34564,8 +35031,8 @@ msgstr ""
msgid "TimeTrackingEstimated|Est"
msgstr "見ç©ã‚‚り時間"
-msgid "TimeTracking|%{startTag}Spent: %{endTag}%{timeSpentHumanReadable}"
-msgstr "%{startTag}作業時間:%{endTag}%{timeSpentHumanReadable}"
+msgid "TimeTracking|%{spentStart}Spent: %{spentEnd}"
+msgstr ""
msgid "TimeTracking|Estimated:"
msgstr "見ç©ã‚‚り時間:"
@@ -34776,6 +35243,9 @@ msgstr ""
msgid "To access this domain create a new DNS record"
msgstr "ã“ã®ãƒ‰ãƒ¡ã‚¤ãƒ³ã«ã‚¢ã‚¯ã‚»ã‚¹ã™ã‚‹ã«ã¯ã€æ–°ã—ã„DNSレコードを作æˆã—ã¦ãã ã•ã„"
+msgid "To add a custom suffix, set up a Service Desk email address. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "To add an SSH key you need to %{generate_link_start}generate one%{link_end} or use an %{existing_link_start}existing key%{link_end}."
msgstr "SSH キーを追加ã™ã‚‹ã«ã¯ã€%{generate_link_start}キーを生æˆã™ã‚‹%{link_end} ã¾ãŸã¯%{existing_link_start}既存ã®ã‚­ãƒ¼ã‚’使用ã™ã‚‹%{link_end}ã®ã©ã¡ã‚‰ã‹ãŒå¿…è¦ã§ã™ã€‚"
@@ -34797,13 +35267,16 @@ msgstr "GitHub リãƒã‚¸ãƒˆãƒªã«æŽ¥ç¶šã™ã‚‹ã«ã¯ã€GitLab ãŒã‚ãªãŸã® Git
msgid "To connect an SVN repository, check out %{svn_link}."
msgstr "SVN リãƒã‚¸ãƒˆãƒªã«æŽ¥ç¶šã™ã‚‹ã¨ãã¯ã€%{svn_link} ã‚’ã”確èªãã ã•ã„。"
+msgid "To continue using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
+msgstr ""
+
msgid "To continue, you need to select the link in the confirmation email we sent to verify your email address. If you didn't get our email, select %{strongStart}Resend confirmation email.%{strongEnd}"
msgstr ""
msgid "To define internal users, first enable new users set to external"
msgstr "内部ユーザーを定義ã™ã‚‹ãŸã‚ã«ã¯ã€å…ˆã«æ–°è¦ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‚’外部ユーザーã«è¨­å®šã§ãるよã†ã«ã—ã¾ã™ã€‚"
-msgid "To enable Registration Features, make sure \"Enable service ping\" is checked."
+msgid "To enable Registration Features, first enable Service Ping."
msgstr ""
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
@@ -34830,8 +35303,8 @@ msgstr "開始ã™ã‚‹ã«ã¯ã€Gitea Host ã® URL 㨠%{link_to_personal_token} ã‚
msgid "To get started, use the link below to confirm your account."
msgstr ""
-msgid "To help improve GitLab and its user experience, GitLab will periodically collect usage information."
-msgstr "GitLab ã®æ”¹å–„㨠GitLab ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‚¨ã‚¯ã‚¹ãƒšãƒªã‚¨ãƒ³ã‚¹ã‚’å‘上ã•ã›ã‚‹ãŸã‚ã€GitLab ã¯å®šæœŸçš„ã«ä½¿ç”¨çŠ¶æ³æƒ…報をåŽé›†ã—ã¾ã™ã€‚"
+msgid "To help improve GitLab and its user experience, GitLab periodically collects usage information."
+msgstr ""
msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
msgstr ""
@@ -34863,8 +35336,8 @@ msgstr ""
msgid "To preserve performance only %{strong_open}%{display_size} of %{real_size}%{strong_close} files are displayed."
msgstr ""
-msgid "To protect this issue's confidentiality, %{forkLink} and set the fork's visibility to private."
-msgstr "ã“ã®ã‚¤ã‚·ãƒ¥ãƒ¼ã®æ©Ÿå¯†æ€§ã‚’ä¿è­·ã™ã‚‹ãŸã‚ã«ã€%{forkLink} ã¨ãƒ•ã‚©ãƒ¼ã‚¯ã®å¯è¦–性をプライベートã«è¨­å®šã—ã¾ã™ã€‚"
+msgid "To protect this issue's confidentiality, %{linkStart}fork this project%{linkEnd} and set the fork's visibility to private."
+msgstr ""
msgid "To protect this issue's confidentiality, a private fork of this project was selected."
msgstr "ã“ã®ã‚¤ã‚·ãƒ¥ãƒ¼ã®æ©Ÿå¯†æ€§ã‚’ä¿è­·ã™ã‚‹ãŸã‚ã«ã€ã“ã®ãƒ—ロジェクトã®ãƒ—ライベートフォークãŒé¸æŠžã•ã‚Œã¾ã—ãŸã€‚"
@@ -34896,12 +35369,15 @@ msgstr "ã“ã®ãƒ—ロジェクトã®é‹ç”¨ä¸Šã®è©³ç´°ã‚’確èªã™ã‚‹ã«ã¯ã€ %{
msgid "To set up SAML authentication for your group through an identity provider like Azure, Okta, Onelogin, Ping Identity, or your custom SAML 2.0 provider:"
msgstr "Azureã€Oktaã€Oneloginã€Ping Identyã€ã¾ãŸã¯ã‚«ã‚¹ã‚¿ãƒ  SAML 2.0 プロãƒã‚¤ãƒ€ãƒ¼ãªã©ã® ID プロãƒã‚¤ãƒ€ãƒ¼ã‚’利用ã—ã¦ã€ã‚ãªãŸã®ã‚°ãƒ«ãƒ¼ãƒ—ã® SAML èªè¨¼ã‚’設定ã™ã‚‹ã«ã¯:"
-msgid "To set up this service:"
-msgstr "ã“ã®ã‚µãƒ¼ãƒ“スをセットアップã™ã‚‹ãŸã‚:"
+msgid "To set up this integration:"
+msgstr ""
msgid "To specify the notification level per project of a group you belong to, you need to visit project page and change notification level there."
msgstr "所属ã™ã‚‹ã‚°ãƒ«ãƒ¼ãƒ—ã®ãƒ—ロジェクトã”ã¨ã®é€šçŸ¥ãƒ¬ãƒ™ãƒ«ã‚’指定ã™ã‚‹ã«ã¯ã€ãƒ—ロジェクトページã«ã‚¢ã‚¯ã‚»ã‚¹ã—ã€ãã“ã§é€šçŸ¥ãƒ¬ãƒ™ãƒ«ã‚’変更ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚"
+msgid "To start using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
+msgstr ""
+
msgid "To unsubscribe from this issue, please paste the following link into your browser:"
msgstr ""
@@ -35488,9 +35964,6 @@ msgstr ""
msgid "Unable to fetch branches list, please close the form and try again"
msgstr ""
-msgid "Unable to fetch unscanned projects"
-msgstr ""
-
msgid "Unable to fetch vulnerable projects"
msgstr "脆弱ãªãƒ—ロジェクトã¯å–å¾—ã§ãã¾ã›ã‚“"
@@ -35545,6 +36018,15 @@ msgstr "ç¾æ™‚点ã§ã¯ã“ã®ã‚¨ãƒ”ックを更新ã§ãã¾ã›ã‚“。"
msgid "Unable to update this issue at this time."
msgstr "ç¾æ™‚点ã§ã¯ã“ã®ã‚¤ã‚·ãƒ¥ãƒ¼ã‚’æ›´æ–°ã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。"
+msgid "Unapprove a merge request"
+msgstr ""
+
+msgid "Unapprove the current merge request."
+msgstr ""
+
+msgid "Unapproved the current merge request."
+msgstr ""
+
msgid "Unarchive project"
msgstr "プロジェクトã®ã‚¢ãƒ¼ã‚«ã‚¤ãƒ–解除"
@@ -35557,16 +36039,13 @@ msgstr ""
msgid "Unassigned"
msgstr "未割り当ã¦"
-msgid "Unauthenticated API request rate limit"
+msgid "Unauthenticated API rate limit period in seconds"
msgstr ""
-msgid "Unauthenticated rate limit period in seconds"
-msgstr ""
-
-msgid "Unauthenticated request rate limit"
+msgid "Unauthenticated requests"
msgstr ""
-msgid "Unauthenticated requests"
+msgid "Unauthenticated web rate limit period in seconds"
msgstr ""
msgid "Undo"
@@ -35668,18 +36147,6 @@ msgstr "スレッドを未解決ã«ã™ã‚‹"
msgid "Unresolved"
msgstr ""
-msgid "UnscannedProjects|15 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|30 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|5 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|60 or more days"
-msgstr ""
-
msgid "Unschedule job"
msgstr "ジョブã®ã‚¹ã‚±ã‚¸ãƒ¥ãƒ¼ãƒ«ã‚’解除"
@@ -35899,6 +36366,9 @@ msgstr "使用状æ³ã®çµ±è¨ˆ"
msgid "UsageQuota|%{help_link_start}Shared runners%{help_link_end} are disabled, so there are no limits set on pipeline usage"
msgstr "%{help_link_start}共有 Runner%{help_link_end} ã¯ç„¡åŠ¹ã«ãªã£ã¦ã„ã‚‹ãŸã‚ã€ãƒ‘イプラインã®ä½¿ç”¨ã«åˆ¶é™ã¯ã‚ã‚Šã¾ã›ã‚“"
+msgid "UsageQuota|%{linkTitle} help link"
+msgstr ""
+
msgid "UsageQuota|%{percentageLeft} of purchased storage is available"
msgstr ""
@@ -35908,6 +36378,9 @@ msgstr "アーティファクト"
msgid "UsageQuota|Artifacts is a sum of build and pipeline artifacts."
msgstr ""
+msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
+msgstr ""
+
msgid "UsageQuota|Buy additional minutes"
msgstr "追加分ã®è³¼å…¥"
@@ -35917,9 +36390,21 @@ msgstr ""
msgid "UsageQuota|CI minutes usage by project"
msgstr ""
+msgid "UsageQuota|Code packages and container images."
+msgstr ""
+
msgid "UsageQuota|Current period usage"
msgstr "ç¾åœ¨ã®ä½¿ç”¨çŠ¶æ³"
+msgid "UsageQuota|File attachments and smaller design graphics."
+msgstr ""
+
+msgid "UsageQuota|Git repository, managed by the Gitaly service."
+msgstr ""
+
+msgid "UsageQuota|Includes project registry, artifacts, packages, wiki, uploads and other items."
+msgstr ""
+
msgid "UsageQuota|Increase storage temporarily"
msgstr ""
@@ -35938,6 +36423,9 @@ msgstr ""
msgid "UsageQuota|Packages"
msgstr "パッケージ"
+msgid "UsageQuota|Pipeline artifacts and job artifacts, created with CI/CD."
+msgstr ""
+
msgid "UsageQuota|Pipelines"
msgstr "パイプライン"
@@ -35956,6 +36444,9 @@ msgstr "リãƒã‚¸ãƒˆãƒª"
msgid "UsageQuota|Seats"
msgstr ""
+msgid "UsageQuota|Shared bits of code and text."
+msgstr ""
+
msgid "UsageQuota|Snippets"
msgstr "スニペット"
@@ -35965,6 +36456,12 @@ msgstr ""
msgid "UsageQuota|Storage"
msgstr "ストレージ"
+msgid "UsageQuota|Storage type"
+msgstr ""
+
+msgid "UsageQuota|There is a known issue with Artifact storage where the total could be incorrect for some projects. More details and progress are available in %{warningLinkStart}the epic%{warningLinkEnd}."
+msgstr ""
+
msgid "UsageQuota|This is the total amount of storage used across your projects within this namespace."
msgstr ""
@@ -36004,6 +36501,9 @@ msgstr ""
msgid "UsageQuota|Usage"
msgstr "使用率"
+msgid "UsageQuota|Usage Breakdown"
+msgstr ""
+
msgid "UsageQuota|Usage Quotas"
msgstr "割当使用率"
@@ -36028,6 +36528,9 @@ msgstr ""
msgid "UsageQuota|Wiki"
msgstr "Wiki"
+msgid "UsageQuota|Wiki content."
+msgstr ""
+
msgid "UsageQuota|Wikis"
msgstr ""
@@ -36244,8 +36747,11 @@ msgstr "ユーザー OAuth アプリケーション"
msgid "User Settings"
msgstr "ユーザー設定"
-msgid "User and IP Rate Limits"
-msgstr "ユーザーã¨IPレートã®åˆ¶é™"
+msgid "User and IP rate limits"
+msgstr ""
+
+msgid "User does not have a pending request"
+msgstr ""
msgid "User identity was successfully created."
msgstr "ユーザーã®è­˜åˆ¥å­ãŒæ­£å¸¸ã«ä½œæˆã§ãã¾ã—ãŸã€‚"
@@ -36541,6 +37047,9 @@ msgstr "ユーザー"
msgid "Users can launch a development environment from a GitLab browser tab when the %{linkStart}Gitpod%{linkEnd} integration is enabled."
msgstr ""
+msgid "Users can reactivate their account by signing in."
+msgstr ""
+
msgid "Users can render diagrams in AsciiDoc, Markdown, reStructuredText, and Textile documents using Kroki."
msgstr ""
@@ -36556,6 +37065,9 @@ msgstr ""
msgid "Users requesting access to"
msgstr "次ã®å ´æ‰€ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ã‚’è¦æ±‚ã—ã¦ã„るユーザー"
+msgid "Users to exclude from the rate limit"
+msgstr ""
+
msgid "Users were successfully added."
msgstr "ユーザーを正常ã«è¿½åŠ ã§ãã¾ã—ãŸã€‚"
@@ -36577,6 +37089,9 @@ msgstr "è­²å—人ãªã— - %{openingTag} 自分自身を割り当ã¦ã‚‹ %{closing
msgid "UsersSelect|Unassigned"
msgstr "未割り当ã¦"
+msgid "Uses GitLab as a lightweight alternative to Sentry."
+msgstr ""
+
msgid "Using %{code_start}::%{code_end} denotes a %{link_start}scoped label set%{link_end}"
msgstr "%{code_start}::%{code_end} を使ã£ã¦ã€ %{link_start} ラベルセットã®ç¯„囲%{link_end} を示ã™"
@@ -36607,10 +37122,7 @@ msgstr "ãƒãƒªãƒ¥ãƒ¼ã‚¹ãƒˆãƒªãƒ¼ãƒ åˆ†æž"
msgid "Value Stream Analytics can help you determine your team’s velocity"
msgstr "ãƒãƒªãƒ¥ãƒ¼ã‚¹ãƒˆãƒªãƒ¼ãƒ åˆ†æžã¯ã€ã‚ãªãŸã®ãƒãƒ¼ãƒ ã®é–‹ç™ºé€Ÿåº¦ã‚’判断ã™ã‚‹ã®ã«å½¹ç«‹ã¡ã¾ã™"
-msgid "Value Stream Analytics gives an overview of how much time it takes to go from idea to production in your project."
-msgstr "ãƒãƒªãƒ¥ãƒ¼ã‚¹ãƒˆãƒªãƒ¼ãƒ åˆ†æžã§ã¯ã€ã‚ãªãŸã®ãƒ—ロジェクトãŒã‚¢ã‚¤ãƒ‡ã‚£ã‚¢ã®æ®µéšŽã‹ã‚‰ãƒ—ロダクション環境ã«ãƒªãƒªãƒ¼ã‚¹ã•ã‚Œã‚‹ã¾ã§ã©ã‚Œãらã„時間ãŒã‹ã‹ã£ãŸã‹ä¿¯çž°ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚"
-
-msgid "Value may contain a variable reference"
+msgid "Value might contain a variable reference"
msgstr ""
msgid "Value stream"
@@ -36676,10 +37188,10 @@ msgstr ""
msgid "ValueStream|The Default Value Stream cannot be deleted"
msgstr "デフォルトãƒãƒªãƒ¥ãƒ¼ã‚¹ãƒˆãƒªãƒ¼ãƒ ã¯å‰Šé™¤ã§ãã¾ã›ã‚“"
-msgid "Variable"
+msgid "Values that contain the %{codeStart}$%{codeEnd} character can be considered a variable reference and expanded. %{docsLinkStart}Learn more.%{docsLinkEnd}"
msgstr ""
-msgid "Variable references indicated by %{codeStart}$%{codeEnd} may be expanded. If this is not what you want, consider %{docsLinkStart}using a workaround to prevent expansion%{docsLinkEnd}."
+msgid "Variable"
msgstr ""
msgid "Variable will be masked in job logs."
@@ -37081,6 +37593,9 @@ msgstr ""
msgid "Vulnerability|Evidence"
msgstr ""
+msgid "Vulnerability|False positive detected"
+msgstr ""
+
msgid "Vulnerability|File"
msgstr "ファイル"
@@ -37123,6 +37638,9 @@ msgstr "é‡è¦åº¦"
msgid "Vulnerability|Status"
msgstr ""
+msgid "Vulnerability|The scanner determined this vulnerability to be a false positive. Verify the evaluation before changing its status. %{linkStart}Learn more about false positive detection.%{linkEnd}"
+msgstr ""
+
msgid "Vulnerability|The unmodified response is the original response that had no mutations done to the request"
msgstr ""
@@ -37447,9 +37965,6 @@ msgstr ""
msgid "Welcome to GitLab,%{br_tag}%{name}!"
msgstr ""
-msgid "Welcome to the guided GitLab tour"
-msgstr ""
-
msgid "Welcome, %{name}!"
msgstr ""
@@ -37468,9 +37983,6 @@ msgstr ""
msgid "What are you searching for?"
msgstr "何を探ã—ã¾ã™ã‹?"
-msgid "What describes you best?"
-msgstr ""
-
msgid "What does this command do?"
msgstr ""
@@ -37492,15 +38004,15 @@ msgstr ""
msgid "What is your job title? (optional)"
msgstr ""
+msgid "What templates can I create?"
+msgstr ""
+
msgid "What will you use this group for?"
msgstr ""
msgid "What's new"
msgstr "What's new"
-msgid "What’s your experience level?"
-msgstr ""
-
msgid "When a deployment job is successful, skip older deployment jobs that are still pending."
msgstr ""
@@ -37510,6 +38022,9 @@ msgstr "Runner ãŒãƒ­ãƒƒã‚¯ã•ã‚Œã¦ã„ã‚‹å ´åˆã€ä»–ã®ãƒ—ロジェクトã«å‰
msgid "When an event in GitLab triggers a webhook, you can use the request details to figure out if something went wrong."
msgstr ""
+msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+msgstr ""
+
msgid "When inactive, an external authentication provider must be used."
msgstr ""
@@ -37532,6 +38047,9 @@ msgstr ""
msgid "When:"
msgstr "日付"
+msgid "Which API requests are affected?"
+msgstr ""
+
msgid "While it's rare to have no vulnerabilities, it can happen. In any event, we ask that you please double check your settings to make sure you've set up your dashboard correctly."
msgstr "脆弱性ãŒãªã„事ã¯ç¨€ã§ã™ãŒã€èµ·ã“ã‚Šå¾—ã¾ã™ã€‚ã„ãšã‚Œã«ã—ã¦ã‚‚ã€ãƒ€ãƒƒã‚·ãƒ¥ãƒœãƒ¼ãƒ‰ãŒæ­£ã—ã設定ã•ã‚Œã¦ã„ã‚‹ã“ã¨ã‚’確èªã™ã‚‹ãŸã‚ã«ã€è¨­å®šã‚’å†ç¢ºèªã—ã¦ãã ã•ã„。"
@@ -37811,6 +38329,9 @@ msgstr "作業中(オープンã‹ã¤æœªå‰²ã‚Šå½“ã¦ï¼‰"
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|Work Items"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -37886,6 +38407,9 @@ msgstr ""
msgid "You are already a member of this %{member_source}."
msgstr ""
+msgid "You are already impersonating another user"
+msgstr ""
+
msgid "You are an admin, which means granting access to %{client_name} will allow them to interact with GitLab as an admin as well. Proceed with caution."
msgstr ""
@@ -37988,6 +38512,9 @@ msgstr "以下ã®æ‰‹é †ã«ãã£ã¦ã€ã‚ãªãŸã®ã‚³ãƒ³ãƒ”ューター上ã®æ—¢
msgid "You can also use project access tokens with Git to authenticate over HTTP(S). %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "You can always change your URL later"
+msgstr ""
+
msgid "You can always edit this later"
msgstr ""
@@ -38144,12 +38671,12 @@ msgstr "ã“ã®èª­ã¿å–り専用 GitLab インスタンスã«ã¯æ›¸ã込むã“ã
msgid "You can’t %{tag_start}edit%{tag_end} files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
+msgid "You can’t edit files directly in this project. Fork this project and submit a merge request with your changes."
+msgstr ""
+
msgid "You could not create a new trigger."
msgstr "æ–°ã—ã„トリガーを作æˆã§ãã¾ã›ã‚“ã§ã—ãŸã€‚"
-msgid "You didn't renew your subscription for %{strong}%{namespace_name}%{strong_close} so it was downgraded to the free plan."
-msgstr "ã‚ãªãŸã¯%{strong}%{namespace_name}%{strong_close}ã¸ã®ã‚µãƒ–スクリプションを更新ã—ã¾ã›ã‚“ã§ã—ãŸã€‚ãã®ãŸã‚ã€å½“サブスクリプションã¯ç„¡æ–™ãƒ—ランã«ãƒ€ã‚¦ãƒ³ã‚°ãƒ¬ãƒ¼ãƒ‰ã•ã‚Œã¾ã—ãŸã€‚"
-
msgid "You do not have any subscriptions yet"
msgstr "ã‚ãªãŸã«ã¯ã‚µãƒ–スクリプションãŒã‚ã‚Šã¾ã›ã‚“"
@@ -38315,6 +38842,12 @@ msgstr "ç¾åœ¨ã®æ­£ã—ã„パスワードを入力ã—ã¦ãã ã•ã„"
msgid "You must provide your current password in order to change it."
msgstr "パスワードを変更ã™ã‚‹ã«ã¯ã€ç¾åœ¨ã®ãƒ‘スワードを入力ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚"
+msgid "You must sign in to search for specific projects."
+msgstr ""
+
+msgid "You must sign in to search for specific terms."
+msgstr ""
+
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
@@ -38342,6 +38875,9 @@ msgstr "アクセストークンã¨ãƒ›ã‚¹ãƒˆURLã®ä¸¡æ–¹ã‚’指定ã—ãªã‘ã‚Œã°
msgid "You need to upload a GitLab project export archive (ending in .gz)."
msgstr "GitLab プロジェクトã®ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆã‚¢ãƒ¼ã‚«ã‚¤ãƒ–(.gz ã§çµ‚ã‚る)をアップロードã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚"
+msgid "You need to verify your primary email first before enabling Two-Factor Authentication."
+msgstr ""
+
msgid "You successfully declined the invitation"
msgstr ""
@@ -38450,10 +38986,10 @@ msgstr ""
msgid "Your %{host} account was signed in to from a new location"
msgstr ""
-msgid "Your %{strong}%{plan_name}%{strong_close} subscription for %{strong}%{namespace_name}%{strong_close} will expire on %{strong}%{expires_on}%{strong_close}."
+msgid "Your %{strong}%{plan_name}%{strong_close} subscription expires on %{strong}%{expires_on}%{strong_close}. After that date, you cannot create issues or merge requests, or use many other features."
msgstr ""
-msgid "Your %{strong}%{plan_name}%{strong_close} subscription will expire on %{strong}%{expires_on}%{strong_close}. After that, you will not be able to create issues or merge requests as well as many other features."
+msgid "Your %{strong}%{plan_name}%{strong_close} subscription for %{strong}%{namespace_name}%{strong_close} will expire on %{strong}%{expires_on}%{strong_close}."
msgstr ""
msgid "Your CI/CD configuration syntax is invalid. View Lint tab for more details."
@@ -38477,7 +39013,7 @@ msgstr ""
msgid "Your GPG keys (%{count})"
msgstr "GPG éµ (%{count})"
-msgid "Your GitLab account has been locked due to an excessive amount of unsuccessful sign in attempts. Your account will automatically unlock in %{duration} or you may click the link below to unlock now."
+msgid "Your GitLab account has been locked due to an excessive number of unsuccessful sign in attempts. You can wait for your account to automatically unlock in %{duration} or you can click the link below to unlock now."
msgstr ""
msgid "Your GitLab account request has been approved!"
@@ -38588,6 +39124,9 @@ msgstr "コメントã¯ç ´æ£„ã•ã‚Œã¾ã™ã€‚"
msgid "Your commit email is used for web based operations, such as edits and merges."
msgstr ""
+msgid "Your current password is required to register a two-factor authenticator app."
+msgstr ""
+
msgid "Your dashboard has been copied. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr "ダッシュボードをコピーã—ã¾ã—ãŸã€‚%{web_ide_link_start} ã“ã“ã§ç·¨é›† %{web_ide_link_end} ã§ãã¾ã™ã€‚"
@@ -38687,6 +39226,9 @@ msgstr "ã‚ãªãŸã®ãƒ—ロフィール"
msgid "Your project limit is %{limit} projects! Please contact your administrator to increase it"
msgstr "ã‚ãªãŸã®ãƒ—ロジェクト数㯠%{limit} 以下ã«åˆ¶é™ã•ã‚Œã¦ã„ã¾ã™ã€‚ã“ã®ä¸Šé™ã‚’増やã™ã«ã¯ã‚ãªãŸã®ç®¡ç†è€…ã«é€£çµ¡ã—ã¦ãã ã•ã„"
+msgid "Your project will be created at:"
+msgstr ""
+
msgid "Your projects"
msgstr "ã‚ãªãŸã®ãƒ—ロジェクト"
@@ -38726,11 +39268,9 @@ msgstr ""
msgid "Your subscription expired!"
msgstr "サブスクリプションã®æœ‰åŠ¹æœŸé™ãŒåˆ‡ã‚Œã¾ã—ãŸï¼"
-msgid "Your subscription has been downgraded."
-msgstr ""
-
-msgid "Your subscription will expire in %{remaining_days}."
-msgstr ""
+msgid "Your subscription will expire in %{remaining_days} day."
+msgid_plural "Your subscription will expire in %{remaining_days} days."
+msgstr[0] ""
msgid "Your username is %{username}."
msgstr ""
@@ -38935,6 +39475,9 @@ msgstr "ãれ自体をブロックã§ãã¾ã›ã‚“"
msgid "cannot merge"
msgstr "マージã§ãã¾ã›ã‚“"
+msgid "cannot not be used for user namespace"
+msgstr ""
+
msgid "ciReport|%{degradedNum} degraded"
msgstr ""
@@ -39257,6 +39800,9 @@ msgstr ""
msgid "created %{timeAgo}"
msgstr ""
+msgid "created %{timeAgo} by %{author}"
+msgstr ""
+
msgid "created by"
msgstr ""
@@ -39300,9 +39846,6 @@ msgstr "存在ã—ã¾ã›ã‚“"
msgid "does not have a supported extension. Only %{extension_list} are supported"
msgstr "サãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ã‚‹æ‹¡å¼µå­ã§ã¯ã‚ã‚Šã¾ã›ã‚“。 %{extension_list} ã®æ‹¡å¼µå­ã ã‘ãŒã‚µãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ã¾ã™"
-msgid "domain is not authorized for sign-up."
-msgstr ""
-
msgid "download it"
msgstr "ダウンロードã™ã‚‹"
@@ -39319,17 +39862,13 @@ msgstr "è¦ç´ ã¯éšŽå±¤ã§ã¯ã‚ã‚Šã¾ã›ã‚“"
msgid "email '%{email}' is not a verified email."
msgstr "メール '%{email}'ã¯æ¤œè¨¼æ¸ˆã¿ã®ãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹ã§ã¯ã‚ã‚Šã¾ã›ã‚“。"
-msgid "email does not match the allowed domain of %{email_domains}"
-msgid_plural "email does not match the allowed domains: %{email_domains}"
-msgstr[0] ""
-
msgid "enabled"
msgstr "有効"
msgid "encrypted: needs to be a :required, :optional or :migrating!"
msgstr "encrypted: 㯠:required, :optional, :migratingã®ã„ãšã‚Œã‹ã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。"
-msgid "ending with MIME type format is not allowed."
+msgid "ending with a reserved file extension is not allowed."
msgstr ""
msgid "entries cannot be larger than 255 characters"
@@ -39353,6 +39892,9 @@ msgstr "エラー"
msgid "estimateCommand|%{slash_command} overwrites the total estimated time."
msgstr ""
+msgid "example.com"
+msgstr ""
+
msgid "exceeds the limit of %{bytes} bytes"
msgstr "ãƒã‚¤ãƒˆæ•°ã®åˆ¶é™ (%{bytes}) を超ãˆã¦ã„ã¾ã™"
@@ -39402,9 +39944,6 @@ msgstr "ã“ã®ãƒ—ロジェクトã§ã¯"
msgid "fork"
msgstr ""
-msgid "fork this project"
-msgstr "ã“ã®ãƒ—ロジェクトをフォーク"
-
msgid "from"
msgstr "from"
@@ -39412,6 +39951,9 @@ msgid "from %d job"
msgid_plural "from %d jobs"
msgstr[0] ""
+msgid "frontmatter"
+msgstr ""
+
msgid "group"
msgstr "グループ"
@@ -39439,6 +39981,9 @@ msgstr ""
msgid "has been completed."
msgstr ""
+msgid "has too deep level of nesting"
+msgstr ""
+
msgid "help"
msgstr "ヘルプ"
@@ -39472,9 +40017,21 @@ msgstr "フローをインãƒãƒ¼ãƒˆ"
msgid "in"
msgstr ""
+msgid "in Infrastructure :: Kubernetes clusters"
+msgstr ""
+
+msgid "in all GitLab"
+msgstr ""
+
+msgid "in group"
+msgstr ""
+
msgid "in group %{link_to_group}"
msgstr ""
+msgid "in project"
+msgstr ""
+
msgid "in project %{link_to_project}"
msgstr "プロジェクト %{link_to_project}"
@@ -39515,18 +40072,21 @@ msgstr "ã¯ãƒ†ãƒ³ãƒ—レートを利用ã§ãるグループã«æ‰€å±žã—ã¦ã„ã¾
msgid "is not a valid X509 certificate."
msgstr "ã¯æœ‰åŠ¹ãª X509 証明書ã§ã¯ã‚ã‚Šã¾ã›ã‚“。"
-msgid "is not allowed since the group is not top-level group."
+msgid "is not allowed for sign-up."
msgstr ""
-msgid "is not allowed. Try again with a different email address, or contact your GitLab admin."
-msgstr "ã¯è¨±å¯ã•ã‚Œã¦ã„ã¾ã›ã‚“。別ã®ãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹ã§ã‚‚ã†ä¸€åº¦è©¦ã™ã‹ã€GitLab管ç†è€…ã«é€£çµ¡ã—ã¦ãã ã•ã„。"
+msgid "is not allowed for this group."
+msgstr ""
-msgid "is not allowed. We do not currently support project-level iterations"
-msgstr "ã¯è¨±å¯ã•ã‚Œã¦ã„ã¾ã›ã‚“。ç¾åœ¨ã€ãƒ—ロジェクトレベルã®ã‚¤ãƒ†ãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ã¯ã‚µãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ã¾ã›ã‚“。"
+msgid "is not allowed for this project."
+msgstr ""
-msgid "is not from an allowed domain."
+msgid "is not allowed since the group is not top-level group."
msgstr ""
+msgid "is not allowed. We do not currently support project-level iterations"
+msgstr "ã¯è¨±å¯ã•ã‚Œã¦ã„ã¾ã›ã‚“。ç¾åœ¨ã€ãƒ—ロジェクトレベルã®ã‚¤ãƒ†ãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ã¯ã‚µãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ã¾ã›ã‚“。"
+
msgid "is not in the group enforcing Group Managed Account"
msgstr ""
@@ -39617,6 +40177,9 @@ msgstr "%{path_lock_user_name} ã«ã‚ˆã£ã¦ %{created_at} ã«ãƒ­ãƒƒã‚¯ã•ã‚Œã¦ã
msgid "log in"
msgstr "ログイン"
+msgid "managed"
+msgstr ""
+
msgid "manual"
msgstr "マニュアル"
@@ -39663,6 +40226,9 @@ msgstr ""
msgid "mrWidget| Please restore it or use a different %{missingBranchName} branch"
msgstr "ブランãƒã‚’復元ã™ã‚‹ã‹ã€åˆ¥ã® %{missingBranchName} ブランãƒã‚’使用ã—ã¦ãã ã•ã„"
+msgid "mrWidget|%{linkStart}Set up now%{linkEnd} to analyze your source code for known security vulnerabilities."
+msgstr ""
+
msgid "mrWidget|%{mergeError}."
msgstr ""
@@ -39742,6 +40308,9 @@ msgid "mrWidget|Closes issue"
msgid_plural "mrWidget|Closes issues"
msgstr[0] ""
+msgid "mrWidget|Create issue to resolve all threads"
+msgstr ""
+
msgid "mrWidget|Delete source branch"
msgstr "ソースブランãƒã‚’削除"
@@ -39751,12 +40320,18 @@ msgstr "デプロイ統計ã¯ç¾åœ¨åˆ©ç”¨ã§ãã¾ã›ã‚“"
msgid "mrWidget|Did not close"
msgstr "クローズã—ãªã‹ã£ãŸ"
+msgid "mrWidget|Dismiss"
+msgstr ""
+
msgid "mrWidget|Email patches"
msgstr "メールパッãƒ"
msgid "mrWidget|Failed to load deployment statistics"
msgstr "デプロイ統計ã®ãƒ­ãƒ¼ãƒ‰ã«å¤±æ•—ã—ã¾ã—ãŸ"
+msgid "mrWidget|Hide %{widget} details"
+msgstr ""
+
msgid "mrWidget|If the %{missingBranchName} branch exists in your local repository, you can merge this merge request manually using the command line"
msgstr "%{missingBranchName} ブランãƒãŒãƒ­ãƒ¼ã‚«ãƒ«ãƒªãƒã‚¸ãƒˆãƒªã«å­˜åœ¨ã™ã‚‹å ´åˆã¯ã€ã‚³ãƒžãƒ³ãƒ‰ãƒ©ã‚¤ãƒ³ã‚’使用ã—ã¦ã“ã®ãƒžãƒ¼ã‚¸ãƒªã‚¯ã‚¨ã‚¹ãƒˆã‚’手動ã§ãƒžãƒ¼ã‚¸ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚"
@@ -39851,9 +40426,6 @@ msgstr "マージトレインã‹ã‚‰å‰Šé™¤"
msgid "mrWidget|Request to merge"
msgstr "マージをリクエスト"
-msgid "mrWidget|Resolve all threads in new issue"
-msgstr ""
-
msgid "mrWidget|Resolve conflicts"
msgstr "競åˆã‚’解決ã™ã‚‹"
@@ -39869,6 +40441,9 @@ msgstr "æ–°ã—ã„マージリクエストã§ã“ã®ãƒžãƒ¼ã‚¸ãƒªã‚¯ã‚¨ã‚¹ãƒˆã‚’リ
msgid "mrWidget|Revoke approval"
msgstr "承èªã‚’å–り消ã™"
+msgid "mrWidget|SAST and Secret Detection is not enabled."
+msgstr ""
+
msgid "mrWidget|Set by %{merge_author} to be added to the merge train when the pipeline succeeds"
msgstr ""
@@ -39878,6 +40453,9 @@ msgstr ""
msgid "mrWidget|Set by %{merge_author} to start a merge train when the pipeline succeeds"
msgstr ""
+msgid "mrWidget|Show %{widget} details"
+msgstr ""
+
msgid "mrWidget|The changes were merged into"
msgstr "ã“ã®å¤‰æ›´ã¯æ¬¡ã®ãƒ–ランãƒã«ãƒžãƒ¼ã‚¸ã•ã‚Œã¾ã—ãŸ"
@@ -39890,6 +40468,9 @@ msgstr "ã“ã®å¤‰æ›´ã¯æ¬¡ã®ãƒ–ランãƒã«ãƒžãƒ¼ã‚¸ã•ã‚Œã¾ã™"
msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure, or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
msgstr ""
+msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure."
+msgstr ""
+
msgid "mrWidget|The source branch has been deleted"
msgstr "ã“ã®ã‚½ãƒ¼ã‚¹ãƒ–ランãƒã¯å‰Šé™¤ã•ã‚Œã¾ã—ãŸ"
@@ -39932,6 +40513,9 @@ msgstr ""
msgid "mrWidget|You can merge after removing denied licenses"
msgstr ""
+msgid "mrWidget|You can only merge once this merge request is approved."
+msgstr ""
+
msgid "mrWidget|Your password"
msgstr "パスワード"
@@ -39968,6 +40552,9 @@ msgstr ""
msgid "must be less than the limit of %{tag_limit} tags"
msgstr ""
+msgid "must be set for a project namespace"
+msgstr ""
+
msgid "must be unique by status and elapsed time within a policy"
msgstr ""
@@ -40075,6 +40662,9 @@ msgstr ""
msgid "pipeline"
msgstr "パイプライン"
+msgid "pipeline schedules documentation"
+msgstr ""
+
msgid "pod_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
msgstr ""
@@ -40122,16 +40712,25 @@ msgstr ""
msgid "project name"
msgstr ""
+msgid "project namespace cannot be the parent of another namespace"
+msgstr ""
+
msgid "projects"
msgstr "プロジェクト"
msgid "quick actions"
msgstr "クイックアクション"
-msgid "reCAPTCHA Private Key"
+msgid "reCAPTCHA"
+msgstr ""
+
+msgid "reCAPTCHA helps prevent credential stuffing."
msgstr ""
-msgid "reCAPTCHA Site Key"
+msgid "reCAPTCHA private key"
+msgstr ""
+
+msgid "reCAPTCHA site key"
msgstr ""
msgid "recent activity"
@@ -40357,6 +40956,9 @@ msgstr ""
msgid "user avatar"
msgstr "ユーザーã®ã‚¢ãƒã‚¿ãƒ¼"
+msgid "user namespace cannot be the parent of another namespace"
+msgstr ""
+
msgid "user preferences"
msgstr ""
@@ -40448,3 +41050,9 @@ msgstr "yaml ãŒç„¡åŠ¹ã§ã™"
msgid "your settings"
msgstr ""
+msgid "{group}"
+msgstr ""
+
+msgid "{project}"
+msgstr ""
+
diff --git a/locale/ka_GE/gitlab.po b/locale/ka_GE/gitlab.po
index fab50f97d7c..9a175d2ea23 100644
--- a/locale/ka_GE/gitlab.po
+++ b/locale/ka_GE/gitlab.po
@@ -14,10 +14,7 @@ msgstr ""
"X-Crowdin-Language: ka\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-09-01 22:32\n"
-
-msgid " %{name}, confirm your email address now! "
-msgstr ""
+"PO-Revision-Date: 2021-10-04 20:20\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -92,6 +89,16 @@ msgstr ""
msgid "#general, #development"
msgstr ""
+msgid "%d Alert"
+msgid_plural "%d Alerts"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d Alert:"
+msgid_plural "%d Alerts:"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d Approval"
msgid_plural "%d Approvals"
msgstr[0] ""
@@ -455,7 +462,10 @@ msgstr ""
msgid "%{code_open}Protected:%{code_close} Only exposed to protected branches or tags."
msgstr ""
-msgid "%{commit_author_link} authored %{commit_timeago}"
+msgid "%{commit_author_link} authored %{commit_authored_timeago}"
+msgstr ""
+
+msgid "%{commit_author_link} authored %{commit_authored_timeago} and %{commit_committer_avatar} %{commit_committer_link} committed %{commit_committer_timeago}"
msgstr ""
msgid "%{completedCount} completed weight"
@@ -549,6 +559,15 @@ msgstr ""
msgid "%{doc_link_start}Advanced search%{doc_link_end} is enabled."
msgstr ""
+msgid "%{docs_link_start}Learn about visibility levels.%{docs_link_end}"
+msgstr ""
+
+msgid "%{docs_link_start}What is Large File Storage?%{docs_link_end}"
+msgstr ""
+
+msgid "%{docs_link_start}What is two-factor authentication?%{docs_link_end}"
+msgstr ""
+
msgid "%{due_date} (Past due)"
msgstr ""
@@ -621,9 +640,6 @@ msgstr ""
msgid "%{issueType} actions"
msgstr ""
-msgid "%{issuesCount} issues with a limit of %{maxIssueCount}"
-msgstr ""
-
msgid "%{issuesSize} with a limit of %{maxIssueCount}"
msgstr ""
@@ -681,6 +697,12 @@ msgstr ""
msgid "%{label_for_message} unavailable"
msgstr ""
+msgid "%{learn_more_link}."
+msgstr ""
+
+msgid "%{lessThan} 1 hour"
+msgstr ""
+
msgid "%{lets_encrypt_link_start}Let's Encrypt%{lets_encrypt_link_end} is a free, automated, and open certificate authority (CA) that issues digital certificates to enable HTTPS (SSL/TLS) for sites."
msgstr ""
@@ -693,15 +715,15 @@ msgstr ""
msgid "%{link_start}Learn more%{link_end} about roles."
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
-msgstr ""
-
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
msgstr ""
msgid "%{link_start}Start the title with %{draft_snippet}%{link_end} to prevent a merge request that is a work in progress from being merged before it's ready."
msgstr ""
+msgid "%{link_start}What information does GitLab Inc. collect?%{link_end}"
+msgstr ""
+
msgid "%{listToShow}, and %{awardsListLength} more"
msgstr ""
@@ -854,7 +876,7 @@ msgid_plural "%{securityScanner} results are not available because a pipeline ha
msgstr[0] ""
msgstr[1] ""
-msgid "%{service_ping_link_start}Learn more%{service_ping_link_end} about what information is shared with GitLab Inc."
+msgid "%{service_ping_link_start}What information is shared with GitLab Inc.?%{service_ping_link_end}"
msgstr ""
msgid "%{size} %{unit}"
@@ -890,6 +912,9 @@ msgstr ""
msgid "%{state} epics"
msgstr ""
+msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
+msgstr ""
+
msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
msgstr ""
@@ -949,11 +974,6 @@ msgstr ""
msgid "%{template_project_id} is unknown or invalid"
msgstr ""
-msgid "%{text} %{files}"
-msgid_plural "%{text} %{files} files"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%{text} is available"
msgstr ""
@@ -1038,9 +1058,6 @@ msgstr ""
msgid "%{wildcards_link_start}Wildcards%{wildcards_link_end} such as %{code_tag_start}v*%{code_tag_end} or %{code_tag_start}*-release%{code_tag_end} are supported."
msgstr ""
-msgid "&lt; 1 hour"
-msgstr ""
-
msgid "'%{data}' at %{location} does not match format: %{format}"
msgstr ""
@@ -1124,9 +1141,6 @@ msgstr ""
msgid "(we need your current password to confirm your changes)"
msgstr ""
-msgid "* * * * *"
-msgstr ""
-
msgid "+ %{amount} more"
msgstr ""
@@ -1193,10 +1207,10 @@ msgstr ""
msgid "."
msgstr ""
-msgid "0 bytes"
+msgid "/"
msgstr ""
-msgid "0 for unlimited, only effective with remote storage enabled."
+msgid "0 bytes"
msgstr ""
msgid "0t1DgySidms"
@@ -1326,6 +1340,9 @@ msgstr ""
msgid "1000+"
msgstr ""
+msgid "192.168.0.0/24"
+msgstr ""
+
msgid "1st contribution!"
msgstr ""
@@ -1479,9 +1496,6 @@ msgstr ""
msgid "A plain HTML site that uses Netlify for CI/CD instead of GitLab, but still with all the other great GitLab features"
msgstr ""
-msgid "A plain-text response to show to clients that hit the rate limit."
-msgstr ""
-
msgid "A platform value can be web, mob or app."
msgstr ""
@@ -1563,7 +1577,7 @@ msgstr ""
msgid "APIFuzzing|Configure HTTP basic authentication values. Other authentication methods are supported. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
+msgid "APIFuzzing|Customize your project's API fuzzing configuration options and copy the code snippet to your .gitlab-ci.yml file to apply any changes. Note that this tool does not reflect or update your .gitlab-ci.yml file automatically. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
msgstr ""
msgid "APIFuzzing|Enable authentication"
@@ -1626,9 +1640,6 @@ msgstr ""
msgid "APIFuzzing|To prevent a security leak, authentication info must be added as a %{ciVariablesLinkStart}CI variable%{ciVariablesLinkEnd}. As a user with maintainer access rights, you can manage CI variables in the %{ciSettingsLinkStart}Settings%{ciSettingsLinkEnd} area."
msgstr ""
-msgid "APIFuzzing|Use this tool to generate API fuzzing configuration YAML to copy into your .gitlab-ci.yml file. This tool does not reflect or update your .gitlab-ci.yml file automatically."
-msgstr ""
-
msgid "APIFuzzing|Username for basic authentication"
msgstr ""
@@ -1680,9 +1691,6 @@ msgstr ""
msgid "Abuse reports notification email"
msgstr ""
-msgid "Abuse reports will be sent to this address if it is set. Abuse reports are always available in the admin area."
-msgstr ""
-
msgid "Accept invitation"
msgstr ""
@@ -1719,12 +1727,18 @@ msgstr ""
msgid "Access granted"
msgstr ""
+msgid "Access key ID"
+msgstr ""
+
msgid "Access requests"
msgstr ""
msgid "Access to '%{classification_label}' not allowed"
msgstr ""
+msgid "Access tokens expire after 2 hours. A refresh token may be used at any time to generate a new access token. Non-expiring access tokens are deprecated. Clear this setting to enable backward compatibility."
+msgstr ""
+
msgid "AccessDropdown|Deploy Keys"
msgstr ""
@@ -2037,6 +2051,9 @@ msgstr ""
msgid "Add new directory"
msgstr ""
+msgid "Add new service account"
+msgstr ""
+
msgid "Add or remove previously merged commits"
msgstr ""
@@ -2274,6 +2291,9 @@ msgstr ""
msgid "AdminArea|Features"
msgstr ""
+msgid "AdminArea|Get security updates from GitLab and stay up to date"
+msgstr ""
+
msgid "AdminArea|Groups"
msgstr ""
@@ -2313,6 +2333,12 @@ msgstr ""
msgid "AdminArea|Reporter"
msgstr ""
+msgid "AdminArea|Sign up for the GitLab Security Newsletter to get notified for security updates."
+msgstr ""
+
+msgid "AdminArea|Sign up for the GitLab newsletter"
+msgstr ""
+
msgid "AdminArea|Stop all jobs"
msgstr ""
@@ -2382,9 +2408,15 @@ msgstr ""
msgid "AdminSettings|Disable public access to Pages sites"
msgstr ""
+msgid "AdminSettings|Display a banner on merge requests in projects with no pipelines to initiate steps to add a .gitlab-ci.yml file."
+msgstr ""
+
msgid "AdminSettings|Domain verification is an essential security measure for public GitLab sites. Users are required to demonstrate they control a domain before it is enabled. %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "AdminSettings|Enable pipeline suggestion banner"
+msgstr ""
+
msgid "AdminSettings|Enable shared runners for new projects"
msgstr ""
@@ -2856,10 +2888,10 @@ msgstr ""
msgid "Admin|Quarterly reconciliation will occur on %{qrtlyDate}"
msgstr ""
-msgid "Admin|The number of max seats used for your namespace is currently exceeding the number of seats in your subscription. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgid "Admin|The number of max seats in your namespace exceeds the number of seats in your subscription. On %{qrtlyDate}, quarterly reconciliation occurs and you are automatically billed a prorated amount for the overage. No action is needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice. For more information about the timing of the invoicing process, view the documentation."
msgstr ""
-msgid "Admin|The number of maximum users for your instance is currently exceeding the number of users in license. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgid "Admin|The number of max users in your instance exceeds the number of users in your license. On %{qrtlyDate}, quarterly reconciliation occurs and you are automatically billed a prorated amount for the overage. No action is needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice. For more information about the timing of the invoicing process, view the documentation."
msgstr ""
msgid "Admin|View pending user approvals"
@@ -2880,9 +2912,6 @@ msgstr ""
msgid "Advanced export options"
msgstr ""
-msgid "Advanced permissions, Large File Storage and Two-Factor authentication settings."
-msgstr ""
-
msgid "After a successful password update you will be redirected to login screen."
msgstr ""
@@ -2901,13 +2930,14 @@ msgstr ""
msgid "After you've reviewed these contribution guidelines, you'll be all set to"
msgstr ""
+msgid "Akismet"
+msgstr ""
+
msgid "Akismet API Key"
msgstr ""
-msgid "Alert"
-msgid_plural "Alerts"
-msgstr[0] ""
-msgstr[1] ""
+msgid "Akismet helps prevent the creation of spam issues in public projects."
+msgstr ""
msgid "AlertManagement|Acknowledged"
msgstr ""
@@ -3263,6 +3293,9 @@ msgstr ""
msgid "All (default)"
msgstr ""
+msgid "All GitLab"
+msgstr ""
+
msgid "All Members"
msgstr ""
@@ -3377,6 +3410,9 @@ msgstr ""
msgid "Allow this secondary node to replicate content on Object Storage"
msgstr ""
+msgid "Allow use of licensed EE features"
+msgstr ""
+
msgid "Allow users to dismiss the broadcast message"
msgstr ""
@@ -3452,9 +3488,6 @@ msgstr ""
msgid "Amazon authentication is not %{link_start}correctly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
-msgid "Amount of time (in hours) that users are allowed to skip forced configuration of two-factor authentication"
-msgstr ""
-
msgid "An %{link_start}alert%{link_end} with the same fingerprint is already open. To change the status of this alert, resolve the linked alert."
msgstr ""
@@ -3515,12 +3548,6 @@ msgstr ""
msgid "An error occurred when removing the label."
msgstr ""
-msgid "An error occurred when toggling the notification subscription"
-msgstr ""
-
-msgid "An error occurred when updating the issue weight"
-msgstr ""
-
msgid "An error occurred when updating the title"
msgstr ""
@@ -3569,6 +3596,9 @@ msgstr ""
msgid "An error occurred while enabling Service Desk."
msgstr ""
+msgid "An error occurred while fetching Markdown preview"
+msgstr ""
+
msgid "An error occurred while fetching ancestors"
msgstr ""
@@ -3599,9 +3629,6 @@ msgstr ""
msgid "An error occurred while fetching label colors."
msgstr ""
-msgid "An error occurred while fetching markdown preview"
-msgstr ""
-
msgid "An error occurred while fetching participants"
msgstr ""
@@ -3617,9 +3644,6 @@ msgstr ""
msgid "An error occurred while fetching reference"
msgstr ""
-msgid "An error occurred while fetching sidebar data"
-msgstr ""
-
msgid "An error occurred while fetching tags. Retry the search."
msgstr ""
@@ -3695,6 +3719,9 @@ msgstr ""
msgid "An error occurred while loading merge requests."
msgstr ""
+msgid "An error occurred while loading projects."
+msgstr ""
+
msgid "An error occurred while loading the Needs tab."
msgstr ""
@@ -3929,12 +3956,6 @@ msgstr ""
msgid "Any Milestone"
msgstr ""
-msgid "Any branch"
-msgstr ""
-
-msgid "Any eligible user"
-msgstr ""
-
msgid "Any encrypted tokens"
msgstr ""
@@ -3953,6 +3974,9 @@ msgstr ""
msgid "Any namespace"
msgstr ""
+msgid "App Engine description and apps that are suitable for this deployment target"
+msgstr ""
+
msgid "App ID"
msgstr ""
@@ -4101,6 +4125,11 @@ msgstr ""
msgid "Apply"
msgstr ""
+msgid "Apply %d suggestion"
+msgid_plural "Apply %d suggestions"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Apply a label"
msgstr ""
@@ -4110,13 +4139,10 @@ msgstr ""
msgid "Apply suggestion"
msgstr ""
-msgid "Apply suggestions"
-msgstr ""
-
msgid "Apply template"
msgstr ""
-msgid "Apply this approval rule to any branch or a specific protected branch."
+msgid "Apply this approval rule to all branches or a specific protected branch."
msgstr ""
msgid "Applying"
@@ -4259,9 +4285,6 @@ msgstr ""
msgid "ApprovalSettings|Prevent editing approval rules in projects and merge requests."
msgstr ""
-msgid "ApprovalSettings|Prevent editing approval rules in projects and merge requests. "
-msgstr ""
-
msgid "ApprovalSettings|Remove all approvals when commits are added to the source branch."
msgstr ""
@@ -4277,6 +4300,9 @@ msgstr ""
msgid "ApprovalSettings|This setting is configured at the instance level and can only be changed by an administrator."
msgstr ""
+msgid "ApprovalSettings|This setting is configured in %{groupName} and can only be changed by an administrator or group owner."
+msgstr ""
+
msgid "ApprovalStatusTooltip|Adheres to separation of duties"
msgstr ""
@@ -4763,9 +4789,6 @@ msgstr ""
msgid "Authenticated API rate limit period in seconds"
msgstr ""
-msgid "Authenticated API request rate limit"
-msgstr ""
-
msgid "Authenticated API requests"
msgstr ""
@@ -4775,10 +4798,10 @@ msgstr ""
msgid "Authenticated Git LFS request rate limit"
msgstr ""
-msgid "Authenticated web rate limit period in seconds"
+msgid "Authenticated Git LFS requests"
msgstr ""
-msgid "Authenticated web request rate limit"
+msgid "Authenticated web rate limit period in seconds"
msgstr ""
msgid "Authenticated web requests"
@@ -5156,9 +5179,6 @@ msgstr ""
msgid "Below you will find all the groups that are public."
msgstr ""
-msgid "Beta"
-msgstr ""
-
msgid "Bi-weekly code coverage"
msgstr ""
@@ -5398,6 +5418,21 @@ msgstr ""
msgid "Board scope affects which issues are displayed for anyone who visits this board"
msgstr ""
+msgid "BoardNewEpic|Groups"
+msgstr ""
+
+msgid "BoardNewEpic|Loading groups"
+msgstr ""
+
+msgid "BoardNewEpic|No matching results"
+msgstr ""
+
+msgid "BoardNewEpic|Search groups"
+msgstr ""
+
+msgid "BoardNewEpic|Select a group"
+msgstr ""
+
msgid "BoardNewIssue|No matching results"
msgstr ""
@@ -5475,6 +5510,9 @@ msgstr ""
msgid "Boards|An error occurred while creating the list. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching child groups. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching group projects. Please try again."
msgstr ""
@@ -5807,6 +5845,9 @@ msgstr ""
msgid "Bulk update"
msgstr ""
+msgid "BulkImports|Re-import creates a new group. It does not sync with the existing group."
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -5816,6 +5857,9 @@ msgstr ""
msgid "BulkImport|From source group"
msgstr ""
+msgid "BulkImport|Group import history"
+msgstr ""
+
msgid "BulkImport|Import failed: Destination cannot be a subgroup of the source group. Change the destination and try again."
msgstr ""
@@ -5828,9 +5872,18 @@ msgstr ""
msgid "BulkImport|Importing the group failed"
msgstr ""
+msgid "BulkImport|Last imported to %{link}"
+msgstr ""
+
msgid "BulkImport|Name already exists."
msgstr ""
+msgid "BulkImport|New group"
+msgstr ""
+
+msgid "BulkImport|No history is available"
+msgstr ""
+
msgid "BulkImport|No parent"
msgstr ""
@@ -5843,6 +5896,9 @@ msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} matching filter \"%{filter}\" from %{link}"
msgstr ""
+msgid "BulkImport|Source group"
+msgstr ""
+
msgid "BulkImport|To new group"
msgstr ""
@@ -5852,6 +5908,9 @@ msgstr ""
msgid "BulkImport|You have no groups to import"
msgstr ""
+msgid "BulkImport|Your imported groups will appear here."
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -6094,6 +6153,9 @@ msgstr ""
msgid "Can be manually deployed to"
msgstr ""
+msgid "Can be overridden in each project."
+msgstr ""
+
msgid "Can create groups:"
msgstr ""
@@ -6196,6 +6258,9 @@ msgstr ""
msgid "Cancelling Preview"
msgstr ""
+msgid "Cannot assign a confidential epic to a non-confidential issue. Make the issue confidential and try again"
+msgstr ""
+
msgid "Cannot be assigned to other projects."
msgstr ""
@@ -6247,9 +6312,6 @@ msgstr ""
msgid "Cannot refer to a group %{timebox_type} by an internal id!"
msgstr ""
-msgid "Cannot set confidential epic for a non-confidential issue"
-msgstr ""
-
msgid "Cannot show preview. For previews on sketch files, they must have the file format introduced by Sketch version 43 and above."
msgstr ""
@@ -6487,15 +6549,15 @@ msgstr ""
msgid "Check out, review, and merge locally"
msgstr ""
-msgid "Check the %{docs_link_start}documentation%{docs_link_end}."
-msgstr ""
-
msgid "Check the current instance configuration "
msgstr ""
msgid "Check the elasticsearch.log file to debug why the migration was halted and make any changes before retrying the migration. When you fix the cause of the failure, click \"Retry migration\", and the migration will be scheduled to be retried in the background."
msgstr ""
+msgid "Check with your administrator."
+msgstr ""
+
msgid "Check your Docker images for known vulnerabilities."
msgstr ""
@@ -6526,6 +6588,9 @@ msgstr ""
msgid "Checkout"
msgstr ""
+msgid "Checkout|$%{selectedPlanPrice} per 10 GB storage per pack"
+msgstr ""
+
msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 minutes"
msgstr ""
@@ -6546,17 +6611,23 @@ msgstr ""
msgid "Checkout|%{name}'s GitLab subscription"
msgstr ""
-msgid "Checkout|%{selectedPlanText} plan"
+msgid "Checkout|%{name}'s storage subscription"
msgstr ""
-msgid "Checkout|%{startDate} - %{endDate}"
+msgid "Checkout|%{quantity} GB of storage"
msgstr ""
-msgid "Checkout|%{totalCiMinutes} CI minute"
-msgid_plural "Checkout|%{totalCiMinutes} CI minutes"
+msgid "Checkout|%{quantity} storage pack"
+msgid_plural "Checkout|%{quantity} storage packs"
msgstr[0] ""
msgstr[1] ""
+msgid "Checkout|%{selectedPlanText} plan"
+msgstr ""
+
+msgid "Checkout|%{startDate} - %{endDate}"
+msgstr ""
+
msgid "Checkout|%{totalCiMinutes} CI minutes"
msgstr ""
@@ -6632,6 +6703,9 @@ msgstr ""
msgid "Checkout|Failed to register credit card. Please try again."
msgstr ""
+msgid "Checkout|GB"
+msgstr ""
+
msgid "Checkout|GitLab group"
msgstr ""
@@ -6668,6 +6742,9 @@ msgstr ""
msgid "Checkout|State"
msgstr ""
+msgid "Checkout|Storage packs"
+msgstr ""
+
msgid "Checkout|Street address"
msgstr ""
@@ -6689,6 +6766,9 @@ msgstr ""
msgid "Checkout|Total minutes: %{quantity}"
msgstr ""
+msgid "Checkout|Total storage: %{quantity} GB"
+msgstr ""
+
msgid "Checkout|Users"
msgstr ""
@@ -6698,16 +6778,25 @@ msgstr ""
msgid "Checkout|Your organization"
msgstr ""
+msgid "Checkout|Your storage subscription has the same term as your main subscription, and the price is prorated accordingly."
+msgstr ""
+
msgid "Checkout|Your subscription will be applied to this group"
msgstr ""
msgid "Checkout|Zip code"
msgstr ""
+msgid "Checkout|a storage subscription"
+msgstr ""
+
msgid "Checkout|company or team"
msgstr ""
-msgid "Checkout|x 1,000 minutes per pack = %{strong}"
+msgid "Checkout|minutes"
+msgstr ""
+
+msgid "Checkout|x %{quantity} %{units} per pack ="
msgstr ""
msgid "Cherry-pick this commit"
@@ -7064,6 +7153,9 @@ msgstr ""
msgid "CloneIssue|Cannot clone issue to target project as it is pending deletion."
msgstr ""
+msgid "CloneIssue|Cannot clone issues of '%{issue_type}' type."
+msgstr ""
+
msgid "Cloned this issue to %{path_to_project}."
msgstr ""
@@ -7118,7 +7210,10 @@ msgstr ""
msgid "Closes this %{quick_action_target}."
msgstr ""
-msgid "Cloud licenses can not be removed."
+msgid "Cloud Functions description and apps that are suitable for this deployment target"
+msgstr ""
+
+msgid "Cloud Run description and apps that are suitable for this deployment target"
msgstr ""
msgid "Cluster"
@@ -7145,6 +7240,12 @@ msgstr ""
msgid "ClusterAgents|Access tokens"
msgstr ""
+msgid "ClusterAgents|Agent might not be connected to GitLab"
+msgstr ""
+
+msgid "ClusterAgents|Agent never connected to GitLab"
+msgstr ""
+
msgid "ClusterAgents|Alternative installation methods"
msgstr ""
@@ -7160,6 +7261,12 @@ msgstr ""
msgid "ClusterAgents|Configuration"
msgstr ""
+msgid "ClusterAgents|Connected"
+msgstr ""
+
+msgid "ClusterAgents|Connection status"
+msgstr ""
+
msgid "ClusterAgents|Copy token"
msgstr ""
@@ -7178,6 +7285,9 @@ msgstr ""
msgid "ClusterAgents|For alternative installation methods %{linkStart}go to the documentation%{linkEnd}."
msgstr ""
+msgid "ClusterAgents|For more troubleshooting information go to"
+msgstr ""
+
msgid "ClusterAgents|Go to the repository"
msgstr ""
@@ -7193,18 +7303,30 @@ msgstr ""
msgid "ClusterAgents|Integrate with the GitLab Agent"
msgstr ""
-msgid "ClusterAgents|Last used"
+msgid "ClusterAgents|Last connected %{timeAgo}."
+msgstr ""
+
+msgid "ClusterAgents|Last contact"
msgstr ""
msgid "ClusterAgents|Learn how to create an agent access token"
msgstr ""
+msgid "ClusterAgents|Make sure you are using a valid token."
+msgstr ""
+
msgid "ClusterAgents|Name"
msgstr ""
msgid "ClusterAgents|Never"
msgstr ""
+msgid "ClusterAgents|Never connected"
+msgstr ""
+
+msgid "ClusterAgents|Not connected"
+msgstr ""
+
msgid "ClusterAgents|Read more about getting started"
msgstr ""
@@ -7226,6 +7348,9 @@ msgstr ""
msgid "ClusterAgents|Select which Agent you want to install"
msgstr ""
+msgid "ClusterAgents|The Agent has not been connected in a long time. There might be a connectivity issue. Last contact was %{timeAgo}."
+msgstr ""
+
msgid "ClusterAgents|The GitLab Agent also requires %{linkStart}enabling the Agent Server%{linkEnd}"
msgstr ""
@@ -7253,9 +7378,6 @@ msgstr ""
msgid "ClusterAgents|You will need to create a token to connect to your agent"
msgstr ""
-msgid "ClusterAgent|This feature is only available for premium plans"
-msgstr ""
-
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -7445,9 +7567,6 @@ msgstr ""
msgid "ClusterIntegration|Create Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Create a provision role on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the account and external ID above. %{startMoreInfoLink}More information%{endLink}"
-msgstr ""
-
msgid "ClusterIntegration|Create cluster on"
msgstr ""
@@ -7880,7 +7999,7 @@ msgstr ""
msgid "ClusterIntegration|Subnets"
msgstr ""
-msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provisioned role, first create one on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the above account and external IDs. %{startMoreInfoLink}More information%{endLink}"
+msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provisioned role, first create one on %{awsLinkStart}Amazon Web Services %{awsLinkEnd} using the above account and external IDs. %{moreInfoStart}More information%{moreInfoEnd}"
msgstr ""
msgid "ClusterIntegration|The Kubernetes certificate used to authenticate to the cluster."
@@ -8114,6 +8233,9 @@ msgstr ""
msgid "Collapse replies"
msgstr ""
+msgid "Collapse settings section"
+msgstr ""
+
msgid "Collapse sidebar"
msgstr ""
@@ -8132,6 +8254,9 @@ msgstr ""
msgid "Comma-separated list of email addresses."
msgstr ""
+msgid "Comma-separated list of users allowed to exceed the rate limit."
+msgstr ""
+
msgid "Comma-separated, e.g. '1.1.1.1, 2.2.2.0/24'"
msgstr ""
@@ -8452,6 +8577,9 @@ msgstr ""
msgid "Configure %{repository_checks_link_start}repository checks%{link_end} and %{housekeeping_link_start}housekeeping%{link_end} on repositories."
msgstr ""
+msgid "Configure CAPTCHAs, IP address limits, and other anti-spam measures."
+msgstr ""
+
msgid "Configure Dependency Scanning in `.gitlab-ci.yml` using the GitLab managed template. You can [add variable overrides](https://docs.gitlab.com/ee/user/application_security/dependency_scanning/#customizing-the-dependency-scanning-settings) to customize Dependency Scanning settings."
msgstr ""
@@ -8488,16 +8616,13 @@ msgstr ""
msgid "Configure a %{codeStart}.gitlab-webide.yml%{codeEnd} file in the %{codeStart}.gitlab%{codeEnd} directory to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
msgstr ""
-msgid "Configure existing installation"
-msgstr ""
-
-msgid "Configure limit for notes created per minute by web and API requests."
+msgid "Configure advanced permissions, Large File Storage, and two-factor authentication settings."
msgstr ""
-msgid "Configure limits for Project/Group Import/Export."
+msgid "Configure approvals by authors and committers on all projects."
msgstr ""
-msgid "Configure limits for web and API requests."
+msgid "Configure existing installation"
msgstr ""
msgid "Configure paths to be protected by Rack Attack."
@@ -8512,10 +8637,13 @@ msgstr ""
msgid "Configure settings for Advanced Search with Elasticsearch."
msgstr ""
+msgid "Configure specific limits for Files API requests that supersede the general user and IP rate limits."
+msgstr ""
+
msgid "Configure specific limits for Git LFS requests that supersede the general user and IP rate limits."
msgstr ""
-msgid "Configure specific limits for Packages API requests that supersede the general user and IP rate limits."
+msgid "Configure specific limits for deprecated API requests that supersede the general user and IP rate limits."
msgstr ""
msgid "Configure the %{link} integration."
@@ -8527,6 +8655,9 @@ msgstr ""
msgid "Configure the way a user creates a new account."
msgstr ""
+msgid "Configure via Merge Request"
+msgstr ""
+
msgid "Configure which lists are shown for anyone who visits this board"
msgstr ""
@@ -8995,6 +9126,9 @@ msgstr ""
msgid "Content parsed with %{link}."
msgstr ""
+msgid "ContentEditor|Table of Contents"
+msgstr ""
+
msgid "ContentEditor|You have to provide a renderMarkdown function or a custom serializer"
msgstr ""
@@ -9181,6 +9315,9 @@ msgstr ""
msgid "Copy link to chart"
msgstr ""
+msgid "Copy prefix"
+msgstr ""
+
msgid "Copy reference"
msgstr ""
@@ -9211,6 +9348,9 @@ msgstr ""
msgid "Copy value"
msgstr ""
+msgid "Corpus Management"
+msgstr ""
+
msgid "Corpus Management|Are you sure you want to delete the corpus?"
msgstr ""
@@ -9439,6 +9579,9 @@ msgstr ""
msgid "Create commit"
msgstr ""
+msgid "Create common files more quickly, and standardize their format."
+msgstr ""
+
msgid "Create confidential merge request"
msgstr ""
@@ -9472,6 +9615,9 @@ msgstr ""
msgid "Create issue"
msgstr ""
+msgid "Create issue to resolve all threads"
+msgstr ""
+
msgid "Create iteration"
msgstr ""
@@ -9526,6 +9672,9 @@ msgstr ""
msgid "Create new..."
msgstr ""
+msgid "Create or import your first project"
+msgstr ""
+
msgid "Create project"
msgstr ""
@@ -9883,7 +10032,7 @@ msgstr ""
msgid "Custom notification events"
msgstr ""
-msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notificationLinkStart} notification emails%{notificationLinkEnd}."
+msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notificationLinkStart}notification emails%{notificationLinkEnd}."
msgstr ""
msgid "Custom project templates"
@@ -10082,10 +10231,10 @@ msgid_plural "CycleAnalytics|Showing %{subjectFilterText} and %{selectedLabelsCo
msgstr[0] ""
msgstr[1] ""
-msgid "CycleAnalytics|Showing data for group '%{groupName}' and %{selectedProjectCount} projects from %{startDate} to %{endDate}"
+msgid "CycleAnalytics|Showing data for group '%{groupName}' and %{selectedProjectCount} projects from %{createdAfter} to %{createdBefore}"
msgstr ""
-msgid "CycleAnalytics|Showing data for group '%{groupName}' from %{startDate} to %{endDate}"
+msgid "CycleAnalytics|Showing data for group '%{groupName}' from %{createdAfter} to %{createdBefore}"
msgstr ""
msgid "CycleAnalytics|Stages"
@@ -10319,6 +10468,9 @@ msgstr ""
msgid "DastProfiles|Manage profiles"
msgstr ""
+msgid "DastProfiles|Manage site profiles"
+msgstr ""
+
msgid "DastProfiles|Minimum = 0 (no timeout enabled), Maximum = 2880 minutes"
msgstr ""
@@ -10394,6 +10546,9 @@ msgstr ""
msgid "DastProfiles|Scanner name"
msgstr ""
+msgid "DastProfiles|Schedule"
+msgstr ""
+
msgid "DastProfiles|Select branch"
msgstr ""
@@ -10463,7 +10618,7 @@ msgstr ""
msgid "DastProfiles|Website"
msgstr ""
-msgid "DastProfiles|You can either choose a passive scan or validate the target site in your chosen site profile. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
+msgid "DastProfiles|You can either choose a passive scan or validate the target site from the site profile management page. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
msgstr ""
msgid "DastProfiles|You cannot run an active scan against an unvalidated site."
@@ -10636,7 +10791,7 @@ msgstr ""
msgid "Days to merge"
msgstr ""
-msgid "Deactivate dormant users after 90 days of inactivity. Users can return to active status by signing in to their account. While inactive, a user is not counted as an active user in the instance."
+msgid "Deactivate dormant users after 90 days of inactivity"
msgstr ""
msgid "Dear Administrator,"
@@ -10723,10 +10878,10 @@ msgstr ""
msgid "Define a custom pattern with cron syntax"
msgstr ""
-msgid "Define approval settings."
+msgid "Define approval rules."
msgstr ""
-msgid "Define approval settings. %{linkStart}Learn more.%{linkEnd}"
+msgid "Define approval rules. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "Define custom rules for what constitutes spam, independent of Akismet"
@@ -10735,7 +10890,7 @@ msgstr ""
msgid "Define environments in the deploy stage(s) in %{code_open}.gitlab-ci.yml%{code_close} to track deployments here."
msgstr ""
-msgid "Define how approval rules are applied as a merge request moves toward completion."
+msgid "Define how approval rules are applied to merge requests."
msgstr ""
msgid "Definition"
@@ -10750,6 +10905,12 @@ msgstr ""
msgid "DelayedJobs|Are you sure you want to run %{job_name} immediately? This job will run automatically after it's timer finishes."
msgstr ""
+msgid "DelayedJobs|Are you sure you want to run %{job_name} immediately? This job will run automatically after its timer finishes."
+msgstr ""
+
+msgid "DelayedJobs|Run the delayed job now?"
+msgstr ""
+
msgid "DelayedJobs|Start now"
msgstr ""
@@ -11026,6 +11187,12 @@ msgstr ""
msgid "Dependency proxy image prefix"
msgstr ""
+msgid "DependencyProxy|Create a local proxy for storing frequently used upstream images. %{docLinkStart}Learn more%{docLinkEnd} about dependency proxies."
+msgstr ""
+
+msgid "DependencyProxy|Dependency Proxy"
+msgstr ""
+
msgid "DependencyProxy|Toggle Dependency Proxy"
msgstr ""
@@ -11266,6 +11433,9 @@ msgstr ""
msgid "Deployments"
msgstr ""
+msgid "Deployments to Google Kubernetes Engine can be "
+msgstr ""
+
msgid "Deployments|%{deployments} environment impacted."
msgid_plural "Deployments|%{deployments} environments impacted."
msgstr[0] ""
@@ -11295,6 +11465,9 @@ msgstr ""
msgid "Deployment|success"
msgstr ""
+msgid "Deprecated API rate limits"
+msgstr ""
+
msgid "Deprioritize label"
msgstr ""
@@ -11697,6 +11870,16 @@ msgstr ""
msgid "DiffsCompareBaseBranch|(base)"
msgstr ""
+msgid "Diffs|%d addition"
+msgid_plural "Diffs|%d additions"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Diffs|%d deletion"
+msgid_plural "Diffs|%d deletions"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Diffs|No file name available"
msgstr ""
@@ -11706,9 +11889,17 @@ msgstr ""
msgid "Diffs|Show all unchanged lines"
msgstr ""
+msgid "Diffs|Showing %{dropdownStart}%{count} changed file%{dropdownEnd}"
+msgid_plural "Diffs|Showing %{dropdownStart}%{count} changed files%{dropdownEnd}"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Diffs|Something went wrong while fetching diff lines."
msgstr ""
+msgid "Diffs|with %{additions} and %{deletions}"
+msgstr ""
+
msgid "Direct member"
msgstr ""
@@ -11834,9 +12025,6 @@ msgid_plural "Dismiss %d selected vulnerabilities as"
msgstr[0] ""
msgstr[1] ""
-msgid "Dismiss Value Stream Analytics introduction box"
-msgstr ""
-
msgid "Dismiss merge request promotion"
msgstr ""
@@ -12158,6 +12346,9 @@ msgstr ""
msgid "Edit issues"
msgstr ""
+msgid "Edit merge requests"
+msgstr ""
+
msgid "Edit public deploy key"
msgstr ""
@@ -12233,6 +12424,9 @@ msgstr ""
msgid "Elastic|None. Select projects to index."
msgstr ""
+msgid "Eligible users"
+msgstr ""
+
msgid "Email"
msgstr ""
@@ -12362,6 +12556,9 @@ msgstr ""
msgid "Enable"
msgstr ""
+msgid "Enable Amazon EKS integration"
+msgstr ""
+
msgid "Enable Auto DevOps"
msgstr ""
@@ -12395,6 +12592,9 @@ msgstr ""
msgid "Enable SSL verification"
msgstr ""
+msgid "Enable Service Ping"
+msgstr ""
+
msgid "Enable Snowplow tracking"
msgstr ""
@@ -12425,6 +12625,9 @@ msgstr ""
msgid "Enable authenticated Git LFS request rate limit"
msgstr ""
+msgid "Enable authenticated web request rate limit"
+msgstr ""
+
msgid "Enable authentication"
msgstr ""
@@ -12485,7 +12688,7 @@ msgstr ""
msgid "Enable or disable the Pseudonymizer data collection."
msgstr ""
-msgid "Enable or disable version check and service ping."
+msgid "Enable or disable version check and Service Ping."
msgstr ""
msgid "Enable protected paths rate limit"
@@ -12497,18 +12700,12 @@ msgstr ""
msgid "Enable reCAPTCHA"
msgstr ""
-msgid "Enable reCAPTCHA for login"
-msgstr ""
-
-msgid "Enable reCAPTCHA, Invisible Captcha, Akismet and set IP limits. For reCAPTCHA, we currently only support %{recaptcha_v2_link_start}v2%{recaptcha_v2_link_end}"
+msgid "Enable reCAPTCHA for login."
msgstr ""
msgid "Enable repository checks"
msgstr ""
-msgid "Enable service ping"
-msgstr ""
-
msgid "Enable shared runners for all projects and subgroups in this group."
msgstr ""
@@ -12530,7 +12727,10 @@ msgstr ""
msgid "Enable unauthenticated API request rate limit"
msgstr ""
-msgid "Enable unauthenticated request rate limit"
+msgid "Enable unauthenticated web request rate limit"
+msgstr ""
+
+msgid "Enable user deactivation emails"
msgstr ""
msgid "Enable version check"
@@ -12566,9 +12766,6 @@ msgstr ""
msgid "Enabled sources for code import during project creation. OmniAuth must be configured for GitHub"
msgstr ""
-msgid "Enabling this will only make licensed EE features available to projects if the project namespace's plan includes the feature or if the project is public."
-msgstr ""
-
msgid "Encountered an error while rendering: %{err}"
msgstr ""
@@ -12617,9 +12814,6 @@ msgstr ""
msgid "Enter Admin Mode"
msgstr ""
-msgid "Enter IP address range"
-msgstr ""
-
msgid "Enter a number"
msgstr ""
@@ -12632,9 +12826,6 @@ msgstr ""
msgid "Enter at least three characters to search"
msgstr ""
-msgid "Enter domain"
-msgstr ""
-
msgid "Enter in your Bitbucket Server URL and personal access token below"
msgstr ""
@@ -12821,9 +13012,6 @@ msgstr ""
msgid "Environments|Deployment %{status}"
msgstr ""
-msgid "Environments|Dismiss"
-msgstr ""
-
msgid "Environments|Enable review app"
msgstr ""
@@ -12836,9 +13024,6 @@ msgstr ""
msgid "Environments|Environments are places where code gets deployed, such as staging or production."
msgstr ""
-msgid "Environments|Help us improve environments"
-msgstr ""
-
msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
msgstr ""
@@ -12875,6 +13060,9 @@ msgstr ""
msgid "Environments|Note that this action will stop the environment, but it will %{emphasisStart}not%{emphasisEnd} have an effect on any existing deployment due to no “stop environment action†being defined in the %{ciConfigLinkStart}.gitlab-ci.yml%{ciConfigLinkEnd} file."
msgstr ""
+msgid "Environments|Open"
+msgstr ""
+
msgid "Environments|Open live environment"
msgstr ""
@@ -12914,9 +13102,6 @@ msgstr ""
msgid "Environments|Stopping %{environmentName}"
msgstr ""
-msgid "Environments|Take the survey"
-msgstr ""
-
msgid "Environments|There was an error fetching the logs. Please try again."
msgstr ""
@@ -12938,9 +13123,6 @@ msgstr ""
msgid "Environments|You don't have any environments right now"
msgstr ""
-msgid "Environments|Your feedback helps GitLab make environments better for you and other users. Participate and enter a sweepstake to win a USD 30 gift card."
-msgstr ""
-
msgid "Environments|by %{avatar}"
msgstr ""
@@ -13223,7 +13405,7 @@ msgstr ""
msgid "Error parsing CSV file. Please make sure it has"
msgstr ""
-msgid "Error rendering markdown preview"
+msgid "Error rendering Markdown preview"
msgstr ""
msgid "Error saving label update."
@@ -13271,6 +13453,9 @@ msgstr ""
msgid "Error: %{error_message}"
msgstr ""
+msgid "Error: Couldn't load some or all of the changes."
+msgstr ""
+
msgid "Error: No AWS credentials were supplied"
msgstr ""
@@ -13304,6 +13489,9 @@ msgstr ""
msgid "ErrorTracking|Enable error tracking"
msgstr ""
+msgid "ErrorTracking|Error tracking backend"
+msgstr ""
+
msgid "ErrorTracking|If you self-host Sentry, enter your Sentry instance's full URL. If you use Sentry's hosted solution, enter https://sentry.io"
msgstr ""
@@ -13337,6 +13525,12 @@ msgstr ""
msgid "Escalation policies must have at least one rule"
msgstr ""
+msgid "EscalationPolicies|%{clockIcon} IF alert is not %{alertStatus} in %{minutes}"
+msgstr ""
+
+msgid "EscalationPolicies|%{notificationIcon} THEN %{doAction} %{forScheduleOrUser}"
+msgstr ""
+
msgid "EscalationPolicies|+ Add an additional rule"
msgstr ""
@@ -13379,13 +13573,13 @@ msgstr ""
msgid "EscalationPolicies|Escalation policies"
msgstr ""
-msgid "EscalationPolicies|Escalation rules"
+msgid "EscalationPolicies|Escalation policy %{obstacle} in Project %{project}"
msgstr ""
-msgid "EscalationPolicies|Failed to load oncall-schedules"
+msgid "EscalationPolicies|Escalation rules"
msgstr ""
-msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} %{then} THEN %{doAction} %{scheduleOrUser}"
+msgid "EscalationPolicies|Failed to load oncall-schedules"
msgstr ""
msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} minutes"
@@ -13463,18 +13657,36 @@ msgstr ""
msgid "Every %{action} attempt has failed: %{job_error_message}. Please try again."
msgstr ""
+msgid "Every 3 months"
+msgstr ""
+
+msgid "Every 3 months on the %{day} at %{time} %{timezone}"
+msgstr ""
+
+msgid "Every 6 months"
+msgstr ""
+
+msgid "Every 6 months on the %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Every day"
msgstr ""
msgid "Every day (at %{time})"
msgstr ""
+msgid "Every day at %{time} %{timezone}"
+msgstr ""
+
msgid "Every month"
msgstr ""
msgid "Every month (Day %{day} at %{time})"
msgstr ""
+msgid "Every month on the %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Every three months"
msgstr ""
@@ -13489,6 +13701,15 @@ msgstr[1] ""
msgid "Every week (%{weekday} at %{time})"
msgstr ""
+msgid "Every week on %{day} at %{time} %{timezone}"
+msgstr ""
+
+msgid "Every year"
+msgstr ""
+
+msgid "Every year on %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Everyone"
msgstr ""
@@ -13525,9 +13746,6 @@ msgstr ""
msgid "Exactly one of %{attributes} is required"
msgstr ""
-msgid "Example: %{ip_address}. %{read_more_link}."
-msgstr ""
-
msgid "Example: @sub\\.company\\.com$"
msgstr ""
@@ -13594,13 +13812,13 @@ msgstr ""
msgid "Expand pipeline"
msgstr ""
-msgid "Expand sidebar"
+msgid "Expand settings section"
msgstr ""
-msgid "Expected documents: %{expected_documents}"
+msgid "Expand sidebar"
msgstr ""
-msgid "Experienced"
+msgid "Expected documents: %{expected_documents}"
msgstr ""
msgid "ExperimentSubject|Must have exactly one of User, Namespace, or Project."
@@ -13885,9 +14103,6 @@ msgstr ""
msgid "Failed to load related branches"
msgstr ""
-msgid "Failed to load sidebar lock status"
-msgstr ""
-
msgid "Failed to load stacktrace."
msgstr ""
@@ -14312,6 +14527,9 @@ msgstr ""
msgid "Files"
msgstr ""
+msgid "Files API Rate Limits"
+msgstr ""
+
msgid "Files breadcrumb"
msgstr ""
@@ -15311,6 +15529,9 @@ msgstr ""
msgid "GitLab group: %{source_link}"
msgstr ""
+msgid "GitLab informs you if a new version is available."
+msgstr ""
+
msgid "GitLab is a complete DevOps platform, delivered as a single application, fundamentally changing the way Development, Security, and Ops teams collaborate"
msgstr ""
@@ -15326,7 +15547,7 @@ msgstr ""
msgid "GitLab is open source software to collaborate on code."
msgstr ""
-msgid "GitLab is undergoing maintenance and is operating in a read-only mode."
+msgid "GitLab is undergoing maintenance and is operating in read-only mode."
msgstr ""
msgid "GitLab member or Email address"
@@ -15338,9 +15559,6 @@ msgstr ""
msgid "GitLab project export"
msgstr ""
-msgid "GitLab restart is required to apply changes."
-msgstr ""
-
msgid "GitLab single sign-on URL"
msgstr ""
@@ -15356,9 +15574,6 @@ msgstr ""
msgid "GitLab version"
msgstr ""
-msgid "GitLab will inform you if a new version is available."
-msgstr ""
-
msgid "GitLab will run a background job that will produce pseudonymized CSVs of the GitLab database that will be uploaded to your configured object storage directory."
msgstr ""
@@ -15623,9 +15838,21 @@ msgstr ""
msgid "Go to snippets"
msgstr ""
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check 'Allowed domains for sign-ups'."
+msgstr ""
+
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check 'Email restrictions for sign-ups'."
+msgstr ""
+
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check the 'Domain denylist'."
+msgstr ""
+
msgid "Go to the activity feed"
msgstr ""
+msgid "Go to the group’s 'Settings &gt; General' page, and check 'Restrict membership by email domain'."
+msgstr ""
+
msgid "Go to the milestone list"
msgstr ""
@@ -15662,6 +15889,12 @@ msgstr ""
msgid "Goal of the changes and what reviewers should be aware of"
msgstr ""
+msgid "Google Cloud"
+msgstr ""
+
+msgid "Google Cloud offers several deployment targets. Select the one most suitable for your project."
+msgstr ""
+
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
@@ -15746,9 +15979,6 @@ msgstr ""
msgid "Group ID"
msgstr ""
-msgid "Group ID: %{group_id}"
-msgstr ""
-
msgid "Group Owner must have signed in with SAML before enabling Group Managed Accounts"
msgstr ""
@@ -15923,6 +16153,12 @@ msgstr ""
msgid "GroupImport|Unable to process group import file"
msgstr ""
+msgid "GroupPage|Copy group ID"
+msgstr ""
+
+msgid "GroupPage|Group ID: %{group_id}"
+msgstr ""
+
msgid "GroupRoadmap|%{dateWord} – No end date"
msgstr ""
@@ -15977,6 +16213,9 @@ msgstr ""
msgid "GroupRoadmap|Within 3 years"
msgstr ""
+msgid "GroupSAML|\"persistent\" recommended"
+msgstr ""
+
msgid "GroupSAML|%{strongOpen}Warning%{strongClose} - Enabling %{linkStart}SSO enforcement%{linkEnd} can reduce security risks."
msgstr ""
@@ -16109,6 +16348,9 @@ msgstr ""
msgid "GroupSAML|To be able to prohibit outer forks, you first need to enforce dedicate group managed accounts."
msgstr ""
+msgid "GroupSAML|Use SAML group links to manage group membership using SAML."
+msgstr ""
+
msgid "GroupSAML|Valid SAML Response"
msgstr ""
@@ -16121,13 +16363,10 @@ msgstr ""
msgid "GroupSAML|as %{access_level}"
msgstr ""
-msgid "GroupSAML|must match stored NameID of \"%{extern_uid}\" as we use this to identify users. If the NameID changes users will be unable to sign in."
-msgstr ""
-
-msgid "GroupSAML|should be \"persistent\""
+msgid "GroupSAML|must match stored NameID of \"%{extern_uid}\" to identify user and allow sign in"
msgstr ""
-msgid "GroupSAML|should be a random persistent ID, emails are discouraged"
+msgid "GroupSAML|recommend persistent ID instead of email"
msgstr ""
msgid "GroupSelect|No matching results"
@@ -16142,9 +16381,15 @@ msgstr ""
msgid "GroupSettings|Allow project access token creation"
msgstr ""
+msgid "GroupSettings|Applied to all subgroups unless overridden by a group owner. Groups already added to the project lose access."
+msgstr ""
+
msgid "GroupSettings|Auto DevOps pipeline was updated for the group"
msgstr ""
+msgid "GroupSettings|Available only on the top-level group. Applies to all subgroups. Groups already shared with a group outside %{group} are still shared unless removed manually."
+msgstr ""
+
msgid "GroupSettings|Badges"
msgstr ""
@@ -16196,6 +16441,9 @@ msgstr ""
msgid "GroupSettings|New runners registration token has been generated!"
msgstr ""
+msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgstr ""
+
msgid "GroupSettings|Pipeline settings was updated for the group"
msgstr ""
@@ -16208,12 +16456,15 @@ msgstr ""
msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
-msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups."
+msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups"
msgstr ""
msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
msgstr ""
+msgid "GroupSettings|Prevents group members from being notified if the group is mentioned."
+msgstr ""
+
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
msgstr ""
@@ -16250,21 +16501,6 @@ msgstr ""
msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}."
msgstr ""
-msgid "GroupSettings|This setting is only available on the top-level group and it applies to all subgroups. Groups that have already been shared with a group outside %{group} will still be shared, and this access will have to be revoked manually."
-msgstr ""
-
-msgid "GroupSettings|This setting will be applied to all subgroups unless overridden by a group owner. Groups that already have access to the project will continue to have access unless removed manually."
-msgstr ""
-
-msgid "GroupSettings|This setting will override user notification preferences for all members of the group, subgroups, and projects."
-msgstr ""
-
-msgid "GroupSettings|This setting will prevent group members from being notified if the group is mentioned."
-msgstr ""
-
-msgid "GroupSettings|This setting will prevent group members from forking projects outside of the group."
-msgstr ""
-
msgid "GroupSettings|Transfer group"
msgstr ""
@@ -16382,7 +16618,7 @@ msgstr ""
msgid "GroupsNew|No import options available"
msgstr ""
-msgid "GroupsNew|Not all related objects are migrated, as %{docs_link_start}described here%{docs_link_end}. Please %{feedback_link_start}leave feedback%{feedback_link_end} on this feature."
+msgid "GroupsNew|Not all related objects are migrated. %{docs_link_start}More info%{docs_link_end}."
msgstr ""
msgid "GroupsNew|Personal access token"
@@ -16514,15 +16750,27 @@ msgstr ""
msgid "Hello %{name},"
msgstr ""
-msgid "Hello there"
-msgstr ""
-
msgid "Hello, %{name}!"
msgstr ""
msgid "Hello, %{username}!"
msgstr ""
+msgid "HelloMessage|%{handshake_emoji} Contribute to GitLab: %{contribute_link}"
+msgstr ""
+
+msgid "HelloMessage|%{magnifier_emoji} Create a new GitLab issue: %{new_issue_link}"
+msgstr ""
+
+msgid "HelloMessage|%{rocket_emoji} We like your curiosity! Help us improve GitLab by joining the team: %{jobs_page_link}"
+msgstr ""
+
+msgid "HelloMessage|Does this page need fixes or improvements? Open an issue or contribute a merge request to help make GitLab more lovable. At GitLab, everyone can contribute!"
+msgstr ""
+
+msgid "HelloMessage|Welcome to GitLab!"
+msgstr ""
+
msgid "Help"
msgstr ""
@@ -16532,13 +16780,10 @@ msgstr ""
msgid "Helps prevent bots from creating accounts."
msgstr ""
-msgid "Helps prevent bots from creating issues"
-msgstr ""
-
-msgid "Helps prevent malicious users hide their activity"
+msgid "Helps prevent bots from creating issues."
msgstr ""
-msgid "Helps reduce request volume (e.g. from crawlers or abusive bots)"
+msgid "Helps prevent malicious users hide their activity."
msgstr ""
msgid "Helps reduce request volume (for example, from crawlers or abusive bots)"
@@ -16662,6 +16907,12 @@ msgstr ""
msgid "Housekeeping, export, path, transfer, remove, archive."
msgstr ""
+msgid "How do I configure Akismet?"
+msgstr ""
+
+msgid "How do I configure it?"
+msgstr ""
+
msgid "How do I configure runners?"
msgstr ""
@@ -16683,19 +16934,25 @@ msgstr ""
msgid "How do I set up this service?"
msgstr ""
+msgid "How do I use a web terminal?"
+msgstr ""
+
+msgid "How do I use file templates?"
+msgstr ""
+
msgid "How it works"
msgstr ""
msgid "How many days need to pass between marking entity for deletion and actual removing it."
msgstr ""
-msgid "How many seconds an IP will be counted towards the limit"
+msgid "How many seconds an IP counts toward the IP address limit."
msgstr ""
-msgid "I accept the %{terms_link}"
+msgid "How the job limiter handles jobs exceeding the thresholds specified below. The 'track' mode only logs the jobs. The 'compress' mode compresses the jobs and raises an exception if the compressed size exceeds the limit."
msgstr ""
-msgid "I accept the|Terms of Service and Privacy Policy"
+msgid "I accept the %{terms_link}"
msgstr ""
msgid "I forgot my password"
@@ -16779,13 +17036,16 @@ msgstr ""
msgid "IP Address"
msgstr ""
-msgid "IP expiration time"
+msgid "IP address expiration time"
msgstr ""
-msgid "IP subnet restriction only allowed for top-level groups"
+msgid "IP address restrictions"
+msgstr ""
+
+msgid "IP addresses per user"
msgstr ""
-msgid "IPs per user"
+msgid "IP subnet restriction only allowed for top-level groups"
msgstr ""
msgid "Identifier"
@@ -16800,6 +17060,9 @@ msgstr ""
msgid "If any indexed field exceeds this limit it will be truncated to this number of characters and the rest will not be indexed or searchable. This does not apply to repository and wiki indexing. Setting this to 0 means it is unlimited."
msgstr ""
+msgid "If blank, defaults to %{code_open}Retry later%{code_close}."
+msgstr ""
+
msgid "If blank, set allowable lifetime to %{instance_level_policy_in_words}, as defined by the instance admin. Once set, existing tokens for users in this group may be revoked."
msgstr ""
@@ -16851,6 +17114,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 did not initiate these sign-in attempts, please reach out to your administrator or enable two-factor authentication (2FA) on your account."
+msgstr ""
+
msgid "If you did not initiate this change, please contact your administrator immediately."
msgstr ""
@@ -16942,10 +17208,10 @@ msgstr ""
msgid "Import Projects from Gitea"
msgstr ""
-msgid "Import a project"
+msgid "Import an exported GitLab project"
msgstr ""
-msgid "Import an exported GitLab project"
+msgid "Import and export rate limits"
msgstr ""
msgid "Import failed due to a GitHub error: %{original}"
@@ -16957,12 +17223,18 @@ msgstr ""
msgid "Import from Jira"
msgstr ""
+msgid "Import group"
+msgstr ""
+
msgid "Import group from file"
msgstr ""
msgid "Import groups"
msgstr ""
+msgid "Import history"
+msgstr ""
+
msgid "Import in progress"
msgstr ""
@@ -17026,7 +17298,25 @@ msgstr ""
msgid "Import timed out. Import took longer than %{import_jobs_expiration} seconds"
msgstr ""
-msgid "Import/Export Rate Limits"
+msgid "ImportAProjectModal|Import from a project"
+msgstr ""
+
+msgid "ImportAProjectModal|Import members from another project"
+msgstr ""
+
+msgid "ImportAProjectModal|Import project members"
+msgstr ""
+
+msgid "ImportAProjectModal|Only project members (not group members) are imported, and they get the same permissions as the project you import from."
+msgstr ""
+
+msgid "ImportAProjectModal|Successfully imported"
+msgstr ""
+
+msgid "ImportAProjectModal|Unable to import project members"
+msgstr ""
+
+msgid "ImportAProjectModal|You're importing members to the %{strongStart}%{name}%{strongEnd} project."
msgstr ""
msgid "ImportButtons|Connect repositories from"
@@ -17079,7 +17369,7 @@ msgstr[1] ""
msgid "Importing..."
msgstr ""
-msgid "Import|A repository URL usually ends in a .git suffix, although this is not required. Double check to make sure your repository URL is correct."
+msgid "Import|There is not a valid Git repository at this URL. If your HTTP repository is not publicly accessible, verify your credentials."
msgstr ""
msgid "Improve customer support with Service Desk"
@@ -17088,9 +17378,6 @@ msgstr ""
msgid "Improves Git cloning performance."
msgstr ""
-msgid "In %{time_to_now}"
-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 ""
@@ -17376,7 +17663,7 @@ msgstr ""
msgid "InProductMarketing|Start a GitLab Ultimate trial today in less than one minute, no credit card required."
msgstr ""
-msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no CC required"
+msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no credit card required"
msgstr ""
msgid "InProductMarketing|Start a trial"
@@ -17415,7 +17702,7 @@ msgstr ""
msgid "InProductMarketing|Team up in GitLab for greater efficiency"
msgstr ""
-msgid "InProductMarketing|Team work makes the dream work"
+msgid "InProductMarketing|Team work makes the dream work"
msgstr ""
msgid "InProductMarketing|Test, create, deploy"
@@ -17996,6 +18283,9 @@ msgstr ""
msgid "Integrations|Create new issue in Jira"
msgstr ""
+msgid "Integrations|Create new issue in ZenTao"
+msgstr ""
+
msgid "Integrations|Default settings are inherited from the group level."
msgstr ""
@@ -18089,9 +18379,15 @@ msgstr ""
msgid "Integrations|Search Jira issues"
msgstr ""
+msgid "Integrations|Search ZenTao issues"
+msgstr ""
+
msgid "Integrations|Send notifications about project events to Unify Circuit."
msgstr ""
+msgid "Integrations|Send notifications about project events to a Unify Circuit conversation. %{docs_link}"
+msgstr ""
+
msgid "Integrations|Sign in to add namespaces"
msgstr ""
@@ -18131,6 +18427,9 @@ msgstr ""
msgid "Integrations|You've activated every integration 🎉"
msgstr ""
+msgid "Integrations|ZenTao issues display here when you create issues in your project in ZenTao."
+msgstr ""
+
msgid "Interactive mode"
msgstr ""
@@ -18158,9 +18457,6 @@ msgstr ""
msgid "Interval Pattern"
msgstr ""
-msgid "Introducing Value Stream Analytics"
-msgstr ""
-
msgid "Introducing Your DevOps Report"
msgstr ""
@@ -18257,6 +18553,12 @@ msgstr ""
msgid "Investigate vulnerability: %{title}"
msgstr ""
+msgid "Invisible Captcha"
+msgstr ""
+
+msgid "Invisible Captcha helps prevent the creation of spam accounts. It adds a honeypot field and time-sensitive form submission to the account signup form."
+msgstr ""
+
msgid "Invitation"
msgstr ""
@@ -18710,12 +19012,18 @@ msgstr ""
msgid "Issues"
msgstr ""
+msgid "Issues I've created"
+msgstr ""
+
msgid "Issues Rate Limits"
msgstr ""
msgid "Issues and merge requests"
msgstr ""
+msgid "Issues assigned to me"
+msgstr ""
+
msgid "Issues can be bugs, tasks or ideas to be discussed. Also, issues are searchable and filterable."
msgstr ""
@@ -18827,7 +19135,7 @@ msgstr ""
msgid "Iterations|Create cadence"
msgstr ""
-msgid "Iterations|Create your first iteration"
+msgid "Iterations|Create iteration"
msgstr ""
msgid "Iterations|Delete cadence"
@@ -18836,6 +19144,9 @@ msgstr ""
msgid "Iterations|Delete iteration cadence?"
msgstr ""
+msgid "Iterations|Delete iteration?"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -18869,12 +19180,18 @@ msgstr ""
msgid "Iterations|New iteration cadence"
msgstr ""
+msgid "Iterations|No closed iterations."
+msgstr ""
+
msgid "Iterations|No iteration cadences to show."
msgstr ""
msgid "Iterations|No iterations in cadence."
msgstr ""
+msgid "Iterations|No open iterations."
+msgstr ""
+
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
@@ -18905,6 +19222,9 @@ msgstr ""
msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
msgstr ""
+msgid "Iterations|This will remove the iteration from any issues that are assigned to it."
+msgstr ""
+
msgid "Iterations|Title"
msgstr ""
@@ -18920,15 +19240,9 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "I’m familiar with the basics of DevOps."
-msgstr ""
-
msgid "I’m joining my team who’s already on GitLab"
msgstr ""
-msgid "I’m not familiar with the basics of DevOps."
-msgstr ""
-
msgid "Jaeger URL"
msgstr ""
@@ -19193,6 +19507,9 @@ msgstr ""
msgid "Job"
msgstr ""
+msgid "Job %{jobName}"
+msgstr ""
+
msgid "Job Failed #%{build_id}"
msgstr ""
@@ -19783,9 +20100,6 @@ msgstr ""
msgid "Learn more in the"
msgstr ""
-msgid "Learn more in the|pipeline schedules documentation"
-msgstr ""
-
msgid "Learn more."
msgstr ""
@@ -19897,9 +20211,6 @@ msgstr ""
msgid "Leave Admin Mode"
msgstr ""
-msgid "Leave blank for no limit. Once set, existing personal access tokens may be revoked."
-msgstr ""
-
msgid "Leave edit mode? All unsaved changes will be lost."
msgstr ""
@@ -19945,10 +20256,10 @@ msgstr ""
msgid "LicenseCompliance|Acceptable license to be used in the project"
msgstr ""
-msgid "LicenseCompliance|Add a license"
+msgid "LicenseCompliance|Add license and related policy"
msgstr ""
-msgid "LicenseCompliance|Add license and related policy"
+msgid "LicenseCompliance|Add license policy"
msgstr ""
msgid "LicenseCompliance|Allow"
@@ -20038,6 +20349,9 @@ msgstr ""
msgid "LicenseManagement|Uncategorized"
msgstr ""
+msgid "Licensed Enterprise Edition features can be used if the project namespace's plan includes the feature, or if the project is public."
+msgstr ""
+
msgid "Licensed Features"
msgstr ""
@@ -20104,7 +20418,10 @@ msgstr ""
msgid "Limit namespaces and projects that can be indexed"
msgstr ""
-msgid "Limit sign in from multiple ips"
+msgid "Limit project size at a global, group, and project level. %{link_start}Learn more%{link_end}."
+msgstr ""
+
+msgid "Limit sign in from multiple IP addresses"
msgstr ""
msgid "Limit the number of concurrent operations this secondary site can run in the background."
@@ -20116,11 +20433,17 @@ msgstr ""
msgid "Limit the number of issues and epics per minute a user can create through web and API requests."
msgstr ""
+msgid "Limit the size of Sidekiq jobs stored in Redis."
+msgstr ""
+
msgid "Limited to showing %d event at most"
msgid_plural "Limited to showing %d events at most"
msgstr[0] ""
msgstr[1] ""
+msgid "Limiting mode"
+msgstr ""
+
msgid "Line changes"
msgstr ""
@@ -20190,9 +20513,6 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
-msgid "List of users to be excluded from the limit"
-msgstr ""
-
msgid "List options"
msgstr ""
@@ -20232,9 +20552,6 @@ msgstr ""
msgid "Loading functions timed out. Please reload the page to try again."
msgstr ""
-msgid "Loading issues"
-msgstr ""
-
msgid "Loading more"
msgstr ""
@@ -20526,6 +20843,9 @@ msgstr ""
msgid "Marked For Deletion At - %{deletion_time}"
msgstr ""
+msgid "Marked as ready. Merging is now allowed."
+msgstr ""
+
msgid "Marked this %{noun} as a draft."
msgstr ""
@@ -20598,52 +20918,22 @@ msgstr ""
msgid "Max 100,000 events"
msgstr ""
-msgid "Max 20 characters"
-msgstr ""
-
-msgid "Max Group Export Download requests per minute per user"
-msgstr ""
-
-msgid "Max Group Export requests per minute per user"
-msgstr ""
-
-msgid "Max Group Import requests per minute per user"
-msgstr ""
-
-msgid "Max Project Export Download requests per minute per user"
-msgstr ""
-
-msgid "Max Project Export requests per minute per user"
-msgstr ""
-
-msgid "Max Project Import requests per minute per user"
-msgstr ""
-
-msgid "Max authenticated API requests per period per user"
-msgstr ""
-
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
-msgid "Max authenticated web requests per period per user"
-msgstr ""
-
msgid "Max file size is 200 KB."
msgstr ""
-msgid "Max requests per minute per user"
-msgstr ""
-
msgid "Max role"
msgstr ""
msgid "Max session time"
msgstr ""
-msgid "Max unauthenticated requests per period per IP"
+msgid "MaxBuilds"
msgstr ""
-msgid "MaxBuilds"
+msgid "Maximum 20 characters"
msgstr ""
msgid "Maximum Conan package file size in bytes"
@@ -20679,6 +20969,12 @@ msgstr ""
msgid "Maximum attachment size (MB)"
msgstr ""
+msgid "Maximum authenticated API requests per rate limit period per user"
+msgstr ""
+
+msgid "Maximum authenticated web requests per rate limit period per user"
+msgstr ""
+
msgid "Maximum bulk request size (MiB)"
msgstr ""
@@ -20724,6 +21020,15 @@ msgstr ""
msgid "Maximum files in a diff"
msgstr ""
+msgid "Maximum group export download requests per minute"
+msgstr ""
+
+msgid "Maximum group export requests per minute"
+msgstr ""
+
+msgid "Maximum group import requests per minute"
+msgstr ""
+
msgid "Maximum import size"
msgstr ""
@@ -20760,7 +21065,7 @@ msgstr ""
msgid "Maximum number of projects."
msgstr ""
-msgid "Maximum number of unique IPs per user"
+msgid "Maximum number of unique IP addresses per user."
msgstr ""
msgid "Maximum page reached"
@@ -20769,12 +21074,24 @@ msgstr ""
msgid "Maximum page size"
msgstr ""
+msgid "Maximum project export download requests per minute"
+msgstr ""
+
+msgid "Maximum project export requests per minute"
+msgstr ""
+
+msgid "Maximum project import requests per minute"
+msgstr ""
+
msgid "Maximum push size"
msgstr ""
msgid "Maximum push size (MB)"
msgstr ""
+msgid "Maximum requests per minute"
+msgstr ""
+
msgid "Maximum running slices"
msgstr ""
@@ -20802,10 +21119,16 @@ msgstr ""
msgid "Maximum time between updates that a mirror can have when scheduled to synchronize."
msgstr ""
-msgid "Maximum time for web terminal websocket connection (in seconds). 0 for unlimited."
+msgid "Maximum time that users are allowed to skip the setup of two-factor authentication (in hours). Set to 0 (zero) to enforce at next sign in."
msgstr ""
-msgid "Maximum time that users are allowed to skip the setup of two-factor authentication (in hours). Set to 0 (zero) to enforce at next sign in."
+msgid "Maximum time, in seconds, for a web terminal websocket connection. 0 for unlimited."
+msgstr ""
+
+msgid "Maximum unauthenticated API requests per rate limit period per IP"
+msgstr ""
+
+msgid "Maximum unauthenticated web requests per rate limit period per IP"
msgstr ""
msgid "May"
@@ -20823,9 +21146,6 @@ msgstr ""
msgid "Medium vulnerabilities present"
msgstr ""
-msgid "Member lock"
-msgstr ""
-
msgid "Member since"
msgstr ""
@@ -20862,6 +21182,9 @@ msgstr ""
msgid "Members of a group may only view projects they have permission to access"
msgstr ""
+msgid "Membership"
+msgstr ""
+
msgid "Members|%{time} by %{user}"
msgstr ""
@@ -20922,9 +21245,6 @@ msgstr ""
msgid "Members|Expiration date updated successfully."
msgstr ""
-msgid "Members|Expired"
-msgstr ""
-
msgid "Members|Filter members"
msgstr ""
@@ -20940,9 +21260,6 @@ msgstr ""
msgid "Members|Membership"
msgstr ""
-msgid "Members|No expiration set"
-msgstr ""
-
msgid "Members|Remove \"%{groupName}\""
msgstr ""
@@ -20964,9 +21281,6 @@ msgstr ""
msgid "Members|Search invited"
msgstr ""
-msgid "Members|in %{time}"
-msgstr ""
-
msgid "Member|Deny access"
msgstr ""
@@ -21042,9 +21356,6 @@ msgstr ""
msgid "Merge request %{mr_link} was reviewed by %{mr_author}"
msgstr ""
-msgid "Merge request (MR) approvals"
-msgstr ""
-
msgid "Merge request analytics"
msgstr ""
@@ -21066,12 +21377,21 @@ msgstr ""
msgid "Merge requests"
msgstr ""
+msgid "Merge requests I've created"
+msgstr ""
+
msgid "Merge requests are a place to propose changes you've made to a project and discuss those changes with others"
msgstr ""
msgid "Merge requests are read-only in a secondary Geo node"
msgstr ""
+msgid "Merge requests assigned to me"
+msgstr ""
+
+msgid "Merge requests that I'm a reviewer"
+msgstr ""
+
msgid "Merge the branch and fix any conflicts that come up"
msgstr ""
@@ -21132,10 +21452,10 @@ msgstr ""
msgid "MergeRequests|An error occurred while saving the draft comment."
msgstr ""
-msgid "MergeRequests|Failed to squash. Should be done manually."
+msgid "MergeRequests|Create issue to resolve thread"
msgstr ""
-msgid "MergeRequests|Resolve this thread in a new issue"
+msgid "MergeRequests|Failed to squash. Should be done manually."
msgstr ""
msgid "MergeRequests|Saving the comment failed"
@@ -21949,6 +22269,9 @@ msgstr ""
msgid "MoveIssue|Cannot move issue to project it originates from!"
msgstr ""
+msgid "MoveIssue|Cannot move issues of '%{issue_type}' type."
+msgstr ""
+
msgid "Moved issue to %{label} column in the board."
msgstr ""
@@ -22074,6 +22397,15 @@ 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. To learn more about reducing storage capacity please visit our docs."
msgstr ""
+msgid "NamespaceUserCap|Pending users must be reviewed and approved by a group owner. Learn more about %{user_caps_link_start}User Caps%{link_end} and %{users_pending_approval_link_start}Users Pending Approval%{link_end}."
+msgstr ""
+
+msgid "NamespaceUserCap|View pending user approvals"
+msgstr ""
+
+msgid "NamespaceUserCap|Your group has reached its billable member limit"
+msgstr ""
+
msgid "Namespaces"
msgstr ""
@@ -22116,9 +22448,6 @@ msgstr ""
msgid "Network"
msgstr ""
-msgid "Network Policy|New rule"
-msgstr ""
-
msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is inbound from a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
msgstr ""
@@ -22140,16 +22469,13 @@ msgstr ""
msgid "NetworkPolicies|%{strongOpen}any%{strongClose} port"
msgstr ""
-msgid "NetworkPolicies|+ Add alert"
-msgstr ""
-
msgid "NetworkPolicies|.yaml"
msgstr ""
msgid "NetworkPolicies|.yaml mode"
msgstr ""
-msgid "NetworkPolicies|Actions"
+msgid "NetworkPolicies|Add alert"
msgstr ""
msgid "NetworkPolicies|Alerts are intended to be selectively used for a limited number of events that are potentially concerning and warrant a manual review. Alerts should not be used as a substitute for a SIEM or a logging tool. High volume alerts are likely to be dropped so as to preserve the stability of GitLab's integration with Kubernetes."
@@ -22185,9 +22511,6 @@ msgstr ""
msgid "NetworkPolicies|Deny all traffic"
msgstr ""
-msgid "NetworkPolicies|Description"
-msgstr ""
-
msgid "NetworkPolicies|Edit policy"
msgstr ""
@@ -22200,9 +22523,6 @@ msgstr ""
msgid "NetworkPolicies|IP/subnet"
msgstr ""
-msgid "NetworkPolicies|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
-msgstr ""
-
msgid "NetworkPolicies|Invalid or empty policy"
msgstr ""
@@ -22212,19 +22532,16 @@ msgstr ""
msgid "NetworkPolicies|Kubernetes error: %{error}"
msgstr ""
-msgid "NetworkPolicies|Name"
-msgstr ""
-
msgid "NetworkPolicies|Network"
msgstr ""
-msgid "NetworkPolicies|Network traffic"
+msgid "NetworkPolicies|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
msgstr ""
-msgid "NetworkPolicies|New policy"
+msgid "NetworkPolicies|Network policy can be created after the environment is loaded successfully."
msgstr ""
-msgid "NetworkPolicies|No policies detected"
+msgid "NetworkPolicies|Network traffic"
msgstr ""
msgid "NetworkPolicies|None selected"
@@ -22233,21 +22550,12 @@ msgstr ""
msgid "NetworkPolicies|Please %{installLinkStart}install%{installLinkEnd} and %{configureLinkStart}configure a Kubernetes Agent for this project%{configureLinkEnd} to enable alerts."
msgstr ""
-msgid "NetworkPolicies|Policies are a specification of how groups of pods are allowed to communicate with each other's network endpoints."
-msgstr ""
-
msgid "NetworkPolicies|Policy %{policyName} was successfully changed"
msgstr ""
msgid "NetworkPolicies|Policy definition"
msgstr ""
-msgid "NetworkPolicies|Policy editor"
-msgstr ""
-
-msgid "NetworkPolicies|Policy preview"
-msgstr ""
-
msgid "NetworkPolicies|Rule"
msgstr ""
@@ -22257,9 +22565,6 @@ msgstr ""
msgid "NetworkPolicies|Rule mode is unavailable for this policy. In some cases, we cannot parse the YAML file back into the rules editor."
msgstr ""
-msgid "NetworkPolicies|Rules"
-msgstr ""
-
msgid "NetworkPolicies|Save changes"
msgstr ""
@@ -22272,9 +22577,6 @@ msgstr ""
msgid "NetworkPolicies|Traffic that does not match any rule will be blocked."
msgstr ""
-msgid "NetworkPolicies|Unable to parse policy"
-msgstr ""
-
msgid "NetworkPolicies|all DNS names"
msgstr ""
@@ -22454,6 +22756,9 @@ msgstr ""
msgid "New issue"
msgstr ""
+msgid "New issue in %{project}"
+msgstr ""
+
msgid "New issue title"
msgstr ""
@@ -22532,7 +22837,7 @@ msgstr ""
msgid "Newest first"
msgstr ""
-msgid "Newly registered users will by default be external"
+msgid "Newly-registered users are external by default"
msgstr ""
msgid "Next"
@@ -22847,8 +23152,10 @@ msgstr ""
msgid "No webhooks found, add one in the form above."
msgstr ""
-msgid "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} to renew your subscription."
-msgstr ""
+msgid "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} day to renew your subscription."
+msgid_plural "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} days to renew your subscription."
+msgstr[0] ""
+msgstr[1] ""
msgid "No. of commits"
msgstr ""
@@ -22865,7 +23172,7 @@ msgstr ""
msgid "Nodes"
msgstr ""
-msgid "Non-admin users can sign in with read-only access and make read-only API requests."
+msgid "Non-admin users are restricted to read-only access, in both GitLab UI and API."
msgstr ""
msgid "None"
@@ -22946,7 +23253,7 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
-msgid "Notes Rate Limits"
+msgid "Notes rate limit"
msgstr ""
msgid "Notes|Are you sure you want to cancel creating this comment?"
@@ -23113,9 +23420,6 @@ msgstr ""
msgid "November"
msgstr ""
-msgid "Novice"
-msgstr ""
-
msgid "Now, personalize your GitLab experience"
msgstr ""
@@ -23284,7 +23588,7 @@ msgstr ""
msgid "OnCallSchedules|For this rotation, on-call will be:"
msgstr ""
-msgid "OnCallSchedules|On-call schedule %{schedule} in Project %{project}"
+msgid "OnCallSchedules|On-call schedule %{obstacle} in Project %{project}"
msgstr ""
msgid "OnCallSchedules|On-call schedules"
@@ -23431,22 +23735,22 @@ msgstr ""
msgid "OnDemandScans|Scanner profile"
msgstr ""
-msgid "OnDemandScans|Select one of the existing profiles"
+msgid "OnDemandScans|Schedule scan"
msgstr ""
-msgid "OnDemandScans|Site profile"
+msgid "OnDemandScans|Select one of the existing profiles"
msgstr ""
-msgid "OnDemandScans|Use existing scanner profile"
+msgid "OnDemandScans|Site profile"
msgstr ""
-msgid "OnDemandScans|Use existing site profile"
+msgid "OnDemandScans|Start time"
msgstr ""
-msgid "OnDemandScans|You can either choose a passive scan or validate the target site in your chosen site profile. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
+msgid "OnDemandScans|Use existing scanner profile"
msgstr ""
-msgid "OnDemandScans|You cannot run an active scan against an unvalidated site."
+msgid "OnDemandScans|Use existing site profile"
msgstr ""
msgid "OnDemandScans|You must create a repository within your project to run an on-demand scan."
@@ -23511,6 +23815,9 @@ msgstr ""
msgid "Only admins can delete project"
msgstr ""
+msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
+msgstr ""
+
msgid "Only include features new to your current subscription tier."
msgstr ""
@@ -23529,6 +23836,12 @@ msgstr ""
msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
+msgid "Only reCAPTCHA v2 is supported:"
+msgstr ""
+
+msgid "Only users from the specified IP address ranges are able to reach this group, including all subgroups, projects, and Git repositories."
+msgstr ""
+
msgid "Only verified users with an email address in any of these domains can be added to the group."
msgstr ""
@@ -23715,9 +24028,6 @@ msgstr ""
msgid "Package Registry"
msgstr ""
-msgid "Package Registry Rate Limits"
-msgstr ""
-
msgid "Package Registry: authenticated API requests"
msgstr ""
@@ -23736,6 +24046,9 @@ msgstr ""
msgid "Package recipe already exists"
msgstr ""
+msgid "Package registry rate limits"
+msgstr ""
+
msgid "Package type"
msgstr ""
@@ -23802,6 +24115,9 @@ msgstr ""
msgid "PackageRegistry|Composer"
msgstr ""
+msgid "PackageRegistry|Composer.json with license: %{license} and version: %{version}"
+msgstr ""
+
msgid "PackageRegistry|Conan"
msgstr ""
@@ -23865,6 +24181,9 @@ msgstr ""
msgid "PackageRegistry|Copy require package include"
msgstr ""
+msgid "PackageRegistry|Copy target SHA"
+msgstr ""
+
msgid "PackageRegistry|Copy yarn command"
msgstr ""
@@ -23931,6 +24250,9 @@ msgstr ""
msgid "PackageRegistry|Install package version"
msgstr ""
+msgid "PackageRegistry|Instance-level"
+msgstr ""
+
msgid "PackageRegistry|Invalid Package: failed metadata extraction"
msgstr ""
@@ -23976,6 +24298,9 @@ msgstr ""
msgid "PackageRegistry|Pip Command"
msgstr ""
+msgid "PackageRegistry|Project-level"
+msgstr ""
+
msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
msgstr ""
@@ -23997,6 +24322,9 @@ msgstr ""
msgid "PackageRegistry|Remove package"
msgstr ""
+msgid "PackageRegistry|Required Python: %{pythonVersion}"
+msgstr ""
+
msgid "PackageRegistry|RubyGems"
msgstr ""
@@ -24039,6 +24367,9 @@ msgstr ""
msgid "PackageRegistry|Source project located at %{link}"
msgstr ""
+msgid "PackageRegistry|Target SHA: %{sha}"
+msgstr ""
+
msgid "PackageRegistry|There are no other versions of this package."
msgstr ""
@@ -24207,6 +24538,18 @@ msgstr ""
msgid "Password was successfully updated. Please sign in again."
msgstr ""
+msgid "PasswordPrompt|Confirm password"
+msgstr ""
+
+msgid "PasswordPrompt|Confirm password to continue"
+msgstr ""
+
+msgid "PasswordPrompt|Password is required"
+msgstr ""
+
+msgid "PasswordPrompt|Please enter your password to confirm"
+msgstr ""
+
msgid "Passwords should be unique and not used for any other sites or services."
msgstr ""
@@ -24234,6 +24577,9 @@ msgstr ""
msgid "Paste project path (i.e. gitlab-org/gitlab)"
msgstr ""
+msgid "Paste this DSN into your Sentry SDK"
+msgstr ""
+
msgid "Paste your public SSH key, which is usually contained in the file '~/.ssh/id_ed25519.pub' or '~/.ssh/id_rsa.pub' and begins with 'ssh-ed25519' or 'ssh-rsa'. Do not paste your private SSH key, as that can compromise your identity."
msgstr ""
@@ -24318,6 +24664,9 @@ msgstr ""
msgid "PerformanceBar|First Contentful Paint"
msgstr ""
+msgid "PerformanceBar|Flamegraph with mode:"
+msgstr ""
+
msgid "PerformanceBar|Frontend resources"
msgstr ""
@@ -24351,6 +24700,15 @@ msgstr ""
msgid "PerformanceBar|Trace"
msgstr ""
+msgid "PerformanceBar|cpu"
+msgstr ""
+
+msgid "PerformanceBar|object"
+msgstr ""
+
+msgid "PerformanceBar|wall"
+msgstr ""
+
msgid "Period in seconds"
msgstr ""
@@ -24579,6 +24937,48 @@ msgstr ""
msgid "PipelineSchedules|Variables"
msgstr ""
+msgid "PipelineSource|API"
+msgstr ""
+
+msgid "PipelineSource|Chat"
+msgstr ""
+
+msgid "PipelineSource|External"
+msgstr ""
+
+msgid "PipelineSource|External Pull Request"
+msgstr ""
+
+msgid "PipelineSource|Merge Request"
+msgstr ""
+
+msgid "PipelineSource|On-Demand DAST Scan"
+msgstr ""
+
+msgid "PipelineSource|On-Demand DAST Validation"
+msgstr ""
+
+msgid "PipelineSource|Parent Pipeline"
+msgstr ""
+
+msgid "PipelineSource|Pipeline"
+msgstr ""
+
+msgid "PipelineSource|Push"
+msgstr ""
+
+msgid "PipelineSource|Schedule"
+msgstr ""
+
+msgid "PipelineSource|Trigger"
+msgstr ""
+
+msgid "PipelineSource|Web"
+msgstr ""
+
+msgid "PipelineSource|Web IDE"
+msgstr ""
+
msgid "PipelineStatusTooltip|Pipeline: %{ciStatus}"
msgstr ""
@@ -24879,46 +25279,7 @@ msgstr ""
msgid "Pipeline|Source"
msgstr ""
-msgid "Pipeline|Source|API"
-msgstr ""
-
-msgid "Pipeline|Source|Chat"
-msgstr ""
-
-msgid "Pipeline|Source|External"
-msgstr ""
-
-msgid "Pipeline|Source|External Pull Request"
-msgstr ""
-
-msgid "Pipeline|Source|Merge Request"
-msgstr ""
-
-msgid "Pipeline|Source|On-Demand DAST Scan"
-msgstr ""
-
-msgid "Pipeline|Source|On-Demand DAST Validation"
-msgstr ""
-
-msgid "Pipeline|Source|Parent Pipeline"
-msgstr ""
-
-msgid "Pipeline|Source|Pipeline"
-msgstr ""
-
-msgid "Pipeline|Source|Push"
-msgstr ""
-
-msgid "Pipeline|Source|Schedule"
-msgstr ""
-
-msgid "Pipeline|Source|Trigger"
-msgstr ""
-
-msgid "Pipeline|Source|Web"
-msgstr ""
-
-msgid "Pipeline|Source|Web IDE"
+msgid "Pipeline|Source|Security Policy"
msgstr ""
msgid "Pipeline|Specify variable values to be used in this run. The values specified in %{linkStart}CI/CD settings%{linkEnd} will be used by default."
@@ -24969,7 +25330,7 @@ msgstr ""
msgid "Pipeline|We are currently unable to fetch pipeline data"
msgstr ""
-msgid "Pipeline|You’re about to stop pipeline %{pipelineId}."
+msgid "Pipeline|You’re about to stop pipeline #%{pipelineId}."
msgstr ""
msgid "Pipeline|for"
@@ -24996,6 +25357,9 @@ msgstr ""
msgid "Plain diff"
msgstr ""
+msgid "Plain-text response to send to clients that hit a rate limit"
+msgstr ""
+
msgid "Plan:"
msgstr ""
@@ -25140,9 +25504,6 @@ msgstr ""
msgid "Please provide attributes to update"
msgstr ""
-msgid "Please provide your username or email address."
-msgstr ""
-
msgid "Please reach out if you have any questions and we'll be happy to assist."
msgstr ""
@@ -25185,9 +25546,6 @@ msgstr ""
msgid "Please set a new password before proceeding."
msgstr ""
-msgid "Please share your feedback about %{featureName} %{linkStart}in this issue%{linkEnd} to help us improve the experience."
-msgstr ""
-
msgid "Please solve the captcha"
msgstr ""
@@ -25365,6 +25723,9 @@ msgstr ""
msgid "Prevent adding new members to project membership within this group"
msgstr ""
+msgid "Prevent auto-stopping"
+msgstr ""
+
msgid "Prevent editing approval rules in projects and merge requests."
msgstr ""
@@ -25377,7 +25738,7 @@ msgstr ""
msgid "Prevent users from changing their profile name"
msgstr ""
-msgid "Prevent users from performing write operations on GitLab while performing maintenance."
+msgid "Prevent users from performing write operations while GitLab maintenance is in progress."
msgstr ""
msgid "Preview"
@@ -25650,6 +26011,9 @@ msgstr ""
msgid "Profiles|Enter your name, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Enter your password to confirm the email change"
+msgstr ""
+
msgid "Profiles|Enter your pronouns to let people know how to refer to you"
msgstr ""
@@ -25884,10 +26248,10 @@ msgstr ""
msgid "Profiles|e.g. My MacBook key"
msgstr ""
-msgid "Profiles|username"
+msgid "Profiles|https://website.com"
msgstr ""
-msgid "Profiles|website.com"
+msgid "Profiles|username"
msgstr ""
msgid "Profiles|your account"
@@ -26130,9 +26494,21 @@ msgstr ""
msgid "ProjectSelect| or group"
msgstr ""
+msgid "ProjectSelect|No matching results"
+msgstr ""
+
msgid "ProjectSelect|Search for project"
msgstr ""
+msgid "ProjectSelect|Search projects"
+msgstr ""
+
+msgid "ProjectSelect|Select a project"
+msgstr ""
+
+msgid "ProjectSelect|There was an error fetching the projects. Please try again."
+msgstr ""
+
msgid "ProjectService|Drone server URL"
msgstr ""
@@ -26220,6 +26596,9 @@ msgstr ""
msgid "ProjectService|Trigger event when a new, unique alert is recorded."
msgstr ""
+msgid "ProjectService|Trigger event when a new, unique vulnerability is recorded. (Note: This feature requires an Ultimate plan.)"
+msgstr ""
+
msgid "ProjectService|Trigger event when a pipeline status changes."
msgstr ""
@@ -26634,9 +27013,15 @@ msgstr ""
msgid "Projects are graded based on the highest severity vulnerability present"
msgstr ""
+msgid "Projects are organized into groups"
+msgstr ""
+
msgid "Projects contributed to"
msgstr ""
+msgid "Projects help you organize your work. They contain your file repository, issues, merge requests, and so much more."
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr ""
@@ -26871,10 +27256,10 @@ msgstr ""
msgid "PrometheusService|Prometheus cluster integration"
msgstr ""
-msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
+msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
msgstr ""
-msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
+msgid "PrometheusService|The ID of the IAP-secured resource."
msgstr ""
msgid "PrometheusService|The Prometheus API base URL."
@@ -27492,6 +27877,9 @@ msgstr ""
msgid "Rate limit"
msgstr ""
+msgid "Rate limits can help reduce request volume (like from crawlers or abusive bots)."
+msgstr ""
+
msgid "Raw blob request rate limit per minute"
msgstr ""
@@ -27504,6 +27892,9 @@ msgstr ""
msgid "Re-authentication required"
msgstr ""
+msgid "Re-import"
+msgstr ""
+
msgid "Re-request review"
msgstr ""
@@ -27525,6 +27916,9 @@ msgstr ""
msgid "Read more about related issues"
msgstr ""
+msgid "Read their documentation."
+msgstr ""
+
msgid "Ready to get started with GitLab? Follow these steps to set up your workspace, plan and commit changes, and deploy your project."
msgstr ""
@@ -27558,6 +27952,9 @@ msgstr ""
msgid "Receive any notifications from GitLab."
msgstr ""
+msgid "Receive notification of abuse reports by email."
+msgstr ""
+
msgid "Receive notifications about your own activity"
msgstr ""
@@ -27701,9 +28098,6 @@ msgstr ""
msgid "Registry setup"
msgstr ""
-msgid "Regulate approvals by authors/committers. Affects all projects."
-msgstr ""
-
msgid "Reindexing Status: %{status} (Slice multiplier: %{multiplier}, Maximum running slices: %{max_slices})"
msgstr ""
@@ -27799,6 +28193,9 @@ msgstr ""
msgid "Release|Something went wrong while saving the release details."
msgstr ""
+msgid "Reload page"
+msgstr ""
+
msgid "Remediations"
msgstr ""
@@ -28081,6 +28478,9 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
+msgid "Repeats"
+msgstr ""
+
msgid "Replace"
msgstr ""
@@ -28443,10 +28843,7 @@ msgstr ""
msgid "Require additional authentication for administrative tasks."
msgstr ""
-msgid "Require all users in this group to setup Two-factor authentication"
-msgstr ""
-
-msgid "Require all users in this group to setup two-factor authentication"
+msgid "Require all users in this group to set up two-factor authentication"
msgstr ""
msgid "Required approvals (%{approvals_given} given)"
@@ -28492,6 +28889,9 @@ msgstr[1] ""
msgid "Requires values to meet regular expression requirements."
msgstr ""
+msgid "Requires you to deploy or set up cloud-hosted Sentry."
+msgstr ""
+
msgid "Requires your primary GitLab email address."
msgstr ""
@@ -28552,9 +28952,6 @@ msgstr ""
msgid "Resolve"
msgstr ""
-msgid "Resolve all threads in new issue"
-msgstr ""
-
msgid "Resolve conflicts"
msgstr ""
@@ -28612,6 +29009,9 @@ msgstr ""
msgid "Response text"
msgstr ""
+msgid "Restart GitLab to apply changes."
+msgstr ""
+
msgid "Restart Terminal"
msgstr ""
@@ -28630,6 +29030,9 @@ msgstr ""
msgid "Restoring the project will prevent the project from being removed on this date and restore people's ability to make changes to it."
msgstr ""
+msgid "Restrict group access by IP address. %{link_start}Learn more%{link_end}."
+msgstr ""
+
msgid "Restrict membership by email domain"
msgstr ""
@@ -28943,6 +29346,9 @@ msgstr ""
msgid "Runners|Runner #%{runner_id}"
msgstr ""
+msgid "Runners|Runner assigned to project."
+msgstr ""
+
msgid "Runners|Runner is offline, last contact was %{runner_contact} ago"
msgstr ""
@@ -28955,6 +29361,9 @@ msgstr ""
msgid "Runners|Runner registration"
msgstr ""
+msgid "Runners|Runner unassigned from project."
+msgstr ""
+
msgid "Runners|Runners"
msgstr ""
@@ -29147,7 +29556,7 @@ msgstr ""
msgid "SastEntryPoints|How do I set up SAST?"
msgstr ""
-msgid "SastEntryPoints|Learn more."
+msgid "SastEntryPoints|Learn more"
msgstr ""
msgid "Satisfied"
@@ -29189,7 +29598,7 @@ msgstr ""
msgid "Save pipeline schedule"
msgstr ""
-msgid "Save space and find images in the container Registry. remove unneeded tags and keep only the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
+msgid "Save storage space by automatically deleting tags from the container registry and keeping the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
msgstr ""
msgid "Saving"
@@ -29363,6 +29772,9 @@ msgstr ""
msgid "Search or filter results…"
msgstr ""
+msgid "Search or jump to..."
+msgstr ""
+
msgid "Search project"
msgstr ""
@@ -29423,16 +29835,16 @@ msgstr ""
msgid "SearchCodeResults|of %{link_to_project}"
msgstr ""
-msgid "SearchResults|Showing %{count} %{scope} for%{term_element}"
+msgid "SearchResults|Showing %{count} %{scope} for %{term_element}"
msgstr ""
-msgid "SearchResults|Showing %{count} %{scope} for%{term_element} in your personal and project snippets"
+msgid "SearchResults|Showing %{count} %{scope} for %{term_element} in your personal and project snippets"
msgstr ""
-msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for%{term_element}"
+msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for %{term_element}"
msgstr ""
-msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for%{term_element} in your personal and project snippets"
+msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for %{term_element} in your personal and project snippets"
msgstr ""
msgid "SearchResults|code result"
@@ -29514,6 +29926,9 @@ msgstr ""
msgid "Secret Detection"
msgstr ""
+msgid "Secret access key"
+msgstr ""
+
msgid "Secret token"
msgstr ""
@@ -29553,9 +29968,6 @@ msgstr ""
msgid "SecurityApprovals|A merge request approval is required when the license compliance report contains a denied license."
msgstr ""
-msgid "SecurityApprovals|Configurable if security scanners are enabled. %{linkStart}Learn more.%{linkEnd}"
-msgstr ""
-
msgid "SecurityApprovals|Coverage-Check"
msgstr ""
@@ -29568,24 +29980,18 @@ msgstr ""
msgid "SecurityApprovals|Learn more about Vulnerability-Check"
msgstr ""
-msgid "SecurityApprovals|License Scanning must be enabled. %{linkStart}Learn more%{linkEnd}."
-msgstr ""
-
msgid "SecurityApprovals|License-Check"
msgstr ""
msgid "SecurityApprovals|Requires approval for Denied licenses. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}More information%{linkEnd}"
+msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "SecurityApprovals|Requires approval for vulnerabilities. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
-msgid "SecurityApprovals|Test coverage must be enabled. %{linkStart}Learn more%{linkEnd}."
-msgstr ""
-
msgid "SecurityApprovals|Vulnerability-Check"
msgstr ""
@@ -29649,6 +30055,12 @@ msgstr ""
msgid "SecurityConfiguration|Immediately begin risk analysis and remediation with application security features. Start with SAST and Secret Detection, available to all plans. Upgrade to Ultimate to get all features, including:"
msgstr ""
+msgid "SecurityConfiguration|Manage corpus"
+msgstr ""
+
+msgid "SecurityConfiguration|Manage corpus files used as mutation sources in coverage fuzzing."
+msgstr ""
+
msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
msgstr ""
@@ -29703,6 +30115,12 @@ msgstr ""
msgid "SecurityOrchestration|Action"
msgstr ""
+msgid "SecurityOrchestration|Actions"
+msgstr ""
+
+msgid "SecurityOrchestration|Add rule"
+msgstr ""
+
msgid "SecurityOrchestration|All policies"
msgstr ""
@@ -29736,9 +30154,6 @@ msgstr ""
msgid "SecurityOrchestration|Network"
msgstr ""
-msgid "SecurityOrchestration|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
-msgstr ""
-
msgid "SecurityOrchestration|New policy"
msgstr ""
@@ -29754,6 +30169,9 @@ msgstr ""
msgid "SecurityOrchestration|Policy editor"
msgstr ""
+msgid "SecurityOrchestration|Policy preview"
+msgstr ""
+
msgid "SecurityOrchestration|Policy status"
msgstr ""
@@ -29763,6 +30181,9 @@ msgstr ""
msgid "SecurityOrchestration|Rule"
msgstr ""
+msgid "SecurityOrchestration|Rules"
+msgstr ""
+
msgid "SecurityOrchestration|Scan Execution"
msgstr ""
@@ -29856,6 +30277,9 @@ msgstr ""
msgid "SecurityReports|Create issue"
msgstr ""
+msgid "SecurityReports|Development vulnerabilities"
+msgstr ""
+
msgid "SecurityReports|Dismiss vulnerability"
msgstr ""
@@ -29871,6 +30295,9 @@ msgstr ""
msgid "SecurityReports|Download results"
msgstr ""
+msgid "SecurityReports|Download scanned URLs"
+msgstr ""
+
msgid "SecurityReports|Download scanned resources"
msgstr ""
@@ -29994,6 +30421,9 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
+msgid "SecurityReports|The Vulnerability Report shows the results of the lastest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "SecurityReports|The security reports below contain one or more vulnerability findings that could not be parsed and were not recorded. Download the artifacts in the job output to investigate. Ensure any security report created conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
msgstr ""
@@ -30135,10 +30565,10 @@ msgstr ""
msgid "Select a repository"
msgstr ""
-msgid "Select a role"
+msgid "Select a repository containing templates for common files."
msgstr ""
-msgid "Select a shared template repository for all projects on this instance."
+msgid "Select a role"
msgstr ""
msgid "Select a template repository"
@@ -30216,6 +30646,9 @@ msgstr ""
msgid "Select project to choose zone"
msgstr ""
+msgid "Select project to create issue"
+msgstr ""
+
msgid "Select projects"
msgstr ""
@@ -30333,6 +30766,9 @@ msgstr ""
msgid "Send emails to help guide new users through the onboarding process."
msgstr ""
+msgid "Send emails to users upon account deactivation."
+msgstr ""
+
msgid "Send message"
msgstr ""
@@ -30351,6 +30787,9 @@ msgstr ""
msgid "Send service data"
msgstr ""
+msgid "Sentry"
+msgstr ""
+
msgid "Sentry API URL"
msgstr ""
@@ -30465,6 +30904,9 @@ msgstr ""
msgid "Service"
msgstr ""
+msgid "Service Accounts keys are required to authorize GitLab to deploy your Google Cloud project."
+msgstr ""
+
msgid "Service Desk"
msgstr ""
@@ -30537,15 +30979,15 @@ msgstr ""
msgid "Set a password on your account to pull or push via %{protocol}."
msgstr ""
-msgid "Set a template repository for projects in this group"
-msgstr ""
-
msgid "Set access permissions for this token."
msgstr ""
msgid "Set an instance-wide domain that will be available to all clusters when installing Knative."
msgstr ""
+msgid "Set any rate limit to %{code_open}0%{code_close} to disable the limit."
+msgstr ""
+
msgid "Set default and restrict visibility levels. Configure import sources and git access protocol."
msgstr ""
@@ -30558,7 +31000,7 @@ msgstr ""
msgid "Set limit to 0 to allow any file size."
msgstr ""
-msgid "Set max session time for web terminal."
+msgid "Set limits for web and API requests."
msgstr ""
msgid "Set milestone"
@@ -30567,15 +31009,18 @@ msgstr ""
msgid "Set new password"
msgstr ""
-msgid "Set notification email for abuse reports."
+msgid "Set parent epic to an epic"
msgstr ""
-msgid "Set parent epic to an epic"
+msgid "Set per-user rate limits for imports and exports of projects and groups."
msgstr ""
msgid "Set projects and maximum size limits, session duration, user options, and check feature availability for namespace plan."
msgstr ""
+msgid "Set rate limits for package registry API requests that supersede the general user and IP rate limits."
+msgstr ""
+
msgid "Set severity"
msgstr ""
@@ -30594,15 +31039,24 @@ msgstr ""
msgid "Set the default branch for this project. All merge requests and commits are made against this branch unless you specify a different one."
msgstr ""
+msgid "Set the default expiration time for job artifacts in all projects. Set to %{code_open}0%{code_close} to never expire artifacts by default. If no unit is written, it defaults to seconds. For example, these are all equivalent: %{code_open}3600%{code_close}, %{code_open}60 minutes%{code_close}, or %{code_open}one hour%{code_close}."
+msgstr ""
+
msgid "Set the due date to %{due_date}."
msgstr ""
msgid "Set the iteration to %{iteration_reference}."
msgstr ""
+msgid "Set the maximum session time for a web terminal."
+msgstr ""
+
msgid "Set the milestone to %{milestone_reference}."
msgstr ""
+msgid "Set the per-user rate limit for notes created by web or API requests."
+msgstr ""
+
msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
msgstr ""
@@ -30804,6 +31258,9 @@ msgstr ""
msgid "Show Pipeline IID"
msgstr ""
+msgid "Show all %{issuable_type}."
+msgstr ""
+
msgid "Show all activity"
msgstr ""
@@ -30855,15 +31312,9 @@ msgstr ""
msgid "Show list"
msgstr ""
-msgid "Show me advanced features"
-msgstr ""
-
msgid "Show me how to add a pipeline"
msgstr ""
-msgid "Show me the basics"
-msgstr ""
-
msgid "Show one file at a time"
msgstr ""
@@ -30904,15 +31355,15 @@ msgstr ""
msgid "Showing %{pageSize} of %{total} %{issuableType}"
msgstr ""
-msgid "Showing %{pageSize} of %{total} issues"
-msgstr ""
-
msgid "Showing all epics"
msgstr ""
msgid "Showing all issues"
msgstr ""
+msgid "Showing data for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
+msgstr ""
+
msgid "Showing data for workflow items created in this date range. Date range cannot exceed %{maxDateRange} days."
msgstr ""
@@ -30952,6 +31403,15 @@ msgstr ""
msgid "Sidebar|Weight"
msgstr ""
+msgid "Sidekiq job compression threshold (bytes)"
+msgstr ""
+
+msgid "Sidekiq job size limit (bytes)"
+msgstr ""
+
+msgid "Sidekiq job size limits"
+msgstr ""
+
msgid "Sign in"
msgstr ""
@@ -31072,6 +31532,9 @@ msgstr ""
msgid "Site profile not found for given parameters"
msgstr ""
+msgid "Sites"
+msgstr ""
+
msgid "Size"
msgstr ""
@@ -31102,19 +31565,22 @@ msgstr ""
msgid "SlackIntegration|Sends notifications about project events to Slack channels."
msgstr ""
-msgid "SlackService|2. Paste the %{strong_open}Token%{strong_close} into the field below"
+msgid "SlackService|1. %{slash_command_link_start}Add a slash command%{slash_command_link_end} in your Slack team using this information:"
msgstr ""
-msgid "SlackService|3. Select the %{strong_open}Active%{strong_close} checkbox, press %{strong_open}Save changes%{strong_close} and start using GitLab inside Slack!"
+msgid "SlackService|2. Paste the token from Slack in the %{strong_open}Token%{strong_close} field below."
msgstr ""
-msgid "SlackService|Fill in the word that works best for your team."
+msgid "SlackService|3. Select the %{strong_open}Active%{strong_close} checkbox, select %{strong_open}Save changes%{strong_close}, and start using slash commands in Slack!"
+msgstr ""
+
+msgid "SlackService|After setup, get a list of available Slack slash commands by entering"
msgstr ""
-msgid "SlackService|See list of available commands in Slack after setting up this service, by entering"
+msgid "SlackService|Fill in the word that works best for your team."
msgstr ""
-msgid "SlackService|This service allows users to perform common operations on this project by entering slash commands in Slack."
+msgid "SlackService|Perform common operations in this project by entering slash commands in Slack."
msgstr ""
msgid "Slice multiplier"
@@ -31180,7 +31646,7 @@ msgstr ""
msgid "Some child epics may be hidden due to applied filters"
msgstr ""
-msgid "Some common domains are not allowed. %{read_more_link}."
+msgid "Some common domains are not allowed. %{learn_more_link}."
msgstr ""
msgid "Some of the designs you tried uploading did not change:"
@@ -31264,9 +31730,6 @@ msgstr ""
msgid "Something went wrong while exporting requirements"
msgstr ""
-msgid "Something went wrong while fetching %{listType} list"
-msgstr ""
-
msgid "Something went wrong while fetching branches"
msgstr ""
@@ -31321,15 +31784,9 @@ msgstr ""
msgid "Something went wrong while merging this merge request. Please try again."
msgstr ""
-msgid "Something went wrong while moving issues."
-msgstr ""
-
msgid "Something went wrong while obtaining the Let's Encrypt certificate."
msgstr ""
-msgid "Something went wrong while performing the action."
-msgstr ""
-
msgid "Something went wrong while promoting the issue to an epic. Please try again."
msgstr ""
@@ -31657,7 +32114,10 @@ msgstr ""
msgid "SourcegraphPreferences|Uses a custom %{linkStart}Sourcegraph instance%{linkEnd}."
msgstr ""
-msgid "Spam Check API Key"
+msgid "Spam Check"
+msgstr ""
+
+msgid "Spam Check API key"
msgstr ""
msgid "Spam Logs"
@@ -31675,7 +32135,7 @@ msgstr ""
msgid "Specified URL cannot be used: \"%{reason}\""
msgstr ""
-msgid "Specify an e-mail address regex pattern to identify default internal users."
+msgid "Specify an email address regex pattern to identify default internal users."
msgstr ""
msgid "Speed up your pipelines with Needs relationships"
@@ -31930,7 +32390,7 @@ msgstr ""
msgid "StatusCheck|An error occurred fetching the status checks."
msgstr ""
-msgid "StatusCheck|Apply this status check to any branch or a specific protected branch."
+msgid "StatusCheck|Apply this status check to all branches or a specific protected branch."
msgstr ""
msgid "StatusCheck|Check for a status response in Merge Requests. Failures do not block merges. %{link_start}Learn more%{link_end}."
@@ -32269,6 +32729,9 @@ msgstr ""
msgid "Subscriptions"
msgstr ""
+msgid "Subscription|Your subscription for %{strong}%{namespace_name}%{strong_close} has expired and you are now on %{pricing_link_start}the GitLab Free tier%{pricing_link_end}. Don't worry, your data is safe. Get in touch with our support team (%{support_email}). They'll gladly help with your subscription renewal."
+msgstr ""
+
msgid "Subtracted"
msgstr ""
@@ -32497,6 +32960,9 @@ msgstr ""
msgid "SuperSonics|Plan"
msgstr ""
+msgid "SuperSonics|Please agree to the Subscription Agreement"
+msgstr ""
+
msgid "SuperSonics|Ready to get started? A GitLab plan is ideal for scaling organizations and for multi team usage."
msgstr ""
@@ -32527,6 +32993,9 @@ msgstr ""
msgid "SuperSonics|The activation code is not valid. Please make sure to copy it exactly from the Customers Portal or confirmation email. Learn more about %{linkStart}activating your subscription%{linkEnd}."
msgstr ""
+msgid "SuperSonics|The activation code should be a 24-character alphanumeric string"
+msgstr ""
+
msgid "SuperSonics|There is a connectivity issue."
msgstr ""
@@ -32569,9 +33038,15 @@ msgstr ""
msgid "SuperSonics|You do not have an active subscription"
msgstr ""
+msgid "SuperSonics|You have successfully added a license that activates on %{date}. Please see the subscription history table below for more details."
+msgstr ""
+
msgid "SuperSonics|You'll be charged for %{trueUpLinkStart}users over license%{trueUpLinkEnd} on a quarterly or annual basis, depending on the terms of your agreement."
msgstr ""
+msgid "SuperSonics|Your future dated license was successfully added"
+msgstr ""
+
msgid "SuperSonics|Your subscription"
msgstr ""
@@ -32824,7 +33299,7 @@ msgstr ""
msgid "Template to append to all Service Desk issues"
msgstr ""
-msgid "TemplateRepository|Select a repository to make its templates available to all projects. %{link_start}What should the repository contain?%{link_end} "
+msgid "TemplateRepository|Create common files more quickly, and standardize their format."
msgstr ""
msgid "Templates"
@@ -33030,7 +33505,7 @@ msgstr ""
msgid "TestCases|Search test cases"
msgstr ""
-msgid "TestCases|Something went wrong while adding test case to Todo."
+msgid "TestCases|Something went wrong while adding test case to a to-do item."
msgstr ""
msgid "TestCases|Something went wrong while creating a test case."
@@ -33042,7 +33517,7 @@ msgstr ""
msgid "TestCases|Something went wrong while fetching test cases list."
msgstr ""
-msgid "TestCases|Something went wrong while marking test case todo as done."
+msgid "TestCases|Something went wrong while marking test case to-do item as done."
msgstr ""
msgid "TestCases|Something went wrong while moving test case."
@@ -33162,7 +33637,7 @@ msgstr ""
msgid "Thanks for your purchase!"
msgstr ""
-msgid "That is ok, I do not want to renew"
+msgid "That's OK, I don't want to renew"
msgstr ""
msgid "That's it, well done!"
@@ -33185,7 +33660,7 @@ msgid_plural "The %{type} contains the following errors:"
msgstr[0] ""
msgstr[1] ""
-msgid "The API key used by GitLab for accessing the Spam Check service endpoint"
+msgid "The API key used by GitLab for accessing the Spam Check service endpoint."
msgstr ""
msgid "The GitLab subscription service (customers.gitlab.com) is currently experiencing an outage. You can monitor the status and get updates at %{linkStart}status.gitlab.com%{linkEnd}."
@@ -33224,9 +33699,6 @@ msgstr ""
msgid "The URL to use for connecting to Elasticsearch. Use a comma-separated list to support clustering (e.g., \"http://localhost:9200, http://localhost:9201\")."
msgstr ""
-msgid "The Vulnerability Report shows the results of the last successful pipeline run on the default branch."
-msgstr ""
-
msgid "The X509 Certificate to use when mutual TLS is required to communicate with the external authorization service. If left blank, the server certificate is still validated when accessing over HTTPS."
msgstr ""
@@ -33284,9 +33756,6 @@ msgstr ""
msgid "The default branch for this project has been changed. Please update your bookmarks."
msgstr ""
-msgid "The default expiration time for job artifacts. 0 for unlimited. The default unit is in seconds, but you can use other units, for example %{code_open}4 mins 2 sec%{code_close}, %{code_open}2h42min%{code_close}."
-msgstr ""
-
msgid "The dependency list details information about the components used within your project."
msgstr ""
@@ -33478,9 +33947,6 @@ msgstr ""
msgid "The merge conflicts for this merge request have already been resolved. Please return to the merge request."
msgstr ""
-msgid "The merge request can now be merged."
-msgstr ""
-
msgid "The metric must be one of %{metrics}."
msgstr ""
@@ -33856,7 +34322,7 @@ msgstr ""
msgid "There was a problem updating the keep latest artifacts setting."
msgstr ""
-msgid "There was an error %{message} todo."
+msgid "There was an error %{message} to-do item."
msgstr ""
msgid "There was an error adding a To Do."
@@ -33895,6 +34361,9 @@ msgstr ""
msgid "There was an error fetching projects"
msgstr ""
+msgid "There was an error fetching search autocomplete suggestions"
+msgstr ""
+
msgid "There was an error fetching stage total counts"
msgstr ""
@@ -34219,6 +34688,9 @@ msgstr ""
msgid "This field is required."
msgstr ""
+msgid "This form is disabled in preview"
+msgstr ""
+
msgid "This group"
msgstr ""
@@ -34240,9 +34712,6 @@ msgstr ""
msgid "This group is linked to a subscription"
msgstr ""
-msgid "This group, including all subgroups, projects and git repositories, will be reachable from only the specified IP address ranges."
-msgstr ""
-
msgid "This group, its subgroups and projects has been scheduled for removal on %{date}."
msgstr ""
@@ -34522,9 +34991,6 @@ msgstr ""
msgid "This user cannot be unlocked manually from GitLab"
msgstr ""
-msgid "This user does not have a pending request"
-msgstr ""
-
msgid "This user has an unconfirmed email address (%{email}). You may force a confirmation."
msgstr ""
@@ -34633,9 +35099,6 @@ msgstr ""
msgid "ThreatMonitoring|Packet Activity"
msgstr ""
-msgid "ThreatMonitoring|Policies"
-msgstr ""
-
msgid "ThreatMonitoring|Requests"
msgstr ""
@@ -34687,6 +35150,12 @@ msgstr ""
msgid "ThreatMonitoring|View documentation"
msgstr ""
+msgid "Threshold in bytes at which to compress Sidekiq job arguments."
+msgstr ""
+
+msgid "Threshold in bytes at which to reject Sidekiq jobs. Set this to 0 to if you don't want to limit Sidekiq jobs."
+msgstr ""
+
msgid "Throughput"
msgstr ""
@@ -34696,6 +35165,9 @@ msgstr ""
msgid "Time"
msgstr ""
+msgid "Time (in hours) that users are allowed to skip forced configuration of two-factor authentication."
+msgstr ""
+
msgid "Time Spent"
msgstr ""
@@ -34762,7 +35234,7 @@ msgstr ""
msgid "TimeTrackingEstimated|Est"
msgstr ""
-msgid "TimeTracking|%{startTag}Spent: %{endTag}%{timeSpentHumanReadable}"
+msgid "TimeTracking|%{spentStart}Spent: %{spentEnd}"
msgstr ""
msgid "TimeTracking|Estimated:"
@@ -34976,6 +35448,9 @@ msgstr ""
msgid "To access this domain create a new DNS record"
msgstr ""
+msgid "To add a custom suffix, set up a Service Desk email address. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "To add an SSH key you need to %{generate_link_start}generate one%{link_end} or use an %{existing_link_start}existing key%{link_end}."
msgstr ""
@@ -34997,13 +35472,16 @@ msgstr ""
msgid "To connect an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To continue using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
+msgstr ""
+
msgid "To continue, you need to select the link in the confirmation email we sent to verify your email address. If you didn't get our email, select %{strongStart}Resend confirmation email.%{strongEnd}"
msgstr ""
msgid "To define internal users, first enable new users set to external"
msgstr ""
-msgid "To enable Registration Features, make sure \"Enable service ping\" is checked."
+msgid "To enable Registration Features, first enable Service Ping."
msgstr ""
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
@@ -35030,7 +35508,7 @@ msgstr ""
msgid "To get started, use the link below to confirm your account."
msgstr ""
-msgid "To help improve GitLab and its user experience, GitLab will periodically collect usage information."
+msgid "To help improve GitLab and its user experience, GitLab periodically collects usage information."
msgstr ""
msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
@@ -35063,7 +35541,7 @@ msgstr ""
msgid "To preserve performance only %{strong_open}%{display_size} of %{real_size}%{strong_close} files are displayed."
msgstr ""
-msgid "To protect this issue's confidentiality, %{forkLink} and set the fork's visibility to private."
+msgid "To protect this issue's confidentiality, %{linkStart}fork this project%{linkEnd} and set the fork's visibility to private."
msgstr ""
msgid "To protect this issue's confidentiality, a private fork of this project was selected."
@@ -35096,12 +35574,15 @@ msgstr ""
msgid "To set up SAML authentication for your group through an identity provider like Azure, Okta, Onelogin, Ping Identity, or your custom SAML 2.0 provider:"
msgstr ""
-msgid "To set up this service:"
+msgid "To set up this integration:"
msgstr ""
msgid "To specify the notification level per project of a group you belong to, you need to visit project page and change notification level there."
msgstr ""
+msgid "To start using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
+msgstr ""
+
msgid "To unsubscribe from this issue, please paste the following link into your browser:"
msgstr ""
@@ -35689,9 +36170,6 @@ msgstr ""
msgid "Unable to fetch branches list, please close the form and try again"
msgstr ""
-msgid "Unable to fetch unscanned projects"
-msgstr ""
-
msgid "Unable to fetch vulnerable projects"
msgstr ""
@@ -35746,6 +36224,15 @@ msgstr ""
msgid "Unable to update this issue at this time."
msgstr ""
+msgid "Unapprove a merge request"
+msgstr ""
+
+msgid "Unapprove the current merge request."
+msgstr ""
+
+msgid "Unapproved the current merge request."
+msgstr ""
+
msgid "Unarchive project"
msgstr ""
@@ -35758,16 +36245,13 @@ msgstr ""
msgid "Unassigned"
msgstr ""
-msgid "Unauthenticated API request rate limit"
-msgstr ""
-
-msgid "Unauthenticated rate limit period in seconds"
+msgid "Unauthenticated API rate limit period in seconds"
msgstr ""
-msgid "Unauthenticated request rate limit"
+msgid "Unauthenticated requests"
msgstr ""
-msgid "Unauthenticated requests"
+msgid "Unauthenticated web rate limit period in seconds"
msgstr ""
msgid "Undo"
@@ -35869,18 +36353,6 @@ msgstr ""
msgid "Unresolved"
msgstr ""
-msgid "UnscannedProjects|15 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|30 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|5 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|60 or more days"
-msgstr ""
-
msgid "Unschedule job"
msgstr ""
@@ -36100,6 +36572,9 @@ msgstr ""
msgid "UsageQuota|%{help_link_start}Shared runners%{help_link_end} are disabled, so there are no limits set on pipeline usage"
msgstr ""
+msgid "UsageQuota|%{linkTitle} help link"
+msgstr ""
+
msgid "UsageQuota|%{percentageLeft} of purchased storage is available"
msgstr ""
@@ -36109,6 +36584,9 @@ msgstr ""
msgid "UsageQuota|Artifacts is a sum of build and pipeline artifacts."
msgstr ""
+msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
+msgstr ""
+
msgid "UsageQuota|Buy additional minutes"
msgstr ""
@@ -36118,9 +36596,21 @@ msgstr ""
msgid "UsageQuota|CI minutes usage by project"
msgstr ""
+msgid "UsageQuota|Code packages and container images."
+msgstr ""
+
msgid "UsageQuota|Current period usage"
msgstr ""
+msgid "UsageQuota|File attachments and smaller design graphics."
+msgstr ""
+
+msgid "UsageQuota|Git repository, managed by the Gitaly service."
+msgstr ""
+
+msgid "UsageQuota|Includes project registry, artifacts, packages, wiki, uploads and other items."
+msgstr ""
+
msgid "UsageQuota|Increase storage temporarily"
msgstr ""
@@ -36139,6 +36629,9 @@ msgstr ""
msgid "UsageQuota|Packages"
msgstr ""
+msgid "UsageQuota|Pipeline artifacts and job artifacts, created with CI/CD."
+msgstr ""
+
msgid "UsageQuota|Pipelines"
msgstr ""
@@ -36157,6 +36650,9 @@ msgstr ""
msgid "UsageQuota|Seats"
msgstr ""
+msgid "UsageQuota|Shared bits of code and text."
+msgstr ""
+
msgid "UsageQuota|Snippets"
msgstr ""
@@ -36166,6 +36662,12 @@ msgstr ""
msgid "UsageQuota|Storage"
msgstr ""
+msgid "UsageQuota|Storage type"
+msgstr ""
+
+msgid "UsageQuota|There is a known issue with Artifact storage where the total could be incorrect for some projects. More details and progress are available in %{warningLinkStart}the epic%{warningLinkEnd}."
+msgstr ""
+
msgid "UsageQuota|This is the total amount of storage used across your projects within this namespace."
msgstr ""
@@ -36205,6 +36707,9 @@ msgstr ""
msgid "UsageQuota|Usage"
msgstr ""
+msgid "UsageQuota|Usage Breakdown"
+msgstr ""
+
msgid "UsageQuota|Usage Quotas"
msgstr ""
@@ -36229,6 +36734,9 @@ msgstr ""
msgid "UsageQuota|Wiki"
msgstr ""
+msgid "UsageQuota|Wiki content."
+msgstr ""
+
msgid "UsageQuota|Wikis"
msgstr ""
@@ -36445,7 +36953,10 @@ msgstr ""
msgid "User Settings"
msgstr ""
-msgid "User and IP Rate Limits"
+msgid "User and IP rate limits"
+msgstr ""
+
+msgid "User does not have a pending request"
msgstr ""
msgid "User identity was successfully created."
@@ -36742,6 +37253,9 @@ msgstr ""
msgid "Users can launch a development environment from a GitLab browser tab when the %{linkStart}Gitpod%{linkEnd} integration is enabled."
msgstr ""
+msgid "Users can reactivate their account by signing in."
+msgstr ""
+
msgid "Users can render diagrams in AsciiDoc, Markdown, reStructuredText, and Textile documents using Kroki."
msgstr ""
@@ -36757,6 +37271,9 @@ msgstr ""
msgid "Users requesting access to"
msgstr ""
+msgid "Users to exclude from the rate limit"
+msgstr ""
+
msgid "Users were successfully added."
msgstr ""
@@ -36778,6 +37295,9 @@ msgstr ""
msgid "UsersSelect|Unassigned"
msgstr ""
+msgid "Uses GitLab as a lightweight alternative to Sentry."
+msgstr ""
+
msgid "Using %{code_start}::%{code_end} denotes a %{link_start}scoped label set%{link_end}"
msgstr ""
@@ -36808,10 +37328,7 @@ msgstr ""
msgid "Value Stream Analytics can help you determine your team’s velocity"
msgstr ""
-msgid "Value Stream Analytics gives an overview of how much time it takes to go from idea to production in your project."
-msgstr ""
-
-msgid "Value may contain a variable reference"
+msgid "Value might contain a variable reference"
msgstr ""
msgid "Value stream"
@@ -36877,10 +37394,10 @@ msgstr ""
msgid "ValueStream|The Default Value Stream cannot be deleted"
msgstr ""
-msgid "Variable"
+msgid "Values that contain the %{codeStart}$%{codeEnd} character can be considered a variable reference and expanded. %{docsLinkStart}Learn more.%{docsLinkEnd}"
msgstr ""
-msgid "Variable references indicated by %{codeStart}$%{codeEnd} may be expanded. If this is not what you want, consider %{docsLinkStart}using a workaround to prevent expansion%{docsLinkEnd}."
+msgid "Variable"
msgstr ""
msgid "Variable will be masked in job logs."
@@ -37285,6 +37802,9 @@ msgstr ""
msgid "Vulnerability|Evidence"
msgstr ""
+msgid "Vulnerability|False positive detected"
+msgstr ""
+
msgid "Vulnerability|File"
msgstr ""
@@ -37327,6 +37847,9 @@ msgstr ""
msgid "Vulnerability|Status"
msgstr ""
+msgid "Vulnerability|The scanner determined this vulnerability to be a false positive. Verify the evaluation before changing its status. %{linkStart}Learn more about false positive detection.%{linkEnd}"
+msgstr ""
+
msgid "Vulnerability|The unmodified response is the original response that had no mutations done to the request"
msgstr ""
@@ -37651,9 +38174,6 @@ msgstr ""
msgid "Welcome to GitLab,%{br_tag}%{name}!"
msgstr ""
-msgid "Welcome to the guided GitLab tour"
-msgstr ""
-
msgid "Welcome, %{name}!"
msgstr ""
@@ -37672,9 +38192,6 @@ msgstr ""
msgid "What are you searching for?"
msgstr ""
-msgid "What describes you best?"
-msgstr ""
-
msgid "What does this command do?"
msgstr ""
@@ -37696,13 +38213,13 @@ msgstr ""
msgid "What is your job title? (optional)"
msgstr ""
-msgid "What will you use this group for?"
+msgid "What templates can I create?"
msgstr ""
-msgid "What's new"
+msgid "What will you use this group for?"
msgstr ""
-msgid "What’s your experience level?"
+msgid "What's new"
msgstr ""
msgid "When a deployment job is successful, skip older deployment jobs that are still pending."
@@ -37714,6 +38231,9 @@ msgstr ""
msgid "When an event in GitLab triggers a webhook, you can use the request details to figure out if something went wrong."
msgstr ""
+msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+msgstr ""
+
msgid "When inactive, an external authentication provider must be used."
msgstr ""
@@ -37737,6 +38257,9 @@ msgstr ""
msgid "When:"
msgstr ""
+msgid "Which API requests are affected?"
+msgstr ""
+
msgid "While it's rare to have no vulnerabilities, it can happen. In any event, we ask that you please double check your settings to make sure you've set up your dashboard correctly."
msgstr ""
@@ -38016,6 +38539,9 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|Work Items"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -38091,6 +38617,9 @@ msgstr ""
msgid "You are already a member of this %{member_source}."
msgstr ""
+msgid "You are already impersonating another user"
+msgstr ""
+
msgid "You are an admin, which means granting access to %{client_name} will allow them to interact with GitLab as an admin as well. Proceed with caution."
msgstr ""
@@ -38193,6 +38722,9 @@ msgstr ""
msgid "You can also use project access tokens with Git to authenticate over HTTP(S). %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "You can always change your URL later"
+msgstr ""
+
msgid "You can always edit this later"
msgstr ""
@@ -38349,10 +38881,10 @@ msgstr ""
msgid "You can’t %{tag_start}edit%{tag_end} files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
-msgid "You could not create a new trigger."
+msgid "You can’t edit files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
-msgid "You didn't renew your subscription for %{strong}%{namespace_name}%{strong_close} so it was downgraded to the free plan."
+msgid "You could not create a new trigger."
msgstr ""
msgid "You do not have any subscriptions yet"
@@ -38520,6 +39052,12 @@ msgstr ""
msgid "You must provide your current password in order to change it."
msgstr ""
+msgid "You must sign in to search for specific projects."
+msgstr ""
+
+msgid "You must sign in to search for specific terms."
+msgstr ""
+
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
@@ -38547,6 +39085,9 @@ msgstr ""
msgid "You need to upload a GitLab project export archive (ending in .gz)."
msgstr ""
+msgid "You need to verify your primary email first before enabling Two-Factor Authentication."
+msgstr ""
+
msgid "You successfully declined the invitation"
msgstr ""
@@ -38655,10 +39196,10 @@ msgstr ""
msgid "Your %{host} account was signed in to from a new location"
msgstr ""
-msgid "Your %{strong}%{plan_name}%{strong_close} subscription for %{strong}%{namespace_name}%{strong_close} will expire on %{strong}%{expires_on}%{strong_close}."
+msgid "Your %{strong}%{plan_name}%{strong_close} subscription expires on %{strong}%{expires_on}%{strong_close}. After that date, you cannot create issues or merge requests, or use many other features."
msgstr ""
-msgid "Your %{strong}%{plan_name}%{strong_close} subscription will expire on %{strong}%{expires_on}%{strong_close}. After that, you will not be able to create issues or merge requests as well as many other features."
+msgid "Your %{strong}%{plan_name}%{strong_close} subscription for %{strong}%{namespace_name}%{strong_close} will expire on %{strong}%{expires_on}%{strong_close}."
msgstr ""
msgid "Your CI/CD configuration syntax is invalid. View Lint tab for more details."
@@ -38682,7 +39223,7 @@ msgstr ""
msgid "Your GPG keys (%{count})"
msgstr ""
-msgid "Your GitLab account has been locked due to an excessive amount of unsuccessful sign in attempts. Your account will automatically unlock in %{duration} or you may click the link below to unlock now."
+msgid "Your GitLab account has been locked due to an excessive number of unsuccessful sign in attempts. You can wait for your account to automatically unlock in %{duration} or you can click the link below to unlock now."
msgstr ""
msgid "Your GitLab account request has been approved!"
@@ -38793,6 +39334,9 @@ msgstr ""
msgid "Your commit email is used for web based operations, such as edits and merges."
msgstr ""
+msgid "Your current password is required to register a two-factor authenticator app."
+msgstr ""
+
msgid "Your dashboard has been copied. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
@@ -38892,6 +39436,9 @@ msgstr ""
msgid "Your project limit is %{limit} projects! Please contact your administrator to increase it"
msgstr ""
+msgid "Your project will be created at:"
+msgstr ""
+
msgid "Your projects"
msgstr ""
@@ -38931,11 +39478,10 @@ msgstr ""
msgid "Your subscription expired!"
msgstr ""
-msgid "Your subscription has been downgraded."
-msgstr ""
-
-msgid "Your subscription will expire in %{remaining_days}."
-msgstr ""
+msgid "Your subscription will expire in %{remaining_days} day."
+msgid_plural "Your subscription will expire in %{remaining_days} days."
+msgstr[0] ""
+msgstr[1] ""
msgid "Your username is %{username}."
msgstr ""
@@ -39142,6 +39688,9 @@ msgstr ""
msgid "cannot merge"
msgstr ""
+msgid "cannot not be used for user namespace"
+msgstr ""
+
msgid "ciReport|%{degradedNum} degraded"
msgstr ""
@@ -39465,6 +40014,9 @@ msgstr ""
msgid "created %{timeAgo}"
msgstr ""
+msgid "created %{timeAgo} by %{author}"
+msgstr ""
+
msgid "created by"
msgstr ""
@@ -39509,9 +40061,6 @@ msgstr ""
msgid "does not have a supported extension. Only %{extension_list} are supported"
msgstr ""
-msgid "domain is not authorized for sign-up."
-msgstr ""
-
msgid "download it"
msgstr ""
@@ -39529,18 +40078,13 @@ msgstr ""
msgid "email '%{email}' is not a verified email."
msgstr ""
-msgid "email does not match the allowed domain of %{email_domains}"
-msgid_plural "email does not match the allowed domains: %{email_domains}"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "enabled"
msgstr ""
msgid "encrypted: needs to be a :required, :optional or :migrating!"
msgstr ""
-msgid "ending with MIME type format is not allowed."
+msgid "ending with a reserved file extension is not allowed."
msgstr ""
msgid "entries cannot be larger than 255 characters"
@@ -39564,6 +40108,9 @@ msgstr ""
msgid "estimateCommand|%{slash_command} overwrites the total estimated time."
msgstr ""
+msgid "example.com"
+msgstr ""
+
msgid "exceeds the limit of %{bytes} bytes"
msgstr ""
@@ -39614,9 +40161,6 @@ msgstr ""
msgid "fork"
msgstr ""
-msgid "fork this project"
-msgstr ""
-
msgid "from"
msgstr ""
@@ -39625,6 +40169,9 @@ msgid_plural "from %d jobs"
msgstr[0] ""
msgstr[1] ""
+msgid "frontmatter"
+msgstr ""
+
msgid "group"
msgstr ""
@@ -39652,6 +40199,9 @@ msgstr ""
msgid "has been completed."
msgstr ""
+msgid "has too deep level of nesting"
+msgstr ""
+
msgid "help"
msgstr ""
@@ -39685,9 +40235,21 @@ msgstr ""
msgid "in"
msgstr ""
+msgid "in Infrastructure :: Kubernetes clusters"
+msgstr ""
+
+msgid "in all GitLab"
+msgstr ""
+
+msgid "in group"
+msgstr ""
+
msgid "in group %{link_to_group}"
msgstr ""
+msgid "in project"
+msgstr ""
+
msgid "in project %{link_to_project}"
msgstr ""
@@ -39729,16 +40291,19 @@ msgstr ""
msgid "is not a valid X509 certificate."
msgstr ""
-msgid "is not allowed since the group is not top-level group."
+msgid "is not allowed for sign-up."
msgstr ""
-msgid "is not allowed. Try again with a different email address, or contact your GitLab admin."
+msgid "is not allowed for this group."
msgstr ""
-msgid "is not allowed. We do not currently support project-level iterations"
+msgid "is not allowed for this project."
+msgstr ""
+
+msgid "is not allowed since the group is not top-level group."
msgstr ""
-msgid "is not from an allowed domain."
+msgid "is not allowed. We do not currently support project-level iterations"
msgstr ""
msgid "is not in the group enforcing Group Managed Account"
@@ -39831,6 +40396,9 @@ msgstr ""
msgid "log in"
msgstr ""
+msgid "managed"
+msgstr ""
+
msgid "manual"
msgstr ""
@@ -39878,6 +40446,9 @@ msgstr ""
msgid "mrWidget| Please restore it or use a different %{missingBranchName} branch"
msgstr ""
+msgid "mrWidget|%{linkStart}Set up now%{linkEnd} to analyze your source code for known security vulnerabilities."
+msgstr ""
+
msgid "mrWidget|%{mergeError}."
msgstr ""
@@ -39958,6 +40529,9 @@ msgid_plural "mrWidget|Closes issues"
msgstr[0] ""
msgstr[1] ""
+msgid "mrWidget|Create issue to resolve all threads"
+msgstr ""
+
msgid "mrWidget|Delete source branch"
msgstr ""
@@ -39967,12 +40541,18 @@ msgstr ""
msgid "mrWidget|Did not close"
msgstr ""
+msgid "mrWidget|Dismiss"
+msgstr ""
+
msgid "mrWidget|Email patches"
msgstr ""
msgid "mrWidget|Failed to load deployment statistics"
msgstr ""
+msgid "mrWidget|Hide %{widget} details"
+msgstr ""
+
msgid "mrWidget|If the %{missingBranchName} branch exists in your local repository, you can merge this merge request manually using the command line"
msgstr ""
@@ -40068,9 +40648,6 @@ msgstr ""
msgid "mrWidget|Request to merge"
msgstr ""
-msgid "mrWidget|Resolve all threads in new issue"
-msgstr ""
-
msgid "mrWidget|Resolve conflicts"
msgstr ""
@@ -40086,6 +40663,9 @@ msgstr ""
msgid "mrWidget|Revoke approval"
msgstr ""
+msgid "mrWidget|SAST and Secret Detection is not enabled."
+msgstr ""
+
msgid "mrWidget|Set by %{merge_author} to be added to the merge train when the pipeline succeeds"
msgstr ""
@@ -40095,6 +40675,9 @@ msgstr ""
msgid "mrWidget|Set by %{merge_author} to start a merge train when the pipeline succeeds"
msgstr ""
+msgid "mrWidget|Show %{widget} details"
+msgstr ""
+
msgid "mrWidget|The changes were merged into"
msgstr ""
@@ -40107,6 +40690,9 @@ msgstr ""
msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure, or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
msgstr ""
+msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure."
+msgstr ""
+
msgid "mrWidget|The source branch has been deleted"
msgstr ""
@@ -40149,6 +40735,9 @@ msgstr ""
msgid "mrWidget|You can merge after removing denied licenses"
msgstr ""
+msgid "mrWidget|You can only merge once this merge request is approved."
+msgstr ""
+
msgid "mrWidget|Your password"
msgstr ""
@@ -40185,6 +40774,9 @@ msgstr ""
msgid "must be less than the limit of %{tag_limit} tags"
msgstr ""
+msgid "must be set for a project namespace"
+msgstr ""
+
msgid "must be unique by status and elapsed time within a policy"
msgstr ""
@@ -40294,6 +40886,9 @@ msgstr ""
msgid "pipeline"
msgstr ""
+msgid "pipeline schedules documentation"
+msgstr ""
+
msgid "pod_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
msgstr ""
@@ -40343,16 +40938,25 @@ msgstr ""
msgid "project name"
msgstr ""
+msgid "project namespace cannot be the parent of another namespace"
+msgstr ""
+
msgid "projects"
msgstr ""
msgid "quick actions"
msgstr ""
-msgid "reCAPTCHA Private Key"
+msgid "reCAPTCHA"
+msgstr ""
+
+msgid "reCAPTCHA helps prevent credential stuffing."
msgstr ""
-msgid "reCAPTCHA Site Key"
+msgid "reCAPTCHA private key"
+msgstr ""
+
+msgid "reCAPTCHA site key"
msgstr ""
msgid "recent activity"
@@ -40579,6 +41183,9 @@ msgstr ""
msgid "user avatar"
msgstr ""
+msgid "user namespace cannot be the parent of another namespace"
+msgstr ""
+
msgid "user preferences"
msgstr ""
@@ -40671,3 +41278,9 @@ msgstr ""
msgid "your settings"
msgstr ""
+msgid "{group}"
+msgstr ""
+
+msgid "{project}"
+msgstr ""
+
diff --git a/locale/kab/gitlab.po b/locale/kab/gitlab.po
index d7e0bbce6ee..a6908028541 100644
--- a/locale/kab/gitlab.po
+++ b/locale/kab/gitlab.po
@@ -14,10 +14,7 @@ msgstr ""
"X-Crowdin-Language: kab\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-09-01 22:34\n"
-
-msgid " %{name}, confirm your email address now! "
-msgstr ""
+"PO-Revision-Date: 2021-10-04 20:24\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -92,6 +89,16 @@ msgstr ""
msgid "#general, #development"
msgstr ""
+msgid "%d Alert"
+msgid_plural "%d Alerts"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d Alert:"
+msgid_plural "%d Alerts:"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d Approval"
msgid_plural "%d Approvals"
msgstr[0] ""
@@ -455,7 +462,10 @@ msgstr ""
msgid "%{code_open}Protected:%{code_close} Only exposed to protected branches or tags."
msgstr ""
-msgid "%{commit_author_link} authored %{commit_timeago}"
+msgid "%{commit_author_link} authored %{commit_authored_timeago}"
+msgstr ""
+
+msgid "%{commit_author_link} authored %{commit_authored_timeago} and %{commit_committer_avatar} %{commit_committer_link} committed %{commit_committer_timeago}"
msgstr ""
msgid "%{completedCount} completed weight"
@@ -549,6 +559,15 @@ msgstr ""
msgid "%{doc_link_start}Advanced search%{doc_link_end} is enabled."
msgstr ""
+msgid "%{docs_link_start}Learn about visibility levels.%{docs_link_end}"
+msgstr ""
+
+msgid "%{docs_link_start}What is Large File Storage?%{docs_link_end}"
+msgstr ""
+
+msgid "%{docs_link_start}What is two-factor authentication?%{docs_link_end}"
+msgstr ""
+
msgid "%{due_date} (Past due)"
msgstr ""
@@ -621,9 +640,6 @@ msgstr ""
msgid "%{issueType} actions"
msgstr ""
-msgid "%{issuesCount} issues with a limit of %{maxIssueCount}"
-msgstr ""
-
msgid "%{issuesSize} with a limit of %{maxIssueCount}"
msgstr ""
@@ -681,6 +697,12 @@ msgstr ""
msgid "%{label_for_message} unavailable"
msgstr ""
+msgid "%{learn_more_link}."
+msgstr ""
+
+msgid "%{lessThan} 1 hour"
+msgstr ""
+
msgid "%{lets_encrypt_link_start}Let's Encrypt%{lets_encrypt_link_end} is a free, automated, and open certificate authority (CA) that issues digital certificates to enable HTTPS (SSL/TLS) for sites."
msgstr ""
@@ -693,15 +715,15 @@ msgstr ""
msgid "%{link_start}Learn more%{link_end} about roles."
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
-msgstr ""
-
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
msgstr ""
msgid "%{link_start}Start the title with %{draft_snippet}%{link_end} to prevent a merge request that is a work in progress from being merged before it's ready."
msgstr ""
+msgid "%{link_start}What information does GitLab Inc. collect?%{link_end}"
+msgstr ""
+
msgid "%{listToShow}, and %{awardsListLength} more"
msgstr ""
@@ -854,7 +876,7 @@ msgid_plural "%{securityScanner} results are not available because a pipeline ha
msgstr[0] ""
msgstr[1] ""
-msgid "%{service_ping_link_start}Learn more%{service_ping_link_end} about what information is shared with GitLab Inc."
+msgid "%{service_ping_link_start}What information is shared with GitLab Inc.?%{service_ping_link_end}"
msgstr ""
msgid "%{size} %{unit}"
@@ -890,6 +912,9 @@ msgstr ""
msgid "%{state} epics"
msgstr ""
+msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
+msgstr ""
+
msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
msgstr ""
@@ -949,11 +974,6 @@ msgstr ""
msgid "%{template_project_id} is unknown or invalid"
msgstr ""
-msgid "%{text} %{files}"
-msgid_plural "%{text} %{files} files"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%{text} is available"
msgstr ""
@@ -1038,9 +1058,6 @@ msgstr ""
msgid "%{wildcards_link_start}Wildcards%{wildcards_link_end} such as %{code_tag_start}v*%{code_tag_end} or %{code_tag_start}*-release%{code_tag_end} are supported."
msgstr ""
-msgid "&lt; 1 hour"
-msgstr ""
-
msgid "'%{data}' at %{location} does not match format: %{format}"
msgstr ""
@@ -1124,9 +1141,6 @@ msgstr ""
msgid "(we need your current password to confirm your changes)"
msgstr ""
-msgid "* * * * *"
-msgstr ""
-
msgid "+ %{amount} more"
msgstr ""
@@ -1193,10 +1207,10 @@ msgstr ""
msgid "."
msgstr ""
-msgid "0 bytes"
+msgid "/"
msgstr ""
-msgid "0 for unlimited, only effective with remote storage enabled."
+msgid "0 bytes"
msgstr ""
msgid "0t1DgySidms"
@@ -1326,6 +1340,9 @@ msgstr ""
msgid "1000+"
msgstr ""
+msgid "192.168.0.0/24"
+msgstr ""
+
msgid "1st contribution!"
msgstr ""
@@ -1479,9 +1496,6 @@ msgstr ""
msgid "A plain HTML site that uses Netlify for CI/CD instead of GitLab, but still with all the other great GitLab features"
msgstr ""
-msgid "A plain-text response to show to clients that hit the rate limit."
-msgstr ""
-
msgid "A platform value can be web, mob or app."
msgstr ""
@@ -1563,7 +1577,7 @@ msgstr ""
msgid "APIFuzzing|Configure HTTP basic authentication values. Other authentication methods are supported. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
+msgid "APIFuzzing|Customize your project's API fuzzing configuration options and copy the code snippet to your .gitlab-ci.yml file to apply any changes. Note that this tool does not reflect or update your .gitlab-ci.yml file automatically. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
msgstr ""
msgid "APIFuzzing|Enable authentication"
@@ -1626,9 +1640,6 @@ msgstr ""
msgid "APIFuzzing|To prevent a security leak, authentication info must be added as a %{ciVariablesLinkStart}CI variable%{ciVariablesLinkEnd}. As a user with maintainer access rights, you can manage CI variables in the %{ciSettingsLinkStart}Settings%{ciSettingsLinkEnd} area."
msgstr ""
-msgid "APIFuzzing|Use this tool to generate API fuzzing configuration YAML to copy into your .gitlab-ci.yml file. This tool does not reflect or update your .gitlab-ci.yml file automatically."
-msgstr ""
-
msgid "APIFuzzing|Username for basic authentication"
msgstr ""
@@ -1680,9 +1691,6 @@ msgstr ""
msgid "Abuse reports notification email"
msgstr ""
-msgid "Abuse reports will be sent to this address if it is set. Abuse reports are always available in the admin area."
-msgstr ""
-
msgid "Accept invitation"
msgstr ""
@@ -1719,12 +1727,18 @@ msgstr ""
msgid "Access granted"
msgstr ""
+msgid "Access key ID"
+msgstr ""
+
msgid "Access requests"
msgstr ""
msgid "Access to '%{classification_label}' not allowed"
msgstr ""
+msgid "Access tokens expire after 2 hours. A refresh token may be used at any time to generate a new access token. Non-expiring access tokens are deprecated. Clear this setting to enable backward compatibility."
+msgstr ""
+
msgid "AccessDropdown|Deploy Keys"
msgstr ""
@@ -2037,6 +2051,9 @@ msgstr ""
msgid "Add new directory"
msgstr ""
+msgid "Add new service account"
+msgstr ""
+
msgid "Add or remove previously merged commits"
msgstr ""
@@ -2274,6 +2291,9 @@ msgstr ""
msgid "AdminArea|Features"
msgstr ""
+msgid "AdminArea|Get security updates from GitLab and stay up to date"
+msgstr ""
+
msgid "AdminArea|Groups"
msgstr ""
@@ -2313,6 +2333,12 @@ msgstr ""
msgid "AdminArea|Reporter"
msgstr ""
+msgid "AdminArea|Sign up for the GitLab Security Newsletter to get notified for security updates."
+msgstr ""
+
+msgid "AdminArea|Sign up for the GitLab newsletter"
+msgstr ""
+
msgid "AdminArea|Stop all jobs"
msgstr ""
@@ -2382,9 +2408,15 @@ msgstr ""
msgid "AdminSettings|Disable public access to Pages sites"
msgstr ""
+msgid "AdminSettings|Display a banner on merge requests in projects with no pipelines to initiate steps to add a .gitlab-ci.yml file."
+msgstr ""
+
msgid "AdminSettings|Domain verification is an essential security measure for public GitLab sites. Users are required to demonstrate they control a domain before it is enabled. %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "AdminSettings|Enable pipeline suggestion banner"
+msgstr ""
+
msgid "AdminSettings|Enable shared runners for new projects"
msgstr ""
@@ -2856,10 +2888,10 @@ msgstr ""
msgid "Admin|Quarterly reconciliation will occur on %{qrtlyDate}"
msgstr ""
-msgid "Admin|The number of max seats used for your namespace is currently exceeding the number of seats in your subscription. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgid "Admin|The number of max seats in your namespace exceeds the number of seats in your subscription. On %{qrtlyDate}, quarterly reconciliation occurs and you are automatically billed a prorated amount for the overage. No action is needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice. For more information about the timing of the invoicing process, view the documentation."
msgstr ""
-msgid "Admin|The number of maximum users for your instance is currently exceeding the number of users in license. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgid "Admin|The number of max users in your instance exceeds the number of users in your license. On %{qrtlyDate}, quarterly reconciliation occurs and you are automatically billed a prorated amount for the overage. No action is needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice. For more information about the timing of the invoicing process, view the documentation."
msgstr ""
msgid "Admin|View pending user approvals"
@@ -2880,9 +2912,6 @@ msgstr ""
msgid "Advanced export options"
msgstr ""
-msgid "Advanced permissions, Large File Storage and Two-Factor authentication settings."
-msgstr ""
-
msgid "After a successful password update you will be redirected to login screen."
msgstr ""
@@ -2901,13 +2930,14 @@ msgstr ""
msgid "After you've reviewed these contribution guidelines, you'll be all set to"
msgstr ""
+msgid "Akismet"
+msgstr ""
+
msgid "Akismet API Key"
msgstr ""
-msgid "Alert"
-msgid_plural "Alerts"
-msgstr[0] ""
-msgstr[1] ""
+msgid "Akismet helps prevent the creation of spam issues in public projects."
+msgstr ""
msgid "AlertManagement|Acknowledged"
msgstr ""
@@ -3263,6 +3293,9 @@ msgstr ""
msgid "All (default)"
msgstr ""
+msgid "All GitLab"
+msgstr ""
+
msgid "All Members"
msgstr ""
@@ -3377,6 +3410,9 @@ msgstr ""
msgid "Allow this secondary node to replicate content on Object Storage"
msgstr ""
+msgid "Allow use of licensed EE features"
+msgstr ""
+
msgid "Allow users to dismiss the broadcast message"
msgstr ""
@@ -3452,9 +3488,6 @@ msgstr ""
msgid "Amazon authentication is not %{link_start}correctly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
-msgid "Amount of time (in hours) that users are allowed to skip forced configuration of two-factor authentication"
-msgstr ""
-
msgid "An %{link_start}alert%{link_end} with the same fingerprint is already open. To change the status of this alert, resolve the linked alert."
msgstr ""
@@ -3515,12 +3548,6 @@ msgstr ""
msgid "An error occurred when removing the label."
msgstr ""
-msgid "An error occurred when toggling the notification subscription"
-msgstr ""
-
-msgid "An error occurred when updating the issue weight"
-msgstr ""
-
msgid "An error occurred when updating the title"
msgstr ""
@@ -3569,6 +3596,9 @@ msgstr ""
msgid "An error occurred while enabling Service Desk."
msgstr ""
+msgid "An error occurred while fetching Markdown preview"
+msgstr ""
+
msgid "An error occurred while fetching ancestors"
msgstr ""
@@ -3599,9 +3629,6 @@ msgstr ""
msgid "An error occurred while fetching label colors."
msgstr ""
-msgid "An error occurred while fetching markdown preview"
-msgstr ""
-
msgid "An error occurred while fetching participants"
msgstr ""
@@ -3617,9 +3644,6 @@ msgstr ""
msgid "An error occurred while fetching reference"
msgstr ""
-msgid "An error occurred while fetching sidebar data"
-msgstr ""
-
msgid "An error occurred while fetching tags. Retry the search."
msgstr ""
@@ -3695,6 +3719,9 @@ msgstr ""
msgid "An error occurred while loading merge requests."
msgstr ""
+msgid "An error occurred while loading projects."
+msgstr ""
+
msgid "An error occurred while loading the Needs tab."
msgstr ""
@@ -3929,12 +3956,6 @@ msgstr ""
msgid "Any Milestone"
msgstr ""
-msgid "Any branch"
-msgstr ""
-
-msgid "Any eligible user"
-msgstr ""
-
msgid "Any encrypted tokens"
msgstr ""
@@ -3953,6 +3974,9 @@ msgstr ""
msgid "Any namespace"
msgstr ""
+msgid "App Engine description and apps that are suitable for this deployment target"
+msgstr ""
+
msgid "App ID"
msgstr ""
@@ -4101,6 +4125,11 @@ msgstr ""
msgid "Apply"
msgstr ""
+msgid "Apply %d suggestion"
+msgid_plural "Apply %d suggestions"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Apply a label"
msgstr ""
@@ -4110,13 +4139,10 @@ msgstr ""
msgid "Apply suggestion"
msgstr ""
-msgid "Apply suggestions"
-msgstr ""
-
msgid "Apply template"
msgstr ""
-msgid "Apply this approval rule to any branch or a specific protected branch."
+msgid "Apply this approval rule to all branches or a specific protected branch."
msgstr ""
msgid "Applying"
@@ -4259,9 +4285,6 @@ msgstr ""
msgid "ApprovalSettings|Prevent editing approval rules in projects and merge requests."
msgstr ""
-msgid "ApprovalSettings|Prevent editing approval rules in projects and merge requests. "
-msgstr ""
-
msgid "ApprovalSettings|Remove all approvals when commits are added to the source branch."
msgstr ""
@@ -4277,6 +4300,9 @@ msgstr ""
msgid "ApprovalSettings|This setting is configured at the instance level and can only be changed by an administrator."
msgstr ""
+msgid "ApprovalSettings|This setting is configured in %{groupName} and can only be changed by an administrator or group owner."
+msgstr ""
+
msgid "ApprovalStatusTooltip|Adheres to separation of duties"
msgstr ""
@@ -4763,9 +4789,6 @@ msgstr ""
msgid "Authenticated API rate limit period in seconds"
msgstr ""
-msgid "Authenticated API request rate limit"
-msgstr ""
-
msgid "Authenticated API requests"
msgstr ""
@@ -4775,10 +4798,10 @@ msgstr ""
msgid "Authenticated Git LFS request rate limit"
msgstr ""
-msgid "Authenticated web rate limit period in seconds"
+msgid "Authenticated Git LFS requests"
msgstr ""
-msgid "Authenticated web request rate limit"
+msgid "Authenticated web rate limit period in seconds"
msgstr ""
msgid "Authenticated web requests"
@@ -5156,9 +5179,6 @@ msgstr ""
msgid "Below you will find all the groups that are public."
msgstr ""
-msgid "Beta"
-msgstr ""
-
msgid "Bi-weekly code coverage"
msgstr ""
@@ -5398,6 +5418,21 @@ msgstr ""
msgid "Board scope affects which issues are displayed for anyone who visits this board"
msgstr ""
+msgid "BoardNewEpic|Groups"
+msgstr ""
+
+msgid "BoardNewEpic|Loading groups"
+msgstr ""
+
+msgid "BoardNewEpic|No matching results"
+msgstr ""
+
+msgid "BoardNewEpic|Search groups"
+msgstr ""
+
+msgid "BoardNewEpic|Select a group"
+msgstr ""
+
msgid "BoardNewIssue|No matching results"
msgstr ""
@@ -5475,6 +5510,9 @@ msgstr ""
msgid "Boards|An error occurred while creating the list. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching child groups. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching group projects. Please try again."
msgstr ""
@@ -5807,6 +5845,9 @@ msgstr ""
msgid "Bulk update"
msgstr ""
+msgid "BulkImports|Re-import creates a new group. It does not sync with the existing group."
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -5816,6 +5857,9 @@ msgstr ""
msgid "BulkImport|From source group"
msgstr ""
+msgid "BulkImport|Group import history"
+msgstr ""
+
msgid "BulkImport|Import failed: Destination cannot be a subgroup of the source group. Change the destination and try again."
msgstr ""
@@ -5828,9 +5872,18 @@ msgstr ""
msgid "BulkImport|Importing the group failed"
msgstr ""
+msgid "BulkImport|Last imported to %{link}"
+msgstr ""
+
msgid "BulkImport|Name already exists."
msgstr ""
+msgid "BulkImport|New group"
+msgstr ""
+
+msgid "BulkImport|No history is available"
+msgstr ""
+
msgid "BulkImport|No parent"
msgstr ""
@@ -5843,6 +5896,9 @@ msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} matching filter \"%{filter}\" from %{link}"
msgstr ""
+msgid "BulkImport|Source group"
+msgstr ""
+
msgid "BulkImport|To new group"
msgstr ""
@@ -5852,6 +5908,9 @@ msgstr ""
msgid "BulkImport|You have no groups to import"
msgstr ""
+msgid "BulkImport|Your imported groups will appear here."
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -6094,6 +6153,9 @@ msgstr ""
msgid "Can be manually deployed to"
msgstr ""
+msgid "Can be overridden in each project."
+msgstr ""
+
msgid "Can create groups:"
msgstr ""
@@ -6196,6 +6258,9 @@ msgstr ""
msgid "Cancelling Preview"
msgstr ""
+msgid "Cannot assign a confidential epic to a non-confidential issue. Make the issue confidential and try again"
+msgstr ""
+
msgid "Cannot be assigned to other projects."
msgstr ""
@@ -6247,9 +6312,6 @@ msgstr ""
msgid "Cannot refer to a group %{timebox_type} by an internal id!"
msgstr ""
-msgid "Cannot set confidential epic for a non-confidential issue"
-msgstr ""
-
msgid "Cannot show preview. For previews on sketch files, they must have the file format introduced by Sketch version 43 and above."
msgstr ""
@@ -6487,15 +6549,15 @@ msgstr ""
msgid "Check out, review, and merge locally"
msgstr ""
-msgid "Check the %{docs_link_start}documentation%{docs_link_end}."
-msgstr ""
-
msgid "Check the current instance configuration "
msgstr ""
msgid "Check the elasticsearch.log file to debug why the migration was halted and make any changes before retrying the migration. When you fix the cause of the failure, click \"Retry migration\", and the migration will be scheduled to be retried in the background."
msgstr ""
+msgid "Check with your administrator."
+msgstr ""
+
msgid "Check your Docker images for known vulnerabilities."
msgstr ""
@@ -6526,6 +6588,9 @@ msgstr ""
msgid "Checkout"
msgstr ""
+msgid "Checkout|$%{selectedPlanPrice} per 10 GB storage per pack"
+msgstr ""
+
msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 minutes"
msgstr ""
@@ -6546,17 +6611,23 @@ msgstr ""
msgid "Checkout|%{name}'s GitLab subscription"
msgstr ""
-msgid "Checkout|%{selectedPlanText} plan"
+msgid "Checkout|%{name}'s storage subscription"
msgstr ""
-msgid "Checkout|%{startDate} - %{endDate}"
+msgid "Checkout|%{quantity} GB of storage"
msgstr ""
-msgid "Checkout|%{totalCiMinutes} CI minute"
-msgid_plural "Checkout|%{totalCiMinutes} CI minutes"
+msgid "Checkout|%{quantity} storage pack"
+msgid_plural "Checkout|%{quantity} storage packs"
msgstr[0] ""
msgstr[1] ""
+msgid "Checkout|%{selectedPlanText} plan"
+msgstr ""
+
+msgid "Checkout|%{startDate} - %{endDate}"
+msgstr ""
+
msgid "Checkout|%{totalCiMinutes} CI minutes"
msgstr ""
@@ -6632,6 +6703,9 @@ msgstr ""
msgid "Checkout|Failed to register credit card. Please try again."
msgstr ""
+msgid "Checkout|GB"
+msgstr ""
+
msgid "Checkout|GitLab group"
msgstr ""
@@ -6668,6 +6742,9 @@ msgstr ""
msgid "Checkout|State"
msgstr ""
+msgid "Checkout|Storage packs"
+msgstr ""
+
msgid "Checkout|Street address"
msgstr ""
@@ -6689,6 +6766,9 @@ msgstr ""
msgid "Checkout|Total minutes: %{quantity}"
msgstr ""
+msgid "Checkout|Total storage: %{quantity} GB"
+msgstr ""
+
msgid "Checkout|Users"
msgstr ""
@@ -6698,16 +6778,25 @@ msgstr ""
msgid "Checkout|Your organization"
msgstr ""
+msgid "Checkout|Your storage subscription has the same term as your main subscription, and the price is prorated accordingly."
+msgstr ""
+
msgid "Checkout|Your subscription will be applied to this group"
msgstr ""
msgid "Checkout|Zip code"
msgstr ""
+msgid "Checkout|a storage subscription"
+msgstr ""
+
msgid "Checkout|company or team"
msgstr ""
-msgid "Checkout|x 1,000 minutes per pack = %{strong}"
+msgid "Checkout|minutes"
+msgstr ""
+
+msgid "Checkout|x %{quantity} %{units} per pack ="
msgstr ""
msgid "Cherry-pick this commit"
@@ -7064,6 +7153,9 @@ msgstr ""
msgid "CloneIssue|Cannot clone issue to target project as it is pending deletion."
msgstr ""
+msgid "CloneIssue|Cannot clone issues of '%{issue_type}' type."
+msgstr ""
+
msgid "Cloned this issue to %{path_to_project}."
msgstr ""
@@ -7118,7 +7210,10 @@ msgstr ""
msgid "Closes this %{quick_action_target}."
msgstr ""
-msgid "Cloud licenses can not be removed."
+msgid "Cloud Functions description and apps that are suitable for this deployment target"
+msgstr ""
+
+msgid "Cloud Run description and apps that are suitable for this deployment target"
msgstr ""
msgid "Cluster"
@@ -7145,6 +7240,12 @@ msgstr ""
msgid "ClusterAgents|Access tokens"
msgstr ""
+msgid "ClusterAgents|Agent might not be connected to GitLab"
+msgstr ""
+
+msgid "ClusterAgents|Agent never connected to GitLab"
+msgstr ""
+
msgid "ClusterAgents|Alternative installation methods"
msgstr ""
@@ -7160,6 +7261,12 @@ msgstr ""
msgid "ClusterAgents|Configuration"
msgstr ""
+msgid "ClusterAgents|Connected"
+msgstr ""
+
+msgid "ClusterAgents|Connection status"
+msgstr ""
+
msgid "ClusterAgents|Copy token"
msgstr ""
@@ -7178,6 +7285,9 @@ msgstr ""
msgid "ClusterAgents|For alternative installation methods %{linkStart}go to the documentation%{linkEnd}."
msgstr ""
+msgid "ClusterAgents|For more troubleshooting information go to"
+msgstr ""
+
msgid "ClusterAgents|Go to the repository"
msgstr ""
@@ -7193,18 +7303,30 @@ msgstr ""
msgid "ClusterAgents|Integrate with the GitLab Agent"
msgstr ""
-msgid "ClusterAgents|Last used"
+msgid "ClusterAgents|Last connected %{timeAgo}."
+msgstr ""
+
+msgid "ClusterAgents|Last contact"
msgstr ""
msgid "ClusterAgents|Learn how to create an agent access token"
msgstr ""
+msgid "ClusterAgents|Make sure you are using a valid token."
+msgstr ""
+
msgid "ClusterAgents|Name"
msgstr ""
msgid "ClusterAgents|Never"
msgstr ""
+msgid "ClusterAgents|Never connected"
+msgstr ""
+
+msgid "ClusterAgents|Not connected"
+msgstr ""
+
msgid "ClusterAgents|Read more about getting started"
msgstr ""
@@ -7226,6 +7348,9 @@ msgstr ""
msgid "ClusterAgents|Select which Agent you want to install"
msgstr ""
+msgid "ClusterAgents|The Agent has not been connected in a long time. There might be a connectivity issue. Last contact was %{timeAgo}."
+msgstr ""
+
msgid "ClusterAgents|The GitLab Agent also requires %{linkStart}enabling the Agent Server%{linkEnd}"
msgstr ""
@@ -7253,9 +7378,6 @@ msgstr ""
msgid "ClusterAgents|You will need to create a token to connect to your agent"
msgstr ""
-msgid "ClusterAgent|This feature is only available for premium plans"
-msgstr ""
-
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -7445,9 +7567,6 @@ msgstr ""
msgid "ClusterIntegration|Create Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Create a provision role on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the account and external ID above. %{startMoreInfoLink}More information%{endLink}"
-msgstr ""
-
msgid "ClusterIntegration|Create cluster on"
msgstr ""
@@ -7880,7 +7999,7 @@ msgstr ""
msgid "ClusterIntegration|Subnets"
msgstr ""
-msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provisioned role, first create one on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the above account and external IDs. %{startMoreInfoLink}More information%{endLink}"
+msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provisioned role, first create one on %{awsLinkStart}Amazon Web Services %{awsLinkEnd} using the above account and external IDs. %{moreInfoStart}More information%{moreInfoEnd}"
msgstr ""
msgid "ClusterIntegration|The Kubernetes certificate used to authenticate to the cluster."
@@ -8114,6 +8233,9 @@ msgstr ""
msgid "Collapse replies"
msgstr ""
+msgid "Collapse settings section"
+msgstr ""
+
msgid "Collapse sidebar"
msgstr ""
@@ -8132,6 +8254,9 @@ msgstr ""
msgid "Comma-separated list of email addresses."
msgstr ""
+msgid "Comma-separated list of users allowed to exceed the rate limit."
+msgstr ""
+
msgid "Comma-separated, e.g. '1.1.1.1, 2.2.2.0/24'"
msgstr ""
@@ -8452,6 +8577,9 @@ msgstr ""
msgid "Configure %{repository_checks_link_start}repository checks%{link_end} and %{housekeeping_link_start}housekeeping%{link_end} on repositories."
msgstr ""
+msgid "Configure CAPTCHAs, IP address limits, and other anti-spam measures."
+msgstr ""
+
msgid "Configure Dependency Scanning in `.gitlab-ci.yml` using the GitLab managed template. You can [add variable overrides](https://docs.gitlab.com/ee/user/application_security/dependency_scanning/#customizing-the-dependency-scanning-settings) to customize Dependency Scanning settings."
msgstr ""
@@ -8488,16 +8616,13 @@ msgstr ""
msgid "Configure a %{codeStart}.gitlab-webide.yml%{codeEnd} file in the %{codeStart}.gitlab%{codeEnd} directory to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
msgstr ""
-msgid "Configure existing installation"
-msgstr ""
-
-msgid "Configure limit for notes created per minute by web and API requests."
+msgid "Configure advanced permissions, Large File Storage, and two-factor authentication settings."
msgstr ""
-msgid "Configure limits for Project/Group Import/Export."
+msgid "Configure approvals by authors and committers on all projects."
msgstr ""
-msgid "Configure limits for web and API requests."
+msgid "Configure existing installation"
msgstr ""
msgid "Configure paths to be protected by Rack Attack."
@@ -8512,10 +8637,13 @@ msgstr ""
msgid "Configure settings for Advanced Search with Elasticsearch."
msgstr ""
+msgid "Configure specific limits for Files API requests that supersede the general user and IP rate limits."
+msgstr ""
+
msgid "Configure specific limits for Git LFS requests that supersede the general user and IP rate limits."
msgstr ""
-msgid "Configure specific limits for Packages API requests that supersede the general user and IP rate limits."
+msgid "Configure specific limits for deprecated API requests that supersede the general user and IP rate limits."
msgstr ""
msgid "Configure the %{link} integration."
@@ -8527,6 +8655,9 @@ msgstr ""
msgid "Configure the way a user creates a new account."
msgstr ""
+msgid "Configure via Merge Request"
+msgstr ""
+
msgid "Configure which lists are shown for anyone who visits this board"
msgstr ""
@@ -8995,6 +9126,9 @@ msgstr ""
msgid "Content parsed with %{link}."
msgstr ""
+msgid "ContentEditor|Table of Contents"
+msgstr ""
+
msgid "ContentEditor|You have to provide a renderMarkdown function or a custom serializer"
msgstr ""
@@ -9181,6 +9315,9 @@ msgstr ""
msgid "Copy link to chart"
msgstr ""
+msgid "Copy prefix"
+msgstr ""
+
msgid "Copy reference"
msgstr ""
@@ -9211,6 +9348,9 @@ msgstr ""
msgid "Copy value"
msgstr ""
+msgid "Corpus Management"
+msgstr ""
+
msgid "Corpus Management|Are you sure you want to delete the corpus?"
msgstr ""
@@ -9439,6 +9579,9 @@ msgstr ""
msgid "Create commit"
msgstr ""
+msgid "Create common files more quickly, and standardize their format."
+msgstr ""
+
msgid "Create confidential merge request"
msgstr ""
@@ -9472,6 +9615,9 @@ msgstr ""
msgid "Create issue"
msgstr ""
+msgid "Create issue to resolve all threads"
+msgstr ""
+
msgid "Create iteration"
msgstr ""
@@ -9526,6 +9672,9 @@ msgstr ""
msgid "Create new..."
msgstr ""
+msgid "Create or import your first project"
+msgstr ""
+
msgid "Create project"
msgstr ""
@@ -9883,7 +10032,7 @@ msgstr ""
msgid "Custom notification events"
msgstr ""
-msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notificationLinkStart} notification emails%{notificationLinkEnd}."
+msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notificationLinkStart}notification emails%{notificationLinkEnd}."
msgstr ""
msgid "Custom project templates"
@@ -10082,10 +10231,10 @@ msgid_plural "CycleAnalytics|Showing %{subjectFilterText} and %{selectedLabelsCo
msgstr[0] ""
msgstr[1] ""
-msgid "CycleAnalytics|Showing data for group '%{groupName}' and %{selectedProjectCount} projects from %{startDate} to %{endDate}"
+msgid "CycleAnalytics|Showing data for group '%{groupName}' and %{selectedProjectCount} projects from %{createdAfter} to %{createdBefore}"
msgstr ""
-msgid "CycleAnalytics|Showing data for group '%{groupName}' from %{startDate} to %{endDate}"
+msgid "CycleAnalytics|Showing data for group '%{groupName}' from %{createdAfter} to %{createdBefore}"
msgstr ""
msgid "CycleAnalytics|Stages"
@@ -10319,6 +10468,9 @@ msgstr ""
msgid "DastProfiles|Manage profiles"
msgstr ""
+msgid "DastProfiles|Manage site profiles"
+msgstr ""
+
msgid "DastProfiles|Minimum = 0 (no timeout enabled), Maximum = 2880 minutes"
msgstr ""
@@ -10394,6 +10546,9 @@ msgstr ""
msgid "DastProfiles|Scanner name"
msgstr ""
+msgid "DastProfiles|Schedule"
+msgstr ""
+
msgid "DastProfiles|Select branch"
msgstr ""
@@ -10463,7 +10618,7 @@ msgstr ""
msgid "DastProfiles|Website"
msgstr ""
-msgid "DastProfiles|You can either choose a passive scan or validate the target site in your chosen site profile. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
+msgid "DastProfiles|You can either choose a passive scan or validate the target site from the site profile management page. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
msgstr ""
msgid "DastProfiles|You cannot run an active scan against an unvalidated site."
@@ -10636,7 +10791,7 @@ msgstr ""
msgid "Days to merge"
msgstr ""
-msgid "Deactivate dormant users after 90 days of inactivity. Users can return to active status by signing in to their account. While inactive, a user is not counted as an active user in the instance."
+msgid "Deactivate dormant users after 90 days of inactivity"
msgstr ""
msgid "Dear Administrator,"
@@ -10723,10 +10878,10 @@ msgstr ""
msgid "Define a custom pattern with cron syntax"
msgstr ""
-msgid "Define approval settings."
+msgid "Define approval rules."
msgstr ""
-msgid "Define approval settings. %{linkStart}Learn more.%{linkEnd}"
+msgid "Define approval rules. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "Define custom rules for what constitutes spam, independent of Akismet"
@@ -10735,7 +10890,7 @@ msgstr ""
msgid "Define environments in the deploy stage(s) in %{code_open}.gitlab-ci.yml%{code_close} to track deployments here."
msgstr ""
-msgid "Define how approval rules are applied as a merge request moves toward completion."
+msgid "Define how approval rules are applied to merge requests."
msgstr ""
msgid "Definition"
@@ -10750,6 +10905,12 @@ msgstr ""
msgid "DelayedJobs|Are you sure you want to run %{job_name} immediately? This job will run automatically after it's timer finishes."
msgstr ""
+msgid "DelayedJobs|Are you sure you want to run %{job_name} immediately? This job will run automatically after its timer finishes."
+msgstr ""
+
+msgid "DelayedJobs|Run the delayed job now?"
+msgstr ""
+
msgid "DelayedJobs|Start now"
msgstr ""
@@ -11026,6 +11187,12 @@ msgstr ""
msgid "Dependency proxy image prefix"
msgstr ""
+msgid "DependencyProxy|Create a local proxy for storing frequently used upstream images. %{docLinkStart}Learn more%{docLinkEnd} about dependency proxies."
+msgstr ""
+
+msgid "DependencyProxy|Dependency Proxy"
+msgstr ""
+
msgid "DependencyProxy|Toggle Dependency Proxy"
msgstr ""
@@ -11266,6 +11433,9 @@ msgstr ""
msgid "Deployments"
msgstr ""
+msgid "Deployments to Google Kubernetes Engine can be "
+msgstr ""
+
msgid "Deployments|%{deployments} environment impacted."
msgid_plural "Deployments|%{deployments} environments impacted."
msgstr[0] ""
@@ -11295,6 +11465,9 @@ msgstr ""
msgid "Deployment|success"
msgstr ""
+msgid "Deprecated API rate limits"
+msgstr ""
+
msgid "Deprioritize label"
msgstr ""
@@ -11697,6 +11870,16 @@ msgstr ""
msgid "DiffsCompareBaseBranch|(base)"
msgstr ""
+msgid "Diffs|%d addition"
+msgid_plural "Diffs|%d additions"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Diffs|%d deletion"
+msgid_plural "Diffs|%d deletions"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Diffs|No file name available"
msgstr ""
@@ -11706,9 +11889,17 @@ msgstr ""
msgid "Diffs|Show all unchanged lines"
msgstr ""
+msgid "Diffs|Showing %{dropdownStart}%{count} changed file%{dropdownEnd}"
+msgid_plural "Diffs|Showing %{dropdownStart}%{count} changed files%{dropdownEnd}"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Diffs|Something went wrong while fetching diff lines."
msgstr ""
+msgid "Diffs|with %{additions} and %{deletions}"
+msgstr ""
+
msgid "Direct member"
msgstr ""
@@ -11834,9 +12025,6 @@ msgid_plural "Dismiss %d selected vulnerabilities as"
msgstr[0] ""
msgstr[1] ""
-msgid "Dismiss Value Stream Analytics introduction box"
-msgstr ""
-
msgid "Dismiss merge request promotion"
msgstr ""
@@ -12158,6 +12346,9 @@ msgstr ""
msgid "Edit issues"
msgstr ""
+msgid "Edit merge requests"
+msgstr ""
+
msgid "Edit public deploy key"
msgstr ""
@@ -12233,6 +12424,9 @@ msgstr ""
msgid "Elastic|None. Select projects to index."
msgstr ""
+msgid "Eligible users"
+msgstr ""
+
msgid "Email"
msgstr ""
@@ -12362,6 +12556,9 @@ msgstr ""
msgid "Enable"
msgstr ""
+msgid "Enable Amazon EKS integration"
+msgstr ""
+
msgid "Enable Auto DevOps"
msgstr ""
@@ -12395,6 +12592,9 @@ msgstr ""
msgid "Enable SSL verification"
msgstr ""
+msgid "Enable Service Ping"
+msgstr ""
+
msgid "Enable Snowplow tracking"
msgstr ""
@@ -12425,6 +12625,9 @@ msgstr ""
msgid "Enable authenticated Git LFS request rate limit"
msgstr ""
+msgid "Enable authenticated web request rate limit"
+msgstr ""
+
msgid "Enable authentication"
msgstr ""
@@ -12485,7 +12688,7 @@ msgstr ""
msgid "Enable or disable the Pseudonymizer data collection."
msgstr ""
-msgid "Enable or disable version check and service ping."
+msgid "Enable or disable version check and Service Ping."
msgstr ""
msgid "Enable protected paths rate limit"
@@ -12497,18 +12700,12 @@ msgstr ""
msgid "Enable reCAPTCHA"
msgstr ""
-msgid "Enable reCAPTCHA for login"
-msgstr ""
-
-msgid "Enable reCAPTCHA, Invisible Captcha, Akismet and set IP limits. For reCAPTCHA, we currently only support %{recaptcha_v2_link_start}v2%{recaptcha_v2_link_end}"
+msgid "Enable reCAPTCHA for login."
msgstr ""
msgid "Enable repository checks"
msgstr ""
-msgid "Enable service ping"
-msgstr ""
-
msgid "Enable shared runners for all projects and subgroups in this group."
msgstr ""
@@ -12530,7 +12727,10 @@ msgstr ""
msgid "Enable unauthenticated API request rate limit"
msgstr ""
-msgid "Enable unauthenticated request rate limit"
+msgid "Enable unauthenticated web request rate limit"
+msgstr ""
+
+msgid "Enable user deactivation emails"
msgstr ""
msgid "Enable version check"
@@ -12566,9 +12766,6 @@ msgstr ""
msgid "Enabled sources for code import during project creation. OmniAuth must be configured for GitHub"
msgstr ""
-msgid "Enabling this will only make licensed EE features available to projects if the project namespace's plan includes the feature or if the project is public."
-msgstr ""
-
msgid "Encountered an error while rendering: %{err}"
msgstr ""
@@ -12617,9 +12814,6 @@ msgstr ""
msgid "Enter Admin Mode"
msgstr ""
-msgid "Enter IP address range"
-msgstr ""
-
msgid "Enter a number"
msgstr ""
@@ -12632,9 +12826,6 @@ msgstr ""
msgid "Enter at least three characters to search"
msgstr ""
-msgid "Enter domain"
-msgstr ""
-
msgid "Enter in your Bitbucket Server URL and personal access token below"
msgstr ""
@@ -12821,9 +13012,6 @@ msgstr ""
msgid "Environments|Deployment %{status}"
msgstr ""
-msgid "Environments|Dismiss"
-msgstr ""
-
msgid "Environments|Enable review app"
msgstr ""
@@ -12836,9 +13024,6 @@ msgstr ""
msgid "Environments|Environments are places where code gets deployed, such as staging or production."
msgstr ""
-msgid "Environments|Help us improve environments"
-msgstr ""
-
msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
msgstr ""
@@ -12875,6 +13060,9 @@ msgstr ""
msgid "Environments|Note that this action will stop the environment, but it will %{emphasisStart}not%{emphasisEnd} have an effect on any existing deployment due to no “stop environment action†being defined in the %{ciConfigLinkStart}.gitlab-ci.yml%{ciConfigLinkEnd} file."
msgstr ""
+msgid "Environments|Open"
+msgstr ""
+
msgid "Environments|Open live environment"
msgstr ""
@@ -12914,9 +13102,6 @@ msgstr ""
msgid "Environments|Stopping %{environmentName}"
msgstr ""
-msgid "Environments|Take the survey"
-msgstr ""
-
msgid "Environments|There was an error fetching the logs. Please try again."
msgstr ""
@@ -12938,9 +13123,6 @@ msgstr ""
msgid "Environments|You don't have any environments right now"
msgstr ""
-msgid "Environments|Your feedback helps GitLab make environments better for you and other users. Participate and enter a sweepstake to win a USD 30 gift card."
-msgstr ""
-
msgid "Environments|by %{avatar}"
msgstr ""
@@ -13223,7 +13405,7 @@ msgstr ""
msgid "Error parsing CSV file. Please make sure it has"
msgstr ""
-msgid "Error rendering markdown preview"
+msgid "Error rendering Markdown preview"
msgstr ""
msgid "Error saving label update."
@@ -13271,6 +13453,9 @@ msgstr ""
msgid "Error: %{error_message}"
msgstr ""
+msgid "Error: Couldn't load some or all of the changes."
+msgstr ""
+
msgid "Error: No AWS credentials were supplied"
msgstr ""
@@ -13304,6 +13489,9 @@ msgstr ""
msgid "ErrorTracking|Enable error tracking"
msgstr ""
+msgid "ErrorTracking|Error tracking backend"
+msgstr ""
+
msgid "ErrorTracking|If you self-host Sentry, enter your Sentry instance's full URL. If you use Sentry's hosted solution, enter https://sentry.io"
msgstr ""
@@ -13337,6 +13525,12 @@ msgstr ""
msgid "Escalation policies must have at least one rule"
msgstr ""
+msgid "EscalationPolicies|%{clockIcon} IF alert is not %{alertStatus} in %{minutes}"
+msgstr ""
+
+msgid "EscalationPolicies|%{notificationIcon} THEN %{doAction} %{forScheduleOrUser}"
+msgstr ""
+
msgid "EscalationPolicies|+ Add an additional rule"
msgstr ""
@@ -13379,13 +13573,13 @@ msgstr ""
msgid "EscalationPolicies|Escalation policies"
msgstr ""
-msgid "EscalationPolicies|Escalation rules"
+msgid "EscalationPolicies|Escalation policy %{obstacle} in Project %{project}"
msgstr ""
-msgid "EscalationPolicies|Failed to load oncall-schedules"
+msgid "EscalationPolicies|Escalation rules"
msgstr ""
-msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} %{then} THEN %{doAction} %{scheduleOrUser}"
+msgid "EscalationPolicies|Failed to load oncall-schedules"
msgstr ""
msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} minutes"
@@ -13463,18 +13657,36 @@ msgstr ""
msgid "Every %{action} attempt has failed: %{job_error_message}. Please try again."
msgstr ""
+msgid "Every 3 months"
+msgstr ""
+
+msgid "Every 3 months on the %{day} at %{time} %{timezone}"
+msgstr ""
+
+msgid "Every 6 months"
+msgstr ""
+
+msgid "Every 6 months on the %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Every day"
msgstr ""
msgid "Every day (at %{time})"
msgstr ""
+msgid "Every day at %{time} %{timezone}"
+msgstr ""
+
msgid "Every month"
msgstr ""
msgid "Every month (Day %{day} at %{time})"
msgstr ""
+msgid "Every month on the %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Every three months"
msgstr ""
@@ -13489,6 +13701,15 @@ msgstr[1] ""
msgid "Every week (%{weekday} at %{time})"
msgstr ""
+msgid "Every week on %{day} at %{time} %{timezone}"
+msgstr ""
+
+msgid "Every year"
+msgstr ""
+
+msgid "Every year on %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Everyone"
msgstr ""
@@ -13525,9 +13746,6 @@ msgstr ""
msgid "Exactly one of %{attributes} is required"
msgstr ""
-msgid "Example: %{ip_address}. %{read_more_link}."
-msgstr ""
-
msgid "Example: @sub\\.company\\.com$"
msgstr ""
@@ -13594,13 +13812,13 @@ msgstr ""
msgid "Expand pipeline"
msgstr ""
-msgid "Expand sidebar"
+msgid "Expand settings section"
msgstr ""
-msgid "Expected documents: %{expected_documents}"
+msgid "Expand sidebar"
msgstr ""
-msgid "Experienced"
+msgid "Expected documents: %{expected_documents}"
msgstr ""
msgid "ExperimentSubject|Must have exactly one of User, Namespace, or Project."
@@ -13885,9 +14103,6 @@ msgstr ""
msgid "Failed to load related branches"
msgstr ""
-msgid "Failed to load sidebar lock status"
-msgstr ""
-
msgid "Failed to load stacktrace."
msgstr ""
@@ -14312,6 +14527,9 @@ msgstr ""
msgid "Files"
msgstr ""
+msgid "Files API Rate Limits"
+msgstr ""
+
msgid "Files breadcrumb"
msgstr ""
@@ -15311,6 +15529,9 @@ msgstr ""
msgid "GitLab group: %{source_link}"
msgstr ""
+msgid "GitLab informs you if a new version is available."
+msgstr ""
+
msgid "GitLab is a complete DevOps platform, delivered as a single application, fundamentally changing the way Development, Security, and Ops teams collaborate"
msgstr ""
@@ -15326,7 +15547,7 @@ msgstr ""
msgid "GitLab is open source software to collaborate on code."
msgstr ""
-msgid "GitLab is undergoing maintenance and is operating in a read-only mode."
+msgid "GitLab is undergoing maintenance and is operating in read-only mode."
msgstr ""
msgid "GitLab member or Email address"
@@ -15338,9 +15559,6 @@ msgstr ""
msgid "GitLab project export"
msgstr ""
-msgid "GitLab restart is required to apply changes."
-msgstr ""
-
msgid "GitLab single sign-on URL"
msgstr ""
@@ -15356,9 +15574,6 @@ msgstr ""
msgid "GitLab version"
msgstr ""
-msgid "GitLab will inform you if a new version is available."
-msgstr ""
-
msgid "GitLab will run a background job that will produce pseudonymized CSVs of the GitLab database that will be uploaded to your configured object storage directory."
msgstr ""
@@ -15623,9 +15838,21 @@ msgstr ""
msgid "Go to snippets"
msgstr ""
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check 'Allowed domains for sign-ups'."
+msgstr ""
+
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check 'Email restrictions for sign-ups'."
+msgstr ""
+
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check the 'Domain denylist'."
+msgstr ""
+
msgid "Go to the activity feed"
msgstr ""
+msgid "Go to the group’s 'Settings &gt; General' page, and check 'Restrict membership by email domain'."
+msgstr ""
+
msgid "Go to the milestone list"
msgstr ""
@@ -15662,6 +15889,12 @@ msgstr ""
msgid "Goal of the changes and what reviewers should be aware of"
msgstr ""
+msgid "Google Cloud"
+msgstr ""
+
+msgid "Google Cloud offers several deployment targets. Select the one most suitable for your project."
+msgstr ""
+
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
@@ -15746,9 +15979,6 @@ msgstr ""
msgid "Group ID"
msgstr ""
-msgid "Group ID: %{group_id}"
-msgstr ""
-
msgid "Group Owner must have signed in with SAML before enabling Group Managed Accounts"
msgstr ""
@@ -15923,6 +16153,12 @@ msgstr ""
msgid "GroupImport|Unable to process group import file"
msgstr ""
+msgid "GroupPage|Copy group ID"
+msgstr ""
+
+msgid "GroupPage|Group ID: %{group_id}"
+msgstr ""
+
msgid "GroupRoadmap|%{dateWord} – No end date"
msgstr ""
@@ -15977,6 +16213,9 @@ msgstr ""
msgid "GroupRoadmap|Within 3 years"
msgstr ""
+msgid "GroupSAML|\"persistent\" recommended"
+msgstr ""
+
msgid "GroupSAML|%{strongOpen}Warning%{strongClose} - Enabling %{linkStart}SSO enforcement%{linkEnd} can reduce security risks."
msgstr ""
@@ -16109,6 +16348,9 @@ msgstr ""
msgid "GroupSAML|To be able to prohibit outer forks, you first need to enforce dedicate group managed accounts."
msgstr ""
+msgid "GroupSAML|Use SAML group links to manage group membership using SAML."
+msgstr ""
+
msgid "GroupSAML|Valid SAML Response"
msgstr ""
@@ -16121,13 +16363,10 @@ msgstr ""
msgid "GroupSAML|as %{access_level}"
msgstr ""
-msgid "GroupSAML|must match stored NameID of \"%{extern_uid}\" as we use this to identify users. If the NameID changes users will be unable to sign in."
-msgstr ""
-
-msgid "GroupSAML|should be \"persistent\""
+msgid "GroupSAML|must match stored NameID of \"%{extern_uid}\" to identify user and allow sign in"
msgstr ""
-msgid "GroupSAML|should be a random persistent ID, emails are discouraged"
+msgid "GroupSAML|recommend persistent ID instead of email"
msgstr ""
msgid "GroupSelect|No matching results"
@@ -16142,9 +16381,15 @@ msgstr ""
msgid "GroupSettings|Allow project access token creation"
msgstr ""
+msgid "GroupSettings|Applied to all subgroups unless overridden by a group owner. Groups already added to the project lose access."
+msgstr ""
+
msgid "GroupSettings|Auto DevOps pipeline was updated for the group"
msgstr ""
+msgid "GroupSettings|Available only on the top-level group. Applies to all subgroups. Groups already shared with a group outside %{group} are still shared unless removed manually."
+msgstr ""
+
msgid "GroupSettings|Badges"
msgstr ""
@@ -16196,6 +16441,9 @@ msgstr ""
msgid "GroupSettings|New runners registration token has been generated!"
msgstr ""
+msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgstr ""
+
msgid "GroupSettings|Pipeline settings was updated for the group"
msgstr ""
@@ -16208,12 +16456,15 @@ msgstr ""
msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
-msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups."
+msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups"
msgstr ""
msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
msgstr ""
+msgid "GroupSettings|Prevents group members from being notified if the group is mentioned."
+msgstr ""
+
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
msgstr ""
@@ -16250,21 +16501,6 @@ msgstr ""
msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}."
msgstr ""
-msgid "GroupSettings|This setting is only available on the top-level group and it applies to all subgroups. Groups that have already been shared with a group outside %{group} will still be shared, and this access will have to be revoked manually."
-msgstr ""
-
-msgid "GroupSettings|This setting will be applied to all subgroups unless overridden by a group owner. Groups that already have access to the project will continue to have access unless removed manually."
-msgstr ""
-
-msgid "GroupSettings|This setting will override user notification preferences for all members of the group, subgroups, and projects."
-msgstr ""
-
-msgid "GroupSettings|This setting will prevent group members from being notified if the group is mentioned."
-msgstr ""
-
-msgid "GroupSettings|This setting will prevent group members from forking projects outside of the group."
-msgstr ""
-
msgid "GroupSettings|Transfer group"
msgstr ""
@@ -16382,7 +16618,7 @@ msgstr ""
msgid "GroupsNew|No import options available"
msgstr ""
-msgid "GroupsNew|Not all related objects are migrated, as %{docs_link_start}described here%{docs_link_end}. Please %{feedback_link_start}leave feedback%{feedback_link_end} on this feature."
+msgid "GroupsNew|Not all related objects are migrated. %{docs_link_start}More info%{docs_link_end}."
msgstr ""
msgid "GroupsNew|Personal access token"
@@ -16514,15 +16750,27 @@ msgstr ""
msgid "Hello %{name},"
msgstr ""
-msgid "Hello there"
-msgstr ""
-
msgid "Hello, %{name}!"
msgstr ""
msgid "Hello, %{username}!"
msgstr ""
+msgid "HelloMessage|%{handshake_emoji} Contribute to GitLab: %{contribute_link}"
+msgstr ""
+
+msgid "HelloMessage|%{magnifier_emoji} Create a new GitLab issue: %{new_issue_link}"
+msgstr ""
+
+msgid "HelloMessage|%{rocket_emoji} We like your curiosity! Help us improve GitLab by joining the team: %{jobs_page_link}"
+msgstr ""
+
+msgid "HelloMessage|Does this page need fixes or improvements? Open an issue or contribute a merge request to help make GitLab more lovable. At GitLab, everyone can contribute!"
+msgstr ""
+
+msgid "HelloMessage|Welcome to GitLab!"
+msgstr ""
+
msgid "Help"
msgstr ""
@@ -16532,13 +16780,10 @@ msgstr ""
msgid "Helps prevent bots from creating accounts."
msgstr ""
-msgid "Helps prevent bots from creating issues"
-msgstr ""
-
-msgid "Helps prevent malicious users hide their activity"
+msgid "Helps prevent bots from creating issues."
msgstr ""
-msgid "Helps reduce request volume (e.g. from crawlers or abusive bots)"
+msgid "Helps prevent malicious users hide their activity."
msgstr ""
msgid "Helps reduce request volume (for example, from crawlers or abusive bots)"
@@ -16662,6 +16907,12 @@ msgstr ""
msgid "Housekeeping, export, path, transfer, remove, archive."
msgstr ""
+msgid "How do I configure Akismet?"
+msgstr ""
+
+msgid "How do I configure it?"
+msgstr ""
+
msgid "How do I configure runners?"
msgstr ""
@@ -16683,19 +16934,25 @@ msgstr ""
msgid "How do I set up this service?"
msgstr ""
+msgid "How do I use a web terminal?"
+msgstr ""
+
+msgid "How do I use file templates?"
+msgstr ""
+
msgid "How it works"
msgstr ""
msgid "How many days need to pass between marking entity for deletion and actual removing it."
msgstr ""
-msgid "How many seconds an IP will be counted towards the limit"
+msgid "How many seconds an IP counts toward the IP address limit."
msgstr ""
-msgid "I accept the %{terms_link}"
+msgid "How the job limiter handles jobs exceeding the thresholds specified below. The 'track' mode only logs the jobs. The 'compress' mode compresses the jobs and raises an exception if the compressed size exceeds the limit."
msgstr ""
-msgid "I accept the|Terms of Service and Privacy Policy"
+msgid "I accept the %{terms_link}"
msgstr ""
msgid "I forgot my password"
@@ -16779,13 +17036,16 @@ msgstr ""
msgid "IP Address"
msgstr ""
-msgid "IP expiration time"
+msgid "IP address expiration time"
msgstr ""
-msgid "IP subnet restriction only allowed for top-level groups"
+msgid "IP address restrictions"
+msgstr ""
+
+msgid "IP addresses per user"
msgstr ""
-msgid "IPs per user"
+msgid "IP subnet restriction only allowed for top-level groups"
msgstr ""
msgid "Identifier"
@@ -16800,6 +17060,9 @@ msgstr ""
msgid "If any indexed field exceeds this limit it will be truncated to this number of characters and the rest will not be indexed or searchable. This does not apply to repository and wiki indexing. Setting this to 0 means it is unlimited."
msgstr ""
+msgid "If blank, defaults to %{code_open}Retry later%{code_close}."
+msgstr ""
+
msgid "If blank, set allowable lifetime to %{instance_level_policy_in_words}, as defined by the instance admin. Once set, existing tokens for users in this group may be revoked."
msgstr ""
@@ -16851,6 +17114,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 did not initiate these sign-in attempts, please reach out to your administrator or enable two-factor authentication (2FA) on your account."
+msgstr ""
+
msgid "If you did not initiate this change, please contact your administrator immediately."
msgstr ""
@@ -16942,10 +17208,10 @@ msgstr ""
msgid "Import Projects from Gitea"
msgstr ""
-msgid "Import a project"
+msgid "Import an exported GitLab project"
msgstr ""
-msgid "Import an exported GitLab project"
+msgid "Import and export rate limits"
msgstr ""
msgid "Import failed due to a GitHub error: %{original}"
@@ -16957,12 +17223,18 @@ msgstr ""
msgid "Import from Jira"
msgstr ""
+msgid "Import group"
+msgstr ""
+
msgid "Import group from file"
msgstr ""
msgid "Import groups"
msgstr ""
+msgid "Import history"
+msgstr ""
+
msgid "Import in progress"
msgstr ""
@@ -17026,7 +17298,25 @@ msgstr ""
msgid "Import timed out. Import took longer than %{import_jobs_expiration} seconds"
msgstr ""
-msgid "Import/Export Rate Limits"
+msgid "ImportAProjectModal|Import from a project"
+msgstr ""
+
+msgid "ImportAProjectModal|Import members from another project"
+msgstr ""
+
+msgid "ImportAProjectModal|Import project members"
+msgstr ""
+
+msgid "ImportAProjectModal|Only project members (not group members) are imported, and they get the same permissions as the project you import from."
+msgstr ""
+
+msgid "ImportAProjectModal|Successfully imported"
+msgstr ""
+
+msgid "ImportAProjectModal|Unable to import project members"
+msgstr ""
+
+msgid "ImportAProjectModal|You're importing members to the %{strongStart}%{name}%{strongEnd} project."
msgstr ""
msgid "ImportButtons|Connect repositories from"
@@ -17079,7 +17369,7 @@ msgstr[1] ""
msgid "Importing..."
msgstr ""
-msgid "Import|A repository URL usually ends in a .git suffix, although this is not required. Double check to make sure your repository URL is correct."
+msgid "Import|There is not a valid Git repository at this URL. If your HTTP repository is not publicly accessible, verify your credentials."
msgstr ""
msgid "Improve customer support with Service Desk"
@@ -17088,9 +17378,6 @@ msgstr ""
msgid "Improves Git cloning performance."
msgstr ""
-msgid "In %{time_to_now}"
-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 ""
@@ -17376,7 +17663,7 @@ msgstr ""
msgid "InProductMarketing|Start a GitLab Ultimate trial today in less than one minute, no credit card required."
msgstr ""
-msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no CC required"
+msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no credit card required"
msgstr ""
msgid "InProductMarketing|Start a trial"
@@ -17415,7 +17702,7 @@ msgstr ""
msgid "InProductMarketing|Team up in GitLab for greater efficiency"
msgstr ""
-msgid "InProductMarketing|Team work makes the dream work"
+msgid "InProductMarketing|Team work makes the dream work"
msgstr ""
msgid "InProductMarketing|Test, create, deploy"
@@ -17996,6 +18283,9 @@ msgstr ""
msgid "Integrations|Create new issue in Jira"
msgstr ""
+msgid "Integrations|Create new issue in ZenTao"
+msgstr ""
+
msgid "Integrations|Default settings are inherited from the group level."
msgstr ""
@@ -18089,9 +18379,15 @@ msgstr ""
msgid "Integrations|Search Jira issues"
msgstr ""
+msgid "Integrations|Search ZenTao issues"
+msgstr ""
+
msgid "Integrations|Send notifications about project events to Unify Circuit."
msgstr ""
+msgid "Integrations|Send notifications about project events to a Unify Circuit conversation. %{docs_link}"
+msgstr ""
+
msgid "Integrations|Sign in to add namespaces"
msgstr ""
@@ -18131,6 +18427,9 @@ msgstr ""
msgid "Integrations|You've activated every integration 🎉"
msgstr ""
+msgid "Integrations|ZenTao issues display here when you create issues in your project in ZenTao."
+msgstr ""
+
msgid "Interactive mode"
msgstr ""
@@ -18158,9 +18457,6 @@ msgstr ""
msgid "Interval Pattern"
msgstr ""
-msgid "Introducing Value Stream Analytics"
-msgstr ""
-
msgid "Introducing Your DevOps Report"
msgstr ""
@@ -18257,6 +18553,12 @@ msgstr ""
msgid "Investigate vulnerability: %{title}"
msgstr ""
+msgid "Invisible Captcha"
+msgstr ""
+
+msgid "Invisible Captcha helps prevent the creation of spam accounts. It adds a honeypot field and time-sensitive form submission to the account signup form."
+msgstr ""
+
msgid "Invitation"
msgstr ""
@@ -18710,12 +19012,18 @@ msgstr ""
msgid "Issues"
msgstr ""
+msgid "Issues I've created"
+msgstr ""
+
msgid "Issues Rate Limits"
msgstr ""
msgid "Issues and merge requests"
msgstr ""
+msgid "Issues assigned to me"
+msgstr ""
+
msgid "Issues can be bugs, tasks or ideas to be discussed. Also, issues are searchable and filterable."
msgstr ""
@@ -18827,7 +19135,7 @@ msgstr ""
msgid "Iterations|Create cadence"
msgstr ""
-msgid "Iterations|Create your first iteration"
+msgid "Iterations|Create iteration"
msgstr ""
msgid "Iterations|Delete cadence"
@@ -18836,6 +19144,9 @@ msgstr ""
msgid "Iterations|Delete iteration cadence?"
msgstr ""
+msgid "Iterations|Delete iteration?"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -18869,12 +19180,18 @@ msgstr ""
msgid "Iterations|New iteration cadence"
msgstr ""
+msgid "Iterations|No closed iterations."
+msgstr ""
+
msgid "Iterations|No iteration cadences to show."
msgstr ""
msgid "Iterations|No iterations in cadence."
msgstr ""
+msgid "Iterations|No open iterations."
+msgstr ""
+
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
@@ -18905,6 +19222,9 @@ msgstr ""
msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
msgstr ""
+msgid "Iterations|This will remove the iteration from any issues that are assigned to it."
+msgstr ""
+
msgid "Iterations|Title"
msgstr ""
@@ -18920,15 +19240,9 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "I’m familiar with the basics of DevOps."
-msgstr ""
-
msgid "I’m joining my team who’s already on GitLab"
msgstr ""
-msgid "I’m not familiar with the basics of DevOps."
-msgstr ""
-
msgid "Jaeger URL"
msgstr ""
@@ -19193,6 +19507,9 @@ msgstr ""
msgid "Job"
msgstr ""
+msgid "Job %{jobName}"
+msgstr ""
+
msgid "Job Failed #%{build_id}"
msgstr ""
@@ -19783,9 +20100,6 @@ msgstr ""
msgid "Learn more in the"
msgstr ""
-msgid "Learn more in the|pipeline schedules documentation"
-msgstr ""
-
msgid "Learn more."
msgstr ""
@@ -19897,9 +20211,6 @@ msgstr ""
msgid "Leave Admin Mode"
msgstr ""
-msgid "Leave blank for no limit. Once set, existing personal access tokens may be revoked."
-msgstr ""
-
msgid "Leave edit mode? All unsaved changes will be lost."
msgstr ""
@@ -19945,10 +20256,10 @@ msgstr ""
msgid "LicenseCompliance|Acceptable license to be used in the project"
msgstr ""
-msgid "LicenseCompliance|Add a license"
+msgid "LicenseCompliance|Add license and related policy"
msgstr ""
-msgid "LicenseCompliance|Add license and related policy"
+msgid "LicenseCompliance|Add license policy"
msgstr ""
msgid "LicenseCompliance|Allow"
@@ -20038,6 +20349,9 @@ msgstr ""
msgid "LicenseManagement|Uncategorized"
msgstr ""
+msgid "Licensed Enterprise Edition features can be used if the project namespace's plan includes the feature, or if the project is public."
+msgstr ""
+
msgid "Licensed Features"
msgstr ""
@@ -20104,7 +20418,10 @@ msgstr ""
msgid "Limit namespaces and projects that can be indexed"
msgstr ""
-msgid "Limit sign in from multiple ips"
+msgid "Limit project size at a global, group, and project level. %{link_start}Learn more%{link_end}."
+msgstr ""
+
+msgid "Limit sign in from multiple IP addresses"
msgstr ""
msgid "Limit the number of concurrent operations this secondary site can run in the background."
@@ -20116,11 +20433,17 @@ msgstr ""
msgid "Limit the number of issues and epics per minute a user can create through web and API requests."
msgstr ""
+msgid "Limit the size of Sidekiq jobs stored in Redis."
+msgstr ""
+
msgid "Limited to showing %d event at most"
msgid_plural "Limited to showing %d events at most"
msgstr[0] ""
msgstr[1] ""
+msgid "Limiting mode"
+msgstr ""
+
msgid "Line changes"
msgstr ""
@@ -20190,9 +20513,6 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
-msgid "List of users to be excluded from the limit"
-msgstr ""
-
msgid "List options"
msgstr ""
@@ -20232,9 +20552,6 @@ msgstr ""
msgid "Loading functions timed out. Please reload the page to try again."
msgstr ""
-msgid "Loading issues"
-msgstr ""
-
msgid "Loading more"
msgstr ""
@@ -20526,6 +20843,9 @@ msgstr ""
msgid "Marked For Deletion At - %{deletion_time}"
msgstr ""
+msgid "Marked as ready. Merging is now allowed."
+msgstr ""
+
msgid "Marked this %{noun} as a draft."
msgstr ""
@@ -20598,52 +20918,22 @@ msgstr ""
msgid "Max 100,000 events"
msgstr ""
-msgid "Max 20 characters"
-msgstr ""
-
-msgid "Max Group Export Download requests per minute per user"
-msgstr ""
-
-msgid "Max Group Export requests per minute per user"
-msgstr ""
-
-msgid "Max Group Import requests per minute per user"
-msgstr ""
-
-msgid "Max Project Export Download requests per minute per user"
-msgstr ""
-
-msgid "Max Project Export requests per minute per user"
-msgstr ""
-
-msgid "Max Project Import requests per minute per user"
-msgstr ""
-
-msgid "Max authenticated API requests per period per user"
-msgstr ""
-
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
-msgid "Max authenticated web requests per period per user"
-msgstr ""
-
msgid "Max file size is 200 KB."
msgstr ""
-msgid "Max requests per minute per user"
-msgstr ""
-
msgid "Max role"
msgstr ""
msgid "Max session time"
msgstr ""
-msgid "Max unauthenticated requests per period per IP"
+msgid "MaxBuilds"
msgstr ""
-msgid "MaxBuilds"
+msgid "Maximum 20 characters"
msgstr ""
msgid "Maximum Conan package file size in bytes"
@@ -20679,6 +20969,12 @@ msgstr ""
msgid "Maximum attachment size (MB)"
msgstr ""
+msgid "Maximum authenticated API requests per rate limit period per user"
+msgstr ""
+
+msgid "Maximum authenticated web requests per rate limit period per user"
+msgstr ""
+
msgid "Maximum bulk request size (MiB)"
msgstr ""
@@ -20724,6 +21020,15 @@ msgstr ""
msgid "Maximum files in a diff"
msgstr ""
+msgid "Maximum group export download requests per minute"
+msgstr ""
+
+msgid "Maximum group export requests per minute"
+msgstr ""
+
+msgid "Maximum group import requests per minute"
+msgstr ""
+
msgid "Maximum import size"
msgstr ""
@@ -20760,7 +21065,7 @@ msgstr ""
msgid "Maximum number of projects."
msgstr ""
-msgid "Maximum number of unique IPs per user"
+msgid "Maximum number of unique IP addresses per user."
msgstr ""
msgid "Maximum page reached"
@@ -20769,12 +21074,24 @@ msgstr ""
msgid "Maximum page size"
msgstr ""
+msgid "Maximum project export download requests per minute"
+msgstr ""
+
+msgid "Maximum project export requests per minute"
+msgstr ""
+
+msgid "Maximum project import requests per minute"
+msgstr ""
+
msgid "Maximum push size"
msgstr ""
msgid "Maximum push size (MB)"
msgstr ""
+msgid "Maximum requests per minute"
+msgstr ""
+
msgid "Maximum running slices"
msgstr ""
@@ -20802,10 +21119,16 @@ msgstr ""
msgid "Maximum time between updates that a mirror can have when scheduled to synchronize."
msgstr ""
-msgid "Maximum time for web terminal websocket connection (in seconds). 0 for unlimited."
+msgid "Maximum time that users are allowed to skip the setup of two-factor authentication (in hours). Set to 0 (zero) to enforce at next sign in."
msgstr ""
-msgid "Maximum time that users are allowed to skip the setup of two-factor authentication (in hours). Set to 0 (zero) to enforce at next sign in."
+msgid "Maximum time, in seconds, for a web terminal websocket connection. 0 for unlimited."
+msgstr ""
+
+msgid "Maximum unauthenticated API requests per rate limit period per IP"
+msgstr ""
+
+msgid "Maximum unauthenticated web requests per rate limit period per IP"
msgstr ""
msgid "May"
@@ -20823,9 +21146,6 @@ msgstr ""
msgid "Medium vulnerabilities present"
msgstr ""
-msgid "Member lock"
-msgstr ""
-
msgid "Member since"
msgstr ""
@@ -20862,6 +21182,9 @@ msgstr ""
msgid "Members of a group may only view projects they have permission to access"
msgstr ""
+msgid "Membership"
+msgstr ""
+
msgid "Members|%{time} by %{user}"
msgstr ""
@@ -20922,9 +21245,6 @@ msgstr ""
msgid "Members|Expiration date updated successfully."
msgstr ""
-msgid "Members|Expired"
-msgstr ""
-
msgid "Members|Filter members"
msgstr ""
@@ -20940,9 +21260,6 @@ msgstr ""
msgid "Members|Membership"
msgstr ""
-msgid "Members|No expiration set"
-msgstr ""
-
msgid "Members|Remove \"%{groupName}\""
msgstr ""
@@ -20964,9 +21281,6 @@ msgstr ""
msgid "Members|Search invited"
msgstr ""
-msgid "Members|in %{time}"
-msgstr ""
-
msgid "Member|Deny access"
msgstr ""
@@ -21042,9 +21356,6 @@ msgstr ""
msgid "Merge request %{mr_link} was reviewed by %{mr_author}"
msgstr ""
-msgid "Merge request (MR) approvals"
-msgstr ""
-
msgid "Merge request analytics"
msgstr ""
@@ -21066,12 +21377,21 @@ msgstr ""
msgid "Merge requests"
msgstr ""
+msgid "Merge requests I've created"
+msgstr ""
+
msgid "Merge requests are a place to propose changes you've made to a project and discuss those changes with others"
msgstr ""
msgid "Merge requests are read-only in a secondary Geo node"
msgstr ""
+msgid "Merge requests assigned to me"
+msgstr ""
+
+msgid "Merge requests that I'm a reviewer"
+msgstr ""
+
msgid "Merge the branch and fix any conflicts that come up"
msgstr ""
@@ -21132,10 +21452,10 @@ msgstr ""
msgid "MergeRequests|An error occurred while saving the draft comment."
msgstr ""
-msgid "MergeRequests|Failed to squash. Should be done manually."
+msgid "MergeRequests|Create issue to resolve thread"
msgstr ""
-msgid "MergeRequests|Resolve this thread in a new issue"
+msgid "MergeRequests|Failed to squash. Should be done manually."
msgstr ""
msgid "MergeRequests|Saving the comment failed"
@@ -21949,6 +22269,9 @@ msgstr ""
msgid "MoveIssue|Cannot move issue to project it originates from!"
msgstr ""
+msgid "MoveIssue|Cannot move issues of '%{issue_type}' type."
+msgstr ""
+
msgid "Moved issue to %{label} column in the board."
msgstr ""
@@ -22074,6 +22397,15 @@ 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. To learn more about reducing storage capacity please visit our docs."
msgstr ""
+msgid "NamespaceUserCap|Pending users must be reviewed and approved by a group owner. Learn more about %{user_caps_link_start}User Caps%{link_end} and %{users_pending_approval_link_start}Users Pending Approval%{link_end}."
+msgstr ""
+
+msgid "NamespaceUserCap|View pending user approvals"
+msgstr ""
+
+msgid "NamespaceUserCap|Your group has reached its billable member limit"
+msgstr ""
+
msgid "Namespaces"
msgstr ""
@@ -22116,9 +22448,6 @@ msgstr ""
msgid "Network"
msgstr ""
-msgid "Network Policy|New rule"
-msgstr ""
-
msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is inbound from a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
msgstr ""
@@ -22140,16 +22469,13 @@ msgstr ""
msgid "NetworkPolicies|%{strongOpen}any%{strongClose} port"
msgstr ""
-msgid "NetworkPolicies|+ Add alert"
-msgstr ""
-
msgid "NetworkPolicies|.yaml"
msgstr ""
msgid "NetworkPolicies|.yaml mode"
msgstr ""
-msgid "NetworkPolicies|Actions"
+msgid "NetworkPolicies|Add alert"
msgstr ""
msgid "NetworkPolicies|Alerts are intended to be selectively used for a limited number of events that are potentially concerning and warrant a manual review. Alerts should not be used as a substitute for a SIEM or a logging tool. High volume alerts are likely to be dropped so as to preserve the stability of GitLab's integration with Kubernetes."
@@ -22185,9 +22511,6 @@ msgstr ""
msgid "NetworkPolicies|Deny all traffic"
msgstr ""
-msgid "NetworkPolicies|Description"
-msgstr ""
-
msgid "NetworkPolicies|Edit policy"
msgstr ""
@@ -22200,9 +22523,6 @@ msgstr ""
msgid "NetworkPolicies|IP/subnet"
msgstr ""
-msgid "NetworkPolicies|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
-msgstr ""
-
msgid "NetworkPolicies|Invalid or empty policy"
msgstr ""
@@ -22212,19 +22532,16 @@ msgstr ""
msgid "NetworkPolicies|Kubernetes error: %{error}"
msgstr ""
-msgid "NetworkPolicies|Name"
-msgstr ""
-
msgid "NetworkPolicies|Network"
msgstr ""
-msgid "NetworkPolicies|Network traffic"
+msgid "NetworkPolicies|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
msgstr ""
-msgid "NetworkPolicies|New policy"
+msgid "NetworkPolicies|Network policy can be created after the environment is loaded successfully."
msgstr ""
-msgid "NetworkPolicies|No policies detected"
+msgid "NetworkPolicies|Network traffic"
msgstr ""
msgid "NetworkPolicies|None selected"
@@ -22233,21 +22550,12 @@ msgstr ""
msgid "NetworkPolicies|Please %{installLinkStart}install%{installLinkEnd} and %{configureLinkStart}configure a Kubernetes Agent for this project%{configureLinkEnd} to enable alerts."
msgstr ""
-msgid "NetworkPolicies|Policies are a specification of how groups of pods are allowed to communicate with each other's network endpoints."
-msgstr ""
-
msgid "NetworkPolicies|Policy %{policyName} was successfully changed"
msgstr ""
msgid "NetworkPolicies|Policy definition"
msgstr ""
-msgid "NetworkPolicies|Policy editor"
-msgstr ""
-
-msgid "NetworkPolicies|Policy preview"
-msgstr ""
-
msgid "NetworkPolicies|Rule"
msgstr ""
@@ -22257,9 +22565,6 @@ msgstr ""
msgid "NetworkPolicies|Rule mode is unavailable for this policy. In some cases, we cannot parse the YAML file back into the rules editor."
msgstr ""
-msgid "NetworkPolicies|Rules"
-msgstr ""
-
msgid "NetworkPolicies|Save changes"
msgstr ""
@@ -22272,9 +22577,6 @@ msgstr ""
msgid "NetworkPolicies|Traffic that does not match any rule will be blocked."
msgstr ""
-msgid "NetworkPolicies|Unable to parse policy"
-msgstr ""
-
msgid "NetworkPolicies|all DNS names"
msgstr ""
@@ -22454,6 +22756,9 @@ msgstr ""
msgid "New issue"
msgstr ""
+msgid "New issue in %{project}"
+msgstr ""
+
msgid "New issue title"
msgstr ""
@@ -22532,7 +22837,7 @@ msgstr ""
msgid "Newest first"
msgstr ""
-msgid "Newly registered users will by default be external"
+msgid "Newly-registered users are external by default"
msgstr ""
msgid "Next"
@@ -22847,8 +23152,10 @@ msgstr ""
msgid "No webhooks found, add one in the form above."
msgstr ""
-msgid "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} to renew your subscription."
-msgstr ""
+msgid "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} day to renew your subscription."
+msgid_plural "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} days to renew your subscription."
+msgstr[0] ""
+msgstr[1] ""
msgid "No. of commits"
msgstr ""
@@ -22865,7 +23172,7 @@ msgstr ""
msgid "Nodes"
msgstr ""
-msgid "Non-admin users can sign in with read-only access and make read-only API requests."
+msgid "Non-admin users are restricted to read-only access, in both GitLab UI and API."
msgstr ""
msgid "None"
@@ -22946,7 +23253,7 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
-msgid "Notes Rate Limits"
+msgid "Notes rate limit"
msgstr ""
msgid "Notes|Are you sure you want to cancel creating this comment?"
@@ -23113,9 +23420,6 @@ msgstr ""
msgid "November"
msgstr ""
-msgid "Novice"
-msgstr ""
-
msgid "Now, personalize your GitLab experience"
msgstr ""
@@ -23284,7 +23588,7 @@ msgstr ""
msgid "OnCallSchedules|For this rotation, on-call will be:"
msgstr ""
-msgid "OnCallSchedules|On-call schedule %{schedule} in Project %{project}"
+msgid "OnCallSchedules|On-call schedule %{obstacle} in Project %{project}"
msgstr ""
msgid "OnCallSchedules|On-call schedules"
@@ -23431,22 +23735,22 @@ msgstr ""
msgid "OnDemandScans|Scanner profile"
msgstr ""
-msgid "OnDemandScans|Select one of the existing profiles"
+msgid "OnDemandScans|Schedule scan"
msgstr ""
-msgid "OnDemandScans|Site profile"
+msgid "OnDemandScans|Select one of the existing profiles"
msgstr ""
-msgid "OnDemandScans|Use existing scanner profile"
+msgid "OnDemandScans|Site profile"
msgstr ""
-msgid "OnDemandScans|Use existing site profile"
+msgid "OnDemandScans|Start time"
msgstr ""
-msgid "OnDemandScans|You can either choose a passive scan or validate the target site in your chosen site profile. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
+msgid "OnDemandScans|Use existing scanner profile"
msgstr ""
-msgid "OnDemandScans|You cannot run an active scan against an unvalidated site."
+msgid "OnDemandScans|Use existing site profile"
msgstr ""
msgid "OnDemandScans|You must create a repository within your project to run an on-demand scan."
@@ -23511,6 +23815,9 @@ msgstr ""
msgid "Only admins can delete project"
msgstr ""
+msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
+msgstr ""
+
msgid "Only include features new to your current subscription tier."
msgstr ""
@@ -23529,6 +23836,12 @@ msgstr ""
msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
+msgid "Only reCAPTCHA v2 is supported:"
+msgstr ""
+
+msgid "Only users from the specified IP address ranges are able to reach this group, including all subgroups, projects, and Git repositories."
+msgstr ""
+
msgid "Only verified users with an email address in any of these domains can be added to the group."
msgstr ""
@@ -23715,9 +24028,6 @@ msgstr ""
msgid "Package Registry"
msgstr ""
-msgid "Package Registry Rate Limits"
-msgstr ""
-
msgid "Package Registry: authenticated API requests"
msgstr ""
@@ -23736,6 +24046,9 @@ msgstr ""
msgid "Package recipe already exists"
msgstr ""
+msgid "Package registry rate limits"
+msgstr ""
+
msgid "Package type"
msgstr ""
@@ -23802,6 +24115,9 @@ msgstr ""
msgid "PackageRegistry|Composer"
msgstr ""
+msgid "PackageRegistry|Composer.json with license: %{license} and version: %{version}"
+msgstr ""
+
msgid "PackageRegistry|Conan"
msgstr ""
@@ -23865,6 +24181,9 @@ msgstr ""
msgid "PackageRegistry|Copy require package include"
msgstr ""
+msgid "PackageRegistry|Copy target SHA"
+msgstr ""
+
msgid "PackageRegistry|Copy yarn command"
msgstr ""
@@ -23931,6 +24250,9 @@ msgstr ""
msgid "PackageRegistry|Install package version"
msgstr ""
+msgid "PackageRegistry|Instance-level"
+msgstr ""
+
msgid "PackageRegistry|Invalid Package: failed metadata extraction"
msgstr ""
@@ -23976,6 +24298,9 @@ msgstr ""
msgid "PackageRegistry|Pip Command"
msgstr ""
+msgid "PackageRegistry|Project-level"
+msgstr ""
+
msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
msgstr ""
@@ -23997,6 +24322,9 @@ msgstr ""
msgid "PackageRegistry|Remove package"
msgstr ""
+msgid "PackageRegistry|Required Python: %{pythonVersion}"
+msgstr ""
+
msgid "PackageRegistry|RubyGems"
msgstr ""
@@ -24039,6 +24367,9 @@ msgstr ""
msgid "PackageRegistry|Source project located at %{link}"
msgstr ""
+msgid "PackageRegistry|Target SHA: %{sha}"
+msgstr ""
+
msgid "PackageRegistry|There are no other versions of this package."
msgstr ""
@@ -24207,6 +24538,18 @@ msgstr ""
msgid "Password was successfully updated. Please sign in again."
msgstr ""
+msgid "PasswordPrompt|Confirm password"
+msgstr ""
+
+msgid "PasswordPrompt|Confirm password to continue"
+msgstr ""
+
+msgid "PasswordPrompt|Password is required"
+msgstr ""
+
+msgid "PasswordPrompt|Please enter your password to confirm"
+msgstr ""
+
msgid "Passwords should be unique and not used for any other sites or services."
msgstr ""
@@ -24234,6 +24577,9 @@ msgstr ""
msgid "Paste project path (i.e. gitlab-org/gitlab)"
msgstr ""
+msgid "Paste this DSN into your Sentry SDK"
+msgstr ""
+
msgid "Paste your public SSH key, which is usually contained in the file '~/.ssh/id_ed25519.pub' or '~/.ssh/id_rsa.pub' and begins with 'ssh-ed25519' or 'ssh-rsa'. Do not paste your private SSH key, as that can compromise your identity."
msgstr ""
@@ -24318,6 +24664,9 @@ msgstr ""
msgid "PerformanceBar|First Contentful Paint"
msgstr ""
+msgid "PerformanceBar|Flamegraph with mode:"
+msgstr ""
+
msgid "PerformanceBar|Frontend resources"
msgstr ""
@@ -24351,6 +24700,15 @@ msgstr ""
msgid "PerformanceBar|Trace"
msgstr ""
+msgid "PerformanceBar|cpu"
+msgstr ""
+
+msgid "PerformanceBar|object"
+msgstr ""
+
+msgid "PerformanceBar|wall"
+msgstr ""
+
msgid "Period in seconds"
msgstr ""
@@ -24579,6 +24937,48 @@ msgstr ""
msgid "PipelineSchedules|Variables"
msgstr ""
+msgid "PipelineSource|API"
+msgstr ""
+
+msgid "PipelineSource|Chat"
+msgstr ""
+
+msgid "PipelineSource|External"
+msgstr ""
+
+msgid "PipelineSource|External Pull Request"
+msgstr ""
+
+msgid "PipelineSource|Merge Request"
+msgstr ""
+
+msgid "PipelineSource|On-Demand DAST Scan"
+msgstr ""
+
+msgid "PipelineSource|On-Demand DAST Validation"
+msgstr ""
+
+msgid "PipelineSource|Parent Pipeline"
+msgstr ""
+
+msgid "PipelineSource|Pipeline"
+msgstr ""
+
+msgid "PipelineSource|Push"
+msgstr ""
+
+msgid "PipelineSource|Schedule"
+msgstr ""
+
+msgid "PipelineSource|Trigger"
+msgstr ""
+
+msgid "PipelineSource|Web"
+msgstr ""
+
+msgid "PipelineSource|Web IDE"
+msgstr ""
+
msgid "PipelineStatusTooltip|Pipeline: %{ciStatus}"
msgstr ""
@@ -24879,46 +25279,7 @@ msgstr ""
msgid "Pipeline|Source"
msgstr ""
-msgid "Pipeline|Source|API"
-msgstr ""
-
-msgid "Pipeline|Source|Chat"
-msgstr ""
-
-msgid "Pipeline|Source|External"
-msgstr ""
-
-msgid "Pipeline|Source|External Pull Request"
-msgstr ""
-
-msgid "Pipeline|Source|Merge Request"
-msgstr ""
-
-msgid "Pipeline|Source|On-Demand DAST Scan"
-msgstr ""
-
-msgid "Pipeline|Source|On-Demand DAST Validation"
-msgstr ""
-
-msgid "Pipeline|Source|Parent Pipeline"
-msgstr ""
-
-msgid "Pipeline|Source|Pipeline"
-msgstr ""
-
-msgid "Pipeline|Source|Push"
-msgstr ""
-
-msgid "Pipeline|Source|Schedule"
-msgstr ""
-
-msgid "Pipeline|Source|Trigger"
-msgstr ""
-
-msgid "Pipeline|Source|Web"
-msgstr ""
-
-msgid "Pipeline|Source|Web IDE"
+msgid "Pipeline|Source|Security Policy"
msgstr ""
msgid "Pipeline|Specify variable values to be used in this run. The values specified in %{linkStart}CI/CD settings%{linkEnd} will be used by default."
@@ -24969,7 +25330,7 @@ msgstr ""
msgid "Pipeline|We are currently unable to fetch pipeline data"
msgstr ""
-msgid "Pipeline|You’re about to stop pipeline %{pipelineId}."
+msgid "Pipeline|You’re about to stop pipeline #%{pipelineId}."
msgstr ""
msgid "Pipeline|for"
@@ -24996,6 +25357,9 @@ msgstr ""
msgid "Plain diff"
msgstr ""
+msgid "Plain-text response to send to clients that hit a rate limit"
+msgstr ""
+
msgid "Plan:"
msgstr ""
@@ -25140,9 +25504,6 @@ msgstr ""
msgid "Please provide attributes to update"
msgstr ""
-msgid "Please provide your username or email address."
-msgstr ""
-
msgid "Please reach out if you have any questions and we'll be happy to assist."
msgstr ""
@@ -25185,9 +25546,6 @@ msgstr ""
msgid "Please set a new password before proceeding."
msgstr ""
-msgid "Please share your feedback about %{featureName} %{linkStart}in this issue%{linkEnd} to help us improve the experience."
-msgstr ""
-
msgid "Please solve the captcha"
msgstr ""
@@ -25365,6 +25723,9 @@ msgstr ""
msgid "Prevent adding new members to project membership within this group"
msgstr ""
+msgid "Prevent auto-stopping"
+msgstr ""
+
msgid "Prevent editing approval rules in projects and merge requests."
msgstr ""
@@ -25377,7 +25738,7 @@ msgstr ""
msgid "Prevent users from changing their profile name"
msgstr ""
-msgid "Prevent users from performing write operations on GitLab while performing maintenance."
+msgid "Prevent users from performing write operations while GitLab maintenance is in progress."
msgstr ""
msgid "Preview"
@@ -25650,6 +26011,9 @@ msgstr ""
msgid "Profiles|Enter your name, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Enter your password to confirm the email change"
+msgstr ""
+
msgid "Profiles|Enter your pronouns to let people know how to refer to you"
msgstr ""
@@ -25884,10 +26248,10 @@ msgstr ""
msgid "Profiles|e.g. My MacBook key"
msgstr ""
-msgid "Profiles|username"
+msgid "Profiles|https://website.com"
msgstr ""
-msgid "Profiles|website.com"
+msgid "Profiles|username"
msgstr ""
msgid "Profiles|your account"
@@ -26130,9 +26494,21 @@ msgstr ""
msgid "ProjectSelect| or group"
msgstr ""
+msgid "ProjectSelect|No matching results"
+msgstr ""
+
msgid "ProjectSelect|Search for project"
msgstr ""
+msgid "ProjectSelect|Search projects"
+msgstr ""
+
+msgid "ProjectSelect|Select a project"
+msgstr ""
+
+msgid "ProjectSelect|There was an error fetching the projects. Please try again."
+msgstr ""
+
msgid "ProjectService|Drone server URL"
msgstr ""
@@ -26220,6 +26596,9 @@ msgstr ""
msgid "ProjectService|Trigger event when a new, unique alert is recorded."
msgstr ""
+msgid "ProjectService|Trigger event when a new, unique vulnerability is recorded. (Note: This feature requires an Ultimate plan.)"
+msgstr ""
+
msgid "ProjectService|Trigger event when a pipeline status changes."
msgstr ""
@@ -26634,9 +27013,15 @@ msgstr ""
msgid "Projects are graded based on the highest severity vulnerability present"
msgstr ""
+msgid "Projects are organized into groups"
+msgstr ""
+
msgid "Projects contributed to"
msgstr ""
+msgid "Projects help you organize your work. They contain your file repository, issues, merge requests, and so much more."
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr ""
@@ -26871,10 +27256,10 @@ msgstr ""
msgid "PrometheusService|Prometheus cluster integration"
msgstr ""
-msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
+msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
msgstr ""
-msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
+msgid "PrometheusService|The ID of the IAP-secured resource."
msgstr ""
msgid "PrometheusService|The Prometheus API base URL."
@@ -27492,6 +27877,9 @@ msgstr ""
msgid "Rate limit"
msgstr ""
+msgid "Rate limits can help reduce request volume (like from crawlers or abusive bots)."
+msgstr ""
+
msgid "Raw blob request rate limit per minute"
msgstr ""
@@ -27504,6 +27892,9 @@ msgstr ""
msgid "Re-authentication required"
msgstr ""
+msgid "Re-import"
+msgstr ""
+
msgid "Re-request review"
msgstr ""
@@ -27525,6 +27916,9 @@ msgstr ""
msgid "Read more about related issues"
msgstr ""
+msgid "Read their documentation."
+msgstr ""
+
msgid "Ready to get started with GitLab? Follow these steps to set up your workspace, plan and commit changes, and deploy your project."
msgstr ""
@@ -27558,6 +27952,9 @@ msgstr ""
msgid "Receive any notifications from GitLab."
msgstr ""
+msgid "Receive notification of abuse reports by email."
+msgstr ""
+
msgid "Receive notifications about your own activity"
msgstr ""
@@ -27701,9 +28098,6 @@ msgstr ""
msgid "Registry setup"
msgstr ""
-msgid "Regulate approvals by authors/committers. Affects all projects."
-msgstr ""
-
msgid "Reindexing Status: %{status} (Slice multiplier: %{multiplier}, Maximum running slices: %{max_slices})"
msgstr ""
@@ -27799,6 +28193,9 @@ msgstr ""
msgid "Release|Something went wrong while saving the release details."
msgstr ""
+msgid "Reload page"
+msgstr ""
+
msgid "Remediations"
msgstr ""
@@ -28081,6 +28478,9 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
+msgid "Repeats"
+msgstr ""
+
msgid "Replace"
msgstr ""
@@ -28443,10 +28843,7 @@ msgstr ""
msgid "Require additional authentication for administrative tasks."
msgstr ""
-msgid "Require all users in this group to setup Two-factor authentication"
-msgstr ""
-
-msgid "Require all users in this group to setup two-factor authentication"
+msgid "Require all users in this group to set up two-factor authentication"
msgstr ""
msgid "Required approvals (%{approvals_given} given)"
@@ -28492,6 +28889,9 @@ msgstr[1] ""
msgid "Requires values to meet regular expression requirements."
msgstr ""
+msgid "Requires you to deploy or set up cloud-hosted Sentry."
+msgstr ""
+
msgid "Requires your primary GitLab email address."
msgstr ""
@@ -28552,9 +28952,6 @@ msgstr ""
msgid "Resolve"
msgstr ""
-msgid "Resolve all threads in new issue"
-msgstr ""
-
msgid "Resolve conflicts"
msgstr ""
@@ -28612,6 +29009,9 @@ msgstr ""
msgid "Response text"
msgstr ""
+msgid "Restart GitLab to apply changes."
+msgstr ""
+
msgid "Restart Terminal"
msgstr ""
@@ -28630,6 +29030,9 @@ msgstr ""
msgid "Restoring the project will prevent the project from being removed on this date and restore people's ability to make changes to it."
msgstr ""
+msgid "Restrict group access by IP address. %{link_start}Learn more%{link_end}."
+msgstr ""
+
msgid "Restrict membership by email domain"
msgstr ""
@@ -28943,6 +29346,9 @@ msgstr ""
msgid "Runners|Runner #%{runner_id}"
msgstr ""
+msgid "Runners|Runner assigned to project."
+msgstr ""
+
msgid "Runners|Runner is offline, last contact was %{runner_contact} ago"
msgstr ""
@@ -28955,6 +29361,9 @@ msgstr ""
msgid "Runners|Runner registration"
msgstr ""
+msgid "Runners|Runner unassigned from project."
+msgstr ""
+
msgid "Runners|Runners"
msgstr ""
@@ -29147,7 +29556,7 @@ msgstr ""
msgid "SastEntryPoints|How do I set up SAST?"
msgstr ""
-msgid "SastEntryPoints|Learn more."
+msgid "SastEntryPoints|Learn more"
msgstr ""
msgid "Satisfied"
@@ -29189,7 +29598,7 @@ msgstr ""
msgid "Save pipeline schedule"
msgstr ""
-msgid "Save space and find images in the container Registry. remove unneeded tags and keep only the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
+msgid "Save storage space by automatically deleting tags from the container registry and keeping the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
msgstr ""
msgid "Saving"
@@ -29363,6 +29772,9 @@ msgstr ""
msgid "Search or filter results…"
msgstr ""
+msgid "Search or jump to..."
+msgstr ""
+
msgid "Search project"
msgstr ""
@@ -29423,16 +29835,16 @@ msgstr ""
msgid "SearchCodeResults|of %{link_to_project}"
msgstr ""
-msgid "SearchResults|Showing %{count} %{scope} for%{term_element}"
+msgid "SearchResults|Showing %{count} %{scope} for %{term_element}"
msgstr ""
-msgid "SearchResults|Showing %{count} %{scope} for%{term_element} in your personal and project snippets"
+msgid "SearchResults|Showing %{count} %{scope} for %{term_element} in your personal and project snippets"
msgstr ""
-msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for%{term_element}"
+msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for %{term_element}"
msgstr ""
-msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for%{term_element} in your personal and project snippets"
+msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for %{term_element} in your personal and project snippets"
msgstr ""
msgid "SearchResults|code result"
@@ -29514,6 +29926,9 @@ msgstr ""
msgid "Secret Detection"
msgstr ""
+msgid "Secret access key"
+msgstr ""
+
msgid "Secret token"
msgstr ""
@@ -29553,9 +29968,6 @@ msgstr ""
msgid "SecurityApprovals|A merge request approval is required when the license compliance report contains a denied license."
msgstr ""
-msgid "SecurityApprovals|Configurable if security scanners are enabled. %{linkStart}Learn more.%{linkEnd}"
-msgstr ""
-
msgid "SecurityApprovals|Coverage-Check"
msgstr ""
@@ -29568,24 +29980,18 @@ msgstr ""
msgid "SecurityApprovals|Learn more about Vulnerability-Check"
msgstr ""
-msgid "SecurityApprovals|License Scanning must be enabled. %{linkStart}Learn more%{linkEnd}."
-msgstr ""
-
msgid "SecurityApprovals|License-Check"
msgstr ""
msgid "SecurityApprovals|Requires approval for Denied licenses. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}More information%{linkEnd}"
+msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "SecurityApprovals|Requires approval for vulnerabilities. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
-msgid "SecurityApprovals|Test coverage must be enabled. %{linkStart}Learn more%{linkEnd}."
-msgstr ""
-
msgid "SecurityApprovals|Vulnerability-Check"
msgstr ""
@@ -29649,6 +30055,12 @@ msgstr ""
msgid "SecurityConfiguration|Immediately begin risk analysis and remediation with application security features. Start with SAST and Secret Detection, available to all plans. Upgrade to Ultimate to get all features, including:"
msgstr ""
+msgid "SecurityConfiguration|Manage corpus"
+msgstr ""
+
+msgid "SecurityConfiguration|Manage corpus files used as mutation sources in coverage fuzzing."
+msgstr ""
+
msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
msgstr ""
@@ -29703,6 +30115,12 @@ msgstr ""
msgid "SecurityOrchestration|Action"
msgstr ""
+msgid "SecurityOrchestration|Actions"
+msgstr ""
+
+msgid "SecurityOrchestration|Add rule"
+msgstr ""
+
msgid "SecurityOrchestration|All policies"
msgstr ""
@@ -29736,9 +30154,6 @@ msgstr ""
msgid "SecurityOrchestration|Network"
msgstr ""
-msgid "SecurityOrchestration|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
-msgstr ""
-
msgid "SecurityOrchestration|New policy"
msgstr ""
@@ -29754,6 +30169,9 @@ msgstr ""
msgid "SecurityOrchestration|Policy editor"
msgstr ""
+msgid "SecurityOrchestration|Policy preview"
+msgstr ""
+
msgid "SecurityOrchestration|Policy status"
msgstr ""
@@ -29763,6 +30181,9 @@ msgstr ""
msgid "SecurityOrchestration|Rule"
msgstr ""
+msgid "SecurityOrchestration|Rules"
+msgstr ""
+
msgid "SecurityOrchestration|Scan Execution"
msgstr ""
@@ -29856,6 +30277,9 @@ msgstr ""
msgid "SecurityReports|Create issue"
msgstr ""
+msgid "SecurityReports|Development vulnerabilities"
+msgstr ""
+
msgid "SecurityReports|Dismiss vulnerability"
msgstr ""
@@ -29871,6 +30295,9 @@ msgstr ""
msgid "SecurityReports|Download results"
msgstr ""
+msgid "SecurityReports|Download scanned URLs"
+msgstr ""
+
msgid "SecurityReports|Download scanned resources"
msgstr ""
@@ -29994,6 +30421,9 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
+msgid "SecurityReports|The Vulnerability Report shows the results of the lastest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "SecurityReports|The security reports below contain one or more vulnerability findings that could not be parsed and were not recorded. Download the artifacts in the job output to investigate. Ensure any security report created conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
msgstr ""
@@ -30135,10 +30565,10 @@ msgstr ""
msgid "Select a repository"
msgstr ""
-msgid "Select a role"
+msgid "Select a repository containing templates for common files."
msgstr ""
-msgid "Select a shared template repository for all projects on this instance."
+msgid "Select a role"
msgstr ""
msgid "Select a template repository"
@@ -30216,6 +30646,9 @@ msgstr ""
msgid "Select project to choose zone"
msgstr ""
+msgid "Select project to create issue"
+msgstr ""
+
msgid "Select projects"
msgstr ""
@@ -30333,6 +30766,9 @@ msgstr ""
msgid "Send emails to help guide new users through the onboarding process."
msgstr ""
+msgid "Send emails to users upon account deactivation."
+msgstr ""
+
msgid "Send message"
msgstr ""
@@ -30351,6 +30787,9 @@ msgstr ""
msgid "Send service data"
msgstr ""
+msgid "Sentry"
+msgstr ""
+
msgid "Sentry API URL"
msgstr ""
@@ -30465,6 +30904,9 @@ msgstr ""
msgid "Service"
msgstr ""
+msgid "Service Accounts keys are required to authorize GitLab to deploy your Google Cloud project."
+msgstr ""
+
msgid "Service Desk"
msgstr ""
@@ -30537,15 +30979,15 @@ msgstr ""
msgid "Set a password on your account to pull or push via %{protocol}."
msgstr ""
-msgid "Set a template repository for projects in this group"
-msgstr ""
-
msgid "Set access permissions for this token."
msgstr ""
msgid "Set an instance-wide domain that will be available to all clusters when installing Knative."
msgstr ""
+msgid "Set any rate limit to %{code_open}0%{code_close} to disable the limit."
+msgstr ""
+
msgid "Set default and restrict visibility levels. Configure import sources and git access protocol."
msgstr ""
@@ -30558,7 +31000,7 @@ msgstr ""
msgid "Set limit to 0 to allow any file size."
msgstr ""
-msgid "Set max session time for web terminal."
+msgid "Set limits for web and API requests."
msgstr ""
msgid "Set milestone"
@@ -30567,15 +31009,18 @@ msgstr ""
msgid "Set new password"
msgstr ""
-msgid "Set notification email for abuse reports."
+msgid "Set parent epic to an epic"
msgstr ""
-msgid "Set parent epic to an epic"
+msgid "Set per-user rate limits for imports and exports of projects and groups."
msgstr ""
msgid "Set projects and maximum size limits, session duration, user options, and check feature availability for namespace plan."
msgstr ""
+msgid "Set rate limits for package registry API requests that supersede the general user and IP rate limits."
+msgstr ""
+
msgid "Set severity"
msgstr ""
@@ -30594,15 +31039,24 @@ msgstr ""
msgid "Set the default branch for this project. All merge requests and commits are made against this branch unless you specify a different one."
msgstr ""
+msgid "Set the default expiration time for job artifacts in all projects. Set to %{code_open}0%{code_close} to never expire artifacts by default. If no unit is written, it defaults to seconds. For example, these are all equivalent: %{code_open}3600%{code_close}, %{code_open}60 minutes%{code_close}, or %{code_open}one hour%{code_close}."
+msgstr ""
+
msgid "Set the due date to %{due_date}."
msgstr ""
msgid "Set the iteration to %{iteration_reference}."
msgstr ""
+msgid "Set the maximum session time for a web terminal."
+msgstr ""
+
msgid "Set the milestone to %{milestone_reference}."
msgstr ""
+msgid "Set the per-user rate limit for notes created by web or API requests."
+msgstr ""
+
msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
msgstr ""
@@ -30804,6 +31258,9 @@ msgstr ""
msgid "Show Pipeline IID"
msgstr ""
+msgid "Show all %{issuable_type}."
+msgstr ""
+
msgid "Show all activity"
msgstr ""
@@ -30855,15 +31312,9 @@ msgstr ""
msgid "Show list"
msgstr ""
-msgid "Show me advanced features"
-msgstr ""
-
msgid "Show me how to add a pipeline"
msgstr ""
-msgid "Show me the basics"
-msgstr ""
-
msgid "Show one file at a time"
msgstr ""
@@ -30904,15 +31355,15 @@ msgstr ""
msgid "Showing %{pageSize} of %{total} %{issuableType}"
msgstr ""
-msgid "Showing %{pageSize} of %{total} issues"
-msgstr ""
-
msgid "Showing all epics"
msgstr ""
msgid "Showing all issues"
msgstr ""
+msgid "Showing data for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
+msgstr ""
+
msgid "Showing data for workflow items created in this date range. Date range cannot exceed %{maxDateRange} days."
msgstr ""
@@ -30952,6 +31403,15 @@ msgstr ""
msgid "Sidebar|Weight"
msgstr ""
+msgid "Sidekiq job compression threshold (bytes)"
+msgstr ""
+
+msgid "Sidekiq job size limit (bytes)"
+msgstr ""
+
+msgid "Sidekiq job size limits"
+msgstr ""
+
msgid "Sign in"
msgstr ""
@@ -31072,6 +31532,9 @@ msgstr ""
msgid "Site profile not found for given parameters"
msgstr ""
+msgid "Sites"
+msgstr ""
+
msgid "Size"
msgstr ""
@@ -31102,19 +31565,22 @@ msgstr ""
msgid "SlackIntegration|Sends notifications about project events to Slack channels."
msgstr ""
-msgid "SlackService|2. Paste the %{strong_open}Token%{strong_close} into the field below"
+msgid "SlackService|1. %{slash_command_link_start}Add a slash command%{slash_command_link_end} in your Slack team using this information:"
msgstr ""
-msgid "SlackService|3. Select the %{strong_open}Active%{strong_close} checkbox, press %{strong_open}Save changes%{strong_close} and start using GitLab inside Slack!"
+msgid "SlackService|2. Paste the token from Slack in the %{strong_open}Token%{strong_close} field below."
msgstr ""
-msgid "SlackService|Fill in the word that works best for your team."
+msgid "SlackService|3. Select the %{strong_open}Active%{strong_close} checkbox, select %{strong_open}Save changes%{strong_close}, and start using slash commands in Slack!"
+msgstr ""
+
+msgid "SlackService|After setup, get a list of available Slack slash commands by entering"
msgstr ""
-msgid "SlackService|See list of available commands in Slack after setting up this service, by entering"
+msgid "SlackService|Fill in the word that works best for your team."
msgstr ""
-msgid "SlackService|This service allows users to perform common operations on this project by entering slash commands in Slack."
+msgid "SlackService|Perform common operations in this project by entering slash commands in Slack."
msgstr ""
msgid "Slice multiplier"
@@ -31180,7 +31646,7 @@ msgstr ""
msgid "Some child epics may be hidden due to applied filters"
msgstr ""
-msgid "Some common domains are not allowed. %{read_more_link}."
+msgid "Some common domains are not allowed. %{learn_more_link}."
msgstr ""
msgid "Some of the designs you tried uploading did not change:"
@@ -31264,9 +31730,6 @@ msgstr ""
msgid "Something went wrong while exporting requirements"
msgstr ""
-msgid "Something went wrong while fetching %{listType} list"
-msgstr ""
-
msgid "Something went wrong while fetching branches"
msgstr ""
@@ -31321,15 +31784,9 @@ msgstr ""
msgid "Something went wrong while merging this merge request. Please try again."
msgstr ""
-msgid "Something went wrong while moving issues."
-msgstr ""
-
msgid "Something went wrong while obtaining the Let's Encrypt certificate."
msgstr ""
-msgid "Something went wrong while performing the action."
-msgstr ""
-
msgid "Something went wrong while promoting the issue to an epic. Please try again."
msgstr ""
@@ -31657,7 +32114,10 @@ msgstr ""
msgid "SourcegraphPreferences|Uses a custom %{linkStart}Sourcegraph instance%{linkEnd}."
msgstr ""
-msgid "Spam Check API Key"
+msgid "Spam Check"
+msgstr ""
+
+msgid "Spam Check API key"
msgstr ""
msgid "Spam Logs"
@@ -31675,7 +32135,7 @@ msgstr ""
msgid "Specified URL cannot be used: \"%{reason}\""
msgstr ""
-msgid "Specify an e-mail address regex pattern to identify default internal users."
+msgid "Specify an email address regex pattern to identify default internal users."
msgstr ""
msgid "Speed up your pipelines with Needs relationships"
@@ -31930,7 +32390,7 @@ msgstr ""
msgid "StatusCheck|An error occurred fetching the status checks."
msgstr ""
-msgid "StatusCheck|Apply this status check to any branch or a specific protected branch."
+msgid "StatusCheck|Apply this status check to all branches or a specific protected branch."
msgstr ""
msgid "StatusCheck|Check for a status response in Merge Requests. Failures do not block merges. %{link_start}Learn more%{link_end}."
@@ -32269,6 +32729,9 @@ msgstr ""
msgid "Subscriptions"
msgstr ""
+msgid "Subscription|Your subscription for %{strong}%{namespace_name}%{strong_close} has expired and you are now on %{pricing_link_start}the GitLab Free tier%{pricing_link_end}. Don't worry, your data is safe. Get in touch with our support team (%{support_email}). They'll gladly help with your subscription renewal."
+msgstr ""
+
msgid "Subtracted"
msgstr ""
@@ -32497,6 +32960,9 @@ msgstr ""
msgid "SuperSonics|Plan"
msgstr ""
+msgid "SuperSonics|Please agree to the Subscription Agreement"
+msgstr ""
+
msgid "SuperSonics|Ready to get started? A GitLab plan is ideal for scaling organizations and for multi team usage."
msgstr ""
@@ -32527,6 +32993,9 @@ msgstr ""
msgid "SuperSonics|The activation code is not valid. Please make sure to copy it exactly from the Customers Portal or confirmation email. Learn more about %{linkStart}activating your subscription%{linkEnd}."
msgstr ""
+msgid "SuperSonics|The activation code should be a 24-character alphanumeric string"
+msgstr ""
+
msgid "SuperSonics|There is a connectivity issue."
msgstr ""
@@ -32569,9 +33038,15 @@ msgstr ""
msgid "SuperSonics|You do not have an active subscription"
msgstr ""
+msgid "SuperSonics|You have successfully added a license that activates on %{date}. Please see the subscription history table below for more details."
+msgstr ""
+
msgid "SuperSonics|You'll be charged for %{trueUpLinkStart}users over license%{trueUpLinkEnd} on a quarterly or annual basis, depending on the terms of your agreement."
msgstr ""
+msgid "SuperSonics|Your future dated license was successfully added"
+msgstr ""
+
msgid "SuperSonics|Your subscription"
msgstr ""
@@ -32824,7 +33299,7 @@ msgstr ""
msgid "Template to append to all Service Desk issues"
msgstr ""
-msgid "TemplateRepository|Select a repository to make its templates available to all projects. %{link_start}What should the repository contain?%{link_end} "
+msgid "TemplateRepository|Create common files more quickly, and standardize their format."
msgstr ""
msgid "Templates"
@@ -33030,7 +33505,7 @@ msgstr ""
msgid "TestCases|Search test cases"
msgstr ""
-msgid "TestCases|Something went wrong while adding test case to Todo."
+msgid "TestCases|Something went wrong while adding test case to a to-do item."
msgstr ""
msgid "TestCases|Something went wrong while creating a test case."
@@ -33042,7 +33517,7 @@ msgstr ""
msgid "TestCases|Something went wrong while fetching test cases list."
msgstr ""
-msgid "TestCases|Something went wrong while marking test case todo as done."
+msgid "TestCases|Something went wrong while marking test case to-do item as done."
msgstr ""
msgid "TestCases|Something went wrong while moving test case."
@@ -33162,7 +33637,7 @@ msgstr ""
msgid "Thanks for your purchase!"
msgstr ""
-msgid "That is ok, I do not want to renew"
+msgid "That's OK, I don't want to renew"
msgstr ""
msgid "That's it, well done!"
@@ -33185,7 +33660,7 @@ msgid_plural "The %{type} contains the following errors:"
msgstr[0] ""
msgstr[1] ""
-msgid "The API key used by GitLab for accessing the Spam Check service endpoint"
+msgid "The API key used by GitLab for accessing the Spam Check service endpoint."
msgstr ""
msgid "The GitLab subscription service (customers.gitlab.com) is currently experiencing an outage. You can monitor the status and get updates at %{linkStart}status.gitlab.com%{linkEnd}."
@@ -33224,9 +33699,6 @@ msgstr ""
msgid "The URL to use for connecting to Elasticsearch. Use a comma-separated list to support clustering (e.g., \"http://localhost:9200, http://localhost:9201\")."
msgstr ""
-msgid "The Vulnerability Report shows the results of the last successful pipeline run on the default branch."
-msgstr ""
-
msgid "The X509 Certificate to use when mutual TLS is required to communicate with the external authorization service. If left blank, the server certificate is still validated when accessing over HTTPS."
msgstr ""
@@ -33284,9 +33756,6 @@ msgstr ""
msgid "The default branch for this project has been changed. Please update your bookmarks."
msgstr ""
-msgid "The default expiration time for job artifacts. 0 for unlimited. The default unit is in seconds, but you can use other units, for example %{code_open}4 mins 2 sec%{code_close}, %{code_open}2h42min%{code_close}."
-msgstr ""
-
msgid "The dependency list details information about the components used within your project."
msgstr ""
@@ -33478,9 +33947,6 @@ msgstr ""
msgid "The merge conflicts for this merge request have already been resolved. Please return to the merge request."
msgstr ""
-msgid "The merge request can now be merged."
-msgstr ""
-
msgid "The metric must be one of %{metrics}."
msgstr ""
@@ -33856,7 +34322,7 @@ msgstr ""
msgid "There was a problem updating the keep latest artifacts setting."
msgstr ""
-msgid "There was an error %{message} todo."
+msgid "There was an error %{message} to-do item."
msgstr ""
msgid "There was an error adding a To Do."
@@ -33895,6 +34361,9 @@ msgstr ""
msgid "There was an error fetching projects"
msgstr ""
+msgid "There was an error fetching search autocomplete suggestions"
+msgstr ""
+
msgid "There was an error fetching stage total counts"
msgstr ""
@@ -34219,6 +34688,9 @@ msgstr ""
msgid "This field is required."
msgstr ""
+msgid "This form is disabled in preview"
+msgstr ""
+
msgid "This group"
msgstr ""
@@ -34240,9 +34712,6 @@ msgstr ""
msgid "This group is linked to a subscription"
msgstr ""
-msgid "This group, including all subgroups, projects and git repositories, will be reachable from only the specified IP address ranges."
-msgstr ""
-
msgid "This group, its subgroups and projects has been scheduled for removal on %{date}."
msgstr ""
@@ -34522,9 +34991,6 @@ msgstr ""
msgid "This user cannot be unlocked manually from GitLab"
msgstr ""
-msgid "This user does not have a pending request"
-msgstr ""
-
msgid "This user has an unconfirmed email address (%{email}). You may force a confirmation."
msgstr ""
@@ -34633,9 +35099,6 @@ msgstr ""
msgid "ThreatMonitoring|Packet Activity"
msgstr ""
-msgid "ThreatMonitoring|Policies"
-msgstr ""
-
msgid "ThreatMonitoring|Requests"
msgstr ""
@@ -34687,6 +35150,12 @@ msgstr ""
msgid "ThreatMonitoring|View documentation"
msgstr ""
+msgid "Threshold in bytes at which to compress Sidekiq job arguments."
+msgstr ""
+
+msgid "Threshold in bytes at which to reject Sidekiq jobs. Set this to 0 to if you don't want to limit Sidekiq jobs."
+msgstr ""
+
msgid "Throughput"
msgstr ""
@@ -34696,6 +35165,9 @@ msgstr ""
msgid "Time"
msgstr ""
+msgid "Time (in hours) that users are allowed to skip forced configuration of two-factor authentication."
+msgstr ""
+
msgid "Time Spent"
msgstr ""
@@ -34762,7 +35234,7 @@ msgstr ""
msgid "TimeTrackingEstimated|Est"
msgstr ""
-msgid "TimeTracking|%{startTag}Spent: %{endTag}%{timeSpentHumanReadable}"
+msgid "TimeTracking|%{spentStart}Spent: %{spentEnd}"
msgstr ""
msgid "TimeTracking|Estimated:"
@@ -34976,6 +35448,9 @@ msgstr ""
msgid "To access this domain create a new DNS record"
msgstr ""
+msgid "To add a custom suffix, set up a Service Desk email address. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "To add an SSH key you need to %{generate_link_start}generate one%{link_end} or use an %{existing_link_start}existing key%{link_end}."
msgstr ""
@@ -34997,13 +35472,16 @@ msgstr ""
msgid "To connect an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To continue using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
+msgstr ""
+
msgid "To continue, you need to select the link in the confirmation email we sent to verify your email address. If you didn't get our email, select %{strongStart}Resend confirmation email.%{strongEnd}"
msgstr ""
msgid "To define internal users, first enable new users set to external"
msgstr ""
-msgid "To enable Registration Features, make sure \"Enable service ping\" is checked."
+msgid "To enable Registration Features, first enable Service Ping."
msgstr ""
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
@@ -35030,7 +35508,7 @@ msgstr ""
msgid "To get started, use the link below to confirm your account."
msgstr ""
-msgid "To help improve GitLab and its user experience, GitLab will periodically collect usage information."
+msgid "To help improve GitLab and its user experience, GitLab periodically collects usage information."
msgstr ""
msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
@@ -35063,7 +35541,7 @@ msgstr ""
msgid "To preserve performance only %{strong_open}%{display_size} of %{real_size}%{strong_close} files are displayed."
msgstr ""
-msgid "To protect this issue's confidentiality, %{forkLink} and set the fork's visibility to private."
+msgid "To protect this issue's confidentiality, %{linkStart}fork this project%{linkEnd} and set the fork's visibility to private."
msgstr ""
msgid "To protect this issue's confidentiality, a private fork of this project was selected."
@@ -35096,12 +35574,15 @@ msgstr ""
msgid "To set up SAML authentication for your group through an identity provider like Azure, Okta, Onelogin, Ping Identity, or your custom SAML 2.0 provider:"
msgstr ""
-msgid "To set up this service:"
+msgid "To set up this integration:"
msgstr ""
msgid "To specify the notification level per project of a group you belong to, you need to visit project page and change notification level there."
msgstr ""
+msgid "To start using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
+msgstr ""
+
msgid "To unsubscribe from this issue, please paste the following link into your browser:"
msgstr ""
@@ -35689,9 +36170,6 @@ msgstr ""
msgid "Unable to fetch branches list, please close the form and try again"
msgstr ""
-msgid "Unable to fetch unscanned projects"
-msgstr ""
-
msgid "Unable to fetch vulnerable projects"
msgstr ""
@@ -35746,6 +36224,15 @@ msgstr ""
msgid "Unable to update this issue at this time."
msgstr ""
+msgid "Unapprove a merge request"
+msgstr ""
+
+msgid "Unapprove the current merge request."
+msgstr ""
+
+msgid "Unapproved the current merge request."
+msgstr ""
+
msgid "Unarchive project"
msgstr ""
@@ -35758,16 +36245,13 @@ msgstr ""
msgid "Unassigned"
msgstr ""
-msgid "Unauthenticated API request rate limit"
-msgstr ""
-
-msgid "Unauthenticated rate limit period in seconds"
+msgid "Unauthenticated API rate limit period in seconds"
msgstr ""
-msgid "Unauthenticated request rate limit"
+msgid "Unauthenticated requests"
msgstr ""
-msgid "Unauthenticated requests"
+msgid "Unauthenticated web rate limit period in seconds"
msgstr ""
msgid "Undo"
@@ -35869,18 +36353,6 @@ msgstr ""
msgid "Unresolved"
msgstr ""
-msgid "UnscannedProjects|15 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|30 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|5 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|60 or more days"
-msgstr ""
-
msgid "Unschedule job"
msgstr ""
@@ -36100,6 +36572,9 @@ msgstr ""
msgid "UsageQuota|%{help_link_start}Shared runners%{help_link_end} are disabled, so there are no limits set on pipeline usage"
msgstr ""
+msgid "UsageQuota|%{linkTitle} help link"
+msgstr ""
+
msgid "UsageQuota|%{percentageLeft} of purchased storage is available"
msgstr ""
@@ -36109,6 +36584,9 @@ msgstr ""
msgid "UsageQuota|Artifacts is a sum of build and pipeline artifacts."
msgstr ""
+msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
+msgstr ""
+
msgid "UsageQuota|Buy additional minutes"
msgstr ""
@@ -36118,9 +36596,21 @@ msgstr ""
msgid "UsageQuota|CI minutes usage by project"
msgstr ""
+msgid "UsageQuota|Code packages and container images."
+msgstr ""
+
msgid "UsageQuota|Current period usage"
msgstr ""
+msgid "UsageQuota|File attachments and smaller design graphics."
+msgstr ""
+
+msgid "UsageQuota|Git repository, managed by the Gitaly service."
+msgstr ""
+
+msgid "UsageQuota|Includes project registry, artifacts, packages, wiki, uploads and other items."
+msgstr ""
+
msgid "UsageQuota|Increase storage temporarily"
msgstr ""
@@ -36139,6 +36629,9 @@ msgstr ""
msgid "UsageQuota|Packages"
msgstr ""
+msgid "UsageQuota|Pipeline artifacts and job artifacts, created with CI/CD."
+msgstr ""
+
msgid "UsageQuota|Pipelines"
msgstr ""
@@ -36157,6 +36650,9 @@ msgstr ""
msgid "UsageQuota|Seats"
msgstr ""
+msgid "UsageQuota|Shared bits of code and text."
+msgstr ""
+
msgid "UsageQuota|Snippets"
msgstr ""
@@ -36166,6 +36662,12 @@ msgstr ""
msgid "UsageQuota|Storage"
msgstr ""
+msgid "UsageQuota|Storage type"
+msgstr ""
+
+msgid "UsageQuota|There is a known issue with Artifact storage where the total could be incorrect for some projects. More details and progress are available in %{warningLinkStart}the epic%{warningLinkEnd}."
+msgstr ""
+
msgid "UsageQuota|This is the total amount of storage used across your projects within this namespace."
msgstr ""
@@ -36205,6 +36707,9 @@ msgstr ""
msgid "UsageQuota|Usage"
msgstr ""
+msgid "UsageQuota|Usage Breakdown"
+msgstr ""
+
msgid "UsageQuota|Usage Quotas"
msgstr ""
@@ -36229,6 +36734,9 @@ msgstr ""
msgid "UsageQuota|Wiki"
msgstr ""
+msgid "UsageQuota|Wiki content."
+msgstr ""
+
msgid "UsageQuota|Wikis"
msgstr ""
@@ -36445,7 +36953,10 @@ msgstr ""
msgid "User Settings"
msgstr ""
-msgid "User and IP Rate Limits"
+msgid "User and IP rate limits"
+msgstr ""
+
+msgid "User does not have a pending request"
msgstr ""
msgid "User identity was successfully created."
@@ -36742,6 +37253,9 @@ msgstr ""
msgid "Users can launch a development environment from a GitLab browser tab when the %{linkStart}Gitpod%{linkEnd} integration is enabled."
msgstr ""
+msgid "Users can reactivate their account by signing in."
+msgstr ""
+
msgid "Users can render diagrams in AsciiDoc, Markdown, reStructuredText, and Textile documents using Kroki."
msgstr ""
@@ -36757,6 +37271,9 @@ msgstr ""
msgid "Users requesting access to"
msgstr ""
+msgid "Users to exclude from the rate limit"
+msgstr ""
+
msgid "Users were successfully added."
msgstr ""
@@ -36778,6 +37295,9 @@ msgstr ""
msgid "UsersSelect|Unassigned"
msgstr ""
+msgid "Uses GitLab as a lightweight alternative to Sentry."
+msgstr ""
+
msgid "Using %{code_start}::%{code_end} denotes a %{link_start}scoped label set%{link_end}"
msgstr ""
@@ -36808,10 +37328,7 @@ msgstr ""
msgid "Value Stream Analytics can help you determine your team’s velocity"
msgstr ""
-msgid "Value Stream Analytics gives an overview of how much time it takes to go from idea to production in your project."
-msgstr ""
-
-msgid "Value may contain a variable reference"
+msgid "Value might contain a variable reference"
msgstr ""
msgid "Value stream"
@@ -36877,10 +37394,10 @@ msgstr ""
msgid "ValueStream|The Default Value Stream cannot be deleted"
msgstr ""
-msgid "Variable"
+msgid "Values that contain the %{codeStart}$%{codeEnd} character can be considered a variable reference and expanded. %{docsLinkStart}Learn more.%{docsLinkEnd}"
msgstr ""
-msgid "Variable references indicated by %{codeStart}$%{codeEnd} may be expanded. If this is not what you want, consider %{docsLinkStart}using a workaround to prevent expansion%{docsLinkEnd}."
+msgid "Variable"
msgstr ""
msgid "Variable will be masked in job logs."
@@ -37285,6 +37802,9 @@ msgstr ""
msgid "Vulnerability|Evidence"
msgstr ""
+msgid "Vulnerability|False positive detected"
+msgstr ""
+
msgid "Vulnerability|File"
msgstr ""
@@ -37327,6 +37847,9 @@ msgstr ""
msgid "Vulnerability|Status"
msgstr ""
+msgid "Vulnerability|The scanner determined this vulnerability to be a false positive. Verify the evaluation before changing its status. %{linkStart}Learn more about false positive detection.%{linkEnd}"
+msgstr ""
+
msgid "Vulnerability|The unmodified response is the original response that had no mutations done to the request"
msgstr ""
@@ -37651,9 +38174,6 @@ msgstr ""
msgid "Welcome to GitLab,%{br_tag}%{name}!"
msgstr ""
-msgid "Welcome to the guided GitLab tour"
-msgstr ""
-
msgid "Welcome, %{name}!"
msgstr ""
@@ -37672,9 +38192,6 @@ msgstr ""
msgid "What are you searching for?"
msgstr ""
-msgid "What describes you best?"
-msgstr ""
-
msgid "What does this command do?"
msgstr ""
@@ -37696,13 +38213,13 @@ msgstr ""
msgid "What is your job title? (optional)"
msgstr ""
-msgid "What will you use this group for?"
+msgid "What templates can I create?"
msgstr ""
-msgid "What's new"
+msgid "What will you use this group for?"
msgstr ""
-msgid "What’s your experience level?"
+msgid "What's new"
msgstr ""
msgid "When a deployment job is successful, skip older deployment jobs that are still pending."
@@ -37714,6 +38231,9 @@ msgstr ""
msgid "When an event in GitLab triggers a webhook, you can use the request details to figure out if something went wrong."
msgstr ""
+msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+msgstr ""
+
msgid "When inactive, an external authentication provider must be used."
msgstr ""
@@ -37737,6 +38257,9 @@ msgstr ""
msgid "When:"
msgstr ""
+msgid "Which API requests are affected?"
+msgstr ""
+
msgid "While it's rare to have no vulnerabilities, it can happen. In any event, we ask that you please double check your settings to make sure you've set up your dashboard correctly."
msgstr ""
@@ -38016,6 +38539,9 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|Work Items"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -38091,6 +38617,9 @@ msgstr ""
msgid "You are already a member of this %{member_source}."
msgstr ""
+msgid "You are already impersonating another user"
+msgstr ""
+
msgid "You are an admin, which means granting access to %{client_name} will allow them to interact with GitLab as an admin as well. Proceed with caution."
msgstr ""
@@ -38193,6 +38722,9 @@ msgstr ""
msgid "You can also use project access tokens with Git to authenticate over HTTP(S). %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "You can always change your URL later"
+msgstr ""
+
msgid "You can always edit this later"
msgstr ""
@@ -38349,10 +38881,10 @@ msgstr ""
msgid "You can’t %{tag_start}edit%{tag_end} files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
-msgid "You could not create a new trigger."
+msgid "You can’t edit files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
-msgid "You didn't renew your subscription for %{strong}%{namespace_name}%{strong_close} so it was downgraded to the free plan."
+msgid "You could not create a new trigger."
msgstr ""
msgid "You do not have any subscriptions yet"
@@ -38520,6 +39052,12 @@ msgstr ""
msgid "You must provide your current password in order to change it."
msgstr ""
+msgid "You must sign in to search for specific projects."
+msgstr ""
+
+msgid "You must sign in to search for specific terms."
+msgstr ""
+
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
@@ -38547,6 +39085,9 @@ msgstr ""
msgid "You need to upload a GitLab project export archive (ending in .gz)."
msgstr ""
+msgid "You need to verify your primary email first before enabling Two-Factor Authentication."
+msgstr ""
+
msgid "You successfully declined the invitation"
msgstr ""
@@ -38655,10 +39196,10 @@ msgstr ""
msgid "Your %{host} account was signed in to from a new location"
msgstr ""
-msgid "Your %{strong}%{plan_name}%{strong_close} subscription for %{strong}%{namespace_name}%{strong_close} will expire on %{strong}%{expires_on}%{strong_close}."
+msgid "Your %{strong}%{plan_name}%{strong_close} subscription expires on %{strong}%{expires_on}%{strong_close}. After that date, you cannot create issues or merge requests, or use many other features."
msgstr ""
-msgid "Your %{strong}%{plan_name}%{strong_close} subscription will expire on %{strong}%{expires_on}%{strong_close}. After that, you will not be able to create issues or merge requests as well as many other features."
+msgid "Your %{strong}%{plan_name}%{strong_close} subscription for %{strong}%{namespace_name}%{strong_close} will expire on %{strong}%{expires_on}%{strong_close}."
msgstr ""
msgid "Your CI/CD configuration syntax is invalid. View Lint tab for more details."
@@ -38682,7 +39223,7 @@ msgstr ""
msgid "Your GPG keys (%{count})"
msgstr ""
-msgid "Your GitLab account has been locked due to an excessive amount of unsuccessful sign in attempts. Your account will automatically unlock in %{duration} or you may click the link below to unlock now."
+msgid "Your GitLab account has been locked due to an excessive number of unsuccessful sign in attempts. You can wait for your account to automatically unlock in %{duration} or you can click the link below to unlock now."
msgstr ""
msgid "Your GitLab account request has been approved!"
@@ -38793,6 +39334,9 @@ msgstr ""
msgid "Your commit email is used for web based operations, such as edits and merges."
msgstr ""
+msgid "Your current password is required to register a two-factor authenticator app."
+msgstr ""
+
msgid "Your dashboard has been copied. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
@@ -38892,6 +39436,9 @@ msgstr ""
msgid "Your project limit is %{limit} projects! Please contact your administrator to increase it"
msgstr ""
+msgid "Your project will be created at:"
+msgstr ""
+
msgid "Your projects"
msgstr ""
@@ -38931,11 +39478,10 @@ msgstr ""
msgid "Your subscription expired!"
msgstr ""
-msgid "Your subscription has been downgraded."
-msgstr ""
-
-msgid "Your subscription will expire in %{remaining_days}."
-msgstr ""
+msgid "Your subscription will expire in %{remaining_days} day."
+msgid_plural "Your subscription will expire in %{remaining_days} days."
+msgstr[0] ""
+msgstr[1] ""
msgid "Your username is %{username}."
msgstr ""
@@ -39142,6 +39688,9 @@ msgstr ""
msgid "cannot merge"
msgstr ""
+msgid "cannot not be used for user namespace"
+msgstr ""
+
msgid "ciReport|%{degradedNum} degraded"
msgstr ""
@@ -39465,6 +40014,9 @@ msgstr ""
msgid "created %{timeAgo}"
msgstr ""
+msgid "created %{timeAgo} by %{author}"
+msgstr ""
+
msgid "created by"
msgstr ""
@@ -39509,9 +40061,6 @@ msgstr ""
msgid "does not have a supported extension. Only %{extension_list} are supported"
msgstr ""
-msgid "domain is not authorized for sign-up."
-msgstr ""
-
msgid "download it"
msgstr ""
@@ -39529,18 +40078,13 @@ msgstr ""
msgid "email '%{email}' is not a verified email."
msgstr ""
-msgid "email does not match the allowed domain of %{email_domains}"
-msgid_plural "email does not match the allowed domains: %{email_domains}"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "enabled"
msgstr ""
msgid "encrypted: needs to be a :required, :optional or :migrating!"
msgstr ""
-msgid "ending with MIME type format is not allowed."
+msgid "ending with a reserved file extension is not allowed."
msgstr ""
msgid "entries cannot be larger than 255 characters"
@@ -39564,6 +40108,9 @@ msgstr ""
msgid "estimateCommand|%{slash_command} overwrites the total estimated time."
msgstr ""
+msgid "example.com"
+msgstr ""
+
msgid "exceeds the limit of %{bytes} bytes"
msgstr ""
@@ -39614,9 +40161,6 @@ msgstr ""
msgid "fork"
msgstr ""
-msgid "fork this project"
-msgstr ""
-
msgid "from"
msgstr ""
@@ -39625,6 +40169,9 @@ msgid_plural "from %d jobs"
msgstr[0] ""
msgstr[1] ""
+msgid "frontmatter"
+msgstr ""
+
msgid "group"
msgstr ""
@@ -39652,6 +40199,9 @@ msgstr ""
msgid "has been completed."
msgstr ""
+msgid "has too deep level of nesting"
+msgstr ""
+
msgid "help"
msgstr ""
@@ -39685,9 +40235,21 @@ msgstr ""
msgid "in"
msgstr ""
+msgid "in Infrastructure :: Kubernetes clusters"
+msgstr ""
+
+msgid "in all GitLab"
+msgstr ""
+
+msgid "in group"
+msgstr ""
+
msgid "in group %{link_to_group}"
msgstr ""
+msgid "in project"
+msgstr ""
+
msgid "in project %{link_to_project}"
msgstr ""
@@ -39729,16 +40291,19 @@ msgstr ""
msgid "is not a valid X509 certificate."
msgstr ""
-msgid "is not allowed since the group is not top-level group."
+msgid "is not allowed for sign-up."
msgstr ""
-msgid "is not allowed. Try again with a different email address, or contact your GitLab admin."
+msgid "is not allowed for this group."
msgstr ""
-msgid "is not allowed. We do not currently support project-level iterations"
+msgid "is not allowed for this project."
+msgstr ""
+
+msgid "is not allowed since the group is not top-level group."
msgstr ""
-msgid "is not from an allowed domain."
+msgid "is not allowed. We do not currently support project-level iterations"
msgstr ""
msgid "is not in the group enforcing Group Managed Account"
@@ -39831,6 +40396,9 @@ msgstr ""
msgid "log in"
msgstr ""
+msgid "managed"
+msgstr ""
+
msgid "manual"
msgstr ""
@@ -39878,6 +40446,9 @@ msgstr ""
msgid "mrWidget| Please restore it or use a different %{missingBranchName} branch"
msgstr ""
+msgid "mrWidget|%{linkStart}Set up now%{linkEnd} to analyze your source code for known security vulnerabilities."
+msgstr ""
+
msgid "mrWidget|%{mergeError}."
msgstr ""
@@ -39958,6 +40529,9 @@ msgid_plural "mrWidget|Closes issues"
msgstr[0] ""
msgstr[1] ""
+msgid "mrWidget|Create issue to resolve all threads"
+msgstr ""
+
msgid "mrWidget|Delete source branch"
msgstr ""
@@ -39967,12 +40541,18 @@ msgstr ""
msgid "mrWidget|Did not close"
msgstr ""
+msgid "mrWidget|Dismiss"
+msgstr ""
+
msgid "mrWidget|Email patches"
msgstr ""
msgid "mrWidget|Failed to load deployment statistics"
msgstr ""
+msgid "mrWidget|Hide %{widget} details"
+msgstr ""
+
msgid "mrWidget|If the %{missingBranchName} branch exists in your local repository, you can merge this merge request manually using the command line"
msgstr ""
@@ -40068,9 +40648,6 @@ msgstr ""
msgid "mrWidget|Request to merge"
msgstr ""
-msgid "mrWidget|Resolve all threads in new issue"
-msgstr ""
-
msgid "mrWidget|Resolve conflicts"
msgstr ""
@@ -40086,6 +40663,9 @@ msgstr ""
msgid "mrWidget|Revoke approval"
msgstr ""
+msgid "mrWidget|SAST and Secret Detection is not enabled."
+msgstr ""
+
msgid "mrWidget|Set by %{merge_author} to be added to the merge train when the pipeline succeeds"
msgstr ""
@@ -40095,6 +40675,9 @@ msgstr ""
msgid "mrWidget|Set by %{merge_author} to start a merge train when the pipeline succeeds"
msgstr ""
+msgid "mrWidget|Show %{widget} details"
+msgstr ""
+
msgid "mrWidget|The changes were merged into"
msgstr ""
@@ -40107,6 +40690,9 @@ msgstr ""
msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure, or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
msgstr ""
+msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure."
+msgstr ""
+
msgid "mrWidget|The source branch has been deleted"
msgstr ""
@@ -40149,6 +40735,9 @@ msgstr ""
msgid "mrWidget|You can merge after removing denied licenses"
msgstr ""
+msgid "mrWidget|You can only merge once this merge request is approved."
+msgstr ""
+
msgid "mrWidget|Your password"
msgstr ""
@@ -40185,6 +40774,9 @@ msgstr ""
msgid "must be less than the limit of %{tag_limit} tags"
msgstr ""
+msgid "must be set for a project namespace"
+msgstr ""
+
msgid "must be unique by status and elapsed time within a policy"
msgstr ""
@@ -40294,6 +40886,9 @@ msgstr ""
msgid "pipeline"
msgstr ""
+msgid "pipeline schedules documentation"
+msgstr ""
+
msgid "pod_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
msgstr ""
@@ -40343,16 +40938,25 @@ msgstr ""
msgid "project name"
msgstr ""
+msgid "project namespace cannot be the parent of another namespace"
+msgstr ""
+
msgid "projects"
msgstr ""
msgid "quick actions"
msgstr ""
-msgid "reCAPTCHA Private Key"
+msgid "reCAPTCHA"
+msgstr ""
+
+msgid "reCAPTCHA helps prevent credential stuffing."
msgstr ""
-msgid "reCAPTCHA Site Key"
+msgid "reCAPTCHA private key"
+msgstr ""
+
+msgid "reCAPTCHA site key"
msgstr ""
msgid "recent activity"
@@ -40579,6 +41183,9 @@ msgstr ""
msgid "user avatar"
msgstr ""
+msgid "user namespace cannot be the parent of another namespace"
+msgstr ""
+
msgid "user preferences"
msgstr ""
@@ -40671,3 +41278,9 @@ msgstr ""
msgid "your settings"
msgstr ""
+msgid "{group}"
+msgstr ""
+
+msgid "{project}"
+msgstr ""
+
diff --git a/locale/ko/gitlab.po b/locale/ko/gitlab.po
index b53f665fac0..b190b36fa05 100644
--- a/locale/ko/gitlab.po
+++ b/locale/ko/gitlab.po
@@ -14,10 +14,7 @@ msgstr ""
"X-Crowdin-Language: ko\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-09-01 22:33\n"
-
-msgid " %{name}, confirm your email address now! "
-msgstr ""
+"PO-Revision-Date: 2021-10-04 20:21\n"
msgid " %{start} to %{end}"
msgstr " %{start}부터 %{end}까지"
@@ -90,6 +87,14 @@ msgstr ""
msgid "#general, #development"
msgstr ""
+msgid "%d Alert"
+msgid_plural "%d Alerts"
+msgstr[0] ""
+
+msgid "%d Alert:"
+msgid_plural "%d Alerts:"
+msgstr[0] ""
+
msgid "%d Approval"
msgid_plural "%d Approvals"
msgstr[0] ""
@@ -387,8 +392,11 @@ msgstr ""
msgid "%{code_open}Protected:%{code_close} Only exposed to protected branches or tags."
msgstr ""
-msgid "%{commit_author_link} authored %{commit_timeago}"
-msgstr "%{commit_timeago} ì— %{commit_author_link} ë‹˜ì´ ì»¤ë°‹í•˜ì˜€ìŠµë‹ˆë‹¤."
+msgid "%{commit_author_link} authored %{commit_authored_timeago}"
+msgstr ""
+
+msgid "%{commit_author_link} authored %{commit_authored_timeago} and %{commit_committer_avatar} %{commit_committer_link} committed %{commit_committer_timeago}"
+msgstr ""
msgid "%{completedCount} completed weight"
msgstr ""
@@ -476,6 +484,15 @@ msgstr ""
msgid "%{doc_link_start}Advanced search%{doc_link_end} is enabled."
msgstr ""
+msgid "%{docs_link_start}Learn about visibility levels.%{docs_link_end}"
+msgstr ""
+
+msgid "%{docs_link_start}What is Large File Storage?%{docs_link_end}"
+msgstr ""
+
+msgid "%{docs_link_start}What is two-factor authentication?%{docs_link_end}"
+msgstr ""
+
msgid "%{due_date} (Past due)"
msgstr ""
@@ -548,9 +565,6 @@ msgstr "%{issuableType}ì´ ì‚­ì œë©ë‹ˆë‹¤! 확실합니까?"
msgid "%{issueType} actions"
msgstr ""
-msgid "%{issuesCount} issues with a limit of %{maxIssueCount}"
-msgstr ""
-
msgid "%{issuesSize} with a limit of %{maxIssueCount}"
msgstr ""
@@ -608,6 +622,12 @@ msgstr ""
msgid "%{label_for_message} unavailable"
msgstr "%{label_for_message} 사용할 수 ì—†ìŒ"
+msgid "%{learn_more_link}."
+msgstr ""
+
+msgid "%{lessThan} 1 hour"
+msgstr ""
+
msgid "%{lets_encrypt_link_start}Let's Encrypt%{lets_encrypt_link_end} is a free, automated, and open certificate authority (CA) that issues digital certificates to enable HTTPS (SSL/TLS) for sites."
msgstr ""
@@ -620,15 +640,15 @@ msgstr "Forkí•œ ì›ë³¸ 프로ì íŠ¸ê°€ ë” ë‚®ì€ ê³µê°œ 수준으로 설정ë˜ì
msgid "%{link_start}Learn more%{link_end} about roles."
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
-msgstr ""
-
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
msgstr ""
msgid "%{link_start}Start the title with %{draft_snippet}%{link_end} to prevent a merge request that is a work in progress from being merged before it's ready."
msgstr ""
+msgid "%{link_start}What information does GitLab Inc. collect?%{link_end}"
+msgstr ""
+
msgid "%{listToShow}, and %{awardsListLength} more"
msgstr ""
@@ -777,7 +797,7 @@ msgid "%{securityScanner} result is not available because a pipeline has not bee
msgid_plural "%{securityScanner} results are not available because a pipeline has not been run since it was enabled. %{linkStart}Run a pipeline%{linkEnd}"
msgstr[0] ""
-msgid "%{service_ping_link_start}Learn more%{service_ping_link_end} about what information is shared with GitLab Inc."
+msgid "%{service_ping_link_start}What information is shared with GitLab Inc.?%{service_ping_link_end}"
msgstr ""
msgid "%{size} %{unit}"
@@ -813,6 +833,9 @@ msgstr "%{start}부터 %{end}까지"
msgid "%{state} epics"
msgstr "%{state} ì—픽"
+msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
+msgstr ""
+
msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
msgstr ""
@@ -865,10 +888,6 @@ msgstr ""
msgid "%{template_project_id} is unknown or invalid"
msgstr "%{template_project_id}(ì€)는 ì•Œ 수 없거나 잘못ë˜ì—ˆìŠµë‹ˆë‹¤."
-msgid "%{text} %{files}"
-msgid_plural "%{text} %{files} files"
-msgstr[0] "%{text} %{files} 파ì¼"
-
msgid "%{text} is available"
msgstr "%{text} 사용 가능"
@@ -953,9 +972,6 @@ msgstr "%{webhooks_link_start}%{webhook_type}%{link_end}ì„ ì‚¬ìš©í•˜ë©´ 그룹
msgid "%{wildcards_link_start}Wildcards%{wildcards_link_end} such as %{code_tag_start}v*%{code_tag_end} or %{code_tag_start}*-release%{code_tag_end} are supported."
msgstr ""
-msgid "&lt; 1 hour"
-msgstr ""
-
msgid "'%{data}' at %{location} does not match format: %{format}"
msgstr ""
@@ -1038,9 +1054,6 @@ msgstr ""
msgid "(we need your current password to confirm your changes)"
msgstr ""
-msgid "* * * * *"
-msgstr ""
-
msgid "+ %{amount} more"
msgstr "+ %{amount}ê°œ ë” ìžˆìŒ"
@@ -1104,10 +1117,10 @@ msgstr "-ëœ ë³´ê¸°"
msgid "."
msgstr ""
-msgid "0 bytes"
+msgid "/"
msgstr ""
-msgid "0 for unlimited, only effective with remote storage enabled."
+msgid "0 bytes"
msgstr ""
msgid "0t1DgySidms"
@@ -1214,6 +1227,9 @@ msgstr "10 ê°œ ì´ìƒ 참여"
msgid "1000+"
msgstr ""
+msgid "192.168.0.0/24"
+msgstr ""
+
msgid "1st contribution!"
msgstr "첫번째 기여!"
@@ -1367,9 +1383,6 @@ msgstr ""
msgid "A plain HTML site that uses Netlify for CI/CD instead of GitLab, but still with all the other great GitLab features"
msgstr ""
-msgid "A plain-text response to show to clients that hit the rate limit."
-msgstr ""
-
msgid "A platform value can be web, mob or app."
msgstr ""
@@ -1451,7 +1464,7 @@ msgstr ""
msgid "APIFuzzing|Configure HTTP basic authentication values. Other authentication methods are supported. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
+msgid "APIFuzzing|Customize your project's API fuzzing configuration options and copy the code snippet to your .gitlab-ci.yml file to apply any changes. Note that this tool does not reflect or update your .gitlab-ci.yml file automatically. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
msgstr ""
msgid "APIFuzzing|Enable authentication"
@@ -1514,9 +1527,6 @@ msgstr ""
msgid "APIFuzzing|To prevent a security leak, authentication info must be added as a %{ciVariablesLinkStart}CI variable%{ciVariablesLinkEnd}. As a user with maintainer access rights, you can manage CI variables in the %{ciSettingsLinkStart}Settings%{ciSettingsLinkEnd} area."
msgstr ""
-msgid "APIFuzzing|Use this tool to generate API fuzzing configuration YAML to copy into your .gitlab-ci.yml file. This tool does not reflect or update your .gitlab-ci.yml file automatically."
-msgstr ""
-
msgid "APIFuzzing|Username for basic authentication"
msgstr ""
@@ -1568,9 +1578,6 @@ msgstr "악용 사례 보고서"
msgid "Abuse reports notification email"
msgstr ""
-msgid "Abuse reports will be sent to this address if it is set. Abuse reports are always available in the admin area."
-msgstr ""
-
msgid "Accept invitation"
msgstr "초대 수ë½"
@@ -1607,12 +1614,18 @@ msgstr "액세스 금지. ì ‘ê·¼ ê¶Œí•œì„ í™•ì¸í•˜ì„¸ìš”."
msgid "Access granted"
msgstr ""
+msgid "Access key ID"
+msgstr ""
+
msgid "Access requests"
msgstr ""
msgid "Access to '%{classification_label}' not allowed"
msgstr "%{classification_label} ì— ëŒ€í•œ 액세스가 허용ë˜ì§€ 않습니다."
+msgid "Access tokens expire after 2 hours. A refresh token may be used at any time to generate a new access token. Non-expiring access tokens are deprecated. Clear this setting to enable backward compatibility."
+msgstr ""
+
msgid "AccessDropdown|Deploy Keys"
msgstr ""
@@ -1925,6 +1938,9 @@ msgstr "새 애플리케ì´ì…˜ 추가"
msgid "Add new directory"
msgstr "새 디렉토리 추가"
+msgid "Add new service account"
+msgstr ""
+
msgid "Add or remove previously merged commits"
msgstr ""
@@ -2162,6 +2178,9 @@ msgstr ""
msgid "AdminArea|Features"
msgstr ""
+msgid "AdminArea|Get security updates from GitLab and stay up to date"
+msgstr ""
+
msgid "AdminArea|Groups"
msgstr ""
@@ -2201,6 +2220,12 @@ msgstr ""
msgid "AdminArea|Reporter"
msgstr ""
+msgid "AdminArea|Sign up for the GitLab Security Newsletter to get notified for security updates."
+msgstr ""
+
+msgid "AdminArea|Sign up for the GitLab newsletter"
+msgstr ""
+
msgid "AdminArea|Stop all jobs"
msgstr "모든 작업 중지"
@@ -2270,9 +2295,15 @@ msgstr ""
msgid "AdminSettings|Disable public access to Pages sites"
msgstr ""
+msgid "AdminSettings|Display a banner on merge requests in projects with no pipelines to initiate steps to add a .gitlab-ci.yml file."
+msgstr ""
+
msgid "AdminSettings|Domain verification is an essential security measure for public GitLab sites. Users are required to demonstrate they control a domain before it is enabled. %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "AdminSettings|Enable pipeline suggestion banner"
+msgstr ""
+
msgid "AdminSettings|Enable shared runners for new projects"
msgstr "새 프로ì íŠ¸ì— 공유 러너 활성화"
@@ -2744,10 +2775,10 @@ msgstr ""
msgid "Admin|Quarterly reconciliation will occur on %{qrtlyDate}"
msgstr ""
-msgid "Admin|The number of max seats used for your namespace is currently exceeding the number of seats in your subscription. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgid "Admin|The number of max seats in your namespace exceeds the number of seats in your subscription. On %{qrtlyDate}, quarterly reconciliation occurs and you are automatically billed a prorated amount for the overage. No action is needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice. For more information about the timing of the invoicing process, view the documentation."
msgstr ""
-msgid "Admin|The number of maximum users for your instance is currently exceeding the number of users in license. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgid "Admin|The number of max users in your instance exceeds the number of users in your license. On %{qrtlyDate}, quarterly reconciliation occurs and you are automatically billed a prorated amount for the overage. No action is needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice. For more information about the timing of the invoicing process, view the documentation."
msgstr ""
msgid "Admin|View pending user approvals"
@@ -2768,9 +2799,6 @@ msgstr "고급 설정"
msgid "Advanced export options"
msgstr ""
-msgid "Advanced permissions, Large File Storage and Two-Factor authentication settings."
-msgstr "고급 사용 권한, 대용량 íŒŒì¼ ì €ìž¥ì†Œì™€ ì´ì¤‘-ì¸ì¦ 설정"
-
msgid "After a successful password update you will be redirected to login screen."
msgstr "비밀번호가 성공ì ìœ¼ë¡œ ë³€ê²½ëœ ë’¤ì— ë¡œê·¸ì¸ í™”ë©´ìœ¼ë¡œ ì´ë™ 합니다."
@@ -2789,12 +2817,14 @@ msgstr ""
msgid "After you've reviewed these contribution guidelines, you'll be all set to"
msgstr ""
+msgid "Akismet"
+msgstr ""
+
msgid "Akismet API Key"
msgstr ""
-msgid "Alert"
-msgid_plural "Alerts"
-msgstr[0] "알림"
+msgid "Akismet helps prevent the creation of spam issues in public projects."
+msgstr ""
msgid "AlertManagement|Acknowledged"
msgstr ""
@@ -3150,6 +3180,9 @@ msgstr ""
msgid "All (default)"
msgstr ""
+msgid "All GitLab"
+msgstr ""
+
msgid "All Members"
msgstr "모든 맵버"
@@ -3264,6 +3297,9 @@ msgstr ""
msgid "Allow this secondary node to replicate content on Object Storage"
msgstr ""
+msgid "Allow use of licensed EE features"
+msgstr ""
+
msgid "Allow users to dismiss the broadcast message"
msgstr ""
@@ -3339,9 +3375,6 @@ msgstr ""
msgid "Amazon authentication is not %{link_start}correctly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
-msgid "Amount of time (in hours) that users are allowed to skip forced configuration of two-factor authentication"
-msgstr "사용ìžê°€ 다중 ì¸ì¦ì„ 강제로 구성해야 í•  ì‹œê°„ì„ ê±´ë„ˆ 뛸 수있는 기간 (시간)"
-
msgid "An %{link_start}alert%{link_end} with the same fingerprint is already open. To change the status of this alert, resolve the linked alert."
msgstr ""
@@ -3402,12 +3435,6 @@ msgstr "BLOB 미리보기 ì¤‘ì— ì˜¤ë¥˜ê°€ ë°œìƒí–ˆìŠµë‹ˆë‹¤."
msgid "An error occurred when removing the label."
msgstr ""
-msgid "An error occurred when toggling the notification subscription"
-msgstr "알림 êµ¬ë… ì—¬ë¶€ 변경 ì¤‘ì— ì˜¤ë¥˜ê°€ ë°œìƒí–ˆìŠµë‹ˆë‹¤."
-
-msgid "An error occurred when updating the issue weight"
-msgstr "ì´ìŠˆ ì¤‘ìš”ë„ ì—…ë°ì´íŠ¸ 중 문제가 ë°œìƒí–ˆìŠµë‹ˆë‹¤."
-
msgid "An error occurred when updating the title"
msgstr ""
@@ -3456,6 +3483,9 @@ msgstr ""
msgid "An error occurred while enabling Service Desk."
msgstr "서비스 ë°ìŠ¤í¬ë¥¼ 활성화하는 ë„중 오류가 ë°œìƒí–ˆìŠµë‹ˆë‹¤"
+msgid "An error occurred while fetching Markdown preview"
+msgstr ""
+
msgid "An error occurred while fetching ancestors"
msgstr ""
@@ -3486,9 +3516,6 @@ msgstr "ì´ìŠˆë¥¼ 가져오는 ë„중 오류가 ë°œìƒí–ˆìŠµë‹ˆë‹¤"
msgid "An error occurred while fetching label colors."
msgstr ""
-msgid "An error occurred while fetching markdown preview"
-msgstr "마í¬ë‹¤ìš´ 미리보기를 가져 오는 ì¤‘ì— ì˜¤ë¥˜ê°€ ë°œìƒí–ˆìŠµë‹ˆë‹¤."
-
msgid "An error occurred while fetching participants"
msgstr ""
@@ -3504,9 +3531,6 @@ msgstr ""
msgid "An error occurred while fetching reference"
msgstr ""
-msgid "An error occurred while fetching sidebar data"
-msgstr "사ì´ë“œë°” ë°ì´í„°ë¥¼ 가져오는 중 문제가 ë°œìƒí–ˆìŠµë‹ˆë‹¤."
-
msgid "An error occurred while fetching tags. Retry the search."
msgstr ""
@@ -3582,6 +3606,9 @@ msgstr ""
msgid "An error occurred while loading merge requests."
msgstr ""
+msgid "An error occurred while loading projects."
+msgstr ""
+
msgid "An error occurred while loading the Needs tab."
msgstr ""
@@ -3816,12 +3843,6 @@ msgstr ""
msgid "Any Milestone"
msgstr ""
-msgid "Any branch"
-msgstr ""
-
-msgid "Any eligible user"
-msgstr ""
-
msgid "Any encrypted tokens"
msgstr ""
@@ -3840,6 +3861,9 @@ msgstr ""
msgid "Any namespace"
msgstr "ìž„ì˜ì˜ 네임스페ì´ìŠ¤"
+msgid "App Engine description and apps that are suitable for this deployment target"
+msgstr ""
+
msgid "App ID"
msgstr "앱 ID"
@@ -3986,6 +4010,10 @@ msgstr "ì ìš©ëœ"
msgid "Apply"
msgstr "ì ìš©"
+msgid "Apply %d suggestion"
+msgid_plural "Apply %d suggestions"
+msgstr[0] ""
+
msgid "Apply a label"
msgstr "ë¼ë²¨ ì ìš©"
@@ -3995,13 +4023,10 @@ msgstr "템플릿 ì ìš©"
msgid "Apply suggestion"
msgstr "제안 ì ìš©"
-msgid "Apply suggestions"
-msgstr ""
-
msgid "Apply template"
msgstr "템플릿 ì ìš©"
-msgid "Apply this approval rule to any branch or a specific protected branch."
+msgid "Apply this approval rule to all branches or a specific protected branch."
msgstr ""
msgid "Applying"
@@ -4140,9 +4165,6 @@ msgstr ""
msgid "ApprovalSettings|Prevent editing approval rules in projects and merge requests."
msgstr ""
-msgid "ApprovalSettings|Prevent editing approval rules in projects and merge requests. "
-msgstr ""
-
msgid "ApprovalSettings|Remove all approvals when commits are added to the source branch."
msgstr ""
@@ -4158,6 +4180,9 @@ msgstr ""
msgid "ApprovalSettings|This setting is configured at the instance level and can only be changed by an administrator."
msgstr ""
+msgid "ApprovalSettings|This setting is configured in %{groupName} and can only be changed by an administrator or group owner."
+msgstr ""
+
msgid "ApprovalStatusTooltip|Adheres to separation of duties"
msgstr ""
@@ -4641,9 +4666,6 @@ msgstr "GitHubë¡œ ì¸ì¦"
msgid "Authenticated API rate limit period in seconds"
msgstr ""
-msgid "Authenticated API request rate limit"
-msgstr ""
-
msgid "Authenticated API requests"
msgstr ""
@@ -4653,10 +4675,10 @@ msgstr ""
msgid "Authenticated Git LFS request rate limit"
msgstr ""
-msgid "Authenticated web rate limit period in seconds"
+msgid "Authenticated Git LFS requests"
msgstr ""
-msgid "Authenticated web request rate limit"
+msgid "Authenticated web rate limit period in seconds"
msgstr ""
msgid "Authenticated web requests"
@@ -5034,9 +5056,6 @@ msgstr ""
msgid "Below you will find all the groups that are public."
msgstr "공개 ëœ ëª¨ë“  ê·¸ë£¹ì„ ì•„ëž˜ì—ì„œ ì°¾ì„ ìˆ˜ 있습니다."
-msgid "Beta"
-msgstr ""
-
msgid "Bi-weekly code coverage"
msgstr ""
@@ -5275,6 +5294,21 @@ msgstr "블로그"
msgid "Board scope affects which issues are displayed for anyone who visits this board"
msgstr ""
+msgid "BoardNewEpic|Groups"
+msgstr ""
+
+msgid "BoardNewEpic|Loading groups"
+msgstr ""
+
+msgid "BoardNewEpic|No matching results"
+msgstr ""
+
+msgid "BoardNewEpic|Search groups"
+msgstr ""
+
+msgid "BoardNewEpic|Select a group"
+msgstr ""
+
msgid "BoardNewIssue|No matching results"
msgstr ""
@@ -5351,6 +5385,9 @@ msgstr ""
msgid "Boards|An error occurred while creating the list. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching child groups. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching group projects. Please try again."
msgstr ""
@@ -5575,13 +5612,13 @@ msgid "Branches|Show overview of the branches"
msgstr "브랜치 개요 보기"
msgid "Branches|Show stale branches"
-msgstr "ì•ˆì •í™”ëœ ë¸Œëžœì¹˜ 보기"
+msgstr ""
msgid "Branches|Stale"
msgstr "오래ë¨"
msgid "Branches|Stale branches"
-msgstr "ì•ˆì •í™”ëœ ë¸Œëžœì¹˜"
+msgstr ""
msgid "Branches|The branch could not be updated automatically because it has diverged from its upstream counterpart."
msgstr "ì´ ë¸Œëžœì¹˜ëŠ” 업스트림ì—ì„œ 분기 중ì´ë¯€ë¡œ ìžë™ìœ¼ë¡œ ì—…ë°ì´íŠ¸í•  수 없습니다."
@@ -5682,6 +5719,9 @@ msgstr ""
msgid "Bulk update"
msgstr ""
+msgid "BulkImports|Re-import creates a new group. It does not sync with the existing group."
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -5691,6 +5731,9 @@ msgstr ""
msgid "BulkImport|From source group"
msgstr ""
+msgid "BulkImport|Group import history"
+msgstr ""
+
msgid "BulkImport|Import failed: Destination cannot be a subgroup of the source group. Change the destination and try again."
msgstr ""
@@ -5703,9 +5746,18 @@ msgstr ""
msgid "BulkImport|Importing the group failed"
msgstr ""
+msgid "BulkImport|Last imported to %{link}"
+msgstr ""
+
msgid "BulkImport|Name already exists."
msgstr ""
+msgid "BulkImport|New group"
+msgstr ""
+
+msgid "BulkImport|No history is available"
+msgstr ""
+
msgid "BulkImport|No parent"
msgstr ""
@@ -5718,6 +5770,9 @@ msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} matching filter \"%{filter}\" from %{link}"
msgstr ""
+msgid "BulkImport|Source group"
+msgstr ""
+
msgid "BulkImport|To new group"
msgstr ""
@@ -5727,6 +5782,9 @@ msgstr ""
msgid "BulkImport|You have no groups to import"
msgstr ""
+msgid "BulkImport|Your imported groups will appear here."
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -5968,6 +6026,9 @@ msgstr ""
msgid "Can be manually deployed to"
msgstr ""
+msgid "Can be overridden in each project."
+msgstr ""
+
msgid "Can create groups:"
msgstr ""
@@ -6070,6 +6131,9 @@ msgstr ""
msgid "Cancelling Preview"
msgstr ""
+msgid "Cannot assign a confidential epic to a non-confidential issue. Make the issue confidential and try again"
+msgstr ""
+
msgid "Cannot be assigned to other projects."
msgstr ""
@@ -6121,9 +6185,6 @@ msgstr ""
msgid "Cannot refer to a group %{timebox_type} by an internal id!"
msgstr ""
-msgid "Cannot set confidential epic for a non-confidential issue"
-msgstr ""
-
msgid "Cannot show preview. For previews on sketch files, they must have the file format introduced by Sketch version 43 and above."
msgstr ""
@@ -6361,15 +6422,15 @@ msgstr ""
msgid "Check out, review, and merge locally"
msgstr ""
-msgid "Check the %{docs_link_start}documentation%{docs_link_end}."
-msgstr "%{docs_link_start} 여기부터 %{docs_link_end} 여기까지 확ì¸."
-
msgid "Check the current instance configuration "
msgstr ""
msgid "Check the elasticsearch.log file to debug why the migration was halted and make any changes before retrying the migration. When you fix the cause of the failure, click \"Retry migration\", and the migration will be scheduled to be retried in the background."
msgstr ""
+msgid "Check with your administrator."
+msgstr ""
+
msgid "Check your Docker images for known vulnerabilities."
msgstr ""
@@ -6400,6 +6461,9 @@ msgstr ""
msgid "Checkout"
msgstr ""
+msgid "Checkout|$%{selectedPlanPrice} per 10 GB storage per pack"
+msgstr ""
+
msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 minutes"
msgstr ""
@@ -6419,16 +6483,22 @@ msgstr ""
msgid "Checkout|%{name}'s GitLab subscription"
msgstr ""
-msgid "Checkout|%{selectedPlanText} plan"
+msgid "Checkout|%{name}'s storage subscription"
msgstr ""
-msgid "Checkout|%{startDate} - %{endDate}"
+msgid "Checkout|%{quantity} GB of storage"
msgstr ""
-msgid "Checkout|%{totalCiMinutes} CI minute"
-msgid_plural "Checkout|%{totalCiMinutes} CI minutes"
+msgid "Checkout|%{quantity} storage pack"
+msgid_plural "Checkout|%{quantity} storage packs"
msgstr[0] ""
+msgid "Checkout|%{selectedPlanText} plan"
+msgstr ""
+
+msgid "Checkout|%{startDate} - %{endDate}"
+msgstr ""
+
msgid "Checkout|%{totalCiMinutes} CI minutes"
msgstr ""
@@ -6504,6 +6574,9 @@ msgstr ""
msgid "Checkout|Failed to register credit card. Please try again."
msgstr ""
+msgid "Checkout|GB"
+msgstr ""
+
msgid "Checkout|GitLab group"
msgstr ""
@@ -6540,6 +6613,9 @@ msgstr ""
msgid "Checkout|State"
msgstr ""
+msgid "Checkout|Storage packs"
+msgstr ""
+
msgid "Checkout|Street address"
msgstr ""
@@ -6561,6 +6637,9 @@ msgstr ""
msgid "Checkout|Total minutes: %{quantity}"
msgstr ""
+msgid "Checkout|Total storage: %{quantity} GB"
+msgstr ""
+
msgid "Checkout|Users"
msgstr ""
@@ -6570,16 +6649,25 @@ msgstr ""
msgid "Checkout|Your organization"
msgstr ""
+msgid "Checkout|Your storage subscription has the same term as your main subscription, and the price is prorated accordingly."
+msgstr ""
+
msgid "Checkout|Your subscription will be applied to this group"
msgstr ""
msgid "Checkout|Zip code"
msgstr ""
+msgid "Checkout|a storage subscription"
+msgstr ""
+
msgid "Checkout|company or team"
msgstr ""
-msgid "Checkout|x 1,000 minutes per pack = %{strong}"
+msgid "Checkout|minutes"
+msgstr ""
+
+msgid "Checkout|x %{quantity} %{units} per pack ="
msgstr ""
msgid "Cherry-pick this commit"
@@ -6936,6 +7024,9 @@ msgstr ""
msgid "CloneIssue|Cannot clone issue to target project as it is pending deletion."
msgstr ""
+msgid "CloneIssue|Cannot clone issues of '%{issue_type}' type."
+msgstr ""
+
msgid "Cloned this issue to %{path_to_project}."
msgstr ""
@@ -6990,7 +7081,10 @@ msgstr ""
msgid "Closes this %{quick_action_target}."
msgstr ""
-msgid "Cloud licenses can not be removed."
+msgid "Cloud Functions description and apps that are suitable for this deployment target"
+msgstr ""
+
+msgid "Cloud Run description and apps that are suitable for this deployment target"
msgstr ""
msgid "Cluster"
@@ -7017,6 +7111,12 @@ msgstr ""
msgid "ClusterAgents|Access tokens"
msgstr ""
+msgid "ClusterAgents|Agent might not be connected to GitLab"
+msgstr ""
+
+msgid "ClusterAgents|Agent never connected to GitLab"
+msgstr ""
+
msgid "ClusterAgents|Alternative installation methods"
msgstr ""
@@ -7032,6 +7132,12 @@ msgstr ""
msgid "ClusterAgents|Configuration"
msgstr ""
+msgid "ClusterAgents|Connected"
+msgstr ""
+
+msgid "ClusterAgents|Connection status"
+msgstr ""
+
msgid "ClusterAgents|Copy token"
msgstr ""
@@ -7050,6 +7156,9 @@ msgstr ""
msgid "ClusterAgents|For alternative installation methods %{linkStart}go to the documentation%{linkEnd}."
msgstr ""
+msgid "ClusterAgents|For more troubleshooting information go to"
+msgstr ""
+
msgid "ClusterAgents|Go to the repository"
msgstr ""
@@ -7065,18 +7174,30 @@ msgstr ""
msgid "ClusterAgents|Integrate with the GitLab Agent"
msgstr ""
-msgid "ClusterAgents|Last used"
+msgid "ClusterAgents|Last connected %{timeAgo}."
+msgstr ""
+
+msgid "ClusterAgents|Last contact"
msgstr ""
msgid "ClusterAgents|Learn how to create an agent access token"
msgstr ""
+msgid "ClusterAgents|Make sure you are using a valid token."
+msgstr ""
+
msgid "ClusterAgents|Name"
msgstr ""
msgid "ClusterAgents|Never"
msgstr ""
+msgid "ClusterAgents|Never connected"
+msgstr ""
+
+msgid "ClusterAgents|Not connected"
+msgstr ""
+
msgid "ClusterAgents|Read more about getting started"
msgstr ""
@@ -7098,6 +7219,9 @@ msgstr ""
msgid "ClusterAgents|Select which Agent you want to install"
msgstr ""
+msgid "ClusterAgents|The Agent has not been connected in a long time. There might be a connectivity issue. Last contact was %{timeAgo}."
+msgstr ""
+
msgid "ClusterAgents|The GitLab Agent also requires %{linkStart}enabling the Agent Server%{linkEnd}"
msgstr ""
@@ -7125,9 +7249,6 @@ msgstr ""
msgid "ClusterAgents|You will need to create a token to connect to your agent"
msgstr ""
-msgid "ClusterAgent|This feature is only available for premium plans"
-msgstr ""
-
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -7317,9 +7438,6 @@ msgstr ""
msgid "ClusterIntegration|Create Kubernetes cluster"
msgstr "Kubernetes í´ëŸ¬ìŠ¤í„° ìƒì„±"
-msgid "ClusterIntegration|Create a provision role on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the account and external ID above. %{startMoreInfoLink}More information%{endLink}"
-msgstr ""
-
msgid "ClusterIntegration|Create cluster on"
msgstr ""
@@ -7752,7 +7870,7 @@ msgstr ""
msgid "ClusterIntegration|Subnets"
msgstr ""
-msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provisioned role, first create one on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the above account and external IDs. %{startMoreInfoLink}More information%{endLink}"
+msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provisioned role, first create one on %{awsLinkStart}Amazon Web Services %{awsLinkEnd} using the above account and external IDs. %{moreInfoStart}More information%{moreInfoEnd}"
msgstr ""
msgid "ClusterIntegration|The Kubernetes certificate used to authenticate to the cluster."
@@ -7986,6 +8104,9 @@ msgstr ""
msgid "Collapse replies"
msgstr ""
+msgid "Collapse settings section"
+msgstr ""
+
msgid "Collapse sidebar"
msgstr "사ì´ë“œ ë°” 축소"
@@ -8004,6 +8125,9 @@ msgstr ""
msgid "Comma-separated list of email addresses."
msgstr ""
+msgid "Comma-separated list of users allowed to exceed the rate limit."
+msgstr ""
+
msgid "Comma-separated, e.g. '1.1.1.1, 2.2.2.0/24'"
msgstr ""
@@ -8323,6 +8447,9 @@ msgstr ""
msgid "Configure %{repository_checks_link_start}repository checks%{link_end} and %{housekeeping_link_start}housekeeping%{link_end} on repositories."
msgstr ""
+msgid "Configure CAPTCHAs, IP address limits, and other anti-spam measures."
+msgstr ""
+
msgid "Configure Dependency Scanning in `.gitlab-ci.yml` using the GitLab managed template. You can [add variable overrides](https://docs.gitlab.com/ee/user/application_security/dependency_scanning/#customizing-the-dependency-scanning-settings) to customize Dependency Scanning settings."
msgstr ""
@@ -8359,18 +8486,15 @@ msgstr "ì¶”ì  êµ¬ì„±"
msgid "Configure a %{codeStart}.gitlab-webide.yml%{codeEnd} file in the %{codeStart}.gitlab%{codeEnd} directory to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
msgstr ""
-msgid "Configure existing installation"
+msgid "Configure advanced permissions, Large File Storage, and two-factor authentication settings."
msgstr ""
-msgid "Configure limit for notes created per minute by web and API requests."
+msgid "Configure approvals by authors and committers on all projects."
msgstr ""
-msgid "Configure limits for Project/Group Import/Export."
+msgid "Configure existing installation"
msgstr ""
-msgid "Configure limits for web and API requests."
-msgstr "웹 ë° API ìš”ì²­ì— ëŒ€í•œ ì œí•œì„ ì„¤ì •í•©ë‹ˆë‹¤."
-
msgid "Configure paths to be protected by Rack Attack."
msgstr ""
@@ -8383,10 +8507,13 @@ msgstr ""
msgid "Configure settings for Advanced Search with Elasticsearch."
msgstr ""
+msgid "Configure specific limits for Files API requests that supersede the general user and IP rate limits."
+msgstr ""
+
msgid "Configure specific limits for Git LFS requests that supersede the general user and IP rate limits."
msgstr ""
-msgid "Configure specific limits for Packages API requests that supersede the general user and IP rate limits."
+msgid "Configure specific limits for deprecated API requests that supersede the general user and IP rate limits."
msgstr ""
msgid "Configure the %{link} integration."
@@ -8398,6 +8525,9 @@ msgstr ""
msgid "Configure the way a user creates a new account."
msgstr "사용ìžê°€ 새로운 ê³„ì •ì„ ë§Œë“œëŠ” ë°©ë²•ì„ ì„¤ì •í•©ë‹ˆë‹¤."
+msgid "Configure via Merge Request"
+msgstr ""
+
msgid "Configure which lists are shown for anyone who visits this board"
msgstr ""
@@ -8863,6 +8993,9 @@ msgstr ""
msgid "Content parsed with %{link}."
msgstr ""
+msgid "ContentEditor|Table of Contents"
+msgstr ""
+
msgid "ContentEditor|You have to provide a renderMarkdown function or a custom serializer"
msgstr ""
@@ -9049,6 +9182,9 @@ msgstr "ë§í¬ 복사"
msgid "Copy link to chart"
msgstr ""
+msgid "Copy prefix"
+msgstr ""
+
msgid "Copy reference"
msgstr ""
@@ -9079,6 +9215,9 @@ msgstr ""
msgid "Copy value"
msgstr ""
+msgid "Corpus Management"
+msgstr ""
+
msgid "Corpus Management|Are you sure you want to delete the corpus?"
msgstr ""
@@ -9307,6 +9446,9 @@ msgstr "브랜치 ìƒì„±"
msgid "Create commit"
msgstr "커밋 ìƒì„±"
+msgid "Create common files more quickly, and standardize their format."
+msgstr ""
+
msgid "Create confidential merge request"
msgstr ""
@@ -9340,6 +9482,9 @@ msgstr ""
msgid "Create issue"
msgstr "ì´ìŠˆ ìƒì„±"
+msgid "Create issue to resolve all threads"
+msgstr ""
+
msgid "Create iteration"
msgstr ""
@@ -9394,6 +9539,9 @@ msgstr ""
msgid "Create new..."
msgstr "새로 만들기 ..."
+msgid "Create or import your first project"
+msgstr ""
+
msgid "Create project"
msgstr "프로ì íŠ¸ ìƒì„±"
@@ -9751,7 +9899,7 @@ msgstr ""
msgid "Custom notification events"
msgstr "ì‚¬ìš©ìž ì •ì˜ ì•Œë¦¼ ì´ë²¤íŠ¸"
-msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notificationLinkStart} notification emails%{notificationLinkEnd}."
+msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notificationLinkStart}notification emails%{notificationLinkEnd}."
msgstr ""
msgid "Custom project templates"
@@ -9948,10 +10096,10 @@ msgid "CycleAnalytics|Showing %{subjectFilterText} and %{selectedLabelsCount} la
msgid_plural "CycleAnalytics|Showing %{subjectFilterText} and %{selectedLabelsCount} labels"
msgstr[0] ""
-msgid "CycleAnalytics|Showing data for group '%{groupName}' and %{selectedProjectCount} projects from %{startDate} to %{endDate}"
+msgid "CycleAnalytics|Showing data for group '%{groupName}' and %{selectedProjectCount} projects from %{createdAfter} to %{createdBefore}"
msgstr ""
-msgid "CycleAnalytics|Showing data for group '%{groupName}' from %{startDate} to %{endDate}"
+msgid "CycleAnalytics|Showing data for group '%{groupName}' from %{createdAfter} to %{createdBefore}"
msgstr ""
msgid "CycleAnalytics|Stages"
@@ -10185,6 +10333,9 @@ msgstr ""
msgid "DastProfiles|Manage profiles"
msgstr ""
+msgid "DastProfiles|Manage site profiles"
+msgstr ""
+
msgid "DastProfiles|Minimum = 0 (no timeout enabled), Maximum = 2880 minutes"
msgstr ""
@@ -10260,6 +10411,9 @@ msgstr ""
msgid "DastProfiles|Scanner name"
msgstr ""
+msgid "DastProfiles|Schedule"
+msgstr ""
+
msgid "DastProfiles|Select branch"
msgstr ""
@@ -10329,7 +10483,7 @@ msgstr ""
msgid "DastProfiles|Website"
msgstr ""
-msgid "DastProfiles|You can either choose a passive scan or validate the target site in your chosen site profile. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
+msgid "DastProfiles|You can either choose a passive scan or validate the target site from the site profile management page. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
msgstr ""
msgid "DastProfiles|You cannot run an active scan against an unvalidated site."
@@ -10501,7 +10655,7 @@ msgstr ""
msgid "Days to merge"
msgstr ""
-msgid "Deactivate dormant users after 90 days of inactivity. Users can return to active status by signing in to their account. While inactive, a user is not counted as an active user in the instance."
+msgid "Deactivate dormant users after 90 days of inactivity"
msgstr ""
msgid "Dear Administrator,"
@@ -10588,10 +10742,10 @@ msgstr ""
msgid "Define a custom pattern with cron syntax"
msgstr "cron êµ¬ë¬¸ì„ ì‚¬ìš©í•˜ì—¬ ì‚¬ìš©ìž ì •ì˜ íŒ¨í„´ ì •ì˜"
-msgid "Define approval settings."
+msgid "Define approval rules."
msgstr ""
-msgid "Define approval settings. %{linkStart}Learn more.%{linkEnd}"
+msgid "Define approval rules. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "Define custom rules for what constitutes spam, independent of Akismet"
@@ -10600,7 +10754,7 @@ msgstr ""
msgid "Define environments in the deploy stage(s) in %{code_open}.gitlab-ci.yml%{code_close} to track deployments here."
msgstr ""
-msgid "Define how approval rules are applied as a merge request moves toward completion."
+msgid "Define how approval rules are applied to merge requests."
msgstr ""
msgid "Definition"
@@ -10615,6 +10769,12 @@ msgstr ""
msgid "DelayedJobs|Are you sure you want to run %{job_name} immediately? This job will run automatically after it's timer finishes."
msgstr "%{job_name}ì„ ì¦‰ì‹œ 실행할까요? ì´ ìž‘ì—…ì€ íƒ€ì´ë¨¸ê°€ ì™„ë£Œëœ í›„ ìžë™ìœ¼ë¡œ 실행ë©ë‹ˆë‹¤."
+msgid "DelayedJobs|Are you sure you want to run %{job_name} immediately? This job will run automatically after its timer finishes."
+msgstr ""
+
+msgid "DelayedJobs|Run the delayed job now?"
+msgstr ""
+
msgid "DelayedJobs|Start now"
msgstr "지금 시작"
@@ -10888,6 +11048,12 @@ msgstr ""
msgid "Dependency proxy image prefix"
msgstr ""
+msgid "DependencyProxy|Create a local proxy for storing frequently used upstream images. %{docLinkStart}Learn more%{docLinkEnd} about dependency proxies."
+msgstr ""
+
+msgid "DependencyProxy|Dependency Proxy"
+msgstr ""
+
msgid "DependencyProxy|Toggle Dependency Proxy"
msgstr ""
@@ -11125,6 +11291,9 @@ msgstr ""
msgid "Deployments"
msgstr ""
+msgid "Deployments to Google Kubernetes Engine can be "
+msgstr ""
+
msgid "Deployments|%{deployments} environment impacted."
msgid_plural "Deployments|%{deployments} environments impacted."
msgstr[0] ""
@@ -11153,6 +11322,9 @@ msgstr ""
msgid "Deployment|success"
msgstr ""
+msgid "Deprecated API rate limits"
+msgstr ""
+
msgid "Deprioritize label"
msgstr "ë¼ë²¨ ìš°ì„  순위 낮추기"
@@ -11555,6 +11727,14 @@ msgstr ""
msgid "DiffsCompareBaseBranch|(base)"
msgstr ""
+msgid "Diffs|%d addition"
+msgid_plural "Diffs|%d additions"
+msgstr[0] ""
+
+msgid "Diffs|%d deletion"
+msgid_plural "Diffs|%d deletions"
+msgstr[0] ""
+
msgid "Diffs|No file name available"
msgstr "사용가능한 íŒŒì¼ ì´ë¦„ì´ ì—†ìŠµë‹ˆë‹¤."
@@ -11564,9 +11744,16 @@ msgstr ""
msgid "Diffs|Show all unchanged lines"
msgstr ""
+msgid "Diffs|Showing %{dropdownStart}%{count} changed file%{dropdownEnd}"
+msgid_plural "Diffs|Showing %{dropdownStart}%{count} changed files%{dropdownEnd}"
+msgstr[0] ""
+
msgid "Diffs|Something went wrong while fetching diff lines."
msgstr ""
+msgid "Diffs|with %{additions} and %{deletions}"
+msgstr ""
+
msgid "Direct member"
msgstr ""
@@ -11691,9 +11878,6 @@ msgid "Dismiss %d selected vulnerability as"
msgid_plural "Dismiss %d selected vulnerabilities as"
msgstr[0] ""
-msgid "Dismiss Value Stream Analytics introduction box"
-msgstr ""
-
msgid "Dismiss merge request promotion"
msgstr ""
@@ -12015,6 +12199,9 @@ msgstr ""
msgid "Edit issues"
msgstr "ì´ìŠˆ 편집"
+msgid "Edit merge requests"
+msgstr ""
+
msgid "Edit public deploy key"
msgstr "공개 ë°°í¬ í‚¤ 편집"
@@ -12090,6 +12277,9 @@ msgstr ""
msgid "Elastic|None. Select projects to index."
msgstr ""
+msgid "Eligible users"
+msgstr ""
+
msgid "Email"
msgstr "ì´ë©”ì¼"
@@ -12219,6 +12409,9 @@ msgstr "빈 파ì¼"
msgid "Enable"
msgstr "사용"
+msgid "Enable Amazon EKS integration"
+msgstr ""
+
msgid "Enable Auto DevOps"
msgstr "ìžë™ DevOps 활성화"
@@ -12252,6 +12445,9 @@ msgstr ""
msgid "Enable SSL verification"
msgstr ""
+msgid "Enable Service Ping"
+msgstr ""
+
msgid "Enable Snowplow tracking"
msgstr ""
@@ -12282,6 +12478,9 @@ msgstr ""
msgid "Enable authenticated Git LFS request rate limit"
msgstr ""
+msgid "Enable authenticated web request rate limit"
+msgstr ""
+
msgid "Enable authentication"
msgstr ""
@@ -12342,7 +12541,7 @@ msgstr ""
msgid "Enable or disable the Pseudonymizer data collection."
msgstr "Pseudonymizer ë°ì´í„° ìˆ˜ì§‘ì„ ì‚¬ìš©í•˜ê±°ë‚˜ 중지합니다."
-msgid "Enable or disable version check and service ping."
+msgid "Enable or disable version check and Service Ping."
msgstr ""
msgid "Enable protected paths rate limit"
@@ -12354,18 +12553,12 @@ msgstr ""
msgid "Enable reCAPTCHA"
msgstr ""
-msgid "Enable reCAPTCHA for login"
-msgstr ""
-
-msgid "Enable reCAPTCHA, Invisible Captcha, Akismet and set IP limits. For reCAPTCHA, we currently only support %{recaptcha_v2_link_start}v2%{recaptcha_v2_link_end}"
+msgid "Enable reCAPTCHA for login."
msgstr ""
msgid "Enable repository checks"
msgstr ""
-msgid "Enable service ping"
-msgstr ""
-
msgid "Enable shared runners for all projects and subgroups in this group."
msgstr ""
@@ -12387,7 +12580,10 @@ msgstr "2단계 ì¸ì¦ 활성화"
msgid "Enable unauthenticated API request rate limit"
msgstr ""
-msgid "Enable unauthenticated request rate limit"
+msgid "Enable unauthenticated web request rate limit"
+msgstr ""
+
+msgid "Enable user deactivation emails"
msgstr ""
msgid "Enable version check"
@@ -12423,9 +12619,6 @@ msgstr ""
msgid "Enabled sources for code import during project creation. OmniAuth must be configured for GitHub"
msgstr ""
-msgid "Enabling this will only make licensed EE features available to projects if the project namespace's plan includes the feature or if the project is public."
-msgstr ""
-
msgid "Encountered an error while rendering: %{err}"
msgstr ""
@@ -12474,9 +12667,6 @@ msgstr ""
msgid "Enter Admin Mode"
msgstr ""
-msgid "Enter IP address range"
-msgstr ""
-
msgid "Enter a number"
msgstr ""
@@ -12489,9 +12679,6 @@ msgstr ""
msgid "Enter at least three characters to search"
msgstr ""
-msgid "Enter domain"
-msgstr ""
-
msgid "Enter in your Bitbucket Server URL and personal access token below"
msgstr "아래 Bitbucket Server URL ë° ê°œì¸ ì•¡ì„¸ìŠ¤ 토í°ì„ 입력하십시오."
@@ -12678,9 +12865,6 @@ msgstr "ë°°í¬"
msgid "Environments|Deployment %{status}"
msgstr ""
-msgid "Environments|Dismiss"
-msgstr ""
-
msgid "Environments|Enable review app"
msgstr ""
@@ -12693,9 +12877,6 @@ msgstr "환경"
msgid "Environments|Environments are places where code gets deployed, such as staging or production."
msgstr "í™˜ê²½ì€ ì½”ë“œê°€ ë°°í¬ë˜ëŠ” 장소(예: 스테ì´ì§• ë˜ëŠ” ìš´ì˜) 입니다."
-msgid "Environments|Help us improve environments"
-msgstr ""
-
msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
msgstr ""
@@ -12732,6 +12913,9 @@ msgstr ""
msgid "Environments|Note that this action will stop the environment, but it will %{emphasisStart}not%{emphasisEnd} have an effect on any existing deployment due to no “stop environment action†being defined in the %{ciConfigLinkStart}.gitlab-ci.yml%{ciConfigLinkEnd} file."
msgstr ""
+msgid "Environments|Open"
+msgstr ""
+
msgid "Environments|Open live environment"
msgstr ""
@@ -12771,9 +12955,6 @@ msgstr "중지 환경"
msgid "Environments|Stopping %{environmentName}"
msgstr ""
-msgid "Environments|Take the survey"
-msgstr ""
-
msgid "Environments|There was an error fetching the logs. Please try again."
msgstr ""
@@ -12795,9 +12976,6 @@ msgstr "갱신ë¨"
msgid "Environments|You don't have any environments right now"
msgstr ""
-msgid "Environments|Your feedback helps GitLab make environments better for you and other users. Participate and enter a sweepstake to win a USD 30 gift card."
-msgstr ""
-
msgid "Environments|by %{avatar}"
msgstr ""
@@ -13080,7 +13258,7 @@ msgstr ""
msgid "Error parsing CSV file. Please make sure it has"
msgstr ""
-msgid "Error rendering markdown preview"
+msgid "Error rendering Markdown preview"
msgstr ""
msgid "Error saving label update."
@@ -13128,6 +13306,9 @@ msgstr ""
msgid "Error: %{error_message}"
msgstr ""
+msgid "Error: Couldn't load some or all of the changes."
+msgstr ""
+
msgid "Error: No AWS credentials were supplied"
msgstr ""
@@ -13161,6 +13342,9 @@ msgstr ""
msgid "ErrorTracking|Enable error tracking"
msgstr ""
+msgid "ErrorTracking|Error tracking backend"
+msgstr ""
+
msgid "ErrorTracking|If you self-host Sentry, enter your Sentry instance's full URL. If you use Sentry's hosted solution, enter https://sentry.io"
msgstr ""
@@ -13194,6 +13378,12 @@ msgstr ""
msgid "Escalation policies must have at least one rule"
msgstr ""
+msgid "EscalationPolicies|%{clockIcon} IF alert is not %{alertStatus} in %{minutes}"
+msgstr ""
+
+msgid "EscalationPolicies|%{notificationIcon} THEN %{doAction} %{forScheduleOrUser}"
+msgstr ""
+
msgid "EscalationPolicies|+ Add an additional rule"
msgstr ""
@@ -13236,13 +13426,13 @@ msgstr ""
msgid "EscalationPolicies|Escalation policies"
msgstr ""
-msgid "EscalationPolicies|Escalation rules"
+msgid "EscalationPolicies|Escalation policy %{obstacle} in Project %{project}"
msgstr ""
-msgid "EscalationPolicies|Failed to load oncall-schedules"
+msgid "EscalationPolicies|Escalation rules"
msgstr ""
-msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} %{then} THEN %{doAction} %{scheduleOrUser}"
+msgid "EscalationPolicies|Failed to load oncall-schedules"
msgstr ""
msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} minutes"
@@ -13320,18 +13510,36 @@ msgstr "ì´ë²¤íŠ¸"
msgid "Every %{action} attempt has failed: %{job_error_message}. Please try again."
msgstr "매번 %{action}ì´ ì‹¤íŒ¨í–ˆìŠµë‹ˆë‹¤: %{job_error_message}. 다시 ì‹œë„해주세요."
+msgid "Every 3 months"
+msgstr ""
+
+msgid "Every 3 months on the %{day} at %{time} %{timezone}"
+msgstr ""
+
+msgid "Every 6 months"
+msgstr ""
+
+msgid "Every 6 months on the %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Every day"
msgstr ""
msgid "Every day (at %{time})"
msgstr ""
+msgid "Every day at %{time} %{timezone}"
+msgstr ""
+
msgid "Every month"
msgstr ""
msgid "Every month (Day %{day} at %{time})"
msgstr ""
+msgid "Every month on the %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Every three months"
msgstr ""
@@ -13345,6 +13553,15 @@ msgstr[0] ""
msgid "Every week (%{weekday} at %{time})"
msgstr ""
+msgid "Every week on %{day} at %{time} %{timezone}"
+msgstr ""
+
+msgid "Every year"
+msgstr ""
+
+msgid "Every year on %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Everyone"
msgstr "모ë‘"
@@ -13381,9 +13598,6 @@ msgstr ""
msgid "Exactly one of %{attributes} is required"
msgstr ""
-msgid "Example: %{ip_address}. %{read_more_link}."
-msgstr ""
-
msgid "Example: @sub\\.company\\.com$"
msgstr ""
@@ -13450,15 +13664,15 @@ msgstr ""
msgid "Expand pipeline"
msgstr ""
+msgid "Expand settings section"
+msgstr ""
+
msgid "Expand sidebar"
msgstr "사ì´ë“œë°” 확장"
msgid "Expected documents: %{expected_documents}"
msgstr ""
-msgid "Experienced"
-msgstr ""
-
msgid "ExperimentSubject|Must have exactly one of User, Namespace, or Project."
msgstr ""
@@ -13741,9 +13955,6 @@ msgstr ""
msgid "Failed to load related branches"
msgstr ""
-msgid "Failed to load sidebar lock status"
-msgstr ""
-
msgid "Failed to load stacktrace."
msgstr ""
@@ -14166,6 +14377,9 @@ msgstr ""
msgid "Files"
msgstr "파ì¼"
+msgid "Files API Rate Limits"
+msgstr ""
+
msgid "Files breadcrumb"
msgstr ""
@@ -15165,6 +15379,9 @@ msgstr ""
msgid "GitLab group: %{source_link}"
msgstr ""
+msgid "GitLab informs you if a new version is available."
+msgstr ""
+
msgid "GitLab is a complete DevOps platform, delivered as a single application, fundamentally changing the way Development, Security, and Ops teams collaborate"
msgstr ""
@@ -15180,7 +15397,7 @@ msgstr ""
msgid "GitLab is open source software to collaborate on code."
msgstr ""
-msgid "GitLab is undergoing maintenance and is operating in a read-only mode."
+msgid "GitLab is undergoing maintenance and is operating in read-only mode."
msgstr ""
msgid "GitLab member or Email address"
@@ -15192,9 +15409,6 @@ msgstr ""
msgid "GitLab project export"
msgstr "GitLab 프로ì íŠ¸ 내보내기"
-msgid "GitLab restart is required to apply changes."
-msgstr ""
-
msgid "GitLab single sign-on URL"
msgstr ""
@@ -15210,9 +15424,6 @@ msgstr ""
msgid "GitLab version"
msgstr ""
-msgid "GitLab will inform you if a new version is available."
-msgstr ""
-
msgid "GitLab will run a background job that will produce pseudonymized CSVs of the GitLab database that will be uploaded to your configured object storage directory."
msgstr ""
@@ -15370,7 +15581,7 @@ msgid "Gitpod|https://gitpod.example.com"
msgstr ""
msgid "Given access %{time_ago}"
-msgstr "%{time_ago} ì „ 엑세스 권한 부여ë¨"
+msgstr ""
msgid "Given epic is already related to this epic."
msgstr ""
@@ -15477,9 +15688,21 @@ msgstr ""
msgid "Go to snippets"
msgstr ""
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check 'Allowed domains for sign-ups'."
+msgstr ""
+
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check 'Email restrictions for sign-ups'."
+msgstr ""
+
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check the 'Domain denylist'."
+msgstr ""
+
msgid "Go to the activity feed"
msgstr ""
+msgid "Go to the group’s 'Settings &gt; General' page, and check 'Restrict membership by email domain'."
+msgstr ""
+
msgid "Go to the milestone list"
msgstr ""
@@ -15516,6 +15739,12 @@ msgstr ""
msgid "Goal of the changes and what reviewers should be aware of"
msgstr ""
+msgid "Google Cloud"
+msgstr ""
+
+msgid "Google Cloud offers several deployment targets. Select the one most suitable for your project."
+msgstr ""
+
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
@@ -15600,9 +15829,6 @@ msgstr ""
msgid "Group ID"
msgstr "그룹 ID"
-msgid "Group ID: %{group_id}"
-msgstr ""
-
msgid "Group Owner must have signed in with SAML before enabling Group Managed Accounts"
msgstr ""
@@ -15777,6 +16003,12 @@ msgstr ""
msgid "GroupImport|Unable to process group import file"
msgstr ""
+msgid "GroupPage|Copy group ID"
+msgstr ""
+
+msgid "GroupPage|Group ID: %{group_id}"
+msgstr ""
+
msgid "GroupRoadmap|%{dateWord} – No end date"
msgstr ""
@@ -15831,6 +16063,9 @@ msgstr ""
msgid "GroupRoadmap|Within 3 years"
msgstr ""
+msgid "GroupSAML|\"persistent\" recommended"
+msgstr ""
+
msgid "GroupSAML|%{strongOpen}Warning%{strongClose} - Enabling %{linkStart}SSO enforcement%{linkEnd} can reduce security risks."
msgstr ""
@@ -15963,6 +16198,9 @@ msgstr ""
msgid "GroupSAML|To be able to prohibit outer forks, you first need to enforce dedicate group managed accounts."
msgstr ""
+msgid "GroupSAML|Use SAML group links to manage group membership using SAML."
+msgstr ""
+
msgid "GroupSAML|Valid SAML Response"
msgstr ""
@@ -15975,13 +16213,10 @@ msgstr ""
msgid "GroupSAML|as %{access_level}"
msgstr ""
-msgid "GroupSAML|must match stored NameID of \"%{extern_uid}\" as we use this to identify users. If the NameID changes users will be unable to sign in."
-msgstr ""
-
-msgid "GroupSAML|should be \"persistent\""
+msgid "GroupSAML|must match stored NameID of \"%{extern_uid}\" to identify user and allow sign in"
msgstr ""
-msgid "GroupSAML|should be a random persistent ID, emails are discouraged"
+msgid "GroupSAML|recommend persistent ID instead of email"
msgstr ""
msgid "GroupSelect|No matching results"
@@ -15996,9 +16231,15 @@ msgstr ""
msgid "GroupSettings|Allow project access token creation"
msgstr ""
+msgid "GroupSettings|Applied to all subgroups unless overridden by a group owner. Groups already added to the project lose access."
+msgstr ""
+
msgid "GroupSettings|Auto DevOps pipeline was updated for the group"
msgstr ""
+msgid "GroupSettings|Available only on the top-level group. Applies to all subgroups. Groups already shared with a group outside %{group} are still shared unless removed manually."
+msgstr ""
+
msgid "GroupSettings|Badges"
msgstr "배지"
@@ -16050,6 +16291,9 @@ msgstr ""
msgid "GroupSettings|New runners registration token has been generated!"
msgstr ""
+msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgstr ""
+
msgid "GroupSettings|Pipeline settings was updated for the group"
msgstr ""
@@ -16062,12 +16306,15 @@ msgstr ""
msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
-msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups."
+msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups"
msgstr ""
msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
msgstr "%{group} ë‚´ì˜ í”„ë¡œì íŠ¸ë¥¼ 다른 ê·¸ë£¹ì— ê³µìœ í•  수 없게 합니다."
+msgid "GroupSettings|Prevents group members from being notified if the group is mentioned."
+msgstr ""
+
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
msgstr ""
@@ -16104,21 +16351,6 @@ msgstr "ì´ ì„¤ì •ì€ %{ancestor_group} ì— ì ìš© ë©ë‹ˆë‹¤. ì´ ê·¸ë£¹ì˜ í”„ë
msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}."
msgstr "ì´ ì„¤ì •ì€ %{ancestor_group} ì— ì ìš©ë©ë‹ˆë‹¤. ì„¤ì •ì„ ìž¬ì •ì˜í•˜ê±°ë‚˜ %{remove_ancestor_share_with_group_lock} í•  수 있습니다."
-msgid "GroupSettings|This setting is only available on the top-level group and it applies to all subgroups. Groups that have already been shared with a group outside %{group} will still be shared, and this access will have to be revoked manually."
-msgstr ""
-
-msgid "GroupSettings|This setting will be applied to all subgroups unless overridden by a group owner. Groups that already have access to the project will continue to have access unless removed manually."
-msgstr "ì´ ì„¤ì •ì€ ê·¸ë£¹ 소유ìžì— ì˜í•´ 재정ì˜ë˜ì§€ ì•Šì€ ëª¨ë“  하위 ê·¸ë£¹ì— ì ìš©ë©ë‹ˆë‹¤. ì´ë¯¸ 프로ì íŠ¸ì— 대한 ì ‘ê·¼ ê¶Œí•œì„ ê°€ì§„ ê·¸ë£¹ë“¤ì€ ê¶Œí•œì´ ì§ì ‘ 제거ë˜ì§€ 않는 í•œ 접근할 수 있습니다."
-
-msgid "GroupSettings|This setting will override user notification preferences for all members of the group, subgroups, and projects."
-msgstr ""
-
-msgid "GroupSettings|This setting will prevent group members from being notified if the group is mentioned."
-msgstr ""
-
-msgid "GroupSettings|This setting will prevent group members from forking projects outside of the group."
-msgstr ""
-
msgid "GroupSettings|Transfer group"
msgstr ""
@@ -16147,7 +16379,7 @@ msgid "GroupSettings|remove the share with group lock from %{ancestor_group_name
msgstr "%{ancestor_group_name} ì—ì„œ 그룹 lock 공유 제거"
msgid "Groups"
-msgstr "그룹들"
+msgstr ""
msgid "Groups (%{count})"
msgstr ""
@@ -16236,7 +16468,7 @@ msgstr ""
msgid "GroupsNew|No import options available"
msgstr ""
-msgid "GroupsNew|Not all related objects are migrated, as %{docs_link_start}described here%{docs_link_end}. Please %{feedback_link_start}leave feedback%{feedback_link_end} on this feature."
+msgid "GroupsNew|Not all related objects are migrated. %{docs_link_start}More info%{docs_link_end}."
msgstr ""
msgid "GroupsNew|Personal access token"
@@ -16368,15 +16600,27 @@ msgstr "비정ìƒ"
msgid "Hello %{name},"
msgstr ""
-msgid "Hello there"
-msgstr "안녕하세요!"
-
msgid "Hello, %{name}!"
msgstr ""
msgid "Hello, %{username}!"
msgstr ""
+msgid "HelloMessage|%{handshake_emoji} Contribute to GitLab: %{contribute_link}"
+msgstr ""
+
+msgid "HelloMessage|%{magnifier_emoji} Create a new GitLab issue: %{new_issue_link}"
+msgstr ""
+
+msgid "HelloMessage|%{rocket_emoji} We like your curiosity! Help us improve GitLab by joining the team: %{jobs_page_link}"
+msgstr ""
+
+msgid "HelloMessage|Does this page need fixes or improvements? Open an issue or contribute a merge request to help make GitLab more lovable. At GitLab, everyone can contribute!"
+msgstr ""
+
+msgid "HelloMessage|Welcome to GitLab!"
+msgstr ""
+
msgid "Help"
msgstr "ë„움ë§"
@@ -16386,13 +16630,10 @@ msgstr ""
msgid "Helps prevent bots from creating accounts."
msgstr ""
-msgid "Helps prevent bots from creating issues"
-msgstr ""
-
-msgid "Helps prevent malicious users hide their activity"
+msgid "Helps prevent bots from creating issues."
msgstr ""
-msgid "Helps reduce request volume (e.g. from crawlers or abusive bots)"
+msgid "Helps prevent malicious users hide their activity."
msgstr ""
msgid "Helps reduce request volume (for example, from crawlers or abusive bots)"
@@ -16514,6 +16755,12 @@ msgstr "정리가 성공ì ìœ¼ë¡œ 시작ë˜ì—ˆìŠµë‹ˆë‹¤"
msgid "Housekeeping, export, path, transfer, remove, archive."
msgstr "정리, 내보내기, 경로, 전송, 삭제, 보관"
+msgid "How do I configure Akismet?"
+msgstr ""
+
+msgid "How do I configure it?"
+msgstr ""
+
msgid "How do I configure runners?"
msgstr ""
@@ -16535,21 +16782,27 @@ msgstr ""
msgid "How do I set up this service?"
msgstr ""
+msgid "How do I use a web terminal?"
+msgstr ""
+
+msgid "How do I use file templates?"
+msgstr ""
+
msgid "How it works"
msgstr ""
msgid "How many days need to pass between marking entity for deletion and actual removing it."
msgstr ""
-msgid "How many seconds an IP will be counted towards the limit"
+msgid "How many seconds an IP counts toward the IP address limit."
+msgstr ""
+
+msgid "How the job limiter handles jobs exceeding the thresholds specified below. The 'track' mode only logs the jobs. The 'compress' mode compresses the jobs and raises an exception if the compressed size exceeds the limit."
msgstr ""
msgid "I accept the %{terms_link}"
msgstr "%{terms_link}ì— ë™ì˜í•©ë‹ˆë‹¤."
-msgid "I accept the|Terms of Service and Privacy Policy"
-msgstr ""
-
msgid "I forgot my password"
msgstr "비밀번호를 잊었습니다."
@@ -16631,13 +16884,16 @@ msgstr ""
msgid "IP Address"
msgstr "IP 주소"
-msgid "IP expiration time"
+msgid "IP address expiration time"
msgstr ""
-msgid "IP subnet restriction only allowed for top-level groups"
+msgid "IP address restrictions"
+msgstr ""
+
+msgid "IP addresses per user"
msgstr ""
-msgid "IPs per user"
+msgid "IP subnet restriction only allowed for top-level groups"
msgstr ""
msgid "Identifier"
@@ -16652,6 +16908,9 @@ msgstr "ID"
msgid "If any indexed field exceeds this limit it will be truncated to this number of characters and the rest will not be indexed or searchable. This does not apply to repository and wiki indexing. Setting this to 0 means it is unlimited."
msgstr ""
+msgid "If blank, defaults to %{code_open}Retry later%{code_close}."
+msgstr ""
+
msgid "If blank, set allowable lifetime to %{instance_level_policy_in_words}, as defined by the instance admin. Once set, existing tokens for users in this group may be revoked."
msgstr ""
@@ -16703,6 +16962,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 did not initiate these sign-in attempts, please reach out to your administrator or enable two-factor authentication (2FA) on your account."
+msgstr ""
+
msgid "If you did not initiate this change, please contact your administrator immediately."
msgstr ""
@@ -16792,12 +17054,12 @@ msgstr "CSV 가져오기"
msgid "Import Projects from Gitea"
msgstr "Giteaì—ì„œ 프로ì íŠ¸ 가져오기"
-msgid "Import a project"
-msgstr ""
-
msgid "Import an exported GitLab project"
msgstr "내보낸 GitLab 프로ì íŠ¸ 가져오기"
+msgid "Import and export rate limits"
+msgstr ""
+
msgid "Import failed due to a GitHub error: %{original}"
msgstr ""
@@ -16807,12 +17069,18 @@ msgstr ""
msgid "Import from Jira"
msgstr ""
+msgid "Import group"
+msgstr ""
+
msgid "Import group from file"
msgstr ""
msgid "Import groups"
msgstr ""
+msgid "Import history"
+msgstr ""
+
msgid "Import in progress"
msgstr "가져오기 진행중"
@@ -16876,7 +17144,25 @@ msgstr ""
msgid "Import timed out. Import took longer than %{import_jobs_expiration} seconds"
msgstr "가져오기 시간 초과. 가져오기가 %{import_jobs_expiration}초보다 오래 걸렸습니다."
-msgid "Import/Export Rate Limits"
+msgid "ImportAProjectModal|Import from a project"
+msgstr ""
+
+msgid "ImportAProjectModal|Import members from another project"
+msgstr ""
+
+msgid "ImportAProjectModal|Import project members"
+msgstr ""
+
+msgid "ImportAProjectModal|Only project members (not group members) are imported, and they get the same permissions as the project you import from."
+msgstr ""
+
+msgid "ImportAProjectModal|Successfully imported"
+msgstr ""
+
+msgid "ImportAProjectModal|Unable to import project members"
+msgstr ""
+
+msgid "ImportAProjectModal|You're importing members to the %{strongStart}%{name}%{strongEnd} project."
msgstr ""
msgid "ImportButtons|Connect repositories from"
@@ -16928,7 +17214,7 @@ msgstr[0] ""
msgid "Importing..."
msgstr ""
-msgid "Import|A repository URL usually ends in a .git suffix, although this is not required. Double check to make sure your repository URL is correct."
+msgid "Import|There is not a valid Git repository at this URL. If your HTTP repository is not publicly accessible, verify your credentials."
msgstr ""
msgid "Improve customer support with Service Desk"
@@ -16937,9 +17223,6 @@ msgstr ""
msgid "Improves Git cloning performance."
msgstr ""
-msgid "In %{time_to_now}"
-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 ""
@@ -17225,7 +17508,7 @@ msgstr ""
msgid "InProductMarketing|Start a GitLab Ultimate trial today in less than one minute, no credit card required."
msgstr ""
-msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no CC required"
+msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no credit card required"
msgstr ""
msgid "InProductMarketing|Start a trial"
@@ -17264,7 +17547,7 @@ msgstr ""
msgid "InProductMarketing|Team up in GitLab for greater efficiency"
msgstr ""
-msgid "InProductMarketing|Team work makes the dream work"
+msgid "InProductMarketing|Team work makes the dream work"
msgstr ""
msgid "InProductMarketing|Test, create, deploy"
@@ -17844,6 +18127,9 @@ msgstr ""
msgid "Integrations|Create new issue in Jira"
msgstr ""
+msgid "Integrations|Create new issue in ZenTao"
+msgstr ""
+
msgid "Integrations|Default settings are inherited from the group level."
msgstr ""
@@ -17937,9 +18223,15 @@ msgstr ""
msgid "Integrations|Search Jira issues"
msgstr ""
+msgid "Integrations|Search ZenTao issues"
+msgstr ""
+
msgid "Integrations|Send notifications about project events to Unify Circuit."
msgstr ""
+msgid "Integrations|Send notifications about project events to a Unify Circuit conversation. %{docs_link}"
+msgstr ""
+
msgid "Integrations|Sign in to add namespaces"
msgstr ""
@@ -17979,6 +18271,9 @@ msgstr ""
msgid "Integrations|You've activated every integration 🎉"
msgstr ""
+msgid "Integrations|ZenTao issues display here when you create issues in your project in ZenTao."
+msgstr ""
+
msgid "Interactive mode"
msgstr ""
@@ -18006,9 +18301,6 @@ msgstr ""
msgid "Interval Pattern"
msgstr "주기 패턴"
-msgid "Introducing Value Stream Analytics"
-msgstr ""
-
msgid "Introducing Your DevOps Report"
msgstr ""
@@ -18105,6 +18397,12 @@ msgstr ""
msgid "Investigate vulnerability: %{title}"
msgstr ""
+msgid "Invisible Captcha"
+msgstr ""
+
+msgid "Invisible Captcha helps prevent the creation of spam accounts. It adds a honeypot field and time-sensitive form submission to the account signup form."
+msgstr ""
+
msgid "Invitation"
msgstr "초대"
@@ -18558,12 +18856,18 @@ msgstr ""
msgid "Issues"
msgstr "ì´ìŠˆ"
+msgid "Issues I've created"
+msgstr ""
+
msgid "Issues Rate Limits"
msgstr ""
msgid "Issues and merge requests"
msgstr ""
+msgid "Issues assigned to me"
+msgstr ""
+
msgid "Issues can be bugs, tasks or ideas to be discussed. Also, issues are searchable and filterable."
msgstr "ì´ìŠˆëŠ” 버그, ìž‘ì—… í˜¹ì€ ë…¼ì˜í•  ì•„ì´ë””ì–´ì¼ ìˆ˜ 있습니다. 그리고, ì´ìŠˆëŠ” 검색 ë° í•„í„°ë§ ê°€ëŠ¥í•©ë‹ˆë‹¤."
@@ -18675,7 +18979,7 @@ msgstr ""
msgid "Iterations|Create cadence"
msgstr ""
-msgid "Iterations|Create your first iteration"
+msgid "Iterations|Create iteration"
msgstr ""
msgid "Iterations|Delete cadence"
@@ -18684,6 +18988,9 @@ msgstr ""
msgid "Iterations|Delete iteration cadence?"
msgstr ""
+msgid "Iterations|Delete iteration?"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -18717,12 +19024,18 @@ msgstr ""
msgid "Iterations|New iteration cadence"
msgstr ""
+msgid "Iterations|No closed iterations."
+msgstr ""
+
msgid "Iterations|No iteration cadences to show."
msgstr ""
msgid "Iterations|No iterations in cadence."
msgstr ""
+msgid "Iterations|No open iterations."
+msgstr ""
+
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
@@ -18753,6 +19066,9 @@ msgstr ""
msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
msgstr ""
+msgid "Iterations|This will remove the iteration from any issues that are assigned to it."
+msgstr ""
+
msgid "Iterations|Title"
msgstr ""
@@ -18768,15 +19084,9 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "I’m familiar with the basics of DevOps."
-msgstr ""
-
msgid "I’m joining my team who’s already on GitLab"
msgstr ""
-msgid "I’m not familiar with the basics of DevOps."
-msgstr ""
-
msgid "Jaeger URL"
msgstr ""
@@ -19041,6 +19351,9 @@ msgstr ""
msgid "Job"
msgstr "Job"
+msgid "Job %{jobName}"
+msgstr ""
+
msgid "Job Failed #%{build_id}"
msgstr ""
@@ -19630,9 +19943,6 @@ msgstr ""
msgid "Learn more in the"
msgstr "ë” ìžì„¸ížˆ 알아보기"
-msgid "Learn more in the|pipeline schedules documentation"
-msgstr "파ì´í”„ë¼ì¸ 스케쥴 문서로부터 ë” ì•Œì•„ë³´ê¸°"
-
msgid "Learn more."
msgstr ""
@@ -19744,9 +20054,6 @@ msgstr "나가기"
msgid "Leave Admin Mode"
msgstr ""
-msgid "Leave blank for no limit. Once set, existing personal access tokens may be revoked."
-msgstr ""
-
msgid "Leave edit mode? All unsaved changes will be lost."
msgstr ""
@@ -19792,10 +20099,10 @@ msgstr ""
msgid "LicenseCompliance|Acceptable license to be used in the project"
msgstr ""
-msgid "LicenseCompliance|Add a license"
+msgid "LicenseCompliance|Add license and related policy"
msgstr ""
-msgid "LicenseCompliance|Add license and related policy"
+msgid "LicenseCompliance|Add license policy"
msgstr ""
msgid "LicenseCompliance|Allow"
@@ -19879,6 +20186,9 @@ msgstr ""
msgid "LicenseManagement|Uncategorized"
msgstr ""
+msgid "Licensed Enterprise Edition features can be used if the project namespace's plan includes the feature, or if the project is public."
+msgstr ""
+
msgid "Licensed Features"
msgstr ""
@@ -19945,7 +20255,10 @@ msgstr ""
msgid "Limit namespaces and projects that can be indexed"
msgstr ""
-msgid "Limit sign in from multiple ips"
+msgid "Limit project size at a global, group, and project level. %{link_start}Learn more%{link_end}."
+msgstr ""
+
+msgid "Limit sign in from multiple IP addresses"
msgstr ""
msgid "Limit the number of concurrent operations this secondary site can run in the background."
@@ -19957,10 +20270,16 @@ msgstr ""
msgid "Limit the number of issues and epics per minute a user can create through web and API requests."
msgstr ""
+msgid "Limit the size of Sidekiq jobs stored in Redis."
+msgstr ""
+
msgid "Limited to showing %d event at most"
msgid_plural "Limited to showing %d events at most"
msgstr[0] "최대 %d ì´ë²¤íŠ¸ 만 표시하는 것으로 제한ë©ë‹ˆë‹¤."
+msgid "Limiting mode"
+msgstr ""
+
msgid "Line changes"
msgstr ""
@@ -20030,9 +20349,6 @@ msgstr "사용 가능한 저장소 목ë¡"
msgid "List of all merge commits"
msgstr ""
-msgid "List of users to be excluded from the limit"
-msgstr ""
-
msgid "List options"
msgstr ""
@@ -20072,9 +20388,6 @@ msgstr ""
msgid "Loading functions timed out. Please reload the page to try again."
msgstr ""
-msgid "Loading issues"
-msgstr "ì´ìŠˆ 불러오는 중"
-
msgid "Loading more"
msgstr ""
@@ -20366,6 +20679,9 @@ msgstr ""
msgid "Marked For Deletion At - %{deletion_time}"
msgstr ""
+msgid "Marked as ready. Merging is now allowed."
+msgstr ""
+
msgid "Marked this %{noun} as a draft."
msgstr ""
@@ -20438,52 +20754,22 @@ msgstr ""
msgid "Max 100,000 events"
msgstr ""
-msgid "Max 20 characters"
-msgstr ""
-
-msgid "Max Group Export Download requests per minute per user"
-msgstr ""
-
-msgid "Max Group Export requests per minute per user"
-msgstr ""
-
-msgid "Max Group Import requests per minute per user"
-msgstr ""
-
-msgid "Max Project Export Download requests per minute per user"
-msgstr ""
-
-msgid "Max Project Export requests per minute per user"
-msgstr ""
-
-msgid "Max Project Import requests per minute per user"
-msgstr ""
-
-msgid "Max authenticated API requests per period per user"
-msgstr ""
-
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
-msgid "Max authenticated web requests per period per user"
-msgstr ""
-
msgid "Max file size is 200 KB."
msgstr ""
-msgid "Max requests per minute per user"
-msgstr ""
-
msgid "Max role"
msgstr ""
msgid "Max session time"
msgstr ""
-msgid "Max unauthenticated requests per period per IP"
+msgid "MaxBuilds"
msgstr ""
-msgid "MaxBuilds"
+msgid "Maximum 20 characters"
msgstr ""
msgid "Maximum Conan package file size in bytes"
@@ -20519,6 +20805,12 @@ msgstr ""
msgid "Maximum attachment size (MB)"
msgstr ""
+msgid "Maximum authenticated API requests per rate limit period per user"
+msgstr ""
+
+msgid "Maximum authenticated web requests per rate limit period per user"
+msgstr ""
+
msgid "Maximum bulk request size (MiB)"
msgstr ""
@@ -20564,6 +20856,15 @@ msgstr ""
msgid "Maximum files in a diff"
msgstr ""
+msgid "Maximum group export download requests per minute"
+msgstr ""
+
+msgid "Maximum group export requests per minute"
+msgstr ""
+
+msgid "Maximum group import requests per minute"
+msgstr ""
+
msgid "Maximum import size"
msgstr ""
@@ -20600,7 +20901,7 @@ msgstr ""
msgid "Maximum number of projects."
msgstr ""
-msgid "Maximum number of unique IPs per user"
+msgid "Maximum number of unique IP addresses per user."
msgstr ""
msgid "Maximum page reached"
@@ -20609,12 +20910,24 @@ msgstr ""
msgid "Maximum page size"
msgstr ""
+msgid "Maximum project export download requests per minute"
+msgstr ""
+
+msgid "Maximum project export requests per minute"
+msgstr ""
+
+msgid "Maximum project import requests per minute"
+msgstr ""
+
msgid "Maximum push size"
msgstr ""
msgid "Maximum push size (MB)"
msgstr ""
+msgid "Maximum requests per minute"
+msgstr ""
+
msgid "Maximum running slices"
msgstr ""
@@ -20642,10 +20955,16 @@ msgstr ""
msgid "Maximum time between updates that a mirror can have when scheduled to synchronize."
msgstr ""
-msgid "Maximum time for web terminal websocket connection (in seconds). 0 for unlimited."
+msgid "Maximum time that users are allowed to skip the setup of two-factor authentication (in hours). Set to 0 (zero) to enforce at next sign in."
msgstr ""
-msgid "Maximum time that users are allowed to skip the setup of two-factor authentication (in hours). Set to 0 (zero) to enforce at next sign in."
+msgid "Maximum time, in seconds, for a web terminal websocket connection. 0 for unlimited."
+msgstr ""
+
+msgid "Maximum unauthenticated API requests per rate limit period per IP"
+msgstr ""
+
+msgid "Maximum unauthenticated web requests per rate limit period per IP"
msgstr ""
msgid "May"
@@ -20663,9 +20982,6 @@ msgstr ""
msgid "Medium vulnerabilities present"
msgstr ""
-msgid "Member lock"
-msgstr ""
-
msgid "Member since"
msgstr ""
@@ -20702,6 +21018,9 @@ msgstr ""
msgid "Members of a group may only view projects they have permission to access"
msgstr ""
+msgid "Membership"
+msgstr ""
+
msgid "Members|%{time} by %{user}"
msgstr ""
@@ -20762,9 +21081,6 @@ msgstr ""
msgid "Members|Expiration date updated successfully."
msgstr ""
-msgid "Members|Expired"
-msgstr ""
-
msgid "Members|Filter members"
msgstr ""
@@ -20780,9 +21096,6 @@ msgstr ""
msgid "Members|Membership"
msgstr ""
-msgid "Members|No expiration set"
-msgstr ""
-
msgid "Members|Remove \"%{groupName}\""
msgstr ""
@@ -20804,9 +21117,6 @@ msgstr ""
msgid "Members|Search invited"
msgstr ""
-msgid "Members|in %{time}"
-msgstr ""
-
msgid "Member|Deny access"
msgstr ""
@@ -20882,9 +21192,6 @@ msgstr "머지 리퀘스트(MR)"
msgid "Merge request %{mr_link} was reviewed by %{mr_author}"
msgstr ""
-msgid "Merge request (MR) approvals"
-msgstr ""
-
msgid "Merge request analytics"
msgstr ""
@@ -20906,12 +21213,21 @@ msgstr ""
msgid "Merge requests"
msgstr "머지 리퀘스트(MR)"
+msgid "Merge requests I've created"
+msgstr ""
+
msgid "Merge requests are a place to propose changes you've made to a project and discuss those changes with others"
msgstr "머지 리퀘스트(MR)는 프로ì íŠ¸ì˜ 변경 ì‚¬í•­ì„ ì œì•ˆí•˜ê³  변경 ì‚¬í•­ì„ ë‹¤ë¥¸ 사람들과 ë…¼ì˜ í•˜ëŠ” 곳입니다."
msgid "Merge requests are read-only in a secondary Geo node"
msgstr ""
+msgid "Merge requests assigned to me"
+msgstr ""
+
+msgid "Merge requests that I'm a reviewer"
+msgstr ""
+
msgid "Merge the branch and fix any conflicts that come up"
msgstr ""
@@ -20972,10 +21288,10 @@ msgstr ""
msgid "MergeRequests|An error occurred while saving the draft comment."
msgstr ""
-msgid "MergeRequests|Failed to squash. Should be done manually."
+msgid "MergeRequests|Create issue to resolve thread"
msgstr ""
-msgid "MergeRequests|Resolve this thread in a new issue"
+msgid "MergeRequests|Failed to squash. Should be done manually."
msgstr ""
msgid "MergeRequests|Saving the comment failed"
@@ -21787,6 +22103,9 @@ msgstr ""
msgid "MoveIssue|Cannot move issue to project it originates from!"
msgstr ""
+msgid "MoveIssue|Cannot move issues of '%{issue_type}' type."
+msgstr ""
+
msgid "Moved issue to %{label} column in the board."
msgstr ""
@@ -21911,6 +22230,15 @@ 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. To learn more about reducing storage capacity please visit our docs."
msgstr ""
+msgid "NamespaceUserCap|Pending users must be reviewed and approved by a group owner. Learn more about %{user_caps_link_start}User Caps%{link_end} and %{users_pending_approval_link_start}Users Pending Approval%{link_end}."
+msgstr ""
+
+msgid "NamespaceUserCap|View pending user approvals"
+msgstr ""
+
+msgid "NamespaceUserCap|Your group has reached its billable member limit"
+msgstr ""
+
msgid "Namespaces"
msgstr ""
@@ -21953,9 +22281,6 @@ msgstr ""
msgid "Network"
msgstr "네트워í¬"
-msgid "Network Policy|New rule"
-msgstr ""
-
msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is inbound from a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
msgstr ""
@@ -21977,16 +22302,13 @@ msgstr ""
msgid "NetworkPolicies|%{strongOpen}any%{strongClose} port"
msgstr ""
-msgid "NetworkPolicies|+ Add alert"
-msgstr ""
-
msgid "NetworkPolicies|.yaml"
msgstr ""
msgid "NetworkPolicies|.yaml mode"
msgstr ""
-msgid "NetworkPolicies|Actions"
+msgid "NetworkPolicies|Add alert"
msgstr ""
msgid "NetworkPolicies|Alerts are intended to be selectively used for a limited number of events that are potentially concerning and warrant a manual review. Alerts should not be used as a substitute for a SIEM or a logging tool. High volume alerts are likely to be dropped so as to preserve the stability of GitLab's integration with Kubernetes."
@@ -22022,9 +22344,6 @@ msgstr ""
msgid "NetworkPolicies|Deny all traffic"
msgstr ""
-msgid "NetworkPolicies|Description"
-msgstr ""
-
msgid "NetworkPolicies|Edit policy"
msgstr ""
@@ -22037,9 +22356,6 @@ msgstr ""
msgid "NetworkPolicies|IP/subnet"
msgstr ""
-msgid "NetworkPolicies|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
-msgstr ""
-
msgid "NetworkPolicies|Invalid or empty policy"
msgstr ""
@@ -22049,19 +22365,16 @@ msgstr ""
msgid "NetworkPolicies|Kubernetes error: %{error}"
msgstr ""
-msgid "NetworkPolicies|Name"
-msgstr ""
-
msgid "NetworkPolicies|Network"
msgstr ""
-msgid "NetworkPolicies|Network traffic"
+msgid "NetworkPolicies|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
msgstr ""
-msgid "NetworkPolicies|New policy"
+msgid "NetworkPolicies|Network policy can be created after the environment is loaded successfully."
msgstr ""
-msgid "NetworkPolicies|No policies detected"
+msgid "NetworkPolicies|Network traffic"
msgstr ""
msgid "NetworkPolicies|None selected"
@@ -22070,21 +22383,12 @@ msgstr ""
msgid "NetworkPolicies|Please %{installLinkStart}install%{installLinkEnd} and %{configureLinkStart}configure a Kubernetes Agent for this project%{configureLinkEnd} to enable alerts."
msgstr ""
-msgid "NetworkPolicies|Policies are a specification of how groups of pods are allowed to communicate with each other's network endpoints."
-msgstr ""
-
msgid "NetworkPolicies|Policy %{policyName} was successfully changed"
msgstr ""
msgid "NetworkPolicies|Policy definition"
msgstr ""
-msgid "NetworkPolicies|Policy editor"
-msgstr ""
-
-msgid "NetworkPolicies|Policy preview"
-msgstr ""
-
msgid "NetworkPolicies|Rule"
msgstr ""
@@ -22094,9 +22398,6 @@ msgstr ""
msgid "NetworkPolicies|Rule mode is unavailable for this policy. In some cases, we cannot parse the YAML file back into the rules editor."
msgstr ""
-msgid "NetworkPolicies|Rules"
-msgstr ""
-
msgid "NetworkPolicies|Save changes"
msgstr ""
@@ -22109,9 +22410,6 @@ msgstr ""
msgid "NetworkPolicies|Traffic that does not match any rule will be blocked."
msgstr ""
-msgid "NetworkPolicies|Unable to parse policy"
-msgstr ""
-
msgid "NetworkPolicies|all DNS names"
msgstr ""
@@ -22290,6 +22588,9 @@ msgstr "신규 ID"
msgid "New issue"
msgstr "새 ì´ìŠˆ"
+msgid "New issue in %{project}"
+msgstr ""
+
msgid "New issue title"
msgstr ""
@@ -22368,7 +22669,7 @@ msgstr "새로 만들기..."
msgid "Newest first"
msgstr ""
-msgid "Newly registered users will by default be external"
+msgid "Newly-registered users are external by default"
msgstr ""
msgid "Next"
@@ -22683,8 +22984,9 @@ msgstr ""
msgid "No webhooks found, add one in the form above."
msgstr ""
-msgid "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} to renew your subscription."
-msgstr ""
+msgid "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} day to renew your subscription."
+msgid_plural "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} days to renew your subscription."
+msgstr[0] ""
msgid "No. of commits"
msgstr ""
@@ -22701,7 +23003,7 @@ msgstr ""
msgid "Nodes"
msgstr "노드"
-msgid "Non-admin users can sign in with read-only access and make read-only API requests."
+msgid "Non-admin users are restricted to read-only access, in both GitLab UI and API."
msgstr ""
msgid "None"
@@ -22782,7 +23084,7 @@ msgstr "참고: 관리ìžì—게 %{github_integration_link} (ì„) 를 설정하ì—
msgid "NoteForm|Note"
msgstr ""
-msgid "Notes Rate Limits"
+msgid "Notes rate limit"
msgstr ""
msgid "Notes|Are you sure you want to cancel creating this comment?"
@@ -22945,9 +23247,6 @@ msgstr "11ì›”"
msgid "November"
msgstr "11ì›”"
-msgid "Novice"
-msgstr ""
-
msgid "Now, personalize your GitLab experience"
msgstr ""
@@ -23116,7 +23415,7 @@ msgstr ""
msgid "OnCallSchedules|For this rotation, on-call will be:"
msgstr ""
-msgid "OnCallSchedules|On-call schedule %{schedule} in Project %{project}"
+msgid "OnCallSchedules|On-call schedule %{obstacle} in Project %{project}"
msgstr ""
msgid "OnCallSchedules|On-call schedules"
@@ -23263,22 +23562,22 @@ msgstr ""
msgid "OnDemandScans|Scanner profile"
msgstr ""
-msgid "OnDemandScans|Select one of the existing profiles"
+msgid "OnDemandScans|Schedule scan"
msgstr ""
-msgid "OnDemandScans|Site profile"
+msgid "OnDemandScans|Select one of the existing profiles"
msgstr ""
-msgid "OnDemandScans|Use existing scanner profile"
+msgid "OnDemandScans|Site profile"
msgstr ""
-msgid "OnDemandScans|Use existing site profile"
+msgid "OnDemandScans|Start time"
msgstr ""
-msgid "OnDemandScans|You can either choose a passive scan or validate the target site in your chosen site profile. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
+msgid "OnDemandScans|Use existing scanner profile"
msgstr ""
-msgid "OnDemandScans|You cannot run an active scan against an unvalidated site."
+msgid "OnDemandScans|Use existing site profile"
msgstr ""
msgid "OnDemandScans|You must create a repository within your project to run an on-demand scan."
@@ -23342,6 +23641,9 @@ msgstr ""
msgid "Only admins can delete project"
msgstr ""
+msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
+msgstr ""
+
msgid "Only include features new to your current subscription tier."
msgstr ""
@@ -23360,6 +23662,12 @@ msgstr ""
msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
+msgid "Only reCAPTCHA v2 is supported:"
+msgstr ""
+
+msgid "Only users from the specified IP address ranges are able to reach this group, including all subgroups, projects, and Git repositories."
+msgstr ""
+
msgid "Only verified users with an email address in any of these domains can be added to the group."
msgstr ""
@@ -23546,9 +23854,6 @@ msgstr "소유ìž"
msgid "Package Registry"
msgstr ""
-msgid "Package Registry Rate Limits"
-msgstr ""
-
msgid "Package Registry: authenticated API requests"
msgstr ""
@@ -23567,6 +23872,9 @@ msgstr ""
msgid "Package recipe already exists"
msgstr ""
+msgid "Package registry rate limits"
+msgstr ""
+
msgid "Package type"
msgstr ""
@@ -23633,6 +23941,9 @@ msgstr ""
msgid "PackageRegistry|Composer"
msgstr ""
+msgid "PackageRegistry|Composer.json with license: %{license} and version: %{version}"
+msgstr ""
+
msgid "PackageRegistry|Conan"
msgstr ""
@@ -23696,6 +24007,9 @@ msgstr ""
msgid "PackageRegistry|Copy require package include"
msgstr ""
+msgid "PackageRegistry|Copy target SHA"
+msgstr ""
+
msgid "PackageRegistry|Copy yarn command"
msgstr ""
@@ -23762,6 +24076,9 @@ msgstr ""
msgid "PackageRegistry|Install package version"
msgstr ""
+msgid "PackageRegistry|Instance-level"
+msgstr ""
+
msgid "PackageRegistry|Invalid Package: failed metadata extraction"
msgstr ""
@@ -23807,6 +24124,9 @@ msgstr ""
msgid "PackageRegistry|Pip Command"
msgstr ""
+msgid "PackageRegistry|Project-level"
+msgstr ""
+
msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
msgstr ""
@@ -23828,6 +24148,9 @@ msgstr ""
msgid "PackageRegistry|Remove package"
msgstr ""
+msgid "PackageRegistry|Required Python: %{pythonVersion}"
+msgstr ""
+
msgid "PackageRegistry|RubyGems"
msgstr ""
@@ -23870,6 +24193,9 @@ msgstr ""
msgid "PackageRegistry|Source project located at %{link}"
msgstr ""
+msgid "PackageRegistry|Target SHA: %{sha}"
+msgstr ""
+
msgid "PackageRegistry|There are no other versions of this package."
msgstr ""
@@ -24038,6 +24364,18 @@ msgstr "비밀번호가 성공ì ìœ¼ë¡œ 변경ë˜ì—ˆìŠµë‹ˆë‹¤."
msgid "Password was successfully updated. Please sign in again."
msgstr ""
+msgid "PasswordPrompt|Confirm password"
+msgstr ""
+
+msgid "PasswordPrompt|Confirm password to continue"
+msgstr ""
+
+msgid "PasswordPrompt|Password is required"
+msgstr ""
+
+msgid "PasswordPrompt|Please enter your password to confirm"
+msgstr ""
+
msgid "Passwords should be unique and not used for any other sites or services."
msgstr ""
@@ -24065,6 +24403,9 @@ msgstr ""
msgid "Paste project path (i.e. gitlab-org/gitlab)"
msgstr ""
+msgid "Paste this DSN into your Sentry SDK"
+msgstr ""
+
msgid "Paste your public SSH key, which is usually contained in the file '~/.ssh/id_ed25519.pub' or '~/.ssh/id_rsa.pub' and begins with 'ssh-ed25519' or 'ssh-rsa'. Do not paste your private SSH key, as that can compromise your identity."
msgstr ""
@@ -24149,6 +24490,9 @@ msgstr ""
msgid "PerformanceBar|First Contentful Paint"
msgstr ""
+msgid "PerformanceBar|Flamegraph with mode:"
+msgstr ""
+
msgid "PerformanceBar|Frontend resources"
msgstr ""
@@ -24182,6 +24526,15 @@ msgstr ""
msgid "PerformanceBar|Trace"
msgstr ""
+msgid "PerformanceBar|cpu"
+msgstr ""
+
+msgid "PerformanceBar|object"
+msgstr ""
+
+msgid "PerformanceBar|wall"
+msgstr ""
+
msgid "Period in seconds"
msgstr ""
@@ -24410,6 +24763,48 @@ msgstr "대ìƒ"
msgid "PipelineSchedules|Variables"
msgstr "변수"
+msgid "PipelineSource|API"
+msgstr ""
+
+msgid "PipelineSource|Chat"
+msgstr ""
+
+msgid "PipelineSource|External"
+msgstr ""
+
+msgid "PipelineSource|External Pull Request"
+msgstr ""
+
+msgid "PipelineSource|Merge Request"
+msgstr ""
+
+msgid "PipelineSource|On-Demand DAST Scan"
+msgstr ""
+
+msgid "PipelineSource|On-Demand DAST Validation"
+msgstr ""
+
+msgid "PipelineSource|Parent Pipeline"
+msgstr ""
+
+msgid "PipelineSource|Pipeline"
+msgstr ""
+
+msgid "PipelineSource|Push"
+msgstr ""
+
+msgid "PipelineSource|Schedule"
+msgstr ""
+
+msgid "PipelineSource|Trigger"
+msgstr ""
+
+msgid "PipelineSource|Web"
+msgstr ""
+
+msgid "PipelineSource|Web IDE"
+msgstr ""
+
msgid "PipelineStatusTooltip|Pipeline: %{ciStatus}"
msgstr ""
@@ -24710,46 +25105,7 @@ msgstr ""
msgid "Pipeline|Source"
msgstr ""
-msgid "Pipeline|Source|API"
-msgstr ""
-
-msgid "Pipeline|Source|Chat"
-msgstr ""
-
-msgid "Pipeline|Source|External"
-msgstr ""
-
-msgid "Pipeline|Source|External Pull Request"
-msgstr ""
-
-msgid "Pipeline|Source|Merge Request"
-msgstr ""
-
-msgid "Pipeline|Source|On-Demand DAST Scan"
-msgstr ""
-
-msgid "Pipeline|Source|On-Demand DAST Validation"
-msgstr ""
-
-msgid "Pipeline|Source|Parent Pipeline"
-msgstr ""
-
-msgid "Pipeline|Source|Pipeline"
-msgstr ""
-
-msgid "Pipeline|Source|Push"
-msgstr ""
-
-msgid "Pipeline|Source|Schedule"
-msgstr ""
-
-msgid "Pipeline|Source|Trigger"
-msgstr ""
-
-msgid "Pipeline|Source|Web"
-msgstr ""
-
-msgid "Pipeline|Source|Web IDE"
+msgid "Pipeline|Source|Security Policy"
msgstr ""
msgid "Pipeline|Specify variable values to be used in this run. The values specified in %{linkStart}CI/CD settings%{linkEnd} will be used by default."
@@ -24800,8 +25156,8 @@ msgstr ""
msgid "Pipeline|We are currently unable to fetch pipeline data"
msgstr ""
-msgid "Pipeline|You’re about to stop pipeline %{pipelineId}."
-msgstr "%{pipelineId} 파ì´í”„ë¼ì¸ì„ 중지하고 있습니다."
+msgid "Pipeline|You’re about to stop pipeline #%{pipelineId}."
+msgstr ""
msgid "Pipeline|for"
msgstr ""
@@ -24827,6 +25183,9 @@ msgstr ""
msgid "Plain diff"
msgstr ""
+msgid "Plain-text response to send to clients that hit a rate limit"
+msgstr ""
+
msgid "Plan:"
msgstr ""
@@ -24971,9 +25330,6 @@ msgstr ""
msgid "Please provide attributes to update"
msgstr ""
-msgid "Please provide your username or email address."
-msgstr ""
-
msgid "Please reach out if you have any questions and we'll be happy to assist."
msgstr ""
@@ -25016,9 +25372,6 @@ msgstr ""
msgid "Please set a new password before proceeding."
msgstr "계ì†í•˜ê¸° ì „ì— ìƒˆ 비밀번호를 설정해주세요."
-msgid "Please share your feedback about %{featureName} %{linkStart}in this issue%{linkEnd} to help us improve the experience."
-msgstr ""
-
msgid "Please solve the captcha"
msgstr ""
@@ -25196,6 +25549,9 @@ msgstr ""
msgid "Prevent adding new members to project membership within this group"
msgstr ""
+msgid "Prevent auto-stopping"
+msgstr ""
+
msgid "Prevent editing approval rules in projects and merge requests."
msgstr ""
@@ -25208,7 +25564,7 @@ msgstr ""
msgid "Prevent users from changing their profile name"
msgstr ""
-msgid "Prevent users from performing write operations on GitLab while performing maintenance."
+msgid "Prevent users from performing write operations while GitLab maintenance is in progress."
msgstr ""
msgid "Preview"
@@ -25481,6 +25837,9 @@ msgstr ""
msgid "Profiles|Enter your name, so people you know can recognize you"
msgstr "ì‚¬ëžŒë“¤ì´ ë‚˜ë¥¼ 알아볼 수 있ë„ë¡ ë‚´ ì´ë¦„ì„ ìž…ë ¥í•˜ì„¸ìš”."
+msgid "Profiles|Enter your password to confirm the email change"
+msgstr ""
+
msgid "Profiles|Enter your pronouns to let people know how to refer to you"
msgstr ""
@@ -25692,7 +26051,7 @@ msgid "Profiles|You must transfer ownership or delete groups you are an owner of
msgstr ""
msgid "Profiles|You must transfer ownership or delete these groups before you can delete your account."
-msgstr "ë‹¹ì‹ ì˜ ê³„ì •ì„ ì‚­ì œí•˜ê¸° ì „ì— ì´ ê·¸ë£¹ë“¤ì˜ ì†Œìœ ê¶Œì„ ì´ì „하거나 삭제해야합니다."
+msgstr ""
msgid "Profiles|Your LinkedIn profile name from linkedin.com/in/profilename"
msgstr "linkedin.com/in/profilenameì˜ í”„ë¡œí•„ ì´ë¦„"
@@ -25715,10 +26074,10 @@ msgstr "ë‚˜ì˜ ìƒíƒœ"
msgid "Profiles|e.g. My MacBook key"
msgstr "예: 내 MacBook 키"
-msgid "Profiles|username"
+msgid "Profiles|https://website.com"
msgstr ""
-msgid "Profiles|website.com"
+msgid "Profiles|username"
msgstr ""
msgid "Profiles|your account"
@@ -25961,9 +26320,21 @@ msgstr "프로ì íŠ¸ ID: %{project_id}"
msgid "ProjectSelect| or group"
msgstr ""
+msgid "ProjectSelect|No matching results"
+msgstr ""
+
msgid "ProjectSelect|Search for project"
msgstr ""
+msgid "ProjectSelect|Search projects"
+msgstr ""
+
+msgid "ProjectSelect|Select a project"
+msgstr ""
+
+msgid "ProjectSelect|There was an error fetching the projects. Please try again."
+msgstr ""
+
msgid "ProjectService|Drone server URL"
msgstr ""
@@ -26051,6 +26422,9 @@ msgstr ""
msgid "ProjectService|Trigger event when a new, unique alert is recorded."
msgstr ""
+msgid "ProjectService|Trigger event when a new, unique vulnerability is recorded. (Note: This feature requires an Ultimate plan.)"
+msgstr ""
+
msgid "ProjectService|Trigger event when a pipeline status changes."
msgstr ""
@@ -26465,9 +26839,15 @@ msgstr ""
msgid "Projects are graded based on the highest severity vulnerability present"
msgstr ""
+msgid "Projects are organized into groups"
+msgstr ""
+
msgid "Projects contributed to"
msgstr ""
+msgid "Projects help you organize your work. They contain your file repository, issues, merge requests, and so much more."
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr "%{group_name}ê³¼ 공유ë˜ëŠ” 프로ì íŠ¸"
@@ -26702,10 +27082,10 @@ msgstr ""
msgid "PrometheusService|Prometheus cluster integration"
msgstr ""
-msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
+msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
msgstr ""
-msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
+msgid "PrometheusService|The ID of the IAP-secured resource."
msgstr ""
msgid "PrometheusService|The Prometheus API base URL."
@@ -27323,6 +27703,9 @@ msgstr ""
msgid "Rate limit"
msgstr ""
+msgid "Rate limits can help reduce request volume (like from crawlers or abusive bots)."
+msgstr ""
+
msgid "Raw blob request rate limit per minute"
msgstr ""
@@ -27335,6 +27718,9 @@ msgstr ""
msgid "Re-authentication required"
msgstr ""
+msgid "Re-import"
+msgstr ""
+
msgid "Re-request review"
msgstr ""
@@ -27356,6 +27742,9 @@ msgstr ""
msgid "Read more about related issues"
msgstr ""
+msgid "Read their documentation."
+msgstr ""
+
msgid "Ready to get started with GitLab? Follow these steps to set up your workspace, plan and commit changes, and deploy your project."
msgstr ""
@@ -27389,6 +27778,9 @@ msgstr ""
msgid "Receive any notifications from GitLab."
msgstr ""
+msgid "Receive notification of abuse reports by email."
+msgstr ""
+
msgid "Receive notifications about your own activity"
msgstr ""
@@ -27531,9 +27923,6 @@ msgstr ""
msgid "Registry setup"
msgstr ""
-msgid "Regulate approvals by authors/committers. Affects all projects."
-msgstr ""
-
msgid "Reindexing Status: %{status} (Slice multiplier: %{multiplier}, Maximum running slices: %{max_slices})"
msgstr ""
@@ -27628,6 +28017,9 @@ msgstr ""
msgid "Release|Something went wrong while saving the release details."
msgstr ""
+msgid "Reload page"
+msgstr ""
+
msgid "Remediations"
msgstr ""
@@ -27910,6 +28302,9 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
+msgid "Repeats"
+msgstr ""
+
msgid "Replace"
msgstr ""
@@ -28268,10 +28663,7 @@ msgstr ""
msgid "Require additional authentication for administrative tasks."
msgstr ""
-msgid "Require all users in this group to setup Two-factor authentication"
-msgstr ""
-
-msgid "Require all users in this group to setup two-factor authentication"
+msgid "Require all users in this group to set up two-factor authentication"
msgstr ""
msgid "Required approvals (%{approvals_given} given)"
@@ -28315,6 +28707,9 @@ msgstr[0] ""
msgid "Requires values to meet regular expression requirements."
msgstr ""
+msgid "Requires you to deploy or set up cloud-hosted Sentry."
+msgstr ""
+
msgid "Requires your primary GitLab email address."
msgstr ""
@@ -28375,9 +28770,6 @@ msgstr ""
msgid "Resolve"
msgstr ""
-msgid "Resolve all threads in new issue"
-msgstr ""
-
msgid "Resolve conflicts"
msgstr ""
@@ -28435,6 +28827,9 @@ msgstr ""
msgid "Response text"
msgstr ""
+msgid "Restart GitLab to apply changes."
+msgstr ""
+
msgid "Restart Terminal"
msgstr "í„°ë¯¸ë„ ìž¬ì‹œìž‘"
@@ -28453,6 +28848,9 @@ msgstr ""
msgid "Restoring the project will prevent the project from being removed on this date and restore people's ability to make changes to it."
msgstr ""
+msgid "Restrict group access by IP address. %{link_start}Learn more%{link_end}."
+msgstr ""
+
msgid "Restrict membership by email domain"
msgstr ""
@@ -28764,6 +29162,9 @@ msgstr ""
msgid "Runners|Runner #%{runner_id}"
msgstr ""
+msgid "Runners|Runner assigned to project."
+msgstr ""
+
msgid "Runners|Runner is offline, last contact was %{runner_contact} ago"
msgstr ""
@@ -28776,6 +29177,9 @@ msgstr ""
msgid "Runners|Runner registration"
msgstr ""
+msgid "Runners|Runner unassigned from project."
+msgstr ""
+
msgid "Runners|Runners"
msgstr ""
@@ -28968,7 +29372,7 @@ msgstr ""
msgid "SastEntryPoints|How do I set up SAST?"
msgstr ""
-msgid "SastEntryPoints|Learn more."
+msgid "SastEntryPoints|Learn more"
msgstr ""
msgid "Satisfied"
@@ -29010,7 +29414,7 @@ msgstr "비밀번호 저장"
msgid "Save pipeline schedule"
msgstr "파ì´í”„ë¼ì¸ 스케줄 저장"
-msgid "Save space and find images in the container Registry. remove unneeded tags and keep only the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
+msgid "Save storage space by automatically deleting tags from the container registry and keeping the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
msgstr ""
msgid "Saving"
@@ -29184,6 +29588,9 @@ msgstr "검색 ë˜ëŠ” ê²°ê³¼ í•„í„°..."
msgid "Search or filter results…"
msgstr "검색 ë˜ëŠ” ê²°ê³¼ í•„í„°..."
+msgid "Search or jump to..."
+msgstr ""
+
msgid "Search project"
msgstr "프로ì íŠ¸ 검색"
@@ -29244,16 +29651,16 @@ msgstr ""
msgid "SearchCodeResults|of %{link_to_project}"
msgstr ""
-msgid "SearchResults|Showing %{count} %{scope} for%{term_element}"
+msgid "SearchResults|Showing %{count} %{scope} for %{term_element}"
msgstr ""
-msgid "SearchResults|Showing %{count} %{scope} for%{term_element} in your personal and project snippets"
+msgid "SearchResults|Showing %{count} %{scope} for %{term_element} in your personal and project snippets"
msgstr ""
-msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for%{term_element}"
+msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for %{term_element}"
msgstr ""
-msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for%{term_element} in your personal and project snippets"
+msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for %{term_element} in your personal and project snippets"
msgstr ""
msgid "SearchResults|code result"
@@ -29324,6 +29731,9 @@ msgstr "비밀"
msgid "Secret Detection"
msgstr ""
+msgid "Secret access key"
+msgstr ""
+
msgid "Secret token"
msgstr ""
@@ -29363,9 +29773,6 @@ msgstr ""
msgid "SecurityApprovals|A merge request approval is required when the license compliance report contains a denied license."
msgstr ""
-msgid "SecurityApprovals|Configurable if security scanners are enabled. %{linkStart}Learn more.%{linkEnd}"
-msgstr ""
-
msgid "SecurityApprovals|Coverage-Check"
msgstr ""
@@ -29378,24 +29785,18 @@ msgstr ""
msgid "SecurityApprovals|Learn more about Vulnerability-Check"
msgstr ""
-msgid "SecurityApprovals|License Scanning must be enabled. %{linkStart}Learn more%{linkEnd}."
-msgstr ""
-
msgid "SecurityApprovals|License-Check"
msgstr ""
msgid "SecurityApprovals|Requires approval for Denied licenses. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}More information%{linkEnd}"
+msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "SecurityApprovals|Requires approval for vulnerabilities. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
-msgid "SecurityApprovals|Test coverage must be enabled. %{linkStart}Learn more%{linkEnd}."
-msgstr ""
-
msgid "SecurityApprovals|Vulnerability-Check"
msgstr ""
@@ -29459,6 +29860,12 @@ msgstr ""
msgid "SecurityConfiguration|Immediately begin risk analysis and remediation with application security features. Start with SAST and Secret Detection, available to all plans. Upgrade to Ultimate to get all features, including:"
msgstr ""
+msgid "SecurityConfiguration|Manage corpus"
+msgstr ""
+
+msgid "SecurityConfiguration|Manage corpus files used as mutation sources in coverage fuzzing."
+msgstr ""
+
msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
msgstr ""
@@ -29513,6 +29920,12 @@ msgstr ""
msgid "SecurityOrchestration|Action"
msgstr ""
+msgid "SecurityOrchestration|Actions"
+msgstr ""
+
+msgid "SecurityOrchestration|Add rule"
+msgstr ""
+
msgid "SecurityOrchestration|All policies"
msgstr ""
@@ -29546,9 +29959,6 @@ msgstr ""
msgid "SecurityOrchestration|Network"
msgstr ""
-msgid "SecurityOrchestration|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
-msgstr ""
-
msgid "SecurityOrchestration|New policy"
msgstr ""
@@ -29564,6 +29974,9 @@ msgstr ""
msgid "SecurityOrchestration|Policy editor"
msgstr ""
+msgid "SecurityOrchestration|Policy preview"
+msgstr ""
+
msgid "SecurityOrchestration|Policy status"
msgstr ""
@@ -29573,6 +29986,9 @@ msgstr ""
msgid "SecurityOrchestration|Rule"
msgstr ""
+msgid "SecurityOrchestration|Rules"
+msgstr ""
+
msgid "SecurityOrchestration|Scan Execution"
msgstr ""
@@ -29666,6 +30082,9 @@ msgstr ""
msgid "SecurityReports|Create issue"
msgstr ""
+msgid "SecurityReports|Development vulnerabilities"
+msgstr ""
+
msgid "SecurityReports|Dismiss vulnerability"
msgstr ""
@@ -29681,6 +30100,9 @@ msgstr ""
msgid "SecurityReports|Download results"
msgstr ""
+msgid "SecurityReports|Download scanned URLs"
+msgstr ""
+
msgid "SecurityReports|Download scanned resources"
msgstr ""
@@ -29804,6 +30226,9 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
+msgid "SecurityReports|The Vulnerability Report shows the results of the lastest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "SecurityReports|The security reports below contain one or more vulnerability findings that could not be parsed and were not recorded. Download the artifacts in the job output to investigate. Ensure any security report created conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
msgstr ""
@@ -29945,10 +30370,10 @@ msgstr ""
msgid "Select a repository"
msgstr ""
-msgid "Select a role"
+msgid "Select a repository containing templates for common files."
msgstr ""
-msgid "Select a shared template repository for all projects on this instance."
+msgid "Select a role"
msgstr ""
msgid "Select a template repository"
@@ -30026,6 +30451,9 @@ msgstr "머신 타입 ì„¤ì •ì„ ìœ„í•´ 프로ì íŠ¸ì™€ ì¡´ì„ ì„ íƒí•˜ì„¸ìš”."
msgid "Select project to choose zone"
msgstr ""
+msgid "Select project to create issue"
+msgstr ""
+
msgid "Select projects"
msgstr "프로ì íŠ¸ ì„ íƒ"
@@ -30143,6 +30571,9 @@ msgstr ""
msgid "Send emails to help guide new users through the onboarding process."
msgstr ""
+msgid "Send emails to users upon account deactivation."
+msgstr ""
+
msgid "Send message"
msgstr ""
@@ -30161,6 +30592,9 @@ msgstr ""
msgid "Send service data"
msgstr ""
+msgid "Sentry"
+msgstr ""
+
msgid "Sentry API URL"
msgstr ""
@@ -30275,6 +30709,9 @@ msgstr ""
msgid "Service"
msgstr ""
+msgid "Service Accounts keys are required to authorize GitLab to deploy your Google Cloud project."
+msgstr ""
+
msgid "Service Desk"
msgstr "서비스 ë°ìŠ¤í¬"
@@ -30347,15 +30784,15 @@ msgstr ""
msgid "Set a password on your account to pull or push via %{protocol}."
msgstr "%{protocol} í”„ë¡œí† ì½œì„ í†µí•´ Pull 하거나 Push하려면 ê³„ì •ì— íŒ¨ìŠ¤ì›Œë“œë¥¼ 설정하십시오."
-msgid "Set a template repository for projects in this group"
-msgstr ""
-
msgid "Set access permissions for this token."
msgstr ""
msgid "Set an instance-wide domain that will be available to all clusters when installing Knative."
msgstr ""
+msgid "Set any rate limit to %{code_open}0%{code_close} to disable the limit."
+msgstr ""
+
msgid "Set default and restrict visibility levels. Configure import sources and git access protocol."
msgstr "ê¸°ë³¸ê°’ì„ ì„¤ì •í•˜ê³  공개 ìˆ˜ì¤€ì„ ì œí•œí•˜ì‹­ì‹œì˜¤. 소스 가져오기와 git ì ‘ê·¼ í”„ë¡œí† ì½œì„ ì„¤ì •í•˜ì‹­ì‹œì˜¤."
@@ -30368,8 +30805,8 @@ msgstr ""
msgid "Set limit to 0 to allow any file size."
msgstr ""
-msgid "Set max session time for web terminal."
-msgstr "웹 터미ë„ì˜ ìµœëŒ€ 세션 ì‹œê°„ì„ ì„¤ì •í•©ë‹ˆë‹¤."
+msgid "Set limits for web and API requests."
+msgstr ""
msgid "Set milestone"
msgstr ""
@@ -30377,15 +30814,18 @@ msgstr ""
msgid "Set new password"
msgstr "새 비밀번호 설정"
-msgid "Set notification email for abuse reports."
-msgstr "남용 ë³´ê³ ì„œì— ëŒ€í•œ 알림 ì´ë©”ì¼ì„ 설정합니다."
-
msgid "Set parent epic to an epic"
msgstr ""
+msgid "Set per-user rate limits for imports and exports of projects and groups."
+msgstr ""
+
msgid "Set projects and maximum size limits, session duration, user options, and check feature availability for namespace plan."
msgstr ""
+msgid "Set rate limits for package registry API requests that supersede the general user and IP rate limits."
+msgstr ""
+
msgid "Set severity"
msgstr ""
@@ -30404,15 +30844,24 @@ msgstr ""
msgid "Set the default branch for this project. All merge requests and commits are made against this branch unless you specify a different one."
msgstr ""
+msgid "Set the default expiration time for job artifacts in all projects. Set to %{code_open}0%{code_close} to never expire artifacts by default. If no unit is written, it defaults to seconds. For example, these are all equivalent: %{code_open}3600%{code_close}, %{code_open}60 minutes%{code_close}, or %{code_open}one hour%{code_close}."
+msgstr ""
+
msgid "Set the due date to %{due_date}."
msgstr ""
msgid "Set the iteration to %{iteration_reference}."
msgstr ""
+msgid "Set the maximum session time for a web terminal."
+msgstr ""
+
msgid "Set the milestone to %{milestone_reference}."
msgstr ""
+msgid "Set the per-user rate limit for notes created by web or API requests."
+msgstr ""
+
msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
msgstr ""
@@ -30614,6 +31063,9 @@ msgstr ""
msgid "Show Pipeline IID"
msgstr ""
+msgid "Show all %{issuable_type}."
+msgstr ""
+
msgid "Show all activity"
msgstr ""
@@ -30665,15 +31117,9 @@ msgstr "최신 버전 보기"
msgid "Show list"
msgstr ""
-msgid "Show me advanced features"
-msgstr ""
-
msgid "Show me how to add a pipeline"
msgstr ""
-msgid "Show me the basics"
-msgstr ""
-
msgid "Show one file at a time"
msgstr ""
@@ -30712,15 +31158,15 @@ msgstr ""
msgid "Showing %{pageSize} of %{total} %{issuableType}"
msgstr ""
-msgid "Showing %{pageSize} of %{total} issues"
-msgstr ""
-
msgid "Showing all epics"
msgstr ""
msgid "Showing all issues"
msgstr ""
+msgid "Showing data for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
+msgstr ""
+
msgid "Showing data for workflow items created in this date range. Date range cannot exceed %{maxDateRange} days."
msgstr ""
@@ -30760,6 +31206,15 @@ msgstr ""
msgid "Sidebar|Weight"
msgstr "중요ë„"
+msgid "Sidekiq job compression threshold (bytes)"
+msgstr ""
+
+msgid "Sidekiq job size limit (bytes)"
+msgstr ""
+
+msgid "Sidekiq job size limits"
+msgstr ""
+
msgid "Sign in"
msgstr "로그ì¸"
@@ -30880,6 +31335,9 @@ msgstr ""
msgid "Site profile not found for given parameters"
msgstr ""
+msgid "Sites"
+msgstr ""
+
msgid "Size"
msgstr "í¬ê¸°"
@@ -30910,19 +31368,22 @@ msgstr ""
msgid "SlackIntegration|Sends notifications about project events to Slack channels."
msgstr ""
-msgid "SlackService|2. Paste the %{strong_open}Token%{strong_close} into the field below"
+msgid "SlackService|1. %{slash_command_link_start}Add a slash command%{slash_command_link_end} in your Slack team using this information:"
msgstr ""
-msgid "SlackService|3. Select the %{strong_open}Active%{strong_close} checkbox, press %{strong_open}Save changes%{strong_close} and start using GitLab inside Slack!"
+msgid "SlackService|2. Paste the token from Slack in the %{strong_open}Token%{strong_close} field below."
msgstr ""
-msgid "SlackService|Fill in the word that works best for your team."
+msgid "SlackService|3. Select the %{strong_open}Active%{strong_close} checkbox, select %{strong_open}Save changes%{strong_close}, and start using slash commands in Slack!"
+msgstr ""
+
+msgid "SlackService|After setup, get a list of available Slack slash commands by entering"
msgstr ""
-msgid "SlackService|See list of available commands in Slack after setting up this service, by entering"
+msgid "SlackService|Fill in the word that works best for your team."
msgstr ""
-msgid "SlackService|This service allows users to perform common operations on this project by entering slash commands in Slack."
+msgid "SlackService|Perform common operations in this project by entering slash commands in Slack."
msgstr ""
msgid "Slice multiplier"
@@ -30988,7 +31449,7 @@ msgstr ""
msgid "Some child epics may be hidden due to applied filters"
msgstr ""
-msgid "Some common domains are not allowed. %{read_more_link}."
+msgid "Some common domains are not allowed. %{learn_more_link}."
msgstr ""
msgid "Some of the designs you tried uploading did not change:"
@@ -31072,9 +31533,6 @@ msgstr ""
msgid "Something went wrong while exporting requirements"
msgstr ""
-msgid "Something went wrong while fetching %{listType} list"
-msgstr ""
-
msgid "Something went wrong while fetching branches"
msgstr ""
@@ -31129,15 +31587,9 @@ msgstr ""
msgid "Something went wrong while merging this merge request. Please try again."
msgstr ""
-msgid "Something went wrong while moving issues."
-msgstr ""
-
msgid "Something went wrong while obtaining the Let's Encrypt certificate."
msgstr ""
-msgid "Something went wrong while performing the action."
-msgstr ""
-
msgid "Something went wrong while promoting the issue to an epic. Please try again."
msgstr ""
@@ -31465,7 +31917,10 @@ msgstr ""
msgid "SourcegraphPreferences|Uses a custom %{linkStart}Sourcegraph instance%{linkEnd}."
msgstr ""
-msgid "Spam Check API Key"
+msgid "Spam Check"
+msgstr ""
+
+msgid "Spam Check API key"
msgstr ""
msgid "Spam Logs"
@@ -31483,7 +31938,7 @@ msgstr ""
msgid "Specified URL cannot be used: \"%{reason}\""
msgstr ""
-msgid "Specify an e-mail address regex pattern to identify default internal users."
+msgid "Specify an email address regex pattern to identify default internal users."
msgstr ""
msgid "Speed up your pipelines with Needs relationships"
@@ -31738,7 +32193,7 @@ msgstr ""
msgid "StatusCheck|An error occurred fetching the status checks."
msgstr ""
-msgid "StatusCheck|Apply this status check to any branch or a specific protected branch."
+msgid "StatusCheck|Apply this status check to all branches or a specific protected branch."
msgstr ""
msgid "StatusCheck|Check for a status response in Merge Requests. Failures do not block merges. %{link_start}Learn more%{link_end}."
@@ -32077,6 +32532,9 @@ msgstr ""
msgid "Subscriptions"
msgstr ""
+msgid "Subscription|Your subscription for %{strong}%{namespace_name}%{strong_close} has expired and you are now on %{pricing_link_start}the GitLab Free tier%{pricing_link_end}. Don't worry, your data is safe. Get in touch with our support team (%{support_email}). They'll gladly help with your subscription renewal."
+msgstr ""
+
msgid "Subtracted"
msgstr ""
@@ -32305,6 +32763,9 @@ msgstr ""
msgid "SuperSonics|Plan"
msgstr ""
+msgid "SuperSonics|Please agree to the Subscription Agreement"
+msgstr ""
+
msgid "SuperSonics|Ready to get started? A GitLab plan is ideal for scaling organizations and for multi team usage."
msgstr ""
@@ -32335,6 +32796,9 @@ msgstr ""
msgid "SuperSonics|The activation code is not valid. Please make sure to copy it exactly from the Customers Portal or confirmation email. Learn more about %{linkStart}activating your subscription%{linkEnd}."
msgstr ""
+msgid "SuperSonics|The activation code should be a 24-character alphanumeric string"
+msgstr ""
+
msgid "SuperSonics|There is a connectivity issue."
msgstr ""
@@ -32377,9 +32841,15 @@ msgstr ""
msgid "SuperSonics|You do not have an active subscription"
msgstr ""
+msgid "SuperSonics|You have successfully added a license that activates on %{date}. Please see the subscription history table below for more details."
+msgstr ""
+
msgid "SuperSonics|You'll be charged for %{trueUpLinkStart}users over license%{trueUpLinkEnd} on a quarterly or annual basis, depending on the terms of your agreement."
msgstr ""
+msgid "SuperSonics|Your future dated license was successfully added"
+msgstr ""
+
msgid "SuperSonics|Your subscription"
msgstr ""
@@ -32632,7 +33102,7 @@ msgstr "템플릿"
msgid "Template to append to all Service Desk issues"
msgstr ""
-msgid "TemplateRepository|Select a repository to make its templates available to all projects. %{link_start}What should the repository contain?%{link_end} "
+msgid "TemplateRepository|Create common files more quickly, and standardize their format."
msgstr ""
msgid "Templates"
@@ -32834,7 +33304,7 @@ msgstr ""
msgid "TestCases|Search test cases"
msgstr ""
-msgid "TestCases|Something went wrong while adding test case to Todo."
+msgid "TestCases|Something went wrong while adding test case to a to-do item."
msgstr ""
msgid "TestCases|Something went wrong while creating a test case."
@@ -32846,7 +33316,7 @@ msgstr ""
msgid "TestCases|Something went wrong while fetching test cases list."
msgstr ""
-msgid "TestCases|Something went wrong while marking test case todo as done."
+msgid "TestCases|Something went wrong while marking test case to-do item as done."
msgstr ""
msgid "TestCases|Something went wrong while moving test case."
@@ -32966,7 +33436,7 @@ msgstr ""
msgid "Thanks for your purchase!"
msgstr ""
-msgid "That is ok, I do not want to renew"
+msgid "That's OK, I don't want to renew"
msgstr ""
msgid "That's it, well done!"
@@ -32988,7 +33458,7 @@ msgid "The %{type} contains the following error:"
msgid_plural "The %{type} contains the following errors:"
msgstr[0] ""
-msgid "The API key used by GitLab for accessing the Spam Check service endpoint"
+msgid "The API key used by GitLab for accessing the Spam Check service endpoint."
msgstr ""
msgid "The GitLab subscription service (customers.gitlab.com) is currently experiencing an outage. You can monitor the status and get updates at %{linkStart}status.gitlab.com%{linkEnd}."
@@ -33027,9 +33497,6 @@ msgstr ""
msgid "The URL to use for connecting to Elasticsearch. Use a comma-separated list to support clustering (e.g., \"http://localhost:9200, http://localhost:9201\")."
msgstr ""
-msgid "The Vulnerability Report shows the results of the last successful pipeline run on the default branch."
-msgstr ""
-
msgid "The X509 Certificate to use when mutual TLS is required to communicate with the external authorization service. If left blank, the server certificate is still validated when accessing over HTTPS."
msgstr ""
@@ -33087,9 +33554,6 @@ msgstr ""
msgid "The default branch for this project has been changed. Please update your bookmarks."
msgstr ""
-msgid "The default expiration time for job artifacts. 0 for unlimited. The default unit is in seconds, but you can use other units, for example %{code_open}4 mins 2 sec%{code_close}, %{code_open}2h42min%{code_close}."
-msgstr ""
-
msgid "The dependency list details information about the components used within your project."
msgstr ""
@@ -33280,9 +33744,6 @@ msgstr ""
msgid "The merge conflicts for this merge request have already been resolved. Please return to the merge request."
msgstr ""
-msgid "The merge request can now be merged."
-msgstr ""
-
msgid "The metric must be one of %{metrics}."
msgstr ""
@@ -33658,7 +34119,7 @@ msgstr ""
msgid "There was a problem updating the keep latest artifacts setting."
msgstr ""
-msgid "There was an error %{message} todo."
+msgid "There was an error %{message} to-do item."
msgstr ""
msgid "There was an error adding a To Do."
@@ -33697,6 +34158,9 @@ msgstr ""
msgid "There was an error fetching projects"
msgstr ""
+msgid "There was an error fetching search autocomplete suggestions"
+msgstr ""
+
msgid "There was an error fetching stage total counts"
msgstr ""
@@ -34021,6 +34485,9 @@ msgstr ""
msgid "This field is required."
msgstr ""
+msgid "This form is disabled in preview"
+msgstr ""
+
msgid "This group"
msgstr "ì´ ê·¸ë£¹"
@@ -34042,9 +34509,6 @@ msgstr ""
msgid "This group is linked to a subscription"
msgstr ""
-msgid "This group, including all subgroups, projects and git repositories, will be reachable from only the specified IP address ranges."
-msgstr ""
-
msgid "This group, its subgroups and projects has been scheduled for removal on %{date}."
msgstr ""
@@ -34324,9 +34788,6 @@ msgstr ""
msgid "This user cannot be unlocked manually from GitLab"
msgstr ""
-msgid "This user does not have a pending request"
-msgstr ""
-
msgid "This user has an unconfirmed email address (%{email}). You may force a confirmation."
msgstr ""
@@ -34435,9 +34896,6 @@ msgstr ""
msgid "ThreatMonitoring|Packet Activity"
msgstr ""
-msgid "ThreatMonitoring|Policies"
-msgstr ""
-
msgid "ThreatMonitoring|Requests"
msgstr ""
@@ -34489,6 +34947,12 @@ msgstr ""
msgid "ThreatMonitoring|View documentation"
msgstr ""
+msgid "Threshold in bytes at which to compress Sidekiq job arguments."
+msgstr ""
+
+msgid "Threshold in bytes at which to reject Sidekiq jobs. Set this to 0 to if you don't want to limit Sidekiq jobs."
+msgstr ""
+
msgid "Throughput"
msgstr ""
@@ -34498,6 +34962,9 @@ msgstr "목요ì¼"
msgid "Time"
msgstr "시간"
+msgid "Time (in hours) that users are allowed to skip forced configuration of two-factor authentication."
+msgstr ""
+
msgid "Time Spent"
msgstr ""
@@ -34564,7 +35031,7 @@ msgstr ""
msgid "TimeTrackingEstimated|Est"
msgstr "Est"
-msgid "TimeTracking|%{startTag}Spent: %{endTag}%{timeSpentHumanReadable}"
+msgid "TimeTracking|%{spentStart}Spent: %{spentEnd}"
msgstr ""
msgid "TimeTracking|Estimated:"
@@ -34776,6 +35243,9 @@ msgstr ""
msgid "To access this domain create a new DNS record"
msgstr ""
+msgid "To add a custom suffix, set up a Service Desk email address. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "To add an SSH key you need to %{generate_link_start}generate one%{link_end} or use an %{existing_link_start}existing key%{link_end}."
msgstr ""
@@ -34797,13 +35267,16 @@ msgstr "GitHub ì €ìž¥ì†Œì— ì—°ê²°í•˜ë ¤ë©´, 먼저 GitHub 저장소 목ë¡ì„ ì
msgid "To connect an SVN repository, check out %{svn_link}."
msgstr "SVN ì €ìž¥ì†Œì— ì—°ê²°í•˜ë ¤ë©´ %{svn_link}ì„ í™•ì¸í•˜ì‹­ì‹œì˜¤."
+msgid "To continue using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
+msgstr ""
+
msgid "To continue, you need to select the link in the confirmation email we sent to verify your email address. If you didn't get our email, select %{strongStart}Resend confirmation email.%{strongEnd}"
msgstr ""
msgid "To define internal users, first enable new users set to external"
msgstr ""
-msgid "To enable Registration Features, make sure \"Enable service ping\" is checked."
+msgid "To enable Registration Features, first enable Service Ping."
msgstr ""
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
@@ -34830,8 +35303,8 @@ msgstr ""
msgid "To get started, use the link below to confirm your account."
msgstr ""
-msgid "To help improve GitLab and its user experience, GitLab will periodically collect usage information."
-msgstr "GitLabê³¼ ì‚¬ìš©ìž ê²½í—˜ì„ í–¥ìƒì‹œí‚¤ê¸° 위해 GitLabì€ ì£¼ê¸°ì ìœ¼ë¡œ 사용 정보를 수집합니다."
+msgid "To help improve GitLab and its user experience, GitLab periodically collects usage information."
+msgstr ""
msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
msgstr ""
@@ -34863,7 +35336,7 @@ msgstr ""
msgid "To preserve performance only %{strong_open}%{display_size} of %{real_size}%{strong_close} files are displayed."
msgstr ""
-msgid "To protect this issue's confidentiality, %{forkLink} and set the fork's visibility to private."
+msgid "To protect this issue's confidentiality, %{linkStart}fork this project%{linkEnd} and set the fork's visibility to private."
msgstr ""
msgid "To protect this issue's confidentiality, a private fork of this project was selected."
@@ -34896,12 +35369,15 @@ msgstr ""
msgid "To set up SAML authentication for your group through an identity provider like Azure, Okta, Onelogin, Ping Identity, or your custom SAML 2.0 provider:"
msgstr ""
-msgid "To set up this service:"
+msgid "To set up this integration:"
msgstr ""
msgid "To specify the notification level per project of a group you belong to, you need to visit project page and change notification level there."
msgstr ""
+msgid "To start using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
+msgstr ""
+
msgid "To unsubscribe from this issue, please paste the following link into your browser:"
msgstr ""
@@ -35488,9 +35964,6 @@ msgstr ""
msgid "Unable to fetch branches list, please close the form and try again"
msgstr ""
-msgid "Unable to fetch unscanned projects"
-msgstr ""
-
msgid "Unable to fetch vulnerable projects"
msgstr ""
@@ -35545,6 +36018,15 @@ msgstr ""
msgid "Unable to update this issue at this time."
msgstr ""
+msgid "Unapprove a merge request"
+msgstr ""
+
+msgid "Unapprove the current merge request."
+msgstr ""
+
+msgid "Unapproved the current merge request."
+msgstr ""
+
msgid "Unarchive project"
msgstr ""
@@ -35557,16 +36039,13 @@ msgstr ""
msgid "Unassigned"
msgstr ""
-msgid "Unauthenticated API request rate limit"
-msgstr ""
-
-msgid "Unauthenticated rate limit period in seconds"
+msgid "Unauthenticated API rate limit period in seconds"
msgstr ""
-msgid "Unauthenticated request rate limit"
+msgid "Unauthenticated requests"
msgstr ""
-msgid "Unauthenticated requests"
+msgid "Unauthenticated web rate limit period in seconds"
msgstr ""
msgid "Undo"
@@ -35668,18 +36147,6 @@ msgstr ""
msgid "Unresolved"
msgstr ""
-msgid "UnscannedProjects|15 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|30 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|5 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|60 or more days"
-msgstr ""
-
msgid "Unschedule job"
msgstr ""
@@ -35899,6 +36366,9 @@ msgstr "사용 통계"
msgid "UsageQuota|%{help_link_start}Shared runners%{help_link_end} are disabled, so there are no limits set on pipeline usage"
msgstr "%{help_link_start}공유 러너%{help_link_end}ê°€ 비활성화ë˜ì—ˆê¸° 때문ì—, 파ì´í”„ë¼ì¸ ì‚¬ìš©ì— ëŒ€í•œ ì œí•œì´ ì„¤ì •ë˜ì§€ 않았습니다."
+msgid "UsageQuota|%{linkTitle} help link"
+msgstr ""
+
msgid "UsageQuota|%{percentageLeft} of purchased storage is available"
msgstr "구매한 저장 공간 중 %{percentageLeft} 사용 가능"
@@ -35908,6 +36378,9 @@ msgstr "아티팩트"
msgid "UsageQuota|Artifacts is a sum of build and pipeline artifacts."
msgstr "아티팩트는 빌드와 파ì´í”„ë¼ì¸ ì•„í‹°íŒ©íŠ¸ì˜ í•©ê³„ìž…ë‹ˆë‹¤."
+msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
+msgstr ""
+
msgid "UsageQuota|Buy additional minutes"
msgstr "추가 시간 구매"
@@ -35917,9 +36390,21 @@ msgstr ""
msgid "UsageQuota|CI minutes usage by project"
msgstr ""
+msgid "UsageQuota|Code packages and container images."
+msgstr ""
+
msgid "UsageQuota|Current period usage"
msgstr "ì´ë²ˆ ê²°ì œ 주기 사용량"
+msgid "UsageQuota|File attachments and smaller design graphics."
+msgstr ""
+
+msgid "UsageQuota|Git repository, managed by the Gitaly service."
+msgstr ""
+
+msgid "UsageQuota|Includes project registry, artifacts, packages, wiki, uploads and other items."
+msgstr ""
+
msgid "UsageQuota|Increase storage temporarily"
msgstr "ì¼ì‹œì ìœ¼ë¡œ 저장 공간 확장"
@@ -35938,6 +36423,9 @@ msgstr ""
msgid "UsageQuota|Packages"
msgstr "패키지"
+msgid "UsageQuota|Pipeline artifacts and job artifacts, created with CI/CD."
+msgstr ""
+
msgid "UsageQuota|Pipelines"
msgstr "파ì´í”„ë¼ì¸"
@@ -35956,6 +36444,9 @@ msgstr "저장소"
msgid "UsageQuota|Seats"
msgstr ""
+msgid "UsageQuota|Shared bits of code and text."
+msgstr ""
+
msgid "UsageQuota|Snippets"
msgstr "스니펫"
@@ -35965,6 +36456,12 @@ msgstr ""
msgid "UsageQuota|Storage"
msgstr "저장 공간"
+msgid "UsageQuota|Storage type"
+msgstr ""
+
+msgid "UsageQuota|There is a known issue with Artifact storage where the total could be incorrect for some projects. More details and progress are available in %{warningLinkStart}the epic%{warningLinkEnd}."
+msgstr ""
+
msgid "UsageQuota|This is the total amount of storage used across your projects within this namespace."
msgstr "ì´ ë„¤ìž„ìŠ¤íŽ˜ì´ìŠ¤ì˜ 프로ì íŠ¸ì—ì„œ ì´ ì‚¬ìš©ì¤‘ì¸ ì €ìž¥ 공간입니다."
@@ -36004,6 +36501,9 @@ msgstr "업로드"
msgid "UsageQuota|Usage"
msgstr "사용량"
+msgid "UsageQuota|Usage Breakdown"
+msgstr ""
+
msgid "UsageQuota|Usage Quotas"
msgstr "사용량 제한"
@@ -36028,6 +36528,9 @@ msgstr ""
msgid "UsageQuota|Wiki"
msgstr "위키"
+msgid "UsageQuota|Wiki content."
+msgstr ""
+
msgid "UsageQuota|Wikis"
msgstr "위키"
@@ -36244,8 +36747,11 @@ msgstr ""
msgid "User Settings"
msgstr "ì‚¬ìš©ìž ì„¤ì •"
-msgid "User and IP Rate Limits"
-msgstr "ì‚¬ìš©ìž ë° IP ì†ë„ 제한"
+msgid "User and IP rate limits"
+msgstr ""
+
+msgid "User does not have a pending request"
+msgstr ""
msgid "User identity was successfully created."
msgstr ""
@@ -36541,6 +37047,9 @@ msgstr "사용ìžë“¤"
msgid "Users can launch a development environment from a GitLab browser tab when the %{linkStart}Gitpod%{linkEnd} integration is enabled."
msgstr ""
+msgid "Users can reactivate their account by signing in."
+msgstr ""
+
msgid "Users can render diagrams in AsciiDoc, Markdown, reStructuredText, and Textile documents using Kroki."
msgstr ""
@@ -36556,6 +37065,9 @@ msgstr ""
msgid "Users requesting access to"
msgstr ""
+msgid "Users to exclude from the rate limit"
+msgstr ""
+
msgid "Users were successfully added."
msgstr ""
@@ -36577,6 +37089,9 @@ msgstr ""
msgid "UsersSelect|Unassigned"
msgstr ""
+msgid "Uses GitLab as a lightweight alternative to Sentry."
+msgstr ""
+
msgid "Using %{code_start}::%{code_end} denotes a %{link_start}scoped label set%{link_end}"
msgstr ""
@@ -36607,10 +37122,7 @@ msgstr ""
msgid "Value Stream Analytics can help you determine your team’s velocity"
msgstr ""
-msgid "Value Stream Analytics gives an overview of how much time it takes to go from idea to production in your project."
-msgstr ""
-
-msgid "Value may contain a variable reference"
+msgid "Value might contain a variable reference"
msgstr ""
msgid "Value stream"
@@ -36676,10 +37188,10 @@ msgstr ""
msgid "ValueStream|The Default Value Stream cannot be deleted"
msgstr ""
-msgid "Variable"
+msgid "Values that contain the %{codeStart}$%{codeEnd} character can be considered a variable reference and expanded. %{docsLinkStart}Learn more.%{docsLinkEnd}"
msgstr ""
-msgid "Variable references indicated by %{codeStart}$%{codeEnd} may be expanded. If this is not what you want, consider %{docsLinkStart}using a workaround to prevent expansion%{docsLinkEnd}."
+msgid "Variable"
msgstr ""
msgid "Variable will be masked in job logs."
@@ -37081,6 +37593,9 @@ msgstr ""
msgid "Vulnerability|Evidence"
msgstr ""
+msgid "Vulnerability|False positive detected"
+msgstr ""
+
msgid "Vulnerability|File"
msgstr ""
@@ -37123,6 +37638,9 @@ msgstr ""
msgid "Vulnerability|Status"
msgstr ""
+msgid "Vulnerability|The scanner determined this vulnerability to be a false positive. Verify the evaluation before changing its status. %{linkStart}Learn more about false positive detection.%{linkEnd}"
+msgstr ""
+
msgid "Vulnerability|The unmodified response is the original response that had no mutations done to the request"
msgstr ""
@@ -37447,9 +37965,6 @@ msgstr ""
msgid "Welcome to GitLab,%{br_tag}%{name}!"
msgstr ""
-msgid "Welcome to the guided GitLab tour"
-msgstr ""
-
msgid "Welcome, %{name}!"
msgstr ""
@@ -37468,9 +37983,6 @@ msgstr ""
msgid "What are you searching for?"
msgstr ""
-msgid "What describes you best?"
-msgstr ""
-
msgid "What does this command do?"
msgstr ""
@@ -37492,13 +38004,13 @@ msgstr ""
msgid "What is your job title? (optional)"
msgstr ""
-msgid "What will you use this group for?"
+msgid "What templates can I create?"
msgstr ""
-msgid "What's new"
+msgid "What will you use this group for?"
msgstr ""
-msgid "What’s your experience level?"
+msgid "What's new"
msgstr ""
msgid "When a deployment job is successful, skip older deployment jobs that are still pending."
@@ -37510,6 +38022,9 @@ msgstr "Runnerê°€ 잠겨 있으면 다른 프로ì íŠ¸ì— 할당 í•  수 없습ë
msgid "When an event in GitLab triggers a webhook, you can use the request details to figure out if something went wrong."
msgstr ""
+msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+msgstr ""
+
msgid "When inactive, an external authentication provider must be used."
msgstr ""
@@ -37532,6 +38047,9 @@ msgstr ""
msgid "When:"
msgstr ""
+msgid "Which API requests are affected?"
+msgstr ""
+
msgid "While it's rare to have no vulnerabilities, it can happen. In any event, we ask that you please double check your settings to make sure you've set up your dashboard correctly."
msgstr ""
@@ -37811,6 +38329,9 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|Work Items"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -37886,6 +38407,9 @@ msgstr ""
msgid "You are already a member of this %{member_source}."
msgstr ""
+msgid "You are already impersonating another user"
+msgstr ""
+
msgid "You are an admin, which means granting access to %{client_name} will allow them to interact with GitLab as an admin as well. Proceed with caution."
msgstr ""
@@ -37988,6 +38512,9 @@ msgstr ""
msgid "You can also use project access tokens with Git to authenticate over HTTP(S). %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "You can always change your URL later"
+msgstr ""
+
msgid "You can always edit this later"
msgstr ""
@@ -38144,10 +38671,10 @@ msgstr "ì½ê¸° ì „ìš© GitLab ì¸ìŠ¤í„´ìŠ¤ì—는 쓰기가 불가능합니다."
msgid "You can’t %{tag_start}edit%{tag_end} files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
-msgid "You could not create a new trigger."
+msgid "You can’t edit files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
-msgid "You didn't renew your subscription for %{strong}%{namespace_name}%{strong_close} so it was downgraded to the free plan."
+msgid "You could not create a new trigger."
msgstr ""
msgid "You do not have any subscriptions yet"
@@ -38315,6 +38842,12 @@ msgstr "정확한 현재 비밀번호를 제공해야 합니다."
msgid "You must provide your current password in order to change it."
msgstr "비밀번호를 변경하기 위해서 현재 비밀번호를 제공해야 합니다."
+msgid "You must sign in to search for specific projects."
+msgstr ""
+
+msgid "You must sign in to search for specific terms."
+msgstr ""
+
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
@@ -38342,6 +38875,9 @@ msgstr ""
msgid "You need to upload a GitLab project export archive (ending in .gz)."
msgstr ""
+msgid "You need to verify your primary email first before enabling Two-Factor Authentication."
+msgstr ""
+
msgid "You successfully declined the invitation"
msgstr ""
@@ -38450,10 +38986,10 @@ msgstr ""
msgid "Your %{host} account was signed in to from a new location"
msgstr ""
-msgid "Your %{strong}%{plan_name}%{strong_close} subscription for %{strong}%{namespace_name}%{strong_close} will expire on %{strong}%{expires_on}%{strong_close}."
+msgid "Your %{strong}%{plan_name}%{strong_close} subscription expires on %{strong}%{expires_on}%{strong_close}. After that date, you cannot create issues or merge requests, or use many other features."
msgstr ""
-msgid "Your %{strong}%{plan_name}%{strong_close} subscription will expire on %{strong}%{expires_on}%{strong_close}. After that, you will not be able to create issues or merge requests as well as many other features."
+msgid "Your %{strong}%{plan_name}%{strong_close} subscription for %{strong}%{namespace_name}%{strong_close} will expire on %{strong}%{expires_on}%{strong_close}."
msgstr ""
msgid "Your CI/CD configuration syntax is invalid. View Lint tab for more details."
@@ -38477,7 +39013,7 @@ msgstr ""
msgid "Your GPG keys (%{count})"
msgstr ""
-msgid "Your GitLab account has been locked due to an excessive amount of unsuccessful sign in attempts. Your account will automatically unlock in %{duration} or you may click the link below to unlock now."
+msgid "Your GitLab account has been locked due to an excessive number of unsuccessful sign in attempts. You can wait for your account to automatically unlock in %{duration} or you can click the link below to unlock now."
msgstr ""
msgid "Your GitLab account request has been approved!"
@@ -38588,6 +39124,9 @@ msgstr ""
msgid "Your commit email is used for web based operations, such as edits and merges."
msgstr ""
+msgid "Your current password is required to register a two-factor authenticator app."
+msgstr ""
+
msgid "Your dashboard has been copied. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
@@ -38687,6 +39226,9 @@ msgstr ""
msgid "Your project limit is %{limit} projects! Please contact your administrator to increase it"
msgstr ""
+msgid "Your project will be created at:"
+msgstr ""
+
msgid "Your projects"
msgstr "ë‚´ 프로ì íŠ¸"
@@ -38726,11 +39268,9 @@ msgstr ""
msgid "Your subscription expired!"
msgstr ""
-msgid "Your subscription has been downgraded."
-msgstr ""
-
-msgid "Your subscription will expire in %{remaining_days}."
-msgstr ""
+msgid "Your subscription will expire in %{remaining_days} day."
+msgid_plural "Your subscription will expire in %{remaining_days} days."
+msgstr[0] ""
msgid "Your username is %{username}."
msgstr ""
@@ -38935,6 +39475,9 @@ msgstr ""
msgid "cannot merge"
msgstr ""
+msgid "cannot not be used for user namespace"
+msgstr ""
+
msgid "ciReport|%{degradedNum} degraded"
msgstr ""
@@ -39257,6 +39800,9 @@ msgstr ""
msgid "created %{timeAgo}"
msgstr ""
+msgid "created %{timeAgo} by %{author}"
+msgstr ""
+
msgid "created by"
msgstr ""
@@ -39300,9 +39846,6 @@ msgstr ""
msgid "does not have a supported extension. Only %{extension_list} are supported"
msgstr ""
-msgid "domain is not authorized for sign-up."
-msgstr ""
-
msgid "download it"
msgstr ""
@@ -39319,17 +39862,13 @@ msgstr ""
msgid "email '%{email}' is not a verified email."
msgstr ""
-msgid "email does not match the allowed domain of %{email_domains}"
-msgid_plural "email does not match the allowed domains: %{email_domains}"
-msgstr[0] ""
-
msgid "enabled"
msgstr "사용"
msgid "encrypted: needs to be a :required, :optional or :migrating!"
msgstr ""
-msgid "ending with MIME type format is not allowed."
+msgid "ending with a reserved file extension is not allowed."
msgstr ""
msgid "entries cannot be larger than 255 characters"
@@ -39353,6 +39892,9 @@ msgstr ""
msgid "estimateCommand|%{slash_command} overwrites the total estimated time."
msgstr ""
+msgid "example.com"
+msgstr ""
+
msgid "exceeds the limit of %{bytes} bytes"
msgstr ""
@@ -39402,9 +39944,6 @@ msgstr "ì´ í”„ë¡œì íŠ¸ì— 대해"
msgid "fork"
msgstr ""
-msgid "fork this project"
-msgstr ""
-
msgid "from"
msgstr ""
@@ -39412,6 +39951,9 @@ msgid "from %d job"
msgid_plural "from %d jobs"
msgstr[0] ""
+msgid "frontmatter"
+msgstr ""
+
msgid "group"
msgstr ""
@@ -39439,6 +39981,9 @@ msgstr ""
msgid "has been completed."
msgstr ""
+msgid "has too deep level of nesting"
+msgstr ""
+
msgid "help"
msgstr ""
@@ -39472,9 +40017,21 @@ msgstr ""
msgid "in"
msgstr ""
+msgid "in Infrastructure :: Kubernetes clusters"
+msgstr ""
+
+msgid "in all GitLab"
+msgstr ""
+
+msgid "in group"
+msgstr ""
+
msgid "in group %{link_to_group}"
msgstr ""
+msgid "in project"
+msgstr ""
+
msgid "in project %{link_to_project}"
msgstr ""
@@ -39515,16 +40072,19 @@ msgstr ""
msgid "is not a valid X509 certificate."
msgstr "올바른 X509 ì¸ì¦ì„œê°€ 아닙니다."
-msgid "is not allowed since the group is not top-level group."
+msgid "is not allowed for sign-up."
msgstr ""
-msgid "is not allowed. Try again with a different email address, or contact your GitLab admin."
+msgid "is not allowed for this group."
msgstr ""
-msgid "is not allowed. We do not currently support project-level iterations"
+msgid "is not allowed for this project."
+msgstr ""
+
+msgid "is not allowed since the group is not top-level group."
msgstr ""
-msgid "is not from an allowed domain."
+msgid "is not allowed. We do not currently support project-level iterations"
msgstr ""
msgid "is not in the group enforcing Group Managed Account"
@@ -39617,6 +40177,9 @@ msgstr ""
msgid "log in"
msgstr ""
+msgid "managed"
+msgstr ""
+
msgid "manual"
msgstr ""
@@ -39663,6 +40226,9 @@ msgstr ""
msgid "mrWidget| Please restore it or use a different %{missingBranchName} branch"
msgstr "브랜치를 ë³µì›í•˜ê±°ë‚˜ 다른 %{missingBranchName} 브랜치를 사용해주세요."
+msgid "mrWidget|%{linkStart}Set up now%{linkEnd} to analyze your source code for known security vulnerabilities."
+msgstr ""
+
msgid "mrWidget|%{mergeError}."
msgstr ""
@@ -39742,6 +40308,9 @@ msgid "mrWidget|Closes issue"
msgid_plural "mrWidget|Closes issues"
msgstr[0] ""
+msgid "mrWidget|Create issue to resolve all threads"
+msgstr ""
+
msgid "mrWidget|Delete source branch"
msgstr ""
@@ -39751,12 +40320,18 @@ msgstr "ë°°í¬ í†µê³„ëŠ” ì•„ì§ ì‚¬ìš©í•  수 없습니다."
msgid "mrWidget|Did not close"
msgstr "닫히지 ì•ŠìŒ"
+msgid "mrWidget|Dismiss"
+msgstr ""
+
msgid "mrWidget|Email patches"
msgstr "ì´ë©”ì¼ íŒ¨ì¹˜"
msgid "mrWidget|Failed to load deployment statistics"
msgstr "ë°°í¬ í†µê³„ë¥¼ ë¡œë“œí•˜ëŠ”ë° ì‹¤íŒ¨í•˜ì˜€ìŠµë‹ˆë‹¤."
+msgid "mrWidget|Hide %{widget} details"
+msgstr ""
+
msgid "mrWidget|If the %{missingBranchName} branch exists in your local repository, you can merge this merge request manually using the command line"
msgstr "만약 %{missingBranchName} 브랜치가 ë‹¹ì‹ ì˜ ë¡œì»¬ ì €ìž¥ì†Œì— ì¡´ìž¬í•œë‹¤ë©´, ëª…ë ¹ì¤„ì„ ì‚¬ìš©í•˜ì—¬ 수ë™ìœ¼ë¡œ 머지할 수 있습니다."
@@ -39851,9 +40426,6 @@ msgstr ""
msgid "mrWidget|Request to merge"
msgstr "머지 리퀘스트(MR)"
-msgid "mrWidget|Resolve all threads in new issue"
-msgstr ""
-
msgid "mrWidget|Resolve conflicts"
msgstr "ì¶©ëŒ í•´ê²°"
@@ -39869,6 +40441,9 @@ msgstr "새로운 머지 리퀘스트(MR)ì—ì„œ ì´ ë¨¸ì§€ 리퀘스트(MR)ë¡œ ë
msgid "mrWidget|Revoke approval"
msgstr ""
+msgid "mrWidget|SAST and Secret Detection is not enabled."
+msgstr ""
+
msgid "mrWidget|Set by %{merge_author} to be added to the merge train when the pipeline succeeds"
msgstr ""
@@ -39878,6 +40453,9 @@ msgstr ""
msgid "mrWidget|Set by %{merge_author} to start a merge train when the pipeline succeeds"
msgstr ""
+msgid "mrWidget|Show %{widget} details"
+msgstr ""
+
msgid "mrWidget|The changes were merged into"
msgstr "변경 ì‚¬í•­ì´ ë¨¸ì§€ë˜ì—ˆìŠµë‹ˆë‹¤."
@@ -39890,6 +40468,9 @@ msgstr "변경 ì‚¬í•­ì´ ë¨¸ì§€ë  ê²ƒ 입니다."
msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure, or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
msgstr ""
+msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure."
+msgstr ""
+
msgid "mrWidget|The source branch has been deleted"
msgstr ""
@@ -39932,6 +40513,9 @@ msgstr ""
msgid "mrWidget|You can merge after removing denied licenses"
msgstr ""
+msgid "mrWidget|You can only merge once this merge request is approved."
+msgstr ""
+
msgid "mrWidget|Your password"
msgstr ""
@@ -39968,6 +40552,9 @@ msgstr ""
msgid "must be less than the limit of %{tag_limit} tags"
msgstr ""
+msgid "must be set for a project namespace"
+msgstr ""
+
msgid "must be unique by status and elapsed time within a policy"
msgstr ""
@@ -40075,6 +40662,9 @@ msgstr ""
msgid "pipeline"
msgstr ""
+msgid "pipeline schedules documentation"
+msgstr ""
+
msgid "pod_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
msgstr ""
@@ -40122,16 +40712,25 @@ msgstr ""
msgid "project name"
msgstr ""
+msgid "project namespace cannot be the parent of another namespace"
+msgstr ""
+
msgid "projects"
msgstr ""
msgid "quick actions"
msgstr ""
-msgid "reCAPTCHA Private Key"
+msgid "reCAPTCHA"
+msgstr ""
+
+msgid "reCAPTCHA helps prevent credential stuffing."
msgstr ""
-msgid "reCAPTCHA Site Key"
+msgid "reCAPTCHA private key"
+msgstr ""
+
+msgid "reCAPTCHA site key"
msgstr ""
msgid "recent activity"
@@ -40357,6 +40956,9 @@ msgstr ""
msgid "user avatar"
msgstr "ì‚¬ìš©ìž ì•„ë°”íƒ€"
+msgid "user namespace cannot be the parent of another namespace"
+msgstr ""
+
msgid "user preferences"
msgstr "ì‚¬ìš©ìž ì„¤ì •"
@@ -40448,3 +41050,9 @@ msgstr ""
msgid "your settings"
msgstr ""
+msgid "{group}"
+msgstr ""
+
+msgid "{project}"
+msgstr ""
+
diff --git a/locale/ku_TR/gitlab.po b/locale/ku_TR/gitlab.po
index 95e5f8119d0..97d6d47753c 100644
--- a/locale/ku_TR/gitlab.po
+++ b/locale/ku_TR/gitlab.po
@@ -14,10 +14,7 @@ msgstr ""
"X-Crowdin-Language: ku\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-09-01 22:33\n"
-
-msgid " %{name}, confirm your email address now! "
-msgstr ""
+"PO-Revision-Date: 2021-10-04 20:21\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -92,6 +89,16 @@ msgstr ""
msgid "#general, #development"
msgstr ""
+msgid "%d Alert"
+msgid_plural "%d Alerts"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d Alert:"
+msgid_plural "%d Alerts:"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d Approval"
msgid_plural "%d Approvals"
msgstr[0] ""
@@ -455,7 +462,10 @@ msgstr ""
msgid "%{code_open}Protected:%{code_close} Only exposed to protected branches or tags."
msgstr ""
-msgid "%{commit_author_link} authored %{commit_timeago}"
+msgid "%{commit_author_link} authored %{commit_authored_timeago}"
+msgstr ""
+
+msgid "%{commit_author_link} authored %{commit_authored_timeago} and %{commit_committer_avatar} %{commit_committer_link} committed %{commit_committer_timeago}"
msgstr ""
msgid "%{completedCount} completed weight"
@@ -549,6 +559,15 @@ msgstr ""
msgid "%{doc_link_start}Advanced search%{doc_link_end} is enabled."
msgstr ""
+msgid "%{docs_link_start}Learn about visibility levels.%{docs_link_end}"
+msgstr ""
+
+msgid "%{docs_link_start}What is Large File Storage?%{docs_link_end}"
+msgstr ""
+
+msgid "%{docs_link_start}What is two-factor authentication?%{docs_link_end}"
+msgstr ""
+
msgid "%{due_date} (Past due)"
msgstr ""
@@ -621,9 +640,6 @@ msgstr ""
msgid "%{issueType} actions"
msgstr ""
-msgid "%{issuesCount} issues with a limit of %{maxIssueCount}"
-msgstr ""
-
msgid "%{issuesSize} with a limit of %{maxIssueCount}"
msgstr ""
@@ -681,6 +697,12 @@ msgstr ""
msgid "%{label_for_message} unavailable"
msgstr ""
+msgid "%{learn_more_link}."
+msgstr ""
+
+msgid "%{lessThan} 1 hour"
+msgstr ""
+
msgid "%{lets_encrypt_link_start}Let's Encrypt%{lets_encrypt_link_end} is a free, automated, and open certificate authority (CA) that issues digital certificates to enable HTTPS (SSL/TLS) for sites."
msgstr ""
@@ -693,15 +715,15 @@ msgstr ""
msgid "%{link_start}Learn more%{link_end} about roles."
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
-msgstr ""
-
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
msgstr ""
msgid "%{link_start}Start the title with %{draft_snippet}%{link_end} to prevent a merge request that is a work in progress from being merged before it's ready."
msgstr ""
+msgid "%{link_start}What information does GitLab Inc. collect?%{link_end}"
+msgstr ""
+
msgid "%{listToShow}, and %{awardsListLength} more"
msgstr ""
@@ -854,7 +876,7 @@ msgid_plural "%{securityScanner} results are not available because a pipeline ha
msgstr[0] ""
msgstr[1] ""
-msgid "%{service_ping_link_start}Learn more%{service_ping_link_end} about what information is shared with GitLab Inc."
+msgid "%{service_ping_link_start}What information is shared with GitLab Inc.?%{service_ping_link_end}"
msgstr ""
msgid "%{size} %{unit}"
@@ -890,6 +912,9 @@ msgstr ""
msgid "%{state} epics"
msgstr ""
+msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
+msgstr ""
+
msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
msgstr ""
@@ -949,11 +974,6 @@ msgstr ""
msgid "%{template_project_id} is unknown or invalid"
msgstr ""
-msgid "%{text} %{files}"
-msgid_plural "%{text} %{files} files"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%{text} is available"
msgstr ""
@@ -1038,9 +1058,6 @@ msgstr ""
msgid "%{wildcards_link_start}Wildcards%{wildcards_link_end} such as %{code_tag_start}v*%{code_tag_end} or %{code_tag_start}*-release%{code_tag_end} are supported."
msgstr ""
-msgid "&lt; 1 hour"
-msgstr ""
-
msgid "'%{data}' at %{location} does not match format: %{format}"
msgstr ""
@@ -1124,9 +1141,6 @@ msgstr ""
msgid "(we need your current password to confirm your changes)"
msgstr ""
-msgid "* * * * *"
-msgstr ""
-
msgid "+ %{amount} more"
msgstr ""
@@ -1193,10 +1207,10 @@ msgstr ""
msgid "."
msgstr ""
-msgid "0 bytes"
+msgid "/"
msgstr ""
-msgid "0 for unlimited, only effective with remote storage enabled."
+msgid "0 bytes"
msgstr ""
msgid "0t1DgySidms"
@@ -1326,6 +1340,9 @@ msgstr ""
msgid "1000+"
msgstr ""
+msgid "192.168.0.0/24"
+msgstr ""
+
msgid "1st contribution!"
msgstr ""
@@ -1479,9 +1496,6 @@ msgstr ""
msgid "A plain HTML site that uses Netlify for CI/CD instead of GitLab, but still with all the other great GitLab features"
msgstr ""
-msgid "A plain-text response to show to clients that hit the rate limit."
-msgstr ""
-
msgid "A platform value can be web, mob or app."
msgstr ""
@@ -1563,7 +1577,7 @@ msgstr ""
msgid "APIFuzzing|Configure HTTP basic authentication values. Other authentication methods are supported. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
+msgid "APIFuzzing|Customize your project's API fuzzing configuration options and copy the code snippet to your .gitlab-ci.yml file to apply any changes. Note that this tool does not reflect or update your .gitlab-ci.yml file automatically. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
msgstr ""
msgid "APIFuzzing|Enable authentication"
@@ -1626,9 +1640,6 @@ msgstr ""
msgid "APIFuzzing|To prevent a security leak, authentication info must be added as a %{ciVariablesLinkStart}CI variable%{ciVariablesLinkEnd}. As a user with maintainer access rights, you can manage CI variables in the %{ciSettingsLinkStart}Settings%{ciSettingsLinkEnd} area."
msgstr ""
-msgid "APIFuzzing|Use this tool to generate API fuzzing configuration YAML to copy into your .gitlab-ci.yml file. This tool does not reflect or update your .gitlab-ci.yml file automatically."
-msgstr ""
-
msgid "APIFuzzing|Username for basic authentication"
msgstr ""
@@ -1680,9 +1691,6 @@ msgstr ""
msgid "Abuse reports notification email"
msgstr ""
-msgid "Abuse reports will be sent to this address if it is set. Abuse reports are always available in the admin area."
-msgstr ""
-
msgid "Accept invitation"
msgstr ""
@@ -1719,12 +1727,18 @@ msgstr ""
msgid "Access granted"
msgstr ""
+msgid "Access key ID"
+msgstr ""
+
msgid "Access requests"
msgstr ""
msgid "Access to '%{classification_label}' not allowed"
msgstr ""
+msgid "Access tokens expire after 2 hours. A refresh token may be used at any time to generate a new access token. Non-expiring access tokens are deprecated. Clear this setting to enable backward compatibility."
+msgstr ""
+
msgid "AccessDropdown|Deploy Keys"
msgstr ""
@@ -2037,6 +2051,9 @@ msgstr ""
msgid "Add new directory"
msgstr ""
+msgid "Add new service account"
+msgstr ""
+
msgid "Add or remove previously merged commits"
msgstr ""
@@ -2274,6 +2291,9 @@ msgstr ""
msgid "AdminArea|Features"
msgstr ""
+msgid "AdminArea|Get security updates from GitLab and stay up to date"
+msgstr ""
+
msgid "AdminArea|Groups"
msgstr ""
@@ -2313,6 +2333,12 @@ msgstr ""
msgid "AdminArea|Reporter"
msgstr ""
+msgid "AdminArea|Sign up for the GitLab Security Newsletter to get notified for security updates."
+msgstr ""
+
+msgid "AdminArea|Sign up for the GitLab newsletter"
+msgstr ""
+
msgid "AdminArea|Stop all jobs"
msgstr ""
@@ -2382,9 +2408,15 @@ msgstr ""
msgid "AdminSettings|Disable public access to Pages sites"
msgstr ""
+msgid "AdminSettings|Display a banner on merge requests in projects with no pipelines to initiate steps to add a .gitlab-ci.yml file."
+msgstr ""
+
msgid "AdminSettings|Domain verification is an essential security measure for public GitLab sites. Users are required to demonstrate they control a domain before it is enabled. %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "AdminSettings|Enable pipeline suggestion banner"
+msgstr ""
+
msgid "AdminSettings|Enable shared runners for new projects"
msgstr ""
@@ -2856,10 +2888,10 @@ msgstr ""
msgid "Admin|Quarterly reconciliation will occur on %{qrtlyDate}"
msgstr ""
-msgid "Admin|The number of max seats used for your namespace is currently exceeding the number of seats in your subscription. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgid "Admin|The number of max seats in your namespace exceeds the number of seats in your subscription. On %{qrtlyDate}, quarterly reconciliation occurs and you are automatically billed a prorated amount for the overage. No action is needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice. For more information about the timing of the invoicing process, view the documentation."
msgstr ""
-msgid "Admin|The number of maximum users for your instance is currently exceeding the number of users in license. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgid "Admin|The number of max users in your instance exceeds the number of users in your license. On %{qrtlyDate}, quarterly reconciliation occurs and you are automatically billed a prorated amount for the overage. No action is needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice. For more information about the timing of the invoicing process, view the documentation."
msgstr ""
msgid "Admin|View pending user approvals"
@@ -2880,9 +2912,6 @@ msgstr ""
msgid "Advanced export options"
msgstr ""
-msgid "Advanced permissions, Large File Storage and Two-Factor authentication settings."
-msgstr ""
-
msgid "After a successful password update you will be redirected to login screen."
msgstr ""
@@ -2901,13 +2930,14 @@ msgstr ""
msgid "After you've reviewed these contribution guidelines, you'll be all set to"
msgstr ""
+msgid "Akismet"
+msgstr ""
+
msgid "Akismet API Key"
msgstr ""
-msgid "Alert"
-msgid_plural "Alerts"
-msgstr[0] ""
-msgstr[1] ""
+msgid "Akismet helps prevent the creation of spam issues in public projects."
+msgstr ""
msgid "AlertManagement|Acknowledged"
msgstr ""
@@ -3263,6 +3293,9 @@ msgstr ""
msgid "All (default)"
msgstr ""
+msgid "All GitLab"
+msgstr ""
+
msgid "All Members"
msgstr ""
@@ -3377,6 +3410,9 @@ msgstr ""
msgid "Allow this secondary node to replicate content on Object Storage"
msgstr ""
+msgid "Allow use of licensed EE features"
+msgstr ""
+
msgid "Allow users to dismiss the broadcast message"
msgstr ""
@@ -3452,9 +3488,6 @@ msgstr ""
msgid "Amazon authentication is not %{link_start}correctly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
-msgid "Amount of time (in hours) that users are allowed to skip forced configuration of two-factor authentication"
-msgstr ""
-
msgid "An %{link_start}alert%{link_end} with the same fingerprint is already open. To change the status of this alert, resolve the linked alert."
msgstr ""
@@ -3515,12 +3548,6 @@ msgstr ""
msgid "An error occurred when removing the label."
msgstr ""
-msgid "An error occurred when toggling the notification subscription"
-msgstr ""
-
-msgid "An error occurred when updating the issue weight"
-msgstr ""
-
msgid "An error occurred when updating the title"
msgstr ""
@@ -3569,6 +3596,9 @@ msgstr ""
msgid "An error occurred while enabling Service Desk."
msgstr ""
+msgid "An error occurred while fetching Markdown preview"
+msgstr ""
+
msgid "An error occurred while fetching ancestors"
msgstr ""
@@ -3599,9 +3629,6 @@ msgstr ""
msgid "An error occurred while fetching label colors."
msgstr ""
-msgid "An error occurred while fetching markdown preview"
-msgstr ""
-
msgid "An error occurred while fetching participants"
msgstr ""
@@ -3617,9 +3644,6 @@ msgstr ""
msgid "An error occurred while fetching reference"
msgstr ""
-msgid "An error occurred while fetching sidebar data"
-msgstr ""
-
msgid "An error occurred while fetching tags. Retry the search."
msgstr ""
@@ -3695,6 +3719,9 @@ msgstr ""
msgid "An error occurred while loading merge requests."
msgstr ""
+msgid "An error occurred while loading projects."
+msgstr ""
+
msgid "An error occurred while loading the Needs tab."
msgstr ""
@@ -3929,12 +3956,6 @@ msgstr ""
msgid "Any Milestone"
msgstr ""
-msgid "Any branch"
-msgstr ""
-
-msgid "Any eligible user"
-msgstr ""
-
msgid "Any encrypted tokens"
msgstr ""
@@ -3953,6 +3974,9 @@ msgstr ""
msgid "Any namespace"
msgstr ""
+msgid "App Engine description and apps that are suitable for this deployment target"
+msgstr ""
+
msgid "App ID"
msgstr ""
@@ -4101,6 +4125,11 @@ msgstr ""
msgid "Apply"
msgstr ""
+msgid "Apply %d suggestion"
+msgid_plural "Apply %d suggestions"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Apply a label"
msgstr ""
@@ -4110,13 +4139,10 @@ msgstr ""
msgid "Apply suggestion"
msgstr ""
-msgid "Apply suggestions"
-msgstr ""
-
msgid "Apply template"
msgstr ""
-msgid "Apply this approval rule to any branch or a specific protected branch."
+msgid "Apply this approval rule to all branches or a specific protected branch."
msgstr ""
msgid "Applying"
@@ -4259,9 +4285,6 @@ msgstr ""
msgid "ApprovalSettings|Prevent editing approval rules in projects and merge requests."
msgstr ""
-msgid "ApprovalSettings|Prevent editing approval rules in projects and merge requests. "
-msgstr ""
-
msgid "ApprovalSettings|Remove all approvals when commits are added to the source branch."
msgstr ""
@@ -4277,6 +4300,9 @@ msgstr ""
msgid "ApprovalSettings|This setting is configured at the instance level and can only be changed by an administrator."
msgstr ""
+msgid "ApprovalSettings|This setting is configured in %{groupName} and can only be changed by an administrator or group owner."
+msgstr ""
+
msgid "ApprovalStatusTooltip|Adheres to separation of duties"
msgstr ""
@@ -4763,9 +4789,6 @@ msgstr ""
msgid "Authenticated API rate limit period in seconds"
msgstr ""
-msgid "Authenticated API request rate limit"
-msgstr ""
-
msgid "Authenticated API requests"
msgstr ""
@@ -4775,10 +4798,10 @@ msgstr ""
msgid "Authenticated Git LFS request rate limit"
msgstr ""
-msgid "Authenticated web rate limit period in seconds"
+msgid "Authenticated Git LFS requests"
msgstr ""
-msgid "Authenticated web request rate limit"
+msgid "Authenticated web rate limit period in seconds"
msgstr ""
msgid "Authenticated web requests"
@@ -5156,9 +5179,6 @@ msgstr ""
msgid "Below you will find all the groups that are public."
msgstr ""
-msgid "Beta"
-msgstr ""
-
msgid "Bi-weekly code coverage"
msgstr ""
@@ -5398,6 +5418,21 @@ msgstr ""
msgid "Board scope affects which issues are displayed for anyone who visits this board"
msgstr ""
+msgid "BoardNewEpic|Groups"
+msgstr ""
+
+msgid "BoardNewEpic|Loading groups"
+msgstr ""
+
+msgid "BoardNewEpic|No matching results"
+msgstr ""
+
+msgid "BoardNewEpic|Search groups"
+msgstr ""
+
+msgid "BoardNewEpic|Select a group"
+msgstr ""
+
msgid "BoardNewIssue|No matching results"
msgstr ""
@@ -5475,6 +5510,9 @@ msgstr ""
msgid "Boards|An error occurred while creating the list. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching child groups. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching group projects. Please try again."
msgstr ""
@@ -5807,6 +5845,9 @@ msgstr ""
msgid "Bulk update"
msgstr ""
+msgid "BulkImports|Re-import creates a new group. It does not sync with the existing group."
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -5816,6 +5857,9 @@ msgstr ""
msgid "BulkImport|From source group"
msgstr ""
+msgid "BulkImport|Group import history"
+msgstr ""
+
msgid "BulkImport|Import failed: Destination cannot be a subgroup of the source group. Change the destination and try again."
msgstr ""
@@ -5828,9 +5872,18 @@ msgstr ""
msgid "BulkImport|Importing the group failed"
msgstr ""
+msgid "BulkImport|Last imported to %{link}"
+msgstr ""
+
msgid "BulkImport|Name already exists."
msgstr ""
+msgid "BulkImport|New group"
+msgstr ""
+
+msgid "BulkImport|No history is available"
+msgstr ""
+
msgid "BulkImport|No parent"
msgstr ""
@@ -5843,6 +5896,9 @@ msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} matching filter \"%{filter}\" from %{link}"
msgstr ""
+msgid "BulkImport|Source group"
+msgstr ""
+
msgid "BulkImport|To new group"
msgstr ""
@@ -5852,6 +5908,9 @@ msgstr ""
msgid "BulkImport|You have no groups to import"
msgstr ""
+msgid "BulkImport|Your imported groups will appear here."
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -6094,6 +6153,9 @@ msgstr ""
msgid "Can be manually deployed to"
msgstr ""
+msgid "Can be overridden in each project."
+msgstr ""
+
msgid "Can create groups:"
msgstr ""
@@ -6196,6 +6258,9 @@ msgstr ""
msgid "Cancelling Preview"
msgstr ""
+msgid "Cannot assign a confidential epic to a non-confidential issue. Make the issue confidential and try again"
+msgstr ""
+
msgid "Cannot be assigned to other projects."
msgstr ""
@@ -6247,9 +6312,6 @@ msgstr ""
msgid "Cannot refer to a group %{timebox_type} by an internal id!"
msgstr ""
-msgid "Cannot set confidential epic for a non-confidential issue"
-msgstr ""
-
msgid "Cannot show preview. For previews on sketch files, they must have the file format introduced by Sketch version 43 and above."
msgstr ""
@@ -6487,15 +6549,15 @@ msgstr ""
msgid "Check out, review, and merge locally"
msgstr ""
-msgid "Check the %{docs_link_start}documentation%{docs_link_end}."
-msgstr ""
-
msgid "Check the current instance configuration "
msgstr ""
msgid "Check the elasticsearch.log file to debug why the migration was halted and make any changes before retrying the migration. When you fix the cause of the failure, click \"Retry migration\", and the migration will be scheduled to be retried in the background."
msgstr ""
+msgid "Check with your administrator."
+msgstr ""
+
msgid "Check your Docker images for known vulnerabilities."
msgstr ""
@@ -6526,6 +6588,9 @@ msgstr ""
msgid "Checkout"
msgstr ""
+msgid "Checkout|$%{selectedPlanPrice} per 10 GB storage per pack"
+msgstr ""
+
msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 minutes"
msgstr ""
@@ -6546,17 +6611,23 @@ msgstr ""
msgid "Checkout|%{name}'s GitLab subscription"
msgstr ""
-msgid "Checkout|%{selectedPlanText} plan"
+msgid "Checkout|%{name}'s storage subscription"
msgstr ""
-msgid "Checkout|%{startDate} - %{endDate}"
+msgid "Checkout|%{quantity} GB of storage"
msgstr ""
-msgid "Checkout|%{totalCiMinutes} CI minute"
-msgid_plural "Checkout|%{totalCiMinutes} CI minutes"
+msgid "Checkout|%{quantity} storage pack"
+msgid_plural "Checkout|%{quantity} storage packs"
msgstr[0] ""
msgstr[1] ""
+msgid "Checkout|%{selectedPlanText} plan"
+msgstr ""
+
+msgid "Checkout|%{startDate} - %{endDate}"
+msgstr ""
+
msgid "Checkout|%{totalCiMinutes} CI minutes"
msgstr ""
@@ -6632,6 +6703,9 @@ msgstr ""
msgid "Checkout|Failed to register credit card. Please try again."
msgstr ""
+msgid "Checkout|GB"
+msgstr ""
+
msgid "Checkout|GitLab group"
msgstr ""
@@ -6668,6 +6742,9 @@ msgstr ""
msgid "Checkout|State"
msgstr ""
+msgid "Checkout|Storage packs"
+msgstr ""
+
msgid "Checkout|Street address"
msgstr ""
@@ -6689,6 +6766,9 @@ msgstr ""
msgid "Checkout|Total minutes: %{quantity}"
msgstr ""
+msgid "Checkout|Total storage: %{quantity} GB"
+msgstr ""
+
msgid "Checkout|Users"
msgstr ""
@@ -6698,16 +6778,25 @@ msgstr ""
msgid "Checkout|Your organization"
msgstr ""
+msgid "Checkout|Your storage subscription has the same term as your main subscription, and the price is prorated accordingly."
+msgstr ""
+
msgid "Checkout|Your subscription will be applied to this group"
msgstr ""
msgid "Checkout|Zip code"
msgstr ""
+msgid "Checkout|a storage subscription"
+msgstr ""
+
msgid "Checkout|company or team"
msgstr ""
-msgid "Checkout|x 1,000 minutes per pack = %{strong}"
+msgid "Checkout|minutes"
+msgstr ""
+
+msgid "Checkout|x %{quantity} %{units} per pack ="
msgstr ""
msgid "Cherry-pick this commit"
@@ -7064,6 +7153,9 @@ msgstr ""
msgid "CloneIssue|Cannot clone issue to target project as it is pending deletion."
msgstr ""
+msgid "CloneIssue|Cannot clone issues of '%{issue_type}' type."
+msgstr ""
+
msgid "Cloned this issue to %{path_to_project}."
msgstr ""
@@ -7118,7 +7210,10 @@ msgstr ""
msgid "Closes this %{quick_action_target}."
msgstr ""
-msgid "Cloud licenses can not be removed."
+msgid "Cloud Functions description and apps that are suitable for this deployment target"
+msgstr ""
+
+msgid "Cloud Run description and apps that are suitable for this deployment target"
msgstr ""
msgid "Cluster"
@@ -7145,6 +7240,12 @@ msgstr ""
msgid "ClusterAgents|Access tokens"
msgstr ""
+msgid "ClusterAgents|Agent might not be connected to GitLab"
+msgstr ""
+
+msgid "ClusterAgents|Agent never connected to GitLab"
+msgstr ""
+
msgid "ClusterAgents|Alternative installation methods"
msgstr ""
@@ -7160,6 +7261,12 @@ msgstr ""
msgid "ClusterAgents|Configuration"
msgstr ""
+msgid "ClusterAgents|Connected"
+msgstr ""
+
+msgid "ClusterAgents|Connection status"
+msgstr ""
+
msgid "ClusterAgents|Copy token"
msgstr ""
@@ -7178,6 +7285,9 @@ msgstr ""
msgid "ClusterAgents|For alternative installation methods %{linkStart}go to the documentation%{linkEnd}."
msgstr ""
+msgid "ClusterAgents|For more troubleshooting information go to"
+msgstr ""
+
msgid "ClusterAgents|Go to the repository"
msgstr ""
@@ -7193,18 +7303,30 @@ msgstr ""
msgid "ClusterAgents|Integrate with the GitLab Agent"
msgstr ""
-msgid "ClusterAgents|Last used"
+msgid "ClusterAgents|Last connected %{timeAgo}."
+msgstr ""
+
+msgid "ClusterAgents|Last contact"
msgstr ""
msgid "ClusterAgents|Learn how to create an agent access token"
msgstr ""
+msgid "ClusterAgents|Make sure you are using a valid token."
+msgstr ""
+
msgid "ClusterAgents|Name"
msgstr ""
msgid "ClusterAgents|Never"
msgstr ""
+msgid "ClusterAgents|Never connected"
+msgstr ""
+
+msgid "ClusterAgents|Not connected"
+msgstr ""
+
msgid "ClusterAgents|Read more about getting started"
msgstr ""
@@ -7226,6 +7348,9 @@ msgstr ""
msgid "ClusterAgents|Select which Agent you want to install"
msgstr ""
+msgid "ClusterAgents|The Agent has not been connected in a long time. There might be a connectivity issue. Last contact was %{timeAgo}."
+msgstr ""
+
msgid "ClusterAgents|The GitLab Agent also requires %{linkStart}enabling the Agent Server%{linkEnd}"
msgstr ""
@@ -7253,9 +7378,6 @@ msgstr ""
msgid "ClusterAgents|You will need to create a token to connect to your agent"
msgstr ""
-msgid "ClusterAgent|This feature is only available for premium plans"
-msgstr ""
-
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -7445,9 +7567,6 @@ msgstr ""
msgid "ClusterIntegration|Create Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Create a provision role on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the account and external ID above. %{startMoreInfoLink}More information%{endLink}"
-msgstr ""
-
msgid "ClusterIntegration|Create cluster on"
msgstr ""
@@ -7880,7 +7999,7 @@ msgstr ""
msgid "ClusterIntegration|Subnets"
msgstr ""
-msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provisioned role, first create one on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the above account and external IDs. %{startMoreInfoLink}More information%{endLink}"
+msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provisioned role, first create one on %{awsLinkStart}Amazon Web Services %{awsLinkEnd} using the above account and external IDs. %{moreInfoStart}More information%{moreInfoEnd}"
msgstr ""
msgid "ClusterIntegration|The Kubernetes certificate used to authenticate to the cluster."
@@ -8114,6 +8233,9 @@ msgstr ""
msgid "Collapse replies"
msgstr ""
+msgid "Collapse settings section"
+msgstr ""
+
msgid "Collapse sidebar"
msgstr ""
@@ -8132,6 +8254,9 @@ msgstr ""
msgid "Comma-separated list of email addresses."
msgstr ""
+msgid "Comma-separated list of users allowed to exceed the rate limit."
+msgstr ""
+
msgid "Comma-separated, e.g. '1.1.1.1, 2.2.2.0/24'"
msgstr ""
@@ -8452,6 +8577,9 @@ msgstr ""
msgid "Configure %{repository_checks_link_start}repository checks%{link_end} and %{housekeeping_link_start}housekeeping%{link_end} on repositories."
msgstr ""
+msgid "Configure CAPTCHAs, IP address limits, and other anti-spam measures."
+msgstr ""
+
msgid "Configure Dependency Scanning in `.gitlab-ci.yml` using the GitLab managed template. You can [add variable overrides](https://docs.gitlab.com/ee/user/application_security/dependency_scanning/#customizing-the-dependency-scanning-settings) to customize Dependency Scanning settings."
msgstr ""
@@ -8488,16 +8616,13 @@ msgstr ""
msgid "Configure a %{codeStart}.gitlab-webide.yml%{codeEnd} file in the %{codeStart}.gitlab%{codeEnd} directory to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
msgstr ""
-msgid "Configure existing installation"
-msgstr ""
-
-msgid "Configure limit for notes created per minute by web and API requests."
+msgid "Configure advanced permissions, Large File Storage, and two-factor authentication settings."
msgstr ""
-msgid "Configure limits for Project/Group Import/Export."
+msgid "Configure approvals by authors and committers on all projects."
msgstr ""
-msgid "Configure limits for web and API requests."
+msgid "Configure existing installation"
msgstr ""
msgid "Configure paths to be protected by Rack Attack."
@@ -8512,10 +8637,13 @@ msgstr ""
msgid "Configure settings for Advanced Search with Elasticsearch."
msgstr ""
+msgid "Configure specific limits for Files API requests that supersede the general user and IP rate limits."
+msgstr ""
+
msgid "Configure specific limits for Git LFS requests that supersede the general user and IP rate limits."
msgstr ""
-msgid "Configure specific limits for Packages API requests that supersede the general user and IP rate limits."
+msgid "Configure specific limits for deprecated API requests that supersede the general user and IP rate limits."
msgstr ""
msgid "Configure the %{link} integration."
@@ -8527,6 +8655,9 @@ msgstr ""
msgid "Configure the way a user creates a new account."
msgstr ""
+msgid "Configure via Merge Request"
+msgstr ""
+
msgid "Configure which lists are shown for anyone who visits this board"
msgstr ""
@@ -8995,6 +9126,9 @@ msgstr ""
msgid "Content parsed with %{link}."
msgstr ""
+msgid "ContentEditor|Table of Contents"
+msgstr ""
+
msgid "ContentEditor|You have to provide a renderMarkdown function or a custom serializer"
msgstr ""
@@ -9181,6 +9315,9 @@ msgstr ""
msgid "Copy link to chart"
msgstr ""
+msgid "Copy prefix"
+msgstr ""
+
msgid "Copy reference"
msgstr ""
@@ -9211,6 +9348,9 @@ msgstr ""
msgid "Copy value"
msgstr ""
+msgid "Corpus Management"
+msgstr ""
+
msgid "Corpus Management|Are you sure you want to delete the corpus?"
msgstr ""
@@ -9439,6 +9579,9 @@ msgstr ""
msgid "Create commit"
msgstr ""
+msgid "Create common files more quickly, and standardize their format."
+msgstr ""
+
msgid "Create confidential merge request"
msgstr ""
@@ -9472,6 +9615,9 @@ msgstr ""
msgid "Create issue"
msgstr ""
+msgid "Create issue to resolve all threads"
+msgstr ""
+
msgid "Create iteration"
msgstr ""
@@ -9526,6 +9672,9 @@ msgstr ""
msgid "Create new..."
msgstr ""
+msgid "Create or import your first project"
+msgstr ""
+
msgid "Create project"
msgstr ""
@@ -9883,7 +10032,7 @@ msgstr ""
msgid "Custom notification events"
msgstr ""
-msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notificationLinkStart} notification emails%{notificationLinkEnd}."
+msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notificationLinkStart}notification emails%{notificationLinkEnd}."
msgstr ""
msgid "Custom project templates"
@@ -10082,10 +10231,10 @@ msgid_plural "CycleAnalytics|Showing %{subjectFilterText} and %{selectedLabelsCo
msgstr[0] ""
msgstr[1] ""
-msgid "CycleAnalytics|Showing data for group '%{groupName}' and %{selectedProjectCount} projects from %{startDate} to %{endDate}"
+msgid "CycleAnalytics|Showing data for group '%{groupName}' and %{selectedProjectCount} projects from %{createdAfter} to %{createdBefore}"
msgstr ""
-msgid "CycleAnalytics|Showing data for group '%{groupName}' from %{startDate} to %{endDate}"
+msgid "CycleAnalytics|Showing data for group '%{groupName}' from %{createdAfter} to %{createdBefore}"
msgstr ""
msgid "CycleAnalytics|Stages"
@@ -10319,6 +10468,9 @@ msgstr ""
msgid "DastProfiles|Manage profiles"
msgstr ""
+msgid "DastProfiles|Manage site profiles"
+msgstr ""
+
msgid "DastProfiles|Minimum = 0 (no timeout enabled), Maximum = 2880 minutes"
msgstr ""
@@ -10394,6 +10546,9 @@ msgstr ""
msgid "DastProfiles|Scanner name"
msgstr ""
+msgid "DastProfiles|Schedule"
+msgstr ""
+
msgid "DastProfiles|Select branch"
msgstr ""
@@ -10463,7 +10618,7 @@ msgstr ""
msgid "DastProfiles|Website"
msgstr ""
-msgid "DastProfiles|You can either choose a passive scan or validate the target site in your chosen site profile. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
+msgid "DastProfiles|You can either choose a passive scan or validate the target site from the site profile management page. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
msgstr ""
msgid "DastProfiles|You cannot run an active scan against an unvalidated site."
@@ -10636,7 +10791,7 @@ msgstr ""
msgid "Days to merge"
msgstr ""
-msgid "Deactivate dormant users after 90 days of inactivity. Users can return to active status by signing in to their account. While inactive, a user is not counted as an active user in the instance."
+msgid "Deactivate dormant users after 90 days of inactivity"
msgstr ""
msgid "Dear Administrator,"
@@ -10723,10 +10878,10 @@ msgstr ""
msgid "Define a custom pattern with cron syntax"
msgstr ""
-msgid "Define approval settings."
+msgid "Define approval rules."
msgstr ""
-msgid "Define approval settings. %{linkStart}Learn more.%{linkEnd}"
+msgid "Define approval rules. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "Define custom rules for what constitutes spam, independent of Akismet"
@@ -10735,7 +10890,7 @@ msgstr ""
msgid "Define environments in the deploy stage(s) in %{code_open}.gitlab-ci.yml%{code_close} to track deployments here."
msgstr ""
-msgid "Define how approval rules are applied as a merge request moves toward completion."
+msgid "Define how approval rules are applied to merge requests."
msgstr ""
msgid "Definition"
@@ -10750,6 +10905,12 @@ msgstr ""
msgid "DelayedJobs|Are you sure you want to run %{job_name} immediately? This job will run automatically after it's timer finishes."
msgstr ""
+msgid "DelayedJobs|Are you sure you want to run %{job_name} immediately? This job will run automatically after its timer finishes."
+msgstr ""
+
+msgid "DelayedJobs|Run the delayed job now?"
+msgstr ""
+
msgid "DelayedJobs|Start now"
msgstr ""
@@ -11026,6 +11187,12 @@ msgstr ""
msgid "Dependency proxy image prefix"
msgstr ""
+msgid "DependencyProxy|Create a local proxy for storing frequently used upstream images. %{docLinkStart}Learn more%{docLinkEnd} about dependency proxies."
+msgstr ""
+
+msgid "DependencyProxy|Dependency Proxy"
+msgstr ""
+
msgid "DependencyProxy|Toggle Dependency Proxy"
msgstr ""
@@ -11266,6 +11433,9 @@ msgstr ""
msgid "Deployments"
msgstr ""
+msgid "Deployments to Google Kubernetes Engine can be "
+msgstr ""
+
msgid "Deployments|%{deployments} environment impacted."
msgid_plural "Deployments|%{deployments} environments impacted."
msgstr[0] ""
@@ -11295,6 +11465,9 @@ msgstr ""
msgid "Deployment|success"
msgstr ""
+msgid "Deprecated API rate limits"
+msgstr ""
+
msgid "Deprioritize label"
msgstr ""
@@ -11697,6 +11870,16 @@ msgstr ""
msgid "DiffsCompareBaseBranch|(base)"
msgstr ""
+msgid "Diffs|%d addition"
+msgid_plural "Diffs|%d additions"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Diffs|%d deletion"
+msgid_plural "Diffs|%d deletions"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Diffs|No file name available"
msgstr ""
@@ -11706,9 +11889,17 @@ msgstr ""
msgid "Diffs|Show all unchanged lines"
msgstr ""
+msgid "Diffs|Showing %{dropdownStart}%{count} changed file%{dropdownEnd}"
+msgid_plural "Diffs|Showing %{dropdownStart}%{count} changed files%{dropdownEnd}"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Diffs|Something went wrong while fetching diff lines."
msgstr ""
+msgid "Diffs|with %{additions} and %{deletions}"
+msgstr ""
+
msgid "Direct member"
msgstr ""
@@ -11834,9 +12025,6 @@ msgid_plural "Dismiss %d selected vulnerabilities as"
msgstr[0] ""
msgstr[1] ""
-msgid "Dismiss Value Stream Analytics introduction box"
-msgstr ""
-
msgid "Dismiss merge request promotion"
msgstr ""
@@ -12158,6 +12346,9 @@ msgstr ""
msgid "Edit issues"
msgstr ""
+msgid "Edit merge requests"
+msgstr ""
+
msgid "Edit public deploy key"
msgstr ""
@@ -12233,6 +12424,9 @@ msgstr ""
msgid "Elastic|None. Select projects to index."
msgstr ""
+msgid "Eligible users"
+msgstr ""
+
msgid "Email"
msgstr ""
@@ -12362,6 +12556,9 @@ msgstr ""
msgid "Enable"
msgstr ""
+msgid "Enable Amazon EKS integration"
+msgstr ""
+
msgid "Enable Auto DevOps"
msgstr ""
@@ -12395,6 +12592,9 @@ msgstr ""
msgid "Enable SSL verification"
msgstr ""
+msgid "Enable Service Ping"
+msgstr ""
+
msgid "Enable Snowplow tracking"
msgstr ""
@@ -12425,6 +12625,9 @@ msgstr ""
msgid "Enable authenticated Git LFS request rate limit"
msgstr ""
+msgid "Enable authenticated web request rate limit"
+msgstr ""
+
msgid "Enable authentication"
msgstr ""
@@ -12485,7 +12688,7 @@ msgstr ""
msgid "Enable or disable the Pseudonymizer data collection."
msgstr ""
-msgid "Enable or disable version check and service ping."
+msgid "Enable or disable version check and Service Ping."
msgstr ""
msgid "Enable protected paths rate limit"
@@ -12497,18 +12700,12 @@ msgstr ""
msgid "Enable reCAPTCHA"
msgstr ""
-msgid "Enable reCAPTCHA for login"
-msgstr ""
-
-msgid "Enable reCAPTCHA, Invisible Captcha, Akismet and set IP limits. For reCAPTCHA, we currently only support %{recaptcha_v2_link_start}v2%{recaptcha_v2_link_end}"
+msgid "Enable reCAPTCHA for login."
msgstr ""
msgid "Enable repository checks"
msgstr ""
-msgid "Enable service ping"
-msgstr ""
-
msgid "Enable shared runners for all projects and subgroups in this group."
msgstr ""
@@ -12530,7 +12727,10 @@ msgstr ""
msgid "Enable unauthenticated API request rate limit"
msgstr ""
-msgid "Enable unauthenticated request rate limit"
+msgid "Enable unauthenticated web request rate limit"
+msgstr ""
+
+msgid "Enable user deactivation emails"
msgstr ""
msgid "Enable version check"
@@ -12566,9 +12766,6 @@ msgstr ""
msgid "Enabled sources for code import during project creation. OmniAuth must be configured for GitHub"
msgstr ""
-msgid "Enabling this will only make licensed EE features available to projects if the project namespace's plan includes the feature or if the project is public."
-msgstr ""
-
msgid "Encountered an error while rendering: %{err}"
msgstr ""
@@ -12617,9 +12814,6 @@ msgstr ""
msgid "Enter Admin Mode"
msgstr ""
-msgid "Enter IP address range"
-msgstr ""
-
msgid "Enter a number"
msgstr ""
@@ -12632,9 +12826,6 @@ msgstr ""
msgid "Enter at least three characters to search"
msgstr ""
-msgid "Enter domain"
-msgstr ""
-
msgid "Enter in your Bitbucket Server URL and personal access token below"
msgstr ""
@@ -12821,9 +13012,6 @@ msgstr ""
msgid "Environments|Deployment %{status}"
msgstr ""
-msgid "Environments|Dismiss"
-msgstr ""
-
msgid "Environments|Enable review app"
msgstr ""
@@ -12836,9 +13024,6 @@ msgstr ""
msgid "Environments|Environments are places where code gets deployed, such as staging or production."
msgstr ""
-msgid "Environments|Help us improve environments"
-msgstr ""
-
msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
msgstr ""
@@ -12875,6 +13060,9 @@ msgstr ""
msgid "Environments|Note that this action will stop the environment, but it will %{emphasisStart}not%{emphasisEnd} have an effect on any existing deployment due to no “stop environment action†being defined in the %{ciConfigLinkStart}.gitlab-ci.yml%{ciConfigLinkEnd} file."
msgstr ""
+msgid "Environments|Open"
+msgstr ""
+
msgid "Environments|Open live environment"
msgstr ""
@@ -12914,9 +13102,6 @@ msgstr ""
msgid "Environments|Stopping %{environmentName}"
msgstr ""
-msgid "Environments|Take the survey"
-msgstr ""
-
msgid "Environments|There was an error fetching the logs. Please try again."
msgstr ""
@@ -12938,9 +13123,6 @@ msgstr ""
msgid "Environments|You don't have any environments right now"
msgstr ""
-msgid "Environments|Your feedback helps GitLab make environments better for you and other users. Participate and enter a sweepstake to win a USD 30 gift card."
-msgstr ""
-
msgid "Environments|by %{avatar}"
msgstr ""
@@ -13223,7 +13405,7 @@ msgstr ""
msgid "Error parsing CSV file. Please make sure it has"
msgstr ""
-msgid "Error rendering markdown preview"
+msgid "Error rendering Markdown preview"
msgstr ""
msgid "Error saving label update."
@@ -13271,6 +13453,9 @@ msgstr ""
msgid "Error: %{error_message}"
msgstr ""
+msgid "Error: Couldn't load some or all of the changes."
+msgstr ""
+
msgid "Error: No AWS credentials were supplied"
msgstr ""
@@ -13304,6 +13489,9 @@ msgstr ""
msgid "ErrorTracking|Enable error tracking"
msgstr ""
+msgid "ErrorTracking|Error tracking backend"
+msgstr ""
+
msgid "ErrorTracking|If you self-host Sentry, enter your Sentry instance's full URL. If you use Sentry's hosted solution, enter https://sentry.io"
msgstr ""
@@ -13337,6 +13525,12 @@ msgstr ""
msgid "Escalation policies must have at least one rule"
msgstr ""
+msgid "EscalationPolicies|%{clockIcon} IF alert is not %{alertStatus} in %{minutes}"
+msgstr ""
+
+msgid "EscalationPolicies|%{notificationIcon} THEN %{doAction} %{forScheduleOrUser}"
+msgstr ""
+
msgid "EscalationPolicies|+ Add an additional rule"
msgstr ""
@@ -13379,13 +13573,13 @@ msgstr ""
msgid "EscalationPolicies|Escalation policies"
msgstr ""
-msgid "EscalationPolicies|Escalation rules"
+msgid "EscalationPolicies|Escalation policy %{obstacle} in Project %{project}"
msgstr ""
-msgid "EscalationPolicies|Failed to load oncall-schedules"
+msgid "EscalationPolicies|Escalation rules"
msgstr ""
-msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} %{then} THEN %{doAction} %{scheduleOrUser}"
+msgid "EscalationPolicies|Failed to load oncall-schedules"
msgstr ""
msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} minutes"
@@ -13463,18 +13657,36 @@ msgstr ""
msgid "Every %{action} attempt has failed: %{job_error_message}. Please try again."
msgstr ""
+msgid "Every 3 months"
+msgstr ""
+
+msgid "Every 3 months on the %{day} at %{time} %{timezone}"
+msgstr ""
+
+msgid "Every 6 months"
+msgstr ""
+
+msgid "Every 6 months on the %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Every day"
msgstr ""
msgid "Every day (at %{time})"
msgstr ""
+msgid "Every day at %{time} %{timezone}"
+msgstr ""
+
msgid "Every month"
msgstr ""
msgid "Every month (Day %{day} at %{time})"
msgstr ""
+msgid "Every month on the %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Every three months"
msgstr ""
@@ -13489,6 +13701,15 @@ msgstr[1] ""
msgid "Every week (%{weekday} at %{time})"
msgstr ""
+msgid "Every week on %{day} at %{time} %{timezone}"
+msgstr ""
+
+msgid "Every year"
+msgstr ""
+
+msgid "Every year on %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Everyone"
msgstr ""
@@ -13525,9 +13746,6 @@ msgstr ""
msgid "Exactly one of %{attributes} is required"
msgstr ""
-msgid "Example: %{ip_address}. %{read_more_link}."
-msgstr ""
-
msgid "Example: @sub\\.company\\.com$"
msgstr ""
@@ -13594,13 +13812,13 @@ msgstr ""
msgid "Expand pipeline"
msgstr ""
-msgid "Expand sidebar"
+msgid "Expand settings section"
msgstr ""
-msgid "Expected documents: %{expected_documents}"
+msgid "Expand sidebar"
msgstr ""
-msgid "Experienced"
+msgid "Expected documents: %{expected_documents}"
msgstr ""
msgid "ExperimentSubject|Must have exactly one of User, Namespace, or Project."
@@ -13885,9 +14103,6 @@ msgstr ""
msgid "Failed to load related branches"
msgstr ""
-msgid "Failed to load sidebar lock status"
-msgstr ""
-
msgid "Failed to load stacktrace."
msgstr ""
@@ -14312,6 +14527,9 @@ msgstr ""
msgid "Files"
msgstr ""
+msgid "Files API Rate Limits"
+msgstr ""
+
msgid "Files breadcrumb"
msgstr ""
@@ -15311,6 +15529,9 @@ msgstr ""
msgid "GitLab group: %{source_link}"
msgstr ""
+msgid "GitLab informs you if a new version is available."
+msgstr ""
+
msgid "GitLab is a complete DevOps platform, delivered as a single application, fundamentally changing the way Development, Security, and Ops teams collaborate"
msgstr ""
@@ -15326,7 +15547,7 @@ msgstr ""
msgid "GitLab is open source software to collaborate on code."
msgstr ""
-msgid "GitLab is undergoing maintenance and is operating in a read-only mode."
+msgid "GitLab is undergoing maintenance and is operating in read-only mode."
msgstr ""
msgid "GitLab member or Email address"
@@ -15338,9 +15559,6 @@ msgstr ""
msgid "GitLab project export"
msgstr ""
-msgid "GitLab restart is required to apply changes."
-msgstr ""
-
msgid "GitLab single sign-on URL"
msgstr ""
@@ -15356,9 +15574,6 @@ msgstr ""
msgid "GitLab version"
msgstr ""
-msgid "GitLab will inform you if a new version is available."
-msgstr ""
-
msgid "GitLab will run a background job that will produce pseudonymized CSVs of the GitLab database that will be uploaded to your configured object storage directory."
msgstr ""
@@ -15623,9 +15838,21 @@ msgstr ""
msgid "Go to snippets"
msgstr ""
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check 'Allowed domains for sign-ups'."
+msgstr ""
+
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check 'Email restrictions for sign-ups'."
+msgstr ""
+
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check the 'Domain denylist'."
+msgstr ""
+
msgid "Go to the activity feed"
msgstr ""
+msgid "Go to the group’s 'Settings &gt; General' page, and check 'Restrict membership by email domain'."
+msgstr ""
+
msgid "Go to the milestone list"
msgstr ""
@@ -15662,6 +15889,12 @@ msgstr ""
msgid "Goal of the changes and what reviewers should be aware of"
msgstr ""
+msgid "Google Cloud"
+msgstr ""
+
+msgid "Google Cloud offers several deployment targets. Select the one most suitable for your project."
+msgstr ""
+
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
@@ -15746,9 +15979,6 @@ msgstr ""
msgid "Group ID"
msgstr ""
-msgid "Group ID: %{group_id}"
-msgstr ""
-
msgid "Group Owner must have signed in with SAML before enabling Group Managed Accounts"
msgstr ""
@@ -15923,6 +16153,12 @@ msgstr ""
msgid "GroupImport|Unable to process group import file"
msgstr ""
+msgid "GroupPage|Copy group ID"
+msgstr ""
+
+msgid "GroupPage|Group ID: %{group_id}"
+msgstr ""
+
msgid "GroupRoadmap|%{dateWord} – No end date"
msgstr ""
@@ -15977,6 +16213,9 @@ msgstr ""
msgid "GroupRoadmap|Within 3 years"
msgstr ""
+msgid "GroupSAML|\"persistent\" recommended"
+msgstr ""
+
msgid "GroupSAML|%{strongOpen}Warning%{strongClose} - Enabling %{linkStart}SSO enforcement%{linkEnd} can reduce security risks."
msgstr ""
@@ -16109,6 +16348,9 @@ msgstr ""
msgid "GroupSAML|To be able to prohibit outer forks, you first need to enforce dedicate group managed accounts."
msgstr ""
+msgid "GroupSAML|Use SAML group links to manage group membership using SAML."
+msgstr ""
+
msgid "GroupSAML|Valid SAML Response"
msgstr ""
@@ -16121,13 +16363,10 @@ msgstr ""
msgid "GroupSAML|as %{access_level}"
msgstr ""
-msgid "GroupSAML|must match stored NameID of \"%{extern_uid}\" as we use this to identify users. If the NameID changes users will be unable to sign in."
-msgstr ""
-
-msgid "GroupSAML|should be \"persistent\""
+msgid "GroupSAML|must match stored NameID of \"%{extern_uid}\" to identify user and allow sign in"
msgstr ""
-msgid "GroupSAML|should be a random persistent ID, emails are discouraged"
+msgid "GroupSAML|recommend persistent ID instead of email"
msgstr ""
msgid "GroupSelect|No matching results"
@@ -16142,9 +16381,15 @@ msgstr ""
msgid "GroupSettings|Allow project access token creation"
msgstr ""
+msgid "GroupSettings|Applied to all subgroups unless overridden by a group owner. Groups already added to the project lose access."
+msgstr ""
+
msgid "GroupSettings|Auto DevOps pipeline was updated for the group"
msgstr ""
+msgid "GroupSettings|Available only on the top-level group. Applies to all subgroups. Groups already shared with a group outside %{group} are still shared unless removed manually."
+msgstr ""
+
msgid "GroupSettings|Badges"
msgstr ""
@@ -16196,6 +16441,9 @@ msgstr ""
msgid "GroupSettings|New runners registration token has been generated!"
msgstr ""
+msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgstr ""
+
msgid "GroupSettings|Pipeline settings was updated for the group"
msgstr ""
@@ -16208,12 +16456,15 @@ msgstr ""
msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
-msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups."
+msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups"
msgstr ""
msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
msgstr ""
+msgid "GroupSettings|Prevents group members from being notified if the group is mentioned."
+msgstr ""
+
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
msgstr ""
@@ -16250,21 +16501,6 @@ msgstr ""
msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}."
msgstr ""
-msgid "GroupSettings|This setting is only available on the top-level group and it applies to all subgroups. Groups that have already been shared with a group outside %{group} will still be shared, and this access will have to be revoked manually."
-msgstr ""
-
-msgid "GroupSettings|This setting will be applied to all subgroups unless overridden by a group owner. Groups that already have access to the project will continue to have access unless removed manually."
-msgstr ""
-
-msgid "GroupSettings|This setting will override user notification preferences for all members of the group, subgroups, and projects."
-msgstr ""
-
-msgid "GroupSettings|This setting will prevent group members from being notified if the group is mentioned."
-msgstr ""
-
-msgid "GroupSettings|This setting will prevent group members from forking projects outside of the group."
-msgstr ""
-
msgid "GroupSettings|Transfer group"
msgstr ""
@@ -16382,7 +16618,7 @@ msgstr ""
msgid "GroupsNew|No import options available"
msgstr ""
-msgid "GroupsNew|Not all related objects are migrated, as %{docs_link_start}described here%{docs_link_end}. Please %{feedback_link_start}leave feedback%{feedback_link_end} on this feature."
+msgid "GroupsNew|Not all related objects are migrated. %{docs_link_start}More info%{docs_link_end}."
msgstr ""
msgid "GroupsNew|Personal access token"
@@ -16514,15 +16750,27 @@ msgstr ""
msgid "Hello %{name},"
msgstr ""
-msgid "Hello there"
-msgstr ""
-
msgid "Hello, %{name}!"
msgstr ""
msgid "Hello, %{username}!"
msgstr ""
+msgid "HelloMessage|%{handshake_emoji} Contribute to GitLab: %{contribute_link}"
+msgstr ""
+
+msgid "HelloMessage|%{magnifier_emoji} Create a new GitLab issue: %{new_issue_link}"
+msgstr ""
+
+msgid "HelloMessage|%{rocket_emoji} We like your curiosity! Help us improve GitLab by joining the team: %{jobs_page_link}"
+msgstr ""
+
+msgid "HelloMessage|Does this page need fixes or improvements? Open an issue or contribute a merge request to help make GitLab more lovable. At GitLab, everyone can contribute!"
+msgstr ""
+
+msgid "HelloMessage|Welcome to GitLab!"
+msgstr ""
+
msgid "Help"
msgstr ""
@@ -16532,13 +16780,10 @@ msgstr ""
msgid "Helps prevent bots from creating accounts."
msgstr ""
-msgid "Helps prevent bots from creating issues"
-msgstr ""
-
-msgid "Helps prevent malicious users hide their activity"
+msgid "Helps prevent bots from creating issues."
msgstr ""
-msgid "Helps reduce request volume (e.g. from crawlers or abusive bots)"
+msgid "Helps prevent malicious users hide their activity."
msgstr ""
msgid "Helps reduce request volume (for example, from crawlers or abusive bots)"
@@ -16662,6 +16907,12 @@ msgstr ""
msgid "Housekeeping, export, path, transfer, remove, archive."
msgstr ""
+msgid "How do I configure Akismet?"
+msgstr ""
+
+msgid "How do I configure it?"
+msgstr ""
+
msgid "How do I configure runners?"
msgstr ""
@@ -16683,19 +16934,25 @@ msgstr ""
msgid "How do I set up this service?"
msgstr ""
+msgid "How do I use a web terminal?"
+msgstr ""
+
+msgid "How do I use file templates?"
+msgstr ""
+
msgid "How it works"
msgstr ""
msgid "How many days need to pass between marking entity for deletion and actual removing it."
msgstr ""
-msgid "How many seconds an IP will be counted towards the limit"
+msgid "How many seconds an IP counts toward the IP address limit."
msgstr ""
-msgid "I accept the %{terms_link}"
+msgid "How the job limiter handles jobs exceeding the thresholds specified below. The 'track' mode only logs the jobs. The 'compress' mode compresses the jobs and raises an exception if the compressed size exceeds the limit."
msgstr ""
-msgid "I accept the|Terms of Service and Privacy Policy"
+msgid "I accept the %{terms_link}"
msgstr ""
msgid "I forgot my password"
@@ -16779,13 +17036,16 @@ msgstr ""
msgid "IP Address"
msgstr ""
-msgid "IP expiration time"
+msgid "IP address expiration time"
msgstr ""
-msgid "IP subnet restriction only allowed for top-level groups"
+msgid "IP address restrictions"
+msgstr ""
+
+msgid "IP addresses per user"
msgstr ""
-msgid "IPs per user"
+msgid "IP subnet restriction only allowed for top-level groups"
msgstr ""
msgid "Identifier"
@@ -16800,6 +17060,9 @@ msgstr ""
msgid "If any indexed field exceeds this limit it will be truncated to this number of characters and the rest will not be indexed or searchable. This does not apply to repository and wiki indexing. Setting this to 0 means it is unlimited."
msgstr ""
+msgid "If blank, defaults to %{code_open}Retry later%{code_close}."
+msgstr ""
+
msgid "If blank, set allowable lifetime to %{instance_level_policy_in_words}, as defined by the instance admin. Once set, existing tokens for users in this group may be revoked."
msgstr ""
@@ -16851,6 +17114,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 did not initiate these sign-in attempts, please reach out to your administrator or enable two-factor authentication (2FA) on your account."
+msgstr ""
+
msgid "If you did not initiate this change, please contact your administrator immediately."
msgstr ""
@@ -16942,10 +17208,10 @@ msgstr ""
msgid "Import Projects from Gitea"
msgstr ""
-msgid "Import a project"
+msgid "Import an exported GitLab project"
msgstr ""
-msgid "Import an exported GitLab project"
+msgid "Import and export rate limits"
msgstr ""
msgid "Import failed due to a GitHub error: %{original}"
@@ -16957,12 +17223,18 @@ msgstr ""
msgid "Import from Jira"
msgstr ""
+msgid "Import group"
+msgstr ""
+
msgid "Import group from file"
msgstr ""
msgid "Import groups"
msgstr ""
+msgid "Import history"
+msgstr ""
+
msgid "Import in progress"
msgstr ""
@@ -17026,7 +17298,25 @@ msgstr ""
msgid "Import timed out. Import took longer than %{import_jobs_expiration} seconds"
msgstr ""
-msgid "Import/Export Rate Limits"
+msgid "ImportAProjectModal|Import from a project"
+msgstr ""
+
+msgid "ImportAProjectModal|Import members from another project"
+msgstr ""
+
+msgid "ImportAProjectModal|Import project members"
+msgstr ""
+
+msgid "ImportAProjectModal|Only project members (not group members) are imported, and they get the same permissions as the project you import from."
+msgstr ""
+
+msgid "ImportAProjectModal|Successfully imported"
+msgstr ""
+
+msgid "ImportAProjectModal|Unable to import project members"
+msgstr ""
+
+msgid "ImportAProjectModal|You're importing members to the %{strongStart}%{name}%{strongEnd} project."
msgstr ""
msgid "ImportButtons|Connect repositories from"
@@ -17079,7 +17369,7 @@ msgstr[1] ""
msgid "Importing..."
msgstr ""
-msgid "Import|A repository URL usually ends in a .git suffix, although this is not required. Double check to make sure your repository URL is correct."
+msgid "Import|There is not a valid Git repository at this URL. If your HTTP repository is not publicly accessible, verify your credentials."
msgstr ""
msgid "Improve customer support with Service Desk"
@@ -17088,9 +17378,6 @@ msgstr ""
msgid "Improves Git cloning performance."
msgstr ""
-msgid "In %{time_to_now}"
-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 ""
@@ -17376,7 +17663,7 @@ msgstr ""
msgid "InProductMarketing|Start a GitLab Ultimate trial today in less than one minute, no credit card required."
msgstr ""
-msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no CC required"
+msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no credit card required"
msgstr ""
msgid "InProductMarketing|Start a trial"
@@ -17415,7 +17702,7 @@ msgstr ""
msgid "InProductMarketing|Team up in GitLab for greater efficiency"
msgstr ""
-msgid "InProductMarketing|Team work makes the dream work"
+msgid "InProductMarketing|Team work makes the dream work"
msgstr ""
msgid "InProductMarketing|Test, create, deploy"
@@ -17996,6 +18283,9 @@ msgstr ""
msgid "Integrations|Create new issue in Jira"
msgstr ""
+msgid "Integrations|Create new issue in ZenTao"
+msgstr ""
+
msgid "Integrations|Default settings are inherited from the group level."
msgstr ""
@@ -18089,9 +18379,15 @@ msgstr ""
msgid "Integrations|Search Jira issues"
msgstr ""
+msgid "Integrations|Search ZenTao issues"
+msgstr ""
+
msgid "Integrations|Send notifications about project events to Unify Circuit."
msgstr ""
+msgid "Integrations|Send notifications about project events to a Unify Circuit conversation. %{docs_link}"
+msgstr ""
+
msgid "Integrations|Sign in to add namespaces"
msgstr ""
@@ -18131,6 +18427,9 @@ msgstr ""
msgid "Integrations|You've activated every integration 🎉"
msgstr ""
+msgid "Integrations|ZenTao issues display here when you create issues in your project in ZenTao."
+msgstr ""
+
msgid "Interactive mode"
msgstr ""
@@ -18158,9 +18457,6 @@ msgstr ""
msgid "Interval Pattern"
msgstr ""
-msgid "Introducing Value Stream Analytics"
-msgstr ""
-
msgid "Introducing Your DevOps Report"
msgstr ""
@@ -18257,6 +18553,12 @@ msgstr ""
msgid "Investigate vulnerability: %{title}"
msgstr ""
+msgid "Invisible Captcha"
+msgstr ""
+
+msgid "Invisible Captcha helps prevent the creation of spam accounts. It adds a honeypot field and time-sensitive form submission to the account signup form."
+msgstr ""
+
msgid "Invitation"
msgstr ""
@@ -18710,12 +19012,18 @@ msgstr ""
msgid "Issues"
msgstr ""
+msgid "Issues I've created"
+msgstr ""
+
msgid "Issues Rate Limits"
msgstr ""
msgid "Issues and merge requests"
msgstr ""
+msgid "Issues assigned to me"
+msgstr ""
+
msgid "Issues can be bugs, tasks or ideas to be discussed. Also, issues are searchable and filterable."
msgstr ""
@@ -18827,7 +19135,7 @@ msgstr ""
msgid "Iterations|Create cadence"
msgstr ""
-msgid "Iterations|Create your first iteration"
+msgid "Iterations|Create iteration"
msgstr ""
msgid "Iterations|Delete cadence"
@@ -18836,6 +19144,9 @@ msgstr ""
msgid "Iterations|Delete iteration cadence?"
msgstr ""
+msgid "Iterations|Delete iteration?"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -18869,12 +19180,18 @@ msgstr ""
msgid "Iterations|New iteration cadence"
msgstr ""
+msgid "Iterations|No closed iterations."
+msgstr ""
+
msgid "Iterations|No iteration cadences to show."
msgstr ""
msgid "Iterations|No iterations in cadence."
msgstr ""
+msgid "Iterations|No open iterations."
+msgstr ""
+
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
@@ -18905,6 +19222,9 @@ msgstr ""
msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
msgstr ""
+msgid "Iterations|This will remove the iteration from any issues that are assigned to it."
+msgstr ""
+
msgid "Iterations|Title"
msgstr ""
@@ -18920,15 +19240,9 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "I’m familiar with the basics of DevOps."
-msgstr ""
-
msgid "I’m joining my team who’s already on GitLab"
msgstr ""
-msgid "I’m not familiar with the basics of DevOps."
-msgstr ""
-
msgid "Jaeger URL"
msgstr ""
@@ -19193,6 +19507,9 @@ msgstr ""
msgid "Job"
msgstr ""
+msgid "Job %{jobName}"
+msgstr ""
+
msgid "Job Failed #%{build_id}"
msgstr ""
@@ -19783,9 +20100,6 @@ msgstr ""
msgid "Learn more in the"
msgstr ""
-msgid "Learn more in the|pipeline schedules documentation"
-msgstr ""
-
msgid "Learn more."
msgstr ""
@@ -19897,9 +20211,6 @@ msgstr ""
msgid "Leave Admin Mode"
msgstr ""
-msgid "Leave blank for no limit. Once set, existing personal access tokens may be revoked."
-msgstr ""
-
msgid "Leave edit mode? All unsaved changes will be lost."
msgstr ""
@@ -19945,10 +20256,10 @@ msgstr ""
msgid "LicenseCompliance|Acceptable license to be used in the project"
msgstr ""
-msgid "LicenseCompliance|Add a license"
+msgid "LicenseCompliance|Add license and related policy"
msgstr ""
-msgid "LicenseCompliance|Add license and related policy"
+msgid "LicenseCompliance|Add license policy"
msgstr ""
msgid "LicenseCompliance|Allow"
@@ -20038,6 +20349,9 @@ msgstr ""
msgid "LicenseManagement|Uncategorized"
msgstr ""
+msgid "Licensed Enterprise Edition features can be used if the project namespace's plan includes the feature, or if the project is public."
+msgstr ""
+
msgid "Licensed Features"
msgstr ""
@@ -20104,7 +20418,10 @@ msgstr ""
msgid "Limit namespaces and projects that can be indexed"
msgstr ""
-msgid "Limit sign in from multiple ips"
+msgid "Limit project size at a global, group, and project level. %{link_start}Learn more%{link_end}."
+msgstr ""
+
+msgid "Limit sign in from multiple IP addresses"
msgstr ""
msgid "Limit the number of concurrent operations this secondary site can run in the background."
@@ -20116,11 +20433,17 @@ msgstr ""
msgid "Limit the number of issues and epics per minute a user can create through web and API requests."
msgstr ""
+msgid "Limit the size of Sidekiq jobs stored in Redis."
+msgstr ""
+
msgid "Limited to showing %d event at most"
msgid_plural "Limited to showing %d events at most"
msgstr[0] ""
msgstr[1] ""
+msgid "Limiting mode"
+msgstr ""
+
msgid "Line changes"
msgstr ""
@@ -20190,9 +20513,6 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
-msgid "List of users to be excluded from the limit"
-msgstr ""
-
msgid "List options"
msgstr ""
@@ -20232,9 +20552,6 @@ msgstr ""
msgid "Loading functions timed out. Please reload the page to try again."
msgstr ""
-msgid "Loading issues"
-msgstr ""
-
msgid "Loading more"
msgstr ""
@@ -20526,6 +20843,9 @@ msgstr ""
msgid "Marked For Deletion At - %{deletion_time}"
msgstr ""
+msgid "Marked as ready. Merging is now allowed."
+msgstr ""
+
msgid "Marked this %{noun} as a draft."
msgstr ""
@@ -20598,52 +20918,22 @@ msgstr ""
msgid "Max 100,000 events"
msgstr ""
-msgid "Max 20 characters"
-msgstr ""
-
-msgid "Max Group Export Download requests per minute per user"
-msgstr ""
-
-msgid "Max Group Export requests per minute per user"
-msgstr ""
-
-msgid "Max Group Import requests per minute per user"
-msgstr ""
-
-msgid "Max Project Export Download requests per minute per user"
-msgstr ""
-
-msgid "Max Project Export requests per minute per user"
-msgstr ""
-
-msgid "Max Project Import requests per minute per user"
-msgstr ""
-
-msgid "Max authenticated API requests per period per user"
-msgstr ""
-
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
-msgid "Max authenticated web requests per period per user"
-msgstr ""
-
msgid "Max file size is 200 KB."
msgstr ""
-msgid "Max requests per minute per user"
-msgstr ""
-
msgid "Max role"
msgstr ""
msgid "Max session time"
msgstr ""
-msgid "Max unauthenticated requests per period per IP"
+msgid "MaxBuilds"
msgstr ""
-msgid "MaxBuilds"
+msgid "Maximum 20 characters"
msgstr ""
msgid "Maximum Conan package file size in bytes"
@@ -20679,6 +20969,12 @@ msgstr ""
msgid "Maximum attachment size (MB)"
msgstr ""
+msgid "Maximum authenticated API requests per rate limit period per user"
+msgstr ""
+
+msgid "Maximum authenticated web requests per rate limit period per user"
+msgstr ""
+
msgid "Maximum bulk request size (MiB)"
msgstr ""
@@ -20724,6 +21020,15 @@ msgstr ""
msgid "Maximum files in a diff"
msgstr ""
+msgid "Maximum group export download requests per minute"
+msgstr ""
+
+msgid "Maximum group export requests per minute"
+msgstr ""
+
+msgid "Maximum group import requests per minute"
+msgstr ""
+
msgid "Maximum import size"
msgstr ""
@@ -20760,7 +21065,7 @@ msgstr ""
msgid "Maximum number of projects."
msgstr ""
-msgid "Maximum number of unique IPs per user"
+msgid "Maximum number of unique IP addresses per user."
msgstr ""
msgid "Maximum page reached"
@@ -20769,12 +21074,24 @@ msgstr ""
msgid "Maximum page size"
msgstr ""
+msgid "Maximum project export download requests per minute"
+msgstr ""
+
+msgid "Maximum project export requests per minute"
+msgstr ""
+
+msgid "Maximum project import requests per minute"
+msgstr ""
+
msgid "Maximum push size"
msgstr ""
msgid "Maximum push size (MB)"
msgstr ""
+msgid "Maximum requests per minute"
+msgstr ""
+
msgid "Maximum running slices"
msgstr ""
@@ -20802,10 +21119,16 @@ msgstr ""
msgid "Maximum time between updates that a mirror can have when scheduled to synchronize."
msgstr ""
-msgid "Maximum time for web terminal websocket connection (in seconds). 0 for unlimited."
+msgid "Maximum time that users are allowed to skip the setup of two-factor authentication (in hours). Set to 0 (zero) to enforce at next sign in."
msgstr ""
-msgid "Maximum time that users are allowed to skip the setup of two-factor authentication (in hours). Set to 0 (zero) to enforce at next sign in."
+msgid "Maximum time, in seconds, for a web terminal websocket connection. 0 for unlimited."
+msgstr ""
+
+msgid "Maximum unauthenticated API requests per rate limit period per IP"
+msgstr ""
+
+msgid "Maximum unauthenticated web requests per rate limit period per IP"
msgstr ""
msgid "May"
@@ -20823,9 +21146,6 @@ msgstr ""
msgid "Medium vulnerabilities present"
msgstr ""
-msgid "Member lock"
-msgstr ""
-
msgid "Member since"
msgstr ""
@@ -20862,6 +21182,9 @@ msgstr ""
msgid "Members of a group may only view projects they have permission to access"
msgstr ""
+msgid "Membership"
+msgstr ""
+
msgid "Members|%{time} by %{user}"
msgstr ""
@@ -20922,9 +21245,6 @@ msgstr ""
msgid "Members|Expiration date updated successfully."
msgstr ""
-msgid "Members|Expired"
-msgstr ""
-
msgid "Members|Filter members"
msgstr ""
@@ -20940,9 +21260,6 @@ msgstr ""
msgid "Members|Membership"
msgstr ""
-msgid "Members|No expiration set"
-msgstr ""
-
msgid "Members|Remove \"%{groupName}\""
msgstr ""
@@ -20964,9 +21281,6 @@ msgstr ""
msgid "Members|Search invited"
msgstr ""
-msgid "Members|in %{time}"
-msgstr ""
-
msgid "Member|Deny access"
msgstr ""
@@ -21042,9 +21356,6 @@ msgstr ""
msgid "Merge request %{mr_link} was reviewed by %{mr_author}"
msgstr ""
-msgid "Merge request (MR) approvals"
-msgstr ""
-
msgid "Merge request analytics"
msgstr ""
@@ -21066,12 +21377,21 @@ msgstr ""
msgid "Merge requests"
msgstr ""
+msgid "Merge requests I've created"
+msgstr ""
+
msgid "Merge requests are a place to propose changes you've made to a project and discuss those changes with others"
msgstr ""
msgid "Merge requests are read-only in a secondary Geo node"
msgstr ""
+msgid "Merge requests assigned to me"
+msgstr ""
+
+msgid "Merge requests that I'm a reviewer"
+msgstr ""
+
msgid "Merge the branch and fix any conflicts that come up"
msgstr ""
@@ -21132,10 +21452,10 @@ msgstr ""
msgid "MergeRequests|An error occurred while saving the draft comment."
msgstr ""
-msgid "MergeRequests|Failed to squash. Should be done manually."
+msgid "MergeRequests|Create issue to resolve thread"
msgstr ""
-msgid "MergeRequests|Resolve this thread in a new issue"
+msgid "MergeRequests|Failed to squash. Should be done manually."
msgstr ""
msgid "MergeRequests|Saving the comment failed"
@@ -21949,6 +22269,9 @@ msgstr ""
msgid "MoveIssue|Cannot move issue to project it originates from!"
msgstr ""
+msgid "MoveIssue|Cannot move issues of '%{issue_type}' type."
+msgstr ""
+
msgid "Moved issue to %{label} column in the board."
msgstr ""
@@ -22074,6 +22397,15 @@ 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. To learn more about reducing storage capacity please visit our docs."
msgstr ""
+msgid "NamespaceUserCap|Pending users must be reviewed and approved by a group owner. Learn more about %{user_caps_link_start}User Caps%{link_end} and %{users_pending_approval_link_start}Users Pending Approval%{link_end}."
+msgstr ""
+
+msgid "NamespaceUserCap|View pending user approvals"
+msgstr ""
+
+msgid "NamespaceUserCap|Your group has reached its billable member limit"
+msgstr ""
+
msgid "Namespaces"
msgstr ""
@@ -22116,9 +22448,6 @@ msgstr ""
msgid "Network"
msgstr ""
-msgid "Network Policy|New rule"
-msgstr ""
-
msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is inbound from a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
msgstr ""
@@ -22140,16 +22469,13 @@ msgstr ""
msgid "NetworkPolicies|%{strongOpen}any%{strongClose} port"
msgstr ""
-msgid "NetworkPolicies|+ Add alert"
-msgstr ""
-
msgid "NetworkPolicies|.yaml"
msgstr ""
msgid "NetworkPolicies|.yaml mode"
msgstr ""
-msgid "NetworkPolicies|Actions"
+msgid "NetworkPolicies|Add alert"
msgstr ""
msgid "NetworkPolicies|Alerts are intended to be selectively used for a limited number of events that are potentially concerning and warrant a manual review. Alerts should not be used as a substitute for a SIEM or a logging tool. High volume alerts are likely to be dropped so as to preserve the stability of GitLab's integration with Kubernetes."
@@ -22185,9 +22511,6 @@ msgstr ""
msgid "NetworkPolicies|Deny all traffic"
msgstr ""
-msgid "NetworkPolicies|Description"
-msgstr ""
-
msgid "NetworkPolicies|Edit policy"
msgstr ""
@@ -22200,9 +22523,6 @@ msgstr ""
msgid "NetworkPolicies|IP/subnet"
msgstr ""
-msgid "NetworkPolicies|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
-msgstr ""
-
msgid "NetworkPolicies|Invalid or empty policy"
msgstr ""
@@ -22212,19 +22532,16 @@ msgstr ""
msgid "NetworkPolicies|Kubernetes error: %{error}"
msgstr ""
-msgid "NetworkPolicies|Name"
-msgstr ""
-
msgid "NetworkPolicies|Network"
msgstr ""
-msgid "NetworkPolicies|Network traffic"
+msgid "NetworkPolicies|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
msgstr ""
-msgid "NetworkPolicies|New policy"
+msgid "NetworkPolicies|Network policy can be created after the environment is loaded successfully."
msgstr ""
-msgid "NetworkPolicies|No policies detected"
+msgid "NetworkPolicies|Network traffic"
msgstr ""
msgid "NetworkPolicies|None selected"
@@ -22233,21 +22550,12 @@ msgstr ""
msgid "NetworkPolicies|Please %{installLinkStart}install%{installLinkEnd} and %{configureLinkStart}configure a Kubernetes Agent for this project%{configureLinkEnd} to enable alerts."
msgstr ""
-msgid "NetworkPolicies|Policies are a specification of how groups of pods are allowed to communicate with each other's network endpoints."
-msgstr ""
-
msgid "NetworkPolicies|Policy %{policyName} was successfully changed"
msgstr ""
msgid "NetworkPolicies|Policy definition"
msgstr ""
-msgid "NetworkPolicies|Policy editor"
-msgstr ""
-
-msgid "NetworkPolicies|Policy preview"
-msgstr ""
-
msgid "NetworkPolicies|Rule"
msgstr ""
@@ -22257,9 +22565,6 @@ msgstr ""
msgid "NetworkPolicies|Rule mode is unavailable for this policy. In some cases, we cannot parse the YAML file back into the rules editor."
msgstr ""
-msgid "NetworkPolicies|Rules"
-msgstr ""
-
msgid "NetworkPolicies|Save changes"
msgstr ""
@@ -22272,9 +22577,6 @@ msgstr ""
msgid "NetworkPolicies|Traffic that does not match any rule will be blocked."
msgstr ""
-msgid "NetworkPolicies|Unable to parse policy"
-msgstr ""
-
msgid "NetworkPolicies|all DNS names"
msgstr ""
@@ -22454,6 +22756,9 @@ msgstr ""
msgid "New issue"
msgstr ""
+msgid "New issue in %{project}"
+msgstr ""
+
msgid "New issue title"
msgstr ""
@@ -22532,7 +22837,7 @@ msgstr ""
msgid "Newest first"
msgstr ""
-msgid "Newly registered users will by default be external"
+msgid "Newly-registered users are external by default"
msgstr ""
msgid "Next"
@@ -22847,8 +23152,10 @@ msgstr ""
msgid "No webhooks found, add one in the form above."
msgstr ""
-msgid "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} to renew your subscription."
-msgstr ""
+msgid "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} day to renew your subscription."
+msgid_plural "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} days to renew your subscription."
+msgstr[0] ""
+msgstr[1] ""
msgid "No. of commits"
msgstr ""
@@ -22865,7 +23172,7 @@ msgstr ""
msgid "Nodes"
msgstr ""
-msgid "Non-admin users can sign in with read-only access and make read-only API requests."
+msgid "Non-admin users are restricted to read-only access, in both GitLab UI and API."
msgstr ""
msgid "None"
@@ -22946,7 +23253,7 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
-msgid "Notes Rate Limits"
+msgid "Notes rate limit"
msgstr ""
msgid "Notes|Are you sure you want to cancel creating this comment?"
@@ -23113,9 +23420,6 @@ msgstr ""
msgid "November"
msgstr ""
-msgid "Novice"
-msgstr ""
-
msgid "Now, personalize your GitLab experience"
msgstr ""
@@ -23284,7 +23588,7 @@ msgstr ""
msgid "OnCallSchedules|For this rotation, on-call will be:"
msgstr ""
-msgid "OnCallSchedules|On-call schedule %{schedule} in Project %{project}"
+msgid "OnCallSchedules|On-call schedule %{obstacle} in Project %{project}"
msgstr ""
msgid "OnCallSchedules|On-call schedules"
@@ -23431,22 +23735,22 @@ msgstr ""
msgid "OnDemandScans|Scanner profile"
msgstr ""
-msgid "OnDemandScans|Select one of the existing profiles"
+msgid "OnDemandScans|Schedule scan"
msgstr ""
-msgid "OnDemandScans|Site profile"
+msgid "OnDemandScans|Select one of the existing profiles"
msgstr ""
-msgid "OnDemandScans|Use existing scanner profile"
+msgid "OnDemandScans|Site profile"
msgstr ""
-msgid "OnDemandScans|Use existing site profile"
+msgid "OnDemandScans|Start time"
msgstr ""
-msgid "OnDemandScans|You can either choose a passive scan or validate the target site in your chosen site profile. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
+msgid "OnDemandScans|Use existing scanner profile"
msgstr ""
-msgid "OnDemandScans|You cannot run an active scan against an unvalidated site."
+msgid "OnDemandScans|Use existing site profile"
msgstr ""
msgid "OnDemandScans|You must create a repository within your project to run an on-demand scan."
@@ -23511,6 +23815,9 @@ msgstr ""
msgid "Only admins can delete project"
msgstr ""
+msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
+msgstr ""
+
msgid "Only include features new to your current subscription tier."
msgstr ""
@@ -23529,6 +23836,12 @@ msgstr ""
msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
+msgid "Only reCAPTCHA v2 is supported:"
+msgstr ""
+
+msgid "Only users from the specified IP address ranges are able to reach this group, including all subgroups, projects, and Git repositories."
+msgstr ""
+
msgid "Only verified users with an email address in any of these domains can be added to the group."
msgstr ""
@@ -23715,9 +24028,6 @@ msgstr ""
msgid "Package Registry"
msgstr ""
-msgid "Package Registry Rate Limits"
-msgstr ""
-
msgid "Package Registry: authenticated API requests"
msgstr ""
@@ -23736,6 +24046,9 @@ msgstr ""
msgid "Package recipe already exists"
msgstr ""
+msgid "Package registry rate limits"
+msgstr ""
+
msgid "Package type"
msgstr ""
@@ -23802,6 +24115,9 @@ msgstr ""
msgid "PackageRegistry|Composer"
msgstr ""
+msgid "PackageRegistry|Composer.json with license: %{license} and version: %{version}"
+msgstr ""
+
msgid "PackageRegistry|Conan"
msgstr ""
@@ -23865,6 +24181,9 @@ msgstr ""
msgid "PackageRegistry|Copy require package include"
msgstr ""
+msgid "PackageRegistry|Copy target SHA"
+msgstr ""
+
msgid "PackageRegistry|Copy yarn command"
msgstr ""
@@ -23931,6 +24250,9 @@ msgstr ""
msgid "PackageRegistry|Install package version"
msgstr ""
+msgid "PackageRegistry|Instance-level"
+msgstr ""
+
msgid "PackageRegistry|Invalid Package: failed metadata extraction"
msgstr ""
@@ -23976,6 +24298,9 @@ msgstr ""
msgid "PackageRegistry|Pip Command"
msgstr ""
+msgid "PackageRegistry|Project-level"
+msgstr ""
+
msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
msgstr ""
@@ -23997,6 +24322,9 @@ msgstr ""
msgid "PackageRegistry|Remove package"
msgstr ""
+msgid "PackageRegistry|Required Python: %{pythonVersion}"
+msgstr ""
+
msgid "PackageRegistry|RubyGems"
msgstr ""
@@ -24039,6 +24367,9 @@ msgstr ""
msgid "PackageRegistry|Source project located at %{link}"
msgstr ""
+msgid "PackageRegistry|Target SHA: %{sha}"
+msgstr ""
+
msgid "PackageRegistry|There are no other versions of this package."
msgstr ""
@@ -24207,6 +24538,18 @@ msgstr ""
msgid "Password was successfully updated. Please sign in again."
msgstr ""
+msgid "PasswordPrompt|Confirm password"
+msgstr ""
+
+msgid "PasswordPrompt|Confirm password to continue"
+msgstr ""
+
+msgid "PasswordPrompt|Password is required"
+msgstr ""
+
+msgid "PasswordPrompt|Please enter your password to confirm"
+msgstr ""
+
msgid "Passwords should be unique and not used for any other sites or services."
msgstr ""
@@ -24234,6 +24577,9 @@ msgstr ""
msgid "Paste project path (i.e. gitlab-org/gitlab)"
msgstr ""
+msgid "Paste this DSN into your Sentry SDK"
+msgstr ""
+
msgid "Paste your public SSH key, which is usually contained in the file '~/.ssh/id_ed25519.pub' or '~/.ssh/id_rsa.pub' and begins with 'ssh-ed25519' or 'ssh-rsa'. Do not paste your private SSH key, as that can compromise your identity."
msgstr ""
@@ -24318,6 +24664,9 @@ msgstr ""
msgid "PerformanceBar|First Contentful Paint"
msgstr ""
+msgid "PerformanceBar|Flamegraph with mode:"
+msgstr ""
+
msgid "PerformanceBar|Frontend resources"
msgstr ""
@@ -24351,6 +24700,15 @@ msgstr ""
msgid "PerformanceBar|Trace"
msgstr ""
+msgid "PerformanceBar|cpu"
+msgstr ""
+
+msgid "PerformanceBar|object"
+msgstr ""
+
+msgid "PerformanceBar|wall"
+msgstr ""
+
msgid "Period in seconds"
msgstr ""
@@ -24579,6 +24937,48 @@ msgstr ""
msgid "PipelineSchedules|Variables"
msgstr ""
+msgid "PipelineSource|API"
+msgstr ""
+
+msgid "PipelineSource|Chat"
+msgstr ""
+
+msgid "PipelineSource|External"
+msgstr ""
+
+msgid "PipelineSource|External Pull Request"
+msgstr ""
+
+msgid "PipelineSource|Merge Request"
+msgstr ""
+
+msgid "PipelineSource|On-Demand DAST Scan"
+msgstr ""
+
+msgid "PipelineSource|On-Demand DAST Validation"
+msgstr ""
+
+msgid "PipelineSource|Parent Pipeline"
+msgstr ""
+
+msgid "PipelineSource|Pipeline"
+msgstr ""
+
+msgid "PipelineSource|Push"
+msgstr ""
+
+msgid "PipelineSource|Schedule"
+msgstr ""
+
+msgid "PipelineSource|Trigger"
+msgstr ""
+
+msgid "PipelineSource|Web"
+msgstr ""
+
+msgid "PipelineSource|Web IDE"
+msgstr ""
+
msgid "PipelineStatusTooltip|Pipeline: %{ciStatus}"
msgstr ""
@@ -24879,46 +25279,7 @@ msgstr ""
msgid "Pipeline|Source"
msgstr ""
-msgid "Pipeline|Source|API"
-msgstr ""
-
-msgid "Pipeline|Source|Chat"
-msgstr ""
-
-msgid "Pipeline|Source|External"
-msgstr ""
-
-msgid "Pipeline|Source|External Pull Request"
-msgstr ""
-
-msgid "Pipeline|Source|Merge Request"
-msgstr ""
-
-msgid "Pipeline|Source|On-Demand DAST Scan"
-msgstr ""
-
-msgid "Pipeline|Source|On-Demand DAST Validation"
-msgstr ""
-
-msgid "Pipeline|Source|Parent Pipeline"
-msgstr ""
-
-msgid "Pipeline|Source|Pipeline"
-msgstr ""
-
-msgid "Pipeline|Source|Push"
-msgstr ""
-
-msgid "Pipeline|Source|Schedule"
-msgstr ""
-
-msgid "Pipeline|Source|Trigger"
-msgstr ""
-
-msgid "Pipeline|Source|Web"
-msgstr ""
-
-msgid "Pipeline|Source|Web IDE"
+msgid "Pipeline|Source|Security Policy"
msgstr ""
msgid "Pipeline|Specify variable values to be used in this run. The values specified in %{linkStart}CI/CD settings%{linkEnd} will be used by default."
@@ -24969,7 +25330,7 @@ msgstr ""
msgid "Pipeline|We are currently unable to fetch pipeline data"
msgstr ""
-msgid "Pipeline|You’re about to stop pipeline %{pipelineId}."
+msgid "Pipeline|You’re about to stop pipeline #%{pipelineId}."
msgstr ""
msgid "Pipeline|for"
@@ -24996,6 +25357,9 @@ msgstr ""
msgid "Plain diff"
msgstr ""
+msgid "Plain-text response to send to clients that hit a rate limit"
+msgstr ""
+
msgid "Plan:"
msgstr ""
@@ -25140,9 +25504,6 @@ msgstr ""
msgid "Please provide attributes to update"
msgstr ""
-msgid "Please provide your username or email address."
-msgstr ""
-
msgid "Please reach out if you have any questions and we'll be happy to assist."
msgstr ""
@@ -25185,9 +25546,6 @@ msgstr ""
msgid "Please set a new password before proceeding."
msgstr ""
-msgid "Please share your feedback about %{featureName} %{linkStart}in this issue%{linkEnd} to help us improve the experience."
-msgstr ""
-
msgid "Please solve the captcha"
msgstr ""
@@ -25365,6 +25723,9 @@ msgstr ""
msgid "Prevent adding new members to project membership within this group"
msgstr ""
+msgid "Prevent auto-stopping"
+msgstr ""
+
msgid "Prevent editing approval rules in projects and merge requests."
msgstr ""
@@ -25377,7 +25738,7 @@ msgstr ""
msgid "Prevent users from changing their profile name"
msgstr ""
-msgid "Prevent users from performing write operations on GitLab while performing maintenance."
+msgid "Prevent users from performing write operations while GitLab maintenance is in progress."
msgstr ""
msgid "Preview"
@@ -25650,6 +26011,9 @@ msgstr ""
msgid "Profiles|Enter your name, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Enter your password to confirm the email change"
+msgstr ""
+
msgid "Profiles|Enter your pronouns to let people know how to refer to you"
msgstr ""
@@ -25884,10 +26248,10 @@ msgstr ""
msgid "Profiles|e.g. My MacBook key"
msgstr ""
-msgid "Profiles|username"
+msgid "Profiles|https://website.com"
msgstr ""
-msgid "Profiles|website.com"
+msgid "Profiles|username"
msgstr ""
msgid "Profiles|your account"
@@ -26130,9 +26494,21 @@ msgstr ""
msgid "ProjectSelect| or group"
msgstr ""
+msgid "ProjectSelect|No matching results"
+msgstr ""
+
msgid "ProjectSelect|Search for project"
msgstr ""
+msgid "ProjectSelect|Search projects"
+msgstr ""
+
+msgid "ProjectSelect|Select a project"
+msgstr ""
+
+msgid "ProjectSelect|There was an error fetching the projects. Please try again."
+msgstr ""
+
msgid "ProjectService|Drone server URL"
msgstr ""
@@ -26220,6 +26596,9 @@ msgstr ""
msgid "ProjectService|Trigger event when a new, unique alert is recorded."
msgstr ""
+msgid "ProjectService|Trigger event when a new, unique vulnerability is recorded. (Note: This feature requires an Ultimate plan.)"
+msgstr ""
+
msgid "ProjectService|Trigger event when a pipeline status changes."
msgstr ""
@@ -26634,9 +27013,15 @@ msgstr ""
msgid "Projects are graded based on the highest severity vulnerability present"
msgstr ""
+msgid "Projects are organized into groups"
+msgstr ""
+
msgid "Projects contributed to"
msgstr ""
+msgid "Projects help you organize your work. They contain your file repository, issues, merge requests, and so much more."
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr ""
@@ -26871,10 +27256,10 @@ msgstr ""
msgid "PrometheusService|Prometheus cluster integration"
msgstr ""
-msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
+msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
msgstr ""
-msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
+msgid "PrometheusService|The ID of the IAP-secured resource."
msgstr ""
msgid "PrometheusService|The Prometheus API base URL."
@@ -27492,6 +27877,9 @@ msgstr ""
msgid "Rate limit"
msgstr ""
+msgid "Rate limits can help reduce request volume (like from crawlers or abusive bots)."
+msgstr ""
+
msgid "Raw blob request rate limit per minute"
msgstr ""
@@ -27504,6 +27892,9 @@ msgstr ""
msgid "Re-authentication required"
msgstr ""
+msgid "Re-import"
+msgstr ""
+
msgid "Re-request review"
msgstr ""
@@ -27525,6 +27916,9 @@ msgstr ""
msgid "Read more about related issues"
msgstr ""
+msgid "Read their documentation."
+msgstr ""
+
msgid "Ready to get started with GitLab? Follow these steps to set up your workspace, plan and commit changes, and deploy your project."
msgstr ""
@@ -27558,6 +27952,9 @@ msgstr ""
msgid "Receive any notifications from GitLab."
msgstr ""
+msgid "Receive notification of abuse reports by email."
+msgstr ""
+
msgid "Receive notifications about your own activity"
msgstr ""
@@ -27701,9 +28098,6 @@ msgstr ""
msgid "Registry setup"
msgstr ""
-msgid "Regulate approvals by authors/committers. Affects all projects."
-msgstr ""
-
msgid "Reindexing Status: %{status} (Slice multiplier: %{multiplier}, Maximum running slices: %{max_slices})"
msgstr ""
@@ -27799,6 +28193,9 @@ msgstr ""
msgid "Release|Something went wrong while saving the release details."
msgstr ""
+msgid "Reload page"
+msgstr ""
+
msgid "Remediations"
msgstr ""
@@ -28081,6 +28478,9 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
+msgid "Repeats"
+msgstr ""
+
msgid "Replace"
msgstr ""
@@ -28443,10 +28843,7 @@ msgstr ""
msgid "Require additional authentication for administrative tasks."
msgstr ""
-msgid "Require all users in this group to setup Two-factor authentication"
-msgstr ""
-
-msgid "Require all users in this group to setup two-factor authentication"
+msgid "Require all users in this group to set up two-factor authentication"
msgstr ""
msgid "Required approvals (%{approvals_given} given)"
@@ -28492,6 +28889,9 @@ msgstr[1] ""
msgid "Requires values to meet regular expression requirements."
msgstr ""
+msgid "Requires you to deploy or set up cloud-hosted Sentry."
+msgstr ""
+
msgid "Requires your primary GitLab email address."
msgstr ""
@@ -28552,9 +28952,6 @@ msgstr ""
msgid "Resolve"
msgstr ""
-msgid "Resolve all threads in new issue"
-msgstr ""
-
msgid "Resolve conflicts"
msgstr ""
@@ -28612,6 +29009,9 @@ msgstr ""
msgid "Response text"
msgstr ""
+msgid "Restart GitLab to apply changes."
+msgstr ""
+
msgid "Restart Terminal"
msgstr ""
@@ -28630,6 +29030,9 @@ msgstr ""
msgid "Restoring the project will prevent the project from being removed on this date and restore people's ability to make changes to it."
msgstr ""
+msgid "Restrict group access by IP address. %{link_start}Learn more%{link_end}."
+msgstr ""
+
msgid "Restrict membership by email domain"
msgstr ""
@@ -28943,6 +29346,9 @@ msgstr ""
msgid "Runners|Runner #%{runner_id}"
msgstr ""
+msgid "Runners|Runner assigned to project."
+msgstr ""
+
msgid "Runners|Runner is offline, last contact was %{runner_contact} ago"
msgstr ""
@@ -28955,6 +29361,9 @@ msgstr ""
msgid "Runners|Runner registration"
msgstr ""
+msgid "Runners|Runner unassigned from project."
+msgstr ""
+
msgid "Runners|Runners"
msgstr ""
@@ -29147,7 +29556,7 @@ msgstr ""
msgid "SastEntryPoints|How do I set up SAST?"
msgstr ""
-msgid "SastEntryPoints|Learn more."
+msgid "SastEntryPoints|Learn more"
msgstr ""
msgid "Satisfied"
@@ -29189,7 +29598,7 @@ msgstr ""
msgid "Save pipeline schedule"
msgstr ""
-msgid "Save space and find images in the container Registry. remove unneeded tags and keep only the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
+msgid "Save storage space by automatically deleting tags from the container registry and keeping the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
msgstr ""
msgid "Saving"
@@ -29363,6 +29772,9 @@ msgstr ""
msgid "Search or filter results…"
msgstr ""
+msgid "Search or jump to..."
+msgstr ""
+
msgid "Search project"
msgstr ""
@@ -29423,16 +29835,16 @@ msgstr ""
msgid "SearchCodeResults|of %{link_to_project}"
msgstr ""
-msgid "SearchResults|Showing %{count} %{scope} for%{term_element}"
+msgid "SearchResults|Showing %{count} %{scope} for %{term_element}"
msgstr ""
-msgid "SearchResults|Showing %{count} %{scope} for%{term_element} in your personal and project snippets"
+msgid "SearchResults|Showing %{count} %{scope} for %{term_element} in your personal and project snippets"
msgstr ""
-msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for%{term_element}"
+msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for %{term_element}"
msgstr ""
-msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for%{term_element} in your personal and project snippets"
+msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for %{term_element} in your personal and project snippets"
msgstr ""
msgid "SearchResults|code result"
@@ -29514,6 +29926,9 @@ msgstr ""
msgid "Secret Detection"
msgstr ""
+msgid "Secret access key"
+msgstr ""
+
msgid "Secret token"
msgstr ""
@@ -29553,9 +29968,6 @@ msgstr ""
msgid "SecurityApprovals|A merge request approval is required when the license compliance report contains a denied license."
msgstr ""
-msgid "SecurityApprovals|Configurable if security scanners are enabled. %{linkStart}Learn more.%{linkEnd}"
-msgstr ""
-
msgid "SecurityApprovals|Coverage-Check"
msgstr ""
@@ -29568,24 +29980,18 @@ msgstr ""
msgid "SecurityApprovals|Learn more about Vulnerability-Check"
msgstr ""
-msgid "SecurityApprovals|License Scanning must be enabled. %{linkStart}Learn more%{linkEnd}."
-msgstr ""
-
msgid "SecurityApprovals|License-Check"
msgstr ""
msgid "SecurityApprovals|Requires approval for Denied licenses. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}More information%{linkEnd}"
+msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "SecurityApprovals|Requires approval for vulnerabilities. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
-msgid "SecurityApprovals|Test coverage must be enabled. %{linkStart}Learn more%{linkEnd}."
-msgstr ""
-
msgid "SecurityApprovals|Vulnerability-Check"
msgstr ""
@@ -29649,6 +30055,12 @@ msgstr ""
msgid "SecurityConfiguration|Immediately begin risk analysis and remediation with application security features. Start with SAST and Secret Detection, available to all plans. Upgrade to Ultimate to get all features, including:"
msgstr ""
+msgid "SecurityConfiguration|Manage corpus"
+msgstr ""
+
+msgid "SecurityConfiguration|Manage corpus files used as mutation sources in coverage fuzzing."
+msgstr ""
+
msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
msgstr ""
@@ -29703,6 +30115,12 @@ msgstr ""
msgid "SecurityOrchestration|Action"
msgstr ""
+msgid "SecurityOrchestration|Actions"
+msgstr ""
+
+msgid "SecurityOrchestration|Add rule"
+msgstr ""
+
msgid "SecurityOrchestration|All policies"
msgstr ""
@@ -29736,9 +30154,6 @@ msgstr ""
msgid "SecurityOrchestration|Network"
msgstr ""
-msgid "SecurityOrchestration|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
-msgstr ""
-
msgid "SecurityOrchestration|New policy"
msgstr ""
@@ -29754,6 +30169,9 @@ msgstr ""
msgid "SecurityOrchestration|Policy editor"
msgstr ""
+msgid "SecurityOrchestration|Policy preview"
+msgstr ""
+
msgid "SecurityOrchestration|Policy status"
msgstr ""
@@ -29763,6 +30181,9 @@ msgstr ""
msgid "SecurityOrchestration|Rule"
msgstr ""
+msgid "SecurityOrchestration|Rules"
+msgstr ""
+
msgid "SecurityOrchestration|Scan Execution"
msgstr ""
@@ -29856,6 +30277,9 @@ msgstr ""
msgid "SecurityReports|Create issue"
msgstr ""
+msgid "SecurityReports|Development vulnerabilities"
+msgstr ""
+
msgid "SecurityReports|Dismiss vulnerability"
msgstr ""
@@ -29871,6 +30295,9 @@ msgstr ""
msgid "SecurityReports|Download results"
msgstr ""
+msgid "SecurityReports|Download scanned URLs"
+msgstr ""
+
msgid "SecurityReports|Download scanned resources"
msgstr ""
@@ -29994,6 +30421,9 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
+msgid "SecurityReports|The Vulnerability Report shows the results of the lastest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "SecurityReports|The security reports below contain one or more vulnerability findings that could not be parsed and were not recorded. Download the artifacts in the job output to investigate. Ensure any security report created conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
msgstr ""
@@ -30135,10 +30565,10 @@ msgstr ""
msgid "Select a repository"
msgstr ""
-msgid "Select a role"
+msgid "Select a repository containing templates for common files."
msgstr ""
-msgid "Select a shared template repository for all projects on this instance."
+msgid "Select a role"
msgstr ""
msgid "Select a template repository"
@@ -30216,6 +30646,9 @@ msgstr ""
msgid "Select project to choose zone"
msgstr ""
+msgid "Select project to create issue"
+msgstr ""
+
msgid "Select projects"
msgstr ""
@@ -30333,6 +30766,9 @@ msgstr ""
msgid "Send emails to help guide new users through the onboarding process."
msgstr ""
+msgid "Send emails to users upon account deactivation."
+msgstr ""
+
msgid "Send message"
msgstr ""
@@ -30351,6 +30787,9 @@ msgstr ""
msgid "Send service data"
msgstr ""
+msgid "Sentry"
+msgstr ""
+
msgid "Sentry API URL"
msgstr ""
@@ -30465,6 +30904,9 @@ msgstr ""
msgid "Service"
msgstr ""
+msgid "Service Accounts keys are required to authorize GitLab to deploy your Google Cloud project."
+msgstr ""
+
msgid "Service Desk"
msgstr ""
@@ -30537,15 +30979,15 @@ msgstr ""
msgid "Set a password on your account to pull or push via %{protocol}."
msgstr ""
-msgid "Set a template repository for projects in this group"
-msgstr ""
-
msgid "Set access permissions for this token."
msgstr ""
msgid "Set an instance-wide domain that will be available to all clusters when installing Knative."
msgstr ""
+msgid "Set any rate limit to %{code_open}0%{code_close} to disable the limit."
+msgstr ""
+
msgid "Set default and restrict visibility levels. Configure import sources and git access protocol."
msgstr ""
@@ -30558,7 +31000,7 @@ msgstr ""
msgid "Set limit to 0 to allow any file size."
msgstr ""
-msgid "Set max session time for web terminal."
+msgid "Set limits for web and API requests."
msgstr ""
msgid "Set milestone"
@@ -30567,15 +31009,18 @@ msgstr ""
msgid "Set new password"
msgstr ""
-msgid "Set notification email for abuse reports."
+msgid "Set parent epic to an epic"
msgstr ""
-msgid "Set parent epic to an epic"
+msgid "Set per-user rate limits for imports and exports of projects and groups."
msgstr ""
msgid "Set projects and maximum size limits, session duration, user options, and check feature availability for namespace plan."
msgstr ""
+msgid "Set rate limits for package registry API requests that supersede the general user and IP rate limits."
+msgstr ""
+
msgid "Set severity"
msgstr ""
@@ -30594,15 +31039,24 @@ msgstr ""
msgid "Set the default branch for this project. All merge requests and commits are made against this branch unless you specify a different one."
msgstr ""
+msgid "Set the default expiration time for job artifacts in all projects. Set to %{code_open}0%{code_close} to never expire artifacts by default. If no unit is written, it defaults to seconds. For example, these are all equivalent: %{code_open}3600%{code_close}, %{code_open}60 minutes%{code_close}, or %{code_open}one hour%{code_close}."
+msgstr ""
+
msgid "Set the due date to %{due_date}."
msgstr ""
msgid "Set the iteration to %{iteration_reference}."
msgstr ""
+msgid "Set the maximum session time for a web terminal."
+msgstr ""
+
msgid "Set the milestone to %{milestone_reference}."
msgstr ""
+msgid "Set the per-user rate limit for notes created by web or API requests."
+msgstr ""
+
msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
msgstr ""
@@ -30804,6 +31258,9 @@ msgstr ""
msgid "Show Pipeline IID"
msgstr ""
+msgid "Show all %{issuable_type}."
+msgstr ""
+
msgid "Show all activity"
msgstr ""
@@ -30855,15 +31312,9 @@ msgstr ""
msgid "Show list"
msgstr ""
-msgid "Show me advanced features"
-msgstr ""
-
msgid "Show me how to add a pipeline"
msgstr ""
-msgid "Show me the basics"
-msgstr ""
-
msgid "Show one file at a time"
msgstr ""
@@ -30904,15 +31355,15 @@ msgstr ""
msgid "Showing %{pageSize} of %{total} %{issuableType}"
msgstr ""
-msgid "Showing %{pageSize} of %{total} issues"
-msgstr ""
-
msgid "Showing all epics"
msgstr ""
msgid "Showing all issues"
msgstr ""
+msgid "Showing data for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
+msgstr ""
+
msgid "Showing data for workflow items created in this date range. Date range cannot exceed %{maxDateRange} days."
msgstr ""
@@ -30952,6 +31403,15 @@ msgstr ""
msgid "Sidebar|Weight"
msgstr ""
+msgid "Sidekiq job compression threshold (bytes)"
+msgstr ""
+
+msgid "Sidekiq job size limit (bytes)"
+msgstr ""
+
+msgid "Sidekiq job size limits"
+msgstr ""
+
msgid "Sign in"
msgstr ""
@@ -31072,6 +31532,9 @@ msgstr ""
msgid "Site profile not found for given parameters"
msgstr ""
+msgid "Sites"
+msgstr ""
+
msgid "Size"
msgstr ""
@@ -31102,19 +31565,22 @@ msgstr ""
msgid "SlackIntegration|Sends notifications about project events to Slack channels."
msgstr ""
-msgid "SlackService|2. Paste the %{strong_open}Token%{strong_close} into the field below"
+msgid "SlackService|1. %{slash_command_link_start}Add a slash command%{slash_command_link_end} in your Slack team using this information:"
msgstr ""
-msgid "SlackService|3. Select the %{strong_open}Active%{strong_close} checkbox, press %{strong_open}Save changes%{strong_close} and start using GitLab inside Slack!"
+msgid "SlackService|2. Paste the token from Slack in the %{strong_open}Token%{strong_close} field below."
msgstr ""
-msgid "SlackService|Fill in the word that works best for your team."
+msgid "SlackService|3. Select the %{strong_open}Active%{strong_close} checkbox, select %{strong_open}Save changes%{strong_close}, and start using slash commands in Slack!"
+msgstr ""
+
+msgid "SlackService|After setup, get a list of available Slack slash commands by entering"
msgstr ""
-msgid "SlackService|See list of available commands in Slack after setting up this service, by entering"
+msgid "SlackService|Fill in the word that works best for your team."
msgstr ""
-msgid "SlackService|This service allows users to perform common operations on this project by entering slash commands in Slack."
+msgid "SlackService|Perform common operations in this project by entering slash commands in Slack."
msgstr ""
msgid "Slice multiplier"
@@ -31180,7 +31646,7 @@ msgstr ""
msgid "Some child epics may be hidden due to applied filters"
msgstr ""
-msgid "Some common domains are not allowed. %{read_more_link}."
+msgid "Some common domains are not allowed. %{learn_more_link}."
msgstr ""
msgid "Some of the designs you tried uploading did not change:"
@@ -31264,9 +31730,6 @@ msgstr ""
msgid "Something went wrong while exporting requirements"
msgstr ""
-msgid "Something went wrong while fetching %{listType} list"
-msgstr ""
-
msgid "Something went wrong while fetching branches"
msgstr ""
@@ -31321,15 +31784,9 @@ msgstr ""
msgid "Something went wrong while merging this merge request. Please try again."
msgstr ""
-msgid "Something went wrong while moving issues."
-msgstr ""
-
msgid "Something went wrong while obtaining the Let's Encrypt certificate."
msgstr ""
-msgid "Something went wrong while performing the action."
-msgstr ""
-
msgid "Something went wrong while promoting the issue to an epic. Please try again."
msgstr ""
@@ -31657,7 +32114,10 @@ msgstr ""
msgid "SourcegraphPreferences|Uses a custom %{linkStart}Sourcegraph instance%{linkEnd}."
msgstr ""
-msgid "Spam Check API Key"
+msgid "Spam Check"
+msgstr ""
+
+msgid "Spam Check API key"
msgstr ""
msgid "Spam Logs"
@@ -31675,7 +32135,7 @@ msgstr ""
msgid "Specified URL cannot be used: \"%{reason}\""
msgstr ""
-msgid "Specify an e-mail address regex pattern to identify default internal users."
+msgid "Specify an email address regex pattern to identify default internal users."
msgstr ""
msgid "Speed up your pipelines with Needs relationships"
@@ -31930,7 +32390,7 @@ msgstr ""
msgid "StatusCheck|An error occurred fetching the status checks."
msgstr ""
-msgid "StatusCheck|Apply this status check to any branch or a specific protected branch."
+msgid "StatusCheck|Apply this status check to all branches or a specific protected branch."
msgstr ""
msgid "StatusCheck|Check for a status response in Merge Requests. Failures do not block merges. %{link_start}Learn more%{link_end}."
@@ -32269,6 +32729,9 @@ msgstr ""
msgid "Subscriptions"
msgstr ""
+msgid "Subscription|Your subscription for %{strong}%{namespace_name}%{strong_close} has expired and you are now on %{pricing_link_start}the GitLab Free tier%{pricing_link_end}. Don't worry, your data is safe. Get in touch with our support team (%{support_email}). They'll gladly help with your subscription renewal."
+msgstr ""
+
msgid "Subtracted"
msgstr ""
@@ -32497,6 +32960,9 @@ msgstr ""
msgid "SuperSonics|Plan"
msgstr ""
+msgid "SuperSonics|Please agree to the Subscription Agreement"
+msgstr ""
+
msgid "SuperSonics|Ready to get started? A GitLab plan is ideal for scaling organizations and for multi team usage."
msgstr ""
@@ -32527,6 +32993,9 @@ msgstr ""
msgid "SuperSonics|The activation code is not valid. Please make sure to copy it exactly from the Customers Portal or confirmation email. Learn more about %{linkStart}activating your subscription%{linkEnd}."
msgstr ""
+msgid "SuperSonics|The activation code should be a 24-character alphanumeric string"
+msgstr ""
+
msgid "SuperSonics|There is a connectivity issue."
msgstr ""
@@ -32569,9 +33038,15 @@ msgstr ""
msgid "SuperSonics|You do not have an active subscription"
msgstr ""
+msgid "SuperSonics|You have successfully added a license that activates on %{date}. Please see the subscription history table below for more details."
+msgstr ""
+
msgid "SuperSonics|You'll be charged for %{trueUpLinkStart}users over license%{trueUpLinkEnd} on a quarterly or annual basis, depending on the terms of your agreement."
msgstr ""
+msgid "SuperSonics|Your future dated license was successfully added"
+msgstr ""
+
msgid "SuperSonics|Your subscription"
msgstr ""
@@ -32824,7 +33299,7 @@ msgstr ""
msgid "Template to append to all Service Desk issues"
msgstr ""
-msgid "TemplateRepository|Select a repository to make its templates available to all projects. %{link_start}What should the repository contain?%{link_end} "
+msgid "TemplateRepository|Create common files more quickly, and standardize their format."
msgstr ""
msgid "Templates"
@@ -33030,7 +33505,7 @@ msgstr ""
msgid "TestCases|Search test cases"
msgstr ""
-msgid "TestCases|Something went wrong while adding test case to Todo."
+msgid "TestCases|Something went wrong while adding test case to a to-do item."
msgstr ""
msgid "TestCases|Something went wrong while creating a test case."
@@ -33042,7 +33517,7 @@ msgstr ""
msgid "TestCases|Something went wrong while fetching test cases list."
msgstr ""
-msgid "TestCases|Something went wrong while marking test case todo as done."
+msgid "TestCases|Something went wrong while marking test case to-do item as done."
msgstr ""
msgid "TestCases|Something went wrong while moving test case."
@@ -33162,7 +33637,7 @@ msgstr ""
msgid "Thanks for your purchase!"
msgstr ""
-msgid "That is ok, I do not want to renew"
+msgid "That's OK, I don't want to renew"
msgstr ""
msgid "That's it, well done!"
@@ -33185,7 +33660,7 @@ msgid_plural "The %{type} contains the following errors:"
msgstr[0] ""
msgstr[1] ""
-msgid "The API key used by GitLab for accessing the Spam Check service endpoint"
+msgid "The API key used by GitLab for accessing the Spam Check service endpoint."
msgstr ""
msgid "The GitLab subscription service (customers.gitlab.com) is currently experiencing an outage. You can monitor the status and get updates at %{linkStart}status.gitlab.com%{linkEnd}."
@@ -33224,9 +33699,6 @@ msgstr ""
msgid "The URL to use for connecting to Elasticsearch. Use a comma-separated list to support clustering (e.g., \"http://localhost:9200, http://localhost:9201\")."
msgstr ""
-msgid "The Vulnerability Report shows the results of the last successful pipeline run on the default branch."
-msgstr ""
-
msgid "The X509 Certificate to use when mutual TLS is required to communicate with the external authorization service. If left blank, the server certificate is still validated when accessing over HTTPS."
msgstr ""
@@ -33284,9 +33756,6 @@ msgstr ""
msgid "The default branch for this project has been changed. Please update your bookmarks."
msgstr ""
-msgid "The default expiration time for job artifacts. 0 for unlimited. The default unit is in seconds, but you can use other units, for example %{code_open}4 mins 2 sec%{code_close}, %{code_open}2h42min%{code_close}."
-msgstr ""
-
msgid "The dependency list details information about the components used within your project."
msgstr ""
@@ -33478,9 +33947,6 @@ msgstr ""
msgid "The merge conflicts for this merge request have already been resolved. Please return to the merge request."
msgstr ""
-msgid "The merge request can now be merged."
-msgstr ""
-
msgid "The metric must be one of %{metrics}."
msgstr ""
@@ -33856,7 +34322,7 @@ msgstr ""
msgid "There was a problem updating the keep latest artifacts setting."
msgstr ""
-msgid "There was an error %{message} todo."
+msgid "There was an error %{message} to-do item."
msgstr ""
msgid "There was an error adding a To Do."
@@ -33895,6 +34361,9 @@ msgstr ""
msgid "There was an error fetching projects"
msgstr ""
+msgid "There was an error fetching search autocomplete suggestions"
+msgstr ""
+
msgid "There was an error fetching stage total counts"
msgstr ""
@@ -34219,6 +34688,9 @@ msgstr ""
msgid "This field is required."
msgstr ""
+msgid "This form is disabled in preview"
+msgstr ""
+
msgid "This group"
msgstr ""
@@ -34240,9 +34712,6 @@ msgstr ""
msgid "This group is linked to a subscription"
msgstr ""
-msgid "This group, including all subgroups, projects and git repositories, will be reachable from only the specified IP address ranges."
-msgstr ""
-
msgid "This group, its subgroups and projects has been scheduled for removal on %{date}."
msgstr ""
@@ -34522,9 +34991,6 @@ msgstr ""
msgid "This user cannot be unlocked manually from GitLab"
msgstr ""
-msgid "This user does not have a pending request"
-msgstr ""
-
msgid "This user has an unconfirmed email address (%{email}). You may force a confirmation."
msgstr ""
@@ -34633,9 +35099,6 @@ msgstr ""
msgid "ThreatMonitoring|Packet Activity"
msgstr ""
-msgid "ThreatMonitoring|Policies"
-msgstr ""
-
msgid "ThreatMonitoring|Requests"
msgstr ""
@@ -34687,6 +35150,12 @@ msgstr ""
msgid "ThreatMonitoring|View documentation"
msgstr ""
+msgid "Threshold in bytes at which to compress Sidekiq job arguments."
+msgstr ""
+
+msgid "Threshold in bytes at which to reject Sidekiq jobs. Set this to 0 to if you don't want to limit Sidekiq jobs."
+msgstr ""
+
msgid "Throughput"
msgstr ""
@@ -34696,6 +35165,9 @@ msgstr ""
msgid "Time"
msgstr ""
+msgid "Time (in hours) that users are allowed to skip forced configuration of two-factor authentication."
+msgstr ""
+
msgid "Time Spent"
msgstr ""
@@ -34762,7 +35234,7 @@ msgstr ""
msgid "TimeTrackingEstimated|Est"
msgstr ""
-msgid "TimeTracking|%{startTag}Spent: %{endTag}%{timeSpentHumanReadable}"
+msgid "TimeTracking|%{spentStart}Spent: %{spentEnd}"
msgstr ""
msgid "TimeTracking|Estimated:"
@@ -34976,6 +35448,9 @@ msgstr ""
msgid "To access this domain create a new DNS record"
msgstr ""
+msgid "To add a custom suffix, set up a Service Desk email address. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "To add an SSH key you need to %{generate_link_start}generate one%{link_end} or use an %{existing_link_start}existing key%{link_end}."
msgstr ""
@@ -34997,13 +35472,16 @@ msgstr ""
msgid "To connect an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To continue using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
+msgstr ""
+
msgid "To continue, you need to select the link in the confirmation email we sent to verify your email address. If you didn't get our email, select %{strongStart}Resend confirmation email.%{strongEnd}"
msgstr ""
msgid "To define internal users, first enable new users set to external"
msgstr ""
-msgid "To enable Registration Features, make sure \"Enable service ping\" is checked."
+msgid "To enable Registration Features, first enable Service Ping."
msgstr ""
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
@@ -35030,7 +35508,7 @@ msgstr ""
msgid "To get started, use the link below to confirm your account."
msgstr ""
-msgid "To help improve GitLab and its user experience, GitLab will periodically collect usage information."
+msgid "To help improve GitLab and its user experience, GitLab periodically collects usage information."
msgstr ""
msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
@@ -35063,7 +35541,7 @@ msgstr ""
msgid "To preserve performance only %{strong_open}%{display_size} of %{real_size}%{strong_close} files are displayed."
msgstr ""
-msgid "To protect this issue's confidentiality, %{forkLink} and set the fork's visibility to private."
+msgid "To protect this issue's confidentiality, %{linkStart}fork this project%{linkEnd} and set the fork's visibility to private."
msgstr ""
msgid "To protect this issue's confidentiality, a private fork of this project was selected."
@@ -35096,12 +35574,15 @@ msgstr ""
msgid "To set up SAML authentication for your group through an identity provider like Azure, Okta, Onelogin, Ping Identity, or your custom SAML 2.0 provider:"
msgstr ""
-msgid "To set up this service:"
+msgid "To set up this integration:"
msgstr ""
msgid "To specify the notification level per project of a group you belong to, you need to visit project page and change notification level there."
msgstr ""
+msgid "To start using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
+msgstr ""
+
msgid "To unsubscribe from this issue, please paste the following link into your browser:"
msgstr ""
@@ -35689,9 +36170,6 @@ msgstr ""
msgid "Unable to fetch branches list, please close the form and try again"
msgstr ""
-msgid "Unable to fetch unscanned projects"
-msgstr ""
-
msgid "Unable to fetch vulnerable projects"
msgstr ""
@@ -35746,6 +36224,15 @@ msgstr ""
msgid "Unable to update this issue at this time."
msgstr ""
+msgid "Unapprove a merge request"
+msgstr ""
+
+msgid "Unapprove the current merge request."
+msgstr ""
+
+msgid "Unapproved the current merge request."
+msgstr ""
+
msgid "Unarchive project"
msgstr ""
@@ -35758,16 +36245,13 @@ msgstr ""
msgid "Unassigned"
msgstr ""
-msgid "Unauthenticated API request rate limit"
-msgstr ""
-
-msgid "Unauthenticated rate limit period in seconds"
+msgid "Unauthenticated API rate limit period in seconds"
msgstr ""
-msgid "Unauthenticated request rate limit"
+msgid "Unauthenticated requests"
msgstr ""
-msgid "Unauthenticated requests"
+msgid "Unauthenticated web rate limit period in seconds"
msgstr ""
msgid "Undo"
@@ -35869,18 +36353,6 @@ msgstr ""
msgid "Unresolved"
msgstr ""
-msgid "UnscannedProjects|15 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|30 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|5 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|60 or more days"
-msgstr ""
-
msgid "Unschedule job"
msgstr ""
@@ -36100,6 +36572,9 @@ msgstr ""
msgid "UsageQuota|%{help_link_start}Shared runners%{help_link_end} are disabled, so there are no limits set on pipeline usage"
msgstr ""
+msgid "UsageQuota|%{linkTitle} help link"
+msgstr ""
+
msgid "UsageQuota|%{percentageLeft} of purchased storage is available"
msgstr ""
@@ -36109,6 +36584,9 @@ msgstr ""
msgid "UsageQuota|Artifacts is a sum of build and pipeline artifacts."
msgstr ""
+msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
+msgstr ""
+
msgid "UsageQuota|Buy additional minutes"
msgstr ""
@@ -36118,9 +36596,21 @@ msgstr ""
msgid "UsageQuota|CI minutes usage by project"
msgstr ""
+msgid "UsageQuota|Code packages and container images."
+msgstr ""
+
msgid "UsageQuota|Current period usage"
msgstr ""
+msgid "UsageQuota|File attachments and smaller design graphics."
+msgstr ""
+
+msgid "UsageQuota|Git repository, managed by the Gitaly service."
+msgstr ""
+
+msgid "UsageQuota|Includes project registry, artifacts, packages, wiki, uploads and other items."
+msgstr ""
+
msgid "UsageQuota|Increase storage temporarily"
msgstr ""
@@ -36139,6 +36629,9 @@ msgstr ""
msgid "UsageQuota|Packages"
msgstr ""
+msgid "UsageQuota|Pipeline artifacts and job artifacts, created with CI/CD."
+msgstr ""
+
msgid "UsageQuota|Pipelines"
msgstr ""
@@ -36157,6 +36650,9 @@ msgstr ""
msgid "UsageQuota|Seats"
msgstr ""
+msgid "UsageQuota|Shared bits of code and text."
+msgstr ""
+
msgid "UsageQuota|Snippets"
msgstr ""
@@ -36166,6 +36662,12 @@ msgstr ""
msgid "UsageQuota|Storage"
msgstr ""
+msgid "UsageQuota|Storage type"
+msgstr ""
+
+msgid "UsageQuota|There is a known issue with Artifact storage where the total could be incorrect for some projects. More details and progress are available in %{warningLinkStart}the epic%{warningLinkEnd}."
+msgstr ""
+
msgid "UsageQuota|This is the total amount of storage used across your projects within this namespace."
msgstr ""
@@ -36205,6 +36707,9 @@ msgstr ""
msgid "UsageQuota|Usage"
msgstr ""
+msgid "UsageQuota|Usage Breakdown"
+msgstr ""
+
msgid "UsageQuota|Usage Quotas"
msgstr ""
@@ -36229,6 +36734,9 @@ msgstr ""
msgid "UsageQuota|Wiki"
msgstr ""
+msgid "UsageQuota|Wiki content."
+msgstr ""
+
msgid "UsageQuota|Wikis"
msgstr ""
@@ -36445,7 +36953,10 @@ msgstr ""
msgid "User Settings"
msgstr ""
-msgid "User and IP Rate Limits"
+msgid "User and IP rate limits"
+msgstr ""
+
+msgid "User does not have a pending request"
msgstr ""
msgid "User identity was successfully created."
@@ -36742,6 +37253,9 @@ msgstr ""
msgid "Users can launch a development environment from a GitLab browser tab when the %{linkStart}Gitpod%{linkEnd} integration is enabled."
msgstr ""
+msgid "Users can reactivate their account by signing in."
+msgstr ""
+
msgid "Users can render diagrams in AsciiDoc, Markdown, reStructuredText, and Textile documents using Kroki."
msgstr ""
@@ -36757,6 +37271,9 @@ msgstr ""
msgid "Users requesting access to"
msgstr ""
+msgid "Users to exclude from the rate limit"
+msgstr ""
+
msgid "Users were successfully added."
msgstr ""
@@ -36778,6 +37295,9 @@ msgstr ""
msgid "UsersSelect|Unassigned"
msgstr ""
+msgid "Uses GitLab as a lightweight alternative to Sentry."
+msgstr ""
+
msgid "Using %{code_start}::%{code_end} denotes a %{link_start}scoped label set%{link_end}"
msgstr ""
@@ -36808,10 +37328,7 @@ msgstr ""
msgid "Value Stream Analytics can help you determine your team’s velocity"
msgstr ""
-msgid "Value Stream Analytics gives an overview of how much time it takes to go from idea to production in your project."
-msgstr ""
-
-msgid "Value may contain a variable reference"
+msgid "Value might contain a variable reference"
msgstr ""
msgid "Value stream"
@@ -36877,10 +37394,10 @@ msgstr ""
msgid "ValueStream|The Default Value Stream cannot be deleted"
msgstr ""
-msgid "Variable"
+msgid "Values that contain the %{codeStart}$%{codeEnd} character can be considered a variable reference and expanded. %{docsLinkStart}Learn more.%{docsLinkEnd}"
msgstr ""
-msgid "Variable references indicated by %{codeStart}$%{codeEnd} may be expanded. If this is not what you want, consider %{docsLinkStart}using a workaround to prevent expansion%{docsLinkEnd}."
+msgid "Variable"
msgstr ""
msgid "Variable will be masked in job logs."
@@ -37285,6 +37802,9 @@ msgstr ""
msgid "Vulnerability|Evidence"
msgstr ""
+msgid "Vulnerability|False positive detected"
+msgstr ""
+
msgid "Vulnerability|File"
msgstr ""
@@ -37327,6 +37847,9 @@ msgstr ""
msgid "Vulnerability|Status"
msgstr ""
+msgid "Vulnerability|The scanner determined this vulnerability to be a false positive. Verify the evaluation before changing its status. %{linkStart}Learn more about false positive detection.%{linkEnd}"
+msgstr ""
+
msgid "Vulnerability|The unmodified response is the original response that had no mutations done to the request"
msgstr ""
@@ -37651,9 +38174,6 @@ msgstr ""
msgid "Welcome to GitLab,%{br_tag}%{name}!"
msgstr ""
-msgid "Welcome to the guided GitLab tour"
-msgstr ""
-
msgid "Welcome, %{name}!"
msgstr ""
@@ -37672,9 +38192,6 @@ msgstr ""
msgid "What are you searching for?"
msgstr ""
-msgid "What describes you best?"
-msgstr ""
-
msgid "What does this command do?"
msgstr ""
@@ -37696,13 +38213,13 @@ msgstr ""
msgid "What is your job title? (optional)"
msgstr ""
-msgid "What will you use this group for?"
+msgid "What templates can I create?"
msgstr ""
-msgid "What's new"
+msgid "What will you use this group for?"
msgstr ""
-msgid "What’s your experience level?"
+msgid "What's new"
msgstr ""
msgid "When a deployment job is successful, skip older deployment jobs that are still pending."
@@ -37714,6 +38231,9 @@ msgstr ""
msgid "When an event in GitLab triggers a webhook, you can use the request details to figure out if something went wrong."
msgstr ""
+msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+msgstr ""
+
msgid "When inactive, an external authentication provider must be used."
msgstr ""
@@ -37737,6 +38257,9 @@ msgstr ""
msgid "When:"
msgstr ""
+msgid "Which API requests are affected?"
+msgstr ""
+
msgid "While it's rare to have no vulnerabilities, it can happen. In any event, we ask that you please double check your settings to make sure you've set up your dashboard correctly."
msgstr ""
@@ -38016,6 +38539,9 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|Work Items"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -38091,6 +38617,9 @@ msgstr ""
msgid "You are already a member of this %{member_source}."
msgstr ""
+msgid "You are already impersonating another user"
+msgstr ""
+
msgid "You are an admin, which means granting access to %{client_name} will allow them to interact with GitLab as an admin as well. Proceed with caution."
msgstr ""
@@ -38193,6 +38722,9 @@ msgstr ""
msgid "You can also use project access tokens with Git to authenticate over HTTP(S). %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "You can always change your URL later"
+msgstr ""
+
msgid "You can always edit this later"
msgstr ""
@@ -38349,10 +38881,10 @@ msgstr ""
msgid "You can’t %{tag_start}edit%{tag_end} files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
-msgid "You could not create a new trigger."
+msgid "You can’t edit files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
-msgid "You didn't renew your subscription for %{strong}%{namespace_name}%{strong_close} so it was downgraded to the free plan."
+msgid "You could not create a new trigger."
msgstr ""
msgid "You do not have any subscriptions yet"
@@ -38520,6 +39052,12 @@ msgstr ""
msgid "You must provide your current password in order to change it."
msgstr ""
+msgid "You must sign in to search for specific projects."
+msgstr ""
+
+msgid "You must sign in to search for specific terms."
+msgstr ""
+
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
@@ -38547,6 +39085,9 @@ msgstr ""
msgid "You need to upload a GitLab project export archive (ending in .gz)."
msgstr ""
+msgid "You need to verify your primary email first before enabling Two-Factor Authentication."
+msgstr ""
+
msgid "You successfully declined the invitation"
msgstr ""
@@ -38655,10 +39196,10 @@ msgstr ""
msgid "Your %{host} account was signed in to from a new location"
msgstr ""
-msgid "Your %{strong}%{plan_name}%{strong_close} subscription for %{strong}%{namespace_name}%{strong_close} will expire on %{strong}%{expires_on}%{strong_close}."
+msgid "Your %{strong}%{plan_name}%{strong_close} subscription expires on %{strong}%{expires_on}%{strong_close}. After that date, you cannot create issues or merge requests, or use many other features."
msgstr ""
-msgid "Your %{strong}%{plan_name}%{strong_close} subscription will expire on %{strong}%{expires_on}%{strong_close}. After that, you will not be able to create issues or merge requests as well as many other features."
+msgid "Your %{strong}%{plan_name}%{strong_close} subscription for %{strong}%{namespace_name}%{strong_close} will expire on %{strong}%{expires_on}%{strong_close}."
msgstr ""
msgid "Your CI/CD configuration syntax is invalid. View Lint tab for more details."
@@ -38682,7 +39223,7 @@ msgstr ""
msgid "Your GPG keys (%{count})"
msgstr ""
-msgid "Your GitLab account has been locked due to an excessive amount of unsuccessful sign in attempts. Your account will automatically unlock in %{duration} or you may click the link below to unlock now."
+msgid "Your GitLab account has been locked due to an excessive number of unsuccessful sign in attempts. You can wait for your account to automatically unlock in %{duration} or you can click the link below to unlock now."
msgstr ""
msgid "Your GitLab account request has been approved!"
@@ -38793,6 +39334,9 @@ msgstr ""
msgid "Your commit email is used for web based operations, such as edits and merges."
msgstr ""
+msgid "Your current password is required to register a two-factor authenticator app."
+msgstr ""
+
msgid "Your dashboard has been copied. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
@@ -38892,6 +39436,9 @@ msgstr ""
msgid "Your project limit is %{limit} projects! Please contact your administrator to increase it"
msgstr ""
+msgid "Your project will be created at:"
+msgstr ""
+
msgid "Your projects"
msgstr ""
@@ -38931,11 +39478,10 @@ msgstr ""
msgid "Your subscription expired!"
msgstr ""
-msgid "Your subscription has been downgraded."
-msgstr ""
-
-msgid "Your subscription will expire in %{remaining_days}."
-msgstr ""
+msgid "Your subscription will expire in %{remaining_days} day."
+msgid_plural "Your subscription will expire in %{remaining_days} days."
+msgstr[0] ""
+msgstr[1] ""
msgid "Your username is %{username}."
msgstr ""
@@ -39142,6 +39688,9 @@ msgstr ""
msgid "cannot merge"
msgstr ""
+msgid "cannot not be used for user namespace"
+msgstr ""
+
msgid "ciReport|%{degradedNum} degraded"
msgstr ""
@@ -39465,6 +40014,9 @@ msgstr ""
msgid "created %{timeAgo}"
msgstr ""
+msgid "created %{timeAgo} by %{author}"
+msgstr ""
+
msgid "created by"
msgstr ""
@@ -39509,9 +40061,6 @@ msgstr ""
msgid "does not have a supported extension. Only %{extension_list} are supported"
msgstr ""
-msgid "domain is not authorized for sign-up."
-msgstr ""
-
msgid "download it"
msgstr ""
@@ -39529,18 +40078,13 @@ msgstr ""
msgid "email '%{email}' is not a verified email."
msgstr ""
-msgid "email does not match the allowed domain of %{email_domains}"
-msgid_plural "email does not match the allowed domains: %{email_domains}"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "enabled"
msgstr ""
msgid "encrypted: needs to be a :required, :optional or :migrating!"
msgstr ""
-msgid "ending with MIME type format is not allowed."
+msgid "ending with a reserved file extension is not allowed."
msgstr ""
msgid "entries cannot be larger than 255 characters"
@@ -39564,6 +40108,9 @@ msgstr ""
msgid "estimateCommand|%{slash_command} overwrites the total estimated time."
msgstr ""
+msgid "example.com"
+msgstr ""
+
msgid "exceeds the limit of %{bytes} bytes"
msgstr ""
@@ -39614,9 +40161,6 @@ msgstr ""
msgid "fork"
msgstr ""
-msgid "fork this project"
-msgstr ""
-
msgid "from"
msgstr ""
@@ -39625,6 +40169,9 @@ msgid_plural "from %d jobs"
msgstr[0] ""
msgstr[1] ""
+msgid "frontmatter"
+msgstr ""
+
msgid "group"
msgstr ""
@@ -39652,6 +40199,9 @@ msgstr ""
msgid "has been completed."
msgstr ""
+msgid "has too deep level of nesting"
+msgstr ""
+
msgid "help"
msgstr ""
@@ -39685,9 +40235,21 @@ msgstr ""
msgid "in"
msgstr ""
+msgid "in Infrastructure :: Kubernetes clusters"
+msgstr ""
+
+msgid "in all GitLab"
+msgstr ""
+
+msgid "in group"
+msgstr ""
+
msgid "in group %{link_to_group}"
msgstr ""
+msgid "in project"
+msgstr ""
+
msgid "in project %{link_to_project}"
msgstr ""
@@ -39729,16 +40291,19 @@ msgstr ""
msgid "is not a valid X509 certificate."
msgstr ""
-msgid "is not allowed since the group is not top-level group."
+msgid "is not allowed for sign-up."
msgstr ""
-msgid "is not allowed. Try again with a different email address, or contact your GitLab admin."
+msgid "is not allowed for this group."
msgstr ""
-msgid "is not allowed. We do not currently support project-level iterations"
+msgid "is not allowed for this project."
+msgstr ""
+
+msgid "is not allowed since the group is not top-level group."
msgstr ""
-msgid "is not from an allowed domain."
+msgid "is not allowed. We do not currently support project-level iterations"
msgstr ""
msgid "is not in the group enforcing Group Managed Account"
@@ -39831,6 +40396,9 @@ msgstr ""
msgid "log in"
msgstr ""
+msgid "managed"
+msgstr ""
+
msgid "manual"
msgstr ""
@@ -39878,6 +40446,9 @@ msgstr ""
msgid "mrWidget| Please restore it or use a different %{missingBranchName} branch"
msgstr ""
+msgid "mrWidget|%{linkStart}Set up now%{linkEnd} to analyze your source code for known security vulnerabilities."
+msgstr ""
+
msgid "mrWidget|%{mergeError}."
msgstr ""
@@ -39958,6 +40529,9 @@ msgid_plural "mrWidget|Closes issues"
msgstr[0] ""
msgstr[1] ""
+msgid "mrWidget|Create issue to resolve all threads"
+msgstr ""
+
msgid "mrWidget|Delete source branch"
msgstr ""
@@ -39967,12 +40541,18 @@ msgstr ""
msgid "mrWidget|Did not close"
msgstr ""
+msgid "mrWidget|Dismiss"
+msgstr ""
+
msgid "mrWidget|Email patches"
msgstr ""
msgid "mrWidget|Failed to load deployment statistics"
msgstr ""
+msgid "mrWidget|Hide %{widget} details"
+msgstr ""
+
msgid "mrWidget|If the %{missingBranchName} branch exists in your local repository, you can merge this merge request manually using the command line"
msgstr ""
@@ -40068,9 +40648,6 @@ msgstr ""
msgid "mrWidget|Request to merge"
msgstr ""
-msgid "mrWidget|Resolve all threads in new issue"
-msgstr ""
-
msgid "mrWidget|Resolve conflicts"
msgstr ""
@@ -40086,6 +40663,9 @@ msgstr ""
msgid "mrWidget|Revoke approval"
msgstr ""
+msgid "mrWidget|SAST and Secret Detection is not enabled."
+msgstr ""
+
msgid "mrWidget|Set by %{merge_author} to be added to the merge train when the pipeline succeeds"
msgstr ""
@@ -40095,6 +40675,9 @@ msgstr ""
msgid "mrWidget|Set by %{merge_author} to start a merge train when the pipeline succeeds"
msgstr ""
+msgid "mrWidget|Show %{widget} details"
+msgstr ""
+
msgid "mrWidget|The changes were merged into"
msgstr ""
@@ -40107,6 +40690,9 @@ msgstr ""
msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure, or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
msgstr ""
+msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure."
+msgstr ""
+
msgid "mrWidget|The source branch has been deleted"
msgstr ""
@@ -40149,6 +40735,9 @@ msgstr ""
msgid "mrWidget|You can merge after removing denied licenses"
msgstr ""
+msgid "mrWidget|You can only merge once this merge request is approved."
+msgstr ""
+
msgid "mrWidget|Your password"
msgstr ""
@@ -40185,6 +40774,9 @@ msgstr ""
msgid "must be less than the limit of %{tag_limit} tags"
msgstr ""
+msgid "must be set for a project namespace"
+msgstr ""
+
msgid "must be unique by status and elapsed time within a policy"
msgstr ""
@@ -40294,6 +40886,9 @@ msgstr ""
msgid "pipeline"
msgstr ""
+msgid "pipeline schedules documentation"
+msgstr ""
+
msgid "pod_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
msgstr ""
@@ -40343,16 +40938,25 @@ msgstr ""
msgid "project name"
msgstr ""
+msgid "project namespace cannot be the parent of another namespace"
+msgstr ""
+
msgid "projects"
msgstr ""
msgid "quick actions"
msgstr ""
-msgid "reCAPTCHA Private Key"
+msgid "reCAPTCHA"
+msgstr ""
+
+msgid "reCAPTCHA helps prevent credential stuffing."
msgstr ""
-msgid "reCAPTCHA Site Key"
+msgid "reCAPTCHA private key"
+msgstr ""
+
+msgid "reCAPTCHA site key"
msgstr ""
msgid "recent activity"
@@ -40579,6 +41183,9 @@ msgstr ""
msgid "user avatar"
msgstr ""
+msgid "user namespace cannot be the parent of another namespace"
+msgstr ""
+
msgid "user preferences"
msgstr ""
@@ -40671,3 +41278,9 @@ msgstr ""
msgid "your settings"
msgstr ""
+msgid "{group}"
+msgstr ""
+
+msgid "{project}"
+msgstr ""
+
diff --git a/locale/ky_KG/gitlab.po b/locale/ky_KG/gitlab.po
index b22ff2357f0..ce2506cb85b 100644
--- a/locale/ky_KG/gitlab.po
+++ b/locale/ky_KG/gitlab.po
@@ -14,10 +14,7 @@ msgstr ""
"X-Crowdin-Language: ky\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-09-01 22:31\n"
-
-msgid " %{name}, confirm your email address now! "
-msgstr ""
+"PO-Revision-Date: 2021-10-04 20:19\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -92,6 +89,16 @@ msgstr ""
msgid "#general, #development"
msgstr ""
+msgid "%d Alert"
+msgid_plural "%d Alerts"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d Alert:"
+msgid_plural "%d Alerts:"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d Approval"
msgid_plural "%d Approvals"
msgstr[0] ""
@@ -455,7 +462,10 @@ msgstr ""
msgid "%{code_open}Protected:%{code_close} Only exposed to protected branches or tags."
msgstr ""
-msgid "%{commit_author_link} authored %{commit_timeago}"
+msgid "%{commit_author_link} authored %{commit_authored_timeago}"
+msgstr ""
+
+msgid "%{commit_author_link} authored %{commit_authored_timeago} and %{commit_committer_avatar} %{commit_committer_link} committed %{commit_committer_timeago}"
msgstr ""
msgid "%{completedCount} completed weight"
@@ -549,6 +559,15 @@ msgstr ""
msgid "%{doc_link_start}Advanced search%{doc_link_end} is enabled."
msgstr ""
+msgid "%{docs_link_start}Learn about visibility levels.%{docs_link_end}"
+msgstr ""
+
+msgid "%{docs_link_start}What is Large File Storage?%{docs_link_end}"
+msgstr ""
+
+msgid "%{docs_link_start}What is two-factor authentication?%{docs_link_end}"
+msgstr ""
+
msgid "%{due_date} (Past due)"
msgstr ""
@@ -621,9 +640,6 @@ msgstr ""
msgid "%{issueType} actions"
msgstr ""
-msgid "%{issuesCount} issues with a limit of %{maxIssueCount}"
-msgstr ""
-
msgid "%{issuesSize} with a limit of %{maxIssueCount}"
msgstr ""
@@ -681,6 +697,12 @@ msgstr ""
msgid "%{label_for_message} unavailable"
msgstr ""
+msgid "%{learn_more_link}."
+msgstr ""
+
+msgid "%{lessThan} 1 hour"
+msgstr ""
+
msgid "%{lets_encrypt_link_start}Let's Encrypt%{lets_encrypt_link_end} is a free, automated, and open certificate authority (CA) that issues digital certificates to enable HTTPS (SSL/TLS) for sites."
msgstr ""
@@ -693,15 +715,15 @@ msgstr ""
msgid "%{link_start}Learn more%{link_end} about roles."
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
-msgstr ""
-
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
msgstr ""
msgid "%{link_start}Start the title with %{draft_snippet}%{link_end} to prevent a merge request that is a work in progress from being merged before it's ready."
msgstr ""
+msgid "%{link_start}What information does GitLab Inc. collect?%{link_end}"
+msgstr ""
+
msgid "%{listToShow}, and %{awardsListLength} more"
msgstr ""
@@ -854,7 +876,7 @@ msgid_plural "%{securityScanner} results are not available because a pipeline ha
msgstr[0] ""
msgstr[1] ""
-msgid "%{service_ping_link_start}Learn more%{service_ping_link_end} about what information is shared with GitLab Inc."
+msgid "%{service_ping_link_start}What information is shared with GitLab Inc.?%{service_ping_link_end}"
msgstr ""
msgid "%{size} %{unit}"
@@ -890,6 +912,9 @@ msgstr ""
msgid "%{state} epics"
msgstr ""
+msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
+msgstr ""
+
msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
msgstr ""
@@ -949,11 +974,6 @@ msgstr ""
msgid "%{template_project_id} is unknown or invalid"
msgstr ""
-msgid "%{text} %{files}"
-msgid_plural "%{text} %{files} files"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%{text} is available"
msgstr ""
@@ -1038,9 +1058,6 @@ msgstr ""
msgid "%{wildcards_link_start}Wildcards%{wildcards_link_end} such as %{code_tag_start}v*%{code_tag_end} or %{code_tag_start}*-release%{code_tag_end} are supported."
msgstr ""
-msgid "&lt; 1 hour"
-msgstr ""
-
msgid "'%{data}' at %{location} does not match format: %{format}"
msgstr ""
@@ -1124,9 +1141,6 @@ msgstr ""
msgid "(we need your current password to confirm your changes)"
msgstr ""
-msgid "* * * * *"
-msgstr ""
-
msgid "+ %{amount} more"
msgstr ""
@@ -1193,10 +1207,10 @@ msgstr ""
msgid "."
msgstr ""
-msgid "0 bytes"
+msgid "/"
msgstr ""
-msgid "0 for unlimited, only effective with remote storage enabled."
+msgid "0 bytes"
msgstr ""
msgid "0t1DgySidms"
@@ -1326,6 +1340,9 @@ msgstr ""
msgid "1000+"
msgstr ""
+msgid "192.168.0.0/24"
+msgstr ""
+
msgid "1st contribution!"
msgstr ""
@@ -1479,9 +1496,6 @@ msgstr ""
msgid "A plain HTML site that uses Netlify for CI/CD instead of GitLab, but still with all the other great GitLab features"
msgstr ""
-msgid "A plain-text response to show to clients that hit the rate limit."
-msgstr ""
-
msgid "A platform value can be web, mob or app."
msgstr ""
@@ -1563,7 +1577,7 @@ msgstr ""
msgid "APIFuzzing|Configure HTTP basic authentication values. Other authentication methods are supported. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
+msgid "APIFuzzing|Customize your project's API fuzzing configuration options and copy the code snippet to your .gitlab-ci.yml file to apply any changes. Note that this tool does not reflect or update your .gitlab-ci.yml file automatically. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
msgstr ""
msgid "APIFuzzing|Enable authentication"
@@ -1626,9 +1640,6 @@ msgstr ""
msgid "APIFuzzing|To prevent a security leak, authentication info must be added as a %{ciVariablesLinkStart}CI variable%{ciVariablesLinkEnd}. As a user with maintainer access rights, you can manage CI variables in the %{ciSettingsLinkStart}Settings%{ciSettingsLinkEnd} area."
msgstr ""
-msgid "APIFuzzing|Use this tool to generate API fuzzing configuration YAML to copy into your .gitlab-ci.yml file. This tool does not reflect or update your .gitlab-ci.yml file automatically."
-msgstr ""
-
msgid "APIFuzzing|Username for basic authentication"
msgstr ""
@@ -1680,9 +1691,6 @@ msgstr ""
msgid "Abuse reports notification email"
msgstr ""
-msgid "Abuse reports will be sent to this address if it is set. Abuse reports are always available in the admin area."
-msgstr ""
-
msgid "Accept invitation"
msgstr ""
@@ -1719,12 +1727,18 @@ msgstr ""
msgid "Access granted"
msgstr ""
+msgid "Access key ID"
+msgstr ""
+
msgid "Access requests"
msgstr ""
msgid "Access to '%{classification_label}' not allowed"
msgstr ""
+msgid "Access tokens expire after 2 hours. A refresh token may be used at any time to generate a new access token. Non-expiring access tokens are deprecated. Clear this setting to enable backward compatibility."
+msgstr ""
+
msgid "AccessDropdown|Deploy Keys"
msgstr ""
@@ -2037,6 +2051,9 @@ msgstr ""
msgid "Add new directory"
msgstr ""
+msgid "Add new service account"
+msgstr ""
+
msgid "Add or remove previously merged commits"
msgstr ""
@@ -2274,6 +2291,9 @@ msgstr ""
msgid "AdminArea|Features"
msgstr ""
+msgid "AdminArea|Get security updates from GitLab and stay up to date"
+msgstr ""
+
msgid "AdminArea|Groups"
msgstr ""
@@ -2313,6 +2333,12 @@ msgstr ""
msgid "AdminArea|Reporter"
msgstr ""
+msgid "AdminArea|Sign up for the GitLab Security Newsletter to get notified for security updates."
+msgstr ""
+
+msgid "AdminArea|Sign up for the GitLab newsletter"
+msgstr ""
+
msgid "AdminArea|Stop all jobs"
msgstr ""
@@ -2382,9 +2408,15 @@ msgstr ""
msgid "AdminSettings|Disable public access to Pages sites"
msgstr ""
+msgid "AdminSettings|Display a banner on merge requests in projects with no pipelines to initiate steps to add a .gitlab-ci.yml file."
+msgstr ""
+
msgid "AdminSettings|Domain verification is an essential security measure for public GitLab sites. Users are required to demonstrate they control a domain before it is enabled. %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "AdminSettings|Enable pipeline suggestion banner"
+msgstr ""
+
msgid "AdminSettings|Enable shared runners for new projects"
msgstr ""
@@ -2856,10 +2888,10 @@ msgstr ""
msgid "Admin|Quarterly reconciliation will occur on %{qrtlyDate}"
msgstr ""
-msgid "Admin|The number of max seats used for your namespace is currently exceeding the number of seats in your subscription. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgid "Admin|The number of max seats in your namespace exceeds the number of seats in your subscription. On %{qrtlyDate}, quarterly reconciliation occurs and you are automatically billed a prorated amount for the overage. No action is needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice. For more information about the timing of the invoicing process, view the documentation."
msgstr ""
-msgid "Admin|The number of maximum users for your instance is currently exceeding the number of users in license. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgid "Admin|The number of max users in your instance exceeds the number of users in your license. On %{qrtlyDate}, quarterly reconciliation occurs and you are automatically billed a prorated amount for the overage. No action is needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice. For more information about the timing of the invoicing process, view the documentation."
msgstr ""
msgid "Admin|View pending user approvals"
@@ -2880,9 +2912,6 @@ msgstr ""
msgid "Advanced export options"
msgstr ""
-msgid "Advanced permissions, Large File Storage and Two-Factor authentication settings."
-msgstr ""
-
msgid "After a successful password update you will be redirected to login screen."
msgstr ""
@@ -2901,13 +2930,14 @@ msgstr ""
msgid "After you've reviewed these contribution guidelines, you'll be all set to"
msgstr ""
+msgid "Akismet"
+msgstr ""
+
msgid "Akismet API Key"
msgstr ""
-msgid "Alert"
-msgid_plural "Alerts"
-msgstr[0] ""
-msgstr[1] ""
+msgid "Akismet helps prevent the creation of spam issues in public projects."
+msgstr ""
msgid "AlertManagement|Acknowledged"
msgstr ""
@@ -3263,6 +3293,9 @@ msgstr ""
msgid "All (default)"
msgstr ""
+msgid "All GitLab"
+msgstr ""
+
msgid "All Members"
msgstr ""
@@ -3377,6 +3410,9 @@ msgstr ""
msgid "Allow this secondary node to replicate content on Object Storage"
msgstr ""
+msgid "Allow use of licensed EE features"
+msgstr ""
+
msgid "Allow users to dismiss the broadcast message"
msgstr ""
@@ -3452,9 +3488,6 @@ msgstr ""
msgid "Amazon authentication is not %{link_start}correctly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
-msgid "Amount of time (in hours) that users are allowed to skip forced configuration of two-factor authentication"
-msgstr ""
-
msgid "An %{link_start}alert%{link_end} with the same fingerprint is already open. To change the status of this alert, resolve the linked alert."
msgstr ""
@@ -3515,12 +3548,6 @@ msgstr ""
msgid "An error occurred when removing the label."
msgstr ""
-msgid "An error occurred when toggling the notification subscription"
-msgstr ""
-
-msgid "An error occurred when updating the issue weight"
-msgstr ""
-
msgid "An error occurred when updating the title"
msgstr ""
@@ -3569,6 +3596,9 @@ msgstr ""
msgid "An error occurred while enabling Service Desk."
msgstr ""
+msgid "An error occurred while fetching Markdown preview"
+msgstr ""
+
msgid "An error occurred while fetching ancestors"
msgstr ""
@@ -3599,9 +3629,6 @@ msgstr ""
msgid "An error occurred while fetching label colors."
msgstr ""
-msgid "An error occurred while fetching markdown preview"
-msgstr ""
-
msgid "An error occurred while fetching participants"
msgstr ""
@@ -3617,9 +3644,6 @@ msgstr ""
msgid "An error occurred while fetching reference"
msgstr ""
-msgid "An error occurred while fetching sidebar data"
-msgstr ""
-
msgid "An error occurred while fetching tags. Retry the search."
msgstr ""
@@ -3695,6 +3719,9 @@ msgstr ""
msgid "An error occurred while loading merge requests."
msgstr ""
+msgid "An error occurred while loading projects."
+msgstr ""
+
msgid "An error occurred while loading the Needs tab."
msgstr ""
@@ -3929,12 +3956,6 @@ msgstr ""
msgid "Any Milestone"
msgstr ""
-msgid "Any branch"
-msgstr ""
-
-msgid "Any eligible user"
-msgstr ""
-
msgid "Any encrypted tokens"
msgstr ""
@@ -3953,6 +3974,9 @@ msgstr ""
msgid "Any namespace"
msgstr ""
+msgid "App Engine description and apps that are suitable for this deployment target"
+msgstr ""
+
msgid "App ID"
msgstr ""
@@ -4101,6 +4125,11 @@ msgstr ""
msgid "Apply"
msgstr ""
+msgid "Apply %d suggestion"
+msgid_plural "Apply %d suggestions"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Apply a label"
msgstr ""
@@ -4110,13 +4139,10 @@ msgstr ""
msgid "Apply suggestion"
msgstr ""
-msgid "Apply suggestions"
-msgstr ""
-
msgid "Apply template"
msgstr ""
-msgid "Apply this approval rule to any branch or a specific protected branch."
+msgid "Apply this approval rule to all branches or a specific protected branch."
msgstr ""
msgid "Applying"
@@ -4259,9 +4285,6 @@ msgstr ""
msgid "ApprovalSettings|Prevent editing approval rules in projects and merge requests."
msgstr ""
-msgid "ApprovalSettings|Prevent editing approval rules in projects and merge requests. "
-msgstr ""
-
msgid "ApprovalSettings|Remove all approvals when commits are added to the source branch."
msgstr ""
@@ -4277,6 +4300,9 @@ msgstr ""
msgid "ApprovalSettings|This setting is configured at the instance level and can only be changed by an administrator."
msgstr ""
+msgid "ApprovalSettings|This setting is configured in %{groupName} and can only be changed by an administrator or group owner."
+msgstr ""
+
msgid "ApprovalStatusTooltip|Adheres to separation of duties"
msgstr ""
@@ -4763,9 +4789,6 @@ msgstr ""
msgid "Authenticated API rate limit period in seconds"
msgstr ""
-msgid "Authenticated API request rate limit"
-msgstr ""
-
msgid "Authenticated API requests"
msgstr ""
@@ -4775,10 +4798,10 @@ msgstr ""
msgid "Authenticated Git LFS request rate limit"
msgstr ""
-msgid "Authenticated web rate limit period in seconds"
+msgid "Authenticated Git LFS requests"
msgstr ""
-msgid "Authenticated web request rate limit"
+msgid "Authenticated web rate limit period in seconds"
msgstr ""
msgid "Authenticated web requests"
@@ -5156,9 +5179,6 @@ msgstr ""
msgid "Below you will find all the groups that are public."
msgstr ""
-msgid "Beta"
-msgstr ""
-
msgid "Bi-weekly code coverage"
msgstr ""
@@ -5398,6 +5418,21 @@ msgstr ""
msgid "Board scope affects which issues are displayed for anyone who visits this board"
msgstr ""
+msgid "BoardNewEpic|Groups"
+msgstr ""
+
+msgid "BoardNewEpic|Loading groups"
+msgstr ""
+
+msgid "BoardNewEpic|No matching results"
+msgstr ""
+
+msgid "BoardNewEpic|Search groups"
+msgstr ""
+
+msgid "BoardNewEpic|Select a group"
+msgstr ""
+
msgid "BoardNewIssue|No matching results"
msgstr ""
@@ -5475,6 +5510,9 @@ msgstr ""
msgid "Boards|An error occurred while creating the list. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching child groups. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching group projects. Please try again."
msgstr ""
@@ -5807,6 +5845,9 @@ msgstr ""
msgid "Bulk update"
msgstr ""
+msgid "BulkImports|Re-import creates a new group. It does not sync with the existing group."
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -5816,6 +5857,9 @@ msgstr ""
msgid "BulkImport|From source group"
msgstr ""
+msgid "BulkImport|Group import history"
+msgstr ""
+
msgid "BulkImport|Import failed: Destination cannot be a subgroup of the source group. Change the destination and try again."
msgstr ""
@@ -5828,9 +5872,18 @@ msgstr ""
msgid "BulkImport|Importing the group failed"
msgstr ""
+msgid "BulkImport|Last imported to %{link}"
+msgstr ""
+
msgid "BulkImport|Name already exists."
msgstr ""
+msgid "BulkImport|New group"
+msgstr ""
+
+msgid "BulkImport|No history is available"
+msgstr ""
+
msgid "BulkImport|No parent"
msgstr ""
@@ -5843,6 +5896,9 @@ msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} matching filter \"%{filter}\" from %{link}"
msgstr ""
+msgid "BulkImport|Source group"
+msgstr ""
+
msgid "BulkImport|To new group"
msgstr ""
@@ -5852,6 +5908,9 @@ msgstr ""
msgid "BulkImport|You have no groups to import"
msgstr ""
+msgid "BulkImport|Your imported groups will appear here."
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -6094,6 +6153,9 @@ msgstr ""
msgid "Can be manually deployed to"
msgstr ""
+msgid "Can be overridden in each project."
+msgstr ""
+
msgid "Can create groups:"
msgstr ""
@@ -6196,6 +6258,9 @@ msgstr ""
msgid "Cancelling Preview"
msgstr ""
+msgid "Cannot assign a confidential epic to a non-confidential issue. Make the issue confidential and try again"
+msgstr ""
+
msgid "Cannot be assigned to other projects."
msgstr ""
@@ -6247,9 +6312,6 @@ msgstr ""
msgid "Cannot refer to a group %{timebox_type} by an internal id!"
msgstr ""
-msgid "Cannot set confidential epic for a non-confidential issue"
-msgstr ""
-
msgid "Cannot show preview. For previews on sketch files, they must have the file format introduced by Sketch version 43 and above."
msgstr ""
@@ -6487,15 +6549,15 @@ msgstr ""
msgid "Check out, review, and merge locally"
msgstr ""
-msgid "Check the %{docs_link_start}documentation%{docs_link_end}."
-msgstr ""
-
msgid "Check the current instance configuration "
msgstr ""
msgid "Check the elasticsearch.log file to debug why the migration was halted and make any changes before retrying the migration. When you fix the cause of the failure, click \"Retry migration\", and the migration will be scheduled to be retried in the background."
msgstr ""
+msgid "Check with your administrator."
+msgstr ""
+
msgid "Check your Docker images for known vulnerabilities."
msgstr ""
@@ -6526,6 +6588,9 @@ msgstr ""
msgid "Checkout"
msgstr ""
+msgid "Checkout|$%{selectedPlanPrice} per 10 GB storage per pack"
+msgstr ""
+
msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 minutes"
msgstr ""
@@ -6546,17 +6611,23 @@ msgstr ""
msgid "Checkout|%{name}'s GitLab subscription"
msgstr ""
-msgid "Checkout|%{selectedPlanText} plan"
+msgid "Checkout|%{name}'s storage subscription"
msgstr ""
-msgid "Checkout|%{startDate} - %{endDate}"
+msgid "Checkout|%{quantity} GB of storage"
msgstr ""
-msgid "Checkout|%{totalCiMinutes} CI minute"
-msgid_plural "Checkout|%{totalCiMinutes} CI minutes"
+msgid "Checkout|%{quantity} storage pack"
+msgid_plural "Checkout|%{quantity} storage packs"
msgstr[0] ""
msgstr[1] ""
+msgid "Checkout|%{selectedPlanText} plan"
+msgstr ""
+
+msgid "Checkout|%{startDate} - %{endDate}"
+msgstr ""
+
msgid "Checkout|%{totalCiMinutes} CI minutes"
msgstr ""
@@ -6632,6 +6703,9 @@ msgstr ""
msgid "Checkout|Failed to register credit card. Please try again."
msgstr ""
+msgid "Checkout|GB"
+msgstr ""
+
msgid "Checkout|GitLab group"
msgstr ""
@@ -6668,6 +6742,9 @@ msgstr ""
msgid "Checkout|State"
msgstr ""
+msgid "Checkout|Storage packs"
+msgstr ""
+
msgid "Checkout|Street address"
msgstr ""
@@ -6689,6 +6766,9 @@ msgstr ""
msgid "Checkout|Total minutes: %{quantity}"
msgstr ""
+msgid "Checkout|Total storage: %{quantity} GB"
+msgstr ""
+
msgid "Checkout|Users"
msgstr ""
@@ -6698,16 +6778,25 @@ msgstr ""
msgid "Checkout|Your organization"
msgstr ""
+msgid "Checkout|Your storage subscription has the same term as your main subscription, and the price is prorated accordingly."
+msgstr ""
+
msgid "Checkout|Your subscription will be applied to this group"
msgstr ""
msgid "Checkout|Zip code"
msgstr ""
+msgid "Checkout|a storage subscription"
+msgstr ""
+
msgid "Checkout|company or team"
msgstr ""
-msgid "Checkout|x 1,000 minutes per pack = %{strong}"
+msgid "Checkout|minutes"
+msgstr ""
+
+msgid "Checkout|x %{quantity} %{units} per pack ="
msgstr ""
msgid "Cherry-pick this commit"
@@ -7064,6 +7153,9 @@ msgstr ""
msgid "CloneIssue|Cannot clone issue to target project as it is pending deletion."
msgstr ""
+msgid "CloneIssue|Cannot clone issues of '%{issue_type}' type."
+msgstr ""
+
msgid "Cloned this issue to %{path_to_project}."
msgstr ""
@@ -7118,7 +7210,10 @@ msgstr ""
msgid "Closes this %{quick_action_target}."
msgstr ""
-msgid "Cloud licenses can not be removed."
+msgid "Cloud Functions description and apps that are suitable for this deployment target"
+msgstr ""
+
+msgid "Cloud Run description and apps that are suitable for this deployment target"
msgstr ""
msgid "Cluster"
@@ -7145,6 +7240,12 @@ msgstr ""
msgid "ClusterAgents|Access tokens"
msgstr ""
+msgid "ClusterAgents|Agent might not be connected to GitLab"
+msgstr ""
+
+msgid "ClusterAgents|Agent never connected to GitLab"
+msgstr ""
+
msgid "ClusterAgents|Alternative installation methods"
msgstr ""
@@ -7160,6 +7261,12 @@ msgstr ""
msgid "ClusterAgents|Configuration"
msgstr ""
+msgid "ClusterAgents|Connected"
+msgstr ""
+
+msgid "ClusterAgents|Connection status"
+msgstr ""
+
msgid "ClusterAgents|Copy token"
msgstr ""
@@ -7178,6 +7285,9 @@ msgstr ""
msgid "ClusterAgents|For alternative installation methods %{linkStart}go to the documentation%{linkEnd}."
msgstr ""
+msgid "ClusterAgents|For more troubleshooting information go to"
+msgstr ""
+
msgid "ClusterAgents|Go to the repository"
msgstr ""
@@ -7193,18 +7303,30 @@ msgstr ""
msgid "ClusterAgents|Integrate with the GitLab Agent"
msgstr ""
-msgid "ClusterAgents|Last used"
+msgid "ClusterAgents|Last connected %{timeAgo}."
+msgstr ""
+
+msgid "ClusterAgents|Last contact"
msgstr ""
msgid "ClusterAgents|Learn how to create an agent access token"
msgstr ""
+msgid "ClusterAgents|Make sure you are using a valid token."
+msgstr ""
+
msgid "ClusterAgents|Name"
msgstr ""
msgid "ClusterAgents|Never"
msgstr ""
+msgid "ClusterAgents|Never connected"
+msgstr ""
+
+msgid "ClusterAgents|Not connected"
+msgstr ""
+
msgid "ClusterAgents|Read more about getting started"
msgstr ""
@@ -7226,6 +7348,9 @@ msgstr ""
msgid "ClusterAgents|Select which Agent you want to install"
msgstr ""
+msgid "ClusterAgents|The Agent has not been connected in a long time. There might be a connectivity issue. Last contact was %{timeAgo}."
+msgstr ""
+
msgid "ClusterAgents|The GitLab Agent also requires %{linkStart}enabling the Agent Server%{linkEnd}"
msgstr ""
@@ -7253,9 +7378,6 @@ msgstr ""
msgid "ClusterAgents|You will need to create a token to connect to your agent"
msgstr ""
-msgid "ClusterAgent|This feature is only available for premium plans"
-msgstr ""
-
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -7445,9 +7567,6 @@ msgstr ""
msgid "ClusterIntegration|Create Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Create a provision role on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the account and external ID above. %{startMoreInfoLink}More information%{endLink}"
-msgstr ""
-
msgid "ClusterIntegration|Create cluster on"
msgstr ""
@@ -7880,7 +7999,7 @@ msgstr ""
msgid "ClusterIntegration|Subnets"
msgstr ""
-msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provisioned role, first create one on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the above account and external IDs. %{startMoreInfoLink}More information%{endLink}"
+msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provisioned role, first create one on %{awsLinkStart}Amazon Web Services %{awsLinkEnd} using the above account and external IDs. %{moreInfoStart}More information%{moreInfoEnd}"
msgstr ""
msgid "ClusterIntegration|The Kubernetes certificate used to authenticate to the cluster."
@@ -8114,6 +8233,9 @@ msgstr ""
msgid "Collapse replies"
msgstr ""
+msgid "Collapse settings section"
+msgstr ""
+
msgid "Collapse sidebar"
msgstr ""
@@ -8132,6 +8254,9 @@ msgstr ""
msgid "Comma-separated list of email addresses."
msgstr ""
+msgid "Comma-separated list of users allowed to exceed the rate limit."
+msgstr ""
+
msgid "Comma-separated, e.g. '1.1.1.1, 2.2.2.0/24'"
msgstr ""
@@ -8452,6 +8577,9 @@ msgstr ""
msgid "Configure %{repository_checks_link_start}repository checks%{link_end} and %{housekeeping_link_start}housekeeping%{link_end} on repositories."
msgstr ""
+msgid "Configure CAPTCHAs, IP address limits, and other anti-spam measures."
+msgstr ""
+
msgid "Configure Dependency Scanning in `.gitlab-ci.yml` using the GitLab managed template. You can [add variable overrides](https://docs.gitlab.com/ee/user/application_security/dependency_scanning/#customizing-the-dependency-scanning-settings) to customize Dependency Scanning settings."
msgstr ""
@@ -8488,16 +8616,13 @@ msgstr ""
msgid "Configure a %{codeStart}.gitlab-webide.yml%{codeEnd} file in the %{codeStart}.gitlab%{codeEnd} directory to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
msgstr ""
-msgid "Configure existing installation"
-msgstr ""
-
-msgid "Configure limit for notes created per minute by web and API requests."
+msgid "Configure advanced permissions, Large File Storage, and two-factor authentication settings."
msgstr ""
-msgid "Configure limits for Project/Group Import/Export."
+msgid "Configure approvals by authors and committers on all projects."
msgstr ""
-msgid "Configure limits for web and API requests."
+msgid "Configure existing installation"
msgstr ""
msgid "Configure paths to be protected by Rack Attack."
@@ -8512,10 +8637,13 @@ msgstr ""
msgid "Configure settings for Advanced Search with Elasticsearch."
msgstr ""
+msgid "Configure specific limits for Files API requests that supersede the general user and IP rate limits."
+msgstr ""
+
msgid "Configure specific limits for Git LFS requests that supersede the general user and IP rate limits."
msgstr ""
-msgid "Configure specific limits for Packages API requests that supersede the general user and IP rate limits."
+msgid "Configure specific limits for deprecated API requests that supersede the general user and IP rate limits."
msgstr ""
msgid "Configure the %{link} integration."
@@ -8527,6 +8655,9 @@ msgstr ""
msgid "Configure the way a user creates a new account."
msgstr ""
+msgid "Configure via Merge Request"
+msgstr ""
+
msgid "Configure which lists are shown for anyone who visits this board"
msgstr ""
@@ -8995,6 +9126,9 @@ msgstr ""
msgid "Content parsed with %{link}."
msgstr ""
+msgid "ContentEditor|Table of Contents"
+msgstr ""
+
msgid "ContentEditor|You have to provide a renderMarkdown function or a custom serializer"
msgstr ""
@@ -9181,6 +9315,9 @@ msgstr ""
msgid "Copy link to chart"
msgstr ""
+msgid "Copy prefix"
+msgstr ""
+
msgid "Copy reference"
msgstr ""
@@ -9211,6 +9348,9 @@ msgstr ""
msgid "Copy value"
msgstr ""
+msgid "Corpus Management"
+msgstr ""
+
msgid "Corpus Management|Are you sure you want to delete the corpus?"
msgstr ""
@@ -9439,6 +9579,9 @@ msgstr ""
msgid "Create commit"
msgstr ""
+msgid "Create common files more quickly, and standardize their format."
+msgstr ""
+
msgid "Create confidential merge request"
msgstr ""
@@ -9472,6 +9615,9 @@ msgstr ""
msgid "Create issue"
msgstr ""
+msgid "Create issue to resolve all threads"
+msgstr ""
+
msgid "Create iteration"
msgstr ""
@@ -9526,6 +9672,9 @@ msgstr ""
msgid "Create new..."
msgstr ""
+msgid "Create or import your first project"
+msgstr ""
+
msgid "Create project"
msgstr ""
@@ -9883,7 +10032,7 @@ msgstr ""
msgid "Custom notification events"
msgstr ""
-msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notificationLinkStart} notification emails%{notificationLinkEnd}."
+msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notificationLinkStart}notification emails%{notificationLinkEnd}."
msgstr ""
msgid "Custom project templates"
@@ -10082,10 +10231,10 @@ msgid_plural "CycleAnalytics|Showing %{subjectFilterText} and %{selectedLabelsCo
msgstr[0] ""
msgstr[1] ""
-msgid "CycleAnalytics|Showing data for group '%{groupName}' and %{selectedProjectCount} projects from %{startDate} to %{endDate}"
+msgid "CycleAnalytics|Showing data for group '%{groupName}' and %{selectedProjectCount} projects from %{createdAfter} to %{createdBefore}"
msgstr ""
-msgid "CycleAnalytics|Showing data for group '%{groupName}' from %{startDate} to %{endDate}"
+msgid "CycleAnalytics|Showing data for group '%{groupName}' from %{createdAfter} to %{createdBefore}"
msgstr ""
msgid "CycleAnalytics|Stages"
@@ -10319,6 +10468,9 @@ msgstr ""
msgid "DastProfiles|Manage profiles"
msgstr ""
+msgid "DastProfiles|Manage site profiles"
+msgstr ""
+
msgid "DastProfiles|Minimum = 0 (no timeout enabled), Maximum = 2880 minutes"
msgstr ""
@@ -10394,6 +10546,9 @@ msgstr ""
msgid "DastProfiles|Scanner name"
msgstr ""
+msgid "DastProfiles|Schedule"
+msgstr ""
+
msgid "DastProfiles|Select branch"
msgstr ""
@@ -10463,7 +10618,7 @@ msgstr ""
msgid "DastProfiles|Website"
msgstr ""
-msgid "DastProfiles|You can either choose a passive scan or validate the target site in your chosen site profile. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
+msgid "DastProfiles|You can either choose a passive scan or validate the target site from the site profile management page. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
msgstr ""
msgid "DastProfiles|You cannot run an active scan against an unvalidated site."
@@ -10636,7 +10791,7 @@ msgstr ""
msgid "Days to merge"
msgstr ""
-msgid "Deactivate dormant users after 90 days of inactivity. Users can return to active status by signing in to their account. While inactive, a user is not counted as an active user in the instance."
+msgid "Deactivate dormant users after 90 days of inactivity"
msgstr ""
msgid "Dear Administrator,"
@@ -10723,10 +10878,10 @@ msgstr ""
msgid "Define a custom pattern with cron syntax"
msgstr ""
-msgid "Define approval settings."
+msgid "Define approval rules."
msgstr ""
-msgid "Define approval settings. %{linkStart}Learn more.%{linkEnd}"
+msgid "Define approval rules. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "Define custom rules for what constitutes spam, independent of Akismet"
@@ -10735,7 +10890,7 @@ msgstr ""
msgid "Define environments in the deploy stage(s) in %{code_open}.gitlab-ci.yml%{code_close} to track deployments here."
msgstr ""
-msgid "Define how approval rules are applied as a merge request moves toward completion."
+msgid "Define how approval rules are applied to merge requests."
msgstr ""
msgid "Definition"
@@ -10750,6 +10905,12 @@ msgstr ""
msgid "DelayedJobs|Are you sure you want to run %{job_name} immediately? This job will run automatically after it's timer finishes."
msgstr ""
+msgid "DelayedJobs|Are you sure you want to run %{job_name} immediately? This job will run automatically after its timer finishes."
+msgstr ""
+
+msgid "DelayedJobs|Run the delayed job now?"
+msgstr ""
+
msgid "DelayedJobs|Start now"
msgstr ""
@@ -11026,6 +11187,12 @@ msgstr ""
msgid "Dependency proxy image prefix"
msgstr ""
+msgid "DependencyProxy|Create a local proxy for storing frequently used upstream images. %{docLinkStart}Learn more%{docLinkEnd} about dependency proxies."
+msgstr ""
+
+msgid "DependencyProxy|Dependency Proxy"
+msgstr ""
+
msgid "DependencyProxy|Toggle Dependency Proxy"
msgstr ""
@@ -11266,6 +11433,9 @@ msgstr ""
msgid "Deployments"
msgstr ""
+msgid "Deployments to Google Kubernetes Engine can be "
+msgstr ""
+
msgid "Deployments|%{deployments} environment impacted."
msgid_plural "Deployments|%{deployments} environments impacted."
msgstr[0] ""
@@ -11295,6 +11465,9 @@ msgstr ""
msgid "Deployment|success"
msgstr ""
+msgid "Deprecated API rate limits"
+msgstr ""
+
msgid "Deprioritize label"
msgstr ""
@@ -11697,6 +11870,16 @@ msgstr ""
msgid "DiffsCompareBaseBranch|(base)"
msgstr ""
+msgid "Diffs|%d addition"
+msgid_plural "Diffs|%d additions"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Diffs|%d deletion"
+msgid_plural "Diffs|%d deletions"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Diffs|No file name available"
msgstr ""
@@ -11706,9 +11889,17 @@ msgstr ""
msgid "Diffs|Show all unchanged lines"
msgstr ""
+msgid "Diffs|Showing %{dropdownStart}%{count} changed file%{dropdownEnd}"
+msgid_plural "Diffs|Showing %{dropdownStart}%{count} changed files%{dropdownEnd}"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Diffs|Something went wrong while fetching diff lines."
msgstr ""
+msgid "Diffs|with %{additions} and %{deletions}"
+msgstr ""
+
msgid "Direct member"
msgstr ""
@@ -11834,9 +12025,6 @@ msgid_plural "Dismiss %d selected vulnerabilities as"
msgstr[0] ""
msgstr[1] ""
-msgid "Dismiss Value Stream Analytics introduction box"
-msgstr ""
-
msgid "Dismiss merge request promotion"
msgstr ""
@@ -12158,6 +12346,9 @@ msgstr ""
msgid "Edit issues"
msgstr ""
+msgid "Edit merge requests"
+msgstr ""
+
msgid "Edit public deploy key"
msgstr ""
@@ -12233,6 +12424,9 @@ msgstr ""
msgid "Elastic|None. Select projects to index."
msgstr ""
+msgid "Eligible users"
+msgstr ""
+
msgid "Email"
msgstr ""
@@ -12362,6 +12556,9 @@ msgstr ""
msgid "Enable"
msgstr ""
+msgid "Enable Amazon EKS integration"
+msgstr ""
+
msgid "Enable Auto DevOps"
msgstr ""
@@ -12395,6 +12592,9 @@ msgstr ""
msgid "Enable SSL verification"
msgstr ""
+msgid "Enable Service Ping"
+msgstr ""
+
msgid "Enable Snowplow tracking"
msgstr ""
@@ -12425,6 +12625,9 @@ msgstr ""
msgid "Enable authenticated Git LFS request rate limit"
msgstr ""
+msgid "Enable authenticated web request rate limit"
+msgstr ""
+
msgid "Enable authentication"
msgstr ""
@@ -12485,7 +12688,7 @@ msgstr ""
msgid "Enable or disable the Pseudonymizer data collection."
msgstr ""
-msgid "Enable or disable version check and service ping."
+msgid "Enable or disable version check and Service Ping."
msgstr ""
msgid "Enable protected paths rate limit"
@@ -12497,18 +12700,12 @@ msgstr ""
msgid "Enable reCAPTCHA"
msgstr ""
-msgid "Enable reCAPTCHA for login"
-msgstr ""
-
-msgid "Enable reCAPTCHA, Invisible Captcha, Akismet and set IP limits. For reCAPTCHA, we currently only support %{recaptcha_v2_link_start}v2%{recaptcha_v2_link_end}"
+msgid "Enable reCAPTCHA for login."
msgstr ""
msgid "Enable repository checks"
msgstr ""
-msgid "Enable service ping"
-msgstr ""
-
msgid "Enable shared runners for all projects and subgroups in this group."
msgstr ""
@@ -12530,7 +12727,10 @@ msgstr ""
msgid "Enable unauthenticated API request rate limit"
msgstr ""
-msgid "Enable unauthenticated request rate limit"
+msgid "Enable unauthenticated web request rate limit"
+msgstr ""
+
+msgid "Enable user deactivation emails"
msgstr ""
msgid "Enable version check"
@@ -12566,9 +12766,6 @@ msgstr ""
msgid "Enabled sources for code import during project creation. OmniAuth must be configured for GitHub"
msgstr ""
-msgid "Enabling this will only make licensed EE features available to projects if the project namespace's plan includes the feature or if the project is public."
-msgstr ""
-
msgid "Encountered an error while rendering: %{err}"
msgstr ""
@@ -12617,9 +12814,6 @@ msgstr ""
msgid "Enter Admin Mode"
msgstr ""
-msgid "Enter IP address range"
-msgstr ""
-
msgid "Enter a number"
msgstr ""
@@ -12632,9 +12826,6 @@ msgstr ""
msgid "Enter at least three characters to search"
msgstr ""
-msgid "Enter domain"
-msgstr ""
-
msgid "Enter in your Bitbucket Server URL and personal access token below"
msgstr ""
@@ -12821,9 +13012,6 @@ msgstr ""
msgid "Environments|Deployment %{status}"
msgstr ""
-msgid "Environments|Dismiss"
-msgstr ""
-
msgid "Environments|Enable review app"
msgstr ""
@@ -12836,9 +13024,6 @@ msgstr ""
msgid "Environments|Environments are places where code gets deployed, such as staging or production."
msgstr ""
-msgid "Environments|Help us improve environments"
-msgstr ""
-
msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
msgstr ""
@@ -12875,6 +13060,9 @@ msgstr ""
msgid "Environments|Note that this action will stop the environment, but it will %{emphasisStart}not%{emphasisEnd} have an effect on any existing deployment due to no “stop environment action†being defined in the %{ciConfigLinkStart}.gitlab-ci.yml%{ciConfigLinkEnd} file."
msgstr ""
+msgid "Environments|Open"
+msgstr ""
+
msgid "Environments|Open live environment"
msgstr ""
@@ -12914,9 +13102,6 @@ msgstr ""
msgid "Environments|Stopping %{environmentName}"
msgstr ""
-msgid "Environments|Take the survey"
-msgstr ""
-
msgid "Environments|There was an error fetching the logs. Please try again."
msgstr ""
@@ -12938,9 +13123,6 @@ msgstr ""
msgid "Environments|You don't have any environments right now"
msgstr ""
-msgid "Environments|Your feedback helps GitLab make environments better for you and other users. Participate and enter a sweepstake to win a USD 30 gift card."
-msgstr ""
-
msgid "Environments|by %{avatar}"
msgstr ""
@@ -13223,7 +13405,7 @@ msgstr ""
msgid "Error parsing CSV file. Please make sure it has"
msgstr ""
-msgid "Error rendering markdown preview"
+msgid "Error rendering Markdown preview"
msgstr ""
msgid "Error saving label update."
@@ -13271,6 +13453,9 @@ msgstr ""
msgid "Error: %{error_message}"
msgstr ""
+msgid "Error: Couldn't load some or all of the changes."
+msgstr ""
+
msgid "Error: No AWS credentials were supplied"
msgstr ""
@@ -13304,6 +13489,9 @@ msgstr ""
msgid "ErrorTracking|Enable error tracking"
msgstr ""
+msgid "ErrorTracking|Error tracking backend"
+msgstr ""
+
msgid "ErrorTracking|If you self-host Sentry, enter your Sentry instance's full URL. If you use Sentry's hosted solution, enter https://sentry.io"
msgstr ""
@@ -13337,6 +13525,12 @@ msgstr ""
msgid "Escalation policies must have at least one rule"
msgstr ""
+msgid "EscalationPolicies|%{clockIcon} IF alert is not %{alertStatus} in %{minutes}"
+msgstr ""
+
+msgid "EscalationPolicies|%{notificationIcon} THEN %{doAction} %{forScheduleOrUser}"
+msgstr ""
+
msgid "EscalationPolicies|+ Add an additional rule"
msgstr ""
@@ -13379,13 +13573,13 @@ msgstr ""
msgid "EscalationPolicies|Escalation policies"
msgstr ""
-msgid "EscalationPolicies|Escalation rules"
+msgid "EscalationPolicies|Escalation policy %{obstacle} in Project %{project}"
msgstr ""
-msgid "EscalationPolicies|Failed to load oncall-schedules"
+msgid "EscalationPolicies|Escalation rules"
msgstr ""
-msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} %{then} THEN %{doAction} %{scheduleOrUser}"
+msgid "EscalationPolicies|Failed to load oncall-schedules"
msgstr ""
msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} minutes"
@@ -13463,18 +13657,36 @@ msgstr ""
msgid "Every %{action} attempt has failed: %{job_error_message}. Please try again."
msgstr ""
+msgid "Every 3 months"
+msgstr ""
+
+msgid "Every 3 months on the %{day} at %{time} %{timezone}"
+msgstr ""
+
+msgid "Every 6 months"
+msgstr ""
+
+msgid "Every 6 months on the %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Every day"
msgstr ""
msgid "Every day (at %{time})"
msgstr ""
+msgid "Every day at %{time} %{timezone}"
+msgstr ""
+
msgid "Every month"
msgstr ""
msgid "Every month (Day %{day} at %{time})"
msgstr ""
+msgid "Every month on the %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Every three months"
msgstr ""
@@ -13489,6 +13701,15 @@ msgstr[1] ""
msgid "Every week (%{weekday} at %{time})"
msgstr ""
+msgid "Every week on %{day} at %{time} %{timezone}"
+msgstr ""
+
+msgid "Every year"
+msgstr ""
+
+msgid "Every year on %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Everyone"
msgstr ""
@@ -13525,9 +13746,6 @@ msgstr ""
msgid "Exactly one of %{attributes} is required"
msgstr ""
-msgid "Example: %{ip_address}. %{read_more_link}."
-msgstr ""
-
msgid "Example: @sub\\.company\\.com$"
msgstr ""
@@ -13594,13 +13812,13 @@ msgstr ""
msgid "Expand pipeline"
msgstr ""
-msgid "Expand sidebar"
+msgid "Expand settings section"
msgstr ""
-msgid "Expected documents: %{expected_documents}"
+msgid "Expand sidebar"
msgstr ""
-msgid "Experienced"
+msgid "Expected documents: %{expected_documents}"
msgstr ""
msgid "ExperimentSubject|Must have exactly one of User, Namespace, or Project."
@@ -13885,9 +14103,6 @@ msgstr ""
msgid "Failed to load related branches"
msgstr ""
-msgid "Failed to load sidebar lock status"
-msgstr ""
-
msgid "Failed to load stacktrace."
msgstr ""
@@ -14312,6 +14527,9 @@ msgstr ""
msgid "Files"
msgstr ""
+msgid "Files API Rate Limits"
+msgstr ""
+
msgid "Files breadcrumb"
msgstr ""
@@ -15311,6 +15529,9 @@ msgstr ""
msgid "GitLab group: %{source_link}"
msgstr ""
+msgid "GitLab informs you if a new version is available."
+msgstr ""
+
msgid "GitLab is a complete DevOps platform, delivered as a single application, fundamentally changing the way Development, Security, and Ops teams collaborate"
msgstr ""
@@ -15326,7 +15547,7 @@ msgstr ""
msgid "GitLab is open source software to collaborate on code."
msgstr ""
-msgid "GitLab is undergoing maintenance and is operating in a read-only mode."
+msgid "GitLab is undergoing maintenance and is operating in read-only mode."
msgstr ""
msgid "GitLab member or Email address"
@@ -15338,9 +15559,6 @@ msgstr ""
msgid "GitLab project export"
msgstr ""
-msgid "GitLab restart is required to apply changes."
-msgstr ""
-
msgid "GitLab single sign-on URL"
msgstr ""
@@ -15356,9 +15574,6 @@ msgstr ""
msgid "GitLab version"
msgstr ""
-msgid "GitLab will inform you if a new version is available."
-msgstr ""
-
msgid "GitLab will run a background job that will produce pseudonymized CSVs of the GitLab database that will be uploaded to your configured object storage directory."
msgstr ""
@@ -15623,9 +15838,21 @@ msgstr ""
msgid "Go to snippets"
msgstr ""
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check 'Allowed domains for sign-ups'."
+msgstr ""
+
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check 'Email restrictions for sign-ups'."
+msgstr ""
+
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check the 'Domain denylist'."
+msgstr ""
+
msgid "Go to the activity feed"
msgstr ""
+msgid "Go to the group’s 'Settings &gt; General' page, and check 'Restrict membership by email domain'."
+msgstr ""
+
msgid "Go to the milestone list"
msgstr ""
@@ -15662,6 +15889,12 @@ msgstr ""
msgid "Goal of the changes and what reviewers should be aware of"
msgstr ""
+msgid "Google Cloud"
+msgstr ""
+
+msgid "Google Cloud offers several deployment targets. Select the one most suitable for your project."
+msgstr ""
+
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
@@ -15746,9 +15979,6 @@ msgstr ""
msgid "Group ID"
msgstr ""
-msgid "Group ID: %{group_id}"
-msgstr ""
-
msgid "Group Owner must have signed in with SAML before enabling Group Managed Accounts"
msgstr ""
@@ -15923,6 +16153,12 @@ msgstr ""
msgid "GroupImport|Unable to process group import file"
msgstr ""
+msgid "GroupPage|Copy group ID"
+msgstr ""
+
+msgid "GroupPage|Group ID: %{group_id}"
+msgstr ""
+
msgid "GroupRoadmap|%{dateWord} – No end date"
msgstr ""
@@ -15977,6 +16213,9 @@ msgstr ""
msgid "GroupRoadmap|Within 3 years"
msgstr ""
+msgid "GroupSAML|\"persistent\" recommended"
+msgstr ""
+
msgid "GroupSAML|%{strongOpen}Warning%{strongClose} - Enabling %{linkStart}SSO enforcement%{linkEnd} can reduce security risks."
msgstr ""
@@ -16109,6 +16348,9 @@ msgstr ""
msgid "GroupSAML|To be able to prohibit outer forks, you first need to enforce dedicate group managed accounts."
msgstr ""
+msgid "GroupSAML|Use SAML group links to manage group membership using SAML."
+msgstr ""
+
msgid "GroupSAML|Valid SAML Response"
msgstr ""
@@ -16121,13 +16363,10 @@ msgstr ""
msgid "GroupSAML|as %{access_level}"
msgstr ""
-msgid "GroupSAML|must match stored NameID of \"%{extern_uid}\" as we use this to identify users. If the NameID changes users will be unable to sign in."
-msgstr ""
-
-msgid "GroupSAML|should be \"persistent\""
+msgid "GroupSAML|must match stored NameID of \"%{extern_uid}\" to identify user and allow sign in"
msgstr ""
-msgid "GroupSAML|should be a random persistent ID, emails are discouraged"
+msgid "GroupSAML|recommend persistent ID instead of email"
msgstr ""
msgid "GroupSelect|No matching results"
@@ -16142,9 +16381,15 @@ msgstr ""
msgid "GroupSettings|Allow project access token creation"
msgstr ""
+msgid "GroupSettings|Applied to all subgroups unless overridden by a group owner. Groups already added to the project lose access."
+msgstr ""
+
msgid "GroupSettings|Auto DevOps pipeline was updated for the group"
msgstr ""
+msgid "GroupSettings|Available only on the top-level group. Applies to all subgroups. Groups already shared with a group outside %{group} are still shared unless removed manually."
+msgstr ""
+
msgid "GroupSettings|Badges"
msgstr ""
@@ -16196,6 +16441,9 @@ msgstr ""
msgid "GroupSettings|New runners registration token has been generated!"
msgstr ""
+msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgstr ""
+
msgid "GroupSettings|Pipeline settings was updated for the group"
msgstr ""
@@ -16208,12 +16456,15 @@ msgstr ""
msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
-msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups."
+msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups"
msgstr ""
msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
msgstr ""
+msgid "GroupSettings|Prevents group members from being notified if the group is mentioned."
+msgstr ""
+
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
msgstr ""
@@ -16250,21 +16501,6 @@ msgstr ""
msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}."
msgstr ""
-msgid "GroupSettings|This setting is only available on the top-level group and it applies to all subgroups. Groups that have already been shared with a group outside %{group} will still be shared, and this access will have to be revoked manually."
-msgstr ""
-
-msgid "GroupSettings|This setting will be applied to all subgroups unless overridden by a group owner. Groups that already have access to the project will continue to have access unless removed manually."
-msgstr ""
-
-msgid "GroupSettings|This setting will override user notification preferences for all members of the group, subgroups, and projects."
-msgstr ""
-
-msgid "GroupSettings|This setting will prevent group members from being notified if the group is mentioned."
-msgstr ""
-
-msgid "GroupSettings|This setting will prevent group members from forking projects outside of the group."
-msgstr ""
-
msgid "GroupSettings|Transfer group"
msgstr ""
@@ -16382,7 +16618,7 @@ msgstr ""
msgid "GroupsNew|No import options available"
msgstr ""
-msgid "GroupsNew|Not all related objects are migrated, as %{docs_link_start}described here%{docs_link_end}. Please %{feedback_link_start}leave feedback%{feedback_link_end} on this feature."
+msgid "GroupsNew|Not all related objects are migrated. %{docs_link_start}More info%{docs_link_end}."
msgstr ""
msgid "GroupsNew|Personal access token"
@@ -16514,15 +16750,27 @@ msgstr ""
msgid "Hello %{name},"
msgstr ""
-msgid "Hello there"
-msgstr ""
-
msgid "Hello, %{name}!"
msgstr ""
msgid "Hello, %{username}!"
msgstr ""
+msgid "HelloMessage|%{handshake_emoji} Contribute to GitLab: %{contribute_link}"
+msgstr ""
+
+msgid "HelloMessage|%{magnifier_emoji} Create a new GitLab issue: %{new_issue_link}"
+msgstr ""
+
+msgid "HelloMessage|%{rocket_emoji} We like your curiosity! Help us improve GitLab by joining the team: %{jobs_page_link}"
+msgstr ""
+
+msgid "HelloMessage|Does this page need fixes or improvements? Open an issue or contribute a merge request to help make GitLab more lovable. At GitLab, everyone can contribute!"
+msgstr ""
+
+msgid "HelloMessage|Welcome to GitLab!"
+msgstr ""
+
msgid "Help"
msgstr ""
@@ -16532,13 +16780,10 @@ msgstr ""
msgid "Helps prevent bots from creating accounts."
msgstr ""
-msgid "Helps prevent bots from creating issues"
-msgstr ""
-
-msgid "Helps prevent malicious users hide their activity"
+msgid "Helps prevent bots from creating issues."
msgstr ""
-msgid "Helps reduce request volume (e.g. from crawlers or abusive bots)"
+msgid "Helps prevent malicious users hide their activity."
msgstr ""
msgid "Helps reduce request volume (for example, from crawlers or abusive bots)"
@@ -16662,6 +16907,12 @@ msgstr ""
msgid "Housekeeping, export, path, transfer, remove, archive."
msgstr ""
+msgid "How do I configure Akismet?"
+msgstr ""
+
+msgid "How do I configure it?"
+msgstr ""
+
msgid "How do I configure runners?"
msgstr ""
@@ -16683,19 +16934,25 @@ msgstr ""
msgid "How do I set up this service?"
msgstr ""
+msgid "How do I use a web terminal?"
+msgstr ""
+
+msgid "How do I use file templates?"
+msgstr ""
+
msgid "How it works"
msgstr ""
msgid "How many days need to pass between marking entity for deletion and actual removing it."
msgstr ""
-msgid "How many seconds an IP will be counted towards the limit"
+msgid "How many seconds an IP counts toward the IP address limit."
msgstr ""
-msgid "I accept the %{terms_link}"
+msgid "How the job limiter handles jobs exceeding the thresholds specified below. The 'track' mode only logs the jobs. The 'compress' mode compresses the jobs and raises an exception if the compressed size exceeds the limit."
msgstr ""
-msgid "I accept the|Terms of Service and Privacy Policy"
+msgid "I accept the %{terms_link}"
msgstr ""
msgid "I forgot my password"
@@ -16779,13 +17036,16 @@ msgstr ""
msgid "IP Address"
msgstr ""
-msgid "IP expiration time"
+msgid "IP address expiration time"
msgstr ""
-msgid "IP subnet restriction only allowed for top-level groups"
+msgid "IP address restrictions"
+msgstr ""
+
+msgid "IP addresses per user"
msgstr ""
-msgid "IPs per user"
+msgid "IP subnet restriction only allowed for top-level groups"
msgstr ""
msgid "Identifier"
@@ -16800,6 +17060,9 @@ msgstr ""
msgid "If any indexed field exceeds this limit it will be truncated to this number of characters and the rest will not be indexed or searchable. This does not apply to repository and wiki indexing. Setting this to 0 means it is unlimited."
msgstr ""
+msgid "If blank, defaults to %{code_open}Retry later%{code_close}."
+msgstr ""
+
msgid "If blank, set allowable lifetime to %{instance_level_policy_in_words}, as defined by the instance admin. Once set, existing tokens for users in this group may be revoked."
msgstr ""
@@ -16851,6 +17114,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 did not initiate these sign-in attempts, please reach out to your administrator or enable two-factor authentication (2FA) on your account."
+msgstr ""
+
msgid "If you did not initiate this change, please contact your administrator immediately."
msgstr ""
@@ -16942,10 +17208,10 @@ msgstr ""
msgid "Import Projects from Gitea"
msgstr ""
-msgid "Import a project"
+msgid "Import an exported GitLab project"
msgstr ""
-msgid "Import an exported GitLab project"
+msgid "Import and export rate limits"
msgstr ""
msgid "Import failed due to a GitHub error: %{original}"
@@ -16957,12 +17223,18 @@ msgstr ""
msgid "Import from Jira"
msgstr ""
+msgid "Import group"
+msgstr ""
+
msgid "Import group from file"
msgstr ""
msgid "Import groups"
msgstr ""
+msgid "Import history"
+msgstr ""
+
msgid "Import in progress"
msgstr ""
@@ -17026,7 +17298,25 @@ msgstr ""
msgid "Import timed out. Import took longer than %{import_jobs_expiration} seconds"
msgstr ""
-msgid "Import/Export Rate Limits"
+msgid "ImportAProjectModal|Import from a project"
+msgstr ""
+
+msgid "ImportAProjectModal|Import members from another project"
+msgstr ""
+
+msgid "ImportAProjectModal|Import project members"
+msgstr ""
+
+msgid "ImportAProjectModal|Only project members (not group members) are imported, and they get the same permissions as the project you import from."
+msgstr ""
+
+msgid "ImportAProjectModal|Successfully imported"
+msgstr ""
+
+msgid "ImportAProjectModal|Unable to import project members"
+msgstr ""
+
+msgid "ImportAProjectModal|You're importing members to the %{strongStart}%{name}%{strongEnd} project."
msgstr ""
msgid "ImportButtons|Connect repositories from"
@@ -17079,7 +17369,7 @@ msgstr[1] ""
msgid "Importing..."
msgstr ""
-msgid "Import|A repository URL usually ends in a .git suffix, although this is not required. Double check to make sure your repository URL is correct."
+msgid "Import|There is not a valid Git repository at this URL. If your HTTP repository is not publicly accessible, verify your credentials."
msgstr ""
msgid "Improve customer support with Service Desk"
@@ -17088,9 +17378,6 @@ msgstr ""
msgid "Improves Git cloning performance."
msgstr ""
-msgid "In %{time_to_now}"
-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 ""
@@ -17376,7 +17663,7 @@ msgstr ""
msgid "InProductMarketing|Start a GitLab Ultimate trial today in less than one minute, no credit card required."
msgstr ""
-msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no CC required"
+msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no credit card required"
msgstr ""
msgid "InProductMarketing|Start a trial"
@@ -17415,7 +17702,7 @@ msgstr ""
msgid "InProductMarketing|Team up in GitLab for greater efficiency"
msgstr ""
-msgid "InProductMarketing|Team work makes the dream work"
+msgid "InProductMarketing|Team work makes the dream work"
msgstr ""
msgid "InProductMarketing|Test, create, deploy"
@@ -17996,6 +18283,9 @@ msgstr ""
msgid "Integrations|Create new issue in Jira"
msgstr ""
+msgid "Integrations|Create new issue in ZenTao"
+msgstr ""
+
msgid "Integrations|Default settings are inherited from the group level."
msgstr ""
@@ -18089,9 +18379,15 @@ msgstr ""
msgid "Integrations|Search Jira issues"
msgstr ""
+msgid "Integrations|Search ZenTao issues"
+msgstr ""
+
msgid "Integrations|Send notifications about project events to Unify Circuit."
msgstr ""
+msgid "Integrations|Send notifications about project events to a Unify Circuit conversation. %{docs_link}"
+msgstr ""
+
msgid "Integrations|Sign in to add namespaces"
msgstr ""
@@ -18131,6 +18427,9 @@ msgstr ""
msgid "Integrations|You've activated every integration 🎉"
msgstr ""
+msgid "Integrations|ZenTao issues display here when you create issues in your project in ZenTao."
+msgstr ""
+
msgid "Interactive mode"
msgstr ""
@@ -18158,9 +18457,6 @@ msgstr ""
msgid "Interval Pattern"
msgstr ""
-msgid "Introducing Value Stream Analytics"
-msgstr ""
-
msgid "Introducing Your DevOps Report"
msgstr ""
@@ -18257,6 +18553,12 @@ msgstr ""
msgid "Investigate vulnerability: %{title}"
msgstr ""
+msgid "Invisible Captcha"
+msgstr ""
+
+msgid "Invisible Captcha helps prevent the creation of spam accounts. It adds a honeypot field and time-sensitive form submission to the account signup form."
+msgstr ""
+
msgid "Invitation"
msgstr ""
@@ -18710,12 +19012,18 @@ msgstr ""
msgid "Issues"
msgstr ""
+msgid "Issues I've created"
+msgstr ""
+
msgid "Issues Rate Limits"
msgstr ""
msgid "Issues and merge requests"
msgstr ""
+msgid "Issues assigned to me"
+msgstr ""
+
msgid "Issues can be bugs, tasks or ideas to be discussed. Also, issues are searchable and filterable."
msgstr ""
@@ -18827,7 +19135,7 @@ msgstr ""
msgid "Iterations|Create cadence"
msgstr ""
-msgid "Iterations|Create your first iteration"
+msgid "Iterations|Create iteration"
msgstr ""
msgid "Iterations|Delete cadence"
@@ -18836,6 +19144,9 @@ msgstr ""
msgid "Iterations|Delete iteration cadence?"
msgstr ""
+msgid "Iterations|Delete iteration?"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -18869,12 +19180,18 @@ msgstr ""
msgid "Iterations|New iteration cadence"
msgstr ""
+msgid "Iterations|No closed iterations."
+msgstr ""
+
msgid "Iterations|No iteration cadences to show."
msgstr ""
msgid "Iterations|No iterations in cadence."
msgstr ""
+msgid "Iterations|No open iterations."
+msgstr ""
+
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
@@ -18905,6 +19222,9 @@ msgstr ""
msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
msgstr ""
+msgid "Iterations|This will remove the iteration from any issues that are assigned to it."
+msgstr ""
+
msgid "Iterations|Title"
msgstr ""
@@ -18920,15 +19240,9 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "I’m familiar with the basics of DevOps."
-msgstr ""
-
msgid "I’m joining my team who’s already on GitLab"
msgstr ""
-msgid "I’m not familiar with the basics of DevOps."
-msgstr ""
-
msgid "Jaeger URL"
msgstr ""
@@ -19193,6 +19507,9 @@ msgstr ""
msgid "Job"
msgstr ""
+msgid "Job %{jobName}"
+msgstr ""
+
msgid "Job Failed #%{build_id}"
msgstr ""
@@ -19783,9 +20100,6 @@ msgstr ""
msgid "Learn more in the"
msgstr ""
-msgid "Learn more in the|pipeline schedules documentation"
-msgstr ""
-
msgid "Learn more."
msgstr ""
@@ -19897,9 +20211,6 @@ msgstr ""
msgid "Leave Admin Mode"
msgstr ""
-msgid "Leave blank for no limit. Once set, existing personal access tokens may be revoked."
-msgstr ""
-
msgid "Leave edit mode? All unsaved changes will be lost."
msgstr ""
@@ -19945,10 +20256,10 @@ msgstr ""
msgid "LicenseCompliance|Acceptable license to be used in the project"
msgstr ""
-msgid "LicenseCompliance|Add a license"
+msgid "LicenseCompliance|Add license and related policy"
msgstr ""
-msgid "LicenseCompliance|Add license and related policy"
+msgid "LicenseCompliance|Add license policy"
msgstr ""
msgid "LicenseCompliance|Allow"
@@ -20038,6 +20349,9 @@ msgstr ""
msgid "LicenseManagement|Uncategorized"
msgstr ""
+msgid "Licensed Enterprise Edition features can be used if the project namespace's plan includes the feature, or if the project is public."
+msgstr ""
+
msgid "Licensed Features"
msgstr ""
@@ -20104,7 +20418,10 @@ msgstr ""
msgid "Limit namespaces and projects that can be indexed"
msgstr ""
-msgid "Limit sign in from multiple ips"
+msgid "Limit project size at a global, group, and project level. %{link_start}Learn more%{link_end}."
+msgstr ""
+
+msgid "Limit sign in from multiple IP addresses"
msgstr ""
msgid "Limit the number of concurrent operations this secondary site can run in the background."
@@ -20116,11 +20433,17 @@ msgstr ""
msgid "Limit the number of issues and epics per minute a user can create through web and API requests."
msgstr ""
+msgid "Limit the size of Sidekiq jobs stored in Redis."
+msgstr ""
+
msgid "Limited to showing %d event at most"
msgid_plural "Limited to showing %d events at most"
msgstr[0] ""
msgstr[1] ""
+msgid "Limiting mode"
+msgstr ""
+
msgid "Line changes"
msgstr ""
@@ -20190,9 +20513,6 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
-msgid "List of users to be excluded from the limit"
-msgstr ""
-
msgid "List options"
msgstr ""
@@ -20232,9 +20552,6 @@ msgstr ""
msgid "Loading functions timed out. Please reload the page to try again."
msgstr ""
-msgid "Loading issues"
-msgstr ""
-
msgid "Loading more"
msgstr ""
@@ -20526,6 +20843,9 @@ msgstr ""
msgid "Marked For Deletion At - %{deletion_time}"
msgstr ""
+msgid "Marked as ready. Merging is now allowed."
+msgstr ""
+
msgid "Marked this %{noun} as a draft."
msgstr ""
@@ -20598,52 +20918,22 @@ msgstr ""
msgid "Max 100,000 events"
msgstr ""
-msgid "Max 20 characters"
-msgstr ""
-
-msgid "Max Group Export Download requests per minute per user"
-msgstr ""
-
-msgid "Max Group Export requests per minute per user"
-msgstr ""
-
-msgid "Max Group Import requests per minute per user"
-msgstr ""
-
-msgid "Max Project Export Download requests per minute per user"
-msgstr ""
-
-msgid "Max Project Export requests per minute per user"
-msgstr ""
-
-msgid "Max Project Import requests per minute per user"
-msgstr ""
-
-msgid "Max authenticated API requests per period per user"
-msgstr ""
-
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
-msgid "Max authenticated web requests per period per user"
-msgstr ""
-
msgid "Max file size is 200 KB."
msgstr ""
-msgid "Max requests per minute per user"
-msgstr ""
-
msgid "Max role"
msgstr ""
msgid "Max session time"
msgstr ""
-msgid "Max unauthenticated requests per period per IP"
+msgid "MaxBuilds"
msgstr ""
-msgid "MaxBuilds"
+msgid "Maximum 20 characters"
msgstr ""
msgid "Maximum Conan package file size in bytes"
@@ -20679,6 +20969,12 @@ msgstr ""
msgid "Maximum attachment size (MB)"
msgstr ""
+msgid "Maximum authenticated API requests per rate limit period per user"
+msgstr ""
+
+msgid "Maximum authenticated web requests per rate limit period per user"
+msgstr ""
+
msgid "Maximum bulk request size (MiB)"
msgstr ""
@@ -20724,6 +21020,15 @@ msgstr ""
msgid "Maximum files in a diff"
msgstr ""
+msgid "Maximum group export download requests per minute"
+msgstr ""
+
+msgid "Maximum group export requests per minute"
+msgstr ""
+
+msgid "Maximum group import requests per minute"
+msgstr ""
+
msgid "Maximum import size"
msgstr ""
@@ -20760,7 +21065,7 @@ msgstr ""
msgid "Maximum number of projects."
msgstr ""
-msgid "Maximum number of unique IPs per user"
+msgid "Maximum number of unique IP addresses per user."
msgstr ""
msgid "Maximum page reached"
@@ -20769,12 +21074,24 @@ msgstr ""
msgid "Maximum page size"
msgstr ""
+msgid "Maximum project export download requests per minute"
+msgstr ""
+
+msgid "Maximum project export requests per minute"
+msgstr ""
+
+msgid "Maximum project import requests per minute"
+msgstr ""
+
msgid "Maximum push size"
msgstr ""
msgid "Maximum push size (MB)"
msgstr ""
+msgid "Maximum requests per minute"
+msgstr ""
+
msgid "Maximum running slices"
msgstr ""
@@ -20802,10 +21119,16 @@ msgstr ""
msgid "Maximum time between updates that a mirror can have when scheduled to synchronize."
msgstr ""
-msgid "Maximum time for web terminal websocket connection (in seconds). 0 for unlimited."
+msgid "Maximum time that users are allowed to skip the setup of two-factor authentication (in hours). Set to 0 (zero) to enforce at next sign in."
msgstr ""
-msgid "Maximum time that users are allowed to skip the setup of two-factor authentication (in hours). Set to 0 (zero) to enforce at next sign in."
+msgid "Maximum time, in seconds, for a web terminal websocket connection. 0 for unlimited."
+msgstr ""
+
+msgid "Maximum unauthenticated API requests per rate limit period per IP"
+msgstr ""
+
+msgid "Maximum unauthenticated web requests per rate limit period per IP"
msgstr ""
msgid "May"
@@ -20823,9 +21146,6 @@ msgstr ""
msgid "Medium vulnerabilities present"
msgstr ""
-msgid "Member lock"
-msgstr ""
-
msgid "Member since"
msgstr ""
@@ -20862,6 +21182,9 @@ msgstr ""
msgid "Members of a group may only view projects they have permission to access"
msgstr ""
+msgid "Membership"
+msgstr ""
+
msgid "Members|%{time} by %{user}"
msgstr ""
@@ -20922,9 +21245,6 @@ msgstr ""
msgid "Members|Expiration date updated successfully."
msgstr ""
-msgid "Members|Expired"
-msgstr ""
-
msgid "Members|Filter members"
msgstr ""
@@ -20940,9 +21260,6 @@ msgstr ""
msgid "Members|Membership"
msgstr ""
-msgid "Members|No expiration set"
-msgstr ""
-
msgid "Members|Remove \"%{groupName}\""
msgstr ""
@@ -20964,9 +21281,6 @@ msgstr ""
msgid "Members|Search invited"
msgstr ""
-msgid "Members|in %{time}"
-msgstr ""
-
msgid "Member|Deny access"
msgstr ""
@@ -21042,9 +21356,6 @@ msgstr ""
msgid "Merge request %{mr_link} was reviewed by %{mr_author}"
msgstr ""
-msgid "Merge request (MR) approvals"
-msgstr ""
-
msgid "Merge request analytics"
msgstr ""
@@ -21066,12 +21377,21 @@ msgstr ""
msgid "Merge requests"
msgstr ""
+msgid "Merge requests I've created"
+msgstr ""
+
msgid "Merge requests are a place to propose changes you've made to a project and discuss those changes with others"
msgstr ""
msgid "Merge requests are read-only in a secondary Geo node"
msgstr ""
+msgid "Merge requests assigned to me"
+msgstr ""
+
+msgid "Merge requests that I'm a reviewer"
+msgstr ""
+
msgid "Merge the branch and fix any conflicts that come up"
msgstr ""
@@ -21132,10 +21452,10 @@ msgstr ""
msgid "MergeRequests|An error occurred while saving the draft comment."
msgstr ""
-msgid "MergeRequests|Failed to squash. Should be done manually."
+msgid "MergeRequests|Create issue to resolve thread"
msgstr ""
-msgid "MergeRequests|Resolve this thread in a new issue"
+msgid "MergeRequests|Failed to squash. Should be done manually."
msgstr ""
msgid "MergeRequests|Saving the comment failed"
@@ -21949,6 +22269,9 @@ msgstr ""
msgid "MoveIssue|Cannot move issue to project it originates from!"
msgstr ""
+msgid "MoveIssue|Cannot move issues of '%{issue_type}' type."
+msgstr ""
+
msgid "Moved issue to %{label} column in the board."
msgstr ""
@@ -22074,6 +22397,15 @@ 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. To learn more about reducing storage capacity please visit our docs."
msgstr ""
+msgid "NamespaceUserCap|Pending users must be reviewed and approved by a group owner. Learn more about %{user_caps_link_start}User Caps%{link_end} and %{users_pending_approval_link_start}Users Pending Approval%{link_end}."
+msgstr ""
+
+msgid "NamespaceUserCap|View pending user approvals"
+msgstr ""
+
+msgid "NamespaceUserCap|Your group has reached its billable member limit"
+msgstr ""
+
msgid "Namespaces"
msgstr ""
@@ -22116,9 +22448,6 @@ msgstr ""
msgid "Network"
msgstr ""
-msgid "Network Policy|New rule"
-msgstr ""
-
msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is inbound from a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
msgstr ""
@@ -22140,16 +22469,13 @@ msgstr ""
msgid "NetworkPolicies|%{strongOpen}any%{strongClose} port"
msgstr ""
-msgid "NetworkPolicies|+ Add alert"
-msgstr ""
-
msgid "NetworkPolicies|.yaml"
msgstr ""
msgid "NetworkPolicies|.yaml mode"
msgstr ""
-msgid "NetworkPolicies|Actions"
+msgid "NetworkPolicies|Add alert"
msgstr ""
msgid "NetworkPolicies|Alerts are intended to be selectively used for a limited number of events that are potentially concerning and warrant a manual review. Alerts should not be used as a substitute for a SIEM or a logging tool. High volume alerts are likely to be dropped so as to preserve the stability of GitLab's integration with Kubernetes."
@@ -22185,9 +22511,6 @@ msgstr ""
msgid "NetworkPolicies|Deny all traffic"
msgstr ""
-msgid "NetworkPolicies|Description"
-msgstr ""
-
msgid "NetworkPolicies|Edit policy"
msgstr ""
@@ -22200,9 +22523,6 @@ msgstr ""
msgid "NetworkPolicies|IP/subnet"
msgstr ""
-msgid "NetworkPolicies|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
-msgstr ""
-
msgid "NetworkPolicies|Invalid or empty policy"
msgstr ""
@@ -22212,19 +22532,16 @@ msgstr ""
msgid "NetworkPolicies|Kubernetes error: %{error}"
msgstr ""
-msgid "NetworkPolicies|Name"
-msgstr ""
-
msgid "NetworkPolicies|Network"
msgstr ""
-msgid "NetworkPolicies|Network traffic"
+msgid "NetworkPolicies|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
msgstr ""
-msgid "NetworkPolicies|New policy"
+msgid "NetworkPolicies|Network policy can be created after the environment is loaded successfully."
msgstr ""
-msgid "NetworkPolicies|No policies detected"
+msgid "NetworkPolicies|Network traffic"
msgstr ""
msgid "NetworkPolicies|None selected"
@@ -22233,21 +22550,12 @@ msgstr ""
msgid "NetworkPolicies|Please %{installLinkStart}install%{installLinkEnd} and %{configureLinkStart}configure a Kubernetes Agent for this project%{configureLinkEnd} to enable alerts."
msgstr ""
-msgid "NetworkPolicies|Policies are a specification of how groups of pods are allowed to communicate with each other's network endpoints."
-msgstr ""
-
msgid "NetworkPolicies|Policy %{policyName} was successfully changed"
msgstr ""
msgid "NetworkPolicies|Policy definition"
msgstr ""
-msgid "NetworkPolicies|Policy editor"
-msgstr ""
-
-msgid "NetworkPolicies|Policy preview"
-msgstr ""
-
msgid "NetworkPolicies|Rule"
msgstr ""
@@ -22257,9 +22565,6 @@ msgstr ""
msgid "NetworkPolicies|Rule mode is unavailable for this policy. In some cases, we cannot parse the YAML file back into the rules editor."
msgstr ""
-msgid "NetworkPolicies|Rules"
-msgstr ""
-
msgid "NetworkPolicies|Save changes"
msgstr ""
@@ -22272,9 +22577,6 @@ msgstr ""
msgid "NetworkPolicies|Traffic that does not match any rule will be blocked."
msgstr ""
-msgid "NetworkPolicies|Unable to parse policy"
-msgstr ""
-
msgid "NetworkPolicies|all DNS names"
msgstr ""
@@ -22454,6 +22756,9 @@ msgstr ""
msgid "New issue"
msgstr ""
+msgid "New issue in %{project}"
+msgstr ""
+
msgid "New issue title"
msgstr ""
@@ -22532,7 +22837,7 @@ msgstr ""
msgid "Newest first"
msgstr ""
-msgid "Newly registered users will by default be external"
+msgid "Newly-registered users are external by default"
msgstr ""
msgid "Next"
@@ -22847,8 +23152,10 @@ msgstr ""
msgid "No webhooks found, add one in the form above."
msgstr ""
-msgid "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} to renew your subscription."
-msgstr ""
+msgid "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} day to renew your subscription."
+msgid_plural "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} days to renew your subscription."
+msgstr[0] ""
+msgstr[1] ""
msgid "No. of commits"
msgstr ""
@@ -22865,7 +23172,7 @@ msgstr ""
msgid "Nodes"
msgstr ""
-msgid "Non-admin users can sign in with read-only access and make read-only API requests."
+msgid "Non-admin users are restricted to read-only access, in both GitLab UI and API."
msgstr ""
msgid "None"
@@ -22946,7 +23253,7 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
-msgid "Notes Rate Limits"
+msgid "Notes rate limit"
msgstr ""
msgid "Notes|Are you sure you want to cancel creating this comment?"
@@ -23113,9 +23420,6 @@ msgstr ""
msgid "November"
msgstr ""
-msgid "Novice"
-msgstr ""
-
msgid "Now, personalize your GitLab experience"
msgstr ""
@@ -23284,7 +23588,7 @@ msgstr ""
msgid "OnCallSchedules|For this rotation, on-call will be:"
msgstr ""
-msgid "OnCallSchedules|On-call schedule %{schedule} in Project %{project}"
+msgid "OnCallSchedules|On-call schedule %{obstacle} in Project %{project}"
msgstr ""
msgid "OnCallSchedules|On-call schedules"
@@ -23431,22 +23735,22 @@ msgstr ""
msgid "OnDemandScans|Scanner profile"
msgstr ""
-msgid "OnDemandScans|Select one of the existing profiles"
+msgid "OnDemandScans|Schedule scan"
msgstr ""
-msgid "OnDemandScans|Site profile"
+msgid "OnDemandScans|Select one of the existing profiles"
msgstr ""
-msgid "OnDemandScans|Use existing scanner profile"
+msgid "OnDemandScans|Site profile"
msgstr ""
-msgid "OnDemandScans|Use existing site profile"
+msgid "OnDemandScans|Start time"
msgstr ""
-msgid "OnDemandScans|You can either choose a passive scan or validate the target site in your chosen site profile. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
+msgid "OnDemandScans|Use existing scanner profile"
msgstr ""
-msgid "OnDemandScans|You cannot run an active scan against an unvalidated site."
+msgid "OnDemandScans|Use existing site profile"
msgstr ""
msgid "OnDemandScans|You must create a repository within your project to run an on-demand scan."
@@ -23511,6 +23815,9 @@ msgstr ""
msgid "Only admins can delete project"
msgstr ""
+msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
+msgstr ""
+
msgid "Only include features new to your current subscription tier."
msgstr ""
@@ -23529,6 +23836,12 @@ msgstr ""
msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
+msgid "Only reCAPTCHA v2 is supported:"
+msgstr ""
+
+msgid "Only users from the specified IP address ranges are able to reach this group, including all subgroups, projects, and Git repositories."
+msgstr ""
+
msgid "Only verified users with an email address in any of these domains can be added to the group."
msgstr ""
@@ -23715,9 +24028,6 @@ msgstr ""
msgid "Package Registry"
msgstr ""
-msgid "Package Registry Rate Limits"
-msgstr ""
-
msgid "Package Registry: authenticated API requests"
msgstr ""
@@ -23736,6 +24046,9 @@ msgstr ""
msgid "Package recipe already exists"
msgstr ""
+msgid "Package registry rate limits"
+msgstr ""
+
msgid "Package type"
msgstr ""
@@ -23802,6 +24115,9 @@ msgstr ""
msgid "PackageRegistry|Composer"
msgstr ""
+msgid "PackageRegistry|Composer.json with license: %{license} and version: %{version}"
+msgstr ""
+
msgid "PackageRegistry|Conan"
msgstr ""
@@ -23865,6 +24181,9 @@ msgstr ""
msgid "PackageRegistry|Copy require package include"
msgstr ""
+msgid "PackageRegistry|Copy target SHA"
+msgstr ""
+
msgid "PackageRegistry|Copy yarn command"
msgstr ""
@@ -23931,6 +24250,9 @@ msgstr ""
msgid "PackageRegistry|Install package version"
msgstr ""
+msgid "PackageRegistry|Instance-level"
+msgstr ""
+
msgid "PackageRegistry|Invalid Package: failed metadata extraction"
msgstr ""
@@ -23976,6 +24298,9 @@ msgstr ""
msgid "PackageRegistry|Pip Command"
msgstr ""
+msgid "PackageRegistry|Project-level"
+msgstr ""
+
msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
msgstr ""
@@ -23997,6 +24322,9 @@ msgstr ""
msgid "PackageRegistry|Remove package"
msgstr ""
+msgid "PackageRegistry|Required Python: %{pythonVersion}"
+msgstr ""
+
msgid "PackageRegistry|RubyGems"
msgstr ""
@@ -24039,6 +24367,9 @@ msgstr ""
msgid "PackageRegistry|Source project located at %{link}"
msgstr ""
+msgid "PackageRegistry|Target SHA: %{sha}"
+msgstr ""
+
msgid "PackageRegistry|There are no other versions of this package."
msgstr ""
@@ -24207,6 +24538,18 @@ msgstr ""
msgid "Password was successfully updated. Please sign in again."
msgstr ""
+msgid "PasswordPrompt|Confirm password"
+msgstr ""
+
+msgid "PasswordPrompt|Confirm password to continue"
+msgstr ""
+
+msgid "PasswordPrompt|Password is required"
+msgstr ""
+
+msgid "PasswordPrompt|Please enter your password to confirm"
+msgstr ""
+
msgid "Passwords should be unique and not used for any other sites or services."
msgstr ""
@@ -24234,6 +24577,9 @@ msgstr ""
msgid "Paste project path (i.e. gitlab-org/gitlab)"
msgstr ""
+msgid "Paste this DSN into your Sentry SDK"
+msgstr ""
+
msgid "Paste your public SSH key, which is usually contained in the file '~/.ssh/id_ed25519.pub' or '~/.ssh/id_rsa.pub' and begins with 'ssh-ed25519' or 'ssh-rsa'. Do not paste your private SSH key, as that can compromise your identity."
msgstr ""
@@ -24318,6 +24664,9 @@ msgstr ""
msgid "PerformanceBar|First Contentful Paint"
msgstr ""
+msgid "PerformanceBar|Flamegraph with mode:"
+msgstr ""
+
msgid "PerformanceBar|Frontend resources"
msgstr ""
@@ -24351,6 +24700,15 @@ msgstr ""
msgid "PerformanceBar|Trace"
msgstr ""
+msgid "PerformanceBar|cpu"
+msgstr ""
+
+msgid "PerformanceBar|object"
+msgstr ""
+
+msgid "PerformanceBar|wall"
+msgstr ""
+
msgid "Period in seconds"
msgstr ""
@@ -24579,6 +24937,48 @@ msgstr ""
msgid "PipelineSchedules|Variables"
msgstr ""
+msgid "PipelineSource|API"
+msgstr ""
+
+msgid "PipelineSource|Chat"
+msgstr ""
+
+msgid "PipelineSource|External"
+msgstr ""
+
+msgid "PipelineSource|External Pull Request"
+msgstr ""
+
+msgid "PipelineSource|Merge Request"
+msgstr ""
+
+msgid "PipelineSource|On-Demand DAST Scan"
+msgstr ""
+
+msgid "PipelineSource|On-Demand DAST Validation"
+msgstr ""
+
+msgid "PipelineSource|Parent Pipeline"
+msgstr ""
+
+msgid "PipelineSource|Pipeline"
+msgstr ""
+
+msgid "PipelineSource|Push"
+msgstr ""
+
+msgid "PipelineSource|Schedule"
+msgstr ""
+
+msgid "PipelineSource|Trigger"
+msgstr ""
+
+msgid "PipelineSource|Web"
+msgstr ""
+
+msgid "PipelineSource|Web IDE"
+msgstr ""
+
msgid "PipelineStatusTooltip|Pipeline: %{ciStatus}"
msgstr ""
@@ -24879,46 +25279,7 @@ msgstr ""
msgid "Pipeline|Source"
msgstr ""
-msgid "Pipeline|Source|API"
-msgstr ""
-
-msgid "Pipeline|Source|Chat"
-msgstr ""
-
-msgid "Pipeline|Source|External"
-msgstr ""
-
-msgid "Pipeline|Source|External Pull Request"
-msgstr ""
-
-msgid "Pipeline|Source|Merge Request"
-msgstr ""
-
-msgid "Pipeline|Source|On-Demand DAST Scan"
-msgstr ""
-
-msgid "Pipeline|Source|On-Demand DAST Validation"
-msgstr ""
-
-msgid "Pipeline|Source|Parent Pipeline"
-msgstr ""
-
-msgid "Pipeline|Source|Pipeline"
-msgstr ""
-
-msgid "Pipeline|Source|Push"
-msgstr ""
-
-msgid "Pipeline|Source|Schedule"
-msgstr ""
-
-msgid "Pipeline|Source|Trigger"
-msgstr ""
-
-msgid "Pipeline|Source|Web"
-msgstr ""
-
-msgid "Pipeline|Source|Web IDE"
+msgid "Pipeline|Source|Security Policy"
msgstr ""
msgid "Pipeline|Specify variable values to be used in this run. The values specified in %{linkStart}CI/CD settings%{linkEnd} will be used by default."
@@ -24969,7 +25330,7 @@ msgstr ""
msgid "Pipeline|We are currently unable to fetch pipeline data"
msgstr ""
-msgid "Pipeline|You’re about to stop pipeline %{pipelineId}."
+msgid "Pipeline|You’re about to stop pipeline #%{pipelineId}."
msgstr ""
msgid "Pipeline|for"
@@ -24996,6 +25357,9 @@ msgstr ""
msgid "Plain diff"
msgstr ""
+msgid "Plain-text response to send to clients that hit a rate limit"
+msgstr ""
+
msgid "Plan:"
msgstr ""
@@ -25140,9 +25504,6 @@ msgstr ""
msgid "Please provide attributes to update"
msgstr ""
-msgid "Please provide your username or email address."
-msgstr ""
-
msgid "Please reach out if you have any questions and we'll be happy to assist."
msgstr ""
@@ -25185,9 +25546,6 @@ msgstr ""
msgid "Please set a new password before proceeding."
msgstr ""
-msgid "Please share your feedback about %{featureName} %{linkStart}in this issue%{linkEnd} to help us improve the experience."
-msgstr ""
-
msgid "Please solve the captcha"
msgstr ""
@@ -25365,6 +25723,9 @@ msgstr ""
msgid "Prevent adding new members to project membership within this group"
msgstr ""
+msgid "Prevent auto-stopping"
+msgstr ""
+
msgid "Prevent editing approval rules in projects and merge requests."
msgstr ""
@@ -25377,7 +25738,7 @@ msgstr ""
msgid "Prevent users from changing their profile name"
msgstr ""
-msgid "Prevent users from performing write operations on GitLab while performing maintenance."
+msgid "Prevent users from performing write operations while GitLab maintenance is in progress."
msgstr ""
msgid "Preview"
@@ -25650,6 +26011,9 @@ msgstr ""
msgid "Profiles|Enter your name, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Enter your password to confirm the email change"
+msgstr ""
+
msgid "Profiles|Enter your pronouns to let people know how to refer to you"
msgstr ""
@@ -25884,10 +26248,10 @@ msgstr ""
msgid "Profiles|e.g. My MacBook key"
msgstr ""
-msgid "Profiles|username"
+msgid "Profiles|https://website.com"
msgstr ""
-msgid "Profiles|website.com"
+msgid "Profiles|username"
msgstr ""
msgid "Profiles|your account"
@@ -26130,9 +26494,21 @@ msgstr ""
msgid "ProjectSelect| or group"
msgstr ""
+msgid "ProjectSelect|No matching results"
+msgstr ""
+
msgid "ProjectSelect|Search for project"
msgstr ""
+msgid "ProjectSelect|Search projects"
+msgstr ""
+
+msgid "ProjectSelect|Select a project"
+msgstr ""
+
+msgid "ProjectSelect|There was an error fetching the projects. Please try again."
+msgstr ""
+
msgid "ProjectService|Drone server URL"
msgstr ""
@@ -26220,6 +26596,9 @@ msgstr ""
msgid "ProjectService|Trigger event when a new, unique alert is recorded."
msgstr ""
+msgid "ProjectService|Trigger event when a new, unique vulnerability is recorded. (Note: This feature requires an Ultimate plan.)"
+msgstr ""
+
msgid "ProjectService|Trigger event when a pipeline status changes."
msgstr ""
@@ -26634,9 +27013,15 @@ msgstr ""
msgid "Projects are graded based on the highest severity vulnerability present"
msgstr ""
+msgid "Projects are organized into groups"
+msgstr ""
+
msgid "Projects contributed to"
msgstr ""
+msgid "Projects help you organize your work. They contain your file repository, issues, merge requests, and so much more."
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr ""
@@ -26871,10 +27256,10 @@ msgstr ""
msgid "PrometheusService|Prometheus cluster integration"
msgstr ""
-msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
+msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
msgstr ""
-msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
+msgid "PrometheusService|The ID of the IAP-secured resource."
msgstr ""
msgid "PrometheusService|The Prometheus API base URL."
@@ -27492,6 +27877,9 @@ msgstr ""
msgid "Rate limit"
msgstr ""
+msgid "Rate limits can help reduce request volume (like from crawlers or abusive bots)."
+msgstr ""
+
msgid "Raw blob request rate limit per minute"
msgstr ""
@@ -27504,6 +27892,9 @@ msgstr ""
msgid "Re-authentication required"
msgstr ""
+msgid "Re-import"
+msgstr ""
+
msgid "Re-request review"
msgstr ""
@@ -27525,6 +27916,9 @@ msgstr ""
msgid "Read more about related issues"
msgstr ""
+msgid "Read their documentation."
+msgstr ""
+
msgid "Ready to get started with GitLab? Follow these steps to set up your workspace, plan and commit changes, and deploy your project."
msgstr ""
@@ -27558,6 +27952,9 @@ msgstr ""
msgid "Receive any notifications from GitLab."
msgstr ""
+msgid "Receive notification of abuse reports by email."
+msgstr ""
+
msgid "Receive notifications about your own activity"
msgstr ""
@@ -27701,9 +28098,6 @@ msgstr ""
msgid "Registry setup"
msgstr ""
-msgid "Regulate approvals by authors/committers. Affects all projects."
-msgstr ""
-
msgid "Reindexing Status: %{status} (Slice multiplier: %{multiplier}, Maximum running slices: %{max_slices})"
msgstr ""
@@ -27799,6 +28193,9 @@ msgstr ""
msgid "Release|Something went wrong while saving the release details."
msgstr ""
+msgid "Reload page"
+msgstr ""
+
msgid "Remediations"
msgstr ""
@@ -28081,6 +28478,9 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
+msgid "Repeats"
+msgstr ""
+
msgid "Replace"
msgstr ""
@@ -28443,10 +28843,7 @@ msgstr ""
msgid "Require additional authentication for administrative tasks."
msgstr ""
-msgid "Require all users in this group to setup Two-factor authentication"
-msgstr ""
-
-msgid "Require all users in this group to setup two-factor authentication"
+msgid "Require all users in this group to set up two-factor authentication"
msgstr ""
msgid "Required approvals (%{approvals_given} given)"
@@ -28492,6 +28889,9 @@ msgstr[1] ""
msgid "Requires values to meet regular expression requirements."
msgstr ""
+msgid "Requires you to deploy or set up cloud-hosted Sentry."
+msgstr ""
+
msgid "Requires your primary GitLab email address."
msgstr ""
@@ -28552,9 +28952,6 @@ msgstr ""
msgid "Resolve"
msgstr ""
-msgid "Resolve all threads in new issue"
-msgstr ""
-
msgid "Resolve conflicts"
msgstr ""
@@ -28612,6 +29009,9 @@ msgstr ""
msgid "Response text"
msgstr ""
+msgid "Restart GitLab to apply changes."
+msgstr ""
+
msgid "Restart Terminal"
msgstr ""
@@ -28630,6 +29030,9 @@ msgstr ""
msgid "Restoring the project will prevent the project from being removed on this date and restore people's ability to make changes to it."
msgstr ""
+msgid "Restrict group access by IP address. %{link_start}Learn more%{link_end}."
+msgstr ""
+
msgid "Restrict membership by email domain"
msgstr ""
@@ -28943,6 +29346,9 @@ msgstr ""
msgid "Runners|Runner #%{runner_id}"
msgstr ""
+msgid "Runners|Runner assigned to project."
+msgstr ""
+
msgid "Runners|Runner is offline, last contact was %{runner_contact} ago"
msgstr ""
@@ -28955,6 +29361,9 @@ msgstr ""
msgid "Runners|Runner registration"
msgstr ""
+msgid "Runners|Runner unassigned from project."
+msgstr ""
+
msgid "Runners|Runners"
msgstr ""
@@ -29147,7 +29556,7 @@ msgstr ""
msgid "SastEntryPoints|How do I set up SAST?"
msgstr ""
-msgid "SastEntryPoints|Learn more."
+msgid "SastEntryPoints|Learn more"
msgstr ""
msgid "Satisfied"
@@ -29189,7 +29598,7 @@ msgstr ""
msgid "Save pipeline schedule"
msgstr ""
-msgid "Save space and find images in the container Registry. remove unneeded tags and keep only the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
+msgid "Save storage space by automatically deleting tags from the container registry and keeping the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
msgstr ""
msgid "Saving"
@@ -29363,6 +29772,9 @@ msgstr ""
msgid "Search or filter results…"
msgstr ""
+msgid "Search or jump to..."
+msgstr ""
+
msgid "Search project"
msgstr ""
@@ -29423,16 +29835,16 @@ msgstr ""
msgid "SearchCodeResults|of %{link_to_project}"
msgstr ""
-msgid "SearchResults|Showing %{count} %{scope} for%{term_element}"
+msgid "SearchResults|Showing %{count} %{scope} for %{term_element}"
msgstr ""
-msgid "SearchResults|Showing %{count} %{scope} for%{term_element} in your personal and project snippets"
+msgid "SearchResults|Showing %{count} %{scope} for %{term_element} in your personal and project snippets"
msgstr ""
-msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for%{term_element}"
+msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for %{term_element}"
msgstr ""
-msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for%{term_element} in your personal and project snippets"
+msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for %{term_element} in your personal and project snippets"
msgstr ""
msgid "SearchResults|code result"
@@ -29514,6 +29926,9 @@ msgstr ""
msgid "Secret Detection"
msgstr ""
+msgid "Secret access key"
+msgstr ""
+
msgid "Secret token"
msgstr ""
@@ -29553,9 +29968,6 @@ msgstr ""
msgid "SecurityApprovals|A merge request approval is required when the license compliance report contains a denied license."
msgstr ""
-msgid "SecurityApprovals|Configurable if security scanners are enabled. %{linkStart}Learn more.%{linkEnd}"
-msgstr ""
-
msgid "SecurityApprovals|Coverage-Check"
msgstr ""
@@ -29568,24 +29980,18 @@ msgstr ""
msgid "SecurityApprovals|Learn more about Vulnerability-Check"
msgstr ""
-msgid "SecurityApprovals|License Scanning must be enabled. %{linkStart}Learn more%{linkEnd}."
-msgstr ""
-
msgid "SecurityApprovals|License-Check"
msgstr ""
msgid "SecurityApprovals|Requires approval for Denied licenses. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}More information%{linkEnd}"
+msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "SecurityApprovals|Requires approval for vulnerabilities. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
-msgid "SecurityApprovals|Test coverage must be enabled. %{linkStart}Learn more%{linkEnd}."
-msgstr ""
-
msgid "SecurityApprovals|Vulnerability-Check"
msgstr ""
@@ -29649,6 +30055,12 @@ msgstr ""
msgid "SecurityConfiguration|Immediately begin risk analysis and remediation with application security features. Start with SAST and Secret Detection, available to all plans. Upgrade to Ultimate to get all features, including:"
msgstr ""
+msgid "SecurityConfiguration|Manage corpus"
+msgstr ""
+
+msgid "SecurityConfiguration|Manage corpus files used as mutation sources in coverage fuzzing."
+msgstr ""
+
msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
msgstr ""
@@ -29703,6 +30115,12 @@ msgstr ""
msgid "SecurityOrchestration|Action"
msgstr ""
+msgid "SecurityOrchestration|Actions"
+msgstr ""
+
+msgid "SecurityOrchestration|Add rule"
+msgstr ""
+
msgid "SecurityOrchestration|All policies"
msgstr ""
@@ -29736,9 +30154,6 @@ msgstr ""
msgid "SecurityOrchestration|Network"
msgstr ""
-msgid "SecurityOrchestration|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
-msgstr ""
-
msgid "SecurityOrchestration|New policy"
msgstr ""
@@ -29754,6 +30169,9 @@ msgstr ""
msgid "SecurityOrchestration|Policy editor"
msgstr ""
+msgid "SecurityOrchestration|Policy preview"
+msgstr ""
+
msgid "SecurityOrchestration|Policy status"
msgstr ""
@@ -29763,6 +30181,9 @@ msgstr ""
msgid "SecurityOrchestration|Rule"
msgstr ""
+msgid "SecurityOrchestration|Rules"
+msgstr ""
+
msgid "SecurityOrchestration|Scan Execution"
msgstr ""
@@ -29856,6 +30277,9 @@ msgstr ""
msgid "SecurityReports|Create issue"
msgstr ""
+msgid "SecurityReports|Development vulnerabilities"
+msgstr ""
+
msgid "SecurityReports|Dismiss vulnerability"
msgstr ""
@@ -29871,6 +30295,9 @@ msgstr ""
msgid "SecurityReports|Download results"
msgstr ""
+msgid "SecurityReports|Download scanned URLs"
+msgstr ""
+
msgid "SecurityReports|Download scanned resources"
msgstr ""
@@ -29994,6 +30421,9 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
+msgid "SecurityReports|The Vulnerability Report shows the results of the lastest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "SecurityReports|The security reports below contain one or more vulnerability findings that could not be parsed and were not recorded. Download the artifacts in the job output to investigate. Ensure any security report created conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
msgstr ""
@@ -30135,10 +30565,10 @@ msgstr ""
msgid "Select a repository"
msgstr ""
-msgid "Select a role"
+msgid "Select a repository containing templates for common files."
msgstr ""
-msgid "Select a shared template repository for all projects on this instance."
+msgid "Select a role"
msgstr ""
msgid "Select a template repository"
@@ -30216,6 +30646,9 @@ msgstr ""
msgid "Select project to choose zone"
msgstr ""
+msgid "Select project to create issue"
+msgstr ""
+
msgid "Select projects"
msgstr ""
@@ -30333,6 +30766,9 @@ msgstr ""
msgid "Send emails to help guide new users through the onboarding process."
msgstr ""
+msgid "Send emails to users upon account deactivation."
+msgstr ""
+
msgid "Send message"
msgstr ""
@@ -30351,6 +30787,9 @@ msgstr ""
msgid "Send service data"
msgstr ""
+msgid "Sentry"
+msgstr ""
+
msgid "Sentry API URL"
msgstr ""
@@ -30465,6 +30904,9 @@ msgstr ""
msgid "Service"
msgstr ""
+msgid "Service Accounts keys are required to authorize GitLab to deploy your Google Cloud project."
+msgstr ""
+
msgid "Service Desk"
msgstr ""
@@ -30537,15 +30979,15 @@ msgstr ""
msgid "Set a password on your account to pull or push via %{protocol}."
msgstr ""
-msgid "Set a template repository for projects in this group"
-msgstr ""
-
msgid "Set access permissions for this token."
msgstr ""
msgid "Set an instance-wide domain that will be available to all clusters when installing Knative."
msgstr ""
+msgid "Set any rate limit to %{code_open}0%{code_close} to disable the limit."
+msgstr ""
+
msgid "Set default and restrict visibility levels. Configure import sources and git access protocol."
msgstr ""
@@ -30558,7 +31000,7 @@ msgstr ""
msgid "Set limit to 0 to allow any file size."
msgstr ""
-msgid "Set max session time for web terminal."
+msgid "Set limits for web and API requests."
msgstr ""
msgid "Set milestone"
@@ -30567,15 +31009,18 @@ msgstr ""
msgid "Set new password"
msgstr ""
-msgid "Set notification email for abuse reports."
+msgid "Set parent epic to an epic"
msgstr ""
-msgid "Set parent epic to an epic"
+msgid "Set per-user rate limits for imports and exports of projects and groups."
msgstr ""
msgid "Set projects and maximum size limits, session duration, user options, and check feature availability for namespace plan."
msgstr ""
+msgid "Set rate limits for package registry API requests that supersede the general user and IP rate limits."
+msgstr ""
+
msgid "Set severity"
msgstr ""
@@ -30594,15 +31039,24 @@ msgstr ""
msgid "Set the default branch for this project. All merge requests and commits are made against this branch unless you specify a different one."
msgstr ""
+msgid "Set the default expiration time for job artifacts in all projects. Set to %{code_open}0%{code_close} to never expire artifacts by default. If no unit is written, it defaults to seconds. For example, these are all equivalent: %{code_open}3600%{code_close}, %{code_open}60 minutes%{code_close}, or %{code_open}one hour%{code_close}."
+msgstr ""
+
msgid "Set the due date to %{due_date}."
msgstr ""
msgid "Set the iteration to %{iteration_reference}."
msgstr ""
+msgid "Set the maximum session time for a web terminal."
+msgstr ""
+
msgid "Set the milestone to %{milestone_reference}."
msgstr ""
+msgid "Set the per-user rate limit for notes created by web or API requests."
+msgstr ""
+
msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
msgstr ""
@@ -30804,6 +31258,9 @@ msgstr ""
msgid "Show Pipeline IID"
msgstr ""
+msgid "Show all %{issuable_type}."
+msgstr ""
+
msgid "Show all activity"
msgstr ""
@@ -30855,15 +31312,9 @@ msgstr ""
msgid "Show list"
msgstr ""
-msgid "Show me advanced features"
-msgstr ""
-
msgid "Show me how to add a pipeline"
msgstr ""
-msgid "Show me the basics"
-msgstr ""
-
msgid "Show one file at a time"
msgstr ""
@@ -30904,15 +31355,15 @@ msgstr ""
msgid "Showing %{pageSize} of %{total} %{issuableType}"
msgstr ""
-msgid "Showing %{pageSize} of %{total} issues"
-msgstr ""
-
msgid "Showing all epics"
msgstr ""
msgid "Showing all issues"
msgstr ""
+msgid "Showing data for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
+msgstr ""
+
msgid "Showing data for workflow items created in this date range. Date range cannot exceed %{maxDateRange} days."
msgstr ""
@@ -30952,6 +31403,15 @@ msgstr ""
msgid "Sidebar|Weight"
msgstr ""
+msgid "Sidekiq job compression threshold (bytes)"
+msgstr ""
+
+msgid "Sidekiq job size limit (bytes)"
+msgstr ""
+
+msgid "Sidekiq job size limits"
+msgstr ""
+
msgid "Sign in"
msgstr ""
@@ -31072,6 +31532,9 @@ msgstr ""
msgid "Site profile not found for given parameters"
msgstr ""
+msgid "Sites"
+msgstr ""
+
msgid "Size"
msgstr ""
@@ -31102,19 +31565,22 @@ msgstr ""
msgid "SlackIntegration|Sends notifications about project events to Slack channels."
msgstr ""
-msgid "SlackService|2. Paste the %{strong_open}Token%{strong_close} into the field below"
+msgid "SlackService|1. %{slash_command_link_start}Add a slash command%{slash_command_link_end} in your Slack team using this information:"
msgstr ""
-msgid "SlackService|3. Select the %{strong_open}Active%{strong_close} checkbox, press %{strong_open}Save changes%{strong_close} and start using GitLab inside Slack!"
+msgid "SlackService|2. Paste the token from Slack in the %{strong_open}Token%{strong_close} field below."
msgstr ""
-msgid "SlackService|Fill in the word that works best for your team."
+msgid "SlackService|3. Select the %{strong_open}Active%{strong_close} checkbox, select %{strong_open}Save changes%{strong_close}, and start using slash commands in Slack!"
+msgstr ""
+
+msgid "SlackService|After setup, get a list of available Slack slash commands by entering"
msgstr ""
-msgid "SlackService|See list of available commands in Slack after setting up this service, by entering"
+msgid "SlackService|Fill in the word that works best for your team."
msgstr ""
-msgid "SlackService|This service allows users to perform common operations on this project by entering slash commands in Slack."
+msgid "SlackService|Perform common operations in this project by entering slash commands in Slack."
msgstr ""
msgid "Slice multiplier"
@@ -31180,7 +31646,7 @@ msgstr ""
msgid "Some child epics may be hidden due to applied filters"
msgstr ""
-msgid "Some common domains are not allowed. %{read_more_link}."
+msgid "Some common domains are not allowed. %{learn_more_link}."
msgstr ""
msgid "Some of the designs you tried uploading did not change:"
@@ -31264,9 +31730,6 @@ msgstr ""
msgid "Something went wrong while exporting requirements"
msgstr ""
-msgid "Something went wrong while fetching %{listType} list"
-msgstr ""
-
msgid "Something went wrong while fetching branches"
msgstr ""
@@ -31321,15 +31784,9 @@ msgstr ""
msgid "Something went wrong while merging this merge request. Please try again."
msgstr ""
-msgid "Something went wrong while moving issues."
-msgstr ""
-
msgid "Something went wrong while obtaining the Let's Encrypt certificate."
msgstr ""
-msgid "Something went wrong while performing the action."
-msgstr ""
-
msgid "Something went wrong while promoting the issue to an epic. Please try again."
msgstr ""
@@ -31657,7 +32114,10 @@ msgstr ""
msgid "SourcegraphPreferences|Uses a custom %{linkStart}Sourcegraph instance%{linkEnd}."
msgstr ""
-msgid "Spam Check API Key"
+msgid "Spam Check"
+msgstr ""
+
+msgid "Spam Check API key"
msgstr ""
msgid "Spam Logs"
@@ -31675,7 +32135,7 @@ msgstr ""
msgid "Specified URL cannot be used: \"%{reason}\""
msgstr ""
-msgid "Specify an e-mail address regex pattern to identify default internal users."
+msgid "Specify an email address regex pattern to identify default internal users."
msgstr ""
msgid "Speed up your pipelines with Needs relationships"
@@ -31930,7 +32390,7 @@ msgstr ""
msgid "StatusCheck|An error occurred fetching the status checks."
msgstr ""
-msgid "StatusCheck|Apply this status check to any branch or a specific protected branch."
+msgid "StatusCheck|Apply this status check to all branches or a specific protected branch."
msgstr ""
msgid "StatusCheck|Check for a status response in Merge Requests. Failures do not block merges. %{link_start}Learn more%{link_end}."
@@ -32269,6 +32729,9 @@ msgstr ""
msgid "Subscriptions"
msgstr ""
+msgid "Subscription|Your subscription for %{strong}%{namespace_name}%{strong_close} has expired and you are now on %{pricing_link_start}the GitLab Free tier%{pricing_link_end}. Don't worry, your data is safe. Get in touch with our support team (%{support_email}). They'll gladly help with your subscription renewal."
+msgstr ""
+
msgid "Subtracted"
msgstr ""
@@ -32497,6 +32960,9 @@ msgstr ""
msgid "SuperSonics|Plan"
msgstr ""
+msgid "SuperSonics|Please agree to the Subscription Agreement"
+msgstr ""
+
msgid "SuperSonics|Ready to get started? A GitLab plan is ideal for scaling organizations and for multi team usage."
msgstr ""
@@ -32527,6 +32993,9 @@ msgstr ""
msgid "SuperSonics|The activation code is not valid. Please make sure to copy it exactly from the Customers Portal or confirmation email. Learn more about %{linkStart}activating your subscription%{linkEnd}."
msgstr ""
+msgid "SuperSonics|The activation code should be a 24-character alphanumeric string"
+msgstr ""
+
msgid "SuperSonics|There is a connectivity issue."
msgstr ""
@@ -32569,9 +33038,15 @@ msgstr ""
msgid "SuperSonics|You do not have an active subscription"
msgstr ""
+msgid "SuperSonics|You have successfully added a license that activates on %{date}. Please see the subscription history table below for more details."
+msgstr ""
+
msgid "SuperSonics|You'll be charged for %{trueUpLinkStart}users over license%{trueUpLinkEnd} on a quarterly or annual basis, depending on the terms of your agreement."
msgstr ""
+msgid "SuperSonics|Your future dated license was successfully added"
+msgstr ""
+
msgid "SuperSonics|Your subscription"
msgstr ""
@@ -32824,7 +33299,7 @@ msgstr ""
msgid "Template to append to all Service Desk issues"
msgstr ""
-msgid "TemplateRepository|Select a repository to make its templates available to all projects. %{link_start}What should the repository contain?%{link_end} "
+msgid "TemplateRepository|Create common files more quickly, and standardize their format."
msgstr ""
msgid "Templates"
@@ -33030,7 +33505,7 @@ msgstr ""
msgid "TestCases|Search test cases"
msgstr ""
-msgid "TestCases|Something went wrong while adding test case to Todo."
+msgid "TestCases|Something went wrong while adding test case to a to-do item."
msgstr ""
msgid "TestCases|Something went wrong while creating a test case."
@@ -33042,7 +33517,7 @@ msgstr ""
msgid "TestCases|Something went wrong while fetching test cases list."
msgstr ""
-msgid "TestCases|Something went wrong while marking test case todo as done."
+msgid "TestCases|Something went wrong while marking test case to-do item as done."
msgstr ""
msgid "TestCases|Something went wrong while moving test case."
@@ -33162,7 +33637,7 @@ msgstr ""
msgid "Thanks for your purchase!"
msgstr ""
-msgid "That is ok, I do not want to renew"
+msgid "That's OK, I don't want to renew"
msgstr ""
msgid "That's it, well done!"
@@ -33185,7 +33660,7 @@ msgid_plural "The %{type} contains the following errors:"
msgstr[0] ""
msgstr[1] ""
-msgid "The API key used by GitLab for accessing the Spam Check service endpoint"
+msgid "The API key used by GitLab for accessing the Spam Check service endpoint."
msgstr ""
msgid "The GitLab subscription service (customers.gitlab.com) is currently experiencing an outage. You can monitor the status and get updates at %{linkStart}status.gitlab.com%{linkEnd}."
@@ -33224,9 +33699,6 @@ msgstr ""
msgid "The URL to use for connecting to Elasticsearch. Use a comma-separated list to support clustering (e.g., \"http://localhost:9200, http://localhost:9201\")."
msgstr ""
-msgid "The Vulnerability Report shows the results of the last successful pipeline run on the default branch."
-msgstr ""
-
msgid "The X509 Certificate to use when mutual TLS is required to communicate with the external authorization service. If left blank, the server certificate is still validated when accessing over HTTPS."
msgstr ""
@@ -33284,9 +33756,6 @@ msgstr ""
msgid "The default branch for this project has been changed. Please update your bookmarks."
msgstr ""
-msgid "The default expiration time for job artifacts. 0 for unlimited. The default unit is in seconds, but you can use other units, for example %{code_open}4 mins 2 sec%{code_close}, %{code_open}2h42min%{code_close}."
-msgstr ""
-
msgid "The dependency list details information about the components used within your project."
msgstr ""
@@ -33478,9 +33947,6 @@ msgstr ""
msgid "The merge conflicts for this merge request have already been resolved. Please return to the merge request."
msgstr ""
-msgid "The merge request can now be merged."
-msgstr ""
-
msgid "The metric must be one of %{metrics}."
msgstr ""
@@ -33856,7 +34322,7 @@ msgstr ""
msgid "There was a problem updating the keep latest artifacts setting."
msgstr ""
-msgid "There was an error %{message} todo."
+msgid "There was an error %{message} to-do item."
msgstr ""
msgid "There was an error adding a To Do."
@@ -33895,6 +34361,9 @@ msgstr ""
msgid "There was an error fetching projects"
msgstr ""
+msgid "There was an error fetching search autocomplete suggestions"
+msgstr ""
+
msgid "There was an error fetching stage total counts"
msgstr ""
@@ -34219,6 +34688,9 @@ msgstr ""
msgid "This field is required."
msgstr ""
+msgid "This form is disabled in preview"
+msgstr ""
+
msgid "This group"
msgstr ""
@@ -34240,9 +34712,6 @@ msgstr ""
msgid "This group is linked to a subscription"
msgstr ""
-msgid "This group, including all subgroups, projects and git repositories, will be reachable from only the specified IP address ranges."
-msgstr ""
-
msgid "This group, its subgroups and projects has been scheduled for removal on %{date}."
msgstr ""
@@ -34522,9 +34991,6 @@ msgstr ""
msgid "This user cannot be unlocked manually from GitLab"
msgstr ""
-msgid "This user does not have a pending request"
-msgstr ""
-
msgid "This user has an unconfirmed email address (%{email}). You may force a confirmation."
msgstr ""
@@ -34633,9 +35099,6 @@ msgstr ""
msgid "ThreatMonitoring|Packet Activity"
msgstr ""
-msgid "ThreatMonitoring|Policies"
-msgstr ""
-
msgid "ThreatMonitoring|Requests"
msgstr ""
@@ -34687,6 +35150,12 @@ msgstr ""
msgid "ThreatMonitoring|View documentation"
msgstr ""
+msgid "Threshold in bytes at which to compress Sidekiq job arguments."
+msgstr ""
+
+msgid "Threshold in bytes at which to reject Sidekiq jobs. Set this to 0 to if you don't want to limit Sidekiq jobs."
+msgstr ""
+
msgid "Throughput"
msgstr ""
@@ -34696,6 +35165,9 @@ msgstr ""
msgid "Time"
msgstr ""
+msgid "Time (in hours) that users are allowed to skip forced configuration of two-factor authentication."
+msgstr ""
+
msgid "Time Spent"
msgstr ""
@@ -34762,7 +35234,7 @@ msgstr ""
msgid "TimeTrackingEstimated|Est"
msgstr ""
-msgid "TimeTracking|%{startTag}Spent: %{endTag}%{timeSpentHumanReadable}"
+msgid "TimeTracking|%{spentStart}Spent: %{spentEnd}"
msgstr ""
msgid "TimeTracking|Estimated:"
@@ -34976,6 +35448,9 @@ msgstr ""
msgid "To access this domain create a new DNS record"
msgstr ""
+msgid "To add a custom suffix, set up a Service Desk email address. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "To add an SSH key you need to %{generate_link_start}generate one%{link_end} or use an %{existing_link_start}existing key%{link_end}."
msgstr ""
@@ -34997,13 +35472,16 @@ msgstr ""
msgid "To connect an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To continue using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
+msgstr ""
+
msgid "To continue, you need to select the link in the confirmation email we sent to verify your email address. If you didn't get our email, select %{strongStart}Resend confirmation email.%{strongEnd}"
msgstr ""
msgid "To define internal users, first enable new users set to external"
msgstr ""
-msgid "To enable Registration Features, make sure \"Enable service ping\" is checked."
+msgid "To enable Registration Features, first enable Service Ping."
msgstr ""
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
@@ -35030,7 +35508,7 @@ msgstr ""
msgid "To get started, use the link below to confirm your account."
msgstr ""
-msgid "To help improve GitLab and its user experience, GitLab will periodically collect usage information."
+msgid "To help improve GitLab and its user experience, GitLab periodically collects usage information."
msgstr ""
msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
@@ -35063,7 +35541,7 @@ msgstr ""
msgid "To preserve performance only %{strong_open}%{display_size} of %{real_size}%{strong_close} files are displayed."
msgstr ""
-msgid "To protect this issue's confidentiality, %{forkLink} and set the fork's visibility to private."
+msgid "To protect this issue's confidentiality, %{linkStart}fork this project%{linkEnd} and set the fork's visibility to private."
msgstr ""
msgid "To protect this issue's confidentiality, a private fork of this project was selected."
@@ -35096,12 +35574,15 @@ msgstr ""
msgid "To set up SAML authentication for your group through an identity provider like Azure, Okta, Onelogin, Ping Identity, or your custom SAML 2.0 provider:"
msgstr ""
-msgid "To set up this service:"
+msgid "To set up this integration:"
msgstr ""
msgid "To specify the notification level per project of a group you belong to, you need to visit project page and change notification level there."
msgstr ""
+msgid "To start using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
+msgstr ""
+
msgid "To unsubscribe from this issue, please paste the following link into your browser:"
msgstr ""
@@ -35689,9 +36170,6 @@ msgstr ""
msgid "Unable to fetch branches list, please close the form and try again"
msgstr ""
-msgid "Unable to fetch unscanned projects"
-msgstr ""
-
msgid "Unable to fetch vulnerable projects"
msgstr ""
@@ -35746,6 +36224,15 @@ msgstr ""
msgid "Unable to update this issue at this time."
msgstr ""
+msgid "Unapprove a merge request"
+msgstr ""
+
+msgid "Unapprove the current merge request."
+msgstr ""
+
+msgid "Unapproved the current merge request."
+msgstr ""
+
msgid "Unarchive project"
msgstr ""
@@ -35758,16 +36245,13 @@ msgstr ""
msgid "Unassigned"
msgstr ""
-msgid "Unauthenticated API request rate limit"
-msgstr ""
-
-msgid "Unauthenticated rate limit period in seconds"
+msgid "Unauthenticated API rate limit period in seconds"
msgstr ""
-msgid "Unauthenticated request rate limit"
+msgid "Unauthenticated requests"
msgstr ""
-msgid "Unauthenticated requests"
+msgid "Unauthenticated web rate limit period in seconds"
msgstr ""
msgid "Undo"
@@ -35869,18 +36353,6 @@ msgstr ""
msgid "Unresolved"
msgstr ""
-msgid "UnscannedProjects|15 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|30 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|5 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|60 or more days"
-msgstr ""
-
msgid "Unschedule job"
msgstr ""
@@ -36100,6 +36572,9 @@ msgstr ""
msgid "UsageQuota|%{help_link_start}Shared runners%{help_link_end} are disabled, so there are no limits set on pipeline usage"
msgstr ""
+msgid "UsageQuota|%{linkTitle} help link"
+msgstr ""
+
msgid "UsageQuota|%{percentageLeft} of purchased storage is available"
msgstr ""
@@ -36109,6 +36584,9 @@ msgstr ""
msgid "UsageQuota|Artifacts is a sum of build and pipeline artifacts."
msgstr ""
+msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
+msgstr ""
+
msgid "UsageQuota|Buy additional minutes"
msgstr ""
@@ -36118,9 +36596,21 @@ msgstr ""
msgid "UsageQuota|CI minutes usage by project"
msgstr ""
+msgid "UsageQuota|Code packages and container images."
+msgstr ""
+
msgid "UsageQuota|Current period usage"
msgstr ""
+msgid "UsageQuota|File attachments and smaller design graphics."
+msgstr ""
+
+msgid "UsageQuota|Git repository, managed by the Gitaly service."
+msgstr ""
+
+msgid "UsageQuota|Includes project registry, artifacts, packages, wiki, uploads and other items."
+msgstr ""
+
msgid "UsageQuota|Increase storage temporarily"
msgstr ""
@@ -36139,6 +36629,9 @@ msgstr ""
msgid "UsageQuota|Packages"
msgstr ""
+msgid "UsageQuota|Pipeline artifacts and job artifacts, created with CI/CD."
+msgstr ""
+
msgid "UsageQuota|Pipelines"
msgstr ""
@@ -36157,6 +36650,9 @@ msgstr ""
msgid "UsageQuota|Seats"
msgstr ""
+msgid "UsageQuota|Shared bits of code and text."
+msgstr ""
+
msgid "UsageQuota|Snippets"
msgstr ""
@@ -36166,6 +36662,12 @@ msgstr ""
msgid "UsageQuota|Storage"
msgstr ""
+msgid "UsageQuota|Storage type"
+msgstr ""
+
+msgid "UsageQuota|There is a known issue with Artifact storage where the total could be incorrect for some projects. More details and progress are available in %{warningLinkStart}the epic%{warningLinkEnd}."
+msgstr ""
+
msgid "UsageQuota|This is the total amount of storage used across your projects within this namespace."
msgstr ""
@@ -36205,6 +36707,9 @@ msgstr ""
msgid "UsageQuota|Usage"
msgstr ""
+msgid "UsageQuota|Usage Breakdown"
+msgstr ""
+
msgid "UsageQuota|Usage Quotas"
msgstr ""
@@ -36229,6 +36734,9 @@ msgstr ""
msgid "UsageQuota|Wiki"
msgstr ""
+msgid "UsageQuota|Wiki content."
+msgstr ""
+
msgid "UsageQuota|Wikis"
msgstr ""
@@ -36445,7 +36953,10 @@ msgstr ""
msgid "User Settings"
msgstr ""
-msgid "User and IP Rate Limits"
+msgid "User and IP rate limits"
+msgstr ""
+
+msgid "User does not have a pending request"
msgstr ""
msgid "User identity was successfully created."
@@ -36742,6 +37253,9 @@ msgstr ""
msgid "Users can launch a development environment from a GitLab browser tab when the %{linkStart}Gitpod%{linkEnd} integration is enabled."
msgstr ""
+msgid "Users can reactivate their account by signing in."
+msgstr ""
+
msgid "Users can render diagrams in AsciiDoc, Markdown, reStructuredText, and Textile documents using Kroki."
msgstr ""
@@ -36757,6 +37271,9 @@ msgstr ""
msgid "Users requesting access to"
msgstr ""
+msgid "Users to exclude from the rate limit"
+msgstr ""
+
msgid "Users were successfully added."
msgstr ""
@@ -36778,6 +37295,9 @@ msgstr ""
msgid "UsersSelect|Unassigned"
msgstr ""
+msgid "Uses GitLab as a lightweight alternative to Sentry."
+msgstr ""
+
msgid "Using %{code_start}::%{code_end} denotes a %{link_start}scoped label set%{link_end}"
msgstr ""
@@ -36808,10 +37328,7 @@ msgstr ""
msgid "Value Stream Analytics can help you determine your team’s velocity"
msgstr ""
-msgid "Value Stream Analytics gives an overview of how much time it takes to go from idea to production in your project."
-msgstr ""
-
-msgid "Value may contain a variable reference"
+msgid "Value might contain a variable reference"
msgstr ""
msgid "Value stream"
@@ -36877,10 +37394,10 @@ msgstr ""
msgid "ValueStream|The Default Value Stream cannot be deleted"
msgstr ""
-msgid "Variable"
+msgid "Values that contain the %{codeStart}$%{codeEnd} character can be considered a variable reference and expanded. %{docsLinkStart}Learn more.%{docsLinkEnd}"
msgstr ""
-msgid "Variable references indicated by %{codeStart}$%{codeEnd} may be expanded. If this is not what you want, consider %{docsLinkStart}using a workaround to prevent expansion%{docsLinkEnd}."
+msgid "Variable"
msgstr ""
msgid "Variable will be masked in job logs."
@@ -37285,6 +37802,9 @@ msgstr ""
msgid "Vulnerability|Evidence"
msgstr ""
+msgid "Vulnerability|False positive detected"
+msgstr ""
+
msgid "Vulnerability|File"
msgstr ""
@@ -37327,6 +37847,9 @@ msgstr ""
msgid "Vulnerability|Status"
msgstr ""
+msgid "Vulnerability|The scanner determined this vulnerability to be a false positive. Verify the evaluation before changing its status. %{linkStart}Learn more about false positive detection.%{linkEnd}"
+msgstr ""
+
msgid "Vulnerability|The unmodified response is the original response that had no mutations done to the request"
msgstr ""
@@ -37651,9 +38174,6 @@ msgstr ""
msgid "Welcome to GitLab,%{br_tag}%{name}!"
msgstr ""
-msgid "Welcome to the guided GitLab tour"
-msgstr ""
-
msgid "Welcome, %{name}!"
msgstr ""
@@ -37672,9 +38192,6 @@ msgstr ""
msgid "What are you searching for?"
msgstr ""
-msgid "What describes you best?"
-msgstr ""
-
msgid "What does this command do?"
msgstr ""
@@ -37696,13 +38213,13 @@ msgstr ""
msgid "What is your job title? (optional)"
msgstr ""
-msgid "What will you use this group for?"
+msgid "What templates can I create?"
msgstr ""
-msgid "What's new"
+msgid "What will you use this group for?"
msgstr ""
-msgid "What’s your experience level?"
+msgid "What's new"
msgstr ""
msgid "When a deployment job is successful, skip older deployment jobs that are still pending."
@@ -37714,6 +38231,9 @@ msgstr ""
msgid "When an event in GitLab triggers a webhook, you can use the request details to figure out if something went wrong."
msgstr ""
+msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+msgstr ""
+
msgid "When inactive, an external authentication provider must be used."
msgstr ""
@@ -37737,6 +38257,9 @@ msgstr ""
msgid "When:"
msgstr ""
+msgid "Which API requests are affected?"
+msgstr ""
+
msgid "While it's rare to have no vulnerabilities, it can happen. In any event, we ask that you please double check your settings to make sure you've set up your dashboard correctly."
msgstr ""
@@ -38016,6 +38539,9 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|Work Items"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -38091,6 +38617,9 @@ msgstr ""
msgid "You are already a member of this %{member_source}."
msgstr ""
+msgid "You are already impersonating another user"
+msgstr ""
+
msgid "You are an admin, which means granting access to %{client_name} will allow them to interact with GitLab as an admin as well. Proceed with caution."
msgstr ""
@@ -38193,6 +38722,9 @@ msgstr ""
msgid "You can also use project access tokens with Git to authenticate over HTTP(S). %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "You can always change your URL later"
+msgstr ""
+
msgid "You can always edit this later"
msgstr ""
@@ -38349,10 +38881,10 @@ msgstr ""
msgid "You can’t %{tag_start}edit%{tag_end} files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
-msgid "You could not create a new trigger."
+msgid "You can’t edit files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
-msgid "You didn't renew your subscription for %{strong}%{namespace_name}%{strong_close} so it was downgraded to the free plan."
+msgid "You could not create a new trigger."
msgstr ""
msgid "You do not have any subscriptions yet"
@@ -38520,6 +39052,12 @@ msgstr ""
msgid "You must provide your current password in order to change it."
msgstr ""
+msgid "You must sign in to search for specific projects."
+msgstr ""
+
+msgid "You must sign in to search for specific terms."
+msgstr ""
+
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
@@ -38547,6 +39085,9 @@ msgstr ""
msgid "You need to upload a GitLab project export archive (ending in .gz)."
msgstr ""
+msgid "You need to verify your primary email first before enabling Two-Factor Authentication."
+msgstr ""
+
msgid "You successfully declined the invitation"
msgstr ""
@@ -38655,10 +39196,10 @@ msgstr ""
msgid "Your %{host} account was signed in to from a new location"
msgstr ""
-msgid "Your %{strong}%{plan_name}%{strong_close} subscription for %{strong}%{namespace_name}%{strong_close} will expire on %{strong}%{expires_on}%{strong_close}."
+msgid "Your %{strong}%{plan_name}%{strong_close} subscription expires on %{strong}%{expires_on}%{strong_close}. After that date, you cannot create issues or merge requests, or use many other features."
msgstr ""
-msgid "Your %{strong}%{plan_name}%{strong_close} subscription will expire on %{strong}%{expires_on}%{strong_close}. After that, you will not be able to create issues or merge requests as well as many other features."
+msgid "Your %{strong}%{plan_name}%{strong_close} subscription for %{strong}%{namespace_name}%{strong_close} will expire on %{strong}%{expires_on}%{strong_close}."
msgstr ""
msgid "Your CI/CD configuration syntax is invalid. View Lint tab for more details."
@@ -38682,7 +39223,7 @@ msgstr ""
msgid "Your GPG keys (%{count})"
msgstr ""
-msgid "Your GitLab account has been locked due to an excessive amount of unsuccessful sign in attempts. Your account will automatically unlock in %{duration} or you may click the link below to unlock now."
+msgid "Your GitLab account has been locked due to an excessive number of unsuccessful sign in attempts. You can wait for your account to automatically unlock in %{duration} or you can click the link below to unlock now."
msgstr ""
msgid "Your GitLab account request has been approved!"
@@ -38793,6 +39334,9 @@ msgstr ""
msgid "Your commit email is used for web based operations, such as edits and merges."
msgstr ""
+msgid "Your current password is required to register a two-factor authenticator app."
+msgstr ""
+
msgid "Your dashboard has been copied. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
@@ -38892,6 +39436,9 @@ msgstr ""
msgid "Your project limit is %{limit} projects! Please contact your administrator to increase it"
msgstr ""
+msgid "Your project will be created at:"
+msgstr ""
+
msgid "Your projects"
msgstr ""
@@ -38931,11 +39478,10 @@ msgstr ""
msgid "Your subscription expired!"
msgstr ""
-msgid "Your subscription has been downgraded."
-msgstr ""
-
-msgid "Your subscription will expire in %{remaining_days}."
-msgstr ""
+msgid "Your subscription will expire in %{remaining_days} day."
+msgid_plural "Your subscription will expire in %{remaining_days} days."
+msgstr[0] ""
+msgstr[1] ""
msgid "Your username is %{username}."
msgstr ""
@@ -39142,6 +39688,9 @@ msgstr ""
msgid "cannot merge"
msgstr ""
+msgid "cannot not be used for user namespace"
+msgstr ""
+
msgid "ciReport|%{degradedNum} degraded"
msgstr ""
@@ -39465,6 +40014,9 @@ msgstr ""
msgid "created %{timeAgo}"
msgstr ""
+msgid "created %{timeAgo} by %{author}"
+msgstr ""
+
msgid "created by"
msgstr ""
@@ -39509,9 +40061,6 @@ msgstr ""
msgid "does not have a supported extension. Only %{extension_list} are supported"
msgstr ""
-msgid "domain is not authorized for sign-up."
-msgstr ""
-
msgid "download it"
msgstr ""
@@ -39529,18 +40078,13 @@ msgstr ""
msgid "email '%{email}' is not a verified email."
msgstr ""
-msgid "email does not match the allowed domain of %{email_domains}"
-msgid_plural "email does not match the allowed domains: %{email_domains}"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "enabled"
msgstr ""
msgid "encrypted: needs to be a :required, :optional or :migrating!"
msgstr ""
-msgid "ending with MIME type format is not allowed."
+msgid "ending with a reserved file extension is not allowed."
msgstr ""
msgid "entries cannot be larger than 255 characters"
@@ -39564,6 +40108,9 @@ msgstr ""
msgid "estimateCommand|%{slash_command} overwrites the total estimated time."
msgstr ""
+msgid "example.com"
+msgstr ""
+
msgid "exceeds the limit of %{bytes} bytes"
msgstr ""
@@ -39614,9 +40161,6 @@ msgstr ""
msgid "fork"
msgstr ""
-msgid "fork this project"
-msgstr ""
-
msgid "from"
msgstr ""
@@ -39625,6 +40169,9 @@ msgid_plural "from %d jobs"
msgstr[0] ""
msgstr[1] ""
+msgid "frontmatter"
+msgstr ""
+
msgid "group"
msgstr ""
@@ -39652,6 +40199,9 @@ msgstr ""
msgid "has been completed."
msgstr ""
+msgid "has too deep level of nesting"
+msgstr ""
+
msgid "help"
msgstr ""
@@ -39685,9 +40235,21 @@ msgstr ""
msgid "in"
msgstr ""
+msgid "in Infrastructure :: Kubernetes clusters"
+msgstr ""
+
+msgid "in all GitLab"
+msgstr ""
+
+msgid "in group"
+msgstr ""
+
msgid "in group %{link_to_group}"
msgstr ""
+msgid "in project"
+msgstr ""
+
msgid "in project %{link_to_project}"
msgstr ""
@@ -39729,16 +40291,19 @@ msgstr ""
msgid "is not a valid X509 certificate."
msgstr ""
-msgid "is not allowed since the group is not top-level group."
+msgid "is not allowed for sign-up."
msgstr ""
-msgid "is not allowed. Try again with a different email address, or contact your GitLab admin."
+msgid "is not allowed for this group."
msgstr ""
-msgid "is not allowed. We do not currently support project-level iterations"
+msgid "is not allowed for this project."
+msgstr ""
+
+msgid "is not allowed since the group is not top-level group."
msgstr ""
-msgid "is not from an allowed domain."
+msgid "is not allowed. We do not currently support project-level iterations"
msgstr ""
msgid "is not in the group enforcing Group Managed Account"
@@ -39831,6 +40396,9 @@ msgstr ""
msgid "log in"
msgstr ""
+msgid "managed"
+msgstr ""
+
msgid "manual"
msgstr ""
@@ -39878,6 +40446,9 @@ msgstr ""
msgid "mrWidget| Please restore it or use a different %{missingBranchName} branch"
msgstr ""
+msgid "mrWidget|%{linkStart}Set up now%{linkEnd} to analyze your source code for known security vulnerabilities."
+msgstr ""
+
msgid "mrWidget|%{mergeError}."
msgstr ""
@@ -39958,6 +40529,9 @@ msgid_plural "mrWidget|Closes issues"
msgstr[0] ""
msgstr[1] ""
+msgid "mrWidget|Create issue to resolve all threads"
+msgstr ""
+
msgid "mrWidget|Delete source branch"
msgstr ""
@@ -39967,12 +40541,18 @@ msgstr ""
msgid "mrWidget|Did not close"
msgstr ""
+msgid "mrWidget|Dismiss"
+msgstr ""
+
msgid "mrWidget|Email patches"
msgstr ""
msgid "mrWidget|Failed to load deployment statistics"
msgstr ""
+msgid "mrWidget|Hide %{widget} details"
+msgstr ""
+
msgid "mrWidget|If the %{missingBranchName} branch exists in your local repository, you can merge this merge request manually using the command line"
msgstr ""
@@ -40068,9 +40648,6 @@ msgstr ""
msgid "mrWidget|Request to merge"
msgstr ""
-msgid "mrWidget|Resolve all threads in new issue"
-msgstr ""
-
msgid "mrWidget|Resolve conflicts"
msgstr ""
@@ -40086,6 +40663,9 @@ msgstr ""
msgid "mrWidget|Revoke approval"
msgstr ""
+msgid "mrWidget|SAST and Secret Detection is not enabled."
+msgstr ""
+
msgid "mrWidget|Set by %{merge_author} to be added to the merge train when the pipeline succeeds"
msgstr ""
@@ -40095,6 +40675,9 @@ msgstr ""
msgid "mrWidget|Set by %{merge_author} to start a merge train when the pipeline succeeds"
msgstr ""
+msgid "mrWidget|Show %{widget} details"
+msgstr ""
+
msgid "mrWidget|The changes were merged into"
msgstr ""
@@ -40107,6 +40690,9 @@ msgstr ""
msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure, or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
msgstr ""
+msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure."
+msgstr ""
+
msgid "mrWidget|The source branch has been deleted"
msgstr ""
@@ -40149,6 +40735,9 @@ msgstr ""
msgid "mrWidget|You can merge after removing denied licenses"
msgstr ""
+msgid "mrWidget|You can only merge once this merge request is approved."
+msgstr ""
+
msgid "mrWidget|Your password"
msgstr ""
@@ -40185,6 +40774,9 @@ msgstr ""
msgid "must be less than the limit of %{tag_limit} tags"
msgstr ""
+msgid "must be set for a project namespace"
+msgstr ""
+
msgid "must be unique by status and elapsed time within a policy"
msgstr ""
@@ -40294,6 +40886,9 @@ msgstr ""
msgid "pipeline"
msgstr ""
+msgid "pipeline schedules documentation"
+msgstr ""
+
msgid "pod_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
msgstr ""
@@ -40343,16 +40938,25 @@ msgstr ""
msgid "project name"
msgstr ""
+msgid "project namespace cannot be the parent of another namespace"
+msgstr ""
+
msgid "projects"
msgstr ""
msgid "quick actions"
msgstr ""
-msgid "reCAPTCHA Private Key"
+msgid "reCAPTCHA"
+msgstr ""
+
+msgid "reCAPTCHA helps prevent credential stuffing."
msgstr ""
-msgid "reCAPTCHA Site Key"
+msgid "reCAPTCHA private key"
+msgstr ""
+
+msgid "reCAPTCHA site key"
msgstr ""
msgid "recent activity"
@@ -40579,6 +41183,9 @@ msgstr ""
msgid "user avatar"
msgstr ""
+msgid "user namespace cannot be the parent of another namespace"
+msgstr ""
+
msgid "user preferences"
msgstr ""
@@ -40671,3 +41278,9 @@ msgstr ""
msgid "your settings"
msgstr ""
+msgid "{group}"
+msgstr ""
+
+msgid "{project}"
+msgstr ""
+
diff --git a/locale/lt_LT/gitlab.po b/locale/lt_LT/gitlab.po
index 376e4752a00..7549eb15a1d 100644
--- a/locale/lt_LT/gitlab.po
+++ b/locale/lt_LT/gitlab.po
@@ -14,10 +14,7 @@ msgstr ""
"X-Crowdin-Language: lt\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-09-01 22:33\n"
-
-msgid " %{name}, confirm your email address now! "
-msgstr ""
+"PO-Revision-Date: 2021-10-04 20:21\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -96,6 +93,20 @@ msgstr ""
msgid "#general, #development"
msgstr ""
+msgid "%d Alert"
+msgid_plural "%d Alerts"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
+msgid "%d Alert:"
+msgid_plural "%d Alerts:"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "%d Approval"
msgid_plural "%d Approvals"
msgstr[0] ""
@@ -591,7 +602,10 @@ msgstr ""
msgid "%{code_open}Protected:%{code_close} Only exposed to protected branches or tags."
msgstr ""
-msgid "%{commit_author_link} authored %{commit_timeago}"
+msgid "%{commit_author_link} authored %{commit_authored_timeago}"
+msgstr ""
+
+msgid "%{commit_author_link} authored %{commit_authored_timeago} and %{commit_committer_avatar} %{commit_committer_link} committed %{commit_committer_timeago}"
msgstr ""
msgid "%{completedCount} completed weight"
@@ -695,6 +709,15 @@ msgstr ""
msgid "%{doc_link_start}Advanced search%{doc_link_end} is enabled."
msgstr ""
+msgid "%{docs_link_start}Learn about visibility levels.%{docs_link_end}"
+msgstr ""
+
+msgid "%{docs_link_start}What is Large File Storage?%{docs_link_end}"
+msgstr ""
+
+msgid "%{docs_link_start}What is two-factor authentication?%{docs_link_end}"
+msgstr ""
+
msgid "%{due_date} (Past due)"
msgstr ""
@@ -767,9 +790,6 @@ msgstr ""
msgid "%{issueType} actions"
msgstr ""
-msgid "%{issuesCount} issues with a limit of %{maxIssueCount}"
-msgstr ""
-
msgid "%{issuesSize} with a limit of %{maxIssueCount}"
msgstr ""
@@ -827,6 +847,12 @@ msgstr ""
msgid "%{label_for_message} unavailable"
msgstr ""
+msgid "%{learn_more_link}."
+msgstr ""
+
+msgid "%{lessThan} 1 hour"
+msgstr ""
+
msgid "%{lets_encrypt_link_start}Let's Encrypt%{lets_encrypt_link_end} is a free, automated, and open certificate authority (CA) that issues digital certificates to enable HTTPS (SSL/TLS) for sites."
msgstr ""
@@ -839,15 +865,15 @@ msgstr ""
msgid "%{link_start}Learn more%{link_end} about roles."
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
-msgstr ""
-
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
msgstr ""
msgid "%{link_start}Start the title with %{draft_snippet}%{link_end} to prevent a merge request that is a work in progress from being merged before it's ready."
msgstr ""
+msgid "%{link_start}What information does GitLab Inc. collect?%{link_end}"
+msgstr ""
+
msgid "%{listToShow}, and %{awardsListLength} more"
msgstr ""
@@ -1008,7 +1034,7 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-msgid "%{service_ping_link_start}Learn more%{service_ping_link_end} about what information is shared with GitLab Inc."
+msgid "%{service_ping_link_start}What information is shared with GitLab Inc.?%{service_ping_link_end}"
msgstr ""
msgid "%{size} %{unit}"
@@ -1044,6 +1070,9 @@ msgstr ""
msgid "%{state} epics"
msgstr ""
+msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
+msgstr ""
+
msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
msgstr ""
@@ -1117,13 +1146,6 @@ msgstr ""
msgid "%{template_project_id} is unknown or invalid"
msgstr ""
-msgid "%{text} %{files}"
-msgid_plural "%{text} %{files} files"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
-
msgid "%{text} is available"
msgstr ""
@@ -1208,9 +1230,6 @@ msgstr ""
msgid "%{wildcards_link_start}Wildcards%{wildcards_link_end} such as %{code_tag_start}v*%{code_tag_end} or %{code_tag_start}*-release%{code_tag_end} are supported."
msgstr ""
-msgid "&lt; 1 hour"
-msgstr ""
-
msgid "'%{data}' at %{location} does not match format: %{format}"
msgstr ""
@@ -1296,9 +1315,6 @@ msgstr ""
msgid "(we need your current password to confirm your changes)"
msgstr ""
-msgid "* * * * *"
-msgstr ""
-
msgid "+ %{amount} more"
msgstr ""
@@ -1371,10 +1387,10 @@ msgstr ""
msgid "."
msgstr ""
-msgid "0 bytes"
+msgid "/"
msgstr ""
-msgid "0 for unlimited, only effective with remote storage enabled."
+msgid "0 bytes"
msgstr ""
msgid "0t1DgySidms"
@@ -1550,6 +1566,9 @@ msgstr ""
msgid "1000+"
msgstr ""
+msgid "192.168.0.0/24"
+msgstr ""
+
msgid "1st contribution!"
msgstr ""
@@ -1703,9 +1722,6 @@ msgstr ""
msgid "A plain HTML site that uses Netlify for CI/CD instead of GitLab, but still with all the other great GitLab features"
msgstr ""
-msgid "A plain-text response to show to clients that hit the rate limit."
-msgstr ""
-
msgid "A platform value can be web, mob or app."
msgstr ""
@@ -1787,7 +1803,7 @@ msgstr ""
msgid "APIFuzzing|Configure HTTP basic authentication values. Other authentication methods are supported. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
+msgid "APIFuzzing|Customize your project's API fuzzing configuration options and copy the code snippet to your .gitlab-ci.yml file to apply any changes. Note that this tool does not reflect or update your .gitlab-ci.yml file automatically. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
msgstr ""
msgid "APIFuzzing|Enable authentication"
@@ -1850,9 +1866,6 @@ msgstr ""
msgid "APIFuzzing|To prevent a security leak, authentication info must be added as a %{ciVariablesLinkStart}CI variable%{ciVariablesLinkEnd}. As a user with maintainer access rights, you can manage CI variables in the %{ciSettingsLinkStart}Settings%{ciSettingsLinkEnd} area."
msgstr ""
-msgid "APIFuzzing|Use this tool to generate API fuzzing configuration YAML to copy into your .gitlab-ci.yml file. This tool does not reflect or update your .gitlab-ci.yml file automatically."
-msgstr ""
-
msgid "APIFuzzing|Username for basic authentication"
msgstr ""
@@ -1904,9 +1917,6 @@ msgstr ""
msgid "Abuse reports notification email"
msgstr ""
-msgid "Abuse reports will be sent to this address if it is set. Abuse reports are always available in the admin area."
-msgstr ""
-
msgid "Accept invitation"
msgstr ""
@@ -1943,12 +1953,18 @@ msgstr ""
msgid "Access granted"
msgstr ""
+msgid "Access key ID"
+msgstr ""
+
msgid "Access requests"
msgstr ""
msgid "Access to '%{classification_label}' not allowed"
msgstr ""
+msgid "Access tokens expire after 2 hours. A refresh token may be used at any time to generate a new access token. Non-expiring access tokens are deprecated. Clear this setting to enable backward compatibility."
+msgstr ""
+
msgid "AccessDropdown|Deploy Keys"
msgstr ""
@@ -2261,6 +2277,9 @@ msgstr ""
msgid "Add new directory"
msgstr ""
+msgid "Add new service account"
+msgstr ""
+
msgid "Add or remove previously merged commits"
msgstr ""
@@ -2498,6 +2517,9 @@ msgstr ""
msgid "AdminArea|Features"
msgstr ""
+msgid "AdminArea|Get security updates from GitLab and stay up to date"
+msgstr ""
+
msgid "AdminArea|Groups"
msgstr ""
@@ -2537,6 +2559,12 @@ msgstr ""
msgid "AdminArea|Reporter"
msgstr ""
+msgid "AdminArea|Sign up for the GitLab Security Newsletter to get notified for security updates."
+msgstr ""
+
+msgid "AdminArea|Sign up for the GitLab newsletter"
+msgstr ""
+
msgid "AdminArea|Stop all jobs"
msgstr ""
@@ -2606,9 +2634,15 @@ msgstr ""
msgid "AdminSettings|Disable public access to Pages sites"
msgstr ""
+msgid "AdminSettings|Display a banner on merge requests in projects with no pipelines to initiate steps to add a .gitlab-ci.yml file."
+msgstr ""
+
msgid "AdminSettings|Domain verification is an essential security measure for public GitLab sites. Users are required to demonstrate they control a domain before it is enabled. %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "AdminSettings|Enable pipeline suggestion banner"
+msgstr ""
+
msgid "AdminSettings|Enable shared runners for new projects"
msgstr ""
@@ -3080,10 +3114,10 @@ msgstr ""
msgid "Admin|Quarterly reconciliation will occur on %{qrtlyDate}"
msgstr ""
-msgid "Admin|The number of max seats used for your namespace is currently exceeding the number of seats in your subscription. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgid "Admin|The number of max seats in your namespace exceeds the number of seats in your subscription. On %{qrtlyDate}, quarterly reconciliation occurs and you are automatically billed a prorated amount for the overage. No action is needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice. For more information about the timing of the invoicing process, view the documentation."
msgstr ""
-msgid "Admin|The number of maximum users for your instance is currently exceeding the number of users in license. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgid "Admin|The number of max users in your instance exceeds the number of users in your license. On %{qrtlyDate}, quarterly reconciliation occurs and you are automatically billed a prorated amount for the overage. No action is needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice. For more information about the timing of the invoicing process, view the documentation."
msgstr ""
msgid "Admin|View pending user approvals"
@@ -3104,9 +3138,6 @@ msgstr ""
msgid "Advanced export options"
msgstr ""
-msgid "Advanced permissions, Large File Storage and Two-Factor authentication settings."
-msgstr ""
-
msgid "After a successful password update you will be redirected to login screen."
msgstr ""
@@ -3125,15 +3156,14 @@ msgstr ""
msgid "After you've reviewed these contribution guidelines, you'll be all set to"
msgstr ""
+msgid "Akismet"
+msgstr ""
+
msgid "Akismet API Key"
msgstr ""
-msgid "Alert"
-msgid_plural "Alerts"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
+msgid "Akismet helps prevent the creation of spam issues in public projects."
+msgstr ""
msgid "AlertManagement|Acknowledged"
msgstr ""
@@ -3489,6 +3519,9 @@ msgstr ""
msgid "All (default)"
msgstr ""
+msgid "All GitLab"
+msgstr ""
+
msgid "All Members"
msgstr ""
@@ -3603,6 +3636,9 @@ msgstr ""
msgid "Allow this secondary node to replicate content on Object Storage"
msgstr ""
+msgid "Allow use of licensed EE features"
+msgstr ""
+
msgid "Allow users to dismiss the broadcast message"
msgstr ""
@@ -3678,9 +3714,6 @@ msgstr ""
msgid "Amazon authentication is not %{link_start}correctly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
-msgid "Amount of time (in hours) that users are allowed to skip forced configuration of two-factor authentication"
-msgstr ""
-
msgid "An %{link_start}alert%{link_end} with the same fingerprint is already open. To change the status of this alert, resolve the linked alert."
msgstr ""
@@ -3741,12 +3774,6 @@ msgstr ""
msgid "An error occurred when removing the label."
msgstr ""
-msgid "An error occurred when toggling the notification subscription"
-msgstr ""
-
-msgid "An error occurred when updating the issue weight"
-msgstr ""
-
msgid "An error occurred when updating the title"
msgstr ""
@@ -3795,6 +3822,9 @@ msgstr ""
msgid "An error occurred while enabling Service Desk."
msgstr ""
+msgid "An error occurred while fetching Markdown preview"
+msgstr ""
+
msgid "An error occurred while fetching ancestors"
msgstr ""
@@ -3825,9 +3855,6 @@ msgstr ""
msgid "An error occurred while fetching label colors."
msgstr ""
-msgid "An error occurred while fetching markdown preview"
-msgstr ""
-
msgid "An error occurred while fetching participants"
msgstr ""
@@ -3843,9 +3870,6 @@ msgstr ""
msgid "An error occurred while fetching reference"
msgstr ""
-msgid "An error occurred while fetching sidebar data"
-msgstr ""
-
msgid "An error occurred while fetching tags. Retry the search."
msgstr ""
@@ -3921,6 +3945,9 @@ msgstr ""
msgid "An error occurred while loading merge requests."
msgstr ""
+msgid "An error occurred while loading projects."
+msgstr ""
+
msgid "An error occurred while loading the Needs tab."
msgstr ""
@@ -4155,12 +4182,6 @@ msgstr ""
msgid "Any Milestone"
msgstr ""
-msgid "Any branch"
-msgstr ""
-
-msgid "Any eligible user"
-msgstr ""
-
msgid "Any encrypted tokens"
msgstr ""
@@ -4179,6 +4200,9 @@ msgstr ""
msgid "Any namespace"
msgstr ""
+msgid "App Engine description and apps that are suitable for this deployment target"
+msgstr ""
+
msgid "App ID"
msgstr ""
@@ -4331,6 +4355,13 @@ msgstr ""
msgid "Apply"
msgstr ""
+msgid "Apply %d suggestion"
+msgid_plural "Apply %d suggestions"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "Apply a label"
msgstr ""
@@ -4340,13 +4371,10 @@ msgstr ""
msgid "Apply suggestion"
msgstr ""
-msgid "Apply suggestions"
-msgstr ""
-
msgid "Apply template"
msgstr ""
-msgid "Apply this approval rule to any branch or a specific protected branch."
+msgid "Apply this approval rule to all branches or a specific protected branch."
msgstr ""
msgid "Applying"
@@ -4497,9 +4525,6 @@ msgstr ""
msgid "ApprovalSettings|Prevent editing approval rules in projects and merge requests."
msgstr ""
-msgid "ApprovalSettings|Prevent editing approval rules in projects and merge requests. "
-msgstr ""
-
msgid "ApprovalSettings|Remove all approvals when commits are added to the source branch."
msgstr ""
@@ -4515,6 +4540,9 @@ msgstr ""
msgid "ApprovalSettings|This setting is configured at the instance level and can only be changed by an administrator."
msgstr ""
+msgid "ApprovalSettings|This setting is configured in %{groupName} and can only be changed by an administrator or group owner."
+msgstr ""
+
msgid "ApprovalStatusTooltip|Adheres to separation of duties"
msgstr ""
@@ -5007,9 +5035,6 @@ msgstr ""
msgid "Authenticated API rate limit period in seconds"
msgstr ""
-msgid "Authenticated API request rate limit"
-msgstr ""
-
msgid "Authenticated API requests"
msgstr ""
@@ -5019,10 +5044,10 @@ msgstr ""
msgid "Authenticated Git LFS request rate limit"
msgstr ""
-msgid "Authenticated web rate limit period in seconds"
+msgid "Authenticated Git LFS requests"
msgstr ""
-msgid "Authenticated web request rate limit"
+msgid "Authenticated web rate limit period in seconds"
msgstr ""
msgid "Authenticated web requests"
@@ -5400,9 +5425,6 @@ msgstr ""
msgid "Below you will find all the groups that are public."
msgstr ""
-msgid "Beta"
-msgstr ""
-
msgid "Bi-weekly code coverage"
msgstr ""
@@ -5644,6 +5666,21 @@ msgstr ""
msgid "Board scope affects which issues are displayed for anyone who visits this board"
msgstr ""
+msgid "BoardNewEpic|Groups"
+msgstr ""
+
+msgid "BoardNewEpic|Loading groups"
+msgstr ""
+
+msgid "BoardNewEpic|No matching results"
+msgstr ""
+
+msgid "BoardNewEpic|Search groups"
+msgstr ""
+
+msgid "BoardNewEpic|Select a group"
+msgstr ""
+
msgid "BoardNewIssue|No matching results"
msgstr ""
@@ -5723,6 +5760,9 @@ msgstr ""
msgid "Boards|An error occurred while creating the list. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching child groups. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching group projects. Please try again."
msgstr ""
@@ -6057,6 +6097,9 @@ msgstr ""
msgid "Bulk update"
msgstr ""
+msgid "BulkImports|Re-import creates a new group. It does not sync with the existing group."
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -6066,6 +6109,9 @@ msgstr ""
msgid "BulkImport|From source group"
msgstr ""
+msgid "BulkImport|Group import history"
+msgstr ""
+
msgid "BulkImport|Import failed: Destination cannot be a subgroup of the source group. Change the destination and try again."
msgstr ""
@@ -6078,9 +6124,18 @@ msgstr ""
msgid "BulkImport|Importing the group failed"
msgstr ""
+msgid "BulkImport|Last imported to %{link}"
+msgstr ""
+
msgid "BulkImport|Name already exists."
msgstr ""
+msgid "BulkImport|New group"
+msgstr ""
+
+msgid "BulkImport|No history is available"
+msgstr ""
+
msgid "BulkImport|No parent"
msgstr ""
@@ -6093,6 +6148,9 @@ msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} matching filter \"%{filter}\" from %{link}"
msgstr ""
+msgid "BulkImport|Source group"
+msgstr ""
+
msgid "BulkImport|To new group"
msgstr ""
@@ -6102,6 +6160,9 @@ msgstr ""
msgid "BulkImport|You have no groups to import"
msgstr ""
+msgid "BulkImport|Your imported groups will appear here."
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -6346,6 +6407,9 @@ msgstr ""
msgid "Can be manually deployed to"
msgstr ""
+msgid "Can be overridden in each project."
+msgstr ""
+
msgid "Can create groups:"
msgstr ""
@@ -6448,6 +6512,9 @@ msgstr ""
msgid "Cancelling Preview"
msgstr ""
+msgid "Cannot assign a confidential epic to a non-confidential issue. Make the issue confidential and try again"
+msgstr ""
+
msgid "Cannot be assigned to other projects."
msgstr ""
@@ -6499,9 +6566,6 @@ msgstr ""
msgid "Cannot refer to a group %{timebox_type} by an internal id!"
msgstr ""
-msgid "Cannot set confidential epic for a non-confidential issue"
-msgstr ""
-
msgid "Cannot show preview. For previews on sketch files, they must have the file format introduced by Sketch version 43 and above."
msgstr ""
@@ -6739,15 +6803,15 @@ msgstr ""
msgid "Check out, review, and merge locally"
msgstr ""
-msgid "Check the %{docs_link_start}documentation%{docs_link_end}."
-msgstr ""
-
msgid "Check the current instance configuration "
msgstr ""
msgid "Check the elasticsearch.log file to debug why the migration was halted and make any changes before retrying the migration. When you fix the cause of the failure, click \"Retry migration\", and the migration will be scheduled to be retried in the background."
msgstr ""
+msgid "Check with your administrator."
+msgstr ""
+
msgid "Check your Docker images for known vulnerabilities."
msgstr ""
@@ -6778,6 +6842,9 @@ msgstr ""
msgid "Checkout"
msgstr ""
+msgid "Checkout|$%{selectedPlanPrice} per 10 GB storage per pack"
+msgstr ""
+
msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 minutes"
msgstr ""
@@ -6800,19 +6867,25 @@ msgstr ""
msgid "Checkout|%{name}'s GitLab subscription"
msgstr ""
-msgid "Checkout|%{selectedPlanText} plan"
+msgid "Checkout|%{name}'s storage subscription"
msgstr ""
-msgid "Checkout|%{startDate} - %{endDate}"
+msgid "Checkout|%{quantity} GB of storage"
msgstr ""
-msgid "Checkout|%{totalCiMinutes} CI minute"
-msgid_plural "Checkout|%{totalCiMinutes} CI minutes"
+msgid "Checkout|%{quantity} storage pack"
+msgid_plural "Checkout|%{quantity} storage packs"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "Checkout|%{selectedPlanText} plan"
+msgstr ""
+
+msgid "Checkout|%{startDate} - %{endDate}"
+msgstr ""
+
msgid "Checkout|%{totalCiMinutes} CI minutes"
msgstr ""
@@ -6888,6 +6961,9 @@ msgstr ""
msgid "Checkout|Failed to register credit card. Please try again."
msgstr ""
+msgid "Checkout|GB"
+msgstr ""
+
msgid "Checkout|GitLab group"
msgstr ""
@@ -6924,6 +7000,9 @@ msgstr ""
msgid "Checkout|State"
msgstr ""
+msgid "Checkout|Storage packs"
+msgstr ""
+
msgid "Checkout|Street address"
msgstr ""
@@ -6945,6 +7024,9 @@ msgstr ""
msgid "Checkout|Total minutes: %{quantity}"
msgstr ""
+msgid "Checkout|Total storage: %{quantity} GB"
+msgstr ""
+
msgid "Checkout|Users"
msgstr ""
@@ -6954,16 +7036,25 @@ msgstr ""
msgid "Checkout|Your organization"
msgstr ""
+msgid "Checkout|Your storage subscription has the same term as your main subscription, and the price is prorated accordingly."
+msgstr ""
+
msgid "Checkout|Your subscription will be applied to this group"
msgstr ""
msgid "Checkout|Zip code"
msgstr ""
+msgid "Checkout|a storage subscription"
+msgstr ""
+
msgid "Checkout|company or team"
msgstr ""
-msgid "Checkout|x 1,000 minutes per pack = %{strong}"
+msgid "Checkout|minutes"
+msgstr ""
+
+msgid "Checkout|x %{quantity} %{units} per pack ="
msgstr ""
msgid "Cherry-pick this commit"
@@ -7320,6 +7411,9 @@ msgstr ""
msgid "CloneIssue|Cannot clone issue to target project as it is pending deletion."
msgstr ""
+msgid "CloneIssue|Cannot clone issues of '%{issue_type}' type."
+msgstr ""
+
msgid "Cloned this issue to %{path_to_project}."
msgstr ""
@@ -7374,7 +7468,10 @@ msgstr ""
msgid "Closes this %{quick_action_target}."
msgstr ""
-msgid "Cloud licenses can not be removed."
+msgid "Cloud Functions description and apps that are suitable for this deployment target"
+msgstr ""
+
+msgid "Cloud Run description and apps that are suitable for this deployment target"
msgstr ""
msgid "Cluster"
@@ -7401,6 +7498,12 @@ msgstr ""
msgid "ClusterAgents|Access tokens"
msgstr ""
+msgid "ClusterAgents|Agent might not be connected to GitLab"
+msgstr ""
+
+msgid "ClusterAgents|Agent never connected to GitLab"
+msgstr ""
+
msgid "ClusterAgents|Alternative installation methods"
msgstr ""
@@ -7416,6 +7519,12 @@ msgstr ""
msgid "ClusterAgents|Configuration"
msgstr ""
+msgid "ClusterAgents|Connected"
+msgstr ""
+
+msgid "ClusterAgents|Connection status"
+msgstr ""
+
msgid "ClusterAgents|Copy token"
msgstr ""
@@ -7434,6 +7543,9 @@ msgstr ""
msgid "ClusterAgents|For alternative installation methods %{linkStart}go to the documentation%{linkEnd}."
msgstr ""
+msgid "ClusterAgents|For more troubleshooting information go to"
+msgstr ""
+
msgid "ClusterAgents|Go to the repository"
msgstr ""
@@ -7449,18 +7561,30 @@ msgstr ""
msgid "ClusterAgents|Integrate with the GitLab Agent"
msgstr ""
-msgid "ClusterAgents|Last used"
+msgid "ClusterAgents|Last connected %{timeAgo}."
+msgstr ""
+
+msgid "ClusterAgents|Last contact"
msgstr ""
msgid "ClusterAgents|Learn how to create an agent access token"
msgstr ""
+msgid "ClusterAgents|Make sure you are using a valid token."
+msgstr ""
+
msgid "ClusterAgents|Name"
msgstr ""
msgid "ClusterAgents|Never"
msgstr ""
+msgid "ClusterAgents|Never connected"
+msgstr ""
+
+msgid "ClusterAgents|Not connected"
+msgstr ""
+
msgid "ClusterAgents|Read more about getting started"
msgstr ""
@@ -7482,6 +7606,9 @@ msgstr ""
msgid "ClusterAgents|Select which Agent you want to install"
msgstr ""
+msgid "ClusterAgents|The Agent has not been connected in a long time. There might be a connectivity issue. Last contact was %{timeAgo}."
+msgstr ""
+
msgid "ClusterAgents|The GitLab Agent also requires %{linkStart}enabling the Agent Server%{linkEnd}"
msgstr ""
@@ -7509,9 +7636,6 @@ msgstr ""
msgid "ClusterAgents|You will need to create a token to connect to your agent"
msgstr ""
-msgid "ClusterAgent|This feature is only available for premium plans"
-msgstr ""
-
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -7701,9 +7825,6 @@ msgstr ""
msgid "ClusterIntegration|Create Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Create a provision role on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the account and external ID above. %{startMoreInfoLink}More information%{endLink}"
-msgstr ""
-
msgid "ClusterIntegration|Create cluster on"
msgstr ""
@@ -8136,7 +8257,7 @@ msgstr ""
msgid "ClusterIntegration|Subnets"
msgstr ""
-msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provisioned role, first create one on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the above account and external IDs. %{startMoreInfoLink}More information%{endLink}"
+msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provisioned role, first create one on %{awsLinkStart}Amazon Web Services %{awsLinkEnd} using the above account and external IDs. %{moreInfoStart}More information%{moreInfoEnd}"
msgstr ""
msgid "ClusterIntegration|The Kubernetes certificate used to authenticate to the cluster."
@@ -8370,6 +8491,9 @@ msgstr ""
msgid "Collapse replies"
msgstr ""
+msgid "Collapse settings section"
+msgstr ""
+
msgid "Collapse sidebar"
msgstr ""
@@ -8388,6 +8512,9 @@ msgstr ""
msgid "Comma-separated list of email addresses."
msgstr ""
+msgid "Comma-separated list of users allowed to exceed the rate limit."
+msgstr ""
+
msgid "Comma-separated, e.g. '1.1.1.1, 2.2.2.0/24'"
msgstr ""
@@ -8710,6 +8837,9 @@ msgstr ""
msgid "Configure %{repository_checks_link_start}repository checks%{link_end} and %{housekeeping_link_start}housekeeping%{link_end} on repositories."
msgstr ""
+msgid "Configure CAPTCHAs, IP address limits, and other anti-spam measures."
+msgstr ""
+
msgid "Configure Dependency Scanning in `.gitlab-ci.yml` using the GitLab managed template. You can [add variable overrides](https://docs.gitlab.com/ee/user/application_security/dependency_scanning/#customizing-the-dependency-scanning-settings) to customize Dependency Scanning settings."
msgstr ""
@@ -8746,16 +8876,13 @@ msgstr ""
msgid "Configure a %{codeStart}.gitlab-webide.yml%{codeEnd} file in the %{codeStart}.gitlab%{codeEnd} directory to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
msgstr ""
-msgid "Configure existing installation"
-msgstr ""
-
-msgid "Configure limit for notes created per minute by web and API requests."
+msgid "Configure advanced permissions, Large File Storage, and two-factor authentication settings."
msgstr ""
-msgid "Configure limits for Project/Group Import/Export."
+msgid "Configure approvals by authors and committers on all projects."
msgstr ""
-msgid "Configure limits for web and API requests."
+msgid "Configure existing installation"
msgstr ""
msgid "Configure paths to be protected by Rack Attack."
@@ -8770,10 +8897,13 @@ msgstr ""
msgid "Configure settings for Advanced Search with Elasticsearch."
msgstr ""
+msgid "Configure specific limits for Files API requests that supersede the general user and IP rate limits."
+msgstr ""
+
msgid "Configure specific limits for Git LFS requests that supersede the general user and IP rate limits."
msgstr ""
-msgid "Configure specific limits for Packages API requests that supersede the general user and IP rate limits."
+msgid "Configure specific limits for deprecated API requests that supersede the general user and IP rate limits."
msgstr ""
msgid "Configure the %{link} integration."
@@ -8785,6 +8915,9 @@ msgstr ""
msgid "Configure the way a user creates a new account."
msgstr ""
+msgid "Configure via Merge Request"
+msgstr ""
+
msgid "Configure which lists are shown for anyone who visits this board"
msgstr ""
@@ -9259,6 +9392,9 @@ msgstr ""
msgid "Content parsed with %{link}."
msgstr ""
+msgid "ContentEditor|Table of Contents"
+msgstr ""
+
msgid "ContentEditor|You have to provide a renderMarkdown function or a custom serializer"
msgstr ""
@@ -9445,6 +9581,9 @@ msgstr ""
msgid "Copy link to chart"
msgstr ""
+msgid "Copy prefix"
+msgstr ""
+
msgid "Copy reference"
msgstr ""
@@ -9475,6 +9614,9 @@ msgstr ""
msgid "Copy value"
msgstr ""
+msgid "Corpus Management"
+msgstr ""
+
msgid "Corpus Management|Are you sure you want to delete the corpus?"
msgstr ""
@@ -9703,6 +9845,9 @@ msgstr ""
msgid "Create commit"
msgstr ""
+msgid "Create common files more quickly, and standardize their format."
+msgstr ""
+
msgid "Create confidential merge request"
msgstr ""
@@ -9736,6 +9881,9 @@ msgstr ""
msgid "Create issue"
msgstr ""
+msgid "Create issue to resolve all threads"
+msgstr ""
+
msgid "Create iteration"
msgstr ""
@@ -9790,6 +9938,9 @@ msgstr ""
msgid "Create new..."
msgstr ""
+msgid "Create or import your first project"
+msgstr ""
+
msgid "Create project"
msgstr ""
@@ -10147,7 +10298,7 @@ msgstr ""
msgid "Custom notification events"
msgstr ""
-msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notificationLinkStart} notification emails%{notificationLinkEnd}."
+msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notificationLinkStart}notification emails%{notificationLinkEnd}."
msgstr ""
msgid "Custom project templates"
@@ -10350,10 +10501,10 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-msgid "CycleAnalytics|Showing data for group '%{groupName}' and %{selectedProjectCount} projects from %{startDate} to %{endDate}"
+msgid "CycleAnalytics|Showing data for group '%{groupName}' and %{selectedProjectCount} projects from %{createdAfter} to %{createdBefore}"
msgstr ""
-msgid "CycleAnalytics|Showing data for group '%{groupName}' from %{startDate} to %{endDate}"
+msgid "CycleAnalytics|Showing data for group '%{groupName}' from %{createdAfter} to %{createdBefore}"
msgstr ""
msgid "CycleAnalytics|Stages"
@@ -10587,6 +10738,9 @@ msgstr ""
msgid "DastProfiles|Manage profiles"
msgstr ""
+msgid "DastProfiles|Manage site profiles"
+msgstr ""
+
msgid "DastProfiles|Minimum = 0 (no timeout enabled), Maximum = 2880 minutes"
msgstr ""
@@ -10662,6 +10816,9 @@ msgstr ""
msgid "DastProfiles|Scanner name"
msgstr ""
+msgid "DastProfiles|Schedule"
+msgstr ""
+
msgid "DastProfiles|Select branch"
msgstr ""
@@ -10731,7 +10888,7 @@ msgstr ""
msgid "DastProfiles|Website"
msgstr ""
-msgid "DastProfiles|You can either choose a passive scan or validate the target site in your chosen site profile. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
+msgid "DastProfiles|You can either choose a passive scan or validate the target site from the site profile management page. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
msgstr ""
msgid "DastProfiles|You cannot run an active scan against an unvalidated site."
@@ -10906,7 +11063,7 @@ msgstr ""
msgid "Days to merge"
msgstr ""
-msgid "Deactivate dormant users after 90 days of inactivity. Users can return to active status by signing in to their account. While inactive, a user is not counted as an active user in the instance."
+msgid "Deactivate dormant users after 90 days of inactivity"
msgstr ""
msgid "Dear Administrator,"
@@ -10993,10 +11150,10 @@ msgstr ""
msgid "Define a custom pattern with cron syntax"
msgstr ""
-msgid "Define approval settings."
+msgid "Define approval rules."
msgstr ""
-msgid "Define approval settings. %{linkStart}Learn more.%{linkEnd}"
+msgid "Define approval rules. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "Define custom rules for what constitutes spam, independent of Akismet"
@@ -11005,7 +11162,7 @@ msgstr ""
msgid "Define environments in the deploy stage(s) in %{code_open}.gitlab-ci.yml%{code_close} to track deployments here."
msgstr ""
-msgid "Define how approval rules are applied as a merge request moves toward completion."
+msgid "Define how approval rules are applied to merge requests."
msgstr ""
msgid "Definition"
@@ -11020,6 +11177,12 @@ msgstr ""
msgid "DelayedJobs|Are you sure you want to run %{job_name} immediately? This job will run automatically after it's timer finishes."
msgstr ""
+msgid "DelayedJobs|Are you sure you want to run %{job_name} immediately? This job will run automatically after its timer finishes."
+msgstr ""
+
+msgid "DelayedJobs|Run the delayed job now?"
+msgstr ""
+
msgid "DelayedJobs|Start now"
msgstr ""
@@ -11302,6 +11465,12 @@ msgstr ""
msgid "Dependency proxy image prefix"
msgstr ""
+msgid "DependencyProxy|Create a local proxy for storing frequently used upstream images. %{docLinkStart}Learn more%{docLinkEnd} about dependency proxies."
+msgstr ""
+
+msgid "DependencyProxy|Dependency Proxy"
+msgstr ""
+
msgid "DependencyProxy|Toggle Dependency Proxy"
msgstr ""
@@ -11548,6 +11717,9 @@ msgstr ""
msgid "Deployments"
msgstr ""
+msgid "Deployments to Google Kubernetes Engine can be "
+msgstr ""
+
msgid "Deployments|%{deployments} environment impacted."
msgid_plural "Deployments|%{deployments} environments impacted."
msgstr[0] ""
@@ -11579,6 +11751,9 @@ msgstr ""
msgid "Deployment|success"
msgstr ""
+msgid "Deprecated API rate limits"
+msgstr ""
+
msgid "Deprioritize label"
msgstr ""
@@ -11981,6 +12156,20 @@ msgstr ""
msgid "DiffsCompareBaseBranch|(base)"
msgstr ""
+msgid "Diffs|%d addition"
+msgid_plural "Diffs|%d additions"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
+msgid "Diffs|%d deletion"
+msgid_plural "Diffs|%d deletions"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "Diffs|No file name available"
msgstr ""
@@ -11990,9 +12179,19 @@ msgstr ""
msgid "Diffs|Show all unchanged lines"
msgstr ""
+msgid "Diffs|Showing %{dropdownStart}%{count} changed file%{dropdownEnd}"
+msgid_plural "Diffs|Showing %{dropdownStart}%{count} changed files%{dropdownEnd}"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "Diffs|Something went wrong while fetching diff lines."
msgstr ""
+msgid "Diffs|with %{additions} and %{deletions}"
+msgstr ""
+
msgid "Direct member"
msgstr ""
@@ -12120,9 +12319,6 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-msgid "Dismiss Value Stream Analytics introduction box"
-msgstr ""
-
msgid "Dismiss merge request promotion"
msgstr ""
@@ -12444,6 +12640,9 @@ msgstr ""
msgid "Edit issues"
msgstr ""
+msgid "Edit merge requests"
+msgstr ""
+
msgid "Edit public deploy key"
msgstr ""
@@ -12519,6 +12718,9 @@ msgstr ""
msgid "Elastic|None. Select projects to index."
msgstr ""
+msgid "Eligible users"
+msgstr ""
+
msgid "Email"
msgstr ""
@@ -12648,6 +12850,9 @@ msgstr ""
msgid "Enable"
msgstr ""
+msgid "Enable Amazon EKS integration"
+msgstr ""
+
msgid "Enable Auto DevOps"
msgstr ""
@@ -12681,6 +12886,9 @@ msgstr ""
msgid "Enable SSL verification"
msgstr ""
+msgid "Enable Service Ping"
+msgstr ""
+
msgid "Enable Snowplow tracking"
msgstr ""
@@ -12711,6 +12919,9 @@ msgstr ""
msgid "Enable authenticated Git LFS request rate limit"
msgstr ""
+msgid "Enable authenticated web request rate limit"
+msgstr ""
+
msgid "Enable authentication"
msgstr ""
@@ -12771,7 +12982,7 @@ msgstr ""
msgid "Enable or disable the Pseudonymizer data collection."
msgstr ""
-msgid "Enable or disable version check and service ping."
+msgid "Enable or disable version check and Service Ping."
msgstr ""
msgid "Enable protected paths rate limit"
@@ -12783,18 +12994,12 @@ msgstr ""
msgid "Enable reCAPTCHA"
msgstr ""
-msgid "Enable reCAPTCHA for login"
-msgstr ""
-
-msgid "Enable reCAPTCHA, Invisible Captcha, Akismet and set IP limits. For reCAPTCHA, we currently only support %{recaptcha_v2_link_start}v2%{recaptcha_v2_link_end}"
+msgid "Enable reCAPTCHA for login."
msgstr ""
msgid "Enable repository checks"
msgstr ""
-msgid "Enable service ping"
-msgstr ""
-
msgid "Enable shared runners for all projects and subgroups in this group."
msgstr ""
@@ -12816,7 +13021,10 @@ msgstr ""
msgid "Enable unauthenticated API request rate limit"
msgstr ""
-msgid "Enable unauthenticated request rate limit"
+msgid "Enable unauthenticated web request rate limit"
+msgstr ""
+
+msgid "Enable user deactivation emails"
msgstr ""
msgid "Enable version check"
@@ -12852,9 +13060,6 @@ msgstr ""
msgid "Enabled sources for code import during project creation. OmniAuth must be configured for GitHub"
msgstr ""
-msgid "Enabling this will only make licensed EE features available to projects if the project namespace's plan includes the feature or if the project is public."
-msgstr ""
-
msgid "Encountered an error while rendering: %{err}"
msgstr ""
@@ -12903,9 +13108,6 @@ msgstr ""
msgid "Enter Admin Mode"
msgstr ""
-msgid "Enter IP address range"
-msgstr ""
-
msgid "Enter a number"
msgstr ""
@@ -12918,9 +13120,6 @@ msgstr ""
msgid "Enter at least three characters to search"
msgstr ""
-msgid "Enter domain"
-msgstr ""
-
msgid "Enter in your Bitbucket Server URL and personal access token below"
msgstr ""
@@ -13107,9 +13306,6 @@ msgstr ""
msgid "Environments|Deployment %{status}"
msgstr ""
-msgid "Environments|Dismiss"
-msgstr ""
-
msgid "Environments|Enable review app"
msgstr ""
@@ -13122,9 +13318,6 @@ msgstr ""
msgid "Environments|Environments are places where code gets deployed, such as staging or production."
msgstr ""
-msgid "Environments|Help us improve environments"
-msgstr ""
-
msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
msgstr ""
@@ -13161,6 +13354,9 @@ msgstr ""
msgid "Environments|Note that this action will stop the environment, but it will %{emphasisStart}not%{emphasisEnd} have an effect on any existing deployment due to no “stop environment action†being defined in the %{ciConfigLinkStart}.gitlab-ci.yml%{ciConfigLinkEnd} file."
msgstr ""
+msgid "Environments|Open"
+msgstr ""
+
msgid "Environments|Open live environment"
msgstr ""
@@ -13200,9 +13396,6 @@ msgstr ""
msgid "Environments|Stopping %{environmentName}"
msgstr ""
-msgid "Environments|Take the survey"
-msgstr ""
-
msgid "Environments|There was an error fetching the logs. Please try again."
msgstr ""
@@ -13224,9 +13417,6 @@ msgstr ""
msgid "Environments|You don't have any environments right now"
msgstr ""
-msgid "Environments|Your feedback helps GitLab make environments better for you and other users. Participate and enter a sweepstake to win a USD 30 gift card."
-msgstr ""
-
msgid "Environments|by %{avatar}"
msgstr ""
@@ -13509,7 +13699,7 @@ msgstr ""
msgid "Error parsing CSV file. Please make sure it has"
msgstr ""
-msgid "Error rendering markdown preview"
+msgid "Error rendering Markdown preview"
msgstr ""
msgid "Error saving label update."
@@ -13557,6 +13747,9 @@ msgstr ""
msgid "Error: %{error_message}"
msgstr ""
+msgid "Error: Couldn't load some or all of the changes."
+msgstr ""
+
msgid "Error: No AWS credentials were supplied"
msgstr ""
@@ -13590,6 +13783,9 @@ msgstr ""
msgid "ErrorTracking|Enable error tracking"
msgstr ""
+msgid "ErrorTracking|Error tracking backend"
+msgstr ""
+
msgid "ErrorTracking|If you self-host Sentry, enter your Sentry instance's full URL. If you use Sentry's hosted solution, enter https://sentry.io"
msgstr ""
@@ -13623,6 +13819,12 @@ msgstr ""
msgid "Escalation policies must have at least one rule"
msgstr ""
+msgid "EscalationPolicies|%{clockIcon} IF alert is not %{alertStatus} in %{minutes}"
+msgstr ""
+
+msgid "EscalationPolicies|%{notificationIcon} THEN %{doAction} %{forScheduleOrUser}"
+msgstr ""
+
msgid "EscalationPolicies|+ Add an additional rule"
msgstr ""
@@ -13665,13 +13867,13 @@ msgstr ""
msgid "EscalationPolicies|Escalation policies"
msgstr ""
-msgid "EscalationPolicies|Escalation rules"
+msgid "EscalationPolicies|Escalation policy %{obstacle} in Project %{project}"
msgstr ""
-msgid "EscalationPolicies|Failed to load oncall-schedules"
+msgid "EscalationPolicies|Escalation rules"
msgstr ""
-msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} %{then} THEN %{doAction} %{scheduleOrUser}"
+msgid "EscalationPolicies|Failed to load oncall-schedules"
msgstr ""
msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} minutes"
@@ -13749,18 +13951,36 @@ msgstr ""
msgid "Every %{action} attempt has failed: %{job_error_message}. Please try again."
msgstr ""
+msgid "Every 3 months"
+msgstr ""
+
+msgid "Every 3 months on the %{day} at %{time} %{timezone}"
+msgstr ""
+
+msgid "Every 6 months"
+msgstr ""
+
+msgid "Every 6 months on the %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Every day"
msgstr ""
msgid "Every day (at %{time})"
msgstr ""
+msgid "Every day at %{time} %{timezone}"
+msgstr ""
+
msgid "Every month"
msgstr ""
msgid "Every month (Day %{day} at %{time})"
msgstr ""
+msgid "Every month on the %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Every three months"
msgstr ""
@@ -13777,6 +13997,15 @@ msgstr[3] ""
msgid "Every week (%{weekday} at %{time})"
msgstr ""
+msgid "Every week on %{day} at %{time} %{timezone}"
+msgstr ""
+
+msgid "Every year"
+msgstr ""
+
+msgid "Every year on %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Everyone"
msgstr ""
@@ -13813,9 +14042,6 @@ msgstr ""
msgid "Exactly one of %{attributes} is required"
msgstr ""
-msgid "Example: %{ip_address}. %{read_more_link}."
-msgstr ""
-
msgid "Example: @sub\\.company\\.com$"
msgstr ""
@@ -13882,13 +14108,13 @@ msgstr ""
msgid "Expand pipeline"
msgstr ""
-msgid "Expand sidebar"
+msgid "Expand settings section"
msgstr ""
-msgid "Expected documents: %{expected_documents}"
+msgid "Expand sidebar"
msgstr ""
-msgid "Experienced"
+msgid "Expected documents: %{expected_documents}"
msgstr ""
msgid "ExperimentSubject|Must have exactly one of User, Namespace, or Project."
@@ -14173,9 +14399,6 @@ msgstr ""
msgid "Failed to load related branches"
msgstr ""
-msgid "Failed to load sidebar lock status"
-msgstr ""
-
msgid "Failed to load stacktrace."
msgstr ""
@@ -14604,6 +14827,9 @@ msgstr ""
msgid "Files"
msgstr ""
+msgid "Files API Rate Limits"
+msgstr ""
+
msgid "Files breadcrumb"
msgstr ""
@@ -15603,6 +15829,9 @@ msgstr ""
msgid "GitLab group: %{source_link}"
msgstr ""
+msgid "GitLab informs you if a new version is available."
+msgstr ""
+
msgid "GitLab is a complete DevOps platform, delivered as a single application, fundamentally changing the way Development, Security, and Ops teams collaborate"
msgstr ""
@@ -15618,7 +15847,7 @@ msgstr ""
msgid "GitLab is open source software to collaborate on code."
msgstr ""
-msgid "GitLab is undergoing maintenance and is operating in a read-only mode."
+msgid "GitLab is undergoing maintenance and is operating in read-only mode."
msgstr ""
msgid "GitLab member or Email address"
@@ -15630,9 +15859,6 @@ msgstr ""
msgid "GitLab project export"
msgstr ""
-msgid "GitLab restart is required to apply changes."
-msgstr ""
-
msgid "GitLab single sign-on URL"
msgstr ""
@@ -15648,9 +15874,6 @@ msgstr ""
msgid "GitLab version"
msgstr ""
-msgid "GitLab will inform you if a new version is available."
-msgstr ""
-
msgid "GitLab will run a background job that will produce pseudonymized CSVs of the GitLab database that will be uploaded to your configured object storage directory."
msgstr ""
@@ -15915,9 +16138,21 @@ msgstr ""
msgid "Go to snippets"
msgstr ""
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check 'Allowed domains for sign-ups'."
+msgstr ""
+
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check 'Email restrictions for sign-ups'."
+msgstr ""
+
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check the 'Domain denylist'."
+msgstr ""
+
msgid "Go to the activity feed"
msgstr ""
+msgid "Go to the group’s 'Settings &gt; General' page, and check 'Restrict membership by email domain'."
+msgstr ""
+
msgid "Go to the milestone list"
msgstr ""
@@ -15954,6 +16189,12 @@ msgstr ""
msgid "Goal of the changes and what reviewers should be aware of"
msgstr ""
+msgid "Google Cloud"
+msgstr ""
+
+msgid "Google Cloud offers several deployment targets. Select the one most suitable for your project."
+msgstr ""
+
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
@@ -16038,9 +16279,6 @@ msgstr ""
msgid "Group ID"
msgstr ""
-msgid "Group ID: %{group_id}"
-msgstr ""
-
msgid "Group Owner must have signed in with SAML before enabling Group Managed Accounts"
msgstr ""
@@ -16215,6 +16453,12 @@ msgstr ""
msgid "GroupImport|Unable to process group import file"
msgstr ""
+msgid "GroupPage|Copy group ID"
+msgstr ""
+
+msgid "GroupPage|Group ID: %{group_id}"
+msgstr ""
+
msgid "GroupRoadmap|%{dateWord} – No end date"
msgstr ""
@@ -16269,6 +16513,9 @@ msgstr ""
msgid "GroupRoadmap|Within 3 years"
msgstr ""
+msgid "GroupSAML|\"persistent\" recommended"
+msgstr ""
+
msgid "GroupSAML|%{strongOpen}Warning%{strongClose} - Enabling %{linkStart}SSO enforcement%{linkEnd} can reduce security risks."
msgstr ""
@@ -16401,6 +16648,9 @@ msgstr ""
msgid "GroupSAML|To be able to prohibit outer forks, you first need to enforce dedicate group managed accounts."
msgstr ""
+msgid "GroupSAML|Use SAML group links to manage group membership using SAML."
+msgstr ""
+
msgid "GroupSAML|Valid SAML Response"
msgstr ""
@@ -16413,13 +16663,10 @@ msgstr ""
msgid "GroupSAML|as %{access_level}"
msgstr ""
-msgid "GroupSAML|must match stored NameID of \"%{extern_uid}\" as we use this to identify users. If the NameID changes users will be unable to sign in."
-msgstr ""
-
-msgid "GroupSAML|should be \"persistent\""
+msgid "GroupSAML|must match stored NameID of \"%{extern_uid}\" to identify user and allow sign in"
msgstr ""
-msgid "GroupSAML|should be a random persistent ID, emails are discouraged"
+msgid "GroupSAML|recommend persistent ID instead of email"
msgstr ""
msgid "GroupSelect|No matching results"
@@ -16434,9 +16681,15 @@ msgstr ""
msgid "GroupSettings|Allow project access token creation"
msgstr ""
+msgid "GroupSettings|Applied to all subgroups unless overridden by a group owner. Groups already added to the project lose access."
+msgstr ""
+
msgid "GroupSettings|Auto DevOps pipeline was updated for the group"
msgstr ""
+msgid "GroupSettings|Available only on the top-level group. Applies to all subgroups. Groups already shared with a group outside %{group} are still shared unless removed manually."
+msgstr ""
+
msgid "GroupSettings|Badges"
msgstr ""
@@ -16488,6 +16741,9 @@ msgstr ""
msgid "GroupSettings|New runners registration token has been generated!"
msgstr ""
+msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgstr ""
+
msgid "GroupSettings|Pipeline settings was updated for the group"
msgstr ""
@@ -16500,12 +16756,15 @@ msgstr ""
msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
-msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups."
+msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups"
msgstr ""
msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
msgstr ""
+msgid "GroupSettings|Prevents group members from being notified if the group is mentioned."
+msgstr ""
+
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
msgstr ""
@@ -16542,21 +16801,6 @@ msgstr ""
msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}."
msgstr ""
-msgid "GroupSettings|This setting is only available on the top-level group and it applies to all subgroups. Groups that have already been shared with a group outside %{group} will still be shared, and this access will have to be revoked manually."
-msgstr ""
-
-msgid "GroupSettings|This setting will be applied to all subgroups unless overridden by a group owner. Groups that already have access to the project will continue to have access unless removed manually."
-msgstr ""
-
-msgid "GroupSettings|This setting will override user notification preferences for all members of the group, subgroups, and projects."
-msgstr ""
-
-msgid "GroupSettings|This setting will prevent group members from being notified if the group is mentioned."
-msgstr ""
-
-msgid "GroupSettings|This setting will prevent group members from forking projects outside of the group."
-msgstr ""
-
msgid "GroupSettings|Transfer group"
msgstr ""
@@ -16674,7 +16918,7 @@ msgstr ""
msgid "GroupsNew|No import options available"
msgstr ""
-msgid "GroupsNew|Not all related objects are migrated, as %{docs_link_start}described here%{docs_link_end}. Please %{feedback_link_start}leave feedback%{feedback_link_end} on this feature."
+msgid "GroupsNew|Not all related objects are migrated. %{docs_link_start}More info%{docs_link_end}."
msgstr ""
msgid "GroupsNew|Personal access token"
@@ -16806,15 +17050,27 @@ msgstr ""
msgid "Hello %{name},"
msgstr ""
-msgid "Hello there"
-msgstr ""
-
msgid "Hello, %{name}!"
msgstr ""
msgid "Hello, %{username}!"
msgstr ""
+msgid "HelloMessage|%{handshake_emoji} Contribute to GitLab: %{contribute_link}"
+msgstr ""
+
+msgid "HelloMessage|%{magnifier_emoji} Create a new GitLab issue: %{new_issue_link}"
+msgstr ""
+
+msgid "HelloMessage|%{rocket_emoji} We like your curiosity! Help us improve GitLab by joining the team: %{jobs_page_link}"
+msgstr ""
+
+msgid "HelloMessage|Does this page need fixes or improvements? Open an issue or contribute a merge request to help make GitLab more lovable. At GitLab, everyone can contribute!"
+msgstr ""
+
+msgid "HelloMessage|Welcome to GitLab!"
+msgstr ""
+
msgid "Help"
msgstr ""
@@ -16824,13 +17080,10 @@ msgstr ""
msgid "Helps prevent bots from creating accounts."
msgstr ""
-msgid "Helps prevent bots from creating issues"
+msgid "Helps prevent bots from creating issues."
msgstr ""
-msgid "Helps prevent malicious users hide their activity"
-msgstr ""
-
-msgid "Helps reduce request volume (e.g. from crawlers or abusive bots)"
+msgid "Helps prevent malicious users hide their activity."
msgstr ""
msgid "Helps reduce request volume (for example, from crawlers or abusive bots)"
@@ -16958,6 +17211,12 @@ msgstr ""
msgid "Housekeeping, export, path, transfer, remove, archive."
msgstr ""
+msgid "How do I configure Akismet?"
+msgstr ""
+
+msgid "How do I configure it?"
+msgstr ""
+
msgid "How do I configure runners?"
msgstr ""
@@ -16979,19 +17238,25 @@ msgstr ""
msgid "How do I set up this service?"
msgstr ""
+msgid "How do I use a web terminal?"
+msgstr ""
+
+msgid "How do I use file templates?"
+msgstr ""
+
msgid "How it works"
msgstr ""
msgid "How many days need to pass between marking entity for deletion and actual removing it."
msgstr ""
-msgid "How many seconds an IP will be counted towards the limit"
+msgid "How many seconds an IP counts toward the IP address limit."
msgstr ""
-msgid "I accept the %{terms_link}"
+msgid "How the job limiter handles jobs exceeding the thresholds specified below. The 'track' mode only logs the jobs. The 'compress' mode compresses the jobs and raises an exception if the compressed size exceeds the limit."
msgstr ""
-msgid "I accept the|Terms of Service and Privacy Policy"
+msgid "I accept the %{terms_link}"
msgstr ""
msgid "I forgot my password"
@@ -17075,13 +17340,16 @@ msgstr ""
msgid "IP Address"
msgstr ""
-msgid "IP expiration time"
+msgid "IP address expiration time"
msgstr ""
-msgid "IP subnet restriction only allowed for top-level groups"
+msgid "IP address restrictions"
+msgstr ""
+
+msgid "IP addresses per user"
msgstr ""
-msgid "IPs per user"
+msgid "IP subnet restriction only allowed for top-level groups"
msgstr ""
msgid "Identifier"
@@ -17096,6 +17364,9 @@ msgstr ""
msgid "If any indexed field exceeds this limit it will be truncated to this number of characters and the rest will not be indexed or searchable. This does not apply to repository and wiki indexing. Setting this to 0 means it is unlimited."
msgstr ""
+msgid "If blank, defaults to %{code_open}Retry later%{code_close}."
+msgstr ""
+
msgid "If blank, set allowable lifetime to %{instance_level_policy_in_words}, as defined by the instance admin. Once set, existing tokens for users in this group may be revoked."
msgstr ""
@@ -17147,6 +17418,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 did not initiate these sign-in attempts, please reach out to your administrator or enable two-factor authentication (2FA) on your account."
+msgstr ""
+
msgid "If you did not initiate this change, please contact your administrator immediately."
msgstr ""
@@ -17242,10 +17516,10 @@ msgstr ""
msgid "Import Projects from Gitea"
msgstr ""
-msgid "Import a project"
+msgid "Import an exported GitLab project"
msgstr ""
-msgid "Import an exported GitLab project"
+msgid "Import and export rate limits"
msgstr ""
msgid "Import failed due to a GitHub error: %{original}"
@@ -17257,12 +17531,18 @@ msgstr ""
msgid "Import from Jira"
msgstr ""
+msgid "Import group"
+msgstr ""
+
msgid "Import group from file"
msgstr ""
msgid "Import groups"
msgstr ""
+msgid "Import history"
+msgstr ""
+
msgid "Import in progress"
msgstr ""
@@ -17326,7 +17606,25 @@ msgstr ""
msgid "Import timed out. Import took longer than %{import_jobs_expiration} seconds"
msgstr ""
-msgid "Import/Export Rate Limits"
+msgid "ImportAProjectModal|Import from a project"
+msgstr ""
+
+msgid "ImportAProjectModal|Import members from another project"
+msgstr ""
+
+msgid "ImportAProjectModal|Import project members"
+msgstr ""
+
+msgid "ImportAProjectModal|Only project members (not group members) are imported, and they get the same permissions as the project you import from."
+msgstr ""
+
+msgid "ImportAProjectModal|Successfully imported"
+msgstr ""
+
+msgid "ImportAProjectModal|Unable to import project members"
+msgstr ""
+
+msgid "ImportAProjectModal|You're importing members to the %{strongStart}%{name}%{strongEnd} project."
msgstr ""
msgid "ImportButtons|Connect repositories from"
@@ -17381,7 +17679,7 @@ msgstr[3] ""
msgid "Importing..."
msgstr ""
-msgid "Import|A repository URL usually ends in a .git suffix, although this is not required. Double check to make sure your repository URL is correct."
+msgid "Import|There is not a valid Git repository at this URL. If your HTTP repository is not publicly accessible, verify your credentials."
msgstr ""
msgid "Improve customer support with Service Desk"
@@ -17390,9 +17688,6 @@ msgstr ""
msgid "Improves Git cloning performance."
msgstr ""
-msgid "In %{time_to_now}"
-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 ""
@@ -17678,7 +17973,7 @@ msgstr ""
msgid "InProductMarketing|Start a GitLab Ultimate trial today in less than one minute, no credit card required."
msgstr ""
-msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no CC required"
+msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no credit card required"
msgstr ""
msgid "InProductMarketing|Start a trial"
@@ -17717,7 +18012,7 @@ msgstr ""
msgid "InProductMarketing|Team up in GitLab for greater efficiency"
msgstr ""
-msgid "InProductMarketing|Team work makes the dream work"
+msgid "InProductMarketing|Team work makes the dream work"
msgstr ""
msgid "InProductMarketing|Test, create, deploy"
@@ -18300,6 +18595,9 @@ msgstr ""
msgid "Integrations|Create new issue in Jira"
msgstr ""
+msgid "Integrations|Create new issue in ZenTao"
+msgstr ""
+
msgid "Integrations|Default settings are inherited from the group level."
msgstr ""
@@ -18393,9 +18691,15 @@ msgstr ""
msgid "Integrations|Search Jira issues"
msgstr ""
+msgid "Integrations|Search ZenTao issues"
+msgstr ""
+
msgid "Integrations|Send notifications about project events to Unify Circuit."
msgstr ""
+msgid "Integrations|Send notifications about project events to a Unify Circuit conversation. %{docs_link}"
+msgstr ""
+
msgid "Integrations|Sign in to add namespaces"
msgstr ""
@@ -18435,6 +18739,9 @@ msgstr ""
msgid "Integrations|You've activated every integration 🎉"
msgstr ""
+msgid "Integrations|ZenTao issues display here when you create issues in your project in ZenTao."
+msgstr ""
+
msgid "Interactive mode"
msgstr ""
@@ -18462,9 +18769,6 @@ msgstr ""
msgid "Interval Pattern"
msgstr ""
-msgid "Introducing Value Stream Analytics"
-msgstr ""
-
msgid "Introducing Your DevOps Report"
msgstr ""
@@ -18561,6 +18865,12 @@ msgstr ""
msgid "Investigate vulnerability: %{title}"
msgstr ""
+msgid "Invisible Captcha"
+msgstr ""
+
+msgid "Invisible Captcha helps prevent the creation of spam accounts. It adds a honeypot field and time-sensitive form submission to the account signup form."
+msgstr ""
+
msgid "Invitation"
msgstr ""
@@ -19014,12 +19324,18 @@ msgstr ""
msgid "Issues"
msgstr ""
+msgid "Issues I've created"
+msgstr ""
+
msgid "Issues Rate Limits"
msgstr ""
msgid "Issues and merge requests"
msgstr ""
+msgid "Issues assigned to me"
+msgstr ""
+
msgid "Issues can be bugs, tasks or ideas to be discussed. Also, issues are searchable and filterable."
msgstr ""
@@ -19131,7 +19447,7 @@ msgstr ""
msgid "Iterations|Create cadence"
msgstr ""
-msgid "Iterations|Create your first iteration"
+msgid "Iterations|Create iteration"
msgstr ""
msgid "Iterations|Delete cadence"
@@ -19140,6 +19456,9 @@ msgstr ""
msgid "Iterations|Delete iteration cadence?"
msgstr ""
+msgid "Iterations|Delete iteration?"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -19173,12 +19492,18 @@ msgstr ""
msgid "Iterations|New iteration cadence"
msgstr ""
+msgid "Iterations|No closed iterations."
+msgstr ""
+
msgid "Iterations|No iteration cadences to show."
msgstr ""
msgid "Iterations|No iterations in cadence."
msgstr ""
+msgid "Iterations|No open iterations."
+msgstr ""
+
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
@@ -19209,6 +19534,9 @@ msgstr ""
msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
msgstr ""
+msgid "Iterations|This will remove the iteration from any issues that are assigned to it."
+msgstr ""
+
msgid "Iterations|Title"
msgstr ""
@@ -19224,15 +19552,9 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "I’m familiar with the basics of DevOps."
-msgstr ""
-
msgid "I’m joining my team who’s already on GitLab"
msgstr ""
-msgid "I’m not familiar with the basics of DevOps."
-msgstr ""
-
msgid "Jaeger URL"
msgstr ""
@@ -19497,6 +19819,9 @@ msgstr ""
msgid "Job"
msgstr ""
+msgid "Job %{jobName}"
+msgstr ""
+
msgid "Job Failed #%{build_id}"
msgstr ""
@@ -20089,9 +20414,6 @@ msgstr ""
msgid "Learn more in the"
msgstr ""
-msgid "Learn more in the|pipeline schedules documentation"
-msgstr ""
-
msgid "Learn more."
msgstr ""
@@ -20203,9 +20525,6 @@ msgstr ""
msgid "Leave Admin Mode"
msgstr ""
-msgid "Leave blank for no limit. Once set, existing personal access tokens may be revoked."
-msgstr ""
-
msgid "Leave edit mode? All unsaved changes will be lost."
msgstr ""
@@ -20251,10 +20570,10 @@ msgstr ""
msgid "LicenseCompliance|Acceptable license to be used in the project"
msgstr ""
-msgid "LicenseCompliance|Add a license"
+msgid "LicenseCompliance|Add license and related policy"
msgstr ""
-msgid "LicenseCompliance|Add license and related policy"
+msgid "LicenseCompliance|Add license policy"
msgstr ""
msgid "LicenseCompliance|Allow"
@@ -20356,6 +20675,9 @@ msgstr ""
msgid "LicenseManagement|Uncategorized"
msgstr ""
+msgid "Licensed Enterprise Edition features can be used if the project namespace's plan includes the feature, or if the project is public."
+msgstr ""
+
msgid "Licensed Features"
msgstr ""
@@ -20422,7 +20744,10 @@ msgstr ""
msgid "Limit namespaces and projects that can be indexed"
msgstr ""
-msgid "Limit sign in from multiple ips"
+msgid "Limit project size at a global, group, and project level. %{link_start}Learn more%{link_end}."
+msgstr ""
+
+msgid "Limit sign in from multiple IP addresses"
msgstr ""
msgid "Limit the number of concurrent operations this secondary site can run in the background."
@@ -20434,6 +20759,9 @@ msgstr ""
msgid "Limit the number of issues and epics per minute a user can create through web and API requests."
msgstr ""
+msgid "Limit the size of Sidekiq jobs stored in Redis."
+msgstr ""
+
msgid "Limited to showing %d event at most"
msgid_plural "Limited to showing %d events at most"
msgstr[0] ""
@@ -20441,6 +20769,9 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "Limiting mode"
+msgstr ""
+
msgid "Line changes"
msgstr ""
@@ -20510,9 +20841,6 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
-msgid "List of users to be excluded from the limit"
-msgstr ""
-
msgid "List options"
msgstr ""
@@ -20552,9 +20880,6 @@ msgstr ""
msgid "Loading functions timed out. Please reload the page to try again."
msgstr ""
-msgid "Loading issues"
-msgstr ""
-
msgid "Loading more"
msgstr ""
@@ -20846,6 +21171,9 @@ msgstr ""
msgid "Marked For Deletion At - %{deletion_time}"
msgstr ""
+msgid "Marked as ready. Merging is now allowed."
+msgstr ""
+
msgid "Marked this %{noun} as a draft."
msgstr ""
@@ -20918,52 +21246,22 @@ msgstr ""
msgid "Max 100,000 events"
msgstr ""
-msgid "Max 20 characters"
-msgstr ""
-
-msgid "Max Group Export Download requests per minute per user"
-msgstr ""
-
-msgid "Max Group Export requests per minute per user"
-msgstr ""
-
-msgid "Max Group Import requests per minute per user"
-msgstr ""
-
-msgid "Max Project Export Download requests per minute per user"
-msgstr ""
-
-msgid "Max Project Export requests per minute per user"
-msgstr ""
-
-msgid "Max Project Import requests per minute per user"
-msgstr ""
-
-msgid "Max authenticated API requests per period per user"
-msgstr ""
-
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
-msgid "Max authenticated web requests per period per user"
-msgstr ""
-
msgid "Max file size is 200 KB."
msgstr ""
-msgid "Max requests per minute per user"
-msgstr ""
-
msgid "Max role"
msgstr ""
msgid "Max session time"
msgstr ""
-msgid "Max unauthenticated requests per period per IP"
+msgid "MaxBuilds"
msgstr ""
-msgid "MaxBuilds"
+msgid "Maximum 20 characters"
msgstr ""
msgid "Maximum Conan package file size in bytes"
@@ -20999,6 +21297,12 @@ msgstr ""
msgid "Maximum attachment size (MB)"
msgstr ""
+msgid "Maximum authenticated API requests per rate limit period per user"
+msgstr ""
+
+msgid "Maximum authenticated web requests per rate limit period per user"
+msgstr ""
+
msgid "Maximum bulk request size (MiB)"
msgstr ""
@@ -21044,6 +21348,15 @@ msgstr ""
msgid "Maximum files in a diff"
msgstr ""
+msgid "Maximum group export download requests per minute"
+msgstr ""
+
+msgid "Maximum group export requests per minute"
+msgstr ""
+
+msgid "Maximum group import requests per minute"
+msgstr ""
+
msgid "Maximum import size"
msgstr ""
@@ -21080,7 +21393,7 @@ msgstr ""
msgid "Maximum number of projects."
msgstr ""
-msgid "Maximum number of unique IPs per user"
+msgid "Maximum number of unique IP addresses per user."
msgstr ""
msgid "Maximum page reached"
@@ -21089,12 +21402,24 @@ msgstr ""
msgid "Maximum page size"
msgstr ""
+msgid "Maximum project export download requests per minute"
+msgstr ""
+
+msgid "Maximum project export requests per minute"
+msgstr ""
+
+msgid "Maximum project import requests per minute"
+msgstr ""
+
msgid "Maximum push size"
msgstr ""
msgid "Maximum push size (MB)"
msgstr ""
+msgid "Maximum requests per minute"
+msgstr ""
+
msgid "Maximum running slices"
msgstr ""
@@ -21122,10 +21447,16 @@ msgstr ""
msgid "Maximum time between updates that a mirror can have when scheduled to synchronize."
msgstr ""
-msgid "Maximum time for web terminal websocket connection (in seconds). 0 for unlimited."
+msgid "Maximum time that users are allowed to skip the setup of two-factor authentication (in hours). Set to 0 (zero) to enforce at next sign in."
msgstr ""
-msgid "Maximum time that users are allowed to skip the setup of two-factor authentication (in hours). Set to 0 (zero) to enforce at next sign in."
+msgid "Maximum time, in seconds, for a web terminal websocket connection. 0 for unlimited."
+msgstr ""
+
+msgid "Maximum unauthenticated API requests per rate limit period per IP"
+msgstr ""
+
+msgid "Maximum unauthenticated web requests per rate limit period per IP"
msgstr ""
msgid "May"
@@ -21143,9 +21474,6 @@ msgstr ""
msgid "Medium vulnerabilities present"
msgstr ""
-msgid "Member lock"
-msgstr ""
-
msgid "Member since"
msgstr ""
@@ -21182,6 +21510,9 @@ msgstr ""
msgid "Members of a group may only view projects they have permission to access"
msgstr ""
+msgid "Membership"
+msgstr ""
+
msgid "Members|%{time} by %{user}"
msgstr ""
@@ -21242,9 +21573,6 @@ msgstr ""
msgid "Members|Expiration date updated successfully."
msgstr ""
-msgid "Members|Expired"
-msgstr ""
-
msgid "Members|Filter members"
msgstr ""
@@ -21260,9 +21588,6 @@ msgstr ""
msgid "Members|Membership"
msgstr ""
-msgid "Members|No expiration set"
-msgstr ""
-
msgid "Members|Remove \"%{groupName}\""
msgstr ""
@@ -21284,9 +21609,6 @@ msgstr ""
msgid "Members|Search invited"
msgstr ""
-msgid "Members|in %{time}"
-msgstr ""
-
msgid "Member|Deny access"
msgstr ""
@@ -21362,9 +21684,6 @@ msgstr ""
msgid "Merge request %{mr_link} was reviewed by %{mr_author}"
msgstr ""
-msgid "Merge request (MR) approvals"
-msgstr ""
-
msgid "Merge request analytics"
msgstr ""
@@ -21386,12 +21705,21 @@ msgstr ""
msgid "Merge requests"
msgstr ""
+msgid "Merge requests I've created"
+msgstr ""
+
msgid "Merge requests are a place to propose changes you've made to a project and discuss those changes with others"
msgstr ""
msgid "Merge requests are read-only in a secondary Geo node"
msgstr ""
+msgid "Merge requests assigned to me"
+msgstr ""
+
+msgid "Merge requests that I'm a reviewer"
+msgstr ""
+
msgid "Merge the branch and fix any conflicts that come up"
msgstr ""
@@ -21452,10 +21780,10 @@ msgstr ""
msgid "MergeRequests|An error occurred while saving the draft comment."
msgstr ""
-msgid "MergeRequests|Failed to squash. Should be done manually."
+msgid "MergeRequests|Create issue to resolve thread"
msgstr ""
-msgid "MergeRequests|Resolve this thread in a new issue"
+msgid "MergeRequests|Failed to squash. Should be done manually."
msgstr ""
msgid "MergeRequests|Saving the comment failed"
@@ -22273,6 +22601,9 @@ msgstr ""
msgid "MoveIssue|Cannot move issue to project it originates from!"
msgstr ""
+msgid "MoveIssue|Cannot move issues of '%{issue_type}' type."
+msgstr ""
+
msgid "Moved issue to %{label} column in the board."
msgstr ""
@@ -22400,6 +22731,15 @@ 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. To learn more about reducing storage capacity please visit our docs."
msgstr ""
+msgid "NamespaceUserCap|Pending users must be reviewed and approved by a group owner. Learn more about %{user_caps_link_start}User Caps%{link_end} and %{users_pending_approval_link_start}Users Pending Approval%{link_end}."
+msgstr ""
+
+msgid "NamespaceUserCap|View pending user approvals"
+msgstr ""
+
+msgid "NamespaceUserCap|Your group has reached its billable member limit"
+msgstr ""
+
msgid "Namespaces"
msgstr ""
@@ -22442,9 +22782,6 @@ msgstr ""
msgid "Network"
msgstr ""
-msgid "Network Policy|New rule"
-msgstr ""
-
msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is inbound from a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
msgstr ""
@@ -22466,16 +22803,13 @@ msgstr ""
msgid "NetworkPolicies|%{strongOpen}any%{strongClose} port"
msgstr ""
-msgid "NetworkPolicies|+ Add alert"
-msgstr ""
-
msgid "NetworkPolicies|.yaml"
msgstr ""
msgid "NetworkPolicies|.yaml mode"
msgstr ""
-msgid "NetworkPolicies|Actions"
+msgid "NetworkPolicies|Add alert"
msgstr ""
msgid "NetworkPolicies|Alerts are intended to be selectively used for a limited number of events that are potentially concerning and warrant a manual review. Alerts should not be used as a substitute for a SIEM or a logging tool. High volume alerts are likely to be dropped so as to preserve the stability of GitLab's integration with Kubernetes."
@@ -22511,9 +22845,6 @@ msgstr ""
msgid "NetworkPolicies|Deny all traffic"
msgstr ""
-msgid "NetworkPolicies|Description"
-msgstr ""
-
msgid "NetworkPolicies|Edit policy"
msgstr ""
@@ -22526,9 +22857,6 @@ msgstr ""
msgid "NetworkPolicies|IP/subnet"
msgstr ""
-msgid "NetworkPolicies|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
-msgstr ""
-
msgid "NetworkPolicies|Invalid or empty policy"
msgstr ""
@@ -22538,19 +22866,16 @@ msgstr ""
msgid "NetworkPolicies|Kubernetes error: %{error}"
msgstr ""
-msgid "NetworkPolicies|Name"
-msgstr ""
-
msgid "NetworkPolicies|Network"
msgstr ""
-msgid "NetworkPolicies|Network traffic"
+msgid "NetworkPolicies|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
msgstr ""
-msgid "NetworkPolicies|New policy"
+msgid "NetworkPolicies|Network policy can be created after the environment is loaded successfully."
msgstr ""
-msgid "NetworkPolicies|No policies detected"
+msgid "NetworkPolicies|Network traffic"
msgstr ""
msgid "NetworkPolicies|None selected"
@@ -22559,21 +22884,12 @@ msgstr ""
msgid "NetworkPolicies|Please %{installLinkStart}install%{installLinkEnd} and %{configureLinkStart}configure a Kubernetes Agent for this project%{configureLinkEnd} to enable alerts."
msgstr ""
-msgid "NetworkPolicies|Policies are a specification of how groups of pods are allowed to communicate with each other's network endpoints."
-msgstr ""
-
msgid "NetworkPolicies|Policy %{policyName} was successfully changed"
msgstr ""
msgid "NetworkPolicies|Policy definition"
msgstr ""
-msgid "NetworkPolicies|Policy editor"
-msgstr ""
-
-msgid "NetworkPolicies|Policy preview"
-msgstr ""
-
msgid "NetworkPolicies|Rule"
msgstr ""
@@ -22583,9 +22899,6 @@ msgstr ""
msgid "NetworkPolicies|Rule mode is unavailable for this policy. In some cases, we cannot parse the YAML file back into the rules editor."
msgstr ""
-msgid "NetworkPolicies|Rules"
-msgstr ""
-
msgid "NetworkPolicies|Save changes"
msgstr ""
@@ -22598,9 +22911,6 @@ msgstr ""
msgid "NetworkPolicies|Traffic that does not match any rule will be blocked."
msgstr ""
-msgid "NetworkPolicies|Unable to parse policy"
-msgstr ""
-
msgid "NetworkPolicies|all DNS names"
msgstr ""
@@ -22782,6 +23092,9 @@ msgstr ""
msgid "New issue"
msgstr ""
+msgid "New issue in %{project}"
+msgstr ""
+
msgid "New issue title"
msgstr ""
@@ -22860,7 +23173,7 @@ msgstr ""
msgid "Newest first"
msgstr ""
-msgid "Newly registered users will by default be external"
+msgid "Newly-registered users are external by default"
msgstr ""
msgid "Next"
@@ -23175,8 +23488,12 @@ msgstr ""
msgid "No webhooks found, add one in the form above."
msgstr ""
-msgid "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} to renew your subscription."
-msgstr ""
+msgid "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} day to renew your subscription."
+msgid_plural "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} days to renew your subscription."
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
msgid "No. of commits"
msgstr ""
@@ -23193,7 +23510,7 @@ msgstr ""
msgid "Nodes"
msgstr ""
-msgid "Non-admin users can sign in with read-only access and make read-only API requests."
+msgid "Non-admin users are restricted to read-only access, in both GitLab UI and API."
msgstr ""
msgid "None"
@@ -23274,7 +23591,7 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
-msgid "Notes Rate Limits"
+msgid "Notes rate limit"
msgstr ""
msgid "Notes|Are you sure you want to cancel creating this comment?"
@@ -23449,9 +23766,6 @@ msgstr ""
msgid "November"
msgstr ""
-msgid "Novice"
-msgstr ""
-
msgid "Now, personalize your GitLab experience"
msgstr ""
@@ -23620,7 +23934,7 @@ msgstr ""
msgid "OnCallSchedules|For this rotation, on-call will be:"
msgstr ""
-msgid "OnCallSchedules|On-call schedule %{schedule} in Project %{project}"
+msgid "OnCallSchedules|On-call schedule %{obstacle} in Project %{project}"
msgstr ""
msgid "OnCallSchedules|On-call schedules"
@@ -23767,22 +24081,22 @@ msgstr ""
msgid "OnDemandScans|Scanner profile"
msgstr ""
-msgid "OnDemandScans|Select one of the existing profiles"
+msgid "OnDemandScans|Schedule scan"
msgstr ""
-msgid "OnDemandScans|Site profile"
+msgid "OnDemandScans|Select one of the existing profiles"
msgstr ""
-msgid "OnDemandScans|Use existing scanner profile"
+msgid "OnDemandScans|Site profile"
msgstr ""
-msgid "OnDemandScans|Use existing site profile"
+msgid "OnDemandScans|Start time"
msgstr ""
-msgid "OnDemandScans|You can either choose a passive scan or validate the target site in your chosen site profile. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
+msgid "OnDemandScans|Use existing scanner profile"
msgstr ""
-msgid "OnDemandScans|You cannot run an active scan against an unvalidated site."
+msgid "OnDemandScans|Use existing site profile"
msgstr ""
msgid "OnDemandScans|You must create a repository within your project to run an on-demand scan."
@@ -23849,6 +24163,9 @@ msgstr ""
msgid "Only admins can delete project"
msgstr ""
+msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
+msgstr ""
+
msgid "Only include features new to your current subscription tier."
msgstr ""
@@ -23867,6 +24184,12 @@ msgstr ""
msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
+msgid "Only reCAPTCHA v2 is supported:"
+msgstr ""
+
+msgid "Only users from the specified IP address ranges are able to reach this group, including all subgroups, projects, and Git repositories."
+msgstr ""
+
msgid "Only verified users with an email address in any of these domains can be added to the group."
msgstr ""
@@ -24053,9 +24376,6 @@ msgstr ""
msgid "Package Registry"
msgstr ""
-msgid "Package Registry Rate Limits"
-msgstr ""
-
msgid "Package Registry: authenticated API requests"
msgstr ""
@@ -24074,6 +24394,9 @@ msgstr ""
msgid "Package recipe already exists"
msgstr ""
+msgid "Package registry rate limits"
+msgstr ""
+
msgid "Package type"
msgstr ""
@@ -24140,6 +24463,9 @@ msgstr ""
msgid "PackageRegistry|Composer"
msgstr ""
+msgid "PackageRegistry|Composer.json with license: %{license} and version: %{version}"
+msgstr ""
+
msgid "PackageRegistry|Conan"
msgstr ""
@@ -24203,6 +24529,9 @@ msgstr ""
msgid "PackageRegistry|Copy require package include"
msgstr ""
+msgid "PackageRegistry|Copy target SHA"
+msgstr ""
+
msgid "PackageRegistry|Copy yarn command"
msgstr ""
@@ -24269,6 +24598,9 @@ msgstr ""
msgid "PackageRegistry|Install package version"
msgstr ""
+msgid "PackageRegistry|Instance-level"
+msgstr ""
+
msgid "PackageRegistry|Invalid Package: failed metadata extraction"
msgstr ""
@@ -24314,6 +24646,9 @@ msgstr ""
msgid "PackageRegistry|Pip Command"
msgstr ""
+msgid "PackageRegistry|Project-level"
+msgstr ""
+
msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
msgstr ""
@@ -24335,6 +24670,9 @@ msgstr ""
msgid "PackageRegistry|Remove package"
msgstr ""
+msgid "PackageRegistry|Required Python: %{pythonVersion}"
+msgstr ""
+
msgid "PackageRegistry|RubyGems"
msgstr ""
@@ -24377,6 +24715,9 @@ msgstr ""
msgid "PackageRegistry|Source project located at %{link}"
msgstr ""
+msgid "PackageRegistry|Target SHA: %{sha}"
+msgstr ""
+
msgid "PackageRegistry|There are no other versions of this package."
msgstr ""
@@ -24545,6 +24886,18 @@ msgstr ""
msgid "Password was successfully updated. Please sign in again."
msgstr ""
+msgid "PasswordPrompt|Confirm password"
+msgstr ""
+
+msgid "PasswordPrompt|Confirm password to continue"
+msgstr ""
+
+msgid "PasswordPrompt|Password is required"
+msgstr ""
+
+msgid "PasswordPrompt|Please enter your password to confirm"
+msgstr ""
+
msgid "Passwords should be unique and not used for any other sites or services."
msgstr ""
@@ -24572,6 +24925,9 @@ msgstr ""
msgid "Paste project path (i.e. gitlab-org/gitlab)"
msgstr ""
+msgid "Paste this DSN into your Sentry SDK"
+msgstr ""
+
msgid "Paste your public SSH key, which is usually contained in the file '~/.ssh/id_ed25519.pub' or '~/.ssh/id_rsa.pub' and begins with 'ssh-ed25519' or 'ssh-rsa'. Do not paste your private SSH key, as that can compromise your identity."
msgstr ""
@@ -24656,6 +25012,9 @@ msgstr ""
msgid "PerformanceBar|First Contentful Paint"
msgstr ""
+msgid "PerformanceBar|Flamegraph with mode:"
+msgstr ""
+
msgid "PerformanceBar|Frontend resources"
msgstr ""
@@ -24689,6 +25048,15 @@ msgstr ""
msgid "PerformanceBar|Trace"
msgstr ""
+msgid "PerformanceBar|cpu"
+msgstr ""
+
+msgid "PerformanceBar|object"
+msgstr ""
+
+msgid "PerformanceBar|wall"
+msgstr ""
+
msgid "Period in seconds"
msgstr ""
@@ -24917,6 +25285,48 @@ msgstr ""
msgid "PipelineSchedules|Variables"
msgstr ""
+msgid "PipelineSource|API"
+msgstr ""
+
+msgid "PipelineSource|Chat"
+msgstr ""
+
+msgid "PipelineSource|External"
+msgstr ""
+
+msgid "PipelineSource|External Pull Request"
+msgstr ""
+
+msgid "PipelineSource|Merge Request"
+msgstr ""
+
+msgid "PipelineSource|On-Demand DAST Scan"
+msgstr ""
+
+msgid "PipelineSource|On-Demand DAST Validation"
+msgstr ""
+
+msgid "PipelineSource|Parent Pipeline"
+msgstr ""
+
+msgid "PipelineSource|Pipeline"
+msgstr ""
+
+msgid "PipelineSource|Push"
+msgstr ""
+
+msgid "PipelineSource|Schedule"
+msgstr ""
+
+msgid "PipelineSource|Trigger"
+msgstr ""
+
+msgid "PipelineSource|Web"
+msgstr ""
+
+msgid "PipelineSource|Web IDE"
+msgstr ""
+
msgid "PipelineStatusTooltip|Pipeline: %{ciStatus}"
msgstr ""
@@ -25217,46 +25627,7 @@ msgstr ""
msgid "Pipeline|Source"
msgstr ""
-msgid "Pipeline|Source|API"
-msgstr ""
-
-msgid "Pipeline|Source|Chat"
-msgstr ""
-
-msgid "Pipeline|Source|External"
-msgstr ""
-
-msgid "Pipeline|Source|External Pull Request"
-msgstr ""
-
-msgid "Pipeline|Source|Merge Request"
-msgstr ""
-
-msgid "Pipeline|Source|On-Demand DAST Scan"
-msgstr ""
-
-msgid "Pipeline|Source|On-Demand DAST Validation"
-msgstr ""
-
-msgid "Pipeline|Source|Parent Pipeline"
-msgstr ""
-
-msgid "Pipeline|Source|Pipeline"
-msgstr ""
-
-msgid "Pipeline|Source|Push"
-msgstr ""
-
-msgid "Pipeline|Source|Schedule"
-msgstr ""
-
-msgid "Pipeline|Source|Trigger"
-msgstr ""
-
-msgid "Pipeline|Source|Web"
-msgstr ""
-
-msgid "Pipeline|Source|Web IDE"
+msgid "Pipeline|Source|Security Policy"
msgstr ""
msgid "Pipeline|Specify variable values to be used in this run. The values specified in %{linkStart}CI/CD settings%{linkEnd} will be used by default."
@@ -25307,7 +25678,7 @@ msgstr ""
msgid "Pipeline|We are currently unable to fetch pipeline data"
msgstr ""
-msgid "Pipeline|You’re about to stop pipeline %{pipelineId}."
+msgid "Pipeline|You’re about to stop pipeline #%{pipelineId}."
msgstr ""
msgid "Pipeline|for"
@@ -25334,6 +25705,9 @@ msgstr ""
msgid "Plain diff"
msgstr ""
+msgid "Plain-text response to send to clients that hit a rate limit"
+msgstr ""
+
msgid "Plan:"
msgstr ""
@@ -25478,9 +25852,6 @@ msgstr ""
msgid "Please provide attributes to update"
msgstr ""
-msgid "Please provide your username or email address."
-msgstr ""
-
msgid "Please reach out if you have any questions and we'll be happy to assist."
msgstr ""
@@ -25523,9 +25894,6 @@ msgstr ""
msgid "Please set a new password before proceeding."
msgstr ""
-msgid "Please share your feedback about %{featureName} %{linkStart}in this issue%{linkEnd} to help us improve the experience."
-msgstr ""
-
msgid "Please solve the captcha"
msgstr ""
@@ -25703,6 +26071,9 @@ msgstr ""
msgid "Prevent adding new members to project membership within this group"
msgstr ""
+msgid "Prevent auto-stopping"
+msgstr ""
+
msgid "Prevent editing approval rules in projects and merge requests."
msgstr ""
@@ -25715,7 +26086,7 @@ msgstr ""
msgid "Prevent users from changing their profile name"
msgstr ""
-msgid "Prevent users from performing write operations on GitLab while performing maintenance."
+msgid "Prevent users from performing write operations while GitLab maintenance is in progress."
msgstr ""
msgid "Preview"
@@ -25988,6 +26359,9 @@ msgstr ""
msgid "Profiles|Enter your name, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Enter your password to confirm the email change"
+msgstr ""
+
msgid "Profiles|Enter your pronouns to let people know how to refer to you"
msgstr ""
@@ -26222,10 +26596,10 @@ msgstr ""
msgid "Profiles|e.g. My MacBook key"
msgstr ""
-msgid "Profiles|username"
+msgid "Profiles|https://website.com"
msgstr ""
-msgid "Profiles|website.com"
+msgid "Profiles|username"
msgstr ""
msgid "Profiles|your account"
@@ -26468,9 +26842,21 @@ msgstr ""
msgid "ProjectSelect| or group"
msgstr ""
+msgid "ProjectSelect|No matching results"
+msgstr ""
+
msgid "ProjectSelect|Search for project"
msgstr ""
+msgid "ProjectSelect|Search projects"
+msgstr ""
+
+msgid "ProjectSelect|Select a project"
+msgstr ""
+
+msgid "ProjectSelect|There was an error fetching the projects. Please try again."
+msgstr ""
+
msgid "ProjectService|Drone server URL"
msgstr ""
@@ -26558,6 +26944,9 @@ msgstr ""
msgid "ProjectService|Trigger event when a new, unique alert is recorded."
msgstr ""
+msgid "ProjectService|Trigger event when a new, unique vulnerability is recorded. (Note: This feature requires an Ultimate plan.)"
+msgstr ""
+
msgid "ProjectService|Trigger event when a pipeline status changes."
msgstr ""
@@ -26972,9 +27361,15 @@ msgstr ""
msgid "Projects are graded based on the highest severity vulnerability present"
msgstr ""
+msgid "Projects are organized into groups"
+msgstr ""
+
msgid "Projects contributed to"
msgstr ""
+msgid "Projects help you organize your work. They contain your file repository, issues, merge requests, and so much more."
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr ""
@@ -27209,10 +27604,10 @@ msgstr ""
msgid "PrometheusService|Prometheus cluster integration"
msgstr ""
-msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
+msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
msgstr ""
-msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
+msgid "PrometheusService|The ID of the IAP-secured resource."
msgstr ""
msgid "PrometheusService|The Prometheus API base URL."
@@ -27830,6 +28225,9 @@ msgstr ""
msgid "Rate limit"
msgstr ""
+msgid "Rate limits can help reduce request volume (like from crawlers or abusive bots)."
+msgstr ""
+
msgid "Raw blob request rate limit per minute"
msgstr ""
@@ -27842,6 +28240,9 @@ msgstr ""
msgid "Re-authentication required"
msgstr ""
+msgid "Re-import"
+msgstr ""
+
msgid "Re-request review"
msgstr ""
@@ -27863,6 +28264,9 @@ msgstr ""
msgid "Read more about related issues"
msgstr ""
+msgid "Read their documentation."
+msgstr ""
+
msgid "Ready to get started with GitLab? Follow these steps to set up your workspace, plan and commit changes, and deploy your project."
msgstr ""
@@ -27896,6 +28300,9 @@ msgstr ""
msgid "Receive any notifications from GitLab."
msgstr ""
+msgid "Receive notification of abuse reports by email."
+msgstr ""
+
msgid "Receive notifications about your own activity"
msgstr ""
@@ -28041,9 +28448,6 @@ msgstr ""
msgid "Registry setup"
msgstr ""
-msgid "Regulate approvals by authors/committers. Affects all projects."
-msgstr ""
-
msgid "Reindexing Status: %{status} (Slice multiplier: %{multiplier}, Maximum running slices: %{max_slices})"
msgstr ""
@@ -28141,6 +28545,9 @@ msgstr ""
msgid "Release|Something went wrong while saving the release details."
msgstr ""
+msgid "Reload page"
+msgstr ""
+
msgid "Remediations"
msgstr ""
@@ -28423,6 +28830,9 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
+msgid "Repeats"
+msgstr ""
+
msgid "Replace"
msgstr ""
@@ -28793,10 +29203,7 @@ msgstr ""
msgid "Require additional authentication for administrative tasks."
msgstr ""
-msgid "Require all users in this group to setup Two-factor authentication"
-msgstr ""
-
-msgid "Require all users in this group to setup two-factor authentication"
+msgid "Require all users in this group to set up two-factor authentication"
msgstr ""
msgid "Required approvals (%{approvals_given} given)"
@@ -28846,6 +29253,9 @@ msgstr[3] ""
msgid "Requires values to meet regular expression requirements."
msgstr ""
+msgid "Requires you to deploy or set up cloud-hosted Sentry."
+msgstr ""
+
msgid "Requires your primary GitLab email address."
msgstr ""
@@ -28906,9 +29316,6 @@ msgstr ""
msgid "Resolve"
msgstr ""
-msgid "Resolve all threads in new issue"
-msgstr ""
-
msgid "Resolve conflicts"
msgstr ""
@@ -28966,6 +29373,9 @@ msgstr ""
msgid "Response text"
msgstr ""
+msgid "Restart GitLab to apply changes."
+msgstr ""
+
msgid "Restart Terminal"
msgstr ""
@@ -28984,6 +29394,9 @@ msgstr ""
msgid "Restoring the project will prevent the project from being removed on this date and restore people's ability to make changes to it."
msgstr ""
+msgid "Restrict group access by IP address. %{link_start}Learn more%{link_end}."
+msgstr ""
+
msgid "Restrict membership by email domain"
msgstr ""
@@ -29301,6 +29714,9 @@ msgstr ""
msgid "Runners|Runner #%{runner_id}"
msgstr ""
+msgid "Runners|Runner assigned to project."
+msgstr ""
+
msgid "Runners|Runner is offline, last contact was %{runner_contact} ago"
msgstr ""
@@ -29313,6 +29729,9 @@ msgstr ""
msgid "Runners|Runner registration"
msgstr ""
+msgid "Runners|Runner unassigned from project."
+msgstr ""
+
msgid "Runners|Runners"
msgstr ""
@@ -29505,7 +29924,7 @@ msgstr ""
msgid "SastEntryPoints|How do I set up SAST?"
msgstr ""
-msgid "SastEntryPoints|Learn more."
+msgid "SastEntryPoints|Learn more"
msgstr ""
msgid "Satisfied"
@@ -29547,7 +29966,7 @@ msgstr ""
msgid "Save pipeline schedule"
msgstr ""
-msgid "Save space and find images in the container Registry. remove unneeded tags and keep only the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
+msgid "Save storage space by automatically deleting tags from the container registry and keeping the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
msgstr ""
msgid "Saving"
@@ -29721,6 +30140,9 @@ msgstr ""
msgid "Search or filter results…"
msgstr ""
+msgid "Search or jump to..."
+msgstr ""
+
msgid "Search project"
msgstr ""
@@ -29781,16 +30203,16 @@ msgstr ""
msgid "SearchCodeResults|of %{link_to_project}"
msgstr ""
-msgid "SearchResults|Showing %{count} %{scope} for%{term_element}"
+msgid "SearchResults|Showing %{count} %{scope} for %{term_element}"
msgstr ""
-msgid "SearchResults|Showing %{count} %{scope} for%{term_element} in your personal and project snippets"
+msgid "SearchResults|Showing %{count} %{scope} for %{term_element} in your personal and project snippets"
msgstr ""
-msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for%{term_element}"
+msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for %{term_element}"
msgstr ""
-msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for%{term_element} in your personal and project snippets"
+msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for %{term_element} in your personal and project snippets"
msgstr ""
msgid "SearchResults|code result"
@@ -29894,6 +30316,9 @@ msgstr ""
msgid "Secret Detection"
msgstr ""
+msgid "Secret access key"
+msgstr ""
+
msgid "Secret token"
msgstr ""
@@ -29933,9 +30358,6 @@ msgstr ""
msgid "SecurityApprovals|A merge request approval is required when the license compliance report contains a denied license."
msgstr ""
-msgid "SecurityApprovals|Configurable if security scanners are enabled. %{linkStart}Learn more.%{linkEnd}"
-msgstr ""
-
msgid "SecurityApprovals|Coverage-Check"
msgstr ""
@@ -29948,24 +30370,18 @@ msgstr ""
msgid "SecurityApprovals|Learn more about Vulnerability-Check"
msgstr ""
-msgid "SecurityApprovals|License Scanning must be enabled. %{linkStart}Learn more%{linkEnd}."
-msgstr ""
-
msgid "SecurityApprovals|License-Check"
msgstr ""
msgid "SecurityApprovals|Requires approval for Denied licenses. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}More information%{linkEnd}"
+msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "SecurityApprovals|Requires approval for vulnerabilities. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
-msgid "SecurityApprovals|Test coverage must be enabled. %{linkStart}Learn more%{linkEnd}."
-msgstr ""
-
msgid "SecurityApprovals|Vulnerability-Check"
msgstr ""
@@ -30029,6 +30445,12 @@ msgstr ""
msgid "SecurityConfiguration|Immediately begin risk analysis and remediation with application security features. Start with SAST and Secret Detection, available to all plans. Upgrade to Ultimate to get all features, including:"
msgstr ""
+msgid "SecurityConfiguration|Manage corpus"
+msgstr ""
+
+msgid "SecurityConfiguration|Manage corpus files used as mutation sources in coverage fuzzing."
+msgstr ""
+
msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
msgstr ""
@@ -30083,6 +30505,12 @@ msgstr ""
msgid "SecurityOrchestration|Action"
msgstr ""
+msgid "SecurityOrchestration|Actions"
+msgstr ""
+
+msgid "SecurityOrchestration|Add rule"
+msgstr ""
+
msgid "SecurityOrchestration|All policies"
msgstr ""
@@ -30116,9 +30544,6 @@ msgstr ""
msgid "SecurityOrchestration|Network"
msgstr ""
-msgid "SecurityOrchestration|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
-msgstr ""
-
msgid "SecurityOrchestration|New policy"
msgstr ""
@@ -30134,6 +30559,9 @@ msgstr ""
msgid "SecurityOrchestration|Policy editor"
msgstr ""
+msgid "SecurityOrchestration|Policy preview"
+msgstr ""
+
msgid "SecurityOrchestration|Policy status"
msgstr ""
@@ -30143,6 +30571,9 @@ msgstr ""
msgid "SecurityOrchestration|Rule"
msgstr ""
+msgid "SecurityOrchestration|Rules"
+msgstr ""
+
msgid "SecurityOrchestration|Scan Execution"
msgstr ""
@@ -30236,6 +30667,9 @@ msgstr ""
msgid "SecurityReports|Create issue"
msgstr ""
+msgid "SecurityReports|Development vulnerabilities"
+msgstr ""
+
msgid "SecurityReports|Dismiss vulnerability"
msgstr ""
@@ -30251,6 +30685,9 @@ msgstr ""
msgid "SecurityReports|Download results"
msgstr ""
+msgid "SecurityReports|Download scanned URLs"
+msgstr ""
+
msgid "SecurityReports|Download scanned resources"
msgstr ""
@@ -30374,6 +30811,9 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
+msgid "SecurityReports|The Vulnerability Report shows the results of the lastest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "SecurityReports|The security reports below contain one or more vulnerability findings that could not be parsed and were not recorded. Download the artifacts in the job output to investigate. Ensure any security report created conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
msgstr ""
@@ -30515,10 +30955,10 @@ msgstr ""
msgid "Select a repository"
msgstr ""
-msgid "Select a role"
+msgid "Select a repository containing templates for common files."
msgstr ""
-msgid "Select a shared template repository for all projects on this instance."
+msgid "Select a role"
msgstr ""
msgid "Select a template repository"
@@ -30596,6 +31036,9 @@ msgstr ""
msgid "Select project to choose zone"
msgstr ""
+msgid "Select project to create issue"
+msgstr ""
+
msgid "Select projects"
msgstr ""
@@ -30713,6 +31156,9 @@ msgstr ""
msgid "Send emails to help guide new users through the onboarding process."
msgstr ""
+msgid "Send emails to users upon account deactivation."
+msgstr ""
+
msgid "Send message"
msgstr ""
@@ -30731,6 +31177,9 @@ msgstr ""
msgid "Send service data"
msgstr ""
+msgid "Sentry"
+msgstr ""
+
msgid "Sentry API URL"
msgstr ""
@@ -30845,6 +31294,9 @@ msgstr ""
msgid "Service"
msgstr ""
+msgid "Service Accounts keys are required to authorize GitLab to deploy your Google Cloud project."
+msgstr ""
+
msgid "Service Desk"
msgstr ""
@@ -30917,15 +31369,15 @@ msgstr ""
msgid "Set a password on your account to pull or push via %{protocol}."
msgstr ""
-msgid "Set a template repository for projects in this group"
-msgstr ""
-
msgid "Set access permissions for this token."
msgstr ""
msgid "Set an instance-wide domain that will be available to all clusters when installing Knative."
msgstr ""
+msgid "Set any rate limit to %{code_open}0%{code_close} to disable the limit."
+msgstr ""
+
msgid "Set default and restrict visibility levels. Configure import sources and git access protocol."
msgstr ""
@@ -30938,7 +31390,7 @@ msgstr ""
msgid "Set limit to 0 to allow any file size."
msgstr ""
-msgid "Set max session time for web terminal."
+msgid "Set limits for web and API requests."
msgstr ""
msgid "Set milestone"
@@ -30947,15 +31399,18 @@ msgstr ""
msgid "Set new password"
msgstr ""
-msgid "Set notification email for abuse reports."
+msgid "Set parent epic to an epic"
msgstr ""
-msgid "Set parent epic to an epic"
+msgid "Set per-user rate limits for imports and exports of projects and groups."
msgstr ""
msgid "Set projects and maximum size limits, session duration, user options, and check feature availability for namespace plan."
msgstr ""
+msgid "Set rate limits for package registry API requests that supersede the general user and IP rate limits."
+msgstr ""
+
msgid "Set severity"
msgstr ""
@@ -30974,15 +31429,24 @@ msgstr ""
msgid "Set the default branch for this project. All merge requests and commits are made against this branch unless you specify a different one."
msgstr ""
+msgid "Set the default expiration time for job artifacts in all projects. Set to %{code_open}0%{code_close} to never expire artifacts by default. If no unit is written, it defaults to seconds. For example, these are all equivalent: %{code_open}3600%{code_close}, %{code_open}60 minutes%{code_close}, or %{code_open}one hour%{code_close}."
+msgstr ""
+
msgid "Set the due date to %{due_date}."
msgstr ""
msgid "Set the iteration to %{iteration_reference}."
msgstr ""
+msgid "Set the maximum session time for a web terminal."
+msgstr ""
+
msgid "Set the milestone to %{milestone_reference}."
msgstr ""
+msgid "Set the per-user rate limit for notes created by web or API requests."
+msgstr ""
+
msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
msgstr ""
@@ -31184,6 +31648,9 @@ msgstr ""
msgid "Show Pipeline IID"
msgstr ""
+msgid "Show all %{issuable_type}."
+msgstr ""
+
msgid "Show all activity"
msgstr ""
@@ -31235,15 +31702,9 @@ msgstr ""
msgid "Show list"
msgstr ""
-msgid "Show me advanced features"
-msgstr ""
-
msgid "Show me how to add a pipeline"
msgstr ""
-msgid "Show me the basics"
-msgstr ""
-
msgid "Show one file at a time"
msgstr ""
@@ -31288,15 +31749,15 @@ msgstr ""
msgid "Showing %{pageSize} of %{total} %{issuableType}"
msgstr ""
-msgid "Showing %{pageSize} of %{total} issues"
-msgstr ""
-
msgid "Showing all epics"
msgstr ""
msgid "Showing all issues"
msgstr ""
+msgid "Showing data for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
+msgstr ""
+
msgid "Showing data for workflow items created in this date range. Date range cannot exceed %{maxDateRange} days."
msgstr ""
@@ -31336,6 +31797,15 @@ msgstr ""
msgid "Sidebar|Weight"
msgstr ""
+msgid "Sidekiq job compression threshold (bytes)"
+msgstr ""
+
+msgid "Sidekiq job size limit (bytes)"
+msgstr ""
+
+msgid "Sidekiq job size limits"
+msgstr ""
+
msgid "Sign in"
msgstr ""
@@ -31456,6 +31926,9 @@ msgstr ""
msgid "Site profile not found for given parameters"
msgstr ""
+msgid "Sites"
+msgstr ""
+
msgid "Size"
msgstr ""
@@ -31486,19 +31959,22 @@ msgstr ""
msgid "SlackIntegration|Sends notifications about project events to Slack channels."
msgstr ""
-msgid "SlackService|2. Paste the %{strong_open}Token%{strong_close} into the field below"
+msgid "SlackService|1. %{slash_command_link_start}Add a slash command%{slash_command_link_end} in your Slack team using this information:"
msgstr ""
-msgid "SlackService|3. Select the %{strong_open}Active%{strong_close} checkbox, press %{strong_open}Save changes%{strong_close} and start using GitLab inside Slack!"
+msgid "SlackService|2. Paste the token from Slack in the %{strong_open}Token%{strong_close} field below."
msgstr ""
-msgid "SlackService|Fill in the word that works best for your team."
+msgid "SlackService|3. Select the %{strong_open}Active%{strong_close} checkbox, select %{strong_open}Save changes%{strong_close}, and start using slash commands in Slack!"
+msgstr ""
+
+msgid "SlackService|After setup, get a list of available Slack slash commands by entering"
msgstr ""
-msgid "SlackService|See list of available commands in Slack after setting up this service, by entering"
+msgid "SlackService|Fill in the word that works best for your team."
msgstr ""
-msgid "SlackService|This service allows users to perform common operations on this project by entering slash commands in Slack."
+msgid "SlackService|Perform common operations in this project by entering slash commands in Slack."
msgstr ""
msgid "Slice multiplier"
@@ -31564,7 +32040,7 @@ msgstr ""
msgid "Some child epics may be hidden due to applied filters"
msgstr ""
-msgid "Some common domains are not allowed. %{read_more_link}."
+msgid "Some common domains are not allowed. %{learn_more_link}."
msgstr ""
msgid "Some of the designs you tried uploading did not change:"
@@ -31648,9 +32124,6 @@ msgstr ""
msgid "Something went wrong while exporting requirements"
msgstr ""
-msgid "Something went wrong while fetching %{listType} list"
-msgstr ""
-
msgid "Something went wrong while fetching branches"
msgstr ""
@@ -31705,15 +32178,9 @@ msgstr ""
msgid "Something went wrong while merging this merge request. Please try again."
msgstr ""
-msgid "Something went wrong while moving issues."
-msgstr ""
-
msgid "Something went wrong while obtaining the Let's Encrypt certificate."
msgstr ""
-msgid "Something went wrong while performing the action."
-msgstr ""
-
msgid "Something went wrong while promoting the issue to an epic. Please try again."
msgstr ""
@@ -32041,7 +32508,10 @@ msgstr ""
msgid "SourcegraphPreferences|Uses a custom %{linkStart}Sourcegraph instance%{linkEnd}."
msgstr ""
-msgid "Spam Check API Key"
+msgid "Spam Check"
+msgstr ""
+
+msgid "Spam Check API key"
msgstr ""
msgid "Spam Logs"
@@ -32059,7 +32529,7 @@ msgstr ""
msgid "Specified URL cannot be used: \"%{reason}\""
msgstr ""
-msgid "Specify an e-mail address regex pattern to identify default internal users."
+msgid "Specify an email address regex pattern to identify default internal users."
msgstr ""
msgid "Speed up your pipelines with Needs relationships"
@@ -32314,7 +32784,7 @@ msgstr ""
msgid "StatusCheck|An error occurred fetching the status checks."
msgstr ""
-msgid "StatusCheck|Apply this status check to any branch or a specific protected branch."
+msgid "StatusCheck|Apply this status check to all branches or a specific protected branch."
msgstr ""
msgid "StatusCheck|Check for a status response in Merge Requests. Failures do not block merges. %{link_start}Learn more%{link_end}."
@@ -32653,6 +33123,9 @@ msgstr ""
msgid "Subscriptions"
msgstr ""
+msgid "Subscription|Your subscription for %{strong}%{namespace_name}%{strong_close} has expired and you are now on %{pricing_link_start}the GitLab Free tier%{pricing_link_end}. Don't worry, your data is safe. Get in touch with our support team (%{support_email}). They'll gladly help with your subscription renewal."
+msgstr ""
+
msgid "Subtracted"
msgstr ""
@@ -32881,6 +33354,9 @@ msgstr ""
msgid "SuperSonics|Plan"
msgstr ""
+msgid "SuperSonics|Please agree to the Subscription Agreement"
+msgstr ""
+
msgid "SuperSonics|Ready to get started? A GitLab plan is ideal for scaling organizations and for multi team usage."
msgstr ""
@@ -32911,6 +33387,9 @@ msgstr ""
msgid "SuperSonics|The activation code is not valid. Please make sure to copy it exactly from the Customers Portal or confirmation email. Learn more about %{linkStart}activating your subscription%{linkEnd}."
msgstr ""
+msgid "SuperSonics|The activation code should be a 24-character alphanumeric string"
+msgstr ""
+
msgid "SuperSonics|There is a connectivity issue."
msgstr ""
@@ -32953,9 +33432,15 @@ msgstr ""
msgid "SuperSonics|You do not have an active subscription"
msgstr ""
+msgid "SuperSonics|You have successfully added a license that activates on %{date}. Please see the subscription history table below for more details."
+msgstr ""
+
msgid "SuperSonics|You'll be charged for %{trueUpLinkStart}users over license%{trueUpLinkEnd} on a quarterly or annual basis, depending on the terms of your agreement."
msgstr ""
+msgid "SuperSonics|Your future dated license was successfully added"
+msgstr ""
+
msgid "SuperSonics|Your subscription"
msgstr ""
@@ -33208,7 +33693,7 @@ msgstr ""
msgid "Template to append to all Service Desk issues"
msgstr ""
-msgid "TemplateRepository|Select a repository to make its templates available to all projects. %{link_start}What should the repository contain?%{link_end} "
+msgid "TemplateRepository|Create common files more quickly, and standardize their format."
msgstr ""
msgid "Templates"
@@ -33422,7 +33907,7 @@ msgstr ""
msgid "TestCases|Search test cases"
msgstr ""
-msgid "TestCases|Something went wrong while adding test case to Todo."
+msgid "TestCases|Something went wrong while adding test case to a to-do item."
msgstr ""
msgid "TestCases|Something went wrong while creating a test case."
@@ -33434,7 +33919,7 @@ msgstr ""
msgid "TestCases|Something went wrong while fetching test cases list."
msgstr ""
-msgid "TestCases|Something went wrong while marking test case todo as done."
+msgid "TestCases|Something went wrong while marking test case to-do item as done."
msgstr ""
msgid "TestCases|Something went wrong while moving test case."
@@ -33554,7 +34039,7 @@ msgstr ""
msgid "Thanks for your purchase!"
msgstr ""
-msgid "That is ok, I do not want to renew"
+msgid "That's OK, I don't want to renew"
msgstr ""
msgid "That's it, well done!"
@@ -33579,7 +34064,7 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-msgid "The API key used by GitLab for accessing the Spam Check service endpoint"
+msgid "The API key used by GitLab for accessing the Spam Check service endpoint."
msgstr ""
msgid "The GitLab subscription service (customers.gitlab.com) is currently experiencing an outage. You can monitor the status and get updates at %{linkStart}status.gitlab.com%{linkEnd}."
@@ -33618,9 +34103,6 @@ msgstr ""
msgid "The URL to use for connecting to Elasticsearch. Use a comma-separated list to support clustering (e.g., \"http://localhost:9200, http://localhost:9201\")."
msgstr ""
-msgid "The Vulnerability Report shows the results of the last successful pipeline run on the default branch."
-msgstr ""
-
msgid "The X509 Certificate to use when mutual TLS is required to communicate with the external authorization service. If left blank, the server certificate is still validated when accessing over HTTPS."
msgstr ""
@@ -33678,9 +34160,6 @@ msgstr ""
msgid "The default branch for this project has been changed. Please update your bookmarks."
msgstr ""
-msgid "The default expiration time for job artifacts. 0 for unlimited. The default unit is in seconds, but you can use other units, for example %{code_open}4 mins 2 sec%{code_close}, %{code_open}2h42min%{code_close}."
-msgstr ""
-
msgid "The dependency list details information about the components used within your project."
msgstr ""
@@ -33874,9 +34353,6 @@ msgstr ""
msgid "The merge conflicts for this merge request have already been resolved. Please return to the merge request."
msgstr ""
-msgid "The merge request can now be merged."
-msgstr ""
-
msgid "The metric must be one of %{metrics}."
msgstr ""
@@ -34252,7 +34728,7 @@ msgstr ""
msgid "There was a problem updating the keep latest artifacts setting."
msgstr ""
-msgid "There was an error %{message} todo."
+msgid "There was an error %{message} to-do item."
msgstr ""
msgid "There was an error adding a To Do."
@@ -34291,6 +34767,9 @@ msgstr ""
msgid "There was an error fetching projects"
msgstr ""
+msgid "There was an error fetching search autocomplete suggestions"
+msgstr ""
+
msgid "There was an error fetching stage total counts"
msgstr ""
@@ -34615,6 +35094,9 @@ msgstr ""
msgid "This field is required."
msgstr ""
+msgid "This form is disabled in preview"
+msgstr ""
+
msgid "This group"
msgstr ""
@@ -34636,9 +35118,6 @@ msgstr ""
msgid "This group is linked to a subscription"
msgstr ""
-msgid "This group, including all subgroups, projects and git repositories, will be reachable from only the specified IP address ranges."
-msgstr ""
-
msgid "This group, its subgroups and projects has been scheduled for removal on %{date}."
msgstr ""
@@ -34918,9 +35397,6 @@ msgstr ""
msgid "This user cannot be unlocked manually from GitLab"
msgstr ""
-msgid "This user does not have a pending request"
-msgstr ""
-
msgid "This user has an unconfirmed email address (%{email}). You may force a confirmation."
msgstr ""
@@ -35029,9 +35505,6 @@ msgstr ""
msgid "ThreatMonitoring|Packet Activity"
msgstr ""
-msgid "ThreatMonitoring|Policies"
-msgstr ""
-
msgid "ThreatMonitoring|Requests"
msgstr ""
@@ -35083,6 +35556,12 @@ msgstr ""
msgid "ThreatMonitoring|View documentation"
msgstr ""
+msgid "Threshold in bytes at which to compress Sidekiq job arguments."
+msgstr ""
+
+msgid "Threshold in bytes at which to reject Sidekiq jobs. Set this to 0 to if you don't want to limit Sidekiq jobs."
+msgstr ""
+
msgid "Throughput"
msgstr ""
@@ -35092,6 +35571,9 @@ msgstr ""
msgid "Time"
msgstr ""
+msgid "Time (in hours) that users are allowed to skip forced configuration of two-factor authentication."
+msgstr ""
+
msgid "Time Spent"
msgstr ""
@@ -35158,7 +35640,7 @@ msgstr ""
msgid "TimeTrackingEstimated|Est"
msgstr ""
-msgid "TimeTracking|%{startTag}Spent: %{endTag}%{timeSpentHumanReadable}"
+msgid "TimeTracking|%{spentStart}Spent: %{spentEnd}"
msgstr ""
msgid "TimeTracking|Estimated:"
@@ -35376,6 +35858,9 @@ msgstr ""
msgid "To access this domain create a new DNS record"
msgstr ""
+msgid "To add a custom suffix, set up a Service Desk email address. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "To add an SSH key you need to %{generate_link_start}generate one%{link_end} or use an %{existing_link_start}existing key%{link_end}."
msgstr ""
@@ -35397,13 +35882,16 @@ msgstr ""
msgid "To connect an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To continue using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
+msgstr ""
+
msgid "To continue, you need to select the link in the confirmation email we sent to verify your email address. If you didn't get our email, select %{strongStart}Resend confirmation email.%{strongEnd}"
msgstr ""
msgid "To define internal users, first enable new users set to external"
msgstr ""
-msgid "To enable Registration Features, make sure \"Enable service ping\" is checked."
+msgid "To enable Registration Features, first enable Service Ping."
msgstr ""
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
@@ -35430,7 +35918,7 @@ msgstr ""
msgid "To get started, use the link below to confirm your account."
msgstr ""
-msgid "To help improve GitLab and its user experience, GitLab will periodically collect usage information."
+msgid "To help improve GitLab and its user experience, GitLab periodically collects usage information."
msgstr ""
msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
@@ -35463,7 +35951,7 @@ msgstr ""
msgid "To preserve performance only %{strong_open}%{display_size} of %{real_size}%{strong_close} files are displayed."
msgstr ""
-msgid "To protect this issue's confidentiality, %{forkLink} and set the fork's visibility to private."
+msgid "To protect this issue's confidentiality, %{linkStart}fork this project%{linkEnd} and set the fork's visibility to private."
msgstr ""
msgid "To protect this issue's confidentiality, a private fork of this project was selected."
@@ -35496,12 +35984,15 @@ msgstr ""
msgid "To set up SAML authentication for your group through an identity provider like Azure, Okta, Onelogin, Ping Identity, or your custom SAML 2.0 provider:"
msgstr ""
-msgid "To set up this service:"
+msgid "To set up this integration:"
msgstr ""
msgid "To specify the notification level per project of a group you belong to, you need to visit project page and change notification level there."
msgstr ""
+msgid "To start using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
+msgstr ""
+
msgid "To unsubscribe from this issue, please paste the following link into your browser:"
msgstr ""
@@ -36091,9 +36582,6 @@ msgstr ""
msgid "Unable to fetch branches list, please close the form and try again"
msgstr ""
-msgid "Unable to fetch unscanned projects"
-msgstr ""
-
msgid "Unable to fetch vulnerable projects"
msgstr ""
@@ -36148,6 +36636,15 @@ msgstr ""
msgid "Unable to update this issue at this time."
msgstr ""
+msgid "Unapprove a merge request"
+msgstr ""
+
+msgid "Unapprove the current merge request."
+msgstr ""
+
+msgid "Unapproved the current merge request."
+msgstr ""
+
msgid "Unarchive project"
msgstr ""
@@ -36160,16 +36657,13 @@ msgstr ""
msgid "Unassigned"
msgstr ""
-msgid "Unauthenticated API request rate limit"
-msgstr ""
-
-msgid "Unauthenticated rate limit period in seconds"
+msgid "Unauthenticated API rate limit period in seconds"
msgstr ""
-msgid "Unauthenticated request rate limit"
+msgid "Unauthenticated requests"
msgstr ""
-msgid "Unauthenticated requests"
+msgid "Unauthenticated web rate limit period in seconds"
msgstr ""
msgid "Undo"
@@ -36271,18 +36765,6 @@ msgstr ""
msgid "Unresolved"
msgstr ""
-msgid "UnscannedProjects|15 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|30 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|5 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|60 or more days"
-msgstr ""
-
msgid "Unschedule job"
msgstr ""
@@ -36502,6 +36984,9 @@ msgstr ""
msgid "UsageQuota|%{help_link_start}Shared runners%{help_link_end} are disabled, so there are no limits set on pipeline usage"
msgstr ""
+msgid "UsageQuota|%{linkTitle} help link"
+msgstr ""
+
msgid "UsageQuota|%{percentageLeft} of purchased storage is available"
msgstr ""
@@ -36511,6 +36996,9 @@ msgstr ""
msgid "UsageQuota|Artifacts is a sum of build and pipeline artifacts."
msgstr ""
+msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
+msgstr ""
+
msgid "UsageQuota|Buy additional minutes"
msgstr ""
@@ -36520,9 +37008,21 @@ msgstr ""
msgid "UsageQuota|CI minutes usage by project"
msgstr ""
+msgid "UsageQuota|Code packages and container images."
+msgstr ""
+
msgid "UsageQuota|Current period usage"
msgstr ""
+msgid "UsageQuota|File attachments and smaller design graphics."
+msgstr ""
+
+msgid "UsageQuota|Git repository, managed by the Gitaly service."
+msgstr ""
+
+msgid "UsageQuota|Includes project registry, artifacts, packages, wiki, uploads and other items."
+msgstr ""
+
msgid "UsageQuota|Increase storage temporarily"
msgstr ""
@@ -36541,6 +37041,9 @@ msgstr ""
msgid "UsageQuota|Packages"
msgstr ""
+msgid "UsageQuota|Pipeline artifacts and job artifacts, created with CI/CD."
+msgstr ""
+
msgid "UsageQuota|Pipelines"
msgstr ""
@@ -36559,6 +37062,9 @@ msgstr ""
msgid "UsageQuota|Seats"
msgstr ""
+msgid "UsageQuota|Shared bits of code and text."
+msgstr ""
+
msgid "UsageQuota|Snippets"
msgstr ""
@@ -36568,6 +37074,12 @@ msgstr ""
msgid "UsageQuota|Storage"
msgstr ""
+msgid "UsageQuota|Storage type"
+msgstr ""
+
+msgid "UsageQuota|There is a known issue with Artifact storage where the total could be incorrect for some projects. More details and progress are available in %{warningLinkStart}the epic%{warningLinkEnd}."
+msgstr ""
+
msgid "UsageQuota|This is the total amount of storage used across your projects within this namespace."
msgstr ""
@@ -36607,6 +37119,9 @@ msgstr ""
msgid "UsageQuota|Usage"
msgstr ""
+msgid "UsageQuota|Usage Breakdown"
+msgstr ""
+
msgid "UsageQuota|Usage Quotas"
msgstr ""
@@ -36631,6 +37146,9 @@ msgstr ""
msgid "UsageQuota|Wiki"
msgstr ""
+msgid "UsageQuota|Wiki content."
+msgstr ""
+
msgid "UsageQuota|Wikis"
msgstr ""
@@ -36847,7 +37365,10 @@ msgstr ""
msgid "User Settings"
msgstr ""
-msgid "User and IP Rate Limits"
+msgid "User and IP rate limits"
+msgstr ""
+
+msgid "User does not have a pending request"
msgstr ""
msgid "User identity was successfully created."
@@ -37144,6 +37665,9 @@ msgstr ""
msgid "Users can launch a development environment from a GitLab browser tab when the %{linkStart}Gitpod%{linkEnd} integration is enabled."
msgstr ""
+msgid "Users can reactivate their account by signing in."
+msgstr ""
+
msgid "Users can render diagrams in AsciiDoc, Markdown, reStructuredText, and Textile documents using Kroki."
msgstr ""
@@ -37159,6 +37683,9 @@ msgstr ""
msgid "Users requesting access to"
msgstr ""
+msgid "Users to exclude from the rate limit"
+msgstr ""
+
msgid "Users were successfully added."
msgstr ""
@@ -37180,6 +37707,9 @@ msgstr ""
msgid "UsersSelect|Unassigned"
msgstr ""
+msgid "Uses GitLab as a lightweight alternative to Sentry."
+msgstr ""
+
msgid "Using %{code_start}::%{code_end} denotes a %{link_start}scoped label set%{link_end}"
msgstr ""
@@ -37210,10 +37740,7 @@ msgstr ""
msgid "Value Stream Analytics can help you determine your team’s velocity"
msgstr ""
-msgid "Value Stream Analytics gives an overview of how much time it takes to go from idea to production in your project."
-msgstr ""
-
-msgid "Value may contain a variable reference"
+msgid "Value might contain a variable reference"
msgstr ""
msgid "Value stream"
@@ -37279,10 +37806,10 @@ msgstr ""
msgid "ValueStream|The Default Value Stream cannot be deleted"
msgstr ""
-msgid "Variable"
+msgid "Values that contain the %{codeStart}$%{codeEnd} character can be considered a variable reference and expanded. %{docsLinkStart}Learn more.%{docsLinkEnd}"
msgstr ""
-msgid "Variable references indicated by %{codeStart}$%{codeEnd} may be expanded. If this is not what you want, consider %{docsLinkStart}using a workaround to prevent expansion%{docsLinkEnd}."
+msgid "Variable"
msgstr ""
msgid "Variable will be masked in job logs."
@@ -37693,6 +38220,9 @@ msgstr ""
msgid "Vulnerability|Evidence"
msgstr ""
+msgid "Vulnerability|False positive detected"
+msgstr ""
+
msgid "Vulnerability|File"
msgstr ""
@@ -37735,6 +38265,9 @@ msgstr ""
msgid "Vulnerability|Status"
msgstr ""
+msgid "Vulnerability|The scanner determined this vulnerability to be a false positive. Verify the evaluation before changing its status. %{linkStart}Learn more about false positive detection.%{linkEnd}"
+msgstr ""
+
msgid "Vulnerability|The unmodified response is the original response that had no mutations done to the request"
msgstr ""
@@ -38059,9 +38592,6 @@ msgstr ""
msgid "Welcome to GitLab,%{br_tag}%{name}!"
msgstr ""
-msgid "Welcome to the guided GitLab tour"
-msgstr ""
-
msgid "Welcome, %{name}!"
msgstr ""
@@ -38080,9 +38610,6 @@ msgstr ""
msgid "What are you searching for?"
msgstr ""
-msgid "What describes you best?"
-msgstr ""
-
msgid "What does this command do?"
msgstr ""
@@ -38104,13 +38631,13 @@ msgstr ""
msgid "What is your job title? (optional)"
msgstr ""
-msgid "What will you use this group for?"
+msgid "What templates can I create?"
msgstr ""
-msgid "What's new"
+msgid "What will you use this group for?"
msgstr ""
-msgid "What’s your experience level?"
+msgid "What's new"
msgstr ""
msgid "When a deployment job is successful, skip older deployment jobs that are still pending."
@@ -38122,6 +38649,9 @@ msgstr ""
msgid "When an event in GitLab triggers a webhook, you can use the request details to figure out if something went wrong."
msgstr ""
+msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+msgstr ""
+
msgid "When inactive, an external authentication provider must be used."
msgstr ""
@@ -38147,6 +38677,9 @@ msgstr ""
msgid "When:"
msgstr ""
+msgid "Which API requests are affected?"
+msgstr ""
+
msgid "While it's rare to have no vulnerabilities, it can happen. In any event, we ask that you please double check your settings to make sure you've set up your dashboard correctly."
msgstr ""
@@ -38426,6 +38959,9 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|Work Items"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -38501,6 +39037,9 @@ msgstr ""
msgid "You are already a member of this %{member_source}."
msgstr ""
+msgid "You are already impersonating another user"
+msgstr ""
+
msgid "You are an admin, which means granting access to %{client_name} will allow them to interact with GitLab as an admin as well. Proceed with caution."
msgstr ""
@@ -38603,6 +39142,9 @@ msgstr ""
msgid "You can also use project access tokens with Git to authenticate over HTTP(S). %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "You can always change your URL later"
+msgstr ""
+
msgid "You can always edit this later"
msgstr ""
@@ -38759,10 +39301,10 @@ msgstr ""
msgid "You can’t %{tag_start}edit%{tag_end} files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
-msgid "You could not create a new trigger."
+msgid "You can’t edit files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
-msgid "You didn't renew your subscription for %{strong}%{namespace_name}%{strong_close} so it was downgraded to the free plan."
+msgid "You could not create a new trigger."
msgstr ""
msgid "You do not have any subscriptions yet"
@@ -38930,6 +39472,12 @@ msgstr ""
msgid "You must provide your current password in order to change it."
msgstr ""
+msgid "You must sign in to search for specific projects."
+msgstr ""
+
+msgid "You must sign in to search for specific terms."
+msgstr ""
+
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
@@ -38957,6 +39505,9 @@ msgstr ""
msgid "You need to upload a GitLab project export archive (ending in .gz)."
msgstr ""
+msgid "You need to verify your primary email first before enabling Two-Factor Authentication."
+msgstr ""
+
msgid "You successfully declined the invitation"
msgstr ""
@@ -39065,10 +39616,10 @@ msgstr ""
msgid "Your %{host} account was signed in to from a new location"
msgstr ""
-msgid "Your %{strong}%{plan_name}%{strong_close} subscription for %{strong}%{namespace_name}%{strong_close} will expire on %{strong}%{expires_on}%{strong_close}."
+msgid "Your %{strong}%{plan_name}%{strong_close} subscription expires on %{strong}%{expires_on}%{strong_close}. After that date, you cannot create issues or merge requests, or use many other features."
msgstr ""
-msgid "Your %{strong}%{plan_name}%{strong_close} subscription will expire on %{strong}%{expires_on}%{strong_close}. After that, you will not be able to create issues or merge requests as well as many other features."
+msgid "Your %{strong}%{plan_name}%{strong_close} subscription for %{strong}%{namespace_name}%{strong_close} will expire on %{strong}%{expires_on}%{strong_close}."
msgstr ""
msgid "Your CI/CD configuration syntax is invalid. View Lint tab for more details."
@@ -39092,7 +39643,7 @@ msgstr ""
msgid "Your GPG keys (%{count})"
msgstr ""
-msgid "Your GitLab account has been locked due to an excessive amount of unsuccessful sign in attempts. Your account will automatically unlock in %{duration} or you may click the link below to unlock now."
+msgid "Your GitLab account has been locked due to an excessive number of unsuccessful sign in attempts. You can wait for your account to automatically unlock in %{duration} or you can click the link below to unlock now."
msgstr ""
msgid "Your GitLab account request has been approved!"
@@ -39203,6 +39754,9 @@ msgstr ""
msgid "Your commit email is used for web based operations, such as edits and merges."
msgstr ""
+msgid "Your current password is required to register a two-factor authenticator app."
+msgstr ""
+
msgid "Your dashboard has been copied. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
@@ -39302,6 +39856,9 @@ msgstr ""
msgid "Your project limit is %{limit} projects! Please contact your administrator to increase it"
msgstr ""
+msgid "Your project will be created at:"
+msgstr ""
+
msgid "Your projects"
msgstr ""
@@ -39341,11 +39898,12 @@ msgstr ""
msgid "Your subscription expired!"
msgstr ""
-msgid "Your subscription has been downgraded."
-msgstr ""
-
-msgid "Your subscription will expire in %{remaining_days}."
-msgstr ""
+msgid "Your subscription will expire in %{remaining_days} day."
+msgid_plural "Your subscription will expire in %{remaining_days} days."
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
msgid "Your username is %{username}."
msgstr ""
@@ -39556,6 +40114,9 @@ msgstr ""
msgid "cannot merge"
msgstr ""
+msgid "cannot not be used for user namespace"
+msgstr ""
+
msgid "ciReport|%{degradedNum} degraded"
msgstr ""
@@ -39881,6 +40442,9 @@ msgstr ""
msgid "created %{timeAgo}"
msgstr ""
+msgid "created %{timeAgo} by %{author}"
+msgstr ""
+
msgid "created by"
msgstr ""
@@ -39927,9 +40491,6 @@ msgstr ""
msgid "does not have a supported extension. Only %{extension_list} are supported"
msgstr ""
-msgid "domain is not authorized for sign-up."
-msgstr ""
-
msgid "download it"
msgstr ""
@@ -39949,20 +40510,13 @@ msgstr ""
msgid "email '%{email}' is not a verified email."
msgstr ""
-msgid "email does not match the allowed domain of %{email_domains}"
-msgid_plural "email does not match the allowed domains: %{email_domains}"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
-
msgid "enabled"
msgstr ""
msgid "encrypted: needs to be a :required, :optional or :migrating!"
msgstr ""
-msgid "ending with MIME type format is not allowed."
+msgid "ending with a reserved file extension is not allowed."
msgstr ""
msgid "entries cannot be larger than 255 characters"
@@ -39986,6 +40540,9 @@ msgstr ""
msgid "estimateCommand|%{slash_command} overwrites the total estimated time."
msgstr ""
+msgid "example.com"
+msgstr ""
+
msgid "exceeds the limit of %{bytes} bytes"
msgstr ""
@@ -40038,9 +40595,6 @@ msgstr ""
msgid "fork"
msgstr ""
-msgid "fork this project"
-msgstr ""
-
msgid "from"
msgstr ""
@@ -40051,6 +40605,9 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "frontmatter"
+msgstr ""
+
msgid "group"
msgstr ""
@@ -40078,6 +40635,9 @@ msgstr ""
msgid "has been completed."
msgstr ""
+msgid "has too deep level of nesting"
+msgstr ""
+
msgid "help"
msgstr ""
@@ -40111,9 +40671,21 @@ msgstr ""
msgid "in"
msgstr ""
+msgid "in Infrastructure :: Kubernetes clusters"
+msgstr ""
+
+msgid "in all GitLab"
+msgstr ""
+
+msgid "in group"
+msgstr ""
+
msgid "in group %{link_to_group}"
msgstr ""
+msgid "in project"
+msgstr ""
+
msgid "in project %{link_to_project}"
msgstr ""
@@ -40157,16 +40729,19 @@ msgstr ""
msgid "is not a valid X509 certificate."
msgstr ""
-msgid "is not allowed since the group is not top-level group."
+msgid "is not allowed for sign-up."
msgstr ""
-msgid "is not allowed. Try again with a different email address, or contact your GitLab admin."
+msgid "is not allowed for this group."
msgstr ""
-msgid "is not allowed. We do not currently support project-level iterations"
+msgid "is not allowed for this project."
msgstr ""
-msgid "is not from an allowed domain."
+msgid "is not allowed since the group is not top-level group."
+msgstr ""
+
+msgid "is not allowed. We do not currently support project-level iterations"
msgstr ""
msgid "is not in the group enforcing Group Managed Account"
@@ -40259,6 +40834,9 @@ msgstr ""
msgid "log in"
msgstr ""
+msgid "managed"
+msgstr ""
+
msgid "manual"
msgstr ""
@@ -40308,6 +40886,9 @@ msgstr ""
msgid "mrWidget| Please restore it or use a different %{missingBranchName} branch"
msgstr ""
+msgid "mrWidget|%{linkStart}Set up now%{linkEnd} to analyze your source code for known security vulnerabilities."
+msgstr ""
+
msgid "mrWidget|%{mergeError}."
msgstr ""
@@ -40390,6 +40971,9 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "mrWidget|Create issue to resolve all threads"
+msgstr ""
+
msgid "mrWidget|Delete source branch"
msgstr ""
@@ -40399,12 +40983,18 @@ msgstr ""
msgid "mrWidget|Did not close"
msgstr ""
+msgid "mrWidget|Dismiss"
+msgstr ""
+
msgid "mrWidget|Email patches"
msgstr ""
msgid "mrWidget|Failed to load deployment statistics"
msgstr ""
+msgid "mrWidget|Hide %{widget} details"
+msgstr ""
+
msgid "mrWidget|If the %{missingBranchName} branch exists in your local repository, you can merge this merge request manually using the command line"
msgstr ""
@@ -40502,9 +41092,6 @@ msgstr ""
msgid "mrWidget|Request to merge"
msgstr ""
-msgid "mrWidget|Resolve all threads in new issue"
-msgstr ""
-
msgid "mrWidget|Resolve conflicts"
msgstr ""
@@ -40520,6 +41107,9 @@ msgstr ""
msgid "mrWidget|Revoke approval"
msgstr ""
+msgid "mrWidget|SAST and Secret Detection is not enabled."
+msgstr ""
+
msgid "mrWidget|Set by %{merge_author} to be added to the merge train when the pipeline succeeds"
msgstr ""
@@ -40529,6 +41119,9 @@ msgstr ""
msgid "mrWidget|Set by %{merge_author} to start a merge train when the pipeline succeeds"
msgstr ""
+msgid "mrWidget|Show %{widget} details"
+msgstr ""
+
msgid "mrWidget|The changes were merged into"
msgstr ""
@@ -40541,6 +41134,9 @@ msgstr ""
msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure, or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
msgstr ""
+msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure."
+msgstr ""
+
msgid "mrWidget|The source branch has been deleted"
msgstr ""
@@ -40583,6 +41179,9 @@ msgstr ""
msgid "mrWidget|You can merge after removing denied licenses"
msgstr ""
+msgid "mrWidget|You can only merge once this merge request is approved."
+msgstr ""
+
msgid "mrWidget|Your password"
msgstr ""
@@ -40619,6 +41218,9 @@ msgstr ""
msgid "must be less than the limit of %{tag_limit} tags"
msgstr ""
+msgid "must be set for a project namespace"
+msgstr ""
+
msgid "must be unique by status and elapsed time within a policy"
msgstr ""
@@ -40732,6 +41334,9 @@ msgstr ""
msgid "pipeline"
msgstr ""
+msgid "pipeline schedules documentation"
+msgstr ""
+
msgid "pod_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
msgstr ""
@@ -40785,16 +41390,25 @@ msgstr ""
msgid "project name"
msgstr ""
+msgid "project namespace cannot be the parent of another namespace"
+msgstr ""
+
msgid "projects"
msgstr ""
msgid "quick actions"
msgstr ""
-msgid "reCAPTCHA Private Key"
+msgid "reCAPTCHA"
+msgstr ""
+
+msgid "reCAPTCHA helps prevent credential stuffing."
msgstr ""
-msgid "reCAPTCHA Site Key"
+msgid "reCAPTCHA private key"
+msgstr ""
+
+msgid "reCAPTCHA site key"
msgstr ""
msgid "recent activity"
@@ -41023,6 +41637,9 @@ msgstr ""
msgid "user avatar"
msgstr ""
+msgid "user namespace cannot be the parent of another namespace"
+msgstr ""
+
msgid "user preferences"
msgstr ""
@@ -41117,3 +41734,9 @@ msgstr ""
msgid "your settings"
msgstr ""
+msgid "{group}"
+msgstr ""
+
+msgid "{project}"
+msgstr ""
+
diff --git a/locale/mk_MK/gitlab.po b/locale/mk_MK/gitlab.po
index 62aeda6d842..d541dd58609 100644
--- a/locale/mk_MK/gitlab.po
+++ b/locale/mk_MK/gitlab.po
@@ -14,10 +14,7 @@ msgstr ""
"X-Crowdin-Language: mk\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-09-01 22:33\n"
-
-msgid " %{name}, confirm your email address now! "
-msgstr ""
+"PO-Revision-Date: 2021-10-04 20:21\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -92,6 +89,16 @@ msgstr ""
msgid "#general, #development"
msgstr ""
+msgid "%d Alert"
+msgid_plural "%d Alerts"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d Alert:"
+msgid_plural "%d Alerts:"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d Approval"
msgid_plural "%d Approvals"
msgstr[0] ""
@@ -455,7 +462,10 @@ msgstr ""
msgid "%{code_open}Protected:%{code_close} Only exposed to protected branches or tags."
msgstr ""
-msgid "%{commit_author_link} authored %{commit_timeago}"
+msgid "%{commit_author_link} authored %{commit_authored_timeago}"
+msgstr ""
+
+msgid "%{commit_author_link} authored %{commit_authored_timeago} and %{commit_committer_avatar} %{commit_committer_link} committed %{commit_committer_timeago}"
msgstr ""
msgid "%{completedCount} completed weight"
@@ -549,6 +559,15 @@ msgstr ""
msgid "%{doc_link_start}Advanced search%{doc_link_end} is enabled."
msgstr ""
+msgid "%{docs_link_start}Learn about visibility levels.%{docs_link_end}"
+msgstr ""
+
+msgid "%{docs_link_start}What is Large File Storage?%{docs_link_end}"
+msgstr ""
+
+msgid "%{docs_link_start}What is two-factor authentication?%{docs_link_end}"
+msgstr ""
+
msgid "%{due_date} (Past due)"
msgstr ""
@@ -621,9 +640,6 @@ msgstr ""
msgid "%{issueType} actions"
msgstr ""
-msgid "%{issuesCount} issues with a limit of %{maxIssueCount}"
-msgstr ""
-
msgid "%{issuesSize} with a limit of %{maxIssueCount}"
msgstr ""
@@ -681,6 +697,12 @@ msgstr ""
msgid "%{label_for_message} unavailable"
msgstr ""
+msgid "%{learn_more_link}."
+msgstr ""
+
+msgid "%{lessThan} 1 hour"
+msgstr ""
+
msgid "%{lets_encrypt_link_start}Let's Encrypt%{lets_encrypt_link_end} is a free, automated, and open certificate authority (CA) that issues digital certificates to enable HTTPS (SSL/TLS) for sites."
msgstr ""
@@ -693,15 +715,15 @@ msgstr ""
msgid "%{link_start}Learn more%{link_end} about roles."
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
-msgstr ""
-
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
msgstr ""
msgid "%{link_start}Start the title with %{draft_snippet}%{link_end} to prevent a merge request that is a work in progress from being merged before it's ready."
msgstr ""
+msgid "%{link_start}What information does GitLab Inc. collect?%{link_end}"
+msgstr ""
+
msgid "%{listToShow}, and %{awardsListLength} more"
msgstr ""
@@ -854,7 +876,7 @@ msgid_plural "%{securityScanner} results are not available because a pipeline ha
msgstr[0] ""
msgstr[1] ""
-msgid "%{service_ping_link_start}Learn more%{service_ping_link_end} about what information is shared with GitLab Inc."
+msgid "%{service_ping_link_start}What information is shared with GitLab Inc.?%{service_ping_link_end}"
msgstr ""
msgid "%{size} %{unit}"
@@ -890,6 +912,9 @@ msgstr ""
msgid "%{state} epics"
msgstr ""
+msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
+msgstr ""
+
msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
msgstr ""
@@ -949,11 +974,6 @@ msgstr ""
msgid "%{template_project_id} is unknown or invalid"
msgstr ""
-msgid "%{text} %{files}"
-msgid_plural "%{text} %{files} files"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%{text} is available"
msgstr ""
@@ -1038,9 +1058,6 @@ msgstr ""
msgid "%{wildcards_link_start}Wildcards%{wildcards_link_end} such as %{code_tag_start}v*%{code_tag_end} or %{code_tag_start}*-release%{code_tag_end} are supported."
msgstr ""
-msgid "&lt; 1 hour"
-msgstr ""
-
msgid "'%{data}' at %{location} does not match format: %{format}"
msgstr ""
@@ -1124,9 +1141,6 @@ msgstr ""
msgid "(we need your current password to confirm your changes)"
msgstr ""
-msgid "* * * * *"
-msgstr ""
-
msgid "+ %{amount} more"
msgstr ""
@@ -1193,10 +1207,10 @@ msgstr ""
msgid "."
msgstr ""
-msgid "0 bytes"
+msgid "/"
msgstr ""
-msgid "0 for unlimited, only effective with remote storage enabled."
+msgid "0 bytes"
msgstr ""
msgid "0t1DgySidms"
@@ -1326,6 +1340,9 @@ msgstr ""
msgid "1000+"
msgstr ""
+msgid "192.168.0.0/24"
+msgstr ""
+
msgid "1st contribution!"
msgstr ""
@@ -1479,9 +1496,6 @@ msgstr ""
msgid "A plain HTML site that uses Netlify for CI/CD instead of GitLab, but still with all the other great GitLab features"
msgstr ""
-msgid "A plain-text response to show to clients that hit the rate limit."
-msgstr ""
-
msgid "A platform value can be web, mob or app."
msgstr ""
@@ -1563,7 +1577,7 @@ msgstr ""
msgid "APIFuzzing|Configure HTTP basic authentication values. Other authentication methods are supported. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
+msgid "APIFuzzing|Customize your project's API fuzzing configuration options and copy the code snippet to your .gitlab-ci.yml file to apply any changes. Note that this tool does not reflect or update your .gitlab-ci.yml file automatically. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
msgstr ""
msgid "APIFuzzing|Enable authentication"
@@ -1626,9 +1640,6 @@ msgstr ""
msgid "APIFuzzing|To prevent a security leak, authentication info must be added as a %{ciVariablesLinkStart}CI variable%{ciVariablesLinkEnd}. As a user with maintainer access rights, you can manage CI variables in the %{ciSettingsLinkStart}Settings%{ciSettingsLinkEnd} area."
msgstr ""
-msgid "APIFuzzing|Use this tool to generate API fuzzing configuration YAML to copy into your .gitlab-ci.yml file. This tool does not reflect or update your .gitlab-ci.yml file automatically."
-msgstr ""
-
msgid "APIFuzzing|Username for basic authentication"
msgstr ""
@@ -1680,9 +1691,6 @@ msgstr ""
msgid "Abuse reports notification email"
msgstr ""
-msgid "Abuse reports will be sent to this address if it is set. Abuse reports are always available in the admin area."
-msgstr ""
-
msgid "Accept invitation"
msgstr ""
@@ -1719,12 +1727,18 @@ msgstr ""
msgid "Access granted"
msgstr ""
+msgid "Access key ID"
+msgstr ""
+
msgid "Access requests"
msgstr ""
msgid "Access to '%{classification_label}' not allowed"
msgstr ""
+msgid "Access tokens expire after 2 hours. A refresh token may be used at any time to generate a new access token. Non-expiring access tokens are deprecated. Clear this setting to enable backward compatibility."
+msgstr ""
+
msgid "AccessDropdown|Deploy Keys"
msgstr ""
@@ -2037,6 +2051,9 @@ msgstr ""
msgid "Add new directory"
msgstr ""
+msgid "Add new service account"
+msgstr ""
+
msgid "Add or remove previously merged commits"
msgstr ""
@@ -2274,6 +2291,9 @@ msgstr ""
msgid "AdminArea|Features"
msgstr ""
+msgid "AdminArea|Get security updates from GitLab and stay up to date"
+msgstr ""
+
msgid "AdminArea|Groups"
msgstr ""
@@ -2313,6 +2333,12 @@ msgstr ""
msgid "AdminArea|Reporter"
msgstr ""
+msgid "AdminArea|Sign up for the GitLab Security Newsletter to get notified for security updates."
+msgstr ""
+
+msgid "AdminArea|Sign up for the GitLab newsletter"
+msgstr ""
+
msgid "AdminArea|Stop all jobs"
msgstr ""
@@ -2382,9 +2408,15 @@ msgstr ""
msgid "AdminSettings|Disable public access to Pages sites"
msgstr ""
+msgid "AdminSettings|Display a banner on merge requests in projects with no pipelines to initiate steps to add a .gitlab-ci.yml file."
+msgstr ""
+
msgid "AdminSettings|Domain verification is an essential security measure for public GitLab sites. Users are required to demonstrate they control a domain before it is enabled. %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "AdminSettings|Enable pipeline suggestion banner"
+msgstr ""
+
msgid "AdminSettings|Enable shared runners for new projects"
msgstr ""
@@ -2856,10 +2888,10 @@ msgstr ""
msgid "Admin|Quarterly reconciliation will occur on %{qrtlyDate}"
msgstr ""
-msgid "Admin|The number of max seats used for your namespace is currently exceeding the number of seats in your subscription. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgid "Admin|The number of max seats in your namespace exceeds the number of seats in your subscription. On %{qrtlyDate}, quarterly reconciliation occurs and you are automatically billed a prorated amount for the overage. No action is needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice. For more information about the timing of the invoicing process, view the documentation."
msgstr ""
-msgid "Admin|The number of maximum users for your instance is currently exceeding the number of users in license. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgid "Admin|The number of max users in your instance exceeds the number of users in your license. On %{qrtlyDate}, quarterly reconciliation occurs and you are automatically billed a prorated amount for the overage. No action is needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice. For more information about the timing of the invoicing process, view the documentation."
msgstr ""
msgid "Admin|View pending user approvals"
@@ -2880,9 +2912,6 @@ msgstr ""
msgid "Advanced export options"
msgstr ""
-msgid "Advanced permissions, Large File Storage and Two-Factor authentication settings."
-msgstr ""
-
msgid "After a successful password update you will be redirected to login screen."
msgstr ""
@@ -2901,13 +2930,14 @@ msgstr ""
msgid "After you've reviewed these contribution guidelines, you'll be all set to"
msgstr ""
+msgid "Akismet"
+msgstr ""
+
msgid "Akismet API Key"
msgstr ""
-msgid "Alert"
-msgid_plural "Alerts"
-msgstr[0] ""
-msgstr[1] ""
+msgid "Akismet helps prevent the creation of spam issues in public projects."
+msgstr ""
msgid "AlertManagement|Acknowledged"
msgstr ""
@@ -3263,6 +3293,9 @@ msgstr ""
msgid "All (default)"
msgstr ""
+msgid "All GitLab"
+msgstr ""
+
msgid "All Members"
msgstr ""
@@ -3377,6 +3410,9 @@ msgstr ""
msgid "Allow this secondary node to replicate content on Object Storage"
msgstr ""
+msgid "Allow use of licensed EE features"
+msgstr ""
+
msgid "Allow users to dismiss the broadcast message"
msgstr ""
@@ -3452,9 +3488,6 @@ msgstr ""
msgid "Amazon authentication is not %{link_start}correctly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
-msgid "Amount of time (in hours) that users are allowed to skip forced configuration of two-factor authentication"
-msgstr ""
-
msgid "An %{link_start}alert%{link_end} with the same fingerprint is already open. To change the status of this alert, resolve the linked alert."
msgstr ""
@@ -3515,12 +3548,6 @@ msgstr ""
msgid "An error occurred when removing the label."
msgstr ""
-msgid "An error occurred when toggling the notification subscription"
-msgstr ""
-
-msgid "An error occurred when updating the issue weight"
-msgstr ""
-
msgid "An error occurred when updating the title"
msgstr ""
@@ -3569,6 +3596,9 @@ msgstr ""
msgid "An error occurred while enabling Service Desk."
msgstr ""
+msgid "An error occurred while fetching Markdown preview"
+msgstr ""
+
msgid "An error occurred while fetching ancestors"
msgstr ""
@@ -3599,9 +3629,6 @@ msgstr ""
msgid "An error occurred while fetching label colors."
msgstr ""
-msgid "An error occurred while fetching markdown preview"
-msgstr ""
-
msgid "An error occurred while fetching participants"
msgstr ""
@@ -3617,9 +3644,6 @@ msgstr ""
msgid "An error occurred while fetching reference"
msgstr ""
-msgid "An error occurred while fetching sidebar data"
-msgstr ""
-
msgid "An error occurred while fetching tags. Retry the search."
msgstr ""
@@ -3695,6 +3719,9 @@ msgstr ""
msgid "An error occurred while loading merge requests."
msgstr ""
+msgid "An error occurred while loading projects."
+msgstr ""
+
msgid "An error occurred while loading the Needs tab."
msgstr ""
@@ -3929,12 +3956,6 @@ msgstr ""
msgid "Any Milestone"
msgstr ""
-msgid "Any branch"
-msgstr ""
-
-msgid "Any eligible user"
-msgstr ""
-
msgid "Any encrypted tokens"
msgstr ""
@@ -3953,6 +3974,9 @@ msgstr ""
msgid "Any namespace"
msgstr ""
+msgid "App Engine description and apps that are suitable for this deployment target"
+msgstr ""
+
msgid "App ID"
msgstr ""
@@ -4101,6 +4125,11 @@ msgstr ""
msgid "Apply"
msgstr ""
+msgid "Apply %d suggestion"
+msgid_plural "Apply %d suggestions"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Apply a label"
msgstr ""
@@ -4110,13 +4139,10 @@ msgstr ""
msgid "Apply suggestion"
msgstr ""
-msgid "Apply suggestions"
-msgstr ""
-
msgid "Apply template"
msgstr ""
-msgid "Apply this approval rule to any branch or a specific protected branch."
+msgid "Apply this approval rule to all branches or a specific protected branch."
msgstr ""
msgid "Applying"
@@ -4259,9 +4285,6 @@ msgstr ""
msgid "ApprovalSettings|Prevent editing approval rules in projects and merge requests."
msgstr ""
-msgid "ApprovalSettings|Prevent editing approval rules in projects and merge requests. "
-msgstr ""
-
msgid "ApprovalSettings|Remove all approvals when commits are added to the source branch."
msgstr ""
@@ -4277,6 +4300,9 @@ msgstr ""
msgid "ApprovalSettings|This setting is configured at the instance level and can only be changed by an administrator."
msgstr ""
+msgid "ApprovalSettings|This setting is configured in %{groupName} and can only be changed by an administrator or group owner."
+msgstr ""
+
msgid "ApprovalStatusTooltip|Adheres to separation of duties"
msgstr ""
@@ -4763,9 +4789,6 @@ msgstr ""
msgid "Authenticated API rate limit period in seconds"
msgstr ""
-msgid "Authenticated API request rate limit"
-msgstr ""
-
msgid "Authenticated API requests"
msgstr ""
@@ -4775,10 +4798,10 @@ msgstr ""
msgid "Authenticated Git LFS request rate limit"
msgstr ""
-msgid "Authenticated web rate limit period in seconds"
+msgid "Authenticated Git LFS requests"
msgstr ""
-msgid "Authenticated web request rate limit"
+msgid "Authenticated web rate limit period in seconds"
msgstr ""
msgid "Authenticated web requests"
@@ -5156,9 +5179,6 @@ msgstr ""
msgid "Below you will find all the groups that are public."
msgstr ""
-msgid "Beta"
-msgstr ""
-
msgid "Bi-weekly code coverage"
msgstr ""
@@ -5398,6 +5418,21 @@ msgstr ""
msgid "Board scope affects which issues are displayed for anyone who visits this board"
msgstr ""
+msgid "BoardNewEpic|Groups"
+msgstr ""
+
+msgid "BoardNewEpic|Loading groups"
+msgstr ""
+
+msgid "BoardNewEpic|No matching results"
+msgstr ""
+
+msgid "BoardNewEpic|Search groups"
+msgstr ""
+
+msgid "BoardNewEpic|Select a group"
+msgstr ""
+
msgid "BoardNewIssue|No matching results"
msgstr ""
@@ -5475,6 +5510,9 @@ msgstr ""
msgid "Boards|An error occurred while creating the list. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching child groups. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching group projects. Please try again."
msgstr ""
@@ -5807,6 +5845,9 @@ msgstr ""
msgid "Bulk update"
msgstr ""
+msgid "BulkImports|Re-import creates a new group. It does not sync with the existing group."
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -5816,6 +5857,9 @@ msgstr ""
msgid "BulkImport|From source group"
msgstr ""
+msgid "BulkImport|Group import history"
+msgstr ""
+
msgid "BulkImport|Import failed: Destination cannot be a subgroup of the source group. Change the destination and try again."
msgstr ""
@@ -5828,9 +5872,18 @@ msgstr ""
msgid "BulkImport|Importing the group failed"
msgstr ""
+msgid "BulkImport|Last imported to %{link}"
+msgstr ""
+
msgid "BulkImport|Name already exists."
msgstr ""
+msgid "BulkImport|New group"
+msgstr ""
+
+msgid "BulkImport|No history is available"
+msgstr ""
+
msgid "BulkImport|No parent"
msgstr ""
@@ -5843,6 +5896,9 @@ msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} matching filter \"%{filter}\" from %{link}"
msgstr ""
+msgid "BulkImport|Source group"
+msgstr ""
+
msgid "BulkImport|To new group"
msgstr ""
@@ -5852,6 +5908,9 @@ msgstr ""
msgid "BulkImport|You have no groups to import"
msgstr ""
+msgid "BulkImport|Your imported groups will appear here."
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -6094,6 +6153,9 @@ msgstr ""
msgid "Can be manually deployed to"
msgstr ""
+msgid "Can be overridden in each project."
+msgstr ""
+
msgid "Can create groups:"
msgstr ""
@@ -6196,6 +6258,9 @@ msgstr ""
msgid "Cancelling Preview"
msgstr ""
+msgid "Cannot assign a confidential epic to a non-confidential issue. Make the issue confidential and try again"
+msgstr ""
+
msgid "Cannot be assigned to other projects."
msgstr ""
@@ -6247,9 +6312,6 @@ msgstr ""
msgid "Cannot refer to a group %{timebox_type} by an internal id!"
msgstr ""
-msgid "Cannot set confidential epic for a non-confidential issue"
-msgstr ""
-
msgid "Cannot show preview. For previews on sketch files, they must have the file format introduced by Sketch version 43 and above."
msgstr ""
@@ -6487,15 +6549,15 @@ msgstr ""
msgid "Check out, review, and merge locally"
msgstr ""
-msgid "Check the %{docs_link_start}documentation%{docs_link_end}."
-msgstr ""
-
msgid "Check the current instance configuration "
msgstr ""
msgid "Check the elasticsearch.log file to debug why the migration was halted and make any changes before retrying the migration. When you fix the cause of the failure, click \"Retry migration\", and the migration will be scheduled to be retried in the background."
msgstr ""
+msgid "Check with your administrator."
+msgstr ""
+
msgid "Check your Docker images for known vulnerabilities."
msgstr ""
@@ -6526,6 +6588,9 @@ msgstr ""
msgid "Checkout"
msgstr ""
+msgid "Checkout|$%{selectedPlanPrice} per 10 GB storage per pack"
+msgstr ""
+
msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 minutes"
msgstr ""
@@ -6546,17 +6611,23 @@ msgstr ""
msgid "Checkout|%{name}'s GitLab subscription"
msgstr ""
-msgid "Checkout|%{selectedPlanText} plan"
+msgid "Checkout|%{name}'s storage subscription"
msgstr ""
-msgid "Checkout|%{startDate} - %{endDate}"
+msgid "Checkout|%{quantity} GB of storage"
msgstr ""
-msgid "Checkout|%{totalCiMinutes} CI minute"
-msgid_plural "Checkout|%{totalCiMinutes} CI minutes"
+msgid "Checkout|%{quantity} storage pack"
+msgid_plural "Checkout|%{quantity} storage packs"
msgstr[0] ""
msgstr[1] ""
+msgid "Checkout|%{selectedPlanText} plan"
+msgstr ""
+
+msgid "Checkout|%{startDate} - %{endDate}"
+msgstr ""
+
msgid "Checkout|%{totalCiMinutes} CI minutes"
msgstr ""
@@ -6632,6 +6703,9 @@ msgstr ""
msgid "Checkout|Failed to register credit card. Please try again."
msgstr ""
+msgid "Checkout|GB"
+msgstr ""
+
msgid "Checkout|GitLab group"
msgstr ""
@@ -6668,6 +6742,9 @@ msgstr ""
msgid "Checkout|State"
msgstr ""
+msgid "Checkout|Storage packs"
+msgstr ""
+
msgid "Checkout|Street address"
msgstr ""
@@ -6689,6 +6766,9 @@ msgstr ""
msgid "Checkout|Total minutes: %{quantity}"
msgstr ""
+msgid "Checkout|Total storage: %{quantity} GB"
+msgstr ""
+
msgid "Checkout|Users"
msgstr ""
@@ -6698,16 +6778,25 @@ msgstr ""
msgid "Checkout|Your organization"
msgstr ""
+msgid "Checkout|Your storage subscription has the same term as your main subscription, and the price is prorated accordingly."
+msgstr ""
+
msgid "Checkout|Your subscription will be applied to this group"
msgstr ""
msgid "Checkout|Zip code"
msgstr ""
+msgid "Checkout|a storage subscription"
+msgstr ""
+
msgid "Checkout|company or team"
msgstr ""
-msgid "Checkout|x 1,000 minutes per pack = %{strong}"
+msgid "Checkout|minutes"
+msgstr ""
+
+msgid "Checkout|x %{quantity} %{units} per pack ="
msgstr ""
msgid "Cherry-pick this commit"
@@ -7064,6 +7153,9 @@ msgstr ""
msgid "CloneIssue|Cannot clone issue to target project as it is pending deletion."
msgstr ""
+msgid "CloneIssue|Cannot clone issues of '%{issue_type}' type."
+msgstr ""
+
msgid "Cloned this issue to %{path_to_project}."
msgstr ""
@@ -7118,7 +7210,10 @@ msgstr ""
msgid "Closes this %{quick_action_target}."
msgstr ""
-msgid "Cloud licenses can not be removed."
+msgid "Cloud Functions description and apps that are suitable for this deployment target"
+msgstr ""
+
+msgid "Cloud Run description and apps that are suitable for this deployment target"
msgstr ""
msgid "Cluster"
@@ -7145,6 +7240,12 @@ msgstr ""
msgid "ClusterAgents|Access tokens"
msgstr ""
+msgid "ClusterAgents|Agent might not be connected to GitLab"
+msgstr ""
+
+msgid "ClusterAgents|Agent never connected to GitLab"
+msgstr ""
+
msgid "ClusterAgents|Alternative installation methods"
msgstr ""
@@ -7160,6 +7261,12 @@ msgstr ""
msgid "ClusterAgents|Configuration"
msgstr ""
+msgid "ClusterAgents|Connected"
+msgstr ""
+
+msgid "ClusterAgents|Connection status"
+msgstr ""
+
msgid "ClusterAgents|Copy token"
msgstr ""
@@ -7178,6 +7285,9 @@ msgstr ""
msgid "ClusterAgents|For alternative installation methods %{linkStart}go to the documentation%{linkEnd}."
msgstr ""
+msgid "ClusterAgents|For more troubleshooting information go to"
+msgstr ""
+
msgid "ClusterAgents|Go to the repository"
msgstr ""
@@ -7193,18 +7303,30 @@ msgstr ""
msgid "ClusterAgents|Integrate with the GitLab Agent"
msgstr ""
-msgid "ClusterAgents|Last used"
+msgid "ClusterAgents|Last connected %{timeAgo}."
+msgstr ""
+
+msgid "ClusterAgents|Last contact"
msgstr ""
msgid "ClusterAgents|Learn how to create an agent access token"
msgstr ""
+msgid "ClusterAgents|Make sure you are using a valid token."
+msgstr ""
+
msgid "ClusterAgents|Name"
msgstr ""
msgid "ClusterAgents|Never"
msgstr ""
+msgid "ClusterAgents|Never connected"
+msgstr ""
+
+msgid "ClusterAgents|Not connected"
+msgstr ""
+
msgid "ClusterAgents|Read more about getting started"
msgstr ""
@@ -7226,6 +7348,9 @@ msgstr ""
msgid "ClusterAgents|Select which Agent you want to install"
msgstr ""
+msgid "ClusterAgents|The Agent has not been connected in a long time. There might be a connectivity issue. Last contact was %{timeAgo}."
+msgstr ""
+
msgid "ClusterAgents|The GitLab Agent also requires %{linkStart}enabling the Agent Server%{linkEnd}"
msgstr ""
@@ -7253,9 +7378,6 @@ msgstr ""
msgid "ClusterAgents|You will need to create a token to connect to your agent"
msgstr ""
-msgid "ClusterAgent|This feature is only available for premium plans"
-msgstr ""
-
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -7445,9 +7567,6 @@ msgstr ""
msgid "ClusterIntegration|Create Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Create a provision role on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the account and external ID above. %{startMoreInfoLink}More information%{endLink}"
-msgstr ""
-
msgid "ClusterIntegration|Create cluster on"
msgstr ""
@@ -7880,7 +7999,7 @@ msgstr ""
msgid "ClusterIntegration|Subnets"
msgstr ""
-msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provisioned role, first create one on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the above account and external IDs. %{startMoreInfoLink}More information%{endLink}"
+msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provisioned role, first create one on %{awsLinkStart}Amazon Web Services %{awsLinkEnd} using the above account and external IDs. %{moreInfoStart}More information%{moreInfoEnd}"
msgstr ""
msgid "ClusterIntegration|The Kubernetes certificate used to authenticate to the cluster."
@@ -8114,6 +8233,9 @@ msgstr ""
msgid "Collapse replies"
msgstr ""
+msgid "Collapse settings section"
+msgstr ""
+
msgid "Collapse sidebar"
msgstr ""
@@ -8132,6 +8254,9 @@ msgstr ""
msgid "Comma-separated list of email addresses."
msgstr ""
+msgid "Comma-separated list of users allowed to exceed the rate limit."
+msgstr ""
+
msgid "Comma-separated, e.g. '1.1.1.1, 2.2.2.0/24'"
msgstr ""
@@ -8452,6 +8577,9 @@ msgstr ""
msgid "Configure %{repository_checks_link_start}repository checks%{link_end} and %{housekeeping_link_start}housekeeping%{link_end} on repositories."
msgstr ""
+msgid "Configure CAPTCHAs, IP address limits, and other anti-spam measures."
+msgstr ""
+
msgid "Configure Dependency Scanning in `.gitlab-ci.yml` using the GitLab managed template. You can [add variable overrides](https://docs.gitlab.com/ee/user/application_security/dependency_scanning/#customizing-the-dependency-scanning-settings) to customize Dependency Scanning settings."
msgstr ""
@@ -8488,16 +8616,13 @@ msgstr ""
msgid "Configure a %{codeStart}.gitlab-webide.yml%{codeEnd} file in the %{codeStart}.gitlab%{codeEnd} directory to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
msgstr ""
-msgid "Configure existing installation"
-msgstr ""
-
-msgid "Configure limit for notes created per minute by web and API requests."
+msgid "Configure advanced permissions, Large File Storage, and two-factor authentication settings."
msgstr ""
-msgid "Configure limits for Project/Group Import/Export."
+msgid "Configure approvals by authors and committers on all projects."
msgstr ""
-msgid "Configure limits for web and API requests."
+msgid "Configure existing installation"
msgstr ""
msgid "Configure paths to be protected by Rack Attack."
@@ -8512,10 +8637,13 @@ msgstr ""
msgid "Configure settings for Advanced Search with Elasticsearch."
msgstr ""
+msgid "Configure specific limits for Files API requests that supersede the general user and IP rate limits."
+msgstr ""
+
msgid "Configure specific limits for Git LFS requests that supersede the general user and IP rate limits."
msgstr ""
-msgid "Configure specific limits for Packages API requests that supersede the general user and IP rate limits."
+msgid "Configure specific limits for deprecated API requests that supersede the general user and IP rate limits."
msgstr ""
msgid "Configure the %{link} integration."
@@ -8527,6 +8655,9 @@ msgstr ""
msgid "Configure the way a user creates a new account."
msgstr ""
+msgid "Configure via Merge Request"
+msgstr ""
+
msgid "Configure which lists are shown for anyone who visits this board"
msgstr ""
@@ -8995,6 +9126,9 @@ msgstr ""
msgid "Content parsed with %{link}."
msgstr ""
+msgid "ContentEditor|Table of Contents"
+msgstr ""
+
msgid "ContentEditor|You have to provide a renderMarkdown function or a custom serializer"
msgstr ""
@@ -9181,6 +9315,9 @@ msgstr ""
msgid "Copy link to chart"
msgstr ""
+msgid "Copy prefix"
+msgstr ""
+
msgid "Copy reference"
msgstr ""
@@ -9211,6 +9348,9 @@ msgstr ""
msgid "Copy value"
msgstr ""
+msgid "Corpus Management"
+msgstr ""
+
msgid "Corpus Management|Are you sure you want to delete the corpus?"
msgstr ""
@@ -9439,6 +9579,9 @@ msgstr ""
msgid "Create commit"
msgstr ""
+msgid "Create common files more quickly, and standardize their format."
+msgstr ""
+
msgid "Create confidential merge request"
msgstr ""
@@ -9472,6 +9615,9 @@ msgstr ""
msgid "Create issue"
msgstr ""
+msgid "Create issue to resolve all threads"
+msgstr ""
+
msgid "Create iteration"
msgstr ""
@@ -9526,6 +9672,9 @@ msgstr ""
msgid "Create new..."
msgstr ""
+msgid "Create or import your first project"
+msgstr ""
+
msgid "Create project"
msgstr ""
@@ -9883,7 +10032,7 @@ msgstr ""
msgid "Custom notification events"
msgstr ""
-msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notificationLinkStart} notification emails%{notificationLinkEnd}."
+msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notificationLinkStart}notification emails%{notificationLinkEnd}."
msgstr ""
msgid "Custom project templates"
@@ -10082,10 +10231,10 @@ msgid_plural "CycleAnalytics|Showing %{subjectFilterText} and %{selectedLabelsCo
msgstr[0] ""
msgstr[1] ""
-msgid "CycleAnalytics|Showing data for group '%{groupName}' and %{selectedProjectCount} projects from %{startDate} to %{endDate}"
+msgid "CycleAnalytics|Showing data for group '%{groupName}' and %{selectedProjectCount} projects from %{createdAfter} to %{createdBefore}"
msgstr ""
-msgid "CycleAnalytics|Showing data for group '%{groupName}' from %{startDate} to %{endDate}"
+msgid "CycleAnalytics|Showing data for group '%{groupName}' from %{createdAfter} to %{createdBefore}"
msgstr ""
msgid "CycleAnalytics|Stages"
@@ -10319,6 +10468,9 @@ msgstr ""
msgid "DastProfiles|Manage profiles"
msgstr ""
+msgid "DastProfiles|Manage site profiles"
+msgstr ""
+
msgid "DastProfiles|Minimum = 0 (no timeout enabled), Maximum = 2880 minutes"
msgstr ""
@@ -10394,6 +10546,9 @@ msgstr ""
msgid "DastProfiles|Scanner name"
msgstr ""
+msgid "DastProfiles|Schedule"
+msgstr ""
+
msgid "DastProfiles|Select branch"
msgstr ""
@@ -10463,7 +10618,7 @@ msgstr ""
msgid "DastProfiles|Website"
msgstr ""
-msgid "DastProfiles|You can either choose a passive scan or validate the target site in your chosen site profile. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
+msgid "DastProfiles|You can either choose a passive scan or validate the target site from the site profile management page. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
msgstr ""
msgid "DastProfiles|You cannot run an active scan against an unvalidated site."
@@ -10636,7 +10791,7 @@ msgstr ""
msgid "Days to merge"
msgstr ""
-msgid "Deactivate dormant users after 90 days of inactivity. Users can return to active status by signing in to their account. While inactive, a user is not counted as an active user in the instance."
+msgid "Deactivate dormant users after 90 days of inactivity"
msgstr ""
msgid "Dear Administrator,"
@@ -10723,10 +10878,10 @@ msgstr ""
msgid "Define a custom pattern with cron syntax"
msgstr ""
-msgid "Define approval settings."
+msgid "Define approval rules."
msgstr ""
-msgid "Define approval settings. %{linkStart}Learn more.%{linkEnd}"
+msgid "Define approval rules. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "Define custom rules for what constitutes spam, independent of Akismet"
@@ -10735,7 +10890,7 @@ msgstr ""
msgid "Define environments in the deploy stage(s) in %{code_open}.gitlab-ci.yml%{code_close} to track deployments here."
msgstr ""
-msgid "Define how approval rules are applied as a merge request moves toward completion."
+msgid "Define how approval rules are applied to merge requests."
msgstr ""
msgid "Definition"
@@ -10750,6 +10905,12 @@ msgstr ""
msgid "DelayedJobs|Are you sure you want to run %{job_name} immediately? This job will run automatically after it's timer finishes."
msgstr ""
+msgid "DelayedJobs|Are you sure you want to run %{job_name} immediately? This job will run automatically after its timer finishes."
+msgstr ""
+
+msgid "DelayedJobs|Run the delayed job now?"
+msgstr ""
+
msgid "DelayedJobs|Start now"
msgstr ""
@@ -11026,6 +11187,12 @@ msgstr ""
msgid "Dependency proxy image prefix"
msgstr ""
+msgid "DependencyProxy|Create a local proxy for storing frequently used upstream images. %{docLinkStart}Learn more%{docLinkEnd} about dependency proxies."
+msgstr ""
+
+msgid "DependencyProxy|Dependency Proxy"
+msgstr ""
+
msgid "DependencyProxy|Toggle Dependency Proxy"
msgstr ""
@@ -11266,6 +11433,9 @@ msgstr ""
msgid "Deployments"
msgstr ""
+msgid "Deployments to Google Kubernetes Engine can be "
+msgstr ""
+
msgid "Deployments|%{deployments} environment impacted."
msgid_plural "Deployments|%{deployments} environments impacted."
msgstr[0] ""
@@ -11295,6 +11465,9 @@ msgstr ""
msgid "Deployment|success"
msgstr ""
+msgid "Deprecated API rate limits"
+msgstr ""
+
msgid "Deprioritize label"
msgstr ""
@@ -11697,6 +11870,16 @@ msgstr ""
msgid "DiffsCompareBaseBranch|(base)"
msgstr ""
+msgid "Diffs|%d addition"
+msgid_plural "Diffs|%d additions"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Diffs|%d deletion"
+msgid_plural "Diffs|%d deletions"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Diffs|No file name available"
msgstr ""
@@ -11706,9 +11889,17 @@ msgstr ""
msgid "Diffs|Show all unchanged lines"
msgstr ""
+msgid "Diffs|Showing %{dropdownStart}%{count} changed file%{dropdownEnd}"
+msgid_plural "Diffs|Showing %{dropdownStart}%{count} changed files%{dropdownEnd}"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Diffs|Something went wrong while fetching diff lines."
msgstr ""
+msgid "Diffs|with %{additions} and %{deletions}"
+msgstr ""
+
msgid "Direct member"
msgstr ""
@@ -11834,9 +12025,6 @@ msgid_plural "Dismiss %d selected vulnerabilities as"
msgstr[0] ""
msgstr[1] ""
-msgid "Dismiss Value Stream Analytics introduction box"
-msgstr ""
-
msgid "Dismiss merge request promotion"
msgstr ""
@@ -12158,6 +12346,9 @@ msgstr ""
msgid "Edit issues"
msgstr ""
+msgid "Edit merge requests"
+msgstr ""
+
msgid "Edit public deploy key"
msgstr ""
@@ -12233,6 +12424,9 @@ msgstr ""
msgid "Elastic|None. Select projects to index."
msgstr ""
+msgid "Eligible users"
+msgstr ""
+
msgid "Email"
msgstr ""
@@ -12362,6 +12556,9 @@ msgstr ""
msgid "Enable"
msgstr ""
+msgid "Enable Amazon EKS integration"
+msgstr ""
+
msgid "Enable Auto DevOps"
msgstr ""
@@ -12395,6 +12592,9 @@ msgstr ""
msgid "Enable SSL verification"
msgstr ""
+msgid "Enable Service Ping"
+msgstr ""
+
msgid "Enable Snowplow tracking"
msgstr ""
@@ -12425,6 +12625,9 @@ msgstr ""
msgid "Enable authenticated Git LFS request rate limit"
msgstr ""
+msgid "Enable authenticated web request rate limit"
+msgstr ""
+
msgid "Enable authentication"
msgstr ""
@@ -12485,7 +12688,7 @@ msgstr ""
msgid "Enable or disable the Pseudonymizer data collection."
msgstr ""
-msgid "Enable or disable version check and service ping."
+msgid "Enable or disable version check and Service Ping."
msgstr ""
msgid "Enable protected paths rate limit"
@@ -12497,18 +12700,12 @@ msgstr ""
msgid "Enable reCAPTCHA"
msgstr ""
-msgid "Enable reCAPTCHA for login"
-msgstr ""
-
-msgid "Enable reCAPTCHA, Invisible Captcha, Akismet and set IP limits. For reCAPTCHA, we currently only support %{recaptcha_v2_link_start}v2%{recaptcha_v2_link_end}"
+msgid "Enable reCAPTCHA for login."
msgstr ""
msgid "Enable repository checks"
msgstr ""
-msgid "Enable service ping"
-msgstr ""
-
msgid "Enable shared runners for all projects and subgroups in this group."
msgstr ""
@@ -12530,7 +12727,10 @@ msgstr ""
msgid "Enable unauthenticated API request rate limit"
msgstr ""
-msgid "Enable unauthenticated request rate limit"
+msgid "Enable unauthenticated web request rate limit"
+msgstr ""
+
+msgid "Enable user deactivation emails"
msgstr ""
msgid "Enable version check"
@@ -12566,9 +12766,6 @@ msgstr ""
msgid "Enabled sources for code import during project creation. OmniAuth must be configured for GitHub"
msgstr ""
-msgid "Enabling this will only make licensed EE features available to projects if the project namespace's plan includes the feature or if the project is public."
-msgstr ""
-
msgid "Encountered an error while rendering: %{err}"
msgstr ""
@@ -12617,9 +12814,6 @@ msgstr ""
msgid "Enter Admin Mode"
msgstr ""
-msgid "Enter IP address range"
-msgstr ""
-
msgid "Enter a number"
msgstr ""
@@ -12632,9 +12826,6 @@ msgstr ""
msgid "Enter at least three characters to search"
msgstr ""
-msgid "Enter domain"
-msgstr ""
-
msgid "Enter in your Bitbucket Server URL and personal access token below"
msgstr ""
@@ -12821,9 +13012,6 @@ msgstr ""
msgid "Environments|Deployment %{status}"
msgstr ""
-msgid "Environments|Dismiss"
-msgstr ""
-
msgid "Environments|Enable review app"
msgstr ""
@@ -12836,9 +13024,6 @@ msgstr ""
msgid "Environments|Environments are places where code gets deployed, such as staging or production."
msgstr ""
-msgid "Environments|Help us improve environments"
-msgstr ""
-
msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
msgstr ""
@@ -12875,6 +13060,9 @@ msgstr ""
msgid "Environments|Note that this action will stop the environment, but it will %{emphasisStart}not%{emphasisEnd} have an effect on any existing deployment due to no “stop environment action†being defined in the %{ciConfigLinkStart}.gitlab-ci.yml%{ciConfigLinkEnd} file."
msgstr ""
+msgid "Environments|Open"
+msgstr ""
+
msgid "Environments|Open live environment"
msgstr ""
@@ -12914,9 +13102,6 @@ msgstr ""
msgid "Environments|Stopping %{environmentName}"
msgstr ""
-msgid "Environments|Take the survey"
-msgstr ""
-
msgid "Environments|There was an error fetching the logs. Please try again."
msgstr ""
@@ -12938,9 +13123,6 @@ msgstr ""
msgid "Environments|You don't have any environments right now"
msgstr ""
-msgid "Environments|Your feedback helps GitLab make environments better for you and other users. Participate and enter a sweepstake to win a USD 30 gift card."
-msgstr ""
-
msgid "Environments|by %{avatar}"
msgstr ""
@@ -13223,7 +13405,7 @@ msgstr ""
msgid "Error parsing CSV file. Please make sure it has"
msgstr ""
-msgid "Error rendering markdown preview"
+msgid "Error rendering Markdown preview"
msgstr ""
msgid "Error saving label update."
@@ -13271,6 +13453,9 @@ msgstr ""
msgid "Error: %{error_message}"
msgstr ""
+msgid "Error: Couldn't load some or all of the changes."
+msgstr ""
+
msgid "Error: No AWS credentials were supplied"
msgstr ""
@@ -13304,6 +13489,9 @@ msgstr ""
msgid "ErrorTracking|Enable error tracking"
msgstr ""
+msgid "ErrorTracking|Error tracking backend"
+msgstr ""
+
msgid "ErrorTracking|If you self-host Sentry, enter your Sentry instance's full URL. If you use Sentry's hosted solution, enter https://sentry.io"
msgstr ""
@@ -13337,6 +13525,12 @@ msgstr ""
msgid "Escalation policies must have at least one rule"
msgstr ""
+msgid "EscalationPolicies|%{clockIcon} IF alert is not %{alertStatus} in %{minutes}"
+msgstr ""
+
+msgid "EscalationPolicies|%{notificationIcon} THEN %{doAction} %{forScheduleOrUser}"
+msgstr ""
+
msgid "EscalationPolicies|+ Add an additional rule"
msgstr ""
@@ -13379,13 +13573,13 @@ msgstr ""
msgid "EscalationPolicies|Escalation policies"
msgstr ""
-msgid "EscalationPolicies|Escalation rules"
+msgid "EscalationPolicies|Escalation policy %{obstacle} in Project %{project}"
msgstr ""
-msgid "EscalationPolicies|Failed to load oncall-schedules"
+msgid "EscalationPolicies|Escalation rules"
msgstr ""
-msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} %{then} THEN %{doAction} %{scheduleOrUser}"
+msgid "EscalationPolicies|Failed to load oncall-schedules"
msgstr ""
msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} minutes"
@@ -13463,18 +13657,36 @@ msgstr ""
msgid "Every %{action} attempt has failed: %{job_error_message}. Please try again."
msgstr ""
+msgid "Every 3 months"
+msgstr ""
+
+msgid "Every 3 months on the %{day} at %{time} %{timezone}"
+msgstr ""
+
+msgid "Every 6 months"
+msgstr ""
+
+msgid "Every 6 months on the %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Every day"
msgstr ""
msgid "Every day (at %{time})"
msgstr ""
+msgid "Every day at %{time} %{timezone}"
+msgstr ""
+
msgid "Every month"
msgstr ""
msgid "Every month (Day %{day} at %{time})"
msgstr ""
+msgid "Every month on the %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Every three months"
msgstr ""
@@ -13489,6 +13701,15 @@ msgstr[1] ""
msgid "Every week (%{weekday} at %{time})"
msgstr ""
+msgid "Every week on %{day} at %{time} %{timezone}"
+msgstr ""
+
+msgid "Every year"
+msgstr ""
+
+msgid "Every year on %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Everyone"
msgstr ""
@@ -13525,9 +13746,6 @@ msgstr ""
msgid "Exactly one of %{attributes} is required"
msgstr ""
-msgid "Example: %{ip_address}. %{read_more_link}."
-msgstr ""
-
msgid "Example: @sub\\.company\\.com$"
msgstr ""
@@ -13594,13 +13812,13 @@ msgstr ""
msgid "Expand pipeline"
msgstr ""
-msgid "Expand sidebar"
+msgid "Expand settings section"
msgstr ""
-msgid "Expected documents: %{expected_documents}"
+msgid "Expand sidebar"
msgstr ""
-msgid "Experienced"
+msgid "Expected documents: %{expected_documents}"
msgstr ""
msgid "ExperimentSubject|Must have exactly one of User, Namespace, or Project."
@@ -13885,9 +14103,6 @@ msgstr ""
msgid "Failed to load related branches"
msgstr ""
-msgid "Failed to load sidebar lock status"
-msgstr ""
-
msgid "Failed to load stacktrace."
msgstr ""
@@ -14312,6 +14527,9 @@ msgstr ""
msgid "Files"
msgstr ""
+msgid "Files API Rate Limits"
+msgstr ""
+
msgid "Files breadcrumb"
msgstr ""
@@ -15311,6 +15529,9 @@ msgstr ""
msgid "GitLab group: %{source_link}"
msgstr ""
+msgid "GitLab informs you if a new version is available."
+msgstr ""
+
msgid "GitLab is a complete DevOps platform, delivered as a single application, fundamentally changing the way Development, Security, and Ops teams collaborate"
msgstr ""
@@ -15326,7 +15547,7 @@ msgstr ""
msgid "GitLab is open source software to collaborate on code."
msgstr ""
-msgid "GitLab is undergoing maintenance and is operating in a read-only mode."
+msgid "GitLab is undergoing maintenance and is operating in read-only mode."
msgstr ""
msgid "GitLab member or Email address"
@@ -15338,9 +15559,6 @@ msgstr ""
msgid "GitLab project export"
msgstr ""
-msgid "GitLab restart is required to apply changes."
-msgstr ""
-
msgid "GitLab single sign-on URL"
msgstr ""
@@ -15356,9 +15574,6 @@ msgstr ""
msgid "GitLab version"
msgstr ""
-msgid "GitLab will inform you if a new version is available."
-msgstr ""
-
msgid "GitLab will run a background job that will produce pseudonymized CSVs of the GitLab database that will be uploaded to your configured object storage directory."
msgstr ""
@@ -15623,9 +15838,21 @@ msgstr ""
msgid "Go to snippets"
msgstr ""
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check 'Allowed domains for sign-ups'."
+msgstr ""
+
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check 'Email restrictions for sign-ups'."
+msgstr ""
+
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check the 'Domain denylist'."
+msgstr ""
+
msgid "Go to the activity feed"
msgstr ""
+msgid "Go to the group’s 'Settings &gt; General' page, and check 'Restrict membership by email domain'."
+msgstr ""
+
msgid "Go to the milestone list"
msgstr ""
@@ -15662,6 +15889,12 @@ msgstr ""
msgid "Goal of the changes and what reviewers should be aware of"
msgstr ""
+msgid "Google Cloud"
+msgstr ""
+
+msgid "Google Cloud offers several deployment targets. Select the one most suitable for your project."
+msgstr ""
+
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
@@ -15746,9 +15979,6 @@ msgstr ""
msgid "Group ID"
msgstr ""
-msgid "Group ID: %{group_id}"
-msgstr ""
-
msgid "Group Owner must have signed in with SAML before enabling Group Managed Accounts"
msgstr ""
@@ -15923,6 +16153,12 @@ msgstr ""
msgid "GroupImport|Unable to process group import file"
msgstr ""
+msgid "GroupPage|Copy group ID"
+msgstr ""
+
+msgid "GroupPage|Group ID: %{group_id}"
+msgstr ""
+
msgid "GroupRoadmap|%{dateWord} – No end date"
msgstr ""
@@ -15977,6 +16213,9 @@ msgstr ""
msgid "GroupRoadmap|Within 3 years"
msgstr ""
+msgid "GroupSAML|\"persistent\" recommended"
+msgstr ""
+
msgid "GroupSAML|%{strongOpen}Warning%{strongClose} - Enabling %{linkStart}SSO enforcement%{linkEnd} can reduce security risks."
msgstr ""
@@ -16109,6 +16348,9 @@ msgstr ""
msgid "GroupSAML|To be able to prohibit outer forks, you first need to enforce dedicate group managed accounts."
msgstr ""
+msgid "GroupSAML|Use SAML group links to manage group membership using SAML."
+msgstr ""
+
msgid "GroupSAML|Valid SAML Response"
msgstr ""
@@ -16121,13 +16363,10 @@ msgstr ""
msgid "GroupSAML|as %{access_level}"
msgstr ""
-msgid "GroupSAML|must match stored NameID of \"%{extern_uid}\" as we use this to identify users. If the NameID changes users will be unable to sign in."
-msgstr ""
-
-msgid "GroupSAML|should be \"persistent\""
+msgid "GroupSAML|must match stored NameID of \"%{extern_uid}\" to identify user and allow sign in"
msgstr ""
-msgid "GroupSAML|should be a random persistent ID, emails are discouraged"
+msgid "GroupSAML|recommend persistent ID instead of email"
msgstr ""
msgid "GroupSelect|No matching results"
@@ -16142,9 +16381,15 @@ msgstr ""
msgid "GroupSettings|Allow project access token creation"
msgstr ""
+msgid "GroupSettings|Applied to all subgroups unless overridden by a group owner. Groups already added to the project lose access."
+msgstr ""
+
msgid "GroupSettings|Auto DevOps pipeline was updated for the group"
msgstr ""
+msgid "GroupSettings|Available only on the top-level group. Applies to all subgroups. Groups already shared with a group outside %{group} are still shared unless removed manually."
+msgstr ""
+
msgid "GroupSettings|Badges"
msgstr ""
@@ -16196,6 +16441,9 @@ msgstr ""
msgid "GroupSettings|New runners registration token has been generated!"
msgstr ""
+msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgstr ""
+
msgid "GroupSettings|Pipeline settings was updated for the group"
msgstr ""
@@ -16208,12 +16456,15 @@ msgstr ""
msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
-msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups."
+msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups"
msgstr ""
msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
msgstr ""
+msgid "GroupSettings|Prevents group members from being notified if the group is mentioned."
+msgstr ""
+
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
msgstr ""
@@ -16250,21 +16501,6 @@ msgstr ""
msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}."
msgstr ""
-msgid "GroupSettings|This setting is only available on the top-level group and it applies to all subgroups. Groups that have already been shared with a group outside %{group} will still be shared, and this access will have to be revoked manually."
-msgstr ""
-
-msgid "GroupSettings|This setting will be applied to all subgroups unless overridden by a group owner. Groups that already have access to the project will continue to have access unless removed manually."
-msgstr ""
-
-msgid "GroupSettings|This setting will override user notification preferences for all members of the group, subgroups, and projects."
-msgstr ""
-
-msgid "GroupSettings|This setting will prevent group members from being notified if the group is mentioned."
-msgstr ""
-
-msgid "GroupSettings|This setting will prevent group members from forking projects outside of the group."
-msgstr ""
-
msgid "GroupSettings|Transfer group"
msgstr ""
@@ -16382,7 +16618,7 @@ msgstr ""
msgid "GroupsNew|No import options available"
msgstr ""
-msgid "GroupsNew|Not all related objects are migrated, as %{docs_link_start}described here%{docs_link_end}. Please %{feedback_link_start}leave feedback%{feedback_link_end} on this feature."
+msgid "GroupsNew|Not all related objects are migrated. %{docs_link_start}More info%{docs_link_end}."
msgstr ""
msgid "GroupsNew|Personal access token"
@@ -16514,15 +16750,27 @@ msgstr ""
msgid "Hello %{name},"
msgstr ""
-msgid "Hello there"
-msgstr ""
-
msgid "Hello, %{name}!"
msgstr ""
msgid "Hello, %{username}!"
msgstr ""
+msgid "HelloMessage|%{handshake_emoji} Contribute to GitLab: %{contribute_link}"
+msgstr ""
+
+msgid "HelloMessage|%{magnifier_emoji} Create a new GitLab issue: %{new_issue_link}"
+msgstr ""
+
+msgid "HelloMessage|%{rocket_emoji} We like your curiosity! Help us improve GitLab by joining the team: %{jobs_page_link}"
+msgstr ""
+
+msgid "HelloMessage|Does this page need fixes or improvements? Open an issue or contribute a merge request to help make GitLab more lovable. At GitLab, everyone can contribute!"
+msgstr ""
+
+msgid "HelloMessage|Welcome to GitLab!"
+msgstr ""
+
msgid "Help"
msgstr ""
@@ -16532,13 +16780,10 @@ msgstr ""
msgid "Helps prevent bots from creating accounts."
msgstr ""
-msgid "Helps prevent bots from creating issues"
-msgstr ""
-
-msgid "Helps prevent malicious users hide their activity"
+msgid "Helps prevent bots from creating issues."
msgstr ""
-msgid "Helps reduce request volume (e.g. from crawlers or abusive bots)"
+msgid "Helps prevent malicious users hide their activity."
msgstr ""
msgid "Helps reduce request volume (for example, from crawlers or abusive bots)"
@@ -16662,6 +16907,12 @@ msgstr ""
msgid "Housekeeping, export, path, transfer, remove, archive."
msgstr ""
+msgid "How do I configure Akismet?"
+msgstr ""
+
+msgid "How do I configure it?"
+msgstr ""
+
msgid "How do I configure runners?"
msgstr ""
@@ -16683,19 +16934,25 @@ msgstr ""
msgid "How do I set up this service?"
msgstr ""
+msgid "How do I use a web terminal?"
+msgstr ""
+
+msgid "How do I use file templates?"
+msgstr ""
+
msgid "How it works"
msgstr ""
msgid "How many days need to pass between marking entity for deletion and actual removing it."
msgstr ""
-msgid "How many seconds an IP will be counted towards the limit"
+msgid "How many seconds an IP counts toward the IP address limit."
msgstr ""
-msgid "I accept the %{terms_link}"
+msgid "How the job limiter handles jobs exceeding the thresholds specified below. The 'track' mode only logs the jobs. The 'compress' mode compresses the jobs and raises an exception if the compressed size exceeds the limit."
msgstr ""
-msgid "I accept the|Terms of Service and Privacy Policy"
+msgid "I accept the %{terms_link}"
msgstr ""
msgid "I forgot my password"
@@ -16779,13 +17036,16 @@ msgstr ""
msgid "IP Address"
msgstr ""
-msgid "IP expiration time"
+msgid "IP address expiration time"
msgstr ""
-msgid "IP subnet restriction only allowed for top-level groups"
+msgid "IP address restrictions"
+msgstr ""
+
+msgid "IP addresses per user"
msgstr ""
-msgid "IPs per user"
+msgid "IP subnet restriction only allowed for top-level groups"
msgstr ""
msgid "Identifier"
@@ -16800,6 +17060,9 @@ msgstr ""
msgid "If any indexed field exceeds this limit it will be truncated to this number of characters and the rest will not be indexed or searchable. This does not apply to repository and wiki indexing. Setting this to 0 means it is unlimited."
msgstr ""
+msgid "If blank, defaults to %{code_open}Retry later%{code_close}."
+msgstr ""
+
msgid "If blank, set allowable lifetime to %{instance_level_policy_in_words}, as defined by the instance admin. Once set, existing tokens for users in this group may be revoked."
msgstr ""
@@ -16851,6 +17114,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 did not initiate these sign-in attempts, please reach out to your administrator or enable two-factor authentication (2FA) on your account."
+msgstr ""
+
msgid "If you did not initiate this change, please contact your administrator immediately."
msgstr ""
@@ -16942,10 +17208,10 @@ msgstr ""
msgid "Import Projects from Gitea"
msgstr ""
-msgid "Import a project"
+msgid "Import an exported GitLab project"
msgstr ""
-msgid "Import an exported GitLab project"
+msgid "Import and export rate limits"
msgstr ""
msgid "Import failed due to a GitHub error: %{original}"
@@ -16957,12 +17223,18 @@ msgstr ""
msgid "Import from Jira"
msgstr ""
+msgid "Import group"
+msgstr ""
+
msgid "Import group from file"
msgstr ""
msgid "Import groups"
msgstr ""
+msgid "Import history"
+msgstr ""
+
msgid "Import in progress"
msgstr ""
@@ -17026,7 +17298,25 @@ msgstr ""
msgid "Import timed out. Import took longer than %{import_jobs_expiration} seconds"
msgstr ""
-msgid "Import/Export Rate Limits"
+msgid "ImportAProjectModal|Import from a project"
+msgstr ""
+
+msgid "ImportAProjectModal|Import members from another project"
+msgstr ""
+
+msgid "ImportAProjectModal|Import project members"
+msgstr ""
+
+msgid "ImportAProjectModal|Only project members (not group members) are imported, and they get the same permissions as the project you import from."
+msgstr ""
+
+msgid "ImportAProjectModal|Successfully imported"
+msgstr ""
+
+msgid "ImportAProjectModal|Unable to import project members"
+msgstr ""
+
+msgid "ImportAProjectModal|You're importing members to the %{strongStart}%{name}%{strongEnd} project."
msgstr ""
msgid "ImportButtons|Connect repositories from"
@@ -17079,7 +17369,7 @@ msgstr[1] ""
msgid "Importing..."
msgstr ""
-msgid "Import|A repository URL usually ends in a .git suffix, although this is not required. Double check to make sure your repository URL is correct."
+msgid "Import|There is not a valid Git repository at this URL. If your HTTP repository is not publicly accessible, verify your credentials."
msgstr ""
msgid "Improve customer support with Service Desk"
@@ -17088,9 +17378,6 @@ msgstr ""
msgid "Improves Git cloning performance."
msgstr ""
-msgid "In %{time_to_now}"
-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 ""
@@ -17376,7 +17663,7 @@ msgstr ""
msgid "InProductMarketing|Start a GitLab Ultimate trial today in less than one minute, no credit card required."
msgstr ""
-msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no CC required"
+msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no credit card required"
msgstr ""
msgid "InProductMarketing|Start a trial"
@@ -17415,7 +17702,7 @@ msgstr ""
msgid "InProductMarketing|Team up in GitLab for greater efficiency"
msgstr ""
-msgid "InProductMarketing|Team work makes the dream work"
+msgid "InProductMarketing|Team work makes the dream work"
msgstr ""
msgid "InProductMarketing|Test, create, deploy"
@@ -17996,6 +18283,9 @@ msgstr ""
msgid "Integrations|Create new issue in Jira"
msgstr ""
+msgid "Integrations|Create new issue in ZenTao"
+msgstr ""
+
msgid "Integrations|Default settings are inherited from the group level."
msgstr ""
@@ -18089,9 +18379,15 @@ msgstr ""
msgid "Integrations|Search Jira issues"
msgstr ""
+msgid "Integrations|Search ZenTao issues"
+msgstr ""
+
msgid "Integrations|Send notifications about project events to Unify Circuit."
msgstr ""
+msgid "Integrations|Send notifications about project events to a Unify Circuit conversation. %{docs_link}"
+msgstr ""
+
msgid "Integrations|Sign in to add namespaces"
msgstr ""
@@ -18131,6 +18427,9 @@ msgstr ""
msgid "Integrations|You've activated every integration 🎉"
msgstr ""
+msgid "Integrations|ZenTao issues display here when you create issues in your project in ZenTao."
+msgstr ""
+
msgid "Interactive mode"
msgstr ""
@@ -18158,9 +18457,6 @@ msgstr ""
msgid "Interval Pattern"
msgstr ""
-msgid "Introducing Value Stream Analytics"
-msgstr ""
-
msgid "Introducing Your DevOps Report"
msgstr ""
@@ -18257,6 +18553,12 @@ msgstr ""
msgid "Investigate vulnerability: %{title}"
msgstr ""
+msgid "Invisible Captcha"
+msgstr ""
+
+msgid "Invisible Captcha helps prevent the creation of spam accounts. It adds a honeypot field and time-sensitive form submission to the account signup form."
+msgstr ""
+
msgid "Invitation"
msgstr ""
@@ -18710,12 +19012,18 @@ msgstr ""
msgid "Issues"
msgstr ""
+msgid "Issues I've created"
+msgstr ""
+
msgid "Issues Rate Limits"
msgstr ""
msgid "Issues and merge requests"
msgstr ""
+msgid "Issues assigned to me"
+msgstr ""
+
msgid "Issues can be bugs, tasks or ideas to be discussed. Also, issues are searchable and filterable."
msgstr ""
@@ -18827,7 +19135,7 @@ msgstr ""
msgid "Iterations|Create cadence"
msgstr ""
-msgid "Iterations|Create your first iteration"
+msgid "Iterations|Create iteration"
msgstr ""
msgid "Iterations|Delete cadence"
@@ -18836,6 +19144,9 @@ msgstr ""
msgid "Iterations|Delete iteration cadence?"
msgstr ""
+msgid "Iterations|Delete iteration?"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -18869,12 +19180,18 @@ msgstr ""
msgid "Iterations|New iteration cadence"
msgstr ""
+msgid "Iterations|No closed iterations."
+msgstr ""
+
msgid "Iterations|No iteration cadences to show."
msgstr ""
msgid "Iterations|No iterations in cadence."
msgstr ""
+msgid "Iterations|No open iterations."
+msgstr ""
+
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
@@ -18905,6 +19222,9 @@ msgstr ""
msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
msgstr ""
+msgid "Iterations|This will remove the iteration from any issues that are assigned to it."
+msgstr ""
+
msgid "Iterations|Title"
msgstr ""
@@ -18920,15 +19240,9 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "I’m familiar with the basics of DevOps."
-msgstr ""
-
msgid "I’m joining my team who’s already on GitLab"
msgstr ""
-msgid "I’m not familiar with the basics of DevOps."
-msgstr ""
-
msgid "Jaeger URL"
msgstr ""
@@ -19193,6 +19507,9 @@ msgstr ""
msgid "Job"
msgstr ""
+msgid "Job %{jobName}"
+msgstr ""
+
msgid "Job Failed #%{build_id}"
msgstr ""
@@ -19783,9 +20100,6 @@ msgstr ""
msgid "Learn more in the"
msgstr ""
-msgid "Learn more in the|pipeline schedules documentation"
-msgstr ""
-
msgid "Learn more."
msgstr ""
@@ -19897,9 +20211,6 @@ msgstr ""
msgid "Leave Admin Mode"
msgstr ""
-msgid "Leave blank for no limit. Once set, existing personal access tokens may be revoked."
-msgstr ""
-
msgid "Leave edit mode? All unsaved changes will be lost."
msgstr ""
@@ -19945,10 +20256,10 @@ msgstr ""
msgid "LicenseCompliance|Acceptable license to be used in the project"
msgstr ""
-msgid "LicenseCompliance|Add a license"
+msgid "LicenseCompliance|Add license and related policy"
msgstr ""
-msgid "LicenseCompliance|Add license and related policy"
+msgid "LicenseCompliance|Add license policy"
msgstr ""
msgid "LicenseCompliance|Allow"
@@ -20038,6 +20349,9 @@ msgstr ""
msgid "LicenseManagement|Uncategorized"
msgstr ""
+msgid "Licensed Enterprise Edition features can be used if the project namespace's plan includes the feature, or if the project is public."
+msgstr ""
+
msgid "Licensed Features"
msgstr ""
@@ -20104,7 +20418,10 @@ msgstr ""
msgid "Limit namespaces and projects that can be indexed"
msgstr ""
-msgid "Limit sign in from multiple ips"
+msgid "Limit project size at a global, group, and project level. %{link_start}Learn more%{link_end}."
+msgstr ""
+
+msgid "Limit sign in from multiple IP addresses"
msgstr ""
msgid "Limit the number of concurrent operations this secondary site can run in the background."
@@ -20116,11 +20433,17 @@ msgstr ""
msgid "Limit the number of issues and epics per minute a user can create through web and API requests."
msgstr ""
+msgid "Limit the size of Sidekiq jobs stored in Redis."
+msgstr ""
+
msgid "Limited to showing %d event at most"
msgid_plural "Limited to showing %d events at most"
msgstr[0] ""
msgstr[1] ""
+msgid "Limiting mode"
+msgstr ""
+
msgid "Line changes"
msgstr ""
@@ -20190,9 +20513,6 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
-msgid "List of users to be excluded from the limit"
-msgstr ""
-
msgid "List options"
msgstr ""
@@ -20232,9 +20552,6 @@ msgstr ""
msgid "Loading functions timed out. Please reload the page to try again."
msgstr ""
-msgid "Loading issues"
-msgstr ""
-
msgid "Loading more"
msgstr ""
@@ -20526,6 +20843,9 @@ msgstr ""
msgid "Marked For Deletion At - %{deletion_time}"
msgstr ""
+msgid "Marked as ready. Merging is now allowed."
+msgstr ""
+
msgid "Marked this %{noun} as a draft."
msgstr ""
@@ -20598,52 +20918,22 @@ msgstr ""
msgid "Max 100,000 events"
msgstr ""
-msgid "Max 20 characters"
-msgstr ""
-
-msgid "Max Group Export Download requests per minute per user"
-msgstr ""
-
-msgid "Max Group Export requests per minute per user"
-msgstr ""
-
-msgid "Max Group Import requests per minute per user"
-msgstr ""
-
-msgid "Max Project Export Download requests per minute per user"
-msgstr ""
-
-msgid "Max Project Export requests per minute per user"
-msgstr ""
-
-msgid "Max Project Import requests per minute per user"
-msgstr ""
-
-msgid "Max authenticated API requests per period per user"
-msgstr ""
-
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
-msgid "Max authenticated web requests per period per user"
-msgstr ""
-
msgid "Max file size is 200 KB."
msgstr ""
-msgid "Max requests per minute per user"
-msgstr ""
-
msgid "Max role"
msgstr ""
msgid "Max session time"
msgstr ""
-msgid "Max unauthenticated requests per period per IP"
+msgid "MaxBuilds"
msgstr ""
-msgid "MaxBuilds"
+msgid "Maximum 20 characters"
msgstr ""
msgid "Maximum Conan package file size in bytes"
@@ -20679,6 +20969,12 @@ msgstr ""
msgid "Maximum attachment size (MB)"
msgstr ""
+msgid "Maximum authenticated API requests per rate limit period per user"
+msgstr ""
+
+msgid "Maximum authenticated web requests per rate limit period per user"
+msgstr ""
+
msgid "Maximum bulk request size (MiB)"
msgstr ""
@@ -20724,6 +21020,15 @@ msgstr ""
msgid "Maximum files in a diff"
msgstr ""
+msgid "Maximum group export download requests per minute"
+msgstr ""
+
+msgid "Maximum group export requests per minute"
+msgstr ""
+
+msgid "Maximum group import requests per minute"
+msgstr ""
+
msgid "Maximum import size"
msgstr ""
@@ -20760,7 +21065,7 @@ msgstr ""
msgid "Maximum number of projects."
msgstr ""
-msgid "Maximum number of unique IPs per user"
+msgid "Maximum number of unique IP addresses per user."
msgstr ""
msgid "Maximum page reached"
@@ -20769,12 +21074,24 @@ msgstr ""
msgid "Maximum page size"
msgstr ""
+msgid "Maximum project export download requests per minute"
+msgstr ""
+
+msgid "Maximum project export requests per minute"
+msgstr ""
+
+msgid "Maximum project import requests per minute"
+msgstr ""
+
msgid "Maximum push size"
msgstr ""
msgid "Maximum push size (MB)"
msgstr ""
+msgid "Maximum requests per minute"
+msgstr ""
+
msgid "Maximum running slices"
msgstr ""
@@ -20802,10 +21119,16 @@ msgstr ""
msgid "Maximum time between updates that a mirror can have when scheduled to synchronize."
msgstr ""
-msgid "Maximum time for web terminal websocket connection (in seconds). 0 for unlimited."
+msgid "Maximum time that users are allowed to skip the setup of two-factor authentication (in hours). Set to 0 (zero) to enforce at next sign in."
msgstr ""
-msgid "Maximum time that users are allowed to skip the setup of two-factor authentication (in hours). Set to 0 (zero) to enforce at next sign in."
+msgid "Maximum time, in seconds, for a web terminal websocket connection. 0 for unlimited."
+msgstr ""
+
+msgid "Maximum unauthenticated API requests per rate limit period per IP"
+msgstr ""
+
+msgid "Maximum unauthenticated web requests per rate limit period per IP"
msgstr ""
msgid "May"
@@ -20823,9 +21146,6 @@ msgstr ""
msgid "Medium vulnerabilities present"
msgstr ""
-msgid "Member lock"
-msgstr ""
-
msgid "Member since"
msgstr ""
@@ -20862,6 +21182,9 @@ msgstr ""
msgid "Members of a group may only view projects they have permission to access"
msgstr ""
+msgid "Membership"
+msgstr ""
+
msgid "Members|%{time} by %{user}"
msgstr ""
@@ -20922,9 +21245,6 @@ msgstr ""
msgid "Members|Expiration date updated successfully."
msgstr ""
-msgid "Members|Expired"
-msgstr ""
-
msgid "Members|Filter members"
msgstr ""
@@ -20940,9 +21260,6 @@ msgstr ""
msgid "Members|Membership"
msgstr ""
-msgid "Members|No expiration set"
-msgstr ""
-
msgid "Members|Remove \"%{groupName}\""
msgstr ""
@@ -20964,9 +21281,6 @@ msgstr ""
msgid "Members|Search invited"
msgstr ""
-msgid "Members|in %{time}"
-msgstr ""
-
msgid "Member|Deny access"
msgstr ""
@@ -21042,9 +21356,6 @@ msgstr ""
msgid "Merge request %{mr_link} was reviewed by %{mr_author}"
msgstr ""
-msgid "Merge request (MR) approvals"
-msgstr ""
-
msgid "Merge request analytics"
msgstr ""
@@ -21066,12 +21377,21 @@ msgstr ""
msgid "Merge requests"
msgstr ""
+msgid "Merge requests I've created"
+msgstr ""
+
msgid "Merge requests are a place to propose changes you've made to a project and discuss those changes with others"
msgstr ""
msgid "Merge requests are read-only in a secondary Geo node"
msgstr ""
+msgid "Merge requests assigned to me"
+msgstr ""
+
+msgid "Merge requests that I'm a reviewer"
+msgstr ""
+
msgid "Merge the branch and fix any conflicts that come up"
msgstr ""
@@ -21132,10 +21452,10 @@ msgstr ""
msgid "MergeRequests|An error occurred while saving the draft comment."
msgstr ""
-msgid "MergeRequests|Failed to squash. Should be done manually."
+msgid "MergeRequests|Create issue to resolve thread"
msgstr ""
-msgid "MergeRequests|Resolve this thread in a new issue"
+msgid "MergeRequests|Failed to squash. Should be done manually."
msgstr ""
msgid "MergeRequests|Saving the comment failed"
@@ -21949,6 +22269,9 @@ msgstr ""
msgid "MoveIssue|Cannot move issue to project it originates from!"
msgstr ""
+msgid "MoveIssue|Cannot move issues of '%{issue_type}' type."
+msgstr ""
+
msgid "Moved issue to %{label} column in the board."
msgstr ""
@@ -22074,6 +22397,15 @@ 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. To learn more about reducing storage capacity please visit our docs."
msgstr ""
+msgid "NamespaceUserCap|Pending users must be reviewed and approved by a group owner. Learn more about %{user_caps_link_start}User Caps%{link_end} and %{users_pending_approval_link_start}Users Pending Approval%{link_end}."
+msgstr ""
+
+msgid "NamespaceUserCap|View pending user approvals"
+msgstr ""
+
+msgid "NamespaceUserCap|Your group has reached its billable member limit"
+msgstr ""
+
msgid "Namespaces"
msgstr ""
@@ -22116,9 +22448,6 @@ msgstr ""
msgid "Network"
msgstr ""
-msgid "Network Policy|New rule"
-msgstr ""
-
msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is inbound from a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
msgstr ""
@@ -22140,16 +22469,13 @@ msgstr ""
msgid "NetworkPolicies|%{strongOpen}any%{strongClose} port"
msgstr ""
-msgid "NetworkPolicies|+ Add alert"
-msgstr ""
-
msgid "NetworkPolicies|.yaml"
msgstr ""
msgid "NetworkPolicies|.yaml mode"
msgstr ""
-msgid "NetworkPolicies|Actions"
+msgid "NetworkPolicies|Add alert"
msgstr ""
msgid "NetworkPolicies|Alerts are intended to be selectively used for a limited number of events that are potentially concerning and warrant a manual review. Alerts should not be used as a substitute for a SIEM or a logging tool. High volume alerts are likely to be dropped so as to preserve the stability of GitLab's integration with Kubernetes."
@@ -22185,9 +22511,6 @@ msgstr ""
msgid "NetworkPolicies|Deny all traffic"
msgstr ""
-msgid "NetworkPolicies|Description"
-msgstr ""
-
msgid "NetworkPolicies|Edit policy"
msgstr ""
@@ -22200,9 +22523,6 @@ msgstr ""
msgid "NetworkPolicies|IP/subnet"
msgstr ""
-msgid "NetworkPolicies|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
-msgstr ""
-
msgid "NetworkPolicies|Invalid or empty policy"
msgstr ""
@@ -22212,19 +22532,16 @@ msgstr ""
msgid "NetworkPolicies|Kubernetes error: %{error}"
msgstr ""
-msgid "NetworkPolicies|Name"
-msgstr ""
-
msgid "NetworkPolicies|Network"
msgstr ""
-msgid "NetworkPolicies|Network traffic"
+msgid "NetworkPolicies|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
msgstr ""
-msgid "NetworkPolicies|New policy"
+msgid "NetworkPolicies|Network policy can be created after the environment is loaded successfully."
msgstr ""
-msgid "NetworkPolicies|No policies detected"
+msgid "NetworkPolicies|Network traffic"
msgstr ""
msgid "NetworkPolicies|None selected"
@@ -22233,21 +22550,12 @@ msgstr ""
msgid "NetworkPolicies|Please %{installLinkStart}install%{installLinkEnd} and %{configureLinkStart}configure a Kubernetes Agent for this project%{configureLinkEnd} to enable alerts."
msgstr ""
-msgid "NetworkPolicies|Policies are a specification of how groups of pods are allowed to communicate with each other's network endpoints."
-msgstr ""
-
msgid "NetworkPolicies|Policy %{policyName} was successfully changed"
msgstr ""
msgid "NetworkPolicies|Policy definition"
msgstr ""
-msgid "NetworkPolicies|Policy editor"
-msgstr ""
-
-msgid "NetworkPolicies|Policy preview"
-msgstr ""
-
msgid "NetworkPolicies|Rule"
msgstr ""
@@ -22257,9 +22565,6 @@ msgstr ""
msgid "NetworkPolicies|Rule mode is unavailable for this policy. In some cases, we cannot parse the YAML file back into the rules editor."
msgstr ""
-msgid "NetworkPolicies|Rules"
-msgstr ""
-
msgid "NetworkPolicies|Save changes"
msgstr ""
@@ -22272,9 +22577,6 @@ msgstr ""
msgid "NetworkPolicies|Traffic that does not match any rule will be blocked."
msgstr ""
-msgid "NetworkPolicies|Unable to parse policy"
-msgstr ""
-
msgid "NetworkPolicies|all DNS names"
msgstr ""
@@ -22454,6 +22756,9 @@ msgstr ""
msgid "New issue"
msgstr ""
+msgid "New issue in %{project}"
+msgstr ""
+
msgid "New issue title"
msgstr ""
@@ -22532,7 +22837,7 @@ msgstr ""
msgid "Newest first"
msgstr ""
-msgid "Newly registered users will by default be external"
+msgid "Newly-registered users are external by default"
msgstr ""
msgid "Next"
@@ -22847,8 +23152,10 @@ msgstr ""
msgid "No webhooks found, add one in the form above."
msgstr ""
-msgid "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} to renew your subscription."
-msgstr ""
+msgid "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} day to renew your subscription."
+msgid_plural "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} days to renew your subscription."
+msgstr[0] ""
+msgstr[1] ""
msgid "No. of commits"
msgstr ""
@@ -22865,7 +23172,7 @@ msgstr ""
msgid "Nodes"
msgstr ""
-msgid "Non-admin users can sign in with read-only access and make read-only API requests."
+msgid "Non-admin users are restricted to read-only access, in both GitLab UI and API."
msgstr ""
msgid "None"
@@ -22946,7 +23253,7 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
-msgid "Notes Rate Limits"
+msgid "Notes rate limit"
msgstr ""
msgid "Notes|Are you sure you want to cancel creating this comment?"
@@ -23113,9 +23420,6 @@ msgstr ""
msgid "November"
msgstr ""
-msgid "Novice"
-msgstr ""
-
msgid "Now, personalize your GitLab experience"
msgstr ""
@@ -23284,7 +23588,7 @@ msgstr ""
msgid "OnCallSchedules|For this rotation, on-call will be:"
msgstr ""
-msgid "OnCallSchedules|On-call schedule %{schedule} in Project %{project}"
+msgid "OnCallSchedules|On-call schedule %{obstacle} in Project %{project}"
msgstr ""
msgid "OnCallSchedules|On-call schedules"
@@ -23431,22 +23735,22 @@ msgstr ""
msgid "OnDemandScans|Scanner profile"
msgstr ""
-msgid "OnDemandScans|Select one of the existing profiles"
+msgid "OnDemandScans|Schedule scan"
msgstr ""
-msgid "OnDemandScans|Site profile"
+msgid "OnDemandScans|Select one of the existing profiles"
msgstr ""
-msgid "OnDemandScans|Use existing scanner profile"
+msgid "OnDemandScans|Site profile"
msgstr ""
-msgid "OnDemandScans|Use existing site profile"
+msgid "OnDemandScans|Start time"
msgstr ""
-msgid "OnDemandScans|You can either choose a passive scan or validate the target site in your chosen site profile. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
+msgid "OnDemandScans|Use existing scanner profile"
msgstr ""
-msgid "OnDemandScans|You cannot run an active scan against an unvalidated site."
+msgid "OnDemandScans|Use existing site profile"
msgstr ""
msgid "OnDemandScans|You must create a repository within your project to run an on-demand scan."
@@ -23511,6 +23815,9 @@ msgstr ""
msgid "Only admins can delete project"
msgstr ""
+msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
+msgstr ""
+
msgid "Only include features new to your current subscription tier."
msgstr ""
@@ -23529,6 +23836,12 @@ msgstr ""
msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
+msgid "Only reCAPTCHA v2 is supported:"
+msgstr ""
+
+msgid "Only users from the specified IP address ranges are able to reach this group, including all subgroups, projects, and Git repositories."
+msgstr ""
+
msgid "Only verified users with an email address in any of these domains can be added to the group."
msgstr ""
@@ -23715,9 +24028,6 @@ msgstr ""
msgid "Package Registry"
msgstr ""
-msgid "Package Registry Rate Limits"
-msgstr ""
-
msgid "Package Registry: authenticated API requests"
msgstr ""
@@ -23736,6 +24046,9 @@ msgstr ""
msgid "Package recipe already exists"
msgstr ""
+msgid "Package registry rate limits"
+msgstr ""
+
msgid "Package type"
msgstr ""
@@ -23802,6 +24115,9 @@ msgstr ""
msgid "PackageRegistry|Composer"
msgstr ""
+msgid "PackageRegistry|Composer.json with license: %{license} and version: %{version}"
+msgstr ""
+
msgid "PackageRegistry|Conan"
msgstr ""
@@ -23865,6 +24181,9 @@ msgstr ""
msgid "PackageRegistry|Copy require package include"
msgstr ""
+msgid "PackageRegistry|Copy target SHA"
+msgstr ""
+
msgid "PackageRegistry|Copy yarn command"
msgstr ""
@@ -23931,6 +24250,9 @@ msgstr ""
msgid "PackageRegistry|Install package version"
msgstr ""
+msgid "PackageRegistry|Instance-level"
+msgstr ""
+
msgid "PackageRegistry|Invalid Package: failed metadata extraction"
msgstr ""
@@ -23976,6 +24298,9 @@ msgstr ""
msgid "PackageRegistry|Pip Command"
msgstr ""
+msgid "PackageRegistry|Project-level"
+msgstr ""
+
msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
msgstr ""
@@ -23997,6 +24322,9 @@ msgstr ""
msgid "PackageRegistry|Remove package"
msgstr ""
+msgid "PackageRegistry|Required Python: %{pythonVersion}"
+msgstr ""
+
msgid "PackageRegistry|RubyGems"
msgstr ""
@@ -24039,6 +24367,9 @@ msgstr ""
msgid "PackageRegistry|Source project located at %{link}"
msgstr ""
+msgid "PackageRegistry|Target SHA: %{sha}"
+msgstr ""
+
msgid "PackageRegistry|There are no other versions of this package."
msgstr ""
@@ -24207,6 +24538,18 @@ msgstr ""
msgid "Password was successfully updated. Please sign in again."
msgstr ""
+msgid "PasswordPrompt|Confirm password"
+msgstr ""
+
+msgid "PasswordPrompt|Confirm password to continue"
+msgstr ""
+
+msgid "PasswordPrompt|Password is required"
+msgstr ""
+
+msgid "PasswordPrompt|Please enter your password to confirm"
+msgstr ""
+
msgid "Passwords should be unique and not used for any other sites or services."
msgstr ""
@@ -24234,6 +24577,9 @@ msgstr ""
msgid "Paste project path (i.e. gitlab-org/gitlab)"
msgstr ""
+msgid "Paste this DSN into your Sentry SDK"
+msgstr ""
+
msgid "Paste your public SSH key, which is usually contained in the file '~/.ssh/id_ed25519.pub' or '~/.ssh/id_rsa.pub' and begins with 'ssh-ed25519' or 'ssh-rsa'. Do not paste your private SSH key, as that can compromise your identity."
msgstr ""
@@ -24318,6 +24664,9 @@ msgstr ""
msgid "PerformanceBar|First Contentful Paint"
msgstr ""
+msgid "PerformanceBar|Flamegraph with mode:"
+msgstr ""
+
msgid "PerformanceBar|Frontend resources"
msgstr ""
@@ -24351,6 +24700,15 @@ msgstr ""
msgid "PerformanceBar|Trace"
msgstr ""
+msgid "PerformanceBar|cpu"
+msgstr ""
+
+msgid "PerformanceBar|object"
+msgstr ""
+
+msgid "PerformanceBar|wall"
+msgstr ""
+
msgid "Period in seconds"
msgstr ""
@@ -24579,6 +24937,48 @@ msgstr ""
msgid "PipelineSchedules|Variables"
msgstr ""
+msgid "PipelineSource|API"
+msgstr ""
+
+msgid "PipelineSource|Chat"
+msgstr ""
+
+msgid "PipelineSource|External"
+msgstr ""
+
+msgid "PipelineSource|External Pull Request"
+msgstr ""
+
+msgid "PipelineSource|Merge Request"
+msgstr ""
+
+msgid "PipelineSource|On-Demand DAST Scan"
+msgstr ""
+
+msgid "PipelineSource|On-Demand DAST Validation"
+msgstr ""
+
+msgid "PipelineSource|Parent Pipeline"
+msgstr ""
+
+msgid "PipelineSource|Pipeline"
+msgstr ""
+
+msgid "PipelineSource|Push"
+msgstr ""
+
+msgid "PipelineSource|Schedule"
+msgstr ""
+
+msgid "PipelineSource|Trigger"
+msgstr ""
+
+msgid "PipelineSource|Web"
+msgstr ""
+
+msgid "PipelineSource|Web IDE"
+msgstr ""
+
msgid "PipelineStatusTooltip|Pipeline: %{ciStatus}"
msgstr ""
@@ -24879,46 +25279,7 @@ msgstr ""
msgid "Pipeline|Source"
msgstr ""
-msgid "Pipeline|Source|API"
-msgstr ""
-
-msgid "Pipeline|Source|Chat"
-msgstr ""
-
-msgid "Pipeline|Source|External"
-msgstr ""
-
-msgid "Pipeline|Source|External Pull Request"
-msgstr ""
-
-msgid "Pipeline|Source|Merge Request"
-msgstr ""
-
-msgid "Pipeline|Source|On-Demand DAST Scan"
-msgstr ""
-
-msgid "Pipeline|Source|On-Demand DAST Validation"
-msgstr ""
-
-msgid "Pipeline|Source|Parent Pipeline"
-msgstr ""
-
-msgid "Pipeline|Source|Pipeline"
-msgstr ""
-
-msgid "Pipeline|Source|Push"
-msgstr ""
-
-msgid "Pipeline|Source|Schedule"
-msgstr ""
-
-msgid "Pipeline|Source|Trigger"
-msgstr ""
-
-msgid "Pipeline|Source|Web"
-msgstr ""
-
-msgid "Pipeline|Source|Web IDE"
+msgid "Pipeline|Source|Security Policy"
msgstr ""
msgid "Pipeline|Specify variable values to be used in this run. The values specified in %{linkStart}CI/CD settings%{linkEnd} will be used by default."
@@ -24969,7 +25330,7 @@ msgstr ""
msgid "Pipeline|We are currently unable to fetch pipeline data"
msgstr ""
-msgid "Pipeline|You’re about to stop pipeline %{pipelineId}."
+msgid "Pipeline|You’re about to stop pipeline #%{pipelineId}."
msgstr ""
msgid "Pipeline|for"
@@ -24996,6 +25357,9 @@ msgstr ""
msgid "Plain diff"
msgstr ""
+msgid "Plain-text response to send to clients that hit a rate limit"
+msgstr ""
+
msgid "Plan:"
msgstr ""
@@ -25140,9 +25504,6 @@ msgstr ""
msgid "Please provide attributes to update"
msgstr ""
-msgid "Please provide your username or email address."
-msgstr ""
-
msgid "Please reach out if you have any questions and we'll be happy to assist."
msgstr ""
@@ -25185,9 +25546,6 @@ msgstr ""
msgid "Please set a new password before proceeding."
msgstr ""
-msgid "Please share your feedback about %{featureName} %{linkStart}in this issue%{linkEnd} to help us improve the experience."
-msgstr ""
-
msgid "Please solve the captcha"
msgstr ""
@@ -25365,6 +25723,9 @@ msgstr ""
msgid "Prevent adding new members to project membership within this group"
msgstr ""
+msgid "Prevent auto-stopping"
+msgstr ""
+
msgid "Prevent editing approval rules in projects and merge requests."
msgstr ""
@@ -25377,7 +25738,7 @@ msgstr ""
msgid "Prevent users from changing their profile name"
msgstr ""
-msgid "Prevent users from performing write operations on GitLab while performing maintenance."
+msgid "Prevent users from performing write operations while GitLab maintenance is in progress."
msgstr ""
msgid "Preview"
@@ -25650,6 +26011,9 @@ msgstr ""
msgid "Profiles|Enter your name, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Enter your password to confirm the email change"
+msgstr ""
+
msgid "Profiles|Enter your pronouns to let people know how to refer to you"
msgstr ""
@@ -25884,10 +26248,10 @@ msgstr ""
msgid "Profiles|e.g. My MacBook key"
msgstr ""
-msgid "Profiles|username"
+msgid "Profiles|https://website.com"
msgstr ""
-msgid "Profiles|website.com"
+msgid "Profiles|username"
msgstr ""
msgid "Profiles|your account"
@@ -26130,9 +26494,21 @@ msgstr ""
msgid "ProjectSelect| or group"
msgstr ""
+msgid "ProjectSelect|No matching results"
+msgstr ""
+
msgid "ProjectSelect|Search for project"
msgstr ""
+msgid "ProjectSelect|Search projects"
+msgstr ""
+
+msgid "ProjectSelect|Select a project"
+msgstr ""
+
+msgid "ProjectSelect|There was an error fetching the projects. Please try again."
+msgstr ""
+
msgid "ProjectService|Drone server URL"
msgstr ""
@@ -26220,6 +26596,9 @@ msgstr ""
msgid "ProjectService|Trigger event when a new, unique alert is recorded."
msgstr ""
+msgid "ProjectService|Trigger event when a new, unique vulnerability is recorded. (Note: This feature requires an Ultimate plan.)"
+msgstr ""
+
msgid "ProjectService|Trigger event when a pipeline status changes."
msgstr ""
@@ -26634,9 +27013,15 @@ msgstr ""
msgid "Projects are graded based on the highest severity vulnerability present"
msgstr ""
+msgid "Projects are organized into groups"
+msgstr ""
+
msgid "Projects contributed to"
msgstr ""
+msgid "Projects help you organize your work. They contain your file repository, issues, merge requests, and so much more."
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr ""
@@ -26871,10 +27256,10 @@ msgstr ""
msgid "PrometheusService|Prometheus cluster integration"
msgstr ""
-msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
+msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
msgstr ""
-msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
+msgid "PrometheusService|The ID of the IAP-secured resource."
msgstr ""
msgid "PrometheusService|The Prometheus API base URL."
@@ -27492,6 +27877,9 @@ msgstr ""
msgid "Rate limit"
msgstr ""
+msgid "Rate limits can help reduce request volume (like from crawlers or abusive bots)."
+msgstr ""
+
msgid "Raw blob request rate limit per minute"
msgstr ""
@@ -27504,6 +27892,9 @@ msgstr ""
msgid "Re-authentication required"
msgstr ""
+msgid "Re-import"
+msgstr ""
+
msgid "Re-request review"
msgstr ""
@@ -27525,6 +27916,9 @@ msgstr ""
msgid "Read more about related issues"
msgstr ""
+msgid "Read their documentation."
+msgstr ""
+
msgid "Ready to get started with GitLab? Follow these steps to set up your workspace, plan and commit changes, and deploy your project."
msgstr ""
@@ -27558,6 +27952,9 @@ msgstr ""
msgid "Receive any notifications from GitLab."
msgstr ""
+msgid "Receive notification of abuse reports by email."
+msgstr ""
+
msgid "Receive notifications about your own activity"
msgstr ""
@@ -27701,9 +28098,6 @@ msgstr ""
msgid "Registry setup"
msgstr ""
-msgid "Regulate approvals by authors/committers. Affects all projects."
-msgstr ""
-
msgid "Reindexing Status: %{status} (Slice multiplier: %{multiplier}, Maximum running slices: %{max_slices})"
msgstr ""
@@ -27799,6 +28193,9 @@ msgstr ""
msgid "Release|Something went wrong while saving the release details."
msgstr ""
+msgid "Reload page"
+msgstr ""
+
msgid "Remediations"
msgstr ""
@@ -28081,6 +28478,9 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
+msgid "Repeats"
+msgstr ""
+
msgid "Replace"
msgstr ""
@@ -28443,10 +28843,7 @@ msgstr ""
msgid "Require additional authentication for administrative tasks."
msgstr ""
-msgid "Require all users in this group to setup Two-factor authentication"
-msgstr ""
-
-msgid "Require all users in this group to setup two-factor authentication"
+msgid "Require all users in this group to set up two-factor authentication"
msgstr ""
msgid "Required approvals (%{approvals_given} given)"
@@ -28492,6 +28889,9 @@ msgstr[1] ""
msgid "Requires values to meet regular expression requirements."
msgstr ""
+msgid "Requires you to deploy or set up cloud-hosted Sentry."
+msgstr ""
+
msgid "Requires your primary GitLab email address."
msgstr ""
@@ -28552,9 +28952,6 @@ msgstr ""
msgid "Resolve"
msgstr ""
-msgid "Resolve all threads in new issue"
-msgstr ""
-
msgid "Resolve conflicts"
msgstr ""
@@ -28612,6 +29009,9 @@ msgstr ""
msgid "Response text"
msgstr ""
+msgid "Restart GitLab to apply changes."
+msgstr ""
+
msgid "Restart Terminal"
msgstr ""
@@ -28630,6 +29030,9 @@ msgstr ""
msgid "Restoring the project will prevent the project from being removed on this date and restore people's ability to make changes to it."
msgstr ""
+msgid "Restrict group access by IP address. %{link_start}Learn more%{link_end}."
+msgstr ""
+
msgid "Restrict membership by email domain"
msgstr ""
@@ -28943,6 +29346,9 @@ msgstr ""
msgid "Runners|Runner #%{runner_id}"
msgstr ""
+msgid "Runners|Runner assigned to project."
+msgstr ""
+
msgid "Runners|Runner is offline, last contact was %{runner_contact} ago"
msgstr ""
@@ -28955,6 +29361,9 @@ msgstr ""
msgid "Runners|Runner registration"
msgstr ""
+msgid "Runners|Runner unassigned from project."
+msgstr ""
+
msgid "Runners|Runners"
msgstr ""
@@ -29147,7 +29556,7 @@ msgstr ""
msgid "SastEntryPoints|How do I set up SAST?"
msgstr ""
-msgid "SastEntryPoints|Learn more."
+msgid "SastEntryPoints|Learn more"
msgstr ""
msgid "Satisfied"
@@ -29189,7 +29598,7 @@ msgstr ""
msgid "Save pipeline schedule"
msgstr ""
-msgid "Save space and find images in the container Registry. remove unneeded tags and keep only the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
+msgid "Save storage space by automatically deleting tags from the container registry and keeping the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
msgstr ""
msgid "Saving"
@@ -29363,6 +29772,9 @@ msgstr ""
msgid "Search or filter results…"
msgstr ""
+msgid "Search or jump to..."
+msgstr ""
+
msgid "Search project"
msgstr ""
@@ -29423,16 +29835,16 @@ msgstr ""
msgid "SearchCodeResults|of %{link_to_project}"
msgstr ""
-msgid "SearchResults|Showing %{count} %{scope} for%{term_element}"
+msgid "SearchResults|Showing %{count} %{scope} for %{term_element}"
msgstr ""
-msgid "SearchResults|Showing %{count} %{scope} for%{term_element} in your personal and project snippets"
+msgid "SearchResults|Showing %{count} %{scope} for %{term_element} in your personal and project snippets"
msgstr ""
-msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for%{term_element}"
+msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for %{term_element}"
msgstr ""
-msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for%{term_element} in your personal and project snippets"
+msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for %{term_element} in your personal and project snippets"
msgstr ""
msgid "SearchResults|code result"
@@ -29514,6 +29926,9 @@ msgstr ""
msgid "Secret Detection"
msgstr ""
+msgid "Secret access key"
+msgstr ""
+
msgid "Secret token"
msgstr ""
@@ -29553,9 +29968,6 @@ msgstr ""
msgid "SecurityApprovals|A merge request approval is required when the license compliance report contains a denied license."
msgstr ""
-msgid "SecurityApprovals|Configurable if security scanners are enabled. %{linkStart}Learn more.%{linkEnd}"
-msgstr ""
-
msgid "SecurityApprovals|Coverage-Check"
msgstr ""
@@ -29568,24 +29980,18 @@ msgstr ""
msgid "SecurityApprovals|Learn more about Vulnerability-Check"
msgstr ""
-msgid "SecurityApprovals|License Scanning must be enabled. %{linkStart}Learn more%{linkEnd}."
-msgstr ""
-
msgid "SecurityApprovals|License-Check"
msgstr ""
msgid "SecurityApprovals|Requires approval for Denied licenses. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}More information%{linkEnd}"
+msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "SecurityApprovals|Requires approval for vulnerabilities. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
-msgid "SecurityApprovals|Test coverage must be enabled. %{linkStart}Learn more%{linkEnd}."
-msgstr ""
-
msgid "SecurityApprovals|Vulnerability-Check"
msgstr ""
@@ -29649,6 +30055,12 @@ msgstr ""
msgid "SecurityConfiguration|Immediately begin risk analysis and remediation with application security features. Start with SAST and Secret Detection, available to all plans. Upgrade to Ultimate to get all features, including:"
msgstr ""
+msgid "SecurityConfiguration|Manage corpus"
+msgstr ""
+
+msgid "SecurityConfiguration|Manage corpus files used as mutation sources in coverage fuzzing."
+msgstr ""
+
msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
msgstr ""
@@ -29703,6 +30115,12 @@ msgstr ""
msgid "SecurityOrchestration|Action"
msgstr ""
+msgid "SecurityOrchestration|Actions"
+msgstr ""
+
+msgid "SecurityOrchestration|Add rule"
+msgstr ""
+
msgid "SecurityOrchestration|All policies"
msgstr ""
@@ -29736,9 +30154,6 @@ msgstr ""
msgid "SecurityOrchestration|Network"
msgstr ""
-msgid "SecurityOrchestration|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
-msgstr ""
-
msgid "SecurityOrchestration|New policy"
msgstr ""
@@ -29754,6 +30169,9 @@ msgstr ""
msgid "SecurityOrchestration|Policy editor"
msgstr ""
+msgid "SecurityOrchestration|Policy preview"
+msgstr ""
+
msgid "SecurityOrchestration|Policy status"
msgstr ""
@@ -29763,6 +30181,9 @@ msgstr ""
msgid "SecurityOrchestration|Rule"
msgstr ""
+msgid "SecurityOrchestration|Rules"
+msgstr ""
+
msgid "SecurityOrchestration|Scan Execution"
msgstr ""
@@ -29856,6 +30277,9 @@ msgstr ""
msgid "SecurityReports|Create issue"
msgstr ""
+msgid "SecurityReports|Development vulnerabilities"
+msgstr ""
+
msgid "SecurityReports|Dismiss vulnerability"
msgstr ""
@@ -29871,6 +30295,9 @@ msgstr ""
msgid "SecurityReports|Download results"
msgstr ""
+msgid "SecurityReports|Download scanned URLs"
+msgstr ""
+
msgid "SecurityReports|Download scanned resources"
msgstr ""
@@ -29994,6 +30421,9 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
+msgid "SecurityReports|The Vulnerability Report shows the results of the lastest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "SecurityReports|The security reports below contain one or more vulnerability findings that could not be parsed and were not recorded. Download the artifacts in the job output to investigate. Ensure any security report created conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
msgstr ""
@@ -30135,10 +30565,10 @@ msgstr ""
msgid "Select a repository"
msgstr ""
-msgid "Select a role"
+msgid "Select a repository containing templates for common files."
msgstr ""
-msgid "Select a shared template repository for all projects on this instance."
+msgid "Select a role"
msgstr ""
msgid "Select a template repository"
@@ -30216,6 +30646,9 @@ msgstr ""
msgid "Select project to choose zone"
msgstr ""
+msgid "Select project to create issue"
+msgstr ""
+
msgid "Select projects"
msgstr ""
@@ -30333,6 +30766,9 @@ msgstr ""
msgid "Send emails to help guide new users through the onboarding process."
msgstr ""
+msgid "Send emails to users upon account deactivation."
+msgstr ""
+
msgid "Send message"
msgstr ""
@@ -30351,6 +30787,9 @@ msgstr ""
msgid "Send service data"
msgstr ""
+msgid "Sentry"
+msgstr ""
+
msgid "Sentry API URL"
msgstr ""
@@ -30465,6 +30904,9 @@ msgstr ""
msgid "Service"
msgstr ""
+msgid "Service Accounts keys are required to authorize GitLab to deploy your Google Cloud project."
+msgstr ""
+
msgid "Service Desk"
msgstr ""
@@ -30537,15 +30979,15 @@ msgstr ""
msgid "Set a password on your account to pull or push via %{protocol}."
msgstr ""
-msgid "Set a template repository for projects in this group"
-msgstr ""
-
msgid "Set access permissions for this token."
msgstr ""
msgid "Set an instance-wide domain that will be available to all clusters when installing Knative."
msgstr ""
+msgid "Set any rate limit to %{code_open}0%{code_close} to disable the limit."
+msgstr ""
+
msgid "Set default and restrict visibility levels. Configure import sources and git access protocol."
msgstr ""
@@ -30558,7 +31000,7 @@ msgstr ""
msgid "Set limit to 0 to allow any file size."
msgstr ""
-msgid "Set max session time for web terminal."
+msgid "Set limits for web and API requests."
msgstr ""
msgid "Set milestone"
@@ -30567,15 +31009,18 @@ msgstr ""
msgid "Set new password"
msgstr ""
-msgid "Set notification email for abuse reports."
+msgid "Set parent epic to an epic"
msgstr ""
-msgid "Set parent epic to an epic"
+msgid "Set per-user rate limits for imports and exports of projects and groups."
msgstr ""
msgid "Set projects and maximum size limits, session duration, user options, and check feature availability for namespace plan."
msgstr ""
+msgid "Set rate limits for package registry API requests that supersede the general user and IP rate limits."
+msgstr ""
+
msgid "Set severity"
msgstr ""
@@ -30594,15 +31039,24 @@ msgstr ""
msgid "Set the default branch for this project. All merge requests and commits are made against this branch unless you specify a different one."
msgstr ""
+msgid "Set the default expiration time for job artifacts in all projects. Set to %{code_open}0%{code_close} to never expire artifacts by default. If no unit is written, it defaults to seconds. For example, these are all equivalent: %{code_open}3600%{code_close}, %{code_open}60 minutes%{code_close}, or %{code_open}one hour%{code_close}."
+msgstr ""
+
msgid "Set the due date to %{due_date}."
msgstr ""
msgid "Set the iteration to %{iteration_reference}."
msgstr ""
+msgid "Set the maximum session time for a web terminal."
+msgstr ""
+
msgid "Set the milestone to %{milestone_reference}."
msgstr ""
+msgid "Set the per-user rate limit for notes created by web or API requests."
+msgstr ""
+
msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
msgstr ""
@@ -30804,6 +31258,9 @@ msgstr ""
msgid "Show Pipeline IID"
msgstr ""
+msgid "Show all %{issuable_type}."
+msgstr ""
+
msgid "Show all activity"
msgstr ""
@@ -30855,15 +31312,9 @@ msgstr ""
msgid "Show list"
msgstr ""
-msgid "Show me advanced features"
-msgstr ""
-
msgid "Show me how to add a pipeline"
msgstr ""
-msgid "Show me the basics"
-msgstr ""
-
msgid "Show one file at a time"
msgstr ""
@@ -30904,15 +31355,15 @@ msgstr ""
msgid "Showing %{pageSize} of %{total} %{issuableType}"
msgstr ""
-msgid "Showing %{pageSize} of %{total} issues"
-msgstr ""
-
msgid "Showing all epics"
msgstr ""
msgid "Showing all issues"
msgstr ""
+msgid "Showing data for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
+msgstr ""
+
msgid "Showing data for workflow items created in this date range. Date range cannot exceed %{maxDateRange} days."
msgstr ""
@@ -30952,6 +31403,15 @@ msgstr ""
msgid "Sidebar|Weight"
msgstr ""
+msgid "Sidekiq job compression threshold (bytes)"
+msgstr ""
+
+msgid "Sidekiq job size limit (bytes)"
+msgstr ""
+
+msgid "Sidekiq job size limits"
+msgstr ""
+
msgid "Sign in"
msgstr ""
@@ -31072,6 +31532,9 @@ msgstr ""
msgid "Site profile not found for given parameters"
msgstr ""
+msgid "Sites"
+msgstr ""
+
msgid "Size"
msgstr ""
@@ -31102,19 +31565,22 @@ msgstr ""
msgid "SlackIntegration|Sends notifications about project events to Slack channels."
msgstr ""
-msgid "SlackService|2. Paste the %{strong_open}Token%{strong_close} into the field below"
+msgid "SlackService|1. %{slash_command_link_start}Add a slash command%{slash_command_link_end} in your Slack team using this information:"
msgstr ""
-msgid "SlackService|3. Select the %{strong_open}Active%{strong_close} checkbox, press %{strong_open}Save changes%{strong_close} and start using GitLab inside Slack!"
+msgid "SlackService|2. Paste the token from Slack in the %{strong_open}Token%{strong_close} field below."
msgstr ""
-msgid "SlackService|Fill in the word that works best for your team."
+msgid "SlackService|3. Select the %{strong_open}Active%{strong_close} checkbox, select %{strong_open}Save changes%{strong_close}, and start using slash commands in Slack!"
+msgstr ""
+
+msgid "SlackService|After setup, get a list of available Slack slash commands by entering"
msgstr ""
-msgid "SlackService|See list of available commands in Slack after setting up this service, by entering"
+msgid "SlackService|Fill in the word that works best for your team."
msgstr ""
-msgid "SlackService|This service allows users to perform common operations on this project by entering slash commands in Slack."
+msgid "SlackService|Perform common operations in this project by entering slash commands in Slack."
msgstr ""
msgid "Slice multiplier"
@@ -31180,7 +31646,7 @@ msgstr ""
msgid "Some child epics may be hidden due to applied filters"
msgstr ""
-msgid "Some common domains are not allowed. %{read_more_link}."
+msgid "Some common domains are not allowed. %{learn_more_link}."
msgstr ""
msgid "Some of the designs you tried uploading did not change:"
@@ -31264,9 +31730,6 @@ msgstr ""
msgid "Something went wrong while exporting requirements"
msgstr ""
-msgid "Something went wrong while fetching %{listType} list"
-msgstr ""
-
msgid "Something went wrong while fetching branches"
msgstr ""
@@ -31321,15 +31784,9 @@ msgstr ""
msgid "Something went wrong while merging this merge request. Please try again."
msgstr ""
-msgid "Something went wrong while moving issues."
-msgstr ""
-
msgid "Something went wrong while obtaining the Let's Encrypt certificate."
msgstr ""
-msgid "Something went wrong while performing the action."
-msgstr ""
-
msgid "Something went wrong while promoting the issue to an epic. Please try again."
msgstr ""
@@ -31657,7 +32114,10 @@ msgstr ""
msgid "SourcegraphPreferences|Uses a custom %{linkStart}Sourcegraph instance%{linkEnd}."
msgstr ""
-msgid "Spam Check API Key"
+msgid "Spam Check"
+msgstr ""
+
+msgid "Spam Check API key"
msgstr ""
msgid "Spam Logs"
@@ -31675,7 +32135,7 @@ msgstr ""
msgid "Specified URL cannot be used: \"%{reason}\""
msgstr ""
-msgid "Specify an e-mail address regex pattern to identify default internal users."
+msgid "Specify an email address regex pattern to identify default internal users."
msgstr ""
msgid "Speed up your pipelines with Needs relationships"
@@ -31930,7 +32390,7 @@ msgstr ""
msgid "StatusCheck|An error occurred fetching the status checks."
msgstr ""
-msgid "StatusCheck|Apply this status check to any branch or a specific protected branch."
+msgid "StatusCheck|Apply this status check to all branches or a specific protected branch."
msgstr ""
msgid "StatusCheck|Check for a status response in Merge Requests. Failures do not block merges. %{link_start}Learn more%{link_end}."
@@ -32269,6 +32729,9 @@ msgstr ""
msgid "Subscriptions"
msgstr ""
+msgid "Subscription|Your subscription for %{strong}%{namespace_name}%{strong_close} has expired and you are now on %{pricing_link_start}the GitLab Free tier%{pricing_link_end}. Don't worry, your data is safe. Get in touch with our support team (%{support_email}). They'll gladly help with your subscription renewal."
+msgstr ""
+
msgid "Subtracted"
msgstr ""
@@ -32497,6 +32960,9 @@ msgstr ""
msgid "SuperSonics|Plan"
msgstr ""
+msgid "SuperSonics|Please agree to the Subscription Agreement"
+msgstr ""
+
msgid "SuperSonics|Ready to get started? A GitLab plan is ideal for scaling organizations and for multi team usage."
msgstr ""
@@ -32527,6 +32993,9 @@ msgstr ""
msgid "SuperSonics|The activation code is not valid. Please make sure to copy it exactly from the Customers Portal or confirmation email. Learn more about %{linkStart}activating your subscription%{linkEnd}."
msgstr ""
+msgid "SuperSonics|The activation code should be a 24-character alphanumeric string"
+msgstr ""
+
msgid "SuperSonics|There is a connectivity issue."
msgstr ""
@@ -32569,9 +33038,15 @@ msgstr ""
msgid "SuperSonics|You do not have an active subscription"
msgstr ""
+msgid "SuperSonics|You have successfully added a license that activates on %{date}. Please see the subscription history table below for more details."
+msgstr ""
+
msgid "SuperSonics|You'll be charged for %{trueUpLinkStart}users over license%{trueUpLinkEnd} on a quarterly or annual basis, depending on the terms of your agreement."
msgstr ""
+msgid "SuperSonics|Your future dated license was successfully added"
+msgstr ""
+
msgid "SuperSonics|Your subscription"
msgstr ""
@@ -32824,7 +33299,7 @@ msgstr ""
msgid "Template to append to all Service Desk issues"
msgstr ""
-msgid "TemplateRepository|Select a repository to make its templates available to all projects. %{link_start}What should the repository contain?%{link_end} "
+msgid "TemplateRepository|Create common files more quickly, and standardize their format."
msgstr ""
msgid "Templates"
@@ -33030,7 +33505,7 @@ msgstr ""
msgid "TestCases|Search test cases"
msgstr ""
-msgid "TestCases|Something went wrong while adding test case to Todo."
+msgid "TestCases|Something went wrong while adding test case to a to-do item."
msgstr ""
msgid "TestCases|Something went wrong while creating a test case."
@@ -33042,7 +33517,7 @@ msgstr ""
msgid "TestCases|Something went wrong while fetching test cases list."
msgstr ""
-msgid "TestCases|Something went wrong while marking test case todo as done."
+msgid "TestCases|Something went wrong while marking test case to-do item as done."
msgstr ""
msgid "TestCases|Something went wrong while moving test case."
@@ -33162,7 +33637,7 @@ msgstr ""
msgid "Thanks for your purchase!"
msgstr ""
-msgid "That is ok, I do not want to renew"
+msgid "That's OK, I don't want to renew"
msgstr ""
msgid "That's it, well done!"
@@ -33185,7 +33660,7 @@ msgid_plural "The %{type} contains the following errors:"
msgstr[0] ""
msgstr[1] ""
-msgid "The API key used by GitLab for accessing the Spam Check service endpoint"
+msgid "The API key used by GitLab for accessing the Spam Check service endpoint."
msgstr ""
msgid "The GitLab subscription service (customers.gitlab.com) is currently experiencing an outage. You can monitor the status and get updates at %{linkStart}status.gitlab.com%{linkEnd}."
@@ -33224,9 +33699,6 @@ msgstr ""
msgid "The URL to use for connecting to Elasticsearch. Use a comma-separated list to support clustering (e.g., \"http://localhost:9200, http://localhost:9201\")."
msgstr ""
-msgid "The Vulnerability Report shows the results of the last successful pipeline run on the default branch."
-msgstr ""
-
msgid "The X509 Certificate to use when mutual TLS is required to communicate with the external authorization service. If left blank, the server certificate is still validated when accessing over HTTPS."
msgstr ""
@@ -33284,9 +33756,6 @@ msgstr ""
msgid "The default branch for this project has been changed. Please update your bookmarks."
msgstr ""
-msgid "The default expiration time for job artifacts. 0 for unlimited. The default unit is in seconds, but you can use other units, for example %{code_open}4 mins 2 sec%{code_close}, %{code_open}2h42min%{code_close}."
-msgstr ""
-
msgid "The dependency list details information about the components used within your project."
msgstr ""
@@ -33478,9 +33947,6 @@ msgstr ""
msgid "The merge conflicts for this merge request have already been resolved. Please return to the merge request."
msgstr ""
-msgid "The merge request can now be merged."
-msgstr ""
-
msgid "The metric must be one of %{metrics}."
msgstr ""
@@ -33856,7 +34322,7 @@ msgstr ""
msgid "There was a problem updating the keep latest artifacts setting."
msgstr ""
-msgid "There was an error %{message} todo."
+msgid "There was an error %{message} to-do item."
msgstr ""
msgid "There was an error adding a To Do."
@@ -33895,6 +34361,9 @@ msgstr ""
msgid "There was an error fetching projects"
msgstr ""
+msgid "There was an error fetching search autocomplete suggestions"
+msgstr ""
+
msgid "There was an error fetching stage total counts"
msgstr ""
@@ -34219,6 +34688,9 @@ msgstr ""
msgid "This field is required."
msgstr ""
+msgid "This form is disabled in preview"
+msgstr ""
+
msgid "This group"
msgstr ""
@@ -34240,9 +34712,6 @@ msgstr ""
msgid "This group is linked to a subscription"
msgstr ""
-msgid "This group, including all subgroups, projects and git repositories, will be reachable from only the specified IP address ranges."
-msgstr ""
-
msgid "This group, its subgroups and projects has been scheduled for removal on %{date}."
msgstr ""
@@ -34522,9 +34991,6 @@ msgstr ""
msgid "This user cannot be unlocked manually from GitLab"
msgstr ""
-msgid "This user does not have a pending request"
-msgstr ""
-
msgid "This user has an unconfirmed email address (%{email}). You may force a confirmation."
msgstr ""
@@ -34633,9 +35099,6 @@ msgstr ""
msgid "ThreatMonitoring|Packet Activity"
msgstr ""
-msgid "ThreatMonitoring|Policies"
-msgstr ""
-
msgid "ThreatMonitoring|Requests"
msgstr ""
@@ -34687,6 +35150,12 @@ msgstr ""
msgid "ThreatMonitoring|View documentation"
msgstr ""
+msgid "Threshold in bytes at which to compress Sidekiq job arguments."
+msgstr ""
+
+msgid "Threshold in bytes at which to reject Sidekiq jobs. Set this to 0 to if you don't want to limit Sidekiq jobs."
+msgstr ""
+
msgid "Throughput"
msgstr ""
@@ -34696,6 +35165,9 @@ msgstr ""
msgid "Time"
msgstr ""
+msgid "Time (in hours) that users are allowed to skip forced configuration of two-factor authentication."
+msgstr ""
+
msgid "Time Spent"
msgstr ""
@@ -34762,7 +35234,7 @@ msgstr ""
msgid "TimeTrackingEstimated|Est"
msgstr ""
-msgid "TimeTracking|%{startTag}Spent: %{endTag}%{timeSpentHumanReadable}"
+msgid "TimeTracking|%{spentStart}Spent: %{spentEnd}"
msgstr ""
msgid "TimeTracking|Estimated:"
@@ -34976,6 +35448,9 @@ msgstr ""
msgid "To access this domain create a new DNS record"
msgstr ""
+msgid "To add a custom suffix, set up a Service Desk email address. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "To add an SSH key you need to %{generate_link_start}generate one%{link_end} or use an %{existing_link_start}existing key%{link_end}."
msgstr ""
@@ -34997,13 +35472,16 @@ msgstr ""
msgid "To connect an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To continue using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
+msgstr ""
+
msgid "To continue, you need to select the link in the confirmation email we sent to verify your email address. If you didn't get our email, select %{strongStart}Resend confirmation email.%{strongEnd}"
msgstr ""
msgid "To define internal users, first enable new users set to external"
msgstr ""
-msgid "To enable Registration Features, make sure \"Enable service ping\" is checked."
+msgid "To enable Registration Features, first enable Service Ping."
msgstr ""
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
@@ -35030,7 +35508,7 @@ msgstr ""
msgid "To get started, use the link below to confirm your account."
msgstr ""
-msgid "To help improve GitLab and its user experience, GitLab will periodically collect usage information."
+msgid "To help improve GitLab and its user experience, GitLab periodically collects usage information."
msgstr ""
msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
@@ -35063,7 +35541,7 @@ msgstr ""
msgid "To preserve performance only %{strong_open}%{display_size} of %{real_size}%{strong_close} files are displayed."
msgstr ""
-msgid "To protect this issue's confidentiality, %{forkLink} and set the fork's visibility to private."
+msgid "To protect this issue's confidentiality, %{linkStart}fork this project%{linkEnd} and set the fork's visibility to private."
msgstr ""
msgid "To protect this issue's confidentiality, a private fork of this project was selected."
@@ -35096,12 +35574,15 @@ msgstr ""
msgid "To set up SAML authentication for your group through an identity provider like Azure, Okta, Onelogin, Ping Identity, or your custom SAML 2.0 provider:"
msgstr ""
-msgid "To set up this service:"
+msgid "To set up this integration:"
msgstr ""
msgid "To specify the notification level per project of a group you belong to, you need to visit project page and change notification level there."
msgstr ""
+msgid "To start using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
+msgstr ""
+
msgid "To unsubscribe from this issue, please paste the following link into your browser:"
msgstr ""
@@ -35689,9 +36170,6 @@ msgstr ""
msgid "Unable to fetch branches list, please close the form and try again"
msgstr ""
-msgid "Unable to fetch unscanned projects"
-msgstr ""
-
msgid "Unable to fetch vulnerable projects"
msgstr ""
@@ -35746,6 +36224,15 @@ msgstr ""
msgid "Unable to update this issue at this time."
msgstr ""
+msgid "Unapprove a merge request"
+msgstr ""
+
+msgid "Unapprove the current merge request."
+msgstr ""
+
+msgid "Unapproved the current merge request."
+msgstr ""
+
msgid "Unarchive project"
msgstr ""
@@ -35758,16 +36245,13 @@ msgstr ""
msgid "Unassigned"
msgstr ""
-msgid "Unauthenticated API request rate limit"
-msgstr ""
-
-msgid "Unauthenticated rate limit period in seconds"
+msgid "Unauthenticated API rate limit period in seconds"
msgstr ""
-msgid "Unauthenticated request rate limit"
+msgid "Unauthenticated requests"
msgstr ""
-msgid "Unauthenticated requests"
+msgid "Unauthenticated web rate limit period in seconds"
msgstr ""
msgid "Undo"
@@ -35869,18 +36353,6 @@ msgstr ""
msgid "Unresolved"
msgstr ""
-msgid "UnscannedProjects|15 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|30 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|5 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|60 or more days"
-msgstr ""
-
msgid "Unschedule job"
msgstr ""
@@ -36100,6 +36572,9 @@ msgstr ""
msgid "UsageQuota|%{help_link_start}Shared runners%{help_link_end} are disabled, so there are no limits set on pipeline usage"
msgstr ""
+msgid "UsageQuota|%{linkTitle} help link"
+msgstr ""
+
msgid "UsageQuota|%{percentageLeft} of purchased storage is available"
msgstr ""
@@ -36109,6 +36584,9 @@ msgstr ""
msgid "UsageQuota|Artifacts is a sum of build and pipeline artifacts."
msgstr ""
+msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
+msgstr ""
+
msgid "UsageQuota|Buy additional minutes"
msgstr ""
@@ -36118,9 +36596,21 @@ msgstr ""
msgid "UsageQuota|CI minutes usage by project"
msgstr ""
+msgid "UsageQuota|Code packages and container images."
+msgstr ""
+
msgid "UsageQuota|Current period usage"
msgstr ""
+msgid "UsageQuota|File attachments and smaller design graphics."
+msgstr ""
+
+msgid "UsageQuota|Git repository, managed by the Gitaly service."
+msgstr ""
+
+msgid "UsageQuota|Includes project registry, artifacts, packages, wiki, uploads and other items."
+msgstr ""
+
msgid "UsageQuota|Increase storage temporarily"
msgstr ""
@@ -36139,6 +36629,9 @@ msgstr ""
msgid "UsageQuota|Packages"
msgstr ""
+msgid "UsageQuota|Pipeline artifacts and job artifacts, created with CI/CD."
+msgstr ""
+
msgid "UsageQuota|Pipelines"
msgstr ""
@@ -36157,6 +36650,9 @@ msgstr ""
msgid "UsageQuota|Seats"
msgstr ""
+msgid "UsageQuota|Shared bits of code and text."
+msgstr ""
+
msgid "UsageQuota|Snippets"
msgstr ""
@@ -36166,6 +36662,12 @@ msgstr ""
msgid "UsageQuota|Storage"
msgstr ""
+msgid "UsageQuota|Storage type"
+msgstr ""
+
+msgid "UsageQuota|There is a known issue with Artifact storage where the total could be incorrect for some projects. More details and progress are available in %{warningLinkStart}the epic%{warningLinkEnd}."
+msgstr ""
+
msgid "UsageQuota|This is the total amount of storage used across your projects within this namespace."
msgstr ""
@@ -36205,6 +36707,9 @@ msgstr ""
msgid "UsageQuota|Usage"
msgstr ""
+msgid "UsageQuota|Usage Breakdown"
+msgstr ""
+
msgid "UsageQuota|Usage Quotas"
msgstr ""
@@ -36229,6 +36734,9 @@ msgstr ""
msgid "UsageQuota|Wiki"
msgstr ""
+msgid "UsageQuota|Wiki content."
+msgstr ""
+
msgid "UsageQuota|Wikis"
msgstr ""
@@ -36445,7 +36953,10 @@ msgstr ""
msgid "User Settings"
msgstr ""
-msgid "User and IP Rate Limits"
+msgid "User and IP rate limits"
+msgstr ""
+
+msgid "User does not have a pending request"
msgstr ""
msgid "User identity was successfully created."
@@ -36742,6 +37253,9 @@ msgstr ""
msgid "Users can launch a development environment from a GitLab browser tab when the %{linkStart}Gitpod%{linkEnd} integration is enabled."
msgstr ""
+msgid "Users can reactivate their account by signing in."
+msgstr ""
+
msgid "Users can render diagrams in AsciiDoc, Markdown, reStructuredText, and Textile documents using Kroki."
msgstr ""
@@ -36757,6 +37271,9 @@ msgstr ""
msgid "Users requesting access to"
msgstr ""
+msgid "Users to exclude from the rate limit"
+msgstr ""
+
msgid "Users were successfully added."
msgstr ""
@@ -36778,6 +37295,9 @@ msgstr ""
msgid "UsersSelect|Unassigned"
msgstr ""
+msgid "Uses GitLab as a lightweight alternative to Sentry."
+msgstr ""
+
msgid "Using %{code_start}::%{code_end} denotes a %{link_start}scoped label set%{link_end}"
msgstr ""
@@ -36808,10 +37328,7 @@ msgstr ""
msgid "Value Stream Analytics can help you determine your team’s velocity"
msgstr ""
-msgid "Value Stream Analytics gives an overview of how much time it takes to go from idea to production in your project."
-msgstr ""
-
-msgid "Value may contain a variable reference"
+msgid "Value might contain a variable reference"
msgstr ""
msgid "Value stream"
@@ -36877,10 +37394,10 @@ msgstr ""
msgid "ValueStream|The Default Value Stream cannot be deleted"
msgstr ""
-msgid "Variable"
+msgid "Values that contain the %{codeStart}$%{codeEnd} character can be considered a variable reference and expanded. %{docsLinkStart}Learn more.%{docsLinkEnd}"
msgstr ""
-msgid "Variable references indicated by %{codeStart}$%{codeEnd} may be expanded. If this is not what you want, consider %{docsLinkStart}using a workaround to prevent expansion%{docsLinkEnd}."
+msgid "Variable"
msgstr ""
msgid "Variable will be masked in job logs."
@@ -37285,6 +37802,9 @@ msgstr ""
msgid "Vulnerability|Evidence"
msgstr ""
+msgid "Vulnerability|False positive detected"
+msgstr ""
+
msgid "Vulnerability|File"
msgstr ""
@@ -37327,6 +37847,9 @@ msgstr ""
msgid "Vulnerability|Status"
msgstr ""
+msgid "Vulnerability|The scanner determined this vulnerability to be a false positive. Verify the evaluation before changing its status. %{linkStart}Learn more about false positive detection.%{linkEnd}"
+msgstr ""
+
msgid "Vulnerability|The unmodified response is the original response that had no mutations done to the request"
msgstr ""
@@ -37651,9 +38174,6 @@ msgstr ""
msgid "Welcome to GitLab,%{br_tag}%{name}!"
msgstr ""
-msgid "Welcome to the guided GitLab tour"
-msgstr ""
-
msgid "Welcome, %{name}!"
msgstr ""
@@ -37672,9 +38192,6 @@ msgstr ""
msgid "What are you searching for?"
msgstr ""
-msgid "What describes you best?"
-msgstr ""
-
msgid "What does this command do?"
msgstr ""
@@ -37696,13 +38213,13 @@ msgstr ""
msgid "What is your job title? (optional)"
msgstr ""
-msgid "What will you use this group for?"
+msgid "What templates can I create?"
msgstr ""
-msgid "What's new"
+msgid "What will you use this group for?"
msgstr ""
-msgid "What’s your experience level?"
+msgid "What's new"
msgstr ""
msgid "When a deployment job is successful, skip older deployment jobs that are still pending."
@@ -37714,6 +38231,9 @@ msgstr ""
msgid "When an event in GitLab triggers a webhook, you can use the request details to figure out if something went wrong."
msgstr ""
+msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+msgstr ""
+
msgid "When inactive, an external authentication provider must be used."
msgstr ""
@@ -37737,6 +38257,9 @@ msgstr ""
msgid "When:"
msgstr ""
+msgid "Which API requests are affected?"
+msgstr ""
+
msgid "While it's rare to have no vulnerabilities, it can happen. In any event, we ask that you please double check your settings to make sure you've set up your dashboard correctly."
msgstr ""
@@ -38016,6 +38539,9 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|Work Items"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -38091,6 +38617,9 @@ msgstr ""
msgid "You are already a member of this %{member_source}."
msgstr ""
+msgid "You are already impersonating another user"
+msgstr ""
+
msgid "You are an admin, which means granting access to %{client_name} will allow them to interact with GitLab as an admin as well. Proceed with caution."
msgstr ""
@@ -38193,6 +38722,9 @@ msgstr ""
msgid "You can also use project access tokens with Git to authenticate over HTTP(S). %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "You can always change your URL later"
+msgstr ""
+
msgid "You can always edit this later"
msgstr ""
@@ -38349,10 +38881,10 @@ msgstr ""
msgid "You can’t %{tag_start}edit%{tag_end} files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
-msgid "You could not create a new trigger."
+msgid "You can’t edit files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
-msgid "You didn't renew your subscription for %{strong}%{namespace_name}%{strong_close} so it was downgraded to the free plan."
+msgid "You could not create a new trigger."
msgstr ""
msgid "You do not have any subscriptions yet"
@@ -38520,6 +39052,12 @@ msgstr ""
msgid "You must provide your current password in order to change it."
msgstr ""
+msgid "You must sign in to search for specific projects."
+msgstr ""
+
+msgid "You must sign in to search for specific terms."
+msgstr ""
+
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
@@ -38547,6 +39085,9 @@ msgstr ""
msgid "You need to upload a GitLab project export archive (ending in .gz)."
msgstr ""
+msgid "You need to verify your primary email first before enabling Two-Factor Authentication."
+msgstr ""
+
msgid "You successfully declined the invitation"
msgstr ""
@@ -38655,10 +39196,10 @@ msgstr ""
msgid "Your %{host} account was signed in to from a new location"
msgstr ""
-msgid "Your %{strong}%{plan_name}%{strong_close} subscription for %{strong}%{namespace_name}%{strong_close} will expire on %{strong}%{expires_on}%{strong_close}."
+msgid "Your %{strong}%{plan_name}%{strong_close} subscription expires on %{strong}%{expires_on}%{strong_close}. After that date, you cannot create issues or merge requests, or use many other features."
msgstr ""
-msgid "Your %{strong}%{plan_name}%{strong_close} subscription will expire on %{strong}%{expires_on}%{strong_close}. After that, you will not be able to create issues or merge requests as well as many other features."
+msgid "Your %{strong}%{plan_name}%{strong_close} subscription for %{strong}%{namespace_name}%{strong_close} will expire on %{strong}%{expires_on}%{strong_close}."
msgstr ""
msgid "Your CI/CD configuration syntax is invalid. View Lint tab for more details."
@@ -38682,7 +39223,7 @@ msgstr ""
msgid "Your GPG keys (%{count})"
msgstr ""
-msgid "Your GitLab account has been locked due to an excessive amount of unsuccessful sign in attempts. Your account will automatically unlock in %{duration} or you may click the link below to unlock now."
+msgid "Your GitLab account has been locked due to an excessive number of unsuccessful sign in attempts. You can wait for your account to automatically unlock in %{duration} or you can click the link below to unlock now."
msgstr ""
msgid "Your GitLab account request has been approved!"
@@ -38793,6 +39334,9 @@ msgstr ""
msgid "Your commit email is used for web based operations, such as edits and merges."
msgstr ""
+msgid "Your current password is required to register a two-factor authenticator app."
+msgstr ""
+
msgid "Your dashboard has been copied. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
@@ -38892,6 +39436,9 @@ msgstr ""
msgid "Your project limit is %{limit} projects! Please contact your administrator to increase it"
msgstr ""
+msgid "Your project will be created at:"
+msgstr ""
+
msgid "Your projects"
msgstr ""
@@ -38931,11 +39478,10 @@ msgstr ""
msgid "Your subscription expired!"
msgstr ""
-msgid "Your subscription has been downgraded."
-msgstr ""
-
-msgid "Your subscription will expire in %{remaining_days}."
-msgstr ""
+msgid "Your subscription will expire in %{remaining_days} day."
+msgid_plural "Your subscription will expire in %{remaining_days} days."
+msgstr[0] ""
+msgstr[1] ""
msgid "Your username is %{username}."
msgstr ""
@@ -39142,6 +39688,9 @@ msgstr ""
msgid "cannot merge"
msgstr ""
+msgid "cannot not be used for user namespace"
+msgstr ""
+
msgid "ciReport|%{degradedNum} degraded"
msgstr ""
@@ -39465,6 +40014,9 @@ msgstr ""
msgid "created %{timeAgo}"
msgstr ""
+msgid "created %{timeAgo} by %{author}"
+msgstr ""
+
msgid "created by"
msgstr ""
@@ -39509,9 +40061,6 @@ msgstr ""
msgid "does not have a supported extension. Only %{extension_list} are supported"
msgstr ""
-msgid "domain is not authorized for sign-up."
-msgstr ""
-
msgid "download it"
msgstr ""
@@ -39529,18 +40078,13 @@ msgstr ""
msgid "email '%{email}' is not a verified email."
msgstr ""
-msgid "email does not match the allowed domain of %{email_domains}"
-msgid_plural "email does not match the allowed domains: %{email_domains}"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "enabled"
msgstr ""
msgid "encrypted: needs to be a :required, :optional or :migrating!"
msgstr ""
-msgid "ending with MIME type format is not allowed."
+msgid "ending with a reserved file extension is not allowed."
msgstr ""
msgid "entries cannot be larger than 255 characters"
@@ -39564,6 +40108,9 @@ msgstr ""
msgid "estimateCommand|%{slash_command} overwrites the total estimated time."
msgstr ""
+msgid "example.com"
+msgstr ""
+
msgid "exceeds the limit of %{bytes} bytes"
msgstr ""
@@ -39614,9 +40161,6 @@ msgstr ""
msgid "fork"
msgstr ""
-msgid "fork this project"
-msgstr ""
-
msgid "from"
msgstr ""
@@ -39625,6 +40169,9 @@ msgid_plural "from %d jobs"
msgstr[0] ""
msgstr[1] ""
+msgid "frontmatter"
+msgstr ""
+
msgid "group"
msgstr ""
@@ -39652,6 +40199,9 @@ msgstr ""
msgid "has been completed."
msgstr ""
+msgid "has too deep level of nesting"
+msgstr ""
+
msgid "help"
msgstr ""
@@ -39685,9 +40235,21 @@ msgstr ""
msgid "in"
msgstr ""
+msgid "in Infrastructure :: Kubernetes clusters"
+msgstr ""
+
+msgid "in all GitLab"
+msgstr ""
+
+msgid "in group"
+msgstr ""
+
msgid "in group %{link_to_group}"
msgstr ""
+msgid "in project"
+msgstr ""
+
msgid "in project %{link_to_project}"
msgstr ""
@@ -39729,16 +40291,19 @@ msgstr ""
msgid "is not a valid X509 certificate."
msgstr ""
-msgid "is not allowed since the group is not top-level group."
+msgid "is not allowed for sign-up."
msgstr ""
-msgid "is not allowed. Try again with a different email address, or contact your GitLab admin."
+msgid "is not allowed for this group."
msgstr ""
-msgid "is not allowed. We do not currently support project-level iterations"
+msgid "is not allowed for this project."
+msgstr ""
+
+msgid "is not allowed since the group is not top-level group."
msgstr ""
-msgid "is not from an allowed domain."
+msgid "is not allowed. We do not currently support project-level iterations"
msgstr ""
msgid "is not in the group enforcing Group Managed Account"
@@ -39831,6 +40396,9 @@ msgstr ""
msgid "log in"
msgstr ""
+msgid "managed"
+msgstr ""
+
msgid "manual"
msgstr ""
@@ -39878,6 +40446,9 @@ msgstr ""
msgid "mrWidget| Please restore it or use a different %{missingBranchName} branch"
msgstr ""
+msgid "mrWidget|%{linkStart}Set up now%{linkEnd} to analyze your source code for known security vulnerabilities."
+msgstr ""
+
msgid "mrWidget|%{mergeError}."
msgstr ""
@@ -39958,6 +40529,9 @@ msgid_plural "mrWidget|Closes issues"
msgstr[0] ""
msgstr[1] ""
+msgid "mrWidget|Create issue to resolve all threads"
+msgstr ""
+
msgid "mrWidget|Delete source branch"
msgstr ""
@@ -39967,12 +40541,18 @@ msgstr ""
msgid "mrWidget|Did not close"
msgstr ""
+msgid "mrWidget|Dismiss"
+msgstr ""
+
msgid "mrWidget|Email patches"
msgstr ""
msgid "mrWidget|Failed to load deployment statistics"
msgstr ""
+msgid "mrWidget|Hide %{widget} details"
+msgstr ""
+
msgid "mrWidget|If the %{missingBranchName} branch exists in your local repository, you can merge this merge request manually using the command line"
msgstr ""
@@ -40068,9 +40648,6 @@ msgstr ""
msgid "mrWidget|Request to merge"
msgstr ""
-msgid "mrWidget|Resolve all threads in new issue"
-msgstr ""
-
msgid "mrWidget|Resolve conflicts"
msgstr ""
@@ -40086,6 +40663,9 @@ msgstr ""
msgid "mrWidget|Revoke approval"
msgstr ""
+msgid "mrWidget|SAST and Secret Detection is not enabled."
+msgstr ""
+
msgid "mrWidget|Set by %{merge_author} to be added to the merge train when the pipeline succeeds"
msgstr ""
@@ -40095,6 +40675,9 @@ msgstr ""
msgid "mrWidget|Set by %{merge_author} to start a merge train when the pipeline succeeds"
msgstr ""
+msgid "mrWidget|Show %{widget} details"
+msgstr ""
+
msgid "mrWidget|The changes were merged into"
msgstr ""
@@ -40107,6 +40690,9 @@ msgstr ""
msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure, or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
msgstr ""
+msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure."
+msgstr ""
+
msgid "mrWidget|The source branch has been deleted"
msgstr ""
@@ -40149,6 +40735,9 @@ msgstr ""
msgid "mrWidget|You can merge after removing denied licenses"
msgstr ""
+msgid "mrWidget|You can only merge once this merge request is approved."
+msgstr ""
+
msgid "mrWidget|Your password"
msgstr ""
@@ -40185,6 +40774,9 @@ msgstr ""
msgid "must be less than the limit of %{tag_limit} tags"
msgstr ""
+msgid "must be set for a project namespace"
+msgstr ""
+
msgid "must be unique by status and elapsed time within a policy"
msgstr ""
@@ -40294,6 +40886,9 @@ msgstr ""
msgid "pipeline"
msgstr ""
+msgid "pipeline schedules documentation"
+msgstr ""
+
msgid "pod_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
msgstr ""
@@ -40343,16 +40938,25 @@ msgstr ""
msgid "project name"
msgstr ""
+msgid "project namespace cannot be the parent of another namespace"
+msgstr ""
+
msgid "projects"
msgstr ""
msgid "quick actions"
msgstr ""
-msgid "reCAPTCHA Private Key"
+msgid "reCAPTCHA"
+msgstr ""
+
+msgid "reCAPTCHA helps prevent credential stuffing."
msgstr ""
-msgid "reCAPTCHA Site Key"
+msgid "reCAPTCHA private key"
+msgstr ""
+
+msgid "reCAPTCHA site key"
msgstr ""
msgid "recent activity"
@@ -40579,6 +41183,9 @@ msgstr ""
msgid "user avatar"
msgstr ""
+msgid "user namespace cannot be the parent of another namespace"
+msgstr ""
+
msgid "user preferences"
msgstr ""
@@ -40671,3 +41278,9 @@ msgstr ""
msgid "your settings"
msgstr ""
+msgid "{group}"
+msgstr ""
+
+msgid "{project}"
+msgstr ""
+
diff --git a/locale/mn_MN/gitlab.po b/locale/mn_MN/gitlab.po
index e3b1a73c4a3..b5f9808df25 100644
--- a/locale/mn_MN/gitlab.po
+++ b/locale/mn_MN/gitlab.po
@@ -14,10 +14,7 @@ msgstr ""
"X-Crowdin-Language: mn\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-09-01 22:33\n"
-
-msgid " %{name}, confirm your email address now! "
-msgstr ""
+"PO-Revision-Date: 2021-10-04 20:21\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -92,6 +89,16 @@ msgstr ""
msgid "#general, #development"
msgstr ""
+msgid "%d Alert"
+msgid_plural "%d Alerts"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d Alert:"
+msgid_plural "%d Alerts:"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d Approval"
msgid_plural "%d Approvals"
msgstr[0] ""
@@ -455,7 +462,10 @@ msgstr ""
msgid "%{code_open}Protected:%{code_close} Only exposed to protected branches or tags."
msgstr ""
-msgid "%{commit_author_link} authored %{commit_timeago}"
+msgid "%{commit_author_link} authored %{commit_authored_timeago}"
+msgstr ""
+
+msgid "%{commit_author_link} authored %{commit_authored_timeago} and %{commit_committer_avatar} %{commit_committer_link} committed %{commit_committer_timeago}"
msgstr ""
msgid "%{completedCount} completed weight"
@@ -549,6 +559,15 @@ msgstr ""
msgid "%{doc_link_start}Advanced search%{doc_link_end} is enabled."
msgstr ""
+msgid "%{docs_link_start}Learn about visibility levels.%{docs_link_end}"
+msgstr ""
+
+msgid "%{docs_link_start}What is Large File Storage?%{docs_link_end}"
+msgstr ""
+
+msgid "%{docs_link_start}What is two-factor authentication?%{docs_link_end}"
+msgstr ""
+
msgid "%{due_date} (Past due)"
msgstr ""
@@ -621,9 +640,6 @@ msgstr ""
msgid "%{issueType} actions"
msgstr ""
-msgid "%{issuesCount} issues with a limit of %{maxIssueCount}"
-msgstr ""
-
msgid "%{issuesSize} with a limit of %{maxIssueCount}"
msgstr ""
@@ -681,6 +697,12 @@ msgstr ""
msgid "%{label_for_message} unavailable"
msgstr ""
+msgid "%{learn_more_link}."
+msgstr ""
+
+msgid "%{lessThan} 1 hour"
+msgstr ""
+
msgid "%{lets_encrypt_link_start}Let's Encrypt%{lets_encrypt_link_end} is a free, automated, and open certificate authority (CA) that issues digital certificates to enable HTTPS (SSL/TLS) for sites."
msgstr ""
@@ -693,15 +715,15 @@ msgstr ""
msgid "%{link_start}Learn more%{link_end} about roles."
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
-msgstr ""
-
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
msgstr ""
msgid "%{link_start}Start the title with %{draft_snippet}%{link_end} to prevent a merge request that is a work in progress from being merged before it's ready."
msgstr ""
+msgid "%{link_start}What information does GitLab Inc. collect?%{link_end}"
+msgstr ""
+
msgid "%{listToShow}, and %{awardsListLength} more"
msgstr ""
@@ -854,7 +876,7 @@ msgid_plural "%{securityScanner} results are not available because a pipeline ha
msgstr[0] ""
msgstr[1] ""
-msgid "%{service_ping_link_start}Learn more%{service_ping_link_end} about what information is shared with GitLab Inc."
+msgid "%{service_ping_link_start}What information is shared with GitLab Inc.?%{service_ping_link_end}"
msgstr ""
msgid "%{size} %{unit}"
@@ -890,6 +912,9 @@ msgstr ""
msgid "%{state} epics"
msgstr ""
+msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
+msgstr ""
+
msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
msgstr ""
@@ -949,11 +974,6 @@ msgstr ""
msgid "%{template_project_id} is unknown or invalid"
msgstr ""
-msgid "%{text} %{files}"
-msgid_plural "%{text} %{files} files"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%{text} is available"
msgstr ""
@@ -1038,9 +1058,6 @@ msgstr ""
msgid "%{wildcards_link_start}Wildcards%{wildcards_link_end} such as %{code_tag_start}v*%{code_tag_end} or %{code_tag_start}*-release%{code_tag_end} are supported."
msgstr ""
-msgid "&lt; 1 hour"
-msgstr ""
-
msgid "'%{data}' at %{location} does not match format: %{format}"
msgstr ""
@@ -1124,9 +1141,6 @@ msgstr ""
msgid "(we need your current password to confirm your changes)"
msgstr ""
-msgid "* * * * *"
-msgstr ""
-
msgid "+ %{amount} more"
msgstr ""
@@ -1193,10 +1207,10 @@ msgstr ""
msgid "."
msgstr ""
-msgid "0 bytes"
+msgid "/"
msgstr ""
-msgid "0 for unlimited, only effective with remote storage enabled."
+msgid "0 bytes"
msgstr ""
msgid "0t1DgySidms"
@@ -1326,6 +1340,9 @@ msgstr ""
msgid "1000+"
msgstr ""
+msgid "192.168.0.0/24"
+msgstr ""
+
msgid "1st contribution!"
msgstr ""
@@ -1479,9 +1496,6 @@ msgstr ""
msgid "A plain HTML site that uses Netlify for CI/CD instead of GitLab, but still with all the other great GitLab features"
msgstr ""
-msgid "A plain-text response to show to clients that hit the rate limit."
-msgstr ""
-
msgid "A platform value can be web, mob or app."
msgstr ""
@@ -1563,7 +1577,7 @@ msgstr ""
msgid "APIFuzzing|Configure HTTP basic authentication values. Other authentication methods are supported. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
+msgid "APIFuzzing|Customize your project's API fuzzing configuration options and copy the code snippet to your .gitlab-ci.yml file to apply any changes. Note that this tool does not reflect or update your .gitlab-ci.yml file automatically. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
msgstr ""
msgid "APIFuzzing|Enable authentication"
@@ -1626,9 +1640,6 @@ msgstr ""
msgid "APIFuzzing|To prevent a security leak, authentication info must be added as a %{ciVariablesLinkStart}CI variable%{ciVariablesLinkEnd}. As a user with maintainer access rights, you can manage CI variables in the %{ciSettingsLinkStart}Settings%{ciSettingsLinkEnd} area."
msgstr ""
-msgid "APIFuzzing|Use this tool to generate API fuzzing configuration YAML to copy into your .gitlab-ci.yml file. This tool does not reflect or update your .gitlab-ci.yml file automatically."
-msgstr ""
-
msgid "APIFuzzing|Username for basic authentication"
msgstr ""
@@ -1680,9 +1691,6 @@ msgstr ""
msgid "Abuse reports notification email"
msgstr ""
-msgid "Abuse reports will be sent to this address if it is set. Abuse reports are always available in the admin area."
-msgstr ""
-
msgid "Accept invitation"
msgstr ""
@@ -1719,12 +1727,18 @@ msgstr ""
msgid "Access granted"
msgstr ""
+msgid "Access key ID"
+msgstr ""
+
msgid "Access requests"
msgstr ""
msgid "Access to '%{classification_label}' not allowed"
msgstr ""
+msgid "Access tokens expire after 2 hours. A refresh token may be used at any time to generate a new access token. Non-expiring access tokens are deprecated. Clear this setting to enable backward compatibility."
+msgstr ""
+
msgid "AccessDropdown|Deploy Keys"
msgstr ""
@@ -2037,6 +2051,9 @@ msgstr ""
msgid "Add new directory"
msgstr ""
+msgid "Add new service account"
+msgstr ""
+
msgid "Add or remove previously merged commits"
msgstr ""
@@ -2274,6 +2291,9 @@ msgstr ""
msgid "AdminArea|Features"
msgstr ""
+msgid "AdminArea|Get security updates from GitLab and stay up to date"
+msgstr ""
+
msgid "AdminArea|Groups"
msgstr ""
@@ -2313,6 +2333,12 @@ msgstr ""
msgid "AdminArea|Reporter"
msgstr ""
+msgid "AdminArea|Sign up for the GitLab Security Newsletter to get notified for security updates."
+msgstr ""
+
+msgid "AdminArea|Sign up for the GitLab newsletter"
+msgstr ""
+
msgid "AdminArea|Stop all jobs"
msgstr ""
@@ -2382,9 +2408,15 @@ msgstr ""
msgid "AdminSettings|Disable public access to Pages sites"
msgstr ""
+msgid "AdminSettings|Display a banner on merge requests in projects with no pipelines to initiate steps to add a .gitlab-ci.yml file."
+msgstr ""
+
msgid "AdminSettings|Domain verification is an essential security measure for public GitLab sites. Users are required to demonstrate they control a domain before it is enabled. %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "AdminSettings|Enable pipeline suggestion banner"
+msgstr ""
+
msgid "AdminSettings|Enable shared runners for new projects"
msgstr ""
@@ -2856,10 +2888,10 @@ msgstr ""
msgid "Admin|Quarterly reconciliation will occur on %{qrtlyDate}"
msgstr ""
-msgid "Admin|The number of max seats used for your namespace is currently exceeding the number of seats in your subscription. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgid "Admin|The number of max seats in your namespace exceeds the number of seats in your subscription. On %{qrtlyDate}, quarterly reconciliation occurs and you are automatically billed a prorated amount for the overage. No action is needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice. For more information about the timing of the invoicing process, view the documentation."
msgstr ""
-msgid "Admin|The number of maximum users for your instance is currently exceeding the number of users in license. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgid "Admin|The number of max users in your instance exceeds the number of users in your license. On %{qrtlyDate}, quarterly reconciliation occurs and you are automatically billed a prorated amount for the overage. No action is needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice. For more information about the timing of the invoicing process, view the documentation."
msgstr ""
msgid "Admin|View pending user approvals"
@@ -2880,9 +2912,6 @@ msgstr ""
msgid "Advanced export options"
msgstr ""
-msgid "Advanced permissions, Large File Storage and Two-Factor authentication settings."
-msgstr ""
-
msgid "After a successful password update you will be redirected to login screen."
msgstr ""
@@ -2901,13 +2930,14 @@ msgstr ""
msgid "After you've reviewed these contribution guidelines, you'll be all set to"
msgstr ""
+msgid "Akismet"
+msgstr ""
+
msgid "Akismet API Key"
msgstr ""
-msgid "Alert"
-msgid_plural "Alerts"
-msgstr[0] ""
-msgstr[1] ""
+msgid "Akismet helps prevent the creation of spam issues in public projects."
+msgstr ""
msgid "AlertManagement|Acknowledged"
msgstr ""
@@ -3263,6 +3293,9 @@ msgstr ""
msgid "All (default)"
msgstr ""
+msgid "All GitLab"
+msgstr ""
+
msgid "All Members"
msgstr ""
@@ -3377,6 +3410,9 @@ msgstr ""
msgid "Allow this secondary node to replicate content on Object Storage"
msgstr ""
+msgid "Allow use of licensed EE features"
+msgstr ""
+
msgid "Allow users to dismiss the broadcast message"
msgstr ""
@@ -3452,9 +3488,6 @@ msgstr ""
msgid "Amazon authentication is not %{link_start}correctly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
-msgid "Amount of time (in hours) that users are allowed to skip forced configuration of two-factor authentication"
-msgstr ""
-
msgid "An %{link_start}alert%{link_end} with the same fingerprint is already open. To change the status of this alert, resolve the linked alert."
msgstr ""
@@ -3515,12 +3548,6 @@ msgstr ""
msgid "An error occurred when removing the label."
msgstr ""
-msgid "An error occurred when toggling the notification subscription"
-msgstr ""
-
-msgid "An error occurred when updating the issue weight"
-msgstr ""
-
msgid "An error occurred when updating the title"
msgstr ""
@@ -3569,6 +3596,9 @@ msgstr ""
msgid "An error occurred while enabling Service Desk."
msgstr ""
+msgid "An error occurred while fetching Markdown preview"
+msgstr ""
+
msgid "An error occurred while fetching ancestors"
msgstr ""
@@ -3599,9 +3629,6 @@ msgstr ""
msgid "An error occurred while fetching label colors."
msgstr ""
-msgid "An error occurred while fetching markdown preview"
-msgstr ""
-
msgid "An error occurred while fetching participants"
msgstr ""
@@ -3617,9 +3644,6 @@ msgstr ""
msgid "An error occurred while fetching reference"
msgstr ""
-msgid "An error occurred while fetching sidebar data"
-msgstr ""
-
msgid "An error occurred while fetching tags. Retry the search."
msgstr ""
@@ -3695,6 +3719,9 @@ msgstr ""
msgid "An error occurred while loading merge requests."
msgstr ""
+msgid "An error occurred while loading projects."
+msgstr ""
+
msgid "An error occurred while loading the Needs tab."
msgstr ""
@@ -3929,12 +3956,6 @@ msgstr ""
msgid "Any Milestone"
msgstr ""
-msgid "Any branch"
-msgstr ""
-
-msgid "Any eligible user"
-msgstr ""
-
msgid "Any encrypted tokens"
msgstr ""
@@ -3953,6 +3974,9 @@ msgstr ""
msgid "Any namespace"
msgstr ""
+msgid "App Engine description and apps that are suitable for this deployment target"
+msgstr ""
+
msgid "App ID"
msgstr ""
@@ -4101,6 +4125,11 @@ msgstr ""
msgid "Apply"
msgstr ""
+msgid "Apply %d suggestion"
+msgid_plural "Apply %d suggestions"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Apply a label"
msgstr ""
@@ -4110,13 +4139,10 @@ msgstr ""
msgid "Apply suggestion"
msgstr ""
-msgid "Apply suggestions"
-msgstr ""
-
msgid "Apply template"
msgstr ""
-msgid "Apply this approval rule to any branch or a specific protected branch."
+msgid "Apply this approval rule to all branches or a specific protected branch."
msgstr ""
msgid "Applying"
@@ -4259,9 +4285,6 @@ msgstr ""
msgid "ApprovalSettings|Prevent editing approval rules in projects and merge requests."
msgstr ""
-msgid "ApprovalSettings|Prevent editing approval rules in projects and merge requests. "
-msgstr ""
-
msgid "ApprovalSettings|Remove all approvals when commits are added to the source branch."
msgstr ""
@@ -4277,6 +4300,9 @@ msgstr ""
msgid "ApprovalSettings|This setting is configured at the instance level and can only be changed by an administrator."
msgstr ""
+msgid "ApprovalSettings|This setting is configured in %{groupName} and can only be changed by an administrator or group owner."
+msgstr ""
+
msgid "ApprovalStatusTooltip|Adheres to separation of duties"
msgstr ""
@@ -4763,9 +4789,6 @@ msgstr ""
msgid "Authenticated API rate limit period in seconds"
msgstr ""
-msgid "Authenticated API request rate limit"
-msgstr ""
-
msgid "Authenticated API requests"
msgstr ""
@@ -4775,10 +4798,10 @@ msgstr ""
msgid "Authenticated Git LFS request rate limit"
msgstr ""
-msgid "Authenticated web rate limit period in seconds"
+msgid "Authenticated Git LFS requests"
msgstr ""
-msgid "Authenticated web request rate limit"
+msgid "Authenticated web rate limit period in seconds"
msgstr ""
msgid "Authenticated web requests"
@@ -5156,9 +5179,6 @@ msgstr ""
msgid "Below you will find all the groups that are public."
msgstr ""
-msgid "Beta"
-msgstr ""
-
msgid "Bi-weekly code coverage"
msgstr ""
@@ -5398,6 +5418,21 @@ msgstr ""
msgid "Board scope affects which issues are displayed for anyone who visits this board"
msgstr ""
+msgid "BoardNewEpic|Groups"
+msgstr ""
+
+msgid "BoardNewEpic|Loading groups"
+msgstr ""
+
+msgid "BoardNewEpic|No matching results"
+msgstr ""
+
+msgid "BoardNewEpic|Search groups"
+msgstr ""
+
+msgid "BoardNewEpic|Select a group"
+msgstr ""
+
msgid "BoardNewIssue|No matching results"
msgstr ""
@@ -5475,6 +5510,9 @@ msgstr ""
msgid "Boards|An error occurred while creating the list. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching child groups. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching group projects. Please try again."
msgstr ""
@@ -5807,6 +5845,9 @@ msgstr ""
msgid "Bulk update"
msgstr ""
+msgid "BulkImports|Re-import creates a new group. It does not sync with the existing group."
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -5816,6 +5857,9 @@ msgstr ""
msgid "BulkImport|From source group"
msgstr ""
+msgid "BulkImport|Group import history"
+msgstr ""
+
msgid "BulkImport|Import failed: Destination cannot be a subgroup of the source group. Change the destination and try again."
msgstr ""
@@ -5828,9 +5872,18 @@ msgstr ""
msgid "BulkImport|Importing the group failed"
msgstr ""
+msgid "BulkImport|Last imported to %{link}"
+msgstr ""
+
msgid "BulkImport|Name already exists."
msgstr ""
+msgid "BulkImport|New group"
+msgstr ""
+
+msgid "BulkImport|No history is available"
+msgstr ""
+
msgid "BulkImport|No parent"
msgstr ""
@@ -5843,6 +5896,9 @@ msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} matching filter \"%{filter}\" from %{link}"
msgstr ""
+msgid "BulkImport|Source group"
+msgstr ""
+
msgid "BulkImport|To new group"
msgstr ""
@@ -5852,6 +5908,9 @@ msgstr ""
msgid "BulkImport|You have no groups to import"
msgstr ""
+msgid "BulkImport|Your imported groups will appear here."
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -6094,6 +6153,9 @@ msgstr ""
msgid "Can be manually deployed to"
msgstr ""
+msgid "Can be overridden in each project."
+msgstr ""
+
msgid "Can create groups:"
msgstr ""
@@ -6196,6 +6258,9 @@ msgstr ""
msgid "Cancelling Preview"
msgstr ""
+msgid "Cannot assign a confidential epic to a non-confidential issue. Make the issue confidential and try again"
+msgstr ""
+
msgid "Cannot be assigned to other projects."
msgstr ""
@@ -6247,9 +6312,6 @@ msgstr ""
msgid "Cannot refer to a group %{timebox_type} by an internal id!"
msgstr ""
-msgid "Cannot set confidential epic for a non-confidential issue"
-msgstr ""
-
msgid "Cannot show preview. For previews on sketch files, they must have the file format introduced by Sketch version 43 and above."
msgstr ""
@@ -6487,15 +6549,15 @@ msgstr ""
msgid "Check out, review, and merge locally"
msgstr ""
-msgid "Check the %{docs_link_start}documentation%{docs_link_end}."
-msgstr ""
-
msgid "Check the current instance configuration "
msgstr ""
msgid "Check the elasticsearch.log file to debug why the migration was halted and make any changes before retrying the migration. When you fix the cause of the failure, click \"Retry migration\", and the migration will be scheduled to be retried in the background."
msgstr ""
+msgid "Check with your administrator."
+msgstr ""
+
msgid "Check your Docker images for known vulnerabilities."
msgstr ""
@@ -6526,6 +6588,9 @@ msgstr ""
msgid "Checkout"
msgstr ""
+msgid "Checkout|$%{selectedPlanPrice} per 10 GB storage per pack"
+msgstr ""
+
msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 minutes"
msgstr ""
@@ -6546,17 +6611,23 @@ msgstr ""
msgid "Checkout|%{name}'s GitLab subscription"
msgstr ""
-msgid "Checkout|%{selectedPlanText} plan"
+msgid "Checkout|%{name}'s storage subscription"
msgstr ""
-msgid "Checkout|%{startDate} - %{endDate}"
+msgid "Checkout|%{quantity} GB of storage"
msgstr ""
-msgid "Checkout|%{totalCiMinutes} CI minute"
-msgid_plural "Checkout|%{totalCiMinutes} CI minutes"
+msgid "Checkout|%{quantity} storage pack"
+msgid_plural "Checkout|%{quantity} storage packs"
msgstr[0] ""
msgstr[1] ""
+msgid "Checkout|%{selectedPlanText} plan"
+msgstr ""
+
+msgid "Checkout|%{startDate} - %{endDate}"
+msgstr ""
+
msgid "Checkout|%{totalCiMinutes} CI minutes"
msgstr ""
@@ -6632,6 +6703,9 @@ msgstr ""
msgid "Checkout|Failed to register credit card. Please try again."
msgstr ""
+msgid "Checkout|GB"
+msgstr ""
+
msgid "Checkout|GitLab group"
msgstr ""
@@ -6668,6 +6742,9 @@ msgstr ""
msgid "Checkout|State"
msgstr ""
+msgid "Checkout|Storage packs"
+msgstr ""
+
msgid "Checkout|Street address"
msgstr ""
@@ -6689,6 +6766,9 @@ msgstr ""
msgid "Checkout|Total minutes: %{quantity}"
msgstr ""
+msgid "Checkout|Total storage: %{quantity} GB"
+msgstr ""
+
msgid "Checkout|Users"
msgstr ""
@@ -6698,16 +6778,25 @@ msgstr ""
msgid "Checkout|Your organization"
msgstr ""
+msgid "Checkout|Your storage subscription has the same term as your main subscription, and the price is prorated accordingly."
+msgstr ""
+
msgid "Checkout|Your subscription will be applied to this group"
msgstr ""
msgid "Checkout|Zip code"
msgstr ""
+msgid "Checkout|a storage subscription"
+msgstr ""
+
msgid "Checkout|company or team"
msgstr ""
-msgid "Checkout|x 1,000 minutes per pack = %{strong}"
+msgid "Checkout|minutes"
+msgstr ""
+
+msgid "Checkout|x %{quantity} %{units} per pack ="
msgstr ""
msgid "Cherry-pick this commit"
@@ -7064,6 +7153,9 @@ msgstr ""
msgid "CloneIssue|Cannot clone issue to target project as it is pending deletion."
msgstr ""
+msgid "CloneIssue|Cannot clone issues of '%{issue_type}' type."
+msgstr ""
+
msgid "Cloned this issue to %{path_to_project}."
msgstr ""
@@ -7118,7 +7210,10 @@ msgstr ""
msgid "Closes this %{quick_action_target}."
msgstr ""
-msgid "Cloud licenses can not be removed."
+msgid "Cloud Functions description and apps that are suitable for this deployment target"
+msgstr ""
+
+msgid "Cloud Run description and apps that are suitable for this deployment target"
msgstr ""
msgid "Cluster"
@@ -7145,6 +7240,12 @@ msgstr ""
msgid "ClusterAgents|Access tokens"
msgstr ""
+msgid "ClusterAgents|Agent might not be connected to GitLab"
+msgstr ""
+
+msgid "ClusterAgents|Agent never connected to GitLab"
+msgstr ""
+
msgid "ClusterAgents|Alternative installation methods"
msgstr ""
@@ -7160,6 +7261,12 @@ msgstr ""
msgid "ClusterAgents|Configuration"
msgstr ""
+msgid "ClusterAgents|Connected"
+msgstr ""
+
+msgid "ClusterAgents|Connection status"
+msgstr ""
+
msgid "ClusterAgents|Copy token"
msgstr ""
@@ -7178,6 +7285,9 @@ msgstr ""
msgid "ClusterAgents|For alternative installation methods %{linkStart}go to the documentation%{linkEnd}."
msgstr ""
+msgid "ClusterAgents|For more troubleshooting information go to"
+msgstr ""
+
msgid "ClusterAgents|Go to the repository"
msgstr ""
@@ -7193,18 +7303,30 @@ msgstr ""
msgid "ClusterAgents|Integrate with the GitLab Agent"
msgstr ""
-msgid "ClusterAgents|Last used"
+msgid "ClusterAgents|Last connected %{timeAgo}."
+msgstr ""
+
+msgid "ClusterAgents|Last contact"
msgstr ""
msgid "ClusterAgents|Learn how to create an agent access token"
msgstr ""
+msgid "ClusterAgents|Make sure you are using a valid token."
+msgstr ""
+
msgid "ClusterAgents|Name"
msgstr ""
msgid "ClusterAgents|Never"
msgstr ""
+msgid "ClusterAgents|Never connected"
+msgstr ""
+
+msgid "ClusterAgents|Not connected"
+msgstr ""
+
msgid "ClusterAgents|Read more about getting started"
msgstr ""
@@ -7226,6 +7348,9 @@ msgstr ""
msgid "ClusterAgents|Select which Agent you want to install"
msgstr ""
+msgid "ClusterAgents|The Agent has not been connected in a long time. There might be a connectivity issue. Last contact was %{timeAgo}."
+msgstr ""
+
msgid "ClusterAgents|The GitLab Agent also requires %{linkStart}enabling the Agent Server%{linkEnd}"
msgstr ""
@@ -7253,9 +7378,6 @@ msgstr ""
msgid "ClusterAgents|You will need to create a token to connect to your agent"
msgstr ""
-msgid "ClusterAgent|This feature is only available for premium plans"
-msgstr ""
-
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -7445,9 +7567,6 @@ msgstr ""
msgid "ClusterIntegration|Create Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Create a provision role on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the account and external ID above. %{startMoreInfoLink}More information%{endLink}"
-msgstr ""
-
msgid "ClusterIntegration|Create cluster on"
msgstr ""
@@ -7880,7 +7999,7 @@ msgstr ""
msgid "ClusterIntegration|Subnets"
msgstr ""
-msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provisioned role, first create one on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the above account and external IDs. %{startMoreInfoLink}More information%{endLink}"
+msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provisioned role, first create one on %{awsLinkStart}Amazon Web Services %{awsLinkEnd} using the above account and external IDs. %{moreInfoStart}More information%{moreInfoEnd}"
msgstr ""
msgid "ClusterIntegration|The Kubernetes certificate used to authenticate to the cluster."
@@ -8114,6 +8233,9 @@ msgstr ""
msgid "Collapse replies"
msgstr ""
+msgid "Collapse settings section"
+msgstr ""
+
msgid "Collapse sidebar"
msgstr ""
@@ -8132,6 +8254,9 @@ msgstr ""
msgid "Comma-separated list of email addresses."
msgstr ""
+msgid "Comma-separated list of users allowed to exceed the rate limit."
+msgstr ""
+
msgid "Comma-separated, e.g. '1.1.1.1, 2.2.2.0/24'"
msgstr ""
@@ -8452,6 +8577,9 @@ msgstr ""
msgid "Configure %{repository_checks_link_start}repository checks%{link_end} and %{housekeeping_link_start}housekeeping%{link_end} on repositories."
msgstr ""
+msgid "Configure CAPTCHAs, IP address limits, and other anti-spam measures."
+msgstr ""
+
msgid "Configure Dependency Scanning in `.gitlab-ci.yml` using the GitLab managed template. You can [add variable overrides](https://docs.gitlab.com/ee/user/application_security/dependency_scanning/#customizing-the-dependency-scanning-settings) to customize Dependency Scanning settings."
msgstr ""
@@ -8488,16 +8616,13 @@ msgstr ""
msgid "Configure a %{codeStart}.gitlab-webide.yml%{codeEnd} file in the %{codeStart}.gitlab%{codeEnd} directory to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
msgstr ""
-msgid "Configure existing installation"
-msgstr ""
-
-msgid "Configure limit for notes created per minute by web and API requests."
+msgid "Configure advanced permissions, Large File Storage, and two-factor authentication settings."
msgstr ""
-msgid "Configure limits for Project/Group Import/Export."
+msgid "Configure approvals by authors and committers on all projects."
msgstr ""
-msgid "Configure limits for web and API requests."
+msgid "Configure existing installation"
msgstr ""
msgid "Configure paths to be protected by Rack Attack."
@@ -8512,10 +8637,13 @@ msgstr ""
msgid "Configure settings for Advanced Search with Elasticsearch."
msgstr ""
+msgid "Configure specific limits for Files API requests that supersede the general user and IP rate limits."
+msgstr ""
+
msgid "Configure specific limits for Git LFS requests that supersede the general user and IP rate limits."
msgstr ""
-msgid "Configure specific limits for Packages API requests that supersede the general user and IP rate limits."
+msgid "Configure specific limits for deprecated API requests that supersede the general user and IP rate limits."
msgstr ""
msgid "Configure the %{link} integration."
@@ -8527,6 +8655,9 @@ msgstr ""
msgid "Configure the way a user creates a new account."
msgstr ""
+msgid "Configure via Merge Request"
+msgstr ""
+
msgid "Configure which lists are shown for anyone who visits this board"
msgstr ""
@@ -8995,6 +9126,9 @@ msgstr ""
msgid "Content parsed with %{link}."
msgstr ""
+msgid "ContentEditor|Table of Contents"
+msgstr ""
+
msgid "ContentEditor|You have to provide a renderMarkdown function or a custom serializer"
msgstr ""
@@ -9181,6 +9315,9 @@ msgstr ""
msgid "Copy link to chart"
msgstr ""
+msgid "Copy prefix"
+msgstr ""
+
msgid "Copy reference"
msgstr ""
@@ -9211,6 +9348,9 @@ msgstr ""
msgid "Copy value"
msgstr ""
+msgid "Corpus Management"
+msgstr ""
+
msgid "Corpus Management|Are you sure you want to delete the corpus?"
msgstr ""
@@ -9439,6 +9579,9 @@ msgstr ""
msgid "Create commit"
msgstr ""
+msgid "Create common files more quickly, and standardize their format."
+msgstr ""
+
msgid "Create confidential merge request"
msgstr ""
@@ -9472,6 +9615,9 @@ msgstr ""
msgid "Create issue"
msgstr ""
+msgid "Create issue to resolve all threads"
+msgstr ""
+
msgid "Create iteration"
msgstr ""
@@ -9526,6 +9672,9 @@ msgstr ""
msgid "Create new..."
msgstr ""
+msgid "Create or import your first project"
+msgstr ""
+
msgid "Create project"
msgstr ""
@@ -9883,7 +10032,7 @@ msgstr ""
msgid "Custom notification events"
msgstr ""
-msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notificationLinkStart} notification emails%{notificationLinkEnd}."
+msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notificationLinkStart}notification emails%{notificationLinkEnd}."
msgstr ""
msgid "Custom project templates"
@@ -10082,10 +10231,10 @@ msgid_plural "CycleAnalytics|Showing %{subjectFilterText} and %{selectedLabelsCo
msgstr[0] ""
msgstr[1] ""
-msgid "CycleAnalytics|Showing data for group '%{groupName}' and %{selectedProjectCount} projects from %{startDate} to %{endDate}"
+msgid "CycleAnalytics|Showing data for group '%{groupName}' and %{selectedProjectCount} projects from %{createdAfter} to %{createdBefore}"
msgstr ""
-msgid "CycleAnalytics|Showing data for group '%{groupName}' from %{startDate} to %{endDate}"
+msgid "CycleAnalytics|Showing data for group '%{groupName}' from %{createdAfter} to %{createdBefore}"
msgstr ""
msgid "CycleAnalytics|Stages"
@@ -10319,6 +10468,9 @@ msgstr ""
msgid "DastProfiles|Manage profiles"
msgstr ""
+msgid "DastProfiles|Manage site profiles"
+msgstr ""
+
msgid "DastProfiles|Minimum = 0 (no timeout enabled), Maximum = 2880 minutes"
msgstr ""
@@ -10394,6 +10546,9 @@ msgstr ""
msgid "DastProfiles|Scanner name"
msgstr ""
+msgid "DastProfiles|Schedule"
+msgstr ""
+
msgid "DastProfiles|Select branch"
msgstr ""
@@ -10463,7 +10618,7 @@ msgstr ""
msgid "DastProfiles|Website"
msgstr ""
-msgid "DastProfiles|You can either choose a passive scan or validate the target site in your chosen site profile. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
+msgid "DastProfiles|You can either choose a passive scan or validate the target site from the site profile management page. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
msgstr ""
msgid "DastProfiles|You cannot run an active scan against an unvalidated site."
@@ -10636,7 +10791,7 @@ msgstr ""
msgid "Days to merge"
msgstr ""
-msgid "Deactivate dormant users after 90 days of inactivity. Users can return to active status by signing in to their account. While inactive, a user is not counted as an active user in the instance."
+msgid "Deactivate dormant users after 90 days of inactivity"
msgstr ""
msgid "Dear Administrator,"
@@ -10723,10 +10878,10 @@ msgstr ""
msgid "Define a custom pattern with cron syntax"
msgstr ""
-msgid "Define approval settings."
+msgid "Define approval rules."
msgstr ""
-msgid "Define approval settings. %{linkStart}Learn more.%{linkEnd}"
+msgid "Define approval rules. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "Define custom rules for what constitutes spam, independent of Akismet"
@@ -10735,7 +10890,7 @@ msgstr ""
msgid "Define environments in the deploy stage(s) in %{code_open}.gitlab-ci.yml%{code_close} to track deployments here."
msgstr ""
-msgid "Define how approval rules are applied as a merge request moves toward completion."
+msgid "Define how approval rules are applied to merge requests."
msgstr ""
msgid "Definition"
@@ -10750,6 +10905,12 @@ msgstr ""
msgid "DelayedJobs|Are you sure you want to run %{job_name} immediately? This job will run automatically after it's timer finishes."
msgstr ""
+msgid "DelayedJobs|Are you sure you want to run %{job_name} immediately? This job will run automatically after its timer finishes."
+msgstr ""
+
+msgid "DelayedJobs|Run the delayed job now?"
+msgstr ""
+
msgid "DelayedJobs|Start now"
msgstr ""
@@ -11026,6 +11187,12 @@ msgstr ""
msgid "Dependency proxy image prefix"
msgstr ""
+msgid "DependencyProxy|Create a local proxy for storing frequently used upstream images. %{docLinkStart}Learn more%{docLinkEnd} about dependency proxies."
+msgstr ""
+
+msgid "DependencyProxy|Dependency Proxy"
+msgstr ""
+
msgid "DependencyProxy|Toggle Dependency Proxy"
msgstr ""
@@ -11266,6 +11433,9 @@ msgstr ""
msgid "Deployments"
msgstr ""
+msgid "Deployments to Google Kubernetes Engine can be "
+msgstr ""
+
msgid "Deployments|%{deployments} environment impacted."
msgid_plural "Deployments|%{deployments} environments impacted."
msgstr[0] ""
@@ -11295,6 +11465,9 @@ msgstr ""
msgid "Deployment|success"
msgstr ""
+msgid "Deprecated API rate limits"
+msgstr ""
+
msgid "Deprioritize label"
msgstr ""
@@ -11697,6 +11870,16 @@ msgstr ""
msgid "DiffsCompareBaseBranch|(base)"
msgstr ""
+msgid "Diffs|%d addition"
+msgid_plural "Diffs|%d additions"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Diffs|%d deletion"
+msgid_plural "Diffs|%d deletions"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Diffs|No file name available"
msgstr ""
@@ -11706,9 +11889,17 @@ msgstr ""
msgid "Diffs|Show all unchanged lines"
msgstr ""
+msgid "Diffs|Showing %{dropdownStart}%{count} changed file%{dropdownEnd}"
+msgid_plural "Diffs|Showing %{dropdownStart}%{count} changed files%{dropdownEnd}"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Diffs|Something went wrong while fetching diff lines."
msgstr ""
+msgid "Diffs|with %{additions} and %{deletions}"
+msgstr ""
+
msgid "Direct member"
msgstr ""
@@ -11834,9 +12025,6 @@ msgid_plural "Dismiss %d selected vulnerabilities as"
msgstr[0] ""
msgstr[1] ""
-msgid "Dismiss Value Stream Analytics introduction box"
-msgstr ""
-
msgid "Dismiss merge request promotion"
msgstr ""
@@ -12158,6 +12346,9 @@ msgstr ""
msgid "Edit issues"
msgstr ""
+msgid "Edit merge requests"
+msgstr ""
+
msgid "Edit public deploy key"
msgstr ""
@@ -12233,6 +12424,9 @@ msgstr ""
msgid "Elastic|None. Select projects to index."
msgstr ""
+msgid "Eligible users"
+msgstr ""
+
msgid "Email"
msgstr ""
@@ -12362,6 +12556,9 @@ msgstr ""
msgid "Enable"
msgstr ""
+msgid "Enable Amazon EKS integration"
+msgstr ""
+
msgid "Enable Auto DevOps"
msgstr ""
@@ -12395,6 +12592,9 @@ msgstr ""
msgid "Enable SSL verification"
msgstr ""
+msgid "Enable Service Ping"
+msgstr ""
+
msgid "Enable Snowplow tracking"
msgstr ""
@@ -12425,6 +12625,9 @@ msgstr ""
msgid "Enable authenticated Git LFS request rate limit"
msgstr ""
+msgid "Enable authenticated web request rate limit"
+msgstr ""
+
msgid "Enable authentication"
msgstr ""
@@ -12485,7 +12688,7 @@ msgstr ""
msgid "Enable or disable the Pseudonymizer data collection."
msgstr ""
-msgid "Enable or disable version check and service ping."
+msgid "Enable or disable version check and Service Ping."
msgstr ""
msgid "Enable protected paths rate limit"
@@ -12497,18 +12700,12 @@ msgstr ""
msgid "Enable reCAPTCHA"
msgstr ""
-msgid "Enable reCAPTCHA for login"
-msgstr ""
-
-msgid "Enable reCAPTCHA, Invisible Captcha, Akismet and set IP limits. For reCAPTCHA, we currently only support %{recaptcha_v2_link_start}v2%{recaptcha_v2_link_end}"
+msgid "Enable reCAPTCHA for login."
msgstr ""
msgid "Enable repository checks"
msgstr ""
-msgid "Enable service ping"
-msgstr ""
-
msgid "Enable shared runners for all projects and subgroups in this group."
msgstr ""
@@ -12530,7 +12727,10 @@ msgstr ""
msgid "Enable unauthenticated API request rate limit"
msgstr ""
-msgid "Enable unauthenticated request rate limit"
+msgid "Enable unauthenticated web request rate limit"
+msgstr ""
+
+msgid "Enable user deactivation emails"
msgstr ""
msgid "Enable version check"
@@ -12566,9 +12766,6 @@ msgstr ""
msgid "Enabled sources for code import during project creation. OmniAuth must be configured for GitHub"
msgstr ""
-msgid "Enabling this will only make licensed EE features available to projects if the project namespace's plan includes the feature or if the project is public."
-msgstr ""
-
msgid "Encountered an error while rendering: %{err}"
msgstr ""
@@ -12617,9 +12814,6 @@ msgstr ""
msgid "Enter Admin Mode"
msgstr ""
-msgid "Enter IP address range"
-msgstr ""
-
msgid "Enter a number"
msgstr ""
@@ -12632,9 +12826,6 @@ msgstr ""
msgid "Enter at least three characters to search"
msgstr ""
-msgid "Enter domain"
-msgstr ""
-
msgid "Enter in your Bitbucket Server URL and personal access token below"
msgstr ""
@@ -12821,9 +13012,6 @@ msgstr ""
msgid "Environments|Deployment %{status}"
msgstr ""
-msgid "Environments|Dismiss"
-msgstr ""
-
msgid "Environments|Enable review app"
msgstr ""
@@ -12836,9 +13024,6 @@ msgstr ""
msgid "Environments|Environments are places where code gets deployed, such as staging or production."
msgstr ""
-msgid "Environments|Help us improve environments"
-msgstr ""
-
msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
msgstr ""
@@ -12875,6 +13060,9 @@ msgstr ""
msgid "Environments|Note that this action will stop the environment, but it will %{emphasisStart}not%{emphasisEnd} have an effect on any existing deployment due to no “stop environment action†being defined in the %{ciConfigLinkStart}.gitlab-ci.yml%{ciConfigLinkEnd} file."
msgstr ""
+msgid "Environments|Open"
+msgstr ""
+
msgid "Environments|Open live environment"
msgstr ""
@@ -12914,9 +13102,6 @@ msgstr ""
msgid "Environments|Stopping %{environmentName}"
msgstr ""
-msgid "Environments|Take the survey"
-msgstr ""
-
msgid "Environments|There was an error fetching the logs. Please try again."
msgstr ""
@@ -12938,9 +13123,6 @@ msgstr ""
msgid "Environments|You don't have any environments right now"
msgstr ""
-msgid "Environments|Your feedback helps GitLab make environments better for you and other users. Participate and enter a sweepstake to win a USD 30 gift card."
-msgstr ""
-
msgid "Environments|by %{avatar}"
msgstr ""
@@ -13223,7 +13405,7 @@ msgstr ""
msgid "Error parsing CSV file. Please make sure it has"
msgstr ""
-msgid "Error rendering markdown preview"
+msgid "Error rendering Markdown preview"
msgstr ""
msgid "Error saving label update."
@@ -13271,6 +13453,9 @@ msgstr ""
msgid "Error: %{error_message}"
msgstr ""
+msgid "Error: Couldn't load some or all of the changes."
+msgstr ""
+
msgid "Error: No AWS credentials were supplied"
msgstr ""
@@ -13304,6 +13489,9 @@ msgstr ""
msgid "ErrorTracking|Enable error tracking"
msgstr ""
+msgid "ErrorTracking|Error tracking backend"
+msgstr ""
+
msgid "ErrorTracking|If you self-host Sentry, enter your Sentry instance's full URL. If you use Sentry's hosted solution, enter https://sentry.io"
msgstr ""
@@ -13337,6 +13525,12 @@ msgstr ""
msgid "Escalation policies must have at least one rule"
msgstr ""
+msgid "EscalationPolicies|%{clockIcon} IF alert is not %{alertStatus} in %{minutes}"
+msgstr ""
+
+msgid "EscalationPolicies|%{notificationIcon} THEN %{doAction} %{forScheduleOrUser}"
+msgstr ""
+
msgid "EscalationPolicies|+ Add an additional rule"
msgstr ""
@@ -13379,13 +13573,13 @@ msgstr ""
msgid "EscalationPolicies|Escalation policies"
msgstr ""
-msgid "EscalationPolicies|Escalation rules"
+msgid "EscalationPolicies|Escalation policy %{obstacle} in Project %{project}"
msgstr ""
-msgid "EscalationPolicies|Failed to load oncall-schedules"
+msgid "EscalationPolicies|Escalation rules"
msgstr ""
-msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} %{then} THEN %{doAction} %{scheduleOrUser}"
+msgid "EscalationPolicies|Failed to load oncall-schedules"
msgstr ""
msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} minutes"
@@ -13463,18 +13657,36 @@ msgstr ""
msgid "Every %{action} attempt has failed: %{job_error_message}. Please try again."
msgstr ""
+msgid "Every 3 months"
+msgstr ""
+
+msgid "Every 3 months on the %{day} at %{time} %{timezone}"
+msgstr ""
+
+msgid "Every 6 months"
+msgstr ""
+
+msgid "Every 6 months on the %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Every day"
msgstr ""
msgid "Every day (at %{time})"
msgstr ""
+msgid "Every day at %{time} %{timezone}"
+msgstr ""
+
msgid "Every month"
msgstr ""
msgid "Every month (Day %{day} at %{time})"
msgstr ""
+msgid "Every month on the %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Every three months"
msgstr ""
@@ -13489,6 +13701,15 @@ msgstr[1] ""
msgid "Every week (%{weekday} at %{time})"
msgstr ""
+msgid "Every week on %{day} at %{time} %{timezone}"
+msgstr ""
+
+msgid "Every year"
+msgstr ""
+
+msgid "Every year on %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Everyone"
msgstr ""
@@ -13525,9 +13746,6 @@ msgstr ""
msgid "Exactly one of %{attributes} is required"
msgstr ""
-msgid "Example: %{ip_address}. %{read_more_link}."
-msgstr ""
-
msgid "Example: @sub\\.company\\.com$"
msgstr ""
@@ -13594,13 +13812,13 @@ msgstr ""
msgid "Expand pipeline"
msgstr ""
-msgid "Expand sidebar"
+msgid "Expand settings section"
msgstr ""
-msgid "Expected documents: %{expected_documents}"
+msgid "Expand sidebar"
msgstr ""
-msgid "Experienced"
+msgid "Expected documents: %{expected_documents}"
msgstr ""
msgid "ExperimentSubject|Must have exactly one of User, Namespace, or Project."
@@ -13885,9 +14103,6 @@ msgstr ""
msgid "Failed to load related branches"
msgstr ""
-msgid "Failed to load sidebar lock status"
-msgstr ""
-
msgid "Failed to load stacktrace."
msgstr ""
@@ -14312,6 +14527,9 @@ msgstr ""
msgid "Files"
msgstr ""
+msgid "Files API Rate Limits"
+msgstr ""
+
msgid "Files breadcrumb"
msgstr ""
@@ -15311,6 +15529,9 @@ msgstr ""
msgid "GitLab group: %{source_link}"
msgstr ""
+msgid "GitLab informs you if a new version is available."
+msgstr ""
+
msgid "GitLab is a complete DevOps platform, delivered as a single application, fundamentally changing the way Development, Security, and Ops teams collaborate"
msgstr ""
@@ -15326,7 +15547,7 @@ msgstr ""
msgid "GitLab is open source software to collaborate on code."
msgstr ""
-msgid "GitLab is undergoing maintenance and is operating in a read-only mode."
+msgid "GitLab is undergoing maintenance and is operating in read-only mode."
msgstr ""
msgid "GitLab member or Email address"
@@ -15338,9 +15559,6 @@ msgstr ""
msgid "GitLab project export"
msgstr ""
-msgid "GitLab restart is required to apply changes."
-msgstr ""
-
msgid "GitLab single sign-on URL"
msgstr ""
@@ -15356,9 +15574,6 @@ msgstr ""
msgid "GitLab version"
msgstr ""
-msgid "GitLab will inform you if a new version is available."
-msgstr ""
-
msgid "GitLab will run a background job that will produce pseudonymized CSVs of the GitLab database that will be uploaded to your configured object storage directory."
msgstr ""
@@ -15623,9 +15838,21 @@ msgstr ""
msgid "Go to snippets"
msgstr ""
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check 'Allowed domains for sign-ups'."
+msgstr ""
+
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check 'Email restrictions for sign-ups'."
+msgstr ""
+
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check the 'Domain denylist'."
+msgstr ""
+
msgid "Go to the activity feed"
msgstr ""
+msgid "Go to the group’s 'Settings &gt; General' page, and check 'Restrict membership by email domain'."
+msgstr ""
+
msgid "Go to the milestone list"
msgstr ""
@@ -15662,6 +15889,12 @@ msgstr ""
msgid "Goal of the changes and what reviewers should be aware of"
msgstr ""
+msgid "Google Cloud"
+msgstr ""
+
+msgid "Google Cloud offers several deployment targets. Select the one most suitable for your project."
+msgstr ""
+
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
@@ -15746,9 +15979,6 @@ msgstr ""
msgid "Group ID"
msgstr ""
-msgid "Group ID: %{group_id}"
-msgstr ""
-
msgid "Group Owner must have signed in with SAML before enabling Group Managed Accounts"
msgstr ""
@@ -15923,6 +16153,12 @@ msgstr ""
msgid "GroupImport|Unable to process group import file"
msgstr ""
+msgid "GroupPage|Copy group ID"
+msgstr ""
+
+msgid "GroupPage|Group ID: %{group_id}"
+msgstr ""
+
msgid "GroupRoadmap|%{dateWord} – No end date"
msgstr ""
@@ -15977,6 +16213,9 @@ msgstr ""
msgid "GroupRoadmap|Within 3 years"
msgstr ""
+msgid "GroupSAML|\"persistent\" recommended"
+msgstr ""
+
msgid "GroupSAML|%{strongOpen}Warning%{strongClose} - Enabling %{linkStart}SSO enforcement%{linkEnd} can reduce security risks."
msgstr ""
@@ -16109,6 +16348,9 @@ msgstr ""
msgid "GroupSAML|To be able to prohibit outer forks, you first need to enforce dedicate group managed accounts."
msgstr ""
+msgid "GroupSAML|Use SAML group links to manage group membership using SAML."
+msgstr ""
+
msgid "GroupSAML|Valid SAML Response"
msgstr ""
@@ -16121,13 +16363,10 @@ msgstr ""
msgid "GroupSAML|as %{access_level}"
msgstr ""
-msgid "GroupSAML|must match stored NameID of \"%{extern_uid}\" as we use this to identify users. If the NameID changes users will be unable to sign in."
-msgstr ""
-
-msgid "GroupSAML|should be \"persistent\""
+msgid "GroupSAML|must match stored NameID of \"%{extern_uid}\" to identify user and allow sign in"
msgstr ""
-msgid "GroupSAML|should be a random persistent ID, emails are discouraged"
+msgid "GroupSAML|recommend persistent ID instead of email"
msgstr ""
msgid "GroupSelect|No matching results"
@@ -16142,9 +16381,15 @@ msgstr ""
msgid "GroupSettings|Allow project access token creation"
msgstr ""
+msgid "GroupSettings|Applied to all subgroups unless overridden by a group owner. Groups already added to the project lose access."
+msgstr ""
+
msgid "GroupSettings|Auto DevOps pipeline was updated for the group"
msgstr ""
+msgid "GroupSettings|Available only on the top-level group. Applies to all subgroups. Groups already shared with a group outside %{group} are still shared unless removed manually."
+msgstr ""
+
msgid "GroupSettings|Badges"
msgstr ""
@@ -16196,6 +16441,9 @@ msgstr ""
msgid "GroupSettings|New runners registration token has been generated!"
msgstr ""
+msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgstr ""
+
msgid "GroupSettings|Pipeline settings was updated for the group"
msgstr ""
@@ -16208,12 +16456,15 @@ msgstr ""
msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
-msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups."
+msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups"
msgstr ""
msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
msgstr ""
+msgid "GroupSettings|Prevents group members from being notified if the group is mentioned."
+msgstr ""
+
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
msgstr ""
@@ -16250,21 +16501,6 @@ msgstr ""
msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}."
msgstr ""
-msgid "GroupSettings|This setting is only available on the top-level group and it applies to all subgroups. Groups that have already been shared with a group outside %{group} will still be shared, and this access will have to be revoked manually."
-msgstr ""
-
-msgid "GroupSettings|This setting will be applied to all subgroups unless overridden by a group owner. Groups that already have access to the project will continue to have access unless removed manually."
-msgstr ""
-
-msgid "GroupSettings|This setting will override user notification preferences for all members of the group, subgroups, and projects."
-msgstr ""
-
-msgid "GroupSettings|This setting will prevent group members from being notified if the group is mentioned."
-msgstr ""
-
-msgid "GroupSettings|This setting will prevent group members from forking projects outside of the group."
-msgstr ""
-
msgid "GroupSettings|Transfer group"
msgstr ""
@@ -16382,7 +16618,7 @@ msgstr ""
msgid "GroupsNew|No import options available"
msgstr ""
-msgid "GroupsNew|Not all related objects are migrated, as %{docs_link_start}described here%{docs_link_end}. Please %{feedback_link_start}leave feedback%{feedback_link_end} on this feature."
+msgid "GroupsNew|Not all related objects are migrated. %{docs_link_start}More info%{docs_link_end}."
msgstr ""
msgid "GroupsNew|Personal access token"
@@ -16514,15 +16750,27 @@ msgstr ""
msgid "Hello %{name},"
msgstr ""
-msgid "Hello there"
-msgstr ""
-
msgid "Hello, %{name}!"
msgstr ""
msgid "Hello, %{username}!"
msgstr ""
+msgid "HelloMessage|%{handshake_emoji} Contribute to GitLab: %{contribute_link}"
+msgstr ""
+
+msgid "HelloMessage|%{magnifier_emoji} Create a new GitLab issue: %{new_issue_link}"
+msgstr ""
+
+msgid "HelloMessage|%{rocket_emoji} We like your curiosity! Help us improve GitLab by joining the team: %{jobs_page_link}"
+msgstr ""
+
+msgid "HelloMessage|Does this page need fixes or improvements? Open an issue or contribute a merge request to help make GitLab more lovable. At GitLab, everyone can contribute!"
+msgstr ""
+
+msgid "HelloMessage|Welcome to GitLab!"
+msgstr ""
+
msgid "Help"
msgstr ""
@@ -16532,13 +16780,10 @@ msgstr ""
msgid "Helps prevent bots from creating accounts."
msgstr ""
-msgid "Helps prevent bots from creating issues"
-msgstr ""
-
-msgid "Helps prevent malicious users hide their activity"
+msgid "Helps prevent bots from creating issues."
msgstr ""
-msgid "Helps reduce request volume (e.g. from crawlers or abusive bots)"
+msgid "Helps prevent malicious users hide their activity."
msgstr ""
msgid "Helps reduce request volume (for example, from crawlers or abusive bots)"
@@ -16662,6 +16907,12 @@ msgstr ""
msgid "Housekeeping, export, path, transfer, remove, archive."
msgstr ""
+msgid "How do I configure Akismet?"
+msgstr ""
+
+msgid "How do I configure it?"
+msgstr ""
+
msgid "How do I configure runners?"
msgstr ""
@@ -16683,19 +16934,25 @@ msgstr ""
msgid "How do I set up this service?"
msgstr ""
+msgid "How do I use a web terminal?"
+msgstr ""
+
+msgid "How do I use file templates?"
+msgstr ""
+
msgid "How it works"
msgstr ""
msgid "How many days need to pass between marking entity for deletion and actual removing it."
msgstr ""
-msgid "How many seconds an IP will be counted towards the limit"
+msgid "How many seconds an IP counts toward the IP address limit."
msgstr ""
-msgid "I accept the %{terms_link}"
+msgid "How the job limiter handles jobs exceeding the thresholds specified below. The 'track' mode only logs the jobs. The 'compress' mode compresses the jobs and raises an exception if the compressed size exceeds the limit."
msgstr ""
-msgid "I accept the|Terms of Service and Privacy Policy"
+msgid "I accept the %{terms_link}"
msgstr ""
msgid "I forgot my password"
@@ -16779,13 +17036,16 @@ msgstr ""
msgid "IP Address"
msgstr ""
-msgid "IP expiration time"
+msgid "IP address expiration time"
msgstr ""
-msgid "IP subnet restriction only allowed for top-level groups"
+msgid "IP address restrictions"
+msgstr ""
+
+msgid "IP addresses per user"
msgstr ""
-msgid "IPs per user"
+msgid "IP subnet restriction only allowed for top-level groups"
msgstr ""
msgid "Identifier"
@@ -16800,6 +17060,9 @@ msgstr ""
msgid "If any indexed field exceeds this limit it will be truncated to this number of characters and the rest will not be indexed or searchable. This does not apply to repository and wiki indexing. Setting this to 0 means it is unlimited."
msgstr ""
+msgid "If blank, defaults to %{code_open}Retry later%{code_close}."
+msgstr ""
+
msgid "If blank, set allowable lifetime to %{instance_level_policy_in_words}, as defined by the instance admin. Once set, existing tokens for users in this group may be revoked."
msgstr ""
@@ -16851,6 +17114,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 did not initiate these sign-in attempts, please reach out to your administrator or enable two-factor authentication (2FA) on your account."
+msgstr ""
+
msgid "If you did not initiate this change, please contact your administrator immediately."
msgstr ""
@@ -16942,10 +17208,10 @@ msgstr ""
msgid "Import Projects from Gitea"
msgstr ""
-msgid "Import a project"
+msgid "Import an exported GitLab project"
msgstr ""
-msgid "Import an exported GitLab project"
+msgid "Import and export rate limits"
msgstr ""
msgid "Import failed due to a GitHub error: %{original}"
@@ -16957,12 +17223,18 @@ msgstr ""
msgid "Import from Jira"
msgstr ""
+msgid "Import group"
+msgstr ""
+
msgid "Import group from file"
msgstr ""
msgid "Import groups"
msgstr ""
+msgid "Import history"
+msgstr ""
+
msgid "Import in progress"
msgstr ""
@@ -17026,7 +17298,25 @@ msgstr ""
msgid "Import timed out. Import took longer than %{import_jobs_expiration} seconds"
msgstr ""
-msgid "Import/Export Rate Limits"
+msgid "ImportAProjectModal|Import from a project"
+msgstr ""
+
+msgid "ImportAProjectModal|Import members from another project"
+msgstr ""
+
+msgid "ImportAProjectModal|Import project members"
+msgstr ""
+
+msgid "ImportAProjectModal|Only project members (not group members) are imported, and they get the same permissions as the project you import from."
+msgstr ""
+
+msgid "ImportAProjectModal|Successfully imported"
+msgstr ""
+
+msgid "ImportAProjectModal|Unable to import project members"
+msgstr ""
+
+msgid "ImportAProjectModal|You're importing members to the %{strongStart}%{name}%{strongEnd} project."
msgstr ""
msgid "ImportButtons|Connect repositories from"
@@ -17079,7 +17369,7 @@ msgstr[1] ""
msgid "Importing..."
msgstr ""
-msgid "Import|A repository URL usually ends in a .git suffix, although this is not required. Double check to make sure your repository URL is correct."
+msgid "Import|There is not a valid Git repository at this URL. If your HTTP repository is not publicly accessible, verify your credentials."
msgstr ""
msgid "Improve customer support with Service Desk"
@@ -17088,9 +17378,6 @@ msgstr ""
msgid "Improves Git cloning performance."
msgstr ""
-msgid "In %{time_to_now}"
-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 ""
@@ -17376,7 +17663,7 @@ msgstr ""
msgid "InProductMarketing|Start a GitLab Ultimate trial today in less than one minute, no credit card required."
msgstr ""
-msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no CC required"
+msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no credit card required"
msgstr ""
msgid "InProductMarketing|Start a trial"
@@ -17415,7 +17702,7 @@ msgstr ""
msgid "InProductMarketing|Team up in GitLab for greater efficiency"
msgstr ""
-msgid "InProductMarketing|Team work makes the dream work"
+msgid "InProductMarketing|Team work makes the dream work"
msgstr ""
msgid "InProductMarketing|Test, create, deploy"
@@ -17996,6 +18283,9 @@ msgstr ""
msgid "Integrations|Create new issue in Jira"
msgstr ""
+msgid "Integrations|Create new issue in ZenTao"
+msgstr ""
+
msgid "Integrations|Default settings are inherited from the group level."
msgstr ""
@@ -18089,9 +18379,15 @@ msgstr ""
msgid "Integrations|Search Jira issues"
msgstr ""
+msgid "Integrations|Search ZenTao issues"
+msgstr ""
+
msgid "Integrations|Send notifications about project events to Unify Circuit."
msgstr ""
+msgid "Integrations|Send notifications about project events to a Unify Circuit conversation. %{docs_link}"
+msgstr ""
+
msgid "Integrations|Sign in to add namespaces"
msgstr ""
@@ -18131,6 +18427,9 @@ msgstr ""
msgid "Integrations|You've activated every integration 🎉"
msgstr ""
+msgid "Integrations|ZenTao issues display here when you create issues in your project in ZenTao."
+msgstr ""
+
msgid "Interactive mode"
msgstr ""
@@ -18158,9 +18457,6 @@ msgstr ""
msgid "Interval Pattern"
msgstr ""
-msgid "Introducing Value Stream Analytics"
-msgstr ""
-
msgid "Introducing Your DevOps Report"
msgstr ""
@@ -18257,6 +18553,12 @@ msgstr ""
msgid "Investigate vulnerability: %{title}"
msgstr ""
+msgid "Invisible Captcha"
+msgstr ""
+
+msgid "Invisible Captcha helps prevent the creation of spam accounts. It adds a honeypot field and time-sensitive form submission to the account signup form."
+msgstr ""
+
msgid "Invitation"
msgstr ""
@@ -18710,12 +19012,18 @@ msgstr ""
msgid "Issues"
msgstr ""
+msgid "Issues I've created"
+msgstr ""
+
msgid "Issues Rate Limits"
msgstr ""
msgid "Issues and merge requests"
msgstr ""
+msgid "Issues assigned to me"
+msgstr ""
+
msgid "Issues can be bugs, tasks or ideas to be discussed. Also, issues are searchable and filterable."
msgstr ""
@@ -18827,7 +19135,7 @@ msgstr ""
msgid "Iterations|Create cadence"
msgstr ""
-msgid "Iterations|Create your first iteration"
+msgid "Iterations|Create iteration"
msgstr ""
msgid "Iterations|Delete cadence"
@@ -18836,6 +19144,9 @@ msgstr ""
msgid "Iterations|Delete iteration cadence?"
msgstr ""
+msgid "Iterations|Delete iteration?"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -18869,12 +19180,18 @@ msgstr ""
msgid "Iterations|New iteration cadence"
msgstr ""
+msgid "Iterations|No closed iterations."
+msgstr ""
+
msgid "Iterations|No iteration cadences to show."
msgstr ""
msgid "Iterations|No iterations in cadence."
msgstr ""
+msgid "Iterations|No open iterations."
+msgstr ""
+
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
@@ -18905,6 +19222,9 @@ msgstr ""
msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
msgstr ""
+msgid "Iterations|This will remove the iteration from any issues that are assigned to it."
+msgstr ""
+
msgid "Iterations|Title"
msgstr ""
@@ -18920,15 +19240,9 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "I’m familiar with the basics of DevOps."
-msgstr ""
-
msgid "I’m joining my team who’s already on GitLab"
msgstr ""
-msgid "I’m not familiar with the basics of DevOps."
-msgstr ""
-
msgid "Jaeger URL"
msgstr ""
@@ -19193,6 +19507,9 @@ msgstr ""
msgid "Job"
msgstr ""
+msgid "Job %{jobName}"
+msgstr ""
+
msgid "Job Failed #%{build_id}"
msgstr ""
@@ -19783,9 +20100,6 @@ msgstr ""
msgid "Learn more in the"
msgstr ""
-msgid "Learn more in the|pipeline schedules documentation"
-msgstr ""
-
msgid "Learn more."
msgstr ""
@@ -19897,9 +20211,6 @@ msgstr ""
msgid "Leave Admin Mode"
msgstr ""
-msgid "Leave blank for no limit. Once set, existing personal access tokens may be revoked."
-msgstr ""
-
msgid "Leave edit mode? All unsaved changes will be lost."
msgstr ""
@@ -19945,10 +20256,10 @@ msgstr ""
msgid "LicenseCompliance|Acceptable license to be used in the project"
msgstr ""
-msgid "LicenseCompliance|Add a license"
+msgid "LicenseCompliance|Add license and related policy"
msgstr ""
-msgid "LicenseCompliance|Add license and related policy"
+msgid "LicenseCompliance|Add license policy"
msgstr ""
msgid "LicenseCompliance|Allow"
@@ -20038,6 +20349,9 @@ msgstr ""
msgid "LicenseManagement|Uncategorized"
msgstr ""
+msgid "Licensed Enterprise Edition features can be used if the project namespace's plan includes the feature, or if the project is public."
+msgstr ""
+
msgid "Licensed Features"
msgstr ""
@@ -20104,7 +20418,10 @@ msgstr ""
msgid "Limit namespaces and projects that can be indexed"
msgstr ""
-msgid "Limit sign in from multiple ips"
+msgid "Limit project size at a global, group, and project level. %{link_start}Learn more%{link_end}."
+msgstr ""
+
+msgid "Limit sign in from multiple IP addresses"
msgstr ""
msgid "Limit the number of concurrent operations this secondary site can run in the background."
@@ -20116,11 +20433,17 @@ msgstr ""
msgid "Limit the number of issues and epics per minute a user can create through web and API requests."
msgstr ""
+msgid "Limit the size of Sidekiq jobs stored in Redis."
+msgstr ""
+
msgid "Limited to showing %d event at most"
msgid_plural "Limited to showing %d events at most"
msgstr[0] ""
msgstr[1] ""
+msgid "Limiting mode"
+msgstr ""
+
msgid "Line changes"
msgstr ""
@@ -20190,9 +20513,6 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
-msgid "List of users to be excluded from the limit"
-msgstr ""
-
msgid "List options"
msgstr ""
@@ -20232,9 +20552,6 @@ msgstr ""
msgid "Loading functions timed out. Please reload the page to try again."
msgstr ""
-msgid "Loading issues"
-msgstr ""
-
msgid "Loading more"
msgstr ""
@@ -20526,6 +20843,9 @@ msgstr ""
msgid "Marked For Deletion At - %{deletion_time}"
msgstr ""
+msgid "Marked as ready. Merging is now allowed."
+msgstr ""
+
msgid "Marked this %{noun} as a draft."
msgstr ""
@@ -20598,52 +20918,22 @@ msgstr ""
msgid "Max 100,000 events"
msgstr ""
-msgid "Max 20 characters"
-msgstr ""
-
-msgid "Max Group Export Download requests per minute per user"
-msgstr ""
-
-msgid "Max Group Export requests per minute per user"
-msgstr ""
-
-msgid "Max Group Import requests per minute per user"
-msgstr ""
-
-msgid "Max Project Export Download requests per minute per user"
-msgstr ""
-
-msgid "Max Project Export requests per minute per user"
-msgstr ""
-
-msgid "Max Project Import requests per minute per user"
-msgstr ""
-
-msgid "Max authenticated API requests per period per user"
-msgstr ""
-
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
-msgid "Max authenticated web requests per period per user"
-msgstr ""
-
msgid "Max file size is 200 KB."
msgstr ""
-msgid "Max requests per minute per user"
-msgstr ""
-
msgid "Max role"
msgstr ""
msgid "Max session time"
msgstr ""
-msgid "Max unauthenticated requests per period per IP"
+msgid "MaxBuilds"
msgstr ""
-msgid "MaxBuilds"
+msgid "Maximum 20 characters"
msgstr ""
msgid "Maximum Conan package file size in bytes"
@@ -20679,6 +20969,12 @@ msgstr ""
msgid "Maximum attachment size (MB)"
msgstr ""
+msgid "Maximum authenticated API requests per rate limit period per user"
+msgstr ""
+
+msgid "Maximum authenticated web requests per rate limit period per user"
+msgstr ""
+
msgid "Maximum bulk request size (MiB)"
msgstr ""
@@ -20724,6 +21020,15 @@ msgstr ""
msgid "Maximum files in a diff"
msgstr ""
+msgid "Maximum group export download requests per minute"
+msgstr ""
+
+msgid "Maximum group export requests per minute"
+msgstr ""
+
+msgid "Maximum group import requests per minute"
+msgstr ""
+
msgid "Maximum import size"
msgstr ""
@@ -20760,7 +21065,7 @@ msgstr ""
msgid "Maximum number of projects."
msgstr ""
-msgid "Maximum number of unique IPs per user"
+msgid "Maximum number of unique IP addresses per user."
msgstr ""
msgid "Maximum page reached"
@@ -20769,12 +21074,24 @@ msgstr ""
msgid "Maximum page size"
msgstr ""
+msgid "Maximum project export download requests per minute"
+msgstr ""
+
+msgid "Maximum project export requests per minute"
+msgstr ""
+
+msgid "Maximum project import requests per minute"
+msgstr ""
+
msgid "Maximum push size"
msgstr ""
msgid "Maximum push size (MB)"
msgstr ""
+msgid "Maximum requests per minute"
+msgstr ""
+
msgid "Maximum running slices"
msgstr ""
@@ -20802,10 +21119,16 @@ msgstr ""
msgid "Maximum time between updates that a mirror can have when scheduled to synchronize."
msgstr ""
-msgid "Maximum time for web terminal websocket connection (in seconds). 0 for unlimited."
+msgid "Maximum time that users are allowed to skip the setup of two-factor authentication (in hours). Set to 0 (zero) to enforce at next sign in."
msgstr ""
-msgid "Maximum time that users are allowed to skip the setup of two-factor authentication (in hours). Set to 0 (zero) to enforce at next sign in."
+msgid "Maximum time, in seconds, for a web terminal websocket connection. 0 for unlimited."
+msgstr ""
+
+msgid "Maximum unauthenticated API requests per rate limit period per IP"
+msgstr ""
+
+msgid "Maximum unauthenticated web requests per rate limit period per IP"
msgstr ""
msgid "May"
@@ -20823,9 +21146,6 @@ msgstr ""
msgid "Medium vulnerabilities present"
msgstr ""
-msgid "Member lock"
-msgstr ""
-
msgid "Member since"
msgstr ""
@@ -20862,6 +21182,9 @@ msgstr ""
msgid "Members of a group may only view projects they have permission to access"
msgstr ""
+msgid "Membership"
+msgstr ""
+
msgid "Members|%{time} by %{user}"
msgstr ""
@@ -20922,9 +21245,6 @@ msgstr ""
msgid "Members|Expiration date updated successfully."
msgstr ""
-msgid "Members|Expired"
-msgstr ""
-
msgid "Members|Filter members"
msgstr ""
@@ -20940,9 +21260,6 @@ msgstr ""
msgid "Members|Membership"
msgstr ""
-msgid "Members|No expiration set"
-msgstr ""
-
msgid "Members|Remove \"%{groupName}\""
msgstr ""
@@ -20964,9 +21281,6 @@ msgstr ""
msgid "Members|Search invited"
msgstr ""
-msgid "Members|in %{time}"
-msgstr ""
-
msgid "Member|Deny access"
msgstr ""
@@ -21042,9 +21356,6 @@ msgstr ""
msgid "Merge request %{mr_link} was reviewed by %{mr_author}"
msgstr ""
-msgid "Merge request (MR) approvals"
-msgstr ""
-
msgid "Merge request analytics"
msgstr ""
@@ -21066,12 +21377,21 @@ msgstr ""
msgid "Merge requests"
msgstr ""
+msgid "Merge requests I've created"
+msgstr ""
+
msgid "Merge requests are a place to propose changes you've made to a project and discuss those changes with others"
msgstr ""
msgid "Merge requests are read-only in a secondary Geo node"
msgstr ""
+msgid "Merge requests assigned to me"
+msgstr ""
+
+msgid "Merge requests that I'm a reviewer"
+msgstr ""
+
msgid "Merge the branch and fix any conflicts that come up"
msgstr ""
@@ -21132,10 +21452,10 @@ msgstr ""
msgid "MergeRequests|An error occurred while saving the draft comment."
msgstr ""
-msgid "MergeRequests|Failed to squash. Should be done manually."
+msgid "MergeRequests|Create issue to resolve thread"
msgstr ""
-msgid "MergeRequests|Resolve this thread in a new issue"
+msgid "MergeRequests|Failed to squash. Should be done manually."
msgstr ""
msgid "MergeRequests|Saving the comment failed"
@@ -21949,6 +22269,9 @@ msgstr ""
msgid "MoveIssue|Cannot move issue to project it originates from!"
msgstr ""
+msgid "MoveIssue|Cannot move issues of '%{issue_type}' type."
+msgstr ""
+
msgid "Moved issue to %{label} column in the board."
msgstr ""
@@ -22074,6 +22397,15 @@ 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. To learn more about reducing storage capacity please visit our docs."
msgstr ""
+msgid "NamespaceUserCap|Pending users must be reviewed and approved by a group owner. Learn more about %{user_caps_link_start}User Caps%{link_end} and %{users_pending_approval_link_start}Users Pending Approval%{link_end}."
+msgstr ""
+
+msgid "NamespaceUserCap|View pending user approvals"
+msgstr ""
+
+msgid "NamespaceUserCap|Your group has reached its billable member limit"
+msgstr ""
+
msgid "Namespaces"
msgstr ""
@@ -22116,9 +22448,6 @@ msgstr ""
msgid "Network"
msgstr ""
-msgid "Network Policy|New rule"
-msgstr ""
-
msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is inbound from a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
msgstr ""
@@ -22140,16 +22469,13 @@ msgstr ""
msgid "NetworkPolicies|%{strongOpen}any%{strongClose} port"
msgstr ""
-msgid "NetworkPolicies|+ Add alert"
-msgstr ""
-
msgid "NetworkPolicies|.yaml"
msgstr ""
msgid "NetworkPolicies|.yaml mode"
msgstr ""
-msgid "NetworkPolicies|Actions"
+msgid "NetworkPolicies|Add alert"
msgstr ""
msgid "NetworkPolicies|Alerts are intended to be selectively used for a limited number of events that are potentially concerning and warrant a manual review. Alerts should not be used as a substitute for a SIEM or a logging tool. High volume alerts are likely to be dropped so as to preserve the stability of GitLab's integration with Kubernetes."
@@ -22185,9 +22511,6 @@ msgstr ""
msgid "NetworkPolicies|Deny all traffic"
msgstr ""
-msgid "NetworkPolicies|Description"
-msgstr ""
-
msgid "NetworkPolicies|Edit policy"
msgstr ""
@@ -22200,9 +22523,6 @@ msgstr ""
msgid "NetworkPolicies|IP/subnet"
msgstr ""
-msgid "NetworkPolicies|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
-msgstr ""
-
msgid "NetworkPolicies|Invalid or empty policy"
msgstr ""
@@ -22212,19 +22532,16 @@ msgstr ""
msgid "NetworkPolicies|Kubernetes error: %{error}"
msgstr ""
-msgid "NetworkPolicies|Name"
-msgstr ""
-
msgid "NetworkPolicies|Network"
msgstr ""
-msgid "NetworkPolicies|Network traffic"
+msgid "NetworkPolicies|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
msgstr ""
-msgid "NetworkPolicies|New policy"
+msgid "NetworkPolicies|Network policy can be created after the environment is loaded successfully."
msgstr ""
-msgid "NetworkPolicies|No policies detected"
+msgid "NetworkPolicies|Network traffic"
msgstr ""
msgid "NetworkPolicies|None selected"
@@ -22233,21 +22550,12 @@ msgstr ""
msgid "NetworkPolicies|Please %{installLinkStart}install%{installLinkEnd} and %{configureLinkStart}configure a Kubernetes Agent for this project%{configureLinkEnd} to enable alerts."
msgstr ""
-msgid "NetworkPolicies|Policies are a specification of how groups of pods are allowed to communicate with each other's network endpoints."
-msgstr ""
-
msgid "NetworkPolicies|Policy %{policyName} was successfully changed"
msgstr ""
msgid "NetworkPolicies|Policy definition"
msgstr ""
-msgid "NetworkPolicies|Policy editor"
-msgstr ""
-
-msgid "NetworkPolicies|Policy preview"
-msgstr ""
-
msgid "NetworkPolicies|Rule"
msgstr ""
@@ -22257,9 +22565,6 @@ msgstr ""
msgid "NetworkPolicies|Rule mode is unavailable for this policy. In some cases, we cannot parse the YAML file back into the rules editor."
msgstr ""
-msgid "NetworkPolicies|Rules"
-msgstr ""
-
msgid "NetworkPolicies|Save changes"
msgstr ""
@@ -22272,9 +22577,6 @@ msgstr ""
msgid "NetworkPolicies|Traffic that does not match any rule will be blocked."
msgstr ""
-msgid "NetworkPolicies|Unable to parse policy"
-msgstr ""
-
msgid "NetworkPolicies|all DNS names"
msgstr ""
@@ -22454,6 +22756,9 @@ msgstr ""
msgid "New issue"
msgstr ""
+msgid "New issue in %{project}"
+msgstr ""
+
msgid "New issue title"
msgstr ""
@@ -22532,7 +22837,7 @@ msgstr ""
msgid "Newest first"
msgstr ""
-msgid "Newly registered users will by default be external"
+msgid "Newly-registered users are external by default"
msgstr ""
msgid "Next"
@@ -22847,8 +23152,10 @@ msgstr ""
msgid "No webhooks found, add one in the form above."
msgstr ""
-msgid "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} to renew your subscription."
-msgstr ""
+msgid "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} day to renew your subscription."
+msgid_plural "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} days to renew your subscription."
+msgstr[0] ""
+msgstr[1] ""
msgid "No. of commits"
msgstr ""
@@ -22865,7 +23172,7 @@ msgstr ""
msgid "Nodes"
msgstr ""
-msgid "Non-admin users can sign in with read-only access and make read-only API requests."
+msgid "Non-admin users are restricted to read-only access, in both GitLab UI and API."
msgstr ""
msgid "None"
@@ -22946,7 +23253,7 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
-msgid "Notes Rate Limits"
+msgid "Notes rate limit"
msgstr ""
msgid "Notes|Are you sure you want to cancel creating this comment?"
@@ -23113,9 +23420,6 @@ msgstr ""
msgid "November"
msgstr ""
-msgid "Novice"
-msgstr ""
-
msgid "Now, personalize your GitLab experience"
msgstr ""
@@ -23284,7 +23588,7 @@ msgstr ""
msgid "OnCallSchedules|For this rotation, on-call will be:"
msgstr ""
-msgid "OnCallSchedules|On-call schedule %{schedule} in Project %{project}"
+msgid "OnCallSchedules|On-call schedule %{obstacle} in Project %{project}"
msgstr ""
msgid "OnCallSchedules|On-call schedules"
@@ -23431,22 +23735,22 @@ msgstr ""
msgid "OnDemandScans|Scanner profile"
msgstr ""
-msgid "OnDemandScans|Select one of the existing profiles"
+msgid "OnDemandScans|Schedule scan"
msgstr ""
-msgid "OnDemandScans|Site profile"
+msgid "OnDemandScans|Select one of the existing profiles"
msgstr ""
-msgid "OnDemandScans|Use existing scanner profile"
+msgid "OnDemandScans|Site profile"
msgstr ""
-msgid "OnDemandScans|Use existing site profile"
+msgid "OnDemandScans|Start time"
msgstr ""
-msgid "OnDemandScans|You can either choose a passive scan or validate the target site in your chosen site profile. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
+msgid "OnDemandScans|Use existing scanner profile"
msgstr ""
-msgid "OnDemandScans|You cannot run an active scan against an unvalidated site."
+msgid "OnDemandScans|Use existing site profile"
msgstr ""
msgid "OnDemandScans|You must create a repository within your project to run an on-demand scan."
@@ -23511,6 +23815,9 @@ msgstr ""
msgid "Only admins can delete project"
msgstr ""
+msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
+msgstr ""
+
msgid "Only include features new to your current subscription tier."
msgstr ""
@@ -23529,6 +23836,12 @@ msgstr ""
msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
+msgid "Only reCAPTCHA v2 is supported:"
+msgstr ""
+
+msgid "Only users from the specified IP address ranges are able to reach this group, including all subgroups, projects, and Git repositories."
+msgstr ""
+
msgid "Only verified users with an email address in any of these domains can be added to the group."
msgstr ""
@@ -23715,9 +24028,6 @@ msgstr ""
msgid "Package Registry"
msgstr ""
-msgid "Package Registry Rate Limits"
-msgstr ""
-
msgid "Package Registry: authenticated API requests"
msgstr ""
@@ -23736,6 +24046,9 @@ msgstr ""
msgid "Package recipe already exists"
msgstr ""
+msgid "Package registry rate limits"
+msgstr ""
+
msgid "Package type"
msgstr ""
@@ -23802,6 +24115,9 @@ msgstr ""
msgid "PackageRegistry|Composer"
msgstr ""
+msgid "PackageRegistry|Composer.json with license: %{license} and version: %{version}"
+msgstr ""
+
msgid "PackageRegistry|Conan"
msgstr ""
@@ -23865,6 +24181,9 @@ msgstr ""
msgid "PackageRegistry|Copy require package include"
msgstr ""
+msgid "PackageRegistry|Copy target SHA"
+msgstr ""
+
msgid "PackageRegistry|Copy yarn command"
msgstr ""
@@ -23931,6 +24250,9 @@ msgstr ""
msgid "PackageRegistry|Install package version"
msgstr ""
+msgid "PackageRegistry|Instance-level"
+msgstr ""
+
msgid "PackageRegistry|Invalid Package: failed metadata extraction"
msgstr ""
@@ -23976,6 +24298,9 @@ msgstr ""
msgid "PackageRegistry|Pip Command"
msgstr ""
+msgid "PackageRegistry|Project-level"
+msgstr ""
+
msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
msgstr ""
@@ -23997,6 +24322,9 @@ msgstr ""
msgid "PackageRegistry|Remove package"
msgstr ""
+msgid "PackageRegistry|Required Python: %{pythonVersion}"
+msgstr ""
+
msgid "PackageRegistry|RubyGems"
msgstr ""
@@ -24039,6 +24367,9 @@ msgstr ""
msgid "PackageRegistry|Source project located at %{link}"
msgstr ""
+msgid "PackageRegistry|Target SHA: %{sha}"
+msgstr ""
+
msgid "PackageRegistry|There are no other versions of this package."
msgstr ""
@@ -24207,6 +24538,18 @@ msgstr ""
msgid "Password was successfully updated. Please sign in again."
msgstr ""
+msgid "PasswordPrompt|Confirm password"
+msgstr ""
+
+msgid "PasswordPrompt|Confirm password to continue"
+msgstr ""
+
+msgid "PasswordPrompt|Password is required"
+msgstr ""
+
+msgid "PasswordPrompt|Please enter your password to confirm"
+msgstr ""
+
msgid "Passwords should be unique and not used for any other sites or services."
msgstr ""
@@ -24234,6 +24577,9 @@ msgstr ""
msgid "Paste project path (i.e. gitlab-org/gitlab)"
msgstr ""
+msgid "Paste this DSN into your Sentry SDK"
+msgstr ""
+
msgid "Paste your public SSH key, which is usually contained in the file '~/.ssh/id_ed25519.pub' or '~/.ssh/id_rsa.pub' and begins with 'ssh-ed25519' or 'ssh-rsa'. Do not paste your private SSH key, as that can compromise your identity."
msgstr ""
@@ -24318,6 +24664,9 @@ msgstr ""
msgid "PerformanceBar|First Contentful Paint"
msgstr ""
+msgid "PerformanceBar|Flamegraph with mode:"
+msgstr ""
+
msgid "PerformanceBar|Frontend resources"
msgstr ""
@@ -24351,6 +24700,15 @@ msgstr ""
msgid "PerformanceBar|Trace"
msgstr ""
+msgid "PerformanceBar|cpu"
+msgstr ""
+
+msgid "PerformanceBar|object"
+msgstr ""
+
+msgid "PerformanceBar|wall"
+msgstr ""
+
msgid "Period in seconds"
msgstr ""
@@ -24579,6 +24937,48 @@ msgstr ""
msgid "PipelineSchedules|Variables"
msgstr ""
+msgid "PipelineSource|API"
+msgstr ""
+
+msgid "PipelineSource|Chat"
+msgstr ""
+
+msgid "PipelineSource|External"
+msgstr ""
+
+msgid "PipelineSource|External Pull Request"
+msgstr ""
+
+msgid "PipelineSource|Merge Request"
+msgstr ""
+
+msgid "PipelineSource|On-Demand DAST Scan"
+msgstr ""
+
+msgid "PipelineSource|On-Demand DAST Validation"
+msgstr ""
+
+msgid "PipelineSource|Parent Pipeline"
+msgstr ""
+
+msgid "PipelineSource|Pipeline"
+msgstr ""
+
+msgid "PipelineSource|Push"
+msgstr ""
+
+msgid "PipelineSource|Schedule"
+msgstr ""
+
+msgid "PipelineSource|Trigger"
+msgstr ""
+
+msgid "PipelineSource|Web"
+msgstr ""
+
+msgid "PipelineSource|Web IDE"
+msgstr ""
+
msgid "PipelineStatusTooltip|Pipeline: %{ciStatus}"
msgstr ""
@@ -24879,46 +25279,7 @@ msgstr ""
msgid "Pipeline|Source"
msgstr ""
-msgid "Pipeline|Source|API"
-msgstr ""
-
-msgid "Pipeline|Source|Chat"
-msgstr ""
-
-msgid "Pipeline|Source|External"
-msgstr ""
-
-msgid "Pipeline|Source|External Pull Request"
-msgstr ""
-
-msgid "Pipeline|Source|Merge Request"
-msgstr ""
-
-msgid "Pipeline|Source|On-Demand DAST Scan"
-msgstr ""
-
-msgid "Pipeline|Source|On-Demand DAST Validation"
-msgstr ""
-
-msgid "Pipeline|Source|Parent Pipeline"
-msgstr ""
-
-msgid "Pipeline|Source|Pipeline"
-msgstr ""
-
-msgid "Pipeline|Source|Push"
-msgstr ""
-
-msgid "Pipeline|Source|Schedule"
-msgstr ""
-
-msgid "Pipeline|Source|Trigger"
-msgstr ""
-
-msgid "Pipeline|Source|Web"
-msgstr ""
-
-msgid "Pipeline|Source|Web IDE"
+msgid "Pipeline|Source|Security Policy"
msgstr ""
msgid "Pipeline|Specify variable values to be used in this run. The values specified in %{linkStart}CI/CD settings%{linkEnd} will be used by default."
@@ -24969,7 +25330,7 @@ msgstr ""
msgid "Pipeline|We are currently unable to fetch pipeline data"
msgstr ""
-msgid "Pipeline|You’re about to stop pipeline %{pipelineId}."
+msgid "Pipeline|You’re about to stop pipeline #%{pipelineId}."
msgstr ""
msgid "Pipeline|for"
@@ -24996,6 +25357,9 @@ msgstr ""
msgid "Plain diff"
msgstr ""
+msgid "Plain-text response to send to clients that hit a rate limit"
+msgstr ""
+
msgid "Plan:"
msgstr ""
@@ -25140,9 +25504,6 @@ msgstr ""
msgid "Please provide attributes to update"
msgstr ""
-msgid "Please provide your username or email address."
-msgstr ""
-
msgid "Please reach out if you have any questions and we'll be happy to assist."
msgstr ""
@@ -25185,9 +25546,6 @@ msgstr ""
msgid "Please set a new password before proceeding."
msgstr ""
-msgid "Please share your feedback about %{featureName} %{linkStart}in this issue%{linkEnd} to help us improve the experience."
-msgstr ""
-
msgid "Please solve the captcha"
msgstr ""
@@ -25365,6 +25723,9 @@ msgstr ""
msgid "Prevent adding new members to project membership within this group"
msgstr ""
+msgid "Prevent auto-stopping"
+msgstr ""
+
msgid "Prevent editing approval rules in projects and merge requests."
msgstr ""
@@ -25377,7 +25738,7 @@ msgstr ""
msgid "Prevent users from changing their profile name"
msgstr ""
-msgid "Prevent users from performing write operations on GitLab while performing maintenance."
+msgid "Prevent users from performing write operations while GitLab maintenance is in progress."
msgstr ""
msgid "Preview"
@@ -25650,6 +26011,9 @@ msgstr ""
msgid "Profiles|Enter your name, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Enter your password to confirm the email change"
+msgstr ""
+
msgid "Profiles|Enter your pronouns to let people know how to refer to you"
msgstr ""
@@ -25884,10 +26248,10 @@ msgstr ""
msgid "Profiles|e.g. My MacBook key"
msgstr ""
-msgid "Profiles|username"
+msgid "Profiles|https://website.com"
msgstr ""
-msgid "Profiles|website.com"
+msgid "Profiles|username"
msgstr ""
msgid "Profiles|your account"
@@ -26130,9 +26494,21 @@ msgstr ""
msgid "ProjectSelect| or group"
msgstr ""
+msgid "ProjectSelect|No matching results"
+msgstr ""
+
msgid "ProjectSelect|Search for project"
msgstr ""
+msgid "ProjectSelect|Search projects"
+msgstr ""
+
+msgid "ProjectSelect|Select a project"
+msgstr ""
+
+msgid "ProjectSelect|There was an error fetching the projects. Please try again."
+msgstr ""
+
msgid "ProjectService|Drone server URL"
msgstr ""
@@ -26220,6 +26596,9 @@ msgstr ""
msgid "ProjectService|Trigger event when a new, unique alert is recorded."
msgstr ""
+msgid "ProjectService|Trigger event when a new, unique vulnerability is recorded. (Note: This feature requires an Ultimate plan.)"
+msgstr ""
+
msgid "ProjectService|Trigger event when a pipeline status changes."
msgstr ""
@@ -26634,9 +27013,15 @@ msgstr ""
msgid "Projects are graded based on the highest severity vulnerability present"
msgstr ""
+msgid "Projects are organized into groups"
+msgstr ""
+
msgid "Projects contributed to"
msgstr ""
+msgid "Projects help you organize your work. They contain your file repository, issues, merge requests, and so much more."
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr ""
@@ -26871,10 +27256,10 @@ msgstr ""
msgid "PrometheusService|Prometheus cluster integration"
msgstr ""
-msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
+msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
msgstr ""
-msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
+msgid "PrometheusService|The ID of the IAP-secured resource."
msgstr ""
msgid "PrometheusService|The Prometheus API base URL."
@@ -27492,6 +27877,9 @@ msgstr ""
msgid "Rate limit"
msgstr ""
+msgid "Rate limits can help reduce request volume (like from crawlers or abusive bots)."
+msgstr ""
+
msgid "Raw blob request rate limit per minute"
msgstr ""
@@ -27504,6 +27892,9 @@ msgstr ""
msgid "Re-authentication required"
msgstr ""
+msgid "Re-import"
+msgstr ""
+
msgid "Re-request review"
msgstr ""
@@ -27525,6 +27916,9 @@ msgstr ""
msgid "Read more about related issues"
msgstr ""
+msgid "Read their documentation."
+msgstr ""
+
msgid "Ready to get started with GitLab? Follow these steps to set up your workspace, plan and commit changes, and deploy your project."
msgstr ""
@@ -27558,6 +27952,9 @@ msgstr ""
msgid "Receive any notifications from GitLab."
msgstr ""
+msgid "Receive notification of abuse reports by email."
+msgstr ""
+
msgid "Receive notifications about your own activity"
msgstr ""
@@ -27701,9 +28098,6 @@ msgstr ""
msgid "Registry setup"
msgstr ""
-msgid "Regulate approvals by authors/committers. Affects all projects."
-msgstr ""
-
msgid "Reindexing Status: %{status} (Slice multiplier: %{multiplier}, Maximum running slices: %{max_slices})"
msgstr ""
@@ -27799,6 +28193,9 @@ msgstr ""
msgid "Release|Something went wrong while saving the release details."
msgstr ""
+msgid "Reload page"
+msgstr ""
+
msgid "Remediations"
msgstr ""
@@ -28081,6 +28478,9 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
+msgid "Repeats"
+msgstr ""
+
msgid "Replace"
msgstr ""
@@ -28443,10 +28843,7 @@ msgstr ""
msgid "Require additional authentication for administrative tasks."
msgstr ""
-msgid "Require all users in this group to setup Two-factor authentication"
-msgstr ""
-
-msgid "Require all users in this group to setup two-factor authentication"
+msgid "Require all users in this group to set up two-factor authentication"
msgstr ""
msgid "Required approvals (%{approvals_given} given)"
@@ -28492,6 +28889,9 @@ msgstr[1] ""
msgid "Requires values to meet regular expression requirements."
msgstr ""
+msgid "Requires you to deploy or set up cloud-hosted Sentry."
+msgstr ""
+
msgid "Requires your primary GitLab email address."
msgstr ""
@@ -28552,9 +28952,6 @@ msgstr ""
msgid "Resolve"
msgstr ""
-msgid "Resolve all threads in new issue"
-msgstr ""
-
msgid "Resolve conflicts"
msgstr ""
@@ -28612,6 +29009,9 @@ msgstr ""
msgid "Response text"
msgstr ""
+msgid "Restart GitLab to apply changes."
+msgstr ""
+
msgid "Restart Terminal"
msgstr ""
@@ -28630,6 +29030,9 @@ msgstr ""
msgid "Restoring the project will prevent the project from being removed on this date and restore people's ability to make changes to it."
msgstr ""
+msgid "Restrict group access by IP address. %{link_start}Learn more%{link_end}."
+msgstr ""
+
msgid "Restrict membership by email domain"
msgstr ""
@@ -28943,6 +29346,9 @@ msgstr ""
msgid "Runners|Runner #%{runner_id}"
msgstr ""
+msgid "Runners|Runner assigned to project."
+msgstr ""
+
msgid "Runners|Runner is offline, last contact was %{runner_contact} ago"
msgstr ""
@@ -28955,6 +29361,9 @@ msgstr ""
msgid "Runners|Runner registration"
msgstr ""
+msgid "Runners|Runner unassigned from project."
+msgstr ""
+
msgid "Runners|Runners"
msgstr ""
@@ -29147,7 +29556,7 @@ msgstr ""
msgid "SastEntryPoints|How do I set up SAST?"
msgstr ""
-msgid "SastEntryPoints|Learn more."
+msgid "SastEntryPoints|Learn more"
msgstr ""
msgid "Satisfied"
@@ -29189,7 +29598,7 @@ msgstr ""
msgid "Save pipeline schedule"
msgstr ""
-msgid "Save space and find images in the container Registry. remove unneeded tags and keep only the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
+msgid "Save storage space by automatically deleting tags from the container registry and keeping the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
msgstr ""
msgid "Saving"
@@ -29363,6 +29772,9 @@ msgstr ""
msgid "Search or filter results…"
msgstr ""
+msgid "Search or jump to..."
+msgstr ""
+
msgid "Search project"
msgstr ""
@@ -29423,16 +29835,16 @@ msgstr ""
msgid "SearchCodeResults|of %{link_to_project}"
msgstr ""
-msgid "SearchResults|Showing %{count} %{scope} for%{term_element}"
+msgid "SearchResults|Showing %{count} %{scope} for %{term_element}"
msgstr ""
-msgid "SearchResults|Showing %{count} %{scope} for%{term_element} in your personal and project snippets"
+msgid "SearchResults|Showing %{count} %{scope} for %{term_element} in your personal and project snippets"
msgstr ""
-msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for%{term_element}"
+msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for %{term_element}"
msgstr ""
-msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for%{term_element} in your personal and project snippets"
+msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for %{term_element} in your personal and project snippets"
msgstr ""
msgid "SearchResults|code result"
@@ -29514,6 +29926,9 @@ msgstr ""
msgid "Secret Detection"
msgstr ""
+msgid "Secret access key"
+msgstr ""
+
msgid "Secret token"
msgstr ""
@@ -29553,9 +29968,6 @@ msgstr ""
msgid "SecurityApprovals|A merge request approval is required when the license compliance report contains a denied license."
msgstr ""
-msgid "SecurityApprovals|Configurable if security scanners are enabled. %{linkStart}Learn more.%{linkEnd}"
-msgstr ""
-
msgid "SecurityApprovals|Coverage-Check"
msgstr ""
@@ -29568,24 +29980,18 @@ msgstr ""
msgid "SecurityApprovals|Learn more about Vulnerability-Check"
msgstr ""
-msgid "SecurityApprovals|License Scanning must be enabled. %{linkStart}Learn more%{linkEnd}."
-msgstr ""
-
msgid "SecurityApprovals|License-Check"
msgstr ""
msgid "SecurityApprovals|Requires approval for Denied licenses. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}More information%{linkEnd}"
+msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "SecurityApprovals|Requires approval for vulnerabilities. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
-msgid "SecurityApprovals|Test coverage must be enabled. %{linkStart}Learn more%{linkEnd}."
-msgstr ""
-
msgid "SecurityApprovals|Vulnerability-Check"
msgstr ""
@@ -29649,6 +30055,12 @@ msgstr ""
msgid "SecurityConfiguration|Immediately begin risk analysis and remediation with application security features. Start with SAST and Secret Detection, available to all plans. Upgrade to Ultimate to get all features, including:"
msgstr ""
+msgid "SecurityConfiguration|Manage corpus"
+msgstr ""
+
+msgid "SecurityConfiguration|Manage corpus files used as mutation sources in coverage fuzzing."
+msgstr ""
+
msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
msgstr ""
@@ -29703,6 +30115,12 @@ msgstr ""
msgid "SecurityOrchestration|Action"
msgstr ""
+msgid "SecurityOrchestration|Actions"
+msgstr ""
+
+msgid "SecurityOrchestration|Add rule"
+msgstr ""
+
msgid "SecurityOrchestration|All policies"
msgstr ""
@@ -29736,9 +30154,6 @@ msgstr ""
msgid "SecurityOrchestration|Network"
msgstr ""
-msgid "SecurityOrchestration|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
-msgstr ""
-
msgid "SecurityOrchestration|New policy"
msgstr ""
@@ -29754,6 +30169,9 @@ msgstr ""
msgid "SecurityOrchestration|Policy editor"
msgstr ""
+msgid "SecurityOrchestration|Policy preview"
+msgstr ""
+
msgid "SecurityOrchestration|Policy status"
msgstr ""
@@ -29763,6 +30181,9 @@ msgstr ""
msgid "SecurityOrchestration|Rule"
msgstr ""
+msgid "SecurityOrchestration|Rules"
+msgstr ""
+
msgid "SecurityOrchestration|Scan Execution"
msgstr ""
@@ -29856,6 +30277,9 @@ msgstr ""
msgid "SecurityReports|Create issue"
msgstr ""
+msgid "SecurityReports|Development vulnerabilities"
+msgstr ""
+
msgid "SecurityReports|Dismiss vulnerability"
msgstr ""
@@ -29871,6 +30295,9 @@ msgstr ""
msgid "SecurityReports|Download results"
msgstr ""
+msgid "SecurityReports|Download scanned URLs"
+msgstr ""
+
msgid "SecurityReports|Download scanned resources"
msgstr ""
@@ -29994,6 +30421,9 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
+msgid "SecurityReports|The Vulnerability Report shows the results of the lastest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "SecurityReports|The security reports below contain one or more vulnerability findings that could not be parsed and were not recorded. Download the artifacts in the job output to investigate. Ensure any security report created conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
msgstr ""
@@ -30135,10 +30565,10 @@ msgstr ""
msgid "Select a repository"
msgstr ""
-msgid "Select a role"
+msgid "Select a repository containing templates for common files."
msgstr ""
-msgid "Select a shared template repository for all projects on this instance."
+msgid "Select a role"
msgstr ""
msgid "Select a template repository"
@@ -30216,6 +30646,9 @@ msgstr ""
msgid "Select project to choose zone"
msgstr ""
+msgid "Select project to create issue"
+msgstr ""
+
msgid "Select projects"
msgstr ""
@@ -30333,6 +30766,9 @@ msgstr ""
msgid "Send emails to help guide new users through the onboarding process."
msgstr ""
+msgid "Send emails to users upon account deactivation."
+msgstr ""
+
msgid "Send message"
msgstr ""
@@ -30351,6 +30787,9 @@ msgstr ""
msgid "Send service data"
msgstr ""
+msgid "Sentry"
+msgstr ""
+
msgid "Sentry API URL"
msgstr ""
@@ -30465,6 +30904,9 @@ msgstr ""
msgid "Service"
msgstr ""
+msgid "Service Accounts keys are required to authorize GitLab to deploy your Google Cloud project."
+msgstr ""
+
msgid "Service Desk"
msgstr ""
@@ -30537,15 +30979,15 @@ msgstr ""
msgid "Set a password on your account to pull or push via %{protocol}."
msgstr ""
-msgid "Set a template repository for projects in this group"
-msgstr ""
-
msgid "Set access permissions for this token."
msgstr ""
msgid "Set an instance-wide domain that will be available to all clusters when installing Knative."
msgstr ""
+msgid "Set any rate limit to %{code_open}0%{code_close} to disable the limit."
+msgstr ""
+
msgid "Set default and restrict visibility levels. Configure import sources and git access protocol."
msgstr ""
@@ -30558,7 +31000,7 @@ msgstr ""
msgid "Set limit to 0 to allow any file size."
msgstr ""
-msgid "Set max session time for web terminal."
+msgid "Set limits for web and API requests."
msgstr ""
msgid "Set milestone"
@@ -30567,15 +31009,18 @@ msgstr ""
msgid "Set new password"
msgstr ""
-msgid "Set notification email for abuse reports."
+msgid "Set parent epic to an epic"
msgstr ""
-msgid "Set parent epic to an epic"
+msgid "Set per-user rate limits for imports and exports of projects and groups."
msgstr ""
msgid "Set projects and maximum size limits, session duration, user options, and check feature availability for namespace plan."
msgstr ""
+msgid "Set rate limits for package registry API requests that supersede the general user and IP rate limits."
+msgstr ""
+
msgid "Set severity"
msgstr ""
@@ -30594,15 +31039,24 @@ msgstr ""
msgid "Set the default branch for this project. All merge requests and commits are made against this branch unless you specify a different one."
msgstr ""
+msgid "Set the default expiration time for job artifacts in all projects. Set to %{code_open}0%{code_close} to never expire artifacts by default. If no unit is written, it defaults to seconds. For example, these are all equivalent: %{code_open}3600%{code_close}, %{code_open}60 minutes%{code_close}, or %{code_open}one hour%{code_close}."
+msgstr ""
+
msgid "Set the due date to %{due_date}."
msgstr ""
msgid "Set the iteration to %{iteration_reference}."
msgstr ""
+msgid "Set the maximum session time for a web terminal."
+msgstr ""
+
msgid "Set the milestone to %{milestone_reference}."
msgstr ""
+msgid "Set the per-user rate limit for notes created by web or API requests."
+msgstr ""
+
msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
msgstr ""
@@ -30804,6 +31258,9 @@ msgstr ""
msgid "Show Pipeline IID"
msgstr ""
+msgid "Show all %{issuable_type}."
+msgstr ""
+
msgid "Show all activity"
msgstr ""
@@ -30855,15 +31312,9 @@ msgstr ""
msgid "Show list"
msgstr ""
-msgid "Show me advanced features"
-msgstr ""
-
msgid "Show me how to add a pipeline"
msgstr ""
-msgid "Show me the basics"
-msgstr ""
-
msgid "Show one file at a time"
msgstr ""
@@ -30904,15 +31355,15 @@ msgstr ""
msgid "Showing %{pageSize} of %{total} %{issuableType}"
msgstr ""
-msgid "Showing %{pageSize} of %{total} issues"
-msgstr ""
-
msgid "Showing all epics"
msgstr ""
msgid "Showing all issues"
msgstr ""
+msgid "Showing data for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
+msgstr ""
+
msgid "Showing data for workflow items created in this date range. Date range cannot exceed %{maxDateRange} days."
msgstr ""
@@ -30952,6 +31403,15 @@ msgstr ""
msgid "Sidebar|Weight"
msgstr ""
+msgid "Sidekiq job compression threshold (bytes)"
+msgstr ""
+
+msgid "Sidekiq job size limit (bytes)"
+msgstr ""
+
+msgid "Sidekiq job size limits"
+msgstr ""
+
msgid "Sign in"
msgstr ""
@@ -31072,6 +31532,9 @@ msgstr ""
msgid "Site profile not found for given parameters"
msgstr ""
+msgid "Sites"
+msgstr ""
+
msgid "Size"
msgstr ""
@@ -31102,19 +31565,22 @@ msgstr ""
msgid "SlackIntegration|Sends notifications about project events to Slack channels."
msgstr ""
-msgid "SlackService|2. Paste the %{strong_open}Token%{strong_close} into the field below"
+msgid "SlackService|1. %{slash_command_link_start}Add a slash command%{slash_command_link_end} in your Slack team using this information:"
msgstr ""
-msgid "SlackService|3. Select the %{strong_open}Active%{strong_close} checkbox, press %{strong_open}Save changes%{strong_close} and start using GitLab inside Slack!"
+msgid "SlackService|2. Paste the token from Slack in the %{strong_open}Token%{strong_close} field below."
msgstr ""
-msgid "SlackService|Fill in the word that works best for your team."
+msgid "SlackService|3. Select the %{strong_open}Active%{strong_close} checkbox, select %{strong_open}Save changes%{strong_close}, and start using slash commands in Slack!"
+msgstr ""
+
+msgid "SlackService|After setup, get a list of available Slack slash commands by entering"
msgstr ""
-msgid "SlackService|See list of available commands in Slack after setting up this service, by entering"
+msgid "SlackService|Fill in the word that works best for your team."
msgstr ""
-msgid "SlackService|This service allows users to perform common operations on this project by entering slash commands in Slack."
+msgid "SlackService|Perform common operations in this project by entering slash commands in Slack."
msgstr ""
msgid "Slice multiplier"
@@ -31180,7 +31646,7 @@ msgstr ""
msgid "Some child epics may be hidden due to applied filters"
msgstr ""
-msgid "Some common domains are not allowed. %{read_more_link}."
+msgid "Some common domains are not allowed. %{learn_more_link}."
msgstr ""
msgid "Some of the designs you tried uploading did not change:"
@@ -31264,9 +31730,6 @@ msgstr ""
msgid "Something went wrong while exporting requirements"
msgstr ""
-msgid "Something went wrong while fetching %{listType} list"
-msgstr ""
-
msgid "Something went wrong while fetching branches"
msgstr ""
@@ -31321,15 +31784,9 @@ msgstr ""
msgid "Something went wrong while merging this merge request. Please try again."
msgstr ""
-msgid "Something went wrong while moving issues."
-msgstr ""
-
msgid "Something went wrong while obtaining the Let's Encrypt certificate."
msgstr ""
-msgid "Something went wrong while performing the action."
-msgstr ""
-
msgid "Something went wrong while promoting the issue to an epic. Please try again."
msgstr ""
@@ -31657,7 +32114,10 @@ msgstr ""
msgid "SourcegraphPreferences|Uses a custom %{linkStart}Sourcegraph instance%{linkEnd}."
msgstr ""
-msgid "Spam Check API Key"
+msgid "Spam Check"
+msgstr ""
+
+msgid "Spam Check API key"
msgstr ""
msgid "Spam Logs"
@@ -31675,7 +32135,7 @@ msgstr ""
msgid "Specified URL cannot be used: \"%{reason}\""
msgstr ""
-msgid "Specify an e-mail address regex pattern to identify default internal users."
+msgid "Specify an email address regex pattern to identify default internal users."
msgstr ""
msgid "Speed up your pipelines with Needs relationships"
@@ -31930,7 +32390,7 @@ msgstr ""
msgid "StatusCheck|An error occurred fetching the status checks."
msgstr ""
-msgid "StatusCheck|Apply this status check to any branch or a specific protected branch."
+msgid "StatusCheck|Apply this status check to all branches or a specific protected branch."
msgstr ""
msgid "StatusCheck|Check for a status response in Merge Requests. Failures do not block merges. %{link_start}Learn more%{link_end}."
@@ -32269,6 +32729,9 @@ msgstr ""
msgid "Subscriptions"
msgstr ""
+msgid "Subscription|Your subscription for %{strong}%{namespace_name}%{strong_close} has expired and you are now on %{pricing_link_start}the GitLab Free tier%{pricing_link_end}. Don't worry, your data is safe. Get in touch with our support team (%{support_email}). They'll gladly help with your subscription renewal."
+msgstr ""
+
msgid "Subtracted"
msgstr ""
@@ -32497,6 +32960,9 @@ msgstr ""
msgid "SuperSonics|Plan"
msgstr ""
+msgid "SuperSonics|Please agree to the Subscription Agreement"
+msgstr ""
+
msgid "SuperSonics|Ready to get started? A GitLab plan is ideal for scaling organizations and for multi team usage."
msgstr ""
@@ -32527,6 +32993,9 @@ msgstr ""
msgid "SuperSonics|The activation code is not valid. Please make sure to copy it exactly from the Customers Portal or confirmation email. Learn more about %{linkStart}activating your subscription%{linkEnd}."
msgstr ""
+msgid "SuperSonics|The activation code should be a 24-character alphanumeric string"
+msgstr ""
+
msgid "SuperSonics|There is a connectivity issue."
msgstr ""
@@ -32569,9 +33038,15 @@ msgstr ""
msgid "SuperSonics|You do not have an active subscription"
msgstr ""
+msgid "SuperSonics|You have successfully added a license that activates on %{date}. Please see the subscription history table below for more details."
+msgstr ""
+
msgid "SuperSonics|You'll be charged for %{trueUpLinkStart}users over license%{trueUpLinkEnd} on a quarterly or annual basis, depending on the terms of your agreement."
msgstr ""
+msgid "SuperSonics|Your future dated license was successfully added"
+msgstr ""
+
msgid "SuperSonics|Your subscription"
msgstr ""
@@ -32824,7 +33299,7 @@ msgstr ""
msgid "Template to append to all Service Desk issues"
msgstr ""
-msgid "TemplateRepository|Select a repository to make its templates available to all projects. %{link_start}What should the repository contain?%{link_end} "
+msgid "TemplateRepository|Create common files more quickly, and standardize their format."
msgstr ""
msgid "Templates"
@@ -33030,7 +33505,7 @@ msgstr ""
msgid "TestCases|Search test cases"
msgstr ""
-msgid "TestCases|Something went wrong while adding test case to Todo."
+msgid "TestCases|Something went wrong while adding test case to a to-do item."
msgstr ""
msgid "TestCases|Something went wrong while creating a test case."
@@ -33042,7 +33517,7 @@ msgstr ""
msgid "TestCases|Something went wrong while fetching test cases list."
msgstr ""
-msgid "TestCases|Something went wrong while marking test case todo as done."
+msgid "TestCases|Something went wrong while marking test case to-do item as done."
msgstr ""
msgid "TestCases|Something went wrong while moving test case."
@@ -33162,7 +33637,7 @@ msgstr ""
msgid "Thanks for your purchase!"
msgstr ""
-msgid "That is ok, I do not want to renew"
+msgid "That's OK, I don't want to renew"
msgstr ""
msgid "That's it, well done!"
@@ -33185,7 +33660,7 @@ msgid_plural "The %{type} contains the following errors:"
msgstr[0] ""
msgstr[1] ""
-msgid "The API key used by GitLab for accessing the Spam Check service endpoint"
+msgid "The API key used by GitLab for accessing the Spam Check service endpoint."
msgstr ""
msgid "The GitLab subscription service (customers.gitlab.com) is currently experiencing an outage. You can monitor the status and get updates at %{linkStart}status.gitlab.com%{linkEnd}."
@@ -33224,9 +33699,6 @@ msgstr ""
msgid "The URL to use for connecting to Elasticsearch. Use a comma-separated list to support clustering (e.g., \"http://localhost:9200, http://localhost:9201\")."
msgstr ""
-msgid "The Vulnerability Report shows the results of the last successful pipeline run on the default branch."
-msgstr ""
-
msgid "The X509 Certificate to use when mutual TLS is required to communicate with the external authorization service. If left blank, the server certificate is still validated when accessing over HTTPS."
msgstr ""
@@ -33284,9 +33756,6 @@ msgstr ""
msgid "The default branch for this project has been changed. Please update your bookmarks."
msgstr ""
-msgid "The default expiration time for job artifacts. 0 for unlimited. The default unit is in seconds, but you can use other units, for example %{code_open}4 mins 2 sec%{code_close}, %{code_open}2h42min%{code_close}."
-msgstr ""
-
msgid "The dependency list details information about the components used within your project."
msgstr ""
@@ -33478,9 +33947,6 @@ msgstr ""
msgid "The merge conflicts for this merge request have already been resolved. Please return to the merge request."
msgstr ""
-msgid "The merge request can now be merged."
-msgstr ""
-
msgid "The metric must be one of %{metrics}."
msgstr ""
@@ -33856,7 +34322,7 @@ msgstr ""
msgid "There was a problem updating the keep latest artifacts setting."
msgstr ""
-msgid "There was an error %{message} todo."
+msgid "There was an error %{message} to-do item."
msgstr ""
msgid "There was an error adding a To Do."
@@ -33895,6 +34361,9 @@ msgstr ""
msgid "There was an error fetching projects"
msgstr ""
+msgid "There was an error fetching search autocomplete suggestions"
+msgstr ""
+
msgid "There was an error fetching stage total counts"
msgstr ""
@@ -34219,6 +34688,9 @@ msgstr ""
msgid "This field is required."
msgstr ""
+msgid "This form is disabled in preview"
+msgstr ""
+
msgid "This group"
msgstr ""
@@ -34240,9 +34712,6 @@ msgstr ""
msgid "This group is linked to a subscription"
msgstr ""
-msgid "This group, including all subgroups, projects and git repositories, will be reachable from only the specified IP address ranges."
-msgstr ""
-
msgid "This group, its subgroups and projects has been scheduled for removal on %{date}."
msgstr ""
@@ -34522,9 +34991,6 @@ msgstr ""
msgid "This user cannot be unlocked manually from GitLab"
msgstr ""
-msgid "This user does not have a pending request"
-msgstr ""
-
msgid "This user has an unconfirmed email address (%{email}). You may force a confirmation."
msgstr ""
@@ -34633,9 +35099,6 @@ msgstr ""
msgid "ThreatMonitoring|Packet Activity"
msgstr ""
-msgid "ThreatMonitoring|Policies"
-msgstr ""
-
msgid "ThreatMonitoring|Requests"
msgstr ""
@@ -34687,6 +35150,12 @@ msgstr ""
msgid "ThreatMonitoring|View documentation"
msgstr ""
+msgid "Threshold in bytes at which to compress Sidekiq job arguments."
+msgstr ""
+
+msgid "Threshold in bytes at which to reject Sidekiq jobs. Set this to 0 to if you don't want to limit Sidekiq jobs."
+msgstr ""
+
msgid "Throughput"
msgstr ""
@@ -34696,6 +35165,9 @@ msgstr ""
msgid "Time"
msgstr ""
+msgid "Time (in hours) that users are allowed to skip forced configuration of two-factor authentication."
+msgstr ""
+
msgid "Time Spent"
msgstr ""
@@ -34762,7 +35234,7 @@ msgstr ""
msgid "TimeTrackingEstimated|Est"
msgstr ""
-msgid "TimeTracking|%{startTag}Spent: %{endTag}%{timeSpentHumanReadable}"
+msgid "TimeTracking|%{spentStart}Spent: %{spentEnd}"
msgstr ""
msgid "TimeTracking|Estimated:"
@@ -34976,6 +35448,9 @@ msgstr ""
msgid "To access this domain create a new DNS record"
msgstr ""
+msgid "To add a custom suffix, set up a Service Desk email address. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "To add an SSH key you need to %{generate_link_start}generate one%{link_end} or use an %{existing_link_start}existing key%{link_end}."
msgstr ""
@@ -34997,13 +35472,16 @@ msgstr ""
msgid "To connect an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To continue using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
+msgstr ""
+
msgid "To continue, you need to select the link in the confirmation email we sent to verify your email address. If you didn't get our email, select %{strongStart}Resend confirmation email.%{strongEnd}"
msgstr ""
msgid "To define internal users, first enable new users set to external"
msgstr ""
-msgid "To enable Registration Features, make sure \"Enable service ping\" is checked."
+msgid "To enable Registration Features, first enable Service Ping."
msgstr ""
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
@@ -35030,7 +35508,7 @@ msgstr ""
msgid "To get started, use the link below to confirm your account."
msgstr ""
-msgid "To help improve GitLab and its user experience, GitLab will periodically collect usage information."
+msgid "To help improve GitLab and its user experience, GitLab periodically collects usage information."
msgstr ""
msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
@@ -35063,7 +35541,7 @@ msgstr ""
msgid "To preserve performance only %{strong_open}%{display_size} of %{real_size}%{strong_close} files are displayed."
msgstr ""
-msgid "To protect this issue's confidentiality, %{forkLink} and set the fork's visibility to private."
+msgid "To protect this issue's confidentiality, %{linkStart}fork this project%{linkEnd} and set the fork's visibility to private."
msgstr ""
msgid "To protect this issue's confidentiality, a private fork of this project was selected."
@@ -35096,12 +35574,15 @@ msgstr ""
msgid "To set up SAML authentication for your group through an identity provider like Azure, Okta, Onelogin, Ping Identity, or your custom SAML 2.0 provider:"
msgstr ""
-msgid "To set up this service:"
+msgid "To set up this integration:"
msgstr ""
msgid "To specify the notification level per project of a group you belong to, you need to visit project page and change notification level there."
msgstr ""
+msgid "To start using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
+msgstr ""
+
msgid "To unsubscribe from this issue, please paste the following link into your browser:"
msgstr ""
@@ -35689,9 +36170,6 @@ msgstr ""
msgid "Unable to fetch branches list, please close the form and try again"
msgstr ""
-msgid "Unable to fetch unscanned projects"
-msgstr ""
-
msgid "Unable to fetch vulnerable projects"
msgstr ""
@@ -35746,6 +36224,15 @@ msgstr ""
msgid "Unable to update this issue at this time."
msgstr ""
+msgid "Unapprove a merge request"
+msgstr ""
+
+msgid "Unapprove the current merge request."
+msgstr ""
+
+msgid "Unapproved the current merge request."
+msgstr ""
+
msgid "Unarchive project"
msgstr ""
@@ -35758,16 +36245,13 @@ msgstr ""
msgid "Unassigned"
msgstr ""
-msgid "Unauthenticated API request rate limit"
-msgstr ""
-
-msgid "Unauthenticated rate limit period in seconds"
+msgid "Unauthenticated API rate limit period in seconds"
msgstr ""
-msgid "Unauthenticated request rate limit"
+msgid "Unauthenticated requests"
msgstr ""
-msgid "Unauthenticated requests"
+msgid "Unauthenticated web rate limit period in seconds"
msgstr ""
msgid "Undo"
@@ -35869,18 +36353,6 @@ msgstr ""
msgid "Unresolved"
msgstr ""
-msgid "UnscannedProjects|15 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|30 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|5 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|60 or more days"
-msgstr ""
-
msgid "Unschedule job"
msgstr ""
@@ -36100,6 +36572,9 @@ msgstr ""
msgid "UsageQuota|%{help_link_start}Shared runners%{help_link_end} are disabled, so there are no limits set on pipeline usage"
msgstr ""
+msgid "UsageQuota|%{linkTitle} help link"
+msgstr ""
+
msgid "UsageQuota|%{percentageLeft} of purchased storage is available"
msgstr ""
@@ -36109,6 +36584,9 @@ msgstr ""
msgid "UsageQuota|Artifacts is a sum of build and pipeline artifacts."
msgstr ""
+msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
+msgstr ""
+
msgid "UsageQuota|Buy additional minutes"
msgstr ""
@@ -36118,9 +36596,21 @@ msgstr ""
msgid "UsageQuota|CI minutes usage by project"
msgstr ""
+msgid "UsageQuota|Code packages and container images."
+msgstr ""
+
msgid "UsageQuota|Current period usage"
msgstr ""
+msgid "UsageQuota|File attachments and smaller design graphics."
+msgstr ""
+
+msgid "UsageQuota|Git repository, managed by the Gitaly service."
+msgstr ""
+
+msgid "UsageQuota|Includes project registry, artifacts, packages, wiki, uploads and other items."
+msgstr ""
+
msgid "UsageQuota|Increase storage temporarily"
msgstr ""
@@ -36139,6 +36629,9 @@ msgstr ""
msgid "UsageQuota|Packages"
msgstr ""
+msgid "UsageQuota|Pipeline artifacts and job artifacts, created with CI/CD."
+msgstr ""
+
msgid "UsageQuota|Pipelines"
msgstr ""
@@ -36157,6 +36650,9 @@ msgstr ""
msgid "UsageQuota|Seats"
msgstr ""
+msgid "UsageQuota|Shared bits of code and text."
+msgstr ""
+
msgid "UsageQuota|Snippets"
msgstr ""
@@ -36166,6 +36662,12 @@ msgstr ""
msgid "UsageQuota|Storage"
msgstr ""
+msgid "UsageQuota|Storage type"
+msgstr ""
+
+msgid "UsageQuota|There is a known issue with Artifact storage where the total could be incorrect for some projects. More details and progress are available in %{warningLinkStart}the epic%{warningLinkEnd}."
+msgstr ""
+
msgid "UsageQuota|This is the total amount of storage used across your projects within this namespace."
msgstr ""
@@ -36205,6 +36707,9 @@ msgstr ""
msgid "UsageQuota|Usage"
msgstr ""
+msgid "UsageQuota|Usage Breakdown"
+msgstr ""
+
msgid "UsageQuota|Usage Quotas"
msgstr ""
@@ -36229,6 +36734,9 @@ msgstr ""
msgid "UsageQuota|Wiki"
msgstr ""
+msgid "UsageQuota|Wiki content."
+msgstr ""
+
msgid "UsageQuota|Wikis"
msgstr ""
@@ -36445,7 +36953,10 @@ msgstr ""
msgid "User Settings"
msgstr ""
-msgid "User and IP Rate Limits"
+msgid "User and IP rate limits"
+msgstr ""
+
+msgid "User does not have a pending request"
msgstr ""
msgid "User identity was successfully created."
@@ -36742,6 +37253,9 @@ msgstr ""
msgid "Users can launch a development environment from a GitLab browser tab when the %{linkStart}Gitpod%{linkEnd} integration is enabled."
msgstr ""
+msgid "Users can reactivate their account by signing in."
+msgstr ""
+
msgid "Users can render diagrams in AsciiDoc, Markdown, reStructuredText, and Textile documents using Kroki."
msgstr ""
@@ -36757,6 +37271,9 @@ msgstr ""
msgid "Users requesting access to"
msgstr ""
+msgid "Users to exclude from the rate limit"
+msgstr ""
+
msgid "Users were successfully added."
msgstr ""
@@ -36778,6 +37295,9 @@ msgstr ""
msgid "UsersSelect|Unassigned"
msgstr ""
+msgid "Uses GitLab as a lightweight alternative to Sentry."
+msgstr ""
+
msgid "Using %{code_start}::%{code_end} denotes a %{link_start}scoped label set%{link_end}"
msgstr ""
@@ -36808,10 +37328,7 @@ msgstr ""
msgid "Value Stream Analytics can help you determine your team’s velocity"
msgstr ""
-msgid "Value Stream Analytics gives an overview of how much time it takes to go from idea to production in your project."
-msgstr ""
-
-msgid "Value may contain a variable reference"
+msgid "Value might contain a variable reference"
msgstr ""
msgid "Value stream"
@@ -36877,10 +37394,10 @@ msgstr ""
msgid "ValueStream|The Default Value Stream cannot be deleted"
msgstr ""
-msgid "Variable"
+msgid "Values that contain the %{codeStart}$%{codeEnd} character can be considered a variable reference and expanded. %{docsLinkStart}Learn more.%{docsLinkEnd}"
msgstr ""
-msgid "Variable references indicated by %{codeStart}$%{codeEnd} may be expanded. If this is not what you want, consider %{docsLinkStart}using a workaround to prevent expansion%{docsLinkEnd}."
+msgid "Variable"
msgstr ""
msgid "Variable will be masked in job logs."
@@ -37285,6 +37802,9 @@ msgstr ""
msgid "Vulnerability|Evidence"
msgstr ""
+msgid "Vulnerability|False positive detected"
+msgstr ""
+
msgid "Vulnerability|File"
msgstr ""
@@ -37327,6 +37847,9 @@ msgstr ""
msgid "Vulnerability|Status"
msgstr ""
+msgid "Vulnerability|The scanner determined this vulnerability to be a false positive. Verify the evaluation before changing its status. %{linkStart}Learn more about false positive detection.%{linkEnd}"
+msgstr ""
+
msgid "Vulnerability|The unmodified response is the original response that had no mutations done to the request"
msgstr ""
@@ -37651,9 +38174,6 @@ msgstr ""
msgid "Welcome to GitLab,%{br_tag}%{name}!"
msgstr ""
-msgid "Welcome to the guided GitLab tour"
-msgstr ""
-
msgid "Welcome, %{name}!"
msgstr ""
@@ -37672,9 +38192,6 @@ msgstr ""
msgid "What are you searching for?"
msgstr ""
-msgid "What describes you best?"
-msgstr ""
-
msgid "What does this command do?"
msgstr ""
@@ -37696,13 +38213,13 @@ msgstr ""
msgid "What is your job title? (optional)"
msgstr ""
-msgid "What will you use this group for?"
+msgid "What templates can I create?"
msgstr ""
-msgid "What's new"
+msgid "What will you use this group for?"
msgstr ""
-msgid "What’s your experience level?"
+msgid "What's new"
msgstr ""
msgid "When a deployment job is successful, skip older deployment jobs that are still pending."
@@ -37714,6 +38231,9 @@ msgstr ""
msgid "When an event in GitLab triggers a webhook, you can use the request details to figure out if something went wrong."
msgstr ""
+msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+msgstr ""
+
msgid "When inactive, an external authentication provider must be used."
msgstr ""
@@ -37737,6 +38257,9 @@ msgstr ""
msgid "When:"
msgstr ""
+msgid "Which API requests are affected?"
+msgstr ""
+
msgid "While it's rare to have no vulnerabilities, it can happen. In any event, we ask that you please double check your settings to make sure you've set up your dashboard correctly."
msgstr ""
@@ -38016,6 +38539,9 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|Work Items"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -38091,6 +38617,9 @@ msgstr ""
msgid "You are already a member of this %{member_source}."
msgstr ""
+msgid "You are already impersonating another user"
+msgstr ""
+
msgid "You are an admin, which means granting access to %{client_name} will allow them to interact with GitLab as an admin as well. Proceed with caution."
msgstr ""
@@ -38193,6 +38722,9 @@ msgstr ""
msgid "You can also use project access tokens with Git to authenticate over HTTP(S). %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "You can always change your URL later"
+msgstr ""
+
msgid "You can always edit this later"
msgstr ""
@@ -38349,10 +38881,10 @@ msgstr ""
msgid "You can’t %{tag_start}edit%{tag_end} files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
-msgid "You could not create a new trigger."
+msgid "You can’t edit files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
-msgid "You didn't renew your subscription for %{strong}%{namespace_name}%{strong_close} so it was downgraded to the free plan."
+msgid "You could not create a new trigger."
msgstr ""
msgid "You do not have any subscriptions yet"
@@ -38520,6 +39052,12 @@ msgstr ""
msgid "You must provide your current password in order to change it."
msgstr ""
+msgid "You must sign in to search for specific projects."
+msgstr ""
+
+msgid "You must sign in to search for specific terms."
+msgstr ""
+
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
@@ -38547,6 +39085,9 @@ msgstr ""
msgid "You need to upload a GitLab project export archive (ending in .gz)."
msgstr ""
+msgid "You need to verify your primary email first before enabling Two-Factor Authentication."
+msgstr ""
+
msgid "You successfully declined the invitation"
msgstr ""
@@ -38655,10 +39196,10 @@ msgstr ""
msgid "Your %{host} account was signed in to from a new location"
msgstr ""
-msgid "Your %{strong}%{plan_name}%{strong_close} subscription for %{strong}%{namespace_name}%{strong_close} will expire on %{strong}%{expires_on}%{strong_close}."
+msgid "Your %{strong}%{plan_name}%{strong_close} subscription expires on %{strong}%{expires_on}%{strong_close}. After that date, you cannot create issues or merge requests, or use many other features."
msgstr ""
-msgid "Your %{strong}%{plan_name}%{strong_close} subscription will expire on %{strong}%{expires_on}%{strong_close}. After that, you will not be able to create issues or merge requests as well as many other features."
+msgid "Your %{strong}%{plan_name}%{strong_close} subscription for %{strong}%{namespace_name}%{strong_close} will expire on %{strong}%{expires_on}%{strong_close}."
msgstr ""
msgid "Your CI/CD configuration syntax is invalid. View Lint tab for more details."
@@ -38682,7 +39223,7 @@ msgstr ""
msgid "Your GPG keys (%{count})"
msgstr ""
-msgid "Your GitLab account has been locked due to an excessive amount of unsuccessful sign in attempts. Your account will automatically unlock in %{duration} or you may click the link below to unlock now."
+msgid "Your GitLab account has been locked due to an excessive number of unsuccessful sign in attempts. You can wait for your account to automatically unlock in %{duration} or you can click the link below to unlock now."
msgstr ""
msgid "Your GitLab account request has been approved!"
@@ -38793,6 +39334,9 @@ msgstr ""
msgid "Your commit email is used for web based operations, such as edits and merges."
msgstr ""
+msgid "Your current password is required to register a two-factor authenticator app."
+msgstr ""
+
msgid "Your dashboard has been copied. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
@@ -38892,6 +39436,9 @@ msgstr ""
msgid "Your project limit is %{limit} projects! Please contact your administrator to increase it"
msgstr ""
+msgid "Your project will be created at:"
+msgstr ""
+
msgid "Your projects"
msgstr ""
@@ -38931,11 +39478,10 @@ msgstr ""
msgid "Your subscription expired!"
msgstr ""
-msgid "Your subscription has been downgraded."
-msgstr ""
-
-msgid "Your subscription will expire in %{remaining_days}."
-msgstr ""
+msgid "Your subscription will expire in %{remaining_days} day."
+msgid_plural "Your subscription will expire in %{remaining_days} days."
+msgstr[0] ""
+msgstr[1] ""
msgid "Your username is %{username}."
msgstr ""
@@ -39142,6 +39688,9 @@ msgstr ""
msgid "cannot merge"
msgstr ""
+msgid "cannot not be used for user namespace"
+msgstr ""
+
msgid "ciReport|%{degradedNum} degraded"
msgstr ""
@@ -39465,6 +40014,9 @@ msgstr ""
msgid "created %{timeAgo}"
msgstr ""
+msgid "created %{timeAgo} by %{author}"
+msgstr ""
+
msgid "created by"
msgstr ""
@@ -39509,9 +40061,6 @@ msgstr ""
msgid "does not have a supported extension. Only %{extension_list} are supported"
msgstr ""
-msgid "domain is not authorized for sign-up."
-msgstr ""
-
msgid "download it"
msgstr ""
@@ -39529,18 +40078,13 @@ msgstr ""
msgid "email '%{email}' is not a verified email."
msgstr ""
-msgid "email does not match the allowed domain of %{email_domains}"
-msgid_plural "email does not match the allowed domains: %{email_domains}"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "enabled"
msgstr ""
msgid "encrypted: needs to be a :required, :optional or :migrating!"
msgstr ""
-msgid "ending with MIME type format is not allowed."
+msgid "ending with a reserved file extension is not allowed."
msgstr ""
msgid "entries cannot be larger than 255 characters"
@@ -39564,6 +40108,9 @@ msgstr ""
msgid "estimateCommand|%{slash_command} overwrites the total estimated time."
msgstr ""
+msgid "example.com"
+msgstr ""
+
msgid "exceeds the limit of %{bytes} bytes"
msgstr ""
@@ -39614,9 +40161,6 @@ msgstr ""
msgid "fork"
msgstr ""
-msgid "fork this project"
-msgstr ""
-
msgid "from"
msgstr ""
@@ -39625,6 +40169,9 @@ msgid_plural "from %d jobs"
msgstr[0] ""
msgstr[1] ""
+msgid "frontmatter"
+msgstr ""
+
msgid "group"
msgstr ""
@@ -39652,6 +40199,9 @@ msgstr ""
msgid "has been completed."
msgstr ""
+msgid "has too deep level of nesting"
+msgstr ""
+
msgid "help"
msgstr ""
@@ -39685,9 +40235,21 @@ msgstr ""
msgid "in"
msgstr ""
+msgid "in Infrastructure :: Kubernetes clusters"
+msgstr ""
+
+msgid "in all GitLab"
+msgstr ""
+
+msgid "in group"
+msgstr ""
+
msgid "in group %{link_to_group}"
msgstr ""
+msgid "in project"
+msgstr ""
+
msgid "in project %{link_to_project}"
msgstr ""
@@ -39729,16 +40291,19 @@ msgstr ""
msgid "is not a valid X509 certificate."
msgstr ""
-msgid "is not allowed since the group is not top-level group."
+msgid "is not allowed for sign-up."
msgstr ""
-msgid "is not allowed. Try again with a different email address, or contact your GitLab admin."
+msgid "is not allowed for this group."
msgstr ""
-msgid "is not allowed. We do not currently support project-level iterations"
+msgid "is not allowed for this project."
+msgstr ""
+
+msgid "is not allowed since the group is not top-level group."
msgstr ""
-msgid "is not from an allowed domain."
+msgid "is not allowed. We do not currently support project-level iterations"
msgstr ""
msgid "is not in the group enforcing Group Managed Account"
@@ -39831,6 +40396,9 @@ msgstr ""
msgid "log in"
msgstr ""
+msgid "managed"
+msgstr ""
+
msgid "manual"
msgstr ""
@@ -39878,6 +40446,9 @@ msgstr ""
msgid "mrWidget| Please restore it or use a different %{missingBranchName} branch"
msgstr ""
+msgid "mrWidget|%{linkStart}Set up now%{linkEnd} to analyze your source code for known security vulnerabilities."
+msgstr ""
+
msgid "mrWidget|%{mergeError}."
msgstr ""
@@ -39958,6 +40529,9 @@ msgid_plural "mrWidget|Closes issues"
msgstr[0] ""
msgstr[1] ""
+msgid "mrWidget|Create issue to resolve all threads"
+msgstr ""
+
msgid "mrWidget|Delete source branch"
msgstr ""
@@ -39967,12 +40541,18 @@ msgstr ""
msgid "mrWidget|Did not close"
msgstr ""
+msgid "mrWidget|Dismiss"
+msgstr ""
+
msgid "mrWidget|Email patches"
msgstr ""
msgid "mrWidget|Failed to load deployment statistics"
msgstr ""
+msgid "mrWidget|Hide %{widget} details"
+msgstr ""
+
msgid "mrWidget|If the %{missingBranchName} branch exists in your local repository, you can merge this merge request manually using the command line"
msgstr ""
@@ -40068,9 +40648,6 @@ msgstr ""
msgid "mrWidget|Request to merge"
msgstr ""
-msgid "mrWidget|Resolve all threads in new issue"
-msgstr ""
-
msgid "mrWidget|Resolve conflicts"
msgstr ""
@@ -40086,6 +40663,9 @@ msgstr ""
msgid "mrWidget|Revoke approval"
msgstr ""
+msgid "mrWidget|SAST and Secret Detection is not enabled."
+msgstr ""
+
msgid "mrWidget|Set by %{merge_author} to be added to the merge train when the pipeline succeeds"
msgstr ""
@@ -40095,6 +40675,9 @@ msgstr ""
msgid "mrWidget|Set by %{merge_author} to start a merge train when the pipeline succeeds"
msgstr ""
+msgid "mrWidget|Show %{widget} details"
+msgstr ""
+
msgid "mrWidget|The changes were merged into"
msgstr ""
@@ -40107,6 +40690,9 @@ msgstr ""
msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure, or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
msgstr ""
+msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure."
+msgstr ""
+
msgid "mrWidget|The source branch has been deleted"
msgstr ""
@@ -40149,6 +40735,9 @@ msgstr ""
msgid "mrWidget|You can merge after removing denied licenses"
msgstr ""
+msgid "mrWidget|You can only merge once this merge request is approved."
+msgstr ""
+
msgid "mrWidget|Your password"
msgstr ""
@@ -40185,6 +40774,9 @@ msgstr ""
msgid "must be less than the limit of %{tag_limit} tags"
msgstr ""
+msgid "must be set for a project namespace"
+msgstr ""
+
msgid "must be unique by status and elapsed time within a policy"
msgstr ""
@@ -40294,6 +40886,9 @@ msgstr ""
msgid "pipeline"
msgstr ""
+msgid "pipeline schedules documentation"
+msgstr ""
+
msgid "pod_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
msgstr ""
@@ -40343,16 +40938,25 @@ msgstr ""
msgid "project name"
msgstr ""
+msgid "project namespace cannot be the parent of another namespace"
+msgstr ""
+
msgid "projects"
msgstr ""
msgid "quick actions"
msgstr ""
-msgid "reCAPTCHA Private Key"
+msgid "reCAPTCHA"
+msgstr ""
+
+msgid "reCAPTCHA helps prevent credential stuffing."
msgstr ""
-msgid "reCAPTCHA Site Key"
+msgid "reCAPTCHA private key"
+msgstr ""
+
+msgid "reCAPTCHA site key"
msgstr ""
msgid "recent activity"
@@ -40579,6 +41183,9 @@ msgstr ""
msgid "user avatar"
msgstr ""
+msgid "user namespace cannot be the parent of another namespace"
+msgstr ""
+
msgid "user preferences"
msgstr ""
@@ -40671,3 +41278,9 @@ msgstr ""
msgid "your settings"
msgstr ""
+msgid "{group}"
+msgstr ""
+
+msgid "{project}"
+msgstr ""
+
diff --git a/locale/nb_NO/gitlab.po b/locale/nb_NO/gitlab.po
index 06e91dda3b3..68b4f1f109b 100644
--- a/locale/nb_NO/gitlab.po
+++ b/locale/nb_NO/gitlab.po
@@ -14,10 +14,7 @@ msgstr ""
"X-Crowdin-Language: nb\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-09-01 22:31\n"
-
-msgid " %{name}, confirm your email address now! "
-msgstr ""
+"PO-Revision-Date: 2021-10-04 21:03\n"
msgid " %{start} to %{end}"
msgstr " %{start} til %{end}"
@@ -32,19 +29,19 @@ msgid " Please sign in."
msgstr " Vennligst logg inn."
msgid " Target Path"
-msgstr ""
+msgstr " MÃ¥lsti"
msgid " Try to %{action} this file again."
msgstr " Prøv å %{action} denne filen igjen."
msgid " Type"
-msgstr ""
+msgstr " Type"
msgid " You need to do this before %{grace_period_deadline}."
-msgstr " Du er nødt til at gjøre dette, før %{grace_period_deadline}."
+msgstr " Du er nødt til å gjøre dette før %{grace_period_deadline}."
msgid " and"
-msgstr ""
+msgstr " og"
msgid " and "
msgstr " og "
@@ -78,13 +75,13 @@ msgid " or references (e.g. path/to/project!merge_request_id)"
msgstr " eller referanser (f.eks. filbane/til/prosjekt!merge_request_id)"
msgid " reacted with :%{name}:"
-msgstr ""
+msgstr " reagerte med: %{name}:"
msgid "\"%{path}\" did not exist on \"%{ref}\""
msgstr "\"%{path}\" finness ikke på \"%{ref}\""
msgid "\"%{repository_name}\" size (%{repository_size}) is larger than the limit of %{limit}."
-msgstr ""
+msgstr "«%{repository_name}» sin størrelse (%{repository_size}) er større enn grensen på %{limit}."
msgid "\"el\" parameter is required for createInstance()"
msgstr "\"el\"-parameteret er påkrevd for createInstance()"
@@ -92,25 +89,35 @@ msgstr "\"el\"-parameteret er påkrevd for createInstance()"
msgid "#general, #development"
msgstr ""
-msgid "%d Approval"
-msgid_plural "%d Approvals"
+msgid "%d Alert"
+msgid_plural "%d Alerts"
msgstr[0] ""
msgstr[1] ""
-msgid "%d Module"
-msgid_plural "%d Modules"
+msgid "%d Alert:"
+msgid_plural "%d Alerts:"
msgstr[0] ""
msgstr[1] ""
+msgid "%d Approval"
+msgid_plural "%d Approvals"
+msgstr[0] "%d godkjennelse"
+msgstr[1] "%d godkjennelser"
+
+msgid "%d Module"
+msgid_plural "%d Modules"
+msgstr[0] "%d modul"
+msgstr[1] "%d moduler"
+
msgid "%d Other"
msgid_plural "%d Others"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d annen"
+msgstr[1] "%d andre"
msgid "%d Package"
msgid_plural "%d Packages"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d pakke"
+msgstr[1] "%d pakker"
msgid "%d Scanned URL"
msgid_plural "%d Scanned URLs"
@@ -144,8 +151,8 @@ msgstr[1] ""
msgid "%d child epic"
msgid_plural "%d child epics"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d under-epos"
+msgstr[1] "%d under-eposer"
msgid "%d code quality issue"
msgid_plural "%d code quality issues"
@@ -192,8 +199,8 @@ msgstr "%d commits"
msgid "%d completed issue"
msgid_plural "%d completed issues"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d fullført sak"
+msgstr[1] "%d fullførte saker"
msgid "%d contribution"
msgid_plural "%d contributions"
@@ -207,8 +214,8 @@ msgstr[1] "%d dager"
msgid "%d epic"
msgid_plural "%d epics"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d epos"
+msgstr[1] "%d eposer"
msgid "%d error"
msgid_plural "%d errors"
@@ -217,8 +224,8 @@ msgstr[1] "%d feil"
msgid "%d error found:"
msgid_plural "%d errors found:"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d feil funnet:"
+msgstr[1] "%d feil funnet:"
msgid "%d exporter"
msgid_plural "%d exporters"
@@ -232,13 +239,13 @@ msgstr[1] "%d mislyktes"
msgid "%d failed security job"
msgid_plural "%d failed security jobs"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d mislykket sikkerhetsjobb"
+msgstr[1] "%d mislykkede sikkerhetsjobber"
msgid "%d file"
msgid_plural "%d files"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d fil"
+msgstr[1] "%d filer"
msgid "%d fixed test result"
msgid_plural "%d fixed test results"
@@ -247,8 +254,8 @@ msgstr[1] "%d fiksede testresultater"
msgid "%d group"
msgid_plural "%d groups"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d gruppe"
+msgstr[1] "%d grupper"
msgid "%d group selected"
msgid_plural "%d groups selected"
@@ -317,13 +324,13 @@ msgstr[1] "%d flere kommentarer"
msgid "%d open issue"
msgid_plural "%d open issues"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d åpen sak"
+msgstr[1] "%d åpne saker"
msgid "%d pending comment"
msgid_plural "%d pending comments"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d avventende kommentar"
+msgstr[1] "%d avventende kommentarer"
msgid "%d personal project will be removed and cannot be restored."
msgid_plural "%d personal projects will be removed and cannot be restored."
@@ -342,8 +349,8 @@ msgstr[1] "%d prosjekter"
msgid "%d project selected"
msgid_plural "%d projects selected"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d prosjekt valgt"
+msgstr[1] "%d prosjekter valgt"
msgid "%d request with warnings"
msgid_plural "%d requests with warnings"
@@ -367,13 +374,13 @@ msgstr[1] "%d etiketter"
msgid "%d tag per image name"
msgid_plural "%d tags per image name"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d etikett per billednavn"
+msgstr[1] "%d etiketter per billednavn"
msgid "%d token has expired"
msgid_plural "%d tokens have expired"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d sjetong har utløpt"
+msgstr[1] "%d sjetonger har utløpt"
msgid "%d unassigned issue"
msgid_plural "%d unassigned issues"
@@ -397,13 +404,13 @@ msgstr[1] "%d sårbarheter avvist"
msgid "%d vulnerability updated"
msgid_plural "%d vulnerabilities updated"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d sårbarhet oppdatert"
+msgstr[1] "%d sårbarheter oppdatert"
msgid "%d warning found:"
msgid_plural "%d warnings found:"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d advarsel funnet:"
+msgstr[1] "%d advarsler funnet:"
msgid "%s additional commit has been omitted to prevent performance issues."
msgid_plural "%s additional commits have been omitted to prevent performance issues."
@@ -417,13 +424,13 @@ msgid "%{address} is an invalid IP address range"
msgstr "%{address} er et ugyldig IP-adresseområde"
msgid "%{anchorOpen}Learn more%{anchorClose} about how you can customize / disable registration on your instance."
-msgstr ""
+msgstr "%{anchorOpen}Lær mer%{anchorClose} om hvordan du kan tilpasse / deaktivere registrering på forekomsten din."
msgid "%{author_link} cloned %{original_issue} to %{new_issue}."
-msgstr ""
+msgstr "%{author_link} klonet %{original_issue} til %{new_issue}."
msgid "%{author_link} cloned %{original_issue}. You don't have access to the new project."
-msgstr ""
+msgstr "%{author_link} klonet %{original_issue}. Du har ikke tilgang til det nye prosjektet."
msgid "%{author_link} wrote:"
msgstr "%{author_link} skrev:"
@@ -432,39 +439,42 @@ msgid "%{authorsName}'s thread"
msgstr "%{authorsName} sin tråd"
msgid "%{board_target} not found"
-msgstr ""
+msgstr "%{board_target} ble ikke funnet"
msgid "%{bold_start}%{count}%{bold_end} issue"
msgid_plural "%{bold_start}%{count}%{bold_end} issues"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%{bold_start}%{count}%{bold_end} sak"
+msgstr[1] "%{bold_start}%{count}%{bold_end} saker"
msgid "%{bold_start}%{count}%{bold_end} member"
msgid_plural "%{bold_start}%{count}%{bold_end} members"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%{bold_start}%{count}%{bold_end} medlem"
+msgstr[1] "%{bold_start}%{count}%{bold_end} medlemmer"
msgid "%{bold_start}%{count}%{bold_end} opened merge request"
msgid_plural "%{bold_start}%{count}%{bold_end} opened merge requests"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%{bold_start}%{count}%{bold_end} åpnet fletteforespørsel"
+msgstr[1] "%{bold_start}%{count}%{bold_end} åpnede fletteforespørsler"
msgid "%{code_open}Masked:%{code_close} Hidden in job logs. Must match masking requirements."
-msgstr ""
+msgstr "%{code_open}Maskert:%{code_close} Skjult i jobblogger. MÃ¥ oppfylle kravene til maskering."
msgid "%{code_open}Protected:%{code_close} Only exposed to protected branches or tags."
+msgstr "%{code_open}Beskyttet:%{code_close} Eksponeres bare for beskyttede grener eller etiketter."
+
+msgid "%{commit_author_link} authored %{commit_authored_timeago}"
msgstr ""
-msgid "%{commit_author_link} authored %{commit_timeago}"
-msgstr "%{commit_author_link} forfattet %{commit_timeago}"
+msgid "%{commit_author_link} authored %{commit_authored_timeago} and %{commit_committer_avatar} %{commit_committer_link} committed %{commit_committer_timeago}"
+msgstr ""
msgid "%{completedCount} completed weight"
-msgstr ""
+msgstr "%{completedCount} fullført vektlegging"
msgid "%{completedCount} of %{count} task completed"
msgid_plural "%{completedCount} of %{count} tasks completed"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%{completedCount} av %{count} oppgave fullført"
+msgstr[1] "%{completedCount} av %{count} oppgaver fullført"
msgid "%{completedWeight} of %{totalWeight} weight completed"
msgstr "%{completedWeight} av %{totalWeight} vektlegging fullført"
@@ -491,11 +501,11 @@ msgstr "%{count} filer berørt"
msgid "%{count} item"
msgid_plural "%{count} items"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%{count} gjenstand"
+msgstr[1] "%{count} gjenstander"
msgid "%{count} items per page"
-msgstr ""
+msgstr "%{count} gjenstander per side"
msgid "%{count} more"
msgstr "%{count} mer"
@@ -523,13 +533,13 @@ msgid "%{count} related %{pluralized_subject}: %{links}"
msgstr "%{count} relatert(e) %{pluralized_subject}: %{links}"
msgid "%{count} selected"
-msgstr ""
+msgstr "%{count} valgt"
msgid "%{count} total weight"
-msgstr ""
+msgstr "%{count} totalvekt"
msgid "%{criticalStart}%{critical} Critical%{criticalEnd} %{highStart}%{high} High%{highEnd} and %{otherStart}%{otherMessage}%{otherEnd}"
-msgstr ""
+msgstr "%{criticalStart}%{critical} Kritisk%{criticalEnd} %{highStart}%{high} Høy%{highEnd} og %{otherStart}%{otherMessage}%{otherEnd}"
msgid "%{dashboard_path} could not be found."
msgstr "%{dashboard_path} kunne ikke bli funnet."
@@ -541,12 +551,21 @@ msgid "%{deployLinkStart}Use a template to deploy to ECS%{deployLinkEnd}, or use
msgstr "%{deployLinkStart}Bruke en mal for å distribuere til ECS%{deployLinkEnd}, eller benytt en dockerbilde til å %{commandsLinkStart}kjøre AWS.kommandoer i GitLab CI/CD%{commandsLinkEnd}."
msgid "%{description}- Sentry event: %{errorUrl}- First seen: %{firstSeen}- Last seen: %{lastSeen} %{countLabel}: %{count}%{userCountLabel}: %{userCount}"
-msgstr ""
+msgstr "%{description}- Sentry-hendelse: %{errorUrl}- Først sett: %{firstSeen}- Senest sett: %{lastSeen} %{countLabel}: %{count}%{userCountLabel}: %{userCount}"
msgid "%{doc_link_start}Advanced search%{doc_link_end} is disabled since %{ref_elem} is not the default branch; %{default_branch_link_start}search on %{default_branch} instead%{default_branch_link_end}."
-msgstr ""
+msgstr "%{doc_link_start}Avansert søk%{doc_link_end} er deaktivert siden %{ref_elem} ikke er standardgrenen; %{default_branch_link_start}søk på %{default_branch} stedet for%{default_branch_link_end}."
msgid "%{doc_link_start}Advanced search%{doc_link_end} is enabled."
+msgstr "%{doc_link_start}Avansert søk%{doc_link_end} er aktivert."
+
+msgid "%{docs_link_start}Learn about visibility levels.%{docs_link_end}"
+msgstr ""
+
+msgid "%{docs_link_start}What is Large File Storage?%{docs_link_end}"
+msgstr ""
+
+msgid "%{docs_link_start}What is two-factor authentication?%{docs_link_end}"
msgstr ""
msgid "%{due_date} (Past due)"
@@ -559,7 +578,7 @@ msgid "%{edit_in_new_fork_notice} Try to cherry-pick this commit again."
msgstr ""
msgid "%{edit_in_new_fork_notice} Try to create a new directory again."
-msgstr ""
+msgstr "%{edit_in_new_fork_notice} Prøv å opprette en ny mappe igjen."
msgid "%{edit_in_new_fork_notice} Try to revert this commit again."
msgstr "%{edit_in_new_fork_notice} Prøv å tilbakestille denne commiten igjen."
@@ -568,7 +587,7 @@ msgid "%{edit_in_new_fork_notice} Try to upload a file again."
msgstr "%{edit_in_new_fork_notice} Prøv å laste opp en fil igjen."
msgid "%{emailPrefix}@company.com"
-msgstr ""
+msgstr "%{emailPrefix}@company.com"
msgid "%{extra} more downstream pipelines"
msgstr "%{extra} flere nedstrømsrørledninger"
@@ -583,31 +602,31 @@ msgid "%{firstMilestoneName} + %{numberOfOtherMilestones} more"
msgstr "%{firstMilestoneName} + %{numberOfOtherMilestones} til"
msgid "%{gitlab_experience_text}. Don't worry, this information isn't shared outside of your self-managed GitLab instance."
-msgstr ""
+msgstr "%{gitlab_experience_text}. Ikke vær redd, denne informasjonen deles ikke utenfor din selvstyrte GitLab-forekomst."
msgid "%{gitlab_experience_text}. We won't share this information with anyone."
-msgstr ""
+msgstr "%{gitlab_experience_text}. Vi vil ikke dele denne informasjonen med noen."
msgid "%{global_id} is not a valid ID for %{expected_types}."
-msgstr ""
+msgstr "%{global_id} er ikke en gyldig ID for %{expected_types}."
msgid "%{group_name} activity"
-msgstr ""
+msgstr "%{group_name}-aktivitet"
msgid "%{group_name} group members"
msgstr "%{group_name} gruppemedlemmer"
msgid "%{group_name} uses group managed accounts. You need to create a new GitLab account which will be managed by %{group_name}."
-msgstr ""
+msgstr "%{group_name} bruker gruppeadministrerte kontoer. Du må opprette en ny GitLab-konto som vil bli administreres av %{group_name}."
msgid "%{group_name}&%{epic_iid} &middot; created %{epic_created} by %{author}"
-msgstr ""
+msgstr "%{group_name}&%{epic_iid} &middot; opprettet %{epic_created} av %{author}"
msgid "%{hook_type} was deleted"
-msgstr ""
+msgstr "%{hook_type} ble slettet"
msgid "%{hook_type} was scheduled for deletion"
-msgstr ""
+msgstr "%{hook_type} ble planlagt for sletting"
msgid "%{host} sign-in from new location"
msgstr "%{host} pålogging fra nytt sted"
@@ -619,10 +638,7 @@ msgid "%{issuableType} will be removed! Are you sure?"
msgstr "%{issuableType} vil bli fjernet! Er du sikker?"
msgid "%{issueType} actions"
-msgstr ""
-
-msgid "%{issuesCount} issues with a limit of %{maxIssueCount}"
-msgstr ""
+msgstr "%{issueType} handlinger"
msgid "%{issuesSize} with a limit of %{maxIssueCount}"
msgstr "%{issuesSize} med en grense på %{maxIssueCount}"
@@ -631,10 +647,10 @@ msgid "%{italic_start}What's new%{italic_end} is inactive and cannot be viewed."
msgstr ""
msgid "%{itemsCount} issues with a limit of %{maxIssueCount}"
-msgstr ""
+msgstr "%{itemsCount} saker med en grense på %{maxIssueCount}"
msgid "%{labelStart}Actual response:%{labelEnd} %{headers}"
-msgstr ""
+msgstr "%{labelStart}Faktisk svar:%{labelEnd} %{headers}"
msgid "%{labelStart}Assert:%{labelEnd} %{assertion}"
msgstr ""
@@ -667,7 +683,7 @@ msgid "%{labelStart}Scanner:%{labelEnd} %{scanner}"
msgstr "%{labelStart}Skanner:%{labelEnd} %{scanner}"
msgid "%{labelStart}Sent request:%{labelEnd} %{headers}"
-msgstr ""
+msgstr "%{labelStart}sendte forespørsel:%{labelEnd} %{headers}"
msgid "%{labelStart}Severity:%{labelEnd} %{severity}"
msgstr "%{labelStart}Alvorlighet:%{labelEnd} %{severity}"
@@ -676,11 +692,17 @@ msgid "%{labelStart}Tool:%{labelEnd} %{reportType}"
msgstr ""
msgid "%{labelStart}Unmodified response:%{labelEnd} %{headers}"
-msgstr ""
+msgstr "%{labelStart}Uendret svar:%{labelEnd} %{headers}"
msgid "%{label_for_message} unavailable"
msgstr "%{label_for_message} utilgjengelig"
+msgid "%{learn_more_link}."
+msgstr ""
+
+msgid "%{lessThan} 1 hour"
+msgstr ""
+
msgid "%{lets_encrypt_link_start}Let's Encrypt%{lets_encrypt_link_end} is a free, automated, and open certificate authority (CA) that issues digital certificates to enable HTTPS (SSL/TLS) for sites."
msgstr ""
@@ -693,15 +715,15 @@ msgstr "%{level_name} er ikke tillatt siden utgreiningskildeprosjektet har laver
msgid "%{link_start}Learn more%{link_end} about roles."
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
-msgstr "%{link_start}Lær mer%{link_end} om hvilken informasjon som deles med GitLab Inc."
-
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
msgstr ""
msgid "%{link_start}Start the title with %{draft_snippet}%{link_end} to prevent a merge request that is a work in progress from being merged before it's ready."
msgstr ""
+msgid "%{link_start}What information does GitLab Inc. collect?%{link_end}"
+msgstr ""
+
msgid "%{listToShow}, and %{awardsListLength} more"
msgstr ""
@@ -727,7 +749,7 @@ msgid "%{milliseconds}ms"
msgstr "%{milliseconds}ms"
msgid "%{model_name} not found"
-msgstr ""
+msgstr "%{model_name} ble ikke funnet"
msgid "%{mrText}, this issue will be closed automatically."
msgstr "%{mrText}, denne saken vil bli automatisk lukket."
@@ -739,7 +761,7 @@ msgid "%{name_with_link} namespace has run out of Shared Runner Pipeline minutes
msgstr ""
msgid "%{name} (Busy)"
-msgstr ""
+msgstr "%{name} (opptatt)"
msgid "%{name} contained %{resultsString}"
msgstr "%{name} inneholdt %{resultsString}"
@@ -763,7 +785,7 @@ msgid "%{name}(%{url}) namespace has run out of Shared Runner Pipeline minutes s
msgstr ""
msgid "%{name}, confirm your email address now!"
-msgstr ""
+msgstr "%{name}, vennligst bekreft e-postadressen din nå!"
msgid "%{no_of_days} day"
msgid_plural "%{no_of_days} days"
@@ -774,13 +796,13 @@ msgid "%{number_commits_behind} commits behind %{default_branch}, %{number_commi
msgstr "%{number_commits_behind} commiter bak %{default_branch}, %{number_commits_ahead} commiter foran"
msgid "%{oneMonthAgo} - %{today}"
-msgstr ""
+msgstr "%{oneMonthAgo} - %{today}"
msgid "%{oneWeekAgo} - %{today}"
-msgstr ""
+msgstr "%{oneWeekAgo} - %{today}"
msgid "%{oneYearAgo} - %{today}"
-msgstr ""
+msgstr "%{oneYearAgo} - %{today}"
msgid "%{openOrClose} %{noteable}"
msgstr "%{openOrClose} %{noteable}"
@@ -792,7 +814,7 @@ msgid "%{openedIssues} open, %{closedIssues} closed"
msgstr "%{openedIssues} åpne, %{closedIssues} lukket"
msgid "%{percentage}%% weight completed"
-msgstr ""
+msgstr "%{percentage}%% vektlegging fullført"
msgid "%{percent}%% complete"
msgstr "%{percent}%% fullført"
@@ -821,16 +843,16 @@ msgid "%{remaining_approvals} left"
msgstr "%{remaining_approvals} igjen"
msgid "%{reportType} %{status}"
-msgstr ""
+msgstr "%{reportType} %{status}"
msgid "%{reportType} detected %{totalStart}%{total}%{totalEnd} potential %{vulnMessage}"
-msgstr ""
+msgstr "%{reportType} oppdaget %{totalStart}%{total}%{totalEnd} potensial %{vulnMessage}"
msgid "%{reportType} detected %{totalStart}no%{totalEnd} vulnerabilities."
-msgstr ""
+msgstr "%{reportType} oppdaget %{totalStart}ingen%{totalEnd} sårbarheter."
msgid "%{retryButtonStart}Try again%{retryButtonEnd} or %{newFileButtonStart}attach a new file%{newFileButtonEnd}."
-msgstr ""
+msgstr "%{retryButtonStart}Prøv igjen%{retryButtonEnd} eller %{newFileButtonStart}legg ved en ny fil%{newFileButtonEnd}."
msgid "%{rotation} has been recalculated with the remaining participants. Please review the new setup for %{rotation_link}. It is recommended that you reach out to the current on-call responder to ensure continuity of on-call coverage."
msgstr ""
@@ -854,11 +876,11 @@ msgid_plural "%{securityScanner} results are not available because a pipeline ha
msgstr[0] "%{securityScanner}-resultatet er ikke tilgjengelig fordi en rørledning ikke er kjørt siden den ble aktivert. %{linkStart}Kjør en rørledning%{linkEnd}"
msgstr[1] "%{securityScanner}-resultater er ikke tilgjengelige fordi en rørledning ikke er kjørt siden den ble aktivert. %{linkStart}Kjør en rørledning%{linkEnd}"
-msgid "%{service_ping_link_start}Learn more%{service_ping_link_end} about what information is shared with GitLab Inc."
+msgid "%{service_ping_link_start}What information is shared with GitLab Inc.?%{service_ping_link_end}"
msgstr ""
msgid "%{size} %{unit}"
-msgstr ""
+msgstr "%{size} %{unit}"
msgid "%{size} GiB"
msgstr "%{size} GiB"
@@ -890,9 +912,12 @@ msgstr "%{start} til %{end}"
msgid "%{state} epics"
msgstr "%{state} eposer"
-msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
+msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
msgstr ""
+msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
+msgstr "%{strongStart}Tips:%{strongEnd} Du kan også sjekke fletteforespørsler lokalt ved å %{linkStart}følge disse retningslinjene%{linkEnd}"
+
msgid "%{strong_start}%{branch_count}%{strong_end} Branch"
msgid_plural "%{strong_start}%{branch_count}%{strong_end} Branches"
msgstr[0] "%{strong_start}%{branch_count}%{strong_end} gren"
@@ -905,24 +930,24 @@ msgstr[1] "%{strong_start}%{commit_count}%{strong_end} commiter"
msgid "%{strong_start}%{count} approval rule%{strong_end} requires eligible members to approve before merging."
msgid_plural "%{strong_start}%{count} approval rules%{strong_end} require eligible members to approve before merging."
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%{strong_start}%{count} godkjenningsregel%{strong_end} krever kvalifiserte medlemmers godkjenning før sammenslåing."
+msgstr[1] "%{strong_start}%{count} godkjenningsregler%{strong_end} krever kvalifiserte medlemmers godkjenning før sammenslåing."
msgid "%{strong_start}%{count} eligible member%{strong_end} must approve to merge."
msgid_plural "%{strong_start}%{count} eligible members%{strong_end} must approve to merge."
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%{strong_start}%{count} kvalifisert medlem%{strong_end} må godkjenne sammenslåing."
+msgstr[1] "%{strong_start}%{count} kvalifiserte medlemmer%{strong_end} må godkjenne sammenslåing."
msgid "%{strong_start}%{count} member%{strong_end} must approve to merge. Anyone with role Developer or higher can approve."
msgid_plural "%{strong_start}%{count} members%{strong_end} must approve to merge. Anyone with role Developer or higher can approve."
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%{strong_start}%{count} medlem%{strong_end} må godkjenne sammenslåing. Alle med «Utvikler»-rollen eller høyere kan godkjenne."
+msgstr[1] "%{strong_start}%{count} medlemmer%{strong_end} må godkjenne sammenslåing. Alle med «Utvikler»-rollen eller høyere kan godkjenne."
msgid "%{strong_start}%{human_size}%{strong_end} Files"
msgstr "%{strong_start}%{human_size}%{strong_end} filer"
msgid "%{strong_start}%{human_size}%{strong_end} Storage"
-msgstr "%{strong_start}%{human_size}%{strong_end} Lagring"
+msgstr "%{strong_start}%{human_size}%{strong_end} lagring"
msgid "%{strong_start}%{release_count}%{strong_end} Release"
msgid_plural "%{strong_start}%{release_count}%{strong_end} Releases"
@@ -949,11 +974,6 @@ msgstr "%{tag}-%{evidence}-%{filename}"
msgid "%{template_project_id} is unknown or invalid"
msgstr "%{template_project_id} er ukjent eller ugyldig"
-msgid "%{text} %{files}"
-msgid_plural "%{text} %{files} files"
-msgstr[0] "%{text} %{files}"
-msgstr[1] "%{text} %{files} filer"
-
msgid "%{text} is available"
msgstr "%{text} er tilgjengelig"
@@ -964,7 +984,7 @@ msgid "%{timebox_type} does not support burnup charts"
msgstr ""
msgid "%{timebox_type} must have a start and due date"
-msgstr ""
+msgstr "%{timebox_type} må ha start- og forfallsdato"
msgid "%{title} %{operator} %{threshold}"
msgstr "%{title} %{operator} %{threshold}"
@@ -985,10 +1005,10 @@ msgid "%{total_warnings} warning(s) found:"
msgstr "%{total_warnings} advarsel(er) funnet:"
msgid "%{total} open issue weight"
-msgstr ""
+msgstr "%{total} åpen saksvektlegging"
msgid "%{total} warnings found: showing first %{warningsDisplayed}"
-msgstr ""
+msgstr "%{total} advarsler funnet: viser første %{warningsDisplayed}"
msgid "%{userName} (cannot merge)"
msgstr "%{userName} (kan ikke flette)"
@@ -1006,13 +1026,13 @@ msgid "%{username} changed the draft status of merge request %{mr_link}"
msgstr ""
msgid "%{username} has asked for a GitLab account on your instance %{host}:"
-msgstr ""
+msgstr "%{username} har bedt om en GitLab-konto på din forekomst %{host}:"
msgid "%{username}'s avatar"
msgstr "%{username} sin avatar"
msgid "%{user} created a merge request: %{mr_link}"
-msgstr ""
+msgstr "%{user} opprettet en fletteforespørsel: %{mr_link}"
msgid "%{user} created an epic: %{epic_link}"
msgstr ""
@@ -1021,7 +1041,7 @@ msgid "%{user} created an issue: %{issue_link}"
msgstr ""
msgid "%{value} is not included in the list"
-msgstr ""
+msgstr "%{value} er ikke inkludert i listen"
msgid "%{value} s"
msgstr "%{value} sek"
@@ -1038,9 +1058,6 @@ msgstr "%{webhooks_link_start}%{webhook_type}%{link_end} lar deg sende varsler t
msgid "%{wildcards_link_start}Wildcards%{wildcards_link_end} such as %{code_tag_start}v*%{code_tag_end} or %{code_tag_start}*-release%{code_tag_end} are supported."
msgstr ""
-msgid "&lt; 1 hour"
-msgstr "&lt; 1 time"
-
msgid "'%{data}' at %{location} does not match format: %{format}"
msgstr "'%{data}' ved %{location} samsvarer ikke med formatet: %{format}"
@@ -1066,7 +1083,7 @@ msgid "'%{name}' Value Stream created"
msgstr "'%{name}'-verdistrøm opprettet"
msgid "'%{name}' Value Stream deleted"
-msgstr ""
+msgstr "'%{name}' Verdistrøm slettet"
msgid "'%{name}' Value Stream saved"
msgstr ""
@@ -1089,7 +1106,7 @@ msgid "(%{value}) has already been taken"
msgstr "(%{value}) har allerede blitt tatt"
msgid "(+%{count}&nbsp;rules)"
-msgstr ""
+msgstr "(+%{count}&nbsp;regler)"
msgid "(Group Managed Account)"
msgstr ""
@@ -1098,7 +1115,7 @@ msgid "(No changes)"
msgstr "(Ingen endringer)"
msgid "(UTC %{offset}) %{timezone}"
-msgstr ""
+msgstr "(UTC %{offset}) %{timezone}"
msgid "(check progress)"
msgstr "(sjekk fremgang)"
@@ -1107,7 +1124,7 @@ msgid "(deleted)"
msgstr "(slettet)"
msgid "(expired)"
-msgstr ""
+msgstr "(utløpt)"
msgid "(leave blank if you don't want to change it)"
msgstr ""
@@ -1124,9 +1141,6 @@ msgstr "(tilbakekalt)"
msgid "(we need your current password to confirm your changes)"
msgstr ""
-msgid "* * * * *"
-msgstr "* * * * *"
-
msgid "+ %{amount} more"
msgstr "+ %{amount} til"
@@ -1148,19 +1162,19 @@ msgid "+%{approvers} more approvers"
msgstr "+%{approvers} flere godkjennere"
msgid "+%{extra} more"
-msgstr ""
+msgstr "+%{extra} til"
msgid "+%{more_assignees_count}"
-msgstr ""
+msgstr "+%{more_assignees_count}"
msgid "+%{more_assignees_count} more assignees"
-msgstr ""
+msgstr "+%{more_assignees_count} flere tilordnede"
msgid "+%{more_reviewers_count}"
-msgstr ""
+msgstr "+%{more_reviewers_count}"
msgid "+%{more_reviewers_count} more reviewers"
-msgstr ""
+msgstr "+%{more_reviewers_count} flere anmeldere"
msgid "+%{tags} more"
msgstr "+%{tags} til"
@@ -1191,16 +1205,16 @@ msgid "- show less"
msgstr "- Vis mindre"
msgid "."
+msgstr "."
+
+msgid "/"
msgstr ""
msgid "0 bytes"
msgstr "0 byte"
-msgid "0 for unlimited, only effective with remote storage enabled."
-msgstr ""
-
msgid "0t1DgySidms"
-msgstr ""
+msgstr "0t1DgySidms"
msgid "1 Day"
msgid_plural "%d Days"
@@ -1209,8 +1223,8 @@ msgstr[1] "%d dager"
msgid "1 Issue"
msgid_plural "%d Issues"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "1 sak"
+msgstr[1] "%d saker"
msgid "1 closed issue"
msgid_plural "%{issues} closed issues"
@@ -1229,23 +1243,23 @@ msgstr[1] "%d dager"
msgid "1 day remaining"
msgid_plural "%d days remaining"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "1 dag igjen"
+msgstr[1] "%d dager igjen"
msgid "1 day selected"
msgid_plural "%d days selected"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "1 dag valgt"
+msgstr[1] "%d dager valgt"
msgid "1 deploy key"
msgid_plural "%d deploy keys"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "1 distribusjonsnøkkel"
+msgstr[1] "%d distribusjonsnøkler"
msgid "1 follower"
msgid_plural "%{count} followers"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "1 følger"
+msgstr[1] "%{count} følgere"
msgid "1 group"
msgid_plural "%d groups"
@@ -1259,13 +1273,13 @@ msgstr[1] "%d timer"
msgid "1 issue selected"
msgid_plural "%d issues selected"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "1 sak valgt"
+msgstr[1] "%d saker valgt"
msgid "1 merge request selected"
msgid_plural "%d merge requests selected"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "1 fletteforespørsel valgt"
+msgstr[1] "%d fletteforespørsler valgt"
msgid "1 merged merge request"
msgid_plural "%{merge_requests} merged merge requests"
@@ -1279,8 +1293,8 @@ msgstr[1] "%d minutter"
msgid "1 month remaining"
msgid_plural "%d months remaining"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "1 måned igjen"
+msgstr[1] "%d måneder igjen"
msgid "1 open issue"
msgid_plural "%{issues} open issues"
@@ -1309,13 +1323,13 @@ msgstr[1] "%{num} brukere"
msgid "1 week remaining"
msgid_plural "%d weeks remaining"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "1 uke igjen"
+msgstr[1] "%d uker igjen"
msgid "1 year remaining"
msgid_plural "%d years remaining"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "1 år igjen"
+msgstr[1] "%d år igjen"
msgid "1-9 contributions"
msgstr "1-9 bidrag"
@@ -1324,6 +1338,9 @@ msgid "10-19 contributions"
msgstr "10-19 bidrag"
msgid "1000+"
+msgstr "1000+"
+
+msgid "192.168.0.0/24"
msgstr ""
msgid "1st contribution!"
@@ -1423,10 +1440,10 @@ msgid "A deleted user"
msgstr "En slettet bruker"
msgid "A description is required"
-msgstr ""
+msgstr "En beskrivelse er påkrevd"
msgid "A different reason"
-msgstr ""
+msgstr "En annen årsak"
msgid "A file has been changed."
msgstr "En fil har blitt endret."
@@ -1479,9 +1496,6 @@ msgstr ""
msgid "A plain HTML site that uses Netlify for CI/CD instead of GitLab, but still with all the other great GitLab features"
msgstr ""
-msgid "A plain-text response to show to clients that hit the rate limit."
-msgstr ""
-
msgid "A platform value can be web, mob or app."
msgstr "En plattformverdi kan være web, mob, eller app."
@@ -1510,7 +1524,7 @@ msgid "A string appended to the project path to form the Service Desk email addr
msgstr ""
msgid "A title is required"
-msgstr ""
+msgstr "En tittel er påkrevd"
msgid "A user with write access to the source branch selected this option"
msgstr ""
@@ -1519,7 +1533,7 @@ msgid "ACTION REQUIRED: Something went wrong while obtaining the Let's Encrypt c
msgstr ""
msgid "API"
-msgstr ""
+msgstr "API"
msgid "API Fuzzing"
msgstr ""
@@ -1534,10 +1548,10 @@ msgid "API Token"
msgstr "API-token"
msgid "API key"
-msgstr ""
+msgstr "API-nøkkel"
msgid "API?"
-msgstr ""
+msgstr "API?"
msgid "APIFuzzing|$VARIABLE_WITH_PASSWORD"
msgstr ""
@@ -1552,10 +1566,10 @@ msgid "APIFuzzing|Base URL of API testing target. For example, http://www.exampl
msgstr ""
msgid "APIFuzzing|Choose a method"
-msgstr ""
+msgstr "Velg en metode"
msgid "APIFuzzing|Choose a profile"
-msgstr ""
+msgstr "Velg en profil"
msgid "APIFuzzing|Code snippet could not be generated. Try again later."
msgstr ""
@@ -1563,11 +1577,11 @@ msgstr ""
msgid "APIFuzzing|Configure HTTP basic authentication values. Other authentication methods are supported. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
+msgid "APIFuzzing|Customize your project's API fuzzing configuration options and copy the code snippet to your .gitlab-ci.yml file to apply any changes. Note that this tool does not reflect or update your .gitlab-ci.yml file automatically. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
msgstr ""
msgid "APIFuzzing|Enable authentication"
-msgstr ""
+msgstr "Skru på autentisering"
msgid "APIFuzzing|Enter the name of the CI variable containing the password. For example, $VARIABLE_WITH_PASSWORD."
msgstr ""
@@ -1576,7 +1590,7 @@ msgid "APIFuzzing|Enter the name of the CI variable containing the username. For
msgstr ""
msgid "APIFuzzing|File path or URL to APIs to be tested. For example, folder/example_fuzz.har. HAR files may contain sensitive information such as authentication tokens, API keys, and session cookies. We recommend that you review the HAR files' contents before adding them to a repository."
-msgstr ""
+msgstr "Filbanen eller URL-en til API-ene som skal testes. For eksempel folder/example_fuzz.har. HAR-filer kan inneholde sensitiv informasjon som autentiseringssjetonger, API-nøkler, og øktinfokapsler. Vi anbefaler at du går gjennom HAR-filenes innhold før du legger til i et kodelager."
msgid "APIFuzzing|File path or URL to OpenAPI specification. For example, folder/openapi.json or http://www.example.com/openapi.json."
msgstr ""
@@ -1594,10 +1608,10 @@ msgid "APIFuzzing|Password for basic authentication"
msgstr ""
msgid "APIFuzzing|Predefined profiles"
-msgstr ""
+msgstr "Forhåndsdefinerte profiler"
msgid "APIFuzzing|Scan mode"
-msgstr ""
+msgstr "Skannemodus"
msgid "APIFuzzing|Scan profile"
msgstr ""
@@ -1606,7 +1620,7 @@ msgid "APIFuzzing|Show code snippet for the profile"
msgstr ""
msgid "APIFuzzing|Target URL"
-msgstr ""
+msgstr "MÃ¥l-URL"
msgid "APIFuzzing|There are three ways to perform scans."
msgstr ""
@@ -1621,14 +1635,11 @@ msgid "APIFuzzing|Tip: Insert this part below all stages"
msgstr ""
msgid "APIFuzzing|To prevent a security leak, authentication info must be added as a %{ciVariablesLinkStart}CI variable%{ciVariablesLinkEnd}. A user with maintainer access rights can manage CI variables in the %{ciSettingsLinkStart}Settings%{ciSettingsLinkEnd} area. We detected that you are not a maintainer. Commit your changes and assign them to a maintainer to update the credentials before merging."
-msgstr ""
+msgstr "For å forhindre en sikkerhetslekkasje må autentiseringsinformasjon legges til som en %{ciVariablesLinkStart}CI-variabel%{ciVariablesLinkEnd}. En bruker med «Vedlikeholder»-rettigheter kan behandle CI-variabler i %{ciSettingsLinkStart}Innstillinger%{ciSettingsLinkEnd}-området. Vi oppdaget at du ikke er en vedlikeholder. Commit endringene dine og tilordne dem til en vedlikeholder for å oppdatere legitimasjonene før innfletting."
msgid "APIFuzzing|To prevent a security leak, authentication info must be added as a %{ciVariablesLinkStart}CI variable%{ciVariablesLinkEnd}. As a user with maintainer access rights, you can manage CI variables in the %{ciSettingsLinkStart}Settings%{ciSettingsLinkEnd} area."
msgstr ""
-msgid "APIFuzzing|Use this tool to generate API fuzzing configuration YAML to copy into your .gitlab-ci.yml file. This tool does not reflect or update your .gitlab-ci.yml file automatically."
-msgstr ""
-
msgid "APIFuzzing|Username for basic authentication"
msgstr ""
@@ -1636,13 +1647,13 @@ msgid "APIFuzzing|You may need a maintainer's help to secure your credentials."
msgstr ""
msgid "APIFuzzing|folder/example.postman_collection.json"
-msgstr ""
+msgstr "folder/example.postman_collection.json"
msgid "APIFuzzing|folder/example_fuzz.har"
-msgstr ""
+msgstr "folder/example_fuzz.har"
msgid "APIFuzzing|folder/openapi.json"
-msgstr ""
+msgstr "folder/openapi.json"
msgid "AWS Access Key"
msgstr "AWS tilgangsnøkkel"
@@ -1657,7 +1668,7 @@ msgid "AWS Secret Access Key. Only required if not using role instance credentia
msgstr ""
msgid "AWS service error: %{error}"
-msgstr ""
+msgstr "AWS-tjenestefeil: %{error}"
msgid "Abort"
msgstr "Avbryt"
@@ -1680,9 +1691,6 @@ msgstr "Rapporter over misbruk"
msgid "Abuse reports notification email"
msgstr ""
-msgid "Abuse reports will be sent to this address if it is set. Abuse reports are always available in the admin area."
-msgstr ""
-
msgid "Accept invitation"
msgstr "Aksepter invitasjon"
@@ -1705,18 +1713,21 @@ msgid "Access denied! Please verify you can add deploy keys to this repository."
msgstr "Ingen tilgang! Vennligst verifiser at du kan legge til nøkler i dette kodelageret."
msgid "Access denied: %{error}"
-msgstr ""
+msgstr "Tilgang nektet: %{error}"
msgid "Access expiration date"
msgstr "Tilgangsutløpsdato"
msgid "Access expires"
-msgstr ""
+msgstr "Tilgangen utløper"
msgid "Access forbidden. Check your access level."
msgstr "Tilgang nektet. Sjekk ditt tilgangsnivå."
msgid "Access granted"
+msgstr "Tilgang gitt"
+
+msgid "Access key ID"
msgstr ""
msgid "Access requests"
@@ -1725,9 +1736,12 @@ msgstr ""
msgid "Access to '%{classification_label}' not allowed"
msgstr "Tilgang til '%{classification_label}' er ikke tillatt"
-msgid "AccessDropdown|Deploy Keys"
+msgid "Access tokens expire after 2 hours. A refresh token may be used at any time to generate a new access token. Non-expiring access tokens are deprecated. Clear this setting to enable backward compatibility."
msgstr ""
+msgid "AccessDropdown|Deploy Keys"
+msgstr "Distribuer nøkler"
+
msgid "AccessDropdown|Groups"
msgstr "Grupper"
@@ -1744,7 +1758,7 @@ msgid "AccessTokens|Are you sure?"
msgstr "Er du sikker?"
msgid "AccessTokens|Are you sure? Any RSS or calendar URLs currently in use will stop working."
-msgstr ""
+msgstr "Er du sikker? Eventuelle nettadresser til RSS eller kalendre som er i bruk, vil slutte å fungere."
msgid "AccessTokens|Are you sure? Any issue email addresses currently in use will stop working."
msgstr ""
@@ -1753,10 +1767,10 @@ msgid "AccessTokens|Created"
msgstr "Opprettet"
msgid "AccessTokens|Feed token"
-msgstr ""
+msgstr "Strøm-sjetong"
msgid "AccessTokens|Incoming email token"
-msgstr ""
+msgstr "Innkommende E-postsjetong"
msgid "AccessTokens|It cannot be used to access any other data."
msgstr "Den kan ikke brukes til å få tilgang til noen andre data."
@@ -1777,10 +1791,10 @@ msgid "AccessTokens|Static object token"
msgstr "Statisk objektssjetong"
msgid "AccessTokens|They are the only accepted password when you have Two-Factor Authentication (2FA) enabled."
-msgstr ""
+msgstr "De er det eneste aksepterte passordet dersom du har 2-trinnsautentisering (2FA) skrudd på."
msgid "AccessTokens|You can also use personal access tokens to authenticate against Git over HTTP."
-msgstr ""
+msgstr "Du kan også bruke personlige tilgangssjetonger til å autentisere til Git over HTTP."
msgid "AccessTokens|You can generate a personal access token for each application you use that needs access to the GitLab API."
msgstr "Du kan generere en sjetong for personlig tilgang for hvert program du bruker som trenger tilgang til GitLab-API-en."
@@ -1819,13 +1833,13 @@ msgid "Account and limit"
msgstr "Konto og grenser"
msgid "Account:"
-msgstr ""
+msgstr "Konto:"
msgid "Account: %{account}"
msgstr "Konto: %{account}"
msgid "Action"
-msgstr ""
+msgstr "Handling"
msgid "Action to take when receiving an alert. %{docsLink}"
msgstr ""
@@ -1903,7 +1917,7 @@ msgid "Add a bullet list"
msgstr "Legg til en punktliste"
msgid "Add a collapsible section"
-msgstr ""
+msgstr "Legg til en sammenklappbar seksjon"
msgid "Add a comment to this line"
msgstr "Legg til en kommentar til denne linjen"
@@ -1924,7 +1938,7 @@ msgid "Add a homepage to your wiki that contains information about your project
msgstr "Legg til en hjemmeside på din wiki som inneholder informasjon om prosjektet ditt og GitLab vil vise det her i stedet for denne meldingen."
msgid "Add a horizontal rule"
-msgstr ""
+msgstr "Legg til en vannrett linjal"
msgid "Add a line"
msgstr "Legg til en linje"
@@ -1933,7 +1947,7 @@ msgid "Add a link"
msgstr "Legg til lenke"
msgid "Add a link to Grafana"
-msgstr ""
+msgstr "Legg til en lenke til Grafana"
msgid "Add a new issue"
msgstr "Legg til en ny sak"
@@ -1951,7 +1965,7 @@ msgid "Add a task list"
msgstr "Legg til en oppgaveliste"
msgid "Add a to do"
-msgstr ""
+msgstr "Legg til en oppgave"
msgid "Add an SSH key"
msgstr "Legg til en SSH-nøkkel"
@@ -2005,7 +2019,7 @@ msgid "Add email address"
msgstr "Legg til E-postadresse"
msgid "Add email participant(s)"
-msgstr ""
+msgstr "Legg til E-postdeltaker(e)"
msgid "Add environment"
msgstr "Legg til miljø"
@@ -2037,6 +2051,9 @@ msgstr "Legg til ny applikasjon"
msgid "Add new directory"
msgstr "Legg til ny katalog"
+msgid "Add new service account"
+msgstr ""
+
msgid "Add or remove previously merged commits"
msgstr "Legg til eller fjern tidligere innflettede commits"
@@ -2047,10 +2064,10 @@ msgid "Add previously merged commits"
msgstr "Legg til tidligere innflettede commiter"
msgid "Add project"
-msgstr ""
+msgstr "Legg til prosjekt"
msgid "Add projects"
-msgstr ""
+msgstr "Legg til prosjekter"
msgid "Add reaction"
msgstr "Legg til reaksjon"
@@ -2074,16 +2091,16 @@ msgid "Add to Slack"
msgstr "Legg til i Slack"
msgid "Add to board"
-msgstr ""
+msgstr "Legg til på bord"
msgid "Add to epic"
msgstr "Legg til i epos"
msgid "Add to merge train"
-msgstr ""
+msgstr "Legg til i flettetog"
msgid "Add to merge train when pipeline succeeds"
-msgstr ""
+msgstr "Legg til i flettetog når rørledningen lykkes"
msgid "Add to review"
msgstr "Legg til vurdering"
@@ -2125,13 +2142,13 @@ msgid "AddMember|Invite limit of %{daily_invites} per day exceeded"
msgstr ""
msgid "AddMember|No invite source provided."
-msgstr ""
+msgstr "Ingen invitasjonskilde ble spesifisert."
msgid "AddMember|No users specified."
msgstr "Ingen brukere spesifisert."
msgid "AddMember|Too many users specified (limit is %{user_limit})"
-msgstr ""
+msgstr "For mange brukere ble spesifisert (grensen er %{user_limit})"
msgid "Added"
msgstr "Lagt til"
@@ -2143,7 +2160,7 @@ msgid "Added %{label_references} %{label_text}."
msgstr "La til %{label_references} %{label_text}."
msgid "Added a to do."
-msgstr ""
+msgstr "La til en oppgave."
msgid "Added an issue to an epic."
msgstr "La til en sak i en epos."
@@ -2167,28 +2184,28 @@ msgid "Additional minutes"
msgstr "Ytterligere minutter"
msgid "Additional minutes:"
-msgstr ""
+msgstr "Ytterligere minutter:"
msgid "Additional text"
msgstr "Ytterligere tekst"
msgid "Additional text for the sign-in and Help page."
-msgstr ""
+msgstr "Ytterligere tekst for påloggings- og hjelpesiden."
msgid "Additional text to show on the Help page"
-msgstr ""
+msgstr "Ytterligere tekst å vise på hjelpesiden"
msgid "Additional text to show on the sign-in page"
-msgstr ""
+msgstr "Ytterligere tekst å vise på påloggingssiden"
msgid "Address"
-msgstr ""
+msgstr "Adresse"
msgid "Adds"
-msgstr ""
+msgstr "Legger til"
msgid "Adds %{epic_ref} as child epic."
-msgstr ""
+msgstr "Legger til %{epic_ref} som under-epos."
msgid "Adds %{labels} %{label_text}."
msgstr "Legger til %{labels} %{label_text}."
@@ -2197,13 +2214,13 @@ msgid "Adds a Zoom meeting"
msgstr "Legger til et Zoom-møte"
msgid "Adds a to do."
-msgstr ""
+msgstr "Legger til en oppgave."
msgid "Adds an issue to an epic."
msgstr "Legger til en sak i en epos."
msgid "Adds email participant(s)"
-msgstr ""
+msgstr "Legger til E-postdeltaker(e)"
msgid "Adjust how frequently the GitLab UI polls for updates."
msgstr ""
@@ -2212,13 +2229,13 @@ msgid "Adjust your filters/search criteria above. If you believe this may be an
msgstr "Juster dine filtre/søkekriterier ovenfor. Hvis du mener at dette kan være en feil, kan du se dokumentasjonen for %{linkStart}Geo-feilsøking%{linkEnd} for mer informasjon."
msgid "Admin"
-msgstr ""
+msgstr "Admin"
msgid "Admin Area"
msgstr "Admin-område"
msgid "Admin Mode"
-msgstr ""
+msgstr "Admin-modus"
msgid "Admin Note"
msgstr "Admin-notis"
@@ -2242,7 +2259,7 @@ msgid "Admin mode enabled"
msgstr "Adminmodus skrudd på"
msgid "Admin navigation"
-msgstr ""
+msgstr "Admin-navigasjon"
msgid "Admin notes"
msgstr "Admin-notater"
@@ -2266,16 +2283,19 @@ msgid "AdminArea|Bots"
msgstr "Botter"
msgid "AdminArea|Components"
-msgstr ""
+msgstr "Komponenter"
msgid "AdminArea|Developer"
msgstr "Utvikler"
msgid "AdminArea|Features"
+msgstr "Funksjoner"
+
+msgid "AdminArea|Get security updates from GitLab and stay up to date"
msgstr ""
msgid "AdminArea|Groups"
-msgstr ""
+msgstr "Grupper"
msgid "AdminArea|Guest"
msgstr "Gjest"
@@ -2284,35 +2304,41 @@ msgid "AdminArea|Included Free in license"
msgstr "Inkludert gratis i lisensen"
msgid "AdminArea|Latest groups"
-msgstr ""
+msgstr "Nyligste grupper"
msgid "AdminArea|Latest projects"
-msgstr ""
+msgstr "Seneste prosjekter"
msgid "AdminArea|Latest users"
-msgstr ""
+msgstr "Nyligste brukere"
msgid "AdminArea|Maintainer"
msgstr "Vedlikeholder"
msgid "AdminArea|New group"
-msgstr ""
+msgstr "Ny gruppe"
msgid "AdminArea|New project"
-msgstr ""
+msgstr "Nytt prosjekt"
msgid "AdminArea|New user"
-msgstr ""
+msgstr "Ny bruker"
msgid "AdminArea|Owner"
msgstr "Eier"
msgid "AdminArea|Projects"
-msgstr ""
+msgstr "Prosjekter"
msgid "AdminArea|Reporter"
msgstr "Rapportør"
+msgid "AdminArea|Sign up for the GitLab Security Newsletter to get notified for security updates."
+msgstr ""
+
+msgid "AdminArea|Sign up for the GitLab newsletter"
+msgstr ""
+
msgid "AdminArea|Stop all jobs"
msgstr "Stopp alle jobber"
@@ -2329,7 +2355,7 @@ msgid "AdminArea|Total users"
msgstr "Totalt antall brukere"
msgid "AdminArea|Users"
-msgstr ""
+msgstr "Brukere"
msgid "AdminArea|Users statistics"
msgstr "Statistikk over brukere"
@@ -2341,13 +2367,13 @@ msgid "AdminArea|Users without a Group and Project"
msgstr "Brukere uten gruppe og prosjekt"
msgid "AdminArea|View latest groups"
-msgstr ""
+msgstr "Vis nyeste grupper"
msgid "AdminArea|View latest projects"
-msgstr ""
+msgstr "Vis nyligste prosjekter"
msgid "AdminArea|View latest users"
-msgstr ""
+msgstr "Vis nyeste grupper"
msgid "AdminArea|You’re about to stop all jobs. This will halt all current jobs that are running."
msgstr ""
@@ -2374,7 +2400,7 @@ msgid "AdminSettings|Auto DevOps domain"
msgstr "Auto DevOps-domene"
msgid "AdminSettings|Configure Let's Encrypt"
-msgstr ""
+msgstr "Konfigurer «Let's Encrypt»"
msgid "AdminSettings|Disable feed token"
msgstr ""
@@ -2382,9 +2408,15 @@ msgstr ""
msgid "AdminSettings|Disable public access to Pages sites"
msgstr ""
+msgid "AdminSettings|Display a banner on merge requests in projects with no pipelines to initiate steps to add a .gitlab-ci.yml file."
+msgstr ""
+
msgid "AdminSettings|Domain verification is an essential security measure for public GitLab sites. Users are required to demonstrate they control a domain before it is enabled. %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "AdminSettings|Enable pipeline suggestion banner"
+msgstr ""
+
msgid "AdminSettings|Enable shared runners for new projects"
msgstr ""
@@ -2401,7 +2433,7 @@ msgid "AdminSettings|Keep the latest artifacts for all jobs in the latest succes
msgstr ""
msgid "AdminSettings|Let's Encrypt email"
-msgstr ""
+msgstr "«Let's Encrypt»-E-post"
msgid "AdminSettings|Maximum duration of a session for Git operations when 2FA is enabled."
msgstr ""
@@ -2422,7 +2454,7 @@ msgid "AdminSettings|Required pipeline configuration"
msgstr "Påkrevd rørledningsoppsett"
msgid "AdminSettings|Select a CI/CD template"
-msgstr ""
+msgstr "Velg en CI/CD-mal"
msgid "AdminSettings|Select a group to use as the source for instance-level project templates."
msgstr ""
@@ -2467,7 +2499,7 @@ msgid "AdminStatistics|Issues"
msgstr "Saker"
msgid "AdminStatistics|Merge requests"
-msgstr ""
+msgstr "Fletteforespørsler"
msgid "AdminStatistics|Milestones"
msgstr "Milepæler"
@@ -2482,22 +2514,22 @@ msgid "AdminStatistics|Snippets"
msgstr "Utdrag"
msgid "AdminUsers|(Admin)"
-msgstr ""
+msgstr "(Admin)"
msgid "AdminUsers|(Banned)"
-msgstr ""
+msgstr "(Bannlyst)"
msgid "AdminUsers|(Blocked)"
-msgstr ""
+msgstr "(Blokkert)"
msgid "AdminUsers|(Deactivated)"
-msgstr ""
+msgstr "(Deaktivert)"
msgid "AdminUsers|(Internal)"
-msgstr ""
+msgstr "(Intern)"
msgid "AdminUsers|(Pending approval)"
-msgstr ""
+msgstr "(Venter på godkjenning)"
msgid "AdminUsers|2FA Disabled"
msgstr "2FA er skrudd av"
@@ -2512,16 +2544,16 @@ msgid "AdminUsers|Access"
msgstr "Tilgang"
msgid "AdminUsers|Access Git repositories"
-msgstr ""
+msgstr "FÃ¥ tilgang til Git-arkiver"
msgid "AdminUsers|Access the API"
-msgstr ""
+msgstr "FÃ¥ tilgang til API-en"
msgid "AdminUsers|Activate"
-msgstr ""
+msgstr "Aktiver"
msgid "AdminUsers|Activate user %{username}?"
-msgstr ""
+msgstr "Vil du aktivere brukeren %{username}?"
msgid "AdminUsers|Active"
msgstr "Aktiv"
@@ -2539,28 +2571,28 @@ msgid "AdminUsers|Admins"
msgstr "Administratorer"
msgid "AdminUsers|Approve"
-msgstr ""
+msgstr "Godkjenn"
msgid "AdminUsers|Approve user %{username}?"
-msgstr ""
+msgstr "Vil du godkjenne brukeren %{username}?"
msgid "AdminUsers|Approved users can:"
-msgstr ""
+msgstr "Godkjente brukere kan:"
msgid "AdminUsers|Automatically marked as default internal user"
msgstr ""
msgid "AdminUsers|Ban user"
-msgstr ""
+msgstr "Bannlys bruker"
msgid "AdminUsers|Ban user %{username}?"
-msgstr ""
+msgstr "Vil du bannlyse brukeren %{username}?"
msgid "AdminUsers|Banned"
-msgstr ""
+msgstr "Bannlyst"
msgid "AdminUsers|Be added to groups and projects"
-msgstr ""
+msgstr "Bli lagt til i grupper og prosjekter"
msgid "AdminUsers|Block"
msgstr "Blokker"
@@ -2584,13 +2616,13 @@ msgid "AdminUsers|Cannot unblock LDAP blocked users"
msgstr "Kan ikke oppheve blokkering av LDAP-blokkerte brukere"
msgid "AdminUsers|Cohorts"
-msgstr ""
+msgstr "Kohorter"
msgid "AdminUsers|Confirm user"
-msgstr ""
+msgstr "Bekreft bruker"
msgid "AdminUsers|Confirm user %{username}?"
-msgstr ""
+msgstr "Vil du bekrefte brukeren %{username}?"
msgid "AdminUsers|Could not load user group counts. Please refresh the page to try again."
msgstr ""
@@ -2620,7 +2652,7 @@ msgid "AdminUsers|Delete user and contributions"
msgstr "Slette brukeren og bidragene"
msgid "AdminUsers|Export permissions as CSV"
-msgstr ""
+msgstr "Eksporter tillatelser som CSV"
msgid "AdminUsers|External"
msgstr "Ekstern"
@@ -2629,7 +2661,7 @@ msgid "AdminUsers|External users cannot see internal or private projects unless
msgstr "Eksterne brukere kan ikke se interne eller private prosjekter med mindre tilgang er uttrykkelig gitt. Eksterne brukere kan heller ikke opprette prosjekter, grupper, eller personlige utdrag."
msgid "AdminUsers|For more information, please refer to the %{link_start}user account deletion documentation.%{link_end}"
-msgstr ""
+msgstr "For mer informasjon, vennligst se %{link_start}dokumentasjonen om brukerkontosletting.%{link_end}"
msgid "AdminUsers|Here are some helpful links to help you manage your instance:"
msgstr ""
@@ -2653,7 +2685,7 @@ msgid "AdminUsers|Learn more about %{link_start}banned users.%{link_end}"
msgstr ""
msgid "AdminUsers|Log in"
-msgstr ""
+msgstr "Logg på"
msgid "AdminUsers|Manage (accept/reject) pending user sign ups"
msgstr ""
@@ -2668,7 +2700,7 @@ msgid "AdminUsers|Owned groups will be left"
msgstr "Eide grupper vil bli forlatt"
msgid "AdminUsers|Pending approval"
-msgstr ""
+msgstr "Avventer godkjenning"
msgid "AdminUsers|Personal projects will be left"
msgstr "Personlige prosjekter vil bli forlatt"
@@ -2686,13 +2718,13 @@ msgid "AdminUsers|Regular users have access to their groups and projects"
msgstr "Vanlige brukere har tilgang til deres grupper og prosjekter"
msgid "AdminUsers|Reject"
-msgstr ""
+msgstr "Avvis"
msgid "AdminUsers|Reject user %{username}?"
-msgstr ""
+msgstr "Vil du avvise brukeren %{username}?"
msgid "AdminUsers|Rejected users:"
-msgstr ""
+msgstr "Avviste brukere:"
msgid "AdminUsers|Restore user access to the account, including web, Git and API."
msgstr "Gjenopprett brukertilgang til kontoen, inkludert nett, Git og API."
@@ -2713,7 +2745,7 @@ msgid "AdminUsers|The user can't access git repositories."
msgstr ""
msgid "AdminUsers|The user can't log in."
-msgstr ""
+msgstr "Brukeren kan ikke logge på."
msgid "AdminUsers|The user will be logged out"
msgstr "Brukeren vil bli logget av"
@@ -2737,13 +2769,13 @@ msgid "AdminUsers|To confirm, type %{username}"
msgstr "For å bekrefte, skriv %{username}"
msgid "AdminUsers|Unban user"
-msgstr ""
+msgstr "Opphev bannlysning av bruker"
msgid "AdminUsers|Unban user %{username}?"
msgstr ""
msgid "AdminUsers|Unblock"
-msgstr ""
+msgstr "Opphev blokkering"
msgid "AdminUsers|Unblock user %{username}?"
msgstr ""
@@ -2752,7 +2784,7 @@ msgid "AdminUsers|Unlock user %{username}?"
msgstr ""
msgid "AdminUsers|User administration"
-msgstr ""
+msgstr "Brukeradministrasjon"
msgid "AdminUsers|User is validated and can use free CI minutes on shared runners."
msgstr ""
@@ -2764,7 +2796,7 @@ msgid "AdminUsers|User will not be able to login"
msgstr "Brukeren vil ikke kunne logge på"
msgid "AdminUsers|Users"
-msgstr ""
+msgstr "Brukere"
msgid "AdminUsers|Users can still be invited to your instance and/or add themselves if permitted based on your settings. They will not have access to your instance, nor count towards your subscribed seat count until you %{approve_link}."
msgstr ""
@@ -2776,10 +2808,10 @@ msgid "AdminUsers|View pending member requests"
msgstr ""
msgid "AdminUsers|What can I do?"
-msgstr ""
+msgstr "Hva kan jeg gjøre?"
msgid "AdminUsers|What does this mean?"
-msgstr ""
+msgstr "Hva betyr dette?"
msgid "AdminUsers|When banned:"
msgstr ""
@@ -2788,16 +2820,16 @@ msgid "AdminUsers|When the user logs back in, their account will reactivate as a
msgstr "Når brukeren logger på igjen, blir kontoen deres reaktivert som en fullt aktiv konto"
msgid "AdminUsers|Will be deleted"
-msgstr ""
+msgstr "Vil bli slettet"
msgid "AdminUsers|Without projects"
msgstr "Uten prosjekter"
msgid "AdminUsers|You are about to permanently delete the user %{username}. Issues, merge requests, and groups linked to them will be transferred to a system-wide \"Ghost-user\". To avoid data loss, consider using the %{strongStart}block user%{strongEnd} feature instead. Once you %{strongStart}Delete user%{strongEnd}, it cannot be undone or recovered."
-msgstr ""
+msgstr "Du er i ferd med å slette brukeren %{username} permanent. Saker, fletteforespørsler og grupper knyttet til dem vil bli overført til en systemomfattende \"Spøkelsesbruker\". For å unngå tap av data, bør du vurdere å bruke «%{strongStart}Blokker bruker%{strongEnd}»-funksjonen i stedet. Når du har benyttet «%{strongStart}Slett bruker%{strongEnd}», kan det ikke angres på eller gjenopprettes."
msgid "AdminUsers|You are about to permanently delete the user %{username}. This will delete all of the issues, merge requests, and groups linked to them. To avoid data loss, consider using the %{strongStart}block user%{strongEnd} feature instead. Once you %{strongStart}Delete user%{strongEnd}, it cannot be undone or recovered."
-msgstr ""
+msgstr "Du er i ferd med å slette brukeren %{username} permanent. Dette vil slette alle saker, fletteforespørsler og grupper knyttet til dem. For å unngå tap av data, bør du vurdere å bruke «%{strongStart}Blokker bruker%{strongEnd}»-funksjonen i stedet. Når du har benyttet «%{strongStart}Slett bruker%{strongEnd}», kan det ikke angres på eller gjenopprettes."
msgid "AdminUsers|You can always block their account again if needed."
msgstr ""
@@ -2827,7 +2859,7 @@ msgid "AdminUsers|Your GitLab instance has reached the maximum allowed %{user_do
msgstr ""
msgid "AdminUsers|approve them"
-msgstr ""
+msgstr "godkjenn dem"
msgid "AdminUsers|contact our support team"
msgstr ""
@@ -2836,7 +2868,7 @@ msgid "AdminUsers|docs"
msgstr ""
msgid "AdminUsers|user cap"
-msgstr ""
+msgstr "brukergrense"
msgid "Administration"
msgstr "Administrasjon"
@@ -2845,21 +2877,21 @@ msgid "Admin|Additional users must be reviewed and approved by a system administ
msgstr ""
msgid "Admin|Admin notes"
-msgstr ""
+msgstr "Admin-notater"
msgid "Admin|Learn more about quarterly reconciliation"
msgstr ""
msgid "Admin|Note"
-msgstr ""
+msgstr "Notis"
msgid "Admin|Quarterly reconciliation will occur on %{qrtlyDate}"
msgstr ""
-msgid "Admin|The number of max seats used for your namespace is currently exceeding the number of seats in your subscription. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgid "Admin|The number of max seats in your namespace exceeds the number of seats in your subscription. On %{qrtlyDate}, quarterly reconciliation occurs and you are automatically billed a prorated amount for the overage. No action is needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice. For more information about the timing of the invoicing process, view the documentation."
msgstr ""
-msgid "Admin|The number of maximum users for your instance is currently exceeding the number of users in license. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgid "Admin|The number of max users in your instance exceeds the number of users in your license. On %{qrtlyDate}, quarterly reconciliation occurs and you are automatically billed a prorated amount for the overage. No action is needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice. For more information about the timing of the invoicing process, view the documentation."
msgstr ""
msgid "Admin|View pending user approvals"
@@ -2878,10 +2910,7 @@ msgid "Advanced Settings"
msgstr "Avanserte innstillinger"
msgid "Advanced export options"
-msgstr ""
-
-msgid "Advanced permissions, Large File Storage and Two-Factor authentication settings."
-msgstr "Avanserte tillatelser, stor fillagring, og 2-trinnsautentiseringsinnstillinger."
+msgstr "Avanserte eksportinnstillinger"
msgid "After a successful password update you will be redirected to login screen."
msgstr "Etter en vellykket passordoppdatering vil du bli omdirigert til påloggingsskjermen."
@@ -2890,10 +2919,10 @@ msgid "After a successful password update, you will be redirected to the login p
msgstr "Etter en vellykket passordoppdatering, vil du bli omdirigert til påloggingssiden der du kan logge på med ditt nye passord."
msgid "After that, you will not be able to use merge approvals or code quality as well as many other features."
-msgstr ""
+msgstr "Etter det vil du ikke kunne bruke flettegodkjenninger eller kodekvalitet samt mange andre funksjoner."
msgid "After that, you will not be able to use merge approvals or epics as well as many other features."
-msgstr ""
+msgstr "Etter det vil du ikke kunne bruke flettegodkjenninger eller eposer, så vel som mange andre funksjoner."
msgid "After that, you will not be able to use merge approvals or epics as well as many security features."
msgstr ""
@@ -2901,13 +2930,14 @@ msgstr ""
msgid "After you've reviewed these contribution guidelines, you'll be all set to"
msgstr ""
-msgid "Akismet API Key"
+msgid "Akismet"
msgstr ""
-msgid "Alert"
-msgid_plural "Alerts"
-msgstr[0] "Varsel"
-msgstr[1] "Varsler"
+msgid "Akismet API Key"
+msgstr "Akismet-API-nøkkel"
+
+msgid "Akismet helps prevent the creation of spam issues in public projects."
+msgstr ""
msgid "AlertManagement|Acknowledged"
msgstr "Anerkjent"
@@ -2955,16 +2985,16 @@ msgid "AlertManagement|Edit"
msgstr "Rediger"
msgid "AlertManagement|Environment"
-msgstr ""
+msgstr "Miljø"
msgid "AlertManagement|Events"
msgstr "Hendelser"
msgid "AlertManagement|Incident"
-msgstr ""
+msgstr "Hendelse"
msgid "AlertManagement|Key"
-msgstr ""
+msgstr "Nøkkel"
msgid "AlertManagement|Metrics"
msgstr "MÃ¥ltall"
@@ -2988,7 +3018,7 @@ msgid "AlertManagement|None"
msgstr "Ingen"
msgid "AlertManagement|Open"
-msgstr ""
+msgstr "Ã…pne"
msgid "AlertManagement|Please try again."
msgstr "Vennligst prøv igjen."
@@ -3048,10 +3078,10 @@ msgid "AlertManagement|Triggered"
msgstr "Trigget"
msgid "AlertManagement|Value"
-msgstr ""
+msgstr "Verdi"
msgid "AlertManagement|View incident"
-msgstr ""
+msgstr "Vis hendelsen"
msgid "AlertMappingBuilder|Define fallback"
msgstr ""
@@ -3087,7 +3117,7 @@ msgid "AlertSettings|Configure details"
msgstr ""
msgid "AlertSettings|Current integrations"
-msgstr ""
+msgstr "Nåværende integrasjoner"
msgid "AlertSettings|Customize alert payload mapping (optional)"
msgstr ""
@@ -3102,7 +3132,7 @@ msgid "AlertSettings|Edit payload"
msgstr ""
msgid "AlertSettings|Enable integration"
-msgstr ""
+msgstr "Skru på integrering"
msgid "AlertSettings|Enter an example payload from your selected monitoring tool. This supports sending alerts to a GitLab endpoint."
msgstr ""
@@ -3129,22 +3159,22 @@ msgid "AlertSettings|Integration successfully saved"
msgstr ""
msgid "AlertSettings|Name integration"
-msgstr ""
+msgstr "Navneintegrasjon"
msgid "AlertSettings|Parse payload fields"
msgstr ""
msgid "AlertSettings|Proceed with editing"
-msgstr ""
+msgstr "Fortsett med å redigere"
msgid "AlertSettings|Prometheus"
-msgstr ""
+msgstr "Prometheus"
msgid "AlertSettings|Prometheus API base URL"
msgstr ""
msgid "AlertSettings|Reset Key"
-msgstr ""
+msgstr "Tilbakestill nøkkel"
msgid "AlertSettings|Reset the mapping"
msgstr ""
@@ -3156,7 +3186,7 @@ msgid "AlertSettings|Save & create test alert"
msgstr ""
msgid "AlertSettings|Save integration"
-msgstr ""
+msgstr "Lagre integrasjon"
msgid "AlertSettings|Save integration & send"
msgstr ""
@@ -3165,7 +3195,7 @@ msgid "AlertSettings|Select integration type"
msgstr ""
msgid "AlertSettings|Send test alert"
-msgstr ""
+msgstr "Send testalarm"
msgid "AlertSettings|Send without saving"
msgstr ""
@@ -3219,7 +3249,7 @@ msgid "AlertsIntegrations|If you delete the %{integrationName} integration, aler
msgstr ""
msgid "AlertsIntegrations|Integration Name"
-msgstr ""
+msgstr "Integrasjonsnavn"
msgid "AlertsIntegrations|Integration payload is invalid."
msgstr ""
@@ -3240,10 +3270,10 @@ msgid "AlertsIntegrations|The integration is currently inactive. Enable the inte
msgstr ""
msgid "AlertsIntegrations|The integration is deleted."
-msgstr ""
+msgstr "Integrasjonen er slettet."
msgid "AlertsIntegrations|The integration is saved."
-msgstr ""
+msgstr "Integrasjonen er lagret."
msgid "AlertsIntegrations|The integration token could not be reset. Please try again."
msgstr ""
@@ -3263,6 +3293,9 @@ msgstr "Alle %{replicableType} er planlagt for %{action}"
msgid "All (default)"
msgstr "Alle (standard)"
+msgid "All GitLab"
+msgstr ""
+
msgid "All Members"
msgstr "Alle medlemmer"
@@ -3303,7 +3336,7 @@ msgid "All projects"
msgstr "Alle prosjekter"
msgid "All projects selected"
-msgstr ""
+msgstr "Alle prosjekter valgt"
msgid "All threads resolved"
msgstr "Alle tråder er oppklart"
@@ -3377,6 +3410,9 @@ msgstr ""
msgid "Allow this secondary node to replicate content on Object Storage"
msgstr ""
+msgid "Allow use of licensed EE features"
+msgstr ""
+
msgid "Allow users to dismiss the broadcast message"
msgstr "Tillat brukere å avvise utsendingsmeldingen"
@@ -3393,13 +3429,13 @@ msgid "Allowed Geo IP"
msgstr "Tillatt Geo-IP"
msgid "Allowed characters: +, 0-9, -, and spaces."
-msgstr ""
+msgstr "Tillatte tegn: +, 0-9, -, og mellomrom."
msgid "Allowed email domain restriction only permitted for top-level groups"
msgstr ""
msgid "Allowed to create:"
-msgstr ""
+msgstr "Har tillatelse til å opprette:"
msgid "Allowed to fail"
msgstr "Tillatt å mislykkes"
@@ -3414,10 +3450,10 @@ msgid "Almost there"
msgstr "Nesten der"
msgid "Almost there..."
-msgstr ""
+msgstr "Nesten der …"
msgid "Already blocked"
-msgstr ""
+msgstr "Allerede blokkert"
msgid "Already have login and password?"
msgstr ""
@@ -3452,9 +3488,6 @@ msgstr "Amazon Web Services-logo"
msgid "Amazon authentication is not %{link_start}correctly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr "Amazon-autentisering er ikke %{link_start}riktig konfigurert%{link_end}. Spør GitLab-administratoren din hvis du vil bruke denne tjenesten."
-msgid "Amount of time (in hours) that users are allowed to skip forced configuration of two-factor authentication"
-msgstr "Tidsmengden (i timer) hvor brukere har lov til å hoppe over tvungen konfigurasjon av 2-trinnsautentisering"
-
msgid "An %{link_start}alert%{link_end} with the same fingerprint is already open. To change the status of this alert, resolve the linked alert."
msgstr "En %{link_start}alarm%{link_end} med samme fingeravtrykk er allerede åpent. Hvis du vil endre statusen til dette varselet, må du oppklare den tilknyttede alarmen."
@@ -3515,12 +3548,6 @@ msgstr "En feil oppstod under forhåndsvisning av blobben"
msgid "An error occurred when removing the label."
msgstr ""
-msgid "An error occurred when toggling the notification subscription"
-msgstr "En feil oppstod under veksling av varslingsabonnement"
-
-msgid "An error occurred when updating the issue weight"
-msgstr "En feil oppstod under oppdatering av saksvektleggingen"
-
msgid "An error occurred when updating the title"
msgstr ""
@@ -3569,6 +3596,9 @@ msgstr ""
msgid "An error occurred while enabling Service Desk."
msgstr "En feil oppstod under påskruing av tjenestedesken."
+msgid "An error occurred while fetching Markdown preview"
+msgstr ""
+
msgid "An error occurred while fetching ancestors"
msgstr ""
@@ -3599,9 +3629,6 @@ msgstr "En feil oppstod under innhenting av saker."
msgid "An error occurred while fetching label colors."
msgstr "En feil oppstod under innhenting av stempelfarger."
-msgid "An error occurred while fetching markdown preview"
-msgstr "En feil oppstod under forhåndsvisning av markdown"
-
msgid "An error occurred while fetching participants"
msgstr ""
@@ -3617,9 +3644,6 @@ msgstr "En feill oppstod under innhenting av autofullføring av prosjekter."
msgid "An error occurred while fetching reference"
msgstr ""
-msgid "An error occurred while fetching sidebar data"
-msgstr "En feil oppstod under innhenting av sidelinjedata"
-
msgid "An error occurred while fetching tags. Retry the search."
msgstr "Det oppstod en feil under innhenting av etiketter. Prøv søket på nytt."
@@ -3695,6 +3719,9 @@ msgstr "En feil oppstod under innlasting av saker"
msgid "An error occurred while loading merge requests."
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 Needs tab."
msgstr ""
@@ -3732,7 +3759,7 @@ msgid "An error occurred while loading the merge request."
msgstr "En feil oppstod under innlasting av fletteforespørselsen."
msgid "An error occurred while loading the notification settings. Please try again."
-msgstr ""
+msgstr "En feil oppstod under innlasting av varslingsinnstillingene. Vennligst prøv igjen."
msgid "An error occurred while loading the pipeline."
msgstr ""
@@ -3897,7 +3924,7 @@ msgid "Analyze your source code for known vulnerabilities."
msgstr "Analyser kildekoden din for kjente sårbarheter."
msgid "Analyzing file…"
-msgstr ""
+msgstr "Analyserer filen …"
msgid "Ancestors"
msgstr "Forfedre"
@@ -3921,19 +3948,13 @@ msgid "Any"
msgstr "Enhver"
msgid "Any %{header}"
-msgstr ""
+msgstr "Enhver %{header}"
msgid "Any Author"
msgstr "Enhver skaper"
msgid "Any Milestone"
-msgstr ""
-
-msgid "Any branch"
-msgstr "Enhver gren"
-
-msgid "Any eligible user"
-msgstr "Enhver kvalifisert bruker"
+msgstr "Enhver milepæl"
msgid "Any encrypted tokens"
msgstr "Alle krypterte sjetonger"
@@ -3953,6 +3974,9 @@ msgstr "Enhver milepæl"
msgid "Any namespace"
msgstr "Ethvert navneområde"
+msgid "App Engine description and apps that are suitable for this deployment target"
+msgstr ""
+
msgid "App ID"
msgstr "App-ID"
@@ -4027,7 +4051,7 @@ msgid "ApplicationSettings|Domain denylist"
msgstr ""
msgid "ApplicationSettings|Email restrictions"
-msgstr ""
+msgstr "E-postbegrensninger"
msgid "ApplicationSettings|Email restrictions for sign-ups"
msgstr ""
@@ -4042,7 +4066,7 @@ msgid "ApplicationSettings|Enter denylist manually"
msgstr ""
msgid "ApplicationSettings|Markdown enabled"
-msgstr ""
+msgstr "Markdown er skrudd på"
msgid "ApplicationSettings|Minimum password length (number of characters)"
msgstr ""
@@ -4060,7 +4084,7 @@ msgid "ApplicationSettings|Restricts sign-ups for email addresses that match the
msgstr ""
msgid "ApplicationSettings|Save changes"
-msgstr ""
+msgstr "Lagre endringer"
msgid "ApplicationSettings|See GitLab's %{linkStart}Password Policy Guidelines%{linkEnd}"
msgstr ""
@@ -4075,7 +4099,7 @@ msgid "ApplicationSettings|Upload denylist file"
msgstr ""
msgid "ApplicationSettings|User cap"
-msgstr ""
+msgstr "Brukergrense"
msgid "ApplicationSettings|Users with e-mail addresses that match these domain(s) will NOT be able to sign-up. Wildcards allowed. Use separate lines for multiple entries. Ex: domain.com, *.domain.com"
msgstr ""
@@ -4090,7 +4114,7 @@ msgid "ApplicationSettings|When enabled, any user visiting %{host} will be able
msgstr ""
msgid "ApplicationSettings|domain.com"
-msgstr ""
+msgstr "example.org"
msgid "Applications"
msgstr "Programmer"
@@ -4101,6 +4125,11 @@ msgstr "Benyttet"
msgid "Apply"
msgstr "Bruk"
+msgid "Apply %d suggestion"
+msgid_plural "Apply %d suggestions"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Apply a label"
msgstr "Benytt en etikett"
@@ -4110,13 +4139,10 @@ msgstr "Benytt en mal"
msgid "Apply suggestion"
msgstr "Benytt forslag"
-msgid "Apply suggestions"
-msgstr "Benytt forslag"
-
msgid "Apply template"
msgstr "Benytt mal"
-msgid "Apply this approval rule to any branch or a specific protected branch."
+msgid "Apply this approval rule to all branches or a specific protected branch."
msgstr ""
msgid "Applying"
@@ -4150,7 +4176,7 @@ msgid "Approval rules reset to project defaults"
msgstr "Godkjenningsreglene ble tilbakestilt til prosjektets standardinnstillinger"
msgid "Approval settings"
-msgstr ""
+msgstr "Godkjenningsinnstillinger"
msgid "ApprovalRuleRemove|%d member"
msgid_plural "ApprovalRuleRemove|%d members"
@@ -4173,16 +4199,16 @@ msgstr[0] "%{count} godkjenning kreves fra %{membersCount}"
msgstr[1] "%{count} godkjenninger kreves fra %{membersCount}"
msgid "ApprovalRule|%{firstLabel} +%{numberOfAdditionalLabels} more"
-msgstr ""
+msgstr "%{firstLabel} +%{numberOfAdditionalLabels} til"
msgid "ApprovalRule|Add approvers"
-msgstr ""
+msgstr "Legg til godkjennere"
msgid "ApprovalRule|All scanners"
-msgstr ""
+msgstr "Alle skannere"
msgid "ApprovalRule|All severity levels"
-msgstr ""
+msgstr "Alle alvorlighetsgrader"
msgid "ApprovalRule|Apply this approval rule to consider only the selected security scanners."
msgstr ""
@@ -4191,13 +4217,13 @@ msgid "ApprovalRule|Apply this approval rule to consider only the selected sever
msgstr ""
msgid "ApprovalRule|Approval rules"
-msgstr ""
+msgstr "Godkjenningsregler"
msgid "ApprovalRule|Approvals required"
msgstr ""
msgid "ApprovalRule|Approver Type"
-msgstr ""
+msgstr "Godkjennertype"
msgid "ApprovalRule|Approvers"
msgstr "Godkjennere"
@@ -4227,16 +4253,16 @@ msgid "ApprovalRule|Security scanners"
msgstr ""
msgid "ApprovalRule|Select All"
-msgstr ""
+msgstr "Velg alle"
msgid "ApprovalRule|Select scanners"
-msgstr ""
+msgstr "Velg skannere"
msgid "ApprovalRule|Select severity levels"
msgstr ""
msgid "ApprovalRule|Severity levels"
-msgstr ""
+msgstr "Alvorlighetsgrader"
msgid "ApprovalRule|Target branch"
msgstr "MÃ¥lgren"
@@ -4259,9 +4285,6 @@ msgstr ""
msgid "ApprovalSettings|Prevent editing approval rules in projects and merge requests."
msgstr ""
-msgid "ApprovalSettings|Prevent editing approval rules in projects and merge requests. "
-msgstr ""
-
msgid "ApprovalSettings|Remove all approvals when commits are added to the source branch."
msgstr ""
@@ -4277,6 +4300,9 @@ msgstr ""
msgid "ApprovalSettings|This setting is configured at the instance level and can only be changed by an administrator."
msgstr ""
+msgid "ApprovalSettings|This setting is configured in %{groupName} and can only be changed by an administrator or group owner."
+msgstr ""
+
msgid "ApprovalStatusTooltip|Adheres to separation of duties"
msgstr ""
@@ -4287,7 +4313,7 @@ msgid "ApprovalStatusTooltip|Fails to adhere to separation of duties"
msgstr ""
msgid "Approvals are optional."
-msgstr ""
+msgstr "Godkjenninger er valgfrie."
msgid "Approvals|Section: %section"
msgstr "Seksjon: %seksjon"
@@ -4365,7 +4391,7 @@ msgid "Are you ABSOLUTELY SURE you wish to delete this project?"
msgstr "Er du HELT SIKKER på at du vil slette dette prosjektet?"
msgid "Are you ABSOLUTELY SURE you wish to remove this group?"
-msgstr ""
+msgstr "Er du HELT SIKKER på at du vil fjerne denne gruppen?"
msgid "Are you sure that you want to archive this project?"
msgstr "Er du sikker på at du vil arkivere dette prosjektet?"
@@ -4374,7 +4400,7 @@ msgid "Are you sure that you want to unarchive this project?"
msgstr "Er du sikker på at du vil oppheve arkiveringen av dette prosjektet?"
msgid "Are you sure you want to %{action} %{name}?"
-msgstr ""
+msgstr "Er du sikker på at du vil %{action} %{name}?"
msgid "Are you sure you want to attempt to merge?"
msgstr ""
@@ -4395,7 +4421,7 @@ msgid "Are you sure you want to delete this %{typeOfComment}?"
msgstr "Er du sikker på at du vil slette denne %{typeOfComment}?"
msgid "Are you sure you want to delete this SSH key?"
-msgstr ""
+msgstr "Er du sikker på at du vil slette denne SSH-nøkkelen?"
msgid "Are you sure you want to delete this device? This action cannot be undone."
msgstr "Er du sikker på at du vil slette denne enheten? Denne handlingen kan ikke angres på."
@@ -4420,14 +4446,14 @@ msgstr "Er du sikker på at du vil slette denne byggversjonen?"
msgid "Are you sure you want to import %d repository?"
msgid_plural "Are you sure you want to import %d repositories?"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "Er du sikker på at du vil importere %d kodelager?"
+msgstr[1] "Er du sikker på at du vil importere %d kodelagre?"
msgid "Are you sure you want to lock %{path}?"
msgstr ""
msgid "Are you sure you want to lock this directory?"
-msgstr ""
+msgstr "Er du sikker på at du vil låse denne mappen?"
msgid "Are you sure you want to lose unsaved changes?"
msgstr "Er du sikker på at du vil miste ulagrede endringer?"
@@ -4466,7 +4492,7 @@ msgid "Are you sure you want to remove this identity?"
msgstr "Er du sikker på at du vil fjerne denne identiteten?"
msgid "Are you sure you want to remove this list?"
-msgstr ""
+msgstr "Er du sikker på at du vil fjerne denne listen?"
msgid "Are you sure you want to reset the SCIM token? SCIM provisioning will stop working until the new token is updated."
msgstr ""
@@ -4556,7 +4582,7 @@ msgid "Ascending"
msgstr "Stigende"
msgid "Ask again later"
-msgstr ""
+msgstr "Spør igjen senere"
msgid "Ask someone with write access to resolve it."
msgstr ""
@@ -4577,7 +4603,7 @@ msgid "Assign"
msgstr "Knytt"
msgid "Assign Iteration"
-msgstr ""
+msgstr "Tilordne iterasjon"
msgid "Assign To"
msgstr "Tilordne til"
@@ -4592,10 +4618,10 @@ msgid "Assign milestone"
msgstr "Tilordne milepæl"
msgid "Assign reviewer"
-msgstr ""
+msgstr "Tilordne godkjenner"
msgid "Assign reviewer(s)"
-msgstr ""
+msgstr "Tilordne godkjenner(e)"
msgid "Assign some issues to this milestone."
msgstr "Tildel noen saker til denne milepælen."
@@ -4625,7 +4651,7 @@ msgid "Assigned merge requests"
msgstr ""
msgid "Assigned projects"
-msgstr ""
+msgstr "Tildelte prosjekter"
msgid "Assigned to %{assigneeName}"
msgstr "Tilordnet til %{assigneeName}"
@@ -4634,13 +4660,13 @@ msgid "Assigned to %{assignee_name}"
msgstr "Tilordnet til %{assignee_name}"
msgid "Assigned to %{name}"
-msgstr ""
+msgstr "Tilordnet til %{name}"
msgid "Assigned to me"
msgstr "Tilordnet meg"
msgid "Assigned to you"
-msgstr ""
+msgstr "Tilordnet deg"
msgid "Assignee"
msgid_plural "%d Assignees"
@@ -4740,10 +4766,10 @@ msgid "AuditLogs|Project Events"
msgstr "Prosjekthendelser"
msgid "AuditLogs|Target"
-msgstr ""
+msgstr "MÃ¥l"
msgid "AuditLogs|This month"
-msgstr ""
+msgstr "Denne måneden"
msgid "AuditLogs|User Events"
msgstr "Brukerhendelser"
@@ -4763,9 +4789,6 @@ msgstr "Autentiser med GitHub"
msgid "Authenticated API rate limit period in seconds"
msgstr ""
-msgid "Authenticated API request rate limit"
-msgstr ""
-
msgid "Authenticated API requests"
msgstr ""
@@ -4775,10 +4798,10 @@ msgstr ""
msgid "Authenticated Git LFS request rate limit"
msgstr ""
-msgid "Authenticated web rate limit period in seconds"
+msgid "Authenticated Git LFS requests"
msgstr ""
-msgid "Authenticated web request rate limit"
+msgid "Authenticated web rate limit period in seconds"
msgstr ""
msgid "Authenticated web requests"
@@ -4788,7 +4811,7 @@ msgid "Authenticating"
msgstr "Autentiserer"
msgid "Authentication"
-msgstr ""
+msgstr "Autentisering"
msgid "Authentication Failure"
msgstr "Autentiseringsfeil"
@@ -4884,7 +4907,7 @@ msgid "AutoDevOps|Auto DevOps"
msgstr "Auto DevOps"
msgid "AutoDevOps|Auto DevOps documentation"
-msgstr "Auto DevOps dokumentasjon"
+msgstr "'Auto DevOps'-dokumentasjonen"
msgid "AutoDevOps|Dismiss Auto DevOps box"
msgstr "Avvis Auto DevOps-boksen"
@@ -4905,13 +4928,13 @@ msgid "AutoDevopsAlert|Security testing tools enabled with %{linkStart}Auto DevO
msgstr ""
msgid "AutoRemediation| 1 Merge Request"
-msgstr ""
+msgstr "1 fletteforespørsel"
msgid "AutoRemediation|%{mrsCount} ready for review"
msgstr ""
msgid "AutoRemediation|Auto-fix"
-msgstr ""
+msgstr "Autofiks"
msgid "AutoRemediation|Auto-fix solutions"
msgstr ""
@@ -4965,13 +4988,13 @@ msgid "Automatically update this project's branches and tags from the upstream r
msgstr "Oppdater automatisk dette prosjektets grener og etiketter fra oppstrømskodelageret hver time."
msgid "Autosave|Note"
-msgstr ""
+msgstr "Notis"
msgid "Available"
msgstr "Tilgjengelig"
msgid "Available ID"
-msgstr ""
+msgstr "Tilgjengelig ID"
msgid "Available group runners: %{runners}"
msgstr ""
@@ -5004,10 +5027,10 @@ msgid "Award removed"
msgstr ""
msgid "AwardEmoji|No emojis found."
-msgstr ""
+msgstr "Ingen emojier ble funnet."
msgid "Back"
-msgstr ""
+msgstr "Tilbake"
msgid "Back to page %{number}"
msgstr "Tilbake til side %{number}"
@@ -5049,10 +5072,10 @@ msgid "Badges|Deleting the badge failed, please try again."
msgstr "Sletting av merket mislyktes, vennligst prøv igjen."
msgid "Badges|Enter a valid URL"
-msgstr ""
+msgstr "Skriv inn en gyldig URL"
msgid "Badges|Example: %{exampleUrl}"
-msgstr ""
+msgstr "Eksempel: %{exampleUrl}"
msgid "Badges|Group Badge"
msgstr "Grupper merker"
@@ -5064,7 +5087,7 @@ msgid "Badges|Name"
msgstr "Navn"
msgid "Badges|New badge added."
-msgstr ""
+msgstr "Et nytt merke ble lagt til."
msgid "Badges|No badge image"
msgstr "Ingen merkebilde"
@@ -5109,7 +5132,7 @@ msgid "BambooService|Atlassian Bamboo"
msgstr ""
msgid "BambooService|Bamboo URL"
-msgstr ""
+msgstr "Bamboo-URL"
msgid "BambooService|Bamboo build plan key."
msgstr ""
@@ -5127,7 +5150,7 @@ msgid "BambooService|The user with API access to the Bamboo server."
msgstr ""
msgid "Based on"
-msgstr ""
+msgstr "Basert på"
msgid "Be careful. Changing the project's namespace can have unintended side effects."
msgstr ""
@@ -5156,14 +5179,11 @@ msgstr ""
msgid "Below you will find all the groups that are public."
msgstr "Nedenfor vil du finne alle de gruppene som er offentlige."
-msgid "Beta"
-msgstr ""
-
msgid "Bi-weekly code coverage"
msgstr ""
msgid "Billable Users"
-msgstr ""
+msgstr "Fakturerbare brukere"
msgid "Billing"
msgstr "Fakturering"
@@ -5172,7 +5192,7 @@ msgid "BillingPlans|%{group_name} is currently using the %{plan_name}."
msgstr ""
msgid "BillingPlans|@%{user_name} you are currently using the %{plan_name}."
-msgstr ""
+msgstr "%{user_name}, du bruker for øyeblikket %{plan_name}-planen."
msgid "BillingPlans|Compare all plans"
msgstr ""
@@ -5184,7 +5204,7 @@ msgid "BillingPlans|End of availability for the Bronze Plan"
msgstr ""
msgid "BillingPlans|Free upgrade!"
-msgstr ""
+msgstr "Gratis oppgradering!"
msgid "BillingPlans|If you would like to downgrade your plan please contact %{support_link_start}Customer Support%{support_link_end}."
msgstr "Hvis du ønsker å nedgradere planen din, kan du kontakte %{support_link_start}Kundestøtte%{support_link_end}."
@@ -5196,7 +5216,7 @@ msgid "BillingPlans|Learn more about each plan by visiting our %{pricing_page_li
msgstr ""
msgid "BillingPlans|Looking to purchase or manage a subscription for your group? Navigate to your %{groups_link} and go to %{strong_open}Settings &gt; Billing.%{strong_close}"
-msgstr ""
+msgstr "Er du ute etter å kjøpe eller behandle et abonnement til gruppen din? Gå til %{groups_link} din og gå til %{strong_open}Innstillinger → Fakturering.%{strong_close}"
msgid "BillingPlans|Manage plan"
msgstr "Behandle planen"
@@ -5214,10 +5234,10 @@ msgid "BillingPlans|To manage the plan for this group, visit the billing section
msgstr "For å behandle planen til denne gruppen, besøk faktureringsseksjonen til %{parent_billing_page_link}."
msgid "BillingPlans|Upgrade to GitLab %{planNameForUpgrade}"
-msgstr ""
+msgstr "Oppgrader til GitLab %{planNameForUpgrade}"
msgid "BillingPlans|While GitLab is ending availability of the Bronze plan, you can still renew your Bronze subscription one additional time before %{eoa_bronze_plan_end_date}. We are also offering a limited time free upgrade to our Premium Plan (up to 25 users)! Learn more about the changes and offers in our %{announcement_link}."
-msgstr ""
+msgstr "Mens GitLab avslutter tilgjengeligheten til BronSe-planen, kan du fortsatt fornye Bronse-abonnementet én siste gang før %{eoa_bronze_plan_end_date}. Vi tilbyr også en gratis oppgradering til Premium-abonnementet vårt i en kort tidsperiode (opptil 25 brukere)! Lær mer om endringene og tilbudene i vår %{announcement_link}."
msgid "BillingPlans|Your GitLab.com %{plan} trial will %{strong_open}expire after %{expiration_date}%{strong_close}. You can retain access to the %{plan} features by upgrading below."
msgstr "Din GitLab.com-%{plan}prøveperiode vil %{strong_open}utløpe etter %{expiration_date}%{strong_close}. Du kan beholde tilgangen til %{plan}-funksjonene ved å oppgradere nedenfor."
@@ -5235,7 +5255,7 @@ msgid "BillingPlans|frequently asked questions"
msgstr "ofte stilte spørsmål"
msgid "BillingPlans|group"
-msgstr ""
+msgstr "gruppe"
msgid "BillingPlans|monthly"
msgstr "månedlig"
@@ -5250,10 +5270,10 @@ msgid "BillingPlan|Upgrade"
msgstr "Oppgrader"
msgid "BillingPlan|Upgrade for free"
-msgstr ""
+msgstr "Oppgrader gratis"
msgid "Billings|%{planName} plan"
-msgstr ""
+msgstr "%{planName}-plan"
msgid "Billings|An error occurred while extending your trial."
msgstr ""
@@ -5268,7 +5288,7 @@ msgid "Billings|By reactivating your trial, you will receive an additional 30 da
msgstr ""
msgid "Billings|Extend trial"
-msgstr ""
+msgstr "Forleng prøveperioden"
msgid "Billings|Reactivate trial"
msgstr ""
@@ -5283,13 +5303,13 @@ msgid "Billings|To use free pipeline minutes on shared runners, you’ll need to
msgstr ""
msgid "Billings|User successfully validated"
-msgstr ""
+msgstr "Brukeren ble vellykket validert"
msgid "Billings|User validation required"
msgstr ""
msgid "Billings|Validate account"
-msgstr ""
+msgstr "Valider konto"
msgid "Billings|Validate user account"
msgstr ""
@@ -5310,31 +5330,31 @@ msgid "Billing|An error occurred while removing a billable member"
msgstr ""
msgid "Billing|Cannot remove user"
-msgstr ""
+msgstr "Kan ikke fjerne brukeren"
msgid "Billing|Direct memberships"
-msgstr ""
+msgstr "Direkte medlemskap"
msgid "Billing|Enter at least three characters to search."
-msgstr ""
+msgstr "Skriv inn minst tre tegn for å søke."
msgid "Billing|Export list"
-msgstr ""
+msgstr "Eksporter liste"
msgid "Billing|Group"
-msgstr ""
+msgstr "Gruppe"
msgid "Billing|Group invite"
-msgstr ""
+msgstr "Gruppeinvitasjon"
msgid "Billing|Members who were invited via a group invitation cannot be removed. You can either remove the entire group, or ask an Owner of the invited group to remove the member."
msgstr ""
msgid "Billing|No users to display."
-msgstr ""
+msgstr "Ingen brukere å vise."
msgid "Billing|Private"
-msgstr ""
+msgstr "Privat"
msgid "Billing|Project invite"
msgstr ""
@@ -5370,7 +5390,7 @@ msgid "Blame"
msgstr "Ã…rsaksliste"
msgid "Block user"
-msgstr ""
+msgstr "Blokker bruker"
msgid "Blocked"
msgstr "Blokkert"
@@ -5384,10 +5404,10 @@ msgid "Blocked issue"
msgstr "Blokkert sak"
msgid "Blocking"
-msgstr ""
+msgstr "Blokkering"
msgid "Blocking issues"
-msgstr ""
+msgstr "Hindrende saker"
msgid "Blocks"
msgstr "Blokk"
@@ -5396,20 +5416,35 @@ msgid "Blog"
msgstr "Blogg"
msgid "Board scope affects which issues are displayed for anyone who visits this board"
+msgstr "Bord-omfang påvirker hvilke saker som vises for alle som besøker dette bordet"
+
+msgid "BoardNewEpic|Groups"
msgstr ""
-msgid "BoardNewIssue|No matching results"
+msgid "BoardNewEpic|Loading groups"
msgstr ""
-msgid "BoardNewIssue|Projects"
+msgid "BoardNewEpic|No matching results"
msgstr ""
-msgid "BoardNewIssue|Search projects"
+msgid "BoardNewEpic|Search groups"
msgstr ""
-msgid "BoardNewIssue|Select a project"
+msgid "BoardNewEpic|Select a group"
msgstr ""
+msgid "BoardNewIssue|No matching results"
+msgstr "Ingen samsvarende resultater"
+
+msgid "BoardNewIssue|Projects"
+msgstr "Prosjekter"
+
+msgid "BoardNewIssue|Search projects"
+msgstr "Søk blant prosjekter"
+
+msgid "BoardNewIssue|Select a project"
+msgstr "Velg et prosjekt"
+
msgid "BoardScope|An error occurred while getting milestones, please try again."
msgstr ""
@@ -5417,43 +5452,43 @@ msgid "BoardScope|An error occurred while searching for users, please try again.
msgstr ""
msgid "BoardScope|Any Milestone"
-msgstr ""
+msgstr "Enhver milepæl"
msgid "BoardScope|Any assignee"
msgstr ""
msgid "BoardScope|Assignee"
-msgstr ""
+msgstr "Tilordnet"
msgid "BoardScope|Edit"
-msgstr ""
+msgstr "Rediger"
msgid "BoardScope|Milestone"
-msgstr ""
+msgstr "Milepæl"
msgid "BoardScope|No milestone"
-msgstr ""
+msgstr "Ingen milepæl"
msgid "BoardScope|Search milestones"
-msgstr ""
+msgstr "Søk i milepæler"
msgid "BoardScope|Select assignee"
-msgstr ""
+msgstr "Velg en tilordnet"
msgid "BoardScope|Select milestone"
-msgstr ""
+msgstr "Velg milepæl"
msgid "BoardScope|Select weight"
msgstr ""
msgid "BoardScope|Started"
-msgstr ""
+msgstr "Startet"
msgid "BoardScope|Upcoming"
-msgstr ""
+msgstr "Kommende"
msgid "BoardScope|Weight"
-msgstr ""
+msgstr "Vektlegging"
msgid "Boards"
msgstr "Bord"
@@ -5475,6 +5510,9 @@ msgstr ""
msgid "Boards|An error occurred while creating the list. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching child groups. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching group projects. Please try again."
msgstr ""
@@ -5520,7 +5558,7 @@ msgid "Boards|Collapse"
msgstr "Klapp sammen"
msgid "Boards|Edit board"
-msgstr ""
+msgstr "Rediger bord"
msgid "Boards|Expand"
msgstr "Utvid"
@@ -5529,7 +5567,7 @@ msgid "Boards|Failed to fetch blocking %{issuableType}s"
msgstr ""
msgid "Boards|New epic"
-msgstr ""
+msgstr "Nytt epos"
msgid "Boards|Retrieving blocking %{issuableType}s"
msgstr ""
@@ -5544,19 +5582,19 @@ msgid "Board|Are you sure you want to delete this board?"
msgstr ""
msgid "Board|Board scope"
-msgstr ""
+msgstr "Bord-omfang"
msgid "Board|Create board"
-msgstr ""
+msgstr "Opprett bord"
msgid "Board|Create new board"
msgstr ""
msgid "Board|Delete board"
-msgstr ""
+msgstr "Slett bord"
msgid "Board|Edit board"
-msgstr ""
+msgstr "Rediger bord"
msgid "Board|Enter board name"
msgstr ""
@@ -5568,13 +5606,13 @@ msgid "Board|Load more epics"
msgstr ""
msgid "Board|Load more issues"
-msgstr ""
+msgstr "Last inn flere saker"
msgid "Board|Loading epics"
-msgstr ""
+msgstr "Laster inn eposer"
msgid "Bold text"
-msgstr ""
+msgstr "Fet tekst"
msgid "Both project and dashboard_path are required"
msgstr ""
@@ -5589,10 +5627,10 @@ msgid "Branch %{branch_name} was created. To set up auto deploy, choose a GitLab
msgstr "%{branch_name}-grenen ble opprettet. For å konfigurere automatisk distribusjon, velg en GitLab CI Yaml-mal og foreta endringene dine. %{link_to_autodeploy_doc}"
msgid "Branch already exists"
-msgstr ""
+msgstr "Grenen finnes allerede"
msgid "Branch changed"
-msgstr ""
+msgstr "Grenen ble endret"
msgid "Branch is already taken"
msgstr "Grenen er allerede i bruk"
@@ -5679,7 +5717,7 @@ msgid "Branches|Overview"
msgstr "Oversikt"
msgid "Branches|Please type the following to confirm:"
-msgstr ""
+msgstr "Vennligst skriv inn det følgende for å bekrefte:"
msgid "Branches|Protected branches can be managed in %{project_settings_link}."
msgstr "Beskyttede grener kan behandles i %{project_settings_link}."
@@ -5730,7 +5768,7 @@ msgid "Branches|To discard the local changes and overwrite the branch with the u
msgstr ""
msgid "Branches|Yes, delete branch"
-msgstr ""
+msgstr "Ja, slett grenen"
msgid "Branches|Yes, delete protected branch"
msgstr ""
@@ -5790,7 +5828,7 @@ msgid "Browse files"
msgstr "Bla gjennom filer"
msgid "Browse templates"
-msgstr ""
+msgstr "Bla gjennom maler"
msgid "BuildArtifacts|An error occurred while fetching the artifacts"
msgstr ""
@@ -5807,20 +5845,26 @@ msgstr ""
msgid "Bulk update"
msgstr ""
-msgid "BulkImport|Existing groups"
+msgid "BulkImports|Re-import creates a new group. It does not sync with the existing group."
msgstr ""
+msgid "BulkImport|Existing groups"
+msgstr "Eksisterende grupper"
+
msgid "BulkImport|Filter by source group"
msgstr ""
msgid "BulkImport|From source group"
+msgstr "Fra kildegruppe"
+
+msgid "BulkImport|Group import history"
msgstr ""
msgid "BulkImport|Import failed: Destination cannot be a subgroup of the source group. Change the destination and try again."
msgstr ""
msgid "BulkImport|Import groups from GitLab"
-msgstr ""
+msgstr "Importer grupper fra GitLab"
msgid "BulkImport|Import selected"
msgstr ""
@@ -5828,7 +5872,16 @@ msgstr ""
msgid "BulkImport|Importing the group failed"
msgstr ""
+msgid "BulkImport|Last imported to %{link}"
+msgstr ""
+
msgid "BulkImport|Name already exists."
+msgstr "Navnet finnes allerede."
+
+msgid "BulkImport|New group"
+msgstr ""
+
+msgid "BulkImport|No history is available"
msgstr ""
msgid "BulkImport|No parent"
@@ -5843,15 +5896,21 @@ msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} matching filter \"%{filter}\" from %{link}"
msgstr ""
-msgid "BulkImport|To new group"
+msgid "BulkImport|Source group"
msgstr ""
+msgid "BulkImport|To new group"
+msgstr "Til ny gruppe"
+
msgid "BulkImport|Update of import statuses with realtime changes failed"
msgstr ""
msgid "BulkImport|You have no groups to import"
msgstr ""
+msgid "BulkImport|Your imported groups will appear here."
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -5859,7 +5918,7 @@ msgid "BulkImport|expected an associated Project but has an associated Group"
msgstr ""
msgid "BulkImport|must be a group"
-msgstr ""
+msgstr "må være en gruppe"
msgid "Burndown chart"
msgstr ""
@@ -5868,7 +5927,7 @@ msgid "BurndownChartLabel|Open issue weight"
msgstr ""
msgid "BurndownChartLabel|Open issues"
-msgstr ""
+msgstr "Ã…pne saker"
msgid "Burnup chart"
msgstr ""
@@ -5883,13 +5942,13 @@ msgid "Business metrics (Custom)"
msgstr ""
msgid "Busy"
-msgstr ""
+msgstr "Opptatt"
msgid "Buy CI Minutes"
-msgstr ""
+msgstr "Kjøp CI-minutter"
msgid "Buy Storage"
-msgstr ""
+msgstr "Kjøp lagring"
msgid "Buy more Pipeline minutes"
msgstr ""
@@ -5916,7 +5975,7 @@ msgid "CI configuration validated, including all configuration added with the %{
msgstr ""
msgid "CI minutes"
-msgstr ""
+msgstr "CI-minutter"
msgid "CI settings"
msgstr "CI-innstillinger"
@@ -5931,10 +5990,10 @@ msgid "CI/CD"
msgstr "CI/CD"
msgid "CI/CD Analytics"
-msgstr ""
+msgstr "CI/CD-analystikk"
msgid "CI/CD Settings"
-msgstr ""
+msgstr "CI/CD-innstillinger"
msgid "CI/CD configuration"
msgstr "CI/CD-konfigurasjon"
@@ -5949,7 +6008,7 @@ msgid "CICDAnalytics|%{percent}%{percentSymbol}"
msgstr ""
msgid "CICDAnalytics|All time"
-msgstr ""
+msgstr "For evig"
msgid "CICDAnalytics|Deployment frequency"
msgstr ""
@@ -5962,14 +6021,14 @@ msgstr ""
msgid "CICDAnalytics|Release"
msgid_plural "CICDAnalytics|Releases"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "Slipp"
+msgstr[1] "Utgivelser"
msgid "CICDAnalytics|Release statistics"
msgstr ""
msgid "CICDAnalytics|Releases"
-msgstr ""
+msgstr "Utgivelser"
msgid "CICDAnalytics|Something went wrong while fetching release statistics"
msgstr ""
@@ -6059,7 +6118,7 @@ msgid "CVE|Enable CVE ID requests in the issue sidebar"
msgstr ""
msgid "CVE|Request CVE ID"
-msgstr ""
+msgstr "Be om CVE-ID"
msgid "CVE|Why Request a CVE ID?"
msgstr ""
@@ -6094,9 +6153,12 @@ msgstr ""
msgid "Can be manually deployed to"
msgstr "Kan distribueres manuelt til"
-msgid "Can create groups:"
+msgid "Can be overridden in each project."
msgstr ""
+msgid "Can create groups:"
+msgstr "Kan opprette grupper:"
+
msgid "Can't apply as the source branch was deleted."
msgstr "Kan ikke benytte det, siden kildegrenen ble slettet."
@@ -6110,7 +6172,7 @@ msgid "Can't apply this suggestion."
msgstr "Kan ikke benytte dette forslaget."
msgid "Can't be empty"
-msgstr ""
+msgstr "Kan ikke være tom"
msgid "Can't create snippet: %{err}"
msgstr "Kan ikke opprette utdrag: %{err}"
@@ -6149,10 +6211,10 @@ msgid "CanaryIngress|%{boldStart}Stable:%{boldEnd} %{stable}"
msgstr ""
msgid "CanaryIngress|Canary"
-msgstr ""
+msgstr "Canary"
msgid "CanaryIngress|Change ratio"
-msgstr ""
+msgstr "Endre forhold"
msgid "CanaryIngress|Change the ratio of canary deployments?"
msgstr ""
@@ -6161,7 +6223,7 @@ msgid "CanaryIngress|Doing so will set a deployment change in progress. This tem
msgstr ""
msgid "CanaryIngress|Stable"
-msgstr ""
+msgstr "Stabil"
msgid "CanaryIngress|You are changing the ratio of the canary rollout for %{environment} compared to the stable deployment to:"
msgstr ""
@@ -6170,7 +6232,7 @@ msgid "Cancel"
msgstr "Avbryt"
msgid "Cancel and close"
-msgstr ""
+msgstr "Avbryt og lukk"
msgid "Cancel index deletion"
msgstr "Avbryt indekssletting"
@@ -6191,11 +6253,14 @@ msgid "Canceled deployment to"
msgstr ""
msgid "Cancelled"
-msgstr ""
+msgstr "Avbrutt"
msgid "Cancelling Preview"
msgstr "Avbryter forhåndsvisningen"
+msgid "Cannot assign a confidential epic to a non-confidential issue. Make the issue confidential and try again"
+msgstr ""
+
msgid "Cannot be assigned to other projects."
msgstr ""
@@ -6247,9 +6312,6 @@ msgstr "Kan ikke forfremme saken på grunn av manglende tillatelser."
msgid "Cannot refer to a group %{timebox_type} by an internal id!"
msgstr ""
-msgid "Cannot set confidential epic for a non-confidential issue"
-msgstr ""
-
msgid "Cannot show preview. For previews on sketch files, they must have the file format introduced by Sketch version 43 and above."
msgstr ""
@@ -6311,7 +6373,7 @@ msgid "Change label"
msgstr "Endre stempel"
msgid "Change made by"
-msgstr ""
+msgstr "Endring utført av"
msgid "Change milestone"
msgstr "Endre milepæl"
@@ -6323,10 +6385,10 @@ msgid "Change reviewer(s)"
msgstr ""
msgid "Change reviewer(s)."
-msgstr ""
+msgstr "Endre anmelder(e)."
msgid "Change role"
-msgstr ""
+msgstr "Endre rolle"
msgid "Change status"
msgstr "Endre status"
@@ -6353,10 +6415,10 @@ msgid "ChangeReviewer|Reviewer changed to %{new}"
msgstr ""
msgid "ChangeReviewer|Unassigned"
-msgstr ""
+msgstr "Ikke tildelte"
msgid "ChangeTypeAction|A new branch will be created in your fork and a new merge request will be started."
-msgstr ""
+msgstr "En ny gren vil bli opprettet i din utgreining, og en ny fletteforespørsel vil bli påbegynt."
msgid "ChangeTypeAction|Cherry-pick"
msgstr ""
@@ -6374,19 +6436,19 @@ msgid "ChangeTypeAction|Revert in branch"
msgstr ""
msgid "ChangeTypeAction|Search branches"
-msgstr ""
+msgstr "Søk i grener"
msgid "ChangeTypeAction|Search projects"
-msgstr ""
+msgstr "Søk etter prosjekter"
msgid "ChangeTypeAction|Start a %{newMergeRequest} with these changes"
msgstr ""
msgid "ChangeTypeAction|Switch branch"
-msgstr ""
+msgstr "Bytt gren"
msgid "ChangeTypeAction|Switch project"
-msgstr ""
+msgstr "Bytt prosjekt"
msgid "ChangeTypeAction|This will create a new commit in order to revert the existing changes."
msgstr "Dette vil opprette en ny commit for å kunne tilbakestille de eksisterende endringene."
@@ -6398,7 +6460,7 @@ msgid "Changed assignee(s)."
msgstr "Endret tilordnet person(er)."
msgid "Changed reviewer(s)."
-msgstr ""
+msgstr "Endret anmelder(e)."
msgid "Changed the title to \"%{title_param}\"."
msgstr "Endret tittelen til «%{title_param}»."
@@ -6413,7 +6475,7 @@ msgid "Changes are still tracked. Useful for cluster/index migrations."
msgstr ""
msgid "Changes saved."
-msgstr ""
+msgstr "Endringene er lagret."
msgid "Changes suppressed. Click to show."
msgstr "Endringer er klappet sammen. Klikk for å vise."
@@ -6443,7 +6505,7 @@ msgid "ChatMessage|Commit"
msgstr "Commit"
msgid "ChatMessage|Failed job"
-msgstr ""
+msgstr "Mislykket jobb"
msgid "ChatMessage|Failed stage"
msgstr ""
@@ -6487,15 +6549,15 @@ msgstr ""
msgid "Check out, review, and merge locally"
msgstr ""
-msgid "Check the %{docs_link_start}documentation%{docs_link_end}."
-msgstr "Sjekk %{docs_link_start}dokumentasjonen%{docs_link_end}."
-
msgid "Check the current instance configuration "
msgstr ""
msgid "Check the elasticsearch.log file to debug why the migration was halted and make any changes before retrying the migration. When you fix the cause of the failure, click \"Retry migration\", and the migration will be scheduled to be retried in the background."
msgstr ""
+msgid "Check with your administrator."
+msgstr ""
+
msgid "Check your Docker images for known vulnerabilities."
msgstr ""
@@ -6526,6 +6588,9 @@ msgstr "Sjekker brukernavnets tilgjengelighet …"
msgid "Checkout"
msgstr "Kasse"
+msgid "Checkout|$%{selectedPlanPrice} per 10 GB storage per pack"
+msgstr ""
+
msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 minutes"
msgstr ""
@@ -6546,19 +6611,25 @@ msgstr ""
msgid "Checkout|%{name}'s GitLab subscription"
msgstr "%{name} sitt GitLab-abonnement"
+msgid "Checkout|%{name}'s storage subscription"
+msgstr ""
+
+msgid "Checkout|%{quantity} GB of storage"
+msgstr ""
+
+msgid "Checkout|%{quantity} storage pack"
+msgid_plural "Checkout|%{quantity} storage packs"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Checkout|%{selectedPlanText} plan"
msgstr "%{selectedPlanText}-plan"
msgid "Checkout|%{startDate} - %{endDate}"
msgstr "%{startDate} - %{endDate}"
-msgid "Checkout|%{totalCiMinutes} CI minute"
-msgid_plural "Checkout|%{totalCiMinutes} CI minutes"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "Checkout|%{totalCiMinutes} CI minutes"
-msgstr ""
+msgstr "%{totalCiMinutes} CI-minutter"
msgid "Checkout|(may be %{linkStart}charged upon purchase%{linkEnd})"
msgstr ""
@@ -6567,19 +6638,19 @@ msgid "Checkout|(x%{numberOfUsers})"
msgstr "(x%{numberOfUsers})"
msgid "Checkout|(x%{quantity})"
-msgstr ""
+msgstr "(x%{quantity})"
msgid "Checkout|Billing address"
msgstr "Faktureringsadresse"
msgid "Checkout|CI minute pack"
-msgstr ""
+msgstr "CI-minuttpakke"
msgid "Checkout|CI minute packs are only used after you've used your subscription's monthly quota. The additional minutes will roll over month to month and are valid for one year."
msgstr ""
msgid "Checkout|Checkout"
-msgstr ""
+msgstr "Kasse"
msgid "Checkout|City"
msgstr "By"
@@ -6632,6 +6703,9 @@ msgstr ""
msgid "Checkout|Failed to register credit card. Please try again."
msgstr ""
+msgid "Checkout|GB"
+msgstr ""
+
msgid "Checkout|GitLab group"
msgstr "GitLab-gruppe"
@@ -6660,7 +6734,7 @@ msgid "Checkout|Please select a state"
msgstr "Vennligst velg en delstat"
msgid "Checkout|Purchase details"
-msgstr ""
+msgstr "Kjøpsdetaljer"
msgid "Checkout|Select"
msgstr "Velg"
@@ -6668,6 +6742,9 @@ msgstr "Velg"
msgid "Checkout|State"
msgstr "Delstat"
+msgid "Checkout|Storage packs"
+msgstr ""
+
msgid "Checkout|Street address"
msgstr "Gateadresse"
@@ -6687,6 +6764,9 @@ msgid "Checkout|Total"
msgstr "Totalt"
msgid "Checkout|Total minutes: %{quantity}"
+msgstr "Totalt antall minutter: %{quantity}"
+
+msgid "Checkout|Total storage: %{quantity} GB"
msgstr ""
msgid "Checkout|Users"
@@ -6698,16 +6778,25 @@ msgstr ""
msgid "Checkout|Your organization"
msgstr "Organisasjonen din"
+msgid "Checkout|Your storage subscription has the same term as your main subscription, and the price is prorated accordingly."
+msgstr ""
+
msgid "Checkout|Your subscription will be applied to this group"
msgstr ""
msgid "Checkout|Zip code"
msgstr "Postnummer"
+msgid "Checkout|a storage subscription"
+msgstr ""
+
msgid "Checkout|company or team"
msgstr "firma eller team"
-msgid "Checkout|x 1,000 minutes per pack = %{strong}"
+msgid "Checkout|minutes"
+msgstr ""
+
+msgid "Checkout|x %{quantity} %{units} per pack ="
msgstr ""
msgid "Cherry-pick this commit"
@@ -6729,7 +6818,7 @@ msgid "Chinese language support using"
msgstr ""
msgid "Choose File..."
-msgstr ""
+msgstr "Velg fil …"
msgid "Choose a branch/tag (e.g. %{branch}) or enter a commit (e.g. %{sha}) to see what's changed or to create a merge request."
msgstr ""
@@ -6750,7 +6839,7 @@ msgid "Choose a type..."
msgstr "Velg en type …"
msgid "Choose any color"
-msgstr ""
+msgstr "Velg enhver farge"
msgid "Choose any color."
msgstr "Velg hvilken som helst farge."
@@ -6789,7 +6878,7 @@ msgid "Choose your framework"
msgstr "Velg ditt rammeverk"
msgid "CiCdAnalytics|Date range: %{range}"
-msgstr ""
+msgstr "Datoperiode: %{range}"
msgid "CiStatusLabel|canceled"
msgstr "avbrutt"
@@ -6822,7 +6911,7 @@ msgid "CiStatusLabel|skipped"
msgstr "hoppet over"
msgid "CiStatusLabel|waiting for delayed job"
-msgstr ""
+msgstr "venter på utsatt jobb"
msgid "CiStatusLabel|waiting for manual action"
msgstr "venter på manuell handling"
@@ -6888,7 +6977,7 @@ msgid "CiVariables|Protected"
msgstr "Beskyttet"
msgid "CiVariables|Remove variable"
-msgstr ""
+msgstr "Fjern variabel"
msgid "CiVariables|Remove variable row"
msgstr "Fjern variabel-rad"
@@ -7002,13 +7091,13 @@ msgid "Click %{link_start}here%{link_end} to view the request."
msgstr ""
msgid "Click %{link_to} to view the request."
-msgstr ""
+msgstr "Klikk %{link_to} for å vise forespørselen."
msgid "Click the link below to confirm your email address (%{email})"
msgstr ""
msgid "Click the link below to confirm your email address."
-msgstr ""
+msgstr "Klikk på lenken nedenfor for å bekrefte E-postadressen din."
msgid "Click to expand it."
msgstr "Klikk for å utvide den."
@@ -7017,10 +7106,10 @@ msgid "Click to expand text"
msgstr "Klikk for å utvide tekst"
msgid "Click to hide"
-msgstr ""
+msgstr "Klikk for å skjule"
msgid "Click to reveal"
-msgstr ""
+msgstr "Klikk for å vise"
msgid "Client authentication certificate"
msgstr "Klientautentiseringssertifikat"
@@ -7044,7 +7133,7 @@ msgid "Clone repository"
msgstr "Klon lageret"
msgid "Clone this issue"
-msgstr ""
+msgstr "Klon denne saken"
msgid "Clone with %{http_label}"
msgstr "Klon med %{http_label}"
@@ -7064,9 +7153,12 @@ msgstr ""
msgid "CloneIssue|Cannot clone issue to target project as it is pending deletion."
msgstr ""
-msgid "Cloned this issue to %{path_to_project}."
+msgid "CloneIssue|Cannot clone issues of '%{issue_type}' type."
msgstr ""
+msgid "Cloned this issue to %{path_to_project}."
+msgstr "Klonet denne saken til %{path_to_project}."
+
msgid "Clones this issue, without comments, to %{project}."
msgstr ""
@@ -7074,7 +7166,7 @@ msgid "Close"
msgstr "Lukk"
msgid "Close %{issueType}"
-msgstr ""
+msgstr "Lukk %{issueType}"
msgid "Close %{tabname}"
msgstr "Lukk %{tabname}"
@@ -7113,12 +7205,15 @@ msgid "Closed this %{quick_action_target}."
msgstr "Lukket denne %{quick_action_target}."
msgid "Closed: %{closed}"
-msgstr ""
+msgstr "Lukket: %{closed}"
msgid "Closes this %{quick_action_target}."
msgstr "Lukker denne %{quick_action_target}."
-msgid "Cloud licenses can not be removed."
+msgid "Cloud Functions description and apps that are suitable for this deployment target"
+msgstr ""
+
+msgid "Cloud Run description and apps that are suitable for this deployment target"
msgstr ""
msgid "Cluster"
@@ -7143,6 +7238,12 @@ msgid "Cluster type must be specificed for Stages::ClusterEndpointInserter"
msgstr ""
msgid "ClusterAgents|Access tokens"
+msgstr "Tilgangssjetonger"
+
+msgid "ClusterAgents|Agent might not be connected to GitLab"
+msgstr ""
+
+msgid "ClusterAgents|Agent never connected to GitLab"
msgstr ""
msgid "ClusterAgents|Alternative installation methods"
@@ -7155,32 +7256,41 @@ msgid "ClusterAgents|An error occurred while loading your agent"
msgstr ""
msgid "ClusterAgents|An unknown error occurred. Please try again."
-msgstr ""
+msgstr "En ukjent feil oppstod. Vennligst prøv igjen."
msgid "ClusterAgents|Configuration"
+msgstr "Oppsett"
+
+msgid "ClusterAgents|Connected"
msgstr ""
-msgid "ClusterAgents|Copy token"
+msgid "ClusterAgents|Connection status"
msgstr ""
+msgid "ClusterAgents|Copy token"
+msgstr "Kopier sjetong"
+
msgid "ClusterAgents|Created by"
-msgstr ""
+msgstr "Opprettet av"
msgid "ClusterAgents|Created by %{name} %{time}"
-msgstr ""
+msgstr "Opprettet av %{name} den %{time}"
msgid "ClusterAgents|Date created"
-msgstr ""
+msgstr "Dato opprettet"
msgid "ClusterAgents|Description"
-msgstr ""
+msgstr "Beskrivelse"
msgid "ClusterAgents|For alternative installation methods %{linkStart}go to the documentation%{linkEnd}."
msgstr ""
-msgid "ClusterAgents|Go to the repository"
+msgid "ClusterAgents|For more troubleshooting information go to"
msgstr ""
+msgid "ClusterAgents|Go to the repository"
+msgstr "GÃ¥ til kodelageret"
+
msgid "ClusterAgents|Install a new GitLab Agent"
msgstr ""
@@ -7193,16 +7303,28 @@ msgstr ""
msgid "ClusterAgents|Integrate with the GitLab Agent"
msgstr ""
-msgid "ClusterAgents|Last used"
+msgid "ClusterAgents|Last connected %{timeAgo}."
+msgstr ""
+
+msgid "ClusterAgents|Last contact"
msgstr ""
msgid "ClusterAgents|Learn how to create an agent access token"
msgstr ""
-msgid "ClusterAgents|Name"
+msgid "ClusterAgents|Make sure you are using a valid token."
msgstr ""
+msgid "ClusterAgents|Name"
+msgstr "Navn"
+
msgid "ClusterAgents|Never"
+msgstr "Aldri"
+
+msgid "ClusterAgents|Never connected"
+msgstr ""
+
+msgid "ClusterAgents|Not connected"
msgstr ""
msgid "ClusterAgents|Read more about getting started"
@@ -7226,6 +7348,9 @@ msgstr ""
msgid "ClusterAgents|Select which Agent you want to install"
msgstr ""
+msgid "ClusterAgents|The Agent has not been connected in a long time. There might be a connectivity issue. Last contact was %{timeAgo}."
+msgstr ""
+
msgid "ClusterAgents|The GitLab Agent also requires %{linkStart}enabling the Agent Server%{linkEnd}"
msgstr ""
@@ -7248,14 +7373,11 @@ msgid "ClusterAgents|To install an Agent you should create an agent directory in
msgstr ""
msgid "ClusterAgents|Unknown user"
-msgstr ""
+msgstr "Ukjent bruker"
msgid "ClusterAgents|You will need to create a token to connect to your agent"
msgstr ""
-msgid "ClusterAgent|This feature is only available for premium plans"
-msgstr "Denne funksjonen er bare tilgjengelig for Premium-planer"
-
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr "Brukeren har ikke tilstrekkelige tillatelser til å opprette en sjetong for dette prosjektet"
@@ -7347,7 +7469,7 @@ msgid "ClusterIntegration|Authenticate with Amazon Web Services"
msgstr "Autentiser med Amazon Web Services"
msgid "ClusterIntegration|Authentication Error"
-msgstr ""
+msgstr "Autentiseringsfeil"
msgid "ClusterIntegration|Base domain"
msgstr "Grunndomene"
@@ -7407,7 +7529,7 @@ msgid "ClusterIntegration|Connect existing cluster"
msgstr "Koble til eksisterende klynge"
msgid "ClusterIntegration|Connection Error"
-msgstr ""
+msgstr "Tilkoblingsfeil"
msgid "ClusterIntegration|Copy API URL"
msgstr "Kopier API-URL"
@@ -7445,9 +7567,6 @@ msgstr "Klarte ikke å laste inn undernettverk"
msgid "ClusterIntegration|Create Kubernetes cluster"
msgstr "Opprett Kubernetes-klynge"
-msgid "ClusterIntegration|Create a provision role on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the account and external ID above. %{startMoreInfoLink}More information%{endLink}"
-msgstr "Opprett en klargjøringsrolle på %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} ved hjelp av kontoen og den eksterne ID-en ovenfor. %{startMoreInfoLink}Mer informasjon%{endLink}"
-
msgid "ClusterIntegration|Create cluster on"
msgstr "Opprett klynge på"
@@ -7467,7 +7586,7 @@ msgid "ClusterIntegration|Deletes all GitLab resources attached to this cluster
msgstr "Sletter alle GitLab-ressurser som er knyttet til denne klyngen under fjerning"
msgid "ClusterIntegration|Deploy each environment to its own namespace. Otherwise, environments within a project share a project-wide namespace. Note that anyone who can trigger a deployment of a namespace can read its secrets. If modified, existing environments will use their current namespaces until the cluster cache is cleared."
-msgstr ""
+msgstr "Distribuer hvert miljø til sitt eget navneområde. Ellers deler miljøer innenfor et prosjekt et navneområde som gjelder for hele prosjektet. Bemerk at alle som kan utløse en distribusjon av et navneområde kan lese dens hemmeligheter. Hvis det blir endret, vil eksisterende miljøer bruke sine nåværende navneområder frem til klyngehurtiglageret er slettet."
msgid "ClusterIntegration|Deploy each environment to its own namespace. Otherwise, environments within a project share a project-wide namespace. Note that anyone who can trigger a deployment of a namespace can read its secrets. If modified, existing environments will use their current namespaces until the cluster cache is cleared. %{linkStart}More information%{linkEnd}"
msgstr ""
@@ -7557,7 +7676,7 @@ msgid "ClusterIntegration|Google GKE"
msgstr "Google GKE"
msgid "ClusterIntegration|Google Kubernetes Engine"
-msgstr ""
+msgstr "Google Kubernetes-motor"
msgid "ClusterIntegration|Google Kubernetes Engine project"
msgstr ""
@@ -7566,7 +7685,7 @@ msgid "ClusterIntegration|Group cluster"
msgstr "Gruppeklynge"
msgid "ClusterIntegration|HTTP Error"
-msgstr ""
+msgstr "HTTP-feil"
msgid "ClusterIntegration|If you are setting up multiple clusters and are using Auto DevOps, %{help_link_start}read this first%{help_link_end}."
msgstr ""
@@ -7590,10 +7709,10 @@ msgid "ClusterIntegration|Integrate with a cluster certificate"
msgstr ""
msgid "ClusterIntegration|Integration disabled"
-msgstr ""
+msgstr "Integrasjon er skrudd av"
msgid "ClusterIntegration|Integration enabled"
-msgstr ""
+msgstr "Integrasjon er skrudd på"
msgid "ClusterIntegration|Integrations allow you to use applications installed in your cluster as part of your GitLab workflow."
msgstr ""
@@ -7880,7 +7999,7 @@ msgstr "Ã… spesifisere et domene vil la deg bruke auto-gjennomgangsapper og auto
msgid "ClusterIntegration|Subnets"
msgstr "Undernett"
-msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provisioned role, first create one on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the above account and external IDs. %{startMoreInfoLink}More information%{endLink}"
+msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provisioned role, first create one on %{awsLinkStart}Amazon Web Services %{awsLinkEnd} using the above account and external IDs. %{moreInfoStart}More information%{moreInfoEnd}"
msgstr ""
msgid "ClusterIntegration|The Kubernetes certificate used to authenticate to the cluster."
@@ -7932,16 +8051,16 @@ msgid "ClusterIntegration|To use a new project, first create one on %{docsLinkSt
msgstr "For å bruke et nytt prosjekt, må du først opprette et på %{docsLinkStart}Google Cloud Platform%{docsLinkEnd}."
msgid "ClusterIntegration|Troubleshooting tips:"
-msgstr ""
+msgstr "Feilsøkingstips:"
msgid "ClusterIntegration|Unable to Authenticate"
msgstr ""
msgid "ClusterIntegration|Unable to Connect"
-msgstr ""
+msgstr "Kunne ikke koble til"
msgid "ClusterIntegration|Unknown Error"
-msgstr ""
+msgstr "Ukjent feil"
msgid "ClusterIntegration|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
msgstr ""
@@ -7992,7 +8111,7 @@ msgid "ClusterIntegration|meets the requirements"
msgstr "oppfyller kravene"
msgid "ClusterIntegration|sign up"
-msgstr ""
+msgstr "registrer"
msgid "ClusterIntergation|Select a VPC"
msgstr "Velg en VPC"
@@ -8025,7 +8144,7 @@ msgid "Code"
msgstr "Kode"
msgid "Code Coverage: %{coveragePercentage}"
-msgstr ""
+msgstr "Kodedekning: %{coveragePercentage}"
msgid "Code Coverage: %{coveragePercentage}%{percentSymbol}"
msgstr "Kodedekning: %{coveragePercentage}%{percentSymbol}"
@@ -8037,7 +8156,7 @@ msgid "Code Coverage|Couldn't fetch the code coverage data"
msgstr ""
msgid "Code Owner"
-msgstr ""
+msgstr "Kodeeier"
msgid "Code Owners"
msgstr "Kodeeiere"
@@ -8061,7 +8180,7 @@ msgid "Code owners"
msgstr "Kodeeiere"
msgid "Code review"
-msgstr ""
+msgstr "Kodevurdering"
msgid "Code snippet copied. Insert it in the correct location in the YAML file."
msgstr ""
@@ -8106,7 +8225,7 @@ msgid "Collapse approvers"
msgstr "Slå sammen godkjennere"
msgid "Collapse issues"
-msgstr ""
+msgstr "Klapp sammen saker"
msgid "Collapse milestones"
msgstr "Klapp sammen milepæler"
@@ -8114,6 +8233,9 @@ msgstr "Klapp sammen milepæler"
msgid "Collapse replies"
msgstr "Klapp sammen svar"
+msgid "Collapse settings section"
+msgstr ""
+
msgid "Collapse sidebar"
msgstr "Fold sammen sidepanelet"
@@ -8124,7 +8246,7 @@ msgid "Collector hostname"
msgstr ""
msgid "Colorize messages"
-msgstr ""
+msgstr "Fargelegg meldinger"
msgid "ComboSearch is not defined"
msgstr "ComboSearch er ikke definert"
@@ -8132,6 +8254,9 @@ msgstr "ComboSearch er ikke definert"
msgid "Comma-separated list of email addresses."
msgstr ""
+msgid "Comma-separated list of users allowed to exceed the rate limit."
+msgstr ""
+
msgid "Comma-separated, e.g. '1.1.1.1, 2.2.2.0/24'"
msgstr "Kommaseparert, f.eks. '1.1.1.1, 2.2.2.0/24'"
@@ -8201,7 +8326,7 @@ msgid "Commit Message"
msgstr "Commit-beskjed"
msgid "Commit changes"
-msgstr ""
+msgstr "Commit endringer"
msgid "Commit deleted"
msgstr "Commiten ble slettet"
@@ -8267,10 +8392,10 @@ msgid "Commit…"
msgstr "Loggfør…"
msgid "Community forum"
-msgstr ""
+msgstr "Samfunnsforum"
msgid "Company"
-msgstr ""
+msgstr "Firma"
msgid "Compare"
msgstr "Sammenlign"
@@ -8282,7 +8407,7 @@ msgid "Compare Git revisions"
msgstr "Sammenlign Git-revisjoner"
msgid "Compare GitLab editions"
-msgstr ""
+msgstr "Sammenlign GitLab-utgaver"
msgid "Compare Revisions"
msgstr "Sammenlign revisjoner"
@@ -8309,19 +8434,19 @@ msgid "CompareBranches|There isn't anything to compare."
msgstr "Det er ikke noe å sammenligne."
msgid "CompareRevisions|Branches"
-msgstr ""
+msgstr "Grener"
msgid "CompareRevisions|Compare"
-msgstr ""
+msgstr "Sammenlign"
msgid "CompareRevisions|Create merge request"
-msgstr ""
+msgstr "Opprett en fletteforespørsel"
msgid "CompareRevisions|Filter by Git revision"
msgstr ""
msgid "CompareRevisions|Select Git revision"
-msgstr ""
+msgstr "Velg Git-revisjon"
msgid "CompareRevisions|Select branch/tag"
msgstr ""
@@ -8333,7 +8458,7 @@ msgid "CompareRevisions|Swap revisions"
msgstr ""
msgid "CompareRevisions|Tags"
-msgstr ""
+msgstr "Etiketter"
msgid "CompareRevisions|There was an error while loading the branch/tag list. Please try again."
msgstr ""
@@ -8345,7 +8470,7 @@ msgid "CompareRevisions|There was an error while updating the branch/tag list. P
msgstr ""
msgid "CompareRevisions|View open merge request"
-msgstr ""
+msgstr "Vis åpne fletteforespørsler"
msgid "Complete"
msgstr "Fullført"
@@ -8426,7 +8551,7 @@ msgid "ComplianceFramework|New Compliance Framework"
msgstr ""
msgid "Component"
-msgstr ""
+msgstr "Komponent"
msgid "Confidence"
msgstr "Tillit"
@@ -8441,7 +8566,7 @@ msgid "Configuration"
msgstr "Konfigurasjon"
msgid "Configuration help"
-msgstr ""
+msgstr "Oppsettshjelp"
msgid "Configure %{italic_start}What's new%{italic_end} drawer and content."
msgstr ""
@@ -8452,6 +8577,9 @@ msgstr ""
msgid "Configure %{repository_checks_link_start}repository checks%{link_end} and %{housekeeping_link_start}housekeeping%{link_end} on repositories."
msgstr ""
+msgid "Configure CAPTCHAs, IP address limits, and other anti-spam measures."
+msgstr ""
+
msgid "Configure Dependency Scanning in `.gitlab-ci.yml` using the GitLab managed template. You can [add variable overrides](https://docs.gitlab.com/ee/user/application_security/dependency_scanning/#customizing-the-dependency-scanning-settings) to customize Dependency Scanning settings."
msgstr ""
@@ -8465,7 +8593,7 @@ msgid "Configure Gitaly timeouts."
msgstr "Konfigurer Gitaly-tidsavbrudd."
msgid "Configure Integrations"
-msgstr ""
+msgstr "Sett opp integrasjoner"
msgid "Configure Prometheus"
msgstr "Sett opp Prometheus"
@@ -8488,17 +8616,14 @@ msgstr "Konfigurer sporing"
msgid "Configure a %{codeStart}.gitlab-webide.yml%{codeEnd} file in the %{codeStart}.gitlab%{codeEnd} directory to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
msgstr "Konfigurer en %{codeStart}.gitlab-webide.yml%{codeEnd}-fil i %{codeStart}.gitlab%{codeEnd}-mappen for å begynne å bruke netterminalen. %{helpStart}Lær mer.%{helpEnd}"
-msgid "Configure existing installation"
-msgstr "Sett opp eksisterende installasjon"
-
-msgid "Configure limit for notes created per minute by web and API requests."
+msgid "Configure advanced permissions, Large File Storage, and two-factor authentication settings."
msgstr ""
-msgid "Configure limits for Project/Group Import/Export."
+msgid "Configure approvals by authors and committers on all projects."
msgstr ""
-msgid "Configure limits for web and API requests."
-msgstr "Konfigurer grenser for nett- og API-forespørsler."
+msgid "Configure existing installation"
+msgstr "Sett opp eksisterende installasjon"
msgid "Configure paths to be protected by Rack Attack."
msgstr ""
@@ -8512,10 +8637,13 @@ msgstr ""
msgid "Configure settings for Advanced Search with Elasticsearch."
msgstr ""
+msgid "Configure specific limits for Files API requests that supersede the general user and IP rate limits."
+msgstr ""
+
msgid "Configure specific limits for Git LFS requests that supersede the general user and IP rate limits."
msgstr ""
-msgid "Configure specific limits for Packages API requests that supersede the general user and IP rate limits."
+msgid "Configure specific limits for deprecated API requests that supersede the general user and IP rate limits."
msgstr ""
msgid "Configure the %{link} integration."
@@ -8527,23 +8655,26 @@ msgstr ""
msgid "Configure the way a user creates a new account."
msgstr ""
-msgid "Configure which lists are shown for anyone who visits this board"
+msgid "Configure via Merge Request"
msgstr ""
+msgid "Configure which lists are shown for anyone who visits this board"
+msgstr "Konfigurer hvilke lister som skal vises for alle som besøker dette bordet"
+
msgid "Confirm"
msgstr "Bekreft"
msgid "Confirm new password"
-msgstr ""
+msgstr "Bekreft nytt passord"
msgid "Confirm user"
-msgstr ""
+msgstr "Bekreft bruker"
msgid "Confirm your account"
-msgstr ""
+msgstr "Bekreft kontoen"
msgid "Confirm your email address"
-msgstr ""
+msgstr "Bekreft E-postadressen din"
msgid "Confirmation email sent to %{email}"
msgstr "Bekreftelses-e-post ble sendt til %{email}"
@@ -8552,10 +8683,10 @@ msgid "Confirmation required"
msgstr "Bekreftelse påkrevd"
msgid "Confirmed at:"
-msgstr ""
+msgstr "Bekreftet den:"
msgid "Confirmed:"
-msgstr ""
+msgstr "Bekreftet:"
msgid "Conflict: This file was added both in the source and target branches, but with different contents."
msgstr ""
@@ -8748,7 +8879,7 @@ msgid "ContainerRegistry|Configuration digest: %{digest}"
msgstr ""
msgid "ContainerRegistry|Container Registry"
-msgstr ""
+msgstr "Container-register"
msgid "ContainerRegistry|Copy build command"
msgstr ""
@@ -8763,7 +8894,7 @@ msgid "ContainerRegistry|Delete image repository?"
msgstr ""
msgid "ContainerRegistry|Delete selected tags"
-msgstr ""
+msgstr "Slett valgte tagger"
msgid "ContainerRegistry|Deleting the image repository will delete all images and tags inside. This action cannot be undone. Please type the following to confirm: %{code}"
msgstr ""
@@ -8832,7 +8963,7 @@ msgid "ContainerRegistry|Next cleanup scheduled to run on:"
msgstr ""
msgid "ContainerRegistry|Not yet scheduled"
-msgstr ""
+msgstr "Ikke planlagt ennå"
msgid "ContainerRegistry|Note: Any policy update will result in a change to the scheduled run date and time"
msgstr ""
@@ -8995,6 +9126,9 @@ msgstr ""
msgid "Content parsed with %{link}."
msgstr ""
+msgid "ContentEditor|Table of Contents"
+msgstr ""
+
msgid "ContentEditor|You have to provide a renderMarkdown function or a custom serializer"
msgstr ""
@@ -9053,7 +9187,7 @@ msgid "ContributionAnalytics|Last week"
msgstr "Forrige uke"
msgid "ContributionAnalytics|Merge requests"
-msgstr ""
+msgstr "Fletteforespørsler"
msgid "ContributionAnalytics|No issues for the selected time period."
msgstr ""
@@ -9104,7 +9238,7 @@ msgid "Copy %{http_label} clone URL"
msgstr "Kopier %{http_label}-klone-URL"
msgid "Copy %{name}"
-msgstr ""
+msgstr "Kopier %{name}"
msgid "Copy %{protocol} clone URL"
msgstr "Kopier %{protocol}-klone-URL"
@@ -9125,7 +9259,7 @@ msgid "Copy ID"
msgstr "Kopier ID"
msgid "Copy IP Address"
-msgstr ""
+msgstr "Kopier IP-adresse"
msgid "Copy KRB5 clone URL"
msgstr "Kopier KRB5-klone-URL"
@@ -9143,7 +9277,7 @@ msgid "Copy branch name"
msgstr "Kopier gren-navn"
msgid "Copy codes"
-msgstr ""
+msgstr "Kopier koder"
msgid "Copy command"
msgstr "Kopier kommando"
@@ -9170,7 +9304,7 @@ msgid "Copy key"
msgstr "Kopier nøkkel"
msgid "Copy labels and milestone from %{source_issuable_reference}."
-msgstr ""
+msgstr "Kopier stempler og milepæl fra %{source_issuable_reference}."
msgid "Copy labels and milestone from other issue or merge request in this project"
msgstr ""
@@ -9181,6 +9315,9 @@ msgstr "Kopier lenke"
msgid "Copy link to chart"
msgstr "Kopier lenke til diagram"
+msgid "Copy prefix"
+msgstr ""
+
msgid "Copy reference"
msgstr "Kopier referanse"
@@ -9197,7 +9334,7 @@ msgid "Copy this registration token."
msgstr ""
msgid "Copy this value"
-msgstr ""
+msgstr "Kopier denne verdien"
msgid "Copy to clipboard"
msgstr "Kopier til utklippstavle"
@@ -9211,11 +9348,14 @@ msgstr ""
msgid "Copy value"
msgstr "Kopier verdi"
+msgid "Corpus Management"
+msgstr ""
+
msgid "Corpus Management|Are you sure you want to delete the corpus?"
msgstr ""
msgid "CorpusManagement|Actions"
-msgstr ""
+msgstr "Handlinger"
msgid "CorpusManagement|Corpus are used in fuzz testing as mutation source to Improve future testing."
msgstr ""
@@ -9227,10 +9367,10 @@ msgid "CorpusManagement|Fuzz testing corpus management"
msgstr ""
msgid "CorpusManagement|Last updated"
-msgstr ""
+msgstr "Senest oppdatert"
msgid "CorpusManagement|Last used"
-msgstr ""
+msgstr "Nyligst brukt"
msgid "CorpusManagement|Latest Job:"
msgstr ""
@@ -9239,19 +9379,19 @@ msgid "CorpusManagement|New corpus needs to be a upload in *.zip format. Maximum
msgstr ""
msgid "CorpusManagement|New upload"
-msgstr ""
+msgstr "Ny opplasting"
msgid "CorpusManagement|Not Set"
-msgstr ""
+msgstr "Ikke fastsatt"
msgid "CorpusManagement|Target"
-msgstr ""
+msgstr "MÃ¥l"
msgid "CorpusManagement|To use this corpus, edit the corresponding YAML file"
msgstr ""
msgid "CorpusManagement|Total Size: %{totalSize}"
-msgstr ""
+msgstr "Total størrelse: %{totalSize}"
msgid "CorpusMnagement|New corpus"
msgstr ""
@@ -9317,7 +9457,7 @@ msgid "Could not find design."
msgstr "Klarte ikke å finne designet."
msgid "Could not find iteration"
-msgstr ""
+msgstr "Klarte ikke å finne iterasjonen"
msgid "Could not get the data properly"
msgstr ""
@@ -9362,7 +9502,7 @@ msgid "Could not update the LDAP settings"
msgstr "Klarte ikke å oppdatere LDAP-innstillingene"
msgid "Could not update wiki page"
-msgstr ""
+msgstr "Klarte ikke å oppdatere wikisiden"
msgid "Could not upload your designs as one or more files uploaded are not supported."
msgstr ""
@@ -9383,7 +9523,7 @@ msgid "Create %{environment}"
msgstr "Opprett %{environment}"
msgid "Create %{humanized_resource_name}"
-msgstr ""
+msgstr "Opprett %{humanized_resource_name}"
msgid "Create %{type}"
msgstr "Opprett %{type}"
@@ -9439,6 +9579,9 @@ msgstr "Opprett gren"
msgid "Create commit"
msgstr "Opprett en commit"
+msgid "Create common files more quickly, and standardize their format."
+msgstr ""
+
msgid "Create confidential merge request"
msgstr ""
@@ -9467,16 +9610,19 @@ msgid "Create group label"
msgstr "Opprett gruppe-stempel"
msgid "Create incident"
-msgstr ""
+msgstr "Opprett hendelse"
msgid "Create issue"
msgstr "Lag en rapport"
-msgid "Create iteration"
+msgid "Create issue to resolve all threads"
msgstr ""
+msgid "Create iteration"
+msgstr "Opprett iterasjon"
+
msgid "Create list"
-msgstr ""
+msgstr "Opprett liste"
msgid "Create lists from labels. Issues with that label appear in that list."
msgstr ""
@@ -9506,7 +9652,7 @@ msgid "Create new branch"
msgstr "Opprett ny gren"
msgid "Create new confidential %{issuableType}"
-msgstr ""
+msgstr "Opprett en ny konfidensiell %{issuableType}"
msgid "Create new directory"
msgstr "Lag en ny mappe"
@@ -9521,11 +9667,14 @@ msgid "Create new label"
msgstr "Opprett ny stempel"
msgid "Create new project"
-msgstr ""
+msgstr "Opprett et nytt prosjekt"
msgid "Create new..."
msgstr "Opprett ny..."
+msgid "Create or import your first project"
+msgstr ""
+
msgid "Create project"
msgstr "Opprett prosjekt"
@@ -9542,10 +9691,10 @@ msgid "Create snippet"
msgstr "Opprett utdrag"
msgid "Create tag %{tagName}"
-msgstr ""
+msgstr "Opprett etiketten %{tagName}"
msgid "Create user"
-msgstr ""
+msgstr "Opprett bruker"
msgid "Create wildcard: %{searchTerm}"
msgstr "Opprett jokertegn: %{searchTerm}"
@@ -9572,10 +9721,10 @@ msgid "CreateTokenToCloneLink|create a personal access token"
msgstr ""
msgid "CreateValueStreamForm|%{name} (default)"
-msgstr ""
+msgstr "%{name} (standard)"
msgid "CreateValueStreamForm|'%{name}' Value Stream created"
-msgstr ""
+msgstr "'%{name}'-verdistrøm opprettet"
msgid "CreateValueStreamForm|'%{name}' Value Stream saved"
msgstr ""
@@ -9593,7 +9742,7 @@ msgid "CreateValueStreamForm|Code stage start"
msgstr ""
msgid "CreateValueStreamForm|Create Value Stream"
-msgstr ""
+msgstr "Opprett verdistrøm"
msgid "CreateValueStreamForm|Create from default template"
msgstr ""
@@ -9635,13 +9784,13 @@ msgid "CreateValueStreamForm|Issue stage end"
msgstr ""
msgid "CreateValueStreamForm|Maximum length %{maxLength} characters"
-msgstr ""
+msgstr "Makslengden er på %{maxLength} tegn"
msgid "CreateValueStreamForm|Name is required"
-msgstr ""
+msgstr "Navn er påkrevd"
msgid "CreateValueStreamForm|New stage"
-msgstr ""
+msgstr "Nytt trinn"
msgid "CreateValueStreamForm|Plan stage start"
msgstr ""
@@ -9656,10 +9805,10 @@ msgid "CreateValueStreamForm|Recover hidden stage"
msgstr ""
msgid "CreateValueStreamForm|Restore defaults"
-msgstr ""
+msgstr "Gjenopprett standardinnstillinger"
msgid "CreateValueStreamForm|Restore stage"
-msgstr ""
+msgstr "Gjenopprett trinn"
msgid "CreateValueStreamForm|Save Value Stream"
msgstr ""
@@ -9692,7 +9841,7 @@ msgid "CreateValueStreamForm|Start event: "
msgstr ""
msgid "CreateValueStreamForm|Update stage"
-msgstr ""
+msgstr "Oppdater trinn"
msgid "CreateValueStreamForm|Value Stream name"
msgstr ""
@@ -9701,7 +9850,7 @@ msgid "Created"
msgstr "Opprettet"
msgid "Created %{epicTimeagoDate}"
-msgstr ""
+msgstr "Opprettet %{epicTimeagoDate}"
msgid "Created %{timestamp}"
msgstr "Opprettet %{timestamp}"
@@ -9746,7 +9895,7 @@ msgid "Created on"
msgstr "Opprettet den"
msgid "Created on %{created_at}"
-msgstr ""
+msgstr "Opprettet den %{created_at}"
msgid "Created on:"
msgstr "Opprettet den:"
@@ -9773,22 +9922,22 @@ msgid "Credentials"
msgstr "Legitimasjon"
msgid "CredentialsInventory|GPG Keys"
-msgstr ""
+msgstr "GPG-nøkler"
msgid "CredentialsInventory|No credentials found"
msgstr ""
msgid "CredentialsInventory|Personal Access Tokens"
-msgstr ""
+msgstr "Personlige tilgangssjetonger"
msgid "CredentialsInventory|SSH Keys"
msgstr "SSH-nøkler"
msgid "Credit card validated at:"
-msgstr ""
+msgstr "Bankkort godkjent den:"
msgid "Credit card validated:"
-msgstr ""
+msgstr "Bankkort godkjent:"
msgid "Critical vulnerabilities present"
msgstr "Kritiske sårbarheter til stede"
@@ -9797,7 +9946,7 @@ msgid "Cron Timezone"
msgstr "Cron-tidssone"
msgid "Cron time zone"
-msgstr ""
+msgstr "Cron-tidssone"
msgid "Crowd"
msgstr ""
@@ -9809,10 +9958,10 @@ msgid "CsvParser|Quoted field unterminated"
msgstr ""
msgid "CsvParser|Too few fields"
-msgstr ""
+msgstr "For få felter"
msgid "CsvParser|Too many fields"
-msgstr ""
+msgstr "For mange felter"
msgid "CsvParser|Trailing quote on quoted field is malformed"
msgstr ""
@@ -9821,7 +9970,7 @@ msgid "CsvParser|Unable to auto-detect delimiter; defaulted to \",\""
msgstr ""
msgid "Current"
-msgstr ""
+msgstr "Aktivt"
msgid "Current Branch"
msgstr "Nåværende gren"
@@ -9839,10 +9988,10 @@ msgid "Current password"
msgstr "Nåværende passord"
msgid "Current sign-in IP:"
-msgstr ""
+msgstr "Nåværende påloggings-IP:"
msgid "Current sign-in at:"
-msgstr ""
+msgstr "Nåværende pålogging hos:"
msgid "Current vulnerabilities count"
msgstr ""
@@ -9851,13 +10000,13 @@ msgid "CurrentUser|Buy Pipeline minutes"
msgstr ""
msgid "CurrentUser|Edit profile"
-msgstr ""
+msgstr "Rediger profil"
msgid "CurrentUser|One of your groups is running out"
msgstr ""
msgid "CurrentUser|Preferences"
-msgstr ""
+msgstr "Innstillinger"
msgid "CurrentUser|Start an Ultimate trial"
msgstr ""
@@ -9883,7 +10032,7 @@ msgstr "Tilpassede målinger"
msgid "Custom notification events"
msgstr "Tilpassede varslingshendelser"
-msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notificationLinkStart} notification emails%{notificationLinkEnd}."
+msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notificationLinkStart}notification emails%{notificationLinkEnd}."
msgstr ""
msgid "Custom project templates"
@@ -9899,7 +10048,7 @@ msgid "Custom range (UTC)"
msgstr "Tilpasset område (UTC)"
msgid "Customizable by an administrator."
-msgstr ""
+msgstr "Justerbar av en administrator."
msgid "Customizable by owners."
msgstr ""
@@ -9917,7 +10066,7 @@ msgid "Customize icon"
msgstr "Tilpass ikon"
msgid "Customize language and region related settings."
-msgstr ""
+msgstr "Tilpass språk- og regionrelaterte innstillinger."
msgid "Customize name"
msgstr "Tilpass navn"
@@ -9947,7 +10096,7 @@ msgid "CycleAnalyticsEvent|%{label_reference} label was added to the merge reque
msgstr ""
msgid "CycleAnalyticsEvent|%{label_reference} label was removed from the issue"
-msgstr ""
+msgstr "%{label_reference}-stemplet ble fjernet fra saken"
msgid "CycleAnalyticsEvent|%{label_reference} label was removed from the merge request"
msgstr ""
@@ -10082,11 +10231,11 @@ msgid_plural "CycleAnalytics|Showing %{subjectFilterText} and %{selectedLabelsCo
msgstr[0] ""
msgstr[1] ""
-msgid "CycleAnalytics|Showing data for group '%{groupName}' and %{selectedProjectCount} projects from %{startDate} to %{endDate}"
-msgstr "Viser data for gruppen '%{groupName}' og %{selectedProjectCount} prosjekter fra %{startDate} til %{endDate}"
+msgid "CycleAnalytics|Showing data for group '%{groupName}' and %{selectedProjectCount} projects from %{createdAfter} to %{createdBefore}"
+msgstr ""
-msgid "CycleAnalytics|Showing data for group '%{groupName}' from %{startDate} to %{endDate}"
-msgstr "Viser data for gruppen '%{groupName}' fra %{startDate} til %{endDate}"
+msgid "CycleAnalytics|Showing data for group '%{groupName}' from %{createdAfter} to %{createdBefore}"
+msgstr ""
msgid "CycleAnalytics|Stages"
msgstr "Trinn"
@@ -10101,7 +10250,7 @@ msgid "CycleAnalytics|The given date range is larger than 180 days"
msgstr ""
msgid "CycleAnalytics|Type of work"
-msgstr ""
+msgstr "Arbeidstype"
msgid "CycleAnalytics|group dropdown filter"
msgstr ""
@@ -10119,19 +10268,19 @@ msgid "DAG visualization requires at least 3 dependent jobs."
msgstr ""
msgid "DAST Configuration"
-msgstr ""
+msgstr "DAST-oppsett"
msgid "DAST Scans"
-msgstr ""
+msgstr "DAST-skanninger"
msgid "DNS"
msgstr "DNS"
msgid "DORA4Metrics|%{startDate} - %{endDate}"
-msgstr ""
+msgstr "%{startDate} - %{endDate}"
msgid "DORA4Metrics|Date"
-msgstr ""
+msgstr "Dato"
msgid "DORA4Metrics|Days from merge to deploy"
msgstr ""
@@ -10143,13 +10292,13 @@ msgid "DORA4Metrics|Lead time"
msgstr ""
msgid "DORA4Metrics|Median lead time"
-msgstr ""
+msgstr "Median-ledetid"
msgid "DORA4Metrics|No merge requests were deployed during this period"
msgstr ""
msgid "DORA4Metrics|Number of deployments"
-msgstr ""
+msgstr "Antall distribusjoner"
msgid "DORA4Metrics|Something went wrong while getting deployment frequency data."
msgstr ""
@@ -10191,7 +10340,7 @@ msgid "DastConfig|Customize DAST settings to suit your requirements. Configurati
msgstr ""
msgid "DastConfig|DAST Settings"
-msgstr ""
+msgstr "DAST-innstillinger"
msgid "DastConfig|Generate code snippet"
msgstr ""
@@ -10206,7 +10355,7 @@ msgid "DastProfiles|AJAX spider"
msgstr ""
msgid "DastProfiles|Active"
-msgstr ""
+msgstr "Aktiv"
msgid "DastProfiles|Additional request headers (Optional)"
msgstr ""
@@ -10215,13 +10364,13 @@ msgid "DastProfiles|Are you sure you want to delete this profile?"
msgstr "Er du sikker på at du vil slette profilen?"
msgid "DastProfiles|Authentication"
-msgstr ""
+msgstr "Autentisering"
msgid "DastProfiles|Authentication URL"
-msgstr ""
+msgstr "Autentiserings-URL"
msgid "DastProfiles|Branch missing"
-msgstr ""
+msgstr "Grenen mangler"
msgid "DastProfiles|Could not create the scanner profile. Please try again."
msgstr ""
@@ -10263,13 +10412,13 @@ msgid "DastProfiles|Could not update the site profile. Please try again."
msgstr "Klarte ikke å oppdatere nettstedsprofilen. Vennligst prøv igjen."
msgid "DastProfiles|DAST Scan"
-msgstr ""
+msgstr "DAST-skanning"
msgid "DastProfiles|Debug messages"
-msgstr ""
+msgstr "Avlusingsmeldinger"
msgid "DastProfiles|Delete profile"
-msgstr ""
+msgstr "Slett profil"
msgid "DastProfiles|Do you want to discard this scanner profile?"
msgstr "Vil du forkaste denne skannerprofilen?"
@@ -10281,16 +10430,16 @@ msgid "DastProfiles|Do you want to discard your changes?"
msgstr "Vil du forkaste dine endringer?"
msgid "DastProfiles|Edit profile"
-msgstr ""
+msgstr "Rediger profil"
msgid "DastProfiles|Edit scanner profile"
-msgstr ""
+msgstr "Rediger skannerprofil"
msgid "DastProfiles|Edit site profile"
msgstr "Rediger nettstedsprofilen"
msgid "DastProfiles|Enable Authentication"
-msgstr ""
+msgstr "Skru på autentisering"
msgid "DastProfiles|Enter URLs in a comma-separated list."
msgstr ""
@@ -10302,10 +10451,10 @@ msgid "DastProfiles|Error Details"
msgstr "Detaljer om feilen"
msgid "DastProfiles|Excluded URLs"
-msgstr ""
+msgstr "Ekskluderte URL-er"
msgid "DastProfiles|Excluded URLs (Optional)"
-msgstr ""
+msgstr "Ekskluderte URL-er (valgfritt)"
msgid "DastProfiles|Hide debug messages"
msgstr ""
@@ -10314,11 +10463,14 @@ msgid "DastProfiles|Include debug messages in the DAST console output."
msgstr ""
msgid "DastProfiles|Manage DAST scans"
-msgstr ""
+msgstr "Behandle DAST-skanninger"
msgid "DastProfiles|Manage profiles"
msgstr "Behandle profiler"
+msgid "DastProfiles|Manage site profiles"
+msgstr ""
+
msgid "DastProfiles|Minimum = 0 (no timeout enabled), Maximum = 2880 minutes"
msgstr ""
@@ -10341,16 +10493,16 @@ msgid "DastProfiles|No site profiles created yet"
msgstr ""
msgid "DastProfiles|Not Validated"
-msgstr ""
+msgstr "Ikke validert"
msgid "DastProfiles|Passive"
-msgstr ""
+msgstr "Passiv"
msgid "DastProfiles|Password"
-msgstr ""
+msgstr "Passord"
msgid "DastProfiles|Password form field"
-msgstr ""
+msgstr "Passord-skjemafelt"
msgid "DastProfiles|Profile name"
msgstr "Profilnavn"
@@ -10365,7 +10517,7 @@ msgid "DastProfiles|Rest API"
msgstr ""
msgid "DastProfiles|Run scan"
-msgstr ""
+msgstr "Kjør skanning"
msgid "DastProfiles|Run the AJAX spider, in addition to the traditional spider, to crawl the target site."
msgstr ""
@@ -10377,13 +10529,13 @@ msgid "DastProfiles|Save profile"
msgstr "Lagre profil"
msgid "DastProfiles|Saved Scans"
-msgstr ""
+msgstr "Lagrede skanninger"
msgid "DastProfiles|Scan"
-msgstr ""
+msgstr "Skann"
msgid "DastProfiles|Scan mode"
-msgstr ""
+msgstr "Skannemodus"
msgid "DastProfiles|Scanner Profile"
msgstr "Skannerprofil"
@@ -10394,9 +10546,12 @@ msgstr "Skanner-profiler"
msgid "DastProfiles|Scanner name"
msgstr ""
-msgid "DastProfiles|Select branch"
+msgid "DastProfiles|Schedule"
msgstr ""
+msgid "DastProfiles|Select branch"
+msgstr "Velg gren"
+
msgid "DastProfiles|Show debug messages"
msgstr ""
@@ -10407,16 +10562,16 @@ msgid "DastProfiles|Site Profiles"
msgstr "Nettstedsprofiler"
msgid "DastProfiles|Site name"
-msgstr ""
+msgstr "Nettstedsnavn"
msgid "DastProfiles|Site type"
-msgstr ""
+msgstr "Nettstedstype"
msgid "DastProfiles|Spider timeout"
msgstr ""
msgid "DastProfiles|Target"
-msgstr ""
+msgstr "MÃ¥l"
msgid "DastProfiles|Target URL"
msgstr "MÃ¥l-URL"
@@ -10443,27 +10598,27 @@ msgid "DastProfiles|Turn on AJAX spider"
msgstr ""
msgid "DastProfiles|URL"
-msgstr ""
+msgstr "URL"
msgid "DastProfiles|URLs to skip during the authenticated scan."
msgstr ""
msgid "DastProfiles|Username"
-msgstr ""
+msgstr "Brukernavn"
msgid "DastProfiles|Username form field"
msgstr ""
msgid "DastProfiles|Validated"
-msgstr ""
+msgstr "Validert"
msgid "DastProfiles|Validation status"
-msgstr ""
+msgstr "Valideringsstatus"
msgid "DastProfiles|Website"
-msgstr ""
+msgstr "Nettsted"
-msgid "DastProfiles|You can either choose a passive scan or validate the target site in your chosen site profile. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
+msgid "DastProfiles|You can either choose a passive scan or validate the target site from the site profile management page. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
msgstr ""
msgid "DastProfiles|You cannot run an active scan against an unvalidated site."
@@ -10491,7 +10646,7 @@ msgid "DastSiteValidation|Meta tag validation"
msgstr ""
msgid "DastSiteValidation|Retry validation"
-msgstr ""
+msgstr "Prøv å validere på nytt"
msgid "DastSiteValidation|Revoke validation"
msgstr ""
@@ -10535,16 +10690,16 @@ msgid "DastSiteValidation|To run an active scan, validate your target site. All
msgstr ""
msgid "DastSiteValidation|Validate"
-msgstr ""
+msgstr "Valider"
msgid "DastSiteValidation|Validate target site"
msgstr ""
msgid "DastSiteValidation|Validated"
-msgstr ""
+msgstr "Validert"
msgid "DastSiteValidation|Validating..."
-msgstr ""
+msgstr "Validerer …"
msgid "DastSiteValidation|Validation failed"
msgstr ""
@@ -10562,7 +10717,7 @@ msgid "Data is still calculating..."
msgstr ""
msgid "Data type"
-msgstr ""
+msgstr "Datatype"
msgid "Database update failed"
msgstr ""
@@ -10574,10 +10729,10 @@ msgid "DatadogIntegration|(Advanced) The full URL for your Datadog site."
msgstr ""
msgid "DatadogIntegration|API URL"
-msgstr ""
+msgstr "API-URL"
msgid "DatadogIntegration|Environment"
-msgstr ""
+msgstr "Miljø"
msgid "DatadogIntegration|For self-managed deployments, set the %{codeOpen}env%{codeClose} tag for all the data sent to Datadog. %{linkOpen}How do I use tags?%{linkClose}"
msgstr ""
@@ -10589,7 +10744,7 @@ msgid "DatadogIntegration|Send CI/CD pipeline information to Datadog to monitor
msgstr ""
msgid "DatadogIntegration|Service"
-msgstr ""
+msgstr "Tjeneste"
msgid "DatadogIntegration|Tag all data from this GitLab instance in Datadog. Useful when managing several self-managed deployments."
msgstr ""
@@ -10610,7 +10765,7 @@ msgid "Date picker"
msgstr "Datovelger"
msgid "Date range"
-msgstr ""
+msgstr "Datointervall"
msgid "Date range must be shorter than %{max_range} days."
msgstr ""
@@ -10634,13 +10789,13 @@ msgid "Days"
msgstr "Dager"
msgid "Days to merge"
-msgstr ""
+msgstr "Dager igjen til sammenslåing"
-msgid "Deactivate dormant users after 90 days of inactivity. Users can return to active status by signing in to their account. While inactive, a user is not counted as an active user in the instance."
+msgid "Deactivate dormant users after 90 days of inactivity"
msgstr ""
msgid "Dear Administrator,"
-msgstr ""
+msgstr "Kjære administrator,"
msgid "Debian package already exists in Distribution"
msgstr ""
@@ -10664,10 +10819,10 @@ msgid "Decompressed archive size validation failed."
msgstr ""
msgid "Decrease"
-msgstr ""
+msgstr "Minsk"
msgid "Default CI/CD configuration file"
-msgstr ""
+msgstr "Standard CI/CD-oppsettsfil"
msgid "Default artifacts expiration"
msgstr ""
@@ -10694,7 +10849,7 @@ msgid "Default description template for merge requests"
msgstr ""
msgid "Default first day of the week"
-msgstr ""
+msgstr "Standard første ukedag"
msgid "Default first day of the week in calendars and date pickers."
msgstr ""
@@ -10709,7 +10864,7 @@ msgid "Default projects limit"
msgstr ""
msgid "Default timeout"
-msgstr ""
+msgstr "Standard tidsavbrudd"
msgid "Default: Map a FogBugz account ID to a full name"
msgstr ""
@@ -10723,10 +10878,10 @@ msgstr ""
msgid "Define a custom pattern with cron syntax"
msgstr ""
-msgid "Define approval settings."
+msgid "Define approval rules."
msgstr ""
-msgid "Define approval settings. %{linkStart}Learn more.%{linkEnd}"
+msgid "Define approval rules. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "Define custom rules for what constitutes spam, independent of Akismet"
@@ -10735,7 +10890,7 @@ msgstr ""
msgid "Define environments in the deploy stage(s) in %{code_open}.gitlab-ci.yml%{code_close} to track deployments here."
msgstr ""
-msgid "Define how approval rules are applied as a merge request moves toward completion."
+msgid "Define how approval rules are applied to merge requests."
msgstr ""
msgid "Definition"
@@ -10750,11 +10905,17 @@ msgstr ""
msgid "DelayedJobs|Are you sure you want to run %{job_name} immediately? This job will run automatically after it's timer finishes."
msgstr ""
+msgid "DelayedJobs|Are you sure you want to run %{job_name} immediately? This job will run automatically after its timer finishes."
+msgstr ""
+
+msgid "DelayedJobs|Run the delayed job now?"
+msgstr ""
+
msgid "DelayedJobs|Start now"
msgstr "Start nå"
msgid "DelayedJobs|Unschedule"
-msgstr ""
+msgstr "Avbryt planlegging"
msgid "DelayedJobs|delayed"
msgstr "forsinket"
@@ -10763,16 +10924,16 @@ msgid "Delete"
msgstr "Slett"
msgid "Delete %{issuableType}"
-msgstr ""
+msgstr "Slett %{issuableType}"
msgid "Delete %{name}"
-msgstr ""
+msgstr "Slett %{name}"
msgid "Delete Comment"
msgstr "Slett kommentar"
msgid "Delete Key"
-msgstr ""
+msgstr "Slett nøkkel"
msgid "Delete Value Stream"
msgstr ""
@@ -10784,10 +10945,10 @@ msgid "Delete artifacts"
msgstr "Slett artefakter"
msgid "Delete badge"
-msgstr ""
+msgstr "Slett merke"
msgid "Delete column"
-msgstr ""
+msgstr "Slett kolonne"
msgid "Delete comment"
msgstr "Slett kommentar"
@@ -10799,7 +10960,7 @@ msgid "Delete domain"
msgstr "Slett domene"
msgid "Delete file"
-msgstr ""
+msgstr "Slett fil"
msgid "Delete image repository"
msgstr ""
@@ -10808,10 +10969,10 @@ msgid "Delete label"
msgstr "Slett stempel"
msgid "Delete label: %{labelName}"
-msgstr ""
+msgstr "Slett stempel: %{labelName}"
msgid "Delete pipeline"
-msgstr ""
+msgstr "Slett rørledning"
msgid "Delete project"
msgstr "Slett prosjekt"
@@ -10820,7 +10981,7 @@ msgid "Delete project. Are you ABSOLUTELY SURE?"
msgstr "Slett prosjektet. Er du HELT SIKKER?"
msgid "Delete row"
-msgstr ""
+msgstr "Slett rad"
msgid "Delete self monitoring project"
msgstr ""
@@ -10838,10 +10999,10 @@ msgid "Delete source branch"
msgstr "Slett kildegrenen"
msgid "Delete subscription"
-msgstr ""
+msgstr "Slett abonnement"
msgid "Delete table"
-msgstr ""
+msgstr "Slett tabell"
msgid "Delete this attachment"
msgstr "Slett dette vedlegget"
@@ -10877,19 +11038,19 @@ msgid "DeleteProject|Failed to restore wiki repository. Please contact the admin
msgstr ""
msgid "DeleteValueStream|'%{name}' Value Stream deleted"
-msgstr ""
+msgstr "'%{name}' Verdistrøm slettet"
msgid "DeleteValueStream|Are you sure you want to delete the \"%{name}\" Value Stream?"
msgstr ""
msgid "DeleteValueStream|Delete %{name}"
-msgstr ""
+msgstr "Slett %{name}"
msgid "Deleted"
msgstr "Slettet"
msgid "Deleted Projects"
-msgstr ""
+msgstr "Slettede prosjekter"
msgid "Deleted chat nickname: %{chat_name}!"
msgstr ""
@@ -10964,7 +11125,7 @@ msgid "Dependencies|Component name"
msgstr "Komponentnavn"
msgid "Dependencies|Dependency path"
-msgstr ""
+msgstr "Avhengighets-filbane"
msgid "Dependencies|Export as JSON"
msgstr "Eksporter som JSON"
@@ -10997,7 +11158,7 @@ msgid "Dependencies|There may be multiple paths"
msgstr ""
msgid "Dependencies|Toggle vulnerability list"
-msgstr ""
+msgstr "Skru av/på sårbarhetsliste"
msgid "Dependencies|Unsupported file(s) detected"
msgstr ""
@@ -11012,7 +11173,7 @@ msgid "Dependency List has no entries"
msgstr ""
msgid "Dependency Proxy"
-msgstr ""
+msgstr "Avhengighetsmellomtjener"
msgid "Dependency Scanning"
msgstr "Avhengighetsskanning"
@@ -11026,6 +11187,12 @@ msgstr ""
msgid "Dependency proxy image prefix"
msgstr ""
+msgid "DependencyProxy|Create a local proxy for storing frequently used upstream images. %{docLinkStart}Learn more%{docLinkEnd} about dependency proxies."
+msgstr ""
+
+msgid "DependencyProxy|Dependency Proxy"
+msgstr ""
+
msgid "DependencyProxy|Toggle Dependency Proxy"
msgstr ""
@@ -11054,7 +11221,7 @@ msgid "Deploy key was successfully updated."
msgstr ""
msgid "Deploy keys"
-msgstr ""
+msgstr "Distribuer nøkler"
msgid "Deploy keys grant read/write access to all repositories in your instance"
msgstr ""
@@ -11063,7 +11230,7 @@ msgid "Deploy progress not found. To see pods, ensure your environment matches %
msgstr ""
msgid "Deploy to..."
-msgstr ""
+msgstr "Distribuer til …"
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 ""
@@ -11072,7 +11239,7 @@ msgid "DeployFreeze|Add deploy freeze"
msgstr ""
msgid "DeployFreeze|Delete"
-msgstr ""
+msgstr "Slett"
msgid "DeployFreeze|Delete deploy freeze?"
msgstr ""
@@ -11084,7 +11251,7 @@ msgid "DeployFreeze|Deploy freeze from %{start} to %{end} in %{timezone} will be
msgstr ""
msgid "DeployFreeze|Edit"
-msgstr ""
+msgstr "Rediger"
msgid "DeployFreeze|Freeze end"
msgstr ""
@@ -11108,7 +11275,7 @@ msgid "DeployKeys|Current project"
msgstr "Nåværende prosjekt"
msgid "DeployKeys|Deploy key"
-msgstr ""
+msgstr "Distribuer nøkkel"
msgid "DeployKeys|Enabled deploy keys"
msgstr ""
@@ -11213,7 +11380,7 @@ msgid "DeployTokens|Revoke %{name}"
msgstr "Tilbakekall %{name}"
msgid "DeployTokens|Scopes"
-msgstr ""
+msgstr "Omfang"
msgid "DeployTokens|This %{entity_type} has no active Deploy Tokens."
msgstr ""
@@ -11264,6 +11431,9 @@ msgid "Deployment frequency"
msgstr ""
msgid "Deployments"
+msgstr "Distribusjoner"
+
+msgid "Deployments to Google Kubernetes Engine can be "
msgstr ""
msgid "Deployments|%{deployments} environment impacted."
@@ -11290,11 +11460,14 @@ msgid "Deployment|running"
msgstr "kjører"
msgid "Deployment|skipped"
-msgstr ""
+msgstr "hoppet over"
msgid "Deployment|success"
msgstr "suksess"
+msgid "Deprecated API rate limits"
+msgstr ""
+
msgid "Deprioritize label"
msgstr ""
@@ -11308,7 +11481,7 @@ msgid "Description"
msgstr "Beskrivelse"
msgid "Description (optional)"
-msgstr ""
+msgstr "Beskrivelse (valgfritt)"
msgid "Description parsed with %{link_start}GitLab Flavored Markdown%{link_end}"
msgstr ""
@@ -11317,13 +11490,13 @@ msgid "Description parsed with %{link_start}GitLab Flavored Markdown%{link_end}.
msgstr ""
msgid "Description template"
-msgstr ""
+msgstr "Beskrivelsesmal"
msgid "Description:"
msgstr "Beskrivelse:"
msgid "Descriptive label"
-msgstr ""
+msgstr "Beskrivende stempel"
msgid "Design Management files and data"
msgstr ""
@@ -11377,7 +11550,7 @@ msgid "DesignManagement|Click the image where you'd like to start a new discussi
msgstr ""
msgid "DesignManagement|Comment"
-msgstr ""
+msgstr "Kommentar"
msgid "DesignManagement|Comments you resolve can be viewed and unresolved by going to the \"Resolved Comments\" section below"
msgstr ""
@@ -11491,10 +11664,10 @@ msgid "DevOps Report"
msgstr "DevOps-rapport"
msgid "DevOps adoption"
-msgstr ""
+msgstr "DevOps-adopsjon"
msgid "Devices (optional)"
-msgstr ""
+msgstr "Enheter (valgfritt)"
msgid "DevopsAdoption|%{adoptedCount}/%{featuresCount} %{title} features adopted"
msgstr ""
@@ -11503,13 +11676,13 @@ msgid "DevopsAdoption|Add a group to get started"
msgstr ""
msgid "DevopsAdoption|Add or remove groups"
-msgstr ""
+msgstr "Legg til eller fjerne grupper"
msgid "DevopsAdoption|Add or remove subgroups"
msgstr ""
msgid "DevopsAdoption|Adopted"
-msgstr ""
+msgstr "Adoptert"
msgid "DevopsAdoption|Adoption by group"
msgstr ""
@@ -11521,7 +11694,7 @@ msgid "DevopsAdoption|An error occurred while removing the group. Please try aga
msgstr ""
msgid "DevopsAdoption|Approvals"
-msgstr ""
+msgstr "Godkjennelser"
msgid "DevopsAdoption|Are you sure that you would like to remove %{name} from the table?"
msgstr ""
@@ -11533,16 +11706,16 @@ msgid "DevopsAdoption|At least one deploy"
msgstr ""
msgid "DevopsAdoption|At least one issue opened"
-msgstr ""
+msgstr "Minst én åpnet sak"
msgid "DevopsAdoption|At least one merge request opened"
-msgstr ""
+msgstr "Minst én åpnet fletteforespørsel"
msgid "DevopsAdoption|At least one pipeline successfully run"
msgstr ""
msgid "DevopsAdoption|Code owners"
-msgstr ""
+msgstr "Kode-eiere"
msgid "DevopsAdoption|Code owners enabled for at least one project"
msgstr ""
@@ -11551,19 +11724,19 @@ msgid "DevopsAdoption|Confirm remove Group"
msgstr ""
msgid "DevopsAdoption|DAST"
-msgstr ""
+msgstr "DAST"
msgid "DevopsAdoption|DAST enabled for at least one project"
msgstr ""
msgid "DevopsAdoption|Dependency Scanning"
-msgstr ""
+msgstr "Avhengighetsskanning"
msgid "DevopsAdoption|Dependency Scanning enabled for at least one project"
msgstr ""
msgid "DevopsAdoption|Deploys"
-msgstr ""
+msgstr "Distribueringer"
msgid "DevopsAdoption|Dev"
msgstr ""
@@ -11572,10 +11745,10 @@ msgid "DevopsAdoption|DevOps adoption tracks the use of key features across your
msgstr ""
msgid "DevopsAdoption|Edit groups"
-msgstr ""
+msgstr "Rediger grupper"
msgid "DevopsAdoption|Edit subgroups"
-msgstr ""
+msgstr "Rediger undergrupper"
msgid "DevopsAdoption|Feature adoption is based on usage in the previous calendar month. Data is updated at the beginning of each month. Last updated: %{timestamp}."
msgstr ""
@@ -11587,13 +11760,13 @@ msgid "DevopsAdoption|Fuzz Testing enabled for at least one project"
msgstr ""
msgid "DevopsAdoption|Issues"
-msgstr ""
+msgstr "Saker"
msgid "DevopsAdoption|MRs"
-msgstr ""
+msgstr "FF-er"
msgid "DevopsAdoption|No results…"
-msgstr ""
+msgstr "Ingen resultater …"
msgid "DevopsAdoption|Not adopted"
msgstr ""
@@ -11605,10 +11778,10 @@ msgid "DevopsAdoption|Overall adoption"
msgstr ""
msgid "DevopsAdoption|Pipelines"
-msgstr ""
+msgstr "Rørledninger"
msgid "DevopsAdoption|Remove Group"
-msgstr ""
+msgstr "Fjern gruppe"
msgid "DevopsAdoption|Remove Group from the table."
msgstr ""
@@ -11617,16 +11790,16 @@ msgid "DevopsAdoption|Runner configured for project/group"
msgstr ""
msgid "DevopsAdoption|Runners"
-msgstr ""
+msgstr "Løpere"
msgid "DevopsAdoption|SAST"
-msgstr ""
+msgstr "SAST"
msgid "DevopsAdoption|SAST enabled for at least one project"
msgstr ""
msgid "DevopsAdoption|Sec"
-msgstr ""
+msgstr "sek"
msgid "DevopsAdoption|There was an error enabling the current group. Please refresh the page."
msgstr ""
@@ -11650,28 +11823,28 @@ msgid "DevopsReport|DevOps score metrics are based on usage over the last 30 day
msgstr ""
msgid "DevopsReport|High"
-msgstr ""
+msgstr "Høy"
msgid "DevopsReport|Leader usage"
msgstr ""
msgid "DevopsReport|Low"
-msgstr ""
+msgstr "Lav"
msgid "DevopsReport|Moderate"
-msgstr ""
+msgstr "Moderat"
msgid "DevopsReport|Overview"
-msgstr ""
+msgstr "Oversikt"
msgid "DevopsReport|Score"
-msgstr ""
+msgstr "Score"
msgid "DevopsReport|Your score"
-msgstr ""
+msgstr "Din score"
msgid "DevopsReport|Your usage"
-msgstr ""
+msgstr "Din bruk"
msgid "Didn't receive a confirmation email?"
msgstr ""
@@ -11695,7 +11868,17 @@ msgid "DiffsCompareBaseBranch|(HEAD)"
msgstr ""
msgid "DiffsCompareBaseBranch|(base)"
-msgstr ""
+msgstr "(base)"
+
+msgid "Diffs|%d addition"
+msgid_plural "Diffs|%d additions"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Diffs|%d deletion"
+msgid_plural "Diffs|%d deletions"
+msgstr[0] ""
+msgstr[1] ""
msgid "Diffs|No file name available"
msgstr "Ingen filnavn tilgjengelig"
@@ -11704,14 +11887,22 @@ msgid "Diffs|Show %{unfoldCount} lines"
msgstr "Vis %{unfoldCount} linjer"
msgid "Diffs|Show all unchanged lines"
-msgstr ""
+msgstr "Vis alle uendrede linjer"
+
+msgid "Diffs|Showing %{dropdownStart}%{count} changed file%{dropdownEnd}"
+msgid_plural "Diffs|Showing %{dropdownStart}%{count} changed files%{dropdownEnd}"
+msgstr[0] ""
+msgstr[1] ""
msgid "Diffs|Something went wrong while fetching diff lines."
msgstr ""
-msgid "Direct member"
+msgid "Diffs|with %{additions} and %{deletions}"
msgstr ""
+msgid "Direct member"
+msgstr "Direktemedlem"
+
msgid "Direct non-authenticated users to this page."
msgstr ""
@@ -11731,7 +11922,7 @@ msgid "Disable Two-factor Authentication"
msgstr ""
msgid "Disable What's new"
-msgstr ""
+msgstr "Skru av «Hva er nytt»"
msgid "Disable for this project"
msgstr "Deaktiver for dette prosjektet"
@@ -11746,7 +11937,7 @@ msgid "Disabled"
msgstr "Deaktivert"
msgid "Disabled by %{parent} owner"
-msgstr ""
+msgstr "Deaktivert av %{parent} sin eier"
msgid "Disabled mirrors can only be enabled by instance owners. It is recommended that you delete them."
msgstr ""
@@ -11776,7 +11967,7 @@ msgid "DiscordService|Send notifications about project events to a Discord chann
msgstr ""
msgid "Discover"
-msgstr ""
+msgstr "Oppdag"
msgid "Discover GitLab Geo"
msgstr "Oppdag GitLab Geo"
@@ -11834,14 +12025,11 @@ msgid_plural "Dismiss %d selected vulnerabilities as"
msgstr[0] "Avfei %d valgt sårbarhet som"
msgstr[1] "Avfei %d valgt sårbarheter som"
-msgid "Dismiss Value Stream Analytics introduction box"
-msgstr ""
-
msgid "Dismiss merge request promotion"
msgstr ""
msgid "Dismiss selected"
-msgstr ""
+msgstr "Avslå valgte"
msgid "Dismiss trial promotion"
msgstr ""
@@ -11907,7 +12095,7 @@ msgid "Domain"
msgstr "Domene"
msgid "Domain Name"
-msgstr ""
+msgstr "Domenenavn"
msgid "Domain cannot be deleted while associated to one or more clusters."
msgstr ""
@@ -11922,7 +12110,7 @@ msgid "Domain was successfully updated."
msgstr "Domenet ble vellykket oppdatert."
msgid "Don't have an account yet?"
-msgstr ""
+msgstr "Har du ikke en konto ennå?"
msgid "Don't include description in commit message"
msgstr "Ikke inkluder beskrivelsen i commit-meldingen"
@@ -11931,7 +12119,7 @@ msgid "Don't paste the private part of the GPG key. Paste the public part which
msgstr "Ikke lim inn den private delen av GPG-nøkkelen. Lim inn den offentlige delen som begynner med ' -----BEGIN PGP PUBLIC KEY BLOCK-----'."
msgid "Don't send service data"
-msgstr ""
+msgstr "Ikke send tjenestedata"
msgid "Don't show again"
msgstr "Ikke vis igjen"
@@ -11940,7 +12128,7 @@ msgid "Done"
msgstr "Fullført"
msgid "Dormant users"
-msgstr ""
+msgstr "Dvalende brukere"
msgid "Download"
msgstr "Last ned"
@@ -11955,10 +12143,10 @@ msgid "Download %{name} artifact"
msgstr ""
msgid "Download (%{fileSizeReadable})"
-msgstr ""
+msgstr "Last ned (%{fileSizeReadable})"
msgid "Download (%{size})"
-msgstr ""
+msgstr "Last ned (%{size})"
msgid "Download CSV"
msgstr "Last ned CSV"
@@ -12012,7 +12200,7 @@ msgid "Draft merge requests can't be merged."
msgstr ""
msgid "Drag your designs here or %{linkStart}click to upload%{linkEnd}."
-msgstr ""
+msgstr "Dra designene dine hit eller %{linkStart}klikk for å laste opp%{linkEnd}."
msgid "Drop or %{linkStart}upload%{linkEnd} file to attach"
msgstr ""
@@ -12024,13 +12212,13 @@ msgid "Drop your designs to start your upload."
msgstr ""
msgid "Drop your files to start your upload."
-msgstr ""
+msgstr "Dra filene dine hit for å begynne opplastingen."
msgid "DropdownWidget|An error occurred while fetching the assigned %{issuableAttribute} of the selected %{issuableType}."
msgstr ""
msgid "DropdownWidget|Assign %{issuableAttribute}"
-msgstr ""
+msgstr "Tilordne %{issuableAttribute}"
msgid "DropdownWidget|Failed to fetch the %{issuableAttribute} for this %{issuableType}. Please try again."
msgstr ""
@@ -12060,7 +12248,7 @@ msgid "Dynamic Application Security Testing (DAST)"
msgstr ""
msgid "E-mail:"
-msgstr ""
+msgstr "E-post:"
msgid "Each project can also have an issue tracker and a wiki."
msgstr ""
@@ -12078,7 +12266,7 @@ msgid "Edit Comment"
msgstr "Rediger kommentar"
msgid "Edit Deploy Key"
-msgstr ""
+msgstr "Rediger distribusjonsnøkkel"
msgid "Edit Geo Node"
msgstr ""
@@ -12087,7 +12275,7 @@ msgid "Edit Group Hook"
msgstr "Rediger gruppekrok"
msgid "Edit Identity"
-msgstr ""
+msgstr "Rediger identitet"
msgid "Edit Label"
msgstr "Rediger stempel"
@@ -12147,10 +12335,10 @@ msgid "Edit identity for %{user_name}"
msgstr "Rediger identiteten til %{user_name}"
msgid "Edit in Web IDE"
-msgstr ""
+msgstr "Rediger i nett-IDE"
msgid "Edit in single-file editor"
-msgstr ""
+msgstr "Rediger i enkeltfil-redigerer"
msgid "Edit inline"
msgstr ""
@@ -12158,26 +12346,29 @@ msgstr ""
msgid "Edit issues"
msgstr "Rediger saker"
+msgid "Edit merge requests"
+msgstr ""
+
msgid "Edit public deploy key"
msgstr ""
msgid "Edit sidebar"
-msgstr ""
+msgstr "Rediger sidepanel"
msgid "Edit table"
-msgstr ""
+msgstr "Rediger tabell"
msgid "Edit this file only."
-msgstr ""
+msgstr "Rediger kun denne filen."
msgid "Edit this release"
msgstr "Rediger denne utgivelsen"
msgid "Edit title and description"
-msgstr ""
+msgstr "Rediger tittel og beskrivelse"
msgid "Edit user: %{user_name}"
-msgstr ""
+msgstr "Rediger bruker: %{user_name}"
msgid "Edit wiki page"
msgstr "Rediger wiki-side"
@@ -12186,7 +12377,7 @@ msgid "Edit your most recent comment in a thread (from an empty textarea)"
msgstr ""
msgid "Edited"
-msgstr ""
+msgstr "Redigert"
msgid "Edited %{timeago}"
msgstr "Redigert %{timeago}"
@@ -12195,7 +12386,7 @@ msgid "Editing"
msgstr "Redigerer"
msgid "Elapsed time"
-msgstr ""
+msgstr "Forløpt tid"
msgid "Elasticsearch AWS IAM credentials"
msgstr ""
@@ -12233,6 +12424,9 @@ msgstr "Ingen. Velg navneområder å indeksere."
msgid "Elastic|None. Select projects to index."
msgstr "Ingen. Velg prosjekter å indeksere."
+msgid "Eligible users"
+msgstr ""
+
msgid "Email"
msgstr "E-post"
@@ -12273,13 +12467,13 @@ msgid "Email the pipeline status to a list of recipients."
msgstr ""
msgid "Email updates (optional)"
-msgstr ""
+msgstr "E-postoppdateringer (valgfritt)"
msgid "Email:"
-msgstr ""
+msgstr "E-post:"
msgid "Email: %{email}"
-msgstr ""
+msgstr "E-post: %{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 ""
@@ -12362,6 +12556,9 @@ msgstr "Tom fil"
msgid "Enable"
msgstr "Slå på"
+msgid "Enable Amazon EKS integration"
+msgstr ""
+
msgid "Enable Auto DevOps"
msgstr "Aktiver Auto DevOps"
@@ -12369,19 +12566,19 @@ msgid "Enable Git pack file bitmap creation"
msgstr ""
msgid "Enable Gitpod"
-msgstr ""
+msgstr "Skru på Gitpod"
msgid "Enable Gitpod?"
-msgstr ""
+msgstr "Vil du skru på Gitpod?"
msgid "Enable Invisible Captcha during sign up"
msgstr ""
msgid "Enable Kroki"
-msgstr ""
+msgstr "Skru på Kroki"
msgid "Enable Mailgun event receiver"
-msgstr ""
+msgstr "Skru på Mailgun-hendelsesmottaker"
msgid "Enable PlantUML"
msgstr "Skru på PlantUML"
@@ -12393,6 +12590,9 @@ msgid "Enable Registration Features"
msgstr ""
msgid "Enable SSL verification"
+msgstr "Skru på SSL-verifisering"
+
+msgid "Enable Service Ping"
msgstr ""
msgid "Enable Snowplow tracking"
@@ -12414,7 +12614,7 @@ msgid "Enable access to the performance bar for non-administrators in a given gr
msgstr ""
msgid "Enable admin mode"
-msgstr ""
+msgstr "Skru på admin-modus"
msgid "Enable and disable Service Desk. Some additional configuration might be required. %{link_start}Learn more%{link_end}."
msgstr ""
@@ -12425,9 +12625,12 @@ msgstr ""
msgid "Enable authenticated Git LFS request rate limit"
msgstr ""
-msgid "Enable authentication"
+msgid "Enable authenticated web request rate limit"
msgstr ""
+msgid "Enable authentication"
+msgstr "Skru på autentisering"
+
msgid "Enable automatic repository housekeeping"
msgstr ""
@@ -12441,7 +12644,7 @@ msgid "Enable delayed project deletion by default for newly-created groups."
msgstr ""
msgid "Enable email notification"
-msgstr ""
+msgstr "Skru på E-postvarsler"
msgid "Enable error tracking"
msgstr "Skru på feilsporing"
@@ -12485,7 +12688,7 @@ msgstr ""
msgid "Enable or disable the Pseudonymizer data collection."
msgstr ""
-msgid "Enable or disable version check and service ping."
+msgid "Enable or disable version check and Service Ping."
msgstr ""
msgid "Enable protected paths rate limit"
@@ -12495,20 +12698,14 @@ msgid "Enable proxy"
msgstr "Skru på mellomtjener"
msgid "Enable reCAPTCHA"
-msgstr ""
-
-msgid "Enable reCAPTCHA for login"
-msgstr ""
+msgstr "Skru på reCAPTCHA"
-msgid "Enable reCAPTCHA, Invisible Captcha, Akismet and set IP limits. For reCAPTCHA, we currently only support %{recaptcha_v2_link_start}v2%{recaptcha_v2_link_end}"
+msgid "Enable reCAPTCHA for login."
msgstr ""
msgid "Enable repository checks"
msgstr ""
-msgid "Enable service ping"
-msgstr ""
-
msgid "Enable shared runners for all projects and subgroups in this group."
msgstr ""
@@ -12530,12 +12727,15 @@ msgstr "Skru på 2-trinnsautentisering"
msgid "Enable unauthenticated API request rate limit"
msgstr ""
-msgid "Enable unauthenticated request rate limit"
+msgid "Enable unauthenticated web request rate limit"
msgstr ""
-msgid "Enable version check"
+msgid "Enable user deactivation emails"
msgstr ""
+msgid "Enable version check"
+msgstr "Skru på versjonssjekk"
+
msgid "EnableReviewApp|%{stepStart}Step 1%{stepEnd}. Ensure you have Kubernetes set up and have a base domain for your %{linkStart}cluster%{linkEnd}."
msgstr ""
@@ -12566,9 +12766,6 @@ msgstr ""
msgid "Enabled sources for code import during project creation. OmniAuth must be configured for GitHub"
msgstr ""
-msgid "Enabling this will only make licensed EE features available to projects if the project namespace's plan includes the feature or if the project is public."
-msgstr ""
-
msgid "Encountered an error while rendering: %{err}"
msgstr ""
@@ -12576,16 +12773,16 @@ msgid "End Time"
msgstr "Sluttid"
msgid "Ends"
-msgstr ""
+msgstr "Slutter"
msgid "Ends at (UTC)"
msgstr "Slutter den (UTC)"
msgid "Ends on"
-msgstr ""
+msgstr "Slutter den"
msgid "Ends: %{endsAt}"
-msgstr ""
+msgstr "Slutter: %{endsAt}"
msgid "Enforce DNS rebinding attack protection"
msgstr ""
@@ -12617,9 +12814,6 @@ msgstr "Skriv inn 2FA for adminmodus"
msgid "Enter Admin Mode"
msgstr "GÃ¥ inn i adminmodus"
-msgid "Enter IP address range"
-msgstr "Skriv inn IP-adresseområde"
-
msgid "Enter a number"
msgstr "Skriv inn et nummer"
@@ -12632,9 +12826,6 @@ msgstr ""
msgid "Enter at least three characters to search"
msgstr "Skriv inn minst tre tegn for å søke"
-msgid "Enter domain"
-msgstr "Skriv inn domene"
-
msgid "Enter in your Bitbucket Server URL and personal access token below"
msgstr ""
@@ -12642,7 +12833,7 @@ msgid "Enter in your Phabricator Server URL and personal access token below"
msgstr ""
msgid "Enter merge request URLs"
-msgstr ""
+msgstr "Skriv inn fletteforespørsels-URL-er"
msgid "Enter new AWS Secret Access Key"
msgstr ""
@@ -12663,7 +12854,7 @@ msgid "Enter the code from the two-factor app on your mobile device. If you've l
msgstr ""
msgid "Enter the name of your application, and we'll return a unique %{type}."
-msgstr ""
+msgstr "Skriv inn navnet til programmet ditt, så returnerer vi en unik %{type}."
msgid "Enter the number of seconds, or other human-readable input, like \"1 hour\". This timeout takes precedence over lower timeouts set for the project."
msgstr ""
@@ -12681,7 +12872,7 @@ msgid "Enter your password to approve"
msgstr ""
msgid "Enterprise"
-msgstr ""
+msgstr "Bedrift"
msgid "Environment"
msgstr "Miljø"
@@ -12741,7 +12932,7 @@ msgid "EnvironmentsDashboard|Add projects"
msgstr "Legg til prosjekter"
msgid "EnvironmentsDashboard|Environments Dashboard"
-msgstr ""
+msgstr "Miljøkontrollpanel"
msgid "EnvironmentsDashboard|Job: %{job}"
msgstr "Jobb: %{job}"
@@ -12792,7 +12983,7 @@ msgid "Environments|Auto stops %{autoStopAt}"
msgstr ""
msgid "Environments|Commit"
-msgstr ""
+msgstr "Commit"
msgid "Environments|Currently showing %{fetched} results."
msgstr ""
@@ -12813,7 +13004,7 @@ msgid "Environments|Deleting the '%{environmentName}' environment cannot be undo
msgstr ""
msgid "Environments|Deploy to..."
-msgstr ""
+msgstr "Distribuer til …"
msgid "Environments|Deployment"
msgstr ""
@@ -12821,9 +13012,6 @@ msgstr ""
msgid "Environments|Deployment %{status}"
msgstr ""
-msgid "Environments|Dismiss"
-msgstr ""
-
msgid "Environments|Enable review app"
msgstr ""
@@ -12836,9 +13024,6 @@ msgstr "Miljøer"
msgid "Environments|Environments are places where code gets deployed, such as staging or production."
msgstr ""
-msgid "Environments|Help us improve environments"
-msgstr ""
-
msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
msgstr ""
@@ -12875,6 +13060,9 @@ msgstr "Ingen podder å vise"
msgid "Environments|Note that this action will stop the environment, but it will %{emphasisStart}not%{emphasisEnd} have an effect on any existing deployment due to no “stop environment action†being defined in the %{ciConfigLinkStart}.gitlab-ci.yml%{ciConfigLinkEnd} file."
msgstr "Merk at denne handlingen vil stoppe miljøet, men det vil %{emphasisStart}ikke%{emphasisEnd} ha en effekt på noen eksisterende distribusjoner fordi ingen «Stopp miljøhandling» er definert i %{ciConfigLinkStart}.gitlab-ci.yml%{ciConfigLinkEnd}-filen."
+msgid "Environments|Open"
+msgstr ""
+
msgid "Environments|Open live environment"
msgstr ""
@@ -12891,7 +13079,7 @@ msgid "Environments|Re-deploy to environment"
msgstr ""
msgid "Environments|Rollback"
-msgstr ""
+msgstr "Tilbakeføring"
msgid "Environments|Rollback environment"
msgstr ""
@@ -12914,9 +13102,6 @@ msgstr "Stopp miljø"
msgid "Environments|Stopping %{environmentName}"
msgstr ""
-msgid "Environments|Take the survey"
-msgstr ""
-
msgid "Environments|There was an error fetching the logs. Please try again."
msgstr "Det oppstod en feil under innhenting av loggfilene. Vennligst prøv igjen."
@@ -12927,7 +13112,7 @@ msgid "Environments|This action will run the job defined by %{name} for commit %
msgstr "Denne handlingen vil kjøre jobben som er definert av %{name} for innsmettingen %{linkStart}%{commitId}%{linkEnd}, som setter miljøet til en tidligere versjon. Du kan tilbakestille det ved å distribuere den nyeste versjonen av applikasjonen på nytt. Er du sikker på at du vil fortsette?"
msgid "Environments|Upcoming"
-msgstr ""
+msgstr "Kommende"
msgid "Environments|Upcoming deployment"
msgstr ""
@@ -12938,11 +13123,8 @@ msgstr "Oppdatert"
msgid "Environments|You don't have any environments right now"
msgstr "Du har ingen miljøer akkurat nå"
-msgid "Environments|Your feedback helps GitLab make environments better for you and other users. Participate and enter a sweepstake to win a USD 30 gift card."
-msgstr ""
-
msgid "Environments|by %{avatar}"
-msgstr ""
+msgstr "av %{avatar}"
msgid "Environments|protected"
msgstr "beskyttet"
@@ -12951,13 +13133,13 @@ msgid "Epic"
msgstr "Epos"
msgid "Epic Boards"
-msgstr ""
+msgstr "Epose-bord"
msgid "Epic cannot be found."
msgstr "Eposen ble ikke funnet."
msgid "Epic details"
-msgstr ""
+msgstr "Epos-detaljer"
msgid "Epic events"
msgstr "Epos-hendelser"
@@ -12978,13 +13160,13 @@ msgid "Epics let you manage your portfolio of projects more efficiently and with
msgstr ""
msgid "Epics, issues, and merge requests"
-msgstr ""
+msgstr "Eposer, saker og fletteforespørsler"
msgid "Epics|%{startDate} – %{dueDate}"
-msgstr ""
+msgstr "%{startDate} – %{dueDate}"
msgid "Epics|%{startDate} – No due date"
-msgstr ""
+msgstr "%{startDate} – Ingen forfallsdato"
msgid "Epics|Add a new epic"
msgstr "Legg til et nytt epos"
@@ -13002,7 +13184,7 @@ msgid "Epics|Are you sure you want to remove %{bStart}%{targetIssueTitle}%{bEnd}
msgstr ""
msgid "Epics|Assign Epic"
-msgstr ""
+msgstr "Tilordne epos"
msgid "Epics|Enter a title for your epic"
msgstr "Skriv inn en tittel på eposet ditt"
@@ -13014,7 +13196,7 @@ msgid "Epics|Leave empty to inherit from milestone dates"
msgstr ""
msgid "Epics|No start date – %{dueDate}"
-msgstr ""
+msgstr "Ingen startdato – %{dueDate}"
msgid "Epics|Remove epic"
msgstr "Fjern epos"
@@ -13026,7 +13208,7 @@ msgid "Epics|Search epics"
msgstr ""
msgid "Epics|Select epic"
-msgstr ""
+msgstr "Velg epos"
msgid "Epics|Show more"
msgstr "Vis mer"
@@ -13074,7 +13256,7 @@ msgid "Epics|Unable to save epic. Please try again"
msgstr "Klarte ikke å lagre eposet. Vennligst prøv igjen"
msgid "Epics|due"
-msgstr ""
+msgstr "forfall"
msgid "Epics|start"
msgstr "start"
@@ -13095,7 +13277,7 @@ msgid "Error creating label."
msgstr "Feil ved oppretting av stempel."
msgid "Error creating new iteration"
-msgstr ""
+msgstr "Feil under opprettelse av ny iterasjon"
msgid "Error creating repository for snippet with id %{snippet_id}"
msgstr ""
@@ -13152,7 +13334,7 @@ msgid "Error loading issues"
msgstr "Feil under innlasting av saker"
msgid "Error loading iterations"
-msgstr ""
+msgstr "Feil under innlasting av iterasjoner"
msgid "Error loading last commit."
msgstr "Feil under innlasting av nyeste commit."
@@ -13223,7 +13405,7 @@ msgstr ""
msgid "Error parsing CSV file. Please make sure it has"
msgstr ""
-msgid "Error rendering markdown preview"
+msgid "Error rendering Markdown preview"
msgstr ""
msgid "Error saving label update."
@@ -13271,6 +13453,9 @@ msgstr ""
msgid "Error: %{error_message}"
msgstr "Feil: %{error_message}"
+msgid "Error: Couldn't load some or all of the changes."
+msgstr ""
+
msgid "Error: No AWS credentials were supplied"
msgstr ""
@@ -13302,6 +13487,9 @@ msgid "ErrorTracking|Connection failed. Check Auth Token and try again."
msgstr ""
msgid "ErrorTracking|Enable error tracking"
+msgstr "Skru på feilsporing"
+
+msgid "ErrorTracking|Error tracking backend"
msgstr ""
msgid "ErrorTracking|If you self-host Sentry, enter your Sentry instance's full URL. If you use Sentry's hosted solution, enter https://sentry.io"
@@ -13337,6 +13525,12 @@ msgstr ""
msgid "Escalation policies must have at least one rule"
msgstr ""
+msgid "EscalationPolicies|%{clockIcon} IF alert is not %{alertStatus} in %{minutes}"
+msgstr ""
+
+msgid "EscalationPolicies|%{notificationIcon} THEN %{doAction} %{forScheduleOrUser}"
+msgstr ""
+
msgid "EscalationPolicies|+ Add an additional rule"
msgstr ""
@@ -13356,7 +13550,7 @@ msgid "EscalationPolicies|Add escalation policy"
msgstr ""
msgid "EscalationPolicies|Add policy"
-msgstr ""
+msgstr "Legg til retningslinje"
msgid "EscalationPolicies|Are you sure you want to delete the \"%{escalationPolicy}\" escalation policy? This action cannot be undone."
msgstr ""
@@ -13379,13 +13573,13 @@ msgstr ""
msgid "EscalationPolicies|Escalation policies"
msgstr ""
-msgid "EscalationPolicies|Escalation rules"
+msgid "EscalationPolicies|Escalation policy %{obstacle} in Project %{project}"
msgstr ""
-msgid "EscalationPolicies|Failed to load oncall-schedules"
+msgid "EscalationPolicies|Escalation rules"
msgstr ""
-msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} %{then} THEN %{doAction} %{scheduleOrUser}"
+msgid "EscalationPolicies|Failed to load oncall-schedules"
msgstr ""
msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} minutes"
@@ -13401,7 +13595,7 @@ msgid "EscalationPolicies|Remove escalation rule"
msgstr ""
msgid "EscalationPolicies|Search for user"
-msgstr ""
+msgstr "Søk etter bruker"
msgid "EscalationPolicies|Select schedule"
msgstr ""
@@ -13422,7 +13616,7 @@ msgid "EscalationPolicies|This policy has no escalation rules."
msgstr ""
msgid "EscalationPolicies|mins"
-msgstr ""
+msgstr "min"
msgid "Estimate"
msgstr "Estimat"
@@ -13431,7 +13625,7 @@ msgid "Estimated"
msgstr "Anslått"
msgid "EventFilterBy|Filter by all"
-msgstr ""
+msgstr "Filtrer etter alle"
msgid "EventFilterBy|Filter by comments"
msgstr "Filtrer etter kommentarer"
@@ -13463,18 +13657,36 @@ msgstr "Hendelser"
msgid "Every %{action} attempt has failed: %{job_error_message}. Please try again."
msgstr ""
+msgid "Every 3 months"
+msgstr ""
+
+msgid "Every 3 months on the %{day} at %{time} %{timezone}"
+msgstr ""
+
+msgid "Every 6 months"
+msgstr ""
+
+msgid "Every 6 months on the %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Every day"
msgstr "Hver dag"
msgid "Every day (at %{time})"
msgstr "Hver dag (kl. %{time})"
+msgid "Every day at %{time} %{timezone}"
+msgstr ""
+
msgid "Every month"
msgstr "Hver måned"
msgid "Every month (Day %{day} at %{time})"
msgstr "Hver måned (Dag %{day} kl. %{time})"
+msgid "Every month on the %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Every three months"
msgstr "Hver 3. måned"
@@ -13483,12 +13695,21 @@ msgstr "Annenhver uke"
msgid "Every week"
msgid_plural "Every %d weeks"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "Hver uke"
+msgstr[1] "Hver %d. uke"
msgid "Every week (%{weekday} at %{time})"
msgstr "Hver uke (%{weekday} kl. %{time})"
+msgid "Every week on %{day} at %{time} %{timezone}"
+msgstr ""
+
+msgid "Every year"
+msgstr ""
+
+msgid "Every year on %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Everyone"
msgstr "Alle"
@@ -13525,9 +13746,6 @@ msgstr ""
msgid "Exactly one of %{attributes} is required"
msgstr ""
-msgid "Example: %{ip_address}. %{read_more_link}."
-msgstr "Eksempel: %{ip_address}. %{read_more_link}."
-
msgid "Example: @sub\\.company\\.com$"
msgstr "Eksempel: @sub\\.firma\\.com$"
@@ -13538,10 +13756,10 @@ msgid "Except policy:"
msgstr ""
msgid "Exceptions"
-msgstr ""
+msgstr "Unntak"
msgid "Excess storage"
-msgstr ""
+msgstr "Overflødig lagring"
msgid "Excluding merge commits. Limited to %{limit} commits."
msgstr "Ekskludert innflettings-commiter. Begrenset til %{limit} commiter."
@@ -13550,7 +13768,7 @@ msgid "Excluding merge commits. Limited to 6,000 commits."
msgstr "Ekskludert innflettings-commiter. Begrenset til 6 000 commiter."
msgid "Execution time"
-msgstr ""
+msgstr "Iverksettelsestid"
msgid "Existing branch name, tag, or commit SHA"
msgstr "Eksisterende greinnavn, etikett, eller commit-SHA"
@@ -13571,19 +13789,19 @@ msgid "Expand all"
msgstr "Utvid alle"
msgid "Expand all files"
-msgstr ""
+msgstr "Utvid alle filer"
msgid "Expand all threads"
-msgstr ""
+msgstr "Utvid alle tråder"
msgid "Expand approvers"
msgstr "Utvid godkjennere"
msgid "Expand file"
-msgstr ""
+msgstr "Utvid filen"
msgid "Expand issues"
-msgstr ""
+msgstr "Utvid saker"
msgid "Expand milestones"
msgstr "Utvid milepæler"
@@ -13594,15 +13812,15 @@ msgstr ""
msgid "Expand pipeline"
msgstr ""
+msgid "Expand settings section"
+msgstr ""
+
msgid "Expand sidebar"
msgstr "Utvid sidepanelet"
msgid "Expected documents: %{expected_documents}"
msgstr "Forventede dokumenter: %{expected_documents}"
-msgid "Experienced"
-msgstr "Erfaren"
-
msgid "ExperimentSubject|Must have exactly one of User, Namespace, or Project."
msgstr ""
@@ -13658,7 +13876,7 @@ msgid "Export"
msgstr "Eksporter"
msgid "Export %{name}"
-msgstr ""
+msgstr "Eksporter %{name}"
msgid "Export %{requirementsCount} requirements?"
msgstr ""
@@ -13682,13 +13900,13 @@ msgid "Export this group with all related data to a new GitLab instance. Once co
msgstr ""
msgid "Export this project with all its related data in order to move it to a new GitLab instance. When the exported file is ready, you can download it from this page or from the download link in the email notification you will receive. You can then import it when creating a new project. %{link_start}Learn more.%{link_end}"
-msgstr ""
+msgstr "Eksporter dette prosjektet med alle dens relaterte data for å kunne flytte den til en ny GitLab-instans. Når den eksporterte filen er klar, kan du laste den ned fra denne siden eller fra nedlastingslenken i E-postvarslet du vil motta. Du kan deretter importere den når du oppretter et nytt prosjekt. %{link_start}Lær mer.%{link_end}"
msgid "Export variable to pipelines running on protected branches and tags only."
msgstr ""
msgid "Exported requirements"
-msgstr ""
+msgstr "Eksporterte krav"
msgid "External Classification Policy Authorization"
msgstr ""
@@ -13700,7 +13918,7 @@ msgid "External URL"
msgstr "Ekstern URL"
msgid "External User:"
-msgstr ""
+msgstr "Ekstern bruker:"
msgid "External authentication"
msgstr "Ekstern autentisering"
@@ -13736,7 +13954,7 @@ msgid "ExternalWikiService|Link to an external wiki from the sidebar."
msgstr ""
msgid "ExternalWikiService|https://example.com/xxx/wiki/..."
-msgstr ""
+msgstr "https://example.com/xxx/wiki/..."
msgid "Facebook"
msgstr "Facebook"
@@ -13748,7 +13966,7 @@ msgid "Failed Jobs"
msgstr "Mislykkede jobber"
msgid "Failed on"
-msgstr ""
+msgstr "Mislyktes den"
msgid "Failed to add a Zoom meeting"
msgstr "Mislyktes i å legge til et Zoom-møte"
@@ -13811,7 +14029,7 @@ msgid "Failed to create wiki"
msgstr "Mislyktes i å opprette wiki"
msgid "Failed to deploy to"
-msgstr ""
+msgstr "Klarte ikke å distribuere til"
msgid "Failed to enqueue the rebase operation, possibly due to a long-lived transaction. Try again later."
msgstr ""
@@ -13868,13 +14086,13 @@ msgid "Failed to load groups, users and deploy keys."
msgstr ""
msgid "Failed to load iterations."
-msgstr ""
+msgstr "Mislyktes i å laste inn iterasjoner."
msgid "Failed to load labels. Please try again."
msgstr "Mislyktes i å laste inn stempler. Vennligst prøv igjen."
msgid "Failed to load milestones."
-msgstr ""
+msgstr "Mislyktes i å laste inn milepæler."
msgid "Failed to load milestones. Please try again."
msgstr "Mislyktes i å laste inn milepæler. Vennligst prøv igjen."
@@ -13885,9 +14103,6 @@ msgstr ""
msgid "Failed to load related branches"
msgstr "Klarte ikke å laste inn relaterte grener"
-msgid "Failed to load sidebar lock status"
-msgstr ""
-
msgid "Failed to load stacktrace."
msgstr ""
@@ -14021,10 +14236,10 @@ msgid "Favicon will be removed. Are you sure?"
msgstr ""
msgid "Feature Flags"
-msgstr ""
+msgstr "Funksjonsflagg"
msgid "Feature flag status"
-msgstr ""
+msgstr "Funksjonsflaggstatus"
msgid "Feature flag was not removed."
msgstr ""
@@ -14167,7 +14382,7 @@ msgid "FeatureFlags|New Feature Flag"
msgstr "Nytt funksjonsflagg"
msgid "FeatureFlags|New User List"
-msgstr ""
+msgstr "Ny brukerliste"
msgid "FeatureFlags|New feature flag"
msgstr "Nytt funksjonsflagg"
@@ -14176,7 +14391,7 @@ msgid "FeatureFlags|No user list selected"
msgstr ""
msgid "FeatureFlags|Percent of users"
-msgstr ""
+msgstr "Prosent av brukerne"
msgid "FeatureFlags|Percent rollout"
msgstr ""
@@ -14212,7 +14427,7 @@ msgid "FeatureFlags|User List"
msgstr "Brukerliste"
msgid "FeatureFlags|User Lists"
-msgstr ""
+msgstr "Brukerlister"
msgid "FeatureFlags|View user lists"
msgstr ""
@@ -14236,7 +14451,7 @@ msgid "FeatureFlag|User IDs"
msgstr "Bruker-ID-er"
msgid "FeatureFlag|User List"
-msgstr ""
+msgstr "Brukerliste"
msgid "FeatureHighlight|%{daysRemaining} day remaining to enjoy %{featureName}"
msgid_plural "FeatureHighlight|%{daysRemaining} days remaining to enjoy %{featureName}"
@@ -14312,6 +14527,9 @@ msgstr "Filnavn"
msgid "Files"
msgstr "Filer"
+msgid "Files API Rate Limits"
+msgstr ""
+
msgid "Files breadcrumb"
msgstr ""
@@ -14328,7 +14546,7 @@ msgid "Filter"
msgstr "Filter"
msgid "Filter by"
-msgstr ""
+msgstr "Filtrer etter"
msgid "Filter by %{issuable_type} that are currently closed."
msgstr "Filtrer etter %{issuable_type} som for øyeblikket er stengt."
@@ -14346,7 +14564,7 @@ msgid "Filter by issues that are currently closed."
msgstr ""
msgid "Filter by issues that are currently opened."
-msgstr ""
+msgstr "Filtrer etter saker som er åpne for øyeblikket."
msgid "Filter by label"
msgstr "Filtrer etter stempel"
@@ -14394,7 +14612,7 @@ msgid "Filter results..."
msgstr "Filtrer resultater …"
msgid "Filter users"
-msgstr ""
+msgstr "Filtrer brukere"
msgid "Filter your repositories by name"
msgstr ""
@@ -14433,7 +14651,7 @@ msgid "Finished"
msgstr "Fullført"
msgid "Finished at"
-msgstr ""
+msgstr "Fullført den"
msgid "First Seen"
msgstr "Først sett"
@@ -14475,7 +14693,7 @@ msgid "FloC|Federated Learning of Cohorts"
msgstr ""
msgid "FlowdockService|1b609b52537..."
-msgstr ""
+msgstr "1b609b52537..."
msgid "FlowdockService|Send event notifications from GitLab to Flowdock flows."
msgstr ""
@@ -14505,13 +14723,13 @@ msgid "Folder/%{name}"
msgstr "Mappe/%{name}"
msgid "Follow"
-msgstr ""
+msgstr "Følg"
msgid "Followed Users' Activity"
msgstr ""
msgid "Followed users"
-msgstr ""
+msgstr "Fulgte brukere"
msgid "Font Color"
msgstr "Skriftfarge"
@@ -14538,7 +14756,7 @@ msgid "For example, the application using the token or the purpose of the token.
msgstr ""
msgid "For general work"
-msgstr ""
+msgstr "For generelt arbeid"
msgid "For individual use, create a separate account under your personal email address, not tied to the Enterprise email domain or group."
msgstr ""
@@ -14577,40 +14795,40 @@ msgid "Fork project?"
msgstr "Vil du utgreine prosjektet?"
msgid "ForkProject|A fork is a copy of a project."
-msgstr ""
+msgstr "En utgreining er en kopi av et prosjekt."
msgid "ForkProject|An error occurred while forking the project. Please try again."
msgstr ""
msgid "ForkProject|Cancel"
-msgstr ""
+msgstr "Avbryt"
msgid "ForkProject|Create a group"
-msgstr ""
+msgstr "Lag en gruppe"
msgid "ForkProject|Fork project"
-msgstr ""
+msgstr "Avgrein prosjekt"
msgid "ForkProject|Forking a repository allows you to make changes without affecting the original project."
msgstr ""
msgid "ForkProject|Internal"
-msgstr ""
+msgstr "Intern"
msgid "ForkProject|Please select a namespace"
-msgstr ""
+msgstr "Vennligst velg et navneområde"
msgid "ForkProject|Please select a visibility level"
-msgstr ""
+msgstr "Vennligst velg et synlighetsnivå"
msgid "ForkProject|Private"
-msgstr ""
+msgstr "Privat"
msgid "ForkProject|Project access must be granted explicitly to each user. If this project is part of a group, access will be granted to members of the group."
msgstr ""
msgid "ForkProject|Public"
-msgstr ""
+msgstr "Offentlig"
msgid "ForkProject|Select a namespace"
msgstr ""
@@ -14625,16 +14843,16 @@ msgid "ForkProject|The project can be accessed without any authentication."
msgstr ""
msgid "ForkProject|Visibility level"
-msgstr ""
+msgstr "Synlighetsnivå"
msgid "ForkProject|Want to house several dependent projects under the same namespace?"
msgstr ""
msgid "ForkSuggestion|Cancel"
-msgstr ""
+msgstr "Avbryt"
msgid "ForkSuggestion|Fork"
-msgstr ""
+msgstr "Utgreining"
msgid "ForkSuggestion|You can’t %{edit_start}edit%{edit_end} files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
@@ -14700,7 +14918,7 @@ msgid "From merge request merge until deploy to production"
msgstr ""
msgid "Full"
-msgstr ""
+msgstr "Full"
msgid "Full name"
msgstr "Fullt navn"
@@ -14745,19 +14963,19 @@ msgid "Generate site and private keys at"
msgstr ""
msgid "Generic"
-msgstr ""
+msgstr "Generisk"
msgid "Generic package file size in bytes"
msgstr ""
msgid "GenericReport|After"
-msgstr ""
+msgstr "Etter"
msgid "GenericReport|Before"
-msgstr ""
+msgstr "Før"
msgid "GenericReport|Diff"
-msgstr ""
+msgstr "Forskjeller"
msgid "Geo"
msgstr "Geo"
@@ -14778,7 +14996,7 @@ msgid "Geo|%{component} synced"
msgstr ""
msgid "Geo|%{component} verified"
-msgstr ""
+msgstr "%{component} verifisert"
msgid "Geo|%{label} can't be blank"
msgstr "%{label} kan ikke være tom"
@@ -14802,10 +15020,10 @@ msgid "Geo|%{title} checksum progress"
msgstr ""
msgid "Geo|(%{timeAgo})"
-msgstr ""
+msgstr "(%{timeAgo})"
msgid "Geo|Add site"
-msgstr ""
+msgstr "Legg til nettsted"
msgid "Geo|Adjust your filters/search criteria above. If you believe this may be an error, please refer to the %{linkStart}Geo Troubleshooting%{linkEnd} documentation for more information."
msgstr "Juster dine filtre/søkekriterier ovenfor. Hvis du mener at dette kan være en feil, kan du se dokumentasjonen for %{linkStart}Geo-feilsøking%{linkEnd} for mer informasjon."
@@ -14856,13 +15074,13 @@ msgid "Geo|Data replication lag"
msgstr ""
msgid "Geo|Data type"
-msgstr ""
+msgstr "Datatype"
msgid "Geo|Disabled"
-msgstr ""
+msgstr "Skrudd av"
msgid "Geo|Discover GitLab Geo"
-msgstr ""
+msgstr "Oppdag GitLab Geo"
msgid "Geo|Does not match the primary storage configuration"
msgstr ""
@@ -14871,7 +15089,7 @@ msgid "Geo|Failed"
msgstr "Mislykket"
msgid "Geo|Filter by name"
-msgstr ""
+msgstr "Filtrer etter navn"
msgid "Geo|Filter by status"
msgstr "Filtrer etter status"
@@ -14892,7 +15110,7 @@ msgid "Geo|Go to the primary site"
msgstr "GÃ¥ til hovednettstedet"
msgid "Geo|Healthy"
-msgstr ""
+msgstr "Sunn"
msgid "Geo|If you want to make changes, you must visit the primary site."
msgstr ""
@@ -14904,7 +15122,7 @@ msgid "Geo|In sync"
msgstr "Synkronisert"
msgid "Geo|Internal URL"
-msgstr ""
+msgstr "Intern URL"
msgid "Geo|Last event ID from primary"
msgstr ""
@@ -14925,13 +15143,13 @@ msgid "Geo|Last time verified"
msgstr "Sist bekreftet"
msgid "Geo|Learn more about Geo"
-msgstr ""
+msgstr "Lær mer om Geo"
msgid "Geo|Learn more about Geo site statuses"
msgstr ""
msgid "Geo|Make everyone on your team more productive regardless of their location. GitLab Geo creates read-only mirrors of your GitLab instance so you can reduce the time it takes to clone and fetch large repos."
-msgstr ""
+msgstr "Gjør alle på teamet ditt mer produktive, uansett hvor de befinner seg. GitLab Geo oppretter skrivebeskyttede speilinger av din GitLab-instans, slik at du kan redusere tiden det tar å klone og hente store kodelagre."
msgid "Geo|Never"
msgstr "Aldri"
@@ -14958,10 +15176,10 @@ msgid "Geo|Nothing to synchronize"
msgstr ""
msgid "Geo|Nothing to verify"
-msgstr ""
+msgstr "Ingenting å verifisere"
msgid "Geo|Offline"
-msgstr ""
+msgstr "Frakoblet"
msgid "Geo|Pending synchronization"
msgstr "Avventer synkronisering"
@@ -14970,10 +15188,10 @@ msgid "Geo|Pending verification"
msgstr "Venter verifikasjon"
msgid "Geo|Primary node"
-msgstr ""
+msgstr "Hovednode"
msgid "Geo|Primary site"
-msgstr ""
+msgstr "Hovednettsted"
msgid "Geo|Project"
msgstr "Prosjekt"
@@ -14988,7 +15206,7 @@ msgid "Geo|Projects in certain storage shards"
msgstr "Prosjekter i visse lagringsskår"
msgid "Geo|Queued"
-msgstr ""
+msgstr "Stilt i kø"
msgid "Geo|Redownload"
msgstr "Laste ned på nytt"
@@ -15000,7 +15218,7 @@ msgid "Geo|Remove entry"
msgstr "Fjern oppføring"
msgid "Geo|Remove node"
-msgstr ""
+msgstr "Fjern node"
msgid "Geo|Remove tracking database entry"
msgstr ""
@@ -15036,16 +15254,16 @@ msgid "Geo|Resync"
msgstr "Synkroniser på nytt"
msgid "Geo|Resync all"
-msgstr ""
+msgstr "Omsynkroniser alle"
msgid "Geo|Resync all %{replicableType}"
msgstr ""
msgid "Geo|Resync all projects"
-msgstr ""
+msgstr "Synkroniser alle prosjekter på nytt"
msgid "Geo|Retry count"
-msgstr ""
+msgstr "Antall forsøk"
msgid "Geo|Reverify"
msgstr "Re-verifiser"
@@ -15054,19 +15272,19 @@ msgid "Geo|Reverify all"
msgstr "Re-verifiser alle"
msgid "Geo|Reverify all projects"
-msgstr ""
+msgstr "Verifiser alle prosjekter på nytt"
msgid "Geo|Review replication status, and resynchronize and reverify items with the primary site."
msgstr ""
msgid "Geo|Secondary node"
-msgstr ""
+msgstr "Sekundær node"
msgid "Geo|Secondary site"
-msgstr ""
+msgstr "Sekundært nettsted"
msgid "Geo|Selective (%{syncLabel})"
-msgstr ""
+msgstr "Selektiv (%{syncLabel})"
msgid "Geo|Site's status was updated %{timeAgo}."
msgstr ""
@@ -15084,16 +15302,16 @@ msgid "Geo|Synced at"
msgstr "Synkronisert den"
msgid "Geo|Synchronization"
-msgstr ""
+msgstr "Synkronisering"
msgid "Geo|Synchronization failed - %{error}"
msgstr "Synkronisering mislyktes - %{error}"
msgid "Geo|Synchronization settings"
-msgstr ""
+msgstr "Synkroniseringsinnstillinger"
msgid "Geo|Synchronization status"
-msgstr ""
+msgstr "Synkroniseringsstatus"
msgid "Geo|The database is currently %{db_lag} behind the primary site."
msgstr ""
@@ -15135,13 +15353,13 @@ msgid "Geo|URL must be a valid url (ex: https://gitlab.com)"
msgstr "URL-en må være en gyldig URL (f.eks. https://gitlab.com)"
msgid "Geo|Undefined"
-msgstr ""
+msgstr "Udefinert"
msgid "Geo|Unhealthy"
-msgstr ""
+msgstr "Usunn"
msgid "Geo|Unknown"
-msgstr ""
+msgstr "Ukjent"
msgid "Geo|Unknown state"
msgstr "Ukjent tilstand"
@@ -15150,7 +15368,7 @@ msgid "Geo|Updated %{timeAgo}"
msgstr ""
msgid "Geo|Verification"
-msgstr ""
+msgstr "Verifisering"
msgid "Geo|Verification failed - %{error}"
msgstr "Verifisering mislyktes - %{error}"
@@ -15159,10 +15377,10 @@ msgid "Geo|Verification information"
msgstr ""
msgid "Geo|Verification status"
-msgstr ""
+msgstr "Verifiseringsstatus"
msgid "Geo|Verified"
-msgstr ""
+msgstr "Verifisert"
msgid "Geo|Waiting for scheduler"
msgstr "Venter på planlegger"
@@ -15195,7 +15413,7 @@ msgid "Get started"
msgstr "Kom i gang"
msgid "Get started with GitLab"
-msgstr ""
+msgstr "Kom i gang med GitLab"
msgid "Get started with error tracking"
msgstr ""
@@ -15210,10 +15428,10 @@ msgid "Getting started with releases"
msgstr "Ã… sette i gang med utgivelser"
msgid "Git"
-msgstr ""
+msgstr "Git"
msgid "Git GC period"
-msgstr ""
+msgstr "Git-GC-periode"
msgid "Git LFS Rate Limits"
msgstr ""
@@ -15240,7 +15458,7 @@ msgid "Git shallow clone"
msgstr ""
msgid "Git strategy"
-msgstr ""
+msgstr "Git-strategi"
msgid "Git transfer in progress"
msgstr ""
@@ -15255,22 +15473,22 @@ msgid "GitHub import"
msgstr "GitHub-import"
msgid "GitHubImporter|*Merged by: %{author} at %{timestamp}*"
-msgstr ""
+msgstr "Innflettet av: %{author} kl. %{timestamp}*"
msgid "GitLab"
msgstr "GitLab"
msgid "GitLab / Unsubscribe"
-msgstr ""
+msgstr "GitLab / Avabonner"
msgid "GitLab API"
-msgstr ""
+msgstr "GitLab-API"
msgid "GitLab Account Request"
-msgstr ""
+msgstr "GitLab-kontoforespørsel"
msgid "GitLab Billing Team."
-msgstr ""
+msgstr "GitLab-faktureringsteamet."
msgid "GitLab Import"
msgstr "GitLab-importering"
@@ -15285,7 +15503,7 @@ msgid "GitLab Shell"
msgstr ""
msgid "GitLab Support Bot"
-msgstr ""
+msgstr "GitLab-brukerstøttebot"
msgid "GitLab Team Member"
msgstr "GitLab-teammedlem"
@@ -15309,6 +15527,9 @@ msgid "GitLab for Slack"
msgstr "GitLab for Slack"
msgid "GitLab group: %{source_link}"
+msgstr "GitLab-gruppe: %{source_link}"
+
+msgid "GitLab informs you if a new version is available."
msgstr ""
msgid "GitLab is a complete DevOps platform, delivered as a single application, fundamentally changing the way Development, Security, and Ops teams collaborate"
@@ -15326,21 +15547,18 @@ msgstr ""
msgid "GitLab is open source software to collaborate on code."
msgstr ""
-msgid "GitLab is undergoing maintenance and is operating in a read-only mode."
+msgid "GitLab is undergoing maintenance and is operating in read-only mode."
msgstr ""
msgid "GitLab member or Email address"
msgstr ""
msgid "GitLab metadata URL"
-msgstr ""
+msgstr "GitLab-metadata-URL"
msgid "GitLab project export"
msgstr "GitLab-prosjekteksportering"
-msgid "GitLab restart is required to apply changes."
-msgstr "GitLab-omstart er nødvendig for å benytte endringene."
-
msgid "GitLab single sign-on URL"
msgstr ""
@@ -15354,10 +15572,7 @@ msgid "GitLab uses %{linkStart}Sidekiq%{linkEnd} to process background jobs"
msgstr ""
msgid "GitLab version"
-msgstr ""
-
-msgid "GitLab will inform you if a new version is available."
-msgstr ""
+msgstr "GitLab-versjon"
msgid "GitLab will run a background job that will produce pseudonymized CSVs of the GitLab database that will be uploaded to your configured object storage directory."
msgstr "GitLab vil kjøre en bakgrunnsjobb som vil opprette pseudonymiserte CSV filer av GitLab-databasen. Disse vil bli lastet opp til den konfigurerte objektlagringskatalogen."
@@ -15426,7 +15641,7 @@ msgid "GitLabPages|Removing pages will prevent them from being exposed to the ou
msgstr ""
msgid "GitLabPages|Save changes"
-msgstr ""
+msgstr "Lagre endringer"
msgid "GitLabPages|Something went wrong while obtaining the Let's Encrypt certificate for %{domain}. To retry visit your %{link_start}domain details%{link_end}."
msgstr "Noe gikk galt under innhenting av Let's Encrypt-sertifikatet for %{domain}. Gå til dine %{link_start}domenedetaljer%{link_end} for å prøve på nytt."
@@ -15447,7 +15662,7 @@ msgid "GitLabPages|When enabled, all attempts to visit your website through HTTP
msgstr ""
msgid "GitLabPages|When using Pages under the general domain of a GitLab instance (%{pages_host}), you cannot use HTTPS with sub-subdomains. This means that if your username/groupname contains a dot it will not work. This is a limitation of the HTTP Over TLS protocol. HTTP pages will continue to work provided you don't redirect HTTP to HTTPS. %{docs_link_start}Learn more.%{link_end}"
-msgstr ""
+msgstr "Når du bruker Pages under det generelle domenet til en GitLab-instans (%{pages_host}), kan du ikke bruke HTTPS med under-underdomener. Dette betyr at hvis brukernavnet/gruppenavnet ditt inneholder en prikk, vil det ikke fungere. Dette er en begrensning for «HTTP-over-TLS»-protokollen. HTTP-sider vil fortsette å fungere, forutsatt at du ikke omdirigerer HTTP til HTTPS. %{docs_link_start}Lær mer.%{link_end}"
msgid "GitLabPages|With GitLab Pages you can host your static website directly from your GitLab repository. %{docs_link_start}Learn more.%{link_end}"
msgstr ""
@@ -15465,10 +15680,10 @@ msgid "Gitaly relative path:"
msgstr ""
msgid "Gitaly storage name:"
-msgstr ""
+msgstr "Gitaly-lagringsnavn:"
msgid "Gitaly timeouts"
-msgstr ""
+msgstr "Gitaly-tidsavbrudd"
msgid "Gitaly|Address"
msgstr "Adresse"
@@ -15498,13 +15713,13 @@ msgid "GithubIntegration|This requires mirroring your GitHub repository to this
msgstr ""
msgid "Gitpod"
-msgstr ""
+msgstr "Gitpod"
msgid "Gitpod|Enable Gitpod integration"
-msgstr ""
+msgstr "Skru på Gitpod-integrasjon"
msgid "Gitpod|Gitpod URL"
-msgstr ""
+msgstr "Gitpod-URL"
msgid "Gitpod|The URL to your Gitpod instance configured to read your GitLab projects, such as https://gitpod.example.com."
msgstr ""
@@ -15513,7 +15728,7 @@ msgid "Gitpod|To use the integration, each user must also enable Gitpod on their
msgstr ""
msgid "Gitpod|https://gitpod.example.com"
-msgstr ""
+msgstr "https://gitpod.example.com"
msgid "Given access %{time_ago}"
msgstr "Gitt tilgang %{time_ago}"
@@ -15549,7 +15764,7 @@ msgid "Go full screen"
msgstr "GÃ¥ til fullskjerm"
msgid "Go to %{source_name}"
-msgstr ""
+msgstr "GÃ¥ til %{source_name}"
msgid "Go to commits"
msgstr "GÃ¥ til commitene"
@@ -15579,7 +15794,7 @@ msgid "Go to fork"
msgstr "GÃ¥ til utgreiningen"
msgid "Go to issue boards"
-msgstr ""
+msgstr "GÃ¥ til saksbordene"
msgid "Go to issues"
msgstr "GÃ¥ til saker"
@@ -15597,16 +15812,16 @@ msgid "Go to metrics"
msgstr "Gå til målinger"
msgid "Go to next page"
-msgstr ""
+msgstr "GÃ¥ til neste side"
msgid "Go to parent"
msgstr ""
msgid "Go to previous page"
-msgstr ""
+msgstr "GÃ¥ til forrige side"
msgid "Go to primary site"
-msgstr ""
+msgstr "GÃ¥ til hovednettstedet"
msgid "Go to project"
msgstr "GÃ¥ til prosjekt"
@@ -15623,9 +15838,21 @@ msgstr "GÃ¥ til kodelagerdiagrammet"
msgid "Go to snippets"
msgstr "GÃ¥ til utdrag"
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check 'Allowed domains for sign-ups'."
+msgstr ""
+
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check 'Email restrictions for sign-ups'."
+msgstr ""
+
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check the 'Domain denylist'."
+msgstr ""
+
msgid "Go to the activity feed"
msgstr "Gå til aktivitetsstrømmen"
+msgid "Go to the group’s 'Settings &gt; General' page, and check 'Restrict membership by email domain'."
+msgstr ""
+
msgid "Go to the milestone list"
msgstr "Gå til milepælliste"
@@ -15662,6 +15889,12 @@ msgstr "GÃ¥ til utdragene dine"
msgid "Goal of the changes and what reviewers should be aware of"
msgstr ""
+msgid "Google Cloud"
+msgstr ""
+
+msgid "Google Cloud offers several deployment targets. Select the one most suitable for your project."
+msgstr ""
+
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
@@ -15678,7 +15911,7 @@ msgid "Grafana response contains invalid json"
msgstr ""
msgid "GrafanaIntegration|API token"
-msgstr ""
+msgstr "API-sjetong"
msgid "GrafanaIntegration|Active"
msgstr "Aktiv"
@@ -15711,10 +15944,10 @@ msgid "GraphViewType|Job dependencies"
msgstr ""
msgid "GraphViewType|Show dependencies"
-msgstr ""
+msgstr "Vis avhengigheter"
msgid "GraphViewType|Stage"
-msgstr ""
+msgstr "Trinn"
msgid "Gravatar"
msgstr "Gravatar"
@@ -15746,9 +15979,6 @@ msgstr "Gruppekroker"
msgid "Group ID"
msgstr "Gruppe-ID"
-msgid "Group ID: %{group_id}"
-msgstr "Gruppe-ID: %{group_id}"
-
msgid "Group Owner must have signed in with SAML before enabling Group Managed Accounts"
msgstr ""
@@ -15759,13 +15989,13 @@ msgid "Group URL"
msgstr "Gruppe-URL"
msgid "Group Wikis"
-msgstr ""
+msgstr "Gruppe-wikier"
msgid "Group application: %{name}"
-msgstr ""
+msgstr "Gruppeprogram: %{name}"
msgid "Group applications"
-msgstr ""
+msgstr "Gruppeprogrammer"
msgid "Group audit events"
msgstr ""
@@ -15792,34 +16022,34 @@ msgid "Group export link has expired. Please generate a new export from your gro
msgstr ""
msgid "Group export requests"
-msgstr ""
+msgstr "Gruppeeksportforespørsler"
msgid "Group export started. A download link will be sent by email and made available on this page."
msgstr ""
msgid "Group has been already marked for deletion"
-msgstr ""
+msgstr "Gruppen har allerede blitt markert for sletting"
msgid "Group has not been marked for deletion"
-msgstr ""
+msgstr "Gruppen har ikke blitt markert for sletting"
msgid "Group import could not be scheduled"
msgstr "Gruppeimport kunne ikke bli planlagt"
msgid "Group import requests"
-msgstr ""
+msgstr "Gruppeimportforespørsler"
msgid "Group info:"
msgstr "Gruppeinfo:"
msgid "Group information"
-msgstr ""
+msgstr "Gruppeinformasjon"
msgid "Group is required when cluster_type is :group"
msgstr ""
msgid "Group jobs by"
-msgstr ""
+msgstr "Gruppér jobber etter"
msgid "Group maintainers can register group runners in the %{link}"
msgstr ""
@@ -15843,10 +16073,10 @@ msgid "Group name (your organization)"
msgstr ""
msgid "Group navigation"
-msgstr ""
+msgstr "Gruppenavigasjon"
msgid "Group overview content"
-msgstr ""
+msgstr "Gruppeoversikts-innhold"
msgid "Group path is already taken. We've suggested one that is available."
msgstr ""
@@ -15861,7 +16091,7 @@ msgid "Group project URLs are prefixed with the group namespace"
msgstr ""
msgid "Group projects"
-msgstr ""
+msgstr "Gruppeprosjekter"
msgid "Group requires separate account"
msgstr ""
@@ -15894,16 +16124,16 @@ msgid "GroupActivityMetrics|Issues opened"
msgstr "Saker åpnet"
msgid "GroupActivityMetrics|Last 90 days"
-msgstr ""
+msgstr "Seneste 90 dager"
msgid "GroupActivityMetrics|Members added"
msgstr "Medlemmer lagt til"
msgid "GroupActivityMetrics|Merge Requests opened"
-msgstr ""
+msgstr "Fletteforespørsler åpnet"
msgid "GroupActivityMetrics|Recent activity"
-msgstr ""
+msgstr "Nylig aktivitet"
msgid "GroupImport|Failed to import group."
msgstr "Mislyktes i å importere gruppe."
@@ -15923,6 +16153,12 @@ msgstr "Gruppen ble vellykket importert."
msgid "GroupImport|Unable to process group import file"
msgstr ""
+msgid "GroupPage|Copy group ID"
+msgstr ""
+
+msgid "GroupPage|Group ID: %{group_id}"
+msgstr ""
+
msgid "GroupRoadmap|%{dateWord} – No end date"
msgstr "%{dateWord} - Ingen sluttdato"
@@ -15930,7 +16166,7 @@ msgid "GroupRoadmap|%{startDateInWords} – %{endDateInWords}"
msgstr "%{startDateInWords} - %{endDateInWords}"
msgid "GroupRoadmap|Loading epics"
-msgstr ""
+msgstr "Laster inn eposer"
msgid "GroupRoadmap|No start and end date"
msgstr "Ingen start- eller sluttdato"
@@ -15951,16 +16187,16 @@ msgid "GroupRoadmap|Something went wrong while fetching milestones"
msgstr "Noe gikk galt under innhenting av milepæler"
msgid "GroupRoadmap|Sorry, no epics matched your search"
-msgstr ""
+msgstr "Beklager, ingen eposer samsvarer med søket ditt"
msgid "GroupRoadmap|The roadmap shows the progress of your epics along a timeline"
msgstr ""
msgid "GroupRoadmap|This quarter"
-msgstr ""
+msgstr "Dette kvartalet"
msgid "GroupRoadmap|This year"
-msgstr ""
+msgstr "Nåværende år"
msgid "GroupRoadmap|To make your epics appear in the roadmap, add start or due dates to them."
msgstr ""
@@ -15975,6 +16211,9 @@ msgid "GroupRoadmap|To widen your search, change or remove filters; from %{start
msgstr ""
msgid "GroupRoadmap|Within 3 years"
+msgstr "Innen 3 år"
+
+msgid "GroupSAML|\"persistent\" recommended"
msgstr ""
msgid "GroupSAML|%{strongOpen}Warning%{strongClose} - Enabling %{linkStart}SSO enforcement%{linkEnd} can reduce security risks."
@@ -16035,7 +16274,7 @@ msgid "GroupSAML|Make sure you save this token — you won't be able to access i
msgstr ""
msgid "GroupSAML|Manage your group’s membership while adding another level of security with SAML."
-msgstr ""
+msgstr "Administrer din gruppes medlemskap samtidig som du legger til et annet nivå av sikkerhet med SAML."
msgid "GroupSAML|Members"
msgstr "Medlemmer"
@@ -16062,13 +16301,13 @@ msgid "GroupSAML|Role to assign members of this SAML group."
msgstr ""
msgid "GroupSAML|SAML Group Links"
-msgstr ""
+msgstr "SAML-gruppelenker"
msgid "GroupSAML|SAML Group Name"
-msgstr ""
+msgstr "SAML-gruppenavn"
msgid "GroupSAML|SAML Group Name: %{saml_group_name}"
-msgstr ""
+msgstr "SAML-gruppenavn: %{saml_group_name}"
msgid "GroupSAML|SAML Response Output"
msgstr ""
@@ -16109,6 +16348,9 @@ msgstr ""
msgid "GroupSAML|To be able to prohibit outer forks, you first need to enforce dedicate group managed accounts."
msgstr ""
+msgid "GroupSAML|Use SAML group links to manage group membership using SAML."
+msgstr ""
+
msgid "GroupSAML|Valid SAML Response"
msgstr "Gyldig SAML-respons"
@@ -16119,35 +16361,38 @@ msgid "GroupSAML|Your SCIM token"
msgstr "Din SCIM-sjetong"
msgid "GroupSAML|as %{access_level}"
-msgstr ""
-
-msgid "GroupSAML|must match stored NameID of \"%{extern_uid}\" as we use this to identify users. If the NameID changes users will be unable to sign in."
-msgstr ""
+msgstr "som %{access_level}"
-msgid "GroupSAML|should be \"persistent\""
+msgid "GroupSAML|must match stored NameID of \"%{extern_uid}\" to identify user and allow sign in"
msgstr ""
-msgid "GroupSAML|should be a random persistent ID, emails are discouraged"
+msgid "GroupSAML|recommend persistent ID instead of email"
msgstr ""
msgid "GroupSelect|No matching results"
-msgstr ""
+msgstr "Ingen samsvarende resultater"
msgid "GroupSelect|Search groups"
-msgstr ""
+msgstr "Søk i grupper"
msgid "GroupSelect|Select a group"
-msgstr ""
+msgstr "Velg en gruppe"
msgid "GroupSettings|Allow project access token creation"
msgstr ""
+msgid "GroupSettings|Applied to all subgroups unless overridden by a group owner. Groups already added to the project lose access."
+msgstr ""
+
msgid "GroupSettings|Auto DevOps pipeline was updated for the group"
msgstr ""
-msgid "GroupSettings|Badges"
+msgid "GroupSettings|Available only on the top-level group. Applies to all subgroups. Groups already shared with a group outside %{group} are still shared unless removed manually."
msgstr ""
+msgid "GroupSettings|Badges"
+msgstr "Merker"
+
msgid "GroupSettings|Be careful. Changing a group's parent can have unintended %{side_effects_link_start}side effects%{side_effects_link_end}."
msgstr ""
@@ -16158,7 +16403,7 @@ msgid "GroupSettings|Change group URL"
msgstr "Endre gruppe-URL"
msgid "GroupSettings|Changing group URL can have unintended side effects."
-msgstr ""
+msgstr "Endring av gruppe-URL-en kan ha utilsiktede bivirkninger."
msgid "GroupSettings|Compliance frameworks"
msgstr ""
@@ -16196,6 +16441,9 @@ msgstr "Hvis overgruppens synlighet er lavere enn gruppens nåværende synlighet
msgid "GroupSettings|New runners registration token has been generated!"
msgstr ""
+msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgstr ""
+
msgid "GroupSettings|Pipeline settings was updated for the group"
msgstr ""
@@ -16208,12 +16456,15 @@ msgstr "Forhindre utgreining utenfor gruppen"
msgid "GroupSettings|Prevent forking setting was not saved"
msgstr "Innstilling for forhindring av utgreining ble ikke lagret"
-msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups."
+msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups"
msgstr ""
msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
msgstr "Forhindre deling av et prosjekt innenfor %{group} med andre grupper"
+msgid "GroupSettings|Prevents group members from being notified if the group is mentioned."
+msgstr ""
+
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
msgstr ""
@@ -16242,7 +16493,7 @@ msgid "GroupSettings|There was a problem updating the pipeline settings: %{error
msgstr ""
msgid "GroupSettings|This setting is applied on %{ancestor_group} and has been overridden on this subgroup."
-msgstr ""
+msgstr "Denne innstillingen brukes på %{ancestor_group} og har blitt overstyrt i denne undergruppen."
msgid "GroupSettings|This setting is applied on %{ancestor_group}. To share projects in this group with another group, ask the owner to override the setting or %{remove_ancestor_share_with_group_lock}."
msgstr "Denne innstillingen brukes på %{ancestor_group}. Hvis du vil dele prosjekter i denne gruppen med en annen gruppe, ber du eieren om å overstyre innstillingen eller %{remove_ancestor_share_with_group_lock}."
@@ -16250,21 +16501,6 @@ msgstr "Denne innstillingen brukes på %{ancestor_group}. Hvis du vil dele prosj
msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}."
msgstr "Denne innstillingen brukes på %{ancestor_group}. Du kan overstyre innstillingen eller %{remove_ancestor_share_with_group_lock}."
-msgid "GroupSettings|This setting is only available on the top-level group and it applies to all subgroups. Groups that have already been shared with a group outside %{group} will still be shared, and this access will have to be revoked manually."
-msgstr ""
-
-msgid "GroupSettings|This setting will be applied to all subgroups unless overridden by a group owner. Groups that already have access to the project will continue to have access unless removed manually."
-msgstr "Denne innstillingen vil bli brukt på alle undergrupper med mindre den overstyres av en gruppeeier. Grupper som allerede har tilgang til prosjektet, vil fortsette å ha tilgang med mindre de fjernes manuelt."
-
-msgid "GroupSettings|This setting will override user notification preferences for all members of the group, subgroups, and projects."
-msgstr "Denne innstillingen overstyrer brukervarslingsinnstillinger for alle medlemmer av gruppen, undergrupper og prosjekter."
-
-msgid "GroupSettings|This setting will prevent group members from being notified if the group is mentioned."
-msgstr "Denne innstillingen vil forhindre at gruppemedlemmer blir varslet hvis gruppen blir nevnt."
-
-msgid "GroupSettings|This setting will prevent group members from forking projects outside of the group."
-msgstr ""
-
msgid "GroupSettings|Transfer group"
msgstr "Overfør gruppe"
@@ -16278,7 +16514,7 @@ msgid "GroupSettings|You can only transfer the group to a group you manage."
msgstr ""
msgid "GroupSettings|You will need to update your local repositories to point to the new location."
-msgstr ""
+msgstr "Du vil måtte oppdatere dine lokale arkiver for å peke dem mot den nye plasseringen."
msgid "GroupSettings|cannot be changed by you"
msgstr "kan ikke endres av deg"
@@ -16347,7 +16583,7 @@ msgid "GroupsNew|Assemble related projects together and grant members access to
msgstr ""
msgid "GroupsNew|Connect instance"
-msgstr ""
+msgstr "Koble til instans"
msgid "GroupsNew|Contact an administrator to enable options for importing your group."
msgstr "Kontakt en administrator for å aktivere alternativer for å importere gruppen din."
@@ -16356,13 +16592,13 @@ msgid "GroupsNew|Create group"
msgstr "Opprett gruppe"
msgid "GroupsNew|Create new group"
-msgstr ""
+msgstr "Opprett ny gruppe"
msgid "GroupsNew|Export groups with all their related data and move to a new GitLab instance."
msgstr ""
msgid "GroupsNew|GitLab source URL"
-msgstr ""
+msgstr "GitLab-kilde-URL"
msgid "GroupsNew|Groups can also be nested by creating %{linkStart}subgroups%{linkEnd}."
msgstr ""
@@ -16382,11 +16618,11 @@ msgstr ""
msgid "GroupsNew|No import options available"
msgstr "Ingen importalternativer er tilgjengelige"
-msgid "GroupsNew|Not all related objects are migrated, as %{docs_link_start}described here%{docs_link_end}. Please %{feedback_link_start}leave feedback%{feedback_link_end} on this feature."
+msgid "GroupsNew|Not all related objects are migrated. %{docs_link_start}More info%{docs_link_end}."
msgstr ""
msgid "GroupsNew|Personal access token"
-msgstr ""
+msgstr "Personlig tilgangssjetong"
msgid "GroupsNew|Please fill in GitLab source URL."
msgstr ""
@@ -16401,10 +16637,10 @@ msgid "GroupsNew|To import a group, navigate to the group settings for the GitLa
msgstr ""
msgid "GroupsNew|Upload file"
-msgstr ""
+msgstr "Last opp fil"
msgid "GroupsNew|e.g. h8d3f016698e..."
-msgstr ""
+msgstr "f.eks. h8d3f016698e …"
msgid "GroupsTree|Are you sure you want to leave the \"%{fullName}\" group?"
msgstr "Er du sikker på at du vil forlate «%{fullName}»-gruppen?"
@@ -16434,7 +16670,7 @@ msgid "Guideline"
msgstr "Retningslinje"
msgid "HAR (HTTP Archive)"
-msgstr ""
+msgstr "HAR (HTTP-arkiv)"
msgid "HAR file path or URL"
msgstr ""
@@ -16455,7 +16691,7 @@ msgid "Header cannot be associated with both a request and a response"
msgstr ""
msgid "Header logo"
-msgstr ""
+msgstr "Toppområdelogo"
msgid "Header logo was successfully removed."
msgstr ""
@@ -16470,16 +16706,16 @@ msgid "Header must be associated with a request or response"
msgstr ""
msgid "Heading 1"
-msgstr ""
+msgstr "Overskrift 1"
msgid "Heading 2"
-msgstr ""
+msgstr "Overskrift 2"
msgid "Heading 3"
-msgstr ""
+msgstr "Overskrift 3"
msgid "Heading 4"
-msgstr ""
+msgstr "Overskrift 4"
msgid "Headings"
msgstr "Overskrifter"
@@ -16500,7 +16736,7 @@ msgid "Health status cannot be edited because this issue is closed"
msgstr ""
msgid "HealthCheck|Access token is"
-msgstr ""
+msgstr "Tilgangssjetongen er"
msgid "HealthCheck|Healthy"
msgstr "God helse"
@@ -16512,17 +16748,29 @@ msgid "HealthCheck|Unhealthy"
msgstr "DÃ¥rlig helse"
msgid "Hello %{name},"
-msgstr ""
-
-msgid "Hello there"
-msgstr "Heisann"
+msgstr "Hallo, %{name},"
msgid "Hello, %{name}!"
-msgstr ""
+msgstr "Hallo, %{name}!"
msgid "Hello, %{username}!"
msgstr "Hallo, %{username}!"
+msgid "HelloMessage|%{handshake_emoji} Contribute to GitLab: %{contribute_link}"
+msgstr ""
+
+msgid "HelloMessage|%{magnifier_emoji} Create a new GitLab issue: %{new_issue_link}"
+msgstr ""
+
+msgid "HelloMessage|%{rocket_emoji} We like your curiosity! Help us improve GitLab by joining the team: %{jobs_page_link}"
+msgstr ""
+
+msgid "HelloMessage|Does this page need fixes or improvements? Open an issue or contribute a merge request to help make GitLab more lovable. At GitLab, everyone can contribute!"
+msgstr ""
+
+msgid "HelloMessage|Welcome to GitLab!"
+msgstr ""
+
msgid "Help"
msgstr "Hjelp"
@@ -16532,13 +16780,10 @@ msgstr ""
msgid "Helps prevent bots from creating accounts."
msgstr ""
-msgid "Helps prevent bots from creating issues"
+msgid "Helps prevent bots from creating issues."
msgstr ""
-msgid "Helps prevent malicious users hide their activity"
-msgstr ""
-
-msgid "Helps reduce request volume (e.g. from crawlers or abusive bots)"
+msgid "Helps prevent malicious users hide their activity."
msgstr ""
msgid "Helps reduce request volume (for example, from crawlers or abusive bots)"
@@ -16554,7 +16799,7 @@ msgid "Hi %{username}!"
msgstr "Hei, %{username}!"
msgid "Hide"
-msgstr ""
+msgstr "Skjul"
msgid "Hide archived projects"
msgstr "Skjul arkiverte prosjekter"
@@ -16565,7 +16810,7 @@ msgstr[0] "Skjul diagram"
msgstr[1] "Skjul diagrammer"
msgid "Hide comments on this file"
-msgstr ""
+msgstr "Skjul kommentarer på denne filen"
msgid "Hide details"
msgstr "Skjul detaljer"
@@ -16612,13 +16857,13 @@ msgid "Highest role:"
msgstr "Høyeste rolle:"
msgid "HighlightBar|Alert events:"
-msgstr ""
+msgstr "Alarmhendelser:"
msgid "HighlightBar|Alert start time:"
msgstr ""
msgid "HighlightBar|Original alert:"
-msgstr ""
+msgstr "Opprinnelig alarm:"
msgid "HighlightBar|Time to SLA:"
msgstr ""
@@ -16627,10 +16872,10 @@ msgid "History"
msgstr "Historie"
msgid "History of authentications"
-msgstr ""
+msgstr "Historikk over autentiseringer"
msgid "Home page URL"
-msgstr ""
+msgstr "Hjemmeside-URL"
msgid "Homepage"
msgstr "Hjemmeside"
@@ -16662,17 +16907,23 @@ msgstr ""
msgid "Housekeeping, export, path, transfer, remove, archive."
msgstr ""
+msgid "How do I configure Akismet?"
+msgstr ""
+
+msgid "How do I configure it?"
+msgstr ""
+
msgid "How do I configure runners?"
msgstr ""
msgid "How do I configure this integration?"
-msgstr ""
+msgstr "Hvordan konfigurerer jeg denne integrasjonen?"
msgid "How do I generate it?"
-msgstr ""
+msgstr "Hvordan genererer jeg den?"
msgid "How do I mirror repositories?"
-msgstr ""
+msgstr "Hvordan speiler jeg kodelagre?"
msgid "How do I rename an environment?"
msgstr ""
@@ -16681,6 +16932,12 @@ msgid "How do I set up a Google Chat webhook?"
msgstr ""
msgid "How do I set up this service?"
+msgstr "Hvordan setter jeg opp denne tjenesten?"
+
+msgid "How do I use a web terminal?"
+msgstr ""
+
+msgid "How do I use file templates?"
msgstr ""
msgid "How it works"
@@ -16689,15 +16946,15 @@ msgstr "Hvordan det virker"
msgid "How many days need to pass between marking entity for deletion and actual removing it."
msgstr ""
-msgid "How many seconds an IP will be counted towards the limit"
+msgid "How many seconds an IP counts toward the IP address limit."
+msgstr ""
+
+msgid "How the job limiter handles jobs exceeding the thresholds specified below. The 'track' mode only logs the jobs. The 'compress' mode compresses the jobs and raises an exception if the compressed size exceeds the limit."
msgstr ""
msgid "I accept the %{terms_link}"
msgstr "Jeg aksepterer %{terms_link}"
-msgid "I accept the|Terms of Service and Privacy Policy"
-msgstr ""
-
msgid "I forgot my password"
msgstr "Jeg glemte passordet mitt"
@@ -16711,7 +16968,7 @@ msgid "I want to move my repository to GitLab from somewhere else"
msgstr ""
msgid "I want to store my code"
-msgstr ""
+msgstr "Jeg vil lagre koden min"
msgid "I want to use GitLab CI with my existing repository"
msgstr ""
@@ -16720,7 +16977,7 @@ msgid "I'd like to receive updates about GitLab via email"
msgstr ""
msgid "I'm signing up for GitLab because:"
-msgstr ""
+msgstr "Jeg lager en konto på GitLab fordi:"
msgid "ID"
msgstr "ID"
@@ -16779,13 +17036,16 @@ msgstr "SSH-nøkkelen din utløper snart. Vennligst generer en ny nøkkel."
msgid "IP Address"
msgstr "IP-adresse"
-msgid "IP expiration time"
+msgid "IP address expiration time"
msgstr ""
-msgid "IP subnet restriction only allowed for top-level groups"
+msgid "IP address restrictions"
+msgstr ""
+
+msgid "IP addresses per user"
msgstr ""
-msgid "IPs per user"
+msgid "IP subnet restriction only allowed for top-level groups"
msgstr ""
msgid "Identifier"
@@ -16800,6 +17060,9 @@ msgstr "Identiteter"
msgid "If any indexed field exceeds this limit it will be truncated to this number of characters and the rest will not be indexed or searchable. This does not apply to repository and wiki indexing. Setting this to 0 means it is unlimited."
msgstr "Hvis et indeksert felt overskrider denne grensen, blir det avkortet til dette antall tegn, og resten vil ikke bli indeksert eller søkbart. Dette gjelder ikke indeksering av kodelageret og wikien. Hvis du setter dette til 0, betyr det at det er ubegrenset."
+msgid "If blank, defaults to %{code_open}Retry later%{code_close}."
+msgstr ""
+
msgid "If blank, set allowable lifetime to %{instance_level_policy_in_words}, as defined by the instance admin. Once set, existing tokens for users in this group may be revoked."
msgstr ""
@@ -16851,6 +17114,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 did not initiate these sign-in attempts, please reach out to your administrator or enable two-factor authentication (2FA) on your account."
+msgstr ""
+
msgid "If you did not initiate this change, please contact your administrator immediately."
msgstr ""
@@ -16933,8 +17199,8 @@ msgstr[1] ""
msgid "Import %d repository"
msgid_plural "Import %d repositories"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "Importer %d kodelager"
+msgstr[1] "Importer %d kodelagre"
msgid "Import CSV"
msgstr "Importer CSV"
@@ -16942,12 +17208,12 @@ msgstr "Importer CSV"
msgid "Import Projects from Gitea"
msgstr "Importer prosjekter fra Gitea"
-msgid "Import a project"
-msgstr ""
-
msgid "Import an exported GitLab project"
msgstr "Importer et eksportert GitLab-prosjekt"
+msgid "Import and export rate limits"
+msgstr ""
+
msgid "Import failed due to a GitHub error: %{original}"
msgstr "Importering mislyktes på grunn av en GitHub-feil: %{original}"
@@ -16957,10 +17223,16 @@ msgstr "Importer fra"
msgid "Import from Jira"
msgstr "Importer fra Jira"
-msgid "Import group from file"
+msgid "Import group"
msgstr ""
+msgid "Import group from file"
+msgstr "Importer gruppe fra fil"
+
msgid "Import groups"
+msgstr "Importer grupper"
+
+msgid "Import history"
msgstr ""
msgid "Import in progress"
@@ -16985,7 +17257,7 @@ msgid "Import project"
msgstr "Importer prosjekt"
msgid "Import project from"
-msgstr ""
+msgstr "Importer prosjekt fra"
msgid "Import project members"
msgstr "Importer prosjektmedlemmer"
@@ -17012,7 +17284,7 @@ msgid "Import repository"
msgstr "Importer kodelager"
msgid "Import requirements"
-msgstr ""
+msgstr "Importer krav"
msgid "Import started by: %{importInitiator}"
msgstr "Importering startet av: %{importInitiator}"
@@ -17026,7 +17298,25 @@ msgstr ""
msgid "Import timed out. Import took longer than %{import_jobs_expiration} seconds"
msgstr ""
-msgid "Import/Export Rate Limits"
+msgid "ImportAProjectModal|Import from a project"
+msgstr ""
+
+msgid "ImportAProjectModal|Import members from another project"
+msgstr ""
+
+msgid "ImportAProjectModal|Import project members"
+msgstr ""
+
+msgid "ImportAProjectModal|Only project members (not group members) are imported, and they get the same permissions as the project you import from."
+msgstr ""
+
+msgid "ImportAProjectModal|Successfully imported"
+msgstr ""
+
+msgid "ImportAProjectModal|Unable to import project members"
+msgstr ""
+
+msgid "ImportAProjectModal|You're importing members to the %{strongStart}%{name}%{strongEnd} project."
msgstr ""
msgid "ImportButtons|Connect repositories from"
@@ -17039,10 +17329,10 @@ msgid "ImportProjects|Blocked import URL: %{message}"
msgstr ""
msgid "ImportProjects|Error importing repository %{project_safe_import_url} into %{project_full_path} - %{message}"
-msgstr ""
+msgstr "Feil under importering av «%{project_safe_import_url}»-kodelageret til %{project_full_path} - %{message}"
msgid "ImportProjects|Import repositories"
-msgstr ""
+msgstr "Importer kodelagre"
msgid "ImportProjects|Importing the project failed"
msgstr "Importering av prosjektet mislyktes"
@@ -17069,17 +17359,17 @@ msgid "ImportProjects|Update of imported projects with realtime changes failed"
msgstr ""
msgid "Imported requirements"
-msgstr ""
+msgstr "Importerte krav"
msgid "Importing %d repository"
msgid_plural "Importing %d repositories"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "Importerer %d kodelager"
+msgstr[1] "Importerer %d kodelagre"
msgid "Importing..."
-msgstr ""
+msgstr "Importerer …"
-msgid "Import|A repository URL usually ends in a .git suffix, although this is not required. Double check to make sure your repository URL is correct."
+msgid "Import|There is not a valid Git repository at this URL. If your HTTP repository is not publicly accessible, verify your credentials."
msgstr ""
msgid "Improve customer support with Service Desk"
@@ -17088,9 +17378,6 @@ msgstr ""
msgid "Improves Git cloning performance."
msgstr ""
-msgid "In %{time_to_now}"
-msgstr "Om %{time_to_now}"
-
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 ""
@@ -17104,7 +17391,7 @@ msgid "In this page you will find information about the settings that are used i
msgstr ""
msgid "InProductMarketing|%{organization_name} logo"
-msgstr ""
+msgstr "%{organization_name}-logo"
msgid "InProductMarketing|%{strong_start}Advanced application security%{strong_end} — including SAST, DAST scanning, FUZZ testing, dependency scanning, license compliance, secrete detection"
msgstr ""
@@ -17116,7 +17403,7 @@ msgid "InProductMarketing|%{strong_start}Executive level insights%{strong_end} â
msgstr ""
msgid "InProductMarketing|%{strong_start}GitLab Inc.%{strong_end} 268 Bush Street, #350, San Francisco, CA 94104, USA"
-msgstr ""
+msgstr "%{strong_start}GitLab Inc.%{strong_end} 268 Bush Street, #350, San Francisco, CA 94104, USA"
msgid "InProductMarketing|%{strong_start}Multiple approval roles%{strong_end} — including code owners and required merge approvals"
msgstr ""
@@ -17146,16 +17433,16 @@ msgid "InProductMarketing|Automated security scans directly within GitLab"
msgstr ""
msgid "InProductMarketing|Be a DevOps hero"
-msgstr ""
+msgstr "Vær en DevOps-helt"
msgid "InProductMarketing|Beef up your security"
msgstr ""
msgid "InProductMarketing|Better code in less time"
-msgstr ""
+msgstr "Bedre kode på mindre tid"
msgid "InProductMarketing|Blog"
-msgstr ""
+msgstr "Blogg"
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 ""
@@ -17185,16 +17472,16 @@ msgid "InProductMarketing|Did you know teams that use GitLab are far more effici
msgstr ""
msgid "InProductMarketing|Difficult"
-msgstr ""
+msgstr "Vanskelig"
msgid "InProductMarketing|Dig in and create a project and a repo"
msgstr ""
msgid "InProductMarketing|Do you have a minute?"
-msgstr ""
+msgstr "Har du et minutt?"
msgid "InProductMarketing|Easy"
-msgstr ""
+msgstr "Enkelt"
msgid "InProductMarketing|Expand your DevOps journey with a free GitLab trial"
msgstr ""
@@ -17206,10 +17493,10 @@ msgid "InProductMarketing|Explore the options"
msgstr ""
msgid "InProductMarketing|Explore the power of GitLab CI/CD"
-msgstr ""
+msgstr "Utforsk kraften til GitLab CI/CD"
msgid "InProductMarketing|Facebook"
-msgstr ""
+msgstr "Facebook"
msgid "InProductMarketing|Feedback from users like you really improves our product. Thanks for your help!"
msgstr ""
@@ -17221,10 +17508,10 @@ msgid "InProductMarketing|Find out how your teams are really doing"
msgstr ""
msgid "InProductMarketing|Follow our steps"
-msgstr ""
+msgstr "Følg våre trinn"
msgid "InProductMarketing|Free 30-day trial"
-msgstr ""
+msgstr "Gratis 30-dagers prøveperiode"
msgid "InProductMarketing|Get going with CI/CD quickly using our %{quick_start_link}. Start with an available runner and then create a CI .yml file – it's really that easy."
msgstr ""
@@ -17233,7 +17520,7 @@ msgid "InProductMarketing|Get our import guides"
msgstr ""
msgid "InProductMarketing|Get started today"
-msgstr ""
+msgstr "Sett i gang i dag"
msgid "InProductMarketing|Get started today with a 30-day GitLab Ultimate trial, no credit card required."
msgstr ""
@@ -17248,7 +17535,7 @@ msgid "InProductMarketing|Get your team set up on GitLab"
msgstr ""
msgid "InProductMarketing|Git basics"
-msgstr ""
+msgstr "Grunnleggende om Git"
msgid "InProductMarketing|GitHub Enterprise projects to GitLab"
msgstr ""
@@ -17263,10 +17550,10 @@ msgid "InProductMarketing|GitLab's premium tiers are designed to make you, your
msgstr ""
msgid "InProductMarketing|Give us one minute..."
-msgstr ""
+msgstr "Gi oss ett minutt …"
msgid "InProductMarketing|Go farther with GitLab"
-msgstr ""
+msgstr "GÃ¥ lengre med GitLab"
msgid "InProductMarketing|Goldman Sachs went from 1 build every two weeks to thousands of builds a day"
msgstr ""
@@ -17320,7 +17607,7 @@ msgid "InProductMarketing|Invite your team in less than 60 seconds"
msgstr ""
msgid "InProductMarketing|Invite your team now"
-msgstr ""
+msgstr "Inviter teamet ditt nå"
msgid "InProductMarketing|Invite your team today to build better code (and processes) together"
msgstr ""
@@ -17350,10 +17637,10 @@ msgid "InProductMarketing|Need an alternative to importing?"
msgstr ""
msgid "InProductMarketing|Neutral"
-msgstr ""
+msgstr "Nøytral"
msgid "InProductMarketing|No credit card required."
-msgstr ""
+msgstr "Ingen bankkort behøves."
msgid "InProductMarketing|Our tool brings all the things together"
msgstr ""
@@ -17376,11 +17663,11 @@ msgstr ""
msgid "InProductMarketing|Start a GitLab Ultimate trial today in less than one minute, no credit card required."
msgstr ""
-msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no CC required"
+msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no credit card required"
msgstr ""
msgid "InProductMarketing|Start a trial"
-msgstr ""
+msgstr "Begynn en prøveperiode"
msgid "InProductMarketing|Start by %{performance_link}"
msgstr ""
@@ -17407,7 +17694,7 @@ msgid "InProductMarketing|Take this 1-question survey!"
msgstr ""
msgid "InProductMarketing|Take your first steps with GitLab"
-msgstr ""
+msgstr "Ta dine første skritt med GitLab"
msgid "InProductMarketing|Take your source code management to the next level"
msgstr ""
@@ -17415,7 +17702,7 @@ msgstr ""
msgid "InProductMarketing|Team up in GitLab for greater efficiency"
msgstr ""
-msgid "InProductMarketing|Team work makes the dream work"
+msgid "InProductMarketing|Team work makes the dream work"
msgstr ""
msgid "InProductMarketing|Test, create, deploy"
@@ -17446,16 +17733,16 @@ msgid "InProductMarketing|Try GitLab Ultimate for free"
msgstr ""
msgid "InProductMarketing|Try it out"
-msgstr ""
+msgstr "Prøv det ut"
msgid "InProductMarketing|Try it yourself"
-msgstr ""
+msgstr "Prøv det ut selv"
msgid "InProductMarketing|Turn coworkers into collaborators"
msgstr ""
msgid "InProductMarketing|Twitter"
-msgstr ""
+msgstr "Twitter"
msgid "InProductMarketing|Understand repository mirroring"
msgstr ""
@@ -17464,7 +17751,7 @@ msgid "InProductMarketing|Understand your project options"
msgstr ""
msgid "InProductMarketing|Use GitLab CI/CD"
-msgstr ""
+msgstr "Bruk GitLab-CI/CD"
msgid "InProductMarketing|Use our AWS cloudformation template to spin up your runners in just a few clicks!"
msgstr ""
@@ -17473,10 +17760,10 @@ msgid "InProductMarketing|Used by more than 100,000 organizations from around th
msgstr ""
msgid "InProductMarketing|Very difficult"
-msgstr ""
+msgstr "Veldig vanskelig"
msgid "InProductMarketing|Very easy"
-msgstr ""
+msgstr "Veldig enkelt"
msgid "InProductMarketing|We know a thing or two about efficiency and we don't want to keep that to ourselves. Sign up for a free trial of GitLab Ultimate and your teams will be on it from day one."
msgstr ""
@@ -17494,7 +17781,7 @@ msgid "InProductMarketing|Working in GitLab = more efficient"
msgstr ""
msgid "InProductMarketing|YouTube"
-msgstr ""
+msgstr "YouTube"
msgid "InProductMarketing|Your teams can be more efficient"
msgstr ""
@@ -17506,10 +17793,10 @@ msgid "InProductMarketing|connect an external repository"
msgstr ""
msgid "InProductMarketing|create a project"
-msgstr ""
+msgstr "opprett et prosjekt"
msgid "InProductMarketing|from Bitbucket"
-msgstr ""
+msgstr "fra Bitbucket"
msgid "InProductMarketing|go to about.gitlab.com"
msgstr ""
@@ -17518,13 +17805,13 @@ msgid "InProductMarketing|how easy it is to get started"
msgstr ""
msgid "InProductMarketing|quick start guide"
-msgstr ""
+msgstr "hurtigstartsguide"
msgid "InProductMarketing|repository mirroring"
-msgstr ""
+msgstr "kodelager-speiling"
msgid "InProductMarketing|set up a repo"
-msgstr ""
+msgstr "sett opp et kodelager"
msgid "InProductMarketing|test and deploy"
msgstr ""
@@ -17545,10 +17832,10 @@ msgid "InProductMarketing|you may %{unsubscribe_link} at any time."
msgstr ""
msgid "Inactive"
-msgstr ""
+msgstr "Inaktiv"
msgid "Incident"
-msgstr ""
+msgstr "Hendelse"
msgid "Incident Management Limits"
msgstr ""
@@ -17581,7 +17868,7 @@ msgid "IncidentManagement|Create incident"
msgstr ""
msgid "IncidentManagement|Critical - S1"
-msgstr ""
+msgstr "Kritisk - S1"
msgid "IncidentManagement|Date created"
msgstr "Dato opprettet"
@@ -17590,19 +17877,19 @@ msgid "IncidentManagement|Display your incidents in a dedicated view"
msgstr ""
msgid "IncidentManagement|High - S2"
-msgstr ""
+msgstr "Høy - S2"
msgid "IncidentManagement|Incident"
-msgstr ""
+msgstr "Hendelse"
msgid "IncidentManagement|Incidents"
-msgstr ""
+msgstr "Hendelser"
msgid "IncidentManagement|Low - S4"
-msgstr ""
+msgstr "Lav - S4"
msgid "IncidentManagement|Medium - S3"
-msgstr ""
+msgstr "Medium - S3"
msgid "IncidentManagement|Missed SLA"
msgstr ""
@@ -17611,7 +17898,7 @@ msgid "IncidentManagement|No incidents to display."
msgstr ""
msgid "IncidentManagement|Open"
-msgstr ""
+msgstr "Ã…pen"
msgid "IncidentManagement|Published"
msgstr "Publisert"
@@ -17620,7 +17907,7 @@ msgid "IncidentManagement|Published to status page"
msgstr ""
msgid "IncidentManagement|Severity"
-msgstr ""
+msgstr "Alvorlighetsgrad"
msgid "IncidentManagement|There are no closed incidents"
msgstr ""
@@ -17635,7 +17922,7 @@ msgid "IncidentManagement|Unassigned"
msgstr "Utilordnet"
msgid "IncidentManagement|Unknown"
-msgstr ""
+msgstr "Ukjent"
msgid "IncidentManagement|Unpublished"
msgstr "Upublisert"
@@ -17647,13 +17934,13 @@ msgid "IncidentSettings|Fine-tune incident settings and set up integrations with
msgstr ""
msgid "IncidentSettings|Grafana integration"
-msgstr ""
+msgstr "Grafana-integrasjon"
msgid "IncidentSettings|Incident settings"
-msgstr ""
+msgstr "Hendelsesinnstillinger"
msgid "IncidentSettings|Incidents"
-msgstr ""
+msgstr "Hendelser"
msgid "IncidentSettings|Introduce a countdown timer in incident issues to better track Service Level Agreements (SLAs). The timer starts automatically when the incident is created, and sets a time limit for resolving the incident. When activated, the time to SLA countdown appears on all new incidents."
msgstr ""
@@ -17662,7 +17949,7 @@ msgid "IncidentSettings|PagerDuty integration"
msgstr ""
msgid "IncidentSettings|Time limit"
-msgstr ""
+msgstr "Tidsgrense"
msgid "IncidentSettings|Time limit must be a multiple of 15 minutes."
msgstr ""
@@ -17677,49 +17964,49 @@ msgid "IncidentSettings|When activated, this applies to all new incidents in the
msgstr ""
msgid "IncidentSettings|hours"
-msgstr ""
+msgstr "timer"
msgid "IncidentSettings|minutes"
-msgstr ""
+msgstr "minutter"
msgid "Incidents"
-msgstr ""
+msgstr "Hendelser"
msgid "Incidents|Add a URL"
-msgstr ""
+msgstr "Legg til en URL"
msgid "Incidents|Drop or %{linkStart}upload%{linkEnd} a metric screenshot to attach it to the incident"
msgstr ""
msgid "Incidents|Must start with http or https"
-msgstr ""
+msgstr "MÃ¥ begynne med http eller https"
msgid "Incidents|There was an issue deleting the image."
-msgstr ""
+msgstr "Det oppstod et problem med å slette bildet."
msgid "Incidents|There was an issue loading metric images."
msgstr ""
msgid "Incidents|There was an issue uploading your image."
-msgstr ""
+msgstr "Det oppstod et problem med å laste opp bildet ditt."
msgid "Incidents|You can optionally add a URL to link users to the original graph."
msgstr ""
msgid "Incident|Alert details"
-msgstr ""
+msgstr "Alarmdetaljer"
msgid "Incident|Are you sure you wish to delete this image?"
msgstr ""
msgid "Incident|Deleting %{filename}"
-msgstr ""
+msgstr "Sletter %{filename}"
msgid "Incident|Metrics"
-msgstr ""
+msgstr "MÃ¥ltall"
msgid "Incident|Summary"
-msgstr ""
+msgstr "Oppsummering"
msgid "Incident|There was an issue loading alert data. Please try again."
msgstr ""
@@ -17770,16 +18057,16 @@ msgid "Incompatible project"
msgstr "Inkompatibelt prosjekt"
msgid "Incomplete"
-msgstr ""
+msgstr "Uferdig"
msgid "Increase"
-msgstr ""
+msgstr "Forstørr"
msgid "Indent"
msgstr "Rykk inn"
msgid "Index"
-msgstr ""
+msgstr "Indeks"
msgid "Index all projects"
msgstr "Indekser alle prosjekter"
@@ -17794,10 +18081,10 @@ msgid "Inform users without uploaded SSH keys that they can't push over SSH unti
msgstr ""
msgid "Infrastructure"
-msgstr ""
+msgstr "Infrastruktur"
msgid "Infrastructure Registry"
-msgstr ""
+msgstr "Infrastrukturregister"
msgid "InfrastructureRegistry|Copy Terraform Command"
msgstr ""
@@ -17818,7 +18105,7 @@ msgid "InfrastructureRegistry|Publish and share your modules. %{docLinkStart}Mor
msgstr ""
msgid "InfrastructureRegistry|Terraform"
-msgstr ""
+msgstr "Terraform"
msgid "InfrastructureRegistry|Terraform modules are the main way to package and reuse resource configurations with Terraform. Learn more about how to %{noPackagesLinkStart}create Terraform modules%{noPackagesLinkEnd} in GitLab."
msgstr ""
@@ -17830,7 +18117,7 @@ msgid "InfrastructureRegistry|You have no Terraform modules in your project"
msgstr ""
msgid "Inherited"
-msgstr ""
+msgstr "Arvet"
msgid "Inherited:"
msgstr "Arvet:"
@@ -17845,7 +18132,7 @@ msgid "Input the remote repository URL"
msgstr ""
msgid "Insert"
-msgstr ""
+msgstr "Sett inn"
msgid "Insert a %{rows}x%{cols} table."
msgstr ""
@@ -17857,7 +18144,7 @@ msgid "Insert a quote"
msgstr "Sett inn et sitat"
msgid "Insert a video"
-msgstr ""
+msgstr "Sett inn en video"
msgid "Insert an image"
msgstr "Sett inn et bilde"
@@ -17866,10 +18153,10 @@ msgid "Insert code"
msgstr "Sett inn kode"
msgid "Insert column after"
-msgstr ""
+msgstr "Sett inn kolonne etter"
msgid "Insert column before"
-msgstr ""
+msgstr "Sett inn kolonne før"
msgid "Insert image"
msgstr "Sett inn bilde"
@@ -17878,13 +18165,13 @@ msgid "Insert inline code"
msgstr ""
msgid "Insert link"
-msgstr ""
+msgstr "Sett inn lenke"
msgid "Insert row after"
-msgstr ""
+msgstr "Sett inn rad etter"
msgid "Insert row before"
-msgstr ""
+msgstr "Sett inn rad før"
msgid "Insert suggestion"
msgstr "Sett inn forslag"
@@ -17934,10 +18221,10 @@ msgid "Instance audit events"
msgstr ""
msgid "Instance overview"
-msgstr ""
+msgstr "Instansoversikt"
msgid "Insufficient permissions"
-msgstr ""
+msgstr "Utilstrekkelige tillatelser"
msgid "Integration"
msgstr "Integrasjon"
@@ -17949,7 +18236,7 @@ msgid "Integrations"
msgstr "Integrasjoner"
msgid "Integrations|%{integrationTitle}: active"
-msgstr ""
+msgstr "%{integrationTitle}: aktiv"
msgid "Integrations|%{integration} settings saved and active."
msgstr ""
@@ -17958,13 +18245,13 @@ msgid "Integrations|%{integration} settings saved, but not active."
msgstr ""
msgid "Integrations|Active integrations"
-msgstr ""
+msgstr "Aktive integrasjoner"
msgid "Integrations|Add an integration"
-msgstr ""
+msgstr "Legg til en integrasjon"
msgid "Integrations|Add namespace"
-msgstr ""
+msgstr "Legg til et navneområde"
msgid "Integrations|Adding a namespace works only in browsers that allow cross‑site cookies. Use %{firefox_link_start}Firefox%{link_end}, %{chrome_link_start}Google Chrome%{link_end}, or enable cross‑site cookies in your browser, when adding a namespace."
msgstr ""
@@ -17979,7 +18266,7 @@ msgid "Integrations|An error occurred while loading projects using custom settin
msgstr ""
msgid "Integrations|Browser limitations"
-msgstr ""
+msgstr "Nettleserbegrensninger"
msgid "Integrations|Comment detail:"
msgstr "Kommentardetalj:"
@@ -17991,11 +18278,14 @@ msgid "Integrations|Connection failed. Please check your settings."
msgstr ""
msgid "Integrations|Connection successful."
-msgstr ""
+msgstr "Tilkoblingen var vellykket."
msgid "Integrations|Create new issue in Jira"
msgstr ""
+msgid "Integrations|Create new issue in ZenTao"
+msgstr ""
+
msgid "Integrations|Default settings are inherited from the group level."
msgstr ""
@@ -18018,10 +18308,10 @@ msgid "Integrations|Failed to unlink namespace. Please try again."
msgstr ""
msgid "Integrations|GitLab administrators can set up integrations that all groups and projects inherit and use by default. These integrations apply to all groups and projects that don't already use custom settings. You can override custom settings for a group or project if the settings are necessary at that level. Learn more about %{integrations_link_start}instance-level integration management%{link_end}."
-msgstr ""
+msgstr "GitLab-administratorer kan sette opp integrasjoner som alle grupper og prosjekter arver og benytter som standard. Disse integrasjonene gjelder for alle grupper og prosjekter som ikke allerede bruker tilpassede innstillinger. Du kan overstyre tilpassede innstillinger for en gruppe eller prosjekt dersom innstillingene er nødvendige på det nivået. Lær mer om %{integrations_link_start}integrasjonsbehandling på instans-nivå%{link_end}."
msgid "Integrations|GitLab administrators can set up integrations that all projects in a group inherit and use by default. These integrations apply to all projects that don't already use custom settings. You can override custom settings for a project if the settings are necessary at that level. Learn more about %{integrations_link_start}group-level integration management%{link_end}."
-msgstr ""
+msgstr "GitLab-administratorer kan sette opp integrasjoner som alle prosjekter i en gruppe arver og benytter som standard. Disse integrasjonene gjelder for alle prosjekter som ikke allerede bruker tilpassede innstillinger. Du kan overstyre tilpassede innstillinger for et prosjekt dersom innstillingene er nødvendige på det nivået. Lær mer om %{integrations_link_start}integrasjonsbehandling på gruppenivå%{link_end}."
msgid "Integrations|Group-level integration management"
msgstr ""
@@ -18054,7 +18344,7 @@ msgid "Integrations|Namespaces are the GitLab groups and subgroups you link to t
msgstr ""
msgid "Integrations|No available namespaces."
-msgstr ""
+msgstr "Ingen tilgjengelige navneområder."
msgid "Integrations|No linked namespaces"
msgstr ""
@@ -18081,22 +18371,28 @@ msgid "Integrations|Return to GitLab for Jira"
msgstr ""
msgid "Integrations|Save settings?"
-msgstr ""
+msgstr "Vil du lagre innstillingene?"
msgid "Integrations|Saving will update the default settings for all projects that are not using custom settings."
msgstr ""
msgid "Integrations|Search Jira issues"
+msgstr "Søk blant Jira-saker"
+
+msgid "Integrations|Search ZenTao issues"
msgstr ""
msgid "Integrations|Send notifications about project events to Unify Circuit."
msgstr ""
+msgid "Integrations|Send notifications about project events to a Unify Circuit conversation. %{docs_link}"
+msgstr ""
+
msgid "Integrations|Sign in to add namespaces"
msgstr ""
msgid "Integrations|Standard"
-msgstr ""
+msgstr "Standard"
msgid "Integrations|There are no projects using custom settings"
msgstr ""
@@ -18131,9 +18427,12 @@ msgstr ""
msgid "Integrations|You've activated every integration 🎉"
msgstr ""
-msgid "Interactive mode"
+msgid "Integrations|ZenTao issues display here when you create issues in your project in ZenTao."
msgstr ""
+msgid "Interactive mode"
+msgstr "Interaktiv modus"
+
msgid "Interested parties can even contribute by pushing commits if they want to."
msgstr ""
@@ -18156,10 +18455,7 @@ msgid "Internal users cannot be deactivated"
msgstr ""
msgid "Interval Pattern"
-msgstr ""
-
-msgid "Introducing Value Stream Analytics"
-msgstr ""
+msgstr "Intervallmønster"
msgid "Introducing Your DevOps Report"
msgstr ""
@@ -18216,7 +18512,7 @@ msgid "Invalid login or password"
msgstr "Ugyldig brukernavn eller passord"
msgid "Invalid period"
-msgstr ""
+msgstr "Ugyldig periode"
msgid "Invalid pin code"
msgstr "Ugyldig PIN-kode"
@@ -18257,11 +18553,17 @@ msgstr "Ugyldig yaml"
msgid "Investigate vulnerability: %{title}"
msgstr ""
+msgid "Invisible Captcha"
+msgstr ""
+
+msgid "Invisible Captcha helps prevent the creation of spam accounts. It adds a honeypot field and time-sensitive form submission to the account signup form."
+msgstr ""
+
msgid "Invitation"
msgstr "Invitasjon"
msgid "Invitation declined"
-msgstr ""
+msgstr "Invitasjonen ble avslått"
msgid "Invite"
msgstr "Inviter"
@@ -18276,7 +18578,7 @@ msgid "Invite Members"
msgstr "Inviter medlemmer"
msgid "Invite a group"
-msgstr ""
+msgstr "Inviter en gruppe"
msgid "Invite email has already been taken"
msgstr ""
@@ -18288,7 +18590,7 @@ msgid "Invite member"
msgstr "Inviter medlem"
msgid "Invite members"
-msgstr ""
+msgstr "Inviter medlemmer"
msgid "InviteEmail|%{inviter} invited you to join the %{project_or_group_name} %{project_or_group} as a %{role}"
msgstr ""
@@ -18315,7 +18617,7 @@ msgid "InviteEmail|Projects are used to host and collaborate on code, track issu
msgstr ""
msgid "InviteEmail|What's it about?"
-msgstr ""
+msgstr "Hva handler det om?"
msgid "InviteEmail|You are invited to join the %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} as a %{role}"
msgstr ""
@@ -18339,7 +18641,7 @@ msgid "InviteMembersModal|Access expiration date (optional)"
msgstr ""
msgid "InviteMembersModal|Cancel"
-msgstr ""
+msgstr "Avbryt"
msgid "InviteMembersModal|Close invite team members"
msgstr ""
@@ -18348,7 +18650,7 @@ msgid "InviteMembersModal|Collaborate on open issues and merge requests"
msgstr ""
msgid "InviteMembersModal|Configure CI/CD"
-msgstr ""
+msgstr "Konfigurer CI/CD"
msgid "InviteMembersModal|Configure security features"
msgstr ""
@@ -18360,10 +18662,10 @@ msgid "InviteMembersModal|GitLab member or email address"
msgstr ""
msgid "InviteMembersModal|Invite"
-msgstr ""
+msgstr "Inviter"
msgid "InviteMembersModal|Invite a group"
-msgstr ""
+msgstr "Inviter en gruppe"
msgid "InviteMembersModal|Invite members"
msgstr ""
@@ -18372,22 +18674,22 @@ msgid "InviteMembersModal|Members were successfully added"
msgstr ""
msgid "InviteMembersModal|Other"
-msgstr ""
+msgstr "Andre"
msgid "InviteMembersModal|Search for a group to invite"
msgstr ""
msgid "InviteMembersModal|Select a group to invite"
-msgstr ""
+msgstr "Velg en gruppe du ønsker å invitere"
msgid "InviteMembersModal|Select a role"
-msgstr ""
+msgstr "Velg en rolle"
msgid "InviteMembersModal|Select members or type email addresses"
msgstr ""
msgid "InviteMembersModal|Something went wrong"
-msgstr ""
+msgstr "Noe gikk galt"
msgid "InviteMembersModal|What would you like new member(s) to focus on? (optional)"
msgstr ""
@@ -18408,25 +18710,25 @@ msgid "InviteMembers|Invite a group"
msgstr ""
msgid "InviteMembers|Invite team members"
-msgstr ""
+msgstr "Inviter teammedlemmer"
msgid "InviteMember|Add members to this project and start collaborating with your team."
msgstr ""
msgid "InviteMember|Invite Member"
-msgstr ""
+msgstr "Inviter medlem"
msgid "InviteMember|Invite Members (optional)"
-msgstr ""
+msgstr "Inviter medlemmer (valgfritt)"
msgid "InviteMember|Invite another member"
-msgstr ""
+msgstr "Inviter et annet medlem"
msgid "InviteMember|Invite members"
-msgstr ""
+msgstr "Inviter medlemmer"
msgid "InviteMember|Invite your team"
-msgstr ""
+msgstr "Inviter teamet ditt"
msgid "InviteMember|Invited users will be added with developer level permissions. %{linkStart}View the documentation%{linkEnd} to see how to change this later."
msgstr ""
@@ -18444,22 +18746,22 @@ msgid "InviteReminderEmail|%{inviter}'s invitation to GitLab is pending"
msgstr ""
msgid "InviteReminderEmail|Accept invitation"
-msgstr ""
+msgstr "Aksepter invitasjon"
msgid "InviteReminderEmail|Accept invitation: %{invite_url}"
-msgstr ""
+msgstr "Godta invitasjonen: %{invite_url}"
msgid "InviteReminderEmail|Decline invitation"
-msgstr ""
+msgstr "Avslå invitasjonen"
msgid "InviteReminderEmail|Decline invitation: %{decline_url}"
-msgstr ""
+msgstr "Avslå invitasjonen: %{decline_url}"
msgid "InviteReminderEmail|Hey there %{wave_emoji}"
msgstr ""
msgid "InviteReminderEmail|Hey there!"
-msgstr ""
+msgstr "Heisann!"
msgid "InviteReminderEmail|In case you missed it..."
msgstr ""
@@ -18489,7 +18791,7 @@ msgid "IrkerService|How to enter channels or users?"
msgstr ""
msgid "IrkerService|Recipients"
-msgstr ""
+msgstr "Mottakere"
msgid "IrkerService|Send update messages to an irker server."
msgstr ""
@@ -18501,7 +18803,7 @@ msgid "IrkerService|Server host (optional)"
msgstr ""
msgid "IrkerService|Server port (optional)"
-msgstr ""
+msgstr "Tjenerport (valgfritt)"
msgid "IrkerService|URI to add before each recipient."
msgstr ""
@@ -18525,7 +18827,7 @@ msgid "Is using license seat:"
msgstr "Bruker lisenssetet:"
msgid "Is using seat"
-msgstr ""
+msgstr "Benytter sete"
msgid "IssuableStatus|Closed"
msgstr "Lukket"
@@ -18555,7 +18857,7 @@ msgid "Issue Boards"
msgstr "Problemvegger"
msgid "Issue Type"
-msgstr ""
+msgstr "Saksrapporttype"
msgid "Issue already promoted to epic."
msgstr ""
@@ -18570,7 +18872,7 @@ msgid "Issue creation requests"
msgstr ""
msgid "Issue details"
-msgstr ""
+msgstr "Saksdetaljer"
msgid "Issue events"
msgstr "Sakshendelser"
@@ -18588,7 +18890,7 @@ msgid "Issue published on status page."
msgstr "Sak publisert på statussiden."
msgid "Issue types"
-msgstr ""
+msgstr "Saksrapporttyper"
msgid "Issue update failed"
msgstr "Saksoppdatering mislyktes"
@@ -18633,16 +18935,16 @@ msgid "IssueBoards|An error occurred while setting notifications status. Please
msgstr ""
msgid "IssueBoards|Board"
-msgstr ""
+msgstr "Bord"
msgid "IssueBoards|Boards"
-msgstr ""
+msgstr "Bord"
msgid "IssueBoards|Create new board"
msgstr ""
msgid "IssueBoards|Delete board"
-msgstr ""
+msgstr "Slett bord"
msgid "IssueBoards|No matching boards found"
msgstr ""
@@ -18651,13 +18953,13 @@ msgid "IssueBoards|Some of your boards are hidden, activate a license to see the
msgstr ""
msgid "IssueBoards|Switch board"
-msgstr ""
+msgstr "Bytt bord"
msgid "IssueTracker|Custom issue tracker"
msgstr "Tilpasset sakssporer"
msgid "IssueTracker|Issue URL"
-msgstr ""
+msgstr "Sakens URL"
msgid "IssueTracker|New issue URL"
msgstr ""
@@ -18710,12 +19012,18 @@ msgstr ""
msgid "Issues"
msgstr "Saker"
+msgid "Issues I've created"
+msgstr ""
+
msgid "Issues Rate Limits"
msgstr ""
msgid "Issues and merge requests"
msgstr ""
+msgid "Issues assigned to me"
+msgstr ""
+
msgid "Issues can be bugs, tasks or ideas to be discussed. Also, issues are searchable and filterable."
msgstr ""
@@ -18732,7 +19040,7 @@ msgid "Issues with comments, merge requests with diffs and comments, labels, mil
msgstr "Saker med kommentarer, fletteforespørsler med differ og kommentarer, stempler, milepæler, utdrag og andre prosjektenheter"
msgid "Issues with label %{label}"
-msgstr ""
+msgstr "Saker med «%{label}»-stempelet"
msgid "Issues with no epic assigned"
msgstr "Saker uten noen tilordnede eposer"
@@ -18792,31 +19100,31 @@ msgid "It's you"
msgstr "Det er deg"
msgid "Italic text"
-msgstr ""
+msgstr "Kursiv tekst"
msgid "Iteration"
-msgstr ""
+msgstr "Iterasjon"
msgid "Iteration changed to"
-msgstr ""
+msgstr "Iterasjonen ble endret til"
msgid "Iteration lists not available with your current license"
msgstr ""
msgid "Iteration removed"
-msgstr ""
+msgstr "Iterasjonen ble fjernet"
msgid "Iteration updated"
-msgstr ""
+msgstr "Iterasjonen ble oppdatert"
msgid "Iterations"
-msgstr "Ringer"
+msgstr "Iterasjoner"
msgid "Iterations|Add iteration"
-msgstr ""
+msgstr "Legg til iterasjon"
msgid "Iterations|Automated scheduling"
-msgstr ""
+msgstr "Automatisert planlegging"
msgid "Iterations|Cadence name"
msgstr ""
@@ -18827,7 +19135,7 @@ msgstr ""
msgid "Iterations|Create cadence"
msgstr ""
-msgid "Iterations|Create your first iteration"
+msgid "Iterations|Create iteration"
msgstr ""
msgid "Iterations|Delete cadence"
@@ -18836,14 +19144,17 @@ msgstr ""
msgid "Iterations|Delete iteration cadence?"
msgstr ""
-msgid "Iterations|Duration"
+msgid "Iterations|Delete iteration?"
msgstr ""
+msgid "Iterations|Duration"
+msgstr "Varighet"
+
msgid "Iterations|Edit cadence"
msgstr ""
msgid "Iterations|Edit iteration"
-msgstr ""
+msgstr "Rediger iterasjon"
msgid "Iterations|Edit iteration cadence"
msgstr ""
@@ -18852,7 +19163,7 @@ msgid "Iterations|Error loading iteration cadences."
msgstr ""
msgid "Iterations|Future iterations"
-msgstr ""
+msgstr "Fremtidige iterasjoner"
msgid "Iterations|Iteration cadences"
msgstr ""
@@ -18864,17 +19175,23 @@ msgid "Iterations|Move incomplete issues to the next iteration"
msgstr ""
msgid "Iterations|New iteration"
-msgstr ""
+msgstr "Ny iterasjon"
msgid "Iterations|New iteration cadence"
msgstr ""
+msgid "Iterations|No closed iterations."
+msgstr ""
+
msgid "Iterations|No iteration cadences to show."
msgstr ""
msgid "Iterations|No iterations in cadence."
msgstr ""
+msgid "Iterations|No open iterations."
+msgstr ""
+
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
@@ -18885,50 +19202,47 @@ msgid "Iterations|Save cadence"
msgstr ""
msgid "Iterations|Select duration"
-msgstr ""
+msgstr "Velg varighet"
msgid "Iterations|Select number"
-msgstr ""
+msgstr "Velg nummer"
msgid "Iterations|Select start date"
-msgstr ""
+msgstr "Velg startdato"
msgid "Iterations|Start date"
-msgstr ""
+msgstr "Startdato"
msgid "Iterations|The duration for each iteration (in weeks)"
-msgstr ""
+msgstr "Varigheten til hver iterasjon (i uker)"
msgid "Iterations|The start date of your first iteration"
-msgstr ""
+msgstr "Startdatoen til din første iterasjon"
msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
msgstr ""
-msgid "Iterations|Title"
+msgid "Iterations|This will remove the iteration from any issues that are assigned to it."
msgstr ""
+msgid "Iterations|Title"
+msgstr "Tittel"
+
msgid "Iterations|Unable to find iteration."
-msgstr ""
+msgstr "Klarte ikke å finne iterasjonen."
msgid "Iteration|Dates cannot overlap with other existing Iterations within this group"
-msgstr ""
+msgstr "Datoer kan ikke overlappe med andre eksisterende iterasjoner i denne gruppen"
msgid "Iteration|Dates cannot overlap with other existing Iterations within this iterations cadence"
msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
-msgstr ""
-
-msgid "I’m familiar with the basics of DevOps."
-msgstr ""
+msgstr "kan ikke vare mer enn 500 år inn i fremtiden"
msgid "I’m joining my team who’s already on GitLab"
msgstr ""
-msgid "I’m not familiar with the basics of DevOps."
-msgstr ""
-
msgid "Jaeger URL"
msgstr "Jaeger-URL"
@@ -18963,7 +19277,7 @@ msgid "Jira service not configured."
msgstr ""
msgid "Jira user"
-msgstr ""
+msgstr "Jira-bruker"
msgid "Jira users have been imported from the configured Jira instance. They can be mapped by selecting a GitLab user from the dropdown in the \"GitLab username\" column. When the form appears, the dropdown defaults to the user conducting the import."
msgstr "Jira-brukere har blitt importert fra den konfigurerte Jira-instansen. De kan kartlegges ved å velge en GitLab-bruker fra nedfallsmenyen i kolonnen «GitLab-brukernavn». Når skjemaet vises, vil nedfallsmenyen som standard vise brukeren som utfører importeringen."
@@ -19020,7 +19334,7 @@ msgid "JiraService|%{jira_docs_link_start}Enable the Jira integration%{jira_docs
msgstr ""
msgid "JiraService|%{user_link} mentioned this issue in %{entity_link} of %{project_link}%{branch}:{quote}%{entity_message}{quote}"
-msgstr ""
+msgstr "%{user_link} nevnte denne saken i %{entity_link} av %{project_link}%{branch}:{quote}%{entity_message}{quote}"
msgid "JiraService|An error occurred while fetching issue list"
msgstr ""
@@ -19068,10 +19382,10 @@ msgid "JiraService|Fetch issue types for this Jira project"
msgstr ""
msgid "JiraService|For example, 12, 24"
-msgstr ""
+msgstr "For eksempel 12, 24"
msgid "JiraService|For example, AB"
-msgstr ""
+msgstr "For eksempel, AB"
msgid "JiraService|GitLab for Jira Configuration"
msgstr ""
@@ -19110,7 +19424,7 @@ msgid "JiraService|Leave blank to use your current password or API token."
msgstr ""
msgid "JiraService|Move to Done"
-msgstr ""
+msgstr "Flytt til «Ferdig»"
msgid "JiraService|No available statuses"
msgstr ""
@@ -19122,7 +19436,7 @@ msgid "JiraService|Open Jira"
msgstr "Ã…pne Jira"
msgid "JiraService|Password or API token"
-msgstr ""
+msgstr "Passord eller API-sjetong"
msgid "JiraService|Project key changed, refresh list"
msgstr ""
@@ -19131,7 +19445,7 @@ msgid "JiraService|Project key is required to generate issue types"
msgstr ""
msgid "JiraService|Select issue type"
-msgstr ""
+msgstr "Velg saksrapport-type"
msgid "JiraService|Set a custom final state by using transition IDs. %{linkStart}Learn about transition IDs%{linkEnd}"
msgstr ""
@@ -19143,7 +19457,7 @@ msgid "JiraService|This feature requires a Premium plan."
msgstr "Denne funksjonen krever en Premium-plan."
msgid "JiraService|This is a Premium feature"
-msgstr ""
+msgstr "Dette er en Premium-funksjon"
msgid "JiraService|This is an Ultimate feature"
msgstr ""
@@ -19193,6 +19507,9 @@ msgstr ""
msgid "Job"
msgstr "Jobb"
+msgid "Job %{jobName}"
+msgstr ""
+
msgid "Job Failed #%{build_id}"
msgstr "Jobben mislyktes #%{build_id}"
@@ -19257,7 +19574,7 @@ msgid "Jobs|Jobs are the building blocks of a GitLab CI/CD pipeline. Each job ha
msgstr ""
msgid "Jobs|No jobs to show"
-msgstr ""
+msgstr "Ingen jobber å vise"
msgid "Jobs|Use jobs to automate your tasks"
msgstr ""
@@ -19323,10 +19640,10 @@ msgid "Job|This job is stuck because you don't have any active runners that can
msgstr ""
msgid "Job|allowed to fail"
-msgstr ""
+msgstr "tillatt å mislykkes"
msgid "Job|delayed"
-msgstr ""
+msgstr "forsinket"
msgid "Job|for"
msgstr "for"
@@ -19335,10 +19652,10 @@ msgid "Job|into"
msgstr "inni"
msgid "Job|manual"
-msgstr ""
+msgstr "manuell"
msgid "Job|triggered"
-msgstr ""
+msgstr "utløst"
msgid "Job|with"
msgstr "med"
@@ -19347,7 +19664,7 @@ msgid "Join Zoom meeting"
msgstr "Bli med på Zoom-møte"
msgid "Joined %{time_ago}"
-msgstr ""
+msgstr "Ble med %{time_ago}"
msgid "Joined %{user_created_time}"
msgstr ""
@@ -19377,10 +19694,10 @@ msgid "K8s pod health"
msgstr ""
msgid "KEY"
-msgstr ""
+msgstr "NØKKEL"
msgid "Keep"
-msgstr ""
+msgstr "Behold"
msgid "Keep artifacts from most recent successful jobs"
msgstr ""
@@ -19410,22 +19727,22 @@ msgid "Keyboard shortcuts"
msgstr "Tastatursnarveier"
msgid "KeyboardKey|Alt"
-msgstr ""
+msgstr "Alt"
msgid "KeyboardKey|Ctrl"
-msgstr ""
+msgstr "Ctrl"
msgid "KeyboardKey|Ctrl+"
-msgstr ""
+msgstr "Ctrl+"
msgid "KeyboardKey|Enter"
-msgstr ""
+msgstr "Enter"
msgid "KeyboardKey|Esc"
-msgstr ""
+msgstr "Esc"
msgid "KeyboardKey|Shift"
-msgstr ""
+msgstr "Shift"
msgid "KeyboardShortcuts|No shortcuts matched your search"
msgstr ""
@@ -19440,7 +19757,7 @@ msgid "Ki"
msgstr "Ki"
msgid "Kroki"
-msgstr ""
+msgstr "Kroki"
msgid "Kubernetes"
msgstr "Kubernetes"
@@ -19485,7 +19802,7 @@ msgid "LDAP Synchronization"
msgstr "LDAP-synkronisering"
msgid "LDAP group settings"
-msgstr ""
+msgstr "LDAP-gruppeinnstillinger"
msgid "LDAP settings"
msgstr "LDAP-innstillinger"
@@ -19497,10 +19814,10 @@ msgid "LDAP sync in progress. This could take a few minutes. Refresh the page to
msgstr ""
msgid "LDAP synchronizations"
-msgstr ""
+msgstr "LDAP-synkroniseringer"
msgid "LDAP uid:"
-msgstr ""
+msgstr "LDAP-uid:"
msgid "LFS"
msgstr "LFS"
@@ -19548,16 +19865,16 @@ msgid "Labels"
msgstr "Stempler"
msgid "Labels can be applied to %{features}. Group labels are available for any project within the group."
-msgstr ""
+msgstr "Stempler kan brukes på %{features}. Gruppestempler er tilgjengelige for ethvert prosjekt innenfor gruppen."
msgid "Labels can be applied to issues and merge requests to categorize them."
msgstr ""
msgid "Labels can be applied to issues and merge requests."
-msgstr ""
+msgstr "Stempler kan brukes på saksrapporter og fletteforespørsler."
msgid "Labels with no issues in this iteration:"
-msgstr ""
+msgstr "Stempler uten saker i denne iterasjonen:"
msgid "Labels|%{spanStart}Promote label%{spanEnd} %{labelTitle} %{spanStart}to Group Label?%{spanEnd}"
msgstr ""
@@ -19580,16 +19897,16 @@ msgstr[0] "Siste %d dag"
msgstr[1] "Siste %d dager"
msgid "Last %{days} days"
-msgstr ""
+msgstr "Seneste %{days} dager"
msgid "Last 2 weeks"
-msgstr ""
+msgstr "Seneste 2 uker"
msgid "Last 30 days"
msgstr "Siste 30 dager"
msgid "Last 60 days"
-msgstr ""
+msgstr "Seneste 60 dager"
msgid "Last 90 days"
msgstr "Siste 90 dager"
@@ -19598,7 +19915,7 @@ msgid "Last Accessed On"
msgstr ""
msgid "Last Activity"
-msgstr ""
+msgstr "Nyeste aktivitet"
msgid "Last Pipeline"
msgstr "Nyeste rørledning"
@@ -19610,7 +19927,7 @@ msgid "Last Used"
msgstr "Sist brukt"
msgid "Last accessed on"
-msgstr ""
+msgstr "Senest åpnet den"
msgid "Last activity"
msgstr "Nyeste aktivitet"
@@ -19625,16 +19942,16 @@ msgid "Last edited %{date}"
msgstr "Sist endret %{date}"
msgid "Last edited by %{link_start}%{avatar} %{name}%{link_end}"
-msgstr ""
+msgstr "Senest redigert av %{link_start}%{avatar} %{name}%{link_end}"
msgid "Last item before this page loaded in your browser:"
msgstr ""
msgid "Last modified"
-msgstr ""
+msgstr "Senest endret"
msgid "Last month"
-msgstr ""
+msgstr "Forrige måned"
msgid "Last name"
msgstr "Etternavn"
@@ -19649,28 +19966,28 @@ msgid "Last seen"
msgstr "Sist sett"
msgid "Last sign-in"
-msgstr ""
+msgstr "Nyligst pålogget"
msgid "Last sign-in IP:"
-msgstr ""
+msgstr "IP-en ved nyligste pålogging:"
msgid "Last sign-in at:"
-msgstr ""
+msgstr "Nyligst pålogget kl.:"
msgid "Last successful sync"
-msgstr ""
+msgstr "Seneste vellykkede synkronisering"
msgid "Last successful update"
msgstr "Forrige vellykkede oppdatering"
msgid "Last time checked"
-msgstr ""
+msgstr "Senest sjekket"
msgid "Last time verified"
msgstr "Senest verifisert"
msgid "Last update"
-msgstr "Sist oppdatering"
+msgstr "Nyligst oppdatert"
msgid "Last update attempt"
msgstr "Forrige oppdateringsforsøk"
@@ -19691,13 +20008,13 @@ msgid "Last week"
msgstr "Forrige uke"
msgid "Last year"
-msgstr ""
+msgstr "I fjor"
msgid "LastCommit|authored"
msgstr "forfattet"
msgid "LastPushEvent|You pushed to"
-msgstr ""
+msgstr "Du pushet til"
msgid "LastPushEvent|at"
msgstr "den"
@@ -19724,13 +20041,13 @@ msgid "Learn GitLab - Ultimate trial"
msgstr ""
msgid "Learn GitLab|Trial only"
-msgstr ""
+msgstr "Kun prøveversjon"
msgid "Learn More"
-msgstr ""
+msgstr "Lær mer"
msgid "Learn More."
-msgstr ""
+msgstr "Les mer."
msgid "Learn how to %{link_start}contribute to the built-in templates%{link_end}"
msgstr ""
@@ -19745,7 +20062,7 @@ msgid "Learn more about %{link_start_tag}Jaeger configuration%{link_end_tag}."
msgstr ""
msgid "Learn more about %{username}"
-msgstr ""
+msgstr "Lær mer om %{username}"
msgid "Learn more about Auto DevOps"
msgstr "Lær mer om Auto DevOps"
@@ -19783,11 +20100,8 @@ msgstr "Lær mer om å signere commiter"
msgid "Learn more in the"
msgstr "Lær mer i"
-msgid "Learn more in the|pipeline schedules documentation"
-msgstr ""
-
msgid "Learn more."
-msgstr ""
+msgstr "Lær mer."
msgid "LearnGitLab|%{percentage}%{percentSymbol} completed"
msgstr ""
@@ -19805,7 +20119,7 @@ msgid "LearnGitLab|Create a workflow for your new workspace, and learn how GitLa
msgstr ""
msgid "LearnGitLab|Create an issue"
-msgstr ""
+msgstr "Lag en saksrapport"
msgid "LearnGitLab|Create or import a repository"
msgstr ""
@@ -19817,7 +20131,7 @@ msgid "LearnGitLab|Create/import issues (tickets) to collaborate on ideas and pl
msgstr ""
msgid "LearnGitLab|Deploy"
-msgstr ""
+msgstr "Distribuering"
msgid "LearnGitLab|Enable require merge approvals"
msgstr ""
@@ -19829,7 +20143,7 @@ msgid "LearnGitLab|Invite your colleagues"
msgstr ""
msgid "LearnGitLab|Learn GitLab"
-msgstr ""
+msgstr "Lær om GitLab"
msgid "LearnGitLab|Plan and execute"
msgstr ""
@@ -19856,13 +20170,13 @@ msgid "LearnGitLab|Scan your code to uncover vulnerabilities before deploying."
msgstr ""
msgid "LearnGitLab|Set up CI/CD"
-msgstr ""
+msgstr "Sett opp CI/CD"
msgid "LearnGitLab|Set up your workspace"
-msgstr ""
+msgstr "Sett opp arbeidsområdet ditt"
msgid "LearnGitLab|Set-up CI/CD"
-msgstr ""
+msgstr "Sett opp CI/CD"
msgid "LearnGitLab|Start a free Ultimate trial"
msgstr ""
@@ -19886,10 +20200,10 @@ msgid "LearnGitlab|Creating your onboarding experience..."
msgstr ""
msgid "LearnGitlab|Ok, let's go"
-msgstr ""
+msgstr "OK, da setter vi i gang"
msgid "LearnGitlab|Trial only"
-msgstr ""
+msgstr "Kun prøveperiode"
msgid "Leave"
msgstr "Forlat"
@@ -19897,9 +20211,6 @@ msgstr "Forlat"
msgid "Leave Admin Mode"
msgstr "Forlat adminmodus"
-msgid "Leave blank for no limit. Once set, existing personal access tokens may be revoked."
-msgstr ""
-
msgid "Leave edit mode? All unsaved changes will be lost."
msgstr ""
@@ -19925,13 +20236,13 @@ msgid "Let's Encrypt is a free, automated, and open certificate authority (CA) t
msgstr "Let's Encrypt er en gratis, automatisert og åpen sertifikatmyndighet (CA) som gir digitale sertifikater for å kunne aktivere HTTPS (SSL/TLS) på nettsteder. Lær mer om Let's Encrypt-oppsett ved å følge %{docs_link_start}dokumentasjonen på GitLab Pages%{docs_link_end}."
msgid "Let's talk!"
-msgstr ""
+msgstr "La oss ta en prat!"
msgid "License Compliance"
-msgstr ""
+msgstr "Lisensoverensstemmelse"
msgid "License file"
-msgstr ""
+msgstr "Lisensfil"
msgid "License overview"
msgstr "Lisensoversikt"
@@ -19945,12 +20256,12 @@ msgstr ""
msgid "LicenseCompliance|Acceptable license to be used in the project"
msgstr ""
-msgid "LicenseCompliance|Add a license"
-msgstr "Legg til en lisens"
-
msgid "LicenseCompliance|Add license and related policy"
msgstr ""
+msgid "LicenseCompliance|Add license policy"
+msgstr ""
+
msgid "LicenseCompliance|Allow"
msgstr "Tillat"
@@ -20038,6 +20349,9 @@ msgstr "Avvist"
msgid "LicenseManagement|Uncategorized"
msgstr "Ukategorisert"
+msgid "Licensed Enterprise Edition features can be used if the project namespace's plan includes the feature, or if the project is public."
+msgstr ""
+
msgid "Licensed Features"
msgstr "Lisensierte funksjoner"
@@ -20075,7 +20389,7 @@ msgid "Licenses|Error fetching the license list. Please check your network conne
msgstr ""
msgid "Licenses|License Compliance"
-msgstr ""
+msgstr "Lisens-overensstemmelse"
msgid "Licenses|Name"
msgstr "Navn"
@@ -20104,7 +20418,10 @@ msgstr ""
msgid "Limit namespaces and projects that can be indexed"
msgstr ""
-msgid "Limit sign in from multiple ips"
+msgid "Limit project size at a global, group, and project level. %{link_start}Learn more%{link_end}."
+msgstr ""
+
+msgid "Limit sign in from multiple IP addresses"
msgstr ""
msgid "Limit the number of concurrent operations this secondary site can run in the background."
@@ -20116,16 +20433,22 @@ msgstr ""
msgid "Limit the number of issues and epics per minute a user can create through web and API requests."
msgstr ""
+msgid "Limit the size of Sidekiq jobs stored in Redis."
+msgstr ""
+
msgid "Limited to showing %d event at most"
msgid_plural "Limited to showing %d events at most"
msgstr[0] ""
msgstr[1] ""
+msgid "Limiting mode"
+msgstr ""
+
msgid "Line changes"
msgstr "Linjeendringer"
msgid "Link"
-msgstr ""
+msgstr "Lenke"
msgid "Link Prometheus monitoring to GitLab."
msgstr ""
@@ -20134,7 +20457,7 @@ msgid "Link Sentry to GitLab to discover and view the errors your application ge
msgstr ""
msgid "Link URL"
-msgstr ""
+msgstr "Lenke-URL"
msgid "Link an external wiki from the project's sidebar. %{docs_link}"
msgstr ""
@@ -20143,7 +20466,7 @@ msgid "Link copied"
msgstr "Lenken er kopiert"
msgid "Link text"
-msgstr ""
+msgstr "Lenketekst"
msgid "Link title"
msgstr "Lenketittel"
@@ -20152,7 +20475,7 @@ msgid "Link title is required"
msgstr "Lenketittel er påkrevd"
msgid "Link to an image"
-msgstr ""
+msgstr "Lenk til et bilde"
msgid "Link to go to GitLab pipeline documentation"
msgstr ""
@@ -20170,7 +20493,7 @@ msgid "LinkedIn"
msgstr "Linkedin"
msgid "LinkedIn:"
-msgstr ""
+msgstr "LinkedIn:"
msgid "LinkedPipelines|%{counterLabel} more downstream pipelines"
msgstr ""
@@ -20190,11 +20513,8 @@ msgstr "List opp tilgjengelige kodelagre"
msgid "List of all merge commits"
msgstr "Liste over alle innflettings-commits"
-msgid "List of users to be excluded from the limit"
-msgstr ""
-
msgid "List options"
-msgstr ""
+msgstr "Listealternativer"
msgid "List settings"
msgstr "Liste innstillinger"
@@ -20221,7 +20541,7 @@ msgid "Loading"
msgstr "Laster"
msgid "Loading %{name}"
-msgstr ""
+msgstr "Laster inn %{name}"
msgid "Loading contribution stats for group members"
msgstr ""
@@ -20232,11 +20552,8 @@ msgstr ""
msgid "Loading functions timed out. Please reload the page to try again."
msgstr ""
-msgid "Loading issues"
-msgstr "Laster inn saker"
-
msgid "Loading more"
-msgstr ""
+msgstr "Laster inn mer"
msgid "Loading snippet"
msgstr "Laster inn utdrag"
@@ -20260,7 +20577,7 @@ msgid "Location"
msgstr "Adresse"
msgid "Location:"
-msgstr ""
+msgstr "Lokasjon:"
msgid "Lock"
msgstr "LÃ¥s"
@@ -20359,7 +20676,7 @@ msgid "MRDiffFile|Changes are too large to be shown."
msgstr ""
msgid "MRDiffFile|View file @ %{commitSha}"
-msgstr ""
+msgstr "Vis fil @ %{commitSha}"
msgid "MRDiff|Show changes only"
msgstr "Vis kun endringer"
@@ -20371,13 +20688,13 @@ msgid "Made this issue confidential."
msgstr "Gjorde denne saken konfidensiell."
msgid "Mailgun"
-msgstr ""
+msgstr "Mailgun"
msgid "Mailgun HTTP webhook signing key"
msgstr ""
msgid "Mailgun events"
-msgstr ""
+msgstr "Mailgun-hendelser"
msgid "Maintenance mode"
msgstr "Vedlikeholdsmodus"
@@ -20431,7 +20748,7 @@ msgid "Manage project labels"
msgstr "Administrer prosjekt-etiketter"
msgid "Manage projects."
-msgstr ""
+msgstr "Behandle prosjekter."
msgid "Manage two-factor authentication"
msgstr "Behandle 2-trinnsautentisering"
@@ -20443,7 +20760,7 @@ msgid "Manage your project's triggers"
msgstr ""
msgid "Managed Account"
-msgstr ""
+msgstr "Behandlet konto"
msgid "Manifest"
msgstr "Manifest"
@@ -20455,7 +20772,7 @@ msgid "Manifest import"
msgstr "Manifest-importering"
msgid "Manual"
-msgstr ""
+msgstr "Manuell"
msgid "ManualOrdering|Couldn't save the order of the issues"
msgstr ""
@@ -20476,10 +20793,10 @@ msgid "Mark as done"
msgstr "Marker som ferdig"
msgid "Mark as draft"
-msgstr ""
+msgstr "Marker som utkast"
msgid "Mark as ready"
-msgstr ""
+msgstr "Marker som klar"
msgid "Mark this issue as a duplicate of another issue"
msgstr "Merk denne saken som et duplikat av en annet sak"
@@ -20488,7 +20805,7 @@ msgid "Mark this issue as related to another issue"
msgstr "Merk denne saken som relatert til en annen sak"
msgid "Mark to do as done"
-msgstr ""
+msgstr "Merk oppgaven som ferdig"
msgid "Markdown"
msgstr "Markdown"
@@ -20497,35 +20814,38 @@ msgid "Markdown Help"
msgstr "Markdown-hjelp"
msgid "Markdown enabled."
-msgstr ""
+msgstr "Markdown er skrudd på."
msgid "Markdown is supported"
msgstr "Markdown er støttet"
msgid "Markdown supported."
-msgstr ""
+msgstr "Markdown støttes."
msgid "MarkdownEditor|Add a link (%{modifierKey}K)"
-msgstr ""
+msgstr "Legg til en lenke (%{modifierKey}K)"
msgid "MarkdownEditor|Add a link (%{modifier_key}K)"
-msgstr ""
+msgstr "Legg til en lenke (%{modifier_key}K)"
msgid "MarkdownEditor|Add bold text (%{modifierKey}B)"
-msgstr ""
+msgstr "Legg til fet tekst (%{modifierKey}B)"
msgid "MarkdownEditor|Add bold text (%{modifier_key}B)"
-msgstr ""
+msgstr "Legg til fet tekst (%{modifier_key}B)"
msgid "MarkdownEditor|Add italic text (%{modifierKey}I)"
-msgstr ""
+msgstr "Legg til kursiv tekst (%{modifierKey}I)"
msgid "MarkdownEditor|Add italic text (%{modifier_key}I)"
-msgstr ""
+msgstr "Legg til kursiv tekst (%{modifier_key}I)"
msgid "Marked For Deletion At - %{deletion_time}"
msgstr ""
+msgid "Marked as ready. Merging is now allowed."
+msgstr ""
+
msgid "Marked this %{noun} as a draft."
msgstr ""
@@ -20536,7 +20856,7 @@ msgid "Marked this issue as related to %{issue_ref}."
msgstr ""
msgid "Marked to do as done."
-msgstr ""
+msgstr "Markerte oppgaven som ferdig."
msgid "Marks this %{noun} as a draft."
msgstr ""
@@ -20548,7 +20868,7 @@ msgid "Marks this issue as related to %{issue_ref}."
msgstr ""
msgid "Marks to do as done."
-msgstr ""
+msgstr "Markerer oppgaven som ferdig."
msgid "Mask variable"
msgstr ""
@@ -20557,16 +20877,16 @@ msgid "Match not found; try refining your search query."
msgstr ""
msgid "Mattermost"
-msgstr ""
+msgstr "Mattermost"
msgid "Mattermost URL:"
-msgstr ""
+msgstr "Mattermost-URL:"
msgid "Mattermost notifications"
msgstr ""
msgid "MattermostService|Add to Mattermost"
-msgstr ""
+msgstr "Legg til i Mattermost"
msgid "MattermostService|After you configure the integration, view your new Mattermost commands by entering"
msgstr ""
@@ -20596,54 +20916,24 @@ msgid "MattermostService|Use this service to perform common tasks in your projec
msgstr ""
msgid "Max 100,000 events"
-msgstr ""
-
-msgid "Max 20 characters"
-msgstr ""
-
-msgid "Max Group Export Download requests per minute per user"
-msgstr ""
-
-msgid "Max Group Export requests per minute per user"
-msgstr ""
-
-msgid "Max Group Import requests per minute per user"
-msgstr ""
-
-msgid "Max Project Export Download requests per minute per user"
-msgstr ""
-
-msgid "Max Project Export requests per minute per user"
-msgstr ""
-
-msgid "Max Project Import requests per minute per user"
-msgstr ""
-
-msgid "Max authenticated API requests per period per user"
-msgstr ""
+msgstr "Max 100 000 hendelser"
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
-msgid "Max authenticated web requests per period per user"
-msgstr ""
-
msgid "Max file size is 200 KB."
-msgstr ""
-
-msgid "Max requests per minute per user"
-msgstr ""
+msgstr "Maks filstørrelse er 200 KB."
msgid "Max role"
msgstr ""
msgid "Max session time"
-msgstr ""
+msgstr "Maks økttid"
-msgid "Max unauthenticated requests per period per IP"
+msgid "MaxBuilds"
msgstr ""
-msgid "MaxBuilds"
+msgid "Maximum 20 characters"
msgstr ""
msgid "Maximum Conan package file size in bytes"
@@ -20662,7 +20952,7 @@ msgid "Maximum Terraform Module package file size in bytes"
msgstr ""
msgid "Maximum Users"
-msgstr ""
+msgstr "Maks antall brukere"
msgid "Maximum allowable lifetime for personal access token (days)"
msgstr ""
@@ -20679,6 +20969,12 @@ msgstr ""
msgid "Maximum attachment size (MB)"
msgstr ""
+msgid "Maximum authenticated API requests per rate limit period per user"
+msgstr ""
+
+msgid "Maximum authenticated web requests per rate limit period per user"
+msgstr ""
+
msgid "Maximum bulk request size (MiB)"
msgstr ""
@@ -20724,6 +21020,15 @@ msgstr "Maks filstørrelse er 2MB. Vennligst velg en mindre fil."
msgid "Maximum files in a diff"
msgstr ""
+msgid "Maximum group export download requests per minute"
+msgstr ""
+
+msgid "Maximum group export requests per minute"
+msgstr ""
+
+msgid "Maximum group import requests per minute"
+msgstr ""
+
msgid "Maximum import size"
msgstr ""
@@ -20760,21 +21065,33 @@ msgstr ""
msgid "Maximum number of projects."
msgstr "Maks antall prosjekter."
-msgid "Maximum number of unique IPs per user"
+msgid "Maximum number of unique IP addresses per user."
msgstr ""
msgid "Maximum page reached"
msgstr "Maks-siden har blitt nådd"
msgid "Maximum page size"
+msgstr "Maks sidestørrelse"
+
+msgid "Maximum project export download requests per minute"
msgstr ""
-msgid "Maximum push size"
+msgid "Maximum project export requests per minute"
+msgstr ""
+
+msgid "Maximum project import requests per minute"
msgstr ""
+msgid "Maximum push size"
+msgstr "Maks push-størrelse"
+
msgid "Maximum push size (MB)"
msgstr "Maksimal pushstørrelse (MB)"
+msgid "Maximum requests per minute"
+msgstr ""
+
msgid "Maximum running slices"
msgstr ""
@@ -20794,7 +21111,7 @@ msgid "Maximum size of individual attachments in comments."
msgstr ""
msgid "Maximum size of pages (MB)"
-msgstr ""
+msgstr "Maks sidestørrelse (MB)"
msgid "Maximum snippet size"
msgstr ""
@@ -20802,10 +21119,16 @@ msgstr ""
msgid "Maximum time between updates that a mirror can have when scheduled to synchronize."
msgstr ""
-msgid "Maximum time for web terminal websocket connection (in seconds). 0 for unlimited."
+msgid "Maximum time that users are allowed to skip the setup of two-factor authentication (in hours). Set to 0 (zero) to enforce at next sign in."
msgstr ""
-msgid "Maximum time that users are allowed to skip the setup of two-factor authentication (in hours). Set to 0 (zero) to enforce at next sign in."
+msgid "Maximum time, in seconds, for a web terminal websocket connection. 0 for unlimited."
+msgstr ""
+
+msgid "Maximum unauthenticated API requests per rate limit period per IP"
+msgstr ""
+
+msgid "Maximum unauthenticated web requests per rate limit period per IP"
msgstr ""
msgid "May"
@@ -20823,17 +21146,14 @@ msgstr ""
msgid "Medium vulnerabilities present"
msgstr ""
-msgid "Member lock"
-msgstr "Medlemslås"
-
msgid "Member since"
-msgstr ""
+msgstr "Medlem siden"
msgid "Member since %{date}"
msgstr "Medlem siden %{date}"
msgid "Member since:"
-msgstr ""
+msgstr "Medlem siden:"
msgid "MemberInviteEmail|%{member_name} invited you to join GitLab"
msgstr ""
@@ -20862,14 +21182,17 @@ msgstr ""
msgid "Members of a group may only view projects they have permission to access"
msgstr ""
-msgid "Members|%{time} by %{user}"
+msgid "Membership"
msgstr ""
+msgid "Members|%{time} by %{user}"
+msgstr "%{time} av %{user}"
+
msgid "Members|%{userName} is currently an LDAP user. Editing their permissions will override the settings from the LDAP group sync."
msgstr ""
msgid "Members|2FA"
-msgstr ""
+msgstr "2FA"
msgid "Members|An error occurred while trying to enable LDAP override, please try again."
msgstr ""
@@ -20905,16 +21228,16 @@ msgid "Members|Are you sure you want to withdraw your access request for \"%{sou
msgstr ""
msgid "Members|Direct"
-msgstr ""
+msgstr "Direkte"
msgid "Members|Disabled"
-msgstr ""
+msgstr "Skrudd av"
msgid "Members|Edit permissions"
-msgstr ""
+msgstr "Rediger tillatelser"
msgid "Members|Enabled"
-msgstr ""
+msgstr "Skrudd på"
msgid "Members|Expiration date removed successfully."
msgstr ""
@@ -20922,14 +21245,11 @@ msgstr ""
msgid "Members|Expiration date updated successfully."
msgstr ""
-msgid "Members|Expired"
-msgstr ""
-
msgid "Members|Filter members"
-msgstr ""
+msgstr "Filtrer medlemmer"
msgid "Members|Inherited"
-msgstr ""
+msgstr "Arvet"
msgid "Members|LDAP override enabled."
msgstr ""
@@ -20938,16 +21258,13 @@ msgid "Members|Leave \"%{source}\""
msgstr ""
msgid "Members|Membership"
-msgstr ""
-
-msgid "Members|No expiration set"
-msgstr ""
+msgstr "Medlemskap"
msgid "Members|Remove \"%{groupName}\""
-msgstr ""
+msgstr "Fjern «%{groupName}»"
msgid "Members|Remove group"
-msgstr ""
+msgstr "Fjern gruppe"
msgid "Members|Revert to LDAP group sync settings"
msgstr ""
@@ -20959,28 +21276,25 @@ msgid "Members|Role updated successfully."
msgstr ""
msgid "Members|Search groups"
-msgstr ""
+msgstr "Søk i grupper"
msgid "Members|Search invited"
-msgstr ""
-
-msgid "Members|in %{time}"
-msgstr ""
+msgstr "Søk i inviterte"
msgid "Member|Deny access"
-msgstr ""
+msgstr "Nekt tilgang"
msgid "Member|Remove member"
-msgstr ""
+msgstr "Fjern medlem"
msgid "Member|Revoke invite"
-msgstr ""
+msgstr "Tilbakekall invitasjon"
msgid "Memory Usage"
msgstr "Minneforbruk"
msgid "Menu"
-msgstr ""
+msgstr "Meny"
msgid "Merge"
msgstr "Flett"
@@ -21004,7 +21318,7 @@ msgid "Merge Requests in Review"
msgstr ""
msgid "Merge Requests merged"
-msgstr ""
+msgstr "Fletteforespørsler slått sammen"
msgid "Merge automatically (%{strategy})"
msgstr ""
@@ -21034,7 +21348,7 @@ msgid "Merge locally"
msgstr "Flett lokalt"
msgid "Merge options"
-msgstr ""
+msgstr "Fletteinnstillinger"
msgid "Merge request"
msgstr "Fletteforespørsel"
@@ -21042,9 +21356,6 @@ msgstr "Fletteforespørsel"
msgid "Merge request %{mr_link} was reviewed by %{mr_author}"
msgstr "Fletteforespørselen %{mr_link} ble gjennomgått av %{mr_author}"
-msgid "Merge request (MR) approvals"
-msgstr ""
-
msgid "Merge request analytics"
msgstr ""
@@ -21058,7 +21369,7 @@ msgid "Merge request dependencies"
msgstr ""
msgid "Merge request events"
-msgstr ""
+msgstr "Fletteforespørselshendelser"
msgid "Merge request was scheduled to merge after pipeline succeeds"
msgstr ""
@@ -21066,12 +21377,21 @@ msgstr ""
msgid "Merge requests"
msgstr "Fletteforespørsel"
+msgid "Merge requests I've created"
+msgstr ""
+
msgid "Merge requests are a place to propose changes you've made to a project and discuss those changes with others"
msgstr ""
msgid "Merge requests are read-only in a secondary Geo node"
msgstr ""
+msgid "Merge requests assigned to me"
+msgstr ""
+
+msgid "Merge requests that I'm a reviewer"
+msgstr ""
+
msgid "Merge the branch and fix any conflicts that come up"
msgstr ""
@@ -21088,7 +21408,7 @@ msgid "MergeConflict|HEAD//our changes"
msgstr ""
msgid "MergeConflict|Use ours"
-msgstr ""
+msgstr "Bruk den vi har"
msgid "MergeConflict|Use theirs"
msgstr ""
@@ -21103,7 +21423,7 @@ msgid "MergeConflict|origin//their changes"
msgstr ""
msgid "MergeRequestAnalytics|Assignees"
-msgstr ""
+msgstr "Tilordnede"
msgid "MergeRequestAnalytics|Date Merged"
msgstr "Innflettingsdato"
@@ -21132,11 +21452,11 @@ msgstr ""
msgid "MergeRequests|An error occurred while saving the draft comment."
msgstr ""
-msgid "MergeRequests|Failed to squash. Should be done manually."
+msgid "MergeRequests|Create issue to resolve thread"
msgstr ""
-msgid "MergeRequests|Resolve this thread in a new issue"
-msgstr "Oppklar denne tråden i en ny sak"
+msgid "MergeRequests|Failed to squash. Should be done manually."
+msgstr ""
msgid "MergeRequests|Saving the comment failed"
msgstr "Lagring av kommentaren mislyktes"
@@ -21181,7 +21501,7 @@ msgid "MergeRequests|started a thread on commit %{linkStart}%{commitDisplay}%{li
msgstr ""
msgid "MergeRequest|Approved by @%{username}"
-msgstr ""
+msgstr "Godkjent av @%{username}"
msgid "MergeRequest|Compare %{target} and %{source}"
msgstr "Sammenlign %{target} og %{source}"
@@ -21208,13 +21528,13 @@ msgid "Merged branches are being deleted. This can take some time depending on t
msgstr ""
msgid "Merged by"
-msgstr ""
+msgstr "Slått sammen av"
msgid "Merged this merge request."
msgstr "Innflettet denne fletteforespørselen."
msgid "Merged: %{merged}"
-msgstr ""
+msgstr "Flettet inn: %{merged}"
msgid "Merges this merge request immediately."
msgstr ""
@@ -21259,7 +21579,7 @@ msgid "Metrics"
msgstr "MÃ¥ltall"
msgid "Metrics - Grafana"
-msgstr ""
+msgstr "MÃ¥ltall - Grafana"
msgid "Metrics - Prometheus"
msgstr "MÃ¥ltall - Prometheus"
@@ -21325,13 +21645,13 @@ msgid "MetricsSettings|Manage metrics dashboard settings."
msgstr ""
msgid "MetricsSettings|Metrics"
-msgstr ""
+msgstr "MÃ¥ltall"
msgid "MetricsSettings|UTC (Coordinated Universal Time)"
msgstr "UTC (Coordinated Universal Time)"
msgid "MetricsSettings|User's local timezone"
-msgstr ""
+msgstr "Brukerens lokale tidssone"
msgid "Metrics|1. Define and preview panel"
msgstr ""
@@ -21340,7 +21660,7 @@ msgid "Metrics|2. Paste panel YAML into dashboard"
msgstr ""
msgid "Metrics|Add metric"
-msgstr ""
+msgstr "Legg til måltall"
msgid "Metrics|Add panel"
msgstr "Legg til panel"
@@ -21361,7 +21681,7 @@ msgid "Metrics|Collapse panel"
msgstr "Klapp sammen panel"
msgid "Metrics|Collapse panel (Esc)"
-msgstr ""
+msgstr "Klapp sammen panel (Esc)"
msgid "Metrics|Copy YAML"
msgstr "Kopier YAML"
@@ -21391,7 +21711,7 @@ msgid "Metrics|Define panel YAML below to preview panel."
msgstr ""
msgid "Metrics|Delete metric"
-msgstr ""
+msgstr "Slett måltall"
msgid "Metrics|Delete metric?"
msgstr ""
@@ -21412,12 +21732,12 @@ msgid "Metrics|Duplicating..."
msgstr "Dupliserer …"
msgid "Metrics|Edit dashboard YAML"
-msgstr ""
+msgstr "Rediger kontrollpanels-YAML"
msgid "Metrics|Edit metric"
msgid_plural "Metrics|Edit metrics"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "Rediger måltall"
+msgstr[1] "Rediger måltall"
msgid "Metrics|Expand panel"
msgstr "Utvid panel"
@@ -21474,10 +21794,10 @@ msgid "Metrics|Panel YAML copied"
msgstr ""
msgid "Metrics|Preview panel"
-msgstr ""
+msgstr "Forhåndsvisningspanel"
msgid "Metrics|PromQL query is valid"
-msgstr ""
+msgstr "PromQL-spørringen er gyldig"
msgid "Metrics|Prometheus Query Documentation"
msgstr "Prometheus spørrings-dokumentasjon"
@@ -21603,7 +21923,7 @@ msgid "Migrated %{success_count}/%{total_count} files."
msgstr ""
msgid "Migration"
-msgstr ""
+msgstr "Migrering"
msgid "Migration has been scheduled to be retried"
msgstr ""
@@ -21617,7 +21937,7 @@ msgstr[0] "Milepæl"
msgstr[1] "Milepæler"
msgid "Milestone due date"
-msgstr ""
+msgstr "Milepælens forfallsdato"
msgid "Milestone lists not available with your current license"
msgstr ""
@@ -21626,25 +21946,25 @@ msgid "MilestoneCombobox|An error occurred while searching for milestones"
msgstr ""
msgid "MilestoneCombobox|Group milestones"
-msgstr ""
+msgstr "Gruppemilepæler"
msgid "MilestoneCombobox|Milestone"
-msgstr ""
+msgstr "Milepæl"
msgid "MilestoneCombobox|No matching results"
-msgstr ""
+msgstr "Ingen samsvarende resultater"
msgid "MilestoneCombobox|No milestone"
-msgstr ""
+msgstr "Ingen milepæl"
msgid "MilestoneCombobox|Project milestones"
-msgstr ""
+msgstr "Prosjektmilepæler"
msgid "MilestoneCombobox|Search Milestones"
-msgstr ""
+msgstr "Søk i milepæler"
msgid "MilestoneCombobox|Select milestone"
-msgstr ""
+msgstr "Velg milepæl"
msgid "MilestoneSidebar|Closed:"
msgstr "Lukket:"
@@ -21803,10 +22123,10 @@ msgid "Mirroring will only be available if the feature is included in the plan o
msgstr ""
msgid "Miscellaneous"
-msgstr ""
+msgstr "Diverse"
msgid "Missing"
-msgstr ""
+msgstr "Mangler"
msgid "Missing OAuth configuration for GitHub."
msgstr "Manglende OAuth-konfigurasjon for GitHub."
@@ -21854,10 +22174,10 @@ msgid "Monday"
msgstr "Mandag"
msgid "Monitor"
-msgstr ""
+msgstr "Observer"
msgid "Monitor Settings"
-msgstr ""
+msgstr "Innstillinger for observering"
msgid "Monitor the health and performance of GitLab with Prometheus."
msgstr ""
@@ -21905,10 +22225,10 @@ msgid "More than %{number_commits_distance} commits different with %{default_bra
msgstr "Mer enn %{number_commits_distance} commiter er annerledes fra %{default_branch}"
msgid "More topics"
-msgstr ""
+msgstr "Flere temaer"
msgid "Most relevant"
-msgstr ""
+msgstr "Mest relevant"
msgid "Most stars"
msgstr "Flest stjerner"
@@ -21920,7 +22240,7 @@ msgid "Move"
msgstr "Flytt"
msgid "Move down"
-msgstr ""
+msgstr "Flytt ned"
msgid "Move issue"
msgstr "Flytt problemet"
@@ -21941,7 +22261,7 @@ msgid "Move this issue to another project."
msgstr "Flytt denne saken til et annet prosjekt."
msgid "Move up"
-msgstr ""
+msgstr "Flytt opp"
msgid "MoveIssue|Cannot move issue due to insufficient permissions!"
msgstr ""
@@ -21949,6 +22269,9 @@ msgstr ""
msgid "MoveIssue|Cannot move issue to project it originates from!"
msgstr ""
+msgid "MoveIssue|Cannot move issues of '%{issue_type}' type."
+msgstr ""
+
msgid "Moved issue to %{label} column in the board."
msgstr ""
@@ -21962,10 +22285,10 @@ msgid "Moves this issue to %{path_to_project}."
msgstr "Flytter denne saken til %{path_to_project}."
msgid "MrDeploymentActions|Deploy"
-msgstr ""
+msgstr "Distribuering"
msgid "MrDeploymentActions|Re-deploy"
-msgstr ""
+msgstr "Distribuer på nytt"
msgid "MrDeploymentActions|Stop environment"
msgstr ""
@@ -22019,13 +22342,13 @@ msgid "Name"
msgstr "Navn"
msgid "Name can't be blank"
-msgstr ""
+msgstr "Navnet kan ikke være blankt"
msgid "Name has already been taken"
-msgstr ""
+msgstr "Navnet har allerede blitt tatt"
msgid "Name is already taken."
-msgstr ""
+msgstr "Navnet er allerede tatt."
msgid "Name new label"
msgstr "Navnet på nytt stempel"
@@ -22037,7 +22360,7 @@ msgid "Namespace"
msgstr "Navnefelt"
msgid "Namespace ID:"
-msgstr ""
+msgstr "Navneområde-ID:"
msgid "Namespace is empty"
msgstr "Navnefeltet er tomt"
@@ -22074,6 +22397,15 @@ 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. To learn more about reducing storage capacity please visit our docs."
msgstr ""
+msgid "NamespaceUserCap|Pending users must be reviewed and approved by a group owner. Learn more about %{user_caps_link_start}User Caps%{link_end} and %{users_pending_approval_link_start}Users Pending Approval%{link_end}."
+msgstr ""
+
+msgid "NamespaceUserCap|View pending user approvals"
+msgstr ""
+
+msgid "NamespaceUserCap|Your group has reached its billable member limit"
+msgstr ""
+
msgid "Namespaces"
msgstr "Navnerom"
@@ -22090,7 +22422,7 @@ msgid "Navigate to the project to close the milestone."
msgstr ""
msgid "Navigation bar"
-msgstr ""
+msgstr "Navigasjonslinje"
msgid "Nav|Help"
msgstr "Hjelp"
@@ -22116,9 +22448,6 @@ msgstr "Trenger oppmerksomhet"
msgid "Network"
msgstr "Nettverk"
-msgid "Network Policy|New rule"
-msgstr ""
-
msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is inbound from a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
msgstr "%{ifLabelStart}hvis%{ifLabelEnd} %{ruleType} %{isLabelStart}er%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}og er innkommende fra en%{directionLabelEnd} %{rule} %{portsLabelStart}på%{portsLabelEnd} %{ports}"
@@ -22140,17 +22469,14 @@ msgstr "%{strongOpen}alle%{strongClose} podder"
msgid "NetworkPolicies|%{strongOpen}any%{strongClose} port"
msgstr "%{strongOpen}enhver%{strongClose} port"
-msgid "NetworkPolicies|+ Add alert"
-msgstr ""
-
msgid "NetworkPolicies|.yaml"
msgstr ".yaml"
msgid "NetworkPolicies|.yaml mode"
msgstr ".yaml-modus"
-msgid "NetworkPolicies|Actions"
-msgstr "Handlinger"
+msgid "NetworkPolicies|Add alert"
+msgstr ""
msgid "NetworkPolicies|Alerts are intended to be selectively used for a limited number of events that are potentially concerning and warrant a manual review. Alerts should not be used as a substitute for a SIEM or a logging tool. High volume alerts are likely to be dropped so as to preserve the stability of GitLab's integration with Kubernetes."
msgstr ""
@@ -22177,7 +22503,7 @@ msgid "NetworkPolicies|Define this policy's location, conditions and actions."
msgstr ""
msgid "NetworkPolicies|Delete policy"
-msgstr ""
+msgstr "Slett retningslinje"
msgid "NetworkPolicies|Delete policy: %{policy}"
msgstr ""
@@ -22185,11 +22511,8 @@ msgstr ""
msgid "NetworkPolicies|Deny all traffic"
msgstr "Avvis all trafikk"
-msgid "NetworkPolicies|Description"
-msgstr "Beskrivelse"
-
msgid "NetworkPolicies|Edit policy"
-msgstr ""
+msgstr "Rediger retningslinje"
msgid "NetworkPolicies|Enforcement status"
msgstr ""
@@ -22200,9 +22523,6 @@ msgstr ""
msgid "NetworkPolicies|IP/subnet"
msgstr "IP/undernett"
-msgid "NetworkPolicies|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
-msgstr "Hvis du bruker Auto DevOps, vil ikke din %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd}-filen bli oppdatert hvis du endrer en retningslinje i denne delen. Auto DevOps-brukere bør gjøre endringer ved å følge dokumentasjonen for %{linkStart}Container-nettverksretningslinjer%{linkEnd}."
-
msgid "NetworkPolicies|Invalid or empty policy"
msgstr "Ugyldig eller tom retningslinje"
@@ -22212,42 +22532,30 @@ msgstr ""
msgid "NetworkPolicies|Kubernetes error: %{error}"
msgstr "Kubernetes-feil: %{error}"
-msgid "NetworkPolicies|Name"
-msgstr "Navn"
-
msgid "NetworkPolicies|Network"
+msgstr "Nettverk"
+
+msgid "NetworkPolicies|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
+msgstr ""
+
+msgid "NetworkPolicies|Network policy can be created after the environment is loaded successfully."
msgstr ""
msgid "NetworkPolicies|Network traffic"
msgstr "Nettverkstrafikk"
-msgid "NetworkPolicies|New policy"
-msgstr "Ny retningslinje"
-
-msgid "NetworkPolicies|No policies detected"
-msgstr "Ingen retningslinjer ble oppdaget"
-
msgid "NetworkPolicies|None selected"
msgstr "Ingen valgt"
msgid "NetworkPolicies|Please %{installLinkStart}install%{installLinkEnd} and %{configureLinkStart}configure a Kubernetes Agent for this project%{configureLinkEnd} to enable alerts."
msgstr ""
-msgid "NetworkPolicies|Policies are a specification of how groups of pods are allowed to communicate with each other's network endpoints."
-msgstr ""
-
msgid "NetworkPolicies|Policy %{policyName} was successfully changed"
msgstr "%{policyName}-retningslinjen ble vellykket endret"
msgid "NetworkPolicies|Policy definition"
msgstr "Retningslinjedefinisjon"
-msgid "NetworkPolicies|Policy editor"
-msgstr "Retningslinjeredigerer"
-
-msgid "NetworkPolicies|Policy preview"
-msgstr ""
-
msgid "NetworkPolicies|Rule"
msgstr "Regel"
@@ -22257,11 +22565,8 @@ msgstr "Regelmodus"
msgid "NetworkPolicies|Rule mode is unavailable for this policy. In some cases, we cannot parse the YAML file back into the rules editor."
msgstr ""
-msgid "NetworkPolicies|Rules"
-msgstr "Regler"
-
msgid "NetworkPolicies|Save changes"
-msgstr ""
+msgstr "Lagre endringer"
msgid "NetworkPolicies|Something went wrong, failed to update policy"
msgstr ""
@@ -22272,9 +22577,6 @@ msgstr ""
msgid "NetworkPolicies|Traffic that does not match any rule will be blocked."
msgstr ""
-msgid "NetworkPolicies|Unable to parse policy"
-msgstr ""
-
msgid "NetworkPolicies|all DNS names"
msgstr "alle DNS-navn"
@@ -22318,13 +22620,13 @@ msgid "NetworkPolicies|ports/protocols"
msgstr "porter/protokoller"
msgid "NetworkPolicy|Policy"
-msgstr ""
+msgstr "Retningslinje"
msgid "NetworkPolicy|Search by policy name"
msgstr ""
msgid "NetworkPolicy|Status"
-msgstr ""
+msgstr "Status"
msgid "Never"
msgstr "Aldri"
@@ -22333,7 +22635,7 @@ msgid "New"
msgstr "Ny"
msgid "New %{issueType}"
-msgstr ""
+msgstr "Ny %{issueType}"
msgid "New Application"
msgstr "Ny applikasjon"
@@ -22401,7 +22703,7 @@ msgid "New User"
msgstr "Ny bruker"
msgid "New application"
-msgstr ""
+msgstr "Nytt program"
msgid "New branch"
msgstr "Ny gren"
@@ -22422,7 +22724,7 @@ msgid "New directory"
msgstr "Ny katalog"
msgid "New discussion"
-msgstr ""
+msgstr "Ny diskusjon"
msgid "New environment"
msgstr "Nytt miljø"
@@ -22443,7 +22745,7 @@ msgid "New group URL"
msgstr ""
msgid "New group name"
-msgstr ""
+msgstr "Nytt gruppenavn"
msgid "New health check access token has been generated!"
msgstr ""
@@ -22454,17 +22756,20 @@ msgstr "Ny identitet"
msgid "New issue"
msgstr "Ny sak"
+msgid "New issue in %{project}"
+msgstr ""
+
msgid "New issue title"
msgstr "Tittel på den nye saken"
msgid "New iteration created"
-msgstr ""
+msgstr "En ny iterasjon ble opprettet"
msgid "New label"
msgstr "Nytt merke"
msgid "New list"
-msgstr ""
+msgstr "Ny liste"
msgid "New merge request"
msgstr "Ny fletteforespørsel"
@@ -22482,13 +22787,13 @@ msgid "New project"
msgstr "Nytt prosjekt"
msgid "New project page"
-msgstr ""
+msgstr "Ny prosjektside"
msgid "New project pages"
-msgstr ""
+msgstr "Nye prosjektsider"
msgid "New project/repository"
-msgstr ""
+msgstr "Nytt prosjekt/kodelager"
msgid "New public deploy key"
msgstr ""
@@ -22532,7 +22837,7 @@ msgstr "Ny..."
msgid "Newest first"
msgstr "Nyeste øverst"
-msgid "Newly registered users will by default be external"
+msgid "Newly-registered users are external by default"
msgstr ""
msgid "Next"
@@ -22542,7 +22847,7 @@ msgid "Next commit"
msgstr "Neste commit"
msgid "Next design"
-msgstr ""
+msgstr "Neste design"
msgid "Next file in diff"
msgstr "Neste fil i diff"
@@ -22572,7 +22877,7 @@ msgid "No Matching Results"
msgstr "Ingen samsvarende resultater"
msgid "No Milestone"
-msgstr ""
+msgstr "Ingen milepæl"
msgid "No Scopes"
msgstr ""
@@ -22590,19 +22895,19 @@ msgid "No application_settings found"
msgstr ""
msgid "No approvers"
-msgstr ""
+msgstr "Ingen godkjennere"
msgid "No artifacts found"
-msgstr ""
+msgstr "Ingen artefakter ble funnet"
msgid "No assignee"
-msgstr ""
+msgstr "Ingen er tilordnet"
msgid "No authentication methods configured."
-msgstr ""
+msgstr "Ingen autentiseringsmetoder er satt opp."
msgid "No available branches"
-msgstr ""
+msgstr "Ingen tilgjengelige grener"
msgid "No available groups to fork the project."
msgstr ""
@@ -22680,7 +22985,7 @@ msgid "No estimate or time spent"
msgstr "Ingen anslag eller tidsbruk"
msgid "No file chosen."
-msgstr ""
+msgstr "Ingen fil er valgt."
msgid "No file hooks found."
msgstr "Ingen filkroker ble funnet."
@@ -22704,13 +23009,13 @@ msgid "No issues found"
msgstr "Ingen saker funnet"
msgid "No iteration"
-msgstr ""
+msgstr "Ingen iterasjon"
msgid "No iterations found"
-msgstr ""
+msgstr "Ingen iterasjoner ble funnet"
msgid "No iterations to show"
-msgstr ""
+msgstr "Ingen iterasjoner å vise"
msgid "No job log"
msgstr "Ingen jobblogg"
@@ -22743,10 +23048,10 @@ msgid "No matching results for \"%{query}\""
msgstr "Ingen samsvarende resultater for \"%{query}\""
msgid "No matching results..."
-msgstr ""
+msgstr "Ingen samsvarende resultater …"
msgid "No members found"
-msgstr ""
+msgstr "Ingen medlemmer ble funnet"
msgid "No merge requests found"
msgstr "Ingen fletteforespørsler ble funnet"
@@ -22767,10 +23072,10 @@ msgid "No panels matching properties %{opts}"
msgstr ""
msgid "No parent group"
-msgstr ""
+msgstr "Ingen overgruppe"
msgid "No plan"
-msgstr ""
+msgstr "Ingen plan"
msgid "No pods available"
msgstr "Ingen podder er tilgjengelige"
@@ -22785,10 +23090,10 @@ msgid "No prioritized labels with such name or description"
msgstr ""
msgid "No profiles found"
-msgstr ""
+msgstr "Ingen profiler ble funnet"
msgid "No projects found"
-msgstr ""
+msgstr "Ingen prosjekter ble funnet"
msgid "No public groups"
msgstr "Ingen offentlige grupper"
@@ -22827,7 +23132,7 @@ msgid "No start date"
msgstr "Ingen startdato"
msgid "No tag selected"
-msgstr ""
+msgstr "Ingen etiketter er valgt"
msgid "No template"
msgstr "Ingen mal"
@@ -22847,8 +23152,10 @@ msgstr "Ingen sårbarheter er til stede"
msgid "No webhooks found, add one in the form above."
msgstr ""
-msgid "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} to renew your subscription."
-msgstr ""
+msgid "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} day to renew your subscription."
+msgid_plural "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} days to renew your subscription."
+msgstr[0] ""
+msgstr[1] ""
msgid "No. of commits"
msgstr "Antall commiter"
@@ -22865,7 +23172,7 @@ msgstr "Noden ble vellykket oppdatert."
msgid "Nodes"
msgstr "Noder"
-msgid "Non-admin users can sign in with read-only access and make read-only API requests."
+msgid "Non-admin users are restricted to read-only access, in both GitLab UI and API."
msgstr ""
msgid "None"
@@ -22875,7 +23182,7 @@ msgid "None of the group milestones have the same project as the release"
msgstr ""
msgid "Normal text"
-msgstr ""
+msgstr "Normal tekst"
msgid "Not Implemented"
msgstr "Ikke implementert"
@@ -22917,7 +23224,7 @@ msgid "Not started"
msgstr "Ikke påbegynt"
msgid "Not supported"
-msgstr ""
+msgstr "Ikke støttet"
msgid "Note"
msgstr "Notis"
@@ -22946,7 +23253,7 @@ msgstr "Bemerk: Vurder å spørre din GitLab-administrator om å konfigurere %{g
msgid "NoteForm|Note"
msgstr "Notis"
-msgid "Notes Rate Limits"
+msgid "Notes rate limit"
msgstr ""
msgid "Notes|Are you sure you want to cancel creating this comment?"
@@ -22996,8 +23303,8 @@ msgstr "Varslingsinnstillingene ble lagret"
msgid "NotificationEmail|Assignee"
msgid_plural "NotificationEmail|Assignees"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "Tilordnet"
+msgstr[1] "Tilordnede"
msgid "NotificationEmail|Assignee: %{users}"
msgid_plural "NotificationEmail|Assignees: %{users}"
@@ -23039,7 +23346,7 @@ msgid "NotificationEvent|Merge when pipeline succeeds"
msgstr ""
msgid "NotificationEvent|Moved project"
-msgstr ""
+msgstr "Flyttet prosjekt"
msgid "NotificationEvent|New epic"
msgstr "Nytt epos"
@@ -23113,9 +23420,6 @@ msgstr "Nov"
msgid "November"
msgstr "November"
-msgid "Novice"
-msgstr "Begynner"
-
msgid "Now, personalize your GitLab experience"
msgstr ""
@@ -23159,7 +23463,7 @@ msgid "Number of files touched"
msgstr "Antall berørte filer"
msgid "Number of replicas"
-msgstr ""
+msgstr "Antall kopier"
msgid "Number of shards"
msgstr ""
@@ -23180,7 +23484,7 @@ msgid "October"
msgstr "Oktober"
msgid "OfSearchInADropdown|Filter"
-msgstr ""
+msgstr "Filter"
msgid "Off"
msgstr "Av"
@@ -23189,10 +23493,10 @@ msgid "Oh no!"
msgstr "Ã… nei!"
msgid "Ok, let's go"
-msgstr ""
+msgstr "OK, da setter vi i gang"
msgid "Okay"
-msgstr ""
+msgstr "OK"
msgid "Oldest first"
msgstr "Eldste øverst"
@@ -23204,10 +23508,10 @@ msgid "Omnibus Protected Paths throttle is active, and takes priority over these
msgstr "Omnibus Protected Paths-pedalen er aktiv, og prioriterer disse innstillingene. Fra 12.4, avvikles Omnibus-pedalen og vil bli fjernet i en fremtidig utgivelse. Les dokumentasjonen for %{relative_url_link_start}Migrering av beskyttede filbaner%{relative_url_link_end}."
msgid "On"
-msgstr ""
+msgstr "Den"
msgid "On track"
-msgstr ""
+msgstr "I rute"
msgid "On-call Schedules"
msgstr ""
@@ -23219,25 +23523,25 @@ msgid "OnCallScheduless|Any escalation rules that are using this schedule will a
msgstr ""
msgid "OnCallSchedules|1 day"
-msgstr ""
+msgstr "1 dag"
msgid "OnCallSchedules|2 weeks"
-msgstr ""
+msgstr "2 uker"
msgid "OnCallSchedules|Add a rotation"
-msgstr ""
+msgstr "Legg til en rotasjon"
msgid "OnCallSchedules|Add a schedule"
-msgstr ""
+msgstr "Legg til en planlegging"
msgid "OnCallSchedules|Add an additional schedule to your project"
msgstr ""
msgid "OnCallSchedules|Add rotation"
-msgstr ""
+msgstr "Legg til rotasjon"
msgid "OnCallSchedules|Add schedule"
-msgstr ""
+msgstr "Legg til planlegging"
msgid "OnCallSchedules|Are you sure you want to delete the \"%{deleteRotation}\" rotation? This action cannot be undone."
msgstr ""
@@ -23261,10 +23565,10 @@ msgid "OnCallSchedules|Delete schedule"
msgstr ""
msgid "OnCallSchedules|Edit rotation"
-msgstr ""
+msgstr "Rediger rotasjon"
msgid "OnCallSchedules|Edit schedule"
-msgstr ""
+msgstr "Rediger planlegging"
msgid "OnCallSchedules|Enable end date"
msgstr ""
@@ -23284,7 +23588,7 @@ msgstr ""
msgid "OnCallSchedules|For this rotation, on-call will be:"
msgstr ""
-msgid "OnCallSchedules|On-call schedule %{schedule} in Project %{project}"
+msgid "OnCallSchedules|On-call schedule %{obstacle} in Project %{project}"
msgstr ""
msgid "OnCallSchedules|On-call schedules"
@@ -23318,7 +23622,7 @@ msgid "OnCallSchedules|Rotation start date cannot be empty"
msgstr ""
msgid "OnCallSchedules|Rotations"
-msgstr ""
+msgstr "Rotasjoner"
msgid "OnCallSchedules|Route alerts directly to specific members of your team"
msgstr ""
@@ -23327,7 +23631,7 @@ msgid "OnCallSchedules|Select participant"
msgstr ""
msgid "OnCallSchedules|Select timezone"
-msgstr ""
+msgstr "Velg tidssone"
msgid "OnCallSchedules|Sets the default timezone for the schedule, for all participants"
msgstr ""
@@ -23384,7 +23688,7 @@ msgid "OnDemandScans|Create new site profile"
msgstr ""
msgid "OnDemandScans|Description (optional)"
-msgstr ""
+msgstr "Beskrivelse (valgfritt)"
msgid "OnDemandScans|Edit on-demand DAST scan"
msgstr ""
@@ -23423,18 +23727,24 @@ msgid "OnDemandScans|Save and run scan"
msgstr ""
msgid "OnDemandScans|Save scan"
-msgstr ""
+msgstr "Lagre skanning"
msgid "OnDemandScans|Scan name"
msgstr ""
msgid "OnDemandScans|Scanner profile"
+msgstr "Skannerprofil"
+
+msgid "OnDemandScans|Schedule scan"
msgstr ""
msgid "OnDemandScans|Select one of the existing profiles"
msgstr "Velg en av de eksisterende profilene"
msgid "OnDemandScans|Site profile"
+msgstr "Nettstedsprofil"
+
+msgid "OnDemandScans|Start time"
msgstr ""
msgid "OnDemandScans|Use existing scanner profile"
@@ -23443,12 +23753,6 @@ msgstr ""
msgid "OnDemandScans|Use existing site profile"
msgstr "Bruk eksisterende sideprofil"
-msgid "OnDemandScans|You can either choose a passive scan or validate the target site in your chosen site profile. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
-msgstr ""
-
-msgid "OnDemandScans|You cannot run an active scan against an unvalidated site."
-msgstr ""
-
msgid "OnDemandScans|You must create a repository within your project to run an on-demand scan."
msgstr ""
@@ -23511,6 +23815,9 @@ msgstr ""
msgid "Only admins can delete project"
msgstr "Bare administratorer kan slette prosjektet"
+msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
+msgstr ""
+
msgid "Only include features new to your current subscription tier."
msgstr ""
@@ -23529,6 +23836,12 @@ msgstr ""
msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
+msgid "Only reCAPTCHA v2 is supported:"
+msgstr ""
+
+msgid "Only users from the specified IP address ranges are able to reach this group, including all subgroups, projects, and Git repositories."
+msgstr ""
+
msgid "Only verified users with an email address in any of these domains can be added to the group."
msgstr "Bare bekreftede brukere med en e-postadresse hos et av disse domenene kan legges til i gruppen."
@@ -23539,7 +23852,7 @@ msgid "Oops, are you sure?"
msgstr "Oi sann, er du sikker?"
msgid "Open"
-msgstr "Ã…pne"
+msgstr "Ã…pen"
msgid "Open Selection"
msgstr ""
@@ -23560,7 +23873,7 @@ msgid "Open in file view"
msgstr "Ã…pne i filvisning"
msgid "Open in your IDE"
-msgstr ""
+msgstr "Ã…pne i din IDE"
msgid "Open raw"
msgstr "Åpne råversjon"
@@ -23572,10 +23885,10 @@ msgid "Open sidebar"
msgstr "Ã…pne sidelinje"
msgid "Open: %{open}"
-msgstr ""
+msgstr "Ã…pen: %{open}"
msgid "OpenAPI"
-msgstr ""
+msgstr "OpenAPI"
msgid "OpenAPI Specification file path or URL"
msgstr ""
@@ -23584,7 +23897,7 @@ msgid "Opened"
msgstr "Ã…pnet"
msgid "Opened MRs"
-msgstr ""
+msgstr "Ã…pnede FF-er"
msgid "Opened issues"
msgstr "Ã…pnede saker"
@@ -23599,7 +23912,7 @@ msgid "Operation failed. Check pod logs for %{pod_name} for more details."
msgstr ""
msgid "Operation not allowed"
-msgstr ""
+msgstr "Handlingen er ikke tillatt"
msgid "Operation timed out. Check pod logs for %{pod_name} for more details."
msgstr ""
@@ -23698,7 +24011,7 @@ msgid "Overwrite diverged branches"
msgstr ""
msgid "Owned by %{image_tag}"
-msgstr ""
+msgstr "Eies av %{image_tag}"
msgid "Owned by anyone"
msgstr "Eid av hvem som helst"
@@ -23715,9 +24028,6 @@ msgstr "Eier"
msgid "Package Registry"
msgstr "Pakkeregister"
-msgid "Package Registry Rate Limits"
-msgstr ""
-
msgid "Package Registry: authenticated API requests"
msgstr ""
@@ -23736,9 +24046,12 @@ msgstr ""
msgid "Package recipe already exists"
msgstr ""
-msgid "Package type"
+msgid "Package registry rate limits"
msgstr ""
+msgid "Package type"
+msgstr "Pakketype"
+
msgid "Package type must be Conan"
msgstr "Pakketypen må være Conan"
@@ -23785,7 +24098,7 @@ msgid "PackageRegistry|Add composer registry"
msgstr ""
msgid "PackageRegistry|Allow duplicates"
-msgstr ""
+msgstr "Tillat duplikater"
msgid "PackageRegistry|An error occurred while saving the settings"
msgstr ""
@@ -23800,6 +24113,9 @@ msgid "PackageRegistry|Built by pipeline %{link} triggered %{datetime} by %{auth
msgstr ""
msgid "PackageRegistry|Composer"
+msgstr "Komposør"
+
+msgid "PackageRegistry|Composer.json with license: %{license} and version: %{version}"
msgstr ""
msgid "PackageRegistry|Conan"
@@ -23842,7 +24158,7 @@ msgid "PackageRegistry|Copy Pip command"
msgstr "Kopier Pip-kommando"
msgid "PackageRegistry|Copy SHA"
-msgstr ""
+msgstr "Kopier SHA"
msgid "PackageRegistry|Copy add Gradle Groovy DSL repository command"
msgstr ""
@@ -23865,6 +24181,9 @@ msgstr ""
msgid "PackageRegistry|Copy require package include"
msgstr ""
+msgid "PackageRegistry|Copy target SHA"
+msgstr ""
+
msgid "PackageRegistry|Copy yarn command"
msgstr "Kopier yarn-kommando"
@@ -23875,7 +24194,7 @@ msgid "PackageRegistry|Created by commit %{link} on branch %{branch}"
msgstr ""
msgid "PackageRegistry|Debian"
-msgstr ""
+msgstr "Debian"
msgid "PackageRegistry|Delete Package File"
msgstr ""
@@ -23905,7 +24224,7 @@ msgid "PackageRegistry|For more information on the PyPi registry, %{linkStart}se
msgstr ""
msgid "PackageRegistry|Generic"
-msgstr ""
+msgstr "Generisk"
msgid "PackageRegistry|Gradle Groovy DSL"
msgstr ""
@@ -23920,7 +24239,7 @@ msgid "PackageRegistry|Gradle Kotlin DSL install command"
msgstr ""
msgid "PackageRegistry|Helm"
-msgstr ""
+msgstr "Helm"
msgid "PackageRegistry|If you haven't already done so, you will need to add the below to your %{codeStart}.pypirc%{codeEnd} file."
msgstr ""
@@ -23931,11 +24250,14 @@ msgstr ""
msgid "PackageRegistry|Install package version"
msgstr ""
+msgid "PackageRegistry|Instance-level"
+msgstr ""
+
msgid "PackageRegistry|Invalid Package: failed metadata extraction"
msgstr ""
msgid "PackageRegistry|Learn how to %{noPackagesLinkStart}publish and share your packages%{noPackagesLinkEnd} with GitLab."
-msgstr ""
+msgstr "Lær hvordan man %{noPackagesLinkStart}publiserer og deler pakkene dine%{noPackagesLinkEnd} med GitLab."
msgid "PackageRegistry|License information located at %{link}"
msgstr "Lisensinformasjonen er hos %{link}"
@@ -23950,7 +24272,7 @@ msgid "PackageRegistry|Maven Command"
msgstr "Maven-kommando"
msgid "PackageRegistry|Maven XML"
-msgstr ""
+msgstr "Maven-XML"
msgid "PackageRegistry|NuGet"
msgstr "NuGet"
@@ -23959,7 +24281,7 @@ msgid "PackageRegistry|NuGet Command"
msgstr "NuGet-kommando"
msgid "PackageRegistry|Package Registry"
-msgstr ""
+msgstr "Pakkeregister"
msgid "PackageRegistry|Package file deleted successfully"
msgstr ""
@@ -23976,9 +24298,12 @@ msgstr ""
msgid "PackageRegistry|Pip Command"
msgstr "Pip-kommando"
-msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
+msgid "PackageRegistry|Project-level"
msgstr ""
+msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
+msgstr "Publiser og del pakker for en rekke vanlige pakkebehandlere. %{docLinkStart}Mere informasjon%{docLinkEnd}"
+
msgid "PackageRegistry|Publish packages if their name or version matches this regex."
msgstr ""
@@ -23986,7 +24311,7 @@ msgid "PackageRegistry|Published to the %{project} Package Registry %{datetime}"
msgstr ""
msgid "PackageRegistry|PyPI"
-msgstr ""
+msgstr "PyPI"
msgid "PackageRegistry|Recipe: %{recipe}"
msgstr ""
@@ -23997,9 +24322,12 @@ msgstr ""
msgid "PackageRegistry|Remove package"
msgstr "Fjern pakke"
-msgid "PackageRegistry|RubyGems"
+msgid "PackageRegistry|Required Python: %{pythonVersion}"
msgstr ""
+msgid "PackageRegistry|RubyGems"
+msgstr "RubyGems"
+
msgid "PackageRegistry|Settings for Generic packages"
msgstr ""
@@ -24016,13 +24344,13 @@ msgid "PackageRegistry|Show Conan commands"
msgstr ""
msgid "PackageRegistry|Show NPM commands"
-msgstr ""
+msgstr "Vis NPM-kommandoer"
msgid "PackageRegistry|Show Nuget commands"
-msgstr ""
+msgstr "Vis Nuget-kommandoer"
msgid "PackageRegistry|Show PyPi commands"
-msgstr ""
+msgstr "Vis PyPi-kommandoer"
msgid "PackageRegistry|Show Yarn commands"
msgstr ""
@@ -24034,11 +24362,14 @@ msgid "PackageRegistry|Something went wrong while deleting the package."
msgstr ""
msgid "PackageRegistry|Sorry, your filter produced no results"
-msgstr ""
+msgstr "Beklager, filteret ditt ga ingen resultater"
msgid "PackageRegistry|Source project located at %{link}"
msgstr ""
+msgid "PackageRegistry|Target SHA: %{sha}"
+msgstr ""
+
msgid "PackageRegistry|There are no other versions of this package."
msgstr ""
@@ -24052,10 +24383,10 @@ msgid "PackageRegistry|This NuGet package has no dependencies."
msgstr ""
msgid "PackageRegistry|To widen your search, change or remove the filters above."
-msgstr ""
+msgstr "For å utvide søket, endre eller fjerne filtrene ovenfor."
msgid "PackageRegistry|Type"
-msgstr ""
+msgstr "Type"
msgid "PackageRegistry|Unable to fetch package version information."
msgstr ""
@@ -24079,7 +24410,7 @@ msgid "PackageRegistry|You may also need to setup authentication using an auth t
msgstr ""
msgid "PackageRegistry|npm"
-msgstr ""
+msgstr "npm"
msgid "PackageRegistry|published by %{author}"
msgstr "publisert av %{author}"
@@ -24121,7 +24452,7 @@ msgid "Pages Domain"
msgstr ""
msgid "Pagination|First"
-msgstr ""
+msgstr "Første"
msgid "Pagination|Go to first page"
msgstr "Gå til første side"
@@ -24136,7 +24467,7 @@ msgid "Pagination|Go to previous page"
msgstr "GÃ¥ til forrige side"
msgid "Pagination|Last"
-msgstr ""
+msgstr "Siste"
msgid "Pagination|Last »"
msgstr "Siste »"
@@ -24207,6 +24538,18 @@ msgstr "Passordet ditt ble endret"
msgid "Password was successfully updated. Please sign in again."
msgstr "Passordet ble vellykket oppdatert. Vennligst logg inn på nytt."
+msgid "PasswordPrompt|Confirm password"
+msgstr ""
+
+msgid "PasswordPrompt|Confirm password to continue"
+msgstr ""
+
+msgid "PasswordPrompt|Password is required"
+msgstr ""
+
+msgid "PasswordPrompt|Please enter your password to confirm"
+msgstr ""
+
msgid "Passwords should be unique and not used for any other sites or services."
msgstr ""
@@ -24214,7 +24557,7 @@ msgid "Past due"
msgstr "Forbi måldatoen"
msgid "Paste a public key here."
-msgstr ""
+msgstr "Lim inn en offentlig nøkkel her."
msgid "Paste a public key here. %{link_start}How do I generate it?%{link_end}"
msgstr ""
@@ -24234,6 +24577,9 @@ msgstr ""
msgid "Paste project path (i.e. gitlab-org/gitlab)"
msgstr ""
+msgid "Paste this DSN into your Sentry SDK"
+msgstr ""
+
msgid "Paste your public SSH key, which is usually contained in the file '~/.ssh/id_ed25519.pub' or '~/.ssh/id_rsa.pub' and begins with 'ssh-ed25519' or 'ssh-rsa'. Do not paste your private SSH key, as that can compromise your identity."
msgstr ""
@@ -24256,22 +24602,22 @@ msgid "Pause Elasticsearch indexing"
msgstr ""
msgid "Paused"
-msgstr ""
+msgstr "Satt på pause"
msgid "Paused runners don't accept new jobs"
msgstr ""
msgid "Peer review by"
-msgstr ""
+msgstr "Fagfellevurdering av"
msgid "Pending"
msgstr "I kø"
msgid "Pending comments"
-msgstr ""
+msgstr "Avventende kommentarer"
msgid "Pending sync…"
-msgstr ""
+msgstr "Venter på synkronisering …"
msgid "People without permission will never get a notification and won't be able to comment."
msgstr ""
@@ -24298,7 +24644,7 @@ msgid "Performance optimization"
msgstr "Optimalisering av ytelsen"
msgid "PerformanceBar|Backend"
-msgstr ""
+msgstr "Motor"
msgid "PerformanceBar|Bullet notifications"
msgstr ""
@@ -24318,6 +24664,9 @@ msgstr ""
msgid "PerformanceBar|First Contentful Paint"
msgstr ""
+msgid "PerformanceBar|Flamegraph with mode:"
+msgstr ""
+
msgid "PerformanceBar|Frontend resources"
msgstr ""
@@ -24325,7 +24674,7 @@ msgid "PerformanceBar|Gitaly calls"
msgstr ""
msgid "PerformanceBar|Memory"
-msgstr ""
+msgstr "Minne"
msgid "PerformanceBar|Redis calls"
msgstr ""
@@ -24337,23 +24686,32 @@ msgid "PerformanceBar|SQL queries"
msgstr "SQL-forespørsler"
msgid "PerformanceBar|Sort by duration"
-msgstr ""
+msgstr "Sorter etter tidslengde"
msgid "PerformanceBar|Sort chronologically"
-msgstr ""
+msgstr "Sorter kronologisk"
msgid "PerformanceBar|Stats"
-msgstr ""
+msgstr "Statistikk"
msgid "PerformanceBar|Total duration"
-msgstr ""
+msgstr "Total varighet"
msgid "PerformanceBar|Trace"
+msgstr "Spore"
+
+msgid "PerformanceBar|cpu"
msgstr ""
-msgid "Period in seconds"
+msgid "PerformanceBar|object"
+msgstr ""
+
+msgid "PerformanceBar|wall"
msgstr ""
+msgid "Period in seconds"
+msgstr "Periode i sekunder"
+
msgid "Permanently delete project"
msgstr ""
@@ -24370,7 +24728,7 @@ msgid "Permissions, LFS, 2FA"
msgstr "Tillatelser, LFS, 2FA"
msgid "Personal Access Token"
-msgstr "Personlige tilgangsnøkkel"
+msgstr "Personlig tilgangsnøkkel"
msgid "Personal Access Token prefix"
msgstr ""
@@ -24382,7 +24740,7 @@ msgid "Personal project creation is not allowed. Please contact your administrat
msgstr ""
msgid "Personal projects"
-msgstr ""
+msgstr "Personlige prosjekter"
msgid "Personal projects limit:"
msgstr ""
@@ -24409,10 +24767,10 @@ msgid "Pipeline %{label}"
msgstr "Rørledning %{label}"
msgid "Pipeline %{label} for \"%{dataTitle}\""
-msgstr ""
+msgstr "Rørledning %{label} for «%{dataTitle}»"
msgid "Pipeline ID"
-msgstr ""
+msgstr "Rørlednings-ID"
msgid "Pipeline IID"
msgstr ""
@@ -24421,10 +24779,10 @@ msgid "Pipeline Schedule"
msgstr ""
msgid "Pipeline Schedules"
-msgstr ""
+msgstr "Rørledningsplanlegginger"
msgid "Pipeline URL"
-msgstr ""
+msgstr "Rørlednings-URL"
msgid "Pipeline durations for the last 30 commits"
msgstr ""
@@ -24463,13 +24821,13 @@ msgid "PipelineCharts|An unknown error occurred while processing CI/CD analytics
msgstr ""
msgid "PipelineCharts|CI/CD Analytics"
-msgstr ""
+msgstr "CI/CD-analystikk"
msgid "PipelineCharts|Failed:"
msgstr "Mislyktes:"
msgid "PipelineCharts|Overall statistics"
-msgstr ""
+msgstr "Generelle statistikker"
msgid "PipelineCharts|Success ratio:"
msgstr "Suksessfrekvens:"
@@ -24579,6 +24937,48 @@ msgstr "MÃ¥l"
msgid "PipelineSchedules|Variables"
msgstr "Variabler"
+msgid "PipelineSource|API"
+msgstr ""
+
+msgid "PipelineSource|Chat"
+msgstr ""
+
+msgid "PipelineSource|External"
+msgstr ""
+
+msgid "PipelineSource|External Pull Request"
+msgstr ""
+
+msgid "PipelineSource|Merge Request"
+msgstr ""
+
+msgid "PipelineSource|On-Demand DAST Scan"
+msgstr ""
+
+msgid "PipelineSource|On-Demand DAST Validation"
+msgstr ""
+
+msgid "PipelineSource|Parent Pipeline"
+msgstr ""
+
+msgid "PipelineSource|Pipeline"
+msgstr ""
+
+msgid "PipelineSource|Push"
+msgstr ""
+
+msgid "PipelineSource|Schedule"
+msgstr ""
+
+msgid "PipelineSource|Trigger"
+msgstr ""
+
+msgid "PipelineSource|Web"
+msgstr ""
+
+msgid "PipelineSource|Web IDE"
+msgstr ""
+
msgid "PipelineStatusTooltip|Pipeline: %{ciStatus}"
msgstr "Rørledning: %{ciStatus}"
@@ -24628,19 +25028,19 @@ msgid "Pipelines|Copy trigger token"
msgstr ""
msgid "Pipelines|Could not load artifacts."
-msgstr ""
+msgstr "Klarte ikke å laste inn artefakter."
msgid "Pipelines|Could not load merged YAML content"
msgstr ""
msgid "Pipelines|Description"
-msgstr ""
+msgstr "Beskrivelse"
msgid "Pipelines|Edit"
-msgstr ""
+msgstr "Rediger"
msgid "Pipelines|Editor"
-msgstr ""
+msgstr "Redigerer"
msgid "Pipelines|Get familiar with GitLab CI/CD syntax by starting with a basic 3 stage CI/CD pipeline."
msgstr ""
@@ -24664,7 +25064,7 @@ msgid "Pipelines|It is recommended the code is reviewed thoroughly before runnin
msgstr ""
msgid "Pipelines|Last Used"
-msgstr ""
+msgstr "Senest brukt"
msgid "Pipelines|Learn about Runners"
msgstr ""
@@ -24691,7 +25091,7 @@ msgid "Pipelines|No triggers have been created yet. Add one using the form above
msgstr ""
msgid "Pipelines|Owner"
-msgstr ""
+msgstr "Eier"
msgid "Pipelines|Pipeline Editor"
msgstr ""
@@ -24700,7 +25100,7 @@ msgid "Pipelines|Project cache successfully reset."
msgstr ""
msgid "Pipelines|Revoke"
-msgstr ""
+msgstr "Tilbakekall"
msgid "Pipelines|Something went wrong while cleaning runners cache."
msgstr ""
@@ -24751,13 +25151,13 @@ msgid "Pipelines|To keep your codebase simple, readable, and accessible to contr
msgstr ""
msgid "Pipelines|Token"
-msgstr ""
+msgstr "Sjetong"
msgid "Pipelines|Trigger user has insufficient permissions to project"
msgstr ""
msgid "Pipelines|Use a CI/CD template"
-msgstr ""
+msgstr "Bruk en CI/CD-mal"
msgid "Pipelines|Use a sample %{codeStart}.gitlab-ci.yml%{codeEnd} template file to explore how CI/CD works."
msgstr ""
@@ -24769,7 +25169,7 @@ msgid "Pipelines|Use a template based on your project's language or framework to
msgstr ""
msgid "Pipelines|Use template"
-msgstr ""
+msgstr "Bruk mal"
msgid "Pipelines|Validating GitLab CI configuration…"
msgstr ""
@@ -24781,13 +25181,13 @@ msgid "Pipelines|Visualize"
msgstr ""
msgid "Pipelines|invalid"
-msgstr ""
+msgstr "ugyldig"
msgid "Pipelines|parent"
-msgstr ""
+msgstr "underkategori av"
msgid "Pipeline|Actions"
-msgstr ""
+msgstr "Handlinger"
msgid "Pipeline|Branch name"
msgstr "Grennavn"
@@ -24826,7 +25226,7 @@ msgid "Pipeline|Failed"
msgstr "Mislyktes"
msgid "Pipeline|In progress"
-msgstr ""
+msgstr "Pågår"
msgid "Pipeline|Key"
msgstr "Nøkkel"
@@ -24868,7 +25268,7 @@ msgid "Pipeline|Run for branch name or tag"
msgstr ""
msgid "Pipeline|Run pipeline"
-msgstr ""
+msgstr "Kjør rørledning"
msgid "Pipeline|Running"
msgstr "Kjører"
@@ -24877,48 +25277,9 @@ msgid "Pipeline|Skipped"
msgstr "Hoppet over"
msgid "Pipeline|Source"
-msgstr ""
-
-msgid "Pipeline|Source|API"
-msgstr ""
-
-msgid "Pipeline|Source|Chat"
-msgstr ""
-
-msgid "Pipeline|Source|External"
-msgstr ""
-
-msgid "Pipeline|Source|External Pull Request"
-msgstr ""
-
-msgid "Pipeline|Source|Merge Request"
-msgstr ""
-
-msgid "Pipeline|Source|On-Demand DAST Scan"
-msgstr ""
-
-msgid "Pipeline|Source|On-Demand DAST Validation"
-msgstr ""
-
-msgid "Pipeline|Source|Parent Pipeline"
-msgstr ""
-
-msgid "Pipeline|Source|Pipeline"
-msgstr ""
-
-msgid "Pipeline|Source|Push"
-msgstr ""
-
-msgid "Pipeline|Source|Schedule"
-msgstr ""
-
-msgid "Pipeline|Source|Trigger"
-msgstr ""
-
-msgid "Pipeline|Source|Web"
-msgstr ""
+msgstr "Kilde"
-msgid "Pipeline|Source|Web IDE"
+msgid "Pipeline|Source|Security Policy"
msgstr ""
msgid "Pipeline|Specify variable values to be used in this run. The values specified in %{linkStart}CI/CD settings%{linkEnd} will be used by default."
@@ -24964,12 +25325,12 @@ msgid "Pipeline|Variables"
msgstr "Variabler"
msgid "Pipeline|View pipeline"
-msgstr ""
+msgstr "Vis rørledning"
msgid "Pipeline|We are currently unable to fetch pipeline data"
msgstr ""
-msgid "Pipeline|You’re about to stop pipeline %{pipelineId}."
+msgid "Pipeline|You’re about to stop pipeline #%{pipelineId}."
msgstr ""
msgid "Pipeline|for"
@@ -24994,6 +25355,9 @@ msgid "PivotalTrackerService|Pivotal Tracker API token. User must have access to
msgstr ""
msgid "Plain diff"
+msgstr "RÃ¥ diff"
+
+msgid "Plain-text response to send to clients that hit a rate limit"
msgstr ""
msgid "Plan:"
@@ -25003,7 +25367,7 @@ msgid "PlantUML"
msgstr "PlantUML"
msgid "PlantUML URL"
-msgstr ""
+msgstr "PlantUML-URL"
msgid "Play"
msgstr "Spill av"
@@ -25045,7 +25409,7 @@ msgid "Please complete your profile with email address"
msgstr ""
msgid "Please confirm your email address"
-msgstr ""
+msgstr "Bekreft E-postadressen din"
msgid "Please contact an admin to register runners."
msgstr ""
@@ -25123,7 +25487,7 @@ msgid "Please provide a name"
msgstr "Vennligst angi et navn"
msgid "Please provide a name."
-msgstr ""
+msgstr "Vennligst skriv inn et navn."
msgid "Please provide a valid URL"
msgstr "Vennligst skriv inn en gyldig URL"
@@ -25140,9 +25504,6 @@ msgstr "Vennligst oppgi en gyldig e-postadresse."
msgid "Please provide attributes to update"
msgstr ""
-msgid "Please provide your username or email address."
-msgstr ""
-
msgid "Please reach out if you have any questions and we'll be happy to assist."
msgstr ""
@@ -25180,14 +25541,11 @@ msgid "Please select what should be included in each exported requirement."
msgstr ""
msgid "Please select..."
-msgstr ""
+msgstr "Vennligst velg …"
msgid "Please set a new password before proceeding."
msgstr "Vennligst bestem et nytt passord før du fortsetter."
-msgid "Please share your feedback about %{featureName} %{linkStart}in this issue%{linkEnd} to help us improve the experience."
-msgstr ""
-
msgid "Please solve the captcha"
msgstr ""
@@ -25228,7 +25586,7 @@ msgid "Point to any links you like: documentation, built binaries, or other rela
msgstr ""
msgid "Policies"
-msgstr ""
+msgstr "Retningslinjer"
msgid "Policy management project does have any policies in %{policy_path}"
msgstr ""
@@ -25240,10 +25598,10 @@ msgid "Polling interval multiplier"
msgstr ""
msgid "Popularity"
-msgstr ""
+msgstr "Popularitet"
msgid "Port"
-msgstr ""
+msgstr "Port"
msgid "Postman collection"
msgstr ""
@@ -25273,10 +25631,10 @@ msgid "Preferences|Choose what content you want to see on your homepage."
msgstr "Velg hva slags innhold du vil se på hjemmesiden din."
msgid "Preferences|Configure how dates and times display for you."
-msgstr ""
+msgstr "Konfigurer hvordan datoer og klokkeslett vises for deg."
msgid "Preferences|Customize integrations with third party services."
-msgstr ""
+msgstr "Tilpass integreringer med tredjepartstjenester."
msgid "Preferences|Customize the appearance of the application header and navigation sidebar."
msgstr "Tilpass utseende til applikasjons-toppområdet og navigasjonssidelinjen."
@@ -25285,28 +25643,28 @@ msgid "Preferences|Display time in 24-hour format"
msgstr "Vis tid i 24-timersformat"
msgid "Preferences|Enable Gitpod integration"
-msgstr ""
+msgstr "Skru på Gitpod-integrasjon"
msgid "Preferences|Enable integrated code intelligence on code views"
-msgstr ""
+msgstr "Skru på integrert kodeintelligens i kodevisninger"
msgid "Preferences|Failed to save preferences."
-msgstr ""
+msgstr "Mislyktes i å lagre innstillingene."
msgid "Preferences|For example: 30 minutes ago."
-msgstr ""
+msgstr "For eksempel: 30 minutter siden."
msgid "Preferences|Gitpod"
-msgstr ""
+msgstr "Gitpod"
msgid "Preferences|Homepage content"
msgstr "Hjemmesideinnhold"
msgid "Preferences|Instead of all the files changed, show only one file at a time. To switch between files, use the file browser."
-msgstr ""
+msgstr "I stedet for alle endrede filer, vis kun én fil om gangen. For å bytte mellom filer, bruk filutforskeren."
msgid "Preferences|Integrations"
-msgstr ""
+msgstr "Integreringer"
msgid "Preferences|Layout width"
msgstr "Utformingsbredde"
@@ -25318,22 +25676,22 @@ msgid "Preferences|Navigation theme"
msgstr "Navigasjonstema"
msgid "Preferences|Project overview content"
-msgstr ""
+msgstr "Prosjektoversikts-innhold"
msgid "Preferences|Render whitespace characters in the Web IDE"
-msgstr ""
+msgstr "Rendre tomromskarakterer i nett-IDE-en"
msgid "Preferences|Show one file at a time on merge request's Changes tab"
-msgstr ""
+msgstr "Vis én fil om gangen i fletteforespørslers «Endringer»-faner"
msgid "Preferences|Show whitespace changes in diffs"
-msgstr ""
+msgstr "Vis tomromsendringer i diff-er"
msgid "Preferences|Sourcegraph"
-msgstr ""
+msgstr "Sourcegraph"
msgid "Preferences|Surround text selection when typing quotes or brackets"
-msgstr ""
+msgstr "Omring tekstutvalg når du skriver inn hermetegn eller paranteser"
msgid "Preferences|Syntax highlighting theme"
msgstr "Syntaksfremhevingstema"
@@ -25365,6 +25723,9 @@ msgstr "Forrige"
msgid "Prevent adding new members to project membership within this group"
msgstr ""
+msgid "Prevent auto-stopping"
+msgstr ""
+
msgid "Prevent editing approval rules in projects and merge requests."
msgstr ""
@@ -25377,7 +25738,7 @@ msgstr ""
msgid "Prevent users from changing their profile name"
msgstr ""
-msgid "Prevent users from performing write operations on GitLab while performing maintenance."
+msgid "Prevent users from performing write operations while GitLab maintenance is in progress."
msgstr ""
msgid "Preview"
@@ -25414,7 +25775,7 @@ msgid "Primary"
msgstr "Primær"
msgid "Primary Action"
-msgstr ""
+msgstr "Hovedhandling"
msgid "Print codes"
msgstr ""
@@ -25432,7 +25793,7 @@ msgid "Prioritized label"
msgstr "Prioritert etikett"
msgid "Priority"
-msgstr ""
+msgstr "Prioritet"
msgid "Private"
msgstr "Privat"
@@ -25477,7 +25838,7 @@ msgid "Productivity analytics can help identify the problems that are delaying y
msgstr ""
msgid "ProductivityAanalytics|Merge requests"
-msgstr ""
+msgstr "Fletteforespørsel"
msgid "ProductivityAanalytics|is earlier than the allowed minimum date"
msgstr ""
@@ -25498,13 +25859,13 @@ msgid "ProductivityAnalytics|Hours"
msgstr "Timer"
msgid "ProductivityAnalytics|List"
-msgstr ""
+msgstr "Liste"
msgid "ProductivityAnalytics|Merge Requests"
msgstr "Fletteforespørsler"
msgid "ProductivityAnalytics|Merge date"
-msgstr ""
+msgstr "Sammenslåingsdato"
msgid "ProductivityAnalytics|Merge requests"
msgstr "Fletteforespørsler"
@@ -25528,7 +25889,7 @@ msgid "Profile image guideline"
msgstr ""
msgid "Profile page:"
-msgstr ""
+msgstr "Profilside:"
msgid "ProfileSession|on"
msgstr "den"
@@ -25540,7 +25901,7 @@ msgid "Profiles| You are going to change the username %{currentUsernameBold} to
msgstr "Du er i ferd med å endre brukernavnet %{currentUsernameBold} til %{newUsernameBold}. Profilen og prosjektene blir omdirigert til %{newUsername}-navnefeltet, men denne viderekoblingen utløper når %{currentUsername}-navnene har blitt registrert av en annen bruker eller gruppe. Oppdater Git-kodelagerfjernkontrollene dine så snart som mulig."
msgid "Profiles|\"Busy\" will be shown next to your name"
-msgstr ""
+msgstr "«Opptatt» vil bli vist ved siden av navnet ditt"
msgid "Profiles|%{provider} Active"
msgstr ""
@@ -25555,7 +25916,7 @@ msgid "Profiles|Account scheduled for removal."
msgstr ""
msgid "Profiles|Activate signin with one of the following services"
-msgstr ""
+msgstr "Aktiver pålogging med en av følgende tjenester"
msgid "Profiles|Active"
msgstr "Aktiv"
@@ -25579,19 +25940,19 @@ msgid "Profiles|Bio"
msgstr "Profil"
msgid "Profiles|Busy"
-msgstr ""
+msgstr "Opptatt"
msgid "Profiles|Change username"
msgstr "Endre brukernavn"
msgid "Profiles|Changing your username can have unintended side effects."
-msgstr ""
+msgstr "Ã… endre brukernavnet ditt kan ha utilsiktede bivirkninger."
msgid "Profiles|Choose file..."
msgstr "Velg fil..."
msgid "Profiles|Choose to show contributions of private projects on your public profile without any project, repository or organization information"
-msgstr ""
+msgstr "Velg å vise bidrag fra private prosjekter på din offentlige profil uten informasjon om prosjekt, kodelager eller organisasjon"
msgid "Profiles|City, country"
msgstr "By, land"
@@ -25606,7 +25967,7 @@ msgid "Profiles|Commit email"
msgstr "Commit-E-post"
msgid "Profiles|Connect %{provider}"
-msgstr ""
+msgstr "Koble til %{provider}"
msgid "Profiles|Connected Accounts"
msgstr "Tilkoblede kontoer"
@@ -25630,7 +25991,7 @@ msgid "Profiles|Disconnect"
msgstr "Koble fra"
msgid "Profiles|Disconnect %{provider}"
-msgstr ""
+msgstr "Koble fra %{provider}"
msgid "Profiles|Do not show on profile"
msgstr "Vis ikke på profilen"
@@ -25645,9 +26006,12 @@ msgid "Profiles|Ensure you have two-factor authentication recovery codes stored
msgstr ""
msgid "Profiles|Enter how your name is pronounced to help people address you correctly"
-msgstr ""
+msgstr "Skriv inn hvordan navnet ditt uttales for å hjelpe folk med å adressere deg riktig"
msgid "Profiles|Enter your name, so people you know can recognize you"
+msgstr "Skriv inn navnet ditt, slik at folk du kjenner kan gjenkjenne deg"
+
+msgid "Profiles|Enter your password to confirm the email change"
msgstr ""
msgid "Profiles|Enter your pronouns to let people know how to refer to you"
@@ -25657,7 +26021,7 @@ msgid "Profiles|Expired key is not valid."
msgstr ""
msgid "Profiles|Expired:"
-msgstr ""
+msgstr "Utløpt:"
msgid "Profiles|Expires at"
msgstr "Utløper den"
@@ -25681,16 +26045,16 @@ msgid "Profiles|If after setting a password, the option to delete your account i
msgstr ""
msgid "Profiles|Include private contributions on my profile"
-msgstr ""
+msgstr "Inkluder private bidrag på profilen min"
msgid "Profiles|Incoming email token was successfully reset"
msgstr ""
msgid "Profiles|Increase your account's security by enabling Two-Factor Authentication (2FA)"
-msgstr ""
+msgstr "Øk kontosikkerheten din ved å skru på 2-trinnsautentisering (2FA)"
msgid "Profiles|Invalid key."
-msgstr ""
+msgstr "Ugyldig nøkkel."
msgid "Profiles|Invalid password"
msgstr "Ugyldig passord"
@@ -25726,10 +26090,10 @@ msgid "Profiles|Main settings"
msgstr "Hovedinnstillinger"
msgid "Profiles|Manage two-factor authentication"
-msgstr ""
+msgstr "Behandle 2-trinnsautentisering"
msgid "Profiles|No file chosen."
-msgstr ""
+msgstr "Ingen fil er valgt."
msgid "Profiles|Notification email"
msgstr "Varsels-E-post"
@@ -25738,7 +26102,7 @@ msgid "Profiles|Organization"
msgstr "Organisasjon"
msgid "Profiles|Path"
-msgstr ""
+msgstr "Filbane"
msgid "Profiles|Position and size your new avatar"
msgstr "Posisjoner og endre størrelsen på din nye avatar"
@@ -25753,7 +26117,7 @@ msgid "Profiles|Profile was successfully updated"
msgstr ""
msgid "Profiles|Public avatar"
-msgstr ""
+msgstr "Offentlig avatar"
msgid "Profiles|Public email"
msgstr "Offentlig e-post"
@@ -25768,7 +26132,7 @@ msgid "Profiles|Set new profile picture"
msgstr "Velg nytt profilbilde"
msgid "Profiles|Set your local time zone"
-msgstr ""
+msgstr "Velg din lokale tidssone"
msgid "Profiles|Social sign-in"
msgstr "PÃ¥logging med sosiale medier"
@@ -25795,10 +26159,10 @@ msgid "Profiles|This email will be used for web based operations, such as edits
msgstr ""
msgid "Profiles|This emoji and message will appear on your profile and throughout the interface."
-msgstr ""
+msgstr "Denne emojien og meldingen vil vises på profilen din og i hele grensesnittet."
msgid "Profiles|This information will appear on your profile"
-msgstr ""
+msgstr "Denne informasjonen vil vises på profilen din"
msgid "Profiles|Time settings"
msgstr "Tidsinnstillinger"
@@ -25884,12 +26248,12 @@ msgstr "Din status"
msgid "Profiles|e.g. My MacBook key"
msgstr "f.eks. Min MacBook-nøkkel"
+msgid "Profiles|https://website.com"
+msgstr ""
+
msgid "Profiles|username"
msgstr "brukernavn"
-msgid "Profiles|website.com"
-msgstr ""
-
msgid "Profiles|your account"
msgstr "din konto"
@@ -25951,7 +26315,7 @@ msgid "Project ID"
msgstr "Prosjekt-ID"
msgid "Project Templates"
-msgstr ""
+msgstr "Prosjektmaler"
msgid "Project URL"
msgstr "Prosjekt URL"
@@ -26020,7 +26384,7 @@ msgid "Project info:"
msgstr "Prosjektinfo:"
msgid "Project information"
-msgstr ""
+msgstr "Prosjektinformasjon"
msgid "Project is required when cluster_type is :project"
msgstr ""
@@ -26038,7 +26402,7 @@ msgid "Project name suffix"
msgstr ""
msgid "Project navigation"
-msgstr ""
+msgstr "Prosjektnavigering"
msgid "Project order will not be saved as local storage is not available."
msgstr ""
@@ -26116,13 +26480,13 @@ msgid "ProjectOverview|Unstar"
msgstr "Fjern stjernemerke"
msgid "ProjectOverview|You have reached your project limit"
-msgstr ""
+msgstr "Du har nådd prosjektgrensen"
msgid "ProjectOverview|You must sign in to star a project"
-msgstr ""
+msgstr "Du må logge på for å stjernemerke et prosjekt"
msgid "ProjectPage|Copy project ID"
-msgstr ""
+msgstr "Kopier prosjekt-ID"
msgid "ProjectPage|Project ID: %{project_id}"
msgstr "Prosjekt-ID: %{project_id}"
@@ -26130,23 +26494,35 @@ msgstr "Prosjekt-ID: %{project_id}"
msgid "ProjectSelect| or group"
msgstr "eller gruppe"
+msgid "ProjectSelect|No matching results"
+msgstr ""
+
msgid "ProjectSelect|Search for project"
msgstr "Søk etter prosjekt"
+msgid "ProjectSelect|Search projects"
+msgstr ""
+
+msgid "ProjectSelect|Select a project"
+msgstr ""
+
+msgid "ProjectSelect|There was an error fetching the projects. Please try again."
+msgstr ""
+
msgid "ProjectService|Drone server URL"
msgstr ""
msgid "ProjectService|Enter new API key"
-msgstr ""
+msgstr "Skriv inn ny API-nøkkel"
msgid "ProjectService|Enter new password"
-msgstr ""
+msgstr "Oppgi nytt passord"
msgid "ProjectService|Enter new password."
-msgstr ""
+msgstr "Skriv inn nytt passord."
msgid "ProjectService|Issue URL"
-msgstr ""
+msgstr "Sakens URL"
msgid "ProjectService|Jenkins server URL"
msgstr ""
@@ -26220,6 +26596,9 @@ msgstr ""
msgid "ProjectService|Trigger event when a new, unique alert is recorded."
msgstr ""
+msgid "ProjectService|Trigger event when a new, unique vulnerability is recorded. (Note: This feature requires an Ultimate plan.)"
+msgstr ""
+
msgid "ProjectService|Trigger event when a pipeline status changes."
msgstr ""
@@ -26245,7 +26624,7 @@ msgid "ProjectSettings|Always show thumbs-up and thumbs-down award emoji buttons
msgstr ""
msgid "ProjectSettings|Analytics"
-msgstr ""
+msgstr "Analyser"
msgid "ProjectSettings|Automatically resolve merge request diff discussions when they become outdated"
msgstr ""
@@ -26389,7 +26768,7 @@ msgid "ProjectSettings|Only signed commits can be pushed to this repository."
msgstr ""
msgid "ProjectSettings|Operations"
-msgstr ""
+msgstr "Handlinger"
msgid "ProjectSettings|Override user notification preferences for all project members."
msgstr ""
@@ -26425,13 +26804,13 @@ msgid "ProjectSettings|Require an associated issue from Jira"
msgstr ""
msgid "ProjectSettings|Requirements"
-msgstr ""
+msgstr "Krav"
msgid "ProjectSettings|Requirements management system."
msgstr ""
msgid "ProjectSettings|Security & Compliance"
-msgstr ""
+msgstr "Sikkerhet og standarder"
msgid "ProjectSettings|Security & Compliance for this project"
msgstr ""
@@ -26482,7 +26861,7 @@ msgid "ProjectSettings|These checks must pass before merge requests can be merge
msgstr ""
msgid "ProjectSettings|This project"
-msgstr ""
+msgstr "Dette prosjektet"
msgid "ProjectSettings|This setting is applied on the server level and can be overridden by an admin."
msgstr ""
@@ -26500,7 +26879,7 @@ msgid "ProjectSettings|Transfer project"
msgstr "Overfør prosjekt"
msgid "ProjectSettings|Upstream project"
-msgstr ""
+msgstr "Oppstrømsprosjekt"
msgid "ProjectSettings|Used for every new merge request."
msgstr ""
@@ -26634,11 +27013,17 @@ msgstr ""
msgid "Projects are graded based on the highest severity vulnerability present"
msgstr ""
+msgid "Projects are organized into groups"
+msgstr ""
+
msgid "Projects contributed to"
+msgstr "Prosjekter bidratt til"
+
+msgid "Projects help you organize your work. They contain your file repository, issues, merge requests, and so much more."
msgstr ""
msgid "Projects shared with %{group_name}"
-msgstr ""
+msgstr "Prosjekter delt med %{group_name}"
msgid "Projects that can be accessed"
msgstr ""
@@ -26686,7 +27071,7 @@ msgid "ProjectsDropdown|Something went wrong on our end."
msgstr "Noe gikk galt på vår side av linja."
msgid "ProjectsDropdown|Sorry, no projects matched your search"
-msgstr ""
+msgstr "Beklager, ingen prosjekter samsvarer med søket ditt"
msgid "ProjectsDropdown|This feature requires browser localStorage support"
msgstr ""
@@ -26782,7 +27167,7 @@ msgid "PrometheusAlerts|Firing: %{alert}"
msgstr ""
msgid "PrometheusAlerts|Operator"
-msgstr ""
+msgstr "Operatør"
msgid "PrometheusAlerts|Runbook URL (optional)"
msgstr ""
@@ -26860,7 +27245,7 @@ msgid "PrometheusService|More information"
msgstr "Mere informasjon"
msgid "PrometheusService|New metric"
-msgstr ""
+msgstr "Nytt måltall"
msgid "PrometheusService|No %{docsUrlStart}common metrics%{docsUrlEnd} were found"
msgstr ""
@@ -26871,10 +27256,10 @@ msgstr ""
msgid "PrometheusService|Prometheus cluster integration"
msgstr ""
-msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
+msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
msgstr ""
-msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
+msgid "PrometheusService|The ID of the IAP-secured resource."
msgstr ""
msgid "PrometheusService|The Prometheus API base URL."
@@ -26911,7 +27296,7 @@ msgid "Promote issue to an epic"
msgstr "Forfrem saken til en epos"
msgid "Promote to epic"
-msgstr ""
+msgstr "Forfrem til epos"
msgid "Promote to group label"
msgstr "Forfrem til gruppestempel"
@@ -26932,7 +27317,7 @@ msgid "Promotion is not supported."
msgstr "Forfremming er ikke støttet."
msgid "Promotions|Add Group Webhooks and GitLab Enterprise Edition."
-msgstr ""
+msgstr "Legg til gruppe-Webhooks og GitLab Enterprise Edition."
msgid "Promotions|Better Protected Branches"
msgstr ""
@@ -26992,13 +27377,13 @@ msgid "Promotions|Learn more"
msgstr "Lær mer"
msgid "Promotions|Merge request approvals"
-msgstr ""
+msgstr "Godkjenninger av fletteforespørsel"
msgid "Promotions|Not now, thanks!"
msgstr "Ikke nå, ellers takk!"
msgid "Promotions|Push Rules"
-msgstr ""
+msgstr "Push-regler"
msgid "Promotions|Push Rules are defined per project so you can have different rules applied to different projects depends on your needs."
msgstr ""
@@ -27019,10 +27404,10 @@ msgid "Promotions|Start GitLab Ultimate trial"
msgstr ""
msgid "Promotions|The Advanced Search in GitLab is a powerful search service that saves you time. Instead of creating duplicate code and wasting time, you can now search for code within other teams that can help your own project."
-msgstr ""
+msgstr "Det avansert søket i GitLab er en kraftig søketjeneste som sparer deg tid. I stedet for å opprette duplisert kode og kaste bort tid, kan du nå søke etter kode inni andre team som kan hjelpe ditt eget prosjekt."
msgid "Promotions|This feature is locked."
-msgstr ""
+msgstr "Denne funksjonen er låst."
msgid "Promotions|Track activity with Contribution Analytics."
msgstr ""
@@ -27034,7 +27419,7 @@ msgid "Promotions|Upgrade plan"
msgstr "Oppgrader planen"
msgid "Promotions|Upgrade your plan to activate Advanced Search."
-msgstr ""
+msgstr "Oppgrader planen din for å skru på avansert søking."
msgid "Promotions|Upgrade your plan to activate Audit Events."
msgstr ""
@@ -27055,10 +27440,10 @@ msgid "Promotions|Upgrade your plan to improve repositories."
msgstr ""
msgid "Promotions|Webhooks allow you to trigger a URL if, for example, new code is pushed or a new issue is created. You can configure webhooks to listen for specific events like pushes, issues or merge requests. Group webhooks will apply to all projects in a group, allowing you to standardize webhook functionality across your entire group."
-msgstr ""
+msgstr "Webhooks lar deg trigge en URL hvis for eksempel ny kode blir pushet eller en ny sak opprettes. Du kan konfigurere webhooks til å lytte etter spesifikke hendelser som push, saker eller fletteforespørsler. Gruppe-webhooker vil gjelde for alle prosjekter i en gruppe, slik at du kan standardisere webhook-funksjonalitet i hele gruppen."
msgid "Promotions|Weight"
-msgstr ""
+msgstr "Vektlegging"
msgid "Promotions|Weighting your issue"
msgstr ""
@@ -27085,7 +27470,7 @@ msgid "Protect"
msgstr "Beskytt"
msgid "Protect a tag"
-msgstr ""
+msgstr "Beskytt en etikett"
msgid "Protect variable"
msgstr "Beskytt variabel"
@@ -27151,7 +27536,7 @@ msgid "ProtectedBranch|Branch"
msgstr "Gren"
msgid "ProtectedBranch|Branch:"
-msgstr ""
+msgstr "Gren:"
msgid "ProtectedBranch|By default, protected branches restrict who can modify the branch."
msgstr ""
@@ -27166,7 +27551,7 @@ msgid "ProtectedBranch|Keep stable branches secure and force developers to use m
msgstr ""
msgid "ProtectedBranch|Learn more."
-msgstr ""
+msgstr "Lær mer."
msgid "ProtectedBranch|Protect"
msgstr "Beskytt"
@@ -27178,7 +27563,7 @@ msgid "ProtectedBranch|Protected branch (%{protected_branches_count})"
msgstr ""
msgid "ProtectedBranch|Protected branches"
-msgstr ""
+msgstr "Beskyttede grener"
msgid "ProtectedBranch|Reject code pushes that change files listed in the CODEOWNERS file."
msgstr ""
@@ -27244,13 +27629,13 @@ msgid "ProtectedTag|By default, protected branches restrict who can modify the t
msgstr ""
msgid "ProtectedTag|Learn more."
-msgstr ""
+msgstr "Lær mer."
msgid "ProtectedTag|Limit access to creating and updating tags."
msgstr ""
msgid "ProtectedTag|Protected tags"
-msgstr ""
+msgstr "Beskyttede etiketter"
msgid "ProtectedTag|What are protected tags?"
msgstr ""
@@ -27397,7 +27782,7 @@ msgid "PushRules|Users can still delete tags through the GitLab UI."
msgstr ""
msgid "PushRule|Push rules"
-msgstr ""
+msgstr "Push-regler"
msgid "PushRule|Reject unverified users"
msgstr ""
@@ -27427,19 +27812,19 @@ msgid "PushoverService|Get real-time notifications on your device."
msgstr ""
msgid "PushoverService|High priority"
-msgstr ""
+msgstr "Høy prioritet"
msgid "PushoverService|Leave blank for all active devices."
msgstr ""
msgid "PushoverService|Low priority"
-msgstr ""
+msgstr "Lav prioritet"
msgid "PushoverService|Lowest priority"
-msgstr ""
+msgstr "Laveste prioritet"
msgid "PushoverService|Normal priority"
-msgstr ""
+msgstr "Normal prioritet"
msgid "PushoverService|See project %{project_full_name}"
msgstr "Se prosjektet %{project_full_name}"
@@ -27466,7 +27851,7 @@ msgid "Quick actions can be used in description and comment boxes."
msgstr ""
msgid "Quick help"
-msgstr ""
+msgstr "Hurtighjelp"
msgid "Quick range"
msgstr ""
@@ -27492,6 +27877,9 @@ msgstr ""
msgid "Rate limit"
msgstr ""
+msgid "Rate limits can help reduce request volume (like from crawlers or abusive bots)."
+msgstr ""
+
msgid "Raw blob request rate limit per minute"
msgstr ""
@@ -27504,6 +27892,9 @@ msgstr ""
msgid "Re-authentication required"
msgstr ""
+msgid "Re-import"
+msgstr ""
+
msgid "Re-request review"
msgstr ""
@@ -27511,13 +27902,13 @@ msgid "Re-verification interval"
msgstr ""
msgid "Read documentation"
-msgstr ""
+msgstr "Les dokumentasjonen"
msgid "Read more"
msgstr "Les mer"
msgid "Read more about GitLab at %{link_to_promo}."
-msgstr ""
+msgstr "Les mer om GitLab på %{link_to_promo}."
msgid "Read more about project permissions %{help_link_open}here%{help_link_close}"
msgstr ""
@@ -27525,6 +27916,9 @@ msgstr ""
msgid "Read more about related issues"
msgstr ""
+msgid "Read their documentation."
+msgstr ""
+
msgid "Ready to get started with GitLab? Follow these steps to set up your workspace, plan and commit changes, and deploy your project."
msgstr ""
@@ -27532,7 +27926,7 @@ msgid "Ready to merge by members who can write to the target branch."
msgstr ""
msgid "Ready to merge!"
-msgstr ""
+msgstr "Klar til å innflette!"
msgid "Reauthenticating with SAML provider."
msgstr ""
@@ -27558,6 +27952,9 @@ msgstr ""
msgid "Receive any notifications from GitLab."
msgstr ""
+msgid "Receive notification of abuse reports by email."
+msgstr ""
+
msgid "Receive notifications about your own activity"
msgstr ""
@@ -27568,7 +27965,7 @@ msgid "Recent"
msgstr "Nylig"
msgid "Recent Deliveries"
-msgstr ""
+msgstr "Nylige leveranser"
msgid "Recent Project Activity"
msgstr "Nylig prosjektaktivitet"
@@ -27583,7 +27980,7 @@ msgid "Recent searches"
msgstr "Nylige søk"
msgid "Recently used"
-msgstr ""
+msgstr "Nylig brukt"
msgid "Reconfigure"
msgstr "Sett opp på nytt"
@@ -27598,7 +27995,7 @@ msgid "Redirect to SAML provider to test configuration"
msgstr ""
msgid "Redirecting"
-msgstr ""
+msgstr "Omdirigerer"
msgid "Redis"
msgstr ""
@@ -27613,7 +28010,7 @@ msgid "Reduce this project’s visibility?"
msgstr ""
msgid "Reference"
-msgstr ""
+msgstr "Referanse"
msgid "References"
msgstr "Referanser"
@@ -27633,7 +28030,7 @@ msgstr[0] ""
msgstr[1] ""
msgid "Regenerate export"
-msgstr ""
+msgstr "Regenerer eksport"
msgid "Regenerate instance ID"
msgstr ""
@@ -27672,7 +28069,7 @@ msgid "Register as many runners as you want. You can register runners as separat
msgstr ""
msgid "Register device"
-msgstr ""
+msgstr "Registrer enhet"
msgid "Register now"
msgstr "Registrer deg nå"
@@ -27687,7 +28084,7 @@ msgid "Registration Features include:"
msgstr ""
msgid "Registration|Checkout"
-msgstr ""
+msgstr "Kasse"
msgid "Registration|Your GitLab group"
msgstr "Din GitLab-gruppe"
@@ -27701,9 +28098,6 @@ msgstr "Profilen din"
msgid "Registry setup"
msgstr ""
-msgid "Regulate approvals by authors/committers. Affects all projects."
-msgstr ""
-
msgid "Reindexing Status: %{status} (Slice multiplier: %{multiplier}, Maximum running slices: %{max_slices})"
msgstr ""
@@ -27799,11 +28193,14 @@ msgstr ""
msgid "Release|Something went wrong while saving the release details."
msgstr ""
+msgid "Reload page"
+msgstr ""
+
msgid "Remediations"
msgstr ""
msgid "Remember me"
-msgstr ""
+msgstr "Husk på meg"
msgid "Remind later"
msgstr "PÃ¥minn meg senere"
@@ -27821,7 +28218,7 @@ msgid "Remove Zoom meeting"
msgstr "Fjern Zoom-møte"
msgid "Remove access"
-msgstr ""
+msgstr "Fjern tilgang"
msgid "Remove all or specific assignee(s)"
msgstr ""
@@ -27869,7 +28266,7 @@ msgid "Remove favicon"
msgstr ""
msgid "Remove file"
-msgstr ""
+msgstr "Fjern fil"
msgid "Remove fork relationship"
msgstr ""
@@ -27887,7 +28284,7 @@ msgid "Remove header logo"
msgstr ""
msgid "Remove iteration"
-msgstr ""
+msgstr "Fjern iterasjon"
msgid "Remove license"
msgstr "Fjern lisens"
@@ -27896,16 +28293,16 @@ msgid "Remove limit"
msgstr "Fjern grensen"
msgid "Remove link"
-msgstr ""
+msgstr "Fjern lenke"
msgid "Remove list"
-msgstr ""
+msgstr "Fjern liste"
msgid "Remove log"
-msgstr ""
+msgstr "Fjern logg"
msgid "Remove logo"
-msgstr ""
+msgstr "Fjern logo"
msgid "Remove member"
msgstr "Fjern medlem"
@@ -27920,7 +28317,7 @@ msgid "Remove priority"
msgstr "Fjern prioritet"
msgid "Remove report"
-msgstr ""
+msgstr "Fjern rapporten"
msgid "Remove reviewer"
msgstr ""
@@ -27929,16 +28326,16 @@ msgid "Remove runner"
msgstr ""
msgid "Remove secondary email"
-msgstr ""
+msgstr "Fjern sekundær E-post"
msgid "Remove spent time"
msgstr "Fjern brukt tid"
msgid "Remove time estimate"
-msgstr ""
+msgstr "Fjern tidsanslag"
msgid "Remove user"
-msgstr ""
+msgstr "Fjern bruker"
msgid "Remove user & report"
msgstr ""
@@ -27950,7 +28347,7 @@ msgid "Remove user from project"
msgstr ""
msgid "Remove..."
-msgstr ""
+msgstr "Fjern …"
msgid "Removed"
msgstr "Fjernet"
@@ -27962,7 +28359,7 @@ msgid "Removed %{epic_ref} from child epics."
msgstr ""
msgid "Removed %{iteration_reference} iteration."
-msgstr ""
+msgstr "Fjernet «%{iteration_reference}»-iterasjonen."
msgid "Removed %{label_references} %{label_text}."
msgstr "Fjernet %{label_references} %{label_text}."
@@ -28010,7 +28407,7 @@ msgid "Removes %{epic_ref} from child epics."
msgstr ""
msgid "Removes %{iteration_reference} iteration."
-msgstr ""
+msgstr "Fjerner «%{iteration_reference}»-iterasjonen."
msgid "Removes %{label_references} %{label_text}."
msgstr "Fjerner %{label_references} %{label_text}."
@@ -28055,13 +28452,13 @@ msgid "Render diagrams in your documents using PlantUML."
msgstr ""
msgid "Renew subscription"
-msgstr ""
+msgstr "Forny abonnement"
msgid "Reopen"
msgstr "Åpne på nytt"
msgid "Reopen %{issueType}"
-msgstr ""
+msgstr "Gjenåpne %{issueType}"
msgid "Reopen epic"
msgstr "Gjenåpne epos"
@@ -28081,20 +28478,23 @@ msgstr "Gjenåpnet denne %{quick_action_target}."
msgid "Reopens this %{quick_action_target}."
msgstr "Gjenåpner denne %{quick_action_target}."
+msgid "Repeats"
+msgstr ""
+
msgid "Replace"
msgstr "Erstatt"
msgid "Replace %{name}"
-msgstr ""
+msgstr "Erstatt %{name}"
msgid "Replace all label(s)"
msgstr "Erstatt alle stempler"
msgid "Replace file"
-msgstr ""
+msgstr "Erstatt fil"
msgid "Replaced all labels with %{label_references} %{label_text}."
-msgstr ""
+msgstr "Erstattet alle stempler med %{label_references} %{label_text}."
msgid "Replaces the clone URL root."
msgstr ""
@@ -28112,7 +28512,7 @@ msgid "Reply to this email directly or %{view_it_on_gitlab}."
msgstr ""
msgid "Reply…"
-msgstr ""
+msgstr "Svar …"
msgid "Repo by URL"
msgstr "Kodelager utifra URL"
@@ -28130,10 +28530,10 @@ msgid "Reported %{timeAgo} by %{reportedBy}"
msgstr "Rapportert %{timeAgo} av %{reportedBy}"
msgid "Reported by"
-msgstr ""
+msgstr "Rapportert av"
msgid "Reported by %{reporter}"
-msgstr ""
+msgstr "Rapportert av %{reporter}"
msgid "Reporting"
msgstr "Rapportering"
@@ -28167,7 +28567,7 @@ msgid "Reports|Actions"
msgstr "Handlinger"
msgid "Reports|Activity"
-msgstr ""
+msgstr "Aktivitet"
msgid "Reports|An error occurred while loading %{name} results"
msgstr ""
@@ -28198,7 +28598,7 @@ msgid "Reports|Failure"
msgstr "Feilede"
msgid "Reports|Filename"
-msgstr ""
+msgstr "Filnavn"
msgid "Reports|Head report parsing error:"
msgstr ""
@@ -28237,7 +28637,7 @@ msgid "Reports|Test summary results are being parsed"
msgstr ""
msgid "Reports|Tool"
-msgstr ""
+msgstr "Verktøy"
msgid "Reports|Vulnerability"
msgstr "SÃ¥rbarhet"
@@ -28258,13 +28658,13 @@ msgid "RepositoriesAnalytics|Average Coverage by Job"
msgstr ""
msgid "RepositoriesAnalytics|Average coverage"
-msgstr ""
+msgstr "Gjennomsnittlig dekning"
msgid "RepositoriesAnalytics|Average test coverage last 30 days"
msgstr ""
msgid "RepositoriesAnalytics|Coverage"
-msgstr ""
+msgstr "Dekning"
msgid "RepositoriesAnalytics|Coverage Jobs"
msgstr ""
@@ -28285,7 +28685,7 @@ msgid "RepositoriesAnalytics|Jobs with Coverage"
msgstr ""
msgid "RepositoriesAnalytics|Last Update"
-msgstr ""
+msgstr "Seneste oppdatering"
msgid "RepositoriesAnalytics|Latest test coverage results"
msgstr ""
@@ -28324,7 +28724,7 @@ msgid "Repository already read-only"
msgstr ""
msgid "Repository check"
-msgstr ""
+msgstr "Kodelagersjekk"
msgid "Repository check was triggered."
msgstr ""
@@ -28357,7 +28757,7 @@ msgid "Repository has tags."
msgstr "Kodelageret har etiketter."
msgid "Repository maintenance"
-msgstr ""
+msgstr "Kodelagervedlikehold"
msgid "Repository mirroring"
msgstr "Kodelagerspeiling"
@@ -28381,7 +28781,7 @@ msgid "Repository update events"
msgstr ""
msgid "Repository: %{counter_repositories} / Wikis: %{counter_wikis} / Build Artifacts: %{counter_build_artifacts} / LFS: %{counter_lfs_objects} / Snippets: %{counter_snippets} / Packages: %{counter_packages} / Uploads: %{counter_uploads}"
-msgstr ""
+msgstr "Kodelager: %{counter_repositories} / Wikier: %{counter_wikis} / Byggartifakter: %{counter_build_artifacts} / LFS: %{counter_lfs_objects} / Utdrag: %{counter_snippets} / Pakker: %{counter_packages} / Opplastinger: %{counter_uploads}"
msgid "RepositorySettingsAccessLevel|Select"
msgstr "Velg"
@@ -28390,10 +28790,10 @@ msgid "Request Access"
msgstr "Be om tilgang"
msgid "Request a new one"
-msgstr ""
+msgstr "Be om en ny en"
msgid "Request details"
-msgstr ""
+msgstr "Be om detaljer"
msgid "Request new confirmation email"
msgstr ""
@@ -28402,7 +28802,7 @@ msgid "Request parameter %{param} is missing."
msgstr ""
msgid "Request review from"
-msgstr ""
+msgstr "Be om gjennomgang fra"
msgid "Request time"
msgstr ""
@@ -28443,10 +28843,7 @@ msgstr "Forespørsler til disse domenene/adressene i det lokale nettverket vil v
msgid "Require additional authentication for administrative tasks."
msgstr ""
-msgid "Require all users in this group to setup Two-factor authentication"
-msgstr ""
-
-msgid "Require all users in this group to setup two-factor authentication"
+msgid "Require all users in this group to set up two-factor authentication"
msgstr ""
msgid "Required approvals (%{approvals_given} given)"
@@ -28492,11 +28889,14 @@ msgstr[1] "Krever %d godkjenninger til."
msgid "Requires values to meet regular expression requirements."
msgstr ""
+msgid "Requires you to deploy or set up cloud-hosted Sentry."
+msgstr ""
+
msgid "Requires your primary GitLab email address."
msgstr ""
msgid "Resend"
-msgstr ""
+msgstr "Send på nytt"
msgid "Resend Request"
msgstr "Send forespørsel på nytt"
@@ -28514,16 +28914,16 @@ msgid "Resend unlock instructions"
msgstr ""
msgid "Reset"
-msgstr ""
+msgstr "Tilbakestill"
msgid "Reset authorization key"
msgstr "Tilbakestill autorisasjonsnøkkel"
msgid "Reset authorization key?"
-msgstr ""
+msgstr "Vil du tilbakestille autoriseringsnøkkelen?"
msgid "Reset filters"
-msgstr ""
+msgstr "Tilbakestill filtre"
msgid "Reset health check access token"
msgstr ""
@@ -28535,7 +28935,7 @@ msgid "Reset link will be generated and sent to the user. %{break} User will be
msgstr ""
msgid "Reset password"
-msgstr ""
+msgstr "Tilbakestill passord"
msgid "Reset registration token"
msgstr ""
@@ -28552,9 +28952,6 @@ msgstr ""
msgid "Resolve"
msgstr "Løs"
-msgid "Resolve all threads in new issue"
-msgstr "Oppklar alle tråder i en ny sak"
-
msgid "Resolve conflicts"
msgstr "Løs konflikter"
@@ -28610,6 +29007,9 @@ msgid "Response metrics (NGINX)"
msgstr "Responsmåltall (NGINX)"
msgid "Response text"
+msgstr "Responstekst"
+
+msgid "Restart GitLab to apply changes."
msgstr ""
msgid "Restart Terminal"
@@ -28630,6 +29030,9 @@ msgstr ""
msgid "Restoring the project will prevent the project from being removed on this date and restore people's ability to make changes to it."
msgstr ""
+msgid "Restrict group access by IP address. %{link_start}Learn more%{link_end}."
+msgstr ""
+
msgid "Restrict membership by email domain"
msgstr ""
@@ -28684,16 +29087,16 @@ msgid "Review App|View app"
msgstr "Vis app"
msgid "Review App|View latest app"
-msgstr ""
+msgstr "Vis nyligste app"
msgid "Review changes"
-msgstr ""
+msgstr "GÃ¥ gjennom endringer"
msgid "Review requested from %{name}"
msgstr ""
msgid "Review requests for you"
-msgstr ""
+msgstr "Gjennomgangsforespørsler til deg"
msgid "Review the changes locally"
msgstr ""
@@ -28715,14 +29118,14 @@ msgstr ""
msgid "Reviewer"
msgid_plural "%d Reviewers"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "Anmelder"
+msgstr[1] "%d Anmeldere"
msgid "Reviewer(s)"
-msgstr ""
+msgstr "Anmelder(e)"
msgid "Reviewers"
-msgstr ""
+msgstr "Anmeldere"
msgid "Reviewing"
msgstr "GÃ¥r gjennom"
@@ -28746,10 +29149,10 @@ msgid "Revoked project access token %{project_access_token_name}!"
msgstr ""
msgid "RightSidebar|Copy email address"
-msgstr ""
+msgstr "Kopier E-postadressen"
msgid "RightSidebar|Issue email"
-msgstr ""
+msgstr "Sakens E-post"
msgid "RightSidebar|adding a"
msgstr "legge til en"
@@ -28770,10 +29173,10 @@ msgid "Rollback"
msgstr "Tilbakeføring"
msgid "Ruby"
-msgstr ""
+msgstr "Ruby"
msgid "Rule name is already taken."
-msgstr ""
+msgstr "Dette regelnavnet er allerede brukt."
msgid "Rules that define what git pushes are accepted for a project in this group. All newly created projects in this group will use these settings."
msgstr ""
@@ -28836,7 +29239,7 @@ msgid "Runners page."
msgstr ""
msgid "Runners|Active"
-msgstr ""
+msgstr "Aktiv"
msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. %{percentage} spot."
msgstr ""
@@ -28848,7 +29251,7 @@ msgid "Runners|An error has occurred fetching instructions"
msgstr ""
msgid "Runners|Architecture"
-msgstr ""
+msgstr "Arkitektur"
msgid "Runners|Are you sure you want to delete this runner?"
msgstr ""
@@ -28866,7 +29269,7 @@ msgid "Runners|Deploy GitLab Runner in AWS"
msgstr ""
msgid "Runners|Description"
-msgstr ""
+msgstr "Beskrivelse"
msgid "Runners|Download and install binary"
msgstr ""
@@ -28884,7 +29287,7 @@ msgid "Runners|Group Runners"
msgstr ""
msgid "Runners|IP Address"
-msgstr ""
+msgstr "IP-adresse"
msgid "Runners|If you do not select an AWS VPC, the runner will deploy to the Default VPC in the AWS Region you select. Please consult with your AWS administrator to understand if there are any security risks to deploying into the Default VPC in any given region in your AWS account."
msgstr ""
@@ -28893,7 +29296,7 @@ msgid "Runners|Install a runner"
msgstr ""
msgid "Runners|Last contact"
-msgstr ""
+msgstr "Siste kontakt"
msgid "Runners|Locked to this project"
msgstr ""
@@ -28914,16 +29317,16 @@ msgid "Runners|New runner, has not connected yet"
msgstr ""
msgid "Runners|Not connected"
-msgstr ""
+msgstr "Ikke tilkoblet"
msgid "Runners|Offline"
-msgstr ""
+msgstr "Frakoblet"
msgid "Runners|Online"
-msgstr ""
+msgstr "PÃ¥ nett"
msgid "Runners|Paused"
-msgstr ""
+msgstr "Satt på pause"
msgid "Runners|Platform"
msgstr "Plattform"
@@ -28932,17 +29335,20 @@ msgid "Runners|Property Name"
msgstr "Egenskapsnavn"
msgid "Runners|Protected"
-msgstr ""
+msgstr "Beskyttet"
msgid "Runners|Revision"
-msgstr ""
+msgstr "Revisjon"
msgid "Runners|Runner"
-msgstr ""
+msgstr "Runner"
msgid "Runners|Runner #%{runner_id}"
msgstr ""
+msgid "Runners|Runner assigned to project."
+msgstr ""
+
msgid "Runners|Runner is offline, last contact was %{runner_contact} ago"
msgstr ""
@@ -28955,9 +29361,12 @@ msgstr ""
msgid "Runners|Runner registration"
msgstr ""
-msgid "Runners|Runners"
+msgid "Runners|Runner unassigned from project."
msgstr ""
+msgid "Runners|Runners"
+msgstr "Løpere"
+
msgid "Runners|Runners in this group: %{groupRunnersCount}"
msgstr ""
@@ -28977,7 +29386,7 @@ msgid "Runners|Stop the runner from accepting new jobs."
msgstr ""
msgid "Runners|Tags"
-msgstr ""
+msgstr "Etiketter"
msgid "Runners|This runner is associated with one or more projects."
msgstr ""
@@ -29010,10 +29419,10 @@ msgid "Runners|Use the runner on pipelines for protected branches only."
msgstr ""
msgid "Runners|Value"
-msgstr ""
+msgstr "Verdi"
msgid "Runners|Version"
-msgstr ""
+msgstr "Versjon"
msgid "Runners|View installation instructions"
msgstr ""
@@ -29034,25 +29443,25 @@ msgid "Runners|You have used %{quotaUsed} out of %{quotaLimit} of your shared Ru
msgstr ""
msgid "Runners|group"
-msgstr ""
+msgstr "gruppe"
msgid "Runners|instance"
-msgstr ""
+msgstr "instans"
msgid "Runners|locked"
-msgstr ""
+msgstr "låst"
msgid "Runners|paused"
-msgstr ""
+msgstr "satt på pause"
msgid "Runners|project"
-msgstr ""
+msgstr "prosjekt"
msgid "Runners|shared"
-msgstr ""
+msgstr "delt"
msgid "Runners|specific"
-msgstr ""
+msgstr "spesifikk"
msgid "Running"
msgstr "Kjører"
@@ -29112,7 +29521,7 @@ msgid "SSH key"
msgstr "SSH-nøkkel"
msgid "SSH keys"
-msgstr ""
+msgstr "SSH-nøkler"
msgid "SSH keys allow you to establish a secure connection between your computer and GitLab."
msgstr ""
@@ -29130,28 +29539,28 @@ msgid "SSL Verification:"
msgstr "SSL-verifisering:"
msgid "SSL verification"
-msgstr ""
+msgstr "SSL-verifisering"
msgid "SVG illustration"
-msgstr ""
+msgstr "SVG-illustrasjon"
msgid "SastEntryPoints|Add Security Testing"
-msgstr ""
+msgstr "Legg til sikkerhetstesting"
msgid "SastEntryPoints|Catch your security vulnerabilities ahead of time!"
-msgstr ""
+msgstr "Fang opp dine sikkerhetssårbarheter før de blir et problem!"
msgid "SastEntryPoints|GitLab can scan your code for security vulnerabilities. Static Application Security Testing (SAST) helps you worry less and build more."
-msgstr ""
+msgstr "GitLab kan skanne koden din for sikkerhetssårbarheter. Statisk applikasjonssikkerhetstesting (SAST) hjelper deg med å bli mindre bekymret og bygge mer."
msgid "SastEntryPoints|How do I set up SAST?"
-msgstr ""
+msgstr "Hvordan setter jeg opp SAST?"
-msgid "SastEntryPoints|Learn more."
+msgid "SastEntryPoints|Learn more"
msgstr ""
msgid "Satisfied"
-msgstr ""
+msgstr "Fornøyd"
msgid "Saturday"
msgstr "Lørdag"
@@ -29189,7 +29598,7 @@ msgstr "Lagre passord"
msgid "Save pipeline schedule"
msgstr ""
-msgid "Save space and find images in the container Registry. remove unneeded tags and keep only the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
+msgid "Save storage space by automatically deleting tags from the container registry and keeping the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
msgstr ""
msgid "Saving"
@@ -29235,7 +29644,7 @@ msgid "Schedules to merge this merge request (%{strategy})."
msgstr ""
msgid "Scheduling Pipelines"
-msgstr ""
+msgstr "Planlegger rørledninger"
msgid "Scope"
msgstr "Omfang"
@@ -29277,7 +29686,7 @@ msgid "Search"
msgstr "Søk"
msgid "Search GitLab"
-msgstr ""
+msgstr "Søk på GitLab"
msgid "Search Jira issues"
msgstr "Søk blant Jira-saker"
@@ -29289,7 +29698,7 @@ msgid "Search an environment spec"
msgstr ""
msgid "Search assignees"
-msgstr ""
+msgstr "Søk blant tilordnede"
msgid "Search authors"
msgstr "Søk etter skapere"
@@ -29304,7 +29713,7 @@ msgid "Search branches, tags, and commits"
msgstr "Søk blant grener, etiketter, og commiter"
msgid "Search by Git revision"
-msgstr ""
+msgstr "Søk etter Git-revisjon"
msgid "Search by author"
msgstr "Søk etter forfatter"
@@ -29343,10 +29752,10 @@ msgid "Search forks"
msgstr "Velg utgreininger"
msgid "Search iterations"
-msgstr ""
+msgstr "Søk blant iterasjoner"
msgid "Search labels"
-msgstr ""
+msgstr "Søk blant stempler"
msgid "Search merge requests"
msgstr "Søke i flettede forespørsler"
@@ -29363,6 +29772,9 @@ msgstr "Søk eller filtrer resultater …"
msgid "Search or filter results…"
msgstr "Søk blant eller filtrer resultater …"
+msgid "Search or jump to..."
+msgstr ""
+
msgid "Search project"
msgstr "Søk i prosjekt"
@@ -29379,7 +29791,7 @@ msgid "Search requirements"
msgstr ""
msgid "Search settings"
-msgstr ""
+msgstr "Søk i innstillinger"
msgid "Search users"
msgstr "Søk etter brukere"
@@ -29397,19 +29809,19 @@ msgid "SearchAutocomplete|All GitLab"
msgstr "Hele GitLab"
msgid "SearchAutocomplete|Issues I've created"
-msgstr ""
+msgstr "Saker jeg har opprettet"
msgid "SearchAutocomplete|Issues assigned to me"
-msgstr ""
+msgstr "Saker tildelt til meg"
msgid "SearchAutocomplete|Merge requests I've created"
-msgstr ""
+msgstr "Fletteforespørsler jeg har opprettet"
msgid "SearchAutocomplete|Merge requests assigned to me"
-msgstr ""
+msgstr "Fletteforespørsler tildelt til meg"
msgid "SearchAutocomplete|Merge requests that I'm a reviewer"
-msgstr ""
+msgstr "Fletteforespørsler som jeg er anmelder for"
msgid "SearchAutocomplete|in all GitLab"
msgstr "på hele GitLab"
@@ -29423,22 +29835,22 @@ msgstr "i prosjektet %{projectName}"
msgid "SearchCodeResults|of %{link_to_project}"
msgstr "av %{link_to_project}"
-msgid "SearchResults|Showing %{count} %{scope} for%{term_element}"
-msgstr "Viser %{count} %{scope} for%{term_element}"
+msgid "SearchResults|Showing %{count} %{scope} for %{term_element}"
+msgstr ""
-msgid "SearchResults|Showing %{count} %{scope} for%{term_element} in your personal and project snippets"
-msgstr "Viser %{count} %{scope} for%{term_element} i dine personlige og prosjektmessige utdrag"
+msgid "SearchResults|Showing %{count} %{scope} for %{term_element} in your personal and project snippets"
+msgstr ""
-msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for%{term_element}"
-msgstr "Viser %{from} - %{to} av %{count} %{scope} for%{term_element}"
+msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for %{term_element}"
+msgstr ""
-msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for%{term_element} in your personal and project snippets"
-msgstr "Viser %{from} - %{to} av %{count} %{scope} for%{term_element} i dine personlige og prosjektmessige utdrag"
+msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for %{term_element} in your personal and project snippets"
+msgstr ""
msgid "SearchResults|code result"
msgid_plural "SearchResults|code results"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "koderesultat"
+msgstr[1] "koderesultater"
msgid "SearchResults|comment"
msgid_plural "SearchResults|comments"
@@ -29452,8 +29864,8 @@ msgstr[1] "commiter"
msgid "SearchResults|epic"
msgid_plural "SearchResults|epics"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "epos"
+msgstr[1] "eposer"
msgid "SearchResults|issue"
msgid_plural "SearchResults|issues"
@@ -29462,8 +29874,8 @@ msgstr[1] "saker"
msgid "SearchResults|merge request"
msgid_plural "SearchResults|merge requests"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "fletteforespørsel"
+msgstr[1] "fletteforespørsler"
msgid "SearchResults|milestone"
msgid_plural "SearchResults|milestones"
@@ -29503,7 +29915,7 @@ msgid "Secondary"
msgstr "Sekundær"
msgid "Secondary email:"
-msgstr ""
+msgstr "Sekundær E-post:"
msgid "Seconds"
msgstr "Sekunder"
@@ -29514,9 +29926,12 @@ msgstr "Hemmelig"
msgid "Secret Detection"
msgstr "Hemmelig oppdagelse"
-msgid "Secret token"
+msgid "Secret access key"
msgstr ""
+msgid "Secret token"
+msgstr "Hemmelig sjetong"
+
msgid "Secure token that identifies an external storage request."
msgstr ""
@@ -29536,7 +29951,7 @@ msgid "Security dashboard"
msgstr "Sikkerhetskontrollpanel"
msgid "Security navigation"
-msgstr ""
+msgstr "Sikkerhetsnavigasjon"
msgid "Security report is out of date. Please update your branch with the latest changes from the target branch (%{targetBranchName})"
msgstr ""
@@ -29553,9 +29968,6 @@ msgstr ""
msgid "SecurityApprovals|A merge request approval is required when the license compliance report contains a denied license."
msgstr ""
-msgid "SecurityApprovals|Configurable if security scanners are enabled. %{linkStart}Learn more.%{linkEnd}"
-msgstr ""
-
msgid "SecurityApprovals|Coverage-Check"
msgstr ""
@@ -29568,24 +29980,18 @@ msgstr ""
msgid "SecurityApprovals|Learn more about Vulnerability-Check"
msgstr ""
-msgid "SecurityApprovals|License Scanning must be enabled. %{linkStart}Learn more%{linkEnd}."
-msgstr ""
-
msgid "SecurityApprovals|License-Check"
-msgstr ""
+msgstr "Lisenssjekk"
msgid "SecurityApprovals|Requires approval for Denied licenses. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}More information%{linkEnd}"
+msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "SecurityApprovals|Requires approval for vulnerabilities. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
-msgid "SecurityApprovals|Test coverage must be enabled. %{linkStart}Learn more%{linkEnd}."
-msgstr ""
-
msgid "SecurityApprovals|Vulnerability-Check"
msgstr ""
@@ -29605,7 +30011,7 @@ msgid "SecurityConfiguration|By default, all analyzers are applied in order to c
msgstr ""
msgid "SecurityConfiguration|Compliance"
-msgstr ""
+msgstr "Overholdelse"
msgid "SecurityConfiguration|Configuration guide"
msgstr ""
@@ -29614,7 +30020,7 @@ msgid "SecurityConfiguration|Configuration history"
msgstr ""
msgid "SecurityConfiguration|Configure %{feature}"
-msgstr ""
+msgstr "Konfigurer %{feature}"
msgid "SecurityConfiguration|Configure via Merge Request"
msgstr ""
@@ -29635,10 +30041,10 @@ msgid "SecurityConfiguration|Customize common SAST settings to suit your require
msgstr "Tilpass vanlige SAST-innstillinger etter dine behov. Oppsettsendringer som er gjort her, overstyrer de som er gitt av GitLab og er ekskludert fra oppdateringer. For detaljer om mer avanserte konfigurasjonsalternativer, se %{linkStart}GitLab sin SAST-dokumentasjon%{linkEnd}."
msgid "SecurityConfiguration|Enable %{feature}"
-msgstr ""
+msgstr "Skru på %{feature}"
msgid "SecurityConfiguration|Enable Auto DevOps"
-msgstr ""
+msgstr "Aktiver Auto DevOps"
msgid "SecurityConfiguration|Enabled"
msgstr "Skrudd på"
@@ -29649,11 +30055,17 @@ msgstr ""
msgid "SecurityConfiguration|Immediately begin risk analysis and remediation with application security features. Start with SAST and Secret Detection, available to all plans. Upgrade to Ultimate to get all features, including:"
msgstr ""
+msgid "SecurityConfiguration|Manage corpus"
+msgstr ""
+
+msgid "SecurityConfiguration|Manage corpus files used as mutation sources in coverage fuzzing."
+msgstr ""
+
msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
msgstr ""
msgid "SecurityConfiguration|Manage scans"
-msgstr ""
+msgstr "Behandle skanninger"
msgid "SecurityConfiguration|More scan types, including Container Scanning, DAST, Dependency Scanning, Fuzzing, and Licence Compliance"
msgstr ""
@@ -29671,7 +30083,7 @@ msgid "SecurityConfiguration|Runtime security metrics for application environmen
msgstr ""
msgid "SecurityConfiguration|SAST Analyzers"
-msgstr ""
+msgstr "SAST-analytikere"
msgid "SecurityConfiguration|SAST Configuration"
msgstr "SAST-oppsett"
@@ -29695,22 +30107,28 @@ msgid "SecurityConfiguration|Vulnerability details and statistics in the merge r
msgstr ""
msgid "SecurityOrchestration|%{branches} %{plural}"
-msgstr ""
+msgstr "%{branches} %{plural}"
msgid "SecurityOrchestration|%{branches} and %{lastBranch} %{plural}"
-msgstr ""
+msgstr "%{branches} og %{lastBranch} %{plural}"
msgid "SecurityOrchestration|Action"
+msgstr "Handling"
+
+msgid "SecurityOrchestration|Actions"
msgstr ""
-msgid "SecurityOrchestration|All policies"
+msgid "SecurityOrchestration|Add rule"
msgstr ""
+msgid "SecurityOrchestration|All policies"
+msgstr "Alle retningslinjer"
+
msgid "SecurityOrchestration|An error occurred assigning your security policy project"
msgstr ""
msgid "SecurityOrchestration|Description"
-msgstr ""
+msgstr "Beskrivelse"
msgid "SecurityOrchestration|Edit policy"
msgstr ""
@@ -29728,19 +30146,16 @@ msgid "SecurityOrchestration|Executes a %{scanType} scan"
msgstr ""
msgid "SecurityOrchestration|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
-msgstr ""
+msgstr "Hvis du bruker Auto DevOps, vil ikke din %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd}-filen bli oppdatert hvis du endrer en retningslinje i denne delen. Auto DevOps-brukere bør gjøre endringer ved å følge dokumentasjonen for %{linkStart}Container-nettverksretningslinjer%{linkEnd}."
msgid "SecurityOrchestration|Latest scan"
-msgstr ""
+msgstr "Seneste skanning"
msgid "SecurityOrchestration|Network"
-msgstr ""
-
-msgid "SecurityOrchestration|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
-msgstr ""
+msgstr "Nettverk"
msgid "SecurityOrchestration|New policy"
-msgstr ""
+msgstr "Ny retningslinje"
msgid "SecurityOrchestration|Only owners can update Security Policy Project"
msgstr ""
@@ -29754,6 +30169,9 @@ msgstr ""
msgid "SecurityOrchestration|Policy editor"
msgstr ""
+msgid "SecurityOrchestration|Policy preview"
+msgstr ""
+
msgid "SecurityOrchestration|Policy status"
msgstr ""
@@ -29761,6 +30179,9 @@ msgid "SecurityOrchestration|Policy type"
msgstr ""
msgid "SecurityOrchestration|Rule"
+msgstr "Regel"
+
+msgid "SecurityOrchestration|Rules"
msgstr ""
msgid "SecurityOrchestration|Scan Execution"
@@ -29800,19 +30221,19 @@ msgid "SecurityOrchestration|Update scan execution policies"
msgstr ""
msgid "SecurityOrchestration|view results"
-msgstr ""
+msgstr "vis resultater"
msgid "SecurityOrhestration|No rules defined - policy will not run."
msgstr ""
msgid "SecurityPolicies|+%{count} more"
-msgstr ""
+msgstr "+%{count} til"
msgid "SecurityPolicies|Environment(s)"
msgstr ""
msgid "SecurityPolicies|Policy type"
-msgstr ""
+msgstr "Retningslinjetype"
msgid "SecurityReports|%{firstProject} and %{secondProject}"
msgstr "%{firstProject} og %{secondProject}"
@@ -29827,7 +30248,7 @@ msgid "SecurityReports|Add projects"
msgstr "Legg til prosjekter"
msgid "SecurityReports|All activity"
-msgstr ""
+msgstr "All aktivitet"
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 ""
@@ -29836,7 +30257,7 @@ msgid "SecurityReports|At GitLab, we're all about iteration and feedback. That's
msgstr ""
msgid "SecurityReports|Change status"
-msgstr ""
+msgstr "Endre status"
msgid "SecurityReports|Comment added to '%{vulnerabilityName}'"
msgstr ""
@@ -29856,6 +30277,9 @@ msgstr ""
msgid "SecurityReports|Create issue"
msgstr "Opprett saker"
+msgid "SecurityReports|Development vulnerabilities"
+msgstr ""
+
msgid "SecurityReports|Dismiss vulnerability"
msgstr "Avfei sårbarhet"
@@ -29869,6 +30293,9 @@ msgid "SecurityReports|Download %{artifactName}"
msgstr ""
msgid "SecurityReports|Download results"
+msgstr "Last ned resultater"
+
+msgid "SecurityReports|Download scanned URLs"
msgstr ""
msgid "SecurityReports|Download scanned resources"
@@ -29905,34 +30332,34 @@ msgid "SecurityReports|Learn more about setting up your dashboard"
msgstr ""
msgid "SecurityReports|Manage and track vulnerabilities identified in projects within your group. Vulnerabilities in projects are shown here when security testing is configured."
-msgstr ""
+msgstr "Behandle og spor sårbarheter som har blitt identifisert i prosjekter innenfor gruppen din. Sårbarheter i prosjekter vises her når sikkerhetstesting er satt opp."
msgid "SecurityReports|Manage and track vulnerabilities identified in your project. Vulnerabilities are shown here when security testing is configured."
-msgstr ""
+msgstr "Behandle og spor sårbarheter som har blitt identifisert i prosjektet ditt. Sårbarheter vises her når sikkerhetstesting er satt opp."
msgid "SecurityReports|Manage and track vulnerabilities identified in your selected projects. Vulnerabilities for selected projects with security testing configured are shown here."
-msgstr ""
+msgstr "Behandle og spor sårbarheter som har blitt identifisert i dine valgte prosjekter. Sårbarheter for valgte prosjekter som har sikkerhetstesting satt opp, vises her."
msgid "SecurityReports|Maximum selected projects limit reached"
msgstr ""
msgid "SecurityReports|Monitor vulnerabilities in all of your projects"
-msgstr ""
+msgstr "Hold øye med sårbarheter i alle dine prosjekter"
msgid "SecurityReports|Monitor vulnerabilities in your group"
-msgstr ""
+msgstr "Hold øye med sårbarheter i gruppen din"
msgid "SecurityReports|Monitor vulnerabilities in your project"
-msgstr ""
+msgstr "Hold øye med sårbarheter i prosjektet ditt"
msgid "SecurityReports|Monitored projects"
-msgstr ""
+msgstr "Prosjekter som holdes øye med"
msgid "SecurityReports|More info"
msgstr "Mere info"
msgid "SecurityReports|No activity"
-msgstr ""
+msgstr "Ingen aktivitet"
msgid "SecurityReports|No longer detected"
msgstr ""
@@ -29974,10 +30401,10 @@ msgid "SecurityReports|Security scans have run"
msgstr ""
msgid "SecurityReports|Select a project to add by using the project search field above."
-msgstr ""
+msgstr "Velg et prosjekt å legge til ved å bruke projektsøkefeltet ovenfor."
msgid "SecurityReports|Set status"
-msgstr ""
+msgstr "Sett status"
msgid "SecurityReports|Severity"
msgstr "Alvorlighet"
@@ -29986,16 +30413,19 @@ msgid "SecurityReports|Sometimes a scanner can't determine a finding's severity.
msgstr ""
msgid "SecurityReports|Sorry, your filter produced no results"
-msgstr ""
+msgstr "Beklager, filteret ditt ga ingen resultater"
msgid "SecurityReports|Status"
msgstr "Status"
msgid "SecurityReports|Take survey"
+msgstr "Ta undersøkelse"
+
+msgid "SecurityReports|The Vulnerability Report shows the results of the lastest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "SecurityReports|The security reports below contain one or more vulnerability findings that could not be parsed and were not recorded. Download the artifacts in the job output to investigate. Ensure any security report created conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
-msgstr ""
+msgstr "Sikkerhetsrapportene nedenfor inneholder ett eller flere sårbarhetsfunn som ikke kunne analyseres og som ikke ble registrert. Last ned artefaktene i jobbutdataen for å undersøke. Sørg for at alle sikkerhetsrapporter som er opprettet, samsvarer med det relevante %{helpPageLinkStart}JSON -skjemaet%{helpPageLinkEnd}."
msgid "SecurityReports|There was an error adding the comment."
msgstr "Det oppstod en feil under tillegging av kommentaren."
@@ -30028,7 +30458,7 @@ msgid "SecurityReports|To widen your search, change or remove filters above"
msgstr ""
msgid "SecurityReports|Tool"
-msgstr ""
+msgstr "Verktøy"
msgid "SecurityReports|Unable to add %{invalidProjectsMessage}: %{errorMessage}"
msgstr ""
@@ -30037,7 +30467,7 @@ msgid "SecurityReports|Unable to add %{invalidProjects}"
msgstr "Klarte ikke å legge til %{invalidProjects}"
msgid "SecurityReports|Undo dismiss"
-msgstr ""
+msgstr "Angre avvisning"
msgid "SecurityReports|Upgrade to interact, track and shift left with vulnerability management features in the UI."
msgstr ""
@@ -30073,7 +30503,7 @@ msgid "See metrics"
msgstr "Se målinger"
msgid "See our website for help"
-msgstr ""
+msgstr "Se nettstedet vårt for hjelp"
msgid "See the affected projects in the GitLab admin panel"
msgstr ""
@@ -30103,7 +30533,7 @@ msgid "Select Page"
msgstr "Velg side"
msgid "Select a branch"
-msgstr ""
+msgstr "Velg en gren"
msgid "Select a file from the left sidebar to begin editing. Afterwards, you'll be able to commit your changes."
msgstr ""
@@ -30118,7 +30548,7 @@ msgid "Select a label"
msgstr "Velg et stempel"
msgid "Select a milestone"
-msgstr ""
+msgstr "Velg en milepæl"
msgid "Select a new namespace"
msgstr "Velg et nytt navnefelt"
@@ -30135,11 +30565,11 @@ msgstr "Velg en årsak"
msgid "Select a repository"
msgstr "Velg et kodelager"
-msgid "Select a role"
+msgid "Select a repository containing templates for common files."
msgstr ""
-msgid "Select a shared template repository for all projects on this instance."
-msgstr ""
+msgid "Select a role"
+msgstr "Velg en rolle"
msgid "Select a template repository"
msgstr "Velg et mal-kodelager"
@@ -30148,7 +30578,7 @@ msgid "Select a template type"
msgstr "Velg en maltype"
msgid "Select a time zone"
-msgstr ""
+msgstr "Velg en tidssone"
msgid "Select a timezone"
msgstr "Velg en tidssone"
@@ -30157,10 +30587,10 @@ msgid "Select all"
msgstr "Velg alt"
msgid "Select an assignee"
-msgstr ""
+msgstr "Velg en tilordnet"
msgid "Select an iteration"
-msgstr ""
+msgstr "Velg en iterasjon"
msgid "Select assignee"
msgstr "Velg tilordnet"
@@ -30178,7 +30608,7 @@ msgid "Select file"
msgstr "Velg fil"
msgid "Select group"
-msgstr ""
+msgstr "Velg gruppe"
msgid "Select group or project"
msgstr "Velg gruppe eller prosjekt"
@@ -30190,7 +30620,7 @@ msgid "Select health status"
msgstr "Velg helsestatus"
msgid "Select iteration"
-msgstr ""
+msgstr "Velg iterasjon"
msgid "Select label"
msgstr "Velg stempel"
@@ -30216,11 +30646,14 @@ msgstr "Velg prosjekt og sone for å velge maskintype"
msgid "Select project to choose zone"
msgstr "Velg prosjekt for å velge sone"
+msgid "Select project to create issue"
+msgstr ""
+
msgid "Select projects"
msgstr "Velg prosjekter"
msgid "Select reviewer(s)"
-msgstr ""
+msgstr "Velg anmelder(e)"
msgid "Select shards to replicate"
msgstr "Velg skår å replikere"
@@ -30241,7 +30674,7 @@ msgid "Select strategy activation method"
msgstr ""
msgid "Select subgroup"
-msgstr ""
+msgstr "Velg undergruppe"
msgid "Select subscription"
msgstr "Velg abonnement"
@@ -30256,7 +30689,7 @@ msgid "Select type"
msgstr "Velg type"
msgid "Selected"
-msgstr ""
+msgstr "Valgt"
msgid "Selected commits"
msgstr "Valgte commiter"
@@ -30265,7 +30698,7 @@ msgid "Selected levels cannot be used by non-admin users for groups, projects or
msgstr "De valgte nivåene kan ikke brukes av ikke-administratorbrukere for grupper, prosjekter eller utdrag. Hvis det offentlige nivået er begrenset, er brukerprofilene bare synlige for påloggede brukere."
msgid "Selected projects"
-msgstr ""
+msgstr "Utvalgte prosjekter"
msgid "Selecting a GitLab user will add a link to the GitLab user in the descriptions of issues and comments (e.g. \"By %{link_open}@johnsmith%{link_close}\"). It will also associate and/or assign these issues and comments with the selected user."
msgstr "Å velge en GitLab-bruker vil legge til en lenke til GitLab-brukeren i beskrivelsene av saker og kommentarer (f.eks. \"Av %{link_open}@johnsmith%{link_close}\"). Det vil også knytte og/eller tildele disse sakene og kommentarene til den valgte brukeren."
@@ -30313,7 +30746,7 @@ msgid "SelfMonitoring|Self monitoring project successfully deleted."
msgstr ""
msgid "Send"
-msgstr ""
+msgstr "Send"
msgid "Send a single email notification to Owners and Maintainers for new alerts."
msgstr ""
@@ -30333,6 +30766,9 @@ msgstr "Send E-postvarsel"
msgid "Send emails to help guide new users through the onboarding process."
msgstr ""
+msgid "Send emails to users upon account deactivation."
+msgstr ""
+
msgid "Send message"
msgstr "Send melding"
@@ -30349,13 +30785,16 @@ msgid "Send report"
msgstr "Send inn rapport"
msgid "Send service data"
+msgstr "Send tjenestedata"
+
+msgid "Sentry"
msgstr ""
msgid "Sentry API URL"
-msgstr ""
+msgstr "Sentry-API-URL"
msgid "Sentry event"
-msgstr ""
+msgstr "Sentry-hendelse"
msgid "Sep"
msgstr "Sep"
@@ -30367,13 +30806,13 @@ msgid "September"
msgstr "September"
msgid "SeriesFinalConjunction|and"
-msgstr ""
+msgstr "og"
msgid "Serve repository static objects (for example, archives and blobs) from external storage."
msgstr ""
msgid "Server (optional)"
-msgstr ""
+msgstr "Tjener (valgfritt)"
msgid "Server supports batch API only, please update your Git LFS client to version 1.0.1 and up."
msgstr ""
@@ -30439,7 +30878,7 @@ msgid "Serverless|Learn more about Serverless"
msgstr ""
msgid "Serverless|No functions available"
-msgstr ""
+msgstr "Ingen funksjoner er tilgjengelige"
msgid "Serverless|Sign up for First Look"
msgstr ""
@@ -30465,11 +30904,14 @@ msgstr ""
msgid "Service"
msgstr "Tjeneste"
+msgid "Service Accounts keys are required to authorize GitLab to deploy your Google Cloud project."
+msgstr ""
+
msgid "Service Desk"
msgstr "Tjenestedesk"
msgid "Service Desk allows people to create issues in your GitLab instance without their own user account. It provides a unique email address for end users to create issues in a project. Replies can be sent either through the GitLab interface or by email. End users only see threads through email."
-msgstr ""
+msgstr "Tjenestedesken lar folk opprette saksrapporter i din GitLab-forekomst uten å ha sin egen brukerkonto. Det sørger for en unik e-postadresse for sluttbrukere til å opprette saksrapporter i et prosjekt. Svar kan sendes enten via GitLab-grensesnittet eller via e-post. Sluttbrukere ser kun tråden via e-post."
msgid "Service URL"
msgstr "Tjeneste-URL"
@@ -30537,15 +30979,15 @@ msgstr ""
msgid "Set a password on your account to pull or push via %{protocol}."
msgstr ""
-msgid "Set a template repository for projects in this group"
-msgstr ""
-
msgid "Set access permissions for this token."
msgstr ""
msgid "Set an instance-wide domain that will be available to all clusters when installing Knative."
msgstr ""
+msgid "Set any rate limit to %{code_open}0%{code_close} to disable the limit."
+msgstr ""
+
msgid "Set default and restrict visibility levels. Configure import sources and git access protocol."
msgstr ""
@@ -30553,12 +30995,12 @@ msgid "Set due date"
msgstr "Bestem måldato"
msgid "Set iteration"
-msgstr ""
+msgstr "Velg iterasjon"
msgid "Set limit to 0 to allow any file size."
msgstr ""
-msgid "Set max session time for web terminal."
+msgid "Set limits for web and API requests."
msgstr ""
msgid "Set milestone"
@@ -30567,18 +31009,21 @@ msgstr "Bestem milepæl"
msgid "Set new password"
msgstr "Bestem nytt passord"
-msgid "Set notification email for abuse reports."
+msgid "Set parent epic to an epic"
msgstr ""
-msgid "Set parent epic to an epic"
+msgid "Set per-user rate limits for imports and exports of projects and groups."
msgstr ""
msgid "Set projects and maximum size limits, session duration, user options, and check feature availability for namespace plan."
msgstr ""
-msgid "Set severity"
+msgid "Set rate limits for package registry API requests that supersede the general user and IP rate limits."
msgstr ""
+msgid "Set severity"
+msgstr "Angi alvorlighetsgrad"
+
msgid "Set sign-in restrictions for all users."
msgstr ""
@@ -30594,15 +31039,24 @@ msgstr "Sett målgrenen til %{branch_name}."
msgid "Set the default branch for this project. All merge requests and commits are made against this branch unless you specify a different one."
msgstr ""
+msgid "Set the default expiration time for job artifacts in all projects. Set to %{code_open}0%{code_close} to never expire artifacts by default. If no unit is written, it defaults to seconds. For example, these are all equivalent: %{code_open}3600%{code_close}, %{code_open}60 minutes%{code_close}, or %{code_open}one hour%{code_close}."
+msgstr ""
+
msgid "Set the due date to %{due_date}."
msgstr "Sett måldatoen til %{due_date}."
msgid "Set the iteration to %{iteration_reference}."
+msgstr "Sett iterasjonen til %{iteration_reference}."
+
+msgid "Set the maximum session time for a web terminal."
msgstr ""
msgid "Set the milestone to %{milestone_reference}."
msgstr "Sett milepælen til %{milestone_reference}."
+msgid "Set the per-user rate limit for notes created by web or API requests."
+msgstr ""
+
msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
msgstr ""
@@ -30631,7 +31085,7 @@ msgid "Set up assertions/attributes/claims (email, first_name, last_name) and Na
msgstr ""
msgid "Set up new device"
-msgstr ""
+msgstr "Sett opp en ny enhet"
msgid "Set up new password"
msgstr "Sett opp nytt passord"
@@ -30658,19 +31112,19 @@ msgid "SetPasswordToCloneLink|set a password"
msgstr "bestem et passord"
msgid "SetStatusModal|A busy indicator is shown next to your name and avatar."
-msgstr ""
+msgstr "En «opptatt»-indikator vises ved siden av navnet og avataren din."
msgid "SetStatusModal|Add status emoji"
msgstr "Legg til status-emoji"
msgid "SetStatusModal|Busy"
-msgstr ""
+msgstr "Opptatt"
msgid "SetStatusModal|Clear status"
msgstr "Tøm status"
msgid "SetStatusModal|Clear status after"
-msgstr ""
+msgstr "Fjern statusen etter"
msgid "SetStatusModal|Edit status"
msgstr "Rediger status"
@@ -30688,7 +31142,7 @@ msgid "SetStatusModal|Sorry, we weren't able to set your status. Please try agai
msgstr ""
msgid "SetStatusModal|Status updated"
-msgstr ""
+msgstr "Status oppdatert"
msgid "SetStatusModal|What's your status?"
msgstr "Hva er statusen din?"
@@ -30706,13 +31160,13 @@ msgid "Sets the due date to %{due_date}."
msgstr "Setter måldatoen til %{due_date}."
msgid "Sets the iteration to %{iteration_reference}."
-msgstr ""
+msgstr "Setter iterasjonen til %{iteration_reference}."
msgid "Sets the milestone to %{milestone_reference}."
msgstr "Setter milepælen til %{milestone_reference}."
msgid "Sets the severity"
-msgstr ""
+msgstr "Angir alvorlighetsgraden"
msgid "Sets time estimate to %{time_estimate}."
msgstr ""
@@ -30721,7 +31175,7 @@ msgid "Sets weight to %{weight}."
msgstr "Setter vektleggingen til %{weight}."
msgid "Setting"
-msgstr ""
+msgstr "Innstilling"
msgid "Setting enforced"
msgstr ""
@@ -30745,10 +31199,10 @@ msgid "Severity updated to %{severity}."
msgstr ""
msgid "SeverityWidget|Severity"
-msgstr ""
+msgstr "Alvorlighetsgrad"
msgid "SeverityWidget|Severity: %{severity}"
-msgstr ""
+msgstr "Alvorlighetsgrad: %{severity}"
msgid "SeverityWidget|There was an error while updating severity."
msgstr ""
@@ -30799,11 +31253,14 @@ msgid "Should you ever lose your phone or access to your one time password secre
msgstr ""
msgid "Show Pipeline ID"
-msgstr ""
+msgstr "Vis rørlednings-ID"
msgid "Show Pipeline IID"
msgstr ""
+msgid "Show all %{issuable_type}."
+msgstr ""
+
msgid "Show all activity"
msgstr "Vis all aktivitet"
@@ -30847,7 +31304,7 @@ msgid "Show file contents"
msgstr "Vis filens innhold"
msgid "Show labels"
-msgstr ""
+msgstr "Vis stempler"
msgid "Show latest version"
msgstr "Vis nyeste versjon"
@@ -30855,17 +31312,11 @@ msgstr "Vis nyeste versjon"
msgid "Show list"
msgstr "Vis liste"
-msgid "Show me advanced features"
-msgstr ""
-
msgid "Show me how to add a pipeline"
-msgstr ""
-
-msgid "Show me the basics"
-msgstr ""
+msgstr "Vis meg hvordan man legger til en rørledning"
msgid "Show one file at a time"
-msgstr ""
+msgstr "Vis én fil om gangen"
msgid "Show parent pages"
msgstr "Vis overordnede sider"
@@ -30874,13 +31325,13 @@ msgid "Show parent subgroups"
msgstr "Vis overordnede undergrupper"
msgid "Show the Closed list"
-msgstr ""
+msgstr "Vis «Lukket»-listen"
msgid "Show the Open list"
-msgstr ""
+msgstr "Vis «Åpne»-listen"
msgid "Show whitespace changes"
-msgstr ""
+msgstr "Vis tomromsendringer"
msgid "Showing %d event"
msgid_plural "Showing %d events"
@@ -30888,7 +31339,7 @@ msgstr[0] "Viser %d hendelse"
msgstr[1] "Viser %d hendelser"
msgid "Showing %{conflict} between %{sourceBranch} and %{targetBranch}"
-msgstr ""
+msgstr "Viser %{conflict} mellom %{sourceBranch} og %{targetBranch}"
msgid "Showing %{count} of %{total} projects"
msgstr "Viser %{count} av %{total} prosjekter"
@@ -30902,17 +31353,17 @@ msgid "Showing %{limit} of %{total_count} issues. "
msgstr "Viser %{limit} av %{total_count} saker. "
msgid "Showing %{pageSize} of %{total} %{issuableType}"
-msgstr ""
-
-msgid "Showing %{pageSize} of %{total} issues"
-msgstr "Viser %{pageSize} av %{total} saker"
+msgstr "Viser %{pageSize} av %{total} %{issuableType}"
msgid "Showing all epics"
-msgstr ""
+msgstr "Viser alle eposer"
msgid "Showing all issues"
msgstr "Viser alle saker"
+msgid "Showing data for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
+msgstr ""
+
msgid "Showing data for workflow items created in this date range. Date range cannot exceed %{maxDateRange} days."
msgstr ""
@@ -30926,13 +31377,13 @@ msgid "Showing latest version"
msgstr "Viser den nyeste versjonen"
msgid "Showing version #%{versionNumber}"
-msgstr ""
+msgstr "Viser versjon â„–%{versionNumber}"
msgid "Side-by-side"
msgstr "Side-ved-side"
msgid "Sidebar|%{name}: %{value}"
-msgstr ""
+msgstr "%{name}: %{value}"
msgid "Sidebar|Assign health status"
msgstr "Tildel helsestatus"
@@ -30952,6 +31403,15 @@ msgstr ""
msgid "Sidebar|Weight"
msgstr "Vektlegging"
+msgid "Sidekiq job compression threshold (bytes)"
+msgstr ""
+
+msgid "Sidekiq job size limit (bytes)"
+msgstr ""
+
+msgid "Sidekiq job size limits"
+msgstr ""
+
msgid "Sign in"
msgstr "Logg på"
@@ -30962,7 +31422,7 @@ msgid "Sign in as a user with the matching email address, add the email to this
msgstr ""
msgid "Sign in preview"
-msgstr ""
+msgstr "Forhåndsvisning av pålogging"
msgid "Sign in to \"%{group_name}\""
msgstr "Logg inn hos «%{group_name}»"
@@ -30977,7 +31437,7 @@ msgid "Sign in via 2FA code"
msgstr "Logg på med 2FA-kode"
msgid "Sign in with"
-msgstr ""
+msgstr "Logg på med"
msgid "Sign in with Single Sign-On"
msgstr "Logg på med enkelt pålogging"
@@ -30986,13 +31446,13 @@ msgid "Sign in with smart card"
msgstr "Logg på med smartkort"
msgid "Sign in/Sign up pages"
-msgstr ""
+msgstr "PÃ¥loggings-/Registreringssider"
msgid "Sign out"
msgstr "Logg av"
msgid "Sign out & Register"
-msgstr ""
+msgstr "Logg av og registrer"
msgid "Sign up"
msgstr "Registrer deg"
@@ -31004,16 +31464,16 @@ msgid "Sign-in and Help page"
msgstr ""
msgid "Sign-in count:"
-msgstr ""
+msgstr "Antall pålogginger:"
msgid "Sign-in page"
-msgstr ""
+msgstr "PÃ¥loggingsside"
msgid "Sign-in restrictions"
msgstr "PÃ¥loggingsbegrensninger"
msgid "Sign-in text"
-msgstr ""
+msgstr "PÃ¥loggingstekst"
msgid "Sign-out page URL"
msgstr ""
@@ -31049,7 +31509,7 @@ msgid "Signed in to GitLab as %{user_link}"
msgstr ""
msgid "Signed in with %{authentication} authentication"
-msgstr ""
+msgstr "Logget på med %{authentication}-autentisering"
msgid "Signing in using %{label} has been disabled"
msgstr ""
@@ -31072,11 +31532,14 @@ msgstr ""
msgid "Site profile not found for given parameters"
msgstr ""
+msgid "Sites"
+msgstr ""
+
msgid "Size"
msgstr "Størrelse"
msgid "Size Limits"
-msgstr ""
+msgstr "Størrelsesgrenser"
msgid "Size limit per repository (MB)"
msgstr "Størrelsesgrense per kodelager (MB)"
@@ -31091,7 +31554,7 @@ msgid "Skipped deployment to"
msgstr ""
msgid "Skype:"
-msgstr ""
+msgstr "Skype:"
msgid "Slack application"
msgstr "Slack-applikasjon"
@@ -31102,19 +31565,22 @@ msgstr ""
msgid "SlackIntegration|Sends notifications about project events to Slack channels."
msgstr ""
-msgid "SlackService|2. Paste the %{strong_open}Token%{strong_close} into the field below"
+msgid "SlackService|1. %{slash_command_link_start}Add a slash command%{slash_command_link_end} in your Slack team using this information:"
msgstr ""
-msgid "SlackService|3. Select the %{strong_open}Active%{strong_close} checkbox, press %{strong_open}Save changes%{strong_close} and start using GitLab inside Slack!"
+msgid "SlackService|2. Paste the token from Slack in the %{strong_open}Token%{strong_close} field below."
msgstr ""
-msgid "SlackService|Fill in the word that works best for your team."
+msgid "SlackService|3. Select the %{strong_open}Active%{strong_close} checkbox, select %{strong_open}Save changes%{strong_close}, and start using slash commands in Slack!"
msgstr ""
-msgid "SlackService|See list of available commands in Slack after setting up this service, by entering"
+msgid "SlackService|After setup, get a list of available Slack slash commands by entering"
msgstr ""
-msgid "SlackService|This service allows users to perform common operations on this project by entering slash commands in Slack."
+msgid "SlackService|Fill in the word that works best for your team."
+msgstr ""
+
+msgid "SlackService|Perform common operations in this project by entering slash commands in Slack."
msgstr ""
msgid "Slice multiplier"
@@ -31151,7 +31617,7 @@ msgid "SnippetsEmptyState|There are no snippets to show."
msgstr ""
msgid "Snippets|Add another file %{num}/%{total}"
-msgstr ""
+msgstr "Legg til en annen fil %{num}/%{total}"
msgid "Snippets|Delete file"
msgstr "Slett fil"
@@ -31175,12 +31641,12 @@ msgid "Solution"
msgstr "Løsning"
msgid "Some changes are not shown"
-msgstr ""
+msgstr "Noen endringer vises ikke"
msgid "Some child epics may be hidden due to applied filters"
msgstr ""
-msgid "Some common domains are not allowed. %{read_more_link}."
+msgid "Some common domains are not allowed. %{learn_more_link}."
msgstr ""
msgid "Some of the designs you tried uploading did not change:"
@@ -31202,7 +31668,7 @@ msgid "Someone, hopefully you, has requested to reset the password for your GitL
msgstr ""
msgid "Something went wrong"
-msgstr ""
+msgstr "Noe gikk galt"
msgid "Something went wrong on our end"
msgstr "Noe gikk galt i vår ende"
@@ -31264,9 +31730,6 @@ msgstr "Noe gikk galt under redigering av kommentaren din. Prøv igjen senere."
msgid "Something went wrong while exporting requirements"
msgstr ""
-msgid "Something went wrong while fetching %{listType} list"
-msgstr "Noe gikk feil under henting av %{listType} listen"
-
msgid "Something went wrong while fetching branches"
msgstr ""
@@ -31277,7 +31740,7 @@ msgid "Something went wrong while fetching description changes. Please try again
msgstr "Noe gikk galt under innhenting av beskrivelsesendringer. Vennligst prøv igjen."
msgid "Something went wrong while fetching details"
-msgstr ""
+msgstr "Noe gikk galt under innhenting av detaljer"
msgid "Something went wrong while fetching group member contributions"
msgstr "Noe gikk feil under henting av gruppemedlemmenes bidrag"
@@ -31321,15 +31784,9 @@ msgstr "Noe gikk galt under redigering av innsetting av bildet ditt. Prøv igjen
msgid "Something went wrong while merging this merge request. Please try again."
msgstr ""
-msgid "Something went wrong while moving issues."
-msgstr "Noe gikk galt under flytting av saker."
-
msgid "Something went wrong while obtaining the Let's Encrypt certificate."
msgstr ""
-msgid "Something went wrong while performing the action."
-msgstr "Noe gikk galt under utføring av handlingen."
-
msgid "Something went wrong while promoting the issue to an epic. Please try again."
msgstr ""
@@ -31427,16 +31884,16 @@ msgid "Sort direction: Descending"
msgstr "Sorter retning: synkende"
msgid "SortOptions|Blocking"
-msgstr ""
+msgstr "Blokkering"
msgid "SortOptions|Closed date"
-msgstr ""
+msgstr "Lukkingsdato"
msgid "SortOptions|Closed earlier"
-msgstr ""
+msgstr "Lukket tidligere"
msgid "SortOptions|Closed recently"
-msgstr ""
+msgstr "Lukket nylig"
msgid "SortOptions|Created date"
msgstr "Opprettelsesdato"
@@ -31454,7 +31911,7 @@ msgid "SortOptions|Expired date"
msgstr "Utløpsdato"
msgid "SortOptions|Label priority"
-msgstr "Etikett prioritet"
+msgstr "Etikettprioritet"
msgid "SortOptions|Largest group"
msgstr "Største gruppe"
@@ -31478,16 +31935,16 @@ msgid "SortOptions|Less weight"
msgstr "Mindre vektlegging"
msgid "SortOptions|Manual"
-msgstr ""
+msgstr "Manuell"
msgid "SortOptions|Merged date"
-msgstr ""
+msgstr "Innflettingsdato"
msgid "SortOptions|Merged earlier"
-msgstr ""
+msgstr "Slått sammen tidligere"
msgid "SortOptions|Merged recently"
-msgstr ""
+msgstr "Nylig sammenslått"
msgid "SortOptions|Milestone due date"
msgstr ""
@@ -31517,19 +31974,19 @@ msgid "SortOptions|Name, descending"
msgstr "Navn, synkende"
msgid "SortOptions|Oldest created"
-msgstr ""
+msgstr "Eldste opprettede"
msgid "SortOptions|Oldest last activity"
-msgstr ""
+msgstr "Eldste tidspunkt for nyligst aktivitet"
msgid "SortOptions|Oldest sign in"
-msgstr ""
+msgstr "Tidligst påloggede"
msgid "SortOptions|Oldest starred"
-msgstr ""
+msgstr "Eldste stjernemerkede"
msgid "SortOptions|Oldest updated"
-msgstr ""
+msgstr "Eldste oppdaterte"
msgid "SortOptions|Popularity"
msgstr "Popularitet"
@@ -31547,7 +32004,7 @@ msgid "SortOptions|Recent sign in"
msgstr "Nyligst logget inn"
msgid "SortOptions|Recently starred"
-msgstr ""
+msgstr "Nylig stjernemerket"
msgid "SortOptions|Size"
msgstr "Størrelse"
@@ -31559,7 +32016,7 @@ msgid "SortOptions|Sort direction"
msgstr "Sorteringsretning"
msgid "SortOptions|Stars"
-msgstr ""
+msgstr "Stjerner"
msgid "SortOptions|Start date"
msgstr "Startdato"
@@ -31571,7 +32028,7 @@ msgid "SortOptions|Start soon"
msgstr "Starter snart"
msgid "SortOptions|Title"
-msgstr ""
+msgstr "Tittel"
msgid "SortOptions|Type"
msgstr "Type"
@@ -31589,28 +32046,28 @@ msgid "Source (branch or tag)"
msgstr "Kilde (branch eller tag)"
msgid "Source Branch"
-msgstr ""
+msgstr "Kildegren"
msgid "Source Editor instance is required to set up an extension."
msgstr ""
msgid "Source IP"
-msgstr ""
+msgstr "Kilde-IP"
msgid "Source branch"
-msgstr ""
+msgstr "Kildegren"
msgid "Source branch: %{source_branch_open}%{source_branch}%{source_branch_close}"
-msgstr ""
+msgstr "Kildegren: %{source_branch_open}%{source_branch}%{source_branch_close}"
msgid "Source code (%{fileExtension})"
-msgstr ""
+msgstr "Kildekode (%{fileExtension})"
msgid "Source is not available"
msgstr "Kilden er ikke tilgjengelig"
msgid "Source project cannot be found."
-msgstr ""
+msgstr "Kildeprosjektet kunne ikke bli funnet."
msgid "Sourcegraph"
msgstr "Sourcegraph"
@@ -31631,7 +32088,7 @@ msgid "SourcegraphAdmin|If checked, only public projects will have code intellig
msgstr ""
msgid "SourcegraphAdmin|More information"
-msgstr ""
+msgstr "Mer informasjon"
msgid "SourcegraphAdmin|Save changes"
msgstr "Lagre endringer"
@@ -31643,28 +32100,31 @@ msgid "SourcegraphAdmin|e.g. https://sourcegraph.example.com"
msgstr "f.eks. https://sourcegraph.example.com"
msgid "SourcegraphPreferences|This feature is experimental and currently limited to certain projects."
-msgstr ""
+msgstr "Denne funksjonen er eksperimentell og er for tiden begrenset til visse prosjekter."
msgid "SourcegraphPreferences|This feature is experimental and limited to public projects."
-msgstr ""
+msgstr "Denne funksjonen er eksperimentell og er begrenset til offentlige prosjekter."
msgid "SourcegraphPreferences|This feature is experimental."
-msgstr ""
+msgstr "Denne funksjonen er eksperimentell."
msgid "SourcegraphPreferences|Uses %{linkStart}Sourcegraph.com%{linkEnd}."
-msgstr ""
+msgstr "Benytter %{linkStart}Sourcegraph.com%{linkEnd}."
msgid "SourcegraphPreferences|Uses a custom %{linkStart}Sourcegraph instance%{linkEnd}."
+msgstr "Bruker en tilpasset %{linkStart}Sourcegraph-instans%{linkEnd}."
+
+msgid "Spam Check"
msgstr ""
-msgid "Spam Check API Key"
+msgid "Spam Check API key"
msgstr ""
msgid "Spam Logs"
msgstr "Spam-loggbøker"
msgid "Spam and Anti-bot Protection"
-msgstr ""
+msgstr "Spam- og anti-bot-beskyttelse"
msgid "Spam log successfully submitted as ham."
msgstr ""
@@ -31675,7 +32135,7 @@ msgstr ""
msgid "Specified URL cannot be used: \"%{reason}\""
msgstr ""
-msgid "Specify an e-mail address regex pattern to identify default internal users."
+msgid "Specify an email address regex pattern to identify default internal users."
msgstr ""
msgid "Speed up your pipelines with Needs relationships"
@@ -31751,7 +32211,7 @@ msgid "Start a Free Ultimate Trial"
msgstr ""
msgid "Start a new discussion…"
-msgstr ""
+msgstr "Start en ny diskusjon …"
msgid "Start a new merge request"
msgstr "Begynn en ny fletteforespørsel"
@@ -31814,7 +32274,7 @@ msgid "Starting..."
msgstr "Starter …"
msgid "Starts"
-msgstr ""
+msgstr "Starter"
msgid "Starts %{startsIn}"
msgstr "Starter %{startsIn}"
@@ -31823,10 +32283,10 @@ msgid "Starts at (UTC)"
msgstr "Starter (UTC)"
msgid "Starts on"
-msgstr ""
+msgstr "Starter den"
msgid "Starts: %{startsAt}"
-msgstr ""
+msgstr "Starter: %{startsAt}"
msgid "State your message to activate"
msgstr ""
@@ -31850,13 +32310,13 @@ msgid "StaticSiteEditor|An error occurred while submitting your changes."
msgstr ""
msgid "StaticSiteEditor|Automatic formatting changes"
-msgstr ""
+msgstr "Automatiske formateringsendringer"
msgid "StaticSiteEditor|Branch could not be created."
-msgstr ""
+msgstr "Grenen kunne ikke opprettes."
msgid "StaticSiteEditor|Copy update"
-msgstr ""
+msgstr "Kopier oppdatering"
msgid "StaticSiteEditor|Could not commit the content changes."
msgstr ""
@@ -31868,7 +32328,7 @@ msgid "StaticSiteEditor|Creating your merge request"
msgstr ""
msgid "StaticSiteEditor|Incompatible file content"
-msgstr ""
+msgstr "Inkompatibelt filinnhold"
msgid "StaticSiteEditor|Markdown formatting preferences introduced by the Static Site Editor"
msgstr ""
@@ -31886,7 +32346,7 @@ msgid "StaticSiteEditor|To see your changes live you will need to do the followi
msgstr ""
msgid "StaticSiteEditor|Update %{sourcePath} file"
-msgstr ""
+msgstr "Oppdater «%{sourcePath}»-filen"
msgid "StaticSiteEditor|View documentation"
msgstr "Vis dokumentasjon"
@@ -31913,16 +32373,16 @@ msgid "Status: %{title}"
msgstr "Status: %{title}"
msgid "StatusCheck|%{pending} pending"
-msgstr ""
+msgstr "%{pending} står i kø"
msgid "StatusCheck|API to check"
-msgstr ""
+msgstr "API som skal sjekkes"
msgid "StatusCheck|Add status check"
-msgstr ""
+msgstr "Legg til statussjekk"
msgid "StatusCheck|All passed"
-msgstr ""
+msgstr "Alle ble bestått"
msgid "StatusCheck|An error occurred deleting the %{name} status check."
msgstr ""
@@ -31930,7 +32390,7 @@ msgstr ""
msgid "StatusCheck|An error occurred fetching the status checks."
msgstr ""
-msgid "StatusCheck|Apply this status check to any branch or a specific protected branch."
+msgid "StatusCheck|Apply this status check to all branches or a specific protected branch."
msgstr ""
msgid "StatusCheck|Check for a status response in Merge Requests. Failures do not block merges. %{link_start}Learn more%{link_end}."
@@ -31943,7 +32403,7 @@ msgid "StatusCheck|External API is already in use by another status check."
msgstr ""
msgid "StatusCheck|Failed to load status checks."
-msgstr ""
+msgstr "Mislyktes i å laste inn statussjekker."
msgid "StatusCheck|Invoke an external API as part of the pipeline process."
msgstr ""
@@ -31958,16 +32418,16 @@ msgid "StatusCheck|Remove status check?"
msgstr ""
msgid "StatusCheck|Service name"
-msgstr ""
+msgstr "Tjenestenavn"
msgid "StatusCheck|Status checks"
-msgstr ""
+msgstr "Status-sjekkinger"
msgid "StatusCheck|Status to check"
-msgstr ""
+msgstr "Statusen som skal sjekkes"
msgid "StatusCheck|Target branch"
-msgstr ""
+msgstr "MÃ¥lgren"
msgid "StatusCheck|Update status check"
msgstr ""
@@ -31979,7 +32439,7 @@ msgid "StatusCheck|You are about to remove the %{name} status check."
msgstr ""
msgid "StatusPage|AWS %{docsLink}"
-msgstr ""
+msgstr "AWS %{docsLink}"
msgid "StatusPage|AWS Secret access key"
msgstr "AWS hemmelig tilgangsnøkkel"
@@ -32006,7 +32466,7 @@ msgid "StatusPage|Status page"
msgstr "Statusside"
msgid "StatusPage|Status page URL"
-msgstr ""
+msgstr "Statusside-URL"
msgid "StatusPage|To publish incidents to an external status page, GitLab stores a JSON file in your Amazon S3 account at a location that your external status page service can access. Make sure to also set up %{docsLink}"
msgstr ""
@@ -32021,16 +32481,16 @@ msgid "Stay updated about the performance and health of your environment by conf
msgstr ""
msgid "Step 1."
-msgstr ""
+msgstr "Trinn 1."
msgid "Step 2."
-msgstr ""
+msgstr "Trinn 2."
msgid "Step 3."
-msgstr ""
+msgstr "Trinn 3."
msgid "Step 4."
-msgstr ""
+msgstr "Trinn 4."
msgid "Stop Terminal"
msgstr "Stopp terminal"
@@ -32060,16 +32520,16 @@ msgid "StorageSize|Unknown"
msgstr "Ukjent"
msgid "Strikethrough"
-msgstr ""
+msgstr "Gjennomstrek"
msgid "Subgroup information"
-msgstr ""
+msgstr "Undergruppe-informasjon"
msgid "Subgroup milestone"
-msgstr ""
+msgstr "Undergruppe-milepæl"
msgid "Subgroup navigation"
-msgstr ""
+msgstr "Undergruppe-navigasjon"
msgid "SubgroupCreationLevel|Allowed to create subgroups"
msgstr ""
@@ -32126,7 +32586,7 @@ msgid "Submit the current review."
msgstr "Send inn nåværende vurdering."
msgid "Submit your changes"
-msgstr ""
+msgstr "Send inn endringene dine"
msgid "Submitted as ham"
msgstr ""
@@ -32162,7 +32622,7 @@ msgid "Subscription"
msgstr "Abonnement"
msgid "Subscription History"
-msgstr ""
+msgstr "Abonnementshistorikk"
msgid "Subscription deletion failed."
msgstr "Abonnementsslettingen mislyktes."
@@ -32180,7 +32640,7 @@ msgid "Subscription successfully deleted."
msgstr "Abonnementet ble vellykket slettet."
msgid "SubscriptionTable|Add seats"
-msgstr ""
+msgstr "Legg til seter"
msgid "SubscriptionTable|An error occurred while loading the subscription details."
msgstr ""
@@ -32198,34 +32658,34 @@ msgid "SubscriptionTable|Last invoice"
msgstr "Forrige fakturering"
msgid "SubscriptionTable|Loading subscriptions"
-msgstr ""
+msgstr "Laster inn abonnementer"
msgid "SubscriptionTable|Manage"
msgstr "Behandle"
msgid "SubscriptionTable|Max seats used"
-msgstr ""
+msgstr "Maks antall seter brukt"
msgid "SubscriptionTable|Next invoice"
msgstr "Neste fakturering"
msgid "SubscriptionTable|Refresh Seats"
-msgstr ""
+msgstr "Oppfrisk seter"
msgid "SubscriptionTable|Renew"
-msgstr ""
+msgstr "Forny"
msgid "SubscriptionTable|Seats currently in use"
-msgstr ""
+msgstr "Seter som brukes for øyeblikket"
msgid "SubscriptionTable|Seats in subscription"
-msgstr ""
+msgstr "Seter i abonnementet"
msgid "SubscriptionTable|Seats owed"
-msgstr ""
+msgstr "Seter som eies"
msgid "SubscriptionTable|See usage"
-msgstr ""
+msgstr "Se benyttelse"
msgid "SubscriptionTable|Something went wrong trying to refresh seats"
msgstr ""
@@ -32252,7 +32712,7 @@ msgid "SubscriptionTable|Trial"
msgstr "Prøveperiode"
msgid "SubscriptionTable|Trial end date"
-msgstr ""
+msgstr "Prøveperiodens sluttdato"
msgid "SubscriptionTable|Trial start date"
msgstr ""
@@ -32269,6 +32729,9 @@ msgstr ""
msgid "Subscriptions"
msgstr "Abonnementer"
+msgid "Subscription|Your subscription for %{strong}%{namespace_name}%{strong_close} has expired and you are now on %{pricing_link_start}the GitLab Free tier%{pricing_link_end}. Don't worry, your data is safe. Get in touch with our support team (%{support_email}). They'll gladly help with your subscription renewal."
+msgstr ""
+
msgid "Subtracted"
msgstr "Trukket fra"
@@ -32288,7 +32751,7 @@ msgid "Successfully approved"
msgstr "Vellykket godkjent"
msgid "Successfully banned"
-msgstr ""
+msgstr "Vellykket bannlyst"
msgid "Successfully blocked"
msgstr "Vellykket blokkert"
@@ -32306,7 +32769,7 @@ msgid "Successfully deleted WebAuthn device."
msgstr ""
msgid "Successfully removed email."
-msgstr ""
+msgstr "Lyktes i å fjerne E-posten."
msgid "Successfully scheduled a pipeline to run. Go to the %{pipelines_link_start}Pipelines page%{pipelines_link_end} for details."
msgstr ""
@@ -32339,19 +32802,19 @@ msgid "SuggestedColors|Aztec Gold"
msgstr ""
msgid "SuggestedColors|Blue"
-msgstr ""
+msgstr "Blå"
msgid "SuggestedColors|Blue-gray"
-msgstr ""
+msgstr "Blå-grå"
msgid "SuggestedColors|Carrot orange"
-msgstr ""
+msgstr "Gulrotsoransje"
msgid "SuggestedColors|Champagne"
msgstr ""
msgid "SuggestedColors|Charcoal grey"
-msgstr ""
+msgstr "Koksgrå"
msgid "SuggestedColors|Crimson"
msgstr ""
@@ -32369,34 +32832,34 @@ msgid "SuggestedColors|Dark violet"
msgstr ""
msgid "SuggestedColors|Deep violet"
-msgstr ""
+msgstr "Dyp fiolett"
msgid "SuggestedColors|Gray"
-msgstr ""
+msgstr "Grå"
msgid "SuggestedColors|Green screen"
msgstr ""
msgid "SuggestedColors|Green-cyan"
-msgstr ""
+msgstr "Grønn-cyan"
msgid "SuggestedColors|Lavendar"
-msgstr ""
+msgstr "Lavendel"
msgid "SuggestedColors|Magenta-pink"
-msgstr ""
+msgstr "Magenta-rosa"
msgid "SuggestedColors|Medium sea green"
msgstr ""
msgid "SuggestedColors|Red"
-msgstr ""
+msgstr "Rød"
msgid "SuggestedColors|Rose red"
-msgstr ""
+msgstr "Rosenrød"
msgid "SuggestedColors|Titanium yellow"
-msgstr ""
+msgstr "Titanium-gul"
msgid "Suggestion is not applicable as the suggestion was not found."
msgstr ""
@@ -32420,52 +32883,52 @@ msgid "Summary"
msgstr "Sammendrag"
msgid "Summary / Note"
-msgstr ""
+msgstr "Oppsummering / Notat"
msgid "Sunday"
msgstr "Søndag"
msgid "SuperSonics|Activate"
-msgstr ""
+msgstr "Aktiver"
msgid "SuperSonics|Activate cloud license"
-msgstr ""
+msgstr "Aktiver skylisens"
msgid "SuperSonics|Activate subscription"
-msgstr ""
+msgstr "Aktiver abonnement"
msgid "SuperSonics|Activated on"
-msgstr ""
+msgstr "Aktivert den"
msgid "SuperSonics|Activation code"
-msgstr ""
+msgstr "Aktiveringskode"
msgid "SuperSonics|An error occurred while activating your subscription."
-msgstr ""
+msgstr "Det oppstod en feil under aktivering av abonnementet ditt."
msgid "SuperSonics|Billable users"
-msgstr ""
+msgstr "Fakturerbare brukere"
msgid "SuperSonics|Buy subscription"
-msgstr ""
+msgstr "Kjøp abonnement"
msgid "SuperSonics|Cloud license"
-msgstr ""
+msgstr "Skylisens"
msgid "SuperSonics|Cloud licensing"
-msgstr ""
+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|Expires on"
-msgstr ""
+msgstr "Utløper den"
msgid "SuperSonics|Export license usage file"
msgstr ""
msgid "SuperSonics|Free trial"
-msgstr ""
+msgstr "Gratis prøveperiode"
msgid "SuperSonics|Get help for the most common connectivity issues by %{linkStart}troubleshooting the activation code%{linkEnd}."
msgstr ""
@@ -32474,52 +32937,55 @@ msgid "SuperSonics|I agree that my use of the GitLab Software is subject to the
msgstr ""
msgid "SuperSonics|ID"
-msgstr ""
+msgstr "ID"
msgid "SuperSonics|Last Sync"
-msgstr ""
+msgstr "Nyligste synkronisering"
msgid "SuperSonics|Learn how to %{linkStart}activate your subscription%{linkEnd}."
msgstr ""
msgid "SuperSonics|Licensed to"
-msgstr ""
+msgstr "Lisensiert til"
msgid "SuperSonics|Manage"
-msgstr ""
+msgstr "Behandle"
msgid "SuperSonics|Maximum users"
-msgstr ""
+msgstr "Maks antall brukere"
msgid "SuperSonics|Paste your activation code"
-msgstr ""
+msgstr "Lim inn aktiveringskoden din"
msgid "SuperSonics|Plan"
+msgstr "Plan"
+
+msgid "SuperSonics|Please agree to the Subscription Agreement"
msgstr ""
msgid "SuperSonics|Ready to get started? A GitLab plan is ideal for scaling organizations and for multi team usage."
msgstr ""
msgid "SuperSonics|Renews"
-msgstr ""
+msgstr "Fornyer"
msgid "SuperSonics|Seats"
-msgstr ""
+msgstr "Seter"
msgid "SuperSonics|Start free trial"
-msgstr ""
+msgstr "Begynn gratis prøveperiode"
msgid "SuperSonics|Started"
-msgstr ""
+msgstr "Startet"
msgid "SuperSonics|Subscription"
-msgstr ""
+msgstr "Abonnement"
msgid "SuperSonics|Subscription details"
-msgstr ""
+msgstr "Abonnementsdetaljer"
msgid "SuperSonics|Sync subscription details"
-msgstr ""
+msgstr "Synkroniser abonnementsdetaljer"
msgid "SuperSonics|Sync subscription request."
msgstr ""
@@ -32527,9 +32993,12 @@ msgstr ""
msgid "SuperSonics|The activation code is not valid. Please make sure to copy it exactly from the Customers Portal or confirmation email. Learn more about %{linkStart}activating your subscription%{linkEnd}."
msgstr ""
-msgid "SuperSonics|There is a connectivity issue."
+msgid "SuperSonics|The activation code should be a 24-character alphanumeric string"
msgstr ""
+msgid "SuperSonics|There is a connectivity issue."
+msgstr "Det er et tilkoblingsproblem."
+
msgid "SuperSonics|This is the highest peak of users on your installation since the license started."
msgstr ""
@@ -32540,13 +33009,13 @@ msgid "SuperSonics|To activate your subscription, connect to GitLab servers thro
msgstr ""
msgid "SuperSonics|Type"
-msgstr ""
+msgstr "Type"
msgid "SuperSonics|Upload a license file"
-msgstr ""
+msgstr "Last opp en lisensfil"
msgid "SuperSonics|Users in subscription"
-msgstr ""
+msgstr "Brukere i abonnementet"
msgid "SuperSonics|Users over subscription"
msgstr ""
@@ -32555,7 +33024,7 @@ msgid "SuperSonics|Users with a Guest role or those who don't belong to a Projec
msgstr ""
msgid "SuperSonics|Valid From"
-msgstr ""
+msgstr "Gyldig fra"
msgid "SuperSonics|You can learn more about %{activationLinkStart}activating your subscription%{activationLinkEnd}. If you need further assistance, please %{supportLinkStart}contact GitLab Support%{supportLinkEnd}."
msgstr ""
@@ -32569,12 +33038,18 @@ msgstr ""
msgid "SuperSonics|You do not have an active subscription"
msgstr ""
+msgid "SuperSonics|You have successfully added a license that activates on %{date}. Please see the subscription history table below for more details."
+msgstr ""
+
msgid "SuperSonics|You'll be charged for %{trueUpLinkStart}users over license%{trueUpLinkEnd} on a quarterly or annual basis, depending on the terms of your agreement."
msgstr ""
-msgid "SuperSonics|Your subscription"
+msgid "SuperSonics|Your future dated license was successfully added"
msgstr ""
+msgid "SuperSonics|Your subscription"
+msgstr "Abonnementet ditt"
+
msgid "SuperSonics|Your subscription details will sync shortly."
msgstr ""
@@ -32594,10 +33069,10 @@ msgid "Survey Response"
msgstr "Undersøkelsessvar"
msgid "Switch branch"
-msgstr ""
+msgstr "Bytt gren"
msgid "Switch branch/tag"
-msgstr ""
+msgstr "Bytt gren/etikett"
msgid "Switch to GitLab Next"
msgstr ""
@@ -32609,28 +33084,28 @@ msgid "Symbolic link"
msgstr "Symbolsk lenke"
msgid "Sync LDAP"
-msgstr ""
+msgstr "Synkroniser LDAP"
msgid "Sync now"
-msgstr ""
+msgstr "Synkroniser nå"
msgid "Synced"
msgstr "Synkronisert"
msgid "Synchronization settings"
-msgstr ""
+msgstr "Synkroniseringsinnstillinger"
msgid "Synchronize LDAP"
-msgstr ""
+msgstr "Synkroniser LDAP"
msgid "Syncing…"
msgstr "Synkroniserer …"
msgid "Syntax is correct."
-msgstr ""
+msgstr "Syntaksen er korrekt."
msgid "Syntax is incorrect."
-msgstr ""
+msgstr "Syntaksen er feil."
msgid "System"
msgstr "System"
@@ -32651,7 +33126,7 @@ msgid "System OAuth applications don't belong to any user and can only be manage
msgstr ""
msgid "System default (%{default})"
-msgstr ""
+msgstr "Systemstandard (%{default})"
msgid "System header and footer"
msgstr ""
@@ -32669,13 +33144,13 @@ msgid "System metrics (Kubernetes)"
msgstr "Systemmåltall (Kubernetes)"
msgid "System output"
-msgstr ""
+msgstr "System-utdata"
msgid "Table of Contents"
msgstr "Innholdsfortegnelse"
msgid "Table of contents"
-msgstr ""
+msgstr "Innholdsfortegnelse"
msgid "Tag"
msgstr "Etikett"
@@ -32696,7 +33171,7 @@ msgid "Tag this commit."
msgstr "Gi denne commiten en etikett."
msgid "Tag:"
-msgstr ""
+msgstr "Etikett:"
msgid "Tagged this commit to %{tag_name} with \"%{message}\"."
msgstr ""
@@ -32741,13 +33216,13 @@ msgid "TagsPage|Delete tag"
msgstr "Slett tag"
msgid "TagsPage|Deleting the %{tag_name} tag cannot be undone. Are you sure?"
-msgstr ""
+msgstr "Å slette «%{tag_name}»-etiketten kan ikke angres på. Er du sikker?"
msgid "TagsPage|Edit release notes"
msgstr "Rediger utgivelsesbeskrivelser"
msgid "TagsPage|Existing branch name, tag, or commit SHA"
-msgstr ""
+msgstr "Eksisterende greinnavn, etikett, eller commit-SHA"
msgid "TagsPage|Filter by tag name"
msgstr "Filtrer etter etikettnavn"
@@ -32789,13 +33264,13 @@ msgid "TagsPage|protected"
msgstr "beskyttet"
msgid "Target Branch"
-msgstr "MÃ¥l-branch"
+msgstr "MÃ¥lgren"
msgid "Target Path"
msgstr "MÃ¥lsti"
msgid "Target branch"
-msgstr "MÃ¥l-branch"
+msgstr "MÃ¥lgren"
msgid "Target-Branch"
msgstr "MÃ¥lgren"
@@ -32824,7 +33299,7 @@ msgstr "Mal"
msgid "Template to append to all Service Desk issues"
msgstr ""
-msgid "TemplateRepository|Select a repository to make its templates available to all projects. %{link_start}What should the repository contain?%{link_end} "
+msgid "TemplateRepository|Create common files more quickly, and standardize their format."
msgstr ""
msgid "Templates"
@@ -32861,7 +33336,7 @@ msgid "Terms of Service and Privacy Policy"
msgstr "Bruksvilkår og personvern"
msgid "Terraform"
-msgstr ""
+msgstr "Terraform"
msgid "TerraformBanner|Learn more about GitLab's Backend State"
msgstr ""
@@ -32873,7 +33348,7 @@ msgid "TerraformBanner|Using Terraform? Try the GitLab Managed Terraform State"
msgstr ""
msgid "Terraform|%{name} successfully removed"
-msgstr ""
+msgstr "%{name} ble vellykket fjernet"
msgid "Terraform|%{number} Terraform report failed to generate"
msgid_plural "Terraform|%{number} Terraform reports failed to generate"
@@ -32886,7 +33361,7 @@ msgstr[0] ""
msgstr[1] ""
msgid "Terraform|%{user} updated %{timeAgo}"
-msgstr ""
+msgstr "%{user} oppdaterte for %{timeAgo}"
msgid "Terraform|A report failed to generate."
msgstr ""
@@ -32895,7 +33370,7 @@ msgid "Terraform|A report was generated in your pipelines."
msgstr ""
msgid "Terraform|Actions"
-msgstr ""
+msgstr "Handlinger"
msgid "Terraform|An error occurred while changing the state file"
msgstr ""
@@ -32907,61 +33382,61 @@ msgid "Terraform|Are you sure you want to remove the Terraform State %{name}?"
msgstr ""
msgid "Terraform|Cancel"
-msgstr ""
+msgstr "Avbryt"
msgid "Terraform|Copy Terraform init command"
msgstr ""
msgid "Terraform|Details"
-msgstr ""
+msgstr "Detaljer"
msgid "Terraform|Download JSON"
-msgstr ""
+msgstr "Last ned JSON"
msgid "Terraform|Generating the report caused an error."
msgstr "Genereringen av prosjektet forårsaket en feil."
msgid "Terraform|Get started with Terraform"
-msgstr ""
+msgstr "Kom i gang med Terraform"
msgid "Terraform|How to use GitLab-managed Terraform State?"
msgstr ""
msgid "Terraform|Job status"
-msgstr ""
+msgstr "Jobbstatus"
msgid "Terraform|Lock"
-msgstr ""
+msgstr "LÃ¥s"
msgid "Terraform|Locked"
-msgstr ""
+msgstr "LÃ¥st"
msgid "Terraform|Locked by %{user} %{timeAgo}"
-msgstr ""
+msgstr "LÃ¥st av %{user} for %{timeAgo}"
msgid "Terraform|Locking state"
-msgstr ""
+msgstr "LÃ¥setilstand"
msgid "Terraform|Name"
-msgstr ""
+msgstr "Navn"
msgid "Terraform|Pipeline"
-msgstr ""
+msgstr "Rørledning"
msgid "Terraform|Remove"
-msgstr ""
+msgstr "Fjern"
msgid "Terraform|Remove state file and versions"
msgstr ""
msgid "Terraform|Removing"
-msgstr ""
+msgstr "Fjerner"
msgid "Terraform|Reported Resource Changes: %{addNum} to add, %{changeNum} to change, %{deleteNum} to delete"
msgstr ""
msgid "Terraform|States"
-msgstr ""
+msgstr "Tilstander"
msgid "Terraform|Terraform init command"
msgstr ""
@@ -32979,10 +33454,10 @@ msgid "Terraform|To remove the State file and its versions, type %{name} to conf
msgstr ""
msgid "Terraform|Unknown User"
-msgstr ""
+msgstr "Ukjent bruker"
msgid "Terraform|Unlock"
-msgstr ""
+msgstr "LÃ¥s opp"
msgid "Terraform|Unlocking state"
msgstr ""
@@ -32997,7 +33472,7 @@ msgid "Test"
msgstr "Test"
msgid "Test Cases"
-msgstr ""
+msgstr "Testtilfeller"
msgid "Test coverage parsing"
msgstr ""
@@ -33013,24 +33488,24 @@ msgstr[0] "Testdekning: %d treff"
msgstr[1] "Testdekning: %d treff"
msgid "Test settings"
-msgstr ""
+msgstr "Testinnstillinger"
msgid "TestCases|Move test case"
-msgstr ""
+msgstr "Flytt testtilfelle"
msgid "TestCases|Moving test case"
-msgstr ""
+msgstr "Flytter testtilfelle"
msgid "TestCases|New Test Case"
-msgstr ""
+msgstr "Nytt testtilfelle"
msgid "TestCases|New test case"
-msgstr ""
+msgstr "Nytt testtilfelle"
msgid "TestCases|Search test cases"
msgstr ""
-msgid "TestCases|Something went wrong while adding test case to Todo."
+msgid "TestCases|Something went wrong while adding test case to a to-do item."
msgstr ""
msgid "TestCases|Something went wrong while creating a test case."
@@ -33042,7 +33517,7 @@ msgstr ""
msgid "TestCases|Something went wrong while fetching test cases list."
msgstr ""
-msgid "TestCases|Something went wrong while marking test case todo as done."
+msgid "TestCases|Something went wrong while marking test case to-do item as done."
msgstr ""
msgid "TestCases|Something went wrong while moving test case."
@@ -33055,28 +33530,28 @@ msgid "TestCases|Something went wrong while updating the test case."
msgstr ""
msgid "TestCases|Submit test case"
-msgstr ""
+msgstr "Send inn testsak"
msgid "TestHooks|Ensure one of your projects has merge requests."
msgstr ""
msgid "TestHooks|Ensure the project has CI jobs."
-msgstr ""
+msgstr "Sørg for at prosjektet har CI-jobber."
msgid "TestHooks|Ensure the project has CI pipelines."
-msgstr ""
+msgstr "Sørg for at prosjektet har CI-rørledninger."
msgid "TestHooks|Ensure the project has deployments."
-msgstr ""
+msgstr "Sørg for at prosjektet har distribusjoner."
msgid "TestHooks|Ensure the project has issues."
-msgstr ""
+msgstr "Sørg for at prosjektet har saker."
msgid "TestHooks|Ensure the project has merge requests."
-msgstr ""
+msgstr "Sørg for at prosjektet har fletteforespørsler."
msgid "TestHooks|Ensure the project has notes."
-msgstr ""
+msgstr "Sørg for at prosjektet har notater."
msgid "TestHooks|Ensure the project has releases."
msgstr ""
@@ -33088,16 +33563,16 @@ msgid "TestReports|%{count} errors"
msgstr "%{count} feil"
msgid "TestReports|%{count} failures"
-msgstr ""
+msgstr "%{count} mislykkinger"
msgid "TestReports|%{count} tests"
msgstr "%{count} tester"
msgid "TestReports|%{rate}%{sign} success rate"
-msgstr ""
+msgstr "%{rate}%{sign} suksessprosent"
msgid "TestReports|Attachment"
-msgstr ""
+msgstr "Vedlegg"
msgid "TestReports|Jobs"
msgstr "Jobber"
@@ -33142,16 +33617,16 @@ msgid "Text added to the body of all email messages. %{character_limit} characte
msgstr ""
msgid "Text style"
-msgstr ""
+msgstr "Tekststil"
msgid "Thank you for your business."
-msgstr ""
+msgstr "Takk for handelen."
msgid "Thank you for your feedback!"
msgstr "Takk for din tilbakemelding!"
msgid "Thank you for your report. A GitLab administrator will look into it shortly."
-msgstr ""
+msgstr "Takk for rapporten din. En GitLab-administrator vil se nærmere på det innen kort tid."
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 ""
@@ -33162,11 +33637,11 @@ msgstr ""
msgid "Thanks for your purchase!"
msgstr "Takk for handelen!"
-msgid "That is ok, I do not want to renew"
+msgid "That's OK, I don't want to renew"
msgstr ""
msgid "That's it, well done!"
-msgstr ""
+msgstr "Det var det, bra jobbet!"
msgid "The \"%{group_path}\" group allows you to sign in with your Single Sign-On Account"
msgstr ""
@@ -33182,10 +33657,10 @@ msgstr ""
msgid "The %{type} contains the following error:"
msgid_plural "The %{type} contains the following errors:"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%{type} inneholder følgende feil:"
+msgstr[1] "%{type} inneholder følgende feil:"
-msgid "The API key used by GitLab for accessing the Spam Check service endpoint"
+msgid "The API key used by GitLab for accessing the Spam Check service endpoint."
msgstr ""
msgid "The GitLab subscription service (customers.gitlab.com) is currently experiencing an outage. You can monitor the status and get updates at %{linkStart}status.gitlab.com%{linkEnd}."
@@ -33195,7 +33670,7 @@ msgid "The GitLab user to which the Jira user %{jiraDisplayName} will be mapped"
msgstr ""
msgid "The ID of the application."
-msgstr ""
+msgstr "Programmets ID."
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project"
msgstr ""
@@ -33207,7 +33682,7 @@ msgid "The Prometheus server responded with \"bad request\". Please check your q
msgstr ""
msgid "The Snowplow cookie domain."
-msgstr ""
+msgstr "Snowplow-infokapseldomenet."
msgid "The URL defined on the primary node that secondary nodes should use to contact it."
msgstr ""
@@ -33216,22 +33691,19 @@ msgid "The URL defined on the primary node that secondary nodes should use to co
msgstr ""
msgid "The URL of the Jenkins server."
-msgstr ""
+msgstr "URL-en til Jenkins-tjeneren."
msgid "The URL should start with http:// or https://"
-msgstr ""
+msgstr "URL-en burde starte med http:// eller https://"
msgid "The URL to use for connecting to Elasticsearch. Use a comma-separated list to support clustering (e.g., \"http://localhost:9200, http://localhost:9201\")."
msgstr ""
-msgid "The Vulnerability Report shows the results of the last successful pipeline run on the default branch."
-msgstr ""
-
msgid "The X509 Certificate to use when mutual TLS is required to communicate with the external authorization service. If left blank, the server certificate is still validated when accessing over HTTPS."
msgstr "X.509-sertifikatet som skal brukes når det kreves gjensidig TLS for å kommunisere med den eksterne autorisasjonstjenesten. Hvis det er tomt, blir tjenersertifikatet fortsatt validert når du besøker den gjennom HTTPS."
msgid "The application will be used where the client secret can be kept confidential. Native mobile apps and Single Page Apps are considered non-confidential."
-msgstr ""
+msgstr "Programmet vil bli brukt der klienthemmeligheten kan holdes konfidensiell. Apper designet for mobiler, og enkeltsideapper, blir ansett som ikke-konfidensielle."
msgid "The associated issue #%{issueId} has been closed as the error is now resolved."
msgstr ""
@@ -33240,7 +33712,7 @@ msgid "The branch for this project has no active pipeline configuration."
msgstr ""
msgid "The branch or tag does not exist"
-msgstr ""
+msgstr "Grenen eller etiketten finnes ikke"
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 ""
@@ -33270,7 +33742,7 @@ msgid "The current issue"
msgstr "Den nåværende saken"
msgid "The current user is not authorized to access the job log."
-msgstr ""
+msgstr "Den nåværende brukeren er ikke autorisert til å få tilgang til jobbloggen."
msgid "The data in this pipeline is too old to be rendered as a graph. Please check the Jobs tab to access historical data."
msgstr ""
@@ -33284,9 +33756,6 @@ msgstr ""
msgid "The default branch for this project has been changed. Please update your bookmarks."
msgstr ""
-msgid "The default expiration time for job artifacts. 0 for unlimited. The default unit is in seconds, but you can use other units, for example %{code_open}4 mins 2 sec%{code_close}, %{code_open}2h42min%{code_close}."
-msgstr ""
-
msgid "The dependency list details information about the components used within your project."
msgstr ""
@@ -33300,10 +33769,10 @@ msgid "The directory has been successfully created."
msgstr "Mappen har blitt vellykket opprettet."
msgid "The domain you entered is misformatted."
-msgstr ""
+msgstr "Domenet du skrev inn er feilformatert."
msgid "The domain you entered is not allowed."
-msgstr ""
+msgstr "Domenet du skrev inn er ikke tillatt."
msgid "The download link will expire in 24 hours."
msgstr "Nedlastingslenken vil utløpe om 24 timer."
@@ -33327,7 +33796,7 @@ msgid "The file has been successfully deleted."
msgstr "Filen har blitt vellykket slettet."
msgid "The file name should have a .yml extension"
-msgstr ""
+msgstr "Filnavnet burde ha en .yml-utvidelse"
msgid "The finding is not a vulnerability because it is part of a test or is test data."
msgstr ""
@@ -33359,10 +33828,10 @@ msgid "The fork relationship has been removed."
msgstr ""
msgid "The form contains the following errors:"
-msgstr ""
+msgstr "Skjemaet inneholder følgende feilmeldinger:"
msgid "The form contains the following warning:"
-msgstr ""
+msgstr "Skjemaet inneholder følgende advarsel:"
msgid "The global settings require you to enable Two-Factor Authentication for your account."
msgstr ""
@@ -33380,10 +33849,10 @@ msgid "The group can be fully restored"
msgstr "Gruppen kan bli fullt gjenopprettet"
msgid "The group export can be downloaded from:"
-msgstr ""
+msgstr "Gruppeeksporteringen kan lastes ned fra:"
msgid "The group has already been shared with this group"
-msgstr ""
+msgstr "Gruppen har allerede blitt delt med denne gruppen"
msgid "The group settings for %{group_links} require you to enable Two-Factor Authentication for your account. You can %{leave_group_links}."
msgstr ""
@@ -33395,10 +33864,10 @@ msgid "The group_project_ids parameter is only allowed for a group"
msgstr ""
msgid "The hostname of your PlantUML server."
-msgstr ""
+msgstr "Vertsnavnet til PlantUML-tjeneren din."
msgid "The hostname of your Snowplow collector."
-msgstr ""
+msgstr "Vertsnavnet til din Snowplow-innsamler."
msgid "The import will time out after %{timeout}. For repositories that take longer, use a clone/push combination."
msgstr ""
@@ -33419,7 +33888,7 @@ msgid "The invitation has already been accepted."
msgstr "Invitasjonen har allerede blitt akseptert."
msgid "The invitation was successfully resent."
-msgstr ""
+msgstr "Invitasjonen ble vellykket sendt på nytt."
msgid "The issue was successfully promoted to an epic. Redirecting to epic..."
msgstr ""
@@ -33437,10 +33906,10 @@ msgid "The license key is invalid. Make sure it is exactly as you received it fr
msgstr ""
msgid "The license was removed. GitLab has fallen back on the previous license."
-msgstr ""
+msgstr "Lisensen ble fjernet. GitLab har falt tilbake på den forrige lisensen."
msgid "The license was removed. GitLab now no longer has a valid license."
-msgstr ""
+msgstr "Lisensen ble fjernet. GitLab har ikke lenger en gyldig lisens."
msgid "The license was successfully uploaded and is now active. You can see the details below."
msgstr ""
@@ -33452,13 +33921,13 @@ msgid "The maximum file size allowed is %{size}."
msgstr "Den maks tillatte filstørrelsen er %{size}."
msgid "The maximum file size for job artifacts."
-msgstr ""
+msgstr "Maksimal filstørrelse for jobbartefakter."
msgid "The maximum file size in megabytes for individual job artifacts."
msgstr ""
msgid "The maximum file size is %{size}."
-msgstr ""
+msgstr "Den maks tillatte filstørrelsen er %{size}."
msgid "The maximum number of pipeline minutes that a group can use on shared runners per month. 0 for unlimited."
msgstr ""
@@ -33478,9 +33947,6 @@ msgstr ""
msgid "The merge conflicts for this merge request have already been resolved. Please return to the merge request."
msgstr ""
-msgid "The merge request can now be merged."
-msgstr ""
-
msgid "The metric must be one of %{metrics}."
msgstr ""
@@ -33512,16 +33978,16 @@ msgid "The passphrase required to decrypt the private key. This is optional and
msgstr ""
msgid "The password for the Jenkins server."
-msgstr ""
+msgstr "Passordet til Jenkins-tjeneren."
msgid "The password for your GitLab account on %{gitlab_url} has successfully been changed."
msgstr ""
msgid "The password for your GitLab account on %{link_to_gitlab} has successfully been changed."
-msgstr ""
+msgstr "Passordet for GitLab-kontoen din på %{link_to_gitlab} ble vellykket endret."
msgid "The pipeline has been deleted"
-msgstr ""
+msgstr "Rørledningen har blitt slettet"
msgid "The pipelines schedule runs pipelines in the future, repeatedly, for specific branches or tags. Those scheduled pipelines will inherit limited project access based on their associated user."
msgstr ""
@@ -33533,10 +33999,10 @@ msgid "The project can be accessed by any logged in user except external users."
msgstr ""
msgid "The project can be accessed by any user who is logged in."
-msgstr ""
+msgstr "Prosjektet er tilgjengelig for alle brukere som er pålogget."
msgid "The project can be accessed by anyone, regardless of authentication."
-msgstr ""
+msgstr "Prosjektet er tilgjengelig for alle, uavhengig av autentisering."
msgid "The project can be accessed without any authentication."
msgstr ""
@@ -33548,7 +34014,7 @@ msgid "The project is accessible only by members of the project. Access must be
msgstr ""
msgid "The project is still being deleted. Please try again later."
-msgstr ""
+msgstr "Prosjektet blir fortsatt slettet. Prøv igjen senere."
msgid "The project was successfully forked."
msgstr "Prosjektet ble vellykket utgreinet."
@@ -33584,16 +34050,16 @@ msgid "The repository is being updated..."
msgstr "Kodelageret blir for øyeblikket oppdatert …"
msgid "The repository must be accessible over %{code_open}http://%{code_close}, %{code_open}https://%{code_close} or %{code_open}git://%{code_close}."
-msgstr ""
+msgstr "Kodelageret må være tilgjengelig over %{code_open}http://%{code_close}, %{code_open}https://%{code_close} eller %{code_open}git://%{code_close}."
msgid "The repository must be accessible over %{code_open}http://%{code_close}, %{code_open}https://%{code_close}, %{code_open}ssh://%{code_close} or %{code_open}git://%{code_close}."
-msgstr ""
+msgstr "Kodelageret må være tilgjengelig over %{code_open}http://%{code_close}, %{code_open}https://%{code_close}, %{code_open}ssh://%{code_close} eller %{code_open}git://%{code_close}."
msgid "The same shared runner executes code from multiple projects, unless you configure autoscaling with %{link} set to 1 (which it is on GitLab.com)."
msgstr ""
msgid "The schedule time must be in the future!"
-msgstr ""
+msgstr "Planleggingstiden må være i fremtiden!"
msgid "The snippet can be accessed without any authentication."
msgstr ""
@@ -33608,7 +34074,7 @@ msgid "The snippet is visible to any logged in user except external users."
msgstr ""
msgid "The source branch will be deleted"
-msgstr ""
+msgstr "Kildegrenen vil bli slettet"
msgid "The specified tab is invalid, please select another"
msgstr ""
@@ -33629,7 +34095,7 @@ msgid "The update action will time out after %{number_of_minutes} minutes. For b
msgstr ""
msgid "The uploaded file was invalid. Supported file extensions are %{extensions}."
-msgstr ""
+msgstr "Den opplastede filen var ugyldig. Filtypene som støttes er %{extensions}."
msgid "The user is being deleted."
msgstr "Brukeren blir for øyeblikket slettet."
@@ -33647,7 +34113,7 @@ msgid "The user you are trying to deactivate has been active in the past %{minim
msgstr ""
msgid "The username for the Jenkins server."
-msgstr ""
+msgstr "Brukernavnet til Jenkins-tjeneren."
msgid "The value of the provided variable exceeds the %{count} character limit"
msgstr ""
@@ -33668,7 +34134,7 @@ msgid "There are currently no events."
msgstr "Det er ingen hendelser for øyeblikket."
msgid "There are merge conflicts"
-msgstr ""
+msgstr "Flettekonflikter er til stede"
msgid "There are no %{replicableTypeName} to show"
msgstr ""
@@ -33680,13 +34146,13 @@ msgid "There are no GPG keys with access to your account."
msgstr "Det er ingen GPG-nøkler med tilgang til kontoen din."
msgid "There are no SSH keys associated with this account."
-msgstr ""
+msgstr "Det er ingen SSH-nøkler tilknyttet denne kontoen."
msgid "There are no SSH keys with access to your account."
msgstr ""
msgid "There are no Spam Logs"
-msgstr ""
+msgstr "Det er ingen spam-logger"
msgid "There are no abuse reports!"
msgstr ""
@@ -33698,7 +34164,7 @@ msgid "There are no archived requirements"
msgstr "Det er ingen arkiverte krav"
msgid "There are no archived test cases"
-msgstr ""
+msgstr "Det er ingen arkiverte testtilfeller"
msgid "There are no changes"
msgstr "Det er ingen endringer"
@@ -33707,16 +34173,16 @@ msgid "There are no charts configured for this page"
msgstr ""
msgid "There are no closed epics"
-msgstr ""
+msgstr "Det er ingen lukkede eposer"
msgid "There are no closed issues"
msgstr "Det er ingen lukkede saker"
msgid "There are no closed merge requests"
-msgstr ""
+msgstr "Det er ingen lukkede fletteforespørsler"
msgid "There are no commits yet."
-msgstr ""
+msgstr "Det er ingen commiter ennå."
msgid "There are no custom project templates set up for this GitLab instance. They are enabled from GitLab's Admin Area. Contact your GitLab instance administrator to setup custom project templates."
msgstr "Det er ingen tilpassede prosjektmaler satt opp for denne GitLab-instansen. De er aktivert fra GitLab sitt Admin-område. Kontakt din GitLab-instansadministrator for å sette opp egendefinerte prosjektmaler."
@@ -33725,7 +34191,7 @@ msgid "There are no issues to show"
msgstr "Det er ingen saker å vise"
msgid "There are no issues with the selected labels"
-msgstr ""
+msgstr "Det er ingen saker med de valgte stemplene"
msgid "There are no labels yet"
msgstr "Det er ingen stempler ennå"
@@ -33734,19 +34200,19 @@ msgid "There are no matching files"
msgstr "Det er ingen samsvarende filer"
msgid "There are no open epics"
-msgstr ""
+msgstr "Det er ingen åpne eposer"
msgid "There are no open issues"
msgstr "Det er ingen åpne saker"
msgid "There are no open merge requests"
-msgstr ""
+msgstr "Det er ingen åpne fletteforespørsler"
msgid "There are no open requirements"
msgstr "Det er ingen åpne krav"
msgid "There are no open test cases"
-msgstr ""
+msgstr "Det er ingen åpne testtilfeller"
msgid "There are no packages yet"
msgstr "Det er ingen pakker ennå"
@@ -33785,7 +34251,7 @@ msgid "There is no chart data available."
msgstr ""
msgid "There is no data available."
-msgstr ""
+msgstr "Det er ingen tilgjengelige data."
msgid "There is no data available. Please change your selection."
msgstr ""
@@ -33800,25 +34266,25 @@ msgid "There was a problem communicating with your device."
msgstr ""
msgid "There was a problem fetching branches."
-msgstr ""
+msgstr "En feil oppstod under innhenting av grener."
msgid "There was a problem fetching emojis."
-msgstr ""
+msgstr "En feil oppstod under innhenting av emojier."
msgid "There was a problem fetching epics."
-msgstr ""
+msgstr "En feil oppstod under innhenting av eposer."
msgid "There was a problem fetching groups."
msgstr "En feil oppstod under innhenting av grupper."
msgid "There was a problem fetching iterations."
-msgstr ""
+msgstr "En feil oppstod under innhenting av iterasjoner."
msgid "There was a problem fetching labels."
msgstr "En feil oppstod under innhenting av stempler."
msgid "There was a problem fetching linked pipelines."
-msgstr ""
+msgstr "En feil oppstod under innhenting av lenkede rørledninger."
msgid "There was a problem fetching milestones."
msgstr "En feil oppstod under innhenting av milepæler."
@@ -33833,10 +34299,10 @@ msgid "There was a problem fetching project users."
msgstr "En feil oppstod under innhenting av prosjektbrukere."
msgid "There was a problem fetching recent groups."
-msgstr ""
+msgstr "En feil oppstod under innhenting av nylige grupper."
msgid "There was a problem fetching recent projects."
-msgstr ""
+msgstr "En feil oppstod under innhenting av nylige prosjekter."
msgid "There was a problem fetching the job token scope value"
msgstr ""
@@ -33856,7 +34322,7 @@ msgstr ""
msgid "There was a problem updating the keep latest artifacts setting."
msgstr ""
-msgid "There was an error %{message} todo."
+msgid "There was an error %{message} to-do item."
msgstr ""
msgid "There was an error adding a To Do."
@@ -33872,7 +34338,7 @@ msgid "There was an error creating the issue"
msgstr "En feil oppstod under oppretting av saken"
msgid "There was an error deleting the To Do."
-msgstr ""
+msgstr "Det oppsto en feil under sletting av gjøremålet."
msgid "There was an error fetching configuration for charts"
msgstr ""
@@ -33893,6 +34359,9 @@ msgid "There was an error fetching median data for stages"
msgstr ""
msgid "There was an error fetching projects"
+msgstr "Det oppstod en feil under henting av prosjekter"
+
+msgid "There was an error fetching search autocomplete suggestions"
msgstr ""
msgid "There was an error fetching stage total counts"
@@ -33944,7 +34413,7 @@ msgid "There was an error parsing the data for this graph."
msgstr ""
msgid "There was an error removing the e-mail."
-msgstr ""
+msgstr "Det oppstod en feil under fjerning av e-posten."
msgid "There was an error resetting group pipeline minutes."
msgstr ""
@@ -34010,7 +34479,7 @@ msgid "There was an error while fetching value stream summary data."
msgstr ""
msgid "There was an error with the reCAPTCHA. Please solve the reCAPTCHA again."
-msgstr ""
+msgstr "Det oppstod en feil med reCAPTCHA-en. Vennligst løs reCAPTCHA-en på nytt."
msgid "These dates affect how your epics appear in the roadmap. Set a fixed date or one inherited from the milestones assigned to issues in this epic."
msgstr ""
@@ -34037,34 +34506,34 @@ msgid "These variables are inherited from the parent group."
msgstr ""
msgid "These will be sent to %{email} in an attachment once finished."
-msgstr ""
+msgstr "Disse vil bli sendt til %{email} som et vedlegg når de er ferdige."
msgid "Third Party Advisory Link"
msgstr ""
msgid "Third-party offers"
-msgstr ""
+msgstr "Tredjepartstilbud"
msgid "This %{issuableDisplayName} is locked. Only project members can comment."
-msgstr ""
+msgstr "Denne %{issuableDisplayName} er låst. Kun prosjektmedlemmer kan kommentere."
msgid "This %{issuableType} is confidential"
msgstr "Denne %{issuableType} er konfidensiell"
msgid "This %{issuable} is locked. Only %{strong_open}project members%{strong_close} can comment."
-msgstr ""
+msgstr "Denne %{issuable} er låst. Kun %{strong_open}prosjektmedlemmer%{strong_close} kan kommentere."
msgid "This %{noteableTypeText} is %{confidentialLinkStart}confidential%{linkEnd} and %{lockedLinkStart}locked%{linkEnd}."
-msgstr ""
+msgstr "Denne %{noteableTypeText} er %{confidentialLinkStart}konfidensiell%{linkEnd} og %{lockedLinkStart}låst%{linkEnd}."
msgid "This %{noteableTypeText} is locked."
-msgstr ""
+msgstr "Denne %{noteableTypeText} er låst."
msgid "This %{viewer} could not be displayed because %{reason}. You can %{options} instead."
msgstr ""
msgid "This Cron pattern is invalid"
-msgstr ""
+msgstr "Dette Cron-mønsteret er ugyldig"
msgid "This GitLab instance does not provide any shared runners yet. Instance administrators can register shared runners in the admin area."
msgstr ""
@@ -34100,19 +34569,19 @@ msgid "This action will %{strongOpen}permanently remove%{strongClose} %{codeOpen
msgstr ""
msgid "This also resolves all related threads"
-msgstr ""
+msgstr "Dette oppklarer også alle relaterte tråder"
msgid "This also resolves this thread"
-msgstr ""
+msgstr "Dette oppklarer også denne tråden"
msgid "This application was created by %{user_link}."
-msgstr ""
+msgstr "Dette programmet ble opprettet av %{user_link}."
msgid "This application was created for group %{group_link}."
msgstr ""
msgid "This application will be able to:"
-msgstr ""
+msgstr "Dette programmet vil kunne:"
msgid "This attachment has been truncated to avoid exceeding the maximum allowed attachment size of %{size_limit}. %{written_count} of %{count} %{issuables} have been included. Consider re-exporting with a narrower selection of %{issuables}."
msgstr ""
@@ -34127,7 +34596,7 @@ msgid "This attachment has been truncated to avoid exceeding the maximum allowed
msgstr ""
msgid "This block is self-referential"
-msgstr ""
+msgstr "Denne blokken refererer til seg selv"
msgid "This board's scope is reduced"
msgstr ""
@@ -34157,7 +34626,7 @@ msgid "This commit was signed with a verified signature, but the committer email
msgstr ""
msgid "This commit was signed with an %{strong_open}unverified%{strong_close} signature."
-msgstr ""
+msgstr "Denne commiten ble signert med en %{strong_open}uverifisert%{strong_close} signatur."
msgid "This content could not be displayed because %{reason}. You can %{options} instead."
msgstr ""
@@ -34172,10 +34641,10 @@ msgid "This date is before the start date, so this epic won't appear in the road
msgstr ""
msgid "This device has already been registered with us."
-msgstr ""
+msgstr "Denne enheten har allerede blitt registrert hos oss."
msgid "This device has not been registered with us."
-msgstr ""
+msgstr "Denne enheten har ikke blitt registrert hos oss."
msgid "This diff is collapsed."
msgstr "Denne diffen er klappet sammen."
@@ -34184,19 +34653,19 @@ msgid "This directory"
msgstr "Denne mappen"
msgid "This domain is not verified. You will need to verify ownership before access is enabled."
-msgstr ""
+msgstr "Dette domenet er ikke bekreftet. Du må bekrefte eierskapet før tilgang aktiveres."
msgid "This endpoint has been requested too many times. Try again later."
msgstr ""
msgid "This environment has no deployments yet."
-msgstr ""
+msgstr "Dette miljøet har ingen distribusjoner ennå."
msgid "This environment is being deployed"
-msgstr ""
+msgstr "Dette miljøet blir distribuert"
msgid "This environment is being re-deployed"
-msgstr ""
+msgstr "Dette miljøet blir redistribuert"
msgid "This environment's canary ingress has been updated recently. Please retry later."
msgstr ""
@@ -34214,11 +34683,14 @@ msgid "This feature requires local storage to be enabled"
msgstr ""
msgid "This field is required"
-msgstr ""
+msgstr "Dette feltet er påkrevd"
msgid "This field is required."
msgstr "Dette feltet er påkrevd."
+msgid "This form is disabled in preview"
+msgstr ""
+
msgid "This group"
msgstr "Denne gruppen"
@@ -34238,10 +34710,7 @@ msgid "This group has been scheduled for permanent removal on %{date}"
msgstr ""
msgid "This group is linked to a subscription"
-msgstr ""
-
-msgid "This group, including all subgroups, projects and git repositories, will be reachable from only the specified IP address ranges."
-msgstr ""
+msgstr "Denne gruppen er knyttet til et abonnement"
msgid "This group, its subgroups and projects has been scheduled for removal on %{date}."
msgstr ""
@@ -34256,16 +34725,16 @@ msgid "This is a \"Ghost User\", created to hold all issues authored by users th
msgstr ""
msgid "This is a Jira user."
-msgstr ""
+msgstr "Dette er en Jira-bruker."
msgid "This is a confidential %{noteableTypeText}."
-msgstr ""
+msgstr "Dette er en konfidensiell %{noteableTypeText}."
msgid "This is a delayed job to run in %{remainingTime}"
msgstr ""
msgid "This is a list of devices that have logged into your account. Revoke any sessions that you do not recognize."
-msgstr ""
+msgstr "Dette er en liste over enheter som har logget seg på kontoen din. Tilbakekall alle økter som du ikke kjenner igjen."
msgid "This is a merge train pipeline"
msgstr ""
@@ -34274,7 +34743,7 @@ msgid "This is a private email address %{helpIcon} generated just for you. Anyon
msgstr ""
msgid "This is a security log of important events involving your account."
-msgstr ""
+msgstr "Dette er en sikkerhetslogg over viktige hendelser som involverer kontoen din."
msgid "This is a self-managed instance of GitLab."
msgstr ""
@@ -34379,7 +34848,7 @@ msgid "This job is waiting for resource: "
msgstr ""
msgid "This job requires a manual action"
-msgstr ""
+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 ""
@@ -34391,7 +34860,7 @@ msgid "This license has already expired."
msgstr "Denne lisensen har allerede utløpt."
msgid "This link points to external content"
-msgstr ""
+msgstr "Denne lenken fører til eksternt innhold"
msgid "This may expose confidential information as the selected fork is in another namespace that can have other members."
msgstr "Dette kan avsløre konfidensiell informasjon, ettersom den valgte utgreiningen er i et annet navneområde som kan ha andre medlemmer."
@@ -34421,10 +34890,10 @@ msgid "This merge request is from an internal project to a public project."
msgstr ""
msgid "This merge request is locked."
-msgstr ""
+msgstr "Denne fletteforespørselen er låst."
msgid "This merge request is still a draft."
-msgstr ""
+msgstr "Denne fletteforespørselen er fortsatt et utkast."
msgid "This merge request was merged. To apply this suggestion, edit this file directly."
msgstr ""
@@ -34463,16 +34932,16 @@ msgid "This project does not have %{service_desk_link_start}Service Desk%{servic
msgstr "Dette prosjektet har ikke %{service_desk_link_start}Tjenestedesken%{service_desk_link_end} aktivert, så brukeren som opprettet problemet vil ikke lenger motta e-postvarsler om ny aktivitet."
msgid "This project does not have a wiki homepage yet"
-msgstr ""
+msgstr "Dette prosjektet har ikke en wiki-hjemmeside ennå"
msgid "This project has no active access tokens."
-msgstr ""
+msgstr "Dette prosjektet har ingen aktive tilgangssjetonger."
msgid "This project is archived and cannot be commented on."
msgstr ""
msgid "This project is licensed under the %{strong_start}%{license_name}%{strong_end}."
-msgstr ""
+msgstr "Dette prosjektet er lisensiert som %{strong_start}%{license_name}%{strong_end}."
msgid "This project manages its dependencies using %{strong_start}%{manager_name}%{strong_end}"
msgstr ""
@@ -34481,7 +34950,7 @@ msgid "This project path either does not exist or you do not have access."
msgstr ""
msgid "This project will be deleted on %{date}"
-msgstr ""
+msgstr "Dette prosjektet vil bli slettet den %{date}"
msgid "This project will be deleted on %{date} since its parent group '%{parent_group_name}' has been scheduled for deletion."
msgstr ""
@@ -34511,25 +34980,22 @@ msgid "This service allows users to perform common operations on this project by
msgstr ""
msgid "This setting can be overridden in each project."
-msgstr ""
+msgstr "Denne innstillingen kan overstyres i hvert prosjekt."
msgid "This subscription is for"
-msgstr ""
+msgstr "Dette abonnementet er for"
msgid "This suggestion already matches its content."
msgstr ""
msgid "This user cannot be unlocked manually from GitLab"
-msgstr ""
-
-msgid "This user does not have a pending request"
-msgstr ""
+msgstr "Denne brukeren kan ikke låses opp manuelt fra GitLab"
msgid "This user has an unconfirmed email address (%{email}). You may force a confirmation."
-msgstr ""
+msgstr "Denne brukeren har en ubekreftet E-postadresse (%{email}). Du kan tvinge den til å måtte bekreftes."
msgid "This user has an unconfirmed email address. You may force a confirmation."
-msgstr ""
+msgstr "Denne brukeren har en ubekreftet E-postadresse. Du kan tvinge den til å måtte bekreftes."
msgid "This user has no active %{type}."
msgstr "Denne brukeren har ingen aktive %{type}."
@@ -34538,19 +35004,19 @@ msgid "This user has no identities"
msgstr "Denne brukeren har ingen identiteter"
msgid "This user has no personal projects."
-msgstr ""
+msgstr "Denne brukeren har ingen personlige prosjekter."
msgid "This user has previously committed to the %{name} project."
-msgstr ""
+msgstr "Denne brukeren har tidligere commitet til %{name}-prosjektet."
msgid "This user has the %{access} role in the %{name} project."
-msgstr ""
+msgstr "Denne brukeren har %{access}-rollen i %{name}-prosjektet."
msgid "This user is the author of this %{noteable}."
-msgstr ""
+msgstr "Denne brukeren er forfatteren av denne %{noteable}."
msgid "This variable can not be masked."
-msgstr ""
+msgstr "Denne variabelen kan ikke maskeres."
msgid "This will redirect you to an external sign in page."
msgstr ""
@@ -34568,13 +35034,13 @@ msgid "Threat Monitoring"
msgstr "Trusselovervåking"
msgid "ThreatMonitoring|Alert Details"
-msgstr ""
+msgstr "Alarmdetaljer"
msgid "ThreatMonitoring|Alerts"
-msgstr ""
+msgstr "Alarmer"
msgid "ThreatMonitoring|All Environments"
-msgstr ""
+msgstr "Alle miljøer"
msgid "ThreatMonitoring|Anomalous Requests"
msgstr "Abnormale forespørsler"
@@ -34589,10 +35055,10 @@ msgid "ThreatMonitoring|Container NetworkPolicies not detected"
msgstr ""
msgid "ThreatMonitoring|Date and time"
-msgstr ""
+msgstr "Dato og tid"
msgid "ThreatMonitoring|Dismissed"
-msgstr ""
+msgstr "Avvist"
msgid "ThreatMonitoring|Dropped Packets"
msgstr "Droppede pakker"
@@ -34601,31 +35067,31 @@ msgid "ThreatMonitoring|Environment"
msgstr "Miljø"
msgid "ThreatMonitoring|Events"
-msgstr ""
+msgstr "Hendelser"
msgid "ThreatMonitoring|Failed to create incident, please try again."
msgstr ""
msgid "ThreatMonitoring|Hide dismissed alerts"
-msgstr ""
+msgstr "Skjul avviste alarmer"
msgid "ThreatMonitoring|In review"
msgstr ""
msgid "ThreatMonitoring|Incident"
-msgstr ""
+msgstr "Hendelser"
msgid "ThreatMonitoring|Name"
-msgstr ""
+msgstr "Navn"
msgid "ThreatMonitoring|No alerts available to display. See %{linkStart}enabling threat alerts%{linkEnd} for more information on adding alerts to the list."
msgstr ""
msgid "ThreatMonitoring|No alerts to display."
-msgstr ""
+msgstr "Ingen alarmer å vise."
msgid "ThreatMonitoring|No environments detected"
-msgstr ""
+msgstr "Ingen miljøer ble oppdaget"
msgid "ThreatMonitoring|Operations Per Second"
msgstr ""
@@ -34633,14 +35099,11 @@ msgstr ""
msgid "ThreatMonitoring|Packet Activity"
msgstr "Pakkeaktivitet"
-msgid "ThreatMonitoring|Policies"
-msgstr "Retningslinjer"
-
msgid "ThreatMonitoring|Requests"
msgstr "Forespørsler"
msgid "ThreatMonitoring|Resolved"
-msgstr ""
+msgstr "Oppklart"
msgid "ThreatMonitoring|Show last"
msgstr "Vis siste"
@@ -34652,10 +35115,10 @@ msgid "ThreatMonitoring|Something went wrong, unable to fetch statistics"
msgstr "Noe gikk galt, kunne ikke innhente statistikker"
msgid "ThreatMonitoring|Statistics"
-msgstr ""
+msgstr "Statistikk"
msgid "ThreatMonitoring|Status"
-msgstr ""
+msgstr "Status"
msgid "ThreatMonitoring|There was an error displaying the alerts. Confirm your endpoint's configuration details to ensure alerts appear."
msgstr ""
@@ -34676,31 +35139,40 @@ msgid "ThreatMonitoring|To view this data, ensure you have configured an environ
msgstr ""
msgid "ThreatMonitoring|Total Packets"
-msgstr ""
+msgstr "Totalt antall pakker"
msgid "ThreatMonitoring|Total Requests"
-msgstr ""
+msgstr "Totalt antall forespørsler"
msgid "ThreatMonitoring|Unreviewed"
-msgstr ""
+msgstr "Ugjennomgått"
msgid "ThreatMonitoring|View documentation"
msgstr "Vis dokumentasjon"
-msgid "Throughput"
+msgid "Threshold in bytes at which to compress Sidekiq job arguments."
msgstr ""
+msgid "Threshold in bytes at which to reject Sidekiq jobs. Set this to 0 to if you don't want to limit Sidekiq jobs."
+msgstr ""
+
+msgid "Throughput"
+msgstr "Gjennomstrømming"
+
msgid "Thursday"
msgstr "Torsdag"
msgid "Time"
msgstr "Tid"
-msgid "Time Spent"
+msgid "Time (in hours) that users are allowed to skip forced configuration of two-factor authentication."
msgstr ""
+msgid "Time Spent"
+msgstr "Tid brukt"
+
msgid "Time based: Yes"
-msgstr ""
+msgstr "Tidsbasert: Ja"
msgid "Time before an issue gets scheduled"
msgstr ""
@@ -34742,27 +35214,27 @@ msgid "Time spent"
msgstr "Tid brukt"
msgid "Time to merge"
-msgstr ""
+msgstr "Tid igjen før sammenslåing"
msgid "Time to subtract exceeds the total time spent"
msgstr ""
msgid "Time tracking"
-msgstr ""
+msgstr "Tidssporing"
msgid "Time tracking report"
-msgstr ""
+msgstr "Tidssporingsrapport"
msgid "Time until first merge request"
msgstr ""
msgid "Time zone"
-msgstr ""
+msgstr "Tidssone"
msgid "TimeTrackingEstimated|Est"
-msgstr ""
+msgstr "Ansl."
-msgid "TimeTracking|%{startTag}Spent: %{endTag}%{timeSpentHumanReadable}"
+msgid "TimeTracking|%{spentStart}Spent: %{spentEnd}"
msgstr ""
msgid "TimeTracking|Estimated:"
@@ -34772,10 +35244,10 @@ msgid "TimeTracking|Over by %{timeRemainingHumanReadable}"
msgstr ""
msgid "TimeTracking|Spent"
-msgstr ""
+msgstr "Brukt"
msgid "TimeTracking|Time remaining: %{timeRemainingHumanReadable}"
-msgstr ""
+msgstr "Gjenværende tid: %{timeRemainingHumanReadable}"
msgid "Timeago|%s days ago"
msgstr "%s dager siden"
@@ -34901,10 +35373,10 @@ msgid "Timeago|right now"
msgstr "akkurat nå"
msgid "Timeline|Turn timeline view off"
-msgstr ""
+msgstr "Skru av tidslinjevisningen"
msgid "Timeline|Turn timeline view on"
-msgstr ""
+msgstr "Skru på tidslinjevisningen"
msgid "Timeout"
msgstr "Tidsavbrudd"
@@ -34922,7 +35394,7 @@ msgid "Timeout for the fastest Gitaly operations (in seconds)."
msgstr ""
msgid "Timezone"
-msgstr ""
+msgstr "Tidssone"
msgid "Time|hr"
msgid_plural "Time|hrs"
@@ -34971,39 +35443,45 @@ msgid "To accept this invitation, sign in or create an account."
msgstr ""
msgid "To accept this invitation, sign in."
-msgstr ""
+msgstr "For å godta denne invitasjonen, må du logge på."
msgid "To access this domain create a new DNS record"
msgstr ""
-msgid "To add an SSH key you need to %{generate_link_start}generate one%{link_end} or use an %{existing_link_start}existing key%{link_end}."
+msgid "To add a custom suffix, set up a Service Desk email address. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
+msgid "To add an SSH key you need to %{generate_link_start}generate one%{link_end} or use an %{existing_link_start}existing key%{link_end}."
+msgstr "For å legge til en SSH-nøkkel må du %{generate_link_start}generere en%{link_end}, eller bruke en %{existing_link_start}eksisterende nøkkel%{link_end}."
+
msgid "To add the entry manually, provide the following details to the application on your phone."
msgstr ""
msgid "To confirm, type %{phrase_code}"
-msgstr ""
+msgstr "For å bekrefte, skriv %{phrase_code}"
msgid "To connect GitHub repositories, you can use a %{personal_access_token_link}. When you create your Personal Access Token, you will need to select the %{code_open}repo%{code_close} scope, so we can display a list of your public and private repositories which are available to connect."
msgstr "For å koble til GitHub-kodelagre, kan du bruke en %{personal_access_token_link}. Når du oppretter din personlige tilgangsnøkkel, må du velge %{code_open}kodelager%{code_close}-omfang, så vi kan vise en liste over dine offentlige og private kodelagre som er tilgjengelige for å koble til."
msgid "To connect GitHub repositories, you first need to authorize GitLab to access the list of your GitHub repositories."
-msgstr ""
+msgstr "For å koble til GitHub-kodelagre, må du først autorisere GitLab til å få tilgang til listen over GitHub-kodelagrene dine."
msgid "To connect GitHub repositories, you first need to authorize GitLab to access the list of your GitHub repositories:"
-msgstr ""
+msgstr "For å koble til GitHub-kodelagre, må du først autorisere GitLab til å få tilgang til listen over GitHub-kodelagrene dine:"
msgid "To connect an SVN repository, check out %{svn_link}."
msgstr "For å koble til et SVN-kodelager, sjekk ut %{svn_link}."
+msgid "To continue using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
+msgstr ""
+
msgid "To continue, you need to select the link in the confirmation email we sent to verify your email address. If you didn't get our email, select %{strongStart}Resend confirmation email.%{strongEnd}"
msgstr ""
msgid "To define internal users, first enable new users set to external"
msgstr ""
-msgid "To enable Registration Features, make sure \"Enable service ping\" is checked."
+msgid "To enable Registration Features, first enable Service Ping."
msgstr ""
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
@@ -35030,8 +35508,8 @@ msgstr "For å komme i gang, skriv inn din Gitea-verts-URL og en %{link_to_perso
msgid "To get started, use the link below to confirm your account."
msgstr ""
-msgid "To help improve GitLab and its user experience, GitLab will periodically collect usage information."
-msgstr "For å forbedre GitLab og brukeropplevelsen dens, vil GitLab med jevne mellomrom samle inn bruksinformasjon."
+msgid "To help improve GitLab and its user experience, GitLab periodically collects usage information."
+msgstr ""
msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
msgstr ""
@@ -35040,13 +35518,13 @@ msgid "To import an SVN repository, check out %{svn_link}."
msgstr "For å importere et SVN-kodelager, sjekk ut %{svn_link}."
msgid "To keep this project going, create a new issue"
-msgstr ""
+msgstr "For å holde dette prosjektet gående, opprett en ny sak"
msgid "To keep this project going, create a new merge request"
-msgstr ""
+msgstr "For å holde dette prosjektet gående, opprett en ny fletteforespørsel"
msgid "To learn more about this project, read %{link_to_wiki}."
-msgstr ""
+msgstr "For å lære mer om dette prosjektet, les %{link_to_wiki}."
msgid "To move or copy an entire GitLab project from another GitLab installation to this one, navigate to the original project's settings page, generate an export file, and upload it here."
msgstr ""
@@ -35063,7 +35541,7 @@ msgstr ""
msgid "To preserve performance only %{strong_open}%{display_size} of %{real_size}%{strong_close} files are displayed."
msgstr ""
-msgid "To protect this issue's confidentiality, %{forkLink} and set the fork's visibility to private."
+msgid "To protect this issue's confidentiality, %{linkStart}fork this project%{linkEnd} and set the fork's visibility to private."
msgstr ""
msgid "To protect this issue's confidentiality, a private fork of this project was selected."
@@ -35073,13 +35551,13 @@ msgid "To reactivate your account, %{gitlab_link_start}sign in to GitLab.%{link_
msgstr ""
msgid "To reactivate your account, sign in to GitLab at %{gitlab_url}."
-msgstr ""
+msgstr "For å aktivere kontoen din på nytt, logg på GitLab på %{gitlab_url}."
msgid "To receive alerts from manually configured Prometheus services, add the following URL and Authorization key to your Prometheus webhook config file. Learn more about %{linkStart}configuring Prometheus%{linkEnd} to send alerts to GitLab."
msgstr "For å motta alarmer fra manuelt konfigurerte Prometheus-tjenester, legg til den følgende URL-en og autorisasjonsnøkkelen til din Prometeus-webhook-oppsettsfil. Lær mer om %{linkStart}å sette opp Prometheus%{linkEnd} til å sende varsler til GitLab."
msgid "To resolve this, try to:"
-msgstr ""
+msgstr "For å oppklare dette, forsøk å:"
msgid "To run CI/CD pipelines with JetBrains TeamCity, input the GitLab project details in the TeamCity project Version Control Settings."
msgstr ""
@@ -35096,12 +35574,15 @@ msgstr ""
msgid "To set up SAML authentication for your group through an identity provider like Azure, Okta, Onelogin, Ping Identity, or your custom SAML 2.0 provider:"
msgstr ""
-msgid "To set up this service:"
-msgstr "For å sette opp denne tjenesten:"
+msgid "To set up this integration:"
+msgstr ""
msgid "To specify the notification level per project of a group you belong to, you need to visit project page and change notification level there."
msgstr ""
+msgid "To start using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
+msgstr ""
+
msgid "To unsubscribe from this issue, please paste the following link into your browser:"
msgstr ""
@@ -35118,13 +35599,13 @@ msgid "To view all %{scannedResourcesCount} scanned URLs, %{linkStart}please dow
msgstr ""
msgid "To widen your search, change or remove filters above"
-msgstr ""
+msgstr "For å utvide søket, endre eller fjerne filtrene ovenfor"
msgid "To widen your search, change or remove filters above."
-msgstr ""
+msgstr "For å utvide søket, endre eller fjerne filtrene ovenfor."
msgid "To widen your search, change or remove filters."
-msgstr ""
+msgstr "For å utvide søket, endre eller fjerne filtre."
msgid "To-Do List"
msgstr "Gjøremålsliste"
@@ -35196,13 +35677,13 @@ msgid "Toggles :%{name}: emoji award."
msgstr ""
msgid "Token"
-msgstr ""
+msgstr "Sjetong"
msgid "Token Access"
msgstr ""
msgid "Token name"
-msgstr ""
+msgstr "Sjetongnavn"
msgid "Token valid until revoked"
msgstr ""
@@ -35226,7 +35707,7 @@ msgid "Too many projects enabled. You will need to manage them via the console o
msgstr ""
msgid "TopNav|Go back"
-msgstr ""
+msgstr "GÃ¥ tilbake"
msgid "Topics (optional)"
msgstr "Emner (valgfritt)"
@@ -35247,7 +35728,7 @@ msgid "Total cores (CPUs)"
msgstr "Totalt antall kjerner (CPU-er)"
msgid "Total issues"
-msgstr ""
+msgstr "Totalt antall saker"
msgid "Total memory (GB)"
msgstr "Totalt minne (GB)"
@@ -35256,7 +35737,7 @@ msgid "Total test time for all commits/merges"
msgstr "Total testtid for alle commits/innflettinger"
msgid "Total users"
-msgstr ""
+msgstr "Totalt antall brukere"
msgid "Total weight"
msgstr "Totalvekt"
@@ -35265,10 +35746,10 @@ msgid "Total: %{total}"
msgstr "Totalt: %{total}"
msgid "TotalMilestonesIndicator|1000+"
-msgstr ""
+msgstr "1000+"
msgid "TotalRefCountIndicator|1000+"
-msgstr ""
+msgstr "1000+"
msgid "Tracing"
msgstr "Sporing"
@@ -35325,7 +35806,7 @@ msgid "TransferGroup|The parent group already has a subgroup with the same path.
msgstr ""
msgid "TransferGroup|Transfer failed: %{error_message}"
-msgstr ""
+msgstr "Overføringen mislyktes: %{error_message}"
msgid "TransferGroup|You don't have enough permissions."
msgstr "Du har ikke nok tillatelser."
@@ -35366,7 +35847,7 @@ msgstr[0] ""
msgstr[1] ""
msgid "Trials|Compare all plans"
-msgstr ""
+msgstr "Sammenlign alle planer"
msgid "Trials|Create a new group to start your GitLab Ultimate trial."
msgstr ""
@@ -35375,10 +35856,10 @@ msgid "Trials|Go back to GitLab"
msgstr "GÃ¥ tilbake til GitLab"
msgid "Trials|Hey there"
-msgstr ""
+msgstr "Heisann"
msgid "Trials|Skip Trial"
-msgstr ""
+msgstr "Hopp over prøveperiode"
msgid "Trials|Upgrade %{groupName} to %{planName}"
msgstr ""
@@ -35396,22 +35877,22 @@ msgid "Trials|Your trial ends on %{boldStart}%{trialEndDate}%{boldEnd}. We hope
msgstr ""
msgid "Trial|Company name"
-msgstr ""
+msgstr "Firmanavn"
msgid "Trial|Continue"
-msgstr ""
+msgstr "Fortsett"
msgid "Trial|Continue using the basic features of GitLab for free."
msgstr ""
msgid "Trial|Country"
-msgstr ""
+msgstr "Land"
msgid "Trial|Dismiss"
-msgstr ""
+msgstr "Avvis"
msgid "Trial|First name"
-msgstr ""
+msgstr "Fornavn"
msgid "Trial|GitLab Ultimate trial (optional)"
msgstr ""
@@ -35426,19 +35907,19 @@ msgid "Trial|How many users will be evaluating the trial?"
msgstr ""
msgid "Trial|Last name"
-msgstr ""
+msgstr "Etternavn"
msgid "Trial|Number of employees"
-msgstr ""
+msgstr "Antall ansatte"
msgid "Trial|Please select a country"
-msgstr ""
+msgstr "Vennligst velg et land"
msgid "Trial|Successful trial activation image"
msgstr ""
msgid "Trial|Telephone number"
-msgstr ""
+msgstr "Telefonnummer"
msgid "Trial|Upgrade to Ultimate to keep using GitLab with advanced features."
msgstr ""
@@ -35450,7 +35931,7 @@ msgid "Trial|Your GitLab Ultimate trial lasts for 30 days, but you can keep your
msgstr ""
msgid "Trial|your company"
-msgstr ""
+msgstr "bedriften din"
msgid "Trigger"
msgstr "Utløser"
@@ -35501,7 +35982,7 @@ msgid "Troubleshoot and monitor your application with tracing"
msgstr ""
msgid "Trusted"
-msgstr ""
+msgstr "Betrodd"
msgid "Try again"
msgstr "Prøv igjen"
@@ -35513,7 +35994,7 @@ msgid "Try all GitLab has to offer for 30 days."
msgstr "Prøv ut alt som GitLab har å tilby i 30 dager."
msgid "Try changing or removing filters."
-msgstr ""
+msgstr "Prøv å endre eller fjerne filtre."
msgid "Try grouping with different labels"
msgstr ""
@@ -35540,16 +36021,16 @@ msgid "Tuning settings"
msgstr ""
msgid "Turn off"
-msgstr ""
+msgstr "Slå av"
msgid "Turn on"
-msgstr ""
+msgstr "Slå på"
msgid "Twitter"
msgstr "Twitter"
msgid "Twitter:"
-msgstr ""
+msgstr "Twitter:"
msgid "Two-Factor Authentication"
msgstr "2-trinnautentisering"
@@ -35561,10 +36042,10 @@ msgid "Two-factor Authentication"
msgstr "2-trinnautentisering"
msgid "Two-factor Authentication Recovery codes"
-msgstr ""
+msgstr "2-trinnsautentiseringsgjenopprettingskoder"
msgid "Two-factor Authentication:"
-msgstr ""
+msgstr "2-trinnautentisering:"
msgid "Two-factor authentication"
msgstr "2-trinnsautentisering"
@@ -35603,10 +36084,10 @@ msgid "URL"
msgstr "URL"
msgid "URL cannot be blank"
-msgstr ""
+msgstr "URL-en kan ikke være blank"
msgid "URL is invalid"
-msgstr ""
+msgstr "URL-en er ugyldig"
msgid "URL is required"
msgstr "Nettadresse er påkrevd"
@@ -35627,7 +36108,7 @@ msgid "URL must be percent-encoded if neccessary."
msgstr ""
msgid "URL must start with %{codeStart}http://%{codeEnd}, %{codeStart}https://%{codeEnd}, or %{codeStart}ftp://%{codeEnd}"
-msgstr ""
+msgstr "URL-en må begynne med %{codeStart}http://%{codeEnd}, %{codeStart}https://%{codeEnd}, eller %{codeStart}ftp://%{codeEnd}"
msgid "URL of the Grafana instance to link to from the Metrics Dashboard menu item."
msgstr ""
@@ -35689,9 +36170,6 @@ msgstr ""
msgid "Unable to fetch branches list, please close the form and try again"
msgstr ""
-msgid "Unable to fetch unscanned projects"
-msgstr "Klarte ikke å innhente uskannede prosjekter"
-
msgid "Unable to fetch vulnerable projects"
msgstr "Klarte ikke å innhente sårbare prosjekter"
@@ -35720,13 +36198,13 @@ msgid "Unable to save cadence. Please try again"
msgstr ""
msgid "Unable to save iteration. Please try again"
-msgstr ""
+msgstr "Klarte ikke å lagre iterasjonen. Vennligst prøv igjen"
msgid "Unable to save your changes. Please try again."
msgstr "Klarte ikke å lagre dine endringer. Vennligst prøv igjen."
msgid "Unable to save your preference"
-msgstr ""
+msgstr "Klarte ikke å lagre innstillingene dine"
msgid "Unable to schedule a pipeline to run immediately"
msgstr ""
@@ -35746,11 +36224,20 @@ msgstr "Kan ikke oppdatere dette eposet på dette tidspunktet."
msgid "Unable to update this issue at this time."
msgstr ""
+msgid "Unapprove a merge request"
+msgstr ""
+
+msgid "Unapprove the current merge request."
+msgstr ""
+
+msgid "Unapproved the current merge request."
+msgstr ""
+
msgid "Unarchive project"
msgstr "Opphev arkivering av prosjekt"
msgid "Unarchiving the project will restore its members' ability to make changes to it. The repository can be committed to, and issues, comments, and other entities can be created. %{strong_start}Once active, this project shows up in the search and on the dashboard.%{strong_end} %{link_start}Learn more.%{link_end}"
-msgstr ""
+msgstr "Å fjerne arkivering av prosjektet vil gjenopprette dens medlemmers evne til å gjøre endringer i det. Datalageret kan bli kodeinnsmettet til, og saker, kommentarer og andre enheter kan opprettes. %{strong_start}Når dette prosjektet er aktivt, vises det i søket og på kontrollpanelet.%{strong_end} %{link_start}Lær mer.%{link_end}"
msgid "Unassign from commenting user"
msgstr ""
@@ -35758,16 +36245,13 @@ msgstr ""
msgid "Unassigned"
msgstr "Ikke tildelte"
-msgid "Unauthenticated API request rate limit"
+msgid "Unauthenticated API rate limit period in seconds"
msgstr ""
-msgid "Unauthenticated rate limit period in seconds"
-msgstr ""
-
-msgid "Unauthenticated request rate limit"
+msgid "Unauthenticated requests"
msgstr ""
-msgid "Unauthenticated requests"
+msgid "Unauthenticated web rate limit period in seconds"
msgstr ""
msgid "Undo"
@@ -35783,13 +36267,13 @@ msgid "Unexpected error"
msgstr "Uventet feil"
msgid "Unfollow"
-msgstr ""
+msgstr "Slutt å følge"
msgid "Unfortunately, your email message to GitLab could not be processed."
msgstr ""
msgid "Unhappy?"
-msgstr ""
+msgstr "Misfornøyd?"
msgid "Units|ms"
msgstr "ms"
@@ -35816,7 +36300,7 @@ msgid "Unknown response text"
msgstr "Ukjent responstekst"
msgid "Unknown user"
-msgstr ""
+msgstr "Ukjent bruker"
msgid "Unless otherwise agreed to in writing with GitLab, by clicking \"Upload License\" you agree that your use of GitLab Software is subject to the %{eula_link_start}Terms of Service%{eula_link_end}."
msgstr ""
@@ -35831,7 +36315,7 @@ msgid "Unlock"
msgstr "LÃ¥s opp"
msgid "Unlock account"
-msgstr ""
+msgstr "LÃ¥s opp konto"
msgid "Unlock the discussion"
msgstr "LÃ¥s opp diskusjonen"
@@ -35855,7 +36339,7 @@ msgid "Unmarks this %{noun} as a draft."
msgstr ""
msgid "Unreachable"
-msgstr ""
+msgstr "Utilgjengelig"
msgid "Unrecognized cluster type"
msgstr "Klyngetypen ble ikke gjenkjent"
@@ -35869,18 +36353,6 @@ msgstr "Uoppklar tråden"
msgid "Unresolved"
msgstr "Uoppklart"
-msgid "UnscannedProjects|15 or more days"
-msgstr "15 eller flere dager"
-
-msgid "UnscannedProjects|30 or more days"
-msgstr "30 eller flere dager"
-
-msgid "UnscannedProjects|5 or more days"
-msgstr "5 eller flere dager"
-
-msgid "UnscannedProjects|60 or more days"
-msgstr "60 eller flere dager"
-
msgid "Unschedule job"
msgstr ""
@@ -35888,7 +36360,7 @@ msgid "Unstar"
msgstr "Fjern stjerne"
msgid "Unstarted"
-msgstr ""
+msgstr "Ikke påbegynt"
msgid "Unsubscribe"
msgstr "Avabonner"
@@ -35918,7 +36390,7 @@ msgid "Until revoked, expired personal access tokens pose a security risk."
msgstr ""
msgid "Unused"
-msgstr ""
+msgstr "Ubrukte"
msgid "Unused, previous indices: %{index_names} will be deleted after %{time} automatically."
msgstr ""
@@ -35942,7 +36414,7 @@ msgid "Update %{sourcePath} file"
msgstr "Oppdater %{sourcePath}-filen"
msgid "Update Now"
-msgstr ""
+msgstr "Oppdater nå"
msgid "Update Scheduled…"
msgstr ""
@@ -35969,10 +36441,10 @@ msgid "Update it"
msgstr "Oppdater den"
msgid "Update iteration"
-msgstr ""
+msgstr "Oppdater iterasjon"
msgid "Update milestone"
-msgstr ""
+msgstr "Oppdater milepæl"
msgid "Update now"
msgstr "Oppdater nå"
@@ -36023,22 +36495,22 @@ msgid "Updating"
msgstr "Oppdaterer"
msgid "Updating…"
-msgstr ""
+msgstr "Oppdaterer …"
msgid "Upgrade offers available!"
-msgstr ""
+msgstr "Oppgraderingstilbud er tilgjengelige!"
msgid "Upgrade your plan"
msgstr "Oppgrader planen din"
msgid "Upload"
-msgstr ""
+msgstr "Last opp"
msgid "Upload CSV file"
msgstr "Last opp CSV-fil"
msgid "Upload File"
-msgstr ""
+msgstr "Last opp fil"
msgid "Upload License"
msgstr "Last opp lisens"
@@ -36053,16 +36525,16 @@ msgid "Upload a private key for your certificate"
msgstr "Last opp en privat nøkkel til sertifikatet ditt"
msgid "Upload an image"
-msgstr ""
+msgstr "Last opp et bilde"
msgid "Upload file"
msgstr "Last opp fil"
msgid "Upload image"
-msgstr ""
+msgstr "Last opp bilde"
msgid "Upload license"
-msgstr ""
+msgstr "Last opp lisens"
msgid "Upload object map"
msgstr "Last opp objektkart"
@@ -36092,7 +36564,7 @@ msgid "Usage"
msgstr "Bruk"
msgid "Usage Trends"
-msgstr ""
+msgstr "Brukstrender"
msgid "Usage statistics"
msgstr "Bruksstatistikk"
@@ -36100,6 +36572,9 @@ msgstr "Bruksstatistikk"
msgid "UsageQuota|%{help_link_start}Shared runners%{help_link_end} are disabled, so there are no limits set on pipeline usage"
msgstr ""
+msgid "UsageQuota|%{linkTitle} help link"
+msgstr ""
+
msgid "UsageQuota|%{percentageLeft} of purchased storage is available"
msgstr ""
@@ -36109,18 +36584,33 @@ msgstr "Artifakter"
msgid "UsageQuota|Artifacts is a sum of build and pipeline artifacts."
msgstr ""
+msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
+msgstr ""
+
msgid "UsageQuota|Buy additional minutes"
msgstr "Kjøp ekstra minutter"
msgid "UsageQuota|CI minutes usage by month"
-msgstr ""
+msgstr "CI-minuttbruk per måned"
msgid "UsageQuota|CI minutes usage by project"
+msgstr "CI-minuttbruk per prosjekt"
+
+msgid "UsageQuota|Code packages and container images."
msgstr ""
msgid "UsageQuota|Current period usage"
msgstr "Bruk i nåværende periode"
+msgid "UsageQuota|File attachments and smaller design graphics."
+msgstr ""
+
+msgid "UsageQuota|Git repository, managed by the Gitaly service."
+msgstr ""
+
+msgid "UsageQuota|Includes project registry, artifacts, packages, wiki, uploads and other items."
+msgstr ""
+
msgid "UsageQuota|Increase storage temporarily"
msgstr ""
@@ -36131,14 +36621,17 @@ msgid "UsageQuota|LFS Storage"
msgstr "LFS-lagring"
msgid "UsageQuota|Learn more about excess storage usage"
-msgstr ""
+msgstr "Lær mer om overflødig lagringsbenyttelse"
msgid "UsageQuota|Learn more about usage quotas"
-msgstr ""
+msgstr "Lær mer om brukskvoter"
msgid "UsageQuota|Packages"
msgstr "Pakker"
+msgid "UsageQuota|Pipeline artifacts and job artifacts, created with CI/CD."
+msgstr ""
+
msgid "UsageQuota|Pipelines"
msgstr "Rørledninger"
@@ -36146,7 +36639,7 @@ msgid "UsageQuota|Purchase more storage"
msgstr "Kjøp mer lagringsplass"
msgid "UsageQuota|Purchased storage available"
-msgstr ""
+msgstr "Innkjøpt lagringsplass tilgjengelig"
msgid "UsageQuota|Repositories"
msgstr "Kodelagre"
@@ -36155,6 +36648,9 @@ msgid "UsageQuota|Repository"
msgstr "Kodelager"
msgid "UsageQuota|Seats"
+msgstr "Seter"
+
+msgid "UsageQuota|Shared bits of code and text."
msgstr ""
msgid "UsageQuota|Snippets"
@@ -36166,6 +36662,12 @@ msgstr ""
msgid "UsageQuota|Storage"
msgstr "Lagring"
+msgid "UsageQuota|Storage type"
+msgstr ""
+
+msgid "UsageQuota|There is a known issue with Artifact storage where the total could be incorrect for some projects. More details and progress are available in %{warningLinkStart}the epic%{warningLinkEnd}."
+msgstr ""
+
msgid "UsageQuota|This is the total amount of storage used across your projects within this namespace."
msgstr ""
@@ -36191,23 +36693,26 @@ msgid "UsageQuota|This project is near the free %{actualRepositorySizeLimit} lim
msgstr ""
msgid "UsageQuota|Total excess storage used"
-msgstr ""
+msgstr "Total mengde overflødig lagring brukt"
msgid "UsageQuota|Total namespace storage used"
-msgstr ""
+msgstr "Total mengde navneområde-lagring brukt"
msgid "UsageQuota|Unlimited"
msgstr "Ubegrenset"
msgid "UsageQuota|Uploads"
-msgstr ""
+msgstr "Opplastinger"
msgid "UsageQuota|Usage"
msgstr "Benyttelse"
-msgid "UsageQuota|Usage Quotas"
+msgid "UsageQuota|Usage Breakdown"
msgstr ""
+msgid "UsageQuota|Usage Quotas"
+msgstr "Brukskvoter"
+
msgid "UsageQuota|Usage of group resources across the projects in the %{strong_start}%{group_name}%{strong_end} group"
msgstr ""
@@ -36215,7 +36720,7 @@ msgid "UsageQuota|Usage of project resources across the %{strong_start}%{project
msgstr ""
msgid "UsageQuota|Usage of resources across your projects"
-msgstr ""
+msgstr "Ressursbruk på tvers av prosjektene dine"
msgid "UsageQuota|Usage quotas help link"
msgstr ""
@@ -36229,6 +36734,9 @@ msgstr ""
msgid "UsageQuota|Wiki"
msgstr "Wiki"
+msgid "UsageQuota|Wiki content."
+msgstr ""
+
msgid "UsageQuota|Wikis"
msgstr "Wikier"
@@ -36257,28 +36765,28 @@ msgid "UsageTrends|Could not load the projects and groups chart. Please refresh
msgstr ""
msgid "UsageTrends|Groups"
-msgstr ""
+msgstr "Grupper"
msgid "UsageTrends|Issues"
-msgstr ""
+msgstr "Saker"
msgid "UsageTrends|Issues & merge requests"
msgstr ""
msgid "UsageTrends|Items"
-msgstr ""
+msgstr "Gjenstander"
msgid "UsageTrends|Merge requests"
-msgstr ""
+msgstr "Fletteforespørsler"
msgid "UsageTrends|Month"
-msgstr ""
+msgstr "MÃ¥ned"
msgid "UsageTrends|No data available."
-msgstr ""
+msgstr "Ingen data tilgjengelig."
msgid "UsageTrends|Pipelines"
-msgstr ""
+msgstr "Rørledninger"
msgid "UsageTrends|Pipelines canceled"
msgstr ""
@@ -36296,7 +36804,7 @@ msgid "UsageTrends|Pipelines total"
msgstr ""
msgid "UsageTrends|Projects"
-msgstr ""
+msgstr "Prosjekter"
msgid "UsageTrends|There was an error fetching the cancelled pipelines. Please try again."
msgstr ""
@@ -36326,22 +36834,22 @@ msgid "UsageTrends|There was an error fetching the total pipelines. Please try a
msgstr ""
msgid "UsageTrends|Total groups"
-msgstr ""
+msgstr "Totalt antall grupper"
msgid "UsageTrends|Total projects"
-msgstr ""
+msgstr "Totalt antall prosjekter"
msgid "UsageTrends|Total projects & groups"
-msgstr ""
+msgstr "Totalt antall prosjekter og grupper"
msgid "UsageTrends|Users"
-msgstr ""
+msgstr "Brukere"
msgid "Use %{code_start}::%{code_end} to create a %{link_start}scoped label set%{link_end} (eg. %{code_start}priority::1%{code_end})"
msgstr ""
msgid "Use .gitlab-ci.yml"
-msgstr ""
+msgstr "Bruk .gitlab-ci.yml"
msgid "Use GitLab Runner in AWS"
msgstr ""
@@ -36353,7 +36861,7 @@ msgid "Use an AWS CloudFormation Template (CFT) to install and configure GitLab
msgstr ""
msgid "Use cURL"
-msgstr ""
+msgstr "Bruk cURL"
msgid "Use custom color #FF0000"
msgstr ""
@@ -36374,10 +36882,10 @@ msgid "Use primary email (%{email})"
msgstr ""
msgid "Use shortcuts"
-msgstr ""
+msgstr "Bruk snarveier"
msgid "Use slash commands."
-msgstr ""
+msgstr "Bruk skråstrekkommandoer."
msgid "Use template"
msgstr "Bruk mal"
@@ -36386,7 +36894,7 @@ msgid "Use the link below to confirm your email address (%{email})"
msgstr ""
msgid "Use the link below to confirm your email address."
-msgstr ""
+msgstr "Bruk lenken nedenfor for å bekrefte E-postadressen din."
msgid "Use the public cloud instance URL (%{kroki_public_url}) or %{install_link_start}install Kroki%{install_link_end} on your own infrastructure and use your own instance URL."
msgstr ""
@@ -36407,7 +36915,7 @@ msgid "Use your smart card to authenticate with the LDAP server."
msgstr ""
msgid "Used"
-msgstr ""
+msgstr "Brukt"
msgid "Used by members to sign in to your group in GitLab"
msgstr ""
@@ -36440,12 +36948,15 @@ msgid "User ID"
msgstr "Brukerens ID"
msgid "User OAuth applications"
-msgstr ""
+msgstr "Brukerens OAuth-programmer"
msgid "User Settings"
msgstr "Brukerinnstillinger"
-msgid "User and IP Rate Limits"
+msgid "User and IP rate limits"
+msgstr ""
+
+msgid "User does not have a pending request"
msgstr ""
msgid "User identity was successfully created."
@@ -36461,7 +36972,7 @@ msgid "User is not allowed to resolve thread"
msgstr "Brukeren har ikke tillatelse til å oppklare tråden"
msgid "User key"
-msgstr ""
+msgstr "Brukernøkkel"
msgid "User key was successfully removed."
msgstr "Brukernøkkelen ble vellykket fjernet."
@@ -36500,13 +37011,13 @@ msgid "User-based escalation rules must have a user with access to the project"
msgstr ""
msgid "UserAvailability|%{author} %{spanStart}(Busy)%{spanEnd}"
-msgstr ""
+msgstr "%{author} %{spanStart}(opptatt)%{spanEnd}"
msgid "UserAvailability|%{author} (Busy)"
-msgstr ""
+msgstr "%{author} (opptatt)"
msgid "UserAvailability|(Busy)"
-msgstr ""
+msgstr "(Opptatt)"
msgid "UserLists|Add"
msgstr "Legg til"
@@ -36554,7 +37065,7 @@ msgid "UserLists|New list"
msgstr "Ny liste"
msgid "UserLists|New user list"
-msgstr ""
+msgstr "Ny brukerliste"
msgid "UserLists|Save"
msgstr "Lagre"
@@ -36572,7 +37083,7 @@ msgid "UserLists|User IDs"
msgstr "Bruker-ID-er"
msgid "UserLists|User Lists"
-msgstr ""
+msgstr "Brukerlister"
msgid "UserLists|User lists allow you to define a set of users to use with Feature Flags."
msgstr ""
@@ -36584,7 +37095,7 @@ msgid "UserList|created %{timeago}"
msgstr "opprettet %{timeago}"
msgid "UserProfile|(Busy)"
-msgstr ""
+msgstr "(Opptatt)"
msgid "UserProfile|Activity"
msgstr "Aktivitet"
@@ -36596,7 +37107,7 @@ msgid "UserProfile|Blocked user"
msgstr "Blokkert user"
msgid "UserProfile|Bot activity"
-msgstr ""
+msgstr "Bot-aktivitet"
msgid "UserProfile|Contributed projects"
msgstr "Bidratte prosjekter"
@@ -36608,10 +37119,10 @@ msgid "UserProfile|Explore public groups to find projects to contribute to."
msgstr "Utforsk offentlige grupper for å finne prosjekter å bidra til."
msgid "UserProfile|Followers"
-msgstr ""
+msgstr "Følgere"
msgid "UserProfile|Following"
-msgstr ""
+msgstr "Følger"
msgid "UserProfile|Groups"
msgstr "Grupper"
@@ -36635,13 +37146,13 @@ msgid "UserProfile|Personal projects"
msgstr "Personlige prosjekter"
msgid "UserProfile|Pronounced as: %{pronunciation}"
-msgstr ""
+msgstr "Uttalt som: %{pronunciation}"
msgid "UserProfile|Report abuse"
msgstr "Rapporter misbruk"
msgid "UserProfile|Retry"
-msgstr ""
+msgstr "Prøv igjen"
msgid "UserProfile|Snippets"
msgstr "Utdrag"
@@ -36680,7 +37191,7 @@ msgid "UserProfile|This user isn't following other users."
msgstr ""
msgid "UserProfile|Unconfirmed user"
-msgstr ""
+msgstr "Ubekreftet bruker"
msgid "UserProfile|View all"
msgstr "Vis alle"
@@ -36713,7 +37224,7 @@ msgid "UserProfile|made a private contribution"
msgstr "gjorde et privat bidrag"
msgid "Username"
-msgstr ""
+msgstr "Brukernavn"
msgid "Username (for password-protected Elasticsearch servers)"
msgstr ""
@@ -36731,22 +37242,25 @@ msgid "Username or email"
msgstr "Brukernavn eller E-postadresse"
msgid "Username:"
-msgstr ""
+msgstr "Brukernavn:"
msgid "Username: %{username}"
-msgstr ""
+msgstr "Brukernavn: %{username}"
msgid "Users"
msgstr "Brukere"
msgid "Users can launch a development environment from a GitLab browser tab when the %{linkStart}Gitpod%{linkEnd} integration is enabled."
+msgstr "Brukere kan starte opp et utviklingsmiljø fra en GitLab-nettleserfane hvis %{linkStart}Gitpod%{linkEnd}-integrasjonen er skrudd på."
+
+msgid "Users can reactivate their account by signing in."
msgstr ""
msgid "Users can render diagrams in AsciiDoc, Markdown, reStructuredText, and Textile documents using Kroki."
msgstr ""
msgid "Users in License"
-msgstr ""
+msgstr "Brukere i lisensen"
msgid "Users or groups set as approvers in the project's or merge request's settings."
msgstr "Brukere eller grupper som er angitt som godkjennere i innstillingene til prosjektet eller fletteforespørselen."
@@ -36757,6 +37271,9 @@ msgstr ""
msgid "Users requesting access to"
msgstr "Brukere som ber om tilgang til"
+msgid "Users to exclude from the rate limit"
+msgstr ""
+
msgid "Users were successfully added."
msgstr "Brukerne ble vellykket lagt til."
@@ -36778,6 +37295,9 @@ msgstr ""
msgid "UsersSelect|Unassigned"
msgstr "Utildelt"
+msgid "Uses GitLab as a lightweight alternative to Sentry."
+msgstr ""
+
msgid "Using %{code_start}::%{code_end} denotes a %{link_start}scoped label set%{link_end}"
msgstr ""
@@ -36808,10 +37328,7 @@ msgstr "Verdistrøm-analyse"
msgid "Value Stream Analytics can help you determine your team’s velocity"
msgstr ""
-msgid "Value Stream Analytics gives an overview of how much time it takes to go from idea to production in your project."
-msgstr ""
-
-msgid "Value may contain a variable reference"
+msgid "Value might contain a variable reference"
msgstr ""
msgid "Value stream"
@@ -36824,22 +37341,22 @@ msgid "ValueStreamAnalytics|%{stageCount}+ items"
msgstr ""
msgid "ValueStreamAnalytics|%{value}M"
-msgstr ""
+msgstr "%{value}mnd"
msgid "ValueStreamAnalytics|%{value}d"
-msgstr ""
+msgstr "%{value}d"
msgid "ValueStreamAnalytics|%{value}h"
-msgstr ""
+msgstr "%{value}t"
msgid "ValueStreamAnalytics|%{value}m"
-msgstr ""
+msgstr "%{value}m"
msgid "ValueStreamAnalytics|%{value}w"
-msgstr ""
+msgstr "%{value}u"
msgid "ValueStreamAnalytics|&lt;1m"
-msgstr ""
+msgstr "&lt;1m"
msgid "ValueStreamAnalytics|Average number of deployments to production per day."
msgstr ""
@@ -36869,20 +37386,20 @@ msgid "ValueStreamEvent|Stage time (median)"
msgstr ""
msgid "ValueStreamEvent|Start"
-msgstr ""
+msgstr "Start"
msgid "ValueStreamEvent|Stop"
-msgstr ""
+msgstr "Stopp"
msgid "ValueStream|The Default Value Stream cannot be deleted"
msgstr "Standardverdistrømmen kan ikke bli slettet"
+msgid "Values that contain the %{codeStart}$%{codeEnd} character can be considered a variable reference and expanded. %{docsLinkStart}Learn more.%{docsLinkEnd}"
+msgstr ""
+
msgid "Variable"
msgstr "Variabel"
-msgid "Variable references indicated by %{codeStart}$%{codeEnd} may be expanded. If this is not what you want, consider %{docsLinkStart}using a workaround to prevent expansion%{docsLinkEnd}."
-msgstr ""
-
msgid "Variable will be masked in job logs."
msgstr "Variabelen vil bli maskert i jobbloggføringene."
@@ -36890,7 +37407,7 @@ msgid "Variables"
msgstr "Variabler"
msgid "Variables can be:"
-msgstr ""
+msgstr "Variabler kan være:"
msgid "Variables store information, like passwords and secret keys, that you can use in job scripts."
msgstr ""
@@ -36920,7 +37437,7 @@ msgid "Verify SAML Configuration"
msgstr "Verifiser SAML-oppsettet"
msgid "Verify code"
-msgstr ""
+msgstr "Verifiser koden"
msgid "Verify configuration"
msgstr "Verifiser oppsettet"
@@ -36976,7 +37493,7 @@ msgid "View eligible approvers"
msgstr "Vis kvalifiserte godkjennere"
msgid "View epics list"
-msgstr ""
+msgstr "Vis epos-liste"
msgid "View exposed artifact"
msgid_plural "View %d exposed artifacts"
@@ -37029,13 +37546,13 @@ msgid "View log"
msgstr "Vis loggbok"
msgid "View logs"
-msgstr ""
+msgstr "Vis loggføringer"
msgid "View merge request"
msgstr "Vis fletteforespørsel"
msgid "View on %{url}"
-msgstr ""
+msgstr "Vis på %{url}"
msgid "View open merge request"
msgstr "Vis åpne fletteforespørsler"
@@ -37057,14 +37574,14 @@ msgstr "Vis prosjektstempler"
msgid "View public GPG key"
msgid_plural "View public GPG keys"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "Vis offentlig GPG-nøkkel"
+msgstr[1] "Vis offentlige GPG-nøkler"
msgid "View replaced file @ "
msgstr "Vis erstattet fil @ "
msgid "View setting"
-msgstr ""
+msgstr "Vis innstilling"
msgid "View supported languages and frameworks"
msgstr ""
@@ -37079,13 +37596,13 @@ msgid "View the performance dashboard at"
msgstr ""
msgid "View usage details"
-msgstr ""
+msgstr "Vis bruksdetaljer"
msgid "View users statistics"
msgstr ""
msgid "Viewed"
-msgstr ""
+msgstr "Vist"
msgid "Viewing commit"
msgstr "Viser commit"
@@ -37127,10 +37644,10 @@ msgid "Visit settings page"
msgstr "GÃ¥ til innstillingssiden"
msgid "Visual Studio Code (HTTPS)"
-msgstr ""
+msgstr "Visual Studio Code (HTTPS)"
msgid "Visual Studio Code (SSH)"
-msgstr ""
+msgstr "Visual Studio Code (SSH)"
msgid "Vulnerabilities"
msgstr "SÃ¥rbarheter"
@@ -37184,7 +37701,7 @@ msgid "VulnerabilityManagement|Create Jira issue"
msgstr ""
msgid "VulnerabilityManagement|Detected"
-msgstr ""
+msgstr "Oppdaget"
msgid "VulnerabilityManagement|Needs triage"
msgstr ""
@@ -37229,7 +37746,7 @@ msgid "VulnerabilityManagement|invalid issue link or ID"
msgstr "ugyldig sakslenke eller ID"
msgid "VulnerabilityStatusTypes|All statuses"
-msgstr ""
+msgstr "Alle statuser"
msgid "VulnerabilityStatusTypes|Confirmed"
msgstr "Bekreftet"
@@ -37247,16 +37764,16 @@ msgid "Vulnerability|%{scannerName} (version %{scannerVersion})"
msgstr "%{scannerName} (versjon %{scannerVersion})"
msgid "Vulnerability|Activity"
-msgstr ""
+msgstr "Aktivitet"
msgid "Vulnerability|Actual Response"
-msgstr ""
+msgstr "Faktisk respons"
msgid "Vulnerability|Actual received response is the one received when this fault was detected"
msgstr ""
msgid "Vulnerability|Additional Info"
-msgstr ""
+msgstr "Ytterligere info"
msgid "Vulnerability|Class"
msgstr "Klasse"
@@ -37271,20 +37788,23 @@ msgid "Vulnerability|Crash state"
msgstr ""
msgid "Vulnerability|Crash type"
-msgstr ""
+msgstr "Krasjtype"
msgid "Vulnerability|Description"
msgstr "Beskrivelse"
msgid "Vulnerability|Detected"
-msgstr ""
+msgstr "Oppdaget"
msgid "Vulnerability|Download"
-msgstr ""
+msgstr "Last ned"
msgid "Vulnerability|Evidence"
msgstr "Bevis"
+msgid "Vulnerability|False positive detected"
+msgstr ""
+
msgid "Vulnerability|File"
msgstr "File"
@@ -37313,7 +37833,7 @@ msgid "Vulnerability|Reproduction Assets"
msgstr ""
msgid "Vulnerability|Request"
-msgstr ""
+msgstr "Forespørsel"
msgid "Vulnerability|Request/Response"
msgstr ""
@@ -37327,17 +37847,20 @@ msgstr "Alvorlighetsgrad"
msgid "Vulnerability|Status"
msgstr "Status"
+msgid "Vulnerability|The scanner determined this vulnerability to be a false positive. Verify the evaluation before changing its status. %{linkStart}Learn more about false positive detection.%{linkEnd}"
+msgstr ""
+
msgid "Vulnerability|The unmodified response is the original response that had no mutations done to the request"
msgstr ""
msgid "Vulnerability|Tool"
-msgstr ""
+msgstr "Verktøy"
msgid "Vulnerability|Unmodified Response"
msgstr ""
msgid "WARNING:"
-msgstr ""
+msgstr "ADVARSEL:"
msgid "Wait for the file to load to copy its contents"
msgstr ""
@@ -37352,7 +37875,7 @@ msgid "Want to see the data? Please ask an administrator for access."
msgstr "Ønsker du å se dataene? Vennligst kontakt en administrator for å få tilgang."
msgid "Warning"
-msgstr ""
+msgstr "Advarsel"
msgid "Warning:"
msgstr "Advarsel:"
@@ -37379,13 +37902,13 @@ msgid "We could not determine the path to remove the issue"
msgstr ""
msgid "We couldn't find any %{scope} matching %{term}"
-msgstr ""
+msgstr "Vi fant ingen %{scope} som samsvarer med %{term}"
msgid "We couldn't find any %{scope} matching %{term} in group %{group}"
-msgstr ""
+msgstr "Vi fant ingen %{scope} som samsvarer med %{term} i gruppen %{group}"
msgid "We couldn't find any %{scope} matching %{term} in project %{project}"
-msgstr ""
+msgstr "Vi fant ingen %{scope} som samsvarer med %{term} i prosjektet %{project}"
msgid "We couldn't reach the Prometheus server. Either the server no longer exists or the configuration details need updating."
msgstr ""
@@ -37460,10 +37983,10 @@ msgid "WebAuthn only works with HTTPS-enabled websites. Contact your administrat
msgstr ""
msgid "WebIDE|Fork project"
-msgstr ""
+msgstr "Avgrein prosjekt"
msgid "WebIDE|Go to fork"
-msgstr ""
+msgstr "GÃ¥ til utgreiningen"
msgid "WebIDE|Merge request"
msgstr "Fletteforespørsel"
@@ -37529,7 +38052,7 @@ msgid "Webhooks|Feature flag events"
msgstr ""
msgid "Webhooks|Issues events"
-msgstr ""
+msgstr "Sakshendelser"
msgid "Webhooks|Job events"
msgstr "Jobb-hendelser"
@@ -37538,10 +38061,10 @@ msgid "Webhooks|Member events"
msgstr ""
msgid "Webhooks|Merge request events"
-msgstr ""
+msgstr "Fletteforespørselshendelser"
msgid "Webhooks|Pipeline events"
-msgstr ""
+msgstr "Rørledningshendelser"
msgid "Webhooks|Push events"
msgstr "Pushhendelser"
@@ -37553,10 +38076,10 @@ msgid "Webhooks|SSL verification"
msgstr "SSL-verifisering"
msgid "Webhooks|Secret token"
-msgstr ""
+msgstr "Hemmelig sjetong"
msgid "Webhooks|Subgroup events"
-msgstr ""
+msgstr "Undergruppehendelser"
msgid "Webhooks|Tag push events"
msgstr ""
@@ -37619,10 +38142,10 @@ msgid "Webhooks|Use this token to validate received payloads. It is sent with th
msgstr ""
msgid "Webhooks|Wiki page events"
-msgstr ""
+msgstr "Wiki-sidehendelser"
msgid "Website:"
-msgstr ""
+msgstr "Nettsted:"
msgid "Wednesday"
msgstr "Onsdag"
@@ -37651,11 +38174,8 @@ msgstr "Velkommen til GitLab, %{first_name}!"
msgid "Welcome to GitLab,%{br_tag}%{name}!"
msgstr ""
-msgid "Welcome to the guided GitLab tour"
-msgstr "Velkommen til den guidede GitLab-turen"
-
msgid "Welcome, %{name}!"
-msgstr ""
+msgstr "Velkommen, %{name}!"
msgid "What are group audit events?"
msgstr ""
@@ -37672,9 +38192,6 @@ msgstr ""
msgid "What are you searching for?"
msgstr "Hva leter du etter?"
-msgid "What describes you best?"
-msgstr "Hva beskriver deg best?"
-
msgid "What does this command do?"
msgstr ""
@@ -37682,7 +38199,7 @@ msgid "What is Auto DevOps?"
msgstr ""
msgid "What is Markdown?"
-msgstr ""
+msgstr "Hva er Markdown?"
msgid "What is repository mirroring?"
msgstr ""
@@ -37691,19 +38208,19 @@ msgid "What is squashing?"
msgstr ""
msgid "What is time tracking?"
-msgstr ""
+msgstr "Hva er tidssporing?"
msgid "What is your job title? (optional)"
+msgstr "Hva er jobbtittelen din? (valgfritt)"
+
+msgid "What templates can I create?"
msgstr ""
msgid "What will you use this group for?"
msgstr ""
msgid "What's new"
-msgstr ""
-
-msgid "What’s your experience level?"
-msgstr "Hva er ditt erfaringsnivå?"
+msgstr "Hva er nytt"
msgid "When a deployment job is successful, skip older deployment jobs that are still pending."
msgstr ""
@@ -37714,6 +38231,9 @@ msgstr ""
msgid "When an event in GitLab triggers a webhook, you can use the request details to figure out if something went wrong."
msgstr ""
+msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+msgstr ""
+
msgid "When inactive, an external authentication provider must be used."
msgstr ""
@@ -37737,11 +38257,14 @@ msgstr ""
msgid "When:"
msgstr "NÃ¥r:"
+msgid "Which API requests are affected?"
+msgstr ""
+
msgid "While it's rare to have no vulnerabilities, it can happen. In any event, we ask that you please double check your settings to make sure you've set up your dashboard correctly."
msgstr ""
msgid "Who can approve?"
-msgstr ""
+msgstr "Hvem kan godkjenne?"
msgid "Who can see this group?"
msgstr "Hvem kan se denne gruppen?"
@@ -37879,40 +38402,40 @@ msgid "WikiPage|Are you sure you want to switch back to the classic editor?"
msgstr ""
msgid "WikiPage|Cancel"
-msgstr ""
+msgstr "Avbryt"
msgid "WikiPage|Commit message"
-msgstr ""
+msgstr "Commit-beskjed"
msgid "WikiPage|Content"
-msgstr ""
+msgstr "Innhold"
msgid "WikiPage|Create %{pageTitle}"
msgstr ""
msgid "WikiPage|Create page"
-msgstr ""
+msgstr "Opprett side"
msgid "WikiPage|Format"
-msgstr ""
+msgstr "Format"
msgid "WikiPage|Get a richer editing experience"
msgstr ""
msgid "WikiPage|Keep editing"
-msgstr ""
+msgstr "Fortsett å redigere"
msgid "WikiPage|More Information."
-msgstr ""
+msgstr "Mer informasjon."
msgid "WikiPage|Page title"
-msgstr ""
+msgstr "Sidetittel"
msgid "WikiPage|Retry"
-msgstr ""
+msgstr "Prøv igjen"
msgid "WikiPage|Save changes"
-msgstr ""
+msgstr "Lagre endringer"
msgid "WikiPage|Switch me back to the classic editor."
msgstr ""
@@ -37933,7 +38456,7 @@ msgid "WikiPage|Tip: You can specify the full path for the new file. We will aut
msgstr ""
msgid "WikiPage|Title"
-msgstr ""
+msgstr "Tittel"
msgid "WikiPage|To link to a (new) page, simply type %{linkExample}. More examples are in the %{linkStart}documentation%{linkEnd}."
msgstr ""
@@ -37942,13 +38465,13 @@ msgid "WikiPage|Try the new visual Markdown editor. Read the %{linkStart}documen
msgstr ""
msgid "WikiPage|Try this later"
-msgstr ""
+msgstr "Prøv dette senere"
msgid "WikiPage|Update %{pageTitle}"
msgstr ""
msgid "WikiPage|Use the new editor"
-msgstr ""
+msgstr "Bruk den nye redigereren"
msgid "WikiPage|Write your content or drag files here…"
msgstr ""
@@ -38016,6 +38539,9 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|Work Items"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -38047,7 +38573,7 @@ msgid "Wrong extern UID provided. Make sure Auth0 is configured correctly."
msgstr ""
msgid "Xcode"
-msgstr ""
+msgstr "Xcode"
msgid "YYYY-MM-DD"
msgstr ""
@@ -38091,6 +38617,9 @@ msgstr "Du er i ferd med å overføre kontrollen over kontoen din til %{group_na
msgid "You are already a member of this %{member_source}."
msgstr ""
+msgid "You are already impersonating another user"
+msgstr ""
+
msgid "You are an admin, which means granting access to %{client_name} will allow them to interact with GitLab as an admin as well. Proceed with caution."
msgstr ""
@@ -38193,6 +38722,9 @@ msgstr "Du kan ogsÃ¥ laste opp eksisterende filer fra datamaskinen din ved Ã¥ fÃ
msgid "You can also use project access tokens with Git to authenticate over HTTP(S). %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "You can always change your URL later"
+msgstr ""
+
msgid "You can always edit this later"
msgstr "Du kan alltid redigere dette senere"
@@ -38349,10 +38881,10 @@ msgstr ""
msgid "You can’t %{tag_start}edit%{tag_end} files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
-msgid "You could not create a new trigger."
+msgid "You can’t edit files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
-msgid "You didn't renew your subscription for %{strong}%{namespace_name}%{strong_close} so it was downgraded to the free plan."
+msgid "You could not create a new trigger."
msgstr ""
msgid "You do not have any subscriptions yet"
@@ -38520,6 +39052,12 @@ msgstr "Du må oppgi et gjeldende gyldig passord"
msgid "You must provide your current password in order to change it."
msgstr "Du må oppgi ditt nåværende passord for å kunne endre den."
+msgid "You must sign in to search for specific projects."
+msgstr ""
+
+msgid "You must sign in to search for specific terms."
+msgstr ""
+
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
@@ -38547,6 +39085,9 @@ msgstr "Du må spesifisere både en tilgangssjetong og en verts-URL."
msgid "You need to upload a GitLab project export archive (ending in .gz)."
msgstr ""
+msgid "You need to verify your primary email first before enabling Two-Factor Authentication."
+msgstr ""
+
msgid "You successfully declined the invitation"
msgstr ""
@@ -38635,19 +39176,19 @@ msgid "You're receiving this email because you have been assigned an item on %{h
msgstr ""
msgid "You're receiving this email because you have been mentioned on %{host}."
-msgstr ""
+msgstr "Du mottar denne E-posten fordi du har blitt nevnt i %{host}."
msgid "You've already enabled two-factor authentication using one time password authenticators. In order to register a different device, you must first disable two-factor authentication."
msgstr "Du har allerede aktivert 2-trinnsautentisering ved hjelp av éngangspassord-autentikatorer. For å kunne registrere en annen enhet, må du først deaktivere 2-trinnsautentisering."
msgid "You've rejected %{user}"
-msgstr ""
+msgstr "Du har avvist %{user}"
msgid "YouTube"
msgstr "YouTube"
msgid "YouTube URL or ID"
-msgstr ""
+msgstr "YouTube-URL eller -ID"
msgid "Your %{group} membership will now expire in %{days}."
msgstr ""
@@ -38655,12 +39196,12 @@ msgstr ""
msgid "Your %{host} account was signed in to from a new location"
msgstr ""
+msgid "Your %{strong}%{plan_name}%{strong_close} subscription expires on %{strong}%{expires_on}%{strong_close}. After that date, you cannot create issues or merge requests, or use many other features."
+msgstr ""
+
msgid "Your %{strong}%{plan_name}%{strong_close} subscription for %{strong}%{namespace_name}%{strong_close} will expire on %{strong}%{expires_on}%{strong_close}."
msgstr "Ditt %{strong}%{plan_name}%{strong_close} abonnement på %{strong}%{namespace_name}%{strong_close} vil utløpe den %{strong}%{expires_on}%{strong_close}."
-msgid "Your %{strong}%{plan_name}%{strong_close} subscription will expire on %{strong}%{expires_on}%{strong_close}. After that, you will not be able to create issues or merge requests as well as many other features."
-msgstr ""
-
msgid "Your CI/CD configuration syntax is invalid. View Lint tab for more details."
msgstr ""
@@ -38682,7 +39223,7 @@ msgstr ""
msgid "Your GPG keys (%{count})"
msgstr "Dine GPG-nøkler (%{count})"
-msgid "Your GitLab account has been locked due to an excessive amount of unsuccessful sign in attempts. Your account will automatically unlock in %{duration} or you may click the link below to unlock now."
+msgid "Your GitLab account has been locked due to an excessive number of unsuccessful sign in attempts. You can wait for your account to automatically unlock in %{duration} or you can click the link below to unlock now."
msgstr ""
msgid "Your GitLab account request has been approved!"
@@ -38704,13 +39245,13 @@ msgid "Your Projects' Activity"
msgstr ""
msgid "Your SSH key has expired"
-msgstr ""
+msgstr "SSH-nøkkelen din har utløpt"
msgid "Your SSH key is expiring soon."
-msgstr ""
+msgstr "SSH-nøkkelen din utløper snart."
msgid "Your SSH key was deleted"
-msgstr ""
+msgstr "SSH-nøkkelen din ble slettet"
msgid "Your SSH keys (%{count})"
msgstr "SSH-nøklene dine (%{count})"
@@ -38749,7 +39290,7 @@ msgid "Your account uses dedicated credentials for the \"%{group_name}\" group a
msgstr ""
msgid "Your action succeeded."
-msgstr ""
+msgstr "Handlingen din lyktes."
msgid "Your applications (%{size})"
msgstr "Dine applikasjoner (%{size})"
@@ -38793,6 +39334,9 @@ msgstr "Din kommentar vil bli forkastet."
msgid "Your commit email is used for web based operations, such as edits and merges."
msgstr ""
+msgid "Your current password is required to register a two-factor authenticator app."
+msgstr ""
+
msgid "Your dashboard has been copied. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
@@ -38863,7 +39407,7 @@ msgid "Your new SCIM token"
msgstr "Din nye SCIM-sjetong"
msgid "Your new comment"
-msgstr ""
+msgstr "Din nye kommentar"
msgid "Your new personal access token has been created."
msgstr ""
@@ -38892,6 +39436,9 @@ msgstr "Din profil"
msgid "Your project limit is %{limit} projects! Please contact your administrator to increase it"
msgstr "Prosjektgrensen din er %{limit} prosjekter! Kontakt administratoren din for å øke den"
+msgid "Your project will be created at:"
+msgstr ""
+
msgid "Your projects"
msgstr "Dine prosjekter"
@@ -38931,11 +39478,10 @@ msgstr ""
msgid "Your subscription expired!"
msgstr "Abonnementet ditt har utløpt!"
-msgid "Your subscription has been downgraded."
-msgstr "Abonnementet ditt har blitt nedgradert."
-
-msgid "Your subscription will expire in %{remaining_days}."
-msgstr ""
+msgid "Your subscription will expire in %{remaining_days} day."
+msgid_plural "Your subscription will expire in %{remaining_days} days."
+msgstr[0] ""
+msgstr[1] ""
msgid "Your username is %{username}."
msgstr ""
@@ -38944,7 +39490,7 @@ msgid "ZentaoIntegration|Base URL of the Zentao instance."
msgstr ""
msgid "ZentaoIntegration|Enter API token"
-msgstr ""
+msgstr "Skriv inn API-sjetong"
msgid "ZentaoIntegration|If different from Web URL."
msgstr ""
@@ -38997,13 +39543,13 @@ msgid "access:"
msgstr "tilgang:"
msgid "added"
-msgstr ""
+msgstr "lagt til"
msgid "added %{created_at_timeago}"
msgstr ""
msgid "added %{emails}"
-msgstr ""
+msgstr "la til %{emails}"
msgid "added a Zoom call to this issue"
msgstr ""
@@ -39051,7 +39597,7 @@ msgid "assign yourself"
msgstr "tildel deg selv"
msgid "at"
-msgstr ""
+msgstr "kl."
msgid "at risk"
msgstr "i faresonen"
@@ -39070,8 +39616,8 @@ msgstr "blokker"
msgid "branch"
msgid_plural "branches"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "gren"
+msgstr[1] "grener"
msgid "branch name"
msgstr "grennavn"
@@ -39080,13 +39626,13 @@ msgid "by"
msgstr "av"
msgid "cURL:"
-msgstr ""
+msgstr "cURL:"
msgid "can contain only letters of the Base64 alphabet (RFC4648) with the addition of '@', ':' and '.'"
msgstr ""
msgid "can contain only lowercase letters, digits, and '_'."
-msgstr ""
+msgstr "kan bare inneholde små bokstaver, sifre, og '_'."
msgid "can only be changed by a group admin."
msgstr ""
@@ -39104,7 +39650,7 @@ msgid "cannot be a date in the past"
msgstr ""
msgid "cannot be changed"
-msgstr ""
+msgstr "kan ikke endres"
msgid "cannot be changed if a personal project has container registry tags."
msgstr ""
@@ -39125,7 +39671,7 @@ msgid "cannot be enabled until a valid credit card is on file"
msgstr ""
msgid "cannot be modified"
-msgstr ""
+msgstr "kan ikke modifiseres"
msgid "cannot block others"
msgstr ""
@@ -39142,6 +39688,9 @@ msgstr "kan ikke selv bli blokkert"
msgid "cannot merge"
msgstr "kan ikke flette"
+msgid "cannot not be used for user namespace"
+msgstr ""
+
msgid "ciReport|%{degradedNum} degraded"
msgstr "%{degradedNum} degradert"
@@ -39200,7 +39749,7 @@ msgid "ciReport|All severities"
msgstr "Alle alvorlighetsgrader"
msgid "ciReport|All tools"
-msgstr ""
+msgstr "Alle verktøy"
msgid "ciReport|Automatically apply the patch in a new branch"
msgstr ""
@@ -39370,13 +39919,13 @@ msgid "ciReport|View full report"
msgstr "Vis fullstendig rapport"
msgid "ciReport|is loading"
-msgstr ""
+msgstr "laster inn"
msgid "ciReport|is loading, errors when loading results"
msgstr ""
msgid "closed"
-msgstr ""
+msgstr "lukket"
msgid "closed issue"
msgstr "lukket saksrapport"
@@ -39388,7 +39937,7 @@ msgid "codeQualityWalkthrough|Congrats! Your first pipeline is running %{emojiSt
msgstr ""
msgid "codeQualityWalkthrough|Got it"
-msgstr ""
+msgstr "Den er grei"
msgid "codeQualityWalkthrough|Let's start by creating a new CI file."
msgstr ""
@@ -39397,19 +39946,19 @@ msgid "codeQualityWalkthrough|Not sure how to fix your failed job? We have compi
msgstr ""
msgid "codeQualityWalkthrough|Read the documentation"
-msgstr ""
+msgstr "Les dokumentasjonen"
msgid "codeQualityWalkthrough|Something went wrong. %{emojiStart}thinking%{emojiEnd} Let's fix it."
msgstr ""
msgid "codeQualityWalkthrough|To begin with code quality, we first need to create a new CI file using our code editor. We added a code quality template in the code editor to help you get started %{emojiStart}wink%{emojiEnd} .%{lineBreak}Take some time to review the template, when you are ready, use the %{strongStart}commit changes%{strongEnd} button at the bottom of the page."
-msgstr ""
+msgstr "For å begynne med kodekvalitet må vi først opprette en ny CI-fil ved hjelp av koderedigereren vår. Vi la til en kodekvalitetsmal i koderedigereren for å hjelpe deg i gang %{emojiStart}wink%{emojiEnd} .%{lineBreak}Ta deg tid til å gå gjennom malen. Når du er klar, bruker du %{strongStart}Commit endringer%{strongEnd}-knappen nederst på siden."
msgid "codeQualityWalkthrough|Troubleshoot your code quality job"
msgstr ""
msgid "codeQualityWalkthrough|View the logs"
-msgstr ""
+msgstr "Vis loggbøkene"
msgid "codeQualityWalkthrough|Well done! You've just automated your code quality review. %{emojiStart}raised_hands%{emojiEnd}"
msgstr ""
@@ -39427,7 +39976,7 @@ msgid "comment"
msgstr "kommentar"
msgid "commented on %{link_to_project}"
-msgstr ""
+msgstr "kommenterte på %{link_to_project}"
msgid "commit %{commit_id}"
msgstr "commit %{commit_id}"
@@ -39465,9 +40014,12 @@ msgstr ""
msgid "created %{timeAgo}"
msgstr "opprettet %{timeAgo}"
-msgid "created by"
+msgid "created %{timeAgo} by %{author}"
msgstr ""
+msgid "created by"
+msgstr "laget av"
+
msgid "data"
msgstr "data"
@@ -39480,7 +40032,7 @@ msgstr[0] "dag"
msgstr[1] "dager"
msgid "days"
-msgstr ""
+msgstr "dager"
msgid "default branch"
msgstr "standardgren"
@@ -39509,9 +40061,6 @@ msgstr "eksisterer ikke"
msgid "does not have a supported extension. Only %{extension_list} are supported"
msgstr ""
-msgid "domain is not authorized for sign-up."
-msgstr ""
-
msgid "download it"
msgstr "last den ned"
@@ -39529,18 +40078,13 @@ msgstr ""
msgid "email '%{email}' is not a verified email."
msgstr ""
-msgid "email does not match the allowed domain of %{email_domains}"
-msgid_plural "email does not match the allowed domains: %{email_domains}"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "enabled"
msgstr "aktivert"
msgid "encrypted: needs to be a :required, :optional or :migrating!"
msgstr ""
-msgid "ending with MIME type format is not allowed."
+msgid "ending with a reserved file extension is not allowed."
msgstr ""
msgid "entries cannot be larger than 255 characters"
@@ -39564,6 +40108,9 @@ msgstr "feil"
msgid "estimateCommand|%{slash_command} overwrites the total estimated time."
msgstr ""
+msgid "example.com"
+msgstr ""
+
msgid "exceeds the limit of %{bytes} bytes"
msgstr "overgår grensen på %{bytes} bytes"
@@ -39594,7 +40141,7 @@ msgid "finding is not found or is already attached to a vulnerability"
msgstr ""
msgid "following"
-msgstr ""
+msgstr "følger"
msgid "for %{link_to_merge_request} with %{link_to_merge_request_source_branch}"
msgstr "for %{link_to_merge_request} med %{link_to_merge_request_source_branch}"
@@ -39612,10 +40159,7 @@ msgid "for this project"
msgstr "for dette prosjektet"
msgid "fork"
-msgstr ""
-
-msgid "fork this project"
-msgstr "utgrein dette prosjektet"
+msgstr "avgrein"
msgid "from"
msgstr "fra"
@@ -39625,6 +40169,9 @@ msgid_plural "from %d jobs"
msgstr[0] "fra %d jobb"
msgstr[1] "fra %d jobber"
+msgid "frontmatter"
+msgstr ""
+
msgid "group"
msgstr "gruppe"
@@ -39650,6 +40197,9 @@ msgid "has already been taken as Suite"
msgstr ""
msgid "has been completed."
+msgstr "har blitt fullført."
+
+msgid "has too deep level of nesting"
msgstr ""
msgid "help"
@@ -39659,7 +40209,7 @@ msgid "http:"
msgstr "http:"
msgid "http://www.example.com"
-msgstr ""
+msgstr "https://www.example.com"
msgid "https://bamboo.example.com"
msgstr ""
@@ -39668,7 +40218,7 @@ msgid "https://your-bitbucket-server"
msgstr "https://din-bitbucket-tjener"
msgid "i18n|%{language} (%{percent_translated}%% translated)"
-msgstr ""
+msgstr "%{language} (%{percent_translated}%% oversatt)"
msgid "image diff"
msgstr "bilde-diff"
@@ -39683,11 +40233,23 @@ msgid "import flow"
msgstr ""
msgid "in"
+msgstr "i"
+
+msgid "in Infrastructure :: Kubernetes clusters"
+msgstr ""
+
+msgid "in all GitLab"
+msgstr ""
+
+msgid "in group"
msgstr ""
msgid "in group %{link_to_group}"
msgstr "i gruppen %{link_to_group}"
+msgid "in project"
+msgstr ""
+
msgid "in project %{link_to_project}"
msgstr "i prosjektet %{link_to_project}"
@@ -39729,16 +40291,19 @@ msgstr ""
msgid "is not a valid X509 certificate."
msgstr "er ikke et gyldig X509-sertifikat."
-msgid "is not allowed since the group is not top-level group."
+msgid "is not allowed for sign-up."
msgstr ""
-msgid "is not allowed. Try again with a different email address, or contact your GitLab admin."
+msgid "is not allowed for this group."
msgstr ""
-msgid "is not allowed. We do not currently support project-level iterations"
+msgid "is not allowed for this project."
+msgstr ""
+
+msgid "is not allowed since the group is not top-level group."
msgstr ""
-msgid "is not from an allowed domain."
+msgid "is not allowed. We do not currently support project-level iterations"
msgstr ""
msgid "is not in the group enforcing Group Managed Account"
@@ -39748,10 +40313,10 @@ msgid "is not valid. The iteration group has to match the iteration cadence grou
msgstr ""
msgid "is read-only"
-msgstr ""
+msgstr "er skrivebeskyttet"
msgid "is too long (%{current_value}). The maximum size is %{max_size}."
-msgstr ""
+msgstr "er for lang (%{current_value}). Maksstørrelsen er %{max_size}."
msgid "is too long (maximum is %{count} characters)"
msgstr ""
@@ -39781,7 +40346,7 @@ msgid "it is stored as a job artifact"
msgstr ""
msgid "it is stored externally"
-msgstr ""
+msgstr "den lagres eksternt"
msgid "it is stored in LFS"
msgstr ""
@@ -39802,7 +40367,7 @@ msgid "latest"
msgstr "siste"
msgid "latest deployment"
-msgstr ""
+msgstr "seneste distribuering"
msgid "latest version"
msgstr "seneste versjon"
@@ -39831,6 +40396,9 @@ msgstr "låst av %{path_lock_user_name} %{created_at}"
msgid "log in"
msgstr "logg inn"
+msgid "managed"
+msgstr ""
+
msgid "manual"
msgstr "manual"
@@ -39855,7 +40423,7 @@ msgid "missing"
msgstr "mangler"
msgid "more information"
-msgstr ""
+msgstr "mere informasjon"
msgid "most recent deployment"
msgstr ""
@@ -39878,9 +40446,12 @@ msgstr ""
msgid "mrWidget| Please restore it or use a different %{missingBranchName} branch"
msgstr "Vennligst gjenopprett den eller bruk en annen %{missingBranchName}-fane"
-msgid "mrWidget|%{mergeError}."
+msgid "mrWidget|%{linkStart}Set up now%{linkEnd} to analyze your source code for known security vulnerabilities."
msgstr ""
+msgid "mrWidget|%{mergeError}."
+msgstr "%{mergeError}."
+
msgid "mrWidget|%{mergeError}. Try again."
msgstr ""
@@ -39924,7 +40495,7 @@ msgid "mrWidget|Approve"
msgstr "Godkjenn"
msgid "mrWidget|Approve additionally"
-msgstr ""
+msgstr "Godkjenn i tillegg"
msgid "mrWidget|Approved by"
msgstr "Godkjent av"
@@ -39933,10 +40504,10 @@ msgid "mrWidget|Are you adding technical debt or code vulnerabilities?"
msgstr ""
msgid "mrWidget|Cancel auto-merge"
-msgstr ""
+msgstr "Avbryt auto-innfletting"
msgid "mrWidget|Check out branch"
-msgstr ""
+msgstr "Sjekk ut grenen"
msgid "mrWidget|Checking if merge request can be merged…"
msgstr ""
@@ -39955,24 +40526,33 @@ msgstr "Lukket av"
msgid "mrWidget|Closes issue"
msgid_plural "mrWidget|Closes issues"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "Lukker saken"
+msgstr[1] "Lukker saker"
-msgid "mrWidget|Delete source branch"
+msgid "mrWidget|Create issue to resolve all threads"
msgstr ""
+msgid "mrWidget|Delete source branch"
+msgstr "Slett kildegrenen"
+
msgid "mrWidget|Deployment statistics are not available currently"
msgstr ""
msgid "mrWidget|Did not close"
msgstr "Lukket ikke"
+msgid "mrWidget|Dismiss"
+msgstr ""
+
msgid "mrWidget|Email patches"
msgstr "Send e-post ved programrettelser"
msgid "mrWidget|Failed to load deployment statistics"
msgstr ""
+msgid "mrWidget|Hide %{widget} details"
+msgstr ""
+
msgid "mrWidget|If the %{missingBranchName} branch exists in your local repository, you can merge this merge request manually using the command line"
msgstr ""
@@ -39986,7 +40566,7 @@ msgid "mrWidget|Loading deployment statistics"
msgstr ""
msgid "mrWidget|Mark as ready"
-msgstr ""
+msgstr "Merk som klar"
msgid "mrWidget|Members who can merge are allowed to add commits."
msgstr ""
@@ -40042,7 +40622,7 @@ msgid "mrWidget|More information"
msgstr "Mer informasjon"
msgid "mrWidget|Open in Gitpod"
-msgstr ""
+msgstr "Ã…pne i Gitpod"
msgid "mrWidget|Open in Web IDE"
msgstr "Ã…pne i nett-IDE"
@@ -40068,9 +40648,6 @@ msgstr ""
msgid "mrWidget|Request to merge"
msgstr "Fletteforespørsel"
-msgid "mrWidget|Resolve all threads in new issue"
-msgstr ""
-
msgid "mrWidget|Resolve conflicts"
msgstr "Oppklar konflikter"
@@ -40086,6 +40663,9 @@ msgstr ""
msgid "mrWidget|Revoke approval"
msgstr "Trekk tilbake godkjennelse"
+msgid "mrWidget|SAST and Secret Detection is not enabled."
+msgstr ""
+
msgid "mrWidget|Set by %{merge_author} to be added to the merge train when the pipeline succeeds"
msgstr ""
@@ -40095,6 +40675,9 @@ msgstr ""
msgid "mrWidget|Set by %{merge_author} to start a merge train when the pipeline succeeds"
msgstr ""
+msgid "mrWidget|Show %{widget} details"
+msgstr ""
+
msgid "mrWidget|The changes were merged into"
msgstr "Endringene ble flettet inn i"
@@ -40107,6 +40690,9 @@ msgstr "Endringene vil bli flettet inn i"
msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure, or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
msgstr ""
+msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure."
+msgstr ""
+
msgid "mrWidget|The source branch has been deleted"
msgstr "Kildegrenen har blitt slettet"
@@ -40149,6 +40735,9 @@ msgstr "Bruk %{linkStart}CI-rørledninger til å teste koden%{linkEnd} ved å le
msgid "mrWidget|You can merge after removing denied licenses"
msgstr ""
+msgid "mrWidget|You can only merge once this merge request is approved."
+msgstr ""
+
msgid "mrWidget|Your password"
msgstr "Passordet ditt"
@@ -40159,7 +40748,7 @@ msgid "mrWidget|into"
msgstr "inni"
msgid "must be a Debian package"
-msgstr ""
+msgstr "må være en Debian-pakke"
msgid "must be a boolean value"
msgstr ""
@@ -40171,7 +40760,7 @@ msgid "must be a valid IPv4 or IPv6 address"
msgstr ""
msgid "must be after start"
-msgstr ""
+msgstr "må være etter starten"
msgid "must be an email you have verified"
msgstr ""
@@ -40185,14 +40774,17 @@ msgstr ""
msgid "must be less than the limit of %{tag_limit} tags"
msgstr ""
+msgid "must be set for a project namespace"
+msgstr ""
+
msgid "must be unique by status and elapsed time within a policy"
msgstr ""
msgid "my-awesome-group"
-msgstr ""
+msgstr "min-kule-gruppe"
msgid "my-channel"
-msgstr ""
+msgstr "min-kanal"
msgid "n/a"
msgstr "(ingen)"
@@ -40222,7 +40814,7 @@ msgid "no name set"
msgstr ""
msgid "no one can merge"
-msgstr ""
+msgstr "ingen kan slå sammen"
msgid "no scopes selected"
msgstr ""
@@ -40280,7 +40872,7 @@ msgid "pending comment"
msgstr "avventende kommentar"
msgid "pending deletion"
-msgstr ""
+msgstr "avventer sletting"
msgid "per day"
msgstr "per dag"
@@ -40294,6 +40886,9 @@ msgstr "sjetonger for personlig tilgang"
msgid "pipeline"
msgstr "rørledning"
+msgid "pipeline schedules documentation"
+msgstr ""
+
msgid "pod_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
msgstr ""
@@ -40335,12 +40930,15 @@ msgid "project bots cannot be added to other groups / projects"
msgstr ""
msgid "project is read-only"
-msgstr ""
+msgstr "prosjektet er skrivebeskyttet"
msgid "project members"
msgstr "prosjektmedlemmer"
msgid "project name"
+msgstr "prosjektnavn"
+
+msgid "project namespace cannot be the parent of another namespace"
msgstr ""
msgid "projects"
@@ -40349,10 +40947,16 @@ msgstr "prosjekter"
msgid "quick actions"
msgstr "hurtighandlinger"
-msgid "reCAPTCHA Private Key"
+msgid "reCAPTCHA"
+msgstr ""
+
+msgid "reCAPTCHA helps prevent credential stuffing."
+msgstr ""
+
+msgid "reCAPTCHA private key"
msgstr ""
-msgid "reCAPTCHA Site Key"
+msgid "reCAPTCHA site key"
msgstr ""
msgid "recent activity"
@@ -40374,13 +40978,13 @@ msgid "remove due date"
msgstr "fjern forfallsdato"
msgid "remove start date"
-msgstr ""
+msgstr "fjern startdato"
msgid "remove weight"
msgstr "fjern vektlegging"
msgid "removed"
-msgstr ""
+msgstr "fjernet"
msgid "removed a Zoom call from this issue"
msgstr ""
@@ -40397,7 +41001,7 @@ msgid "repository:"
msgstr "kodelager:"
msgid "required"
-msgstr ""
+msgstr "påkrevd"
msgid "reset it."
msgstr "tilbakestille den."
@@ -40430,13 +41034,13 @@ msgid "severity|Low"
msgstr "Lav"
msgid "severity|Major"
-msgstr ""
+msgstr "Stor"
msgid "severity|Medium"
msgstr "Medium"
msgid "severity|Minor"
-msgstr ""
+msgstr "Liten"
msgid "severity|None"
msgstr "Ingen"
@@ -40517,16 +41121,16 @@ msgid "tag name"
msgstr "etikettnavn"
msgid "the correct format."
-msgstr ""
+msgstr "det riktige formatet."
msgid "the file"
-msgstr ""
+msgstr "filen"
msgid "the following issue(s)"
msgstr "de(n) følgende sak(en)"
msgid "the wiki"
-msgstr ""
+msgstr "wikien"
msgid "then"
msgstr ""
@@ -40541,7 +41145,7 @@ msgid "this issue cannot be made public since it belongs to a confidential epic"
msgstr ""
msgid "time summary"
-msgstr ""
+msgstr "tidsoppsummering"
msgid "toggle collapse"
msgstr ""
@@ -40556,7 +41160,7 @@ msgid "two-factor authentication settings"
msgstr ""
msgid "type must be Debian"
-msgstr ""
+msgstr "typen må være Debian"
msgid "type parameter is missing and is required"
msgstr ""
@@ -40579,9 +41183,12 @@ msgstr "opplastinger"
msgid "user avatar"
msgstr "brukerens profilbilde"
-msgid "user preferences"
+msgid "user namespace cannot be the parent of another namespace"
msgstr ""
+msgid "user preferences"
+msgstr "brukerinnstillinger"
+
msgid "username"
msgstr "brukernavn"
@@ -40616,12 +41223,12 @@ msgid "view the source"
msgstr "vis kilden"
msgid "visibility"
-msgstr ""
+msgstr "synlighet"
msgid "vulnerability"
msgid_plural "vulnerabilities"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "sårbarhet"
+msgstr[1] "sårbarheter"
msgid "vulnerability|Add a comment"
msgstr "Legg til en kommentar"
@@ -40645,7 +41252,7 @@ msgid "vulnerability|Save comment"
msgstr "Lagre kommentar"
msgid "vulnerability|Undo dismiss"
-msgstr ""
+msgstr "Angre avvisning"
msgid "vulnerability|dismissed"
msgstr "avfeid"
@@ -40669,5 +41276,11 @@ msgid "yaml invalid"
msgstr "yaml er ugyldig"
msgid "your settings"
+msgstr "innstillingene dine"
+
+msgid "{group}"
+msgstr ""
+
+msgid "{project}"
msgstr ""
diff --git a/locale/nl_NL/gitlab.po b/locale/nl_NL/gitlab.po
index b6bf6282d8f..c52dc26a8f6 100644
--- a/locale/nl_NL/gitlab.po
+++ b/locale/nl_NL/gitlab.po
@@ -14,10 +14,7 @@ msgstr ""
"X-Crowdin-Language: nl\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-09-01 22:33\n"
-
-msgid " %{name}, confirm your email address now! "
-msgstr ""
+"PO-Revision-Date: 2021-10-04 20:22\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -92,6 +89,16 @@ msgstr ""
msgid "#general, #development"
msgstr ""
+msgid "%d Alert"
+msgid_plural "%d Alerts"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d Alert:"
+msgid_plural "%d Alerts:"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d Approval"
msgid_plural "%d Approvals"
msgstr[0] ""
@@ -455,8 +462,11 @@ msgstr ""
msgid "%{code_open}Protected:%{code_close} Only exposed to protected branches or tags."
msgstr ""
-msgid "%{commit_author_link} authored %{commit_timeago}"
-msgstr "%{commit_author_link} schreef %{commit_timeago}"
+msgid "%{commit_author_link} authored %{commit_authored_timeago}"
+msgstr ""
+
+msgid "%{commit_author_link} authored %{commit_authored_timeago} and %{commit_committer_avatar} %{commit_committer_link} committed %{commit_committer_timeago}"
+msgstr ""
msgid "%{completedCount} completed weight"
msgstr ""
@@ -549,6 +559,15 @@ msgstr ""
msgid "%{doc_link_start}Advanced search%{doc_link_end} is enabled."
msgstr ""
+msgid "%{docs_link_start}Learn about visibility levels.%{docs_link_end}"
+msgstr ""
+
+msgid "%{docs_link_start}What is Large File Storage?%{docs_link_end}"
+msgstr ""
+
+msgid "%{docs_link_start}What is two-factor authentication?%{docs_link_end}"
+msgstr ""
+
msgid "%{due_date} (Past due)"
msgstr ""
@@ -621,9 +640,6 @@ msgstr "%{issuableType} wordt verwijderd! Weet je het zeker?"
msgid "%{issueType} actions"
msgstr ""
-msgid "%{issuesCount} issues with a limit of %{maxIssueCount}"
-msgstr ""
-
msgid "%{issuesSize} with a limit of %{maxIssueCount}"
msgstr ""
@@ -681,6 +697,12 @@ msgstr ""
msgid "%{label_for_message} unavailable"
msgstr ""
+msgid "%{learn_more_link}."
+msgstr ""
+
+msgid "%{lessThan} 1 hour"
+msgstr ""
+
msgid "%{lets_encrypt_link_start}Let's Encrypt%{lets_encrypt_link_end} is a free, automated, and open certificate authority (CA) that issues digital certificates to enable HTTPS (SSL/TLS) for sites."
msgstr ""
@@ -693,15 +715,15 @@ msgstr ""
msgid "%{link_start}Learn more%{link_end} about roles."
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
-msgstr ""
-
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
msgstr ""
msgid "%{link_start}Start the title with %{draft_snippet}%{link_end} to prevent a merge request that is a work in progress from being merged before it's ready."
msgstr ""
+msgid "%{link_start}What information does GitLab Inc. collect?%{link_end}"
+msgstr ""
+
msgid "%{listToShow}, and %{awardsListLength} more"
msgstr ""
@@ -854,7 +876,7 @@ msgid_plural "%{securityScanner} results are not available because a pipeline ha
msgstr[0] ""
msgstr[1] ""
-msgid "%{service_ping_link_start}Learn more%{service_ping_link_end} about what information is shared with GitLab Inc."
+msgid "%{service_ping_link_start}What information is shared with GitLab Inc.?%{service_ping_link_end}"
msgstr ""
msgid "%{size} %{unit}"
@@ -890,6 +912,9 @@ msgstr ""
msgid "%{state} epics"
msgstr ""
+msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
+msgstr ""
+
msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
msgstr ""
@@ -949,11 +974,6 @@ msgstr ""
msgid "%{template_project_id} is unknown or invalid"
msgstr ""
-msgid "%{text} %{files}"
-msgid_plural "%{text} %{files} files"
-msgstr[0] "%{text}%{files}"
-msgstr[1] "%{text}%{files} bestanden"
-
msgid "%{text} is available"
msgstr "%{text} is beschikbaar"
@@ -1038,9 +1058,6 @@ msgstr ""
msgid "%{wildcards_link_start}Wildcards%{wildcards_link_end} such as %{code_tag_start}v*%{code_tag_end} or %{code_tag_start}*-release%{code_tag_end} are supported."
msgstr ""
-msgid "&lt; 1 hour"
-msgstr ""
-
msgid "'%{data}' at %{location} does not match format: %{format}"
msgstr ""
@@ -1124,9 +1141,6 @@ msgstr ""
msgid "(we need your current password to confirm your changes)"
msgstr ""
-msgid "* * * * *"
-msgstr ""
-
msgid "+ %{amount} more"
msgstr ""
@@ -1193,10 +1207,10 @@ msgstr "- toon minder"
msgid "."
msgstr ""
-msgid "0 bytes"
+msgid "/"
msgstr ""
-msgid "0 for unlimited, only effective with remote storage enabled."
+msgid "0 bytes"
msgstr ""
msgid "0t1DgySidms"
@@ -1326,6 +1340,9 @@ msgstr ""
msgid "1000+"
msgstr ""
+msgid "192.168.0.0/24"
+msgstr ""
+
msgid "1st contribution!"
msgstr "1e bijdrage!"
@@ -1479,9 +1496,6 @@ msgstr ""
msgid "A plain HTML site that uses Netlify for CI/CD instead of GitLab, but still with all the other great GitLab features"
msgstr ""
-msgid "A plain-text response to show to clients that hit the rate limit."
-msgstr ""
-
msgid "A platform value can be web, mob or app."
msgstr ""
@@ -1563,7 +1577,7 @@ msgstr ""
msgid "APIFuzzing|Configure HTTP basic authentication values. Other authentication methods are supported. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
+msgid "APIFuzzing|Customize your project's API fuzzing configuration options and copy the code snippet to your .gitlab-ci.yml file to apply any changes. Note that this tool does not reflect or update your .gitlab-ci.yml file automatically. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
msgstr ""
msgid "APIFuzzing|Enable authentication"
@@ -1626,9 +1640,6 @@ msgstr ""
msgid "APIFuzzing|To prevent a security leak, authentication info must be added as a %{ciVariablesLinkStart}CI variable%{ciVariablesLinkEnd}. As a user with maintainer access rights, you can manage CI variables in the %{ciSettingsLinkStart}Settings%{ciSettingsLinkEnd} area."
msgstr ""
-msgid "APIFuzzing|Use this tool to generate API fuzzing configuration YAML to copy into your .gitlab-ci.yml file. This tool does not reflect or update your .gitlab-ci.yml file automatically."
-msgstr ""
-
msgid "APIFuzzing|Username for basic authentication"
msgstr ""
@@ -1680,9 +1691,6 @@ msgstr "Misbruik rapporten"
msgid "Abuse reports notification email"
msgstr ""
-msgid "Abuse reports will be sent to this address if it is set. Abuse reports are always available in the admin area."
-msgstr ""
-
msgid "Accept invitation"
msgstr ""
@@ -1719,12 +1727,18 @@ msgstr ""
msgid "Access granted"
msgstr ""
+msgid "Access key ID"
+msgstr ""
+
msgid "Access requests"
msgstr ""
msgid "Access to '%{classification_label}' not allowed"
msgstr ""
+msgid "Access tokens expire after 2 hours. A refresh token may be used at any time to generate a new access token. Non-expiring access tokens are deprecated. Clear this setting to enable backward compatibility."
+msgstr ""
+
msgid "AccessDropdown|Deploy Keys"
msgstr ""
@@ -2037,6 +2051,9 @@ msgstr ""
msgid "Add new directory"
msgstr "Nieuwe map toevoegen"
+msgid "Add new service account"
+msgstr ""
+
msgid "Add or remove previously merged commits"
msgstr ""
@@ -2274,6 +2291,9 @@ msgstr ""
msgid "AdminArea|Features"
msgstr ""
+msgid "AdminArea|Get security updates from GitLab and stay up to date"
+msgstr ""
+
msgid "AdminArea|Groups"
msgstr ""
@@ -2313,6 +2333,12 @@ msgstr ""
msgid "AdminArea|Reporter"
msgstr ""
+msgid "AdminArea|Sign up for the GitLab Security Newsletter to get notified for security updates."
+msgstr ""
+
+msgid "AdminArea|Sign up for the GitLab newsletter"
+msgstr ""
+
msgid "AdminArea|Stop all jobs"
msgstr ""
@@ -2382,9 +2408,15 @@ msgstr ""
msgid "AdminSettings|Disable public access to Pages sites"
msgstr ""
+msgid "AdminSettings|Display a banner on merge requests in projects with no pipelines to initiate steps to add a .gitlab-ci.yml file."
+msgstr ""
+
msgid "AdminSettings|Domain verification is an essential security measure for public GitLab sites. Users are required to demonstrate they control a domain before it is enabled. %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "AdminSettings|Enable pipeline suggestion banner"
+msgstr ""
+
msgid "AdminSettings|Enable shared runners for new projects"
msgstr ""
@@ -2856,10 +2888,10 @@ msgstr ""
msgid "Admin|Quarterly reconciliation will occur on %{qrtlyDate}"
msgstr ""
-msgid "Admin|The number of max seats used for your namespace is currently exceeding the number of seats in your subscription. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgid "Admin|The number of max seats in your namespace exceeds the number of seats in your subscription. On %{qrtlyDate}, quarterly reconciliation occurs and you are automatically billed a prorated amount for the overage. No action is needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice. For more information about the timing of the invoicing process, view the documentation."
msgstr ""
-msgid "Admin|The number of maximum users for your instance is currently exceeding the number of users in license. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgid "Admin|The number of max users in your instance exceeds the number of users in your license. On %{qrtlyDate}, quarterly reconciliation occurs and you are automatically billed a prorated amount for the overage. No action is needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice. For more information about the timing of the invoicing process, view the documentation."
msgstr ""
msgid "Admin|View pending user approvals"
@@ -2880,9 +2912,6 @@ msgstr ""
msgid "Advanced export options"
msgstr ""
-msgid "Advanced permissions, Large File Storage and Two-Factor authentication settings."
-msgstr ""
-
msgid "After a successful password update you will be redirected to login screen."
msgstr ""
@@ -2901,13 +2930,14 @@ msgstr ""
msgid "After you've reviewed these contribution guidelines, you'll be all set to"
msgstr ""
+msgid "Akismet"
+msgstr ""
+
msgid "Akismet API Key"
msgstr ""
-msgid "Alert"
-msgid_plural "Alerts"
-msgstr[0] ""
-msgstr[1] ""
+msgid "Akismet helps prevent the creation of spam issues in public projects."
+msgstr ""
msgid "AlertManagement|Acknowledged"
msgstr ""
@@ -3263,6 +3293,9 @@ msgstr ""
msgid "All (default)"
msgstr ""
+msgid "All GitLab"
+msgstr ""
+
msgid "All Members"
msgstr ""
@@ -3377,6 +3410,9 @@ msgstr ""
msgid "Allow this secondary node to replicate content on Object Storage"
msgstr ""
+msgid "Allow use of licensed EE features"
+msgstr ""
+
msgid "Allow users to dismiss the broadcast message"
msgstr ""
@@ -3452,9 +3488,6 @@ msgstr ""
msgid "Amazon authentication is not %{link_start}correctly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
-msgid "Amount of time (in hours) that users are allowed to skip forced configuration of two-factor authentication"
-msgstr ""
-
msgid "An %{link_start}alert%{link_end} with the same fingerprint is already open. To change the status of this alert, resolve the linked alert."
msgstr ""
@@ -3515,12 +3548,6 @@ msgstr ""
msgid "An error occurred when removing the label."
msgstr ""
-msgid "An error occurred when toggling the notification subscription"
-msgstr ""
-
-msgid "An error occurred when updating the issue weight"
-msgstr ""
-
msgid "An error occurred when updating the title"
msgstr ""
@@ -3569,6 +3596,9 @@ msgstr ""
msgid "An error occurred while enabling Service Desk."
msgstr ""
+msgid "An error occurred while fetching Markdown preview"
+msgstr ""
+
msgid "An error occurred while fetching ancestors"
msgstr ""
@@ -3599,9 +3629,6 @@ msgstr ""
msgid "An error occurred while fetching label colors."
msgstr ""
-msgid "An error occurred while fetching markdown preview"
-msgstr ""
-
msgid "An error occurred while fetching participants"
msgstr ""
@@ -3617,9 +3644,6 @@ msgstr ""
msgid "An error occurred while fetching reference"
msgstr ""
-msgid "An error occurred while fetching sidebar data"
-msgstr ""
-
msgid "An error occurred while fetching tags. Retry the search."
msgstr ""
@@ -3695,6 +3719,9 @@ msgstr ""
msgid "An error occurred while loading merge requests."
msgstr ""
+msgid "An error occurred while loading projects."
+msgstr ""
+
msgid "An error occurred while loading the Needs tab."
msgstr ""
@@ -3929,12 +3956,6 @@ msgstr ""
msgid "Any Milestone"
msgstr ""
-msgid "Any branch"
-msgstr ""
-
-msgid "Any eligible user"
-msgstr ""
-
msgid "Any encrypted tokens"
msgstr ""
@@ -3953,6 +3974,9 @@ msgstr ""
msgid "Any namespace"
msgstr ""
+msgid "App Engine description and apps that are suitable for this deployment target"
+msgstr ""
+
msgid "App ID"
msgstr ""
@@ -4101,6 +4125,11 @@ msgstr ""
msgid "Apply"
msgstr ""
+msgid "Apply %d suggestion"
+msgid_plural "Apply %d suggestions"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Apply a label"
msgstr ""
@@ -4110,13 +4139,10 @@ msgstr ""
msgid "Apply suggestion"
msgstr ""
-msgid "Apply suggestions"
-msgstr ""
-
msgid "Apply template"
msgstr ""
-msgid "Apply this approval rule to any branch or a specific protected branch."
+msgid "Apply this approval rule to all branches or a specific protected branch."
msgstr ""
msgid "Applying"
@@ -4259,9 +4285,6 @@ msgstr ""
msgid "ApprovalSettings|Prevent editing approval rules in projects and merge requests."
msgstr ""
-msgid "ApprovalSettings|Prevent editing approval rules in projects and merge requests. "
-msgstr ""
-
msgid "ApprovalSettings|Remove all approvals when commits are added to the source branch."
msgstr ""
@@ -4277,6 +4300,9 @@ msgstr ""
msgid "ApprovalSettings|This setting is configured at the instance level and can only be changed by an administrator."
msgstr ""
+msgid "ApprovalSettings|This setting is configured in %{groupName} and can only be changed by an administrator or group owner."
+msgstr ""
+
msgid "ApprovalStatusTooltip|Adheres to separation of duties"
msgstr ""
@@ -4763,9 +4789,6 @@ msgstr ""
msgid "Authenticated API rate limit period in seconds"
msgstr ""
-msgid "Authenticated API request rate limit"
-msgstr ""
-
msgid "Authenticated API requests"
msgstr ""
@@ -4775,10 +4798,10 @@ msgstr ""
msgid "Authenticated Git LFS request rate limit"
msgstr ""
-msgid "Authenticated web rate limit period in seconds"
+msgid "Authenticated Git LFS requests"
msgstr ""
-msgid "Authenticated web request rate limit"
+msgid "Authenticated web rate limit period in seconds"
msgstr ""
msgid "Authenticated web requests"
@@ -5156,9 +5179,6 @@ msgstr ""
msgid "Below you will find all the groups that are public."
msgstr ""
-msgid "Beta"
-msgstr ""
-
msgid "Bi-weekly code coverage"
msgstr ""
@@ -5398,6 +5418,21 @@ msgstr ""
msgid "Board scope affects which issues are displayed for anyone who visits this board"
msgstr ""
+msgid "BoardNewEpic|Groups"
+msgstr ""
+
+msgid "BoardNewEpic|Loading groups"
+msgstr ""
+
+msgid "BoardNewEpic|No matching results"
+msgstr ""
+
+msgid "BoardNewEpic|Search groups"
+msgstr ""
+
+msgid "BoardNewEpic|Select a group"
+msgstr ""
+
msgid "BoardNewIssue|No matching results"
msgstr ""
@@ -5475,6 +5510,9 @@ msgstr ""
msgid "Boards|An error occurred while creating the list. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching child groups. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching group projects. Please try again."
msgstr ""
@@ -5807,6 +5845,9 @@ msgstr ""
msgid "Bulk update"
msgstr ""
+msgid "BulkImports|Re-import creates a new group. It does not sync with the existing group."
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -5816,6 +5857,9 @@ msgstr ""
msgid "BulkImport|From source group"
msgstr ""
+msgid "BulkImport|Group import history"
+msgstr ""
+
msgid "BulkImport|Import failed: Destination cannot be a subgroup of the source group. Change the destination and try again."
msgstr ""
@@ -5828,9 +5872,18 @@ msgstr ""
msgid "BulkImport|Importing the group failed"
msgstr ""
+msgid "BulkImport|Last imported to %{link}"
+msgstr ""
+
msgid "BulkImport|Name already exists."
msgstr ""
+msgid "BulkImport|New group"
+msgstr ""
+
+msgid "BulkImport|No history is available"
+msgstr ""
+
msgid "BulkImport|No parent"
msgstr ""
@@ -5843,6 +5896,9 @@ msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} matching filter \"%{filter}\" from %{link}"
msgstr ""
+msgid "BulkImport|Source group"
+msgstr ""
+
msgid "BulkImport|To new group"
msgstr ""
@@ -5852,6 +5908,9 @@ msgstr ""
msgid "BulkImport|You have no groups to import"
msgstr ""
+msgid "BulkImport|Your imported groups will appear here."
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -6094,6 +6153,9 @@ msgstr ""
msgid "Can be manually deployed to"
msgstr ""
+msgid "Can be overridden in each project."
+msgstr ""
+
msgid "Can create groups:"
msgstr ""
@@ -6196,6 +6258,9 @@ msgstr ""
msgid "Cancelling Preview"
msgstr ""
+msgid "Cannot assign a confidential epic to a non-confidential issue. Make the issue confidential and try again"
+msgstr ""
+
msgid "Cannot be assigned to other projects."
msgstr ""
@@ -6247,9 +6312,6 @@ msgstr ""
msgid "Cannot refer to a group %{timebox_type} by an internal id!"
msgstr ""
-msgid "Cannot set confidential epic for a non-confidential issue"
-msgstr ""
-
msgid "Cannot show preview. For previews on sketch files, they must have the file format introduced by Sketch version 43 and above."
msgstr ""
@@ -6487,15 +6549,15 @@ msgstr ""
msgid "Check out, review, and merge locally"
msgstr ""
-msgid "Check the %{docs_link_start}documentation%{docs_link_end}."
-msgstr ""
-
msgid "Check the current instance configuration "
msgstr ""
msgid "Check the elasticsearch.log file to debug why the migration was halted and make any changes before retrying the migration. When you fix the cause of the failure, click \"Retry migration\", and the migration will be scheduled to be retried in the background."
msgstr ""
+msgid "Check with your administrator."
+msgstr ""
+
msgid "Check your Docker images for known vulnerabilities."
msgstr ""
@@ -6526,6 +6588,9 @@ msgstr ""
msgid "Checkout"
msgstr ""
+msgid "Checkout|$%{selectedPlanPrice} per 10 GB storage per pack"
+msgstr ""
+
msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 minutes"
msgstr ""
@@ -6546,17 +6611,23 @@ msgstr ""
msgid "Checkout|%{name}'s GitLab subscription"
msgstr ""
-msgid "Checkout|%{selectedPlanText} plan"
+msgid "Checkout|%{name}'s storage subscription"
msgstr ""
-msgid "Checkout|%{startDate} - %{endDate}"
+msgid "Checkout|%{quantity} GB of storage"
msgstr ""
-msgid "Checkout|%{totalCiMinutes} CI minute"
-msgid_plural "Checkout|%{totalCiMinutes} CI minutes"
+msgid "Checkout|%{quantity} storage pack"
+msgid_plural "Checkout|%{quantity} storage packs"
msgstr[0] ""
msgstr[1] ""
+msgid "Checkout|%{selectedPlanText} plan"
+msgstr ""
+
+msgid "Checkout|%{startDate} - %{endDate}"
+msgstr ""
+
msgid "Checkout|%{totalCiMinutes} CI minutes"
msgstr ""
@@ -6632,6 +6703,9 @@ msgstr ""
msgid "Checkout|Failed to register credit card. Please try again."
msgstr ""
+msgid "Checkout|GB"
+msgstr ""
+
msgid "Checkout|GitLab group"
msgstr ""
@@ -6668,6 +6742,9 @@ msgstr ""
msgid "Checkout|State"
msgstr ""
+msgid "Checkout|Storage packs"
+msgstr ""
+
msgid "Checkout|Street address"
msgstr ""
@@ -6689,6 +6766,9 @@ msgstr ""
msgid "Checkout|Total minutes: %{quantity}"
msgstr ""
+msgid "Checkout|Total storage: %{quantity} GB"
+msgstr ""
+
msgid "Checkout|Users"
msgstr ""
@@ -6698,16 +6778,25 @@ msgstr ""
msgid "Checkout|Your organization"
msgstr ""
+msgid "Checkout|Your storage subscription has the same term as your main subscription, and the price is prorated accordingly."
+msgstr ""
+
msgid "Checkout|Your subscription will be applied to this group"
msgstr ""
msgid "Checkout|Zip code"
msgstr ""
+msgid "Checkout|a storage subscription"
+msgstr ""
+
msgid "Checkout|company or team"
msgstr ""
-msgid "Checkout|x 1,000 minutes per pack = %{strong}"
+msgid "Checkout|minutes"
+msgstr ""
+
+msgid "Checkout|x %{quantity} %{units} per pack ="
msgstr ""
msgid "Cherry-pick this commit"
@@ -7064,6 +7153,9 @@ msgstr ""
msgid "CloneIssue|Cannot clone issue to target project as it is pending deletion."
msgstr ""
+msgid "CloneIssue|Cannot clone issues of '%{issue_type}' type."
+msgstr ""
+
msgid "Cloned this issue to %{path_to_project}."
msgstr ""
@@ -7118,7 +7210,10 @@ msgstr ""
msgid "Closes this %{quick_action_target}."
msgstr ""
-msgid "Cloud licenses can not be removed."
+msgid "Cloud Functions description and apps that are suitable for this deployment target"
+msgstr ""
+
+msgid "Cloud Run description and apps that are suitable for this deployment target"
msgstr ""
msgid "Cluster"
@@ -7145,6 +7240,12 @@ msgstr ""
msgid "ClusterAgents|Access tokens"
msgstr ""
+msgid "ClusterAgents|Agent might not be connected to GitLab"
+msgstr ""
+
+msgid "ClusterAgents|Agent never connected to GitLab"
+msgstr ""
+
msgid "ClusterAgents|Alternative installation methods"
msgstr ""
@@ -7160,6 +7261,12 @@ msgstr ""
msgid "ClusterAgents|Configuration"
msgstr ""
+msgid "ClusterAgents|Connected"
+msgstr ""
+
+msgid "ClusterAgents|Connection status"
+msgstr ""
+
msgid "ClusterAgents|Copy token"
msgstr ""
@@ -7178,6 +7285,9 @@ msgstr ""
msgid "ClusterAgents|For alternative installation methods %{linkStart}go to the documentation%{linkEnd}."
msgstr ""
+msgid "ClusterAgents|For more troubleshooting information go to"
+msgstr ""
+
msgid "ClusterAgents|Go to the repository"
msgstr ""
@@ -7193,18 +7303,30 @@ msgstr ""
msgid "ClusterAgents|Integrate with the GitLab Agent"
msgstr ""
-msgid "ClusterAgents|Last used"
+msgid "ClusterAgents|Last connected %{timeAgo}."
+msgstr ""
+
+msgid "ClusterAgents|Last contact"
msgstr ""
msgid "ClusterAgents|Learn how to create an agent access token"
msgstr ""
+msgid "ClusterAgents|Make sure you are using a valid token."
+msgstr ""
+
msgid "ClusterAgents|Name"
msgstr ""
msgid "ClusterAgents|Never"
msgstr ""
+msgid "ClusterAgents|Never connected"
+msgstr ""
+
+msgid "ClusterAgents|Not connected"
+msgstr ""
+
msgid "ClusterAgents|Read more about getting started"
msgstr ""
@@ -7226,6 +7348,9 @@ msgstr ""
msgid "ClusterAgents|Select which Agent you want to install"
msgstr ""
+msgid "ClusterAgents|The Agent has not been connected in a long time. There might be a connectivity issue. Last contact was %{timeAgo}."
+msgstr ""
+
msgid "ClusterAgents|The GitLab Agent also requires %{linkStart}enabling the Agent Server%{linkEnd}"
msgstr ""
@@ -7253,9 +7378,6 @@ msgstr ""
msgid "ClusterAgents|You will need to create a token to connect to your agent"
msgstr ""
-msgid "ClusterAgent|This feature is only available for premium plans"
-msgstr ""
-
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -7445,9 +7567,6 @@ msgstr ""
msgid "ClusterIntegration|Create Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Create a provision role on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the account and external ID above. %{startMoreInfoLink}More information%{endLink}"
-msgstr ""
-
msgid "ClusterIntegration|Create cluster on"
msgstr ""
@@ -7880,7 +7999,7 @@ msgstr ""
msgid "ClusterIntegration|Subnets"
msgstr ""
-msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provisioned role, first create one on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the above account and external IDs. %{startMoreInfoLink}More information%{endLink}"
+msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provisioned role, first create one on %{awsLinkStart}Amazon Web Services %{awsLinkEnd} using the above account and external IDs. %{moreInfoStart}More information%{moreInfoEnd}"
msgstr ""
msgid "ClusterIntegration|The Kubernetes certificate used to authenticate to the cluster."
@@ -8114,6 +8233,9 @@ msgstr ""
msgid "Collapse replies"
msgstr ""
+msgid "Collapse settings section"
+msgstr ""
+
msgid "Collapse sidebar"
msgstr ""
@@ -8132,6 +8254,9 @@ msgstr ""
msgid "Comma-separated list of email addresses."
msgstr ""
+msgid "Comma-separated list of users allowed to exceed the rate limit."
+msgstr ""
+
msgid "Comma-separated, e.g. '1.1.1.1, 2.2.2.0/24'"
msgstr ""
@@ -8452,6 +8577,9 @@ msgstr ""
msgid "Configure %{repository_checks_link_start}repository checks%{link_end} and %{housekeeping_link_start}housekeeping%{link_end} on repositories."
msgstr ""
+msgid "Configure CAPTCHAs, IP address limits, and other anti-spam measures."
+msgstr ""
+
msgid "Configure Dependency Scanning in `.gitlab-ci.yml` using the GitLab managed template. You can [add variable overrides](https://docs.gitlab.com/ee/user/application_security/dependency_scanning/#customizing-the-dependency-scanning-settings) to customize Dependency Scanning settings."
msgstr ""
@@ -8488,16 +8616,13 @@ msgstr ""
msgid "Configure a %{codeStart}.gitlab-webide.yml%{codeEnd} file in the %{codeStart}.gitlab%{codeEnd} directory to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
msgstr ""
-msgid "Configure existing installation"
-msgstr ""
-
-msgid "Configure limit for notes created per minute by web and API requests."
+msgid "Configure advanced permissions, Large File Storage, and two-factor authentication settings."
msgstr ""
-msgid "Configure limits for Project/Group Import/Export."
+msgid "Configure approvals by authors and committers on all projects."
msgstr ""
-msgid "Configure limits for web and API requests."
+msgid "Configure existing installation"
msgstr ""
msgid "Configure paths to be protected by Rack Attack."
@@ -8512,10 +8637,13 @@ msgstr ""
msgid "Configure settings for Advanced Search with Elasticsearch."
msgstr ""
+msgid "Configure specific limits for Files API requests that supersede the general user and IP rate limits."
+msgstr ""
+
msgid "Configure specific limits for Git LFS requests that supersede the general user and IP rate limits."
msgstr ""
-msgid "Configure specific limits for Packages API requests that supersede the general user and IP rate limits."
+msgid "Configure specific limits for deprecated API requests that supersede the general user and IP rate limits."
msgstr ""
msgid "Configure the %{link} integration."
@@ -8527,6 +8655,9 @@ msgstr ""
msgid "Configure the way a user creates a new account."
msgstr ""
+msgid "Configure via Merge Request"
+msgstr ""
+
msgid "Configure which lists are shown for anyone who visits this board"
msgstr ""
@@ -8995,6 +9126,9 @@ msgstr ""
msgid "Content parsed with %{link}."
msgstr ""
+msgid "ContentEditor|Table of Contents"
+msgstr ""
+
msgid "ContentEditor|You have to provide a renderMarkdown function or a custom serializer"
msgstr ""
@@ -9181,6 +9315,9 @@ msgstr ""
msgid "Copy link to chart"
msgstr ""
+msgid "Copy prefix"
+msgstr ""
+
msgid "Copy reference"
msgstr ""
@@ -9211,6 +9348,9 @@ msgstr ""
msgid "Copy value"
msgstr ""
+msgid "Corpus Management"
+msgstr ""
+
msgid "Corpus Management|Are you sure you want to delete the corpus?"
msgstr ""
@@ -9439,6 +9579,9 @@ msgstr ""
msgid "Create commit"
msgstr ""
+msgid "Create common files more quickly, and standardize their format."
+msgstr ""
+
msgid "Create confidential merge request"
msgstr ""
@@ -9472,6 +9615,9 @@ msgstr ""
msgid "Create issue"
msgstr ""
+msgid "Create issue to resolve all threads"
+msgstr ""
+
msgid "Create iteration"
msgstr ""
@@ -9526,6 +9672,9 @@ msgstr ""
msgid "Create new..."
msgstr ""
+msgid "Create or import your first project"
+msgstr ""
+
msgid "Create project"
msgstr ""
@@ -9883,7 +10032,7 @@ msgstr ""
msgid "Custom notification events"
msgstr ""
-msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notificationLinkStart} notification emails%{notificationLinkEnd}."
+msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notificationLinkStart}notification emails%{notificationLinkEnd}."
msgstr ""
msgid "Custom project templates"
@@ -10082,10 +10231,10 @@ msgid_plural "CycleAnalytics|Showing %{subjectFilterText} and %{selectedLabelsCo
msgstr[0] ""
msgstr[1] ""
-msgid "CycleAnalytics|Showing data for group '%{groupName}' and %{selectedProjectCount} projects from %{startDate} to %{endDate}"
+msgid "CycleAnalytics|Showing data for group '%{groupName}' and %{selectedProjectCount} projects from %{createdAfter} to %{createdBefore}"
msgstr ""
-msgid "CycleAnalytics|Showing data for group '%{groupName}' from %{startDate} to %{endDate}"
+msgid "CycleAnalytics|Showing data for group '%{groupName}' from %{createdAfter} to %{createdBefore}"
msgstr ""
msgid "CycleAnalytics|Stages"
@@ -10319,6 +10468,9 @@ msgstr ""
msgid "DastProfiles|Manage profiles"
msgstr ""
+msgid "DastProfiles|Manage site profiles"
+msgstr ""
+
msgid "DastProfiles|Minimum = 0 (no timeout enabled), Maximum = 2880 minutes"
msgstr ""
@@ -10394,6 +10546,9 @@ msgstr ""
msgid "DastProfiles|Scanner name"
msgstr ""
+msgid "DastProfiles|Schedule"
+msgstr ""
+
msgid "DastProfiles|Select branch"
msgstr ""
@@ -10463,7 +10618,7 @@ msgstr ""
msgid "DastProfiles|Website"
msgstr ""
-msgid "DastProfiles|You can either choose a passive scan or validate the target site in your chosen site profile. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
+msgid "DastProfiles|You can either choose a passive scan or validate the target site from the site profile management page. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
msgstr ""
msgid "DastProfiles|You cannot run an active scan against an unvalidated site."
@@ -10636,7 +10791,7 @@ msgstr ""
msgid "Days to merge"
msgstr ""
-msgid "Deactivate dormant users after 90 days of inactivity. Users can return to active status by signing in to their account. While inactive, a user is not counted as an active user in the instance."
+msgid "Deactivate dormant users after 90 days of inactivity"
msgstr ""
msgid "Dear Administrator,"
@@ -10723,10 +10878,10 @@ msgstr ""
msgid "Define a custom pattern with cron syntax"
msgstr ""
-msgid "Define approval settings."
+msgid "Define approval rules."
msgstr ""
-msgid "Define approval settings. %{linkStart}Learn more.%{linkEnd}"
+msgid "Define approval rules. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "Define custom rules for what constitutes spam, independent of Akismet"
@@ -10735,7 +10890,7 @@ msgstr ""
msgid "Define environments in the deploy stage(s) in %{code_open}.gitlab-ci.yml%{code_close} to track deployments here."
msgstr ""
-msgid "Define how approval rules are applied as a merge request moves toward completion."
+msgid "Define how approval rules are applied to merge requests."
msgstr ""
msgid "Definition"
@@ -10750,6 +10905,12 @@ msgstr ""
msgid "DelayedJobs|Are you sure you want to run %{job_name} immediately? This job will run automatically after it's timer finishes."
msgstr ""
+msgid "DelayedJobs|Are you sure you want to run %{job_name} immediately? This job will run automatically after its timer finishes."
+msgstr ""
+
+msgid "DelayedJobs|Run the delayed job now?"
+msgstr ""
+
msgid "DelayedJobs|Start now"
msgstr ""
@@ -11026,6 +11187,12 @@ msgstr ""
msgid "Dependency proxy image prefix"
msgstr ""
+msgid "DependencyProxy|Create a local proxy for storing frequently used upstream images. %{docLinkStart}Learn more%{docLinkEnd} about dependency proxies."
+msgstr ""
+
+msgid "DependencyProxy|Dependency Proxy"
+msgstr ""
+
msgid "DependencyProxy|Toggle Dependency Proxy"
msgstr ""
@@ -11266,6 +11433,9 @@ msgstr ""
msgid "Deployments"
msgstr ""
+msgid "Deployments to Google Kubernetes Engine can be "
+msgstr ""
+
msgid "Deployments|%{deployments} environment impacted."
msgid_plural "Deployments|%{deployments} environments impacted."
msgstr[0] ""
@@ -11295,6 +11465,9 @@ msgstr ""
msgid "Deployment|success"
msgstr ""
+msgid "Deprecated API rate limits"
+msgstr ""
+
msgid "Deprioritize label"
msgstr ""
@@ -11697,6 +11870,16 @@ msgstr ""
msgid "DiffsCompareBaseBranch|(base)"
msgstr ""
+msgid "Diffs|%d addition"
+msgid_plural "Diffs|%d additions"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Diffs|%d deletion"
+msgid_plural "Diffs|%d deletions"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Diffs|No file name available"
msgstr ""
@@ -11706,9 +11889,17 @@ msgstr ""
msgid "Diffs|Show all unchanged lines"
msgstr ""
+msgid "Diffs|Showing %{dropdownStart}%{count} changed file%{dropdownEnd}"
+msgid_plural "Diffs|Showing %{dropdownStart}%{count} changed files%{dropdownEnd}"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Diffs|Something went wrong while fetching diff lines."
msgstr ""
+msgid "Diffs|with %{additions} and %{deletions}"
+msgstr ""
+
msgid "Direct member"
msgstr ""
@@ -11834,9 +12025,6 @@ msgid_plural "Dismiss %d selected vulnerabilities as"
msgstr[0] ""
msgstr[1] ""
-msgid "Dismiss Value Stream Analytics introduction box"
-msgstr ""
-
msgid "Dismiss merge request promotion"
msgstr ""
@@ -12158,6 +12346,9 @@ msgstr ""
msgid "Edit issues"
msgstr ""
+msgid "Edit merge requests"
+msgstr ""
+
msgid "Edit public deploy key"
msgstr ""
@@ -12233,6 +12424,9 @@ msgstr ""
msgid "Elastic|None. Select projects to index."
msgstr ""
+msgid "Eligible users"
+msgstr ""
+
msgid "Email"
msgstr ""
@@ -12362,6 +12556,9 @@ msgstr ""
msgid "Enable"
msgstr ""
+msgid "Enable Amazon EKS integration"
+msgstr ""
+
msgid "Enable Auto DevOps"
msgstr ""
@@ -12395,6 +12592,9 @@ msgstr ""
msgid "Enable SSL verification"
msgstr ""
+msgid "Enable Service Ping"
+msgstr ""
+
msgid "Enable Snowplow tracking"
msgstr ""
@@ -12425,6 +12625,9 @@ msgstr ""
msgid "Enable authenticated Git LFS request rate limit"
msgstr ""
+msgid "Enable authenticated web request rate limit"
+msgstr ""
+
msgid "Enable authentication"
msgstr ""
@@ -12485,7 +12688,7 @@ msgstr ""
msgid "Enable or disable the Pseudonymizer data collection."
msgstr ""
-msgid "Enable or disable version check and service ping."
+msgid "Enable or disable version check and Service Ping."
msgstr ""
msgid "Enable protected paths rate limit"
@@ -12497,18 +12700,12 @@ msgstr ""
msgid "Enable reCAPTCHA"
msgstr ""
-msgid "Enable reCAPTCHA for login"
-msgstr ""
-
-msgid "Enable reCAPTCHA, Invisible Captcha, Akismet and set IP limits. For reCAPTCHA, we currently only support %{recaptcha_v2_link_start}v2%{recaptcha_v2_link_end}"
+msgid "Enable reCAPTCHA for login."
msgstr ""
msgid "Enable repository checks"
msgstr ""
-msgid "Enable service ping"
-msgstr ""
-
msgid "Enable shared runners for all projects and subgroups in this group."
msgstr ""
@@ -12530,7 +12727,10 @@ msgstr ""
msgid "Enable unauthenticated API request rate limit"
msgstr ""
-msgid "Enable unauthenticated request rate limit"
+msgid "Enable unauthenticated web request rate limit"
+msgstr ""
+
+msgid "Enable user deactivation emails"
msgstr ""
msgid "Enable version check"
@@ -12566,9 +12766,6 @@ msgstr ""
msgid "Enabled sources for code import during project creation. OmniAuth must be configured for GitHub"
msgstr ""
-msgid "Enabling this will only make licensed EE features available to projects if the project namespace's plan includes the feature or if the project is public."
-msgstr ""
-
msgid "Encountered an error while rendering: %{err}"
msgstr ""
@@ -12617,9 +12814,6 @@ msgstr ""
msgid "Enter Admin Mode"
msgstr ""
-msgid "Enter IP address range"
-msgstr ""
-
msgid "Enter a number"
msgstr ""
@@ -12632,9 +12826,6 @@ msgstr ""
msgid "Enter at least three characters to search"
msgstr ""
-msgid "Enter domain"
-msgstr ""
-
msgid "Enter in your Bitbucket Server URL and personal access token below"
msgstr ""
@@ -12821,9 +13012,6 @@ msgstr ""
msgid "Environments|Deployment %{status}"
msgstr ""
-msgid "Environments|Dismiss"
-msgstr ""
-
msgid "Environments|Enable review app"
msgstr ""
@@ -12836,9 +13024,6 @@ msgstr ""
msgid "Environments|Environments are places where code gets deployed, such as staging or production."
msgstr ""
-msgid "Environments|Help us improve environments"
-msgstr ""
-
msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
msgstr ""
@@ -12875,6 +13060,9 @@ msgstr ""
msgid "Environments|Note that this action will stop the environment, but it will %{emphasisStart}not%{emphasisEnd} have an effect on any existing deployment due to no “stop environment action†being defined in the %{ciConfigLinkStart}.gitlab-ci.yml%{ciConfigLinkEnd} file."
msgstr ""
+msgid "Environments|Open"
+msgstr ""
+
msgid "Environments|Open live environment"
msgstr ""
@@ -12914,9 +13102,6 @@ msgstr ""
msgid "Environments|Stopping %{environmentName}"
msgstr ""
-msgid "Environments|Take the survey"
-msgstr ""
-
msgid "Environments|There was an error fetching the logs. Please try again."
msgstr ""
@@ -12938,9 +13123,6 @@ msgstr ""
msgid "Environments|You don't have any environments right now"
msgstr ""
-msgid "Environments|Your feedback helps GitLab make environments better for you and other users. Participate and enter a sweepstake to win a USD 30 gift card."
-msgstr ""
-
msgid "Environments|by %{avatar}"
msgstr ""
@@ -13223,7 +13405,7 @@ msgstr ""
msgid "Error parsing CSV file. Please make sure it has"
msgstr ""
-msgid "Error rendering markdown preview"
+msgid "Error rendering Markdown preview"
msgstr ""
msgid "Error saving label update."
@@ -13271,6 +13453,9 @@ msgstr ""
msgid "Error: %{error_message}"
msgstr ""
+msgid "Error: Couldn't load some or all of the changes."
+msgstr ""
+
msgid "Error: No AWS credentials were supplied"
msgstr ""
@@ -13304,6 +13489,9 @@ msgstr ""
msgid "ErrorTracking|Enable error tracking"
msgstr ""
+msgid "ErrorTracking|Error tracking backend"
+msgstr ""
+
msgid "ErrorTracking|If you self-host Sentry, enter your Sentry instance's full URL. If you use Sentry's hosted solution, enter https://sentry.io"
msgstr ""
@@ -13337,6 +13525,12 @@ msgstr ""
msgid "Escalation policies must have at least one rule"
msgstr ""
+msgid "EscalationPolicies|%{clockIcon} IF alert is not %{alertStatus} in %{minutes}"
+msgstr ""
+
+msgid "EscalationPolicies|%{notificationIcon} THEN %{doAction} %{forScheduleOrUser}"
+msgstr ""
+
msgid "EscalationPolicies|+ Add an additional rule"
msgstr ""
@@ -13379,13 +13573,13 @@ msgstr ""
msgid "EscalationPolicies|Escalation policies"
msgstr ""
-msgid "EscalationPolicies|Escalation rules"
+msgid "EscalationPolicies|Escalation policy %{obstacle} in Project %{project}"
msgstr ""
-msgid "EscalationPolicies|Failed to load oncall-schedules"
+msgid "EscalationPolicies|Escalation rules"
msgstr ""
-msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} %{then} THEN %{doAction} %{scheduleOrUser}"
+msgid "EscalationPolicies|Failed to load oncall-schedules"
msgstr ""
msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} minutes"
@@ -13463,18 +13657,36 @@ msgstr ""
msgid "Every %{action} attempt has failed: %{job_error_message}. Please try again."
msgstr ""
+msgid "Every 3 months"
+msgstr ""
+
+msgid "Every 3 months on the %{day} at %{time} %{timezone}"
+msgstr ""
+
+msgid "Every 6 months"
+msgstr ""
+
+msgid "Every 6 months on the %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Every day"
msgstr ""
msgid "Every day (at %{time})"
msgstr ""
+msgid "Every day at %{time} %{timezone}"
+msgstr ""
+
msgid "Every month"
msgstr ""
msgid "Every month (Day %{day} at %{time})"
msgstr ""
+msgid "Every month on the %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Every three months"
msgstr ""
@@ -13489,6 +13701,15 @@ msgstr[1] ""
msgid "Every week (%{weekday} at %{time})"
msgstr ""
+msgid "Every week on %{day} at %{time} %{timezone}"
+msgstr ""
+
+msgid "Every year"
+msgstr ""
+
+msgid "Every year on %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Everyone"
msgstr ""
@@ -13525,9 +13746,6 @@ msgstr ""
msgid "Exactly one of %{attributes} is required"
msgstr ""
-msgid "Example: %{ip_address}. %{read_more_link}."
-msgstr ""
-
msgid "Example: @sub\\.company\\.com$"
msgstr ""
@@ -13594,13 +13812,13 @@ msgstr ""
msgid "Expand pipeline"
msgstr ""
-msgid "Expand sidebar"
+msgid "Expand settings section"
msgstr ""
-msgid "Expected documents: %{expected_documents}"
+msgid "Expand sidebar"
msgstr ""
-msgid "Experienced"
+msgid "Expected documents: %{expected_documents}"
msgstr ""
msgid "ExperimentSubject|Must have exactly one of User, Namespace, or Project."
@@ -13885,9 +14103,6 @@ msgstr ""
msgid "Failed to load related branches"
msgstr ""
-msgid "Failed to load sidebar lock status"
-msgstr ""
-
msgid "Failed to load stacktrace."
msgstr ""
@@ -14312,6 +14527,9 @@ msgstr ""
msgid "Files"
msgstr ""
+msgid "Files API Rate Limits"
+msgstr ""
+
msgid "Files breadcrumb"
msgstr ""
@@ -15311,6 +15529,9 @@ msgstr ""
msgid "GitLab group: %{source_link}"
msgstr ""
+msgid "GitLab informs you if a new version is available."
+msgstr ""
+
msgid "GitLab is a complete DevOps platform, delivered as a single application, fundamentally changing the way Development, Security, and Ops teams collaborate"
msgstr ""
@@ -15326,7 +15547,7 @@ msgstr ""
msgid "GitLab is open source software to collaborate on code."
msgstr ""
-msgid "GitLab is undergoing maintenance and is operating in a read-only mode."
+msgid "GitLab is undergoing maintenance and is operating in read-only mode."
msgstr ""
msgid "GitLab member or Email address"
@@ -15338,9 +15559,6 @@ msgstr ""
msgid "GitLab project export"
msgstr ""
-msgid "GitLab restart is required to apply changes."
-msgstr ""
-
msgid "GitLab single sign-on URL"
msgstr ""
@@ -15356,9 +15574,6 @@ msgstr ""
msgid "GitLab version"
msgstr ""
-msgid "GitLab will inform you if a new version is available."
-msgstr ""
-
msgid "GitLab will run a background job that will produce pseudonymized CSVs of the GitLab database that will be uploaded to your configured object storage directory."
msgstr ""
@@ -15623,9 +15838,21 @@ msgstr ""
msgid "Go to snippets"
msgstr ""
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check 'Allowed domains for sign-ups'."
+msgstr ""
+
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check 'Email restrictions for sign-ups'."
+msgstr ""
+
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check the 'Domain denylist'."
+msgstr ""
+
msgid "Go to the activity feed"
msgstr ""
+msgid "Go to the group’s 'Settings &gt; General' page, and check 'Restrict membership by email domain'."
+msgstr ""
+
msgid "Go to the milestone list"
msgstr ""
@@ -15662,6 +15889,12 @@ msgstr ""
msgid "Goal of the changes and what reviewers should be aware of"
msgstr ""
+msgid "Google Cloud"
+msgstr ""
+
+msgid "Google Cloud offers several deployment targets. Select the one most suitable for your project."
+msgstr ""
+
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
@@ -15746,9 +15979,6 @@ msgstr ""
msgid "Group ID"
msgstr ""
-msgid "Group ID: %{group_id}"
-msgstr ""
-
msgid "Group Owner must have signed in with SAML before enabling Group Managed Accounts"
msgstr ""
@@ -15923,6 +16153,12 @@ msgstr ""
msgid "GroupImport|Unable to process group import file"
msgstr ""
+msgid "GroupPage|Copy group ID"
+msgstr ""
+
+msgid "GroupPage|Group ID: %{group_id}"
+msgstr ""
+
msgid "GroupRoadmap|%{dateWord} – No end date"
msgstr ""
@@ -15977,6 +16213,9 @@ msgstr ""
msgid "GroupRoadmap|Within 3 years"
msgstr ""
+msgid "GroupSAML|\"persistent\" recommended"
+msgstr ""
+
msgid "GroupSAML|%{strongOpen}Warning%{strongClose} - Enabling %{linkStart}SSO enforcement%{linkEnd} can reduce security risks."
msgstr ""
@@ -16109,6 +16348,9 @@ msgstr ""
msgid "GroupSAML|To be able to prohibit outer forks, you first need to enforce dedicate group managed accounts."
msgstr ""
+msgid "GroupSAML|Use SAML group links to manage group membership using SAML."
+msgstr ""
+
msgid "GroupSAML|Valid SAML Response"
msgstr ""
@@ -16121,13 +16363,10 @@ msgstr ""
msgid "GroupSAML|as %{access_level}"
msgstr ""
-msgid "GroupSAML|must match stored NameID of \"%{extern_uid}\" as we use this to identify users. If the NameID changes users will be unable to sign in."
+msgid "GroupSAML|must match stored NameID of \"%{extern_uid}\" to identify user and allow sign in"
msgstr ""
-msgid "GroupSAML|should be \"persistent\""
-msgstr ""
-
-msgid "GroupSAML|should be a random persistent ID, emails are discouraged"
+msgid "GroupSAML|recommend persistent ID instead of email"
msgstr ""
msgid "GroupSelect|No matching results"
@@ -16142,9 +16381,15 @@ msgstr ""
msgid "GroupSettings|Allow project access token creation"
msgstr ""
+msgid "GroupSettings|Applied to all subgroups unless overridden by a group owner. Groups already added to the project lose access."
+msgstr ""
+
msgid "GroupSettings|Auto DevOps pipeline was updated for the group"
msgstr ""
+msgid "GroupSettings|Available only on the top-level group. Applies to all subgroups. Groups already shared with a group outside %{group} are still shared unless removed manually."
+msgstr ""
+
msgid "GroupSettings|Badges"
msgstr ""
@@ -16196,6 +16441,9 @@ msgstr ""
msgid "GroupSettings|New runners registration token has been generated!"
msgstr ""
+msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgstr ""
+
msgid "GroupSettings|Pipeline settings was updated for the group"
msgstr ""
@@ -16208,12 +16456,15 @@ msgstr ""
msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
-msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups."
+msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups"
msgstr ""
msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
msgstr ""
+msgid "GroupSettings|Prevents group members from being notified if the group is mentioned."
+msgstr ""
+
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
msgstr ""
@@ -16250,21 +16501,6 @@ msgstr ""
msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}."
msgstr ""
-msgid "GroupSettings|This setting is only available on the top-level group and it applies to all subgroups. Groups that have already been shared with a group outside %{group} will still be shared, and this access will have to be revoked manually."
-msgstr ""
-
-msgid "GroupSettings|This setting will be applied to all subgroups unless overridden by a group owner. Groups that already have access to the project will continue to have access unless removed manually."
-msgstr ""
-
-msgid "GroupSettings|This setting will override user notification preferences for all members of the group, subgroups, and projects."
-msgstr ""
-
-msgid "GroupSettings|This setting will prevent group members from being notified if the group is mentioned."
-msgstr ""
-
-msgid "GroupSettings|This setting will prevent group members from forking projects outside of the group."
-msgstr ""
-
msgid "GroupSettings|Transfer group"
msgstr ""
@@ -16382,7 +16618,7 @@ msgstr ""
msgid "GroupsNew|No import options available"
msgstr ""
-msgid "GroupsNew|Not all related objects are migrated, as %{docs_link_start}described here%{docs_link_end}. Please %{feedback_link_start}leave feedback%{feedback_link_end} on this feature."
+msgid "GroupsNew|Not all related objects are migrated. %{docs_link_start}More info%{docs_link_end}."
msgstr ""
msgid "GroupsNew|Personal access token"
@@ -16514,15 +16750,27 @@ msgstr ""
msgid "Hello %{name},"
msgstr ""
-msgid "Hello there"
-msgstr ""
-
msgid "Hello, %{name}!"
msgstr ""
msgid "Hello, %{username}!"
msgstr ""
+msgid "HelloMessage|%{handshake_emoji} Contribute to GitLab: %{contribute_link}"
+msgstr ""
+
+msgid "HelloMessage|%{magnifier_emoji} Create a new GitLab issue: %{new_issue_link}"
+msgstr ""
+
+msgid "HelloMessage|%{rocket_emoji} We like your curiosity! Help us improve GitLab by joining the team: %{jobs_page_link}"
+msgstr ""
+
+msgid "HelloMessage|Does this page need fixes or improvements? Open an issue or contribute a merge request to help make GitLab more lovable. At GitLab, everyone can contribute!"
+msgstr ""
+
+msgid "HelloMessage|Welcome to GitLab!"
+msgstr ""
+
msgid "Help"
msgstr ""
@@ -16532,13 +16780,10 @@ msgstr ""
msgid "Helps prevent bots from creating accounts."
msgstr ""
-msgid "Helps prevent bots from creating issues"
+msgid "Helps prevent bots from creating issues."
msgstr ""
-msgid "Helps prevent malicious users hide their activity"
-msgstr ""
-
-msgid "Helps reduce request volume (e.g. from crawlers or abusive bots)"
+msgid "Helps prevent malicious users hide their activity."
msgstr ""
msgid "Helps reduce request volume (for example, from crawlers or abusive bots)"
@@ -16662,6 +16907,12 @@ msgstr ""
msgid "Housekeeping, export, path, transfer, remove, archive."
msgstr ""
+msgid "How do I configure Akismet?"
+msgstr ""
+
+msgid "How do I configure it?"
+msgstr ""
+
msgid "How do I configure runners?"
msgstr ""
@@ -16683,19 +16934,25 @@ msgstr ""
msgid "How do I set up this service?"
msgstr ""
+msgid "How do I use a web terminal?"
+msgstr ""
+
+msgid "How do I use file templates?"
+msgstr ""
+
msgid "How it works"
msgstr ""
msgid "How many days need to pass between marking entity for deletion and actual removing it."
msgstr ""
-msgid "How many seconds an IP will be counted towards the limit"
+msgid "How many seconds an IP counts toward the IP address limit."
msgstr ""
-msgid "I accept the %{terms_link}"
+msgid "How the job limiter handles jobs exceeding the thresholds specified below. The 'track' mode only logs the jobs. The 'compress' mode compresses the jobs and raises an exception if the compressed size exceeds the limit."
msgstr ""
-msgid "I accept the|Terms of Service and Privacy Policy"
+msgid "I accept the %{terms_link}"
msgstr ""
msgid "I forgot my password"
@@ -16779,13 +17036,16 @@ msgstr ""
msgid "IP Address"
msgstr ""
-msgid "IP expiration time"
+msgid "IP address expiration time"
msgstr ""
-msgid "IP subnet restriction only allowed for top-level groups"
+msgid "IP address restrictions"
+msgstr ""
+
+msgid "IP addresses per user"
msgstr ""
-msgid "IPs per user"
+msgid "IP subnet restriction only allowed for top-level groups"
msgstr ""
msgid "Identifier"
@@ -16800,6 +17060,9 @@ msgstr ""
msgid "If any indexed field exceeds this limit it will be truncated to this number of characters and the rest will not be indexed or searchable. This does not apply to repository and wiki indexing. Setting this to 0 means it is unlimited."
msgstr ""
+msgid "If blank, defaults to %{code_open}Retry later%{code_close}."
+msgstr ""
+
msgid "If blank, set allowable lifetime to %{instance_level_policy_in_words}, as defined by the instance admin. Once set, existing tokens for users in this group may be revoked."
msgstr ""
@@ -16851,6 +17114,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 did not initiate these sign-in attempts, please reach out to your administrator or enable two-factor authentication (2FA) on your account."
+msgstr ""
+
msgid "If you did not initiate this change, please contact your administrator immediately."
msgstr ""
@@ -16942,10 +17208,10 @@ msgstr ""
msgid "Import Projects from Gitea"
msgstr ""
-msgid "Import a project"
+msgid "Import an exported GitLab project"
msgstr ""
-msgid "Import an exported GitLab project"
+msgid "Import and export rate limits"
msgstr ""
msgid "Import failed due to a GitHub error: %{original}"
@@ -16957,12 +17223,18 @@ msgstr ""
msgid "Import from Jira"
msgstr ""
+msgid "Import group"
+msgstr ""
+
msgid "Import group from file"
msgstr ""
msgid "Import groups"
msgstr ""
+msgid "Import history"
+msgstr ""
+
msgid "Import in progress"
msgstr ""
@@ -17026,7 +17298,25 @@ msgstr ""
msgid "Import timed out. Import took longer than %{import_jobs_expiration} seconds"
msgstr ""
-msgid "Import/Export Rate Limits"
+msgid "ImportAProjectModal|Import from a project"
+msgstr ""
+
+msgid "ImportAProjectModal|Import members from another project"
+msgstr ""
+
+msgid "ImportAProjectModal|Import project members"
+msgstr ""
+
+msgid "ImportAProjectModal|Only project members (not group members) are imported, and they get the same permissions as the project you import from."
+msgstr ""
+
+msgid "ImportAProjectModal|Successfully imported"
+msgstr ""
+
+msgid "ImportAProjectModal|Unable to import project members"
+msgstr ""
+
+msgid "ImportAProjectModal|You're importing members to the %{strongStart}%{name}%{strongEnd} project."
msgstr ""
msgid "ImportButtons|Connect repositories from"
@@ -17079,7 +17369,7 @@ msgstr[1] ""
msgid "Importing..."
msgstr ""
-msgid "Import|A repository URL usually ends in a .git suffix, although this is not required. Double check to make sure your repository URL is correct."
+msgid "Import|There is not a valid Git repository at this URL. If your HTTP repository is not publicly accessible, verify your credentials."
msgstr ""
msgid "Improve customer support with Service Desk"
@@ -17088,9 +17378,6 @@ msgstr ""
msgid "Improves Git cloning performance."
msgstr ""
-msgid "In %{time_to_now}"
-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 ""
@@ -17376,7 +17663,7 @@ msgstr ""
msgid "InProductMarketing|Start a GitLab Ultimate trial today in less than one minute, no credit card required."
msgstr ""
-msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no CC required"
+msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no credit card required"
msgstr ""
msgid "InProductMarketing|Start a trial"
@@ -17415,7 +17702,7 @@ msgstr ""
msgid "InProductMarketing|Team up in GitLab for greater efficiency"
msgstr ""
-msgid "InProductMarketing|Team work makes the dream work"
+msgid "InProductMarketing|Team work makes the dream work"
msgstr ""
msgid "InProductMarketing|Test, create, deploy"
@@ -17996,6 +18283,9 @@ msgstr ""
msgid "Integrations|Create new issue in Jira"
msgstr ""
+msgid "Integrations|Create new issue in ZenTao"
+msgstr ""
+
msgid "Integrations|Default settings are inherited from the group level."
msgstr ""
@@ -18089,9 +18379,15 @@ msgstr ""
msgid "Integrations|Search Jira issues"
msgstr ""
+msgid "Integrations|Search ZenTao issues"
+msgstr ""
+
msgid "Integrations|Send notifications about project events to Unify Circuit."
msgstr ""
+msgid "Integrations|Send notifications about project events to a Unify Circuit conversation. %{docs_link}"
+msgstr ""
+
msgid "Integrations|Sign in to add namespaces"
msgstr ""
@@ -18131,6 +18427,9 @@ msgstr ""
msgid "Integrations|You've activated every integration 🎉"
msgstr ""
+msgid "Integrations|ZenTao issues display here when you create issues in your project in ZenTao."
+msgstr ""
+
msgid "Interactive mode"
msgstr ""
@@ -18158,9 +18457,6 @@ msgstr ""
msgid "Interval Pattern"
msgstr ""
-msgid "Introducing Value Stream Analytics"
-msgstr ""
-
msgid "Introducing Your DevOps Report"
msgstr ""
@@ -18257,6 +18553,12 @@ msgstr ""
msgid "Investigate vulnerability: %{title}"
msgstr ""
+msgid "Invisible Captcha"
+msgstr ""
+
+msgid "Invisible Captcha helps prevent the creation of spam accounts. It adds a honeypot field and time-sensitive form submission to the account signup form."
+msgstr ""
+
msgid "Invitation"
msgstr ""
@@ -18710,12 +19012,18 @@ msgstr ""
msgid "Issues"
msgstr ""
+msgid "Issues I've created"
+msgstr ""
+
msgid "Issues Rate Limits"
msgstr ""
msgid "Issues and merge requests"
msgstr ""
+msgid "Issues assigned to me"
+msgstr ""
+
msgid "Issues can be bugs, tasks or ideas to be discussed. Also, issues are searchable and filterable."
msgstr ""
@@ -18827,7 +19135,7 @@ msgstr ""
msgid "Iterations|Create cadence"
msgstr ""
-msgid "Iterations|Create your first iteration"
+msgid "Iterations|Create iteration"
msgstr ""
msgid "Iterations|Delete cadence"
@@ -18836,6 +19144,9 @@ msgstr ""
msgid "Iterations|Delete iteration cadence?"
msgstr ""
+msgid "Iterations|Delete iteration?"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -18869,12 +19180,18 @@ msgstr ""
msgid "Iterations|New iteration cadence"
msgstr ""
+msgid "Iterations|No closed iterations."
+msgstr ""
+
msgid "Iterations|No iteration cadences to show."
msgstr ""
msgid "Iterations|No iterations in cadence."
msgstr ""
+msgid "Iterations|No open iterations."
+msgstr ""
+
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
@@ -18905,6 +19222,9 @@ msgstr ""
msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
msgstr ""
+msgid "Iterations|This will remove the iteration from any issues that are assigned to it."
+msgstr ""
+
msgid "Iterations|Title"
msgstr ""
@@ -18920,15 +19240,9 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "I’m familiar with the basics of DevOps."
-msgstr ""
-
msgid "I’m joining my team who’s already on GitLab"
msgstr ""
-msgid "I’m not familiar with the basics of DevOps."
-msgstr ""
-
msgid "Jaeger URL"
msgstr ""
@@ -19193,6 +19507,9 @@ msgstr ""
msgid "Job"
msgstr ""
+msgid "Job %{jobName}"
+msgstr ""
+
msgid "Job Failed #%{build_id}"
msgstr ""
@@ -19783,9 +20100,6 @@ msgstr ""
msgid "Learn more in the"
msgstr ""
-msgid "Learn more in the|pipeline schedules documentation"
-msgstr ""
-
msgid "Learn more."
msgstr ""
@@ -19897,9 +20211,6 @@ msgstr ""
msgid "Leave Admin Mode"
msgstr ""
-msgid "Leave blank for no limit. Once set, existing personal access tokens may be revoked."
-msgstr ""
-
msgid "Leave edit mode? All unsaved changes will be lost."
msgstr ""
@@ -19945,10 +20256,10 @@ msgstr ""
msgid "LicenseCompliance|Acceptable license to be used in the project"
msgstr ""
-msgid "LicenseCompliance|Add a license"
+msgid "LicenseCompliance|Add license and related policy"
msgstr ""
-msgid "LicenseCompliance|Add license and related policy"
+msgid "LicenseCompliance|Add license policy"
msgstr ""
msgid "LicenseCompliance|Allow"
@@ -20038,6 +20349,9 @@ msgstr ""
msgid "LicenseManagement|Uncategorized"
msgstr ""
+msgid "Licensed Enterprise Edition features can be used if the project namespace's plan includes the feature, or if the project is public."
+msgstr ""
+
msgid "Licensed Features"
msgstr ""
@@ -20104,7 +20418,10 @@ msgstr ""
msgid "Limit namespaces and projects that can be indexed"
msgstr ""
-msgid "Limit sign in from multiple ips"
+msgid "Limit project size at a global, group, and project level. %{link_start}Learn more%{link_end}."
+msgstr ""
+
+msgid "Limit sign in from multiple IP addresses"
msgstr ""
msgid "Limit the number of concurrent operations this secondary site can run in the background."
@@ -20116,11 +20433,17 @@ msgstr ""
msgid "Limit the number of issues and epics per minute a user can create through web and API requests."
msgstr ""
+msgid "Limit the size of Sidekiq jobs stored in Redis."
+msgstr ""
+
msgid "Limited to showing %d event at most"
msgid_plural "Limited to showing %d events at most"
msgstr[0] ""
msgstr[1] ""
+msgid "Limiting mode"
+msgstr ""
+
msgid "Line changes"
msgstr ""
@@ -20190,9 +20513,6 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
-msgid "List of users to be excluded from the limit"
-msgstr ""
-
msgid "List options"
msgstr ""
@@ -20232,9 +20552,6 @@ msgstr ""
msgid "Loading functions timed out. Please reload the page to try again."
msgstr ""
-msgid "Loading issues"
-msgstr ""
-
msgid "Loading more"
msgstr ""
@@ -20526,6 +20843,9 @@ msgstr ""
msgid "Marked For Deletion At - %{deletion_time}"
msgstr ""
+msgid "Marked as ready. Merging is now allowed."
+msgstr ""
+
msgid "Marked this %{noun} as a draft."
msgstr ""
@@ -20598,52 +20918,22 @@ msgstr ""
msgid "Max 100,000 events"
msgstr ""
-msgid "Max 20 characters"
-msgstr ""
-
-msgid "Max Group Export Download requests per minute per user"
-msgstr ""
-
-msgid "Max Group Export requests per minute per user"
-msgstr ""
-
-msgid "Max Group Import requests per minute per user"
-msgstr ""
-
-msgid "Max Project Export Download requests per minute per user"
-msgstr ""
-
-msgid "Max Project Export requests per minute per user"
-msgstr ""
-
-msgid "Max Project Import requests per minute per user"
-msgstr ""
-
-msgid "Max authenticated API requests per period per user"
-msgstr ""
-
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
-msgid "Max authenticated web requests per period per user"
-msgstr ""
-
msgid "Max file size is 200 KB."
msgstr ""
-msgid "Max requests per minute per user"
-msgstr ""
-
msgid "Max role"
msgstr ""
msgid "Max session time"
msgstr ""
-msgid "Max unauthenticated requests per period per IP"
+msgid "MaxBuilds"
msgstr ""
-msgid "MaxBuilds"
+msgid "Maximum 20 characters"
msgstr ""
msgid "Maximum Conan package file size in bytes"
@@ -20679,6 +20969,12 @@ msgstr ""
msgid "Maximum attachment size (MB)"
msgstr ""
+msgid "Maximum authenticated API requests per rate limit period per user"
+msgstr ""
+
+msgid "Maximum authenticated web requests per rate limit period per user"
+msgstr ""
+
msgid "Maximum bulk request size (MiB)"
msgstr ""
@@ -20724,6 +21020,15 @@ msgstr ""
msgid "Maximum files in a diff"
msgstr ""
+msgid "Maximum group export download requests per minute"
+msgstr ""
+
+msgid "Maximum group export requests per minute"
+msgstr ""
+
+msgid "Maximum group import requests per minute"
+msgstr ""
+
msgid "Maximum import size"
msgstr ""
@@ -20760,7 +21065,7 @@ msgstr ""
msgid "Maximum number of projects."
msgstr ""
-msgid "Maximum number of unique IPs per user"
+msgid "Maximum number of unique IP addresses per user."
msgstr ""
msgid "Maximum page reached"
@@ -20769,12 +21074,24 @@ msgstr ""
msgid "Maximum page size"
msgstr ""
+msgid "Maximum project export download requests per minute"
+msgstr ""
+
+msgid "Maximum project export requests per minute"
+msgstr ""
+
+msgid "Maximum project import requests per minute"
+msgstr ""
+
msgid "Maximum push size"
msgstr ""
msgid "Maximum push size (MB)"
msgstr ""
+msgid "Maximum requests per minute"
+msgstr ""
+
msgid "Maximum running slices"
msgstr ""
@@ -20802,10 +21119,16 @@ msgstr ""
msgid "Maximum time between updates that a mirror can have when scheduled to synchronize."
msgstr ""
-msgid "Maximum time for web terminal websocket connection (in seconds). 0 for unlimited."
+msgid "Maximum time that users are allowed to skip the setup of two-factor authentication (in hours). Set to 0 (zero) to enforce at next sign in."
msgstr ""
-msgid "Maximum time that users are allowed to skip the setup of two-factor authentication (in hours). Set to 0 (zero) to enforce at next sign in."
+msgid "Maximum time, in seconds, for a web terminal websocket connection. 0 for unlimited."
+msgstr ""
+
+msgid "Maximum unauthenticated API requests per rate limit period per IP"
+msgstr ""
+
+msgid "Maximum unauthenticated web requests per rate limit period per IP"
msgstr ""
msgid "May"
@@ -20823,9 +21146,6 @@ msgstr ""
msgid "Medium vulnerabilities present"
msgstr ""
-msgid "Member lock"
-msgstr ""
-
msgid "Member since"
msgstr ""
@@ -20862,6 +21182,9 @@ msgstr ""
msgid "Members of a group may only view projects they have permission to access"
msgstr ""
+msgid "Membership"
+msgstr ""
+
msgid "Members|%{time} by %{user}"
msgstr ""
@@ -20922,9 +21245,6 @@ msgstr ""
msgid "Members|Expiration date updated successfully."
msgstr ""
-msgid "Members|Expired"
-msgstr ""
-
msgid "Members|Filter members"
msgstr ""
@@ -20940,9 +21260,6 @@ msgstr ""
msgid "Members|Membership"
msgstr ""
-msgid "Members|No expiration set"
-msgstr ""
-
msgid "Members|Remove \"%{groupName}\""
msgstr ""
@@ -20964,9 +21281,6 @@ msgstr ""
msgid "Members|Search invited"
msgstr ""
-msgid "Members|in %{time}"
-msgstr ""
-
msgid "Member|Deny access"
msgstr ""
@@ -21042,9 +21356,6 @@ msgstr ""
msgid "Merge request %{mr_link} was reviewed by %{mr_author}"
msgstr ""
-msgid "Merge request (MR) approvals"
-msgstr ""
-
msgid "Merge request analytics"
msgstr ""
@@ -21066,12 +21377,21 @@ msgstr ""
msgid "Merge requests"
msgstr ""
+msgid "Merge requests I've created"
+msgstr ""
+
msgid "Merge requests are a place to propose changes you've made to a project and discuss those changes with others"
msgstr ""
msgid "Merge requests are read-only in a secondary Geo node"
msgstr ""
+msgid "Merge requests assigned to me"
+msgstr ""
+
+msgid "Merge requests that I'm a reviewer"
+msgstr ""
+
msgid "Merge the branch and fix any conflicts that come up"
msgstr ""
@@ -21132,10 +21452,10 @@ msgstr ""
msgid "MergeRequests|An error occurred while saving the draft comment."
msgstr ""
-msgid "MergeRequests|Failed to squash. Should be done manually."
+msgid "MergeRequests|Create issue to resolve thread"
msgstr ""
-msgid "MergeRequests|Resolve this thread in a new issue"
+msgid "MergeRequests|Failed to squash. Should be done manually."
msgstr ""
msgid "MergeRequests|Saving the comment failed"
@@ -21949,6 +22269,9 @@ msgstr ""
msgid "MoveIssue|Cannot move issue to project it originates from!"
msgstr ""
+msgid "MoveIssue|Cannot move issues of '%{issue_type}' type."
+msgstr ""
+
msgid "Moved issue to %{label} column in the board."
msgstr ""
@@ -22074,6 +22397,15 @@ 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. To learn more about reducing storage capacity please visit our docs."
msgstr ""
+msgid "NamespaceUserCap|Pending users must be reviewed and approved by a group owner. Learn more about %{user_caps_link_start}User Caps%{link_end} and %{users_pending_approval_link_start}Users Pending Approval%{link_end}."
+msgstr ""
+
+msgid "NamespaceUserCap|View pending user approvals"
+msgstr ""
+
+msgid "NamespaceUserCap|Your group has reached its billable member limit"
+msgstr ""
+
msgid "Namespaces"
msgstr ""
@@ -22116,9 +22448,6 @@ msgstr ""
msgid "Network"
msgstr ""
-msgid "Network Policy|New rule"
-msgstr ""
-
msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is inbound from a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
msgstr ""
@@ -22140,16 +22469,13 @@ msgstr ""
msgid "NetworkPolicies|%{strongOpen}any%{strongClose} port"
msgstr ""
-msgid "NetworkPolicies|+ Add alert"
-msgstr ""
-
msgid "NetworkPolicies|.yaml"
msgstr ""
msgid "NetworkPolicies|.yaml mode"
msgstr ""
-msgid "NetworkPolicies|Actions"
+msgid "NetworkPolicies|Add alert"
msgstr ""
msgid "NetworkPolicies|Alerts are intended to be selectively used for a limited number of events that are potentially concerning and warrant a manual review. Alerts should not be used as a substitute for a SIEM or a logging tool. High volume alerts are likely to be dropped so as to preserve the stability of GitLab's integration with Kubernetes."
@@ -22185,9 +22511,6 @@ msgstr ""
msgid "NetworkPolicies|Deny all traffic"
msgstr ""
-msgid "NetworkPolicies|Description"
-msgstr ""
-
msgid "NetworkPolicies|Edit policy"
msgstr ""
@@ -22200,9 +22523,6 @@ msgstr ""
msgid "NetworkPolicies|IP/subnet"
msgstr ""
-msgid "NetworkPolicies|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
-msgstr ""
-
msgid "NetworkPolicies|Invalid or empty policy"
msgstr ""
@@ -22212,19 +22532,16 @@ msgstr ""
msgid "NetworkPolicies|Kubernetes error: %{error}"
msgstr ""
-msgid "NetworkPolicies|Name"
-msgstr ""
-
msgid "NetworkPolicies|Network"
msgstr ""
-msgid "NetworkPolicies|Network traffic"
+msgid "NetworkPolicies|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
msgstr ""
-msgid "NetworkPolicies|New policy"
+msgid "NetworkPolicies|Network policy can be created after the environment is loaded successfully."
msgstr ""
-msgid "NetworkPolicies|No policies detected"
+msgid "NetworkPolicies|Network traffic"
msgstr ""
msgid "NetworkPolicies|None selected"
@@ -22233,21 +22550,12 @@ msgstr ""
msgid "NetworkPolicies|Please %{installLinkStart}install%{installLinkEnd} and %{configureLinkStart}configure a Kubernetes Agent for this project%{configureLinkEnd} to enable alerts."
msgstr ""
-msgid "NetworkPolicies|Policies are a specification of how groups of pods are allowed to communicate with each other's network endpoints."
-msgstr ""
-
msgid "NetworkPolicies|Policy %{policyName} was successfully changed"
msgstr ""
msgid "NetworkPolicies|Policy definition"
msgstr ""
-msgid "NetworkPolicies|Policy editor"
-msgstr ""
-
-msgid "NetworkPolicies|Policy preview"
-msgstr ""
-
msgid "NetworkPolicies|Rule"
msgstr ""
@@ -22257,9 +22565,6 @@ msgstr ""
msgid "NetworkPolicies|Rule mode is unavailable for this policy. In some cases, we cannot parse the YAML file back into the rules editor."
msgstr ""
-msgid "NetworkPolicies|Rules"
-msgstr ""
-
msgid "NetworkPolicies|Save changes"
msgstr ""
@@ -22272,9 +22577,6 @@ msgstr ""
msgid "NetworkPolicies|Traffic that does not match any rule will be blocked."
msgstr ""
-msgid "NetworkPolicies|Unable to parse policy"
-msgstr ""
-
msgid "NetworkPolicies|all DNS names"
msgstr ""
@@ -22454,6 +22756,9 @@ msgstr ""
msgid "New issue"
msgstr ""
+msgid "New issue in %{project}"
+msgstr ""
+
msgid "New issue title"
msgstr ""
@@ -22532,7 +22837,7 @@ msgstr ""
msgid "Newest first"
msgstr ""
-msgid "Newly registered users will by default be external"
+msgid "Newly-registered users are external by default"
msgstr ""
msgid "Next"
@@ -22847,8 +23152,10 @@ msgstr ""
msgid "No webhooks found, add one in the form above."
msgstr ""
-msgid "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} to renew your subscription."
-msgstr ""
+msgid "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} day to renew your subscription."
+msgid_plural "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} days to renew your subscription."
+msgstr[0] ""
+msgstr[1] ""
msgid "No. of commits"
msgstr ""
@@ -22865,7 +23172,7 @@ msgstr ""
msgid "Nodes"
msgstr ""
-msgid "Non-admin users can sign in with read-only access and make read-only API requests."
+msgid "Non-admin users are restricted to read-only access, in both GitLab UI and API."
msgstr ""
msgid "None"
@@ -22946,7 +23253,7 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
-msgid "Notes Rate Limits"
+msgid "Notes rate limit"
msgstr ""
msgid "Notes|Are you sure you want to cancel creating this comment?"
@@ -23113,9 +23420,6 @@ msgstr ""
msgid "November"
msgstr ""
-msgid "Novice"
-msgstr ""
-
msgid "Now, personalize your GitLab experience"
msgstr ""
@@ -23284,7 +23588,7 @@ msgstr ""
msgid "OnCallSchedules|For this rotation, on-call will be:"
msgstr ""
-msgid "OnCallSchedules|On-call schedule %{schedule} in Project %{project}"
+msgid "OnCallSchedules|On-call schedule %{obstacle} in Project %{project}"
msgstr ""
msgid "OnCallSchedules|On-call schedules"
@@ -23431,22 +23735,22 @@ msgstr ""
msgid "OnDemandScans|Scanner profile"
msgstr ""
-msgid "OnDemandScans|Select one of the existing profiles"
+msgid "OnDemandScans|Schedule scan"
msgstr ""
-msgid "OnDemandScans|Site profile"
+msgid "OnDemandScans|Select one of the existing profiles"
msgstr ""
-msgid "OnDemandScans|Use existing scanner profile"
+msgid "OnDemandScans|Site profile"
msgstr ""
-msgid "OnDemandScans|Use existing site profile"
+msgid "OnDemandScans|Start time"
msgstr ""
-msgid "OnDemandScans|You can either choose a passive scan or validate the target site in your chosen site profile. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
+msgid "OnDemandScans|Use existing scanner profile"
msgstr ""
-msgid "OnDemandScans|You cannot run an active scan against an unvalidated site."
+msgid "OnDemandScans|Use existing site profile"
msgstr ""
msgid "OnDemandScans|You must create a repository within your project to run an on-demand scan."
@@ -23511,6 +23815,9 @@ msgstr ""
msgid "Only admins can delete project"
msgstr ""
+msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
+msgstr ""
+
msgid "Only include features new to your current subscription tier."
msgstr ""
@@ -23529,6 +23836,12 @@ msgstr ""
msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
+msgid "Only reCAPTCHA v2 is supported:"
+msgstr ""
+
+msgid "Only users from the specified IP address ranges are able to reach this group, including all subgroups, projects, and Git repositories."
+msgstr ""
+
msgid "Only verified users with an email address in any of these domains can be added to the group."
msgstr ""
@@ -23715,9 +24028,6 @@ msgstr ""
msgid "Package Registry"
msgstr ""
-msgid "Package Registry Rate Limits"
-msgstr ""
-
msgid "Package Registry: authenticated API requests"
msgstr ""
@@ -23736,6 +24046,9 @@ msgstr ""
msgid "Package recipe already exists"
msgstr ""
+msgid "Package registry rate limits"
+msgstr ""
+
msgid "Package type"
msgstr ""
@@ -23802,6 +24115,9 @@ msgstr ""
msgid "PackageRegistry|Composer"
msgstr ""
+msgid "PackageRegistry|Composer.json with license: %{license} and version: %{version}"
+msgstr ""
+
msgid "PackageRegistry|Conan"
msgstr ""
@@ -23865,6 +24181,9 @@ msgstr ""
msgid "PackageRegistry|Copy require package include"
msgstr ""
+msgid "PackageRegistry|Copy target SHA"
+msgstr ""
+
msgid "PackageRegistry|Copy yarn command"
msgstr ""
@@ -23931,6 +24250,9 @@ msgstr ""
msgid "PackageRegistry|Install package version"
msgstr ""
+msgid "PackageRegistry|Instance-level"
+msgstr ""
+
msgid "PackageRegistry|Invalid Package: failed metadata extraction"
msgstr ""
@@ -23976,6 +24298,9 @@ msgstr ""
msgid "PackageRegistry|Pip Command"
msgstr ""
+msgid "PackageRegistry|Project-level"
+msgstr ""
+
msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
msgstr ""
@@ -23997,6 +24322,9 @@ msgstr ""
msgid "PackageRegistry|Remove package"
msgstr ""
+msgid "PackageRegistry|Required Python: %{pythonVersion}"
+msgstr ""
+
msgid "PackageRegistry|RubyGems"
msgstr ""
@@ -24039,6 +24367,9 @@ msgstr ""
msgid "PackageRegistry|Source project located at %{link}"
msgstr ""
+msgid "PackageRegistry|Target SHA: %{sha}"
+msgstr ""
+
msgid "PackageRegistry|There are no other versions of this package."
msgstr ""
@@ -24207,6 +24538,18 @@ msgstr ""
msgid "Password was successfully updated. Please sign in again."
msgstr ""
+msgid "PasswordPrompt|Confirm password"
+msgstr ""
+
+msgid "PasswordPrompt|Confirm password to continue"
+msgstr ""
+
+msgid "PasswordPrompt|Password is required"
+msgstr ""
+
+msgid "PasswordPrompt|Please enter your password to confirm"
+msgstr ""
+
msgid "Passwords should be unique and not used for any other sites or services."
msgstr ""
@@ -24234,6 +24577,9 @@ msgstr ""
msgid "Paste project path (i.e. gitlab-org/gitlab)"
msgstr ""
+msgid "Paste this DSN into your Sentry SDK"
+msgstr ""
+
msgid "Paste your public SSH key, which is usually contained in the file '~/.ssh/id_ed25519.pub' or '~/.ssh/id_rsa.pub' and begins with 'ssh-ed25519' or 'ssh-rsa'. Do not paste your private SSH key, as that can compromise your identity."
msgstr ""
@@ -24318,6 +24664,9 @@ msgstr ""
msgid "PerformanceBar|First Contentful Paint"
msgstr ""
+msgid "PerformanceBar|Flamegraph with mode:"
+msgstr ""
+
msgid "PerformanceBar|Frontend resources"
msgstr ""
@@ -24351,6 +24700,15 @@ msgstr ""
msgid "PerformanceBar|Trace"
msgstr ""
+msgid "PerformanceBar|cpu"
+msgstr ""
+
+msgid "PerformanceBar|object"
+msgstr ""
+
+msgid "PerformanceBar|wall"
+msgstr ""
+
msgid "Period in seconds"
msgstr ""
@@ -24579,6 +24937,48 @@ msgstr ""
msgid "PipelineSchedules|Variables"
msgstr ""
+msgid "PipelineSource|API"
+msgstr ""
+
+msgid "PipelineSource|Chat"
+msgstr ""
+
+msgid "PipelineSource|External"
+msgstr ""
+
+msgid "PipelineSource|External Pull Request"
+msgstr ""
+
+msgid "PipelineSource|Merge Request"
+msgstr ""
+
+msgid "PipelineSource|On-Demand DAST Scan"
+msgstr ""
+
+msgid "PipelineSource|On-Demand DAST Validation"
+msgstr ""
+
+msgid "PipelineSource|Parent Pipeline"
+msgstr ""
+
+msgid "PipelineSource|Pipeline"
+msgstr ""
+
+msgid "PipelineSource|Push"
+msgstr ""
+
+msgid "PipelineSource|Schedule"
+msgstr ""
+
+msgid "PipelineSource|Trigger"
+msgstr ""
+
+msgid "PipelineSource|Web"
+msgstr ""
+
+msgid "PipelineSource|Web IDE"
+msgstr ""
+
msgid "PipelineStatusTooltip|Pipeline: %{ciStatus}"
msgstr ""
@@ -24879,46 +25279,7 @@ msgstr ""
msgid "Pipeline|Source"
msgstr ""
-msgid "Pipeline|Source|API"
-msgstr ""
-
-msgid "Pipeline|Source|Chat"
-msgstr ""
-
-msgid "Pipeline|Source|External"
-msgstr ""
-
-msgid "Pipeline|Source|External Pull Request"
-msgstr ""
-
-msgid "Pipeline|Source|Merge Request"
-msgstr ""
-
-msgid "Pipeline|Source|On-Demand DAST Scan"
-msgstr ""
-
-msgid "Pipeline|Source|On-Demand DAST Validation"
-msgstr ""
-
-msgid "Pipeline|Source|Parent Pipeline"
-msgstr ""
-
-msgid "Pipeline|Source|Pipeline"
-msgstr ""
-
-msgid "Pipeline|Source|Push"
-msgstr ""
-
-msgid "Pipeline|Source|Schedule"
-msgstr ""
-
-msgid "Pipeline|Source|Trigger"
-msgstr ""
-
-msgid "Pipeline|Source|Web"
-msgstr ""
-
-msgid "Pipeline|Source|Web IDE"
+msgid "Pipeline|Source|Security Policy"
msgstr ""
msgid "Pipeline|Specify variable values to be used in this run. The values specified in %{linkStart}CI/CD settings%{linkEnd} will be used by default."
@@ -24969,7 +25330,7 @@ msgstr ""
msgid "Pipeline|We are currently unable to fetch pipeline data"
msgstr ""
-msgid "Pipeline|You’re about to stop pipeline %{pipelineId}."
+msgid "Pipeline|You’re about to stop pipeline #%{pipelineId}."
msgstr ""
msgid "Pipeline|for"
@@ -24996,6 +25357,9 @@ msgstr ""
msgid "Plain diff"
msgstr ""
+msgid "Plain-text response to send to clients that hit a rate limit"
+msgstr ""
+
msgid "Plan:"
msgstr ""
@@ -25140,9 +25504,6 @@ msgstr ""
msgid "Please provide attributes to update"
msgstr ""
-msgid "Please provide your username or email address."
-msgstr ""
-
msgid "Please reach out if you have any questions and we'll be happy to assist."
msgstr ""
@@ -25185,9 +25546,6 @@ msgstr ""
msgid "Please set a new password before proceeding."
msgstr ""
-msgid "Please share your feedback about %{featureName} %{linkStart}in this issue%{linkEnd} to help us improve the experience."
-msgstr ""
-
msgid "Please solve the captcha"
msgstr ""
@@ -25365,6 +25723,9 @@ msgstr ""
msgid "Prevent adding new members to project membership within this group"
msgstr ""
+msgid "Prevent auto-stopping"
+msgstr ""
+
msgid "Prevent editing approval rules in projects and merge requests."
msgstr ""
@@ -25377,7 +25738,7 @@ msgstr ""
msgid "Prevent users from changing their profile name"
msgstr ""
-msgid "Prevent users from performing write operations on GitLab while performing maintenance."
+msgid "Prevent users from performing write operations while GitLab maintenance is in progress."
msgstr ""
msgid "Preview"
@@ -25650,6 +26011,9 @@ msgstr ""
msgid "Profiles|Enter your name, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Enter your password to confirm the email change"
+msgstr ""
+
msgid "Profiles|Enter your pronouns to let people know how to refer to you"
msgstr ""
@@ -25884,10 +26248,10 @@ msgstr ""
msgid "Profiles|e.g. My MacBook key"
msgstr ""
-msgid "Profiles|username"
+msgid "Profiles|https://website.com"
msgstr ""
-msgid "Profiles|website.com"
+msgid "Profiles|username"
msgstr ""
msgid "Profiles|your account"
@@ -26130,9 +26494,21 @@ msgstr ""
msgid "ProjectSelect| or group"
msgstr ""
+msgid "ProjectSelect|No matching results"
+msgstr ""
+
msgid "ProjectSelect|Search for project"
msgstr ""
+msgid "ProjectSelect|Search projects"
+msgstr ""
+
+msgid "ProjectSelect|Select a project"
+msgstr ""
+
+msgid "ProjectSelect|There was an error fetching the projects. Please try again."
+msgstr ""
+
msgid "ProjectService|Drone server URL"
msgstr ""
@@ -26220,6 +26596,9 @@ msgstr ""
msgid "ProjectService|Trigger event when a new, unique alert is recorded."
msgstr ""
+msgid "ProjectService|Trigger event when a new, unique vulnerability is recorded. (Note: This feature requires an Ultimate plan.)"
+msgstr ""
+
msgid "ProjectService|Trigger event when a pipeline status changes."
msgstr ""
@@ -26634,9 +27013,15 @@ msgstr ""
msgid "Projects are graded based on the highest severity vulnerability present"
msgstr ""
+msgid "Projects are organized into groups"
+msgstr ""
+
msgid "Projects contributed to"
msgstr ""
+msgid "Projects help you organize your work. They contain your file repository, issues, merge requests, and so much more."
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr ""
@@ -26871,10 +27256,10 @@ msgstr ""
msgid "PrometheusService|Prometheus cluster integration"
msgstr ""
-msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
+msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
msgstr ""
-msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
+msgid "PrometheusService|The ID of the IAP-secured resource."
msgstr ""
msgid "PrometheusService|The Prometheus API base URL."
@@ -27492,6 +27877,9 @@ msgstr ""
msgid "Rate limit"
msgstr ""
+msgid "Rate limits can help reduce request volume (like from crawlers or abusive bots)."
+msgstr ""
+
msgid "Raw blob request rate limit per minute"
msgstr ""
@@ -27504,6 +27892,9 @@ msgstr ""
msgid "Re-authentication required"
msgstr ""
+msgid "Re-import"
+msgstr ""
+
msgid "Re-request review"
msgstr ""
@@ -27525,6 +27916,9 @@ msgstr ""
msgid "Read more about related issues"
msgstr ""
+msgid "Read their documentation."
+msgstr ""
+
msgid "Ready to get started with GitLab? Follow these steps to set up your workspace, plan and commit changes, and deploy your project."
msgstr ""
@@ -27558,6 +27952,9 @@ msgstr ""
msgid "Receive any notifications from GitLab."
msgstr ""
+msgid "Receive notification of abuse reports by email."
+msgstr ""
+
msgid "Receive notifications about your own activity"
msgstr ""
@@ -27701,9 +28098,6 @@ msgstr ""
msgid "Registry setup"
msgstr ""
-msgid "Regulate approvals by authors/committers. Affects all projects."
-msgstr ""
-
msgid "Reindexing Status: %{status} (Slice multiplier: %{multiplier}, Maximum running slices: %{max_slices})"
msgstr ""
@@ -27799,6 +28193,9 @@ msgstr ""
msgid "Release|Something went wrong while saving the release details."
msgstr ""
+msgid "Reload page"
+msgstr ""
+
msgid "Remediations"
msgstr ""
@@ -28081,6 +28478,9 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
+msgid "Repeats"
+msgstr ""
+
msgid "Replace"
msgstr ""
@@ -28443,10 +28843,7 @@ msgstr ""
msgid "Require additional authentication for administrative tasks."
msgstr ""
-msgid "Require all users in this group to setup Two-factor authentication"
-msgstr ""
-
-msgid "Require all users in this group to setup two-factor authentication"
+msgid "Require all users in this group to set up two-factor authentication"
msgstr ""
msgid "Required approvals (%{approvals_given} given)"
@@ -28492,6 +28889,9 @@ msgstr[1] ""
msgid "Requires values to meet regular expression requirements."
msgstr ""
+msgid "Requires you to deploy or set up cloud-hosted Sentry."
+msgstr ""
+
msgid "Requires your primary GitLab email address."
msgstr ""
@@ -28552,9 +28952,6 @@ msgstr ""
msgid "Resolve"
msgstr ""
-msgid "Resolve all threads in new issue"
-msgstr ""
-
msgid "Resolve conflicts"
msgstr ""
@@ -28612,6 +29009,9 @@ msgstr ""
msgid "Response text"
msgstr ""
+msgid "Restart GitLab to apply changes."
+msgstr ""
+
msgid "Restart Terminal"
msgstr ""
@@ -28630,6 +29030,9 @@ msgstr ""
msgid "Restoring the project will prevent the project from being removed on this date and restore people's ability to make changes to it."
msgstr ""
+msgid "Restrict group access by IP address. %{link_start}Learn more%{link_end}."
+msgstr ""
+
msgid "Restrict membership by email domain"
msgstr ""
@@ -28943,6 +29346,9 @@ msgstr ""
msgid "Runners|Runner #%{runner_id}"
msgstr ""
+msgid "Runners|Runner assigned to project."
+msgstr ""
+
msgid "Runners|Runner is offline, last contact was %{runner_contact} ago"
msgstr ""
@@ -28955,6 +29361,9 @@ msgstr ""
msgid "Runners|Runner registration"
msgstr ""
+msgid "Runners|Runner unassigned from project."
+msgstr ""
+
msgid "Runners|Runners"
msgstr ""
@@ -29147,7 +29556,7 @@ msgstr ""
msgid "SastEntryPoints|How do I set up SAST?"
msgstr ""
-msgid "SastEntryPoints|Learn more."
+msgid "SastEntryPoints|Learn more"
msgstr ""
msgid "Satisfied"
@@ -29189,7 +29598,7 @@ msgstr ""
msgid "Save pipeline schedule"
msgstr ""
-msgid "Save space and find images in the container Registry. remove unneeded tags and keep only the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
+msgid "Save storage space by automatically deleting tags from the container registry and keeping the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
msgstr ""
msgid "Saving"
@@ -29363,6 +29772,9 @@ msgstr ""
msgid "Search or filter results…"
msgstr ""
+msgid "Search or jump to..."
+msgstr ""
+
msgid "Search project"
msgstr ""
@@ -29423,16 +29835,16 @@ msgstr ""
msgid "SearchCodeResults|of %{link_to_project}"
msgstr ""
-msgid "SearchResults|Showing %{count} %{scope} for%{term_element}"
+msgid "SearchResults|Showing %{count} %{scope} for %{term_element}"
msgstr ""
-msgid "SearchResults|Showing %{count} %{scope} for%{term_element} in your personal and project snippets"
+msgid "SearchResults|Showing %{count} %{scope} for %{term_element} in your personal and project snippets"
msgstr ""
-msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for%{term_element}"
+msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for %{term_element}"
msgstr ""
-msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for%{term_element} in your personal and project snippets"
+msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for %{term_element} in your personal and project snippets"
msgstr ""
msgid "SearchResults|code result"
@@ -29514,6 +29926,9 @@ msgstr ""
msgid "Secret Detection"
msgstr ""
+msgid "Secret access key"
+msgstr ""
+
msgid "Secret token"
msgstr ""
@@ -29553,9 +29968,6 @@ msgstr ""
msgid "SecurityApprovals|A merge request approval is required when the license compliance report contains a denied license."
msgstr ""
-msgid "SecurityApprovals|Configurable if security scanners are enabled. %{linkStart}Learn more.%{linkEnd}"
-msgstr ""
-
msgid "SecurityApprovals|Coverage-Check"
msgstr ""
@@ -29568,24 +29980,18 @@ msgstr ""
msgid "SecurityApprovals|Learn more about Vulnerability-Check"
msgstr ""
-msgid "SecurityApprovals|License Scanning must be enabled. %{linkStart}Learn more%{linkEnd}."
-msgstr ""
-
msgid "SecurityApprovals|License-Check"
msgstr ""
msgid "SecurityApprovals|Requires approval for Denied licenses. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}More information%{linkEnd}"
+msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "SecurityApprovals|Requires approval for vulnerabilities. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
-msgid "SecurityApprovals|Test coverage must be enabled. %{linkStart}Learn more%{linkEnd}."
-msgstr ""
-
msgid "SecurityApprovals|Vulnerability-Check"
msgstr ""
@@ -29649,6 +30055,12 @@ msgstr ""
msgid "SecurityConfiguration|Immediately begin risk analysis and remediation with application security features. Start with SAST and Secret Detection, available to all plans. Upgrade to Ultimate to get all features, including:"
msgstr ""
+msgid "SecurityConfiguration|Manage corpus"
+msgstr ""
+
+msgid "SecurityConfiguration|Manage corpus files used as mutation sources in coverage fuzzing."
+msgstr ""
+
msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
msgstr ""
@@ -29703,6 +30115,12 @@ msgstr ""
msgid "SecurityOrchestration|Action"
msgstr ""
+msgid "SecurityOrchestration|Actions"
+msgstr ""
+
+msgid "SecurityOrchestration|Add rule"
+msgstr ""
+
msgid "SecurityOrchestration|All policies"
msgstr ""
@@ -29736,9 +30154,6 @@ msgstr ""
msgid "SecurityOrchestration|Network"
msgstr ""
-msgid "SecurityOrchestration|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
-msgstr ""
-
msgid "SecurityOrchestration|New policy"
msgstr ""
@@ -29754,6 +30169,9 @@ msgstr ""
msgid "SecurityOrchestration|Policy editor"
msgstr ""
+msgid "SecurityOrchestration|Policy preview"
+msgstr ""
+
msgid "SecurityOrchestration|Policy status"
msgstr ""
@@ -29763,6 +30181,9 @@ msgstr ""
msgid "SecurityOrchestration|Rule"
msgstr ""
+msgid "SecurityOrchestration|Rules"
+msgstr ""
+
msgid "SecurityOrchestration|Scan Execution"
msgstr ""
@@ -29856,6 +30277,9 @@ msgstr ""
msgid "SecurityReports|Create issue"
msgstr ""
+msgid "SecurityReports|Development vulnerabilities"
+msgstr ""
+
msgid "SecurityReports|Dismiss vulnerability"
msgstr ""
@@ -29871,6 +30295,9 @@ msgstr ""
msgid "SecurityReports|Download results"
msgstr ""
+msgid "SecurityReports|Download scanned URLs"
+msgstr ""
+
msgid "SecurityReports|Download scanned resources"
msgstr ""
@@ -29994,6 +30421,9 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
+msgid "SecurityReports|The Vulnerability Report shows the results of the lastest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "SecurityReports|The security reports below contain one or more vulnerability findings that could not be parsed and were not recorded. Download the artifacts in the job output to investigate. Ensure any security report created conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
msgstr ""
@@ -30135,10 +30565,10 @@ msgstr ""
msgid "Select a repository"
msgstr ""
-msgid "Select a role"
+msgid "Select a repository containing templates for common files."
msgstr ""
-msgid "Select a shared template repository for all projects on this instance."
+msgid "Select a role"
msgstr ""
msgid "Select a template repository"
@@ -30216,6 +30646,9 @@ msgstr ""
msgid "Select project to choose zone"
msgstr ""
+msgid "Select project to create issue"
+msgstr ""
+
msgid "Select projects"
msgstr ""
@@ -30333,6 +30766,9 @@ msgstr ""
msgid "Send emails to help guide new users through the onboarding process."
msgstr ""
+msgid "Send emails to users upon account deactivation."
+msgstr ""
+
msgid "Send message"
msgstr ""
@@ -30351,6 +30787,9 @@ msgstr ""
msgid "Send service data"
msgstr ""
+msgid "Sentry"
+msgstr ""
+
msgid "Sentry API URL"
msgstr ""
@@ -30465,6 +30904,9 @@ msgstr ""
msgid "Service"
msgstr ""
+msgid "Service Accounts keys are required to authorize GitLab to deploy your Google Cloud project."
+msgstr ""
+
msgid "Service Desk"
msgstr ""
@@ -30537,15 +30979,15 @@ msgstr ""
msgid "Set a password on your account to pull or push via %{protocol}."
msgstr ""
-msgid "Set a template repository for projects in this group"
-msgstr ""
-
msgid "Set access permissions for this token."
msgstr ""
msgid "Set an instance-wide domain that will be available to all clusters when installing Knative."
msgstr ""
+msgid "Set any rate limit to %{code_open}0%{code_close} to disable the limit."
+msgstr ""
+
msgid "Set default and restrict visibility levels. Configure import sources and git access protocol."
msgstr ""
@@ -30558,7 +31000,7 @@ msgstr ""
msgid "Set limit to 0 to allow any file size."
msgstr ""
-msgid "Set max session time for web terminal."
+msgid "Set limits for web and API requests."
msgstr ""
msgid "Set milestone"
@@ -30567,15 +31009,18 @@ msgstr ""
msgid "Set new password"
msgstr ""
-msgid "Set notification email for abuse reports."
+msgid "Set parent epic to an epic"
msgstr ""
-msgid "Set parent epic to an epic"
+msgid "Set per-user rate limits for imports and exports of projects and groups."
msgstr ""
msgid "Set projects and maximum size limits, session duration, user options, and check feature availability for namespace plan."
msgstr ""
+msgid "Set rate limits for package registry API requests that supersede the general user and IP rate limits."
+msgstr ""
+
msgid "Set severity"
msgstr ""
@@ -30594,15 +31039,24 @@ msgstr ""
msgid "Set the default branch for this project. All merge requests and commits are made against this branch unless you specify a different one."
msgstr ""
+msgid "Set the default expiration time for job artifacts in all projects. Set to %{code_open}0%{code_close} to never expire artifacts by default. If no unit is written, it defaults to seconds. For example, these are all equivalent: %{code_open}3600%{code_close}, %{code_open}60 minutes%{code_close}, or %{code_open}one hour%{code_close}."
+msgstr ""
+
msgid "Set the due date to %{due_date}."
msgstr ""
msgid "Set the iteration to %{iteration_reference}."
msgstr ""
+msgid "Set the maximum session time for a web terminal."
+msgstr ""
+
msgid "Set the milestone to %{milestone_reference}."
msgstr ""
+msgid "Set the per-user rate limit for notes created by web or API requests."
+msgstr ""
+
msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
msgstr ""
@@ -30804,6 +31258,9 @@ msgstr ""
msgid "Show Pipeline IID"
msgstr ""
+msgid "Show all %{issuable_type}."
+msgstr ""
+
msgid "Show all activity"
msgstr ""
@@ -30855,15 +31312,9 @@ msgstr ""
msgid "Show list"
msgstr ""
-msgid "Show me advanced features"
-msgstr ""
-
msgid "Show me how to add a pipeline"
msgstr ""
-msgid "Show me the basics"
-msgstr ""
-
msgid "Show one file at a time"
msgstr ""
@@ -30904,15 +31355,15 @@ msgstr ""
msgid "Showing %{pageSize} of %{total} %{issuableType}"
msgstr ""
-msgid "Showing %{pageSize} of %{total} issues"
-msgstr ""
-
msgid "Showing all epics"
msgstr ""
msgid "Showing all issues"
msgstr ""
+msgid "Showing data for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
+msgstr ""
+
msgid "Showing data for workflow items created in this date range. Date range cannot exceed %{maxDateRange} days."
msgstr ""
@@ -30952,6 +31403,15 @@ msgstr ""
msgid "Sidebar|Weight"
msgstr ""
+msgid "Sidekiq job compression threshold (bytes)"
+msgstr ""
+
+msgid "Sidekiq job size limit (bytes)"
+msgstr ""
+
+msgid "Sidekiq job size limits"
+msgstr ""
+
msgid "Sign in"
msgstr ""
@@ -31072,6 +31532,9 @@ msgstr ""
msgid "Site profile not found for given parameters"
msgstr ""
+msgid "Sites"
+msgstr ""
+
msgid "Size"
msgstr ""
@@ -31102,19 +31565,22 @@ msgstr ""
msgid "SlackIntegration|Sends notifications about project events to Slack channels."
msgstr ""
-msgid "SlackService|2. Paste the %{strong_open}Token%{strong_close} into the field below"
+msgid "SlackService|1. %{slash_command_link_start}Add a slash command%{slash_command_link_end} in your Slack team using this information:"
msgstr ""
-msgid "SlackService|3. Select the %{strong_open}Active%{strong_close} checkbox, press %{strong_open}Save changes%{strong_close} and start using GitLab inside Slack!"
+msgid "SlackService|2. Paste the token from Slack in the %{strong_open}Token%{strong_close} field below."
msgstr ""
-msgid "SlackService|Fill in the word that works best for your team."
+msgid "SlackService|3. Select the %{strong_open}Active%{strong_close} checkbox, select %{strong_open}Save changes%{strong_close}, and start using slash commands in Slack!"
+msgstr ""
+
+msgid "SlackService|After setup, get a list of available Slack slash commands by entering"
msgstr ""
-msgid "SlackService|See list of available commands in Slack after setting up this service, by entering"
+msgid "SlackService|Fill in the word that works best for your team."
msgstr ""
-msgid "SlackService|This service allows users to perform common operations on this project by entering slash commands in Slack."
+msgid "SlackService|Perform common operations in this project by entering slash commands in Slack."
msgstr ""
msgid "Slice multiplier"
@@ -31180,7 +31646,7 @@ msgstr ""
msgid "Some child epics may be hidden due to applied filters"
msgstr ""
-msgid "Some common domains are not allowed. %{read_more_link}."
+msgid "Some common domains are not allowed. %{learn_more_link}."
msgstr ""
msgid "Some of the designs you tried uploading did not change:"
@@ -31264,9 +31730,6 @@ msgstr ""
msgid "Something went wrong while exporting requirements"
msgstr ""
-msgid "Something went wrong while fetching %{listType} list"
-msgstr ""
-
msgid "Something went wrong while fetching branches"
msgstr ""
@@ -31321,15 +31784,9 @@ msgstr ""
msgid "Something went wrong while merging this merge request. Please try again."
msgstr ""
-msgid "Something went wrong while moving issues."
-msgstr ""
-
msgid "Something went wrong while obtaining the Let's Encrypt certificate."
msgstr ""
-msgid "Something went wrong while performing the action."
-msgstr ""
-
msgid "Something went wrong while promoting the issue to an epic. Please try again."
msgstr ""
@@ -31657,7 +32114,10 @@ msgstr ""
msgid "SourcegraphPreferences|Uses a custom %{linkStart}Sourcegraph instance%{linkEnd}."
msgstr ""
-msgid "Spam Check API Key"
+msgid "Spam Check"
+msgstr ""
+
+msgid "Spam Check API key"
msgstr ""
msgid "Spam Logs"
@@ -31675,7 +32135,7 @@ msgstr ""
msgid "Specified URL cannot be used: \"%{reason}\""
msgstr ""
-msgid "Specify an e-mail address regex pattern to identify default internal users."
+msgid "Specify an email address regex pattern to identify default internal users."
msgstr ""
msgid "Speed up your pipelines with Needs relationships"
@@ -31930,7 +32390,7 @@ msgstr ""
msgid "StatusCheck|An error occurred fetching the status checks."
msgstr ""
-msgid "StatusCheck|Apply this status check to any branch or a specific protected branch."
+msgid "StatusCheck|Apply this status check to all branches or a specific protected branch."
msgstr ""
msgid "StatusCheck|Check for a status response in Merge Requests. Failures do not block merges. %{link_start}Learn more%{link_end}."
@@ -32269,6 +32729,9 @@ msgstr ""
msgid "Subscriptions"
msgstr ""
+msgid "Subscription|Your subscription for %{strong}%{namespace_name}%{strong_close} has expired and you are now on %{pricing_link_start}the GitLab Free tier%{pricing_link_end}. Don't worry, your data is safe. Get in touch with our support team (%{support_email}). They'll gladly help with your subscription renewal."
+msgstr ""
+
msgid "Subtracted"
msgstr ""
@@ -32497,6 +32960,9 @@ msgstr ""
msgid "SuperSonics|Plan"
msgstr ""
+msgid "SuperSonics|Please agree to the Subscription Agreement"
+msgstr ""
+
msgid "SuperSonics|Ready to get started? A GitLab plan is ideal for scaling organizations and for multi team usage."
msgstr ""
@@ -32527,6 +32993,9 @@ msgstr ""
msgid "SuperSonics|The activation code is not valid. Please make sure to copy it exactly from the Customers Portal or confirmation email. Learn more about %{linkStart}activating your subscription%{linkEnd}."
msgstr ""
+msgid "SuperSonics|The activation code should be a 24-character alphanumeric string"
+msgstr ""
+
msgid "SuperSonics|There is a connectivity issue."
msgstr ""
@@ -32569,9 +33038,15 @@ msgstr ""
msgid "SuperSonics|You do not have an active subscription"
msgstr ""
+msgid "SuperSonics|You have successfully added a license that activates on %{date}. Please see the subscription history table below for more details."
+msgstr ""
+
msgid "SuperSonics|You'll be charged for %{trueUpLinkStart}users over license%{trueUpLinkEnd} on a quarterly or annual basis, depending on the terms of your agreement."
msgstr ""
+msgid "SuperSonics|Your future dated license was successfully added"
+msgstr ""
+
msgid "SuperSonics|Your subscription"
msgstr ""
@@ -32824,7 +33299,7 @@ msgstr ""
msgid "Template to append to all Service Desk issues"
msgstr ""
-msgid "TemplateRepository|Select a repository to make its templates available to all projects. %{link_start}What should the repository contain?%{link_end} "
+msgid "TemplateRepository|Create common files more quickly, and standardize their format."
msgstr ""
msgid "Templates"
@@ -33030,7 +33505,7 @@ msgstr ""
msgid "TestCases|Search test cases"
msgstr ""
-msgid "TestCases|Something went wrong while adding test case to Todo."
+msgid "TestCases|Something went wrong while adding test case to a to-do item."
msgstr ""
msgid "TestCases|Something went wrong while creating a test case."
@@ -33042,7 +33517,7 @@ msgstr ""
msgid "TestCases|Something went wrong while fetching test cases list."
msgstr ""
-msgid "TestCases|Something went wrong while marking test case todo as done."
+msgid "TestCases|Something went wrong while marking test case to-do item as done."
msgstr ""
msgid "TestCases|Something went wrong while moving test case."
@@ -33162,7 +33637,7 @@ msgstr ""
msgid "Thanks for your purchase!"
msgstr ""
-msgid "That is ok, I do not want to renew"
+msgid "That's OK, I don't want to renew"
msgstr ""
msgid "That's it, well done!"
@@ -33185,7 +33660,7 @@ msgid_plural "The %{type} contains the following errors:"
msgstr[0] ""
msgstr[1] ""
-msgid "The API key used by GitLab for accessing the Spam Check service endpoint"
+msgid "The API key used by GitLab for accessing the Spam Check service endpoint."
msgstr ""
msgid "The GitLab subscription service (customers.gitlab.com) is currently experiencing an outage. You can monitor the status and get updates at %{linkStart}status.gitlab.com%{linkEnd}."
@@ -33224,9 +33699,6 @@ msgstr ""
msgid "The URL to use for connecting to Elasticsearch. Use a comma-separated list to support clustering (e.g., \"http://localhost:9200, http://localhost:9201\")."
msgstr ""
-msgid "The Vulnerability Report shows the results of the last successful pipeline run on the default branch."
-msgstr ""
-
msgid "The X509 Certificate to use when mutual TLS is required to communicate with the external authorization service. If left blank, the server certificate is still validated when accessing over HTTPS."
msgstr ""
@@ -33284,9 +33756,6 @@ msgstr ""
msgid "The default branch for this project has been changed. Please update your bookmarks."
msgstr ""
-msgid "The default expiration time for job artifacts. 0 for unlimited. The default unit is in seconds, but you can use other units, for example %{code_open}4 mins 2 sec%{code_close}, %{code_open}2h42min%{code_close}."
-msgstr ""
-
msgid "The dependency list details information about the components used within your project."
msgstr ""
@@ -33478,9 +33947,6 @@ msgstr ""
msgid "The merge conflicts for this merge request have already been resolved. Please return to the merge request."
msgstr ""
-msgid "The merge request can now be merged."
-msgstr ""
-
msgid "The metric must be one of %{metrics}."
msgstr ""
@@ -33856,7 +34322,7 @@ msgstr ""
msgid "There was a problem updating the keep latest artifacts setting."
msgstr ""
-msgid "There was an error %{message} todo."
+msgid "There was an error %{message} to-do item."
msgstr ""
msgid "There was an error adding a To Do."
@@ -33895,6 +34361,9 @@ msgstr ""
msgid "There was an error fetching projects"
msgstr ""
+msgid "There was an error fetching search autocomplete suggestions"
+msgstr ""
+
msgid "There was an error fetching stage total counts"
msgstr ""
@@ -34219,6 +34688,9 @@ msgstr ""
msgid "This field is required."
msgstr ""
+msgid "This form is disabled in preview"
+msgstr ""
+
msgid "This group"
msgstr ""
@@ -34240,9 +34712,6 @@ msgstr ""
msgid "This group is linked to a subscription"
msgstr ""
-msgid "This group, including all subgroups, projects and git repositories, will be reachable from only the specified IP address ranges."
-msgstr ""
-
msgid "This group, its subgroups and projects has been scheduled for removal on %{date}."
msgstr ""
@@ -34522,9 +34991,6 @@ msgstr ""
msgid "This user cannot be unlocked manually from GitLab"
msgstr ""
-msgid "This user does not have a pending request"
-msgstr ""
-
msgid "This user has an unconfirmed email address (%{email}). You may force a confirmation."
msgstr ""
@@ -34633,9 +35099,6 @@ msgstr ""
msgid "ThreatMonitoring|Packet Activity"
msgstr ""
-msgid "ThreatMonitoring|Policies"
-msgstr ""
-
msgid "ThreatMonitoring|Requests"
msgstr ""
@@ -34687,6 +35150,12 @@ msgstr ""
msgid "ThreatMonitoring|View documentation"
msgstr ""
+msgid "Threshold in bytes at which to compress Sidekiq job arguments."
+msgstr ""
+
+msgid "Threshold in bytes at which to reject Sidekiq jobs. Set this to 0 to if you don't want to limit Sidekiq jobs."
+msgstr ""
+
msgid "Throughput"
msgstr ""
@@ -34696,6 +35165,9 @@ msgstr ""
msgid "Time"
msgstr ""
+msgid "Time (in hours) that users are allowed to skip forced configuration of two-factor authentication."
+msgstr ""
+
msgid "Time Spent"
msgstr ""
@@ -34762,7 +35234,7 @@ msgstr ""
msgid "TimeTrackingEstimated|Est"
msgstr ""
-msgid "TimeTracking|%{startTag}Spent: %{endTag}%{timeSpentHumanReadable}"
+msgid "TimeTracking|%{spentStart}Spent: %{spentEnd}"
msgstr ""
msgid "TimeTracking|Estimated:"
@@ -34976,6 +35448,9 @@ msgstr ""
msgid "To access this domain create a new DNS record"
msgstr ""
+msgid "To add a custom suffix, set up a Service Desk email address. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "To add an SSH key you need to %{generate_link_start}generate one%{link_end} or use an %{existing_link_start}existing key%{link_end}."
msgstr ""
@@ -34997,13 +35472,16 @@ msgstr ""
msgid "To connect an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To continue using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
+msgstr ""
+
msgid "To continue, you need to select the link in the confirmation email we sent to verify your email address. If you didn't get our email, select %{strongStart}Resend confirmation email.%{strongEnd}"
msgstr ""
msgid "To define internal users, first enable new users set to external"
msgstr ""
-msgid "To enable Registration Features, make sure \"Enable service ping\" is checked."
+msgid "To enable Registration Features, first enable Service Ping."
msgstr ""
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
@@ -35030,7 +35508,7 @@ msgstr ""
msgid "To get started, use the link below to confirm your account."
msgstr ""
-msgid "To help improve GitLab and its user experience, GitLab will periodically collect usage information."
+msgid "To help improve GitLab and its user experience, GitLab periodically collects usage information."
msgstr ""
msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
@@ -35063,7 +35541,7 @@ msgstr ""
msgid "To preserve performance only %{strong_open}%{display_size} of %{real_size}%{strong_close} files are displayed."
msgstr ""
-msgid "To protect this issue's confidentiality, %{forkLink} and set the fork's visibility to private."
+msgid "To protect this issue's confidentiality, %{linkStart}fork this project%{linkEnd} and set the fork's visibility to private."
msgstr ""
msgid "To protect this issue's confidentiality, a private fork of this project was selected."
@@ -35096,12 +35574,15 @@ msgstr ""
msgid "To set up SAML authentication for your group through an identity provider like Azure, Okta, Onelogin, Ping Identity, or your custom SAML 2.0 provider:"
msgstr ""
-msgid "To set up this service:"
+msgid "To set up this integration:"
msgstr ""
msgid "To specify the notification level per project of a group you belong to, you need to visit project page and change notification level there."
msgstr ""
+msgid "To start using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
+msgstr ""
+
msgid "To unsubscribe from this issue, please paste the following link into your browser:"
msgstr ""
@@ -35689,9 +36170,6 @@ msgstr ""
msgid "Unable to fetch branches list, please close the form and try again"
msgstr ""
-msgid "Unable to fetch unscanned projects"
-msgstr ""
-
msgid "Unable to fetch vulnerable projects"
msgstr ""
@@ -35746,6 +36224,15 @@ msgstr ""
msgid "Unable to update this issue at this time."
msgstr ""
+msgid "Unapprove a merge request"
+msgstr ""
+
+msgid "Unapprove the current merge request."
+msgstr ""
+
+msgid "Unapproved the current merge request."
+msgstr ""
+
msgid "Unarchive project"
msgstr ""
@@ -35758,16 +36245,13 @@ msgstr ""
msgid "Unassigned"
msgstr ""
-msgid "Unauthenticated API request rate limit"
-msgstr ""
-
-msgid "Unauthenticated rate limit period in seconds"
+msgid "Unauthenticated API rate limit period in seconds"
msgstr ""
-msgid "Unauthenticated request rate limit"
+msgid "Unauthenticated requests"
msgstr ""
-msgid "Unauthenticated requests"
+msgid "Unauthenticated web rate limit period in seconds"
msgstr ""
msgid "Undo"
@@ -35869,18 +36353,6 @@ msgstr ""
msgid "Unresolved"
msgstr ""
-msgid "UnscannedProjects|15 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|30 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|5 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|60 or more days"
-msgstr ""
-
msgid "Unschedule job"
msgstr ""
@@ -36100,6 +36572,9 @@ msgstr ""
msgid "UsageQuota|%{help_link_start}Shared runners%{help_link_end} are disabled, so there are no limits set on pipeline usage"
msgstr ""
+msgid "UsageQuota|%{linkTitle} help link"
+msgstr ""
+
msgid "UsageQuota|%{percentageLeft} of purchased storage is available"
msgstr ""
@@ -36109,6 +36584,9 @@ msgstr ""
msgid "UsageQuota|Artifacts is a sum of build and pipeline artifacts."
msgstr ""
+msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
+msgstr ""
+
msgid "UsageQuota|Buy additional minutes"
msgstr ""
@@ -36118,9 +36596,21 @@ msgstr ""
msgid "UsageQuota|CI minutes usage by project"
msgstr ""
+msgid "UsageQuota|Code packages and container images."
+msgstr ""
+
msgid "UsageQuota|Current period usage"
msgstr ""
+msgid "UsageQuota|File attachments and smaller design graphics."
+msgstr ""
+
+msgid "UsageQuota|Git repository, managed by the Gitaly service."
+msgstr ""
+
+msgid "UsageQuota|Includes project registry, artifacts, packages, wiki, uploads and other items."
+msgstr ""
+
msgid "UsageQuota|Increase storage temporarily"
msgstr ""
@@ -36139,6 +36629,9 @@ msgstr ""
msgid "UsageQuota|Packages"
msgstr ""
+msgid "UsageQuota|Pipeline artifacts and job artifacts, created with CI/CD."
+msgstr ""
+
msgid "UsageQuota|Pipelines"
msgstr ""
@@ -36157,6 +36650,9 @@ msgstr ""
msgid "UsageQuota|Seats"
msgstr ""
+msgid "UsageQuota|Shared bits of code and text."
+msgstr ""
+
msgid "UsageQuota|Snippets"
msgstr ""
@@ -36166,6 +36662,12 @@ msgstr ""
msgid "UsageQuota|Storage"
msgstr ""
+msgid "UsageQuota|Storage type"
+msgstr ""
+
+msgid "UsageQuota|There is a known issue with Artifact storage where the total could be incorrect for some projects. More details and progress are available in %{warningLinkStart}the epic%{warningLinkEnd}."
+msgstr ""
+
msgid "UsageQuota|This is the total amount of storage used across your projects within this namespace."
msgstr ""
@@ -36205,6 +36707,9 @@ msgstr ""
msgid "UsageQuota|Usage"
msgstr ""
+msgid "UsageQuota|Usage Breakdown"
+msgstr ""
+
msgid "UsageQuota|Usage Quotas"
msgstr ""
@@ -36229,6 +36734,9 @@ msgstr ""
msgid "UsageQuota|Wiki"
msgstr ""
+msgid "UsageQuota|Wiki content."
+msgstr ""
+
msgid "UsageQuota|Wikis"
msgstr ""
@@ -36445,7 +36953,10 @@ msgstr ""
msgid "User Settings"
msgstr ""
-msgid "User and IP Rate Limits"
+msgid "User and IP rate limits"
+msgstr ""
+
+msgid "User does not have a pending request"
msgstr ""
msgid "User identity was successfully created."
@@ -36742,6 +37253,9 @@ msgstr ""
msgid "Users can launch a development environment from a GitLab browser tab when the %{linkStart}Gitpod%{linkEnd} integration is enabled."
msgstr ""
+msgid "Users can reactivate their account by signing in."
+msgstr ""
+
msgid "Users can render diagrams in AsciiDoc, Markdown, reStructuredText, and Textile documents using Kroki."
msgstr ""
@@ -36757,6 +37271,9 @@ msgstr ""
msgid "Users requesting access to"
msgstr ""
+msgid "Users to exclude from the rate limit"
+msgstr ""
+
msgid "Users were successfully added."
msgstr ""
@@ -36778,6 +37295,9 @@ msgstr ""
msgid "UsersSelect|Unassigned"
msgstr ""
+msgid "Uses GitLab as a lightweight alternative to Sentry."
+msgstr ""
+
msgid "Using %{code_start}::%{code_end} denotes a %{link_start}scoped label set%{link_end}"
msgstr ""
@@ -36808,10 +37328,7 @@ msgstr ""
msgid "Value Stream Analytics can help you determine your team’s velocity"
msgstr ""
-msgid "Value Stream Analytics gives an overview of how much time it takes to go from idea to production in your project."
-msgstr ""
-
-msgid "Value may contain a variable reference"
+msgid "Value might contain a variable reference"
msgstr ""
msgid "Value stream"
@@ -36877,10 +37394,10 @@ msgstr ""
msgid "ValueStream|The Default Value Stream cannot be deleted"
msgstr ""
-msgid "Variable"
+msgid "Values that contain the %{codeStart}$%{codeEnd} character can be considered a variable reference and expanded. %{docsLinkStart}Learn more.%{docsLinkEnd}"
msgstr ""
-msgid "Variable references indicated by %{codeStart}$%{codeEnd} may be expanded. If this is not what you want, consider %{docsLinkStart}using a workaround to prevent expansion%{docsLinkEnd}."
+msgid "Variable"
msgstr ""
msgid "Variable will be masked in job logs."
@@ -37285,6 +37802,9 @@ msgstr ""
msgid "Vulnerability|Evidence"
msgstr ""
+msgid "Vulnerability|False positive detected"
+msgstr ""
+
msgid "Vulnerability|File"
msgstr ""
@@ -37327,6 +37847,9 @@ msgstr ""
msgid "Vulnerability|Status"
msgstr ""
+msgid "Vulnerability|The scanner determined this vulnerability to be a false positive. Verify the evaluation before changing its status. %{linkStart}Learn more about false positive detection.%{linkEnd}"
+msgstr ""
+
msgid "Vulnerability|The unmodified response is the original response that had no mutations done to the request"
msgstr ""
@@ -37651,9 +38174,6 @@ msgstr ""
msgid "Welcome to GitLab,%{br_tag}%{name}!"
msgstr ""
-msgid "Welcome to the guided GitLab tour"
-msgstr ""
-
msgid "Welcome, %{name}!"
msgstr ""
@@ -37672,9 +38192,6 @@ msgstr ""
msgid "What are you searching for?"
msgstr ""
-msgid "What describes you best?"
-msgstr ""
-
msgid "What does this command do?"
msgstr ""
@@ -37696,13 +38213,13 @@ msgstr ""
msgid "What is your job title? (optional)"
msgstr ""
-msgid "What will you use this group for?"
+msgid "What templates can I create?"
msgstr ""
-msgid "What's new"
+msgid "What will you use this group for?"
msgstr ""
-msgid "What’s your experience level?"
+msgid "What's new"
msgstr ""
msgid "When a deployment job is successful, skip older deployment jobs that are still pending."
@@ -37714,6 +38231,9 @@ msgstr ""
msgid "When an event in GitLab triggers a webhook, you can use the request details to figure out if something went wrong."
msgstr ""
+msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+msgstr ""
+
msgid "When inactive, an external authentication provider must be used."
msgstr ""
@@ -37737,6 +38257,9 @@ msgstr ""
msgid "When:"
msgstr ""
+msgid "Which API requests are affected?"
+msgstr ""
+
msgid "While it's rare to have no vulnerabilities, it can happen. In any event, we ask that you please double check your settings to make sure you've set up your dashboard correctly."
msgstr ""
@@ -38016,6 +38539,9 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|Work Items"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -38091,6 +38617,9 @@ msgstr ""
msgid "You are already a member of this %{member_source}."
msgstr ""
+msgid "You are already impersonating another user"
+msgstr ""
+
msgid "You are an admin, which means granting access to %{client_name} will allow them to interact with GitLab as an admin as well. Proceed with caution."
msgstr ""
@@ -38193,6 +38722,9 @@ msgstr ""
msgid "You can also use project access tokens with Git to authenticate over HTTP(S). %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "You can always change your URL later"
+msgstr ""
+
msgid "You can always edit this later"
msgstr ""
@@ -38349,10 +38881,10 @@ msgstr ""
msgid "You can’t %{tag_start}edit%{tag_end} files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
-msgid "You could not create a new trigger."
+msgid "You can’t edit files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
-msgid "You didn't renew your subscription for %{strong}%{namespace_name}%{strong_close} so it was downgraded to the free plan."
+msgid "You could not create a new trigger."
msgstr ""
msgid "You do not have any subscriptions yet"
@@ -38520,6 +39052,12 @@ msgstr ""
msgid "You must provide your current password in order to change it."
msgstr ""
+msgid "You must sign in to search for specific projects."
+msgstr ""
+
+msgid "You must sign in to search for specific terms."
+msgstr ""
+
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
@@ -38547,6 +39085,9 @@ msgstr ""
msgid "You need to upload a GitLab project export archive (ending in .gz)."
msgstr ""
+msgid "You need to verify your primary email first before enabling Two-Factor Authentication."
+msgstr ""
+
msgid "You successfully declined the invitation"
msgstr ""
@@ -38655,10 +39196,10 @@ msgstr ""
msgid "Your %{host} account was signed in to from a new location"
msgstr ""
-msgid "Your %{strong}%{plan_name}%{strong_close} subscription for %{strong}%{namespace_name}%{strong_close} will expire on %{strong}%{expires_on}%{strong_close}."
+msgid "Your %{strong}%{plan_name}%{strong_close} subscription expires on %{strong}%{expires_on}%{strong_close}. After that date, you cannot create issues or merge requests, or use many other features."
msgstr ""
-msgid "Your %{strong}%{plan_name}%{strong_close} subscription will expire on %{strong}%{expires_on}%{strong_close}. After that, you will not be able to create issues or merge requests as well as many other features."
+msgid "Your %{strong}%{plan_name}%{strong_close} subscription for %{strong}%{namespace_name}%{strong_close} will expire on %{strong}%{expires_on}%{strong_close}."
msgstr ""
msgid "Your CI/CD configuration syntax is invalid. View Lint tab for more details."
@@ -38682,7 +39223,7 @@ msgstr ""
msgid "Your GPG keys (%{count})"
msgstr ""
-msgid "Your GitLab account has been locked due to an excessive amount of unsuccessful sign in attempts. Your account will automatically unlock in %{duration} or you may click the link below to unlock now."
+msgid "Your GitLab account has been locked due to an excessive number of unsuccessful sign in attempts. You can wait for your account to automatically unlock in %{duration} or you can click the link below to unlock now."
msgstr ""
msgid "Your GitLab account request has been approved!"
@@ -38793,6 +39334,9 @@ msgstr ""
msgid "Your commit email is used for web based operations, such as edits and merges."
msgstr ""
+msgid "Your current password is required to register a two-factor authenticator app."
+msgstr ""
+
msgid "Your dashboard has been copied. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
@@ -38892,6 +39436,9 @@ msgstr ""
msgid "Your project limit is %{limit} projects! Please contact your administrator to increase it"
msgstr ""
+msgid "Your project will be created at:"
+msgstr ""
+
msgid "Your projects"
msgstr ""
@@ -38931,11 +39478,10 @@ msgstr ""
msgid "Your subscription expired!"
msgstr ""
-msgid "Your subscription has been downgraded."
-msgstr ""
-
-msgid "Your subscription will expire in %{remaining_days}."
-msgstr ""
+msgid "Your subscription will expire in %{remaining_days} day."
+msgid_plural "Your subscription will expire in %{remaining_days} days."
+msgstr[0] ""
+msgstr[1] ""
msgid "Your username is %{username}."
msgstr ""
@@ -39142,6 +39688,9 @@ msgstr ""
msgid "cannot merge"
msgstr ""
+msgid "cannot not be used for user namespace"
+msgstr ""
+
msgid "ciReport|%{degradedNum} degraded"
msgstr ""
@@ -39465,6 +40014,9 @@ msgstr ""
msgid "created %{timeAgo}"
msgstr ""
+msgid "created %{timeAgo} by %{author}"
+msgstr ""
+
msgid "created by"
msgstr ""
@@ -39509,9 +40061,6 @@ msgstr ""
msgid "does not have a supported extension. Only %{extension_list} are supported"
msgstr ""
-msgid "domain is not authorized for sign-up."
-msgstr ""
-
msgid "download it"
msgstr ""
@@ -39529,18 +40078,13 @@ msgstr ""
msgid "email '%{email}' is not a verified email."
msgstr ""
-msgid "email does not match the allowed domain of %{email_domains}"
-msgid_plural "email does not match the allowed domains: %{email_domains}"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "enabled"
msgstr ""
msgid "encrypted: needs to be a :required, :optional or :migrating!"
msgstr ""
-msgid "ending with MIME type format is not allowed."
+msgid "ending with a reserved file extension is not allowed."
msgstr ""
msgid "entries cannot be larger than 255 characters"
@@ -39564,6 +40108,9 @@ msgstr ""
msgid "estimateCommand|%{slash_command} overwrites the total estimated time."
msgstr ""
+msgid "example.com"
+msgstr ""
+
msgid "exceeds the limit of %{bytes} bytes"
msgstr ""
@@ -39614,9 +40161,6 @@ msgstr ""
msgid "fork"
msgstr ""
-msgid "fork this project"
-msgstr ""
-
msgid "from"
msgstr ""
@@ -39625,6 +40169,9 @@ msgid_plural "from %d jobs"
msgstr[0] ""
msgstr[1] ""
+msgid "frontmatter"
+msgstr ""
+
msgid "group"
msgstr ""
@@ -39652,6 +40199,9 @@ msgstr ""
msgid "has been completed."
msgstr ""
+msgid "has too deep level of nesting"
+msgstr ""
+
msgid "help"
msgstr ""
@@ -39685,9 +40235,21 @@ msgstr ""
msgid "in"
msgstr ""
+msgid "in Infrastructure :: Kubernetes clusters"
+msgstr ""
+
+msgid "in all GitLab"
+msgstr ""
+
+msgid "in group"
+msgstr ""
+
msgid "in group %{link_to_group}"
msgstr ""
+msgid "in project"
+msgstr ""
+
msgid "in project %{link_to_project}"
msgstr ""
@@ -39729,16 +40291,19 @@ msgstr ""
msgid "is not a valid X509 certificate."
msgstr ""
-msgid "is not allowed since the group is not top-level group."
+msgid "is not allowed for sign-up."
msgstr ""
-msgid "is not allowed. Try again with a different email address, or contact your GitLab admin."
+msgid "is not allowed for this group."
msgstr ""
-msgid "is not allowed. We do not currently support project-level iterations"
+msgid "is not allowed for this project."
+msgstr ""
+
+msgid "is not allowed since the group is not top-level group."
msgstr ""
-msgid "is not from an allowed domain."
+msgid "is not allowed. We do not currently support project-level iterations"
msgstr ""
msgid "is not in the group enforcing Group Managed Account"
@@ -39831,6 +40396,9 @@ msgstr ""
msgid "log in"
msgstr ""
+msgid "managed"
+msgstr ""
+
msgid "manual"
msgstr ""
@@ -39878,6 +40446,9 @@ msgstr ""
msgid "mrWidget| Please restore it or use a different %{missingBranchName} branch"
msgstr ""
+msgid "mrWidget|%{linkStart}Set up now%{linkEnd} to analyze your source code for known security vulnerabilities."
+msgstr ""
+
msgid "mrWidget|%{mergeError}."
msgstr ""
@@ -39958,6 +40529,9 @@ msgid_plural "mrWidget|Closes issues"
msgstr[0] ""
msgstr[1] ""
+msgid "mrWidget|Create issue to resolve all threads"
+msgstr ""
+
msgid "mrWidget|Delete source branch"
msgstr ""
@@ -39967,12 +40541,18 @@ msgstr ""
msgid "mrWidget|Did not close"
msgstr ""
+msgid "mrWidget|Dismiss"
+msgstr ""
+
msgid "mrWidget|Email patches"
msgstr ""
msgid "mrWidget|Failed to load deployment statistics"
msgstr ""
+msgid "mrWidget|Hide %{widget} details"
+msgstr ""
+
msgid "mrWidget|If the %{missingBranchName} branch exists in your local repository, you can merge this merge request manually using the command line"
msgstr ""
@@ -40068,9 +40648,6 @@ msgstr ""
msgid "mrWidget|Request to merge"
msgstr ""
-msgid "mrWidget|Resolve all threads in new issue"
-msgstr ""
-
msgid "mrWidget|Resolve conflicts"
msgstr ""
@@ -40086,6 +40663,9 @@ msgstr ""
msgid "mrWidget|Revoke approval"
msgstr ""
+msgid "mrWidget|SAST and Secret Detection is not enabled."
+msgstr ""
+
msgid "mrWidget|Set by %{merge_author} to be added to the merge train when the pipeline succeeds"
msgstr ""
@@ -40095,6 +40675,9 @@ msgstr ""
msgid "mrWidget|Set by %{merge_author} to start a merge train when the pipeline succeeds"
msgstr ""
+msgid "mrWidget|Show %{widget} details"
+msgstr ""
+
msgid "mrWidget|The changes were merged into"
msgstr ""
@@ -40107,6 +40690,9 @@ msgstr ""
msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure, or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
msgstr ""
+msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure."
+msgstr ""
+
msgid "mrWidget|The source branch has been deleted"
msgstr ""
@@ -40149,6 +40735,9 @@ msgstr ""
msgid "mrWidget|You can merge after removing denied licenses"
msgstr ""
+msgid "mrWidget|You can only merge once this merge request is approved."
+msgstr ""
+
msgid "mrWidget|Your password"
msgstr ""
@@ -40185,6 +40774,9 @@ msgstr ""
msgid "must be less than the limit of %{tag_limit} tags"
msgstr ""
+msgid "must be set for a project namespace"
+msgstr ""
+
msgid "must be unique by status and elapsed time within a policy"
msgstr ""
@@ -40294,6 +40886,9 @@ msgstr ""
msgid "pipeline"
msgstr ""
+msgid "pipeline schedules documentation"
+msgstr ""
+
msgid "pod_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
msgstr ""
@@ -40343,16 +40938,25 @@ msgstr ""
msgid "project name"
msgstr ""
+msgid "project namespace cannot be the parent of another namespace"
+msgstr ""
+
msgid "projects"
msgstr ""
msgid "quick actions"
msgstr ""
-msgid "reCAPTCHA Private Key"
+msgid "reCAPTCHA"
+msgstr ""
+
+msgid "reCAPTCHA helps prevent credential stuffing."
msgstr ""
-msgid "reCAPTCHA Site Key"
+msgid "reCAPTCHA private key"
+msgstr ""
+
+msgid "reCAPTCHA site key"
msgstr ""
msgid "recent activity"
@@ -40579,6 +41183,9 @@ msgstr ""
msgid "user avatar"
msgstr ""
+msgid "user namespace cannot be the parent of another namespace"
+msgstr ""
+
msgid "user preferences"
msgstr ""
@@ -40671,3 +41278,9 @@ msgstr ""
msgid "your settings"
msgstr ""
+msgid "{group}"
+msgstr ""
+
+msgid "{project}"
+msgstr ""
+
diff --git a/locale/pa_IN/gitlab.po b/locale/pa_IN/gitlab.po
index 8c05ee8d163..5743595767b 100644
--- a/locale/pa_IN/gitlab.po
+++ b/locale/pa_IN/gitlab.po
@@ -14,10 +14,7 @@ msgstr ""
"X-Crowdin-Language: pa-IN\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-09-01 22:34\n"
-
-msgid " %{name}, confirm your email address now! "
-msgstr ""
+"PO-Revision-Date: 2021-10-04 20:22\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -92,6 +89,16 @@ msgstr ""
msgid "#general, #development"
msgstr ""
+msgid "%d Alert"
+msgid_plural "%d Alerts"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d Alert:"
+msgid_plural "%d Alerts:"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d Approval"
msgid_plural "%d Approvals"
msgstr[0] ""
@@ -455,7 +462,10 @@ msgstr ""
msgid "%{code_open}Protected:%{code_close} Only exposed to protected branches or tags."
msgstr ""
-msgid "%{commit_author_link} authored %{commit_timeago}"
+msgid "%{commit_author_link} authored %{commit_authored_timeago}"
+msgstr ""
+
+msgid "%{commit_author_link} authored %{commit_authored_timeago} and %{commit_committer_avatar} %{commit_committer_link} committed %{commit_committer_timeago}"
msgstr ""
msgid "%{completedCount} completed weight"
@@ -549,6 +559,15 @@ msgstr ""
msgid "%{doc_link_start}Advanced search%{doc_link_end} is enabled."
msgstr ""
+msgid "%{docs_link_start}Learn about visibility levels.%{docs_link_end}"
+msgstr ""
+
+msgid "%{docs_link_start}What is Large File Storage?%{docs_link_end}"
+msgstr ""
+
+msgid "%{docs_link_start}What is two-factor authentication?%{docs_link_end}"
+msgstr ""
+
msgid "%{due_date} (Past due)"
msgstr ""
@@ -621,9 +640,6 @@ msgstr ""
msgid "%{issueType} actions"
msgstr ""
-msgid "%{issuesCount} issues with a limit of %{maxIssueCount}"
-msgstr ""
-
msgid "%{issuesSize} with a limit of %{maxIssueCount}"
msgstr ""
@@ -681,6 +697,12 @@ msgstr ""
msgid "%{label_for_message} unavailable"
msgstr ""
+msgid "%{learn_more_link}."
+msgstr ""
+
+msgid "%{lessThan} 1 hour"
+msgstr ""
+
msgid "%{lets_encrypt_link_start}Let's Encrypt%{lets_encrypt_link_end} is a free, automated, and open certificate authority (CA) that issues digital certificates to enable HTTPS (SSL/TLS) for sites."
msgstr ""
@@ -693,15 +715,15 @@ msgstr ""
msgid "%{link_start}Learn more%{link_end} about roles."
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
-msgstr ""
-
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
msgstr ""
msgid "%{link_start}Start the title with %{draft_snippet}%{link_end} to prevent a merge request that is a work in progress from being merged before it's ready."
msgstr ""
+msgid "%{link_start}What information does GitLab Inc. collect?%{link_end}"
+msgstr ""
+
msgid "%{listToShow}, and %{awardsListLength} more"
msgstr ""
@@ -854,7 +876,7 @@ msgid_plural "%{securityScanner} results are not available because a pipeline ha
msgstr[0] ""
msgstr[1] ""
-msgid "%{service_ping_link_start}Learn more%{service_ping_link_end} about what information is shared with GitLab Inc."
+msgid "%{service_ping_link_start}What information is shared with GitLab Inc.?%{service_ping_link_end}"
msgstr ""
msgid "%{size} %{unit}"
@@ -890,6 +912,9 @@ msgstr ""
msgid "%{state} epics"
msgstr ""
+msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
+msgstr ""
+
msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
msgstr ""
@@ -949,11 +974,6 @@ msgstr ""
msgid "%{template_project_id} is unknown or invalid"
msgstr ""
-msgid "%{text} %{files}"
-msgid_plural "%{text} %{files} files"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%{text} is available"
msgstr ""
@@ -1038,9 +1058,6 @@ msgstr ""
msgid "%{wildcards_link_start}Wildcards%{wildcards_link_end} such as %{code_tag_start}v*%{code_tag_end} or %{code_tag_start}*-release%{code_tag_end} are supported."
msgstr ""
-msgid "&lt; 1 hour"
-msgstr ""
-
msgid "'%{data}' at %{location} does not match format: %{format}"
msgstr ""
@@ -1124,9 +1141,6 @@ msgstr ""
msgid "(we need your current password to confirm your changes)"
msgstr ""
-msgid "* * * * *"
-msgstr ""
-
msgid "+ %{amount} more"
msgstr ""
@@ -1193,10 +1207,10 @@ msgstr ""
msgid "."
msgstr ""
-msgid "0 bytes"
+msgid "/"
msgstr ""
-msgid "0 for unlimited, only effective with remote storage enabled."
+msgid "0 bytes"
msgstr ""
msgid "0t1DgySidms"
@@ -1326,6 +1340,9 @@ msgstr ""
msgid "1000+"
msgstr ""
+msgid "192.168.0.0/24"
+msgstr ""
+
msgid "1st contribution!"
msgstr ""
@@ -1479,9 +1496,6 @@ msgstr ""
msgid "A plain HTML site that uses Netlify for CI/CD instead of GitLab, but still with all the other great GitLab features"
msgstr ""
-msgid "A plain-text response to show to clients that hit the rate limit."
-msgstr ""
-
msgid "A platform value can be web, mob or app."
msgstr ""
@@ -1563,7 +1577,7 @@ msgstr ""
msgid "APIFuzzing|Configure HTTP basic authentication values. Other authentication methods are supported. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
+msgid "APIFuzzing|Customize your project's API fuzzing configuration options and copy the code snippet to your .gitlab-ci.yml file to apply any changes. Note that this tool does not reflect or update your .gitlab-ci.yml file automatically. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
msgstr ""
msgid "APIFuzzing|Enable authentication"
@@ -1626,9 +1640,6 @@ msgstr ""
msgid "APIFuzzing|To prevent a security leak, authentication info must be added as a %{ciVariablesLinkStart}CI variable%{ciVariablesLinkEnd}. As a user with maintainer access rights, you can manage CI variables in the %{ciSettingsLinkStart}Settings%{ciSettingsLinkEnd} area."
msgstr ""
-msgid "APIFuzzing|Use this tool to generate API fuzzing configuration YAML to copy into your .gitlab-ci.yml file. This tool does not reflect or update your .gitlab-ci.yml file automatically."
-msgstr ""
-
msgid "APIFuzzing|Username for basic authentication"
msgstr ""
@@ -1680,9 +1691,6 @@ msgstr ""
msgid "Abuse reports notification email"
msgstr ""
-msgid "Abuse reports will be sent to this address if it is set. Abuse reports are always available in the admin area."
-msgstr ""
-
msgid "Accept invitation"
msgstr ""
@@ -1719,12 +1727,18 @@ msgstr ""
msgid "Access granted"
msgstr ""
+msgid "Access key ID"
+msgstr ""
+
msgid "Access requests"
msgstr ""
msgid "Access to '%{classification_label}' not allowed"
msgstr ""
+msgid "Access tokens expire after 2 hours. A refresh token may be used at any time to generate a new access token. Non-expiring access tokens are deprecated. Clear this setting to enable backward compatibility."
+msgstr ""
+
msgid "AccessDropdown|Deploy Keys"
msgstr ""
@@ -2037,6 +2051,9 @@ msgstr ""
msgid "Add new directory"
msgstr ""
+msgid "Add new service account"
+msgstr ""
+
msgid "Add or remove previously merged commits"
msgstr ""
@@ -2274,6 +2291,9 @@ msgstr ""
msgid "AdminArea|Features"
msgstr ""
+msgid "AdminArea|Get security updates from GitLab and stay up to date"
+msgstr ""
+
msgid "AdminArea|Groups"
msgstr ""
@@ -2313,6 +2333,12 @@ msgstr ""
msgid "AdminArea|Reporter"
msgstr ""
+msgid "AdminArea|Sign up for the GitLab Security Newsletter to get notified for security updates."
+msgstr ""
+
+msgid "AdminArea|Sign up for the GitLab newsletter"
+msgstr ""
+
msgid "AdminArea|Stop all jobs"
msgstr ""
@@ -2382,9 +2408,15 @@ msgstr ""
msgid "AdminSettings|Disable public access to Pages sites"
msgstr ""
+msgid "AdminSettings|Display a banner on merge requests in projects with no pipelines to initiate steps to add a .gitlab-ci.yml file."
+msgstr ""
+
msgid "AdminSettings|Domain verification is an essential security measure for public GitLab sites. Users are required to demonstrate they control a domain before it is enabled. %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "AdminSettings|Enable pipeline suggestion banner"
+msgstr ""
+
msgid "AdminSettings|Enable shared runners for new projects"
msgstr ""
@@ -2856,10 +2888,10 @@ msgstr ""
msgid "Admin|Quarterly reconciliation will occur on %{qrtlyDate}"
msgstr ""
-msgid "Admin|The number of max seats used for your namespace is currently exceeding the number of seats in your subscription. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgid "Admin|The number of max seats in your namespace exceeds the number of seats in your subscription. On %{qrtlyDate}, quarterly reconciliation occurs and you are automatically billed a prorated amount for the overage. No action is needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice. For more information about the timing of the invoicing process, view the documentation."
msgstr ""
-msgid "Admin|The number of maximum users for your instance is currently exceeding the number of users in license. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgid "Admin|The number of max users in your instance exceeds the number of users in your license. On %{qrtlyDate}, quarterly reconciliation occurs and you are automatically billed a prorated amount for the overage. No action is needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice. For more information about the timing of the invoicing process, view the documentation."
msgstr ""
msgid "Admin|View pending user approvals"
@@ -2880,9 +2912,6 @@ msgstr ""
msgid "Advanced export options"
msgstr ""
-msgid "Advanced permissions, Large File Storage and Two-Factor authentication settings."
-msgstr ""
-
msgid "After a successful password update you will be redirected to login screen."
msgstr ""
@@ -2901,13 +2930,14 @@ msgstr ""
msgid "After you've reviewed these contribution guidelines, you'll be all set to"
msgstr ""
+msgid "Akismet"
+msgstr ""
+
msgid "Akismet API Key"
msgstr ""
-msgid "Alert"
-msgid_plural "Alerts"
-msgstr[0] ""
-msgstr[1] ""
+msgid "Akismet helps prevent the creation of spam issues in public projects."
+msgstr ""
msgid "AlertManagement|Acknowledged"
msgstr ""
@@ -3263,6 +3293,9 @@ msgstr ""
msgid "All (default)"
msgstr ""
+msgid "All GitLab"
+msgstr ""
+
msgid "All Members"
msgstr ""
@@ -3377,6 +3410,9 @@ msgstr ""
msgid "Allow this secondary node to replicate content on Object Storage"
msgstr ""
+msgid "Allow use of licensed EE features"
+msgstr ""
+
msgid "Allow users to dismiss the broadcast message"
msgstr ""
@@ -3452,9 +3488,6 @@ msgstr ""
msgid "Amazon authentication is not %{link_start}correctly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
-msgid "Amount of time (in hours) that users are allowed to skip forced configuration of two-factor authentication"
-msgstr ""
-
msgid "An %{link_start}alert%{link_end} with the same fingerprint is already open. To change the status of this alert, resolve the linked alert."
msgstr ""
@@ -3515,12 +3548,6 @@ msgstr ""
msgid "An error occurred when removing the label."
msgstr ""
-msgid "An error occurred when toggling the notification subscription"
-msgstr ""
-
-msgid "An error occurred when updating the issue weight"
-msgstr ""
-
msgid "An error occurred when updating the title"
msgstr ""
@@ -3569,6 +3596,9 @@ msgstr ""
msgid "An error occurred while enabling Service Desk."
msgstr ""
+msgid "An error occurred while fetching Markdown preview"
+msgstr ""
+
msgid "An error occurred while fetching ancestors"
msgstr ""
@@ -3599,9 +3629,6 @@ msgstr ""
msgid "An error occurred while fetching label colors."
msgstr ""
-msgid "An error occurred while fetching markdown preview"
-msgstr ""
-
msgid "An error occurred while fetching participants"
msgstr ""
@@ -3617,9 +3644,6 @@ msgstr ""
msgid "An error occurred while fetching reference"
msgstr ""
-msgid "An error occurred while fetching sidebar data"
-msgstr ""
-
msgid "An error occurred while fetching tags. Retry the search."
msgstr ""
@@ -3695,6 +3719,9 @@ msgstr ""
msgid "An error occurred while loading merge requests."
msgstr ""
+msgid "An error occurred while loading projects."
+msgstr ""
+
msgid "An error occurred while loading the Needs tab."
msgstr ""
@@ -3929,12 +3956,6 @@ msgstr ""
msgid "Any Milestone"
msgstr ""
-msgid "Any branch"
-msgstr ""
-
-msgid "Any eligible user"
-msgstr ""
-
msgid "Any encrypted tokens"
msgstr ""
@@ -3953,6 +3974,9 @@ msgstr ""
msgid "Any namespace"
msgstr ""
+msgid "App Engine description and apps that are suitable for this deployment target"
+msgstr ""
+
msgid "App ID"
msgstr ""
@@ -4101,6 +4125,11 @@ msgstr ""
msgid "Apply"
msgstr ""
+msgid "Apply %d suggestion"
+msgid_plural "Apply %d suggestions"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Apply a label"
msgstr ""
@@ -4110,13 +4139,10 @@ msgstr ""
msgid "Apply suggestion"
msgstr ""
-msgid "Apply suggestions"
-msgstr ""
-
msgid "Apply template"
msgstr ""
-msgid "Apply this approval rule to any branch or a specific protected branch."
+msgid "Apply this approval rule to all branches or a specific protected branch."
msgstr ""
msgid "Applying"
@@ -4259,9 +4285,6 @@ msgstr ""
msgid "ApprovalSettings|Prevent editing approval rules in projects and merge requests."
msgstr ""
-msgid "ApprovalSettings|Prevent editing approval rules in projects and merge requests. "
-msgstr ""
-
msgid "ApprovalSettings|Remove all approvals when commits are added to the source branch."
msgstr ""
@@ -4277,6 +4300,9 @@ msgstr ""
msgid "ApprovalSettings|This setting is configured at the instance level and can only be changed by an administrator."
msgstr ""
+msgid "ApprovalSettings|This setting is configured in %{groupName} and can only be changed by an administrator or group owner."
+msgstr ""
+
msgid "ApprovalStatusTooltip|Adheres to separation of duties"
msgstr ""
@@ -4763,9 +4789,6 @@ msgstr ""
msgid "Authenticated API rate limit period in seconds"
msgstr ""
-msgid "Authenticated API request rate limit"
-msgstr ""
-
msgid "Authenticated API requests"
msgstr ""
@@ -4775,10 +4798,10 @@ msgstr ""
msgid "Authenticated Git LFS request rate limit"
msgstr ""
-msgid "Authenticated web rate limit period in seconds"
+msgid "Authenticated Git LFS requests"
msgstr ""
-msgid "Authenticated web request rate limit"
+msgid "Authenticated web rate limit period in seconds"
msgstr ""
msgid "Authenticated web requests"
@@ -5156,9 +5179,6 @@ msgstr ""
msgid "Below you will find all the groups that are public."
msgstr ""
-msgid "Beta"
-msgstr ""
-
msgid "Bi-weekly code coverage"
msgstr ""
@@ -5398,6 +5418,21 @@ msgstr ""
msgid "Board scope affects which issues are displayed for anyone who visits this board"
msgstr ""
+msgid "BoardNewEpic|Groups"
+msgstr ""
+
+msgid "BoardNewEpic|Loading groups"
+msgstr ""
+
+msgid "BoardNewEpic|No matching results"
+msgstr ""
+
+msgid "BoardNewEpic|Search groups"
+msgstr ""
+
+msgid "BoardNewEpic|Select a group"
+msgstr ""
+
msgid "BoardNewIssue|No matching results"
msgstr ""
@@ -5475,6 +5510,9 @@ msgstr ""
msgid "Boards|An error occurred while creating the list. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching child groups. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching group projects. Please try again."
msgstr ""
@@ -5807,6 +5845,9 @@ msgstr ""
msgid "Bulk update"
msgstr ""
+msgid "BulkImports|Re-import creates a new group. It does not sync with the existing group."
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -5816,6 +5857,9 @@ msgstr ""
msgid "BulkImport|From source group"
msgstr ""
+msgid "BulkImport|Group import history"
+msgstr ""
+
msgid "BulkImport|Import failed: Destination cannot be a subgroup of the source group. Change the destination and try again."
msgstr ""
@@ -5828,9 +5872,18 @@ msgstr ""
msgid "BulkImport|Importing the group failed"
msgstr ""
+msgid "BulkImport|Last imported to %{link}"
+msgstr ""
+
msgid "BulkImport|Name already exists."
msgstr ""
+msgid "BulkImport|New group"
+msgstr ""
+
+msgid "BulkImport|No history is available"
+msgstr ""
+
msgid "BulkImport|No parent"
msgstr ""
@@ -5843,6 +5896,9 @@ msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} matching filter \"%{filter}\" from %{link}"
msgstr ""
+msgid "BulkImport|Source group"
+msgstr ""
+
msgid "BulkImport|To new group"
msgstr ""
@@ -5852,6 +5908,9 @@ msgstr ""
msgid "BulkImport|You have no groups to import"
msgstr ""
+msgid "BulkImport|Your imported groups will appear here."
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -6094,6 +6153,9 @@ msgstr ""
msgid "Can be manually deployed to"
msgstr ""
+msgid "Can be overridden in each project."
+msgstr ""
+
msgid "Can create groups:"
msgstr ""
@@ -6196,6 +6258,9 @@ msgstr ""
msgid "Cancelling Preview"
msgstr ""
+msgid "Cannot assign a confidential epic to a non-confidential issue. Make the issue confidential and try again"
+msgstr ""
+
msgid "Cannot be assigned to other projects."
msgstr ""
@@ -6247,9 +6312,6 @@ msgstr ""
msgid "Cannot refer to a group %{timebox_type} by an internal id!"
msgstr ""
-msgid "Cannot set confidential epic for a non-confidential issue"
-msgstr ""
-
msgid "Cannot show preview. For previews on sketch files, they must have the file format introduced by Sketch version 43 and above."
msgstr ""
@@ -6487,15 +6549,15 @@ msgstr ""
msgid "Check out, review, and merge locally"
msgstr ""
-msgid "Check the %{docs_link_start}documentation%{docs_link_end}."
-msgstr ""
-
msgid "Check the current instance configuration "
msgstr ""
msgid "Check the elasticsearch.log file to debug why the migration was halted and make any changes before retrying the migration. When you fix the cause of the failure, click \"Retry migration\", and the migration will be scheduled to be retried in the background."
msgstr ""
+msgid "Check with your administrator."
+msgstr ""
+
msgid "Check your Docker images for known vulnerabilities."
msgstr ""
@@ -6526,6 +6588,9 @@ msgstr ""
msgid "Checkout"
msgstr ""
+msgid "Checkout|$%{selectedPlanPrice} per 10 GB storage per pack"
+msgstr ""
+
msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 minutes"
msgstr ""
@@ -6546,17 +6611,23 @@ msgstr ""
msgid "Checkout|%{name}'s GitLab subscription"
msgstr ""
-msgid "Checkout|%{selectedPlanText} plan"
+msgid "Checkout|%{name}'s storage subscription"
msgstr ""
-msgid "Checkout|%{startDate} - %{endDate}"
+msgid "Checkout|%{quantity} GB of storage"
msgstr ""
-msgid "Checkout|%{totalCiMinutes} CI minute"
-msgid_plural "Checkout|%{totalCiMinutes} CI minutes"
+msgid "Checkout|%{quantity} storage pack"
+msgid_plural "Checkout|%{quantity} storage packs"
msgstr[0] ""
msgstr[1] ""
+msgid "Checkout|%{selectedPlanText} plan"
+msgstr ""
+
+msgid "Checkout|%{startDate} - %{endDate}"
+msgstr ""
+
msgid "Checkout|%{totalCiMinutes} CI minutes"
msgstr ""
@@ -6632,6 +6703,9 @@ msgstr ""
msgid "Checkout|Failed to register credit card. Please try again."
msgstr ""
+msgid "Checkout|GB"
+msgstr ""
+
msgid "Checkout|GitLab group"
msgstr ""
@@ -6668,6 +6742,9 @@ msgstr ""
msgid "Checkout|State"
msgstr ""
+msgid "Checkout|Storage packs"
+msgstr ""
+
msgid "Checkout|Street address"
msgstr ""
@@ -6689,6 +6766,9 @@ msgstr ""
msgid "Checkout|Total minutes: %{quantity}"
msgstr ""
+msgid "Checkout|Total storage: %{quantity} GB"
+msgstr ""
+
msgid "Checkout|Users"
msgstr ""
@@ -6698,16 +6778,25 @@ msgstr ""
msgid "Checkout|Your organization"
msgstr ""
+msgid "Checkout|Your storage subscription has the same term as your main subscription, and the price is prorated accordingly."
+msgstr ""
+
msgid "Checkout|Your subscription will be applied to this group"
msgstr ""
msgid "Checkout|Zip code"
msgstr ""
+msgid "Checkout|a storage subscription"
+msgstr ""
+
msgid "Checkout|company or team"
msgstr ""
-msgid "Checkout|x 1,000 minutes per pack = %{strong}"
+msgid "Checkout|minutes"
+msgstr ""
+
+msgid "Checkout|x %{quantity} %{units} per pack ="
msgstr ""
msgid "Cherry-pick this commit"
@@ -7064,6 +7153,9 @@ msgstr ""
msgid "CloneIssue|Cannot clone issue to target project as it is pending deletion."
msgstr ""
+msgid "CloneIssue|Cannot clone issues of '%{issue_type}' type."
+msgstr ""
+
msgid "Cloned this issue to %{path_to_project}."
msgstr ""
@@ -7118,7 +7210,10 @@ msgstr ""
msgid "Closes this %{quick_action_target}."
msgstr ""
-msgid "Cloud licenses can not be removed."
+msgid "Cloud Functions description and apps that are suitable for this deployment target"
+msgstr ""
+
+msgid "Cloud Run description and apps that are suitable for this deployment target"
msgstr ""
msgid "Cluster"
@@ -7145,6 +7240,12 @@ msgstr ""
msgid "ClusterAgents|Access tokens"
msgstr ""
+msgid "ClusterAgents|Agent might not be connected to GitLab"
+msgstr ""
+
+msgid "ClusterAgents|Agent never connected to GitLab"
+msgstr ""
+
msgid "ClusterAgents|Alternative installation methods"
msgstr ""
@@ -7160,6 +7261,12 @@ msgstr ""
msgid "ClusterAgents|Configuration"
msgstr ""
+msgid "ClusterAgents|Connected"
+msgstr ""
+
+msgid "ClusterAgents|Connection status"
+msgstr ""
+
msgid "ClusterAgents|Copy token"
msgstr ""
@@ -7178,6 +7285,9 @@ msgstr ""
msgid "ClusterAgents|For alternative installation methods %{linkStart}go to the documentation%{linkEnd}."
msgstr ""
+msgid "ClusterAgents|For more troubleshooting information go to"
+msgstr ""
+
msgid "ClusterAgents|Go to the repository"
msgstr ""
@@ -7193,18 +7303,30 @@ msgstr ""
msgid "ClusterAgents|Integrate with the GitLab Agent"
msgstr ""
-msgid "ClusterAgents|Last used"
+msgid "ClusterAgents|Last connected %{timeAgo}."
+msgstr ""
+
+msgid "ClusterAgents|Last contact"
msgstr ""
msgid "ClusterAgents|Learn how to create an agent access token"
msgstr ""
+msgid "ClusterAgents|Make sure you are using a valid token."
+msgstr ""
+
msgid "ClusterAgents|Name"
msgstr ""
msgid "ClusterAgents|Never"
msgstr ""
+msgid "ClusterAgents|Never connected"
+msgstr ""
+
+msgid "ClusterAgents|Not connected"
+msgstr ""
+
msgid "ClusterAgents|Read more about getting started"
msgstr ""
@@ -7226,6 +7348,9 @@ msgstr ""
msgid "ClusterAgents|Select which Agent you want to install"
msgstr ""
+msgid "ClusterAgents|The Agent has not been connected in a long time. There might be a connectivity issue. Last contact was %{timeAgo}."
+msgstr ""
+
msgid "ClusterAgents|The GitLab Agent also requires %{linkStart}enabling the Agent Server%{linkEnd}"
msgstr ""
@@ -7253,9 +7378,6 @@ msgstr ""
msgid "ClusterAgents|You will need to create a token to connect to your agent"
msgstr ""
-msgid "ClusterAgent|This feature is only available for premium plans"
-msgstr ""
-
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -7445,9 +7567,6 @@ msgstr ""
msgid "ClusterIntegration|Create Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Create a provision role on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the account and external ID above. %{startMoreInfoLink}More information%{endLink}"
-msgstr ""
-
msgid "ClusterIntegration|Create cluster on"
msgstr ""
@@ -7880,7 +7999,7 @@ msgstr ""
msgid "ClusterIntegration|Subnets"
msgstr ""
-msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provisioned role, first create one on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the above account and external IDs. %{startMoreInfoLink}More information%{endLink}"
+msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provisioned role, first create one on %{awsLinkStart}Amazon Web Services %{awsLinkEnd} using the above account and external IDs. %{moreInfoStart}More information%{moreInfoEnd}"
msgstr ""
msgid "ClusterIntegration|The Kubernetes certificate used to authenticate to the cluster."
@@ -8114,6 +8233,9 @@ msgstr ""
msgid "Collapse replies"
msgstr ""
+msgid "Collapse settings section"
+msgstr ""
+
msgid "Collapse sidebar"
msgstr ""
@@ -8132,6 +8254,9 @@ msgstr ""
msgid "Comma-separated list of email addresses."
msgstr ""
+msgid "Comma-separated list of users allowed to exceed the rate limit."
+msgstr ""
+
msgid "Comma-separated, e.g. '1.1.1.1, 2.2.2.0/24'"
msgstr ""
@@ -8452,6 +8577,9 @@ msgstr ""
msgid "Configure %{repository_checks_link_start}repository checks%{link_end} and %{housekeeping_link_start}housekeeping%{link_end} on repositories."
msgstr ""
+msgid "Configure CAPTCHAs, IP address limits, and other anti-spam measures."
+msgstr ""
+
msgid "Configure Dependency Scanning in `.gitlab-ci.yml` using the GitLab managed template. You can [add variable overrides](https://docs.gitlab.com/ee/user/application_security/dependency_scanning/#customizing-the-dependency-scanning-settings) to customize Dependency Scanning settings."
msgstr ""
@@ -8488,16 +8616,13 @@ msgstr ""
msgid "Configure a %{codeStart}.gitlab-webide.yml%{codeEnd} file in the %{codeStart}.gitlab%{codeEnd} directory to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
msgstr ""
-msgid "Configure existing installation"
-msgstr ""
-
-msgid "Configure limit for notes created per minute by web and API requests."
+msgid "Configure advanced permissions, Large File Storage, and two-factor authentication settings."
msgstr ""
-msgid "Configure limits for Project/Group Import/Export."
+msgid "Configure approvals by authors and committers on all projects."
msgstr ""
-msgid "Configure limits for web and API requests."
+msgid "Configure existing installation"
msgstr ""
msgid "Configure paths to be protected by Rack Attack."
@@ -8512,10 +8637,13 @@ msgstr ""
msgid "Configure settings for Advanced Search with Elasticsearch."
msgstr ""
+msgid "Configure specific limits for Files API requests that supersede the general user and IP rate limits."
+msgstr ""
+
msgid "Configure specific limits for Git LFS requests that supersede the general user and IP rate limits."
msgstr ""
-msgid "Configure specific limits for Packages API requests that supersede the general user and IP rate limits."
+msgid "Configure specific limits for deprecated API requests that supersede the general user and IP rate limits."
msgstr ""
msgid "Configure the %{link} integration."
@@ -8527,6 +8655,9 @@ msgstr ""
msgid "Configure the way a user creates a new account."
msgstr ""
+msgid "Configure via Merge Request"
+msgstr ""
+
msgid "Configure which lists are shown for anyone who visits this board"
msgstr ""
@@ -8995,6 +9126,9 @@ msgstr ""
msgid "Content parsed with %{link}."
msgstr ""
+msgid "ContentEditor|Table of Contents"
+msgstr ""
+
msgid "ContentEditor|You have to provide a renderMarkdown function or a custom serializer"
msgstr ""
@@ -9181,6 +9315,9 @@ msgstr ""
msgid "Copy link to chart"
msgstr ""
+msgid "Copy prefix"
+msgstr ""
+
msgid "Copy reference"
msgstr ""
@@ -9211,6 +9348,9 @@ msgstr ""
msgid "Copy value"
msgstr ""
+msgid "Corpus Management"
+msgstr ""
+
msgid "Corpus Management|Are you sure you want to delete the corpus?"
msgstr ""
@@ -9439,6 +9579,9 @@ msgstr ""
msgid "Create commit"
msgstr ""
+msgid "Create common files more quickly, and standardize their format."
+msgstr ""
+
msgid "Create confidential merge request"
msgstr ""
@@ -9472,6 +9615,9 @@ msgstr ""
msgid "Create issue"
msgstr ""
+msgid "Create issue to resolve all threads"
+msgstr ""
+
msgid "Create iteration"
msgstr ""
@@ -9526,6 +9672,9 @@ msgstr ""
msgid "Create new..."
msgstr ""
+msgid "Create or import your first project"
+msgstr ""
+
msgid "Create project"
msgstr ""
@@ -9883,7 +10032,7 @@ msgstr ""
msgid "Custom notification events"
msgstr ""
-msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notificationLinkStart} notification emails%{notificationLinkEnd}."
+msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notificationLinkStart}notification emails%{notificationLinkEnd}."
msgstr ""
msgid "Custom project templates"
@@ -10082,10 +10231,10 @@ msgid_plural "CycleAnalytics|Showing %{subjectFilterText} and %{selectedLabelsCo
msgstr[0] ""
msgstr[1] ""
-msgid "CycleAnalytics|Showing data for group '%{groupName}' and %{selectedProjectCount} projects from %{startDate} to %{endDate}"
+msgid "CycleAnalytics|Showing data for group '%{groupName}' and %{selectedProjectCount} projects from %{createdAfter} to %{createdBefore}"
msgstr ""
-msgid "CycleAnalytics|Showing data for group '%{groupName}' from %{startDate} to %{endDate}"
+msgid "CycleAnalytics|Showing data for group '%{groupName}' from %{createdAfter} to %{createdBefore}"
msgstr ""
msgid "CycleAnalytics|Stages"
@@ -10319,6 +10468,9 @@ msgstr ""
msgid "DastProfiles|Manage profiles"
msgstr ""
+msgid "DastProfiles|Manage site profiles"
+msgstr ""
+
msgid "DastProfiles|Minimum = 0 (no timeout enabled), Maximum = 2880 minutes"
msgstr ""
@@ -10394,6 +10546,9 @@ msgstr ""
msgid "DastProfiles|Scanner name"
msgstr ""
+msgid "DastProfiles|Schedule"
+msgstr ""
+
msgid "DastProfiles|Select branch"
msgstr ""
@@ -10463,7 +10618,7 @@ msgstr ""
msgid "DastProfiles|Website"
msgstr ""
-msgid "DastProfiles|You can either choose a passive scan or validate the target site in your chosen site profile. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
+msgid "DastProfiles|You can either choose a passive scan or validate the target site from the site profile management page. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
msgstr ""
msgid "DastProfiles|You cannot run an active scan against an unvalidated site."
@@ -10636,7 +10791,7 @@ msgstr ""
msgid "Days to merge"
msgstr ""
-msgid "Deactivate dormant users after 90 days of inactivity. Users can return to active status by signing in to their account. While inactive, a user is not counted as an active user in the instance."
+msgid "Deactivate dormant users after 90 days of inactivity"
msgstr ""
msgid "Dear Administrator,"
@@ -10723,10 +10878,10 @@ msgstr ""
msgid "Define a custom pattern with cron syntax"
msgstr ""
-msgid "Define approval settings."
+msgid "Define approval rules."
msgstr ""
-msgid "Define approval settings. %{linkStart}Learn more.%{linkEnd}"
+msgid "Define approval rules. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "Define custom rules for what constitutes spam, independent of Akismet"
@@ -10735,7 +10890,7 @@ msgstr ""
msgid "Define environments in the deploy stage(s) in %{code_open}.gitlab-ci.yml%{code_close} to track deployments here."
msgstr ""
-msgid "Define how approval rules are applied as a merge request moves toward completion."
+msgid "Define how approval rules are applied to merge requests."
msgstr ""
msgid "Definition"
@@ -10750,6 +10905,12 @@ msgstr ""
msgid "DelayedJobs|Are you sure you want to run %{job_name} immediately? This job will run automatically after it's timer finishes."
msgstr ""
+msgid "DelayedJobs|Are you sure you want to run %{job_name} immediately? This job will run automatically after its timer finishes."
+msgstr ""
+
+msgid "DelayedJobs|Run the delayed job now?"
+msgstr ""
+
msgid "DelayedJobs|Start now"
msgstr ""
@@ -11026,6 +11187,12 @@ msgstr ""
msgid "Dependency proxy image prefix"
msgstr ""
+msgid "DependencyProxy|Create a local proxy for storing frequently used upstream images. %{docLinkStart}Learn more%{docLinkEnd} about dependency proxies."
+msgstr ""
+
+msgid "DependencyProxy|Dependency Proxy"
+msgstr ""
+
msgid "DependencyProxy|Toggle Dependency Proxy"
msgstr ""
@@ -11266,6 +11433,9 @@ msgstr ""
msgid "Deployments"
msgstr ""
+msgid "Deployments to Google Kubernetes Engine can be "
+msgstr ""
+
msgid "Deployments|%{deployments} environment impacted."
msgid_plural "Deployments|%{deployments} environments impacted."
msgstr[0] ""
@@ -11295,6 +11465,9 @@ msgstr ""
msgid "Deployment|success"
msgstr ""
+msgid "Deprecated API rate limits"
+msgstr ""
+
msgid "Deprioritize label"
msgstr ""
@@ -11697,6 +11870,16 @@ msgstr ""
msgid "DiffsCompareBaseBranch|(base)"
msgstr ""
+msgid "Diffs|%d addition"
+msgid_plural "Diffs|%d additions"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Diffs|%d deletion"
+msgid_plural "Diffs|%d deletions"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Diffs|No file name available"
msgstr ""
@@ -11706,9 +11889,17 @@ msgstr ""
msgid "Diffs|Show all unchanged lines"
msgstr ""
+msgid "Diffs|Showing %{dropdownStart}%{count} changed file%{dropdownEnd}"
+msgid_plural "Diffs|Showing %{dropdownStart}%{count} changed files%{dropdownEnd}"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Diffs|Something went wrong while fetching diff lines."
msgstr ""
+msgid "Diffs|with %{additions} and %{deletions}"
+msgstr ""
+
msgid "Direct member"
msgstr ""
@@ -11834,9 +12025,6 @@ msgid_plural "Dismiss %d selected vulnerabilities as"
msgstr[0] ""
msgstr[1] ""
-msgid "Dismiss Value Stream Analytics introduction box"
-msgstr ""
-
msgid "Dismiss merge request promotion"
msgstr ""
@@ -12158,6 +12346,9 @@ msgstr ""
msgid "Edit issues"
msgstr ""
+msgid "Edit merge requests"
+msgstr ""
+
msgid "Edit public deploy key"
msgstr ""
@@ -12233,6 +12424,9 @@ msgstr ""
msgid "Elastic|None. Select projects to index."
msgstr ""
+msgid "Eligible users"
+msgstr ""
+
msgid "Email"
msgstr ""
@@ -12362,6 +12556,9 @@ msgstr ""
msgid "Enable"
msgstr ""
+msgid "Enable Amazon EKS integration"
+msgstr ""
+
msgid "Enable Auto DevOps"
msgstr ""
@@ -12395,6 +12592,9 @@ msgstr ""
msgid "Enable SSL verification"
msgstr ""
+msgid "Enable Service Ping"
+msgstr ""
+
msgid "Enable Snowplow tracking"
msgstr ""
@@ -12425,6 +12625,9 @@ msgstr ""
msgid "Enable authenticated Git LFS request rate limit"
msgstr ""
+msgid "Enable authenticated web request rate limit"
+msgstr ""
+
msgid "Enable authentication"
msgstr ""
@@ -12485,7 +12688,7 @@ msgstr ""
msgid "Enable or disable the Pseudonymizer data collection."
msgstr ""
-msgid "Enable or disable version check and service ping."
+msgid "Enable or disable version check and Service Ping."
msgstr ""
msgid "Enable protected paths rate limit"
@@ -12497,18 +12700,12 @@ msgstr ""
msgid "Enable reCAPTCHA"
msgstr ""
-msgid "Enable reCAPTCHA for login"
-msgstr ""
-
-msgid "Enable reCAPTCHA, Invisible Captcha, Akismet and set IP limits. For reCAPTCHA, we currently only support %{recaptcha_v2_link_start}v2%{recaptcha_v2_link_end}"
+msgid "Enable reCAPTCHA for login."
msgstr ""
msgid "Enable repository checks"
msgstr ""
-msgid "Enable service ping"
-msgstr ""
-
msgid "Enable shared runners for all projects and subgroups in this group."
msgstr ""
@@ -12530,7 +12727,10 @@ msgstr ""
msgid "Enable unauthenticated API request rate limit"
msgstr ""
-msgid "Enable unauthenticated request rate limit"
+msgid "Enable unauthenticated web request rate limit"
+msgstr ""
+
+msgid "Enable user deactivation emails"
msgstr ""
msgid "Enable version check"
@@ -12566,9 +12766,6 @@ msgstr ""
msgid "Enabled sources for code import during project creation. OmniAuth must be configured for GitHub"
msgstr ""
-msgid "Enabling this will only make licensed EE features available to projects if the project namespace's plan includes the feature or if the project is public."
-msgstr ""
-
msgid "Encountered an error while rendering: %{err}"
msgstr ""
@@ -12617,9 +12814,6 @@ msgstr ""
msgid "Enter Admin Mode"
msgstr ""
-msgid "Enter IP address range"
-msgstr ""
-
msgid "Enter a number"
msgstr ""
@@ -12632,9 +12826,6 @@ msgstr ""
msgid "Enter at least three characters to search"
msgstr ""
-msgid "Enter domain"
-msgstr ""
-
msgid "Enter in your Bitbucket Server URL and personal access token below"
msgstr ""
@@ -12821,9 +13012,6 @@ msgstr ""
msgid "Environments|Deployment %{status}"
msgstr ""
-msgid "Environments|Dismiss"
-msgstr ""
-
msgid "Environments|Enable review app"
msgstr ""
@@ -12836,9 +13024,6 @@ msgstr ""
msgid "Environments|Environments are places where code gets deployed, such as staging or production."
msgstr ""
-msgid "Environments|Help us improve environments"
-msgstr ""
-
msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
msgstr ""
@@ -12875,6 +13060,9 @@ msgstr ""
msgid "Environments|Note that this action will stop the environment, but it will %{emphasisStart}not%{emphasisEnd} have an effect on any existing deployment due to no “stop environment action†being defined in the %{ciConfigLinkStart}.gitlab-ci.yml%{ciConfigLinkEnd} file."
msgstr ""
+msgid "Environments|Open"
+msgstr ""
+
msgid "Environments|Open live environment"
msgstr ""
@@ -12914,9 +13102,6 @@ msgstr ""
msgid "Environments|Stopping %{environmentName}"
msgstr ""
-msgid "Environments|Take the survey"
-msgstr ""
-
msgid "Environments|There was an error fetching the logs. Please try again."
msgstr ""
@@ -12938,9 +13123,6 @@ msgstr ""
msgid "Environments|You don't have any environments right now"
msgstr ""
-msgid "Environments|Your feedback helps GitLab make environments better for you and other users. Participate and enter a sweepstake to win a USD 30 gift card."
-msgstr ""
-
msgid "Environments|by %{avatar}"
msgstr ""
@@ -13223,7 +13405,7 @@ msgstr ""
msgid "Error parsing CSV file. Please make sure it has"
msgstr ""
-msgid "Error rendering markdown preview"
+msgid "Error rendering Markdown preview"
msgstr ""
msgid "Error saving label update."
@@ -13271,6 +13453,9 @@ msgstr ""
msgid "Error: %{error_message}"
msgstr ""
+msgid "Error: Couldn't load some or all of the changes."
+msgstr ""
+
msgid "Error: No AWS credentials were supplied"
msgstr ""
@@ -13304,6 +13489,9 @@ msgstr ""
msgid "ErrorTracking|Enable error tracking"
msgstr ""
+msgid "ErrorTracking|Error tracking backend"
+msgstr ""
+
msgid "ErrorTracking|If you self-host Sentry, enter your Sentry instance's full URL. If you use Sentry's hosted solution, enter https://sentry.io"
msgstr ""
@@ -13337,6 +13525,12 @@ msgstr ""
msgid "Escalation policies must have at least one rule"
msgstr ""
+msgid "EscalationPolicies|%{clockIcon} IF alert is not %{alertStatus} in %{minutes}"
+msgstr ""
+
+msgid "EscalationPolicies|%{notificationIcon} THEN %{doAction} %{forScheduleOrUser}"
+msgstr ""
+
msgid "EscalationPolicies|+ Add an additional rule"
msgstr ""
@@ -13379,13 +13573,13 @@ msgstr ""
msgid "EscalationPolicies|Escalation policies"
msgstr ""
-msgid "EscalationPolicies|Escalation rules"
+msgid "EscalationPolicies|Escalation policy %{obstacle} in Project %{project}"
msgstr ""
-msgid "EscalationPolicies|Failed to load oncall-schedules"
+msgid "EscalationPolicies|Escalation rules"
msgstr ""
-msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} %{then} THEN %{doAction} %{scheduleOrUser}"
+msgid "EscalationPolicies|Failed to load oncall-schedules"
msgstr ""
msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} minutes"
@@ -13463,18 +13657,36 @@ msgstr ""
msgid "Every %{action} attempt has failed: %{job_error_message}. Please try again."
msgstr ""
+msgid "Every 3 months"
+msgstr ""
+
+msgid "Every 3 months on the %{day} at %{time} %{timezone}"
+msgstr ""
+
+msgid "Every 6 months"
+msgstr ""
+
+msgid "Every 6 months on the %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Every day"
msgstr ""
msgid "Every day (at %{time})"
msgstr ""
+msgid "Every day at %{time} %{timezone}"
+msgstr ""
+
msgid "Every month"
msgstr ""
msgid "Every month (Day %{day} at %{time})"
msgstr ""
+msgid "Every month on the %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Every three months"
msgstr ""
@@ -13489,6 +13701,15 @@ msgstr[1] ""
msgid "Every week (%{weekday} at %{time})"
msgstr ""
+msgid "Every week on %{day} at %{time} %{timezone}"
+msgstr ""
+
+msgid "Every year"
+msgstr ""
+
+msgid "Every year on %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Everyone"
msgstr ""
@@ -13525,9 +13746,6 @@ msgstr ""
msgid "Exactly one of %{attributes} is required"
msgstr ""
-msgid "Example: %{ip_address}. %{read_more_link}."
-msgstr ""
-
msgid "Example: @sub\\.company\\.com$"
msgstr ""
@@ -13594,13 +13812,13 @@ msgstr ""
msgid "Expand pipeline"
msgstr ""
-msgid "Expand sidebar"
+msgid "Expand settings section"
msgstr ""
-msgid "Expected documents: %{expected_documents}"
+msgid "Expand sidebar"
msgstr ""
-msgid "Experienced"
+msgid "Expected documents: %{expected_documents}"
msgstr ""
msgid "ExperimentSubject|Must have exactly one of User, Namespace, or Project."
@@ -13885,9 +14103,6 @@ msgstr ""
msgid "Failed to load related branches"
msgstr ""
-msgid "Failed to load sidebar lock status"
-msgstr ""
-
msgid "Failed to load stacktrace."
msgstr ""
@@ -14312,6 +14527,9 @@ msgstr ""
msgid "Files"
msgstr ""
+msgid "Files API Rate Limits"
+msgstr ""
+
msgid "Files breadcrumb"
msgstr ""
@@ -15311,6 +15529,9 @@ msgstr ""
msgid "GitLab group: %{source_link}"
msgstr ""
+msgid "GitLab informs you if a new version is available."
+msgstr ""
+
msgid "GitLab is a complete DevOps platform, delivered as a single application, fundamentally changing the way Development, Security, and Ops teams collaborate"
msgstr ""
@@ -15326,7 +15547,7 @@ msgstr ""
msgid "GitLab is open source software to collaborate on code."
msgstr ""
-msgid "GitLab is undergoing maintenance and is operating in a read-only mode."
+msgid "GitLab is undergoing maintenance and is operating in read-only mode."
msgstr ""
msgid "GitLab member or Email address"
@@ -15338,9 +15559,6 @@ msgstr ""
msgid "GitLab project export"
msgstr ""
-msgid "GitLab restart is required to apply changes."
-msgstr ""
-
msgid "GitLab single sign-on URL"
msgstr ""
@@ -15356,9 +15574,6 @@ msgstr ""
msgid "GitLab version"
msgstr ""
-msgid "GitLab will inform you if a new version is available."
-msgstr ""
-
msgid "GitLab will run a background job that will produce pseudonymized CSVs of the GitLab database that will be uploaded to your configured object storage directory."
msgstr ""
@@ -15623,9 +15838,21 @@ msgstr ""
msgid "Go to snippets"
msgstr ""
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check 'Allowed domains for sign-ups'."
+msgstr ""
+
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check 'Email restrictions for sign-ups'."
+msgstr ""
+
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check the 'Domain denylist'."
+msgstr ""
+
msgid "Go to the activity feed"
msgstr ""
+msgid "Go to the group’s 'Settings &gt; General' page, and check 'Restrict membership by email domain'."
+msgstr ""
+
msgid "Go to the milestone list"
msgstr ""
@@ -15662,6 +15889,12 @@ msgstr ""
msgid "Goal of the changes and what reviewers should be aware of"
msgstr ""
+msgid "Google Cloud"
+msgstr ""
+
+msgid "Google Cloud offers several deployment targets. Select the one most suitable for your project."
+msgstr ""
+
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
@@ -15746,9 +15979,6 @@ msgstr ""
msgid "Group ID"
msgstr ""
-msgid "Group ID: %{group_id}"
-msgstr ""
-
msgid "Group Owner must have signed in with SAML before enabling Group Managed Accounts"
msgstr ""
@@ -15923,6 +16153,12 @@ msgstr ""
msgid "GroupImport|Unable to process group import file"
msgstr ""
+msgid "GroupPage|Copy group ID"
+msgstr ""
+
+msgid "GroupPage|Group ID: %{group_id}"
+msgstr ""
+
msgid "GroupRoadmap|%{dateWord} – No end date"
msgstr ""
@@ -15977,6 +16213,9 @@ msgstr ""
msgid "GroupRoadmap|Within 3 years"
msgstr ""
+msgid "GroupSAML|\"persistent\" recommended"
+msgstr ""
+
msgid "GroupSAML|%{strongOpen}Warning%{strongClose} - Enabling %{linkStart}SSO enforcement%{linkEnd} can reduce security risks."
msgstr ""
@@ -16109,6 +16348,9 @@ msgstr ""
msgid "GroupSAML|To be able to prohibit outer forks, you first need to enforce dedicate group managed accounts."
msgstr ""
+msgid "GroupSAML|Use SAML group links to manage group membership using SAML."
+msgstr ""
+
msgid "GroupSAML|Valid SAML Response"
msgstr ""
@@ -16121,13 +16363,10 @@ msgstr ""
msgid "GroupSAML|as %{access_level}"
msgstr ""
-msgid "GroupSAML|must match stored NameID of \"%{extern_uid}\" as we use this to identify users. If the NameID changes users will be unable to sign in."
-msgstr ""
-
-msgid "GroupSAML|should be \"persistent\""
+msgid "GroupSAML|must match stored NameID of \"%{extern_uid}\" to identify user and allow sign in"
msgstr ""
-msgid "GroupSAML|should be a random persistent ID, emails are discouraged"
+msgid "GroupSAML|recommend persistent ID instead of email"
msgstr ""
msgid "GroupSelect|No matching results"
@@ -16142,9 +16381,15 @@ msgstr ""
msgid "GroupSettings|Allow project access token creation"
msgstr ""
+msgid "GroupSettings|Applied to all subgroups unless overridden by a group owner. Groups already added to the project lose access."
+msgstr ""
+
msgid "GroupSettings|Auto DevOps pipeline was updated for the group"
msgstr ""
+msgid "GroupSettings|Available only on the top-level group. Applies to all subgroups. Groups already shared with a group outside %{group} are still shared unless removed manually."
+msgstr ""
+
msgid "GroupSettings|Badges"
msgstr ""
@@ -16196,6 +16441,9 @@ msgstr ""
msgid "GroupSettings|New runners registration token has been generated!"
msgstr ""
+msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgstr ""
+
msgid "GroupSettings|Pipeline settings was updated for the group"
msgstr ""
@@ -16208,12 +16456,15 @@ msgstr ""
msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
-msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups."
+msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups"
msgstr ""
msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
msgstr ""
+msgid "GroupSettings|Prevents group members from being notified if the group is mentioned."
+msgstr ""
+
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
msgstr ""
@@ -16250,21 +16501,6 @@ msgstr ""
msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}."
msgstr ""
-msgid "GroupSettings|This setting is only available on the top-level group and it applies to all subgroups. Groups that have already been shared with a group outside %{group} will still be shared, and this access will have to be revoked manually."
-msgstr ""
-
-msgid "GroupSettings|This setting will be applied to all subgroups unless overridden by a group owner. Groups that already have access to the project will continue to have access unless removed manually."
-msgstr ""
-
-msgid "GroupSettings|This setting will override user notification preferences for all members of the group, subgroups, and projects."
-msgstr ""
-
-msgid "GroupSettings|This setting will prevent group members from being notified if the group is mentioned."
-msgstr ""
-
-msgid "GroupSettings|This setting will prevent group members from forking projects outside of the group."
-msgstr ""
-
msgid "GroupSettings|Transfer group"
msgstr ""
@@ -16382,7 +16618,7 @@ msgstr ""
msgid "GroupsNew|No import options available"
msgstr ""
-msgid "GroupsNew|Not all related objects are migrated, as %{docs_link_start}described here%{docs_link_end}. Please %{feedback_link_start}leave feedback%{feedback_link_end} on this feature."
+msgid "GroupsNew|Not all related objects are migrated. %{docs_link_start}More info%{docs_link_end}."
msgstr ""
msgid "GroupsNew|Personal access token"
@@ -16514,15 +16750,27 @@ msgstr ""
msgid "Hello %{name},"
msgstr ""
-msgid "Hello there"
-msgstr ""
-
msgid "Hello, %{name}!"
msgstr ""
msgid "Hello, %{username}!"
msgstr ""
+msgid "HelloMessage|%{handshake_emoji} Contribute to GitLab: %{contribute_link}"
+msgstr ""
+
+msgid "HelloMessage|%{magnifier_emoji} Create a new GitLab issue: %{new_issue_link}"
+msgstr ""
+
+msgid "HelloMessage|%{rocket_emoji} We like your curiosity! Help us improve GitLab by joining the team: %{jobs_page_link}"
+msgstr ""
+
+msgid "HelloMessage|Does this page need fixes or improvements? Open an issue or contribute a merge request to help make GitLab more lovable. At GitLab, everyone can contribute!"
+msgstr ""
+
+msgid "HelloMessage|Welcome to GitLab!"
+msgstr ""
+
msgid "Help"
msgstr ""
@@ -16532,13 +16780,10 @@ msgstr ""
msgid "Helps prevent bots from creating accounts."
msgstr ""
-msgid "Helps prevent bots from creating issues"
-msgstr ""
-
-msgid "Helps prevent malicious users hide their activity"
+msgid "Helps prevent bots from creating issues."
msgstr ""
-msgid "Helps reduce request volume (e.g. from crawlers or abusive bots)"
+msgid "Helps prevent malicious users hide their activity."
msgstr ""
msgid "Helps reduce request volume (for example, from crawlers or abusive bots)"
@@ -16662,6 +16907,12 @@ msgstr ""
msgid "Housekeeping, export, path, transfer, remove, archive."
msgstr ""
+msgid "How do I configure Akismet?"
+msgstr ""
+
+msgid "How do I configure it?"
+msgstr ""
+
msgid "How do I configure runners?"
msgstr ""
@@ -16683,19 +16934,25 @@ msgstr ""
msgid "How do I set up this service?"
msgstr ""
+msgid "How do I use a web terminal?"
+msgstr ""
+
+msgid "How do I use file templates?"
+msgstr ""
+
msgid "How it works"
msgstr ""
msgid "How many days need to pass between marking entity for deletion and actual removing it."
msgstr ""
-msgid "How many seconds an IP will be counted towards the limit"
+msgid "How many seconds an IP counts toward the IP address limit."
msgstr ""
-msgid "I accept the %{terms_link}"
+msgid "How the job limiter handles jobs exceeding the thresholds specified below. The 'track' mode only logs the jobs. The 'compress' mode compresses the jobs and raises an exception if the compressed size exceeds the limit."
msgstr ""
-msgid "I accept the|Terms of Service and Privacy Policy"
+msgid "I accept the %{terms_link}"
msgstr ""
msgid "I forgot my password"
@@ -16779,13 +17036,16 @@ msgstr ""
msgid "IP Address"
msgstr ""
-msgid "IP expiration time"
+msgid "IP address expiration time"
msgstr ""
-msgid "IP subnet restriction only allowed for top-level groups"
+msgid "IP address restrictions"
+msgstr ""
+
+msgid "IP addresses per user"
msgstr ""
-msgid "IPs per user"
+msgid "IP subnet restriction only allowed for top-level groups"
msgstr ""
msgid "Identifier"
@@ -16800,6 +17060,9 @@ msgstr ""
msgid "If any indexed field exceeds this limit it will be truncated to this number of characters and the rest will not be indexed or searchable. This does not apply to repository and wiki indexing. Setting this to 0 means it is unlimited."
msgstr ""
+msgid "If blank, defaults to %{code_open}Retry later%{code_close}."
+msgstr ""
+
msgid "If blank, set allowable lifetime to %{instance_level_policy_in_words}, as defined by the instance admin. Once set, existing tokens for users in this group may be revoked."
msgstr ""
@@ -16851,6 +17114,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 did not initiate these sign-in attempts, please reach out to your administrator or enable two-factor authentication (2FA) on your account."
+msgstr ""
+
msgid "If you did not initiate this change, please contact your administrator immediately."
msgstr ""
@@ -16942,10 +17208,10 @@ msgstr ""
msgid "Import Projects from Gitea"
msgstr ""
-msgid "Import a project"
+msgid "Import an exported GitLab project"
msgstr ""
-msgid "Import an exported GitLab project"
+msgid "Import and export rate limits"
msgstr ""
msgid "Import failed due to a GitHub error: %{original}"
@@ -16957,12 +17223,18 @@ msgstr ""
msgid "Import from Jira"
msgstr ""
+msgid "Import group"
+msgstr ""
+
msgid "Import group from file"
msgstr ""
msgid "Import groups"
msgstr ""
+msgid "Import history"
+msgstr ""
+
msgid "Import in progress"
msgstr ""
@@ -17026,7 +17298,25 @@ msgstr ""
msgid "Import timed out. Import took longer than %{import_jobs_expiration} seconds"
msgstr ""
-msgid "Import/Export Rate Limits"
+msgid "ImportAProjectModal|Import from a project"
+msgstr ""
+
+msgid "ImportAProjectModal|Import members from another project"
+msgstr ""
+
+msgid "ImportAProjectModal|Import project members"
+msgstr ""
+
+msgid "ImportAProjectModal|Only project members (not group members) are imported, and they get the same permissions as the project you import from."
+msgstr ""
+
+msgid "ImportAProjectModal|Successfully imported"
+msgstr ""
+
+msgid "ImportAProjectModal|Unable to import project members"
+msgstr ""
+
+msgid "ImportAProjectModal|You're importing members to the %{strongStart}%{name}%{strongEnd} project."
msgstr ""
msgid "ImportButtons|Connect repositories from"
@@ -17079,7 +17369,7 @@ msgstr[1] ""
msgid "Importing..."
msgstr ""
-msgid "Import|A repository URL usually ends in a .git suffix, although this is not required. Double check to make sure your repository URL is correct."
+msgid "Import|There is not a valid Git repository at this URL. If your HTTP repository is not publicly accessible, verify your credentials."
msgstr ""
msgid "Improve customer support with Service Desk"
@@ -17088,9 +17378,6 @@ msgstr ""
msgid "Improves Git cloning performance."
msgstr ""
-msgid "In %{time_to_now}"
-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 ""
@@ -17376,7 +17663,7 @@ msgstr ""
msgid "InProductMarketing|Start a GitLab Ultimate trial today in less than one minute, no credit card required."
msgstr ""
-msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no CC required"
+msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no credit card required"
msgstr ""
msgid "InProductMarketing|Start a trial"
@@ -17415,7 +17702,7 @@ msgstr ""
msgid "InProductMarketing|Team up in GitLab for greater efficiency"
msgstr ""
-msgid "InProductMarketing|Team work makes the dream work"
+msgid "InProductMarketing|Team work makes the dream work"
msgstr ""
msgid "InProductMarketing|Test, create, deploy"
@@ -17996,6 +18283,9 @@ msgstr ""
msgid "Integrations|Create new issue in Jira"
msgstr ""
+msgid "Integrations|Create new issue in ZenTao"
+msgstr ""
+
msgid "Integrations|Default settings are inherited from the group level."
msgstr ""
@@ -18089,9 +18379,15 @@ msgstr ""
msgid "Integrations|Search Jira issues"
msgstr ""
+msgid "Integrations|Search ZenTao issues"
+msgstr ""
+
msgid "Integrations|Send notifications about project events to Unify Circuit."
msgstr ""
+msgid "Integrations|Send notifications about project events to a Unify Circuit conversation. %{docs_link}"
+msgstr ""
+
msgid "Integrations|Sign in to add namespaces"
msgstr ""
@@ -18131,6 +18427,9 @@ msgstr ""
msgid "Integrations|You've activated every integration 🎉"
msgstr ""
+msgid "Integrations|ZenTao issues display here when you create issues in your project in ZenTao."
+msgstr ""
+
msgid "Interactive mode"
msgstr ""
@@ -18158,9 +18457,6 @@ msgstr ""
msgid "Interval Pattern"
msgstr ""
-msgid "Introducing Value Stream Analytics"
-msgstr ""
-
msgid "Introducing Your DevOps Report"
msgstr ""
@@ -18257,6 +18553,12 @@ msgstr ""
msgid "Investigate vulnerability: %{title}"
msgstr ""
+msgid "Invisible Captcha"
+msgstr ""
+
+msgid "Invisible Captcha helps prevent the creation of spam accounts. It adds a honeypot field and time-sensitive form submission to the account signup form."
+msgstr ""
+
msgid "Invitation"
msgstr ""
@@ -18710,12 +19012,18 @@ msgstr ""
msgid "Issues"
msgstr ""
+msgid "Issues I've created"
+msgstr ""
+
msgid "Issues Rate Limits"
msgstr ""
msgid "Issues and merge requests"
msgstr ""
+msgid "Issues assigned to me"
+msgstr ""
+
msgid "Issues can be bugs, tasks or ideas to be discussed. Also, issues are searchable and filterable."
msgstr ""
@@ -18827,7 +19135,7 @@ msgstr ""
msgid "Iterations|Create cadence"
msgstr ""
-msgid "Iterations|Create your first iteration"
+msgid "Iterations|Create iteration"
msgstr ""
msgid "Iterations|Delete cadence"
@@ -18836,6 +19144,9 @@ msgstr ""
msgid "Iterations|Delete iteration cadence?"
msgstr ""
+msgid "Iterations|Delete iteration?"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -18869,12 +19180,18 @@ msgstr ""
msgid "Iterations|New iteration cadence"
msgstr ""
+msgid "Iterations|No closed iterations."
+msgstr ""
+
msgid "Iterations|No iteration cadences to show."
msgstr ""
msgid "Iterations|No iterations in cadence."
msgstr ""
+msgid "Iterations|No open iterations."
+msgstr ""
+
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
@@ -18905,6 +19222,9 @@ msgstr ""
msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
msgstr ""
+msgid "Iterations|This will remove the iteration from any issues that are assigned to it."
+msgstr ""
+
msgid "Iterations|Title"
msgstr ""
@@ -18920,15 +19240,9 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "I’m familiar with the basics of DevOps."
-msgstr ""
-
msgid "I’m joining my team who’s already on GitLab"
msgstr ""
-msgid "I’m not familiar with the basics of DevOps."
-msgstr ""
-
msgid "Jaeger URL"
msgstr ""
@@ -19193,6 +19507,9 @@ msgstr ""
msgid "Job"
msgstr ""
+msgid "Job %{jobName}"
+msgstr ""
+
msgid "Job Failed #%{build_id}"
msgstr ""
@@ -19783,9 +20100,6 @@ msgstr ""
msgid "Learn more in the"
msgstr ""
-msgid "Learn more in the|pipeline schedules documentation"
-msgstr ""
-
msgid "Learn more."
msgstr ""
@@ -19897,9 +20211,6 @@ msgstr ""
msgid "Leave Admin Mode"
msgstr ""
-msgid "Leave blank for no limit. Once set, existing personal access tokens may be revoked."
-msgstr ""
-
msgid "Leave edit mode? All unsaved changes will be lost."
msgstr ""
@@ -19945,10 +20256,10 @@ msgstr ""
msgid "LicenseCompliance|Acceptable license to be used in the project"
msgstr ""
-msgid "LicenseCompliance|Add a license"
+msgid "LicenseCompliance|Add license and related policy"
msgstr ""
-msgid "LicenseCompliance|Add license and related policy"
+msgid "LicenseCompliance|Add license policy"
msgstr ""
msgid "LicenseCompliance|Allow"
@@ -20038,6 +20349,9 @@ msgstr ""
msgid "LicenseManagement|Uncategorized"
msgstr ""
+msgid "Licensed Enterprise Edition features can be used if the project namespace's plan includes the feature, or if the project is public."
+msgstr ""
+
msgid "Licensed Features"
msgstr ""
@@ -20104,7 +20418,10 @@ msgstr ""
msgid "Limit namespaces and projects that can be indexed"
msgstr ""
-msgid "Limit sign in from multiple ips"
+msgid "Limit project size at a global, group, and project level. %{link_start}Learn more%{link_end}."
+msgstr ""
+
+msgid "Limit sign in from multiple IP addresses"
msgstr ""
msgid "Limit the number of concurrent operations this secondary site can run in the background."
@@ -20116,11 +20433,17 @@ msgstr ""
msgid "Limit the number of issues and epics per minute a user can create through web and API requests."
msgstr ""
+msgid "Limit the size of Sidekiq jobs stored in Redis."
+msgstr ""
+
msgid "Limited to showing %d event at most"
msgid_plural "Limited to showing %d events at most"
msgstr[0] ""
msgstr[1] ""
+msgid "Limiting mode"
+msgstr ""
+
msgid "Line changes"
msgstr ""
@@ -20190,9 +20513,6 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
-msgid "List of users to be excluded from the limit"
-msgstr ""
-
msgid "List options"
msgstr ""
@@ -20232,9 +20552,6 @@ msgstr ""
msgid "Loading functions timed out. Please reload the page to try again."
msgstr ""
-msgid "Loading issues"
-msgstr ""
-
msgid "Loading more"
msgstr ""
@@ -20526,6 +20843,9 @@ msgstr ""
msgid "Marked For Deletion At - %{deletion_time}"
msgstr ""
+msgid "Marked as ready. Merging is now allowed."
+msgstr ""
+
msgid "Marked this %{noun} as a draft."
msgstr ""
@@ -20598,52 +20918,22 @@ msgstr ""
msgid "Max 100,000 events"
msgstr ""
-msgid "Max 20 characters"
-msgstr ""
-
-msgid "Max Group Export Download requests per minute per user"
-msgstr ""
-
-msgid "Max Group Export requests per minute per user"
-msgstr ""
-
-msgid "Max Group Import requests per minute per user"
-msgstr ""
-
-msgid "Max Project Export Download requests per minute per user"
-msgstr ""
-
-msgid "Max Project Export requests per minute per user"
-msgstr ""
-
-msgid "Max Project Import requests per minute per user"
-msgstr ""
-
-msgid "Max authenticated API requests per period per user"
-msgstr ""
-
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
-msgid "Max authenticated web requests per period per user"
-msgstr ""
-
msgid "Max file size is 200 KB."
msgstr ""
-msgid "Max requests per minute per user"
-msgstr ""
-
msgid "Max role"
msgstr ""
msgid "Max session time"
msgstr ""
-msgid "Max unauthenticated requests per period per IP"
+msgid "MaxBuilds"
msgstr ""
-msgid "MaxBuilds"
+msgid "Maximum 20 characters"
msgstr ""
msgid "Maximum Conan package file size in bytes"
@@ -20679,6 +20969,12 @@ msgstr ""
msgid "Maximum attachment size (MB)"
msgstr ""
+msgid "Maximum authenticated API requests per rate limit period per user"
+msgstr ""
+
+msgid "Maximum authenticated web requests per rate limit period per user"
+msgstr ""
+
msgid "Maximum bulk request size (MiB)"
msgstr ""
@@ -20724,6 +21020,15 @@ msgstr ""
msgid "Maximum files in a diff"
msgstr ""
+msgid "Maximum group export download requests per minute"
+msgstr ""
+
+msgid "Maximum group export requests per minute"
+msgstr ""
+
+msgid "Maximum group import requests per minute"
+msgstr ""
+
msgid "Maximum import size"
msgstr ""
@@ -20760,7 +21065,7 @@ msgstr ""
msgid "Maximum number of projects."
msgstr ""
-msgid "Maximum number of unique IPs per user"
+msgid "Maximum number of unique IP addresses per user."
msgstr ""
msgid "Maximum page reached"
@@ -20769,12 +21074,24 @@ msgstr ""
msgid "Maximum page size"
msgstr ""
+msgid "Maximum project export download requests per minute"
+msgstr ""
+
+msgid "Maximum project export requests per minute"
+msgstr ""
+
+msgid "Maximum project import requests per minute"
+msgstr ""
+
msgid "Maximum push size"
msgstr ""
msgid "Maximum push size (MB)"
msgstr ""
+msgid "Maximum requests per minute"
+msgstr ""
+
msgid "Maximum running slices"
msgstr ""
@@ -20802,10 +21119,16 @@ msgstr ""
msgid "Maximum time between updates that a mirror can have when scheduled to synchronize."
msgstr ""
-msgid "Maximum time for web terminal websocket connection (in seconds). 0 for unlimited."
+msgid "Maximum time that users are allowed to skip the setup of two-factor authentication (in hours). Set to 0 (zero) to enforce at next sign in."
msgstr ""
-msgid "Maximum time that users are allowed to skip the setup of two-factor authentication (in hours). Set to 0 (zero) to enforce at next sign in."
+msgid "Maximum time, in seconds, for a web terminal websocket connection. 0 for unlimited."
+msgstr ""
+
+msgid "Maximum unauthenticated API requests per rate limit period per IP"
+msgstr ""
+
+msgid "Maximum unauthenticated web requests per rate limit period per IP"
msgstr ""
msgid "May"
@@ -20823,9 +21146,6 @@ msgstr ""
msgid "Medium vulnerabilities present"
msgstr ""
-msgid "Member lock"
-msgstr ""
-
msgid "Member since"
msgstr ""
@@ -20862,6 +21182,9 @@ msgstr ""
msgid "Members of a group may only view projects they have permission to access"
msgstr ""
+msgid "Membership"
+msgstr ""
+
msgid "Members|%{time} by %{user}"
msgstr ""
@@ -20922,9 +21245,6 @@ msgstr ""
msgid "Members|Expiration date updated successfully."
msgstr ""
-msgid "Members|Expired"
-msgstr ""
-
msgid "Members|Filter members"
msgstr ""
@@ -20940,9 +21260,6 @@ msgstr ""
msgid "Members|Membership"
msgstr ""
-msgid "Members|No expiration set"
-msgstr ""
-
msgid "Members|Remove \"%{groupName}\""
msgstr ""
@@ -20964,9 +21281,6 @@ msgstr ""
msgid "Members|Search invited"
msgstr ""
-msgid "Members|in %{time}"
-msgstr ""
-
msgid "Member|Deny access"
msgstr ""
@@ -21042,9 +21356,6 @@ msgstr ""
msgid "Merge request %{mr_link} was reviewed by %{mr_author}"
msgstr ""
-msgid "Merge request (MR) approvals"
-msgstr ""
-
msgid "Merge request analytics"
msgstr ""
@@ -21066,12 +21377,21 @@ msgstr ""
msgid "Merge requests"
msgstr ""
+msgid "Merge requests I've created"
+msgstr ""
+
msgid "Merge requests are a place to propose changes you've made to a project and discuss those changes with others"
msgstr ""
msgid "Merge requests are read-only in a secondary Geo node"
msgstr ""
+msgid "Merge requests assigned to me"
+msgstr ""
+
+msgid "Merge requests that I'm a reviewer"
+msgstr ""
+
msgid "Merge the branch and fix any conflicts that come up"
msgstr ""
@@ -21132,10 +21452,10 @@ msgstr ""
msgid "MergeRequests|An error occurred while saving the draft comment."
msgstr ""
-msgid "MergeRequests|Failed to squash. Should be done manually."
+msgid "MergeRequests|Create issue to resolve thread"
msgstr ""
-msgid "MergeRequests|Resolve this thread in a new issue"
+msgid "MergeRequests|Failed to squash. Should be done manually."
msgstr ""
msgid "MergeRequests|Saving the comment failed"
@@ -21949,6 +22269,9 @@ msgstr ""
msgid "MoveIssue|Cannot move issue to project it originates from!"
msgstr ""
+msgid "MoveIssue|Cannot move issues of '%{issue_type}' type."
+msgstr ""
+
msgid "Moved issue to %{label} column in the board."
msgstr ""
@@ -22074,6 +22397,15 @@ 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. To learn more about reducing storage capacity please visit our docs."
msgstr ""
+msgid "NamespaceUserCap|Pending users must be reviewed and approved by a group owner. Learn more about %{user_caps_link_start}User Caps%{link_end} and %{users_pending_approval_link_start}Users Pending Approval%{link_end}."
+msgstr ""
+
+msgid "NamespaceUserCap|View pending user approvals"
+msgstr ""
+
+msgid "NamespaceUserCap|Your group has reached its billable member limit"
+msgstr ""
+
msgid "Namespaces"
msgstr ""
@@ -22116,9 +22448,6 @@ msgstr ""
msgid "Network"
msgstr ""
-msgid "Network Policy|New rule"
-msgstr ""
-
msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is inbound from a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
msgstr ""
@@ -22140,16 +22469,13 @@ msgstr ""
msgid "NetworkPolicies|%{strongOpen}any%{strongClose} port"
msgstr ""
-msgid "NetworkPolicies|+ Add alert"
-msgstr ""
-
msgid "NetworkPolicies|.yaml"
msgstr ""
msgid "NetworkPolicies|.yaml mode"
msgstr ""
-msgid "NetworkPolicies|Actions"
+msgid "NetworkPolicies|Add alert"
msgstr ""
msgid "NetworkPolicies|Alerts are intended to be selectively used for a limited number of events that are potentially concerning and warrant a manual review. Alerts should not be used as a substitute for a SIEM or a logging tool. High volume alerts are likely to be dropped so as to preserve the stability of GitLab's integration with Kubernetes."
@@ -22185,9 +22511,6 @@ msgstr ""
msgid "NetworkPolicies|Deny all traffic"
msgstr ""
-msgid "NetworkPolicies|Description"
-msgstr ""
-
msgid "NetworkPolicies|Edit policy"
msgstr ""
@@ -22200,9 +22523,6 @@ msgstr ""
msgid "NetworkPolicies|IP/subnet"
msgstr ""
-msgid "NetworkPolicies|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
-msgstr ""
-
msgid "NetworkPolicies|Invalid or empty policy"
msgstr ""
@@ -22212,19 +22532,16 @@ msgstr ""
msgid "NetworkPolicies|Kubernetes error: %{error}"
msgstr ""
-msgid "NetworkPolicies|Name"
-msgstr ""
-
msgid "NetworkPolicies|Network"
msgstr ""
-msgid "NetworkPolicies|Network traffic"
+msgid "NetworkPolicies|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
msgstr ""
-msgid "NetworkPolicies|New policy"
+msgid "NetworkPolicies|Network policy can be created after the environment is loaded successfully."
msgstr ""
-msgid "NetworkPolicies|No policies detected"
+msgid "NetworkPolicies|Network traffic"
msgstr ""
msgid "NetworkPolicies|None selected"
@@ -22233,21 +22550,12 @@ msgstr ""
msgid "NetworkPolicies|Please %{installLinkStart}install%{installLinkEnd} and %{configureLinkStart}configure a Kubernetes Agent for this project%{configureLinkEnd} to enable alerts."
msgstr ""
-msgid "NetworkPolicies|Policies are a specification of how groups of pods are allowed to communicate with each other's network endpoints."
-msgstr ""
-
msgid "NetworkPolicies|Policy %{policyName} was successfully changed"
msgstr ""
msgid "NetworkPolicies|Policy definition"
msgstr ""
-msgid "NetworkPolicies|Policy editor"
-msgstr ""
-
-msgid "NetworkPolicies|Policy preview"
-msgstr ""
-
msgid "NetworkPolicies|Rule"
msgstr ""
@@ -22257,9 +22565,6 @@ msgstr ""
msgid "NetworkPolicies|Rule mode is unavailable for this policy. In some cases, we cannot parse the YAML file back into the rules editor."
msgstr ""
-msgid "NetworkPolicies|Rules"
-msgstr ""
-
msgid "NetworkPolicies|Save changes"
msgstr ""
@@ -22272,9 +22577,6 @@ msgstr ""
msgid "NetworkPolicies|Traffic that does not match any rule will be blocked."
msgstr ""
-msgid "NetworkPolicies|Unable to parse policy"
-msgstr ""
-
msgid "NetworkPolicies|all DNS names"
msgstr ""
@@ -22454,6 +22756,9 @@ msgstr ""
msgid "New issue"
msgstr ""
+msgid "New issue in %{project}"
+msgstr ""
+
msgid "New issue title"
msgstr ""
@@ -22532,7 +22837,7 @@ msgstr ""
msgid "Newest first"
msgstr ""
-msgid "Newly registered users will by default be external"
+msgid "Newly-registered users are external by default"
msgstr ""
msgid "Next"
@@ -22847,8 +23152,10 @@ msgstr ""
msgid "No webhooks found, add one in the form above."
msgstr ""
-msgid "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} to renew your subscription."
-msgstr ""
+msgid "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} day to renew your subscription."
+msgid_plural "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} days to renew your subscription."
+msgstr[0] ""
+msgstr[1] ""
msgid "No. of commits"
msgstr ""
@@ -22865,7 +23172,7 @@ msgstr ""
msgid "Nodes"
msgstr ""
-msgid "Non-admin users can sign in with read-only access and make read-only API requests."
+msgid "Non-admin users are restricted to read-only access, in both GitLab UI and API."
msgstr ""
msgid "None"
@@ -22946,7 +23253,7 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
-msgid "Notes Rate Limits"
+msgid "Notes rate limit"
msgstr ""
msgid "Notes|Are you sure you want to cancel creating this comment?"
@@ -23113,9 +23420,6 @@ msgstr ""
msgid "November"
msgstr ""
-msgid "Novice"
-msgstr ""
-
msgid "Now, personalize your GitLab experience"
msgstr ""
@@ -23284,7 +23588,7 @@ msgstr ""
msgid "OnCallSchedules|For this rotation, on-call will be:"
msgstr ""
-msgid "OnCallSchedules|On-call schedule %{schedule} in Project %{project}"
+msgid "OnCallSchedules|On-call schedule %{obstacle} in Project %{project}"
msgstr ""
msgid "OnCallSchedules|On-call schedules"
@@ -23431,22 +23735,22 @@ msgstr ""
msgid "OnDemandScans|Scanner profile"
msgstr ""
-msgid "OnDemandScans|Select one of the existing profiles"
+msgid "OnDemandScans|Schedule scan"
msgstr ""
-msgid "OnDemandScans|Site profile"
+msgid "OnDemandScans|Select one of the existing profiles"
msgstr ""
-msgid "OnDemandScans|Use existing scanner profile"
+msgid "OnDemandScans|Site profile"
msgstr ""
-msgid "OnDemandScans|Use existing site profile"
+msgid "OnDemandScans|Start time"
msgstr ""
-msgid "OnDemandScans|You can either choose a passive scan or validate the target site in your chosen site profile. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
+msgid "OnDemandScans|Use existing scanner profile"
msgstr ""
-msgid "OnDemandScans|You cannot run an active scan against an unvalidated site."
+msgid "OnDemandScans|Use existing site profile"
msgstr ""
msgid "OnDemandScans|You must create a repository within your project to run an on-demand scan."
@@ -23511,6 +23815,9 @@ msgstr ""
msgid "Only admins can delete project"
msgstr ""
+msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
+msgstr ""
+
msgid "Only include features new to your current subscription tier."
msgstr ""
@@ -23529,6 +23836,12 @@ msgstr ""
msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
+msgid "Only reCAPTCHA v2 is supported:"
+msgstr ""
+
+msgid "Only users from the specified IP address ranges are able to reach this group, including all subgroups, projects, and Git repositories."
+msgstr ""
+
msgid "Only verified users with an email address in any of these domains can be added to the group."
msgstr ""
@@ -23715,9 +24028,6 @@ msgstr ""
msgid "Package Registry"
msgstr ""
-msgid "Package Registry Rate Limits"
-msgstr ""
-
msgid "Package Registry: authenticated API requests"
msgstr ""
@@ -23736,6 +24046,9 @@ msgstr ""
msgid "Package recipe already exists"
msgstr ""
+msgid "Package registry rate limits"
+msgstr ""
+
msgid "Package type"
msgstr ""
@@ -23802,6 +24115,9 @@ msgstr ""
msgid "PackageRegistry|Composer"
msgstr ""
+msgid "PackageRegistry|Composer.json with license: %{license} and version: %{version}"
+msgstr ""
+
msgid "PackageRegistry|Conan"
msgstr ""
@@ -23865,6 +24181,9 @@ msgstr ""
msgid "PackageRegistry|Copy require package include"
msgstr ""
+msgid "PackageRegistry|Copy target SHA"
+msgstr ""
+
msgid "PackageRegistry|Copy yarn command"
msgstr ""
@@ -23931,6 +24250,9 @@ msgstr ""
msgid "PackageRegistry|Install package version"
msgstr ""
+msgid "PackageRegistry|Instance-level"
+msgstr ""
+
msgid "PackageRegistry|Invalid Package: failed metadata extraction"
msgstr ""
@@ -23976,6 +24298,9 @@ msgstr ""
msgid "PackageRegistry|Pip Command"
msgstr ""
+msgid "PackageRegistry|Project-level"
+msgstr ""
+
msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
msgstr ""
@@ -23997,6 +24322,9 @@ msgstr ""
msgid "PackageRegistry|Remove package"
msgstr ""
+msgid "PackageRegistry|Required Python: %{pythonVersion}"
+msgstr ""
+
msgid "PackageRegistry|RubyGems"
msgstr ""
@@ -24039,6 +24367,9 @@ msgstr ""
msgid "PackageRegistry|Source project located at %{link}"
msgstr ""
+msgid "PackageRegistry|Target SHA: %{sha}"
+msgstr ""
+
msgid "PackageRegistry|There are no other versions of this package."
msgstr ""
@@ -24207,6 +24538,18 @@ msgstr ""
msgid "Password was successfully updated. Please sign in again."
msgstr ""
+msgid "PasswordPrompt|Confirm password"
+msgstr ""
+
+msgid "PasswordPrompt|Confirm password to continue"
+msgstr ""
+
+msgid "PasswordPrompt|Password is required"
+msgstr ""
+
+msgid "PasswordPrompt|Please enter your password to confirm"
+msgstr ""
+
msgid "Passwords should be unique and not used for any other sites or services."
msgstr ""
@@ -24234,6 +24577,9 @@ msgstr ""
msgid "Paste project path (i.e. gitlab-org/gitlab)"
msgstr ""
+msgid "Paste this DSN into your Sentry SDK"
+msgstr ""
+
msgid "Paste your public SSH key, which is usually contained in the file '~/.ssh/id_ed25519.pub' or '~/.ssh/id_rsa.pub' and begins with 'ssh-ed25519' or 'ssh-rsa'. Do not paste your private SSH key, as that can compromise your identity."
msgstr ""
@@ -24318,6 +24664,9 @@ msgstr ""
msgid "PerformanceBar|First Contentful Paint"
msgstr ""
+msgid "PerformanceBar|Flamegraph with mode:"
+msgstr ""
+
msgid "PerformanceBar|Frontend resources"
msgstr ""
@@ -24351,6 +24700,15 @@ msgstr ""
msgid "PerformanceBar|Trace"
msgstr ""
+msgid "PerformanceBar|cpu"
+msgstr ""
+
+msgid "PerformanceBar|object"
+msgstr ""
+
+msgid "PerformanceBar|wall"
+msgstr ""
+
msgid "Period in seconds"
msgstr ""
@@ -24579,6 +24937,48 @@ msgstr ""
msgid "PipelineSchedules|Variables"
msgstr ""
+msgid "PipelineSource|API"
+msgstr ""
+
+msgid "PipelineSource|Chat"
+msgstr ""
+
+msgid "PipelineSource|External"
+msgstr ""
+
+msgid "PipelineSource|External Pull Request"
+msgstr ""
+
+msgid "PipelineSource|Merge Request"
+msgstr ""
+
+msgid "PipelineSource|On-Demand DAST Scan"
+msgstr ""
+
+msgid "PipelineSource|On-Demand DAST Validation"
+msgstr ""
+
+msgid "PipelineSource|Parent Pipeline"
+msgstr ""
+
+msgid "PipelineSource|Pipeline"
+msgstr ""
+
+msgid "PipelineSource|Push"
+msgstr ""
+
+msgid "PipelineSource|Schedule"
+msgstr ""
+
+msgid "PipelineSource|Trigger"
+msgstr ""
+
+msgid "PipelineSource|Web"
+msgstr ""
+
+msgid "PipelineSource|Web IDE"
+msgstr ""
+
msgid "PipelineStatusTooltip|Pipeline: %{ciStatus}"
msgstr ""
@@ -24879,46 +25279,7 @@ msgstr ""
msgid "Pipeline|Source"
msgstr ""
-msgid "Pipeline|Source|API"
-msgstr ""
-
-msgid "Pipeline|Source|Chat"
-msgstr ""
-
-msgid "Pipeline|Source|External"
-msgstr ""
-
-msgid "Pipeline|Source|External Pull Request"
-msgstr ""
-
-msgid "Pipeline|Source|Merge Request"
-msgstr ""
-
-msgid "Pipeline|Source|On-Demand DAST Scan"
-msgstr ""
-
-msgid "Pipeline|Source|On-Demand DAST Validation"
-msgstr ""
-
-msgid "Pipeline|Source|Parent Pipeline"
-msgstr ""
-
-msgid "Pipeline|Source|Pipeline"
-msgstr ""
-
-msgid "Pipeline|Source|Push"
-msgstr ""
-
-msgid "Pipeline|Source|Schedule"
-msgstr ""
-
-msgid "Pipeline|Source|Trigger"
-msgstr ""
-
-msgid "Pipeline|Source|Web"
-msgstr ""
-
-msgid "Pipeline|Source|Web IDE"
+msgid "Pipeline|Source|Security Policy"
msgstr ""
msgid "Pipeline|Specify variable values to be used in this run. The values specified in %{linkStart}CI/CD settings%{linkEnd} will be used by default."
@@ -24969,7 +25330,7 @@ msgstr ""
msgid "Pipeline|We are currently unable to fetch pipeline data"
msgstr ""
-msgid "Pipeline|You’re about to stop pipeline %{pipelineId}."
+msgid "Pipeline|You’re about to stop pipeline #%{pipelineId}."
msgstr ""
msgid "Pipeline|for"
@@ -24996,6 +25357,9 @@ msgstr ""
msgid "Plain diff"
msgstr ""
+msgid "Plain-text response to send to clients that hit a rate limit"
+msgstr ""
+
msgid "Plan:"
msgstr ""
@@ -25140,9 +25504,6 @@ msgstr ""
msgid "Please provide attributes to update"
msgstr ""
-msgid "Please provide your username or email address."
-msgstr ""
-
msgid "Please reach out if you have any questions and we'll be happy to assist."
msgstr ""
@@ -25185,9 +25546,6 @@ msgstr ""
msgid "Please set a new password before proceeding."
msgstr ""
-msgid "Please share your feedback about %{featureName} %{linkStart}in this issue%{linkEnd} to help us improve the experience."
-msgstr ""
-
msgid "Please solve the captcha"
msgstr ""
@@ -25365,6 +25723,9 @@ msgstr ""
msgid "Prevent adding new members to project membership within this group"
msgstr ""
+msgid "Prevent auto-stopping"
+msgstr ""
+
msgid "Prevent editing approval rules in projects and merge requests."
msgstr ""
@@ -25377,7 +25738,7 @@ msgstr ""
msgid "Prevent users from changing their profile name"
msgstr ""
-msgid "Prevent users from performing write operations on GitLab while performing maintenance."
+msgid "Prevent users from performing write operations while GitLab maintenance is in progress."
msgstr ""
msgid "Preview"
@@ -25650,6 +26011,9 @@ msgstr ""
msgid "Profiles|Enter your name, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Enter your password to confirm the email change"
+msgstr ""
+
msgid "Profiles|Enter your pronouns to let people know how to refer to you"
msgstr ""
@@ -25884,10 +26248,10 @@ msgstr ""
msgid "Profiles|e.g. My MacBook key"
msgstr ""
-msgid "Profiles|username"
+msgid "Profiles|https://website.com"
msgstr ""
-msgid "Profiles|website.com"
+msgid "Profiles|username"
msgstr ""
msgid "Profiles|your account"
@@ -26130,9 +26494,21 @@ msgstr ""
msgid "ProjectSelect| or group"
msgstr ""
+msgid "ProjectSelect|No matching results"
+msgstr ""
+
msgid "ProjectSelect|Search for project"
msgstr ""
+msgid "ProjectSelect|Search projects"
+msgstr ""
+
+msgid "ProjectSelect|Select a project"
+msgstr ""
+
+msgid "ProjectSelect|There was an error fetching the projects. Please try again."
+msgstr ""
+
msgid "ProjectService|Drone server URL"
msgstr ""
@@ -26220,6 +26596,9 @@ msgstr ""
msgid "ProjectService|Trigger event when a new, unique alert is recorded."
msgstr ""
+msgid "ProjectService|Trigger event when a new, unique vulnerability is recorded. (Note: This feature requires an Ultimate plan.)"
+msgstr ""
+
msgid "ProjectService|Trigger event when a pipeline status changes."
msgstr ""
@@ -26634,9 +27013,15 @@ msgstr ""
msgid "Projects are graded based on the highest severity vulnerability present"
msgstr ""
+msgid "Projects are organized into groups"
+msgstr ""
+
msgid "Projects contributed to"
msgstr ""
+msgid "Projects help you organize your work. They contain your file repository, issues, merge requests, and so much more."
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr ""
@@ -26871,10 +27256,10 @@ msgstr ""
msgid "PrometheusService|Prometheus cluster integration"
msgstr ""
-msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
+msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
msgstr ""
-msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
+msgid "PrometheusService|The ID of the IAP-secured resource."
msgstr ""
msgid "PrometheusService|The Prometheus API base URL."
@@ -27492,6 +27877,9 @@ msgstr ""
msgid "Rate limit"
msgstr ""
+msgid "Rate limits can help reduce request volume (like from crawlers or abusive bots)."
+msgstr ""
+
msgid "Raw blob request rate limit per minute"
msgstr ""
@@ -27504,6 +27892,9 @@ msgstr ""
msgid "Re-authentication required"
msgstr ""
+msgid "Re-import"
+msgstr ""
+
msgid "Re-request review"
msgstr ""
@@ -27525,6 +27916,9 @@ msgstr ""
msgid "Read more about related issues"
msgstr ""
+msgid "Read their documentation."
+msgstr ""
+
msgid "Ready to get started with GitLab? Follow these steps to set up your workspace, plan and commit changes, and deploy your project."
msgstr ""
@@ -27558,6 +27952,9 @@ msgstr ""
msgid "Receive any notifications from GitLab."
msgstr ""
+msgid "Receive notification of abuse reports by email."
+msgstr ""
+
msgid "Receive notifications about your own activity"
msgstr ""
@@ -27701,9 +28098,6 @@ msgstr ""
msgid "Registry setup"
msgstr ""
-msgid "Regulate approvals by authors/committers. Affects all projects."
-msgstr ""
-
msgid "Reindexing Status: %{status} (Slice multiplier: %{multiplier}, Maximum running slices: %{max_slices})"
msgstr ""
@@ -27799,6 +28193,9 @@ msgstr ""
msgid "Release|Something went wrong while saving the release details."
msgstr ""
+msgid "Reload page"
+msgstr ""
+
msgid "Remediations"
msgstr ""
@@ -28081,6 +28478,9 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
+msgid "Repeats"
+msgstr ""
+
msgid "Replace"
msgstr ""
@@ -28443,10 +28843,7 @@ msgstr ""
msgid "Require additional authentication for administrative tasks."
msgstr ""
-msgid "Require all users in this group to setup Two-factor authentication"
-msgstr ""
-
-msgid "Require all users in this group to setup two-factor authentication"
+msgid "Require all users in this group to set up two-factor authentication"
msgstr ""
msgid "Required approvals (%{approvals_given} given)"
@@ -28492,6 +28889,9 @@ msgstr[1] ""
msgid "Requires values to meet regular expression requirements."
msgstr ""
+msgid "Requires you to deploy or set up cloud-hosted Sentry."
+msgstr ""
+
msgid "Requires your primary GitLab email address."
msgstr ""
@@ -28552,9 +28952,6 @@ msgstr ""
msgid "Resolve"
msgstr ""
-msgid "Resolve all threads in new issue"
-msgstr ""
-
msgid "Resolve conflicts"
msgstr ""
@@ -28612,6 +29009,9 @@ msgstr ""
msgid "Response text"
msgstr ""
+msgid "Restart GitLab to apply changes."
+msgstr ""
+
msgid "Restart Terminal"
msgstr ""
@@ -28630,6 +29030,9 @@ msgstr ""
msgid "Restoring the project will prevent the project from being removed on this date and restore people's ability to make changes to it."
msgstr ""
+msgid "Restrict group access by IP address. %{link_start}Learn more%{link_end}."
+msgstr ""
+
msgid "Restrict membership by email domain"
msgstr ""
@@ -28943,6 +29346,9 @@ msgstr ""
msgid "Runners|Runner #%{runner_id}"
msgstr ""
+msgid "Runners|Runner assigned to project."
+msgstr ""
+
msgid "Runners|Runner is offline, last contact was %{runner_contact} ago"
msgstr ""
@@ -28955,6 +29361,9 @@ msgstr ""
msgid "Runners|Runner registration"
msgstr ""
+msgid "Runners|Runner unassigned from project."
+msgstr ""
+
msgid "Runners|Runners"
msgstr ""
@@ -29147,7 +29556,7 @@ msgstr ""
msgid "SastEntryPoints|How do I set up SAST?"
msgstr ""
-msgid "SastEntryPoints|Learn more."
+msgid "SastEntryPoints|Learn more"
msgstr ""
msgid "Satisfied"
@@ -29189,7 +29598,7 @@ msgstr ""
msgid "Save pipeline schedule"
msgstr ""
-msgid "Save space and find images in the container Registry. remove unneeded tags and keep only the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
+msgid "Save storage space by automatically deleting tags from the container registry and keeping the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
msgstr ""
msgid "Saving"
@@ -29363,6 +29772,9 @@ msgstr ""
msgid "Search or filter results…"
msgstr ""
+msgid "Search or jump to..."
+msgstr ""
+
msgid "Search project"
msgstr ""
@@ -29423,16 +29835,16 @@ msgstr ""
msgid "SearchCodeResults|of %{link_to_project}"
msgstr ""
-msgid "SearchResults|Showing %{count} %{scope} for%{term_element}"
+msgid "SearchResults|Showing %{count} %{scope} for %{term_element}"
msgstr ""
-msgid "SearchResults|Showing %{count} %{scope} for%{term_element} in your personal and project snippets"
+msgid "SearchResults|Showing %{count} %{scope} for %{term_element} in your personal and project snippets"
msgstr ""
-msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for%{term_element}"
+msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for %{term_element}"
msgstr ""
-msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for%{term_element} in your personal and project snippets"
+msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for %{term_element} in your personal and project snippets"
msgstr ""
msgid "SearchResults|code result"
@@ -29514,6 +29926,9 @@ msgstr ""
msgid "Secret Detection"
msgstr ""
+msgid "Secret access key"
+msgstr ""
+
msgid "Secret token"
msgstr ""
@@ -29553,9 +29968,6 @@ msgstr ""
msgid "SecurityApprovals|A merge request approval is required when the license compliance report contains a denied license."
msgstr ""
-msgid "SecurityApprovals|Configurable if security scanners are enabled. %{linkStart}Learn more.%{linkEnd}"
-msgstr ""
-
msgid "SecurityApprovals|Coverage-Check"
msgstr ""
@@ -29568,24 +29980,18 @@ msgstr ""
msgid "SecurityApprovals|Learn more about Vulnerability-Check"
msgstr ""
-msgid "SecurityApprovals|License Scanning must be enabled. %{linkStart}Learn more%{linkEnd}."
-msgstr ""
-
msgid "SecurityApprovals|License-Check"
msgstr ""
msgid "SecurityApprovals|Requires approval for Denied licenses. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}More information%{linkEnd}"
+msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "SecurityApprovals|Requires approval for vulnerabilities. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
-msgid "SecurityApprovals|Test coverage must be enabled. %{linkStart}Learn more%{linkEnd}."
-msgstr ""
-
msgid "SecurityApprovals|Vulnerability-Check"
msgstr ""
@@ -29649,6 +30055,12 @@ msgstr ""
msgid "SecurityConfiguration|Immediately begin risk analysis and remediation with application security features. Start with SAST and Secret Detection, available to all plans. Upgrade to Ultimate to get all features, including:"
msgstr ""
+msgid "SecurityConfiguration|Manage corpus"
+msgstr ""
+
+msgid "SecurityConfiguration|Manage corpus files used as mutation sources in coverage fuzzing."
+msgstr ""
+
msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
msgstr ""
@@ -29703,6 +30115,12 @@ msgstr ""
msgid "SecurityOrchestration|Action"
msgstr ""
+msgid "SecurityOrchestration|Actions"
+msgstr ""
+
+msgid "SecurityOrchestration|Add rule"
+msgstr ""
+
msgid "SecurityOrchestration|All policies"
msgstr ""
@@ -29736,9 +30154,6 @@ msgstr ""
msgid "SecurityOrchestration|Network"
msgstr ""
-msgid "SecurityOrchestration|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
-msgstr ""
-
msgid "SecurityOrchestration|New policy"
msgstr ""
@@ -29754,6 +30169,9 @@ msgstr ""
msgid "SecurityOrchestration|Policy editor"
msgstr ""
+msgid "SecurityOrchestration|Policy preview"
+msgstr ""
+
msgid "SecurityOrchestration|Policy status"
msgstr ""
@@ -29763,6 +30181,9 @@ msgstr ""
msgid "SecurityOrchestration|Rule"
msgstr ""
+msgid "SecurityOrchestration|Rules"
+msgstr ""
+
msgid "SecurityOrchestration|Scan Execution"
msgstr ""
@@ -29856,6 +30277,9 @@ msgstr ""
msgid "SecurityReports|Create issue"
msgstr ""
+msgid "SecurityReports|Development vulnerabilities"
+msgstr ""
+
msgid "SecurityReports|Dismiss vulnerability"
msgstr ""
@@ -29871,6 +30295,9 @@ msgstr ""
msgid "SecurityReports|Download results"
msgstr ""
+msgid "SecurityReports|Download scanned URLs"
+msgstr ""
+
msgid "SecurityReports|Download scanned resources"
msgstr ""
@@ -29994,6 +30421,9 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
+msgid "SecurityReports|The Vulnerability Report shows the results of the lastest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "SecurityReports|The security reports below contain one or more vulnerability findings that could not be parsed and were not recorded. Download the artifacts in the job output to investigate. Ensure any security report created conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
msgstr ""
@@ -30135,10 +30565,10 @@ msgstr ""
msgid "Select a repository"
msgstr ""
-msgid "Select a role"
+msgid "Select a repository containing templates for common files."
msgstr ""
-msgid "Select a shared template repository for all projects on this instance."
+msgid "Select a role"
msgstr ""
msgid "Select a template repository"
@@ -30216,6 +30646,9 @@ msgstr ""
msgid "Select project to choose zone"
msgstr ""
+msgid "Select project to create issue"
+msgstr ""
+
msgid "Select projects"
msgstr ""
@@ -30333,6 +30766,9 @@ msgstr ""
msgid "Send emails to help guide new users through the onboarding process."
msgstr ""
+msgid "Send emails to users upon account deactivation."
+msgstr ""
+
msgid "Send message"
msgstr ""
@@ -30351,6 +30787,9 @@ msgstr ""
msgid "Send service data"
msgstr ""
+msgid "Sentry"
+msgstr ""
+
msgid "Sentry API URL"
msgstr ""
@@ -30465,6 +30904,9 @@ msgstr ""
msgid "Service"
msgstr ""
+msgid "Service Accounts keys are required to authorize GitLab to deploy your Google Cloud project."
+msgstr ""
+
msgid "Service Desk"
msgstr ""
@@ -30537,15 +30979,15 @@ msgstr ""
msgid "Set a password on your account to pull or push via %{protocol}."
msgstr ""
-msgid "Set a template repository for projects in this group"
-msgstr ""
-
msgid "Set access permissions for this token."
msgstr ""
msgid "Set an instance-wide domain that will be available to all clusters when installing Knative."
msgstr ""
+msgid "Set any rate limit to %{code_open}0%{code_close} to disable the limit."
+msgstr ""
+
msgid "Set default and restrict visibility levels. Configure import sources and git access protocol."
msgstr ""
@@ -30558,7 +31000,7 @@ msgstr ""
msgid "Set limit to 0 to allow any file size."
msgstr ""
-msgid "Set max session time for web terminal."
+msgid "Set limits for web and API requests."
msgstr ""
msgid "Set milestone"
@@ -30567,15 +31009,18 @@ msgstr ""
msgid "Set new password"
msgstr ""
-msgid "Set notification email for abuse reports."
+msgid "Set parent epic to an epic"
msgstr ""
-msgid "Set parent epic to an epic"
+msgid "Set per-user rate limits for imports and exports of projects and groups."
msgstr ""
msgid "Set projects and maximum size limits, session duration, user options, and check feature availability for namespace plan."
msgstr ""
+msgid "Set rate limits for package registry API requests that supersede the general user and IP rate limits."
+msgstr ""
+
msgid "Set severity"
msgstr ""
@@ -30594,15 +31039,24 @@ msgstr ""
msgid "Set the default branch for this project. All merge requests and commits are made against this branch unless you specify a different one."
msgstr ""
+msgid "Set the default expiration time for job artifacts in all projects. Set to %{code_open}0%{code_close} to never expire artifacts by default. If no unit is written, it defaults to seconds. For example, these are all equivalent: %{code_open}3600%{code_close}, %{code_open}60 minutes%{code_close}, or %{code_open}one hour%{code_close}."
+msgstr ""
+
msgid "Set the due date to %{due_date}."
msgstr ""
msgid "Set the iteration to %{iteration_reference}."
msgstr ""
+msgid "Set the maximum session time for a web terminal."
+msgstr ""
+
msgid "Set the milestone to %{milestone_reference}."
msgstr ""
+msgid "Set the per-user rate limit for notes created by web or API requests."
+msgstr ""
+
msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
msgstr ""
@@ -30804,6 +31258,9 @@ msgstr ""
msgid "Show Pipeline IID"
msgstr ""
+msgid "Show all %{issuable_type}."
+msgstr ""
+
msgid "Show all activity"
msgstr ""
@@ -30855,15 +31312,9 @@ msgstr ""
msgid "Show list"
msgstr ""
-msgid "Show me advanced features"
-msgstr ""
-
msgid "Show me how to add a pipeline"
msgstr ""
-msgid "Show me the basics"
-msgstr ""
-
msgid "Show one file at a time"
msgstr ""
@@ -30904,15 +31355,15 @@ msgstr ""
msgid "Showing %{pageSize} of %{total} %{issuableType}"
msgstr ""
-msgid "Showing %{pageSize} of %{total} issues"
-msgstr ""
-
msgid "Showing all epics"
msgstr ""
msgid "Showing all issues"
msgstr ""
+msgid "Showing data for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
+msgstr ""
+
msgid "Showing data for workflow items created in this date range. Date range cannot exceed %{maxDateRange} days."
msgstr ""
@@ -30952,6 +31403,15 @@ msgstr ""
msgid "Sidebar|Weight"
msgstr ""
+msgid "Sidekiq job compression threshold (bytes)"
+msgstr ""
+
+msgid "Sidekiq job size limit (bytes)"
+msgstr ""
+
+msgid "Sidekiq job size limits"
+msgstr ""
+
msgid "Sign in"
msgstr ""
@@ -31072,6 +31532,9 @@ msgstr ""
msgid "Site profile not found for given parameters"
msgstr ""
+msgid "Sites"
+msgstr ""
+
msgid "Size"
msgstr ""
@@ -31102,19 +31565,22 @@ msgstr ""
msgid "SlackIntegration|Sends notifications about project events to Slack channels."
msgstr ""
-msgid "SlackService|2. Paste the %{strong_open}Token%{strong_close} into the field below"
+msgid "SlackService|1. %{slash_command_link_start}Add a slash command%{slash_command_link_end} in your Slack team using this information:"
msgstr ""
-msgid "SlackService|3. Select the %{strong_open}Active%{strong_close} checkbox, press %{strong_open}Save changes%{strong_close} and start using GitLab inside Slack!"
+msgid "SlackService|2. Paste the token from Slack in the %{strong_open}Token%{strong_close} field below."
msgstr ""
-msgid "SlackService|Fill in the word that works best for your team."
+msgid "SlackService|3. Select the %{strong_open}Active%{strong_close} checkbox, select %{strong_open}Save changes%{strong_close}, and start using slash commands in Slack!"
+msgstr ""
+
+msgid "SlackService|After setup, get a list of available Slack slash commands by entering"
msgstr ""
-msgid "SlackService|See list of available commands in Slack after setting up this service, by entering"
+msgid "SlackService|Fill in the word that works best for your team."
msgstr ""
-msgid "SlackService|This service allows users to perform common operations on this project by entering slash commands in Slack."
+msgid "SlackService|Perform common operations in this project by entering slash commands in Slack."
msgstr ""
msgid "Slice multiplier"
@@ -31180,7 +31646,7 @@ msgstr ""
msgid "Some child epics may be hidden due to applied filters"
msgstr ""
-msgid "Some common domains are not allowed. %{read_more_link}."
+msgid "Some common domains are not allowed. %{learn_more_link}."
msgstr ""
msgid "Some of the designs you tried uploading did not change:"
@@ -31264,9 +31730,6 @@ msgstr ""
msgid "Something went wrong while exporting requirements"
msgstr ""
-msgid "Something went wrong while fetching %{listType} list"
-msgstr ""
-
msgid "Something went wrong while fetching branches"
msgstr ""
@@ -31321,15 +31784,9 @@ msgstr ""
msgid "Something went wrong while merging this merge request. Please try again."
msgstr ""
-msgid "Something went wrong while moving issues."
-msgstr ""
-
msgid "Something went wrong while obtaining the Let's Encrypt certificate."
msgstr ""
-msgid "Something went wrong while performing the action."
-msgstr ""
-
msgid "Something went wrong while promoting the issue to an epic. Please try again."
msgstr ""
@@ -31657,7 +32114,10 @@ msgstr ""
msgid "SourcegraphPreferences|Uses a custom %{linkStart}Sourcegraph instance%{linkEnd}."
msgstr ""
-msgid "Spam Check API Key"
+msgid "Spam Check"
+msgstr ""
+
+msgid "Spam Check API key"
msgstr ""
msgid "Spam Logs"
@@ -31675,7 +32135,7 @@ msgstr ""
msgid "Specified URL cannot be used: \"%{reason}\""
msgstr ""
-msgid "Specify an e-mail address regex pattern to identify default internal users."
+msgid "Specify an email address regex pattern to identify default internal users."
msgstr ""
msgid "Speed up your pipelines with Needs relationships"
@@ -31930,7 +32390,7 @@ msgstr ""
msgid "StatusCheck|An error occurred fetching the status checks."
msgstr ""
-msgid "StatusCheck|Apply this status check to any branch or a specific protected branch."
+msgid "StatusCheck|Apply this status check to all branches or a specific protected branch."
msgstr ""
msgid "StatusCheck|Check for a status response in Merge Requests. Failures do not block merges. %{link_start}Learn more%{link_end}."
@@ -32269,6 +32729,9 @@ msgstr ""
msgid "Subscriptions"
msgstr ""
+msgid "Subscription|Your subscription for %{strong}%{namespace_name}%{strong_close} has expired and you are now on %{pricing_link_start}the GitLab Free tier%{pricing_link_end}. Don't worry, your data is safe. Get in touch with our support team (%{support_email}). They'll gladly help with your subscription renewal."
+msgstr ""
+
msgid "Subtracted"
msgstr ""
@@ -32497,6 +32960,9 @@ msgstr ""
msgid "SuperSonics|Plan"
msgstr ""
+msgid "SuperSonics|Please agree to the Subscription Agreement"
+msgstr ""
+
msgid "SuperSonics|Ready to get started? A GitLab plan is ideal for scaling organizations and for multi team usage."
msgstr ""
@@ -32527,6 +32993,9 @@ msgstr ""
msgid "SuperSonics|The activation code is not valid. Please make sure to copy it exactly from the Customers Portal or confirmation email. Learn more about %{linkStart}activating your subscription%{linkEnd}."
msgstr ""
+msgid "SuperSonics|The activation code should be a 24-character alphanumeric string"
+msgstr ""
+
msgid "SuperSonics|There is a connectivity issue."
msgstr ""
@@ -32569,9 +33038,15 @@ msgstr ""
msgid "SuperSonics|You do not have an active subscription"
msgstr ""
+msgid "SuperSonics|You have successfully added a license that activates on %{date}. Please see the subscription history table below for more details."
+msgstr ""
+
msgid "SuperSonics|You'll be charged for %{trueUpLinkStart}users over license%{trueUpLinkEnd} on a quarterly or annual basis, depending on the terms of your agreement."
msgstr ""
+msgid "SuperSonics|Your future dated license was successfully added"
+msgstr ""
+
msgid "SuperSonics|Your subscription"
msgstr ""
@@ -32824,7 +33299,7 @@ msgstr ""
msgid "Template to append to all Service Desk issues"
msgstr ""
-msgid "TemplateRepository|Select a repository to make its templates available to all projects. %{link_start}What should the repository contain?%{link_end} "
+msgid "TemplateRepository|Create common files more quickly, and standardize their format."
msgstr ""
msgid "Templates"
@@ -33030,7 +33505,7 @@ msgstr ""
msgid "TestCases|Search test cases"
msgstr ""
-msgid "TestCases|Something went wrong while adding test case to Todo."
+msgid "TestCases|Something went wrong while adding test case to a to-do item."
msgstr ""
msgid "TestCases|Something went wrong while creating a test case."
@@ -33042,7 +33517,7 @@ msgstr ""
msgid "TestCases|Something went wrong while fetching test cases list."
msgstr ""
-msgid "TestCases|Something went wrong while marking test case todo as done."
+msgid "TestCases|Something went wrong while marking test case to-do item as done."
msgstr ""
msgid "TestCases|Something went wrong while moving test case."
@@ -33162,7 +33637,7 @@ msgstr ""
msgid "Thanks for your purchase!"
msgstr ""
-msgid "That is ok, I do not want to renew"
+msgid "That's OK, I don't want to renew"
msgstr ""
msgid "That's it, well done!"
@@ -33185,7 +33660,7 @@ msgid_plural "The %{type} contains the following errors:"
msgstr[0] ""
msgstr[1] ""
-msgid "The API key used by GitLab for accessing the Spam Check service endpoint"
+msgid "The API key used by GitLab for accessing the Spam Check service endpoint."
msgstr ""
msgid "The GitLab subscription service (customers.gitlab.com) is currently experiencing an outage. You can monitor the status and get updates at %{linkStart}status.gitlab.com%{linkEnd}."
@@ -33224,9 +33699,6 @@ msgstr ""
msgid "The URL to use for connecting to Elasticsearch. Use a comma-separated list to support clustering (e.g., \"http://localhost:9200, http://localhost:9201\")."
msgstr ""
-msgid "The Vulnerability Report shows the results of the last successful pipeline run on the default branch."
-msgstr ""
-
msgid "The X509 Certificate to use when mutual TLS is required to communicate with the external authorization service. If left blank, the server certificate is still validated when accessing over HTTPS."
msgstr ""
@@ -33284,9 +33756,6 @@ msgstr ""
msgid "The default branch for this project has been changed. Please update your bookmarks."
msgstr ""
-msgid "The default expiration time for job artifacts. 0 for unlimited. The default unit is in seconds, but you can use other units, for example %{code_open}4 mins 2 sec%{code_close}, %{code_open}2h42min%{code_close}."
-msgstr ""
-
msgid "The dependency list details information about the components used within your project."
msgstr ""
@@ -33478,9 +33947,6 @@ msgstr ""
msgid "The merge conflicts for this merge request have already been resolved. Please return to the merge request."
msgstr ""
-msgid "The merge request can now be merged."
-msgstr ""
-
msgid "The metric must be one of %{metrics}."
msgstr ""
@@ -33856,7 +34322,7 @@ msgstr ""
msgid "There was a problem updating the keep latest artifacts setting."
msgstr ""
-msgid "There was an error %{message} todo."
+msgid "There was an error %{message} to-do item."
msgstr ""
msgid "There was an error adding a To Do."
@@ -33895,6 +34361,9 @@ msgstr ""
msgid "There was an error fetching projects"
msgstr ""
+msgid "There was an error fetching search autocomplete suggestions"
+msgstr ""
+
msgid "There was an error fetching stage total counts"
msgstr ""
@@ -34219,6 +34688,9 @@ msgstr ""
msgid "This field is required."
msgstr ""
+msgid "This form is disabled in preview"
+msgstr ""
+
msgid "This group"
msgstr ""
@@ -34240,9 +34712,6 @@ msgstr ""
msgid "This group is linked to a subscription"
msgstr ""
-msgid "This group, including all subgroups, projects and git repositories, will be reachable from only the specified IP address ranges."
-msgstr ""
-
msgid "This group, its subgroups and projects has been scheduled for removal on %{date}."
msgstr ""
@@ -34522,9 +34991,6 @@ msgstr ""
msgid "This user cannot be unlocked manually from GitLab"
msgstr ""
-msgid "This user does not have a pending request"
-msgstr ""
-
msgid "This user has an unconfirmed email address (%{email}). You may force a confirmation."
msgstr ""
@@ -34633,9 +35099,6 @@ msgstr ""
msgid "ThreatMonitoring|Packet Activity"
msgstr ""
-msgid "ThreatMonitoring|Policies"
-msgstr ""
-
msgid "ThreatMonitoring|Requests"
msgstr ""
@@ -34687,6 +35150,12 @@ msgstr ""
msgid "ThreatMonitoring|View documentation"
msgstr ""
+msgid "Threshold in bytes at which to compress Sidekiq job arguments."
+msgstr ""
+
+msgid "Threshold in bytes at which to reject Sidekiq jobs. Set this to 0 to if you don't want to limit Sidekiq jobs."
+msgstr ""
+
msgid "Throughput"
msgstr ""
@@ -34696,6 +35165,9 @@ msgstr ""
msgid "Time"
msgstr ""
+msgid "Time (in hours) that users are allowed to skip forced configuration of two-factor authentication."
+msgstr ""
+
msgid "Time Spent"
msgstr ""
@@ -34762,7 +35234,7 @@ msgstr ""
msgid "TimeTrackingEstimated|Est"
msgstr ""
-msgid "TimeTracking|%{startTag}Spent: %{endTag}%{timeSpentHumanReadable}"
+msgid "TimeTracking|%{spentStart}Spent: %{spentEnd}"
msgstr ""
msgid "TimeTracking|Estimated:"
@@ -34976,6 +35448,9 @@ msgstr ""
msgid "To access this domain create a new DNS record"
msgstr ""
+msgid "To add a custom suffix, set up a Service Desk email address. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "To add an SSH key you need to %{generate_link_start}generate one%{link_end} or use an %{existing_link_start}existing key%{link_end}."
msgstr ""
@@ -34997,13 +35472,16 @@ msgstr ""
msgid "To connect an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To continue using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
+msgstr ""
+
msgid "To continue, you need to select the link in the confirmation email we sent to verify your email address. If you didn't get our email, select %{strongStart}Resend confirmation email.%{strongEnd}"
msgstr ""
msgid "To define internal users, first enable new users set to external"
msgstr ""
-msgid "To enable Registration Features, make sure \"Enable service ping\" is checked."
+msgid "To enable Registration Features, first enable Service Ping."
msgstr ""
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
@@ -35030,7 +35508,7 @@ msgstr ""
msgid "To get started, use the link below to confirm your account."
msgstr ""
-msgid "To help improve GitLab and its user experience, GitLab will periodically collect usage information."
+msgid "To help improve GitLab and its user experience, GitLab periodically collects usage information."
msgstr ""
msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
@@ -35063,7 +35541,7 @@ msgstr ""
msgid "To preserve performance only %{strong_open}%{display_size} of %{real_size}%{strong_close} files are displayed."
msgstr ""
-msgid "To protect this issue's confidentiality, %{forkLink} and set the fork's visibility to private."
+msgid "To protect this issue's confidentiality, %{linkStart}fork this project%{linkEnd} and set the fork's visibility to private."
msgstr ""
msgid "To protect this issue's confidentiality, a private fork of this project was selected."
@@ -35096,12 +35574,15 @@ msgstr ""
msgid "To set up SAML authentication for your group through an identity provider like Azure, Okta, Onelogin, Ping Identity, or your custom SAML 2.0 provider:"
msgstr ""
-msgid "To set up this service:"
+msgid "To set up this integration:"
msgstr ""
msgid "To specify the notification level per project of a group you belong to, you need to visit project page and change notification level there."
msgstr ""
+msgid "To start using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
+msgstr ""
+
msgid "To unsubscribe from this issue, please paste the following link into your browser:"
msgstr ""
@@ -35689,9 +36170,6 @@ msgstr ""
msgid "Unable to fetch branches list, please close the form and try again"
msgstr ""
-msgid "Unable to fetch unscanned projects"
-msgstr ""
-
msgid "Unable to fetch vulnerable projects"
msgstr ""
@@ -35746,6 +36224,15 @@ msgstr ""
msgid "Unable to update this issue at this time."
msgstr ""
+msgid "Unapprove a merge request"
+msgstr ""
+
+msgid "Unapprove the current merge request."
+msgstr ""
+
+msgid "Unapproved the current merge request."
+msgstr ""
+
msgid "Unarchive project"
msgstr ""
@@ -35758,16 +36245,13 @@ msgstr ""
msgid "Unassigned"
msgstr ""
-msgid "Unauthenticated API request rate limit"
-msgstr ""
-
-msgid "Unauthenticated rate limit period in seconds"
+msgid "Unauthenticated API rate limit period in seconds"
msgstr ""
-msgid "Unauthenticated request rate limit"
+msgid "Unauthenticated requests"
msgstr ""
-msgid "Unauthenticated requests"
+msgid "Unauthenticated web rate limit period in seconds"
msgstr ""
msgid "Undo"
@@ -35869,18 +36353,6 @@ msgstr ""
msgid "Unresolved"
msgstr ""
-msgid "UnscannedProjects|15 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|30 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|5 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|60 or more days"
-msgstr ""
-
msgid "Unschedule job"
msgstr ""
@@ -36100,6 +36572,9 @@ msgstr ""
msgid "UsageQuota|%{help_link_start}Shared runners%{help_link_end} are disabled, so there are no limits set on pipeline usage"
msgstr ""
+msgid "UsageQuota|%{linkTitle} help link"
+msgstr ""
+
msgid "UsageQuota|%{percentageLeft} of purchased storage is available"
msgstr ""
@@ -36109,6 +36584,9 @@ msgstr ""
msgid "UsageQuota|Artifacts is a sum of build and pipeline artifacts."
msgstr ""
+msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
+msgstr ""
+
msgid "UsageQuota|Buy additional minutes"
msgstr ""
@@ -36118,9 +36596,21 @@ msgstr ""
msgid "UsageQuota|CI minutes usage by project"
msgstr ""
+msgid "UsageQuota|Code packages and container images."
+msgstr ""
+
msgid "UsageQuota|Current period usage"
msgstr ""
+msgid "UsageQuota|File attachments and smaller design graphics."
+msgstr ""
+
+msgid "UsageQuota|Git repository, managed by the Gitaly service."
+msgstr ""
+
+msgid "UsageQuota|Includes project registry, artifacts, packages, wiki, uploads and other items."
+msgstr ""
+
msgid "UsageQuota|Increase storage temporarily"
msgstr ""
@@ -36139,6 +36629,9 @@ msgstr ""
msgid "UsageQuota|Packages"
msgstr ""
+msgid "UsageQuota|Pipeline artifacts and job artifacts, created with CI/CD."
+msgstr ""
+
msgid "UsageQuota|Pipelines"
msgstr ""
@@ -36157,6 +36650,9 @@ msgstr ""
msgid "UsageQuota|Seats"
msgstr ""
+msgid "UsageQuota|Shared bits of code and text."
+msgstr ""
+
msgid "UsageQuota|Snippets"
msgstr ""
@@ -36166,6 +36662,12 @@ msgstr ""
msgid "UsageQuota|Storage"
msgstr ""
+msgid "UsageQuota|Storage type"
+msgstr ""
+
+msgid "UsageQuota|There is a known issue with Artifact storage where the total could be incorrect for some projects. More details and progress are available in %{warningLinkStart}the epic%{warningLinkEnd}."
+msgstr ""
+
msgid "UsageQuota|This is the total amount of storage used across your projects within this namespace."
msgstr ""
@@ -36205,6 +36707,9 @@ msgstr ""
msgid "UsageQuota|Usage"
msgstr ""
+msgid "UsageQuota|Usage Breakdown"
+msgstr ""
+
msgid "UsageQuota|Usage Quotas"
msgstr ""
@@ -36229,6 +36734,9 @@ msgstr ""
msgid "UsageQuota|Wiki"
msgstr ""
+msgid "UsageQuota|Wiki content."
+msgstr ""
+
msgid "UsageQuota|Wikis"
msgstr ""
@@ -36445,7 +36953,10 @@ msgstr ""
msgid "User Settings"
msgstr ""
-msgid "User and IP Rate Limits"
+msgid "User and IP rate limits"
+msgstr ""
+
+msgid "User does not have a pending request"
msgstr ""
msgid "User identity was successfully created."
@@ -36742,6 +37253,9 @@ msgstr ""
msgid "Users can launch a development environment from a GitLab browser tab when the %{linkStart}Gitpod%{linkEnd} integration is enabled."
msgstr ""
+msgid "Users can reactivate their account by signing in."
+msgstr ""
+
msgid "Users can render diagrams in AsciiDoc, Markdown, reStructuredText, and Textile documents using Kroki."
msgstr ""
@@ -36757,6 +37271,9 @@ msgstr ""
msgid "Users requesting access to"
msgstr ""
+msgid "Users to exclude from the rate limit"
+msgstr ""
+
msgid "Users were successfully added."
msgstr ""
@@ -36778,6 +37295,9 @@ msgstr ""
msgid "UsersSelect|Unassigned"
msgstr ""
+msgid "Uses GitLab as a lightweight alternative to Sentry."
+msgstr ""
+
msgid "Using %{code_start}::%{code_end} denotes a %{link_start}scoped label set%{link_end}"
msgstr ""
@@ -36808,10 +37328,7 @@ msgstr ""
msgid "Value Stream Analytics can help you determine your team’s velocity"
msgstr ""
-msgid "Value Stream Analytics gives an overview of how much time it takes to go from idea to production in your project."
-msgstr ""
-
-msgid "Value may contain a variable reference"
+msgid "Value might contain a variable reference"
msgstr ""
msgid "Value stream"
@@ -36877,10 +37394,10 @@ msgstr ""
msgid "ValueStream|The Default Value Stream cannot be deleted"
msgstr ""
-msgid "Variable"
+msgid "Values that contain the %{codeStart}$%{codeEnd} character can be considered a variable reference and expanded. %{docsLinkStart}Learn more.%{docsLinkEnd}"
msgstr ""
-msgid "Variable references indicated by %{codeStart}$%{codeEnd} may be expanded. If this is not what you want, consider %{docsLinkStart}using a workaround to prevent expansion%{docsLinkEnd}."
+msgid "Variable"
msgstr ""
msgid "Variable will be masked in job logs."
@@ -37285,6 +37802,9 @@ msgstr ""
msgid "Vulnerability|Evidence"
msgstr ""
+msgid "Vulnerability|False positive detected"
+msgstr ""
+
msgid "Vulnerability|File"
msgstr ""
@@ -37327,6 +37847,9 @@ msgstr ""
msgid "Vulnerability|Status"
msgstr ""
+msgid "Vulnerability|The scanner determined this vulnerability to be a false positive. Verify the evaluation before changing its status. %{linkStart}Learn more about false positive detection.%{linkEnd}"
+msgstr ""
+
msgid "Vulnerability|The unmodified response is the original response that had no mutations done to the request"
msgstr ""
@@ -37651,9 +38174,6 @@ msgstr ""
msgid "Welcome to GitLab,%{br_tag}%{name}!"
msgstr ""
-msgid "Welcome to the guided GitLab tour"
-msgstr ""
-
msgid "Welcome, %{name}!"
msgstr ""
@@ -37672,9 +38192,6 @@ msgstr ""
msgid "What are you searching for?"
msgstr ""
-msgid "What describes you best?"
-msgstr ""
-
msgid "What does this command do?"
msgstr ""
@@ -37696,13 +38213,13 @@ msgstr ""
msgid "What is your job title? (optional)"
msgstr ""
-msgid "What will you use this group for?"
+msgid "What templates can I create?"
msgstr ""
-msgid "What's new"
+msgid "What will you use this group for?"
msgstr ""
-msgid "What’s your experience level?"
+msgid "What's new"
msgstr ""
msgid "When a deployment job is successful, skip older deployment jobs that are still pending."
@@ -37714,6 +38231,9 @@ msgstr ""
msgid "When an event in GitLab triggers a webhook, you can use the request details to figure out if something went wrong."
msgstr ""
+msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+msgstr ""
+
msgid "When inactive, an external authentication provider must be used."
msgstr ""
@@ -37737,6 +38257,9 @@ msgstr ""
msgid "When:"
msgstr ""
+msgid "Which API requests are affected?"
+msgstr ""
+
msgid "While it's rare to have no vulnerabilities, it can happen. In any event, we ask that you please double check your settings to make sure you've set up your dashboard correctly."
msgstr ""
@@ -38016,6 +38539,9 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|Work Items"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -38091,6 +38617,9 @@ msgstr ""
msgid "You are already a member of this %{member_source}."
msgstr ""
+msgid "You are already impersonating another user"
+msgstr ""
+
msgid "You are an admin, which means granting access to %{client_name} will allow them to interact with GitLab as an admin as well. Proceed with caution."
msgstr ""
@@ -38193,6 +38722,9 @@ msgstr ""
msgid "You can also use project access tokens with Git to authenticate over HTTP(S). %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "You can always change your URL later"
+msgstr ""
+
msgid "You can always edit this later"
msgstr ""
@@ -38349,10 +38881,10 @@ msgstr ""
msgid "You can’t %{tag_start}edit%{tag_end} files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
-msgid "You could not create a new trigger."
+msgid "You can’t edit files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
-msgid "You didn't renew your subscription for %{strong}%{namespace_name}%{strong_close} so it was downgraded to the free plan."
+msgid "You could not create a new trigger."
msgstr ""
msgid "You do not have any subscriptions yet"
@@ -38520,6 +39052,12 @@ msgstr ""
msgid "You must provide your current password in order to change it."
msgstr ""
+msgid "You must sign in to search for specific projects."
+msgstr ""
+
+msgid "You must sign in to search for specific terms."
+msgstr ""
+
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
@@ -38547,6 +39085,9 @@ msgstr ""
msgid "You need to upload a GitLab project export archive (ending in .gz)."
msgstr ""
+msgid "You need to verify your primary email first before enabling Two-Factor Authentication."
+msgstr ""
+
msgid "You successfully declined the invitation"
msgstr ""
@@ -38655,10 +39196,10 @@ msgstr ""
msgid "Your %{host} account was signed in to from a new location"
msgstr ""
-msgid "Your %{strong}%{plan_name}%{strong_close} subscription for %{strong}%{namespace_name}%{strong_close} will expire on %{strong}%{expires_on}%{strong_close}."
+msgid "Your %{strong}%{plan_name}%{strong_close} subscription expires on %{strong}%{expires_on}%{strong_close}. After that date, you cannot create issues or merge requests, or use many other features."
msgstr ""
-msgid "Your %{strong}%{plan_name}%{strong_close} subscription will expire on %{strong}%{expires_on}%{strong_close}. After that, you will not be able to create issues or merge requests as well as many other features."
+msgid "Your %{strong}%{plan_name}%{strong_close} subscription for %{strong}%{namespace_name}%{strong_close} will expire on %{strong}%{expires_on}%{strong_close}."
msgstr ""
msgid "Your CI/CD configuration syntax is invalid. View Lint tab for more details."
@@ -38682,7 +39223,7 @@ msgstr ""
msgid "Your GPG keys (%{count})"
msgstr ""
-msgid "Your GitLab account has been locked due to an excessive amount of unsuccessful sign in attempts. Your account will automatically unlock in %{duration} or you may click the link below to unlock now."
+msgid "Your GitLab account has been locked due to an excessive number of unsuccessful sign in attempts. You can wait for your account to automatically unlock in %{duration} or you can click the link below to unlock now."
msgstr ""
msgid "Your GitLab account request has been approved!"
@@ -38793,6 +39334,9 @@ msgstr ""
msgid "Your commit email is used for web based operations, such as edits and merges."
msgstr ""
+msgid "Your current password is required to register a two-factor authenticator app."
+msgstr ""
+
msgid "Your dashboard has been copied. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
@@ -38892,6 +39436,9 @@ msgstr ""
msgid "Your project limit is %{limit} projects! Please contact your administrator to increase it"
msgstr ""
+msgid "Your project will be created at:"
+msgstr ""
+
msgid "Your projects"
msgstr ""
@@ -38931,11 +39478,10 @@ msgstr ""
msgid "Your subscription expired!"
msgstr ""
-msgid "Your subscription has been downgraded."
-msgstr ""
-
-msgid "Your subscription will expire in %{remaining_days}."
-msgstr ""
+msgid "Your subscription will expire in %{remaining_days} day."
+msgid_plural "Your subscription will expire in %{remaining_days} days."
+msgstr[0] ""
+msgstr[1] ""
msgid "Your username is %{username}."
msgstr ""
@@ -39142,6 +39688,9 @@ msgstr ""
msgid "cannot merge"
msgstr ""
+msgid "cannot not be used for user namespace"
+msgstr ""
+
msgid "ciReport|%{degradedNum} degraded"
msgstr ""
@@ -39465,6 +40014,9 @@ msgstr ""
msgid "created %{timeAgo}"
msgstr ""
+msgid "created %{timeAgo} by %{author}"
+msgstr ""
+
msgid "created by"
msgstr ""
@@ -39509,9 +40061,6 @@ msgstr ""
msgid "does not have a supported extension. Only %{extension_list} are supported"
msgstr ""
-msgid "domain is not authorized for sign-up."
-msgstr ""
-
msgid "download it"
msgstr ""
@@ -39529,18 +40078,13 @@ msgstr ""
msgid "email '%{email}' is not a verified email."
msgstr ""
-msgid "email does not match the allowed domain of %{email_domains}"
-msgid_plural "email does not match the allowed domains: %{email_domains}"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "enabled"
msgstr ""
msgid "encrypted: needs to be a :required, :optional or :migrating!"
msgstr ""
-msgid "ending with MIME type format is not allowed."
+msgid "ending with a reserved file extension is not allowed."
msgstr ""
msgid "entries cannot be larger than 255 characters"
@@ -39564,6 +40108,9 @@ msgstr ""
msgid "estimateCommand|%{slash_command} overwrites the total estimated time."
msgstr ""
+msgid "example.com"
+msgstr ""
+
msgid "exceeds the limit of %{bytes} bytes"
msgstr ""
@@ -39614,9 +40161,6 @@ msgstr ""
msgid "fork"
msgstr ""
-msgid "fork this project"
-msgstr ""
-
msgid "from"
msgstr ""
@@ -39625,6 +40169,9 @@ msgid_plural "from %d jobs"
msgstr[0] ""
msgstr[1] ""
+msgid "frontmatter"
+msgstr ""
+
msgid "group"
msgstr ""
@@ -39652,6 +40199,9 @@ msgstr ""
msgid "has been completed."
msgstr ""
+msgid "has too deep level of nesting"
+msgstr ""
+
msgid "help"
msgstr ""
@@ -39685,9 +40235,21 @@ msgstr ""
msgid "in"
msgstr ""
+msgid "in Infrastructure :: Kubernetes clusters"
+msgstr ""
+
+msgid "in all GitLab"
+msgstr ""
+
+msgid "in group"
+msgstr ""
+
msgid "in group %{link_to_group}"
msgstr ""
+msgid "in project"
+msgstr ""
+
msgid "in project %{link_to_project}"
msgstr ""
@@ -39729,16 +40291,19 @@ msgstr ""
msgid "is not a valid X509 certificate."
msgstr ""
-msgid "is not allowed since the group is not top-level group."
+msgid "is not allowed for sign-up."
msgstr ""
-msgid "is not allowed. Try again with a different email address, or contact your GitLab admin."
+msgid "is not allowed for this group."
msgstr ""
-msgid "is not allowed. We do not currently support project-level iterations"
+msgid "is not allowed for this project."
+msgstr ""
+
+msgid "is not allowed since the group is not top-level group."
msgstr ""
-msgid "is not from an allowed domain."
+msgid "is not allowed. We do not currently support project-level iterations"
msgstr ""
msgid "is not in the group enforcing Group Managed Account"
@@ -39831,6 +40396,9 @@ msgstr ""
msgid "log in"
msgstr ""
+msgid "managed"
+msgstr ""
+
msgid "manual"
msgstr ""
@@ -39878,6 +40446,9 @@ msgstr ""
msgid "mrWidget| Please restore it or use a different %{missingBranchName} branch"
msgstr ""
+msgid "mrWidget|%{linkStart}Set up now%{linkEnd} to analyze your source code for known security vulnerabilities."
+msgstr ""
+
msgid "mrWidget|%{mergeError}."
msgstr ""
@@ -39958,6 +40529,9 @@ msgid_plural "mrWidget|Closes issues"
msgstr[0] ""
msgstr[1] ""
+msgid "mrWidget|Create issue to resolve all threads"
+msgstr ""
+
msgid "mrWidget|Delete source branch"
msgstr ""
@@ -39967,12 +40541,18 @@ msgstr ""
msgid "mrWidget|Did not close"
msgstr ""
+msgid "mrWidget|Dismiss"
+msgstr ""
+
msgid "mrWidget|Email patches"
msgstr ""
msgid "mrWidget|Failed to load deployment statistics"
msgstr ""
+msgid "mrWidget|Hide %{widget} details"
+msgstr ""
+
msgid "mrWidget|If the %{missingBranchName} branch exists in your local repository, you can merge this merge request manually using the command line"
msgstr ""
@@ -40068,9 +40648,6 @@ msgstr ""
msgid "mrWidget|Request to merge"
msgstr ""
-msgid "mrWidget|Resolve all threads in new issue"
-msgstr ""
-
msgid "mrWidget|Resolve conflicts"
msgstr ""
@@ -40086,6 +40663,9 @@ msgstr ""
msgid "mrWidget|Revoke approval"
msgstr ""
+msgid "mrWidget|SAST and Secret Detection is not enabled."
+msgstr ""
+
msgid "mrWidget|Set by %{merge_author} to be added to the merge train when the pipeline succeeds"
msgstr ""
@@ -40095,6 +40675,9 @@ msgstr ""
msgid "mrWidget|Set by %{merge_author} to start a merge train when the pipeline succeeds"
msgstr ""
+msgid "mrWidget|Show %{widget} details"
+msgstr ""
+
msgid "mrWidget|The changes were merged into"
msgstr ""
@@ -40107,6 +40690,9 @@ msgstr ""
msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure, or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
msgstr ""
+msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure."
+msgstr ""
+
msgid "mrWidget|The source branch has been deleted"
msgstr ""
@@ -40149,6 +40735,9 @@ msgstr ""
msgid "mrWidget|You can merge after removing denied licenses"
msgstr ""
+msgid "mrWidget|You can only merge once this merge request is approved."
+msgstr ""
+
msgid "mrWidget|Your password"
msgstr ""
@@ -40185,6 +40774,9 @@ msgstr ""
msgid "must be less than the limit of %{tag_limit} tags"
msgstr ""
+msgid "must be set for a project namespace"
+msgstr ""
+
msgid "must be unique by status and elapsed time within a policy"
msgstr ""
@@ -40294,6 +40886,9 @@ msgstr ""
msgid "pipeline"
msgstr ""
+msgid "pipeline schedules documentation"
+msgstr ""
+
msgid "pod_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
msgstr ""
@@ -40343,16 +40938,25 @@ msgstr ""
msgid "project name"
msgstr ""
+msgid "project namespace cannot be the parent of another namespace"
+msgstr ""
+
msgid "projects"
msgstr ""
msgid "quick actions"
msgstr ""
-msgid "reCAPTCHA Private Key"
+msgid "reCAPTCHA"
+msgstr ""
+
+msgid "reCAPTCHA helps prevent credential stuffing."
msgstr ""
-msgid "reCAPTCHA Site Key"
+msgid "reCAPTCHA private key"
+msgstr ""
+
+msgid "reCAPTCHA site key"
msgstr ""
msgid "recent activity"
@@ -40579,6 +41183,9 @@ msgstr ""
msgid "user avatar"
msgstr ""
+msgid "user namespace cannot be the parent of another namespace"
+msgstr ""
+
msgid "user preferences"
msgstr ""
@@ -40671,3 +41278,9 @@ msgstr ""
msgid "your settings"
msgstr ""
+msgid "{group}"
+msgstr ""
+
+msgid "{project}"
+msgstr ""
+
diff --git a/locale/pl_PL/gitlab.po b/locale/pl_PL/gitlab.po
index ac331c805ee..df085f1178c 100644
--- a/locale/pl_PL/gitlab.po
+++ b/locale/pl_PL/gitlab.po
@@ -14,10 +14,7 @@ msgstr ""
"X-Crowdin-Language: pl\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-09-01 22:34\n"
-
-msgid " %{name}, confirm your email address now! "
-msgstr " %{name}, potwierdź teraz swój adres e-mail! "
+"PO-Revision-Date: 2021-10-04 20:22\n"
msgid " %{start} to %{end}"
msgstr " %{start} do %{end}"
@@ -96,6 +93,20 @@ msgstr "Parametr „el†jest wymagany dla createInstance()"
msgid "#general, #development"
msgstr "#ogólne, #rozwój"
+msgid "%d Alert"
+msgid_plural "%d Alerts"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
+msgid "%d Alert:"
+msgid_plural "%d Alerts:"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "%d Approval"
msgid_plural "%d Approvals"
msgstr[0] "%d Zatwierdzenie"
@@ -591,8 +602,11 @@ msgstr "%{code_open} Maskowanie:%{code_close} Ukryte w logu zadań. Musi spełni
msgid "%{code_open}Protected:%{code_close} Only exposed to protected branches or tags."
msgstr "%{code_open}Chronione%{code_close} Widoczne tylko dla chronionych branchy lub tagów."
-msgid "%{commit_author_link} authored %{commit_timeago}"
-msgstr "%{commit_author_link} utworzył(a) %{commit_timeago}"
+msgid "%{commit_author_link} authored %{commit_authored_timeago}"
+msgstr ""
+
+msgid "%{commit_author_link} authored %{commit_authored_timeago} and %{commit_committer_avatar} %{commit_committer_link} committed %{commit_committer_timeago}"
+msgstr ""
msgid "%{completedCount} completed weight"
msgstr "%{completedCount} ukończonej wagi"
@@ -695,6 +709,15 @@ msgstr "%{doc_link_start}Zaawansowane wyszukiwanie%{doc_link_end} jest wyłączo
msgid "%{doc_link_start}Advanced search%{doc_link_end} is enabled."
msgstr "%{doc_link_start}Zaawansowane wyszukiwanie%{doc_link_end} jest włączone."
+msgid "%{docs_link_start}Learn about visibility levels.%{docs_link_end}"
+msgstr ""
+
+msgid "%{docs_link_start}What is Large File Storage?%{docs_link_end}"
+msgstr ""
+
+msgid "%{docs_link_start}What is two-factor authentication?%{docs_link_end}"
+msgstr ""
+
msgid "%{due_date} (Past due)"
msgstr "%{due_date} (zaległe)"
@@ -747,7 +770,7 @@ msgid "%{group_name} uses group managed accounts. You need to create a new GitLa
msgstr "Grupa %{group_name} używa konta zarządzane grupowo. Musisz utworzyć nowe konto w GitLab, które będzie zarządzane przez grupę %{group_name}."
msgid "%{group_name}&%{epic_iid} &middot; created %{epic_created} by %{author}"
-msgstr "%{group_name} i %{epic_iid} &middot; utworzone %{epic_created} przez %{author}"
+msgstr ""
msgid "%{hook_type} was deleted"
msgstr "%{hook_type} zostało usunięte"
@@ -767,9 +790,6 @@ msgstr "%{issuableType} zostanie usunięty! Jesteś pewny?"
msgid "%{issueType} actions"
msgstr "akcje %{issueType}"
-msgid "%{issuesCount} issues with a limit of %{maxIssueCount}"
-msgstr "%{issuesCount} zgłoszeń przy limicie %{maxIssueCount}"
-
msgid "%{issuesSize} with a limit of %{maxIssueCount}"
msgstr "%{issuesSize} przy limicie %{maxIssueCount}"
@@ -827,6 +847,12 @@ msgstr "%{labelStart}Zniezmodyfikowana odpowiedź:%{labelEnd} %{headers}"
msgid "%{label_for_message} unavailable"
msgstr "%{label_for_message} niedostępne"
+msgid "%{learn_more_link}."
+msgstr ""
+
+msgid "%{lessThan} 1 hour"
+msgstr ""
+
msgid "%{lets_encrypt_link_start}Let's Encrypt%{lets_encrypt_link_end} is a free, automated, and open certificate authority (CA) that issues digital certificates to enable HTTPS (SSL/TLS) for sites."
msgstr ""
@@ -839,15 +865,15 @@ msgstr ""
msgid "%{link_start}Learn more%{link_end} about roles."
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
-msgstr "%{link_start}Dowiedz się więcej%{link_end} o tym, jakie informacje są udostępniane firmie GitLab Inc."
-
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
msgstr ""
msgid "%{link_start}Start the title with %{draft_snippet}%{link_end} to prevent a merge request that is a work in progress from being merged before it's ready."
msgstr ""
+msgid "%{link_start}What information does GitLab Inc. collect?%{link_end}"
+msgstr ""
+
msgid "%{listToShow}, and %{awardsListLength} more"
msgstr ""
@@ -1008,7 +1034,7 @@ msgstr[1] "Wyniki %{securityScanner} są niedostępne, ponieważ potok nie zosta
msgstr[2] "Wyniki %{securityScanner} są niedostępne, ponieważ potok nie został uruchomiony od czasu jego włączenia. %{linkStart}Uruchom potok%{linkEnd}"
msgstr[3] "Wyniki %{securityScanner} jest niedostępnych, ponieważ potok nie został uruchomiony od czasu jego włączenia. %{linkStart}Uruchom potok%{linkEnd}"
-msgid "%{service_ping_link_start}Learn more%{service_ping_link_end} about what information is shared with GitLab Inc."
+msgid "%{service_ping_link_start}What information is shared with GitLab Inc.?%{service_ping_link_end}"
msgstr ""
msgid "%{size} %{unit}"
@@ -1044,6 +1070,9 @@ msgstr "%{start} do %{end}"
msgid "%{state} epics"
msgstr "%{state} epiki"
+msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
+msgstr ""
+
msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
msgstr ""
@@ -1117,13 +1146,6 @@ msgstr "%{tag}-%{evidence}-%{filename}"
msgid "%{template_project_id} is unknown or invalid"
msgstr "%{template_project_id} jest nieznany lub nieprawidłowy"
-msgid "%{text} %{files}"
-msgid_plural "%{text} %{files} files"
-msgstr[0] "%{text} %{files} plik"
-msgstr[1] "%{text} %{files} pliki"
-msgstr[2] "%{text} %{files} plików"
-msgstr[3] "%{text} %{files} pliku"
-
msgid "%{text} is available"
msgstr "%{text} jest dostępny"
@@ -1208,9 +1230,6 @@ msgstr "%{webhooks_link_start} %{webhook_type} %{link_end} umożliwia wysyłanie
msgid "%{wildcards_link_start}Wildcards%{wildcards_link_end} such as %{code_tag_start}v*%{code_tag_end} or %{code_tag_start}*-release%{code_tag_end} are supported."
msgstr "%{wildcards_link_start}Symbole wieloznaczne%{wildcards_link_end} takie jak %{code_tag_start}v*%{code_tag_end} lub %{code_tag_start}*-release%{code_tag_end} są obsługiwane."
-msgid "&lt; 1 hour"
-msgstr "&lt; 1 godzina"
-
msgid "'%{data}' at %{location} does not match format: %{format}"
msgstr "„%{data}†w %{location} nie pasuje do formatu: %{format}"
@@ -1296,9 +1315,6 @@ msgstr "(unieważnione)"
msgid "(we need your current password to confirm your changes)"
msgstr "(potrzebujemy Twojego aktualnego hasła, aby potwierdzić zmiany)"
-msgid "* * * * *"
-msgstr "* * * * *"
-
msgid "+ %{amount} more"
msgstr "+ %{amount} więcej"
@@ -1371,12 +1387,12 @@ msgstr "- pokaż mniej"
msgid "."
msgstr "."
+msgid "/"
+msgstr ""
+
msgid "0 bytes"
msgstr "0 bajtów"
-msgid "0 for unlimited, only effective with remote storage enabled."
-msgstr ""
-
msgid "0t1DgySidms"
msgstr "0t1DgySidms"
@@ -1550,6 +1566,9 @@ msgstr ""
msgid "1000+"
msgstr "1000+"
+msgid "192.168.0.0/24"
+msgstr ""
+
msgid "1st contribution!"
msgstr "Pierwszy wkład!"
@@ -1584,13 +1603,13 @@ msgid "403|You don't have the permission to access this page."
msgstr "Nie posiadasz uprawnień dostępu do tej strony."
msgid "404|Make sure the address is correct and the page hasn't moved."
-msgstr "404|Upewnij się, że adres jest prawidłowy i że strona nie została przeniesiona."
+msgstr ""
msgid "404|Page Not Found"
-msgstr "404|Nie znaleziono strony"
+msgstr ""
msgid "404|Please contact your GitLab administrator if you think this is a mistake."
-msgstr "404|Skontaktuj się z Twoim administratorem GitLaba, jeśli uważasz, że to pomyłka."
+msgstr ""
msgid "7 days"
msgstr "7 dni"
@@ -1703,9 +1722,6 @@ msgstr "Niepoufny epik nie może być przypisany do poufnego epika nadrzędnego"
msgid "A plain HTML site that uses Netlify for CI/CD instead of GitLab, but still with all the other great GitLab features"
msgstr "Zwykła strona HTML, która używa Netlify dla CI/CD zamiast GitLab'a, ale nadal ze wszystkimi innymi wspaniałymi funkcjami GitLab"
-msgid "A plain-text response to show to clients that hit the rate limit."
-msgstr "Odpowiedź czysto-tesktowa do pokazania klientom, którzy osiągnęli limit tempa."
-
msgid "A platform value can be web, mob or app."
msgstr "Wartością platformy może być internet, mob lub aplikacja."
@@ -1787,7 +1803,7 @@ msgstr ""
msgid "APIFuzzing|Configure HTTP basic authentication values. Other authentication methods are supported. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
+msgid "APIFuzzing|Customize your project's API fuzzing configuration options and copy the code snippet to your .gitlab-ci.yml file to apply any changes. Note that this tool does not reflect or update your .gitlab-ci.yml file automatically. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
msgstr ""
msgid "APIFuzzing|Enable authentication"
@@ -1842,7 +1858,7 @@ msgid "APIFuzzing|Tip: Insert this part below all include"
msgstr ""
msgid "APIFuzzing|Tip: Insert this part below all stages"
-msgstr "APIFuzzing|Wskazówka: wstaw tę część pod wszystkie etapy"
+msgstr ""
msgid "APIFuzzing|To prevent a security leak, authentication info must be added as a %{ciVariablesLinkStart}CI variable%{ciVariablesLinkEnd}. A user with maintainer access rights can manage CI variables in the %{ciSettingsLinkStart}Settings%{ciSettingsLinkEnd} area. We detected that you are not a maintainer. Commit your changes and assign them to a maintainer to update the credentials before merging."
msgstr ""
@@ -1850,9 +1866,6 @@ msgstr ""
msgid "APIFuzzing|To prevent a security leak, authentication info must be added as a %{ciVariablesLinkStart}CI variable%{ciVariablesLinkEnd}. As a user with maintainer access rights, you can manage CI variables in the %{ciSettingsLinkStart}Settings%{ciSettingsLinkEnd} area."
msgstr ""
-msgid "APIFuzzing|Use this tool to generate API fuzzing configuration YAML to copy into your .gitlab-ci.yml file. This tool does not reflect or update your .gitlab-ci.yml file automatically."
-msgstr ""
-
msgid "APIFuzzing|Username for basic authentication"
msgstr ""
@@ -1904,9 +1917,6 @@ msgstr "Raporty o nadużyciach"
msgid "Abuse reports notification email"
msgstr "E-mail z raportami o nadużyciach"
-msgid "Abuse reports will be sent to this address if it is set. Abuse reports are always available in the admin area."
-msgstr "Raporty o nadużyciach będą wysyłane na ten adres, jeśli jest ustawiony. Raporty o nadużyciach są zawsze dostępne w obszarze administratora."
-
msgid "Accept invitation"
msgstr "Zaakceptuj zaproszenie"
@@ -1943,12 +1953,18 @@ msgstr "Dostęp zabroniony. Sprawdź swój poziom dostępu."
msgid "Access granted"
msgstr "Dostęp przyznany"
+msgid "Access key ID"
+msgstr ""
+
msgid "Access requests"
msgstr "Poproszono o dostęp"
msgid "Access to '%{classification_label}' not allowed"
msgstr "Dostęp do \"%{classification_label}\" jest niedozwolony"
+msgid "Access tokens expire after 2 hours. A refresh token may be used at any time to generate a new access token. Non-expiring access tokens are deprecated. Clear this setting to enable backward compatibility."
+msgstr ""
+
msgid "AccessDropdown|Deploy Keys"
msgstr ""
@@ -2261,6 +2277,9 @@ msgstr "Dodaj nowÄ… aplikacjÄ™"
msgid "Add new directory"
msgstr "Dodaj nowy katalog"
+msgid "Add new service account"
+msgstr ""
+
msgid "Add or remove previously merged commits"
msgstr "Dodaj lub usuń poprzednio zmergowane commity"
@@ -2498,6 +2517,9 @@ msgstr "Deweloper"
msgid "AdminArea|Features"
msgstr "Funkcje"
+msgid "AdminArea|Get security updates from GitLab and stay up to date"
+msgstr ""
+
msgid "AdminArea|Groups"
msgstr "Grupy"
@@ -2537,6 +2559,12 @@ msgstr "Projekty"
msgid "AdminArea|Reporter"
msgstr ""
+msgid "AdminArea|Sign up for the GitLab Security Newsletter to get notified for security updates."
+msgstr ""
+
+msgid "AdminArea|Sign up for the GitLab newsletter"
+msgstr ""
+
msgid "AdminArea|Stop all jobs"
msgstr ""
@@ -2606,9 +2634,15 @@ msgstr ""
msgid "AdminSettings|Disable public access to Pages sites"
msgstr ""
+msgid "AdminSettings|Display a banner on merge requests in projects with no pipelines to initiate steps to add a .gitlab-ci.yml file."
+msgstr ""
+
msgid "AdminSettings|Domain verification is an essential security measure for public GitLab sites. Users are required to demonstrate they control a domain before it is enabled. %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "AdminSettings|Enable pipeline suggestion banner"
+msgstr ""
+
msgid "AdminSettings|Enable shared runners for new projects"
msgstr ""
@@ -2685,10 +2719,10 @@ msgid "AdminStatistics|Active Users"
msgstr "Aktywni użytkownicy"
msgid "AdminStatistics|Forks"
-msgstr "AdminStatistics|Forki"
+msgstr ""
msgid "AdminStatistics|Issues"
-msgstr "AdminStatistics|Zgłoszenia"
+msgstr ""
msgid "AdminStatistics|Merge requests"
msgstr ""
@@ -2697,7 +2731,7 @@ msgid "AdminStatistics|Milestones"
msgstr "Kamienie milowe"
msgid "AdminStatistics|Notes"
-msgstr "AdminStatistics|Notatki"
+msgstr ""
msgid "AdminStatistics|SSH Keys"
msgstr "Klucze SSH"
@@ -2751,16 +2785,16 @@ msgid "AdminUsers|Active"
msgstr "Aktywny"
msgid "AdminUsers|Adjust the user cap setting on your instance"
-msgstr "AdminUsers|Dostosuj ustawienie limitu użytkownika na twojej instancji"
+msgstr ""
msgid "AdminUsers|Admin"
-msgstr "AdminUsers|Administrator"
+msgstr ""
msgid "AdminUsers|Administrators have access to all groups, projects and users and can manage all features in this installation"
msgstr "Administratorzy mają dostęp do wszystkich grup, projektów i użytkowników i mogą zarządzać wszystkimi funkcjami w tej instalacji"
msgid "AdminUsers|Admins"
-msgstr "AdminUsers|Administratorzy"
+msgstr ""
msgid "AdminUsers|Approve"
msgstr "Zatwierdź"
@@ -2772,7 +2806,7 @@ msgid "AdminUsers|Approved users can:"
msgstr "Zatwierdzeni użytkownicy mogą:"
msgid "AdminUsers|Automatically marked as default internal user"
-msgstr "AdminUsers|Automatycznie oznaczony jako domyślny użytkownik wewnętrzny"
+msgstr ""
msgid "AdminUsers|Ban user"
msgstr ""
@@ -3012,7 +3046,7 @@ msgid "AdminUsers|When the user logs back in, their account will reactivate as a
msgstr "Gdy użytkownik zaloguje się ponownie, jego konto zostanie ponownie aktywowane jako konto w pełni aktywne"
msgid "AdminUsers|Will be deleted"
-msgstr "AdminUsers|Zostanie usunięty"
+msgstr ""
msgid "AdminUsers|Without projects"
msgstr "Bez projektów"
@@ -3042,13 +3076,13 @@ msgid "AdminUsers|You can unban their account in the future. Their data remains
msgstr ""
msgid "AdminUsers|You cannot remove your own admin rights."
-msgstr "AdminUsers|Nie możesz usunąć własnych praw administratora."
+msgstr ""
msgid "AdminUsers|You must transfer ownership or delete the groups owned by this user before you can delete their account"
-msgstr "AdminUsers|Musisz przenieść własność lub usunąć grupy należące do tego użytkownika zanim usuniesz jego konto"
+msgstr ""
msgid "AdminUsers|Your GitLab instance has reached the maximum allowed %{user_doc_link} set by an instance admin."
-msgstr "AdminUsers|Twoja instancja GitLab osiągnęła maksymalną dozwoloną wartość %{user_doc_link} ustawioną przez administratora instancji."
+msgstr ""
msgid "AdminUsers|approve them"
msgstr ""
@@ -3069,7 +3103,7 @@ msgid "Admin|Additional users must be reviewed and approved by a system administ
msgstr ""
msgid "Admin|Admin notes"
-msgstr "Admin|Notatki administratora"
+msgstr ""
msgid "Admin|Learn more about quarterly reconciliation"
msgstr ""
@@ -3080,10 +3114,10 @@ msgstr ""
msgid "Admin|Quarterly reconciliation will occur on %{qrtlyDate}"
msgstr ""
-msgid "Admin|The number of max seats used for your namespace is currently exceeding the number of seats in your subscription. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgid "Admin|The number of max seats in your namespace exceeds the number of seats in your subscription. On %{qrtlyDate}, quarterly reconciliation occurs and you are automatically billed a prorated amount for the overage. No action is needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice. For more information about the timing of the invoicing process, view the documentation."
msgstr ""
-msgid "Admin|The number of maximum users for your instance is currently exceeding the number of users in license. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgid "Admin|The number of max users in your instance exceeds the number of users in your license. On %{qrtlyDate}, quarterly reconciliation occurs and you are automatically billed a prorated amount for the overage. No action is needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice. For more information about the timing of the invoicing process, view the documentation."
msgstr ""
msgid "Admin|View pending user approvals"
@@ -3104,9 +3138,6 @@ msgstr "Ustawienia zaawansowane"
msgid "Advanced export options"
msgstr ""
-msgid "Advanced permissions, Large File Storage and Two-Factor authentication settings."
-msgstr "Zaawansowane pozwolenia, Magazyn Dużych Plików i Ustawienia dwuskładnikowego uwierzytelnienia."
-
msgid "After a successful password update you will be redirected to login screen."
msgstr "Po udanej aktualizacji hasła zostaniesz przekierowany do ekranu logowania."
@@ -3125,15 +3156,14 @@ msgstr ""
msgid "After you've reviewed these contribution guidelines, you'll be all set to"
msgstr ""
+msgid "Akismet"
+msgstr ""
+
msgid "Akismet API Key"
msgstr "Klucz API Akismet"
-msgid "Alert"
-msgid_plural "Alerts"
-msgstr[0] "Ostrzeżenie"
-msgstr[1] "Ostrzeżenia"
-msgstr[2] "Ostrzeżeń"
-msgstr[3] "Ostrzeżenia"
+msgid "Akismet helps prevent the creation of spam issues in public projects."
+msgstr ""
msgid "AlertManagement|Acknowledged"
msgstr ""
@@ -3489,6 +3519,9 @@ msgstr "Wszystkie %{replicableType} sÄ… zaplanowane na %{action}"
msgid "All (default)"
msgstr "Wszystkie (domyślnie)"
+msgid "All GitLab"
+msgstr ""
+
msgid "All Members"
msgstr "Wszyscy członkowie"
@@ -3603,6 +3636,9 @@ msgstr ""
msgid "Allow this secondary node to replicate content on Object Storage"
msgstr ""
+msgid "Allow use of licensed EE features"
+msgstr ""
+
msgid "Allow users to dismiss the broadcast message"
msgstr ""
@@ -3678,9 +3714,6 @@ msgstr "Logo Amazon Web Services"
msgid "Amazon authentication is not %{link_start}correctly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr "Uwierzytelnianie Amazon nie jest %{link_start}poprawnie skonfigurowane%{link_end}. Skontaktuj się z administratorem swojego GitLaba, jeśli chcesz korzystać z tej usługi."
-msgid "Amount of time (in hours) that users are allowed to skip forced configuration of two-factor authentication"
-msgstr "Ilość czasu (w godzinach), przez jaką użytkownicy mogą pominąć wymuszoną konfigurację uwierzytelniania dwuskładnikowego"
-
msgid "An %{link_start}alert%{link_end} with the same fingerprint is already open. To change the status of this alert, resolve the linked alert."
msgstr ""
@@ -3741,12 +3774,6 @@ msgstr ""
msgid "An error occurred when removing the label."
msgstr "Wystąpił błąd podczas usuwania etykiety."
-msgid "An error occurred when toggling the notification subscription"
-msgstr "Wystąpił błąd podczas przełączania subskrypcji powiadomień"
-
-msgid "An error occurred when updating the issue weight"
-msgstr "Wystąpił błąd podczas aktualizowania wagi problemu"
-
msgid "An error occurred when updating the title"
msgstr "Wystąpił błąd podczas aktualizacji tytułu"
@@ -3795,6 +3822,9 @@ msgstr "Wystąpił błąd podczas rysowania linków relacji pracy."
msgid "An error occurred while enabling Service Desk."
msgstr "Wystąpił błąd podczas włączania Service Desk."
+msgid "An error occurred while fetching Markdown preview"
+msgstr ""
+
msgid "An error occurred while fetching ancestors"
msgstr ""
@@ -3825,9 +3855,6 @@ msgstr ""
msgid "An error occurred while fetching label colors."
msgstr ""
-msgid "An error occurred while fetching markdown preview"
-msgstr ""
-
msgid "An error occurred while fetching participants"
msgstr ""
@@ -3843,9 +3870,6 @@ msgstr ""
msgid "An error occurred while fetching reference"
msgstr ""
-msgid "An error occurred while fetching sidebar data"
-msgstr ""
-
msgid "An error occurred while fetching tags. Retry the search."
msgstr ""
@@ -3921,6 +3945,9 @@ msgstr ""
msgid "An error occurred while loading merge requests."
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 Needs tab."
msgstr ""
@@ -4155,12 +4182,6 @@ msgstr ""
msgid "Any Milestone"
msgstr ""
-msgid "Any branch"
-msgstr ""
-
-msgid "Any eligible user"
-msgstr ""
-
msgid "Any encrypted tokens"
msgstr ""
@@ -4179,6 +4200,9 @@ msgstr ""
msgid "Any namespace"
msgstr "Dowolna przestrzeń nazw"
+msgid "App Engine description and apps that are suitable for this deployment target"
+msgstr ""
+
msgid "App ID"
msgstr "ID aplikacji"
@@ -4331,6 +4355,13 @@ msgstr "Zastosowano"
msgid "Apply"
msgstr "Zastosuj"
+msgid "Apply %d suggestion"
+msgid_plural "Apply %d suggestions"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "Apply a label"
msgstr "Zastosuj etykietÄ™"
@@ -4340,13 +4371,10 @@ msgstr "Zastosuj szablon"
msgid "Apply suggestion"
msgstr "Zastosuj sugestiÄ™"
-msgid "Apply suggestions"
-msgstr "Zastosuj sugestie"
-
msgid "Apply template"
msgstr "Zastosuj szablon"
-msgid "Apply this approval rule to any branch or a specific protected branch."
+msgid "Apply this approval rule to all branches or a specific protected branch."
msgstr ""
msgid "Applying"
@@ -4497,9 +4525,6 @@ msgstr ""
msgid "ApprovalSettings|Prevent editing approval rules in projects and merge requests."
msgstr ""
-msgid "ApprovalSettings|Prevent editing approval rules in projects and merge requests. "
-msgstr ""
-
msgid "ApprovalSettings|Remove all approvals when commits are added to the source branch."
msgstr ""
@@ -4515,6 +4540,9 @@ msgstr ""
msgid "ApprovalSettings|This setting is configured at the instance level and can only be changed by an administrator."
msgstr ""
+msgid "ApprovalSettings|This setting is configured in %{groupName} and can only be changed by an administrator or group owner."
+msgstr ""
+
msgid "ApprovalStatusTooltip|Adheres to separation of duties"
msgstr ""
@@ -5007,9 +5035,6 @@ msgstr ""
msgid "Authenticated API rate limit period in seconds"
msgstr ""
-msgid "Authenticated API request rate limit"
-msgstr ""
-
msgid "Authenticated API requests"
msgstr ""
@@ -5019,10 +5044,10 @@ msgstr ""
msgid "Authenticated Git LFS request rate limit"
msgstr ""
-msgid "Authenticated web rate limit period in seconds"
+msgid "Authenticated Git LFS requests"
msgstr ""
-msgid "Authenticated web request rate limit"
+msgid "Authenticated web rate limit period in seconds"
msgstr ""
msgid "Authenticated web requests"
@@ -5400,9 +5425,6 @@ msgstr ""
msgid "Below you will find all the groups that are public."
msgstr ""
-msgid "Beta"
-msgstr ""
-
msgid "Bi-weekly code coverage"
msgstr ""
@@ -5644,6 +5666,21 @@ msgstr ""
msgid "Board scope affects which issues are displayed for anyone who visits this board"
msgstr ""
+msgid "BoardNewEpic|Groups"
+msgstr ""
+
+msgid "BoardNewEpic|Loading groups"
+msgstr ""
+
+msgid "BoardNewEpic|No matching results"
+msgstr ""
+
+msgid "BoardNewEpic|Search groups"
+msgstr ""
+
+msgid "BoardNewEpic|Select a group"
+msgstr ""
+
msgid "BoardNewIssue|No matching results"
msgstr ""
@@ -5723,6 +5760,9 @@ msgstr ""
msgid "Boards|An error occurred while creating the list. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching child groups. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching group projects. Please try again."
msgstr ""
@@ -6057,6 +6097,9 @@ msgstr ""
msgid "Bulk update"
msgstr ""
+msgid "BulkImports|Re-import creates a new group. It does not sync with the existing group."
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -6066,6 +6109,9 @@ msgstr ""
msgid "BulkImport|From source group"
msgstr ""
+msgid "BulkImport|Group import history"
+msgstr ""
+
msgid "BulkImport|Import failed: Destination cannot be a subgroup of the source group. Change the destination and try again."
msgstr ""
@@ -6078,9 +6124,18 @@ msgstr ""
msgid "BulkImport|Importing the group failed"
msgstr ""
+msgid "BulkImport|Last imported to %{link}"
+msgstr ""
+
msgid "BulkImport|Name already exists."
msgstr ""
+msgid "BulkImport|New group"
+msgstr ""
+
+msgid "BulkImport|No history is available"
+msgstr ""
+
msgid "BulkImport|No parent"
msgstr ""
@@ -6093,6 +6148,9 @@ msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} matching filter \"%{filter}\" from %{link}"
msgstr ""
+msgid "BulkImport|Source group"
+msgstr ""
+
msgid "BulkImport|To new group"
msgstr ""
@@ -6102,6 +6160,9 @@ msgstr ""
msgid "BulkImport|You have no groups to import"
msgstr ""
+msgid "BulkImport|Your imported groups will appear here."
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -6346,6 +6407,9 @@ msgstr ""
msgid "Can be manually deployed to"
msgstr ""
+msgid "Can be overridden in each project."
+msgstr ""
+
msgid "Can create groups:"
msgstr ""
@@ -6448,6 +6512,9 @@ msgstr ""
msgid "Cancelling Preview"
msgstr ""
+msgid "Cannot assign a confidential epic to a non-confidential issue. Make the issue confidential and try again"
+msgstr ""
+
msgid "Cannot be assigned to other projects."
msgstr ""
@@ -6499,9 +6566,6 @@ msgstr ""
msgid "Cannot refer to a group %{timebox_type} by an internal id!"
msgstr ""
-msgid "Cannot set confidential epic for a non-confidential issue"
-msgstr ""
-
msgid "Cannot show preview. For previews on sketch files, they must have the file format introduced by Sketch version 43 and above."
msgstr ""
@@ -6739,15 +6803,15 @@ msgstr ""
msgid "Check out, review, and merge locally"
msgstr ""
-msgid "Check the %{docs_link_start}documentation%{docs_link_end}."
-msgstr ""
-
msgid "Check the current instance configuration "
msgstr ""
msgid "Check the elasticsearch.log file to debug why the migration was halted and make any changes before retrying the migration. When you fix the cause of the failure, click \"Retry migration\", and the migration will be scheduled to be retried in the background."
msgstr ""
+msgid "Check with your administrator."
+msgstr ""
+
msgid "Check your Docker images for known vulnerabilities."
msgstr ""
@@ -6778,6 +6842,9 @@ msgstr ""
msgid "Checkout"
msgstr ""
+msgid "Checkout|$%{selectedPlanPrice} per 10 GB storage per pack"
+msgstr ""
+
msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 minutes"
msgstr ""
@@ -6800,19 +6867,25 @@ msgstr ""
msgid "Checkout|%{name}'s GitLab subscription"
msgstr ""
-msgid "Checkout|%{selectedPlanText} plan"
+msgid "Checkout|%{name}'s storage subscription"
msgstr ""
-msgid "Checkout|%{startDate} - %{endDate}"
+msgid "Checkout|%{quantity} GB of storage"
msgstr ""
-msgid "Checkout|%{totalCiMinutes} CI minute"
-msgid_plural "Checkout|%{totalCiMinutes} CI minutes"
+msgid "Checkout|%{quantity} storage pack"
+msgid_plural "Checkout|%{quantity} storage packs"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "Checkout|%{selectedPlanText} plan"
+msgstr ""
+
+msgid "Checkout|%{startDate} - %{endDate}"
+msgstr ""
+
msgid "Checkout|%{totalCiMinutes} CI minutes"
msgstr ""
@@ -6888,6 +6961,9 @@ msgstr ""
msgid "Checkout|Failed to register credit card. Please try again."
msgstr ""
+msgid "Checkout|GB"
+msgstr ""
+
msgid "Checkout|GitLab group"
msgstr ""
@@ -6924,6 +7000,9 @@ msgstr ""
msgid "Checkout|State"
msgstr ""
+msgid "Checkout|Storage packs"
+msgstr ""
+
msgid "Checkout|Street address"
msgstr ""
@@ -6945,6 +7024,9 @@ msgstr ""
msgid "Checkout|Total minutes: %{quantity}"
msgstr ""
+msgid "Checkout|Total storage: %{quantity} GB"
+msgstr ""
+
msgid "Checkout|Users"
msgstr ""
@@ -6954,16 +7036,25 @@ msgstr ""
msgid "Checkout|Your organization"
msgstr ""
+msgid "Checkout|Your storage subscription has the same term as your main subscription, and the price is prorated accordingly."
+msgstr ""
+
msgid "Checkout|Your subscription will be applied to this group"
msgstr ""
msgid "Checkout|Zip code"
msgstr ""
+msgid "Checkout|a storage subscription"
+msgstr ""
+
msgid "Checkout|company or team"
msgstr ""
-msgid "Checkout|x 1,000 minutes per pack = %{strong}"
+msgid "Checkout|minutes"
+msgstr ""
+
+msgid "Checkout|x %{quantity} %{units} per pack ="
msgstr ""
msgid "Cherry-pick this commit"
@@ -7320,6 +7411,9 @@ msgstr ""
msgid "CloneIssue|Cannot clone issue to target project as it is pending deletion."
msgstr ""
+msgid "CloneIssue|Cannot clone issues of '%{issue_type}' type."
+msgstr ""
+
msgid "Cloned this issue to %{path_to_project}."
msgstr ""
@@ -7374,7 +7468,10 @@ msgstr ""
msgid "Closes this %{quick_action_target}."
msgstr ""
-msgid "Cloud licenses can not be removed."
+msgid "Cloud Functions description and apps that are suitable for this deployment target"
+msgstr ""
+
+msgid "Cloud Run description and apps that are suitable for this deployment target"
msgstr ""
msgid "Cluster"
@@ -7401,6 +7498,12 @@ msgstr ""
msgid "ClusterAgents|Access tokens"
msgstr ""
+msgid "ClusterAgents|Agent might not be connected to GitLab"
+msgstr ""
+
+msgid "ClusterAgents|Agent never connected to GitLab"
+msgstr ""
+
msgid "ClusterAgents|Alternative installation methods"
msgstr ""
@@ -7416,6 +7519,12 @@ msgstr ""
msgid "ClusterAgents|Configuration"
msgstr ""
+msgid "ClusterAgents|Connected"
+msgstr ""
+
+msgid "ClusterAgents|Connection status"
+msgstr ""
+
msgid "ClusterAgents|Copy token"
msgstr ""
@@ -7434,6 +7543,9 @@ msgstr ""
msgid "ClusterAgents|For alternative installation methods %{linkStart}go to the documentation%{linkEnd}."
msgstr ""
+msgid "ClusterAgents|For more troubleshooting information go to"
+msgstr ""
+
msgid "ClusterAgents|Go to the repository"
msgstr ""
@@ -7449,18 +7561,30 @@ msgstr ""
msgid "ClusterAgents|Integrate with the GitLab Agent"
msgstr ""
-msgid "ClusterAgents|Last used"
+msgid "ClusterAgents|Last connected %{timeAgo}."
+msgstr ""
+
+msgid "ClusterAgents|Last contact"
msgstr ""
msgid "ClusterAgents|Learn how to create an agent access token"
msgstr ""
+msgid "ClusterAgents|Make sure you are using a valid token."
+msgstr ""
+
msgid "ClusterAgents|Name"
msgstr ""
msgid "ClusterAgents|Never"
msgstr ""
+msgid "ClusterAgents|Never connected"
+msgstr ""
+
+msgid "ClusterAgents|Not connected"
+msgstr ""
+
msgid "ClusterAgents|Read more about getting started"
msgstr ""
@@ -7482,6 +7606,9 @@ msgstr ""
msgid "ClusterAgents|Select which Agent you want to install"
msgstr ""
+msgid "ClusterAgents|The Agent has not been connected in a long time. There might be a connectivity issue. Last contact was %{timeAgo}."
+msgstr ""
+
msgid "ClusterAgents|The GitLab Agent also requires %{linkStart}enabling the Agent Server%{linkEnd}"
msgstr ""
@@ -7509,9 +7636,6 @@ msgstr ""
msgid "ClusterAgents|You will need to create a token to connect to your agent"
msgstr ""
-msgid "ClusterAgent|This feature is only available for premium plans"
-msgstr ""
-
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -7701,9 +7825,6 @@ msgstr ""
msgid "ClusterIntegration|Create Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Create a provision role on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the account and external ID above. %{startMoreInfoLink}More information%{endLink}"
-msgstr ""
-
msgid "ClusterIntegration|Create cluster on"
msgstr ""
@@ -8136,7 +8257,7 @@ msgstr ""
msgid "ClusterIntegration|Subnets"
msgstr ""
-msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provisioned role, first create one on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the above account and external IDs. %{startMoreInfoLink}More information%{endLink}"
+msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provisioned role, first create one on %{awsLinkStart}Amazon Web Services %{awsLinkEnd} using the above account and external IDs. %{moreInfoStart}More information%{moreInfoEnd}"
msgstr ""
msgid "ClusterIntegration|The Kubernetes certificate used to authenticate to the cluster."
@@ -8370,6 +8491,9 @@ msgstr ""
msgid "Collapse replies"
msgstr ""
+msgid "Collapse settings section"
+msgstr ""
+
msgid "Collapse sidebar"
msgstr ""
@@ -8388,6 +8512,9 @@ msgstr ""
msgid "Comma-separated list of email addresses."
msgstr ""
+msgid "Comma-separated list of users allowed to exceed the rate limit."
+msgstr ""
+
msgid "Comma-separated, e.g. '1.1.1.1, 2.2.2.0/24'"
msgstr ""
@@ -8710,6 +8837,9 @@ msgstr ""
msgid "Configure %{repository_checks_link_start}repository checks%{link_end} and %{housekeeping_link_start}housekeeping%{link_end} on repositories."
msgstr ""
+msgid "Configure CAPTCHAs, IP address limits, and other anti-spam measures."
+msgstr ""
+
msgid "Configure Dependency Scanning in `.gitlab-ci.yml` using the GitLab managed template. You can [add variable overrides](https://docs.gitlab.com/ee/user/application_security/dependency_scanning/#customizing-the-dependency-scanning-settings) to customize Dependency Scanning settings."
msgstr ""
@@ -8746,16 +8876,13 @@ msgstr ""
msgid "Configure a %{codeStart}.gitlab-webide.yml%{codeEnd} file in the %{codeStart}.gitlab%{codeEnd} directory to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
msgstr ""
-msgid "Configure existing installation"
-msgstr ""
-
-msgid "Configure limit for notes created per minute by web and API requests."
+msgid "Configure advanced permissions, Large File Storage, and two-factor authentication settings."
msgstr ""
-msgid "Configure limits for Project/Group Import/Export."
+msgid "Configure approvals by authors and committers on all projects."
msgstr ""
-msgid "Configure limits for web and API requests."
+msgid "Configure existing installation"
msgstr ""
msgid "Configure paths to be protected by Rack Attack."
@@ -8770,10 +8897,13 @@ msgstr ""
msgid "Configure settings for Advanced Search with Elasticsearch."
msgstr ""
+msgid "Configure specific limits for Files API requests that supersede the general user and IP rate limits."
+msgstr ""
+
msgid "Configure specific limits for Git LFS requests that supersede the general user and IP rate limits."
msgstr ""
-msgid "Configure specific limits for Packages API requests that supersede the general user and IP rate limits."
+msgid "Configure specific limits for deprecated API requests that supersede the general user and IP rate limits."
msgstr ""
msgid "Configure the %{link} integration."
@@ -8785,6 +8915,9 @@ msgstr ""
msgid "Configure the way a user creates a new account."
msgstr ""
+msgid "Configure via Merge Request"
+msgstr ""
+
msgid "Configure which lists are shown for anyone who visits this board"
msgstr ""
@@ -9259,6 +9392,9 @@ msgstr ""
msgid "Content parsed with %{link}."
msgstr ""
+msgid "ContentEditor|Table of Contents"
+msgstr ""
+
msgid "ContentEditor|You have to provide a renderMarkdown function or a custom serializer"
msgstr ""
@@ -9445,6 +9581,9 @@ msgstr ""
msgid "Copy link to chart"
msgstr ""
+msgid "Copy prefix"
+msgstr ""
+
msgid "Copy reference"
msgstr ""
@@ -9475,6 +9614,9 @@ msgstr ""
msgid "Copy value"
msgstr ""
+msgid "Corpus Management"
+msgstr ""
+
msgid "Corpus Management|Are you sure you want to delete the corpus?"
msgstr ""
@@ -9703,6 +9845,9 @@ msgstr ""
msgid "Create commit"
msgstr ""
+msgid "Create common files more quickly, and standardize their format."
+msgstr ""
+
msgid "Create confidential merge request"
msgstr ""
@@ -9736,6 +9881,9 @@ msgstr ""
msgid "Create issue"
msgstr ""
+msgid "Create issue to resolve all threads"
+msgstr ""
+
msgid "Create iteration"
msgstr ""
@@ -9790,6 +9938,9 @@ msgstr ""
msgid "Create new..."
msgstr ""
+msgid "Create or import your first project"
+msgstr ""
+
msgid "Create project"
msgstr ""
@@ -10147,7 +10298,7 @@ msgstr ""
msgid "Custom notification events"
msgstr ""
-msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notificationLinkStart} notification emails%{notificationLinkEnd}."
+msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notificationLinkStart}notification emails%{notificationLinkEnd}."
msgstr ""
msgid "Custom project templates"
@@ -10350,10 +10501,10 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-msgid "CycleAnalytics|Showing data for group '%{groupName}' and %{selectedProjectCount} projects from %{startDate} to %{endDate}"
+msgid "CycleAnalytics|Showing data for group '%{groupName}' and %{selectedProjectCount} projects from %{createdAfter} to %{createdBefore}"
msgstr ""
-msgid "CycleAnalytics|Showing data for group '%{groupName}' from %{startDate} to %{endDate}"
+msgid "CycleAnalytics|Showing data for group '%{groupName}' from %{createdAfter} to %{createdBefore}"
msgstr ""
msgid "CycleAnalytics|Stages"
@@ -10587,6 +10738,9 @@ msgstr ""
msgid "DastProfiles|Manage profiles"
msgstr ""
+msgid "DastProfiles|Manage site profiles"
+msgstr ""
+
msgid "DastProfiles|Minimum = 0 (no timeout enabled), Maximum = 2880 minutes"
msgstr ""
@@ -10662,6 +10816,9 @@ msgstr ""
msgid "DastProfiles|Scanner name"
msgstr ""
+msgid "DastProfiles|Schedule"
+msgstr ""
+
msgid "DastProfiles|Select branch"
msgstr ""
@@ -10731,7 +10888,7 @@ msgstr ""
msgid "DastProfiles|Website"
msgstr ""
-msgid "DastProfiles|You can either choose a passive scan or validate the target site in your chosen site profile. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
+msgid "DastProfiles|You can either choose a passive scan or validate the target site from the site profile management page. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
msgstr ""
msgid "DastProfiles|You cannot run an active scan against an unvalidated site."
@@ -10906,7 +11063,7 @@ msgstr ""
msgid "Days to merge"
msgstr ""
-msgid "Deactivate dormant users after 90 days of inactivity. Users can return to active status by signing in to their account. While inactive, a user is not counted as an active user in the instance."
+msgid "Deactivate dormant users after 90 days of inactivity"
msgstr ""
msgid "Dear Administrator,"
@@ -10993,10 +11150,10 @@ msgstr ""
msgid "Define a custom pattern with cron syntax"
msgstr ""
-msgid "Define approval settings."
+msgid "Define approval rules."
msgstr ""
-msgid "Define approval settings. %{linkStart}Learn more.%{linkEnd}"
+msgid "Define approval rules. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "Define custom rules for what constitutes spam, independent of Akismet"
@@ -11005,7 +11162,7 @@ msgstr ""
msgid "Define environments in the deploy stage(s) in %{code_open}.gitlab-ci.yml%{code_close} to track deployments here."
msgstr ""
-msgid "Define how approval rules are applied as a merge request moves toward completion."
+msgid "Define how approval rules are applied to merge requests."
msgstr ""
msgid "Definition"
@@ -11020,6 +11177,12 @@ msgstr ""
msgid "DelayedJobs|Are you sure you want to run %{job_name} immediately? This job will run automatically after it's timer finishes."
msgstr ""
+msgid "DelayedJobs|Are you sure you want to run %{job_name} immediately? This job will run automatically after its timer finishes."
+msgstr ""
+
+msgid "DelayedJobs|Run the delayed job now?"
+msgstr ""
+
msgid "DelayedJobs|Start now"
msgstr ""
@@ -11302,6 +11465,12 @@ msgstr ""
msgid "Dependency proxy image prefix"
msgstr ""
+msgid "DependencyProxy|Create a local proxy for storing frequently used upstream images. %{docLinkStart}Learn more%{docLinkEnd} about dependency proxies."
+msgstr ""
+
+msgid "DependencyProxy|Dependency Proxy"
+msgstr ""
+
msgid "DependencyProxy|Toggle Dependency Proxy"
msgstr ""
@@ -11548,6 +11717,9 @@ msgstr ""
msgid "Deployments"
msgstr ""
+msgid "Deployments to Google Kubernetes Engine can be "
+msgstr ""
+
msgid "Deployments|%{deployments} environment impacted."
msgid_plural "Deployments|%{deployments} environments impacted."
msgstr[0] ""
@@ -11579,6 +11751,9 @@ msgstr ""
msgid "Deployment|success"
msgstr ""
+msgid "Deprecated API rate limits"
+msgstr ""
+
msgid "Deprioritize label"
msgstr ""
@@ -11981,6 +12156,20 @@ msgstr ""
msgid "DiffsCompareBaseBranch|(base)"
msgstr ""
+msgid "Diffs|%d addition"
+msgid_plural "Diffs|%d additions"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
+msgid "Diffs|%d deletion"
+msgid_plural "Diffs|%d deletions"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "Diffs|No file name available"
msgstr ""
@@ -11990,9 +12179,19 @@ msgstr ""
msgid "Diffs|Show all unchanged lines"
msgstr ""
+msgid "Diffs|Showing %{dropdownStart}%{count} changed file%{dropdownEnd}"
+msgid_plural "Diffs|Showing %{dropdownStart}%{count} changed files%{dropdownEnd}"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "Diffs|Something went wrong while fetching diff lines."
msgstr ""
+msgid "Diffs|with %{additions} and %{deletions}"
+msgstr ""
+
msgid "Direct member"
msgstr ""
@@ -12120,9 +12319,6 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-msgid "Dismiss Value Stream Analytics introduction box"
-msgstr ""
-
msgid "Dismiss merge request promotion"
msgstr ""
@@ -12444,6 +12640,9 @@ msgstr ""
msgid "Edit issues"
msgstr ""
+msgid "Edit merge requests"
+msgstr ""
+
msgid "Edit public deploy key"
msgstr ""
@@ -12519,6 +12718,9 @@ msgstr ""
msgid "Elastic|None. Select projects to index."
msgstr ""
+msgid "Eligible users"
+msgstr ""
+
msgid "Email"
msgstr ""
@@ -12648,6 +12850,9 @@ msgstr ""
msgid "Enable"
msgstr ""
+msgid "Enable Amazon EKS integration"
+msgstr ""
+
msgid "Enable Auto DevOps"
msgstr ""
@@ -12681,6 +12886,9 @@ msgstr ""
msgid "Enable SSL verification"
msgstr ""
+msgid "Enable Service Ping"
+msgstr ""
+
msgid "Enable Snowplow tracking"
msgstr ""
@@ -12711,6 +12919,9 @@ msgstr ""
msgid "Enable authenticated Git LFS request rate limit"
msgstr ""
+msgid "Enable authenticated web request rate limit"
+msgstr ""
+
msgid "Enable authentication"
msgstr ""
@@ -12771,7 +12982,7 @@ msgstr ""
msgid "Enable or disable the Pseudonymizer data collection."
msgstr ""
-msgid "Enable or disable version check and service ping."
+msgid "Enable or disable version check and Service Ping."
msgstr ""
msgid "Enable protected paths rate limit"
@@ -12783,18 +12994,12 @@ msgstr ""
msgid "Enable reCAPTCHA"
msgstr ""
-msgid "Enable reCAPTCHA for login"
-msgstr ""
-
-msgid "Enable reCAPTCHA, Invisible Captcha, Akismet and set IP limits. For reCAPTCHA, we currently only support %{recaptcha_v2_link_start}v2%{recaptcha_v2_link_end}"
+msgid "Enable reCAPTCHA for login."
msgstr ""
msgid "Enable repository checks"
msgstr ""
-msgid "Enable service ping"
-msgstr ""
-
msgid "Enable shared runners for all projects and subgroups in this group."
msgstr ""
@@ -12816,7 +13021,10 @@ msgstr ""
msgid "Enable unauthenticated API request rate limit"
msgstr ""
-msgid "Enable unauthenticated request rate limit"
+msgid "Enable unauthenticated web request rate limit"
+msgstr ""
+
+msgid "Enable user deactivation emails"
msgstr ""
msgid "Enable version check"
@@ -12852,9 +13060,6 @@ msgstr ""
msgid "Enabled sources for code import during project creation. OmniAuth must be configured for GitHub"
msgstr ""
-msgid "Enabling this will only make licensed EE features available to projects if the project namespace's plan includes the feature or if the project is public."
-msgstr ""
-
msgid "Encountered an error while rendering: %{err}"
msgstr ""
@@ -12903,9 +13108,6 @@ msgstr ""
msgid "Enter Admin Mode"
msgstr ""
-msgid "Enter IP address range"
-msgstr ""
-
msgid "Enter a number"
msgstr ""
@@ -12918,9 +13120,6 @@ msgstr ""
msgid "Enter at least three characters to search"
msgstr ""
-msgid "Enter domain"
-msgstr ""
-
msgid "Enter in your Bitbucket Server URL and personal access token below"
msgstr ""
@@ -13107,9 +13306,6 @@ msgstr ""
msgid "Environments|Deployment %{status}"
msgstr ""
-msgid "Environments|Dismiss"
-msgstr ""
-
msgid "Environments|Enable review app"
msgstr ""
@@ -13122,9 +13318,6 @@ msgstr ""
msgid "Environments|Environments are places where code gets deployed, such as staging or production."
msgstr ""
-msgid "Environments|Help us improve environments"
-msgstr ""
-
msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
msgstr ""
@@ -13161,6 +13354,9 @@ msgstr ""
msgid "Environments|Note that this action will stop the environment, but it will %{emphasisStart}not%{emphasisEnd} have an effect on any existing deployment due to no “stop environment action†being defined in the %{ciConfigLinkStart}.gitlab-ci.yml%{ciConfigLinkEnd} file."
msgstr ""
+msgid "Environments|Open"
+msgstr ""
+
msgid "Environments|Open live environment"
msgstr ""
@@ -13200,9 +13396,6 @@ msgstr ""
msgid "Environments|Stopping %{environmentName}"
msgstr ""
-msgid "Environments|Take the survey"
-msgstr ""
-
msgid "Environments|There was an error fetching the logs. Please try again."
msgstr ""
@@ -13224,9 +13417,6 @@ msgstr ""
msgid "Environments|You don't have any environments right now"
msgstr ""
-msgid "Environments|Your feedback helps GitLab make environments better for you and other users. Participate and enter a sweepstake to win a USD 30 gift card."
-msgstr ""
-
msgid "Environments|by %{avatar}"
msgstr ""
@@ -13509,7 +13699,7 @@ msgstr ""
msgid "Error parsing CSV file. Please make sure it has"
msgstr ""
-msgid "Error rendering markdown preview"
+msgid "Error rendering Markdown preview"
msgstr ""
msgid "Error saving label update."
@@ -13557,6 +13747,9 @@ msgstr ""
msgid "Error: %{error_message}"
msgstr ""
+msgid "Error: Couldn't load some or all of the changes."
+msgstr ""
+
msgid "Error: No AWS credentials were supplied"
msgstr ""
@@ -13590,6 +13783,9 @@ msgstr ""
msgid "ErrorTracking|Enable error tracking"
msgstr ""
+msgid "ErrorTracking|Error tracking backend"
+msgstr ""
+
msgid "ErrorTracking|If you self-host Sentry, enter your Sentry instance's full URL. If you use Sentry's hosted solution, enter https://sentry.io"
msgstr ""
@@ -13623,6 +13819,12 @@ msgstr ""
msgid "Escalation policies must have at least one rule"
msgstr ""
+msgid "EscalationPolicies|%{clockIcon} IF alert is not %{alertStatus} in %{minutes}"
+msgstr ""
+
+msgid "EscalationPolicies|%{notificationIcon} THEN %{doAction} %{forScheduleOrUser}"
+msgstr ""
+
msgid "EscalationPolicies|+ Add an additional rule"
msgstr ""
@@ -13665,13 +13867,13 @@ msgstr ""
msgid "EscalationPolicies|Escalation policies"
msgstr ""
-msgid "EscalationPolicies|Escalation rules"
+msgid "EscalationPolicies|Escalation policy %{obstacle} in Project %{project}"
msgstr ""
-msgid "EscalationPolicies|Failed to load oncall-schedules"
+msgid "EscalationPolicies|Escalation rules"
msgstr ""
-msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} %{then} THEN %{doAction} %{scheduleOrUser}"
+msgid "EscalationPolicies|Failed to load oncall-schedules"
msgstr ""
msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} minutes"
@@ -13749,18 +13951,36 @@ msgstr ""
msgid "Every %{action} attempt has failed: %{job_error_message}. Please try again."
msgstr ""
+msgid "Every 3 months"
+msgstr ""
+
+msgid "Every 3 months on the %{day} at %{time} %{timezone}"
+msgstr ""
+
+msgid "Every 6 months"
+msgstr ""
+
+msgid "Every 6 months on the %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Every day"
msgstr ""
msgid "Every day (at %{time})"
msgstr ""
+msgid "Every day at %{time} %{timezone}"
+msgstr ""
+
msgid "Every month"
msgstr ""
msgid "Every month (Day %{day} at %{time})"
msgstr ""
+msgid "Every month on the %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Every three months"
msgstr ""
@@ -13777,6 +13997,15 @@ msgstr[3] ""
msgid "Every week (%{weekday} at %{time})"
msgstr ""
+msgid "Every week on %{day} at %{time} %{timezone}"
+msgstr ""
+
+msgid "Every year"
+msgstr ""
+
+msgid "Every year on %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Everyone"
msgstr ""
@@ -13813,9 +14042,6 @@ msgstr ""
msgid "Exactly one of %{attributes} is required"
msgstr ""
-msgid "Example: %{ip_address}. %{read_more_link}."
-msgstr ""
-
msgid "Example: @sub\\.company\\.com$"
msgstr ""
@@ -13882,13 +14108,13 @@ msgstr ""
msgid "Expand pipeline"
msgstr ""
-msgid "Expand sidebar"
+msgid "Expand settings section"
msgstr ""
-msgid "Expected documents: %{expected_documents}"
+msgid "Expand sidebar"
msgstr ""
-msgid "Experienced"
+msgid "Expected documents: %{expected_documents}"
msgstr ""
msgid "ExperimentSubject|Must have exactly one of User, Namespace, or Project."
@@ -14173,9 +14399,6 @@ msgstr ""
msgid "Failed to load related branches"
msgstr ""
-msgid "Failed to load sidebar lock status"
-msgstr ""
-
msgid "Failed to load stacktrace."
msgstr ""
@@ -14604,6 +14827,9 @@ msgstr ""
msgid "Files"
msgstr ""
+msgid "Files API Rate Limits"
+msgstr ""
+
msgid "Files breadcrumb"
msgstr ""
@@ -15603,6 +15829,9 @@ msgstr ""
msgid "GitLab group: %{source_link}"
msgstr ""
+msgid "GitLab informs you if a new version is available."
+msgstr ""
+
msgid "GitLab is a complete DevOps platform, delivered as a single application, fundamentally changing the way Development, Security, and Ops teams collaborate"
msgstr ""
@@ -15618,7 +15847,7 @@ msgstr ""
msgid "GitLab is open source software to collaborate on code."
msgstr ""
-msgid "GitLab is undergoing maintenance and is operating in a read-only mode."
+msgid "GitLab is undergoing maintenance and is operating in read-only mode."
msgstr ""
msgid "GitLab member or Email address"
@@ -15630,9 +15859,6 @@ msgstr ""
msgid "GitLab project export"
msgstr ""
-msgid "GitLab restart is required to apply changes."
-msgstr ""
-
msgid "GitLab single sign-on URL"
msgstr ""
@@ -15648,9 +15874,6 @@ msgstr ""
msgid "GitLab version"
msgstr ""
-msgid "GitLab will inform you if a new version is available."
-msgstr ""
-
msgid "GitLab will run a background job that will produce pseudonymized CSVs of the GitLab database that will be uploaded to your configured object storage directory."
msgstr ""
@@ -15915,9 +16138,21 @@ msgstr ""
msgid "Go to snippets"
msgstr ""
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check 'Allowed domains for sign-ups'."
+msgstr ""
+
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check 'Email restrictions for sign-ups'."
+msgstr ""
+
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check the 'Domain denylist'."
+msgstr ""
+
msgid "Go to the activity feed"
msgstr ""
+msgid "Go to the group’s 'Settings &gt; General' page, and check 'Restrict membership by email domain'."
+msgstr ""
+
msgid "Go to the milestone list"
msgstr ""
@@ -15954,6 +16189,12 @@ msgstr ""
msgid "Goal of the changes and what reviewers should be aware of"
msgstr ""
+msgid "Google Cloud"
+msgstr ""
+
+msgid "Google Cloud offers several deployment targets. Select the one most suitable for your project."
+msgstr ""
+
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
@@ -16038,9 +16279,6 @@ msgstr ""
msgid "Group ID"
msgstr ""
-msgid "Group ID: %{group_id}"
-msgstr ""
-
msgid "Group Owner must have signed in with SAML before enabling Group Managed Accounts"
msgstr ""
@@ -16215,6 +16453,12 @@ msgstr ""
msgid "GroupImport|Unable to process group import file"
msgstr ""
+msgid "GroupPage|Copy group ID"
+msgstr ""
+
+msgid "GroupPage|Group ID: %{group_id}"
+msgstr ""
+
msgid "GroupRoadmap|%{dateWord} – No end date"
msgstr ""
@@ -16269,6 +16513,9 @@ msgstr ""
msgid "GroupRoadmap|Within 3 years"
msgstr ""
+msgid "GroupSAML|\"persistent\" recommended"
+msgstr ""
+
msgid "GroupSAML|%{strongOpen}Warning%{strongClose} - Enabling %{linkStart}SSO enforcement%{linkEnd} can reduce security risks."
msgstr ""
@@ -16401,6 +16648,9 @@ msgstr ""
msgid "GroupSAML|To be able to prohibit outer forks, you first need to enforce dedicate group managed accounts."
msgstr ""
+msgid "GroupSAML|Use SAML group links to manage group membership using SAML."
+msgstr ""
+
msgid "GroupSAML|Valid SAML Response"
msgstr ""
@@ -16413,13 +16663,10 @@ msgstr ""
msgid "GroupSAML|as %{access_level}"
msgstr ""
-msgid "GroupSAML|must match stored NameID of \"%{extern_uid}\" as we use this to identify users. If the NameID changes users will be unable to sign in."
+msgid "GroupSAML|must match stored NameID of \"%{extern_uid}\" to identify user and allow sign in"
msgstr ""
-msgid "GroupSAML|should be \"persistent\""
-msgstr ""
-
-msgid "GroupSAML|should be a random persistent ID, emails are discouraged"
+msgid "GroupSAML|recommend persistent ID instead of email"
msgstr ""
msgid "GroupSelect|No matching results"
@@ -16434,9 +16681,15 @@ msgstr ""
msgid "GroupSettings|Allow project access token creation"
msgstr ""
+msgid "GroupSettings|Applied to all subgroups unless overridden by a group owner. Groups already added to the project lose access."
+msgstr ""
+
msgid "GroupSettings|Auto DevOps pipeline was updated for the group"
msgstr ""
+msgid "GroupSettings|Available only on the top-level group. Applies to all subgroups. Groups already shared with a group outside %{group} are still shared unless removed manually."
+msgstr ""
+
msgid "GroupSettings|Badges"
msgstr ""
@@ -16488,6 +16741,9 @@ msgstr ""
msgid "GroupSettings|New runners registration token has been generated!"
msgstr ""
+msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgstr ""
+
msgid "GroupSettings|Pipeline settings was updated for the group"
msgstr ""
@@ -16500,12 +16756,15 @@ msgstr ""
msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
-msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups."
+msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups"
msgstr ""
msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
msgstr ""
+msgid "GroupSettings|Prevents group members from being notified if the group is mentioned."
+msgstr ""
+
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
msgstr ""
@@ -16542,21 +16801,6 @@ msgstr ""
msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}."
msgstr ""
-msgid "GroupSettings|This setting is only available on the top-level group and it applies to all subgroups. Groups that have already been shared with a group outside %{group} will still be shared, and this access will have to be revoked manually."
-msgstr ""
-
-msgid "GroupSettings|This setting will be applied to all subgroups unless overridden by a group owner. Groups that already have access to the project will continue to have access unless removed manually."
-msgstr ""
-
-msgid "GroupSettings|This setting will override user notification preferences for all members of the group, subgroups, and projects."
-msgstr ""
-
-msgid "GroupSettings|This setting will prevent group members from being notified if the group is mentioned."
-msgstr ""
-
-msgid "GroupSettings|This setting will prevent group members from forking projects outside of the group."
-msgstr ""
-
msgid "GroupSettings|Transfer group"
msgstr ""
@@ -16674,7 +16918,7 @@ msgstr ""
msgid "GroupsNew|No import options available"
msgstr ""
-msgid "GroupsNew|Not all related objects are migrated, as %{docs_link_start}described here%{docs_link_end}. Please %{feedback_link_start}leave feedback%{feedback_link_end} on this feature."
+msgid "GroupsNew|Not all related objects are migrated. %{docs_link_start}More info%{docs_link_end}."
msgstr ""
msgid "GroupsNew|Personal access token"
@@ -16806,15 +17050,27 @@ msgstr ""
msgid "Hello %{name},"
msgstr ""
-msgid "Hello there"
-msgstr ""
-
msgid "Hello, %{name}!"
msgstr ""
msgid "Hello, %{username}!"
msgstr ""
+msgid "HelloMessage|%{handshake_emoji} Contribute to GitLab: %{contribute_link}"
+msgstr ""
+
+msgid "HelloMessage|%{magnifier_emoji} Create a new GitLab issue: %{new_issue_link}"
+msgstr ""
+
+msgid "HelloMessage|%{rocket_emoji} We like your curiosity! Help us improve GitLab by joining the team: %{jobs_page_link}"
+msgstr ""
+
+msgid "HelloMessage|Does this page need fixes or improvements? Open an issue or contribute a merge request to help make GitLab more lovable. At GitLab, everyone can contribute!"
+msgstr ""
+
+msgid "HelloMessage|Welcome to GitLab!"
+msgstr ""
+
msgid "Help"
msgstr ""
@@ -16824,13 +17080,10 @@ msgstr ""
msgid "Helps prevent bots from creating accounts."
msgstr ""
-msgid "Helps prevent bots from creating issues"
+msgid "Helps prevent bots from creating issues."
msgstr ""
-msgid "Helps prevent malicious users hide their activity"
-msgstr ""
-
-msgid "Helps reduce request volume (e.g. from crawlers or abusive bots)"
+msgid "Helps prevent malicious users hide their activity."
msgstr ""
msgid "Helps reduce request volume (for example, from crawlers or abusive bots)"
@@ -16958,6 +17211,12 @@ msgstr ""
msgid "Housekeeping, export, path, transfer, remove, archive."
msgstr ""
+msgid "How do I configure Akismet?"
+msgstr ""
+
+msgid "How do I configure it?"
+msgstr ""
+
msgid "How do I configure runners?"
msgstr ""
@@ -16979,19 +17238,25 @@ msgstr ""
msgid "How do I set up this service?"
msgstr ""
+msgid "How do I use a web terminal?"
+msgstr ""
+
+msgid "How do I use file templates?"
+msgstr ""
+
msgid "How it works"
msgstr ""
msgid "How many days need to pass between marking entity for deletion and actual removing it."
msgstr ""
-msgid "How many seconds an IP will be counted towards the limit"
+msgid "How many seconds an IP counts toward the IP address limit."
msgstr ""
-msgid "I accept the %{terms_link}"
+msgid "How the job limiter handles jobs exceeding the thresholds specified below. The 'track' mode only logs the jobs. The 'compress' mode compresses the jobs and raises an exception if the compressed size exceeds the limit."
msgstr ""
-msgid "I accept the|Terms of Service and Privacy Policy"
+msgid "I accept the %{terms_link}"
msgstr ""
msgid "I forgot my password"
@@ -17075,13 +17340,16 @@ msgstr ""
msgid "IP Address"
msgstr ""
-msgid "IP expiration time"
+msgid "IP address expiration time"
msgstr ""
-msgid "IP subnet restriction only allowed for top-level groups"
+msgid "IP address restrictions"
msgstr ""
-msgid "IPs per user"
+msgid "IP addresses per user"
+msgstr ""
+
+msgid "IP subnet restriction only allowed for top-level groups"
msgstr ""
msgid "Identifier"
@@ -17096,6 +17364,9 @@ msgstr ""
msgid "If any indexed field exceeds this limit it will be truncated to this number of characters and the rest will not be indexed or searchable. This does not apply to repository and wiki indexing. Setting this to 0 means it is unlimited."
msgstr ""
+msgid "If blank, defaults to %{code_open}Retry later%{code_close}."
+msgstr ""
+
msgid "If blank, set allowable lifetime to %{instance_level_policy_in_words}, as defined by the instance admin. Once set, existing tokens for users in this group may be revoked."
msgstr ""
@@ -17147,6 +17418,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 did not initiate these sign-in attempts, please reach out to your administrator or enable two-factor authentication (2FA) on your account."
+msgstr ""
+
msgid "If you did not initiate this change, please contact your administrator immediately."
msgstr ""
@@ -17242,10 +17516,10 @@ msgstr ""
msgid "Import Projects from Gitea"
msgstr ""
-msgid "Import a project"
+msgid "Import an exported GitLab project"
msgstr ""
-msgid "Import an exported GitLab project"
+msgid "Import and export rate limits"
msgstr ""
msgid "Import failed due to a GitHub error: %{original}"
@@ -17257,12 +17531,18 @@ msgstr ""
msgid "Import from Jira"
msgstr ""
+msgid "Import group"
+msgstr ""
+
msgid "Import group from file"
msgstr ""
msgid "Import groups"
msgstr ""
+msgid "Import history"
+msgstr ""
+
msgid "Import in progress"
msgstr ""
@@ -17326,7 +17606,25 @@ msgstr ""
msgid "Import timed out. Import took longer than %{import_jobs_expiration} seconds"
msgstr ""
-msgid "Import/Export Rate Limits"
+msgid "ImportAProjectModal|Import from a project"
+msgstr ""
+
+msgid "ImportAProjectModal|Import members from another project"
+msgstr ""
+
+msgid "ImportAProjectModal|Import project members"
+msgstr ""
+
+msgid "ImportAProjectModal|Only project members (not group members) are imported, and they get the same permissions as the project you import from."
+msgstr ""
+
+msgid "ImportAProjectModal|Successfully imported"
+msgstr ""
+
+msgid "ImportAProjectModal|Unable to import project members"
+msgstr ""
+
+msgid "ImportAProjectModal|You're importing members to the %{strongStart}%{name}%{strongEnd} project."
msgstr ""
msgid "ImportButtons|Connect repositories from"
@@ -17381,7 +17679,7 @@ msgstr[3] ""
msgid "Importing..."
msgstr ""
-msgid "Import|A repository URL usually ends in a .git suffix, although this is not required. Double check to make sure your repository URL is correct."
+msgid "Import|There is not a valid Git repository at this URL. If your HTTP repository is not publicly accessible, verify your credentials."
msgstr ""
msgid "Improve customer support with Service Desk"
@@ -17390,9 +17688,6 @@ msgstr ""
msgid "Improves Git cloning performance."
msgstr ""
-msgid "In %{time_to_now}"
-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 ""
@@ -17678,7 +17973,7 @@ msgstr ""
msgid "InProductMarketing|Start a GitLab Ultimate trial today in less than one minute, no credit card required."
msgstr ""
-msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no CC required"
+msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no credit card required"
msgstr ""
msgid "InProductMarketing|Start a trial"
@@ -17717,7 +18012,7 @@ msgstr ""
msgid "InProductMarketing|Team up in GitLab for greater efficiency"
msgstr ""
-msgid "InProductMarketing|Team work makes the dream work"
+msgid "InProductMarketing|Team work makes the dream work"
msgstr ""
msgid "InProductMarketing|Test, create, deploy"
@@ -18300,6 +18595,9 @@ msgstr ""
msgid "Integrations|Create new issue in Jira"
msgstr ""
+msgid "Integrations|Create new issue in ZenTao"
+msgstr ""
+
msgid "Integrations|Default settings are inherited from the group level."
msgstr ""
@@ -18393,9 +18691,15 @@ msgstr ""
msgid "Integrations|Search Jira issues"
msgstr ""
+msgid "Integrations|Search ZenTao issues"
+msgstr ""
+
msgid "Integrations|Send notifications about project events to Unify Circuit."
msgstr ""
+msgid "Integrations|Send notifications about project events to a Unify Circuit conversation. %{docs_link}"
+msgstr ""
+
msgid "Integrations|Sign in to add namespaces"
msgstr ""
@@ -18435,6 +18739,9 @@ msgstr ""
msgid "Integrations|You've activated every integration 🎉"
msgstr ""
+msgid "Integrations|ZenTao issues display here when you create issues in your project in ZenTao."
+msgstr ""
+
msgid "Interactive mode"
msgstr ""
@@ -18462,9 +18769,6 @@ msgstr ""
msgid "Interval Pattern"
msgstr ""
-msgid "Introducing Value Stream Analytics"
-msgstr ""
-
msgid "Introducing Your DevOps Report"
msgstr ""
@@ -18561,6 +18865,12 @@ msgstr ""
msgid "Investigate vulnerability: %{title}"
msgstr ""
+msgid "Invisible Captcha"
+msgstr ""
+
+msgid "Invisible Captcha helps prevent the creation of spam accounts. It adds a honeypot field and time-sensitive form submission to the account signup form."
+msgstr ""
+
msgid "Invitation"
msgstr ""
@@ -19014,12 +19324,18 @@ msgstr ""
msgid "Issues"
msgstr ""
+msgid "Issues I've created"
+msgstr ""
+
msgid "Issues Rate Limits"
msgstr ""
msgid "Issues and merge requests"
msgstr ""
+msgid "Issues assigned to me"
+msgstr ""
+
msgid "Issues can be bugs, tasks or ideas to be discussed. Also, issues are searchable and filterable."
msgstr ""
@@ -19131,7 +19447,7 @@ msgstr ""
msgid "Iterations|Create cadence"
msgstr ""
-msgid "Iterations|Create your first iteration"
+msgid "Iterations|Create iteration"
msgstr ""
msgid "Iterations|Delete cadence"
@@ -19140,6 +19456,9 @@ msgstr ""
msgid "Iterations|Delete iteration cadence?"
msgstr ""
+msgid "Iterations|Delete iteration?"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -19173,12 +19492,18 @@ msgstr ""
msgid "Iterations|New iteration cadence"
msgstr ""
+msgid "Iterations|No closed iterations."
+msgstr ""
+
msgid "Iterations|No iteration cadences to show."
msgstr ""
msgid "Iterations|No iterations in cadence."
msgstr ""
+msgid "Iterations|No open iterations."
+msgstr ""
+
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
@@ -19209,6 +19534,9 @@ msgstr ""
msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
msgstr ""
+msgid "Iterations|This will remove the iteration from any issues that are assigned to it."
+msgstr ""
+
msgid "Iterations|Title"
msgstr ""
@@ -19224,15 +19552,9 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "I’m familiar with the basics of DevOps."
-msgstr ""
-
msgid "I’m joining my team who’s already on GitLab"
msgstr ""
-msgid "I’m not familiar with the basics of DevOps."
-msgstr ""
-
msgid "Jaeger URL"
msgstr ""
@@ -19497,6 +19819,9 @@ msgstr ""
msgid "Job"
msgstr ""
+msgid "Job %{jobName}"
+msgstr ""
+
msgid "Job Failed #%{build_id}"
msgstr ""
@@ -20089,9 +20414,6 @@ msgstr ""
msgid "Learn more in the"
msgstr ""
-msgid "Learn more in the|pipeline schedules documentation"
-msgstr ""
-
msgid "Learn more."
msgstr ""
@@ -20203,9 +20525,6 @@ msgstr ""
msgid "Leave Admin Mode"
msgstr ""
-msgid "Leave blank for no limit. Once set, existing personal access tokens may be revoked."
-msgstr ""
-
msgid "Leave edit mode? All unsaved changes will be lost."
msgstr ""
@@ -20251,10 +20570,10 @@ msgstr ""
msgid "LicenseCompliance|Acceptable license to be used in the project"
msgstr ""
-msgid "LicenseCompliance|Add a license"
+msgid "LicenseCompliance|Add license and related policy"
msgstr ""
-msgid "LicenseCompliance|Add license and related policy"
+msgid "LicenseCompliance|Add license policy"
msgstr ""
msgid "LicenseCompliance|Allow"
@@ -20356,6 +20675,9 @@ msgstr ""
msgid "LicenseManagement|Uncategorized"
msgstr ""
+msgid "Licensed Enterprise Edition features can be used if the project namespace's plan includes the feature, or if the project is public."
+msgstr ""
+
msgid "Licensed Features"
msgstr ""
@@ -20422,7 +20744,10 @@ msgstr ""
msgid "Limit namespaces and projects that can be indexed"
msgstr ""
-msgid "Limit sign in from multiple ips"
+msgid "Limit project size at a global, group, and project level. %{link_start}Learn more%{link_end}."
+msgstr ""
+
+msgid "Limit sign in from multiple IP addresses"
msgstr ""
msgid "Limit the number of concurrent operations this secondary site can run in the background."
@@ -20434,6 +20759,9 @@ msgstr ""
msgid "Limit the number of issues and epics per minute a user can create through web and API requests."
msgstr ""
+msgid "Limit the size of Sidekiq jobs stored in Redis."
+msgstr ""
+
msgid "Limited to showing %d event at most"
msgid_plural "Limited to showing %d events at most"
msgstr[0] ""
@@ -20441,6 +20769,9 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "Limiting mode"
+msgstr ""
+
msgid "Line changes"
msgstr ""
@@ -20510,9 +20841,6 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
-msgid "List of users to be excluded from the limit"
-msgstr ""
-
msgid "List options"
msgstr ""
@@ -20552,9 +20880,6 @@ msgstr ""
msgid "Loading functions timed out. Please reload the page to try again."
msgstr ""
-msgid "Loading issues"
-msgstr ""
-
msgid "Loading more"
msgstr ""
@@ -20846,6 +21171,9 @@ msgstr ""
msgid "Marked For Deletion At - %{deletion_time}"
msgstr ""
+msgid "Marked as ready. Merging is now allowed."
+msgstr ""
+
msgid "Marked this %{noun} as a draft."
msgstr ""
@@ -20918,52 +21246,22 @@ msgstr ""
msgid "Max 100,000 events"
msgstr ""
-msgid "Max 20 characters"
-msgstr ""
-
-msgid "Max Group Export Download requests per minute per user"
-msgstr ""
-
-msgid "Max Group Export requests per minute per user"
-msgstr ""
-
-msgid "Max Group Import requests per minute per user"
-msgstr ""
-
-msgid "Max Project Export Download requests per minute per user"
-msgstr ""
-
-msgid "Max Project Export requests per minute per user"
-msgstr ""
-
-msgid "Max Project Import requests per minute per user"
-msgstr ""
-
-msgid "Max authenticated API requests per period per user"
-msgstr ""
-
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
-msgid "Max authenticated web requests per period per user"
-msgstr ""
-
msgid "Max file size is 200 KB."
msgstr ""
-msgid "Max requests per minute per user"
-msgstr ""
-
msgid "Max role"
msgstr ""
msgid "Max session time"
msgstr ""
-msgid "Max unauthenticated requests per period per IP"
+msgid "MaxBuilds"
msgstr ""
-msgid "MaxBuilds"
+msgid "Maximum 20 characters"
msgstr ""
msgid "Maximum Conan package file size in bytes"
@@ -20999,6 +21297,12 @@ msgstr ""
msgid "Maximum attachment size (MB)"
msgstr ""
+msgid "Maximum authenticated API requests per rate limit period per user"
+msgstr ""
+
+msgid "Maximum authenticated web requests per rate limit period per user"
+msgstr ""
+
msgid "Maximum bulk request size (MiB)"
msgstr ""
@@ -21044,6 +21348,15 @@ msgstr ""
msgid "Maximum files in a diff"
msgstr ""
+msgid "Maximum group export download requests per minute"
+msgstr ""
+
+msgid "Maximum group export requests per minute"
+msgstr ""
+
+msgid "Maximum group import requests per minute"
+msgstr ""
+
msgid "Maximum import size"
msgstr ""
@@ -21080,7 +21393,7 @@ msgstr ""
msgid "Maximum number of projects."
msgstr ""
-msgid "Maximum number of unique IPs per user"
+msgid "Maximum number of unique IP addresses per user."
msgstr ""
msgid "Maximum page reached"
@@ -21089,12 +21402,24 @@ msgstr ""
msgid "Maximum page size"
msgstr ""
+msgid "Maximum project export download requests per minute"
+msgstr ""
+
+msgid "Maximum project export requests per minute"
+msgstr ""
+
+msgid "Maximum project import requests per minute"
+msgstr ""
+
msgid "Maximum push size"
msgstr ""
msgid "Maximum push size (MB)"
msgstr ""
+msgid "Maximum requests per minute"
+msgstr ""
+
msgid "Maximum running slices"
msgstr ""
@@ -21122,10 +21447,16 @@ msgstr ""
msgid "Maximum time between updates that a mirror can have when scheduled to synchronize."
msgstr ""
-msgid "Maximum time for web terminal websocket connection (in seconds). 0 for unlimited."
+msgid "Maximum time that users are allowed to skip the setup of two-factor authentication (in hours). Set to 0 (zero) to enforce at next sign in."
msgstr ""
-msgid "Maximum time that users are allowed to skip the setup of two-factor authentication (in hours). Set to 0 (zero) to enforce at next sign in."
+msgid "Maximum time, in seconds, for a web terminal websocket connection. 0 for unlimited."
+msgstr ""
+
+msgid "Maximum unauthenticated API requests per rate limit period per IP"
+msgstr ""
+
+msgid "Maximum unauthenticated web requests per rate limit period per IP"
msgstr ""
msgid "May"
@@ -21143,9 +21474,6 @@ msgstr ""
msgid "Medium vulnerabilities present"
msgstr ""
-msgid "Member lock"
-msgstr ""
-
msgid "Member since"
msgstr ""
@@ -21182,6 +21510,9 @@ msgstr ""
msgid "Members of a group may only view projects they have permission to access"
msgstr ""
+msgid "Membership"
+msgstr ""
+
msgid "Members|%{time} by %{user}"
msgstr ""
@@ -21242,9 +21573,6 @@ msgstr ""
msgid "Members|Expiration date updated successfully."
msgstr ""
-msgid "Members|Expired"
-msgstr ""
-
msgid "Members|Filter members"
msgstr ""
@@ -21260,9 +21588,6 @@ msgstr ""
msgid "Members|Membership"
msgstr ""
-msgid "Members|No expiration set"
-msgstr ""
-
msgid "Members|Remove \"%{groupName}\""
msgstr ""
@@ -21284,9 +21609,6 @@ msgstr ""
msgid "Members|Search invited"
msgstr ""
-msgid "Members|in %{time}"
-msgstr ""
-
msgid "Member|Deny access"
msgstr ""
@@ -21362,9 +21684,6 @@ msgstr ""
msgid "Merge request %{mr_link} was reviewed by %{mr_author}"
msgstr ""
-msgid "Merge request (MR) approvals"
-msgstr ""
-
msgid "Merge request analytics"
msgstr ""
@@ -21386,12 +21705,21 @@ msgstr ""
msgid "Merge requests"
msgstr ""
+msgid "Merge requests I've created"
+msgstr ""
+
msgid "Merge requests are a place to propose changes you've made to a project and discuss those changes with others"
msgstr ""
msgid "Merge requests are read-only in a secondary Geo node"
msgstr ""
+msgid "Merge requests assigned to me"
+msgstr ""
+
+msgid "Merge requests that I'm a reviewer"
+msgstr ""
+
msgid "Merge the branch and fix any conflicts that come up"
msgstr ""
@@ -21452,10 +21780,10 @@ msgstr ""
msgid "MergeRequests|An error occurred while saving the draft comment."
msgstr ""
-msgid "MergeRequests|Failed to squash. Should be done manually."
+msgid "MergeRequests|Create issue to resolve thread"
msgstr ""
-msgid "MergeRequests|Resolve this thread in a new issue"
+msgid "MergeRequests|Failed to squash. Should be done manually."
msgstr ""
msgid "MergeRequests|Saving the comment failed"
@@ -22273,6 +22601,9 @@ msgstr ""
msgid "MoveIssue|Cannot move issue to project it originates from!"
msgstr ""
+msgid "MoveIssue|Cannot move issues of '%{issue_type}' type."
+msgstr ""
+
msgid "Moved issue to %{label} column in the board."
msgstr ""
@@ -22400,6 +22731,15 @@ 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. To learn more about reducing storage capacity please visit our docs."
msgstr ""
+msgid "NamespaceUserCap|Pending users must be reviewed and approved by a group owner. Learn more about %{user_caps_link_start}User Caps%{link_end} and %{users_pending_approval_link_start}Users Pending Approval%{link_end}."
+msgstr ""
+
+msgid "NamespaceUserCap|View pending user approvals"
+msgstr ""
+
+msgid "NamespaceUserCap|Your group has reached its billable member limit"
+msgstr ""
+
msgid "Namespaces"
msgstr ""
@@ -22442,9 +22782,6 @@ msgstr ""
msgid "Network"
msgstr ""
-msgid "Network Policy|New rule"
-msgstr ""
-
msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is inbound from a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
msgstr ""
@@ -22466,16 +22803,13 @@ msgstr ""
msgid "NetworkPolicies|%{strongOpen}any%{strongClose} port"
msgstr ""
-msgid "NetworkPolicies|+ Add alert"
-msgstr ""
-
msgid "NetworkPolicies|.yaml"
msgstr ""
msgid "NetworkPolicies|.yaml mode"
msgstr ""
-msgid "NetworkPolicies|Actions"
+msgid "NetworkPolicies|Add alert"
msgstr ""
msgid "NetworkPolicies|Alerts are intended to be selectively used for a limited number of events that are potentially concerning and warrant a manual review. Alerts should not be used as a substitute for a SIEM or a logging tool. High volume alerts are likely to be dropped so as to preserve the stability of GitLab's integration with Kubernetes."
@@ -22511,9 +22845,6 @@ msgstr ""
msgid "NetworkPolicies|Deny all traffic"
msgstr ""
-msgid "NetworkPolicies|Description"
-msgstr ""
-
msgid "NetworkPolicies|Edit policy"
msgstr ""
@@ -22526,9 +22857,6 @@ msgstr ""
msgid "NetworkPolicies|IP/subnet"
msgstr ""
-msgid "NetworkPolicies|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
-msgstr ""
-
msgid "NetworkPolicies|Invalid or empty policy"
msgstr ""
@@ -22538,19 +22866,16 @@ msgstr ""
msgid "NetworkPolicies|Kubernetes error: %{error}"
msgstr ""
-msgid "NetworkPolicies|Name"
-msgstr ""
-
msgid "NetworkPolicies|Network"
msgstr ""
-msgid "NetworkPolicies|Network traffic"
+msgid "NetworkPolicies|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
msgstr ""
-msgid "NetworkPolicies|New policy"
+msgid "NetworkPolicies|Network policy can be created after the environment is loaded successfully."
msgstr ""
-msgid "NetworkPolicies|No policies detected"
+msgid "NetworkPolicies|Network traffic"
msgstr ""
msgid "NetworkPolicies|None selected"
@@ -22559,21 +22884,12 @@ msgstr ""
msgid "NetworkPolicies|Please %{installLinkStart}install%{installLinkEnd} and %{configureLinkStart}configure a Kubernetes Agent for this project%{configureLinkEnd} to enable alerts."
msgstr ""
-msgid "NetworkPolicies|Policies are a specification of how groups of pods are allowed to communicate with each other's network endpoints."
-msgstr ""
-
msgid "NetworkPolicies|Policy %{policyName} was successfully changed"
msgstr ""
msgid "NetworkPolicies|Policy definition"
msgstr ""
-msgid "NetworkPolicies|Policy editor"
-msgstr ""
-
-msgid "NetworkPolicies|Policy preview"
-msgstr ""
-
msgid "NetworkPolicies|Rule"
msgstr ""
@@ -22583,9 +22899,6 @@ msgstr ""
msgid "NetworkPolicies|Rule mode is unavailable for this policy. In some cases, we cannot parse the YAML file back into the rules editor."
msgstr ""
-msgid "NetworkPolicies|Rules"
-msgstr ""
-
msgid "NetworkPolicies|Save changes"
msgstr ""
@@ -22598,9 +22911,6 @@ msgstr ""
msgid "NetworkPolicies|Traffic that does not match any rule will be blocked."
msgstr ""
-msgid "NetworkPolicies|Unable to parse policy"
-msgstr ""
-
msgid "NetworkPolicies|all DNS names"
msgstr ""
@@ -22782,6 +23092,9 @@ msgstr ""
msgid "New issue"
msgstr ""
+msgid "New issue in %{project}"
+msgstr ""
+
msgid "New issue title"
msgstr ""
@@ -22860,7 +23173,7 @@ msgstr ""
msgid "Newest first"
msgstr ""
-msgid "Newly registered users will by default be external"
+msgid "Newly-registered users are external by default"
msgstr ""
msgid "Next"
@@ -23175,8 +23488,12 @@ msgstr ""
msgid "No webhooks found, add one in the form above."
msgstr ""
-msgid "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} to renew your subscription."
-msgstr ""
+msgid "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} day to renew your subscription."
+msgid_plural "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} days to renew your subscription."
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
msgid "No. of commits"
msgstr ""
@@ -23193,7 +23510,7 @@ msgstr ""
msgid "Nodes"
msgstr ""
-msgid "Non-admin users can sign in with read-only access and make read-only API requests."
+msgid "Non-admin users are restricted to read-only access, in both GitLab UI and API."
msgstr ""
msgid "None"
@@ -23274,7 +23591,7 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
-msgid "Notes Rate Limits"
+msgid "Notes rate limit"
msgstr ""
msgid "Notes|Are you sure you want to cancel creating this comment?"
@@ -23449,9 +23766,6 @@ msgstr ""
msgid "November"
msgstr ""
-msgid "Novice"
-msgstr ""
-
msgid "Now, personalize your GitLab experience"
msgstr ""
@@ -23620,7 +23934,7 @@ msgstr ""
msgid "OnCallSchedules|For this rotation, on-call will be:"
msgstr ""
-msgid "OnCallSchedules|On-call schedule %{schedule} in Project %{project}"
+msgid "OnCallSchedules|On-call schedule %{obstacle} in Project %{project}"
msgstr ""
msgid "OnCallSchedules|On-call schedules"
@@ -23767,22 +24081,22 @@ msgstr ""
msgid "OnDemandScans|Scanner profile"
msgstr ""
-msgid "OnDemandScans|Select one of the existing profiles"
+msgid "OnDemandScans|Schedule scan"
msgstr ""
-msgid "OnDemandScans|Site profile"
+msgid "OnDemandScans|Select one of the existing profiles"
msgstr ""
-msgid "OnDemandScans|Use existing scanner profile"
+msgid "OnDemandScans|Site profile"
msgstr ""
-msgid "OnDemandScans|Use existing site profile"
+msgid "OnDemandScans|Start time"
msgstr ""
-msgid "OnDemandScans|You can either choose a passive scan or validate the target site in your chosen site profile. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
+msgid "OnDemandScans|Use existing scanner profile"
msgstr ""
-msgid "OnDemandScans|You cannot run an active scan against an unvalidated site."
+msgid "OnDemandScans|Use existing site profile"
msgstr ""
msgid "OnDemandScans|You must create a repository within your project to run an on-demand scan."
@@ -23849,6 +24163,9 @@ msgstr ""
msgid "Only admins can delete project"
msgstr ""
+msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
+msgstr ""
+
msgid "Only include features new to your current subscription tier."
msgstr ""
@@ -23867,6 +24184,12 @@ msgstr ""
msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
+msgid "Only reCAPTCHA v2 is supported:"
+msgstr ""
+
+msgid "Only users from the specified IP address ranges are able to reach this group, including all subgroups, projects, and Git repositories."
+msgstr ""
+
msgid "Only verified users with an email address in any of these domains can be added to the group."
msgstr ""
@@ -24053,9 +24376,6 @@ msgstr ""
msgid "Package Registry"
msgstr ""
-msgid "Package Registry Rate Limits"
-msgstr ""
-
msgid "Package Registry: authenticated API requests"
msgstr ""
@@ -24074,6 +24394,9 @@ msgstr ""
msgid "Package recipe already exists"
msgstr ""
+msgid "Package registry rate limits"
+msgstr ""
+
msgid "Package type"
msgstr ""
@@ -24140,6 +24463,9 @@ msgstr ""
msgid "PackageRegistry|Composer"
msgstr ""
+msgid "PackageRegistry|Composer.json with license: %{license} and version: %{version}"
+msgstr ""
+
msgid "PackageRegistry|Conan"
msgstr ""
@@ -24203,6 +24529,9 @@ msgstr ""
msgid "PackageRegistry|Copy require package include"
msgstr ""
+msgid "PackageRegistry|Copy target SHA"
+msgstr ""
+
msgid "PackageRegistry|Copy yarn command"
msgstr ""
@@ -24269,6 +24598,9 @@ msgstr ""
msgid "PackageRegistry|Install package version"
msgstr ""
+msgid "PackageRegistry|Instance-level"
+msgstr ""
+
msgid "PackageRegistry|Invalid Package: failed metadata extraction"
msgstr ""
@@ -24314,6 +24646,9 @@ msgstr ""
msgid "PackageRegistry|Pip Command"
msgstr ""
+msgid "PackageRegistry|Project-level"
+msgstr ""
+
msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
msgstr ""
@@ -24335,6 +24670,9 @@ msgstr ""
msgid "PackageRegistry|Remove package"
msgstr ""
+msgid "PackageRegistry|Required Python: %{pythonVersion}"
+msgstr ""
+
msgid "PackageRegistry|RubyGems"
msgstr ""
@@ -24377,6 +24715,9 @@ msgstr ""
msgid "PackageRegistry|Source project located at %{link}"
msgstr ""
+msgid "PackageRegistry|Target SHA: %{sha}"
+msgstr ""
+
msgid "PackageRegistry|There are no other versions of this package."
msgstr ""
@@ -24545,6 +24886,18 @@ msgstr ""
msgid "Password was successfully updated. Please sign in again."
msgstr ""
+msgid "PasswordPrompt|Confirm password"
+msgstr ""
+
+msgid "PasswordPrompt|Confirm password to continue"
+msgstr ""
+
+msgid "PasswordPrompt|Password is required"
+msgstr ""
+
+msgid "PasswordPrompt|Please enter your password to confirm"
+msgstr ""
+
msgid "Passwords should be unique and not used for any other sites or services."
msgstr ""
@@ -24572,6 +24925,9 @@ msgstr ""
msgid "Paste project path (i.e. gitlab-org/gitlab)"
msgstr ""
+msgid "Paste this DSN into your Sentry SDK"
+msgstr ""
+
msgid "Paste your public SSH key, which is usually contained in the file '~/.ssh/id_ed25519.pub' or '~/.ssh/id_rsa.pub' and begins with 'ssh-ed25519' or 'ssh-rsa'. Do not paste your private SSH key, as that can compromise your identity."
msgstr ""
@@ -24656,6 +25012,9 @@ msgstr ""
msgid "PerformanceBar|First Contentful Paint"
msgstr ""
+msgid "PerformanceBar|Flamegraph with mode:"
+msgstr ""
+
msgid "PerformanceBar|Frontend resources"
msgstr ""
@@ -24689,6 +25048,15 @@ msgstr ""
msgid "PerformanceBar|Trace"
msgstr ""
+msgid "PerformanceBar|cpu"
+msgstr ""
+
+msgid "PerformanceBar|object"
+msgstr ""
+
+msgid "PerformanceBar|wall"
+msgstr ""
+
msgid "Period in seconds"
msgstr ""
@@ -24917,6 +25285,48 @@ msgstr ""
msgid "PipelineSchedules|Variables"
msgstr ""
+msgid "PipelineSource|API"
+msgstr ""
+
+msgid "PipelineSource|Chat"
+msgstr ""
+
+msgid "PipelineSource|External"
+msgstr ""
+
+msgid "PipelineSource|External Pull Request"
+msgstr ""
+
+msgid "PipelineSource|Merge Request"
+msgstr ""
+
+msgid "PipelineSource|On-Demand DAST Scan"
+msgstr ""
+
+msgid "PipelineSource|On-Demand DAST Validation"
+msgstr ""
+
+msgid "PipelineSource|Parent Pipeline"
+msgstr ""
+
+msgid "PipelineSource|Pipeline"
+msgstr ""
+
+msgid "PipelineSource|Push"
+msgstr ""
+
+msgid "PipelineSource|Schedule"
+msgstr ""
+
+msgid "PipelineSource|Trigger"
+msgstr ""
+
+msgid "PipelineSource|Web"
+msgstr ""
+
+msgid "PipelineSource|Web IDE"
+msgstr ""
+
msgid "PipelineStatusTooltip|Pipeline: %{ciStatus}"
msgstr ""
@@ -25217,46 +25627,7 @@ msgstr ""
msgid "Pipeline|Source"
msgstr ""
-msgid "Pipeline|Source|API"
-msgstr ""
-
-msgid "Pipeline|Source|Chat"
-msgstr ""
-
-msgid "Pipeline|Source|External"
-msgstr ""
-
-msgid "Pipeline|Source|External Pull Request"
-msgstr ""
-
-msgid "Pipeline|Source|Merge Request"
-msgstr ""
-
-msgid "Pipeline|Source|On-Demand DAST Scan"
-msgstr ""
-
-msgid "Pipeline|Source|On-Demand DAST Validation"
-msgstr ""
-
-msgid "Pipeline|Source|Parent Pipeline"
-msgstr ""
-
-msgid "Pipeline|Source|Pipeline"
-msgstr ""
-
-msgid "Pipeline|Source|Push"
-msgstr ""
-
-msgid "Pipeline|Source|Schedule"
-msgstr ""
-
-msgid "Pipeline|Source|Trigger"
-msgstr ""
-
-msgid "Pipeline|Source|Web"
-msgstr ""
-
-msgid "Pipeline|Source|Web IDE"
+msgid "Pipeline|Source|Security Policy"
msgstr ""
msgid "Pipeline|Specify variable values to be used in this run. The values specified in %{linkStart}CI/CD settings%{linkEnd} will be used by default."
@@ -25307,7 +25678,7 @@ msgstr ""
msgid "Pipeline|We are currently unable to fetch pipeline data"
msgstr ""
-msgid "Pipeline|You’re about to stop pipeline %{pipelineId}."
+msgid "Pipeline|You’re about to stop pipeline #%{pipelineId}."
msgstr ""
msgid "Pipeline|for"
@@ -25334,6 +25705,9 @@ msgstr ""
msgid "Plain diff"
msgstr ""
+msgid "Plain-text response to send to clients that hit a rate limit"
+msgstr ""
+
msgid "Plan:"
msgstr ""
@@ -25478,9 +25852,6 @@ msgstr ""
msgid "Please provide attributes to update"
msgstr ""
-msgid "Please provide your username or email address."
-msgstr ""
-
msgid "Please reach out if you have any questions and we'll be happy to assist."
msgstr ""
@@ -25523,9 +25894,6 @@ msgstr ""
msgid "Please set a new password before proceeding."
msgstr ""
-msgid "Please share your feedback about %{featureName} %{linkStart}in this issue%{linkEnd} to help us improve the experience."
-msgstr ""
-
msgid "Please solve the captcha"
msgstr ""
@@ -25703,6 +26071,9 @@ msgstr ""
msgid "Prevent adding new members to project membership within this group"
msgstr ""
+msgid "Prevent auto-stopping"
+msgstr ""
+
msgid "Prevent editing approval rules in projects and merge requests."
msgstr ""
@@ -25715,7 +26086,7 @@ msgstr ""
msgid "Prevent users from changing their profile name"
msgstr ""
-msgid "Prevent users from performing write operations on GitLab while performing maintenance."
+msgid "Prevent users from performing write operations while GitLab maintenance is in progress."
msgstr ""
msgid "Preview"
@@ -25988,6 +26359,9 @@ msgstr ""
msgid "Profiles|Enter your name, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Enter your password to confirm the email change"
+msgstr ""
+
msgid "Profiles|Enter your pronouns to let people know how to refer to you"
msgstr ""
@@ -26222,10 +26596,10 @@ msgstr ""
msgid "Profiles|e.g. My MacBook key"
msgstr ""
-msgid "Profiles|username"
+msgid "Profiles|https://website.com"
msgstr ""
-msgid "Profiles|website.com"
+msgid "Profiles|username"
msgstr ""
msgid "Profiles|your account"
@@ -26468,9 +26842,21 @@ msgstr ""
msgid "ProjectSelect| or group"
msgstr ""
+msgid "ProjectSelect|No matching results"
+msgstr ""
+
msgid "ProjectSelect|Search for project"
msgstr ""
+msgid "ProjectSelect|Search projects"
+msgstr ""
+
+msgid "ProjectSelect|Select a project"
+msgstr ""
+
+msgid "ProjectSelect|There was an error fetching the projects. Please try again."
+msgstr ""
+
msgid "ProjectService|Drone server URL"
msgstr ""
@@ -26558,6 +26944,9 @@ msgstr ""
msgid "ProjectService|Trigger event when a new, unique alert is recorded."
msgstr ""
+msgid "ProjectService|Trigger event when a new, unique vulnerability is recorded. (Note: This feature requires an Ultimate plan.)"
+msgstr ""
+
msgid "ProjectService|Trigger event when a pipeline status changes."
msgstr ""
@@ -26972,9 +27361,15 @@ msgstr ""
msgid "Projects are graded based on the highest severity vulnerability present"
msgstr ""
+msgid "Projects are organized into groups"
+msgstr ""
+
msgid "Projects contributed to"
msgstr ""
+msgid "Projects help you organize your work. They contain your file repository, issues, merge requests, and so much more."
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr ""
@@ -27209,10 +27604,10 @@ msgstr ""
msgid "PrometheusService|Prometheus cluster integration"
msgstr ""
-msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
+msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
msgstr ""
-msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
+msgid "PrometheusService|The ID of the IAP-secured resource."
msgstr ""
msgid "PrometheusService|The Prometheus API base URL."
@@ -27830,6 +28225,9 @@ msgstr ""
msgid "Rate limit"
msgstr ""
+msgid "Rate limits can help reduce request volume (like from crawlers or abusive bots)."
+msgstr ""
+
msgid "Raw blob request rate limit per minute"
msgstr ""
@@ -27842,6 +28240,9 @@ msgstr ""
msgid "Re-authentication required"
msgstr ""
+msgid "Re-import"
+msgstr ""
+
msgid "Re-request review"
msgstr ""
@@ -27863,6 +28264,9 @@ msgstr ""
msgid "Read more about related issues"
msgstr ""
+msgid "Read their documentation."
+msgstr ""
+
msgid "Ready to get started with GitLab? Follow these steps to set up your workspace, plan and commit changes, and deploy your project."
msgstr ""
@@ -27896,6 +28300,9 @@ msgstr ""
msgid "Receive any notifications from GitLab."
msgstr ""
+msgid "Receive notification of abuse reports by email."
+msgstr ""
+
msgid "Receive notifications about your own activity"
msgstr ""
@@ -28041,9 +28448,6 @@ msgstr ""
msgid "Registry setup"
msgstr ""
-msgid "Regulate approvals by authors/committers. Affects all projects."
-msgstr ""
-
msgid "Reindexing Status: %{status} (Slice multiplier: %{multiplier}, Maximum running slices: %{max_slices})"
msgstr ""
@@ -28141,6 +28545,9 @@ msgstr ""
msgid "Release|Something went wrong while saving the release details."
msgstr ""
+msgid "Reload page"
+msgstr ""
+
msgid "Remediations"
msgstr ""
@@ -28423,6 +28830,9 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
+msgid "Repeats"
+msgstr ""
+
msgid "Replace"
msgstr ""
@@ -28581,7 +28991,7 @@ msgid "Reports|Test summary"
msgstr ""
msgid "Reports|Test summary failed loading results"
-msgstr "Reports|Podsumowanie testu nie załadowało wyników"
+msgstr ""
msgid "Reports|Test summary results are being parsed"
msgstr "Wyniki podsumowania testu sÄ… analizowane"
@@ -28793,10 +29203,7 @@ msgstr ""
msgid "Require additional authentication for administrative tasks."
msgstr ""
-msgid "Require all users in this group to setup Two-factor authentication"
-msgstr ""
-
-msgid "Require all users in this group to setup two-factor authentication"
+msgid "Require all users in this group to set up two-factor authentication"
msgstr ""
msgid "Required approvals (%{approvals_given} given)"
@@ -28846,6 +29253,9 @@ msgstr[3] ""
msgid "Requires values to meet regular expression requirements."
msgstr ""
+msgid "Requires you to deploy or set up cloud-hosted Sentry."
+msgstr ""
+
msgid "Requires your primary GitLab email address."
msgstr ""
@@ -28906,9 +29316,6 @@ msgstr ""
msgid "Resolve"
msgstr ""
-msgid "Resolve all threads in new issue"
-msgstr ""
-
msgid "Resolve conflicts"
msgstr ""
@@ -28966,6 +29373,9 @@ msgstr "Metryki odpowiedzi (NGINX)"
msgid "Response text"
msgstr ""
+msgid "Restart GitLab to apply changes."
+msgstr ""
+
msgid "Restart Terminal"
msgstr ""
@@ -28984,6 +29394,9 @@ msgstr ""
msgid "Restoring the project will prevent the project from being removed on this date and restore people's ability to make changes to it."
msgstr ""
+msgid "Restrict group access by IP address. %{link_start}Learn more%{link_end}."
+msgstr ""
+
msgid "Restrict membership by email domain"
msgstr ""
@@ -29301,6 +29714,9 @@ msgstr ""
msgid "Runners|Runner #%{runner_id}"
msgstr ""
+msgid "Runners|Runner assigned to project."
+msgstr ""
+
msgid "Runners|Runner is offline, last contact was %{runner_contact} ago"
msgstr ""
@@ -29313,6 +29729,9 @@ msgstr ""
msgid "Runners|Runner registration"
msgstr ""
+msgid "Runners|Runner unassigned from project."
+msgstr ""
+
msgid "Runners|Runners"
msgstr ""
@@ -29505,7 +29924,7 @@ msgstr ""
msgid "SastEntryPoints|How do I set up SAST?"
msgstr ""
-msgid "SastEntryPoints|Learn more."
+msgid "SastEntryPoints|Learn more"
msgstr ""
msgid "Satisfied"
@@ -29547,7 +29966,7 @@ msgstr ""
msgid "Save pipeline schedule"
msgstr ""
-msgid "Save space and find images in the container Registry. remove unneeded tags and keep only the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
+msgid "Save storage space by automatically deleting tags from the container registry and keeping the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
msgstr ""
msgid "Saving"
@@ -29721,6 +30140,9 @@ msgstr ""
msgid "Search or filter results…"
msgstr ""
+msgid "Search or jump to..."
+msgstr ""
+
msgid "Search project"
msgstr ""
@@ -29781,16 +30203,16 @@ msgstr ""
msgid "SearchCodeResults|of %{link_to_project}"
msgstr ""
-msgid "SearchResults|Showing %{count} %{scope} for%{term_element}"
+msgid "SearchResults|Showing %{count} %{scope} for %{term_element}"
msgstr ""
-msgid "SearchResults|Showing %{count} %{scope} for%{term_element} in your personal and project snippets"
+msgid "SearchResults|Showing %{count} %{scope} for %{term_element} in your personal and project snippets"
msgstr ""
-msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for%{term_element}"
+msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for %{term_element}"
msgstr ""
-msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for%{term_element} in your personal and project snippets"
+msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for %{term_element} in your personal and project snippets"
msgstr ""
msgid "SearchResults|code result"
@@ -29894,6 +30316,9 @@ msgstr ""
msgid "Secret Detection"
msgstr ""
+msgid "Secret access key"
+msgstr ""
+
msgid "Secret token"
msgstr ""
@@ -29933,9 +30358,6 @@ msgstr ""
msgid "SecurityApprovals|A merge request approval is required when the license compliance report contains a denied license."
msgstr ""
-msgid "SecurityApprovals|Configurable if security scanners are enabled. %{linkStart}Learn more.%{linkEnd}"
-msgstr ""
-
msgid "SecurityApprovals|Coverage-Check"
msgstr ""
@@ -29948,24 +30370,18 @@ msgstr ""
msgid "SecurityApprovals|Learn more about Vulnerability-Check"
msgstr ""
-msgid "SecurityApprovals|License Scanning must be enabled. %{linkStart}Learn more%{linkEnd}."
-msgstr ""
-
msgid "SecurityApprovals|License-Check"
msgstr ""
msgid "SecurityApprovals|Requires approval for Denied licenses. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}More information%{linkEnd}"
+msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "SecurityApprovals|Requires approval for vulnerabilities. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
-msgid "SecurityApprovals|Test coverage must be enabled. %{linkStart}Learn more%{linkEnd}."
-msgstr ""
-
msgid "SecurityApprovals|Vulnerability-Check"
msgstr ""
@@ -30029,6 +30445,12 @@ msgstr ""
msgid "SecurityConfiguration|Immediately begin risk analysis and remediation with application security features. Start with SAST and Secret Detection, available to all plans. Upgrade to Ultimate to get all features, including:"
msgstr ""
+msgid "SecurityConfiguration|Manage corpus"
+msgstr ""
+
+msgid "SecurityConfiguration|Manage corpus files used as mutation sources in coverage fuzzing."
+msgstr ""
+
msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
msgstr ""
@@ -30083,6 +30505,12 @@ msgstr ""
msgid "SecurityOrchestration|Action"
msgstr ""
+msgid "SecurityOrchestration|Actions"
+msgstr ""
+
+msgid "SecurityOrchestration|Add rule"
+msgstr ""
+
msgid "SecurityOrchestration|All policies"
msgstr ""
@@ -30116,9 +30544,6 @@ msgstr ""
msgid "SecurityOrchestration|Network"
msgstr ""
-msgid "SecurityOrchestration|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
-msgstr ""
-
msgid "SecurityOrchestration|New policy"
msgstr ""
@@ -30134,6 +30559,9 @@ msgstr ""
msgid "SecurityOrchestration|Policy editor"
msgstr ""
+msgid "SecurityOrchestration|Policy preview"
+msgstr ""
+
msgid "SecurityOrchestration|Policy status"
msgstr ""
@@ -30143,6 +30571,9 @@ msgstr ""
msgid "SecurityOrchestration|Rule"
msgstr ""
+msgid "SecurityOrchestration|Rules"
+msgstr ""
+
msgid "SecurityOrchestration|Scan Execution"
msgstr ""
@@ -30236,6 +30667,9 @@ msgstr ""
msgid "SecurityReports|Create issue"
msgstr ""
+msgid "SecurityReports|Development vulnerabilities"
+msgstr ""
+
msgid "SecurityReports|Dismiss vulnerability"
msgstr ""
@@ -30251,6 +30685,9 @@ msgstr ""
msgid "SecurityReports|Download results"
msgstr ""
+msgid "SecurityReports|Download scanned URLs"
+msgstr ""
+
msgid "SecurityReports|Download scanned resources"
msgstr ""
@@ -30374,6 +30811,9 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
+msgid "SecurityReports|The Vulnerability Report shows the results of the lastest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "SecurityReports|The security reports below contain one or more vulnerability findings that could not be parsed and were not recorded. Download the artifacts in the job output to investigate. Ensure any security report created conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
msgstr ""
@@ -30515,10 +30955,10 @@ msgstr ""
msgid "Select a repository"
msgstr ""
-msgid "Select a role"
+msgid "Select a repository containing templates for common files."
msgstr ""
-msgid "Select a shared template repository for all projects on this instance."
+msgid "Select a role"
msgstr ""
msgid "Select a template repository"
@@ -30596,6 +31036,9 @@ msgstr ""
msgid "Select project to choose zone"
msgstr ""
+msgid "Select project to create issue"
+msgstr ""
+
msgid "Select projects"
msgstr ""
@@ -30713,6 +31156,9 @@ msgstr ""
msgid "Send emails to help guide new users through the onboarding process."
msgstr ""
+msgid "Send emails to users upon account deactivation."
+msgstr ""
+
msgid "Send message"
msgstr ""
@@ -30731,6 +31177,9 @@ msgstr ""
msgid "Send service data"
msgstr ""
+msgid "Sentry"
+msgstr ""
+
msgid "Sentry API URL"
msgstr ""
@@ -30845,6 +31294,9 @@ msgstr ""
msgid "Service"
msgstr ""
+msgid "Service Accounts keys are required to authorize GitLab to deploy your Google Cloud project."
+msgstr ""
+
msgid "Service Desk"
msgstr ""
@@ -30917,15 +31369,15 @@ msgstr ""
msgid "Set a password on your account to pull or push via %{protocol}."
msgstr ""
-msgid "Set a template repository for projects in this group"
-msgstr ""
-
msgid "Set access permissions for this token."
msgstr ""
msgid "Set an instance-wide domain that will be available to all clusters when installing Knative."
msgstr ""
+msgid "Set any rate limit to %{code_open}0%{code_close} to disable the limit."
+msgstr ""
+
msgid "Set default and restrict visibility levels. Configure import sources and git access protocol."
msgstr ""
@@ -30938,7 +31390,7 @@ msgstr ""
msgid "Set limit to 0 to allow any file size."
msgstr ""
-msgid "Set max session time for web terminal."
+msgid "Set limits for web and API requests."
msgstr ""
msgid "Set milestone"
@@ -30947,15 +31399,18 @@ msgstr ""
msgid "Set new password"
msgstr ""
-msgid "Set notification email for abuse reports."
+msgid "Set parent epic to an epic"
msgstr ""
-msgid "Set parent epic to an epic"
+msgid "Set per-user rate limits for imports and exports of projects and groups."
msgstr ""
msgid "Set projects and maximum size limits, session duration, user options, and check feature availability for namespace plan."
msgstr ""
+msgid "Set rate limits for package registry API requests that supersede the general user and IP rate limits."
+msgstr ""
+
msgid "Set severity"
msgstr ""
@@ -30974,15 +31429,24 @@ msgstr ""
msgid "Set the default branch for this project. All merge requests and commits are made against this branch unless you specify a different one."
msgstr ""
+msgid "Set the default expiration time for job artifacts in all projects. Set to %{code_open}0%{code_close} to never expire artifacts by default. If no unit is written, it defaults to seconds. For example, these are all equivalent: %{code_open}3600%{code_close}, %{code_open}60 minutes%{code_close}, or %{code_open}one hour%{code_close}."
+msgstr ""
+
msgid "Set the due date to %{due_date}."
msgstr ""
msgid "Set the iteration to %{iteration_reference}."
msgstr ""
+msgid "Set the maximum session time for a web terminal."
+msgstr ""
+
msgid "Set the milestone to %{milestone_reference}."
msgstr ""
+msgid "Set the per-user rate limit for notes created by web or API requests."
+msgstr ""
+
msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
msgstr ""
@@ -31184,6 +31648,9 @@ msgstr ""
msgid "Show Pipeline IID"
msgstr ""
+msgid "Show all %{issuable_type}."
+msgstr ""
+
msgid "Show all activity"
msgstr ""
@@ -31235,15 +31702,9 @@ msgstr ""
msgid "Show list"
msgstr ""
-msgid "Show me advanced features"
-msgstr ""
-
msgid "Show me how to add a pipeline"
msgstr ""
-msgid "Show me the basics"
-msgstr ""
-
msgid "Show one file at a time"
msgstr ""
@@ -31288,15 +31749,15 @@ msgstr ""
msgid "Showing %{pageSize} of %{total} %{issuableType}"
msgstr ""
-msgid "Showing %{pageSize} of %{total} issues"
-msgstr ""
-
msgid "Showing all epics"
msgstr ""
msgid "Showing all issues"
msgstr ""
+msgid "Showing data for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
+msgstr ""
+
msgid "Showing data for workflow items created in this date range. Date range cannot exceed %{maxDateRange} days."
msgstr ""
@@ -31336,6 +31797,15 @@ msgstr ""
msgid "Sidebar|Weight"
msgstr ""
+msgid "Sidekiq job compression threshold (bytes)"
+msgstr ""
+
+msgid "Sidekiq job size limit (bytes)"
+msgstr ""
+
+msgid "Sidekiq job size limits"
+msgstr ""
+
msgid "Sign in"
msgstr ""
@@ -31456,6 +31926,9 @@ msgstr ""
msgid "Site profile not found for given parameters"
msgstr ""
+msgid "Sites"
+msgstr ""
+
msgid "Size"
msgstr ""
@@ -31486,19 +31959,22 @@ msgstr ""
msgid "SlackIntegration|Sends notifications about project events to Slack channels."
msgstr ""
-msgid "SlackService|2. Paste the %{strong_open}Token%{strong_close} into the field below"
+msgid "SlackService|1. %{slash_command_link_start}Add a slash command%{slash_command_link_end} in your Slack team using this information:"
msgstr ""
-msgid "SlackService|3. Select the %{strong_open}Active%{strong_close} checkbox, press %{strong_open}Save changes%{strong_close} and start using GitLab inside Slack!"
+msgid "SlackService|2. Paste the token from Slack in the %{strong_open}Token%{strong_close} field below."
msgstr ""
-msgid "SlackService|Fill in the word that works best for your team."
+msgid "SlackService|3. Select the %{strong_open}Active%{strong_close} checkbox, select %{strong_open}Save changes%{strong_close}, and start using slash commands in Slack!"
msgstr ""
-msgid "SlackService|See list of available commands in Slack after setting up this service, by entering"
+msgid "SlackService|After setup, get a list of available Slack slash commands by entering"
msgstr ""
-msgid "SlackService|This service allows users to perform common operations on this project by entering slash commands in Slack."
+msgid "SlackService|Fill in the word that works best for your team."
+msgstr ""
+
+msgid "SlackService|Perform common operations in this project by entering slash commands in Slack."
msgstr ""
msgid "Slice multiplier"
@@ -31564,7 +32040,7 @@ msgstr ""
msgid "Some child epics may be hidden due to applied filters"
msgstr ""
-msgid "Some common domains are not allowed. %{read_more_link}."
+msgid "Some common domains are not allowed. %{learn_more_link}."
msgstr ""
msgid "Some of the designs you tried uploading did not change:"
@@ -31648,9 +32124,6 @@ msgstr ""
msgid "Something went wrong while exporting requirements"
msgstr ""
-msgid "Something went wrong while fetching %{listType} list"
-msgstr ""
-
msgid "Something went wrong while fetching branches"
msgstr ""
@@ -31705,15 +32178,9 @@ msgstr ""
msgid "Something went wrong while merging this merge request. Please try again."
msgstr ""
-msgid "Something went wrong while moving issues."
-msgstr ""
-
msgid "Something went wrong while obtaining the Let's Encrypt certificate."
msgstr ""
-msgid "Something went wrong while performing the action."
-msgstr ""
-
msgid "Something went wrong while promoting the issue to an epic. Please try again."
msgstr ""
@@ -32041,7 +32508,10 @@ msgstr ""
msgid "SourcegraphPreferences|Uses a custom %{linkStart}Sourcegraph instance%{linkEnd}."
msgstr ""
-msgid "Spam Check API Key"
+msgid "Spam Check"
+msgstr ""
+
+msgid "Spam Check API key"
msgstr ""
msgid "Spam Logs"
@@ -32059,8 +32529,8 @@ msgstr ""
msgid "Specified URL cannot be used: \"%{reason}\""
msgstr ""
-msgid "Specify an e-mail address regex pattern to identify default internal users."
-msgstr "Określ wzór regex adresu e-mail, aby zidentyfikować domyślnych użytkowników wewnętrznych."
+msgid "Specify an email address regex pattern to identify default internal users."
+msgstr ""
msgid "Speed up your pipelines with Needs relationships"
msgstr ""
@@ -32314,7 +32784,7 @@ msgstr ""
msgid "StatusCheck|An error occurred fetching the status checks."
msgstr ""
-msgid "StatusCheck|Apply this status check to any branch or a specific protected branch."
+msgid "StatusCheck|Apply this status check to all branches or a specific protected branch."
msgstr ""
msgid "StatusCheck|Check for a status response in Merge Requests. Failures do not block merges. %{link_start}Learn more%{link_end}."
@@ -32653,6 +33123,9 @@ msgstr ""
msgid "Subscriptions"
msgstr ""
+msgid "Subscription|Your subscription for %{strong}%{namespace_name}%{strong_close} has expired and you are now on %{pricing_link_start}the GitLab Free tier%{pricing_link_end}. Don't worry, your data is safe. Get in touch with our support team (%{support_email}). They'll gladly help with your subscription renewal."
+msgstr ""
+
msgid "Subtracted"
msgstr ""
@@ -32881,6 +33354,9 @@ msgstr ""
msgid "SuperSonics|Plan"
msgstr ""
+msgid "SuperSonics|Please agree to the Subscription Agreement"
+msgstr ""
+
msgid "SuperSonics|Ready to get started? A GitLab plan is ideal for scaling organizations and for multi team usage."
msgstr ""
@@ -32911,6 +33387,9 @@ msgstr ""
msgid "SuperSonics|The activation code is not valid. Please make sure to copy it exactly from the Customers Portal or confirmation email. Learn more about %{linkStart}activating your subscription%{linkEnd}."
msgstr ""
+msgid "SuperSonics|The activation code should be a 24-character alphanumeric string"
+msgstr ""
+
msgid "SuperSonics|There is a connectivity issue."
msgstr ""
@@ -32953,9 +33432,15 @@ msgstr ""
msgid "SuperSonics|You do not have an active subscription"
msgstr ""
+msgid "SuperSonics|You have successfully added a license that activates on %{date}. Please see the subscription history table below for more details."
+msgstr ""
+
msgid "SuperSonics|You'll be charged for %{trueUpLinkStart}users over license%{trueUpLinkEnd} on a quarterly or annual basis, depending on the terms of your agreement."
msgstr ""
+msgid "SuperSonics|Your future dated license was successfully added"
+msgstr ""
+
msgid "SuperSonics|Your subscription"
msgstr ""
@@ -33208,7 +33693,7 @@ msgstr ""
msgid "Template to append to all Service Desk issues"
msgstr ""
-msgid "TemplateRepository|Select a repository to make its templates available to all projects. %{link_start}What should the repository contain?%{link_end} "
+msgid "TemplateRepository|Create common files more quickly, and standardize their format."
msgstr ""
msgid "Templates"
@@ -33422,7 +33907,7 @@ msgstr ""
msgid "TestCases|Search test cases"
msgstr ""
-msgid "TestCases|Something went wrong while adding test case to Todo."
+msgid "TestCases|Something went wrong while adding test case to a to-do item."
msgstr ""
msgid "TestCases|Something went wrong while creating a test case."
@@ -33434,7 +33919,7 @@ msgstr ""
msgid "TestCases|Something went wrong while fetching test cases list."
msgstr ""
-msgid "TestCases|Something went wrong while marking test case todo as done."
+msgid "TestCases|Something went wrong while marking test case to-do item as done."
msgstr ""
msgid "TestCases|Something went wrong while moving test case."
@@ -33554,7 +34039,7 @@ msgstr ""
msgid "Thanks for your purchase!"
msgstr ""
-msgid "That is ok, I do not want to renew"
+msgid "That's OK, I don't want to renew"
msgstr ""
msgid "That's it, well done!"
@@ -33579,7 +34064,7 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-msgid "The API key used by GitLab for accessing the Spam Check service endpoint"
+msgid "The API key used by GitLab for accessing the Spam Check service endpoint."
msgstr ""
msgid "The GitLab subscription service (customers.gitlab.com) is currently experiencing an outage. You can monitor the status and get updates at %{linkStart}status.gitlab.com%{linkEnd}."
@@ -33618,9 +34103,6 @@ msgstr ""
msgid "The URL to use for connecting to Elasticsearch. Use a comma-separated list to support clustering (e.g., \"http://localhost:9200, http://localhost:9201\")."
msgstr ""
-msgid "The Vulnerability Report shows the results of the last successful pipeline run on the default branch."
-msgstr ""
-
msgid "The X509 Certificate to use when mutual TLS is required to communicate with the external authorization service. If left blank, the server certificate is still validated when accessing over HTTPS."
msgstr "Certyfikat X509 służy do użycia w przypadku, gdy do komunikacji z zewnętrzną usługą autoryzacji jest wymagany wspólny TLS. Jeśli pozostanie puste, certyfikat serwera będzie nadal sprawdzany podczas uzyskiwania dostępu za pośrednictwem protokołu HTTPS."
@@ -33678,9 +34160,6 @@ msgstr ""
msgid "The default branch for this project has been changed. Please update your bookmarks."
msgstr ""
-msgid "The default expiration time for job artifacts. 0 for unlimited. The default unit is in seconds, but you can use other units, for example %{code_open}4 mins 2 sec%{code_close}, %{code_open}2h42min%{code_close}."
-msgstr ""
-
msgid "The dependency list details information about the components used within your project."
msgstr ""
@@ -33874,9 +34353,6 @@ msgstr ""
msgid "The merge conflicts for this merge request have already been resolved. Please return to the merge request."
msgstr ""
-msgid "The merge request can now be merged."
-msgstr ""
-
msgid "The metric must be one of %{metrics}."
msgstr ""
@@ -34252,7 +34728,7 @@ msgstr ""
msgid "There was a problem updating the keep latest artifacts setting."
msgstr ""
-msgid "There was an error %{message} todo."
+msgid "There was an error %{message} to-do item."
msgstr ""
msgid "There was an error adding a To Do."
@@ -34291,6 +34767,9 @@ msgstr ""
msgid "There was an error fetching projects"
msgstr ""
+msgid "There was an error fetching search autocomplete suggestions"
+msgstr ""
+
msgid "There was an error fetching stage total counts"
msgstr ""
@@ -34615,6 +35094,9 @@ msgstr ""
msgid "This field is required."
msgstr ""
+msgid "This form is disabled in preview"
+msgstr ""
+
msgid "This group"
msgstr ""
@@ -34636,9 +35118,6 @@ msgstr ""
msgid "This group is linked to a subscription"
msgstr ""
-msgid "This group, including all subgroups, projects and git repositories, will be reachable from only the specified IP address ranges."
-msgstr ""
-
msgid "This group, its subgroups and projects has been scheduled for removal on %{date}."
msgstr ""
@@ -34918,9 +35397,6 @@ msgstr ""
msgid "This user cannot be unlocked manually from GitLab"
msgstr ""
-msgid "This user does not have a pending request"
-msgstr ""
-
msgid "This user has an unconfirmed email address (%{email}). You may force a confirmation."
msgstr ""
@@ -35029,9 +35505,6 @@ msgstr ""
msgid "ThreatMonitoring|Packet Activity"
msgstr ""
-msgid "ThreatMonitoring|Policies"
-msgstr ""
-
msgid "ThreatMonitoring|Requests"
msgstr ""
@@ -35083,6 +35556,12 @@ msgstr ""
msgid "ThreatMonitoring|View documentation"
msgstr ""
+msgid "Threshold in bytes at which to compress Sidekiq job arguments."
+msgstr ""
+
+msgid "Threshold in bytes at which to reject Sidekiq jobs. Set this to 0 to if you don't want to limit Sidekiq jobs."
+msgstr ""
+
msgid "Throughput"
msgstr ""
@@ -35092,6 +35571,9 @@ msgstr ""
msgid "Time"
msgstr ""
+msgid "Time (in hours) that users are allowed to skip forced configuration of two-factor authentication."
+msgstr ""
+
msgid "Time Spent"
msgstr ""
@@ -35158,7 +35640,7 @@ msgstr ""
msgid "TimeTrackingEstimated|Est"
msgstr ""
-msgid "TimeTracking|%{startTag}Spent: %{endTag}%{timeSpentHumanReadable}"
+msgid "TimeTracking|%{spentStart}Spent: %{spentEnd}"
msgstr ""
msgid "TimeTracking|Estimated:"
@@ -35376,6 +35858,9 @@ msgstr ""
msgid "To access this domain create a new DNS record"
msgstr ""
+msgid "To add a custom suffix, set up a Service Desk email address. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "To add an SSH key you need to %{generate_link_start}generate one%{link_end} or use an %{existing_link_start}existing key%{link_end}."
msgstr ""
@@ -35397,13 +35882,16 @@ msgstr ""
msgid "To connect an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To continue using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
+msgstr ""
+
msgid "To continue, you need to select the link in the confirmation email we sent to verify your email address. If you didn't get our email, select %{strongStart}Resend confirmation email.%{strongEnd}"
msgstr ""
msgid "To define internal users, first enable new users set to external"
msgstr ""
-msgid "To enable Registration Features, make sure \"Enable service ping\" is checked."
+msgid "To enable Registration Features, first enable Service Ping."
msgstr ""
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
@@ -35430,8 +35918,8 @@ msgstr ""
msgid "To get started, use the link below to confirm your account."
msgstr ""
-msgid "To help improve GitLab and its user experience, GitLab will periodically collect usage information."
-msgstr "Aby usprawnić GitLab i doświadczenie użytkowników, GitLab będzie okresowo zbierać informacje o użytkowaniu."
+msgid "To help improve GitLab and its user experience, GitLab periodically collects usage information."
+msgstr ""
msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
msgstr ""
@@ -35463,7 +35951,7 @@ msgstr ""
msgid "To preserve performance only %{strong_open}%{display_size} of %{real_size}%{strong_close} files are displayed."
msgstr ""
-msgid "To protect this issue's confidentiality, %{forkLink} and set the fork's visibility to private."
+msgid "To protect this issue's confidentiality, %{linkStart}fork this project%{linkEnd} and set the fork's visibility to private."
msgstr ""
msgid "To protect this issue's confidentiality, a private fork of this project was selected."
@@ -35496,12 +35984,15 @@ msgstr ""
msgid "To set up SAML authentication for your group through an identity provider like Azure, Okta, Onelogin, Ping Identity, or your custom SAML 2.0 provider:"
msgstr ""
-msgid "To set up this service:"
+msgid "To set up this integration:"
msgstr ""
msgid "To specify the notification level per project of a group you belong to, you need to visit project page and change notification level there."
msgstr ""
+msgid "To start using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
+msgstr ""
+
msgid "To unsubscribe from this issue, please paste the following link into your browser:"
msgstr ""
@@ -36091,9 +36582,6 @@ msgstr ""
msgid "Unable to fetch branches list, please close the form and try again"
msgstr ""
-msgid "Unable to fetch unscanned projects"
-msgstr ""
-
msgid "Unable to fetch vulnerable projects"
msgstr ""
@@ -36148,6 +36636,15 @@ msgstr ""
msgid "Unable to update this issue at this time."
msgstr ""
+msgid "Unapprove a merge request"
+msgstr ""
+
+msgid "Unapprove the current merge request."
+msgstr ""
+
+msgid "Unapproved the current merge request."
+msgstr ""
+
msgid "Unarchive project"
msgstr ""
@@ -36160,16 +36657,13 @@ msgstr ""
msgid "Unassigned"
msgstr ""
-msgid "Unauthenticated API request rate limit"
-msgstr ""
-
-msgid "Unauthenticated rate limit period in seconds"
+msgid "Unauthenticated API rate limit period in seconds"
msgstr ""
-msgid "Unauthenticated request rate limit"
+msgid "Unauthenticated requests"
msgstr ""
-msgid "Unauthenticated requests"
+msgid "Unauthenticated web rate limit period in seconds"
msgstr ""
msgid "Undo"
@@ -36271,18 +36765,6 @@ msgstr ""
msgid "Unresolved"
msgstr ""
-msgid "UnscannedProjects|15 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|30 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|5 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|60 or more days"
-msgstr ""
-
msgid "Unschedule job"
msgstr ""
@@ -36502,6 +36984,9 @@ msgstr ""
msgid "UsageQuota|%{help_link_start}Shared runners%{help_link_end} are disabled, so there are no limits set on pipeline usage"
msgstr ""
+msgid "UsageQuota|%{linkTitle} help link"
+msgstr ""
+
msgid "UsageQuota|%{percentageLeft} of purchased storage is available"
msgstr ""
@@ -36511,6 +36996,9 @@ msgstr ""
msgid "UsageQuota|Artifacts is a sum of build and pipeline artifacts."
msgstr ""
+msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
+msgstr ""
+
msgid "UsageQuota|Buy additional minutes"
msgstr ""
@@ -36520,9 +37008,21 @@ msgstr ""
msgid "UsageQuota|CI minutes usage by project"
msgstr ""
+msgid "UsageQuota|Code packages and container images."
+msgstr ""
+
msgid "UsageQuota|Current period usage"
msgstr ""
+msgid "UsageQuota|File attachments and smaller design graphics."
+msgstr ""
+
+msgid "UsageQuota|Git repository, managed by the Gitaly service."
+msgstr ""
+
+msgid "UsageQuota|Includes project registry, artifacts, packages, wiki, uploads and other items."
+msgstr ""
+
msgid "UsageQuota|Increase storage temporarily"
msgstr ""
@@ -36541,6 +37041,9 @@ msgstr ""
msgid "UsageQuota|Packages"
msgstr ""
+msgid "UsageQuota|Pipeline artifacts and job artifacts, created with CI/CD."
+msgstr ""
+
msgid "UsageQuota|Pipelines"
msgstr ""
@@ -36559,6 +37062,9 @@ msgstr ""
msgid "UsageQuota|Seats"
msgstr ""
+msgid "UsageQuota|Shared bits of code and text."
+msgstr ""
+
msgid "UsageQuota|Snippets"
msgstr ""
@@ -36568,6 +37074,12 @@ msgstr ""
msgid "UsageQuota|Storage"
msgstr ""
+msgid "UsageQuota|Storage type"
+msgstr ""
+
+msgid "UsageQuota|There is a known issue with Artifact storage where the total could be incorrect for some projects. More details and progress are available in %{warningLinkStart}the epic%{warningLinkEnd}."
+msgstr ""
+
msgid "UsageQuota|This is the total amount of storage used across your projects within this namespace."
msgstr ""
@@ -36607,6 +37119,9 @@ msgstr ""
msgid "UsageQuota|Usage"
msgstr ""
+msgid "UsageQuota|Usage Breakdown"
+msgstr ""
+
msgid "UsageQuota|Usage Quotas"
msgstr ""
@@ -36631,6 +37146,9 @@ msgstr ""
msgid "UsageQuota|Wiki"
msgstr ""
+msgid "UsageQuota|Wiki content."
+msgstr ""
+
msgid "UsageQuota|Wikis"
msgstr ""
@@ -36847,7 +37365,10 @@ msgstr ""
msgid "User Settings"
msgstr ""
-msgid "User and IP Rate Limits"
+msgid "User and IP rate limits"
+msgstr ""
+
+msgid "User does not have a pending request"
msgstr ""
msgid "User identity was successfully created."
@@ -37144,6 +37665,9 @@ msgstr ""
msgid "Users can launch a development environment from a GitLab browser tab when the %{linkStart}Gitpod%{linkEnd} integration is enabled."
msgstr ""
+msgid "Users can reactivate their account by signing in."
+msgstr ""
+
msgid "Users can render diagrams in AsciiDoc, Markdown, reStructuredText, and Textile documents using Kroki."
msgstr ""
@@ -37159,6 +37683,9 @@ msgstr ""
msgid "Users requesting access to"
msgstr ""
+msgid "Users to exclude from the rate limit"
+msgstr ""
+
msgid "Users were successfully added."
msgstr ""
@@ -37180,6 +37707,9 @@ msgstr ""
msgid "UsersSelect|Unassigned"
msgstr ""
+msgid "Uses GitLab as a lightweight alternative to Sentry."
+msgstr ""
+
msgid "Using %{code_start}::%{code_end} denotes a %{link_start}scoped label set%{link_end}"
msgstr ""
@@ -37210,10 +37740,7 @@ msgstr ""
msgid "Value Stream Analytics can help you determine your team’s velocity"
msgstr ""
-msgid "Value Stream Analytics gives an overview of how much time it takes to go from idea to production in your project."
-msgstr ""
-
-msgid "Value may contain a variable reference"
+msgid "Value might contain a variable reference"
msgstr ""
msgid "Value stream"
@@ -37279,10 +37806,10 @@ msgstr ""
msgid "ValueStream|The Default Value Stream cannot be deleted"
msgstr ""
-msgid "Variable"
+msgid "Values that contain the %{codeStart}$%{codeEnd} character can be considered a variable reference and expanded. %{docsLinkStart}Learn more.%{docsLinkEnd}"
msgstr ""
-msgid "Variable references indicated by %{codeStart}$%{codeEnd} may be expanded. If this is not what you want, consider %{docsLinkStart}using a workaround to prevent expansion%{docsLinkEnd}."
+msgid "Variable"
msgstr ""
msgid "Variable will be masked in job logs."
@@ -37693,6 +38220,9 @@ msgstr ""
msgid "Vulnerability|Evidence"
msgstr ""
+msgid "Vulnerability|False positive detected"
+msgstr ""
+
msgid "Vulnerability|File"
msgstr ""
@@ -37735,6 +38265,9 @@ msgstr ""
msgid "Vulnerability|Status"
msgstr ""
+msgid "Vulnerability|The scanner determined this vulnerability to be a false positive. Verify the evaluation before changing its status. %{linkStart}Learn more about false positive detection.%{linkEnd}"
+msgstr ""
+
msgid "Vulnerability|The unmodified response is the original response that had no mutations done to the request"
msgstr ""
@@ -38059,9 +38592,6 @@ msgstr ""
msgid "Welcome to GitLab,%{br_tag}%{name}!"
msgstr ""
-msgid "Welcome to the guided GitLab tour"
-msgstr ""
-
msgid "Welcome, %{name}!"
msgstr ""
@@ -38080,9 +38610,6 @@ msgstr ""
msgid "What are you searching for?"
msgstr ""
-msgid "What describes you best?"
-msgstr ""
-
msgid "What does this command do?"
msgstr ""
@@ -38104,13 +38631,13 @@ msgstr ""
msgid "What is your job title? (optional)"
msgstr ""
-msgid "What will you use this group for?"
+msgid "What templates can I create?"
msgstr ""
-msgid "What's new"
+msgid "What will you use this group for?"
msgstr ""
-msgid "What’s your experience level?"
+msgid "What's new"
msgstr ""
msgid "When a deployment job is successful, skip older deployment jobs that are still pending."
@@ -38122,6 +38649,9 @@ msgstr ""
msgid "When an event in GitLab triggers a webhook, you can use the request details to figure out if something went wrong."
msgstr ""
+msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+msgstr ""
+
msgid "When inactive, an external authentication provider must be used."
msgstr ""
@@ -38147,6 +38677,9 @@ msgstr ""
msgid "When:"
msgstr ""
+msgid "Which API requests are affected?"
+msgstr ""
+
msgid "While it's rare to have no vulnerabilities, it can happen. In any event, we ask that you please double check your settings to make sure you've set up your dashboard correctly."
msgstr ""
@@ -38426,6 +38959,9 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|Work Items"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -38501,6 +39037,9 @@ msgstr ""
msgid "You are already a member of this %{member_source}."
msgstr ""
+msgid "You are already impersonating another user"
+msgstr ""
+
msgid "You are an admin, which means granting access to %{client_name} will allow them to interact with GitLab as an admin as well. Proceed with caution."
msgstr ""
@@ -38603,6 +39142,9 @@ msgstr ""
msgid "You can also use project access tokens with Git to authenticate over HTTP(S). %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "You can always change your URL later"
+msgstr ""
+
msgid "You can always edit this later"
msgstr ""
@@ -38759,10 +39301,10 @@ msgstr ""
msgid "You can’t %{tag_start}edit%{tag_end} files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
-msgid "You could not create a new trigger."
+msgid "You can’t edit files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
-msgid "You didn't renew your subscription for %{strong}%{namespace_name}%{strong_close} so it was downgraded to the free plan."
+msgid "You could not create a new trigger."
msgstr ""
msgid "You do not have any subscriptions yet"
@@ -38930,6 +39472,12 @@ msgstr ""
msgid "You must provide your current password in order to change it."
msgstr ""
+msgid "You must sign in to search for specific projects."
+msgstr ""
+
+msgid "You must sign in to search for specific terms."
+msgstr ""
+
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
@@ -38957,6 +39505,9 @@ msgstr ""
msgid "You need to upload a GitLab project export archive (ending in .gz)."
msgstr ""
+msgid "You need to verify your primary email first before enabling Two-Factor Authentication."
+msgstr ""
+
msgid "You successfully declined the invitation"
msgstr ""
@@ -39065,10 +39616,10 @@ msgstr ""
msgid "Your %{host} account was signed in to from a new location"
msgstr ""
-msgid "Your %{strong}%{plan_name}%{strong_close} subscription for %{strong}%{namespace_name}%{strong_close} will expire on %{strong}%{expires_on}%{strong_close}."
+msgid "Your %{strong}%{plan_name}%{strong_close} subscription expires on %{strong}%{expires_on}%{strong_close}. After that date, you cannot create issues or merge requests, or use many other features."
msgstr ""
-msgid "Your %{strong}%{plan_name}%{strong_close} subscription will expire on %{strong}%{expires_on}%{strong_close}. After that, you will not be able to create issues or merge requests as well as many other features."
+msgid "Your %{strong}%{plan_name}%{strong_close} subscription for %{strong}%{namespace_name}%{strong_close} will expire on %{strong}%{expires_on}%{strong_close}."
msgstr ""
msgid "Your CI/CD configuration syntax is invalid. View Lint tab for more details."
@@ -39092,7 +39643,7 @@ msgstr ""
msgid "Your GPG keys (%{count})"
msgstr ""
-msgid "Your GitLab account has been locked due to an excessive amount of unsuccessful sign in attempts. Your account will automatically unlock in %{duration} or you may click the link below to unlock now."
+msgid "Your GitLab account has been locked due to an excessive number of unsuccessful sign in attempts. You can wait for your account to automatically unlock in %{duration} or you can click the link below to unlock now."
msgstr ""
msgid "Your GitLab account request has been approved!"
@@ -39203,6 +39754,9 @@ msgstr ""
msgid "Your commit email is used for web based operations, such as edits and merges."
msgstr ""
+msgid "Your current password is required to register a two-factor authenticator app."
+msgstr ""
+
msgid "Your dashboard has been copied. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
@@ -39302,6 +39856,9 @@ msgstr ""
msgid "Your project limit is %{limit} projects! Please contact your administrator to increase it"
msgstr ""
+msgid "Your project will be created at:"
+msgstr ""
+
msgid "Your projects"
msgstr ""
@@ -39341,11 +39898,12 @@ msgstr ""
msgid "Your subscription expired!"
msgstr ""
-msgid "Your subscription has been downgraded."
-msgstr ""
-
-msgid "Your subscription will expire in %{remaining_days}."
-msgstr ""
+msgid "Your subscription will expire in %{remaining_days} day."
+msgid_plural "Your subscription will expire in %{remaining_days} days."
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
msgid "Your username is %{username}."
msgstr ""
@@ -39556,6 +40114,9 @@ msgstr ""
msgid "cannot merge"
msgstr ""
+msgid "cannot not be used for user namespace"
+msgstr ""
+
msgid "ciReport|%{degradedNum} degraded"
msgstr ""
@@ -39881,6 +40442,9 @@ msgstr ""
msgid "created %{timeAgo}"
msgstr ""
+msgid "created %{timeAgo} by %{author}"
+msgstr ""
+
msgid "created by"
msgstr ""
@@ -39927,9 +40491,6 @@ msgstr ""
msgid "does not have a supported extension. Only %{extension_list} are supported"
msgstr ""
-msgid "domain is not authorized for sign-up."
-msgstr ""
-
msgid "download it"
msgstr ""
@@ -39949,20 +40510,13 @@ msgstr ""
msgid "email '%{email}' is not a verified email."
msgstr ""
-msgid "email does not match the allowed domain of %{email_domains}"
-msgid_plural "email does not match the allowed domains: %{email_domains}"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
-
msgid "enabled"
msgstr ""
msgid "encrypted: needs to be a :required, :optional or :migrating!"
msgstr ""
-msgid "ending with MIME type format is not allowed."
+msgid "ending with a reserved file extension is not allowed."
msgstr ""
msgid "entries cannot be larger than 255 characters"
@@ -39986,6 +40540,9 @@ msgstr ""
msgid "estimateCommand|%{slash_command} overwrites the total estimated time."
msgstr ""
+msgid "example.com"
+msgstr ""
+
msgid "exceeds the limit of %{bytes} bytes"
msgstr ""
@@ -40038,9 +40595,6 @@ msgstr ""
msgid "fork"
msgstr ""
-msgid "fork this project"
-msgstr ""
-
msgid "from"
msgstr ""
@@ -40051,6 +40605,9 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "frontmatter"
+msgstr ""
+
msgid "group"
msgstr ""
@@ -40078,6 +40635,9 @@ msgstr ""
msgid "has been completed."
msgstr ""
+msgid "has too deep level of nesting"
+msgstr ""
+
msgid "help"
msgstr ""
@@ -40111,9 +40671,21 @@ msgstr ""
msgid "in"
msgstr ""
+msgid "in Infrastructure :: Kubernetes clusters"
+msgstr ""
+
+msgid "in all GitLab"
+msgstr ""
+
+msgid "in group"
+msgstr ""
+
msgid "in group %{link_to_group}"
msgstr ""
+msgid "in project"
+msgstr ""
+
msgid "in project %{link_to_project}"
msgstr ""
@@ -40157,16 +40729,19 @@ msgstr ""
msgid "is not a valid X509 certificate."
msgstr ""
-msgid "is not allowed since the group is not top-level group."
+msgid "is not allowed for sign-up."
msgstr ""
-msgid "is not allowed. Try again with a different email address, or contact your GitLab admin."
+msgid "is not allowed for this group."
msgstr ""
-msgid "is not allowed. We do not currently support project-level iterations"
+msgid "is not allowed for this project."
msgstr ""
-msgid "is not from an allowed domain."
+msgid "is not allowed since the group is not top-level group."
+msgstr ""
+
+msgid "is not allowed. We do not currently support project-level iterations"
msgstr ""
msgid "is not in the group enforcing Group Managed Account"
@@ -40259,6 +40834,9 @@ msgstr ""
msgid "log in"
msgstr ""
+msgid "managed"
+msgstr ""
+
msgid "manual"
msgstr ""
@@ -40308,6 +40886,9 @@ msgstr ""
msgid "mrWidget| Please restore it or use a different %{missingBranchName} branch"
msgstr ""
+msgid "mrWidget|%{linkStart}Set up now%{linkEnd} to analyze your source code for known security vulnerabilities."
+msgstr ""
+
msgid "mrWidget|%{mergeError}."
msgstr ""
@@ -40390,6 +40971,9 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "mrWidget|Create issue to resolve all threads"
+msgstr ""
+
msgid "mrWidget|Delete source branch"
msgstr ""
@@ -40399,12 +40983,18 @@ msgstr ""
msgid "mrWidget|Did not close"
msgstr ""
+msgid "mrWidget|Dismiss"
+msgstr ""
+
msgid "mrWidget|Email patches"
msgstr ""
msgid "mrWidget|Failed to load deployment statistics"
msgstr ""
+msgid "mrWidget|Hide %{widget} details"
+msgstr ""
+
msgid "mrWidget|If the %{missingBranchName} branch exists in your local repository, you can merge this merge request manually using the command line"
msgstr ""
@@ -40502,9 +41092,6 @@ msgstr ""
msgid "mrWidget|Request to merge"
msgstr ""
-msgid "mrWidget|Resolve all threads in new issue"
-msgstr ""
-
msgid "mrWidget|Resolve conflicts"
msgstr ""
@@ -40520,6 +41107,9 @@ msgstr ""
msgid "mrWidget|Revoke approval"
msgstr ""
+msgid "mrWidget|SAST and Secret Detection is not enabled."
+msgstr ""
+
msgid "mrWidget|Set by %{merge_author} to be added to the merge train when the pipeline succeeds"
msgstr ""
@@ -40529,6 +41119,9 @@ msgstr ""
msgid "mrWidget|Set by %{merge_author} to start a merge train when the pipeline succeeds"
msgstr ""
+msgid "mrWidget|Show %{widget} details"
+msgstr ""
+
msgid "mrWidget|The changes were merged into"
msgstr ""
@@ -40541,6 +41134,9 @@ msgstr ""
msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure, or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
msgstr ""
+msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure."
+msgstr ""
+
msgid "mrWidget|The source branch has been deleted"
msgstr ""
@@ -40583,6 +41179,9 @@ msgstr ""
msgid "mrWidget|You can merge after removing denied licenses"
msgstr ""
+msgid "mrWidget|You can only merge once this merge request is approved."
+msgstr ""
+
msgid "mrWidget|Your password"
msgstr ""
@@ -40619,6 +41218,9 @@ msgstr ""
msgid "must be less than the limit of %{tag_limit} tags"
msgstr ""
+msgid "must be set for a project namespace"
+msgstr ""
+
msgid "must be unique by status and elapsed time within a policy"
msgstr ""
@@ -40732,6 +41334,9 @@ msgstr ""
msgid "pipeline"
msgstr ""
+msgid "pipeline schedules documentation"
+msgstr ""
+
msgid "pod_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
msgstr ""
@@ -40785,16 +41390,25 @@ msgstr ""
msgid "project name"
msgstr ""
+msgid "project namespace cannot be the parent of another namespace"
+msgstr ""
+
msgid "projects"
msgstr ""
msgid "quick actions"
msgstr ""
-msgid "reCAPTCHA Private Key"
+msgid "reCAPTCHA"
+msgstr ""
+
+msgid "reCAPTCHA helps prevent credential stuffing."
msgstr ""
-msgid "reCAPTCHA Site Key"
+msgid "reCAPTCHA private key"
+msgstr ""
+
+msgid "reCAPTCHA site key"
msgstr ""
msgid "recent activity"
@@ -41023,6 +41637,9 @@ msgstr ""
msgid "user avatar"
msgstr ""
+msgid "user namespace cannot be the parent of another namespace"
+msgstr ""
+
msgid "user preferences"
msgstr ""
@@ -41117,3 +41734,9 @@ msgstr ""
msgid "your settings"
msgstr ""
+msgid "{group}"
+msgstr ""
+
+msgid "{project}"
+msgstr ""
+
diff --git a/locale/pt_BR/gitlab.po b/locale/pt_BR/gitlab.po
index e67e193e5cd..dcdbeb00544 100644
--- a/locale/pt_BR/gitlab.po
+++ b/locale/pt_BR/gitlab.po
@@ -14,10 +14,7 @@ msgstr ""
"X-Crowdin-Language: pt-BR\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-09-01 23:42\n"
-
-msgid " %{name}, confirm your email address now! "
-msgstr " %{name}, confirme seu endereço de e-mail agora! "
+"PO-Revision-Date: 2021-10-04 20:18\n"
msgid " %{start} to %{end}"
msgstr " %{start} até %{end}"
@@ -92,6 +89,16 @@ msgstr "O parâmetro \"el\" é necessário para createInstance()"
msgid "#general, #development"
msgstr "#geral, #desenvolvimento"
+msgid "%d Alert"
+msgid_plural "%d Alerts"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d Alert:"
+msgid_plural "%d Alerts:"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d Approval"
msgid_plural "%d Approvals"
msgstr[0] "%d Aprovação"
@@ -453,10 +460,13 @@ msgid "%{code_open}Masked:%{code_close} Hidden in job logs. Must match masking r
msgstr "%{code_open}Mascarado:%{code_close} Escondidos nos logs de tarefas. Deve corresponder a requisitos de mascaramento."
msgid "%{code_open}Protected:%{code_close} Only exposed to protected branches or tags."
+msgstr "%{code_open}Protegido:%{code_close} Somente exposto a ramificações ou tags protegidas."
+
+msgid "%{commit_author_link} authored %{commit_authored_timeago}"
msgstr ""
-msgid "%{commit_author_link} authored %{commit_timeago}"
-msgstr "%{commit_author_link} fez commit %{commit_timeago}"
+msgid "%{commit_author_link} authored %{commit_authored_timeago} and %{commit_committer_avatar} %{commit_committer_link} committed %{commit_committer_timeago}"
+msgstr ""
msgid "%{completedCount} completed weight"
msgstr "%{completedCount} peso concluído"
@@ -549,6 +559,15 @@ msgstr "%{doc_link_start}A pesquisa avançada%{doc_link_end} está desativada po
msgid "%{doc_link_start}Advanced search%{doc_link_end} is enabled."
msgstr "%{doc_link_start}A pesquisa avançada%{doc_link_end} está ativada."
+msgid "%{docs_link_start}Learn about visibility levels.%{docs_link_end}"
+msgstr ""
+
+msgid "%{docs_link_start}What is Large File Storage?%{docs_link_end}"
+msgstr ""
+
+msgid "%{docs_link_start}What is two-factor authentication?%{docs_link_end}"
+msgstr ""
+
msgid "%{due_date} (Past due)"
msgstr "%{due_date} (vencido)"
@@ -621,9 +640,6 @@ msgstr "%{issuableType} será removido! Você tem certeza?"
msgid "%{issueType} actions"
msgstr "%{issueType} ações"
-msgid "%{issuesCount} issues with a limit of %{maxIssueCount}"
-msgstr "%{issuesCount} issues com um limite de %{maxIssueCount}"
-
msgid "%{issuesSize} with a limit of %{maxIssueCount}"
msgstr "%{issuesSize} com um limite de %{maxIssueCount}"
@@ -681,6 +697,12 @@ msgstr "%{labelStart}Resposta não modificada:%{labelEnd} %{headers}"
msgid "%{label_for_message} unavailable"
msgstr "%{label_for_message} indisponível"
+msgid "%{learn_more_link}."
+msgstr ""
+
+msgid "%{lessThan} 1 hour"
+msgstr ""
+
msgid "%{lets_encrypt_link_start}Let's Encrypt%{lets_encrypt_link_end} is a free, automated, and open certificate authority (CA) that issues digital certificates to enable HTTPS (SSL/TLS) for sites."
msgstr "%{lets_encrypt_link_start}Let's Encrypt%{lets_encrypt_link_end} é uma autoridade certificadora (CA) gratuita, automatizada e aberta, que emite certificados digitais para habilitar o HTTPS (SSL/TLS) para sites."
@@ -693,15 +715,15 @@ msgstr "%{level_name} não é permitido, pois o projeto de origem do fork possui
msgid "%{link_start}Learn more%{link_end} about roles."
msgstr "%{link_start}Saiba mais%{link_end} sobre cargos."
-msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
-msgstr "%{link_start}Saiba mais%{link_end} sobre qual informação é compartilhada com GitLab Inc."
-
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
msgstr ""
msgid "%{link_start}Start the title with %{draft_snippet}%{link_end} to prevent a merge request that is a work in progress from being merged before it's ready."
msgstr "%{link_start}Inicie o título com %{draft_snippet}%{link_end} para evitar que uma solicitação de mesclagem de código de um trabalho em andamento seja executada antes de estar pronta."
+msgid "%{link_start}What information does GitLab Inc. collect?%{link_end}"
+msgstr ""
+
msgid "%{listToShow}, and %{awardsListLength} more"
msgstr "%{listToShow}, e %{awardsListLength} mais"
@@ -846,15 +868,15 @@ msgstr "%{seconds}s"
msgid "%{securityScanner} is not enabled for this project. %{linkStart}More information%{linkEnd}"
msgid_plural "%{securityScanner} are not enabled for this project. %{linkStart}More information%{linkEnd}"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%{securityScanner} não está ativado para este projeto. %{linkStart}Mais informações%{linkEnd}"
+msgstr[1] "%{securityScanner} não estão ativados para este projeto. %{linkStart}Mais informações%{linkEnd}"
msgid "%{securityScanner} result is not available because a pipeline has not been run since it was enabled. %{linkStart}Run a pipeline%{linkEnd}"
msgid_plural "%{securityScanner} results are not available because a pipeline has not been run since it was enabled. %{linkStart}Run a pipeline%{linkEnd}"
msgstr[0] ""
msgstr[1] ""
-msgid "%{service_ping_link_start}Learn more%{service_ping_link_end} about what information is shared with GitLab Inc."
+msgid "%{service_ping_link_start}What information is shared with GitLab Inc.?%{service_ping_link_end}"
msgstr ""
msgid "%{size} %{unit}"
@@ -890,6 +912,9 @@ msgstr "%{start} até %{end}"
msgid "%{state} epics"
msgstr "%{state} épicos"
+msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
+msgstr ""
+
msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
msgstr ""
@@ -949,11 +974,6 @@ msgstr "%{tag}-%{evidence}-%{filename}"
msgid "%{template_project_id} is unknown or invalid"
msgstr "%{template_project_id} é desconhecido ou inválido"
-msgid "%{text} %{files}"
-msgid_plural "%{text} %{files} files"
-msgstr[0] "%{text} %{files}"
-msgstr[1] "%{text} %{files} arquivos"
-
msgid "%{text} is available"
msgstr "%{text} está disponível"
@@ -1038,9 +1058,6 @@ msgstr "%{webhooks_link_start}%{webhook_type}%{link_end} permitem que você envi
msgid "%{wildcards_link_start}Wildcards%{wildcards_link_end} such as %{code_tag_start}v*%{code_tag_end} or %{code_tag_start}*-release%{code_tag_end} are supported."
msgstr "%{wildcards_link_start}Caracteres curinga%{wildcards_link_end} como %{code_tag_start}v*%{code_tag_end} ou %{code_tag_start}*release%{code_tag_end} são suportados."
-msgid "&lt; 1 hour"
-msgstr "&lt; 1 hora"
-
msgid "'%{data}' at %{location} does not match format: %{format}"
msgstr "'%{data}' em %{location} não corresponde ao formato: %{format}"
@@ -1124,9 +1141,6 @@ msgstr "(revogado)"
msgid "(we need your current password to confirm your changes)"
msgstr "(precisamos da sua senha atual para confirmar as alterações)"
-msgid "* * * * *"
-msgstr "* * * * *"
-
msgid "+ %{amount} more"
msgstr "+ %{amount} mais"
@@ -1193,12 +1207,12 @@ msgstr "- exibir menos"
msgid "."
msgstr "."
+msgid "/"
+msgstr ""
+
msgid "0 bytes"
msgstr "0 bytes"
-msgid "0 for unlimited, only effective with remote storage enabled."
-msgstr "0 para ilimitado, efetivo apenas com armazenamento remoto ativado."
-
msgid "0t1DgySidms"
msgstr "0t1DgySidms"
@@ -1259,8 +1273,8 @@ msgstr[1] "%d horas"
msgid "1 issue selected"
msgid_plural "%d issues selected"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "1 issue selecionada"
+msgstr[1] "%d issues selecionadas"
msgid "1 merge request selected"
msgid_plural "%d merge requests selected"
@@ -1326,6 +1340,9 @@ msgstr "10-19 contribuições"
msgid "1000+"
msgstr "1000+"
+msgid "192.168.0.0/24"
+msgstr ""
+
msgid "1st contribution!"
msgstr "1ª contribuição!"
@@ -1479,9 +1496,6 @@ msgstr ""
msgid "A plain HTML site that uses Netlify for CI/CD instead of GitLab, but still with all the other great GitLab features"
msgstr ""
-msgid "A plain-text response to show to clients that hit the rate limit."
-msgstr ""
-
msgid "A platform value can be web, mob or app."
msgstr ""
@@ -1501,7 +1515,7 @@ msgid "A ready-to-go template for use with iOS Swift apps"
msgstr "Um modelo pronto para uso com aplicativos do iOS baseados em Swift"
msgid "A rebase is already in progress."
-msgstr ""
+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}"
@@ -1563,7 +1577,7 @@ msgstr ""
msgid "APIFuzzing|Configure HTTP basic authentication values. Other authentication methods are supported. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
+msgid "APIFuzzing|Customize your project's API fuzzing configuration options and copy the code snippet to your .gitlab-ci.yml file to apply any changes. Note that this tool does not reflect or update your .gitlab-ci.yml file automatically. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
msgstr ""
msgid "APIFuzzing|Enable authentication"
@@ -1626,9 +1640,6 @@ msgstr ""
msgid "APIFuzzing|To prevent a security leak, authentication info must be added as a %{ciVariablesLinkStart}CI variable%{ciVariablesLinkEnd}. As a user with maintainer access rights, you can manage CI variables in the %{ciSettingsLinkStart}Settings%{ciSettingsLinkEnd} area."
msgstr ""
-msgid "APIFuzzing|Use this tool to generate API fuzzing configuration YAML to copy into your .gitlab-ci.yml file. This tool does not reflect or update your .gitlab-ci.yml file automatically."
-msgstr ""
-
msgid "APIFuzzing|Username for basic authentication"
msgstr ""
@@ -1680,9 +1691,6 @@ msgstr "Relatórios de abuso"
msgid "Abuse reports notification email"
msgstr "E-mail de notificação de relatórios de abuso"
-msgid "Abuse reports will be sent to this address if it is set. Abuse reports are always available in the admin area."
-msgstr "Relatórios de abuso serão enviados para este endereço se estiver definido. Relatórios de abuso estão sempre disponíveis na área de administração."
-
msgid "Accept invitation"
msgstr "Aceitar convite"
@@ -1719,12 +1727,18 @@ msgstr "Acesso proibido. Verifique seu nível de acesso."
msgid "Access granted"
msgstr "Acesso concedido"
+msgid "Access key ID"
+msgstr ""
+
msgid "Access requests"
msgstr "Solicitação de acesso"
msgid "Access to '%{classification_label}' not allowed"
msgstr "Acesso a '%{classification_label}' não permitido"
+msgid "Access tokens expire after 2 hours. A refresh token may be used at any time to generate a new access token. Non-expiring access tokens are deprecated. Clear this setting to enable backward compatibility."
+msgstr ""
+
msgid "AccessDropdown|Deploy Keys"
msgstr "Implementar chaves"
@@ -1987,7 +2001,7 @@ msgid "Add comment to design"
msgstr "Adicionar comentário ao design"
msgid "Add commit messages as comments to Asana tasks. %{docs_link}"
-msgstr ""
+msgstr "Adicione mensagens de commit como comentários às tarefas Asana. %{docs_link}"
msgid "Add commit messages as comments to Pivotal Tracker stories. %{docs_link}"
msgstr ""
@@ -2037,6 +2051,9 @@ msgstr "Adicionar novo aplicativo"
msgid "Add new directory"
msgstr "Adicionar novo diretório"
+msgid "Add new service account"
+msgstr ""
+
msgid "Add or remove previously merged commits"
msgstr ""
@@ -2274,6 +2291,9 @@ msgstr "Desenvolvedor"
msgid "AdminArea|Features"
msgstr "Recursos"
+msgid "AdminArea|Get security updates from GitLab and stay up to date"
+msgstr ""
+
msgid "AdminArea|Groups"
msgstr "Grupos"
@@ -2313,6 +2333,12 @@ msgstr "Projetos"
msgid "AdminArea|Reporter"
msgstr "Relatante"
+msgid "AdminArea|Sign up for the GitLab Security Newsletter to get notified for security updates."
+msgstr ""
+
+msgid "AdminArea|Sign up for the GitLab newsletter"
+msgstr ""
+
msgid "AdminArea|Stop all jobs"
msgstr "Parar todas as tarefas"
@@ -2382,9 +2408,15 @@ msgstr "Desativar token de feed"
msgid "AdminSettings|Disable public access to Pages sites"
msgstr "Desativar o acesso público ao Gitlab Pages"
+msgid "AdminSettings|Display a banner on merge requests in projects with no pipelines to initiate steps to add a .gitlab-ci.yml file."
+msgstr ""
+
msgid "AdminSettings|Domain verification is an essential security measure for public GitLab sites. Users are required to demonstrate they control a domain before it is enabled. %{link_start}Learn more.%{link_end}"
msgstr "A verificação de domínio é uma medida de segurança essencial para sites GitLab públicos. Os usuários devem demonstrar que controlam um domínio antes de habilitá-lo. %{link_start}Saiba mais.%{link_end}"
+msgid "AdminSettings|Enable pipeline suggestion banner"
+msgstr ""
+
msgid "AdminSettings|Enable shared runners for new projects"
msgstr "Ativar executores compartilhados para novos projetos"
@@ -2425,7 +2457,7 @@ msgid "AdminSettings|Select a CI/CD template"
msgstr "Selecione um modelo CI/CD"
msgid "AdminSettings|Select a group to use as the source for instance-level project templates."
-msgstr ""
+msgstr "Selecione um grupo para usar como fonte para modelos de projeto em nível de instância."
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 ""
@@ -2440,7 +2472,7 @@ msgid "AdminSettings|Set the maximum size of GitLab Pages per project (0 for unl
msgstr ""
msgid "AdminSettings|Size and domain settings for Pages static sites."
-msgstr ""
+msgstr "Configurações de tamanho e domínio para sites estáticos do Pages."
msgid "AdminSettings|The default domain to use for Auto Review Apps and Auto Deploy stages in all projects."
msgstr ""
@@ -2644,7 +2676,7 @@ msgid "AdminUsers|Is using seat"
msgstr "Está usando acento"
msgid "AdminUsers|Issues authored by this user are hidden from other users."
-msgstr ""
+msgstr "As issues criadas por este usuário são ocultadas de outros usuários."
msgid "AdminUsers|It's you!"
msgstr "É você!"
@@ -2856,10 +2888,10 @@ msgstr "Nota"
msgid "Admin|Quarterly reconciliation will occur on %{qrtlyDate}"
msgstr "A reconciliação trimestral ocorrerá em %{qrtlyDate}"
-msgid "Admin|The number of max seats used for your namespace is currently exceeding the number of seats in your subscription. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgid "Admin|The number of max seats in your namespace exceeds the number of seats in your subscription. On %{qrtlyDate}, quarterly reconciliation occurs and you are automatically billed a prorated amount for the overage. No action is needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice. For more information about the timing of the invoicing process, view the documentation."
msgstr ""
-msgid "Admin|The number of maximum users for your instance is currently exceeding the number of users in license. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgid "Admin|The number of max users in your instance exceeds the number of users in your license. On %{qrtlyDate}, quarterly reconciliation occurs and you are automatically billed a prorated amount for the overage. No action is needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice. For more information about the timing of the invoicing process, view the documentation."
msgstr ""
msgid "Admin|View pending user approvals"
@@ -2880,9 +2912,6 @@ msgstr "Configurações avançadas"
msgid "Advanced export options"
msgstr "Opções de exportação avançadas"
-msgid "Advanced permissions, Large File Storage and Two-Factor authentication settings."
-msgstr "Permissões avançadas, armazenamento de arquivos grandes e configurações de autenticação de dois fatores."
-
msgid "After a successful password update you will be redirected to login screen."
msgstr "Após uma atualização de senha bem-sucedida, você será redirecionado para a tela de entrada."
@@ -2901,13 +2930,14 @@ msgstr ""
msgid "After you've reviewed these contribution guidelines, you'll be all set to"
msgstr ""
+msgid "Akismet"
+msgstr ""
+
msgid "Akismet API Key"
msgstr "Clave de API de Akismet"
-msgid "Alert"
-msgid_plural "Alerts"
-msgstr[0] "Alerta"
-msgstr[1] "Alertas"
+msgid "Akismet helps prevent the creation of spam issues in public projects."
+msgstr ""
msgid "AlertManagement|Acknowledged"
msgstr "Reconhecido"
@@ -3057,7 +3087,7 @@ msgid "AlertMappingBuilder|Define fallback"
msgstr ""
msgid "AlertMappingBuilder|GitLab alert key"
-msgstr ""
+msgstr "Chave de alerta do GitLab"
msgid "AlertMappingBuilder|Make selection"
msgstr ""
@@ -3263,6 +3293,9 @@ msgstr "Todos os %{replicableType} estão sendo agendados para %{action}"
msgid "All (default)"
msgstr "Todos (padrão)"
+msgid "All GitLab"
+msgstr ""
+
msgid "All Members"
msgstr "Todos os membros"
@@ -3377,6 +3410,9 @@ msgstr "Permitir que esta chave faça push para este repositório"
msgid "Allow this secondary node to replicate content on Object Storage"
msgstr ""
+msgid "Allow use of licensed EE features"
+msgstr ""
+
msgid "Allow users to dismiss the broadcast message"
msgstr ""
@@ -3452,9 +3488,6 @@ msgstr "Logotipo do Amazon Web Services"
msgid "Amazon authentication is not %{link_start}correctly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
-msgid "Amount of time (in hours) that users are allowed to skip forced configuration of two-factor authentication"
-msgstr "Quantidade de tempo (em horas) que os usuários podem ignorar a configuração forçada da autenticação de dois fatores"
-
msgid "An %{link_start}alert%{link_end} with the same fingerprint is already open. To change the status of this alert, resolve the linked alert."
msgstr ""
@@ -3515,12 +3548,6 @@ msgstr "Erro ao pré-visualizar o blob"
msgid "An error occurred when removing the label."
msgstr "Ocorreu um erro ao remover a etiqueta."
-msgid "An error occurred when toggling the notification subscription"
-msgstr "Erro ao modificar notificação de assinatura"
-
-msgid "An error occurred when updating the issue weight"
-msgstr "Ocorreu um erro ao atualizar o peso do issue"
-
msgid "An error occurred when updating the title"
msgstr "Ocorreu um erro ao atualizar o título"
@@ -3569,6 +3596,9 @@ msgstr "Ocorreu um erro ao desenhar links de relação de trabalho."
msgid "An error occurred while enabling Service Desk."
msgstr "Um erro ocorreu ao habilitar a Central de serviços."
+msgid "An error occurred while fetching Markdown preview"
+msgstr ""
+
msgid "An error occurred while fetching ancestors"
msgstr "Ocorreu um erro ao obter antepassados"
@@ -3599,9 +3629,6 @@ msgstr "Ocorreu um erro ao buscar issues."
msgid "An error occurred while fetching label colors."
msgstr "Ocorreu um erro ao buscar cores de rótulo."
-msgid "An error occurred while fetching markdown preview"
-msgstr "Erro ao gerar pré-visualização do markdown"
-
msgid "An error occurred while fetching participants"
msgstr "Ocorreu um erro ao buscar os participantes"
@@ -3617,9 +3644,6 @@ msgstr "Ocorreu um erro ao buscar o autocomplemento de projetos."
msgid "An error occurred while fetching reference"
msgstr "Ocorreu um erro ao obter referência"
-msgid "An error occurred while fetching sidebar data"
-msgstr "Erro ao recuperar informações da barra lateral"
-
msgid "An error occurred while fetching tags. Retry the search."
msgstr "Ocorreu um erro ao obter as tags. Tente novamente a pesquisa."
@@ -3657,7 +3681,7 @@ msgid "An error occurred while getting files for - %{branchId}"
msgstr "Ocorreu um erro ao obter arquivos para - %{branchId}"
msgid "An error occurred while getting issue counts"
-msgstr ""
+msgstr "Ocorreu um erro ao obter contagens de issues"
msgid "An error occurred while getting projects"
msgstr "Erro ao recuperar projetos"
@@ -3695,6 +3719,9 @@ msgstr "Ocorreu um erro ao carregar as issues"
msgid "An error occurred while loading merge requests."
msgstr "Ocorreu um erro ao carregar as solicitações de mesclagem"
+msgid "An error occurred while loading projects."
+msgstr ""
+
msgid "An error occurred while loading the Needs tab."
msgstr ""
@@ -3929,12 +3956,6 @@ msgstr "Qualquer autor"
msgid "Any Milestone"
msgstr "Qualquer marco"
-msgid "Any branch"
-msgstr "Qualquer ramificação"
-
-msgid "Any eligible user"
-msgstr "Qualquer usuário elegível"
-
msgid "Any encrypted tokens"
msgstr "Qualquer tokens criptografados"
@@ -3953,6 +3974,9 @@ msgstr "Qualquer marco"
msgid "Any namespace"
msgstr "Qualquer espaço de nome"
+msgid "App Engine description and apps that are suitable for this deployment target"
+msgstr ""
+
msgid "App ID"
msgstr "App ID"
@@ -4075,7 +4099,7 @@ msgid "ApplicationSettings|Upload denylist file"
msgstr ""
msgid "ApplicationSettings|User cap"
-msgstr ""
+msgstr "Limite de usuários"
msgid "ApplicationSettings|Users with e-mail addresses that match these domain(s) will NOT be able to sign-up. Wildcards allowed. Use separate lines for multiple entries. Ex: domain.com, *.domain.com"
msgstr ""
@@ -4101,6 +4125,11 @@ msgstr "Aplicado"
msgid "Apply"
msgstr "Aplicar"
+msgid "Apply %d suggestion"
+msgid_plural "Apply %d suggestions"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Apply a label"
msgstr "Aplicar uma etiqueta"
@@ -4110,13 +4139,10 @@ msgstr "Aplicar um modelo"
msgid "Apply suggestion"
msgstr "Aplicar sugestão"
-msgid "Apply suggestions"
-msgstr "Aplicar sugestões"
-
msgid "Apply template"
msgstr "Aplicar modelo"
-msgid "Apply this approval rule to any branch or a specific protected branch."
+msgid "Apply this approval rule to all branches or a specific protected branch."
msgstr ""
msgid "Applying"
@@ -4212,10 +4238,10 @@ msgid "ApprovalRule|Number of vulnerabilities allowed before approval rule is tr
msgstr ""
msgid "ApprovalRule|Please enter a number equal or greater than zero"
-msgstr ""
+msgstr "Por favor, insira um número igual ou maior que zero"
msgid "ApprovalRule|Please select at least one security scanner"
-msgstr ""
+msgstr "Por favor, selecione pelo menos uma verificação de segurança"
msgid "ApprovalRule|Please select at least one severity level"
msgstr "Selecione pelo menos um nível de severidade"
@@ -4248,25 +4274,22 @@ msgid "ApprovalSettings|Merge request approval settings have been updated."
msgstr "As configurações de solicitação de mesclagem foram atualizadas"
msgid "ApprovalSettings|Prevent approval by author."
-msgstr ""
+msgstr "Evitar a aprovação por autor."
msgid "ApprovalSettings|Prevent approvals by users who add commits."
-msgstr ""
+msgstr "Evitar aprovações por usuários que adicionarem commits."
msgid "ApprovalSettings|Prevent editing approval rules in merge requests."
-msgstr ""
+msgstr "Evitar a edição de regras de aprovação em solicitações de mesclagem."
msgid "ApprovalSettings|Prevent editing approval rules in projects and merge requests."
-msgstr ""
-
-msgid "ApprovalSettings|Prevent editing approval rules in projects and merge requests. "
-msgstr ""
+msgstr "Evitar a edição de regras de aprovação em projetos e solicitações de mesclagem."
msgid "ApprovalSettings|Remove all approvals when commits are added to the source branch."
-msgstr ""
+msgstr "Remove todas as aprovações quando commits forem adicionados a ramificação de origem."
msgid "ApprovalSettings|Require user password to approve."
-msgstr ""
+msgstr "Exigir senha do usuário para aprovar."
msgid "ApprovalSettings|There was an error loading merge request approval settings."
msgstr ""
@@ -4277,6 +4300,9 @@ msgstr ""
msgid "ApprovalSettings|This setting is configured at the instance level and can only be changed by an administrator."
msgstr "Esta configuração está caracterizada no nível de instância e pode ser somente alterada por um administrador."
+msgid "ApprovalSettings|This setting is configured in %{groupName} and can only be changed by an administrator or group owner."
+msgstr ""
+
msgid "ApprovalStatusTooltip|Adheres to separation of duties"
msgstr ""
@@ -4544,7 +4570,7 @@ msgid "AsanaService|%{user} pushed to branch %{branch} of %{project_name} ( %{co
msgstr "%{user} enviou para o branch %{branch} do projeto %{project_name} ( %{commit_url} ):"
msgid "AsanaService|Add commit messages as comments to Asana tasks."
-msgstr ""
+msgstr "Adicione mensagens de commit como comentários às tarefas Asana."
msgid "AsanaService|Comma-separated list of branches to be automatically inspected. Leave blank to include all branches."
msgstr ""
@@ -4763,9 +4789,6 @@ msgstr "Autenticar com GitHub"
msgid "Authenticated API rate limit period in seconds"
msgstr ""
-msgid "Authenticated API request rate limit"
-msgstr ""
-
msgid "Authenticated API requests"
msgstr "Requisições de API autenticadas"
@@ -4775,11 +4798,11 @@ msgstr ""
msgid "Authenticated Git LFS request rate limit"
msgstr ""
-msgid "Authenticated web rate limit period in seconds"
+msgid "Authenticated Git LFS requests"
msgstr ""
-msgid "Authenticated web request rate limit"
-msgstr "Limite da taxa de solicitação das requisições web autenticada"
+msgid "Authenticated web rate limit period in seconds"
+msgstr ""
msgid "Authenticated web requests"
msgstr "Requisições de web autenticadas"
@@ -4923,13 +4946,13 @@ msgid "AutoRemediation|Introducing GitLab auto-fix"
msgstr ""
msgid "AutoRollback|Automatic rollbacks start when a critical alert is triggered. If the last successful deployment fails to roll back automatically, it can still be done manually."
-msgstr ""
+msgstr "As reversões automáticas começam quando um alerta crítico é acionado. Se a última implantação bem-sucedida falhar em reverter automaticamente, ainda pode ser feito manualmente."
msgid "AutoRollback|Automatically roll back to the last successful deployment when a critical problem is detected."
msgstr ""
msgid "AutoRollback|Enable automatic rollbacks"
-msgstr ""
+msgstr "Ativar reversões automáticas"
msgid "Autocomplete"
msgstr "Autocompletar"
@@ -4950,7 +4973,7 @@ msgid "Automatic certificate management using Let's Encrypt"
msgstr "Gerenciamento automático de certificado usando Let's Encrypt"
msgid "Automatic deployment rollbacks"
-msgstr ""
+msgstr "Reversões de implantação automáticos"
msgid "Automatic event tracking provides a traceable history for audits."
msgstr ""
@@ -5109,7 +5132,7 @@ msgid "BambooService|Atlassian Bamboo"
msgstr "Atlassian Bamboo"
msgid "BambooService|Bamboo URL"
-msgstr ""
+msgstr "URL de Bamboo"
msgid "BambooService|Bamboo build plan key."
msgstr ""
@@ -5118,10 +5141,10 @@ msgid "BambooService|Bamboo service root URL."
msgstr ""
msgid "BambooService|Run CI/CD pipelines with Atlassian Bamboo."
-msgstr ""
+msgstr "Executa CI/CD pipelines com Atlassian Bamboo."
msgid "BambooService|Run CI/CD pipelines with Atlassian Bamboo. You must set up automatic revision labeling and a repository trigger in Bamboo. %{docs_link}"
-msgstr ""
+msgstr "Executa CI/CD pipelines com Atlassian Bamboo. Você deve configurar a rotulagem de revisão automática e um gatilho de repositório no Bamboo. %{docs_link}"
msgid "BambooService|The user with API access to the Bamboo server."
msgstr ""
@@ -5156,9 +5179,6 @@ msgstr ""
msgid "Below you will find all the groups that are public."
msgstr "Abaixo você encontrará todos os grupos que são públicos."
-msgid "Beta"
-msgstr "Beta"
-
msgid "Bi-weekly code coverage"
msgstr "Cobertura semestral de código"
@@ -5398,6 +5418,21 @@ msgstr "Blog"
msgid "Board scope affects which issues are displayed for anyone who visits this board"
msgstr "O escopo do painel afeta quais issues são exibidas para qualquer um que visite este painel"
+msgid "BoardNewEpic|Groups"
+msgstr ""
+
+msgid "BoardNewEpic|Loading groups"
+msgstr ""
+
+msgid "BoardNewEpic|No matching results"
+msgstr ""
+
+msgid "BoardNewEpic|Search groups"
+msgstr ""
+
+msgid "BoardNewEpic|Select a group"
+msgstr ""
+
msgid "BoardNewIssue|No matching results"
msgstr "Nenhum resultado correspondente"
@@ -5444,7 +5479,7 @@ msgid "BoardScope|Select milestone"
msgstr "Selecionar marco"
msgid "BoardScope|Select weight"
-msgstr ""
+msgstr "Selecionar peso"
msgid "BoardScope|Started"
msgstr "Iniciado"
@@ -5475,6 +5510,9 @@ msgstr ""
msgid "Boards|An error occurred while creating the list. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching child groups. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching group projects. Please try again."
msgstr ""
@@ -5616,7 +5654,7 @@ msgid "Branches|All"
msgstr "Todos"
msgid "Branches|Cancel, keep branch"
-msgstr ""
+msgstr "Cancelar, manter ramificação"
msgid "Branches|Cant find HEAD commit for this branch"
msgstr "Não foi possível encontrar o commit HEAD para essa branch"
@@ -5643,7 +5681,7 @@ msgid "Branches|Delete protected branch '%{branch_name}'?"
msgstr "Apagar ramificação protegida '%{branch_name}'?"
msgid "Branches|Delete protected branch. Are you ABSOLUTELY SURE?"
-msgstr ""
+msgstr "Excluir ramificação protegida. Você tem CERTEZA ABSOLUTA disso?"
msgid "Branches|Deleting the %{strongStart}%{branchName}%{strongEnd} branch cannot be undone. Are you sure?"
msgstr "Excluir a ramificação %{strongStart}%{branchName}%{strongEnd} não pode ser desfeito. Você tem certeza?"
@@ -5807,6 +5845,9 @@ msgstr ""
msgid "Bulk update"
msgstr ""
+msgid "BulkImports|Re-import creates a new group. It does not sync with the existing group."
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -5814,13 +5855,16 @@ msgid "BulkImport|Filter by source group"
msgstr "Filtrar por grupo de fonte"
msgid "BulkImport|From source group"
+msgstr "Do grupo de origem"
+
+msgid "BulkImport|Group import history"
msgstr ""
msgid "BulkImport|Import failed: Destination cannot be a subgroup of the source group. Change the destination and try again."
msgstr ""
msgid "BulkImport|Import groups from GitLab"
-msgstr ""
+msgstr "Importar grupos do GitLab"
msgid "BulkImport|Import selected"
msgstr "Importar selecionado"
@@ -5828,9 +5872,18 @@ msgstr "Importar selecionado"
msgid "BulkImport|Importing the group failed"
msgstr ""
+msgid "BulkImport|Last imported to %{link}"
+msgstr ""
+
msgid "BulkImport|Name already exists."
msgstr ""
+msgid "BulkImport|New group"
+msgstr ""
+
+msgid "BulkImport|No history is available"
+msgstr ""
+
msgid "BulkImport|No parent"
msgstr ""
@@ -5843,6 +5896,9 @@ msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} matching filter \"%{filter}\" from %{link}"
msgstr ""
+msgid "BulkImport|Source group"
+msgstr ""
+
msgid "BulkImport|To new group"
msgstr "Para um novo grupo"
@@ -5850,6 +5906,9 @@ msgid "BulkImport|Update of import statuses with realtime changes failed"
msgstr ""
msgid "BulkImport|You have no groups to import"
+msgstr "Você não tem grupos para importar"
+
+msgid "BulkImport|Your imported groups will appear here."
msgstr ""
msgid "BulkImport|expected an associated Group but has an associated Project"
@@ -5966,7 +6025,7 @@ msgstr[0] ""
msgstr[1] ""
msgid "CICDAnalytics|Release statistics"
-msgstr ""
+msgstr "Estatísticas de versão"
msgid "CICDAnalytics|Releases"
msgstr ""
@@ -6071,7 +6130,7 @@ msgid "Callback URL"
msgstr "URL de Retorno"
msgid "Campfire room ID (optional)"
-msgstr ""
+msgstr "ID da sala do Campfire (opcional)"
msgid "Campfire subdomain (optional)"
msgstr "Subdomínio do Campfire (opcional)"
@@ -6094,6 +6153,9 @@ msgstr ""
msgid "Can be manually deployed to"
msgstr "Pode ser implantado manualmente para"
+msgid "Can be overridden in each project."
+msgstr ""
+
msgid "Can create groups:"
msgstr "Pode criar grupos:"
@@ -6196,6 +6258,9 @@ msgstr "Cancelado"
msgid "Cancelling Preview"
msgstr "Cancelando pré-visualização"
+msgid "Cannot assign a confidential epic to a non-confidential issue. Make the issue confidential and try again"
+msgstr ""
+
msgid "Cannot be assigned to other projects."
msgstr "Não pode ser atribuído a outros projetos."
@@ -6247,9 +6312,6 @@ msgstr "Não é possível promover a issue devido a permissões insuficientes."
msgid "Cannot refer to a group %{timebox_type} by an internal id!"
msgstr ""
-msgid "Cannot set confidential epic for a non-confidential issue"
-msgstr ""
-
msgid "Cannot show preview. For previews on sketch files, they must have the file format introduced by Sketch version 43 and above."
msgstr "Não foi possível mostrar a pré-visualização. Para pré-visualizações em arquivos de sketch, eles devem ter o formato de arquivo introduzido pela versão 43 ou superior do Sketch."
@@ -6487,15 +6549,15 @@ msgstr "Verificar disponibilidade de funcionalidades no plano de espaço de nome
msgid "Check out, review, and merge locally"
msgstr ""
-msgid "Check the %{docs_link_start}documentation%{docs_link_end}."
-msgstr "Verifique a %{docs_link_start}documentação%{docs_link_end}."
-
msgid "Check the current instance configuration "
msgstr ""
msgid "Check the elasticsearch.log file to debug why the migration was halted and make any changes before retrying the migration. When you fix the cause of the failure, click \"Retry migration\", and the migration will be scheduled to be retried in the background."
msgstr ""
+msgid "Check with your administrator."
+msgstr ""
+
msgid "Check your Docker images for known vulnerabilities."
msgstr "Verifique suas imagens do Docker quanto a vulnerabilidades conhecidas."
@@ -6526,6 +6588,9 @@ msgstr "Verificando disponibilidade do nome de usuário..."
msgid "Checkout"
msgstr ""
+msgid "Checkout|$%{selectedPlanPrice} per 10 GB storage per pack"
+msgstr ""
+
msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 minutes"
msgstr ""
@@ -6546,17 +6611,23 @@ msgstr "Minutos de CI de%{name}"
msgid "Checkout|%{name}'s GitLab subscription"
msgstr "Assinatura do GitLab de %{name}"
+msgid "Checkout|%{name}'s storage subscription"
+msgstr ""
+
+msgid "Checkout|%{quantity} GB of storage"
+msgstr ""
+
+msgid "Checkout|%{quantity} storage pack"
+msgid_plural "Checkout|%{quantity} storage packs"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Checkout|%{selectedPlanText} plan"
msgstr "plano %{selectedPlanText}"
msgid "Checkout|%{startDate} - %{endDate}"
msgstr "%{startDate} - %{endDate}"
-msgid "Checkout|%{totalCiMinutes} CI minute"
-msgid_plural "Checkout|%{totalCiMinutes} CI minutes"
-msgstr[0] "%{totalCiMinutes} minuto de CI"
-msgstr[1] "%{totalCiMinutes} minutos de CI"
-
msgid "Checkout|%{totalCiMinutes} CI minutes"
msgstr "%{totalCiMinutes} minutos de CI"
@@ -6632,6 +6703,9 @@ msgstr ""
msgid "Checkout|Failed to register credit card. Please try again."
msgstr ""
+msgid "Checkout|GB"
+msgstr ""
+
msgid "Checkout|GitLab group"
msgstr "Grupo no GitLab"
@@ -6668,6 +6742,9 @@ msgstr "Selecionar"
msgid "Checkout|State"
msgstr "Estado"
+msgid "Checkout|Storage packs"
+msgstr ""
+
msgid "Checkout|Street address"
msgstr "Endereço da rua"
@@ -6689,6 +6766,9 @@ msgstr "Total"
msgid "Checkout|Total minutes: %{quantity}"
msgstr "Minutos totais: %{quantity}"
+msgid "Checkout|Total storage: %{quantity} GB"
+msgstr ""
+
msgid "Checkout|Users"
msgstr "Usuários"
@@ -6698,17 +6778,26 @@ msgstr ""
msgid "Checkout|Your organization"
msgstr "Sua organização"
+msgid "Checkout|Your storage subscription has the same term as your main subscription, and the price is prorated accordingly."
+msgstr ""
+
msgid "Checkout|Your subscription will be applied to this group"
msgstr "Sua assinatura será aplicada a este grupo"
msgid "Checkout|Zip code"
msgstr "Código postal"
+msgid "Checkout|a storage subscription"
+msgstr ""
+
msgid "Checkout|company or team"
msgstr "empresa ou equipe"
-msgid "Checkout|x 1,000 minutes per pack = %{strong}"
-msgstr "1.000 minuto por pacote = %{strong}"
+msgid "Checkout|minutes"
+msgstr ""
+
+msgid "Checkout|x %{quantity} %{units} per pack ="
+msgstr ""
msgid "Cherry-pick this commit"
msgstr "Cherry-pick esse commit"
@@ -6945,7 +7034,7 @@ msgid "ClassificationLabelUnavailable|is unavailable: %{reason}"
msgstr "está indisponível: %{reason}"
msgid "Clean up after running %{link_start}git filter-repo%{link_end} on the repository."
-msgstr ""
+msgstr "Limpe após de executar %{link_start}git filter-repo%{link_end} no repositório."
msgid "Clean up image tags"
msgstr "Limpar as tags de imagem"
@@ -7064,6 +7153,9 @@ msgstr ""
msgid "CloneIssue|Cannot clone issue to target project as it is pending deletion."
msgstr ""
+msgid "CloneIssue|Cannot clone issues of '%{issue_type}' type."
+msgstr ""
+
msgid "Cloned this issue to %{path_to_project}."
msgstr "Clonou esta issue para %{path_to_project}."
@@ -7118,8 +7210,11 @@ msgstr "Fechado: %{closed}"
msgid "Closes this %{quick_action_target}."
msgstr "Fecha este %{quick_action_target}."
-msgid "Cloud licenses can not be removed."
-msgstr "Licenças em nuvem não podem ser removidas."
+msgid "Cloud Functions description and apps that are suitable for this deployment target"
+msgstr ""
+
+msgid "Cloud Run description and apps that are suitable for this deployment target"
+msgstr ""
msgid "Cluster"
msgstr "Cluster"
@@ -7145,6 +7240,12 @@ msgstr ""
msgid "ClusterAgents|Access tokens"
msgstr "Tokens de acesso"
+msgid "ClusterAgents|Agent might not be connected to GitLab"
+msgstr ""
+
+msgid "ClusterAgents|Agent never connected to GitLab"
+msgstr ""
+
msgid "ClusterAgents|Alternative installation methods"
msgstr "Métodos de instalação alternativos"
@@ -7160,6 +7261,12 @@ msgstr "Ocorreu um erro desconhecido. Por favor, tente novamente."
msgid "ClusterAgents|Configuration"
msgstr "Configuração"
+msgid "ClusterAgents|Connected"
+msgstr ""
+
+msgid "ClusterAgents|Connection status"
+msgstr ""
+
msgid "ClusterAgents|Copy token"
msgstr "Copiar token"
@@ -7178,11 +7285,14 @@ msgstr "Descrição"
msgid "ClusterAgents|For alternative installation methods %{linkStart}go to the documentation%{linkEnd}."
msgstr ""
+msgid "ClusterAgents|For more troubleshooting information go to"
+msgstr ""
+
msgid "ClusterAgents|Go to the repository"
msgstr "Ir para o repositório"
msgid "ClusterAgents|Install a new GitLab Agent"
-msgstr "Instale um novo agente do GitLab"
+msgstr "Instalar um novo agente do GitLab"
msgid "ClusterAgents|Install new Agent"
msgstr "Instalar novo agente."
@@ -7193,18 +7303,30 @@ msgstr "Integrar Kubernetes com um GitLab Agent"
msgid "ClusterAgents|Integrate with the GitLab Agent"
msgstr "Integrar com o GitLab Agent"
-msgid "ClusterAgents|Last used"
-msgstr "Último uso"
+msgid "ClusterAgents|Last connected %{timeAgo}."
+msgstr ""
+
+msgid "ClusterAgents|Last contact"
+msgstr ""
msgid "ClusterAgents|Learn how to create an agent access token"
msgstr "Aprenda a criar um token de acesso do agente"
+msgid "ClusterAgents|Make sure you are using a valid token."
+msgstr ""
+
msgid "ClusterAgents|Name"
msgstr "Nome"
msgid "ClusterAgents|Never"
msgstr "Nunca"
+msgid "ClusterAgents|Never connected"
+msgstr ""
+
+msgid "ClusterAgents|Not connected"
+msgstr ""
+
msgid "ClusterAgents|Read more about getting started"
msgstr "Leia mais sobre como começar"
@@ -7226,6 +7348,9 @@ msgstr "Selecione o agente que deseja registrar com o GitLab e instale em seu cl
msgid "ClusterAgents|Select which Agent you want to install"
msgstr "Selecione o agente que deseja instalar"
+msgid "ClusterAgents|The Agent has not been connected in a long time. There might be a connectivity issue. Last contact was %{timeAgo}."
+msgstr ""
+
msgid "ClusterAgents|The GitLab Agent also requires %{linkStart}enabling the Agent Server%{linkEnd}"
msgstr "O agente do GitLab também requer %{linkStart}a ativação do servidor do agente%{linkEnd}"
@@ -7253,9 +7378,6 @@ msgstr "Usuário desconhecido"
msgid "ClusterAgents|You will need to create a token to connect to your agent"
msgstr "Você precisará criar um token para conectar ao seu agente"
-msgid "ClusterAgent|This feature is only available for premium plans"
-msgstr ""
-
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -7445,9 +7567,6 @@ msgstr ""
msgid "ClusterIntegration|Create Kubernetes cluster"
msgstr "Criar cluster Kubernetes"
-msgid "ClusterIntegration|Create a provision role on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the account and external ID above. %{startMoreInfoLink}More information%{endLink}"
-msgstr ""
-
msgid "ClusterIntegration|Create cluster on"
msgstr "Criar cluster em"
@@ -7880,7 +7999,7 @@ msgstr ""
msgid "ClusterIntegration|Subnets"
msgstr "Sub-redes"
-msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provisioned role, first create one on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the above account and external IDs. %{startMoreInfoLink}More information%{endLink}"
+msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provisioned role, first create one on %{awsLinkStart}Amazon Web Services %{awsLinkEnd} using the above account and external IDs. %{moreInfoStart}More information%{moreInfoEnd}"
msgstr ""
msgid "ClusterIntegration|The Kubernetes certificate used to authenticate to the cluster."
@@ -8114,6 +8233,9 @@ msgstr "Ocultar marcos"
msgid "Collapse replies"
msgstr "Ocultar respostas"
+msgid "Collapse settings section"
+msgstr ""
+
msgid "Collapse sidebar"
msgstr "Minimizar barra lateral"
@@ -8132,6 +8254,9 @@ msgstr "ComboSearch não está definido"
msgid "Comma-separated list of email addresses."
msgstr ""
+msgid "Comma-separated list of users allowed to exceed the rate limit."
+msgstr ""
+
msgid "Comma-separated, e.g. '1.1.1.1, 2.2.2.0/24'"
msgstr ""
@@ -8327,7 +8452,7 @@ msgid "CompareRevisions|Select branch/tag"
msgstr ""
msgid "CompareRevisions|Select target project"
-msgstr ""
+msgstr "Selecionar projeto alvo"
msgid "CompareRevisions|Swap revisions"
msgstr ""
@@ -8452,6 +8577,9 @@ msgstr ""
msgid "Configure %{repository_checks_link_start}repository checks%{link_end} and %{housekeeping_link_start}housekeeping%{link_end} on repositories."
msgstr ""
+msgid "Configure CAPTCHAs, IP address limits, and other anti-spam measures."
+msgstr ""
+
msgid "Configure Dependency Scanning in `.gitlab-ci.yml` using the GitLab managed template. You can [add variable overrides](https://docs.gitlab.com/ee/user/application_security/dependency_scanning/#customizing-the-dependency-scanning-settings) to customize Dependency Scanning settings."
msgstr ""
@@ -8488,17 +8616,14 @@ msgstr "Configurar rastreamento"
msgid "Configure a %{codeStart}.gitlab-webide.yml%{codeEnd} file in the %{codeStart}.gitlab%{codeEnd} directory to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
msgstr "Configure um arquivo %{codeStart}.gitlab-webide.yml%{codeEnd} no %{codeStart}.gitLab%{codeEnd} para começar a usar o Terminal Web. %{helpStart}Saiba mais.%{helpEnd}"
-msgid "Configure existing installation"
-msgstr "Configurar instalação existente"
-
-msgid "Configure limit for notes created per minute by web and API requests."
+msgid "Configure advanced permissions, Large File Storage, and two-factor authentication settings."
msgstr ""
-msgid "Configure limits for Project/Group Import/Export."
+msgid "Configure approvals by authors and committers on all projects."
msgstr ""
-msgid "Configure limits for web and API requests."
-msgstr "Configurar limites para web e requisições para API."
+msgid "Configure existing installation"
+msgstr "Configurar instalação existente"
msgid "Configure paths to be protected by Rack Attack."
msgstr ""
@@ -8512,10 +8637,13 @@ msgstr "Configurar armazenamento de repositório."
msgid "Configure settings for Advanced Search with Elasticsearch."
msgstr ""
+msgid "Configure specific limits for Files API requests that supersede the general user and IP rate limits."
+msgstr ""
+
msgid "Configure specific limits for Git LFS requests that supersede the general user and IP rate limits."
msgstr ""
-msgid "Configure specific limits for Packages API requests that supersede the general user and IP rate limits."
+msgid "Configure specific limits for deprecated API requests that supersede the general user and IP rate limits."
msgstr ""
msgid "Configure the %{link} integration."
@@ -8527,6 +8655,9 @@ msgstr ""
msgid "Configure the way a user creates a new account."
msgstr "Configurar a forma como o usuário cria uma nova conta."
+msgid "Configure via Merge Request"
+msgstr ""
+
msgid "Configure which lists are shown for anyone who visits this board"
msgstr "Configure quais listas são mostradas para qualquer pessoa que visita este painel"
@@ -8715,7 +8846,7 @@ msgid "ContainerRegistry|Cleanup is disabled for this project"
msgstr ""
msgid "ContainerRegistry|Cleanup is ongoing"
-msgstr ""
+msgstr "A limpeza está em andamento"
msgid "ContainerRegistry|Cleanup pending"
msgstr "Limpeza pendente"
@@ -8995,6 +9126,9 @@ msgstr ""
msgid "Content parsed with %{link}."
msgstr ""
+msgid "ContentEditor|Table of Contents"
+msgstr ""
+
msgid "ContentEditor|You have to provide a renderMarkdown function or a custom serializer"
msgstr ""
@@ -9181,6 +9315,9 @@ msgstr "Copiar link"
msgid "Copy link to chart"
msgstr "Copiar link para o gráfico"
+msgid "Copy prefix"
+msgstr ""
+
msgid "Copy reference"
msgstr "Copiar referência"
@@ -9211,6 +9348,9 @@ msgstr "Copiar token de gatilho"
msgid "Copy value"
msgstr "Copiar valor"
+msgid "Corpus Management"
+msgstr ""
+
msgid "Corpus Management|Are you sure you want to delete the corpus?"
msgstr ""
@@ -9233,7 +9373,7 @@ msgid "CorpusManagement|Last used"
msgstr "Último uso"
msgid "CorpusManagement|Latest Job:"
-msgstr ""
+msgstr "Última tarefa:"
msgid "CorpusManagement|New corpus needs to be a upload in *.zip format. Maximum 10GB"
msgstr ""
@@ -9439,6 +9579,9 @@ msgstr "Criar a branch"
msgid "Create commit"
msgstr "Criar commit"
+msgid "Create common files more quickly, and standardize their format."
+msgstr ""
+
msgid "Create confidential merge request"
msgstr "Criar merge request confidencial"
@@ -9472,6 +9615,9 @@ msgstr "Criar incidente"
msgid "Create issue"
msgstr "Criar issue"
+msgid "Create issue to resolve all threads"
+msgstr ""
+
msgid "Create iteration"
msgstr "Criar interação"
@@ -9526,6 +9672,9 @@ msgstr "Criar novo projeto"
msgid "Create new..."
msgstr "Criar novo..."
+msgid "Create or import your first project"
+msgstr ""
+
msgid "Create project"
msgstr "Criar projeto"
@@ -9590,46 +9739,46 @@ msgid "CreateValueStreamForm|All default stages are currently visible"
msgstr ""
msgid "CreateValueStreamForm|Code stage start"
-msgstr ""
+msgstr "Início da fase de código"
msgid "CreateValueStreamForm|Create Value Stream"
-msgstr ""
+msgstr "Criar fluxo de valor"
msgid "CreateValueStreamForm|Create from default template"
-msgstr ""
+msgstr "Criar a partir do modelo padrão"
msgid "CreateValueStreamForm|Create from no template"
msgstr "Criar a partir do modelo"
msgid "CreateValueStreamForm|Create new Value Stream"
-msgstr ""
+msgstr "Criar novo fluxo de valor"
msgid "CreateValueStreamForm|Default stages"
-msgstr ""
+msgstr "Estágios padrão"
msgid "CreateValueStreamForm|Default stages can only be hidden or re-ordered"
-msgstr ""
+msgstr "Estágios padrão só podem ser ocultados ou reordenados"
msgid "CreateValueStreamForm|Edit Value Stream"
-msgstr ""
+msgstr "Editar fluxo de valor"
msgid "CreateValueStreamForm|Editing stage"
-msgstr ""
+msgstr "Estágio de edição"
msgid "CreateValueStreamForm|End event"
-msgstr ""
+msgstr "Fim do evento"
msgid "CreateValueStreamForm|End event label"
-msgstr ""
+msgstr "Etiqueta de fim de evento"
msgid "CreateValueStreamForm|End event: "
-msgstr ""
+msgstr "Fim do evento: "
msgid "CreateValueStreamForm|Enter stage name"
-msgstr ""
+msgstr "Digite o nome do estágio"
msgid "CreateValueStreamForm|Enter value stream name"
-msgstr ""
+msgstr "Digite o nome do fluxo do valor"
msgid "CreateValueStreamForm|Issue stage end"
msgstr ""
@@ -9653,13 +9802,13 @@ msgid "CreateValueStreamForm|Please select an end event"
msgstr ""
msgid "CreateValueStreamForm|Recover hidden stage"
-msgstr ""
+msgstr "Recuperar estágio oculto"
msgid "CreateValueStreamForm|Restore defaults"
msgstr ""
msgid "CreateValueStreamForm|Restore stage"
-msgstr ""
+msgstr "Restaurar estágio"
msgid "CreateValueStreamForm|Save Value Stream"
msgstr ""
@@ -9671,7 +9820,7 @@ msgid "CreateValueStreamForm|Select start event"
msgstr ""
msgid "CreateValueStreamForm|Stage %{index}"
-msgstr ""
+msgstr "Estágio %{index}"
msgid "CreateValueStreamForm|Stage name already exists"
msgstr ""
@@ -9680,19 +9829,19 @@ msgid "CreateValueStreamForm|Stage name is required"
msgstr ""
msgid "CreateValueStreamForm|Start event"
-msgstr ""
+msgstr "Início do evento"
msgid "CreateValueStreamForm|Start event changed, please select a valid end event"
msgstr ""
msgid "CreateValueStreamForm|Start event label"
-msgstr ""
+msgstr "Etiqueta de início de evento"
msgid "CreateValueStreamForm|Start event: "
-msgstr ""
+msgstr "Início do evento: "
msgid "CreateValueStreamForm|Update stage"
-msgstr ""
+msgstr "Estágio de atualização"
msgid "CreateValueStreamForm|Value Stream name"
msgstr ""
@@ -9809,10 +9958,10 @@ msgid "CsvParser|Quoted field unterminated"
msgstr ""
msgid "CsvParser|Too few fields"
-msgstr ""
+msgstr "Poucos campos"
msgid "CsvParser|Too many fields"
-msgstr ""
+msgstr "Muitos campos"
msgid "CsvParser|Trailing quote on quoted field is malformed"
msgstr ""
@@ -9848,19 +9997,19 @@ msgid "Current vulnerabilities count"
msgstr "Contador de vulnerabilidades"
msgid "CurrentUser|Buy Pipeline minutes"
-msgstr ""
+msgstr "Comprar minutos de pipeline"
msgid "CurrentUser|Edit profile"
msgstr "Editar perfil"
msgid "CurrentUser|One of your groups is running out"
-msgstr ""
+msgstr "Um dos seus grupos está se esgotando"
msgid "CurrentUser|Preferences"
msgstr "Preferências"
msgid "CurrentUser|Start an Ultimate trial"
-msgstr ""
+msgstr "Iniciar uma avaliação do Ultimate"
msgid "CurrentUser|Upgrade"
msgstr "Atualizar"
@@ -9883,7 +10032,7 @@ msgstr "Métricas personalizadas"
msgid "Custom notification events"
msgstr "Eventos de notificação personalizados"
-msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notificationLinkStart} notification emails%{notificationLinkEnd}."
+msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notificationLinkStart}notification emails%{notificationLinkEnd}."
msgstr ""
msgid "Custom project templates"
@@ -9926,13 +10075,13 @@ msgid "Customize your pipeline configuration and coverage report."
msgstr "Personalize a sua configuração de pipeline e relatório de cobertura."
msgid "Customize your pipeline configuration."
-msgstr ""
+msgstr "Personalize a configuração de pipeline."
msgid "CustomizeHomepageBanner|Do you want to customize this page?"
msgstr "Você quer personalizar esta página?"
msgid "CustomizeHomepageBanner|Go to preferences"
-msgstr ""
+msgstr "Vá para preferências"
msgid "CustomizeHomepageBanner|This page shows a list of your projects by default but it can be changed to show projects' activity, groups, your to-do list, assigned issues, assigned merge requests, and more. You can change this under \"Homepage content\" in your preferences"
msgstr "Essa página mostra uma lista de seus projetos por padrão, mas pode ser alterada para mostrar atividade de projetos, grupos, sua lista de tarefas pendentes, issues atribuídas, solicitações de mesclagem atribuídas, e muito mais. Você pode alterar isso em \"Conteúdo da página inicial\" nas suas preferências."
@@ -10037,7 +10186,7 @@ msgid "CycleAnalyticsStage|should be under a group"
msgstr "deve estar em um grupo"
msgid "CycleAnalytics|%{selectedLabelsCount} selected (%{maxLabels} max)"
-msgstr ""
+msgstr "%{selectedLabelsCount} selecionado (%{maxLabels} max)"
msgid "CycleAnalytics|%{stageCount} stages selected"
msgstr "%{stageCount} estágios selecionados"
@@ -10046,7 +10195,7 @@ msgid "CycleAnalytics|All stages"
msgstr "Todas os estágios"
msgid "CycleAnalytics|Average days to completion"
-msgstr ""
+msgstr "Média de dias para conclusão"
msgid "CycleAnalytics|Date"
msgstr "Data"
@@ -10055,7 +10204,7 @@ msgid "CycleAnalytics|Days to completion"
msgstr "Dias para completar"
msgid "CycleAnalytics|Display chart filters"
-msgstr ""
+msgstr "Mostrar filtros de gráficos"
msgid "CycleAnalytics|No stages selected"
msgstr "Nenhum estágios selecionados"
@@ -10082,11 +10231,11 @@ msgid_plural "CycleAnalytics|Showing %{subjectFilterText} and %{selectedLabelsCo
msgstr[0] "Mostrando %{subjectFilterText} e %{selectedLabelsCount} etiqueta"
msgstr[1] "Mostrando %{subjectFilterText} e %{selectedLabelsCount} etiquetas"
-msgid "CycleAnalytics|Showing data for group '%{groupName}' and %{selectedProjectCount} projects from %{startDate} to %{endDate}"
+msgid "CycleAnalytics|Showing data for group '%{groupName}' and %{selectedProjectCount} projects from %{createdAfter} to %{createdBefore}"
msgstr ""
-msgid "CycleAnalytics|Showing data for group '%{groupName}' from %{startDate} to %{endDate}"
-msgstr "Mostrando dados para o grupo '%{groupName}' de %{startDate} a %{endDate}"
+msgid "CycleAnalytics|Showing data for group '%{groupName}' from %{createdAfter} to %{createdBefore}"
+msgstr ""
msgid "CycleAnalytics|Stages"
msgstr "Estágios"
@@ -10095,10 +10244,10 @@ msgid "CycleAnalytics|Tasks by type"
msgstr "Tarefas por tipo"
msgid "CycleAnalytics|The average time spent in the selected stage for the items that were completed on each date. Data limited to the last 500 items."
-msgstr ""
+msgstr "O tempo médio gasto no estágio selecionado para os itens que foram concluídos em cada data. Dados limitados aos últimos 500 itens."
msgid "CycleAnalytics|The given date range is larger than 180 days"
-msgstr ""
+msgstr "O intervalo de datas fornecido é superior a 180 dias"
msgid "CycleAnalytics|Type of work"
msgstr "Tipo de trabalho"
@@ -10140,7 +10289,7 @@ msgid "DORA4Metrics|Deployment frequency"
msgstr "Frequência de implantação"
msgid "DORA4Metrics|Lead time"
-msgstr ""
+msgstr "Tempo de espera"
msgid "DORA4Metrics|Median lead time"
msgstr ""
@@ -10224,7 +10373,7 @@ msgid "DastProfiles|Branch missing"
msgstr "Branch faltando"
msgid "DastProfiles|Could not create the scanner profile. Please try again."
-msgstr ""
+msgstr "Não foi possível criar o perfil da verificação. Por favor, tente novamente."
msgid "DastProfiles|Could not create the site profile. Please try again."
msgstr ""
@@ -10299,24 +10448,27 @@ msgid "DastProfiles|Enter headers in a comma-separated list."
msgstr ""
msgid "DastProfiles|Error Details"
-msgstr ""
+msgstr "Detalhes do erro"
msgid "DastProfiles|Excluded URLs"
-msgstr ""
+msgstr "URLs excluídas"
msgid "DastProfiles|Excluded URLs (Optional)"
-msgstr ""
+msgstr "URLs excluídas (Opcional)"
msgid "DastProfiles|Hide debug messages"
msgstr "Ocultar mensagens de depuração"
msgid "DastProfiles|Include debug messages in the DAST console output."
-msgstr ""
+msgstr "Incluir mensagens de depuração (debug) no console de saída do DAST."
msgid "DastProfiles|Manage DAST scans"
msgstr "Gerenciar verificações de DAST"
msgid "DastProfiles|Manage profiles"
+msgstr "Gerenciar perfis"
+
+msgid "DastProfiles|Manage site profiles"
msgstr ""
msgid "DastProfiles|Minimum = 0 (no timeout enabled), Maximum = 2880 minutes"
@@ -10350,16 +10502,16 @@ msgid "DastProfiles|Password"
msgstr "Senha"
msgid "DastProfiles|Password form field"
-msgstr ""
+msgstr "Campo de formulário de senha"
msgid "DastProfiles|Profile name"
msgstr "Nome do perfil"
msgid "DastProfiles|Request header names and values. Headers are added to every request made by DAST."
-msgstr ""
+msgstr "Nomes e valores dos cabeçalhos de requisição. Cabeçalhos são adicionados em cada requisição realizada pelo DAST."
msgid "DastProfiles|Request headers"
-msgstr ""
+msgstr "Cabeçalhos de requisição"
msgid "DastProfiles|Rest API"
msgstr ""
@@ -10371,7 +10523,7 @@ msgid "DastProfiles|Run the AJAX spider, in addition to the traditional spider,
msgstr ""
msgid "DastProfiles|Save commonly used configurations for target sites and scan specifications as profiles. Use these with an on-demand scan."
-msgstr ""
+msgstr "Salvar configurações comumente usadas para sites de destino e especificações de verificação como perfis. Use-os com uma verificação sob demanda."
msgid "DastProfiles|Save profile"
msgstr "Salvar perfil"
@@ -10394,6 +10546,9 @@ msgstr "Perfis de verificação"
msgid "DastProfiles|Scanner name"
msgstr "Nome da verificação"
+msgid "DastProfiles|Schedule"
+msgstr ""
+
msgid "DastProfiles|Select branch"
msgstr "Selecionar branch"
@@ -10416,10 +10571,10 @@ msgid "DastProfiles|Spider timeout"
msgstr ""
msgid "DastProfiles|Target"
-msgstr ""
+msgstr "Alvo"
msgid "DastProfiles|Target URL"
-msgstr ""
+msgstr "URL alvo"
msgid "DastProfiles|Target timeout"
msgstr "Tempo limite de destino"
@@ -10431,7 +10586,7 @@ msgid "DastProfiles|The maximum number of seconds allowed for the site under tes
msgstr ""
msgid "DastProfiles|This profile is currently being used in a policy."
-msgstr ""
+msgstr "Este perfil está atualmente sendo usado em uma política."
msgid "DastProfiles|This scanner profile is currently being used by a policy. To make edits you must remove it from the active policy."
msgstr ""
@@ -10452,7 +10607,7 @@ msgid "DastProfiles|Username"
msgstr "Nome de usuário"
msgid "DastProfiles|Username form field"
-msgstr ""
+msgstr "Campo de formulário de nome de usuário"
msgid "DastProfiles|Validated"
msgstr "Validado"
@@ -10463,7 +10618,7 @@ msgstr "Status da validação"
msgid "DastProfiles|Website"
msgstr "Site"
-msgid "DastProfiles|You can either choose a passive scan or validate the target site in your chosen site profile. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
+msgid "DastProfiles|You can either choose a passive scan or validate the target site from the site profile management page. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
msgstr ""
msgid "DastProfiles|You cannot run an active scan against an unvalidated site."
@@ -10598,7 +10753,7 @@ msgid "DatadogIntegration|The Datadog site to send data to. To send data to the
msgstr ""
msgid "DatadogIntegration|Trace your GitLab pipelines with Datadog."
-msgstr ""
+msgstr "Rastreie seus pipelines GitLab com Datadog."
msgid "Datasource name not found"
msgstr ""
@@ -10636,7 +10791,7 @@ msgstr "Dias"
msgid "Days to merge"
msgstr "Dias para mesclar"
-msgid "Deactivate dormant users after 90 days of inactivity. Users can return to active status by signing in to their account. While inactive, a user is not counted as an active user in the instance."
+msgid "Deactivate dormant users after 90 days of inactivity"
msgstr ""
msgid "Dear Administrator,"
@@ -10723,11 +10878,11 @@ msgstr ""
msgid "Define a custom pattern with cron syntax"
msgstr "Defina um padrão personalizado utilizando a sintaxe do cron"
-msgid "Define approval settings."
-msgstr "Defina as configuração de aprovação."
+msgid "Define approval rules."
+msgstr ""
-msgid "Define approval settings. %{linkStart}Learn more.%{linkEnd}"
-msgstr "Defina as configuração de aprovação. %{linkStart}Saiba mais.%{linkEnd}"
+msgid "Define approval rules. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
msgid "Define custom rules for what constitutes spam, independent of Akismet"
msgstr ""
@@ -10735,7 +10890,7 @@ msgstr ""
msgid "Define environments in the deploy stage(s) in %{code_open}.gitlab-ci.yml%{code_close} to track deployments here."
msgstr ""
-msgid "Define how approval rules are applied as a merge request moves toward completion."
+msgid "Define how approval rules are applied to merge requests."
msgstr ""
msgid "Definition"
@@ -10750,6 +10905,12 @@ msgstr ""
msgid "DelayedJobs|Are you sure you want to run %{job_name} immediately? This job will run automatically after it's timer finishes."
msgstr "Tem certeza que deseja executar %{job_name} imediatamente? Essa tarefa será executada automaticamente após seu tempo acabar."
+msgid "DelayedJobs|Are you sure you want to run %{job_name} immediately? This job will run automatically after its timer finishes."
+msgstr ""
+
+msgid "DelayedJobs|Run the delayed job now?"
+msgstr ""
+
msgid "DelayedJobs|Start now"
msgstr "Iniciar agora"
@@ -10793,7 +10954,7 @@ msgid "Delete comment"
msgstr "Excluir comentário"
msgid "Delete corpus"
-msgstr ""
+msgstr "Excluir corpus"
msgid "Delete domain"
msgstr "Excluir domínio"
@@ -11026,6 +11187,12 @@ msgstr "A funcionalidade de proxy de dependências está limitada a grupos públ
msgid "Dependency proxy image prefix"
msgstr ""
+msgid "DependencyProxy|Create a local proxy for storing frequently used upstream images. %{docLinkStart}Learn more%{docLinkEnd} about dependency proxies."
+msgstr ""
+
+msgid "DependencyProxy|Dependency Proxy"
+msgstr ""
+
msgid "DependencyProxy|Toggle Dependency Proxy"
msgstr "Alternar proxy de dependências"
@@ -11072,7 +11239,7 @@ msgid "DeployFreeze|Add deploy freeze"
msgstr ""
msgid "DeployFreeze|Delete"
-msgstr "Excluir"
+msgstr "Exclusão"
msgid "DeployFreeze|Delete deploy freeze?"
msgstr ""
@@ -11084,7 +11251,7 @@ msgid "DeployFreeze|Deploy freeze from %{start} to %{end} in %{timezone} will be
msgstr ""
msgid "DeployFreeze|Edit"
-msgstr "Editar"
+msgstr "Edição"
msgid "DeployFreeze|Freeze end"
msgstr ""
@@ -11126,7 +11293,7 @@ msgid "DeployKeys|Expand %{count} other projects"
msgstr "Expandir %{count} outros projetos"
msgid "DeployKeys|Grant write permissions to this key"
-msgstr ""
+msgstr "Conceder permissões de escrita a esta chave"
msgid "DeployKeys|Loading deploy keys"
msgstr "Carregando chaves de implantação"
@@ -11189,7 +11356,7 @@ msgid "DeployTokens|Enter a unique name for your deploy token."
msgstr "Digite um nome exclusivo para o seu token de implantação."
msgid "DeployTokens|Enter a username for your token. Defaults to %{code_start}gitlab+deploy-token-{n}%{code_end}."
-msgstr ""
+msgstr "Digite um nome de usuário para o seu token. O padrão é %{code_start}gitlab+deploy-token-{n}%{code_end}."
msgid "DeployTokens|Enter an expiration date for your token. Defaults to never expire."
msgstr "Digite uma data de expiração para o seu token. O padrão é nunca expirar."
@@ -11216,7 +11383,7 @@ msgid "DeployTokens|Scopes"
msgstr "Escopos"
msgid "DeployTokens|This %{entity_type} has no active Deploy Tokens."
-msgstr ""
+msgstr "Este %{entity_type} não tem nenhuma tokem de implantação ativa."
msgid "DeployTokens|This action cannot be undone."
msgstr "Esta ação não pode ser desfeita."
@@ -11266,6 +11433,9 @@ msgstr "Frequência de implantação"
msgid "Deployments"
msgstr "Implementações"
+msgid "Deployments to Google Kubernetes Engine can be "
+msgstr ""
+
msgid "Deployments|%{deployments} environment impacted."
msgid_plural "Deployments|%{deployments} environments impacted."
msgstr[0] "%{deployments} ambiente impactado."
@@ -11295,6 +11465,9 @@ msgstr "pulado"
msgid "Deployment|success"
msgstr "sucesso"
+msgid "Deprecated API rate limits"
+msgstr ""
+
msgid "Deprioritize label"
msgstr "Despriorizar etiqueta"
@@ -11503,10 +11676,10 @@ msgid "DevopsAdoption|Add a group to get started"
msgstr ""
msgid "DevopsAdoption|Add or remove groups"
-msgstr ""
+msgstr "Adicionar ou remover grupos"
msgid "DevopsAdoption|Add or remove subgroups"
-msgstr ""
+msgstr "Adicionar ou remover subgrupos"
msgid "DevopsAdoption|Adopted"
msgstr "Adotado"
@@ -11551,7 +11724,7 @@ msgid "DevopsAdoption|Confirm remove Group"
msgstr ""
msgid "DevopsAdoption|DAST"
-msgstr ""
+msgstr "DAST"
msgid "DevopsAdoption|DAST enabled for at least one project"
msgstr ""
@@ -11566,7 +11739,7 @@ msgid "DevopsAdoption|Deploys"
msgstr ""
msgid "DevopsAdoption|Dev"
-msgstr ""
+msgstr "Dev"
msgid "DevopsAdoption|DevOps adoption tracks the use of key features across your favorite groups. Add a group to the table to begin."
msgstr ""
@@ -11599,10 +11772,10 @@ msgid "DevopsAdoption|Not adopted"
msgstr "Não adotado"
msgid "DevopsAdoption|Ops"
-msgstr ""
+msgstr "Ops"
msgid "DevopsAdoption|Overall adoption"
-msgstr ""
+msgstr "Adoção geral"
msgid "DevopsAdoption|Pipelines"
msgstr "Pipelines"
@@ -11620,13 +11793,13 @@ msgid "DevopsAdoption|Runners"
msgstr "Executores"
msgid "DevopsAdoption|SAST"
-msgstr ""
+msgstr "SAST"
msgid "DevopsAdoption|SAST enabled for at least one project"
msgstr ""
msgid "DevopsAdoption|Sec"
-msgstr ""
+msgstr "Sec"
msgid "DevopsAdoption|There was an error enabling the current group. Please refresh the page."
msgstr ""
@@ -11650,28 +11823,28 @@ msgid "DevopsReport|DevOps score metrics are based on usage over the last 30 day
msgstr ""
msgid "DevopsReport|High"
-msgstr ""
+msgstr "Alto"
msgid "DevopsReport|Leader usage"
msgstr ""
msgid "DevopsReport|Low"
-msgstr ""
+msgstr "Baixo"
msgid "DevopsReport|Moderate"
-msgstr ""
+msgstr "Moderado"
msgid "DevopsReport|Overview"
-msgstr ""
+msgstr "Visão geral"
msgid "DevopsReport|Score"
msgstr ""
msgid "DevopsReport|Your score"
-msgstr ""
+msgstr "Sua pontuação"
msgid "DevopsReport|Your usage"
-msgstr ""
+msgstr "Seu uso"
msgid "Didn't receive a confirmation email?"
msgstr "Não recebeu um e-mail de confirmação?"
@@ -11697,6 +11870,16 @@ msgstr ""
msgid "DiffsCompareBaseBranch|(base)"
msgstr "(base)"
+msgid "Diffs|%d addition"
+msgid_plural "Diffs|%d additions"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Diffs|%d deletion"
+msgid_plural "Diffs|%d deletions"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Diffs|No file name available"
msgstr "Nenhum nome de arquivo disponível"
@@ -11706,9 +11889,17 @@ msgstr "Mostrar %{unfoldCount} linhas"
msgid "Diffs|Show all unchanged lines"
msgstr "Mostrar todas as linhas sem alterações"
+msgid "Diffs|Showing %{dropdownStart}%{count} changed file%{dropdownEnd}"
+msgid_plural "Diffs|Showing %{dropdownStart}%{count} changed files%{dropdownEnd}"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Diffs|Something went wrong while fetching diff lines."
msgstr "Algo errado aconteceu ao buscar linhas de comparação."
+msgid "Diffs|with %{additions} and %{deletions}"
+msgstr ""
+
msgid "Direct member"
msgstr "Membro direto"
@@ -11773,10 +11964,10 @@ msgid "DiscordService|Discord Notifications"
msgstr "Notificações do Discord"
msgid "DiscordService|Send notifications about project events to a Discord channel."
-msgstr ""
+msgstr "Envie notificações sobre eventos de projeto para um canal Discord."
msgid "Discover"
-msgstr ""
+msgstr "Descobrir"
msgid "Discover GitLab Geo"
msgstr "Descubra o GitLab Geo"
@@ -11834,9 +12025,6 @@ msgid_plural "Dismiss %d selected vulnerabilities as"
msgstr[0] ""
msgstr[1] ""
-msgid "Dismiss Value Stream Analytics introduction box"
-msgstr ""
-
msgid "Dismiss merge request promotion"
msgstr ""
@@ -12057,7 +12245,7 @@ msgid "During this process, you’ll be asked for URLs from GitLab’s side. Use
msgstr "Durante esse processo, você será perguntado por URLs do lado do GitLab. Use os URLs mostrados abaixo."
msgid "Dynamic Application Security Testing (DAST)"
-msgstr ""
+msgstr "Teste de segurança de aplicativo dinâmico (DAST)"
msgid "E-mail:"
msgstr "E-mail:"
@@ -12158,6 +12346,9 @@ msgstr ""
msgid "Edit issues"
msgstr "Editar issues"
+msgid "Edit merge requests"
+msgstr ""
+
msgid "Edit public deploy key"
msgstr "Editar chave de implantação pública"
@@ -12195,7 +12386,7 @@ msgid "Editing"
msgstr "Editando"
msgid "Elapsed time"
-msgstr ""
+msgstr "Tempo decorrido"
msgid "Elasticsearch AWS IAM credentials"
msgstr ""
@@ -12233,6 +12424,9 @@ msgstr "Nenhum. Selecione espaços de nome para indexar."
msgid "Elastic|None. Select projects to index."
msgstr "Nenhum. Selecione projetos para indexar."
+msgid "Eligible users"
+msgstr ""
+
msgid "Email"
msgstr "E-mail"
@@ -12273,7 +12467,7 @@ msgid "Email the pipeline status to a list of recipients."
msgstr "Envie o status do pipeline para uma lista de e-mails."
msgid "Email updates (optional)"
-msgstr ""
+msgstr "Atualizações via e-mail (opcional)"
msgid "Email:"
msgstr "E-mail:"
@@ -12312,7 +12506,7 @@ msgid "EmailParticipantsWarning|%{emails}, %{andMore} will be notified of your c
msgstr ""
msgid "EmailParticipantsWarning|and %{moreCount} more"
-msgstr ""
+msgstr "e %{moreCount} mais"
msgid "Emails"
msgstr "E-mails"
@@ -12321,7 +12515,7 @@ msgid "Emails sent from Service Desk have this name."
msgstr "OS e-mails enviados pela central de serviços tem esse nome."
msgid "Emails sent to %{email} are also supported."
-msgstr ""
+msgstr "E-mails enviados para %{email} também são suportados."
msgid "EmailsOnPushService|Disable code diffs"
msgstr ""
@@ -12330,7 +12524,7 @@ msgid "EmailsOnPushService|Don't include possibly sensitive code diffs in notifi
msgstr ""
msgid "EmailsOnPushService|Email the commits and diff of each push to a list of recipients."
-msgstr ""
+msgstr "Enviar por e-mail os commits e diff de cada push para uma lista de destinatários."
msgid "EmailsOnPushService|Emails on push"
msgstr ""
@@ -12362,6 +12556,9 @@ msgstr "Arquivo vazio"
msgid "Enable"
msgstr "Ativar"
+msgid "Enable Amazon EKS integration"
+msgstr ""
+
msgid "Enable Auto DevOps"
msgstr "Ativar Auto DevOps"
@@ -12395,6 +12592,9 @@ msgstr ""
msgid "Enable SSL verification"
msgstr "Ativar verificação SSL"
+msgid "Enable Service Ping"
+msgstr ""
+
msgid "Enable Snowplow tracking"
msgstr ""
@@ -12425,6 +12625,9 @@ msgstr ""
msgid "Enable authenticated Git LFS request rate limit"
msgstr ""
+msgid "Enable authenticated web request rate limit"
+msgstr ""
+
msgid "Enable authentication"
msgstr "Ativar autenticação"
@@ -12480,12 +12683,12 @@ msgid "Enable maintenance mode"
msgstr "Ativar modo de manutenção"
msgid "Enable multipart emails"
-msgstr ""
+msgstr "Ativar múltiplos e-mails"
msgid "Enable or disable the Pseudonymizer data collection."
msgstr "Ative ou desative a coleção de dados Pseudonymizer"
-msgid "Enable or disable version check and service ping."
+msgid "Enable or disable version check and Service Ping."
msgstr ""
msgid "Enable protected paths rate limit"
@@ -12497,18 +12700,12 @@ msgstr "Habilitar proxy"
msgid "Enable reCAPTCHA"
msgstr "Ativar reCAPTCHA"
-msgid "Enable reCAPTCHA for login"
-msgstr ""
-
-msgid "Enable reCAPTCHA, Invisible Captcha, Akismet and set IP limits. For reCAPTCHA, we currently only support %{recaptcha_v2_link_start}v2%{recaptcha_v2_link_end}"
+msgid "Enable reCAPTCHA for login."
msgstr ""
msgid "Enable repository checks"
msgstr "Ativar as verificações de repositório"
-msgid "Enable service ping"
-msgstr ""
-
msgid "Enable shared runners for all projects and subgroups in this group."
msgstr ""
@@ -12530,7 +12727,10 @@ msgstr "Ativar autenticação de dois fatores"
msgid "Enable unauthenticated API request rate limit"
msgstr ""
-msgid "Enable unauthenticated request rate limit"
+msgid "Enable unauthenticated web request rate limit"
+msgstr ""
+
+msgid "Enable user deactivation emails"
msgstr ""
msgid "Enable version check"
@@ -12566,35 +12766,32 @@ msgstr ""
msgid "Enabled sources for code import during project creation. OmniAuth must be configured for GitHub"
msgstr "As fontes para importação de código durante a criação de projetos foram ativadas. O OmniAuth deve ser configurado para o GitHub."
-msgid "Enabling this will only make licensed EE features available to projects if the project namespace's plan includes the feature or if the project is public."
-msgstr "Ativar isto apenas disponibilizará os recursos EE licenciados para projetos se o plano do espaço de nome do projeto incluir o recurso ou se o projeto for público."
-
msgid "Encountered an error while rendering: %{err}"
msgstr ""
msgid "End Time"
-msgstr ""
+msgstr "Horário de término"
msgid "Ends"
-msgstr ""
+msgstr "Termina"
msgid "Ends at (UTC)"
msgstr "Termina em (UTC)"
msgid "Ends on"
-msgstr ""
+msgstr "Termina em"
msgid "Ends: %{endsAt}"
-msgstr ""
+msgstr "Termina em: %{endsAt}"
msgid "Enforce DNS rebinding attack protection"
msgstr ""
msgid "Enforce SSH key expiration"
-msgstr ""
+msgstr "Forçar expiração de chave SSH"
msgid "Enforce personal access token expiration"
-msgstr ""
+msgstr "Forçar expiração do token de acesso pessoal"
msgid "Enforce two-factor authentication"
msgstr "Forçar autenticação de dois fatores"
@@ -12612,29 +12809,23 @@ msgid "Enter %{weights_link_start}weights%{weights_link_end} for storages for ne
msgstr ""
msgid "Enter 2FA for Admin Mode"
-msgstr ""
+msgstr "Insira 2FA (chave de dois fatores) para o modo de administrador"
msgid "Enter Admin Mode"
msgstr "Entrar no modo administrativo"
-msgid "Enter IP address range"
-msgstr "Insira o intervalo de endereços IP"
-
msgid "Enter a number"
msgstr "Digite um número"
msgid "Enter an integer number between 0 and 100"
-msgstr ""
+msgstr "Digite um número inteiro entre 0 e 100"
msgid "Enter an integer number number between 0 and 100"
-msgstr ""
+msgstr "Digite um número inteiro entre 0 e 100"
msgid "Enter at least three characters to search"
msgstr "Digite pelo menos três caracteres para pesquisar"
-msgid "Enter domain"
-msgstr "Insira o domínio"
-
msgid "Enter in your Bitbucket Server URL and personal access token below"
msgstr "Digite o seu URL do servidor do Bitbucket e o token de acesso pessoal abaixo"
@@ -12648,16 +12839,16 @@ msgid "Enter new AWS Secret Access Key"
msgstr "Digite a nova chave do AWS Secret Access Key"
msgid "Enter number of issues"
-msgstr ""
+msgstr "Digite o número de issues"
msgid "Enter one or more user ID separated by commas"
-msgstr ""
+msgstr "Digite um ou mais ID de usuário (user ID) separados por vírgula"
msgid "Enter the %{name} description"
-msgstr ""
+msgstr "Digite a descrição de %{name}"
msgid "Enter the %{name} title"
-msgstr ""
+msgstr "Digite o título para %{name}"
msgid "Enter the code from the two-factor app on your mobile device. If you've lost your device, you may enter one of your recovery codes."
msgstr ""
@@ -12702,7 +12893,7 @@ msgid "Environment variable %{code_start}%{environment_variable}%{code_end} does
msgstr ""
msgid "Environment variables are configured by your administrator to be %{link_start}protected%{link_end} by default."
-msgstr ""
+msgstr "As variáveis de ambiente são configuradas pelo seu administrador para serem %{link_start}protegidas%{link_end} por padrão."
msgid "Environment variables on this GitLab instance are configured to be %{link_start}protected%{link_end} by default."
msgstr ""
@@ -12821,9 +13012,6 @@ msgstr "Implantação"
msgid "Environments|Deployment %{status}"
msgstr ""
-msgid "Environments|Dismiss"
-msgstr "Dispensar"
-
msgid "Environments|Enable review app"
msgstr "Ativar app de revisão"
@@ -12836,9 +13024,6 @@ msgstr "Ambientes"
msgid "Environments|Environments are places where code gets deployed, such as staging or production."
msgstr "Ambientes são locais onde a implantação é feita, tais como homologação ou produção."
-msgid "Environments|Help us improve environments"
-msgstr "Ajude-nos a melhorar os ambientes"
-
msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
msgstr ""
@@ -12875,6 +13060,9 @@ msgstr ""
msgid "Environments|Note that this action will stop the environment, but it will %{emphasisStart}not%{emphasisEnd} have an effect on any existing deployment due to no “stop environment action†being defined in the %{ciConfigLinkStart}.gitlab-ci.yml%{ciConfigLinkEnd} file."
msgstr "Observe que esta ação irá parar o ambiente mas %{emphasisStart}não%{emphasisEnd} terá efeito sobre qualquer deploy existente devido a \"ação de parar ambiente\" sendo definida no arquivo %{ciConfigLinkEnd}.gitlab-ci.yml%{ciConfigLinkStart}."
+msgid "Environments|Open"
+msgstr ""
+
msgid "Environments|Open live environment"
msgstr "Abrir ambiente ao vivo"
@@ -12914,9 +13102,6 @@ msgstr "Parar ambiente"
msgid "Environments|Stopping %{environmentName}"
msgstr ""
-msgid "Environments|Take the survey"
-msgstr "Participe da pesquisa"
-
msgid "Environments|There was an error fetching the logs. Please try again."
msgstr ""
@@ -12938,9 +13123,6 @@ msgstr "Atualizado"
msgid "Environments|You don't have any environments right now"
msgstr "Você não tem nenhum ambiente no momento"
-msgid "Environments|Your feedback helps GitLab make environments better for you and other users. Participate and enter a sweepstake to win a USD 30 gift card."
-msgstr ""
-
msgid "Environments|by %{avatar}"
msgstr "por %{avatar}"
@@ -13212,7 +13394,7 @@ msgid "Error occurred. User was not confirmed"
msgstr "Ocorreu um erro. O usuário não foi confirmado"
msgid "Error occurred. User was not unbanned"
-msgstr ""
+msgstr "Ocorreu um erro. O usuário não foi desbanido"
msgid "Error occurred. User was not unblocked"
msgstr "Ocorreu um erro. O usuário não foi desbloqueado"
@@ -13223,8 +13405,8 @@ msgstr "Ocorreu um erro. O usuário não foi desbloqueado"
msgid "Error parsing CSV file. Please make sure it has"
msgstr ""
-msgid "Error rendering markdown preview"
-msgstr "Erro ao renderizar a pré-visualização do markdown"
+msgid "Error rendering Markdown preview"
+msgstr ""
msgid "Error saving label update."
msgstr "Erro ao salvar alteração de etiqueta."
@@ -13271,6 +13453,9 @@ msgstr "Ocorreu um erro com Akismet. Por favor, verifique os logs para mais info
msgid "Error: %{error_message}"
msgstr "Erro: %{error_message}"
+msgid "Error: Couldn't load some or all of the changes."
+msgstr ""
+
msgid "Error: No AWS credentials were supplied"
msgstr ""
@@ -13304,6 +13489,9 @@ msgstr ""
msgid "ErrorTracking|Enable error tracking"
msgstr "Ativar rastreamento de erros"
+msgid "ErrorTracking|Error tracking backend"
+msgstr ""
+
msgid "ErrorTracking|If you self-host Sentry, enter your Sentry instance's full URL. If you use Sentry's hosted solution, enter https://sentry.io"
msgstr ""
@@ -13335,6 +13523,12 @@ msgid "Escalation policies may not have more than %{rule_count} rules"
msgstr ""
msgid "Escalation policies must have at least one rule"
+msgstr "As políticas de escalonamento devem ter pelo menos uma regra"
+
+msgid "EscalationPolicies|%{clockIcon} IF alert is not %{alertStatus} in %{minutes}"
+msgstr ""
+
+msgid "EscalationPolicies|%{notificationIcon} THEN %{doAction} %{forScheduleOrUser}"
msgstr ""
msgid "EscalationPolicies|+ Add an additional rule"
@@ -13379,15 +13573,15 @@ msgstr "Enviar e-mail"
msgid "EscalationPolicies|Escalation policies"
msgstr "Políticas de escalação"
+msgid "EscalationPolicies|Escalation policy %{obstacle} in Project %{project}"
+msgstr ""
+
msgid "EscalationPolicies|Escalation rules"
msgstr "Regras de escalação"
msgid "EscalationPolicies|Failed to load oncall-schedules"
msgstr ""
-msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} %{then} THEN %{doAction} %{scheduleOrUser}"
-msgstr "Se alerta não for %{alertStatus} em %{minutes} %{then} ENTÃO %{doAction} %{scheduleOrUser}"
-
msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} minutes"
msgstr "Se alerta não for %{alertStatus} em %{minutes} minutos"
@@ -13398,7 +13592,7 @@ msgid "EscalationPolicies|Minutes must be between 0 and 1440."
msgstr ""
msgid "EscalationPolicies|Remove escalation rule"
-msgstr ""
+msgstr "Remover regra de escalação"
msgid "EscalationPolicies|Search for user"
msgstr "Pesquisar usuário"
@@ -13463,18 +13657,36 @@ msgstr "Eventos"
msgid "Every %{action} attempt has failed: %{job_error_message}. Please try again."
msgstr "Cada tentativa de %{action} falhou: %{job_error_message}. Por favor, tente novamente."
+msgid "Every 3 months"
+msgstr ""
+
+msgid "Every 3 months on the %{day} at %{time} %{timezone}"
+msgstr ""
+
+msgid "Every 6 months"
+msgstr ""
+
+msgid "Every 6 months on the %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Every day"
msgstr "Todos os dias"
msgid "Every day (at %{time})"
msgstr "Todos os dias (às %{time})"
+msgid "Every day at %{time} %{timezone}"
+msgstr ""
+
msgid "Every month"
msgstr "Todo mês"
msgid "Every month (Day %{day} at %{time})"
msgstr "Todos os meses (dia %{day} em %{time})"
+msgid "Every month on the %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Every three months"
msgstr "A cada três meses"
@@ -13489,6 +13701,15 @@ msgstr[1] "A cada %d semanas"
msgid "Every week (%{weekday} at %{time})"
msgstr "Todas as semanas (%{weekday} em %{time})"
+msgid "Every week on %{day} at %{time} %{timezone}"
+msgstr ""
+
+msgid "Every year"
+msgstr ""
+
+msgid "Every year on %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Everyone"
msgstr "Todos"
@@ -13525,9 +13746,6 @@ msgstr "Coleção de provas"
msgid "Exactly one of %{attributes} is required"
msgstr ""
-msgid "Example: %{ip_address}. %{read_more_link}."
-msgstr "Exemplo: %{ip_address}. %{read_more_link}."
-
msgid "Example: @sub\\.company\\.com$"
msgstr "Exemplo: @sub\\.company\\.com$"
@@ -13583,7 +13801,7 @@ msgid "Expand file"
msgstr "Expandir arquivo"
msgid "Expand issues"
-msgstr ""
+msgstr "Expandir issues"
msgid "Expand milestones"
msgstr "Expandir marcos"
@@ -13594,15 +13812,15 @@ msgstr "Expandir painel"
msgid "Expand pipeline"
msgstr "Expandir pipeline"
+msgid "Expand settings section"
+msgstr ""
+
msgid "Expand sidebar"
msgstr "Expandir barra lateral"
msgid "Expected documents: %{expected_documents}"
msgstr ""
-msgid "Experienced"
-msgstr "Experiência"
-
msgid "ExperimentSubject|Must have exactly one of User, Namespace, or Project."
msgstr ""
@@ -13885,9 +14103,6 @@ msgstr "Falha ao carregar os projetos"
msgid "Failed to load related branches"
msgstr "Falha ao carregar branches relacionados"
-msgid "Failed to load sidebar lock status"
-msgstr ""
-
msgid "Failed to load stacktrace."
msgstr "Falha ao carregar a stacktrace."
@@ -13979,7 +14194,7 @@ msgid "Failed to update framework"
msgstr "Falha ao atualizar o framework"
msgid "Failed to update issue status"
-msgstr ""
+msgstr "Erro em atualizar o status da issue"
msgid "Failed to update the Canary Ingress."
msgstr ""
@@ -14003,7 +14218,7 @@ msgid "False positive"
msgstr "Falso positivo"
msgid "Fast timeout"
-msgstr ""
+msgstr "Tempo limite rápido"
msgid "Fast-forward merge without a merge commit"
msgstr "Fast-forward merge sem um merge commit"
@@ -14312,6 +14527,9 @@ msgstr "Nome do arquivo"
msgid "Files"
msgstr "Arquivos"
+msgid "Files API Rate Limits"
+msgstr ""
+
msgid "Files breadcrumb"
msgstr ""
@@ -14634,7 +14852,7 @@ msgid "ForkSuggestion|Cancel"
msgstr "Cancelar"
msgid "ForkSuggestion|Fork"
-msgstr ""
+msgstr "Fork"
msgid "ForkSuggestion|You can’t %{edit_start}edit%{edit_end} files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
@@ -14679,7 +14897,7 @@ msgid "Frequency"
msgstr "Frequência"
msgid "Frequently searched"
-msgstr ""
+msgstr "Frequentemente pesquisado"
msgid "Friday"
msgstr "Sexta-feira"
@@ -14856,10 +15074,10 @@ msgid "Geo|Data replication lag"
msgstr ""
msgid "Geo|Data type"
-msgstr ""
+msgstr "Tipo de dados"
msgid "Geo|Disabled"
-msgstr ""
+msgstr "Desativado"
msgid "Geo|Discover GitLab Geo"
msgstr ""
@@ -14892,7 +15110,7 @@ msgid "Geo|Go to the primary site"
msgstr ""
msgid "Geo|Healthy"
-msgstr ""
+msgstr "Saudável"
msgid "Geo|If you want to make changes, you must visit the primary site."
msgstr ""
@@ -14958,7 +15176,7 @@ msgid "Geo|Nothing to synchronize"
msgstr ""
msgid "Geo|Nothing to verify"
-msgstr ""
+msgstr "Nada para verificar"
msgid "Geo|Offline"
msgstr ""
@@ -15141,7 +15359,7 @@ msgid "Geo|Unhealthy"
msgstr ""
msgid "Geo|Unknown"
-msgstr ""
+msgstr "Desconhecido"
msgid "Geo|Unknown state"
msgstr "Estado desconhecido"
@@ -15150,19 +15368,19 @@ msgid "Geo|Updated %{timeAgo}"
msgstr "Atualizado em %{timeAgo}"
msgid "Geo|Verification"
-msgstr ""
+msgstr "Verificação"
msgid "Geo|Verification failed - %{error}"
msgstr "Falha na verificação - %{error}"
msgid "Geo|Verification information"
-msgstr ""
+msgstr "Informação de verificação"
msgid "Geo|Verification status"
msgstr "Status de verificação"
msgid "Geo|Verified"
-msgstr ""
+msgstr "Verificado"
msgid "Geo|Waiting for scheduler"
msgstr "Aguardando o agendador"
@@ -15311,6 +15529,9 @@ msgstr "GitLab para Slack"
msgid "GitLab group: %{source_link}"
msgstr ""
+msgid "GitLab informs you if a new version is available."
+msgstr ""
+
msgid "GitLab is a complete DevOps platform, delivered as a single application, fundamentally changing the way Development, Security, and Ops teams collaborate"
msgstr ""
@@ -15326,7 +15547,7 @@ msgstr "O GitLab está obtendo um certificado SSL Let's Encrypt para este domín
msgid "GitLab is open source software to collaborate on code."
msgstr ""
-msgid "GitLab is undergoing maintenance and is operating in a read-only mode."
+msgid "GitLab is undergoing maintenance and is operating in read-only mode."
msgstr ""
msgid "GitLab member or Email address"
@@ -15338,9 +15559,6 @@ msgstr "URL de metadados do GitLab"
msgid "GitLab project export"
msgstr "Exportação do projeto GitLab"
-msgid "GitLab restart is required to apply changes."
-msgstr ""
-
msgid "GitLab single sign-on URL"
msgstr ""
@@ -15356,9 +15574,6 @@ msgstr ""
msgid "GitLab version"
msgstr "Versão do GitLab"
-msgid "GitLab will inform you if a new version is available."
-msgstr ""
-
msgid "GitLab will run a background job that will produce pseudonymized CSVs of the GitLab database that will be uploaded to your configured object storage directory."
msgstr "O GitLab executará um trabalho em segundo plano que produzirá CSVs com pseudônimos do banco de dados do GitLab que serão carregados no diretório de armazenamento de objetos configurado."
@@ -15444,7 +15659,7 @@ msgid "GitLabPages|Verified"
msgstr "Verificado"
msgid "GitLabPages|When enabled, all attempts to visit your website through HTTP are automatically redirected to HTTPS using a response with status code 301. Requires a valid certificate for all domains. %{docs_link_start}Learn more.%{link_end}"
-msgstr ""
+msgstr "Quando ativado, todas as tentativas de visitar seu site através de HTTP são redirecionadas automaticamente para HTTPS usando uma resposta com o código de status 301. Requer um certificado válido para todos os domínios. %{docs_link_start}Saiba mais.%{link_end}"
msgid "GitLabPages|When using Pages under the general domain of a GitLab instance (%{pages_host}), you cannot use HTTPS with sub-subdomains. This means that if your username/groupname contains a dot it will not work. This is a limitation of the HTTP Over TLS protocol. HTTP pages will continue to work provided you don't redirect HTTP to HTTPS. %{docs_link_start}Learn more.%{link_end}"
msgstr ""
@@ -15483,7 +15698,7 @@ msgid "GithubIntegration|Create a %{token_link_start}personal access token%{toke
msgstr ""
msgid "GithubIntegration|Obtain statuses for commits and pull requests."
-msgstr ""
+msgstr "Obtenha o status para commits e pull requests."
msgid "GithubIntegration|Repository URL"
msgstr ""
@@ -15534,7 +15749,7 @@ msgid "Go Back"
msgstr "Voltar"
msgid "Go Micro is a framework for micro service development"
-msgstr ""
+msgstr "Go Micro é um framework para desenvolvimento de microsserviços"
msgid "Go back"
msgstr "Voltar"
@@ -15623,9 +15838,21 @@ msgstr "Ir para os gráficos do repositório"
msgid "Go to snippets"
msgstr "Ir para snippets"
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check 'Allowed domains for sign-ups'."
+msgstr ""
+
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check 'Email restrictions for sign-ups'."
+msgstr ""
+
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check the 'Domain denylist'."
+msgstr ""
+
msgid "Go to the activity feed"
msgstr "Ir para o feed de atividades"
+msgid "Go to the group’s 'Settings &gt; General' page, and check 'Restrict membership by email domain'."
+msgstr ""
+
msgid "Go to the milestone list"
msgstr "Ir para lista de marcos"
@@ -15662,6 +15889,12 @@ msgstr "Ir para seus snippets"
msgid "Goal of the changes and what reviewers should be aware of"
msgstr ""
+msgid "Google Cloud"
+msgstr ""
+
+msgid "Google Cloud offers several deployment targets. Select the one most suitable for your project."
+msgstr ""
+
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
@@ -15687,28 +15920,28 @@ msgid "GrafanaIntegration|Enter the %{docLinkStart}Grafana API token%{docLinkEnd
msgstr ""
msgid "GrafanaIntegration|Enter the base URL of the Grafana instance."
-msgstr ""
+msgstr "Insira a URL base da instância do Grafana."
msgid "GrafanaIntegration|Grafana URL"
-msgstr ""
+msgstr "URL do Grafana"
msgid "GrafanaIntegration|Grafana authentication"
-msgstr ""
+msgstr "Autenticação com o Grafana"
msgid "GrafanaIntegration|Set up Grafana authentication to embed Grafana panels in GitLab Flavored Markdown."
-msgstr ""
+msgstr "Configure a autenticação com o Grafana para incorporar painéis do Grafana no GitLab Flavored Markdown."
msgid "Grant access"
msgstr "Conceder acesso"
msgid "Grant write permissions to this key"
-msgstr ""
+msgstr "Conceder permissões de escrita a esta chave"
msgid "Graph"
msgstr "Gráfico"
msgid "GraphViewType|Job dependencies"
-msgstr ""
+msgstr "Dependências de tarefa"
msgid "GraphViewType|Show dependencies"
msgstr "Mostrar dependências"
@@ -15746,9 +15979,6 @@ msgstr ""
msgid "Group ID"
msgstr "ID do grupo"
-msgid "Group ID: %{group_id}"
-msgstr "ID do grupo: %{group_id}"
-
msgid "Group Owner must have signed in with SAML before enabling Group Managed Accounts"
msgstr ""
@@ -15861,7 +16091,7 @@ msgid "Group project URLs are prefixed with the group namespace"
msgstr ""
msgid "Group projects"
-msgstr ""
+msgstr "Projetos do grupo"
msgid "Group requires separate account"
msgstr "Grupo requer uma conta separada"
@@ -15894,7 +16124,7 @@ msgid "GroupActivityMetrics|Issues opened"
msgstr "Issues abertas"
msgid "GroupActivityMetrics|Last 90 days"
-msgstr ""
+msgstr "Últimos 90 dias"
msgid "GroupActivityMetrics|Members added"
msgstr "Membros adicionados"
@@ -15923,6 +16153,12 @@ msgstr ""
msgid "GroupImport|Unable to process group import file"
msgstr ""
+msgid "GroupPage|Copy group ID"
+msgstr ""
+
+msgid "GroupPage|Group ID: %{group_id}"
+msgstr ""
+
msgid "GroupRoadmap|%{dateWord} – No end date"
msgstr ""
@@ -15977,6 +16213,9 @@ msgstr "Para expandir a sua pesquisa, altere ou remova filtros; de %{startDate}
msgid "GroupRoadmap|Within 3 years"
msgstr "Dentro de 3 anos"
+msgid "GroupSAML|\"persistent\" recommended"
+msgstr ""
+
msgid "GroupSAML|%{strongOpen}Warning%{strongClose} - Enabling %{linkStart}SSO enforcement%{linkEnd} can reduce security risks."
msgstr ""
@@ -16109,6 +16348,9 @@ msgstr ""
msgid "GroupSAML|To be able to prohibit outer forks, you first need to enforce dedicate group managed accounts."
msgstr ""
+msgid "GroupSAML|Use SAML group links to manage group membership using SAML."
+msgstr ""
+
msgid "GroupSAML|Valid SAML Response"
msgstr ""
@@ -16121,17 +16363,14 @@ msgstr ""
msgid "GroupSAML|as %{access_level}"
msgstr ""
-msgid "GroupSAML|must match stored NameID of \"%{extern_uid}\" as we use this to identify users. If the NameID changes users will be unable to sign in."
+msgid "GroupSAML|must match stored NameID of \"%{extern_uid}\" to identify user and allow sign in"
msgstr ""
-msgid "GroupSAML|should be \"persistent\""
-msgstr ""
-
-msgid "GroupSAML|should be a random persistent ID, emails are discouraged"
+msgid "GroupSAML|recommend persistent ID instead of email"
msgstr ""
msgid "GroupSelect|No matching results"
-msgstr ""
+msgstr "Nenhum resultado correspondente"
msgid "GroupSelect|Search groups"
msgstr "Pesquisar grupos"
@@ -16142,9 +16381,15 @@ msgstr "Selecionar grupos"
msgid "GroupSettings|Allow project access token creation"
msgstr ""
+msgid "GroupSettings|Applied to all subgroups unless overridden by a group owner. Groups already added to the project lose access."
+msgstr ""
+
msgid "GroupSettings|Auto DevOps pipeline was updated for the group"
msgstr "Pipeline de Auto DevOps foi atualizado para o grupo"
+msgid "GroupSettings|Available only on the top-level group. Applies to all subgroups. Groups already shared with a group outside %{group} are still shared unless removed manually."
+msgstr ""
+
msgid "GroupSettings|Badges"
msgstr "Selos"
@@ -16196,6 +16441,9 @@ msgstr ""
msgid "GroupSettings|New runners registration token has been generated!"
msgstr "Um novo token de registro de executores foi gerado!"
+msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgstr ""
+
msgid "GroupSettings|Pipeline settings was updated for the group"
msgstr ""
@@ -16208,12 +16456,15 @@ msgstr ""
msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
-msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups."
+msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups"
msgstr ""
msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
msgstr "Bloquear compartilhamento de projetos do grupo %{group} com outros grupos"
+msgid "GroupSettings|Prevents group members from being notified if the group is mentioned."
+msgstr ""
+
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
msgstr ""
@@ -16250,21 +16501,6 @@ msgstr "Essa configuração é aplicada no grupo %{ancestor_group}. Para compart
msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}."
msgstr "Essa configuração foi aplicada no grupo %{ancestor_group}. Você pode sobrescrevê-la ou %{remove_ancestor_share_with_group_lock}."
-msgid "GroupSettings|This setting is only available on the top-level group and it applies to all subgroups. Groups that have already been shared with a group outside %{group} will still be shared, and this access will have to be revoked manually."
-msgstr ""
-
-msgid "GroupSettings|This setting will be applied to all subgroups unless overridden by a group owner. Groups that already have access to the project will continue to have access unless removed manually."
-msgstr "Essa configuração será aplicada à todos os subgrupos a menos que sejam sobrescritas pelo dono do grupo. Grupos que já tem acesso ao projeto continuarão a acessá-los até que sejam removidos manualmente."
-
-msgid "GroupSettings|This setting will override user notification preferences for all members of the group, subgroups, and projects."
-msgstr "Esta configuração irá substituir as preferências de notificação de usuário para todos os membros do grupo, subgrupos e projetos."
-
-msgid "GroupSettings|This setting will prevent group members from being notified if the group is mentioned."
-msgstr ""
-
-msgid "GroupSettings|This setting will prevent group members from forking projects outside of the group."
-msgstr ""
-
msgid "GroupSettings|Transfer group"
msgstr "Transferir grupo"
@@ -16382,7 +16618,7 @@ msgstr "Navegue até as configurações do usuário para encontrar seu %{link_st
msgid "GroupsNew|No import options available"
msgstr ""
-msgid "GroupsNew|Not all related objects are migrated, as %{docs_link_start}described here%{docs_link_end}. Please %{feedback_link_start}leave feedback%{feedback_link_end} on this feature."
+msgid "GroupsNew|Not all related objects are migrated. %{docs_link_start}More info%{docs_link_end}."
msgstr ""
msgid "GroupsNew|Personal access token"
@@ -16437,7 +16673,7 @@ msgid "HAR (HTTP Archive)"
msgstr ""
msgid "HAR file path or URL"
-msgstr ""
+msgstr "Caminho do arquivo HAR ou URL"
msgid "HTTP Basic: Access denied\\nYou must use a personal access token with 'api' scope for Git over HTTP.\\nYou can generate one at %{profile_personal_access_tokens_url}"
msgstr ""
@@ -16455,7 +16691,7 @@ msgid "Header cannot be associated with both a request and a response"
msgstr ""
msgid "Header logo"
-msgstr ""
+msgstr "Logotipo de cabeçalho"
msgid "Header logo was successfully removed."
msgstr "O logo do cabeçalho foi removido com sucesso."
@@ -16514,15 +16750,27 @@ msgstr "Não saudável"
msgid "Hello %{name},"
msgstr "Olá %{name},"
-msgid "Hello there"
-msgstr "Olá"
-
msgid "Hello, %{name}!"
-msgstr ""
+msgstr "Olá, %{name}!"
msgid "Hello, %{username}!"
msgstr "Olá, %{username}!"
+msgid "HelloMessage|%{handshake_emoji} Contribute to GitLab: %{contribute_link}"
+msgstr ""
+
+msgid "HelloMessage|%{magnifier_emoji} Create a new GitLab issue: %{new_issue_link}"
+msgstr ""
+
+msgid "HelloMessage|%{rocket_emoji} We like your curiosity! Help us improve GitLab by joining the team: %{jobs_page_link}"
+msgstr ""
+
+msgid "HelloMessage|Does this page need fixes or improvements? Open an issue or contribute a merge request to help make GitLab more lovable. At GitLab, everyone can contribute!"
+msgstr ""
+
+msgid "HelloMessage|Welcome to GitLab!"
+msgstr ""
+
msgid "Help"
msgstr "Ajuda"
@@ -16532,13 +16780,10 @@ msgstr ""
msgid "Helps prevent bots from creating accounts."
msgstr ""
-msgid "Helps prevent bots from creating issues"
-msgstr ""
-
-msgid "Helps prevent malicious users hide their activity"
+msgid "Helps prevent bots from creating issues."
msgstr ""
-msgid "Helps reduce request volume (e.g. from crawlers or abusive bots)"
+msgid "Helps prevent malicious users hide their activity."
msgstr ""
msgid "Helps reduce request volume (for example, from crawlers or abusive bots)"
@@ -16662,6 +16907,12 @@ msgstr "Manutenção iniciada com sucesso"
msgid "Housekeeping, export, path, transfer, remove, archive."
msgstr "Manutenção, exportação, caminho, transferência, remoção e arquivamento."
+msgid "How do I configure Akismet?"
+msgstr ""
+
+msgid "How do I configure it?"
+msgstr ""
+
msgid "How do I configure runners?"
msgstr "Como eu configuro os executores?"
@@ -16669,7 +16920,7 @@ msgid "How do I configure this integration?"
msgstr ""
msgid "How do I generate it?"
-msgstr ""
+msgstr "Como faço para gerar?"
msgid "How do I mirror repositories?"
msgstr ""
@@ -16683,21 +16934,27 @@ msgstr ""
msgid "How do I set up this service?"
msgstr ""
+msgid "How do I use a web terminal?"
+msgstr ""
+
+msgid "How do I use file templates?"
+msgstr ""
+
msgid "How it works"
msgstr "Como funciona"
msgid "How many days need to pass between marking entity for deletion and actual removing it."
msgstr ""
-msgid "How many seconds an IP will be counted towards the limit"
+msgid "How many seconds an IP counts toward the IP address limit."
+msgstr ""
+
+msgid "How the job limiter handles jobs exceeding the thresholds specified below. The 'track' mode only logs the jobs. The 'compress' mode compresses the jobs and raises an exception if the compressed size exceeds the limit."
msgstr ""
msgid "I accept the %{terms_link}"
msgstr "Eu aceito o %{terms_link}"
-msgid "I accept the|Terms of Service and Privacy Policy"
-msgstr "Eu aceito os|termos de serviço e política de privacidade"
-
msgid "I forgot my password"
msgstr "Esqueci minha senha"
@@ -16705,13 +16962,13 @@ msgid "I want to explore GitLab to see if it’s worth switching to"
msgstr ""
msgid "I want to learn the basics of Git"
-msgstr ""
+msgstr "Eu quero aprender o básico do Git"
msgid "I want to move my repository to GitLab from somewhere else"
msgstr ""
msgid "I want to store my code"
-msgstr ""
+msgstr "Eu quero armazenar meu código"
msgid "I want to use GitLab CI with my existing repository"
msgstr ""
@@ -16738,7 +16995,7 @@ msgid "IDE|Commit"
msgstr "Commit"
msgid "IDE|Commit to %{branchName} branch"
-msgstr ""
+msgstr "Commit para a ramificação %{branchName}"
msgid "IDE|Edit"
msgstr "Editar"
@@ -16779,14 +17036,17 @@ msgstr ""
msgid "IP Address"
msgstr "Endereço IP"
-msgid "IP expiration time"
+msgid "IP address expiration time"
msgstr ""
-msgid "IP subnet restriction only allowed for top-level groups"
+msgid "IP address restrictions"
+msgstr ""
+
+msgid "IP addresses per user"
msgstr ""
-msgid "IPs per user"
-msgstr "IPs por usuário"
+msgid "IP subnet restriction only allowed for top-level groups"
+msgstr ""
msgid "Identifier"
msgstr "Identificador"
@@ -16800,6 +17060,9 @@ msgstr "Identidades"
msgid "If any indexed field exceeds this limit it will be truncated to this number of characters and the rest will not be indexed or searchable. This does not apply to repository and wiki indexing. Setting this to 0 means it is unlimited."
msgstr ""
+msgid "If blank, defaults to %{code_open}Retry later%{code_close}."
+msgstr ""
+
msgid "If blank, set allowable lifetime to %{instance_level_policy_in_words}, as defined by the instance admin. Once set, existing tokens for users in this group may be revoked."
msgstr ""
@@ -16822,7 +17085,7 @@ msgid "If enabled, access to projects will be validated on an external service u
msgstr "Se ativado, o acesso aos projetos será validado em um serviço externo usando sua etiqueta de classificação."
msgid "If enabled, only protected branches will be mirrored."
-msgstr ""
+msgstr "Se ativado, apenas ramificações protegidas serão espelhados."
msgid "If no options are selected, only administrators can register runners."
msgstr ""
@@ -16851,6 +17114,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 did not initiate these sign-in attempts, please reach out to your administrator or enable two-factor authentication (2FA) on your account."
+msgstr ""
+
msgid "If you did not initiate this change, please contact your administrator immediately."
msgstr ""
@@ -16942,12 +17208,12 @@ msgstr "Importar CSV"
msgid "Import Projects from Gitea"
msgstr "Importar projetos do Gitea"
-msgid "Import a project"
-msgstr "Importar um projeto"
-
msgid "Import an exported GitLab project"
msgstr "Importar um projeto GitLab exportado"
+msgid "Import and export rate limits"
+msgstr ""
+
msgid "Import failed due to a GitHub error: %{original}"
msgstr ""
@@ -16957,12 +17223,18 @@ msgstr "Importar de"
msgid "Import from Jira"
msgstr "Importar do Jira"
+msgid "Import group"
+msgstr ""
+
msgid "Import group from file"
msgstr "Importar grupo de arquivo"
msgid "Import groups"
msgstr "Importar grupos"
+msgid "Import history"
+msgstr ""
+
msgid "Import in progress"
msgstr "Importação em andamento"
@@ -17026,7 +17298,25 @@ msgstr ""
msgid "Import timed out. Import took longer than %{import_jobs_expiration} seconds"
msgstr "Importação expirou. A importação demorou mais de %{import_jobs_expiration} segundos"
-msgid "Import/Export Rate Limits"
+msgid "ImportAProjectModal|Import from a project"
+msgstr ""
+
+msgid "ImportAProjectModal|Import members from another project"
+msgstr ""
+
+msgid "ImportAProjectModal|Import project members"
+msgstr ""
+
+msgid "ImportAProjectModal|Only project members (not group members) are imported, and they get the same permissions as the project you import from."
+msgstr ""
+
+msgid "ImportAProjectModal|Successfully imported"
+msgstr ""
+
+msgid "ImportAProjectModal|Unable to import project members"
+msgstr ""
+
+msgid "ImportAProjectModal|You're importing members to the %{strongStart}%{name}%{strongEnd} project."
msgstr ""
msgid "ImportButtons|Connect repositories from"
@@ -17079,7 +17369,7 @@ msgstr[1] "Importando %d repositórios"
msgid "Importing..."
msgstr "Importando..."
-msgid "Import|A repository URL usually ends in a .git suffix, although this is not required. Double check to make sure your repository URL is correct."
+msgid "Import|There is not a valid Git repository at this URL. If your HTTP repository is not publicly accessible, verify your credentials."
msgstr ""
msgid "Improve customer support with Service Desk"
@@ -17088,9 +17378,6 @@ msgstr ""
msgid "Improves Git cloning performance."
msgstr ""
-msgid "In %{time_to_now}"
-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 ""
@@ -17185,16 +17472,16 @@ msgid "InProductMarketing|Did you know teams that use GitLab are far more effici
msgstr ""
msgid "InProductMarketing|Difficult"
-msgstr ""
+msgstr "Difícil"
msgid "InProductMarketing|Dig in and create a project and a repo"
msgstr ""
msgid "InProductMarketing|Do you have a minute?"
-msgstr ""
+msgstr "Você tem um minuto?"
msgid "InProductMarketing|Easy"
-msgstr ""
+msgstr "Fácil"
msgid "InProductMarketing|Expand your DevOps journey with a free GitLab trial"
msgstr ""
@@ -17376,7 +17663,7 @@ msgstr ""
msgid "InProductMarketing|Start a GitLab Ultimate trial today in less than one minute, no credit card required."
msgstr ""
-msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no CC required"
+msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no credit card required"
msgstr ""
msgid "InProductMarketing|Start a trial"
@@ -17415,7 +17702,7 @@ msgstr ""
msgid "InProductMarketing|Team up in GitLab for greater efficiency"
msgstr ""
-msgid "InProductMarketing|Team work makes the dream work"
+msgid "InProductMarketing|Team work makes the dream work"
msgstr ""
msgid "InProductMarketing|Test, create, deploy"
@@ -17473,16 +17760,16 @@ msgid "InProductMarketing|Used by more than 100,000 organizations from around th
msgstr ""
msgid "InProductMarketing|Very difficult"
-msgstr ""
+msgstr "Muito difícil"
msgid "InProductMarketing|Very easy"
-msgstr ""
+msgstr "Muito fácil"
msgid "InProductMarketing|We know a thing or two about efficiency and we don't want to keep that to ourselves. Sign up for a free trial of GitLab Ultimate and your teams will be on it from day one."
msgstr ""
msgid "InProductMarketing|We want your GitLab experience to be great"
-msgstr ""
+msgstr "Queremos que sua experiência com o GitLab seja ótima"
msgid "InProductMarketing|What does our value stream timeline look like from product to development to review and production?"
msgstr ""
@@ -17545,7 +17832,7 @@ msgid "InProductMarketing|you may %{unsubscribe_link} at any time."
msgstr ""
msgid "Inactive"
-msgstr ""
+msgstr "Inativo"
msgid "Incident"
msgstr "Incidente"
@@ -17644,13 +17931,13 @@ msgid "IncidentSettings|Activate \"time to SLA\" countdown timer"
msgstr ""
msgid "IncidentSettings|Fine-tune incident settings and set up integrations with external tools to help better manage incidents."
-msgstr ""
+msgstr "Ajuste as configurações de incidentes e configure integrações com ferramentas externas para ajudar a gerenciar melhor os incidentes."
msgid "IncidentSettings|Grafana integration"
-msgstr ""
+msgstr "Integração com Grafana"
msgid "IncidentSettings|Incident settings"
-msgstr ""
+msgstr "Configurações de incidente"
msgid "IncidentSettings|Incidents"
msgstr "Incidentes"
@@ -17659,13 +17946,13 @@ msgid "IncidentSettings|Introduce a countdown timer in incident issues to better
msgstr ""
msgid "IncidentSettings|PagerDuty integration"
-msgstr ""
+msgstr "Integração com PagerDuty"
msgid "IncidentSettings|Time limit"
-msgstr ""
+msgstr "Limite de tempo"
msgid "IncidentSettings|Time limit must be a multiple of 15 minutes."
-msgstr ""
+msgstr "O limite de tempo deve ser um múltiplo de 15 minutos."
msgid "IncidentSettings|Time limit must be a valid number."
msgstr ""
@@ -17773,13 +18060,13 @@ msgid "Incomplete"
msgstr "Incompleto"
msgid "Increase"
-msgstr ""
+msgstr "Aumentar"
msgid "Indent"
msgstr ""
msgid "Index"
-msgstr ""
+msgstr "Ãndice"
msgid "Index all projects"
msgstr "Indexar todos os projetos"
@@ -17800,7 +18087,7 @@ msgid "Infrastructure Registry"
msgstr "Registro de infraestrutura"
msgid "InfrastructureRegistry|Copy Terraform Command"
-msgstr ""
+msgstr "Copiar comando do Terraform"
msgid "InfrastructureRegistry|Copy Terraform Setup Command"
msgstr ""
@@ -17866,7 +18153,7 @@ msgid "Insert code"
msgstr "Inserir código"
msgid "Insert column after"
-msgstr ""
+msgstr "Insira coluna depois"
msgid "Insert column before"
msgstr "Insira coluna antes"
@@ -17878,7 +18165,7 @@ msgid "Insert inline code"
msgstr ""
msgid "Insert link"
-msgstr ""
+msgstr "Inserir link"
msgid "Insert row after"
msgstr "Inserir linha acima"
@@ -17934,7 +18221,7 @@ msgid "Instance audit events"
msgstr ""
msgid "Instance overview"
-msgstr ""
+msgstr "Visão geral da instância"
msgid "Insufficient permissions"
msgstr "Permissões insuficientes"
@@ -17976,7 +18263,7 @@ msgid "Integrations|All projects inheriting these settings will also be reset."
msgstr ""
msgid "Integrations|An error occurred while loading projects using custom settings."
-msgstr ""
+msgstr "Ocorreu um erro ao carregar projetos usando configurações personalizadas."
msgid "Integrations|Browser limitations"
msgstr "Limitações do navegador"
@@ -17996,6 +18283,9 @@ msgstr ""
msgid "Integrations|Create new issue in Jira"
msgstr "Criar novo problema no Jira"
+msgid "Integrations|Create new issue in ZenTao"
+msgstr ""
+
msgid "Integrations|Default settings are inherited from the group level."
msgstr ""
@@ -18003,7 +18293,7 @@ msgid "Integrations|Default settings are inherited from the instance level."
msgstr ""
msgid "Integrations|Enable GitLab.com slash commands in a Slack workspace."
-msgstr ""
+msgstr "Ativae os comandos de barra do GitLab.com em um espaço de trabalho do Slack."
msgid "Integrations|Enable comments"
msgstr ""
@@ -18039,7 +18329,7 @@ msgid "Integrations|Issues created in Jira are shown here once you have created
msgstr ""
msgid "Integrations|Keep your PHP dependencies updated on Packagist."
-msgstr ""
+msgstr "Mantenha suas dependências de PHP atualizadas no Packagist."
msgid "Integrations|Link namespaces"
msgstr ""
@@ -18089,7 +18379,13 @@ msgstr ""
msgid "Integrations|Search Jira issues"
msgstr "Pesquisar issues do Jira"
+msgid "Integrations|Search ZenTao issues"
+msgstr ""
+
msgid "Integrations|Send notifications about project events to Unify Circuit."
+msgstr "Envie notificações sobre eventos de projeto para Unify Circuit."
+
+msgid "Integrations|Send notifications about project events to a Unify Circuit conversation. %{docs_link}"
msgstr ""
msgid "Integrations|Sign in to add namespaces"
@@ -18099,7 +18395,7 @@ msgid "Integrations|Standard"
msgstr ""
msgid "Integrations|There are no projects using custom settings"
-msgstr ""
+msgstr "Não há projetos usando configurações personalizadas"
msgid "Integrations|This integration, and inheriting projects were reset."
msgstr ""
@@ -18131,6 +18427,9 @@ msgstr ""
msgid "Integrations|You've activated every integration 🎉"
msgstr ""
+msgid "Integrations|ZenTao issues display here when you create issues in your project in ZenTao."
+msgstr ""
+
msgid "Interactive mode"
msgstr "Modo interativo"
@@ -18158,9 +18457,6 @@ msgstr ""
msgid "Interval Pattern"
msgstr "Padrão de intervalo"
-msgid "Introducing Value Stream Analytics"
-msgstr ""
-
msgid "Introducing Your DevOps Report"
msgstr ""
@@ -18216,7 +18512,7 @@ msgid "Invalid login or password"
msgstr "Entrada ou senha inválidos"
msgid "Invalid period"
-msgstr ""
+msgstr "Período inválido"
msgid "Invalid pin code"
msgstr "Código PIN inválido"
@@ -18257,6 +18553,12 @@ msgstr ""
msgid "Investigate vulnerability: %{title}"
msgstr ""
+msgid "Invisible Captcha"
+msgstr ""
+
+msgid "Invisible Captcha helps prevent the creation of spam accounts. It adds a honeypot field and time-sensitive form submission to the account signup form."
+msgstr ""
+
msgid "Invitation"
msgstr "Convite"
@@ -18279,7 +18581,7 @@ msgid "Invite a group"
msgstr "Convidar um grupo"
msgid "Invite email has already been taken"
-msgstr ""
+msgstr "O e-mail de convite já está em uso"
msgid "Invite group"
msgstr "Convidar grupo"
@@ -18381,7 +18683,7 @@ msgid "InviteMembersModal|Select a group to invite"
msgstr ""
msgid "InviteMembersModal|Select a role"
-msgstr ""
+msgstr "Selecione um cargo"
msgid "InviteMembersModal|Select members or type email addresses"
msgstr "Selecione membros ou digite o endereço de e-mail"
@@ -18414,7 +18716,7 @@ msgid "InviteMember|Add members to this project and start collaborating with you
msgstr "Adicione membros para esse projeto e inicie a colaboração com a sua equipe"
msgid "InviteMember|Invite Member"
-msgstr ""
+msgstr "Convidar membro"
msgid "InviteMember|Invite Members (optional)"
msgstr "Convidar membros (opcional)"
@@ -18489,7 +18791,7 @@ msgid "IrkerService|How to enter channels or users?"
msgstr ""
msgid "IrkerService|Recipients"
-msgstr ""
+msgstr "Destinatários"
msgid "IrkerService|Send update messages to an irker server."
msgstr ""
@@ -18678,31 +18980,31 @@ msgid "IssueTracker|The URL to view an issue in the external issue tracker. Must
msgstr ""
msgid "IssueTracker|Use Bugzilla as this project's issue tracker."
-msgstr ""
+msgstr "Use o Bugzilla como rastreador de issue deste projeto."
msgid "IssueTracker|Use Bugzilla as this project's issue tracker. %{docs_link}"
-msgstr ""
+msgstr "Use o Bugzilla como rastreador de issue deste projeto. %{docs_link}"
msgid "IssueTracker|Use IBM Engineering Workflow Management as this project's issue tracker."
-msgstr ""
+msgstr "Use o IBM Engineering Workflow Management como o rastreador de issues deste projeto."
msgid "IssueTracker|Use IBM Engineering Workflow Management as this project's issue tracker. %{docs_link}"
-msgstr ""
+msgstr "Use o IBM Engineering Workflow Management como o rastreador de issues deste projeto. %{docs_link}"
msgid "IssueTracker|Use Redmine as the issue tracker. %{docs_link}"
msgstr ""
msgid "IssueTracker|Use Redmine as this project's issue tracker."
-msgstr ""
+msgstr "Use o Redmine como rastreador de issue deste projeto."
msgid "IssueTracker|Use YouTrack as this project's issue tracker."
msgstr ""
msgid "IssueTracker|Use YouTrack as this project's issue tracker. %{docs_link}"
-msgstr ""
+msgstr "Use o YouTrack como rastreador de issue deste projeto. %{docs_link}"
msgid "IssueTracker|Use a custom issue tracker as this project's issue tracker."
-msgstr ""
+msgstr "Use o um rastreador personalizado de issue deste projeto."
msgid "IssueTracker|Use a custom issue tracker that is not in the integration list. %{docs_link}"
msgstr ""
@@ -18710,12 +19012,18 @@ msgstr ""
msgid "Issues"
msgstr "Issues"
+msgid "Issues I've created"
+msgstr ""
+
msgid "Issues Rate Limits"
msgstr ""
msgid "Issues and merge requests"
msgstr "Issues e solicitações de mesclagem"
+msgid "Issues assigned to me"
+msgstr ""
+
msgid "Issues can be bugs, tasks or ideas to be discussed. Also, issues are searchable and filterable."
msgstr "Issues podem ser bugs, tarefas ou ideias a serem discutidas. Além disso, issues são pesquisáveis e filtráveis."
@@ -18816,7 +19124,7 @@ msgid "Iterations|Add iteration"
msgstr "Adicionar iteração"
msgid "Iterations|Automated scheduling"
-msgstr ""
+msgstr "Agendamento automatizado"
msgid "Iterations|Cadence name"
msgstr ""
@@ -18827,8 +19135,8 @@ msgstr ""
msgid "Iterations|Create cadence"
msgstr ""
-msgid "Iterations|Create your first iteration"
-msgstr "Crie sua primeira iteração"
+msgid "Iterations|Create iteration"
+msgstr ""
msgid "Iterations|Delete cadence"
msgstr ""
@@ -18836,6 +19144,9 @@ msgstr ""
msgid "Iterations|Delete iteration cadence?"
msgstr ""
+msgid "Iterations|Delete iteration?"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr "Duração"
@@ -18846,16 +19157,16 @@ msgid "Iterations|Edit iteration"
msgstr "Editar iteração"
msgid "Iterations|Edit iteration cadence"
-msgstr ""
+msgstr "Editar cadência de iteração"
msgid "Iterations|Error loading iteration cadences."
-msgstr ""
+msgstr "Erro ao carregar cadências de iteração."
msgid "Iterations|Future iterations"
msgstr "Iterações futuras"
msgid "Iterations|Iteration cadences"
-msgstr ""
+msgstr "Cadências de iteração"
msgid "Iterations|Iteration scheduling will be handled automatically"
msgstr ""
@@ -18867,14 +19178,20 @@ msgid "Iterations|New iteration"
msgstr "Nova iteração"
msgid "Iterations|New iteration cadence"
+msgstr "Nova cadência de iteração"
+
+msgid "Iterations|No closed iterations."
msgstr ""
msgid "Iterations|No iteration cadences to show."
-msgstr ""
+msgstr "Sem cadências de iteração para mostrar."
msgid "Iterations|No iterations in cadence."
msgstr "Nenhuma integrações em cadência"
+msgid "Iterations|No open iterations."
+msgstr ""
+
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
@@ -18905,6 +19222,9 @@ msgstr ""
msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
msgstr ""
+msgid "Iterations|This will remove the iteration from any issues that are assigned to it."
+msgstr ""
+
msgid "Iterations|Title"
msgstr "Título"
@@ -18920,15 +19240,9 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "I’m familiar with the basics of DevOps."
-msgstr ""
-
msgid "I’m joining my team who’s already on GitLab"
msgstr ""
-msgid "I’m not familiar with the basics of DevOps."
-msgstr ""
-
msgid "Jaeger URL"
msgstr "URL Jaeger"
@@ -18975,7 +19289,7 @@ msgid "JiraConnect|Create branch for Jira issue %{jiraIssue}"
msgstr ""
msgid "JiraConnect|Failed to create branch."
-msgstr ""
+msgstr "Falha ao criar ramificação."
msgid "JiraConnect|Failed to create branch. Please try again."
msgstr ""
@@ -19158,7 +19472,7 @@ msgid "JiraService|Upgrade your plan to enable this feature of the Jira Integrat
msgstr ""
msgid "JiraService|Use Jira as this project's issue tracker."
-msgstr ""
+msgstr "Use o Jira como rastreador de issue deste projeto."
msgid "JiraService|Use a password for server version and an API token for cloud version."
msgstr ""
@@ -19173,7 +19487,7 @@ msgid "JiraService|Username or Email"
msgstr "Nome de usuário ou e-mail"
msgid "JiraService|Using Jira for issue tracking?"
-msgstr "Usando Jira para rastreamento de problemas?"
+msgstr "Usando Jira para rastreamento de issue?"
msgid "JiraService|View Jira issues in GitLab"
msgstr ""
@@ -19193,6 +19507,9 @@ msgstr ""
msgid "Job"
msgstr "Tarefa"
+msgid "Job %{jobName}"
+msgstr ""
+
msgid "Job Failed #%{build_id}"
msgstr "Tarefa falhou nº %{build_id}"
@@ -19377,10 +19694,10 @@ msgid "K8s pod health"
msgstr ""
msgid "KEY"
-msgstr ""
+msgstr "CHAVE"
msgid "Keep"
-msgstr ""
+msgstr "Manter"
msgid "Keep artifacts from most recent successful jobs"
msgstr "Manter artefatos de tarefas com sucesso mais recentes"
@@ -19410,22 +19727,22 @@ msgid "Keyboard shortcuts"
msgstr "Atalhos de teclado"
msgid "KeyboardKey|Alt"
-msgstr ""
+msgstr "Alt"
msgid "KeyboardKey|Ctrl"
-msgstr ""
+msgstr "Ctrl"
msgid "KeyboardKey|Ctrl+"
msgstr ""
msgid "KeyboardKey|Enter"
-msgstr ""
+msgstr "Enter"
msgid "KeyboardKey|Esc"
-msgstr ""
+msgstr "Esc"
msgid "KeyboardKey|Shift"
-msgstr ""
+msgstr "Shift"
msgid "KeyboardShortcuts|No shortcuts matched your search"
msgstr "Nenhum atalho corresponde a sua pesquisa"
@@ -19470,7 +19787,7 @@ msgid "Kubernetes cluster was successfully updated."
msgstr "O cluster do Kubernetes foi atualizado com sucesso."
msgid "Kubernetes clusters"
-msgstr ""
+msgstr "Clusters de Kubernetes"
msgid "Kubernetes deployment not found"
msgstr ""
@@ -19524,7 +19841,7 @@ msgid "Label actions dropdown"
msgstr "Dropdown de ações de etiqueta"
msgid "Label priority"
-msgstr ""
+msgstr "Prioridade da etiqueta"
msgid "Label was created"
msgstr "A etiqueta foi criada"
@@ -19783,9 +20100,6 @@ msgstr "Saiba mais sobre assinar commits"
msgid "Learn more in the"
msgstr "Saiba mais em"
-msgid "Learn more in the|pipeline schedules documentation"
-msgstr "documentação de agendamento de pipeline"
-
msgid "Learn more."
msgstr "Saiba mais."
@@ -19886,10 +20200,10 @@ msgid "LearnGitlab|Creating your onboarding experience..."
msgstr ""
msgid "LearnGitlab|Ok, let's go"
-msgstr ""
+msgstr "Ok, vamos lá"
msgid "LearnGitlab|Trial only"
-msgstr ""
+msgstr "Apenas avaliação"
msgid "Leave"
msgstr "Sair"
@@ -19897,9 +20211,6 @@ msgstr "Sair"
msgid "Leave Admin Mode"
msgstr ""
-msgid "Leave blank for no limit. Once set, existing personal access tokens may be revoked."
-msgstr ""
-
msgid "Leave edit mode? All unsaved changes will be lost."
msgstr "Sair do modo de edição? Todas as alterações não salvas serão perdidas."
@@ -19925,13 +20236,13 @@ msgid "Let's Encrypt is a free, automated, and open certificate authority (CA) t
msgstr "Let's Encrypt é uma autoridade certificadora (CA) gratuita, automatizada e aberta, que fornece certificados digitais, afim de habilitar o HTTPS (SSL/TLS) para sites. Saiba mais sobre a configuração do Let's Encrypt seguindo a %{docs_link_start}documentação nas Páginas GitLab %{docs_link_end}."
msgid "Let's talk!"
-msgstr ""
+msgstr "Vamos conversar!"
msgid "License Compliance"
msgstr "License Compliance"
msgid "License file"
-msgstr ""
+msgstr "Arquivo de licença"
msgid "License overview"
msgstr ""
@@ -19945,12 +20256,12 @@ msgstr ""
msgid "LicenseCompliance|Acceptable license to be used in the project"
msgstr ""
-msgid "LicenseCompliance|Add a license"
-msgstr "Adicionar uma licença"
-
msgid "LicenseCompliance|Add license and related policy"
msgstr ""
+msgid "LicenseCompliance|Add license policy"
+msgstr ""
+
msgid "LicenseCompliance|Allow"
msgstr "Permitir"
@@ -20038,6 +20349,9 @@ msgstr ""
msgid "LicenseManagement|Uncategorized"
msgstr "Não categorizado"
+msgid "Licensed Enterprise Edition features can be used if the project namespace's plan includes the feature, or if the project is public."
+msgstr ""
+
msgid "Licensed Features"
msgstr "Funcionalidades licenciadas"
@@ -20104,7 +20418,10 @@ msgstr "Limita a exibição de unidades de acompanhamento de tempo a horas."
msgid "Limit namespaces and projects that can be indexed"
msgstr ""
-msgid "Limit sign in from multiple ips"
+msgid "Limit project size at a global, group, and project level. %{link_start}Learn more%{link_end}."
+msgstr ""
+
+msgid "Limit sign in from multiple IP addresses"
msgstr ""
msgid "Limit the number of concurrent operations this secondary site can run in the background."
@@ -20116,11 +20433,17 @@ msgstr ""
msgid "Limit the number of issues and epics per minute a user can create through web and API requests."
msgstr ""
+msgid "Limit the size of Sidekiq jobs stored in Redis."
+msgstr ""
+
msgid "Limited to showing %d event at most"
msgid_plural "Limited to showing %d events at most"
msgstr[0] "Limitado a mostrar %d evento, no máximo"
msgstr[1] "Limitado a mostrar %d eventos, no máximo"
+msgid "Limiting mode"
+msgstr ""
+
msgid "Line changes"
msgstr "Alterações de linha"
@@ -20158,7 +20481,7 @@ msgid "Link to go to GitLab pipeline documentation"
msgstr ""
msgid "Link to your Grafana instance."
-msgstr ""
+msgstr "Link para a sua instância do Grafana."
msgid "Linked emails (%{email_count})"
msgstr "E-mails vinculados (%{email_count})"
@@ -20170,13 +20493,13 @@ msgid "LinkedIn"
msgstr "LinkedIn"
msgid "LinkedIn:"
-msgstr ""
+msgstr "LinkedIn:"
msgid "LinkedPipelines|%{counterLabel} more downstream pipelines"
msgstr ""
msgid "Links"
-msgstr ""
+msgstr "Links"
msgid "List"
msgstr "Lista"
@@ -20188,16 +20511,13 @@ msgid "List available repositories"
msgstr "Listar repositórios disponíveis"
msgid "List of all merge commits"
-msgstr ""
-
-msgid "List of users to be excluded from the limit"
-msgstr ""
+msgstr "Lista de todos commits de mesclagem"
msgid "List options"
msgstr "Opções de lista"
msgid "List settings"
-msgstr ""
+msgstr "Configurações de lista"
msgid "List the merge requests that must be merged before this one."
msgstr ""
@@ -20212,16 +20532,16 @@ msgid "Live preview"
msgstr "Pré-visualização ao vivo"
msgid "Load more"
-msgstr ""
+msgstr "Carregar mais"
msgid "Load more users"
-msgstr ""
+msgstr "Carregar mais usuários"
msgid "Loading"
msgstr "Carregando"
msgid "Loading %{name}"
-msgstr ""
+msgstr "Carregando %{name}"
msgid "Loading contribution stats for group members"
msgstr "Carregando estados de contribuição para membros de grupo"
@@ -20232,9 +20552,6 @@ msgstr ""
msgid "Loading functions timed out. Please reload the page to try again."
msgstr ""
-msgid "Loading issues"
-msgstr "Carregando issues"
-
msgid "Loading more"
msgstr "Carregando mais"
@@ -20260,7 +20577,7 @@ msgid "Location"
msgstr ""
msgid "Location:"
-msgstr ""
+msgstr "Local:"
msgid "Lock"
msgstr "Bloquear"
@@ -20323,10 +20640,10 @@ msgid "Low vulnerabilities present"
msgstr ""
msgid "MB"
-msgstr ""
+msgstr "MB"
msgid "MD5"
-msgstr ""
+msgstr "MD5"
msgid "MERGED"
msgstr ""
@@ -20431,13 +20748,13 @@ msgid "Manage project labels"
msgstr "Gerenciar etiquetas de projetos"
msgid "Manage projects."
-msgstr ""
+msgstr "Gerencie projeto."
msgid "Manage two-factor authentication"
msgstr "Gerenciar a autenticação de dois fatores"
msgid "Manage your license"
-msgstr ""
+msgstr "Gerenciar sua licença"
msgid "Manage your project's triggers"
msgstr "Gerenciar os gatilhos do seu projeto"
@@ -20455,7 +20772,7 @@ msgid "Manifest import"
msgstr "Importação de manifest"
msgid "Manual"
-msgstr ""
+msgstr "Manual"
msgid "ManualOrdering|Couldn't save the order of the issues"
msgstr ""
@@ -20488,7 +20805,7 @@ msgid "Mark this issue as related to another issue"
msgstr ""
msgid "Mark to do as done"
-msgstr ""
+msgstr "Marcar tarefa como concluída"
msgid "Markdown"
msgstr "Markdown"
@@ -20526,6 +20843,9 @@ msgstr "Adicionar texto em itálico (%{modifier_key}I)"
msgid "Marked For Deletion At - %{deletion_time}"
msgstr ""
+msgid "Marked as ready. Merging is now allowed."
+msgstr ""
+
msgid "Marked this %{noun} as a draft."
msgstr ""
@@ -20536,7 +20856,7 @@ msgid "Marked this issue as related to %{issue_ref}."
msgstr ""
msgid "Marked to do as done."
-msgstr ""
+msgstr "Marcou tarefa como concluída."
msgid "Marks this %{noun} as a draft."
msgstr ""
@@ -20548,16 +20868,16 @@ msgid "Marks this issue as related to %{issue_ref}."
msgstr ""
msgid "Marks to do as done."
-msgstr ""
+msgstr "Marca tarefa como concluída."
msgid "Mask variable"
-msgstr ""
+msgstr "Mascarar variável"
msgid "Match not found; try refining your search query."
msgstr ""
msgid "Mattermost"
-msgstr ""
+msgstr "Mattermost"
msgid "Mattermost URL:"
msgstr ""
@@ -20596,43 +20916,13 @@ msgid "MattermostService|Use this service to perform common tasks in your projec
msgstr ""
msgid "Max 100,000 events"
-msgstr ""
-
-msgid "Max 20 characters"
-msgstr ""
-
-msgid "Max Group Export Download requests per minute per user"
-msgstr ""
-
-msgid "Max Group Export requests per minute per user"
-msgstr ""
-
-msgid "Max Group Import requests per minute per user"
-msgstr ""
-
-msgid "Max Project Export Download requests per minute per user"
-msgstr ""
-
-msgid "Max Project Export requests per minute per user"
-msgstr ""
-
-msgid "Max Project Import requests per minute per user"
-msgstr ""
-
-msgid "Max authenticated API requests per period per user"
-msgstr ""
+msgstr "Máximo de 100.000 eventos"
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
-msgid "Max authenticated web requests per period per user"
-msgstr ""
-
msgid "Max file size is 200 KB."
-msgstr ""
-
-msgid "Max requests per minute per user"
-msgstr ""
+msgstr "O tamanho máximo do arquivo é 200 KB."
msgid "Max role"
msgstr "Cargo max"
@@ -20640,10 +20930,10 @@ msgstr "Cargo max"
msgid "Max session time"
msgstr ""
-msgid "Max unauthenticated requests per period per IP"
-msgstr ""
-
msgid "MaxBuilds"
+msgstr "MaxBuilds"
+
+msgid "Maximum 20 characters"
msgstr ""
msgid "Maximum Conan package file size in bytes"
@@ -20668,7 +20958,7 @@ msgid "Maximum allowable lifetime for personal access token (days)"
msgstr ""
msgid "Maximum artifacts size"
-msgstr ""
+msgstr "Tamanho máximo dos artefatos"
msgid "Maximum artifacts size (MB)"
msgstr "Tamanho máximo dos artefatos (MB)"
@@ -20679,6 +20969,12 @@ msgstr "Tamanho máximo do anexo"
msgid "Maximum attachment size (MB)"
msgstr "Tamanho máximo de anexos (MB)"
+msgid "Maximum authenticated API requests per rate limit period per user"
+msgstr ""
+
+msgid "Maximum authenticated web requests per rate limit period per user"
+msgstr ""
+
msgid "Maximum bulk request size (MiB)"
msgstr ""
@@ -20724,6 +21020,15 @@ msgstr ""
msgid "Maximum files in a diff"
msgstr ""
+msgid "Maximum group export download requests per minute"
+msgstr ""
+
+msgid "Maximum group export requests per minute"
+msgstr ""
+
+msgid "Maximum group import requests per minute"
+msgstr ""
+
msgid "Maximum import size"
msgstr "Tamanho máximo de importação"
@@ -20760,7 +21065,7 @@ msgstr "Número máximo de espelhos que podem estar sincronizando ao mesmo tempo
msgid "Maximum number of projects."
msgstr ""
-msgid "Maximum number of unique IPs per user"
+msgid "Maximum number of unique IP addresses per user."
msgstr ""
msgid "Maximum page reached"
@@ -20769,12 +21074,24 @@ msgstr ""
msgid "Maximum page size"
msgstr "Tamanho máximo da página"
+msgid "Maximum project export download requests per minute"
+msgstr ""
+
+msgid "Maximum project export requests per minute"
+msgstr ""
+
+msgid "Maximum project import requests per minute"
+msgstr ""
+
msgid "Maximum push size"
msgstr "Tamanho máximo de push"
msgid "Maximum push size (MB)"
msgstr "Tamanho máximo de push (MB)"
+msgid "Maximum requests per minute"
+msgstr ""
+
msgid "Maximum running slices"
msgstr ""
@@ -20788,7 +21105,7 @@ msgid "Maximum size of Elasticsearch bulk indexing requests."
msgstr ""
msgid "Maximum size of import files."
-msgstr ""
+msgstr "Tamanho máximo dos arquivos de importação."
msgid "Maximum size of individual attachments in comments."
msgstr ""
@@ -20802,10 +21119,16 @@ msgstr "Tamanho máximo de snippet"
msgid "Maximum time between updates that a mirror can have when scheduled to synchronize."
msgstr "Tempo máximo entre as atualizações que o espelho pode ter quando programado para sincronizar."
-msgid "Maximum time for web terminal websocket connection (in seconds). 0 for unlimited."
+msgid "Maximum time that users are allowed to skip the setup of two-factor authentication (in hours). Set to 0 (zero) to enforce at next sign in."
msgstr ""
-msgid "Maximum time that users are allowed to skip the setup of two-factor authentication (in hours). Set to 0 (zero) to enforce at next sign in."
+msgid "Maximum time, in seconds, for a web terminal websocket connection. 0 for unlimited."
+msgstr ""
+
+msgid "Maximum unauthenticated API requests per rate limit period per IP"
+msgstr ""
+
+msgid "Maximum unauthenticated web requests per rate limit period per IP"
msgstr ""
msgid "May"
@@ -20818,14 +21141,11 @@ msgid "Measured in bytes of code. Excludes generated and vendored code."
msgstr "Medido em bytes de código. Exclui código gerado e fornecido."
msgid "Medium timeout"
-msgstr ""
+msgstr "Tempo limite médio"
msgid "Medium vulnerabilities present"
msgstr ""
-msgid "Member lock"
-msgstr "Bloqueio de membro"
-
msgid "Member since"
msgstr ""
@@ -20862,6 +21182,9 @@ msgstr ""
msgid "Members of a group may only view projects they have permission to access"
msgstr ""
+msgid "Membership"
+msgstr ""
+
msgid "Members|%{time} by %{user}"
msgstr "%{time} por %{user}"
@@ -20922,9 +21245,6 @@ msgstr ""
msgid "Members|Expiration date updated successfully."
msgstr ""
-msgid "Members|Expired"
-msgstr "Expirado"
-
msgid "Members|Filter members"
msgstr "Filtrar membros"
@@ -20940,9 +21260,6 @@ msgstr ""
msgid "Members|Membership"
msgstr ""
-msgid "Members|No expiration set"
-msgstr "Sem expiração definida"
-
msgid "Members|Remove \"%{groupName}\""
msgstr "Remover \"%{groupName}\""
@@ -20964,9 +21281,6 @@ msgstr "Pesquisar grupos"
msgid "Members|Search invited"
msgstr "Pesquisar convite"
-msgid "Members|in %{time}"
-msgstr ""
-
msgid "Member|Deny access"
msgstr ""
@@ -20980,7 +21294,7 @@ msgid "Memory Usage"
msgstr "Uso da memória"
msgid "Menu"
-msgstr ""
+msgstr "Menu"
msgid "Merge"
msgstr "Merge"
@@ -20995,7 +21309,7 @@ msgid "Merge Request Analytics"
msgstr ""
msgid "Merge Requests"
-msgstr "Solicitações de mesclagem"
+msgstr "Solicitações de merge"
msgid "Merge Requests created"
msgstr "Solicitações de mesclagem criadas"
@@ -21042,9 +21356,6 @@ msgstr "Solicitação de mesclagem"
msgid "Merge request %{mr_link} was reviewed by %{mr_author}"
msgstr "A solicitação de mesclagem %{mr_link} foi revisada por %{mr_author}"
-msgid "Merge request (MR) approvals"
-msgstr "Aprovações de solicitação de mesclagem (MR)"
-
msgid "Merge request analytics"
msgstr "Análise de solicitação de mesclagem"
@@ -21066,12 +21377,21 @@ msgstr ""
msgid "Merge requests"
msgstr "Solicitações de mesclagem"
+msgid "Merge requests I've created"
+msgstr ""
+
msgid "Merge requests are a place to propose changes you've made to a project and discuss those changes with others"
msgstr "A tela de solicitação de mesclagem é um lugar para propor mudanças em um projeto e discutir essas mudanças com outros"
msgid "Merge requests are read-only in a secondary Geo node"
msgstr ""
+msgid "Merge requests assigned to me"
+msgstr ""
+
+msgid "Merge requests that I'm a reviewer"
+msgstr ""
+
msgid "Merge the branch and fix any conflicts that come up"
msgstr ""
@@ -21132,11 +21452,11 @@ msgstr ""
msgid "MergeRequests|An error occurred while saving the draft comment."
msgstr "Ocorreu um erro ao salvar o rascunho do comentário."
-msgid "MergeRequests|Failed to squash. Should be done manually."
+msgid "MergeRequests|Create issue to resolve thread"
msgstr ""
-msgid "MergeRequests|Resolve this thread in a new issue"
-msgstr "Resolve este tópico em uma nova issue"
+msgid "MergeRequests|Failed to squash. Should be done manually."
+msgstr ""
msgid "MergeRequests|Saving the comment failed"
msgstr "Falha ao salvar comentário"
@@ -21474,7 +21794,7 @@ msgid "Metrics|Panel YAML copied"
msgstr ""
msgid "Metrics|Preview panel"
-msgstr ""
+msgstr "Painel de visualização"
msgid "Metrics|PromQL query is valid"
msgstr "Consulta PromQL é válida"
@@ -21561,10 +21881,10 @@ msgid "Metrics|View documentation"
msgstr "Ver documentação"
msgid "Metrics|View logs"
-msgstr ""
+msgstr "Ver registros"
msgid "Metrics|View runbook - %{label}"
-msgstr ""
+msgstr "Ver runbook - %{label}"
msgid "Metrics|Y-axis label"
msgstr "Rótulo do eixo Y"
@@ -21773,7 +22093,7 @@ msgid "Mirror direction"
msgstr "Direção do espelho"
msgid "Mirror only protected branches"
-msgstr ""
+msgstr "Espelhar somente ramificações protegidas"
msgid "Mirror repository"
msgstr "Espelhar repositório"
@@ -21854,10 +22174,10 @@ msgid "Monday"
msgstr "Segunda-feira"
msgid "Monitor"
-msgstr ""
+msgstr "Monitor"
msgid "Monitor Settings"
-msgstr ""
+msgstr "Configurações do monitor"
msgid "Monitor the health and performance of GitLab with Prometheus."
msgstr ""
@@ -21949,6 +22269,9 @@ msgstr "Não é possível mover a issue devido a permissões insuficientes!"
msgid "MoveIssue|Cannot move issue to project it originates from!"
msgstr ""
+msgid "MoveIssue|Cannot move issues of '%{issue_type}' type."
+msgstr ""
+
msgid "Moved issue to %{label} column in the board."
msgstr "Issue movida para a coluna %{label} no painel."
@@ -22019,13 +22342,13 @@ msgid "Name"
msgstr "Nome"
msgid "Name can't be blank"
-msgstr ""
+msgstr "O nome não pode ficar em branco"
msgid "Name has already been taken"
msgstr "O nome não está disponível"
msgid "Name is already taken."
-msgstr ""
+msgstr "O nome já está em uso."
msgid "Name new label"
msgstr "Nome da nova etiqueta"
@@ -22074,6 +22397,15 @@ 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. To learn more about reducing storage capacity please visit our docs."
msgstr ""
+msgid "NamespaceUserCap|Pending users must be reviewed and approved by a group owner. Learn more about %{user_caps_link_start}User Caps%{link_end} and %{users_pending_approval_link_start}Users Pending Approval%{link_end}."
+msgstr ""
+
+msgid "NamespaceUserCap|View pending user approvals"
+msgstr ""
+
+msgid "NamespaceUserCap|Your group has reached its billable member limit"
+msgstr ""
+
msgid "Namespaces"
msgstr ""
@@ -22116,9 +22448,6 @@ msgstr "Necessita de atenção"
msgid "Network"
msgstr "Rede"
-msgid "Network Policy|New rule"
-msgstr ""
-
msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is inbound from a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
msgstr ""
@@ -22140,17 +22469,14 @@ msgstr ""
msgid "NetworkPolicies|%{strongOpen}any%{strongClose} port"
msgstr ""
-msgid "NetworkPolicies|+ Add alert"
-msgstr ""
-
msgid "NetworkPolicies|.yaml"
msgstr ""
msgid "NetworkPolicies|.yaml mode"
msgstr ""
-msgid "NetworkPolicies|Actions"
-msgstr "Ações"
+msgid "NetworkPolicies|Add alert"
+msgstr ""
msgid "NetworkPolicies|Alerts are intended to be selectively used for a limited number of events that are potentially concerning and warrant a manual review. Alerts should not be used as a substitute for a SIEM or a logging tool. High volume alerts are likely to be dropped so as to preserve the stability of GitLab's integration with Kubernetes."
msgstr ""
@@ -22185,9 +22511,6 @@ msgstr ""
msgid "NetworkPolicies|Deny all traffic"
msgstr ""
-msgid "NetworkPolicies|Description"
-msgstr "Descrição"
-
msgid "NetworkPolicies|Edit policy"
msgstr "Editar política"
@@ -22200,9 +22523,6 @@ msgstr ""
msgid "NetworkPolicies|IP/subnet"
msgstr ""
-msgid "NetworkPolicies|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
-msgstr ""
-
msgid "NetworkPolicies|Invalid or empty policy"
msgstr ""
@@ -22212,19 +22532,16 @@ msgstr ""
msgid "NetworkPolicies|Kubernetes error: %{error}"
msgstr ""
-msgid "NetworkPolicies|Name"
-msgstr "Nome"
-
msgid "NetworkPolicies|Network"
msgstr ""
-msgid "NetworkPolicies|Network traffic"
+msgid "NetworkPolicies|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
msgstr ""
-msgid "NetworkPolicies|New policy"
+msgid "NetworkPolicies|Network policy can be created after the environment is loaded successfully."
msgstr ""
-msgid "NetworkPolicies|No policies detected"
+msgid "NetworkPolicies|Network traffic"
msgstr ""
msgid "NetworkPolicies|None selected"
@@ -22233,21 +22550,12 @@ msgstr ""
msgid "NetworkPolicies|Please %{installLinkStart}install%{installLinkEnd} and %{configureLinkStart}configure a Kubernetes Agent for this project%{configureLinkEnd} to enable alerts."
msgstr ""
-msgid "NetworkPolicies|Policies are a specification of how groups of pods are allowed to communicate with each other's network endpoints."
-msgstr ""
-
msgid "NetworkPolicies|Policy %{policyName} was successfully changed"
msgstr ""
msgid "NetworkPolicies|Policy definition"
msgstr ""
-msgid "NetworkPolicies|Policy editor"
-msgstr "Editor de política"
-
-msgid "NetworkPolicies|Policy preview"
-msgstr ""
-
msgid "NetworkPolicies|Rule"
msgstr ""
@@ -22257,9 +22565,6 @@ msgstr ""
msgid "NetworkPolicies|Rule mode is unavailable for this policy. In some cases, we cannot parse the YAML file back into the rules editor."
msgstr ""
-msgid "NetworkPolicies|Rules"
-msgstr ""
-
msgid "NetworkPolicies|Save changes"
msgstr "Salvar alterações"
@@ -22272,9 +22577,6 @@ msgstr ""
msgid "NetworkPolicies|Traffic that does not match any rule will be blocked."
msgstr ""
-msgid "NetworkPolicies|Unable to parse policy"
-msgstr ""
-
msgid "NetworkPolicies|all DNS names"
msgstr ""
@@ -22454,6 +22756,9 @@ msgstr "Nova identidade"
msgid "New issue"
msgstr "Nova issue"
+msgid "New issue in %{project}"
+msgstr ""
+
msgid "New issue title"
msgstr "Titulo da nova issue"
@@ -22491,7 +22796,7 @@ msgid "New project/repository"
msgstr "Novo projeto/repositório"
msgid "New public deploy key"
-msgstr ""
+msgstr "Nova chave pública de implantação"
msgid "New release"
msgstr "Nova versão"
@@ -22532,7 +22837,7 @@ msgstr "Novo..."
msgid "Newest first"
msgstr "Mais recente primeiro"
-msgid "Newly registered users will by default be external"
+msgid "Newly-registered users are external by default"
msgstr ""
msgid "Next"
@@ -22569,7 +22874,7 @@ msgid "No Epic"
msgstr "Nenhuma épico"
msgid "No Matching Results"
-msgstr ""
+msgstr "Nenhum resultado correspondente"
msgid "No Milestone"
msgstr "Nenhum marco"
@@ -22740,10 +23045,10 @@ msgid "No matching results"
msgstr "Nenhum resultado correspondente"
msgid "No matching results for \"%{query}\""
-msgstr ""
+msgstr "Nenhum resultado correspondente para \"%{query}\""
msgid "No matching results..."
-msgstr ""
+msgstr "Nenhum resultado correspondente..."
msgid "No members found"
msgstr "Nenhum membro encontrado"
@@ -22847,8 +23152,10 @@ msgstr ""
msgid "No webhooks found, add one in the form above."
msgstr "Nenhum webhooks encontrados, adicione um no formulário acima."
-msgid "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} to renew your subscription."
-msgstr ""
+msgid "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} day to renew your subscription."
+msgid_plural "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} days to renew your subscription."
+msgstr[0] ""
+msgstr[1] ""
msgid "No. of commits"
msgstr ""
@@ -22865,7 +23172,7 @@ msgstr "O nó foi atualizado com sucesso."
msgid "Nodes"
msgstr "Nós"
-msgid "Non-admin users can sign in with read-only access and make read-only API requests."
+msgid "Non-admin users are restricted to read-only access, in both GitLab UI and API."
msgstr ""
msgid "None"
@@ -22946,7 +23253,7 @@ msgstr "Nota: Considere pedir ao seu administrador do GitLab para configurar %{g
msgid "NoteForm|Note"
msgstr "Nota"
-msgid "Notes Rate Limits"
+msgid "Notes rate limit"
msgstr ""
msgid "Notes|Are you sure you want to cancel creating this comment?"
@@ -23113,9 +23420,6 @@ msgstr "Nov"
msgid "November"
msgstr "Novembro"
-msgid "Novice"
-msgstr ""
-
msgid "Now, personalize your GitLab experience"
msgstr "Agora, personalize sua experiência do GitLab"
@@ -23192,7 +23496,7 @@ msgid "Ok, let's go"
msgstr ""
msgid "Okay"
-msgstr ""
+msgstr "OK"
msgid "Oldest first"
msgstr "Mais antigo primeiro"
@@ -23270,7 +23574,7 @@ msgid "OnCallSchedules|Enable end date"
msgstr ""
msgid "OnCallSchedules|Expand schedule"
-msgstr ""
+msgstr "Expandir agendamento"
msgid "OnCallSchedules|Failed to add rotation"
msgstr ""
@@ -23284,7 +23588,7 @@ msgstr "Falha ao editar o agendamento"
msgid "OnCallSchedules|For this rotation, on-call will be:"
msgstr ""
-msgid "OnCallSchedules|On-call schedule %{schedule} in Project %{project}"
+msgid "OnCallSchedules|On-call schedule %{obstacle} in Project %{project}"
msgstr ""
msgid "OnCallSchedules|On-call schedules"
@@ -23431,22 +23735,22 @@ msgstr "Nome da verificação"
msgid "OnDemandScans|Scanner profile"
msgstr "Perfil de verificação"
+msgid "OnDemandScans|Schedule scan"
+msgstr ""
+
msgid "OnDemandScans|Select one of the existing profiles"
msgstr ""
msgid "OnDemandScans|Site profile"
msgstr "Perfil de site"
-msgid "OnDemandScans|Use existing scanner profile"
+msgid "OnDemandScans|Start time"
msgstr ""
-msgid "OnDemandScans|Use existing site profile"
-msgstr ""
-
-msgid "OnDemandScans|You can either choose a passive scan or validate the target site in your chosen site profile. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
+msgid "OnDemandScans|Use existing scanner profile"
msgstr ""
-msgid "OnDemandScans|You cannot run an active scan against an unvalidated site."
+msgid "OnDemandScans|Use existing site profile"
msgstr ""
msgid "OnDemandScans|You must create a repository within your project to run an on-demand scan."
@@ -23511,6 +23815,9 @@ msgstr ""
msgid "Only admins can delete project"
msgstr "Apenas administradores podem excluir projetos"
+msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
+msgstr ""
+
msgid "Only include features new to your current subscription tier."
msgstr ""
@@ -23529,6 +23836,12 @@ msgstr "Apenas membros do projeto serão importados. Membros do grupo serão ign
msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
+msgid "Only reCAPTCHA v2 is supported:"
+msgstr ""
+
+msgid "Only users from the specified IP address ranges are able to reach this group, including all subgroups, projects, and Git repositories."
+msgstr ""
+
msgid "Only verified users with an email address in any of these domains can be added to the group."
msgstr ""
@@ -23557,7 +23870,7 @@ msgid "Open errors"
msgstr "Abrir erros"
msgid "Open in file view"
-msgstr ""
+msgstr "Abrir na visualização de arquivos"
msgid "Open in your IDE"
msgstr "Abrir em seu IDE"
@@ -23715,9 +24028,6 @@ msgstr "Proprietário"
msgid "Package Registry"
msgstr "Registro de pacote"
-msgid "Package Registry Rate Limits"
-msgstr ""
-
msgid "Package Registry: authenticated API requests"
msgstr ""
@@ -23736,6 +24046,9 @@ msgstr ""
msgid "Package recipe already exists"
msgstr ""
+msgid "Package registry rate limits"
+msgstr ""
+
msgid "Package type"
msgstr "Tipo de pacote"
@@ -23802,6 +24115,9 @@ msgstr ""
msgid "PackageRegistry|Composer"
msgstr ""
+msgid "PackageRegistry|Composer.json with license: %{license} and version: %{version}"
+msgstr ""
+
msgid "PackageRegistry|Conan"
msgstr ""
@@ -23865,6 +24181,9 @@ msgstr ""
msgid "PackageRegistry|Copy require package include"
msgstr ""
+msgid "PackageRegistry|Copy target SHA"
+msgstr ""
+
msgid "PackageRegistry|Copy yarn command"
msgstr "Copiar comando yarn"
@@ -23920,7 +24239,7 @@ msgid "PackageRegistry|Gradle Kotlin DSL install command"
msgstr ""
msgid "PackageRegistry|Helm"
-msgstr ""
+msgstr "Helm"
msgid "PackageRegistry|If you haven't already done so, you will need to add the below to your %{codeStart}.pypirc%{codeEnd} file."
msgstr ""
@@ -23931,6 +24250,9 @@ msgstr ""
msgid "PackageRegistry|Install package version"
msgstr ""
+msgid "PackageRegistry|Instance-level"
+msgstr ""
+
msgid "PackageRegistry|Invalid Package: failed metadata extraction"
msgstr ""
@@ -23976,6 +24298,9 @@ msgstr ""
msgid "PackageRegistry|Pip Command"
msgstr ""
+msgid "PackageRegistry|Project-level"
+msgstr ""
+
msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
msgstr "Publique e compartilhe pacotes para uma variedade de gerenciadores de pacotes comuns. %{docLinkStart}Mais informações%{docLinkEnd}"
@@ -23997,6 +24322,9 @@ msgstr ""
msgid "PackageRegistry|Remove package"
msgstr "Remover pacote"
+msgid "PackageRegistry|Required Python: %{pythonVersion}"
+msgstr ""
+
msgid "PackageRegistry|RubyGems"
msgstr "RubyGems"
@@ -24039,6 +24367,9 @@ msgstr ""
msgid "PackageRegistry|Source project located at %{link}"
msgstr ""
+msgid "PackageRegistry|Target SHA: %{sha}"
+msgstr ""
+
msgid "PackageRegistry|There are no other versions of this package."
msgstr ""
@@ -24121,7 +24452,7 @@ msgid "Pages Domain"
msgstr "Domínio de Pages"
msgid "Pagination|First"
-msgstr ""
+msgstr "Primeiro"
msgid "Pagination|Go to first page"
msgstr "Ir para primeira página"
@@ -24136,7 +24467,7 @@ msgid "Pagination|Go to previous page"
msgstr "Ir para a página anterior"
msgid "Pagination|Last"
-msgstr ""
+msgstr "Último"
msgid "Pagination|Last »"
msgstr "Último »"
@@ -24207,6 +24538,18 @@ msgstr "Senha modificada com sucesso"
msgid "Password was successfully updated. Please sign in again."
msgstr ""
+msgid "PasswordPrompt|Confirm password"
+msgstr ""
+
+msgid "PasswordPrompt|Confirm password to continue"
+msgstr ""
+
+msgid "PasswordPrompt|Password is required"
+msgstr ""
+
+msgid "PasswordPrompt|Please enter your password to confirm"
+msgstr ""
+
msgid "Passwords should be unique and not used for any other sites or services."
msgstr ""
@@ -24234,6 +24577,9 @@ msgstr "Colar link de issue"
msgid "Paste project path (i.e. gitlab-org/gitlab)"
msgstr ""
+msgid "Paste this DSN into your Sentry SDK"
+msgstr ""
+
msgid "Paste your public SSH key, which is usually contained in the file '~/.ssh/id_ed25519.pub' or '~/.ssh/id_rsa.pub' and begins with 'ssh-ed25519' or 'ssh-rsa'. Do not paste your private SSH key, as that can compromise your identity."
msgstr ""
@@ -24262,7 +24608,7 @@ msgid "Paused runners don't accept new jobs"
msgstr ""
msgid "Peer review by"
-msgstr ""
+msgstr "Revisão por pares por"
msgid "Pending"
msgstr "Pendente"
@@ -24318,6 +24664,9 @@ msgstr ""
msgid "PerformanceBar|First Contentful Paint"
msgstr ""
+msgid "PerformanceBar|Flamegraph with mode:"
+msgstr ""
+
msgid "PerformanceBar|Frontend resources"
msgstr ""
@@ -24325,7 +24674,7 @@ msgid "PerformanceBar|Gitaly calls"
msgstr ""
msgid "PerformanceBar|Memory"
-msgstr ""
+msgstr "Memória"
msgid "PerformanceBar|Redis calls"
msgstr ""
@@ -24351,9 +24700,18 @@ msgstr "Duração total"
msgid "PerformanceBar|Trace"
msgstr ""
-msgid "Period in seconds"
+msgid "PerformanceBar|cpu"
msgstr ""
+msgid "PerformanceBar|object"
+msgstr ""
+
+msgid "PerformanceBar|wall"
+msgstr ""
+
+msgid "Period in seconds"
+msgstr "Período em segundos"
+
msgid "Permanently delete project"
msgstr ""
@@ -24439,7 +24797,7 @@ msgid "Pipeline ran in fork of project"
msgstr ""
msgid "Pipeline status emails"
-msgstr ""
+msgstr "E-mails de status do pipeline"
msgid "Pipeline subscriptions"
msgstr ""
@@ -24493,19 +24851,19 @@ msgid "PipelineEditorTutorial|Get started with GitLab CI/CD"
msgstr "Primeiros passos com GitLab CI/CD"
msgid "PipelineEditorTutorial|GitLab CI/CD can automatically build, test, and deploy your application."
-msgstr ""
+msgstr "GitLab CI/CD pode construir, testar e implantar seu aplicativo automaticamente."
msgid "PipelineEditorTutorial|If you’re using a self-managed GitLab instance, %{linkStart}make sure your instance has runners available.%{linkEnd}"
msgstr ""
msgid "PipelineEditorTutorial|Learn more about %{linkStart}GitLab CI/CD concepts%{linkEnd}"
-msgstr ""
+msgstr "Saiba mais sobre %{linkStart}conceitos de CI/CD do GitLab%{linkEnd}"
msgid "PipelineEditorTutorial|Make your pipeline more efficient with the %{linkStart}Needs keyword%{linkEnd}"
msgstr ""
msgid "PipelineEditorTutorial|Resources to help with your CI/CD configuration:"
-msgstr ""
+msgstr "Recursos para ajudar na configuração do CI/CD:"
msgid "PipelineEditorTutorial|Select the pipeline ID to view the full details about your first pipeline run."
msgstr ""
@@ -24529,10 +24887,10 @@ msgid "PipelineEditorTutorial|âš™ï¸ Pipeline configuration reference"
msgstr ""
msgid "PipelineEditorTutorial|💡 Tip: Visualize and validate your pipeline"
-msgstr ""
+msgstr "💡 Dica: Visualize e valide seu pipeline"
msgid "PipelineEditorTutorial|🚀 Run your first pipeline"
-msgstr ""
+msgstr "🚀 Execute seu primeiro pipeline"
msgid "PipelineEditor|The CI/CD configuration is continuously validated. Errors and warnings are displayed when the CI/CD configuration file is not empty."
msgstr ""
@@ -24579,6 +24937,48 @@ msgstr "Destino"
msgid "PipelineSchedules|Variables"
msgstr "Variáveis"
+msgid "PipelineSource|API"
+msgstr ""
+
+msgid "PipelineSource|Chat"
+msgstr ""
+
+msgid "PipelineSource|External"
+msgstr ""
+
+msgid "PipelineSource|External Pull Request"
+msgstr ""
+
+msgid "PipelineSource|Merge Request"
+msgstr ""
+
+msgid "PipelineSource|On-Demand DAST Scan"
+msgstr ""
+
+msgid "PipelineSource|On-Demand DAST Validation"
+msgstr ""
+
+msgid "PipelineSource|Parent Pipeline"
+msgstr ""
+
+msgid "PipelineSource|Pipeline"
+msgstr ""
+
+msgid "PipelineSource|Push"
+msgstr ""
+
+msgid "PipelineSource|Schedule"
+msgstr ""
+
+msgid "PipelineSource|Trigger"
+msgstr ""
+
+msgid "PipelineSource|Web"
+msgstr ""
+
+msgid "PipelineSource|Web IDE"
+msgstr ""
+
msgid "PipelineStatusTooltip|Pipeline: %{ciStatus}"
msgstr "Pipeline: %{ciStatus}"
@@ -24655,7 +25055,7 @@ msgid "Pipelines|If you are unsure, please ask a project maintainer to review it
msgstr ""
msgid "Pipelines|Improve code quality with GitLab CI/CD"
-msgstr ""
+msgstr "Melhore a qualidade do código com GitLab CI/CD"
msgid "Pipelines|Install GitLab Runners"
msgstr "Instalar GitLab Runners"
@@ -24865,7 +25265,7 @@ msgid "Pipeline|Raw text search is not currently supported. Please use the avail
msgstr ""
msgid "Pipeline|Run for branch name or tag"
-msgstr ""
+msgstr "Executar para o nome da ramificação ou tag"
msgid "Pipeline|Run pipeline"
msgstr "Executar pipeline"
@@ -24879,46 +25279,7 @@ msgstr "Ignorado"
msgid "Pipeline|Source"
msgstr "Fonte"
-msgid "Pipeline|Source|API"
-msgstr ""
-
-msgid "Pipeline|Source|Chat"
-msgstr ""
-
-msgid "Pipeline|Source|External"
-msgstr ""
-
-msgid "Pipeline|Source|External Pull Request"
-msgstr ""
-
-msgid "Pipeline|Source|Merge Request"
-msgstr ""
-
-msgid "Pipeline|Source|On-Demand DAST Scan"
-msgstr ""
-
-msgid "Pipeline|Source|On-Demand DAST Validation"
-msgstr ""
-
-msgid "Pipeline|Source|Parent Pipeline"
-msgstr ""
-
-msgid "Pipeline|Source|Pipeline"
-msgstr ""
-
-msgid "Pipeline|Source|Push"
-msgstr ""
-
-msgid "Pipeline|Source|Schedule"
-msgstr ""
-
-msgid "Pipeline|Source|Trigger"
-msgstr ""
-
-msgid "Pipeline|Source|Web"
-msgstr ""
-
-msgid "Pipeline|Source|Web IDE"
+msgid "Pipeline|Source|Security Policy"
msgstr ""
msgid "Pipeline|Specify variable values to be used in this run. The values specified in %{linkStart}CI/CD settings%{linkEnd} will be used by default."
@@ -24969,8 +25330,8 @@ msgstr "Ver pipeline"
msgid "Pipeline|We are currently unable to fetch pipeline data"
msgstr ""
-msgid "Pipeline|You’re about to stop pipeline %{pipelineId}."
-msgstr "Você está prestes a interromper o pipeline %{pipelineId}."
+msgid "Pipeline|You’re about to stop pipeline #%{pipelineId}."
+msgstr ""
msgid "Pipeline|for"
msgstr "para"
@@ -24996,6 +25357,9 @@ msgstr ""
msgid "Plain diff"
msgstr "Diff simples"
+msgid "Plain-text response to send to clients that hit a rate limit"
+msgstr ""
+
msgid "Plan:"
msgstr ""
@@ -25048,7 +25412,7 @@ msgid "Please confirm your email address"
msgstr ""
msgid "Please contact an admin to register runners."
-msgstr ""
+msgstr "Por favor, contate um administrador para registrar os executores."
msgid "Please contact your GitLab administrator if you think this is an error."
msgstr ""
@@ -25102,13 +25466,13 @@ msgid "Please fill in a descriptive name for your group."
msgstr "Por favor, preencha um nome descritivo para o seu grupo."
msgid "Please fill out this field."
-msgstr ""
+msgstr "Por favor, preencha este campo."
msgid "Please follow the %{link_start}Let's Encrypt troubleshooting instructions%{link_end} to re-obtain your Let's Encrypt certificate."
-msgstr ""
+msgstr "Por favor, siga as %{link_start} instruções de solução de problemas do Let's Encrypt %{link_end} para obter novamente o seu certificado Let's Encrypt."
msgid "Please follow the Let's Encrypt troubleshooting instructions to re-obtain your Let's Encrypt certificate: %{docs_url}."
-msgstr ""
+msgstr "Por favor, siga as instruções de solução de problemas do Let's Encrypt para obter novamente seu certificado Let's Encrypt: %{docs_url}."
msgid "Please migrate all existing projects to hashed storage to avoid security issues and ensure data integrity. %{migrate_link}"
msgstr "Por favor, migre todos os projetos existentes para o armazenamento com hash para evitar problemas de segurança e garantir a integridade dos dados. %{migrate_link}"
@@ -25123,31 +25487,28 @@ msgid "Please provide a name"
msgstr "Por favor, forneça um nome"
msgid "Please provide a name."
-msgstr ""
+msgstr "Por favor, forneça um nome."
msgid "Please provide a valid URL"
-msgstr ""
+msgstr "Por favor, insira uma URL válida"
msgid "Please provide a valid URL."
-msgstr ""
+msgstr "Por favor, insira uma URL válida."
msgid "Please provide a valid YouTube URL or ID"
-msgstr ""
+msgstr "Por favor, forneça uma URL ou ID válida do YouTube"
msgid "Please provide a valid email address."
msgstr "Por favor, forneça um endereço de e-mail válido."
msgid "Please provide attributes to update"
-msgstr ""
-
-msgid "Please provide your username or email address."
-msgstr ""
+msgstr "Por favor, forneça atributos para atualizar"
msgid "Please reach out if you have any questions and we'll be happy to assist."
-msgstr ""
+msgstr "Por favor, entre em contato se você tiver alguma dúvida, e nós ficaremos felizes em ajudar."
msgid "Please refer to %{docs_url}"
-msgstr ""
+msgstr "Por favor, consulte %{docs_url}"
msgid "Please select"
msgstr "Por favor selecione"
@@ -25165,7 +25526,7 @@ msgid "Please select a group."
msgstr "Por favor, selecione um grupo."
msgid "Please select a valid target branch"
-msgstr ""
+msgstr "Por favor, selecione uma ramificação de destino válida"
msgid "Please select a valid target branch."
msgstr ""
@@ -25185,9 +25546,6 @@ msgstr "Por favor selecione..."
msgid "Please set a new password before proceeding."
msgstr "Defina uma nova senha antes de continuar."
-msgid "Please share your feedback about %{featureName} %{linkStart}in this issue%{linkEnd} to help us improve the experience."
-msgstr ""
-
msgid "Please solve the captcha"
msgstr ""
@@ -25216,7 +25574,7 @@ msgid "Please wait while we import the repository for you. Refresh at will."
msgstr "Por favor, aguarde enquanto importamos o repositório para você. Atualize à vontade."
msgid "Pod does not exist"
-msgstr ""
+msgstr "Pod não existente"
msgid "Pod not found"
msgstr "Pod não encontrado"
@@ -25240,10 +25598,10 @@ msgid "Polling interval multiplier"
msgstr ""
msgid "Popularity"
-msgstr ""
+msgstr "Popularidade"
msgid "Port"
-msgstr ""
+msgstr "Porta"
msgid "Postman collection"
msgstr ""
@@ -25303,7 +25661,7 @@ msgid "Preferences|Homepage content"
msgstr "Conteúdo da página inicial"
msgid "Preferences|Instead of all the files changed, show only one file at a time. To switch between files, use the file browser."
-msgstr ""
+msgstr "Em vez de todos os arquivos alterados, mostre apenas um arquivo de cada vez. Para alternar entre arquivos, use o navegador de arquivos."
msgid "Preferences|Integrations"
msgstr "Integrações"
@@ -25324,7 +25682,7 @@ msgid "Preferences|Render whitespace characters in the Web IDE"
msgstr "Renderizar caracteres de espaço em branco no IDE Web"
msgid "Preferences|Show one file at a time on merge request's Changes tab"
-msgstr ""
+msgstr "Mostrar um arquivo de cada vez na guia Alterações de solicitação de mesclagem"
msgid "Preferences|Show whitespace changes in diffs"
msgstr "Mostrar mudanças de espaço em branco nos diffs"
@@ -25333,7 +25691,7 @@ msgid "Preferences|Sourcegraph"
msgstr "Sourcegraph"
msgid "Preferences|Surround text selection when typing quotes or brackets"
-msgstr ""
+msgstr "Cercar a seleção de texto ao digitar aspas ou colchetes"
msgid "Preferences|Syntax highlighting theme"
msgstr "Tema de realce de sintaxe"
@@ -25365,9 +25723,12 @@ msgstr ""
msgid "Prevent adding new members to project membership within this group"
msgstr "Impede a adição de novos membros ao projeto pertencentes a este grupo"
-msgid "Prevent editing approval rules in projects and merge requests."
+msgid "Prevent auto-stopping"
msgstr ""
+msgid "Prevent editing approval rules in projects and merge requests."
+msgstr "Evitar a edição de regras de aprovação em projetos e solicitações de mesclagem."
+
msgid "Prevent environment from auto-stopping"
msgstr ""
@@ -25377,7 +25738,7 @@ msgstr ""
msgid "Prevent users from changing their profile name"
msgstr ""
-msgid "Prevent users from performing write operations on GitLab while performing maintenance."
+msgid "Prevent users from performing write operations while GitLab maintenance is in progress."
msgstr ""
msgid "Preview"
@@ -25402,7 +25763,7 @@ msgid "Previous commit"
msgstr "Commit anterior"
msgid "Previous design"
-msgstr ""
+msgstr "Design anterior"
msgid "Previous file in diff"
msgstr "Arquivo anterior em diff"
@@ -25432,7 +25793,7 @@ msgid "Prioritized label"
msgstr "Etiqueta priorizada"
msgid "Priority"
-msgstr ""
+msgstr "Prioridade"
msgid "Private"
msgstr "Privado"
@@ -25462,13 +25823,13 @@ msgid "Proceed"
msgstr "Prosseguir"
msgid "Product Analytics"
-msgstr ""
+msgstr "Análises de produto"
msgid "ProductAnalytics|There is no data for this type of chart currently. Please see the Setup tab if you have not configured the product analytics tool already."
msgstr ""
msgid "Productivity"
-msgstr ""
+msgstr "Produtividade"
msgid "Productivity Analytics"
msgstr "Análise de produtividade"
@@ -25498,7 +25859,7 @@ msgid "ProductivityAnalytics|Hours"
msgstr "Horas"
msgid "ProductivityAnalytics|List"
-msgstr ""
+msgstr "Lista"
msgid "ProductivityAnalytics|Merge Requests"
msgstr "Solicitações de mesclagem"
@@ -25510,10 +25871,10 @@ msgid "ProductivityAnalytics|Merge requests"
msgstr "Solicitações de mesclagem"
msgid "ProductivityAnalytics|Time to merge"
-msgstr ""
+msgstr "Tempo para mesclar"
msgid "ProductivityAnalytics|Trendline"
-msgstr ""
+msgstr "Tendência"
msgid "ProductivityAnalytics|is earlier than the given merged at after date"
msgstr ""
@@ -25525,10 +25886,10 @@ msgid "Profile Settings"
msgstr "Configurações do perfil"
msgid "Profile image guideline"
-msgstr ""
+msgstr "Diretriz de imagem de perfil"
msgid "Profile page:"
-msgstr ""
+msgstr "Página de perfil:"
msgid "ProfileSession|on"
msgstr ""
@@ -25650,20 +26011,23 @@ msgstr "Digite como seu nome é pronunciado para ajudar as pessoas a tratá-lo c
msgid "Profiles|Enter your name, so people you know can recognize you"
msgstr "Digite seu nome, então as pessoas que você conhece podem reconhecê-lo"
+msgid "Profiles|Enter your password to confirm the email change"
+msgstr ""
+
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|Expired key is not valid."
-msgstr ""
+msgstr "A chave expirada não é válida."
msgid "Profiles|Expired:"
-msgstr ""
+msgstr "Expirado:"
msgid "Profiles|Expires at"
msgstr "Expira em"
msgid "Profiles|Expires:"
-msgstr ""
+msgstr "Expira em:"
msgid "Profiles|Feed token was successfully reset"
msgstr "O token de feed foi redefinido com sucesso"
@@ -25690,7 +26054,7 @@ msgid "Profiles|Increase your account's security by enabling Two-Factor Authenti
msgstr "Aumente a segurança da sua conta ativando a autenticação de dois fatores (A2F)"
msgid "Profiles|Invalid key."
-msgstr ""
+msgstr "Chave inválida."
msgid "Profiles|Invalid password"
msgstr "Senha inválida"
@@ -25884,12 +26248,12 @@ msgstr "Seu status"
msgid "Profiles|e.g. My MacBook key"
msgstr "por exemplo, Chave do meu MacBook"
+msgid "Profiles|https://website.com"
+msgstr ""
+
msgid "Profiles|username"
msgstr "nome de usuário"
-msgid "Profiles|website.com"
-msgstr "sitedaweb.com"
-
msgid "Profiles|your account"
msgstr "sua conta"
@@ -26130,9 +26494,21 @@ msgstr "ID do Projeto: %{project_id}"
msgid "ProjectSelect| or group"
msgstr " ou grupo"
+msgid "ProjectSelect|No matching results"
+msgstr ""
+
msgid "ProjectSelect|Search for project"
msgstr "Pesquisar por projeto"
+msgid "ProjectSelect|Search projects"
+msgstr ""
+
+msgid "ProjectSelect|Select a project"
+msgstr ""
+
+msgid "ProjectSelect|There was an error fetching the projects. Please try again."
+msgstr ""
+
msgid "ProjectService|Drone server URL"
msgstr ""
@@ -26170,13 +26546,13 @@ msgid "ProjectService|Perform common operations on GitLab project: %{project_nam
msgstr "Execute operações comuns no projeto GitLab: %{project_name}"
msgid "ProjectService|Run CI/CD pipelines with Buildkite."
-msgstr ""
+msgstr "Execute pipelines CI/CD com Buildkite."
msgid "ProjectService|Run CI/CD pipelines with Drone."
-msgstr ""
+msgstr "Execute pipelines CI/CD com Drone."
msgid "ProjectService|Run CI/CD pipelines with JetBrains TeamCity."
-msgstr ""
+msgstr "Execute pipelines CI/CD com TeamCity."
msgid "ProjectService|TeamCity server URL"
msgstr ""
@@ -26220,6 +26596,9 @@ msgstr ""
msgid "ProjectService|Trigger event when a new, unique alert is recorded."
msgstr ""
+msgid "ProjectService|Trigger event when a new, unique vulnerability is recorded. (Note: This feature requires an Ultimate plan.)"
+msgstr ""
+
msgid "ProjectService|Trigger event when a pipeline status changes."
msgstr ""
@@ -26233,7 +26612,7 @@ msgid "ProjectSettings|%{link_start}What are description templates?%{link_end}"
msgstr ""
msgid "ProjectSettings|Additional settings that influence how and when merges are done."
-msgstr ""
+msgstr "Configurações adicionais que influenciam como e onde as mesclagem são feitas."
msgid "ProjectSettings|All discussions must be resolved"
msgstr "Todas as discussões devem ser resolvidas"
@@ -26242,7 +26621,7 @@ msgid "ProjectSettings|Allow"
msgstr "Permitir"
msgid "ProjectSettings|Always show thumbs-up and thumbs-down award emoji buttons on issues, merge requests, and snippets."
-msgstr ""
+msgstr "Sempre mostrar os emojis de aprovação e desaprovação com polegar em issues, solicitações de mesclagem e snippets."
msgid "ProjectSettings|Analytics"
msgstr "Análises"
@@ -26266,7 +26645,7 @@ msgid "ProjectSettings|Choose your merge method, merge options, merge checks, an
msgstr ""
msgid "ProjectSettings|Choose your merge method, merge options, merge checks, merge suggestions, and set up a default description template for merge requests."
-msgstr ""
+msgstr "Escolha seu método de merge, opções de mesclar, verificações de mesclar, sugestões de mesclagem e configure um modelo de descrição padrão para solicitações de mesclagem."
msgid "ProjectSettings|Configure your project resources and monitor their health."
msgstr "Configure os recursos do projeto e monitore a saúde deles."
@@ -26470,19 +26849,19 @@ msgid "ProjectSettings|Supported variables:"
msgstr "Variáveis suportadas"
msgid "ProjectSettings|Target project"
-msgstr ""
+msgstr "Projeto alvo"
msgid "ProjectSettings|The commit message used when applying merge request suggestions. %{link_start}Learn more about suggestions.%{link_end}"
msgstr ""
msgid "ProjectSettings|The default target project for merge requests created in this fork project."
-msgstr ""
+msgstr "O projeto de destino padrão para solicitações de mesclagem criadas neste projeto de fork."
msgid "ProjectSettings|These checks must pass before merge requests can be merged."
msgstr "Essas verificações devem passar antes que solicitações de mesclagem possam ter seus merge realizados."
msgid "ProjectSettings|This project"
-msgstr ""
+msgstr "Este projeto"
msgid "ProjectSettings|This setting is applied on the server level and can be overridden by an admin."
msgstr "Essa configuração está aplicada no nível do servidor e pode ser sobrescrita por um administrador."
@@ -26503,7 +26882,7 @@ msgid "ProjectSettings|Upstream project"
msgstr ""
msgid "ProjectSettings|Used for every new merge request."
-msgstr ""
+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."
@@ -26634,9 +27013,15 @@ msgstr "Projetos obtidos com sucesso"
msgid "Projects are graded based on the highest severity vulnerability present"
msgstr ""
+msgid "Projects are organized into groups"
+msgstr ""
+
msgid "Projects contributed to"
msgstr ""
+msgid "Projects help you organize your work. They contain your file repository, issues, merge requests, and so much more."
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr "Projetos compartilhados com %{group_name}"
@@ -26871,10 +27256,10 @@ msgstr "Nenhuma métrica personalizada foi criada. Crie uma usando o botão acim
msgid "PrometheusService|Prometheus cluster integration"
msgstr ""
-msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
+msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
msgstr ""
-msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
+msgid "PrometheusService|The ID of the IAP-secured resource."
msgstr ""
msgid "PrometheusService|The Prometheus API base URL."
@@ -26986,7 +27371,7 @@ msgid "Promotions|Improve search with Advanced Search and GitLab Enterprise Edit
msgstr "Melhore a pesquisa com pesquisa avançada e GitLab Enterprise Edition."
msgid "Promotions|Keep track of events in your project"
-msgstr ""
+msgstr "Acompanhe os eventos do seu projeto"
msgid "Promotions|Learn more"
msgstr "Saiba mais"
@@ -27130,7 +27515,7 @@ msgid "ProtectedBranch|Allow all users with push access to force push."
msgstr "Permitir que todos os usuários com acesso push forcem o push."
msgid "ProtectedBranch|Allowed to force push"
-msgstr ""
+msgstr "Permitido forçar um push"
msgid "ProtectedBranch|Allowed to force push:"
msgstr "Permitido forçar um push:"
@@ -27142,7 +27527,7 @@ msgid "ProtectedBranch|Allowed to merge:"
msgstr "Permitido para mesclar:"
msgid "ProtectedBranch|Allowed to push"
-msgstr ""
+msgstr "Permitido para push"
msgid "ProtectedBranch|Allowed to push:"
msgstr "Permitido para push:"
@@ -27157,10 +27542,10 @@ msgid "ProtectedBranch|By default, protected branches restrict who can modify th
msgstr "Proteção de ramificações protegidas por padrão restringem quem pode modificar a ramificação."
msgid "ProtectedBranch|Code owner approval"
-msgstr ""
+msgstr "Aprovação do proprietário do código"
msgid "ProtectedBranch|Does not apply to users allowed to push. Optional sections are not enforced."
-msgstr ""
+msgstr "Não se aplica a usuários com permissão para fazer push. Seções opcionais não são aplicadas."
msgid "ProtectedBranch|Keep stable branches secure and force developers to use merge requests."
msgstr "Mantenha ramificações estáveis seguras e força os desenvolvedores a usar as solicitações de mesclagem"
@@ -27262,7 +27647,7 @@ msgid "Provider"
msgstr "Provedor"
msgid "Provision instructions"
-msgstr ""
+msgstr "Instruções de provisão"
msgid "Provisioned by:"
msgstr "Provisionado por:"
@@ -27421,22 +27806,22 @@ msgid "PushoverService|Enter your application key."
msgstr ""
msgid "PushoverService|Enter your user key."
-msgstr ""
+msgstr "Digite sua chave de usuário."
msgid "PushoverService|Get real-time notifications on your device."
msgstr ""
msgid "PushoverService|High priority"
-msgstr ""
+msgstr "Alta prioridade"
msgid "PushoverService|Leave blank for all active devices."
msgstr ""
msgid "PushoverService|Low priority"
-msgstr ""
+msgstr "Baixa prioridade"
msgid "PushoverService|Lowest priority"
-msgstr ""
+msgstr "Menor prioridade"
msgid "PushoverService|Normal priority"
msgstr "Prioridade normal"
@@ -27466,7 +27851,7 @@ msgid "Quick actions can be used in description and comment boxes."
msgstr "Ações rápidas podem ser usadas nas descrições e nas caixas de comentário."
msgid "Quick help"
-msgstr ""
+msgstr "Ajuda rápida"
msgid "Quick range"
msgstr ""
@@ -27487,9 +27872,12 @@ msgid "Random"
msgstr ""
msgid "Rate Limits"
-msgstr ""
+msgstr "Limites de taxa"
msgid "Rate limit"
+msgstr "Taxa limite"
+
+msgid "Rate limits can help reduce request volume (like from crawlers or abusive bots)."
msgstr ""
msgid "Raw blob request rate limit per minute"
@@ -27504,6 +27892,9 @@ msgstr ""
msgid "Re-authentication required"
msgstr ""
+msgid "Re-import"
+msgstr ""
+
msgid "Re-request review"
msgstr ""
@@ -27511,7 +27902,7 @@ msgid "Re-verification interval"
msgstr ""
msgid "Read documentation"
-msgstr ""
+msgstr "Ler a documentação"
msgid "Read more"
msgstr "Leia mais"
@@ -27525,6 +27916,9 @@ msgstr ""
msgid "Read more about related issues"
msgstr "Leia mais sobre issues relacionadas"
+msgid "Read their documentation."
+msgstr ""
+
msgid "Ready to get started with GitLab? Follow these steps to set up your workspace, plan and commit changes, and deploy your project."
msgstr ""
@@ -27558,6 +27952,9 @@ msgstr ""
msgid "Receive any notifications from GitLab."
msgstr "Receber qualquer notificações do GitLab."
+msgid "Receive notification of abuse reports by email."
+msgstr ""
+
msgid "Receive notifications about your own activity"
msgstr "Receber notificações sobre sua própria atividade"
@@ -27598,7 +27995,7 @@ msgid "Redirect to SAML provider to test configuration"
msgstr "Redirecionar para provedor SAML para testar configuração"
msgid "Redirecting"
-msgstr ""
+msgstr "Redirecionando"
msgid "Redis"
msgstr ""
@@ -27701,9 +28098,6 @@ msgstr ""
msgid "Registry setup"
msgstr ""
-msgid "Regulate approvals by authors/committers. Affects all projects."
-msgstr ""
-
msgid "Reindexing Status: %{status} (Slice multiplier: %{multiplier}, Maximum running slices: %{max_slices})"
msgstr ""
@@ -27711,7 +28105,7 @@ msgid "Rejected (closed)"
msgstr "Rejeitado (fechado)"
msgid "Related feature flags"
-msgstr ""
+msgstr "Feature flags relacionados"
msgid "Related issues"
msgstr "Issues relacionadas"
@@ -27799,11 +28193,14 @@ msgstr ""
msgid "Release|Something went wrong while saving the release details."
msgstr ""
+msgid "Reload page"
+msgstr ""
+
msgid "Remediations"
msgstr ""
msgid "Remember me"
-msgstr ""
+msgstr "Lembrar de mim"
msgid "Remind later"
msgstr "Lembrar mais tarde"
@@ -27857,7 +28254,7 @@ msgid "Remove child epic from an epic"
msgstr ""
msgid "Remove deploy key"
-msgstr ""
+msgstr "Remover chave de implantação"
msgid "Remove description history"
msgstr "Remover histórico de descrição"
@@ -27866,7 +28263,7 @@ msgid "Remove due date"
msgstr "Remover data limite"
msgid "Remove favicon"
-msgstr ""
+msgstr "Remover favicon"
msgid "Remove file"
msgstr "Remover arquivo"
@@ -27884,7 +28281,7 @@ msgid "Remove group"
msgstr "Remover grupo"
msgid "Remove header logo"
-msgstr ""
+msgstr "Remover logotipo de cabeçalho"
msgid "Remove iteration"
msgstr ""
@@ -27896,16 +28293,16 @@ msgid "Remove limit"
msgstr ""
msgid "Remove link"
-msgstr ""
+msgstr "Remover link"
msgid "Remove list"
msgstr ""
msgid "Remove log"
-msgstr ""
+msgstr "Remover registro"
msgid "Remove logo"
-msgstr ""
+msgstr "Remover logotipo"
msgid "Remove member"
msgstr ""
@@ -27929,7 +28326,7 @@ msgid "Remove runner"
msgstr ""
msgid "Remove secondary email"
-msgstr ""
+msgstr "Remover o e-mail secundário"
msgid "Remove spent time"
msgstr "Remover tempo gasto"
@@ -27950,7 +28347,7 @@ msgid "Remove user from project"
msgstr "Remover usuário do projeto"
msgid "Remove..."
-msgstr ""
+msgstr "Remover..."
msgid "Removed"
msgstr "Removido"
@@ -28081,17 +28478,20 @@ msgstr "%{quick_action_target} foi reaberto."
msgid "Reopens this %{quick_action_target}."
msgstr "Reabre este %{quick_action_target}."
+msgid "Repeats"
+msgstr ""
+
msgid "Replace"
msgstr "Substituir"
msgid "Replace %{name}"
-msgstr ""
+msgstr "Substituir %{name}"
msgid "Replace all label(s)"
msgstr ""
msgid "Replace file"
-msgstr ""
+msgstr "Substituir arquivo"
msgid "Replaced all labels with %{label_references} %{label_text}."
msgstr ""
@@ -28198,7 +28598,7 @@ msgid "Reports|Failure"
msgstr "Falha"
msgid "Reports|Filename"
-msgstr ""
+msgstr "Nome do arquivo"
msgid "Reports|Head report parsing error:"
msgstr ""
@@ -28443,10 +28843,7 @@ msgstr ""
msgid "Require additional authentication for administrative tasks."
msgstr ""
-msgid "Require all users in this group to setup Two-factor authentication"
-msgstr ""
-
-msgid "Require all users in this group to setup two-factor authentication"
+msgid "Require all users in this group to set up two-factor authentication"
msgstr ""
msgid "Required approvals (%{approvals_given} given)"
@@ -28492,6 +28889,9 @@ msgstr[1] "Requer mais %d aprovações."
msgid "Requires values to meet regular expression requirements."
msgstr ""
+msgid "Requires you to deploy or set up cloud-hosted Sentry."
+msgstr ""
+
msgid "Requires your primary GitLab email address."
msgstr ""
@@ -28535,7 +28935,7 @@ msgid "Reset link will be generated and sent to the user. %{break} User will be
msgstr ""
msgid "Reset password"
-msgstr ""
+msgstr "Redefinir senha"
msgid "Reset registration token"
msgstr "Redefinir token de registro"
@@ -28552,9 +28952,6 @@ msgstr "Redefinir a chave de autorização invalidará a chave anterior. As conf
msgid "Resolve"
msgstr ""
-msgid "Resolve all threads in new issue"
-msgstr "Resolver todas os tópicos em uma nova issue"
-
msgid "Resolve conflicts"
msgstr "Resolver conflitos"
@@ -28612,6 +29009,9 @@ msgstr "Métricas de resposta (NGINX)"
msgid "Response text"
msgstr ""
+msgid "Restart GitLab to apply changes."
+msgstr ""
+
msgid "Restart Terminal"
msgstr "Reiniciar terminal"
@@ -28630,6 +29030,9 @@ msgstr ""
msgid "Restoring the project will prevent the project from being removed on this date and restore people's ability to make changes to it."
msgstr ""
+msgid "Restrict group access by IP address. %{link_start}Learn more%{link_end}."
+msgstr ""
+
msgid "Restrict membership by email domain"
msgstr "Restringir a participação por domínio de e-mail"
@@ -28791,7 +29194,7 @@ msgid "Run CI/CD pipelines with Jenkins when you push to a repository, or when a
msgstr ""
msgid "Run CI/CD pipelines with Jenkins."
-msgstr ""
+msgstr "Execute pipelines de CI/CD com Jenkins."
msgid "Run housekeeping"
msgstr "Executar manutenção"
@@ -28908,7 +29311,7 @@ msgid "Runners|Name"
msgstr "Nome"
msgid "Runners|New registration token generated!"
-msgstr ""
+msgstr "Novo token de registro gerado!"
msgid "Runners|New runner, has not connected yet"
msgstr ""
@@ -28943,6 +29346,9 @@ msgstr "Executor"
msgid "Runners|Runner #%{runner_id}"
msgstr "Executor #%{runner_id}"
+msgid "Runners|Runner assigned to project."
+msgstr ""
+
msgid "Runners|Runner is offline, last contact was %{runner_contact} ago"
msgstr ""
@@ -28955,11 +29361,14 @@ msgstr ""
msgid "Runners|Runner registration"
msgstr "Registro de executor"
+msgid "Runners|Runner unassigned from project."
+msgstr ""
+
msgid "Runners|Runners"
msgstr "Executores"
msgid "Runners|Runners in this group: %{groupRunnersCount}"
-msgstr ""
+msgstr "Executores nesse grupo: %{groupRunnersCount}"
msgid "Runners|Shared runners are available to every project in a GitLab instance. If you want a runner to build only specific projects, restrict the project in the table below. After you restrict a runner to a project, you cannot change it back to a shared runner."
msgstr ""
@@ -29037,7 +29446,7 @@ msgid "Runners|group"
msgstr "grupo"
msgid "Runners|instance"
-msgstr ""
+msgstr "instância"
msgid "Runners|locked"
msgstr "bloqueado"
@@ -29112,7 +29521,7 @@ msgid "SSH key"
msgstr ""
msgid "SSH keys"
-msgstr ""
+msgstr "Chaves SSH"
msgid "SSH keys allow you to establish a secure connection between your computer and GitLab."
msgstr "Chaves SSH permitem que você estabeleça uma conexão segura entre seu computador e o GitLab."
@@ -29136,7 +29545,7 @@ msgid "SVG illustration"
msgstr ""
msgid "SastEntryPoints|Add Security Testing"
-msgstr ""
+msgstr "Adicionar teste de segurança"
msgid "SastEntryPoints|Catch your security vulnerabilities ahead of time!"
msgstr ""
@@ -29145,10 +29554,10 @@ msgid "SastEntryPoints|GitLab can scan your code for security vulnerabilities. S
msgstr ""
msgid "SastEntryPoints|How do I set up SAST?"
-msgstr ""
+msgstr "Como faço para configurar o SAST?"
-msgid "SastEntryPoints|Learn more."
-msgstr "Saiba mais."
+msgid "SastEntryPoints|Learn more"
+msgstr ""
msgid "Satisfied"
msgstr "Satisfeito"
@@ -29189,7 +29598,7 @@ msgstr "Salvar senha"
msgid "Save pipeline schedule"
msgstr "Salvar agendamento da pipeline"
-msgid "Save space and find images in the container Registry. remove unneeded tags and keep only the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
+msgid "Save storage space by automatically deleting tags from the container registry and keeping the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
msgstr ""
msgid "Saving"
@@ -29363,6 +29772,9 @@ msgstr "Pesquisar ou filtrar resultados..."
msgid "Search or filter results…"
msgstr "Pesquisar ou filtrar resultados…"
+msgid "Search or jump to..."
+msgstr ""
+
msgid "Search project"
msgstr "Procurar projeto"
@@ -29423,17 +29835,17 @@ msgstr ""
msgid "SearchCodeResults|of %{link_to_project}"
msgstr "de %{link_to_project}"
-msgid "SearchResults|Showing %{count} %{scope} for%{term_element}"
-msgstr "Mostrando %{count} %{scope} para%{term_element}"
+msgid "SearchResults|Showing %{count} %{scope} for %{term_element}"
+msgstr ""
-msgid "SearchResults|Showing %{count} %{scope} for%{term_element} in your personal and project snippets"
-msgstr "Mostrando %{count} %{scope} para%{term_element} para seus snippets pessoais e de projeto"
+msgid "SearchResults|Showing %{count} %{scope} for %{term_element} in your personal and project snippets"
+msgstr ""
-msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for%{term_element}"
-msgstr "Mostrando %{from} - %{to} de %{count} %{scope} para%{term_element}"
+msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for %{term_element}"
+msgstr ""
-msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for%{term_element} in your personal and project snippets"
-msgstr "Mostrando %{from} - %{to} de %{count} %{scope} para%{term_element} em seus trechos pessoais de snippets de projeto"
+msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for %{term_element} in your personal and project snippets"
+msgstr ""
msgid "SearchResults|code result"
msgid_plural "SearchResults|code results"
@@ -29514,6 +29926,9 @@ msgstr "Secreto"
msgid "Secret Detection"
msgstr "Detecção de secreto"
+msgid "Secret access key"
+msgstr ""
+
msgid "Secret token"
msgstr "Token secreto"
@@ -29553,9 +29968,6 @@ msgstr ""
msgid "SecurityApprovals|A merge request approval is required when the license compliance report contains a denied license."
msgstr ""
-msgid "SecurityApprovals|Configurable if security scanners are enabled. %{linkStart}Learn more.%{linkEnd}"
-msgstr ""
-
msgid "SecurityApprovals|Coverage-Check"
msgstr "Verificação de cobertura"
@@ -29568,24 +29980,18 @@ msgstr "Saiba mais sobre a verificação de licença"
msgid "SecurityApprovals|Learn more about Vulnerability-Check"
msgstr "Saiba mais sobre a verificação de vulnerabilidade"
-msgid "SecurityApprovals|License Scanning must be enabled. %{linkStart}Learn more%{linkEnd}."
-msgstr "A verificação de licença deve estar ativado. %{linkStart}Saiba mais%{linkEnd}."
-
msgid "SecurityApprovals|License-Check"
msgstr "Verificação de licença"
msgid "SecurityApprovals|Requires approval for Denied licenses. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}More information%{linkEnd}"
-msgstr "Requer aprovação para reduções de cobertura de teste. %{linkStart}Mais informações%{linkEnd}"
+msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
msgid "SecurityApprovals|Requires approval for vulnerabilities. %{linkStart}Learn more.%{linkEnd}"
msgstr "Requer aprovação para vulnerabilidades. %{linkStart}Saiba mais.%{linkEnd}"
-msgid "SecurityApprovals|Test coverage must be enabled. %{linkStart}Learn more%{linkEnd}."
-msgstr ""
-
msgid "SecurityApprovals|Vulnerability-Check"
msgstr "Verificação de vulnerabilidade"
@@ -29638,7 +30044,7 @@ msgid "SecurityConfiguration|Enable %{feature}"
msgstr "Ativar %{feature}"
msgid "SecurityConfiguration|Enable Auto DevOps"
-msgstr ""
+msgstr "Ativar Auto DevOps"
msgid "SecurityConfiguration|Enabled"
msgstr "Ativado"
@@ -29649,6 +30055,12 @@ msgstr ""
msgid "SecurityConfiguration|Immediately begin risk analysis and remediation with application security features. Start with SAST and Secret Detection, available to all plans. Upgrade to Ultimate to get all features, including:"
msgstr ""
+msgid "SecurityConfiguration|Manage corpus"
+msgstr ""
+
+msgid "SecurityConfiguration|Manage corpus files used as mutation sources in coverage fuzzing."
+msgstr ""
+
msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
msgstr "Gerenciar perfis para uso pelas verificações de DAST."
@@ -29703,6 +30115,12 @@ msgstr ""
msgid "SecurityOrchestration|Action"
msgstr "Ação"
+msgid "SecurityOrchestration|Actions"
+msgstr ""
+
+msgid "SecurityOrchestration|Add rule"
+msgstr ""
+
msgid "SecurityOrchestration|All policies"
msgstr "Todas as políticas"
@@ -29725,7 +30143,7 @@ msgid "SecurityOrchestration|Enforcement Status"
msgstr ""
msgid "SecurityOrchestration|Executes a %{scanType} scan"
-msgstr ""
+msgstr "Executa uma verificação %{scanType}"
msgid "SecurityOrchestration|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
msgstr ""
@@ -29736,9 +30154,6 @@ msgstr "Última verificação"
msgid "SecurityOrchestration|Network"
msgstr "Rede"
-msgid "SecurityOrchestration|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
-msgstr ""
-
msgid "SecurityOrchestration|New policy"
msgstr "Nova política"
@@ -29754,6 +30169,9 @@ msgstr "Descrição da política"
msgid "SecurityOrchestration|Policy editor"
msgstr "Editor de política"
+msgid "SecurityOrchestration|Policy preview"
+msgstr ""
+
msgid "SecurityOrchestration|Policy status"
msgstr "Status da política"
@@ -29763,6 +30181,9 @@ msgstr "Tipo de política"
msgid "SecurityOrchestration|Rule"
msgstr "Regra"
+msgid "SecurityOrchestration|Rules"
+msgstr ""
+
msgid "SecurityOrchestration|Scan Execution"
msgstr ""
@@ -29806,10 +30227,10 @@ msgid "SecurityOrhestration|No rules defined - policy will not run."
msgstr ""
msgid "SecurityPolicies|+%{count} more"
-msgstr ""
+msgstr "+%{count} mais"
msgid "SecurityPolicies|Environment(s)"
-msgstr ""
+msgstr "Ambiente(s)"
msgid "SecurityPolicies|Policy type"
msgstr "Tipo de política"
@@ -29856,6 +30277,9 @@ msgstr "Criar uma Jira do Jira"
msgid "SecurityReports|Create issue"
msgstr "Criar issue"
+msgid "SecurityReports|Development vulnerabilities"
+msgstr ""
+
msgid "SecurityReports|Dismiss vulnerability"
msgstr "Dispensar vulnerabilidade"
@@ -29871,6 +30295,9 @@ msgstr "Baixar %{artifactName}"
msgid "SecurityReports|Download results"
msgstr "Baixar os resultados"
+msgid "SecurityReports|Download scanned URLs"
+msgstr ""
+
msgid "SecurityReports|Download scanned resources"
msgstr ""
@@ -29887,7 +30314,7 @@ msgid "SecurityReports|Error fetching the vulnerability list. Please check your
msgstr ""
msgid "SecurityReports|Error parsing security reports"
-msgstr ""
+msgstr "Erro ao analisar relatórios de segurança"
msgid "SecurityReports|Failed to get security report information. Please reload the page or try again later."
msgstr ""
@@ -29994,6 +30421,9 @@ msgstr "Status"
msgid "SecurityReports|Take survey"
msgstr "Responder pesquisa"
+msgid "SecurityReports|The Vulnerability Report shows the results of the lastest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "SecurityReports|The security reports below contain one or more vulnerability findings that could not be parsed and were not recorded. Download the artifacts in the job output to investigate. Ensure any security report created conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
msgstr ""
@@ -30135,12 +30565,12 @@ msgstr "Selecione um motivo"
msgid "Select a repository"
msgstr "Selecione um repositório"
+msgid "Select a repository containing templates for common files."
+msgstr ""
+
msgid "Select a role"
msgstr "Selecione um cargo"
-msgid "Select a shared template repository for all projects on this instance."
-msgstr ""
-
msgid "Select a template repository"
msgstr "Selecione um repositório de modelos"
@@ -30216,6 +30646,9 @@ msgstr "Selecione projeto e zona para escolher o tipo de máquina"
msgid "Select project to choose zone"
msgstr "Selecione o projeto para escolher a zona"
+msgid "Select project to create issue"
+msgstr ""
+
msgid "Select projects"
msgstr "Selecionar projetos"
@@ -30274,7 +30707,7 @@ msgid "Selective synchronization"
msgstr ""
msgid "Self monitoring"
-msgstr ""
+msgstr "Automonitoramento"
msgid "Self monitoring project does not exist"
msgstr ""
@@ -30313,7 +30746,7 @@ msgid "SelfMonitoring|Self monitoring project successfully deleted."
msgstr ""
msgid "Send"
-msgstr ""
+msgstr "Enviar"
msgid "Send a single email notification to Owners and Maintainers for new alerts."
msgstr ""
@@ -30333,17 +30766,20 @@ msgstr "Enviar notificação por e-mail"
msgid "Send emails to help guide new users through the onboarding process."
msgstr ""
+msgid "Send emails to users upon account deactivation."
+msgstr ""
+
msgid "Send message"
msgstr ""
msgid "Send notifications about project events to Mattermost channels."
-msgstr ""
+msgstr "Envie notificações sobre eventos de projeto para os canais do Mattermost."
msgid "Send notifications about project events to Mattermost channels. %{docs_link}"
-msgstr ""
+msgstr "Envie notificações sobre eventos de projeto para os canais do Mattermost. %{docs_link}"
msgid "Send notifications about project events to a Discord channel. %{docs_link}"
-msgstr ""
+msgstr "Envie notificações sobre eventos de projeto para um canal Discord. %{docs_link}"
msgid "Send report"
msgstr "Enviar relatório"
@@ -30351,6 +30787,9 @@ msgstr "Enviar relatório"
msgid "Send service data"
msgstr ""
+msgid "Sentry"
+msgstr ""
+
msgid "Sentry API URL"
msgstr "URL da API do Sentry"
@@ -30388,10 +30827,10 @@ msgid "Serverless domain"
msgstr ""
msgid "Serverless platform"
-msgstr ""
+msgstr "Plataforma sem servidor"
msgid "ServerlessDetails|Configure cluster."
-msgstr ""
+msgstr "Configurar cluster."
msgid "ServerlessDetails|Function invocation metrics require the Prometheus cluster integration."
msgstr ""
@@ -30465,6 +30904,9 @@ msgstr "Seu repositório não possui um arquivo %{startTag}serverless.yml%{endTa
msgid "Service"
msgstr "Serviço"
+msgid "Service Accounts keys are required to authorize GitLab to deploy your Google Cloud project."
+msgstr ""
+
msgid "Service Desk"
msgstr "Central de serviços"
@@ -30537,15 +30979,15 @@ msgstr "Defina um modelo de descrição padrão para ser usado para as novas iss
msgid "Set a password on your account to pull or push via %{protocol}."
msgstr "Defina uma senha para sua conta para aceitar ou entregar código via %{protocol}."
-msgid "Set a template repository for projects in this group"
-msgstr "Definir um repositório de modelos para projetos neste grupo"
-
msgid "Set access permissions for this token."
msgstr ""
msgid "Set an instance-wide domain that will be available to all clusters when installing Knative."
msgstr ""
+msgid "Set any rate limit to %{code_open}0%{code_close} to disable the limit."
+msgstr ""
+
msgid "Set default and restrict visibility levels. Configure import sources and git access protocol."
msgstr "Definir padrão e restringir os níveis de visibilidade. Configurar fontes de importação e protocolo de acesso git."
@@ -30558,8 +31000,8 @@ msgstr ""
msgid "Set limit to 0 to allow any file size."
msgstr ""
-msgid "Set max session time for web terminal."
-msgstr "Defina o tempo máximo da sessão para o terminal da web."
+msgid "Set limits for web and API requests."
+msgstr ""
msgid "Set milestone"
msgstr "Definir marco"
@@ -30567,15 +31009,18 @@ msgstr "Definir marco"
msgid "Set new password"
msgstr "Definir nova senha"
-msgid "Set notification email for abuse reports."
-msgstr "Definir notificação por e-mail para relatórios de abuso."
-
msgid "Set parent epic to an epic"
msgstr ""
+msgid "Set per-user rate limits for imports and exports of projects and groups."
+msgstr ""
+
msgid "Set projects and maximum size limits, session duration, user options, and check feature availability for namespace plan."
msgstr ""
+msgid "Set rate limits for package registry API requests that supersede the general user and IP rate limits."
+msgstr ""
+
msgid "Set severity"
msgstr "Definir severidade"
@@ -30594,15 +31039,24 @@ msgstr "Definir ramificação de destino à %{branch_name}."
msgid "Set the default branch for this project. All merge requests and commits are made against this branch unless you specify a different one."
msgstr "Defina a ramificação padrão para este projeto. Todas as merge requests e commits são feitos nessa ramificação, a menos que você especifique um diferente."
+msgid "Set the default expiration time for job artifacts in all projects. Set to %{code_open}0%{code_close} to never expire artifacts by default. If no unit is written, it defaults to seconds. For example, these are all equivalent: %{code_open}3600%{code_close}, %{code_open}60 minutes%{code_close}, or %{code_open}one hour%{code_close}."
+msgstr ""
+
msgid "Set the due date to %{due_date}."
msgstr "Definir a data limite para %{due_date}."
msgid "Set the iteration to %{iteration_reference}."
msgstr "Define a interação como %{iteration_reference}."
+msgid "Set the maximum session time for a web terminal."
+msgstr ""
+
msgid "Set the milestone to %{milestone_reference}."
msgstr "Definir o marco como %{milestone_reference}."
+msgid "Set the per-user rate limit for notes created by web or API requests."
+msgstr ""
+
msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
msgstr ""
@@ -30721,7 +31175,7 @@ msgid "Sets weight to %{weight}."
msgstr "Definir o peso para %{weight}."
msgid "Setting"
-msgstr ""
+msgstr "Configuração"
msgid "Setting enforced"
msgstr ""
@@ -30804,6 +31258,9 @@ msgstr "Mostrar ID do pipeline"
msgid "Show Pipeline IID"
msgstr "Mostrar IID do pipeline"
+msgid "Show all %{issuable_type}."
+msgstr ""
+
msgid "Show all activity"
msgstr "Mostrar todas as atividades"
@@ -30855,15 +31312,9 @@ msgstr "Mostrar a versão mais recente"
msgid "Show list"
msgstr ""
-msgid "Show me advanced features"
-msgstr ""
-
msgid "Show me how to add a pipeline"
msgstr ""
-msgid "Show me the basics"
-msgstr ""
-
msgid "Show one file at a time"
msgstr ""
@@ -30904,15 +31355,15 @@ msgstr "Mostrando %{limit} de %{total_count} issues. "
msgid "Showing %{pageSize} of %{total} %{issuableType}"
msgstr "Mostrando %{pageSize} de %{total} %{issuableType}"
-msgid "Showing %{pageSize} of %{total} issues"
-msgstr "Mostrando %{pageSize} de %{total} issues"
-
msgid "Showing all epics"
msgstr "Mostrando todos os épicos"
msgid "Showing all issues"
msgstr "Mostrando todas as issues"
+msgid "Showing data for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
+msgstr ""
+
msgid "Showing data for workflow items created in this date range. Date range cannot exceed %{maxDateRange} days."
msgstr ""
@@ -30952,6 +31403,15 @@ msgstr "Apenas caracteres numéricos permitidos"
msgid "Sidebar|Weight"
msgstr "Peso"
+msgid "Sidekiq job compression threshold (bytes)"
+msgstr ""
+
+msgid "Sidekiq job size limit (bytes)"
+msgstr ""
+
+msgid "Sidekiq job size limits"
+msgstr ""
+
msgid "Sign in"
msgstr "Entrar"
@@ -30968,7 +31428,7 @@ msgid "Sign in to \"%{group_name}\""
msgstr "Entrar em \"%{group_name}\""
msgid "Sign in to GitLab"
-msgstr ""
+msgstr "Entrar no Gitlab"
msgid "Sign in using smart card"
msgstr "Entrar usando o cartão inteligente"
@@ -31001,22 +31461,22 @@ msgid "Sign up was successful! Please confirm your email to sign in."
msgstr "O registro foi bem sucedido! Confirme seu e-mail para fazer entrar."
msgid "Sign-in and Help page"
-msgstr ""
+msgstr "Página de entrada e ajuda"
msgid "Sign-in count:"
msgstr ""
msgid "Sign-in page"
-msgstr ""
+msgstr "Página de entrada"
msgid "Sign-in restrictions"
msgstr "Restrições de entrada"
msgid "Sign-in text"
-msgstr ""
+msgstr "Texto da entrada"
msgid "Sign-out page URL"
-msgstr ""
+msgstr "URL da página de saída"
msgid "Sign-up restrictions"
msgstr "Restrições de cadastro"
@@ -31046,7 +31506,7 @@ msgid "Signed in"
msgstr "Conectado"
msgid "Signed in to GitLab as %{user_link}"
-msgstr ""
+msgstr "Conectado ao GitLab como %{user_link}"
msgid "Signed in with %{authentication} authentication"
msgstr "Conectado com a autenticação de %{authentication}"
@@ -31072,6 +31532,9 @@ msgstr ""
msgid "Site profile not found for given parameters"
msgstr ""
+msgid "Sites"
+msgstr ""
+
msgid "Size"
msgstr "Tamanho"
@@ -31088,10 +31551,10 @@ msgid "Skipped"
msgstr "Ignorado"
msgid "Skipped deployment to"
-msgstr ""
+msgstr "Implementação ignorada para"
msgid "Skype:"
-msgstr ""
+msgstr "Skype:"
msgid "Slack application"
msgstr "Aplicativo Slack"
@@ -31100,22 +31563,25 @@ msgid "Slack integration allows you to interact with GitLab via slash commands i
msgstr "A integração com o Slack permite que você interaja com o GitLab por meio de comandos de barra em uma janela de bate-papo."
msgid "SlackIntegration|Sends notifications about project events to Slack channels."
+msgstr "Envia notificações sobre eventos do projeto para os canais do Slack."
+
+msgid "SlackService|1. %{slash_command_link_start}Add a slash command%{slash_command_link_end} in your Slack team using this information:"
msgstr ""
-msgid "SlackService|2. Paste the %{strong_open}Token%{strong_close} into the field below"
+msgid "SlackService|2. Paste the token from Slack in the %{strong_open}Token%{strong_close} field below."
msgstr ""
-msgid "SlackService|3. Select the %{strong_open}Active%{strong_close} checkbox, press %{strong_open}Save changes%{strong_close} and start using GitLab inside Slack!"
+msgid "SlackService|3. Select the %{strong_open}Active%{strong_close} checkbox, select %{strong_open}Save changes%{strong_close}, and start using slash commands in Slack!"
msgstr ""
-msgid "SlackService|Fill in the word that works best for your team."
+msgid "SlackService|After setup, get a list of available Slack slash commands by entering"
msgstr ""
-msgid "SlackService|See list of available commands in Slack after setting up this service, by entering"
-msgstr "Veja a lista de comandos disponíveis no Slack após configurar este serviço, digitando"
+msgid "SlackService|Fill in the word that works best for your team."
+msgstr ""
-msgid "SlackService|This service allows users to perform common operations on this project by entering slash commands in Slack."
-msgstr "Este serviço permite aos usuários executar operações comuns neste projeto, digitando comandos de barra no Slack."
+msgid "SlackService|Perform common operations in this project by entering slash commands in Slack."
+msgstr ""
msgid "Slice multiplier"
msgstr ""
@@ -31172,7 +31638,7 @@ msgid "Snowplow"
msgstr "Snowplow"
msgid "Solution"
-msgstr ""
+msgstr "Solução"
msgid "Some changes are not shown"
msgstr ""
@@ -31180,7 +31646,7 @@ msgstr ""
msgid "Some child epics may be hidden due to applied filters"
msgstr ""
-msgid "Some common domains are not allowed. %{read_more_link}."
+msgid "Some common domains are not allowed. %{learn_more_link}."
msgstr ""
msgid "Some of the designs you tried uploading did not change:"
@@ -31202,7 +31668,7 @@ msgid "Someone, hopefully you, has requested to reset the password for your GitL
msgstr ""
msgid "Something went wrong"
-msgstr ""
+msgstr "Alguma coisa deu errado"
msgid "Something went wrong on our end"
msgstr "Algo deu errado do nosso lado"
@@ -31264,9 +31730,6 @@ msgstr ""
msgid "Something went wrong while exporting requirements"
msgstr ""
-msgid "Something went wrong while fetching %{listType} list"
-msgstr "Algo deu errado ao recuperar a lista de %{listType}"
-
msgid "Something went wrong while fetching branches"
msgstr ""
@@ -31321,15 +31784,9 @@ msgstr ""
msgid "Something went wrong while merging this merge request. Please try again."
msgstr ""
-msgid "Something went wrong while moving issues."
-msgstr ""
-
msgid "Something went wrong while obtaining the Let's Encrypt certificate."
msgstr ""
-msgid "Something went wrong while performing the action."
-msgstr ""
-
msgid "Something went wrong while promoting the issue to an epic. Please try again."
msgstr ""
@@ -31484,7 +31941,7 @@ msgid "SortOptions|Merged date"
msgstr "Data de merge realizado"
msgid "SortOptions|Merged earlier"
-msgstr ""
+msgstr "Mesclado anteriormente"
msgid "SortOptions|Merged recently"
msgstr "Merge realizado recentemente"
@@ -31657,7 +32114,10 @@ msgstr "Usa %{linkStart}Sourcegraph.com%{linkEnd}."
msgid "SourcegraphPreferences|Uses a custom %{linkStart}Sourcegraph instance%{linkEnd}."
msgstr ""
-msgid "Spam Check API Key"
+msgid "Spam Check"
+msgstr ""
+
+msgid "Spam Check API key"
msgstr ""
msgid "Spam Logs"
@@ -31675,8 +32135,8 @@ msgstr "Executores específicos"
msgid "Specified URL cannot be used: \"%{reason}\""
msgstr ""
-msgid "Specify an e-mail address regex pattern to identify default internal users."
-msgstr "Especifique um padrão regex de endereço de e-mail para identificar usuários internos padrão."
+msgid "Specify an email address regex pattern to identify default internal users."
+msgstr ""
msgid "Speed up your pipelines with Needs relationships"
msgstr ""
@@ -31832,7 +32292,7 @@ msgid "State your message to activate"
msgstr "Regitre sua mensagem para ativar"
msgid "Static Application Security Testing (SAST)"
-msgstr ""
+msgstr "Teste de segurança de aplicativo estático (SAST)"
msgid "StaticSiteEditor|1. Add a clear title to describe the change."
msgstr ""
@@ -31930,7 +32390,7 @@ msgstr ""
msgid "StatusCheck|An error occurred fetching the status checks."
msgstr ""
-msgid "StatusCheck|Apply this status check to any branch or a specific protected branch."
+msgid "StatusCheck|Apply this status check to all branches or a specific protected branch."
msgstr ""
msgid "StatusCheck|Check for a status response in Merge Requests. Failures do not block merges. %{link_start}Learn more%{link_end}."
@@ -31949,10 +32409,10 @@ msgid "StatusCheck|Invoke an external API as part of the pipeline process."
msgstr ""
msgid "StatusCheck|No status checks are defined yet."
-msgstr ""
+msgstr "Nenhuma verificação de status foi definida ainda."
msgid "StatusCheck|Remove status check"
-msgstr ""
+msgstr "Remover verificação de status"
msgid "StatusCheck|Remove status check?"
msgstr ""
@@ -32063,7 +32523,7 @@ msgid "Strikethrough"
msgstr ""
msgid "Subgroup information"
-msgstr ""
+msgstr "Informação do subgrupo"
msgid "Subgroup milestone"
msgstr ""
@@ -32099,7 +32559,7 @@ msgid "Submit"
msgstr ""
msgid "Submit a review"
-msgstr ""
+msgstr "Enviar uma revisão"
msgid "Submit as ham"
msgstr ""
@@ -32123,7 +32583,7 @@ msgid "Submit search"
msgstr "Buscar"
msgid "Submit the current review."
-msgstr ""
+msgstr "Enviar a revisão atual."
msgid "Submit your changes"
msgstr "Enviar suas alterações"
@@ -32183,7 +32643,7 @@ msgid "SubscriptionTable|Add seats"
msgstr "Adicionar lugares"
msgid "SubscriptionTable|An error occurred while loading the subscription details."
-msgstr ""
+msgstr "Um erro ocorreu ao carregar os detalhes da inscrição."
msgid "SubscriptionTable|Billing"
msgstr "Cobrança"
@@ -32213,7 +32673,7 @@ msgid "SubscriptionTable|Refresh Seats"
msgstr "Atualizar lugares"
msgid "SubscriptionTable|Renew"
-msgstr ""
+msgstr "Renovar"
msgid "SubscriptionTable|Seats currently in use"
msgstr "Lugares em uso"
@@ -32222,13 +32682,13 @@ msgid "SubscriptionTable|Seats in subscription"
msgstr "Lugares da assinatura"
msgid "SubscriptionTable|Seats owed"
-msgstr ""
+msgstr "Lugares devidos"
msgid "SubscriptionTable|See usage"
-msgstr ""
+msgstr "Ver uso"
msgid "SubscriptionTable|Something went wrong trying to refresh seats"
-msgstr ""
+msgstr "Algo deu errado ao tentar atualizar as licenças"
msgid "SubscriptionTable|Subscription end date"
msgstr "Data final da assinatura"
@@ -32269,6 +32729,9 @@ msgstr "A contagem de uso é realizada uma vez por dia às 12:00 PM."
msgid "Subscriptions"
msgstr ""
+msgid "Subscription|Your subscription for %{strong}%{namespace_name}%{strong_close} has expired and you are now on %{pricing_link_start}the GitLab Free tier%{pricing_link_end}. Don't worry, your data is safe. Get in touch with our support team (%{support_email}). They'll gladly help with your subscription renewal."
+msgstr ""
+
msgid "Subtracted"
msgstr "Subtraído"
@@ -32315,7 +32778,7 @@ msgid "Successfully synced %{synced_timeago}."
msgstr ""
msgid "Successfully unbanned"
-msgstr ""
+msgstr "Desbanido com sucesso"
msgid "Successfully unblocked"
msgstr "Desbloqueado com sucesso"
@@ -32420,7 +32883,7 @@ msgid "Summary"
msgstr "Resumo"
msgid "Summary / Note"
-msgstr ""
+msgstr "Resumo / Nota"
msgid "Sunday"
msgstr "Domingo"
@@ -32438,7 +32901,7 @@ msgid "SuperSonics|Activated on"
msgstr ""
msgid "SuperSonics|Activation code"
-msgstr ""
+msgstr "Código de ativação"
msgid "SuperSonics|An error occurred while activating your subscription."
msgstr ""
@@ -32447,7 +32910,7 @@ msgid "SuperSonics|Billable users"
msgstr ""
msgid "SuperSonics|Buy subscription"
-msgstr ""
+msgstr "Comprar assinatura"
msgid "SuperSonics|Cloud license"
msgstr ""
@@ -32459,13 +32922,13 @@ msgid "SuperSonics|Cloud licensing is now available. It's an easier way to activ
msgstr ""
msgid "SuperSonics|Expires on"
-msgstr ""
+msgstr "Expira em"
msgid "SuperSonics|Export license usage file"
msgstr ""
msgid "SuperSonics|Free trial"
-msgstr ""
+msgstr "Avaliação grátis"
msgid "SuperSonics|Get help for the most common connectivity issues by %{linkStart}troubleshooting the activation code%{linkEnd}."
msgstr ""
@@ -32474,10 +32937,10 @@ msgid "SuperSonics|I agree that my use of the GitLab Software is subject to the
msgstr ""
msgid "SuperSonics|ID"
-msgstr ""
+msgstr "ID"
msgid "SuperSonics|Last Sync"
-msgstr ""
+msgstr "Última sincronização"
msgid "SuperSonics|Learn how to %{linkStart}activate your subscription%{linkEnd}."
msgstr ""
@@ -32486,7 +32949,7 @@ msgid "SuperSonics|Licensed to"
msgstr ""
msgid "SuperSonics|Manage"
-msgstr ""
+msgstr "Gerenciar"
msgid "SuperSonics|Maximum users"
msgstr ""
@@ -32495,6 +32958,9 @@ msgid "SuperSonics|Paste your activation code"
msgstr ""
msgid "SuperSonics|Plan"
+msgstr "Plan"
+
+msgid "SuperSonics|Please agree to the Subscription Agreement"
msgstr ""
msgid "SuperSonics|Ready to get started? A GitLab plan is ideal for scaling organizations and for multi team usage."
@@ -32507,16 +32973,16 @@ msgid "SuperSonics|Seats"
msgstr ""
msgid "SuperSonics|Start free trial"
-msgstr ""
+msgstr "Iniciar a avaliação gratuita"
msgid "SuperSonics|Started"
msgstr ""
msgid "SuperSonics|Subscription"
-msgstr ""
+msgstr "Assinatura"
msgid "SuperSonics|Subscription details"
-msgstr ""
+msgstr "Detalhes da assinatura"
msgid "SuperSonics|Sync subscription details"
msgstr ""
@@ -32527,6 +32993,9 @@ msgstr ""
msgid "SuperSonics|The activation code is not valid. Please make sure to copy it exactly from the Customers Portal or confirmation email. Learn more about %{linkStart}activating your subscription%{linkEnd}."
msgstr ""
+msgid "SuperSonics|The activation code should be a 24-character alphanumeric string"
+msgstr ""
+
msgid "SuperSonics|There is a connectivity issue."
msgstr ""
@@ -32540,10 +33009,10 @@ msgid "SuperSonics|To activate your subscription, connect to GitLab servers thro
msgstr ""
msgid "SuperSonics|Type"
-msgstr "Tipo"
+msgstr "Type"
msgid "SuperSonics|Upload a license file"
-msgstr ""
+msgstr "Enviar um arquivo de licença"
msgid "SuperSonics|Users in subscription"
msgstr ""
@@ -32569,12 +33038,18 @@ msgstr ""
msgid "SuperSonics|You do not have an active subscription"
msgstr "Você não tem uma assinatura ativa"
+msgid "SuperSonics|You have successfully added a license that activates on %{date}. Please see the subscription history table below for more details."
+msgstr ""
+
msgid "SuperSonics|You'll be charged for %{trueUpLinkStart}users over license%{trueUpLinkEnd} on a quarterly or annual basis, depending on the terms of your agreement."
msgstr ""
-msgid "SuperSonics|Your subscription"
+msgid "SuperSonics|Your future dated license was successfully added"
msgstr ""
+msgid "SuperSonics|Your subscription"
+msgstr "Sua assinatura"
+
msgid "SuperSonics|Your subscription details will sync shortly."
msgstr ""
@@ -32609,7 +33084,7 @@ msgid "Symbolic link"
msgstr ""
msgid "Sync LDAP"
-msgstr ""
+msgstr "Sincronizar LDAP"
msgid "Sync now"
msgstr ""
@@ -32621,7 +33096,7 @@ msgid "Synchronization settings"
msgstr ""
msgid "Synchronize LDAP"
-msgstr ""
+msgstr "Sincronizar LDAP"
msgid "Syncing…"
msgstr ""
@@ -32822,9 +33297,9 @@ msgid "Template"
msgstr "Modelo"
msgid "Template to append to all Service Desk issues"
-msgstr ""
+msgstr "Modelo para anexar a todos as issues da central de serviços"
-msgid "TemplateRepository|Select a repository to make its templates available to all projects. %{link_start}What should the repository contain?%{link_end} "
+msgid "TemplateRepository|Create common files more quickly, and standardize their format."
msgstr ""
msgid "Templates"
@@ -33030,7 +33505,7 @@ msgstr "Novo caso de teste"
msgid "TestCases|Search test cases"
msgstr "Pesquisar caso de teste"
-msgid "TestCases|Something went wrong while adding test case to Todo."
+msgid "TestCases|Something went wrong while adding test case to a to-do item."
msgstr ""
msgid "TestCases|Something went wrong while creating a test case."
@@ -33042,7 +33517,7 @@ msgstr ""
msgid "TestCases|Something went wrong while fetching test cases list."
msgstr ""
-msgid "TestCases|Something went wrong while marking test case todo as done."
+msgid "TestCases|Something went wrong while marking test case to-do item as done."
msgstr ""
msgid "TestCases|Something went wrong while moving test case."
@@ -33097,7 +33572,7 @@ msgid "TestReports|%{rate}%{sign} success rate"
msgstr "%{rate}%{sign} taxa de sucesso"
msgid "TestReports|Attachment"
-msgstr ""
+msgstr "Anexo"
msgid "TestReports|Jobs"
msgstr "Tarefas"
@@ -33142,7 +33617,7 @@ msgid "Text added to the body of all email messages. %{character_limit} characte
msgstr ""
msgid "Text style"
-msgstr ""
+msgstr "Estilo do texto"
msgid "Thank you for your business."
msgstr ""
@@ -33162,7 +33637,7 @@ msgstr ""
msgid "Thanks for your purchase!"
msgstr ""
-msgid "That is ok, I do not want to renew"
+msgid "That's OK, I don't want to renew"
msgstr ""
msgid "That's it, well done!"
@@ -33185,7 +33660,7 @@ msgid_plural "The %{type} contains the following errors:"
msgstr[0] "O %{type} contém o seguinte erro:"
msgstr[1] "O %{type} contém os seguintes erros:"
-msgid "The API key used by GitLab for accessing the Spam Check service endpoint"
+msgid "The API key used by GitLab for accessing the Spam Check service endpoint."
msgstr ""
msgid "The GitLab subscription service (customers.gitlab.com) is currently experiencing an outage. You can monitor the status and get updates at %{linkStart}status.gitlab.com%{linkEnd}."
@@ -33224,9 +33699,6 @@ msgstr ""
msgid "The URL to use for connecting to Elasticsearch. Use a comma-separated list to support clustering (e.g., \"http://localhost:9200, http://localhost:9201\")."
msgstr ""
-msgid "The Vulnerability Report shows the results of the last successful pipeline run on the default branch."
-msgstr ""
-
msgid "The X509 Certificate to use when mutual TLS is required to communicate with the external authorization service. If left blank, the server certificate is still validated when accessing over HTTPS."
msgstr "O Certificado X509 a ser usado quando o TLS mútuo é necessário para se comunicar com o serviço de autorização externa. Se deixado em branco, o certificado do servidor ainda será validado ao acessar por HTTPS."
@@ -33284,9 +33756,6 @@ msgstr ""
msgid "The default branch for this project has been changed. Please update your bookmarks."
msgstr ""
-msgid "The default expiration time for job artifacts. 0 for unlimited. The default unit is in seconds, but you can use other units, for example %{code_open}4 mins 2 sec%{code_close}, %{code_open}2h42min%{code_close}."
-msgstr ""
-
msgid "The dependency list details information about the components used within your project."
msgstr "A lista de dependências detalha informações sobre os componentes usados em seu projeto."
@@ -33478,9 +33947,6 @@ msgstr "Os conflitos de mesclagem para esta solicitação de mesclagem já foram
msgid "The merge conflicts for this merge request have already been resolved. Please return to the merge request."
msgstr "Os conflitos de mesclagem para esta solicitação de mesclagem já foram resolvidos. Por favor, retorne para a solicitação de mesclagem."
-msgid "The merge request can now be merged."
-msgstr ""
-
msgid "The metric must be one of %{metrics}."
msgstr ""
@@ -33755,7 +34221,7 @@ msgid "There are no projects shared with this group yet"
msgstr "Não há projetos compartilhados com esse grupo ainda"
msgid "There are no variables yet."
-msgstr ""
+msgstr "Ainda não existem variáveis."
msgid "There are pending advanced search migrations which require indexing to be paused. Indexing must remain paused until the migrations are completed."
msgstr ""
@@ -33764,13 +34230,13 @@ msgid "There are running deployments on the environment. Please retry later."
msgstr ""
msgid "There are several file size limits in place for the Package Registry."
-msgstr ""
+msgstr "Existem vários limites de tamanho de arquivo para o registro de pacotes."
msgid "There are several rate limits in place to protect the system."
msgstr ""
msgid "There are several size limits in place."
-msgstr ""
+msgstr "Existem vários limites de tamanho em vigor."
msgid "There is a halted Elasticsearch migration"
msgstr ""
@@ -33818,7 +34284,7 @@ msgid "There was a problem fetching labels."
msgstr ""
msgid "There was a problem fetching linked pipelines."
-msgstr ""
+msgstr "Ocorreu um problema ao buscar pipelines vinculados."
msgid "There was a problem fetching milestones."
msgstr ""
@@ -33856,8 +34322,8 @@ msgstr "Houve um problema ao enviar o e-mail de confirmação"
msgid "There was a problem updating the keep latest artifacts setting."
msgstr ""
-msgid "There was an error %{message} todo."
-msgstr "Houve um erro %{message} na tarefa pendente."
+msgid "There was an error %{message} to-do item."
+msgstr ""
msgid "There was an error adding a To Do."
msgstr ""
@@ -33895,6 +34361,9 @@ msgstr ""
msgid "There was an error fetching projects"
msgstr ""
+msgid "There was an error fetching search autocomplete suggestions"
+msgstr ""
+
msgid "There was an error fetching stage total counts"
msgstr ""
@@ -34016,7 +34485,7 @@ msgid "These dates affect how your epics appear in the roadmap. Set a fixed date
msgstr ""
msgid "These examples show how to trigger this project's pipeline for a branch or tag."
-msgstr ""
+msgstr "Esses exemplos mostram como acionar o pipeline deste projeto para uma ramificação ou tag."
msgid "These existing issues have a similar title. It might be better to comment there instead of creating another similar issue."
msgstr ""
@@ -34091,10 +34560,10 @@ msgid "This action has been performed too many times. Try again later."
msgstr ""
msgid "This action will %{strongOpen}permanently delete%{strongClose} %{codeOpen}%{project}%{codeClose} %{strongOpen}immediately%{strongClose}, including its repositories and all related resources, including issues and merge requests."
-msgstr ""
+msgstr "Essa ação %{strongOpen}excluirá permanentemente%{strongClose} %{codeOpen}%{project}%{codeClose} %{strongOpen}imediatamente%{strongClose}, incluindo seus repositórios e todos os recursos relacionados, incluindo problemas e solicitações de mesclagem."
msgid "This action will %{strongOpen}permanently delete%{strongClose} %{codeOpen}%{project}%{codeClose} %{strongOpen}on %{date}%{strongClose}, including its repositories and all related resources, including issues and merge requests."
-msgstr ""
+msgstr "Essa ação %{strongOpen}excluirá permanentemente%{strongClose} %{codeOpen}%{project}%{codeClose} %{strongOpen}na data %{date}%{strongClose}, incluindo seus repositórios e todos os recursos relacionados, incluindo problemas e solicitações de mesclagem."
msgid "This action will %{strongOpen}permanently remove%{strongClose} %{codeOpen}%{group}%{codeClose} %{strongOpen}immediately%{strongClose}."
msgstr ""
@@ -34219,6 +34688,9 @@ msgstr "Este campo é obrigatório"
msgid "This field is required."
msgstr "Este campo é obrigatório."
+msgid "This form is disabled in preview"
+msgstr ""
+
msgid "This group"
msgstr "Esse grupo"
@@ -34240,9 +34712,6 @@ msgstr ""
msgid "This group is linked to a subscription"
msgstr ""
-msgid "This group, including all subgroups, projects and git repositories, will be reachable from only the specified IP address ranges."
-msgstr ""
-
msgid "This group, its subgroups and projects has been scheduled for removal on %{date}."
msgstr ""
@@ -34292,7 +34761,7 @@ msgid "This issue is currently blocked by the following issues:"
msgstr "Essa issue está atualmente bloqueada pelas seguintes issues:"
msgid "This issue is hidden because its author has been banned"
-msgstr ""
+msgstr "Essa issue está oculta porque seu autor foi banido"
msgid "This issue is in a child epic of the filtered epic"
msgstr ""
@@ -34481,7 +34950,7 @@ msgid "This project path either does not exist or you do not have access."
msgstr ""
msgid "This project will be deleted on %{date}"
-msgstr ""
+msgstr "Este projeto será excluído em %{date}"
msgid "This project will be deleted on %{date} since its parent group '%{parent_group_name}' has been scheduled for deletion."
msgstr ""
@@ -34522,9 +34991,6 @@ msgstr ""
msgid "This user cannot be unlocked manually from GitLab"
msgstr "Este usuário não pode ser desbloqueado manualmente a partir do GitLab"
-msgid "This user does not have a pending request"
-msgstr ""
-
msgid "This user has an unconfirmed email address (%{email}). You may force a confirmation."
msgstr ""
@@ -34633,9 +35099,6 @@ msgstr "Operações por segundo"
msgid "ThreatMonitoring|Packet Activity"
msgstr "Atividade de pacote"
-msgid "ThreatMonitoring|Policies"
-msgstr "Políticas"
-
msgid "ThreatMonitoring|Requests"
msgstr "Requisições"
@@ -34687,6 +35150,12 @@ msgstr "Não revisado"
msgid "ThreatMonitoring|View documentation"
msgstr "Ver documentação"
+msgid "Threshold in bytes at which to compress Sidekiq job arguments."
+msgstr ""
+
+msgid "Threshold in bytes at which to reject Sidekiq jobs. Set this to 0 to if you don't want to limit Sidekiq jobs."
+msgstr ""
+
msgid "Throughput"
msgstr ""
@@ -34696,9 +35165,12 @@ msgstr "Quinta-feira"
msgid "Time"
msgstr "Hora"
-msgid "Time Spent"
+msgid "Time (in hours) that users are allowed to skip forced configuration of two-factor authentication."
msgstr ""
+msgid "Time Spent"
+msgstr "Tempo gasto"
+
msgid "Time based: Yes"
msgstr "Baseado no tempo: Sim"
@@ -34762,7 +35234,7 @@ msgstr "Fuso horário"
msgid "TimeTrackingEstimated|Est"
msgstr "Est"
-msgid "TimeTracking|%{startTag}Spent: %{endTag}%{timeSpentHumanReadable}"
+msgid "TimeTracking|%{spentStart}Spent: %{spentEnd}"
msgstr ""
msgid "TimeTracking|Estimated:"
@@ -34976,6 +35448,9 @@ msgstr "Para aceitar este convite, entre."
msgid "To access this domain create a new DNS record"
msgstr "Para acessar este domínio crie um novo registro DNS"
+msgid "To add a custom suffix, set up a Service Desk email address. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "To add an SSH key you need to %{generate_link_start}generate one%{link_end} or use an %{existing_link_start}existing key%{link_end}."
msgstr "Para adicionar uma chave SSH, você precisa %{generate_link_start}gerar uma%{link_end} ou usar uma %{existing_link_start}chave existente%{link_end}."
@@ -34997,13 +35472,16 @@ msgstr "Para conectar repositórios do GitHub, primeiro você precisa autorizar
msgid "To connect an SVN repository, check out %{svn_link}."
msgstr "Para conectar um repositório SVN, confira %{svn_link}."
+msgid "To continue using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
+msgstr ""
+
msgid "To continue, you need to select the link in the confirmation email we sent to verify your email address. If you didn't get our email, select %{strongStart}Resend confirmation email.%{strongEnd}"
msgstr ""
msgid "To define internal users, first enable new users set to external"
msgstr "Para definir usuários internos, primeiro ative os novos usuários definidos como externos"
-msgid "To enable Registration Features, make sure \"Enable service ping\" is checked."
+msgid "To enable Registration Features, first enable Service Ping."
msgstr ""
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
@@ -35030,8 +35508,8 @@ msgstr "Para começar, insira seu URL de Host do Gitea e um %{link_to_personal_t
msgid "To get started, use the link below to confirm your account."
msgstr ""
-msgid "To help improve GitLab and its user experience, GitLab will periodically collect usage information."
-msgstr "Para ajudar a melhorar o GitLab e sua experiência de usuário, o GitLab coletará periodicamente informações de uso."
+msgid "To help improve GitLab and its user experience, GitLab periodically collects usage information."
+msgstr ""
msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
msgstr ""
@@ -35063,7 +35541,7 @@ msgstr ""
msgid "To preserve performance only %{strong_open}%{display_size} of %{real_size}%{strong_close} files are displayed."
msgstr ""
-msgid "To protect this issue's confidentiality, %{forkLink} and set the fork's visibility to private."
+msgid "To protect this issue's confidentiality, %{linkStart}fork this project%{linkEnd} and set the fork's visibility to private."
msgstr ""
msgid "To protect this issue's confidentiality, a private fork of this project was selected."
@@ -35096,12 +35574,15 @@ msgstr "Para ver os detalhes operacionais deste projeto, entre em contato com um
msgid "To set up SAML authentication for your group through an identity provider like Azure, Okta, Onelogin, Ping Identity, or your custom SAML 2.0 provider:"
msgstr "Para configurar a autenticação SAML para o seu grupo por meio de um provedor de identidade, como Azure, Okta, Onelogin, Ping Identity ou seu provedor SAML 2.0 personalizado:"
-msgid "To set up this service:"
-msgstr "Para configurar este serviço:"
+msgid "To set up this integration:"
+msgstr ""
msgid "To specify the notification level per project of a group you belong to, you need to visit project page and change notification level there."
msgstr "Para especificar o nível de notificação por projeto de um grupo a que você pertence, você precisa visitar a página do projeto e alterar o nível de notificação por lá."
+msgid "To start using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
+msgstr ""
+
msgid "To unsubscribe from this issue, please paste the following link into your browser:"
msgstr ""
@@ -35280,7 +35761,7 @@ msgid "Track important events in your GitLab instance."
msgstr ""
msgid "Track important events in your group."
-msgstr ""
+msgstr "Acompanhe eventos importantes em seu grupo."
msgid "Track important events in your project."
msgstr "Acompanhe eventos importantes no seu projeto."
@@ -35349,10 +35830,10 @@ msgid "TransferProject|Root namespace can't be updated if project has NPM packag
msgstr ""
msgid "TransferProject|You don't have permission to transfer projects into that namespace."
-msgstr ""
+msgstr "Você não tem permissão para transferir projetos para esse espaço de nome."
msgid "TransferProject|You don't have permission to transfer this project."
-msgstr ""
+msgstr "Você não tem permissão para transferir este projeto."
msgid "Tree view"
msgstr "Visão em árvore"
@@ -35549,7 +36030,7 @@ msgid "Twitter"
msgstr "Twitter"
msgid "Twitter:"
-msgstr ""
+msgstr "Twitter:"
msgid "Two-Factor Authentication"
msgstr "Autenticação de dois fatores"
@@ -35606,7 +36087,7 @@ msgid "URL cannot be blank"
msgstr ""
msgid "URL is invalid"
-msgstr ""
+msgstr "URL inválida"
msgid "URL is required"
msgstr ""
@@ -35689,9 +36170,6 @@ msgstr ""
msgid "Unable to fetch branches list, please close the form and try again"
msgstr ""
-msgid "Unable to fetch unscanned projects"
-msgstr ""
-
msgid "Unable to fetch vulnerable projects"
msgstr ""
@@ -35746,6 +36224,15 @@ msgstr "Não é possível atualizar este épico neste momento."
msgid "Unable to update this issue at this time."
msgstr "Não é possível atualizar esta issue neste momento."
+msgid "Unapprove a merge request"
+msgstr ""
+
+msgid "Unapprove the current merge request."
+msgstr ""
+
+msgid "Unapproved the current merge request."
+msgstr ""
+
msgid "Unarchive project"
msgstr "Desarquivar projeto"
@@ -35758,53 +36245,50 @@ msgstr ""
msgid "Unassigned"
msgstr "Não atribuído"
-msgid "Unauthenticated API request rate limit"
-msgstr ""
-
-msgid "Unauthenticated rate limit period in seconds"
-msgstr ""
-
-msgid "Unauthenticated request rate limit"
+msgid "Unauthenticated API rate limit period in seconds"
msgstr ""
msgid "Unauthenticated requests"
+msgstr "Solicitações não autenticadas"
+
+msgid "Unauthenticated web rate limit period in seconds"
msgstr ""
msgid "Undo"
msgstr "Desfazer"
msgid "Undo Ignore"
-msgstr ""
+msgstr "Desfazer ignorar"
msgid "Undo ignore"
-msgstr ""
+msgstr "Desfazer ignorar"
msgid "Unexpected error"
msgstr "Erro inesperado"
msgid "Unfollow"
-msgstr ""
+msgstr "Deixar de seguir"
msgid "Unfortunately, your email message to GitLab could not be processed."
msgstr "Infelizmente, sua mensagem de e-mail para o GitLab não pôde ser processada."
msgid "Unhappy?"
-msgstr ""
+msgstr "Infeliz?"
msgid "Units|ms"
-msgstr ""
+msgstr "ms"
msgid "Units|s"
-msgstr ""
+msgstr "s"
msgid "Unknown"
msgstr "Desconhecido"
msgid "Unknown Error"
-msgstr ""
+msgstr "Erro desconhecido"
msgid "Unknown cache key"
-msgstr ""
+msgstr "Chave de cache desconhecida"
msgid "Unknown encryption strategy: %{encrypted_strategy}!"
msgstr ""
@@ -35813,7 +36297,7 @@ msgid "Unknown format"
msgstr "Formato desconhecido"
msgid "Unknown response text"
-msgstr ""
+msgstr "Texto de resposta desconhecido."
msgid "Unknown user"
msgstr "Usuario desconhecido"
@@ -35825,7 +36309,7 @@ msgid "Unlimited"
msgstr "Ilimitado"
msgid "Unlink"
-msgstr ""
+msgstr "Desvincular"
msgid "Unlock"
msgstr "Desbloquear"
@@ -35855,31 +36339,19 @@ msgid "Unmarks this %{noun} as a draft."
msgstr "Desmarca este %{noun} como um rascunho."
msgid "Unreachable"
-msgstr ""
+msgstr "Inacessível"
msgid "Unrecognized cluster type"
-msgstr ""
+msgstr "Tipo de cluster não reconhecido"
msgid "Unresolve"
-msgstr ""
+msgstr "Voltar para resolver"
msgid "Unresolve thread"
-msgstr ""
+msgstr "Voltar tópico para resolver"
msgid "Unresolved"
-msgstr ""
-
-msgid "UnscannedProjects|15 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|30 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|5 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|60 or more days"
-msgstr ""
+msgstr "Não resolvido"
msgid "Unschedule job"
msgstr "Desprogramar tarefa"
@@ -35918,7 +36390,7 @@ msgid "Until revoked, expired personal access tokens pose a security risk."
msgstr ""
msgid "Unused"
-msgstr ""
+msgstr "Não usado"
msgid "Unused, previous indices: %{index_names} will be deleted after %{time} automatically."
msgstr ""
@@ -35939,19 +36411,19 @@ msgid "Update"
msgstr "Atualizar"
msgid "Update %{sourcePath} file"
-msgstr ""
+msgstr "Atualizar arquivo %{sourcePath}"
msgid "Update Now"
-msgstr ""
+msgstr "Atualizar agora"
msgid "Update Scheduled…"
-msgstr ""
+msgstr "Atualização agendada…"
msgid "Update all"
msgstr "Atualizar tudo"
msgid "Update appearance settings"
-msgstr ""
+msgstr "Atualizar configurações de aparência"
msgid "Update approval rule"
msgstr "Atualizar regra de aprovação"
@@ -35960,7 +36432,7 @@ msgid "Update approvers"
msgstr "Atualizar aprovadores"
msgid "Update broadcast message"
-msgstr ""
+msgstr "Atualizar mensagem de transmissão"
msgid "Update failed"
msgstr "Falha na atualização"
@@ -36023,13 +36495,13 @@ msgid "Updating"
msgstr "Atualizando"
msgid "Updating…"
-msgstr ""
+msgstr "Atualizando…"
msgid "Upgrade offers available!"
msgstr "Ofertas de atualização disponível!"
msgid "Upgrade your plan"
-msgstr ""
+msgstr "Atualize seu plano"
msgid "Upload"
msgstr "Enviar"
@@ -36083,7 +36555,7 @@ msgid "Upstream"
msgstr "Upstream"
msgid "Uptime"
-msgstr ""
+msgstr "Tempo de atividade"
msgid "Upvotes"
msgstr "Votos positivos"
@@ -36092,7 +36564,7 @@ msgid "Usage"
msgstr "Uso"
msgid "Usage Trends"
-msgstr ""
+msgstr "Tendências de uso"
msgid "Usage statistics"
msgstr "Estatísticas de uso"
@@ -36100,6 +36572,9 @@ msgstr "Estatísticas de uso"
msgid "UsageQuota|%{help_link_start}Shared runners%{help_link_end} are disabled, so there are no limits set on pipeline usage"
msgstr "%{help_link_start}Executores compartilhados%{help_link_end} estão desativados, então não há limites definidos no uso de pipeline"
+msgid "UsageQuota|%{linkTitle} help link"
+msgstr ""
+
msgid "UsageQuota|%{percentageLeft} of purchased storage is available"
msgstr "%{percentageLeft} de armazenamento comprado está disponível"
@@ -36109,6 +36584,9 @@ msgstr "Artefatos"
msgid "UsageQuota|Artifacts is a sum of build and pipeline artifacts."
msgstr "Artefatos é uma soma de artefatos de construção e pipeline."
+msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
+msgstr ""
+
msgid "UsageQuota|Buy additional minutes"
msgstr "Comprar minutos adicionais"
@@ -36118,9 +36596,21 @@ msgstr "Uso de minutos de CI por mês"
msgid "UsageQuota|CI minutes usage by project"
msgstr "Uso de minutos de CI por projeto"
+msgid "UsageQuota|Code packages and container images."
+msgstr ""
+
msgid "UsageQuota|Current period usage"
msgstr "Uso do período atual"
+msgid "UsageQuota|File attachments and smaller design graphics."
+msgstr ""
+
+msgid "UsageQuota|Git repository, managed by the Gitaly service."
+msgstr ""
+
+msgid "UsageQuota|Includes project registry, artifacts, packages, wiki, uploads and other items."
+msgstr ""
+
msgid "UsageQuota|Increase storage temporarily"
msgstr "Aumentar o armazenamento temporariamente"
@@ -36139,6 +36629,9 @@ msgstr "Saiba mais sobre as cotas de uso"
msgid "UsageQuota|Packages"
msgstr "Pacotes"
+msgid "UsageQuota|Pipeline artifacts and job artifacts, created with CI/CD."
+msgstr ""
+
msgid "UsageQuota|Pipelines"
msgstr "Pipelines"
@@ -36157,15 +36650,24 @@ msgstr "Repositório"
msgid "UsageQuota|Seats"
msgstr "Assentos"
+msgid "UsageQuota|Shared bits of code and text."
+msgstr ""
+
msgid "UsageQuota|Snippets"
msgstr "Snippets"
msgid "UsageQuota|Something went wrong while fetching project storage statistics"
-msgstr ""
+msgstr "Algo deu errado ao obter estatísticas de armazenamento do projetot"
msgid "UsageQuota|Storage"
msgstr "Armazenamento"
+msgid "UsageQuota|Storage type"
+msgstr ""
+
+msgid "UsageQuota|There is a known issue with Artifact storage where the total could be incorrect for some projects. More details and progress are available in %{warningLinkStart}the epic%{warningLinkEnd}."
+msgstr ""
+
msgid "UsageQuota|This is the total amount of storage used across your projects within this namespace."
msgstr ""
@@ -36205,6 +36707,9 @@ msgstr "Envios"
msgid "UsageQuota|Usage"
msgstr "Uso"
+msgid "UsageQuota|Usage Breakdown"
+msgstr ""
+
msgid "UsageQuota|Usage Quotas"
msgstr "Cotas de uso"
@@ -36212,7 +36717,7 @@ msgid "UsageQuota|Usage of group resources across the projects in the %{strong_s
msgstr "Uso de recursos de grupo entre os projetos no grupo %{strong_start}%{group_name}%{strong_end}"
msgid "UsageQuota|Usage of project resources across the %{strong_start}%{project_name}%{strong_end} project"
-msgstr ""
+msgstr "Uso de recursos de projeto entre o projeto %{strong_start}%{project_name}%{strong_end}"
msgid "UsageQuota|Usage of resources across your projects"
msgstr "Uso de recursos em seus projetos"
@@ -36229,6 +36734,9 @@ msgstr ""
msgid "UsageQuota|Wiki"
msgstr "Wiki"
+msgid "UsageQuota|Wiki content."
+msgstr ""
+
msgid "UsageQuota|Wikis"
msgstr "Wikis"
@@ -36445,8 +36953,11 @@ msgstr "Aplicativos OAuth do usuário"
msgid "User Settings"
msgstr "Configurações do usuário"
-msgid "User and IP Rate Limits"
-msgstr "Limites de Taxa de Usuário e IP"
+msgid "User and IP rate limits"
+msgstr ""
+
+msgid "User does not have a pending request"
+msgstr ""
msgid "User identity was successfully created."
msgstr "A identidade do usuário foi criada com sucesso."
@@ -36731,10 +37242,10 @@ msgid "Username or email"
msgstr "Nome de usuário ou e-mail"
msgid "Username:"
-msgstr ""
+msgstr "Nome de usuário:"
msgid "Username: %{username}"
-msgstr ""
+msgstr "Nome de usuário: %{username}"
msgid "Users"
msgstr "Usuários"
@@ -36742,6 +37253,9 @@ msgstr "Usuários"
msgid "Users can launch a development environment from a GitLab browser tab when the %{linkStart}Gitpod%{linkEnd} integration is enabled."
msgstr "Usuários podem iniciar um ambiente de desenvolvimento a partir de uma guia do GitLab quando a integração %{linkStart}Gitpod%{linkEnd} está ativada."
+msgid "Users can reactivate their account by signing in."
+msgstr ""
+
msgid "Users can render diagrams in AsciiDoc, Markdown, reStructuredText, and Textile documents using Kroki."
msgstr ""
@@ -36757,6 +37271,9 @@ msgstr ""
msgid "Users requesting access to"
msgstr ""
+msgid "Users to exclude from the rate limit"
+msgstr ""
+
msgid "Users were successfully added."
msgstr "Usuário adicionado com sucesso"
@@ -36778,6 +37295,9 @@ msgstr "Nenhum responsável - %{openingTag} atribua a você mesmo %{closingTag}"
msgid "UsersSelect|Unassigned"
msgstr "Não atribuído"
+msgid "Uses GitLab as a lightweight alternative to Sentry."
+msgstr ""
+
msgid "Using %{code_start}::%{code_end} denotes a %{link_start}scoped label set%{link_end}"
msgstr ""
@@ -36808,10 +37328,7 @@ msgstr ""
msgid "Value Stream Analytics can help you determine your team’s velocity"
msgstr ""
-msgid "Value Stream Analytics gives an overview of how much time it takes to go from idea to production in your project."
-msgstr ""
-
-msgid "Value may contain a variable reference"
+msgid "Value might contain a variable reference"
msgstr ""
msgid "Value stream"
@@ -36851,7 +37368,7 @@ msgid "ValueStreamAnalytics|Median time from issue first merge request created t
msgstr ""
msgid "ValueStreamAnalytics|Number of commits pushed to the default branch"
-msgstr ""
+msgstr "Número de commits enviados para a ramificação padrão"
msgid "ValueStreamAnalytics|Number of new issues created."
msgstr ""
@@ -36877,12 +37394,12 @@ msgstr "Parar"
msgid "ValueStream|The Default Value Stream cannot be deleted"
msgstr ""
+msgid "Values that contain the %{codeStart}$%{codeEnd} character can be considered a variable reference and expanded. %{docsLinkStart}Learn more.%{docsLinkEnd}"
+msgstr ""
+
msgid "Variable"
msgstr "Variável"
-msgid "Variable references indicated by %{codeStart}$%{codeEnd} may be expanded. If this is not what you want, consider %{docsLinkStart}using a workaround to prevent expansion%{docsLinkEnd}."
-msgstr ""
-
msgid "Variable will be masked in job logs."
msgstr ""
@@ -36920,7 +37437,7 @@ msgid "Verify SAML Configuration"
msgstr "Verificar configuração SAML"
msgid "Verify code"
-msgstr ""
+msgstr "Verificar código"
msgid "Verify configuration"
msgstr "Verificar configuração"
@@ -36941,7 +37458,7 @@ msgid "View alert details at"
msgstr "Veja os detalhes do alerta em"
msgid "View alert details."
-msgstr ""
+msgstr "Veja os detalhes do alerta."
msgid "View all environments."
msgstr "Ver todos os ambientes."
@@ -37002,13 +37519,13 @@ msgid "View group labels"
msgstr "Visualizar etiquetas de grupo"
msgid "View incident issues."
-msgstr ""
+msgstr "Ver as issues do incidente."
msgid "View issue"
-msgstr ""
+msgstr "Ver issue"
msgid "View issues"
-msgstr ""
+msgstr "Ver issues"
msgid "View it on GitLab"
msgstr "Ver no GitLab"
@@ -37035,36 +37552,36 @@ msgid "View merge request"
msgstr "Ver solicitação de mesclagem"
msgid "View on %{url}"
-msgstr ""
+msgstr "Ver em %{url}"
msgid "View open merge request"
msgstr "Ver solicitação de mesclagem aberta"
msgid "View page @ "
-msgstr ""
+msgstr "Ver página @ "
msgid "View performance dashboard."
-msgstr ""
+msgstr "Ver painel de desempenho"
msgid "View project"
-msgstr ""
+msgstr "Ver projeto"
msgid "View project in admin area"
-msgstr ""
+msgstr "Ver projeto na área do administrador"
msgid "View project labels"
msgstr "Ver etiquetas de projeto"
msgid "View public GPG key"
msgid_plural "View public GPG keys"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "Ver chave GPG pública"
+msgstr[1] "Ver chaves GPG públicas"
msgid "View replaced file @ "
msgstr "Ver arquivo substituído @ "
msgid "View setting"
-msgstr ""
+msgstr "Ver configuração"
msgid "View supported languages and frameworks"
msgstr ""
@@ -37079,10 +37596,10 @@ msgid "View the performance dashboard at"
msgstr ""
msgid "View usage details"
-msgstr ""
+msgstr "Ver detalhes de uso"
msgid "View users statistics"
-msgstr ""
+msgstr "Ver estatísticas do usuário"
msgid "Viewed"
msgstr "Visto"
@@ -37229,7 +37746,7 @@ msgid "VulnerabilityManagement|invalid issue link or ID"
msgstr ""
msgid "VulnerabilityStatusTypes|All statuses"
-msgstr ""
+msgstr "Todos os status"
msgid "VulnerabilityStatusTypes|Confirmed"
msgstr ""
@@ -37285,6 +37802,9 @@ msgstr "Baixar"
msgid "Vulnerability|Evidence"
msgstr ""
+msgid "Vulnerability|False positive detected"
+msgstr ""
+
msgid "Vulnerability|File"
msgstr "Arquivo"
@@ -37327,6 +37847,9 @@ msgstr "Gravidade"
msgid "Vulnerability|Status"
msgstr ""
+msgid "Vulnerability|The scanner determined this vulnerability to be a false positive. Verify the evaluation before changing its status. %{linkStart}Learn more about false positive detection.%{linkEnd}"
+msgstr ""
+
msgid "Vulnerability|The unmodified response is the original response that had no mutations done to the request"
msgstr ""
@@ -37337,7 +37860,7 @@ msgid "Vulnerability|Unmodified Response"
msgstr ""
msgid "WARNING:"
-msgstr ""
+msgstr "AVISO:"
msgid "Wait for the file to load to copy its contents"
msgstr ""
@@ -37484,10 +38007,10 @@ msgid "WebIDE|You need permission to edit files directly in this project."
msgstr "Você precisa de permissão para editar arquivos diretamente neste projeto."
msgid "WebexTeamsService|Send notifications about project events to Webex Teams."
-msgstr ""
+msgstr "Envie notificações sobre eventos de projeto para Webex Teams."
msgid "WebexTeamsService|Send notifications about project events to a Webex Teams conversation. %{docs_link}"
-msgstr ""
+msgstr "Envie notificações sobre eventos de projeto para uma conversa do Webex Teams. %{docs_link}"
msgid "WebexTeamsService|Webex Teams"
msgstr ""
@@ -37526,7 +38049,7 @@ msgid "Webhooks|Enable SSL verification"
msgstr "Ativar verificação SSL"
msgid "Webhooks|Feature flag events"
-msgstr ""
+msgstr "Eventos de feature flag"
msgid "Webhooks|Issues events"
msgstr "Eventos de issues"
@@ -37535,7 +38058,7 @@ msgid "Webhooks|Job events"
msgstr "Eventos de tarefa"
msgid "Webhooks|Member events"
-msgstr ""
+msgstr "Eventos de membro"
msgid "Webhooks|Merge request events"
msgstr "Eventos de solicitação de mesclagem"
@@ -37556,7 +38079,7 @@ msgid "Webhooks|Secret token"
msgstr "Token secreto"
msgid "Webhooks|Subgroup events"
-msgstr ""
+msgstr "Eventos de subgrupo"
msgid "Webhooks|Tag push events"
msgstr ""
@@ -37568,7 +38091,7 @@ msgid "Webhooks|URL"
msgstr "URL"
msgid "Webhooks|URL is triggered by a push to the repository"
-msgstr ""
+msgstr "URL é acionado por push para o repositório"
msgid "Webhooks|URL is triggered when a confidential issue is created, updated, closed, or reopened"
msgstr ""
@@ -37613,13 +38136,13 @@ msgid "Webhooks|URL is triggered when the pipeline status changes"
msgstr ""
msgid "Webhooks|URL must be percent-encoded if neccessary."
-msgstr ""
+msgstr "O URL deve ser codificado em porcentagem, se necessário."
msgid "Webhooks|Use this token to validate received payloads. It is sent with the request in the X-Gitlab-Token HTTP header."
-msgstr ""
+msgstr "Use este token para validar as cargas recebidas. Ele é enviado com a solicitação no cabeçalho Gitlab-Token HTTP."
msgid "Webhooks|Wiki page events"
-msgstr ""
+msgstr "Eventos da página Wiki"
msgid "Website:"
msgstr "Site:"
@@ -37651,9 +38174,6 @@ msgstr "Bem-vindo ao GitLab, %{first_name}!"
msgid "Welcome to GitLab,%{br_tag}%{name}!"
msgstr ""
-msgid "Welcome to the guided GitLab tour"
-msgstr ""
-
msgid "Welcome, %{name}!"
msgstr ""
@@ -37661,7 +38181,7 @@ msgid "What are group audit events?"
msgstr ""
msgid "What are instance audit events?"
-msgstr ""
+msgstr "O que são eventos de auditoria de instância?"
msgid "What are project audit events?"
msgstr "O que são eventos de auditoria de projetos?"
@@ -37672,17 +38192,14 @@ msgstr ""
msgid "What are you searching for?"
msgstr "O que você esta pesquisando?"
-msgid "What describes you best?"
-msgstr ""
-
msgid "What does this command do?"
msgstr "O que este comando faz?"
msgid "What is Auto DevOps?"
-msgstr ""
+msgstr "O que é Auto DevOps?"
msgid "What is Markdown?"
-msgstr ""
+msgstr "O que é Markdown?"
msgid "What is repository mirroring?"
msgstr ""
@@ -37691,9 +38208,12 @@ msgid "What is squashing?"
msgstr ""
msgid "What is time tracking?"
-msgstr ""
+msgstr "O que é o acompanhamento do tempo?"
msgid "What is your job title? (optional)"
+msgstr "Qual é o título do seu trabalho? (opcional)"
+
+msgid "What templates can I create?"
msgstr ""
msgid "What will you use this group for?"
@@ -37702,9 +38222,6 @@ msgstr "Para que você usará este grupo?"
msgid "What's new"
msgstr "Novidades"
-msgid "What’s your experience level?"
-msgstr ""
-
msgid "When a deployment job is successful, skip older deployment jobs that are still pending."
msgstr "Quando uma tarefa de implantação é bem-sucedida, pule as tarefas de implantação mais antigos que ainda estão pendentes."
@@ -37714,6 +38231,9 @@ msgstr "Quando um executor está bloqueado, não pode ser atribuído a outros pr
msgid "When an event in GitLab triggers a webhook, you can use the request details to figure out if something went wrong."
msgstr ""
+msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+msgstr ""
+
msgid "When inactive, an external authentication provider must be used."
msgstr ""
@@ -37737,6 +38257,9 @@ msgstr "Quando usar os protocolos %{code_open}http://%{code_close} ou %{code_ope
msgid "When:"
msgstr "Quando:"
+msgid "Which API requests are affected?"
+msgstr ""
+
msgid "While it's rare to have no vulnerabilities, it can happen. In any event, we ask that you please double check your settings to make sure you've set up your dashboard correctly."
msgstr ""
@@ -37909,7 +38432,7 @@ msgid "WikiPage|Page title"
msgstr "Título da página"
msgid "WikiPage|Retry"
-msgstr ""
+msgstr "Tentar novamente"
msgid "WikiPage|Save changes"
msgstr "Salvar alterações"
@@ -38016,6 +38539,9 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|Work Items"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -38091,6 +38617,9 @@ msgstr "Você está prestes a transferir o controle da sua conta para o grupo %{
msgid "You are already a member of this %{member_source}."
msgstr ""
+msgid "You are already impersonating another user"
+msgstr ""
+
msgid "You are an admin, which means granting access to %{client_name} will allow them to interact with GitLab as an admin as well. Proceed with caution."
msgstr ""
@@ -38122,7 +38651,7 @@ msgid "You are going to turn on confidentiality. Only team members with %{strong
msgstr ""
msgid "You are not allowed to %{action} a user"
-msgstr ""
+msgstr "Você não tem permissão para %{action} um usuário"
msgid "You are not allowed to approve a user"
msgstr ""
@@ -38193,6 +38722,9 @@ msgstr ""
msgid "You can also use project access tokens with Git to authenticate over HTTP(S). %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "You can always change your URL later"
+msgstr ""
+
msgid "You can always edit this later"
msgstr "Você pode editar isto depois"
@@ -38349,12 +38881,12 @@ msgstr "Você não pode escrever nesta instância somente-leitura do GitLab."
msgid "You can’t %{tag_start}edit%{tag_end} files directly in this project. Fork this project and submit a merge request with your changes."
msgstr "Você não pode %{tag_start}editar%{tag_end} arquivos diretamente nesse projeto. Faça um fork nesse projeto e envie uma solicitação de mesclagem com suas alterações."
+msgid "You can’t edit files directly in this project. Fork this project and submit a merge request with your changes."
+msgstr ""
+
msgid "You could not create a new trigger."
msgstr "Você não pôde criar um novo gatilho."
-msgid "You didn't renew your subscription for %{strong}%{namespace_name}%{strong_close} so it was downgraded to the free plan."
-msgstr ""
-
msgid "You do not have any subscriptions yet"
msgstr "Você ainda não tem nenhuma inscrição"
@@ -38520,6 +39052,12 @@ msgstr "Você deve fornecer uma senha atual válida"
msgid "You must provide your current password in order to change it."
msgstr "Você deve fornecer sua senha atual para alterá-la."
+msgid "You must sign in to search for specific projects."
+msgstr ""
+
+msgid "You must sign in to search for specific terms."
+msgstr ""
+
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
@@ -38547,6 +39085,9 @@ msgstr ""
msgid "You need to upload a GitLab project export archive (ending in .gz)."
msgstr ""
+msgid "You need to verify your primary email first before enabling Two-Factor Authentication."
+msgstr ""
+
msgid "You successfully declined the invitation"
msgstr "Você recusou o convite com sucesso."
@@ -38655,10 +39196,10 @@ msgstr ""
msgid "Your %{host} account was signed in to from a new location"
msgstr ""
-msgid "Your %{strong}%{plan_name}%{strong_close} subscription for %{strong}%{namespace_name}%{strong_close} will expire on %{strong}%{expires_on}%{strong_close}."
+msgid "Your %{strong}%{plan_name}%{strong_close} subscription expires on %{strong}%{expires_on}%{strong_close}. After that date, you cannot create issues or merge requests, or use many other features."
msgstr ""
-msgid "Your %{strong}%{plan_name}%{strong_close} subscription will expire on %{strong}%{expires_on}%{strong_close}. After that, you will not be able to create issues or merge requests as well as many other features."
+msgid "Your %{strong}%{plan_name}%{strong_close} subscription for %{strong}%{namespace_name}%{strong_close} will expire on %{strong}%{expires_on}%{strong_close}."
msgstr ""
msgid "Your CI/CD configuration syntax is invalid. View Lint tab for more details."
@@ -38682,7 +39223,7 @@ msgstr ""
msgid "Your GPG keys (%{count})"
msgstr "Suas chaves GPG (%{count})"
-msgid "Your GitLab account has been locked due to an excessive amount of unsuccessful sign in attempts. Your account will automatically unlock in %{duration} or you may click the link below to unlock now."
+msgid "Your GitLab account has been locked due to an excessive number of unsuccessful sign in attempts. You can wait for your account to automatically unlock in %{duration} or you can click the link below to unlock now."
msgstr ""
msgid "Your GitLab account request has been approved!"
@@ -38704,7 +39245,7 @@ msgid "Your Projects' Activity"
msgstr "Atividade dos seus projetos"
msgid "Your SSH key has expired"
-msgstr ""
+msgstr "Sua chave SSH expirou"
msgid "Your SSH key is expiring soon."
msgstr ""
@@ -38793,6 +39334,9 @@ msgstr ""
msgid "Your commit email is used for web based operations, such as edits and merges."
msgstr "Seu e-mail de commit é usado para operações baseadas na web, como edições e merges."
+msgid "Your current password is required to register a two-factor authenticator app."
+msgstr ""
+
msgid "Your dashboard has been copied. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
@@ -38892,6 +39436,9 @@ msgstr ""
msgid "Your project limit is %{limit} projects! Please contact your administrator to increase it"
msgstr ""
+msgid "Your project will be created at:"
+msgstr ""
+
msgid "Your projects"
msgstr "Seus projetos"
@@ -38923,7 +39470,7 @@ msgid "Your search didn't match any commits. Try a different query."
msgstr ""
msgid "Your search timed out"
-msgstr ""
+msgstr "Sua pesquisa expirou"
msgid "Your sign-in page is %{url}."
msgstr ""
@@ -38931,14 +39478,13 @@ msgstr ""
msgid "Your subscription expired!"
msgstr ""
-msgid "Your subscription has been downgraded."
-msgstr ""
-
-msgid "Your subscription will expire in %{remaining_days}."
-msgstr ""
+msgid "Your subscription will expire in %{remaining_days} day."
+msgid_plural "Your subscription will expire in %{remaining_days} days."
+msgstr[0] ""
+msgstr[1] ""
msgid "Your username is %{username}."
-msgstr ""
+msgstr "Seu nome de usuário é %{username}."
msgid "ZentaoIntegration|Base URL of the Zentao instance."
msgstr ""
@@ -38947,22 +39493,22 @@ msgid "ZentaoIntegration|Enter API token"
msgstr "Insira o token de API"
msgid "ZentaoIntegration|If different from Web URL."
-msgstr ""
+msgstr "Se for diferente do URL da web."
msgid "ZentaoIntegration|Use Zentao as this project's issue tracker."
-msgstr ""
+msgstr "Use Zentao como o rastreador de issues deste projeto."
msgid "ZentaoIntegration|Zentao API URL (optional)"
-msgstr ""
+msgstr "URL do API do Zentao (Opcional)"
msgid "ZentaoIntegration|Zentao API token"
-msgstr ""
+msgstr "Token de API do Zentao"
msgid "ZentaoIntegration|Zentao Product ID"
-msgstr ""
+msgstr "ID de produto do Zentao"
msgid "ZentaoIntegration|Zentao Web URL"
-msgstr ""
+msgstr "URL do Zentao Web"
msgid "Zoom meeting added"
msgstr "Reunião do Zoom adicionada"
@@ -38974,7 +39520,7 @@ msgid "[No reason]"
msgstr ""
msgid "[Redacted]"
-msgstr ""
+msgstr "[Redacted]"
msgid "`end_time` should not exceed one month after `start_time`"
msgstr ""
@@ -39142,6 +39688,9 @@ msgstr "não é possível bloquear a si próprio"
msgid "cannot merge"
msgstr ""
+msgid "cannot not be used for user namespace"
+msgstr ""
+
msgid "ciReport|%{degradedNum} degraded"
msgstr ""
@@ -39465,6 +40014,9 @@ msgstr "criado há %{timeAgoString} por %{user} no Jira"
msgid "created %{timeAgo}"
msgstr "criado em %{timeAgo}"
+msgid "created %{timeAgo} by %{author}"
+msgstr ""
+
msgid "created by"
msgstr "criado por"
@@ -39509,9 +40061,6 @@ msgstr ""
msgid "does not have a supported extension. Only %{extension_list} are supported"
msgstr ""
-msgid "domain is not authorized for sign-up."
-msgstr ""
-
msgid "download it"
msgstr "baixá-lo"
@@ -39529,18 +40078,13 @@ msgstr ""
msgid "email '%{email}' is not a verified email."
msgstr ""
-msgid "email does not match the allowed domain of %{email_domains}"
-msgid_plural "email does not match the allowed domains: %{email_domains}"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "enabled"
msgstr "habilitado"
msgid "encrypted: needs to be a :required, :optional or :migrating!"
msgstr ""
-msgid "ending with MIME type format is not allowed."
+msgid "ending with a reserved file extension is not allowed."
msgstr ""
msgid "entries cannot be larger than 255 characters"
@@ -39564,6 +40108,9 @@ msgstr "erro"
msgid "estimateCommand|%{slash_command} overwrites the total estimated time."
msgstr "%{slash_command} substitui o tempo total estimado."
+msgid "example.com"
+msgstr ""
+
msgid "exceeds the limit of %{bytes} bytes"
msgstr "excede o limite de %{bytes} bytes"
@@ -39614,9 +40161,6 @@ msgstr "para este projeto"
msgid "fork"
msgstr ""
-msgid "fork this project"
-msgstr "fazer fork nesse projeto"
-
msgid "from"
msgstr "de"
@@ -39625,6 +40169,9 @@ msgid_plural "from %d jobs"
msgstr[0] "de %d tarefa"
msgstr[1] "de %d tarefas"
+msgid "frontmatter"
+msgstr ""
+
msgid "group"
msgstr "grupo"
@@ -39652,6 +40199,9 @@ msgstr ""
msgid "has been completed."
msgstr ""
+msgid "has too deep level of nesting"
+msgstr ""
+
msgid "help"
msgstr "ajuda"
@@ -39659,7 +40209,7 @@ msgid "http:"
msgstr ""
msgid "http://www.example.com"
-msgstr ""
+msgstr "http://www.example.com"
msgid "https://bamboo.example.com"
msgstr ""
@@ -39685,9 +40235,21 @@ msgstr "fluxo de importação"
msgid "in"
msgstr ""
+msgid "in Infrastructure :: Kubernetes clusters"
+msgstr ""
+
+msgid "in all GitLab"
+msgstr ""
+
+msgid "in group"
+msgstr ""
+
msgid "in group %{link_to_group}"
msgstr "no grupo %{link_to_group}"
+msgid "in project"
+msgstr ""
+
msgid "in project %{link_to_project}"
msgstr "no projeto %{link_to_project}"
@@ -39729,16 +40291,19 @@ msgstr ""
msgid "is not a valid X509 certificate."
msgstr "não é um certificado X509 válido."
-msgid "is not allowed since the group is not top-level group."
+msgid "is not allowed for sign-up."
msgstr ""
-msgid "is not allowed. Try again with a different email address, or contact your GitLab admin."
+msgid "is not allowed for this group."
msgstr ""
-msgid "is not allowed. We do not currently support project-level iterations"
+msgid "is not allowed for this project."
msgstr ""
-msgid "is not from an allowed domain."
+msgid "is not allowed since the group is not top-level group."
+msgstr ""
+
+msgid "is not allowed. We do not currently support project-level iterations"
msgstr ""
msgid "is not in the group enforcing Group Managed Account"
@@ -39748,7 +40313,7 @@ msgid "is not valid. The iteration group has to match the iteration cadence grou
msgstr ""
msgid "is read-only"
-msgstr ""
+msgstr "é somente leitura"
msgid "is too long (%{current_value}). The maximum size is %{max_size}."
msgstr ""
@@ -39831,6 +40396,9 @@ msgstr "bloqueador por %{path_lock_user_name} %{created_at}"
msgid "log in"
msgstr ""
+msgid "managed"
+msgstr ""
+
msgid "manual"
msgstr ""
@@ -39878,6 +40446,9 @@ msgstr ""
msgid "mrWidget| Please restore it or use a different %{missingBranchName} branch"
msgstr "Por favor, restaurar ou usar um branch %{missingBranchName} diferente"
+msgid "mrWidget|%{linkStart}Set up now%{linkEnd} to analyze your source code for known security vulnerabilities."
+msgstr ""
+
msgid "mrWidget|%{mergeError}."
msgstr "%{mergeError}."
@@ -39955,8 +40526,11 @@ msgstr "Fechado por"
msgid "mrWidget|Closes issue"
msgid_plural "mrWidget|Closes issues"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "Issue fechada"
+msgstr[1] "Issues fechadas"
+
+msgid "mrWidget|Create issue to resolve all threads"
+msgstr ""
msgid "mrWidget|Delete source branch"
msgstr "Excluir branch de origem"
@@ -39967,12 +40541,18 @@ msgstr "Estatísticas de implantação não estão disponíveis atualmente"
msgid "mrWidget|Did not close"
msgstr "Não foi possível fechar"
+msgid "mrWidget|Dismiss"
+msgstr ""
+
msgid "mrWidget|Email patches"
msgstr "Email patches"
msgid "mrWidget|Failed to load deployment statistics"
msgstr "Falha ao carregar estatísticas de implantação"
+msgid "mrWidget|Hide %{widget} details"
+msgstr ""
+
msgid "mrWidget|If the %{missingBranchName} branch exists in your local repository, you can merge this merge request manually using the command line"
msgstr "Se o branch %{missingBranchName} existir em seu repositório local, você poderá fazer merge request manualmente usando a linha de comando"
@@ -39993,8 +40573,8 @@ msgstr "Membros que podem fazer a mesclagem e tem a permissão de adicionar comm
msgid "mrWidget|Mentions issue"
msgid_plural "mrWidget|Mentions issues"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "Issue mencionada"
+msgstr[1] "Issues mencionadas"
msgid "mrWidget|Merge"
msgstr "Mesclar"
@@ -40068,9 +40648,6 @@ msgstr "Remover do merge train"
msgid "mrWidget|Request to merge"
msgstr "Solicitar mesclagem"
-msgid "mrWidget|Resolve all threads in new issue"
-msgstr ""
-
msgid "mrWidget|Resolve conflicts"
msgstr "Resolver conflitos"
@@ -40086,6 +40663,9 @@ msgstr "Reverter essa solicitação de mesclagem com um nova solicitação de me
msgid "mrWidget|Revoke approval"
msgstr "Revogar aprovação"
+msgid "mrWidget|SAST and Secret Detection is not enabled."
+msgstr ""
+
msgid "mrWidget|Set by %{merge_author} to be added to the merge train when the pipeline succeeds"
msgstr ""
@@ -40095,6 +40675,9 @@ msgstr ""
msgid "mrWidget|Set by %{merge_author} to start a merge train when the pipeline succeeds"
msgstr ""
+msgid "mrWidget|Show %{widget} details"
+msgstr ""
+
msgid "mrWidget|The changes were merged into"
msgstr "Houve merge das alterações em"
@@ -40107,6 +40690,9 @@ msgstr "Será feito merge das alterações em"
msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure, or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
msgstr "O pipeline para essse merge request não foi concluído. Faça um push em um novo commit para corrigir a falha, ou verifique a %{linkStart}documentação de solução de problemas%{linkEnd} para ver as possíveis ações."
+msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure."
+msgstr ""
+
msgid "mrWidget|The source branch has been deleted"
msgstr "O branch de origem foi excluído"
@@ -40147,6 +40733,9 @@ msgid "mrWidget|Use %{linkStart}CI pipelines to test your code%{linkEnd} by simp
msgstr ""
msgid "mrWidget|You can merge after removing denied licenses"
+msgstr "Você pode mesclar após remover as licenças negadas"
+
+msgid "mrWidget|You can only merge once this merge request is approved."
msgstr ""
msgid "mrWidget|Your password"
@@ -40185,6 +40774,9 @@ msgstr ""
msgid "must be less than the limit of %{tag_limit} tags"
msgstr ""
+msgid "must be set for a project namespace"
+msgstr ""
+
msgid "must be unique by status and elapsed time within a policy"
msgstr ""
@@ -40210,7 +40802,7 @@ msgid "never expires"
msgstr "nunca expira"
msgid "new merge request"
-msgstr "novo merge request"
+msgstr "nova solicitação de mesclagem"
msgid "no approvers"
msgstr "Nenhum aprovadores"
@@ -40294,6 +40886,9 @@ msgstr "tokens de acesso pessoal"
msgid "pipeline"
msgstr "pipeline"
+msgid "pipeline schedules documentation"
+msgstr ""
+
msgid "pod_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
msgstr ""
@@ -40343,16 +40938,25 @@ msgstr "membros do projeto"
msgid "project name"
msgstr "nome do projeto"
+msgid "project namespace cannot be the parent of another namespace"
+msgstr ""
+
msgid "projects"
msgstr "projetos"
msgid "quick actions"
msgstr "ações rápidas"
-msgid "reCAPTCHA Private Key"
+msgid "reCAPTCHA"
+msgstr ""
+
+msgid "reCAPTCHA helps prevent credential stuffing."
msgstr ""
-msgid "reCAPTCHA Site Key"
+msgid "reCAPTCHA private key"
+msgstr ""
+
+msgid "reCAPTCHA site key"
msgstr ""
msgid "recent activity"
@@ -40397,7 +41001,7 @@ msgid "repository:"
msgstr "repositório:"
msgid "required"
-msgstr ""
+msgstr "obrigatório"
msgid "reset it."
msgstr "redefini-lo."
@@ -40526,10 +41130,10 @@ msgid "the following issue(s)"
msgstr ""
msgid "the wiki"
-msgstr ""
+msgstr "a wiki"
msgid "then"
-msgstr ""
+msgstr "então"
msgid "this document"
msgstr "este documento"
@@ -40579,6 +41183,9 @@ msgstr ""
msgid "user avatar"
msgstr "avatar do usuário"
+msgid "user namespace cannot be the parent of another namespace"
+msgstr ""
+
msgid "user preferences"
msgstr "preferências do usuário"
@@ -40616,7 +41223,7 @@ msgid "view the source"
msgstr ""
msgid "visibility"
-msgstr ""
+msgstr "visibilidade"
msgid "vulnerability"
msgid_plural "vulnerabilities"
@@ -40671,3 +41278,9 @@ msgstr ""
msgid "your settings"
msgstr ""
+msgid "{group}"
+msgstr ""
+
+msgid "{project}"
+msgstr ""
+
diff --git a/locale/pt_PT/gitlab.po b/locale/pt_PT/gitlab.po
index 17452860e76..725dd521ecc 100644
--- a/locale/pt_PT/gitlab.po
+++ b/locale/pt_PT/gitlab.po
@@ -14,10 +14,7 @@ msgstr ""
"X-Crowdin-Language: pt-PT\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-09-01 22:34\n"
-
-msgid " %{name}, confirm your email address now! "
-msgstr ""
+"PO-Revision-Date: 2021-10-04 20:22\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -92,6 +89,16 @@ msgstr ""
msgid "#general, #development"
msgstr ""
+msgid "%d Alert"
+msgid_plural "%d Alerts"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d Alert:"
+msgid_plural "%d Alerts:"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d Approval"
msgid_plural "%d Approvals"
msgstr[0] ""
@@ -455,8 +462,11 @@ msgstr ""
msgid "%{code_open}Protected:%{code_close} Only exposed to protected branches or tags."
msgstr ""
-msgid "%{commit_author_link} authored %{commit_timeago}"
-msgstr "%{commit_author_link} autorizou %{commit_timeago}"
+msgid "%{commit_author_link} authored %{commit_authored_timeago}"
+msgstr ""
+
+msgid "%{commit_author_link} authored %{commit_authored_timeago} and %{commit_committer_avatar} %{commit_committer_link} committed %{commit_committer_timeago}"
+msgstr ""
msgid "%{completedCount} completed weight"
msgstr ""
@@ -549,6 +559,15 @@ msgstr ""
msgid "%{doc_link_start}Advanced search%{doc_link_end} is enabled."
msgstr ""
+msgid "%{docs_link_start}Learn about visibility levels.%{docs_link_end}"
+msgstr ""
+
+msgid "%{docs_link_start}What is Large File Storage?%{docs_link_end}"
+msgstr ""
+
+msgid "%{docs_link_start}What is two-factor authentication?%{docs_link_end}"
+msgstr ""
+
msgid "%{due_date} (Past due)"
msgstr ""
@@ -621,9 +640,6 @@ msgstr "%{issuableType} será removido! Tens a certeza?"
msgid "%{issueType} actions"
msgstr ""
-msgid "%{issuesCount} issues with a limit of %{maxIssueCount}"
-msgstr ""
-
msgid "%{issuesSize} with a limit of %{maxIssueCount}"
msgstr ""
@@ -681,6 +697,12 @@ msgstr ""
msgid "%{label_for_message} unavailable"
msgstr "%{label_for_message} indisponível"
+msgid "%{learn_more_link}."
+msgstr ""
+
+msgid "%{lessThan} 1 hour"
+msgstr ""
+
msgid "%{lets_encrypt_link_start}Let's Encrypt%{lets_encrypt_link_end} is a free, automated, and open certificate authority (CA) that issues digital certificates to enable HTTPS (SSL/TLS) for sites."
msgstr ""
@@ -693,15 +715,15 @@ msgstr "%{level_name} não é permitido uma vez que o projeto de origem do fork
msgid "%{link_start}Learn more%{link_end} about roles."
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
-msgstr ""
-
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
msgstr ""
msgid "%{link_start}Start the title with %{draft_snippet}%{link_end} to prevent a merge request that is a work in progress from being merged before it's ready."
msgstr ""
+msgid "%{link_start}What information does GitLab Inc. collect?%{link_end}"
+msgstr ""
+
msgid "%{listToShow}, and %{awardsListLength} more"
msgstr ""
@@ -854,7 +876,7 @@ msgid_plural "%{securityScanner} results are not available because a pipeline ha
msgstr[0] ""
msgstr[1] ""
-msgid "%{service_ping_link_start}Learn more%{service_ping_link_end} about what information is shared with GitLab Inc."
+msgid "%{service_ping_link_start}What information is shared with GitLab Inc.?%{service_ping_link_end}"
msgstr ""
msgid "%{size} %{unit}"
@@ -890,6 +912,9 @@ msgstr ""
msgid "%{state} epics"
msgstr "%{state} épicos"
+msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
+msgstr ""
+
msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
msgstr ""
@@ -949,11 +974,6 @@ msgstr ""
msgid "%{template_project_id} is unknown or invalid"
msgstr ""
-msgid "%{text} %{files}"
-msgid_plural "%{text} %{files} files"
-msgstr[0] "%{text} %{files}"
-msgstr[1] "%{text} %{files} ficheiros"
-
msgid "%{text} is available"
msgstr "%{text} está disponível"
@@ -1038,9 +1058,6 @@ msgstr ""
msgid "%{wildcards_link_start}Wildcards%{wildcards_link_end} such as %{code_tag_start}v*%{code_tag_end} or %{code_tag_start}*-release%{code_tag_end} are supported."
msgstr ""
-msgid "&lt; 1 hour"
-msgstr ""
-
msgid "'%{data}' at %{location} does not match format: %{format}"
msgstr ""
@@ -1124,9 +1141,6 @@ msgstr ""
msgid "(we need your current password to confirm your changes)"
msgstr ""
-msgid "* * * * *"
-msgstr ""
-
msgid "+ %{amount} more"
msgstr ""
@@ -1193,10 +1207,10 @@ msgstr "- mostrar menos"
msgid "."
msgstr ""
-msgid "0 bytes"
+msgid "/"
msgstr ""
-msgid "0 for unlimited, only effective with remote storage enabled."
+msgid "0 bytes"
msgstr ""
msgid "0t1DgySidms"
@@ -1326,6 +1340,9 @@ msgstr "10-19 contribuições"
msgid "1000+"
msgstr ""
+msgid "192.168.0.0/24"
+msgstr ""
+
msgid "1st contribution!"
msgstr "1ª contribuição!"
@@ -1479,9 +1496,6 @@ msgstr ""
msgid "A plain HTML site that uses Netlify for CI/CD instead of GitLab, but still with all the other great GitLab features"
msgstr ""
-msgid "A plain-text response to show to clients that hit the rate limit."
-msgstr ""
-
msgid "A platform value can be web, mob or app."
msgstr ""
@@ -1563,7 +1577,7 @@ msgstr ""
msgid "APIFuzzing|Configure HTTP basic authentication values. Other authentication methods are supported. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
+msgid "APIFuzzing|Customize your project's API fuzzing configuration options and copy the code snippet to your .gitlab-ci.yml file to apply any changes. Note that this tool does not reflect or update your .gitlab-ci.yml file automatically. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
msgstr ""
msgid "APIFuzzing|Enable authentication"
@@ -1626,9 +1640,6 @@ msgstr ""
msgid "APIFuzzing|To prevent a security leak, authentication info must be added as a %{ciVariablesLinkStart}CI variable%{ciVariablesLinkEnd}. As a user with maintainer access rights, you can manage CI variables in the %{ciSettingsLinkStart}Settings%{ciSettingsLinkEnd} area."
msgstr ""
-msgid "APIFuzzing|Use this tool to generate API fuzzing configuration YAML to copy into your .gitlab-ci.yml file. This tool does not reflect or update your .gitlab-ci.yml file automatically."
-msgstr ""
-
msgid "APIFuzzing|Username for basic authentication"
msgstr ""
@@ -1680,9 +1691,6 @@ msgstr "Relatórios de abuso"
msgid "Abuse reports notification email"
msgstr ""
-msgid "Abuse reports will be sent to this address if it is set. Abuse reports are always available in the admin area."
-msgstr ""
-
msgid "Accept invitation"
msgstr "Aceitar convite"
@@ -1719,12 +1727,18 @@ msgstr "Acesso proibido. Verifica o teu nível de acesso."
msgid "Access granted"
msgstr ""
+msgid "Access key ID"
+msgstr ""
+
msgid "Access requests"
msgstr ""
msgid "Access to '%{classification_label}' not allowed"
msgstr "Acesso a(ao) '%{classification_label}' não permitido"
+msgid "Access tokens expire after 2 hours. A refresh token may be used at any time to generate a new access token. Non-expiring access tokens are deprecated. Clear this setting to enable backward compatibility."
+msgstr ""
+
msgid "AccessDropdown|Deploy Keys"
msgstr ""
@@ -2037,6 +2051,9 @@ msgstr "Adicionar nova aplicação"
msgid "Add new directory"
msgstr "Adicionar novo diretório"
+msgid "Add new service account"
+msgstr ""
+
msgid "Add or remove previously merged commits"
msgstr ""
@@ -2274,6 +2291,9 @@ msgstr ""
msgid "AdminArea|Features"
msgstr ""
+msgid "AdminArea|Get security updates from GitLab and stay up to date"
+msgstr ""
+
msgid "AdminArea|Groups"
msgstr ""
@@ -2313,6 +2333,12 @@ msgstr ""
msgid "AdminArea|Reporter"
msgstr ""
+msgid "AdminArea|Sign up for the GitLab Security Newsletter to get notified for security updates."
+msgstr ""
+
+msgid "AdminArea|Sign up for the GitLab newsletter"
+msgstr ""
+
msgid "AdminArea|Stop all jobs"
msgstr "Parar todos os trabalhos"
@@ -2382,9 +2408,15 @@ msgstr ""
msgid "AdminSettings|Disable public access to Pages sites"
msgstr ""
+msgid "AdminSettings|Display a banner on merge requests in projects with no pipelines to initiate steps to add a .gitlab-ci.yml file."
+msgstr ""
+
msgid "AdminSettings|Domain verification is an essential security measure for public GitLab sites. Users are required to demonstrate they control a domain before it is enabled. %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "AdminSettings|Enable pipeline suggestion banner"
+msgstr ""
+
msgid "AdminSettings|Enable shared runners for new projects"
msgstr "Ativar executadores compartilhados aos novos projetos"
@@ -2856,10 +2888,10 @@ msgstr ""
msgid "Admin|Quarterly reconciliation will occur on %{qrtlyDate}"
msgstr ""
-msgid "Admin|The number of max seats used for your namespace is currently exceeding the number of seats in your subscription. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgid "Admin|The number of max seats in your namespace exceeds the number of seats in your subscription. On %{qrtlyDate}, quarterly reconciliation occurs and you are automatically billed a prorated amount for the overage. No action is needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice. For more information about the timing of the invoicing process, view the documentation."
msgstr ""
-msgid "Admin|The number of maximum users for your instance is currently exceeding the number of users in license. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgid "Admin|The number of max users in your instance exceeds the number of users in your license. On %{qrtlyDate}, quarterly reconciliation occurs and you are automatically billed a prorated amount for the overage. No action is needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice. For more information about the timing of the invoicing process, view the documentation."
msgstr ""
msgid "Admin|View pending user approvals"
@@ -2880,9 +2912,6 @@ msgstr ""
msgid "Advanced export options"
msgstr ""
-msgid "Advanced permissions, Large File Storage and Two-Factor authentication settings."
-msgstr "Permissões avançadas, Armazenamento de Ficheiro Grandes e definições de autenticação de Dois Fatores."
-
msgid "After a successful password update you will be redirected to login screen."
msgstr "Após uma atualização de palavra-passe bem-sucedida, serás redirecionado à tela de início de sessão."
@@ -2901,13 +2930,14 @@ msgstr ""
msgid "After you've reviewed these contribution guidelines, you'll be all set to"
msgstr ""
+msgid "Akismet"
+msgstr ""
+
msgid "Akismet API Key"
msgstr ""
-msgid "Alert"
-msgid_plural "Alerts"
-msgstr[0] "Alerta"
-msgstr[1] "Alertas"
+msgid "Akismet helps prevent the creation of spam issues in public projects."
+msgstr ""
msgid "AlertManagement|Acknowledged"
msgstr ""
@@ -3263,6 +3293,9 @@ msgstr ""
msgid "All (default)"
msgstr ""
+msgid "All GitLab"
+msgstr ""
+
msgid "All Members"
msgstr "Todos os Membros"
@@ -3377,6 +3410,9 @@ msgstr ""
msgid "Allow this secondary node to replicate content on Object Storage"
msgstr ""
+msgid "Allow use of licensed EE features"
+msgstr ""
+
msgid "Allow users to dismiss the broadcast message"
msgstr ""
@@ -3452,9 +3488,6 @@ msgstr ""
msgid "Amazon authentication is not %{link_start}correctly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
-msgid "Amount of time (in hours) that users are allowed to skip forced configuration of two-factor authentication"
-msgstr "Quantidade de tempo (em horas) que os utilizadores podem ignorar a configuração forçada da autenticação de dois fatores"
-
msgid "An %{link_start}alert%{link_end} with the same fingerprint is already open. To change the status of this alert, resolve the linked alert."
msgstr ""
@@ -3515,12 +3548,6 @@ msgstr "Ocorreu um erro ao pré-visualizar o blob"
msgid "An error occurred when removing the label."
msgstr ""
-msgid "An error occurred when toggling the notification subscription"
-msgstr "Ocorreu um erro ao alternar a notificação de assinatura"
-
-msgid "An error occurred when updating the issue weight"
-msgstr "Ocorreu um erro ao atualizar o peso do problema"
-
msgid "An error occurred when updating the title"
msgstr ""
@@ -3569,6 +3596,9 @@ msgstr ""
msgid "An error occurred while enabling Service Desk."
msgstr "Ocorreu um erro ao ativar a Central de Serviços."
+msgid "An error occurred while fetching Markdown preview"
+msgstr ""
+
msgid "An error occurred while fetching ancestors"
msgstr ""
@@ -3599,9 +3629,6 @@ msgstr ""
msgid "An error occurred while fetching label colors."
msgstr "Ocorreu um erro ao buscar as cores das etiquetas."
-msgid "An error occurred while fetching markdown preview"
-msgstr "Ocorreu um erro ao buscar a pré-visualização do markdown"
-
msgid "An error occurred while fetching participants"
msgstr ""
@@ -3617,9 +3644,6 @@ msgstr "Ocorreu um erro ao buscar projetos de conclusão automática."
msgid "An error occurred while fetching reference"
msgstr ""
-msgid "An error occurred while fetching sidebar data"
-msgstr "Ocorreu um erro ao buscar os dados da barra lateral"
-
msgid "An error occurred while fetching tags. Retry the search."
msgstr ""
@@ -3695,6 +3719,9 @@ msgstr ""
msgid "An error occurred while loading merge requests."
msgstr ""
+msgid "An error occurred while loading projects."
+msgstr ""
+
msgid "An error occurred while loading the Needs tab."
msgstr ""
@@ -3929,12 +3956,6 @@ msgstr ""
msgid "Any Milestone"
msgstr ""
-msgid "Any branch"
-msgstr ""
-
-msgid "Any eligible user"
-msgstr ""
-
msgid "Any encrypted tokens"
msgstr "Quaisquer tokens encriptados"
@@ -3953,6 +3974,9 @@ msgstr ""
msgid "Any namespace"
msgstr "Qualquer espaço de nome"
+msgid "App Engine description and apps that are suitable for this deployment target"
+msgstr ""
+
msgid "App ID"
msgstr ""
@@ -4101,6 +4125,11 @@ msgstr "Aplicado"
msgid "Apply"
msgstr ""
+msgid "Apply %d suggestion"
+msgid_plural "Apply %d suggestions"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Apply a label"
msgstr ""
@@ -4110,13 +4139,10 @@ msgstr ""
msgid "Apply suggestion"
msgstr "Aplicar sugestão"
-msgid "Apply suggestions"
-msgstr ""
-
msgid "Apply template"
msgstr ""
-msgid "Apply this approval rule to any branch or a specific protected branch."
+msgid "Apply this approval rule to all branches or a specific protected branch."
msgstr ""
msgid "Applying"
@@ -4259,9 +4285,6 @@ msgstr ""
msgid "ApprovalSettings|Prevent editing approval rules in projects and merge requests."
msgstr ""
-msgid "ApprovalSettings|Prevent editing approval rules in projects and merge requests. "
-msgstr ""
-
msgid "ApprovalSettings|Remove all approvals when commits are added to the source branch."
msgstr ""
@@ -4277,6 +4300,9 @@ msgstr ""
msgid "ApprovalSettings|This setting is configured at the instance level and can only be changed by an administrator."
msgstr ""
+msgid "ApprovalSettings|This setting is configured in %{groupName} and can only be changed by an administrator or group owner."
+msgstr ""
+
msgid "ApprovalStatusTooltip|Adheres to separation of duties"
msgstr ""
@@ -4763,9 +4789,6 @@ msgstr ""
msgid "Authenticated API rate limit period in seconds"
msgstr ""
-msgid "Authenticated API request rate limit"
-msgstr ""
-
msgid "Authenticated API requests"
msgstr ""
@@ -4775,10 +4798,10 @@ msgstr ""
msgid "Authenticated Git LFS request rate limit"
msgstr ""
-msgid "Authenticated web rate limit period in seconds"
+msgid "Authenticated Git LFS requests"
msgstr ""
-msgid "Authenticated web request rate limit"
+msgid "Authenticated web rate limit period in seconds"
msgstr ""
msgid "Authenticated web requests"
@@ -5156,9 +5179,6 @@ msgstr ""
msgid "Below you will find all the groups that are public."
msgstr "Abaixo vais encontrar todos os grupos que são públicos."
-msgid "Beta"
-msgstr ""
-
msgid "Bi-weekly code coverage"
msgstr ""
@@ -5398,6 +5418,21 @@ msgstr "Blogue"
msgid "Board scope affects which issues are displayed for anyone who visits this board"
msgstr ""
+msgid "BoardNewEpic|Groups"
+msgstr ""
+
+msgid "BoardNewEpic|Loading groups"
+msgstr ""
+
+msgid "BoardNewEpic|No matching results"
+msgstr ""
+
+msgid "BoardNewEpic|Search groups"
+msgstr ""
+
+msgid "BoardNewEpic|Select a group"
+msgstr ""
+
msgid "BoardNewIssue|No matching results"
msgstr ""
@@ -5475,6 +5510,9 @@ msgstr ""
msgid "Boards|An error occurred while creating the list. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching child groups. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching group projects. Please try again."
msgstr ""
@@ -5807,6 +5845,9 @@ msgstr ""
msgid "Bulk update"
msgstr ""
+msgid "BulkImports|Re-import creates a new group. It does not sync with the existing group."
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -5816,6 +5857,9 @@ msgstr ""
msgid "BulkImport|From source group"
msgstr ""
+msgid "BulkImport|Group import history"
+msgstr ""
+
msgid "BulkImport|Import failed: Destination cannot be a subgroup of the source group. Change the destination and try again."
msgstr ""
@@ -5828,9 +5872,18 @@ msgstr ""
msgid "BulkImport|Importing the group failed"
msgstr ""
+msgid "BulkImport|Last imported to %{link}"
+msgstr ""
+
msgid "BulkImport|Name already exists."
msgstr ""
+msgid "BulkImport|New group"
+msgstr ""
+
+msgid "BulkImport|No history is available"
+msgstr ""
+
msgid "BulkImport|No parent"
msgstr ""
@@ -5843,6 +5896,9 @@ msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} matching filter \"%{filter}\" from %{link}"
msgstr ""
+msgid "BulkImport|Source group"
+msgstr ""
+
msgid "BulkImport|To new group"
msgstr ""
@@ -5852,6 +5908,9 @@ msgstr ""
msgid "BulkImport|You have no groups to import"
msgstr ""
+msgid "BulkImport|Your imported groups will appear here."
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -6094,6 +6153,9 @@ msgstr ""
msgid "Can be manually deployed to"
msgstr ""
+msgid "Can be overridden in each project."
+msgstr ""
+
msgid "Can create groups:"
msgstr ""
@@ -6196,6 +6258,9 @@ msgstr ""
msgid "Cancelling Preview"
msgstr ""
+msgid "Cannot assign a confidential epic to a non-confidential issue. Make the issue confidential and try again"
+msgstr ""
+
msgid "Cannot be assigned to other projects."
msgstr ""
@@ -6247,9 +6312,6 @@ msgstr ""
msgid "Cannot refer to a group %{timebox_type} by an internal id!"
msgstr ""
-msgid "Cannot set confidential epic for a non-confidential issue"
-msgstr ""
-
msgid "Cannot show preview. For previews on sketch files, they must have the file format introduced by Sketch version 43 and above."
msgstr "Não é possível mostrar a visualização. Para pré-visualizações em ficheiros sketch, eles devem ter o formato do ficheiro introduzido pela versão 43 do Sketch e acima."
@@ -6487,15 +6549,15 @@ msgstr "Verificar disponibilidade de recursos no plano do espaço de nomes"
msgid "Check out, review, and merge locally"
msgstr ""
-msgid "Check the %{docs_link_start}documentation%{docs_link_end}."
-msgstr "Verifica a %{docs_link_start}documentação%{docs_link_end}."
-
msgid "Check the current instance configuration "
msgstr ""
msgid "Check the elasticsearch.log file to debug why the migration was halted and make any changes before retrying the migration. When you fix the cause of the failure, click \"Retry migration\", and the migration will be scheduled to be retried in the background."
msgstr ""
+msgid "Check with your administrator."
+msgstr ""
+
msgid "Check your Docker images for known vulnerabilities."
msgstr ""
@@ -6526,6 +6588,9 @@ msgstr "A verificar a disponibilidade do nome de utilizador..."
msgid "Checkout"
msgstr ""
+msgid "Checkout|$%{selectedPlanPrice} per 10 GB storage per pack"
+msgstr ""
+
msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 minutes"
msgstr ""
@@ -6546,17 +6611,23 @@ msgstr ""
msgid "Checkout|%{name}'s GitLab subscription"
msgstr ""
-msgid "Checkout|%{selectedPlanText} plan"
+msgid "Checkout|%{name}'s storage subscription"
msgstr ""
-msgid "Checkout|%{startDate} - %{endDate}"
+msgid "Checkout|%{quantity} GB of storage"
msgstr ""
-msgid "Checkout|%{totalCiMinutes} CI minute"
-msgid_plural "Checkout|%{totalCiMinutes} CI minutes"
+msgid "Checkout|%{quantity} storage pack"
+msgid_plural "Checkout|%{quantity} storage packs"
msgstr[0] ""
msgstr[1] ""
+msgid "Checkout|%{selectedPlanText} plan"
+msgstr ""
+
+msgid "Checkout|%{startDate} - %{endDate}"
+msgstr ""
+
msgid "Checkout|%{totalCiMinutes} CI minutes"
msgstr ""
@@ -6632,6 +6703,9 @@ msgstr ""
msgid "Checkout|Failed to register credit card. Please try again."
msgstr ""
+msgid "Checkout|GB"
+msgstr ""
+
msgid "Checkout|GitLab group"
msgstr ""
@@ -6668,6 +6742,9 @@ msgstr ""
msgid "Checkout|State"
msgstr ""
+msgid "Checkout|Storage packs"
+msgstr ""
+
msgid "Checkout|Street address"
msgstr ""
@@ -6689,6 +6766,9 @@ msgstr ""
msgid "Checkout|Total minutes: %{quantity}"
msgstr ""
+msgid "Checkout|Total storage: %{quantity} GB"
+msgstr ""
+
msgid "Checkout|Users"
msgstr ""
@@ -6698,16 +6778,25 @@ msgstr ""
msgid "Checkout|Your organization"
msgstr ""
+msgid "Checkout|Your storage subscription has the same term as your main subscription, and the price is prorated accordingly."
+msgstr ""
+
msgid "Checkout|Your subscription will be applied to this group"
msgstr ""
msgid "Checkout|Zip code"
msgstr ""
+msgid "Checkout|a storage subscription"
+msgstr ""
+
msgid "Checkout|company or team"
msgstr ""
-msgid "Checkout|x 1,000 minutes per pack = %{strong}"
+msgid "Checkout|minutes"
+msgstr ""
+
+msgid "Checkout|x %{quantity} %{units} per pack ="
msgstr ""
msgid "Cherry-pick this commit"
@@ -7064,6 +7153,9 @@ msgstr ""
msgid "CloneIssue|Cannot clone issue to target project as it is pending deletion."
msgstr ""
+msgid "CloneIssue|Cannot clone issues of '%{issue_type}' type."
+msgstr ""
+
msgid "Cloned this issue to %{path_to_project}."
msgstr ""
@@ -7118,7 +7210,10 @@ msgstr ""
msgid "Closes this %{quick_action_target}."
msgstr ""
-msgid "Cloud licenses can not be removed."
+msgid "Cloud Functions description and apps that are suitable for this deployment target"
+msgstr ""
+
+msgid "Cloud Run description and apps that are suitable for this deployment target"
msgstr ""
msgid "Cluster"
@@ -7145,6 +7240,12 @@ msgstr ""
msgid "ClusterAgents|Access tokens"
msgstr ""
+msgid "ClusterAgents|Agent might not be connected to GitLab"
+msgstr ""
+
+msgid "ClusterAgents|Agent never connected to GitLab"
+msgstr ""
+
msgid "ClusterAgents|Alternative installation methods"
msgstr ""
@@ -7160,6 +7261,12 @@ msgstr ""
msgid "ClusterAgents|Configuration"
msgstr ""
+msgid "ClusterAgents|Connected"
+msgstr ""
+
+msgid "ClusterAgents|Connection status"
+msgstr ""
+
msgid "ClusterAgents|Copy token"
msgstr ""
@@ -7178,6 +7285,9 @@ msgstr ""
msgid "ClusterAgents|For alternative installation methods %{linkStart}go to the documentation%{linkEnd}."
msgstr ""
+msgid "ClusterAgents|For more troubleshooting information go to"
+msgstr ""
+
msgid "ClusterAgents|Go to the repository"
msgstr ""
@@ -7193,18 +7303,30 @@ msgstr ""
msgid "ClusterAgents|Integrate with the GitLab Agent"
msgstr ""
-msgid "ClusterAgents|Last used"
+msgid "ClusterAgents|Last connected %{timeAgo}."
+msgstr ""
+
+msgid "ClusterAgents|Last contact"
msgstr ""
msgid "ClusterAgents|Learn how to create an agent access token"
msgstr ""
+msgid "ClusterAgents|Make sure you are using a valid token."
+msgstr ""
+
msgid "ClusterAgents|Name"
msgstr ""
msgid "ClusterAgents|Never"
msgstr ""
+msgid "ClusterAgents|Never connected"
+msgstr ""
+
+msgid "ClusterAgents|Not connected"
+msgstr ""
+
msgid "ClusterAgents|Read more about getting started"
msgstr ""
@@ -7226,6 +7348,9 @@ msgstr ""
msgid "ClusterAgents|Select which Agent you want to install"
msgstr ""
+msgid "ClusterAgents|The Agent has not been connected in a long time. There might be a connectivity issue. Last contact was %{timeAgo}."
+msgstr ""
+
msgid "ClusterAgents|The GitLab Agent also requires %{linkStart}enabling the Agent Server%{linkEnd}"
msgstr ""
@@ -7253,9 +7378,6 @@ msgstr ""
msgid "ClusterAgents|You will need to create a token to connect to your agent"
msgstr ""
-msgid "ClusterAgent|This feature is only available for premium plans"
-msgstr ""
-
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -7445,9 +7567,6 @@ msgstr ""
msgid "ClusterIntegration|Create Kubernetes cluster"
msgstr "Criar cluster de Kubernetes"
-msgid "ClusterIntegration|Create a provision role on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the account and external ID above. %{startMoreInfoLink}More information%{endLink}"
-msgstr ""
-
msgid "ClusterIntegration|Create cluster on"
msgstr ""
@@ -7880,7 +7999,7 @@ msgstr ""
msgid "ClusterIntegration|Subnets"
msgstr ""
-msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provisioned role, first create one on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the above account and external IDs. %{startMoreInfoLink}More information%{endLink}"
+msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provisioned role, first create one on %{awsLinkStart}Amazon Web Services %{awsLinkEnd} using the above account and external IDs. %{moreInfoStart}More information%{moreInfoEnd}"
msgstr ""
msgid "ClusterIntegration|The Kubernetes certificate used to authenticate to the cluster."
@@ -8114,6 +8233,9 @@ msgstr ""
msgid "Collapse replies"
msgstr ""
+msgid "Collapse settings section"
+msgstr ""
+
msgid "Collapse sidebar"
msgstr ""
@@ -8132,6 +8254,9 @@ msgstr ""
msgid "Comma-separated list of email addresses."
msgstr ""
+msgid "Comma-separated list of users allowed to exceed the rate limit."
+msgstr ""
+
msgid "Comma-separated, e.g. '1.1.1.1, 2.2.2.0/24'"
msgstr ""
@@ -8452,6 +8577,9 @@ msgstr ""
msgid "Configure %{repository_checks_link_start}repository checks%{link_end} and %{housekeeping_link_start}housekeeping%{link_end} on repositories."
msgstr ""
+msgid "Configure CAPTCHAs, IP address limits, and other anti-spam measures."
+msgstr ""
+
msgid "Configure Dependency Scanning in `.gitlab-ci.yml` using the GitLab managed template. You can [add variable overrides](https://docs.gitlab.com/ee/user/application_security/dependency_scanning/#customizing-the-dependency-scanning-settings) to customize Dependency Scanning settings."
msgstr ""
@@ -8488,17 +8616,14 @@ msgstr ""
msgid "Configure a %{codeStart}.gitlab-webide.yml%{codeEnd} file in the %{codeStart}.gitlab%{codeEnd} directory to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
msgstr ""
-msgid "Configure existing installation"
-msgstr "Configurar instalação existente"
-
-msgid "Configure limit for notes created per minute by web and API requests."
+msgid "Configure advanced permissions, Large File Storage, and two-factor authentication settings."
msgstr ""
-msgid "Configure limits for Project/Group Import/Export."
+msgid "Configure approvals by authors and committers on all projects."
msgstr ""
-msgid "Configure limits for web and API requests."
-msgstr ""
+msgid "Configure existing installation"
+msgstr "Configurar instalação existente"
msgid "Configure paths to be protected by Rack Attack."
msgstr ""
@@ -8512,10 +8637,13 @@ msgstr ""
msgid "Configure settings for Advanced Search with Elasticsearch."
msgstr ""
+msgid "Configure specific limits for Files API requests that supersede the general user and IP rate limits."
+msgstr ""
+
msgid "Configure specific limits for Git LFS requests that supersede the general user and IP rate limits."
msgstr ""
-msgid "Configure specific limits for Packages API requests that supersede the general user and IP rate limits."
+msgid "Configure specific limits for deprecated API requests that supersede the general user and IP rate limits."
msgstr ""
msgid "Configure the %{link} integration."
@@ -8527,6 +8655,9 @@ msgstr ""
msgid "Configure the way a user creates a new account."
msgstr ""
+msgid "Configure via Merge Request"
+msgstr ""
+
msgid "Configure which lists are shown for anyone who visits this board"
msgstr ""
@@ -8995,6 +9126,9 @@ msgstr ""
msgid "Content parsed with %{link}."
msgstr ""
+msgid "ContentEditor|Table of Contents"
+msgstr ""
+
msgid "ContentEditor|You have to provide a renderMarkdown function or a custom serializer"
msgstr ""
@@ -9181,6 +9315,9 @@ msgstr ""
msgid "Copy link to chart"
msgstr ""
+msgid "Copy prefix"
+msgstr ""
+
msgid "Copy reference"
msgstr ""
@@ -9211,6 +9348,9 @@ msgstr ""
msgid "Copy value"
msgstr ""
+msgid "Corpus Management"
+msgstr ""
+
msgid "Corpus Management|Are you sure you want to delete the corpus?"
msgstr ""
@@ -9439,6 +9579,9 @@ msgstr ""
msgid "Create commit"
msgstr ""
+msgid "Create common files more quickly, and standardize their format."
+msgstr ""
+
msgid "Create confidential merge request"
msgstr ""
@@ -9472,6 +9615,9 @@ msgstr ""
msgid "Create issue"
msgstr ""
+msgid "Create issue to resolve all threads"
+msgstr ""
+
msgid "Create iteration"
msgstr ""
@@ -9526,6 +9672,9 @@ msgstr ""
msgid "Create new..."
msgstr ""
+msgid "Create or import your first project"
+msgstr ""
+
msgid "Create project"
msgstr ""
@@ -9883,7 +10032,7 @@ msgstr ""
msgid "Custom notification events"
msgstr ""
-msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notificationLinkStart} notification emails%{notificationLinkEnd}."
+msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notificationLinkStart}notification emails%{notificationLinkEnd}."
msgstr ""
msgid "Custom project templates"
@@ -10082,10 +10231,10 @@ msgid_plural "CycleAnalytics|Showing %{subjectFilterText} and %{selectedLabelsCo
msgstr[0] ""
msgstr[1] ""
-msgid "CycleAnalytics|Showing data for group '%{groupName}' and %{selectedProjectCount} projects from %{startDate} to %{endDate}"
+msgid "CycleAnalytics|Showing data for group '%{groupName}' and %{selectedProjectCount} projects from %{createdAfter} to %{createdBefore}"
msgstr ""
-msgid "CycleAnalytics|Showing data for group '%{groupName}' from %{startDate} to %{endDate}"
+msgid "CycleAnalytics|Showing data for group '%{groupName}' from %{createdAfter} to %{createdBefore}"
msgstr ""
msgid "CycleAnalytics|Stages"
@@ -10319,6 +10468,9 @@ msgstr ""
msgid "DastProfiles|Manage profiles"
msgstr ""
+msgid "DastProfiles|Manage site profiles"
+msgstr ""
+
msgid "DastProfiles|Minimum = 0 (no timeout enabled), Maximum = 2880 minutes"
msgstr ""
@@ -10394,6 +10546,9 @@ msgstr ""
msgid "DastProfiles|Scanner name"
msgstr ""
+msgid "DastProfiles|Schedule"
+msgstr ""
+
msgid "DastProfiles|Select branch"
msgstr ""
@@ -10463,7 +10618,7 @@ msgstr ""
msgid "DastProfiles|Website"
msgstr ""
-msgid "DastProfiles|You can either choose a passive scan or validate the target site in your chosen site profile. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
+msgid "DastProfiles|You can either choose a passive scan or validate the target site from the site profile management page. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
msgstr ""
msgid "DastProfiles|You cannot run an active scan against an unvalidated site."
@@ -10636,7 +10791,7 @@ msgstr ""
msgid "Days to merge"
msgstr ""
-msgid "Deactivate dormant users after 90 days of inactivity. Users can return to active status by signing in to their account. While inactive, a user is not counted as an active user in the instance."
+msgid "Deactivate dormant users after 90 days of inactivity"
msgstr ""
msgid "Dear Administrator,"
@@ -10723,10 +10878,10 @@ msgstr ""
msgid "Define a custom pattern with cron syntax"
msgstr ""
-msgid "Define approval settings."
+msgid "Define approval rules."
msgstr ""
-msgid "Define approval settings. %{linkStart}Learn more.%{linkEnd}"
+msgid "Define approval rules. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "Define custom rules for what constitutes spam, independent of Akismet"
@@ -10735,7 +10890,7 @@ msgstr ""
msgid "Define environments in the deploy stage(s) in %{code_open}.gitlab-ci.yml%{code_close} to track deployments here."
msgstr ""
-msgid "Define how approval rules are applied as a merge request moves toward completion."
+msgid "Define how approval rules are applied to merge requests."
msgstr ""
msgid "Definition"
@@ -10750,6 +10905,12 @@ msgstr ""
msgid "DelayedJobs|Are you sure you want to run %{job_name} immediately? This job will run automatically after it's timer finishes."
msgstr ""
+msgid "DelayedJobs|Are you sure you want to run %{job_name} immediately? This job will run automatically after its timer finishes."
+msgstr ""
+
+msgid "DelayedJobs|Run the delayed job now?"
+msgstr ""
+
msgid "DelayedJobs|Start now"
msgstr ""
@@ -11026,6 +11187,12 @@ msgstr ""
msgid "Dependency proxy image prefix"
msgstr ""
+msgid "DependencyProxy|Create a local proxy for storing frequently used upstream images. %{docLinkStart}Learn more%{docLinkEnd} about dependency proxies."
+msgstr ""
+
+msgid "DependencyProxy|Dependency Proxy"
+msgstr ""
+
msgid "DependencyProxy|Toggle Dependency Proxy"
msgstr ""
@@ -11266,6 +11433,9 @@ msgstr ""
msgid "Deployments"
msgstr ""
+msgid "Deployments to Google Kubernetes Engine can be "
+msgstr ""
+
msgid "Deployments|%{deployments} environment impacted."
msgid_plural "Deployments|%{deployments} environments impacted."
msgstr[0] ""
@@ -11295,6 +11465,9 @@ msgstr ""
msgid "Deployment|success"
msgstr ""
+msgid "Deprecated API rate limits"
+msgstr ""
+
msgid "Deprioritize label"
msgstr ""
@@ -11697,6 +11870,16 @@ msgstr ""
msgid "DiffsCompareBaseBranch|(base)"
msgstr ""
+msgid "Diffs|%d addition"
+msgid_plural "Diffs|%d additions"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Diffs|%d deletion"
+msgid_plural "Diffs|%d deletions"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Diffs|No file name available"
msgstr ""
@@ -11706,9 +11889,17 @@ msgstr ""
msgid "Diffs|Show all unchanged lines"
msgstr ""
+msgid "Diffs|Showing %{dropdownStart}%{count} changed file%{dropdownEnd}"
+msgid_plural "Diffs|Showing %{dropdownStart}%{count} changed files%{dropdownEnd}"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Diffs|Something went wrong while fetching diff lines."
msgstr ""
+msgid "Diffs|with %{additions} and %{deletions}"
+msgstr ""
+
msgid "Direct member"
msgstr ""
@@ -11834,9 +12025,6 @@ msgid_plural "Dismiss %d selected vulnerabilities as"
msgstr[0] ""
msgstr[1] ""
-msgid "Dismiss Value Stream Analytics introduction box"
-msgstr ""
-
msgid "Dismiss merge request promotion"
msgstr ""
@@ -12158,6 +12346,9 @@ msgstr ""
msgid "Edit issues"
msgstr ""
+msgid "Edit merge requests"
+msgstr ""
+
msgid "Edit public deploy key"
msgstr ""
@@ -12233,6 +12424,9 @@ msgstr ""
msgid "Elastic|None. Select projects to index."
msgstr ""
+msgid "Eligible users"
+msgstr ""
+
msgid "Email"
msgstr ""
@@ -12362,6 +12556,9 @@ msgstr ""
msgid "Enable"
msgstr ""
+msgid "Enable Amazon EKS integration"
+msgstr ""
+
msgid "Enable Auto DevOps"
msgstr ""
@@ -12395,6 +12592,9 @@ msgstr ""
msgid "Enable SSL verification"
msgstr ""
+msgid "Enable Service Ping"
+msgstr ""
+
msgid "Enable Snowplow tracking"
msgstr ""
@@ -12425,6 +12625,9 @@ msgstr ""
msgid "Enable authenticated Git LFS request rate limit"
msgstr ""
+msgid "Enable authenticated web request rate limit"
+msgstr ""
+
msgid "Enable authentication"
msgstr ""
@@ -12485,7 +12688,7 @@ msgstr ""
msgid "Enable or disable the Pseudonymizer data collection."
msgstr ""
-msgid "Enable or disable version check and service ping."
+msgid "Enable or disable version check and Service Ping."
msgstr ""
msgid "Enable protected paths rate limit"
@@ -12497,18 +12700,12 @@ msgstr ""
msgid "Enable reCAPTCHA"
msgstr ""
-msgid "Enable reCAPTCHA for login"
-msgstr ""
-
-msgid "Enable reCAPTCHA, Invisible Captcha, Akismet and set IP limits. For reCAPTCHA, we currently only support %{recaptcha_v2_link_start}v2%{recaptcha_v2_link_end}"
+msgid "Enable reCAPTCHA for login."
msgstr ""
msgid "Enable repository checks"
msgstr ""
-msgid "Enable service ping"
-msgstr ""
-
msgid "Enable shared runners for all projects and subgroups in this group."
msgstr ""
@@ -12530,7 +12727,10 @@ msgstr ""
msgid "Enable unauthenticated API request rate limit"
msgstr ""
-msgid "Enable unauthenticated request rate limit"
+msgid "Enable unauthenticated web request rate limit"
+msgstr ""
+
+msgid "Enable user deactivation emails"
msgstr ""
msgid "Enable version check"
@@ -12566,9 +12766,6 @@ msgstr ""
msgid "Enabled sources for code import during project creation. OmniAuth must be configured for GitHub"
msgstr ""
-msgid "Enabling this will only make licensed EE features available to projects if the project namespace's plan includes the feature or if the project is public."
-msgstr ""
-
msgid "Encountered an error while rendering: %{err}"
msgstr ""
@@ -12617,9 +12814,6 @@ msgstr ""
msgid "Enter Admin Mode"
msgstr ""
-msgid "Enter IP address range"
-msgstr ""
-
msgid "Enter a number"
msgstr ""
@@ -12632,9 +12826,6 @@ msgstr ""
msgid "Enter at least three characters to search"
msgstr ""
-msgid "Enter domain"
-msgstr ""
-
msgid "Enter in your Bitbucket Server URL and personal access token below"
msgstr ""
@@ -12821,9 +13012,6 @@ msgstr ""
msgid "Environments|Deployment %{status}"
msgstr ""
-msgid "Environments|Dismiss"
-msgstr ""
-
msgid "Environments|Enable review app"
msgstr ""
@@ -12836,9 +13024,6 @@ msgstr ""
msgid "Environments|Environments are places where code gets deployed, such as staging or production."
msgstr "Os Ambientes são lugares onde o código é implantado, como preparação ou produção."
-msgid "Environments|Help us improve environments"
-msgstr ""
-
msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
msgstr ""
@@ -12875,6 +13060,9 @@ msgstr ""
msgid "Environments|Note that this action will stop the environment, but it will %{emphasisStart}not%{emphasisEnd} have an effect on any existing deployment due to no “stop environment action†being defined in the %{ciConfigLinkStart}.gitlab-ci.yml%{ciConfigLinkEnd} file."
msgstr ""
+msgid "Environments|Open"
+msgstr ""
+
msgid "Environments|Open live environment"
msgstr ""
@@ -12914,9 +13102,6 @@ msgstr ""
msgid "Environments|Stopping %{environmentName}"
msgstr ""
-msgid "Environments|Take the survey"
-msgstr ""
-
msgid "Environments|There was an error fetching the logs. Please try again."
msgstr ""
@@ -12938,9 +13123,6 @@ msgstr ""
msgid "Environments|You don't have any environments right now"
msgstr ""
-msgid "Environments|Your feedback helps GitLab make environments better for you and other users. Participate and enter a sweepstake to win a USD 30 gift card."
-msgstr ""
-
msgid "Environments|by %{avatar}"
msgstr ""
@@ -13223,7 +13405,7 @@ msgstr ""
msgid "Error parsing CSV file. Please make sure it has"
msgstr ""
-msgid "Error rendering markdown preview"
+msgid "Error rendering Markdown preview"
msgstr ""
msgid "Error saving label update."
@@ -13271,6 +13453,9 @@ msgstr ""
msgid "Error: %{error_message}"
msgstr ""
+msgid "Error: Couldn't load some or all of the changes."
+msgstr ""
+
msgid "Error: No AWS credentials were supplied"
msgstr ""
@@ -13304,6 +13489,9 @@ msgstr ""
msgid "ErrorTracking|Enable error tracking"
msgstr ""
+msgid "ErrorTracking|Error tracking backend"
+msgstr ""
+
msgid "ErrorTracking|If you self-host Sentry, enter your Sentry instance's full URL. If you use Sentry's hosted solution, enter https://sentry.io"
msgstr ""
@@ -13337,6 +13525,12 @@ msgstr ""
msgid "Escalation policies must have at least one rule"
msgstr ""
+msgid "EscalationPolicies|%{clockIcon} IF alert is not %{alertStatus} in %{minutes}"
+msgstr ""
+
+msgid "EscalationPolicies|%{notificationIcon} THEN %{doAction} %{forScheduleOrUser}"
+msgstr ""
+
msgid "EscalationPolicies|+ Add an additional rule"
msgstr ""
@@ -13379,13 +13573,13 @@ msgstr ""
msgid "EscalationPolicies|Escalation policies"
msgstr ""
-msgid "EscalationPolicies|Escalation rules"
+msgid "EscalationPolicies|Escalation policy %{obstacle} in Project %{project}"
msgstr ""
-msgid "EscalationPolicies|Failed to load oncall-schedules"
+msgid "EscalationPolicies|Escalation rules"
msgstr ""
-msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} %{then} THEN %{doAction} %{scheduleOrUser}"
+msgid "EscalationPolicies|Failed to load oncall-schedules"
msgstr ""
msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} minutes"
@@ -13463,18 +13657,36 @@ msgstr ""
msgid "Every %{action} attempt has failed: %{job_error_message}. Please try again."
msgstr ""
+msgid "Every 3 months"
+msgstr ""
+
+msgid "Every 3 months on the %{day} at %{time} %{timezone}"
+msgstr ""
+
+msgid "Every 6 months"
+msgstr ""
+
+msgid "Every 6 months on the %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Every day"
msgstr ""
msgid "Every day (at %{time})"
msgstr ""
+msgid "Every day at %{time} %{timezone}"
+msgstr ""
+
msgid "Every month"
msgstr ""
msgid "Every month (Day %{day} at %{time})"
msgstr ""
+msgid "Every month on the %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Every three months"
msgstr ""
@@ -13489,6 +13701,15 @@ msgstr[1] ""
msgid "Every week (%{weekday} at %{time})"
msgstr ""
+msgid "Every week on %{day} at %{time} %{timezone}"
+msgstr ""
+
+msgid "Every year"
+msgstr ""
+
+msgid "Every year on %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Everyone"
msgstr ""
@@ -13525,9 +13746,6 @@ msgstr ""
msgid "Exactly one of %{attributes} is required"
msgstr ""
-msgid "Example: %{ip_address}. %{read_more_link}."
-msgstr ""
-
msgid "Example: @sub\\.company\\.com$"
msgstr ""
@@ -13594,13 +13812,13 @@ msgstr ""
msgid "Expand pipeline"
msgstr ""
-msgid "Expand sidebar"
+msgid "Expand settings section"
msgstr ""
-msgid "Expected documents: %{expected_documents}"
+msgid "Expand sidebar"
msgstr ""
-msgid "Experienced"
+msgid "Expected documents: %{expected_documents}"
msgstr ""
msgid "ExperimentSubject|Must have exactly one of User, Namespace, or Project."
@@ -13885,9 +14103,6 @@ msgstr ""
msgid "Failed to load related branches"
msgstr ""
-msgid "Failed to load sidebar lock status"
-msgstr ""
-
msgid "Failed to load stacktrace."
msgstr ""
@@ -14312,6 +14527,9 @@ msgstr ""
msgid "Files"
msgstr ""
+msgid "Files API Rate Limits"
+msgstr ""
+
msgid "Files breadcrumb"
msgstr ""
@@ -15311,6 +15529,9 @@ msgstr ""
msgid "GitLab group: %{source_link}"
msgstr ""
+msgid "GitLab informs you if a new version is available."
+msgstr ""
+
msgid "GitLab is a complete DevOps platform, delivered as a single application, fundamentally changing the way Development, Security, and Ops teams collaborate"
msgstr ""
@@ -15326,7 +15547,7 @@ msgstr ""
msgid "GitLab is open source software to collaborate on code."
msgstr ""
-msgid "GitLab is undergoing maintenance and is operating in a read-only mode."
+msgid "GitLab is undergoing maintenance and is operating in read-only mode."
msgstr ""
msgid "GitLab member or Email address"
@@ -15338,9 +15559,6 @@ msgstr ""
msgid "GitLab project export"
msgstr ""
-msgid "GitLab restart is required to apply changes."
-msgstr ""
-
msgid "GitLab single sign-on URL"
msgstr ""
@@ -15356,9 +15574,6 @@ msgstr ""
msgid "GitLab version"
msgstr ""
-msgid "GitLab will inform you if a new version is available."
-msgstr ""
-
msgid "GitLab will run a background job that will produce pseudonymized CSVs of the GitLab database that will be uploaded to your configured object storage directory."
msgstr "O GitLab executará um trabalho em segundo plano que produzirá CSVs com pseudónimos da base de dados do GitLab que serão enviados no diretório de armazenamento de objetos configurados."
@@ -15623,9 +15838,21 @@ msgstr ""
msgid "Go to snippets"
msgstr ""
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check 'Allowed domains for sign-ups'."
+msgstr ""
+
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check 'Email restrictions for sign-ups'."
+msgstr ""
+
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check the 'Domain denylist'."
+msgstr ""
+
msgid "Go to the activity feed"
msgstr ""
+msgid "Go to the group’s 'Settings &gt; General' page, and check 'Restrict membership by email domain'."
+msgstr ""
+
msgid "Go to the milestone list"
msgstr ""
@@ -15662,6 +15889,12 @@ msgstr ""
msgid "Goal of the changes and what reviewers should be aware of"
msgstr ""
+msgid "Google Cloud"
+msgstr ""
+
+msgid "Google Cloud offers several deployment targets. Select the one most suitable for your project."
+msgstr ""
+
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
@@ -15746,9 +15979,6 @@ msgstr ""
msgid "Group ID"
msgstr ""
-msgid "Group ID: %{group_id}"
-msgstr ""
-
msgid "Group Owner must have signed in with SAML before enabling Group Managed Accounts"
msgstr ""
@@ -15923,6 +16153,12 @@ msgstr ""
msgid "GroupImport|Unable to process group import file"
msgstr ""
+msgid "GroupPage|Copy group ID"
+msgstr ""
+
+msgid "GroupPage|Group ID: %{group_id}"
+msgstr ""
+
msgid "GroupRoadmap|%{dateWord} – No end date"
msgstr ""
@@ -15977,6 +16213,9 @@ msgstr ""
msgid "GroupRoadmap|Within 3 years"
msgstr ""
+msgid "GroupSAML|\"persistent\" recommended"
+msgstr ""
+
msgid "GroupSAML|%{strongOpen}Warning%{strongClose} - Enabling %{linkStart}SSO enforcement%{linkEnd} can reduce security risks."
msgstr ""
@@ -16109,6 +16348,9 @@ msgstr ""
msgid "GroupSAML|To be able to prohibit outer forks, you first need to enforce dedicate group managed accounts."
msgstr ""
+msgid "GroupSAML|Use SAML group links to manage group membership using SAML."
+msgstr ""
+
msgid "GroupSAML|Valid SAML Response"
msgstr ""
@@ -16121,13 +16363,10 @@ msgstr ""
msgid "GroupSAML|as %{access_level}"
msgstr ""
-msgid "GroupSAML|must match stored NameID of \"%{extern_uid}\" as we use this to identify users. If the NameID changes users will be unable to sign in."
-msgstr ""
-
-msgid "GroupSAML|should be \"persistent\""
+msgid "GroupSAML|must match stored NameID of \"%{extern_uid}\" to identify user and allow sign in"
msgstr ""
-msgid "GroupSAML|should be a random persistent ID, emails are discouraged"
+msgid "GroupSAML|recommend persistent ID instead of email"
msgstr ""
msgid "GroupSelect|No matching results"
@@ -16142,9 +16381,15 @@ msgstr ""
msgid "GroupSettings|Allow project access token creation"
msgstr ""
+msgid "GroupSettings|Applied to all subgroups unless overridden by a group owner. Groups already added to the project lose access."
+msgstr ""
+
msgid "GroupSettings|Auto DevOps pipeline was updated for the group"
msgstr ""
+msgid "GroupSettings|Available only on the top-level group. Applies to all subgroups. Groups already shared with a group outside %{group} are still shared unless removed manually."
+msgstr ""
+
msgid "GroupSettings|Badges"
msgstr ""
@@ -16196,6 +16441,9 @@ msgstr ""
msgid "GroupSettings|New runners registration token has been generated!"
msgstr ""
+msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgstr ""
+
msgid "GroupSettings|Pipeline settings was updated for the group"
msgstr ""
@@ -16208,12 +16456,15 @@ msgstr ""
msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
-msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups."
+msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups"
msgstr ""
msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
msgstr ""
+msgid "GroupSettings|Prevents group members from being notified if the group is mentioned."
+msgstr ""
+
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
msgstr ""
@@ -16250,21 +16501,6 @@ msgstr ""
msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}."
msgstr ""
-msgid "GroupSettings|This setting is only available on the top-level group and it applies to all subgroups. Groups that have already been shared with a group outside %{group} will still be shared, and this access will have to be revoked manually."
-msgstr ""
-
-msgid "GroupSettings|This setting will be applied to all subgroups unless overridden by a group owner. Groups that already have access to the project will continue to have access unless removed manually."
-msgstr ""
-
-msgid "GroupSettings|This setting will override user notification preferences for all members of the group, subgroups, and projects."
-msgstr ""
-
-msgid "GroupSettings|This setting will prevent group members from being notified if the group is mentioned."
-msgstr ""
-
-msgid "GroupSettings|This setting will prevent group members from forking projects outside of the group."
-msgstr ""
-
msgid "GroupSettings|Transfer group"
msgstr ""
@@ -16382,7 +16618,7 @@ msgstr ""
msgid "GroupsNew|No import options available"
msgstr ""
-msgid "GroupsNew|Not all related objects are migrated, as %{docs_link_start}described here%{docs_link_end}. Please %{feedback_link_start}leave feedback%{feedback_link_end} on this feature."
+msgid "GroupsNew|Not all related objects are migrated. %{docs_link_start}More info%{docs_link_end}."
msgstr ""
msgid "GroupsNew|Personal access token"
@@ -16514,15 +16750,27 @@ msgstr ""
msgid "Hello %{name},"
msgstr ""
-msgid "Hello there"
-msgstr ""
-
msgid "Hello, %{name}!"
msgstr ""
msgid "Hello, %{username}!"
msgstr ""
+msgid "HelloMessage|%{handshake_emoji} Contribute to GitLab: %{contribute_link}"
+msgstr ""
+
+msgid "HelloMessage|%{magnifier_emoji} Create a new GitLab issue: %{new_issue_link}"
+msgstr ""
+
+msgid "HelloMessage|%{rocket_emoji} We like your curiosity! Help us improve GitLab by joining the team: %{jobs_page_link}"
+msgstr ""
+
+msgid "HelloMessage|Does this page need fixes or improvements? Open an issue or contribute a merge request to help make GitLab more lovable. At GitLab, everyone can contribute!"
+msgstr ""
+
+msgid "HelloMessage|Welcome to GitLab!"
+msgstr ""
+
msgid "Help"
msgstr ""
@@ -16532,13 +16780,10 @@ msgstr ""
msgid "Helps prevent bots from creating accounts."
msgstr ""
-msgid "Helps prevent bots from creating issues"
+msgid "Helps prevent bots from creating issues."
msgstr ""
-msgid "Helps prevent malicious users hide their activity"
-msgstr ""
-
-msgid "Helps reduce request volume (e.g. from crawlers or abusive bots)"
+msgid "Helps prevent malicious users hide their activity."
msgstr ""
msgid "Helps reduce request volume (for example, from crawlers or abusive bots)"
@@ -16662,6 +16907,12 @@ msgstr ""
msgid "Housekeeping, export, path, transfer, remove, archive."
msgstr ""
+msgid "How do I configure Akismet?"
+msgstr ""
+
+msgid "How do I configure it?"
+msgstr ""
+
msgid "How do I configure runners?"
msgstr ""
@@ -16683,19 +16934,25 @@ msgstr ""
msgid "How do I set up this service?"
msgstr ""
+msgid "How do I use a web terminal?"
+msgstr ""
+
+msgid "How do I use file templates?"
+msgstr ""
+
msgid "How it works"
msgstr ""
msgid "How many days need to pass between marking entity for deletion and actual removing it."
msgstr ""
-msgid "How many seconds an IP will be counted towards the limit"
+msgid "How many seconds an IP counts toward the IP address limit."
msgstr ""
-msgid "I accept the %{terms_link}"
+msgid "How the job limiter handles jobs exceeding the thresholds specified below. The 'track' mode only logs the jobs. The 'compress' mode compresses the jobs and raises an exception if the compressed size exceeds the limit."
msgstr ""
-msgid "I accept the|Terms of Service and Privacy Policy"
+msgid "I accept the %{terms_link}"
msgstr ""
msgid "I forgot my password"
@@ -16779,13 +17036,16 @@ msgstr ""
msgid "IP Address"
msgstr ""
-msgid "IP expiration time"
+msgid "IP address expiration time"
msgstr ""
-msgid "IP subnet restriction only allowed for top-level groups"
+msgid "IP address restrictions"
+msgstr ""
+
+msgid "IP addresses per user"
msgstr ""
-msgid "IPs per user"
+msgid "IP subnet restriction only allowed for top-level groups"
msgstr ""
msgid "Identifier"
@@ -16800,6 +17060,9 @@ msgstr ""
msgid "If any indexed field exceeds this limit it will be truncated to this number of characters and the rest will not be indexed or searchable. This does not apply to repository and wiki indexing. Setting this to 0 means it is unlimited."
msgstr ""
+msgid "If blank, defaults to %{code_open}Retry later%{code_close}."
+msgstr ""
+
msgid "If blank, set allowable lifetime to %{instance_level_policy_in_words}, as defined by the instance admin. Once set, existing tokens for users in this group may be revoked."
msgstr ""
@@ -16851,6 +17114,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 did not initiate these sign-in attempts, please reach out to your administrator or enable two-factor authentication (2FA) on your account."
+msgstr ""
+
msgid "If you did not initiate this change, please contact your administrator immediately."
msgstr ""
@@ -16942,10 +17208,10 @@ msgstr ""
msgid "Import Projects from Gitea"
msgstr ""
-msgid "Import a project"
+msgid "Import an exported GitLab project"
msgstr ""
-msgid "Import an exported GitLab project"
+msgid "Import and export rate limits"
msgstr ""
msgid "Import failed due to a GitHub error: %{original}"
@@ -16957,12 +17223,18 @@ msgstr ""
msgid "Import from Jira"
msgstr ""
+msgid "Import group"
+msgstr ""
+
msgid "Import group from file"
msgstr ""
msgid "Import groups"
msgstr ""
+msgid "Import history"
+msgstr ""
+
msgid "Import in progress"
msgstr ""
@@ -17026,7 +17298,25 @@ msgstr ""
msgid "Import timed out. Import took longer than %{import_jobs_expiration} seconds"
msgstr ""
-msgid "Import/Export Rate Limits"
+msgid "ImportAProjectModal|Import from a project"
+msgstr ""
+
+msgid "ImportAProjectModal|Import members from another project"
+msgstr ""
+
+msgid "ImportAProjectModal|Import project members"
+msgstr ""
+
+msgid "ImportAProjectModal|Only project members (not group members) are imported, and they get the same permissions as the project you import from."
+msgstr ""
+
+msgid "ImportAProjectModal|Successfully imported"
+msgstr ""
+
+msgid "ImportAProjectModal|Unable to import project members"
+msgstr ""
+
+msgid "ImportAProjectModal|You're importing members to the %{strongStart}%{name}%{strongEnd} project."
msgstr ""
msgid "ImportButtons|Connect repositories from"
@@ -17079,7 +17369,7 @@ msgstr[1] ""
msgid "Importing..."
msgstr ""
-msgid "Import|A repository URL usually ends in a .git suffix, although this is not required. Double check to make sure your repository URL is correct."
+msgid "Import|There is not a valid Git repository at this URL. If your HTTP repository is not publicly accessible, verify your credentials."
msgstr ""
msgid "Improve customer support with Service Desk"
@@ -17088,9 +17378,6 @@ msgstr ""
msgid "Improves Git cloning performance."
msgstr ""
-msgid "In %{time_to_now}"
-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 ""
@@ -17376,7 +17663,7 @@ msgstr ""
msgid "InProductMarketing|Start a GitLab Ultimate trial today in less than one minute, no credit card required."
msgstr ""
-msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no CC required"
+msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no credit card required"
msgstr ""
msgid "InProductMarketing|Start a trial"
@@ -17415,7 +17702,7 @@ msgstr ""
msgid "InProductMarketing|Team up in GitLab for greater efficiency"
msgstr ""
-msgid "InProductMarketing|Team work makes the dream work"
+msgid "InProductMarketing|Team work makes the dream work"
msgstr ""
msgid "InProductMarketing|Test, create, deploy"
@@ -17996,6 +18283,9 @@ msgstr ""
msgid "Integrations|Create new issue in Jira"
msgstr ""
+msgid "Integrations|Create new issue in ZenTao"
+msgstr ""
+
msgid "Integrations|Default settings are inherited from the group level."
msgstr ""
@@ -18089,9 +18379,15 @@ msgstr ""
msgid "Integrations|Search Jira issues"
msgstr ""
+msgid "Integrations|Search ZenTao issues"
+msgstr ""
+
msgid "Integrations|Send notifications about project events to Unify Circuit."
msgstr ""
+msgid "Integrations|Send notifications about project events to a Unify Circuit conversation. %{docs_link}"
+msgstr ""
+
msgid "Integrations|Sign in to add namespaces"
msgstr ""
@@ -18131,6 +18427,9 @@ msgstr ""
msgid "Integrations|You've activated every integration 🎉"
msgstr ""
+msgid "Integrations|ZenTao issues display here when you create issues in your project in ZenTao."
+msgstr ""
+
msgid "Interactive mode"
msgstr ""
@@ -18158,9 +18457,6 @@ msgstr ""
msgid "Interval Pattern"
msgstr ""
-msgid "Introducing Value Stream Analytics"
-msgstr ""
-
msgid "Introducing Your DevOps Report"
msgstr ""
@@ -18257,6 +18553,12 @@ msgstr ""
msgid "Investigate vulnerability: %{title}"
msgstr ""
+msgid "Invisible Captcha"
+msgstr ""
+
+msgid "Invisible Captcha helps prevent the creation of spam accounts. It adds a honeypot field and time-sensitive form submission to the account signup form."
+msgstr ""
+
msgid "Invitation"
msgstr ""
@@ -18710,12 +19012,18 @@ msgstr ""
msgid "Issues"
msgstr ""
+msgid "Issues I've created"
+msgstr ""
+
msgid "Issues Rate Limits"
msgstr ""
msgid "Issues and merge requests"
msgstr ""
+msgid "Issues assigned to me"
+msgstr ""
+
msgid "Issues can be bugs, tasks or ideas to be discussed. Also, issues are searchable and filterable."
msgstr ""
@@ -18827,7 +19135,7 @@ msgstr ""
msgid "Iterations|Create cadence"
msgstr ""
-msgid "Iterations|Create your first iteration"
+msgid "Iterations|Create iteration"
msgstr ""
msgid "Iterations|Delete cadence"
@@ -18836,6 +19144,9 @@ msgstr ""
msgid "Iterations|Delete iteration cadence?"
msgstr ""
+msgid "Iterations|Delete iteration?"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -18869,12 +19180,18 @@ msgstr ""
msgid "Iterations|New iteration cadence"
msgstr ""
+msgid "Iterations|No closed iterations."
+msgstr ""
+
msgid "Iterations|No iteration cadences to show."
msgstr ""
msgid "Iterations|No iterations in cadence."
msgstr ""
+msgid "Iterations|No open iterations."
+msgstr ""
+
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
@@ -18905,6 +19222,9 @@ msgstr ""
msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
msgstr ""
+msgid "Iterations|This will remove the iteration from any issues that are assigned to it."
+msgstr ""
+
msgid "Iterations|Title"
msgstr ""
@@ -18920,15 +19240,9 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "I’m familiar with the basics of DevOps."
-msgstr ""
-
msgid "I’m joining my team who’s already on GitLab"
msgstr ""
-msgid "I’m not familiar with the basics of DevOps."
-msgstr ""
-
msgid "Jaeger URL"
msgstr ""
@@ -19193,6 +19507,9 @@ msgstr ""
msgid "Job"
msgstr ""
+msgid "Job %{jobName}"
+msgstr ""
+
msgid "Job Failed #%{build_id}"
msgstr ""
@@ -19783,9 +20100,6 @@ msgstr ""
msgid "Learn more in the"
msgstr ""
-msgid "Learn more in the|pipeline schedules documentation"
-msgstr ""
-
msgid "Learn more."
msgstr ""
@@ -19897,9 +20211,6 @@ msgstr ""
msgid "Leave Admin Mode"
msgstr ""
-msgid "Leave blank for no limit. Once set, existing personal access tokens may be revoked."
-msgstr ""
-
msgid "Leave edit mode? All unsaved changes will be lost."
msgstr ""
@@ -19945,10 +20256,10 @@ msgstr ""
msgid "LicenseCompliance|Acceptable license to be used in the project"
msgstr ""
-msgid "LicenseCompliance|Add a license"
+msgid "LicenseCompliance|Add license and related policy"
msgstr ""
-msgid "LicenseCompliance|Add license and related policy"
+msgid "LicenseCompliance|Add license policy"
msgstr ""
msgid "LicenseCompliance|Allow"
@@ -20038,6 +20349,9 @@ msgstr ""
msgid "LicenseManagement|Uncategorized"
msgstr ""
+msgid "Licensed Enterprise Edition features can be used if the project namespace's plan includes the feature, or if the project is public."
+msgstr ""
+
msgid "Licensed Features"
msgstr ""
@@ -20104,7 +20418,10 @@ msgstr ""
msgid "Limit namespaces and projects that can be indexed"
msgstr ""
-msgid "Limit sign in from multiple ips"
+msgid "Limit project size at a global, group, and project level. %{link_start}Learn more%{link_end}."
+msgstr ""
+
+msgid "Limit sign in from multiple IP addresses"
msgstr ""
msgid "Limit the number of concurrent operations this secondary site can run in the background."
@@ -20116,11 +20433,17 @@ msgstr ""
msgid "Limit the number of issues and epics per minute a user can create through web and API requests."
msgstr ""
+msgid "Limit the size of Sidekiq jobs stored in Redis."
+msgstr ""
+
msgid "Limited to showing %d event at most"
msgid_plural "Limited to showing %d events at most"
msgstr[0] ""
msgstr[1] ""
+msgid "Limiting mode"
+msgstr ""
+
msgid "Line changes"
msgstr ""
@@ -20190,9 +20513,6 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
-msgid "List of users to be excluded from the limit"
-msgstr ""
-
msgid "List options"
msgstr ""
@@ -20232,9 +20552,6 @@ msgstr ""
msgid "Loading functions timed out. Please reload the page to try again."
msgstr ""
-msgid "Loading issues"
-msgstr ""
-
msgid "Loading more"
msgstr ""
@@ -20526,6 +20843,9 @@ msgstr ""
msgid "Marked For Deletion At - %{deletion_time}"
msgstr ""
+msgid "Marked as ready. Merging is now allowed."
+msgstr ""
+
msgid "Marked this %{noun} as a draft."
msgstr ""
@@ -20598,52 +20918,22 @@ msgstr ""
msgid "Max 100,000 events"
msgstr ""
-msgid "Max 20 characters"
-msgstr ""
-
-msgid "Max Group Export Download requests per minute per user"
-msgstr ""
-
-msgid "Max Group Export requests per minute per user"
-msgstr ""
-
-msgid "Max Group Import requests per minute per user"
-msgstr ""
-
-msgid "Max Project Export Download requests per minute per user"
-msgstr ""
-
-msgid "Max Project Export requests per minute per user"
-msgstr ""
-
-msgid "Max Project Import requests per minute per user"
-msgstr ""
-
-msgid "Max authenticated API requests per period per user"
-msgstr ""
-
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
-msgid "Max authenticated web requests per period per user"
-msgstr ""
-
msgid "Max file size is 200 KB."
msgstr ""
-msgid "Max requests per minute per user"
-msgstr ""
-
msgid "Max role"
msgstr ""
msgid "Max session time"
msgstr ""
-msgid "Max unauthenticated requests per period per IP"
+msgid "MaxBuilds"
msgstr ""
-msgid "MaxBuilds"
+msgid "Maximum 20 characters"
msgstr ""
msgid "Maximum Conan package file size in bytes"
@@ -20679,6 +20969,12 @@ msgstr ""
msgid "Maximum attachment size (MB)"
msgstr ""
+msgid "Maximum authenticated API requests per rate limit period per user"
+msgstr ""
+
+msgid "Maximum authenticated web requests per rate limit period per user"
+msgstr ""
+
msgid "Maximum bulk request size (MiB)"
msgstr ""
@@ -20724,6 +21020,15 @@ msgstr ""
msgid "Maximum files in a diff"
msgstr ""
+msgid "Maximum group export download requests per minute"
+msgstr ""
+
+msgid "Maximum group export requests per minute"
+msgstr ""
+
+msgid "Maximum group import requests per minute"
+msgstr ""
+
msgid "Maximum import size"
msgstr ""
@@ -20760,7 +21065,7 @@ msgstr ""
msgid "Maximum number of projects."
msgstr ""
-msgid "Maximum number of unique IPs per user"
+msgid "Maximum number of unique IP addresses per user."
msgstr ""
msgid "Maximum page reached"
@@ -20769,12 +21074,24 @@ msgstr ""
msgid "Maximum page size"
msgstr ""
+msgid "Maximum project export download requests per minute"
+msgstr ""
+
+msgid "Maximum project export requests per minute"
+msgstr ""
+
+msgid "Maximum project import requests per minute"
+msgstr ""
+
msgid "Maximum push size"
msgstr ""
msgid "Maximum push size (MB)"
msgstr ""
+msgid "Maximum requests per minute"
+msgstr ""
+
msgid "Maximum running slices"
msgstr ""
@@ -20802,10 +21119,16 @@ msgstr ""
msgid "Maximum time between updates that a mirror can have when scheduled to synchronize."
msgstr ""
-msgid "Maximum time for web terminal websocket connection (in seconds). 0 for unlimited."
+msgid "Maximum time that users are allowed to skip the setup of two-factor authentication (in hours). Set to 0 (zero) to enforce at next sign in."
msgstr ""
-msgid "Maximum time that users are allowed to skip the setup of two-factor authentication (in hours). Set to 0 (zero) to enforce at next sign in."
+msgid "Maximum time, in seconds, for a web terminal websocket connection. 0 for unlimited."
+msgstr ""
+
+msgid "Maximum unauthenticated API requests per rate limit period per IP"
+msgstr ""
+
+msgid "Maximum unauthenticated web requests per rate limit period per IP"
msgstr ""
msgid "May"
@@ -20823,9 +21146,6 @@ msgstr ""
msgid "Medium vulnerabilities present"
msgstr ""
-msgid "Member lock"
-msgstr ""
-
msgid "Member since"
msgstr ""
@@ -20862,6 +21182,9 @@ msgstr ""
msgid "Members of a group may only view projects they have permission to access"
msgstr ""
+msgid "Membership"
+msgstr ""
+
msgid "Members|%{time} by %{user}"
msgstr ""
@@ -20922,9 +21245,6 @@ msgstr ""
msgid "Members|Expiration date updated successfully."
msgstr ""
-msgid "Members|Expired"
-msgstr ""
-
msgid "Members|Filter members"
msgstr ""
@@ -20940,9 +21260,6 @@ msgstr ""
msgid "Members|Membership"
msgstr ""
-msgid "Members|No expiration set"
-msgstr ""
-
msgid "Members|Remove \"%{groupName}\""
msgstr ""
@@ -20964,9 +21281,6 @@ msgstr ""
msgid "Members|Search invited"
msgstr ""
-msgid "Members|in %{time}"
-msgstr ""
-
msgid "Member|Deny access"
msgstr ""
@@ -21042,9 +21356,6 @@ msgstr ""
msgid "Merge request %{mr_link} was reviewed by %{mr_author}"
msgstr ""
-msgid "Merge request (MR) approvals"
-msgstr ""
-
msgid "Merge request analytics"
msgstr ""
@@ -21066,12 +21377,21 @@ msgstr ""
msgid "Merge requests"
msgstr ""
+msgid "Merge requests I've created"
+msgstr ""
+
msgid "Merge requests are a place to propose changes you've made to a project and discuss those changes with others"
msgstr ""
msgid "Merge requests are read-only in a secondary Geo node"
msgstr ""
+msgid "Merge requests assigned to me"
+msgstr ""
+
+msgid "Merge requests that I'm a reviewer"
+msgstr ""
+
msgid "Merge the branch and fix any conflicts that come up"
msgstr ""
@@ -21132,10 +21452,10 @@ msgstr ""
msgid "MergeRequests|An error occurred while saving the draft comment."
msgstr ""
-msgid "MergeRequests|Failed to squash. Should be done manually."
+msgid "MergeRequests|Create issue to resolve thread"
msgstr ""
-msgid "MergeRequests|Resolve this thread in a new issue"
+msgid "MergeRequests|Failed to squash. Should be done manually."
msgstr ""
msgid "MergeRequests|Saving the comment failed"
@@ -21949,6 +22269,9 @@ msgstr ""
msgid "MoveIssue|Cannot move issue to project it originates from!"
msgstr ""
+msgid "MoveIssue|Cannot move issues of '%{issue_type}' type."
+msgstr ""
+
msgid "Moved issue to %{label} column in the board."
msgstr ""
@@ -22074,6 +22397,15 @@ 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. To learn more about reducing storage capacity please visit our docs."
msgstr ""
+msgid "NamespaceUserCap|Pending users must be reviewed and approved by a group owner. Learn more about %{user_caps_link_start}User Caps%{link_end} and %{users_pending_approval_link_start}Users Pending Approval%{link_end}."
+msgstr ""
+
+msgid "NamespaceUserCap|View pending user approvals"
+msgstr ""
+
+msgid "NamespaceUserCap|Your group has reached its billable member limit"
+msgstr ""
+
msgid "Namespaces"
msgstr ""
@@ -22116,9 +22448,6 @@ msgstr ""
msgid "Network"
msgstr ""
-msgid "Network Policy|New rule"
-msgstr ""
-
msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is inbound from a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
msgstr ""
@@ -22140,16 +22469,13 @@ msgstr ""
msgid "NetworkPolicies|%{strongOpen}any%{strongClose} port"
msgstr ""
-msgid "NetworkPolicies|+ Add alert"
-msgstr ""
-
msgid "NetworkPolicies|.yaml"
msgstr ""
msgid "NetworkPolicies|.yaml mode"
msgstr ""
-msgid "NetworkPolicies|Actions"
+msgid "NetworkPolicies|Add alert"
msgstr ""
msgid "NetworkPolicies|Alerts are intended to be selectively used for a limited number of events that are potentially concerning and warrant a manual review. Alerts should not be used as a substitute for a SIEM or a logging tool. High volume alerts are likely to be dropped so as to preserve the stability of GitLab's integration with Kubernetes."
@@ -22185,9 +22511,6 @@ msgstr ""
msgid "NetworkPolicies|Deny all traffic"
msgstr ""
-msgid "NetworkPolicies|Description"
-msgstr ""
-
msgid "NetworkPolicies|Edit policy"
msgstr ""
@@ -22200,9 +22523,6 @@ msgstr ""
msgid "NetworkPolicies|IP/subnet"
msgstr ""
-msgid "NetworkPolicies|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
-msgstr ""
-
msgid "NetworkPolicies|Invalid or empty policy"
msgstr ""
@@ -22212,19 +22532,16 @@ msgstr ""
msgid "NetworkPolicies|Kubernetes error: %{error}"
msgstr ""
-msgid "NetworkPolicies|Name"
-msgstr ""
-
msgid "NetworkPolicies|Network"
msgstr ""
-msgid "NetworkPolicies|Network traffic"
+msgid "NetworkPolicies|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
msgstr ""
-msgid "NetworkPolicies|New policy"
+msgid "NetworkPolicies|Network policy can be created after the environment is loaded successfully."
msgstr ""
-msgid "NetworkPolicies|No policies detected"
+msgid "NetworkPolicies|Network traffic"
msgstr ""
msgid "NetworkPolicies|None selected"
@@ -22233,21 +22550,12 @@ msgstr ""
msgid "NetworkPolicies|Please %{installLinkStart}install%{installLinkEnd} and %{configureLinkStart}configure a Kubernetes Agent for this project%{configureLinkEnd} to enable alerts."
msgstr ""
-msgid "NetworkPolicies|Policies are a specification of how groups of pods are allowed to communicate with each other's network endpoints."
-msgstr ""
-
msgid "NetworkPolicies|Policy %{policyName} was successfully changed"
msgstr ""
msgid "NetworkPolicies|Policy definition"
msgstr ""
-msgid "NetworkPolicies|Policy editor"
-msgstr ""
-
-msgid "NetworkPolicies|Policy preview"
-msgstr ""
-
msgid "NetworkPolicies|Rule"
msgstr ""
@@ -22257,9 +22565,6 @@ msgstr ""
msgid "NetworkPolicies|Rule mode is unavailable for this policy. In some cases, we cannot parse the YAML file back into the rules editor."
msgstr ""
-msgid "NetworkPolicies|Rules"
-msgstr ""
-
msgid "NetworkPolicies|Save changes"
msgstr ""
@@ -22272,9 +22577,6 @@ msgstr ""
msgid "NetworkPolicies|Traffic that does not match any rule will be blocked."
msgstr ""
-msgid "NetworkPolicies|Unable to parse policy"
-msgstr ""
-
msgid "NetworkPolicies|all DNS names"
msgstr ""
@@ -22454,6 +22756,9 @@ msgstr ""
msgid "New issue"
msgstr ""
+msgid "New issue in %{project}"
+msgstr ""
+
msgid "New issue title"
msgstr ""
@@ -22532,7 +22837,7 @@ msgstr ""
msgid "Newest first"
msgstr ""
-msgid "Newly registered users will by default be external"
+msgid "Newly-registered users are external by default"
msgstr ""
msgid "Next"
@@ -22847,8 +23152,10 @@ msgstr ""
msgid "No webhooks found, add one in the form above."
msgstr ""
-msgid "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} to renew your subscription."
-msgstr ""
+msgid "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} day to renew your subscription."
+msgid_plural "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} days to renew your subscription."
+msgstr[0] ""
+msgstr[1] ""
msgid "No. of commits"
msgstr ""
@@ -22865,7 +23172,7 @@ msgstr ""
msgid "Nodes"
msgstr ""
-msgid "Non-admin users can sign in with read-only access and make read-only API requests."
+msgid "Non-admin users are restricted to read-only access, in both GitLab UI and API."
msgstr ""
msgid "None"
@@ -22946,7 +23253,7 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
-msgid "Notes Rate Limits"
+msgid "Notes rate limit"
msgstr ""
msgid "Notes|Are you sure you want to cancel creating this comment?"
@@ -23113,9 +23420,6 @@ msgstr ""
msgid "November"
msgstr ""
-msgid "Novice"
-msgstr ""
-
msgid "Now, personalize your GitLab experience"
msgstr ""
@@ -23284,7 +23588,7 @@ msgstr ""
msgid "OnCallSchedules|For this rotation, on-call will be:"
msgstr ""
-msgid "OnCallSchedules|On-call schedule %{schedule} in Project %{project}"
+msgid "OnCallSchedules|On-call schedule %{obstacle} in Project %{project}"
msgstr ""
msgid "OnCallSchedules|On-call schedules"
@@ -23431,22 +23735,22 @@ msgstr ""
msgid "OnDemandScans|Scanner profile"
msgstr ""
-msgid "OnDemandScans|Select one of the existing profiles"
+msgid "OnDemandScans|Schedule scan"
msgstr ""
-msgid "OnDemandScans|Site profile"
+msgid "OnDemandScans|Select one of the existing profiles"
msgstr ""
-msgid "OnDemandScans|Use existing scanner profile"
+msgid "OnDemandScans|Site profile"
msgstr ""
-msgid "OnDemandScans|Use existing site profile"
+msgid "OnDemandScans|Start time"
msgstr ""
-msgid "OnDemandScans|You can either choose a passive scan or validate the target site in your chosen site profile. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
+msgid "OnDemandScans|Use existing scanner profile"
msgstr ""
-msgid "OnDemandScans|You cannot run an active scan against an unvalidated site."
+msgid "OnDemandScans|Use existing site profile"
msgstr ""
msgid "OnDemandScans|You must create a repository within your project to run an on-demand scan."
@@ -23511,6 +23815,9 @@ msgstr ""
msgid "Only admins can delete project"
msgstr ""
+msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
+msgstr ""
+
msgid "Only include features new to your current subscription tier."
msgstr ""
@@ -23529,6 +23836,12 @@ msgstr ""
msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
+msgid "Only reCAPTCHA v2 is supported:"
+msgstr ""
+
+msgid "Only users from the specified IP address ranges are able to reach this group, including all subgroups, projects, and Git repositories."
+msgstr ""
+
msgid "Only verified users with an email address in any of these domains can be added to the group."
msgstr ""
@@ -23715,9 +24028,6 @@ msgstr ""
msgid "Package Registry"
msgstr ""
-msgid "Package Registry Rate Limits"
-msgstr ""
-
msgid "Package Registry: authenticated API requests"
msgstr ""
@@ -23736,6 +24046,9 @@ msgstr ""
msgid "Package recipe already exists"
msgstr ""
+msgid "Package registry rate limits"
+msgstr ""
+
msgid "Package type"
msgstr ""
@@ -23802,6 +24115,9 @@ msgstr ""
msgid "PackageRegistry|Composer"
msgstr ""
+msgid "PackageRegistry|Composer.json with license: %{license} and version: %{version}"
+msgstr ""
+
msgid "PackageRegistry|Conan"
msgstr ""
@@ -23865,6 +24181,9 @@ msgstr ""
msgid "PackageRegistry|Copy require package include"
msgstr ""
+msgid "PackageRegistry|Copy target SHA"
+msgstr ""
+
msgid "PackageRegistry|Copy yarn command"
msgstr ""
@@ -23931,6 +24250,9 @@ msgstr ""
msgid "PackageRegistry|Install package version"
msgstr ""
+msgid "PackageRegistry|Instance-level"
+msgstr ""
+
msgid "PackageRegistry|Invalid Package: failed metadata extraction"
msgstr ""
@@ -23976,6 +24298,9 @@ msgstr ""
msgid "PackageRegistry|Pip Command"
msgstr ""
+msgid "PackageRegistry|Project-level"
+msgstr ""
+
msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
msgstr ""
@@ -23997,6 +24322,9 @@ msgstr ""
msgid "PackageRegistry|Remove package"
msgstr ""
+msgid "PackageRegistry|Required Python: %{pythonVersion}"
+msgstr ""
+
msgid "PackageRegistry|RubyGems"
msgstr ""
@@ -24039,6 +24367,9 @@ msgstr ""
msgid "PackageRegistry|Source project located at %{link}"
msgstr ""
+msgid "PackageRegistry|Target SHA: %{sha}"
+msgstr ""
+
msgid "PackageRegistry|There are no other versions of this package."
msgstr ""
@@ -24207,6 +24538,18 @@ msgstr ""
msgid "Password was successfully updated. Please sign in again."
msgstr ""
+msgid "PasswordPrompt|Confirm password"
+msgstr ""
+
+msgid "PasswordPrompt|Confirm password to continue"
+msgstr ""
+
+msgid "PasswordPrompt|Password is required"
+msgstr ""
+
+msgid "PasswordPrompt|Please enter your password to confirm"
+msgstr ""
+
msgid "Passwords should be unique and not used for any other sites or services."
msgstr ""
@@ -24234,6 +24577,9 @@ msgstr ""
msgid "Paste project path (i.e. gitlab-org/gitlab)"
msgstr ""
+msgid "Paste this DSN into your Sentry SDK"
+msgstr ""
+
msgid "Paste your public SSH key, which is usually contained in the file '~/.ssh/id_ed25519.pub' or '~/.ssh/id_rsa.pub' and begins with 'ssh-ed25519' or 'ssh-rsa'. Do not paste your private SSH key, as that can compromise your identity."
msgstr ""
@@ -24318,6 +24664,9 @@ msgstr ""
msgid "PerformanceBar|First Contentful Paint"
msgstr ""
+msgid "PerformanceBar|Flamegraph with mode:"
+msgstr ""
+
msgid "PerformanceBar|Frontend resources"
msgstr ""
@@ -24351,6 +24700,15 @@ msgstr ""
msgid "PerformanceBar|Trace"
msgstr ""
+msgid "PerformanceBar|cpu"
+msgstr ""
+
+msgid "PerformanceBar|object"
+msgstr ""
+
+msgid "PerformanceBar|wall"
+msgstr ""
+
msgid "Period in seconds"
msgstr ""
@@ -24579,6 +24937,48 @@ msgstr ""
msgid "PipelineSchedules|Variables"
msgstr ""
+msgid "PipelineSource|API"
+msgstr ""
+
+msgid "PipelineSource|Chat"
+msgstr ""
+
+msgid "PipelineSource|External"
+msgstr ""
+
+msgid "PipelineSource|External Pull Request"
+msgstr ""
+
+msgid "PipelineSource|Merge Request"
+msgstr ""
+
+msgid "PipelineSource|On-Demand DAST Scan"
+msgstr ""
+
+msgid "PipelineSource|On-Demand DAST Validation"
+msgstr ""
+
+msgid "PipelineSource|Parent Pipeline"
+msgstr ""
+
+msgid "PipelineSource|Pipeline"
+msgstr ""
+
+msgid "PipelineSource|Push"
+msgstr ""
+
+msgid "PipelineSource|Schedule"
+msgstr ""
+
+msgid "PipelineSource|Trigger"
+msgstr ""
+
+msgid "PipelineSource|Web"
+msgstr ""
+
+msgid "PipelineSource|Web IDE"
+msgstr ""
+
msgid "PipelineStatusTooltip|Pipeline: %{ciStatus}"
msgstr ""
@@ -24879,46 +25279,7 @@ msgstr ""
msgid "Pipeline|Source"
msgstr ""
-msgid "Pipeline|Source|API"
-msgstr ""
-
-msgid "Pipeline|Source|Chat"
-msgstr ""
-
-msgid "Pipeline|Source|External"
-msgstr ""
-
-msgid "Pipeline|Source|External Pull Request"
-msgstr ""
-
-msgid "Pipeline|Source|Merge Request"
-msgstr ""
-
-msgid "Pipeline|Source|On-Demand DAST Scan"
-msgstr ""
-
-msgid "Pipeline|Source|On-Demand DAST Validation"
-msgstr ""
-
-msgid "Pipeline|Source|Parent Pipeline"
-msgstr ""
-
-msgid "Pipeline|Source|Pipeline"
-msgstr ""
-
-msgid "Pipeline|Source|Push"
-msgstr ""
-
-msgid "Pipeline|Source|Schedule"
-msgstr ""
-
-msgid "Pipeline|Source|Trigger"
-msgstr ""
-
-msgid "Pipeline|Source|Web"
-msgstr ""
-
-msgid "Pipeline|Source|Web IDE"
+msgid "Pipeline|Source|Security Policy"
msgstr ""
msgid "Pipeline|Specify variable values to be used in this run. The values specified in %{linkStart}CI/CD settings%{linkEnd} will be used by default."
@@ -24969,7 +25330,7 @@ msgstr ""
msgid "Pipeline|We are currently unable to fetch pipeline data"
msgstr ""
-msgid "Pipeline|You’re about to stop pipeline %{pipelineId}."
+msgid "Pipeline|You’re about to stop pipeline #%{pipelineId}."
msgstr ""
msgid "Pipeline|for"
@@ -24996,6 +25357,9 @@ msgstr ""
msgid "Plain diff"
msgstr ""
+msgid "Plain-text response to send to clients that hit a rate limit"
+msgstr ""
+
msgid "Plan:"
msgstr ""
@@ -25140,9 +25504,6 @@ msgstr ""
msgid "Please provide attributes to update"
msgstr ""
-msgid "Please provide your username or email address."
-msgstr ""
-
msgid "Please reach out if you have any questions and we'll be happy to assist."
msgstr ""
@@ -25185,9 +25546,6 @@ msgstr ""
msgid "Please set a new password before proceeding."
msgstr ""
-msgid "Please share your feedback about %{featureName} %{linkStart}in this issue%{linkEnd} to help us improve the experience."
-msgstr ""
-
msgid "Please solve the captcha"
msgstr ""
@@ -25365,6 +25723,9 @@ msgstr ""
msgid "Prevent adding new members to project membership within this group"
msgstr ""
+msgid "Prevent auto-stopping"
+msgstr ""
+
msgid "Prevent editing approval rules in projects and merge requests."
msgstr ""
@@ -25377,7 +25738,7 @@ msgstr ""
msgid "Prevent users from changing their profile name"
msgstr ""
-msgid "Prevent users from performing write operations on GitLab while performing maintenance."
+msgid "Prevent users from performing write operations while GitLab maintenance is in progress."
msgstr ""
msgid "Preview"
@@ -25650,6 +26011,9 @@ msgstr ""
msgid "Profiles|Enter your name, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Enter your password to confirm the email change"
+msgstr ""
+
msgid "Profiles|Enter your pronouns to let people know how to refer to you"
msgstr ""
@@ -25884,10 +26248,10 @@ msgstr ""
msgid "Profiles|e.g. My MacBook key"
msgstr ""
-msgid "Profiles|username"
+msgid "Profiles|https://website.com"
msgstr ""
-msgid "Profiles|website.com"
+msgid "Profiles|username"
msgstr ""
msgid "Profiles|your account"
@@ -26130,9 +26494,21 @@ msgstr ""
msgid "ProjectSelect| or group"
msgstr ""
+msgid "ProjectSelect|No matching results"
+msgstr ""
+
msgid "ProjectSelect|Search for project"
msgstr ""
+msgid "ProjectSelect|Search projects"
+msgstr ""
+
+msgid "ProjectSelect|Select a project"
+msgstr ""
+
+msgid "ProjectSelect|There was an error fetching the projects. Please try again."
+msgstr ""
+
msgid "ProjectService|Drone server URL"
msgstr ""
@@ -26220,6 +26596,9 @@ msgstr ""
msgid "ProjectService|Trigger event when a new, unique alert is recorded."
msgstr ""
+msgid "ProjectService|Trigger event when a new, unique vulnerability is recorded. (Note: This feature requires an Ultimate plan.)"
+msgstr ""
+
msgid "ProjectService|Trigger event when a pipeline status changes."
msgstr ""
@@ -26634,9 +27013,15 @@ msgstr ""
msgid "Projects are graded based on the highest severity vulnerability present"
msgstr ""
+msgid "Projects are organized into groups"
+msgstr ""
+
msgid "Projects contributed to"
msgstr ""
+msgid "Projects help you organize your work. They contain your file repository, issues, merge requests, and so much more."
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr "Projetos compartilhados com %{group_name}"
@@ -26871,10 +27256,10 @@ msgstr ""
msgid "PrometheusService|Prometheus cluster integration"
msgstr ""
-msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
+msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
msgstr ""
-msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
+msgid "PrometheusService|The ID of the IAP-secured resource."
msgstr ""
msgid "PrometheusService|The Prometheus API base URL."
@@ -27492,6 +27877,9 @@ msgstr ""
msgid "Rate limit"
msgstr ""
+msgid "Rate limits can help reduce request volume (like from crawlers or abusive bots)."
+msgstr ""
+
msgid "Raw blob request rate limit per minute"
msgstr ""
@@ -27504,6 +27892,9 @@ msgstr ""
msgid "Re-authentication required"
msgstr ""
+msgid "Re-import"
+msgstr ""
+
msgid "Re-request review"
msgstr ""
@@ -27525,6 +27916,9 @@ msgstr ""
msgid "Read more about related issues"
msgstr ""
+msgid "Read their documentation."
+msgstr ""
+
msgid "Ready to get started with GitLab? Follow these steps to set up your workspace, plan and commit changes, and deploy your project."
msgstr ""
@@ -27558,6 +27952,9 @@ msgstr ""
msgid "Receive any notifications from GitLab."
msgstr ""
+msgid "Receive notification of abuse reports by email."
+msgstr ""
+
msgid "Receive notifications about your own activity"
msgstr "Receber notificações sobre a tua própria atividade"
@@ -27701,9 +28098,6 @@ msgstr ""
msgid "Registry setup"
msgstr ""
-msgid "Regulate approvals by authors/committers. Affects all projects."
-msgstr ""
-
msgid "Reindexing Status: %{status} (Slice multiplier: %{multiplier}, Maximum running slices: %{max_slices})"
msgstr ""
@@ -27799,6 +28193,9 @@ msgstr ""
msgid "Release|Something went wrong while saving the release details."
msgstr ""
+msgid "Reload page"
+msgstr ""
+
msgid "Remediations"
msgstr ""
@@ -28081,6 +28478,9 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
+msgid "Repeats"
+msgstr ""
+
msgid "Replace"
msgstr ""
@@ -28443,10 +28843,7 @@ msgstr ""
msgid "Require additional authentication for administrative tasks."
msgstr ""
-msgid "Require all users in this group to setup Two-factor authentication"
-msgstr ""
-
-msgid "Require all users in this group to setup two-factor authentication"
+msgid "Require all users in this group to set up two-factor authentication"
msgstr ""
msgid "Required approvals (%{approvals_given} given)"
@@ -28492,6 +28889,9 @@ msgstr[1] ""
msgid "Requires values to meet regular expression requirements."
msgstr ""
+msgid "Requires you to deploy or set up cloud-hosted Sentry."
+msgstr ""
+
msgid "Requires your primary GitLab email address."
msgstr ""
@@ -28552,9 +28952,6 @@ msgstr ""
msgid "Resolve"
msgstr ""
-msgid "Resolve all threads in new issue"
-msgstr ""
-
msgid "Resolve conflicts"
msgstr ""
@@ -28612,6 +29009,9 @@ msgstr ""
msgid "Response text"
msgstr ""
+msgid "Restart GitLab to apply changes."
+msgstr ""
+
msgid "Restart Terminal"
msgstr ""
@@ -28630,6 +29030,9 @@ msgstr ""
msgid "Restoring the project will prevent the project from being removed on this date and restore people's ability to make changes to it."
msgstr ""
+msgid "Restrict group access by IP address. %{link_start}Learn more%{link_end}."
+msgstr ""
+
msgid "Restrict membership by email domain"
msgstr ""
@@ -28943,6 +29346,9 @@ msgstr ""
msgid "Runners|Runner #%{runner_id}"
msgstr ""
+msgid "Runners|Runner assigned to project."
+msgstr ""
+
msgid "Runners|Runner is offline, last contact was %{runner_contact} ago"
msgstr ""
@@ -28955,6 +29361,9 @@ msgstr ""
msgid "Runners|Runner registration"
msgstr ""
+msgid "Runners|Runner unassigned from project."
+msgstr ""
+
msgid "Runners|Runners"
msgstr ""
@@ -29147,7 +29556,7 @@ msgstr ""
msgid "SastEntryPoints|How do I set up SAST?"
msgstr ""
-msgid "SastEntryPoints|Learn more."
+msgid "SastEntryPoints|Learn more"
msgstr ""
msgid "Satisfied"
@@ -29189,7 +29598,7 @@ msgstr ""
msgid "Save pipeline schedule"
msgstr ""
-msgid "Save space and find images in the container Registry. remove unneeded tags and keep only the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
+msgid "Save storage space by automatically deleting tags from the container registry and keeping the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
msgstr ""
msgid "Saving"
@@ -29363,6 +29772,9 @@ msgstr ""
msgid "Search or filter results…"
msgstr ""
+msgid "Search or jump to..."
+msgstr ""
+
msgid "Search project"
msgstr ""
@@ -29423,16 +29835,16 @@ msgstr ""
msgid "SearchCodeResults|of %{link_to_project}"
msgstr ""
-msgid "SearchResults|Showing %{count} %{scope} for%{term_element}"
+msgid "SearchResults|Showing %{count} %{scope} for %{term_element}"
msgstr ""
-msgid "SearchResults|Showing %{count} %{scope} for%{term_element} in your personal and project snippets"
+msgid "SearchResults|Showing %{count} %{scope} for %{term_element} in your personal and project snippets"
msgstr ""
-msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for%{term_element}"
+msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for %{term_element}"
msgstr ""
-msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for%{term_element} in your personal and project snippets"
+msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for %{term_element} in your personal and project snippets"
msgstr ""
msgid "SearchResults|code result"
@@ -29514,6 +29926,9 @@ msgstr ""
msgid "Secret Detection"
msgstr ""
+msgid "Secret access key"
+msgstr ""
+
msgid "Secret token"
msgstr ""
@@ -29553,9 +29968,6 @@ msgstr ""
msgid "SecurityApprovals|A merge request approval is required when the license compliance report contains a denied license."
msgstr ""
-msgid "SecurityApprovals|Configurable if security scanners are enabled. %{linkStart}Learn more.%{linkEnd}"
-msgstr ""
-
msgid "SecurityApprovals|Coverage-Check"
msgstr ""
@@ -29568,24 +29980,18 @@ msgstr ""
msgid "SecurityApprovals|Learn more about Vulnerability-Check"
msgstr ""
-msgid "SecurityApprovals|License Scanning must be enabled. %{linkStart}Learn more%{linkEnd}."
-msgstr ""
-
msgid "SecurityApprovals|License-Check"
msgstr ""
msgid "SecurityApprovals|Requires approval for Denied licenses. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}More information%{linkEnd}"
+msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "SecurityApprovals|Requires approval for vulnerabilities. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
-msgid "SecurityApprovals|Test coverage must be enabled. %{linkStart}Learn more%{linkEnd}."
-msgstr ""
-
msgid "SecurityApprovals|Vulnerability-Check"
msgstr ""
@@ -29649,6 +30055,12 @@ msgstr ""
msgid "SecurityConfiguration|Immediately begin risk analysis and remediation with application security features. Start with SAST and Secret Detection, available to all plans. Upgrade to Ultimate to get all features, including:"
msgstr ""
+msgid "SecurityConfiguration|Manage corpus"
+msgstr ""
+
+msgid "SecurityConfiguration|Manage corpus files used as mutation sources in coverage fuzzing."
+msgstr ""
+
msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
msgstr ""
@@ -29703,6 +30115,12 @@ msgstr ""
msgid "SecurityOrchestration|Action"
msgstr ""
+msgid "SecurityOrchestration|Actions"
+msgstr ""
+
+msgid "SecurityOrchestration|Add rule"
+msgstr ""
+
msgid "SecurityOrchestration|All policies"
msgstr ""
@@ -29736,9 +30154,6 @@ msgstr ""
msgid "SecurityOrchestration|Network"
msgstr ""
-msgid "SecurityOrchestration|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
-msgstr ""
-
msgid "SecurityOrchestration|New policy"
msgstr ""
@@ -29754,6 +30169,9 @@ msgstr ""
msgid "SecurityOrchestration|Policy editor"
msgstr ""
+msgid "SecurityOrchestration|Policy preview"
+msgstr ""
+
msgid "SecurityOrchestration|Policy status"
msgstr ""
@@ -29763,6 +30181,9 @@ msgstr ""
msgid "SecurityOrchestration|Rule"
msgstr ""
+msgid "SecurityOrchestration|Rules"
+msgstr ""
+
msgid "SecurityOrchestration|Scan Execution"
msgstr ""
@@ -29856,6 +30277,9 @@ msgstr ""
msgid "SecurityReports|Create issue"
msgstr ""
+msgid "SecurityReports|Development vulnerabilities"
+msgstr ""
+
msgid "SecurityReports|Dismiss vulnerability"
msgstr ""
@@ -29871,6 +30295,9 @@ msgstr ""
msgid "SecurityReports|Download results"
msgstr ""
+msgid "SecurityReports|Download scanned URLs"
+msgstr ""
+
msgid "SecurityReports|Download scanned resources"
msgstr ""
@@ -29994,6 +30421,9 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
+msgid "SecurityReports|The Vulnerability Report shows the results of the lastest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "SecurityReports|The security reports below contain one or more vulnerability findings that could not be parsed and were not recorded. Download the artifacts in the job output to investigate. Ensure any security report created conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
msgstr ""
@@ -30135,10 +30565,10 @@ msgstr ""
msgid "Select a repository"
msgstr ""
-msgid "Select a role"
+msgid "Select a repository containing templates for common files."
msgstr ""
-msgid "Select a shared template repository for all projects on this instance."
+msgid "Select a role"
msgstr ""
msgid "Select a template repository"
@@ -30216,6 +30646,9 @@ msgstr ""
msgid "Select project to choose zone"
msgstr ""
+msgid "Select project to create issue"
+msgstr ""
+
msgid "Select projects"
msgstr ""
@@ -30333,6 +30766,9 @@ msgstr ""
msgid "Send emails to help guide new users through the onboarding process."
msgstr ""
+msgid "Send emails to users upon account deactivation."
+msgstr ""
+
msgid "Send message"
msgstr ""
@@ -30351,6 +30787,9 @@ msgstr ""
msgid "Send service data"
msgstr ""
+msgid "Sentry"
+msgstr ""
+
msgid "Sentry API URL"
msgstr ""
@@ -30465,6 +30904,9 @@ msgstr ""
msgid "Service"
msgstr ""
+msgid "Service Accounts keys are required to authorize GitLab to deploy your Google Cloud project."
+msgstr ""
+
msgid "Service Desk"
msgstr ""
@@ -30537,15 +30979,15 @@ msgstr ""
msgid "Set a password on your account to pull or push via %{protocol}."
msgstr ""
-msgid "Set a template repository for projects in this group"
-msgstr ""
-
msgid "Set access permissions for this token."
msgstr ""
msgid "Set an instance-wide domain that will be available to all clusters when installing Knative."
msgstr ""
+msgid "Set any rate limit to %{code_open}0%{code_close} to disable the limit."
+msgstr ""
+
msgid "Set default and restrict visibility levels. Configure import sources and git access protocol."
msgstr ""
@@ -30558,7 +31000,7 @@ msgstr ""
msgid "Set limit to 0 to allow any file size."
msgstr ""
-msgid "Set max session time for web terminal."
+msgid "Set limits for web and API requests."
msgstr ""
msgid "Set milestone"
@@ -30567,15 +31009,18 @@ msgstr ""
msgid "Set new password"
msgstr ""
-msgid "Set notification email for abuse reports."
+msgid "Set parent epic to an epic"
msgstr ""
-msgid "Set parent epic to an epic"
+msgid "Set per-user rate limits for imports and exports of projects and groups."
msgstr ""
msgid "Set projects and maximum size limits, session duration, user options, and check feature availability for namespace plan."
msgstr ""
+msgid "Set rate limits for package registry API requests that supersede the general user and IP rate limits."
+msgstr ""
+
msgid "Set severity"
msgstr ""
@@ -30594,15 +31039,24 @@ msgstr ""
msgid "Set the default branch for this project. All merge requests and commits are made against this branch unless you specify a different one."
msgstr ""
+msgid "Set the default expiration time for job artifacts in all projects. Set to %{code_open}0%{code_close} to never expire artifacts by default. If no unit is written, it defaults to seconds. For example, these are all equivalent: %{code_open}3600%{code_close}, %{code_open}60 minutes%{code_close}, or %{code_open}one hour%{code_close}."
+msgstr ""
+
msgid "Set the due date to %{due_date}."
msgstr ""
msgid "Set the iteration to %{iteration_reference}."
msgstr ""
+msgid "Set the maximum session time for a web terminal."
+msgstr ""
+
msgid "Set the milestone to %{milestone_reference}."
msgstr ""
+msgid "Set the per-user rate limit for notes created by web or API requests."
+msgstr ""
+
msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
msgstr ""
@@ -30804,6 +31258,9 @@ msgstr ""
msgid "Show Pipeline IID"
msgstr ""
+msgid "Show all %{issuable_type}."
+msgstr ""
+
msgid "Show all activity"
msgstr ""
@@ -30855,15 +31312,9 @@ msgstr ""
msgid "Show list"
msgstr ""
-msgid "Show me advanced features"
-msgstr ""
-
msgid "Show me how to add a pipeline"
msgstr ""
-msgid "Show me the basics"
-msgstr ""
-
msgid "Show one file at a time"
msgstr ""
@@ -30904,15 +31355,15 @@ msgstr ""
msgid "Showing %{pageSize} of %{total} %{issuableType}"
msgstr ""
-msgid "Showing %{pageSize} of %{total} issues"
-msgstr ""
-
msgid "Showing all epics"
msgstr ""
msgid "Showing all issues"
msgstr ""
+msgid "Showing data for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
+msgstr ""
+
msgid "Showing data for workflow items created in this date range. Date range cannot exceed %{maxDateRange} days."
msgstr ""
@@ -30952,6 +31403,15 @@ msgstr ""
msgid "Sidebar|Weight"
msgstr ""
+msgid "Sidekiq job compression threshold (bytes)"
+msgstr ""
+
+msgid "Sidekiq job size limit (bytes)"
+msgstr ""
+
+msgid "Sidekiq job size limits"
+msgstr ""
+
msgid "Sign in"
msgstr ""
@@ -31072,6 +31532,9 @@ msgstr ""
msgid "Site profile not found for given parameters"
msgstr ""
+msgid "Sites"
+msgstr ""
+
msgid "Size"
msgstr ""
@@ -31102,19 +31565,22 @@ msgstr ""
msgid "SlackIntegration|Sends notifications about project events to Slack channels."
msgstr ""
-msgid "SlackService|2. Paste the %{strong_open}Token%{strong_close} into the field below"
+msgid "SlackService|1. %{slash_command_link_start}Add a slash command%{slash_command_link_end} in your Slack team using this information:"
msgstr ""
-msgid "SlackService|3. Select the %{strong_open}Active%{strong_close} checkbox, press %{strong_open}Save changes%{strong_close} and start using GitLab inside Slack!"
+msgid "SlackService|2. Paste the token from Slack in the %{strong_open}Token%{strong_close} field below."
msgstr ""
-msgid "SlackService|Fill in the word that works best for your team."
+msgid "SlackService|3. Select the %{strong_open}Active%{strong_close} checkbox, select %{strong_open}Save changes%{strong_close}, and start using slash commands in Slack!"
+msgstr ""
+
+msgid "SlackService|After setup, get a list of available Slack slash commands by entering"
msgstr ""
-msgid "SlackService|See list of available commands in Slack after setting up this service, by entering"
+msgid "SlackService|Fill in the word that works best for your team."
msgstr ""
-msgid "SlackService|This service allows users to perform common operations on this project by entering slash commands in Slack."
+msgid "SlackService|Perform common operations in this project by entering slash commands in Slack."
msgstr ""
msgid "Slice multiplier"
@@ -31180,7 +31646,7 @@ msgstr ""
msgid "Some child epics may be hidden due to applied filters"
msgstr ""
-msgid "Some common domains are not allowed. %{read_more_link}."
+msgid "Some common domains are not allowed. %{learn_more_link}."
msgstr ""
msgid "Some of the designs you tried uploading did not change:"
@@ -31264,9 +31730,6 @@ msgstr ""
msgid "Something went wrong while exporting requirements"
msgstr ""
-msgid "Something went wrong while fetching %{listType} list"
-msgstr ""
-
msgid "Something went wrong while fetching branches"
msgstr ""
@@ -31321,15 +31784,9 @@ msgstr ""
msgid "Something went wrong while merging this merge request. Please try again."
msgstr ""
-msgid "Something went wrong while moving issues."
-msgstr ""
-
msgid "Something went wrong while obtaining the Let's Encrypt certificate."
msgstr ""
-msgid "Something went wrong while performing the action."
-msgstr ""
-
msgid "Something went wrong while promoting the issue to an epic. Please try again."
msgstr ""
@@ -31657,7 +32114,10 @@ msgstr ""
msgid "SourcegraphPreferences|Uses a custom %{linkStart}Sourcegraph instance%{linkEnd}."
msgstr ""
-msgid "Spam Check API Key"
+msgid "Spam Check"
+msgstr ""
+
+msgid "Spam Check API key"
msgstr ""
msgid "Spam Logs"
@@ -31675,7 +32135,7 @@ msgstr ""
msgid "Specified URL cannot be used: \"%{reason}\""
msgstr ""
-msgid "Specify an e-mail address regex pattern to identify default internal users."
+msgid "Specify an email address regex pattern to identify default internal users."
msgstr ""
msgid "Speed up your pipelines with Needs relationships"
@@ -31930,7 +32390,7 @@ msgstr ""
msgid "StatusCheck|An error occurred fetching the status checks."
msgstr ""
-msgid "StatusCheck|Apply this status check to any branch or a specific protected branch."
+msgid "StatusCheck|Apply this status check to all branches or a specific protected branch."
msgstr ""
msgid "StatusCheck|Check for a status response in Merge Requests. Failures do not block merges. %{link_start}Learn more%{link_end}."
@@ -32269,6 +32729,9 @@ msgstr ""
msgid "Subscriptions"
msgstr ""
+msgid "Subscription|Your subscription for %{strong}%{namespace_name}%{strong_close} has expired and you are now on %{pricing_link_start}the GitLab Free tier%{pricing_link_end}. Don't worry, your data is safe. Get in touch with our support team (%{support_email}). They'll gladly help with your subscription renewal."
+msgstr ""
+
msgid "Subtracted"
msgstr ""
@@ -32497,6 +32960,9 @@ msgstr ""
msgid "SuperSonics|Plan"
msgstr ""
+msgid "SuperSonics|Please agree to the Subscription Agreement"
+msgstr ""
+
msgid "SuperSonics|Ready to get started? A GitLab plan is ideal for scaling organizations and for multi team usage."
msgstr ""
@@ -32527,6 +32993,9 @@ msgstr ""
msgid "SuperSonics|The activation code is not valid. Please make sure to copy it exactly from the Customers Portal or confirmation email. Learn more about %{linkStart}activating your subscription%{linkEnd}."
msgstr ""
+msgid "SuperSonics|The activation code should be a 24-character alphanumeric string"
+msgstr ""
+
msgid "SuperSonics|There is a connectivity issue."
msgstr ""
@@ -32569,9 +33038,15 @@ msgstr ""
msgid "SuperSonics|You do not have an active subscription"
msgstr ""
+msgid "SuperSonics|You have successfully added a license that activates on %{date}. Please see the subscription history table below for more details."
+msgstr ""
+
msgid "SuperSonics|You'll be charged for %{trueUpLinkStart}users over license%{trueUpLinkEnd} on a quarterly or annual basis, depending on the terms of your agreement."
msgstr ""
+msgid "SuperSonics|Your future dated license was successfully added"
+msgstr ""
+
msgid "SuperSonics|Your subscription"
msgstr ""
@@ -32824,7 +33299,7 @@ msgstr ""
msgid "Template to append to all Service Desk issues"
msgstr ""
-msgid "TemplateRepository|Select a repository to make its templates available to all projects. %{link_start}What should the repository contain?%{link_end} "
+msgid "TemplateRepository|Create common files more quickly, and standardize their format."
msgstr ""
msgid "Templates"
@@ -33030,7 +33505,7 @@ msgstr ""
msgid "TestCases|Search test cases"
msgstr ""
-msgid "TestCases|Something went wrong while adding test case to Todo."
+msgid "TestCases|Something went wrong while adding test case to a to-do item."
msgstr ""
msgid "TestCases|Something went wrong while creating a test case."
@@ -33042,7 +33517,7 @@ msgstr ""
msgid "TestCases|Something went wrong while fetching test cases list."
msgstr ""
-msgid "TestCases|Something went wrong while marking test case todo as done."
+msgid "TestCases|Something went wrong while marking test case to-do item as done."
msgstr ""
msgid "TestCases|Something went wrong while moving test case."
@@ -33162,7 +33637,7 @@ msgstr ""
msgid "Thanks for your purchase!"
msgstr ""
-msgid "That is ok, I do not want to renew"
+msgid "That's OK, I don't want to renew"
msgstr ""
msgid "That's it, well done!"
@@ -33185,7 +33660,7 @@ msgid_plural "The %{type} contains the following errors:"
msgstr[0] ""
msgstr[1] ""
-msgid "The API key used by GitLab for accessing the Spam Check service endpoint"
+msgid "The API key used by GitLab for accessing the Spam Check service endpoint."
msgstr ""
msgid "The GitLab subscription service (customers.gitlab.com) is currently experiencing an outage. You can monitor the status and get updates at %{linkStart}status.gitlab.com%{linkEnd}."
@@ -33224,9 +33699,6 @@ msgstr ""
msgid "The URL to use for connecting to Elasticsearch. Use a comma-separated list to support clustering (e.g., \"http://localhost:9200, http://localhost:9201\")."
msgstr ""
-msgid "The Vulnerability Report shows the results of the last successful pipeline run on the default branch."
-msgstr ""
-
msgid "The X509 Certificate to use when mutual TLS is required to communicate with the external authorization service. If left blank, the server certificate is still validated when accessing over HTTPS."
msgstr ""
@@ -33284,9 +33756,6 @@ msgstr ""
msgid "The default branch for this project has been changed. Please update your bookmarks."
msgstr ""
-msgid "The default expiration time for job artifacts. 0 for unlimited. The default unit is in seconds, but you can use other units, for example %{code_open}4 mins 2 sec%{code_close}, %{code_open}2h42min%{code_close}."
-msgstr ""
-
msgid "The dependency list details information about the components used within your project."
msgstr ""
@@ -33478,9 +33947,6 @@ msgstr ""
msgid "The merge conflicts for this merge request have already been resolved. Please return to the merge request."
msgstr ""
-msgid "The merge request can now be merged."
-msgstr ""
-
msgid "The metric must be one of %{metrics}."
msgstr ""
@@ -33856,7 +34322,7 @@ msgstr ""
msgid "There was a problem updating the keep latest artifacts setting."
msgstr ""
-msgid "There was an error %{message} todo."
+msgid "There was an error %{message} to-do item."
msgstr ""
msgid "There was an error adding a To Do."
@@ -33895,6 +34361,9 @@ msgstr ""
msgid "There was an error fetching projects"
msgstr ""
+msgid "There was an error fetching search autocomplete suggestions"
+msgstr ""
+
msgid "There was an error fetching stage total counts"
msgstr ""
@@ -34219,6 +34688,9 @@ msgstr ""
msgid "This field is required."
msgstr ""
+msgid "This form is disabled in preview"
+msgstr ""
+
msgid "This group"
msgstr ""
@@ -34240,9 +34712,6 @@ msgstr ""
msgid "This group is linked to a subscription"
msgstr ""
-msgid "This group, including all subgroups, projects and git repositories, will be reachable from only the specified IP address ranges."
-msgstr ""
-
msgid "This group, its subgroups and projects has been scheduled for removal on %{date}."
msgstr ""
@@ -34522,9 +34991,6 @@ msgstr ""
msgid "This user cannot be unlocked manually from GitLab"
msgstr ""
-msgid "This user does not have a pending request"
-msgstr ""
-
msgid "This user has an unconfirmed email address (%{email}). You may force a confirmation."
msgstr ""
@@ -34633,9 +35099,6 @@ msgstr ""
msgid "ThreatMonitoring|Packet Activity"
msgstr ""
-msgid "ThreatMonitoring|Policies"
-msgstr ""
-
msgid "ThreatMonitoring|Requests"
msgstr ""
@@ -34687,6 +35150,12 @@ msgstr ""
msgid "ThreatMonitoring|View documentation"
msgstr ""
+msgid "Threshold in bytes at which to compress Sidekiq job arguments."
+msgstr ""
+
+msgid "Threshold in bytes at which to reject Sidekiq jobs. Set this to 0 to if you don't want to limit Sidekiq jobs."
+msgstr ""
+
msgid "Throughput"
msgstr ""
@@ -34696,6 +35165,9 @@ msgstr ""
msgid "Time"
msgstr "Hora"
+msgid "Time (in hours) that users are allowed to skip forced configuration of two-factor authentication."
+msgstr ""
+
msgid "Time Spent"
msgstr ""
@@ -34762,7 +35234,7 @@ msgstr ""
msgid "TimeTrackingEstimated|Est"
msgstr ""
-msgid "TimeTracking|%{startTag}Spent: %{endTag}%{timeSpentHumanReadable}"
+msgid "TimeTracking|%{spentStart}Spent: %{spentEnd}"
msgstr ""
msgid "TimeTracking|Estimated:"
@@ -34976,6 +35448,9 @@ msgstr ""
msgid "To access this domain create a new DNS record"
msgstr ""
+msgid "To add a custom suffix, set up a Service Desk email address. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "To add an SSH key you need to %{generate_link_start}generate one%{link_end} or use an %{existing_link_start}existing key%{link_end}."
msgstr ""
@@ -34997,13 +35472,16 @@ msgstr ""
msgid "To connect an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To continue using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
+msgstr ""
+
msgid "To continue, you need to select the link in the confirmation email we sent to verify your email address. If you didn't get our email, select %{strongStart}Resend confirmation email.%{strongEnd}"
msgstr ""
msgid "To define internal users, first enable new users set to external"
msgstr ""
-msgid "To enable Registration Features, make sure \"Enable service ping\" is checked."
+msgid "To enable Registration Features, first enable Service Ping."
msgstr ""
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
@@ -35030,7 +35508,7 @@ msgstr ""
msgid "To get started, use the link below to confirm your account."
msgstr ""
-msgid "To help improve GitLab and its user experience, GitLab will periodically collect usage information."
+msgid "To help improve GitLab and its user experience, GitLab periodically collects usage information."
msgstr ""
msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
@@ -35063,7 +35541,7 @@ msgstr ""
msgid "To preserve performance only %{strong_open}%{display_size} of %{real_size}%{strong_close} files are displayed."
msgstr ""
-msgid "To protect this issue's confidentiality, %{forkLink} and set the fork's visibility to private."
+msgid "To protect this issue's confidentiality, %{linkStart}fork this project%{linkEnd} and set the fork's visibility to private."
msgstr ""
msgid "To protect this issue's confidentiality, a private fork of this project was selected."
@@ -35096,12 +35574,15 @@ msgstr ""
msgid "To set up SAML authentication for your group through an identity provider like Azure, Okta, Onelogin, Ping Identity, or your custom SAML 2.0 provider:"
msgstr ""
-msgid "To set up this service:"
+msgid "To set up this integration:"
msgstr ""
msgid "To specify the notification level per project of a group you belong to, you need to visit project page and change notification level there."
msgstr ""
+msgid "To start using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
+msgstr ""
+
msgid "To unsubscribe from this issue, please paste the following link into your browser:"
msgstr ""
@@ -35689,9 +36170,6 @@ msgstr ""
msgid "Unable to fetch branches list, please close the form and try again"
msgstr ""
-msgid "Unable to fetch unscanned projects"
-msgstr ""
-
msgid "Unable to fetch vulnerable projects"
msgstr ""
@@ -35746,6 +36224,15 @@ msgstr ""
msgid "Unable to update this issue at this time."
msgstr ""
+msgid "Unapprove a merge request"
+msgstr ""
+
+msgid "Unapprove the current merge request."
+msgstr ""
+
+msgid "Unapproved the current merge request."
+msgstr ""
+
msgid "Unarchive project"
msgstr ""
@@ -35758,16 +36245,13 @@ msgstr ""
msgid "Unassigned"
msgstr ""
-msgid "Unauthenticated API request rate limit"
-msgstr ""
-
-msgid "Unauthenticated rate limit period in seconds"
+msgid "Unauthenticated API rate limit period in seconds"
msgstr ""
-msgid "Unauthenticated request rate limit"
+msgid "Unauthenticated requests"
msgstr ""
-msgid "Unauthenticated requests"
+msgid "Unauthenticated web rate limit period in seconds"
msgstr ""
msgid "Undo"
@@ -35869,18 +36353,6 @@ msgstr ""
msgid "Unresolved"
msgstr ""
-msgid "UnscannedProjects|15 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|30 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|5 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|60 or more days"
-msgstr ""
-
msgid "Unschedule job"
msgstr ""
@@ -36100,6 +36572,9 @@ msgstr ""
msgid "UsageQuota|%{help_link_start}Shared runners%{help_link_end} are disabled, so there are no limits set on pipeline usage"
msgstr ""
+msgid "UsageQuota|%{linkTitle} help link"
+msgstr ""
+
msgid "UsageQuota|%{percentageLeft} of purchased storage is available"
msgstr ""
@@ -36109,6 +36584,9 @@ msgstr ""
msgid "UsageQuota|Artifacts is a sum of build and pipeline artifacts."
msgstr ""
+msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
+msgstr ""
+
msgid "UsageQuota|Buy additional minutes"
msgstr ""
@@ -36118,9 +36596,21 @@ msgstr ""
msgid "UsageQuota|CI minutes usage by project"
msgstr ""
+msgid "UsageQuota|Code packages and container images."
+msgstr ""
+
msgid "UsageQuota|Current period usage"
msgstr ""
+msgid "UsageQuota|File attachments and smaller design graphics."
+msgstr ""
+
+msgid "UsageQuota|Git repository, managed by the Gitaly service."
+msgstr ""
+
+msgid "UsageQuota|Includes project registry, artifacts, packages, wiki, uploads and other items."
+msgstr ""
+
msgid "UsageQuota|Increase storage temporarily"
msgstr ""
@@ -36139,6 +36629,9 @@ msgstr ""
msgid "UsageQuota|Packages"
msgstr ""
+msgid "UsageQuota|Pipeline artifacts and job artifacts, created with CI/CD."
+msgstr ""
+
msgid "UsageQuota|Pipelines"
msgstr ""
@@ -36157,6 +36650,9 @@ msgstr ""
msgid "UsageQuota|Seats"
msgstr ""
+msgid "UsageQuota|Shared bits of code and text."
+msgstr ""
+
msgid "UsageQuota|Snippets"
msgstr ""
@@ -36166,6 +36662,12 @@ msgstr ""
msgid "UsageQuota|Storage"
msgstr ""
+msgid "UsageQuota|Storage type"
+msgstr ""
+
+msgid "UsageQuota|There is a known issue with Artifact storage where the total could be incorrect for some projects. More details and progress are available in %{warningLinkStart}the epic%{warningLinkEnd}."
+msgstr ""
+
msgid "UsageQuota|This is the total amount of storage used across your projects within this namespace."
msgstr ""
@@ -36205,6 +36707,9 @@ msgstr ""
msgid "UsageQuota|Usage"
msgstr ""
+msgid "UsageQuota|Usage Breakdown"
+msgstr ""
+
msgid "UsageQuota|Usage Quotas"
msgstr ""
@@ -36229,6 +36734,9 @@ msgstr ""
msgid "UsageQuota|Wiki"
msgstr ""
+msgid "UsageQuota|Wiki content."
+msgstr ""
+
msgid "UsageQuota|Wikis"
msgstr ""
@@ -36445,7 +36953,10 @@ msgstr ""
msgid "User Settings"
msgstr ""
-msgid "User and IP Rate Limits"
+msgid "User and IP rate limits"
+msgstr ""
+
+msgid "User does not have a pending request"
msgstr ""
msgid "User identity was successfully created."
@@ -36742,6 +37253,9 @@ msgstr ""
msgid "Users can launch a development environment from a GitLab browser tab when the %{linkStart}Gitpod%{linkEnd} integration is enabled."
msgstr ""
+msgid "Users can reactivate their account by signing in."
+msgstr ""
+
msgid "Users can render diagrams in AsciiDoc, Markdown, reStructuredText, and Textile documents using Kroki."
msgstr ""
@@ -36757,6 +37271,9 @@ msgstr ""
msgid "Users requesting access to"
msgstr ""
+msgid "Users to exclude from the rate limit"
+msgstr ""
+
msgid "Users were successfully added."
msgstr ""
@@ -36778,6 +37295,9 @@ msgstr ""
msgid "UsersSelect|Unassigned"
msgstr ""
+msgid "Uses GitLab as a lightweight alternative to Sentry."
+msgstr ""
+
msgid "Using %{code_start}::%{code_end} denotes a %{link_start}scoped label set%{link_end}"
msgstr ""
@@ -36808,10 +37328,7 @@ msgstr ""
msgid "Value Stream Analytics can help you determine your team’s velocity"
msgstr ""
-msgid "Value Stream Analytics gives an overview of how much time it takes to go from idea to production in your project."
-msgstr ""
-
-msgid "Value may contain a variable reference"
+msgid "Value might contain a variable reference"
msgstr ""
msgid "Value stream"
@@ -36877,10 +37394,10 @@ msgstr ""
msgid "ValueStream|The Default Value Stream cannot be deleted"
msgstr ""
-msgid "Variable"
+msgid "Values that contain the %{codeStart}$%{codeEnd} character can be considered a variable reference and expanded. %{docsLinkStart}Learn more.%{docsLinkEnd}"
msgstr ""
-msgid "Variable references indicated by %{codeStart}$%{codeEnd} may be expanded. If this is not what you want, consider %{docsLinkStart}using a workaround to prevent expansion%{docsLinkEnd}."
+msgid "Variable"
msgstr ""
msgid "Variable will be masked in job logs."
@@ -37285,6 +37802,9 @@ msgstr ""
msgid "Vulnerability|Evidence"
msgstr ""
+msgid "Vulnerability|False positive detected"
+msgstr ""
+
msgid "Vulnerability|File"
msgstr ""
@@ -37327,6 +37847,9 @@ msgstr ""
msgid "Vulnerability|Status"
msgstr ""
+msgid "Vulnerability|The scanner determined this vulnerability to be a false positive. Verify the evaluation before changing its status. %{linkStart}Learn more about false positive detection.%{linkEnd}"
+msgstr ""
+
msgid "Vulnerability|The unmodified response is the original response that had no mutations done to the request"
msgstr ""
@@ -37651,9 +38174,6 @@ msgstr ""
msgid "Welcome to GitLab,%{br_tag}%{name}!"
msgstr ""
-msgid "Welcome to the guided GitLab tour"
-msgstr ""
-
msgid "Welcome, %{name}!"
msgstr ""
@@ -37672,9 +38192,6 @@ msgstr ""
msgid "What are you searching for?"
msgstr ""
-msgid "What describes you best?"
-msgstr ""
-
msgid "What does this command do?"
msgstr ""
@@ -37696,13 +38213,13 @@ msgstr ""
msgid "What is your job title? (optional)"
msgstr ""
-msgid "What will you use this group for?"
+msgid "What templates can I create?"
msgstr ""
-msgid "What's new"
+msgid "What will you use this group for?"
msgstr ""
-msgid "What’s your experience level?"
+msgid "What's new"
msgstr ""
msgid "When a deployment job is successful, skip older deployment jobs that are still pending."
@@ -37714,6 +38231,9 @@ msgstr ""
msgid "When an event in GitLab triggers a webhook, you can use the request details to figure out if something went wrong."
msgstr ""
+msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+msgstr ""
+
msgid "When inactive, an external authentication provider must be used."
msgstr ""
@@ -37737,6 +38257,9 @@ msgstr ""
msgid "When:"
msgstr ""
+msgid "Which API requests are affected?"
+msgstr ""
+
msgid "While it's rare to have no vulnerabilities, it can happen. In any event, we ask that you please double check your settings to make sure you've set up your dashboard correctly."
msgstr ""
@@ -38016,6 +38539,9 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|Work Items"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -38091,6 +38617,9 @@ msgstr ""
msgid "You are already a member of this %{member_source}."
msgstr ""
+msgid "You are already impersonating another user"
+msgstr ""
+
msgid "You are an admin, which means granting access to %{client_name} will allow them to interact with GitLab as an admin as well. Proceed with caution."
msgstr ""
@@ -38193,6 +38722,9 @@ msgstr "Também podes enviar ficheiros existentes do teu computador ao usar as i
msgid "You can also use project access tokens with Git to authenticate over HTTP(S). %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "You can always change your URL later"
+msgstr ""
+
msgid "You can always edit this later"
msgstr ""
@@ -38349,10 +38881,10 @@ msgstr ""
msgid "You can’t %{tag_start}edit%{tag_end} files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
-msgid "You could not create a new trigger."
+msgid "You can’t edit files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
-msgid "You didn't renew your subscription for %{strong}%{namespace_name}%{strong_close} so it was downgraded to the free plan."
+msgid "You could not create a new trigger."
msgstr ""
msgid "You do not have any subscriptions yet"
@@ -38520,6 +39052,12 @@ msgstr ""
msgid "You must provide your current password in order to change it."
msgstr ""
+msgid "You must sign in to search for specific projects."
+msgstr ""
+
+msgid "You must sign in to search for specific terms."
+msgstr ""
+
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
@@ -38547,6 +39085,9 @@ msgstr ""
msgid "You need to upload a GitLab project export archive (ending in .gz)."
msgstr ""
+msgid "You need to verify your primary email first before enabling Two-Factor Authentication."
+msgstr ""
+
msgid "You successfully declined the invitation"
msgstr ""
@@ -38655,10 +39196,10 @@ msgstr ""
msgid "Your %{host} account was signed in to from a new location"
msgstr ""
-msgid "Your %{strong}%{plan_name}%{strong_close} subscription for %{strong}%{namespace_name}%{strong_close} will expire on %{strong}%{expires_on}%{strong_close}."
+msgid "Your %{strong}%{plan_name}%{strong_close} subscription expires on %{strong}%{expires_on}%{strong_close}. After that date, you cannot create issues or merge requests, or use many other features."
msgstr ""
-msgid "Your %{strong}%{plan_name}%{strong_close} subscription will expire on %{strong}%{expires_on}%{strong_close}. After that, you will not be able to create issues or merge requests as well as many other features."
+msgid "Your %{strong}%{plan_name}%{strong_close} subscription for %{strong}%{namespace_name}%{strong_close} will expire on %{strong}%{expires_on}%{strong_close}."
msgstr ""
msgid "Your CI/CD configuration syntax is invalid. View Lint tab for more details."
@@ -38682,7 +39223,7 @@ msgstr ""
msgid "Your GPG keys (%{count})"
msgstr ""
-msgid "Your GitLab account has been locked due to an excessive amount of unsuccessful sign in attempts. Your account will automatically unlock in %{duration} or you may click the link below to unlock now."
+msgid "Your GitLab account has been locked due to an excessive number of unsuccessful sign in attempts. You can wait for your account to automatically unlock in %{duration} or you can click the link below to unlock now."
msgstr ""
msgid "Your GitLab account request has been approved!"
@@ -38793,6 +39334,9 @@ msgstr ""
msgid "Your commit email is used for web based operations, such as edits and merges."
msgstr ""
+msgid "Your current password is required to register a two-factor authenticator app."
+msgstr ""
+
msgid "Your dashboard has been copied. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
@@ -38892,6 +39436,9 @@ msgstr ""
msgid "Your project limit is %{limit} projects! Please contact your administrator to increase it"
msgstr ""
+msgid "Your project will be created at:"
+msgstr ""
+
msgid "Your projects"
msgstr ""
@@ -38931,11 +39478,10 @@ msgstr ""
msgid "Your subscription expired!"
msgstr ""
-msgid "Your subscription has been downgraded."
-msgstr ""
-
-msgid "Your subscription will expire in %{remaining_days}."
-msgstr ""
+msgid "Your subscription will expire in %{remaining_days} day."
+msgid_plural "Your subscription will expire in %{remaining_days} days."
+msgstr[0] ""
+msgstr[1] ""
msgid "Your username is %{username}."
msgstr ""
@@ -39142,6 +39688,9 @@ msgstr ""
msgid "cannot merge"
msgstr ""
+msgid "cannot not be used for user namespace"
+msgstr ""
+
msgid "ciReport|%{degradedNum} degraded"
msgstr ""
@@ -39465,6 +40014,9 @@ msgstr ""
msgid "created %{timeAgo}"
msgstr ""
+msgid "created %{timeAgo} by %{author}"
+msgstr ""
+
msgid "created by"
msgstr ""
@@ -39509,9 +40061,6 @@ msgstr ""
msgid "does not have a supported extension. Only %{extension_list} are supported"
msgstr ""
-msgid "domain is not authorized for sign-up."
-msgstr ""
-
msgid "download it"
msgstr ""
@@ -39529,18 +40078,13 @@ msgstr ""
msgid "email '%{email}' is not a verified email."
msgstr ""
-msgid "email does not match the allowed domain of %{email_domains}"
-msgid_plural "email does not match the allowed domains: %{email_domains}"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "enabled"
msgstr ""
msgid "encrypted: needs to be a :required, :optional or :migrating!"
msgstr ""
-msgid "ending with MIME type format is not allowed."
+msgid "ending with a reserved file extension is not allowed."
msgstr ""
msgid "entries cannot be larger than 255 characters"
@@ -39564,6 +40108,9 @@ msgstr ""
msgid "estimateCommand|%{slash_command} overwrites the total estimated time."
msgstr ""
+msgid "example.com"
+msgstr ""
+
msgid "exceeds the limit of %{bytes} bytes"
msgstr ""
@@ -39614,9 +40161,6 @@ msgstr ""
msgid "fork"
msgstr ""
-msgid "fork this project"
-msgstr ""
-
msgid "from"
msgstr ""
@@ -39625,6 +40169,9 @@ msgid_plural "from %d jobs"
msgstr[0] ""
msgstr[1] ""
+msgid "frontmatter"
+msgstr ""
+
msgid "group"
msgstr ""
@@ -39652,6 +40199,9 @@ msgstr ""
msgid "has been completed."
msgstr ""
+msgid "has too deep level of nesting"
+msgstr ""
+
msgid "help"
msgstr ""
@@ -39685,9 +40235,21 @@ msgstr ""
msgid "in"
msgstr ""
+msgid "in Infrastructure :: Kubernetes clusters"
+msgstr ""
+
+msgid "in all GitLab"
+msgstr ""
+
+msgid "in group"
+msgstr ""
+
msgid "in group %{link_to_group}"
msgstr ""
+msgid "in project"
+msgstr ""
+
msgid "in project %{link_to_project}"
msgstr ""
@@ -39729,16 +40291,19 @@ msgstr ""
msgid "is not a valid X509 certificate."
msgstr ""
-msgid "is not allowed since the group is not top-level group."
+msgid "is not allowed for sign-up."
msgstr ""
-msgid "is not allowed. Try again with a different email address, or contact your GitLab admin."
+msgid "is not allowed for this group."
msgstr ""
-msgid "is not allowed. We do not currently support project-level iterations"
+msgid "is not allowed for this project."
+msgstr ""
+
+msgid "is not allowed since the group is not top-level group."
msgstr ""
-msgid "is not from an allowed domain."
+msgid "is not allowed. We do not currently support project-level iterations"
msgstr ""
msgid "is not in the group enforcing Group Managed Account"
@@ -39831,6 +40396,9 @@ msgstr ""
msgid "log in"
msgstr ""
+msgid "managed"
+msgstr ""
+
msgid "manual"
msgstr ""
@@ -39878,6 +40446,9 @@ msgstr ""
msgid "mrWidget| Please restore it or use a different %{missingBranchName} branch"
msgstr ""
+msgid "mrWidget|%{linkStart}Set up now%{linkEnd} to analyze your source code for known security vulnerabilities."
+msgstr ""
+
msgid "mrWidget|%{mergeError}."
msgstr ""
@@ -39958,6 +40529,9 @@ msgid_plural "mrWidget|Closes issues"
msgstr[0] ""
msgstr[1] ""
+msgid "mrWidget|Create issue to resolve all threads"
+msgstr ""
+
msgid "mrWidget|Delete source branch"
msgstr ""
@@ -39967,12 +40541,18 @@ msgstr ""
msgid "mrWidget|Did not close"
msgstr ""
+msgid "mrWidget|Dismiss"
+msgstr ""
+
msgid "mrWidget|Email patches"
msgstr ""
msgid "mrWidget|Failed to load deployment statistics"
msgstr ""
+msgid "mrWidget|Hide %{widget} details"
+msgstr ""
+
msgid "mrWidget|If the %{missingBranchName} branch exists in your local repository, you can merge this merge request manually using the command line"
msgstr ""
@@ -40068,9 +40648,6 @@ msgstr ""
msgid "mrWidget|Request to merge"
msgstr ""
-msgid "mrWidget|Resolve all threads in new issue"
-msgstr ""
-
msgid "mrWidget|Resolve conflicts"
msgstr ""
@@ -40086,6 +40663,9 @@ msgstr ""
msgid "mrWidget|Revoke approval"
msgstr ""
+msgid "mrWidget|SAST and Secret Detection is not enabled."
+msgstr ""
+
msgid "mrWidget|Set by %{merge_author} to be added to the merge train when the pipeline succeeds"
msgstr ""
@@ -40095,6 +40675,9 @@ msgstr ""
msgid "mrWidget|Set by %{merge_author} to start a merge train when the pipeline succeeds"
msgstr ""
+msgid "mrWidget|Show %{widget} details"
+msgstr ""
+
msgid "mrWidget|The changes were merged into"
msgstr ""
@@ -40107,6 +40690,9 @@ msgstr ""
msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure, or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
msgstr ""
+msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure."
+msgstr ""
+
msgid "mrWidget|The source branch has been deleted"
msgstr ""
@@ -40149,6 +40735,9 @@ msgstr ""
msgid "mrWidget|You can merge after removing denied licenses"
msgstr ""
+msgid "mrWidget|You can only merge once this merge request is approved."
+msgstr ""
+
msgid "mrWidget|Your password"
msgstr ""
@@ -40185,6 +40774,9 @@ msgstr ""
msgid "must be less than the limit of %{tag_limit} tags"
msgstr ""
+msgid "must be set for a project namespace"
+msgstr ""
+
msgid "must be unique by status and elapsed time within a policy"
msgstr ""
@@ -40294,6 +40886,9 @@ msgstr ""
msgid "pipeline"
msgstr ""
+msgid "pipeline schedules documentation"
+msgstr ""
+
msgid "pod_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
msgstr ""
@@ -40343,16 +40938,25 @@ msgstr ""
msgid "project name"
msgstr ""
+msgid "project namespace cannot be the parent of another namespace"
+msgstr ""
+
msgid "projects"
msgstr ""
msgid "quick actions"
msgstr ""
-msgid "reCAPTCHA Private Key"
+msgid "reCAPTCHA"
+msgstr ""
+
+msgid "reCAPTCHA helps prevent credential stuffing."
msgstr ""
-msgid "reCAPTCHA Site Key"
+msgid "reCAPTCHA private key"
+msgstr ""
+
+msgid "reCAPTCHA site key"
msgstr ""
msgid "recent activity"
@@ -40579,6 +41183,9 @@ msgstr ""
msgid "user avatar"
msgstr ""
+msgid "user namespace cannot be the parent of another namespace"
+msgstr ""
+
msgid "user preferences"
msgstr ""
@@ -40671,3 +41278,9 @@ msgstr ""
msgid "your settings"
msgstr ""
+msgid "{group}"
+msgstr ""
+
+msgid "{project}"
+msgstr ""
+
diff --git a/locale/ro_RO/gitlab.po b/locale/ro_RO/gitlab.po
index a686a80c8b5..cfd2ea26fac 100644
--- a/locale/ro_RO/gitlab.po
+++ b/locale/ro_RO/gitlab.po
@@ -14,10 +14,7 @@ msgstr ""
"X-Crowdin-Language: ro\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-09-02 01:24\n"
-
-msgid " %{name}, confirm your email address now! "
-msgstr " %{name}, confirmă adresa de e-mail acum! "
+"PO-Revision-Date: 2021-10-04 20:18\n"
msgid " %{start} to %{end}"
msgstr " de la %{start} până la %{end}"
@@ -32,7 +29,7 @@ msgid " Please sign in."
msgstr " Vă rugăm să vă autentificați."
msgid " Target Path"
-msgstr " Traiectoria țintă"
+msgstr " Calea țintă"
msgid " Try to %{action} this file again."
msgstr " Încercați să %{action} acest fișier din nou."
@@ -74,7 +71,7 @@ msgid " or %{emphasisStart}#issue id%{emphasisEnd}"
msgstr " sau %{emphasisStart}#ID problemă%{emphasisEnd}"
msgid " or %{emphasisStart}&epic id%{emphasisEnd}"
-msgstr " sau %{emphasisStart}&ID epică%{emphasisEnd}"
+msgstr " sau %{emphasisStart}&epic id%{emphasisEnd}"
msgid " or references (e.g. path/to/project!merge_request_id)"
msgstr " sau referințe (de exemplu, cale/către/project!merge_request_id)"
@@ -94,6 +91,18 @@ msgstr "Parametrul \"el\" este necesar pentru createInstance()"
msgid "#general, #development"
msgstr "#general, #development"
+msgid "%d Alert"
+msgid_plural "%d Alerts"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+msgid "%d Alert:"
+msgid_plural "%d Alerts:"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
msgid "%d Approval"
msgid_plural "%d Approvals"
msgstr[0] "%d Aprobare"
@@ -156,7 +165,7 @@ msgstr[2] "%d de caractere rămase"
msgid "%d child epic"
msgid_plural "%d child epics"
-msgstr[0] "%d epică copil"
+msgstr[0] "%d epic copil"
msgstr[1] "%d epici copil"
msgstr[2] "%d de epici copil"
@@ -231,8 +240,8 @@ msgstr[2] "%d de zile"
msgid "%d epic"
msgid_plural "%d epics"
-msgstr[0] "%d epică"
-msgstr[1] "%d de epici"
+msgstr[0] "%d epic"
+msgstr[1] "%d epici"
msgstr[2] "%d de epici"
msgid "%d error"
@@ -297,9 +306,9 @@ msgstr[2] "%d de ore"
msgid "%d inaccessible merge request"
msgid_plural "%d inaccessible merge requests"
-msgstr[0] "%d cerere de îmbinare inaccesibilă"
-msgstr[1] "%d cereri de îmbinare inaccesibile"
-msgstr[2] "%d de cereri de îmbinare inaccesibile"
+msgstr[0] "%d merge request inaccesibil"
+msgstr[1] "%d merge request-uri inaccesibile"
+msgstr[2] "%d de merge request-uri inaccesibile"
msgid "%d issue"
msgid_plural "%d issues"
@@ -327,15 +336,15 @@ msgstr[2] "%d de nivele"
msgid "%d merge request"
msgid_plural "%d merge requests"
-msgstr[0] "%d cerere de îmbinare"
-msgstr[1] "%d cereri de îmbinare"
-msgstr[2] "%d de cereri de îmbinare"
+msgstr[0] "%d merge request"
+msgstr[1] "%d merge request-uri"
+msgstr[2] "%d de merge request-uri"
msgid "%d merge request that you don't have access to."
msgid_plural "%d merge requests that you don't have access to."
-msgstr[0] "%d cerere de îmbinare la care nu aveți acces."
-msgstr[1] "%d cereri de îmbinare la care nu aveți acces."
-msgstr[2] "%d de cereri de îmbinare la care nu aveți acces."
+msgstr[0] "%d merge request la care nu aveți acces."
+msgstr[1] "%d merge request-uri la care nu aveți acces."
+msgstr[2] "%d de merge request-uri la care nu aveți acces."
msgid "%d metric"
msgid_plural "%d metrics"
@@ -429,9 +438,9 @@ msgstr[2] "%d de etichete pe nume de imagine"
msgid "%d token has expired"
msgid_plural "%d tokens have expired"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "%d token a expirat"
+msgstr[1] "%d tokenuri au expirat"
+msgstr[2] "%d de tokenuri au expirat"
msgid "%d unassigned issue"
msgid_plural "%d unassigned issues"
@@ -513,18 +522,21 @@ msgstr[2] "%{bold_start}%{count}%{bold_end} de membrii"
msgid "%{bold_start}%{count}%{bold_end} opened merge request"
msgid_plural "%{bold_start}%{count}%{bold_end} opened merge requests"
-msgstr[0] "%{bold_start}%{count}%{bold_end} cerere de îmbinare deschisă"
+msgstr[0] "%{bold_start}%{count}%{bold_end} merge request deschis"
msgstr[1] "%{bold_start}%{count}%{bold_end} cereri de îmbinare deschise"
msgstr[2] "%{bold_start}%{count}%{bold_end} de cereri de îmbinare deschise"
msgid "%{code_open}Masked:%{code_close} Hidden in job logs. Must match masking requirements."
-msgstr "%{code_open}Mascat:%{code_close} Ascuns în jurnalele de joburi. Trebuie să corespundă cerințelor de mascare."
+msgstr "%{code_open}Mascat:%{code_close} Ascuns în log-urile de joburi. Trebuie să corespundă cerințelor de mascare."
msgid "%{code_open}Protected:%{code_close} Only exposed to protected branches or tags."
msgstr "%{code_open}Protejat:%{code_close} Este expus numai la ramurile sau etichetele protejate."
-msgid "%{commit_author_link} authored %{commit_timeago}"
-msgstr "%{commit_author_link} redactat %{commit_timeago}"
+msgid "%{commit_author_link} authored %{commit_authored_timeago}"
+msgstr ""
+
+msgid "%{commit_author_link} authored %{commit_authored_timeago} and %{commit_committer_avatar} %{commit_committer_link} committed %{commit_committer_timeago}"
+msgstr ""
msgid "%{completedCount} completed weight"
msgstr "%{completedCount} greutate finalizată"
@@ -596,7 +608,7 @@ msgid "%{count} related %{pluralized_subject}: %{links}"
msgstr "%{count} legate de %{pluralized_subject}: %{links}"
msgid "%{count} selected"
-msgstr ""
+msgstr "%{count} selectat(e)"
msgid "%{count} total weight"
msgstr "%{count} greutate totală"
@@ -622,6 +634,15 @@ msgstr "%{doc_link_start}Căutarea avansată%{doc_link_end} este dezactivată de
msgid "%{doc_link_start}Advanced search%{doc_link_end} is enabled."
msgstr "%{doc_link_start}Căutarea avansată%{doc_link_end} este activată."
+msgid "%{docs_link_start}Learn about visibility levels.%{docs_link_end}"
+msgstr ""
+
+msgid "%{docs_link_start}What is Large File Storage?%{docs_link_end}"
+msgstr ""
+
+msgid "%{docs_link_start}What is two-factor authentication?%{docs_link_end}"
+msgstr ""
+
msgid "%{due_date} (Past due)"
msgstr "%{due_date} (Cu scadență depășită)"
@@ -644,7 +665,7 @@ msgid "%{emailPrefix}@company.com"
msgstr "%{emailPrefix}@company.com"
msgid "%{extra} more downstream pipelines"
-msgstr "%{extra} mai multe conducte downstream"
+msgstr "%{extra} mai multe pipeline-uri downstream"
msgid "%{filePath} deleted"
msgstr "%{filePath} șters"
@@ -689,14 +710,11 @@ msgid "%{integrations_link_start}Integrations%{link_end} enable you to make thir
msgstr "%{integrations_link_start}Integrations%{link_end} vă permit să faceți aplicații terțe parte din fluxul de lucru GitLab. Dacă integrările disponibile nu vă satisfac nevoile, luați în considerare utilizarea unui %{webhooks_link_start}webhook%{link_end}."
msgid "%{issuableType} will be removed! Are you sure?"
-msgstr "%{issuableType} va fi eliminat! Esti sigur?"
+msgstr "%{issuableType} va fi eliminat! Sunteți sigur?"
msgid "%{issueType} actions"
msgstr "%{issueType} acțiuni"
-msgid "%{issuesCount} issues with a limit of %{maxIssueCount}"
-msgstr "%{issuesCount} probleme cu o limită de %{maxIssueCount}"
-
msgid "%{issuesSize} with a limit of %{maxIssueCount}"
msgstr "%{issuesSize} cu o limită de %{maxIssueCount}"
@@ -746,7 +764,7 @@ msgid "%{labelStart}Severity:%{labelEnd} %{severity}"
msgstr "%{labelStart}Severitate:%{labelEnd} %{severity}"
msgid "%{labelStart}Tool:%{labelEnd} %{reportType}"
-msgstr ""
+msgstr "%{labelStart}Unealtă:%{labelEnd} %{reportType}"
msgid "%{labelStart}Unmodified response:%{labelEnd} %{headers}"
msgstr "%{labelStart}Răspuns nemodificat:%{labelEnd} %{headers}"
@@ -754,6 +772,12 @@ msgstr "%{labelStart}Răspuns nemodificat:%{labelEnd} %{headers}"
msgid "%{label_for_message} unavailable"
msgstr "%{label_for_message} indisponibil"
+msgid "%{learn_more_link}."
+msgstr ""
+
+msgid "%{lessThan} 1 hour"
+msgstr ""
+
msgid "%{lets_encrypt_link_start}Let's Encrypt%{lets_encrypt_link_end} is a free, automated, and open certificate authority (CA) that issues digital certificates to enable HTTPS (SSL/TLS) for sites."
msgstr "%{lets_encrypt_link_start}Let's Encrypt%{lets_encrypt_link_end} este o autoritate de certificare gratuită, automată și deschisă (CA) care emite certificate digitale pentru a activa HTTPS (SSL/TLS) pentru site-uri."
@@ -766,14 +790,14 @@ msgstr "%{level_name} nu este permis, deoarece proiectul sursă al bifurcației
msgid "%{link_start}Learn more%{link_end} about roles."
msgstr "%{link_start}Învățați mai multe%{link_end} despre roluri."
-msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
-msgstr "%{link_start}Învățați mai multe%{link_end} despre ce informații sunt partajate cu GitLab Inc."
-
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
-msgstr "%{link_start}Eliminați %{draft_snippet} prefixul%{link_end} din titlu pentru a permite ca această solicitare de îmbinare să fie îmbinată când este gata."
+msgstr "%{link_start}Eliminați %{draft_snippet} prefixul%{link_end} din titlu pentru a permite ca acest merge request să fie îmbinat când este gata."
msgid "%{link_start}Start the title with %{draft_snippet}%{link_end} to prevent a merge request that is a work in progress from being merged before it's ready."
-msgstr "%{link_start}Porniți titlul cu %{draft_snippet}%{link_end} pentru a împiedica îmbinarea unei cereri de îmbinare care este o lucrare în curs înainte de a fi gata."
+msgstr "%{link_start}Începeți titlul cu %{draft_snippet}%{link_end} pentru a preveni merge request-ul care este o lucrare în curs de a fi îmbinat înainte de a fi gata."
+
+msgid "%{link_start}What information does GitLab Inc. collect?%{link_end}"
+msgstr ""
msgid "%{listToShow}, and %{awardsListLength} more"
msgstr "%{listToShow}, și încă %{awardsListLength} mai multe"
@@ -869,7 +893,7 @@ msgid "%{percentage}%% weight completed"
msgstr "%{percentage}%% greutate finalizată"
msgid "%{percent}%% complete"
-msgstr "%{percent}%% completat"
+msgstr "%{percent}%% finalizat"
msgid "%{percent}%{percentSymbol} complete"
msgstr "%{percent}%{percentSymbol} completat"
@@ -888,9 +912,9 @@ msgstr "%{ref} nu poate fi adăugat: %{error}"
msgid "%{releases} release"
msgid_plural "%{releases} releases"
-msgstr[0] "%{releases} versiune"
-msgstr[1] "%{releases} versiuni"
-msgstr[2] "%{releases} de versiuni"
+msgstr[0] "%{releases} lansare"
+msgstr[1] "%{releases} lansări"
+msgstr[2] "%{releases} de lansări"
msgid "%{remaining_approvals} left"
msgstr "%{remaining_approvals} rămase"
@@ -914,7 +938,7 @@ msgid "%{rotation} has been recalculated with the remaining participants. Please
msgstr "%{rotation} a fost recalculat cu participanții rămași. Vă rugăm să examinați noua configurare pentru %{rotation}. Este recomandat să luați legătura cu respondentul de apel curent pentru a asigura continuitatea acoperirii de apel."
msgid "%{scope} results for term '%{term}'"
-msgstr ""
+msgstr "%{scope} rezultate pentru termenul '%{term}'"
msgid "%{seconds}s"
msgstr "%{seconds}s"
@@ -931,8 +955,8 @@ msgstr[0] "Rezultatul %{securityScanner} nu este disponibil deoarece nu a fost r
msgstr[1] "Rezultatele %{securityScanner} nu sunt disponibile deoarece nu a fost rulată o conductă de când a fost activată. %{linkStart}Executați o conductă%{linkEnd}"
msgstr[2] "Rezultatele %{securityScanner} nu sunt disponibile deoarece nu a fost rulată o conductă de când a fost activată. %{linkStart}Executați o conductă%{linkEnd}"
-msgid "%{service_ping_link_start}Learn more%{service_ping_link_end} about what information is shared with GitLab Inc."
-msgstr "%{service_ping_link_start}Învățați mai multe%{service_ping_link_end} despre ce informații sunt partajate cu GitLab Inc."
+msgid "%{service_ping_link_start}What information is shared with GitLab Inc.?%{service_ping_link_end}"
+msgstr ""
msgid "%{size} %{unit}"
msgstr "%{size} %{unit}"
@@ -967,6 +991,9 @@ msgstr "de la %{start} până la %{end}"
msgid "%{state} epics"
msgstr "%{state} epice"
+msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
+msgstr ""
+
msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
msgstr "%{strongStart}Sfat:%{strongEnd} Puteți de asemenea să verificați cererile de îmbinare la nivel local %{linkStart}urmând aceste instrucțiuni%{linkEnd}"
@@ -1033,12 +1060,6 @@ msgstr "%{tag}-%{evidence}-%{filename}"
msgid "%{template_project_id} is unknown or invalid"
msgstr "%{template_project_id} este necunoscut sau invalid"
-msgid "%{text} %{files}"
-msgid_plural "%{text} %{files} files"
-msgstr[0] "%{text} %{files}"
-msgstr[1] "%{text} %{files} fișiere"
-msgstr[2] "%{text} %{files} de fișiere"
-
msgid "%{text} is available"
msgstr "%{text} este disponibil"
@@ -1055,7 +1076,7 @@ msgid "%{title} %{operator} %{threshold}"
msgstr "%{title} %{operator} %{threshold}"
msgid "%{title} changes"
-msgstr "Modificările %{title}"
+msgstr "%{title} modificări"
msgid "%{totalCpu} (%{freeSpacePercentage}%{percentSymbol} free)"
msgstr "%{totalCpu} (%{freeSpacePercentage}%{percentSymbol} gratuit)"
@@ -1085,7 +1106,7 @@ msgid "%{user_name} (%{user_username}) was removed from %{rotation} in %{schedul
msgstr "%{user_name} (%{user_username}) a fost îndepărtat de la %{rotation} la %{schedule} la %{project}. "
msgid "%{user_name} profile page"
-msgstr "pagina de profil a lui %{user_name}"
+msgstr "%{user_name} pagină profil"
msgid "%{username} changed the draft status of merge request %{mr_link}"
msgstr "%{username} a modificat starea de schiță a cererii de îmbinare %{mr_link}"
@@ -1123,9 +1144,6 @@ msgstr "%{webhooks_link_start}%{webhook_type}%{link_end} vă permit să trimiteÈ
msgid "%{wildcards_link_start}Wildcards%{wildcards_link_end} such as %{code_tag_start}v*%{code_tag_end} or %{code_tag_start}*-release%{code_tag_end} are supported."
msgstr "%{wildcards_link_start}Jokerii%{wildcards_link_end} cum ar fi %{code_tag_start}v*%{code_tag_end} sau %{code_tag_start}*-lansare%{code_tag_end} sunt acceptați."
-msgid "&lt; 1 hour"
-msgstr "&lt; 1 oră"
-
msgid "'%{data}' at %{location} does not match format: %{format}"
msgstr "'%{data}' la %{location} nu se potrivește cu formatul: %{format}"
@@ -1210,9 +1228,6 @@ msgstr "(revocat)"
msgid "(we need your current password to confirm your changes)"
msgstr "(avem nevoie de parola curentă pentru a confirma modificările)"
-msgid "* * * * *"
-msgstr "* * * * *"
-
msgid "+ %{amount} more"
msgstr "+ %{amount} mai mult"
@@ -1282,12 +1297,12 @@ msgstr "- arătați mai puțin"
msgid "."
msgstr "."
+msgid "/"
+msgstr ""
+
msgid "0 bytes"
msgstr "0 octeți"
-msgid "0 for unlimited, only effective with remote storage enabled."
-msgstr "0 pentru nelimitat, doar cu stocarea la distanță activată."
-
msgid "0t1DgySidms"
msgstr "0t1DgySidms"
@@ -1311,15 +1326,15 @@ msgstr[2] "%{issues} de probleme închise"
msgid "1 closed merge request"
msgid_plural "%{merge_requests} closed merge requests"
-msgstr[0] "Un merge request închis"
+msgstr[0] "1 merge request închis"
msgstr[1] "%{merge_requests} merge request-uri închise"
msgstr[2] "%{merge_requests} de merge request-uri închise"
msgid "1 day"
msgid_plural "%d days"
-msgstr[0] "O Zi"
-msgstr[1] "%d Zile"
-msgstr[2] "%d de Zile"
+msgstr[0] "1 zi"
+msgstr[1] "%d zile"
+msgstr[2] "%d de zile"
msgid "1 day remaining"
msgid_plural "%d days remaining"
@@ -1371,9 +1386,9 @@ msgstr[2] "%d de cereri de îmbinare selectate"
msgid "1 merged merge request"
msgid_plural "%{merge_requests} merged merge requests"
-msgstr[0] "1 cerere de îmbinare îmbinată"
-msgstr[1] "%{merge_requests} cereri de îmbinare îmbinate"
-msgstr[2] "%{merge_requests} de cereri de îmbinare îmbinate"
+msgstr[0] "1 merge request îmbinat"
+msgstr[1] "%{merge_requests} merge request-uri îmbinate"
+msgstr[2] "%{merge_requests} de merge request-uri îmbinate"
msgid "1 minute"
msgid_plural "%d minutes"
@@ -1395,15 +1410,15 @@ msgstr[2] "%{issues} de probleme deschise"
msgid "1 open merge request"
msgid_plural "%{merge_requests} open merge requests"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "1 merge request deschis"
+msgstr[1] "%{merge_requests} merge request-uri deschise"
+msgstr[2] "%{merge_requests} de merge request-uri deschise"
msgid "1 pipeline"
msgid_plural "%d pipelines"
-msgstr[0] "1 conductă"
-msgstr[1] "%d conducte"
-msgstr[2] "%d de conducte"
+msgstr[0] "1 pipeline"
+msgstr[1] "%d pipeline-uri"
+msgstr[2] "%d de pipeline-uri"
msgid "1 role"
msgid_plural "%d roles"
@@ -1438,6 +1453,9 @@ msgstr "10-19 contribuții"
msgid "1000+"
msgstr "1000+"
+msgid "192.168.0.0/24"
+msgstr ""
+
msgid "1st contribution!"
msgstr "Prima contribuție!"
@@ -1580,7 +1598,7 @@ msgid "A new Release %{tag} for %{name} was published. Visit the Releases page t
msgstr "A fost publicată o nouă versiune %{tag} pentru %{name}. Vizitați pagina Lansări pentru a citi mai multe despre aceasta:"
msgid "A new branch will be created in your fork and a new merge request will be started."
-msgstr "O nouă ramură va fi creată în bifurcația dvs. și va fi inițiată o nouă cerere de îmbinare."
+msgstr "O nouă ramură va fi creată în bifurcația dvs. și un nou merge request va fi pornit."
msgid "A new impersonation token has been created."
msgstr "A fost creat un nou token de impersonare."
@@ -1591,9 +1609,6 @@ msgstr "O epică neconfidențială nu poate fi atribuită unei epice părinte co
msgid "A plain HTML site that uses Netlify for CI/CD instead of GitLab, but still with all the other great GitLab features"
msgstr "Un site HTML simplu care folosește Netlify pentru CI / CD în loc de GitLab, dar cu toate celelalte funcții GitLab."
-msgid "A plain-text response to show to clients that hit the rate limit."
-msgstr "Un răspuns în text simplu care se afișează clienților care au atins limita frecvenței."
-
msgid "A platform value can be web, mob or app."
msgstr "O valoare a platformei poate fi web, mob sau aplicație."
@@ -1652,10 +1667,10 @@ msgid "API?"
msgstr "API?"
msgid "APIFuzzing|$VARIABLE_WITH_PASSWORD"
-msgstr ""
+msgstr "$VARIABLE_WITH_PASSWORD"
msgid "APIFuzzing|$VARIABLE_WITH_USERNAME"
-msgstr ""
+msgstr "$VARIABLE_WITH_USERNAME"
msgid "APIFuzzing|API Fuzzing Configuration"
msgstr "API Fuzzing Configuration"
@@ -1675,17 +1690,17 @@ msgstr "Fragmentul de cod nu a putut fi generat. Încercați mai târziu."
msgid "APIFuzzing|Configure HTTP basic authentication values. Other authentication methods are supported. %{linkStart}Learn more%{linkEnd}."
msgstr "Configurați valorile de autentificare de bază HTTP. Sunt acceptate și alte metode de autentificare. %{linkStart}Aflați mai multe%{linkEnd}."
-msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
-msgstr "Personalizați setările comune de fuzzing API pentru a se potrivi cerințelor dumneavoastră. Pentru detalii despre opțiunile de configurare mai avansate, consultați %{docsLinkStart}documentația GitLab API Fuzzing%{docsLinkEnd}."
+msgid "APIFuzzing|Customize your project's API fuzzing configuration options and copy the code snippet to your .gitlab-ci.yml file to apply any changes. Note that this tool does not reflect or update your .gitlab-ci.yml file automatically. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
+msgstr ""
msgid "APIFuzzing|Enable authentication"
msgstr "Activați autentificarea"
msgid "APIFuzzing|Enter the name of the CI variable containing the password. For example, $VARIABLE_WITH_PASSWORD."
-msgstr ""
+msgstr "Introduceți numele variabilei CI ce conține parola. De exemplu, $VARIABLE_WITH_PASSWORD."
msgid "APIFuzzing|Enter the name of the CI variable containing the username. For example, $VARIABLE_WITH_USERNAME."
-msgstr ""
+msgstr "Introduceți numele variabilei CI ce conține numele de utilizator. De exemplu, $VARIABLE_WITH_USERNAME."
msgid "APIFuzzing|File path or URL to APIs to be tested. For example, folder/example_fuzz.har. HAR files may contain sensitive information such as authentication tokens, API keys, and session cookies. We recommend that you review the HAR files' contents before adding them to a repository."
msgstr "Calea fișierului sau adresa URL către API-urile de testat. De exemplu, folder/example_fuzz.har. Fișierele HAR pot conține informații sensibile, cum ar fi token-uri de autentificare, chei API și cookie-uri de sesiune. Vă recomandăm să examinați conținutul fișierelor HAR înainte de a le adăuga la un depozit."
@@ -1738,9 +1753,6 @@ msgstr "Pentru a preveni o breșă de securitate, informațiile de autentificare
msgid "APIFuzzing|To prevent a security leak, authentication info must be added as a %{ciVariablesLinkStart}CI variable%{ciVariablesLinkEnd}. As a user with maintainer access rights, you can manage CI variables in the %{ciSettingsLinkStart}Settings%{ciSettingsLinkEnd} area."
msgstr "Pentru a preveni o breșă de securitate, informațiile de autentificare trebuie adăugate ca o %{ciVariablesLinkStart}variabilă CI%{ciVariablesLinkEnd}. În calitate de utilizator cu drepturi de acces de tip întreținător, puteți gestiona variabilele CI în zona %{ciSettingsLinkStart}Setări%{ciSettingsLinkEnd}."
-msgid "APIFuzzing|Use this tool to generate API fuzzing configuration YAML to copy into your .gitlab-ci.yml file. This tool does not reflect or update your .gitlab-ci.yml file automatically."
-msgstr "Utilizați acest instrument pentru a genera configurația YAML de API fuzzing pentru a o copia în fișierul .gitlab-ci.yml. Acest instrument nu reflectă sau actualizează automat fișierul .gitlab-ci.yml."
-
msgid "APIFuzzing|Username for basic authentication"
msgstr "Nume utilizator pentru autentificare de bază"
@@ -1792,9 +1804,6 @@ msgstr "Rapoarte abuz"
msgid "Abuse reports notification email"
msgstr "Notificare e-mail rapoarte abuz"
-msgid "Abuse reports will be sent to this address if it is set. Abuse reports are always available in the admin area."
-msgstr "Rapoartele de abuz vor fi trimise la această adresă, dacă aceasta este setată. Rapoartele de abuzuri sunt întotdeauna disponibile în zona de administrare."
-
msgid "Accept invitation"
msgstr "Acceptați invitația"
@@ -1831,12 +1840,18 @@ msgstr "Accesul interzis. Verificați nivelul de acces."
msgid "Access granted"
msgstr "Acces acordat"
+msgid "Access key ID"
+msgstr ""
+
msgid "Access requests"
msgstr "Cereri de acces"
msgid "Access to '%{classification_label}' not allowed"
msgstr "Accesul la \"%{classification_label}\" nu este permis"
+msgid "Access tokens expire after 2 hours. A refresh token may be used at any time to generate a new access token. Non-expiring access tokens are deprecated. Clear this setting to enable backward compatibility."
+msgstr ""
+
msgid "AccessDropdown|Deploy Keys"
msgstr "Chei de implementare"
@@ -1889,7 +1904,7 @@ msgid "AccessTokens|Static object token"
msgstr "Token obiect static"
msgid "AccessTokens|They are the only accepted password when you have Two-Factor Authentication (2FA) enabled."
-msgstr "Sunt singurele parole acceptate când aveți activată Autentificarea în doi pași."
+msgstr "Sunt singurele parole acceptate când aveți activată Autentificarea în doi pași(2FA)."
msgid "AccessTokens|You can also use personal access tokens to authenticate against Git over HTTP."
msgstr "De asemenea, puteți folosi token-uri de acces personal pentru a vă autentifica la Git prin HTTP."
@@ -2149,6 +2164,9 @@ msgstr "Adăugați o aplicație nouă"
msgid "Add new directory"
msgstr "Adăugați un director nou"
+msgid "Add new service account"
+msgstr ""
+
msgid "Add or remove previously merged commits"
msgstr "Adăugați sau eliminați comiteri îmbinate anterior"
@@ -2386,6 +2404,9 @@ msgstr "Dezvoltator"
msgid "AdminArea|Features"
msgstr "Funcții"
+msgid "AdminArea|Get security updates from GitLab and stay up to date"
+msgstr ""
+
msgid "AdminArea|Groups"
msgstr "Grupuri"
@@ -2425,17 +2446,23 @@ msgstr "Proiecte"
msgid "AdminArea|Reporter"
msgstr "Reporter"
+msgid "AdminArea|Sign up for the GitLab Security Newsletter to get notified for security updates."
+msgstr ""
+
+msgid "AdminArea|Sign up for the GitLab newsletter"
+msgstr ""
+
msgid "AdminArea|Stop all jobs"
-msgstr "Opriți toate joburile"
+msgstr "Opriți toate job-urile"
msgid "AdminArea|Stop all jobs?"
-msgstr "Opriți toate joburile?"
+msgstr "Opriți toate job-urile?"
msgid "AdminArea|Stop jobs"
msgstr "Opriți joburile"
msgid "AdminArea|Stopping jobs failed"
-msgstr "Oprirea joburilor a eșuat"
+msgstr "Oprirea job-urilor a eșuat"
msgid "AdminArea|Total users"
msgstr "Total utilizatori"
@@ -2462,7 +2489,7 @@ msgid "AdminArea|View latest users"
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 ""
+msgstr "Sunteți pe cale de a opri toate joburile. Acest lucru va opri toate joburile care rulează acum."
msgid "AdminDashboard|Error loading the statistics. Please try again"
msgstr "Eroare la încărcarea statisticilor. Vă rugăm încercați din nou"
@@ -2494,9 +2521,15 @@ msgstr "Dezactivare token feed"
msgid "AdminSettings|Disable public access to Pages sites"
msgstr "Dezactivați accesul public către site-uri Pagini"
+msgid "AdminSettings|Display a banner on merge requests in projects with no pipelines to initiate steps to add a .gitlab-ci.yml file."
+msgstr ""
+
msgid "AdminSettings|Domain verification is an essential security measure for public GitLab sites. Users are required to demonstrate they control a domain before it is enabled. %{link_start}Learn more.%{link_end}"
msgstr "Verificarea de domeniu este o măsură de securitate esențială pentru site-urile publice GitLab. Utilizatorii trebuie să demonstreze că controlează un domeniu înainte ca acesta să fie activat. %{link_start}Aflați mai multe.%{link_end}"
+msgid "AdminSettings|Enable pipeline suggestion banner"
+msgstr ""
+
msgid "AdminSettings|Enable shared runners for new projects"
msgstr "Activați executori comuni pentru proiecte noi"
@@ -2531,7 +2564,7 @@ msgid "AdminSettings|Require users to prove ownership of custom domains"
msgstr "Obligați utilizatorii să demonstreze proprietariatul domeniilor personalizate"
msgid "AdminSettings|Required pipeline configuration"
-msgstr "Configurație necesară conductă"
+msgstr "Configurație pipeline necesară"
msgid "AdminSettings|Select a CI/CD template"
msgstr "Selectați un șablon CI / CD"
@@ -2756,7 +2789,7 @@ msgid "AdminUsers|Is using seat"
msgstr "Utilizează locul"
msgid "AdminUsers|Issues authored by this user are hidden from other users."
-msgstr ""
+msgstr "Probleme create de acest utilizator sunt ascunse altor utilizatori."
msgid "AdminUsers|It's you!"
msgstr "Dvs. sunteți!"
@@ -2822,10 +2855,10 @@ msgid "AdminUsers|Sort by"
msgstr "Sortează după"
msgid "AdminUsers|The user can't access git repositories."
-msgstr ""
+msgstr "Acest utilizator nu poate accesa repozitorii git."
msgid "AdminUsers|The user can't log in."
-msgstr ""
+msgstr "Acest utilizator nu se poate autentifica."
msgid "AdminUsers|The user will be logged out"
msgstr "Utilizatorul va fi deconectat"
@@ -2894,7 +2927,7 @@ msgid "AdminUsers|What does this mean?"
msgstr "Ce înseamnă acest lucru?"
msgid "AdminUsers|When banned:"
-msgstr ""
+msgstr "Când banat:"
msgid "AdminUsers|When the user logs back in, their account will reactivate as a fully active account"
msgstr "Când utilizatorul se autentifică din nou, contul său va fi reactivat ca un cont complet activ"
@@ -2968,11 +3001,11 @@ msgstr "Notă"
msgid "Admin|Quarterly reconciliation will occur on %{qrtlyDate}"
msgstr "Reconcilierea trimestrială va avea loc la %{qrtlyDate}"
-msgid "Admin|The number of max seats used for your namespace is currently exceeding the number of seats in your subscription. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
-msgstr "Numărul maxim de locuri utilizate pentru spațiul dvs. de nume depășește în prezent numărul de locuri din abonament. La data de %{qrtlyDate}, GitLab va procesa o reconciliere trimestrială și vă va factura automat o sumă proporțională pentru depășirea numărului de locuri. Nu este necesară nicio acțiune din partea dvs. Dacă aveți un card de credit la dosar, acesta va fi debitat. În caz contrar, veți primi o factură."
+msgid "Admin|The number of max seats in your namespace exceeds the number of seats in your subscription. On %{qrtlyDate}, quarterly reconciliation occurs and you are automatically billed a prorated amount for the overage. No action is needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice. For more information about the timing of the invoicing process, view the documentation."
+msgstr ""
-msgid "Admin|The number of maximum users for your instance is currently exceeding the number of users in license. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
-msgstr "Numărul maxim de utilizatori pentru instanța dvs. depășește în prezent numărul de utilizatori din licență. La data de %{qrtlyDate}, GitLab va procesa o reconciliere trimestrială și vă va factura automat o sumă proporțională pentru depășirea numărului de utilizatori. Nu este necesară nicio acțiune din partea dvs. Dacă aveți un card de credit la dosar, acesta va fi debitat. În caz contrar, veți primi o factură."
+msgid "Admin|The number of max users in your instance exceeds the number of users in your license. On %{qrtlyDate}, quarterly reconciliation occurs and you are automatically billed a prorated amount for the overage. No action is needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice. For more information about the timing of the invoicing process, view the documentation."
+msgstr ""
msgid "Admin|View pending user approvals"
msgstr "Vedeți aprobările în așteptare ale utilizatorilor"
@@ -2992,9 +3025,6 @@ msgstr "Setări avansate"
msgid "Advanced export options"
msgstr "Opțiuni avansate de export"
-msgid "Advanced permissions, Large File Storage and Two-Factor authentication settings."
-msgstr "Permisiuni avansate, Setări Large File Storage și Autentificare în doi pași."
-
msgid "After a successful password update you will be redirected to login screen."
msgstr "După o actualizare cu succes a parolei, veți fi redirecționat către ecranul de autentificare."
@@ -3011,16 +3041,16 @@ msgid "After that, you will not be able to use merge approvals or epics as well
msgstr "După aceea, nu veți mai putea folosi aprobări de îmbinare sau epice precum și multe alte funcții de securitate."
msgid "After you've reviewed these contribution guidelines, you'll be all set to"
-msgstr "După ce ați analizat instrucțiunile privind contribuțiile, veți fi gata să"
+msgstr "După ce ați examinat aceste reguli privind contribuțiile, veți fi gata să"
+
+msgid "Akismet"
+msgstr ""
msgid "Akismet API Key"
msgstr "Cheia API Akismet"
-msgid "Alert"
-msgid_plural "Alerts"
-msgstr[0] "Alertă"
-msgstr[1] "Alerte"
-msgstr[2] "Alerte"
+msgid "Akismet helps prevent the creation of spam issues in public projects."
+msgstr ""
msgid "AlertManagement|Acknowledged"
msgstr "Recunoscut"
@@ -3221,7 +3251,7 @@ msgid "AlertSettings|Enter an example payload from your selected monitoring tool
msgstr "Introduceți un payload exemplu de la instrumentul de monitorizare selectat. Aceasta acceptă trimiterea de alerte către un punct final GitLab."
msgid "AlertSettings|Enter integration name"
-msgstr "Introducere nume integrare"
+msgstr "Introduceți numele integrării"
msgid "AlertSettings|Free versions of GitLab are limited to one integration per type. To add more, %{linkStart}upgrade your subscription%{linkEnd}."
msgstr "Versiunile gratuite ale GitLab sunt limitate la o singură integrare pe tip. Pentru a adăuga mai multe, %{linkStart}actualizați-vă abonamentul%{linkEnd}."
@@ -3376,6 +3406,9 @@ msgstr "Toate %{replicableType} sunt programate pentru %{action}."
msgid "All (default)"
msgstr "Toate (implicit)"
+msgid "All GitLab"
+msgstr ""
+
msgid "All Members"
msgstr "Toți membrii"
@@ -3490,6 +3523,9 @@ msgstr "Permiteți acestei chei să facă push către acest repozitoriu"
msgid "Allow this secondary node to replicate content on Object Storage"
msgstr "Permiteți acestui nod secundar să reproducă conținutul pe Object Storage"
+msgid "Allow use of licensed EE features"
+msgstr ""
+
msgid "Allow users to dismiss the broadcast message"
msgstr "Permiteți utilizatorilor să respingă mesajul difuzat"
@@ -3565,9 +3601,6 @@ msgstr "Logo Amazon Web Services"
msgid "Amazon authentication is not %{link_start}correctly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr "Autentificarea Amazon nu este %{link_start}configurată corect%{link_end}. Întrebați administratorul GitLab dacă doriți să utilizați acest serviciu."
-msgid "Amount of time (in hours) that users are allowed to skip forced configuration of two-factor authentication"
-msgstr "Cantitatea de timp (în ore) în care utilizatorii au voie să sară peste configurația forțată a autentificării în doi pași"
-
msgid "An %{link_start}alert%{link_end} with the same fingerprint is already open. To change the status of this alert, resolve the linked alert."
msgstr "O alertă %{link_start}alert%{link_end} cu aceeași amprentă digitală este deja deschisă. Pentru a schimba statutul acestei alerte, rezolvați alerta legată."
@@ -3584,7 +3617,7 @@ msgid "An alert has been triggered in %{project_path}."
msgstr "O alertă a fost declanșată în %{project_path}."
msgid "An application called %{link_to_client} is requesting access to your GitLab account."
-msgstr "O aplicație numită %{link_to_client} solicită accesul la contul dvs GitLab."
+msgstr "O aplicație numită %{link_to_client} solicită accesul la contul dvs. GitLab."
msgid "An email notification was recently sent from the admin panel. Please wait %{wait_time_in_words} before attempting to send another message."
msgstr "O notificare prin e-mail a fost trimisă recent din panoul de administrare. Vă rugăm să așteptați %{wait_time_in_words} înainte de a încerca să trimiteți un alt mesaj."
@@ -3628,12 +3661,6 @@ msgstr "A apărut o eroare de previzualizare a blobului"
msgid "An error occurred when removing the label."
msgstr "A apărut o eroare la îndepărtarea etichetei."
-msgid "An error occurred when toggling the notification subscription"
-msgstr "A apărut o eroare la comutarea abonamentului de notificare"
-
-msgid "An error occurred when updating the issue weight"
-msgstr "A apărut o eroare la actualizarea greutății problemei"
-
msgid "An error occurred when updating the title"
msgstr "A apărut o eroare la actualizarea titlului"
@@ -3682,6 +3709,9 @@ msgstr "A apărut o eroare în timpul trasării legăturilor de relații de munc
msgid "An error occurred while enabling Service Desk."
msgstr "A apărut o eroare la activarea Biroului de Servicii."
+msgid "An error occurred while fetching Markdown preview"
+msgstr ""
+
msgid "An error occurred while fetching ancestors"
msgstr "A apărut o eroare în timpul obținerii predecesorilor"
@@ -3712,9 +3742,6 @@ msgstr "S-a produs o eroare în timpul preluării problemelor."
msgid "An error occurred while fetching label colors."
msgstr "A apărut o eroare la preluarea culorilor etichetelor."
-msgid "An error occurred while fetching markdown preview"
-msgstr "A apărut o eroare la preluarea previzualizării markdown"
-
msgid "An error occurred while fetching participants"
msgstr "A apărut o eroare în timpul preluării participanților"
@@ -3730,9 +3757,6 @@ msgstr "A apărut o eroare în timpul preluării autocompletării proiectelor."
msgid "An error occurred while fetching reference"
msgstr "A apărut o eroare în timpul preluării referinței"
-msgid "An error occurred while fetching sidebar data"
-msgstr "A apărut o eroare la preluarea datelor barei laterale"
-
msgid "An error occurred while fetching tags. Retry the search."
msgstr "S-a produs o eroare în timpul preluării etichetelor. Reîncercați căutarea."
@@ -3808,11 +3832,14 @@ msgstr "S-a produs o eroare în timpul încărcării problemelor"
msgid "An error occurred while loading merge requests."
msgstr "S-a produs o eroare în timpul încărcării merge request-urilor."
-msgid "An error occurred while loading the Needs tab."
+msgid "An error occurred while loading projects."
msgstr ""
+msgid "An error occurred while loading the Needs tab."
+msgstr "A apărut o eroare la încărcarea filei Necesități."
+
msgid "An error occurred while loading the Test Reports tab."
-msgstr ""
+msgstr "A apărut o eroare la încărcarea filei Rapoarte test."
msgid "An error occurred while loading the access tokens form, please try again."
msgstr "A apărut o eroare în timpul încărcării formularului cu token-uri de acces, vă rugăm să încercați din nou."
@@ -3995,7 +4022,7 @@ msgid "An unknown error occurred."
msgstr "A apărut o eroare necunoscută."
msgid "Analytics"
-msgstr "Statistici"
+msgstr ""
msgid "Analyze a review version of your web application."
msgstr "Analizați o versiune de revizuire a aplicației dvs. web."
@@ -4042,12 +4069,6 @@ msgstr "Orice autor"
msgid "Any Milestone"
msgstr "Orice obiectiv"
-msgid "Any branch"
-msgstr "Orice ramură"
-
-msgid "Any eligible user"
-msgstr "Orice utilizator eligibil"
-
msgid "Any encrypted tokens"
msgstr "Orice token-uri criptate"
@@ -4066,6 +4087,9 @@ msgstr "Orice obiectiv"
msgid "Any namespace"
msgstr "Orice spațiu de nume"
+msgid "App Engine description and apps that are suitable for this deployment target"
+msgstr ""
+
msgid "App ID"
msgstr "ID Aplicație"
@@ -4112,7 +4136,7 @@ msgid "Application: %{name}"
msgstr "Aplicație: %{name}"
msgid "ApplicationSettings|After sign up text"
-msgstr "După înregistrarea textului"
+msgstr "Text după înscriere"
msgid "ApplicationSettings|Allowed domains for sign-ups"
msgstr "Domenii permise pentru înscrieri"
@@ -4216,6 +4240,12 @@ msgstr "Aplicat"
msgid "Apply"
msgstr "Aplică"
+msgid "Apply %d suggestion"
+msgid_plural "Apply %d suggestions"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
msgid "Apply a label"
msgstr "Aplicați o etichetă"
@@ -4225,14 +4255,11 @@ msgstr "Aplicați un șablon"
msgid "Apply suggestion"
msgstr "Aplicați sugestia"
-msgid "Apply suggestions"
-msgstr "Aplică sugestii"
-
msgid "Apply template"
msgstr "Aplicați șablonul"
-msgid "Apply this approval rule to any branch or a specific protected branch."
-msgstr "Aplicați această regulă de aprobare la orice ramură sau la o anumită ramură protejată."
+msgid "Apply this approval rule to all branches or a specific protected branch."
+msgstr ""
msgid "Applying"
msgstr "Aplicare"
@@ -4292,7 +4319,7 @@ msgstr[1] "%{count} aprobări necesare de la %{membersCount}"
msgstr[2] "%{count} de aprobări necesare de la %{membersCount}"
msgid "ApprovalRule|%{firstLabel} +%{numberOfAdditionalLabels} more"
-msgstr ""
+msgstr "%{firstLabel} + încă %{numberOfAdditionalLabels}"
msgid "ApprovalRule|Add approvers"
msgstr "Adăugați aprobatori"
@@ -4301,13 +4328,13 @@ msgid "ApprovalRule|All scanners"
msgstr "Toate scanerele"
msgid "ApprovalRule|All severity levels"
-msgstr ""
+msgstr "Toate nivelele de severitate"
msgid "ApprovalRule|Apply this approval rule to consider only the selected security scanners."
msgstr "Aplicați această regulă de aprobare pentru a lua în considerare doar scanerele de securitate selectate."
msgid "ApprovalRule|Apply this approval rule to consider only the selected severity levels."
-msgstr ""
+msgstr "Aplicați această regulă de aprobare pentru a considera doar nivelele de severitate selectate."
msgid "ApprovalRule|Approval rules"
msgstr "Reguli de aprobare"
@@ -4337,7 +4364,7 @@ msgid "ApprovalRule|Please select at least one security scanner"
msgstr "Vă rugăm să selectați cel puțin un scaner de securitate"
msgid "ApprovalRule|Please select at least one severity level"
-msgstr ""
+msgstr "Vă rugăm selectați măcar un nivel de severitate"
msgid "ApprovalRule|Rule name"
msgstr "Numele regulii"
@@ -4352,10 +4379,10 @@ msgid "ApprovalRule|Select scanners"
msgstr "Selectați scanerele"
msgid "ApprovalRule|Select severity levels"
-msgstr ""
+msgstr "Selectați nivele de severitate"
msgid "ApprovalRule|Severity levels"
-msgstr ""
+msgstr "Nivele severitate"
msgid "ApprovalRule|Target branch"
msgstr "Ramura țintă"
@@ -4367,25 +4394,22 @@ msgid "ApprovalSettings|Merge request approval settings have been updated."
msgstr "Setările de aprobare a cererilor de îmbinare au fost actualizate."
msgid "ApprovalSettings|Prevent approval by author."
-msgstr ""
+msgstr "Prevenire aprobare de către autor."
msgid "ApprovalSettings|Prevent approvals by users who add commits."
-msgstr ""
+msgstr "Preveniți aprobări de la utilizatori care adaugă commit-uri."
msgid "ApprovalSettings|Prevent editing approval rules in merge requests."
-msgstr ""
+msgstr "Preveniți editarea regulilor de aprobare în merge request-uri."
msgid "ApprovalSettings|Prevent editing approval rules in projects and merge requests."
-msgstr ""
-
-msgid "ApprovalSettings|Prevent editing approval rules in projects and merge requests. "
-msgstr ""
+msgstr "Preveniți editarea regulilor de aprobare în proiecte și merge request-uri."
msgid "ApprovalSettings|Remove all approvals when commits are added to the source branch."
-msgstr ""
+msgstr "Eliminați toate aprobările când commit-uri sunt adăugate ramurii sursă."
msgid "ApprovalSettings|Require user password to approve."
-msgstr ""
+msgstr "Solicitați parola utilizator pentru aprobare."
msgid "ApprovalSettings|There was an error loading merge request approval settings."
msgstr "S-a întâmplat o eroare încărcând setările de aprobare a cererilor de îmbinare."
@@ -4396,6 +4420,9 @@ msgstr "S-a întâmplat o eroare actualizând setările de aprobare a cererilor
msgid "ApprovalSettings|This setting is configured at the instance level and can only be changed by an administrator."
msgstr "Această setare este configurată la nivel de instanță și poate fi schimbată doar de un administrator."
+msgid "ApprovalSettings|This setting is configured in %{groupName} and can only be changed by an administrator or group owner."
+msgstr ""
+
msgid "ApprovalStatusTooltip|Adheres to separation of duties"
msgstr "Aderă la separarea sarcinilor"
@@ -4442,7 +4469,7 @@ msgid "Approvers from private group(s) not shown"
msgstr "Aprobatorii din grupul (grupurile) privat(e) nu sunt afișați"
msgid "Apr"
-msgstr "apr"
+msgstr "Apr"
msgid "April"
msgstr "Aprilie"
@@ -4496,7 +4523,7 @@ msgid "Are you sure you want to %{action} %{name}?"
msgstr "Sunteți sigur că doriți să %{action} %{name}?"
msgid "Are you sure you want to attempt to merge?"
-msgstr ""
+msgstr "Sunteți sigur că vreți să încercați să îmbinați?"
msgid "Are you sure you want to cancel editing this comment?"
msgstr "Sigur doriți să anulați editarea acestui comentariu?"
@@ -4520,7 +4547,7 @@ msgid "Are you sure you want to delete this device? This action cannot be undone
msgstr "Sunteți sigur că doriți să ștergeți acest dispozitiv? Această acțiune nu poate fi anulată."
msgid "Are you sure you want to delete this pipeline schedule?"
-msgstr "Sigur doriți să ștergeți acest program al conductei?"
+msgstr "Sunteți sigur că doriți să ștergeți acest program al pipeline-ului?"
msgid "Are you sure you want to delete this pipeline? Doing so will expire all pipeline caches and delete all related objects, such as builds, logs, artifacts, and triggers. This action cannot be undone."
msgstr "Sigur doriți să ștergeți această conductă? Aceasta va expira toate cache-urile conductei și va șterge toate obiectele conexe, cum ar fi build-urile, jurnalele, artefactele și declanșatoarele. Această acțiune nu poate fi anulată."
@@ -4539,9 +4566,9 @@ msgstr "Sigur doriți să ștergeți acest build?"
msgid "Are you sure you want to import %d repository?"
msgid_plural "Are you sure you want to import %d repositories?"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "Sunteți sigur că doriți să importați repozitoriul %d?"
+msgstr[1] "Sunteți sigur că doriți să importați %d repozitorii?"
+msgstr[2] "Sunteți sigur că doriți să importați %d de repozitorii?"
msgid "Are you sure you want to lock %{path}?"
msgstr "Sunteți sigur că vreți să blocați %{path}?"
@@ -4550,7 +4577,7 @@ msgid "Are you sure you want to lock this directory?"
msgstr "Sunteți sigur că doriți să blocați acest director?"
msgid "Are you sure you want to lose unsaved changes?"
-msgstr "Sigur doriți să pierdeți modificările nesalvate?"
+msgstr "Sunteți sigur că doriți să pierdeți modificările nesalvate?"
msgid "Are you sure you want to lose your issue information?"
msgstr "Sunteți sigur că doriți să vă pierdeți informațiile privind problema?"
@@ -4640,7 +4667,7 @@ msgid "Are you sure? This will invalidate your registered applications and U2F /
msgstr "Ești sigur? Acest lucru va invalida aplicațiile înregistrate și dispozitivele U2F / WebAuthn."
msgid "Are you sure? This will invalidate your registered applications and U2F devices."
-msgstr "Ești sigur? Acest lucru va invalida aplicațiile și dispozitivele U2F înregistrate."
+msgstr "Sunteți sigur? Acest lucru va invalida aplicațiile și dispozitivele U2F înregistrate."
msgid "Arrange charts"
msgstr "Aranjați diagramele"
@@ -4885,24 +4912,21 @@ msgstr "Autentificare cu GitHub"
msgid "Authenticated API rate limit period in seconds"
msgstr "Perioada de limitare a ratei API autentificate în secunde"
-msgid "Authenticated API request rate limit"
-msgstr "Limita ratei de solicitare API autentificată"
-
msgid "Authenticated API requests"
msgstr "Solicitări API autentificate"
msgid "Authenticated Git LFS rate limit period in seconds"
-msgstr ""
+msgstr "Perioadă limită rată Git LFS autentificat în secunde"
msgid "Authenticated Git LFS request rate limit"
+msgstr "Limită rată cereri Git LFS autentificat"
+
+msgid "Authenticated Git LFS requests"
msgstr ""
msgid "Authenticated web rate limit period in seconds"
msgstr "Perioada de limitare a vitezei web autentificate în secunde"
-msgid "Authenticated web request rate limit"
-msgstr "Limita ratei de solicitare web autentificată"
-
msgid "Authenticated web requests"
msgstr "Solicitări autentificate web"
@@ -4958,7 +4982,7 @@ msgid "Authorization required"
msgstr "Autorizație necesară"
msgid "Authorization token duration (minutes)"
-msgstr ""
+msgstr "Durata autorizării token-ului (minute)"
msgid "Authorization was granted by entering your username and password in the application."
msgstr "Autorizarea a fost acordată introducând numele de utilizator și parola în aplicație."
@@ -4967,7 +4991,7 @@ msgid "Authorize"
msgstr "Autorizează"
msgid "Authorize %{link_to_client} to use your account?"
-msgstr ""
+msgstr "Autorizați %{link_to_client} să utilizeze contul dvs.?"
msgid "Authorize %{user} to use your account?"
msgstr "Autorizați %{user} să vă folosească contul?"
@@ -5021,22 +5045,22 @@ msgid "AutoDevOps|Learn more in the %{link_to_documentation}"
msgstr "Aflați mai multe în %{link_to_documentation}"
msgid "AutoDevOps|The Auto DevOps pipeline has been enabled and will be used if no alternative CI configuration file is found."
-msgstr ""
+msgstr "Pipeline-ul Auto DevOps a fost activat și va fi utilizat dacă nu este găsit niciun fișier alternativ de configurare CI."
msgid "AutoDevopsAlert|Security testing tools enabled with %{linkStart}Auto DevOps%{linkEnd}"
msgstr "Uneltele de testare a securității sunt activate cu %{linkStart}Auto DevOps%{linkEnd}"
msgid "AutoRemediation| 1 Merge Request"
-msgstr ""
+msgstr "1 Merge Request"
msgid "AutoRemediation|%{mrsCount} ready for review"
msgstr ""
msgid "AutoRemediation|Auto-fix"
-msgstr ""
+msgstr "Auto-fix"
msgid "AutoRemediation|Auto-fix solutions"
-msgstr ""
+msgstr "Soluții Auto-fix"
msgid "AutoRemediation|If you're using dependency and/or container scanning, and auto-fix is enabled, auto-fix automatically creates merge requests with fixes to vulnerabilities."
msgstr ""
@@ -5075,7 +5099,7 @@ msgid "Automatic deployment rollbacks"
msgstr ""
msgid "Automatic event tracking provides a traceable history for audits."
-msgstr ""
+msgstr "Urmărire automată evenimente oferă un istoric traceable pentru audituri."
msgid "Automatically close associated incident when a recovery alert notification resolves an alert"
msgstr ""
@@ -5278,9 +5302,6 @@ msgstr "Mai jos sunt setările pentru %{link_to_gitlab_pages}."
msgid "Below you will find all the groups that are public."
msgstr "Mai jos veți găsi toate grupurile care sunt publice."
-msgid "Beta"
-msgstr "Beta"
-
msgid "Bi-weekly code coverage"
msgstr "Acoperire bi-săptămânală a codului"
@@ -5303,19 +5324,19 @@ msgid "BillingPlans|Congratulations, your free trial is activated."
msgstr "Felicitări, evaluarea dvs. gratuită este activată."
msgid "BillingPlans|End of availability for the Bronze Plan"
-msgstr ""
+msgstr "Sfârșitul disponibilității pentru Planul Bronz"
msgid "BillingPlans|Free upgrade!"
msgstr "Actualizare gratuită!"
msgid "BillingPlans|If you would like to downgrade your plan please contact %{support_link_start}Customer Support%{support_link_end}."
-msgstr ""
+msgstr "Dacă doriți să vă reduceți planul, vă rugăm să contactați %{support_link_start}Suport Clienți%{support_link_end}."
msgid "BillingPlans|Learn more about each plan by reading our %{faq_link}, or start a free 30-day trial of GitLab.com Ultimate."
msgstr ""
msgid "BillingPlans|Learn more about each plan by visiting our %{pricing_page_link}."
-msgstr ""
+msgstr "Aflați mai multe despre fiecare plan vizitând pagina noastră %{pricing_page_link}."
msgid "BillingPlans|Looking to purchase or manage a subscription for your group? Navigate to your %{groups_link} and go to %{strong_open}Settings &gt; Billing.%{strong_close}"
msgstr ""
@@ -5345,7 +5366,7 @@ msgid "BillingPlans|Your GitLab.com %{plan} trial will %{strong_open}expire afte
msgstr ""
msgid "BillingPlans|Your GitLab.com trial expired on %{expiration_date}. You can restore access to the features at any time by upgrading below."
-msgstr ""
+msgstr "Perioada dvs. de evaluare GitLab.com a expirat la %{expiration_date}. Puteți restabili accesul la funcții în orice moment prin actualizarea de mai jos."
msgid "BillingPlans|billed annually at %{price_per_year}"
msgstr "facturat anual la %{price_per_year}"
@@ -5462,7 +5483,7 @@ msgid "Billing|Project invite"
msgstr "Invitație proiect"
msgid "Billing|Remove user %{username} from your subscription"
-msgstr ""
+msgstr "Eliminați utilizatorul %{username} din abonament"
msgid "Billing|Toggle seat details"
msgstr ""
@@ -5489,7 +5510,7 @@ msgid "Bitbucket import"
msgstr ""
msgid "Blame"
-msgstr ""
+msgstr "Blame"
msgid "Block user"
msgstr "Blocați utilizatorul"
@@ -5521,6 +5542,21 @@ msgstr "Blog"
msgid "Board scope affects which issues are displayed for anyone who visits this board"
msgstr ""
+msgid "BoardNewEpic|Groups"
+msgstr ""
+
+msgid "BoardNewEpic|Loading groups"
+msgstr ""
+
+msgid "BoardNewEpic|No matching results"
+msgstr ""
+
+msgid "BoardNewEpic|Search groups"
+msgstr ""
+
+msgid "BoardNewEpic|Select a group"
+msgstr ""
+
msgid "BoardNewIssue|No matching results"
msgstr ""
@@ -5567,7 +5603,7 @@ msgid "BoardScope|Select milestone"
msgstr "Selectați obiectivul"
msgid "BoardScope|Select weight"
-msgstr ""
+msgstr "Selectare greutate"
msgid "BoardScope|Started"
msgstr "Început/ă"
@@ -5576,10 +5612,10 @@ msgid "BoardScope|Upcoming"
msgstr "ÃŽn viitor"
msgid "BoardScope|Weight"
-msgstr ""
+msgstr "Greutate"
msgid "Boards"
-msgstr ""
+msgstr "Panouri"
msgid "Boards and Board Lists"
msgstr ""
@@ -5591,22 +5627,25 @@ msgstr[1] "+ %{displayedIssuablesCount} mai multe %{issuableType}s"
msgstr[2] "+ %{displayedIssuablesCount} de mai multe %{issuableType}s"
msgid "Boards|An error occurred while creating the epic. Please try again."
-msgstr ""
+msgstr "A apărut o eroare în timpul creării epicului. Vă rugăm să încercați din nou."
msgid "Boards|An error occurred while creating the issue. Please try again."
-msgstr ""
+msgstr "A apărut o eroare la crearea problemei. Vă rugăm să încercați din nou."
msgid "Boards|An error occurred while creating the list. Please try again."
+msgstr "A apărut o eroare la crearea listei. Vă rugăm să încercați din nou."
+
+msgid "Boards|An error occurred while fetching child groups. Please try again."
msgstr ""
msgid "Boards|An error occurred while fetching group projects. Please try again."
-msgstr ""
+msgstr "A apărut o eroare la preluarea proiectelor de grup. Vă rugăm să încercați din nou."
msgid "Boards|An error occurred while fetching issues. Please reload the page."
msgstr "S-a întâmplat o eroare preluând problemele. Vă rugăm reîncărcați pagina."
msgid "Boards|An error occurred while fetching labels. Please reload the page."
-msgstr ""
+msgstr "A apărut o eroare în timpul preluării etichetelor. Vă rugăm să reîncărcați pagina."
msgid "Boards|An error occurred while fetching the board epics. Please reload the page."
msgstr ""
@@ -5618,28 +5657,28 @@ msgid "Boards|An error occurred while fetching the board lists. Please reload th
msgstr ""
msgid "Boards|An error occurred while fetching the board swimlanes. Please reload the page."
-msgstr ""
+msgstr "A apărut o eroare în timpul preluării secțiunilor swimlanes. Vă rugăm să reîncărcați pagina."
msgid "Boards|An error occurred while generating lists. Please reload the page."
-msgstr ""
+msgstr "A apărut o eroare în timpul generării listelor. Vă rugăm să reîncărcați pagina."
msgid "Boards|An error occurred while moving the epic. Please try again."
-msgstr ""
+msgstr "A apărut o eroare în timpul mutării epicului. Vă rugăm să încercați din nou."
msgid "Boards|An error occurred while moving the issue. Please try again."
-msgstr ""
+msgstr "A apărut o eroare în timpul mutării problemei. Vă rugăm să încercați din nou."
msgid "Boards|An error occurred while removing the list. Please try again."
-msgstr ""
+msgstr "A apărut o eroare la eliminarea listei. Vă rugăm să încercați din nou."
msgid "Boards|An error occurred while updating the board list. Please try again."
msgstr "S-a întâmplat o eroare actualizând lista bordului. Vă rugăm încercați din nou."
msgid "Boards|Blocked by %{blockedByCount} %{issuableType}"
msgid_plural "Boards|Blocked by %{blockedByCount} %{issuableType}s"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "Blocat de %{blockedByCount} %{issuableType}"
+msgstr[1] "Blocat de %{blockedByCount} %{issuableType}s"
+msgstr[2] "Blocat de %{blockedByCount} %{issuableType}s"
msgid "Boards|Collapse"
msgstr ""
@@ -5708,7 +5747,7 @@ msgid "Branch"
msgstr "Ramură"
msgid "Branch %{branchName} was not found in this project's repository."
-msgstr ""
+msgstr "Ramura %{branchName} nu a fost găsită în repozitoriul acestui proiect."
msgid "Branch %{branch_name} was created. To set up auto deploy, choose a GitLab CI Yaml template and commit your changes. %{link_to_autodeploy_doc}"
msgstr ""
@@ -5720,7 +5759,7 @@ msgid "Branch changed"
msgstr "Ramură schimbată"
msgid "Branch is already taken"
-msgstr ""
+msgstr "Ramura este deja luată"
msgid "Branch name"
msgstr "Numele ramurii"
@@ -5756,7 +5795,7 @@ msgid "Branches|Delete branch"
msgstr "Ștergeți ramura"
msgid "Branches|Delete branch. Are you ABSOLUTELY SURE?"
-msgstr ""
+msgstr "Ștergeți ramura. Sunteți ABSOLUT SIGUR?"
msgid "Branches|Delete merged branches"
msgstr "Ștergeți ramurile îmbinate"
@@ -5768,19 +5807,19 @@ msgid "Branches|Delete protected branch '%{branch_name}'?"
msgstr "Ștergeți ramura protejată '%{branch_name}'?"
msgid "Branches|Delete protected branch. Are you ABSOLUTELY SURE?"
-msgstr ""
+msgstr "Ștergeți ramura protejată. Sunteți ABSOLUT SIGUR?"
msgid "Branches|Deleting the %{strongStart}%{branchName}%{strongEnd} branch cannot be undone. Are you sure?"
-msgstr ""
+msgstr "Ștergerea %{strongStart}%{branchName}%{strongEnd} nu poate fi anulată. Sunteți sigur?"
msgid "Branches|Deleting the '%{branch_name}' branch cannot be undone. Are you sure?"
-msgstr ""
+msgstr "Ștergerea ramurii '%{branch_name}' nu poate fi anulată. Sunteți sigur?"
msgid "Branches|Deleting the merged branches cannot be undone. Are you sure?"
msgstr "Ștergerea ramurilor îmbinate nu poate fi anulată. Sunteți sigur?"
msgid "Branches|Filter by branch name"
-msgstr ""
+msgstr "Filtrați după numele ramurii"
msgid "Branches|Merged into %{default_branch}"
msgstr "Îmbinat în %{default_branch}"
@@ -5792,13 +5831,13 @@ msgid "Branches|No branches to show"
msgstr ""
msgid "Branches|Once you confirm and press %{delete_protected_branch}, it cannot be undone or recovered."
-msgstr ""
+msgstr "Odată ce confirmați și apăsați %{delete_protected_branch}, aceasta nu poate fi anulată sau recuperată."
msgid "Branches|Once you confirm and press %{strongStart}%{buttonText},%{strongEnd} it cannot be undone or recovered."
-msgstr ""
+msgstr "Odată ce confirmați și apăsați %{strongStart}%{buttonText},%{strongEnd} nu poate fi anulat sau recuperat."
msgid "Branches|Only a project maintainer or owner can delete a protected branch"
-msgstr ""
+msgstr "Numai un responsabil de proiect sau un proprietar poate șterge o ramură protejată"
msgid "Branches|Overview"
msgstr "Prezentare generală"
@@ -5813,31 +5852,31 @@ msgid "Branches|Show active branches"
msgstr "Afișați ramurile active"
msgid "Branches|Show all branches"
-msgstr ""
+msgstr "Afișați toate ramurile"
msgid "Branches|Show more active branches"
-msgstr ""
+msgstr "Afișați mai multe ramuri active"
msgid "Branches|Show more stale branches"
-msgstr ""
+msgstr "Afișați mai multe ramuri vechi"
msgid "Branches|Show overview of the branches"
-msgstr ""
+msgstr "Afișați o imagine de ansamblu a ramurilor"
msgid "Branches|Show stale branches"
-msgstr ""
+msgstr "Afișați ramurile vechi"
msgid "Branches|Stale"
msgstr "Vechi"
msgid "Branches|Stale branches"
-msgstr ""
+msgstr "Ramuri vechi"
msgid "Branches|The branch could not be updated automatically because it has diverged from its upstream counterpart."
msgstr ""
msgid "Branches|The default branch cannot be deleted"
-msgstr ""
+msgstr "Ramura implicită nu poate fi ștearsă"
msgid "Branches|This branch hasn’t been merged into %{defaultBranchName}. To avoid data loss, consider merging this branch before deleting it."
msgstr ""
@@ -5900,25 +5939,25 @@ msgid "Broadcast messages are displayed for every user and can be used to notify
msgstr ""
msgid "Browse Directory"
-msgstr ""
+msgstr "Explorați directorul"
msgid "Browse File"
-msgstr ""
+msgstr "Explorați fișierul"
msgid "Browse Files"
-msgstr ""
+msgstr "Explorați fișierele"
msgid "Browse artifacts"
-msgstr ""
+msgstr "Explorați artefactele"
msgid "Browse files"
-msgstr ""
+msgstr "Explorați fișierele"
msgid "Browse templates"
-msgstr ""
+msgstr "Explorați șabloanele"
msgid "BuildArtifacts|An error occurred while fetching the artifacts"
-msgstr ""
+msgstr "A apărut o eroare la preluarea artefactelor"
msgid "BuildArtifacts|Loading artifacts"
msgstr ""
@@ -5932,6 +5971,9 @@ msgstr ""
msgid "Bulk update"
msgstr "Actualizare în bloc"
+msgid "BulkImports|Re-import creates a new group. It does not sync with the existing group."
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr "Grupuri existente"
@@ -5941,6 +5983,9 @@ msgstr "Filtrați după grupul sursă"
msgid "BulkImport|From source group"
msgstr "Din grupul sursă"
+msgid "BulkImport|Group import history"
+msgstr ""
+
msgid "BulkImport|Import failed: Destination cannot be a subgroup of the source group. Change the destination and try again."
msgstr "Import eșuat: Destinația nu poate fi un subgrup al grupului sursă. Schimbați destinația și încercați din nou."
@@ -5948,14 +5993,23 @@ msgid "BulkImport|Import groups from GitLab"
msgstr "Import grupuri din GitLab"
msgid "BulkImport|Import selected"
-msgstr ""
+msgstr "Import selectat"
msgid "BulkImport|Importing the group failed"
msgstr "Importul grupului a eșuat"
+msgid "BulkImport|Last imported to %{link}"
+msgstr ""
+
msgid "BulkImport|Name already exists."
msgstr "Numele există deja."
+msgid "BulkImport|New group"
+msgstr ""
+
+msgid "BulkImport|No history is available"
+msgstr ""
+
msgid "BulkImport|No parent"
msgstr ""
@@ -5968,6 +6022,9 @@ msgstr "Se afișează %{start}-%{end} din %{total} de la %{link}"
msgid "BulkImport|Showing %{start}-%{end} of %{total} matching filter \"%{filter}\" from %{link}"
msgstr ""
+msgid "BulkImport|Source group"
+msgstr ""
+
msgid "BulkImport|To new group"
msgstr ""
@@ -5977,6 +6034,9 @@ msgstr ""
msgid "BulkImport|You have no groups to import"
msgstr "Nu aveți grupuri de importat"
+msgid "BulkImport|Your imported groups will appear here."
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -5990,10 +6050,10 @@ msgid "Burndown chart"
msgstr ""
msgid "BurndownChartLabel|Open issue weight"
-msgstr ""
+msgstr "Greutatea problemei deschise"
msgid "BurndownChartLabel|Open issues"
-msgstr ""
+msgstr "Probleme deschise"
msgid "Burnup chart"
msgstr ""
@@ -6014,7 +6074,7 @@ msgid "Buy CI Minutes"
msgstr "Cumpărați minute CI"
msgid "Buy Storage"
-msgstr ""
+msgstr "Cumpărați spațiu de stocare"
msgid "Buy more Pipeline minutes"
msgstr ""
@@ -6026,7 +6086,7 @@ msgid "By authenticating with an account tied to an Enterprise e-mail address, i
msgstr "Prin autentificarea cu un cont legat de o adresă de e-mail Întreprindere, se înțelege că acest cont este un utilizator Întreprindere. "
msgid "By default, all projects and groups will use the global notifications setting."
-msgstr ""
+msgstr "În mod implicit, toate proiectele și grupurile vor utiliza setarea globală a notificărilor."
msgid "ByAuthor|by"
msgstr "de"
@@ -6050,7 +6110,7 @@ msgid "CI variables"
msgstr "Variabilele CI"
msgid "CI will run using the credentials assigned above."
-msgstr ""
+msgstr "CI va rula folosind datele de autentificare atribuite mai sus."
msgid "CI/CD"
msgstr "CI/CD"
@@ -6110,7 +6170,7 @@ msgid "CICD|Add an existing project to the scope"
msgstr "Adăugați un proiect existent la domeniul de aplicare"
msgid "CICD|Auto DevOps"
-msgstr ""
+msgstr "Auto DevOps"
msgid "CICD|Automatic deployment to staging, manual deployment to production"
msgstr ""
@@ -6131,7 +6191,7 @@ msgid "CICD|Deployment strategy"
msgstr ""
msgid "CICD|Jobs"
-msgstr ""
+msgstr "Job-uri"
msgid "CICD|Limit CI_JOB_TOKEN access"
msgstr "Limitați accesul CI_JOB_TOKEN"
@@ -6140,16 +6200,16 @@ msgid "CICD|Select projects that can be accessed by API requests authenticated w
msgstr "Selectați proiecte ce pot fi accesate prin solicitări API autentificate cu variabila CI/CD CI_JOB_TOKEN a acestui proiect."
msgid "CICD|The Auto DevOps pipeline runs by default in all projects with no CI/CD configuration file."
-msgstr ""
+msgstr "Pipeline-ul Auto DevOps rulează în mod implicit în toate proiectele fără fișier de configurare CI/CD."
msgid "CICD|The Auto DevOps pipeline runs if no alternative CI configuration file is found."
-msgstr ""
+msgstr "Pipeline-ul Auto DevOps rulează dacă nu este găsit niciun fișier alternativ de configurare CI."
msgid "CICD|group enabled"
-msgstr ""
+msgstr "grup activat"
msgid "CICD|instance enabled"
-msgstr ""
+msgstr "instanță activată"
msgid "CLOSED"
msgstr "ÃŽNCHIS"
@@ -6161,13 +6221,13 @@ msgid "CODEOWNERS rule violation"
msgstr "Încălcarea regulilor CODEOWNERS"
msgid "CONTRIBUTING"
-msgstr ""
+msgstr "CONTRIBUTING"
msgid "CPU"
msgstr "CPU"
msgid "CSV is being generated and will be emailed to you upon completion."
-msgstr ""
+msgstr "CSV-ul se generează și va fi trimis dvs. prin e-mail la finalizare."
msgid "CVE|As a maintainer, requesting a CVE for a vulnerability in your project will help your users stay secure and informed."
msgstr ""
@@ -6176,7 +6236,7 @@ msgid "CVE|CVE ID Request"
msgstr ""
msgid "CVE|Common Vulnerability Enumeration (CVE) identifiers are used to track distinct vulnerabilities in specific versions of code."
-msgstr ""
+msgstr "Identificatorii Common Vulnerability Enumeration (CVE) sunt utilizați pentru a urmări vulnerabilitățile distincte în anumite versiuni de cod."
msgid "CVE|Create CVE ID Request"
msgstr ""
@@ -6191,7 +6251,7 @@ msgid "CVE|Why Request a CVE ID?"
msgstr ""
msgid "Cadence is not automated"
-msgstr ""
+msgstr "Cadența nu este automatizată"
msgid "Callback URL"
msgstr ""
@@ -6220,11 +6280,14 @@ msgstr "Subdomeniul %{code_open}.campfirenow.com%{code_close}."
msgid "Can be manually deployed to"
msgstr "Poate fi implementat manual la"
+msgid "Can be overridden in each project."
+msgstr ""
+
msgid "Can create groups:"
msgstr ""
msgid "Can't apply as the source branch was deleted."
-msgstr ""
+msgstr "Nu se poate aplica deoarece ramura sursă a fost ștearsă."
msgid "Can't apply as these lines were changed in a more recent version."
msgstr "Nu se poate aplica, deoarece aceste linii au fost modificate într-o versiune mai recentă."
@@ -6287,7 +6350,7 @@ msgid "CanaryIngress|Doing so will set a deployment change in progress. This tem
msgstr ""
msgid "CanaryIngress|Stable"
-msgstr ""
+msgstr "Stabil"
msgid "CanaryIngress|You are changing the ratio of the canary rollout for %{environment} compared to the stable deployment to:"
msgstr ""
@@ -6299,16 +6362,16 @@ msgid "Cancel and close"
msgstr "Anulați și închideți"
msgid "Cancel index deletion"
-msgstr ""
+msgstr "Anulați ștergerea indexului"
msgid "Cancel running"
msgstr "Anulați rularea"
msgid "Cancel this job"
-msgstr ""
+msgstr "Anulați aceast job"
msgid "Cancel your account"
-msgstr ""
+msgstr "Anulați-vă contul"
msgid "Cancel, keep project"
msgstr "Anulați, păstrați proiectul"
@@ -6322,6 +6385,9 @@ msgstr "Anulat"
msgid "Cancelling Preview"
msgstr "Previzualizare anulare"
+msgid "Cannot assign a confidential epic to a non-confidential issue. Make the issue confidential and try again"
+msgstr ""
+
msgid "Cannot be assigned to other projects."
msgstr ""
@@ -6329,10 +6395,10 @@ msgid "Cannot be merged automatically"
msgstr ""
msgid "Cannot create the abuse report. The user has been deleted."
-msgstr ""
+msgstr "Nu se poate crea raportul de abuz. Utilizatorul a fost șters."
msgid "Cannot create the abuse report. This user has been blocked."
-msgstr ""
+msgstr "Nu se poate crea raportul de abuz. Acest utilizator a fost blocat."
msgid "Cannot delete %{profile_name} referenced in security policy"
msgstr ""
@@ -6362,10 +6428,10 @@ msgid "Cannot modify managed Kubernetes cluster"
msgstr ""
msgid "Cannot modify provider during creation"
-msgstr ""
+msgstr "Nu se poate modifica furnizorul în timpul creării"
msgid "Cannot promote issue because it does not belong to a group."
-msgstr ""
+msgstr "Nu se poate promova problema pentru că nu aparține unui grup."
msgid "Cannot promote issue due to insufficient permissions."
msgstr ""
@@ -6373,14 +6439,11 @@ msgstr ""
msgid "Cannot refer to a group %{timebox_type} by an internal id!"
msgstr ""
-msgid "Cannot set confidential epic for a non-confidential issue"
-msgstr ""
-
msgid "Cannot show preview. For previews on sketch files, they must have the file format introduced by Sketch version 43 and above."
msgstr ""
msgid "Cannot skip two factor authentication setup"
-msgstr ""
+msgstr "Nu se poate sări peste configurarea autentificării în doi pași"
msgid "Capacity threshold"
msgstr ""
@@ -6392,10 +6455,10 @@ msgid "CascadingSettings|Setting enforced"
msgstr ""
msgid "CascadingSettings|Subgroups cannot change this setting."
-msgstr ""
+msgstr "Subgrupurile nu pot modifica această setare."
msgid "CascadingSettings|This setting has been enforced by an instance admin."
-msgstr ""
+msgstr "Această setare a fost impusă de un administrator de instanță."
msgid "CascadingSettings|This setting has been enforced by an owner of %{link}."
msgstr ""
@@ -6446,22 +6509,22 @@ msgid "Change path"
msgstr "Schimbă calea"
msgid "Change reviewer(s)"
-msgstr ""
+msgstr "Schimbați revizor(ii)"
msgid "Change reviewer(s)."
-msgstr ""
+msgstr "Schimbați revizor(ii)"
msgid "Change role"
-msgstr ""
+msgstr "Schimbați rolul"
msgid "Change status"
-msgstr ""
+msgstr "Schimbați statusul"
msgid "Change subscription"
-msgstr ""
+msgstr "Schimbați abonamentul"
msgid "Change template"
-msgstr ""
+msgstr "Schimbați șablonul"
msgid "Change title"
msgstr "Schimbați titlul"
@@ -6470,7 +6533,7 @@ msgid "Change your password"
msgstr "Schimbă-ți parola"
msgid "Change your password or recover your current one"
-msgstr ""
+msgstr "Schimbați-vă parola sau recuperați-vă parola curentă"
msgid "ChangeReviewer|Reviewer changed from %{old} to %{new}"
msgstr ""
@@ -6506,19 +6569,19 @@ msgid "ChangeTypeAction|Search projects"
msgstr "Căutați proiecte"
msgid "ChangeTypeAction|Start a %{newMergeRequest} with these changes"
-msgstr ""
+msgstr "Porniți un %{newMergeRequest} cu aceste schimbări"
msgid "ChangeTypeAction|Switch branch"
-msgstr ""
+msgstr "Schimbați ramura"
msgid "ChangeTypeAction|Switch project"
-msgstr ""
+msgstr "Schimbați proiectul"
msgid "ChangeTypeAction|This will create a new commit in order to revert the existing changes."
msgstr "Acest lucru va crea un nou commit pentru reversarea modificările existente."
msgid "ChangeTypeAction|Your changes will be committed to %{branchName} because a merge request is open."
-msgstr ""
+msgstr "Schimbările dvs. vor fi aplicate ramurii %{branchName} deoarece un merge request este deschis."
msgid "Changed assignee(s)."
msgstr ""
@@ -6527,10 +6590,10 @@ msgid "Changed reviewer(s)."
msgstr ""
msgid "Changed the title to \"%{title_param}\"."
-msgstr ""
+msgstr "S-a schimbat titlul în „%{title_param}â€."
msgid "Changes"
-msgstr ""
+msgstr "Schimbări"
msgid "Changes are shown as if the %{b_open}source%{b_close} revision was being merged into the %{b_open}target%{b_close} revision."
msgstr ""
@@ -6545,10 +6608,10 @@ msgid "Changes suppressed. Click to show."
msgstr ""
msgid "Changes the title to \"%{title_param}\"."
-msgstr ""
+msgstr "Schimbați titlul în \"%{title_param}\"."
msgid "Changes to the title have not been saved"
-msgstr ""
+msgstr "Schimbările aduse titlului nu au fost salvate"
msgid "Changing group URL can have unintended side effects."
msgstr "Schimbarea adresei URL a grupului poate avea efecte secundare neintenționate."
@@ -6557,10 +6620,10 @@ msgid "Charts can't be displayed as the request for data has timed out. %{docume
msgstr ""
msgid "Chat"
-msgstr ""
+msgstr "Chat"
msgid "ChatMessage|%{project_link}: Pipeline %{pipeline_link} of %{ref_type} %{ref_link} by %{user_combined_name} %{humanized_status} in %{duration}"
-msgstr ""
+msgstr "%{project_link}: Pipeline %{pipeline_link} de %{ref_type} %{ref_link} de %{user_combined_name} %{humanized_status} în %{duration}"
msgid "ChatMessage|Branch"
msgstr "Ramură"
@@ -6569,19 +6632,19 @@ msgid "ChatMessage|Commit"
msgstr "Commit"
msgid "ChatMessage|Failed job"
-msgstr ""
+msgstr "Job eșuat"
msgid "ChatMessage|Failed stage"
-msgstr ""
+msgstr "Etapă eșuată"
msgid "ChatMessage|Invalid CI config YAML file"
-msgstr ""
+msgstr "Fișier YAML CI invalid"
msgid "ChatMessage|Pipeline #%{pipeline_id} %{humanized_status} in %{duration}"
-msgstr ""
+msgstr "Pipeline #%{pipeline_id} %{humanized_status} în %{duration}"
msgid "ChatMessage|Pipeline %{pipeline_link} of %{ref_type} %{ref_link} by %{user_combined_name} %{humanized_status}"
-msgstr ""
+msgstr "Pipeline %{pipeline_link} de %{ref_type} %{ref_link} de %{user_combined_name} %{humanized_status}"
msgid "ChatMessage|Tag"
msgstr "Etichetă"
@@ -6613,18 +6676,18 @@ msgstr ""
msgid "Check out, review, and merge locally"
msgstr ""
-msgid "Check the %{docs_link_start}documentation%{docs_link_end}."
-msgstr ""
-
msgid "Check the current instance configuration "
msgstr "Verificați configurația instanței curente "
msgid "Check the elasticsearch.log file to debug why the migration was halted and make any changes before retrying the migration. When you fix the cause of the failure, click \"Retry migration\", and the migration will be scheduled to be retried in the background."
msgstr ""
-msgid "Check your Docker images for known vulnerabilities."
+msgid "Check with your administrator."
msgstr ""
+msgid "Check your Docker images for known vulnerabilities."
+msgstr "Verificați imaginile dvs. Docker pentru vulnerabilități cunoscute."
+
msgid "Check your Kubernetes cluster images for known vulnerabilities."
msgstr "Verificați imaginile cluster Kubernetes pentru vulnerabilități cunoscute."
@@ -6632,13 +6695,13 @@ msgid "Check your source instance permissions."
msgstr "Verificați permisiunile instanței sursă."
msgid "Checking %{text} availability…"
-msgstr ""
+msgstr "Verificarea disponibilității %{text}…"
msgid "Checking approval status"
msgstr ""
msgid "Checking branch availability..."
-msgstr ""
+msgstr "Verificarea disponibilității ramurilor…"
msgid "Checking group URL availability..."
msgstr ""
@@ -6652,17 +6715,20 @@ msgstr "Se verifică disponibilitatea numelui de utilizator..."
msgid "Checkout"
msgstr ""
-msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 minutes"
+msgid "Checkout|$%{selectedPlanPrice} per 10 GB storage per pack"
msgstr ""
+msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 minutes"
+msgstr "$%{selectedPlanPrice} pe pachet de 1,000 de minute"
+
msgid "Checkout|$%{selectedPlanPrice} per user per year"
msgstr ""
msgid "Checkout|%d CI minute pack"
msgid_plural "Checkout|%d CI minute packs"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "%d pachet minute CI"
+msgstr[1] "%d pachete minute CI"
+msgstr[2] "%d de pachete minute CI"
msgid "Checkout|%{cardType} ending in %{lastFourDigits}"
msgstr "%{cardType} care se termină în %{lastFourDigits}"
@@ -6673,18 +6739,24 @@ msgstr "Minutele CI ale %{name}"
msgid "Checkout|%{name}'s GitLab subscription"
msgstr ""
-msgid "Checkout|%{selectedPlanText} plan"
+msgid "Checkout|%{name}'s storage subscription"
msgstr ""
-msgid "Checkout|%{startDate} - %{endDate}"
-msgstr "%{startDate} - %{endDate}"
+msgid "Checkout|%{quantity} GB of storage"
+msgstr ""
-msgid "Checkout|%{totalCiMinutes} CI minute"
-msgid_plural "Checkout|%{totalCiMinutes} CI minutes"
+msgid "Checkout|%{quantity} storage pack"
+msgid_plural "Checkout|%{quantity} storage packs"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
+msgid "Checkout|%{selectedPlanText} plan"
+msgstr ""
+
+msgid "Checkout|%{startDate} - %{endDate}"
+msgstr "%{startDate} - %{endDate}"
+
msgid "Checkout|%{totalCiMinutes} CI minutes"
msgstr "%{totalCiMinutes} minute CI"
@@ -6701,7 +6773,7 @@ msgid "Checkout|Billing address"
msgstr "Adresa de facturare"
msgid "Checkout|CI minute pack"
-msgstr ""
+msgstr "Pachet minute CI"
msgid "Checkout|CI minute packs are only used after you've used your subscription's monthly quota. The additional minutes will roll over month to month and are valid for one year."
msgstr "Pachete minute CI sunt folosite numai după ce v-ați utilizat cota lunară a abonamentului dvs. Minutele suplimentare se vor roti din lună-n-lună și sunt valide pentru un an."
@@ -6728,41 +6800,44 @@ msgid "Checkout|Country"
msgstr ""
msgid "Checkout|Create a new group"
-msgstr ""
+msgstr " Creați un grup nou"
msgid "Checkout|Credit card form failed to load. Please try again."
-msgstr ""
+msgstr " Formularul cardului de credit nu s-a încărcat. Vă rugăm să încercați din nou."
msgid "Checkout|Credit card form failed to load: %{message}"
-msgstr ""
+msgstr " Formularul cardului de credit nu s-a încărcat: %{message}"
msgid "Checkout|Edit"
-msgstr ""
+msgstr "Editați"
msgid "Checkout|Exp %{expirationMonth}/%{expirationYear}"
-msgstr ""
+msgstr "Exp %{expirationMonth}/%{expirationYear}"
msgid "Checkout|Failed to confirm your order! Please try again."
-msgstr ""
+msgstr "Nu s-a reușit confirmarea comenzii dumneavoastră! Vă rugăm să încercați din nou."
msgid "Checkout|Failed to confirm your order: %{message}. Please try again."
-msgstr ""
+msgstr "Nu s-a reușit confirmarea comenzii dumneavoastră: %{message}. Vă rugăm să încercați din nou."
msgid "Checkout|Failed to load countries. Please try again."
-msgstr ""
+msgstr "Nu s-a reușit încărcarea țărilor. Vă rugăm să încercați din nou."
msgid "Checkout|Failed to load states. Please try again."
msgstr ""
msgid "Checkout|Failed to load the payment form. Please try again."
-msgstr ""
+msgstr "Nu s-a reușit încărcarea formularului de plată. Vă rugăm să încercați din nou."
msgid "Checkout|Failed to register credit card. Please try again."
msgstr ""
-msgid "Checkout|GitLab group"
+msgid "Checkout|GB"
msgstr ""
+msgid "Checkout|GitLab group"
+msgstr "Grup GitLab"
+
msgid "Checkout|GitLab plan"
msgstr "Plan GitLab"
@@ -6770,10 +6845,10 @@ msgid "Checkout|Group"
msgstr "Grup"
msgid "Checkout|Name of company or organization using GitLab"
-msgstr ""
+msgstr "Numele companiei sau organizației care utilizează GitLab"
msgid "Checkout|Need more users? Purchase GitLab for your %{company}."
-msgstr ""
+msgstr "Nevoie de mai mulți utilizatori? Achiziționați GitLab pentru %{company} dumneavoastră."
msgid "Checkout|Number of users"
msgstr "Număr de utilizatori"
@@ -6788,7 +6863,7 @@ msgid "Checkout|Please select a state"
msgstr ""
msgid "Checkout|Purchase details"
-msgstr ""
+msgstr "Detalii achiziție"
msgid "Checkout|Select"
msgstr "Selectați"
@@ -6796,6 +6871,9 @@ msgstr "Selectați"
msgid "Checkout|State"
msgstr ""
+msgid "Checkout|Storage packs"
+msgstr ""
+
msgid "Checkout|Street address"
msgstr ""
@@ -6803,7 +6881,7 @@ msgid "Checkout|Submitting the credit card form failed with code %{errorCode}: %
msgstr "Trimiterea formularului de card de credit a eșuat cu codul %{errorCode}: %{errorMessage}"
msgid "Checkout|Subscription details"
-msgstr ""
+msgstr "Detalii abonament"
msgid "Checkout|Subtotal"
msgstr "Subtotal"
@@ -6817,6 +6895,9 @@ msgstr "Total"
msgid "Checkout|Total minutes: %{quantity}"
msgstr "Total minute: %{quantity}"
+msgid "Checkout|Total storage: %{quantity} GB"
+msgstr ""
+
msgid "Checkout|Users"
msgstr "Utilizatori"
@@ -6826,16 +6907,25 @@ msgstr ""
msgid "Checkout|Your organization"
msgstr "Organizația dvs."
+msgid "Checkout|Your storage subscription has the same term as your main subscription, and the price is prorated accordingly."
+msgstr ""
+
msgid "Checkout|Your subscription will be applied to this group"
msgstr "Abonamentul dvs. va fi aplicat la acest grup"
msgid "Checkout|Zip code"
msgstr "Cod poștal"
+msgid "Checkout|a storage subscription"
+msgstr ""
+
msgid "Checkout|company or team"
msgstr "companie sau echipă"
-msgid "Checkout|x 1,000 minutes per pack = %{strong}"
+msgid "Checkout|minutes"
+msgstr ""
+
+msgid "Checkout|x %{quantity} %{units} per pack ="
msgstr ""
msgid "Cherry-pick this commit"
@@ -6914,7 +7004,7 @@ msgid "Choose which repositories you want to connect and run CI/CD pipelines."
msgstr ""
msgid "Choose your framework"
-msgstr ""
+msgstr "Alegeți framework-ul dvs."
msgid "CiCdAnalytics|Date range: %{range}"
msgstr ""
@@ -7028,7 +7118,7 @@ msgid "CiVariables|Specify variable values to be used in this run. The values sp
msgstr ""
msgid "CiVariables|State"
-msgstr "Statut"
+msgstr ""
msgid "CiVariables|Type"
msgstr "Tip"
@@ -7127,22 +7217,22 @@ msgid "Clears weight."
msgstr ""
msgid "Click %{link_start}here%{link_end} to view the request."
-msgstr ""
+msgstr "Faceți clic pe %{link_start}aici%{link_end} pentru a vizualiza cererea."
msgid "Click %{link_to} to view the request."
-msgstr ""
+msgstr "Faceți clic pe %{link_to} pentru a vizualiza cererea."
msgid "Click the link below to confirm your email address (%{email})"
-msgstr ""
+msgstr "Faceți clic pe link-ul de mai jos pentru a vă confirma adresa de e-mail (%{email})"
msgid "Click the link below to confirm your email address."
-msgstr ""
+msgstr "Faceți clic pe linkul de mai jos pentru a vă confirma adresa de e-mail."
msgid "Click to expand it."
-msgstr ""
+msgstr "Faceți clic pentru a o extinde."
msgid "Click to expand text"
-msgstr ""
+msgstr "Faceți clic pentru a extinde textul"
msgid "Click to hide"
msgstr "Clic pentru ascundere"
@@ -7169,7 +7259,7 @@ msgid "Clone"
msgstr ""
msgid "Clone repository"
-msgstr ""
+msgstr "Clonare repozitoriu"
msgid "Clone this issue"
msgstr "Clonați această problemă"
@@ -7178,13 +7268,13 @@ msgid "Clone with %{http_label}"
msgstr "Clonați cu %{http_label}"
msgid "Clone with %{protocol}"
-msgstr ""
+msgstr "Clonați cu %{protocol}"
msgid "Clone with KRB5"
-msgstr ""
+msgstr "Clonați cu KRB5"
msgid "Clone with SSH"
-msgstr ""
+msgstr "Clonați cu SSH"
msgid "CloneIssue|Cannot clone issue due to insufficient permissions!"
msgstr "Nu se poate clona problema din cauza permisiunilor insuficiente!"
@@ -7192,6 +7282,9 @@ msgstr "Nu se poate clona problema din cauza permisiunilor insuficiente!"
msgid "CloneIssue|Cannot clone issue to target project as it is pending deletion."
msgstr ""
+msgid "CloneIssue|Cannot clone issues of '%{issue_type}' type."
+msgstr ""
+
msgid "Cloned this issue to %{path_to_project}."
msgstr ""
@@ -7199,7 +7292,7 @@ msgid "Clones this issue, without comments, to %{project}."
msgstr ""
msgid "Close"
-msgstr ""
+msgstr "ÃŽnchide"
msgid "Close %{issueType}"
msgstr "Închideți %{issueType}"
@@ -7223,7 +7316,7 @@ msgid "Close this %{quick_action_target}"
msgstr "Închideți această %{quick_action_target}"
msgid "Closed"
-msgstr ""
+msgstr "ÃŽnchis"
msgid "Closed %{epicTimeagoDate}"
msgstr "ÃŽnchis %{epicTimeagoDate}"
@@ -7235,7 +7328,7 @@ msgid "Closed epics"
msgstr ""
msgid "Closed issues"
-msgstr ""
+msgstr "Probleme închise"
msgid "Closed this %{quick_action_target}."
msgstr ""
@@ -7246,7 +7339,10 @@ msgstr "ÃŽnchis: %{closed}"
msgid "Closes this %{quick_action_target}."
msgstr "Închide această %{quick_action_target}."
-msgid "Cloud licenses can not be removed."
+msgid "Cloud Functions description and apps that are suitable for this deployment target"
+msgstr ""
+
+msgid "Cloud Run description and apps that are suitable for this deployment target"
msgstr ""
msgid "Cluster"
@@ -7273,6 +7369,12 @@ msgstr "Tipul de cluster trebuie să fie specificat pentru Stages::ClusterEndpoi
msgid "ClusterAgents|Access tokens"
msgstr ""
+msgid "ClusterAgents|Agent might not be connected to GitLab"
+msgstr ""
+
+msgid "ClusterAgents|Agent never connected to GitLab"
+msgstr ""
+
msgid "ClusterAgents|Alternative installation methods"
msgstr "Metode alternative de instalare"
@@ -7288,6 +7390,12 @@ msgstr "A apărut o eroare necunoscută. Vă rugăm să încercați din nou."
msgid "ClusterAgents|Configuration"
msgstr ""
+msgid "ClusterAgents|Connected"
+msgstr ""
+
+msgid "ClusterAgents|Connection status"
+msgstr ""
+
msgid "ClusterAgents|Copy token"
msgstr "Copiați token"
@@ -7306,11 +7414,14 @@ msgstr "Descriere"
msgid "ClusterAgents|For alternative installation methods %{linkStart}go to the documentation%{linkEnd}."
msgstr "Pentru metodele alternative de instalare %{linkStart}mergeți la documentație%{linkEnd}."
+msgid "ClusterAgents|For more troubleshooting information go to"
+msgstr ""
+
msgid "ClusterAgents|Go to the repository"
msgstr "Mergeți la repozitoriu"
msgid "ClusterAgents|Install a new GitLab Agent"
-msgstr ""
+msgstr "Instalați un Agent GitLab nou"
msgid "ClusterAgents|Install new Agent"
msgstr "Instalați un nou agent"
@@ -7321,18 +7432,30 @@ msgstr "Integrează Kubernetes cu un agent GitLab"
msgid "ClusterAgents|Integrate with the GitLab Agent"
msgstr ""
-msgid "ClusterAgents|Last used"
-msgstr "Ultima utilizare"
+msgid "ClusterAgents|Last connected %{timeAgo}."
+msgstr ""
+
+msgid "ClusterAgents|Last contact"
+msgstr ""
msgid "ClusterAgents|Learn how to create an agent access token"
msgstr ""
+msgid "ClusterAgents|Make sure you are using a valid token."
+msgstr ""
+
msgid "ClusterAgents|Name"
msgstr "Nume"
msgid "ClusterAgents|Never"
msgstr "Niciodată"
+msgid "ClusterAgents|Never connected"
+msgstr ""
+
+msgid "ClusterAgents|Not connected"
+msgstr ""
+
msgid "ClusterAgents|Read more about getting started"
msgstr "Citiți mai multe despre procedura de start"
@@ -7354,6 +7477,9 @@ msgstr "Selectați agentul pe care doriți să îl înregistrați împreună cu
msgid "ClusterAgents|Select which Agent you want to install"
msgstr "Selectați care agent doriți să îl instalați"
+msgid "ClusterAgents|The Agent has not been connected in a long time. There might be a connectivity issue. Last contact was %{timeAgo}."
+msgstr ""
+
msgid "ClusterAgents|The GitLab Agent also requires %{linkStart}enabling the Agent Server%{linkEnd}"
msgstr ""
@@ -7381,9 +7507,6 @@ msgstr "Utilizator necunoscut"
msgid "ClusterAgents|You will need to create a token to connect to your agent"
msgstr ""
-msgid "ClusterAgent|This feature is only available for premium plans"
-msgstr "Această funcție este disponibilă numai pentru planurile premium"
-
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -7445,7 +7568,7 @@ msgid "ClusterIntegration|Allows GitLab to query a specifically configured in-cl
msgstr ""
msgid "ClusterIntegration|Amazon EKS"
-msgstr ""
+msgstr " Amazon EKS"
msgid "ClusterIntegration|An error occurred when trying to contact the Google Cloud API. Please try again later."
msgstr "A apărut o eroare la încercarea de a contacta API-ul Google Cloud. Vă rugăm să încercați din nou mai târziu."
@@ -7571,10 +7694,7 @@ msgid "ClusterIntegration|Could not load subnetworks"
msgstr ""
msgid "ClusterIntegration|Create Kubernetes cluster"
-msgstr ""
-
-msgid "ClusterIntegration|Create a provision role on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the account and external ID above. %{startMoreInfoLink}More information%{endLink}"
-msgstr ""
+msgstr "Creați clusterul Kubernetes"
msgid "ClusterIntegration|Create cluster on"
msgstr ""
@@ -7679,13 +7799,13 @@ msgid "ClusterIntegration|GitLab-managed cluster"
msgstr ""
msgid "ClusterIntegration|Google Cloud Platform project"
-msgstr ""
+msgstr "Proiect Google Cloud Platform"
msgid "ClusterIntegration|Google GKE"
msgstr ""
msgid "ClusterIntegration|Google Kubernetes Engine"
-msgstr ""
+msgstr "Motor Google Kubernetes"
msgid "ClusterIntegration|Google Kubernetes Engine project"
msgstr ""
@@ -7694,13 +7814,13 @@ msgid "ClusterIntegration|Group cluster"
msgstr ""
msgid "ClusterIntegration|HTTP Error"
-msgstr ""
+msgstr " Eroare HTTP"
msgid "ClusterIntegration|If you are setting up multiple clusters and are using Auto DevOps, %{help_link_start}read this first%{help_link_end}."
msgstr ""
msgid "ClusterIntegration|If you do not wish to delete all associated GitLab resources, you can simply remove the integration."
-msgstr ""
+msgstr "Dacă nu doriți să ștergeți toate resursele GitLab asociate, puteți elimina pur și simplu integrarea."
msgid "ClusterIntegration|In order to view the health of your cluster, you must first enable Prometheus in the Integrations tab."
msgstr ""
@@ -7709,76 +7829,76 @@ msgid "ClusterIntegration|Instance cluster"
msgstr ""
msgid "ClusterIntegration|Instance type"
-msgstr ""
+msgstr "Tip de instanță"
msgid "ClusterIntegration|Integrate Kubernetes with a cluster certificate"
-msgstr ""
+msgstr "Integrați Kubernetes cu un certificat de cluster"
msgid "ClusterIntegration|Integrate with a cluster certificate"
-msgstr ""
+msgstr "Integrați cu un certificat de cluster"
msgid "ClusterIntegration|Integration disabled"
-msgstr ""
+msgstr "Integrare dezactivată"
msgid "ClusterIntegration|Integration enabled"
-msgstr ""
+msgstr "Integrare activată"
msgid "ClusterIntegration|Integrations allow you to use applications installed in your cluster as part of your GitLab workflow."
-msgstr ""
+msgstr "Integrările vă permit să utilizați aplicațiile instalate în clusterul dvs. ca parte a fluxului de lucru GitLab."
msgid "ClusterIntegration|Key pair name"
-msgstr ""
+msgstr " Numele perechii de chei"
msgid "ClusterIntegration|Kubernetes cluster is being created..."
msgstr ""
msgid "ClusterIntegration|Kubernetes cluster name"
-msgstr ""
+msgstr "Numele clusterului Kubernetes"
msgid "ClusterIntegration|Kubernetes cluster was successfully created."
-msgstr ""
+msgstr "Clusterul Kubernetes a fost creat cu succes."
msgid "ClusterIntegration|Kubernetes clusters allow you to use review apps, deploy your applications, run your pipelines, and much more in an easy way."
msgstr "Clusterele Kubernetes vă permit să utilizați aplicații de revizuire, să implementați aplicațiile, să vă rulați conductele și multe altele într-un mod ușor."
msgid "ClusterIntegration|Kubernetes version"
-msgstr ""
+msgstr "Versiunea Kubernetes"
msgid "ClusterIntegration|Kubernetes version not found"
-msgstr ""
+msgstr "Versiunea Kubernetes nu a fost găsită"
msgid "ClusterIntegration|Learn more about %{help_link_start_machine_type}machine types%{help_link_end} and %{help_link_start_pricing}pricing%{help_link_end}."
-msgstr ""
+msgstr "Aflați mai multe despre %{help_link_start_machine_type} tipurile de mașini %{help_link_end} și %{help_link_start_pricing} prețuri %{help_link_end}."
msgid "ClusterIntegration|Learn more about %{help_link_start}zones%{help_link_end}."
-msgstr ""
+msgstr "Aflați mai multe despre %{help_link_start} zone %{help_link_end}."
msgid "ClusterIntegration|Learn more about Kubernetes"
-msgstr ""
+msgstr "Aflați mai multe despre Kubernetes"
msgid "ClusterIntegration|Learn more about group Kubernetes clusters"
-msgstr ""
+msgstr "Aflați mai multe despre grupurile de cluster Kubernetes"
msgid "ClusterIntegration|Learn more about instance Kubernetes clusters"
-msgstr ""
+msgstr "Aflați mai multe despre clusterele Kubernetes de instanță"
msgid "ClusterIntegration|Loading IAM Roles"
-msgstr ""
+msgstr "Încărcarea rolurilor IAM"
msgid "ClusterIntegration|Loading Key Pairs"
-msgstr ""
+msgstr "Încărcarea perechilor de chei"
msgid "ClusterIntegration|Loading VPCs"
-msgstr ""
+msgstr "Încărcarea VPC-urilor"
msgid "ClusterIntegration|Loading instance types"
-msgstr ""
+msgstr "Încărcarea tipurilor de instanțe"
msgid "ClusterIntegration|Loading networks"
-msgstr ""
+msgstr " Se încarcă rețelele"
msgid "ClusterIntegration|Loading security groups"
-msgstr ""
+msgstr " Se încarcă grupurile de securitate"
msgid "ClusterIntegration|Loading subnets"
msgstr ""
@@ -7787,16 +7907,16 @@ msgid "ClusterIntegration|Loading subnetworks"
msgstr ""
msgid "ClusterIntegration|Machine type"
-msgstr ""
+msgstr "Tipul mașinii"
msgid "ClusterIntegration|Make sure your API endpoint is correct"
-msgstr ""
+msgstr " Asigurați-vă că punctul final API este corect"
msgid "ClusterIntegration|Make sure your account %{link_to_requirements} to create Kubernetes clusters"
msgstr ""
msgid "ClusterIntegration|Manage your Kubernetes cluster by visiting %{provider_link}"
-msgstr ""
+msgstr " Gestionați clusterul Kubernetes vizitând %{provider_link}"
msgid "ClusterIntegration|Namespace per environment"
msgstr ""
@@ -7829,7 +7949,7 @@ msgid "ClusterIntegration|No security group found"
msgstr ""
msgid "ClusterIntegration|No subnet found"
-msgstr ""
+msgstr "Nu a fost găsită nicio subrețea"
msgid "ClusterIntegration|No subnetworks found"
msgstr ""
@@ -7883,106 +8003,106 @@ msgid "ClusterIntegration|Remove integration"
msgstr ""
msgid "ClusterIntegration|Remove integration and resources"
-msgstr ""
+msgstr "Eliminați integrarea și resursele"
msgid "ClusterIntegration|Remove integration and resources?"
-msgstr ""
+msgstr "Eliminați integrarea și resursele?"
msgid "ClusterIntegration|Remove integration?"
-msgstr ""
+msgstr "Eliminați integrarea?"
msgid "ClusterIntegration|Remove this Kubernetes cluster's configuration from this project. This will not delete your actual Kubernetes cluster."
msgstr ""
msgid "ClusterIntegration|Removes cluster from project but keeps associated resources"
-msgstr ""
+msgstr "Eliminați clusterul din proiect, dar păstrați resursele asociate"
msgid "ClusterIntegration|Save changes"
msgstr ""
msgid "ClusterIntegration|Search IAM Roles"
-msgstr ""
+msgstr "Căutați roluri IAM"
msgid "ClusterIntegration|Search Key Pairs"
msgstr ""
msgid "ClusterIntegration|Search VPCs"
-msgstr ""
+msgstr "Căutați VPC-uri"
msgid "ClusterIntegration|Search instance types"
-msgstr ""
+msgstr "Căutați tipuri de instanțe"
msgid "ClusterIntegration|Search machine types"
-msgstr ""
+msgstr "Căutați tipuri de mașini"
msgid "ClusterIntegration|Search networks"
-msgstr ""
+msgstr "Căutați rețele"
msgid "ClusterIntegration|Search projects"
-msgstr ""
+msgstr "Căutați proiecte"
msgid "ClusterIntegration|Search security groups"
-msgstr ""
+msgstr " Căutați grupuri de securitate"
msgid "ClusterIntegration|Search subnets"
-msgstr ""
+msgstr " Căutați subrețele"
msgid "ClusterIntegration|Search subnetworks"
-msgstr ""
+msgstr " Căutați subrețele"
msgid "ClusterIntegration|Search zones"
-msgstr ""
+msgstr "Căutați zone"
msgid "ClusterIntegration|Security group"
-msgstr ""
+msgstr " Grup de securitate"
msgid "ClusterIntegration|See and edit the details for your Kubernetes cluster"
-msgstr ""
+msgstr "Vizualizați și editați detaliile pentru clusterul dvs. Kubernetes"
msgid "ClusterIntegration|Select a VPC to choose a security group"
-msgstr ""
+msgstr " Selectați un VPC pentru a alege un grup de securitate"
msgid "ClusterIntegration|Select a VPC to choose a subnet"
-msgstr ""
+msgstr " Selectați un VPC pentru a alege o subrețea"
msgid "ClusterIntegration|Select a VPC to use for your EKS Cluster resources. To use a new VPC, first create one on %{linkStart}Amazon Web Services %{linkEnd}."
-msgstr ""
+msgstr "Selectați un VPC care să fie utilizat pentru resursele Clusterului EKS. Pentru a utiliza un VPC nou, creați mai întâi unul pe %{linkStart}Amazon Web Services %{linkEnd}."
msgid "ClusterIntegration|Select a network to choose a subnetwork"
-msgstr ""
+msgstr " Selectați o rețea pentru a alege o subrețea"
msgid "ClusterIntegration|Select a region to choose a Key Pair"
-msgstr ""
+msgstr "Selectați o regiune pentru a alege o pereche de chei"
msgid "ClusterIntegration|Select a region to choose a VPC"
-msgstr ""
+msgstr "Selectați o regiune pentru a alege un VPC"
msgid "ClusterIntegration|Select a zone to choose a network"
-msgstr ""
+msgstr " Selectați o zonă pentru a alege o rețea"
msgid "ClusterIntegration|Select machine type"
-msgstr ""
+msgstr "Selectați tipul mașinii"
msgid "ClusterIntegration|Select project"
-msgstr ""
+msgstr "Selectați proiectul"
msgid "ClusterIntegration|Select project and zone to choose machine type"
-msgstr ""
+msgstr "Selectați proiectul și zona pentru a alege tipul mașinii"
msgid "ClusterIntegration|Select project to choose zone"
-msgstr ""
+msgstr "Selectați proiectul pentru a alege zona"
msgid "ClusterIntegration|Select the key pair name that will be used to create EC2 nodes. To use a new key pair name, first create one on %{linkStart}Amazon Web Services%{linkEnd}."
-msgstr ""
+msgstr "Selectați numele perechii de chei care va fi utilizată pentru a crea noduri EC2. Pentru a utiliza un nou nume de pereche de chei, creați mai întâi unul pe %{linkStart}Amazon Web Services%{linkEnd}."
msgid "ClusterIntegration|Select the region you want to create the new cluster in. Make sure you have access to this region for your role to be able to authenticate. If no region is selected, we will use %{codeStart}DEFAULT_REGION%{codeEnd}. Learn more about %{linkStart}Regions%{linkEnd}."
msgstr ""
msgid "ClusterIntegration|Select zone"
-msgstr ""
+msgstr "Selectați zona"
msgid "ClusterIntegration|Select zone to choose machine type"
-msgstr ""
+msgstr "Selectați zona pentru a alege tipul mașinii"
msgid "ClusterIntegration|Service Token"
msgstr ""
@@ -7994,46 +8114,46 @@ msgid "ClusterIntegration|Service token is required."
msgstr ""
msgid "ClusterIntegration|Set a prefix for your namespaces. If not set, defaults to your project path. If modified, existing environments will use their current namespaces until the cluster cache is cleared."
-msgstr ""
+msgstr "Setați un prefix pentru spațiile de nume. Dacă nu este setat, valoarea implicită este calea proiectului. Dacă sunt modificate, mediile existente își vor folosi spațiile de nume curente până când cache-ul clusterului este șters."
msgid "ClusterIntegration|Something went wrong on our end."
-msgstr ""
+msgstr "A fost ceva în neregulă la noi."
msgid "ClusterIntegration|Something went wrong while creating your Kubernetes cluster"
-msgstr ""
+msgstr "Ceva nu a mers bine în timpul creării clusterului Kubernetes"
msgid "ClusterIntegration|Specifying a domain will allow you to use Auto Review Apps and Auto Deploy stages for %{linkStart}Auto DevOps.%{linkEnd} The domain should have a wildcard DNS configured matching the domain. "
-msgstr ""
+msgstr "Specificarea unui domeniu vă va permite să folosiți etapele Auto Review Apps și Auto Deploy pentru %{linkStart}Auto DevOps.%{linkEnd} Domeniul trebuie să aibă un wildcard DNS configurat care să corespundă domeniului. "
msgid "ClusterIntegration|Subnets"
-msgstr ""
+msgstr "Subrețele"
-msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provisioned role, first create one on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the above account and external IDs. %{startMoreInfoLink}More information%{endLink}"
+msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provisioned role, first create one on %{awsLinkStart}Amazon Web Services %{awsLinkEnd} using the above account and external IDs. %{moreInfoStart}More information%{moreInfoEnd}"
msgstr ""
msgid "ClusterIntegration|The Kubernetes certificate used to authenticate to the cluster."
msgstr ""
msgid "ClusterIntegration|The URL used to access the Kubernetes API."
-msgstr ""
+msgstr "Adresa URL folosită pentru accesarea API-ului Kubernetes."
msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, logs, and Web terminals."
msgstr ""
msgid "ClusterIntegration|The region the new cluster will be created in. You must reauthenticate to change regions."
-msgstr ""
+msgstr "Regiunea în care va fi creat noul cluster. Trebuie să vă autentificați din nou pentru a schimba regiunile."
msgid "ClusterIntegration|There was a problem authenticating with your cluster. Please ensure your CA Certificate and Token are valid."
-msgstr ""
+msgstr "A existat o problemă la autentificarea cu clusterul dvs. Vă rugăm să vă asigurați că certificatul CA și token-ul sunt valabile."
msgid "ClusterIntegration|There was an HTTP error when connecting to your cluster."
-msgstr ""
+msgstr "A existat o eroare HTTP la conectarea la clusterul dumneavoastră."
msgid "ClusterIntegration|This account must have permissions to create a Kubernetes cluster in the %{link_to_container_project} specified below"
-msgstr ""
+msgstr "Acest cont trebuie să aibă permisiuni pentru a crea un cluster Kubernetes în %{link_to_container_project} specificat mai jos"
msgid "ClusterIntegration|This is necessary if your integration has become out of sync. The cache is repopulated during the next CI job that requires namespace and service accounts."
-msgstr ""
+msgstr "Acest lucru este necesar dacă integrarea dvs. nu mai este sincronizată. Cache-ul este repopulat în timpul următorului job CI care necesită spații de nume și conturi de serviciu."
msgid "ClusterIntegration|This is necessary to clear existing environment-namespace associations from clusters previously managed by GitLab."
msgstr ""
@@ -8162,13 +8282,13 @@ msgid "Code Coverage| Empty code coverage data"
msgstr ""
msgid "Code Coverage|Couldn't fetch the code coverage data"
-msgstr ""
+msgstr "Nu s-au putut prelua datele de acoperire a codului"
msgid "Code Owner"
-msgstr ""
+msgstr "Proprietarul codului"
msgid "Code Owners"
-msgstr ""
+msgstr "Proprietarii codului"
msgid "Code Quality"
msgstr ""
@@ -8180,43 +8300,43 @@ msgid "Code Review Analytics displays a table of open merge requests considered
msgstr ""
msgid "Code coverage statistics for %{ref} %{start_date} - %{end_date}"
-msgstr ""
+msgstr "Statistici de acoperire a codului pentru %{ref} %{start_date} - %{end_date}"
msgid "Code owner approval is required"
-msgstr ""
+msgstr "Este necesară aprobarea proprietarului codului"
msgid "Code owners"
-msgstr ""
+msgstr "Proprietarii codului"
msgid "Code review"
msgstr ""
msgid "Code snippet copied. Insert it in the correct location in the YAML file."
-msgstr ""
+msgstr "Fragment de cod copiat. Introduceți-l în locația corectă din fișierul YAML."
msgid "CodeIntelligence|This is the definition"
-msgstr ""
+msgstr "Aceasta este definiția"
msgid "CodeNavigation|No references found"
-msgstr ""
+msgstr "Nu s-au găsit referințe"
msgid "CodeOwner|Pattern"
-msgstr ""
+msgstr "Model"
msgid "CodeQuality|New code quality degradations on this line"
msgstr ""
msgid "Cohorts|Inactive users"
-msgstr ""
+msgstr "Utilizatori inactivi"
msgid "Cohorts|Month %{month_index}"
-msgstr ""
+msgstr "Luna %{month_index}"
msgid "Cohorts|New users"
-msgstr ""
+msgstr "Utilizatori noi"
msgid "Cohorts|Registration month"
-msgstr ""
+msgstr "Luna înregistrării"
msgid "Cohorts|Returning users"
msgstr ""
@@ -8242,6 +8362,9 @@ msgstr ""
msgid "Collapse replies"
msgstr ""
+msgid "Collapse settings section"
+msgstr ""
+
msgid "Collapse sidebar"
msgstr ""
@@ -8255,13 +8378,16 @@ msgid "Colorize messages"
msgstr "Colorează mesajele"
msgid "ComboSearch is not defined"
-msgstr ""
+msgstr "ComboSearch nu este definită"
msgid "Comma-separated list of email addresses."
+msgstr "Lista adreselor de e-mail separate prin virgulă."
+
+msgid "Comma-separated list of users allowed to exceed the rate limit."
msgstr ""
msgid "Comma-separated, e.g. '1.1.1.1, 2.2.2.0/24'"
-msgstr ""
+msgstr "Separate prin virgulă, de exemplu '1.1.1.1, 2.2.0/24'"
msgid "Command"
msgstr ""
@@ -8270,13 +8396,13 @@ msgid "Command line instructions"
msgstr ""
msgid "Commands applied"
-msgstr ""
+msgstr "Comenzi aplicate"
msgid "Commands did not apply"
msgstr ""
msgid "Comment"
-msgstr ""
+msgstr "Comentariu"
msgid "Comment & close %{noteable_name}"
msgstr ""
@@ -8294,16 +8420,16 @@ msgid "Comment '%{label}' position"
msgstr ""
msgid "Comment form position"
-msgstr ""
+msgstr "Poziția formularului de comentariu"
msgid "Comment is being updated"
-msgstr ""
+msgstr "Comentariul este în curs de actualizare"
msgid "Comment on lines %{startLine} to %{endLine}"
-msgstr ""
+msgstr "Comentariu pe liniile de la %{startLine} la %{endLine}"
msgid "Comment/Reply (quoting selected text)"
-msgstr ""
+msgstr "Comentariu/Răspuns (citând textul selectat)"
msgid "Commenting on files that replace or are replaced by symbolic links is currently not supported."
msgstr ""
@@ -8312,7 +8438,7 @@ msgid "Commenting on symbolic links that replace or are replaced by files is cur
msgstr ""
msgid "Comments"
-msgstr ""
+msgstr "Comentarii"
msgid "Commit"
msgid_plural "Commits"
@@ -8336,16 +8462,16 @@ msgid "Commit deleted"
msgstr "Commit șters"
msgid "Commit message"
-msgstr "Commit mesaj"
+msgstr "Mesajul commit-ului"
msgid "Commit message (optional)"
msgstr ""
msgid "Commit statistics for %{ref} %{start_time} - %{end_time}"
-msgstr ""
+msgstr "Statistici commit-uri pentru %{ref} %{start_time} - %{end_time}"
msgid "Commit to %{branchName} branch"
-msgstr ""
+msgstr "Commit la %{branchName} ramura"
msgid "CommitBoxTitle|Commit"
msgstr "Commit"
@@ -8360,7 +8486,7 @@ msgid "CommitWidget|authored"
msgstr "redactat"
msgid "Commits"
-msgstr ""
+msgstr "Commit-uri"
msgid "Commits feed"
msgstr ""
@@ -8375,7 +8501,7 @@ msgid "Commits per weekday"
msgstr ""
msgid "Commits to"
-msgstr ""
+msgstr "Commit-uri la"
msgid "Commits you select appear here. Go to the first tab and select commits to add to this merge request."
msgstr ""
@@ -8384,46 +8510,46 @@ msgid "Commits|An error occurred while fetching merge requests data."
msgstr "A apărut o eroare la preluarea datelor cererii de îmbinare."
msgid "Commits|History"
-msgstr ""
+msgstr "Istoric"
msgid "Commits|No related merge requests found"
msgstr "Nu au fost găsite merge request-uri asociate"
msgid "Committed by"
-msgstr ""
+msgstr "Commit de"
msgid "Commit…"
msgstr ""
msgid "Community forum"
-msgstr ""
+msgstr "Forumul comunității"
msgid "Company"
-msgstr ""
+msgstr "Companie"
msgid "Compare"
msgstr ""
msgid "Compare %{oldCommitId}...%{newCommitId}"
-msgstr ""
+msgstr "Comparați %{oldCommitId}...%{newCommitId}"
msgid "Compare Git revisions"
-msgstr ""
+msgstr "Comparați reviziile Git"
msgid "Compare GitLab editions"
-msgstr ""
+msgstr "Comparați edițiile GitLab"
msgid "Compare Revisions"
msgstr ""
msgid "Compare changes"
-msgstr ""
+msgstr "Comparați modificările"
msgid "Compare changes with the last commit"
msgstr ""
msgid "Compare changes with the merge request target branch"
-msgstr ""
+msgstr "Comparați modificările cu ramura țintă a merge request-ului"
msgid "Compare submodule commit revisions"
msgstr ""
@@ -8477,13 +8603,13 @@ msgid "CompareRevisions|View open merge request"
msgstr "Vizualizați merge request-ul deschis"
msgid "Complete"
-msgstr ""
+msgstr "Complet"
msgid "Completed"
msgstr ""
msgid "Compliance"
-msgstr ""
+msgstr "Conformitate"
msgid "Compliance Dashboard"
msgstr ""
@@ -8555,34 +8681,37 @@ msgid "ComplianceFramework|New Compliance Framework"
msgstr ""
msgid "Component"
-msgstr ""
+msgstr "Component"
msgid "Confidence"
-msgstr ""
+msgstr "ÃŽncredere"
msgid "Confidential"
-msgstr ""
+msgstr "Confidențial"
msgid "Confidentiality"
-msgstr ""
+msgstr "Confidențialitate"
msgid "Configuration"
-msgstr ""
+msgstr "Configurație"
msgid "Configuration help"
-msgstr ""
+msgstr "Ajutor pentru configurare"
msgid "Configure %{italic_start}What's new%{italic_end} drawer and content."
msgstr "Configurați %{italic_start} Ce este noul %{italic_end} sertar și conținut."
msgid "Configure %{link} to track events. %{link_start}Learn more.%{link_end}"
-msgstr ""
+msgstr "Configurați %{link} pentru a urmări evenimentele. %{link_start}Învățați mai multe.%{link_end}"
msgid "Configure %{repository_checks_link_start}repository checks%{link_end} and %{housekeeping_link_start}housekeeping%{link_end} on repositories."
msgstr "Configurați %{repository_checks_link_start} controalele de repozitoriu%{link_end} și %{housekeeping_link_start} curățenia%{link_end} în depozite."
+msgid "Configure CAPTCHAs, IP address limits, and other anti-spam measures."
+msgstr ""
+
msgid "Configure Dependency Scanning in `.gitlab-ci.yml` using the GitLab managed template. You can [add variable overrides](https://docs.gitlab.com/ee/user/application_security/dependency_scanning/#customizing-the-dependency-scanning-settings) to customize Dependency Scanning settings."
-msgstr "Configurați scanarea dependenței în `.gitLab-ci.yml` utilizând șablonul gestionat Gitlab. Puteți [adăuga suprascrieri variabile] (https://docs.gitlab.com/ee/user/application_security/dependendice_scanning/#Customizing-he-dependendice-scanning-settings) pentru a personaliza setările de scanare a dependenței."
+msgstr ""
msgid "Configure Dependency Scanning in `.gitlab-ci.yml`, creating this file if it does not already exist"
msgstr "Configurați scanarea dependenței în `.gitlab-ci.yml`, creând acest fișier dacă nu există deja"
@@ -8597,13 +8726,13 @@ msgid "Configure Integrations"
msgstr ""
msgid "Configure Prometheus"
-msgstr ""
+msgstr "Configurați Prometeu"
msgid "Configure SAST in `.gitlab-ci.yml` using the GitLab managed template. You can [add variable overrides](https://docs.gitlab.com/ee/user/application_security/sast/#customizing-the-sast-settings) to customize SAST settings."
-msgstr ""
+msgstr "Configurați SAST în `.gitlab-ci.yml` utilizând șablonul gestionat de GitLab. Puteți [add variable overrides](https://docs.gitlab.com/ee/user/application_security/sast/#customizing-the-sast-settings) pentru a personaliza setările SAST."
msgid "Configure SAST in `.gitlab-ci.yml`, creating this file if it does not already exist"
-msgstr ""
+msgstr "Configurați SAST în `.gitlab-ci.yml`, creând acest fișier dacă nu există deja."
msgid "Configure Secret Detection in `.gitlab-ci.yml` using the GitLab managed template. You can [add variable overrides](https://docs.gitlab.com/ee/user/application_security/secret_detection/#customizing-settings) to customize Secret Detection settings."
msgstr ""
@@ -8617,16 +8746,13 @@ msgstr ""
msgid "Configure a %{codeStart}.gitlab-webide.yml%{codeEnd} file in the %{codeStart}.gitlab%{codeEnd} directory to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
msgstr ""
-msgid "Configure existing installation"
-msgstr ""
-
-msgid "Configure limit for notes created per minute by web and API requests."
+msgid "Configure advanced permissions, Large File Storage, and two-factor authentication settings."
msgstr ""
-msgid "Configure limits for Project/Group Import/Export."
+msgid "Configure approvals by authors and committers on all projects."
msgstr ""
-msgid "Configure limits for web and API requests."
+msgid "Configure existing installation"
msgstr ""
msgid "Configure paths to be protected by Rack Attack."
@@ -8641,10 +8767,13 @@ msgstr "Configurați stocarea repozitoriului."
msgid "Configure settings for Advanced Search with Elasticsearch."
msgstr ""
-msgid "Configure specific limits for Git LFS requests that supersede the general user and IP rate limits."
+msgid "Configure specific limits for Files API requests that supersede the general user and IP rate limits."
msgstr ""
-msgid "Configure specific limits for Packages API requests that supersede the general user and IP rate limits."
+msgid "Configure specific limits for Git LFS requests that supersede the general user and IP rate limits."
+msgstr "Configurați limite specifice pentru cereri Git LFS care înlocuiesc limitele generale ale utilizatorului și ale ratei IP."
+
+msgid "Configure specific limits for deprecated API requests that supersede the general user and IP rate limits."
msgstr ""
msgid "Configure the %{link} integration."
@@ -8654,6 +8783,9 @@ msgid "Configure the default first day of the week and time tracking units."
msgstr "Configurați prima zi implicită a săptămânii și unitățile de urmărire a timpului."
msgid "Configure the way a user creates a new account."
+msgstr "Configurați modul în care un utilizator creează un cont nou."
+
+msgid "Configure via Merge Request"
msgstr ""
msgid "Configure which lists are shown for anyone who visits this board"
@@ -8666,25 +8798,25 @@ msgid "Confirm new password"
msgstr "Confirmați noua parolă"
msgid "Confirm user"
-msgstr ""
+msgstr "Confirmați utilizatorul"
msgid "Confirm your account"
-msgstr ""
+msgstr "Confirmă-ți contul"
msgid "Confirm your email address"
-msgstr ""
+msgstr "Confirmați-vă adresa de e-mail"
msgid "Confirmation email sent to %{email}"
-msgstr ""
+msgstr "E-mail de confirmare trimis la %{email}"
msgid "Confirmation required"
-msgstr ""
+msgstr "Confirmare necesară"
msgid "Confirmed at:"
-msgstr ""
+msgstr "Confirmat la:"
msgid "Confirmed:"
-msgstr ""
+msgstr "Confirmat:"
msgid "Conflict: This file was added both in the source and target branches, but with different contents."
msgstr "Conflict: Acest fișier a fost adăugat atât în ramurile sursei, cât și în cele țintă, dar cu conținut diferit."
@@ -8708,28 +8840,28 @@ msgid "Conflict: This file was renamed in the source branch, but removed in the
msgstr "Conflict: Acest fișier a fost redenumit în ramura sursă, dar eliminat în ramura țintă."
msgid "Confluence"
-msgstr ""
+msgstr "Confluență"
msgid "Confluence Cloud Workspace URL"
-msgstr ""
+msgstr "Adresa URL a spațiului de lucru Cloud Confluence"
msgid "ConfluenceService|Confluence Workspace"
-msgstr ""
+msgstr "Spațiul de lucru Confluence"
msgid "ConfluenceService|Link to a Confluence Workspace from the sidebar."
-msgstr ""
+msgstr "Link către un spațiu de lucru Confluence din bara laterală."
msgid "ConfluenceService|Link to a Confluence Workspace from the sidebar. Enabling this integration replaces the \"Wiki\" sidebar link with a link to the Confluence Workspace. The GitLab wiki is still available at the original URL."
-msgstr ""
+msgstr "Link la un spațiu de lucru Confluence din bara laterală. Activarea acestei integrări înlocuiește linkul \"Wiki\" din bara laterală cu un link către spațiul de lucru Confluence. Wiki-ul GitLab este în continuare disponibil la adresa URL originală."
msgid "ConfluenceService|Your GitLab wiki is still available at %{wiki_link}. To re-enable the link to the GitLab wiki, disable this integration."
-msgstr ""
+msgstr "Wiki-ul dvs. GitLab este încă disponibil la %{wiki_link}. Pentru a reactiva link-ul către wiki-ul GitLab, dezactivați această integrare."
msgid "Congratulations, your free trial is activated."
-msgstr ""
+msgstr "Felicitări, evaluarea dvs. gratuită este activată."
msgid "Connect"
-msgstr ""
+msgstr "Conectare"
msgid "Connect all repositories"
msgstr ""
@@ -8738,10 +8870,10 @@ msgid "Connect repositories from GitHub"
msgstr ""
msgid "Connect your external repositories, and CI/CD pipelines will run for new commits. A GitLab project will be created with only CI/CD features enabled."
-msgstr ""
+msgstr "Conectați-vă repozitoriile externe, iar pipeline-urile CI/CD vor rula pentru noile commit-uri. Un proiect GitLab va fi creat doar cu funcții CI/CD activate."
msgid "Connected"
-msgstr ""
+msgstr "Conectat"
msgid "Connecting"
msgstr ""
@@ -8774,13 +8906,13 @@ msgid "Container Registry"
msgstr ""
msgid "Container Scanning"
-msgstr ""
+msgstr "Scanare container"
msgid "Container does not exist"
-msgstr ""
+msgstr "Containerul nu există"
msgid "Container must be a project or a group."
-msgstr ""
+msgstr "Containerul trebuie să fie un proiect sau un grup."
msgid "Container registry images"
msgstr ""
@@ -8808,30 +8940,30 @@ msgstr[2] ""
msgid "ContainerRegistry|%{count} Tag"
msgid_plural "ContainerRegistry|%{count} Tags"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "%{count} Etichetă"
+msgstr[1] "%{count} Etichete"
+msgstr[2] "%{count} de etichete"
msgid "ContainerRegistry|%{strongStart}Disabled%{strongEnd} - Tags will not be automatically deleted."
-msgstr ""
+msgstr "%{strongStart}Dezactivat%{strongEnd} - Etichetele nu vor fi șterse automat."
msgid "ContainerRegistry|%{strongStart}Enabled%{strongEnd} - Tags that match the rules on this page are automatically scheduled for deletion."
-msgstr ""
+msgstr "%{strongStart}Activat%{strongEnd} - Etichetele care corespund regulilor de pe această pagină sunt programate automat pentru ștergere."
msgid "ContainerRegistry|%{title} was successfully scheduled for deletion"
-msgstr ""
+msgstr "%{title} a fost programat cu succes pentru ștergere"
msgid "ContainerRegistry|-- tags"
-msgstr ""
+msgstr "-- etichete"
msgid "ContainerRegistry|Build an image"
-msgstr ""
+msgstr "Construiește o imagine"
msgid "ContainerRegistry|CLI Commands"
msgstr ""
msgid "ContainerRegistry|Cleanup disabled"
-msgstr ""
+msgstr " Curățare dezactivată"
msgid "ContainerRegistry|Cleanup in progress"
msgstr ""
@@ -8933,43 +9065,43 @@ msgid "ContainerRegistry|Image repository with no name located at the project UR
msgstr ""
msgid "ContainerRegistry|Image tags"
-msgstr ""
+msgstr " Etichete imagine"
msgid "ContainerRegistry|Invalid tag: missing manifest digest"
-msgstr ""
+msgstr " Etichetă nevalidă: lipsă rezumat manifest"
msgid "ContainerRegistry|Keep tags matching:"
msgstr ""
msgid "ContainerRegistry|Keep the most recent:"
-msgstr ""
+msgstr " Păstrați cele mai recente:"
msgid "ContainerRegistry|Keep these tags"
-msgstr ""
+msgstr " Păstrați aceste etichete"
msgid "ContainerRegistry|Last updated %{time}"
-msgstr ""
+msgstr " Ultima actualizare %{time}"
msgid "ContainerRegistry|Login"
-msgstr ""
+msgstr " Autentificare"
msgid "ContainerRegistry|Manifest digest: %{digest}"
-msgstr ""
+msgstr " Rezumat manifest: %{digest}"
msgid "ContainerRegistry|Missing or insufficient permission, delete button disabled"
-msgstr ""
+msgstr " Permisiune lipsă sau insuficientă, butonul de ștergere este dezactivat"
msgid "ContainerRegistry|Next cleanup scheduled to run on:"
-msgstr ""
+msgstr " Următoarea curățare programată să ruleze pe:"
msgid "ContainerRegistry|Not yet scheduled"
-msgstr ""
+msgstr " Nu este încă programat"
msgid "ContainerRegistry|Note: Any policy update will result in a change to the scheduled run date and time"
-msgstr ""
+msgstr "Notă: Orice actualizare a politicii va avea ca rezultat o modificare a datei și orei de execuție programate"
msgid "ContainerRegistry|Published %{timeInfo}"
-msgstr ""
+msgstr " Publicat %{timeInfo}"
msgid "ContainerRegistry|Published to the %{repositoryPath} image repository at %{time} on %{date}"
msgstr ""
@@ -8985,18 +9117,18 @@ msgstr ""
msgid "ContainerRegistry|Remove tag"
msgid_plural "ContainerRegistry|Remove tags"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "Eliminați eticheta"
+msgstr[1] "Eliminați etichetele"
+msgstr[2] "Eliminați etichetele"
msgid "ContainerRegistry|Remove tags matching:"
msgstr ""
msgid "ContainerRegistry|Remove tags older than:"
-msgstr ""
+msgstr " Eliminați etichetele mai vechi de:"
msgid "ContainerRegistry|Remove these tags"
-msgstr ""
+msgstr " Eliminați aceste etichete"
msgid "ContainerRegistry|Root image"
msgstr ""
@@ -9005,7 +9137,7 @@ msgid "ContainerRegistry|Run cleanup:"
msgstr ""
msgid "ContainerRegistry|Some tags were not deleted"
-msgstr ""
+msgstr "Unele etichete nu au fost șterse"
msgid "ContainerRegistry|Something went wrong while fetching the cleanup policy."
msgstr ""
@@ -9038,10 +9170,10 @@ msgid "ContainerRegistry|Sorry, your filter produced no results."
msgstr ""
msgid "ContainerRegistry|Tag successfully marked for deletion."
-msgstr ""
+msgstr " Etichetă marcată cu succes pentru ștergere."
msgid "ContainerRegistry|Tags successfully marked for deletion."
-msgstr ""
+msgstr " Etichete marcate cu succes pentru ștergere."
msgid "ContainerRegistry|Tags that match these rules are %{strongStart}kept%{strongEnd}, even if they match a removal rule below. The %{secondStrongStart}latest%{secondStrongEnd} tag is always kept."
msgstr ""
@@ -9127,6 +9259,9 @@ msgstr ""
msgid "Content parsed with %{link}."
msgstr ""
+msgid "ContentEditor|Table of Contents"
+msgstr ""
+
msgid "ContentEditor|You have to provide a renderMarkdown function or a custom serializer"
msgstr ""
@@ -9149,10 +9284,10 @@ msgid "Continue to the next step"
msgstr ""
msgid "Continuous Integration and Deployment"
-msgstr ""
+msgstr "Integrare și implementare continuă"
msgid "Contribute to GitLab"
-msgstr ""
+msgstr "Contribuiți la GitLab"
msgid "Contribution"
msgstr ""
@@ -9224,7 +9359,7 @@ msgid "Cookie domain"
msgstr ""
msgid "Copied"
-msgstr ""
+msgstr "Copiată"
msgid "Copied labels and milestone from %{source_issuable_reference}."
msgstr ""
@@ -9313,6 +9448,9 @@ msgstr ""
msgid "Copy link to chart"
msgstr ""
+msgid "Copy prefix"
+msgstr ""
+
msgid "Copy reference"
msgstr ""
@@ -9343,9 +9481,12 @@ msgstr ""
msgid "Copy value"
msgstr ""
-msgid "Corpus Management|Are you sure you want to delete the corpus?"
+msgid "Corpus Management"
msgstr ""
+msgid "Corpus Management|Are you sure you want to delete the corpus?"
+msgstr "Sunteți sigur că doriți să ștergeți corpusul?"
+
msgid "CorpusManagement|Actions"
msgstr ""
@@ -9368,7 +9509,7 @@ msgid "CorpusManagement|Latest Job:"
msgstr ""
msgid "CorpusManagement|New corpus needs to be a upload in *.zip format. Maximum 10GB"
-msgstr ""
+msgstr "Corpusul nou trebuie să fie o încărcare în format *.zip. Maximum 10GB"
msgid "CorpusManagement|New upload"
msgstr ""
@@ -9571,6 +9712,9 @@ msgstr ""
msgid "Create commit"
msgstr ""
+msgid "Create common files more quickly, and standardize their format."
+msgstr ""
+
msgid "Create confidential merge request"
msgstr ""
@@ -9604,6 +9748,9 @@ msgstr ""
msgid "Create issue"
msgstr ""
+msgid "Create issue to resolve all threads"
+msgstr ""
+
msgid "Create iteration"
msgstr ""
@@ -9626,7 +9773,7 @@ msgid "Create new"
msgstr ""
msgid "Create new %{name} by email"
-msgstr ""
+msgstr "Creează un nou %{name} prin e-mail"
msgid "Create new CI/CD pipeline"
msgstr ""
@@ -9635,7 +9782,7 @@ msgid "Create new Value Stream"
msgstr ""
msgid "Create new branch"
-msgstr ""
+msgstr "Creați o ramură nouă"
msgid "Create new confidential %{issuableType}"
msgstr ""
@@ -9658,6 +9805,9 @@ msgstr ""
msgid "Create new..."
msgstr ""
+msgid "Create or import your first project"
+msgstr ""
+
msgid "Create project"
msgstr ""
@@ -9698,7 +9848,7 @@ msgid "CreateGroup|You don’t have permission to create groups."
msgstr ""
msgid "CreateTag|Tag"
-msgstr ""
+msgstr "Etichetă"
msgid "CreateTokenToCloneLink|create a personal access token"
msgstr ""
@@ -10015,7 +10165,7 @@ msgstr ""
msgid "Custom notification events"
msgstr ""
-msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notificationLinkStart} notification emails%{notificationLinkEnd}."
+msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notificationLinkStart}notification emails%{notificationLinkEnd}."
msgstr ""
msgid "Custom project templates"
@@ -10025,7 +10175,7 @@ msgid "Custom project templates have not been set up for groups that you are a m
msgstr ""
msgid "Custom range"
-msgstr ""
+msgstr "Interval personalizat"
msgid "Custom range (UTC)"
msgstr ""
@@ -10148,7 +10298,7 @@ msgid "CycleAnalyticsStage|Issue"
msgstr ""
msgid "CycleAnalyticsStage|Plan"
-msgstr ""
+msgstr "Plan"
msgid "CycleAnalyticsStage|Review"
msgstr ""
@@ -10166,7 +10316,7 @@ msgid "CycleAnalyticsStage|is not available for the selected group"
msgstr ""
msgid "CycleAnalyticsStage|should be under a group"
-msgstr ""
+msgstr "ar trebui să fie sub un grup"
msgid "CycleAnalytics|%{selectedLabelsCount} selected (%{maxLabels} max)"
msgstr ""
@@ -10216,10 +10366,10 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
-msgid "CycleAnalytics|Showing data for group '%{groupName}' and %{selectedProjectCount} projects from %{startDate} to %{endDate}"
+msgid "CycleAnalytics|Showing data for group '%{groupName}' and %{selectedProjectCount} projects from %{createdAfter} to %{createdBefore}"
msgstr ""
-msgid "CycleAnalytics|Showing data for group '%{groupName}' from %{startDate} to %{endDate}"
+msgid "CycleAnalytics|Showing data for group '%{groupName}' from %{createdAfter} to %{createdBefore}"
msgstr ""
msgid "CycleAnalytics|Stages"
@@ -10307,7 +10457,7 @@ msgid "DashboardProjects|All"
msgstr ""
msgid "DashboardProjects|Personal"
-msgstr ""
+msgstr "Personal"
msgid "DashboardProjects|Trending"
msgstr ""
@@ -10453,6 +10603,9 @@ msgstr ""
msgid "DastProfiles|Manage profiles"
msgstr ""
+msgid "DastProfiles|Manage site profiles"
+msgstr ""
+
msgid "DastProfiles|Minimum = 0 (no timeout enabled), Maximum = 2880 minutes"
msgstr ""
@@ -10528,6 +10681,9 @@ msgstr ""
msgid "DastProfiles|Scanner name"
msgstr ""
+msgid "DastProfiles|Schedule"
+msgstr ""
+
msgid "DastProfiles|Select branch"
msgstr ""
@@ -10597,8 +10753,8 @@ msgstr ""
msgid "DastProfiles|Website"
msgstr ""
-msgid "DastProfiles|You can either choose a passive scan or validate the target site in your chosen site profile. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
-msgstr "Puteți alege fie o scanare pasivă, fie să validați site-ul țintă în profilul site-ului ales. %{docsLinkStart} Aflați mai multe despre validarea site-ului.%{docsLinkEnd}"
+msgid "DastProfiles|You can either choose a passive scan or validate the target site from the site profile management page. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
+msgstr ""
msgid "DastProfiles|You cannot run an active scan against an unvalidated site."
msgstr "Nu puteți rula o scanare activă pe un site nevalidat."
@@ -10607,7 +10763,7 @@ msgid "DastSiteValidation|Copy HTTP header to clipboard"
msgstr ""
msgid "DastSiteValidation|Copy Meta tag to clipboard"
-msgstr ""
+msgstr "Copiere etichetă Meta la clipboard"
msgid "DastSiteValidation|Could not create validation token. Please try again."
msgstr ""
@@ -10622,7 +10778,7 @@ msgid "DastSiteValidation|Header validation"
msgstr ""
msgid "DastSiteValidation|Meta tag validation"
-msgstr ""
+msgstr "Validare etichetă Meta"
msgid "DastSiteValidation|Retry validation"
msgstr ""
@@ -10637,7 +10793,7 @@ msgid "DastSiteValidation|Step 2 - Add following HTTP header to your site"
msgstr ""
msgid "DastSiteValidation|Step 2 - Add following meta tag to your site"
-msgstr ""
+msgstr "Pasul 2 - Adăugați eticheta meta site-ului dvs."
msgid "DastSiteValidation|Step 2 - Add following text to the target site"
msgstr ""
@@ -10646,7 +10802,7 @@ msgid "DastSiteValidation|Step 3 - Confirm header location and validate"
msgstr ""
msgid "DastSiteValidation|Step 3 - Confirm meta tag location and validate"
-msgstr ""
+msgstr "Pasul 3 - Confirmați locația etichetei meta și validați"
msgid "DastSiteValidation|Step 3 - Confirm text file location and validate"
msgstr ""
@@ -10667,7 +10823,7 @@ msgstr[1] ""
msgstr[2] ""
msgid "DastSiteValidation|To run an active scan, validate your target site. All site profiles that share the same base URL share the same validation status."
-msgstr ""
+msgstr "Pentru a rula o scanare activă, validați-vă site-ul țintă. Toate profilurile site care împărțesc același URL bază împărțesc același status de validare."
msgid "DastSiteValidation|Validate"
msgstr ""
@@ -10754,16 +10910,16 @@ msgid "Day of month"
msgstr ""
msgid "DayTitle|F"
-msgstr ""
+msgstr "F"
msgid "DayTitle|M"
-msgstr ""
+msgstr "M"
msgid "DayTitle|S"
-msgstr ""
+msgstr "S"
msgid "DayTitle|W"
-msgstr ""
+msgstr "W"
msgid "Days"
msgstr ""
@@ -10771,7 +10927,7 @@ msgstr ""
msgid "Days to merge"
msgstr ""
-msgid "Deactivate dormant users after 90 days of inactivity. Users can return to active status by signing in to their account. While inactive, a user is not counted as an active user in the instance."
+msgid "Deactivate dormant users after 90 days of inactivity"
msgstr ""
msgid "Dear Administrator,"
@@ -10858,10 +11014,10 @@ msgstr ""
msgid "Define a custom pattern with cron syntax"
msgstr ""
-msgid "Define approval settings."
+msgid "Define approval rules."
msgstr ""
-msgid "Define approval settings. %{linkStart}Learn more.%{linkEnd}"
+msgid "Define approval rules. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "Define custom rules for what constitutes spam, independent of Akismet"
@@ -10870,7 +11026,7 @@ msgstr ""
msgid "Define environments in the deploy stage(s) in %{code_open}.gitlab-ci.yml%{code_close} to track deployments here."
msgstr ""
-msgid "Define how approval rules are applied as a merge request moves toward completion."
+msgid "Define how approval rules are applied to merge requests."
msgstr ""
msgid "Definition"
@@ -10885,6 +11041,12 @@ msgstr ""
msgid "DelayedJobs|Are you sure you want to run %{job_name} immediately? This job will run automatically after it's timer finishes."
msgstr ""
+msgid "DelayedJobs|Are you sure you want to run %{job_name} immediately? This job will run automatically after its timer finishes."
+msgstr ""
+
+msgid "DelayedJobs|Run the delayed job now?"
+msgstr ""
+
msgid "DelayedJobs|Start now"
msgstr ""
@@ -10892,7 +11054,7 @@ msgid "DelayedJobs|Unschedule"
msgstr ""
msgid "DelayedJobs|delayed"
-msgstr ""
+msgstr "întârziat"
msgid "Delete"
msgstr ""
@@ -10922,13 +11084,13 @@ msgid "Delete badge"
msgstr ""
msgid "Delete column"
-msgstr ""
+msgstr "Eliminare coloană"
msgid "Delete comment"
msgstr ""
msgid "Delete corpus"
-msgstr ""
+msgstr "Eliminare corpus"
msgid "Delete domain"
msgstr ""
@@ -10955,7 +11117,7 @@ msgid "Delete project. Are you ABSOLUTELY SURE?"
msgstr ""
msgid "Delete row"
-msgstr ""
+msgstr "Eliminare rând"
msgid "Delete self monitoring project"
msgstr "Ștergeți proiectul de auto-monitorizare"
@@ -10976,7 +11138,7 @@ msgid "Delete subscription"
msgstr ""
msgid "Delete table"
-msgstr ""
+msgstr "Eliminare tabel"
msgid "Delete this attachment"
msgstr ""
@@ -11162,6 +11324,12 @@ msgid "Dependency proxy feature is limited to public groups for now."
msgstr ""
msgid "Dependency proxy image prefix"
+msgstr "Prefix imagine proxy dependență"
+
+msgid "DependencyProxy|Create a local proxy for storing frequently used upstream images. %{docLinkStart}Learn more%{docLinkEnd} about dependency proxies."
+msgstr ""
+
+msgid "DependencyProxy|Dependency Proxy"
msgstr ""
msgid "DependencyProxy|Toggle Dependency Proxy"
@@ -11213,7 +11381,7 @@ msgid "DeployFreeze|Add deploy freeze"
msgstr ""
msgid "DeployFreeze|Delete"
-msgstr ""
+msgstr "Șterge"
msgid "DeployFreeze|Delete deploy freeze?"
msgstr ""
@@ -11407,6 +11575,9 @@ msgstr ""
msgid "Deployments"
msgstr ""
+msgid "Deployments to Google Kubernetes Engine can be "
+msgstr ""
+
msgid "Deployments|%{deployments} environment impacted."
msgid_plural "Deployments|%{deployments} environments impacted."
msgstr[0] ""
@@ -11437,6 +11608,9 @@ msgstr ""
msgid "Deployment|success"
msgstr ""
+msgid "Deprecated API rate limits"
+msgstr ""
+
msgid "Deprioritize label"
msgstr ""
@@ -11839,6 +12013,18 @@ msgstr ""
msgid "DiffsCompareBaseBranch|(base)"
msgstr ""
+msgid "Diffs|%d addition"
+msgid_plural "Diffs|%d additions"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+msgid "Diffs|%d deletion"
+msgid_plural "Diffs|%d deletions"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
msgid "Diffs|No file name available"
msgstr ""
@@ -11848,9 +12034,18 @@ msgstr ""
msgid "Diffs|Show all unchanged lines"
msgstr ""
+msgid "Diffs|Showing %{dropdownStart}%{count} changed file%{dropdownEnd}"
+msgid_plural "Diffs|Showing %{dropdownStart}%{count} changed files%{dropdownEnd}"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
msgid "Diffs|Something went wrong while fetching diff lines."
msgstr ""
+msgid "Diffs|with %{additions} and %{deletions}"
+msgstr ""
+
msgid "Direct member"
msgstr ""
@@ -11977,9 +12172,6 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
-msgid "Dismiss Value Stream Analytics introduction box"
-msgstr ""
-
msgid "Dismiss merge request promotion"
msgstr ""
@@ -12230,10 +12422,10 @@ msgid "Edit Group Hook"
msgstr ""
msgid "Edit Identity"
-msgstr ""
+msgstr "Editați identitatea"
msgid "Edit Label"
-msgstr ""
+msgstr "Editați eticheta"
msgid "Edit Milestone"
msgstr ""
@@ -12242,7 +12434,7 @@ msgid "Edit Password"
msgstr ""
msgid "Edit Pipeline Schedule %{id}"
-msgstr ""
+msgstr "Editați programarea pipeline-ului %{id}"
msgid "Edit Release"
msgstr ""
@@ -12260,7 +12452,7 @@ msgid "Edit System Hook"
msgstr ""
msgid "Edit application"
-msgstr ""
+msgstr "Editați aplicația"
msgid "Edit comment"
msgstr ""
@@ -12301,6 +12493,9 @@ msgstr ""
msgid "Edit issues"
msgstr ""
+msgid "Edit merge requests"
+msgstr ""
+
msgid "Edit public deploy key"
msgstr ""
@@ -12308,7 +12503,7 @@ msgid "Edit sidebar"
msgstr ""
msgid "Edit table"
-msgstr ""
+msgstr "Editați tabelul"
msgid "Edit this file only."
msgstr ""
@@ -12376,6 +12571,9 @@ msgstr ""
msgid "Elastic|None. Select projects to index."
msgstr ""
+msgid "Eligible users"
+msgstr ""
+
msgid "Email"
msgstr ""
@@ -12386,7 +12584,7 @@ msgid "Email Notification"
msgstr ""
msgid "Email a new %{name} to this project"
-msgstr ""
+msgstr "Trimiteți prin e-mail un nou %{name} la acest proiect"
msgid "Email address to use for Support Desk"
msgstr ""
@@ -12458,7 +12656,7 @@ msgid "EmailParticipantsWarning|and %{moreCount} more"
msgstr ""
msgid "Emails"
-msgstr ""
+msgstr "E-mail-uri"
msgid "Emails sent from Service Desk have this name."
msgstr ""
@@ -12505,9 +12703,12 @@ msgstr ""
msgid "Enable"
msgstr ""
-msgid "Enable Auto DevOps"
+msgid "Enable Amazon EKS integration"
msgstr ""
+msgid "Enable Auto DevOps"
+msgstr "Activați Auto DevOps"
+
msgid "Enable Git pack file bitmap creation"
msgstr ""
@@ -12538,6 +12739,9 @@ msgstr ""
msgid "Enable SSL verification"
msgstr ""
+msgid "Enable Service Ping"
+msgstr ""
+
msgid "Enable Snowplow tracking"
msgstr ""
@@ -12568,6 +12772,9 @@ msgstr ""
msgid "Enable authenticated Git LFS request rate limit"
msgstr ""
+msgid "Enable authenticated web request rate limit"
+msgstr ""
+
msgid "Enable authentication"
msgstr ""
@@ -12628,7 +12835,7 @@ msgstr "Activați e-mailuri multipart"
msgid "Enable or disable the Pseudonymizer data collection."
msgstr ""
-msgid "Enable or disable version check and service ping."
+msgid "Enable or disable version check and Service Ping."
msgstr ""
msgid "Enable protected paths rate limit"
@@ -12640,18 +12847,12 @@ msgstr ""
msgid "Enable reCAPTCHA"
msgstr ""
-msgid "Enable reCAPTCHA for login"
-msgstr ""
-
-msgid "Enable reCAPTCHA, Invisible Captcha, Akismet and set IP limits. For reCAPTCHA, we currently only support %{recaptcha_v2_link_start}v2%{recaptcha_v2_link_end}"
+msgid "Enable reCAPTCHA for login."
msgstr ""
msgid "Enable repository checks"
msgstr "Activați verificările repozitoriului"
-msgid "Enable service ping"
-msgstr ""
-
msgid "Enable shared runners for all projects and subgroups in this group."
msgstr ""
@@ -12673,7 +12874,10 @@ msgstr ""
msgid "Enable unauthenticated API request rate limit"
msgstr ""
-msgid "Enable unauthenticated request rate limit"
+msgid "Enable unauthenticated web request rate limit"
+msgstr ""
+
+msgid "Enable user deactivation emails"
msgstr ""
msgid "Enable version check"
@@ -12709,9 +12913,6 @@ msgstr "Surse de autentificare OAuth activate"
msgid "Enabled sources for code import during project creation. OmniAuth must be configured for GitHub"
msgstr ""
-msgid "Enabling this will only make licensed EE features available to projects if the project namespace's plan includes the feature or if the project is public."
-msgstr ""
-
msgid "Encountered an error while rendering: %{err}"
msgstr ""
@@ -12760,9 +12961,6 @@ msgstr ""
msgid "Enter Admin Mode"
msgstr ""
-msgid "Enter IP address range"
-msgstr ""
-
msgid "Enter a number"
msgstr ""
@@ -12770,14 +12968,11 @@ msgid "Enter an integer number between 0 and 100"
msgstr ""
msgid "Enter an integer number number between 0 and 100"
-msgstr ""
+msgstr "Introduceți un număr întreg între 0 și 100"
msgid "Enter at least three characters to search"
msgstr ""
-msgid "Enter domain"
-msgstr ""
-
msgid "Enter in your Bitbucket Server URL and personal access token below"
msgstr ""
@@ -12824,7 +13019,7 @@ msgid "Enter your password to approve"
msgstr ""
msgid "Enterprise"
-msgstr ""
+msgstr "ÃŽntreprindere"
msgid "Environment"
msgstr ""
@@ -12964,9 +13159,6 @@ msgstr ""
msgid "Environments|Deployment %{status}"
msgstr ""
-msgid "Environments|Dismiss"
-msgstr ""
-
msgid "Environments|Enable review app"
msgstr ""
@@ -12979,9 +13171,6 @@ msgstr ""
msgid "Environments|Environments are places where code gets deployed, such as staging or production."
msgstr ""
-msgid "Environments|Help us improve environments"
-msgstr ""
-
msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
msgstr ""
@@ -12995,7 +13184,7 @@ msgid "Environments|Learn more about stopping environments"
msgstr ""
msgid "Environments|Logs from %{start} to %{end}."
-msgstr ""
+msgstr "Log-uri de la %{start} la %{end}."
msgid "Environments|More information"
msgstr ""
@@ -13010,7 +13199,7 @@ msgid "Environments|No deployments yet"
msgstr ""
msgid "Environments|No pod selected"
-msgstr ""
+msgstr "Niciun pod selectat"
msgid "Environments|No pods to display"
msgstr ""
@@ -13018,6 +13207,9 @@ msgstr ""
msgid "Environments|Note that this action will stop the environment, but it will %{emphasisStart}not%{emphasisEnd} have an effect on any existing deployment due to no “stop environment action†being defined in the %{ciConfigLinkStart}.gitlab-ci.yml%{ciConfigLinkEnd} file."
msgstr ""
+msgid "Environments|Open"
+msgstr ""
+
msgid "Environments|Open live environment"
msgstr ""
@@ -13028,13 +13220,13 @@ msgid "Environments|Re-deploy"
msgstr ""
msgid "Environments|Re-deploy environment %{name}?"
-msgstr ""
+msgstr "Re-implementați mediul %{name}?"
msgid "Environments|Re-deploy to environment"
msgstr ""
msgid "Environments|Rollback"
-msgstr ""
+msgstr "Revenire"
msgid "Environments|Rollback environment"
msgstr ""
@@ -13057,9 +13249,6 @@ msgstr ""
msgid "Environments|Stopping %{environmentName}"
msgstr ""
-msgid "Environments|Take the survey"
-msgstr ""
-
msgid "Environments|There was an error fetching the logs. Please try again."
msgstr ""
@@ -13076,16 +13265,13 @@ msgid "Environments|Upcoming deployment"
msgstr ""
msgid "Environments|Updated"
-msgstr ""
+msgstr "Actualizat"
msgid "Environments|You don't have any environments right now"
msgstr ""
-msgid "Environments|Your feedback helps GitLab make environments better for you and other users. Participate and enter a sweepstake to win a USD 30 gift card."
-msgstr ""
-
msgid "Environments|by %{avatar}"
-msgstr ""
+msgstr "de %{avatar}"
msgid "Environments|protected"
msgstr ""
@@ -13277,7 +13463,7 @@ msgid "Error fetching the dependency list. Please check your network connection
msgstr ""
msgid "Error loading branch data. Please try again."
-msgstr ""
+msgstr "Eroare la încărcarea datelor ramurii. Vă rugăm să încercați din nou."
msgid "Error loading branches."
msgstr ""
@@ -13304,13 +13490,13 @@ msgid "Error loading markdown preview"
msgstr ""
msgid "Error loading merge requests."
-msgstr ""
+msgstr "Eroare la încărcarea merge request-urilor."
msgid "Error loading milestone tab"
msgstr ""
msgid "Error loading project data. Please try again."
-msgstr ""
+msgstr "Eroare la încărcarea datelor proiectului. Vă rugăm să încercați din nou."
msgid "Error loading template types."
msgstr ""
@@ -13366,7 +13552,7 @@ msgstr ""
msgid "Error parsing CSV file. Please make sure it has"
msgstr ""
-msgid "Error rendering markdown preview"
+msgid "Error rendering Markdown preview"
msgstr ""
msgid "Error saving label update."
@@ -13414,6 +13600,9 @@ msgstr ""
msgid "Error: %{error_message}"
msgstr "Eroare: %{error_message}"
+msgid "Error: Couldn't load some or all of the changes."
+msgstr ""
+
msgid "Error: No AWS credentials were supplied"
msgstr ""
@@ -13447,6 +13636,9 @@ msgstr ""
msgid "ErrorTracking|Enable error tracking"
msgstr ""
+msgid "ErrorTracking|Error tracking backend"
+msgstr ""
+
msgid "ErrorTracking|If you self-host Sentry, enter your Sentry instance's full URL. If you use Sentry's hosted solution, enter https://sentry.io"
msgstr ""
@@ -13480,6 +13672,12 @@ msgstr "Politicile de escaladare nu pot avea mai mult de %{rule_count} reguli"
msgid "Escalation policies must have at least one rule"
msgstr ""
+msgid "EscalationPolicies|%{clockIcon} IF alert is not %{alertStatus} in %{minutes}"
+msgstr ""
+
+msgid "EscalationPolicies|%{notificationIcon} THEN %{doAction} %{forScheduleOrUser}"
+msgstr ""
+
msgid "EscalationPolicies|+ Add an additional rule"
msgstr ""
@@ -13522,15 +13720,15 @@ msgstr "Utilizator e-mail"
msgid "EscalationPolicies|Escalation policies"
msgstr ""
+msgid "EscalationPolicies|Escalation policy %{obstacle} in Project %{project}"
+msgstr ""
+
msgid "EscalationPolicies|Escalation rules"
msgstr ""
msgid "EscalationPolicies|Failed to load oncall-schedules"
msgstr ""
-msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} %{then} THEN %{doAction} %{scheduleOrUser}"
-msgstr "DACĂ alerta nu este %{alertStatus} în %{minutes} %{then} ATUNCI %{doAction} %{scheduleOrUser}"
-
msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} minutes"
msgstr ""
@@ -13574,10 +13772,10 @@ msgid "Estimated"
msgstr ""
msgid "EventFilterBy|Filter by all"
-msgstr ""
+msgstr "Filtrați după toate"
msgid "EventFilterBy|Filter by comments"
-msgstr ""
+msgstr "Filtrați după comentarii"
msgid "EventFilterBy|Filter by designs"
msgstr ""
@@ -13589,13 +13787,13 @@ msgid "EventFilterBy|Filter by issue events"
msgstr ""
msgid "EventFilterBy|Filter by merge events"
-msgstr "Filtrați după evenimente de îmbinare"
+msgstr "Filtrați după evenimentele de merge"
msgid "EventFilterBy|Filter by push events"
msgstr ""
msgid "EventFilterBy|Filter by team"
-msgstr ""
+msgstr "Filtrați după echipă"
msgid "EventFilterBy|Filter by wiki"
msgstr ""
@@ -13606,18 +13804,36 @@ msgstr ""
msgid "Every %{action} attempt has failed: %{job_error_message}. Please try again."
msgstr "Toate încercările %{action} au eșuat: %{job_error_message}. Vă rugăm să încercați din nou."
+msgid "Every 3 months"
+msgstr ""
+
+msgid "Every 3 months on the %{day} at %{time} %{timezone}"
+msgstr ""
+
+msgid "Every 6 months"
+msgstr ""
+
+msgid "Every 6 months on the %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Every day"
msgstr ""
msgid "Every day (at %{time})"
msgstr ""
+msgid "Every day at %{time} %{timezone}"
+msgstr ""
+
msgid "Every month"
msgstr ""
msgid "Every month (Day %{day} at %{time})"
msgstr "Fiecare lună (Ziua %{day} la %{time})"
+msgid "Every month on the %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Every three months"
msgstr ""
@@ -13633,6 +13849,15 @@ msgstr[2] ""
msgid "Every week (%{weekday} at %{time})"
msgstr ""
+msgid "Every week on %{day} at %{time} %{timezone}"
+msgstr ""
+
+msgid "Every year"
+msgstr ""
+
+msgid "Every year on %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Everyone"
msgstr ""
@@ -13669,9 +13894,6 @@ msgstr ""
msgid "Exactly one of %{attributes} is required"
msgstr ""
-msgid "Example: %{ip_address}. %{read_more_link}."
-msgstr ""
-
msgid "Example: @sub\\.company\\.com$"
msgstr ""
@@ -13679,7 +13901,7 @@ msgid "Example: Usage = single query. (Requested) / (Capacity) = multiple querie
msgstr ""
msgid "Except policy:"
-msgstr ""
+msgstr "Cu excepția politicii:"
msgid "Exceptions"
msgstr ""
@@ -13738,13 +13960,13 @@ msgstr ""
msgid "Expand pipeline"
msgstr ""
-msgid "Expand sidebar"
+msgid "Expand settings section"
msgstr ""
-msgid "Expected documents: %{expected_documents}"
+msgid "Expand sidebar"
msgstr ""
-msgid "Experienced"
+msgid "Expected documents: %{expected_documents}"
msgstr ""
msgid "ExperimentSubject|Must have exactly one of User, Namespace, or Project."
@@ -13790,13 +14012,13 @@ msgid "Explore Groups"
msgstr ""
msgid "Explore groups"
-msgstr ""
+msgstr "Explorați grupurile"
msgid "Explore projects"
-msgstr ""
+msgstr "Explorați proiectele"
msgid "Explore public groups"
-msgstr ""
+msgstr "Explorați grupurile publice"
msgid "Export"
msgstr ""
@@ -13877,16 +14099,16 @@ msgid "ExternalWikiService|External wiki URL"
msgstr ""
msgid "ExternalWikiService|Link to an external wiki from the sidebar."
-msgstr ""
+msgstr "Link către un wiki extern din bara laterală."
msgid "ExternalWikiService|https://example.com/xxx/wiki/..."
msgstr ""
msgid "Facebook"
-msgstr ""
+msgstr "Facebook"
msgid "Failed"
-msgstr ""
+msgstr "Eșuat(ă)"
msgid "Failed Jobs"
msgstr ""
@@ -13916,7 +14138,7 @@ msgid "Failed to cancel auto stop because you do not have permission to update t
msgstr ""
msgid "Failed to change the owner"
-msgstr ""
+msgstr "Schimbarea proprietarului a eșuat"
msgid "Failed to check related branches."
msgstr ""
@@ -14029,9 +14251,6 @@ msgstr ""
msgid "Failed to load related branches"
msgstr ""
-msgid "Failed to load sidebar lock status"
-msgstr ""
-
msgid "Failed to load stacktrace."
msgstr ""
@@ -14306,7 +14525,7 @@ msgid "FeatureFlags|Name"
msgstr ""
msgid "FeatureFlags|New"
-msgstr ""
+msgstr "Nou"
msgid "FeatureFlags|New Feature Flag"
msgstr ""
@@ -14372,7 +14591,7 @@ msgid "FeatureFlag|Select the environment scope for this feature flag"
msgstr ""
msgid "FeatureFlag|There are no configured user lists"
-msgstr ""
+msgstr "Nu există liste de utilizatori configurate"
msgid "FeatureFlag|Type"
msgstr ""
@@ -14458,6 +14677,9 @@ msgstr ""
msgid "Files"
msgstr "Fișiere"
+msgid "Files API Rate Limits"
+msgstr ""
+
msgid "Files breadcrumb"
msgstr ""
@@ -14471,13 +14693,13 @@ msgid "Fill in the fields below, turn on %{strong_open}Enable SAML authenticatio
msgstr ""
msgid "Filter"
-msgstr ""
+msgstr "Filtru"
msgid "Filter by"
msgstr ""
msgid "Filter by %{issuable_type} that are currently closed."
-msgstr ""
+msgstr "Filtrați după %{issuable_type} care sunt închise în prezent."
msgid "Filter by %{issuable_type} that are currently open."
msgstr ""
@@ -14489,7 +14711,7 @@ msgid "Filter by Git revision"
msgstr ""
msgid "Filter by issues that are currently closed."
-msgstr ""
+msgstr "Filtrați după problemele care sunt închise în prezent."
msgid "Filter by issues that are currently opened."
msgstr ""
@@ -14597,7 +14819,7 @@ msgid "Fixed burndown chart"
msgstr ""
msgid "Fixed date"
-msgstr ""
+msgstr "Dată fixă"
msgid "Fixed due date"
msgstr ""
@@ -14606,7 +14828,7 @@ msgid "Fixed start date"
msgstr ""
msgid "Fixed:"
-msgstr ""
+msgstr "Fixă:"
msgid "Flags"
msgstr ""
@@ -14828,7 +15050,7 @@ msgid "Frequently searched"
msgstr "Căutate frecvent"
msgid "Friday"
-msgstr ""
+msgstr "Vineri"
msgid "From"
msgstr ""
@@ -14846,7 +15068,7 @@ msgid "From merge request merge until deploy to production"
msgstr ""
msgid "Full"
-msgstr ""
+msgstr "Complet"
msgid "Full name"
msgstr ""
@@ -14891,7 +15113,7 @@ msgid "Generate site and private keys at"
msgstr ""
msgid "Generic"
-msgstr ""
+msgstr "Generic"
msgid "Generic package file size in bytes"
msgstr ""
@@ -14906,7 +15128,7 @@ msgid "GenericReport|Diff"
msgstr ""
msgid "Geo"
-msgstr ""
+msgstr "Geo"
msgid "Geo Nodes"
msgstr ""
@@ -14963,7 +15185,7 @@ msgid "Geo|All projects"
msgstr ""
msgid "Geo|All projects are being scheduled for resync"
-msgstr ""
+msgstr "Toate proiectele sunt programate pentru resincronizare"
msgid "Geo|All projects are being scheduled for reverify"
msgstr ""
@@ -15080,7 +15302,7 @@ msgid "Geo|Make everyone on your team more productive regardless of their locati
msgstr ""
msgid "Geo|Never"
-msgstr ""
+msgstr "Niciodată"
msgid "Geo|Next sync scheduled at"
msgstr ""
@@ -15404,7 +15626,7 @@ msgid "GitHubImporter|*Merged by: %{author} at %{timestamp}*"
msgstr ""
msgid "GitLab"
-msgstr ""
+msgstr "GitLab"
msgid "GitLab / Unsubscribe"
msgstr ""
@@ -15457,6 +15679,9 @@ msgstr ""
msgid "GitLab group: %{source_link}"
msgstr ""
+msgid "GitLab informs you if a new version is available."
+msgstr ""
+
msgid "GitLab is a complete DevOps platform, delivered as a single application, fundamentally changing the way Development, Security, and Ops teams collaborate"
msgstr ""
@@ -15472,7 +15697,7 @@ msgstr ""
msgid "GitLab is open source software to collaborate on code."
msgstr ""
-msgid "GitLab is undergoing maintenance and is operating in a read-only mode."
+msgid "GitLab is undergoing maintenance and is operating in read-only mode."
msgstr ""
msgid "GitLab member or Email address"
@@ -15484,9 +15709,6 @@ msgstr ""
msgid "GitLab project export"
msgstr ""
-msgid "GitLab restart is required to apply changes."
-msgstr ""
-
msgid "GitLab single sign-on URL"
msgstr ""
@@ -15502,9 +15724,6 @@ msgstr ""
msgid "GitLab version"
msgstr ""
-msgid "GitLab will inform you if a new version is available."
-msgstr ""
-
msgid "GitLab will run a background job that will produce pseudonymized CSVs of the GitLab database that will be uploaded to your configured object storage directory."
msgstr ""
@@ -15671,7 +15890,7 @@ msgid "Global Search is disabled for this scope"
msgstr ""
msgid "Global Shortcuts"
-msgstr ""
+msgstr "Comenzi rapide globale"
msgid "Global notification settings"
msgstr ""
@@ -15769,9 +15988,21 @@ msgstr ""
msgid "Go to snippets"
msgstr ""
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check 'Allowed domains for sign-ups'."
+msgstr ""
+
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check 'Email restrictions for sign-ups'."
+msgstr ""
+
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check the 'Domain denylist'."
+msgstr ""
+
msgid "Go to the activity feed"
msgstr ""
+msgid "Go to the group’s 'Settings &gt; General' page, and check 'Restrict membership by email domain'."
+msgstr ""
+
msgid "Go to the milestone list"
msgstr ""
@@ -15808,6 +16039,12 @@ msgstr ""
msgid "Goal of the changes and what reviewers should be aware of"
msgstr ""
+msgid "Google Cloud"
+msgstr ""
+
+msgid "Google Cloud offers several deployment targets. Select the one most suitable for your project."
+msgstr ""
+
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
@@ -15815,7 +16052,7 @@ msgid "Got it"
msgstr ""
msgid "Got it!"
-msgstr ""
+msgstr "Am înțeles!"
msgid "Grafana URL"
msgstr ""
@@ -15892,9 +16129,6 @@ msgstr ""
msgid "Group ID"
msgstr ""
-msgid "Group ID: %{group_id}"
-msgstr ""
-
msgid "Group Owner must have signed in with SAML before enabling Group Managed Accounts"
msgstr ""
@@ -16069,6 +16303,12 @@ msgstr ""
msgid "GroupImport|Unable to process group import file"
msgstr ""
+msgid "GroupPage|Copy group ID"
+msgstr ""
+
+msgid "GroupPage|Group ID: %{group_id}"
+msgstr ""
+
msgid "GroupRoadmap|%{dateWord} – No end date"
msgstr ""
@@ -16123,6 +16363,9 @@ msgstr ""
msgid "GroupRoadmap|Within 3 years"
msgstr ""
+msgid "GroupSAML|\"persistent\" recommended"
+msgstr ""
+
msgid "GroupSAML|%{strongOpen}Warning%{strongClose} - Enabling %{linkStart}SSO enforcement%{linkEnd} can reduce security risks."
msgstr ""
@@ -16241,7 +16484,7 @@ msgid "GroupSAML|SHA1 fingerprint of the SAML token signing certificate. Get thi
msgstr ""
msgid "GroupSAML|The SCIM token is now hidden. To see the value of the token again, you need to "
-msgstr ""
+msgstr "Token-ul SCIM este ascuns. Pentru a vedea din nou valoarea tokenului, trebuie să "
msgid "GroupSAML|The case-sensitive group name that will be sent by the SAML identity provider."
msgstr ""
@@ -16255,6 +16498,9 @@ msgstr ""
msgid "GroupSAML|To be able to prohibit outer forks, you first need to enforce dedicate group managed accounts."
msgstr ""
+msgid "GroupSAML|Use SAML group links to manage group membership using SAML."
+msgstr ""
+
msgid "GroupSAML|Valid SAML Response"
msgstr ""
@@ -16267,13 +16513,10 @@ msgstr ""
msgid "GroupSAML|as %{access_level}"
msgstr ""
-msgid "GroupSAML|must match stored NameID of \"%{extern_uid}\" as we use this to identify users. If the NameID changes users will be unable to sign in."
+msgid "GroupSAML|must match stored NameID of \"%{extern_uid}\" to identify user and allow sign in"
msgstr ""
-msgid "GroupSAML|should be \"persistent\""
-msgstr ""
-
-msgid "GroupSAML|should be a random persistent ID, emails are discouraged"
+msgid "GroupSAML|recommend persistent ID instead of email"
msgstr ""
msgid "GroupSelect|No matching results"
@@ -16288,12 +16531,18 @@ msgstr ""
msgid "GroupSettings|Allow project access token creation"
msgstr ""
+msgid "GroupSettings|Applied to all subgroups unless overridden by a group owner. Groups already added to the project lose access."
+msgstr ""
+
msgid "GroupSettings|Auto DevOps pipeline was updated for the group"
msgstr "Pipeline-ul Auto DevOps a fost actualizată pentru grup"
-msgid "GroupSettings|Badges"
+msgid "GroupSettings|Available only on the top-level group. Applies to all subgroups. Groups already shared with a group outside %{group} are still shared unless removed manually."
msgstr ""
+msgid "GroupSettings|Badges"
+msgstr "Insigne"
+
msgid "GroupSettings|Be careful. Changing a group's parent can have unintended %{side_effects_link_start}side effects%{side_effects_link_end}."
msgstr ""
@@ -16322,7 +16571,7 @@ msgid "GroupSettings|Default to Auto DevOps pipeline for all projects within thi
msgstr "Implicit la conducta Auto DevOps pentru toate proiectele din acest grup"
msgid "GroupSettings|Disable email notifications"
-msgstr ""
+msgstr "Dezactivați notificările prin e-mail"
msgid "GroupSettings|Disable group mentions"
msgstr ""
@@ -16342,6 +16591,9 @@ msgstr ""
msgid "GroupSettings|New runners registration token has been generated!"
msgstr ""
+msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgstr ""
+
msgid "GroupSettings|Pipeline settings was updated for the group"
msgstr ""
@@ -16354,12 +16606,15 @@ msgstr ""
msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
-msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups."
+msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups"
msgstr ""
msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
msgstr ""
+msgid "GroupSettings|Prevents group members from being notified if the group is mentioned."
+msgstr ""
+
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
msgstr ""
@@ -16396,21 +16651,6 @@ msgstr ""
msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}."
msgstr ""
-msgid "GroupSettings|This setting is only available on the top-level group and it applies to all subgroups. Groups that have already been shared with a group outside %{group} will still be shared, and this access will have to be revoked manually."
-msgstr ""
-
-msgid "GroupSettings|This setting will be applied to all subgroups unless overridden by a group owner. Groups that already have access to the project will continue to have access unless removed manually."
-msgstr ""
-
-msgid "GroupSettings|This setting will override user notification preferences for all members of the group, subgroups, and projects."
-msgstr ""
-
-msgid "GroupSettings|This setting will prevent group members from being notified if the group is mentioned."
-msgstr ""
-
-msgid "GroupSettings|This setting will prevent group members from forking projects outside of the group."
-msgstr ""
-
msgid "GroupSettings|Transfer group"
msgstr ""
@@ -16439,7 +16679,7 @@ msgid "GroupSettings|remove the share with group lock from %{ancestor_group_name
msgstr ""
msgid "Groups"
-msgstr ""
+msgstr "Grupuri"
msgid "Groups (%{count})"
msgstr ""
@@ -16454,7 +16694,7 @@ msgid "Groups to synchronize"
msgstr ""
msgid "GroupsDropdown|Frequently visited"
-msgstr ""
+msgstr "Frecvent vizitate"
msgid "GroupsDropdown|Groups you visit often will appear here"
msgstr ""
@@ -16528,7 +16768,7 @@ msgstr ""
msgid "GroupsNew|No import options available"
msgstr ""
-msgid "GroupsNew|Not all related objects are migrated, as %{docs_link_start}described here%{docs_link_end}. Please %{feedback_link_start}leave feedback%{feedback_link_end} on this feature."
+msgid "GroupsNew|Not all related objects are migrated. %{docs_link_start}More info%{docs_link_end}."
msgstr ""
msgid "GroupsNew|Personal access token"
@@ -16562,7 +16802,7 @@ msgid "GroupsTree|Failed to leave the group. Please make sure you are not the on
msgstr ""
msgid "GroupsTree|Leave this group"
-msgstr ""
+msgstr "Părăsiți acest grup"
msgid "GroupsTree|Loading groups"
msgstr ""
@@ -16631,7 +16871,7 @@ msgid "Headings"
msgstr ""
msgid "Health"
-msgstr ""
+msgstr "Sănătate"
msgid "Health Check"
msgstr ""
@@ -16660,15 +16900,27 @@ msgstr ""
msgid "Hello %{name},"
msgstr ""
-msgid "Hello there"
-msgstr ""
-
msgid "Hello, %{name}!"
msgstr ""
msgid "Hello, %{username}!"
msgstr ""
+msgid "HelloMessage|%{handshake_emoji} Contribute to GitLab: %{contribute_link}"
+msgstr ""
+
+msgid "HelloMessage|%{magnifier_emoji} Create a new GitLab issue: %{new_issue_link}"
+msgstr ""
+
+msgid "HelloMessage|%{rocket_emoji} We like your curiosity! Help us improve GitLab by joining the team: %{jobs_page_link}"
+msgstr ""
+
+msgid "HelloMessage|Does this page need fixes or improvements? Open an issue or contribute a merge request to help make GitLab more lovable. At GitLab, everyone can contribute!"
+msgstr ""
+
+msgid "HelloMessage|Welcome to GitLab!"
+msgstr ""
+
msgid "Help"
msgstr ""
@@ -16678,13 +16930,10 @@ msgstr ""
msgid "Helps prevent bots from creating accounts."
msgstr ""
-msgid "Helps prevent bots from creating issues"
+msgid "Helps prevent bots from creating issues."
msgstr ""
-msgid "Helps prevent malicious users hide their activity"
-msgstr ""
-
-msgid "Helps reduce request volume (e.g. from crawlers or abusive bots)"
+msgid "Helps prevent malicious users hide their activity."
msgstr ""
msgid "Helps reduce request volume (for example, from crawlers or abusive bots)"
@@ -16743,9 +16992,9 @@ msgstr ""
msgid "Hide value"
msgid_plural "Hide values"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "Ascundeți valoarea"
+msgstr[1] "Ascundeți valorile"
+msgstr[2] "Ascundeți valorile"
msgid "Hide values"
msgstr ""
@@ -16772,7 +17021,7 @@ msgid "HighlightBar|Time to SLA:"
msgstr ""
msgid "History"
-msgstr ""
+msgstr "Istoric"
msgid "History of authentications"
msgstr ""
@@ -16784,7 +17033,7 @@ msgid "Homepage"
msgstr ""
msgid "Hook execution failed. Ensure the group has a project with commits."
-msgstr ""
+msgstr "Execuția hook-ului a eșuat. Asigurați-vă că grupul are un proiect cu commit-uri."
msgid "Hook was successfully created."
msgstr ""
@@ -16810,6 +17059,12 @@ msgstr ""
msgid "Housekeeping, export, path, transfer, remove, archive."
msgstr ""
+msgid "How do I configure Akismet?"
+msgstr ""
+
+msgid "How do I configure it?"
+msgstr ""
+
msgid "How do I configure runners?"
msgstr ""
@@ -16831,19 +17086,25 @@ msgstr ""
msgid "How do I set up this service?"
msgstr ""
+msgid "How do I use a web terminal?"
+msgstr ""
+
+msgid "How do I use file templates?"
+msgstr ""
+
msgid "How it works"
msgstr ""
msgid "How many days need to pass between marking entity for deletion and actual removing it."
msgstr ""
-msgid "How many seconds an IP will be counted towards the limit"
+msgid "How many seconds an IP counts toward the IP address limit."
msgstr ""
-msgid "I accept the %{terms_link}"
+msgid "How the job limiter handles jobs exceeding the thresholds specified below. The 'track' mode only logs the jobs. The 'compress' mode compresses the jobs and raises an exception if the compressed size exceeds the limit."
msgstr ""
-msgid "I accept the|Terms of Service and Privacy Policy"
+msgid "I accept the %{terms_link}"
msgstr ""
msgid "I forgot my password"
@@ -16871,7 +17132,7 @@ msgid "I'm signing up for GitLab because:"
msgstr "Mă înscriu la GitLab pentru că:"
msgid "ID"
-msgstr ""
+msgstr "ID"
msgid "ID:"
msgstr ""
@@ -16927,13 +17188,16 @@ msgstr ""
msgid "IP Address"
msgstr ""
-msgid "IP expiration time"
+msgid "IP address expiration time"
msgstr ""
-msgid "IP subnet restriction only allowed for top-level groups"
+msgid "IP address restrictions"
msgstr ""
-msgid "IPs per user"
+msgid "IP addresses per user"
+msgstr ""
+
+msgid "IP subnet restriction only allowed for top-level groups"
msgstr ""
msgid "Identifier"
@@ -16948,6 +17212,9 @@ msgstr ""
msgid "If any indexed field exceeds this limit it will be truncated to this number of characters and the rest will not be indexed or searchable. This does not apply to repository and wiki indexing. Setting this to 0 means it is unlimited."
msgstr ""
+msgid "If blank, defaults to %{code_open}Retry later%{code_close}."
+msgstr ""
+
msgid "If blank, set allowable lifetime to %{instance_level_policy_in_words}, as defined by the instance admin. Once set, existing tokens for users in this group may be revoked."
msgstr ""
@@ -16999,6 +17266,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 did not initiate these sign-in attempts, please reach out to your administrator or enable two-factor authentication (2FA) on your account."
+msgstr ""
+
msgid "If you did not initiate this change, please contact your administrator immediately."
msgstr ""
@@ -17036,7 +17306,7 @@ msgid "Ignore"
msgstr ""
msgid "Ignored"
-msgstr ""
+msgstr "Ignorat"
msgid "Image URL"
msgstr ""
@@ -17090,12 +17360,12 @@ msgid "Import CSV"
msgstr ""
msgid "Import Projects from Gitea"
-msgstr ""
+msgstr "Importați proiecte din Gitea"
-msgid "Import a project"
+msgid "Import an exported GitLab project"
msgstr ""
-msgid "Import an exported GitLab project"
+msgid "Import and export rate limits"
msgstr ""
msgid "Import failed due to a GitHub error: %{original}"
@@ -17107,12 +17377,18 @@ msgstr ""
msgid "Import from Jira"
msgstr ""
+msgid "Import group"
+msgstr ""
+
msgid "Import group from file"
msgstr ""
msgid "Import groups"
msgstr ""
+msgid "Import history"
+msgstr ""
+
msgid "Import in progress"
msgstr ""
@@ -17162,7 +17438,7 @@ msgid "Import repository"
msgstr ""
msgid "Import requirements"
-msgstr ""
+msgstr "Cerințe de import"
msgid "Import started by: %{importInitiator}"
msgstr ""
@@ -17176,7 +17452,25 @@ msgstr ""
msgid "Import timed out. Import took longer than %{import_jobs_expiration} seconds"
msgstr ""
-msgid "Import/Export Rate Limits"
+msgid "ImportAProjectModal|Import from a project"
+msgstr ""
+
+msgid "ImportAProjectModal|Import members from another project"
+msgstr ""
+
+msgid "ImportAProjectModal|Import project members"
+msgstr ""
+
+msgid "ImportAProjectModal|Only project members (not group members) are imported, and they get the same permissions as the project you import from."
+msgstr ""
+
+msgid "ImportAProjectModal|Successfully imported"
+msgstr ""
+
+msgid "ImportAProjectModal|Unable to import project members"
+msgstr ""
+
+msgid "ImportAProjectModal|You're importing members to the %{strongStart}%{name}%{strongEnd} project."
msgstr ""
msgid "ImportButtons|Connect repositories from"
@@ -17230,8 +17524,8 @@ msgstr[2] ""
msgid "Importing..."
msgstr ""
-msgid "Import|A repository URL usually ends in a .git suffix, although this is not required. Double check to make sure your repository URL is correct."
-msgstr "Un URL repozitoriu se termină de obicei într-un subfix .git, dar acest lucru nu este necesar. Verificați atent pentru a vă asigura că URL-ul repozitoriului dvs. este corect."
+msgid "Import|There is not a valid Git repository at this URL. If your HTTP repository is not publicly accessible, verify your credentials."
+msgstr ""
msgid "Improve customer support with Service Desk"
msgstr ""
@@ -17239,9 +17533,6 @@ msgstr ""
msgid "Improves Git cloning performance."
msgstr "Îmbunătățește performanța de clonare Git."
-msgid "In %{time_to_now}"
-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 ""
@@ -17527,7 +17818,7 @@ msgstr ""
msgid "InProductMarketing|Start a GitLab Ultimate trial today in less than one minute, no credit card required."
msgstr ""
-msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no CC required"
+msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no credit card required"
msgstr ""
msgid "InProductMarketing|Start a trial"
@@ -17566,7 +17857,7 @@ msgstr ""
msgid "InProductMarketing|Team up in GitLab for greater efficiency"
msgstr ""
-msgid "InProductMarketing|Team work makes the dream work"
+msgid "InProductMarketing|Team work makes the dream work"
msgstr ""
msgid "InProductMarketing|Test, create, deploy"
@@ -18017,7 +18308,7 @@ msgid "Insert code"
msgstr ""
msgid "Insert column after"
-msgstr ""
+msgstr "Inserați coloana după"
msgid "Insert column before"
msgstr ""
@@ -18032,7 +18323,7 @@ msgid "Insert link"
msgstr ""
msgid "Insert row after"
-msgstr ""
+msgstr "Inserați rândul după"
msgid "Insert row before"
msgstr ""
@@ -18148,6 +18439,9 @@ msgstr ""
msgid "Integrations|Create new issue in Jira"
msgstr ""
+msgid "Integrations|Create new issue in ZenTao"
+msgstr ""
+
msgid "Integrations|Default settings are inherited from the group level."
msgstr ""
@@ -18241,9 +18535,15 @@ msgstr ""
msgid "Integrations|Search Jira issues"
msgstr ""
+msgid "Integrations|Search ZenTao issues"
+msgstr ""
+
msgid "Integrations|Send notifications about project events to Unify Circuit."
msgstr ""
+msgid "Integrations|Send notifications about project events to a Unify Circuit conversation. %{docs_link}"
+msgstr ""
+
msgid "Integrations|Sign in to add namespaces"
msgstr ""
@@ -18283,6 +18583,9 @@ msgstr ""
msgid "Integrations|You've activated every integration 🎉"
msgstr ""
+msgid "Integrations|ZenTao issues display here when you create issues in your project in ZenTao."
+msgstr ""
+
msgid "Interactive mode"
msgstr ""
@@ -18310,9 +18613,6 @@ msgstr ""
msgid "Interval Pattern"
msgstr ""
-msgid "Introducing Value Stream Analytics"
-msgstr ""
-
msgid "Introducing Your DevOps Report"
msgstr ""
@@ -18409,6 +18709,12 @@ msgstr ""
msgid "Investigate vulnerability: %{title}"
msgstr ""
+msgid "Invisible Captcha"
+msgstr ""
+
+msgid "Invisible Captcha helps prevent the creation of spam accounts. It adds a honeypot field and time-sensitive form submission to the account signup form."
+msgstr ""
+
msgid "Invitation"
msgstr ""
@@ -18695,7 +19001,7 @@ msgid "IssuableStatus|promoted"
msgstr ""
msgid "Issue"
-msgstr ""
+msgstr "Problemă"
msgid "Issue %{issue_reference} has already been added to epic %{epic_reference}."
msgstr ""
@@ -18860,6 +19166,9 @@ msgid "IssueTracker|Use a custom issue tracker that is not in the integration li
msgstr ""
msgid "Issues"
+msgstr "Probleme"
+
+msgid "Issues I've created"
msgstr ""
msgid "Issues Rate Limits"
@@ -18868,6 +19177,9 @@ msgstr ""
msgid "Issues and merge requests"
msgstr ""
+msgid "Issues assigned to me"
+msgstr ""
+
msgid "Issues can be bugs, tasks or ideas to be discussed. Also, issues are searchable and filterable."
msgstr ""
@@ -18979,7 +19291,7 @@ msgstr ""
msgid "Iterations|Create cadence"
msgstr ""
-msgid "Iterations|Create your first iteration"
+msgid "Iterations|Create iteration"
msgstr ""
msgid "Iterations|Delete cadence"
@@ -18988,6 +19300,9 @@ msgstr ""
msgid "Iterations|Delete iteration cadence?"
msgstr ""
+msgid "Iterations|Delete iteration?"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -19021,12 +19336,18 @@ msgstr "Iterație nouă"
msgid "Iterations|New iteration cadence"
msgstr ""
+msgid "Iterations|No closed iterations."
+msgstr ""
+
msgid "Iterations|No iteration cadences to show."
msgstr ""
msgid "Iterations|No iterations in cadence."
msgstr ""
+msgid "Iterations|No open iterations."
+msgstr ""
+
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
@@ -19057,6 +19378,9 @@ msgstr ""
msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
msgstr ""
+msgid "Iterations|This will remove the iteration from any issues that are assigned to it."
+msgstr ""
+
msgid "Iterations|Title"
msgstr ""
@@ -19072,15 +19396,9 @@ msgstr "Datele nu se pot suprapune cu alte iteraÈ›ii în cadenÈ›a acestei iteraÈ
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "I’m familiar with the basics of DevOps."
-msgstr ""
-
msgid "I’m joining my team who’s already on GitLab"
msgstr ""
-msgid "I’m not familiar with the basics of DevOps."
-msgstr ""
-
msgid "Jaeger URL"
msgstr ""
@@ -19345,6 +19663,9 @@ msgstr ""
msgid "Job"
msgstr ""
+msgid "Job %{jobName}"
+msgstr ""
+
msgid "Job Failed #%{build_id}"
msgstr ""
@@ -19385,7 +19706,7 @@ msgid "Job was retried"
msgstr ""
msgid "Jobs"
-msgstr ""
+msgstr "Job-uri"
msgid "Jobs fail if they run longer than the timeout time. Input value is in seconds by default. Human readable input is also accepted, for example %{code_open}1 hour%{code_close}."
msgstr ""
@@ -19481,7 +19802,7 @@ msgid "Job|delayed"
msgstr ""
msgid "Job|for"
-msgstr ""
+msgstr "pentru"
msgid "Job|into"
msgstr ""
@@ -19589,7 +19910,7 @@ msgid "Keys"
msgstr ""
msgid "Ki"
-msgstr ""
+msgstr "Ki"
msgid "Kroki"
msgstr ""
@@ -19655,7 +19976,7 @@ msgid "LDAP uid:"
msgstr ""
msgid "LFS"
-msgstr ""
+msgstr "LFS"
msgid "LFS objects"
msgstr ""
@@ -19670,7 +19991,7 @@ msgid "LICENSE"
msgstr ""
msgid "Label"
-msgstr ""
+msgstr "Etichetă"
msgid "Label actions dropdown"
msgstr ""
@@ -19697,7 +20018,7 @@ msgid "LabelSelect|Labels"
msgstr ""
msgid "Labels"
-msgstr ""
+msgstr "Etichete"
msgid "Labels can be applied to %{features}. Group labels are available for any project within the group."
msgstr ""
@@ -19728,9 +20049,9 @@ msgstr ""
msgid "Last %d day"
msgid_plural "Last %d days"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "Ultima %d zi"
+msgstr[1] "Ultimele %d zile"
+msgstr[2] "Ultimele %d zile"
msgid "Last %{days} days"
msgstr ""
@@ -19769,13 +20090,13 @@ msgid "Last activity"
msgstr ""
msgid "Last commit"
-msgstr ""
+msgstr "Ultimul commit"
msgid "Last contact"
-msgstr ""
+msgstr "Ultimul contact"
msgid "Last edited %{date}"
-msgstr ""
+msgstr "Ultima editare %{date}"
msgid "Last edited by %{link_start}%{avatar} %{name}%{link_end}"
msgstr ""
@@ -19829,7 +20150,7 @@ msgid "Last update attempt"
msgstr ""
msgid "Last updated"
-msgstr ""
+msgstr "Ultima actualizare"
msgid "Last used"
msgstr ""
@@ -19853,7 +20174,7 @@ msgid "LastPushEvent|You pushed to"
msgstr ""
msgid "LastPushEvent|at"
-msgstr ""
+msgstr "la"
msgid "Latest changes"
msgstr ""
@@ -19877,7 +20198,7 @@ msgid "Learn GitLab - Ultimate trial"
msgstr ""
msgid "Learn GitLab|Trial only"
-msgstr ""
+msgstr "Doar evaluare"
msgid "Learn More"
msgstr ""
@@ -19934,10 +20255,7 @@ msgid "Learn more about signing commits"
msgstr ""
msgid "Learn more in the"
-msgstr ""
-
-msgid "Learn more in the|pipeline schedules documentation"
-msgstr ""
+msgstr "Aflați mai multe în"
msgid "Learn more."
msgstr ""
@@ -20050,9 +20368,6 @@ msgstr ""
msgid "Leave Admin Mode"
msgstr ""
-msgid "Leave blank for no limit. Once set, existing personal access tokens may be revoked."
-msgstr ""
-
msgid "Leave edit mode? All unsaved changes will be lost."
msgstr ""
@@ -20060,7 +20375,7 @@ msgid "Leave group"
msgstr ""
msgid "Leave project"
-msgstr ""
+msgstr "Părăsiți proiectul"
msgid "Leave zen mode"
msgstr ""
@@ -20081,7 +20396,7 @@ msgid "Let's talk!"
msgstr ""
msgid "License Compliance"
-msgstr ""
+msgstr "Conformitatea licenței"
msgid "License file"
msgstr ""
@@ -20098,10 +20413,10 @@ msgstr ""
msgid "LicenseCompliance|Acceptable license to be used in the project"
msgstr ""
-msgid "LicenseCompliance|Add a license"
+msgid "LicenseCompliance|Add license and related policy"
msgstr ""
-msgid "LicenseCompliance|Add license and related policy"
+msgid "LicenseCompliance|Add license policy"
msgstr ""
msgid "LicenseCompliance|Allow"
@@ -20197,6 +20512,9 @@ msgstr ""
msgid "LicenseManagement|Uncategorized"
msgstr ""
+msgid "Licensed Enterprise Edition features can be used if the project namespace's plan includes the feature, or if the project is public."
+msgstr ""
+
msgid "Licensed Features"
msgstr ""
@@ -20234,7 +20552,7 @@ msgid "Licenses|Error fetching the license list. Please check your network conne
msgstr ""
msgid "Licenses|License Compliance"
-msgstr ""
+msgstr "Conformitatea licenței"
msgid "Licenses|Name"
msgstr ""
@@ -20263,16 +20581,22 @@ msgstr ""
msgid "Limit namespaces and projects that can be indexed"
msgstr ""
-msgid "Limit sign in from multiple ips"
+msgid "Limit project size at a global, group, and project level. %{link_start}Learn more%{link_end}."
+msgstr ""
+
+msgid "Limit sign in from multiple IP addresses"
msgstr ""
msgid "Limit the number of concurrent operations this secondary site can run in the background."
msgstr ""
msgid "Limit the number of inbound incident management alerts that can be sent to a project."
-msgstr ""
+msgstr "Limitați numărul de alerte de gestionare a incidentelor de intrare ce pot fi trimise unui proiect."
msgid "Limit the number of issues and epics per minute a user can create through web and API requests."
+msgstr "Limitați numărul de probleme și epice pe care un utilizator le poate crea prin cereri API și web pe minut."
+
+msgid "Limit the size of Sidekiq jobs stored in Redis."
msgstr ""
msgid "Limited to showing %d event at most"
@@ -20281,6 +20605,9 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
+msgid "Limiting mode"
+msgstr ""
+
msgid "Line changes"
msgstr ""
@@ -20327,7 +20654,7 @@ msgid "Linked issues"
msgstr ""
msgid "LinkedIn"
-msgstr ""
+msgstr "LinkedIn"
msgid "LinkedIn:"
msgstr ""
@@ -20342,7 +20669,7 @@ msgid "List"
msgstr ""
msgid "List Your Gitea Repositories"
-msgstr ""
+msgstr "Listați repozitoriile dvs. Gitea"
msgid "List available repositories"
msgstr ""
@@ -20350,9 +20677,6 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
-msgid "List of users to be excluded from the limit"
-msgstr ""
-
msgid "List options"
msgstr ""
@@ -20392,9 +20716,6 @@ msgstr ""
msgid "Loading functions timed out. Please reload the page to try again."
msgstr ""
-msgid "Loading issues"
-msgstr ""
-
msgid "Loading more"
msgstr ""
@@ -20483,7 +20804,7 @@ msgid "Low vulnerabilities present"
msgstr ""
msgid "MB"
-msgstr ""
+msgstr "MB"
msgid "MD5"
msgstr ""
@@ -20686,6 +21007,9 @@ msgstr ""
msgid "Marked For Deletion At - %{deletion_time}"
msgstr ""
+msgid "Marked as ready. Merging is now allowed."
+msgstr ""
+
msgid "Marked this %{noun} as a draft."
msgstr ""
@@ -20758,52 +21082,22 @@ msgstr ""
msgid "Max 100,000 events"
msgstr ""
-msgid "Max 20 characters"
-msgstr ""
-
-msgid "Max Group Export Download requests per minute per user"
-msgstr ""
-
-msgid "Max Group Export requests per minute per user"
-msgstr ""
-
-msgid "Max Group Import requests per minute per user"
-msgstr ""
-
-msgid "Max Project Export Download requests per minute per user"
-msgstr "Cereri maxime de descărcare export proiect/minut pe utilizator"
-
-msgid "Max Project Export requests per minute per user"
-msgstr ""
-
-msgid "Max Project Import requests per minute per user"
-msgstr ""
-
-msgid "Max authenticated API requests per period per user"
-msgstr ""
-
msgid "Max authenticated Git LFS requests per period per user"
-msgstr ""
-
-msgid "Max authenticated web requests per period per user"
-msgstr ""
+msgstr "Maximum cereri Git LFS autentificate pe perioadă pe utilizator"
msgid "Max file size is 200 KB."
msgstr ""
-msgid "Max requests per minute per user"
-msgstr ""
-
msgid "Max role"
msgstr ""
msgid "Max session time"
msgstr ""
-msgid "Max unauthenticated requests per period per IP"
+msgid "MaxBuilds"
msgstr ""
-msgid "MaxBuilds"
+msgid "Maximum 20 characters"
msgstr ""
msgid "Maximum Conan package file size in bytes"
@@ -20834,11 +21128,17 @@ msgid "Maximum artifacts size (MB)"
msgstr ""
msgid "Maximum attachment size"
-msgstr ""
+msgstr "Dimensiune maximă atașament"
msgid "Maximum attachment size (MB)"
msgstr ""
+msgid "Maximum authenticated API requests per rate limit period per user"
+msgstr ""
+
+msgid "Maximum authenticated web requests per rate limit period per user"
+msgstr ""
+
msgid "Maximum bulk request size (MiB)"
msgstr ""
@@ -20855,7 +21155,7 @@ msgid "Maximum delay (Minutes)"
msgstr ""
msgid "Maximum diff patch size"
-msgstr ""
+msgstr "Dimensiune maximă patch diff"
msgid "Maximum diff patch size (Bytes)"
msgstr ""
@@ -20870,7 +21170,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_whitelist}."
-msgstr ""
+msgstr "Dimensiunea maximă a fișierului este 1 MB. Dimensiunea imaginii trebuie să fie de 32 x 32 pixeli. Formatele permise de imagine sunt %{favicon_extension_whitelist}."
msgid "Maximum file size is 1MB. Pages are optimized for a 28px tall header logo"
msgstr ""
@@ -20884,14 +21184,23 @@ msgstr ""
msgid "Maximum files in a diff"
msgstr ""
-msgid "Maximum import size"
+msgid "Maximum group export download requests per minute"
+msgstr ""
+
+msgid "Maximum group export requests per minute"
+msgstr ""
+
+msgid "Maximum group import requests per minute"
msgstr ""
+msgid "Maximum import size"
+msgstr "Mărime maximă import"
+
msgid "Maximum import size (MB)"
msgstr ""
msgid "Maximum job artifact size"
-msgstr ""
+msgstr "Mărime maximă artefact job"
msgid "Maximum job timeout"
msgstr ""
@@ -20909,7 +21218,7 @@ msgid "Maximum npm package file size in bytes"
msgstr ""
msgid "Maximum number of %{name} (%{count}) exceeded"
-msgstr ""
+msgstr "Numărul maxim de %{name} (%{count}) a fost depășit"
msgid "Maximum number of comments exceeded"
msgstr ""
@@ -20920,21 +21229,33 @@ msgstr ""
msgid "Maximum number of projects."
msgstr ""
-msgid "Maximum number of unique IPs per user"
+msgid "Maximum number of unique IP addresses per user."
msgstr ""
msgid "Maximum page reached"
msgstr ""
msgid "Maximum page size"
+msgstr "Mărime maximă pagină"
+
+msgid "Maximum project export download requests per minute"
msgstr ""
-msgid "Maximum push size"
+msgid "Maximum project export requests per minute"
msgstr ""
+msgid "Maximum project import requests per minute"
+msgstr ""
+
+msgid "Maximum push size"
+msgstr "Mărime maximă push"
+
msgid "Maximum push size (MB)"
msgstr ""
+msgid "Maximum requests per minute"
+msgstr ""
+
msgid "Maximum running slices"
msgstr ""
@@ -20957,20 +21278,26 @@ msgid "Maximum size of pages (MB)"
msgstr ""
msgid "Maximum snippet size"
-msgstr ""
+msgstr "Mărime maximă fragment de cod"
msgid "Maximum time between updates that a mirror can have when scheduled to synchronize."
msgstr ""
-msgid "Maximum time for web terminal websocket connection (in seconds). 0 for unlimited."
-msgstr ""
-
msgid "Maximum time that users are allowed to skip the setup of two-factor authentication (in hours). Set to 0 (zero) to enforce at next sign in."
msgstr "Timpul maxim în care utilizatorii au permisiunea de a sări peste setarea autentificării prin doi pași (în ore). Setați la 0 (zero) pentru a forța la următoarea conectare."
-msgid "May"
+msgid "Maximum time, in seconds, for a web terminal websocket connection. 0 for unlimited."
+msgstr ""
+
+msgid "Maximum unauthenticated API requests per rate limit period per IP"
+msgstr ""
+
+msgid "Maximum unauthenticated web requests per rate limit period per IP"
msgstr ""
+msgid "May"
+msgstr "Mai"
+
msgid "Mean time to merge"
msgstr ""
@@ -20983,9 +21310,6 @@ msgstr "Timp de expirare mediu"
msgid "Medium vulnerabilities present"
msgstr ""
-msgid "Member lock"
-msgstr ""
-
msgid "Member since"
msgstr ""
@@ -20999,13 +21323,13 @@ msgid "MemberInviteEmail|%{member_name} invited you to join GitLab"
msgstr ""
msgid "MemberInviteEmail|I've invited you to join me in GitLab"
-msgstr ""
+msgstr "V-am invitat să vă alăturați mie în GitLab"
msgid "MemberInviteEmail|Invitation to join the %{project_or_group} %{project_or_group_name}"
msgstr ""
msgid "Members"
-msgstr ""
+msgstr "Membri"
msgid "Members can be added by project %{i_open}Maintainers%{i_close} or %{i_open}Owners%{i_close}"
msgstr ""
@@ -21022,6 +21346,9 @@ msgstr ""
msgid "Members of a group may only view projects they have permission to access"
msgstr ""
+msgid "Membership"
+msgstr ""
+
msgid "Members|%{time} by %{user}"
msgstr ""
@@ -21053,7 +21380,7 @@ msgid "Members|Are you sure you want to remove \"%{groupName}\"?"
msgstr ""
msgid "Members|Are you sure you want to remove %{usersName} from \"%{source}\"?"
-msgstr ""
+msgstr "Sunteți sigur că doriți să eliminați %{usersName} din \"%{source}\"?"
msgid "Members|Are you sure you want to remove this orphaned member from \"%{source}\"?"
msgstr ""
@@ -21082,9 +21409,6 @@ msgstr ""
msgid "Members|Expiration date updated successfully."
msgstr ""
-msgid "Members|Expired"
-msgstr ""
-
msgid "Members|Filter members"
msgstr ""
@@ -21100,9 +21424,6 @@ msgstr ""
msgid "Members|Membership"
msgstr ""
-msgid "Members|No expiration set"
-msgstr ""
-
msgid "Members|Remove \"%{groupName}\""
msgstr ""
@@ -21124,9 +21445,6 @@ msgstr ""
msgid "Members|Search invited"
msgstr ""
-msgid "Members|in %{time}"
-msgstr ""
-
msgid "Member|Deny access"
msgstr ""
@@ -21155,7 +21473,7 @@ msgid "Merge Request Analytics"
msgstr ""
msgid "Merge Requests"
-msgstr ""
+msgstr "Merge Request-uri"
msgid "Merge Requests created"
msgstr ""
@@ -21170,7 +21488,7 @@ msgid "Merge automatically (%{strategy})"
msgstr ""
msgid "Merge blocked: new changes were just added."
-msgstr ""
+msgstr "Îmbinare blocată: tocmai au fost adăugate modificări noi."
msgid "Merge blocked: the source branch must be rebased onto the target branch."
msgstr "Îmbinare blocată: ramura sursă trebuie să fie rebazată pe ramura țintă."
@@ -21197,14 +21515,11 @@ msgid "Merge options"
msgstr ""
msgid "Merge request"
-msgstr ""
+msgstr "Merge request"
msgid "Merge request %{mr_link} was reviewed by %{mr_author}"
msgstr ""
-msgid "Merge request (MR) approvals"
-msgstr ""
-
msgid "Merge request analytics"
msgstr ""
@@ -21224,6 +21539,9 @@ msgid "Merge request was scheduled to merge after pipeline succeeds"
msgstr ""
msgid "Merge requests"
+msgstr "Merge request-uri"
+
+msgid "Merge requests I've created"
msgstr ""
msgid "Merge requests are a place to propose changes you've made to a project and discuss those changes with others"
@@ -21232,6 +21550,12 @@ msgstr ""
msgid "Merge requests are read-only in a secondary Geo node"
msgstr ""
+msgid "Merge requests assigned to me"
+msgstr ""
+
+msgid "Merge requests that I'm a reviewer"
+msgstr ""
+
msgid "Merge the branch and fix any conflicts that come up"
msgstr ""
@@ -21292,10 +21616,10 @@ msgstr ""
msgid "MergeRequests|An error occurred while saving the draft comment."
msgstr ""
-msgid "MergeRequests|Failed to squash. Should be done manually."
+msgid "MergeRequests|Create issue to resolve thread"
msgstr ""
-msgid "MergeRequests|Resolve this thread in a new issue"
+msgid "MergeRequests|Failed to squash. Should be done manually."
msgstr ""
msgid "MergeRequests|Saving the comment failed"
@@ -21440,28 +21764,28 @@ msgid "Metrics and profiling"
msgstr ""
msgid "Metrics::Dashboard::Annotation|Annotation can't belong to both a cluster and an environment at the same time"
-msgstr ""
+msgstr "Anotația nu poate aparține atât unui cluster, cât și unui mediu în același timp"
msgid "Metrics::Dashboard::Annotation|Annotation has not been deleted"
-msgstr ""
+msgstr "Anotația nu a fost ștearsă"
msgid "Metrics::Dashboard::Annotation|Annotation must belong to a cluster or an environment"
-msgstr ""
+msgstr "Anotația trebuie să aparțină unui cluster sau unui mediu"
msgid "Metrics::Dashboard::Annotation|Dashboard with requested path can not be found"
-msgstr ""
+msgstr "Tabloul de bord cu calea solicitată nu poate fi găsit"
msgid "Metrics::Dashboard::Annotation|You are not authorized to create annotation for selected cluster"
-msgstr ""
+msgstr "Nu sunteți autorizat să creați anotații pentru clusterul selectat"
msgid "Metrics::Dashboard::Annotation|You are not authorized to create annotation for selected environment"
-msgstr ""
+msgstr "Nu sunteți autorizat să creați anotații pentru mediul selectat"
msgid "Metrics::Dashboard::Annotation|You are not authorized to delete this annotation"
-msgstr ""
+msgstr "Nu sunteți autorizat să ștergeți această anotație"
msgid "Metrics::Dashboard::Annotation|can't be before starting_at time"
-msgstr ""
+msgstr "nu poate fi înainte de a începe_la ora"
msgid "Metrics::UsersStarredDashboards|Dashboard with requested path can not be found"
msgstr ""
@@ -21596,7 +21920,7 @@ msgid "Metrics|Label of the y-axis (usually the unit). The x-axis always represe
msgstr ""
msgid "Metrics|Legend label (optional)"
-msgstr ""
+msgstr "Etichetă legendă (opțional)"
msgid "Metrics|Link contains an invalid time window, please verify the link to see the requested time range."
msgstr ""
@@ -21740,7 +22064,7 @@ msgid "Metrics|Your dashboard schema is invalid. Edit the dashboard to correct t
msgstr ""
msgid "Metrics|e.g. HTTP requests"
-msgstr ""
+msgstr "ex. Solicitări HTTP"
msgid "Metrics|e.g. Requests/second"
msgstr ""
@@ -21755,7 +22079,7 @@ msgid "Metrics|e.g. req/sec"
msgstr ""
msgid "Mi"
-msgstr ""
+msgstr "Mi"
msgid "Middleman project with Static Site Editor support"
msgstr ""
@@ -22052,13 +22376,13 @@ msgid "More info"
msgstr ""
msgid "More information"
-msgstr ""
+msgstr "Mai multe informatii"
msgid "More information and share feedback"
msgstr ""
msgid "More information is available|here"
-msgstr ""
+msgstr "Mai multe informații sunt disponibile|aici"
msgid "More information."
msgstr ""
@@ -22111,6 +22435,9 @@ msgstr ""
msgid "MoveIssue|Cannot move issue to project it originates from!"
msgstr ""
+msgid "MoveIssue|Cannot move issues of '%{issue_type}' type."
+msgstr ""
+
msgid "Moved issue to %{label} column in the board."
msgstr ""
@@ -22163,7 +22490,7 @@ msgid "Must match with the %{codeStart}external_url%{codeEnd} in %{codeStart}/et
msgstr ""
msgid "Must match with the %{codeStart}geo_node_name%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}. %{linkStart}Learn more%{linkEnd}"
-msgstr ""
+msgstr "Trebuie să se potrivească cu %{codeStart}geo_code_name%{codeEnd} în %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}. %{linkStart}Aflați mai multe%{linkEnd}"
msgid "My Awesome Group"
msgstr ""
@@ -22237,6 +22564,15 @@ 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. To learn more about reducing storage capacity please visit our docs."
msgstr ""
+msgid "NamespaceUserCap|Pending users must be reviewed and approved by a group owner. Learn more about %{user_caps_link_start}User Caps%{link_end} and %{users_pending_approval_link_start}Users Pending Approval%{link_end}."
+msgstr ""
+
+msgid "NamespaceUserCap|View pending user approvals"
+msgstr ""
+
+msgid "NamespaceUserCap|Your group has reached its billable member limit"
+msgstr ""
+
msgid "Namespaces"
msgstr ""
@@ -22279,9 +22615,6 @@ msgstr ""
msgid "Network"
msgstr ""
-msgid "Network Policy|New rule"
-msgstr ""
-
msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is inbound from a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
msgstr ""
@@ -22303,16 +22636,13 @@ msgstr ""
msgid "NetworkPolicies|%{strongOpen}any%{strongClose} port"
msgstr ""
-msgid "NetworkPolicies|+ Add alert"
-msgstr ""
-
msgid "NetworkPolicies|.yaml"
msgstr ""
msgid "NetworkPolicies|.yaml mode"
msgstr ""
-msgid "NetworkPolicies|Actions"
+msgid "NetworkPolicies|Add alert"
msgstr ""
msgid "NetworkPolicies|Alerts are intended to be selectively used for a limited number of events that are potentially concerning and warrant a manual review. Alerts should not be used as a substitute for a SIEM or a logging tool. High volume alerts are likely to be dropped so as to preserve the stability of GitLab's integration with Kubernetes."
@@ -22348,9 +22678,6 @@ msgstr ""
msgid "NetworkPolicies|Deny all traffic"
msgstr ""
-msgid "NetworkPolicies|Description"
-msgstr ""
-
msgid "NetworkPolicies|Edit policy"
msgstr ""
@@ -22363,9 +22690,6 @@ msgstr ""
msgid "NetworkPolicies|IP/subnet"
msgstr ""
-msgid "NetworkPolicies|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
-msgstr ""
-
msgid "NetworkPolicies|Invalid or empty policy"
msgstr ""
@@ -22375,19 +22699,16 @@ msgstr "Tip politică invalid sau nesuportat"
msgid "NetworkPolicies|Kubernetes error: %{error}"
msgstr "Eroare Kubernetes: %{error}"
-msgid "NetworkPolicies|Name"
-msgstr ""
-
msgid "NetworkPolicies|Network"
msgstr ""
-msgid "NetworkPolicies|Network traffic"
+msgid "NetworkPolicies|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
msgstr ""
-msgid "NetworkPolicies|New policy"
+msgid "NetworkPolicies|Network policy can be created after the environment is loaded successfully."
msgstr ""
-msgid "NetworkPolicies|No policies detected"
+msgid "NetworkPolicies|Network traffic"
msgstr ""
msgid "NetworkPolicies|None selected"
@@ -22396,21 +22717,12 @@ msgstr ""
msgid "NetworkPolicies|Please %{installLinkStart}install%{installLinkEnd} and %{configureLinkStart}configure a Kubernetes Agent for this project%{configureLinkEnd} to enable alerts."
msgstr ""
-msgid "NetworkPolicies|Policies are a specification of how groups of pods are allowed to communicate with each other's network endpoints."
-msgstr ""
-
msgid "NetworkPolicies|Policy %{policyName} was successfully changed"
msgstr ""
msgid "NetworkPolicies|Policy definition"
msgstr ""
-msgid "NetworkPolicies|Policy editor"
-msgstr ""
-
-msgid "NetworkPolicies|Policy preview"
-msgstr ""
-
msgid "NetworkPolicies|Rule"
msgstr ""
@@ -22420,9 +22732,6 @@ msgstr ""
msgid "NetworkPolicies|Rule mode is unavailable for this policy. In some cases, we cannot parse the YAML file back into the rules editor."
msgstr ""
-msgid "NetworkPolicies|Rules"
-msgstr ""
-
msgid "NetworkPolicies|Save changes"
msgstr ""
@@ -22435,9 +22744,6 @@ msgstr ""
msgid "NetworkPolicies|Traffic that does not match any rule will be blocked."
msgstr ""
-msgid "NetworkPolicies|Unable to parse policy"
-msgstr ""
-
msgid "NetworkPolicies|all DNS names"
msgstr ""
@@ -22490,10 +22796,10 @@ msgid "NetworkPolicy|Status"
msgstr ""
msgid "Never"
-msgstr ""
+msgstr "Niciodată"
msgid "New"
-msgstr ""
+msgstr "Nou"
msgid "New %{issueType}"
msgstr ""
@@ -22527,9 +22833,9 @@ msgstr ""
msgid "New Issue"
msgid_plural "New Issues"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "Problemă nouă"
+msgstr[1] "Probleme noi"
+msgstr[2] "Probleme noi"
msgid "New Jira import"
msgstr ""
@@ -22571,7 +22877,7 @@ msgid "New branch"
msgstr ""
msgid "New branch unavailable"
-msgstr ""
+msgstr "Noua ramură nu este disponibilă"
msgid "New confidential epic title "
msgstr ""
@@ -22592,13 +22898,13 @@ msgid "New environment"
msgstr ""
msgid "New epic"
-msgstr ""
+msgstr "Epic nou"
msgid "New epic title"
-msgstr ""
+msgstr "Titlu epic nou"
msgid "New file"
-msgstr ""
+msgstr "Fișier nou"
msgid "New group"
msgstr ""
@@ -22616,6 +22922,9 @@ msgid "New identity"
msgstr ""
msgid "New issue"
+msgstr "Problemă nouă"
+
+msgid "New issue in %{project}"
msgstr ""
msgid "New issue title"
@@ -22679,7 +22988,7 @@ msgid "New subgroup"
msgstr ""
msgid "New tag"
-msgstr ""
+msgstr "Etichetă nouă"
msgid "New test case"
msgstr ""
@@ -22696,7 +23005,7 @@ msgstr ""
msgid "Newest first"
msgstr ""
-msgid "Newly registered users will by default be external"
+msgid "Newly-registered users are external by default"
msgstr ""
msgid "Next"
@@ -22757,7 +23066,7 @@ msgid "No approvers"
msgstr "Niciun aprobator"
msgid "No artifacts found"
-msgstr ""
+msgstr "Nu s-au găsit artefacte"
msgid "No assignee"
msgstr ""
@@ -23011,8 +23320,11 @@ msgstr ""
msgid "No webhooks found, add one in the form above."
msgstr ""
-msgid "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} to renew your subscription."
-msgstr ""
+msgid "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} day to renew your subscription."
+msgid_plural "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} days to renew your subscription."
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
msgid "No. of commits"
msgstr ""
@@ -23029,7 +23341,7 @@ msgstr ""
msgid "Nodes"
msgstr ""
-msgid "Non-admin users can sign in with read-only access and make read-only API requests."
+msgid "Non-admin users are restricted to read-only access, in both GitLab UI and API."
msgstr ""
msgid "None"
@@ -23110,7 +23422,7 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
-msgid "Notes Rate Limits"
+msgid "Notes rate limit"
msgstr ""
msgid "Notes|Are you sure you want to cancel creating this comment?"
@@ -23281,9 +23593,6 @@ msgstr ""
msgid "November"
msgstr ""
-msgid "Novice"
-msgstr ""
-
msgid "Now, personalize your GitLab experience"
msgstr ""
@@ -23452,7 +23761,7 @@ msgstr ""
msgid "OnCallSchedules|For this rotation, on-call will be:"
msgstr ""
-msgid "OnCallSchedules|On-call schedule %{schedule} in Project %{project}"
+msgid "OnCallSchedules|On-call schedule %{obstacle} in Project %{project}"
msgstr ""
msgid "OnCallSchedules|On-call schedules"
@@ -23599,22 +23908,22 @@ msgstr ""
msgid "OnDemandScans|Scanner profile"
msgstr ""
+msgid "OnDemandScans|Schedule scan"
+msgstr ""
+
msgid "OnDemandScans|Select one of the existing profiles"
msgstr ""
msgid "OnDemandScans|Site profile"
msgstr ""
-msgid "OnDemandScans|Use existing scanner profile"
+msgid "OnDemandScans|Start time"
msgstr ""
-msgid "OnDemandScans|Use existing site profile"
-msgstr ""
-
-msgid "OnDemandScans|You can either choose a passive scan or validate the target site in your chosen site profile. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
+msgid "OnDemandScans|Use existing scanner profile"
msgstr ""
-msgid "OnDemandScans|You cannot run an active scan against an unvalidated site."
+msgid "OnDemandScans|Use existing site profile"
msgstr ""
msgid "OnDemandScans|You must create a repository within your project to run an on-demand scan."
@@ -23680,6 +23989,9 @@ msgstr "Doar proiectele active sunt afișate în căutare și în panoul de cont
msgid "Only admins can delete project"
msgstr ""
+msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
+msgstr ""
+
msgid "Only include features new to your current subscription tier."
msgstr "Includeți doar funcții noi pentru nivelul abonamentului dvs. curent"
@@ -23698,6 +24010,12 @@ msgstr ""
msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
+msgid "Only reCAPTCHA v2 is supported:"
+msgstr ""
+
+msgid "Only users from the specified IP address ranges are able to reach this group, including all subgroups, projects, and Git repositories."
+msgstr ""
+
msgid "Only verified users with an email address in any of these domains can be added to the group."
msgstr ""
@@ -23738,7 +24056,7 @@ msgid "Open registration is enabled on your instance."
msgstr ""
msgid "Open sidebar"
-msgstr ""
+msgstr "Deschideți bara laterală"
msgid "Open: %{open}"
msgstr ""
@@ -23750,7 +24068,7 @@ msgid "OpenAPI Specification file path or URL"
msgstr ""
msgid "Opened"
-msgstr ""
+msgstr "Deschis"
msgid "Opened MRs"
msgstr ""
@@ -23884,9 +24202,6 @@ msgstr ""
msgid "Package Registry"
msgstr ""
-msgid "Package Registry Rate Limits"
-msgstr ""
-
msgid "Package Registry: authenticated API requests"
msgstr "Registru de pachete: solicitări API autentificate"
@@ -23905,6 +24220,9 @@ msgstr ""
msgid "Package recipe already exists"
msgstr ""
+msgid "Package registry rate limits"
+msgstr ""
+
msgid "Package type"
msgstr ""
@@ -23971,6 +24289,9 @@ msgstr ""
msgid "PackageRegistry|Composer"
msgstr ""
+msgid "PackageRegistry|Composer.json with license: %{license} and version: %{version}"
+msgstr ""
+
msgid "PackageRegistry|Conan"
msgstr ""
@@ -24034,6 +24355,9 @@ msgstr ""
msgid "PackageRegistry|Copy require package include"
msgstr ""
+msgid "PackageRegistry|Copy target SHA"
+msgstr ""
+
msgid "PackageRegistry|Copy yarn command"
msgstr ""
@@ -24100,6 +24424,9 @@ msgstr ""
msgid "PackageRegistry|Install package version"
msgstr ""
+msgid "PackageRegistry|Instance-level"
+msgstr ""
+
msgid "PackageRegistry|Invalid Package: failed metadata extraction"
msgstr ""
@@ -24145,6 +24472,9 @@ msgstr ""
msgid "PackageRegistry|Pip Command"
msgstr ""
+msgid "PackageRegistry|Project-level"
+msgstr ""
+
msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
msgstr ""
@@ -24166,6 +24496,9 @@ msgstr ""
msgid "PackageRegistry|Remove package"
msgstr ""
+msgid "PackageRegistry|Required Python: %{pythonVersion}"
+msgstr ""
+
msgid "PackageRegistry|RubyGems"
msgstr ""
@@ -24208,6 +24541,9 @@ msgstr ""
msgid "PackageRegistry|Source project located at %{link}"
msgstr ""
+msgid "PackageRegistry|Target SHA: %{sha}"
+msgstr ""
+
msgid "PackageRegistry|There are no other versions of this package."
msgstr ""
@@ -24326,7 +24662,7 @@ msgid "Parameter \"job_id\" cannot exceed length of %{job_id_max_size}"
msgstr ""
msgid "Parent"
-msgstr ""
+msgstr "Părinte"
msgid "Parent epic doesn't exist."
msgstr ""
@@ -24376,6 +24712,18 @@ msgstr ""
msgid "Password was successfully updated. Please sign in again."
msgstr ""
+msgid "PasswordPrompt|Confirm password"
+msgstr ""
+
+msgid "PasswordPrompt|Confirm password to continue"
+msgstr ""
+
+msgid "PasswordPrompt|Password is required"
+msgstr ""
+
+msgid "PasswordPrompt|Please enter your password to confirm"
+msgstr ""
+
msgid "Passwords should be unique and not used for any other sites or services."
msgstr ""
@@ -24403,6 +24751,9 @@ msgstr ""
msgid "Paste project path (i.e. gitlab-org/gitlab)"
msgstr "Inserați traiectoria proiectului (i.e. gitlab-org/gitlab)"
+msgid "Paste this DSN into your Sentry SDK"
+msgstr ""
+
msgid "Paste your public SSH key, which is usually contained in the file '~/.ssh/id_ed25519.pub' or '~/.ssh/id_rsa.pub' and begins with 'ssh-ed25519' or 'ssh-rsa'. Do not paste your private SSH key, as that can compromise your identity."
msgstr ""
@@ -24487,6 +24838,9 @@ msgstr ""
msgid "PerformanceBar|First Contentful Paint"
msgstr ""
+msgid "PerformanceBar|Flamegraph with mode:"
+msgstr ""
+
msgid "PerformanceBar|Frontend resources"
msgstr ""
@@ -24520,6 +24874,15 @@ msgstr ""
msgid "PerformanceBar|Trace"
msgstr ""
+msgid "PerformanceBar|cpu"
+msgstr ""
+
+msgid "PerformanceBar|object"
+msgstr ""
+
+msgid "PerformanceBar|wall"
+msgstr ""
+
msgid "Period in seconds"
msgstr "Perioadă în secunde"
@@ -24748,6 +25111,48 @@ msgstr ""
msgid "PipelineSchedules|Variables"
msgstr ""
+msgid "PipelineSource|API"
+msgstr ""
+
+msgid "PipelineSource|Chat"
+msgstr ""
+
+msgid "PipelineSource|External"
+msgstr ""
+
+msgid "PipelineSource|External Pull Request"
+msgstr ""
+
+msgid "PipelineSource|Merge Request"
+msgstr ""
+
+msgid "PipelineSource|On-Demand DAST Scan"
+msgstr ""
+
+msgid "PipelineSource|On-Demand DAST Validation"
+msgstr ""
+
+msgid "PipelineSource|Parent Pipeline"
+msgstr ""
+
+msgid "PipelineSource|Pipeline"
+msgstr ""
+
+msgid "PipelineSource|Push"
+msgstr ""
+
+msgid "PipelineSource|Schedule"
+msgstr ""
+
+msgid "PipelineSource|Trigger"
+msgstr ""
+
+msgid "PipelineSource|Web"
+msgstr ""
+
+msgid "PipelineSource|Web IDE"
+msgstr ""
+
msgid "PipelineStatusTooltip|Pipeline: %{ciStatus}"
msgstr ""
@@ -25046,48 +25451,9 @@ msgid "Pipeline|Skipped"
msgstr ""
msgid "Pipeline|Source"
-msgstr ""
-
-msgid "Pipeline|Source|API"
-msgstr ""
-
-msgid "Pipeline|Source|Chat"
-msgstr ""
-
-msgid "Pipeline|Source|External"
-msgstr ""
-
-msgid "Pipeline|Source|External Pull Request"
-msgstr ""
-
-msgid "Pipeline|Source|Merge Request"
-msgstr ""
-
-msgid "Pipeline|Source|On-Demand DAST Scan"
-msgstr ""
-
-msgid "Pipeline|Source|On-Demand DAST Validation"
-msgstr ""
-
-msgid "Pipeline|Source|Parent Pipeline"
-msgstr ""
-
-msgid "Pipeline|Source|Pipeline"
-msgstr ""
-
-msgid "Pipeline|Source|Push"
-msgstr ""
-
-msgid "Pipeline|Source|Schedule"
-msgstr ""
+msgstr "Sursa"
-msgid "Pipeline|Source|Trigger"
-msgstr ""
-
-msgid "Pipeline|Source|Web"
-msgstr ""
-
-msgid "Pipeline|Source|Web IDE"
+msgid "Pipeline|Source|Security Policy"
msgstr ""
msgid "Pipeline|Specify variable values to be used in this run. The values specified in %{linkStart}CI/CD settings%{linkEnd} will be used by default."
@@ -25138,7 +25504,7 @@ msgstr ""
msgid "Pipeline|We are currently unable to fetch pipeline data"
msgstr ""
-msgid "Pipeline|You’re about to stop pipeline %{pipelineId}."
+msgid "Pipeline|You’re about to stop pipeline #%{pipelineId}."
msgstr ""
msgid "Pipeline|for"
@@ -25165,6 +25531,9 @@ msgstr ""
msgid "Plain diff"
msgstr ""
+msgid "Plain-text response to send to clients that hit a rate limit"
+msgstr ""
+
msgid "Plan:"
msgstr ""
@@ -25309,9 +25678,6 @@ msgstr ""
msgid "Please provide attributes to update"
msgstr ""
-msgid "Please provide your username or email address."
-msgstr ""
-
msgid "Please reach out if you have any questions and we'll be happy to assist."
msgstr ""
@@ -25354,9 +25720,6 @@ msgstr ""
msgid "Please set a new password before proceeding."
msgstr ""
-msgid "Please share your feedback about %{featureName} %{linkStart}in this issue%{linkEnd} to help us improve the experience."
-msgstr ""
-
msgid "Please solve the captcha"
msgstr ""
@@ -25534,6 +25897,9 @@ msgstr ""
msgid "Prevent adding new members to project membership within this group"
msgstr ""
+msgid "Prevent auto-stopping"
+msgstr ""
+
msgid "Prevent editing approval rules in projects and merge requests."
msgstr ""
@@ -25546,7 +25912,7 @@ msgstr ""
msgid "Prevent users from changing their profile name"
msgstr ""
-msgid "Prevent users from performing write operations on GitLab while performing maintenance."
+msgid "Prevent users from performing write operations while GitLab maintenance is in progress."
msgstr ""
msgid "Preview"
@@ -25703,7 +26069,7 @@ msgid "ProfileSession|on"
msgstr ""
msgid "Profiles| You are about to permanently delete %{yourAccount}, and all of the issues, merge requests, and groups linked to your account. Once you confirm %{deleteAccount}, it cannot be undone or recovered."
-msgstr ""
+msgstr "Sunteți pe cale să ștergeți definitiv %{yourAccount} și toate problemele, merge request-urile și grupurile legate la contul dvs. Odată ce confirmați %{deleteAccount}, acesta nu se mai poate anula sau recupera."
msgid "Profiles| You are going to change the username %{currentUsernameBold} to %{newUsernameBold}. Profile and projects will be redirected to the %{newUsername} namespace but this redirect will expire once the %{currentUsername} namespace is registered by another user or group. Please update your Git repository remotes as soon as possible."
msgstr ""
@@ -25819,6 +26185,9 @@ msgstr ""
msgid "Profiles|Enter your name, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Enter your password to confirm the email change"
+msgstr ""
+
msgid "Profiles|Enter your pronouns to let people know how to refer to you"
msgstr ""
@@ -26053,10 +26422,10 @@ msgstr ""
msgid "Profiles|e.g. My MacBook key"
msgstr ""
-msgid "Profiles|username"
+msgid "Profiles|https://website.com"
msgstr ""
-msgid "Profiles|website.com"
+msgid "Profiles|username"
msgstr ""
msgid "Profiles|your account"
@@ -26276,7 +26645,7 @@ msgid "ProjectOverview|Star"
msgstr ""
msgid "ProjectOverview|Starrer"
-msgstr ""
+msgstr "Starrer"
msgid "ProjectOverview|Starrers"
msgstr ""
@@ -26299,9 +26668,21 @@ msgstr ""
msgid "ProjectSelect| or group"
msgstr ""
+msgid "ProjectSelect|No matching results"
+msgstr ""
+
msgid "ProjectSelect|Search for project"
msgstr ""
+msgid "ProjectSelect|Search projects"
+msgstr ""
+
+msgid "ProjectSelect|Select a project"
+msgstr ""
+
+msgid "ProjectSelect|There was an error fetching the projects. Please try again."
+msgstr ""
+
msgid "ProjectService|Drone server URL"
msgstr ""
@@ -26389,6 +26770,9 @@ msgstr "Declanșați evenimentul atunci când un merge request este creat, actua
msgid "ProjectService|Trigger event when a new, unique alert is recorded."
msgstr ""
+msgid "ProjectService|Trigger event when a new, unique vulnerability is recorded. (Note: This feature requires an Ultimate plan.)"
+msgstr ""
+
msgid "ProjectService|Trigger event when a pipeline status changes."
msgstr ""
@@ -26803,9 +27187,15 @@ msgstr ""
msgid "Projects are graded based on the highest severity vulnerability present"
msgstr ""
+msgid "Projects are organized into groups"
+msgstr ""
+
msgid "Projects contributed to"
msgstr ""
+msgid "Projects help you organize your work. They contain your file repository, issues, merge requests, and so much more."
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr ""
@@ -27040,10 +27430,10 @@ msgstr ""
msgid "PrometheusService|Prometheus cluster integration"
msgstr ""
-msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
+msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
msgstr ""
-msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
+msgid "PrometheusService|The ID of the IAP-secured resource."
msgstr ""
msgid "PrometheusService|The Prometheus API base URL."
@@ -27661,6 +28051,9 @@ msgstr "Limite frecvență"
msgid "Rate limit"
msgstr "Limită frecvență"
+msgid "Rate limits can help reduce request volume (like from crawlers or abusive bots)."
+msgstr ""
+
msgid "Raw blob request rate limit per minute"
msgstr ""
@@ -27673,6 +28066,9 @@ msgstr ""
msgid "Re-authentication required"
msgstr ""
+msgid "Re-import"
+msgstr ""
+
msgid "Re-request review"
msgstr ""
@@ -27694,6 +28090,9 @@ msgstr ""
msgid "Read more about related issues"
msgstr ""
+msgid "Read their documentation."
+msgstr ""
+
msgid "Ready to get started with GitLab? Follow these steps to set up your workspace, plan and commit changes, and deploy your project."
msgstr ""
@@ -27727,6 +28126,9 @@ msgstr ""
msgid "Receive any notifications from GitLab."
msgstr "Primiți orice notificare de la GitLab."
+msgid "Receive notification of abuse reports by email."
+msgstr ""
+
msgid "Receive notifications about your own activity"
msgstr ""
@@ -27871,9 +28273,6 @@ msgstr ""
msgid "Registry setup"
msgstr ""
-msgid "Regulate approvals by authors/committers. Affects all projects."
-msgstr ""
-
msgid "Reindexing Status: %{status} (Slice multiplier: %{multiplier}, Maximum running slices: %{max_slices})"
msgstr ""
@@ -27970,6 +28369,9 @@ msgstr ""
msgid "Release|Something went wrong while saving the release details."
msgstr ""
+msgid "Reload page"
+msgstr ""
+
msgid "Remediations"
msgstr ""
@@ -28252,6 +28654,9 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
+msgid "Repeats"
+msgstr ""
+
msgid "Replace"
msgstr ""
@@ -28618,10 +29023,7 @@ msgstr ""
msgid "Require additional authentication for administrative tasks."
msgstr "Necesită autentificare suplimentară pentru sarcini administrative."
-msgid "Require all users in this group to setup Two-factor authentication"
-msgstr ""
-
-msgid "Require all users in this group to setup two-factor authentication"
+msgid "Require all users in this group to set up two-factor authentication"
msgstr ""
msgid "Required approvals (%{approvals_given} given)"
@@ -28669,6 +29071,9 @@ msgstr[2] ""
msgid "Requires values to meet regular expression requirements."
msgstr ""
+msgid "Requires you to deploy or set up cloud-hosted Sentry."
+msgstr ""
+
msgid "Requires your primary GitLab email address."
msgstr ""
@@ -28729,9 +29134,6 @@ msgstr ""
msgid "Resolve"
msgstr ""
-msgid "Resolve all threads in new issue"
-msgstr ""
-
msgid "Resolve conflicts"
msgstr ""
@@ -28789,6 +29191,9 @@ msgstr ""
msgid "Response text"
msgstr ""
+msgid "Restart GitLab to apply changes."
+msgstr ""
+
msgid "Restart Terminal"
msgstr ""
@@ -28807,6 +29212,9 @@ msgstr ""
msgid "Restoring the project will prevent the project from being removed on this date and restore people's ability to make changes to it."
msgstr ""
+msgid "Restrict group access by IP address. %{link_start}Learn more%{link_end}."
+msgstr ""
+
msgid "Restrict membership by email domain"
msgstr ""
@@ -29122,6 +29530,9 @@ msgstr ""
msgid "Runners|Runner #%{runner_id}"
msgstr ""
+msgid "Runners|Runner assigned to project."
+msgstr ""
+
msgid "Runners|Runner is offline, last contact was %{runner_contact} ago"
msgstr ""
@@ -29134,6 +29545,9 @@ msgstr ""
msgid "Runners|Runner registration"
msgstr ""
+msgid "Runners|Runner unassigned from project."
+msgstr ""
+
msgid "Runners|Runners"
msgstr "Executori"
@@ -29326,8 +29740,8 @@ msgstr "GitLab vă poate scana codul pentru vulnerabilități de securitate. Tes
msgid "SastEntryPoints|How do I set up SAST?"
msgstr "Cum setez SAST?"
-msgid "SastEntryPoints|Learn more."
-msgstr "Aflați mai multe."
+msgid "SastEntryPoints|Learn more"
+msgstr ""
msgid "Satisfied"
msgstr ""
@@ -29368,7 +29782,7 @@ msgstr ""
msgid "Save pipeline schedule"
msgstr ""
-msgid "Save space and find images in the container Registry. remove unneeded tags and keep only the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
+msgid "Save storage space by automatically deleting tags from the container registry and keeping the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
msgstr ""
msgid "Saving"
@@ -29542,6 +29956,9 @@ msgstr ""
msgid "Search or filter results…"
msgstr ""
+msgid "Search or jump to..."
+msgstr ""
+
msgid "Search project"
msgstr ""
@@ -29602,16 +30019,16 @@ msgstr ""
msgid "SearchCodeResults|of %{link_to_project}"
msgstr ""
-msgid "SearchResults|Showing %{count} %{scope} for%{term_element}"
+msgid "SearchResults|Showing %{count} %{scope} for %{term_element}"
msgstr ""
-msgid "SearchResults|Showing %{count} %{scope} for%{term_element} in your personal and project snippets"
+msgid "SearchResults|Showing %{count} %{scope} for %{term_element} in your personal and project snippets"
msgstr ""
-msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for%{term_element}"
+msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for %{term_element}"
msgstr ""
-msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for%{term_element} in your personal and project snippets"
+msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for %{term_element} in your personal and project snippets"
msgstr ""
msgid "SearchResults|code result"
@@ -29704,6 +30121,9 @@ msgstr ""
msgid "Secret Detection"
msgstr ""
+msgid "Secret access key"
+msgstr ""
+
msgid "Secret token"
msgstr ""
@@ -29743,9 +30163,6 @@ msgstr "O aprobare de cerere de îmbinare este necesară când acoperirea testul
msgid "SecurityApprovals|A merge request approval is required when the license compliance report contains a denied license."
msgstr "O aprobare de cerere de îmbinare este necesară când raportul de conformitate a licenței conține o licență refuzată."
-msgid "SecurityApprovals|Configurable if security scanners are enabled. %{linkStart}Learn more.%{linkEnd}"
-msgstr ""
-
msgid "SecurityApprovals|Coverage-Check"
msgstr "Verificarea acoperirii"
@@ -29758,24 +30175,18 @@ msgstr "Aflați mai multe despre verificarea licenței"
msgid "SecurityApprovals|Learn more about Vulnerability-Check"
msgstr "Aflați mai multe despre verificarea vulnerabilităților"
-msgid "SecurityApprovals|License Scanning must be enabled. %{linkStart}Learn more%{linkEnd}."
-msgstr ""
-
msgid "SecurityApprovals|License-Check"
msgstr "Verificarea licenței"
msgid "SecurityApprovals|Requires approval for Denied licenses. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}More information%{linkEnd}"
-msgstr "Aprobare necesară pentru scăderi în acoperirea testului. %{linkStart}Mai multe informații%{linkEnd}"
+msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
msgid "SecurityApprovals|Requires approval for vulnerabilities. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
-msgid "SecurityApprovals|Test coverage must be enabled. %{linkStart}Learn more%{linkEnd}."
-msgstr "Acoperirea testului trebuie să fie activată. %{linkStart}Aflați mai multe.%{linkEnd}"
-
msgid "SecurityApprovals|Vulnerability-Check"
msgstr "Verificarea vulnerabilității"
@@ -29839,6 +30250,12 @@ msgstr "Statistici vulnerabilități nivel-înalt de-a lungul proiectelor și gr
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 "Începeți imediat analiza riscului și remedierea cu funcții de securitate aplicație. Începeți cu SAST și Detecție Secretă, disponibile pentru toate planurile. Faceți upgrade la Ultimate pentru a primi funcționalitate integrală, incluzând:"
+msgid "SecurityConfiguration|Manage corpus"
+msgstr ""
+
+msgid "SecurityConfiguration|Manage corpus files used as mutation sources in coverage fuzzing."
+msgstr ""
+
msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
msgstr ""
@@ -29885,25 +30302,31 @@ msgid "SecurityConfiguration|Vulnerability details and statistics in the merge r
msgstr "Detalii vulnerabilitate și statistici în cererea de îmbinare"
msgid "SecurityOrchestration|%{branches} %{plural}"
-msgstr ""
+msgstr "%{branches}%{plural}"
msgid "SecurityOrchestration|%{branches} and %{lastBranch} %{plural}"
-msgstr ""
+msgstr "%{branches} și %{lastBranch}%{plural}"
msgid "SecurityOrchestration|Action"
+msgstr "Acțiune"
+
+msgid "SecurityOrchestration|Actions"
msgstr ""
-msgid "SecurityOrchestration|All policies"
+msgid "SecurityOrchestration|Add rule"
msgstr ""
+msgid "SecurityOrchestration|All policies"
+msgstr "Toate politicile"
+
msgid "SecurityOrchestration|An error occurred assigning your security policy project"
msgstr "A apărut o eroare la desemnarea proiectului dvs. al politicii de securitate"
msgid "SecurityOrchestration|Description"
-msgstr ""
+msgstr "Descriere"
msgid "SecurityOrchestration|Edit policy"
-msgstr ""
+msgstr "Editați politica"
msgid "SecurityOrchestration|Edit policy project"
msgstr ""
@@ -29921,36 +30344,39 @@ msgid "SecurityOrchestration|If you are using Auto DevOps, your %{monospacedStar
msgstr ""
msgid "SecurityOrchestration|Latest scan"
-msgstr ""
+msgstr "Ultima scanare"
msgid "SecurityOrchestration|Network"
-msgstr ""
-
-msgid "SecurityOrchestration|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
-msgstr ""
+msgstr "Rețea"
msgid "SecurityOrchestration|New policy"
-msgstr ""
+msgstr "Politică nouă"
msgid "SecurityOrchestration|Only owners can update Security Policy Project"
msgstr "Doar proprietarii pot actualiza Proiectul Politicii de Securitate"
msgid "SecurityOrchestration|Policies"
-msgstr ""
+msgstr "Politici"
msgid "SecurityOrchestration|Policy description"
-msgstr ""
+msgstr "Descrierea politicii"
msgid "SecurityOrchestration|Policy editor"
msgstr ""
+msgid "SecurityOrchestration|Policy preview"
+msgstr ""
+
msgid "SecurityOrchestration|Policy status"
msgstr ""
msgid "SecurityOrchestration|Policy type"
-msgstr ""
+msgstr "Tip politică"
msgid "SecurityOrchestration|Rule"
+msgstr "Regulă"
+
+msgid "SecurityOrchestration|Rules"
msgstr ""
msgid "SecurityOrchestration|Scan Execution"
@@ -29975,7 +30401,7 @@ msgid "SecurityOrchestration|Select security project"
msgstr "Selectați proiect de securitate"
msgid "SecurityOrchestration|Sorry, your filter produced no results."
-msgstr ""
+msgstr "Ne pare rău, filtrul dvs. nu a produs rezultate"
msgid "SecurityOrchestration|There was a problem creating the new security policy"
msgstr ""
@@ -30046,6 +30472,9 @@ msgstr ""
msgid "SecurityReports|Create issue"
msgstr ""
+msgid "SecurityReports|Development vulnerabilities"
+msgstr ""
+
msgid "SecurityReports|Dismiss vulnerability"
msgstr ""
@@ -30061,6 +30490,9 @@ msgstr ""
msgid "SecurityReports|Download results"
msgstr ""
+msgid "SecurityReports|Download scanned URLs"
+msgstr ""
+
msgid "SecurityReports|Download scanned resources"
msgstr ""
@@ -30184,6 +30616,9 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
+msgid "SecurityReports|The Vulnerability Report shows the results of the lastest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "SecurityReports|The security reports below contain one or more vulnerability findings that could not be parsed and were not recorded. Download the artifacts in the job output to investigate. Ensure any security report created conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
msgstr ""
@@ -30325,10 +30760,10 @@ msgstr ""
msgid "Select a repository"
msgstr ""
-msgid "Select a role"
+msgid "Select a repository containing templates for common files."
msgstr ""
-msgid "Select a shared template repository for all projects on this instance."
+msgid "Select a role"
msgstr ""
msgid "Select a template repository"
@@ -30406,6 +30841,9 @@ msgstr ""
msgid "Select project to choose zone"
msgstr ""
+msgid "Select project to create issue"
+msgstr ""
+
msgid "Select projects"
msgstr ""
@@ -30523,6 +30961,9 @@ msgstr ""
msgid "Send emails to help guide new users through the onboarding process."
msgstr "Trimiteți e-mailuri pentru a ghida utilizatorii noi prin procesul de integrare."
+msgid "Send emails to users upon account deactivation."
+msgstr ""
+
msgid "Send message"
msgstr ""
@@ -30541,6 +30982,9 @@ msgstr ""
msgid "Send service data"
msgstr ""
+msgid "Sentry"
+msgstr ""
+
msgid "Sentry API URL"
msgstr ""
@@ -30655,6 +31099,9 @@ msgstr ""
msgid "Service"
msgstr ""
+msgid "Service Accounts keys are required to authorize GitLab to deploy your Google Cloud project."
+msgstr ""
+
msgid "Service Desk"
msgstr ""
@@ -30727,15 +31174,15 @@ msgstr ""
msgid "Set a password on your account to pull or push via %{protocol}."
msgstr ""
-msgid "Set a template repository for projects in this group"
-msgstr ""
-
msgid "Set access permissions for this token."
msgstr ""
msgid "Set an instance-wide domain that will be available to all clusters when installing Knative."
msgstr ""
+msgid "Set any rate limit to %{code_open}0%{code_close} to disable the limit."
+msgstr ""
+
msgid "Set default and restrict visibility levels. Configure import sources and git access protocol."
msgstr ""
@@ -30748,7 +31195,7 @@ msgstr ""
msgid "Set limit to 0 to allow any file size."
msgstr ""
-msgid "Set max session time for web terminal."
+msgid "Set limits for web and API requests."
msgstr ""
msgid "Set milestone"
@@ -30757,15 +31204,18 @@ msgstr ""
msgid "Set new password"
msgstr ""
-msgid "Set notification email for abuse reports."
+msgid "Set parent epic to an epic"
msgstr ""
-msgid "Set parent epic to an epic"
+msgid "Set per-user rate limits for imports and exports of projects and groups."
msgstr ""
msgid "Set projects and maximum size limits, session duration, user options, and check feature availability for namespace plan."
msgstr ""
+msgid "Set rate limits for package registry API requests that supersede the general user and IP rate limits."
+msgstr ""
+
msgid "Set severity"
msgstr ""
@@ -30784,15 +31234,24 @@ msgstr ""
msgid "Set the default branch for this project. All merge requests and commits are made against this branch unless you specify a different one."
msgstr ""
+msgid "Set the default expiration time for job artifacts in all projects. Set to %{code_open}0%{code_close} to never expire artifacts by default. If no unit is written, it defaults to seconds. For example, these are all equivalent: %{code_open}3600%{code_close}, %{code_open}60 minutes%{code_close}, or %{code_open}one hour%{code_close}."
+msgstr ""
+
msgid "Set the due date to %{due_date}."
msgstr ""
msgid "Set the iteration to %{iteration_reference}."
msgstr ""
+msgid "Set the maximum session time for a web terminal."
+msgstr ""
+
msgid "Set the milestone to %{milestone_reference}."
msgstr ""
+msgid "Set the per-user rate limit for notes created by web or API requests."
+msgstr ""
+
msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
msgstr ""
@@ -30994,6 +31453,9 @@ msgstr ""
msgid "Show Pipeline IID"
msgstr ""
+msgid "Show all %{issuable_type}."
+msgstr ""
+
msgid "Show all activity"
msgstr ""
@@ -31045,15 +31507,9 @@ msgstr ""
msgid "Show list"
msgstr ""
-msgid "Show me advanced features"
-msgstr ""
-
msgid "Show me how to add a pipeline"
msgstr ""
-msgid "Show me the basics"
-msgstr ""
-
msgid "Show one file at a time"
msgstr ""
@@ -31096,15 +31552,15 @@ msgstr ""
msgid "Showing %{pageSize} of %{total} %{issuableType}"
msgstr ""
-msgid "Showing %{pageSize} of %{total} issues"
-msgstr ""
-
msgid "Showing all epics"
msgstr ""
msgid "Showing all issues"
msgstr ""
+msgid "Showing data for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
+msgstr ""
+
msgid "Showing data for workflow items created in this date range. Date range cannot exceed %{maxDateRange} days."
msgstr ""
@@ -31144,6 +31600,15 @@ msgstr ""
msgid "Sidebar|Weight"
msgstr ""
+msgid "Sidekiq job compression threshold (bytes)"
+msgstr ""
+
+msgid "Sidekiq job size limit (bytes)"
+msgstr ""
+
+msgid "Sidekiq job size limits"
+msgstr ""
+
msgid "Sign in"
msgstr ""
@@ -31264,6 +31729,9 @@ msgstr ""
msgid "Site profile not found for given parameters"
msgstr ""
+msgid "Sites"
+msgstr ""
+
msgid "Size"
msgstr ""
@@ -31294,19 +31762,22 @@ msgstr ""
msgid "SlackIntegration|Sends notifications about project events to Slack channels."
msgstr ""
-msgid "SlackService|2. Paste the %{strong_open}Token%{strong_close} into the field below"
+msgid "SlackService|1. %{slash_command_link_start}Add a slash command%{slash_command_link_end} in your Slack team using this information:"
msgstr ""
-msgid "SlackService|3. Select the %{strong_open}Active%{strong_close} checkbox, press %{strong_open}Save changes%{strong_close} and start using GitLab inside Slack!"
+msgid "SlackService|2. Paste the token from Slack in the %{strong_open}Token%{strong_close} field below."
msgstr ""
-msgid "SlackService|Fill in the word that works best for your team."
+msgid "SlackService|3. Select the %{strong_open}Active%{strong_close} checkbox, select %{strong_open}Save changes%{strong_close}, and start using slash commands in Slack!"
+msgstr ""
+
+msgid "SlackService|After setup, get a list of available Slack slash commands by entering"
msgstr ""
-msgid "SlackService|See list of available commands in Slack after setting up this service, by entering"
+msgid "SlackService|Fill in the word that works best for your team."
msgstr ""
-msgid "SlackService|This service allows users to perform common operations on this project by entering slash commands in Slack."
+msgid "SlackService|Perform common operations in this project by entering slash commands in Slack."
msgstr ""
msgid "Slice multiplier"
@@ -31372,7 +31843,7 @@ msgstr ""
msgid "Some child epics may be hidden due to applied filters"
msgstr ""
-msgid "Some common domains are not allowed. %{read_more_link}."
+msgid "Some common domains are not allowed. %{learn_more_link}."
msgstr ""
msgid "Some of the designs you tried uploading did not change:"
@@ -31456,9 +31927,6 @@ msgstr ""
msgid "Something went wrong while exporting requirements"
msgstr ""
-msgid "Something went wrong while fetching %{listType} list"
-msgstr ""
-
msgid "Something went wrong while fetching branches"
msgstr ""
@@ -31513,15 +31981,9 @@ msgstr ""
msgid "Something went wrong while merging this merge request. Please try again."
msgstr "Ceva nu a mers bine în timpul îmbinării acestui merge request. Vă rugăm încercați din nou."
-msgid "Something went wrong while moving issues."
-msgstr ""
-
msgid "Something went wrong while obtaining the Let's Encrypt certificate."
msgstr ""
-msgid "Something went wrong while performing the action."
-msgstr ""
-
msgid "Something went wrong while promoting the issue to an epic. Please try again."
msgstr ""
@@ -31849,7 +32311,10 @@ msgstr ""
msgid "SourcegraphPreferences|Uses a custom %{linkStart}Sourcegraph instance%{linkEnd}."
msgstr ""
-msgid "Spam Check API Key"
+msgid "Spam Check"
+msgstr ""
+
+msgid "Spam Check API key"
msgstr ""
msgid "Spam Logs"
@@ -31867,7 +32332,7 @@ msgstr ""
msgid "Specified URL cannot be used: \"%{reason}\""
msgstr ""
-msgid "Specify an e-mail address regex pattern to identify default internal users."
+msgid "Specify an email address regex pattern to identify default internal users."
msgstr ""
msgid "Speed up your pipelines with Needs relationships"
@@ -32122,7 +32587,7 @@ msgstr ""
msgid "StatusCheck|An error occurred fetching the status checks."
msgstr ""
-msgid "StatusCheck|Apply this status check to any branch or a specific protected branch."
+msgid "StatusCheck|Apply this status check to all branches or a specific protected branch."
msgstr ""
msgid "StatusCheck|Check for a status response in Merge Requests. Failures do not block merges. %{link_start}Learn more%{link_end}."
@@ -32461,6 +32926,9 @@ msgstr ""
msgid "Subscriptions"
msgstr ""
+msgid "Subscription|Your subscription for %{strong}%{namespace_name}%{strong_close} has expired and you are now on %{pricing_link_start}the GitLab Free tier%{pricing_link_end}. Don't worry, your data is safe. Get in touch with our support team (%{support_email}). They'll gladly help with your subscription renewal."
+msgstr ""
+
msgid "Subtracted"
msgstr ""
@@ -32689,6 +33157,9 @@ msgstr ""
msgid "SuperSonics|Plan"
msgstr ""
+msgid "SuperSonics|Please agree to the Subscription Agreement"
+msgstr ""
+
msgid "SuperSonics|Ready to get started? A GitLab plan is ideal for scaling organizations and for multi team usage."
msgstr ""
@@ -32719,6 +33190,9 @@ msgstr ""
msgid "SuperSonics|The activation code is not valid. Please make sure to copy it exactly from the Customers Portal or confirmation email. Learn more about %{linkStart}activating your subscription%{linkEnd}."
msgstr ""
+msgid "SuperSonics|The activation code should be a 24-character alphanumeric string"
+msgstr ""
+
msgid "SuperSonics|There is a connectivity issue."
msgstr ""
@@ -32761,9 +33235,15 @@ msgstr ""
msgid "SuperSonics|You do not have an active subscription"
msgstr ""
+msgid "SuperSonics|You have successfully added a license that activates on %{date}. Please see the subscription history table below for more details."
+msgstr ""
+
msgid "SuperSonics|You'll be charged for %{trueUpLinkStart}users over license%{trueUpLinkEnd} on a quarterly or annual basis, depending on the terms of your agreement."
msgstr ""
+msgid "SuperSonics|Your future dated license was successfully added"
+msgstr ""
+
msgid "SuperSonics|Your subscription"
msgstr ""
@@ -33016,7 +33496,7 @@ msgstr ""
msgid "Template to append to all Service Desk issues"
msgstr "Șablon de adăugat la toate problemele Birou de Servicii"
-msgid "TemplateRepository|Select a repository to make its templates available to all projects. %{link_start}What should the repository contain?%{link_end} "
+msgid "TemplateRepository|Create common files more quickly, and standardize their format."
msgstr ""
msgid "Templates"
@@ -33226,7 +33706,7 @@ msgstr ""
msgid "TestCases|Search test cases"
msgstr ""
-msgid "TestCases|Something went wrong while adding test case to Todo."
+msgid "TestCases|Something went wrong while adding test case to a to-do item."
msgstr ""
msgid "TestCases|Something went wrong while creating a test case."
@@ -33238,7 +33718,7 @@ msgstr ""
msgid "TestCases|Something went wrong while fetching test cases list."
msgstr ""
-msgid "TestCases|Something went wrong while marking test case todo as done."
+msgid "TestCases|Something went wrong while marking test case to-do item as done."
msgstr ""
msgid "TestCases|Something went wrong while moving test case."
@@ -33358,7 +33838,7 @@ msgstr ""
msgid "Thanks for your purchase!"
msgstr ""
-msgid "That is ok, I do not want to renew"
+msgid "That's OK, I don't want to renew"
msgstr ""
msgid "That's it, well done!"
@@ -33382,7 +33862,7 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
-msgid "The API key used by GitLab for accessing the Spam Check service endpoint"
+msgid "The API key used by GitLab for accessing the Spam Check service endpoint."
msgstr ""
msgid "The GitLab subscription service (customers.gitlab.com) is currently experiencing an outage. You can monitor the status and get updates at %{linkStart}status.gitlab.com%{linkEnd}."
@@ -33421,9 +33901,6 @@ msgstr ""
msgid "The URL to use for connecting to Elasticsearch. Use a comma-separated list to support clustering (e.g., \"http://localhost:9200, http://localhost:9201\")."
msgstr ""
-msgid "The Vulnerability Report shows the results of the last successful pipeline run on the default branch."
-msgstr ""
-
msgid "The X509 Certificate to use when mutual TLS is required to communicate with the external authorization service. If left blank, the server certificate is still validated when accessing over HTTPS."
msgstr ""
@@ -33481,9 +33958,6 @@ msgstr ""
msgid "The default branch for this project has been changed. Please update your bookmarks."
msgstr ""
-msgid "The default expiration time for job artifacts. 0 for unlimited. The default unit is in seconds, but you can use other units, for example %{code_open}4 mins 2 sec%{code_close}, %{code_open}2h42min%{code_close}."
-msgstr ""
-
msgid "The dependency list details information about the components used within your project."
msgstr ""
@@ -33676,9 +34150,6 @@ msgstr ""
msgid "The merge conflicts for this merge request have already been resolved. Please return to the merge request."
msgstr ""
-msgid "The merge request can now be merged."
-msgstr ""
-
msgid "The metric must be one of %{metrics}."
msgstr ""
@@ -34054,7 +34525,7 @@ msgstr ""
msgid "There was a problem updating the keep latest artifacts setting."
msgstr ""
-msgid "There was an error %{message} todo."
+msgid "There was an error %{message} to-do item."
msgstr ""
msgid "There was an error adding a To Do."
@@ -34093,6 +34564,9 @@ msgstr ""
msgid "There was an error fetching projects"
msgstr ""
+msgid "There was an error fetching search autocomplete suggestions"
+msgstr ""
+
msgid "There was an error fetching stage total counts"
msgstr "A apărut o eroare preluând numărătoarea totală a stagiilor"
@@ -34417,6 +34891,9 @@ msgstr "Acest câmp este obligatoriu"
msgid "This field is required."
msgstr ""
+msgid "This form is disabled in preview"
+msgstr ""
+
msgid "This group"
msgstr ""
@@ -34438,9 +34915,6 @@ msgstr ""
msgid "This group is linked to a subscription"
msgstr ""
-msgid "This group, including all subgroups, projects and git repositories, will be reachable from only the specified IP address ranges."
-msgstr ""
-
msgid "This group, its subgroups and projects has been scheduled for removal on %{date}."
msgstr ""
@@ -34720,9 +35194,6 @@ msgstr ""
msgid "This user cannot be unlocked manually from GitLab"
msgstr ""
-msgid "This user does not have a pending request"
-msgstr ""
-
msgid "This user has an unconfirmed email address (%{email}). You may force a confirmation."
msgstr ""
@@ -34831,9 +35302,6 @@ msgstr ""
msgid "ThreatMonitoring|Packet Activity"
msgstr ""
-msgid "ThreatMonitoring|Policies"
-msgstr ""
-
msgid "ThreatMonitoring|Requests"
msgstr ""
@@ -34885,6 +35353,12 @@ msgstr ""
msgid "ThreatMonitoring|View documentation"
msgstr ""
+msgid "Threshold in bytes at which to compress Sidekiq job arguments."
+msgstr ""
+
+msgid "Threshold in bytes at which to reject Sidekiq jobs. Set this to 0 to if you don't want to limit Sidekiq jobs."
+msgstr ""
+
msgid "Throughput"
msgstr ""
@@ -34894,6 +35368,9 @@ msgstr ""
msgid "Time"
msgstr ""
+msgid "Time (in hours) that users are allowed to skip forced configuration of two-factor authentication."
+msgstr ""
+
msgid "Time Spent"
msgstr ""
@@ -34960,7 +35437,7 @@ msgstr ""
msgid "TimeTrackingEstimated|Est"
msgstr ""
-msgid "TimeTracking|%{startTag}Spent: %{endTag}%{timeSpentHumanReadable}"
+msgid "TimeTracking|%{spentStart}Spent: %{spentEnd}"
msgstr ""
msgid "TimeTracking|Estimated:"
@@ -35176,6 +35653,9 @@ msgstr ""
msgid "To access this domain create a new DNS record"
msgstr ""
+msgid "To add a custom suffix, set up a Service Desk email address. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "To add an SSH key you need to %{generate_link_start}generate one%{link_end} or use an %{existing_link_start}existing key%{link_end}."
msgstr ""
@@ -35197,13 +35677,16 @@ msgstr ""
msgid "To connect an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To continue using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
+msgstr ""
+
msgid "To continue, you need to select the link in the confirmation email we sent to verify your email address. If you didn't get our email, select %{strongStart}Resend confirmation email.%{strongEnd}"
msgstr ""
msgid "To define internal users, first enable new users set to external"
msgstr ""
-msgid "To enable Registration Features, make sure \"Enable service ping\" is checked."
+msgid "To enable Registration Features, first enable Service Ping."
msgstr ""
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
@@ -35230,7 +35713,7 @@ msgstr ""
msgid "To get started, use the link below to confirm your account."
msgstr ""
-msgid "To help improve GitLab and its user experience, GitLab will periodically collect usage information."
+msgid "To help improve GitLab and its user experience, GitLab periodically collects usage information."
msgstr ""
msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
@@ -35263,7 +35746,7 @@ msgstr ""
msgid "To preserve performance only %{strong_open}%{display_size} of %{real_size}%{strong_close} files are displayed."
msgstr ""
-msgid "To protect this issue's confidentiality, %{forkLink} and set the fork's visibility to private."
+msgid "To protect this issue's confidentiality, %{linkStart}fork this project%{linkEnd} and set the fork's visibility to private."
msgstr ""
msgid "To protect this issue's confidentiality, a private fork of this project was selected."
@@ -35296,12 +35779,15 @@ msgstr ""
msgid "To set up SAML authentication for your group through an identity provider like Azure, Okta, Onelogin, Ping Identity, or your custom SAML 2.0 provider:"
msgstr ""
-msgid "To set up this service:"
+msgid "To set up this integration:"
msgstr ""
msgid "To specify the notification level per project of a group you belong to, you need to visit project page and change notification level there."
msgstr ""
+msgid "To start using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
+msgstr ""
+
msgid "To unsubscribe from this issue, please paste the following link into your browser:"
msgstr ""
@@ -35890,9 +36376,6 @@ msgstr ""
msgid "Unable to fetch branches list, please close the form and try again"
msgstr ""
-msgid "Unable to fetch unscanned projects"
-msgstr ""
-
msgid "Unable to fetch vulnerable projects"
msgstr ""
@@ -35947,6 +36430,15 @@ msgstr ""
msgid "Unable to update this issue at this time."
msgstr ""
+msgid "Unapprove a merge request"
+msgstr ""
+
+msgid "Unapprove the current merge request."
+msgstr ""
+
+msgid "Unapproved the current merge request."
+msgstr ""
+
msgid "Unarchive project"
msgstr ""
@@ -35959,16 +36451,13 @@ msgstr ""
msgid "Unassigned"
msgstr ""
-msgid "Unauthenticated API request rate limit"
+msgid "Unauthenticated API rate limit period in seconds"
msgstr ""
-msgid "Unauthenticated rate limit period in seconds"
-msgstr ""
-
-msgid "Unauthenticated request rate limit"
+msgid "Unauthenticated requests"
msgstr ""
-msgid "Unauthenticated requests"
+msgid "Unauthenticated web rate limit period in seconds"
msgstr ""
msgid "Undo"
@@ -36070,18 +36559,6 @@ msgstr ""
msgid "Unresolved"
msgstr ""
-msgid "UnscannedProjects|15 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|30 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|5 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|60 or more days"
-msgstr ""
-
msgid "Unschedule job"
msgstr ""
@@ -36301,6 +36778,9 @@ msgstr ""
msgid "UsageQuota|%{help_link_start}Shared runners%{help_link_end} are disabled, so there are no limits set on pipeline usage"
msgstr ""
+msgid "UsageQuota|%{linkTitle} help link"
+msgstr ""
+
msgid "UsageQuota|%{percentageLeft} of purchased storage is available"
msgstr ""
@@ -36310,6 +36790,9 @@ msgstr ""
msgid "UsageQuota|Artifacts is a sum of build and pipeline artifacts."
msgstr ""
+msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
+msgstr ""
+
msgid "UsageQuota|Buy additional minutes"
msgstr ""
@@ -36319,9 +36802,21 @@ msgstr "Utilizare minute CI după lună"
msgid "UsageQuota|CI minutes usage by project"
msgstr "Utilizare minute CI după proiect"
+msgid "UsageQuota|Code packages and container images."
+msgstr ""
+
msgid "UsageQuota|Current period usage"
msgstr ""
+msgid "UsageQuota|File attachments and smaller design graphics."
+msgstr ""
+
+msgid "UsageQuota|Git repository, managed by the Gitaly service."
+msgstr ""
+
+msgid "UsageQuota|Includes project registry, artifacts, packages, wiki, uploads and other items."
+msgstr ""
+
msgid "UsageQuota|Increase storage temporarily"
msgstr ""
@@ -36340,6 +36835,9 @@ msgstr ""
msgid "UsageQuota|Packages"
msgstr ""
+msgid "UsageQuota|Pipeline artifacts and job artifacts, created with CI/CD."
+msgstr ""
+
msgid "UsageQuota|Pipelines"
msgstr ""
@@ -36358,6 +36856,9 @@ msgstr ""
msgid "UsageQuota|Seats"
msgstr ""
+msgid "UsageQuota|Shared bits of code and text."
+msgstr ""
+
msgid "UsageQuota|Snippets"
msgstr ""
@@ -36367,6 +36868,12 @@ msgstr ""
msgid "UsageQuota|Storage"
msgstr ""
+msgid "UsageQuota|Storage type"
+msgstr ""
+
+msgid "UsageQuota|There is a known issue with Artifact storage where the total could be incorrect for some projects. More details and progress are available in %{warningLinkStart}the epic%{warningLinkEnd}."
+msgstr ""
+
msgid "UsageQuota|This is the total amount of storage used across your projects within this namespace."
msgstr ""
@@ -36406,6 +36913,9 @@ msgstr ""
msgid "UsageQuota|Usage"
msgstr ""
+msgid "UsageQuota|Usage Breakdown"
+msgstr ""
+
msgid "UsageQuota|Usage Quotas"
msgstr ""
@@ -36430,6 +36940,9 @@ msgstr ""
msgid "UsageQuota|Wiki"
msgstr ""
+msgid "UsageQuota|Wiki content."
+msgstr ""
+
msgid "UsageQuota|Wikis"
msgstr ""
@@ -36646,7 +37159,10 @@ msgstr ""
msgid "User Settings"
msgstr ""
-msgid "User and IP Rate Limits"
+msgid "User and IP rate limits"
+msgstr ""
+
+msgid "User does not have a pending request"
msgstr ""
msgid "User identity was successfully created."
@@ -36943,6 +37459,9 @@ msgstr ""
msgid "Users can launch a development environment from a GitLab browser tab when the %{linkStart}Gitpod%{linkEnd} integration is enabled."
msgstr ""
+msgid "Users can reactivate their account by signing in."
+msgstr ""
+
msgid "Users can render diagrams in AsciiDoc, Markdown, reStructuredText, and Textile documents using Kroki."
msgstr "Utilizatorii pot reda diagrame în documente AsciiDoc, Markdown, reStructuredText, și Textile utilizând Kroki."
@@ -36958,6 +37477,9 @@ msgstr ""
msgid "Users requesting access to"
msgstr ""
+msgid "Users to exclude from the rate limit"
+msgstr ""
+
msgid "Users were successfully added."
msgstr ""
@@ -36979,6 +37501,9 @@ msgstr ""
msgid "UsersSelect|Unassigned"
msgstr ""
+msgid "Uses GitLab as a lightweight alternative to Sentry."
+msgstr ""
+
msgid "Using %{code_start}::%{code_end} denotes a %{link_start}scoped label set%{link_end}"
msgstr ""
@@ -37009,12 +37534,9 @@ msgstr ""
msgid "Value Stream Analytics can help you determine your team’s velocity"
msgstr ""
-msgid "Value Stream Analytics gives an overview of how much time it takes to go from idea to production in your project."
+msgid "Value might contain a variable reference"
msgstr ""
-msgid "Value may contain a variable reference"
-msgstr "Valoarea poate conține o referință variabilă"
-
msgid "Value stream"
msgstr ""
@@ -37078,11 +37600,11 @@ msgstr ""
msgid "ValueStream|The Default Value Stream cannot be deleted"
msgstr ""
-msgid "Variable"
+msgid "Values that contain the %{codeStart}$%{codeEnd} character can be considered a variable reference and expanded. %{docsLinkStart}Learn more.%{docsLinkEnd}"
msgstr ""
-msgid "Variable references indicated by %{codeStart}$%{codeEnd} may be expanded. If this is not what you want, consider %{docsLinkStart}using a workaround to prevent expansion%{docsLinkEnd}."
-msgstr "Referințele variabile indicate de %{codeStart}$%{codeEnd} pot fi extinse. Dacă nu doriți acest lucru, luați în considerare %{docsLinkStart}utilizarea unei soluții alternative pentru a preveni extinderea%{docsLinkEnd}."
+msgid "Variable"
+msgstr ""
msgid "Variable will be masked in job logs."
msgstr ""
@@ -37489,6 +38011,9 @@ msgstr ""
msgid "Vulnerability|Evidence"
msgstr ""
+msgid "Vulnerability|False positive detected"
+msgstr ""
+
msgid "Vulnerability|File"
msgstr ""
@@ -37531,6 +38056,9 @@ msgstr ""
msgid "Vulnerability|Status"
msgstr ""
+msgid "Vulnerability|The scanner determined this vulnerability to be a false positive. Verify the evaluation before changing its status. %{linkStart}Learn more about false positive detection.%{linkEnd}"
+msgstr ""
+
msgid "Vulnerability|The unmodified response is the original response that had no mutations done to the request"
msgstr ""
@@ -37855,9 +38383,6 @@ msgstr ""
msgid "Welcome to GitLab,%{br_tag}%{name}!"
msgstr ""
-msgid "Welcome to the guided GitLab tour"
-msgstr ""
-
msgid "Welcome, %{name}!"
msgstr ""
@@ -37876,9 +38401,6 @@ msgstr "Ce sunt minutele de conducte executori partajați?"
msgid "What are you searching for?"
msgstr ""
-msgid "What describes you best?"
-msgstr ""
-
msgid "What does this command do?"
msgstr ""
@@ -37900,13 +38422,13 @@ msgstr "Ce este urmărirea timpului?"
msgid "What is your job title? (optional)"
msgstr ""
-msgid "What will you use this group for?"
+msgid "What templates can I create?"
msgstr ""
-msgid "What's new"
-msgstr ""
+msgid "What will you use this group for?"
+msgstr "Pentru ce veți folosi acest grup?"
-msgid "What’s your experience level?"
+msgid "What's new"
msgstr ""
msgid "When a deployment job is successful, skip older deployment jobs that are still pending."
@@ -37918,6 +38440,9 @@ msgstr ""
msgid "When an event in GitLab triggers a webhook, you can use the request details to figure out if something went wrong."
msgstr ""
+msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+msgstr ""
+
msgid "When inactive, an external authentication provider must be used."
msgstr "Când inactiv, un furnizor de autentificare extern trebuie utilizat."
@@ -37942,6 +38467,9 @@ msgstr ""
msgid "When:"
msgstr ""
+msgid "Which API requests are affected?"
+msgstr ""
+
msgid "While it's rare to have no vulnerabilities, it can happen. In any event, we ask that you please double check your settings to make sure you've set up your dashboard correctly."
msgstr ""
@@ -38221,6 +38749,9 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|Work Items"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -38296,6 +38827,9 @@ msgstr ""
msgid "You are already a member of this %{member_source}."
msgstr "Sunteți deja un membru al acestui %{member_source}."
+msgid "You are already impersonating another user"
+msgstr ""
+
msgid "You are an admin, which means granting access to %{client_name} will allow them to interact with GitLab as an admin as well. Proceed with caution."
msgstr ""
@@ -38398,6 +38932,9 @@ msgstr ""
msgid "You can also use project access tokens with Git to authenticate over HTTP(S). %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "You can always change your URL later"
+msgstr ""
+
msgid "You can always edit this later"
msgstr ""
@@ -38554,10 +39091,10 @@ msgstr ""
msgid "You can’t %{tag_start}edit%{tag_end} files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
-msgid "You could not create a new trigger."
+msgid "You can’t edit files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
-msgid "You didn't renew your subscription for %{strong}%{namespace_name}%{strong_close} so it was downgraded to the free plan."
+msgid "You could not create a new trigger."
msgstr ""
msgid "You do not have any subscriptions yet"
@@ -38725,6 +39262,12 @@ msgstr ""
msgid "You must provide your current password in order to change it."
msgstr ""
+msgid "You must sign in to search for specific projects."
+msgstr ""
+
+msgid "You must sign in to search for specific terms."
+msgstr ""
+
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
@@ -38752,6 +39295,9 @@ msgstr ""
msgid "You need to upload a GitLab project export archive (ending in .gz)."
msgstr ""
+msgid "You need to verify your primary email first before enabling Two-Factor Authentication."
+msgstr ""
+
msgid "You successfully declined the invitation"
msgstr ""
@@ -38831,10 +39377,10 @@ msgid "You're receiving this email because of your account on %{host}."
msgstr ""
msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link} &middot; %{help_link}"
-msgstr ""
+msgstr "Primiți acest e-mail din cauza contului dvs. pe %{host}. %{manage_notifications_link} &middot; %{help_link}"
msgid "You're receiving this email because of your activity on %{host}."
-msgstr ""
+msgstr "Primești acest e-mail din cauza activității dvs. pe %{host}."
msgid "You're receiving this email because you have been assigned an item on %{host}."
msgstr ""
@@ -38855,49 +39401,49 @@ msgid "YouTube URL or ID"
msgstr ""
msgid "Your %{group} membership will now expire in %{days}."
-msgstr ""
+msgstr "Abonamentul dvs. %{group} va expira acum în %{days}."
msgid "Your %{host} account was signed in to from a new location"
msgstr ""
-msgid "Your %{strong}%{plan_name}%{strong_close} subscription for %{strong}%{namespace_name}%{strong_close} will expire on %{strong}%{expires_on}%{strong_close}."
+msgid "Your %{strong}%{plan_name}%{strong_close} subscription expires on %{strong}%{expires_on}%{strong_close}. After that date, you cannot create issues or merge requests, or use many other features."
msgstr ""
-msgid "Your %{strong}%{plan_name}%{strong_close} subscription will expire on %{strong}%{expires_on}%{strong_close}. After that, you will not be able to create issues or merge requests as well as many other features."
+msgid "Your %{strong}%{plan_name}%{strong_close} subscription for %{strong}%{namespace_name}%{strong_close} will expire on %{strong}%{expires_on}%{strong_close}."
msgstr ""
msgid "Your CI/CD configuration syntax is invalid. View Lint tab for more details."
-msgstr ""
+msgstr "Sintaxa dvs. de configurare CI/CD este invalidă. Vizualizați fila Lint pentru mai multe detalii."
msgid "Your CSV export has started. It will be emailed to %{email} when complete."
-msgstr ""
+msgstr "Exportul dvs. CSV a început. Va fi trimis prin e-mail la %{email} la finalizare."
msgid "Your CSV export of %{count} from project %{project_link} has been added to this email as an attachment."
-msgstr ""
+msgstr "Exportul dvs. CSV de %{count} din proiectul %{project_link} a fost adăugat la acest e-mail ca atașament."
msgid "Your CSV export of %{written_count} from project %{project_name} (%{project_url}) has been added to this email as an attachment."
-msgstr ""
+msgstr "Exportul dvs. CSV de %{written_count} din proiectul %{project_name} (%{project_url}) a fost adăugat la acest e-mail ca atașament."
msgid "Your CSV import for project"
-msgstr ""
+msgstr "Importul dvs. CSV pentru proiect"
msgid "Your DevOps Report gives an overview of how you are using GitLab from a feature perspective. Use it to view how you compare with other organizations."
msgstr "Raportul dvs. DevOps vă oferă o prezentare generală a cum utilizați GitLab dintr-o perspectivă a funcțiilor. Utilizați-l pentru a vizualiza cum vă comparați cu alte organizații."
msgid "Your GPG keys (%{count})"
-msgstr ""
+msgstr "Cheile dvs. GPG (%{count})"
-msgid "Your GitLab account has been locked due to an excessive amount of unsuccessful sign in attempts. Your account will automatically unlock in %{duration} or you may click the link below to unlock now."
+msgid "Your GitLab account has been locked due to an excessive number of unsuccessful sign in attempts. You can wait for your account to automatically unlock in %{duration} or you can click the link below to unlock now."
msgstr ""
msgid "Your GitLab account request has been approved!"
-msgstr ""
+msgstr "Solicitarea contului dvs. GitLab a fost aprobată!"
msgid "Your GitLab group"
-msgstr ""
+msgstr "Grupul dvs. GitLab"
msgid "Your Groups"
-msgstr ""
+msgstr "Grupurile dvs."
msgid "Your Personal Access Token was revoked"
msgstr ""
@@ -38906,7 +39452,7 @@ msgid "Your Projects (default)"
msgstr "Proiectele dvs. (implicit)"
msgid "Your Projects' Activity"
-msgstr ""
+msgstr "Activitatea proiectelor dvs."
msgid "Your SSH key has expired"
msgstr "Cheia dvs. SSH a expirat"
@@ -38948,7 +39494,7 @@ msgid "Your account has been deactivated. You will not be able to: "
msgstr "Contul dvs. a fost dezactivat. Nu veți mai putea să: "
msgid "Your account is locked."
-msgstr ""
+msgstr "Contul dvs. este blocat."
msgid "Your account uses dedicated credentials for the \"%{group_name}\" group and can only be updated through SSO."
msgstr ""
@@ -38960,16 +39506,16 @@ msgid "Your applications (%{size})"
msgstr "Aplicațiile dvs. (%{size})"
msgid "Your authorized applications"
-msgstr ""
+msgstr "Aplicațiile dvs. autorizate"
msgid "Your browser does not support iFrames"
-msgstr ""
+msgstr "Browser-ul dvs. nu acceptă iFrames"
msgid "Your browser doesn't support U2F. Please use Google Chrome desktop (version 41 or newer)."
-msgstr ""
+msgstr "Browserul dvs. nu acceptă U2F. Va rugăm să folosiți Google Chrome desktop (versiunea 41 sau mai nouă)."
msgid "Your browser doesn't support WebAuthn. Please use a supported browser, e.g. Chrome (67+) or Firefox (60+)."
-msgstr ""
+msgstr "Browserul dvs. nu acceptă WebAuthn. Vă rugăm să utilizați un browser acceptat, de exemplu Chrome (67+) sau Firefox (60+)."
msgid "Your changes can be committed to %{branch_name} because a merge request is open."
msgstr ""
@@ -38978,19 +39524,19 @@ msgid "Your changes have been committed. Commit %{commitId} %{commitStats}"
msgstr ""
msgid "Your changes have been saved"
-msgstr ""
+msgstr "Schimbările dvs. au fost salvate"
msgid "Your changes have been successfully committed."
msgstr ""
msgid "Your comment could not be submitted because %{error}"
-msgstr ""
+msgstr "Comentariul dvs. nu a putut fi trimis deoarece %{error}"
msgid "Your comment could not be submitted! Please check your network connection and try again."
-msgstr ""
+msgstr "Comentariul dvs. nu a putut fi trimis! Vă rugăm să verificați conexiunea la rețea și să încercați din nou."
msgid "Your comment could not be updated! Please check your network connection and try again."
-msgstr ""
+msgstr "Comentariul dvs. nu a putut fi actualizat! Vă rugăm să verificați conexiunea la rețea și să încercați din nou."
msgid "Your comment will be discarded."
msgstr ""
@@ -38998,6 +39544,9 @@ msgstr ""
msgid "Your commit email is used for web based operations, such as edits and merges."
msgstr ""
+msgid "Your current password is required to register a two-factor authenticator app."
+msgstr ""
+
msgid "Your dashboard has been copied. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
@@ -39011,22 +39560,22 @@ msgid "Your deployment services will be broken, you will need to manually fix th
msgstr ""
msgid "Your device is not compatible with GitLab. Please try another device"
-msgstr ""
+msgstr "Dispozitivul dvs. nu este compatibil cu GitLab. Vă rugăm să încercați un alt dispozitiv"
msgid "Your device needs to be set up. Plug it in (if needed) and click the button on the left."
-msgstr ""
+msgstr "Dispozitivul dvs. trebuie configurat. Conectați-l (dacă este necesar) și faceți clic pe butonul din stânga."
msgid "Your device was successfully set up! Give it a name and register it with the GitLab server."
-msgstr ""
+msgstr "Dispozitivul dvs. fost configurat cu succes! Dați-i un nume și înregistrați-l pe serverul GitLab."
msgid "Your file must contain a column named %{codeStart}title%{codeEnd}. A %{codeStart}description%{codeEnd} column is optional. The maximum file size allowed is 10 MB."
msgstr ""
msgid "Your first project"
-msgstr ""
+msgstr "Primul dvs. proiect"
msgid "Your groups"
-msgstr ""
+msgstr "Grupurile dvs."
msgid "Your instance has %{remaining_user_count} users remaining of the %{total_user_count} included in your subscription. You can add more users than the number included in your license, and we will include the overage in your next bill."
msgstr ""
@@ -39038,10 +39587,10 @@ msgid "Your instance is approaching its licensed user count"
msgstr ""
msgid "Your issues are being imported. Once finished, you'll get a confirmation email."
-msgstr ""
+msgstr "Problemele dvs. sunt importate. Odată finalizat, veți primi un e-mail de confirmare."
msgid "Your issues will be imported in the background. Once finished, you'll get a confirmation email."
-msgstr ""
+msgstr "Problemele dvs. vor fi importate în fundal. Odată finalizat, veți primi un e-mail de confirmare."
msgid "Your license does not support on-call rotations"
msgstr ""
@@ -39059,7 +39608,7 @@ msgid "Your message here"
msgstr "Mesajul dvs. aici"
msgid "Your name"
-msgstr ""
+msgstr "Numele dvs."
msgid "Your new %{type}"
msgstr "Noul tău %{type}"
@@ -39068,100 +39617,103 @@ msgid "Your new SCIM token"
msgstr "Noul dvs. token SCIM"
msgid "Your new comment"
-msgstr ""
+msgstr "Noul dvs. comentariu"
msgid "Your new personal access token has been created."
-msgstr ""
+msgstr "Token-ul dvs. de acces personal a fost creat."
msgid "Your new project access token has been created."
-msgstr ""
+msgstr "Noul dvs. token de acces la proiect a fost creat."
msgid "Your password isn't required to view this page. If a password or any other personal details are requested, please contact your administrator to report abuse."
-msgstr ""
+msgstr "Parola dvs. nu este necesară pentru a vizualiza această pagină. Dacă se solicită o parolă sau orice alte detalii personale, vă rugăm să contactați administratorul pentru a raporta abuzul."
msgid "Your password reset token has expired."
-msgstr ""
+msgstr "Token-ul de resetare a parolei a expirat."
msgid "Your personal access token has expired"
-msgstr ""
+msgstr "Token-ul dvs. de acces personal a expirat"
msgid "Your personal access tokens will expire in %{days_to_expire} days or less"
-msgstr ""
+msgstr "Token-urile dvs. de acces personal vor expira în %{days_to_expire} zile sau mai puțin"
msgid "Your primary email is used for avatar detection. You can change it in your %{openingTag}profile settings%{closingTag}."
-msgstr ""
+msgstr "Adresa dvs. de e-mail principală este utilizată pentru detectarea avatarului. Îl puteți schimba %{openingTag}în setările profilulu%{closingTag}."
msgid "Your profile"
-msgstr ""
+msgstr "Profilul dvs."
msgid "Your project limit is %{limit} projects! Please contact your administrator to increase it"
msgstr ""
-msgid "Your projects"
+msgid "Your project will be created at:"
msgstr ""
+msgid "Your projects"
+msgstr "Proiectele dvs."
+
msgid "Your public email will be displayed on your public profile."
-msgstr ""
+msgstr "E-mail-ul dvs. public va fi afișat pe profilul dvs. public."
msgid "Your request for access could not be processed: %{error_meesage}"
-msgstr ""
+msgstr "Solicitarea dvs. de acces nu a putut fi procesată: %{error_meesage}"
msgid "Your request for access has been queued for review."
-msgstr ""
+msgstr "Solicitarea dvs. de acces a fost pusă în așteptare pentru examinare."
msgid "Your request to join %{host} has been rejected."
-msgstr ""
+msgstr "Solicitarea dumneavoastră de a vă alătura %{host} a fost respinsă."
msgid "Your requirements are being imported. Once finished, you'll receive a confirmation email."
-msgstr ""
+msgstr "Cerințele dvs. sunt importate. Odată finalizat, veți primi un e-mail de confirmare."
msgid "Your requirements will be imported in the background. After it's finished, you'll get a confirmation email."
-msgstr ""
+msgstr "Cerințele dvs. vor fi importate în fundal. După ce importul s-a finalizat, veți primi un e-mail de confirmare."
msgid "Your response has been recorded."
-msgstr ""
+msgstr "Răspunsul dumneavoastră a fost înregistrat."
msgid "Your search didn't match any commits."
msgstr ""
msgid "Your search didn't match any commits. Try a different query."
-msgstr ""
+msgstr "Căutarea dvs. nu s-a potrivit cu nici un commit. Încercați o altă interogare."
msgid "Your search timed out"
msgstr "Căutarea dvs. a expirat"
msgid "Your sign-in page is %{url}."
-msgstr ""
+msgstr "Pagina dvs. de conectare este %{url}."
msgid "Your subscription expired!"
-msgstr ""
+msgstr "Abonamentul dvs. a expirat!"
-msgid "Your subscription has been downgraded."
-msgstr ""
-
-msgid "Your subscription will expire in %{remaining_days}."
-msgstr ""
+msgid "Your subscription will expire in %{remaining_days} day."
+msgid_plural "Your subscription will expire in %{remaining_days} days."
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
msgid "Your username is %{username}."
-msgstr ""
+msgstr "Numele dvs. de utilizator este %{username}."
msgid "ZentaoIntegration|Base URL of the Zentao instance."
-msgstr ""
+msgstr "Adresa URL de bază a instanței Zentao."
msgid "ZentaoIntegration|Enter API token"
-msgstr ""
+msgstr "Introduceți token-ul API"
msgid "ZentaoIntegration|If different from Web URL."
-msgstr ""
+msgstr "Dacă este diferit de URL-ul web."
msgid "ZentaoIntegration|Use Zentao as this project's issue tracker."
-msgstr ""
+msgstr "Folosiți Zentao ca instrument de urmărire a problemelor din acest proiect."
msgid "ZentaoIntegration|Zentao API URL (optional)"
msgstr ""
msgid "ZentaoIntegration|Zentao API token"
-msgstr ""
+msgstr "Token API Zentao"
msgid "ZentaoIntegration|Zentao Product ID"
msgstr ""
@@ -39182,16 +39734,16 @@ msgid "[Redacted]"
msgstr "[Redacted]"
msgid "`end_time` should not exceed one month after `start_time`"
-msgstr ""
+msgstr "`end_time` nu trebuie să depășească o lună după `start_time`"
msgid "`start_time` should precede `end_time`"
-msgstr ""
+msgstr "`start_time` ar trebui să preceadă `end_time`"
msgid "a deleted user"
msgstr "un utilizator șters"
msgid "a design"
-msgstr ""
+msgstr "un design"
msgid "about 1 hour"
msgid_plural "about %d hours"
@@ -39212,10 +39764,10 @@ msgid "added %{emails}"
msgstr "adăugat %{emails}"
msgid "added a Zoom call to this issue"
-msgstr ""
+msgstr "a adăugat un apel Zoom la această problemă"
msgid "ago"
-msgstr ""
+msgstr "în urmă"
msgid "alert"
msgstr "alertă"
@@ -39224,7 +39776,7 @@ msgid "allowed to fail"
msgstr ""
msgid "already being used for another group or project %{timebox_name}."
-msgstr ""
+msgstr "este deja utilizat pentru un alt grup sau proiect %{timebox_name}."
msgid "already being used for another iteration within this cadence."
msgstr ""
@@ -39233,7 +39785,7 @@ msgid "already has a \"created\" issue link"
msgstr ""
msgid "already shared with this group"
-msgstr ""
+msgstr "deja partajat cu acest grup"
msgid "and"
msgstr "și"
@@ -39254,7 +39806,7 @@ msgid "archived:"
msgstr "arhivat:"
msgid "assign yourself"
-msgstr ""
+msgstr "atribuie-te"
msgid "at"
msgstr "la"
@@ -39276,9 +39828,9 @@ msgstr ""
msgid "branch"
msgid_plural "branches"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "ramură"
+msgstr[1] "ramuri"
+msgstr[2] "ramurii"
msgid "branch name"
msgstr "numele ramurii"
@@ -39299,7 +39851,7 @@ msgid "can only be changed by a group admin."
msgstr "poate fi schimbat doar de un administrator de grup."
msgid "can only have one escalation policy"
-msgstr ""
+msgstr "poate avea doar o singură politică de escaladare"
msgid "can't be the same as the source project"
msgstr ""
@@ -39335,10 +39887,10 @@ msgid "cannot be modified"
msgstr "nu poate fi modificat"
msgid "cannot block others"
-msgstr ""
+msgstr "nu poate bloca pe alții"
msgid "cannot contain HTML/XML tags, including any word between angle brackets (&lt;,&gt;)."
-msgstr ""
+msgstr "nu poate conține etichete HTML/XML, inclusiv orice cuvânt între paranteze unghiulare (&lt;,&gt;)."
msgid "cannot include leading slash or directory traversal."
msgstr ""
@@ -39349,6 +39901,9 @@ msgstr ""
msgid "cannot merge"
msgstr ""
+msgid "cannot not be used for user namespace"
+msgstr ""
+
msgid "ciReport|%{degradedNum} degraded"
msgstr "%{degradedNum} degradat"
@@ -39359,7 +39914,7 @@ msgid "ciReport|%{linkStartTag}Learn more about API Fuzzing%{linkEndTag}"
msgstr "%{linkStartTag}Aflați mai multe despre API Fuzzing%{linkEndTag}"
msgid "ciReport|%{linkStartTag}Learn more about Container Scanning %{linkEndTag}"
-msgstr ""
+msgstr "%{linkStartTag} Aflați mai multe despre Scanarea Containerelor %{linkEndTag}"
msgid "ciReport|%{linkStartTag}Learn more about Coverage Fuzzing %{linkEndTag}"
msgstr ""
@@ -39380,16 +39935,16 @@ msgid "ciReport|%{linkStartTag}Learn more about codequality reports %{linkEndTag
msgstr ""
msgid "ciReport|%{remainingPackagesCount} more"
-msgstr ""
+msgstr "%{remainingPackagesCount} mai mult"
msgid "ciReport|%{reportType} is loading"
-msgstr ""
+msgstr "%{reportType} se încarcă"
msgid "ciReport|%{reportType}: Loading resulted in an error"
msgstr ""
msgid "ciReport|%{sameNum} same"
-msgstr ""
+msgstr "%{sameNum} fel"
msgid "ciReport|: Loading resulted in an error"
msgstr ": Încărcarea a dus la o eroare"
@@ -39407,10 +39962,10 @@ msgid "ciReport|All severities"
msgstr "Toate severitățile"
msgid "ciReport|All tools"
-msgstr ""
+msgstr "Toate instrumentele"
msgid "ciReport|Automatically apply the patch in a new branch"
-msgstr ""
+msgstr "Aplică automat patch-ul într-o ramură nouă"
msgid "ciReport|Base pipeline codequality artifact not found"
msgstr ""
@@ -39437,7 +39992,7 @@ msgid "ciReport|Container scanning"
msgstr "Scanare container"
msgid "ciReport|Container scanning detects known vulnerabilities in your docker images."
-msgstr ""
+msgstr "Scanarea containerului detectează vulnerabilitățile cunoscute în imaginile dvs. docker."
msgid "ciReport|Could not dismiss vulnerability because the associated pipeline no longer exists. Refresh the page and try again."
msgstr "Nu s-a putut respinge vulnerabilitatea deoarece conducta asociată nu mai există. Reîmprospătați pagina și încercați din nou."
@@ -39464,7 +40019,7 @@ msgid "ciReport|Dependency Scanning"
msgstr ""
msgid "ciReport|Dependency Scanning detects known vulnerabilities in your source code's dependencies."
-msgstr ""
+msgstr "Scanarea dependenței detectează vulnerabilitățile cunoscute în dependențele codului dvs. sursă."
msgid "ciReport|Dependency scanning"
msgstr ""
@@ -39476,7 +40031,7 @@ msgid "ciReport|Download the patch to apply it manually"
msgstr ""
msgid "ciReport|Dynamic Application Security Testing (DAST) detects known vulnerabilities in your web application."
-msgstr ""
+msgstr "Testarea dinamică a securității aplicațiilor (DAST) detectează vulnerabilitățile cunoscute în aplicația dvs. web."
msgid "ciReport|Failed to load %{reportName} report"
msgstr ""
@@ -39503,7 +40058,7 @@ msgid "ciReport|Loading %{reportName} report"
msgstr "Încarcă raportul %{reportName}"
msgid "ciReport|Manage licenses"
-msgstr ""
+msgstr "Gestionați licențele"
msgid "ciReport|New"
msgstr "Nou"
@@ -39512,7 +40067,7 @@ msgid "ciReport|No changes to code quality"
msgstr ""
msgid "ciReport|No code quality issues found"
-msgstr ""
+msgstr "Nu s-au găsit probleme cu calitatea codului"
msgid "ciReport|RPS"
msgstr "RPS"
@@ -39527,13 +40082,13 @@ msgid "ciReport|Secret Detection"
msgstr ""
msgid "ciReport|Secret scanning"
-msgstr ""
+msgstr "Scanare secretă"
msgid "ciReport|Secret scanning detects secrets and credentials vulnerabilities in your source code."
-msgstr ""
+msgstr "Scanarea secretă detectează secretele și vulnerabilitățile credențialelor din codul dvs. sursă."
msgid "ciReport|Security scanning"
-msgstr ""
+msgstr "Scanare de securitate"
msgid "ciReport|Security scanning failed loading any results"
msgstr ""
@@ -39542,7 +40097,7 @@ msgid "ciReport|Solution"
msgstr "Soluție"
msgid "ciReport|Static Application Security Testing (SAST) detects known vulnerabilities in your source code."
-msgstr ""
+msgstr "Testarea securității statice a aplicațiilor (SAST) detectează vulnerabilitățile cunoscute în codul dvs. sursă."
msgid "ciReport|TTFB P90"
msgstr "TTFB P90"
@@ -39570,9 +40125,9 @@ msgstr ""
msgid "ciReport|Used by %{packagesString}"
msgid_plural "ciReport|Used by %{packagesString}, and %{lastPackage}"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "Utilizat de %{packagesString}"
+msgstr[1] "Utilizat de %{packagesString}, și %{lastPackage}"
+msgstr[2] "Utilizat de %{packagesString}, și %{lastPackage}"
msgid "ciReport|View full report"
msgstr "Vizualizați raportul complet"
@@ -39593,7 +40148,7 @@ msgid "codeQualityWalkthrough|A code quality job will now run every time you or
msgstr ""
msgid "codeQualityWalkthrough|Congrats! Your first pipeline is running %{emojiStart}zap%{emojiEnd}"
-msgstr ""
+msgstr "Felicitări! Prima dvs. pipeline rulează %{emojiStart}zap%{emojiEnd}"
msgid "codeQualityWalkthrough|Got it"
msgstr ""
@@ -39629,7 +40184,7 @@ msgid "codeQualityWalkthrough|Your pipeline can take a few minutes to run. If yo
msgstr ""
msgid "collect usage information"
-msgstr ""
+msgstr "colectați informații de utilizare"
msgid "comment"
msgstr "comentariu"
@@ -39638,19 +40193,19 @@ msgid "commented on %{link_to_project}"
msgstr ""
msgid "commit %{commit_id}"
-msgstr ""
+msgstr "commit %{commit_id}"
msgid "committed"
msgstr ""
msgid "container_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
-msgstr ""
+msgstr "container_name poate conține numai litere mici, cifre, '-' și '.' și trebuie să înceapă și să se termine cu un caracter alfanumeric"
msgid "container_name cannot be larger than %{max_length} chars"
-msgstr ""
+msgstr "container_name nu poate fi mai mare de %{max_length} caractere"
msgid "contribute to this project."
-msgstr ""
+msgstr "contribuie la acest proiect."
msgid "could not read private key, is the passphrase correct?"
msgstr ""
@@ -39671,13 +40226,16 @@ msgid "created %{timeAgoString} by %{user} in Jira"
msgstr "creat %{timeAgoString} de %{user} în Jira"
msgid "created %{timeAgo}"
+msgstr "creat %{timeAgo}"
+
+msgid "created %{timeAgo} by %{author}"
msgstr ""
msgid "created by"
msgstr "creat de"
msgid "data"
-msgstr ""
+msgstr "date"
msgid "date must not be after 9999-12-31"
msgstr "data nu trebuie să fie după 9999-12-31"
@@ -39692,7 +40250,7 @@ msgid "days"
msgstr "zile"
msgid "default branch"
-msgstr ""
+msgstr "ramura implicită"
msgid "deleted"
msgstr "șterse"
@@ -39701,10 +40259,10 @@ msgid "deploy"
msgstr ""
msgid "design"
-msgstr ""
+msgstr "design"
msgid "designs"
-msgstr ""
+msgstr "design-uri"
msgid "detached"
msgstr "detașat"
@@ -39718,32 +40276,23 @@ msgstr "nu există"
msgid "does not have a supported extension. Only %{extension_list} are supported"
msgstr "nu are o extensie acceptată. Doar %{extension_list} sunt acceptate"
-msgid "domain is not authorized for sign-up."
-msgstr "domeniul nu este autorizat pentru înregistrare."
-
msgid "download it"
-msgstr ""
+msgstr "descărcați-l"
msgid "draft"
msgid_plural "drafts"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "schiță"
+msgstr[1] "schițe"
+msgstr[2] "schițe"
msgid "e.g. %{token}"
-msgstr ""
+msgstr "ex. %{token}"
msgid "element is not a hierarchy"
msgstr "elementul nu este o ierarhie"
msgid "email '%{email}' is not a verified email."
-msgstr ""
-
-msgid "email does not match the allowed domain of %{email_domains}"
-msgid_plural "email does not match the allowed domains: %{email_domains}"
-msgstr[0] "e-mail-ul nu se potrivește cu domeniul permis de %{email_domains}"
-msgstr[1] "e-mail-ul nu se potrivește cu domeniile permise: %{email_domains}"
-msgstr[2] "e-mail-ul nu se potrivește cu domeniile permise: %{email_domains}"
+msgstr "e-mail-ul '%{email}' nu este un e-mail verificat."
msgid "enabled"
msgstr "activat"
@@ -39751,20 +40300,20 @@ msgstr "activat"
msgid "encrypted: needs to be a :required, :optional or :migrating!"
msgstr ""
-msgid "ending with MIME type format is not allowed."
+msgid "ending with a reserved file extension is not allowed."
msgstr ""
msgid "entries cannot be larger than 255 characters"
-msgstr ""
+msgstr "intrările nu pot fi mai mari de 255 de caractere"
msgid "entries cannot be nil"
msgstr "intrările nu pot fi nule"
msgid "entries cannot contain HTML tags"
-msgstr ""
+msgstr "intrările nu pot conține etichete HTML"
msgid "environment_id parameter is required when type is container_policy"
-msgstr ""
+msgstr "parametrul environment_id este necesar atunci când tipul este container_policy"
msgid "epic"
msgstr "epic"
@@ -39775,11 +40324,14 @@ msgstr "eroare"
msgid "estimateCommand|%{slash_command} overwrites the total estimated time."
msgstr "%{slash_command}suprascrie timpul total estimat."
-msgid "exceeds the limit of %{bytes} bytes"
+msgid "example.com"
msgstr ""
+msgid "exceeds the limit of %{bytes} bytes"
+msgstr "depășește limita de %{bytes} bytes"
+
msgid "exceeds the limit of %{bytes} bytes for directory name \"%{dirname}\""
-msgstr ""
+msgstr "depășește limita de %{bytes} bytes pentru numele directorului \"%{dirname}\""
msgid "expired on %{timebox_due_date}"
msgstr "a expirat la %{timebox_due_date}"
@@ -39788,7 +40340,7 @@ msgid "expires on %{timebox_due_date}"
msgstr "expiră la %{timebox_due_date}"
msgid "failed"
-msgstr ""
+msgstr "eșuat"
msgid "failed to dismiss associated finding(id=%{finding_id}): %{message}"
msgstr ""
@@ -39824,19 +40376,19 @@ msgid "for this project"
msgstr "pentru acest proiect"
msgid "fork"
-msgstr ""
-
-msgid "fork this project"
-msgstr ""
+msgstr "bifurcație"
msgid "from"
msgstr "de la"
msgid "from %d job"
msgid_plural "from %d jobs"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "din %d job"
+msgstr[1] "din %d job-uri"
+msgstr[2] "din %d de job-uri"
+
+msgid "frontmatter"
+msgstr ""
msgid "group"
msgstr "grup"
@@ -39845,7 +40397,7 @@ msgid "group members"
msgstr "membrii grupului"
msgid "group's CI/CD settings."
-msgstr ""
+msgstr "setările CI/CD ale grupului."
msgid "groups"
msgstr "grupuri"
@@ -39857,12 +40409,15 @@ msgid "has already been taken"
msgstr ""
msgid "has already been taken as Codename"
-msgstr ""
+msgstr "a fost deja luat ca nume de cod"
msgid "has already been taken as Suite"
msgstr ""
msgid "has been completed."
+msgstr "a fost finalizat."
+
+msgid "has too deep level of nesting"
msgstr ""
msgid "help"
@@ -39887,10 +40442,10 @@ msgid "image diff"
msgstr ""
msgid "impersonation token"
-msgstr ""
+msgstr "token impersonare"
msgid "impersonation tokens"
-msgstr ""
+msgstr "token-uri impersonare"
msgid "import flow"
msgstr "fluxul de import"
@@ -39898,12 +40453,24 @@ msgstr "fluxul de import"
msgid "in"
msgstr "în"
+msgid "in Infrastructure :: Kubernetes clusters"
+msgstr ""
+
+msgid "in all GitLab"
+msgstr ""
+
+msgid "in group"
+msgstr ""
+
msgid "in group %{link_to_group}"
msgstr "în grupul %{link_to_group}"
-msgid "in project %{link_to_project}"
+msgid "in project"
msgstr ""
+msgid "in project %{link_to_project}"
+msgstr "în proiectul %{link_to_project}"
+
msgid "instance completed"
msgid_plural "instances completed"
msgstr[0] "instanță finalizată"
@@ -39917,7 +40484,7 @@ msgid "is"
msgstr "este"
msgid "is already associated to a GitLab Issue. New issue will not be associated."
-msgstr ""
+msgstr "este deja asociat cu o problemă GitLab. Noua problemă nu va fi asociată."
msgid "is an invalid IP address range"
msgstr "este un interval de adrese IP invalide"
@@ -39938,22 +40505,25 @@ msgid "is not"
msgstr "nu este"
msgid "is not a descendant of the Group owning the template"
-msgstr ""
+msgstr "nu este descendent al grupului care deține șablonul"
msgid "is not a valid X509 certificate."
msgstr "nu este un certificat X509 valid."
-msgid "is not allowed since the group is not top-level group."
-msgstr "nu este permis, deoarece grupul nu este un grup de nivel superior."
+msgid "is not allowed for sign-up."
+msgstr ""
-msgid "is not allowed. Try again with a different email address, or contact your GitLab admin."
+msgid "is not allowed for this group."
msgstr ""
-msgid "is not allowed. We do not currently support project-level iterations"
+msgid "is not allowed for this project."
msgstr ""
-msgid "is not from an allowed domain."
-msgstr "nu provine dintr-un domeniu permis."
+msgid "is not allowed since the group is not top-level group."
+msgstr "nu este permis, deoarece grupul nu este un grup de nivel superior."
+
+msgid "is not allowed. We do not currently support project-level iterations"
+msgstr ""
msgid "is not in the group enforcing Group Managed Account"
msgstr ""
@@ -39977,7 +40547,7 @@ msgid "is too long (maximum is 1000 entries)"
msgstr ""
msgid "issue"
-msgstr ""
+msgstr "problemă"
msgid "issues at risk"
msgstr ""
@@ -40004,25 +40574,25 @@ msgid "it is too large"
msgstr "este prea mare"
msgid "jigsaw is not defined"
-msgstr ""
+msgstr "jigsaw nu este definit"
msgid "kuromoji custom analyzer"
msgstr "analizor personalizat kuromoji"
msgid "last commit:"
-msgstr ""
+msgstr "ultimul commit:"
msgid "latest"
msgstr ""
msgid "latest deployment"
-msgstr ""
+msgstr "ultima implementare"
msgid "latest version"
-msgstr ""
+msgstr "ultima versiune"
msgid "leave %{group_name}"
-msgstr ""
+msgstr "părăsiți %{group_name}"
msgid "less than a minute"
msgstr "mai putin de un minut"
@@ -40045,20 +40615,23 @@ msgstr "blocat de %{path_lock_user_name} %{created_at}"
msgid "log in"
msgstr "autentificare"
+msgid "managed"
+msgstr ""
+
msgid "manual"
msgstr "manual"
msgid "math|Displaying this math block may cause performance issues on this page"
-msgstr ""
+msgstr "Afișarea acestui bloc matematic poate cauza probleme de performanță pe această pagină"
msgid "math|There was an error rendering this math block"
msgstr ""
msgid "merge request"
msgid_plural "merge requests"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "merge request"
+msgstr[1] "merge request-uri"
+msgstr[2] "merge request-urile"
msgid "merged %{timeAgo}"
msgstr ""
@@ -40076,16 +40649,16 @@ msgid "most recent deployment"
msgstr ""
msgid "mrWidgetCommitsAdded|%{commitCount} and %{mergeCommitCount} will be added to %{targetBranch}."
-msgstr ""
+msgstr "%{commitCount} și %{mergeCommitCount} vor fi adăugate la %{targetBranch}."
msgid "mrWidgetCommitsAdded|%{commitCount} will be added to %{targetBranch}."
-msgstr ""
+msgstr "%{commitCount} va fi adăugat la %{targetBranch}."
msgid "mrWidgetCommitsAdded|1 merge commit"
-msgstr ""
+msgstr "1 merge commit"
msgid "mrWidgetNothingToMerge|This merge request contains no changes."
-msgstr ""
+msgstr "Acest merge request nu conține modificări."
msgid "mrWidgetNothingToMerge|Use merge requests to propose changes to your project and discuss them with your team. To make changes, push a commit or edit this merge request to use a different branch. With %{linkStart}CI/CD%{linkEnd}, automatically test your changes before merging."
msgstr ""
@@ -40093,26 +40666,29 @@ msgstr ""
msgid "mrWidget| Please restore it or use a different %{missingBranchName} branch"
msgstr ""
-msgid "mrWidget|%{mergeError}."
+msgid "mrWidget|%{linkStart}Set up now%{linkEnd} to analyze your source code for known security vulnerabilities."
msgstr ""
+msgid "mrWidget|%{mergeError}."
+msgstr "%{mergeError}."
+
msgid "mrWidget|%{mergeError}. Try again."
-msgstr ""
+msgstr "%{mergeError}. Încercați din nou."
msgid "mrWidget|%{metricsLinkStart} Memory %{metricsLinkEnd} usage %{emphasisStart} decreased %{emphasisEnd} from %{memoryFrom}MB to %{memoryTo}MB"
-msgstr ""
+msgstr "%{metricsLinkStart} Memoria %{metricsLinkEnd} utilizată %{emphasisStart} a scăzut %{emphasisEnd} de la %{memoryFrom}MB la %{memoryTo}MB"
msgid "mrWidget|%{metricsLinkStart} Memory %{metricsLinkEnd} usage %{emphasisStart} increased %{emphasisEnd} from %{memoryFrom}MB to %{memoryTo}MB"
-msgstr ""
+msgstr "%{metricsLinkStart} Memoria %{metricsLinkEnd} utilizată %{emphasisStart} a crescut %{emphasisEnd} de la %{memoryFrom}MB la %{memoryTo}MB"
msgid "mrWidget|%{metricsLinkStart} Memory %{metricsLinkEnd} usage is %{emphasisStart} unchanged %{emphasisEnd} at %{memoryFrom}MB"
-msgstr ""
+msgstr "%{metricsLinkStart} Memoria %{metricsLinkEnd} utilizată este %{emphasisStart} neschimbată %{emphasisEnd} la %{memoryFrom}MB"
msgid "mrWidget|%{prefixToLinkStart}No pipeline%{prefixToLinkEnd} %{addPipelineLinkStart}Add the .gitlab-ci.yml file%{addPipelineLinkEnd} to create one."
-msgstr ""
+msgstr "%{prefixToLinkStart}Fără pipeline%{prefixToLinkEnd} %{addPipelineLinkStart}Adaugați fișierul .gitlab-ci.yml%{addPipelineLinkEnd} pentru a crea unul."
msgid "mrWidget|A new merge train has started and this merge request is the first of the queue."
-msgstr ""
+msgstr "Un nou merge train a început și acest merge request este primul în coada de așteptare."
msgid "mrWidget|Added to the merge train by %{merge_author}"
msgstr "Adăugat la merge train de %{merge_author}"
@@ -40121,19 +40697,19 @@ msgid "mrWidget|Added to the merge train. There are %{mergeTrainPosition} merge
msgstr ""
msgid "mrWidget|An error occurred while removing your approval."
-msgstr ""
+msgstr "A apărut o eroare la eliminarea aprobării."
msgid "mrWidget|An error occurred while retrieving approval data for this merge request."
msgstr ""
msgid "mrWidget|An error occurred while submitting your approval."
-msgstr ""
+msgstr "A apărut o eroare la trimiterea aprobării."
msgid "mrWidget|Approval is optional"
msgstr "Aprobarea este opțională"
msgid "mrWidget|Approval password is invalid."
-msgstr ""
+msgstr "Parola de aprobare nu este validă."
msgid "mrWidget|Approve"
msgstr "Aprobați"
@@ -40151,16 +40727,16 @@ msgid "mrWidget|Cancel auto-merge"
msgstr "Anulați auto-îmbinarea"
msgid "mrWidget|Check out branch"
-msgstr ""
+msgstr "Verificați ramura"
msgid "mrWidget|Checking if merge request can be merged…"
msgstr ""
msgid "mrWidget|Cherry-pick"
-msgstr ""
+msgstr "Cherry-pick"
msgid "mrWidget|Cherry-pick this merge request in a new merge request"
-msgstr ""
+msgstr "Cherry-pick acest merge request într-un nou merge request"
msgid "mrWidget|Closed"
msgstr "ÃŽnchis"
@@ -40174,21 +40750,30 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
-msgid "mrWidget|Delete source branch"
+msgid "mrWidget|Create issue to resolve all threads"
msgstr ""
+msgid "mrWidget|Delete source branch"
+msgstr "Ștergeți ramura sursă"
+
msgid "mrWidget|Deployment statistics are not available currently"
msgstr ""
msgid "mrWidget|Did not close"
msgstr ""
+msgid "mrWidget|Dismiss"
+msgstr ""
+
msgid "mrWidget|Email patches"
msgstr ""
msgid "mrWidget|Failed to load deployment statistics"
msgstr ""
+msgid "mrWidget|Hide %{widget} details"
+msgstr ""
+
msgid "mrWidget|If the %{missingBranchName} branch exists in your local repository, you can merge this merge request manually using the command line"
msgstr ""
@@ -40196,13 +40781,13 @@ msgid "mrWidget|If the last pipeline ran in the fork project, it may be inaccura
msgstr ""
msgid "mrWidget|Jump to first unresolved thread"
-msgstr ""
+msgstr "Salt la primul subiect nerezolvat"
msgid "mrWidget|Loading deployment statistics"
msgstr ""
msgid "mrWidget|Mark as ready"
-msgstr ""
+msgstr "Marcați ca fiind gata"
msgid "mrWidget|Members who can merge are allowed to add commits."
msgstr ""
@@ -40232,7 +40817,7 @@ msgid "mrWidget|Merge locally"
msgstr ""
msgid "mrWidget|Merge request approved."
-msgstr ""
+msgstr "Merge request aprobat."
msgid "mrWidget|Merged by"
msgstr ""
@@ -40259,7 +40844,7 @@ msgid "mrWidget|More information"
msgstr "Mai multe informații"
msgid "mrWidget|Open in Gitpod"
-msgstr ""
+msgstr "Deschideți în Gitpod"
msgid "mrWidget|Open in Web IDE"
msgstr "Deschideți în Web IDE"
@@ -40280,16 +40865,13 @@ msgid "mrWidget|Refreshing now"
msgstr ""
msgid "mrWidget|Remove from merge train"
-msgstr ""
+msgstr "Eliminați din merge train"
msgid "mrWidget|Request to merge"
msgstr ""
-msgid "mrWidget|Resolve all threads in new issue"
-msgstr ""
-
msgid "mrWidget|Resolve conflicts"
-msgstr ""
+msgstr "Rezolvați conflictele"
msgid "mrWidget|Resolve these conflicts or ask someone with write access to this repository to merge it locally"
msgstr ""
@@ -40303,15 +40885,21 @@ msgstr ""
msgid "mrWidget|Revoke approval"
msgstr "Revocați aprobarea"
+msgid "mrWidget|SAST and Secret Detection is not enabled."
+msgstr ""
+
msgid "mrWidget|Set by %{merge_author} to be added to the merge train when the pipeline succeeds"
msgstr "Setat de %{merge_author} pentru a fi adăugat merge train-ului automat când conducta reușește"
msgid "mrWidget|Set by %{merge_author} to be merged automatically when the pipeline succeeds"
-msgstr ""
+msgstr "Setat de %{merge_author} pentru a fi îmbinat automat când pipeline-ul reușește"
msgid "mrWidget|Set by %{merge_author} to start a merge train when the pipeline succeeds"
msgstr "Setat de %{merge_author} pentru a începe un merge train când conducta reușește"
+msgid "mrWidget|Show %{widget} details"
+msgstr ""
+
msgid "mrWidget|The changes were merged into"
msgstr ""
@@ -40324,35 +40912,38 @@ msgstr ""
msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure, or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
msgstr ""
-msgid "mrWidget|The source branch has been deleted"
+msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure."
msgstr ""
+msgid "mrWidget|The source branch has been deleted"
+msgstr "Ramura sursă a fost ștearsă"
+
msgid "mrWidget|The source branch is %{link} the target branch"
-msgstr ""
+msgstr "Ramura sursă este %{link} ramura țintă"
msgid "mrWidget|The source branch is being deleted"
-msgstr ""
+msgstr "Ramura sursă este ștearsă"
msgid "mrWidget|The source branch will be deleted"
-msgstr ""
+msgstr "Ramura sursă va fi ștearsă"
msgid "mrWidget|The source branch will not be deleted"
-msgstr ""
+msgstr "Ramura sursă nu va fi ștearsă"
msgid "mrWidget|There are merge conflicts"
-msgstr ""
+msgstr "Există conflicte de îmbinare"
msgid "mrWidget|This action will add the merge request to the merge train when pipeline %{pipelineLink} succeeds."
-msgstr ""
+msgstr "Această acțiune va adăuga merge request-ul la merge train când pipeline-ul %{pipelineLink} reușește."
msgid "mrWidget|This action will start a merge train when pipeline %{pipelineLink} succeeds."
-msgstr ""
+msgstr "Această acțiune va începe un merge train când pipeline-ul %{pipelineLink} reușește."
msgid "mrWidget|This merge request failed to be merged automatically"
-msgstr ""
+msgstr "Acest merge request nu a reușit să fie îmbinat automat"
msgid "mrWidget|This project is archived, write access has been disabled"
-msgstr ""
+msgstr "Acest proiect este arhivat, accesul la scriere a fost dezactivat"
msgid "mrWidget|To approve this merge request, please enter your password. This project requires all approvals to be authenticated."
msgstr ""
@@ -40361,19 +40952,22 @@ msgid "mrWidget|To merge, a Jira issue key must be mentioned in the title or des
msgstr ""
msgid "mrWidget|Use %{linkStart}CI pipelines to test your code%{linkEnd} by simply adding a GitLab CI configuration file to your project. It only takes a minute to make your code more secure and robust."
-msgstr ""
+msgstr "Folosiți %{linkStart}pipeline-uri CI în codul dvs.%{linkEnd} prin simpla adăugare a fișierului de configurare GitLab CI la proiectul dvs. Este nevoie doar de un minut pentru a face codul dvs. mai sigur și mai robust."
msgid "mrWidget|You can merge after removing denied licenses"
msgstr ""
-msgid "mrWidget|Your password"
+msgid "mrWidget|You can only merge once this merge request is approved."
msgstr ""
+msgid "mrWidget|Your password"
+msgstr "Parola dvs."
+
msgid "mrWidget|branch does not exist."
msgstr "ramura nu există."
msgid "mrWidget|into"
-msgstr ""
+msgstr "în"
msgid "must be a Debian package"
msgstr "trebuie să fie un pachet Debian"
@@ -40382,16 +40976,16 @@ msgid "must be a boolean value"
msgstr "trebuie să fie o valoare booleană"
msgid "must be a root namespace"
-msgstr ""
+msgstr "trebuie să fie un spațiu de nume rădăcină"
msgid "must be a valid IPv4 or IPv6 address"
msgstr "trebuie să fie o adresă IPv4 sau IPv6 validă"
msgid "must be after start"
-msgstr ""
+msgstr "trebuie să fie după start"
msgid "must be an email you have verified"
-msgstr ""
+msgstr "trebuie să fie un e-mail verificat"
msgid "must be greater than start date"
msgstr "trebuie să fie mai mare decât data de începere"
@@ -40402,11 +40996,14 @@ msgstr ""
msgid "must be less than the limit of %{tag_limit} tags"
msgstr ""
+msgid "must be set for a project namespace"
+msgstr ""
+
msgid "must be unique by status and elapsed time within a policy"
msgstr ""
msgid "my-awesome-group"
-msgstr ""
+msgstr "grupul-meu-minunat"
msgid "my-channel"
msgstr "canalul meu"
@@ -40427,10 +41024,10 @@ msgid "never expires"
msgstr "nu expiră niciodată"
msgid "new merge request"
-msgstr ""
+msgstr "merge request nou"
msgid "no approvers"
-msgstr ""
+msgstr "fără aprobatori"
msgid "no expiration"
msgstr ""
@@ -40463,7 +41060,7 @@ msgid "nounSeries|%{item}, and %{lastItem}"
msgstr "%{item} și %{lastItem}"
msgid "on track"
-msgstr ""
+msgstr "în grafic"
msgid "only available on top-level groups."
msgstr ""
@@ -40482,15 +41079,15 @@ msgstr ""
msgid "out of %d total test"
msgid_plural "out of %d total tests"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "din %d test total"
+msgstr[1] "din %d teste totale"
+msgstr[2] "din %d teste totale"
msgid "parent"
msgid_plural "parents"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "părinte"
+msgstr[1] "părinți"
+msgstr[2] "părinții"
msgid "password"
msgstr "parolă"
@@ -40505,25 +41102,28 @@ msgid "per day"
msgstr "pe zi"
msgid "personal access token"
-msgstr ""
+msgstr "token acces personal"
msgid "personal access tokens"
msgstr ""
msgid "pipeline"
+msgstr "pipeline"
+
+msgid "pipeline schedules documentation"
msgstr ""
msgid "pod_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
-msgstr ""
+msgstr "pod_name poate conține doar litere mici, cifre, '-' și '.' și trebuie să înceapă și să se termine cu un caracter alfanumeric."
msgid "pod_name cannot be larger than %{max_length} chars"
-msgstr ""
+msgstr "pod_name nu poate fi mai mare de %{max_length} caractere"
msgid "point"
msgid_plural "points"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "punct"
+msgstr[1] "puncte"
+msgstr[2] "puncte"
msgid "previously merged commits"
msgstr ""
@@ -40550,7 +41150,7 @@ msgid "project access tokens"
msgstr ""
msgid "project avatar"
-msgstr ""
+msgstr "avatar proiect"
msgid "project bots cannot be added to other groups / projects"
msgstr ""
@@ -40562,6 +41162,9 @@ msgid "project members"
msgstr "membrii proiectului"
msgid "project name"
+msgstr "numele proiectului"
+
+msgid "project namespace cannot be the parent of another namespace"
msgstr ""
msgid "projects"
@@ -40570,26 +41173,32 @@ msgstr "proiecte"
msgid "quick actions"
msgstr "acțiuni rapide"
-msgid "reCAPTCHA Private Key"
-msgstr "cheie privată reCAPTCHA"
+msgid "reCAPTCHA"
+msgstr ""
+
+msgid "reCAPTCHA helps prevent credential stuffing."
+msgstr ""
+
+msgid "reCAPTCHA private key"
+msgstr ""
-msgid "reCAPTCHA Site Key"
-msgstr "cheia site-ului reCAPTCHA"
+msgid "reCAPTCHA site key"
+msgstr ""
msgid "recent activity"
msgstr "activitate recentă"
msgid "register"
-msgstr ""
+msgstr "înregistrare"
msgid "relates to"
msgstr "se referă la"
msgid "remaining"
-msgstr ""
+msgstr "rămase"
msgid "remove"
-msgstr ""
+msgstr "elimină"
msgid "remove due date"
msgstr ""
@@ -40619,7 +41228,7 @@ msgid "repository:"
msgstr "repozitoriu:"
msgid "required"
-msgstr ""
+msgstr "necesar"
msgid "reset it."
msgstr "resetați-l."
@@ -40634,7 +41243,7 @@ msgid "scan-execution-policy: policy not applied, %{policy_path} file is missing
msgstr ""
msgid "security Reports|There was an error creating the merge request"
-msgstr ""
+msgstr "A apărut o eroare la crearea merge request-ului"
msgid "severity|Blocker"
msgstr ""
@@ -40670,16 +41279,16 @@ msgid "should be an array of %{object_name} objects"
msgstr ""
msgid "should be greater than or equal to %{access} inherited membership from group %{group_name}"
-msgstr ""
+msgstr "ar trebui să fie mai mare sau egală cu %{access} membri moșteniți din grupul %{group_name}"
msgid "show %{count} more"
msgstr ""
msgid "show fewer"
-msgstr ""
+msgstr "arată mai puține"
msgid "show less"
-msgstr ""
+msgstr "arată mai puțin"
msgid "sign in"
msgstr "autentificare"
@@ -40721,13 +41330,13 @@ msgid "success"
msgstr "succes"
msgid "suggestPipeline|1/2: Choose a template"
-msgstr ""
+msgstr "1/2: Alegeți un șablon"
msgid "suggestPipeline|2/2: Commit your changes"
-msgstr ""
+msgstr "2/2: Commit modificările dvs."
msgid "suggestPipeline|Choose %{boldStart}Code Quality%{boldEnd} to add a pipeline that tests the quality of your code."
-msgstr ""
+msgstr "Alegeți %{boldStart}Calitate Cod%{boldEnd} pentru a adăuga un pipeline care testează calitatea codului dvs."
msgid "suggestPipeline|The template is ready! You can now commit it to create your first pipeline."
msgstr ""
@@ -40736,7 +41345,7 @@ msgid "suggestPipeline|We’re adding a GitLab CI configuration file to add a pi
msgstr ""
msgid "tag name"
-msgstr ""
+msgstr "nume etichetă"
msgid "the correct format."
msgstr "formatul corect."
@@ -40763,7 +41372,7 @@ msgid "this issue cannot be made public since it belongs to a confidential epic"
msgstr "această problemă nu poate fi făcută publică deoarece aparține unui epic confidențial"
msgid "time summary"
-msgstr ""
+msgstr "sumar timp"
msgid "toggle collapse"
msgstr ""
@@ -40778,13 +41387,13 @@ msgid "two-factor authentication settings"
msgstr "setări de autentificare cu doi factori"
msgid "type must be Debian"
-msgstr ""
+msgstr "tipul trebuie să fie Debian"
msgid "type parameter is missing and is required"
msgstr "parametrul tipului lipsește și este necesar"
msgid "unicode domains should use IDNA encoding"
-msgstr ""
+msgstr "domeniile unicode ar trebui să utilizeze codificarea IDNA"
msgid "updated"
msgstr ""
@@ -40799,6 +41408,9 @@ msgid "uploads"
msgstr "încărcări"
msgid "user avatar"
+msgstr "avatar utilizator"
+
+msgid "user namespace cannot be the parent of another namespace"
msgstr ""
msgid "user preferences"
@@ -40811,10 +41423,10 @@ msgid "v%{version} published %{timeAgo}"
msgstr ""
msgid "value for '%{storage}' must be an integer"
-msgstr ""
+msgstr "valoarea pentru '%{storage}' trebuie să fie un număr întreg"
msgid "value for '%{storage}' must be between 0 and 100"
-msgstr ""
+msgstr "valoarea pentru '%{storage}' trebuie să fie între 0 și 100"
msgid "verify ownership"
msgstr ""
@@ -40823,13 +41435,13 @@ msgid "version %{versionIndex}"
msgstr "versiunea %{versionIndex}"
msgid "via %{closed_via}"
-msgstr ""
+msgstr "prin %{closed_via}"
msgid "via merge request %{link}"
-msgstr ""
+msgstr "prin merge request %{link}"
msgid "view it on GitLab"
-msgstr ""
+msgstr "vizualizați-l pe GitLab"
msgid "view the blob"
msgstr "vizualizați blob-ul"
@@ -40856,22 +41468,22 @@ msgid "vulnerability|Add comment"
msgstr "Adăugați comentariu"
msgid "vulnerability|Add comment & dismiss"
-msgstr ""
+msgstr "Adăugați comentariu & respingeți"
msgid "vulnerability|Add comment and dismiss"
-msgstr ""
+msgstr "Adăugați comentariu și respingeți"
msgid "vulnerability|Dismiss vulnerability"
-msgstr ""
+msgstr "Respingeți vulnerabilitatea"
msgid "vulnerability|Save comment"
msgstr "Salvați comentariul"
msgid "vulnerability|Undo dismiss"
-msgstr ""
+msgstr "Anulați respingerea"
msgid "vulnerability|dismissed"
-msgstr ""
+msgstr "respins"
msgid "was scheduled to merge after pipeline succeeds by"
msgstr ""
@@ -40883,10 +41495,10 @@ msgid "with %{additions} additions, %{deletions} deletions."
msgstr ""
msgid "with expiry changing from %{old_expiry} to %{new_expiry}"
-msgstr ""
+msgstr "cu expirarea schimbării de la %{old_expiry} la %{new_expiry}"
msgid "with expiry remaining unchanged at %{old_expiry}"
-msgstr ""
+msgstr "cu expirarea rămânând neschimbată la %{old_expiry}"
msgid "yaml invalid"
msgstr "yaml invalid"
@@ -40894,3 +41506,9 @@ msgstr "yaml invalid"
msgid "your settings"
msgstr "setările dvs."
+msgid "{group}"
+msgstr ""
+
+msgid "{project}"
+msgstr ""
+
diff --git a/locale/ru/gitlab.po b/locale/ru/gitlab.po
index eb56db731af..37ea3766125 100644
--- a/locale/ru/gitlab.po
+++ b/locale/ru/gitlab.po
@@ -14,10 +14,7 @@ msgstr ""
"X-Crowdin-Language: ru\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-09-01 22:34\n"
-
-msgid " %{name}, confirm your email address now! "
-msgstr ""
+"PO-Revision-Date: 2021-10-04 20:22\n"
msgid " %{start} to %{end}"
msgstr " %{start} по %{end}"
@@ -96,6 +93,20 @@ msgstr "Параметр \"el\" необходим Ð´Ð»Ñ createInstance()"
msgid "#general, #development"
msgstr ""
+msgid "%d Alert"
+msgid_plural "%d Alerts"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
+msgid "%d Alert:"
+msgid_plural "%d Alerts:"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "%d Approval"
msgid_plural "%d Approvals"
msgstr[0] "%d ÑоглаÑование"
@@ -486,10 +497,10 @@ msgstr[3] ""
msgid "%d token has expired"
msgid_plural "%d tokens have expired"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
+msgstr[0] "%d токен проÑрочен"
+msgstr[1] "%d токена проÑрочены"
+msgstr[2] "%d токенов проÑрочено"
+msgstr[3] "%d токенов проÑрочено"
msgid "%d unassigned issue"
msgid_plural "%d unassigned issues"
@@ -591,8 +602,11 @@ msgstr ""
msgid "%{code_open}Protected:%{code_close} Only exposed to protected branches or tags."
msgstr ""
-msgid "%{commit_author_link} authored %{commit_timeago}"
-msgstr "%{commit_author_link} Ñоздал %{commit_timeago}"
+msgid "%{commit_author_link} authored %{commit_authored_timeago}"
+msgstr ""
+
+msgid "%{commit_author_link} authored %{commit_authored_timeago} and %{commit_committer_avatar} %{commit_committer_link} committed %{commit_committer_timeago}"
+msgstr ""
msgid "%{completedCount} completed weight"
msgstr ""
@@ -695,6 +709,15 @@ msgstr ""
msgid "%{doc_link_start}Advanced search%{doc_link_end} is enabled."
msgstr ""
+msgid "%{docs_link_start}Learn about visibility levels.%{docs_link_end}"
+msgstr ""
+
+msgid "%{docs_link_start}What is Large File Storage?%{docs_link_end}"
+msgstr ""
+
+msgid "%{docs_link_start}What is two-factor authentication?%{docs_link_end}"
+msgstr ""
+
msgid "%{due_date} (Past due)"
msgstr ""
@@ -767,9 +790,6 @@ msgstr "%{issuableType} будет удален! Вы уверены?"
msgid "%{issueType} actions"
msgstr ""
-msgid "%{issuesCount} issues with a limit of %{maxIssueCount}"
-msgstr ""
-
msgid "%{issuesSize} with a limit of %{maxIssueCount}"
msgstr ""
@@ -827,6 +847,12 @@ msgstr ""
msgid "%{label_for_message} unavailable"
msgstr "%{label_for_message} недоÑтупно"
+msgid "%{learn_more_link}."
+msgstr ""
+
+msgid "%{lessThan} 1 hour"
+msgstr ""
+
msgid "%{lets_encrypt_link_start}Let's Encrypt%{lets_encrypt_link_end} is a free, automated, and open certificate authority (CA) that issues digital certificates to enable HTTPS (SSL/TLS) for sites."
msgstr ""
@@ -839,15 +865,15 @@ msgstr "%{level_name} запрещено, Ñ‚.к. проект-иÑточник Ð
msgid "%{link_start}Learn more%{link_end} about roles."
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
-msgstr "%{link_start}Узнайте больше%{link_end} о том, ÐºÐ°ÐºÐ°Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¿ÐµÑ€ÐµÐ´Ð°ÐµÑ‚ÑÑ GitLab Inc."
-
msgid "%{link_start}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} из заголовка, чтобы позволить Ñтому запроÑу на ÑлиÑние выполнитьÑÑ Ð¿Ñ€Ð¸ готовноÑти."
msgid "%{link_start}Start the title with %{draft_snippet}%{link_end} to prevent a merge request that is a work in progress from being merged before it's ready."
msgstr "%{link_start}Ðачните заголовок Ñ %{draft_snippet}%{link_end} чтобы предотвратить выполнение запроÑа на ÑлиÑние, который находитÑÑ Ð² процеÑÑе обработки."
+msgid "%{link_start}What information does GitLab Inc. collect?%{link_end}"
+msgstr ""
+
msgid "%{listToShow}, and %{awardsListLength} more"
msgstr ""
@@ -1008,7 +1034,7 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-msgid "%{service_ping_link_start}Learn more%{service_ping_link_end} about what information is shared with GitLab Inc."
+msgid "%{service_ping_link_start}What information is shared with GitLab Inc.?%{service_ping_link_end}"
msgstr ""
msgid "%{size} %{unit}"
@@ -1044,6 +1070,9 @@ msgstr "%{start} по %{end}"
msgid "%{state} epics"
msgstr "%{state} цели"
+msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
+msgstr ""
+
msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
msgstr ""
@@ -1117,13 +1146,6 @@ msgstr "%{tag}-%{evidence}-%{filename}"
msgid "%{template_project_id} is unknown or invalid"
msgstr "%{template_project_id}' неизвеÑтен или недейÑтвителен"
-msgid "%{text} %{files}"
-msgid_plural "%{text} %{files} files"
-msgstr[0] "%{text} %{files}"
-msgstr[1] "%{text} %{files} файлов"
-msgstr[2] "%{text} %{files} файлов"
-msgstr[3] "%{text} %{files} файлов"
-
msgid "%{text} is available"
msgstr "%{text} доÑтупен"
@@ -1208,9 +1230,6 @@ msgstr ""
msgid "%{wildcards_link_start}Wildcards%{wildcards_link_end} such as %{code_tag_start}v*%{code_tag_end} or %{code_tag_start}*-release%{code_tag_end} are supported."
msgstr ""
-msgid "&lt; 1 hour"
-msgstr "&lt; 1 чаÑ"
-
msgid "'%{data}' at %{location} does not match format: %{format}"
msgstr ""
@@ -1296,9 +1315,6 @@ msgstr "(отозван)"
msgid "(we need your current password to confirm your changes)"
msgstr ""
-msgid "* * * * *"
-msgstr "* * * * *"
-
msgid "+ %{amount} more"
msgstr "+%{amount} ещё"
@@ -1371,12 +1387,12 @@ msgstr "- Ñвернуть"
msgid "."
msgstr ""
+msgid "/"
+msgstr ""
+
msgid "0 bytes"
msgstr "0 байт"
-msgid "0 for unlimited, only effective with remote storage enabled."
-msgstr ""
-
msgid "0t1DgySidms"
msgstr ""
@@ -1550,6 +1566,9 @@ msgstr "10-19 ÑодейÑтвий"
msgid "1000+"
msgstr ""
+msgid "192.168.0.0/24"
+msgstr ""
+
msgid "1st contribution!"
msgstr "Первый вклад!"
@@ -1703,9 +1722,6 @@ msgstr "ÐÐµÐºÐ¾Ð½Ñ„Ð¸Ð´ÐµÐ½Ñ†Ð¸Ð°Ð»ÑŒÐ½Ð°Ñ Ñ†ÐµÐ»ÑŒ не может иметь
msgid "A plain HTML site that uses Netlify for CI/CD instead of GitLab, but still with all the other great GitLab features"
msgstr ""
-msgid "A plain-text response to show to clients that hit the rate limit."
-msgstr ""
-
msgid "A platform value can be web, mob or app."
msgstr ""
@@ -1787,7 +1803,7 @@ msgstr "Ðе удалоÑÑŒ Ñоздать Ñниппет. Попробуйте
msgid "APIFuzzing|Configure HTTP basic authentication values. Other authentication methods are supported. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
+msgid "APIFuzzing|Customize your project's API fuzzing configuration options and copy the code snippet to your .gitlab-ci.yml file to apply any changes. Note that this tool does not reflect or update your .gitlab-ci.yml file automatically. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
msgstr ""
msgid "APIFuzzing|Enable authentication"
@@ -1850,9 +1866,6 @@ msgstr ""
msgid "APIFuzzing|To prevent a security leak, authentication info must be added as a %{ciVariablesLinkStart}CI variable%{ciVariablesLinkEnd}. As a user with maintainer access rights, you can manage CI variables in the %{ciSettingsLinkStart}Settings%{ciSettingsLinkEnd} area."
msgstr ""
-msgid "APIFuzzing|Use this tool to generate API fuzzing configuration YAML to copy into your .gitlab-ci.yml file. This tool does not reflect or update your .gitlab-ci.yml file automatically."
-msgstr ""
-
msgid "APIFuzzing|Username for basic authentication"
msgstr ""
@@ -1904,9 +1917,6 @@ msgstr "Жалобы"
msgid "Abuse reports notification email"
msgstr "Ð­Ð»ÐµÐºÑ‚Ñ€Ð¾Ð½Ð½Ð°Ñ Ð¿Ð¾Ñ‡Ñ‚Ð° Ð´Ð»Ñ ÑƒÐ²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ð¹ о нарушениÑÑ…"
-msgid "Abuse reports will be sent to this address if it is set. Abuse reports are always available in the admin area."
-msgstr "Отчёты о нарушениÑÑ… будут отправлены на Ñтот адреÑ, еÑли он уÑтановлен. Отчёты о нарушениÑÑ… вÑегда доÑтупны в панели админиÑтратора."
-
msgid "Accept invitation"
msgstr "ПринÑÑ‚ÑŒ приглашение"
@@ -1943,12 +1953,18 @@ msgstr "ДоÑтуп запрещен. Проверьте Ñвой уровенÑ
msgid "Access granted"
msgstr ""
+msgid "Access key ID"
+msgstr ""
+
msgid "Access requests"
msgstr ""
msgid "Access to '%{classification_label}' not allowed"
msgstr "ДоÑтуп к '%{classification_label}' не разрешён"
+msgid "Access tokens expire after 2 hours. A refresh token may be used at any time to generate a new access token. Non-expiring access tokens are deprecated. Clear this setting to enable backward compatibility."
+msgstr ""
+
msgid "AccessDropdown|Deploy Keys"
msgstr ""
@@ -2261,6 +2277,9 @@ msgstr "Добавить новое приложение"
msgid "Add new directory"
msgstr "Добавить новый каталог"
+msgid "Add new service account"
+msgstr ""
+
msgid "Add or remove previously merged commits"
msgstr "Добавить или удалить коммиты, Ñлитые ранее"
@@ -2498,6 +2517,9 @@ msgstr "Developer"
msgid "AdminArea|Features"
msgstr ""
+msgid "AdminArea|Get security updates from GitLab and stay up to date"
+msgstr ""
+
msgid "AdminArea|Groups"
msgstr ""
@@ -2537,6 +2559,12 @@ msgstr ""
msgid "AdminArea|Reporter"
msgstr "Reporter"
+msgid "AdminArea|Sign up for the GitLab Security Newsletter to get notified for security updates."
+msgstr ""
+
+msgid "AdminArea|Sign up for the GitLab newsletter"
+msgstr ""
+
msgid "AdminArea|Stop all jobs"
msgstr "ОÑтановить вÑе заданиÑ"
@@ -2606,9 +2634,15 @@ msgstr ""
msgid "AdminSettings|Disable public access to Pages sites"
msgstr ""
+msgid "AdminSettings|Display a banner on merge requests in projects with no pipelines to initiate steps to add a .gitlab-ci.yml file."
+msgstr ""
+
msgid "AdminSettings|Domain verification is an essential security measure for public GitLab sites. Users are required to demonstrate they control a domain before it is enabled. %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "AdminSettings|Enable pipeline suggestion banner"
+msgstr ""
+
msgid "AdminSettings|Enable shared runners for new projects"
msgstr "ИÑпользовать общие Runner'Ñ‹ в новых проектах"
@@ -2676,7 +2710,7 @@ msgid "AdminSettings|The latest artifacts for all jobs in the most recent succes
msgstr ""
msgid "AdminSettings|The projects in this group can be selected as templates for new projects created on the instance. %{link_start}Learn more.%{link_end} "
-msgstr ""
+msgstr "Проекты в Ñтой группе могут быть выбраны в качеÑтве шаблонов Ð´Ð»Ñ Ð½Ð¾Ð²Ñ‹Ñ… проектов, Ñозданных в ÑкземплÑре. %{link_start}Подробнее.%{link_end} "
msgid "AdminSettings|The template for the required pipeline configuration can be one of the GitLab-provided templates, or a custom template added to an instance template repository. %{link_start}How do I create an instance template repository?%{link_end}"
msgstr ""
@@ -2691,7 +2725,7 @@ msgid "AdminStatistics|Issues"
msgstr "ОбÑуждениÑ"
msgid "AdminStatistics|Merge requests"
-msgstr ""
+msgstr "ЗапроÑÑ‹ на ÑлиÑние"
msgid "AdminStatistics|Milestones"
msgstr "Этапы"
@@ -3080,10 +3114,10 @@ msgstr ""
msgid "Admin|Quarterly reconciliation will occur on %{qrtlyDate}"
msgstr ""
-msgid "Admin|The number of max seats used for your namespace is currently exceeding the number of seats in your subscription. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgid "Admin|The number of max seats in your namespace exceeds the number of seats in your subscription. On %{qrtlyDate}, quarterly reconciliation occurs and you are automatically billed a prorated amount for the overage. No action is needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice. For more information about the timing of the invoicing process, view the documentation."
msgstr ""
-msgid "Admin|The number of maximum users for your instance is currently exceeding the number of users in license. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgid "Admin|The number of max users in your instance exceeds the number of users in your license. On %{qrtlyDate}, quarterly reconciliation occurs and you are automatically billed a prorated amount for the overage. No action is needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice. For more information about the timing of the invoicing process, view the documentation."
msgstr ""
msgid "Admin|View pending user approvals"
@@ -3104,9 +3138,6 @@ msgstr "Дополнительные наÑтройки"
msgid "Advanced export options"
msgstr ""
-msgid "Advanced permissions, Large File Storage and Two-Factor authentication settings."
-msgstr "Дополнительные разрешениÑ, хранилище больших файлов и наÑтройки двухфакторной аутентификации."
-
msgid "After a successful password update you will be redirected to login screen."
msgstr "ПоÑле уÑпешного Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð¿Ð°Ñ€Ð¾Ð»Ñ Ð²Ñ‹ будете перенаправлены на Ñкран входа в ÑиÑтему."
@@ -3125,15 +3156,14 @@ msgstr ""
msgid "After you've reviewed these contribution guidelines, you'll be all set to"
msgstr ""
+msgid "Akismet"
+msgstr ""
+
msgid "Akismet API Key"
msgstr ""
-msgid "Alert"
-msgid_plural "Alerts"
-msgstr[0] "Оповещение"
-msgstr[1] "ОповещениÑ"
-msgstr[2] "Оповещений"
-msgstr[3] "Оповещений"
+msgid "Akismet helps prevent the creation of spam issues in public projects."
+msgstr ""
msgid "AlertManagement|Acknowledged"
msgstr "Прочитано"
@@ -3489,6 +3519,9 @@ msgstr ""
msgid "All (default)"
msgstr "Ð’Ñе (по умолчанию)"
+msgid "All GitLab"
+msgstr ""
+
msgid "All Members"
msgstr "Ð’Ñе УчаÑтники"
@@ -3603,6 +3636,9 @@ msgstr ""
msgid "Allow this secondary node to replicate content on Object Storage"
msgstr ""
+msgid "Allow use of licensed EE features"
+msgstr ""
+
msgid "Allow users to dismiss the broadcast message"
msgstr "Разрешить пользователÑм закрыть Ñообщение"
@@ -3678,9 +3714,6 @@ msgstr ""
msgid "Amazon authentication is not %{link_start}correctly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr "ÐÑƒÑ‚ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ Amazon не %{link_start}наÑтроена%{link_end}. ОбратитеÑÑŒ к Ñвоему админиÑтратору GitLab, еÑли хотите иÑпользовать Ñту Ñлужбу."
-msgid "Amount of time (in hours) that users are allowed to skip forced configuration of two-factor authentication"
-msgstr "Ð’Ñ€ÐµÐ¼Ñ (в чаÑах), на которое пользователÑм позволено пропуÑкать принудительную наÑтройку двухфакторной аутентификации"
-
msgid "An %{link_start}alert%{link_end} with the same fingerprint is already open. To change the status of this alert, resolve the linked alert."
msgstr ""
@@ -3741,12 +3774,6 @@ msgstr "Произошла ошибка при предварительном п
msgid "An error occurred when removing the label."
msgstr ""
-msgid "An error occurred when toggling the notification subscription"
-msgstr "Произошла ошибка при переключении подпиÑки на оповещениÑ"
-
-msgid "An error occurred when updating the issue weight"
-msgstr "Произошла ошибка при обновлении приоритета обÑуждениÑ"
-
msgid "An error occurred when updating the title"
msgstr ""
@@ -3795,6 +3822,9 @@ msgstr ""
msgid "An error occurred while enabling Service Desk."
msgstr "Произошла ошибка при включении Ñлужбы поддержки."
+msgid "An error occurred while fetching Markdown preview"
+msgstr ""
+
msgid "An error occurred while fetching ancestors"
msgstr ""
@@ -3825,9 +3855,6 @@ msgstr "Произошла ошибка при получении задач."
msgid "An error occurred while fetching label colors."
msgstr "Произошла ошибка при получении цветов меток."
-msgid "An error occurred while fetching markdown preview"
-msgstr "Произошла ошибка при предварительном проÑмотре markdown"
-
msgid "An error occurred while fetching participants"
msgstr ""
@@ -3843,9 +3870,6 @@ msgstr ""
msgid "An error occurred while fetching reference"
msgstr ""
-msgid "An error occurred while fetching sidebar data"
-msgstr "Произошла ошибка при получении денег данных Ð´Ð»Ñ Ð±Ð¾ÐºÐ¾Ð²Ð¾Ð¹ панели"
-
msgid "An error occurred while fetching tags. Retry the search."
msgstr ""
@@ -3921,6 +3945,9 @@ msgstr "Произошла ошибка при загрузке обÑужден
msgid "An error occurred while loading merge requests."
msgstr "Произошла ошибка при загрузке запроÑов на ÑлиÑние."
+msgid "An error occurred while loading projects."
+msgstr ""
+
msgid "An error occurred while loading the Needs tab."
msgstr ""
@@ -4155,12 +4182,6 @@ msgstr "Любой автор"
msgid "Any Milestone"
msgstr ""
-msgid "Any branch"
-msgstr "Ð›ÑŽÐ±Ð°Ñ Ð²ÐµÑ‚ÐºÐ°"
-
-msgid "Any eligible user"
-msgstr "Любой подходÑщий пользователь"
-
msgid "Any encrypted tokens"
msgstr "Любые зашифрованные токены"
@@ -4179,6 +4200,9 @@ msgstr ""
msgid "Any namespace"
msgstr "Любое проÑтранÑтво имен"
+msgid "App Engine description and apps that are suitable for this deployment target"
+msgstr ""
+
msgid "App ID"
msgstr "ID приложениÑ"
@@ -4331,6 +4355,13 @@ msgstr "Применён"
msgid "Apply"
msgstr "Применить"
+msgid "Apply %d suggestion"
+msgid_plural "Apply %d suggestions"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "Apply a label"
msgstr "Применить метку"
@@ -4340,13 +4371,10 @@ msgstr "Применение шаблона"
msgid "Apply suggestion"
msgstr "Применить предложение"
-msgid "Apply suggestions"
-msgstr ""
-
msgid "Apply template"
msgstr "Применить шаблон"
-msgid "Apply this approval rule to any branch or a specific protected branch."
+msgid "Apply this approval rule to all branches or a specific protected branch."
msgstr ""
msgid "Applying"
@@ -4497,9 +4525,6 @@ msgstr ""
msgid "ApprovalSettings|Prevent editing approval rules in projects and merge requests."
msgstr ""
-msgid "ApprovalSettings|Prevent editing approval rules in projects and merge requests. "
-msgstr ""
-
msgid "ApprovalSettings|Remove all approvals when commits are added to the source branch."
msgstr ""
@@ -4515,6 +4540,9 @@ msgstr ""
msgid "ApprovalSettings|This setting is configured at the instance level and can only be changed by an administrator."
msgstr ""
+msgid "ApprovalSettings|This setting is configured in %{groupName} and can only be changed by an administrator or group owner."
+msgstr ""
+
msgid "ApprovalStatusTooltip|Adheres to separation of duties"
msgstr ""
@@ -5007,9 +5035,6 @@ msgstr "ÐÑƒÑ‚ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ GitHub"
msgid "Authenticated API rate limit period in seconds"
msgstr ""
-msgid "Authenticated API request rate limit"
-msgstr ""
-
msgid "Authenticated API requests"
msgstr ""
@@ -5019,10 +5044,10 @@ msgstr ""
msgid "Authenticated Git LFS request rate limit"
msgstr ""
-msgid "Authenticated web rate limit period in seconds"
+msgid "Authenticated Git LFS requests"
msgstr ""
-msgid "Authenticated web request rate limit"
+msgid "Authenticated web rate limit period in seconds"
msgstr ""
msgid "Authenticated web requests"
@@ -5400,9 +5425,6 @@ msgstr ""
msgid "Below you will find all the groups that are public."
msgstr "Ðиже показаны вÑе открытые группы."
-msgid "Beta"
-msgstr ""
-
msgid "Bi-weekly code coverage"
msgstr "Двухнедельное покрытие кода"
@@ -5644,6 +5666,21 @@ msgstr "Блог"
msgid "Board scope affects which issues are displayed for anyone who visits this board"
msgstr "ОблаÑÑ‚ÑŒ дейÑÑ‚Ð²Ð¸Ñ Ð´Ð¾Ñки влиÑет на то, какие задачи отображаютÑÑ Ð´Ð»Ñ Ð²Ñех, кто поÑещает Ñту доÑку"
+msgid "BoardNewEpic|Groups"
+msgstr ""
+
+msgid "BoardNewEpic|Loading groups"
+msgstr ""
+
+msgid "BoardNewEpic|No matching results"
+msgstr ""
+
+msgid "BoardNewEpic|Search groups"
+msgstr ""
+
+msgid "BoardNewEpic|Select a group"
+msgstr ""
+
msgid "BoardNewIssue|No matching results"
msgstr ""
@@ -5723,6 +5760,9 @@ msgstr ""
msgid "Boards|An error occurred while creating the list. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching child groups. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching group projects. Please try again."
msgstr ""
@@ -6057,6 +6097,9 @@ msgstr "РаÑпараллеливание маÑÑовых запроÑов"
msgid "Bulk update"
msgstr ""
+msgid "BulkImports|Re-import creates a new group. It does not sync with the existing group."
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -6066,6 +6109,9 @@ msgstr ""
msgid "BulkImport|From source group"
msgstr ""
+msgid "BulkImport|Group import history"
+msgstr ""
+
msgid "BulkImport|Import failed: Destination cannot be a subgroup of the source group. Change the destination and try again."
msgstr ""
@@ -6078,9 +6124,18 @@ msgstr ""
msgid "BulkImport|Importing the group failed"
msgstr ""
+msgid "BulkImport|Last imported to %{link}"
+msgstr ""
+
msgid "BulkImport|Name already exists."
msgstr ""
+msgid "BulkImport|New group"
+msgstr ""
+
+msgid "BulkImport|No history is available"
+msgstr ""
+
msgid "BulkImport|No parent"
msgstr ""
@@ -6093,6 +6148,9 @@ msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} matching filter \"%{filter}\" from %{link}"
msgstr ""
+msgid "BulkImport|Source group"
+msgstr ""
+
msgid "BulkImport|To new group"
msgstr ""
@@ -6102,6 +6160,9 @@ msgstr ""
msgid "BulkImport|You have no groups to import"
msgstr ""
+msgid "BulkImport|Your imported groups will appear here."
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -6346,6 +6407,9 @@ msgstr ""
msgid "Can be manually deployed to"
msgstr ""
+msgid "Can be overridden in each project."
+msgstr ""
+
msgid "Can create groups:"
msgstr ""
@@ -6448,6 +6512,9 @@ msgstr ""
msgid "Cancelling Preview"
msgstr "Отмена предварительного проÑмотра"
+msgid "Cannot assign a confidential epic to a non-confidential issue. Make the issue confidential and try again"
+msgstr ""
+
msgid "Cannot be assigned to other projects."
msgstr ""
@@ -6499,9 +6566,6 @@ msgstr ""
msgid "Cannot refer to a group %{timebox_type} by an internal id!"
msgstr ""
-msgid "Cannot set confidential epic for a non-confidential issue"
-msgstr ""
-
msgid "Cannot show preview. For previews on sketch files, they must have the file format introduced by Sketch version 43 and above."
msgstr ""
@@ -6739,15 +6803,15 @@ msgstr ""
msgid "Check out, review, and merge locally"
msgstr ""
-msgid "Check the %{docs_link_start}documentation%{docs_link_end}."
-msgstr "Подробнее в %{docs_link_start}документации%{docs_link_end}."
-
msgid "Check the current instance configuration "
msgstr ""
msgid "Check the elasticsearch.log file to debug why the migration was halted and make any changes before retrying the migration. When you fix the cause of the failure, click \"Retry migration\", and the migration will be scheduled to be retried in the background."
msgstr ""
+msgid "Check with your administrator."
+msgstr ""
+
msgid "Check your Docker images for known vulnerabilities."
msgstr "Проверьте ваши образы Docker на наличие извеÑтных уÑзвимоÑтей."
@@ -6778,6 +6842,9 @@ msgstr "Проверка доÑтупноÑти имени пользоватеÐ
msgid "Checkout"
msgstr "Оформление заказа"
+msgid "Checkout|$%{selectedPlanPrice} per 10 GB storage per pack"
+msgstr ""
+
msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 minutes"
msgstr ""
@@ -6800,19 +6867,25 @@ msgstr ""
msgid "Checkout|%{name}'s GitLab subscription"
msgstr ""
-msgid "Checkout|%{selectedPlanText} plan"
-msgstr "план %{selectedPlanText}"
+msgid "Checkout|%{name}'s storage subscription"
+msgstr ""
-msgid "Checkout|%{startDate} - %{endDate}"
+msgid "Checkout|%{quantity} GB of storage"
msgstr ""
-msgid "Checkout|%{totalCiMinutes} CI minute"
-msgid_plural "Checkout|%{totalCiMinutes} CI minutes"
+msgid "Checkout|%{quantity} storage pack"
+msgid_plural "Checkout|%{quantity} storage packs"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "Checkout|%{selectedPlanText} plan"
+msgstr "план %{selectedPlanText}"
+
+msgid "Checkout|%{startDate} - %{endDate}"
+msgstr ""
+
msgid "Checkout|%{totalCiMinutes} CI minutes"
msgstr ""
@@ -6888,6 +6961,9 @@ msgstr ""
msgid "Checkout|Failed to register credit card. Please try again."
msgstr ""
+msgid "Checkout|GB"
+msgstr ""
+
msgid "Checkout|GitLab group"
msgstr "Группа GitLab"
@@ -6924,6 +7000,9 @@ msgstr "Выбрать"
msgid "Checkout|State"
msgstr "СоÑтоÑние"
+msgid "Checkout|Storage packs"
+msgstr ""
+
msgid "Checkout|Street address"
msgstr "ÐÐ´Ñ€ÐµÑ ÑƒÐ»Ð¸Ñ†Ñ‹"
@@ -6945,6 +7024,9 @@ msgstr "Итого"
msgid "Checkout|Total minutes: %{quantity}"
msgstr ""
+msgid "Checkout|Total storage: %{quantity} GB"
+msgstr ""
+
msgid "Checkout|Users"
msgstr "Пользователи"
@@ -6954,16 +7036,25 @@ msgstr ""
msgid "Checkout|Your organization"
msgstr "Ваша организациÑ"
+msgid "Checkout|Your storage subscription has the same term as your main subscription, and the price is prorated accordingly."
+msgstr ""
+
msgid "Checkout|Your subscription will be applied to this group"
msgstr "Ваша подпиÑка будет применена к Ñтой группе"
msgid "Checkout|Zip code"
msgstr ""
+msgid "Checkout|a storage subscription"
+msgstr ""
+
msgid "Checkout|company or team"
msgstr "ÐºÐ¾Ð¼Ð¿Ð°Ð½Ð¸Ñ Ð¸Ð»Ð¸ команда"
-msgid "Checkout|x 1,000 minutes per pack = %{strong}"
+msgid "Checkout|minutes"
+msgstr ""
+
+msgid "Checkout|x %{quantity} %{units} per pack ="
msgstr ""
msgid "Cherry-pick this commit"
@@ -6973,7 +7064,7 @@ msgid "Cherry-pick this merge request"
msgstr "Подобрать Ñтот Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° ÑлиÑние"
msgid "Child"
-msgstr ""
+msgstr "ДочернÑÑ"
msgid "Child epic does not exist."
msgstr "Дочерний объект не ÑущеÑтвует."
@@ -7320,6 +7411,9 @@ msgstr ""
msgid "CloneIssue|Cannot clone issue to target project as it is pending deletion."
msgstr ""
+msgid "CloneIssue|Cannot clone issues of '%{issue_type}' type."
+msgstr ""
+
msgid "Cloned this issue to %{path_to_project}."
msgstr ""
@@ -7374,7 +7468,10 @@ msgstr "Закрыто: %{closed}"
msgid "Closes this %{quick_action_target}."
msgstr ""
-msgid "Cloud licenses can not be removed."
+msgid "Cloud Functions description and apps that are suitable for this deployment target"
+msgstr ""
+
+msgid "Cloud Run description and apps that are suitable for this deployment target"
msgstr ""
msgid "Cluster"
@@ -7401,6 +7498,12 @@ msgstr ""
msgid "ClusterAgents|Access tokens"
msgstr ""
+msgid "ClusterAgents|Agent might not be connected to GitLab"
+msgstr ""
+
+msgid "ClusterAgents|Agent never connected to GitLab"
+msgstr ""
+
msgid "ClusterAgents|Alternative installation methods"
msgstr ""
@@ -7416,6 +7519,12 @@ msgstr ""
msgid "ClusterAgents|Configuration"
msgstr ""
+msgid "ClusterAgents|Connected"
+msgstr ""
+
+msgid "ClusterAgents|Connection status"
+msgstr ""
+
msgid "ClusterAgents|Copy token"
msgstr ""
@@ -7434,6 +7543,9 @@ msgstr ""
msgid "ClusterAgents|For alternative installation methods %{linkStart}go to the documentation%{linkEnd}."
msgstr ""
+msgid "ClusterAgents|For more troubleshooting information go to"
+msgstr ""
+
msgid "ClusterAgents|Go to the repository"
msgstr ""
@@ -7449,18 +7561,30 @@ msgstr ""
msgid "ClusterAgents|Integrate with the GitLab Agent"
msgstr ""
-msgid "ClusterAgents|Last used"
+msgid "ClusterAgents|Last connected %{timeAgo}."
+msgstr ""
+
+msgid "ClusterAgents|Last contact"
msgstr ""
msgid "ClusterAgents|Learn how to create an agent access token"
msgstr ""
+msgid "ClusterAgents|Make sure you are using a valid token."
+msgstr ""
+
msgid "ClusterAgents|Name"
msgstr ""
msgid "ClusterAgents|Never"
msgstr ""
+msgid "ClusterAgents|Never connected"
+msgstr ""
+
+msgid "ClusterAgents|Not connected"
+msgstr ""
+
msgid "ClusterAgents|Read more about getting started"
msgstr ""
@@ -7482,6 +7606,9 @@ msgstr ""
msgid "ClusterAgents|Select which Agent you want to install"
msgstr ""
+msgid "ClusterAgents|The Agent has not been connected in a long time. There might be a connectivity issue. Last contact was %{timeAgo}."
+msgstr ""
+
msgid "ClusterAgents|The GitLab Agent also requires %{linkStart}enabling the Agent Server%{linkEnd}"
msgstr ""
@@ -7509,9 +7636,6 @@ msgstr ""
msgid "ClusterAgents|You will need to create a token to connect to your agent"
msgstr ""
-msgid "ClusterAgent|This feature is only available for premium plans"
-msgstr ""
-
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -7701,9 +7825,6 @@ msgstr "Ðе удалоÑÑŒ загрузить подÑети"
msgid "ClusterIntegration|Create Kubernetes cluster"
msgstr "Создать клаÑтер Kubernetes"
-msgid "ClusterIntegration|Create a provision role on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the account and external ID above. %{startMoreInfoLink}More information%{endLink}"
-msgstr ""
-
msgid "ClusterIntegration|Create cluster on"
msgstr "Создать клаÑтер на"
@@ -8136,7 +8257,7 @@ msgstr ""
msgid "ClusterIntegration|Subnets"
msgstr "ПодÑети"
-msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provisioned role, first create one on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the above account and external IDs. %{startMoreInfoLink}More information%{endLink}"
+msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provisioned role, first create one on %{awsLinkStart}Amazon Web Services %{awsLinkEnd} using the above account and external IDs. %{moreInfoStart}More information%{moreInfoEnd}"
msgstr ""
msgid "ClusterIntegration|The Kubernetes certificate used to authenticate to the cluster."
@@ -8370,6 +8491,9 @@ msgstr ""
msgid "Collapse replies"
msgstr ""
+msgid "Collapse settings section"
+msgstr ""
+
msgid "Collapse sidebar"
msgstr "Свернуть панель"
@@ -8388,6 +8512,9 @@ msgstr "ComboSearch не определен"
msgid "Comma-separated list of email addresses."
msgstr ""
+msgid "Comma-separated list of users allowed to exceed the rate limit."
+msgstr ""
+
msgid "Comma-separated, e.g. '1.1.1.1, 2.2.2.0/24'"
msgstr ""
@@ -8710,6 +8837,9 @@ msgstr ""
msgid "Configure %{repository_checks_link_start}repository checks%{link_end} and %{housekeeping_link_start}housekeeping%{link_end} on repositories."
msgstr ""
+msgid "Configure CAPTCHAs, IP address limits, and other anti-spam measures."
+msgstr ""
+
msgid "Configure Dependency Scanning in `.gitlab-ci.yml` using the GitLab managed template. You can [add variable overrides](https://docs.gitlab.com/ee/user/application_security/dependency_scanning/#customizing-the-dependency-scanning-settings) to customize Dependency Scanning settings."
msgstr ""
@@ -8746,17 +8876,14 @@ msgstr "ÐаÑтройка траÑÑировки"
msgid "Configure a %{codeStart}.gitlab-webide.yml%{codeEnd} file in the %{codeStart}.gitlab%{codeEnd} directory to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
msgstr ""
-msgid "Configure existing installation"
-msgstr "ÐаÑтроить ÑущеÑтвующую уÑтановку"
-
-msgid "Configure limit for notes created per minute by web and API requests."
+msgid "Configure advanced permissions, Large File Storage, and two-factor authentication settings."
msgstr ""
-msgid "Configure limits for Project/Group Import/Export."
+msgid "Configure approvals by authors and committers on all projects."
msgstr ""
-msgid "Configure limits for web and API requests."
-msgstr "ÐаÑтройка ограничений Ð´Ð»Ñ Web и API запроÑов."
+msgid "Configure existing installation"
+msgstr "ÐаÑтроить ÑущеÑтвующую уÑтановку"
msgid "Configure paths to be protected by Rack Attack."
msgstr ""
@@ -8770,10 +8897,13 @@ msgstr ""
msgid "Configure settings for Advanced Search with Elasticsearch."
msgstr ""
+msgid "Configure specific limits for Files API requests that supersede the general user and IP rate limits."
+msgstr ""
+
msgid "Configure specific limits for Git LFS requests that supersede the general user and IP rate limits."
msgstr ""
-msgid "Configure specific limits for Packages API requests that supersede the general user and IP rate limits."
+msgid "Configure specific limits for deprecated API requests that supersede the general user and IP rate limits."
msgstr ""
msgid "Configure the %{link} integration."
@@ -8785,6 +8915,9 @@ msgstr ""
msgid "Configure the way a user creates a new account."
msgstr ""
+msgid "Configure via Merge Request"
+msgstr ""
+
msgid "Configure which lists are shown for anyone who visits this board"
msgstr ""
@@ -9259,6 +9392,9 @@ msgstr "Содержит %{count} изображений (%{size})"
msgid "Content parsed with %{link}."
msgstr ""
+msgid "ContentEditor|Table of Contents"
+msgstr ""
+
msgid "ContentEditor|You have to provide a renderMarkdown function or a custom serializer"
msgstr ""
@@ -9445,6 +9581,9 @@ msgstr "Копировать ÑÑылку"
msgid "Copy link to chart"
msgstr ""
+msgid "Copy prefix"
+msgstr ""
+
msgid "Copy reference"
msgstr ""
@@ -9475,6 +9614,9 @@ msgstr ""
msgid "Copy value"
msgstr ""
+msgid "Corpus Management"
+msgstr ""
+
msgid "Corpus Management|Are you sure you want to delete the corpus?"
msgstr ""
@@ -9703,6 +9845,9 @@ msgstr "Создать ветку"
msgid "Create commit"
msgstr "Создать коммит"
+msgid "Create common files more quickly, and standardize their format."
+msgstr ""
+
msgid "Create confidential merge request"
msgstr "Создать конфиденциальный Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° ÑлиÑние"
@@ -9736,6 +9881,9 @@ msgstr ""
msgid "Create issue"
msgstr "Создать обÑуждение"
+msgid "Create issue to resolve all threads"
+msgstr ""
+
msgid "Create iteration"
msgstr "Создать итерацию"
@@ -9790,6 +9938,9 @@ msgstr ""
msgid "Create new..."
msgstr "Создать новый..."
+msgid "Create or import your first project"
+msgstr ""
+
msgid "Create project"
msgstr "Создать проект"
@@ -10147,7 +10298,7 @@ msgstr ""
msgid "Custom notification events"
msgstr "Ð¡Ð¾Ð±Ñ‹Ñ‚Ð¸Ñ Ð½Ð°Ñтраиваемых уведомлений"
-msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notificationLinkStart} notification emails%{notificationLinkEnd}."
+msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notificationLinkStart}notification emails%{notificationLinkEnd}."
msgstr ""
msgid "Custom project templates"
@@ -10350,10 +10501,10 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-msgid "CycleAnalytics|Showing data for group '%{groupName}' and %{selectedProjectCount} projects from %{startDate} to %{endDate}"
+msgid "CycleAnalytics|Showing data for group '%{groupName}' and %{selectedProjectCount} projects from %{createdAfter} to %{createdBefore}"
msgstr ""
-msgid "CycleAnalytics|Showing data for group '%{groupName}' from %{startDate} to %{endDate}"
+msgid "CycleAnalytics|Showing data for group '%{groupName}' from %{createdAfter} to %{createdBefore}"
msgstr ""
msgid "CycleAnalytics|Stages"
@@ -10587,6 +10738,9 @@ msgstr ""
msgid "DastProfiles|Manage profiles"
msgstr ""
+msgid "DastProfiles|Manage site profiles"
+msgstr ""
+
msgid "DastProfiles|Minimum = 0 (no timeout enabled), Maximum = 2880 minutes"
msgstr ""
@@ -10662,6 +10816,9 @@ msgstr ""
msgid "DastProfiles|Scanner name"
msgstr ""
+msgid "DastProfiles|Schedule"
+msgstr ""
+
msgid "DastProfiles|Select branch"
msgstr ""
@@ -10731,7 +10888,7 @@ msgstr ""
msgid "DastProfiles|Website"
msgstr ""
-msgid "DastProfiles|You can either choose a passive scan or validate the target site in your chosen site profile. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
+msgid "DastProfiles|You can either choose a passive scan or validate the target site from the site profile management page. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
msgstr ""
msgid "DastProfiles|You cannot run an active scan against an unvalidated site."
@@ -10906,7 +11063,7 @@ msgstr "Дней"
msgid "Days to merge"
msgstr ""
-msgid "Deactivate dormant users after 90 days of inactivity. Users can return to active status by signing in to their account. While inactive, a user is not counted as an active user in the instance."
+msgid "Deactivate dormant users after 90 days of inactivity"
msgstr ""
msgid "Dear Administrator,"
@@ -10993,10 +11150,10 @@ msgstr ""
msgid "Define a custom pattern with cron syntax"
msgstr "Определить наÑтраиваемый шаблон Ñ ÑинтакÑиÑом cron"
-msgid "Define approval settings."
+msgid "Define approval rules."
msgstr ""
-msgid "Define approval settings. %{linkStart}Learn more.%{linkEnd}"
+msgid "Define approval rules. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "Define custom rules for what constitutes spam, independent of Akismet"
@@ -11005,7 +11162,7 @@ msgstr ""
msgid "Define environments in the deploy stage(s) in %{code_open}.gitlab-ci.yml%{code_close} to track deployments here."
msgstr ""
-msgid "Define how approval rules are applied as a merge request moves toward completion."
+msgid "Define how approval rules are applied to merge requests."
msgstr ""
msgid "Definition"
@@ -11020,6 +11177,12 @@ msgstr ""
msgid "DelayedJobs|Are you sure you want to run %{job_name} immediately? This job will run automatically after it's timer finishes."
msgstr "Ð’Ñ‹ уверены, что вы хотите запуÑтить %{job_name} Ñразу? Это задание будет выполнено автоматичеÑки по завершению таймера."
+msgid "DelayedJobs|Are you sure you want to run %{job_name} immediately? This job will run automatically after its timer finishes."
+msgstr ""
+
+msgid "DelayedJobs|Run the delayed job now?"
+msgstr ""
+
msgid "DelayedJobs|Start now"
msgstr ""
@@ -11302,6 +11465,12 @@ msgstr "Ð¤ÑƒÐ½ÐºÑ†Ð¸Ñ Ð¿Ñ€Ð¾ÐºÑи-завиÑимоÑтей на данный Ð
msgid "Dependency proxy image prefix"
msgstr ""
+msgid "DependencyProxy|Create a local proxy for storing frequently used upstream images. %{docLinkStart}Learn more%{docLinkEnd} about dependency proxies."
+msgstr ""
+
+msgid "DependencyProxy|Dependency Proxy"
+msgstr ""
+
msgid "DependencyProxy|Toggle Dependency Proxy"
msgstr "Переключить прокÑи-завиÑимоÑÑ‚ÑŒ"
@@ -11548,6 +11717,9 @@ msgstr ""
msgid "Deployments"
msgstr ""
+msgid "Deployments to Google Kubernetes Engine can be "
+msgstr ""
+
msgid "Deployments|%{deployments} environment impacted."
msgid_plural "Deployments|%{deployments} environments impacted."
msgstr[0] ""
@@ -11579,6 +11751,9 @@ msgstr ""
msgid "Deployment|success"
msgstr "уÑпешно"
+msgid "Deprecated API rate limits"
+msgstr ""
+
msgid "Deprioritize label"
msgstr "Понизить приоритет метки"
@@ -11981,6 +12156,20 @@ msgstr ""
msgid "DiffsCompareBaseBranch|(base)"
msgstr "(базовый)"
+msgid "Diffs|%d addition"
+msgid_plural "Diffs|%d additions"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
+msgid "Diffs|%d deletion"
+msgid_plural "Diffs|%d deletions"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "Diffs|No file name available"
msgstr "Ð˜Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð° недоÑтупно"
@@ -11990,9 +12179,19 @@ msgstr ""
msgid "Diffs|Show all unchanged lines"
msgstr ""
+msgid "Diffs|Showing %{dropdownStart}%{count} changed file%{dropdownEnd}"
+msgid_plural "Diffs|Showing %{dropdownStart}%{count} changed files%{dropdownEnd}"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "Diffs|Something went wrong while fetching diff lines."
msgstr "Что-то пошло не так при извлечении отличий."
+msgid "Diffs|with %{additions} and %{deletions}"
+msgstr ""
+
msgid "Direct member"
msgstr ""
@@ -12120,9 +12319,6 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-msgid "Dismiss Value Stream Analytics introduction box"
-msgstr "Закрыть окно Ð²Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð² Ðналитику потока ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ñ†ÐµÐ½Ð½Ð¾Ñти"
-
msgid "Dismiss merge request promotion"
msgstr ""
@@ -12444,6 +12640,9 @@ msgstr ""
msgid "Edit issues"
msgstr "Редактировать обÑуждениÑ"
+msgid "Edit merge requests"
+msgstr ""
+
msgid "Edit public deploy key"
msgstr ""
@@ -12519,6 +12718,9 @@ msgstr "ПуÑто. Выберите проÑтранÑтва имен Ð´Ð»Ñ Ð¸
msgid "Elastic|None. Select projects to index."
msgstr "ПуÑто. Выберите проекты Ð´Ð»Ñ Ð¸Ð½Ð´ÐµÐºÑации."
+msgid "Eligible users"
+msgstr ""
+
msgid "Email"
msgstr "Ð­Ð»ÐµÐºÑ‚Ñ€Ð¾Ð½Ð½Ð°Ñ Ð¿Ð¾Ñ‡Ñ‚Ð°"
@@ -12648,6 +12850,9 @@ msgstr "ПуÑтой файл"
msgid "Enable"
msgstr "Включить"
+msgid "Enable Amazon EKS integration"
+msgstr ""
+
msgid "Enable Auto DevOps"
msgstr "Включить Auto DevOps"
@@ -12681,6 +12886,9 @@ msgstr ""
msgid "Enable SSL verification"
msgstr ""
+msgid "Enable Service Ping"
+msgstr ""
+
msgid "Enable Snowplow tracking"
msgstr ""
@@ -12711,6 +12919,9 @@ msgstr ""
msgid "Enable authenticated Git LFS request rate limit"
msgstr ""
+msgid "Enable authenticated web request rate limit"
+msgstr ""
+
msgid "Enable authentication"
msgstr ""
@@ -12771,7 +12982,7 @@ msgstr ""
msgid "Enable or disable the Pseudonymizer data collection."
msgstr ""
-msgid "Enable or disable version check and service ping."
+msgid "Enable or disable version check and Service Ping."
msgstr ""
msgid "Enable protected paths rate limit"
@@ -12783,18 +12994,12 @@ msgstr "Включить прокÑи"
msgid "Enable reCAPTCHA"
msgstr ""
-msgid "Enable reCAPTCHA for login"
-msgstr ""
-
-msgid "Enable reCAPTCHA, Invisible Captcha, Akismet and set IP limits. For reCAPTCHA, we currently only support %{recaptcha_v2_link_start}v2%{recaptcha_v2_link_end}"
+msgid "Enable reCAPTCHA for login."
msgstr ""
msgid "Enable repository checks"
msgstr ""
-msgid "Enable service ping"
-msgstr ""
-
msgid "Enable shared runners for all projects and subgroups in this group."
msgstr ""
@@ -12816,7 +13021,10 @@ msgstr "Включить двухфакторную аутентификацию
msgid "Enable unauthenticated API request rate limit"
msgstr ""
-msgid "Enable unauthenticated request rate limit"
+msgid "Enable unauthenticated web request rate limit"
+msgstr ""
+
+msgid "Enable user deactivation emails"
msgstr ""
msgid "Enable version check"
@@ -12852,9 +13060,6 @@ msgstr ""
msgid "Enabled sources for code import during project creation. OmniAuth must be configured for GitHub"
msgstr ""
-msgid "Enabling this will only make licensed EE features available to projects if the project namespace's plan includes the feature or if the project is public."
-msgstr ""
-
msgid "Encountered an error while rendering: %{err}"
msgstr "Произошла ошибка во Ð²Ñ€ÐµÐ¼Ñ Ñ€ÐµÐ½Ð´ÐµÑ€Ð¸Ð½Ð³Ð°: %{err}"
@@ -12903,9 +13108,6 @@ msgstr ""
msgid "Enter Admin Mode"
msgstr ""
-msgid "Enter IP address range"
-msgstr "Введите диапазон IP-адреÑов"
-
msgid "Enter a number"
msgstr "Введите номер"
@@ -12918,9 +13120,6 @@ msgstr ""
msgid "Enter at least three characters to search"
msgstr "Введите не менее трех Ñимволов Ð´Ð»Ñ Ð¿Ð¾Ð¸Ñка"
-msgid "Enter domain"
-msgstr "Введите домен"
-
msgid "Enter in your Bitbucket Server URL and personal access token below"
msgstr "Введите URL-Ð°Ð´Ñ€ÐµÑ Ð²Ð°ÑˆÐµÐ³Ð¾ Ñервера Bitbucket и ключ доÑтупа"
@@ -13107,9 +13306,6 @@ msgstr "Развертывание"
msgid "Environments|Deployment %{status}"
msgstr ""
-msgid "Environments|Dismiss"
-msgstr ""
-
msgid "Environments|Enable review app"
msgstr ""
@@ -13122,9 +13318,6 @@ msgstr "ОкружениÑ"
msgid "Environments|Environments are places where code gets deployed, such as staging or production."
msgstr "ÐžÐºÑ€ÑƒÐ¶ÐµÐ½Ð¸Ñ - Ñто меÑта где код развёртываетÑÑ, например теÑтовое окружение или продакшн."
-msgid "Environments|Help us improve environments"
-msgstr ""
-
msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
msgstr ""
@@ -13161,6 +13354,9 @@ msgstr "Ðет подов Ð´Ð»Ñ Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ"
msgid "Environments|Note that this action will stop the environment, but it will %{emphasisStart}not%{emphasisEnd} have an effect on any existing deployment due to no “stop environment action†being defined in the %{ciConfigLinkStart}.gitlab-ci.yml%{ciConfigLinkEnd} file."
msgstr "Обратите внимание, что Ñто дейÑтвие оÑтановит окружение, но %{emphasisStart}не%{emphasisEnd} повлиÑет на уже запущенные фазы развёртываниÑ, в Ñлучае еÑли в файле %{ciConfigLinkStart}.gitlab-ci.yml%{ciConfigLinkEnd} не определено дейÑтвие \"оÑтановка окружениÑ\"."
+msgid "Environments|Open"
+msgstr ""
+
msgid "Environments|Open live environment"
msgstr "Открыть живое окружение"
@@ -13200,9 +13396,6 @@ msgstr "ОÑтановить окружение"
msgid "Environments|Stopping %{environmentName}"
msgstr ""
-msgid "Environments|Take the survey"
-msgstr ""
-
msgid "Environments|There was an error fetching the logs. Please try again."
msgstr "Произошла ошибка при извлечении журналов. ПожалуйÑта, попробуйте ещё раз."
@@ -13224,9 +13417,6 @@ msgstr "Обновлено"
msgid "Environments|You don't have any environments right now"
msgstr "У Ð²Ð°Ñ Ð½ÐµÑ‚ ни одного Ð¾ÐºÑ€ÑƒÐ¶ÐµÐ½Ð¸Ñ Ð½Ð° данный момент"
-msgid "Environments|Your feedback helps GitLab make environments better for you and other users. Participate and enter a sweepstake to win a USD 30 gift card."
-msgstr ""
-
msgid "Environments|by %{avatar}"
msgstr ""
@@ -13509,7 +13699,7 @@ msgstr "Произошла ошибка. Пользователь не был р
msgid "Error parsing CSV file. Please make sure it has"
msgstr ""
-msgid "Error rendering markdown preview"
+msgid "Error rendering Markdown preview"
msgstr ""
msgid "Error saving label update."
@@ -13557,6 +13747,9 @@ msgstr ""
msgid "Error: %{error_message}"
msgstr ""
+msgid "Error: Couldn't load some or all of the changes."
+msgstr ""
+
msgid "Error: No AWS credentials were supplied"
msgstr ""
@@ -13590,6 +13783,9 @@ msgstr ""
msgid "ErrorTracking|Enable error tracking"
msgstr ""
+msgid "ErrorTracking|Error tracking backend"
+msgstr ""
+
msgid "ErrorTracking|If you self-host Sentry, enter your Sentry instance's full URL. If you use Sentry's hosted solution, enter https://sentry.io"
msgstr ""
@@ -13623,6 +13819,12 @@ msgstr ""
msgid "Escalation policies must have at least one rule"
msgstr ""
+msgid "EscalationPolicies|%{clockIcon} IF alert is not %{alertStatus} in %{minutes}"
+msgstr ""
+
+msgid "EscalationPolicies|%{notificationIcon} THEN %{doAction} %{forScheduleOrUser}"
+msgstr ""
+
msgid "EscalationPolicies|+ Add an additional rule"
msgstr ""
@@ -13665,13 +13867,13 @@ msgstr ""
msgid "EscalationPolicies|Escalation policies"
msgstr ""
-msgid "EscalationPolicies|Escalation rules"
+msgid "EscalationPolicies|Escalation policy %{obstacle} in Project %{project}"
msgstr ""
-msgid "EscalationPolicies|Failed to load oncall-schedules"
+msgid "EscalationPolicies|Escalation rules"
msgstr ""
-msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} %{then} THEN %{doAction} %{scheduleOrUser}"
+msgid "EscalationPolicies|Failed to load oncall-schedules"
msgstr ""
msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} minutes"
@@ -13749,18 +13951,36 @@ msgstr "СобытиÑ"
msgid "Every %{action} attempt has failed: %{job_error_message}. Please try again."
msgstr ""
+msgid "Every 3 months"
+msgstr ""
+
+msgid "Every 3 months on the %{day} at %{time} %{timezone}"
+msgstr ""
+
+msgid "Every 6 months"
+msgstr ""
+
+msgid "Every 6 months on the %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Every day"
msgstr ""
msgid "Every day (at %{time})"
msgstr ""
+msgid "Every day at %{time} %{timezone}"
+msgstr ""
+
msgid "Every month"
msgstr "Каждый меÑÑц"
msgid "Every month (Day %{day} at %{time})"
msgstr ""
+msgid "Every month on the %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Every three months"
msgstr "Каждые три меÑÑца"
@@ -13777,6 +13997,15 @@ msgstr[3] ""
msgid "Every week (%{weekday} at %{time})"
msgstr ""
+msgid "Every week on %{day} at %{time} %{timezone}"
+msgstr ""
+
+msgid "Every year"
+msgstr ""
+
+msgid "Every year on %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Everyone"
msgstr "Ð’Ñе"
@@ -13813,9 +14042,6 @@ msgstr ""
msgid "Exactly one of %{attributes} is required"
msgstr ""
-msgid "Example: %{ip_address}. %{read_more_link}."
-msgstr "Пример: %{ip_address}. %{read_more_link}."
-
msgid "Example: @sub\\.company\\.com$"
msgstr ""
@@ -13882,15 +14108,15 @@ msgstr ""
msgid "Expand pipeline"
msgstr ""
+msgid "Expand settings section"
+msgstr ""
+
msgid "Expand sidebar"
msgstr "Развернуть боковую панель"
msgid "Expected documents: %{expected_documents}"
msgstr ""
-msgid "Experienced"
-msgstr ""
-
msgid "ExperimentSubject|Must have exactly one of User, Namespace, or Project."
msgstr ""
@@ -14173,9 +14399,6 @@ msgstr ""
msgid "Failed to load related branches"
msgstr ""
-msgid "Failed to load sidebar lock status"
-msgstr ""
-
msgid "Failed to load stacktrace."
msgstr "Ðе удалоÑÑŒ загрузить траÑÑировку Ñтека."
@@ -14604,6 +14827,9 @@ msgstr ""
msgid "Files"
msgstr "Файлы"
+msgid "Files API Rate Limits"
+msgstr ""
+
msgid "Files breadcrumb"
msgstr "Файлы навигации"
@@ -15603,6 +15829,9 @@ msgstr "GitLab Ð´Ð»Ñ Slack"
msgid "GitLab group: %{source_link}"
msgstr ""
+msgid "GitLab informs you if a new version is available."
+msgstr ""
+
msgid "GitLab is a complete DevOps platform, delivered as a single application, fundamentally changing the way Development, Security, and Ops teams collaborate"
msgstr ""
@@ -15618,7 +15847,7 @@ msgstr ""
msgid "GitLab is open source software to collaborate on code."
msgstr ""
-msgid "GitLab is undergoing maintenance and is operating in a read-only mode."
+msgid "GitLab is undergoing maintenance and is operating in read-only mode."
msgstr ""
msgid "GitLab member or Email address"
@@ -15630,9 +15859,6 @@ msgstr ""
msgid "GitLab project export"
msgstr "ЭкÑпорт проекта GitLab"
-msgid "GitLab restart is required to apply changes."
-msgstr ""
-
msgid "GitLab single sign-on URL"
msgstr ""
@@ -15648,9 +15874,6 @@ msgstr ""
msgid "GitLab version"
msgstr ""
-msgid "GitLab will inform you if a new version is available."
-msgstr ""
-
msgid "GitLab will run a background job that will produce pseudonymized CSVs of the GitLab database that will be uploaded to your configured object storage directory."
msgstr ""
@@ -15915,9 +16138,21 @@ msgstr "Перейти к графу репозиториÑ"
msgid "Go to snippets"
msgstr "Перейти к Ñниппетам"
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check 'Allowed domains for sign-ups'."
+msgstr ""
+
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check 'Email restrictions for sign-ups'."
+msgstr ""
+
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check the 'Domain denylist'."
+msgstr ""
+
msgid "Go to the activity feed"
msgstr "Перейти к ленте активноÑти"
+msgid "Go to the group’s 'Settings &gt; General' page, and check 'Restrict membership by email domain'."
+msgstr ""
+
msgid "Go to the milestone list"
msgstr "Перейти к ÑпиÑку Ñтапов"
@@ -15954,6 +16189,12 @@ msgstr "Перейти к Ñвоим Ñниппетам"
msgid "Goal of the changes and what reviewers should be aware of"
msgstr ""
+msgid "Google Cloud"
+msgstr ""
+
+msgid "Google Cloud offers several deployment targets. Select the one most suitable for your project."
+msgstr ""
+
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
@@ -16038,9 +16279,6 @@ msgstr ""
msgid "Group ID"
msgstr "ID группы"
-msgid "Group ID: %{group_id}"
-msgstr ""
-
msgid "Group Owner must have signed in with SAML before enabling Group Managed Accounts"
msgstr ""
@@ -16215,6 +16453,12 @@ msgstr ""
msgid "GroupImport|Unable to process group import file"
msgstr ""
+msgid "GroupPage|Copy group ID"
+msgstr ""
+
+msgid "GroupPage|Group ID: %{group_id}"
+msgstr ""
+
msgid "GroupRoadmap|%{dateWord} – No end date"
msgstr "%{dateWord} – Без конечной даты"
@@ -16269,6 +16513,9 @@ msgstr "Чтобы раÑширить поиÑк, измените или уда
msgid "GroupRoadmap|Within 3 years"
msgstr ""
+msgid "GroupSAML|\"persistent\" recommended"
+msgstr ""
+
msgid "GroupSAML|%{strongOpen}Warning%{strongClose} - Enabling %{linkStart}SSO enforcement%{linkEnd} can reduce security risks."
msgstr ""
@@ -16401,6 +16648,9 @@ msgstr ""
msgid "GroupSAML|To be able to prohibit outer forks, you first need to enforce dedicate group managed accounts."
msgstr ""
+msgid "GroupSAML|Use SAML group links to manage group membership using SAML."
+msgstr ""
+
msgid "GroupSAML|Valid SAML Response"
msgstr ""
@@ -16413,13 +16663,10 @@ msgstr "Ваш токен SCIM"
msgid "GroupSAML|as %{access_level}"
msgstr ""
-msgid "GroupSAML|must match stored NameID of \"%{extern_uid}\" as we use this to identify users. If the NameID changes users will be unable to sign in."
+msgid "GroupSAML|must match stored NameID of \"%{extern_uid}\" to identify user and allow sign in"
msgstr ""
-msgid "GroupSAML|should be \"persistent\""
-msgstr ""
-
-msgid "GroupSAML|should be a random persistent ID, emails are discouraged"
+msgid "GroupSAML|recommend persistent ID instead of email"
msgstr ""
msgid "GroupSelect|No matching results"
@@ -16434,9 +16681,15 @@ msgstr ""
msgid "GroupSettings|Allow project access token creation"
msgstr ""
+msgid "GroupSettings|Applied to all subgroups unless overridden by a group owner. Groups already added to the project lose access."
+msgstr ""
+
msgid "GroupSettings|Auto DevOps pipeline was updated for the group"
msgstr "Ð”Ð»Ñ Ð³Ñ€ÑƒÐ¿Ð¿Ñ‹ была обновлена ÑÐ±Ð¾Ñ€Ð¾Ñ‡Ð½Ð°Ñ Ð»Ð¸Ð½Ð¸Ñ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡ÐµÑкого DevOps"
+msgid "GroupSettings|Available only on the top-level group. Applies to all subgroups. Groups already shared with a group outside %{group} are still shared unless removed manually."
+msgstr ""
+
msgid "GroupSettings|Badges"
msgstr "Значки"
@@ -16488,6 +16741,9 @@ msgstr "ЕÑли видимоÑÑ‚ÑŒ родительÑкой группы ниж
msgid "GroupSettings|New runners registration token has been generated!"
msgstr "Ðовый региÑтрационный токен обработчика заданий Ñгенерирован!"
+msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgstr ""
+
msgid "GroupSettings|Pipeline settings was updated for the group"
msgstr "ÐаÑтройки Ñборочной Ð»Ð¸Ð½Ð¸Ñ Ð±Ñ‹Ð»Ð¸ обновлены Ð´Ð»Ñ Ð³Ñ€ÑƒÐ¿Ð¿Ñ‹"
@@ -16500,12 +16756,15 @@ msgstr ""
msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
-msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups."
+msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups"
msgstr ""
msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
msgstr "Запретить публикацию проектов из %{group} в других группах"
+msgid "GroupSettings|Prevents group members from being notified if the group is mentioned."
+msgstr ""
+
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
msgstr ""
@@ -16542,21 +16801,6 @@ msgstr "Эта наÑтройка применена в %{ancestor_group}. ЧтÐ
msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}."
msgstr "Эта наÑтройка применена в %{ancestor_group}. Ð’Ñ‹ можете переопределить Ñту наÑтройку или %{remove_ancestor_share_with_group_lock}."
-msgid "GroupSettings|This setting is only available on the top-level group and it applies to all subgroups. Groups that have already been shared with a group outside %{group} will still be shared, and this access will have to be revoked manually."
-msgstr ""
-
-msgid "GroupSettings|This setting will be applied to all subgroups unless overridden by a group owner. Groups that already have access to the project will continue to have access unless removed manually."
-msgstr "Эта наÑтройка будет применена Ð´Ð»Ñ Ð²Ñех подгрупп еÑли не будет переопределена владельцем группы. Группы которые уже имеют доÑтуп к проекту, будут иметь его и дальше пока не будут удалены вручную."
-
-msgid "GroupSettings|This setting will override user notification preferences for all members of the group, subgroups, and projects."
-msgstr "Эта наÑтройка переопределит наÑтройки уведомлений Ð´Ð»Ñ Ð²Ñех пользователей в группе, подгруппах и проектах."
-
-msgid "GroupSettings|This setting will prevent group members from being notified if the group is mentioned."
-msgstr ""
-
-msgid "GroupSettings|This setting will prevent group members from forking projects outside of the group."
-msgstr ""
-
msgid "GroupSettings|Transfer group"
msgstr "ПеренеÑти группу"
@@ -16674,7 +16918,7 @@ msgstr ""
msgid "GroupsNew|No import options available"
msgstr ""
-msgid "GroupsNew|Not all related objects are migrated, as %{docs_link_start}described here%{docs_link_end}. Please %{feedback_link_start}leave feedback%{feedback_link_end} on this feature."
+msgid "GroupsNew|Not all related objects are migrated. %{docs_link_start}More info%{docs_link_end}."
msgstr ""
msgid "GroupsNew|Personal access token"
@@ -16806,15 +17050,27 @@ msgstr "ÐеÑтабильный"
msgid "Hello %{name},"
msgstr ""
-msgid "Hello there"
-msgstr "Привет"
-
msgid "Hello, %{name}!"
msgstr ""
msgid "Hello, %{username}!"
msgstr ""
+msgid "HelloMessage|%{handshake_emoji} Contribute to GitLab: %{contribute_link}"
+msgstr ""
+
+msgid "HelloMessage|%{magnifier_emoji} Create a new GitLab issue: %{new_issue_link}"
+msgstr ""
+
+msgid "HelloMessage|%{rocket_emoji} We like your curiosity! Help us improve GitLab by joining the team: %{jobs_page_link}"
+msgstr ""
+
+msgid "HelloMessage|Does this page need fixes or improvements? Open an issue or contribute a merge request to help make GitLab more lovable. At GitLab, everyone can contribute!"
+msgstr ""
+
+msgid "HelloMessage|Welcome to GitLab!"
+msgstr ""
+
msgid "Help"
msgstr "Помощь"
@@ -16824,13 +17080,10 @@ msgstr ""
msgid "Helps prevent bots from creating accounts."
msgstr ""
-msgid "Helps prevent bots from creating issues"
-msgstr ""
-
-msgid "Helps prevent malicious users hide their activity"
+msgid "Helps prevent bots from creating issues."
msgstr ""
-msgid "Helps reduce request volume (e.g. from crawlers or abusive bots)"
+msgid "Helps prevent malicious users hide their activity."
msgstr ""
msgid "Helps reduce request volume (for example, from crawlers or abusive bots)"
@@ -16958,6 +17211,12 @@ msgstr "ОчиÑтка уÑпешно запущена"
msgid "Housekeeping, export, path, transfer, remove, archive."
msgstr "ОчиÑтка, ÑкÑпорт, путь, перемещение, удаление, архивирование."
+msgid "How do I configure Akismet?"
+msgstr ""
+
+msgid "How do I configure it?"
+msgstr ""
+
msgid "How do I configure runners?"
msgstr ""
@@ -16979,19 +17238,25 @@ msgstr ""
msgid "How do I set up this service?"
msgstr ""
+msgid "How do I use a web terminal?"
+msgstr ""
+
+msgid "How do I use file templates?"
+msgstr ""
+
msgid "How it works"
msgstr "Как Ñто работает"
msgid "How many days need to pass between marking entity for deletion and actual removing it."
msgstr ""
-msgid "How many seconds an IP will be counted towards the limit"
+msgid "How many seconds an IP counts toward the IP address limit."
msgstr ""
-msgid "I accept the %{terms_link}"
+msgid "How the job limiter handles jobs exceeding the thresholds specified below. The 'track' mode only logs the jobs. The 'compress' mode compresses the jobs and raises an exception if the compressed size exceeds the limit."
msgstr ""
-msgid "I accept the|Terms of Service and Privacy Policy"
+msgid "I accept the %{terms_link}"
msgstr ""
msgid "I forgot my password"
@@ -17075,15 +17340,18 @@ msgstr "ИÐФОРМÐЦИЯ: Срок дейÑÑ‚Ð²Ð¸Ñ Ð²Ð°ÑˆÐµÐ³Ð¾ SSH-клюÑ
msgid "IP Address"
msgstr "IP-адреÑ"
-msgid "IP expiration time"
+msgid "IP address expiration time"
msgstr ""
-msgid "IP subnet restriction only allowed for top-level groups"
-msgstr "ÐžÐ³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ð¿Ð¾ IP-подÑетÑм разрешены только Ð´Ð»Ñ Ð³Ñ€ÑƒÐ¿Ð¿ верхнего уровнÑ"
+msgid "IP address restrictions"
+msgstr ""
-msgid "IPs per user"
+msgid "IP addresses per user"
msgstr ""
+msgid "IP subnet restriction only allowed for top-level groups"
+msgstr "ÐžÐ³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ð¿Ð¾ IP-подÑетÑм разрешены только Ð´Ð»Ñ Ð³Ñ€ÑƒÐ¿Ð¿ верхнего уровнÑ"
+
msgid "Identifier"
msgstr "Идентификатор"
@@ -17096,6 +17364,9 @@ msgstr ""
msgid "If any indexed field exceeds this limit it will be truncated to this number of characters and the rest will not be indexed or searchable. This does not apply to repository and wiki indexing. Setting this to 0 means it is unlimited."
msgstr "ЕÑли длина какого-либо индекÑированного Ð¿Ð¾Ð»Ñ Ð¿Ñ€ÐµÐ²Ñ‹ÑˆÐ°ÐµÑ‚ Ñтот порог, оно будет обрезано до ÑоответÑтвующего количеÑтва Ñимволов, а оÑтавшаÑÑÑ Ñ‡Ð°ÑÑ‚ÑŒ будет иÑключена из индекÑÐ¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¸ поиÑка. Ðе отноÑитÑÑ Ðº репозиторию и индекÑированию в вики. УÑтановка Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð² 0 означает неограниченную длину."
+msgid "If blank, defaults to %{code_open}Retry later%{code_close}."
+msgstr ""
+
msgid "If blank, set allowable lifetime to %{instance_level_policy_in_words}, as defined by the instance admin. Once set, existing tokens for users in this group may be revoked."
msgstr "ЕÑли пуÑто, уÑтановить разрешенное Ð²Ñ€ÐµÐ¼Ñ ÑущеÑÑ‚Ð²Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ€Ð°Ð²Ð½Ñ‹Ð¼ %{instance_level_policy_in_words}, как определено админиÑтратором ÑкземплÑра. ПоÑле уÑтановки, ÑущеÑтвующие токены пользователей данной группы могут быть отозваны."
@@ -17147,6 +17418,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 did not initiate these sign-in attempts, please reach out to your administrator or enable two-factor authentication (2FA) on your account."
+msgstr ""
+
msgid "If you did not initiate this change, please contact your administrator immediately."
msgstr ""
@@ -17242,12 +17516,12 @@ msgstr "Импорт CSV"
msgid "Import Projects from Gitea"
msgstr "Импорт проектов из Gitea"
-msgid "Import a project"
-msgstr ""
-
msgid "Import an exported GitLab project"
msgstr "Импортировать ÑкÑпортированный проект GitLab"
+msgid "Import and export rate limits"
+msgstr ""
+
msgid "Import failed due to a GitHub error: %{original}"
msgstr ""
@@ -17257,12 +17531,18 @@ msgstr "Импортировать из"
msgid "Import from Jira"
msgstr "Импортировать из Jira"
+msgid "Import group"
+msgstr ""
+
msgid "Import group from file"
msgstr ""
msgid "Import groups"
msgstr ""
+msgid "Import history"
+msgstr ""
+
msgid "Import in progress"
msgstr "ВыполнÑетÑÑ Ð¸Ð¼Ð¿Ð¾Ñ€Ñ‚"
@@ -17326,7 +17606,25 @@ msgstr ""
msgid "Import timed out. Import took longer than %{import_jobs_expiration} seconds"
msgstr ""
-msgid "Import/Export Rate Limits"
+msgid "ImportAProjectModal|Import from a project"
+msgstr ""
+
+msgid "ImportAProjectModal|Import members from another project"
+msgstr ""
+
+msgid "ImportAProjectModal|Import project members"
+msgstr ""
+
+msgid "ImportAProjectModal|Only project members (not group members) are imported, and they get the same permissions as the project you import from."
+msgstr ""
+
+msgid "ImportAProjectModal|Successfully imported"
+msgstr ""
+
+msgid "ImportAProjectModal|Unable to import project members"
+msgstr ""
+
+msgid "ImportAProjectModal|You're importing members to the %{strongStart}%{name}%{strongEnd} project."
msgstr ""
msgid "ImportButtons|Connect repositories from"
@@ -17381,7 +17679,7 @@ msgstr[3] ""
msgid "Importing..."
msgstr ""
-msgid "Import|A repository URL usually ends in a .git suffix, although this is not required. Double check to make sure your repository URL is correct."
+msgid "Import|There is not a valid Git repository at this URL. If your HTTP repository is not publicly accessible, verify your credentials."
msgstr ""
msgid "Improve customer support with Service Desk"
@@ -17390,9 +17688,6 @@ msgstr ""
msgid "Improves Git cloning performance."
msgstr ""
-msgid "In %{time_to_now}"
-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 ""
@@ -17678,7 +17973,7 @@ msgstr ""
msgid "InProductMarketing|Start a GitLab Ultimate trial today in less than one minute, no credit card required."
msgstr ""
-msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no CC required"
+msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no credit card required"
msgstr ""
msgid "InProductMarketing|Start a trial"
@@ -17717,7 +18012,7 @@ msgstr ""
msgid "InProductMarketing|Team up in GitLab for greater efficiency"
msgstr ""
-msgid "InProductMarketing|Team work makes the dream work"
+msgid "InProductMarketing|Team work makes the dream work"
msgstr ""
msgid "InProductMarketing|Test, create, deploy"
@@ -18300,6 +18595,9 @@ msgstr ""
msgid "Integrations|Create new issue in Jira"
msgstr ""
+msgid "Integrations|Create new issue in ZenTao"
+msgstr ""
+
msgid "Integrations|Default settings are inherited from the group level."
msgstr ""
@@ -18393,9 +18691,15 @@ msgstr ""
msgid "Integrations|Search Jira issues"
msgstr ""
+msgid "Integrations|Search ZenTao issues"
+msgstr ""
+
msgid "Integrations|Send notifications about project events to Unify Circuit."
msgstr ""
+msgid "Integrations|Send notifications about project events to a Unify Circuit conversation. %{docs_link}"
+msgstr ""
+
msgid "Integrations|Sign in to add namespaces"
msgstr ""
@@ -18435,6 +18739,9 @@ msgstr ""
msgid "Integrations|You've activated every integration 🎉"
msgstr ""
+msgid "Integrations|ZenTao issues display here when you create issues in your project in ZenTao."
+msgstr ""
+
msgid "Interactive mode"
msgstr ""
@@ -18462,9 +18769,6 @@ msgstr ""
msgid "Interval Pattern"
msgstr "Шаблон интервала"
-msgid "Introducing Value Stream Analytics"
-msgstr "ПредÑтавлÑем Ðналитику потока ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ñ†ÐµÐ½Ð½Ð¾Ñти"
-
msgid "Introducing Your DevOps Report"
msgstr ""
@@ -18561,6 +18865,12 @@ msgstr ""
msgid "Investigate vulnerability: %{title}"
msgstr ""
+msgid "Invisible Captcha"
+msgstr ""
+
+msgid "Invisible Captcha helps prevent the creation of spam accounts. It adds a honeypot field and time-sensitive form submission to the account signup form."
+msgstr ""
+
msgid "Invitation"
msgstr "Приглашение"
@@ -19014,12 +19324,18 @@ msgstr ""
msgid "Issues"
msgstr "ОбÑуждениÑ"
+msgid "Issues I've created"
+msgstr ""
+
msgid "Issues Rate Limits"
msgstr ""
msgid "Issues and merge requests"
msgstr ""
+msgid "Issues assigned to me"
+msgstr ""
+
msgid "Issues can be bugs, tasks or ideas to be discussed. Also, issues are searchable and filterable."
msgstr "ОбÑуждениÑми могут быть ошибки, задачи или идеи. Также, по обÑуждениÑм можно выполнÑÑ‚ÑŒ поиÑк и отбор."
@@ -19131,7 +19447,7 @@ msgstr ""
msgid "Iterations|Create cadence"
msgstr ""
-msgid "Iterations|Create your first iteration"
+msgid "Iterations|Create iteration"
msgstr ""
msgid "Iterations|Delete cadence"
@@ -19140,6 +19456,9 @@ msgstr ""
msgid "Iterations|Delete iteration cadence?"
msgstr ""
+msgid "Iterations|Delete iteration?"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -19173,12 +19492,18 @@ msgstr ""
msgid "Iterations|New iteration cadence"
msgstr ""
+msgid "Iterations|No closed iterations."
+msgstr ""
+
msgid "Iterations|No iteration cadences to show."
msgstr ""
msgid "Iterations|No iterations in cadence."
msgstr ""
+msgid "Iterations|No open iterations."
+msgstr ""
+
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
@@ -19209,6 +19534,9 @@ msgstr ""
msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
msgstr ""
+msgid "Iterations|This will remove the iteration from any issues that are assigned to it."
+msgstr ""
+
msgid "Iterations|Title"
msgstr ""
@@ -19224,15 +19552,9 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr "не может быть более 500 лет в будущем"
-msgid "I’m familiar with the basics of DevOps."
-msgstr ""
-
msgid "I’m joining my team who’s already on GitLab"
msgstr ""
-msgid "I’m not familiar with the basics of DevOps."
-msgstr ""
-
msgid "Jaeger URL"
msgstr ""
@@ -19497,6 +19819,9 @@ msgstr ""
msgid "Job"
msgstr "Задание"
+msgid "Job %{jobName}"
+msgstr ""
+
msgid "Job Failed #%{build_id}"
msgstr "Ошибка Ð·Ð°Ð´Ð°Ð½Ð¸Ñ #%{build_id}"
@@ -20089,9 +20414,6 @@ msgstr "Узнайте больше о подпиÑывании коммитов
msgid "Learn more in the"
msgstr "Узнайте больше в"
-msgid "Learn more in the|pipeline schedules documentation"
-msgstr "документации по раÑпиÑаниÑм Ñборочных линий"
-
msgid "Learn more."
msgstr ""
@@ -20203,9 +20525,6 @@ msgstr "Покинуть"
msgid "Leave Admin Mode"
msgstr "Выйти из режима админиÑтратора"
-msgid "Leave blank for no limit. Once set, existing personal access tokens may be revoked."
-msgstr "ОÑтавьте пуÑтым, чтобы ÑнÑÑ‚ÑŒ ограничениÑ. ПоÑле уÑтановки ÑущеÑтвующие личные токены доÑтупа могут быть отозваны."
-
msgid "Leave edit mode? All unsaved changes will be lost."
msgstr "Выйти из режима редактированиÑ? Ð’Ñе неÑохраненные Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð±ÑƒÐ´ÑƒÑ‚ потерÑны."
@@ -20251,12 +20570,12 @@ msgstr ""
msgid "LicenseCompliance|Acceptable license to be used in the project"
msgstr ""
-msgid "LicenseCompliance|Add a license"
-msgstr "Добавить лицензию"
-
msgid "LicenseCompliance|Add license and related policy"
msgstr "Добавить лицензию и ÑвÑзанную политику"
+msgid "LicenseCompliance|Add license policy"
+msgstr ""
+
msgid "LicenseCompliance|Allow"
msgstr "Разрешить"
@@ -20356,6 +20675,9 @@ msgstr "Запрещено"
msgid "LicenseManagement|Uncategorized"
msgstr "Без категории"
+msgid "Licensed Enterprise Edition features can be used if the project namespace's plan includes the feature, or if the project is public."
+msgstr ""
+
msgid "Licensed Features"
msgstr ""
@@ -20422,7 +20744,10 @@ msgstr "Ограничить отображение единицы временÐ
msgid "Limit namespaces and projects that can be indexed"
msgstr ""
-msgid "Limit sign in from multiple ips"
+msgid "Limit project size at a global, group, and project level. %{link_start}Learn more%{link_end}."
+msgstr ""
+
+msgid "Limit sign in from multiple IP addresses"
msgstr ""
msgid "Limit the number of concurrent operations this secondary site can run in the background."
@@ -20434,6 +20759,9 @@ msgstr ""
msgid "Limit the number of issues and epics per minute a user can create through web and API requests."
msgstr ""
+msgid "Limit the size of Sidekiq jobs stored in Redis."
+msgstr ""
+
msgid "Limited to showing %d event at most"
msgid_plural "Limited to showing %d events at most"
msgstr[0] ""
@@ -20441,6 +20769,9 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "Limiting mode"
+msgstr ""
+
msgid "Line changes"
msgstr ""
@@ -20510,9 +20841,6 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
-msgid "List of users to be excluded from the limit"
-msgstr ""
-
msgid "List options"
msgstr ""
@@ -20552,9 +20880,6 @@ msgstr ""
msgid "Loading functions timed out. Please reload the page to try again."
msgstr ""
-msgid "Loading issues"
-msgstr ""
-
msgid "Loading more"
msgstr ""
@@ -20846,6 +21171,9 @@ msgstr ""
msgid "Marked For Deletion At - %{deletion_time}"
msgstr ""
+msgid "Marked as ready. Merging is now allowed."
+msgstr ""
+
msgid "Marked this %{noun} as a draft."
msgstr ""
@@ -20918,52 +21246,22 @@ msgstr ""
msgid "Max 100,000 events"
msgstr ""
-msgid "Max 20 characters"
-msgstr ""
-
-msgid "Max Group Export Download requests per minute per user"
-msgstr ""
-
-msgid "Max Group Export requests per minute per user"
-msgstr ""
-
-msgid "Max Group Import requests per minute per user"
-msgstr ""
-
-msgid "Max Project Export Download requests per minute per user"
-msgstr ""
-
-msgid "Max Project Export requests per minute per user"
-msgstr ""
-
-msgid "Max Project Import requests per minute per user"
-msgstr ""
-
-msgid "Max authenticated API requests per period per user"
-msgstr ""
-
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
-msgid "Max authenticated web requests per period per user"
-msgstr ""
-
msgid "Max file size is 200 KB."
msgstr ""
-msgid "Max requests per minute per user"
-msgstr ""
-
msgid "Max role"
msgstr ""
msgid "Max session time"
msgstr ""
-msgid "Max unauthenticated requests per period per IP"
+msgid "MaxBuilds"
msgstr ""
-msgid "MaxBuilds"
+msgid "Maximum 20 characters"
msgstr ""
msgid "Maximum Conan package file size in bytes"
@@ -20999,6 +21297,12 @@ msgstr ""
msgid "Maximum attachment size (MB)"
msgstr "МакÑимальный размер Ð²Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ (Мбайт)"
+msgid "Maximum authenticated API requests per rate limit period per user"
+msgstr ""
+
+msgid "Maximum authenticated web requests per rate limit period per user"
+msgstr ""
+
msgid "Maximum bulk request size (MiB)"
msgstr "МакÑимальный размер маÑÑового запроÑа (МиБ)"
@@ -21044,6 +21348,15 @@ msgstr ""
msgid "Maximum files in a diff"
msgstr ""
+msgid "Maximum group export download requests per minute"
+msgstr ""
+
+msgid "Maximum group export requests per minute"
+msgstr ""
+
+msgid "Maximum group import requests per minute"
+msgstr ""
+
msgid "Maximum import size"
msgstr ""
@@ -21080,7 +21393,7 @@ msgstr ""
msgid "Maximum number of projects."
msgstr ""
-msgid "Maximum number of unique IPs per user"
+msgid "Maximum number of unique IP addresses per user."
msgstr ""
msgid "Maximum page reached"
@@ -21089,12 +21402,24 @@ msgstr ""
msgid "Maximum page size"
msgstr ""
+msgid "Maximum project export download requests per minute"
+msgstr ""
+
+msgid "Maximum project export requests per minute"
+msgstr ""
+
+msgid "Maximum project import requests per minute"
+msgstr ""
+
msgid "Maximum push size"
msgstr ""
msgid "Maximum push size (MB)"
msgstr "МакÑимальный размер отправки (Мбайт)"
+msgid "Maximum requests per minute"
+msgstr ""
+
msgid "Maximum running slices"
msgstr ""
@@ -21122,10 +21447,16 @@ msgstr ""
msgid "Maximum time between updates that a mirror can have when scheduled to synchronize."
msgstr "МакÑимальное Ð²Ñ€ÐµÐ¼Ñ Ð¼ÐµÐ¶Ð´Ñƒ обновлениÑми, которое может иметь зеркало при Ñинхронизации по раÑпиÑанию."
-msgid "Maximum time for web terminal websocket connection (in seconds). 0 for unlimited."
+msgid "Maximum time that users are allowed to skip the setup of two-factor authentication (in hours). Set to 0 (zero) to enforce at next sign in."
msgstr ""
-msgid "Maximum time that users are allowed to skip the setup of two-factor authentication (in hours). Set to 0 (zero) to enforce at next sign in."
+msgid "Maximum time, in seconds, for a web terminal websocket connection. 0 for unlimited."
+msgstr ""
+
+msgid "Maximum unauthenticated API requests per rate limit period per IP"
+msgstr ""
+
+msgid "Maximum unauthenticated web requests per rate limit period per IP"
msgstr ""
msgid "May"
@@ -21143,9 +21474,6 @@ msgstr ""
msgid "Medium vulnerabilities present"
msgstr ""
-msgid "Member lock"
-msgstr ""
-
msgid "Member since"
msgstr ""
@@ -21182,6 +21510,9 @@ msgstr ""
msgid "Members of a group may only view projects they have permission to access"
msgstr ""
+msgid "Membership"
+msgstr ""
+
msgid "Members|%{time} by %{user}"
msgstr ""
@@ -21242,9 +21573,6 @@ msgstr ""
msgid "Members|Expiration date updated successfully."
msgstr ""
-msgid "Members|Expired"
-msgstr ""
-
msgid "Members|Filter members"
msgstr ""
@@ -21260,9 +21588,6 @@ msgstr ""
msgid "Members|Membership"
msgstr ""
-msgid "Members|No expiration set"
-msgstr ""
-
msgid "Members|Remove \"%{groupName}\""
msgstr ""
@@ -21284,9 +21609,6 @@ msgstr ""
msgid "Members|Search invited"
msgstr ""
-msgid "Members|in %{time}"
-msgstr ""
-
msgid "Member|Deny access"
msgstr ""
@@ -21362,9 +21684,6 @@ msgstr "Ð—Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° ÑлиÑние"
msgid "Merge request %{mr_link} was reviewed by %{mr_author}"
msgstr ""
-msgid "Merge request (MR) approvals"
-msgstr ""
-
msgid "Merge request analytics"
msgstr ""
@@ -21386,12 +21705,21 @@ msgstr ""
msgid "Merge requests"
msgstr "ЗапроÑÑ‹ на ÑлиÑние"
+msgid "Merge requests I've created"
+msgstr ""
+
msgid "Merge requests are a place to propose changes you've made to a project and discuss those changes with others"
msgstr "ЗапроÑÑ‹ на ÑлиÑние- Ñто меÑто, где можно предлагать Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð²Ð½Ð¾Ñимые в проект, и обÑуждать Ñти Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ñ Ð´Ñ€ÑƒÐ³Ð¸Ð¼Ð¸"
msgid "Merge requests are read-only in a secondary Geo node"
msgstr "ЗапроÑÑ‹ на ÑлиÑние доÑтупны только Ð´Ð»Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ Ð²Ð¾ вторичных узлах Geo"
+msgid "Merge requests assigned to me"
+msgstr ""
+
+msgid "Merge requests that I'm a reviewer"
+msgstr ""
+
msgid "Merge the branch and fix any conflicts that come up"
msgstr ""
@@ -21452,12 +21780,12 @@ msgstr ""
msgid "MergeRequests|An error occurred while saving the draft comment."
msgstr ""
+msgid "MergeRequests|Create issue to resolve thread"
+msgstr ""
+
msgid "MergeRequests|Failed to squash. Should be done manually."
msgstr "Ðе удалоÑÑŒ объединить коммиты. Это должно быть выполнено вручную."
-msgid "MergeRequests|Resolve this thread in a new issue"
-msgstr "Решить Ñту тему в новом обÑуждении"
-
msgid "MergeRequests|Saving the comment failed"
msgstr ""
@@ -22273,6 +22601,9 @@ msgstr "Ðевозможно перемеÑтить обÑуждение из-з
msgid "MoveIssue|Cannot move issue to project it originates from!"
msgstr "Ðевозможно перемеÑтить обÑуждение в проект, в котором оно было первоначально Ñоздано!"
+msgid "MoveIssue|Cannot move issues of '%{issue_type}' type."
+msgstr ""
+
msgid "Moved issue to %{label} column in the board."
msgstr "ОбÑуждение перенеÑено в колонку %{label} на доÑке."
@@ -22400,6 +22731,15 @@ 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. To learn more about reducing storage capacity please visit our docs."
msgstr ""
+msgid "NamespaceUserCap|Pending users must be reviewed and approved by a group owner. Learn more about %{user_caps_link_start}User Caps%{link_end} and %{users_pending_approval_link_start}Users Pending Approval%{link_end}."
+msgstr ""
+
+msgid "NamespaceUserCap|View pending user approvals"
+msgstr ""
+
+msgid "NamespaceUserCap|Your group has reached its billable member limit"
+msgstr ""
+
msgid "Namespaces"
msgstr ""
@@ -22442,9 +22782,6 @@ msgstr ""
msgid "Network"
msgstr "Сеть"
-msgid "Network Policy|New rule"
-msgstr ""
-
msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is inbound from a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
msgstr ""
@@ -22466,16 +22803,13 @@ msgstr ""
msgid "NetworkPolicies|%{strongOpen}any%{strongClose} port"
msgstr ""
-msgid "NetworkPolicies|+ Add alert"
-msgstr ""
-
msgid "NetworkPolicies|.yaml"
msgstr ""
msgid "NetworkPolicies|.yaml mode"
msgstr ""
-msgid "NetworkPolicies|Actions"
+msgid "NetworkPolicies|Add alert"
msgstr ""
msgid "NetworkPolicies|Alerts are intended to be selectively used for a limited number of events that are potentially concerning and warrant a manual review. Alerts should not be used as a substitute for a SIEM or a logging tool. High volume alerts are likely to be dropped so as to preserve the stability of GitLab's integration with Kubernetes."
@@ -22511,9 +22845,6 @@ msgstr ""
msgid "NetworkPolicies|Deny all traffic"
msgstr ""
-msgid "NetworkPolicies|Description"
-msgstr ""
-
msgid "NetworkPolicies|Edit policy"
msgstr ""
@@ -22526,9 +22857,6 @@ msgstr ""
msgid "NetworkPolicies|IP/subnet"
msgstr ""
-msgid "NetworkPolicies|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
-msgstr ""
-
msgid "NetworkPolicies|Invalid or empty policy"
msgstr ""
@@ -22538,19 +22866,16 @@ msgstr ""
msgid "NetworkPolicies|Kubernetes error: %{error}"
msgstr ""
-msgid "NetworkPolicies|Name"
-msgstr ""
-
msgid "NetworkPolicies|Network"
msgstr ""
-msgid "NetworkPolicies|Network traffic"
+msgid "NetworkPolicies|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
msgstr ""
-msgid "NetworkPolicies|New policy"
+msgid "NetworkPolicies|Network policy can be created after the environment is loaded successfully."
msgstr ""
-msgid "NetworkPolicies|No policies detected"
+msgid "NetworkPolicies|Network traffic"
msgstr ""
msgid "NetworkPolicies|None selected"
@@ -22559,21 +22884,12 @@ msgstr ""
msgid "NetworkPolicies|Please %{installLinkStart}install%{installLinkEnd} and %{configureLinkStart}configure a Kubernetes Agent for this project%{configureLinkEnd} to enable alerts."
msgstr ""
-msgid "NetworkPolicies|Policies are a specification of how groups of pods are allowed to communicate with each other's network endpoints."
-msgstr ""
-
msgid "NetworkPolicies|Policy %{policyName} was successfully changed"
msgstr ""
msgid "NetworkPolicies|Policy definition"
msgstr ""
-msgid "NetworkPolicies|Policy editor"
-msgstr ""
-
-msgid "NetworkPolicies|Policy preview"
-msgstr ""
-
msgid "NetworkPolicies|Rule"
msgstr ""
@@ -22583,9 +22899,6 @@ msgstr ""
msgid "NetworkPolicies|Rule mode is unavailable for this policy. In some cases, we cannot parse the YAML file back into the rules editor."
msgstr ""
-msgid "NetworkPolicies|Rules"
-msgstr ""
-
msgid "NetworkPolicies|Save changes"
msgstr ""
@@ -22598,9 +22911,6 @@ msgstr ""
msgid "NetworkPolicies|Traffic that does not match any rule will be blocked."
msgstr ""
-msgid "NetworkPolicies|Unable to parse policy"
-msgstr ""
-
msgid "NetworkPolicies|all DNS names"
msgstr ""
@@ -22690,10 +23000,10 @@ msgstr ""
msgid "New Issue"
msgid_plural "New Issues"
-msgstr[0] "Ðовое ОбÑуждение"
-msgstr[1] "Ðовых ОбÑуждениÑ"
-msgstr[2] "Ðовых ОбÑуждений"
-msgstr[3] "Ðовые ОбÑуждениÑ"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
msgid "New Jira import"
msgstr "Ðовый импорт из Jira"
@@ -22782,6 +23092,9 @@ msgstr ""
msgid "New issue"
msgstr "Ðовое обÑуждение"
+msgid "New issue in %{project}"
+msgstr ""
+
msgid "New issue title"
msgstr "Заголовок нового обÑуждениÑ"
@@ -22860,7 +23173,7 @@ msgstr "Ðовый..."
msgid "Newest first"
msgstr "Сначала новые"
-msgid "Newly registered users will by default be external"
+msgid "Newly-registered users are external by default"
msgstr ""
msgid "Next"
@@ -23175,8 +23488,12 @@ msgstr ""
msgid "No webhooks found, add one in the form above."
msgstr "Веб-обработчики не найдены, добавьте один в форме выше."
-msgid "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} to renew your subscription."
-msgstr "Ðе беÑпокойтеÑÑŒ, вы вÑÑ‘ ещё можете иÑпользовать вÑе функции %{strong}%{plan_name}%{strong_close}. У Ð²Ð°Ñ Ð¾ÑталоÑÑŒ %{remaining_days} Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð´Ð»ÐµÐ½Ð¸Ñ Ð¿Ð¾Ð´Ð¿Ð¸Ñки."
+msgid "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} day to renew your subscription."
+msgid_plural "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} days to renew your subscription."
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
msgid "No. of commits"
msgstr ""
@@ -23193,7 +23510,7 @@ msgstr ""
msgid "Nodes"
msgstr "Узлы"
-msgid "Non-admin users can sign in with read-only access and make read-only API requests."
+msgid "Non-admin users are restricted to read-only access, in both GitLab UI and API."
msgstr ""
msgid "None"
@@ -23274,7 +23591,7 @@ msgstr ""
msgid "NoteForm|Note"
msgstr "Примечание"
-msgid "Notes Rate Limits"
+msgid "Notes rate limit"
msgstr ""
msgid "Notes|Are you sure you want to cancel creating this comment?"
@@ -23449,9 +23766,6 @@ msgstr "ÐоÑб."
msgid "November"
msgstr "ÐоÑбрь"
-msgid "Novice"
-msgstr ""
-
msgid "Now, personalize your GitLab experience"
msgstr ""
@@ -23620,7 +23934,7 @@ msgstr ""
msgid "OnCallSchedules|For this rotation, on-call will be:"
msgstr ""
-msgid "OnCallSchedules|On-call schedule %{schedule} in Project %{project}"
+msgid "OnCallSchedules|On-call schedule %{obstacle} in Project %{project}"
msgstr ""
msgid "OnCallSchedules|On-call schedules"
@@ -23767,22 +24081,22 @@ msgstr ""
msgid "OnDemandScans|Scanner profile"
msgstr ""
-msgid "OnDemandScans|Select one of the existing profiles"
+msgid "OnDemandScans|Schedule scan"
msgstr ""
-msgid "OnDemandScans|Site profile"
+msgid "OnDemandScans|Select one of the existing profiles"
msgstr ""
-msgid "OnDemandScans|Use existing scanner profile"
+msgid "OnDemandScans|Site profile"
msgstr ""
-msgid "OnDemandScans|Use existing site profile"
+msgid "OnDemandScans|Start time"
msgstr ""
-msgid "OnDemandScans|You can either choose a passive scan or validate the target site in your chosen site profile. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
+msgid "OnDemandScans|Use existing scanner profile"
msgstr ""
-msgid "OnDemandScans|You cannot run an active scan against an unvalidated site."
+msgid "OnDemandScans|Use existing site profile"
msgstr ""
msgid "OnDemandScans|You must create a repository within your project to run an on-demand scan."
@@ -23849,6 +24163,9 @@ msgstr ""
msgid "Only admins can delete project"
msgstr ""
+msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
+msgstr ""
+
msgid "Only include features new to your current subscription tier."
msgstr ""
@@ -23867,6 +24184,12 @@ msgstr "Будут импортированы только учаÑтники п
msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
+msgid "Only reCAPTCHA v2 is supported:"
+msgstr ""
+
+msgid "Only users from the specified IP address ranges are able to reach this group, including all subgroups, projects, and Git repositories."
+msgstr ""
+
msgid "Only verified users with an email address in any of these domains can be added to the group."
msgstr ""
@@ -24053,9 +24376,6 @@ msgstr "Владелец"
msgid "Package Registry"
msgstr "РееÑÑ‚Ñ€ пакетов"
-msgid "Package Registry Rate Limits"
-msgstr ""
-
msgid "Package Registry: authenticated API requests"
msgstr ""
@@ -24074,6 +24394,9 @@ msgstr ""
msgid "Package recipe already exists"
msgstr ""
+msgid "Package registry rate limits"
+msgstr ""
+
msgid "Package type"
msgstr ""
@@ -24140,6 +24463,9 @@ msgstr ""
msgid "PackageRegistry|Composer"
msgstr ""
+msgid "PackageRegistry|Composer.json with license: %{license} and version: %{version}"
+msgstr ""
+
msgid "PackageRegistry|Conan"
msgstr "Conan"
@@ -24203,6 +24529,9 @@ msgstr ""
msgid "PackageRegistry|Copy require package include"
msgstr ""
+msgid "PackageRegistry|Copy target SHA"
+msgstr ""
+
msgid "PackageRegistry|Copy yarn command"
msgstr "Копировать команду yarn"
@@ -24269,6 +24598,9 @@ msgstr ""
msgid "PackageRegistry|Install package version"
msgstr ""
+msgid "PackageRegistry|Instance-level"
+msgstr ""
+
msgid "PackageRegistry|Invalid Package: failed metadata extraction"
msgstr ""
@@ -24314,6 +24646,9 @@ msgstr ""
msgid "PackageRegistry|Pip Command"
msgstr "Команда pip"
+msgid "PackageRegistry|Project-level"
+msgstr ""
+
msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
msgstr ""
@@ -24335,6 +24670,9 @@ msgstr ""
msgid "PackageRegistry|Remove package"
msgstr "Удалить пакет"
+msgid "PackageRegistry|Required Python: %{pythonVersion}"
+msgstr ""
+
msgid "PackageRegistry|RubyGems"
msgstr ""
@@ -24377,6 +24715,9 @@ msgstr "Извините, ваш фильтр иÑключил вÑе резул
msgid "PackageRegistry|Source project located at %{link}"
msgstr ""
+msgid "PackageRegistry|Target SHA: %{sha}"
+msgstr ""
+
msgid "PackageRegistry|There are no other versions of this package."
msgstr ""
@@ -24545,6 +24886,18 @@ msgstr "Пароль уÑпешно изменён"
msgid "Password was successfully updated. Please sign in again."
msgstr ""
+msgid "PasswordPrompt|Confirm password"
+msgstr ""
+
+msgid "PasswordPrompt|Confirm password to continue"
+msgstr ""
+
+msgid "PasswordPrompt|Password is required"
+msgstr ""
+
+msgid "PasswordPrompt|Please enter your password to confirm"
+msgstr ""
+
msgid "Passwords should be unique and not used for any other sites or services."
msgstr ""
@@ -24572,6 +24925,9 @@ msgstr "Ð’Ñтавить ÑÑылку на обÑуждение"
msgid "Paste project path (i.e. gitlab-org/gitlab)"
msgstr ""
+msgid "Paste this DSN into your Sentry SDK"
+msgstr ""
+
msgid "Paste your public SSH key, which is usually contained in the file '~/.ssh/id_ed25519.pub' or '~/.ssh/id_rsa.pub' and begins with 'ssh-ed25519' or 'ssh-rsa'. Do not paste your private SSH key, as that can compromise your identity."
msgstr "Ð’Ñтавьте публичный SSH-ключ, который обычно ÑодержитÑÑ Ð² файле '~/.ssh/id_ed25519.pub' или '~/.ssh/id_rsa.pub' и начинаетÑÑ Ñ 'ssh-ed25519' или 'ssh-rsa'. Ðе вÑтавлÑйте закрытый SSH-ключ, так как Ñто может поÑтавить под угрозу ваши личные данные."
@@ -24656,6 +25012,9 @@ msgstr ""
msgid "PerformanceBar|First Contentful Paint"
msgstr ""
+msgid "PerformanceBar|Flamegraph with mode:"
+msgstr ""
+
msgid "PerformanceBar|Frontend resources"
msgstr "РеÑурÑÑ‹ фронтенда"
@@ -24689,6 +25048,15 @@ msgstr ""
msgid "PerformanceBar|Trace"
msgstr ""
+msgid "PerformanceBar|cpu"
+msgstr ""
+
+msgid "PerformanceBar|object"
+msgstr ""
+
+msgid "PerformanceBar|wall"
+msgstr ""
+
msgid "Period in seconds"
msgstr ""
@@ -24917,6 +25285,48 @@ msgstr "Цель"
msgid "PipelineSchedules|Variables"
msgstr "Переменные"
+msgid "PipelineSource|API"
+msgstr ""
+
+msgid "PipelineSource|Chat"
+msgstr ""
+
+msgid "PipelineSource|External"
+msgstr ""
+
+msgid "PipelineSource|External Pull Request"
+msgstr ""
+
+msgid "PipelineSource|Merge Request"
+msgstr ""
+
+msgid "PipelineSource|On-Demand DAST Scan"
+msgstr ""
+
+msgid "PipelineSource|On-Demand DAST Validation"
+msgstr ""
+
+msgid "PipelineSource|Parent Pipeline"
+msgstr ""
+
+msgid "PipelineSource|Pipeline"
+msgstr ""
+
+msgid "PipelineSource|Push"
+msgstr ""
+
+msgid "PipelineSource|Schedule"
+msgstr ""
+
+msgid "PipelineSource|Trigger"
+msgstr ""
+
+msgid "PipelineSource|Web"
+msgstr ""
+
+msgid "PipelineSource|Web IDE"
+msgstr ""
+
msgid "PipelineStatusTooltip|Pipeline: %{ciStatus}"
msgstr "Ð¡Ð±Ð¾Ñ€Ð¾Ñ‡Ð½Ð°Ñ Ð»Ð¸Ð½Ð¸Ñ: %{ciStatus}"
@@ -25217,46 +25627,7 @@ msgstr ""
msgid "Pipeline|Source"
msgstr ""
-msgid "Pipeline|Source|API"
-msgstr ""
-
-msgid "Pipeline|Source|Chat"
-msgstr ""
-
-msgid "Pipeline|Source|External"
-msgstr ""
-
-msgid "Pipeline|Source|External Pull Request"
-msgstr ""
-
-msgid "Pipeline|Source|Merge Request"
-msgstr ""
-
-msgid "Pipeline|Source|On-Demand DAST Scan"
-msgstr ""
-
-msgid "Pipeline|Source|On-Demand DAST Validation"
-msgstr ""
-
-msgid "Pipeline|Source|Parent Pipeline"
-msgstr ""
-
-msgid "Pipeline|Source|Pipeline"
-msgstr ""
-
-msgid "Pipeline|Source|Push"
-msgstr ""
-
-msgid "Pipeline|Source|Schedule"
-msgstr ""
-
-msgid "Pipeline|Source|Trigger"
-msgstr ""
-
-msgid "Pipeline|Source|Web"
-msgstr ""
-
-msgid "Pipeline|Source|Web IDE"
+msgid "Pipeline|Source|Security Policy"
msgstr ""
msgid "Pipeline|Specify variable values to be used in this run. The values specified in %{linkStart}CI/CD settings%{linkEnd} will be used by default."
@@ -25307,8 +25678,8 @@ msgstr ""
msgid "Pipeline|We are currently unable to fetch pipeline data"
msgstr ""
-msgid "Pipeline|You’re about to stop pipeline %{pipelineId}."
-msgstr "Ð’Ñ‹ ÑобираетеÑÑŒ оÑтановить Ñборочную линию %{pipelineId}."
+msgid "Pipeline|You’re about to stop pipeline #%{pipelineId}."
+msgstr ""
msgid "Pipeline|for"
msgstr "длÑ"
@@ -25334,6 +25705,9 @@ msgstr ""
msgid "Plain diff"
msgstr "ПроÑтое отличие"
+msgid "Plain-text response to send to clients that hit a rate limit"
+msgstr ""
+
msgid "Plan:"
msgstr "План:"
@@ -25478,9 +25852,6 @@ msgstr "ПожалуйÑта, укажите корректный Ð°Ð´Ñ€ÐµÑ ÑÐ
msgid "Please provide attributes to update"
msgstr ""
-msgid "Please provide your username or email address."
-msgstr ""
-
msgid "Please reach out if you have any questions and we'll be happy to assist."
msgstr ""
@@ -25523,9 +25894,6 @@ msgstr ""
msgid "Please set a new password before proceeding."
msgstr "ПожалуйÑта, уÑтановите новый пароль, прежде чем продолжить."
-msgid "Please share your feedback about %{featureName} %{linkStart}in this issue%{linkEnd} to help us improve the experience."
-msgstr ""
-
msgid "Please solve the captcha"
msgstr ""
@@ -25703,6 +26071,9 @@ msgstr "Пред."
msgid "Prevent adding new members to project membership within this group"
msgstr "Запретить добавление новых учаÑтников в проектах Ñтой группы"
+msgid "Prevent auto-stopping"
+msgstr ""
+
msgid "Prevent editing approval rules in projects and merge requests."
msgstr ""
@@ -25715,7 +26086,7 @@ msgstr ""
msgid "Prevent users from changing their profile name"
msgstr ""
-msgid "Prevent users from performing write operations on GitLab while performing maintenance."
+msgid "Prevent users from performing write operations while GitLab maintenance is in progress."
msgstr ""
msgid "Preview"
@@ -25988,6 +26359,9 @@ msgstr ""
msgid "Profiles|Enter your name, so people you know can recognize you"
msgstr "Введите ваше имÑ, чтобы люди, которых вы знаете, могли раÑпознать ваÑ"
+msgid "Profiles|Enter your password to confirm the email change"
+msgstr ""
+
msgid "Profiles|Enter your pronouns to let people know how to refer to you"
msgstr ""
@@ -26222,12 +26596,12 @@ msgstr "Ваш ÑтатуÑ"
msgid "Profiles|e.g. My MacBook key"
msgstr ""
+msgid "Profiles|https://website.com"
+msgstr ""
+
msgid "Profiles|username"
msgstr "Ð˜Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ"
-msgid "Profiles|website.com"
-msgstr "website.com"
-
msgid "Profiles|your account"
msgstr "ваша ÑƒÑ‡Ñ‘Ñ‚Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ"
@@ -26468,9 +26842,21 @@ msgstr "ID проекта: %{project_id}"
msgid "ProjectSelect| or group"
msgstr "или группа"
+msgid "ProjectSelect|No matching results"
+msgstr ""
+
msgid "ProjectSelect|Search for project"
msgstr "ПоиÑк проекта"
+msgid "ProjectSelect|Search projects"
+msgstr ""
+
+msgid "ProjectSelect|Select a project"
+msgstr ""
+
+msgid "ProjectSelect|There was an error fetching the projects. Please try again."
+msgstr ""
+
msgid "ProjectService|Drone server URL"
msgstr ""
@@ -26558,6 +26944,9 @@ msgstr ""
msgid "ProjectService|Trigger event when a new, unique alert is recorded."
msgstr ""
+msgid "ProjectService|Trigger event when a new, unique vulnerability is recorded. (Note: This feature requires an Ultimate plan.)"
+msgstr ""
+
msgid "ProjectService|Trigger event when a pipeline status changes."
msgstr ""
@@ -26972,9 +27361,15 @@ msgstr ""
msgid "Projects are graded based on the highest severity vulnerability present"
msgstr ""
+msgid "Projects are organized into groups"
+msgstr ""
+
msgid "Projects contributed to"
msgstr ""
+msgid "Projects help you organize your work. They contain your file repository, issues, merge requests, and so much more."
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr ""
@@ -27209,10 +27604,10 @@ msgstr "Ðе Ñоздано ни одной наÑтраиваемой метрÐ
msgid "PrometheusService|Prometheus cluster integration"
msgstr ""
-msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
+msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
msgstr ""
-msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
+msgid "PrometheusService|The ID of the IAP-secured resource."
msgstr ""
msgid "PrometheusService|The Prometheus API base URL."
@@ -27830,6 +28225,9 @@ msgstr ""
msgid "Rate limit"
msgstr ""
+msgid "Rate limits can help reduce request volume (like from crawlers or abusive bots)."
+msgstr ""
+
msgid "Raw blob request rate limit per minute"
msgstr "Ограничение количеÑтва запроÑов на бинарные данные в минуту"
@@ -27842,6 +28240,9 @@ msgstr "Период повторной аутентификации иÑтёк
msgid "Re-authentication required"
msgstr ""
+msgid "Re-import"
+msgstr ""
+
msgid "Re-request review"
msgstr ""
@@ -27863,6 +28264,9 @@ msgstr ""
msgid "Read more about related issues"
msgstr ""
+msgid "Read their documentation."
+msgstr ""
+
msgid "Ready to get started with GitLab? Follow these steps to set up your workspace, plan and commit changes, and deploy your project."
msgstr ""
@@ -27896,6 +28300,9 @@ msgstr "Получать Ð¾Ð¿Ð¾Ð²ÐµÑ‰ÐµÐ½Ð¸Ñ Ð¾Ñ‚ наÑтроенных вру
msgid "Receive any notifications from GitLab."
msgstr ""
+msgid "Receive notification of abuse reports by email."
+msgstr ""
+
msgid "Receive notifications about your own activity"
msgstr "Получать ÑƒÐ²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ Ð¾ Ñвоей деÑтельноÑти"
@@ -28041,9 +28448,6 @@ msgstr ""
msgid "Registry setup"
msgstr ""
-msgid "Regulate approvals by authors/committers. Affects all projects."
-msgstr ""
-
msgid "Reindexing Status: %{status} (Slice multiplier: %{multiplier}, Maximum running slices: %{max_slices})"
msgstr ""
@@ -28141,6 +28545,9 @@ msgstr ""
msgid "Release|Something went wrong while saving the release details."
msgstr ""
+msgid "Reload page"
+msgstr ""
+
msgid "Remediations"
msgstr ""
@@ -28423,6 +28830,9 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
+msgid "Repeats"
+msgstr ""
+
msgid "Replace"
msgstr "Заменить"
@@ -28793,10 +29203,7 @@ msgstr ""
msgid "Require additional authentication for administrative tasks."
msgstr ""
-msgid "Require all users in this group to setup Two-factor authentication"
-msgstr ""
-
-msgid "Require all users in this group to setup two-factor authentication"
+msgid "Require all users in this group to set up two-factor authentication"
msgstr ""
msgid "Required approvals (%{approvals_given} given)"
@@ -28846,6 +29253,9 @@ msgstr[3] "Ðеобходимо %d подтверждений."
msgid "Requires values to meet regular expression requirements."
msgstr "Требует, чтобы Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ ÑоответÑтвовали регулÑрному выражению."
+msgid "Requires you to deploy or set up cloud-hosted Sentry."
+msgstr ""
+
msgid "Requires your primary GitLab email address."
msgstr ""
@@ -28906,9 +29316,6 @@ msgstr "Ð¡Ð±Ñ€Ð¾Ñ ÐºÐ»ÑŽÑ‡Ð° авторизации Ñделает недейÑ
msgid "Resolve"
msgstr "Разрешить"
-msgid "Resolve all threads in new issue"
-msgstr ""
-
msgid "Resolve conflicts"
msgstr ""
@@ -28966,6 +29373,9 @@ msgstr "Метрики откликов (NGINX)"
msgid "Response text"
msgstr ""
+msgid "Restart GitLab to apply changes."
+msgstr ""
+
msgid "Restart Terminal"
msgstr ""
@@ -28984,6 +29394,9 @@ msgstr ""
msgid "Restoring the project will prevent the project from being removed on this date and restore people's ability to make changes to it."
msgstr ""
+msgid "Restrict group access by IP address. %{link_start}Learn more%{link_end}."
+msgstr ""
+
msgid "Restrict membership by email domain"
msgstr ""
@@ -29301,6 +29714,9 @@ msgstr ""
msgid "Runners|Runner #%{runner_id}"
msgstr ""
+msgid "Runners|Runner assigned to project."
+msgstr ""
+
msgid "Runners|Runner is offline, last contact was %{runner_contact} ago"
msgstr ""
@@ -29313,6 +29729,9 @@ msgstr ""
msgid "Runners|Runner registration"
msgstr ""
+msgid "Runners|Runner unassigned from project."
+msgstr ""
+
msgid "Runners|Runners"
msgstr ""
@@ -29505,7 +29924,7 @@ msgstr ""
msgid "SastEntryPoints|How do I set up SAST?"
msgstr ""
-msgid "SastEntryPoints|Learn more."
+msgid "SastEntryPoints|Learn more"
msgstr ""
msgid "Satisfied"
@@ -29547,7 +29966,7 @@ msgstr "Сохранить пароль"
msgid "Save pipeline schedule"
msgstr "Сохранить раÑпиÑание Ñборочной лини"
-msgid "Save space and find images in the container Registry. remove unneeded tags and keep only the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
+msgid "Save storage space by automatically deleting tags from the container registry and keeping the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
msgstr ""
msgid "Saving"
@@ -29721,6 +30140,9 @@ msgstr ""
msgid "Search or filter results…"
msgstr ""
+msgid "Search or jump to..."
+msgstr ""
+
msgid "Search project"
msgstr "ПоиÑк проекта"
@@ -29781,16 +30203,16 @@ msgstr ""
msgid "SearchCodeResults|of %{link_to_project}"
msgstr ""
-msgid "SearchResults|Showing %{count} %{scope} for%{term_element}"
+msgid "SearchResults|Showing %{count} %{scope} for %{term_element}"
msgstr ""
-msgid "SearchResults|Showing %{count} %{scope} for%{term_element} in your personal and project snippets"
+msgid "SearchResults|Showing %{count} %{scope} for %{term_element} in your personal and project snippets"
msgstr ""
-msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for%{term_element}"
+msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for %{term_element}"
msgstr ""
-msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for%{term_element} in your personal and project snippets"
+msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for %{term_element} in your personal and project snippets"
msgstr ""
msgid "SearchResults|code result"
@@ -29894,6 +30316,9 @@ msgstr ""
msgid "Secret Detection"
msgstr ""
+msgid "Secret access key"
+msgstr ""
+
msgid "Secret token"
msgstr ""
@@ -29933,9 +30358,6 @@ msgstr ""
msgid "SecurityApprovals|A merge request approval is required when the license compliance report contains a denied license."
msgstr ""
-msgid "SecurityApprovals|Configurable if security scanners are enabled. %{linkStart}Learn more.%{linkEnd}"
-msgstr ""
-
msgid "SecurityApprovals|Coverage-Check"
msgstr ""
@@ -29948,24 +30370,18 @@ msgstr ""
msgid "SecurityApprovals|Learn more about Vulnerability-Check"
msgstr ""
-msgid "SecurityApprovals|License Scanning must be enabled. %{linkStart}Learn more%{linkEnd}."
-msgstr ""
-
msgid "SecurityApprovals|License-Check"
msgstr ""
msgid "SecurityApprovals|Requires approval for Denied licenses. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}More information%{linkEnd}"
+msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "SecurityApprovals|Requires approval for vulnerabilities. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
-msgid "SecurityApprovals|Test coverage must be enabled. %{linkStart}Learn more%{linkEnd}."
-msgstr ""
-
msgid "SecurityApprovals|Vulnerability-Check"
msgstr ""
@@ -30029,6 +30445,12 @@ msgstr ""
msgid "SecurityConfiguration|Immediately begin risk analysis and remediation with application security features. Start with SAST and Secret Detection, available to all plans. Upgrade to Ultimate to get all features, including:"
msgstr ""
+msgid "SecurityConfiguration|Manage corpus"
+msgstr ""
+
+msgid "SecurityConfiguration|Manage corpus files used as mutation sources in coverage fuzzing."
+msgstr ""
+
msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
msgstr ""
@@ -30083,6 +30505,12 @@ msgstr ""
msgid "SecurityOrchestration|Action"
msgstr ""
+msgid "SecurityOrchestration|Actions"
+msgstr ""
+
+msgid "SecurityOrchestration|Add rule"
+msgstr ""
+
msgid "SecurityOrchestration|All policies"
msgstr ""
@@ -30116,9 +30544,6 @@ msgstr ""
msgid "SecurityOrchestration|Network"
msgstr ""
-msgid "SecurityOrchestration|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
-msgstr ""
-
msgid "SecurityOrchestration|New policy"
msgstr ""
@@ -30134,6 +30559,9 @@ msgstr ""
msgid "SecurityOrchestration|Policy editor"
msgstr ""
+msgid "SecurityOrchestration|Policy preview"
+msgstr ""
+
msgid "SecurityOrchestration|Policy status"
msgstr ""
@@ -30143,6 +30571,9 @@ msgstr ""
msgid "SecurityOrchestration|Rule"
msgstr ""
+msgid "SecurityOrchestration|Rules"
+msgstr ""
+
msgid "SecurityOrchestration|Scan Execution"
msgstr ""
@@ -30236,6 +30667,9 @@ msgstr ""
msgid "SecurityReports|Create issue"
msgstr ""
+msgid "SecurityReports|Development vulnerabilities"
+msgstr ""
+
msgid "SecurityReports|Dismiss vulnerability"
msgstr ""
@@ -30251,6 +30685,9 @@ msgstr ""
msgid "SecurityReports|Download results"
msgstr ""
+msgid "SecurityReports|Download scanned URLs"
+msgstr ""
+
msgid "SecurityReports|Download scanned resources"
msgstr ""
@@ -30374,6 +30811,9 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
+msgid "SecurityReports|The Vulnerability Report shows the results of the lastest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "SecurityReports|The security reports below contain one or more vulnerability findings that could not be parsed and were not recorded. Download the artifacts in the job output to investigate. Ensure any security report created conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
msgstr ""
@@ -30515,10 +30955,10 @@ msgstr "Выберите причину"
msgid "Select a repository"
msgstr "Выберите репозиторий"
-msgid "Select a role"
+msgid "Select a repository containing templates for common files."
msgstr ""
-msgid "Select a shared template repository for all projects on this instance."
+msgid "Select a role"
msgstr ""
msgid "Select a template repository"
@@ -30596,6 +31036,9 @@ msgstr ""
msgid "Select project to choose zone"
msgstr ""
+msgid "Select project to create issue"
+msgstr ""
+
msgid "Select projects"
msgstr ""
@@ -30713,6 +31156,9 @@ msgstr ""
msgid "Send emails to help guide new users through the onboarding process."
msgstr ""
+msgid "Send emails to users upon account deactivation."
+msgstr ""
+
msgid "Send message"
msgstr ""
@@ -30731,6 +31177,9 @@ msgstr "Отправить отчёт"
msgid "Send service data"
msgstr ""
+msgid "Sentry"
+msgstr ""
+
msgid "Sentry API URL"
msgstr "URL-Ð°Ð´Ñ€ÐµÑ Sentry API"
@@ -30845,6 +31294,9 @@ msgstr ""
msgid "Service"
msgstr ""
+msgid "Service Accounts keys are required to authorize GitLab to deploy your Google Cloud project."
+msgstr ""
+
msgid "Service Desk"
msgstr "Служба поддержки"
@@ -30917,15 +31369,15 @@ msgstr ""
msgid "Set a password on your account to pull or push via %{protocol}."
msgstr "УÑтановите пароль в Ñвоем аккаунте, чтобы отправлÑÑ‚ÑŒ или получать код через %{protocol}."
-msgid "Set a template repository for projects in this group"
-msgstr ""
-
msgid "Set access permissions for this token."
msgstr ""
msgid "Set an instance-wide domain that will be available to all clusters when installing Knative."
msgstr ""
+msgid "Set any rate limit to %{code_open}0%{code_close} to disable the limit."
+msgstr ""
+
msgid "Set default and restrict visibility levels. Configure import sources and git access protocol."
msgstr ""
@@ -30938,8 +31390,8 @@ msgstr "Задать итерацию"
msgid "Set limit to 0 to allow any file size."
msgstr ""
-msgid "Set max session time for web terminal."
-msgstr "УÑтановить макÑимальное Ð²Ñ€ÐµÐ¼Ñ ÑеанÑа Ð´Ð»Ñ Ð²ÐµÐ±-терминала."
+msgid "Set limits for web and API requests."
+msgstr ""
msgid "Set milestone"
msgstr "Задать Ñтап"
@@ -30947,15 +31399,18 @@ msgstr "Задать Ñтап"
msgid "Set new password"
msgstr "УÑтановить новый пароль"
-msgid "Set notification email for abuse reports."
-msgstr "ÐаÑтройте Ñлектронную почту Ð´Ð»Ñ Ñообщений о нарушениÑÑ…."
-
msgid "Set parent epic to an epic"
msgstr "УÑтановить родительÑкую цель"
+msgid "Set per-user rate limits for imports and exports of projects and groups."
+msgstr ""
+
msgid "Set projects and maximum size limits, session duration, user options, and check feature availability for namespace plan."
msgstr ""
+msgid "Set rate limits for package registry API requests that supersede the general user and IP rate limits."
+msgstr ""
+
msgid "Set severity"
msgstr ""
@@ -30974,15 +31429,24 @@ msgstr ""
msgid "Set the default branch for this project. All merge requests and commits are made against this branch unless you specify a different one."
msgstr ""
+msgid "Set the default expiration time for job artifacts in all projects. Set to %{code_open}0%{code_close} to never expire artifacts by default. If no unit is written, it defaults to seconds. For example, these are all equivalent: %{code_open}3600%{code_close}, %{code_open}60 minutes%{code_close}, or %{code_open}one hour%{code_close}."
+msgstr ""
+
msgid "Set the due date to %{due_date}."
msgstr ""
msgid "Set the iteration to %{iteration_reference}."
msgstr "Задать итерацию %{iteration_reference}."
+msgid "Set the maximum session time for a web terminal."
+msgstr ""
+
msgid "Set the milestone to %{milestone_reference}."
msgstr ""
+msgid "Set the per-user rate limit for notes created by web or API requests."
+msgstr ""
+
msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
msgstr ""
@@ -31184,6 +31648,9 @@ msgstr ""
msgid "Show Pipeline IID"
msgstr ""
+msgid "Show all %{issuable_type}."
+msgstr ""
+
msgid "Show all activity"
msgstr ""
@@ -31235,15 +31702,9 @@ msgstr "Показать поÑледнюю верÑию"
msgid "Show list"
msgstr ""
-msgid "Show me advanced features"
-msgstr ""
-
msgid "Show me how to add a pipeline"
msgstr ""
-msgid "Show me the basics"
-msgstr ""
-
msgid "Show one file at a time"
msgstr ""
@@ -31288,15 +31749,15 @@ msgstr ""
msgid "Showing %{pageSize} of %{total} %{issuableType}"
msgstr ""
-msgid "Showing %{pageSize} of %{total} issues"
-msgstr "Показано %{pageSize} из %{total} задач"
-
msgid "Showing all epics"
msgstr ""
msgid "Showing all issues"
msgstr "Показаны вÑе обÑуждениÑ"
+msgid "Showing data for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
+msgstr ""
+
msgid "Showing data for workflow items created in this date range. Date range cannot exceed %{maxDateRange} days."
msgstr ""
@@ -31336,6 +31797,15 @@ msgstr ""
msgid "Sidebar|Weight"
msgstr "Приоритет"
+msgid "Sidekiq job compression threshold (bytes)"
+msgstr ""
+
+msgid "Sidekiq job size limit (bytes)"
+msgstr ""
+
+msgid "Sidekiq job size limits"
+msgstr ""
+
msgid "Sign in"
msgstr "Вход"
@@ -31456,6 +31926,9 @@ msgstr ""
msgid "Site profile not found for given parameters"
msgstr ""
+msgid "Sites"
+msgstr ""
+
msgid "Size"
msgstr "Размер"
@@ -31486,19 +31959,22 @@ msgstr ""
msgid "SlackIntegration|Sends notifications about project events to Slack channels."
msgstr ""
-msgid "SlackService|2. Paste the %{strong_open}Token%{strong_close} into the field below"
+msgid "SlackService|1. %{slash_command_link_start}Add a slash command%{slash_command_link_end} in your Slack team using this information:"
msgstr ""
-msgid "SlackService|3. Select the %{strong_open}Active%{strong_close} checkbox, press %{strong_open}Save changes%{strong_close} and start using GitLab inside Slack!"
+msgid "SlackService|2. Paste the token from Slack in the %{strong_open}Token%{strong_close} field below."
msgstr ""
-msgid "SlackService|Fill in the word that works best for your team."
+msgid "SlackService|3. Select the %{strong_open}Active%{strong_close} checkbox, select %{strong_open}Save changes%{strong_close}, and start using slash commands in Slack!"
+msgstr ""
+
+msgid "SlackService|After setup, get a list of available Slack slash commands by entering"
msgstr ""
-msgid "SlackService|See list of available commands in Slack after setting up this service, by entering"
+msgid "SlackService|Fill in the word that works best for your team."
msgstr ""
-msgid "SlackService|This service allows users to perform common operations on this project by entering slash commands in Slack."
+msgid "SlackService|Perform common operations in this project by entering slash commands in Slack."
msgstr ""
msgid "Slice multiplier"
@@ -31564,7 +32040,7 @@ msgstr ""
msgid "Some child epics may be hidden due to applied filters"
msgstr ""
-msgid "Some common domains are not allowed. %{read_more_link}."
+msgid "Some common domains are not allowed. %{learn_more_link}."
msgstr ""
msgid "Some of the designs you tried uploading did not change:"
@@ -31648,9 +32124,6 @@ msgstr ""
msgid "Something went wrong while exporting requirements"
msgstr ""
-msgid "Something went wrong while fetching %{listType} list"
-msgstr ""
-
msgid "Something went wrong while fetching branches"
msgstr ""
@@ -31705,15 +32178,9 @@ msgstr ""
msgid "Something went wrong while merging this merge request. Please try again."
msgstr ""
-msgid "Something went wrong while moving issues."
-msgstr ""
-
msgid "Something went wrong while obtaining the Let's Encrypt certificate."
msgstr ""
-msgid "Something went wrong while performing the action."
-msgstr ""
-
msgid "Something went wrong while promoting the issue to an epic. Please try again."
msgstr ""
@@ -32041,7 +32508,10 @@ msgstr ""
msgid "SourcegraphPreferences|Uses a custom %{linkStart}Sourcegraph instance%{linkEnd}."
msgstr ""
-msgid "Spam Check API Key"
+msgid "Spam Check"
+msgstr ""
+
+msgid "Spam Check API key"
msgstr ""
msgid "Spam Logs"
@@ -32059,7 +32529,7 @@ msgstr ""
msgid "Specified URL cannot be used: \"%{reason}\""
msgstr ""
-msgid "Specify an e-mail address regex pattern to identify default internal users."
+msgid "Specify an email address regex pattern to identify default internal users."
msgstr ""
msgid "Speed up your pipelines with Needs relationships"
@@ -32314,7 +32784,7 @@ msgstr ""
msgid "StatusCheck|An error occurred fetching the status checks."
msgstr ""
-msgid "StatusCheck|Apply this status check to any branch or a specific protected branch."
+msgid "StatusCheck|Apply this status check to all branches or a specific protected branch."
msgstr ""
msgid "StatusCheck|Check for a status response in Merge Requests. Failures do not block merges. %{link_start}Learn more%{link_end}."
@@ -32653,6 +33123,9 @@ msgstr "ПодÑчет иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÑетÑÑ Ð¾Ð´Ð¸Ð
msgid "Subscriptions"
msgstr ""
+msgid "Subscription|Your subscription for %{strong}%{namespace_name}%{strong_close} has expired and you are now on %{pricing_link_start}the GitLab Free tier%{pricing_link_end}. Don't worry, your data is safe. Get in touch with our support team (%{support_email}). They'll gladly help with your subscription renewal."
+msgstr ""
+
msgid "Subtracted"
msgstr ""
@@ -32881,6 +33354,9 @@ msgstr ""
msgid "SuperSonics|Plan"
msgstr ""
+msgid "SuperSonics|Please agree to the Subscription Agreement"
+msgstr ""
+
msgid "SuperSonics|Ready to get started? A GitLab plan is ideal for scaling organizations and for multi team usage."
msgstr ""
@@ -32911,6 +33387,9 @@ msgstr ""
msgid "SuperSonics|The activation code is not valid. Please make sure to copy it exactly from the Customers Portal or confirmation email. Learn more about %{linkStart}activating your subscription%{linkEnd}."
msgstr ""
+msgid "SuperSonics|The activation code should be a 24-character alphanumeric string"
+msgstr ""
+
msgid "SuperSonics|There is a connectivity issue."
msgstr ""
@@ -32953,9 +33432,15 @@ msgstr ""
msgid "SuperSonics|You do not have an active subscription"
msgstr ""
+msgid "SuperSonics|You have successfully added a license that activates on %{date}. Please see the subscription history table below for more details."
+msgstr ""
+
msgid "SuperSonics|You'll be charged for %{trueUpLinkStart}users over license%{trueUpLinkEnd} on a quarterly or annual basis, depending on the terms of your agreement."
msgstr ""
+msgid "SuperSonics|Your future dated license was successfully added"
+msgstr ""
+
msgid "SuperSonics|Your subscription"
msgstr ""
@@ -33208,7 +33693,7 @@ msgstr "Шаблон"
msgid "Template to append to all Service Desk issues"
msgstr "Шаблон Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ ÐºÐ¾ вÑем обÑуждениÑм Ñлужбы поддержки"
-msgid "TemplateRepository|Select a repository to make its templates available to all projects. %{link_start}What should the repository contain?%{link_end} "
+msgid "TemplateRepository|Create common files more quickly, and standardize their format."
msgstr ""
msgid "Templates"
@@ -33422,7 +33907,7 @@ msgstr ""
msgid "TestCases|Search test cases"
msgstr ""
-msgid "TestCases|Something went wrong while adding test case to Todo."
+msgid "TestCases|Something went wrong while adding test case to a to-do item."
msgstr ""
msgid "TestCases|Something went wrong while creating a test case."
@@ -33434,7 +33919,7 @@ msgstr ""
msgid "TestCases|Something went wrong while fetching test cases list."
msgstr ""
-msgid "TestCases|Something went wrong while marking test case todo as done."
+msgid "TestCases|Something went wrong while marking test case to-do item as done."
msgstr ""
msgid "TestCases|Something went wrong while moving test case."
@@ -33554,7 +34039,7 @@ msgstr ""
msgid "Thanks for your purchase!"
msgstr "СпаÑибо за покупку!"
-msgid "That is ok, I do not want to renew"
+msgid "That's OK, I don't want to renew"
msgstr ""
msgid "That's it, well done!"
@@ -33579,7 +34064,7 @@ msgstr[1] "%{type} Ñодержат Ñледующие ошибки:"
msgstr[2] "%{type} Ñодержат Ñледующие ошибки:"
msgstr[3] "%{type} Ñодержат Ñледующие ошибки:"
-msgid "The API key used by GitLab for accessing the Spam Check service endpoint"
+msgid "The API key used by GitLab for accessing the Spam Check service endpoint."
msgstr ""
msgid "The GitLab subscription service (customers.gitlab.com) is currently experiencing an outage. You can monitor the status and get updates at %{linkStart}status.gitlab.com%{linkEnd}."
@@ -33618,9 +34103,6 @@ msgstr ""
msgid "The URL to use for connecting to Elasticsearch. Use a comma-separated list to support clustering (e.g., \"http://localhost:9200, http://localhost:9201\")."
msgstr "URL, иÑпользуемый Ð´Ð»Ñ Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ðº Elasticsearch. ИÑпользуйте ÑпиÑок разделÑемых запÑтыми адреÑов Ð´Ð»Ñ Ð¿Ð¾Ð´Ð´ÐµÑ€Ð¶ÐºÐ¸ клаÑтеризации (напр., \"http://localhost:9200, http://localhost:9201\")."
-msgid "The Vulnerability Report shows the results of the last successful pipeline run on the default branch."
-msgstr ""
-
msgid "The X509 Certificate to use when mutual TLS is required to communicate with the external authorization service. If left blank, the server certificate is still validated when accessing over HTTPS."
msgstr "Сертификат X509, иÑпользуемый в том Ñлучае, когда Ð´Ð»Ñ ÑвÑзи Ñ Ð²Ð½ÐµÑˆÐ½ÐµÐ¹ Ñлужбой авторизации требуетÑÑ Ð²Ð·Ð°Ð¸Ð¼Ð½Ð°Ñ Ð¿Ñ€Ð¾Ð²ÐµÑ€ÐºÐ° подлинноÑти TLS. ЕÑли оÑтавить пуÑтым, Ñертификат Ñервера вÑе еще будет проверÑÑ‚ÑŒÑÑ Ð¿Ñ€Ð¸ доÑтупе через HTTPS."
@@ -33678,9 +34160,6 @@ msgstr ""
msgid "The default branch for this project has been changed. Please update your bookmarks."
msgstr ""
-msgid "The default expiration time for job artifacts. 0 for unlimited. The default unit is in seconds, but you can use other units, for example %{code_open}4 mins 2 sec%{code_close}, %{code_open}2h42min%{code_close}."
-msgstr ""
-
msgid "The dependency list details information about the components used within your project."
msgstr "СпиÑок завиÑимоÑтей Ñодержит подробную информацию о компонентах, которые иÑпользуютÑÑ Ð² Вашем проекте."
@@ -33874,9 +34353,6 @@ msgstr "Конфликты ÑлиÑÐ½Ð¸Ñ Ð´Ð»Ñ Ñтого запроÑа на
msgid "The merge conflicts for this merge request have already been resolved. Please return to the merge request."
msgstr "Конфликты ÑлиÑÐ½Ð¸Ñ Ð´Ð»Ñ Ñтого запроÑа на ÑлиÑние уже разрешены. ПожалуйÑта, вернитеÑÑŒ к запроÑу на ÑлиÑние."
-msgid "The merge request can now be merged."
-msgstr "Теперь можно выполнить Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° ÑлиÑние."
-
msgid "The metric must be one of %{metrics}."
msgstr ""
@@ -34252,7 +34728,7 @@ msgstr "Произошла ошибка при отправке пиÑьма Ñ
msgid "There was a problem updating the keep latest artifacts setting."
msgstr ""
-msgid "There was an error %{message} todo."
+msgid "There was an error %{message} to-do item."
msgstr ""
msgid "There was an error adding a To Do."
@@ -34291,6 +34767,9 @@ msgstr "Произошла ошибка при получении медианн
msgid "There was an error fetching projects"
msgstr ""
+msgid "There was an error fetching search autocomplete suggestions"
+msgstr ""
+
msgid "There was an error fetching stage total counts"
msgstr ""
@@ -34615,6 +35094,9 @@ msgstr ""
msgid "This field is required."
msgstr ""
+msgid "This form is disabled in preview"
+msgstr ""
+
msgid "This group"
msgstr "Эта группа"
@@ -34636,9 +35118,6 @@ msgstr ""
msgid "This group is linked to a subscription"
msgstr ""
-msgid "This group, including all subgroups, projects and git repositories, will be reachable from only the specified IP address ranges."
-msgstr ""
-
msgid "This group, its subgroups and projects has been scheduled for removal on %{date}."
msgstr ""
@@ -34918,9 +35397,6 @@ msgstr ""
msgid "This user cannot be unlocked manually from GitLab"
msgstr ""
-msgid "This user does not have a pending request"
-msgstr ""
-
msgid "This user has an unconfirmed email address (%{email}). You may force a confirmation."
msgstr ""
@@ -35029,9 +35505,6 @@ msgstr ""
msgid "ThreatMonitoring|Packet Activity"
msgstr ""
-msgid "ThreatMonitoring|Policies"
-msgstr ""
-
msgid "ThreatMonitoring|Requests"
msgstr ""
@@ -35083,6 +35556,12 @@ msgstr ""
msgid "ThreatMonitoring|View documentation"
msgstr ""
+msgid "Threshold in bytes at which to compress Sidekiq job arguments."
+msgstr ""
+
+msgid "Threshold in bytes at which to reject Sidekiq jobs. Set this to 0 to if you don't want to limit Sidekiq jobs."
+msgstr ""
+
msgid "Throughput"
msgstr ""
@@ -35092,6 +35571,9 @@ msgstr "Четверг"
msgid "Time"
msgstr "ВремÑ"
+msgid "Time (in hours) that users are allowed to skip forced configuration of two-factor authentication."
+msgstr ""
+
msgid "Time Spent"
msgstr ""
@@ -35158,8 +35640,8 @@ msgstr ""
msgid "TimeTrackingEstimated|Est"
msgstr "Оцен."
-msgid "TimeTracking|%{startTag}Spent: %{endTag}%{timeSpentHumanReadable}"
-msgstr "%{startTag}Затрачено: %{endTag}%{timeSpentHumanReadable}"
+msgid "TimeTracking|%{spentStart}Spent: %{spentEnd}"
+msgstr ""
msgid "TimeTracking|Estimated:"
msgstr "Оценочно:"
@@ -35376,6 +35858,9 @@ msgstr ""
msgid "To access this domain create a new DNS record"
msgstr ""
+msgid "To add a custom suffix, set up a Service Desk email address. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "To add an SSH key you need to %{generate_link_start}generate one%{link_end} or use an %{existing_link_start}existing key%{link_end}."
msgstr "Чтобы добавить ключ SSH, вам нужно %{generate_link_start}Ñгенерировать его%{link_end} или иÑпользовать %{existing_link_start}ÑущеÑтвующий ключ%{link_end}."
@@ -35397,13 +35882,16 @@ msgstr ""
msgid "To connect an SVN repository, check out %{svn_link}."
msgstr "Чтобы подключить репозиторий SVN, проверьте %{svn_link}."
+msgid "To continue using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
+msgstr ""
+
msgid "To continue, you need to select the link in the confirmation email we sent to verify your email address. If you didn't get our email, select %{strongStart}Resend confirmation email.%{strongEnd}"
msgstr ""
msgid "To define internal users, first enable new users set to external"
msgstr ""
-msgid "To enable Registration Features, make sure \"Enable service ping\" is checked."
+msgid "To enable Registration Features, first enable Service Ping."
msgstr ""
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
@@ -35430,7 +35918,7 @@ msgstr ""
msgid "To get started, use the link below to confirm your account."
msgstr ""
-msgid "To help improve GitLab and its user experience, GitLab will periodically collect usage information."
+msgid "To help improve GitLab and its user experience, GitLab periodically collects usage information."
msgstr ""
msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
@@ -35463,7 +35951,7 @@ msgstr ""
msgid "To preserve performance only %{strong_open}%{display_size} of %{real_size}%{strong_close} files are displayed."
msgstr ""
-msgid "To protect this issue's confidentiality, %{forkLink} and set the fork's visibility to private."
+msgid "To protect this issue's confidentiality, %{linkStart}fork this project%{linkEnd} and set the fork's visibility to private."
msgstr ""
msgid "To protect this issue's confidentiality, a private fork of this project was selected."
@@ -35496,12 +35984,15 @@ msgstr ""
msgid "To set up SAML authentication for your group through an identity provider like Azure, Okta, Onelogin, Ping Identity, or your custom SAML 2.0 provider:"
msgstr ""
-msgid "To set up this service:"
+msgid "To set up this integration:"
msgstr ""
msgid "To specify the notification level per project of a group you belong to, you need to visit project page and change notification level there."
msgstr "Чтобы указать уровень уведомлений по проекту группы, к которой вы принадлежите, необходимо поÑетить Ñтраницу проекта и изменить уровень уведомлений."
+msgid "To start using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
+msgstr ""
+
msgid "To unsubscribe from this issue, please paste the following link into your browser:"
msgstr ""
@@ -36091,9 +36582,6 @@ msgstr ""
msgid "Unable to fetch branches list, please close the form and try again"
msgstr ""
-msgid "Unable to fetch unscanned projects"
-msgstr ""
-
msgid "Unable to fetch vulnerable projects"
msgstr ""
@@ -36148,6 +36636,15 @@ msgstr ""
msgid "Unable to update this issue at this time."
msgstr "Ðевозможно обновить Ñто обÑуждение в данный момент."
+msgid "Unapprove a merge request"
+msgstr ""
+
+msgid "Unapprove the current merge request."
+msgstr ""
+
+msgid "Unapproved the current merge request."
+msgstr ""
+
msgid "Unarchive project"
msgstr "ВоÑÑтановить проект"
@@ -36160,16 +36657,13 @@ msgstr "Отменить назначение комментирующего пÐ
msgid "Unassigned"
msgstr ""
-msgid "Unauthenticated API request rate limit"
-msgstr ""
-
-msgid "Unauthenticated rate limit period in seconds"
+msgid "Unauthenticated API rate limit period in seconds"
msgstr ""
-msgid "Unauthenticated request rate limit"
+msgid "Unauthenticated requests"
msgstr ""
-msgid "Unauthenticated requests"
+msgid "Unauthenticated web rate limit period in seconds"
msgstr ""
msgid "Undo"
@@ -36271,18 +36765,6 @@ msgstr ""
msgid "Unresolved"
msgstr ""
-msgid "UnscannedProjects|15 or more days"
-msgstr "15 или больше дней"
-
-msgid "UnscannedProjects|30 or more days"
-msgstr "30 или больше дней"
-
-msgid "UnscannedProjects|5 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|60 or more days"
-msgstr "60 или больше дней"
-
msgid "Unschedule job"
msgstr ""
@@ -36502,6 +36984,9 @@ msgstr "СтатиÑтика иÑпользованиÑ"
msgid "UsageQuota|%{help_link_start}Shared runners%{help_link_end} are disabled, so there are no limits set on pipeline usage"
msgstr "%{help_link_start}Общие Runner'Ñ‹%{help_link_end} отключены, поÑтому нет наÑтроенных ограничений в иÑпользовании Ñборочных линий"
+msgid "UsageQuota|%{linkTitle} help link"
+msgstr ""
+
msgid "UsageQuota|%{percentageLeft} of purchased storage is available"
msgstr ""
@@ -36511,6 +36996,9 @@ msgstr "Ðртефакты"
msgid "UsageQuota|Artifacts is a sum of build and pipeline artifacts."
msgstr ""
+msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
+msgstr ""
+
msgid "UsageQuota|Buy additional minutes"
msgstr "Купить дополнительные минуты"
@@ -36520,9 +37008,21 @@ msgstr ""
msgid "UsageQuota|CI minutes usage by project"
msgstr ""
+msgid "UsageQuota|Code packages and container images."
+msgstr ""
+
msgid "UsageQuota|Current period usage"
msgstr "Текущий период иÑпользованиÑ"
+msgid "UsageQuota|File attachments and smaller design graphics."
+msgstr ""
+
+msgid "UsageQuota|Git repository, managed by the Gitaly service."
+msgstr ""
+
+msgid "UsageQuota|Includes project registry, artifacts, packages, wiki, uploads and other items."
+msgstr ""
+
msgid "UsageQuota|Increase storage temporarily"
msgstr ""
@@ -36541,6 +37041,9 @@ msgstr ""
msgid "UsageQuota|Packages"
msgstr "Пакеты"
+msgid "UsageQuota|Pipeline artifacts and job artifacts, created with CI/CD."
+msgstr ""
+
msgid "UsageQuota|Pipelines"
msgstr "Сборочные линии"
@@ -36559,6 +37062,9 @@ msgstr "Репозиторий"
msgid "UsageQuota|Seats"
msgstr ""
+msgid "UsageQuota|Shared bits of code and text."
+msgstr ""
+
msgid "UsageQuota|Snippets"
msgstr ""
@@ -36568,6 +37074,12 @@ msgstr ""
msgid "UsageQuota|Storage"
msgstr "Хранилище"
+msgid "UsageQuota|Storage type"
+msgstr ""
+
+msgid "UsageQuota|There is a known issue with Artifact storage where the total could be incorrect for some projects. More details and progress are available in %{warningLinkStart}the epic%{warningLinkEnd}."
+msgstr ""
+
msgid "UsageQuota|This is the total amount of storage used across your projects within this namespace."
msgstr ""
@@ -36607,6 +37119,9 @@ msgstr ""
msgid "UsageQuota|Usage"
msgstr "ИÑпользование"
+msgid "UsageQuota|Usage Breakdown"
+msgstr ""
+
msgid "UsageQuota|Usage Quotas"
msgstr "Квоты иÑпользованиÑ"
@@ -36631,6 +37146,9 @@ msgstr ""
msgid "UsageQuota|Wiki"
msgstr "Wiki"
+msgid "UsageQuota|Wiki content."
+msgstr ""
+
msgid "UsageQuota|Wikis"
msgstr "Вики"
@@ -36847,7 +37365,10 @@ msgstr ""
msgid "User Settings"
msgstr "ÐаÑтройки пользователÑ"
-msgid "User and IP Rate Limits"
+msgid "User and IP rate limits"
+msgstr ""
+
+msgid "User does not have a pending request"
msgstr ""
msgid "User identity was successfully created."
@@ -37144,6 +37665,9 @@ msgstr "Пользователи"
msgid "Users can launch a development environment from a GitLab browser tab when the %{linkStart}Gitpod%{linkEnd} integration is enabled."
msgstr ""
+msgid "Users can reactivate their account by signing in."
+msgstr ""
+
msgid "Users can render diagrams in AsciiDoc, Markdown, reStructuredText, and Textile documents using Kroki."
msgstr ""
@@ -37159,6 +37683,9 @@ msgstr ""
msgid "Users requesting access to"
msgstr ""
+msgid "Users to exclude from the rate limit"
+msgstr ""
+
msgid "Users were successfully added."
msgstr "Пользователи были уÑпешно добавлены."
@@ -37180,6 +37707,9 @@ msgstr "Ðет ответÑтвенного - %{openingTag} назначить Ñ
msgid "UsersSelect|Unassigned"
msgstr "Ðе назначено"
+msgid "Uses GitLab as a lightweight alternative to Sentry."
+msgstr ""
+
msgid "Using %{code_start}::%{code_end} denotes a %{link_start}scoped label set%{link_end}"
msgstr ""
@@ -37210,10 +37740,7 @@ msgstr "Ðналитика потока ценноÑти"
msgid "Value Stream Analytics can help you determine your team’s velocity"
msgstr "Ðналитика потока ценноÑти поможет вам определить ÑкороÑÑ‚ÑŒ работы вашей команды"
-msgid "Value Stream Analytics gives an overview of how much time it takes to go from idea to production in your project."
-msgstr "Ðналитика потока ценноÑти дает общее предÑтавление о том, Ñколько времени в вашем проекте занимает путь от идеи до выпуÑка."
-
-msgid "Value may contain a variable reference"
+msgid "Value might contain a variable reference"
msgstr ""
msgid "Value stream"
@@ -37279,10 +37806,10 @@ msgstr ""
msgid "ValueStream|The Default Value Stream cannot be deleted"
msgstr "Поток ценноÑти по умолчанию не может быть удалён"
-msgid "Variable"
+msgid "Values that contain the %{codeStart}$%{codeEnd} character can be considered a variable reference and expanded. %{docsLinkStart}Learn more.%{docsLinkEnd}"
msgstr ""
-msgid "Variable references indicated by %{codeStart}$%{codeEnd} may be expanded. If this is not what you want, consider %{docsLinkStart}using a workaround to prevent expansion%{docsLinkEnd}."
+msgid "Variable"
msgstr ""
msgid "Variable will be masked in job logs."
@@ -37693,6 +38220,9 @@ msgstr ""
msgid "Vulnerability|Evidence"
msgstr ""
+msgid "Vulnerability|False positive detected"
+msgstr ""
+
msgid "Vulnerability|File"
msgstr ""
@@ -37735,6 +38265,9 @@ msgstr ""
msgid "Vulnerability|Status"
msgstr ""
+msgid "Vulnerability|The scanner determined this vulnerability to be a false positive. Verify the evaluation before changing its status. %{linkStart}Learn more about false positive detection.%{linkEnd}"
+msgstr ""
+
msgid "Vulnerability|The unmodified response is the original response that had no mutations done to the request"
msgstr ""
@@ -38059,9 +38592,6 @@ msgstr "Добро пожаловать в GitLab, %{first_name}!"
msgid "Welcome to GitLab,%{br_tag}%{name}!"
msgstr ""
-msgid "Welcome to the guided GitLab tour"
-msgstr ""
-
msgid "Welcome, %{name}!"
msgstr ""
@@ -38080,9 +38610,6 @@ msgstr ""
msgid "What are you searching for?"
msgstr ""
-msgid "What describes you best?"
-msgstr ""
-
msgid "What does this command do?"
msgstr ""
@@ -38104,13 +38631,13 @@ msgstr ""
msgid "What is your job title? (optional)"
msgstr ""
-msgid "What will you use this group for?"
+msgid "What templates can I create?"
msgstr ""
-msgid "What's new"
+msgid "What will you use this group for?"
msgstr ""
-msgid "What’s your experience level?"
+msgid "What's new"
msgstr ""
msgid "When a deployment job is successful, skip older deployment jobs that are still pending."
@@ -38122,6 +38649,9 @@ msgstr "Когда Runner закреплён, он не может быть на
msgid "When an event in GitLab triggers a webhook, you can use the request details to figure out if something went wrong."
msgstr ""
+msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+msgstr ""
+
msgid "When inactive, an external authentication provider must be used."
msgstr ""
@@ -38147,6 +38677,9 @@ msgstr ""
msgid "When:"
msgstr "Когда:"
+msgid "Which API requests are affected?"
+msgstr ""
+
msgid "While it's rare to have no vulnerabilities, it can happen. In any event, we ask that you please double check your settings to make sure you've set up your dashboard correctly."
msgstr ""
@@ -38426,6 +38959,9 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|Work Items"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -38501,6 +39037,9 @@ msgstr "Ð’Ñ‹ ÑобираетеÑÑŒ передать контроль над вÐ
msgid "You are already a member of this %{member_source}."
msgstr ""
+msgid "You are already impersonating another user"
+msgstr ""
+
msgid "You are an admin, which means granting access to %{client_name} will allow them to interact with GitLab as an admin as well. Proceed with caution."
msgstr ""
@@ -38603,6 +39142,9 @@ msgstr "Ð’Ñ‹ также можете загрузить ÑущеÑтвующие
msgid "You can also use project access tokens with Git to authenticate over HTTP(S). %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "You can always change your URL later"
+msgstr ""
+
msgid "You can always edit this later"
msgstr ""
@@ -38759,10 +39301,10 @@ msgstr "Ð’Ñ‹ не можете запиÑывать на Ñтот Ñкземпл
msgid "You can’t %{tag_start}edit%{tag_end} files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
-msgid "You could not create a new trigger."
+msgid "You can’t edit files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
-msgid "You didn't renew your subscription for %{strong}%{namespace_name}%{strong_close} so it was downgraded to the free plan."
+msgid "You could not create a new trigger."
msgstr ""
msgid "You do not have any subscriptions yet"
@@ -38930,6 +39472,12 @@ msgstr "Ð’Ñ‹ должны ввеÑти правильный текущий паÑ
msgid "You must provide your current password in order to change it."
msgstr "Ð”Ð»Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¿Ð°Ñ€Ð¾Ð»Ñ Ð½ÐµÐ¾Ð±Ñ…Ð¾Ð´Ð¸Ð¼Ð¾ ввеÑти текущий пароль."
+msgid "You must sign in to search for specific projects."
+msgstr ""
+
+msgid "You must sign in to search for specific terms."
+msgstr ""
+
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
@@ -38957,6 +39505,9 @@ msgstr "Вам необходимо указать и токен доÑтупа,
msgid "You need to upload a GitLab project export archive (ending in .gz)."
msgstr "Вам необходимо загрузить ÑкÑпортированный архив проекта GitLab (заканчивающийÑÑ Ð½Ð° .gz)."
+msgid "You need to verify your primary email first before enabling Two-Factor Authentication."
+msgstr ""
+
msgid "You successfully declined the invitation"
msgstr ""
@@ -39065,10 +39616,10 @@ msgstr ""
msgid "Your %{host} account was signed in to from a new location"
msgstr ""
-msgid "Your %{strong}%{plan_name}%{strong_close} subscription for %{strong}%{namespace_name}%{strong_close} will expire on %{strong}%{expires_on}%{strong_close}."
+msgid "Your %{strong}%{plan_name}%{strong_close} subscription expires on %{strong}%{expires_on}%{strong_close}. After that date, you cannot create issues or merge requests, or use many other features."
msgstr ""
-msgid "Your %{strong}%{plan_name}%{strong_close} subscription will expire on %{strong}%{expires_on}%{strong_close}. After that, you will not be able to create issues or merge requests as well as many other features."
+msgid "Your %{strong}%{plan_name}%{strong_close} subscription for %{strong}%{namespace_name}%{strong_close} will expire on %{strong}%{expires_on}%{strong_close}."
msgstr ""
msgid "Your CI/CD configuration syntax is invalid. View Lint tab for more details."
@@ -39092,7 +39643,7 @@ msgstr ""
msgid "Your GPG keys (%{count})"
msgstr "Ваши ключи GPG (%{count})"
-msgid "Your GitLab account has been locked due to an excessive amount of unsuccessful sign in attempts. Your account will automatically unlock in %{duration} or you may click the link below to unlock now."
+msgid "Your GitLab account has been locked due to an excessive number of unsuccessful sign in attempts. You can wait for your account to automatically unlock in %{duration} or you can click the link below to unlock now."
msgstr ""
msgid "Your GitLab account request has been approved!"
@@ -39203,6 +39754,9 @@ msgstr ""
msgid "Your commit email is used for web based operations, such as edits and merges."
msgstr ""
+msgid "Your current password is required to register a two-factor authenticator app."
+msgstr ""
+
msgid "Your dashboard has been copied. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr "Ваша панель ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð±Ñ‹Ð»Ð° Ñкопирована. Ð’Ñ‹ можете %{web_ide_link_start}отредактировать Ñто здеÑÑŒ%{web_ide_link_end}."
@@ -39302,6 +39856,9 @@ msgstr ""
msgid "Your project limit is %{limit} projects! Please contact your administrator to increase it"
msgstr "Ваш лимит проектов - %{limit} проектов! ПожалуйÑта, ÑвÑжитеÑÑŒ Ñ Ð²Ð°ÑˆÐ¸Ð¼ админиÑтратором, чтобы увеличить его"
+msgid "Your project will be created at:"
+msgstr ""
+
msgid "Your projects"
msgstr "Ваши проекты"
@@ -39341,11 +39898,12 @@ msgstr ""
msgid "Your subscription expired!"
msgstr ""
-msgid "Your subscription has been downgraded."
-msgstr ""
-
-msgid "Your subscription will expire in %{remaining_days}."
-msgstr ""
+msgid "Your subscription will expire in %{remaining_days} day."
+msgid_plural "Your subscription will expire in %{remaining_days} days."
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
msgid "Your username is %{username}."
msgstr ""
@@ -39556,6 +40114,9 @@ msgstr ""
msgid "cannot merge"
msgstr ""
+msgid "cannot not be used for user namespace"
+msgstr ""
+
msgid "ciReport|%{degradedNum} degraded"
msgstr ""
@@ -39881,6 +40442,9 @@ msgstr ""
msgid "created %{timeAgo}"
msgstr ""
+msgid "created %{timeAgo} by %{author}"
+msgstr ""
+
msgid "created by"
msgstr ""
@@ -39927,9 +40491,6 @@ msgstr ""
msgid "does not have a supported extension. Only %{extension_list} are supported"
msgstr ""
-msgid "domain is not authorized for sign-up."
-msgstr ""
-
msgid "download it"
msgstr ""
@@ -39949,20 +40510,13 @@ msgstr "Ñлемент не ÑвлÑетÑÑ Ð¸ÐµÑ€Ð°Ñ€Ñ…Ð¸ÐµÐ¹"
msgid "email '%{email}' is not a verified email."
msgstr ""
-msgid "email does not match the allowed domain of %{email_domains}"
-msgid_plural "email does not match the allowed domains: %{email_domains}"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
-
msgid "enabled"
msgstr "включено"
msgid "encrypted: needs to be a :required, :optional or :migrating!"
msgstr ""
-msgid "ending with MIME type format is not allowed."
+msgid "ending with a reserved file extension is not allowed."
msgstr ""
msgid "entries cannot be larger than 255 characters"
@@ -39986,6 +40540,9 @@ msgstr "ошибка"
msgid "estimateCommand|%{slash_command} overwrites the total estimated time."
msgstr ""
+msgid "example.com"
+msgstr ""
+
msgid "exceeds the limit of %{bytes} bytes"
msgstr ""
@@ -40038,9 +40595,6 @@ msgstr ""
msgid "fork"
msgstr ""
-msgid "fork this project"
-msgstr ""
-
msgid "from"
msgstr "от"
@@ -40051,6 +40605,9 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "frontmatter"
+msgstr ""
+
msgid "group"
msgstr "группа"
@@ -40078,6 +40635,9 @@ msgstr ""
msgid "has been completed."
msgstr ""
+msgid "has too deep level of nesting"
+msgstr ""
+
msgid "help"
msgstr "помощь"
@@ -40111,9 +40671,21 @@ msgstr ""
msgid "in"
msgstr ""
+msgid "in Infrastructure :: Kubernetes clusters"
+msgstr ""
+
+msgid "in all GitLab"
+msgstr ""
+
+msgid "in group"
+msgstr ""
+
msgid "in group %{link_to_group}"
msgstr "в группе %{link_to_group}"
+msgid "in project"
+msgstr ""
+
msgid "in project %{link_to_project}"
msgstr "в проекте %{link_to_project}"
@@ -40157,18 +40729,21 @@ msgstr ""
msgid "is not a valid X509 certificate."
msgstr ""
-msgid "is not allowed since the group is not top-level group."
+msgid "is not allowed for sign-up."
msgstr ""
-msgid "is not allowed. Try again with a different email address, or contact your GitLab admin."
-msgstr "не разрешено. Попробуйте ещё раз Ñ Ð´Ñ€ÑƒÐ³Ð¸Ð¼ адреÑом Ñлектронной почты или ÑвÑжитеÑÑŒ Ñ Ð°Ð´Ð¼Ð¸Ð½Ð¸Ñтратором GitLab."
+msgid "is not allowed for this group."
+msgstr ""
-msgid "is not allowed. We do not currently support project-level iterations"
-msgstr "невозможно. Ðа данный момент мы не поддерживаем итерации ÑƒÑ€Ð¾Ð²Ð½Ñ Ð¿Ñ€Ð¾ÐµÐºÑ‚Ð°"
+msgid "is not allowed for this project."
+msgstr ""
-msgid "is not from an allowed domain."
+msgid "is not allowed since the group is not top-level group."
msgstr ""
+msgid "is not allowed. We do not currently support project-level iterations"
+msgstr "невозможно. Ðа данный момент мы не поддерживаем итерации ÑƒÑ€Ð¾Ð²Ð½Ñ Ð¿Ñ€Ð¾ÐµÐºÑ‚Ð°"
+
msgid "is not in the group enforcing Group Managed Account"
msgstr ""
@@ -40259,6 +40834,9 @@ msgstr ""
msgid "log in"
msgstr ""
+msgid "managed"
+msgstr ""
+
msgid "manual"
msgstr "ручной"
@@ -40308,6 +40886,9 @@ msgstr ""
msgid "mrWidget| Please restore it or use a different %{missingBranchName} branch"
msgstr ""
+msgid "mrWidget|%{linkStart}Set up now%{linkEnd} to analyze your source code for known security vulnerabilities."
+msgstr ""
+
msgid "mrWidget|%{mergeError}."
msgstr ""
@@ -40390,6 +40971,9 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "mrWidget|Create issue to resolve all threads"
+msgstr ""
+
msgid "mrWidget|Delete source branch"
msgstr ""
@@ -40399,12 +40983,18 @@ msgstr "Ðа данный момент ÑтатиÑтика развёртыва
msgid "mrWidget|Did not close"
msgstr "Ðе закрыт"
+msgid "mrWidget|Dismiss"
+msgstr ""
+
msgid "mrWidget|Email patches"
msgstr "Патчи по Ñлектронной почте"
msgid "mrWidget|Failed to load deployment statistics"
msgstr "Ðе удалоÑÑŒ загрузить ÑтатиÑтику развёртываниÑ"
+msgid "mrWidget|Hide %{widget} details"
+msgstr ""
+
msgid "mrWidget|If the %{missingBranchName} branch exists in your local repository, you can merge this merge request manually using the command line"
msgstr ""
@@ -40502,9 +41092,6 @@ msgstr ""
msgid "mrWidget|Request to merge"
msgstr "Ð—Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° ÑлиÑние"
-msgid "mrWidget|Resolve all threads in new issue"
-msgstr ""
-
msgid "mrWidget|Resolve conflicts"
msgstr "Разрешить конфликты"
@@ -40520,6 +41107,9 @@ msgstr "Откатить Ñтот Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° ÑлиÑние в новом
msgid "mrWidget|Revoke approval"
msgstr ""
+msgid "mrWidget|SAST and Secret Detection is not enabled."
+msgstr ""
+
msgid "mrWidget|Set by %{merge_author} to be added to the merge train when the pipeline succeeds"
msgstr ""
@@ -40529,6 +41119,9 @@ msgstr ""
msgid "mrWidget|Set by %{merge_author} to start a merge train when the pipeline succeeds"
msgstr ""
+msgid "mrWidget|Show %{widget} details"
+msgstr ""
+
msgid "mrWidget|The changes were merged into"
msgstr "Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð±Ñ‹Ð»Ð¸ Ñлиты в"
@@ -40541,6 +41134,9 @@ msgstr "Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð±ÑƒÐ´ÑƒÑ‚ Ñлиты в"
msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure, or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
msgstr ""
+msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure."
+msgstr ""
+
msgid "mrWidget|The source branch has been deleted"
msgstr ""
@@ -40583,6 +41179,9 @@ msgstr ""
msgid "mrWidget|You can merge after removing denied licenses"
msgstr ""
+msgid "mrWidget|You can only merge once this merge request is approved."
+msgstr ""
+
msgid "mrWidget|Your password"
msgstr "Ваш пароль"
@@ -40619,6 +41218,9 @@ msgstr ""
msgid "must be less than the limit of %{tag_limit} tags"
msgstr ""
+msgid "must be set for a project namespace"
+msgstr ""
+
msgid "must be unique by status and elapsed time within a policy"
msgstr ""
@@ -40732,6 +41334,9 @@ msgstr "личные токены доÑтупа"
msgid "pipeline"
msgstr "ÑÐ±Ð¾Ñ€Ð¾Ñ‡Ð½Ð°Ñ Ð»Ð¸Ð½Ð¸Ñ"
+msgid "pipeline schedules documentation"
+msgstr ""
+
msgid "pod_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
msgstr "pod_name может Ñодержать только латинÑкие буквы в нижнем региÑтре, цифры, знаки '-' и '.', а также должен начинатьÑÑ Ð¸ заканчиватьÑÑ Ð±ÑƒÐºÐ²Ð¾Ð¹ или цифрой."
@@ -40785,16 +41390,25 @@ msgstr ""
msgid "project name"
msgstr "название проекта"
+msgid "project namespace cannot be the parent of another namespace"
+msgstr ""
+
msgid "projects"
msgstr "проекты"
msgid "quick actions"
msgstr "быÑтрые дейÑтвиÑ"
-msgid "reCAPTCHA Private Key"
+msgid "reCAPTCHA"
+msgstr ""
+
+msgid "reCAPTCHA helps prevent credential stuffing."
msgstr ""
-msgid "reCAPTCHA Site Key"
+msgid "reCAPTCHA private key"
+msgstr ""
+
+msgid "reCAPTCHA site key"
msgstr ""
msgid "recent activity"
@@ -41023,6 +41637,9 @@ msgstr ""
msgid "user avatar"
msgstr "аватар пользователÑ"
+msgid "user namespace cannot be the parent of another namespace"
+msgstr ""
+
msgid "user preferences"
msgstr ""
@@ -41117,3 +41734,9 @@ msgstr "неверный YAML"
msgid "your settings"
msgstr "ваши наÑтройки"
+msgid "{group}"
+msgstr ""
+
+msgid "{project}"
+msgstr ""
+
diff --git a/locale/si_LK/gitlab.po b/locale/si_LK/gitlab.po
index 9e44c97db8c..3b636f46c73 100644
--- a/locale/si_LK/gitlab.po
+++ b/locale/si_LK/gitlab.po
@@ -14,10 +14,7 @@ msgstr ""
"X-Crowdin-Language: si-LK\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-09-01 22:31\n"
-
-msgid " %{name}, confirm your email address now! "
-msgstr ""
+"PO-Revision-Date: 2021-10-04 20:19\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -92,6 +89,16 @@ msgstr ""
msgid "#general, #development"
msgstr ""
+msgid "%d Alert"
+msgid_plural "%d Alerts"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d Alert:"
+msgid_plural "%d Alerts:"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d Approval"
msgid_plural "%d Approvals"
msgstr[0] ""
@@ -455,7 +462,10 @@ msgstr ""
msgid "%{code_open}Protected:%{code_close} Only exposed to protected branches or tags."
msgstr ""
-msgid "%{commit_author_link} authored %{commit_timeago}"
+msgid "%{commit_author_link} authored %{commit_authored_timeago}"
+msgstr ""
+
+msgid "%{commit_author_link} authored %{commit_authored_timeago} and %{commit_committer_avatar} %{commit_committer_link} committed %{commit_committer_timeago}"
msgstr ""
msgid "%{completedCount} completed weight"
@@ -549,6 +559,15 @@ msgstr ""
msgid "%{doc_link_start}Advanced search%{doc_link_end} is enabled."
msgstr ""
+msgid "%{docs_link_start}Learn about visibility levels.%{docs_link_end}"
+msgstr ""
+
+msgid "%{docs_link_start}What is Large File Storage?%{docs_link_end}"
+msgstr ""
+
+msgid "%{docs_link_start}What is two-factor authentication?%{docs_link_end}"
+msgstr ""
+
msgid "%{due_date} (Past due)"
msgstr ""
@@ -621,9 +640,6 @@ msgstr ""
msgid "%{issueType} actions"
msgstr ""
-msgid "%{issuesCount} issues with a limit of %{maxIssueCount}"
-msgstr ""
-
msgid "%{issuesSize} with a limit of %{maxIssueCount}"
msgstr ""
@@ -681,6 +697,12 @@ msgstr ""
msgid "%{label_for_message} unavailable"
msgstr ""
+msgid "%{learn_more_link}."
+msgstr ""
+
+msgid "%{lessThan} 1 hour"
+msgstr ""
+
msgid "%{lets_encrypt_link_start}Let's Encrypt%{lets_encrypt_link_end} is a free, automated, and open certificate authority (CA) that issues digital certificates to enable HTTPS (SSL/TLS) for sites."
msgstr ""
@@ -693,15 +715,15 @@ msgstr ""
msgid "%{link_start}Learn more%{link_end} about roles."
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
-msgstr ""
-
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
msgstr ""
msgid "%{link_start}Start the title with %{draft_snippet}%{link_end} to prevent a merge request that is a work in progress from being merged before it's ready."
msgstr ""
+msgid "%{link_start}What information does GitLab Inc. collect?%{link_end}"
+msgstr ""
+
msgid "%{listToShow}, and %{awardsListLength} more"
msgstr ""
@@ -854,7 +876,7 @@ msgid_plural "%{securityScanner} results are not available because a pipeline ha
msgstr[0] ""
msgstr[1] ""
-msgid "%{service_ping_link_start}Learn more%{service_ping_link_end} about what information is shared with GitLab Inc."
+msgid "%{service_ping_link_start}What information is shared with GitLab Inc.?%{service_ping_link_end}"
msgstr ""
msgid "%{size} %{unit}"
@@ -890,6 +912,9 @@ msgstr ""
msgid "%{state} epics"
msgstr ""
+msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
+msgstr ""
+
msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
msgstr ""
@@ -949,11 +974,6 @@ msgstr ""
msgid "%{template_project_id} is unknown or invalid"
msgstr ""
-msgid "%{text} %{files}"
-msgid_plural "%{text} %{files} files"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%{text} is available"
msgstr ""
@@ -1038,9 +1058,6 @@ msgstr ""
msgid "%{wildcards_link_start}Wildcards%{wildcards_link_end} such as %{code_tag_start}v*%{code_tag_end} or %{code_tag_start}*-release%{code_tag_end} are supported."
msgstr ""
-msgid "&lt; 1 hour"
-msgstr ""
-
msgid "'%{data}' at %{location} does not match format: %{format}"
msgstr ""
@@ -1124,9 +1141,6 @@ msgstr ""
msgid "(we need your current password to confirm your changes)"
msgstr ""
-msgid "* * * * *"
-msgstr ""
-
msgid "+ %{amount} more"
msgstr ""
@@ -1193,10 +1207,10 @@ msgstr ""
msgid "."
msgstr ""
-msgid "0 bytes"
+msgid "/"
msgstr ""
-msgid "0 for unlimited, only effective with remote storage enabled."
+msgid "0 bytes"
msgstr ""
msgid "0t1DgySidms"
@@ -1326,6 +1340,9 @@ msgstr ""
msgid "1000+"
msgstr ""
+msgid "192.168.0.0/24"
+msgstr ""
+
msgid "1st contribution!"
msgstr ""
@@ -1479,9 +1496,6 @@ msgstr ""
msgid "A plain HTML site that uses Netlify for CI/CD instead of GitLab, but still with all the other great GitLab features"
msgstr ""
-msgid "A plain-text response to show to clients that hit the rate limit."
-msgstr ""
-
msgid "A platform value can be web, mob or app."
msgstr ""
@@ -1563,7 +1577,7 @@ msgstr ""
msgid "APIFuzzing|Configure HTTP basic authentication values. Other authentication methods are supported. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
+msgid "APIFuzzing|Customize your project's API fuzzing configuration options and copy the code snippet to your .gitlab-ci.yml file to apply any changes. Note that this tool does not reflect or update your .gitlab-ci.yml file automatically. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
msgstr ""
msgid "APIFuzzing|Enable authentication"
@@ -1626,9 +1640,6 @@ msgstr ""
msgid "APIFuzzing|To prevent a security leak, authentication info must be added as a %{ciVariablesLinkStart}CI variable%{ciVariablesLinkEnd}. As a user with maintainer access rights, you can manage CI variables in the %{ciSettingsLinkStart}Settings%{ciSettingsLinkEnd} area."
msgstr ""
-msgid "APIFuzzing|Use this tool to generate API fuzzing configuration YAML to copy into your .gitlab-ci.yml file. This tool does not reflect or update your .gitlab-ci.yml file automatically."
-msgstr ""
-
msgid "APIFuzzing|Username for basic authentication"
msgstr ""
@@ -1680,9 +1691,6 @@ msgstr ""
msgid "Abuse reports notification email"
msgstr ""
-msgid "Abuse reports will be sent to this address if it is set. Abuse reports are always available in the admin area."
-msgstr ""
-
msgid "Accept invitation"
msgstr ""
@@ -1719,12 +1727,18 @@ msgstr ""
msgid "Access granted"
msgstr ""
+msgid "Access key ID"
+msgstr ""
+
msgid "Access requests"
msgstr ""
msgid "Access to '%{classification_label}' not allowed"
msgstr ""
+msgid "Access tokens expire after 2 hours. A refresh token may be used at any time to generate a new access token. Non-expiring access tokens are deprecated. Clear this setting to enable backward compatibility."
+msgstr ""
+
msgid "AccessDropdown|Deploy Keys"
msgstr ""
@@ -2037,6 +2051,9 @@ msgstr ""
msgid "Add new directory"
msgstr ""
+msgid "Add new service account"
+msgstr ""
+
msgid "Add or remove previously merged commits"
msgstr ""
@@ -2274,6 +2291,9 @@ msgstr ""
msgid "AdminArea|Features"
msgstr ""
+msgid "AdminArea|Get security updates from GitLab and stay up to date"
+msgstr ""
+
msgid "AdminArea|Groups"
msgstr ""
@@ -2313,6 +2333,12 @@ msgstr ""
msgid "AdminArea|Reporter"
msgstr ""
+msgid "AdminArea|Sign up for the GitLab Security Newsletter to get notified for security updates."
+msgstr ""
+
+msgid "AdminArea|Sign up for the GitLab newsletter"
+msgstr ""
+
msgid "AdminArea|Stop all jobs"
msgstr ""
@@ -2382,9 +2408,15 @@ msgstr ""
msgid "AdminSettings|Disable public access to Pages sites"
msgstr ""
+msgid "AdminSettings|Display a banner on merge requests in projects with no pipelines to initiate steps to add a .gitlab-ci.yml file."
+msgstr ""
+
msgid "AdminSettings|Domain verification is an essential security measure for public GitLab sites. Users are required to demonstrate they control a domain before it is enabled. %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "AdminSettings|Enable pipeline suggestion banner"
+msgstr ""
+
msgid "AdminSettings|Enable shared runners for new projects"
msgstr ""
@@ -2856,10 +2888,10 @@ msgstr ""
msgid "Admin|Quarterly reconciliation will occur on %{qrtlyDate}"
msgstr ""
-msgid "Admin|The number of max seats used for your namespace is currently exceeding the number of seats in your subscription. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgid "Admin|The number of max seats in your namespace exceeds the number of seats in your subscription. On %{qrtlyDate}, quarterly reconciliation occurs and you are automatically billed a prorated amount for the overage. No action is needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice. For more information about the timing of the invoicing process, view the documentation."
msgstr ""
-msgid "Admin|The number of maximum users for your instance is currently exceeding the number of users in license. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgid "Admin|The number of max users in your instance exceeds the number of users in your license. On %{qrtlyDate}, quarterly reconciliation occurs and you are automatically billed a prorated amount for the overage. No action is needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice. For more information about the timing of the invoicing process, view the documentation."
msgstr ""
msgid "Admin|View pending user approvals"
@@ -2880,9 +2912,6 @@ msgstr ""
msgid "Advanced export options"
msgstr ""
-msgid "Advanced permissions, Large File Storage and Two-Factor authentication settings."
-msgstr ""
-
msgid "After a successful password update you will be redirected to login screen."
msgstr ""
@@ -2901,13 +2930,14 @@ msgstr ""
msgid "After you've reviewed these contribution guidelines, you'll be all set to"
msgstr ""
+msgid "Akismet"
+msgstr ""
+
msgid "Akismet API Key"
msgstr ""
-msgid "Alert"
-msgid_plural "Alerts"
-msgstr[0] ""
-msgstr[1] ""
+msgid "Akismet helps prevent the creation of spam issues in public projects."
+msgstr ""
msgid "AlertManagement|Acknowledged"
msgstr ""
@@ -3263,6 +3293,9 @@ msgstr ""
msgid "All (default)"
msgstr ""
+msgid "All GitLab"
+msgstr ""
+
msgid "All Members"
msgstr ""
@@ -3377,6 +3410,9 @@ msgstr ""
msgid "Allow this secondary node to replicate content on Object Storage"
msgstr ""
+msgid "Allow use of licensed EE features"
+msgstr ""
+
msgid "Allow users to dismiss the broadcast message"
msgstr ""
@@ -3452,9 +3488,6 @@ msgstr ""
msgid "Amazon authentication is not %{link_start}correctly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
-msgid "Amount of time (in hours) that users are allowed to skip forced configuration of two-factor authentication"
-msgstr ""
-
msgid "An %{link_start}alert%{link_end} with the same fingerprint is already open. To change the status of this alert, resolve the linked alert."
msgstr ""
@@ -3515,12 +3548,6 @@ msgstr ""
msgid "An error occurred when removing the label."
msgstr ""
-msgid "An error occurred when toggling the notification subscription"
-msgstr ""
-
-msgid "An error occurred when updating the issue weight"
-msgstr ""
-
msgid "An error occurred when updating the title"
msgstr ""
@@ -3569,6 +3596,9 @@ msgstr ""
msgid "An error occurred while enabling Service Desk."
msgstr ""
+msgid "An error occurred while fetching Markdown preview"
+msgstr ""
+
msgid "An error occurred while fetching ancestors"
msgstr ""
@@ -3599,9 +3629,6 @@ msgstr ""
msgid "An error occurred while fetching label colors."
msgstr ""
-msgid "An error occurred while fetching markdown preview"
-msgstr ""
-
msgid "An error occurred while fetching participants"
msgstr ""
@@ -3617,9 +3644,6 @@ msgstr ""
msgid "An error occurred while fetching reference"
msgstr ""
-msgid "An error occurred while fetching sidebar data"
-msgstr ""
-
msgid "An error occurred while fetching tags. Retry the search."
msgstr ""
@@ -3695,6 +3719,9 @@ msgstr ""
msgid "An error occurred while loading merge requests."
msgstr ""
+msgid "An error occurred while loading projects."
+msgstr ""
+
msgid "An error occurred while loading the Needs tab."
msgstr ""
@@ -3929,12 +3956,6 @@ msgstr ""
msgid "Any Milestone"
msgstr ""
-msgid "Any branch"
-msgstr ""
-
-msgid "Any eligible user"
-msgstr ""
-
msgid "Any encrypted tokens"
msgstr ""
@@ -3953,6 +3974,9 @@ msgstr ""
msgid "Any namespace"
msgstr ""
+msgid "App Engine description and apps that are suitable for this deployment target"
+msgstr ""
+
msgid "App ID"
msgstr ""
@@ -4101,6 +4125,11 @@ msgstr ""
msgid "Apply"
msgstr ""
+msgid "Apply %d suggestion"
+msgid_plural "Apply %d suggestions"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Apply a label"
msgstr ""
@@ -4110,13 +4139,10 @@ msgstr ""
msgid "Apply suggestion"
msgstr ""
-msgid "Apply suggestions"
-msgstr ""
-
msgid "Apply template"
msgstr ""
-msgid "Apply this approval rule to any branch or a specific protected branch."
+msgid "Apply this approval rule to all branches or a specific protected branch."
msgstr ""
msgid "Applying"
@@ -4259,9 +4285,6 @@ msgstr ""
msgid "ApprovalSettings|Prevent editing approval rules in projects and merge requests."
msgstr ""
-msgid "ApprovalSettings|Prevent editing approval rules in projects and merge requests. "
-msgstr ""
-
msgid "ApprovalSettings|Remove all approvals when commits are added to the source branch."
msgstr ""
@@ -4277,6 +4300,9 @@ msgstr ""
msgid "ApprovalSettings|This setting is configured at the instance level and can only be changed by an administrator."
msgstr ""
+msgid "ApprovalSettings|This setting is configured in %{groupName} and can only be changed by an administrator or group owner."
+msgstr ""
+
msgid "ApprovalStatusTooltip|Adheres to separation of duties"
msgstr ""
@@ -4763,9 +4789,6 @@ msgstr ""
msgid "Authenticated API rate limit period in seconds"
msgstr ""
-msgid "Authenticated API request rate limit"
-msgstr ""
-
msgid "Authenticated API requests"
msgstr ""
@@ -4775,10 +4798,10 @@ msgstr ""
msgid "Authenticated Git LFS request rate limit"
msgstr ""
-msgid "Authenticated web rate limit period in seconds"
+msgid "Authenticated Git LFS requests"
msgstr ""
-msgid "Authenticated web request rate limit"
+msgid "Authenticated web rate limit period in seconds"
msgstr ""
msgid "Authenticated web requests"
@@ -5156,9 +5179,6 @@ msgstr ""
msgid "Below you will find all the groups that are public."
msgstr ""
-msgid "Beta"
-msgstr ""
-
msgid "Bi-weekly code coverage"
msgstr ""
@@ -5398,6 +5418,21 @@ msgstr ""
msgid "Board scope affects which issues are displayed for anyone who visits this board"
msgstr ""
+msgid "BoardNewEpic|Groups"
+msgstr ""
+
+msgid "BoardNewEpic|Loading groups"
+msgstr ""
+
+msgid "BoardNewEpic|No matching results"
+msgstr ""
+
+msgid "BoardNewEpic|Search groups"
+msgstr ""
+
+msgid "BoardNewEpic|Select a group"
+msgstr ""
+
msgid "BoardNewIssue|No matching results"
msgstr ""
@@ -5475,6 +5510,9 @@ msgstr ""
msgid "Boards|An error occurred while creating the list. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching child groups. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching group projects. Please try again."
msgstr ""
@@ -5807,6 +5845,9 @@ msgstr ""
msgid "Bulk update"
msgstr ""
+msgid "BulkImports|Re-import creates a new group. It does not sync with the existing group."
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -5816,6 +5857,9 @@ msgstr ""
msgid "BulkImport|From source group"
msgstr ""
+msgid "BulkImport|Group import history"
+msgstr ""
+
msgid "BulkImport|Import failed: Destination cannot be a subgroup of the source group. Change the destination and try again."
msgstr ""
@@ -5828,9 +5872,18 @@ msgstr ""
msgid "BulkImport|Importing the group failed"
msgstr ""
+msgid "BulkImport|Last imported to %{link}"
+msgstr ""
+
msgid "BulkImport|Name already exists."
msgstr ""
+msgid "BulkImport|New group"
+msgstr ""
+
+msgid "BulkImport|No history is available"
+msgstr ""
+
msgid "BulkImport|No parent"
msgstr ""
@@ -5843,6 +5896,9 @@ msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} matching filter \"%{filter}\" from %{link}"
msgstr ""
+msgid "BulkImport|Source group"
+msgstr ""
+
msgid "BulkImport|To new group"
msgstr ""
@@ -5852,6 +5908,9 @@ msgstr ""
msgid "BulkImport|You have no groups to import"
msgstr ""
+msgid "BulkImport|Your imported groups will appear here."
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -6094,6 +6153,9 @@ msgstr ""
msgid "Can be manually deployed to"
msgstr ""
+msgid "Can be overridden in each project."
+msgstr ""
+
msgid "Can create groups:"
msgstr ""
@@ -6196,6 +6258,9 @@ msgstr ""
msgid "Cancelling Preview"
msgstr ""
+msgid "Cannot assign a confidential epic to a non-confidential issue. Make the issue confidential and try again"
+msgstr ""
+
msgid "Cannot be assigned to other projects."
msgstr ""
@@ -6247,9 +6312,6 @@ msgstr ""
msgid "Cannot refer to a group %{timebox_type} by an internal id!"
msgstr ""
-msgid "Cannot set confidential epic for a non-confidential issue"
-msgstr ""
-
msgid "Cannot show preview. For previews on sketch files, they must have the file format introduced by Sketch version 43 and above."
msgstr ""
@@ -6487,15 +6549,15 @@ msgstr ""
msgid "Check out, review, and merge locally"
msgstr ""
-msgid "Check the %{docs_link_start}documentation%{docs_link_end}."
-msgstr ""
-
msgid "Check the current instance configuration "
msgstr ""
msgid "Check the elasticsearch.log file to debug why the migration was halted and make any changes before retrying the migration. When you fix the cause of the failure, click \"Retry migration\", and the migration will be scheduled to be retried in the background."
msgstr ""
+msgid "Check with your administrator."
+msgstr ""
+
msgid "Check your Docker images for known vulnerabilities."
msgstr ""
@@ -6526,6 +6588,9 @@ msgstr ""
msgid "Checkout"
msgstr ""
+msgid "Checkout|$%{selectedPlanPrice} per 10 GB storage per pack"
+msgstr ""
+
msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 minutes"
msgstr ""
@@ -6546,17 +6611,23 @@ msgstr ""
msgid "Checkout|%{name}'s GitLab subscription"
msgstr ""
-msgid "Checkout|%{selectedPlanText} plan"
+msgid "Checkout|%{name}'s storage subscription"
msgstr ""
-msgid "Checkout|%{startDate} - %{endDate}"
+msgid "Checkout|%{quantity} GB of storage"
msgstr ""
-msgid "Checkout|%{totalCiMinutes} CI minute"
-msgid_plural "Checkout|%{totalCiMinutes} CI minutes"
+msgid "Checkout|%{quantity} storage pack"
+msgid_plural "Checkout|%{quantity} storage packs"
msgstr[0] ""
msgstr[1] ""
+msgid "Checkout|%{selectedPlanText} plan"
+msgstr ""
+
+msgid "Checkout|%{startDate} - %{endDate}"
+msgstr ""
+
msgid "Checkout|%{totalCiMinutes} CI minutes"
msgstr ""
@@ -6632,6 +6703,9 @@ msgstr ""
msgid "Checkout|Failed to register credit card. Please try again."
msgstr ""
+msgid "Checkout|GB"
+msgstr ""
+
msgid "Checkout|GitLab group"
msgstr ""
@@ -6668,6 +6742,9 @@ msgstr ""
msgid "Checkout|State"
msgstr ""
+msgid "Checkout|Storage packs"
+msgstr ""
+
msgid "Checkout|Street address"
msgstr ""
@@ -6689,6 +6766,9 @@ msgstr ""
msgid "Checkout|Total minutes: %{quantity}"
msgstr ""
+msgid "Checkout|Total storage: %{quantity} GB"
+msgstr ""
+
msgid "Checkout|Users"
msgstr ""
@@ -6698,16 +6778,25 @@ msgstr ""
msgid "Checkout|Your organization"
msgstr ""
+msgid "Checkout|Your storage subscription has the same term as your main subscription, and the price is prorated accordingly."
+msgstr ""
+
msgid "Checkout|Your subscription will be applied to this group"
msgstr ""
msgid "Checkout|Zip code"
msgstr ""
+msgid "Checkout|a storage subscription"
+msgstr ""
+
msgid "Checkout|company or team"
msgstr ""
-msgid "Checkout|x 1,000 minutes per pack = %{strong}"
+msgid "Checkout|minutes"
+msgstr ""
+
+msgid "Checkout|x %{quantity} %{units} per pack ="
msgstr ""
msgid "Cherry-pick this commit"
@@ -7064,6 +7153,9 @@ msgstr ""
msgid "CloneIssue|Cannot clone issue to target project as it is pending deletion."
msgstr ""
+msgid "CloneIssue|Cannot clone issues of '%{issue_type}' type."
+msgstr ""
+
msgid "Cloned this issue to %{path_to_project}."
msgstr ""
@@ -7118,7 +7210,10 @@ msgstr ""
msgid "Closes this %{quick_action_target}."
msgstr ""
-msgid "Cloud licenses can not be removed."
+msgid "Cloud Functions description and apps that are suitable for this deployment target"
+msgstr ""
+
+msgid "Cloud Run description and apps that are suitable for this deployment target"
msgstr ""
msgid "Cluster"
@@ -7145,6 +7240,12 @@ msgstr ""
msgid "ClusterAgents|Access tokens"
msgstr ""
+msgid "ClusterAgents|Agent might not be connected to GitLab"
+msgstr ""
+
+msgid "ClusterAgents|Agent never connected to GitLab"
+msgstr ""
+
msgid "ClusterAgents|Alternative installation methods"
msgstr ""
@@ -7160,6 +7261,12 @@ msgstr ""
msgid "ClusterAgents|Configuration"
msgstr ""
+msgid "ClusterAgents|Connected"
+msgstr ""
+
+msgid "ClusterAgents|Connection status"
+msgstr ""
+
msgid "ClusterAgents|Copy token"
msgstr ""
@@ -7178,6 +7285,9 @@ msgstr ""
msgid "ClusterAgents|For alternative installation methods %{linkStart}go to the documentation%{linkEnd}."
msgstr ""
+msgid "ClusterAgents|For more troubleshooting information go to"
+msgstr ""
+
msgid "ClusterAgents|Go to the repository"
msgstr ""
@@ -7193,18 +7303,30 @@ msgstr ""
msgid "ClusterAgents|Integrate with the GitLab Agent"
msgstr ""
-msgid "ClusterAgents|Last used"
+msgid "ClusterAgents|Last connected %{timeAgo}."
+msgstr ""
+
+msgid "ClusterAgents|Last contact"
msgstr ""
msgid "ClusterAgents|Learn how to create an agent access token"
msgstr ""
+msgid "ClusterAgents|Make sure you are using a valid token."
+msgstr ""
+
msgid "ClusterAgents|Name"
msgstr ""
msgid "ClusterAgents|Never"
msgstr ""
+msgid "ClusterAgents|Never connected"
+msgstr ""
+
+msgid "ClusterAgents|Not connected"
+msgstr ""
+
msgid "ClusterAgents|Read more about getting started"
msgstr ""
@@ -7226,6 +7348,9 @@ msgstr ""
msgid "ClusterAgents|Select which Agent you want to install"
msgstr ""
+msgid "ClusterAgents|The Agent has not been connected in a long time. There might be a connectivity issue. Last contact was %{timeAgo}."
+msgstr ""
+
msgid "ClusterAgents|The GitLab Agent also requires %{linkStart}enabling the Agent Server%{linkEnd}"
msgstr ""
@@ -7253,9 +7378,6 @@ msgstr ""
msgid "ClusterAgents|You will need to create a token to connect to your agent"
msgstr ""
-msgid "ClusterAgent|This feature is only available for premium plans"
-msgstr ""
-
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -7445,9 +7567,6 @@ msgstr ""
msgid "ClusterIntegration|Create Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Create a provision role on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the account and external ID above. %{startMoreInfoLink}More information%{endLink}"
-msgstr ""
-
msgid "ClusterIntegration|Create cluster on"
msgstr ""
@@ -7880,7 +7999,7 @@ msgstr ""
msgid "ClusterIntegration|Subnets"
msgstr ""
-msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provisioned role, first create one on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the above account and external IDs. %{startMoreInfoLink}More information%{endLink}"
+msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provisioned role, first create one on %{awsLinkStart}Amazon Web Services %{awsLinkEnd} using the above account and external IDs. %{moreInfoStart}More information%{moreInfoEnd}"
msgstr ""
msgid "ClusterIntegration|The Kubernetes certificate used to authenticate to the cluster."
@@ -8114,6 +8233,9 @@ msgstr ""
msgid "Collapse replies"
msgstr ""
+msgid "Collapse settings section"
+msgstr ""
+
msgid "Collapse sidebar"
msgstr ""
@@ -8132,6 +8254,9 @@ msgstr ""
msgid "Comma-separated list of email addresses."
msgstr ""
+msgid "Comma-separated list of users allowed to exceed the rate limit."
+msgstr ""
+
msgid "Comma-separated, e.g. '1.1.1.1, 2.2.2.0/24'"
msgstr ""
@@ -8452,6 +8577,9 @@ msgstr ""
msgid "Configure %{repository_checks_link_start}repository checks%{link_end} and %{housekeeping_link_start}housekeeping%{link_end} on repositories."
msgstr ""
+msgid "Configure CAPTCHAs, IP address limits, and other anti-spam measures."
+msgstr ""
+
msgid "Configure Dependency Scanning in `.gitlab-ci.yml` using the GitLab managed template. You can [add variable overrides](https://docs.gitlab.com/ee/user/application_security/dependency_scanning/#customizing-the-dependency-scanning-settings) to customize Dependency Scanning settings."
msgstr ""
@@ -8488,16 +8616,13 @@ msgstr ""
msgid "Configure a %{codeStart}.gitlab-webide.yml%{codeEnd} file in the %{codeStart}.gitlab%{codeEnd} directory to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
msgstr ""
-msgid "Configure existing installation"
-msgstr ""
-
-msgid "Configure limit for notes created per minute by web and API requests."
+msgid "Configure advanced permissions, Large File Storage, and two-factor authentication settings."
msgstr ""
-msgid "Configure limits for Project/Group Import/Export."
+msgid "Configure approvals by authors and committers on all projects."
msgstr ""
-msgid "Configure limits for web and API requests."
+msgid "Configure existing installation"
msgstr ""
msgid "Configure paths to be protected by Rack Attack."
@@ -8512,10 +8637,13 @@ msgstr ""
msgid "Configure settings for Advanced Search with Elasticsearch."
msgstr ""
+msgid "Configure specific limits for Files API requests that supersede the general user and IP rate limits."
+msgstr ""
+
msgid "Configure specific limits for Git LFS requests that supersede the general user and IP rate limits."
msgstr ""
-msgid "Configure specific limits for Packages API requests that supersede the general user and IP rate limits."
+msgid "Configure specific limits for deprecated API requests that supersede the general user and IP rate limits."
msgstr ""
msgid "Configure the %{link} integration."
@@ -8527,6 +8655,9 @@ msgstr ""
msgid "Configure the way a user creates a new account."
msgstr ""
+msgid "Configure via Merge Request"
+msgstr ""
+
msgid "Configure which lists are shown for anyone who visits this board"
msgstr ""
@@ -8995,6 +9126,9 @@ msgstr ""
msgid "Content parsed with %{link}."
msgstr ""
+msgid "ContentEditor|Table of Contents"
+msgstr ""
+
msgid "ContentEditor|You have to provide a renderMarkdown function or a custom serializer"
msgstr ""
@@ -9181,6 +9315,9 @@ msgstr ""
msgid "Copy link to chart"
msgstr ""
+msgid "Copy prefix"
+msgstr ""
+
msgid "Copy reference"
msgstr ""
@@ -9211,6 +9348,9 @@ msgstr ""
msgid "Copy value"
msgstr ""
+msgid "Corpus Management"
+msgstr ""
+
msgid "Corpus Management|Are you sure you want to delete the corpus?"
msgstr ""
@@ -9439,6 +9579,9 @@ msgstr ""
msgid "Create commit"
msgstr ""
+msgid "Create common files more quickly, and standardize their format."
+msgstr ""
+
msgid "Create confidential merge request"
msgstr ""
@@ -9472,6 +9615,9 @@ msgstr ""
msgid "Create issue"
msgstr ""
+msgid "Create issue to resolve all threads"
+msgstr ""
+
msgid "Create iteration"
msgstr ""
@@ -9526,6 +9672,9 @@ msgstr ""
msgid "Create new..."
msgstr ""
+msgid "Create or import your first project"
+msgstr ""
+
msgid "Create project"
msgstr ""
@@ -9883,7 +10032,7 @@ msgstr ""
msgid "Custom notification events"
msgstr ""
-msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notificationLinkStart} notification emails%{notificationLinkEnd}."
+msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notificationLinkStart}notification emails%{notificationLinkEnd}."
msgstr ""
msgid "Custom project templates"
@@ -10082,10 +10231,10 @@ msgid_plural "CycleAnalytics|Showing %{subjectFilterText} and %{selectedLabelsCo
msgstr[0] ""
msgstr[1] ""
-msgid "CycleAnalytics|Showing data for group '%{groupName}' and %{selectedProjectCount} projects from %{startDate} to %{endDate}"
+msgid "CycleAnalytics|Showing data for group '%{groupName}' and %{selectedProjectCount} projects from %{createdAfter} to %{createdBefore}"
msgstr ""
-msgid "CycleAnalytics|Showing data for group '%{groupName}' from %{startDate} to %{endDate}"
+msgid "CycleAnalytics|Showing data for group '%{groupName}' from %{createdAfter} to %{createdBefore}"
msgstr ""
msgid "CycleAnalytics|Stages"
@@ -10319,6 +10468,9 @@ msgstr ""
msgid "DastProfiles|Manage profiles"
msgstr ""
+msgid "DastProfiles|Manage site profiles"
+msgstr ""
+
msgid "DastProfiles|Minimum = 0 (no timeout enabled), Maximum = 2880 minutes"
msgstr ""
@@ -10394,6 +10546,9 @@ msgstr ""
msgid "DastProfiles|Scanner name"
msgstr ""
+msgid "DastProfiles|Schedule"
+msgstr ""
+
msgid "DastProfiles|Select branch"
msgstr ""
@@ -10463,7 +10618,7 @@ msgstr ""
msgid "DastProfiles|Website"
msgstr ""
-msgid "DastProfiles|You can either choose a passive scan or validate the target site in your chosen site profile. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
+msgid "DastProfiles|You can either choose a passive scan or validate the target site from the site profile management page. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
msgstr ""
msgid "DastProfiles|You cannot run an active scan against an unvalidated site."
@@ -10636,7 +10791,7 @@ msgstr ""
msgid "Days to merge"
msgstr ""
-msgid "Deactivate dormant users after 90 days of inactivity. Users can return to active status by signing in to their account. While inactive, a user is not counted as an active user in the instance."
+msgid "Deactivate dormant users after 90 days of inactivity"
msgstr ""
msgid "Dear Administrator,"
@@ -10723,10 +10878,10 @@ msgstr ""
msgid "Define a custom pattern with cron syntax"
msgstr ""
-msgid "Define approval settings."
+msgid "Define approval rules."
msgstr ""
-msgid "Define approval settings. %{linkStart}Learn more.%{linkEnd}"
+msgid "Define approval rules. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "Define custom rules for what constitutes spam, independent of Akismet"
@@ -10735,7 +10890,7 @@ msgstr ""
msgid "Define environments in the deploy stage(s) in %{code_open}.gitlab-ci.yml%{code_close} to track deployments here."
msgstr ""
-msgid "Define how approval rules are applied as a merge request moves toward completion."
+msgid "Define how approval rules are applied to merge requests."
msgstr ""
msgid "Definition"
@@ -10750,6 +10905,12 @@ msgstr ""
msgid "DelayedJobs|Are you sure you want to run %{job_name} immediately? This job will run automatically after it's timer finishes."
msgstr ""
+msgid "DelayedJobs|Are you sure you want to run %{job_name} immediately? This job will run automatically after its timer finishes."
+msgstr ""
+
+msgid "DelayedJobs|Run the delayed job now?"
+msgstr ""
+
msgid "DelayedJobs|Start now"
msgstr ""
@@ -11026,6 +11187,12 @@ msgstr ""
msgid "Dependency proxy image prefix"
msgstr ""
+msgid "DependencyProxy|Create a local proxy for storing frequently used upstream images. %{docLinkStart}Learn more%{docLinkEnd} about dependency proxies."
+msgstr ""
+
+msgid "DependencyProxy|Dependency Proxy"
+msgstr ""
+
msgid "DependencyProxy|Toggle Dependency Proxy"
msgstr ""
@@ -11266,6 +11433,9 @@ msgstr ""
msgid "Deployments"
msgstr ""
+msgid "Deployments to Google Kubernetes Engine can be "
+msgstr ""
+
msgid "Deployments|%{deployments} environment impacted."
msgid_plural "Deployments|%{deployments} environments impacted."
msgstr[0] ""
@@ -11295,6 +11465,9 @@ msgstr ""
msgid "Deployment|success"
msgstr ""
+msgid "Deprecated API rate limits"
+msgstr ""
+
msgid "Deprioritize label"
msgstr ""
@@ -11697,6 +11870,16 @@ msgstr ""
msgid "DiffsCompareBaseBranch|(base)"
msgstr ""
+msgid "Diffs|%d addition"
+msgid_plural "Diffs|%d additions"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Diffs|%d deletion"
+msgid_plural "Diffs|%d deletions"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Diffs|No file name available"
msgstr ""
@@ -11706,9 +11889,17 @@ msgstr ""
msgid "Diffs|Show all unchanged lines"
msgstr ""
+msgid "Diffs|Showing %{dropdownStart}%{count} changed file%{dropdownEnd}"
+msgid_plural "Diffs|Showing %{dropdownStart}%{count} changed files%{dropdownEnd}"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Diffs|Something went wrong while fetching diff lines."
msgstr ""
+msgid "Diffs|with %{additions} and %{deletions}"
+msgstr ""
+
msgid "Direct member"
msgstr ""
@@ -11834,9 +12025,6 @@ msgid_plural "Dismiss %d selected vulnerabilities as"
msgstr[0] ""
msgstr[1] ""
-msgid "Dismiss Value Stream Analytics introduction box"
-msgstr ""
-
msgid "Dismiss merge request promotion"
msgstr ""
@@ -12158,6 +12346,9 @@ msgstr ""
msgid "Edit issues"
msgstr ""
+msgid "Edit merge requests"
+msgstr ""
+
msgid "Edit public deploy key"
msgstr ""
@@ -12233,6 +12424,9 @@ msgstr ""
msgid "Elastic|None. Select projects to index."
msgstr ""
+msgid "Eligible users"
+msgstr ""
+
msgid "Email"
msgstr ""
@@ -12362,6 +12556,9 @@ msgstr ""
msgid "Enable"
msgstr ""
+msgid "Enable Amazon EKS integration"
+msgstr ""
+
msgid "Enable Auto DevOps"
msgstr ""
@@ -12395,6 +12592,9 @@ msgstr ""
msgid "Enable SSL verification"
msgstr ""
+msgid "Enable Service Ping"
+msgstr ""
+
msgid "Enable Snowplow tracking"
msgstr ""
@@ -12425,6 +12625,9 @@ msgstr ""
msgid "Enable authenticated Git LFS request rate limit"
msgstr ""
+msgid "Enable authenticated web request rate limit"
+msgstr ""
+
msgid "Enable authentication"
msgstr ""
@@ -12485,7 +12688,7 @@ msgstr ""
msgid "Enable or disable the Pseudonymizer data collection."
msgstr ""
-msgid "Enable or disable version check and service ping."
+msgid "Enable or disable version check and Service Ping."
msgstr ""
msgid "Enable protected paths rate limit"
@@ -12497,18 +12700,12 @@ msgstr ""
msgid "Enable reCAPTCHA"
msgstr ""
-msgid "Enable reCAPTCHA for login"
-msgstr ""
-
-msgid "Enable reCAPTCHA, Invisible Captcha, Akismet and set IP limits. For reCAPTCHA, we currently only support %{recaptcha_v2_link_start}v2%{recaptcha_v2_link_end}"
+msgid "Enable reCAPTCHA for login."
msgstr ""
msgid "Enable repository checks"
msgstr ""
-msgid "Enable service ping"
-msgstr ""
-
msgid "Enable shared runners for all projects and subgroups in this group."
msgstr ""
@@ -12530,7 +12727,10 @@ msgstr ""
msgid "Enable unauthenticated API request rate limit"
msgstr ""
-msgid "Enable unauthenticated request rate limit"
+msgid "Enable unauthenticated web request rate limit"
+msgstr ""
+
+msgid "Enable user deactivation emails"
msgstr ""
msgid "Enable version check"
@@ -12566,9 +12766,6 @@ msgstr ""
msgid "Enabled sources for code import during project creation. OmniAuth must be configured for GitHub"
msgstr ""
-msgid "Enabling this will only make licensed EE features available to projects if the project namespace's plan includes the feature or if the project is public."
-msgstr ""
-
msgid "Encountered an error while rendering: %{err}"
msgstr ""
@@ -12617,9 +12814,6 @@ msgstr ""
msgid "Enter Admin Mode"
msgstr ""
-msgid "Enter IP address range"
-msgstr ""
-
msgid "Enter a number"
msgstr ""
@@ -12632,9 +12826,6 @@ msgstr ""
msgid "Enter at least three characters to search"
msgstr ""
-msgid "Enter domain"
-msgstr ""
-
msgid "Enter in your Bitbucket Server URL and personal access token below"
msgstr ""
@@ -12821,9 +13012,6 @@ msgstr ""
msgid "Environments|Deployment %{status}"
msgstr ""
-msgid "Environments|Dismiss"
-msgstr ""
-
msgid "Environments|Enable review app"
msgstr ""
@@ -12836,9 +13024,6 @@ msgstr ""
msgid "Environments|Environments are places where code gets deployed, such as staging or production."
msgstr ""
-msgid "Environments|Help us improve environments"
-msgstr ""
-
msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
msgstr ""
@@ -12875,6 +13060,9 @@ msgstr ""
msgid "Environments|Note that this action will stop the environment, but it will %{emphasisStart}not%{emphasisEnd} have an effect on any existing deployment due to no “stop environment action†being defined in the %{ciConfigLinkStart}.gitlab-ci.yml%{ciConfigLinkEnd} file."
msgstr ""
+msgid "Environments|Open"
+msgstr ""
+
msgid "Environments|Open live environment"
msgstr ""
@@ -12914,9 +13102,6 @@ msgstr ""
msgid "Environments|Stopping %{environmentName}"
msgstr ""
-msgid "Environments|Take the survey"
-msgstr ""
-
msgid "Environments|There was an error fetching the logs. Please try again."
msgstr ""
@@ -12938,9 +13123,6 @@ msgstr ""
msgid "Environments|You don't have any environments right now"
msgstr ""
-msgid "Environments|Your feedback helps GitLab make environments better for you and other users. Participate and enter a sweepstake to win a USD 30 gift card."
-msgstr ""
-
msgid "Environments|by %{avatar}"
msgstr ""
@@ -13223,7 +13405,7 @@ msgstr ""
msgid "Error parsing CSV file. Please make sure it has"
msgstr ""
-msgid "Error rendering markdown preview"
+msgid "Error rendering Markdown preview"
msgstr ""
msgid "Error saving label update."
@@ -13271,6 +13453,9 @@ msgstr ""
msgid "Error: %{error_message}"
msgstr ""
+msgid "Error: Couldn't load some or all of the changes."
+msgstr ""
+
msgid "Error: No AWS credentials were supplied"
msgstr ""
@@ -13304,6 +13489,9 @@ msgstr ""
msgid "ErrorTracking|Enable error tracking"
msgstr ""
+msgid "ErrorTracking|Error tracking backend"
+msgstr ""
+
msgid "ErrorTracking|If you self-host Sentry, enter your Sentry instance's full URL. If you use Sentry's hosted solution, enter https://sentry.io"
msgstr ""
@@ -13337,6 +13525,12 @@ msgstr ""
msgid "Escalation policies must have at least one rule"
msgstr ""
+msgid "EscalationPolicies|%{clockIcon} IF alert is not %{alertStatus} in %{minutes}"
+msgstr ""
+
+msgid "EscalationPolicies|%{notificationIcon} THEN %{doAction} %{forScheduleOrUser}"
+msgstr ""
+
msgid "EscalationPolicies|+ Add an additional rule"
msgstr ""
@@ -13379,13 +13573,13 @@ msgstr ""
msgid "EscalationPolicies|Escalation policies"
msgstr ""
-msgid "EscalationPolicies|Escalation rules"
+msgid "EscalationPolicies|Escalation policy %{obstacle} in Project %{project}"
msgstr ""
-msgid "EscalationPolicies|Failed to load oncall-schedules"
+msgid "EscalationPolicies|Escalation rules"
msgstr ""
-msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} %{then} THEN %{doAction} %{scheduleOrUser}"
+msgid "EscalationPolicies|Failed to load oncall-schedules"
msgstr ""
msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} minutes"
@@ -13463,18 +13657,36 @@ msgstr ""
msgid "Every %{action} attempt has failed: %{job_error_message}. Please try again."
msgstr ""
+msgid "Every 3 months"
+msgstr ""
+
+msgid "Every 3 months on the %{day} at %{time} %{timezone}"
+msgstr ""
+
+msgid "Every 6 months"
+msgstr ""
+
+msgid "Every 6 months on the %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Every day"
msgstr ""
msgid "Every day (at %{time})"
msgstr ""
+msgid "Every day at %{time} %{timezone}"
+msgstr ""
+
msgid "Every month"
msgstr ""
msgid "Every month (Day %{day} at %{time})"
msgstr ""
+msgid "Every month on the %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Every three months"
msgstr ""
@@ -13489,6 +13701,15 @@ msgstr[1] ""
msgid "Every week (%{weekday} at %{time})"
msgstr ""
+msgid "Every week on %{day} at %{time} %{timezone}"
+msgstr ""
+
+msgid "Every year"
+msgstr ""
+
+msgid "Every year on %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Everyone"
msgstr ""
@@ -13525,9 +13746,6 @@ msgstr ""
msgid "Exactly one of %{attributes} is required"
msgstr ""
-msgid "Example: %{ip_address}. %{read_more_link}."
-msgstr ""
-
msgid "Example: @sub\\.company\\.com$"
msgstr ""
@@ -13594,13 +13812,13 @@ msgstr ""
msgid "Expand pipeline"
msgstr ""
-msgid "Expand sidebar"
+msgid "Expand settings section"
msgstr ""
-msgid "Expected documents: %{expected_documents}"
+msgid "Expand sidebar"
msgstr ""
-msgid "Experienced"
+msgid "Expected documents: %{expected_documents}"
msgstr ""
msgid "ExperimentSubject|Must have exactly one of User, Namespace, or Project."
@@ -13885,9 +14103,6 @@ msgstr ""
msgid "Failed to load related branches"
msgstr ""
-msgid "Failed to load sidebar lock status"
-msgstr ""
-
msgid "Failed to load stacktrace."
msgstr ""
@@ -14312,6 +14527,9 @@ msgstr ""
msgid "Files"
msgstr ""
+msgid "Files API Rate Limits"
+msgstr ""
+
msgid "Files breadcrumb"
msgstr ""
@@ -15311,6 +15529,9 @@ msgstr ""
msgid "GitLab group: %{source_link}"
msgstr ""
+msgid "GitLab informs you if a new version is available."
+msgstr ""
+
msgid "GitLab is a complete DevOps platform, delivered as a single application, fundamentally changing the way Development, Security, and Ops teams collaborate"
msgstr ""
@@ -15326,7 +15547,7 @@ msgstr ""
msgid "GitLab is open source software to collaborate on code."
msgstr ""
-msgid "GitLab is undergoing maintenance and is operating in a read-only mode."
+msgid "GitLab is undergoing maintenance and is operating in read-only mode."
msgstr ""
msgid "GitLab member or Email address"
@@ -15338,9 +15559,6 @@ msgstr ""
msgid "GitLab project export"
msgstr ""
-msgid "GitLab restart is required to apply changes."
-msgstr ""
-
msgid "GitLab single sign-on URL"
msgstr ""
@@ -15356,9 +15574,6 @@ msgstr ""
msgid "GitLab version"
msgstr ""
-msgid "GitLab will inform you if a new version is available."
-msgstr ""
-
msgid "GitLab will run a background job that will produce pseudonymized CSVs of the GitLab database that will be uploaded to your configured object storage directory."
msgstr ""
@@ -15623,9 +15838,21 @@ msgstr ""
msgid "Go to snippets"
msgstr ""
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check 'Allowed domains for sign-ups'."
+msgstr ""
+
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check 'Email restrictions for sign-ups'."
+msgstr ""
+
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check the 'Domain denylist'."
+msgstr ""
+
msgid "Go to the activity feed"
msgstr ""
+msgid "Go to the group’s 'Settings &gt; General' page, and check 'Restrict membership by email domain'."
+msgstr ""
+
msgid "Go to the milestone list"
msgstr ""
@@ -15662,6 +15889,12 @@ msgstr ""
msgid "Goal of the changes and what reviewers should be aware of"
msgstr ""
+msgid "Google Cloud"
+msgstr ""
+
+msgid "Google Cloud offers several deployment targets. Select the one most suitable for your project."
+msgstr ""
+
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
@@ -15746,9 +15979,6 @@ msgstr ""
msgid "Group ID"
msgstr ""
-msgid "Group ID: %{group_id}"
-msgstr ""
-
msgid "Group Owner must have signed in with SAML before enabling Group Managed Accounts"
msgstr ""
@@ -15923,6 +16153,12 @@ msgstr ""
msgid "GroupImport|Unable to process group import file"
msgstr ""
+msgid "GroupPage|Copy group ID"
+msgstr ""
+
+msgid "GroupPage|Group ID: %{group_id}"
+msgstr ""
+
msgid "GroupRoadmap|%{dateWord} – No end date"
msgstr ""
@@ -15977,6 +16213,9 @@ msgstr ""
msgid "GroupRoadmap|Within 3 years"
msgstr ""
+msgid "GroupSAML|\"persistent\" recommended"
+msgstr ""
+
msgid "GroupSAML|%{strongOpen}Warning%{strongClose} - Enabling %{linkStart}SSO enforcement%{linkEnd} can reduce security risks."
msgstr ""
@@ -16109,6 +16348,9 @@ msgstr ""
msgid "GroupSAML|To be able to prohibit outer forks, you first need to enforce dedicate group managed accounts."
msgstr ""
+msgid "GroupSAML|Use SAML group links to manage group membership using SAML."
+msgstr ""
+
msgid "GroupSAML|Valid SAML Response"
msgstr ""
@@ -16121,13 +16363,10 @@ msgstr ""
msgid "GroupSAML|as %{access_level}"
msgstr ""
-msgid "GroupSAML|must match stored NameID of \"%{extern_uid}\" as we use this to identify users. If the NameID changes users will be unable to sign in."
-msgstr ""
-
-msgid "GroupSAML|should be \"persistent\""
+msgid "GroupSAML|must match stored NameID of \"%{extern_uid}\" to identify user and allow sign in"
msgstr ""
-msgid "GroupSAML|should be a random persistent ID, emails are discouraged"
+msgid "GroupSAML|recommend persistent ID instead of email"
msgstr ""
msgid "GroupSelect|No matching results"
@@ -16142,9 +16381,15 @@ msgstr ""
msgid "GroupSettings|Allow project access token creation"
msgstr ""
+msgid "GroupSettings|Applied to all subgroups unless overridden by a group owner. Groups already added to the project lose access."
+msgstr ""
+
msgid "GroupSettings|Auto DevOps pipeline was updated for the group"
msgstr ""
+msgid "GroupSettings|Available only on the top-level group. Applies to all subgroups. Groups already shared with a group outside %{group} are still shared unless removed manually."
+msgstr ""
+
msgid "GroupSettings|Badges"
msgstr ""
@@ -16196,6 +16441,9 @@ msgstr ""
msgid "GroupSettings|New runners registration token has been generated!"
msgstr ""
+msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgstr ""
+
msgid "GroupSettings|Pipeline settings was updated for the group"
msgstr ""
@@ -16208,12 +16456,15 @@ msgstr ""
msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
-msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups."
+msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups"
msgstr ""
msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
msgstr ""
+msgid "GroupSettings|Prevents group members from being notified if the group is mentioned."
+msgstr ""
+
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
msgstr ""
@@ -16250,21 +16501,6 @@ msgstr ""
msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}."
msgstr ""
-msgid "GroupSettings|This setting is only available on the top-level group and it applies to all subgroups. Groups that have already been shared with a group outside %{group} will still be shared, and this access will have to be revoked manually."
-msgstr ""
-
-msgid "GroupSettings|This setting will be applied to all subgroups unless overridden by a group owner. Groups that already have access to the project will continue to have access unless removed manually."
-msgstr ""
-
-msgid "GroupSettings|This setting will override user notification preferences for all members of the group, subgroups, and projects."
-msgstr ""
-
-msgid "GroupSettings|This setting will prevent group members from being notified if the group is mentioned."
-msgstr ""
-
-msgid "GroupSettings|This setting will prevent group members from forking projects outside of the group."
-msgstr ""
-
msgid "GroupSettings|Transfer group"
msgstr ""
@@ -16382,7 +16618,7 @@ msgstr ""
msgid "GroupsNew|No import options available"
msgstr ""
-msgid "GroupsNew|Not all related objects are migrated, as %{docs_link_start}described here%{docs_link_end}. Please %{feedback_link_start}leave feedback%{feedback_link_end} on this feature."
+msgid "GroupsNew|Not all related objects are migrated. %{docs_link_start}More info%{docs_link_end}."
msgstr ""
msgid "GroupsNew|Personal access token"
@@ -16514,15 +16750,27 @@ msgstr ""
msgid "Hello %{name},"
msgstr ""
-msgid "Hello there"
-msgstr ""
-
msgid "Hello, %{name}!"
msgstr ""
msgid "Hello, %{username}!"
msgstr ""
+msgid "HelloMessage|%{handshake_emoji} Contribute to GitLab: %{contribute_link}"
+msgstr ""
+
+msgid "HelloMessage|%{magnifier_emoji} Create a new GitLab issue: %{new_issue_link}"
+msgstr ""
+
+msgid "HelloMessage|%{rocket_emoji} We like your curiosity! Help us improve GitLab by joining the team: %{jobs_page_link}"
+msgstr ""
+
+msgid "HelloMessage|Does this page need fixes or improvements? Open an issue or contribute a merge request to help make GitLab more lovable. At GitLab, everyone can contribute!"
+msgstr ""
+
+msgid "HelloMessage|Welcome to GitLab!"
+msgstr ""
+
msgid "Help"
msgstr ""
@@ -16532,13 +16780,10 @@ msgstr ""
msgid "Helps prevent bots from creating accounts."
msgstr ""
-msgid "Helps prevent bots from creating issues"
-msgstr ""
-
-msgid "Helps prevent malicious users hide their activity"
+msgid "Helps prevent bots from creating issues."
msgstr ""
-msgid "Helps reduce request volume (e.g. from crawlers or abusive bots)"
+msgid "Helps prevent malicious users hide their activity."
msgstr ""
msgid "Helps reduce request volume (for example, from crawlers or abusive bots)"
@@ -16662,6 +16907,12 @@ msgstr ""
msgid "Housekeeping, export, path, transfer, remove, archive."
msgstr ""
+msgid "How do I configure Akismet?"
+msgstr ""
+
+msgid "How do I configure it?"
+msgstr ""
+
msgid "How do I configure runners?"
msgstr ""
@@ -16683,19 +16934,25 @@ msgstr ""
msgid "How do I set up this service?"
msgstr ""
+msgid "How do I use a web terminal?"
+msgstr ""
+
+msgid "How do I use file templates?"
+msgstr ""
+
msgid "How it works"
msgstr ""
msgid "How many days need to pass between marking entity for deletion and actual removing it."
msgstr ""
-msgid "How many seconds an IP will be counted towards the limit"
+msgid "How many seconds an IP counts toward the IP address limit."
msgstr ""
-msgid "I accept the %{terms_link}"
+msgid "How the job limiter handles jobs exceeding the thresholds specified below. The 'track' mode only logs the jobs. The 'compress' mode compresses the jobs and raises an exception if the compressed size exceeds the limit."
msgstr ""
-msgid "I accept the|Terms of Service and Privacy Policy"
+msgid "I accept the %{terms_link}"
msgstr ""
msgid "I forgot my password"
@@ -16779,13 +17036,16 @@ msgstr ""
msgid "IP Address"
msgstr ""
-msgid "IP expiration time"
+msgid "IP address expiration time"
msgstr ""
-msgid "IP subnet restriction only allowed for top-level groups"
+msgid "IP address restrictions"
+msgstr ""
+
+msgid "IP addresses per user"
msgstr ""
-msgid "IPs per user"
+msgid "IP subnet restriction only allowed for top-level groups"
msgstr ""
msgid "Identifier"
@@ -16800,6 +17060,9 @@ msgstr ""
msgid "If any indexed field exceeds this limit it will be truncated to this number of characters and the rest will not be indexed or searchable. This does not apply to repository and wiki indexing. Setting this to 0 means it is unlimited."
msgstr ""
+msgid "If blank, defaults to %{code_open}Retry later%{code_close}."
+msgstr ""
+
msgid "If blank, set allowable lifetime to %{instance_level_policy_in_words}, as defined by the instance admin. Once set, existing tokens for users in this group may be revoked."
msgstr ""
@@ -16851,6 +17114,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 did not initiate these sign-in attempts, please reach out to your administrator or enable two-factor authentication (2FA) on your account."
+msgstr ""
+
msgid "If you did not initiate this change, please contact your administrator immediately."
msgstr ""
@@ -16942,10 +17208,10 @@ msgstr ""
msgid "Import Projects from Gitea"
msgstr ""
-msgid "Import a project"
+msgid "Import an exported GitLab project"
msgstr ""
-msgid "Import an exported GitLab project"
+msgid "Import and export rate limits"
msgstr ""
msgid "Import failed due to a GitHub error: %{original}"
@@ -16957,12 +17223,18 @@ msgstr ""
msgid "Import from Jira"
msgstr ""
+msgid "Import group"
+msgstr ""
+
msgid "Import group from file"
msgstr ""
msgid "Import groups"
msgstr ""
+msgid "Import history"
+msgstr ""
+
msgid "Import in progress"
msgstr ""
@@ -17026,7 +17298,25 @@ msgstr ""
msgid "Import timed out. Import took longer than %{import_jobs_expiration} seconds"
msgstr ""
-msgid "Import/Export Rate Limits"
+msgid "ImportAProjectModal|Import from a project"
+msgstr ""
+
+msgid "ImportAProjectModal|Import members from another project"
+msgstr ""
+
+msgid "ImportAProjectModal|Import project members"
+msgstr ""
+
+msgid "ImportAProjectModal|Only project members (not group members) are imported, and they get the same permissions as the project you import from."
+msgstr ""
+
+msgid "ImportAProjectModal|Successfully imported"
+msgstr ""
+
+msgid "ImportAProjectModal|Unable to import project members"
+msgstr ""
+
+msgid "ImportAProjectModal|You're importing members to the %{strongStart}%{name}%{strongEnd} project."
msgstr ""
msgid "ImportButtons|Connect repositories from"
@@ -17079,7 +17369,7 @@ msgstr[1] ""
msgid "Importing..."
msgstr ""
-msgid "Import|A repository URL usually ends in a .git suffix, although this is not required. Double check to make sure your repository URL is correct."
+msgid "Import|There is not a valid Git repository at this URL. If your HTTP repository is not publicly accessible, verify your credentials."
msgstr ""
msgid "Improve customer support with Service Desk"
@@ -17088,9 +17378,6 @@ msgstr ""
msgid "Improves Git cloning performance."
msgstr ""
-msgid "In %{time_to_now}"
-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 ""
@@ -17376,7 +17663,7 @@ msgstr ""
msgid "InProductMarketing|Start a GitLab Ultimate trial today in less than one minute, no credit card required."
msgstr ""
-msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no CC required"
+msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no credit card required"
msgstr ""
msgid "InProductMarketing|Start a trial"
@@ -17415,7 +17702,7 @@ msgstr ""
msgid "InProductMarketing|Team up in GitLab for greater efficiency"
msgstr ""
-msgid "InProductMarketing|Team work makes the dream work"
+msgid "InProductMarketing|Team work makes the dream work"
msgstr ""
msgid "InProductMarketing|Test, create, deploy"
@@ -17996,6 +18283,9 @@ msgstr ""
msgid "Integrations|Create new issue in Jira"
msgstr ""
+msgid "Integrations|Create new issue in ZenTao"
+msgstr ""
+
msgid "Integrations|Default settings are inherited from the group level."
msgstr ""
@@ -18089,9 +18379,15 @@ msgstr ""
msgid "Integrations|Search Jira issues"
msgstr ""
+msgid "Integrations|Search ZenTao issues"
+msgstr ""
+
msgid "Integrations|Send notifications about project events to Unify Circuit."
msgstr ""
+msgid "Integrations|Send notifications about project events to a Unify Circuit conversation. %{docs_link}"
+msgstr ""
+
msgid "Integrations|Sign in to add namespaces"
msgstr ""
@@ -18131,6 +18427,9 @@ msgstr ""
msgid "Integrations|You've activated every integration 🎉"
msgstr ""
+msgid "Integrations|ZenTao issues display here when you create issues in your project in ZenTao."
+msgstr ""
+
msgid "Interactive mode"
msgstr ""
@@ -18158,9 +18457,6 @@ msgstr ""
msgid "Interval Pattern"
msgstr ""
-msgid "Introducing Value Stream Analytics"
-msgstr ""
-
msgid "Introducing Your DevOps Report"
msgstr ""
@@ -18257,6 +18553,12 @@ msgstr ""
msgid "Investigate vulnerability: %{title}"
msgstr ""
+msgid "Invisible Captcha"
+msgstr ""
+
+msgid "Invisible Captcha helps prevent the creation of spam accounts. It adds a honeypot field and time-sensitive form submission to the account signup form."
+msgstr ""
+
msgid "Invitation"
msgstr ""
@@ -18710,12 +19012,18 @@ msgstr ""
msgid "Issues"
msgstr ""
+msgid "Issues I've created"
+msgstr ""
+
msgid "Issues Rate Limits"
msgstr ""
msgid "Issues and merge requests"
msgstr ""
+msgid "Issues assigned to me"
+msgstr ""
+
msgid "Issues can be bugs, tasks or ideas to be discussed. Also, issues are searchable and filterable."
msgstr ""
@@ -18827,7 +19135,7 @@ msgstr ""
msgid "Iterations|Create cadence"
msgstr ""
-msgid "Iterations|Create your first iteration"
+msgid "Iterations|Create iteration"
msgstr ""
msgid "Iterations|Delete cadence"
@@ -18836,6 +19144,9 @@ msgstr ""
msgid "Iterations|Delete iteration cadence?"
msgstr ""
+msgid "Iterations|Delete iteration?"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -18869,12 +19180,18 @@ msgstr ""
msgid "Iterations|New iteration cadence"
msgstr ""
+msgid "Iterations|No closed iterations."
+msgstr ""
+
msgid "Iterations|No iteration cadences to show."
msgstr ""
msgid "Iterations|No iterations in cadence."
msgstr ""
+msgid "Iterations|No open iterations."
+msgstr ""
+
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
@@ -18905,6 +19222,9 @@ msgstr ""
msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
msgstr ""
+msgid "Iterations|This will remove the iteration from any issues that are assigned to it."
+msgstr ""
+
msgid "Iterations|Title"
msgstr ""
@@ -18920,15 +19240,9 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "I’m familiar with the basics of DevOps."
-msgstr ""
-
msgid "I’m joining my team who’s already on GitLab"
msgstr ""
-msgid "I’m not familiar with the basics of DevOps."
-msgstr ""
-
msgid "Jaeger URL"
msgstr ""
@@ -19193,6 +19507,9 @@ msgstr ""
msgid "Job"
msgstr ""
+msgid "Job %{jobName}"
+msgstr ""
+
msgid "Job Failed #%{build_id}"
msgstr ""
@@ -19783,9 +20100,6 @@ msgstr ""
msgid "Learn more in the"
msgstr ""
-msgid "Learn more in the|pipeline schedules documentation"
-msgstr ""
-
msgid "Learn more."
msgstr ""
@@ -19897,9 +20211,6 @@ msgstr ""
msgid "Leave Admin Mode"
msgstr ""
-msgid "Leave blank for no limit. Once set, existing personal access tokens may be revoked."
-msgstr ""
-
msgid "Leave edit mode? All unsaved changes will be lost."
msgstr ""
@@ -19945,10 +20256,10 @@ msgstr ""
msgid "LicenseCompliance|Acceptable license to be used in the project"
msgstr ""
-msgid "LicenseCompliance|Add a license"
+msgid "LicenseCompliance|Add license and related policy"
msgstr ""
-msgid "LicenseCompliance|Add license and related policy"
+msgid "LicenseCompliance|Add license policy"
msgstr ""
msgid "LicenseCompliance|Allow"
@@ -20038,6 +20349,9 @@ msgstr ""
msgid "LicenseManagement|Uncategorized"
msgstr ""
+msgid "Licensed Enterprise Edition features can be used if the project namespace's plan includes the feature, or if the project is public."
+msgstr ""
+
msgid "Licensed Features"
msgstr ""
@@ -20104,7 +20418,10 @@ msgstr ""
msgid "Limit namespaces and projects that can be indexed"
msgstr ""
-msgid "Limit sign in from multiple ips"
+msgid "Limit project size at a global, group, and project level. %{link_start}Learn more%{link_end}."
+msgstr ""
+
+msgid "Limit sign in from multiple IP addresses"
msgstr ""
msgid "Limit the number of concurrent operations this secondary site can run in the background."
@@ -20116,11 +20433,17 @@ msgstr ""
msgid "Limit the number of issues and epics per minute a user can create through web and API requests."
msgstr ""
+msgid "Limit the size of Sidekiq jobs stored in Redis."
+msgstr ""
+
msgid "Limited to showing %d event at most"
msgid_plural "Limited to showing %d events at most"
msgstr[0] ""
msgstr[1] ""
+msgid "Limiting mode"
+msgstr ""
+
msgid "Line changes"
msgstr ""
@@ -20190,9 +20513,6 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
-msgid "List of users to be excluded from the limit"
-msgstr ""
-
msgid "List options"
msgstr ""
@@ -20232,9 +20552,6 @@ msgstr ""
msgid "Loading functions timed out. Please reload the page to try again."
msgstr ""
-msgid "Loading issues"
-msgstr ""
-
msgid "Loading more"
msgstr ""
@@ -20526,6 +20843,9 @@ msgstr ""
msgid "Marked For Deletion At - %{deletion_time}"
msgstr ""
+msgid "Marked as ready. Merging is now allowed."
+msgstr ""
+
msgid "Marked this %{noun} as a draft."
msgstr ""
@@ -20598,52 +20918,22 @@ msgstr ""
msgid "Max 100,000 events"
msgstr ""
-msgid "Max 20 characters"
-msgstr ""
-
-msgid "Max Group Export Download requests per minute per user"
-msgstr ""
-
-msgid "Max Group Export requests per minute per user"
-msgstr ""
-
-msgid "Max Group Import requests per minute per user"
-msgstr ""
-
-msgid "Max Project Export Download requests per minute per user"
-msgstr ""
-
-msgid "Max Project Export requests per minute per user"
-msgstr ""
-
-msgid "Max Project Import requests per minute per user"
-msgstr ""
-
-msgid "Max authenticated API requests per period per user"
-msgstr ""
-
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
-msgid "Max authenticated web requests per period per user"
-msgstr ""
-
msgid "Max file size is 200 KB."
msgstr ""
-msgid "Max requests per minute per user"
-msgstr ""
-
msgid "Max role"
msgstr ""
msgid "Max session time"
msgstr ""
-msgid "Max unauthenticated requests per period per IP"
+msgid "MaxBuilds"
msgstr ""
-msgid "MaxBuilds"
+msgid "Maximum 20 characters"
msgstr ""
msgid "Maximum Conan package file size in bytes"
@@ -20679,6 +20969,12 @@ msgstr ""
msgid "Maximum attachment size (MB)"
msgstr ""
+msgid "Maximum authenticated API requests per rate limit period per user"
+msgstr ""
+
+msgid "Maximum authenticated web requests per rate limit period per user"
+msgstr ""
+
msgid "Maximum bulk request size (MiB)"
msgstr ""
@@ -20724,6 +21020,15 @@ msgstr ""
msgid "Maximum files in a diff"
msgstr ""
+msgid "Maximum group export download requests per minute"
+msgstr ""
+
+msgid "Maximum group export requests per minute"
+msgstr ""
+
+msgid "Maximum group import requests per minute"
+msgstr ""
+
msgid "Maximum import size"
msgstr ""
@@ -20760,7 +21065,7 @@ msgstr ""
msgid "Maximum number of projects."
msgstr ""
-msgid "Maximum number of unique IPs per user"
+msgid "Maximum number of unique IP addresses per user."
msgstr ""
msgid "Maximum page reached"
@@ -20769,12 +21074,24 @@ msgstr ""
msgid "Maximum page size"
msgstr ""
+msgid "Maximum project export download requests per minute"
+msgstr ""
+
+msgid "Maximum project export requests per minute"
+msgstr ""
+
+msgid "Maximum project import requests per minute"
+msgstr ""
+
msgid "Maximum push size"
msgstr ""
msgid "Maximum push size (MB)"
msgstr ""
+msgid "Maximum requests per minute"
+msgstr ""
+
msgid "Maximum running slices"
msgstr ""
@@ -20802,10 +21119,16 @@ msgstr ""
msgid "Maximum time between updates that a mirror can have when scheduled to synchronize."
msgstr ""
-msgid "Maximum time for web terminal websocket connection (in seconds). 0 for unlimited."
+msgid "Maximum time that users are allowed to skip the setup of two-factor authentication (in hours). Set to 0 (zero) to enforce at next sign in."
msgstr ""
-msgid "Maximum time that users are allowed to skip the setup of two-factor authentication (in hours). Set to 0 (zero) to enforce at next sign in."
+msgid "Maximum time, in seconds, for a web terminal websocket connection. 0 for unlimited."
+msgstr ""
+
+msgid "Maximum unauthenticated API requests per rate limit period per IP"
+msgstr ""
+
+msgid "Maximum unauthenticated web requests per rate limit period per IP"
msgstr ""
msgid "May"
@@ -20823,9 +21146,6 @@ msgstr ""
msgid "Medium vulnerabilities present"
msgstr ""
-msgid "Member lock"
-msgstr ""
-
msgid "Member since"
msgstr ""
@@ -20862,6 +21182,9 @@ msgstr ""
msgid "Members of a group may only view projects they have permission to access"
msgstr ""
+msgid "Membership"
+msgstr ""
+
msgid "Members|%{time} by %{user}"
msgstr ""
@@ -20922,9 +21245,6 @@ msgstr ""
msgid "Members|Expiration date updated successfully."
msgstr ""
-msgid "Members|Expired"
-msgstr ""
-
msgid "Members|Filter members"
msgstr ""
@@ -20940,9 +21260,6 @@ msgstr ""
msgid "Members|Membership"
msgstr ""
-msgid "Members|No expiration set"
-msgstr ""
-
msgid "Members|Remove \"%{groupName}\""
msgstr ""
@@ -20964,9 +21281,6 @@ msgstr ""
msgid "Members|Search invited"
msgstr ""
-msgid "Members|in %{time}"
-msgstr ""
-
msgid "Member|Deny access"
msgstr ""
@@ -21042,9 +21356,6 @@ msgstr ""
msgid "Merge request %{mr_link} was reviewed by %{mr_author}"
msgstr ""
-msgid "Merge request (MR) approvals"
-msgstr ""
-
msgid "Merge request analytics"
msgstr ""
@@ -21066,12 +21377,21 @@ msgstr ""
msgid "Merge requests"
msgstr ""
+msgid "Merge requests I've created"
+msgstr ""
+
msgid "Merge requests are a place to propose changes you've made to a project and discuss those changes with others"
msgstr ""
msgid "Merge requests are read-only in a secondary Geo node"
msgstr ""
+msgid "Merge requests assigned to me"
+msgstr ""
+
+msgid "Merge requests that I'm a reviewer"
+msgstr ""
+
msgid "Merge the branch and fix any conflicts that come up"
msgstr ""
@@ -21132,10 +21452,10 @@ msgstr ""
msgid "MergeRequests|An error occurred while saving the draft comment."
msgstr ""
-msgid "MergeRequests|Failed to squash. Should be done manually."
+msgid "MergeRequests|Create issue to resolve thread"
msgstr ""
-msgid "MergeRequests|Resolve this thread in a new issue"
+msgid "MergeRequests|Failed to squash. Should be done manually."
msgstr ""
msgid "MergeRequests|Saving the comment failed"
@@ -21949,6 +22269,9 @@ msgstr ""
msgid "MoveIssue|Cannot move issue to project it originates from!"
msgstr ""
+msgid "MoveIssue|Cannot move issues of '%{issue_type}' type."
+msgstr ""
+
msgid "Moved issue to %{label} column in the board."
msgstr ""
@@ -22074,6 +22397,15 @@ 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. To learn more about reducing storage capacity please visit our docs."
msgstr ""
+msgid "NamespaceUserCap|Pending users must be reviewed and approved by a group owner. Learn more about %{user_caps_link_start}User Caps%{link_end} and %{users_pending_approval_link_start}Users Pending Approval%{link_end}."
+msgstr ""
+
+msgid "NamespaceUserCap|View pending user approvals"
+msgstr ""
+
+msgid "NamespaceUserCap|Your group has reached its billable member limit"
+msgstr ""
+
msgid "Namespaces"
msgstr ""
@@ -22116,9 +22448,6 @@ msgstr ""
msgid "Network"
msgstr ""
-msgid "Network Policy|New rule"
-msgstr ""
-
msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is inbound from a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
msgstr ""
@@ -22140,16 +22469,13 @@ msgstr ""
msgid "NetworkPolicies|%{strongOpen}any%{strongClose} port"
msgstr ""
-msgid "NetworkPolicies|+ Add alert"
-msgstr ""
-
msgid "NetworkPolicies|.yaml"
msgstr ""
msgid "NetworkPolicies|.yaml mode"
msgstr ""
-msgid "NetworkPolicies|Actions"
+msgid "NetworkPolicies|Add alert"
msgstr ""
msgid "NetworkPolicies|Alerts are intended to be selectively used for a limited number of events that are potentially concerning and warrant a manual review. Alerts should not be used as a substitute for a SIEM or a logging tool. High volume alerts are likely to be dropped so as to preserve the stability of GitLab's integration with Kubernetes."
@@ -22185,9 +22511,6 @@ msgstr ""
msgid "NetworkPolicies|Deny all traffic"
msgstr ""
-msgid "NetworkPolicies|Description"
-msgstr ""
-
msgid "NetworkPolicies|Edit policy"
msgstr ""
@@ -22200,9 +22523,6 @@ msgstr ""
msgid "NetworkPolicies|IP/subnet"
msgstr ""
-msgid "NetworkPolicies|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
-msgstr ""
-
msgid "NetworkPolicies|Invalid or empty policy"
msgstr ""
@@ -22212,19 +22532,16 @@ msgstr ""
msgid "NetworkPolicies|Kubernetes error: %{error}"
msgstr ""
-msgid "NetworkPolicies|Name"
-msgstr ""
-
msgid "NetworkPolicies|Network"
msgstr ""
-msgid "NetworkPolicies|Network traffic"
+msgid "NetworkPolicies|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
msgstr ""
-msgid "NetworkPolicies|New policy"
+msgid "NetworkPolicies|Network policy can be created after the environment is loaded successfully."
msgstr ""
-msgid "NetworkPolicies|No policies detected"
+msgid "NetworkPolicies|Network traffic"
msgstr ""
msgid "NetworkPolicies|None selected"
@@ -22233,21 +22550,12 @@ msgstr ""
msgid "NetworkPolicies|Please %{installLinkStart}install%{installLinkEnd} and %{configureLinkStart}configure a Kubernetes Agent for this project%{configureLinkEnd} to enable alerts."
msgstr ""
-msgid "NetworkPolicies|Policies are a specification of how groups of pods are allowed to communicate with each other's network endpoints."
-msgstr ""
-
msgid "NetworkPolicies|Policy %{policyName} was successfully changed"
msgstr ""
msgid "NetworkPolicies|Policy definition"
msgstr ""
-msgid "NetworkPolicies|Policy editor"
-msgstr ""
-
-msgid "NetworkPolicies|Policy preview"
-msgstr ""
-
msgid "NetworkPolicies|Rule"
msgstr ""
@@ -22257,9 +22565,6 @@ msgstr ""
msgid "NetworkPolicies|Rule mode is unavailable for this policy. In some cases, we cannot parse the YAML file back into the rules editor."
msgstr ""
-msgid "NetworkPolicies|Rules"
-msgstr ""
-
msgid "NetworkPolicies|Save changes"
msgstr ""
@@ -22272,9 +22577,6 @@ msgstr ""
msgid "NetworkPolicies|Traffic that does not match any rule will be blocked."
msgstr ""
-msgid "NetworkPolicies|Unable to parse policy"
-msgstr ""
-
msgid "NetworkPolicies|all DNS names"
msgstr ""
@@ -22454,6 +22756,9 @@ msgstr ""
msgid "New issue"
msgstr ""
+msgid "New issue in %{project}"
+msgstr ""
+
msgid "New issue title"
msgstr ""
@@ -22532,7 +22837,7 @@ msgstr ""
msgid "Newest first"
msgstr ""
-msgid "Newly registered users will by default be external"
+msgid "Newly-registered users are external by default"
msgstr ""
msgid "Next"
@@ -22847,8 +23152,10 @@ msgstr ""
msgid "No webhooks found, add one in the form above."
msgstr ""
-msgid "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} to renew your subscription."
-msgstr ""
+msgid "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} day to renew your subscription."
+msgid_plural "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} days to renew your subscription."
+msgstr[0] ""
+msgstr[1] ""
msgid "No. of commits"
msgstr ""
@@ -22865,7 +23172,7 @@ msgstr ""
msgid "Nodes"
msgstr ""
-msgid "Non-admin users can sign in with read-only access and make read-only API requests."
+msgid "Non-admin users are restricted to read-only access, in both GitLab UI and API."
msgstr ""
msgid "None"
@@ -22946,7 +23253,7 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
-msgid "Notes Rate Limits"
+msgid "Notes rate limit"
msgstr ""
msgid "Notes|Are you sure you want to cancel creating this comment?"
@@ -23113,9 +23420,6 @@ msgstr ""
msgid "November"
msgstr ""
-msgid "Novice"
-msgstr ""
-
msgid "Now, personalize your GitLab experience"
msgstr ""
@@ -23284,7 +23588,7 @@ msgstr ""
msgid "OnCallSchedules|For this rotation, on-call will be:"
msgstr ""
-msgid "OnCallSchedules|On-call schedule %{schedule} in Project %{project}"
+msgid "OnCallSchedules|On-call schedule %{obstacle} in Project %{project}"
msgstr ""
msgid "OnCallSchedules|On-call schedules"
@@ -23431,22 +23735,22 @@ msgstr ""
msgid "OnDemandScans|Scanner profile"
msgstr ""
-msgid "OnDemandScans|Select one of the existing profiles"
+msgid "OnDemandScans|Schedule scan"
msgstr ""
-msgid "OnDemandScans|Site profile"
+msgid "OnDemandScans|Select one of the existing profiles"
msgstr ""
-msgid "OnDemandScans|Use existing scanner profile"
+msgid "OnDemandScans|Site profile"
msgstr ""
-msgid "OnDemandScans|Use existing site profile"
+msgid "OnDemandScans|Start time"
msgstr ""
-msgid "OnDemandScans|You can either choose a passive scan or validate the target site in your chosen site profile. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
+msgid "OnDemandScans|Use existing scanner profile"
msgstr ""
-msgid "OnDemandScans|You cannot run an active scan against an unvalidated site."
+msgid "OnDemandScans|Use existing site profile"
msgstr ""
msgid "OnDemandScans|You must create a repository within your project to run an on-demand scan."
@@ -23511,6 +23815,9 @@ msgstr ""
msgid "Only admins can delete project"
msgstr ""
+msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
+msgstr ""
+
msgid "Only include features new to your current subscription tier."
msgstr ""
@@ -23529,6 +23836,12 @@ msgstr ""
msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
+msgid "Only reCAPTCHA v2 is supported:"
+msgstr ""
+
+msgid "Only users from the specified IP address ranges are able to reach this group, including all subgroups, projects, and Git repositories."
+msgstr ""
+
msgid "Only verified users with an email address in any of these domains can be added to the group."
msgstr ""
@@ -23715,9 +24028,6 @@ msgstr ""
msgid "Package Registry"
msgstr ""
-msgid "Package Registry Rate Limits"
-msgstr ""
-
msgid "Package Registry: authenticated API requests"
msgstr ""
@@ -23736,6 +24046,9 @@ msgstr ""
msgid "Package recipe already exists"
msgstr ""
+msgid "Package registry rate limits"
+msgstr ""
+
msgid "Package type"
msgstr ""
@@ -23802,6 +24115,9 @@ msgstr ""
msgid "PackageRegistry|Composer"
msgstr ""
+msgid "PackageRegistry|Composer.json with license: %{license} and version: %{version}"
+msgstr ""
+
msgid "PackageRegistry|Conan"
msgstr ""
@@ -23865,6 +24181,9 @@ msgstr ""
msgid "PackageRegistry|Copy require package include"
msgstr ""
+msgid "PackageRegistry|Copy target SHA"
+msgstr ""
+
msgid "PackageRegistry|Copy yarn command"
msgstr ""
@@ -23931,6 +24250,9 @@ msgstr ""
msgid "PackageRegistry|Install package version"
msgstr ""
+msgid "PackageRegistry|Instance-level"
+msgstr ""
+
msgid "PackageRegistry|Invalid Package: failed metadata extraction"
msgstr ""
@@ -23976,6 +24298,9 @@ msgstr ""
msgid "PackageRegistry|Pip Command"
msgstr ""
+msgid "PackageRegistry|Project-level"
+msgstr ""
+
msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
msgstr ""
@@ -23997,6 +24322,9 @@ msgstr ""
msgid "PackageRegistry|Remove package"
msgstr ""
+msgid "PackageRegistry|Required Python: %{pythonVersion}"
+msgstr ""
+
msgid "PackageRegistry|RubyGems"
msgstr ""
@@ -24039,6 +24367,9 @@ msgstr ""
msgid "PackageRegistry|Source project located at %{link}"
msgstr ""
+msgid "PackageRegistry|Target SHA: %{sha}"
+msgstr ""
+
msgid "PackageRegistry|There are no other versions of this package."
msgstr ""
@@ -24207,6 +24538,18 @@ msgstr ""
msgid "Password was successfully updated. Please sign in again."
msgstr ""
+msgid "PasswordPrompt|Confirm password"
+msgstr ""
+
+msgid "PasswordPrompt|Confirm password to continue"
+msgstr ""
+
+msgid "PasswordPrompt|Password is required"
+msgstr ""
+
+msgid "PasswordPrompt|Please enter your password to confirm"
+msgstr ""
+
msgid "Passwords should be unique and not used for any other sites or services."
msgstr ""
@@ -24234,6 +24577,9 @@ msgstr ""
msgid "Paste project path (i.e. gitlab-org/gitlab)"
msgstr ""
+msgid "Paste this DSN into your Sentry SDK"
+msgstr ""
+
msgid "Paste your public SSH key, which is usually contained in the file '~/.ssh/id_ed25519.pub' or '~/.ssh/id_rsa.pub' and begins with 'ssh-ed25519' or 'ssh-rsa'. Do not paste your private SSH key, as that can compromise your identity."
msgstr ""
@@ -24318,6 +24664,9 @@ msgstr ""
msgid "PerformanceBar|First Contentful Paint"
msgstr ""
+msgid "PerformanceBar|Flamegraph with mode:"
+msgstr ""
+
msgid "PerformanceBar|Frontend resources"
msgstr ""
@@ -24351,6 +24700,15 @@ msgstr ""
msgid "PerformanceBar|Trace"
msgstr ""
+msgid "PerformanceBar|cpu"
+msgstr ""
+
+msgid "PerformanceBar|object"
+msgstr ""
+
+msgid "PerformanceBar|wall"
+msgstr ""
+
msgid "Period in seconds"
msgstr ""
@@ -24579,6 +24937,48 @@ msgstr ""
msgid "PipelineSchedules|Variables"
msgstr ""
+msgid "PipelineSource|API"
+msgstr ""
+
+msgid "PipelineSource|Chat"
+msgstr ""
+
+msgid "PipelineSource|External"
+msgstr ""
+
+msgid "PipelineSource|External Pull Request"
+msgstr ""
+
+msgid "PipelineSource|Merge Request"
+msgstr ""
+
+msgid "PipelineSource|On-Demand DAST Scan"
+msgstr ""
+
+msgid "PipelineSource|On-Demand DAST Validation"
+msgstr ""
+
+msgid "PipelineSource|Parent Pipeline"
+msgstr ""
+
+msgid "PipelineSource|Pipeline"
+msgstr ""
+
+msgid "PipelineSource|Push"
+msgstr ""
+
+msgid "PipelineSource|Schedule"
+msgstr ""
+
+msgid "PipelineSource|Trigger"
+msgstr ""
+
+msgid "PipelineSource|Web"
+msgstr ""
+
+msgid "PipelineSource|Web IDE"
+msgstr ""
+
msgid "PipelineStatusTooltip|Pipeline: %{ciStatus}"
msgstr ""
@@ -24879,46 +25279,7 @@ msgstr ""
msgid "Pipeline|Source"
msgstr ""
-msgid "Pipeline|Source|API"
-msgstr ""
-
-msgid "Pipeline|Source|Chat"
-msgstr ""
-
-msgid "Pipeline|Source|External"
-msgstr ""
-
-msgid "Pipeline|Source|External Pull Request"
-msgstr ""
-
-msgid "Pipeline|Source|Merge Request"
-msgstr ""
-
-msgid "Pipeline|Source|On-Demand DAST Scan"
-msgstr ""
-
-msgid "Pipeline|Source|On-Demand DAST Validation"
-msgstr ""
-
-msgid "Pipeline|Source|Parent Pipeline"
-msgstr ""
-
-msgid "Pipeline|Source|Pipeline"
-msgstr ""
-
-msgid "Pipeline|Source|Push"
-msgstr ""
-
-msgid "Pipeline|Source|Schedule"
-msgstr ""
-
-msgid "Pipeline|Source|Trigger"
-msgstr ""
-
-msgid "Pipeline|Source|Web"
-msgstr ""
-
-msgid "Pipeline|Source|Web IDE"
+msgid "Pipeline|Source|Security Policy"
msgstr ""
msgid "Pipeline|Specify variable values to be used in this run. The values specified in %{linkStart}CI/CD settings%{linkEnd} will be used by default."
@@ -24969,7 +25330,7 @@ msgstr ""
msgid "Pipeline|We are currently unable to fetch pipeline data"
msgstr ""
-msgid "Pipeline|You’re about to stop pipeline %{pipelineId}."
+msgid "Pipeline|You’re about to stop pipeline #%{pipelineId}."
msgstr ""
msgid "Pipeline|for"
@@ -24996,6 +25357,9 @@ msgstr ""
msgid "Plain diff"
msgstr ""
+msgid "Plain-text response to send to clients that hit a rate limit"
+msgstr ""
+
msgid "Plan:"
msgstr ""
@@ -25140,9 +25504,6 @@ msgstr ""
msgid "Please provide attributes to update"
msgstr ""
-msgid "Please provide your username or email address."
-msgstr ""
-
msgid "Please reach out if you have any questions and we'll be happy to assist."
msgstr ""
@@ -25185,9 +25546,6 @@ msgstr ""
msgid "Please set a new password before proceeding."
msgstr ""
-msgid "Please share your feedback about %{featureName} %{linkStart}in this issue%{linkEnd} to help us improve the experience."
-msgstr ""
-
msgid "Please solve the captcha"
msgstr ""
@@ -25365,6 +25723,9 @@ msgstr ""
msgid "Prevent adding new members to project membership within this group"
msgstr ""
+msgid "Prevent auto-stopping"
+msgstr ""
+
msgid "Prevent editing approval rules in projects and merge requests."
msgstr ""
@@ -25377,7 +25738,7 @@ msgstr ""
msgid "Prevent users from changing their profile name"
msgstr ""
-msgid "Prevent users from performing write operations on GitLab while performing maintenance."
+msgid "Prevent users from performing write operations while GitLab maintenance is in progress."
msgstr ""
msgid "Preview"
@@ -25650,6 +26011,9 @@ msgstr ""
msgid "Profiles|Enter your name, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Enter your password to confirm the email change"
+msgstr ""
+
msgid "Profiles|Enter your pronouns to let people know how to refer to you"
msgstr ""
@@ -25884,10 +26248,10 @@ msgstr ""
msgid "Profiles|e.g. My MacBook key"
msgstr ""
-msgid "Profiles|username"
+msgid "Profiles|https://website.com"
msgstr ""
-msgid "Profiles|website.com"
+msgid "Profiles|username"
msgstr ""
msgid "Profiles|your account"
@@ -26130,9 +26494,21 @@ msgstr ""
msgid "ProjectSelect| or group"
msgstr ""
+msgid "ProjectSelect|No matching results"
+msgstr ""
+
msgid "ProjectSelect|Search for project"
msgstr ""
+msgid "ProjectSelect|Search projects"
+msgstr ""
+
+msgid "ProjectSelect|Select a project"
+msgstr ""
+
+msgid "ProjectSelect|There was an error fetching the projects. Please try again."
+msgstr ""
+
msgid "ProjectService|Drone server URL"
msgstr ""
@@ -26220,6 +26596,9 @@ msgstr ""
msgid "ProjectService|Trigger event when a new, unique alert is recorded."
msgstr ""
+msgid "ProjectService|Trigger event when a new, unique vulnerability is recorded. (Note: This feature requires an Ultimate plan.)"
+msgstr ""
+
msgid "ProjectService|Trigger event when a pipeline status changes."
msgstr ""
@@ -26634,9 +27013,15 @@ msgstr ""
msgid "Projects are graded based on the highest severity vulnerability present"
msgstr ""
+msgid "Projects are organized into groups"
+msgstr ""
+
msgid "Projects contributed to"
msgstr ""
+msgid "Projects help you organize your work. They contain your file repository, issues, merge requests, and so much more."
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr ""
@@ -26871,10 +27256,10 @@ msgstr ""
msgid "PrometheusService|Prometheus cluster integration"
msgstr ""
-msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
+msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
msgstr ""
-msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
+msgid "PrometheusService|The ID of the IAP-secured resource."
msgstr ""
msgid "PrometheusService|The Prometheus API base URL."
@@ -27492,6 +27877,9 @@ msgstr ""
msgid "Rate limit"
msgstr ""
+msgid "Rate limits can help reduce request volume (like from crawlers or abusive bots)."
+msgstr ""
+
msgid "Raw blob request rate limit per minute"
msgstr ""
@@ -27504,6 +27892,9 @@ msgstr ""
msgid "Re-authentication required"
msgstr ""
+msgid "Re-import"
+msgstr ""
+
msgid "Re-request review"
msgstr ""
@@ -27525,6 +27916,9 @@ msgstr ""
msgid "Read more about related issues"
msgstr ""
+msgid "Read their documentation."
+msgstr ""
+
msgid "Ready to get started with GitLab? Follow these steps to set up your workspace, plan and commit changes, and deploy your project."
msgstr ""
@@ -27558,6 +27952,9 @@ msgstr ""
msgid "Receive any notifications from GitLab."
msgstr ""
+msgid "Receive notification of abuse reports by email."
+msgstr ""
+
msgid "Receive notifications about your own activity"
msgstr ""
@@ -27701,9 +28098,6 @@ msgstr ""
msgid "Registry setup"
msgstr ""
-msgid "Regulate approvals by authors/committers. Affects all projects."
-msgstr ""
-
msgid "Reindexing Status: %{status} (Slice multiplier: %{multiplier}, Maximum running slices: %{max_slices})"
msgstr ""
@@ -27799,6 +28193,9 @@ msgstr ""
msgid "Release|Something went wrong while saving the release details."
msgstr ""
+msgid "Reload page"
+msgstr ""
+
msgid "Remediations"
msgstr ""
@@ -28081,6 +28478,9 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
+msgid "Repeats"
+msgstr ""
+
msgid "Replace"
msgstr ""
@@ -28443,10 +28843,7 @@ msgstr ""
msgid "Require additional authentication for administrative tasks."
msgstr ""
-msgid "Require all users in this group to setup Two-factor authentication"
-msgstr ""
-
-msgid "Require all users in this group to setup two-factor authentication"
+msgid "Require all users in this group to set up two-factor authentication"
msgstr ""
msgid "Required approvals (%{approvals_given} given)"
@@ -28492,6 +28889,9 @@ msgstr[1] ""
msgid "Requires values to meet regular expression requirements."
msgstr ""
+msgid "Requires you to deploy or set up cloud-hosted Sentry."
+msgstr ""
+
msgid "Requires your primary GitLab email address."
msgstr ""
@@ -28552,9 +28952,6 @@ msgstr ""
msgid "Resolve"
msgstr ""
-msgid "Resolve all threads in new issue"
-msgstr ""
-
msgid "Resolve conflicts"
msgstr ""
@@ -28612,6 +29009,9 @@ msgstr ""
msgid "Response text"
msgstr ""
+msgid "Restart GitLab to apply changes."
+msgstr ""
+
msgid "Restart Terminal"
msgstr ""
@@ -28630,6 +29030,9 @@ msgstr ""
msgid "Restoring the project will prevent the project from being removed on this date and restore people's ability to make changes to it."
msgstr ""
+msgid "Restrict group access by IP address. %{link_start}Learn more%{link_end}."
+msgstr ""
+
msgid "Restrict membership by email domain"
msgstr ""
@@ -28943,6 +29346,9 @@ msgstr ""
msgid "Runners|Runner #%{runner_id}"
msgstr ""
+msgid "Runners|Runner assigned to project."
+msgstr ""
+
msgid "Runners|Runner is offline, last contact was %{runner_contact} ago"
msgstr ""
@@ -28955,6 +29361,9 @@ msgstr ""
msgid "Runners|Runner registration"
msgstr ""
+msgid "Runners|Runner unassigned from project."
+msgstr ""
+
msgid "Runners|Runners"
msgstr ""
@@ -29147,7 +29556,7 @@ msgstr ""
msgid "SastEntryPoints|How do I set up SAST?"
msgstr ""
-msgid "SastEntryPoints|Learn more."
+msgid "SastEntryPoints|Learn more"
msgstr ""
msgid "Satisfied"
@@ -29189,7 +29598,7 @@ msgstr ""
msgid "Save pipeline schedule"
msgstr ""
-msgid "Save space and find images in the container Registry. remove unneeded tags and keep only the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
+msgid "Save storage space by automatically deleting tags from the container registry and keeping the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
msgstr ""
msgid "Saving"
@@ -29363,6 +29772,9 @@ msgstr ""
msgid "Search or filter results…"
msgstr ""
+msgid "Search or jump to..."
+msgstr ""
+
msgid "Search project"
msgstr ""
@@ -29423,16 +29835,16 @@ msgstr ""
msgid "SearchCodeResults|of %{link_to_project}"
msgstr ""
-msgid "SearchResults|Showing %{count} %{scope} for%{term_element}"
+msgid "SearchResults|Showing %{count} %{scope} for %{term_element}"
msgstr ""
-msgid "SearchResults|Showing %{count} %{scope} for%{term_element} in your personal and project snippets"
+msgid "SearchResults|Showing %{count} %{scope} for %{term_element} in your personal and project snippets"
msgstr ""
-msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for%{term_element}"
+msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for %{term_element}"
msgstr ""
-msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for%{term_element} in your personal and project snippets"
+msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for %{term_element} in your personal and project snippets"
msgstr ""
msgid "SearchResults|code result"
@@ -29514,6 +29926,9 @@ msgstr ""
msgid "Secret Detection"
msgstr ""
+msgid "Secret access key"
+msgstr ""
+
msgid "Secret token"
msgstr ""
@@ -29553,9 +29968,6 @@ msgstr ""
msgid "SecurityApprovals|A merge request approval is required when the license compliance report contains a denied license."
msgstr ""
-msgid "SecurityApprovals|Configurable if security scanners are enabled. %{linkStart}Learn more.%{linkEnd}"
-msgstr ""
-
msgid "SecurityApprovals|Coverage-Check"
msgstr ""
@@ -29568,24 +29980,18 @@ msgstr ""
msgid "SecurityApprovals|Learn more about Vulnerability-Check"
msgstr ""
-msgid "SecurityApprovals|License Scanning must be enabled. %{linkStart}Learn more%{linkEnd}."
-msgstr ""
-
msgid "SecurityApprovals|License-Check"
msgstr ""
msgid "SecurityApprovals|Requires approval for Denied licenses. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}More information%{linkEnd}"
+msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "SecurityApprovals|Requires approval for vulnerabilities. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
-msgid "SecurityApprovals|Test coverage must be enabled. %{linkStart}Learn more%{linkEnd}."
-msgstr ""
-
msgid "SecurityApprovals|Vulnerability-Check"
msgstr ""
@@ -29649,6 +30055,12 @@ msgstr ""
msgid "SecurityConfiguration|Immediately begin risk analysis and remediation with application security features. Start with SAST and Secret Detection, available to all plans. Upgrade to Ultimate to get all features, including:"
msgstr ""
+msgid "SecurityConfiguration|Manage corpus"
+msgstr ""
+
+msgid "SecurityConfiguration|Manage corpus files used as mutation sources in coverage fuzzing."
+msgstr ""
+
msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
msgstr ""
@@ -29703,6 +30115,12 @@ msgstr ""
msgid "SecurityOrchestration|Action"
msgstr ""
+msgid "SecurityOrchestration|Actions"
+msgstr ""
+
+msgid "SecurityOrchestration|Add rule"
+msgstr ""
+
msgid "SecurityOrchestration|All policies"
msgstr ""
@@ -29736,9 +30154,6 @@ msgstr ""
msgid "SecurityOrchestration|Network"
msgstr ""
-msgid "SecurityOrchestration|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
-msgstr ""
-
msgid "SecurityOrchestration|New policy"
msgstr ""
@@ -29754,6 +30169,9 @@ msgstr ""
msgid "SecurityOrchestration|Policy editor"
msgstr ""
+msgid "SecurityOrchestration|Policy preview"
+msgstr ""
+
msgid "SecurityOrchestration|Policy status"
msgstr ""
@@ -29763,6 +30181,9 @@ msgstr ""
msgid "SecurityOrchestration|Rule"
msgstr ""
+msgid "SecurityOrchestration|Rules"
+msgstr ""
+
msgid "SecurityOrchestration|Scan Execution"
msgstr ""
@@ -29856,6 +30277,9 @@ msgstr ""
msgid "SecurityReports|Create issue"
msgstr ""
+msgid "SecurityReports|Development vulnerabilities"
+msgstr ""
+
msgid "SecurityReports|Dismiss vulnerability"
msgstr ""
@@ -29871,6 +30295,9 @@ msgstr ""
msgid "SecurityReports|Download results"
msgstr ""
+msgid "SecurityReports|Download scanned URLs"
+msgstr ""
+
msgid "SecurityReports|Download scanned resources"
msgstr ""
@@ -29994,6 +30421,9 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
+msgid "SecurityReports|The Vulnerability Report shows the results of the lastest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "SecurityReports|The security reports below contain one or more vulnerability findings that could not be parsed and were not recorded. Download the artifacts in the job output to investigate. Ensure any security report created conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
msgstr ""
@@ -30135,10 +30565,10 @@ msgstr ""
msgid "Select a repository"
msgstr ""
-msgid "Select a role"
+msgid "Select a repository containing templates for common files."
msgstr ""
-msgid "Select a shared template repository for all projects on this instance."
+msgid "Select a role"
msgstr ""
msgid "Select a template repository"
@@ -30216,6 +30646,9 @@ msgstr ""
msgid "Select project to choose zone"
msgstr ""
+msgid "Select project to create issue"
+msgstr ""
+
msgid "Select projects"
msgstr ""
@@ -30333,6 +30766,9 @@ msgstr ""
msgid "Send emails to help guide new users through the onboarding process."
msgstr ""
+msgid "Send emails to users upon account deactivation."
+msgstr ""
+
msgid "Send message"
msgstr ""
@@ -30351,6 +30787,9 @@ msgstr ""
msgid "Send service data"
msgstr ""
+msgid "Sentry"
+msgstr ""
+
msgid "Sentry API URL"
msgstr ""
@@ -30465,6 +30904,9 @@ msgstr ""
msgid "Service"
msgstr ""
+msgid "Service Accounts keys are required to authorize GitLab to deploy your Google Cloud project."
+msgstr ""
+
msgid "Service Desk"
msgstr ""
@@ -30537,15 +30979,15 @@ msgstr ""
msgid "Set a password on your account to pull or push via %{protocol}."
msgstr ""
-msgid "Set a template repository for projects in this group"
-msgstr ""
-
msgid "Set access permissions for this token."
msgstr ""
msgid "Set an instance-wide domain that will be available to all clusters when installing Knative."
msgstr ""
+msgid "Set any rate limit to %{code_open}0%{code_close} to disable the limit."
+msgstr ""
+
msgid "Set default and restrict visibility levels. Configure import sources and git access protocol."
msgstr ""
@@ -30558,7 +31000,7 @@ msgstr ""
msgid "Set limit to 0 to allow any file size."
msgstr ""
-msgid "Set max session time for web terminal."
+msgid "Set limits for web and API requests."
msgstr ""
msgid "Set milestone"
@@ -30567,15 +31009,18 @@ msgstr ""
msgid "Set new password"
msgstr ""
-msgid "Set notification email for abuse reports."
+msgid "Set parent epic to an epic"
msgstr ""
-msgid "Set parent epic to an epic"
+msgid "Set per-user rate limits for imports and exports of projects and groups."
msgstr ""
msgid "Set projects and maximum size limits, session duration, user options, and check feature availability for namespace plan."
msgstr ""
+msgid "Set rate limits for package registry API requests that supersede the general user and IP rate limits."
+msgstr ""
+
msgid "Set severity"
msgstr ""
@@ -30594,15 +31039,24 @@ msgstr ""
msgid "Set the default branch for this project. All merge requests and commits are made against this branch unless you specify a different one."
msgstr ""
+msgid "Set the default expiration time for job artifacts in all projects. Set to %{code_open}0%{code_close} to never expire artifacts by default. If no unit is written, it defaults to seconds. For example, these are all equivalent: %{code_open}3600%{code_close}, %{code_open}60 minutes%{code_close}, or %{code_open}one hour%{code_close}."
+msgstr ""
+
msgid "Set the due date to %{due_date}."
msgstr ""
msgid "Set the iteration to %{iteration_reference}."
msgstr ""
+msgid "Set the maximum session time for a web terminal."
+msgstr ""
+
msgid "Set the milestone to %{milestone_reference}."
msgstr ""
+msgid "Set the per-user rate limit for notes created by web or API requests."
+msgstr ""
+
msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
msgstr ""
@@ -30804,6 +31258,9 @@ msgstr ""
msgid "Show Pipeline IID"
msgstr ""
+msgid "Show all %{issuable_type}."
+msgstr ""
+
msgid "Show all activity"
msgstr ""
@@ -30855,15 +31312,9 @@ msgstr ""
msgid "Show list"
msgstr ""
-msgid "Show me advanced features"
-msgstr ""
-
msgid "Show me how to add a pipeline"
msgstr ""
-msgid "Show me the basics"
-msgstr ""
-
msgid "Show one file at a time"
msgstr ""
@@ -30904,15 +31355,15 @@ msgstr ""
msgid "Showing %{pageSize} of %{total} %{issuableType}"
msgstr ""
-msgid "Showing %{pageSize} of %{total} issues"
-msgstr ""
-
msgid "Showing all epics"
msgstr ""
msgid "Showing all issues"
msgstr ""
+msgid "Showing data for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
+msgstr ""
+
msgid "Showing data for workflow items created in this date range. Date range cannot exceed %{maxDateRange} days."
msgstr ""
@@ -30952,6 +31403,15 @@ msgstr ""
msgid "Sidebar|Weight"
msgstr ""
+msgid "Sidekiq job compression threshold (bytes)"
+msgstr ""
+
+msgid "Sidekiq job size limit (bytes)"
+msgstr ""
+
+msgid "Sidekiq job size limits"
+msgstr ""
+
msgid "Sign in"
msgstr ""
@@ -31072,6 +31532,9 @@ msgstr ""
msgid "Site profile not found for given parameters"
msgstr ""
+msgid "Sites"
+msgstr ""
+
msgid "Size"
msgstr ""
@@ -31102,19 +31565,22 @@ msgstr ""
msgid "SlackIntegration|Sends notifications about project events to Slack channels."
msgstr ""
-msgid "SlackService|2. Paste the %{strong_open}Token%{strong_close} into the field below"
+msgid "SlackService|1. %{slash_command_link_start}Add a slash command%{slash_command_link_end} in your Slack team using this information:"
msgstr ""
-msgid "SlackService|3. Select the %{strong_open}Active%{strong_close} checkbox, press %{strong_open}Save changes%{strong_close} and start using GitLab inside Slack!"
+msgid "SlackService|2. Paste the token from Slack in the %{strong_open}Token%{strong_close} field below."
msgstr ""
-msgid "SlackService|Fill in the word that works best for your team."
+msgid "SlackService|3. Select the %{strong_open}Active%{strong_close} checkbox, select %{strong_open}Save changes%{strong_close}, and start using slash commands in Slack!"
+msgstr ""
+
+msgid "SlackService|After setup, get a list of available Slack slash commands by entering"
msgstr ""
-msgid "SlackService|See list of available commands in Slack after setting up this service, by entering"
+msgid "SlackService|Fill in the word that works best for your team."
msgstr ""
-msgid "SlackService|This service allows users to perform common operations on this project by entering slash commands in Slack."
+msgid "SlackService|Perform common operations in this project by entering slash commands in Slack."
msgstr ""
msgid "Slice multiplier"
@@ -31180,7 +31646,7 @@ msgstr ""
msgid "Some child epics may be hidden due to applied filters"
msgstr ""
-msgid "Some common domains are not allowed. %{read_more_link}."
+msgid "Some common domains are not allowed. %{learn_more_link}."
msgstr ""
msgid "Some of the designs you tried uploading did not change:"
@@ -31264,9 +31730,6 @@ msgstr ""
msgid "Something went wrong while exporting requirements"
msgstr ""
-msgid "Something went wrong while fetching %{listType} list"
-msgstr ""
-
msgid "Something went wrong while fetching branches"
msgstr ""
@@ -31321,15 +31784,9 @@ msgstr ""
msgid "Something went wrong while merging this merge request. Please try again."
msgstr ""
-msgid "Something went wrong while moving issues."
-msgstr ""
-
msgid "Something went wrong while obtaining the Let's Encrypt certificate."
msgstr ""
-msgid "Something went wrong while performing the action."
-msgstr ""
-
msgid "Something went wrong while promoting the issue to an epic. Please try again."
msgstr ""
@@ -31657,7 +32114,10 @@ msgstr ""
msgid "SourcegraphPreferences|Uses a custom %{linkStart}Sourcegraph instance%{linkEnd}."
msgstr ""
-msgid "Spam Check API Key"
+msgid "Spam Check"
+msgstr ""
+
+msgid "Spam Check API key"
msgstr ""
msgid "Spam Logs"
@@ -31675,7 +32135,7 @@ msgstr ""
msgid "Specified URL cannot be used: \"%{reason}\""
msgstr ""
-msgid "Specify an e-mail address regex pattern to identify default internal users."
+msgid "Specify an email address regex pattern to identify default internal users."
msgstr ""
msgid "Speed up your pipelines with Needs relationships"
@@ -31930,7 +32390,7 @@ msgstr ""
msgid "StatusCheck|An error occurred fetching the status checks."
msgstr ""
-msgid "StatusCheck|Apply this status check to any branch or a specific protected branch."
+msgid "StatusCheck|Apply this status check to all branches or a specific protected branch."
msgstr ""
msgid "StatusCheck|Check for a status response in Merge Requests. Failures do not block merges. %{link_start}Learn more%{link_end}."
@@ -32269,6 +32729,9 @@ msgstr ""
msgid "Subscriptions"
msgstr ""
+msgid "Subscription|Your subscription for %{strong}%{namespace_name}%{strong_close} has expired and you are now on %{pricing_link_start}the GitLab Free tier%{pricing_link_end}. Don't worry, your data is safe. Get in touch with our support team (%{support_email}). They'll gladly help with your subscription renewal."
+msgstr ""
+
msgid "Subtracted"
msgstr ""
@@ -32497,6 +32960,9 @@ msgstr ""
msgid "SuperSonics|Plan"
msgstr ""
+msgid "SuperSonics|Please agree to the Subscription Agreement"
+msgstr ""
+
msgid "SuperSonics|Ready to get started? A GitLab plan is ideal for scaling organizations and for multi team usage."
msgstr ""
@@ -32527,6 +32993,9 @@ msgstr ""
msgid "SuperSonics|The activation code is not valid. Please make sure to copy it exactly from the Customers Portal or confirmation email. Learn more about %{linkStart}activating your subscription%{linkEnd}."
msgstr ""
+msgid "SuperSonics|The activation code should be a 24-character alphanumeric string"
+msgstr ""
+
msgid "SuperSonics|There is a connectivity issue."
msgstr ""
@@ -32569,9 +33038,15 @@ msgstr ""
msgid "SuperSonics|You do not have an active subscription"
msgstr ""
+msgid "SuperSonics|You have successfully added a license that activates on %{date}. Please see the subscription history table below for more details."
+msgstr ""
+
msgid "SuperSonics|You'll be charged for %{trueUpLinkStart}users over license%{trueUpLinkEnd} on a quarterly or annual basis, depending on the terms of your agreement."
msgstr ""
+msgid "SuperSonics|Your future dated license was successfully added"
+msgstr ""
+
msgid "SuperSonics|Your subscription"
msgstr ""
@@ -32824,7 +33299,7 @@ msgstr ""
msgid "Template to append to all Service Desk issues"
msgstr ""
-msgid "TemplateRepository|Select a repository to make its templates available to all projects. %{link_start}What should the repository contain?%{link_end} "
+msgid "TemplateRepository|Create common files more quickly, and standardize their format."
msgstr ""
msgid "Templates"
@@ -33030,7 +33505,7 @@ msgstr ""
msgid "TestCases|Search test cases"
msgstr ""
-msgid "TestCases|Something went wrong while adding test case to Todo."
+msgid "TestCases|Something went wrong while adding test case to a to-do item."
msgstr ""
msgid "TestCases|Something went wrong while creating a test case."
@@ -33042,7 +33517,7 @@ msgstr ""
msgid "TestCases|Something went wrong while fetching test cases list."
msgstr ""
-msgid "TestCases|Something went wrong while marking test case todo as done."
+msgid "TestCases|Something went wrong while marking test case to-do item as done."
msgstr ""
msgid "TestCases|Something went wrong while moving test case."
@@ -33162,7 +33637,7 @@ msgstr ""
msgid "Thanks for your purchase!"
msgstr ""
-msgid "That is ok, I do not want to renew"
+msgid "That's OK, I don't want to renew"
msgstr ""
msgid "That's it, well done!"
@@ -33185,7 +33660,7 @@ msgid_plural "The %{type} contains the following errors:"
msgstr[0] ""
msgstr[1] ""
-msgid "The API key used by GitLab for accessing the Spam Check service endpoint"
+msgid "The API key used by GitLab for accessing the Spam Check service endpoint."
msgstr ""
msgid "The GitLab subscription service (customers.gitlab.com) is currently experiencing an outage. You can monitor the status and get updates at %{linkStart}status.gitlab.com%{linkEnd}."
@@ -33224,9 +33699,6 @@ msgstr ""
msgid "The URL to use for connecting to Elasticsearch. Use a comma-separated list to support clustering (e.g., \"http://localhost:9200, http://localhost:9201\")."
msgstr ""
-msgid "The Vulnerability Report shows the results of the last successful pipeline run on the default branch."
-msgstr ""
-
msgid "The X509 Certificate to use when mutual TLS is required to communicate with the external authorization service. If left blank, the server certificate is still validated when accessing over HTTPS."
msgstr ""
@@ -33284,9 +33756,6 @@ msgstr ""
msgid "The default branch for this project has been changed. Please update your bookmarks."
msgstr ""
-msgid "The default expiration time for job artifacts. 0 for unlimited. The default unit is in seconds, but you can use other units, for example %{code_open}4 mins 2 sec%{code_close}, %{code_open}2h42min%{code_close}."
-msgstr ""
-
msgid "The dependency list details information about the components used within your project."
msgstr ""
@@ -33478,9 +33947,6 @@ msgstr ""
msgid "The merge conflicts for this merge request have already been resolved. Please return to the merge request."
msgstr ""
-msgid "The merge request can now be merged."
-msgstr ""
-
msgid "The metric must be one of %{metrics}."
msgstr ""
@@ -33856,7 +34322,7 @@ msgstr ""
msgid "There was a problem updating the keep latest artifacts setting."
msgstr ""
-msgid "There was an error %{message} todo."
+msgid "There was an error %{message} to-do item."
msgstr ""
msgid "There was an error adding a To Do."
@@ -33895,6 +34361,9 @@ msgstr ""
msgid "There was an error fetching projects"
msgstr ""
+msgid "There was an error fetching search autocomplete suggestions"
+msgstr ""
+
msgid "There was an error fetching stage total counts"
msgstr ""
@@ -34219,6 +34688,9 @@ msgstr ""
msgid "This field is required."
msgstr ""
+msgid "This form is disabled in preview"
+msgstr ""
+
msgid "This group"
msgstr ""
@@ -34240,9 +34712,6 @@ msgstr ""
msgid "This group is linked to a subscription"
msgstr ""
-msgid "This group, including all subgroups, projects and git repositories, will be reachable from only the specified IP address ranges."
-msgstr ""
-
msgid "This group, its subgroups and projects has been scheduled for removal on %{date}."
msgstr ""
@@ -34522,9 +34991,6 @@ msgstr ""
msgid "This user cannot be unlocked manually from GitLab"
msgstr ""
-msgid "This user does not have a pending request"
-msgstr ""
-
msgid "This user has an unconfirmed email address (%{email}). You may force a confirmation."
msgstr ""
@@ -34633,9 +35099,6 @@ msgstr ""
msgid "ThreatMonitoring|Packet Activity"
msgstr ""
-msgid "ThreatMonitoring|Policies"
-msgstr ""
-
msgid "ThreatMonitoring|Requests"
msgstr ""
@@ -34687,6 +35150,12 @@ msgstr ""
msgid "ThreatMonitoring|View documentation"
msgstr ""
+msgid "Threshold in bytes at which to compress Sidekiq job arguments."
+msgstr ""
+
+msgid "Threshold in bytes at which to reject Sidekiq jobs. Set this to 0 to if you don't want to limit Sidekiq jobs."
+msgstr ""
+
msgid "Throughput"
msgstr ""
@@ -34696,6 +35165,9 @@ msgstr ""
msgid "Time"
msgstr ""
+msgid "Time (in hours) that users are allowed to skip forced configuration of two-factor authentication."
+msgstr ""
+
msgid "Time Spent"
msgstr ""
@@ -34762,7 +35234,7 @@ msgstr ""
msgid "TimeTrackingEstimated|Est"
msgstr ""
-msgid "TimeTracking|%{startTag}Spent: %{endTag}%{timeSpentHumanReadable}"
+msgid "TimeTracking|%{spentStart}Spent: %{spentEnd}"
msgstr ""
msgid "TimeTracking|Estimated:"
@@ -34976,6 +35448,9 @@ msgstr ""
msgid "To access this domain create a new DNS record"
msgstr ""
+msgid "To add a custom suffix, set up a Service Desk email address. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "To add an SSH key you need to %{generate_link_start}generate one%{link_end} or use an %{existing_link_start}existing key%{link_end}."
msgstr ""
@@ -34997,13 +35472,16 @@ msgstr ""
msgid "To connect an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To continue using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
+msgstr ""
+
msgid "To continue, you need to select the link in the confirmation email we sent to verify your email address. If you didn't get our email, select %{strongStart}Resend confirmation email.%{strongEnd}"
msgstr ""
msgid "To define internal users, first enable new users set to external"
msgstr ""
-msgid "To enable Registration Features, make sure \"Enable service ping\" is checked."
+msgid "To enable Registration Features, first enable Service Ping."
msgstr ""
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
@@ -35030,7 +35508,7 @@ msgstr ""
msgid "To get started, use the link below to confirm your account."
msgstr ""
-msgid "To help improve GitLab and its user experience, GitLab will periodically collect usage information."
+msgid "To help improve GitLab and its user experience, GitLab periodically collects usage information."
msgstr ""
msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
@@ -35063,7 +35541,7 @@ msgstr ""
msgid "To preserve performance only %{strong_open}%{display_size} of %{real_size}%{strong_close} files are displayed."
msgstr ""
-msgid "To protect this issue's confidentiality, %{forkLink} and set the fork's visibility to private."
+msgid "To protect this issue's confidentiality, %{linkStart}fork this project%{linkEnd} and set the fork's visibility to private."
msgstr ""
msgid "To protect this issue's confidentiality, a private fork of this project was selected."
@@ -35096,12 +35574,15 @@ msgstr ""
msgid "To set up SAML authentication for your group through an identity provider like Azure, Okta, Onelogin, Ping Identity, or your custom SAML 2.0 provider:"
msgstr ""
-msgid "To set up this service:"
+msgid "To set up this integration:"
msgstr ""
msgid "To specify the notification level per project of a group you belong to, you need to visit project page and change notification level there."
msgstr ""
+msgid "To start using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
+msgstr ""
+
msgid "To unsubscribe from this issue, please paste the following link into your browser:"
msgstr ""
@@ -35689,9 +36170,6 @@ msgstr ""
msgid "Unable to fetch branches list, please close the form and try again"
msgstr ""
-msgid "Unable to fetch unscanned projects"
-msgstr ""
-
msgid "Unable to fetch vulnerable projects"
msgstr ""
@@ -35746,6 +36224,15 @@ msgstr ""
msgid "Unable to update this issue at this time."
msgstr ""
+msgid "Unapprove a merge request"
+msgstr ""
+
+msgid "Unapprove the current merge request."
+msgstr ""
+
+msgid "Unapproved the current merge request."
+msgstr ""
+
msgid "Unarchive project"
msgstr ""
@@ -35758,16 +36245,13 @@ msgstr ""
msgid "Unassigned"
msgstr ""
-msgid "Unauthenticated API request rate limit"
-msgstr ""
-
-msgid "Unauthenticated rate limit period in seconds"
+msgid "Unauthenticated API rate limit period in seconds"
msgstr ""
-msgid "Unauthenticated request rate limit"
+msgid "Unauthenticated requests"
msgstr ""
-msgid "Unauthenticated requests"
+msgid "Unauthenticated web rate limit period in seconds"
msgstr ""
msgid "Undo"
@@ -35869,18 +36353,6 @@ msgstr ""
msgid "Unresolved"
msgstr ""
-msgid "UnscannedProjects|15 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|30 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|5 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|60 or more days"
-msgstr ""
-
msgid "Unschedule job"
msgstr ""
@@ -36100,6 +36572,9 @@ msgstr ""
msgid "UsageQuota|%{help_link_start}Shared runners%{help_link_end} are disabled, so there are no limits set on pipeline usage"
msgstr ""
+msgid "UsageQuota|%{linkTitle} help link"
+msgstr ""
+
msgid "UsageQuota|%{percentageLeft} of purchased storage is available"
msgstr ""
@@ -36109,6 +36584,9 @@ msgstr ""
msgid "UsageQuota|Artifacts is a sum of build and pipeline artifacts."
msgstr ""
+msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
+msgstr ""
+
msgid "UsageQuota|Buy additional minutes"
msgstr ""
@@ -36118,9 +36596,21 @@ msgstr ""
msgid "UsageQuota|CI minutes usage by project"
msgstr ""
+msgid "UsageQuota|Code packages and container images."
+msgstr ""
+
msgid "UsageQuota|Current period usage"
msgstr ""
+msgid "UsageQuota|File attachments and smaller design graphics."
+msgstr ""
+
+msgid "UsageQuota|Git repository, managed by the Gitaly service."
+msgstr ""
+
+msgid "UsageQuota|Includes project registry, artifacts, packages, wiki, uploads and other items."
+msgstr ""
+
msgid "UsageQuota|Increase storage temporarily"
msgstr ""
@@ -36139,6 +36629,9 @@ msgstr ""
msgid "UsageQuota|Packages"
msgstr ""
+msgid "UsageQuota|Pipeline artifacts and job artifacts, created with CI/CD."
+msgstr ""
+
msgid "UsageQuota|Pipelines"
msgstr ""
@@ -36157,6 +36650,9 @@ msgstr ""
msgid "UsageQuota|Seats"
msgstr ""
+msgid "UsageQuota|Shared bits of code and text."
+msgstr ""
+
msgid "UsageQuota|Snippets"
msgstr ""
@@ -36166,6 +36662,12 @@ msgstr ""
msgid "UsageQuota|Storage"
msgstr ""
+msgid "UsageQuota|Storage type"
+msgstr ""
+
+msgid "UsageQuota|There is a known issue with Artifact storage where the total could be incorrect for some projects. More details and progress are available in %{warningLinkStart}the epic%{warningLinkEnd}."
+msgstr ""
+
msgid "UsageQuota|This is the total amount of storage used across your projects within this namespace."
msgstr ""
@@ -36205,6 +36707,9 @@ msgstr ""
msgid "UsageQuota|Usage"
msgstr ""
+msgid "UsageQuota|Usage Breakdown"
+msgstr ""
+
msgid "UsageQuota|Usage Quotas"
msgstr ""
@@ -36229,6 +36734,9 @@ msgstr ""
msgid "UsageQuota|Wiki"
msgstr ""
+msgid "UsageQuota|Wiki content."
+msgstr ""
+
msgid "UsageQuota|Wikis"
msgstr ""
@@ -36445,7 +36953,10 @@ msgstr ""
msgid "User Settings"
msgstr ""
-msgid "User and IP Rate Limits"
+msgid "User and IP rate limits"
+msgstr ""
+
+msgid "User does not have a pending request"
msgstr ""
msgid "User identity was successfully created."
@@ -36742,6 +37253,9 @@ msgstr ""
msgid "Users can launch a development environment from a GitLab browser tab when the %{linkStart}Gitpod%{linkEnd} integration is enabled."
msgstr ""
+msgid "Users can reactivate their account by signing in."
+msgstr ""
+
msgid "Users can render diagrams in AsciiDoc, Markdown, reStructuredText, and Textile documents using Kroki."
msgstr ""
@@ -36757,6 +37271,9 @@ msgstr ""
msgid "Users requesting access to"
msgstr ""
+msgid "Users to exclude from the rate limit"
+msgstr ""
+
msgid "Users were successfully added."
msgstr ""
@@ -36778,6 +37295,9 @@ msgstr ""
msgid "UsersSelect|Unassigned"
msgstr ""
+msgid "Uses GitLab as a lightweight alternative to Sentry."
+msgstr ""
+
msgid "Using %{code_start}::%{code_end} denotes a %{link_start}scoped label set%{link_end}"
msgstr ""
@@ -36808,10 +37328,7 @@ msgstr ""
msgid "Value Stream Analytics can help you determine your team’s velocity"
msgstr ""
-msgid "Value Stream Analytics gives an overview of how much time it takes to go from idea to production in your project."
-msgstr ""
-
-msgid "Value may contain a variable reference"
+msgid "Value might contain a variable reference"
msgstr ""
msgid "Value stream"
@@ -36877,10 +37394,10 @@ msgstr ""
msgid "ValueStream|The Default Value Stream cannot be deleted"
msgstr ""
-msgid "Variable"
+msgid "Values that contain the %{codeStart}$%{codeEnd} character can be considered a variable reference and expanded. %{docsLinkStart}Learn more.%{docsLinkEnd}"
msgstr ""
-msgid "Variable references indicated by %{codeStart}$%{codeEnd} may be expanded. If this is not what you want, consider %{docsLinkStart}using a workaround to prevent expansion%{docsLinkEnd}."
+msgid "Variable"
msgstr ""
msgid "Variable will be masked in job logs."
@@ -37285,6 +37802,9 @@ msgstr ""
msgid "Vulnerability|Evidence"
msgstr ""
+msgid "Vulnerability|False positive detected"
+msgstr ""
+
msgid "Vulnerability|File"
msgstr ""
@@ -37327,6 +37847,9 @@ msgstr ""
msgid "Vulnerability|Status"
msgstr ""
+msgid "Vulnerability|The scanner determined this vulnerability to be a false positive. Verify the evaluation before changing its status. %{linkStart}Learn more about false positive detection.%{linkEnd}"
+msgstr ""
+
msgid "Vulnerability|The unmodified response is the original response that had no mutations done to the request"
msgstr ""
@@ -37651,9 +38174,6 @@ msgstr ""
msgid "Welcome to GitLab,%{br_tag}%{name}!"
msgstr ""
-msgid "Welcome to the guided GitLab tour"
-msgstr ""
-
msgid "Welcome, %{name}!"
msgstr ""
@@ -37672,9 +38192,6 @@ msgstr ""
msgid "What are you searching for?"
msgstr ""
-msgid "What describes you best?"
-msgstr ""
-
msgid "What does this command do?"
msgstr ""
@@ -37696,13 +38213,13 @@ msgstr ""
msgid "What is your job title? (optional)"
msgstr ""
-msgid "What will you use this group for?"
+msgid "What templates can I create?"
msgstr ""
-msgid "What's new"
+msgid "What will you use this group for?"
msgstr ""
-msgid "What’s your experience level?"
+msgid "What's new"
msgstr ""
msgid "When a deployment job is successful, skip older deployment jobs that are still pending."
@@ -37714,6 +38231,9 @@ msgstr ""
msgid "When an event in GitLab triggers a webhook, you can use the request details to figure out if something went wrong."
msgstr ""
+msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+msgstr ""
+
msgid "When inactive, an external authentication provider must be used."
msgstr ""
@@ -37737,6 +38257,9 @@ msgstr ""
msgid "When:"
msgstr ""
+msgid "Which API requests are affected?"
+msgstr ""
+
msgid "While it's rare to have no vulnerabilities, it can happen. In any event, we ask that you please double check your settings to make sure you've set up your dashboard correctly."
msgstr ""
@@ -38016,6 +38539,9 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|Work Items"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -38091,6 +38617,9 @@ msgstr ""
msgid "You are already a member of this %{member_source}."
msgstr ""
+msgid "You are already impersonating another user"
+msgstr ""
+
msgid "You are an admin, which means granting access to %{client_name} will allow them to interact with GitLab as an admin as well. Proceed with caution."
msgstr ""
@@ -38193,6 +38722,9 @@ msgstr ""
msgid "You can also use project access tokens with Git to authenticate over HTTP(S). %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "You can always change your URL later"
+msgstr ""
+
msgid "You can always edit this later"
msgstr ""
@@ -38349,10 +38881,10 @@ msgstr ""
msgid "You can’t %{tag_start}edit%{tag_end} files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
-msgid "You could not create a new trigger."
+msgid "You can’t edit files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
-msgid "You didn't renew your subscription for %{strong}%{namespace_name}%{strong_close} so it was downgraded to the free plan."
+msgid "You could not create a new trigger."
msgstr ""
msgid "You do not have any subscriptions yet"
@@ -38520,6 +39052,12 @@ msgstr ""
msgid "You must provide your current password in order to change it."
msgstr ""
+msgid "You must sign in to search for specific projects."
+msgstr ""
+
+msgid "You must sign in to search for specific terms."
+msgstr ""
+
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
@@ -38547,6 +39085,9 @@ msgstr ""
msgid "You need to upload a GitLab project export archive (ending in .gz)."
msgstr ""
+msgid "You need to verify your primary email first before enabling Two-Factor Authentication."
+msgstr ""
+
msgid "You successfully declined the invitation"
msgstr ""
@@ -38655,10 +39196,10 @@ msgstr ""
msgid "Your %{host} account was signed in to from a new location"
msgstr ""
-msgid "Your %{strong}%{plan_name}%{strong_close} subscription for %{strong}%{namespace_name}%{strong_close} will expire on %{strong}%{expires_on}%{strong_close}."
+msgid "Your %{strong}%{plan_name}%{strong_close} subscription expires on %{strong}%{expires_on}%{strong_close}. After that date, you cannot create issues or merge requests, or use many other features."
msgstr ""
-msgid "Your %{strong}%{plan_name}%{strong_close} subscription will expire on %{strong}%{expires_on}%{strong_close}. After that, you will not be able to create issues or merge requests as well as many other features."
+msgid "Your %{strong}%{plan_name}%{strong_close} subscription for %{strong}%{namespace_name}%{strong_close} will expire on %{strong}%{expires_on}%{strong_close}."
msgstr ""
msgid "Your CI/CD configuration syntax is invalid. View Lint tab for more details."
@@ -38682,7 +39223,7 @@ msgstr ""
msgid "Your GPG keys (%{count})"
msgstr ""
-msgid "Your GitLab account has been locked due to an excessive amount of unsuccessful sign in attempts. Your account will automatically unlock in %{duration} or you may click the link below to unlock now."
+msgid "Your GitLab account has been locked due to an excessive number of unsuccessful sign in attempts. You can wait for your account to automatically unlock in %{duration} or you can click the link below to unlock now."
msgstr ""
msgid "Your GitLab account request has been approved!"
@@ -38793,6 +39334,9 @@ msgstr ""
msgid "Your commit email is used for web based operations, such as edits and merges."
msgstr ""
+msgid "Your current password is required to register a two-factor authenticator app."
+msgstr ""
+
msgid "Your dashboard has been copied. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
@@ -38892,6 +39436,9 @@ msgstr ""
msgid "Your project limit is %{limit} projects! Please contact your administrator to increase it"
msgstr ""
+msgid "Your project will be created at:"
+msgstr ""
+
msgid "Your projects"
msgstr ""
@@ -38931,11 +39478,10 @@ msgstr ""
msgid "Your subscription expired!"
msgstr ""
-msgid "Your subscription has been downgraded."
-msgstr ""
-
-msgid "Your subscription will expire in %{remaining_days}."
-msgstr ""
+msgid "Your subscription will expire in %{remaining_days} day."
+msgid_plural "Your subscription will expire in %{remaining_days} days."
+msgstr[0] ""
+msgstr[1] ""
msgid "Your username is %{username}."
msgstr ""
@@ -39142,6 +39688,9 @@ msgstr ""
msgid "cannot merge"
msgstr ""
+msgid "cannot not be used for user namespace"
+msgstr ""
+
msgid "ciReport|%{degradedNum} degraded"
msgstr ""
@@ -39465,6 +40014,9 @@ msgstr ""
msgid "created %{timeAgo}"
msgstr ""
+msgid "created %{timeAgo} by %{author}"
+msgstr ""
+
msgid "created by"
msgstr ""
@@ -39509,9 +40061,6 @@ msgstr ""
msgid "does not have a supported extension. Only %{extension_list} are supported"
msgstr ""
-msgid "domain is not authorized for sign-up."
-msgstr ""
-
msgid "download it"
msgstr ""
@@ -39529,18 +40078,13 @@ msgstr ""
msgid "email '%{email}' is not a verified email."
msgstr ""
-msgid "email does not match the allowed domain of %{email_domains}"
-msgid_plural "email does not match the allowed domains: %{email_domains}"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "enabled"
msgstr ""
msgid "encrypted: needs to be a :required, :optional or :migrating!"
msgstr ""
-msgid "ending with MIME type format is not allowed."
+msgid "ending with a reserved file extension is not allowed."
msgstr ""
msgid "entries cannot be larger than 255 characters"
@@ -39564,6 +40108,9 @@ msgstr ""
msgid "estimateCommand|%{slash_command} overwrites the total estimated time."
msgstr ""
+msgid "example.com"
+msgstr ""
+
msgid "exceeds the limit of %{bytes} bytes"
msgstr ""
@@ -39614,9 +40161,6 @@ msgstr ""
msgid "fork"
msgstr ""
-msgid "fork this project"
-msgstr ""
-
msgid "from"
msgstr ""
@@ -39625,6 +40169,9 @@ msgid_plural "from %d jobs"
msgstr[0] ""
msgstr[1] ""
+msgid "frontmatter"
+msgstr ""
+
msgid "group"
msgstr ""
@@ -39652,6 +40199,9 @@ msgstr ""
msgid "has been completed."
msgstr ""
+msgid "has too deep level of nesting"
+msgstr ""
+
msgid "help"
msgstr ""
@@ -39685,9 +40235,21 @@ msgstr ""
msgid "in"
msgstr ""
+msgid "in Infrastructure :: Kubernetes clusters"
+msgstr ""
+
+msgid "in all GitLab"
+msgstr ""
+
+msgid "in group"
+msgstr ""
+
msgid "in group %{link_to_group}"
msgstr ""
+msgid "in project"
+msgstr ""
+
msgid "in project %{link_to_project}"
msgstr ""
@@ -39729,16 +40291,19 @@ msgstr ""
msgid "is not a valid X509 certificate."
msgstr ""
-msgid "is not allowed since the group is not top-level group."
+msgid "is not allowed for sign-up."
msgstr ""
-msgid "is not allowed. Try again with a different email address, or contact your GitLab admin."
+msgid "is not allowed for this group."
msgstr ""
-msgid "is not allowed. We do not currently support project-level iterations"
+msgid "is not allowed for this project."
+msgstr ""
+
+msgid "is not allowed since the group is not top-level group."
msgstr ""
-msgid "is not from an allowed domain."
+msgid "is not allowed. We do not currently support project-level iterations"
msgstr ""
msgid "is not in the group enforcing Group Managed Account"
@@ -39831,6 +40396,9 @@ msgstr ""
msgid "log in"
msgstr ""
+msgid "managed"
+msgstr ""
+
msgid "manual"
msgstr ""
@@ -39878,6 +40446,9 @@ msgstr ""
msgid "mrWidget| Please restore it or use a different %{missingBranchName} branch"
msgstr ""
+msgid "mrWidget|%{linkStart}Set up now%{linkEnd} to analyze your source code for known security vulnerabilities."
+msgstr ""
+
msgid "mrWidget|%{mergeError}."
msgstr ""
@@ -39958,6 +40529,9 @@ msgid_plural "mrWidget|Closes issues"
msgstr[0] ""
msgstr[1] ""
+msgid "mrWidget|Create issue to resolve all threads"
+msgstr ""
+
msgid "mrWidget|Delete source branch"
msgstr ""
@@ -39967,12 +40541,18 @@ msgstr ""
msgid "mrWidget|Did not close"
msgstr ""
+msgid "mrWidget|Dismiss"
+msgstr ""
+
msgid "mrWidget|Email patches"
msgstr ""
msgid "mrWidget|Failed to load deployment statistics"
msgstr ""
+msgid "mrWidget|Hide %{widget} details"
+msgstr ""
+
msgid "mrWidget|If the %{missingBranchName} branch exists in your local repository, you can merge this merge request manually using the command line"
msgstr ""
@@ -40068,9 +40648,6 @@ msgstr ""
msgid "mrWidget|Request to merge"
msgstr ""
-msgid "mrWidget|Resolve all threads in new issue"
-msgstr ""
-
msgid "mrWidget|Resolve conflicts"
msgstr ""
@@ -40086,6 +40663,9 @@ msgstr ""
msgid "mrWidget|Revoke approval"
msgstr ""
+msgid "mrWidget|SAST and Secret Detection is not enabled."
+msgstr ""
+
msgid "mrWidget|Set by %{merge_author} to be added to the merge train when the pipeline succeeds"
msgstr ""
@@ -40095,6 +40675,9 @@ msgstr ""
msgid "mrWidget|Set by %{merge_author} to start a merge train when the pipeline succeeds"
msgstr ""
+msgid "mrWidget|Show %{widget} details"
+msgstr ""
+
msgid "mrWidget|The changes were merged into"
msgstr ""
@@ -40107,6 +40690,9 @@ msgstr ""
msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure, or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
msgstr ""
+msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure."
+msgstr ""
+
msgid "mrWidget|The source branch has been deleted"
msgstr ""
@@ -40149,6 +40735,9 @@ msgstr ""
msgid "mrWidget|You can merge after removing denied licenses"
msgstr ""
+msgid "mrWidget|You can only merge once this merge request is approved."
+msgstr ""
+
msgid "mrWidget|Your password"
msgstr ""
@@ -40185,6 +40774,9 @@ msgstr ""
msgid "must be less than the limit of %{tag_limit} tags"
msgstr ""
+msgid "must be set for a project namespace"
+msgstr ""
+
msgid "must be unique by status and elapsed time within a policy"
msgstr ""
@@ -40294,6 +40886,9 @@ msgstr ""
msgid "pipeline"
msgstr ""
+msgid "pipeline schedules documentation"
+msgstr ""
+
msgid "pod_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
msgstr ""
@@ -40343,16 +40938,25 @@ msgstr ""
msgid "project name"
msgstr ""
+msgid "project namespace cannot be the parent of another namespace"
+msgstr ""
+
msgid "projects"
msgstr ""
msgid "quick actions"
msgstr ""
-msgid "reCAPTCHA Private Key"
+msgid "reCAPTCHA"
+msgstr ""
+
+msgid "reCAPTCHA helps prevent credential stuffing."
msgstr ""
-msgid "reCAPTCHA Site Key"
+msgid "reCAPTCHA private key"
+msgstr ""
+
+msgid "reCAPTCHA site key"
msgstr ""
msgid "recent activity"
@@ -40579,6 +41183,9 @@ msgstr ""
msgid "user avatar"
msgstr ""
+msgid "user namespace cannot be the parent of another namespace"
+msgstr ""
+
msgid "user preferences"
msgstr ""
@@ -40671,3 +41278,9 @@ msgstr ""
msgid "your settings"
msgstr ""
+msgid "{group}"
+msgstr ""
+
+msgid "{project}"
+msgstr ""
+
diff --git a/locale/sk_SK/gitlab.po b/locale/sk_SK/gitlab.po
index 5541412403e..edc498b5231 100644
--- a/locale/sk_SK/gitlab.po
+++ b/locale/sk_SK/gitlab.po
@@ -14,10 +14,7 @@ msgstr ""
"X-Crowdin-Language: sk\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-09-01 22:34\n"
-
-msgid " %{name}, confirm your email address now! "
-msgstr ""
+"PO-Revision-Date: 2021-10-04 20:22\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -96,6 +93,20 @@ msgstr ""
msgid "#general, #development"
msgstr ""
+msgid "%d Alert"
+msgid_plural "%d Alerts"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
+msgid "%d Alert:"
+msgid_plural "%d Alerts:"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "%d Approval"
msgid_plural "%d Approvals"
msgstr[0] ""
@@ -591,7 +602,10 @@ msgstr ""
msgid "%{code_open}Protected:%{code_close} Only exposed to protected branches or tags."
msgstr ""
-msgid "%{commit_author_link} authored %{commit_timeago}"
+msgid "%{commit_author_link} authored %{commit_authored_timeago}"
+msgstr ""
+
+msgid "%{commit_author_link} authored %{commit_authored_timeago} and %{commit_committer_avatar} %{commit_committer_link} committed %{commit_committer_timeago}"
msgstr ""
msgid "%{completedCount} completed weight"
@@ -695,6 +709,15 @@ msgstr ""
msgid "%{doc_link_start}Advanced search%{doc_link_end} is enabled."
msgstr ""
+msgid "%{docs_link_start}Learn about visibility levels.%{docs_link_end}"
+msgstr ""
+
+msgid "%{docs_link_start}What is Large File Storage?%{docs_link_end}"
+msgstr ""
+
+msgid "%{docs_link_start}What is two-factor authentication?%{docs_link_end}"
+msgstr ""
+
msgid "%{due_date} (Past due)"
msgstr ""
@@ -767,9 +790,6 @@ msgstr ""
msgid "%{issueType} actions"
msgstr ""
-msgid "%{issuesCount} issues with a limit of %{maxIssueCount}"
-msgstr ""
-
msgid "%{issuesSize} with a limit of %{maxIssueCount}"
msgstr ""
@@ -827,6 +847,12 @@ msgstr ""
msgid "%{label_for_message} unavailable"
msgstr ""
+msgid "%{learn_more_link}."
+msgstr ""
+
+msgid "%{lessThan} 1 hour"
+msgstr ""
+
msgid "%{lets_encrypt_link_start}Let's Encrypt%{lets_encrypt_link_end} is a free, automated, and open certificate authority (CA) that issues digital certificates to enable HTTPS (SSL/TLS) for sites."
msgstr ""
@@ -839,15 +865,15 @@ msgstr ""
msgid "%{link_start}Learn more%{link_end} about roles."
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
-msgstr ""
-
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
msgstr ""
msgid "%{link_start}Start the title with %{draft_snippet}%{link_end} to prevent a merge request that is a work in progress from being merged before it's ready."
msgstr ""
+msgid "%{link_start}What information does GitLab Inc. collect?%{link_end}"
+msgstr ""
+
msgid "%{listToShow}, and %{awardsListLength} more"
msgstr ""
@@ -1008,7 +1034,7 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-msgid "%{service_ping_link_start}Learn more%{service_ping_link_end} about what information is shared with GitLab Inc."
+msgid "%{service_ping_link_start}What information is shared with GitLab Inc.?%{service_ping_link_end}"
msgstr ""
msgid "%{size} %{unit}"
@@ -1044,6 +1070,9 @@ msgstr ""
msgid "%{state} epics"
msgstr ""
+msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
+msgstr ""
+
msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
msgstr ""
@@ -1117,13 +1146,6 @@ msgstr ""
msgid "%{template_project_id} is unknown or invalid"
msgstr ""
-msgid "%{text} %{files}"
-msgid_plural "%{text} %{files} files"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
-
msgid "%{text} is available"
msgstr ""
@@ -1208,9 +1230,6 @@ msgstr ""
msgid "%{wildcards_link_start}Wildcards%{wildcards_link_end} such as %{code_tag_start}v*%{code_tag_end} or %{code_tag_start}*-release%{code_tag_end} are supported."
msgstr ""
-msgid "&lt; 1 hour"
-msgstr ""
-
msgid "'%{data}' at %{location} does not match format: %{format}"
msgstr ""
@@ -1296,9 +1315,6 @@ msgstr ""
msgid "(we need your current password to confirm your changes)"
msgstr ""
-msgid "* * * * *"
-msgstr ""
-
msgid "+ %{amount} more"
msgstr ""
@@ -1371,10 +1387,10 @@ msgstr ""
msgid "."
msgstr ""
-msgid "0 bytes"
+msgid "/"
msgstr ""
-msgid "0 for unlimited, only effective with remote storage enabled."
+msgid "0 bytes"
msgstr ""
msgid "0t1DgySidms"
@@ -1550,6 +1566,9 @@ msgstr ""
msgid "1000+"
msgstr ""
+msgid "192.168.0.0/24"
+msgstr ""
+
msgid "1st contribution!"
msgstr ""
@@ -1703,9 +1722,6 @@ msgstr ""
msgid "A plain HTML site that uses Netlify for CI/CD instead of GitLab, but still with all the other great GitLab features"
msgstr ""
-msgid "A plain-text response to show to clients that hit the rate limit."
-msgstr ""
-
msgid "A platform value can be web, mob or app."
msgstr ""
@@ -1787,7 +1803,7 @@ msgstr ""
msgid "APIFuzzing|Configure HTTP basic authentication values. Other authentication methods are supported. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
+msgid "APIFuzzing|Customize your project's API fuzzing configuration options and copy the code snippet to your .gitlab-ci.yml file to apply any changes. Note that this tool does not reflect or update your .gitlab-ci.yml file automatically. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
msgstr ""
msgid "APIFuzzing|Enable authentication"
@@ -1850,9 +1866,6 @@ msgstr ""
msgid "APIFuzzing|To prevent a security leak, authentication info must be added as a %{ciVariablesLinkStart}CI variable%{ciVariablesLinkEnd}. As a user with maintainer access rights, you can manage CI variables in the %{ciSettingsLinkStart}Settings%{ciSettingsLinkEnd} area."
msgstr ""
-msgid "APIFuzzing|Use this tool to generate API fuzzing configuration YAML to copy into your .gitlab-ci.yml file. This tool does not reflect or update your .gitlab-ci.yml file automatically."
-msgstr ""
-
msgid "APIFuzzing|Username for basic authentication"
msgstr ""
@@ -1904,9 +1917,6 @@ msgstr ""
msgid "Abuse reports notification email"
msgstr ""
-msgid "Abuse reports will be sent to this address if it is set. Abuse reports are always available in the admin area."
-msgstr ""
-
msgid "Accept invitation"
msgstr ""
@@ -1943,12 +1953,18 @@ msgstr ""
msgid "Access granted"
msgstr ""
+msgid "Access key ID"
+msgstr ""
+
msgid "Access requests"
msgstr ""
msgid "Access to '%{classification_label}' not allowed"
msgstr ""
+msgid "Access tokens expire after 2 hours. A refresh token may be used at any time to generate a new access token. Non-expiring access tokens are deprecated. Clear this setting to enable backward compatibility."
+msgstr ""
+
msgid "AccessDropdown|Deploy Keys"
msgstr ""
@@ -2261,6 +2277,9 @@ msgstr ""
msgid "Add new directory"
msgstr ""
+msgid "Add new service account"
+msgstr ""
+
msgid "Add or remove previously merged commits"
msgstr ""
@@ -2498,6 +2517,9 @@ msgstr ""
msgid "AdminArea|Features"
msgstr ""
+msgid "AdminArea|Get security updates from GitLab and stay up to date"
+msgstr ""
+
msgid "AdminArea|Groups"
msgstr ""
@@ -2537,6 +2559,12 @@ msgstr ""
msgid "AdminArea|Reporter"
msgstr ""
+msgid "AdminArea|Sign up for the GitLab Security Newsletter to get notified for security updates."
+msgstr ""
+
+msgid "AdminArea|Sign up for the GitLab newsletter"
+msgstr ""
+
msgid "AdminArea|Stop all jobs"
msgstr ""
@@ -2606,9 +2634,15 @@ msgstr ""
msgid "AdminSettings|Disable public access to Pages sites"
msgstr ""
+msgid "AdminSettings|Display a banner on merge requests in projects with no pipelines to initiate steps to add a .gitlab-ci.yml file."
+msgstr ""
+
msgid "AdminSettings|Domain verification is an essential security measure for public GitLab sites. Users are required to demonstrate they control a domain before it is enabled. %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "AdminSettings|Enable pipeline suggestion banner"
+msgstr ""
+
msgid "AdminSettings|Enable shared runners for new projects"
msgstr ""
@@ -3080,10 +3114,10 @@ msgstr ""
msgid "Admin|Quarterly reconciliation will occur on %{qrtlyDate}"
msgstr ""
-msgid "Admin|The number of max seats used for your namespace is currently exceeding the number of seats in your subscription. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgid "Admin|The number of max seats in your namespace exceeds the number of seats in your subscription. On %{qrtlyDate}, quarterly reconciliation occurs and you are automatically billed a prorated amount for the overage. No action is needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice. For more information about the timing of the invoicing process, view the documentation."
msgstr ""
-msgid "Admin|The number of maximum users for your instance is currently exceeding the number of users in license. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgid "Admin|The number of max users in your instance exceeds the number of users in your license. On %{qrtlyDate}, quarterly reconciliation occurs and you are automatically billed a prorated amount for the overage. No action is needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice. For more information about the timing of the invoicing process, view the documentation."
msgstr ""
msgid "Admin|View pending user approvals"
@@ -3104,9 +3138,6 @@ msgstr ""
msgid "Advanced export options"
msgstr ""
-msgid "Advanced permissions, Large File Storage and Two-Factor authentication settings."
-msgstr ""
-
msgid "After a successful password update you will be redirected to login screen."
msgstr ""
@@ -3125,15 +3156,14 @@ msgstr ""
msgid "After you've reviewed these contribution guidelines, you'll be all set to"
msgstr ""
+msgid "Akismet"
+msgstr ""
+
msgid "Akismet API Key"
msgstr ""
-msgid "Alert"
-msgid_plural "Alerts"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
+msgid "Akismet helps prevent the creation of spam issues in public projects."
+msgstr ""
msgid "AlertManagement|Acknowledged"
msgstr ""
@@ -3489,6 +3519,9 @@ msgstr ""
msgid "All (default)"
msgstr ""
+msgid "All GitLab"
+msgstr ""
+
msgid "All Members"
msgstr ""
@@ -3603,6 +3636,9 @@ msgstr ""
msgid "Allow this secondary node to replicate content on Object Storage"
msgstr ""
+msgid "Allow use of licensed EE features"
+msgstr ""
+
msgid "Allow users to dismiss the broadcast message"
msgstr ""
@@ -3678,9 +3714,6 @@ msgstr ""
msgid "Amazon authentication is not %{link_start}correctly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
-msgid "Amount of time (in hours) that users are allowed to skip forced configuration of two-factor authentication"
-msgstr ""
-
msgid "An %{link_start}alert%{link_end} with the same fingerprint is already open. To change the status of this alert, resolve the linked alert."
msgstr ""
@@ -3741,12 +3774,6 @@ msgstr ""
msgid "An error occurred when removing the label."
msgstr ""
-msgid "An error occurred when toggling the notification subscription"
-msgstr ""
-
-msgid "An error occurred when updating the issue weight"
-msgstr ""
-
msgid "An error occurred when updating the title"
msgstr ""
@@ -3795,6 +3822,9 @@ msgstr ""
msgid "An error occurred while enabling Service Desk."
msgstr ""
+msgid "An error occurred while fetching Markdown preview"
+msgstr ""
+
msgid "An error occurred while fetching ancestors"
msgstr ""
@@ -3825,9 +3855,6 @@ msgstr ""
msgid "An error occurred while fetching label colors."
msgstr ""
-msgid "An error occurred while fetching markdown preview"
-msgstr ""
-
msgid "An error occurred while fetching participants"
msgstr ""
@@ -3843,9 +3870,6 @@ msgstr ""
msgid "An error occurred while fetching reference"
msgstr ""
-msgid "An error occurred while fetching sidebar data"
-msgstr ""
-
msgid "An error occurred while fetching tags. Retry the search."
msgstr ""
@@ -3921,6 +3945,9 @@ msgstr ""
msgid "An error occurred while loading merge requests."
msgstr ""
+msgid "An error occurred while loading projects."
+msgstr ""
+
msgid "An error occurred while loading the Needs tab."
msgstr ""
@@ -4155,12 +4182,6 @@ msgstr ""
msgid "Any Milestone"
msgstr ""
-msgid "Any branch"
-msgstr ""
-
-msgid "Any eligible user"
-msgstr ""
-
msgid "Any encrypted tokens"
msgstr ""
@@ -4179,6 +4200,9 @@ msgstr ""
msgid "Any namespace"
msgstr ""
+msgid "App Engine description and apps that are suitable for this deployment target"
+msgstr ""
+
msgid "App ID"
msgstr ""
@@ -4331,6 +4355,13 @@ msgstr ""
msgid "Apply"
msgstr ""
+msgid "Apply %d suggestion"
+msgid_plural "Apply %d suggestions"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "Apply a label"
msgstr ""
@@ -4340,13 +4371,10 @@ msgstr ""
msgid "Apply suggestion"
msgstr ""
-msgid "Apply suggestions"
-msgstr ""
-
msgid "Apply template"
msgstr ""
-msgid "Apply this approval rule to any branch or a specific protected branch."
+msgid "Apply this approval rule to all branches or a specific protected branch."
msgstr ""
msgid "Applying"
@@ -4497,9 +4525,6 @@ msgstr ""
msgid "ApprovalSettings|Prevent editing approval rules in projects and merge requests."
msgstr ""
-msgid "ApprovalSettings|Prevent editing approval rules in projects and merge requests. "
-msgstr ""
-
msgid "ApprovalSettings|Remove all approvals when commits are added to the source branch."
msgstr ""
@@ -4515,6 +4540,9 @@ msgstr ""
msgid "ApprovalSettings|This setting is configured at the instance level and can only be changed by an administrator."
msgstr ""
+msgid "ApprovalSettings|This setting is configured in %{groupName} and can only be changed by an administrator or group owner."
+msgstr ""
+
msgid "ApprovalStatusTooltip|Adheres to separation of duties"
msgstr ""
@@ -5007,9 +5035,6 @@ msgstr ""
msgid "Authenticated API rate limit period in seconds"
msgstr ""
-msgid "Authenticated API request rate limit"
-msgstr ""
-
msgid "Authenticated API requests"
msgstr ""
@@ -5019,10 +5044,10 @@ msgstr ""
msgid "Authenticated Git LFS request rate limit"
msgstr ""
-msgid "Authenticated web rate limit period in seconds"
+msgid "Authenticated Git LFS requests"
msgstr ""
-msgid "Authenticated web request rate limit"
+msgid "Authenticated web rate limit period in seconds"
msgstr ""
msgid "Authenticated web requests"
@@ -5400,9 +5425,6 @@ msgstr ""
msgid "Below you will find all the groups that are public."
msgstr ""
-msgid "Beta"
-msgstr ""
-
msgid "Bi-weekly code coverage"
msgstr ""
@@ -5644,6 +5666,21 @@ msgstr ""
msgid "Board scope affects which issues are displayed for anyone who visits this board"
msgstr ""
+msgid "BoardNewEpic|Groups"
+msgstr ""
+
+msgid "BoardNewEpic|Loading groups"
+msgstr ""
+
+msgid "BoardNewEpic|No matching results"
+msgstr ""
+
+msgid "BoardNewEpic|Search groups"
+msgstr ""
+
+msgid "BoardNewEpic|Select a group"
+msgstr ""
+
msgid "BoardNewIssue|No matching results"
msgstr ""
@@ -5723,6 +5760,9 @@ msgstr ""
msgid "Boards|An error occurred while creating the list. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching child groups. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching group projects. Please try again."
msgstr ""
@@ -6057,6 +6097,9 @@ msgstr ""
msgid "Bulk update"
msgstr ""
+msgid "BulkImports|Re-import creates a new group. It does not sync with the existing group."
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -6066,6 +6109,9 @@ msgstr ""
msgid "BulkImport|From source group"
msgstr ""
+msgid "BulkImport|Group import history"
+msgstr ""
+
msgid "BulkImport|Import failed: Destination cannot be a subgroup of the source group. Change the destination and try again."
msgstr ""
@@ -6078,9 +6124,18 @@ msgstr ""
msgid "BulkImport|Importing the group failed"
msgstr ""
+msgid "BulkImport|Last imported to %{link}"
+msgstr ""
+
msgid "BulkImport|Name already exists."
msgstr ""
+msgid "BulkImport|New group"
+msgstr ""
+
+msgid "BulkImport|No history is available"
+msgstr ""
+
msgid "BulkImport|No parent"
msgstr ""
@@ -6093,6 +6148,9 @@ msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} matching filter \"%{filter}\" from %{link}"
msgstr ""
+msgid "BulkImport|Source group"
+msgstr ""
+
msgid "BulkImport|To new group"
msgstr ""
@@ -6102,6 +6160,9 @@ msgstr ""
msgid "BulkImport|You have no groups to import"
msgstr ""
+msgid "BulkImport|Your imported groups will appear here."
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -6346,6 +6407,9 @@ msgstr ""
msgid "Can be manually deployed to"
msgstr ""
+msgid "Can be overridden in each project."
+msgstr ""
+
msgid "Can create groups:"
msgstr ""
@@ -6448,6 +6512,9 @@ msgstr ""
msgid "Cancelling Preview"
msgstr ""
+msgid "Cannot assign a confidential epic to a non-confidential issue. Make the issue confidential and try again"
+msgstr ""
+
msgid "Cannot be assigned to other projects."
msgstr ""
@@ -6499,9 +6566,6 @@ msgstr ""
msgid "Cannot refer to a group %{timebox_type} by an internal id!"
msgstr ""
-msgid "Cannot set confidential epic for a non-confidential issue"
-msgstr ""
-
msgid "Cannot show preview. For previews on sketch files, they must have the file format introduced by Sketch version 43 and above."
msgstr ""
@@ -6739,15 +6803,15 @@ msgstr ""
msgid "Check out, review, and merge locally"
msgstr ""
-msgid "Check the %{docs_link_start}documentation%{docs_link_end}."
-msgstr ""
-
msgid "Check the current instance configuration "
msgstr ""
msgid "Check the elasticsearch.log file to debug why the migration was halted and make any changes before retrying the migration. When you fix the cause of the failure, click \"Retry migration\", and the migration will be scheduled to be retried in the background."
msgstr ""
+msgid "Check with your administrator."
+msgstr ""
+
msgid "Check your Docker images for known vulnerabilities."
msgstr ""
@@ -6778,6 +6842,9 @@ msgstr ""
msgid "Checkout"
msgstr ""
+msgid "Checkout|$%{selectedPlanPrice} per 10 GB storage per pack"
+msgstr ""
+
msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 minutes"
msgstr ""
@@ -6800,19 +6867,25 @@ msgstr ""
msgid "Checkout|%{name}'s GitLab subscription"
msgstr ""
-msgid "Checkout|%{selectedPlanText} plan"
+msgid "Checkout|%{name}'s storage subscription"
msgstr ""
-msgid "Checkout|%{startDate} - %{endDate}"
+msgid "Checkout|%{quantity} GB of storage"
msgstr ""
-msgid "Checkout|%{totalCiMinutes} CI minute"
-msgid_plural "Checkout|%{totalCiMinutes} CI minutes"
+msgid "Checkout|%{quantity} storage pack"
+msgid_plural "Checkout|%{quantity} storage packs"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "Checkout|%{selectedPlanText} plan"
+msgstr ""
+
+msgid "Checkout|%{startDate} - %{endDate}"
+msgstr ""
+
msgid "Checkout|%{totalCiMinutes} CI minutes"
msgstr ""
@@ -6888,6 +6961,9 @@ msgstr ""
msgid "Checkout|Failed to register credit card. Please try again."
msgstr ""
+msgid "Checkout|GB"
+msgstr ""
+
msgid "Checkout|GitLab group"
msgstr ""
@@ -6924,6 +7000,9 @@ msgstr ""
msgid "Checkout|State"
msgstr ""
+msgid "Checkout|Storage packs"
+msgstr ""
+
msgid "Checkout|Street address"
msgstr ""
@@ -6945,6 +7024,9 @@ msgstr ""
msgid "Checkout|Total minutes: %{quantity}"
msgstr ""
+msgid "Checkout|Total storage: %{quantity} GB"
+msgstr ""
+
msgid "Checkout|Users"
msgstr ""
@@ -6954,16 +7036,25 @@ msgstr ""
msgid "Checkout|Your organization"
msgstr ""
+msgid "Checkout|Your storage subscription has the same term as your main subscription, and the price is prorated accordingly."
+msgstr ""
+
msgid "Checkout|Your subscription will be applied to this group"
msgstr ""
msgid "Checkout|Zip code"
msgstr ""
+msgid "Checkout|a storage subscription"
+msgstr ""
+
msgid "Checkout|company or team"
msgstr ""
-msgid "Checkout|x 1,000 minutes per pack = %{strong}"
+msgid "Checkout|minutes"
+msgstr ""
+
+msgid "Checkout|x %{quantity} %{units} per pack ="
msgstr ""
msgid "Cherry-pick this commit"
@@ -7320,6 +7411,9 @@ msgstr ""
msgid "CloneIssue|Cannot clone issue to target project as it is pending deletion."
msgstr ""
+msgid "CloneIssue|Cannot clone issues of '%{issue_type}' type."
+msgstr ""
+
msgid "Cloned this issue to %{path_to_project}."
msgstr ""
@@ -7374,7 +7468,10 @@ msgstr ""
msgid "Closes this %{quick_action_target}."
msgstr ""
-msgid "Cloud licenses can not be removed."
+msgid "Cloud Functions description and apps that are suitable for this deployment target"
+msgstr ""
+
+msgid "Cloud Run description and apps that are suitable for this deployment target"
msgstr ""
msgid "Cluster"
@@ -7401,6 +7498,12 @@ msgstr ""
msgid "ClusterAgents|Access tokens"
msgstr ""
+msgid "ClusterAgents|Agent might not be connected to GitLab"
+msgstr ""
+
+msgid "ClusterAgents|Agent never connected to GitLab"
+msgstr ""
+
msgid "ClusterAgents|Alternative installation methods"
msgstr ""
@@ -7416,6 +7519,12 @@ msgstr ""
msgid "ClusterAgents|Configuration"
msgstr ""
+msgid "ClusterAgents|Connected"
+msgstr ""
+
+msgid "ClusterAgents|Connection status"
+msgstr ""
+
msgid "ClusterAgents|Copy token"
msgstr ""
@@ -7434,6 +7543,9 @@ msgstr ""
msgid "ClusterAgents|For alternative installation methods %{linkStart}go to the documentation%{linkEnd}."
msgstr ""
+msgid "ClusterAgents|For more troubleshooting information go to"
+msgstr ""
+
msgid "ClusterAgents|Go to the repository"
msgstr ""
@@ -7449,18 +7561,30 @@ msgstr ""
msgid "ClusterAgents|Integrate with the GitLab Agent"
msgstr ""
-msgid "ClusterAgents|Last used"
+msgid "ClusterAgents|Last connected %{timeAgo}."
+msgstr ""
+
+msgid "ClusterAgents|Last contact"
msgstr ""
msgid "ClusterAgents|Learn how to create an agent access token"
msgstr ""
+msgid "ClusterAgents|Make sure you are using a valid token."
+msgstr ""
+
msgid "ClusterAgents|Name"
msgstr ""
msgid "ClusterAgents|Never"
msgstr ""
+msgid "ClusterAgents|Never connected"
+msgstr ""
+
+msgid "ClusterAgents|Not connected"
+msgstr ""
+
msgid "ClusterAgents|Read more about getting started"
msgstr ""
@@ -7482,6 +7606,9 @@ msgstr ""
msgid "ClusterAgents|Select which Agent you want to install"
msgstr ""
+msgid "ClusterAgents|The Agent has not been connected in a long time. There might be a connectivity issue. Last contact was %{timeAgo}."
+msgstr ""
+
msgid "ClusterAgents|The GitLab Agent also requires %{linkStart}enabling the Agent Server%{linkEnd}"
msgstr ""
@@ -7509,9 +7636,6 @@ msgstr ""
msgid "ClusterAgents|You will need to create a token to connect to your agent"
msgstr ""
-msgid "ClusterAgent|This feature is only available for premium plans"
-msgstr ""
-
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -7701,9 +7825,6 @@ msgstr ""
msgid "ClusterIntegration|Create Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Create a provision role on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the account and external ID above. %{startMoreInfoLink}More information%{endLink}"
-msgstr ""
-
msgid "ClusterIntegration|Create cluster on"
msgstr ""
@@ -8136,7 +8257,7 @@ msgstr ""
msgid "ClusterIntegration|Subnets"
msgstr ""
-msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provisioned role, first create one on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the above account and external IDs. %{startMoreInfoLink}More information%{endLink}"
+msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provisioned role, first create one on %{awsLinkStart}Amazon Web Services %{awsLinkEnd} using the above account and external IDs. %{moreInfoStart}More information%{moreInfoEnd}"
msgstr ""
msgid "ClusterIntegration|The Kubernetes certificate used to authenticate to the cluster."
@@ -8370,6 +8491,9 @@ msgstr ""
msgid "Collapse replies"
msgstr ""
+msgid "Collapse settings section"
+msgstr ""
+
msgid "Collapse sidebar"
msgstr ""
@@ -8388,6 +8512,9 @@ msgstr ""
msgid "Comma-separated list of email addresses."
msgstr ""
+msgid "Comma-separated list of users allowed to exceed the rate limit."
+msgstr ""
+
msgid "Comma-separated, e.g. '1.1.1.1, 2.2.2.0/24'"
msgstr ""
@@ -8710,6 +8837,9 @@ msgstr ""
msgid "Configure %{repository_checks_link_start}repository checks%{link_end} and %{housekeeping_link_start}housekeeping%{link_end} on repositories."
msgstr ""
+msgid "Configure CAPTCHAs, IP address limits, and other anti-spam measures."
+msgstr ""
+
msgid "Configure Dependency Scanning in `.gitlab-ci.yml` using the GitLab managed template. You can [add variable overrides](https://docs.gitlab.com/ee/user/application_security/dependency_scanning/#customizing-the-dependency-scanning-settings) to customize Dependency Scanning settings."
msgstr ""
@@ -8746,16 +8876,13 @@ msgstr ""
msgid "Configure a %{codeStart}.gitlab-webide.yml%{codeEnd} file in the %{codeStart}.gitlab%{codeEnd} directory to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
msgstr ""
-msgid "Configure existing installation"
-msgstr ""
-
-msgid "Configure limit for notes created per minute by web and API requests."
+msgid "Configure advanced permissions, Large File Storage, and two-factor authentication settings."
msgstr ""
-msgid "Configure limits for Project/Group Import/Export."
+msgid "Configure approvals by authors and committers on all projects."
msgstr ""
-msgid "Configure limits for web and API requests."
+msgid "Configure existing installation"
msgstr ""
msgid "Configure paths to be protected by Rack Attack."
@@ -8770,10 +8897,13 @@ msgstr ""
msgid "Configure settings for Advanced Search with Elasticsearch."
msgstr ""
+msgid "Configure specific limits for Files API requests that supersede the general user and IP rate limits."
+msgstr ""
+
msgid "Configure specific limits for Git LFS requests that supersede the general user and IP rate limits."
msgstr ""
-msgid "Configure specific limits for Packages API requests that supersede the general user and IP rate limits."
+msgid "Configure specific limits for deprecated API requests that supersede the general user and IP rate limits."
msgstr ""
msgid "Configure the %{link} integration."
@@ -8785,6 +8915,9 @@ msgstr ""
msgid "Configure the way a user creates a new account."
msgstr ""
+msgid "Configure via Merge Request"
+msgstr ""
+
msgid "Configure which lists are shown for anyone who visits this board"
msgstr ""
@@ -9259,6 +9392,9 @@ msgstr ""
msgid "Content parsed with %{link}."
msgstr ""
+msgid "ContentEditor|Table of Contents"
+msgstr ""
+
msgid "ContentEditor|You have to provide a renderMarkdown function or a custom serializer"
msgstr ""
@@ -9445,6 +9581,9 @@ msgstr ""
msgid "Copy link to chart"
msgstr ""
+msgid "Copy prefix"
+msgstr ""
+
msgid "Copy reference"
msgstr ""
@@ -9475,6 +9614,9 @@ msgstr ""
msgid "Copy value"
msgstr ""
+msgid "Corpus Management"
+msgstr ""
+
msgid "Corpus Management|Are you sure you want to delete the corpus?"
msgstr ""
@@ -9703,6 +9845,9 @@ msgstr ""
msgid "Create commit"
msgstr ""
+msgid "Create common files more quickly, and standardize their format."
+msgstr ""
+
msgid "Create confidential merge request"
msgstr ""
@@ -9736,6 +9881,9 @@ msgstr ""
msgid "Create issue"
msgstr ""
+msgid "Create issue to resolve all threads"
+msgstr ""
+
msgid "Create iteration"
msgstr ""
@@ -9790,6 +9938,9 @@ msgstr ""
msgid "Create new..."
msgstr ""
+msgid "Create or import your first project"
+msgstr ""
+
msgid "Create project"
msgstr ""
@@ -10147,7 +10298,7 @@ msgstr ""
msgid "Custom notification events"
msgstr ""
-msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notificationLinkStart} notification emails%{notificationLinkEnd}."
+msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notificationLinkStart}notification emails%{notificationLinkEnd}."
msgstr ""
msgid "Custom project templates"
@@ -10350,10 +10501,10 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-msgid "CycleAnalytics|Showing data for group '%{groupName}' and %{selectedProjectCount} projects from %{startDate} to %{endDate}"
+msgid "CycleAnalytics|Showing data for group '%{groupName}' and %{selectedProjectCount} projects from %{createdAfter} to %{createdBefore}"
msgstr ""
-msgid "CycleAnalytics|Showing data for group '%{groupName}' from %{startDate} to %{endDate}"
+msgid "CycleAnalytics|Showing data for group '%{groupName}' from %{createdAfter} to %{createdBefore}"
msgstr ""
msgid "CycleAnalytics|Stages"
@@ -10587,6 +10738,9 @@ msgstr ""
msgid "DastProfiles|Manage profiles"
msgstr ""
+msgid "DastProfiles|Manage site profiles"
+msgstr ""
+
msgid "DastProfiles|Minimum = 0 (no timeout enabled), Maximum = 2880 minutes"
msgstr ""
@@ -10662,6 +10816,9 @@ msgstr ""
msgid "DastProfiles|Scanner name"
msgstr ""
+msgid "DastProfiles|Schedule"
+msgstr ""
+
msgid "DastProfiles|Select branch"
msgstr ""
@@ -10731,7 +10888,7 @@ msgstr ""
msgid "DastProfiles|Website"
msgstr ""
-msgid "DastProfiles|You can either choose a passive scan or validate the target site in your chosen site profile. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
+msgid "DastProfiles|You can either choose a passive scan or validate the target site from the site profile management page. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
msgstr ""
msgid "DastProfiles|You cannot run an active scan against an unvalidated site."
@@ -10906,7 +11063,7 @@ msgstr ""
msgid "Days to merge"
msgstr ""
-msgid "Deactivate dormant users after 90 days of inactivity. Users can return to active status by signing in to their account. While inactive, a user is not counted as an active user in the instance."
+msgid "Deactivate dormant users after 90 days of inactivity"
msgstr ""
msgid "Dear Administrator,"
@@ -10993,10 +11150,10 @@ msgstr ""
msgid "Define a custom pattern with cron syntax"
msgstr ""
-msgid "Define approval settings."
+msgid "Define approval rules."
msgstr ""
-msgid "Define approval settings. %{linkStart}Learn more.%{linkEnd}"
+msgid "Define approval rules. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "Define custom rules for what constitutes spam, independent of Akismet"
@@ -11005,7 +11162,7 @@ msgstr ""
msgid "Define environments in the deploy stage(s) in %{code_open}.gitlab-ci.yml%{code_close} to track deployments here."
msgstr ""
-msgid "Define how approval rules are applied as a merge request moves toward completion."
+msgid "Define how approval rules are applied to merge requests."
msgstr ""
msgid "Definition"
@@ -11020,6 +11177,12 @@ msgstr ""
msgid "DelayedJobs|Are you sure you want to run %{job_name} immediately? This job will run automatically after it's timer finishes."
msgstr ""
+msgid "DelayedJobs|Are you sure you want to run %{job_name} immediately? This job will run automatically after its timer finishes."
+msgstr ""
+
+msgid "DelayedJobs|Run the delayed job now?"
+msgstr ""
+
msgid "DelayedJobs|Start now"
msgstr ""
@@ -11302,6 +11465,12 @@ msgstr ""
msgid "Dependency proxy image prefix"
msgstr ""
+msgid "DependencyProxy|Create a local proxy for storing frequently used upstream images. %{docLinkStart}Learn more%{docLinkEnd} about dependency proxies."
+msgstr ""
+
+msgid "DependencyProxy|Dependency Proxy"
+msgstr ""
+
msgid "DependencyProxy|Toggle Dependency Proxy"
msgstr ""
@@ -11548,6 +11717,9 @@ msgstr ""
msgid "Deployments"
msgstr ""
+msgid "Deployments to Google Kubernetes Engine can be "
+msgstr ""
+
msgid "Deployments|%{deployments} environment impacted."
msgid_plural "Deployments|%{deployments} environments impacted."
msgstr[0] ""
@@ -11579,6 +11751,9 @@ msgstr ""
msgid "Deployment|success"
msgstr ""
+msgid "Deprecated API rate limits"
+msgstr ""
+
msgid "Deprioritize label"
msgstr ""
@@ -11981,6 +12156,20 @@ msgstr ""
msgid "DiffsCompareBaseBranch|(base)"
msgstr ""
+msgid "Diffs|%d addition"
+msgid_plural "Diffs|%d additions"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
+msgid "Diffs|%d deletion"
+msgid_plural "Diffs|%d deletions"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "Diffs|No file name available"
msgstr ""
@@ -11990,9 +12179,19 @@ msgstr ""
msgid "Diffs|Show all unchanged lines"
msgstr ""
+msgid "Diffs|Showing %{dropdownStart}%{count} changed file%{dropdownEnd}"
+msgid_plural "Diffs|Showing %{dropdownStart}%{count} changed files%{dropdownEnd}"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "Diffs|Something went wrong while fetching diff lines."
msgstr ""
+msgid "Diffs|with %{additions} and %{deletions}"
+msgstr ""
+
msgid "Direct member"
msgstr ""
@@ -12120,9 +12319,6 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-msgid "Dismiss Value Stream Analytics introduction box"
-msgstr ""
-
msgid "Dismiss merge request promotion"
msgstr ""
@@ -12444,6 +12640,9 @@ msgstr ""
msgid "Edit issues"
msgstr ""
+msgid "Edit merge requests"
+msgstr ""
+
msgid "Edit public deploy key"
msgstr ""
@@ -12519,6 +12718,9 @@ msgstr ""
msgid "Elastic|None. Select projects to index."
msgstr ""
+msgid "Eligible users"
+msgstr ""
+
msgid "Email"
msgstr ""
@@ -12648,6 +12850,9 @@ msgstr ""
msgid "Enable"
msgstr ""
+msgid "Enable Amazon EKS integration"
+msgstr ""
+
msgid "Enable Auto DevOps"
msgstr ""
@@ -12681,6 +12886,9 @@ msgstr ""
msgid "Enable SSL verification"
msgstr ""
+msgid "Enable Service Ping"
+msgstr ""
+
msgid "Enable Snowplow tracking"
msgstr ""
@@ -12711,6 +12919,9 @@ msgstr ""
msgid "Enable authenticated Git LFS request rate limit"
msgstr ""
+msgid "Enable authenticated web request rate limit"
+msgstr ""
+
msgid "Enable authentication"
msgstr ""
@@ -12771,7 +12982,7 @@ msgstr ""
msgid "Enable or disable the Pseudonymizer data collection."
msgstr ""
-msgid "Enable or disable version check and service ping."
+msgid "Enable or disable version check and Service Ping."
msgstr ""
msgid "Enable protected paths rate limit"
@@ -12783,18 +12994,12 @@ msgstr ""
msgid "Enable reCAPTCHA"
msgstr ""
-msgid "Enable reCAPTCHA for login"
-msgstr ""
-
-msgid "Enable reCAPTCHA, Invisible Captcha, Akismet and set IP limits. For reCAPTCHA, we currently only support %{recaptcha_v2_link_start}v2%{recaptcha_v2_link_end}"
+msgid "Enable reCAPTCHA for login."
msgstr ""
msgid "Enable repository checks"
msgstr ""
-msgid "Enable service ping"
-msgstr ""
-
msgid "Enable shared runners for all projects and subgroups in this group."
msgstr ""
@@ -12816,7 +13021,10 @@ msgstr ""
msgid "Enable unauthenticated API request rate limit"
msgstr ""
-msgid "Enable unauthenticated request rate limit"
+msgid "Enable unauthenticated web request rate limit"
+msgstr ""
+
+msgid "Enable user deactivation emails"
msgstr ""
msgid "Enable version check"
@@ -12852,9 +13060,6 @@ msgstr ""
msgid "Enabled sources for code import during project creation. OmniAuth must be configured for GitHub"
msgstr ""
-msgid "Enabling this will only make licensed EE features available to projects if the project namespace's plan includes the feature or if the project is public."
-msgstr ""
-
msgid "Encountered an error while rendering: %{err}"
msgstr ""
@@ -12903,9 +13108,6 @@ msgstr ""
msgid "Enter Admin Mode"
msgstr ""
-msgid "Enter IP address range"
-msgstr ""
-
msgid "Enter a number"
msgstr ""
@@ -12918,9 +13120,6 @@ msgstr ""
msgid "Enter at least three characters to search"
msgstr ""
-msgid "Enter domain"
-msgstr ""
-
msgid "Enter in your Bitbucket Server URL and personal access token below"
msgstr ""
@@ -13107,9 +13306,6 @@ msgstr ""
msgid "Environments|Deployment %{status}"
msgstr ""
-msgid "Environments|Dismiss"
-msgstr ""
-
msgid "Environments|Enable review app"
msgstr ""
@@ -13122,9 +13318,6 @@ msgstr ""
msgid "Environments|Environments are places where code gets deployed, such as staging or production."
msgstr ""
-msgid "Environments|Help us improve environments"
-msgstr ""
-
msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
msgstr ""
@@ -13161,6 +13354,9 @@ msgstr ""
msgid "Environments|Note that this action will stop the environment, but it will %{emphasisStart}not%{emphasisEnd} have an effect on any existing deployment due to no “stop environment action†being defined in the %{ciConfigLinkStart}.gitlab-ci.yml%{ciConfigLinkEnd} file."
msgstr ""
+msgid "Environments|Open"
+msgstr ""
+
msgid "Environments|Open live environment"
msgstr ""
@@ -13200,9 +13396,6 @@ msgstr ""
msgid "Environments|Stopping %{environmentName}"
msgstr ""
-msgid "Environments|Take the survey"
-msgstr ""
-
msgid "Environments|There was an error fetching the logs. Please try again."
msgstr ""
@@ -13224,9 +13417,6 @@ msgstr ""
msgid "Environments|You don't have any environments right now"
msgstr ""
-msgid "Environments|Your feedback helps GitLab make environments better for you and other users. Participate and enter a sweepstake to win a USD 30 gift card."
-msgstr ""
-
msgid "Environments|by %{avatar}"
msgstr ""
@@ -13509,7 +13699,7 @@ msgstr ""
msgid "Error parsing CSV file. Please make sure it has"
msgstr ""
-msgid "Error rendering markdown preview"
+msgid "Error rendering Markdown preview"
msgstr ""
msgid "Error saving label update."
@@ -13557,6 +13747,9 @@ msgstr ""
msgid "Error: %{error_message}"
msgstr ""
+msgid "Error: Couldn't load some or all of the changes."
+msgstr ""
+
msgid "Error: No AWS credentials were supplied"
msgstr ""
@@ -13590,6 +13783,9 @@ msgstr ""
msgid "ErrorTracking|Enable error tracking"
msgstr ""
+msgid "ErrorTracking|Error tracking backend"
+msgstr ""
+
msgid "ErrorTracking|If you self-host Sentry, enter your Sentry instance's full URL. If you use Sentry's hosted solution, enter https://sentry.io"
msgstr ""
@@ -13623,6 +13819,12 @@ msgstr ""
msgid "Escalation policies must have at least one rule"
msgstr ""
+msgid "EscalationPolicies|%{clockIcon} IF alert is not %{alertStatus} in %{minutes}"
+msgstr ""
+
+msgid "EscalationPolicies|%{notificationIcon} THEN %{doAction} %{forScheduleOrUser}"
+msgstr ""
+
msgid "EscalationPolicies|+ Add an additional rule"
msgstr ""
@@ -13665,13 +13867,13 @@ msgstr ""
msgid "EscalationPolicies|Escalation policies"
msgstr ""
-msgid "EscalationPolicies|Escalation rules"
+msgid "EscalationPolicies|Escalation policy %{obstacle} in Project %{project}"
msgstr ""
-msgid "EscalationPolicies|Failed to load oncall-schedules"
+msgid "EscalationPolicies|Escalation rules"
msgstr ""
-msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} %{then} THEN %{doAction} %{scheduleOrUser}"
+msgid "EscalationPolicies|Failed to load oncall-schedules"
msgstr ""
msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} minutes"
@@ -13749,18 +13951,36 @@ msgstr ""
msgid "Every %{action} attempt has failed: %{job_error_message}. Please try again."
msgstr ""
+msgid "Every 3 months"
+msgstr ""
+
+msgid "Every 3 months on the %{day} at %{time} %{timezone}"
+msgstr ""
+
+msgid "Every 6 months"
+msgstr ""
+
+msgid "Every 6 months on the %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Every day"
msgstr ""
msgid "Every day (at %{time})"
msgstr ""
+msgid "Every day at %{time} %{timezone}"
+msgstr ""
+
msgid "Every month"
msgstr ""
msgid "Every month (Day %{day} at %{time})"
msgstr ""
+msgid "Every month on the %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Every three months"
msgstr ""
@@ -13777,6 +13997,15 @@ msgstr[3] ""
msgid "Every week (%{weekday} at %{time})"
msgstr ""
+msgid "Every week on %{day} at %{time} %{timezone}"
+msgstr ""
+
+msgid "Every year"
+msgstr ""
+
+msgid "Every year on %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Everyone"
msgstr ""
@@ -13813,9 +14042,6 @@ msgstr ""
msgid "Exactly one of %{attributes} is required"
msgstr ""
-msgid "Example: %{ip_address}. %{read_more_link}."
-msgstr ""
-
msgid "Example: @sub\\.company\\.com$"
msgstr ""
@@ -13882,13 +14108,13 @@ msgstr ""
msgid "Expand pipeline"
msgstr ""
-msgid "Expand sidebar"
+msgid "Expand settings section"
msgstr ""
-msgid "Expected documents: %{expected_documents}"
+msgid "Expand sidebar"
msgstr ""
-msgid "Experienced"
+msgid "Expected documents: %{expected_documents}"
msgstr ""
msgid "ExperimentSubject|Must have exactly one of User, Namespace, or Project."
@@ -14173,9 +14399,6 @@ msgstr ""
msgid "Failed to load related branches"
msgstr ""
-msgid "Failed to load sidebar lock status"
-msgstr ""
-
msgid "Failed to load stacktrace."
msgstr ""
@@ -14604,6 +14827,9 @@ msgstr ""
msgid "Files"
msgstr ""
+msgid "Files API Rate Limits"
+msgstr ""
+
msgid "Files breadcrumb"
msgstr ""
@@ -15603,6 +15829,9 @@ msgstr ""
msgid "GitLab group: %{source_link}"
msgstr ""
+msgid "GitLab informs you if a new version is available."
+msgstr ""
+
msgid "GitLab is a complete DevOps platform, delivered as a single application, fundamentally changing the way Development, Security, and Ops teams collaborate"
msgstr ""
@@ -15618,7 +15847,7 @@ msgstr ""
msgid "GitLab is open source software to collaborate on code."
msgstr ""
-msgid "GitLab is undergoing maintenance and is operating in a read-only mode."
+msgid "GitLab is undergoing maintenance and is operating in read-only mode."
msgstr ""
msgid "GitLab member or Email address"
@@ -15630,9 +15859,6 @@ msgstr ""
msgid "GitLab project export"
msgstr ""
-msgid "GitLab restart is required to apply changes."
-msgstr ""
-
msgid "GitLab single sign-on URL"
msgstr ""
@@ -15648,9 +15874,6 @@ msgstr ""
msgid "GitLab version"
msgstr ""
-msgid "GitLab will inform you if a new version is available."
-msgstr ""
-
msgid "GitLab will run a background job that will produce pseudonymized CSVs of the GitLab database that will be uploaded to your configured object storage directory."
msgstr ""
@@ -15915,9 +16138,21 @@ msgstr ""
msgid "Go to snippets"
msgstr ""
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check 'Allowed domains for sign-ups'."
+msgstr ""
+
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check 'Email restrictions for sign-ups'."
+msgstr ""
+
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check the 'Domain denylist'."
+msgstr ""
+
msgid "Go to the activity feed"
msgstr ""
+msgid "Go to the group’s 'Settings &gt; General' page, and check 'Restrict membership by email domain'."
+msgstr ""
+
msgid "Go to the milestone list"
msgstr ""
@@ -15954,6 +16189,12 @@ msgstr ""
msgid "Goal of the changes and what reviewers should be aware of"
msgstr ""
+msgid "Google Cloud"
+msgstr ""
+
+msgid "Google Cloud offers several deployment targets. Select the one most suitable for your project."
+msgstr ""
+
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
@@ -16038,9 +16279,6 @@ msgstr ""
msgid "Group ID"
msgstr ""
-msgid "Group ID: %{group_id}"
-msgstr ""
-
msgid "Group Owner must have signed in with SAML before enabling Group Managed Accounts"
msgstr ""
@@ -16215,6 +16453,12 @@ msgstr ""
msgid "GroupImport|Unable to process group import file"
msgstr ""
+msgid "GroupPage|Copy group ID"
+msgstr ""
+
+msgid "GroupPage|Group ID: %{group_id}"
+msgstr ""
+
msgid "GroupRoadmap|%{dateWord} – No end date"
msgstr ""
@@ -16269,6 +16513,9 @@ msgstr ""
msgid "GroupRoadmap|Within 3 years"
msgstr ""
+msgid "GroupSAML|\"persistent\" recommended"
+msgstr ""
+
msgid "GroupSAML|%{strongOpen}Warning%{strongClose} - Enabling %{linkStart}SSO enforcement%{linkEnd} can reduce security risks."
msgstr ""
@@ -16401,6 +16648,9 @@ msgstr ""
msgid "GroupSAML|To be able to prohibit outer forks, you first need to enforce dedicate group managed accounts."
msgstr ""
+msgid "GroupSAML|Use SAML group links to manage group membership using SAML."
+msgstr ""
+
msgid "GroupSAML|Valid SAML Response"
msgstr ""
@@ -16413,13 +16663,10 @@ msgstr ""
msgid "GroupSAML|as %{access_level}"
msgstr ""
-msgid "GroupSAML|must match stored NameID of \"%{extern_uid}\" as we use this to identify users. If the NameID changes users will be unable to sign in."
-msgstr ""
-
-msgid "GroupSAML|should be \"persistent\""
+msgid "GroupSAML|must match stored NameID of \"%{extern_uid}\" to identify user and allow sign in"
msgstr ""
-msgid "GroupSAML|should be a random persistent ID, emails are discouraged"
+msgid "GroupSAML|recommend persistent ID instead of email"
msgstr ""
msgid "GroupSelect|No matching results"
@@ -16434,9 +16681,15 @@ msgstr ""
msgid "GroupSettings|Allow project access token creation"
msgstr ""
+msgid "GroupSettings|Applied to all subgroups unless overridden by a group owner. Groups already added to the project lose access."
+msgstr ""
+
msgid "GroupSettings|Auto DevOps pipeline was updated for the group"
msgstr ""
+msgid "GroupSettings|Available only on the top-level group. Applies to all subgroups. Groups already shared with a group outside %{group} are still shared unless removed manually."
+msgstr ""
+
msgid "GroupSettings|Badges"
msgstr ""
@@ -16488,6 +16741,9 @@ msgstr ""
msgid "GroupSettings|New runners registration token has been generated!"
msgstr ""
+msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgstr ""
+
msgid "GroupSettings|Pipeline settings was updated for the group"
msgstr ""
@@ -16500,12 +16756,15 @@ msgstr ""
msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
-msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups."
+msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups"
msgstr ""
msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
msgstr ""
+msgid "GroupSettings|Prevents group members from being notified if the group is mentioned."
+msgstr ""
+
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
msgstr ""
@@ -16542,21 +16801,6 @@ msgstr ""
msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}."
msgstr ""
-msgid "GroupSettings|This setting is only available on the top-level group and it applies to all subgroups. Groups that have already been shared with a group outside %{group} will still be shared, and this access will have to be revoked manually."
-msgstr ""
-
-msgid "GroupSettings|This setting will be applied to all subgroups unless overridden by a group owner. Groups that already have access to the project will continue to have access unless removed manually."
-msgstr ""
-
-msgid "GroupSettings|This setting will override user notification preferences for all members of the group, subgroups, and projects."
-msgstr ""
-
-msgid "GroupSettings|This setting will prevent group members from being notified if the group is mentioned."
-msgstr ""
-
-msgid "GroupSettings|This setting will prevent group members from forking projects outside of the group."
-msgstr ""
-
msgid "GroupSettings|Transfer group"
msgstr ""
@@ -16674,7 +16918,7 @@ msgstr ""
msgid "GroupsNew|No import options available"
msgstr ""
-msgid "GroupsNew|Not all related objects are migrated, as %{docs_link_start}described here%{docs_link_end}. Please %{feedback_link_start}leave feedback%{feedback_link_end} on this feature."
+msgid "GroupsNew|Not all related objects are migrated. %{docs_link_start}More info%{docs_link_end}."
msgstr ""
msgid "GroupsNew|Personal access token"
@@ -16806,15 +17050,27 @@ msgstr ""
msgid "Hello %{name},"
msgstr ""
-msgid "Hello there"
-msgstr ""
-
msgid "Hello, %{name}!"
msgstr ""
msgid "Hello, %{username}!"
msgstr ""
+msgid "HelloMessage|%{handshake_emoji} Contribute to GitLab: %{contribute_link}"
+msgstr ""
+
+msgid "HelloMessage|%{magnifier_emoji} Create a new GitLab issue: %{new_issue_link}"
+msgstr ""
+
+msgid "HelloMessage|%{rocket_emoji} We like your curiosity! Help us improve GitLab by joining the team: %{jobs_page_link}"
+msgstr ""
+
+msgid "HelloMessage|Does this page need fixes or improvements? Open an issue or contribute a merge request to help make GitLab more lovable. At GitLab, everyone can contribute!"
+msgstr ""
+
+msgid "HelloMessage|Welcome to GitLab!"
+msgstr ""
+
msgid "Help"
msgstr ""
@@ -16824,13 +17080,10 @@ msgstr ""
msgid "Helps prevent bots from creating accounts."
msgstr ""
-msgid "Helps prevent bots from creating issues"
+msgid "Helps prevent bots from creating issues."
msgstr ""
-msgid "Helps prevent malicious users hide their activity"
-msgstr ""
-
-msgid "Helps reduce request volume (e.g. from crawlers or abusive bots)"
+msgid "Helps prevent malicious users hide their activity."
msgstr ""
msgid "Helps reduce request volume (for example, from crawlers or abusive bots)"
@@ -16958,6 +17211,12 @@ msgstr ""
msgid "Housekeeping, export, path, transfer, remove, archive."
msgstr ""
+msgid "How do I configure Akismet?"
+msgstr ""
+
+msgid "How do I configure it?"
+msgstr ""
+
msgid "How do I configure runners?"
msgstr ""
@@ -16979,19 +17238,25 @@ msgstr ""
msgid "How do I set up this service?"
msgstr ""
+msgid "How do I use a web terminal?"
+msgstr ""
+
+msgid "How do I use file templates?"
+msgstr ""
+
msgid "How it works"
msgstr ""
msgid "How many days need to pass between marking entity for deletion and actual removing it."
msgstr ""
-msgid "How many seconds an IP will be counted towards the limit"
+msgid "How many seconds an IP counts toward the IP address limit."
msgstr ""
-msgid "I accept the %{terms_link}"
+msgid "How the job limiter handles jobs exceeding the thresholds specified below. The 'track' mode only logs the jobs. The 'compress' mode compresses the jobs and raises an exception if the compressed size exceeds the limit."
msgstr ""
-msgid "I accept the|Terms of Service and Privacy Policy"
+msgid "I accept the %{terms_link}"
msgstr ""
msgid "I forgot my password"
@@ -17075,13 +17340,16 @@ msgstr ""
msgid "IP Address"
msgstr ""
-msgid "IP expiration time"
+msgid "IP address expiration time"
msgstr ""
-msgid "IP subnet restriction only allowed for top-level groups"
+msgid "IP address restrictions"
+msgstr ""
+
+msgid "IP addresses per user"
msgstr ""
-msgid "IPs per user"
+msgid "IP subnet restriction only allowed for top-level groups"
msgstr ""
msgid "Identifier"
@@ -17096,6 +17364,9 @@ msgstr ""
msgid "If any indexed field exceeds this limit it will be truncated to this number of characters and the rest will not be indexed or searchable. This does not apply to repository and wiki indexing. Setting this to 0 means it is unlimited."
msgstr ""
+msgid "If blank, defaults to %{code_open}Retry later%{code_close}."
+msgstr ""
+
msgid "If blank, set allowable lifetime to %{instance_level_policy_in_words}, as defined by the instance admin. Once set, existing tokens for users in this group may be revoked."
msgstr ""
@@ -17147,6 +17418,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 did not initiate these sign-in attempts, please reach out to your administrator or enable two-factor authentication (2FA) on your account."
+msgstr ""
+
msgid "If you did not initiate this change, please contact your administrator immediately."
msgstr ""
@@ -17242,10 +17516,10 @@ msgstr ""
msgid "Import Projects from Gitea"
msgstr ""
-msgid "Import a project"
+msgid "Import an exported GitLab project"
msgstr ""
-msgid "Import an exported GitLab project"
+msgid "Import and export rate limits"
msgstr ""
msgid "Import failed due to a GitHub error: %{original}"
@@ -17257,12 +17531,18 @@ msgstr ""
msgid "Import from Jira"
msgstr ""
+msgid "Import group"
+msgstr ""
+
msgid "Import group from file"
msgstr ""
msgid "Import groups"
msgstr ""
+msgid "Import history"
+msgstr ""
+
msgid "Import in progress"
msgstr ""
@@ -17326,7 +17606,25 @@ msgstr ""
msgid "Import timed out. Import took longer than %{import_jobs_expiration} seconds"
msgstr ""
-msgid "Import/Export Rate Limits"
+msgid "ImportAProjectModal|Import from a project"
+msgstr ""
+
+msgid "ImportAProjectModal|Import members from another project"
+msgstr ""
+
+msgid "ImportAProjectModal|Import project members"
+msgstr ""
+
+msgid "ImportAProjectModal|Only project members (not group members) are imported, and they get the same permissions as the project you import from."
+msgstr ""
+
+msgid "ImportAProjectModal|Successfully imported"
+msgstr ""
+
+msgid "ImportAProjectModal|Unable to import project members"
+msgstr ""
+
+msgid "ImportAProjectModal|You're importing members to the %{strongStart}%{name}%{strongEnd} project."
msgstr ""
msgid "ImportButtons|Connect repositories from"
@@ -17381,7 +17679,7 @@ msgstr[3] ""
msgid "Importing..."
msgstr ""
-msgid "Import|A repository URL usually ends in a .git suffix, although this is not required. Double check to make sure your repository URL is correct."
+msgid "Import|There is not a valid Git repository at this URL. If your HTTP repository is not publicly accessible, verify your credentials."
msgstr ""
msgid "Improve customer support with Service Desk"
@@ -17390,9 +17688,6 @@ msgstr ""
msgid "Improves Git cloning performance."
msgstr ""
-msgid "In %{time_to_now}"
-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 ""
@@ -17678,7 +17973,7 @@ msgstr ""
msgid "InProductMarketing|Start a GitLab Ultimate trial today in less than one minute, no credit card required."
msgstr ""
-msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no CC required"
+msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no credit card required"
msgstr ""
msgid "InProductMarketing|Start a trial"
@@ -17717,7 +18012,7 @@ msgstr ""
msgid "InProductMarketing|Team up in GitLab for greater efficiency"
msgstr ""
-msgid "InProductMarketing|Team work makes the dream work"
+msgid "InProductMarketing|Team work makes the dream work"
msgstr ""
msgid "InProductMarketing|Test, create, deploy"
@@ -18300,6 +18595,9 @@ msgstr ""
msgid "Integrations|Create new issue in Jira"
msgstr ""
+msgid "Integrations|Create new issue in ZenTao"
+msgstr ""
+
msgid "Integrations|Default settings are inherited from the group level."
msgstr ""
@@ -18393,9 +18691,15 @@ msgstr ""
msgid "Integrations|Search Jira issues"
msgstr ""
+msgid "Integrations|Search ZenTao issues"
+msgstr ""
+
msgid "Integrations|Send notifications about project events to Unify Circuit."
msgstr ""
+msgid "Integrations|Send notifications about project events to a Unify Circuit conversation. %{docs_link}"
+msgstr ""
+
msgid "Integrations|Sign in to add namespaces"
msgstr ""
@@ -18435,6 +18739,9 @@ msgstr ""
msgid "Integrations|You've activated every integration 🎉"
msgstr ""
+msgid "Integrations|ZenTao issues display here when you create issues in your project in ZenTao."
+msgstr ""
+
msgid "Interactive mode"
msgstr ""
@@ -18462,9 +18769,6 @@ msgstr ""
msgid "Interval Pattern"
msgstr ""
-msgid "Introducing Value Stream Analytics"
-msgstr ""
-
msgid "Introducing Your DevOps Report"
msgstr ""
@@ -18561,6 +18865,12 @@ msgstr ""
msgid "Investigate vulnerability: %{title}"
msgstr ""
+msgid "Invisible Captcha"
+msgstr ""
+
+msgid "Invisible Captcha helps prevent the creation of spam accounts. It adds a honeypot field and time-sensitive form submission to the account signup form."
+msgstr ""
+
msgid "Invitation"
msgstr ""
@@ -19014,12 +19324,18 @@ msgstr ""
msgid "Issues"
msgstr ""
+msgid "Issues I've created"
+msgstr ""
+
msgid "Issues Rate Limits"
msgstr ""
msgid "Issues and merge requests"
msgstr ""
+msgid "Issues assigned to me"
+msgstr ""
+
msgid "Issues can be bugs, tasks or ideas to be discussed. Also, issues are searchable and filterable."
msgstr ""
@@ -19131,7 +19447,7 @@ msgstr ""
msgid "Iterations|Create cadence"
msgstr ""
-msgid "Iterations|Create your first iteration"
+msgid "Iterations|Create iteration"
msgstr ""
msgid "Iterations|Delete cadence"
@@ -19140,6 +19456,9 @@ msgstr ""
msgid "Iterations|Delete iteration cadence?"
msgstr ""
+msgid "Iterations|Delete iteration?"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -19173,12 +19492,18 @@ msgstr ""
msgid "Iterations|New iteration cadence"
msgstr ""
+msgid "Iterations|No closed iterations."
+msgstr ""
+
msgid "Iterations|No iteration cadences to show."
msgstr ""
msgid "Iterations|No iterations in cadence."
msgstr ""
+msgid "Iterations|No open iterations."
+msgstr ""
+
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
@@ -19209,6 +19534,9 @@ msgstr ""
msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
msgstr ""
+msgid "Iterations|This will remove the iteration from any issues that are assigned to it."
+msgstr ""
+
msgid "Iterations|Title"
msgstr ""
@@ -19224,15 +19552,9 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "I’m familiar with the basics of DevOps."
-msgstr ""
-
msgid "I’m joining my team who’s already on GitLab"
msgstr ""
-msgid "I’m not familiar with the basics of DevOps."
-msgstr ""
-
msgid "Jaeger URL"
msgstr ""
@@ -19497,6 +19819,9 @@ msgstr ""
msgid "Job"
msgstr ""
+msgid "Job %{jobName}"
+msgstr ""
+
msgid "Job Failed #%{build_id}"
msgstr ""
@@ -20089,9 +20414,6 @@ msgstr ""
msgid "Learn more in the"
msgstr ""
-msgid "Learn more in the|pipeline schedules documentation"
-msgstr ""
-
msgid "Learn more."
msgstr ""
@@ -20203,9 +20525,6 @@ msgstr ""
msgid "Leave Admin Mode"
msgstr ""
-msgid "Leave blank for no limit. Once set, existing personal access tokens may be revoked."
-msgstr ""
-
msgid "Leave edit mode? All unsaved changes will be lost."
msgstr ""
@@ -20251,10 +20570,10 @@ msgstr ""
msgid "LicenseCompliance|Acceptable license to be used in the project"
msgstr ""
-msgid "LicenseCompliance|Add a license"
+msgid "LicenseCompliance|Add license and related policy"
msgstr ""
-msgid "LicenseCompliance|Add license and related policy"
+msgid "LicenseCompliance|Add license policy"
msgstr ""
msgid "LicenseCompliance|Allow"
@@ -20356,6 +20675,9 @@ msgstr ""
msgid "LicenseManagement|Uncategorized"
msgstr ""
+msgid "Licensed Enterprise Edition features can be used if the project namespace's plan includes the feature, or if the project is public."
+msgstr ""
+
msgid "Licensed Features"
msgstr ""
@@ -20422,7 +20744,10 @@ msgstr ""
msgid "Limit namespaces and projects that can be indexed"
msgstr ""
-msgid "Limit sign in from multiple ips"
+msgid "Limit project size at a global, group, and project level. %{link_start}Learn more%{link_end}."
+msgstr ""
+
+msgid "Limit sign in from multiple IP addresses"
msgstr ""
msgid "Limit the number of concurrent operations this secondary site can run in the background."
@@ -20434,6 +20759,9 @@ msgstr ""
msgid "Limit the number of issues and epics per minute a user can create through web and API requests."
msgstr ""
+msgid "Limit the size of Sidekiq jobs stored in Redis."
+msgstr ""
+
msgid "Limited to showing %d event at most"
msgid_plural "Limited to showing %d events at most"
msgstr[0] ""
@@ -20441,6 +20769,9 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "Limiting mode"
+msgstr ""
+
msgid "Line changes"
msgstr ""
@@ -20510,9 +20841,6 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
-msgid "List of users to be excluded from the limit"
-msgstr ""
-
msgid "List options"
msgstr ""
@@ -20552,9 +20880,6 @@ msgstr ""
msgid "Loading functions timed out. Please reload the page to try again."
msgstr ""
-msgid "Loading issues"
-msgstr ""
-
msgid "Loading more"
msgstr ""
@@ -20846,6 +21171,9 @@ msgstr ""
msgid "Marked For Deletion At - %{deletion_time}"
msgstr ""
+msgid "Marked as ready. Merging is now allowed."
+msgstr ""
+
msgid "Marked this %{noun} as a draft."
msgstr ""
@@ -20918,52 +21246,22 @@ msgstr ""
msgid "Max 100,000 events"
msgstr ""
-msgid "Max 20 characters"
-msgstr ""
-
-msgid "Max Group Export Download requests per minute per user"
-msgstr ""
-
-msgid "Max Group Export requests per minute per user"
-msgstr ""
-
-msgid "Max Group Import requests per minute per user"
-msgstr ""
-
-msgid "Max Project Export Download requests per minute per user"
-msgstr ""
-
-msgid "Max Project Export requests per minute per user"
-msgstr ""
-
-msgid "Max Project Import requests per minute per user"
-msgstr ""
-
-msgid "Max authenticated API requests per period per user"
-msgstr ""
-
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
-msgid "Max authenticated web requests per period per user"
-msgstr ""
-
msgid "Max file size is 200 KB."
msgstr ""
-msgid "Max requests per minute per user"
-msgstr ""
-
msgid "Max role"
msgstr ""
msgid "Max session time"
msgstr ""
-msgid "Max unauthenticated requests per period per IP"
+msgid "MaxBuilds"
msgstr ""
-msgid "MaxBuilds"
+msgid "Maximum 20 characters"
msgstr ""
msgid "Maximum Conan package file size in bytes"
@@ -20999,6 +21297,12 @@ msgstr ""
msgid "Maximum attachment size (MB)"
msgstr ""
+msgid "Maximum authenticated API requests per rate limit period per user"
+msgstr ""
+
+msgid "Maximum authenticated web requests per rate limit period per user"
+msgstr ""
+
msgid "Maximum bulk request size (MiB)"
msgstr ""
@@ -21044,6 +21348,15 @@ msgstr ""
msgid "Maximum files in a diff"
msgstr ""
+msgid "Maximum group export download requests per minute"
+msgstr ""
+
+msgid "Maximum group export requests per minute"
+msgstr ""
+
+msgid "Maximum group import requests per minute"
+msgstr ""
+
msgid "Maximum import size"
msgstr ""
@@ -21080,7 +21393,7 @@ msgstr ""
msgid "Maximum number of projects."
msgstr ""
-msgid "Maximum number of unique IPs per user"
+msgid "Maximum number of unique IP addresses per user."
msgstr ""
msgid "Maximum page reached"
@@ -21089,12 +21402,24 @@ msgstr ""
msgid "Maximum page size"
msgstr ""
+msgid "Maximum project export download requests per minute"
+msgstr ""
+
+msgid "Maximum project export requests per minute"
+msgstr ""
+
+msgid "Maximum project import requests per minute"
+msgstr ""
+
msgid "Maximum push size"
msgstr ""
msgid "Maximum push size (MB)"
msgstr ""
+msgid "Maximum requests per minute"
+msgstr ""
+
msgid "Maximum running slices"
msgstr ""
@@ -21122,10 +21447,16 @@ msgstr ""
msgid "Maximum time between updates that a mirror can have when scheduled to synchronize."
msgstr ""
-msgid "Maximum time for web terminal websocket connection (in seconds). 0 for unlimited."
+msgid "Maximum time that users are allowed to skip the setup of two-factor authentication (in hours). Set to 0 (zero) to enforce at next sign in."
msgstr ""
-msgid "Maximum time that users are allowed to skip the setup of two-factor authentication (in hours). Set to 0 (zero) to enforce at next sign in."
+msgid "Maximum time, in seconds, for a web terminal websocket connection. 0 for unlimited."
+msgstr ""
+
+msgid "Maximum unauthenticated API requests per rate limit period per IP"
+msgstr ""
+
+msgid "Maximum unauthenticated web requests per rate limit period per IP"
msgstr ""
msgid "May"
@@ -21143,9 +21474,6 @@ msgstr ""
msgid "Medium vulnerabilities present"
msgstr ""
-msgid "Member lock"
-msgstr ""
-
msgid "Member since"
msgstr ""
@@ -21182,6 +21510,9 @@ msgstr ""
msgid "Members of a group may only view projects they have permission to access"
msgstr ""
+msgid "Membership"
+msgstr ""
+
msgid "Members|%{time} by %{user}"
msgstr ""
@@ -21242,9 +21573,6 @@ msgstr ""
msgid "Members|Expiration date updated successfully."
msgstr ""
-msgid "Members|Expired"
-msgstr ""
-
msgid "Members|Filter members"
msgstr ""
@@ -21260,9 +21588,6 @@ msgstr ""
msgid "Members|Membership"
msgstr ""
-msgid "Members|No expiration set"
-msgstr ""
-
msgid "Members|Remove \"%{groupName}\""
msgstr ""
@@ -21284,9 +21609,6 @@ msgstr ""
msgid "Members|Search invited"
msgstr ""
-msgid "Members|in %{time}"
-msgstr ""
-
msgid "Member|Deny access"
msgstr ""
@@ -21362,9 +21684,6 @@ msgstr ""
msgid "Merge request %{mr_link} was reviewed by %{mr_author}"
msgstr ""
-msgid "Merge request (MR) approvals"
-msgstr ""
-
msgid "Merge request analytics"
msgstr ""
@@ -21386,12 +21705,21 @@ msgstr ""
msgid "Merge requests"
msgstr ""
+msgid "Merge requests I've created"
+msgstr ""
+
msgid "Merge requests are a place to propose changes you've made to a project and discuss those changes with others"
msgstr ""
msgid "Merge requests are read-only in a secondary Geo node"
msgstr ""
+msgid "Merge requests assigned to me"
+msgstr ""
+
+msgid "Merge requests that I'm a reviewer"
+msgstr ""
+
msgid "Merge the branch and fix any conflicts that come up"
msgstr ""
@@ -21452,10 +21780,10 @@ msgstr ""
msgid "MergeRequests|An error occurred while saving the draft comment."
msgstr ""
-msgid "MergeRequests|Failed to squash. Should be done manually."
+msgid "MergeRequests|Create issue to resolve thread"
msgstr ""
-msgid "MergeRequests|Resolve this thread in a new issue"
+msgid "MergeRequests|Failed to squash. Should be done manually."
msgstr ""
msgid "MergeRequests|Saving the comment failed"
@@ -22273,6 +22601,9 @@ msgstr ""
msgid "MoveIssue|Cannot move issue to project it originates from!"
msgstr ""
+msgid "MoveIssue|Cannot move issues of '%{issue_type}' type."
+msgstr ""
+
msgid "Moved issue to %{label} column in the board."
msgstr ""
@@ -22400,6 +22731,15 @@ 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. To learn more about reducing storage capacity please visit our docs."
msgstr ""
+msgid "NamespaceUserCap|Pending users must be reviewed and approved by a group owner. Learn more about %{user_caps_link_start}User Caps%{link_end} and %{users_pending_approval_link_start}Users Pending Approval%{link_end}."
+msgstr ""
+
+msgid "NamespaceUserCap|View pending user approvals"
+msgstr ""
+
+msgid "NamespaceUserCap|Your group has reached its billable member limit"
+msgstr ""
+
msgid "Namespaces"
msgstr ""
@@ -22442,9 +22782,6 @@ msgstr ""
msgid "Network"
msgstr ""
-msgid "Network Policy|New rule"
-msgstr ""
-
msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is inbound from a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
msgstr ""
@@ -22466,16 +22803,13 @@ msgstr ""
msgid "NetworkPolicies|%{strongOpen}any%{strongClose} port"
msgstr ""
-msgid "NetworkPolicies|+ Add alert"
-msgstr ""
-
msgid "NetworkPolicies|.yaml"
msgstr ""
msgid "NetworkPolicies|.yaml mode"
msgstr ""
-msgid "NetworkPolicies|Actions"
+msgid "NetworkPolicies|Add alert"
msgstr ""
msgid "NetworkPolicies|Alerts are intended to be selectively used for a limited number of events that are potentially concerning and warrant a manual review. Alerts should not be used as a substitute for a SIEM or a logging tool. High volume alerts are likely to be dropped so as to preserve the stability of GitLab's integration with Kubernetes."
@@ -22511,9 +22845,6 @@ msgstr ""
msgid "NetworkPolicies|Deny all traffic"
msgstr ""
-msgid "NetworkPolicies|Description"
-msgstr ""
-
msgid "NetworkPolicies|Edit policy"
msgstr ""
@@ -22526,9 +22857,6 @@ msgstr ""
msgid "NetworkPolicies|IP/subnet"
msgstr ""
-msgid "NetworkPolicies|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
-msgstr ""
-
msgid "NetworkPolicies|Invalid or empty policy"
msgstr ""
@@ -22538,19 +22866,16 @@ msgstr ""
msgid "NetworkPolicies|Kubernetes error: %{error}"
msgstr ""
-msgid "NetworkPolicies|Name"
-msgstr ""
-
msgid "NetworkPolicies|Network"
msgstr ""
-msgid "NetworkPolicies|Network traffic"
+msgid "NetworkPolicies|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
msgstr ""
-msgid "NetworkPolicies|New policy"
+msgid "NetworkPolicies|Network policy can be created after the environment is loaded successfully."
msgstr ""
-msgid "NetworkPolicies|No policies detected"
+msgid "NetworkPolicies|Network traffic"
msgstr ""
msgid "NetworkPolicies|None selected"
@@ -22559,21 +22884,12 @@ msgstr ""
msgid "NetworkPolicies|Please %{installLinkStart}install%{installLinkEnd} and %{configureLinkStart}configure a Kubernetes Agent for this project%{configureLinkEnd} to enable alerts."
msgstr ""
-msgid "NetworkPolicies|Policies are a specification of how groups of pods are allowed to communicate with each other's network endpoints."
-msgstr ""
-
msgid "NetworkPolicies|Policy %{policyName} was successfully changed"
msgstr ""
msgid "NetworkPolicies|Policy definition"
msgstr ""
-msgid "NetworkPolicies|Policy editor"
-msgstr ""
-
-msgid "NetworkPolicies|Policy preview"
-msgstr ""
-
msgid "NetworkPolicies|Rule"
msgstr ""
@@ -22583,9 +22899,6 @@ msgstr ""
msgid "NetworkPolicies|Rule mode is unavailable for this policy. In some cases, we cannot parse the YAML file back into the rules editor."
msgstr ""
-msgid "NetworkPolicies|Rules"
-msgstr ""
-
msgid "NetworkPolicies|Save changes"
msgstr ""
@@ -22598,9 +22911,6 @@ msgstr ""
msgid "NetworkPolicies|Traffic that does not match any rule will be blocked."
msgstr ""
-msgid "NetworkPolicies|Unable to parse policy"
-msgstr ""
-
msgid "NetworkPolicies|all DNS names"
msgstr ""
@@ -22782,6 +23092,9 @@ msgstr ""
msgid "New issue"
msgstr ""
+msgid "New issue in %{project}"
+msgstr ""
+
msgid "New issue title"
msgstr ""
@@ -22860,7 +23173,7 @@ msgstr ""
msgid "Newest first"
msgstr ""
-msgid "Newly registered users will by default be external"
+msgid "Newly-registered users are external by default"
msgstr ""
msgid "Next"
@@ -23175,8 +23488,12 @@ msgstr ""
msgid "No webhooks found, add one in the form above."
msgstr ""
-msgid "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} to renew your subscription."
-msgstr ""
+msgid "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} day to renew your subscription."
+msgid_plural "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} days to renew your subscription."
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
msgid "No. of commits"
msgstr ""
@@ -23193,7 +23510,7 @@ msgstr ""
msgid "Nodes"
msgstr ""
-msgid "Non-admin users can sign in with read-only access and make read-only API requests."
+msgid "Non-admin users are restricted to read-only access, in both GitLab UI and API."
msgstr ""
msgid "None"
@@ -23274,7 +23591,7 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
-msgid "Notes Rate Limits"
+msgid "Notes rate limit"
msgstr ""
msgid "Notes|Are you sure you want to cancel creating this comment?"
@@ -23449,9 +23766,6 @@ msgstr ""
msgid "November"
msgstr ""
-msgid "Novice"
-msgstr ""
-
msgid "Now, personalize your GitLab experience"
msgstr ""
@@ -23620,7 +23934,7 @@ msgstr ""
msgid "OnCallSchedules|For this rotation, on-call will be:"
msgstr ""
-msgid "OnCallSchedules|On-call schedule %{schedule} in Project %{project}"
+msgid "OnCallSchedules|On-call schedule %{obstacle} in Project %{project}"
msgstr ""
msgid "OnCallSchedules|On-call schedules"
@@ -23767,22 +24081,22 @@ msgstr ""
msgid "OnDemandScans|Scanner profile"
msgstr ""
-msgid "OnDemandScans|Select one of the existing profiles"
+msgid "OnDemandScans|Schedule scan"
msgstr ""
-msgid "OnDemandScans|Site profile"
+msgid "OnDemandScans|Select one of the existing profiles"
msgstr ""
-msgid "OnDemandScans|Use existing scanner profile"
+msgid "OnDemandScans|Site profile"
msgstr ""
-msgid "OnDemandScans|Use existing site profile"
+msgid "OnDemandScans|Start time"
msgstr ""
-msgid "OnDemandScans|You can either choose a passive scan or validate the target site in your chosen site profile. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
+msgid "OnDemandScans|Use existing scanner profile"
msgstr ""
-msgid "OnDemandScans|You cannot run an active scan against an unvalidated site."
+msgid "OnDemandScans|Use existing site profile"
msgstr ""
msgid "OnDemandScans|You must create a repository within your project to run an on-demand scan."
@@ -23849,6 +24163,9 @@ msgstr ""
msgid "Only admins can delete project"
msgstr ""
+msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
+msgstr ""
+
msgid "Only include features new to your current subscription tier."
msgstr ""
@@ -23867,6 +24184,12 @@ msgstr ""
msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
+msgid "Only reCAPTCHA v2 is supported:"
+msgstr ""
+
+msgid "Only users from the specified IP address ranges are able to reach this group, including all subgroups, projects, and Git repositories."
+msgstr ""
+
msgid "Only verified users with an email address in any of these domains can be added to the group."
msgstr ""
@@ -24053,9 +24376,6 @@ msgstr ""
msgid "Package Registry"
msgstr ""
-msgid "Package Registry Rate Limits"
-msgstr ""
-
msgid "Package Registry: authenticated API requests"
msgstr ""
@@ -24074,6 +24394,9 @@ msgstr ""
msgid "Package recipe already exists"
msgstr ""
+msgid "Package registry rate limits"
+msgstr ""
+
msgid "Package type"
msgstr ""
@@ -24140,6 +24463,9 @@ msgstr ""
msgid "PackageRegistry|Composer"
msgstr ""
+msgid "PackageRegistry|Composer.json with license: %{license} and version: %{version}"
+msgstr ""
+
msgid "PackageRegistry|Conan"
msgstr ""
@@ -24203,6 +24529,9 @@ msgstr ""
msgid "PackageRegistry|Copy require package include"
msgstr ""
+msgid "PackageRegistry|Copy target SHA"
+msgstr ""
+
msgid "PackageRegistry|Copy yarn command"
msgstr ""
@@ -24269,6 +24598,9 @@ msgstr ""
msgid "PackageRegistry|Install package version"
msgstr ""
+msgid "PackageRegistry|Instance-level"
+msgstr ""
+
msgid "PackageRegistry|Invalid Package: failed metadata extraction"
msgstr ""
@@ -24314,6 +24646,9 @@ msgstr ""
msgid "PackageRegistry|Pip Command"
msgstr ""
+msgid "PackageRegistry|Project-level"
+msgstr ""
+
msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
msgstr ""
@@ -24335,6 +24670,9 @@ msgstr ""
msgid "PackageRegistry|Remove package"
msgstr ""
+msgid "PackageRegistry|Required Python: %{pythonVersion}"
+msgstr ""
+
msgid "PackageRegistry|RubyGems"
msgstr ""
@@ -24377,6 +24715,9 @@ msgstr ""
msgid "PackageRegistry|Source project located at %{link}"
msgstr ""
+msgid "PackageRegistry|Target SHA: %{sha}"
+msgstr ""
+
msgid "PackageRegistry|There are no other versions of this package."
msgstr ""
@@ -24545,6 +24886,18 @@ msgstr ""
msgid "Password was successfully updated. Please sign in again."
msgstr ""
+msgid "PasswordPrompt|Confirm password"
+msgstr ""
+
+msgid "PasswordPrompt|Confirm password to continue"
+msgstr ""
+
+msgid "PasswordPrompt|Password is required"
+msgstr ""
+
+msgid "PasswordPrompt|Please enter your password to confirm"
+msgstr ""
+
msgid "Passwords should be unique and not used for any other sites or services."
msgstr ""
@@ -24572,6 +24925,9 @@ msgstr ""
msgid "Paste project path (i.e. gitlab-org/gitlab)"
msgstr ""
+msgid "Paste this DSN into your Sentry SDK"
+msgstr ""
+
msgid "Paste your public SSH key, which is usually contained in the file '~/.ssh/id_ed25519.pub' or '~/.ssh/id_rsa.pub' and begins with 'ssh-ed25519' or 'ssh-rsa'. Do not paste your private SSH key, as that can compromise your identity."
msgstr ""
@@ -24656,6 +25012,9 @@ msgstr ""
msgid "PerformanceBar|First Contentful Paint"
msgstr ""
+msgid "PerformanceBar|Flamegraph with mode:"
+msgstr ""
+
msgid "PerformanceBar|Frontend resources"
msgstr ""
@@ -24689,6 +25048,15 @@ msgstr ""
msgid "PerformanceBar|Trace"
msgstr ""
+msgid "PerformanceBar|cpu"
+msgstr ""
+
+msgid "PerformanceBar|object"
+msgstr ""
+
+msgid "PerformanceBar|wall"
+msgstr ""
+
msgid "Period in seconds"
msgstr ""
@@ -24917,6 +25285,48 @@ msgstr ""
msgid "PipelineSchedules|Variables"
msgstr ""
+msgid "PipelineSource|API"
+msgstr ""
+
+msgid "PipelineSource|Chat"
+msgstr ""
+
+msgid "PipelineSource|External"
+msgstr ""
+
+msgid "PipelineSource|External Pull Request"
+msgstr ""
+
+msgid "PipelineSource|Merge Request"
+msgstr ""
+
+msgid "PipelineSource|On-Demand DAST Scan"
+msgstr ""
+
+msgid "PipelineSource|On-Demand DAST Validation"
+msgstr ""
+
+msgid "PipelineSource|Parent Pipeline"
+msgstr ""
+
+msgid "PipelineSource|Pipeline"
+msgstr ""
+
+msgid "PipelineSource|Push"
+msgstr ""
+
+msgid "PipelineSource|Schedule"
+msgstr ""
+
+msgid "PipelineSource|Trigger"
+msgstr ""
+
+msgid "PipelineSource|Web"
+msgstr ""
+
+msgid "PipelineSource|Web IDE"
+msgstr ""
+
msgid "PipelineStatusTooltip|Pipeline: %{ciStatus}"
msgstr ""
@@ -25217,46 +25627,7 @@ msgstr ""
msgid "Pipeline|Source"
msgstr ""
-msgid "Pipeline|Source|API"
-msgstr ""
-
-msgid "Pipeline|Source|Chat"
-msgstr ""
-
-msgid "Pipeline|Source|External"
-msgstr ""
-
-msgid "Pipeline|Source|External Pull Request"
-msgstr ""
-
-msgid "Pipeline|Source|Merge Request"
-msgstr ""
-
-msgid "Pipeline|Source|On-Demand DAST Scan"
-msgstr ""
-
-msgid "Pipeline|Source|On-Demand DAST Validation"
-msgstr ""
-
-msgid "Pipeline|Source|Parent Pipeline"
-msgstr ""
-
-msgid "Pipeline|Source|Pipeline"
-msgstr ""
-
-msgid "Pipeline|Source|Push"
-msgstr ""
-
-msgid "Pipeline|Source|Schedule"
-msgstr ""
-
-msgid "Pipeline|Source|Trigger"
-msgstr ""
-
-msgid "Pipeline|Source|Web"
-msgstr ""
-
-msgid "Pipeline|Source|Web IDE"
+msgid "Pipeline|Source|Security Policy"
msgstr ""
msgid "Pipeline|Specify variable values to be used in this run. The values specified in %{linkStart}CI/CD settings%{linkEnd} will be used by default."
@@ -25307,7 +25678,7 @@ msgstr ""
msgid "Pipeline|We are currently unable to fetch pipeline data"
msgstr ""
-msgid "Pipeline|You’re about to stop pipeline %{pipelineId}."
+msgid "Pipeline|You’re about to stop pipeline #%{pipelineId}."
msgstr ""
msgid "Pipeline|for"
@@ -25334,6 +25705,9 @@ msgstr ""
msgid "Plain diff"
msgstr ""
+msgid "Plain-text response to send to clients that hit a rate limit"
+msgstr ""
+
msgid "Plan:"
msgstr ""
@@ -25478,9 +25852,6 @@ msgstr ""
msgid "Please provide attributes to update"
msgstr ""
-msgid "Please provide your username or email address."
-msgstr ""
-
msgid "Please reach out if you have any questions and we'll be happy to assist."
msgstr ""
@@ -25523,9 +25894,6 @@ msgstr ""
msgid "Please set a new password before proceeding."
msgstr ""
-msgid "Please share your feedback about %{featureName} %{linkStart}in this issue%{linkEnd} to help us improve the experience."
-msgstr ""
-
msgid "Please solve the captcha"
msgstr ""
@@ -25703,6 +26071,9 @@ msgstr ""
msgid "Prevent adding new members to project membership within this group"
msgstr ""
+msgid "Prevent auto-stopping"
+msgstr ""
+
msgid "Prevent editing approval rules in projects and merge requests."
msgstr ""
@@ -25715,7 +26086,7 @@ msgstr ""
msgid "Prevent users from changing their profile name"
msgstr ""
-msgid "Prevent users from performing write operations on GitLab while performing maintenance."
+msgid "Prevent users from performing write operations while GitLab maintenance is in progress."
msgstr ""
msgid "Preview"
@@ -25988,6 +26359,9 @@ msgstr ""
msgid "Profiles|Enter your name, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Enter your password to confirm the email change"
+msgstr ""
+
msgid "Profiles|Enter your pronouns to let people know how to refer to you"
msgstr ""
@@ -26222,10 +26596,10 @@ msgstr ""
msgid "Profiles|e.g. My MacBook key"
msgstr ""
-msgid "Profiles|username"
+msgid "Profiles|https://website.com"
msgstr ""
-msgid "Profiles|website.com"
+msgid "Profiles|username"
msgstr ""
msgid "Profiles|your account"
@@ -26468,9 +26842,21 @@ msgstr ""
msgid "ProjectSelect| or group"
msgstr ""
+msgid "ProjectSelect|No matching results"
+msgstr ""
+
msgid "ProjectSelect|Search for project"
msgstr ""
+msgid "ProjectSelect|Search projects"
+msgstr ""
+
+msgid "ProjectSelect|Select a project"
+msgstr ""
+
+msgid "ProjectSelect|There was an error fetching the projects. Please try again."
+msgstr ""
+
msgid "ProjectService|Drone server URL"
msgstr ""
@@ -26558,6 +26944,9 @@ msgstr ""
msgid "ProjectService|Trigger event when a new, unique alert is recorded."
msgstr ""
+msgid "ProjectService|Trigger event when a new, unique vulnerability is recorded. (Note: This feature requires an Ultimate plan.)"
+msgstr ""
+
msgid "ProjectService|Trigger event when a pipeline status changes."
msgstr ""
@@ -26972,9 +27361,15 @@ msgstr ""
msgid "Projects are graded based on the highest severity vulnerability present"
msgstr ""
+msgid "Projects are organized into groups"
+msgstr ""
+
msgid "Projects contributed to"
msgstr ""
+msgid "Projects help you organize your work. They contain your file repository, issues, merge requests, and so much more."
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr ""
@@ -27209,10 +27604,10 @@ msgstr ""
msgid "PrometheusService|Prometheus cluster integration"
msgstr ""
-msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
+msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
msgstr ""
-msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
+msgid "PrometheusService|The ID of the IAP-secured resource."
msgstr ""
msgid "PrometheusService|The Prometheus API base URL."
@@ -27830,6 +28225,9 @@ msgstr ""
msgid "Rate limit"
msgstr ""
+msgid "Rate limits can help reduce request volume (like from crawlers or abusive bots)."
+msgstr ""
+
msgid "Raw blob request rate limit per minute"
msgstr ""
@@ -27842,6 +28240,9 @@ msgstr ""
msgid "Re-authentication required"
msgstr ""
+msgid "Re-import"
+msgstr ""
+
msgid "Re-request review"
msgstr ""
@@ -27863,6 +28264,9 @@ msgstr ""
msgid "Read more about related issues"
msgstr ""
+msgid "Read their documentation."
+msgstr ""
+
msgid "Ready to get started with GitLab? Follow these steps to set up your workspace, plan and commit changes, and deploy your project."
msgstr ""
@@ -27896,6 +28300,9 @@ msgstr ""
msgid "Receive any notifications from GitLab."
msgstr ""
+msgid "Receive notification of abuse reports by email."
+msgstr ""
+
msgid "Receive notifications about your own activity"
msgstr ""
@@ -28041,9 +28448,6 @@ msgstr ""
msgid "Registry setup"
msgstr ""
-msgid "Regulate approvals by authors/committers. Affects all projects."
-msgstr ""
-
msgid "Reindexing Status: %{status} (Slice multiplier: %{multiplier}, Maximum running slices: %{max_slices})"
msgstr ""
@@ -28141,6 +28545,9 @@ msgstr ""
msgid "Release|Something went wrong while saving the release details."
msgstr ""
+msgid "Reload page"
+msgstr ""
+
msgid "Remediations"
msgstr ""
@@ -28423,6 +28830,9 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
+msgid "Repeats"
+msgstr ""
+
msgid "Replace"
msgstr ""
@@ -28793,10 +29203,7 @@ msgstr ""
msgid "Require additional authentication for administrative tasks."
msgstr ""
-msgid "Require all users in this group to setup Two-factor authentication"
-msgstr ""
-
-msgid "Require all users in this group to setup two-factor authentication"
+msgid "Require all users in this group to set up two-factor authentication"
msgstr ""
msgid "Required approvals (%{approvals_given} given)"
@@ -28846,6 +29253,9 @@ msgstr[3] ""
msgid "Requires values to meet regular expression requirements."
msgstr ""
+msgid "Requires you to deploy or set up cloud-hosted Sentry."
+msgstr ""
+
msgid "Requires your primary GitLab email address."
msgstr ""
@@ -28906,9 +29316,6 @@ msgstr ""
msgid "Resolve"
msgstr ""
-msgid "Resolve all threads in new issue"
-msgstr ""
-
msgid "Resolve conflicts"
msgstr ""
@@ -28966,6 +29373,9 @@ msgstr ""
msgid "Response text"
msgstr ""
+msgid "Restart GitLab to apply changes."
+msgstr ""
+
msgid "Restart Terminal"
msgstr ""
@@ -28984,6 +29394,9 @@ msgstr ""
msgid "Restoring the project will prevent the project from being removed on this date and restore people's ability to make changes to it."
msgstr ""
+msgid "Restrict group access by IP address. %{link_start}Learn more%{link_end}."
+msgstr ""
+
msgid "Restrict membership by email domain"
msgstr ""
@@ -29301,6 +29714,9 @@ msgstr ""
msgid "Runners|Runner #%{runner_id}"
msgstr ""
+msgid "Runners|Runner assigned to project."
+msgstr ""
+
msgid "Runners|Runner is offline, last contact was %{runner_contact} ago"
msgstr ""
@@ -29313,6 +29729,9 @@ msgstr ""
msgid "Runners|Runner registration"
msgstr ""
+msgid "Runners|Runner unassigned from project."
+msgstr ""
+
msgid "Runners|Runners"
msgstr ""
@@ -29505,7 +29924,7 @@ msgstr ""
msgid "SastEntryPoints|How do I set up SAST?"
msgstr ""
-msgid "SastEntryPoints|Learn more."
+msgid "SastEntryPoints|Learn more"
msgstr ""
msgid "Satisfied"
@@ -29547,7 +29966,7 @@ msgstr ""
msgid "Save pipeline schedule"
msgstr ""
-msgid "Save space and find images in the container Registry. remove unneeded tags and keep only the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
+msgid "Save storage space by automatically deleting tags from the container registry and keeping the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
msgstr ""
msgid "Saving"
@@ -29721,6 +30140,9 @@ msgstr ""
msgid "Search or filter results…"
msgstr ""
+msgid "Search or jump to..."
+msgstr ""
+
msgid "Search project"
msgstr ""
@@ -29781,16 +30203,16 @@ msgstr ""
msgid "SearchCodeResults|of %{link_to_project}"
msgstr ""
-msgid "SearchResults|Showing %{count} %{scope} for%{term_element}"
+msgid "SearchResults|Showing %{count} %{scope} for %{term_element}"
msgstr ""
-msgid "SearchResults|Showing %{count} %{scope} for%{term_element} in your personal and project snippets"
+msgid "SearchResults|Showing %{count} %{scope} for %{term_element} in your personal and project snippets"
msgstr ""
-msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for%{term_element}"
+msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for %{term_element}"
msgstr ""
-msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for%{term_element} in your personal and project snippets"
+msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for %{term_element} in your personal and project snippets"
msgstr ""
msgid "SearchResults|code result"
@@ -29894,6 +30316,9 @@ msgstr ""
msgid "Secret Detection"
msgstr ""
+msgid "Secret access key"
+msgstr ""
+
msgid "Secret token"
msgstr ""
@@ -29933,9 +30358,6 @@ msgstr ""
msgid "SecurityApprovals|A merge request approval is required when the license compliance report contains a denied license."
msgstr ""
-msgid "SecurityApprovals|Configurable if security scanners are enabled. %{linkStart}Learn more.%{linkEnd}"
-msgstr ""
-
msgid "SecurityApprovals|Coverage-Check"
msgstr ""
@@ -29948,24 +30370,18 @@ msgstr ""
msgid "SecurityApprovals|Learn more about Vulnerability-Check"
msgstr ""
-msgid "SecurityApprovals|License Scanning must be enabled. %{linkStart}Learn more%{linkEnd}."
-msgstr ""
-
msgid "SecurityApprovals|License-Check"
msgstr ""
msgid "SecurityApprovals|Requires approval for Denied licenses. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}More information%{linkEnd}"
+msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "SecurityApprovals|Requires approval for vulnerabilities. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
-msgid "SecurityApprovals|Test coverage must be enabled. %{linkStart}Learn more%{linkEnd}."
-msgstr ""
-
msgid "SecurityApprovals|Vulnerability-Check"
msgstr ""
@@ -30029,6 +30445,12 @@ msgstr ""
msgid "SecurityConfiguration|Immediately begin risk analysis and remediation with application security features. Start with SAST and Secret Detection, available to all plans. Upgrade to Ultimate to get all features, including:"
msgstr ""
+msgid "SecurityConfiguration|Manage corpus"
+msgstr ""
+
+msgid "SecurityConfiguration|Manage corpus files used as mutation sources in coverage fuzzing."
+msgstr ""
+
msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
msgstr ""
@@ -30083,6 +30505,12 @@ msgstr ""
msgid "SecurityOrchestration|Action"
msgstr ""
+msgid "SecurityOrchestration|Actions"
+msgstr ""
+
+msgid "SecurityOrchestration|Add rule"
+msgstr ""
+
msgid "SecurityOrchestration|All policies"
msgstr ""
@@ -30116,9 +30544,6 @@ msgstr ""
msgid "SecurityOrchestration|Network"
msgstr ""
-msgid "SecurityOrchestration|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
-msgstr ""
-
msgid "SecurityOrchestration|New policy"
msgstr ""
@@ -30134,6 +30559,9 @@ msgstr ""
msgid "SecurityOrchestration|Policy editor"
msgstr ""
+msgid "SecurityOrchestration|Policy preview"
+msgstr ""
+
msgid "SecurityOrchestration|Policy status"
msgstr ""
@@ -30143,6 +30571,9 @@ msgstr ""
msgid "SecurityOrchestration|Rule"
msgstr ""
+msgid "SecurityOrchestration|Rules"
+msgstr ""
+
msgid "SecurityOrchestration|Scan Execution"
msgstr ""
@@ -30236,6 +30667,9 @@ msgstr ""
msgid "SecurityReports|Create issue"
msgstr ""
+msgid "SecurityReports|Development vulnerabilities"
+msgstr ""
+
msgid "SecurityReports|Dismiss vulnerability"
msgstr ""
@@ -30251,6 +30685,9 @@ msgstr ""
msgid "SecurityReports|Download results"
msgstr ""
+msgid "SecurityReports|Download scanned URLs"
+msgstr ""
+
msgid "SecurityReports|Download scanned resources"
msgstr ""
@@ -30374,6 +30811,9 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
+msgid "SecurityReports|The Vulnerability Report shows the results of the lastest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "SecurityReports|The security reports below contain one or more vulnerability findings that could not be parsed and were not recorded. Download the artifacts in the job output to investigate. Ensure any security report created conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
msgstr ""
@@ -30515,10 +30955,10 @@ msgstr ""
msgid "Select a repository"
msgstr ""
-msgid "Select a role"
+msgid "Select a repository containing templates for common files."
msgstr ""
-msgid "Select a shared template repository for all projects on this instance."
+msgid "Select a role"
msgstr ""
msgid "Select a template repository"
@@ -30596,6 +31036,9 @@ msgstr ""
msgid "Select project to choose zone"
msgstr ""
+msgid "Select project to create issue"
+msgstr ""
+
msgid "Select projects"
msgstr ""
@@ -30713,6 +31156,9 @@ msgstr ""
msgid "Send emails to help guide new users through the onboarding process."
msgstr ""
+msgid "Send emails to users upon account deactivation."
+msgstr ""
+
msgid "Send message"
msgstr ""
@@ -30731,6 +31177,9 @@ msgstr ""
msgid "Send service data"
msgstr ""
+msgid "Sentry"
+msgstr ""
+
msgid "Sentry API URL"
msgstr ""
@@ -30845,6 +31294,9 @@ msgstr ""
msgid "Service"
msgstr ""
+msgid "Service Accounts keys are required to authorize GitLab to deploy your Google Cloud project."
+msgstr ""
+
msgid "Service Desk"
msgstr ""
@@ -30917,15 +31369,15 @@ msgstr ""
msgid "Set a password on your account to pull or push via %{protocol}."
msgstr ""
-msgid "Set a template repository for projects in this group"
-msgstr ""
-
msgid "Set access permissions for this token."
msgstr ""
msgid "Set an instance-wide domain that will be available to all clusters when installing Knative."
msgstr ""
+msgid "Set any rate limit to %{code_open}0%{code_close} to disable the limit."
+msgstr ""
+
msgid "Set default and restrict visibility levels. Configure import sources and git access protocol."
msgstr ""
@@ -30938,7 +31390,7 @@ msgstr ""
msgid "Set limit to 0 to allow any file size."
msgstr ""
-msgid "Set max session time for web terminal."
+msgid "Set limits for web and API requests."
msgstr ""
msgid "Set milestone"
@@ -30947,15 +31399,18 @@ msgstr ""
msgid "Set new password"
msgstr ""
-msgid "Set notification email for abuse reports."
+msgid "Set parent epic to an epic"
msgstr ""
-msgid "Set parent epic to an epic"
+msgid "Set per-user rate limits for imports and exports of projects and groups."
msgstr ""
msgid "Set projects and maximum size limits, session duration, user options, and check feature availability for namespace plan."
msgstr ""
+msgid "Set rate limits for package registry API requests that supersede the general user and IP rate limits."
+msgstr ""
+
msgid "Set severity"
msgstr ""
@@ -30974,15 +31429,24 @@ msgstr ""
msgid "Set the default branch for this project. All merge requests and commits are made against this branch unless you specify a different one."
msgstr ""
+msgid "Set the default expiration time for job artifacts in all projects. Set to %{code_open}0%{code_close} to never expire artifacts by default. If no unit is written, it defaults to seconds. For example, these are all equivalent: %{code_open}3600%{code_close}, %{code_open}60 minutes%{code_close}, or %{code_open}one hour%{code_close}."
+msgstr ""
+
msgid "Set the due date to %{due_date}."
msgstr ""
msgid "Set the iteration to %{iteration_reference}."
msgstr ""
+msgid "Set the maximum session time for a web terminal."
+msgstr ""
+
msgid "Set the milestone to %{milestone_reference}."
msgstr ""
+msgid "Set the per-user rate limit for notes created by web or API requests."
+msgstr ""
+
msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
msgstr ""
@@ -31184,6 +31648,9 @@ msgstr ""
msgid "Show Pipeline IID"
msgstr ""
+msgid "Show all %{issuable_type}."
+msgstr ""
+
msgid "Show all activity"
msgstr ""
@@ -31235,15 +31702,9 @@ msgstr ""
msgid "Show list"
msgstr ""
-msgid "Show me advanced features"
-msgstr ""
-
msgid "Show me how to add a pipeline"
msgstr ""
-msgid "Show me the basics"
-msgstr ""
-
msgid "Show one file at a time"
msgstr ""
@@ -31288,15 +31749,15 @@ msgstr ""
msgid "Showing %{pageSize} of %{total} %{issuableType}"
msgstr ""
-msgid "Showing %{pageSize} of %{total} issues"
-msgstr ""
-
msgid "Showing all epics"
msgstr ""
msgid "Showing all issues"
msgstr ""
+msgid "Showing data for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
+msgstr ""
+
msgid "Showing data for workflow items created in this date range. Date range cannot exceed %{maxDateRange} days."
msgstr ""
@@ -31336,6 +31797,15 @@ msgstr ""
msgid "Sidebar|Weight"
msgstr ""
+msgid "Sidekiq job compression threshold (bytes)"
+msgstr ""
+
+msgid "Sidekiq job size limit (bytes)"
+msgstr ""
+
+msgid "Sidekiq job size limits"
+msgstr ""
+
msgid "Sign in"
msgstr ""
@@ -31456,6 +31926,9 @@ msgstr ""
msgid "Site profile not found for given parameters"
msgstr ""
+msgid "Sites"
+msgstr ""
+
msgid "Size"
msgstr ""
@@ -31486,19 +31959,22 @@ msgstr ""
msgid "SlackIntegration|Sends notifications about project events to Slack channels."
msgstr ""
-msgid "SlackService|2. Paste the %{strong_open}Token%{strong_close} into the field below"
+msgid "SlackService|1. %{slash_command_link_start}Add a slash command%{slash_command_link_end} in your Slack team using this information:"
msgstr ""
-msgid "SlackService|3. Select the %{strong_open}Active%{strong_close} checkbox, press %{strong_open}Save changes%{strong_close} and start using GitLab inside Slack!"
+msgid "SlackService|2. Paste the token from Slack in the %{strong_open}Token%{strong_close} field below."
msgstr ""
-msgid "SlackService|Fill in the word that works best for your team."
+msgid "SlackService|3. Select the %{strong_open}Active%{strong_close} checkbox, select %{strong_open}Save changes%{strong_close}, and start using slash commands in Slack!"
+msgstr ""
+
+msgid "SlackService|After setup, get a list of available Slack slash commands by entering"
msgstr ""
-msgid "SlackService|See list of available commands in Slack after setting up this service, by entering"
+msgid "SlackService|Fill in the word that works best for your team."
msgstr ""
-msgid "SlackService|This service allows users to perform common operations on this project by entering slash commands in Slack."
+msgid "SlackService|Perform common operations in this project by entering slash commands in Slack."
msgstr ""
msgid "Slice multiplier"
@@ -31564,7 +32040,7 @@ msgstr ""
msgid "Some child epics may be hidden due to applied filters"
msgstr ""
-msgid "Some common domains are not allowed. %{read_more_link}."
+msgid "Some common domains are not allowed. %{learn_more_link}."
msgstr ""
msgid "Some of the designs you tried uploading did not change:"
@@ -31648,9 +32124,6 @@ msgstr ""
msgid "Something went wrong while exporting requirements"
msgstr ""
-msgid "Something went wrong while fetching %{listType} list"
-msgstr ""
-
msgid "Something went wrong while fetching branches"
msgstr ""
@@ -31705,15 +32178,9 @@ msgstr ""
msgid "Something went wrong while merging this merge request. Please try again."
msgstr ""
-msgid "Something went wrong while moving issues."
-msgstr ""
-
msgid "Something went wrong while obtaining the Let's Encrypt certificate."
msgstr ""
-msgid "Something went wrong while performing the action."
-msgstr ""
-
msgid "Something went wrong while promoting the issue to an epic. Please try again."
msgstr ""
@@ -32041,7 +32508,10 @@ msgstr ""
msgid "SourcegraphPreferences|Uses a custom %{linkStart}Sourcegraph instance%{linkEnd}."
msgstr ""
-msgid "Spam Check API Key"
+msgid "Spam Check"
+msgstr ""
+
+msgid "Spam Check API key"
msgstr ""
msgid "Spam Logs"
@@ -32059,7 +32529,7 @@ msgstr ""
msgid "Specified URL cannot be used: \"%{reason}\""
msgstr ""
-msgid "Specify an e-mail address regex pattern to identify default internal users."
+msgid "Specify an email address regex pattern to identify default internal users."
msgstr ""
msgid "Speed up your pipelines with Needs relationships"
@@ -32314,7 +32784,7 @@ msgstr ""
msgid "StatusCheck|An error occurred fetching the status checks."
msgstr ""
-msgid "StatusCheck|Apply this status check to any branch or a specific protected branch."
+msgid "StatusCheck|Apply this status check to all branches or a specific protected branch."
msgstr ""
msgid "StatusCheck|Check for a status response in Merge Requests. Failures do not block merges. %{link_start}Learn more%{link_end}."
@@ -32653,6 +33123,9 @@ msgstr ""
msgid "Subscriptions"
msgstr ""
+msgid "Subscription|Your subscription for %{strong}%{namespace_name}%{strong_close} has expired and you are now on %{pricing_link_start}the GitLab Free tier%{pricing_link_end}. Don't worry, your data is safe. Get in touch with our support team (%{support_email}). They'll gladly help with your subscription renewal."
+msgstr ""
+
msgid "Subtracted"
msgstr ""
@@ -32881,6 +33354,9 @@ msgstr ""
msgid "SuperSonics|Plan"
msgstr ""
+msgid "SuperSonics|Please agree to the Subscription Agreement"
+msgstr ""
+
msgid "SuperSonics|Ready to get started? A GitLab plan is ideal for scaling organizations and for multi team usage."
msgstr ""
@@ -32911,6 +33387,9 @@ msgstr ""
msgid "SuperSonics|The activation code is not valid. Please make sure to copy it exactly from the Customers Portal or confirmation email. Learn more about %{linkStart}activating your subscription%{linkEnd}."
msgstr ""
+msgid "SuperSonics|The activation code should be a 24-character alphanumeric string"
+msgstr ""
+
msgid "SuperSonics|There is a connectivity issue."
msgstr ""
@@ -32953,9 +33432,15 @@ msgstr ""
msgid "SuperSonics|You do not have an active subscription"
msgstr ""
+msgid "SuperSonics|You have successfully added a license that activates on %{date}. Please see the subscription history table below for more details."
+msgstr ""
+
msgid "SuperSonics|You'll be charged for %{trueUpLinkStart}users over license%{trueUpLinkEnd} on a quarterly or annual basis, depending on the terms of your agreement."
msgstr ""
+msgid "SuperSonics|Your future dated license was successfully added"
+msgstr ""
+
msgid "SuperSonics|Your subscription"
msgstr ""
@@ -33208,7 +33693,7 @@ msgstr ""
msgid "Template to append to all Service Desk issues"
msgstr ""
-msgid "TemplateRepository|Select a repository to make its templates available to all projects. %{link_start}What should the repository contain?%{link_end} "
+msgid "TemplateRepository|Create common files more quickly, and standardize their format."
msgstr ""
msgid "Templates"
@@ -33422,7 +33907,7 @@ msgstr ""
msgid "TestCases|Search test cases"
msgstr ""
-msgid "TestCases|Something went wrong while adding test case to Todo."
+msgid "TestCases|Something went wrong while adding test case to a to-do item."
msgstr ""
msgid "TestCases|Something went wrong while creating a test case."
@@ -33434,7 +33919,7 @@ msgstr ""
msgid "TestCases|Something went wrong while fetching test cases list."
msgstr ""
-msgid "TestCases|Something went wrong while marking test case todo as done."
+msgid "TestCases|Something went wrong while marking test case to-do item as done."
msgstr ""
msgid "TestCases|Something went wrong while moving test case."
@@ -33554,7 +34039,7 @@ msgstr ""
msgid "Thanks for your purchase!"
msgstr ""
-msgid "That is ok, I do not want to renew"
+msgid "That's OK, I don't want to renew"
msgstr ""
msgid "That's it, well done!"
@@ -33579,7 +34064,7 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-msgid "The API key used by GitLab for accessing the Spam Check service endpoint"
+msgid "The API key used by GitLab for accessing the Spam Check service endpoint."
msgstr ""
msgid "The GitLab subscription service (customers.gitlab.com) is currently experiencing an outage. You can monitor the status and get updates at %{linkStart}status.gitlab.com%{linkEnd}."
@@ -33618,9 +34103,6 @@ msgstr ""
msgid "The URL to use for connecting to Elasticsearch. Use a comma-separated list to support clustering (e.g., \"http://localhost:9200, http://localhost:9201\")."
msgstr ""
-msgid "The Vulnerability Report shows the results of the last successful pipeline run on the default branch."
-msgstr ""
-
msgid "The X509 Certificate to use when mutual TLS is required to communicate with the external authorization service. If left blank, the server certificate is still validated when accessing over HTTPS."
msgstr ""
@@ -33678,9 +34160,6 @@ msgstr ""
msgid "The default branch for this project has been changed. Please update your bookmarks."
msgstr ""
-msgid "The default expiration time for job artifacts. 0 for unlimited. The default unit is in seconds, but you can use other units, for example %{code_open}4 mins 2 sec%{code_close}, %{code_open}2h42min%{code_close}."
-msgstr ""
-
msgid "The dependency list details information about the components used within your project."
msgstr ""
@@ -33874,9 +34353,6 @@ msgstr ""
msgid "The merge conflicts for this merge request have already been resolved. Please return to the merge request."
msgstr ""
-msgid "The merge request can now be merged."
-msgstr ""
-
msgid "The metric must be one of %{metrics}."
msgstr ""
@@ -34252,7 +34728,7 @@ msgstr ""
msgid "There was a problem updating the keep latest artifacts setting."
msgstr ""
-msgid "There was an error %{message} todo."
+msgid "There was an error %{message} to-do item."
msgstr ""
msgid "There was an error adding a To Do."
@@ -34291,6 +34767,9 @@ msgstr ""
msgid "There was an error fetching projects"
msgstr ""
+msgid "There was an error fetching search autocomplete suggestions"
+msgstr ""
+
msgid "There was an error fetching stage total counts"
msgstr ""
@@ -34615,6 +35094,9 @@ msgstr ""
msgid "This field is required."
msgstr ""
+msgid "This form is disabled in preview"
+msgstr ""
+
msgid "This group"
msgstr ""
@@ -34636,9 +35118,6 @@ msgstr ""
msgid "This group is linked to a subscription"
msgstr ""
-msgid "This group, including all subgroups, projects and git repositories, will be reachable from only the specified IP address ranges."
-msgstr ""
-
msgid "This group, its subgroups and projects has been scheduled for removal on %{date}."
msgstr ""
@@ -34918,9 +35397,6 @@ msgstr ""
msgid "This user cannot be unlocked manually from GitLab"
msgstr ""
-msgid "This user does not have a pending request"
-msgstr ""
-
msgid "This user has an unconfirmed email address (%{email}). You may force a confirmation."
msgstr ""
@@ -35029,9 +35505,6 @@ msgstr ""
msgid "ThreatMonitoring|Packet Activity"
msgstr ""
-msgid "ThreatMonitoring|Policies"
-msgstr ""
-
msgid "ThreatMonitoring|Requests"
msgstr ""
@@ -35083,6 +35556,12 @@ msgstr ""
msgid "ThreatMonitoring|View documentation"
msgstr ""
+msgid "Threshold in bytes at which to compress Sidekiq job arguments."
+msgstr ""
+
+msgid "Threshold in bytes at which to reject Sidekiq jobs. Set this to 0 to if you don't want to limit Sidekiq jobs."
+msgstr ""
+
msgid "Throughput"
msgstr ""
@@ -35092,6 +35571,9 @@ msgstr ""
msgid "Time"
msgstr ""
+msgid "Time (in hours) that users are allowed to skip forced configuration of two-factor authentication."
+msgstr ""
+
msgid "Time Spent"
msgstr ""
@@ -35158,7 +35640,7 @@ msgstr ""
msgid "TimeTrackingEstimated|Est"
msgstr ""
-msgid "TimeTracking|%{startTag}Spent: %{endTag}%{timeSpentHumanReadable}"
+msgid "TimeTracking|%{spentStart}Spent: %{spentEnd}"
msgstr ""
msgid "TimeTracking|Estimated:"
@@ -35376,6 +35858,9 @@ msgstr ""
msgid "To access this domain create a new DNS record"
msgstr ""
+msgid "To add a custom suffix, set up a Service Desk email address. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "To add an SSH key you need to %{generate_link_start}generate one%{link_end} or use an %{existing_link_start}existing key%{link_end}."
msgstr ""
@@ -35397,13 +35882,16 @@ msgstr ""
msgid "To connect an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To continue using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
+msgstr ""
+
msgid "To continue, you need to select the link in the confirmation email we sent to verify your email address. If you didn't get our email, select %{strongStart}Resend confirmation email.%{strongEnd}"
msgstr ""
msgid "To define internal users, first enable new users set to external"
msgstr ""
-msgid "To enable Registration Features, make sure \"Enable service ping\" is checked."
+msgid "To enable Registration Features, first enable Service Ping."
msgstr ""
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
@@ -35430,7 +35918,7 @@ msgstr ""
msgid "To get started, use the link below to confirm your account."
msgstr ""
-msgid "To help improve GitLab and its user experience, GitLab will periodically collect usage information."
+msgid "To help improve GitLab and its user experience, GitLab periodically collects usage information."
msgstr ""
msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
@@ -35463,7 +35951,7 @@ msgstr ""
msgid "To preserve performance only %{strong_open}%{display_size} of %{real_size}%{strong_close} files are displayed."
msgstr ""
-msgid "To protect this issue's confidentiality, %{forkLink} and set the fork's visibility to private."
+msgid "To protect this issue's confidentiality, %{linkStart}fork this project%{linkEnd} and set the fork's visibility to private."
msgstr ""
msgid "To protect this issue's confidentiality, a private fork of this project was selected."
@@ -35496,12 +35984,15 @@ msgstr ""
msgid "To set up SAML authentication for your group through an identity provider like Azure, Okta, Onelogin, Ping Identity, or your custom SAML 2.0 provider:"
msgstr ""
-msgid "To set up this service:"
+msgid "To set up this integration:"
msgstr ""
msgid "To specify the notification level per project of a group you belong to, you need to visit project page and change notification level there."
msgstr ""
+msgid "To start using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
+msgstr ""
+
msgid "To unsubscribe from this issue, please paste the following link into your browser:"
msgstr ""
@@ -36091,9 +36582,6 @@ msgstr ""
msgid "Unable to fetch branches list, please close the form and try again"
msgstr ""
-msgid "Unable to fetch unscanned projects"
-msgstr ""
-
msgid "Unable to fetch vulnerable projects"
msgstr ""
@@ -36148,6 +36636,15 @@ msgstr ""
msgid "Unable to update this issue at this time."
msgstr ""
+msgid "Unapprove a merge request"
+msgstr ""
+
+msgid "Unapprove the current merge request."
+msgstr ""
+
+msgid "Unapproved the current merge request."
+msgstr ""
+
msgid "Unarchive project"
msgstr ""
@@ -36160,16 +36657,13 @@ msgstr ""
msgid "Unassigned"
msgstr ""
-msgid "Unauthenticated API request rate limit"
-msgstr ""
-
-msgid "Unauthenticated rate limit period in seconds"
+msgid "Unauthenticated API rate limit period in seconds"
msgstr ""
-msgid "Unauthenticated request rate limit"
+msgid "Unauthenticated requests"
msgstr ""
-msgid "Unauthenticated requests"
+msgid "Unauthenticated web rate limit period in seconds"
msgstr ""
msgid "Undo"
@@ -36271,18 +36765,6 @@ msgstr ""
msgid "Unresolved"
msgstr ""
-msgid "UnscannedProjects|15 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|30 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|5 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|60 or more days"
-msgstr ""
-
msgid "Unschedule job"
msgstr ""
@@ -36502,6 +36984,9 @@ msgstr ""
msgid "UsageQuota|%{help_link_start}Shared runners%{help_link_end} are disabled, so there are no limits set on pipeline usage"
msgstr ""
+msgid "UsageQuota|%{linkTitle} help link"
+msgstr ""
+
msgid "UsageQuota|%{percentageLeft} of purchased storage is available"
msgstr ""
@@ -36511,6 +36996,9 @@ msgstr ""
msgid "UsageQuota|Artifacts is a sum of build and pipeline artifacts."
msgstr ""
+msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
+msgstr ""
+
msgid "UsageQuota|Buy additional minutes"
msgstr ""
@@ -36520,9 +37008,21 @@ msgstr ""
msgid "UsageQuota|CI minutes usage by project"
msgstr ""
+msgid "UsageQuota|Code packages and container images."
+msgstr ""
+
msgid "UsageQuota|Current period usage"
msgstr ""
+msgid "UsageQuota|File attachments and smaller design graphics."
+msgstr ""
+
+msgid "UsageQuota|Git repository, managed by the Gitaly service."
+msgstr ""
+
+msgid "UsageQuota|Includes project registry, artifacts, packages, wiki, uploads and other items."
+msgstr ""
+
msgid "UsageQuota|Increase storage temporarily"
msgstr ""
@@ -36541,6 +37041,9 @@ msgstr ""
msgid "UsageQuota|Packages"
msgstr ""
+msgid "UsageQuota|Pipeline artifacts and job artifacts, created with CI/CD."
+msgstr ""
+
msgid "UsageQuota|Pipelines"
msgstr ""
@@ -36559,6 +37062,9 @@ msgstr ""
msgid "UsageQuota|Seats"
msgstr ""
+msgid "UsageQuota|Shared bits of code and text."
+msgstr ""
+
msgid "UsageQuota|Snippets"
msgstr ""
@@ -36568,6 +37074,12 @@ msgstr ""
msgid "UsageQuota|Storage"
msgstr ""
+msgid "UsageQuota|Storage type"
+msgstr ""
+
+msgid "UsageQuota|There is a known issue with Artifact storage where the total could be incorrect for some projects. More details and progress are available in %{warningLinkStart}the epic%{warningLinkEnd}."
+msgstr ""
+
msgid "UsageQuota|This is the total amount of storage used across your projects within this namespace."
msgstr ""
@@ -36607,6 +37119,9 @@ msgstr ""
msgid "UsageQuota|Usage"
msgstr ""
+msgid "UsageQuota|Usage Breakdown"
+msgstr ""
+
msgid "UsageQuota|Usage Quotas"
msgstr ""
@@ -36631,6 +37146,9 @@ msgstr ""
msgid "UsageQuota|Wiki"
msgstr ""
+msgid "UsageQuota|Wiki content."
+msgstr ""
+
msgid "UsageQuota|Wikis"
msgstr ""
@@ -36847,7 +37365,10 @@ msgstr ""
msgid "User Settings"
msgstr ""
-msgid "User and IP Rate Limits"
+msgid "User and IP rate limits"
+msgstr ""
+
+msgid "User does not have a pending request"
msgstr ""
msgid "User identity was successfully created."
@@ -37144,6 +37665,9 @@ msgstr ""
msgid "Users can launch a development environment from a GitLab browser tab when the %{linkStart}Gitpod%{linkEnd} integration is enabled."
msgstr ""
+msgid "Users can reactivate their account by signing in."
+msgstr ""
+
msgid "Users can render diagrams in AsciiDoc, Markdown, reStructuredText, and Textile documents using Kroki."
msgstr ""
@@ -37159,6 +37683,9 @@ msgstr ""
msgid "Users requesting access to"
msgstr ""
+msgid "Users to exclude from the rate limit"
+msgstr ""
+
msgid "Users were successfully added."
msgstr ""
@@ -37180,6 +37707,9 @@ msgstr ""
msgid "UsersSelect|Unassigned"
msgstr ""
+msgid "Uses GitLab as a lightweight alternative to Sentry."
+msgstr ""
+
msgid "Using %{code_start}::%{code_end} denotes a %{link_start}scoped label set%{link_end}"
msgstr ""
@@ -37210,10 +37740,7 @@ msgstr ""
msgid "Value Stream Analytics can help you determine your team’s velocity"
msgstr ""
-msgid "Value Stream Analytics gives an overview of how much time it takes to go from idea to production in your project."
-msgstr ""
-
-msgid "Value may contain a variable reference"
+msgid "Value might contain a variable reference"
msgstr ""
msgid "Value stream"
@@ -37279,10 +37806,10 @@ msgstr ""
msgid "ValueStream|The Default Value Stream cannot be deleted"
msgstr ""
-msgid "Variable"
+msgid "Values that contain the %{codeStart}$%{codeEnd} character can be considered a variable reference and expanded. %{docsLinkStart}Learn more.%{docsLinkEnd}"
msgstr ""
-msgid "Variable references indicated by %{codeStart}$%{codeEnd} may be expanded. If this is not what you want, consider %{docsLinkStart}using a workaround to prevent expansion%{docsLinkEnd}."
+msgid "Variable"
msgstr ""
msgid "Variable will be masked in job logs."
@@ -37693,6 +38220,9 @@ msgstr ""
msgid "Vulnerability|Evidence"
msgstr ""
+msgid "Vulnerability|False positive detected"
+msgstr ""
+
msgid "Vulnerability|File"
msgstr ""
@@ -37735,6 +38265,9 @@ msgstr ""
msgid "Vulnerability|Status"
msgstr ""
+msgid "Vulnerability|The scanner determined this vulnerability to be a false positive. Verify the evaluation before changing its status. %{linkStart}Learn more about false positive detection.%{linkEnd}"
+msgstr ""
+
msgid "Vulnerability|The unmodified response is the original response that had no mutations done to the request"
msgstr ""
@@ -38059,9 +38592,6 @@ msgstr ""
msgid "Welcome to GitLab,%{br_tag}%{name}!"
msgstr ""
-msgid "Welcome to the guided GitLab tour"
-msgstr ""
-
msgid "Welcome, %{name}!"
msgstr ""
@@ -38080,9 +38610,6 @@ msgstr ""
msgid "What are you searching for?"
msgstr ""
-msgid "What describes you best?"
-msgstr ""
-
msgid "What does this command do?"
msgstr ""
@@ -38104,13 +38631,13 @@ msgstr ""
msgid "What is your job title? (optional)"
msgstr ""
-msgid "What will you use this group for?"
+msgid "What templates can I create?"
msgstr ""
-msgid "What's new"
+msgid "What will you use this group for?"
msgstr ""
-msgid "What’s your experience level?"
+msgid "What's new"
msgstr ""
msgid "When a deployment job is successful, skip older deployment jobs that are still pending."
@@ -38122,6 +38649,9 @@ msgstr ""
msgid "When an event in GitLab triggers a webhook, you can use the request details to figure out if something went wrong."
msgstr ""
+msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+msgstr ""
+
msgid "When inactive, an external authentication provider must be used."
msgstr ""
@@ -38147,6 +38677,9 @@ msgstr ""
msgid "When:"
msgstr ""
+msgid "Which API requests are affected?"
+msgstr ""
+
msgid "While it's rare to have no vulnerabilities, it can happen. In any event, we ask that you please double check your settings to make sure you've set up your dashboard correctly."
msgstr ""
@@ -38426,6 +38959,9 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|Work Items"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -38501,6 +39037,9 @@ msgstr ""
msgid "You are already a member of this %{member_source}."
msgstr ""
+msgid "You are already impersonating another user"
+msgstr ""
+
msgid "You are an admin, which means granting access to %{client_name} will allow them to interact with GitLab as an admin as well. Proceed with caution."
msgstr ""
@@ -38603,6 +39142,9 @@ msgstr ""
msgid "You can also use project access tokens with Git to authenticate over HTTP(S). %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "You can always change your URL later"
+msgstr ""
+
msgid "You can always edit this later"
msgstr ""
@@ -38759,10 +39301,10 @@ msgstr ""
msgid "You can’t %{tag_start}edit%{tag_end} files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
-msgid "You could not create a new trigger."
+msgid "You can’t edit files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
-msgid "You didn't renew your subscription for %{strong}%{namespace_name}%{strong_close} so it was downgraded to the free plan."
+msgid "You could not create a new trigger."
msgstr ""
msgid "You do not have any subscriptions yet"
@@ -38930,6 +39472,12 @@ msgstr ""
msgid "You must provide your current password in order to change it."
msgstr ""
+msgid "You must sign in to search for specific projects."
+msgstr ""
+
+msgid "You must sign in to search for specific terms."
+msgstr ""
+
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
@@ -38957,6 +39505,9 @@ msgstr ""
msgid "You need to upload a GitLab project export archive (ending in .gz)."
msgstr ""
+msgid "You need to verify your primary email first before enabling Two-Factor Authentication."
+msgstr ""
+
msgid "You successfully declined the invitation"
msgstr ""
@@ -39065,10 +39616,10 @@ msgstr ""
msgid "Your %{host} account was signed in to from a new location"
msgstr ""
-msgid "Your %{strong}%{plan_name}%{strong_close} subscription for %{strong}%{namespace_name}%{strong_close} will expire on %{strong}%{expires_on}%{strong_close}."
+msgid "Your %{strong}%{plan_name}%{strong_close} subscription expires on %{strong}%{expires_on}%{strong_close}. After that date, you cannot create issues or merge requests, or use many other features."
msgstr ""
-msgid "Your %{strong}%{plan_name}%{strong_close} subscription will expire on %{strong}%{expires_on}%{strong_close}. After that, you will not be able to create issues or merge requests as well as many other features."
+msgid "Your %{strong}%{plan_name}%{strong_close} subscription for %{strong}%{namespace_name}%{strong_close} will expire on %{strong}%{expires_on}%{strong_close}."
msgstr ""
msgid "Your CI/CD configuration syntax is invalid. View Lint tab for more details."
@@ -39092,7 +39643,7 @@ msgstr ""
msgid "Your GPG keys (%{count})"
msgstr ""
-msgid "Your GitLab account has been locked due to an excessive amount of unsuccessful sign in attempts. Your account will automatically unlock in %{duration} or you may click the link below to unlock now."
+msgid "Your GitLab account has been locked due to an excessive number of unsuccessful sign in attempts. You can wait for your account to automatically unlock in %{duration} or you can click the link below to unlock now."
msgstr ""
msgid "Your GitLab account request has been approved!"
@@ -39203,6 +39754,9 @@ msgstr ""
msgid "Your commit email is used for web based operations, such as edits and merges."
msgstr ""
+msgid "Your current password is required to register a two-factor authenticator app."
+msgstr ""
+
msgid "Your dashboard has been copied. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
@@ -39302,6 +39856,9 @@ msgstr ""
msgid "Your project limit is %{limit} projects! Please contact your administrator to increase it"
msgstr ""
+msgid "Your project will be created at:"
+msgstr ""
+
msgid "Your projects"
msgstr ""
@@ -39341,11 +39898,12 @@ msgstr ""
msgid "Your subscription expired!"
msgstr ""
-msgid "Your subscription has been downgraded."
-msgstr ""
-
-msgid "Your subscription will expire in %{remaining_days}."
-msgstr ""
+msgid "Your subscription will expire in %{remaining_days} day."
+msgid_plural "Your subscription will expire in %{remaining_days} days."
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
msgid "Your username is %{username}."
msgstr ""
@@ -39556,6 +40114,9 @@ msgstr ""
msgid "cannot merge"
msgstr ""
+msgid "cannot not be used for user namespace"
+msgstr ""
+
msgid "ciReport|%{degradedNum} degraded"
msgstr ""
@@ -39881,6 +40442,9 @@ msgstr ""
msgid "created %{timeAgo}"
msgstr ""
+msgid "created %{timeAgo} by %{author}"
+msgstr ""
+
msgid "created by"
msgstr ""
@@ -39927,9 +40491,6 @@ msgstr ""
msgid "does not have a supported extension. Only %{extension_list} are supported"
msgstr ""
-msgid "domain is not authorized for sign-up."
-msgstr ""
-
msgid "download it"
msgstr ""
@@ -39949,20 +40510,13 @@ msgstr ""
msgid "email '%{email}' is not a verified email."
msgstr ""
-msgid "email does not match the allowed domain of %{email_domains}"
-msgid_plural "email does not match the allowed domains: %{email_domains}"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
-
msgid "enabled"
msgstr ""
msgid "encrypted: needs to be a :required, :optional or :migrating!"
msgstr ""
-msgid "ending with MIME type format is not allowed."
+msgid "ending with a reserved file extension is not allowed."
msgstr ""
msgid "entries cannot be larger than 255 characters"
@@ -39986,6 +40540,9 @@ msgstr ""
msgid "estimateCommand|%{slash_command} overwrites the total estimated time."
msgstr ""
+msgid "example.com"
+msgstr ""
+
msgid "exceeds the limit of %{bytes} bytes"
msgstr ""
@@ -40038,9 +40595,6 @@ msgstr ""
msgid "fork"
msgstr ""
-msgid "fork this project"
-msgstr ""
-
msgid "from"
msgstr ""
@@ -40051,6 +40605,9 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "frontmatter"
+msgstr ""
+
msgid "group"
msgstr ""
@@ -40078,6 +40635,9 @@ msgstr ""
msgid "has been completed."
msgstr ""
+msgid "has too deep level of nesting"
+msgstr ""
+
msgid "help"
msgstr ""
@@ -40111,9 +40671,21 @@ msgstr ""
msgid "in"
msgstr ""
+msgid "in Infrastructure :: Kubernetes clusters"
+msgstr ""
+
+msgid "in all GitLab"
+msgstr ""
+
+msgid "in group"
+msgstr ""
+
msgid "in group %{link_to_group}"
msgstr ""
+msgid "in project"
+msgstr ""
+
msgid "in project %{link_to_project}"
msgstr ""
@@ -40157,16 +40729,19 @@ msgstr ""
msgid "is not a valid X509 certificate."
msgstr ""
-msgid "is not allowed since the group is not top-level group."
+msgid "is not allowed for sign-up."
msgstr ""
-msgid "is not allowed. Try again with a different email address, or contact your GitLab admin."
+msgid "is not allowed for this group."
msgstr ""
-msgid "is not allowed. We do not currently support project-level iterations"
+msgid "is not allowed for this project."
msgstr ""
-msgid "is not from an allowed domain."
+msgid "is not allowed since the group is not top-level group."
+msgstr ""
+
+msgid "is not allowed. We do not currently support project-level iterations"
msgstr ""
msgid "is not in the group enforcing Group Managed Account"
@@ -40259,6 +40834,9 @@ msgstr ""
msgid "log in"
msgstr ""
+msgid "managed"
+msgstr ""
+
msgid "manual"
msgstr ""
@@ -40308,6 +40886,9 @@ msgstr ""
msgid "mrWidget| Please restore it or use a different %{missingBranchName} branch"
msgstr ""
+msgid "mrWidget|%{linkStart}Set up now%{linkEnd} to analyze your source code for known security vulnerabilities."
+msgstr ""
+
msgid "mrWidget|%{mergeError}."
msgstr ""
@@ -40390,6 +40971,9 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "mrWidget|Create issue to resolve all threads"
+msgstr ""
+
msgid "mrWidget|Delete source branch"
msgstr ""
@@ -40399,12 +40983,18 @@ msgstr ""
msgid "mrWidget|Did not close"
msgstr ""
+msgid "mrWidget|Dismiss"
+msgstr ""
+
msgid "mrWidget|Email patches"
msgstr ""
msgid "mrWidget|Failed to load deployment statistics"
msgstr ""
+msgid "mrWidget|Hide %{widget} details"
+msgstr ""
+
msgid "mrWidget|If the %{missingBranchName} branch exists in your local repository, you can merge this merge request manually using the command line"
msgstr ""
@@ -40502,9 +41092,6 @@ msgstr ""
msgid "mrWidget|Request to merge"
msgstr ""
-msgid "mrWidget|Resolve all threads in new issue"
-msgstr ""
-
msgid "mrWidget|Resolve conflicts"
msgstr ""
@@ -40520,6 +41107,9 @@ msgstr ""
msgid "mrWidget|Revoke approval"
msgstr ""
+msgid "mrWidget|SAST and Secret Detection is not enabled."
+msgstr ""
+
msgid "mrWidget|Set by %{merge_author} to be added to the merge train when the pipeline succeeds"
msgstr ""
@@ -40529,6 +41119,9 @@ msgstr ""
msgid "mrWidget|Set by %{merge_author} to start a merge train when the pipeline succeeds"
msgstr ""
+msgid "mrWidget|Show %{widget} details"
+msgstr ""
+
msgid "mrWidget|The changes were merged into"
msgstr ""
@@ -40541,6 +41134,9 @@ msgstr ""
msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure, or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
msgstr ""
+msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure."
+msgstr ""
+
msgid "mrWidget|The source branch has been deleted"
msgstr ""
@@ -40583,6 +41179,9 @@ msgstr ""
msgid "mrWidget|You can merge after removing denied licenses"
msgstr ""
+msgid "mrWidget|You can only merge once this merge request is approved."
+msgstr ""
+
msgid "mrWidget|Your password"
msgstr ""
@@ -40619,6 +41218,9 @@ msgstr ""
msgid "must be less than the limit of %{tag_limit} tags"
msgstr ""
+msgid "must be set for a project namespace"
+msgstr ""
+
msgid "must be unique by status and elapsed time within a policy"
msgstr ""
@@ -40732,6 +41334,9 @@ msgstr ""
msgid "pipeline"
msgstr ""
+msgid "pipeline schedules documentation"
+msgstr ""
+
msgid "pod_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
msgstr ""
@@ -40785,16 +41390,25 @@ msgstr ""
msgid "project name"
msgstr ""
+msgid "project namespace cannot be the parent of another namespace"
+msgstr ""
+
msgid "projects"
msgstr ""
msgid "quick actions"
msgstr ""
-msgid "reCAPTCHA Private Key"
+msgid "reCAPTCHA"
+msgstr ""
+
+msgid "reCAPTCHA helps prevent credential stuffing."
msgstr ""
-msgid "reCAPTCHA Site Key"
+msgid "reCAPTCHA private key"
+msgstr ""
+
+msgid "reCAPTCHA site key"
msgstr ""
msgid "recent activity"
@@ -41023,6 +41637,9 @@ msgstr ""
msgid "user avatar"
msgstr ""
+msgid "user namespace cannot be the parent of another namespace"
+msgstr ""
+
msgid "user preferences"
msgstr ""
@@ -41117,3 +41734,9 @@ msgstr ""
msgid "your settings"
msgstr ""
+msgid "{group}"
+msgstr ""
+
+msgid "{project}"
+msgstr ""
+
diff --git a/locale/sl_SI/gitlab.po b/locale/sl_SI/gitlab.po
index 1c0a3428157..23307046d0e 100644
--- a/locale/sl_SI/gitlab.po
+++ b/locale/sl_SI/gitlab.po
@@ -14,10 +14,7 @@ msgstr ""
"X-Crowdin-Language: sl\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-09-01 22:34\n"
-
-msgid " %{name}, confirm your email address now! "
-msgstr ""
+"PO-Revision-Date: 2021-10-04 20:24\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -96,6 +93,20 @@ msgstr ""
msgid "#general, #development"
msgstr ""
+msgid "%d Alert"
+msgid_plural "%d Alerts"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
+msgid "%d Alert:"
+msgid_plural "%d Alerts:"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "%d Approval"
msgid_plural "%d Approvals"
msgstr[0] ""
@@ -591,7 +602,10 @@ msgstr ""
msgid "%{code_open}Protected:%{code_close} Only exposed to protected branches or tags."
msgstr ""
-msgid "%{commit_author_link} authored %{commit_timeago}"
+msgid "%{commit_author_link} authored %{commit_authored_timeago}"
+msgstr ""
+
+msgid "%{commit_author_link} authored %{commit_authored_timeago} and %{commit_committer_avatar} %{commit_committer_link} committed %{commit_committer_timeago}"
msgstr ""
msgid "%{completedCount} completed weight"
@@ -695,6 +709,15 @@ msgstr ""
msgid "%{doc_link_start}Advanced search%{doc_link_end} is enabled."
msgstr ""
+msgid "%{docs_link_start}Learn about visibility levels.%{docs_link_end}"
+msgstr ""
+
+msgid "%{docs_link_start}What is Large File Storage?%{docs_link_end}"
+msgstr ""
+
+msgid "%{docs_link_start}What is two-factor authentication?%{docs_link_end}"
+msgstr ""
+
msgid "%{due_date} (Past due)"
msgstr ""
@@ -767,9 +790,6 @@ msgstr ""
msgid "%{issueType} actions"
msgstr ""
-msgid "%{issuesCount} issues with a limit of %{maxIssueCount}"
-msgstr ""
-
msgid "%{issuesSize} with a limit of %{maxIssueCount}"
msgstr ""
@@ -827,6 +847,12 @@ msgstr ""
msgid "%{label_for_message} unavailable"
msgstr ""
+msgid "%{learn_more_link}."
+msgstr ""
+
+msgid "%{lessThan} 1 hour"
+msgstr ""
+
msgid "%{lets_encrypt_link_start}Let's Encrypt%{lets_encrypt_link_end} is a free, automated, and open certificate authority (CA) that issues digital certificates to enable HTTPS (SSL/TLS) for sites."
msgstr ""
@@ -839,15 +865,15 @@ msgstr ""
msgid "%{link_start}Learn more%{link_end} about roles."
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
-msgstr ""
-
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
msgstr ""
msgid "%{link_start}Start the title with %{draft_snippet}%{link_end} to prevent a merge request that is a work in progress from being merged before it's ready."
msgstr ""
+msgid "%{link_start}What information does GitLab Inc. collect?%{link_end}"
+msgstr ""
+
msgid "%{listToShow}, and %{awardsListLength} more"
msgstr ""
@@ -1008,7 +1034,7 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-msgid "%{service_ping_link_start}Learn more%{service_ping_link_end} about what information is shared with GitLab Inc."
+msgid "%{service_ping_link_start}What information is shared with GitLab Inc.?%{service_ping_link_end}"
msgstr ""
msgid "%{size} %{unit}"
@@ -1044,6 +1070,9 @@ msgstr ""
msgid "%{state} epics"
msgstr ""
+msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
+msgstr ""
+
msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
msgstr ""
@@ -1117,13 +1146,6 @@ msgstr ""
msgid "%{template_project_id} is unknown or invalid"
msgstr ""
-msgid "%{text} %{files}"
-msgid_plural "%{text} %{files} files"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
-
msgid "%{text} is available"
msgstr ""
@@ -1208,9 +1230,6 @@ msgstr ""
msgid "%{wildcards_link_start}Wildcards%{wildcards_link_end} such as %{code_tag_start}v*%{code_tag_end} or %{code_tag_start}*-release%{code_tag_end} are supported."
msgstr ""
-msgid "&lt; 1 hour"
-msgstr ""
-
msgid "'%{data}' at %{location} does not match format: %{format}"
msgstr ""
@@ -1296,9 +1315,6 @@ msgstr ""
msgid "(we need your current password to confirm your changes)"
msgstr ""
-msgid "* * * * *"
-msgstr ""
-
msgid "+ %{amount} more"
msgstr ""
@@ -1371,10 +1387,10 @@ msgstr ""
msgid "."
msgstr ""
-msgid "0 bytes"
+msgid "/"
msgstr ""
-msgid "0 for unlimited, only effective with remote storage enabled."
+msgid "0 bytes"
msgstr ""
msgid "0t1DgySidms"
@@ -1550,6 +1566,9 @@ msgstr ""
msgid "1000+"
msgstr ""
+msgid "192.168.0.0/24"
+msgstr ""
+
msgid "1st contribution!"
msgstr ""
@@ -1703,9 +1722,6 @@ msgstr ""
msgid "A plain HTML site that uses Netlify for CI/CD instead of GitLab, but still with all the other great GitLab features"
msgstr ""
-msgid "A plain-text response to show to clients that hit the rate limit."
-msgstr ""
-
msgid "A platform value can be web, mob or app."
msgstr ""
@@ -1787,7 +1803,7 @@ msgstr ""
msgid "APIFuzzing|Configure HTTP basic authentication values. Other authentication methods are supported. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
+msgid "APIFuzzing|Customize your project's API fuzzing configuration options and copy the code snippet to your .gitlab-ci.yml file to apply any changes. Note that this tool does not reflect or update your .gitlab-ci.yml file automatically. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
msgstr ""
msgid "APIFuzzing|Enable authentication"
@@ -1850,9 +1866,6 @@ msgstr ""
msgid "APIFuzzing|To prevent a security leak, authentication info must be added as a %{ciVariablesLinkStart}CI variable%{ciVariablesLinkEnd}. As a user with maintainer access rights, you can manage CI variables in the %{ciSettingsLinkStart}Settings%{ciSettingsLinkEnd} area."
msgstr ""
-msgid "APIFuzzing|Use this tool to generate API fuzzing configuration YAML to copy into your .gitlab-ci.yml file. This tool does not reflect or update your .gitlab-ci.yml file automatically."
-msgstr ""
-
msgid "APIFuzzing|Username for basic authentication"
msgstr ""
@@ -1904,9 +1917,6 @@ msgstr ""
msgid "Abuse reports notification email"
msgstr ""
-msgid "Abuse reports will be sent to this address if it is set. Abuse reports are always available in the admin area."
-msgstr ""
-
msgid "Accept invitation"
msgstr ""
@@ -1943,12 +1953,18 @@ msgstr ""
msgid "Access granted"
msgstr ""
+msgid "Access key ID"
+msgstr ""
+
msgid "Access requests"
msgstr ""
msgid "Access to '%{classification_label}' not allowed"
msgstr ""
+msgid "Access tokens expire after 2 hours. A refresh token may be used at any time to generate a new access token. Non-expiring access tokens are deprecated. Clear this setting to enable backward compatibility."
+msgstr ""
+
msgid "AccessDropdown|Deploy Keys"
msgstr ""
@@ -2261,6 +2277,9 @@ msgstr ""
msgid "Add new directory"
msgstr ""
+msgid "Add new service account"
+msgstr ""
+
msgid "Add or remove previously merged commits"
msgstr ""
@@ -2498,6 +2517,9 @@ msgstr ""
msgid "AdminArea|Features"
msgstr ""
+msgid "AdminArea|Get security updates from GitLab and stay up to date"
+msgstr ""
+
msgid "AdminArea|Groups"
msgstr ""
@@ -2537,6 +2559,12 @@ msgstr ""
msgid "AdminArea|Reporter"
msgstr ""
+msgid "AdminArea|Sign up for the GitLab Security Newsletter to get notified for security updates."
+msgstr ""
+
+msgid "AdminArea|Sign up for the GitLab newsletter"
+msgstr ""
+
msgid "AdminArea|Stop all jobs"
msgstr ""
@@ -2606,9 +2634,15 @@ msgstr ""
msgid "AdminSettings|Disable public access to Pages sites"
msgstr ""
+msgid "AdminSettings|Display a banner on merge requests in projects with no pipelines to initiate steps to add a .gitlab-ci.yml file."
+msgstr ""
+
msgid "AdminSettings|Domain verification is an essential security measure for public GitLab sites. Users are required to demonstrate they control a domain before it is enabled. %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "AdminSettings|Enable pipeline suggestion banner"
+msgstr ""
+
msgid "AdminSettings|Enable shared runners for new projects"
msgstr ""
@@ -3080,10 +3114,10 @@ msgstr ""
msgid "Admin|Quarterly reconciliation will occur on %{qrtlyDate}"
msgstr ""
-msgid "Admin|The number of max seats used for your namespace is currently exceeding the number of seats in your subscription. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgid "Admin|The number of max seats in your namespace exceeds the number of seats in your subscription. On %{qrtlyDate}, quarterly reconciliation occurs and you are automatically billed a prorated amount for the overage. No action is needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice. For more information about the timing of the invoicing process, view the documentation."
msgstr ""
-msgid "Admin|The number of maximum users for your instance is currently exceeding the number of users in license. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgid "Admin|The number of max users in your instance exceeds the number of users in your license. On %{qrtlyDate}, quarterly reconciliation occurs and you are automatically billed a prorated amount for the overage. No action is needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice. For more information about the timing of the invoicing process, view the documentation."
msgstr ""
msgid "Admin|View pending user approvals"
@@ -3104,9 +3138,6 @@ msgstr ""
msgid "Advanced export options"
msgstr ""
-msgid "Advanced permissions, Large File Storage and Two-Factor authentication settings."
-msgstr ""
-
msgid "After a successful password update you will be redirected to login screen."
msgstr ""
@@ -3125,15 +3156,14 @@ msgstr ""
msgid "After you've reviewed these contribution guidelines, you'll be all set to"
msgstr ""
+msgid "Akismet"
+msgstr ""
+
msgid "Akismet API Key"
msgstr ""
-msgid "Alert"
-msgid_plural "Alerts"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
+msgid "Akismet helps prevent the creation of spam issues in public projects."
+msgstr ""
msgid "AlertManagement|Acknowledged"
msgstr ""
@@ -3489,6 +3519,9 @@ msgstr ""
msgid "All (default)"
msgstr ""
+msgid "All GitLab"
+msgstr ""
+
msgid "All Members"
msgstr ""
@@ -3603,6 +3636,9 @@ msgstr ""
msgid "Allow this secondary node to replicate content on Object Storage"
msgstr ""
+msgid "Allow use of licensed EE features"
+msgstr ""
+
msgid "Allow users to dismiss the broadcast message"
msgstr ""
@@ -3678,9 +3714,6 @@ msgstr ""
msgid "Amazon authentication is not %{link_start}correctly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
-msgid "Amount of time (in hours) that users are allowed to skip forced configuration of two-factor authentication"
-msgstr ""
-
msgid "An %{link_start}alert%{link_end} with the same fingerprint is already open. To change the status of this alert, resolve the linked alert."
msgstr ""
@@ -3741,12 +3774,6 @@ msgstr ""
msgid "An error occurred when removing the label."
msgstr ""
-msgid "An error occurred when toggling the notification subscription"
-msgstr ""
-
-msgid "An error occurred when updating the issue weight"
-msgstr ""
-
msgid "An error occurred when updating the title"
msgstr ""
@@ -3795,6 +3822,9 @@ msgstr ""
msgid "An error occurred while enabling Service Desk."
msgstr ""
+msgid "An error occurred while fetching Markdown preview"
+msgstr ""
+
msgid "An error occurred while fetching ancestors"
msgstr ""
@@ -3825,9 +3855,6 @@ msgstr ""
msgid "An error occurred while fetching label colors."
msgstr ""
-msgid "An error occurred while fetching markdown preview"
-msgstr ""
-
msgid "An error occurred while fetching participants"
msgstr ""
@@ -3843,9 +3870,6 @@ msgstr ""
msgid "An error occurred while fetching reference"
msgstr ""
-msgid "An error occurred while fetching sidebar data"
-msgstr ""
-
msgid "An error occurred while fetching tags. Retry the search."
msgstr ""
@@ -3921,6 +3945,9 @@ msgstr ""
msgid "An error occurred while loading merge requests."
msgstr ""
+msgid "An error occurred while loading projects."
+msgstr ""
+
msgid "An error occurred while loading the Needs tab."
msgstr ""
@@ -4155,12 +4182,6 @@ msgstr ""
msgid "Any Milestone"
msgstr ""
-msgid "Any branch"
-msgstr ""
-
-msgid "Any eligible user"
-msgstr ""
-
msgid "Any encrypted tokens"
msgstr ""
@@ -4179,6 +4200,9 @@ msgstr ""
msgid "Any namespace"
msgstr ""
+msgid "App Engine description and apps that are suitable for this deployment target"
+msgstr ""
+
msgid "App ID"
msgstr ""
@@ -4331,6 +4355,13 @@ msgstr ""
msgid "Apply"
msgstr ""
+msgid "Apply %d suggestion"
+msgid_plural "Apply %d suggestions"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "Apply a label"
msgstr ""
@@ -4340,13 +4371,10 @@ msgstr ""
msgid "Apply suggestion"
msgstr ""
-msgid "Apply suggestions"
-msgstr ""
-
msgid "Apply template"
msgstr ""
-msgid "Apply this approval rule to any branch or a specific protected branch."
+msgid "Apply this approval rule to all branches or a specific protected branch."
msgstr ""
msgid "Applying"
@@ -4497,9 +4525,6 @@ msgstr ""
msgid "ApprovalSettings|Prevent editing approval rules in projects and merge requests."
msgstr ""
-msgid "ApprovalSettings|Prevent editing approval rules in projects and merge requests. "
-msgstr ""
-
msgid "ApprovalSettings|Remove all approvals when commits are added to the source branch."
msgstr ""
@@ -4515,6 +4540,9 @@ msgstr ""
msgid "ApprovalSettings|This setting is configured at the instance level and can only be changed by an administrator."
msgstr ""
+msgid "ApprovalSettings|This setting is configured in %{groupName} and can only be changed by an administrator or group owner."
+msgstr ""
+
msgid "ApprovalStatusTooltip|Adheres to separation of duties"
msgstr ""
@@ -5007,9 +5035,6 @@ msgstr ""
msgid "Authenticated API rate limit period in seconds"
msgstr ""
-msgid "Authenticated API request rate limit"
-msgstr ""
-
msgid "Authenticated API requests"
msgstr ""
@@ -5019,10 +5044,10 @@ msgstr ""
msgid "Authenticated Git LFS request rate limit"
msgstr ""
-msgid "Authenticated web rate limit period in seconds"
+msgid "Authenticated Git LFS requests"
msgstr ""
-msgid "Authenticated web request rate limit"
+msgid "Authenticated web rate limit period in seconds"
msgstr ""
msgid "Authenticated web requests"
@@ -5400,9 +5425,6 @@ msgstr ""
msgid "Below you will find all the groups that are public."
msgstr ""
-msgid "Beta"
-msgstr ""
-
msgid "Bi-weekly code coverage"
msgstr ""
@@ -5644,6 +5666,21 @@ msgstr ""
msgid "Board scope affects which issues are displayed for anyone who visits this board"
msgstr ""
+msgid "BoardNewEpic|Groups"
+msgstr ""
+
+msgid "BoardNewEpic|Loading groups"
+msgstr ""
+
+msgid "BoardNewEpic|No matching results"
+msgstr ""
+
+msgid "BoardNewEpic|Search groups"
+msgstr ""
+
+msgid "BoardNewEpic|Select a group"
+msgstr ""
+
msgid "BoardNewIssue|No matching results"
msgstr ""
@@ -5723,6 +5760,9 @@ msgstr ""
msgid "Boards|An error occurred while creating the list. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching child groups. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching group projects. Please try again."
msgstr ""
@@ -6057,6 +6097,9 @@ msgstr ""
msgid "Bulk update"
msgstr ""
+msgid "BulkImports|Re-import creates a new group. It does not sync with the existing group."
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -6066,6 +6109,9 @@ msgstr ""
msgid "BulkImport|From source group"
msgstr ""
+msgid "BulkImport|Group import history"
+msgstr ""
+
msgid "BulkImport|Import failed: Destination cannot be a subgroup of the source group. Change the destination and try again."
msgstr ""
@@ -6078,9 +6124,18 @@ msgstr ""
msgid "BulkImport|Importing the group failed"
msgstr ""
+msgid "BulkImport|Last imported to %{link}"
+msgstr ""
+
msgid "BulkImport|Name already exists."
msgstr ""
+msgid "BulkImport|New group"
+msgstr ""
+
+msgid "BulkImport|No history is available"
+msgstr ""
+
msgid "BulkImport|No parent"
msgstr ""
@@ -6093,6 +6148,9 @@ msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} matching filter \"%{filter}\" from %{link}"
msgstr ""
+msgid "BulkImport|Source group"
+msgstr ""
+
msgid "BulkImport|To new group"
msgstr ""
@@ -6102,6 +6160,9 @@ msgstr ""
msgid "BulkImport|You have no groups to import"
msgstr ""
+msgid "BulkImport|Your imported groups will appear here."
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -6346,6 +6407,9 @@ msgstr ""
msgid "Can be manually deployed to"
msgstr ""
+msgid "Can be overridden in each project."
+msgstr ""
+
msgid "Can create groups:"
msgstr ""
@@ -6448,6 +6512,9 @@ msgstr ""
msgid "Cancelling Preview"
msgstr ""
+msgid "Cannot assign a confidential epic to a non-confidential issue. Make the issue confidential and try again"
+msgstr ""
+
msgid "Cannot be assigned to other projects."
msgstr ""
@@ -6499,9 +6566,6 @@ msgstr ""
msgid "Cannot refer to a group %{timebox_type} by an internal id!"
msgstr ""
-msgid "Cannot set confidential epic for a non-confidential issue"
-msgstr ""
-
msgid "Cannot show preview. For previews on sketch files, they must have the file format introduced by Sketch version 43 and above."
msgstr ""
@@ -6739,15 +6803,15 @@ msgstr ""
msgid "Check out, review, and merge locally"
msgstr ""
-msgid "Check the %{docs_link_start}documentation%{docs_link_end}."
-msgstr ""
-
msgid "Check the current instance configuration "
msgstr ""
msgid "Check the elasticsearch.log file to debug why the migration was halted and make any changes before retrying the migration. When you fix the cause of the failure, click \"Retry migration\", and the migration will be scheduled to be retried in the background."
msgstr ""
+msgid "Check with your administrator."
+msgstr ""
+
msgid "Check your Docker images for known vulnerabilities."
msgstr ""
@@ -6778,6 +6842,9 @@ msgstr ""
msgid "Checkout"
msgstr ""
+msgid "Checkout|$%{selectedPlanPrice} per 10 GB storage per pack"
+msgstr ""
+
msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 minutes"
msgstr ""
@@ -6800,19 +6867,25 @@ msgstr ""
msgid "Checkout|%{name}'s GitLab subscription"
msgstr ""
-msgid "Checkout|%{selectedPlanText} plan"
+msgid "Checkout|%{name}'s storage subscription"
msgstr ""
-msgid "Checkout|%{startDate} - %{endDate}"
+msgid "Checkout|%{quantity} GB of storage"
msgstr ""
-msgid "Checkout|%{totalCiMinutes} CI minute"
-msgid_plural "Checkout|%{totalCiMinutes} CI minutes"
+msgid "Checkout|%{quantity} storage pack"
+msgid_plural "Checkout|%{quantity} storage packs"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "Checkout|%{selectedPlanText} plan"
+msgstr ""
+
+msgid "Checkout|%{startDate} - %{endDate}"
+msgstr ""
+
msgid "Checkout|%{totalCiMinutes} CI minutes"
msgstr ""
@@ -6888,6 +6961,9 @@ msgstr ""
msgid "Checkout|Failed to register credit card. Please try again."
msgstr ""
+msgid "Checkout|GB"
+msgstr ""
+
msgid "Checkout|GitLab group"
msgstr ""
@@ -6924,6 +7000,9 @@ msgstr ""
msgid "Checkout|State"
msgstr ""
+msgid "Checkout|Storage packs"
+msgstr ""
+
msgid "Checkout|Street address"
msgstr ""
@@ -6945,6 +7024,9 @@ msgstr ""
msgid "Checkout|Total minutes: %{quantity}"
msgstr ""
+msgid "Checkout|Total storage: %{quantity} GB"
+msgstr ""
+
msgid "Checkout|Users"
msgstr ""
@@ -6954,16 +7036,25 @@ msgstr ""
msgid "Checkout|Your organization"
msgstr ""
+msgid "Checkout|Your storage subscription has the same term as your main subscription, and the price is prorated accordingly."
+msgstr ""
+
msgid "Checkout|Your subscription will be applied to this group"
msgstr ""
msgid "Checkout|Zip code"
msgstr ""
+msgid "Checkout|a storage subscription"
+msgstr ""
+
msgid "Checkout|company or team"
msgstr ""
-msgid "Checkout|x 1,000 minutes per pack = %{strong}"
+msgid "Checkout|minutes"
+msgstr ""
+
+msgid "Checkout|x %{quantity} %{units} per pack ="
msgstr ""
msgid "Cherry-pick this commit"
@@ -7320,6 +7411,9 @@ msgstr ""
msgid "CloneIssue|Cannot clone issue to target project as it is pending deletion."
msgstr ""
+msgid "CloneIssue|Cannot clone issues of '%{issue_type}' type."
+msgstr ""
+
msgid "Cloned this issue to %{path_to_project}."
msgstr ""
@@ -7374,7 +7468,10 @@ msgstr ""
msgid "Closes this %{quick_action_target}."
msgstr ""
-msgid "Cloud licenses can not be removed."
+msgid "Cloud Functions description and apps that are suitable for this deployment target"
+msgstr ""
+
+msgid "Cloud Run description and apps that are suitable for this deployment target"
msgstr ""
msgid "Cluster"
@@ -7401,6 +7498,12 @@ msgstr ""
msgid "ClusterAgents|Access tokens"
msgstr ""
+msgid "ClusterAgents|Agent might not be connected to GitLab"
+msgstr ""
+
+msgid "ClusterAgents|Agent never connected to GitLab"
+msgstr ""
+
msgid "ClusterAgents|Alternative installation methods"
msgstr ""
@@ -7416,6 +7519,12 @@ msgstr ""
msgid "ClusterAgents|Configuration"
msgstr ""
+msgid "ClusterAgents|Connected"
+msgstr ""
+
+msgid "ClusterAgents|Connection status"
+msgstr ""
+
msgid "ClusterAgents|Copy token"
msgstr ""
@@ -7434,6 +7543,9 @@ msgstr ""
msgid "ClusterAgents|For alternative installation methods %{linkStart}go to the documentation%{linkEnd}."
msgstr ""
+msgid "ClusterAgents|For more troubleshooting information go to"
+msgstr ""
+
msgid "ClusterAgents|Go to the repository"
msgstr ""
@@ -7449,18 +7561,30 @@ msgstr ""
msgid "ClusterAgents|Integrate with the GitLab Agent"
msgstr ""
-msgid "ClusterAgents|Last used"
+msgid "ClusterAgents|Last connected %{timeAgo}."
+msgstr ""
+
+msgid "ClusterAgents|Last contact"
msgstr ""
msgid "ClusterAgents|Learn how to create an agent access token"
msgstr ""
+msgid "ClusterAgents|Make sure you are using a valid token."
+msgstr ""
+
msgid "ClusterAgents|Name"
msgstr ""
msgid "ClusterAgents|Never"
msgstr ""
+msgid "ClusterAgents|Never connected"
+msgstr ""
+
+msgid "ClusterAgents|Not connected"
+msgstr ""
+
msgid "ClusterAgents|Read more about getting started"
msgstr ""
@@ -7482,6 +7606,9 @@ msgstr ""
msgid "ClusterAgents|Select which Agent you want to install"
msgstr ""
+msgid "ClusterAgents|The Agent has not been connected in a long time. There might be a connectivity issue. Last contact was %{timeAgo}."
+msgstr ""
+
msgid "ClusterAgents|The GitLab Agent also requires %{linkStart}enabling the Agent Server%{linkEnd}"
msgstr ""
@@ -7509,9 +7636,6 @@ msgstr ""
msgid "ClusterAgents|You will need to create a token to connect to your agent"
msgstr ""
-msgid "ClusterAgent|This feature is only available for premium plans"
-msgstr ""
-
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -7701,9 +7825,6 @@ msgstr ""
msgid "ClusterIntegration|Create Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Create a provision role on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the account and external ID above. %{startMoreInfoLink}More information%{endLink}"
-msgstr ""
-
msgid "ClusterIntegration|Create cluster on"
msgstr ""
@@ -8136,7 +8257,7 @@ msgstr ""
msgid "ClusterIntegration|Subnets"
msgstr ""
-msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provisioned role, first create one on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the above account and external IDs. %{startMoreInfoLink}More information%{endLink}"
+msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provisioned role, first create one on %{awsLinkStart}Amazon Web Services %{awsLinkEnd} using the above account and external IDs. %{moreInfoStart}More information%{moreInfoEnd}"
msgstr ""
msgid "ClusterIntegration|The Kubernetes certificate used to authenticate to the cluster."
@@ -8370,6 +8491,9 @@ msgstr ""
msgid "Collapse replies"
msgstr ""
+msgid "Collapse settings section"
+msgstr ""
+
msgid "Collapse sidebar"
msgstr ""
@@ -8388,6 +8512,9 @@ msgstr ""
msgid "Comma-separated list of email addresses."
msgstr ""
+msgid "Comma-separated list of users allowed to exceed the rate limit."
+msgstr ""
+
msgid "Comma-separated, e.g. '1.1.1.1, 2.2.2.0/24'"
msgstr ""
@@ -8710,6 +8837,9 @@ msgstr ""
msgid "Configure %{repository_checks_link_start}repository checks%{link_end} and %{housekeeping_link_start}housekeeping%{link_end} on repositories."
msgstr ""
+msgid "Configure CAPTCHAs, IP address limits, and other anti-spam measures."
+msgstr ""
+
msgid "Configure Dependency Scanning in `.gitlab-ci.yml` using the GitLab managed template. You can [add variable overrides](https://docs.gitlab.com/ee/user/application_security/dependency_scanning/#customizing-the-dependency-scanning-settings) to customize Dependency Scanning settings."
msgstr ""
@@ -8746,16 +8876,13 @@ msgstr ""
msgid "Configure a %{codeStart}.gitlab-webide.yml%{codeEnd} file in the %{codeStart}.gitlab%{codeEnd} directory to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
msgstr ""
-msgid "Configure existing installation"
-msgstr ""
-
-msgid "Configure limit for notes created per minute by web and API requests."
+msgid "Configure advanced permissions, Large File Storage, and two-factor authentication settings."
msgstr ""
-msgid "Configure limits for Project/Group Import/Export."
+msgid "Configure approvals by authors and committers on all projects."
msgstr ""
-msgid "Configure limits for web and API requests."
+msgid "Configure existing installation"
msgstr ""
msgid "Configure paths to be protected by Rack Attack."
@@ -8770,10 +8897,13 @@ msgstr ""
msgid "Configure settings for Advanced Search with Elasticsearch."
msgstr ""
+msgid "Configure specific limits for Files API requests that supersede the general user and IP rate limits."
+msgstr ""
+
msgid "Configure specific limits for Git LFS requests that supersede the general user and IP rate limits."
msgstr ""
-msgid "Configure specific limits for Packages API requests that supersede the general user and IP rate limits."
+msgid "Configure specific limits for deprecated API requests that supersede the general user and IP rate limits."
msgstr ""
msgid "Configure the %{link} integration."
@@ -8785,6 +8915,9 @@ msgstr ""
msgid "Configure the way a user creates a new account."
msgstr ""
+msgid "Configure via Merge Request"
+msgstr ""
+
msgid "Configure which lists are shown for anyone who visits this board"
msgstr ""
@@ -9259,6 +9392,9 @@ msgstr ""
msgid "Content parsed with %{link}."
msgstr ""
+msgid "ContentEditor|Table of Contents"
+msgstr ""
+
msgid "ContentEditor|You have to provide a renderMarkdown function or a custom serializer"
msgstr ""
@@ -9445,6 +9581,9 @@ msgstr ""
msgid "Copy link to chart"
msgstr ""
+msgid "Copy prefix"
+msgstr ""
+
msgid "Copy reference"
msgstr ""
@@ -9475,6 +9614,9 @@ msgstr ""
msgid "Copy value"
msgstr ""
+msgid "Corpus Management"
+msgstr ""
+
msgid "Corpus Management|Are you sure you want to delete the corpus?"
msgstr ""
@@ -9703,6 +9845,9 @@ msgstr ""
msgid "Create commit"
msgstr ""
+msgid "Create common files more quickly, and standardize their format."
+msgstr ""
+
msgid "Create confidential merge request"
msgstr ""
@@ -9736,6 +9881,9 @@ msgstr ""
msgid "Create issue"
msgstr ""
+msgid "Create issue to resolve all threads"
+msgstr ""
+
msgid "Create iteration"
msgstr ""
@@ -9790,6 +9938,9 @@ msgstr ""
msgid "Create new..."
msgstr ""
+msgid "Create or import your first project"
+msgstr ""
+
msgid "Create project"
msgstr ""
@@ -10147,7 +10298,7 @@ msgstr ""
msgid "Custom notification events"
msgstr ""
-msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notificationLinkStart} notification emails%{notificationLinkEnd}."
+msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notificationLinkStart}notification emails%{notificationLinkEnd}."
msgstr ""
msgid "Custom project templates"
@@ -10350,10 +10501,10 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-msgid "CycleAnalytics|Showing data for group '%{groupName}' and %{selectedProjectCount} projects from %{startDate} to %{endDate}"
+msgid "CycleAnalytics|Showing data for group '%{groupName}' and %{selectedProjectCount} projects from %{createdAfter} to %{createdBefore}"
msgstr ""
-msgid "CycleAnalytics|Showing data for group '%{groupName}' from %{startDate} to %{endDate}"
+msgid "CycleAnalytics|Showing data for group '%{groupName}' from %{createdAfter} to %{createdBefore}"
msgstr ""
msgid "CycleAnalytics|Stages"
@@ -10587,6 +10738,9 @@ msgstr ""
msgid "DastProfiles|Manage profiles"
msgstr ""
+msgid "DastProfiles|Manage site profiles"
+msgstr ""
+
msgid "DastProfiles|Minimum = 0 (no timeout enabled), Maximum = 2880 minutes"
msgstr ""
@@ -10662,6 +10816,9 @@ msgstr ""
msgid "DastProfiles|Scanner name"
msgstr ""
+msgid "DastProfiles|Schedule"
+msgstr ""
+
msgid "DastProfiles|Select branch"
msgstr ""
@@ -10731,7 +10888,7 @@ msgstr ""
msgid "DastProfiles|Website"
msgstr ""
-msgid "DastProfiles|You can either choose a passive scan or validate the target site in your chosen site profile. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
+msgid "DastProfiles|You can either choose a passive scan or validate the target site from the site profile management page. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
msgstr ""
msgid "DastProfiles|You cannot run an active scan against an unvalidated site."
@@ -10906,7 +11063,7 @@ msgstr ""
msgid "Days to merge"
msgstr ""
-msgid "Deactivate dormant users after 90 days of inactivity. Users can return to active status by signing in to their account. While inactive, a user is not counted as an active user in the instance."
+msgid "Deactivate dormant users after 90 days of inactivity"
msgstr ""
msgid "Dear Administrator,"
@@ -10993,10 +11150,10 @@ msgstr ""
msgid "Define a custom pattern with cron syntax"
msgstr ""
-msgid "Define approval settings."
+msgid "Define approval rules."
msgstr ""
-msgid "Define approval settings. %{linkStart}Learn more.%{linkEnd}"
+msgid "Define approval rules. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "Define custom rules for what constitutes spam, independent of Akismet"
@@ -11005,7 +11162,7 @@ msgstr ""
msgid "Define environments in the deploy stage(s) in %{code_open}.gitlab-ci.yml%{code_close} to track deployments here."
msgstr ""
-msgid "Define how approval rules are applied as a merge request moves toward completion."
+msgid "Define how approval rules are applied to merge requests."
msgstr ""
msgid "Definition"
@@ -11020,6 +11177,12 @@ msgstr ""
msgid "DelayedJobs|Are you sure you want to run %{job_name} immediately? This job will run automatically after it's timer finishes."
msgstr ""
+msgid "DelayedJobs|Are you sure you want to run %{job_name} immediately? This job will run automatically after its timer finishes."
+msgstr ""
+
+msgid "DelayedJobs|Run the delayed job now?"
+msgstr ""
+
msgid "DelayedJobs|Start now"
msgstr ""
@@ -11302,6 +11465,12 @@ msgstr ""
msgid "Dependency proxy image prefix"
msgstr ""
+msgid "DependencyProxy|Create a local proxy for storing frequently used upstream images. %{docLinkStart}Learn more%{docLinkEnd} about dependency proxies."
+msgstr ""
+
+msgid "DependencyProxy|Dependency Proxy"
+msgstr ""
+
msgid "DependencyProxy|Toggle Dependency Proxy"
msgstr ""
@@ -11548,6 +11717,9 @@ msgstr ""
msgid "Deployments"
msgstr ""
+msgid "Deployments to Google Kubernetes Engine can be "
+msgstr ""
+
msgid "Deployments|%{deployments} environment impacted."
msgid_plural "Deployments|%{deployments} environments impacted."
msgstr[0] ""
@@ -11579,6 +11751,9 @@ msgstr ""
msgid "Deployment|success"
msgstr ""
+msgid "Deprecated API rate limits"
+msgstr ""
+
msgid "Deprioritize label"
msgstr ""
@@ -11981,6 +12156,20 @@ msgstr ""
msgid "DiffsCompareBaseBranch|(base)"
msgstr ""
+msgid "Diffs|%d addition"
+msgid_plural "Diffs|%d additions"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
+msgid "Diffs|%d deletion"
+msgid_plural "Diffs|%d deletions"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "Diffs|No file name available"
msgstr ""
@@ -11990,9 +12179,19 @@ msgstr ""
msgid "Diffs|Show all unchanged lines"
msgstr ""
+msgid "Diffs|Showing %{dropdownStart}%{count} changed file%{dropdownEnd}"
+msgid_plural "Diffs|Showing %{dropdownStart}%{count} changed files%{dropdownEnd}"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "Diffs|Something went wrong while fetching diff lines."
msgstr ""
+msgid "Diffs|with %{additions} and %{deletions}"
+msgstr ""
+
msgid "Direct member"
msgstr ""
@@ -12120,9 +12319,6 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-msgid "Dismiss Value Stream Analytics introduction box"
-msgstr ""
-
msgid "Dismiss merge request promotion"
msgstr ""
@@ -12444,6 +12640,9 @@ msgstr ""
msgid "Edit issues"
msgstr ""
+msgid "Edit merge requests"
+msgstr ""
+
msgid "Edit public deploy key"
msgstr ""
@@ -12519,6 +12718,9 @@ msgstr ""
msgid "Elastic|None. Select projects to index."
msgstr ""
+msgid "Eligible users"
+msgstr ""
+
msgid "Email"
msgstr ""
@@ -12648,6 +12850,9 @@ msgstr ""
msgid "Enable"
msgstr ""
+msgid "Enable Amazon EKS integration"
+msgstr ""
+
msgid "Enable Auto DevOps"
msgstr ""
@@ -12681,6 +12886,9 @@ msgstr ""
msgid "Enable SSL verification"
msgstr ""
+msgid "Enable Service Ping"
+msgstr ""
+
msgid "Enable Snowplow tracking"
msgstr ""
@@ -12711,6 +12919,9 @@ msgstr ""
msgid "Enable authenticated Git LFS request rate limit"
msgstr ""
+msgid "Enable authenticated web request rate limit"
+msgstr ""
+
msgid "Enable authentication"
msgstr ""
@@ -12771,7 +12982,7 @@ msgstr ""
msgid "Enable or disable the Pseudonymizer data collection."
msgstr ""
-msgid "Enable or disable version check and service ping."
+msgid "Enable or disable version check and Service Ping."
msgstr ""
msgid "Enable protected paths rate limit"
@@ -12783,18 +12994,12 @@ msgstr ""
msgid "Enable reCAPTCHA"
msgstr ""
-msgid "Enable reCAPTCHA for login"
-msgstr ""
-
-msgid "Enable reCAPTCHA, Invisible Captcha, Akismet and set IP limits. For reCAPTCHA, we currently only support %{recaptcha_v2_link_start}v2%{recaptcha_v2_link_end}"
+msgid "Enable reCAPTCHA for login."
msgstr ""
msgid "Enable repository checks"
msgstr ""
-msgid "Enable service ping"
-msgstr ""
-
msgid "Enable shared runners for all projects and subgroups in this group."
msgstr ""
@@ -12816,7 +13021,10 @@ msgstr ""
msgid "Enable unauthenticated API request rate limit"
msgstr ""
-msgid "Enable unauthenticated request rate limit"
+msgid "Enable unauthenticated web request rate limit"
+msgstr ""
+
+msgid "Enable user deactivation emails"
msgstr ""
msgid "Enable version check"
@@ -12852,9 +13060,6 @@ msgstr ""
msgid "Enabled sources for code import during project creation. OmniAuth must be configured for GitHub"
msgstr ""
-msgid "Enabling this will only make licensed EE features available to projects if the project namespace's plan includes the feature or if the project is public."
-msgstr ""
-
msgid "Encountered an error while rendering: %{err}"
msgstr ""
@@ -12903,9 +13108,6 @@ msgstr ""
msgid "Enter Admin Mode"
msgstr ""
-msgid "Enter IP address range"
-msgstr ""
-
msgid "Enter a number"
msgstr ""
@@ -12918,9 +13120,6 @@ msgstr ""
msgid "Enter at least three characters to search"
msgstr ""
-msgid "Enter domain"
-msgstr ""
-
msgid "Enter in your Bitbucket Server URL and personal access token below"
msgstr ""
@@ -13107,9 +13306,6 @@ msgstr ""
msgid "Environments|Deployment %{status}"
msgstr ""
-msgid "Environments|Dismiss"
-msgstr ""
-
msgid "Environments|Enable review app"
msgstr ""
@@ -13122,9 +13318,6 @@ msgstr ""
msgid "Environments|Environments are places where code gets deployed, such as staging or production."
msgstr ""
-msgid "Environments|Help us improve environments"
-msgstr ""
-
msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
msgstr ""
@@ -13161,6 +13354,9 @@ msgstr ""
msgid "Environments|Note that this action will stop the environment, but it will %{emphasisStart}not%{emphasisEnd} have an effect on any existing deployment due to no “stop environment action†being defined in the %{ciConfigLinkStart}.gitlab-ci.yml%{ciConfigLinkEnd} file."
msgstr ""
+msgid "Environments|Open"
+msgstr ""
+
msgid "Environments|Open live environment"
msgstr ""
@@ -13200,9 +13396,6 @@ msgstr ""
msgid "Environments|Stopping %{environmentName}"
msgstr ""
-msgid "Environments|Take the survey"
-msgstr ""
-
msgid "Environments|There was an error fetching the logs. Please try again."
msgstr ""
@@ -13224,9 +13417,6 @@ msgstr ""
msgid "Environments|You don't have any environments right now"
msgstr ""
-msgid "Environments|Your feedback helps GitLab make environments better for you and other users. Participate and enter a sweepstake to win a USD 30 gift card."
-msgstr ""
-
msgid "Environments|by %{avatar}"
msgstr ""
@@ -13509,7 +13699,7 @@ msgstr ""
msgid "Error parsing CSV file. Please make sure it has"
msgstr ""
-msgid "Error rendering markdown preview"
+msgid "Error rendering Markdown preview"
msgstr ""
msgid "Error saving label update."
@@ -13557,6 +13747,9 @@ msgstr ""
msgid "Error: %{error_message}"
msgstr ""
+msgid "Error: Couldn't load some or all of the changes."
+msgstr ""
+
msgid "Error: No AWS credentials were supplied"
msgstr ""
@@ -13590,6 +13783,9 @@ msgstr ""
msgid "ErrorTracking|Enable error tracking"
msgstr ""
+msgid "ErrorTracking|Error tracking backend"
+msgstr ""
+
msgid "ErrorTracking|If you self-host Sentry, enter your Sentry instance's full URL. If you use Sentry's hosted solution, enter https://sentry.io"
msgstr ""
@@ -13623,6 +13819,12 @@ msgstr ""
msgid "Escalation policies must have at least one rule"
msgstr ""
+msgid "EscalationPolicies|%{clockIcon} IF alert is not %{alertStatus} in %{minutes}"
+msgstr ""
+
+msgid "EscalationPolicies|%{notificationIcon} THEN %{doAction} %{forScheduleOrUser}"
+msgstr ""
+
msgid "EscalationPolicies|+ Add an additional rule"
msgstr ""
@@ -13665,13 +13867,13 @@ msgstr ""
msgid "EscalationPolicies|Escalation policies"
msgstr ""
-msgid "EscalationPolicies|Escalation rules"
+msgid "EscalationPolicies|Escalation policy %{obstacle} in Project %{project}"
msgstr ""
-msgid "EscalationPolicies|Failed to load oncall-schedules"
+msgid "EscalationPolicies|Escalation rules"
msgstr ""
-msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} %{then} THEN %{doAction} %{scheduleOrUser}"
+msgid "EscalationPolicies|Failed to load oncall-schedules"
msgstr ""
msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} minutes"
@@ -13749,18 +13951,36 @@ msgstr ""
msgid "Every %{action} attempt has failed: %{job_error_message}. Please try again."
msgstr ""
+msgid "Every 3 months"
+msgstr ""
+
+msgid "Every 3 months on the %{day} at %{time} %{timezone}"
+msgstr ""
+
+msgid "Every 6 months"
+msgstr ""
+
+msgid "Every 6 months on the %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Every day"
msgstr ""
msgid "Every day (at %{time})"
msgstr ""
+msgid "Every day at %{time} %{timezone}"
+msgstr ""
+
msgid "Every month"
msgstr ""
msgid "Every month (Day %{day} at %{time})"
msgstr ""
+msgid "Every month on the %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Every three months"
msgstr ""
@@ -13777,6 +13997,15 @@ msgstr[3] ""
msgid "Every week (%{weekday} at %{time})"
msgstr ""
+msgid "Every week on %{day} at %{time} %{timezone}"
+msgstr ""
+
+msgid "Every year"
+msgstr ""
+
+msgid "Every year on %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Everyone"
msgstr ""
@@ -13813,9 +14042,6 @@ msgstr ""
msgid "Exactly one of %{attributes} is required"
msgstr ""
-msgid "Example: %{ip_address}. %{read_more_link}."
-msgstr ""
-
msgid "Example: @sub\\.company\\.com$"
msgstr ""
@@ -13882,13 +14108,13 @@ msgstr ""
msgid "Expand pipeline"
msgstr ""
-msgid "Expand sidebar"
+msgid "Expand settings section"
msgstr ""
-msgid "Expected documents: %{expected_documents}"
+msgid "Expand sidebar"
msgstr ""
-msgid "Experienced"
+msgid "Expected documents: %{expected_documents}"
msgstr ""
msgid "ExperimentSubject|Must have exactly one of User, Namespace, or Project."
@@ -14173,9 +14399,6 @@ msgstr ""
msgid "Failed to load related branches"
msgstr ""
-msgid "Failed to load sidebar lock status"
-msgstr ""
-
msgid "Failed to load stacktrace."
msgstr ""
@@ -14604,6 +14827,9 @@ msgstr ""
msgid "Files"
msgstr ""
+msgid "Files API Rate Limits"
+msgstr ""
+
msgid "Files breadcrumb"
msgstr ""
@@ -15603,6 +15829,9 @@ msgstr ""
msgid "GitLab group: %{source_link}"
msgstr ""
+msgid "GitLab informs you if a new version is available."
+msgstr ""
+
msgid "GitLab is a complete DevOps platform, delivered as a single application, fundamentally changing the way Development, Security, and Ops teams collaborate"
msgstr ""
@@ -15618,7 +15847,7 @@ msgstr ""
msgid "GitLab is open source software to collaborate on code."
msgstr ""
-msgid "GitLab is undergoing maintenance and is operating in a read-only mode."
+msgid "GitLab is undergoing maintenance and is operating in read-only mode."
msgstr ""
msgid "GitLab member or Email address"
@@ -15630,9 +15859,6 @@ msgstr ""
msgid "GitLab project export"
msgstr ""
-msgid "GitLab restart is required to apply changes."
-msgstr ""
-
msgid "GitLab single sign-on URL"
msgstr ""
@@ -15648,9 +15874,6 @@ msgstr ""
msgid "GitLab version"
msgstr ""
-msgid "GitLab will inform you if a new version is available."
-msgstr ""
-
msgid "GitLab will run a background job that will produce pseudonymized CSVs of the GitLab database that will be uploaded to your configured object storage directory."
msgstr ""
@@ -15915,9 +16138,21 @@ msgstr ""
msgid "Go to snippets"
msgstr ""
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check 'Allowed domains for sign-ups'."
+msgstr ""
+
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check 'Email restrictions for sign-ups'."
+msgstr ""
+
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check the 'Domain denylist'."
+msgstr ""
+
msgid "Go to the activity feed"
msgstr ""
+msgid "Go to the group’s 'Settings &gt; General' page, and check 'Restrict membership by email domain'."
+msgstr ""
+
msgid "Go to the milestone list"
msgstr ""
@@ -15954,6 +16189,12 @@ msgstr ""
msgid "Goal of the changes and what reviewers should be aware of"
msgstr ""
+msgid "Google Cloud"
+msgstr ""
+
+msgid "Google Cloud offers several deployment targets. Select the one most suitable for your project."
+msgstr ""
+
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
@@ -16038,9 +16279,6 @@ msgstr ""
msgid "Group ID"
msgstr ""
-msgid "Group ID: %{group_id}"
-msgstr ""
-
msgid "Group Owner must have signed in with SAML before enabling Group Managed Accounts"
msgstr ""
@@ -16215,6 +16453,12 @@ msgstr ""
msgid "GroupImport|Unable to process group import file"
msgstr ""
+msgid "GroupPage|Copy group ID"
+msgstr ""
+
+msgid "GroupPage|Group ID: %{group_id}"
+msgstr ""
+
msgid "GroupRoadmap|%{dateWord} – No end date"
msgstr ""
@@ -16269,6 +16513,9 @@ msgstr ""
msgid "GroupRoadmap|Within 3 years"
msgstr ""
+msgid "GroupSAML|\"persistent\" recommended"
+msgstr ""
+
msgid "GroupSAML|%{strongOpen}Warning%{strongClose} - Enabling %{linkStart}SSO enforcement%{linkEnd} can reduce security risks."
msgstr ""
@@ -16401,6 +16648,9 @@ msgstr ""
msgid "GroupSAML|To be able to prohibit outer forks, you first need to enforce dedicate group managed accounts."
msgstr ""
+msgid "GroupSAML|Use SAML group links to manage group membership using SAML."
+msgstr ""
+
msgid "GroupSAML|Valid SAML Response"
msgstr ""
@@ -16413,13 +16663,10 @@ msgstr ""
msgid "GroupSAML|as %{access_level}"
msgstr ""
-msgid "GroupSAML|must match stored NameID of \"%{extern_uid}\" as we use this to identify users. If the NameID changes users will be unable to sign in."
-msgstr ""
-
-msgid "GroupSAML|should be \"persistent\""
+msgid "GroupSAML|must match stored NameID of \"%{extern_uid}\" to identify user and allow sign in"
msgstr ""
-msgid "GroupSAML|should be a random persistent ID, emails are discouraged"
+msgid "GroupSAML|recommend persistent ID instead of email"
msgstr ""
msgid "GroupSelect|No matching results"
@@ -16434,9 +16681,15 @@ msgstr ""
msgid "GroupSettings|Allow project access token creation"
msgstr ""
+msgid "GroupSettings|Applied to all subgroups unless overridden by a group owner. Groups already added to the project lose access."
+msgstr ""
+
msgid "GroupSettings|Auto DevOps pipeline was updated for the group"
msgstr ""
+msgid "GroupSettings|Available only on the top-level group. Applies to all subgroups. Groups already shared with a group outside %{group} are still shared unless removed manually."
+msgstr ""
+
msgid "GroupSettings|Badges"
msgstr ""
@@ -16488,6 +16741,9 @@ msgstr ""
msgid "GroupSettings|New runners registration token has been generated!"
msgstr ""
+msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgstr ""
+
msgid "GroupSettings|Pipeline settings was updated for the group"
msgstr ""
@@ -16500,12 +16756,15 @@ msgstr ""
msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
-msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups."
+msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups"
msgstr ""
msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
msgstr ""
+msgid "GroupSettings|Prevents group members from being notified if the group is mentioned."
+msgstr ""
+
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
msgstr ""
@@ -16542,21 +16801,6 @@ msgstr ""
msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}."
msgstr ""
-msgid "GroupSettings|This setting is only available on the top-level group and it applies to all subgroups. Groups that have already been shared with a group outside %{group} will still be shared, and this access will have to be revoked manually."
-msgstr ""
-
-msgid "GroupSettings|This setting will be applied to all subgroups unless overridden by a group owner. Groups that already have access to the project will continue to have access unless removed manually."
-msgstr ""
-
-msgid "GroupSettings|This setting will override user notification preferences for all members of the group, subgroups, and projects."
-msgstr ""
-
-msgid "GroupSettings|This setting will prevent group members from being notified if the group is mentioned."
-msgstr ""
-
-msgid "GroupSettings|This setting will prevent group members from forking projects outside of the group."
-msgstr ""
-
msgid "GroupSettings|Transfer group"
msgstr ""
@@ -16674,7 +16918,7 @@ msgstr ""
msgid "GroupsNew|No import options available"
msgstr ""
-msgid "GroupsNew|Not all related objects are migrated, as %{docs_link_start}described here%{docs_link_end}. Please %{feedback_link_start}leave feedback%{feedback_link_end} on this feature."
+msgid "GroupsNew|Not all related objects are migrated. %{docs_link_start}More info%{docs_link_end}."
msgstr ""
msgid "GroupsNew|Personal access token"
@@ -16806,15 +17050,27 @@ msgstr ""
msgid "Hello %{name},"
msgstr ""
-msgid "Hello there"
-msgstr ""
-
msgid "Hello, %{name}!"
msgstr ""
msgid "Hello, %{username}!"
msgstr ""
+msgid "HelloMessage|%{handshake_emoji} Contribute to GitLab: %{contribute_link}"
+msgstr ""
+
+msgid "HelloMessage|%{magnifier_emoji} Create a new GitLab issue: %{new_issue_link}"
+msgstr ""
+
+msgid "HelloMessage|%{rocket_emoji} We like your curiosity! Help us improve GitLab by joining the team: %{jobs_page_link}"
+msgstr ""
+
+msgid "HelloMessage|Does this page need fixes or improvements? Open an issue or contribute a merge request to help make GitLab more lovable. At GitLab, everyone can contribute!"
+msgstr ""
+
+msgid "HelloMessage|Welcome to GitLab!"
+msgstr ""
+
msgid "Help"
msgstr ""
@@ -16824,13 +17080,10 @@ msgstr ""
msgid "Helps prevent bots from creating accounts."
msgstr ""
-msgid "Helps prevent bots from creating issues"
+msgid "Helps prevent bots from creating issues."
msgstr ""
-msgid "Helps prevent malicious users hide their activity"
-msgstr ""
-
-msgid "Helps reduce request volume (e.g. from crawlers or abusive bots)"
+msgid "Helps prevent malicious users hide their activity."
msgstr ""
msgid "Helps reduce request volume (for example, from crawlers or abusive bots)"
@@ -16958,6 +17211,12 @@ msgstr ""
msgid "Housekeeping, export, path, transfer, remove, archive."
msgstr ""
+msgid "How do I configure Akismet?"
+msgstr ""
+
+msgid "How do I configure it?"
+msgstr ""
+
msgid "How do I configure runners?"
msgstr ""
@@ -16979,19 +17238,25 @@ msgstr ""
msgid "How do I set up this service?"
msgstr ""
+msgid "How do I use a web terminal?"
+msgstr ""
+
+msgid "How do I use file templates?"
+msgstr ""
+
msgid "How it works"
msgstr ""
msgid "How many days need to pass between marking entity for deletion and actual removing it."
msgstr ""
-msgid "How many seconds an IP will be counted towards the limit"
+msgid "How many seconds an IP counts toward the IP address limit."
msgstr ""
-msgid "I accept the %{terms_link}"
+msgid "How the job limiter handles jobs exceeding the thresholds specified below. The 'track' mode only logs the jobs. The 'compress' mode compresses the jobs and raises an exception if the compressed size exceeds the limit."
msgstr ""
-msgid "I accept the|Terms of Service and Privacy Policy"
+msgid "I accept the %{terms_link}"
msgstr ""
msgid "I forgot my password"
@@ -17075,13 +17340,16 @@ msgstr ""
msgid "IP Address"
msgstr ""
-msgid "IP expiration time"
+msgid "IP address expiration time"
msgstr ""
-msgid "IP subnet restriction only allowed for top-level groups"
+msgid "IP address restrictions"
+msgstr ""
+
+msgid "IP addresses per user"
msgstr ""
-msgid "IPs per user"
+msgid "IP subnet restriction only allowed for top-level groups"
msgstr ""
msgid "Identifier"
@@ -17096,6 +17364,9 @@ msgstr ""
msgid "If any indexed field exceeds this limit it will be truncated to this number of characters and the rest will not be indexed or searchable. This does not apply to repository and wiki indexing. Setting this to 0 means it is unlimited."
msgstr ""
+msgid "If blank, defaults to %{code_open}Retry later%{code_close}."
+msgstr ""
+
msgid "If blank, set allowable lifetime to %{instance_level_policy_in_words}, as defined by the instance admin. Once set, existing tokens for users in this group may be revoked."
msgstr ""
@@ -17147,6 +17418,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 did not initiate these sign-in attempts, please reach out to your administrator or enable two-factor authentication (2FA) on your account."
+msgstr ""
+
msgid "If you did not initiate this change, please contact your administrator immediately."
msgstr ""
@@ -17242,10 +17516,10 @@ msgstr ""
msgid "Import Projects from Gitea"
msgstr ""
-msgid "Import a project"
+msgid "Import an exported GitLab project"
msgstr ""
-msgid "Import an exported GitLab project"
+msgid "Import and export rate limits"
msgstr ""
msgid "Import failed due to a GitHub error: %{original}"
@@ -17257,12 +17531,18 @@ msgstr ""
msgid "Import from Jira"
msgstr ""
+msgid "Import group"
+msgstr ""
+
msgid "Import group from file"
msgstr ""
msgid "Import groups"
msgstr ""
+msgid "Import history"
+msgstr ""
+
msgid "Import in progress"
msgstr ""
@@ -17326,7 +17606,25 @@ msgstr ""
msgid "Import timed out. Import took longer than %{import_jobs_expiration} seconds"
msgstr ""
-msgid "Import/Export Rate Limits"
+msgid "ImportAProjectModal|Import from a project"
+msgstr ""
+
+msgid "ImportAProjectModal|Import members from another project"
+msgstr ""
+
+msgid "ImportAProjectModal|Import project members"
+msgstr ""
+
+msgid "ImportAProjectModal|Only project members (not group members) are imported, and they get the same permissions as the project you import from."
+msgstr ""
+
+msgid "ImportAProjectModal|Successfully imported"
+msgstr ""
+
+msgid "ImportAProjectModal|Unable to import project members"
+msgstr ""
+
+msgid "ImportAProjectModal|You're importing members to the %{strongStart}%{name}%{strongEnd} project."
msgstr ""
msgid "ImportButtons|Connect repositories from"
@@ -17381,7 +17679,7 @@ msgstr[3] ""
msgid "Importing..."
msgstr ""
-msgid "Import|A repository URL usually ends in a .git suffix, although this is not required. Double check to make sure your repository URL is correct."
+msgid "Import|There is not a valid Git repository at this URL. If your HTTP repository is not publicly accessible, verify your credentials."
msgstr ""
msgid "Improve customer support with Service Desk"
@@ -17390,9 +17688,6 @@ msgstr ""
msgid "Improves Git cloning performance."
msgstr ""
-msgid "In %{time_to_now}"
-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 ""
@@ -17678,7 +17973,7 @@ msgstr ""
msgid "InProductMarketing|Start a GitLab Ultimate trial today in less than one minute, no credit card required."
msgstr ""
-msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no CC required"
+msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no credit card required"
msgstr ""
msgid "InProductMarketing|Start a trial"
@@ -17717,7 +18012,7 @@ msgstr ""
msgid "InProductMarketing|Team up in GitLab for greater efficiency"
msgstr ""
-msgid "InProductMarketing|Team work makes the dream work"
+msgid "InProductMarketing|Team work makes the dream work"
msgstr ""
msgid "InProductMarketing|Test, create, deploy"
@@ -18300,6 +18595,9 @@ msgstr ""
msgid "Integrations|Create new issue in Jira"
msgstr ""
+msgid "Integrations|Create new issue in ZenTao"
+msgstr ""
+
msgid "Integrations|Default settings are inherited from the group level."
msgstr ""
@@ -18393,9 +18691,15 @@ msgstr ""
msgid "Integrations|Search Jira issues"
msgstr ""
+msgid "Integrations|Search ZenTao issues"
+msgstr ""
+
msgid "Integrations|Send notifications about project events to Unify Circuit."
msgstr ""
+msgid "Integrations|Send notifications about project events to a Unify Circuit conversation. %{docs_link}"
+msgstr ""
+
msgid "Integrations|Sign in to add namespaces"
msgstr ""
@@ -18435,6 +18739,9 @@ msgstr ""
msgid "Integrations|You've activated every integration 🎉"
msgstr ""
+msgid "Integrations|ZenTao issues display here when you create issues in your project in ZenTao."
+msgstr ""
+
msgid "Interactive mode"
msgstr ""
@@ -18462,9 +18769,6 @@ msgstr ""
msgid "Interval Pattern"
msgstr ""
-msgid "Introducing Value Stream Analytics"
-msgstr ""
-
msgid "Introducing Your DevOps Report"
msgstr ""
@@ -18561,6 +18865,12 @@ msgstr ""
msgid "Investigate vulnerability: %{title}"
msgstr ""
+msgid "Invisible Captcha"
+msgstr ""
+
+msgid "Invisible Captcha helps prevent the creation of spam accounts. It adds a honeypot field and time-sensitive form submission to the account signup form."
+msgstr ""
+
msgid "Invitation"
msgstr ""
@@ -19014,12 +19324,18 @@ msgstr ""
msgid "Issues"
msgstr ""
+msgid "Issues I've created"
+msgstr ""
+
msgid "Issues Rate Limits"
msgstr ""
msgid "Issues and merge requests"
msgstr ""
+msgid "Issues assigned to me"
+msgstr ""
+
msgid "Issues can be bugs, tasks or ideas to be discussed. Also, issues are searchable and filterable."
msgstr ""
@@ -19131,7 +19447,7 @@ msgstr ""
msgid "Iterations|Create cadence"
msgstr ""
-msgid "Iterations|Create your first iteration"
+msgid "Iterations|Create iteration"
msgstr ""
msgid "Iterations|Delete cadence"
@@ -19140,6 +19456,9 @@ msgstr ""
msgid "Iterations|Delete iteration cadence?"
msgstr ""
+msgid "Iterations|Delete iteration?"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -19173,12 +19492,18 @@ msgstr ""
msgid "Iterations|New iteration cadence"
msgstr ""
+msgid "Iterations|No closed iterations."
+msgstr ""
+
msgid "Iterations|No iteration cadences to show."
msgstr ""
msgid "Iterations|No iterations in cadence."
msgstr ""
+msgid "Iterations|No open iterations."
+msgstr ""
+
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
@@ -19209,6 +19534,9 @@ msgstr ""
msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
msgstr ""
+msgid "Iterations|This will remove the iteration from any issues that are assigned to it."
+msgstr ""
+
msgid "Iterations|Title"
msgstr ""
@@ -19224,15 +19552,9 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "I’m familiar with the basics of DevOps."
-msgstr ""
-
msgid "I’m joining my team who’s already on GitLab"
msgstr ""
-msgid "I’m not familiar with the basics of DevOps."
-msgstr ""
-
msgid "Jaeger URL"
msgstr ""
@@ -19497,6 +19819,9 @@ msgstr ""
msgid "Job"
msgstr ""
+msgid "Job %{jobName}"
+msgstr ""
+
msgid "Job Failed #%{build_id}"
msgstr ""
@@ -20089,9 +20414,6 @@ msgstr ""
msgid "Learn more in the"
msgstr ""
-msgid "Learn more in the|pipeline schedules documentation"
-msgstr ""
-
msgid "Learn more."
msgstr ""
@@ -20203,9 +20525,6 @@ msgstr ""
msgid "Leave Admin Mode"
msgstr ""
-msgid "Leave blank for no limit. Once set, existing personal access tokens may be revoked."
-msgstr ""
-
msgid "Leave edit mode? All unsaved changes will be lost."
msgstr ""
@@ -20251,10 +20570,10 @@ msgstr ""
msgid "LicenseCompliance|Acceptable license to be used in the project"
msgstr ""
-msgid "LicenseCompliance|Add a license"
+msgid "LicenseCompliance|Add license and related policy"
msgstr ""
-msgid "LicenseCompliance|Add license and related policy"
+msgid "LicenseCompliance|Add license policy"
msgstr ""
msgid "LicenseCompliance|Allow"
@@ -20356,6 +20675,9 @@ msgstr ""
msgid "LicenseManagement|Uncategorized"
msgstr ""
+msgid "Licensed Enterprise Edition features can be used if the project namespace's plan includes the feature, or if the project is public."
+msgstr ""
+
msgid "Licensed Features"
msgstr ""
@@ -20422,7 +20744,10 @@ msgstr ""
msgid "Limit namespaces and projects that can be indexed"
msgstr ""
-msgid "Limit sign in from multiple ips"
+msgid "Limit project size at a global, group, and project level. %{link_start}Learn more%{link_end}."
+msgstr ""
+
+msgid "Limit sign in from multiple IP addresses"
msgstr ""
msgid "Limit the number of concurrent operations this secondary site can run in the background."
@@ -20434,6 +20759,9 @@ msgstr ""
msgid "Limit the number of issues and epics per minute a user can create through web and API requests."
msgstr ""
+msgid "Limit the size of Sidekiq jobs stored in Redis."
+msgstr ""
+
msgid "Limited to showing %d event at most"
msgid_plural "Limited to showing %d events at most"
msgstr[0] ""
@@ -20441,6 +20769,9 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "Limiting mode"
+msgstr ""
+
msgid "Line changes"
msgstr ""
@@ -20510,9 +20841,6 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
-msgid "List of users to be excluded from the limit"
-msgstr ""
-
msgid "List options"
msgstr ""
@@ -20552,9 +20880,6 @@ msgstr ""
msgid "Loading functions timed out. Please reload the page to try again."
msgstr ""
-msgid "Loading issues"
-msgstr ""
-
msgid "Loading more"
msgstr ""
@@ -20846,6 +21171,9 @@ msgstr ""
msgid "Marked For Deletion At - %{deletion_time}"
msgstr ""
+msgid "Marked as ready. Merging is now allowed."
+msgstr ""
+
msgid "Marked this %{noun} as a draft."
msgstr ""
@@ -20918,52 +21246,22 @@ msgstr ""
msgid "Max 100,000 events"
msgstr ""
-msgid "Max 20 characters"
-msgstr ""
-
-msgid "Max Group Export Download requests per minute per user"
-msgstr ""
-
-msgid "Max Group Export requests per minute per user"
-msgstr ""
-
-msgid "Max Group Import requests per minute per user"
-msgstr ""
-
-msgid "Max Project Export Download requests per minute per user"
-msgstr ""
-
-msgid "Max Project Export requests per minute per user"
-msgstr ""
-
-msgid "Max Project Import requests per minute per user"
-msgstr ""
-
-msgid "Max authenticated API requests per period per user"
-msgstr ""
-
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
-msgid "Max authenticated web requests per period per user"
-msgstr ""
-
msgid "Max file size is 200 KB."
msgstr ""
-msgid "Max requests per minute per user"
-msgstr ""
-
msgid "Max role"
msgstr ""
msgid "Max session time"
msgstr ""
-msgid "Max unauthenticated requests per period per IP"
+msgid "MaxBuilds"
msgstr ""
-msgid "MaxBuilds"
+msgid "Maximum 20 characters"
msgstr ""
msgid "Maximum Conan package file size in bytes"
@@ -20999,6 +21297,12 @@ msgstr ""
msgid "Maximum attachment size (MB)"
msgstr ""
+msgid "Maximum authenticated API requests per rate limit period per user"
+msgstr ""
+
+msgid "Maximum authenticated web requests per rate limit period per user"
+msgstr ""
+
msgid "Maximum bulk request size (MiB)"
msgstr ""
@@ -21044,6 +21348,15 @@ msgstr ""
msgid "Maximum files in a diff"
msgstr ""
+msgid "Maximum group export download requests per minute"
+msgstr ""
+
+msgid "Maximum group export requests per minute"
+msgstr ""
+
+msgid "Maximum group import requests per minute"
+msgstr ""
+
msgid "Maximum import size"
msgstr ""
@@ -21080,7 +21393,7 @@ msgstr ""
msgid "Maximum number of projects."
msgstr ""
-msgid "Maximum number of unique IPs per user"
+msgid "Maximum number of unique IP addresses per user."
msgstr ""
msgid "Maximum page reached"
@@ -21089,12 +21402,24 @@ msgstr ""
msgid "Maximum page size"
msgstr ""
+msgid "Maximum project export download requests per minute"
+msgstr ""
+
+msgid "Maximum project export requests per minute"
+msgstr ""
+
+msgid "Maximum project import requests per minute"
+msgstr ""
+
msgid "Maximum push size"
msgstr ""
msgid "Maximum push size (MB)"
msgstr ""
+msgid "Maximum requests per minute"
+msgstr ""
+
msgid "Maximum running slices"
msgstr ""
@@ -21122,10 +21447,16 @@ msgstr ""
msgid "Maximum time between updates that a mirror can have when scheduled to synchronize."
msgstr ""
-msgid "Maximum time for web terminal websocket connection (in seconds). 0 for unlimited."
+msgid "Maximum time that users are allowed to skip the setup of two-factor authentication (in hours). Set to 0 (zero) to enforce at next sign in."
msgstr ""
-msgid "Maximum time that users are allowed to skip the setup of two-factor authentication (in hours). Set to 0 (zero) to enforce at next sign in."
+msgid "Maximum time, in seconds, for a web terminal websocket connection. 0 for unlimited."
+msgstr ""
+
+msgid "Maximum unauthenticated API requests per rate limit period per IP"
+msgstr ""
+
+msgid "Maximum unauthenticated web requests per rate limit period per IP"
msgstr ""
msgid "May"
@@ -21143,9 +21474,6 @@ msgstr ""
msgid "Medium vulnerabilities present"
msgstr ""
-msgid "Member lock"
-msgstr ""
-
msgid "Member since"
msgstr ""
@@ -21182,6 +21510,9 @@ msgstr ""
msgid "Members of a group may only view projects they have permission to access"
msgstr ""
+msgid "Membership"
+msgstr ""
+
msgid "Members|%{time} by %{user}"
msgstr ""
@@ -21242,9 +21573,6 @@ msgstr ""
msgid "Members|Expiration date updated successfully."
msgstr ""
-msgid "Members|Expired"
-msgstr ""
-
msgid "Members|Filter members"
msgstr ""
@@ -21260,9 +21588,6 @@ msgstr ""
msgid "Members|Membership"
msgstr ""
-msgid "Members|No expiration set"
-msgstr ""
-
msgid "Members|Remove \"%{groupName}\""
msgstr ""
@@ -21284,9 +21609,6 @@ msgstr ""
msgid "Members|Search invited"
msgstr ""
-msgid "Members|in %{time}"
-msgstr ""
-
msgid "Member|Deny access"
msgstr ""
@@ -21362,9 +21684,6 @@ msgstr ""
msgid "Merge request %{mr_link} was reviewed by %{mr_author}"
msgstr ""
-msgid "Merge request (MR) approvals"
-msgstr ""
-
msgid "Merge request analytics"
msgstr ""
@@ -21386,12 +21705,21 @@ msgstr ""
msgid "Merge requests"
msgstr ""
+msgid "Merge requests I've created"
+msgstr ""
+
msgid "Merge requests are a place to propose changes you've made to a project and discuss those changes with others"
msgstr ""
msgid "Merge requests are read-only in a secondary Geo node"
msgstr ""
+msgid "Merge requests assigned to me"
+msgstr ""
+
+msgid "Merge requests that I'm a reviewer"
+msgstr ""
+
msgid "Merge the branch and fix any conflicts that come up"
msgstr ""
@@ -21452,10 +21780,10 @@ msgstr ""
msgid "MergeRequests|An error occurred while saving the draft comment."
msgstr ""
-msgid "MergeRequests|Failed to squash. Should be done manually."
+msgid "MergeRequests|Create issue to resolve thread"
msgstr ""
-msgid "MergeRequests|Resolve this thread in a new issue"
+msgid "MergeRequests|Failed to squash. Should be done manually."
msgstr ""
msgid "MergeRequests|Saving the comment failed"
@@ -22273,6 +22601,9 @@ msgstr ""
msgid "MoveIssue|Cannot move issue to project it originates from!"
msgstr ""
+msgid "MoveIssue|Cannot move issues of '%{issue_type}' type."
+msgstr ""
+
msgid "Moved issue to %{label} column in the board."
msgstr ""
@@ -22400,6 +22731,15 @@ 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. To learn more about reducing storage capacity please visit our docs."
msgstr ""
+msgid "NamespaceUserCap|Pending users must be reviewed and approved by a group owner. Learn more about %{user_caps_link_start}User Caps%{link_end} and %{users_pending_approval_link_start}Users Pending Approval%{link_end}."
+msgstr ""
+
+msgid "NamespaceUserCap|View pending user approvals"
+msgstr ""
+
+msgid "NamespaceUserCap|Your group has reached its billable member limit"
+msgstr ""
+
msgid "Namespaces"
msgstr ""
@@ -22442,9 +22782,6 @@ msgstr ""
msgid "Network"
msgstr ""
-msgid "Network Policy|New rule"
-msgstr ""
-
msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is inbound from a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
msgstr ""
@@ -22466,16 +22803,13 @@ msgstr ""
msgid "NetworkPolicies|%{strongOpen}any%{strongClose} port"
msgstr ""
-msgid "NetworkPolicies|+ Add alert"
-msgstr ""
-
msgid "NetworkPolicies|.yaml"
msgstr ""
msgid "NetworkPolicies|.yaml mode"
msgstr ""
-msgid "NetworkPolicies|Actions"
+msgid "NetworkPolicies|Add alert"
msgstr ""
msgid "NetworkPolicies|Alerts are intended to be selectively used for a limited number of events that are potentially concerning and warrant a manual review. Alerts should not be used as a substitute for a SIEM or a logging tool. High volume alerts are likely to be dropped so as to preserve the stability of GitLab's integration with Kubernetes."
@@ -22511,9 +22845,6 @@ msgstr ""
msgid "NetworkPolicies|Deny all traffic"
msgstr ""
-msgid "NetworkPolicies|Description"
-msgstr ""
-
msgid "NetworkPolicies|Edit policy"
msgstr ""
@@ -22526,9 +22857,6 @@ msgstr ""
msgid "NetworkPolicies|IP/subnet"
msgstr ""
-msgid "NetworkPolicies|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
-msgstr ""
-
msgid "NetworkPolicies|Invalid or empty policy"
msgstr ""
@@ -22538,19 +22866,16 @@ msgstr ""
msgid "NetworkPolicies|Kubernetes error: %{error}"
msgstr ""
-msgid "NetworkPolicies|Name"
-msgstr ""
-
msgid "NetworkPolicies|Network"
msgstr ""
-msgid "NetworkPolicies|Network traffic"
+msgid "NetworkPolicies|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
msgstr ""
-msgid "NetworkPolicies|New policy"
+msgid "NetworkPolicies|Network policy can be created after the environment is loaded successfully."
msgstr ""
-msgid "NetworkPolicies|No policies detected"
+msgid "NetworkPolicies|Network traffic"
msgstr ""
msgid "NetworkPolicies|None selected"
@@ -22559,21 +22884,12 @@ msgstr ""
msgid "NetworkPolicies|Please %{installLinkStart}install%{installLinkEnd} and %{configureLinkStart}configure a Kubernetes Agent for this project%{configureLinkEnd} to enable alerts."
msgstr ""
-msgid "NetworkPolicies|Policies are a specification of how groups of pods are allowed to communicate with each other's network endpoints."
-msgstr ""
-
msgid "NetworkPolicies|Policy %{policyName} was successfully changed"
msgstr ""
msgid "NetworkPolicies|Policy definition"
msgstr ""
-msgid "NetworkPolicies|Policy editor"
-msgstr ""
-
-msgid "NetworkPolicies|Policy preview"
-msgstr ""
-
msgid "NetworkPolicies|Rule"
msgstr ""
@@ -22583,9 +22899,6 @@ msgstr ""
msgid "NetworkPolicies|Rule mode is unavailable for this policy. In some cases, we cannot parse the YAML file back into the rules editor."
msgstr ""
-msgid "NetworkPolicies|Rules"
-msgstr ""
-
msgid "NetworkPolicies|Save changes"
msgstr ""
@@ -22598,9 +22911,6 @@ msgstr ""
msgid "NetworkPolicies|Traffic that does not match any rule will be blocked."
msgstr ""
-msgid "NetworkPolicies|Unable to parse policy"
-msgstr ""
-
msgid "NetworkPolicies|all DNS names"
msgstr ""
@@ -22782,6 +23092,9 @@ msgstr ""
msgid "New issue"
msgstr ""
+msgid "New issue in %{project}"
+msgstr ""
+
msgid "New issue title"
msgstr ""
@@ -22860,7 +23173,7 @@ msgstr ""
msgid "Newest first"
msgstr ""
-msgid "Newly registered users will by default be external"
+msgid "Newly-registered users are external by default"
msgstr ""
msgid "Next"
@@ -23175,8 +23488,12 @@ msgstr ""
msgid "No webhooks found, add one in the form above."
msgstr ""
-msgid "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} to renew your subscription."
-msgstr ""
+msgid "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} day to renew your subscription."
+msgid_plural "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} days to renew your subscription."
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
msgid "No. of commits"
msgstr ""
@@ -23193,7 +23510,7 @@ msgstr ""
msgid "Nodes"
msgstr ""
-msgid "Non-admin users can sign in with read-only access and make read-only API requests."
+msgid "Non-admin users are restricted to read-only access, in both GitLab UI and API."
msgstr ""
msgid "None"
@@ -23274,7 +23591,7 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
-msgid "Notes Rate Limits"
+msgid "Notes rate limit"
msgstr ""
msgid "Notes|Are you sure you want to cancel creating this comment?"
@@ -23449,9 +23766,6 @@ msgstr ""
msgid "November"
msgstr ""
-msgid "Novice"
-msgstr ""
-
msgid "Now, personalize your GitLab experience"
msgstr ""
@@ -23620,7 +23934,7 @@ msgstr ""
msgid "OnCallSchedules|For this rotation, on-call will be:"
msgstr ""
-msgid "OnCallSchedules|On-call schedule %{schedule} in Project %{project}"
+msgid "OnCallSchedules|On-call schedule %{obstacle} in Project %{project}"
msgstr ""
msgid "OnCallSchedules|On-call schedules"
@@ -23767,22 +24081,22 @@ msgstr ""
msgid "OnDemandScans|Scanner profile"
msgstr ""
-msgid "OnDemandScans|Select one of the existing profiles"
+msgid "OnDemandScans|Schedule scan"
msgstr ""
-msgid "OnDemandScans|Site profile"
+msgid "OnDemandScans|Select one of the existing profiles"
msgstr ""
-msgid "OnDemandScans|Use existing scanner profile"
+msgid "OnDemandScans|Site profile"
msgstr ""
-msgid "OnDemandScans|Use existing site profile"
+msgid "OnDemandScans|Start time"
msgstr ""
-msgid "OnDemandScans|You can either choose a passive scan or validate the target site in your chosen site profile. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
+msgid "OnDemandScans|Use existing scanner profile"
msgstr ""
-msgid "OnDemandScans|You cannot run an active scan against an unvalidated site."
+msgid "OnDemandScans|Use existing site profile"
msgstr ""
msgid "OnDemandScans|You must create a repository within your project to run an on-demand scan."
@@ -23849,6 +24163,9 @@ msgstr ""
msgid "Only admins can delete project"
msgstr ""
+msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
+msgstr ""
+
msgid "Only include features new to your current subscription tier."
msgstr ""
@@ -23867,6 +24184,12 @@ msgstr ""
msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
+msgid "Only reCAPTCHA v2 is supported:"
+msgstr ""
+
+msgid "Only users from the specified IP address ranges are able to reach this group, including all subgroups, projects, and Git repositories."
+msgstr ""
+
msgid "Only verified users with an email address in any of these domains can be added to the group."
msgstr ""
@@ -24053,9 +24376,6 @@ msgstr ""
msgid "Package Registry"
msgstr ""
-msgid "Package Registry Rate Limits"
-msgstr ""
-
msgid "Package Registry: authenticated API requests"
msgstr ""
@@ -24074,6 +24394,9 @@ msgstr ""
msgid "Package recipe already exists"
msgstr ""
+msgid "Package registry rate limits"
+msgstr ""
+
msgid "Package type"
msgstr ""
@@ -24140,6 +24463,9 @@ msgstr ""
msgid "PackageRegistry|Composer"
msgstr ""
+msgid "PackageRegistry|Composer.json with license: %{license} and version: %{version}"
+msgstr ""
+
msgid "PackageRegistry|Conan"
msgstr ""
@@ -24203,6 +24529,9 @@ msgstr ""
msgid "PackageRegistry|Copy require package include"
msgstr ""
+msgid "PackageRegistry|Copy target SHA"
+msgstr ""
+
msgid "PackageRegistry|Copy yarn command"
msgstr ""
@@ -24269,6 +24598,9 @@ msgstr ""
msgid "PackageRegistry|Install package version"
msgstr ""
+msgid "PackageRegistry|Instance-level"
+msgstr ""
+
msgid "PackageRegistry|Invalid Package: failed metadata extraction"
msgstr ""
@@ -24314,6 +24646,9 @@ msgstr ""
msgid "PackageRegistry|Pip Command"
msgstr ""
+msgid "PackageRegistry|Project-level"
+msgstr ""
+
msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
msgstr ""
@@ -24335,6 +24670,9 @@ msgstr ""
msgid "PackageRegistry|Remove package"
msgstr ""
+msgid "PackageRegistry|Required Python: %{pythonVersion}"
+msgstr ""
+
msgid "PackageRegistry|RubyGems"
msgstr ""
@@ -24377,6 +24715,9 @@ msgstr ""
msgid "PackageRegistry|Source project located at %{link}"
msgstr ""
+msgid "PackageRegistry|Target SHA: %{sha}"
+msgstr ""
+
msgid "PackageRegistry|There are no other versions of this package."
msgstr ""
@@ -24545,6 +24886,18 @@ msgstr ""
msgid "Password was successfully updated. Please sign in again."
msgstr ""
+msgid "PasswordPrompt|Confirm password"
+msgstr ""
+
+msgid "PasswordPrompt|Confirm password to continue"
+msgstr ""
+
+msgid "PasswordPrompt|Password is required"
+msgstr ""
+
+msgid "PasswordPrompt|Please enter your password to confirm"
+msgstr ""
+
msgid "Passwords should be unique and not used for any other sites or services."
msgstr ""
@@ -24572,6 +24925,9 @@ msgstr ""
msgid "Paste project path (i.e. gitlab-org/gitlab)"
msgstr ""
+msgid "Paste this DSN into your Sentry SDK"
+msgstr ""
+
msgid "Paste your public SSH key, which is usually contained in the file '~/.ssh/id_ed25519.pub' or '~/.ssh/id_rsa.pub' and begins with 'ssh-ed25519' or 'ssh-rsa'. Do not paste your private SSH key, as that can compromise your identity."
msgstr ""
@@ -24656,6 +25012,9 @@ msgstr ""
msgid "PerformanceBar|First Contentful Paint"
msgstr ""
+msgid "PerformanceBar|Flamegraph with mode:"
+msgstr ""
+
msgid "PerformanceBar|Frontend resources"
msgstr ""
@@ -24689,6 +25048,15 @@ msgstr ""
msgid "PerformanceBar|Trace"
msgstr ""
+msgid "PerformanceBar|cpu"
+msgstr ""
+
+msgid "PerformanceBar|object"
+msgstr ""
+
+msgid "PerformanceBar|wall"
+msgstr ""
+
msgid "Period in seconds"
msgstr ""
@@ -24917,6 +25285,48 @@ msgstr ""
msgid "PipelineSchedules|Variables"
msgstr ""
+msgid "PipelineSource|API"
+msgstr ""
+
+msgid "PipelineSource|Chat"
+msgstr ""
+
+msgid "PipelineSource|External"
+msgstr ""
+
+msgid "PipelineSource|External Pull Request"
+msgstr ""
+
+msgid "PipelineSource|Merge Request"
+msgstr ""
+
+msgid "PipelineSource|On-Demand DAST Scan"
+msgstr ""
+
+msgid "PipelineSource|On-Demand DAST Validation"
+msgstr ""
+
+msgid "PipelineSource|Parent Pipeline"
+msgstr ""
+
+msgid "PipelineSource|Pipeline"
+msgstr ""
+
+msgid "PipelineSource|Push"
+msgstr ""
+
+msgid "PipelineSource|Schedule"
+msgstr ""
+
+msgid "PipelineSource|Trigger"
+msgstr ""
+
+msgid "PipelineSource|Web"
+msgstr ""
+
+msgid "PipelineSource|Web IDE"
+msgstr ""
+
msgid "PipelineStatusTooltip|Pipeline: %{ciStatus}"
msgstr ""
@@ -25217,46 +25627,7 @@ msgstr ""
msgid "Pipeline|Source"
msgstr ""
-msgid "Pipeline|Source|API"
-msgstr ""
-
-msgid "Pipeline|Source|Chat"
-msgstr ""
-
-msgid "Pipeline|Source|External"
-msgstr ""
-
-msgid "Pipeline|Source|External Pull Request"
-msgstr ""
-
-msgid "Pipeline|Source|Merge Request"
-msgstr ""
-
-msgid "Pipeline|Source|On-Demand DAST Scan"
-msgstr ""
-
-msgid "Pipeline|Source|On-Demand DAST Validation"
-msgstr ""
-
-msgid "Pipeline|Source|Parent Pipeline"
-msgstr ""
-
-msgid "Pipeline|Source|Pipeline"
-msgstr ""
-
-msgid "Pipeline|Source|Push"
-msgstr ""
-
-msgid "Pipeline|Source|Schedule"
-msgstr ""
-
-msgid "Pipeline|Source|Trigger"
-msgstr ""
-
-msgid "Pipeline|Source|Web"
-msgstr ""
-
-msgid "Pipeline|Source|Web IDE"
+msgid "Pipeline|Source|Security Policy"
msgstr ""
msgid "Pipeline|Specify variable values to be used in this run. The values specified in %{linkStart}CI/CD settings%{linkEnd} will be used by default."
@@ -25307,7 +25678,7 @@ msgstr ""
msgid "Pipeline|We are currently unable to fetch pipeline data"
msgstr ""
-msgid "Pipeline|You’re about to stop pipeline %{pipelineId}."
+msgid "Pipeline|You’re about to stop pipeline #%{pipelineId}."
msgstr ""
msgid "Pipeline|for"
@@ -25334,6 +25705,9 @@ msgstr ""
msgid "Plain diff"
msgstr ""
+msgid "Plain-text response to send to clients that hit a rate limit"
+msgstr ""
+
msgid "Plan:"
msgstr ""
@@ -25478,9 +25852,6 @@ msgstr ""
msgid "Please provide attributes to update"
msgstr ""
-msgid "Please provide your username or email address."
-msgstr ""
-
msgid "Please reach out if you have any questions and we'll be happy to assist."
msgstr ""
@@ -25523,9 +25894,6 @@ msgstr ""
msgid "Please set a new password before proceeding."
msgstr ""
-msgid "Please share your feedback about %{featureName} %{linkStart}in this issue%{linkEnd} to help us improve the experience."
-msgstr ""
-
msgid "Please solve the captcha"
msgstr ""
@@ -25703,6 +26071,9 @@ msgstr ""
msgid "Prevent adding new members to project membership within this group"
msgstr ""
+msgid "Prevent auto-stopping"
+msgstr ""
+
msgid "Prevent editing approval rules in projects and merge requests."
msgstr ""
@@ -25715,7 +26086,7 @@ msgstr ""
msgid "Prevent users from changing their profile name"
msgstr ""
-msgid "Prevent users from performing write operations on GitLab while performing maintenance."
+msgid "Prevent users from performing write operations while GitLab maintenance is in progress."
msgstr ""
msgid "Preview"
@@ -25988,6 +26359,9 @@ msgstr ""
msgid "Profiles|Enter your name, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Enter your password to confirm the email change"
+msgstr ""
+
msgid "Profiles|Enter your pronouns to let people know how to refer to you"
msgstr ""
@@ -26222,10 +26596,10 @@ msgstr ""
msgid "Profiles|e.g. My MacBook key"
msgstr ""
-msgid "Profiles|username"
+msgid "Profiles|https://website.com"
msgstr ""
-msgid "Profiles|website.com"
+msgid "Profiles|username"
msgstr ""
msgid "Profiles|your account"
@@ -26468,9 +26842,21 @@ msgstr ""
msgid "ProjectSelect| or group"
msgstr ""
+msgid "ProjectSelect|No matching results"
+msgstr ""
+
msgid "ProjectSelect|Search for project"
msgstr ""
+msgid "ProjectSelect|Search projects"
+msgstr ""
+
+msgid "ProjectSelect|Select a project"
+msgstr ""
+
+msgid "ProjectSelect|There was an error fetching the projects. Please try again."
+msgstr ""
+
msgid "ProjectService|Drone server URL"
msgstr ""
@@ -26558,6 +26944,9 @@ msgstr ""
msgid "ProjectService|Trigger event when a new, unique alert is recorded."
msgstr ""
+msgid "ProjectService|Trigger event when a new, unique vulnerability is recorded. (Note: This feature requires an Ultimate plan.)"
+msgstr ""
+
msgid "ProjectService|Trigger event when a pipeline status changes."
msgstr ""
@@ -26972,9 +27361,15 @@ msgstr ""
msgid "Projects are graded based on the highest severity vulnerability present"
msgstr ""
+msgid "Projects are organized into groups"
+msgstr ""
+
msgid "Projects contributed to"
msgstr ""
+msgid "Projects help you organize your work. They contain your file repository, issues, merge requests, and so much more."
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr ""
@@ -27209,10 +27604,10 @@ msgstr ""
msgid "PrometheusService|Prometheus cluster integration"
msgstr ""
-msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
+msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
msgstr ""
-msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
+msgid "PrometheusService|The ID of the IAP-secured resource."
msgstr ""
msgid "PrometheusService|The Prometheus API base URL."
@@ -27830,6 +28225,9 @@ msgstr ""
msgid "Rate limit"
msgstr ""
+msgid "Rate limits can help reduce request volume (like from crawlers or abusive bots)."
+msgstr ""
+
msgid "Raw blob request rate limit per minute"
msgstr ""
@@ -27842,6 +28240,9 @@ msgstr ""
msgid "Re-authentication required"
msgstr ""
+msgid "Re-import"
+msgstr ""
+
msgid "Re-request review"
msgstr ""
@@ -27863,6 +28264,9 @@ msgstr ""
msgid "Read more about related issues"
msgstr ""
+msgid "Read their documentation."
+msgstr ""
+
msgid "Ready to get started with GitLab? Follow these steps to set up your workspace, plan and commit changes, and deploy your project."
msgstr ""
@@ -27896,6 +28300,9 @@ msgstr ""
msgid "Receive any notifications from GitLab."
msgstr ""
+msgid "Receive notification of abuse reports by email."
+msgstr ""
+
msgid "Receive notifications about your own activity"
msgstr ""
@@ -28041,9 +28448,6 @@ msgstr ""
msgid "Registry setup"
msgstr ""
-msgid "Regulate approvals by authors/committers. Affects all projects."
-msgstr ""
-
msgid "Reindexing Status: %{status} (Slice multiplier: %{multiplier}, Maximum running slices: %{max_slices})"
msgstr ""
@@ -28141,6 +28545,9 @@ msgstr ""
msgid "Release|Something went wrong while saving the release details."
msgstr ""
+msgid "Reload page"
+msgstr ""
+
msgid "Remediations"
msgstr ""
@@ -28423,6 +28830,9 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
+msgid "Repeats"
+msgstr ""
+
msgid "Replace"
msgstr ""
@@ -28793,10 +29203,7 @@ msgstr ""
msgid "Require additional authentication for administrative tasks."
msgstr ""
-msgid "Require all users in this group to setup Two-factor authentication"
-msgstr ""
-
-msgid "Require all users in this group to setup two-factor authentication"
+msgid "Require all users in this group to set up two-factor authentication"
msgstr ""
msgid "Required approvals (%{approvals_given} given)"
@@ -28846,6 +29253,9 @@ msgstr[3] ""
msgid "Requires values to meet regular expression requirements."
msgstr ""
+msgid "Requires you to deploy or set up cloud-hosted Sentry."
+msgstr ""
+
msgid "Requires your primary GitLab email address."
msgstr ""
@@ -28906,9 +29316,6 @@ msgstr ""
msgid "Resolve"
msgstr ""
-msgid "Resolve all threads in new issue"
-msgstr ""
-
msgid "Resolve conflicts"
msgstr ""
@@ -28966,6 +29373,9 @@ msgstr ""
msgid "Response text"
msgstr ""
+msgid "Restart GitLab to apply changes."
+msgstr ""
+
msgid "Restart Terminal"
msgstr ""
@@ -28984,6 +29394,9 @@ msgstr ""
msgid "Restoring the project will prevent the project from being removed on this date and restore people's ability to make changes to it."
msgstr ""
+msgid "Restrict group access by IP address. %{link_start}Learn more%{link_end}."
+msgstr ""
+
msgid "Restrict membership by email domain"
msgstr ""
@@ -29301,6 +29714,9 @@ msgstr ""
msgid "Runners|Runner #%{runner_id}"
msgstr ""
+msgid "Runners|Runner assigned to project."
+msgstr ""
+
msgid "Runners|Runner is offline, last contact was %{runner_contact} ago"
msgstr ""
@@ -29313,6 +29729,9 @@ msgstr ""
msgid "Runners|Runner registration"
msgstr ""
+msgid "Runners|Runner unassigned from project."
+msgstr ""
+
msgid "Runners|Runners"
msgstr ""
@@ -29505,7 +29924,7 @@ msgstr ""
msgid "SastEntryPoints|How do I set up SAST?"
msgstr ""
-msgid "SastEntryPoints|Learn more."
+msgid "SastEntryPoints|Learn more"
msgstr ""
msgid "Satisfied"
@@ -29547,7 +29966,7 @@ msgstr ""
msgid "Save pipeline schedule"
msgstr ""
-msgid "Save space and find images in the container Registry. remove unneeded tags and keep only the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
+msgid "Save storage space by automatically deleting tags from the container registry and keeping the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
msgstr ""
msgid "Saving"
@@ -29721,6 +30140,9 @@ msgstr ""
msgid "Search or filter results…"
msgstr ""
+msgid "Search or jump to..."
+msgstr ""
+
msgid "Search project"
msgstr ""
@@ -29781,16 +30203,16 @@ msgstr ""
msgid "SearchCodeResults|of %{link_to_project}"
msgstr ""
-msgid "SearchResults|Showing %{count} %{scope} for%{term_element}"
+msgid "SearchResults|Showing %{count} %{scope} for %{term_element}"
msgstr ""
-msgid "SearchResults|Showing %{count} %{scope} for%{term_element} in your personal and project snippets"
+msgid "SearchResults|Showing %{count} %{scope} for %{term_element} in your personal and project snippets"
msgstr ""
-msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for%{term_element}"
+msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for %{term_element}"
msgstr ""
-msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for%{term_element} in your personal and project snippets"
+msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for %{term_element} in your personal and project snippets"
msgstr ""
msgid "SearchResults|code result"
@@ -29894,6 +30316,9 @@ msgstr ""
msgid "Secret Detection"
msgstr ""
+msgid "Secret access key"
+msgstr ""
+
msgid "Secret token"
msgstr ""
@@ -29933,9 +30358,6 @@ msgstr ""
msgid "SecurityApprovals|A merge request approval is required when the license compliance report contains a denied license."
msgstr ""
-msgid "SecurityApprovals|Configurable if security scanners are enabled. %{linkStart}Learn more.%{linkEnd}"
-msgstr ""
-
msgid "SecurityApprovals|Coverage-Check"
msgstr ""
@@ -29948,24 +30370,18 @@ msgstr ""
msgid "SecurityApprovals|Learn more about Vulnerability-Check"
msgstr ""
-msgid "SecurityApprovals|License Scanning must be enabled. %{linkStart}Learn more%{linkEnd}."
-msgstr ""
-
msgid "SecurityApprovals|License-Check"
msgstr ""
msgid "SecurityApprovals|Requires approval for Denied licenses. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}More information%{linkEnd}"
+msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "SecurityApprovals|Requires approval for vulnerabilities. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
-msgid "SecurityApprovals|Test coverage must be enabled. %{linkStart}Learn more%{linkEnd}."
-msgstr ""
-
msgid "SecurityApprovals|Vulnerability-Check"
msgstr ""
@@ -30029,6 +30445,12 @@ msgstr ""
msgid "SecurityConfiguration|Immediately begin risk analysis and remediation with application security features. Start with SAST and Secret Detection, available to all plans. Upgrade to Ultimate to get all features, including:"
msgstr ""
+msgid "SecurityConfiguration|Manage corpus"
+msgstr ""
+
+msgid "SecurityConfiguration|Manage corpus files used as mutation sources in coverage fuzzing."
+msgstr ""
+
msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
msgstr ""
@@ -30083,6 +30505,12 @@ msgstr ""
msgid "SecurityOrchestration|Action"
msgstr ""
+msgid "SecurityOrchestration|Actions"
+msgstr ""
+
+msgid "SecurityOrchestration|Add rule"
+msgstr ""
+
msgid "SecurityOrchestration|All policies"
msgstr ""
@@ -30116,9 +30544,6 @@ msgstr ""
msgid "SecurityOrchestration|Network"
msgstr ""
-msgid "SecurityOrchestration|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
-msgstr ""
-
msgid "SecurityOrchestration|New policy"
msgstr ""
@@ -30134,6 +30559,9 @@ msgstr ""
msgid "SecurityOrchestration|Policy editor"
msgstr ""
+msgid "SecurityOrchestration|Policy preview"
+msgstr ""
+
msgid "SecurityOrchestration|Policy status"
msgstr ""
@@ -30143,6 +30571,9 @@ msgstr ""
msgid "SecurityOrchestration|Rule"
msgstr ""
+msgid "SecurityOrchestration|Rules"
+msgstr ""
+
msgid "SecurityOrchestration|Scan Execution"
msgstr ""
@@ -30236,6 +30667,9 @@ msgstr ""
msgid "SecurityReports|Create issue"
msgstr ""
+msgid "SecurityReports|Development vulnerabilities"
+msgstr ""
+
msgid "SecurityReports|Dismiss vulnerability"
msgstr ""
@@ -30251,6 +30685,9 @@ msgstr ""
msgid "SecurityReports|Download results"
msgstr ""
+msgid "SecurityReports|Download scanned URLs"
+msgstr ""
+
msgid "SecurityReports|Download scanned resources"
msgstr ""
@@ -30374,6 +30811,9 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
+msgid "SecurityReports|The Vulnerability Report shows the results of the lastest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "SecurityReports|The security reports below contain one or more vulnerability findings that could not be parsed and were not recorded. Download the artifacts in the job output to investigate. Ensure any security report created conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
msgstr ""
@@ -30515,10 +30955,10 @@ msgstr ""
msgid "Select a repository"
msgstr ""
-msgid "Select a role"
+msgid "Select a repository containing templates for common files."
msgstr ""
-msgid "Select a shared template repository for all projects on this instance."
+msgid "Select a role"
msgstr ""
msgid "Select a template repository"
@@ -30596,6 +31036,9 @@ msgstr ""
msgid "Select project to choose zone"
msgstr ""
+msgid "Select project to create issue"
+msgstr ""
+
msgid "Select projects"
msgstr ""
@@ -30713,6 +31156,9 @@ msgstr ""
msgid "Send emails to help guide new users through the onboarding process."
msgstr ""
+msgid "Send emails to users upon account deactivation."
+msgstr ""
+
msgid "Send message"
msgstr ""
@@ -30731,6 +31177,9 @@ msgstr ""
msgid "Send service data"
msgstr ""
+msgid "Sentry"
+msgstr ""
+
msgid "Sentry API URL"
msgstr ""
@@ -30845,6 +31294,9 @@ msgstr ""
msgid "Service"
msgstr ""
+msgid "Service Accounts keys are required to authorize GitLab to deploy your Google Cloud project."
+msgstr ""
+
msgid "Service Desk"
msgstr ""
@@ -30917,15 +31369,15 @@ msgstr ""
msgid "Set a password on your account to pull or push via %{protocol}."
msgstr ""
-msgid "Set a template repository for projects in this group"
-msgstr ""
-
msgid "Set access permissions for this token."
msgstr ""
msgid "Set an instance-wide domain that will be available to all clusters when installing Knative."
msgstr ""
+msgid "Set any rate limit to %{code_open}0%{code_close} to disable the limit."
+msgstr ""
+
msgid "Set default and restrict visibility levels. Configure import sources and git access protocol."
msgstr ""
@@ -30938,7 +31390,7 @@ msgstr ""
msgid "Set limit to 0 to allow any file size."
msgstr ""
-msgid "Set max session time for web terminal."
+msgid "Set limits for web and API requests."
msgstr ""
msgid "Set milestone"
@@ -30947,15 +31399,18 @@ msgstr ""
msgid "Set new password"
msgstr ""
-msgid "Set notification email for abuse reports."
+msgid "Set parent epic to an epic"
msgstr ""
-msgid "Set parent epic to an epic"
+msgid "Set per-user rate limits for imports and exports of projects and groups."
msgstr ""
msgid "Set projects and maximum size limits, session duration, user options, and check feature availability for namespace plan."
msgstr ""
+msgid "Set rate limits for package registry API requests that supersede the general user and IP rate limits."
+msgstr ""
+
msgid "Set severity"
msgstr ""
@@ -30974,15 +31429,24 @@ msgstr ""
msgid "Set the default branch for this project. All merge requests and commits are made against this branch unless you specify a different one."
msgstr ""
+msgid "Set the default expiration time for job artifacts in all projects. Set to %{code_open}0%{code_close} to never expire artifacts by default. If no unit is written, it defaults to seconds. For example, these are all equivalent: %{code_open}3600%{code_close}, %{code_open}60 minutes%{code_close}, or %{code_open}one hour%{code_close}."
+msgstr ""
+
msgid "Set the due date to %{due_date}."
msgstr ""
msgid "Set the iteration to %{iteration_reference}."
msgstr ""
+msgid "Set the maximum session time for a web terminal."
+msgstr ""
+
msgid "Set the milestone to %{milestone_reference}."
msgstr ""
+msgid "Set the per-user rate limit for notes created by web or API requests."
+msgstr ""
+
msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
msgstr ""
@@ -31184,6 +31648,9 @@ msgstr ""
msgid "Show Pipeline IID"
msgstr ""
+msgid "Show all %{issuable_type}."
+msgstr ""
+
msgid "Show all activity"
msgstr ""
@@ -31235,15 +31702,9 @@ msgstr ""
msgid "Show list"
msgstr ""
-msgid "Show me advanced features"
-msgstr ""
-
msgid "Show me how to add a pipeline"
msgstr ""
-msgid "Show me the basics"
-msgstr ""
-
msgid "Show one file at a time"
msgstr ""
@@ -31288,15 +31749,15 @@ msgstr ""
msgid "Showing %{pageSize} of %{total} %{issuableType}"
msgstr ""
-msgid "Showing %{pageSize} of %{total} issues"
-msgstr ""
-
msgid "Showing all epics"
msgstr ""
msgid "Showing all issues"
msgstr ""
+msgid "Showing data for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
+msgstr ""
+
msgid "Showing data for workflow items created in this date range. Date range cannot exceed %{maxDateRange} days."
msgstr ""
@@ -31336,6 +31797,15 @@ msgstr ""
msgid "Sidebar|Weight"
msgstr ""
+msgid "Sidekiq job compression threshold (bytes)"
+msgstr ""
+
+msgid "Sidekiq job size limit (bytes)"
+msgstr ""
+
+msgid "Sidekiq job size limits"
+msgstr ""
+
msgid "Sign in"
msgstr ""
@@ -31456,6 +31926,9 @@ msgstr ""
msgid "Site profile not found for given parameters"
msgstr ""
+msgid "Sites"
+msgstr ""
+
msgid "Size"
msgstr ""
@@ -31486,19 +31959,22 @@ msgstr ""
msgid "SlackIntegration|Sends notifications about project events to Slack channels."
msgstr ""
-msgid "SlackService|2. Paste the %{strong_open}Token%{strong_close} into the field below"
+msgid "SlackService|1. %{slash_command_link_start}Add a slash command%{slash_command_link_end} in your Slack team using this information:"
msgstr ""
-msgid "SlackService|3. Select the %{strong_open}Active%{strong_close} checkbox, press %{strong_open}Save changes%{strong_close} and start using GitLab inside Slack!"
+msgid "SlackService|2. Paste the token from Slack in the %{strong_open}Token%{strong_close} field below."
msgstr ""
-msgid "SlackService|Fill in the word that works best for your team."
+msgid "SlackService|3. Select the %{strong_open}Active%{strong_close} checkbox, select %{strong_open}Save changes%{strong_close}, and start using slash commands in Slack!"
+msgstr ""
+
+msgid "SlackService|After setup, get a list of available Slack slash commands by entering"
msgstr ""
-msgid "SlackService|See list of available commands in Slack after setting up this service, by entering"
+msgid "SlackService|Fill in the word that works best for your team."
msgstr ""
-msgid "SlackService|This service allows users to perform common operations on this project by entering slash commands in Slack."
+msgid "SlackService|Perform common operations in this project by entering slash commands in Slack."
msgstr ""
msgid "Slice multiplier"
@@ -31564,7 +32040,7 @@ msgstr ""
msgid "Some child epics may be hidden due to applied filters"
msgstr ""
-msgid "Some common domains are not allowed. %{read_more_link}."
+msgid "Some common domains are not allowed. %{learn_more_link}."
msgstr ""
msgid "Some of the designs you tried uploading did not change:"
@@ -31648,9 +32124,6 @@ msgstr ""
msgid "Something went wrong while exporting requirements"
msgstr ""
-msgid "Something went wrong while fetching %{listType} list"
-msgstr ""
-
msgid "Something went wrong while fetching branches"
msgstr ""
@@ -31705,15 +32178,9 @@ msgstr ""
msgid "Something went wrong while merging this merge request. Please try again."
msgstr ""
-msgid "Something went wrong while moving issues."
-msgstr ""
-
msgid "Something went wrong while obtaining the Let's Encrypt certificate."
msgstr ""
-msgid "Something went wrong while performing the action."
-msgstr ""
-
msgid "Something went wrong while promoting the issue to an epic. Please try again."
msgstr ""
@@ -32041,7 +32508,10 @@ msgstr ""
msgid "SourcegraphPreferences|Uses a custom %{linkStart}Sourcegraph instance%{linkEnd}."
msgstr ""
-msgid "Spam Check API Key"
+msgid "Spam Check"
+msgstr ""
+
+msgid "Spam Check API key"
msgstr ""
msgid "Spam Logs"
@@ -32059,7 +32529,7 @@ msgstr ""
msgid "Specified URL cannot be used: \"%{reason}\""
msgstr ""
-msgid "Specify an e-mail address regex pattern to identify default internal users."
+msgid "Specify an email address regex pattern to identify default internal users."
msgstr ""
msgid "Speed up your pipelines with Needs relationships"
@@ -32314,7 +32784,7 @@ msgstr ""
msgid "StatusCheck|An error occurred fetching the status checks."
msgstr ""
-msgid "StatusCheck|Apply this status check to any branch or a specific protected branch."
+msgid "StatusCheck|Apply this status check to all branches or a specific protected branch."
msgstr ""
msgid "StatusCheck|Check for a status response in Merge Requests. Failures do not block merges. %{link_start}Learn more%{link_end}."
@@ -32653,6 +33123,9 @@ msgstr ""
msgid "Subscriptions"
msgstr ""
+msgid "Subscription|Your subscription for %{strong}%{namespace_name}%{strong_close} has expired and you are now on %{pricing_link_start}the GitLab Free tier%{pricing_link_end}. Don't worry, your data is safe. Get in touch with our support team (%{support_email}). They'll gladly help with your subscription renewal."
+msgstr ""
+
msgid "Subtracted"
msgstr ""
@@ -32881,6 +33354,9 @@ msgstr ""
msgid "SuperSonics|Plan"
msgstr ""
+msgid "SuperSonics|Please agree to the Subscription Agreement"
+msgstr ""
+
msgid "SuperSonics|Ready to get started? A GitLab plan is ideal for scaling organizations and for multi team usage."
msgstr ""
@@ -32911,6 +33387,9 @@ msgstr ""
msgid "SuperSonics|The activation code is not valid. Please make sure to copy it exactly from the Customers Portal or confirmation email. Learn more about %{linkStart}activating your subscription%{linkEnd}."
msgstr ""
+msgid "SuperSonics|The activation code should be a 24-character alphanumeric string"
+msgstr ""
+
msgid "SuperSonics|There is a connectivity issue."
msgstr ""
@@ -32953,9 +33432,15 @@ msgstr ""
msgid "SuperSonics|You do not have an active subscription"
msgstr ""
+msgid "SuperSonics|You have successfully added a license that activates on %{date}. Please see the subscription history table below for more details."
+msgstr ""
+
msgid "SuperSonics|You'll be charged for %{trueUpLinkStart}users over license%{trueUpLinkEnd} on a quarterly or annual basis, depending on the terms of your agreement."
msgstr ""
+msgid "SuperSonics|Your future dated license was successfully added"
+msgstr ""
+
msgid "SuperSonics|Your subscription"
msgstr ""
@@ -33208,7 +33693,7 @@ msgstr ""
msgid "Template to append to all Service Desk issues"
msgstr ""
-msgid "TemplateRepository|Select a repository to make its templates available to all projects. %{link_start}What should the repository contain?%{link_end} "
+msgid "TemplateRepository|Create common files more quickly, and standardize their format."
msgstr ""
msgid "Templates"
@@ -33422,7 +33907,7 @@ msgstr ""
msgid "TestCases|Search test cases"
msgstr ""
-msgid "TestCases|Something went wrong while adding test case to Todo."
+msgid "TestCases|Something went wrong while adding test case to a to-do item."
msgstr ""
msgid "TestCases|Something went wrong while creating a test case."
@@ -33434,7 +33919,7 @@ msgstr ""
msgid "TestCases|Something went wrong while fetching test cases list."
msgstr ""
-msgid "TestCases|Something went wrong while marking test case todo as done."
+msgid "TestCases|Something went wrong while marking test case to-do item as done."
msgstr ""
msgid "TestCases|Something went wrong while moving test case."
@@ -33554,7 +34039,7 @@ msgstr ""
msgid "Thanks for your purchase!"
msgstr ""
-msgid "That is ok, I do not want to renew"
+msgid "That's OK, I don't want to renew"
msgstr ""
msgid "That's it, well done!"
@@ -33579,7 +34064,7 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-msgid "The API key used by GitLab for accessing the Spam Check service endpoint"
+msgid "The API key used by GitLab for accessing the Spam Check service endpoint."
msgstr ""
msgid "The GitLab subscription service (customers.gitlab.com) is currently experiencing an outage. You can monitor the status and get updates at %{linkStart}status.gitlab.com%{linkEnd}."
@@ -33618,9 +34103,6 @@ msgstr ""
msgid "The URL to use for connecting to Elasticsearch. Use a comma-separated list to support clustering (e.g., \"http://localhost:9200, http://localhost:9201\")."
msgstr ""
-msgid "The Vulnerability Report shows the results of the last successful pipeline run on the default branch."
-msgstr ""
-
msgid "The X509 Certificate to use when mutual TLS is required to communicate with the external authorization service. If left blank, the server certificate is still validated when accessing over HTTPS."
msgstr ""
@@ -33678,9 +34160,6 @@ msgstr ""
msgid "The default branch for this project has been changed. Please update your bookmarks."
msgstr ""
-msgid "The default expiration time for job artifacts. 0 for unlimited. The default unit is in seconds, but you can use other units, for example %{code_open}4 mins 2 sec%{code_close}, %{code_open}2h42min%{code_close}."
-msgstr ""
-
msgid "The dependency list details information about the components used within your project."
msgstr ""
@@ -33874,9 +34353,6 @@ msgstr ""
msgid "The merge conflicts for this merge request have already been resolved. Please return to the merge request."
msgstr ""
-msgid "The merge request can now be merged."
-msgstr ""
-
msgid "The metric must be one of %{metrics}."
msgstr ""
@@ -34252,7 +34728,7 @@ msgstr ""
msgid "There was a problem updating the keep latest artifacts setting."
msgstr ""
-msgid "There was an error %{message} todo."
+msgid "There was an error %{message} to-do item."
msgstr ""
msgid "There was an error adding a To Do."
@@ -34291,6 +34767,9 @@ msgstr ""
msgid "There was an error fetching projects"
msgstr ""
+msgid "There was an error fetching search autocomplete suggestions"
+msgstr ""
+
msgid "There was an error fetching stage total counts"
msgstr ""
@@ -34615,6 +35094,9 @@ msgstr ""
msgid "This field is required."
msgstr ""
+msgid "This form is disabled in preview"
+msgstr ""
+
msgid "This group"
msgstr ""
@@ -34636,9 +35118,6 @@ msgstr ""
msgid "This group is linked to a subscription"
msgstr ""
-msgid "This group, including all subgroups, projects and git repositories, will be reachable from only the specified IP address ranges."
-msgstr ""
-
msgid "This group, its subgroups and projects has been scheduled for removal on %{date}."
msgstr ""
@@ -34918,9 +35397,6 @@ msgstr ""
msgid "This user cannot be unlocked manually from GitLab"
msgstr ""
-msgid "This user does not have a pending request"
-msgstr ""
-
msgid "This user has an unconfirmed email address (%{email}). You may force a confirmation."
msgstr ""
@@ -35029,9 +35505,6 @@ msgstr ""
msgid "ThreatMonitoring|Packet Activity"
msgstr ""
-msgid "ThreatMonitoring|Policies"
-msgstr ""
-
msgid "ThreatMonitoring|Requests"
msgstr ""
@@ -35083,6 +35556,12 @@ msgstr ""
msgid "ThreatMonitoring|View documentation"
msgstr ""
+msgid "Threshold in bytes at which to compress Sidekiq job arguments."
+msgstr ""
+
+msgid "Threshold in bytes at which to reject Sidekiq jobs. Set this to 0 to if you don't want to limit Sidekiq jobs."
+msgstr ""
+
msgid "Throughput"
msgstr ""
@@ -35092,6 +35571,9 @@ msgstr ""
msgid "Time"
msgstr ""
+msgid "Time (in hours) that users are allowed to skip forced configuration of two-factor authentication."
+msgstr ""
+
msgid "Time Spent"
msgstr ""
@@ -35158,7 +35640,7 @@ msgstr ""
msgid "TimeTrackingEstimated|Est"
msgstr ""
-msgid "TimeTracking|%{startTag}Spent: %{endTag}%{timeSpentHumanReadable}"
+msgid "TimeTracking|%{spentStart}Spent: %{spentEnd}"
msgstr ""
msgid "TimeTracking|Estimated:"
@@ -35376,6 +35858,9 @@ msgstr ""
msgid "To access this domain create a new DNS record"
msgstr ""
+msgid "To add a custom suffix, set up a Service Desk email address. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "To add an SSH key you need to %{generate_link_start}generate one%{link_end} or use an %{existing_link_start}existing key%{link_end}."
msgstr ""
@@ -35397,13 +35882,16 @@ msgstr ""
msgid "To connect an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To continue using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
+msgstr ""
+
msgid "To continue, you need to select the link in the confirmation email we sent to verify your email address. If you didn't get our email, select %{strongStart}Resend confirmation email.%{strongEnd}"
msgstr ""
msgid "To define internal users, first enable new users set to external"
msgstr ""
-msgid "To enable Registration Features, make sure \"Enable service ping\" is checked."
+msgid "To enable Registration Features, first enable Service Ping."
msgstr ""
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
@@ -35430,7 +35918,7 @@ msgstr ""
msgid "To get started, use the link below to confirm your account."
msgstr ""
-msgid "To help improve GitLab and its user experience, GitLab will periodically collect usage information."
+msgid "To help improve GitLab and its user experience, GitLab periodically collects usage information."
msgstr ""
msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
@@ -35463,7 +35951,7 @@ msgstr ""
msgid "To preserve performance only %{strong_open}%{display_size} of %{real_size}%{strong_close} files are displayed."
msgstr ""
-msgid "To protect this issue's confidentiality, %{forkLink} and set the fork's visibility to private."
+msgid "To protect this issue's confidentiality, %{linkStart}fork this project%{linkEnd} and set the fork's visibility to private."
msgstr ""
msgid "To protect this issue's confidentiality, a private fork of this project was selected."
@@ -35496,12 +35984,15 @@ msgstr ""
msgid "To set up SAML authentication for your group through an identity provider like Azure, Okta, Onelogin, Ping Identity, or your custom SAML 2.0 provider:"
msgstr ""
-msgid "To set up this service:"
+msgid "To set up this integration:"
msgstr ""
msgid "To specify the notification level per project of a group you belong to, you need to visit project page and change notification level there."
msgstr ""
+msgid "To start using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
+msgstr ""
+
msgid "To unsubscribe from this issue, please paste the following link into your browser:"
msgstr ""
@@ -36091,9 +36582,6 @@ msgstr ""
msgid "Unable to fetch branches list, please close the form and try again"
msgstr ""
-msgid "Unable to fetch unscanned projects"
-msgstr ""
-
msgid "Unable to fetch vulnerable projects"
msgstr ""
@@ -36148,6 +36636,15 @@ msgstr ""
msgid "Unable to update this issue at this time."
msgstr ""
+msgid "Unapprove a merge request"
+msgstr ""
+
+msgid "Unapprove the current merge request."
+msgstr ""
+
+msgid "Unapproved the current merge request."
+msgstr ""
+
msgid "Unarchive project"
msgstr ""
@@ -36160,16 +36657,13 @@ msgstr ""
msgid "Unassigned"
msgstr ""
-msgid "Unauthenticated API request rate limit"
-msgstr ""
-
-msgid "Unauthenticated rate limit period in seconds"
+msgid "Unauthenticated API rate limit period in seconds"
msgstr ""
-msgid "Unauthenticated request rate limit"
+msgid "Unauthenticated requests"
msgstr ""
-msgid "Unauthenticated requests"
+msgid "Unauthenticated web rate limit period in seconds"
msgstr ""
msgid "Undo"
@@ -36271,18 +36765,6 @@ msgstr ""
msgid "Unresolved"
msgstr ""
-msgid "UnscannedProjects|15 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|30 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|5 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|60 or more days"
-msgstr ""
-
msgid "Unschedule job"
msgstr ""
@@ -36502,6 +36984,9 @@ msgstr ""
msgid "UsageQuota|%{help_link_start}Shared runners%{help_link_end} are disabled, so there are no limits set on pipeline usage"
msgstr ""
+msgid "UsageQuota|%{linkTitle} help link"
+msgstr ""
+
msgid "UsageQuota|%{percentageLeft} of purchased storage is available"
msgstr ""
@@ -36511,6 +36996,9 @@ msgstr ""
msgid "UsageQuota|Artifacts is a sum of build and pipeline artifacts."
msgstr ""
+msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
+msgstr ""
+
msgid "UsageQuota|Buy additional minutes"
msgstr ""
@@ -36520,9 +37008,21 @@ msgstr ""
msgid "UsageQuota|CI minutes usage by project"
msgstr ""
+msgid "UsageQuota|Code packages and container images."
+msgstr ""
+
msgid "UsageQuota|Current period usage"
msgstr ""
+msgid "UsageQuota|File attachments and smaller design graphics."
+msgstr ""
+
+msgid "UsageQuota|Git repository, managed by the Gitaly service."
+msgstr ""
+
+msgid "UsageQuota|Includes project registry, artifacts, packages, wiki, uploads and other items."
+msgstr ""
+
msgid "UsageQuota|Increase storage temporarily"
msgstr ""
@@ -36541,6 +37041,9 @@ msgstr ""
msgid "UsageQuota|Packages"
msgstr ""
+msgid "UsageQuota|Pipeline artifacts and job artifacts, created with CI/CD."
+msgstr ""
+
msgid "UsageQuota|Pipelines"
msgstr ""
@@ -36559,6 +37062,9 @@ msgstr ""
msgid "UsageQuota|Seats"
msgstr ""
+msgid "UsageQuota|Shared bits of code and text."
+msgstr ""
+
msgid "UsageQuota|Snippets"
msgstr ""
@@ -36568,6 +37074,12 @@ msgstr ""
msgid "UsageQuota|Storage"
msgstr ""
+msgid "UsageQuota|Storage type"
+msgstr ""
+
+msgid "UsageQuota|There is a known issue with Artifact storage where the total could be incorrect for some projects. More details and progress are available in %{warningLinkStart}the epic%{warningLinkEnd}."
+msgstr ""
+
msgid "UsageQuota|This is the total amount of storage used across your projects within this namespace."
msgstr ""
@@ -36607,6 +37119,9 @@ msgstr ""
msgid "UsageQuota|Usage"
msgstr ""
+msgid "UsageQuota|Usage Breakdown"
+msgstr ""
+
msgid "UsageQuota|Usage Quotas"
msgstr ""
@@ -36631,6 +37146,9 @@ msgstr ""
msgid "UsageQuota|Wiki"
msgstr ""
+msgid "UsageQuota|Wiki content."
+msgstr ""
+
msgid "UsageQuota|Wikis"
msgstr ""
@@ -36847,7 +37365,10 @@ msgstr ""
msgid "User Settings"
msgstr ""
-msgid "User and IP Rate Limits"
+msgid "User and IP rate limits"
+msgstr ""
+
+msgid "User does not have a pending request"
msgstr ""
msgid "User identity was successfully created."
@@ -37144,6 +37665,9 @@ msgstr ""
msgid "Users can launch a development environment from a GitLab browser tab when the %{linkStart}Gitpod%{linkEnd} integration is enabled."
msgstr ""
+msgid "Users can reactivate their account by signing in."
+msgstr ""
+
msgid "Users can render diagrams in AsciiDoc, Markdown, reStructuredText, and Textile documents using Kroki."
msgstr ""
@@ -37159,6 +37683,9 @@ msgstr ""
msgid "Users requesting access to"
msgstr ""
+msgid "Users to exclude from the rate limit"
+msgstr ""
+
msgid "Users were successfully added."
msgstr ""
@@ -37180,6 +37707,9 @@ msgstr ""
msgid "UsersSelect|Unassigned"
msgstr ""
+msgid "Uses GitLab as a lightweight alternative to Sentry."
+msgstr ""
+
msgid "Using %{code_start}::%{code_end} denotes a %{link_start}scoped label set%{link_end}"
msgstr ""
@@ -37210,10 +37740,7 @@ msgstr ""
msgid "Value Stream Analytics can help you determine your team’s velocity"
msgstr ""
-msgid "Value Stream Analytics gives an overview of how much time it takes to go from idea to production in your project."
-msgstr ""
-
-msgid "Value may contain a variable reference"
+msgid "Value might contain a variable reference"
msgstr ""
msgid "Value stream"
@@ -37279,10 +37806,10 @@ msgstr ""
msgid "ValueStream|The Default Value Stream cannot be deleted"
msgstr ""
-msgid "Variable"
+msgid "Values that contain the %{codeStart}$%{codeEnd} character can be considered a variable reference and expanded. %{docsLinkStart}Learn more.%{docsLinkEnd}"
msgstr ""
-msgid "Variable references indicated by %{codeStart}$%{codeEnd} may be expanded. If this is not what you want, consider %{docsLinkStart}using a workaround to prevent expansion%{docsLinkEnd}."
+msgid "Variable"
msgstr ""
msgid "Variable will be masked in job logs."
@@ -37693,6 +38220,9 @@ msgstr ""
msgid "Vulnerability|Evidence"
msgstr ""
+msgid "Vulnerability|False positive detected"
+msgstr ""
+
msgid "Vulnerability|File"
msgstr ""
@@ -37735,6 +38265,9 @@ msgstr ""
msgid "Vulnerability|Status"
msgstr ""
+msgid "Vulnerability|The scanner determined this vulnerability to be a false positive. Verify the evaluation before changing its status. %{linkStart}Learn more about false positive detection.%{linkEnd}"
+msgstr ""
+
msgid "Vulnerability|The unmodified response is the original response that had no mutations done to the request"
msgstr ""
@@ -38059,9 +38592,6 @@ msgstr ""
msgid "Welcome to GitLab,%{br_tag}%{name}!"
msgstr ""
-msgid "Welcome to the guided GitLab tour"
-msgstr ""
-
msgid "Welcome, %{name}!"
msgstr ""
@@ -38080,9 +38610,6 @@ msgstr ""
msgid "What are you searching for?"
msgstr ""
-msgid "What describes you best?"
-msgstr ""
-
msgid "What does this command do?"
msgstr ""
@@ -38104,13 +38631,13 @@ msgstr ""
msgid "What is your job title? (optional)"
msgstr ""
-msgid "What will you use this group for?"
+msgid "What templates can I create?"
msgstr ""
-msgid "What's new"
+msgid "What will you use this group for?"
msgstr ""
-msgid "What’s your experience level?"
+msgid "What's new"
msgstr ""
msgid "When a deployment job is successful, skip older deployment jobs that are still pending."
@@ -38122,6 +38649,9 @@ msgstr ""
msgid "When an event in GitLab triggers a webhook, you can use the request details to figure out if something went wrong."
msgstr ""
+msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+msgstr ""
+
msgid "When inactive, an external authentication provider must be used."
msgstr ""
@@ -38147,6 +38677,9 @@ msgstr ""
msgid "When:"
msgstr ""
+msgid "Which API requests are affected?"
+msgstr ""
+
msgid "While it's rare to have no vulnerabilities, it can happen. In any event, we ask that you please double check your settings to make sure you've set up your dashboard correctly."
msgstr ""
@@ -38426,6 +38959,9 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|Work Items"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -38501,6 +39037,9 @@ msgstr ""
msgid "You are already a member of this %{member_source}."
msgstr ""
+msgid "You are already impersonating another user"
+msgstr ""
+
msgid "You are an admin, which means granting access to %{client_name} will allow them to interact with GitLab as an admin as well. Proceed with caution."
msgstr ""
@@ -38603,6 +39142,9 @@ msgstr ""
msgid "You can also use project access tokens with Git to authenticate over HTTP(S). %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "You can always change your URL later"
+msgstr ""
+
msgid "You can always edit this later"
msgstr ""
@@ -38759,10 +39301,10 @@ msgstr ""
msgid "You can’t %{tag_start}edit%{tag_end} files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
-msgid "You could not create a new trigger."
+msgid "You can’t edit files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
-msgid "You didn't renew your subscription for %{strong}%{namespace_name}%{strong_close} so it was downgraded to the free plan."
+msgid "You could not create a new trigger."
msgstr ""
msgid "You do not have any subscriptions yet"
@@ -38930,6 +39472,12 @@ msgstr ""
msgid "You must provide your current password in order to change it."
msgstr ""
+msgid "You must sign in to search for specific projects."
+msgstr ""
+
+msgid "You must sign in to search for specific terms."
+msgstr ""
+
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
@@ -38957,6 +39505,9 @@ msgstr ""
msgid "You need to upload a GitLab project export archive (ending in .gz)."
msgstr ""
+msgid "You need to verify your primary email first before enabling Two-Factor Authentication."
+msgstr ""
+
msgid "You successfully declined the invitation"
msgstr ""
@@ -39065,10 +39616,10 @@ msgstr ""
msgid "Your %{host} account was signed in to from a new location"
msgstr ""
-msgid "Your %{strong}%{plan_name}%{strong_close} subscription for %{strong}%{namespace_name}%{strong_close} will expire on %{strong}%{expires_on}%{strong_close}."
+msgid "Your %{strong}%{plan_name}%{strong_close} subscription expires on %{strong}%{expires_on}%{strong_close}. After that date, you cannot create issues or merge requests, or use many other features."
msgstr ""
-msgid "Your %{strong}%{plan_name}%{strong_close} subscription will expire on %{strong}%{expires_on}%{strong_close}. After that, you will not be able to create issues or merge requests as well as many other features."
+msgid "Your %{strong}%{plan_name}%{strong_close} subscription for %{strong}%{namespace_name}%{strong_close} will expire on %{strong}%{expires_on}%{strong_close}."
msgstr ""
msgid "Your CI/CD configuration syntax is invalid. View Lint tab for more details."
@@ -39092,7 +39643,7 @@ msgstr ""
msgid "Your GPG keys (%{count})"
msgstr ""
-msgid "Your GitLab account has been locked due to an excessive amount of unsuccessful sign in attempts. Your account will automatically unlock in %{duration} or you may click the link below to unlock now."
+msgid "Your GitLab account has been locked due to an excessive number of unsuccessful sign in attempts. You can wait for your account to automatically unlock in %{duration} or you can click the link below to unlock now."
msgstr ""
msgid "Your GitLab account request has been approved!"
@@ -39203,6 +39754,9 @@ msgstr ""
msgid "Your commit email is used for web based operations, such as edits and merges."
msgstr ""
+msgid "Your current password is required to register a two-factor authenticator app."
+msgstr ""
+
msgid "Your dashboard has been copied. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
@@ -39302,6 +39856,9 @@ msgstr ""
msgid "Your project limit is %{limit} projects! Please contact your administrator to increase it"
msgstr ""
+msgid "Your project will be created at:"
+msgstr ""
+
msgid "Your projects"
msgstr ""
@@ -39341,11 +39898,12 @@ msgstr ""
msgid "Your subscription expired!"
msgstr ""
-msgid "Your subscription has been downgraded."
-msgstr ""
-
-msgid "Your subscription will expire in %{remaining_days}."
-msgstr ""
+msgid "Your subscription will expire in %{remaining_days} day."
+msgid_plural "Your subscription will expire in %{remaining_days} days."
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
msgid "Your username is %{username}."
msgstr ""
@@ -39556,6 +40114,9 @@ msgstr ""
msgid "cannot merge"
msgstr ""
+msgid "cannot not be used for user namespace"
+msgstr ""
+
msgid "ciReport|%{degradedNum} degraded"
msgstr ""
@@ -39881,6 +40442,9 @@ msgstr ""
msgid "created %{timeAgo}"
msgstr ""
+msgid "created %{timeAgo} by %{author}"
+msgstr ""
+
msgid "created by"
msgstr ""
@@ -39927,9 +40491,6 @@ msgstr ""
msgid "does not have a supported extension. Only %{extension_list} are supported"
msgstr ""
-msgid "domain is not authorized for sign-up."
-msgstr ""
-
msgid "download it"
msgstr ""
@@ -39949,20 +40510,13 @@ msgstr ""
msgid "email '%{email}' is not a verified email."
msgstr ""
-msgid "email does not match the allowed domain of %{email_domains}"
-msgid_plural "email does not match the allowed domains: %{email_domains}"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
-
msgid "enabled"
msgstr ""
msgid "encrypted: needs to be a :required, :optional or :migrating!"
msgstr ""
-msgid "ending with MIME type format is not allowed."
+msgid "ending with a reserved file extension is not allowed."
msgstr ""
msgid "entries cannot be larger than 255 characters"
@@ -39986,6 +40540,9 @@ msgstr ""
msgid "estimateCommand|%{slash_command} overwrites the total estimated time."
msgstr ""
+msgid "example.com"
+msgstr ""
+
msgid "exceeds the limit of %{bytes} bytes"
msgstr ""
@@ -40038,9 +40595,6 @@ msgstr ""
msgid "fork"
msgstr ""
-msgid "fork this project"
-msgstr ""
-
msgid "from"
msgstr ""
@@ -40051,6 +40605,9 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "frontmatter"
+msgstr ""
+
msgid "group"
msgstr ""
@@ -40078,6 +40635,9 @@ msgstr ""
msgid "has been completed."
msgstr ""
+msgid "has too deep level of nesting"
+msgstr ""
+
msgid "help"
msgstr ""
@@ -40111,9 +40671,21 @@ msgstr ""
msgid "in"
msgstr ""
+msgid "in Infrastructure :: Kubernetes clusters"
+msgstr ""
+
+msgid "in all GitLab"
+msgstr ""
+
+msgid "in group"
+msgstr ""
+
msgid "in group %{link_to_group}"
msgstr ""
+msgid "in project"
+msgstr ""
+
msgid "in project %{link_to_project}"
msgstr ""
@@ -40157,16 +40729,19 @@ msgstr ""
msgid "is not a valid X509 certificate."
msgstr ""
-msgid "is not allowed since the group is not top-level group."
+msgid "is not allowed for sign-up."
msgstr ""
-msgid "is not allowed. Try again with a different email address, or contact your GitLab admin."
+msgid "is not allowed for this group."
msgstr ""
-msgid "is not allowed. We do not currently support project-level iterations"
+msgid "is not allowed for this project."
msgstr ""
-msgid "is not from an allowed domain."
+msgid "is not allowed since the group is not top-level group."
+msgstr ""
+
+msgid "is not allowed. We do not currently support project-level iterations"
msgstr ""
msgid "is not in the group enforcing Group Managed Account"
@@ -40259,6 +40834,9 @@ msgstr ""
msgid "log in"
msgstr ""
+msgid "managed"
+msgstr ""
+
msgid "manual"
msgstr ""
@@ -40308,6 +40886,9 @@ msgstr ""
msgid "mrWidget| Please restore it or use a different %{missingBranchName} branch"
msgstr ""
+msgid "mrWidget|%{linkStart}Set up now%{linkEnd} to analyze your source code for known security vulnerabilities."
+msgstr ""
+
msgid "mrWidget|%{mergeError}."
msgstr ""
@@ -40390,6 +40971,9 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "mrWidget|Create issue to resolve all threads"
+msgstr ""
+
msgid "mrWidget|Delete source branch"
msgstr ""
@@ -40399,12 +40983,18 @@ msgstr ""
msgid "mrWidget|Did not close"
msgstr ""
+msgid "mrWidget|Dismiss"
+msgstr ""
+
msgid "mrWidget|Email patches"
msgstr ""
msgid "mrWidget|Failed to load deployment statistics"
msgstr ""
+msgid "mrWidget|Hide %{widget} details"
+msgstr ""
+
msgid "mrWidget|If the %{missingBranchName} branch exists in your local repository, you can merge this merge request manually using the command line"
msgstr ""
@@ -40502,9 +41092,6 @@ msgstr ""
msgid "mrWidget|Request to merge"
msgstr ""
-msgid "mrWidget|Resolve all threads in new issue"
-msgstr ""
-
msgid "mrWidget|Resolve conflicts"
msgstr ""
@@ -40520,6 +41107,9 @@ msgstr ""
msgid "mrWidget|Revoke approval"
msgstr ""
+msgid "mrWidget|SAST and Secret Detection is not enabled."
+msgstr ""
+
msgid "mrWidget|Set by %{merge_author} to be added to the merge train when the pipeline succeeds"
msgstr ""
@@ -40529,6 +41119,9 @@ msgstr ""
msgid "mrWidget|Set by %{merge_author} to start a merge train when the pipeline succeeds"
msgstr ""
+msgid "mrWidget|Show %{widget} details"
+msgstr ""
+
msgid "mrWidget|The changes were merged into"
msgstr ""
@@ -40541,6 +41134,9 @@ msgstr ""
msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure, or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
msgstr ""
+msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure."
+msgstr ""
+
msgid "mrWidget|The source branch has been deleted"
msgstr ""
@@ -40583,6 +41179,9 @@ msgstr ""
msgid "mrWidget|You can merge after removing denied licenses"
msgstr ""
+msgid "mrWidget|You can only merge once this merge request is approved."
+msgstr ""
+
msgid "mrWidget|Your password"
msgstr ""
@@ -40619,6 +41218,9 @@ msgstr ""
msgid "must be less than the limit of %{tag_limit} tags"
msgstr ""
+msgid "must be set for a project namespace"
+msgstr ""
+
msgid "must be unique by status and elapsed time within a policy"
msgstr ""
@@ -40732,6 +41334,9 @@ msgstr ""
msgid "pipeline"
msgstr ""
+msgid "pipeline schedules documentation"
+msgstr ""
+
msgid "pod_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
msgstr ""
@@ -40785,16 +41390,25 @@ msgstr ""
msgid "project name"
msgstr ""
+msgid "project namespace cannot be the parent of another namespace"
+msgstr ""
+
msgid "projects"
msgstr ""
msgid "quick actions"
msgstr ""
-msgid "reCAPTCHA Private Key"
+msgid "reCAPTCHA"
+msgstr ""
+
+msgid "reCAPTCHA helps prevent credential stuffing."
msgstr ""
-msgid "reCAPTCHA Site Key"
+msgid "reCAPTCHA private key"
+msgstr ""
+
+msgid "reCAPTCHA site key"
msgstr ""
msgid "recent activity"
@@ -41023,6 +41637,9 @@ msgstr ""
msgid "user avatar"
msgstr ""
+msgid "user namespace cannot be the parent of another namespace"
+msgstr ""
+
msgid "user preferences"
msgstr ""
@@ -41117,3 +41734,9 @@ msgstr ""
msgid "your settings"
msgstr ""
+msgid "{group}"
+msgstr ""
+
+msgid "{project}"
+msgstr ""
+
diff --git a/locale/sq_AL/gitlab.po b/locale/sq_AL/gitlab.po
index 996c6d40828..465eec3eb61 100644
--- a/locale/sq_AL/gitlab.po
+++ b/locale/sq_AL/gitlab.po
@@ -14,10 +14,7 @@ msgstr ""
"X-Crowdin-Language: sq\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-09-01 22:34\n"
-
-msgid " %{name}, confirm your email address now! "
-msgstr ""
+"PO-Revision-Date: 2021-10-04 20:24\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -92,6 +89,16 @@ msgstr ""
msgid "#general, #development"
msgstr ""
+msgid "%d Alert"
+msgid_plural "%d Alerts"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d Alert:"
+msgid_plural "%d Alerts:"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d Approval"
msgid_plural "%d Approvals"
msgstr[0] ""
@@ -455,7 +462,10 @@ msgstr ""
msgid "%{code_open}Protected:%{code_close} Only exposed to protected branches or tags."
msgstr ""
-msgid "%{commit_author_link} authored %{commit_timeago}"
+msgid "%{commit_author_link} authored %{commit_authored_timeago}"
+msgstr ""
+
+msgid "%{commit_author_link} authored %{commit_authored_timeago} and %{commit_committer_avatar} %{commit_committer_link} committed %{commit_committer_timeago}"
msgstr ""
msgid "%{completedCount} completed weight"
@@ -549,6 +559,15 @@ msgstr ""
msgid "%{doc_link_start}Advanced search%{doc_link_end} is enabled."
msgstr ""
+msgid "%{docs_link_start}Learn about visibility levels.%{docs_link_end}"
+msgstr ""
+
+msgid "%{docs_link_start}What is Large File Storage?%{docs_link_end}"
+msgstr ""
+
+msgid "%{docs_link_start}What is two-factor authentication?%{docs_link_end}"
+msgstr ""
+
msgid "%{due_date} (Past due)"
msgstr ""
@@ -621,9 +640,6 @@ msgstr ""
msgid "%{issueType} actions"
msgstr ""
-msgid "%{issuesCount} issues with a limit of %{maxIssueCount}"
-msgstr ""
-
msgid "%{issuesSize} with a limit of %{maxIssueCount}"
msgstr ""
@@ -681,6 +697,12 @@ msgstr ""
msgid "%{label_for_message} unavailable"
msgstr ""
+msgid "%{learn_more_link}."
+msgstr ""
+
+msgid "%{lessThan} 1 hour"
+msgstr ""
+
msgid "%{lets_encrypt_link_start}Let's Encrypt%{lets_encrypt_link_end} is a free, automated, and open certificate authority (CA) that issues digital certificates to enable HTTPS (SSL/TLS) for sites."
msgstr ""
@@ -693,15 +715,15 @@ msgstr ""
msgid "%{link_start}Learn more%{link_end} about roles."
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
-msgstr ""
-
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
msgstr ""
msgid "%{link_start}Start the title with %{draft_snippet}%{link_end} to prevent a merge request that is a work in progress from being merged before it's ready."
msgstr ""
+msgid "%{link_start}What information does GitLab Inc. collect?%{link_end}"
+msgstr ""
+
msgid "%{listToShow}, and %{awardsListLength} more"
msgstr ""
@@ -854,7 +876,7 @@ msgid_plural "%{securityScanner} results are not available because a pipeline ha
msgstr[0] ""
msgstr[1] ""
-msgid "%{service_ping_link_start}Learn more%{service_ping_link_end} about what information is shared with GitLab Inc."
+msgid "%{service_ping_link_start}What information is shared with GitLab Inc.?%{service_ping_link_end}"
msgstr ""
msgid "%{size} %{unit}"
@@ -890,6 +912,9 @@ msgstr ""
msgid "%{state} epics"
msgstr ""
+msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
+msgstr ""
+
msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
msgstr ""
@@ -949,11 +974,6 @@ msgstr ""
msgid "%{template_project_id} is unknown or invalid"
msgstr ""
-msgid "%{text} %{files}"
-msgid_plural "%{text} %{files} files"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%{text} is available"
msgstr ""
@@ -1038,9 +1058,6 @@ msgstr ""
msgid "%{wildcards_link_start}Wildcards%{wildcards_link_end} such as %{code_tag_start}v*%{code_tag_end} or %{code_tag_start}*-release%{code_tag_end} are supported."
msgstr ""
-msgid "&lt; 1 hour"
-msgstr ""
-
msgid "'%{data}' at %{location} does not match format: %{format}"
msgstr ""
@@ -1124,9 +1141,6 @@ msgstr ""
msgid "(we need your current password to confirm your changes)"
msgstr ""
-msgid "* * * * *"
-msgstr ""
-
msgid "+ %{amount} more"
msgstr ""
@@ -1193,10 +1207,10 @@ msgstr ""
msgid "."
msgstr ""
-msgid "0 bytes"
+msgid "/"
msgstr ""
-msgid "0 for unlimited, only effective with remote storage enabled."
+msgid "0 bytes"
msgstr ""
msgid "0t1DgySidms"
@@ -1326,6 +1340,9 @@ msgstr ""
msgid "1000+"
msgstr ""
+msgid "192.168.0.0/24"
+msgstr ""
+
msgid "1st contribution!"
msgstr ""
@@ -1479,9 +1496,6 @@ msgstr ""
msgid "A plain HTML site that uses Netlify for CI/CD instead of GitLab, but still with all the other great GitLab features"
msgstr ""
-msgid "A plain-text response to show to clients that hit the rate limit."
-msgstr ""
-
msgid "A platform value can be web, mob or app."
msgstr ""
@@ -1563,7 +1577,7 @@ msgstr ""
msgid "APIFuzzing|Configure HTTP basic authentication values. Other authentication methods are supported. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
+msgid "APIFuzzing|Customize your project's API fuzzing configuration options and copy the code snippet to your .gitlab-ci.yml file to apply any changes. Note that this tool does not reflect or update your .gitlab-ci.yml file automatically. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
msgstr ""
msgid "APIFuzzing|Enable authentication"
@@ -1626,9 +1640,6 @@ msgstr ""
msgid "APIFuzzing|To prevent a security leak, authentication info must be added as a %{ciVariablesLinkStart}CI variable%{ciVariablesLinkEnd}. As a user with maintainer access rights, you can manage CI variables in the %{ciSettingsLinkStart}Settings%{ciSettingsLinkEnd} area."
msgstr ""
-msgid "APIFuzzing|Use this tool to generate API fuzzing configuration YAML to copy into your .gitlab-ci.yml file. This tool does not reflect or update your .gitlab-ci.yml file automatically."
-msgstr ""
-
msgid "APIFuzzing|Username for basic authentication"
msgstr ""
@@ -1680,9 +1691,6 @@ msgstr ""
msgid "Abuse reports notification email"
msgstr ""
-msgid "Abuse reports will be sent to this address if it is set. Abuse reports are always available in the admin area."
-msgstr ""
-
msgid "Accept invitation"
msgstr ""
@@ -1719,12 +1727,18 @@ msgstr ""
msgid "Access granted"
msgstr ""
+msgid "Access key ID"
+msgstr ""
+
msgid "Access requests"
msgstr ""
msgid "Access to '%{classification_label}' not allowed"
msgstr ""
+msgid "Access tokens expire after 2 hours. A refresh token may be used at any time to generate a new access token. Non-expiring access tokens are deprecated. Clear this setting to enable backward compatibility."
+msgstr ""
+
msgid "AccessDropdown|Deploy Keys"
msgstr ""
@@ -2037,6 +2051,9 @@ msgstr ""
msgid "Add new directory"
msgstr ""
+msgid "Add new service account"
+msgstr ""
+
msgid "Add or remove previously merged commits"
msgstr ""
@@ -2274,6 +2291,9 @@ msgstr ""
msgid "AdminArea|Features"
msgstr ""
+msgid "AdminArea|Get security updates from GitLab and stay up to date"
+msgstr ""
+
msgid "AdminArea|Groups"
msgstr ""
@@ -2313,6 +2333,12 @@ msgstr ""
msgid "AdminArea|Reporter"
msgstr ""
+msgid "AdminArea|Sign up for the GitLab Security Newsletter to get notified for security updates."
+msgstr ""
+
+msgid "AdminArea|Sign up for the GitLab newsletter"
+msgstr ""
+
msgid "AdminArea|Stop all jobs"
msgstr ""
@@ -2382,9 +2408,15 @@ msgstr ""
msgid "AdminSettings|Disable public access to Pages sites"
msgstr ""
+msgid "AdminSettings|Display a banner on merge requests in projects with no pipelines to initiate steps to add a .gitlab-ci.yml file."
+msgstr ""
+
msgid "AdminSettings|Domain verification is an essential security measure for public GitLab sites. Users are required to demonstrate they control a domain before it is enabled. %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "AdminSettings|Enable pipeline suggestion banner"
+msgstr ""
+
msgid "AdminSettings|Enable shared runners for new projects"
msgstr ""
@@ -2856,10 +2888,10 @@ msgstr ""
msgid "Admin|Quarterly reconciliation will occur on %{qrtlyDate}"
msgstr ""
-msgid "Admin|The number of max seats used for your namespace is currently exceeding the number of seats in your subscription. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgid "Admin|The number of max seats in your namespace exceeds the number of seats in your subscription. On %{qrtlyDate}, quarterly reconciliation occurs and you are automatically billed a prorated amount for the overage. No action is needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice. For more information about the timing of the invoicing process, view the documentation."
msgstr ""
-msgid "Admin|The number of maximum users for your instance is currently exceeding the number of users in license. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgid "Admin|The number of max users in your instance exceeds the number of users in your license. On %{qrtlyDate}, quarterly reconciliation occurs and you are automatically billed a prorated amount for the overage. No action is needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice. For more information about the timing of the invoicing process, view the documentation."
msgstr ""
msgid "Admin|View pending user approvals"
@@ -2880,9 +2912,6 @@ msgstr ""
msgid "Advanced export options"
msgstr ""
-msgid "Advanced permissions, Large File Storage and Two-Factor authentication settings."
-msgstr ""
-
msgid "After a successful password update you will be redirected to login screen."
msgstr ""
@@ -2901,13 +2930,14 @@ msgstr ""
msgid "After you've reviewed these contribution guidelines, you'll be all set to"
msgstr ""
+msgid "Akismet"
+msgstr ""
+
msgid "Akismet API Key"
msgstr ""
-msgid "Alert"
-msgid_plural "Alerts"
-msgstr[0] ""
-msgstr[1] ""
+msgid "Akismet helps prevent the creation of spam issues in public projects."
+msgstr ""
msgid "AlertManagement|Acknowledged"
msgstr ""
@@ -3263,6 +3293,9 @@ msgstr ""
msgid "All (default)"
msgstr ""
+msgid "All GitLab"
+msgstr ""
+
msgid "All Members"
msgstr ""
@@ -3377,6 +3410,9 @@ msgstr ""
msgid "Allow this secondary node to replicate content on Object Storage"
msgstr ""
+msgid "Allow use of licensed EE features"
+msgstr ""
+
msgid "Allow users to dismiss the broadcast message"
msgstr ""
@@ -3452,9 +3488,6 @@ msgstr ""
msgid "Amazon authentication is not %{link_start}correctly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
-msgid "Amount of time (in hours) that users are allowed to skip forced configuration of two-factor authentication"
-msgstr ""
-
msgid "An %{link_start}alert%{link_end} with the same fingerprint is already open. To change the status of this alert, resolve the linked alert."
msgstr ""
@@ -3515,12 +3548,6 @@ msgstr ""
msgid "An error occurred when removing the label."
msgstr ""
-msgid "An error occurred when toggling the notification subscription"
-msgstr ""
-
-msgid "An error occurred when updating the issue weight"
-msgstr ""
-
msgid "An error occurred when updating the title"
msgstr ""
@@ -3569,6 +3596,9 @@ msgstr ""
msgid "An error occurred while enabling Service Desk."
msgstr ""
+msgid "An error occurred while fetching Markdown preview"
+msgstr ""
+
msgid "An error occurred while fetching ancestors"
msgstr ""
@@ -3599,9 +3629,6 @@ msgstr ""
msgid "An error occurred while fetching label colors."
msgstr ""
-msgid "An error occurred while fetching markdown preview"
-msgstr ""
-
msgid "An error occurred while fetching participants"
msgstr ""
@@ -3617,9 +3644,6 @@ msgstr ""
msgid "An error occurred while fetching reference"
msgstr ""
-msgid "An error occurred while fetching sidebar data"
-msgstr ""
-
msgid "An error occurred while fetching tags. Retry the search."
msgstr ""
@@ -3695,6 +3719,9 @@ msgstr ""
msgid "An error occurred while loading merge requests."
msgstr ""
+msgid "An error occurred while loading projects."
+msgstr ""
+
msgid "An error occurred while loading the Needs tab."
msgstr ""
@@ -3929,12 +3956,6 @@ msgstr ""
msgid "Any Milestone"
msgstr ""
-msgid "Any branch"
-msgstr ""
-
-msgid "Any eligible user"
-msgstr ""
-
msgid "Any encrypted tokens"
msgstr ""
@@ -3953,6 +3974,9 @@ msgstr ""
msgid "Any namespace"
msgstr ""
+msgid "App Engine description and apps that are suitable for this deployment target"
+msgstr ""
+
msgid "App ID"
msgstr ""
@@ -4101,6 +4125,11 @@ msgstr ""
msgid "Apply"
msgstr ""
+msgid "Apply %d suggestion"
+msgid_plural "Apply %d suggestions"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Apply a label"
msgstr ""
@@ -4110,13 +4139,10 @@ msgstr ""
msgid "Apply suggestion"
msgstr ""
-msgid "Apply suggestions"
-msgstr ""
-
msgid "Apply template"
msgstr ""
-msgid "Apply this approval rule to any branch or a specific protected branch."
+msgid "Apply this approval rule to all branches or a specific protected branch."
msgstr ""
msgid "Applying"
@@ -4259,9 +4285,6 @@ msgstr ""
msgid "ApprovalSettings|Prevent editing approval rules in projects and merge requests."
msgstr ""
-msgid "ApprovalSettings|Prevent editing approval rules in projects and merge requests. "
-msgstr ""
-
msgid "ApprovalSettings|Remove all approvals when commits are added to the source branch."
msgstr ""
@@ -4277,6 +4300,9 @@ msgstr ""
msgid "ApprovalSettings|This setting is configured at the instance level and can only be changed by an administrator."
msgstr ""
+msgid "ApprovalSettings|This setting is configured in %{groupName} and can only be changed by an administrator or group owner."
+msgstr ""
+
msgid "ApprovalStatusTooltip|Adheres to separation of duties"
msgstr ""
@@ -4763,9 +4789,6 @@ msgstr ""
msgid "Authenticated API rate limit period in seconds"
msgstr ""
-msgid "Authenticated API request rate limit"
-msgstr ""
-
msgid "Authenticated API requests"
msgstr ""
@@ -4775,10 +4798,10 @@ msgstr ""
msgid "Authenticated Git LFS request rate limit"
msgstr ""
-msgid "Authenticated web rate limit period in seconds"
+msgid "Authenticated Git LFS requests"
msgstr ""
-msgid "Authenticated web request rate limit"
+msgid "Authenticated web rate limit period in seconds"
msgstr ""
msgid "Authenticated web requests"
@@ -5156,9 +5179,6 @@ msgstr ""
msgid "Below you will find all the groups that are public."
msgstr ""
-msgid "Beta"
-msgstr ""
-
msgid "Bi-weekly code coverage"
msgstr ""
@@ -5398,6 +5418,21 @@ msgstr ""
msgid "Board scope affects which issues are displayed for anyone who visits this board"
msgstr ""
+msgid "BoardNewEpic|Groups"
+msgstr ""
+
+msgid "BoardNewEpic|Loading groups"
+msgstr ""
+
+msgid "BoardNewEpic|No matching results"
+msgstr ""
+
+msgid "BoardNewEpic|Search groups"
+msgstr ""
+
+msgid "BoardNewEpic|Select a group"
+msgstr ""
+
msgid "BoardNewIssue|No matching results"
msgstr ""
@@ -5475,6 +5510,9 @@ msgstr ""
msgid "Boards|An error occurred while creating the list. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching child groups. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching group projects. Please try again."
msgstr ""
@@ -5807,6 +5845,9 @@ msgstr ""
msgid "Bulk update"
msgstr ""
+msgid "BulkImports|Re-import creates a new group. It does not sync with the existing group."
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -5816,6 +5857,9 @@ msgstr ""
msgid "BulkImport|From source group"
msgstr ""
+msgid "BulkImport|Group import history"
+msgstr ""
+
msgid "BulkImport|Import failed: Destination cannot be a subgroup of the source group. Change the destination and try again."
msgstr ""
@@ -5828,9 +5872,18 @@ msgstr ""
msgid "BulkImport|Importing the group failed"
msgstr ""
+msgid "BulkImport|Last imported to %{link}"
+msgstr ""
+
msgid "BulkImport|Name already exists."
msgstr ""
+msgid "BulkImport|New group"
+msgstr ""
+
+msgid "BulkImport|No history is available"
+msgstr ""
+
msgid "BulkImport|No parent"
msgstr ""
@@ -5843,6 +5896,9 @@ msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} matching filter \"%{filter}\" from %{link}"
msgstr ""
+msgid "BulkImport|Source group"
+msgstr ""
+
msgid "BulkImport|To new group"
msgstr ""
@@ -5852,6 +5908,9 @@ msgstr ""
msgid "BulkImport|You have no groups to import"
msgstr ""
+msgid "BulkImport|Your imported groups will appear here."
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -6094,6 +6153,9 @@ msgstr ""
msgid "Can be manually deployed to"
msgstr ""
+msgid "Can be overridden in each project."
+msgstr ""
+
msgid "Can create groups:"
msgstr ""
@@ -6196,6 +6258,9 @@ msgstr ""
msgid "Cancelling Preview"
msgstr ""
+msgid "Cannot assign a confidential epic to a non-confidential issue. Make the issue confidential and try again"
+msgstr ""
+
msgid "Cannot be assigned to other projects."
msgstr ""
@@ -6247,9 +6312,6 @@ msgstr ""
msgid "Cannot refer to a group %{timebox_type} by an internal id!"
msgstr ""
-msgid "Cannot set confidential epic for a non-confidential issue"
-msgstr ""
-
msgid "Cannot show preview. For previews on sketch files, they must have the file format introduced by Sketch version 43 and above."
msgstr ""
@@ -6487,15 +6549,15 @@ msgstr ""
msgid "Check out, review, and merge locally"
msgstr ""
-msgid "Check the %{docs_link_start}documentation%{docs_link_end}."
-msgstr ""
-
msgid "Check the current instance configuration "
msgstr ""
msgid "Check the elasticsearch.log file to debug why the migration was halted and make any changes before retrying the migration. When you fix the cause of the failure, click \"Retry migration\", and the migration will be scheduled to be retried in the background."
msgstr ""
+msgid "Check with your administrator."
+msgstr ""
+
msgid "Check your Docker images for known vulnerabilities."
msgstr ""
@@ -6526,6 +6588,9 @@ msgstr ""
msgid "Checkout"
msgstr ""
+msgid "Checkout|$%{selectedPlanPrice} per 10 GB storage per pack"
+msgstr ""
+
msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 minutes"
msgstr ""
@@ -6546,17 +6611,23 @@ msgstr ""
msgid "Checkout|%{name}'s GitLab subscription"
msgstr ""
-msgid "Checkout|%{selectedPlanText} plan"
+msgid "Checkout|%{name}'s storage subscription"
msgstr ""
-msgid "Checkout|%{startDate} - %{endDate}"
+msgid "Checkout|%{quantity} GB of storage"
msgstr ""
-msgid "Checkout|%{totalCiMinutes} CI minute"
-msgid_plural "Checkout|%{totalCiMinutes} CI minutes"
+msgid "Checkout|%{quantity} storage pack"
+msgid_plural "Checkout|%{quantity} storage packs"
msgstr[0] ""
msgstr[1] ""
+msgid "Checkout|%{selectedPlanText} plan"
+msgstr ""
+
+msgid "Checkout|%{startDate} - %{endDate}"
+msgstr ""
+
msgid "Checkout|%{totalCiMinutes} CI minutes"
msgstr ""
@@ -6632,6 +6703,9 @@ msgstr ""
msgid "Checkout|Failed to register credit card. Please try again."
msgstr ""
+msgid "Checkout|GB"
+msgstr ""
+
msgid "Checkout|GitLab group"
msgstr ""
@@ -6668,6 +6742,9 @@ msgstr ""
msgid "Checkout|State"
msgstr ""
+msgid "Checkout|Storage packs"
+msgstr ""
+
msgid "Checkout|Street address"
msgstr ""
@@ -6689,6 +6766,9 @@ msgstr ""
msgid "Checkout|Total minutes: %{quantity}"
msgstr ""
+msgid "Checkout|Total storage: %{quantity} GB"
+msgstr ""
+
msgid "Checkout|Users"
msgstr ""
@@ -6698,16 +6778,25 @@ msgstr ""
msgid "Checkout|Your organization"
msgstr ""
+msgid "Checkout|Your storage subscription has the same term as your main subscription, and the price is prorated accordingly."
+msgstr ""
+
msgid "Checkout|Your subscription will be applied to this group"
msgstr ""
msgid "Checkout|Zip code"
msgstr ""
+msgid "Checkout|a storage subscription"
+msgstr ""
+
msgid "Checkout|company or team"
msgstr ""
-msgid "Checkout|x 1,000 minutes per pack = %{strong}"
+msgid "Checkout|minutes"
+msgstr ""
+
+msgid "Checkout|x %{quantity} %{units} per pack ="
msgstr ""
msgid "Cherry-pick this commit"
@@ -7064,6 +7153,9 @@ msgstr ""
msgid "CloneIssue|Cannot clone issue to target project as it is pending deletion."
msgstr ""
+msgid "CloneIssue|Cannot clone issues of '%{issue_type}' type."
+msgstr ""
+
msgid "Cloned this issue to %{path_to_project}."
msgstr ""
@@ -7118,7 +7210,10 @@ msgstr ""
msgid "Closes this %{quick_action_target}."
msgstr ""
-msgid "Cloud licenses can not be removed."
+msgid "Cloud Functions description and apps that are suitable for this deployment target"
+msgstr ""
+
+msgid "Cloud Run description and apps that are suitable for this deployment target"
msgstr ""
msgid "Cluster"
@@ -7145,6 +7240,12 @@ msgstr ""
msgid "ClusterAgents|Access tokens"
msgstr ""
+msgid "ClusterAgents|Agent might not be connected to GitLab"
+msgstr ""
+
+msgid "ClusterAgents|Agent never connected to GitLab"
+msgstr ""
+
msgid "ClusterAgents|Alternative installation methods"
msgstr ""
@@ -7160,6 +7261,12 @@ msgstr ""
msgid "ClusterAgents|Configuration"
msgstr ""
+msgid "ClusterAgents|Connected"
+msgstr ""
+
+msgid "ClusterAgents|Connection status"
+msgstr ""
+
msgid "ClusterAgents|Copy token"
msgstr ""
@@ -7178,6 +7285,9 @@ msgstr ""
msgid "ClusterAgents|For alternative installation methods %{linkStart}go to the documentation%{linkEnd}."
msgstr ""
+msgid "ClusterAgents|For more troubleshooting information go to"
+msgstr ""
+
msgid "ClusterAgents|Go to the repository"
msgstr ""
@@ -7193,18 +7303,30 @@ msgstr ""
msgid "ClusterAgents|Integrate with the GitLab Agent"
msgstr ""
-msgid "ClusterAgents|Last used"
+msgid "ClusterAgents|Last connected %{timeAgo}."
+msgstr ""
+
+msgid "ClusterAgents|Last contact"
msgstr ""
msgid "ClusterAgents|Learn how to create an agent access token"
msgstr ""
+msgid "ClusterAgents|Make sure you are using a valid token."
+msgstr ""
+
msgid "ClusterAgents|Name"
msgstr ""
msgid "ClusterAgents|Never"
msgstr ""
+msgid "ClusterAgents|Never connected"
+msgstr ""
+
+msgid "ClusterAgents|Not connected"
+msgstr ""
+
msgid "ClusterAgents|Read more about getting started"
msgstr ""
@@ -7226,6 +7348,9 @@ msgstr ""
msgid "ClusterAgents|Select which Agent you want to install"
msgstr ""
+msgid "ClusterAgents|The Agent has not been connected in a long time. There might be a connectivity issue. Last contact was %{timeAgo}."
+msgstr ""
+
msgid "ClusterAgents|The GitLab Agent also requires %{linkStart}enabling the Agent Server%{linkEnd}"
msgstr ""
@@ -7253,9 +7378,6 @@ msgstr ""
msgid "ClusterAgents|You will need to create a token to connect to your agent"
msgstr ""
-msgid "ClusterAgent|This feature is only available for premium plans"
-msgstr ""
-
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -7445,9 +7567,6 @@ msgstr ""
msgid "ClusterIntegration|Create Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Create a provision role on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the account and external ID above. %{startMoreInfoLink}More information%{endLink}"
-msgstr ""
-
msgid "ClusterIntegration|Create cluster on"
msgstr ""
@@ -7880,7 +7999,7 @@ msgstr ""
msgid "ClusterIntegration|Subnets"
msgstr ""
-msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provisioned role, first create one on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the above account and external IDs. %{startMoreInfoLink}More information%{endLink}"
+msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provisioned role, first create one on %{awsLinkStart}Amazon Web Services %{awsLinkEnd} using the above account and external IDs. %{moreInfoStart}More information%{moreInfoEnd}"
msgstr ""
msgid "ClusterIntegration|The Kubernetes certificate used to authenticate to the cluster."
@@ -8114,6 +8233,9 @@ msgstr ""
msgid "Collapse replies"
msgstr ""
+msgid "Collapse settings section"
+msgstr ""
+
msgid "Collapse sidebar"
msgstr ""
@@ -8132,6 +8254,9 @@ msgstr ""
msgid "Comma-separated list of email addresses."
msgstr ""
+msgid "Comma-separated list of users allowed to exceed the rate limit."
+msgstr ""
+
msgid "Comma-separated, e.g. '1.1.1.1, 2.2.2.0/24'"
msgstr ""
@@ -8452,6 +8577,9 @@ msgstr ""
msgid "Configure %{repository_checks_link_start}repository checks%{link_end} and %{housekeeping_link_start}housekeeping%{link_end} on repositories."
msgstr ""
+msgid "Configure CAPTCHAs, IP address limits, and other anti-spam measures."
+msgstr ""
+
msgid "Configure Dependency Scanning in `.gitlab-ci.yml` using the GitLab managed template. You can [add variable overrides](https://docs.gitlab.com/ee/user/application_security/dependency_scanning/#customizing-the-dependency-scanning-settings) to customize Dependency Scanning settings."
msgstr ""
@@ -8488,16 +8616,13 @@ msgstr ""
msgid "Configure a %{codeStart}.gitlab-webide.yml%{codeEnd} file in the %{codeStart}.gitlab%{codeEnd} directory to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
msgstr ""
-msgid "Configure existing installation"
-msgstr ""
-
-msgid "Configure limit for notes created per minute by web and API requests."
+msgid "Configure advanced permissions, Large File Storage, and two-factor authentication settings."
msgstr ""
-msgid "Configure limits for Project/Group Import/Export."
+msgid "Configure approvals by authors and committers on all projects."
msgstr ""
-msgid "Configure limits for web and API requests."
+msgid "Configure existing installation"
msgstr ""
msgid "Configure paths to be protected by Rack Attack."
@@ -8512,10 +8637,13 @@ msgstr ""
msgid "Configure settings for Advanced Search with Elasticsearch."
msgstr ""
+msgid "Configure specific limits for Files API requests that supersede the general user and IP rate limits."
+msgstr ""
+
msgid "Configure specific limits for Git LFS requests that supersede the general user and IP rate limits."
msgstr ""
-msgid "Configure specific limits for Packages API requests that supersede the general user and IP rate limits."
+msgid "Configure specific limits for deprecated API requests that supersede the general user and IP rate limits."
msgstr ""
msgid "Configure the %{link} integration."
@@ -8527,6 +8655,9 @@ msgstr ""
msgid "Configure the way a user creates a new account."
msgstr ""
+msgid "Configure via Merge Request"
+msgstr ""
+
msgid "Configure which lists are shown for anyone who visits this board"
msgstr ""
@@ -8995,6 +9126,9 @@ msgstr ""
msgid "Content parsed with %{link}."
msgstr ""
+msgid "ContentEditor|Table of Contents"
+msgstr ""
+
msgid "ContentEditor|You have to provide a renderMarkdown function or a custom serializer"
msgstr ""
@@ -9181,6 +9315,9 @@ msgstr ""
msgid "Copy link to chart"
msgstr ""
+msgid "Copy prefix"
+msgstr ""
+
msgid "Copy reference"
msgstr ""
@@ -9211,6 +9348,9 @@ msgstr ""
msgid "Copy value"
msgstr ""
+msgid "Corpus Management"
+msgstr ""
+
msgid "Corpus Management|Are you sure you want to delete the corpus?"
msgstr ""
@@ -9439,6 +9579,9 @@ msgstr ""
msgid "Create commit"
msgstr ""
+msgid "Create common files more quickly, and standardize their format."
+msgstr ""
+
msgid "Create confidential merge request"
msgstr ""
@@ -9472,6 +9615,9 @@ msgstr ""
msgid "Create issue"
msgstr ""
+msgid "Create issue to resolve all threads"
+msgstr ""
+
msgid "Create iteration"
msgstr ""
@@ -9526,6 +9672,9 @@ msgstr ""
msgid "Create new..."
msgstr ""
+msgid "Create or import your first project"
+msgstr ""
+
msgid "Create project"
msgstr ""
@@ -9883,7 +10032,7 @@ msgstr ""
msgid "Custom notification events"
msgstr ""
-msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notificationLinkStart} notification emails%{notificationLinkEnd}."
+msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notificationLinkStart}notification emails%{notificationLinkEnd}."
msgstr ""
msgid "Custom project templates"
@@ -10082,10 +10231,10 @@ msgid_plural "CycleAnalytics|Showing %{subjectFilterText} and %{selectedLabelsCo
msgstr[0] ""
msgstr[1] ""
-msgid "CycleAnalytics|Showing data for group '%{groupName}' and %{selectedProjectCount} projects from %{startDate} to %{endDate}"
+msgid "CycleAnalytics|Showing data for group '%{groupName}' and %{selectedProjectCount} projects from %{createdAfter} to %{createdBefore}"
msgstr ""
-msgid "CycleAnalytics|Showing data for group '%{groupName}' from %{startDate} to %{endDate}"
+msgid "CycleAnalytics|Showing data for group '%{groupName}' from %{createdAfter} to %{createdBefore}"
msgstr ""
msgid "CycleAnalytics|Stages"
@@ -10319,6 +10468,9 @@ msgstr ""
msgid "DastProfiles|Manage profiles"
msgstr ""
+msgid "DastProfiles|Manage site profiles"
+msgstr ""
+
msgid "DastProfiles|Minimum = 0 (no timeout enabled), Maximum = 2880 minutes"
msgstr ""
@@ -10394,6 +10546,9 @@ msgstr ""
msgid "DastProfiles|Scanner name"
msgstr ""
+msgid "DastProfiles|Schedule"
+msgstr ""
+
msgid "DastProfiles|Select branch"
msgstr ""
@@ -10463,7 +10618,7 @@ msgstr ""
msgid "DastProfiles|Website"
msgstr ""
-msgid "DastProfiles|You can either choose a passive scan or validate the target site in your chosen site profile. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
+msgid "DastProfiles|You can either choose a passive scan or validate the target site from the site profile management page. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
msgstr ""
msgid "DastProfiles|You cannot run an active scan against an unvalidated site."
@@ -10636,7 +10791,7 @@ msgstr ""
msgid "Days to merge"
msgstr ""
-msgid "Deactivate dormant users after 90 days of inactivity. Users can return to active status by signing in to their account. While inactive, a user is not counted as an active user in the instance."
+msgid "Deactivate dormant users after 90 days of inactivity"
msgstr ""
msgid "Dear Administrator,"
@@ -10723,10 +10878,10 @@ msgstr ""
msgid "Define a custom pattern with cron syntax"
msgstr ""
-msgid "Define approval settings."
+msgid "Define approval rules."
msgstr ""
-msgid "Define approval settings. %{linkStart}Learn more.%{linkEnd}"
+msgid "Define approval rules. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "Define custom rules for what constitutes spam, independent of Akismet"
@@ -10735,7 +10890,7 @@ msgstr ""
msgid "Define environments in the deploy stage(s) in %{code_open}.gitlab-ci.yml%{code_close} to track deployments here."
msgstr ""
-msgid "Define how approval rules are applied as a merge request moves toward completion."
+msgid "Define how approval rules are applied to merge requests."
msgstr ""
msgid "Definition"
@@ -10750,6 +10905,12 @@ msgstr ""
msgid "DelayedJobs|Are you sure you want to run %{job_name} immediately? This job will run automatically after it's timer finishes."
msgstr ""
+msgid "DelayedJobs|Are you sure you want to run %{job_name} immediately? This job will run automatically after its timer finishes."
+msgstr ""
+
+msgid "DelayedJobs|Run the delayed job now?"
+msgstr ""
+
msgid "DelayedJobs|Start now"
msgstr ""
@@ -11026,6 +11187,12 @@ msgstr ""
msgid "Dependency proxy image prefix"
msgstr ""
+msgid "DependencyProxy|Create a local proxy for storing frequently used upstream images. %{docLinkStart}Learn more%{docLinkEnd} about dependency proxies."
+msgstr ""
+
+msgid "DependencyProxy|Dependency Proxy"
+msgstr ""
+
msgid "DependencyProxy|Toggle Dependency Proxy"
msgstr ""
@@ -11266,6 +11433,9 @@ msgstr ""
msgid "Deployments"
msgstr ""
+msgid "Deployments to Google Kubernetes Engine can be "
+msgstr ""
+
msgid "Deployments|%{deployments} environment impacted."
msgid_plural "Deployments|%{deployments} environments impacted."
msgstr[0] ""
@@ -11295,6 +11465,9 @@ msgstr ""
msgid "Deployment|success"
msgstr ""
+msgid "Deprecated API rate limits"
+msgstr ""
+
msgid "Deprioritize label"
msgstr ""
@@ -11697,6 +11870,16 @@ msgstr ""
msgid "DiffsCompareBaseBranch|(base)"
msgstr ""
+msgid "Diffs|%d addition"
+msgid_plural "Diffs|%d additions"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Diffs|%d deletion"
+msgid_plural "Diffs|%d deletions"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Diffs|No file name available"
msgstr ""
@@ -11706,9 +11889,17 @@ msgstr ""
msgid "Diffs|Show all unchanged lines"
msgstr ""
+msgid "Diffs|Showing %{dropdownStart}%{count} changed file%{dropdownEnd}"
+msgid_plural "Diffs|Showing %{dropdownStart}%{count} changed files%{dropdownEnd}"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Diffs|Something went wrong while fetching diff lines."
msgstr ""
+msgid "Diffs|with %{additions} and %{deletions}"
+msgstr ""
+
msgid "Direct member"
msgstr ""
@@ -11834,9 +12025,6 @@ msgid_plural "Dismiss %d selected vulnerabilities as"
msgstr[0] ""
msgstr[1] ""
-msgid "Dismiss Value Stream Analytics introduction box"
-msgstr ""
-
msgid "Dismiss merge request promotion"
msgstr ""
@@ -12158,6 +12346,9 @@ msgstr ""
msgid "Edit issues"
msgstr ""
+msgid "Edit merge requests"
+msgstr ""
+
msgid "Edit public deploy key"
msgstr ""
@@ -12233,6 +12424,9 @@ msgstr ""
msgid "Elastic|None. Select projects to index."
msgstr ""
+msgid "Eligible users"
+msgstr ""
+
msgid "Email"
msgstr ""
@@ -12362,6 +12556,9 @@ msgstr ""
msgid "Enable"
msgstr ""
+msgid "Enable Amazon EKS integration"
+msgstr ""
+
msgid "Enable Auto DevOps"
msgstr ""
@@ -12395,6 +12592,9 @@ msgstr ""
msgid "Enable SSL verification"
msgstr ""
+msgid "Enable Service Ping"
+msgstr ""
+
msgid "Enable Snowplow tracking"
msgstr ""
@@ -12425,6 +12625,9 @@ msgstr ""
msgid "Enable authenticated Git LFS request rate limit"
msgstr ""
+msgid "Enable authenticated web request rate limit"
+msgstr ""
+
msgid "Enable authentication"
msgstr ""
@@ -12485,7 +12688,7 @@ msgstr ""
msgid "Enable or disable the Pseudonymizer data collection."
msgstr ""
-msgid "Enable or disable version check and service ping."
+msgid "Enable or disable version check and Service Ping."
msgstr ""
msgid "Enable protected paths rate limit"
@@ -12497,18 +12700,12 @@ msgstr ""
msgid "Enable reCAPTCHA"
msgstr ""
-msgid "Enable reCAPTCHA for login"
-msgstr ""
-
-msgid "Enable reCAPTCHA, Invisible Captcha, Akismet and set IP limits. For reCAPTCHA, we currently only support %{recaptcha_v2_link_start}v2%{recaptcha_v2_link_end}"
+msgid "Enable reCAPTCHA for login."
msgstr ""
msgid "Enable repository checks"
msgstr ""
-msgid "Enable service ping"
-msgstr ""
-
msgid "Enable shared runners for all projects and subgroups in this group."
msgstr ""
@@ -12530,7 +12727,10 @@ msgstr ""
msgid "Enable unauthenticated API request rate limit"
msgstr ""
-msgid "Enable unauthenticated request rate limit"
+msgid "Enable unauthenticated web request rate limit"
+msgstr ""
+
+msgid "Enable user deactivation emails"
msgstr ""
msgid "Enable version check"
@@ -12566,9 +12766,6 @@ msgstr ""
msgid "Enabled sources for code import during project creation. OmniAuth must be configured for GitHub"
msgstr ""
-msgid "Enabling this will only make licensed EE features available to projects if the project namespace's plan includes the feature or if the project is public."
-msgstr ""
-
msgid "Encountered an error while rendering: %{err}"
msgstr ""
@@ -12617,9 +12814,6 @@ msgstr ""
msgid "Enter Admin Mode"
msgstr ""
-msgid "Enter IP address range"
-msgstr ""
-
msgid "Enter a number"
msgstr ""
@@ -12632,9 +12826,6 @@ msgstr ""
msgid "Enter at least three characters to search"
msgstr ""
-msgid "Enter domain"
-msgstr ""
-
msgid "Enter in your Bitbucket Server URL and personal access token below"
msgstr ""
@@ -12821,9 +13012,6 @@ msgstr ""
msgid "Environments|Deployment %{status}"
msgstr ""
-msgid "Environments|Dismiss"
-msgstr ""
-
msgid "Environments|Enable review app"
msgstr ""
@@ -12836,9 +13024,6 @@ msgstr ""
msgid "Environments|Environments are places where code gets deployed, such as staging or production."
msgstr ""
-msgid "Environments|Help us improve environments"
-msgstr ""
-
msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
msgstr ""
@@ -12875,6 +13060,9 @@ msgstr ""
msgid "Environments|Note that this action will stop the environment, but it will %{emphasisStart}not%{emphasisEnd} have an effect on any existing deployment due to no “stop environment action†being defined in the %{ciConfigLinkStart}.gitlab-ci.yml%{ciConfigLinkEnd} file."
msgstr ""
+msgid "Environments|Open"
+msgstr ""
+
msgid "Environments|Open live environment"
msgstr ""
@@ -12914,9 +13102,6 @@ msgstr ""
msgid "Environments|Stopping %{environmentName}"
msgstr ""
-msgid "Environments|Take the survey"
-msgstr ""
-
msgid "Environments|There was an error fetching the logs. Please try again."
msgstr ""
@@ -12938,9 +13123,6 @@ msgstr ""
msgid "Environments|You don't have any environments right now"
msgstr ""
-msgid "Environments|Your feedback helps GitLab make environments better for you and other users. Participate and enter a sweepstake to win a USD 30 gift card."
-msgstr ""
-
msgid "Environments|by %{avatar}"
msgstr ""
@@ -13223,7 +13405,7 @@ msgstr ""
msgid "Error parsing CSV file. Please make sure it has"
msgstr ""
-msgid "Error rendering markdown preview"
+msgid "Error rendering Markdown preview"
msgstr ""
msgid "Error saving label update."
@@ -13271,6 +13453,9 @@ msgstr ""
msgid "Error: %{error_message}"
msgstr ""
+msgid "Error: Couldn't load some or all of the changes."
+msgstr ""
+
msgid "Error: No AWS credentials were supplied"
msgstr ""
@@ -13304,6 +13489,9 @@ msgstr ""
msgid "ErrorTracking|Enable error tracking"
msgstr ""
+msgid "ErrorTracking|Error tracking backend"
+msgstr ""
+
msgid "ErrorTracking|If you self-host Sentry, enter your Sentry instance's full URL. If you use Sentry's hosted solution, enter https://sentry.io"
msgstr ""
@@ -13337,6 +13525,12 @@ msgstr ""
msgid "Escalation policies must have at least one rule"
msgstr ""
+msgid "EscalationPolicies|%{clockIcon} IF alert is not %{alertStatus} in %{minutes}"
+msgstr ""
+
+msgid "EscalationPolicies|%{notificationIcon} THEN %{doAction} %{forScheduleOrUser}"
+msgstr ""
+
msgid "EscalationPolicies|+ Add an additional rule"
msgstr ""
@@ -13379,13 +13573,13 @@ msgstr ""
msgid "EscalationPolicies|Escalation policies"
msgstr ""
-msgid "EscalationPolicies|Escalation rules"
+msgid "EscalationPolicies|Escalation policy %{obstacle} in Project %{project}"
msgstr ""
-msgid "EscalationPolicies|Failed to load oncall-schedules"
+msgid "EscalationPolicies|Escalation rules"
msgstr ""
-msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} %{then} THEN %{doAction} %{scheduleOrUser}"
+msgid "EscalationPolicies|Failed to load oncall-schedules"
msgstr ""
msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} minutes"
@@ -13463,18 +13657,36 @@ msgstr ""
msgid "Every %{action} attempt has failed: %{job_error_message}. Please try again."
msgstr ""
+msgid "Every 3 months"
+msgstr ""
+
+msgid "Every 3 months on the %{day} at %{time} %{timezone}"
+msgstr ""
+
+msgid "Every 6 months"
+msgstr ""
+
+msgid "Every 6 months on the %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Every day"
msgstr ""
msgid "Every day (at %{time})"
msgstr ""
+msgid "Every day at %{time} %{timezone}"
+msgstr ""
+
msgid "Every month"
msgstr ""
msgid "Every month (Day %{day} at %{time})"
msgstr ""
+msgid "Every month on the %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Every three months"
msgstr ""
@@ -13489,6 +13701,15 @@ msgstr[1] ""
msgid "Every week (%{weekday} at %{time})"
msgstr ""
+msgid "Every week on %{day} at %{time} %{timezone}"
+msgstr ""
+
+msgid "Every year"
+msgstr ""
+
+msgid "Every year on %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Everyone"
msgstr ""
@@ -13525,9 +13746,6 @@ msgstr ""
msgid "Exactly one of %{attributes} is required"
msgstr ""
-msgid "Example: %{ip_address}. %{read_more_link}."
-msgstr ""
-
msgid "Example: @sub\\.company\\.com$"
msgstr ""
@@ -13594,13 +13812,13 @@ msgstr ""
msgid "Expand pipeline"
msgstr ""
-msgid "Expand sidebar"
+msgid "Expand settings section"
msgstr ""
-msgid "Expected documents: %{expected_documents}"
+msgid "Expand sidebar"
msgstr ""
-msgid "Experienced"
+msgid "Expected documents: %{expected_documents}"
msgstr ""
msgid "ExperimentSubject|Must have exactly one of User, Namespace, or Project."
@@ -13885,9 +14103,6 @@ msgstr ""
msgid "Failed to load related branches"
msgstr ""
-msgid "Failed to load sidebar lock status"
-msgstr ""
-
msgid "Failed to load stacktrace."
msgstr ""
@@ -14312,6 +14527,9 @@ msgstr ""
msgid "Files"
msgstr ""
+msgid "Files API Rate Limits"
+msgstr ""
+
msgid "Files breadcrumb"
msgstr ""
@@ -15311,6 +15529,9 @@ msgstr ""
msgid "GitLab group: %{source_link}"
msgstr ""
+msgid "GitLab informs you if a new version is available."
+msgstr ""
+
msgid "GitLab is a complete DevOps platform, delivered as a single application, fundamentally changing the way Development, Security, and Ops teams collaborate"
msgstr ""
@@ -15326,7 +15547,7 @@ msgstr ""
msgid "GitLab is open source software to collaborate on code."
msgstr ""
-msgid "GitLab is undergoing maintenance and is operating in a read-only mode."
+msgid "GitLab is undergoing maintenance and is operating in read-only mode."
msgstr ""
msgid "GitLab member or Email address"
@@ -15338,9 +15559,6 @@ msgstr ""
msgid "GitLab project export"
msgstr ""
-msgid "GitLab restart is required to apply changes."
-msgstr ""
-
msgid "GitLab single sign-on URL"
msgstr ""
@@ -15356,9 +15574,6 @@ msgstr ""
msgid "GitLab version"
msgstr ""
-msgid "GitLab will inform you if a new version is available."
-msgstr ""
-
msgid "GitLab will run a background job that will produce pseudonymized CSVs of the GitLab database that will be uploaded to your configured object storage directory."
msgstr ""
@@ -15623,9 +15838,21 @@ msgstr ""
msgid "Go to snippets"
msgstr ""
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check 'Allowed domains for sign-ups'."
+msgstr ""
+
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check 'Email restrictions for sign-ups'."
+msgstr ""
+
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check the 'Domain denylist'."
+msgstr ""
+
msgid "Go to the activity feed"
msgstr ""
+msgid "Go to the group’s 'Settings &gt; General' page, and check 'Restrict membership by email domain'."
+msgstr ""
+
msgid "Go to the milestone list"
msgstr ""
@@ -15662,6 +15889,12 @@ msgstr ""
msgid "Goal of the changes and what reviewers should be aware of"
msgstr ""
+msgid "Google Cloud"
+msgstr ""
+
+msgid "Google Cloud offers several deployment targets. Select the one most suitable for your project."
+msgstr ""
+
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
@@ -15746,9 +15979,6 @@ msgstr ""
msgid "Group ID"
msgstr ""
-msgid "Group ID: %{group_id}"
-msgstr ""
-
msgid "Group Owner must have signed in with SAML before enabling Group Managed Accounts"
msgstr ""
@@ -15923,6 +16153,12 @@ msgstr ""
msgid "GroupImport|Unable to process group import file"
msgstr ""
+msgid "GroupPage|Copy group ID"
+msgstr ""
+
+msgid "GroupPage|Group ID: %{group_id}"
+msgstr ""
+
msgid "GroupRoadmap|%{dateWord} – No end date"
msgstr ""
@@ -15977,6 +16213,9 @@ msgstr ""
msgid "GroupRoadmap|Within 3 years"
msgstr ""
+msgid "GroupSAML|\"persistent\" recommended"
+msgstr ""
+
msgid "GroupSAML|%{strongOpen}Warning%{strongClose} - Enabling %{linkStart}SSO enforcement%{linkEnd} can reduce security risks."
msgstr ""
@@ -16109,6 +16348,9 @@ msgstr ""
msgid "GroupSAML|To be able to prohibit outer forks, you first need to enforce dedicate group managed accounts."
msgstr ""
+msgid "GroupSAML|Use SAML group links to manage group membership using SAML."
+msgstr ""
+
msgid "GroupSAML|Valid SAML Response"
msgstr ""
@@ -16121,13 +16363,10 @@ msgstr ""
msgid "GroupSAML|as %{access_level}"
msgstr ""
-msgid "GroupSAML|must match stored NameID of \"%{extern_uid}\" as we use this to identify users. If the NameID changes users will be unable to sign in."
-msgstr ""
-
-msgid "GroupSAML|should be \"persistent\""
+msgid "GroupSAML|must match stored NameID of \"%{extern_uid}\" to identify user and allow sign in"
msgstr ""
-msgid "GroupSAML|should be a random persistent ID, emails are discouraged"
+msgid "GroupSAML|recommend persistent ID instead of email"
msgstr ""
msgid "GroupSelect|No matching results"
@@ -16142,9 +16381,15 @@ msgstr ""
msgid "GroupSettings|Allow project access token creation"
msgstr ""
+msgid "GroupSettings|Applied to all subgroups unless overridden by a group owner. Groups already added to the project lose access."
+msgstr ""
+
msgid "GroupSettings|Auto DevOps pipeline was updated for the group"
msgstr ""
+msgid "GroupSettings|Available only on the top-level group. Applies to all subgroups. Groups already shared with a group outside %{group} are still shared unless removed manually."
+msgstr ""
+
msgid "GroupSettings|Badges"
msgstr ""
@@ -16196,6 +16441,9 @@ msgstr ""
msgid "GroupSettings|New runners registration token has been generated!"
msgstr ""
+msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgstr ""
+
msgid "GroupSettings|Pipeline settings was updated for the group"
msgstr ""
@@ -16208,12 +16456,15 @@ msgstr ""
msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
-msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups."
+msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups"
msgstr ""
msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
msgstr ""
+msgid "GroupSettings|Prevents group members from being notified if the group is mentioned."
+msgstr ""
+
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
msgstr ""
@@ -16250,21 +16501,6 @@ msgstr ""
msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}."
msgstr ""
-msgid "GroupSettings|This setting is only available on the top-level group and it applies to all subgroups. Groups that have already been shared with a group outside %{group} will still be shared, and this access will have to be revoked manually."
-msgstr ""
-
-msgid "GroupSettings|This setting will be applied to all subgroups unless overridden by a group owner. Groups that already have access to the project will continue to have access unless removed manually."
-msgstr ""
-
-msgid "GroupSettings|This setting will override user notification preferences for all members of the group, subgroups, and projects."
-msgstr ""
-
-msgid "GroupSettings|This setting will prevent group members from being notified if the group is mentioned."
-msgstr ""
-
-msgid "GroupSettings|This setting will prevent group members from forking projects outside of the group."
-msgstr ""
-
msgid "GroupSettings|Transfer group"
msgstr ""
@@ -16382,7 +16618,7 @@ msgstr ""
msgid "GroupsNew|No import options available"
msgstr ""
-msgid "GroupsNew|Not all related objects are migrated, as %{docs_link_start}described here%{docs_link_end}. Please %{feedback_link_start}leave feedback%{feedback_link_end} on this feature."
+msgid "GroupsNew|Not all related objects are migrated. %{docs_link_start}More info%{docs_link_end}."
msgstr ""
msgid "GroupsNew|Personal access token"
@@ -16514,15 +16750,27 @@ msgstr ""
msgid "Hello %{name},"
msgstr ""
-msgid "Hello there"
-msgstr ""
-
msgid "Hello, %{name}!"
msgstr ""
msgid "Hello, %{username}!"
msgstr ""
+msgid "HelloMessage|%{handshake_emoji} Contribute to GitLab: %{contribute_link}"
+msgstr ""
+
+msgid "HelloMessage|%{magnifier_emoji} Create a new GitLab issue: %{new_issue_link}"
+msgstr ""
+
+msgid "HelloMessage|%{rocket_emoji} We like your curiosity! Help us improve GitLab by joining the team: %{jobs_page_link}"
+msgstr ""
+
+msgid "HelloMessage|Does this page need fixes or improvements? Open an issue or contribute a merge request to help make GitLab more lovable. At GitLab, everyone can contribute!"
+msgstr ""
+
+msgid "HelloMessage|Welcome to GitLab!"
+msgstr ""
+
msgid "Help"
msgstr ""
@@ -16532,13 +16780,10 @@ msgstr ""
msgid "Helps prevent bots from creating accounts."
msgstr ""
-msgid "Helps prevent bots from creating issues"
-msgstr ""
-
-msgid "Helps prevent malicious users hide their activity"
+msgid "Helps prevent bots from creating issues."
msgstr ""
-msgid "Helps reduce request volume (e.g. from crawlers or abusive bots)"
+msgid "Helps prevent malicious users hide their activity."
msgstr ""
msgid "Helps reduce request volume (for example, from crawlers or abusive bots)"
@@ -16662,6 +16907,12 @@ msgstr ""
msgid "Housekeeping, export, path, transfer, remove, archive."
msgstr ""
+msgid "How do I configure Akismet?"
+msgstr ""
+
+msgid "How do I configure it?"
+msgstr ""
+
msgid "How do I configure runners?"
msgstr ""
@@ -16683,19 +16934,25 @@ msgstr ""
msgid "How do I set up this service?"
msgstr ""
+msgid "How do I use a web terminal?"
+msgstr ""
+
+msgid "How do I use file templates?"
+msgstr ""
+
msgid "How it works"
msgstr ""
msgid "How many days need to pass between marking entity for deletion and actual removing it."
msgstr ""
-msgid "How many seconds an IP will be counted towards the limit"
+msgid "How many seconds an IP counts toward the IP address limit."
msgstr ""
-msgid "I accept the %{terms_link}"
+msgid "How the job limiter handles jobs exceeding the thresholds specified below. The 'track' mode only logs the jobs. The 'compress' mode compresses the jobs and raises an exception if the compressed size exceeds the limit."
msgstr ""
-msgid "I accept the|Terms of Service and Privacy Policy"
+msgid "I accept the %{terms_link}"
msgstr ""
msgid "I forgot my password"
@@ -16779,13 +17036,16 @@ msgstr ""
msgid "IP Address"
msgstr ""
-msgid "IP expiration time"
+msgid "IP address expiration time"
msgstr ""
-msgid "IP subnet restriction only allowed for top-level groups"
+msgid "IP address restrictions"
+msgstr ""
+
+msgid "IP addresses per user"
msgstr ""
-msgid "IPs per user"
+msgid "IP subnet restriction only allowed for top-level groups"
msgstr ""
msgid "Identifier"
@@ -16800,6 +17060,9 @@ msgstr ""
msgid "If any indexed field exceeds this limit it will be truncated to this number of characters and the rest will not be indexed or searchable. This does not apply to repository and wiki indexing. Setting this to 0 means it is unlimited."
msgstr ""
+msgid "If blank, defaults to %{code_open}Retry later%{code_close}."
+msgstr ""
+
msgid "If blank, set allowable lifetime to %{instance_level_policy_in_words}, as defined by the instance admin. Once set, existing tokens for users in this group may be revoked."
msgstr ""
@@ -16851,6 +17114,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 did not initiate these sign-in attempts, please reach out to your administrator or enable two-factor authentication (2FA) on your account."
+msgstr ""
+
msgid "If you did not initiate this change, please contact your administrator immediately."
msgstr ""
@@ -16942,10 +17208,10 @@ msgstr ""
msgid "Import Projects from Gitea"
msgstr ""
-msgid "Import a project"
+msgid "Import an exported GitLab project"
msgstr ""
-msgid "Import an exported GitLab project"
+msgid "Import and export rate limits"
msgstr ""
msgid "Import failed due to a GitHub error: %{original}"
@@ -16957,12 +17223,18 @@ msgstr ""
msgid "Import from Jira"
msgstr ""
+msgid "Import group"
+msgstr ""
+
msgid "Import group from file"
msgstr ""
msgid "Import groups"
msgstr ""
+msgid "Import history"
+msgstr ""
+
msgid "Import in progress"
msgstr ""
@@ -17026,7 +17298,25 @@ msgstr ""
msgid "Import timed out. Import took longer than %{import_jobs_expiration} seconds"
msgstr ""
-msgid "Import/Export Rate Limits"
+msgid "ImportAProjectModal|Import from a project"
+msgstr ""
+
+msgid "ImportAProjectModal|Import members from another project"
+msgstr ""
+
+msgid "ImportAProjectModal|Import project members"
+msgstr ""
+
+msgid "ImportAProjectModal|Only project members (not group members) are imported, and they get the same permissions as the project you import from."
+msgstr ""
+
+msgid "ImportAProjectModal|Successfully imported"
+msgstr ""
+
+msgid "ImportAProjectModal|Unable to import project members"
+msgstr ""
+
+msgid "ImportAProjectModal|You're importing members to the %{strongStart}%{name}%{strongEnd} project."
msgstr ""
msgid "ImportButtons|Connect repositories from"
@@ -17079,7 +17369,7 @@ msgstr[1] ""
msgid "Importing..."
msgstr ""
-msgid "Import|A repository URL usually ends in a .git suffix, although this is not required. Double check to make sure your repository URL is correct."
+msgid "Import|There is not a valid Git repository at this URL. If your HTTP repository is not publicly accessible, verify your credentials."
msgstr ""
msgid "Improve customer support with Service Desk"
@@ -17088,9 +17378,6 @@ msgstr ""
msgid "Improves Git cloning performance."
msgstr ""
-msgid "In %{time_to_now}"
-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 ""
@@ -17376,7 +17663,7 @@ msgstr ""
msgid "InProductMarketing|Start a GitLab Ultimate trial today in less than one minute, no credit card required."
msgstr ""
-msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no CC required"
+msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no credit card required"
msgstr ""
msgid "InProductMarketing|Start a trial"
@@ -17415,7 +17702,7 @@ msgstr ""
msgid "InProductMarketing|Team up in GitLab for greater efficiency"
msgstr ""
-msgid "InProductMarketing|Team work makes the dream work"
+msgid "InProductMarketing|Team work makes the dream work"
msgstr ""
msgid "InProductMarketing|Test, create, deploy"
@@ -17996,6 +18283,9 @@ msgstr ""
msgid "Integrations|Create new issue in Jira"
msgstr ""
+msgid "Integrations|Create new issue in ZenTao"
+msgstr ""
+
msgid "Integrations|Default settings are inherited from the group level."
msgstr ""
@@ -18089,9 +18379,15 @@ msgstr ""
msgid "Integrations|Search Jira issues"
msgstr ""
+msgid "Integrations|Search ZenTao issues"
+msgstr ""
+
msgid "Integrations|Send notifications about project events to Unify Circuit."
msgstr ""
+msgid "Integrations|Send notifications about project events to a Unify Circuit conversation. %{docs_link}"
+msgstr ""
+
msgid "Integrations|Sign in to add namespaces"
msgstr ""
@@ -18131,6 +18427,9 @@ msgstr ""
msgid "Integrations|You've activated every integration 🎉"
msgstr ""
+msgid "Integrations|ZenTao issues display here when you create issues in your project in ZenTao."
+msgstr ""
+
msgid "Interactive mode"
msgstr ""
@@ -18158,9 +18457,6 @@ msgstr ""
msgid "Interval Pattern"
msgstr ""
-msgid "Introducing Value Stream Analytics"
-msgstr ""
-
msgid "Introducing Your DevOps Report"
msgstr ""
@@ -18257,6 +18553,12 @@ msgstr ""
msgid "Investigate vulnerability: %{title}"
msgstr ""
+msgid "Invisible Captcha"
+msgstr ""
+
+msgid "Invisible Captcha helps prevent the creation of spam accounts. It adds a honeypot field and time-sensitive form submission to the account signup form."
+msgstr ""
+
msgid "Invitation"
msgstr ""
@@ -18710,12 +19012,18 @@ msgstr ""
msgid "Issues"
msgstr ""
+msgid "Issues I've created"
+msgstr ""
+
msgid "Issues Rate Limits"
msgstr ""
msgid "Issues and merge requests"
msgstr ""
+msgid "Issues assigned to me"
+msgstr ""
+
msgid "Issues can be bugs, tasks or ideas to be discussed. Also, issues are searchable and filterable."
msgstr ""
@@ -18827,7 +19135,7 @@ msgstr ""
msgid "Iterations|Create cadence"
msgstr ""
-msgid "Iterations|Create your first iteration"
+msgid "Iterations|Create iteration"
msgstr ""
msgid "Iterations|Delete cadence"
@@ -18836,6 +19144,9 @@ msgstr ""
msgid "Iterations|Delete iteration cadence?"
msgstr ""
+msgid "Iterations|Delete iteration?"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -18869,12 +19180,18 @@ msgstr ""
msgid "Iterations|New iteration cadence"
msgstr ""
+msgid "Iterations|No closed iterations."
+msgstr ""
+
msgid "Iterations|No iteration cadences to show."
msgstr ""
msgid "Iterations|No iterations in cadence."
msgstr ""
+msgid "Iterations|No open iterations."
+msgstr ""
+
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
@@ -18905,6 +19222,9 @@ msgstr ""
msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
msgstr ""
+msgid "Iterations|This will remove the iteration from any issues that are assigned to it."
+msgstr ""
+
msgid "Iterations|Title"
msgstr ""
@@ -18920,15 +19240,9 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "I’m familiar with the basics of DevOps."
-msgstr ""
-
msgid "I’m joining my team who’s already on GitLab"
msgstr ""
-msgid "I’m not familiar with the basics of DevOps."
-msgstr ""
-
msgid "Jaeger URL"
msgstr ""
@@ -19193,6 +19507,9 @@ msgstr ""
msgid "Job"
msgstr ""
+msgid "Job %{jobName}"
+msgstr ""
+
msgid "Job Failed #%{build_id}"
msgstr ""
@@ -19783,9 +20100,6 @@ msgstr ""
msgid "Learn more in the"
msgstr ""
-msgid "Learn more in the|pipeline schedules documentation"
-msgstr ""
-
msgid "Learn more."
msgstr ""
@@ -19897,9 +20211,6 @@ msgstr ""
msgid "Leave Admin Mode"
msgstr ""
-msgid "Leave blank for no limit. Once set, existing personal access tokens may be revoked."
-msgstr ""
-
msgid "Leave edit mode? All unsaved changes will be lost."
msgstr ""
@@ -19945,10 +20256,10 @@ msgstr ""
msgid "LicenseCompliance|Acceptable license to be used in the project"
msgstr ""
-msgid "LicenseCompliance|Add a license"
+msgid "LicenseCompliance|Add license and related policy"
msgstr ""
-msgid "LicenseCompliance|Add license and related policy"
+msgid "LicenseCompliance|Add license policy"
msgstr ""
msgid "LicenseCompliance|Allow"
@@ -20038,6 +20349,9 @@ msgstr ""
msgid "LicenseManagement|Uncategorized"
msgstr ""
+msgid "Licensed Enterprise Edition features can be used if the project namespace's plan includes the feature, or if the project is public."
+msgstr ""
+
msgid "Licensed Features"
msgstr ""
@@ -20104,7 +20418,10 @@ msgstr ""
msgid "Limit namespaces and projects that can be indexed"
msgstr ""
-msgid "Limit sign in from multiple ips"
+msgid "Limit project size at a global, group, and project level. %{link_start}Learn more%{link_end}."
+msgstr ""
+
+msgid "Limit sign in from multiple IP addresses"
msgstr ""
msgid "Limit the number of concurrent operations this secondary site can run in the background."
@@ -20116,11 +20433,17 @@ msgstr ""
msgid "Limit the number of issues and epics per minute a user can create through web and API requests."
msgstr ""
+msgid "Limit the size of Sidekiq jobs stored in Redis."
+msgstr ""
+
msgid "Limited to showing %d event at most"
msgid_plural "Limited to showing %d events at most"
msgstr[0] ""
msgstr[1] ""
+msgid "Limiting mode"
+msgstr ""
+
msgid "Line changes"
msgstr ""
@@ -20190,9 +20513,6 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
-msgid "List of users to be excluded from the limit"
-msgstr ""
-
msgid "List options"
msgstr ""
@@ -20232,9 +20552,6 @@ msgstr ""
msgid "Loading functions timed out. Please reload the page to try again."
msgstr ""
-msgid "Loading issues"
-msgstr ""
-
msgid "Loading more"
msgstr ""
@@ -20526,6 +20843,9 @@ msgstr ""
msgid "Marked For Deletion At - %{deletion_time}"
msgstr ""
+msgid "Marked as ready. Merging is now allowed."
+msgstr ""
+
msgid "Marked this %{noun} as a draft."
msgstr ""
@@ -20598,52 +20918,22 @@ msgstr ""
msgid "Max 100,000 events"
msgstr ""
-msgid "Max 20 characters"
-msgstr ""
-
-msgid "Max Group Export Download requests per minute per user"
-msgstr ""
-
-msgid "Max Group Export requests per minute per user"
-msgstr ""
-
-msgid "Max Group Import requests per minute per user"
-msgstr ""
-
-msgid "Max Project Export Download requests per minute per user"
-msgstr ""
-
-msgid "Max Project Export requests per minute per user"
-msgstr ""
-
-msgid "Max Project Import requests per minute per user"
-msgstr ""
-
-msgid "Max authenticated API requests per period per user"
-msgstr ""
-
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
-msgid "Max authenticated web requests per period per user"
-msgstr ""
-
msgid "Max file size is 200 KB."
msgstr ""
-msgid "Max requests per minute per user"
-msgstr ""
-
msgid "Max role"
msgstr ""
msgid "Max session time"
msgstr ""
-msgid "Max unauthenticated requests per period per IP"
+msgid "MaxBuilds"
msgstr ""
-msgid "MaxBuilds"
+msgid "Maximum 20 characters"
msgstr ""
msgid "Maximum Conan package file size in bytes"
@@ -20679,6 +20969,12 @@ msgstr ""
msgid "Maximum attachment size (MB)"
msgstr ""
+msgid "Maximum authenticated API requests per rate limit period per user"
+msgstr ""
+
+msgid "Maximum authenticated web requests per rate limit period per user"
+msgstr ""
+
msgid "Maximum bulk request size (MiB)"
msgstr ""
@@ -20724,6 +21020,15 @@ msgstr ""
msgid "Maximum files in a diff"
msgstr ""
+msgid "Maximum group export download requests per minute"
+msgstr ""
+
+msgid "Maximum group export requests per minute"
+msgstr ""
+
+msgid "Maximum group import requests per minute"
+msgstr ""
+
msgid "Maximum import size"
msgstr ""
@@ -20760,7 +21065,7 @@ msgstr ""
msgid "Maximum number of projects."
msgstr ""
-msgid "Maximum number of unique IPs per user"
+msgid "Maximum number of unique IP addresses per user."
msgstr ""
msgid "Maximum page reached"
@@ -20769,12 +21074,24 @@ msgstr ""
msgid "Maximum page size"
msgstr ""
+msgid "Maximum project export download requests per minute"
+msgstr ""
+
+msgid "Maximum project export requests per minute"
+msgstr ""
+
+msgid "Maximum project import requests per minute"
+msgstr ""
+
msgid "Maximum push size"
msgstr ""
msgid "Maximum push size (MB)"
msgstr ""
+msgid "Maximum requests per minute"
+msgstr ""
+
msgid "Maximum running slices"
msgstr ""
@@ -20802,10 +21119,16 @@ msgstr ""
msgid "Maximum time between updates that a mirror can have when scheduled to synchronize."
msgstr ""
-msgid "Maximum time for web terminal websocket connection (in seconds). 0 for unlimited."
+msgid "Maximum time that users are allowed to skip the setup of two-factor authentication (in hours). Set to 0 (zero) to enforce at next sign in."
msgstr ""
-msgid "Maximum time that users are allowed to skip the setup of two-factor authentication (in hours). Set to 0 (zero) to enforce at next sign in."
+msgid "Maximum time, in seconds, for a web terminal websocket connection. 0 for unlimited."
+msgstr ""
+
+msgid "Maximum unauthenticated API requests per rate limit period per IP"
+msgstr ""
+
+msgid "Maximum unauthenticated web requests per rate limit period per IP"
msgstr ""
msgid "May"
@@ -20823,9 +21146,6 @@ msgstr ""
msgid "Medium vulnerabilities present"
msgstr ""
-msgid "Member lock"
-msgstr ""
-
msgid "Member since"
msgstr ""
@@ -20862,6 +21182,9 @@ msgstr ""
msgid "Members of a group may only view projects they have permission to access"
msgstr ""
+msgid "Membership"
+msgstr ""
+
msgid "Members|%{time} by %{user}"
msgstr ""
@@ -20922,9 +21245,6 @@ msgstr ""
msgid "Members|Expiration date updated successfully."
msgstr ""
-msgid "Members|Expired"
-msgstr ""
-
msgid "Members|Filter members"
msgstr ""
@@ -20940,9 +21260,6 @@ msgstr ""
msgid "Members|Membership"
msgstr ""
-msgid "Members|No expiration set"
-msgstr ""
-
msgid "Members|Remove \"%{groupName}\""
msgstr ""
@@ -20964,9 +21281,6 @@ msgstr ""
msgid "Members|Search invited"
msgstr ""
-msgid "Members|in %{time}"
-msgstr ""
-
msgid "Member|Deny access"
msgstr ""
@@ -21042,9 +21356,6 @@ msgstr ""
msgid "Merge request %{mr_link} was reviewed by %{mr_author}"
msgstr ""
-msgid "Merge request (MR) approvals"
-msgstr ""
-
msgid "Merge request analytics"
msgstr ""
@@ -21066,12 +21377,21 @@ msgstr ""
msgid "Merge requests"
msgstr ""
+msgid "Merge requests I've created"
+msgstr ""
+
msgid "Merge requests are a place to propose changes you've made to a project and discuss those changes with others"
msgstr ""
msgid "Merge requests are read-only in a secondary Geo node"
msgstr ""
+msgid "Merge requests assigned to me"
+msgstr ""
+
+msgid "Merge requests that I'm a reviewer"
+msgstr ""
+
msgid "Merge the branch and fix any conflicts that come up"
msgstr ""
@@ -21132,10 +21452,10 @@ msgstr ""
msgid "MergeRequests|An error occurred while saving the draft comment."
msgstr ""
-msgid "MergeRequests|Failed to squash. Should be done manually."
+msgid "MergeRequests|Create issue to resolve thread"
msgstr ""
-msgid "MergeRequests|Resolve this thread in a new issue"
+msgid "MergeRequests|Failed to squash. Should be done manually."
msgstr ""
msgid "MergeRequests|Saving the comment failed"
@@ -21949,6 +22269,9 @@ msgstr ""
msgid "MoveIssue|Cannot move issue to project it originates from!"
msgstr ""
+msgid "MoveIssue|Cannot move issues of '%{issue_type}' type."
+msgstr ""
+
msgid "Moved issue to %{label} column in the board."
msgstr ""
@@ -22074,6 +22397,15 @@ 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. To learn more about reducing storage capacity please visit our docs."
msgstr ""
+msgid "NamespaceUserCap|Pending users must be reviewed and approved by a group owner. Learn more about %{user_caps_link_start}User Caps%{link_end} and %{users_pending_approval_link_start}Users Pending Approval%{link_end}."
+msgstr ""
+
+msgid "NamespaceUserCap|View pending user approvals"
+msgstr ""
+
+msgid "NamespaceUserCap|Your group has reached its billable member limit"
+msgstr ""
+
msgid "Namespaces"
msgstr ""
@@ -22116,9 +22448,6 @@ msgstr ""
msgid "Network"
msgstr ""
-msgid "Network Policy|New rule"
-msgstr ""
-
msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is inbound from a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
msgstr ""
@@ -22140,16 +22469,13 @@ msgstr ""
msgid "NetworkPolicies|%{strongOpen}any%{strongClose} port"
msgstr ""
-msgid "NetworkPolicies|+ Add alert"
-msgstr ""
-
msgid "NetworkPolicies|.yaml"
msgstr ""
msgid "NetworkPolicies|.yaml mode"
msgstr ""
-msgid "NetworkPolicies|Actions"
+msgid "NetworkPolicies|Add alert"
msgstr ""
msgid "NetworkPolicies|Alerts are intended to be selectively used for a limited number of events that are potentially concerning and warrant a manual review. Alerts should not be used as a substitute for a SIEM or a logging tool. High volume alerts are likely to be dropped so as to preserve the stability of GitLab's integration with Kubernetes."
@@ -22185,9 +22511,6 @@ msgstr ""
msgid "NetworkPolicies|Deny all traffic"
msgstr ""
-msgid "NetworkPolicies|Description"
-msgstr ""
-
msgid "NetworkPolicies|Edit policy"
msgstr ""
@@ -22200,9 +22523,6 @@ msgstr ""
msgid "NetworkPolicies|IP/subnet"
msgstr ""
-msgid "NetworkPolicies|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
-msgstr ""
-
msgid "NetworkPolicies|Invalid or empty policy"
msgstr ""
@@ -22212,19 +22532,16 @@ msgstr ""
msgid "NetworkPolicies|Kubernetes error: %{error}"
msgstr ""
-msgid "NetworkPolicies|Name"
-msgstr ""
-
msgid "NetworkPolicies|Network"
msgstr ""
-msgid "NetworkPolicies|Network traffic"
+msgid "NetworkPolicies|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
msgstr ""
-msgid "NetworkPolicies|New policy"
+msgid "NetworkPolicies|Network policy can be created after the environment is loaded successfully."
msgstr ""
-msgid "NetworkPolicies|No policies detected"
+msgid "NetworkPolicies|Network traffic"
msgstr ""
msgid "NetworkPolicies|None selected"
@@ -22233,21 +22550,12 @@ msgstr ""
msgid "NetworkPolicies|Please %{installLinkStart}install%{installLinkEnd} and %{configureLinkStart}configure a Kubernetes Agent for this project%{configureLinkEnd} to enable alerts."
msgstr ""
-msgid "NetworkPolicies|Policies are a specification of how groups of pods are allowed to communicate with each other's network endpoints."
-msgstr ""
-
msgid "NetworkPolicies|Policy %{policyName} was successfully changed"
msgstr ""
msgid "NetworkPolicies|Policy definition"
msgstr ""
-msgid "NetworkPolicies|Policy editor"
-msgstr ""
-
-msgid "NetworkPolicies|Policy preview"
-msgstr ""
-
msgid "NetworkPolicies|Rule"
msgstr ""
@@ -22257,9 +22565,6 @@ msgstr ""
msgid "NetworkPolicies|Rule mode is unavailable for this policy. In some cases, we cannot parse the YAML file back into the rules editor."
msgstr ""
-msgid "NetworkPolicies|Rules"
-msgstr ""
-
msgid "NetworkPolicies|Save changes"
msgstr ""
@@ -22272,9 +22577,6 @@ msgstr ""
msgid "NetworkPolicies|Traffic that does not match any rule will be blocked."
msgstr ""
-msgid "NetworkPolicies|Unable to parse policy"
-msgstr ""
-
msgid "NetworkPolicies|all DNS names"
msgstr ""
@@ -22454,6 +22756,9 @@ msgstr ""
msgid "New issue"
msgstr ""
+msgid "New issue in %{project}"
+msgstr ""
+
msgid "New issue title"
msgstr ""
@@ -22532,7 +22837,7 @@ msgstr ""
msgid "Newest first"
msgstr ""
-msgid "Newly registered users will by default be external"
+msgid "Newly-registered users are external by default"
msgstr ""
msgid "Next"
@@ -22847,8 +23152,10 @@ msgstr ""
msgid "No webhooks found, add one in the form above."
msgstr ""
-msgid "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} to renew your subscription."
-msgstr ""
+msgid "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} day to renew your subscription."
+msgid_plural "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} days to renew your subscription."
+msgstr[0] ""
+msgstr[1] ""
msgid "No. of commits"
msgstr ""
@@ -22865,7 +23172,7 @@ msgstr ""
msgid "Nodes"
msgstr ""
-msgid "Non-admin users can sign in with read-only access and make read-only API requests."
+msgid "Non-admin users are restricted to read-only access, in both GitLab UI and API."
msgstr ""
msgid "None"
@@ -22946,7 +23253,7 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
-msgid "Notes Rate Limits"
+msgid "Notes rate limit"
msgstr ""
msgid "Notes|Are you sure you want to cancel creating this comment?"
@@ -23113,9 +23420,6 @@ msgstr ""
msgid "November"
msgstr ""
-msgid "Novice"
-msgstr ""
-
msgid "Now, personalize your GitLab experience"
msgstr ""
@@ -23284,7 +23588,7 @@ msgstr ""
msgid "OnCallSchedules|For this rotation, on-call will be:"
msgstr ""
-msgid "OnCallSchedules|On-call schedule %{schedule} in Project %{project}"
+msgid "OnCallSchedules|On-call schedule %{obstacle} in Project %{project}"
msgstr ""
msgid "OnCallSchedules|On-call schedules"
@@ -23431,22 +23735,22 @@ msgstr ""
msgid "OnDemandScans|Scanner profile"
msgstr ""
-msgid "OnDemandScans|Select one of the existing profiles"
+msgid "OnDemandScans|Schedule scan"
msgstr ""
-msgid "OnDemandScans|Site profile"
+msgid "OnDemandScans|Select one of the existing profiles"
msgstr ""
-msgid "OnDemandScans|Use existing scanner profile"
+msgid "OnDemandScans|Site profile"
msgstr ""
-msgid "OnDemandScans|Use existing site profile"
+msgid "OnDemandScans|Start time"
msgstr ""
-msgid "OnDemandScans|You can either choose a passive scan or validate the target site in your chosen site profile. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
+msgid "OnDemandScans|Use existing scanner profile"
msgstr ""
-msgid "OnDemandScans|You cannot run an active scan against an unvalidated site."
+msgid "OnDemandScans|Use existing site profile"
msgstr ""
msgid "OnDemandScans|You must create a repository within your project to run an on-demand scan."
@@ -23511,6 +23815,9 @@ msgstr ""
msgid "Only admins can delete project"
msgstr ""
+msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
+msgstr ""
+
msgid "Only include features new to your current subscription tier."
msgstr ""
@@ -23529,6 +23836,12 @@ msgstr ""
msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
+msgid "Only reCAPTCHA v2 is supported:"
+msgstr ""
+
+msgid "Only users from the specified IP address ranges are able to reach this group, including all subgroups, projects, and Git repositories."
+msgstr ""
+
msgid "Only verified users with an email address in any of these domains can be added to the group."
msgstr ""
@@ -23715,9 +24028,6 @@ msgstr ""
msgid "Package Registry"
msgstr ""
-msgid "Package Registry Rate Limits"
-msgstr ""
-
msgid "Package Registry: authenticated API requests"
msgstr ""
@@ -23736,6 +24046,9 @@ msgstr ""
msgid "Package recipe already exists"
msgstr ""
+msgid "Package registry rate limits"
+msgstr ""
+
msgid "Package type"
msgstr ""
@@ -23802,6 +24115,9 @@ msgstr ""
msgid "PackageRegistry|Composer"
msgstr ""
+msgid "PackageRegistry|Composer.json with license: %{license} and version: %{version}"
+msgstr ""
+
msgid "PackageRegistry|Conan"
msgstr ""
@@ -23865,6 +24181,9 @@ msgstr ""
msgid "PackageRegistry|Copy require package include"
msgstr ""
+msgid "PackageRegistry|Copy target SHA"
+msgstr ""
+
msgid "PackageRegistry|Copy yarn command"
msgstr ""
@@ -23931,6 +24250,9 @@ msgstr ""
msgid "PackageRegistry|Install package version"
msgstr ""
+msgid "PackageRegistry|Instance-level"
+msgstr ""
+
msgid "PackageRegistry|Invalid Package: failed metadata extraction"
msgstr ""
@@ -23976,6 +24298,9 @@ msgstr ""
msgid "PackageRegistry|Pip Command"
msgstr ""
+msgid "PackageRegistry|Project-level"
+msgstr ""
+
msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
msgstr ""
@@ -23997,6 +24322,9 @@ msgstr ""
msgid "PackageRegistry|Remove package"
msgstr ""
+msgid "PackageRegistry|Required Python: %{pythonVersion}"
+msgstr ""
+
msgid "PackageRegistry|RubyGems"
msgstr ""
@@ -24039,6 +24367,9 @@ msgstr ""
msgid "PackageRegistry|Source project located at %{link}"
msgstr ""
+msgid "PackageRegistry|Target SHA: %{sha}"
+msgstr ""
+
msgid "PackageRegistry|There are no other versions of this package."
msgstr ""
@@ -24207,6 +24538,18 @@ msgstr ""
msgid "Password was successfully updated. Please sign in again."
msgstr ""
+msgid "PasswordPrompt|Confirm password"
+msgstr ""
+
+msgid "PasswordPrompt|Confirm password to continue"
+msgstr ""
+
+msgid "PasswordPrompt|Password is required"
+msgstr ""
+
+msgid "PasswordPrompt|Please enter your password to confirm"
+msgstr ""
+
msgid "Passwords should be unique and not used for any other sites or services."
msgstr ""
@@ -24234,6 +24577,9 @@ msgstr ""
msgid "Paste project path (i.e. gitlab-org/gitlab)"
msgstr ""
+msgid "Paste this DSN into your Sentry SDK"
+msgstr ""
+
msgid "Paste your public SSH key, which is usually contained in the file '~/.ssh/id_ed25519.pub' or '~/.ssh/id_rsa.pub' and begins with 'ssh-ed25519' or 'ssh-rsa'. Do not paste your private SSH key, as that can compromise your identity."
msgstr ""
@@ -24318,6 +24664,9 @@ msgstr ""
msgid "PerformanceBar|First Contentful Paint"
msgstr ""
+msgid "PerformanceBar|Flamegraph with mode:"
+msgstr ""
+
msgid "PerformanceBar|Frontend resources"
msgstr ""
@@ -24351,6 +24700,15 @@ msgstr ""
msgid "PerformanceBar|Trace"
msgstr ""
+msgid "PerformanceBar|cpu"
+msgstr ""
+
+msgid "PerformanceBar|object"
+msgstr ""
+
+msgid "PerformanceBar|wall"
+msgstr ""
+
msgid "Period in seconds"
msgstr ""
@@ -24579,6 +24937,48 @@ msgstr ""
msgid "PipelineSchedules|Variables"
msgstr ""
+msgid "PipelineSource|API"
+msgstr ""
+
+msgid "PipelineSource|Chat"
+msgstr ""
+
+msgid "PipelineSource|External"
+msgstr ""
+
+msgid "PipelineSource|External Pull Request"
+msgstr ""
+
+msgid "PipelineSource|Merge Request"
+msgstr ""
+
+msgid "PipelineSource|On-Demand DAST Scan"
+msgstr ""
+
+msgid "PipelineSource|On-Demand DAST Validation"
+msgstr ""
+
+msgid "PipelineSource|Parent Pipeline"
+msgstr ""
+
+msgid "PipelineSource|Pipeline"
+msgstr ""
+
+msgid "PipelineSource|Push"
+msgstr ""
+
+msgid "PipelineSource|Schedule"
+msgstr ""
+
+msgid "PipelineSource|Trigger"
+msgstr ""
+
+msgid "PipelineSource|Web"
+msgstr ""
+
+msgid "PipelineSource|Web IDE"
+msgstr ""
+
msgid "PipelineStatusTooltip|Pipeline: %{ciStatus}"
msgstr ""
@@ -24879,46 +25279,7 @@ msgstr ""
msgid "Pipeline|Source"
msgstr ""
-msgid "Pipeline|Source|API"
-msgstr ""
-
-msgid "Pipeline|Source|Chat"
-msgstr ""
-
-msgid "Pipeline|Source|External"
-msgstr ""
-
-msgid "Pipeline|Source|External Pull Request"
-msgstr ""
-
-msgid "Pipeline|Source|Merge Request"
-msgstr ""
-
-msgid "Pipeline|Source|On-Demand DAST Scan"
-msgstr ""
-
-msgid "Pipeline|Source|On-Demand DAST Validation"
-msgstr ""
-
-msgid "Pipeline|Source|Parent Pipeline"
-msgstr ""
-
-msgid "Pipeline|Source|Pipeline"
-msgstr ""
-
-msgid "Pipeline|Source|Push"
-msgstr ""
-
-msgid "Pipeline|Source|Schedule"
-msgstr ""
-
-msgid "Pipeline|Source|Trigger"
-msgstr ""
-
-msgid "Pipeline|Source|Web"
-msgstr ""
-
-msgid "Pipeline|Source|Web IDE"
+msgid "Pipeline|Source|Security Policy"
msgstr ""
msgid "Pipeline|Specify variable values to be used in this run. The values specified in %{linkStart}CI/CD settings%{linkEnd} will be used by default."
@@ -24969,7 +25330,7 @@ msgstr ""
msgid "Pipeline|We are currently unable to fetch pipeline data"
msgstr ""
-msgid "Pipeline|You’re about to stop pipeline %{pipelineId}."
+msgid "Pipeline|You’re about to stop pipeline #%{pipelineId}."
msgstr ""
msgid "Pipeline|for"
@@ -24996,6 +25357,9 @@ msgstr ""
msgid "Plain diff"
msgstr ""
+msgid "Plain-text response to send to clients that hit a rate limit"
+msgstr ""
+
msgid "Plan:"
msgstr ""
@@ -25140,9 +25504,6 @@ msgstr ""
msgid "Please provide attributes to update"
msgstr ""
-msgid "Please provide your username or email address."
-msgstr ""
-
msgid "Please reach out if you have any questions and we'll be happy to assist."
msgstr ""
@@ -25185,9 +25546,6 @@ msgstr ""
msgid "Please set a new password before proceeding."
msgstr ""
-msgid "Please share your feedback about %{featureName} %{linkStart}in this issue%{linkEnd} to help us improve the experience."
-msgstr ""
-
msgid "Please solve the captcha"
msgstr ""
@@ -25365,6 +25723,9 @@ msgstr ""
msgid "Prevent adding new members to project membership within this group"
msgstr ""
+msgid "Prevent auto-stopping"
+msgstr ""
+
msgid "Prevent editing approval rules in projects and merge requests."
msgstr ""
@@ -25377,7 +25738,7 @@ msgstr ""
msgid "Prevent users from changing their profile name"
msgstr ""
-msgid "Prevent users from performing write operations on GitLab while performing maintenance."
+msgid "Prevent users from performing write operations while GitLab maintenance is in progress."
msgstr ""
msgid "Preview"
@@ -25650,6 +26011,9 @@ msgstr ""
msgid "Profiles|Enter your name, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Enter your password to confirm the email change"
+msgstr ""
+
msgid "Profiles|Enter your pronouns to let people know how to refer to you"
msgstr ""
@@ -25884,10 +26248,10 @@ msgstr ""
msgid "Profiles|e.g. My MacBook key"
msgstr ""
-msgid "Profiles|username"
+msgid "Profiles|https://website.com"
msgstr ""
-msgid "Profiles|website.com"
+msgid "Profiles|username"
msgstr ""
msgid "Profiles|your account"
@@ -26130,9 +26494,21 @@ msgstr ""
msgid "ProjectSelect| or group"
msgstr ""
+msgid "ProjectSelect|No matching results"
+msgstr ""
+
msgid "ProjectSelect|Search for project"
msgstr ""
+msgid "ProjectSelect|Search projects"
+msgstr ""
+
+msgid "ProjectSelect|Select a project"
+msgstr ""
+
+msgid "ProjectSelect|There was an error fetching the projects. Please try again."
+msgstr ""
+
msgid "ProjectService|Drone server URL"
msgstr ""
@@ -26220,6 +26596,9 @@ msgstr ""
msgid "ProjectService|Trigger event when a new, unique alert is recorded."
msgstr ""
+msgid "ProjectService|Trigger event when a new, unique vulnerability is recorded. (Note: This feature requires an Ultimate plan.)"
+msgstr ""
+
msgid "ProjectService|Trigger event when a pipeline status changes."
msgstr ""
@@ -26634,9 +27013,15 @@ msgstr ""
msgid "Projects are graded based on the highest severity vulnerability present"
msgstr ""
+msgid "Projects are organized into groups"
+msgstr ""
+
msgid "Projects contributed to"
msgstr ""
+msgid "Projects help you organize your work. They contain your file repository, issues, merge requests, and so much more."
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr ""
@@ -26871,10 +27256,10 @@ msgstr ""
msgid "PrometheusService|Prometheus cluster integration"
msgstr ""
-msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
+msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
msgstr ""
-msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
+msgid "PrometheusService|The ID of the IAP-secured resource."
msgstr ""
msgid "PrometheusService|The Prometheus API base URL."
@@ -27492,6 +27877,9 @@ msgstr ""
msgid "Rate limit"
msgstr ""
+msgid "Rate limits can help reduce request volume (like from crawlers or abusive bots)."
+msgstr ""
+
msgid "Raw blob request rate limit per minute"
msgstr ""
@@ -27504,6 +27892,9 @@ msgstr ""
msgid "Re-authentication required"
msgstr ""
+msgid "Re-import"
+msgstr ""
+
msgid "Re-request review"
msgstr ""
@@ -27525,6 +27916,9 @@ msgstr ""
msgid "Read more about related issues"
msgstr ""
+msgid "Read their documentation."
+msgstr ""
+
msgid "Ready to get started with GitLab? Follow these steps to set up your workspace, plan and commit changes, and deploy your project."
msgstr ""
@@ -27558,6 +27952,9 @@ msgstr ""
msgid "Receive any notifications from GitLab."
msgstr ""
+msgid "Receive notification of abuse reports by email."
+msgstr ""
+
msgid "Receive notifications about your own activity"
msgstr ""
@@ -27701,9 +28098,6 @@ msgstr ""
msgid "Registry setup"
msgstr ""
-msgid "Regulate approvals by authors/committers. Affects all projects."
-msgstr ""
-
msgid "Reindexing Status: %{status} (Slice multiplier: %{multiplier}, Maximum running slices: %{max_slices})"
msgstr ""
@@ -27799,6 +28193,9 @@ msgstr ""
msgid "Release|Something went wrong while saving the release details."
msgstr ""
+msgid "Reload page"
+msgstr ""
+
msgid "Remediations"
msgstr ""
@@ -28081,6 +28478,9 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
+msgid "Repeats"
+msgstr ""
+
msgid "Replace"
msgstr ""
@@ -28443,10 +28843,7 @@ msgstr ""
msgid "Require additional authentication for administrative tasks."
msgstr ""
-msgid "Require all users in this group to setup Two-factor authentication"
-msgstr ""
-
-msgid "Require all users in this group to setup two-factor authentication"
+msgid "Require all users in this group to set up two-factor authentication"
msgstr ""
msgid "Required approvals (%{approvals_given} given)"
@@ -28492,6 +28889,9 @@ msgstr[1] ""
msgid "Requires values to meet regular expression requirements."
msgstr ""
+msgid "Requires you to deploy or set up cloud-hosted Sentry."
+msgstr ""
+
msgid "Requires your primary GitLab email address."
msgstr ""
@@ -28552,9 +28952,6 @@ msgstr ""
msgid "Resolve"
msgstr ""
-msgid "Resolve all threads in new issue"
-msgstr ""
-
msgid "Resolve conflicts"
msgstr ""
@@ -28612,6 +29009,9 @@ msgstr ""
msgid "Response text"
msgstr ""
+msgid "Restart GitLab to apply changes."
+msgstr ""
+
msgid "Restart Terminal"
msgstr ""
@@ -28630,6 +29030,9 @@ msgstr ""
msgid "Restoring the project will prevent the project from being removed on this date and restore people's ability to make changes to it."
msgstr ""
+msgid "Restrict group access by IP address. %{link_start}Learn more%{link_end}."
+msgstr ""
+
msgid "Restrict membership by email domain"
msgstr ""
@@ -28943,6 +29346,9 @@ msgstr ""
msgid "Runners|Runner #%{runner_id}"
msgstr ""
+msgid "Runners|Runner assigned to project."
+msgstr ""
+
msgid "Runners|Runner is offline, last contact was %{runner_contact} ago"
msgstr ""
@@ -28955,6 +29361,9 @@ msgstr ""
msgid "Runners|Runner registration"
msgstr ""
+msgid "Runners|Runner unassigned from project."
+msgstr ""
+
msgid "Runners|Runners"
msgstr ""
@@ -29147,7 +29556,7 @@ msgstr ""
msgid "SastEntryPoints|How do I set up SAST?"
msgstr ""
-msgid "SastEntryPoints|Learn more."
+msgid "SastEntryPoints|Learn more"
msgstr ""
msgid "Satisfied"
@@ -29189,7 +29598,7 @@ msgstr ""
msgid "Save pipeline schedule"
msgstr ""
-msgid "Save space and find images in the container Registry. remove unneeded tags and keep only the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
+msgid "Save storage space by automatically deleting tags from the container registry and keeping the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
msgstr ""
msgid "Saving"
@@ -29363,6 +29772,9 @@ msgstr ""
msgid "Search or filter results…"
msgstr ""
+msgid "Search or jump to..."
+msgstr ""
+
msgid "Search project"
msgstr ""
@@ -29423,16 +29835,16 @@ msgstr ""
msgid "SearchCodeResults|of %{link_to_project}"
msgstr ""
-msgid "SearchResults|Showing %{count} %{scope} for%{term_element}"
+msgid "SearchResults|Showing %{count} %{scope} for %{term_element}"
msgstr ""
-msgid "SearchResults|Showing %{count} %{scope} for%{term_element} in your personal and project snippets"
+msgid "SearchResults|Showing %{count} %{scope} for %{term_element} in your personal and project snippets"
msgstr ""
-msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for%{term_element}"
+msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for %{term_element}"
msgstr ""
-msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for%{term_element} in your personal and project snippets"
+msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for %{term_element} in your personal and project snippets"
msgstr ""
msgid "SearchResults|code result"
@@ -29514,6 +29926,9 @@ msgstr ""
msgid "Secret Detection"
msgstr ""
+msgid "Secret access key"
+msgstr ""
+
msgid "Secret token"
msgstr ""
@@ -29553,9 +29968,6 @@ msgstr ""
msgid "SecurityApprovals|A merge request approval is required when the license compliance report contains a denied license."
msgstr ""
-msgid "SecurityApprovals|Configurable if security scanners are enabled. %{linkStart}Learn more.%{linkEnd}"
-msgstr ""
-
msgid "SecurityApprovals|Coverage-Check"
msgstr ""
@@ -29568,24 +29980,18 @@ msgstr ""
msgid "SecurityApprovals|Learn more about Vulnerability-Check"
msgstr ""
-msgid "SecurityApprovals|License Scanning must be enabled. %{linkStart}Learn more%{linkEnd}."
-msgstr ""
-
msgid "SecurityApprovals|License-Check"
msgstr ""
msgid "SecurityApprovals|Requires approval for Denied licenses. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}More information%{linkEnd}"
+msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "SecurityApprovals|Requires approval for vulnerabilities. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
-msgid "SecurityApprovals|Test coverage must be enabled. %{linkStart}Learn more%{linkEnd}."
-msgstr ""
-
msgid "SecurityApprovals|Vulnerability-Check"
msgstr ""
@@ -29649,6 +30055,12 @@ msgstr ""
msgid "SecurityConfiguration|Immediately begin risk analysis and remediation with application security features. Start with SAST and Secret Detection, available to all plans. Upgrade to Ultimate to get all features, including:"
msgstr ""
+msgid "SecurityConfiguration|Manage corpus"
+msgstr ""
+
+msgid "SecurityConfiguration|Manage corpus files used as mutation sources in coverage fuzzing."
+msgstr ""
+
msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
msgstr ""
@@ -29703,6 +30115,12 @@ msgstr ""
msgid "SecurityOrchestration|Action"
msgstr ""
+msgid "SecurityOrchestration|Actions"
+msgstr ""
+
+msgid "SecurityOrchestration|Add rule"
+msgstr ""
+
msgid "SecurityOrchestration|All policies"
msgstr ""
@@ -29736,9 +30154,6 @@ msgstr ""
msgid "SecurityOrchestration|Network"
msgstr ""
-msgid "SecurityOrchestration|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
-msgstr ""
-
msgid "SecurityOrchestration|New policy"
msgstr ""
@@ -29754,6 +30169,9 @@ msgstr ""
msgid "SecurityOrchestration|Policy editor"
msgstr ""
+msgid "SecurityOrchestration|Policy preview"
+msgstr ""
+
msgid "SecurityOrchestration|Policy status"
msgstr ""
@@ -29763,6 +30181,9 @@ msgstr ""
msgid "SecurityOrchestration|Rule"
msgstr ""
+msgid "SecurityOrchestration|Rules"
+msgstr ""
+
msgid "SecurityOrchestration|Scan Execution"
msgstr ""
@@ -29856,6 +30277,9 @@ msgstr ""
msgid "SecurityReports|Create issue"
msgstr ""
+msgid "SecurityReports|Development vulnerabilities"
+msgstr ""
+
msgid "SecurityReports|Dismiss vulnerability"
msgstr ""
@@ -29871,6 +30295,9 @@ msgstr ""
msgid "SecurityReports|Download results"
msgstr ""
+msgid "SecurityReports|Download scanned URLs"
+msgstr ""
+
msgid "SecurityReports|Download scanned resources"
msgstr ""
@@ -29994,6 +30421,9 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
+msgid "SecurityReports|The Vulnerability Report shows the results of the lastest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "SecurityReports|The security reports below contain one or more vulnerability findings that could not be parsed and were not recorded. Download the artifacts in the job output to investigate. Ensure any security report created conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
msgstr ""
@@ -30135,10 +30565,10 @@ msgstr ""
msgid "Select a repository"
msgstr ""
-msgid "Select a role"
+msgid "Select a repository containing templates for common files."
msgstr ""
-msgid "Select a shared template repository for all projects on this instance."
+msgid "Select a role"
msgstr ""
msgid "Select a template repository"
@@ -30216,6 +30646,9 @@ msgstr ""
msgid "Select project to choose zone"
msgstr ""
+msgid "Select project to create issue"
+msgstr ""
+
msgid "Select projects"
msgstr ""
@@ -30333,6 +30766,9 @@ msgstr ""
msgid "Send emails to help guide new users through the onboarding process."
msgstr ""
+msgid "Send emails to users upon account deactivation."
+msgstr ""
+
msgid "Send message"
msgstr ""
@@ -30351,6 +30787,9 @@ msgstr ""
msgid "Send service data"
msgstr ""
+msgid "Sentry"
+msgstr ""
+
msgid "Sentry API URL"
msgstr ""
@@ -30465,6 +30904,9 @@ msgstr ""
msgid "Service"
msgstr ""
+msgid "Service Accounts keys are required to authorize GitLab to deploy your Google Cloud project."
+msgstr ""
+
msgid "Service Desk"
msgstr ""
@@ -30537,15 +30979,15 @@ msgstr ""
msgid "Set a password on your account to pull or push via %{protocol}."
msgstr ""
-msgid "Set a template repository for projects in this group"
-msgstr ""
-
msgid "Set access permissions for this token."
msgstr ""
msgid "Set an instance-wide domain that will be available to all clusters when installing Knative."
msgstr ""
+msgid "Set any rate limit to %{code_open}0%{code_close} to disable the limit."
+msgstr ""
+
msgid "Set default and restrict visibility levels. Configure import sources and git access protocol."
msgstr ""
@@ -30558,7 +31000,7 @@ msgstr ""
msgid "Set limit to 0 to allow any file size."
msgstr ""
-msgid "Set max session time for web terminal."
+msgid "Set limits for web and API requests."
msgstr ""
msgid "Set milestone"
@@ -30567,15 +31009,18 @@ msgstr ""
msgid "Set new password"
msgstr ""
-msgid "Set notification email for abuse reports."
+msgid "Set parent epic to an epic"
msgstr ""
-msgid "Set parent epic to an epic"
+msgid "Set per-user rate limits for imports and exports of projects and groups."
msgstr ""
msgid "Set projects and maximum size limits, session duration, user options, and check feature availability for namespace plan."
msgstr ""
+msgid "Set rate limits for package registry API requests that supersede the general user and IP rate limits."
+msgstr ""
+
msgid "Set severity"
msgstr ""
@@ -30594,15 +31039,24 @@ msgstr ""
msgid "Set the default branch for this project. All merge requests and commits are made against this branch unless you specify a different one."
msgstr ""
+msgid "Set the default expiration time for job artifacts in all projects. Set to %{code_open}0%{code_close} to never expire artifacts by default. If no unit is written, it defaults to seconds. For example, these are all equivalent: %{code_open}3600%{code_close}, %{code_open}60 minutes%{code_close}, or %{code_open}one hour%{code_close}."
+msgstr ""
+
msgid "Set the due date to %{due_date}."
msgstr ""
msgid "Set the iteration to %{iteration_reference}."
msgstr ""
+msgid "Set the maximum session time for a web terminal."
+msgstr ""
+
msgid "Set the milestone to %{milestone_reference}."
msgstr ""
+msgid "Set the per-user rate limit for notes created by web or API requests."
+msgstr ""
+
msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
msgstr ""
@@ -30804,6 +31258,9 @@ msgstr ""
msgid "Show Pipeline IID"
msgstr ""
+msgid "Show all %{issuable_type}."
+msgstr ""
+
msgid "Show all activity"
msgstr ""
@@ -30855,15 +31312,9 @@ msgstr ""
msgid "Show list"
msgstr ""
-msgid "Show me advanced features"
-msgstr ""
-
msgid "Show me how to add a pipeline"
msgstr ""
-msgid "Show me the basics"
-msgstr ""
-
msgid "Show one file at a time"
msgstr ""
@@ -30904,15 +31355,15 @@ msgstr ""
msgid "Showing %{pageSize} of %{total} %{issuableType}"
msgstr ""
-msgid "Showing %{pageSize} of %{total} issues"
-msgstr ""
-
msgid "Showing all epics"
msgstr ""
msgid "Showing all issues"
msgstr ""
+msgid "Showing data for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
+msgstr ""
+
msgid "Showing data for workflow items created in this date range. Date range cannot exceed %{maxDateRange} days."
msgstr ""
@@ -30952,6 +31403,15 @@ msgstr ""
msgid "Sidebar|Weight"
msgstr ""
+msgid "Sidekiq job compression threshold (bytes)"
+msgstr ""
+
+msgid "Sidekiq job size limit (bytes)"
+msgstr ""
+
+msgid "Sidekiq job size limits"
+msgstr ""
+
msgid "Sign in"
msgstr ""
@@ -31072,6 +31532,9 @@ msgstr ""
msgid "Site profile not found for given parameters"
msgstr ""
+msgid "Sites"
+msgstr ""
+
msgid "Size"
msgstr ""
@@ -31102,19 +31565,22 @@ msgstr ""
msgid "SlackIntegration|Sends notifications about project events to Slack channels."
msgstr ""
-msgid "SlackService|2. Paste the %{strong_open}Token%{strong_close} into the field below"
+msgid "SlackService|1. %{slash_command_link_start}Add a slash command%{slash_command_link_end} in your Slack team using this information:"
msgstr ""
-msgid "SlackService|3. Select the %{strong_open}Active%{strong_close} checkbox, press %{strong_open}Save changes%{strong_close} and start using GitLab inside Slack!"
+msgid "SlackService|2. Paste the token from Slack in the %{strong_open}Token%{strong_close} field below."
msgstr ""
-msgid "SlackService|Fill in the word that works best for your team."
+msgid "SlackService|3. Select the %{strong_open}Active%{strong_close} checkbox, select %{strong_open}Save changes%{strong_close}, and start using slash commands in Slack!"
+msgstr ""
+
+msgid "SlackService|After setup, get a list of available Slack slash commands by entering"
msgstr ""
-msgid "SlackService|See list of available commands in Slack after setting up this service, by entering"
+msgid "SlackService|Fill in the word that works best for your team."
msgstr ""
-msgid "SlackService|This service allows users to perform common operations on this project by entering slash commands in Slack."
+msgid "SlackService|Perform common operations in this project by entering slash commands in Slack."
msgstr ""
msgid "Slice multiplier"
@@ -31180,7 +31646,7 @@ msgstr ""
msgid "Some child epics may be hidden due to applied filters"
msgstr ""
-msgid "Some common domains are not allowed. %{read_more_link}."
+msgid "Some common domains are not allowed. %{learn_more_link}."
msgstr ""
msgid "Some of the designs you tried uploading did not change:"
@@ -31264,9 +31730,6 @@ msgstr ""
msgid "Something went wrong while exporting requirements"
msgstr ""
-msgid "Something went wrong while fetching %{listType} list"
-msgstr ""
-
msgid "Something went wrong while fetching branches"
msgstr ""
@@ -31321,15 +31784,9 @@ msgstr ""
msgid "Something went wrong while merging this merge request. Please try again."
msgstr ""
-msgid "Something went wrong while moving issues."
-msgstr ""
-
msgid "Something went wrong while obtaining the Let's Encrypt certificate."
msgstr ""
-msgid "Something went wrong while performing the action."
-msgstr ""
-
msgid "Something went wrong while promoting the issue to an epic. Please try again."
msgstr ""
@@ -31657,7 +32114,10 @@ msgstr ""
msgid "SourcegraphPreferences|Uses a custom %{linkStart}Sourcegraph instance%{linkEnd}."
msgstr ""
-msgid "Spam Check API Key"
+msgid "Spam Check"
+msgstr ""
+
+msgid "Spam Check API key"
msgstr ""
msgid "Spam Logs"
@@ -31675,7 +32135,7 @@ msgstr ""
msgid "Specified URL cannot be used: \"%{reason}\""
msgstr ""
-msgid "Specify an e-mail address regex pattern to identify default internal users."
+msgid "Specify an email address regex pattern to identify default internal users."
msgstr ""
msgid "Speed up your pipelines with Needs relationships"
@@ -31930,7 +32390,7 @@ msgstr ""
msgid "StatusCheck|An error occurred fetching the status checks."
msgstr ""
-msgid "StatusCheck|Apply this status check to any branch or a specific protected branch."
+msgid "StatusCheck|Apply this status check to all branches or a specific protected branch."
msgstr ""
msgid "StatusCheck|Check for a status response in Merge Requests. Failures do not block merges. %{link_start}Learn more%{link_end}."
@@ -32269,6 +32729,9 @@ msgstr ""
msgid "Subscriptions"
msgstr ""
+msgid "Subscription|Your subscription for %{strong}%{namespace_name}%{strong_close} has expired and you are now on %{pricing_link_start}the GitLab Free tier%{pricing_link_end}. Don't worry, your data is safe. Get in touch with our support team (%{support_email}). They'll gladly help with your subscription renewal."
+msgstr ""
+
msgid "Subtracted"
msgstr ""
@@ -32497,6 +32960,9 @@ msgstr ""
msgid "SuperSonics|Plan"
msgstr ""
+msgid "SuperSonics|Please agree to the Subscription Agreement"
+msgstr ""
+
msgid "SuperSonics|Ready to get started? A GitLab plan is ideal for scaling organizations and for multi team usage."
msgstr ""
@@ -32527,6 +32993,9 @@ msgstr ""
msgid "SuperSonics|The activation code is not valid. Please make sure to copy it exactly from the Customers Portal or confirmation email. Learn more about %{linkStart}activating your subscription%{linkEnd}."
msgstr ""
+msgid "SuperSonics|The activation code should be a 24-character alphanumeric string"
+msgstr ""
+
msgid "SuperSonics|There is a connectivity issue."
msgstr ""
@@ -32569,9 +33038,15 @@ msgstr ""
msgid "SuperSonics|You do not have an active subscription"
msgstr ""
+msgid "SuperSonics|You have successfully added a license that activates on %{date}. Please see the subscription history table below for more details."
+msgstr ""
+
msgid "SuperSonics|You'll be charged for %{trueUpLinkStart}users over license%{trueUpLinkEnd} on a quarterly or annual basis, depending on the terms of your agreement."
msgstr ""
+msgid "SuperSonics|Your future dated license was successfully added"
+msgstr ""
+
msgid "SuperSonics|Your subscription"
msgstr ""
@@ -32824,7 +33299,7 @@ msgstr ""
msgid "Template to append to all Service Desk issues"
msgstr ""
-msgid "TemplateRepository|Select a repository to make its templates available to all projects. %{link_start}What should the repository contain?%{link_end} "
+msgid "TemplateRepository|Create common files more quickly, and standardize their format."
msgstr ""
msgid "Templates"
@@ -33030,7 +33505,7 @@ msgstr ""
msgid "TestCases|Search test cases"
msgstr ""
-msgid "TestCases|Something went wrong while adding test case to Todo."
+msgid "TestCases|Something went wrong while adding test case to a to-do item."
msgstr ""
msgid "TestCases|Something went wrong while creating a test case."
@@ -33042,7 +33517,7 @@ msgstr ""
msgid "TestCases|Something went wrong while fetching test cases list."
msgstr ""
-msgid "TestCases|Something went wrong while marking test case todo as done."
+msgid "TestCases|Something went wrong while marking test case to-do item as done."
msgstr ""
msgid "TestCases|Something went wrong while moving test case."
@@ -33162,7 +33637,7 @@ msgstr ""
msgid "Thanks for your purchase!"
msgstr ""
-msgid "That is ok, I do not want to renew"
+msgid "That's OK, I don't want to renew"
msgstr ""
msgid "That's it, well done!"
@@ -33185,7 +33660,7 @@ msgid_plural "The %{type} contains the following errors:"
msgstr[0] ""
msgstr[1] ""
-msgid "The API key used by GitLab for accessing the Spam Check service endpoint"
+msgid "The API key used by GitLab for accessing the Spam Check service endpoint."
msgstr ""
msgid "The GitLab subscription service (customers.gitlab.com) is currently experiencing an outage. You can monitor the status and get updates at %{linkStart}status.gitlab.com%{linkEnd}."
@@ -33224,9 +33699,6 @@ msgstr ""
msgid "The URL to use for connecting to Elasticsearch. Use a comma-separated list to support clustering (e.g., \"http://localhost:9200, http://localhost:9201\")."
msgstr ""
-msgid "The Vulnerability Report shows the results of the last successful pipeline run on the default branch."
-msgstr ""
-
msgid "The X509 Certificate to use when mutual TLS is required to communicate with the external authorization service. If left blank, the server certificate is still validated when accessing over HTTPS."
msgstr ""
@@ -33284,9 +33756,6 @@ msgstr ""
msgid "The default branch for this project has been changed. Please update your bookmarks."
msgstr ""
-msgid "The default expiration time for job artifacts. 0 for unlimited. The default unit is in seconds, but you can use other units, for example %{code_open}4 mins 2 sec%{code_close}, %{code_open}2h42min%{code_close}."
-msgstr ""
-
msgid "The dependency list details information about the components used within your project."
msgstr ""
@@ -33478,9 +33947,6 @@ msgstr ""
msgid "The merge conflicts for this merge request have already been resolved. Please return to the merge request."
msgstr ""
-msgid "The merge request can now be merged."
-msgstr ""
-
msgid "The metric must be one of %{metrics}."
msgstr ""
@@ -33856,7 +34322,7 @@ msgstr ""
msgid "There was a problem updating the keep latest artifacts setting."
msgstr ""
-msgid "There was an error %{message} todo."
+msgid "There was an error %{message} to-do item."
msgstr ""
msgid "There was an error adding a To Do."
@@ -33895,6 +34361,9 @@ msgstr ""
msgid "There was an error fetching projects"
msgstr ""
+msgid "There was an error fetching search autocomplete suggestions"
+msgstr ""
+
msgid "There was an error fetching stage total counts"
msgstr ""
@@ -34219,6 +34688,9 @@ msgstr ""
msgid "This field is required."
msgstr ""
+msgid "This form is disabled in preview"
+msgstr ""
+
msgid "This group"
msgstr ""
@@ -34240,9 +34712,6 @@ msgstr ""
msgid "This group is linked to a subscription"
msgstr ""
-msgid "This group, including all subgroups, projects and git repositories, will be reachable from only the specified IP address ranges."
-msgstr ""
-
msgid "This group, its subgroups and projects has been scheduled for removal on %{date}."
msgstr ""
@@ -34522,9 +34991,6 @@ msgstr ""
msgid "This user cannot be unlocked manually from GitLab"
msgstr ""
-msgid "This user does not have a pending request"
-msgstr ""
-
msgid "This user has an unconfirmed email address (%{email}). You may force a confirmation."
msgstr ""
@@ -34633,9 +35099,6 @@ msgstr ""
msgid "ThreatMonitoring|Packet Activity"
msgstr ""
-msgid "ThreatMonitoring|Policies"
-msgstr ""
-
msgid "ThreatMonitoring|Requests"
msgstr ""
@@ -34687,6 +35150,12 @@ msgstr ""
msgid "ThreatMonitoring|View documentation"
msgstr ""
+msgid "Threshold in bytes at which to compress Sidekiq job arguments."
+msgstr ""
+
+msgid "Threshold in bytes at which to reject Sidekiq jobs. Set this to 0 to if you don't want to limit Sidekiq jobs."
+msgstr ""
+
msgid "Throughput"
msgstr ""
@@ -34696,6 +35165,9 @@ msgstr ""
msgid "Time"
msgstr ""
+msgid "Time (in hours) that users are allowed to skip forced configuration of two-factor authentication."
+msgstr ""
+
msgid "Time Spent"
msgstr ""
@@ -34762,7 +35234,7 @@ msgstr ""
msgid "TimeTrackingEstimated|Est"
msgstr ""
-msgid "TimeTracking|%{startTag}Spent: %{endTag}%{timeSpentHumanReadable}"
+msgid "TimeTracking|%{spentStart}Spent: %{spentEnd}"
msgstr ""
msgid "TimeTracking|Estimated:"
@@ -34976,6 +35448,9 @@ msgstr ""
msgid "To access this domain create a new DNS record"
msgstr ""
+msgid "To add a custom suffix, set up a Service Desk email address. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "To add an SSH key you need to %{generate_link_start}generate one%{link_end} or use an %{existing_link_start}existing key%{link_end}."
msgstr ""
@@ -34997,13 +35472,16 @@ msgstr ""
msgid "To connect an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To continue using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
+msgstr ""
+
msgid "To continue, you need to select the link in the confirmation email we sent to verify your email address. If you didn't get our email, select %{strongStart}Resend confirmation email.%{strongEnd}"
msgstr ""
msgid "To define internal users, first enable new users set to external"
msgstr ""
-msgid "To enable Registration Features, make sure \"Enable service ping\" is checked."
+msgid "To enable Registration Features, first enable Service Ping."
msgstr ""
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
@@ -35030,7 +35508,7 @@ msgstr ""
msgid "To get started, use the link below to confirm your account."
msgstr ""
-msgid "To help improve GitLab and its user experience, GitLab will periodically collect usage information."
+msgid "To help improve GitLab and its user experience, GitLab periodically collects usage information."
msgstr ""
msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
@@ -35063,7 +35541,7 @@ msgstr ""
msgid "To preserve performance only %{strong_open}%{display_size} of %{real_size}%{strong_close} files are displayed."
msgstr ""
-msgid "To protect this issue's confidentiality, %{forkLink} and set the fork's visibility to private."
+msgid "To protect this issue's confidentiality, %{linkStart}fork this project%{linkEnd} and set the fork's visibility to private."
msgstr ""
msgid "To protect this issue's confidentiality, a private fork of this project was selected."
@@ -35096,12 +35574,15 @@ msgstr ""
msgid "To set up SAML authentication for your group through an identity provider like Azure, Okta, Onelogin, Ping Identity, or your custom SAML 2.0 provider:"
msgstr ""
-msgid "To set up this service:"
+msgid "To set up this integration:"
msgstr ""
msgid "To specify the notification level per project of a group you belong to, you need to visit project page and change notification level there."
msgstr ""
+msgid "To start using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
+msgstr ""
+
msgid "To unsubscribe from this issue, please paste the following link into your browser:"
msgstr ""
@@ -35689,9 +36170,6 @@ msgstr ""
msgid "Unable to fetch branches list, please close the form and try again"
msgstr ""
-msgid "Unable to fetch unscanned projects"
-msgstr ""
-
msgid "Unable to fetch vulnerable projects"
msgstr ""
@@ -35746,6 +36224,15 @@ msgstr ""
msgid "Unable to update this issue at this time."
msgstr ""
+msgid "Unapprove a merge request"
+msgstr ""
+
+msgid "Unapprove the current merge request."
+msgstr ""
+
+msgid "Unapproved the current merge request."
+msgstr ""
+
msgid "Unarchive project"
msgstr ""
@@ -35758,16 +36245,13 @@ msgstr ""
msgid "Unassigned"
msgstr ""
-msgid "Unauthenticated API request rate limit"
-msgstr ""
-
-msgid "Unauthenticated rate limit period in seconds"
+msgid "Unauthenticated API rate limit period in seconds"
msgstr ""
-msgid "Unauthenticated request rate limit"
+msgid "Unauthenticated requests"
msgstr ""
-msgid "Unauthenticated requests"
+msgid "Unauthenticated web rate limit period in seconds"
msgstr ""
msgid "Undo"
@@ -35869,18 +36353,6 @@ msgstr ""
msgid "Unresolved"
msgstr ""
-msgid "UnscannedProjects|15 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|30 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|5 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|60 or more days"
-msgstr ""
-
msgid "Unschedule job"
msgstr ""
@@ -36100,6 +36572,9 @@ msgstr ""
msgid "UsageQuota|%{help_link_start}Shared runners%{help_link_end} are disabled, so there are no limits set on pipeline usage"
msgstr ""
+msgid "UsageQuota|%{linkTitle} help link"
+msgstr ""
+
msgid "UsageQuota|%{percentageLeft} of purchased storage is available"
msgstr ""
@@ -36109,6 +36584,9 @@ msgstr ""
msgid "UsageQuota|Artifacts is a sum of build and pipeline artifacts."
msgstr ""
+msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
+msgstr ""
+
msgid "UsageQuota|Buy additional minutes"
msgstr ""
@@ -36118,9 +36596,21 @@ msgstr ""
msgid "UsageQuota|CI minutes usage by project"
msgstr ""
+msgid "UsageQuota|Code packages and container images."
+msgstr ""
+
msgid "UsageQuota|Current period usage"
msgstr ""
+msgid "UsageQuota|File attachments and smaller design graphics."
+msgstr ""
+
+msgid "UsageQuota|Git repository, managed by the Gitaly service."
+msgstr ""
+
+msgid "UsageQuota|Includes project registry, artifacts, packages, wiki, uploads and other items."
+msgstr ""
+
msgid "UsageQuota|Increase storage temporarily"
msgstr ""
@@ -36139,6 +36629,9 @@ msgstr ""
msgid "UsageQuota|Packages"
msgstr ""
+msgid "UsageQuota|Pipeline artifacts and job artifacts, created with CI/CD."
+msgstr ""
+
msgid "UsageQuota|Pipelines"
msgstr ""
@@ -36157,6 +36650,9 @@ msgstr ""
msgid "UsageQuota|Seats"
msgstr ""
+msgid "UsageQuota|Shared bits of code and text."
+msgstr ""
+
msgid "UsageQuota|Snippets"
msgstr ""
@@ -36166,6 +36662,12 @@ msgstr ""
msgid "UsageQuota|Storage"
msgstr ""
+msgid "UsageQuota|Storage type"
+msgstr ""
+
+msgid "UsageQuota|There is a known issue with Artifact storage where the total could be incorrect for some projects. More details and progress are available in %{warningLinkStart}the epic%{warningLinkEnd}."
+msgstr ""
+
msgid "UsageQuota|This is the total amount of storage used across your projects within this namespace."
msgstr ""
@@ -36205,6 +36707,9 @@ msgstr ""
msgid "UsageQuota|Usage"
msgstr ""
+msgid "UsageQuota|Usage Breakdown"
+msgstr ""
+
msgid "UsageQuota|Usage Quotas"
msgstr ""
@@ -36229,6 +36734,9 @@ msgstr ""
msgid "UsageQuota|Wiki"
msgstr ""
+msgid "UsageQuota|Wiki content."
+msgstr ""
+
msgid "UsageQuota|Wikis"
msgstr ""
@@ -36445,7 +36953,10 @@ msgstr ""
msgid "User Settings"
msgstr ""
-msgid "User and IP Rate Limits"
+msgid "User and IP rate limits"
+msgstr ""
+
+msgid "User does not have a pending request"
msgstr ""
msgid "User identity was successfully created."
@@ -36742,6 +37253,9 @@ msgstr ""
msgid "Users can launch a development environment from a GitLab browser tab when the %{linkStart}Gitpod%{linkEnd} integration is enabled."
msgstr ""
+msgid "Users can reactivate their account by signing in."
+msgstr ""
+
msgid "Users can render diagrams in AsciiDoc, Markdown, reStructuredText, and Textile documents using Kroki."
msgstr ""
@@ -36757,6 +37271,9 @@ msgstr ""
msgid "Users requesting access to"
msgstr ""
+msgid "Users to exclude from the rate limit"
+msgstr ""
+
msgid "Users were successfully added."
msgstr ""
@@ -36778,6 +37295,9 @@ msgstr ""
msgid "UsersSelect|Unassigned"
msgstr ""
+msgid "Uses GitLab as a lightweight alternative to Sentry."
+msgstr ""
+
msgid "Using %{code_start}::%{code_end} denotes a %{link_start}scoped label set%{link_end}"
msgstr ""
@@ -36808,10 +37328,7 @@ msgstr ""
msgid "Value Stream Analytics can help you determine your team’s velocity"
msgstr ""
-msgid "Value Stream Analytics gives an overview of how much time it takes to go from idea to production in your project."
-msgstr ""
-
-msgid "Value may contain a variable reference"
+msgid "Value might contain a variable reference"
msgstr ""
msgid "Value stream"
@@ -36877,10 +37394,10 @@ msgstr ""
msgid "ValueStream|The Default Value Stream cannot be deleted"
msgstr ""
-msgid "Variable"
+msgid "Values that contain the %{codeStart}$%{codeEnd} character can be considered a variable reference and expanded. %{docsLinkStart}Learn more.%{docsLinkEnd}"
msgstr ""
-msgid "Variable references indicated by %{codeStart}$%{codeEnd} may be expanded. If this is not what you want, consider %{docsLinkStart}using a workaround to prevent expansion%{docsLinkEnd}."
+msgid "Variable"
msgstr ""
msgid "Variable will be masked in job logs."
@@ -37285,6 +37802,9 @@ msgstr ""
msgid "Vulnerability|Evidence"
msgstr ""
+msgid "Vulnerability|False positive detected"
+msgstr ""
+
msgid "Vulnerability|File"
msgstr ""
@@ -37327,6 +37847,9 @@ msgstr ""
msgid "Vulnerability|Status"
msgstr ""
+msgid "Vulnerability|The scanner determined this vulnerability to be a false positive. Verify the evaluation before changing its status. %{linkStart}Learn more about false positive detection.%{linkEnd}"
+msgstr ""
+
msgid "Vulnerability|The unmodified response is the original response that had no mutations done to the request"
msgstr ""
@@ -37651,9 +38174,6 @@ msgstr ""
msgid "Welcome to GitLab,%{br_tag}%{name}!"
msgstr ""
-msgid "Welcome to the guided GitLab tour"
-msgstr ""
-
msgid "Welcome, %{name}!"
msgstr ""
@@ -37672,9 +38192,6 @@ msgstr ""
msgid "What are you searching for?"
msgstr ""
-msgid "What describes you best?"
-msgstr ""
-
msgid "What does this command do?"
msgstr ""
@@ -37696,13 +38213,13 @@ msgstr ""
msgid "What is your job title? (optional)"
msgstr ""
-msgid "What will you use this group for?"
+msgid "What templates can I create?"
msgstr ""
-msgid "What's new"
+msgid "What will you use this group for?"
msgstr ""
-msgid "What’s your experience level?"
+msgid "What's new"
msgstr ""
msgid "When a deployment job is successful, skip older deployment jobs that are still pending."
@@ -37714,6 +38231,9 @@ msgstr ""
msgid "When an event in GitLab triggers a webhook, you can use the request details to figure out if something went wrong."
msgstr ""
+msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+msgstr ""
+
msgid "When inactive, an external authentication provider must be used."
msgstr ""
@@ -37737,6 +38257,9 @@ msgstr ""
msgid "When:"
msgstr ""
+msgid "Which API requests are affected?"
+msgstr ""
+
msgid "While it's rare to have no vulnerabilities, it can happen. In any event, we ask that you please double check your settings to make sure you've set up your dashboard correctly."
msgstr ""
@@ -38016,6 +38539,9 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|Work Items"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -38091,6 +38617,9 @@ msgstr ""
msgid "You are already a member of this %{member_source}."
msgstr ""
+msgid "You are already impersonating another user"
+msgstr ""
+
msgid "You are an admin, which means granting access to %{client_name} will allow them to interact with GitLab as an admin as well. Proceed with caution."
msgstr ""
@@ -38193,6 +38722,9 @@ msgstr ""
msgid "You can also use project access tokens with Git to authenticate over HTTP(S). %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "You can always change your URL later"
+msgstr ""
+
msgid "You can always edit this later"
msgstr ""
@@ -38349,10 +38881,10 @@ msgstr ""
msgid "You can’t %{tag_start}edit%{tag_end} files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
-msgid "You could not create a new trigger."
+msgid "You can’t edit files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
-msgid "You didn't renew your subscription for %{strong}%{namespace_name}%{strong_close} so it was downgraded to the free plan."
+msgid "You could not create a new trigger."
msgstr ""
msgid "You do not have any subscriptions yet"
@@ -38520,6 +39052,12 @@ msgstr ""
msgid "You must provide your current password in order to change it."
msgstr ""
+msgid "You must sign in to search for specific projects."
+msgstr ""
+
+msgid "You must sign in to search for specific terms."
+msgstr ""
+
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
@@ -38547,6 +39085,9 @@ msgstr ""
msgid "You need to upload a GitLab project export archive (ending in .gz)."
msgstr ""
+msgid "You need to verify your primary email first before enabling Two-Factor Authentication."
+msgstr ""
+
msgid "You successfully declined the invitation"
msgstr ""
@@ -38655,10 +39196,10 @@ msgstr ""
msgid "Your %{host} account was signed in to from a new location"
msgstr ""
-msgid "Your %{strong}%{plan_name}%{strong_close} subscription for %{strong}%{namespace_name}%{strong_close} will expire on %{strong}%{expires_on}%{strong_close}."
+msgid "Your %{strong}%{plan_name}%{strong_close} subscription expires on %{strong}%{expires_on}%{strong_close}. After that date, you cannot create issues or merge requests, or use many other features."
msgstr ""
-msgid "Your %{strong}%{plan_name}%{strong_close} subscription will expire on %{strong}%{expires_on}%{strong_close}. After that, you will not be able to create issues or merge requests as well as many other features."
+msgid "Your %{strong}%{plan_name}%{strong_close} subscription for %{strong}%{namespace_name}%{strong_close} will expire on %{strong}%{expires_on}%{strong_close}."
msgstr ""
msgid "Your CI/CD configuration syntax is invalid. View Lint tab for more details."
@@ -38682,7 +39223,7 @@ msgstr ""
msgid "Your GPG keys (%{count})"
msgstr ""
-msgid "Your GitLab account has been locked due to an excessive amount of unsuccessful sign in attempts. Your account will automatically unlock in %{duration} or you may click the link below to unlock now."
+msgid "Your GitLab account has been locked due to an excessive number of unsuccessful sign in attempts. You can wait for your account to automatically unlock in %{duration} or you can click the link below to unlock now."
msgstr ""
msgid "Your GitLab account request has been approved!"
@@ -38793,6 +39334,9 @@ msgstr ""
msgid "Your commit email is used for web based operations, such as edits and merges."
msgstr ""
+msgid "Your current password is required to register a two-factor authenticator app."
+msgstr ""
+
msgid "Your dashboard has been copied. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
@@ -38892,6 +39436,9 @@ msgstr ""
msgid "Your project limit is %{limit} projects! Please contact your administrator to increase it"
msgstr ""
+msgid "Your project will be created at:"
+msgstr ""
+
msgid "Your projects"
msgstr ""
@@ -38931,11 +39478,10 @@ msgstr ""
msgid "Your subscription expired!"
msgstr ""
-msgid "Your subscription has been downgraded."
-msgstr ""
-
-msgid "Your subscription will expire in %{remaining_days}."
-msgstr ""
+msgid "Your subscription will expire in %{remaining_days} day."
+msgid_plural "Your subscription will expire in %{remaining_days} days."
+msgstr[0] ""
+msgstr[1] ""
msgid "Your username is %{username}."
msgstr ""
@@ -39142,6 +39688,9 @@ msgstr ""
msgid "cannot merge"
msgstr ""
+msgid "cannot not be used for user namespace"
+msgstr ""
+
msgid "ciReport|%{degradedNum} degraded"
msgstr ""
@@ -39465,6 +40014,9 @@ msgstr ""
msgid "created %{timeAgo}"
msgstr ""
+msgid "created %{timeAgo} by %{author}"
+msgstr ""
+
msgid "created by"
msgstr ""
@@ -39509,9 +40061,6 @@ msgstr ""
msgid "does not have a supported extension. Only %{extension_list} are supported"
msgstr ""
-msgid "domain is not authorized for sign-up."
-msgstr ""
-
msgid "download it"
msgstr ""
@@ -39529,18 +40078,13 @@ msgstr ""
msgid "email '%{email}' is not a verified email."
msgstr ""
-msgid "email does not match the allowed domain of %{email_domains}"
-msgid_plural "email does not match the allowed domains: %{email_domains}"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "enabled"
msgstr ""
msgid "encrypted: needs to be a :required, :optional or :migrating!"
msgstr ""
-msgid "ending with MIME type format is not allowed."
+msgid "ending with a reserved file extension is not allowed."
msgstr ""
msgid "entries cannot be larger than 255 characters"
@@ -39564,6 +40108,9 @@ msgstr ""
msgid "estimateCommand|%{slash_command} overwrites the total estimated time."
msgstr ""
+msgid "example.com"
+msgstr ""
+
msgid "exceeds the limit of %{bytes} bytes"
msgstr ""
@@ -39614,9 +40161,6 @@ msgstr ""
msgid "fork"
msgstr ""
-msgid "fork this project"
-msgstr ""
-
msgid "from"
msgstr ""
@@ -39625,6 +40169,9 @@ msgid_plural "from %d jobs"
msgstr[0] ""
msgstr[1] ""
+msgid "frontmatter"
+msgstr ""
+
msgid "group"
msgstr ""
@@ -39652,6 +40199,9 @@ msgstr ""
msgid "has been completed."
msgstr ""
+msgid "has too deep level of nesting"
+msgstr ""
+
msgid "help"
msgstr ""
@@ -39685,9 +40235,21 @@ msgstr ""
msgid "in"
msgstr ""
+msgid "in Infrastructure :: Kubernetes clusters"
+msgstr ""
+
+msgid "in all GitLab"
+msgstr ""
+
+msgid "in group"
+msgstr ""
+
msgid "in group %{link_to_group}"
msgstr ""
+msgid "in project"
+msgstr ""
+
msgid "in project %{link_to_project}"
msgstr ""
@@ -39729,16 +40291,19 @@ msgstr ""
msgid "is not a valid X509 certificate."
msgstr ""
-msgid "is not allowed since the group is not top-level group."
+msgid "is not allowed for sign-up."
msgstr ""
-msgid "is not allowed. Try again with a different email address, or contact your GitLab admin."
+msgid "is not allowed for this group."
msgstr ""
-msgid "is not allowed. We do not currently support project-level iterations"
+msgid "is not allowed for this project."
+msgstr ""
+
+msgid "is not allowed since the group is not top-level group."
msgstr ""
-msgid "is not from an allowed domain."
+msgid "is not allowed. We do not currently support project-level iterations"
msgstr ""
msgid "is not in the group enforcing Group Managed Account"
@@ -39831,6 +40396,9 @@ msgstr ""
msgid "log in"
msgstr ""
+msgid "managed"
+msgstr ""
+
msgid "manual"
msgstr ""
@@ -39878,6 +40446,9 @@ msgstr ""
msgid "mrWidget| Please restore it or use a different %{missingBranchName} branch"
msgstr ""
+msgid "mrWidget|%{linkStart}Set up now%{linkEnd} to analyze your source code for known security vulnerabilities."
+msgstr ""
+
msgid "mrWidget|%{mergeError}."
msgstr ""
@@ -39958,6 +40529,9 @@ msgid_plural "mrWidget|Closes issues"
msgstr[0] ""
msgstr[1] ""
+msgid "mrWidget|Create issue to resolve all threads"
+msgstr ""
+
msgid "mrWidget|Delete source branch"
msgstr ""
@@ -39967,12 +40541,18 @@ msgstr ""
msgid "mrWidget|Did not close"
msgstr ""
+msgid "mrWidget|Dismiss"
+msgstr ""
+
msgid "mrWidget|Email patches"
msgstr ""
msgid "mrWidget|Failed to load deployment statistics"
msgstr ""
+msgid "mrWidget|Hide %{widget} details"
+msgstr ""
+
msgid "mrWidget|If the %{missingBranchName} branch exists in your local repository, you can merge this merge request manually using the command line"
msgstr ""
@@ -40068,9 +40648,6 @@ msgstr ""
msgid "mrWidget|Request to merge"
msgstr ""
-msgid "mrWidget|Resolve all threads in new issue"
-msgstr ""
-
msgid "mrWidget|Resolve conflicts"
msgstr ""
@@ -40086,6 +40663,9 @@ msgstr ""
msgid "mrWidget|Revoke approval"
msgstr ""
+msgid "mrWidget|SAST and Secret Detection is not enabled."
+msgstr ""
+
msgid "mrWidget|Set by %{merge_author} to be added to the merge train when the pipeline succeeds"
msgstr ""
@@ -40095,6 +40675,9 @@ msgstr ""
msgid "mrWidget|Set by %{merge_author} to start a merge train when the pipeline succeeds"
msgstr ""
+msgid "mrWidget|Show %{widget} details"
+msgstr ""
+
msgid "mrWidget|The changes were merged into"
msgstr ""
@@ -40107,6 +40690,9 @@ msgstr ""
msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure, or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
msgstr ""
+msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure."
+msgstr ""
+
msgid "mrWidget|The source branch has been deleted"
msgstr ""
@@ -40149,6 +40735,9 @@ msgstr ""
msgid "mrWidget|You can merge after removing denied licenses"
msgstr ""
+msgid "mrWidget|You can only merge once this merge request is approved."
+msgstr ""
+
msgid "mrWidget|Your password"
msgstr ""
@@ -40185,6 +40774,9 @@ msgstr ""
msgid "must be less than the limit of %{tag_limit} tags"
msgstr ""
+msgid "must be set for a project namespace"
+msgstr ""
+
msgid "must be unique by status and elapsed time within a policy"
msgstr ""
@@ -40294,6 +40886,9 @@ msgstr ""
msgid "pipeline"
msgstr ""
+msgid "pipeline schedules documentation"
+msgstr ""
+
msgid "pod_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
msgstr ""
@@ -40343,16 +40938,25 @@ msgstr ""
msgid "project name"
msgstr ""
+msgid "project namespace cannot be the parent of another namespace"
+msgstr ""
+
msgid "projects"
msgstr ""
msgid "quick actions"
msgstr ""
-msgid "reCAPTCHA Private Key"
+msgid "reCAPTCHA"
+msgstr ""
+
+msgid "reCAPTCHA helps prevent credential stuffing."
msgstr ""
-msgid "reCAPTCHA Site Key"
+msgid "reCAPTCHA private key"
+msgstr ""
+
+msgid "reCAPTCHA site key"
msgstr ""
msgid "recent activity"
@@ -40579,6 +41183,9 @@ msgstr ""
msgid "user avatar"
msgstr ""
+msgid "user namespace cannot be the parent of another namespace"
+msgstr ""
+
msgid "user preferences"
msgstr ""
@@ -40671,3 +41278,9 @@ msgstr ""
msgid "your settings"
msgstr ""
+msgid "{group}"
+msgstr ""
+
+msgid "{project}"
+msgstr ""
+
diff --git a/locale/sr_CS/gitlab.po b/locale/sr_CS/gitlab.po
index 64def04007f..b8850c10d36 100644
--- a/locale/sr_CS/gitlab.po
+++ b/locale/sr_CS/gitlab.po
@@ -14,10 +14,7 @@ msgstr ""
"X-Crowdin-Language: sr-CS\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-09-01 22:32\n"
-
-msgid " %{name}, confirm your email address now! "
-msgstr ""
+"PO-Revision-Date: 2021-10-04 20:20\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -94,6 +91,18 @@ msgstr ""
msgid "#general, #development"
msgstr ""
+msgid "%d Alert"
+msgid_plural "%d Alerts"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+msgid "%d Alert:"
+msgid_plural "%d Alerts:"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
msgid "%d Approval"
msgid_plural "%d Approvals"
msgstr[0] ""
@@ -523,7 +532,10 @@ msgstr ""
msgid "%{code_open}Protected:%{code_close} Only exposed to protected branches or tags."
msgstr ""
-msgid "%{commit_author_link} authored %{commit_timeago}"
+msgid "%{commit_author_link} authored %{commit_authored_timeago}"
+msgstr ""
+
+msgid "%{commit_author_link} authored %{commit_authored_timeago} and %{commit_committer_avatar} %{commit_committer_link} committed %{commit_committer_timeago}"
msgstr ""
msgid "%{completedCount} completed weight"
@@ -622,6 +634,15 @@ msgstr ""
msgid "%{doc_link_start}Advanced search%{doc_link_end} is enabled."
msgstr ""
+msgid "%{docs_link_start}Learn about visibility levels.%{docs_link_end}"
+msgstr ""
+
+msgid "%{docs_link_start}What is Large File Storage?%{docs_link_end}"
+msgstr ""
+
+msgid "%{docs_link_start}What is two-factor authentication?%{docs_link_end}"
+msgstr ""
+
msgid "%{due_date} (Past due)"
msgstr ""
@@ -694,9 +715,6 @@ msgstr ""
msgid "%{issueType} actions"
msgstr ""
-msgid "%{issuesCount} issues with a limit of %{maxIssueCount}"
-msgstr ""
-
msgid "%{issuesSize} with a limit of %{maxIssueCount}"
msgstr ""
@@ -754,6 +772,12 @@ msgstr ""
msgid "%{label_for_message} unavailable"
msgstr ""
+msgid "%{learn_more_link}."
+msgstr ""
+
+msgid "%{lessThan} 1 hour"
+msgstr ""
+
msgid "%{lets_encrypt_link_start}Let's Encrypt%{lets_encrypt_link_end} is a free, automated, and open certificate authority (CA) that issues digital certificates to enable HTTPS (SSL/TLS) for sites."
msgstr ""
@@ -766,15 +790,15 @@ msgstr ""
msgid "%{link_start}Learn more%{link_end} about roles."
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
-msgstr ""
-
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
msgstr ""
msgid "%{link_start}Start the title with %{draft_snippet}%{link_end} to prevent a merge request that is a work in progress from being merged before it's ready."
msgstr ""
+msgid "%{link_start}What information does GitLab Inc. collect?%{link_end}"
+msgstr ""
+
msgid "%{listToShow}, and %{awardsListLength} more"
msgstr ""
@@ -931,7 +955,7 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
-msgid "%{service_ping_link_start}Learn more%{service_ping_link_end} about what information is shared with GitLab Inc."
+msgid "%{service_ping_link_start}What information is shared with GitLab Inc.?%{service_ping_link_end}"
msgstr ""
msgid "%{size} %{unit}"
@@ -967,6 +991,9 @@ msgstr ""
msgid "%{state} epics"
msgstr ""
+msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
+msgstr ""
+
msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
msgstr ""
@@ -1033,12 +1060,6 @@ msgstr ""
msgid "%{template_project_id} is unknown or invalid"
msgstr ""
-msgid "%{text} %{files}"
-msgid_plural "%{text} %{files} files"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-
msgid "%{text} is available"
msgstr ""
@@ -1123,9 +1144,6 @@ msgstr ""
msgid "%{wildcards_link_start}Wildcards%{wildcards_link_end} such as %{code_tag_start}v*%{code_tag_end} or %{code_tag_start}*-release%{code_tag_end} are supported."
msgstr ""
-msgid "&lt; 1 hour"
-msgstr ""
-
msgid "'%{data}' at %{location} does not match format: %{format}"
msgstr ""
@@ -1210,9 +1228,6 @@ msgstr ""
msgid "(we need your current password to confirm your changes)"
msgstr ""
-msgid "* * * * *"
-msgstr ""
-
msgid "+ %{amount} more"
msgstr ""
@@ -1282,10 +1297,10 @@ msgstr ""
msgid "."
msgstr ""
-msgid "0 bytes"
+msgid "/"
msgstr ""
-msgid "0 for unlimited, only effective with remote storage enabled."
+msgid "0 bytes"
msgstr ""
msgid "0t1DgySidms"
@@ -1438,6 +1453,9 @@ msgstr ""
msgid "1000+"
msgstr ""
+msgid "192.168.0.0/24"
+msgstr ""
+
msgid "1st contribution!"
msgstr ""
@@ -1591,9 +1609,6 @@ msgstr ""
msgid "A plain HTML site that uses Netlify for CI/CD instead of GitLab, but still with all the other great GitLab features"
msgstr ""
-msgid "A plain-text response to show to clients that hit the rate limit."
-msgstr ""
-
msgid "A platform value can be web, mob or app."
msgstr ""
@@ -1675,7 +1690,7 @@ msgstr ""
msgid "APIFuzzing|Configure HTTP basic authentication values. Other authentication methods are supported. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
+msgid "APIFuzzing|Customize your project's API fuzzing configuration options and copy the code snippet to your .gitlab-ci.yml file to apply any changes. Note that this tool does not reflect or update your .gitlab-ci.yml file automatically. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
msgstr ""
msgid "APIFuzzing|Enable authentication"
@@ -1738,9 +1753,6 @@ msgstr ""
msgid "APIFuzzing|To prevent a security leak, authentication info must be added as a %{ciVariablesLinkStart}CI variable%{ciVariablesLinkEnd}. As a user with maintainer access rights, you can manage CI variables in the %{ciSettingsLinkStart}Settings%{ciSettingsLinkEnd} area."
msgstr ""
-msgid "APIFuzzing|Use this tool to generate API fuzzing configuration YAML to copy into your .gitlab-ci.yml file. This tool does not reflect or update your .gitlab-ci.yml file automatically."
-msgstr ""
-
msgid "APIFuzzing|Username for basic authentication"
msgstr ""
@@ -1792,9 +1804,6 @@ msgstr ""
msgid "Abuse reports notification email"
msgstr ""
-msgid "Abuse reports will be sent to this address if it is set. Abuse reports are always available in the admin area."
-msgstr ""
-
msgid "Accept invitation"
msgstr ""
@@ -1831,12 +1840,18 @@ msgstr ""
msgid "Access granted"
msgstr ""
+msgid "Access key ID"
+msgstr ""
+
msgid "Access requests"
msgstr ""
msgid "Access to '%{classification_label}' not allowed"
msgstr ""
+msgid "Access tokens expire after 2 hours. A refresh token may be used at any time to generate a new access token. Non-expiring access tokens are deprecated. Clear this setting to enable backward compatibility."
+msgstr ""
+
msgid "AccessDropdown|Deploy Keys"
msgstr ""
@@ -2149,6 +2164,9 @@ msgstr ""
msgid "Add new directory"
msgstr ""
+msgid "Add new service account"
+msgstr ""
+
msgid "Add or remove previously merged commits"
msgstr ""
@@ -2386,6 +2404,9 @@ msgstr ""
msgid "AdminArea|Features"
msgstr ""
+msgid "AdminArea|Get security updates from GitLab and stay up to date"
+msgstr ""
+
msgid "AdminArea|Groups"
msgstr ""
@@ -2425,6 +2446,12 @@ msgstr ""
msgid "AdminArea|Reporter"
msgstr ""
+msgid "AdminArea|Sign up for the GitLab Security Newsletter to get notified for security updates."
+msgstr ""
+
+msgid "AdminArea|Sign up for the GitLab newsletter"
+msgstr ""
+
msgid "AdminArea|Stop all jobs"
msgstr ""
@@ -2494,9 +2521,15 @@ msgstr ""
msgid "AdminSettings|Disable public access to Pages sites"
msgstr ""
+msgid "AdminSettings|Display a banner on merge requests in projects with no pipelines to initiate steps to add a .gitlab-ci.yml file."
+msgstr ""
+
msgid "AdminSettings|Domain verification is an essential security measure for public GitLab sites. Users are required to demonstrate they control a domain before it is enabled. %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "AdminSettings|Enable pipeline suggestion banner"
+msgstr ""
+
msgid "AdminSettings|Enable shared runners for new projects"
msgstr ""
@@ -2968,10 +3001,10 @@ msgstr ""
msgid "Admin|Quarterly reconciliation will occur on %{qrtlyDate}"
msgstr ""
-msgid "Admin|The number of max seats used for your namespace is currently exceeding the number of seats in your subscription. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgid "Admin|The number of max seats in your namespace exceeds the number of seats in your subscription. On %{qrtlyDate}, quarterly reconciliation occurs and you are automatically billed a prorated amount for the overage. No action is needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice. For more information about the timing of the invoicing process, view the documentation."
msgstr ""
-msgid "Admin|The number of maximum users for your instance is currently exceeding the number of users in license. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgid "Admin|The number of max users in your instance exceeds the number of users in your license. On %{qrtlyDate}, quarterly reconciliation occurs and you are automatically billed a prorated amount for the overage. No action is needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice. For more information about the timing of the invoicing process, view the documentation."
msgstr ""
msgid "Admin|View pending user approvals"
@@ -2992,9 +3025,6 @@ msgstr ""
msgid "Advanced export options"
msgstr ""
-msgid "Advanced permissions, Large File Storage and Two-Factor authentication settings."
-msgstr ""
-
msgid "After a successful password update you will be redirected to login screen."
msgstr ""
@@ -3013,14 +3043,14 @@ msgstr ""
msgid "After you've reviewed these contribution guidelines, you'll be all set to"
msgstr ""
+msgid "Akismet"
+msgstr ""
+
msgid "Akismet API Key"
msgstr ""
-msgid "Alert"
-msgid_plural "Alerts"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgid "Akismet helps prevent the creation of spam issues in public projects."
+msgstr ""
msgid "AlertManagement|Acknowledged"
msgstr ""
@@ -3376,6 +3406,9 @@ msgstr ""
msgid "All (default)"
msgstr ""
+msgid "All GitLab"
+msgstr ""
+
msgid "All Members"
msgstr ""
@@ -3490,6 +3523,9 @@ msgstr ""
msgid "Allow this secondary node to replicate content on Object Storage"
msgstr ""
+msgid "Allow use of licensed EE features"
+msgstr ""
+
msgid "Allow users to dismiss the broadcast message"
msgstr ""
@@ -3565,9 +3601,6 @@ msgstr ""
msgid "Amazon authentication is not %{link_start}correctly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
-msgid "Amount of time (in hours) that users are allowed to skip forced configuration of two-factor authentication"
-msgstr ""
-
msgid "An %{link_start}alert%{link_end} with the same fingerprint is already open. To change the status of this alert, resolve the linked alert."
msgstr ""
@@ -3628,12 +3661,6 @@ msgstr ""
msgid "An error occurred when removing the label."
msgstr ""
-msgid "An error occurred when toggling the notification subscription"
-msgstr ""
-
-msgid "An error occurred when updating the issue weight"
-msgstr ""
-
msgid "An error occurred when updating the title"
msgstr ""
@@ -3682,6 +3709,9 @@ msgstr ""
msgid "An error occurred while enabling Service Desk."
msgstr ""
+msgid "An error occurred while fetching Markdown preview"
+msgstr ""
+
msgid "An error occurred while fetching ancestors"
msgstr ""
@@ -3712,9 +3742,6 @@ msgstr ""
msgid "An error occurred while fetching label colors."
msgstr ""
-msgid "An error occurred while fetching markdown preview"
-msgstr ""
-
msgid "An error occurred while fetching participants"
msgstr ""
@@ -3730,9 +3757,6 @@ msgstr ""
msgid "An error occurred while fetching reference"
msgstr ""
-msgid "An error occurred while fetching sidebar data"
-msgstr ""
-
msgid "An error occurred while fetching tags. Retry the search."
msgstr ""
@@ -3808,6 +3832,9 @@ msgstr ""
msgid "An error occurred while loading merge requests."
msgstr ""
+msgid "An error occurred while loading projects."
+msgstr ""
+
msgid "An error occurred while loading the Needs tab."
msgstr ""
@@ -4042,12 +4069,6 @@ msgstr ""
msgid "Any Milestone"
msgstr ""
-msgid "Any branch"
-msgstr ""
-
-msgid "Any eligible user"
-msgstr ""
-
msgid "Any encrypted tokens"
msgstr ""
@@ -4066,6 +4087,9 @@ msgstr ""
msgid "Any namespace"
msgstr ""
+msgid "App Engine description and apps that are suitable for this deployment target"
+msgstr ""
+
msgid "App ID"
msgstr ""
@@ -4216,6 +4240,12 @@ msgstr ""
msgid "Apply"
msgstr ""
+msgid "Apply %d suggestion"
+msgid_plural "Apply %d suggestions"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
msgid "Apply a label"
msgstr ""
@@ -4225,13 +4255,10 @@ msgstr ""
msgid "Apply suggestion"
msgstr ""
-msgid "Apply suggestions"
-msgstr ""
-
msgid "Apply template"
msgstr ""
-msgid "Apply this approval rule to any branch or a specific protected branch."
+msgid "Apply this approval rule to all branches or a specific protected branch."
msgstr ""
msgid "Applying"
@@ -4378,9 +4405,6 @@ msgstr ""
msgid "ApprovalSettings|Prevent editing approval rules in projects and merge requests."
msgstr ""
-msgid "ApprovalSettings|Prevent editing approval rules in projects and merge requests. "
-msgstr ""
-
msgid "ApprovalSettings|Remove all approvals when commits are added to the source branch."
msgstr ""
@@ -4396,6 +4420,9 @@ msgstr ""
msgid "ApprovalSettings|This setting is configured at the instance level and can only be changed by an administrator."
msgstr ""
+msgid "ApprovalSettings|This setting is configured in %{groupName} and can only be changed by an administrator or group owner."
+msgstr ""
+
msgid "ApprovalStatusTooltip|Adheres to separation of duties"
msgstr ""
@@ -4885,9 +4912,6 @@ msgstr ""
msgid "Authenticated API rate limit period in seconds"
msgstr ""
-msgid "Authenticated API request rate limit"
-msgstr ""
-
msgid "Authenticated API requests"
msgstr ""
@@ -4897,10 +4921,10 @@ msgstr ""
msgid "Authenticated Git LFS request rate limit"
msgstr ""
-msgid "Authenticated web rate limit period in seconds"
+msgid "Authenticated Git LFS requests"
msgstr ""
-msgid "Authenticated web request rate limit"
+msgid "Authenticated web rate limit period in seconds"
msgstr ""
msgid "Authenticated web requests"
@@ -5278,9 +5302,6 @@ msgstr ""
msgid "Below you will find all the groups that are public."
msgstr ""
-msgid "Beta"
-msgstr ""
-
msgid "Bi-weekly code coverage"
msgstr ""
@@ -5521,6 +5542,21 @@ msgstr ""
msgid "Board scope affects which issues are displayed for anyone who visits this board"
msgstr ""
+msgid "BoardNewEpic|Groups"
+msgstr ""
+
+msgid "BoardNewEpic|Loading groups"
+msgstr ""
+
+msgid "BoardNewEpic|No matching results"
+msgstr ""
+
+msgid "BoardNewEpic|Search groups"
+msgstr ""
+
+msgid "BoardNewEpic|Select a group"
+msgstr ""
+
msgid "BoardNewIssue|No matching results"
msgstr ""
@@ -5599,6 +5635,9 @@ msgstr ""
msgid "Boards|An error occurred while creating the list. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching child groups. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching group projects. Please try again."
msgstr ""
@@ -5932,6 +5971,9 @@ msgstr ""
msgid "Bulk update"
msgstr ""
+msgid "BulkImports|Re-import creates a new group. It does not sync with the existing group."
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -5941,6 +5983,9 @@ msgstr ""
msgid "BulkImport|From source group"
msgstr ""
+msgid "BulkImport|Group import history"
+msgstr ""
+
msgid "BulkImport|Import failed: Destination cannot be a subgroup of the source group. Change the destination and try again."
msgstr ""
@@ -5953,9 +5998,18 @@ msgstr ""
msgid "BulkImport|Importing the group failed"
msgstr ""
+msgid "BulkImport|Last imported to %{link}"
+msgstr ""
+
msgid "BulkImport|Name already exists."
msgstr ""
+msgid "BulkImport|New group"
+msgstr ""
+
+msgid "BulkImport|No history is available"
+msgstr ""
+
msgid "BulkImport|No parent"
msgstr ""
@@ -5968,6 +6022,9 @@ msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} matching filter \"%{filter}\" from %{link}"
msgstr ""
+msgid "BulkImport|Source group"
+msgstr ""
+
msgid "BulkImport|To new group"
msgstr ""
@@ -5977,6 +6034,9 @@ msgstr ""
msgid "BulkImport|You have no groups to import"
msgstr ""
+msgid "BulkImport|Your imported groups will appear here."
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -6220,6 +6280,9 @@ msgstr ""
msgid "Can be manually deployed to"
msgstr ""
+msgid "Can be overridden in each project."
+msgstr ""
+
msgid "Can create groups:"
msgstr ""
@@ -6322,6 +6385,9 @@ msgstr ""
msgid "Cancelling Preview"
msgstr ""
+msgid "Cannot assign a confidential epic to a non-confidential issue. Make the issue confidential and try again"
+msgstr ""
+
msgid "Cannot be assigned to other projects."
msgstr ""
@@ -6373,9 +6439,6 @@ msgstr ""
msgid "Cannot refer to a group %{timebox_type} by an internal id!"
msgstr ""
-msgid "Cannot set confidential epic for a non-confidential issue"
-msgstr ""
-
msgid "Cannot show preview. For previews on sketch files, they must have the file format introduced by Sketch version 43 and above."
msgstr ""
@@ -6613,15 +6676,15 @@ msgstr ""
msgid "Check out, review, and merge locally"
msgstr ""
-msgid "Check the %{docs_link_start}documentation%{docs_link_end}."
-msgstr ""
-
msgid "Check the current instance configuration "
msgstr ""
msgid "Check the elasticsearch.log file to debug why the migration was halted and make any changes before retrying the migration. When you fix the cause of the failure, click \"Retry migration\", and the migration will be scheduled to be retried in the background."
msgstr ""
+msgid "Check with your administrator."
+msgstr ""
+
msgid "Check your Docker images for known vulnerabilities."
msgstr ""
@@ -6652,6 +6715,9 @@ msgstr ""
msgid "Checkout"
msgstr ""
+msgid "Checkout|$%{selectedPlanPrice} per 10 GB storage per pack"
+msgstr ""
+
msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 minutes"
msgstr ""
@@ -6673,18 +6739,24 @@ msgstr ""
msgid "Checkout|%{name}'s GitLab subscription"
msgstr ""
-msgid "Checkout|%{selectedPlanText} plan"
+msgid "Checkout|%{name}'s storage subscription"
msgstr ""
-msgid "Checkout|%{startDate} - %{endDate}"
+msgid "Checkout|%{quantity} GB of storage"
msgstr ""
-msgid "Checkout|%{totalCiMinutes} CI minute"
-msgid_plural "Checkout|%{totalCiMinutes} CI minutes"
+msgid "Checkout|%{quantity} storage pack"
+msgid_plural "Checkout|%{quantity} storage packs"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
+msgid "Checkout|%{selectedPlanText} plan"
+msgstr ""
+
+msgid "Checkout|%{startDate} - %{endDate}"
+msgstr ""
+
msgid "Checkout|%{totalCiMinutes} CI minutes"
msgstr ""
@@ -6760,6 +6832,9 @@ msgstr ""
msgid "Checkout|Failed to register credit card. Please try again."
msgstr ""
+msgid "Checkout|GB"
+msgstr ""
+
msgid "Checkout|GitLab group"
msgstr ""
@@ -6796,6 +6871,9 @@ msgstr ""
msgid "Checkout|State"
msgstr ""
+msgid "Checkout|Storage packs"
+msgstr ""
+
msgid "Checkout|Street address"
msgstr ""
@@ -6817,6 +6895,9 @@ msgstr ""
msgid "Checkout|Total minutes: %{quantity}"
msgstr ""
+msgid "Checkout|Total storage: %{quantity} GB"
+msgstr ""
+
msgid "Checkout|Users"
msgstr ""
@@ -6826,16 +6907,25 @@ msgstr ""
msgid "Checkout|Your organization"
msgstr ""
+msgid "Checkout|Your storage subscription has the same term as your main subscription, and the price is prorated accordingly."
+msgstr ""
+
msgid "Checkout|Your subscription will be applied to this group"
msgstr ""
msgid "Checkout|Zip code"
msgstr ""
+msgid "Checkout|a storage subscription"
+msgstr ""
+
msgid "Checkout|company or team"
msgstr ""
-msgid "Checkout|x 1,000 minutes per pack = %{strong}"
+msgid "Checkout|minutes"
+msgstr ""
+
+msgid "Checkout|x %{quantity} %{units} per pack ="
msgstr ""
msgid "Cherry-pick this commit"
@@ -7192,6 +7282,9 @@ msgstr ""
msgid "CloneIssue|Cannot clone issue to target project as it is pending deletion."
msgstr ""
+msgid "CloneIssue|Cannot clone issues of '%{issue_type}' type."
+msgstr ""
+
msgid "Cloned this issue to %{path_to_project}."
msgstr ""
@@ -7246,7 +7339,10 @@ msgstr ""
msgid "Closes this %{quick_action_target}."
msgstr ""
-msgid "Cloud licenses can not be removed."
+msgid "Cloud Functions description and apps that are suitable for this deployment target"
+msgstr ""
+
+msgid "Cloud Run description and apps that are suitable for this deployment target"
msgstr ""
msgid "Cluster"
@@ -7273,6 +7369,12 @@ msgstr ""
msgid "ClusterAgents|Access tokens"
msgstr ""
+msgid "ClusterAgents|Agent might not be connected to GitLab"
+msgstr ""
+
+msgid "ClusterAgents|Agent never connected to GitLab"
+msgstr ""
+
msgid "ClusterAgents|Alternative installation methods"
msgstr ""
@@ -7288,6 +7390,12 @@ msgstr ""
msgid "ClusterAgents|Configuration"
msgstr ""
+msgid "ClusterAgents|Connected"
+msgstr ""
+
+msgid "ClusterAgents|Connection status"
+msgstr ""
+
msgid "ClusterAgents|Copy token"
msgstr ""
@@ -7306,6 +7414,9 @@ msgstr ""
msgid "ClusterAgents|For alternative installation methods %{linkStart}go to the documentation%{linkEnd}."
msgstr ""
+msgid "ClusterAgents|For more troubleshooting information go to"
+msgstr ""
+
msgid "ClusterAgents|Go to the repository"
msgstr ""
@@ -7321,18 +7432,30 @@ msgstr ""
msgid "ClusterAgents|Integrate with the GitLab Agent"
msgstr ""
-msgid "ClusterAgents|Last used"
+msgid "ClusterAgents|Last connected %{timeAgo}."
+msgstr ""
+
+msgid "ClusterAgents|Last contact"
msgstr ""
msgid "ClusterAgents|Learn how to create an agent access token"
msgstr ""
+msgid "ClusterAgents|Make sure you are using a valid token."
+msgstr ""
+
msgid "ClusterAgents|Name"
msgstr ""
msgid "ClusterAgents|Never"
msgstr ""
+msgid "ClusterAgents|Never connected"
+msgstr ""
+
+msgid "ClusterAgents|Not connected"
+msgstr ""
+
msgid "ClusterAgents|Read more about getting started"
msgstr ""
@@ -7354,6 +7477,9 @@ msgstr ""
msgid "ClusterAgents|Select which Agent you want to install"
msgstr ""
+msgid "ClusterAgents|The Agent has not been connected in a long time. There might be a connectivity issue. Last contact was %{timeAgo}."
+msgstr ""
+
msgid "ClusterAgents|The GitLab Agent also requires %{linkStart}enabling the Agent Server%{linkEnd}"
msgstr ""
@@ -7381,9 +7507,6 @@ msgstr ""
msgid "ClusterAgents|You will need to create a token to connect to your agent"
msgstr ""
-msgid "ClusterAgent|This feature is only available for premium plans"
-msgstr ""
-
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -7573,9 +7696,6 @@ msgstr ""
msgid "ClusterIntegration|Create Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Create a provision role on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the account and external ID above. %{startMoreInfoLink}More information%{endLink}"
-msgstr ""
-
msgid "ClusterIntegration|Create cluster on"
msgstr ""
@@ -8008,7 +8128,7 @@ msgstr ""
msgid "ClusterIntegration|Subnets"
msgstr ""
-msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provisioned role, first create one on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the above account and external IDs. %{startMoreInfoLink}More information%{endLink}"
+msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provisioned role, first create one on %{awsLinkStart}Amazon Web Services %{awsLinkEnd} using the above account and external IDs. %{moreInfoStart}More information%{moreInfoEnd}"
msgstr ""
msgid "ClusterIntegration|The Kubernetes certificate used to authenticate to the cluster."
@@ -8242,6 +8362,9 @@ msgstr ""
msgid "Collapse replies"
msgstr ""
+msgid "Collapse settings section"
+msgstr ""
+
msgid "Collapse sidebar"
msgstr ""
@@ -8260,6 +8383,9 @@ msgstr ""
msgid "Comma-separated list of email addresses."
msgstr ""
+msgid "Comma-separated list of users allowed to exceed the rate limit."
+msgstr ""
+
msgid "Comma-separated, e.g. '1.1.1.1, 2.2.2.0/24'"
msgstr ""
@@ -8581,6 +8707,9 @@ msgstr ""
msgid "Configure %{repository_checks_link_start}repository checks%{link_end} and %{housekeeping_link_start}housekeeping%{link_end} on repositories."
msgstr ""
+msgid "Configure CAPTCHAs, IP address limits, and other anti-spam measures."
+msgstr ""
+
msgid "Configure Dependency Scanning in `.gitlab-ci.yml` using the GitLab managed template. You can [add variable overrides](https://docs.gitlab.com/ee/user/application_security/dependency_scanning/#customizing-the-dependency-scanning-settings) to customize Dependency Scanning settings."
msgstr ""
@@ -8617,16 +8746,13 @@ msgstr ""
msgid "Configure a %{codeStart}.gitlab-webide.yml%{codeEnd} file in the %{codeStart}.gitlab%{codeEnd} directory to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
msgstr ""
-msgid "Configure existing installation"
-msgstr ""
-
-msgid "Configure limit for notes created per minute by web and API requests."
+msgid "Configure advanced permissions, Large File Storage, and two-factor authentication settings."
msgstr ""
-msgid "Configure limits for Project/Group Import/Export."
+msgid "Configure approvals by authors and committers on all projects."
msgstr ""
-msgid "Configure limits for web and API requests."
+msgid "Configure existing installation"
msgstr ""
msgid "Configure paths to be protected by Rack Attack."
@@ -8641,10 +8767,13 @@ msgstr ""
msgid "Configure settings for Advanced Search with Elasticsearch."
msgstr ""
+msgid "Configure specific limits for Files API requests that supersede the general user and IP rate limits."
+msgstr ""
+
msgid "Configure specific limits for Git LFS requests that supersede the general user and IP rate limits."
msgstr ""
-msgid "Configure specific limits for Packages API requests that supersede the general user and IP rate limits."
+msgid "Configure specific limits for deprecated API requests that supersede the general user and IP rate limits."
msgstr ""
msgid "Configure the %{link} integration."
@@ -8656,6 +8785,9 @@ msgstr ""
msgid "Configure the way a user creates a new account."
msgstr ""
+msgid "Configure via Merge Request"
+msgstr ""
+
msgid "Configure which lists are shown for anyone who visits this board"
msgstr ""
@@ -9127,6 +9259,9 @@ msgstr ""
msgid "Content parsed with %{link}."
msgstr ""
+msgid "ContentEditor|Table of Contents"
+msgstr ""
+
msgid "ContentEditor|You have to provide a renderMarkdown function or a custom serializer"
msgstr ""
@@ -9313,6 +9448,9 @@ msgstr ""
msgid "Copy link to chart"
msgstr ""
+msgid "Copy prefix"
+msgstr ""
+
msgid "Copy reference"
msgstr ""
@@ -9343,6 +9481,9 @@ msgstr ""
msgid "Copy value"
msgstr ""
+msgid "Corpus Management"
+msgstr ""
+
msgid "Corpus Management|Are you sure you want to delete the corpus?"
msgstr ""
@@ -9571,6 +9712,9 @@ msgstr ""
msgid "Create commit"
msgstr ""
+msgid "Create common files more quickly, and standardize their format."
+msgstr ""
+
msgid "Create confidential merge request"
msgstr ""
@@ -9604,6 +9748,9 @@ msgstr ""
msgid "Create issue"
msgstr ""
+msgid "Create issue to resolve all threads"
+msgstr ""
+
msgid "Create iteration"
msgstr ""
@@ -9658,6 +9805,9 @@ msgstr ""
msgid "Create new..."
msgstr ""
+msgid "Create or import your first project"
+msgstr ""
+
msgid "Create project"
msgstr ""
@@ -10015,7 +10165,7 @@ msgstr ""
msgid "Custom notification events"
msgstr ""
-msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notificationLinkStart} notification emails%{notificationLinkEnd}."
+msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notificationLinkStart}notification emails%{notificationLinkEnd}."
msgstr ""
msgid "Custom project templates"
@@ -10216,10 +10366,10 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
-msgid "CycleAnalytics|Showing data for group '%{groupName}' and %{selectedProjectCount} projects from %{startDate} to %{endDate}"
+msgid "CycleAnalytics|Showing data for group '%{groupName}' and %{selectedProjectCount} projects from %{createdAfter} to %{createdBefore}"
msgstr ""
-msgid "CycleAnalytics|Showing data for group '%{groupName}' from %{startDate} to %{endDate}"
+msgid "CycleAnalytics|Showing data for group '%{groupName}' from %{createdAfter} to %{createdBefore}"
msgstr ""
msgid "CycleAnalytics|Stages"
@@ -10453,6 +10603,9 @@ msgstr ""
msgid "DastProfiles|Manage profiles"
msgstr ""
+msgid "DastProfiles|Manage site profiles"
+msgstr ""
+
msgid "DastProfiles|Minimum = 0 (no timeout enabled), Maximum = 2880 minutes"
msgstr ""
@@ -10528,6 +10681,9 @@ msgstr ""
msgid "DastProfiles|Scanner name"
msgstr ""
+msgid "DastProfiles|Schedule"
+msgstr ""
+
msgid "DastProfiles|Select branch"
msgstr ""
@@ -10597,7 +10753,7 @@ msgstr ""
msgid "DastProfiles|Website"
msgstr ""
-msgid "DastProfiles|You can either choose a passive scan or validate the target site in your chosen site profile. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
+msgid "DastProfiles|You can either choose a passive scan or validate the target site from the site profile management page. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
msgstr ""
msgid "DastProfiles|You cannot run an active scan against an unvalidated site."
@@ -10771,7 +10927,7 @@ msgstr ""
msgid "Days to merge"
msgstr ""
-msgid "Deactivate dormant users after 90 days of inactivity. Users can return to active status by signing in to their account. While inactive, a user is not counted as an active user in the instance."
+msgid "Deactivate dormant users after 90 days of inactivity"
msgstr ""
msgid "Dear Administrator,"
@@ -10858,10 +11014,10 @@ msgstr ""
msgid "Define a custom pattern with cron syntax"
msgstr ""
-msgid "Define approval settings."
+msgid "Define approval rules."
msgstr ""
-msgid "Define approval settings. %{linkStart}Learn more.%{linkEnd}"
+msgid "Define approval rules. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "Define custom rules for what constitutes spam, independent of Akismet"
@@ -10870,7 +11026,7 @@ msgstr ""
msgid "Define environments in the deploy stage(s) in %{code_open}.gitlab-ci.yml%{code_close} to track deployments here."
msgstr ""
-msgid "Define how approval rules are applied as a merge request moves toward completion."
+msgid "Define how approval rules are applied to merge requests."
msgstr ""
msgid "Definition"
@@ -10885,6 +11041,12 @@ msgstr ""
msgid "DelayedJobs|Are you sure you want to run %{job_name} immediately? This job will run automatically after it's timer finishes."
msgstr ""
+msgid "DelayedJobs|Are you sure you want to run %{job_name} immediately? This job will run automatically after its timer finishes."
+msgstr ""
+
+msgid "DelayedJobs|Run the delayed job now?"
+msgstr ""
+
msgid "DelayedJobs|Start now"
msgstr ""
@@ -11164,6 +11326,12 @@ msgstr ""
msgid "Dependency proxy image prefix"
msgstr ""
+msgid "DependencyProxy|Create a local proxy for storing frequently used upstream images. %{docLinkStart}Learn more%{docLinkEnd} about dependency proxies."
+msgstr ""
+
+msgid "DependencyProxy|Dependency Proxy"
+msgstr ""
+
msgid "DependencyProxy|Toggle Dependency Proxy"
msgstr ""
@@ -11407,6 +11575,9 @@ msgstr ""
msgid "Deployments"
msgstr ""
+msgid "Deployments to Google Kubernetes Engine can be "
+msgstr ""
+
msgid "Deployments|%{deployments} environment impacted."
msgid_plural "Deployments|%{deployments} environments impacted."
msgstr[0] ""
@@ -11437,6 +11608,9 @@ msgstr ""
msgid "Deployment|success"
msgstr ""
+msgid "Deprecated API rate limits"
+msgstr ""
+
msgid "Deprioritize label"
msgstr ""
@@ -11839,6 +12013,18 @@ msgstr ""
msgid "DiffsCompareBaseBranch|(base)"
msgstr ""
+msgid "Diffs|%d addition"
+msgid_plural "Diffs|%d additions"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+msgid "Diffs|%d deletion"
+msgid_plural "Diffs|%d deletions"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
msgid "Diffs|No file name available"
msgstr ""
@@ -11848,9 +12034,18 @@ msgstr ""
msgid "Diffs|Show all unchanged lines"
msgstr ""
+msgid "Diffs|Showing %{dropdownStart}%{count} changed file%{dropdownEnd}"
+msgid_plural "Diffs|Showing %{dropdownStart}%{count} changed files%{dropdownEnd}"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
msgid "Diffs|Something went wrong while fetching diff lines."
msgstr ""
+msgid "Diffs|with %{additions} and %{deletions}"
+msgstr ""
+
msgid "Direct member"
msgstr ""
@@ -11977,9 +12172,6 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
-msgid "Dismiss Value Stream Analytics introduction box"
-msgstr ""
-
msgid "Dismiss merge request promotion"
msgstr ""
@@ -12301,6 +12493,9 @@ msgstr ""
msgid "Edit issues"
msgstr ""
+msgid "Edit merge requests"
+msgstr ""
+
msgid "Edit public deploy key"
msgstr ""
@@ -12376,6 +12571,9 @@ msgstr ""
msgid "Elastic|None. Select projects to index."
msgstr ""
+msgid "Eligible users"
+msgstr ""
+
msgid "Email"
msgstr ""
@@ -12505,6 +12703,9 @@ msgstr ""
msgid "Enable"
msgstr ""
+msgid "Enable Amazon EKS integration"
+msgstr ""
+
msgid "Enable Auto DevOps"
msgstr ""
@@ -12538,6 +12739,9 @@ msgstr ""
msgid "Enable SSL verification"
msgstr ""
+msgid "Enable Service Ping"
+msgstr ""
+
msgid "Enable Snowplow tracking"
msgstr ""
@@ -12568,6 +12772,9 @@ msgstr ""
msgid "Enable authenticated Git LFS request rate limit"
msgstr ""
+msgid "Enable authenticated web request rate limit"
+msgstr ""
+
msgid "Enable authentication"
msgstr ""
@@ -12628,7 +12835,7 @@ msgstr ""
msgid "Enable or disable the Pseudonymizer data collection."
msgstr ""
-msgid "Enable or disable version check and service ping."
+msgid "Enable or disable version check and Service Ping."
msgstr ""
msgid "Enable protected paths rate limit"
@@ -12640,18 +12847,12 @@ msgstr ""
msgid "Enable reCAPTCHA"
msgstr ""
-msgid "Enable reCAPTCHA for login"
-msgstr ""
-
-msgid "Enable reCAPTCHA, Invisible Captcha, Akismet and set IP limits. For reCAPTCHA, we currently only support %{recaptcha_v2_link_start}v2%{recaptcha_v2_link_end}"
+msgid "Enable reCAPTCHA for login."
msgstr ""
msgid "Enable repository checks"
msgstr ""
-msgid "Enable service ping"
-msgstr ""
-
msgid "Enable shared runners for all projects and subgroups in this group."
msgstr ""
@@ -12673,7 +12874,10 @@ msgstr ""
msgid "Enable unauthenticated API request rate limit"
msgstr ""
-msgid "Enable unauthenticated request rate limit"
+msgid "Enable unauthenticated web request rate limit"
+msgstr ""
+
+msgid "Enable user deactivation emails"
msgstr ""
msgid "Enable version check"
@@ -12709,9 +12913,6 @@ msgstr ""
msgid "Enabled sources for code import during project creation. OmniAuth must be configured for GitHub"
msgstr ""
-msgid "Enabling this will only make licensed EE features available to projects if the project namespace's plan includes the feature or if the project is public."
-msgstr ""
-
msgid "Encountered an error while rendering: %{err}"
msgstr ""
@@ -12760,9 +12961,6 @@ msgstr ""
msgid "Enter Admin Mode"
msgstr ""
-msgid "Enter IP address range"
-msgstr ""
-
msgid "Enter a number"
msgstr ""
@@ -12775,9 +12973,6 @@ msgstr ""
msgid "Enter at least three characters to search"
msgstr ""
-msgid "Enter domain"
-msgstr ""
-
msgid "Enter in your Bitbucket Server URL and personal access token below"
msgstr ""
@@ -12964,9 +13159,6 @@ msgstr ""
msgid "Environments|Deployment %{status}"
msgstr ""
-msgid "Environments|Dismiss"
-msgstr ""
-
msgid "Environments|Enable review app"
msgstr ""
@@ -12979,9 +13171,6 @@ msgstr ""
msgid "Environments|Environments are places where code gets deployed, such as staging or production."
msgstr ""
-msgid "Environments|Help us improve environments"
-msgstr ""
-
msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
msgstr ""
@@ -13018,6 +13207,9 @@ msgstr ""
msgid "Environments|Note that this action will stop the environment, but it will %{emphasisStart}not%{emphasisEnd} have an effect on any existing deployment due to no “stop environment action†being defined in the %{ciConfigLinkStart}.gitlab-ci.yml%{ciConfigLinkEnd} file."
msgstr ""
+msgid "Environments|Open"
+msgstr ""
+
msgid "Environments|Open live environment"
msgstr ""
@@ -13057,9 +13249,6 @@ msgstr ""
msgid "Environments|Stopping %{environmentName}"
msgstr ""
-msgid "Environments|Take the survey"
-msgstr ""
-
msgid "Environments|There was an error fetching the logs. Please try again."
msgstr ""
@@ -13081,9 +13270,6 @@ msgstr ""
msgid "Environments|You don't have any environments right now"
msgstr ""
-msgid "Environments|Your feedback helps GitLab make environments better for you and other users. Participate and enter a sweepstake to win a USD 30 gift card."
-msgstr ""
-
msgid "Environments|by %{avatar}"
msgstr ""
@@ -13366,7 +13552,7 @@ msgstr ""
msgid "Error parsing CSV file. Please make sure it has"
msgstr ""
-msgid "Error rendering markdown preview"
+msgid "Error rendering Markdown preview"
msgstr ""
msgid "Error saving label update."
@@ -13414,6 +13600,9 @@ msgstr ""
msgid "Error: %{error_message}"
msgstr ""
+msgid "Error: Couldn't load some or all of the changes."
+msgstr ""
+
msgid "Error: No AWS credentials were supplied"
msgstr ""
@@ -13447,6 +13636,9 @@ msgstr ""
msgid "ErrorTracking|Enable error tracking"
msgstr ""
+msgid "ErrorTracking|Error tracking backend"
+msgstr ""
+
msgid "ErrorTracking|If you self-host Sentry, enter your Sentry instance's full URL. If you use Sentry's hosted solution, enter https://sentry.io"
msgstr ""
@@ -13480,6 +13672,12 @@ msgstr ""
msgid "Escalation policies must have at least one rule"
msgstr ""
+msgid "EscalationPolicies|%{clockIcon} IF alert is not %{alertStatus} in %{minutes}"
+msgstr ""
+
+msgid "EscalationPolicies|%{notificationIcon} THEN %{doAction} %{forScheduleOrUser}"
+msgstr ""
+
msgid "EscalationPolicies|+ Add an additional rule"
msgstr ""
@@ -13522,13 +13720,13 @@ msgstr ""
msgid "EscalationPolicies|Escalation policies"
msgstr ""
-msgid "EscalationPolicies|Escalation rules"
+msgid "EscalationPolicies|Escalation policy %{obstacle} in Project %{project}"
msgstr ""
-msgid "EscalationPolicies|Failed to load oncall-schedules"
+msgid "EscalationPolicies|Escalation rules"
msgstr ""
-msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} %{then} THEN %{doAction} %{scheduleOrUser}"
+msgid "EscalationPolicies|Failed to load oncall-schedules"
msgstr ""
msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} minutes"
@@ -13606,18 +13804,36 @@ msgstr ""
msgid "Every %{action} attempt has failed: %{job_error_message}. Please try again."
msgstr ""
+msgid "Every 3 months"
+msgstr ""
+
+msgid "Every 3 months on the %{day} at %{time} %{timezone}"
+msgstr ""
+
+msgid "Every 6 months"
+msgstr ""
+
+msgid "Every 6 months on the %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Every day"
msgstr ""
msgid "Every day (at %{time})"
msgstr ""
+msgid "Every day at %{time} %{timezone}"
+msgstr ""
+
msgid "Every month"
msgstr ""
msgid "Every month (Day %{day} at %{time})"
msgstr ""
+msgid "Every month on the %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Every three months"
msgstr ""
@@ -13633,6 +13849,15 @@ msgstr[2] ""
msgid "Every week (%{weekday} at %{time})"
msgstr ""
+msgid "Every week on %{day} at %{time} %{timezone}"
+msgstr ""
+
+msgid "Every year"
+msgstr ""
+
+msgid "Every year on %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Everyone"
msgstr ""
@@ -13669,9 +13894,6 @@ msgstr ""
msgid "Exactly one of %{attributes} is required"
msgstr ""
-msgid "Example: %{ip_address}. %{read_more_link}."
-msgstr ""
-
msgid "Example: @sub\\.company\\.com$"
msgstr ""
@@ -13738,13 +13960,13 @@ msgstr ""
msgid "Expand pipeline"
msgstr ""
-msgid "Expand sidebar"
+msgid "Expand settings section"
msgstr ""
-msgid "Expected documents: %{expected_documents}"
+msgid "Expand sidebar"
msgstr ""
-msgid "Experienced"
+msgid "Expected documents: %{expected_documents}"
msgstr ""
msgid "ExperimentSubject|Must have exactly one of User, Namespace, or Project."
@@ -14029,9 +14251,6 @@ msgstr ""
msgid "Failed to load related branches"
msgstr ""
-msgid "Failed to load sidebar lock status"
-msgstr ""
-
msgid "Failed to load stacktrace."
msgstr ""
@@ -14458,6 +14677,9 @@ msgstr ""
msgid "Files"
msgstr ""
+msgid "Files API Rate Limits"
+msgstr ""
+
msgid "Files breadcrumb"
msgstr ""
@@ -15457,6 +15679,9 @@ msgstr ""
msgid "GitLab group: %{source_link}"
msgstr ""
+msgid "GitLab informs you if a new version is available."
+msgstr ""
+
msgid "GitLab is a complete DevOps platform, delivered as a single application, fundamentally changing the way Development, Security, and Ops teams collaborate"
msgstr ""
@@ -15472,7 +15697,7 @@ msgstr ""
msgid "GitLab is open source software to collaborate on code."
msgstr ""
-msgid "GitLab is undergoing maintenance and is operating in a read-only mode."
+msgid "GitLab is undergoing maintenance and is operating in read-only mode."
msgstr ""
msgid "GitLab member or Email address"
@@ -15484,9 +15709,6 @@ msgstr ""
msgid "GitLab project export"
msgstr ""
-msgid "GitLab restart is required to apply changes."
-msgstr ""
-
msgid "GitLab single sign-on URL"
msgstr ""
@@ -15502,9 +15724,6 @@ msgstr ""
msgid "GitLab version"
msgstr ""
-msgid "GitLab will inform you if a new version is available."
-msgstr ""
-
msgid "GitLab will run a background job that will produce pseudonymized CSVs of the GitLab database that will be uploaded to your configured object storage directory."
msgstr ""
@@ -15769,9 +15988,21 @@ msgstr ""
msgid "Go to snippets"
msgstr ""
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check 'Allowed domains for sign-ups'."
+msgstr ""
+
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check 'Email restrictions for sign-ups'."
+msgstr ""
+
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check the 'Domain denylist'."
+msgstr ""
+
msgid "Go to the activity feed"
msgstr ""
+msgid "Go to the group’s 'Settings &gt; General' page, and check 'Restrict membership by email domain'."
+msgstr ""
+
msgid "Go to the milestone list"
msgstr ""
@@ -15808,6 +16039,12 @@ msgstr ""
msgid "Goal of the changes and what reviewers should be aware of"
msgstr ""
+msgid "Google Cloud"
+msgstr ""
+
+msgid "Google Cloud offers several deployment targets. Select the one most suitable for your project."
+msgstr ""
+
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
@@ -15892,9 +16129,6 @@ msgstr ""
msgid "Group ID"
msgstr ""
-msgid "Group ID: %{group_id}"
-msgstr ""
-
msgid "Group Owner must have signed in with SAML before enabling Group Managed Accounts"
msgstr ""
@@ -16069,6 +16303,12 @@ msgstr ""
msgid "GroupImport|Unable to process group import file"
msgstr ""
+msgid "GroupPage|Copy group ID"
+msgstr ""
+
+msgid "GroupPage|Group ID: %{group_id}"
+msgstr ""
+
msgid "GroupRoadmap|%{dateWord} – No end date"
msgstr ""
@@ -16123,6 +16363,9 @@ msgstr ""
msgid "GroupRoadmap|Within 3 years"
msgstr ""
+msgid "GroupSAML|\"persistent\" recommended"
+msgstr ""
+
msgid "GroupSAML|%{strongOpen}Warning%{strongClose} - Enabling %{linkStart}SSO enforcement%{linkEnd} can reduce security risks."
msgstr ""
@@ -16255,6 +16498,9 @@ msgstr ""
msgid "GroupSAML|To be able to prohibit outer forks, you first need to enforce dedicate group managed accounts."
msgstr ""
+msgid "GroupSAML|Use SAML group links to manage group membership using SAML."
+msgstr ""
+
msgid "GroupSAML|Valid SAML Response"
msgstr ""
@@ -16267,13 +16513,10 @@ msgstr ""
msgid "GroupSAML|as %{access_level}"
msgstr ""
-msgid "GroupSAML|must match stored NameID of \"%{extern_uid}\" as we use this to identify users. If the NameID changes users will be unable to sign in."
-msgstr ""
-
-msgid "GroupSAML|should be \"persistent\""
+msgid "GroupSAML|must match stored NameID of \"%{extern_uid}\" to identify user and allow sign in"
msgstr ""
-msgid "GroupSAML|should be a random persistent ID, emails are discouraged"
+msgid "GroupSAML|recommend persistent ID instead of email"
msgstr ""
msgid "GroupSelect|No matching results"
@@ -16288,9 +16531,15 @@ msgstr ""
msgid "GroupSettings|Allow project access token creation"
msgstr ""
+msgid "GroupSettings|Applied to all subgroups unless overridden by a group owner. Groups already added to the project lose access."
+msgstr ""
+
msgid "GroupSettings|Auto DevOps pipeline was updated for the group"
msgstr ""
+msgid "GroupSettings|Available only on the top-level group. Applies to all subgroups. Groups already shared with a group outside %{group} are still shared unless removed manually."
+msgstr ""
+
msgid "GroupSettings|Badges"
msgstr ""
@@ -16342,6 +16591,9 @@ msgstr ""
msgid "GroupSettings|New runners registration token has been generated!"
msgstr ""
+msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgstr ""
+
msgid "GroupSettings|Pipeline settings was updated for the group"
msgstr ""
@@ -16354,12 +16606,15 @@ msgstr ""
msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
-msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups."
+msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups"
msgstr ""
msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
msgstr ""
+msgid "GroupSettings|Prevents group members from being notified if the group is mentioned."
+msgstr ""
+
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
msgstr ""
@@ -16396,21 +16651,6 @@ msgstr ""
msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}."
msgstr ""
-msgid "GroupSettings|This setting is only available on the top-level group and it applies to all subgroups. Groups that have already been shared with a group outside %{group} will still be shared, and this access will have to be revoked manually."
-msgstr ""
-
-msgid "GroupSettings|This setting will be applied to all subgroups unless overridden by a group owner. Groups that already have access to the project will continue to have access unless removed manually."
-msgstr ""
-
-msgid "GroupSettings|This setting will override user notification preferences for all members of the group, subgroups, and projects."
-msgstr ""
-
-msgid "GroupSettings|This setting will prevent group members from being notified if the group is mentioned."
-msgstr ""
-
-msgid "GroupSettings|This setting will prevent group members from forking projects outside of the group."
-msgstr ""
-
msgid "GroupSettings|Transfer group"
msgstr ""
@@ -16528,7 +16768,7 @@ msgstr ""
msgid "GroupsNew|No import options available"
msgstr ""
-msgid "GroupsNew|Not all related objects are migrated, as %{docs_link_start}described here%{docs_link_end}. Please %{feedback_link_start}leave feedback%{feedback_link_end} on this feature."
+msgid "GroupsNew|Not all related objects are migrated. %{docs_link_start}More info%{docs_link_end}."
msgstr ""
msgid "GroupsNew|Personal access token"
@@ -16660,15 +16900,27 @@ msgstr ""
msgid "Hello %{name},"
msgstr ""
-msgid "Hello there"
-msgstr ""
-
msgid "Hello, %{name}!"
msgstr ""
msgid "Hello, %{username}!"
msgstr ""
+msgid "HelloMessage|%{handshake_emoji} Contribute to GitLab: %{contribute_link}"
+msgstr ""
+
+msgid "HelloMessage|%{magnifier_emoji} Create a new GitLab issue: %{new_issue_link}"
+msgstr ""
+
+msgid "HelloMessage|%{rocket_emoji} We like your curiosity! Help us improve GitLab by joining the team: %{jobs_page_link}"
+msgstr ""
+
+msgid "HelloMessage|Does this page need fixes or improvements? Open an issue or contribute a merge request to help make GitLab more lovable. At GitLab, everyone can contribute!"
+msgstr ""
+
+msgid "HelloMessage|Welcome to GitLab!"
+msgstr ""
+
msgid "Help"
msgstr ""
@@ -16678,13 +16930,10 @@ msgstr ""
msgid "Helps prevent bots from creating accounts."
msgstr ""
-msgid "Helps prevent bots from creating issues"
-msgstr ""
-
-msgid "Helps prevent malicious users hide their activity"
+msgid "Helps prevent bots from creating issues."
msgstr ""
-msgid "Helps reduce request volume (e.g. from crawlers or abusive bots)"
+msgid "Helps prevent malicious users hide their activity."
msgstr ""
msgid "Helps reduce request volume (for example, from crawlers or abusive bots)"
@@ -16810,6 +17059,12 @@ msgstr ""
msgid "Housekeeping, export, path, transfer, remove, archive."
msgstr ""
+msgid "How do I configure Akismet?"
+msgstr ""
+
+msgid "How do I configure it?"
+msgstr ""
+
msgid "How do I configure runners?"
msgstr ""
@@ -16831,19 +17086,25 @@ msgstr ""
msgid "How do I set up this service?"
msgstr ""
+msgid "How do I use a web terminal?"
+msgstr ""
+
+msgid "How do I use file templates?"
+msgstr ""
+
msgid "How it works"
msgstr ""
msgid "How many days need to pass between marking entity for deletion and actual removing it."
msgstr ""
-msgid "How many seconds an IP will be counted towards the limit"
+msgid "How many seconds an IP counts toward the IP address limit."
msgstr ""
-msgid "I accept the %{terms_link}"
+msgid "How the job limiter handles jobs exceeding the thresholds specified below. The 'track' mode only logs the jobs. The 'compress' mode compresses the jobs and raises an exception if the compressed size exceeds the limit."
msgstr ""
-msgid "I accept the|Terms of Service and Privacy Policy"
+msgid "I accept the %{terms_link}"
msgstr ""
msgid "I forgot my password"
@@ -16927,13 +17188,16 @@ msgstr ""
msgid "IP Address"
msgstr ""
-msgid "IP expiration time"
+msgid "IP address expiration time"
msgstr ""
-msgid "IP subnet restriction only allowed for top-level groups"
+msgid "IP address restrictions"
+msgstr ""
+
+msgid "IP addresses per user"
msgstr ""
-msgid "IPs per user"
+msgid "IP subnet restriction only allowed for top-level groups"
msgstr ""
msgid "Identifier"
@@ -16948,6 +17212,9 @@ msgstr ""
msgid "If any indexed field exceeds this limit it will be truncated to this number of characters and the rest will not be indexed or searchable. This does not apply to repository and wiki indexing. Setting this to 0 means it is unlimited."
msgstr ""
+msgid "If blank, defaults to %{code_open}Retry later%{code_close}."
+msgstr ""
+
msgid "If blank, set allowable lifetime to %{instance_level_policy_in_words}, as defined by the instance admin. Once set, existing tokens for users in this group may be revoked."
msgstr ""
@@ -16999,6 +17266,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 did not initiate these sign-in attempts, please reach out to your administrator or enable two-factor authentication (2FA) on your account."
+msgstr ""
+
msgid "If you did not initiate this change, please contact your administrator immediately."
msgstr ""
@@ -17092,10 +17362,10 @@ msgstr ""
msgid "Import Projects from Gitea"
msgstr ""
-msgid "Import a project"
+msgid "Import an exported GitLab project"
msgstr ""
-msgid "Import an exported GitLab project"
+msgid "Import and export rate limits"
msgstr ""
msgid "Import failed due to a GitHub error: %{original}"
@@ -17107,12 +17377,18 @@ msgstr ""
msgid "Import from Jira"
msgstr ""
+msgid "Import group"
+msgstr ""
+
msgid "Import group from file"
msgstr ""
msgid "Import groups"
msgstr ""
+msgid "Import history"
+msgstr ""
+
msgid "Import in progress"
msgstr ""
@@ -17176,7 +17452,25 @@ msgstr ""
msgid "Import timed out. Import took longer than %{import_jobs_expiration} seconds"
msgstr ""
-msgid "Import/Export Rate Limits"
+msgid "ImportAProjectModal|Import from a project"
+msgstr ""
+
+msgid "ImportAProjectModal|Import members from another project"
+msgstr ""
+
+msgid "ImportAProjectModal|Import project members"
+msgstr ""
+
+msgid "ImportAProjectModal|Only project members (not group members) are imported, and they get the same permissions as the project you import from."
+msgstr ""
+
+msgid "ImportAProjectModal|Successfully imported"
+msgstr ""
+
+msgid "ImportAProjectModal|Unable to import project members"
+msgstr ""
+
+msgid "ImportAProjectModal|You're importing members to the %{strongStart}%{name}%{strongEnd} project."
msgstr ""
msgid "ImportButtons|Connect repositories from"
@@ -17230,7 +17524,7 @@ msgstr[2] ""
msgid "Importing..."
msgstr ""
-msgid "Import|A repository URL usually ends in a .git suffix, although this is not required. Double check to make sure your repository URL is correct."
+msgid "Import|There is not a valid Git repository at this URL. If your HTTP repository is not publicly accessible, verify your credentials."
msgstr ""
msgid "Improve customer support with Service Desk"
@@ -17239,9 +17533,6 @@ msgstr ""
msgid "Improves Git cloning performance."
msgstr ""
-msgid "In %{time_to_now}"
-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 ""
@@ -17527,7 +17818,7 @@ msgstr ""
msgid "InProductMarketing|Start a GitLab Ultimate trial today in less than one minute, no credit card required."
msgstr ""
-msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no CC required"
+msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no credit card required"
msgstr ""
msgid "InProductMarketing|Start a trial"
@@ -17566,7 +17857,7 @@ msgstr ""
msgid "InProductMarketing|Team up in GitLab for greater efficiency"
msgstr ""
-msgid "InProductMarketing|Team work makes the dream work"
+msgid "InProductMarketing|Team work makes the dream work"
msgstr ""
msgid "InProductMarketing|Test, create, deploy"
@@ -18148,6 +18439,9 @@ msgstr ""
msgid "Integrations|Create new issue in Jira"
msgstr ""
+msgid "Integrations|Create new issue in ZenTao"
+msgstr ""
+
msgid "Integrations|Default settings are inherited from the group level."
msgstr ""
@@ -18241,9 +18535,15 @@ msgstr ""
msgid "Integrations|Search Jira issues"
msgstr ""
+msgid "Integrations|Search ZenTao issues"
+msgstr ""
+
msgid "Integrations|Send notifications about project events to Unify Circuit."
msgstr ""
+msgid "Integrations|Send notifications about project events to a Unify Circuit conversation. %{docs_link}"
+msgstr ""
+
msgid "Integrations|Sign in to add namespaces"
msgstr ""
@@ -18283,6 +18583,9 @@ msgstr ""
msgid "Integrations|You've activated every integration 🎉"
msgstr ""
+msgid "Integrations|ZenTao issues display here when you create issues in your project in ZenTao."
+msgstr ""
+
msgid "Interactive mode"
msgstr ""
@@ -18310,9 +18613,6 @@ msgstr ""
msgid "Interval Pattern"
msgstr ""
-msgid "Introducing Value Stream Analytics"
-msgstr ""
-
msgid "Introducing Your DevOps Report"
msgstr ""
@@ -18409,6 +18709,12 @@ msgstr ""
msgid "Investigate vulnerability: %{title}"
msgstr ""
+msgid "Invisible Captcha"
+msgstr ""
+
+msgid "Invisible Captcha helps prevent the creation of spam accounts. It adds a honeypot field and time-sensitive form submission to the account signup form."
+msgstr ""
+
msgid "Invitation"
msgstr ""
@@ -18862,12 +19168,18 @@ msgstr ""
msgid "Issues"
msgstr ""
+msgid "Issues I've created"
+msgstr ""
+
msgid "Issues Rate Limits"
msgstr ""
msgid "Issues and merge requests"
msgstr ""
+msgid "Issues assigned to me"
+msgstr ""
+
msgid "Issues can be bugs, tasks or ideas to be discussed. Also, issues are searchable and filterable."
msgstr ""
@@ -18979,7 +19291,7 @@ msgstr ""
msgid "Iterations|Create cadence"
msgstr ""
-msgid "Iterations|Create your first iteration"
+msgid "Iterations|Create iteration"
msgstr ""
msgid "Iterations|Delete cadence"
@@ -18988,6 +19300,9 @@ msgstr ""
msgid "Iterations|Delete iteration cadence?"
msgstr ""
+msgid "Iterations|Delete iteration?"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -19021,12 +19336,18 @@ msgstr ""
msgid "Iterations|New iteration cadence"
msgstr ""
+msgid "Iterations|No closed iterations."
+msgstr ""
+
msgid "Iterations|No iteration cadences to show."
msgstr ""
msgid "Iterations|No iterations in cadence."
msgstr ""
+msgid "Iterations|No open iterations."
+msgstr ""
+
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
@@ -19057,6 +19378,9 @@ msgstr ""
msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
msgstr ""
+msgid "Iterations|This will remove the iteration from any issues that are assigned to it."
+msgstr ""
+
msgid "Iterations|Title"
msgstr ""
@@ -19072,15 +19396,9 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "I’m familiar with the basics of DevOps."
-msgstr ""
-
msgid "I’m joining my team who’s already on GitLab"
msgstr ""
-msgid "I’m not familiar with the basics of DevOps."
-msgstr ""
-
msgid "Jaeger URL"
msgstr ""
@@ -19345,6 +19663,9 @@ msgstr ""
msgid "Job"
msgstr ""
+msgid "Job %{jobName}"
+msgstr ""
+
msgid "Job Failed #%{build_id}"
msgstr ""
@@ -19936,9 +20257,6 @@ msgstr ""
msgid "Learn more in the"
msgstr ""
-msgid "Learn more in the|pipeline schedules documentation"
-msgstr ""
-
msgid "Learn more."
msgstr ""
@@ -20050,9 +20368,6 @@ msgstr ""
msgid "Leave Admin Mode"
msgstr ""
-msgid "Leave blank for no limit. Once set, existing personal access tokens may be revoked."
-msgstr ""
-
msgid "Leave edit mode? All unsaved changes will be lost."
msgstr ""
@@ -20098,10 +20413,10 @@ msgstr ""
msgid "LicenseCompliance|Acceptable license to be used in the project"
msgstr ""
-msgid "LicenseCompliance|Add a license"
+msgid "LicenseCompliance|Add license and related policy"
msgstr ""
-msgid "LicenseCompliance|Add license and related policy"
+msgid "LicenseCompliance|Add license policy"
msgstr ""
msgid "LicenseCompliance|Allow"
@@ -20197,6 +20512,9 @@ msgstr ""
msgid "LicenseManagement|Uncategorized"
msgstr ""
+msgid "Licensed Enterprise Edition features can be used if the project namespace's plan includes the feature, or if the project is public."
+msgstr ""
+
msgid "Licensed Features"
msgstr ""
@@ -20263,7 +20581,10 @@ msgstr ""
msgid "Limit namespaces and projects that can be indexed"
msgstr ""
-msgid "Limit sign in from multiple ips"
+msgid "Limit project size at a global, group, and project level. %{link_start}Learn more%{link_end}."
+msgstr ""
+
+msgid "Limit sign in from multiple IP addresses"
msgstr ""
msgid "Limit the number of concurrent operations this secondary site can run in the background."
@@ -20275,12 +20596,18 @@ msgstr ""
msgid "Limit the number of issues and epics per minute a user can create through web and API requests."
msgstr ""
+msgid "Limit the size of Sidekiq jobs stored in Redis."
+msgstr ""
+
msgid "Limited to showing %d event at most"
msgid_plural "Limited to showing %d events at most"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
+msgid "Limiting mode"
+msgstr ""
+
msgid "Line changes"
msgstr ""
@@ -20350,9 +20677,6 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
-msgid "List of users to be excluded from the limit"
-msgstr ""
-
msgid "List options"
msgstr ""
@@ -20392,9 +20716,6 @@ msgstr ""
msgid "Loading functions timed out. Please reload the page to try again."
msgstr ""
-msgid "Loading issues"
-msgstr ""
-
msgid "Loading more"
msgstr ""
@@ -20686,6 +21007,9 @@ msgstr ""
msgid "Marked For Deletion At - %{deletion_time}"
msgstr ""
+msgid "Marked as ready. Merging is now allowed."
+msgstr ""
+
msgid "Marked this %{noun} as a draft."
msgstr ""
@@ -20758,52 +21082,22 @@ msgstr ""
msgid "Max 100,000 events"
msgstr ""
-msgid "Max 20 characters"
-msgstr ""
-
-msgid "Max Group Export Download requests per minute per user"
-msgstr ""
-
-msgid "Max Group Export requests per minute per user"
-msgstr ""
-
-msgid "Max Group Import requests per minute per user"
-msgstr ""
-
-msgid "Max Project Export Download requests per minute per user"
-msgstr ""
-
-msgid "Max Project Export requests per minute per user"
-msgstr ""
-
-msgid "Max Project Import requests per minute per user"
-msgstr ""
-
-msgid "Max authenticated API requests per period per user"
-msgstr ""
-
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
-msgid "Max authenticated web requests per period per user"
-msgstr ""
-
msgid "Max file size is 200 KB."
msgstr ""
-msgid "Max requests per minute per user"
-msgstr ""
-
msgid "Max role"
msgstr ""
msgid "Max session time"
msgstr ""
-msgid "Max unauthenticated requests per period per IP"
+msgid "MaxBuilds"
msgstr ""
-msgid "MaxBuilds"
+msgid "Maximum 20 characters"
msgstr ""
msgid "Maximum Conan package file size in bytes"
@@ -20839,6 +21133,12 @@ msgstr ""
msgid "Maximum attachment size (MB)"
msgstr ""
+msgid "Maximum authenticated API requests per rate limit period per user"
+msgstr ""
+
+msgid "Maximum authenticated web requests per rate limit period per user"
+msgstr ""
+
msgid "Maximum bulk request size (MiB)"
msgstr ""
@@ -20884,6 +21184,15 @@ msgstr ""
msgid "Maximum files in a diff"
msgstr ""
+msgid "Maximum group export download requests per minute"
+msgstr ""
+
+msgid "Maximum group export requests per minute"
+msgstr ""
+
+msgid "Maximum group import requests per minute"
+msgstr ""
+
msgid "Maximum import size"
msgstr ""
@@ -20920,7 +21229,7 @@ msgstr ""
msgid "Maximum number of projects."
msgstr ""
-msgid "Maximum number of unique IPs per user"
+msgid "Maximum number of unique IP addresses per user."
msgstr ""
msgid "Maximum page reached"
@@ -20929,12 +21238,24 @@ msgstr ""
msgid "Maximum page size"
msgstr ""
+msgid "Maximum project export download requests per minute"
+msgstr ""
+
+msgid "Maximum project export requests per minute"
+msgstr ""
+
+msgid "Maximum project import requests per minute"
+msgstr ""
+
msgid "Maximum push size"
msgstr ""
msgid "Maximum push size (MB)"
msgstr ""
+msgid "Maximum requests per minute"
+msgstr ""
+
msgid "Maximum running slices"
msgstr ""
@@ -20962,10 +21283,16 @@ msgstr ""
msgid "Maximum time between updates that a mirror can have when scheduled to synchronize."
msgstr ""
-msgid "Maximum time for web terminal websocket connection (in seconds). 0 for unlimited."
+msgid "Maximum time that users are allowed to skip the setup of two-factor authentication (in hours). Set to 0 (zero) to enforce at next sign in."
msgstr ""
-msgid "Maximum time that users are allowed to skip the setup of two-factor authentication (in hours). Set to 0 (zero) to enforce at next sign in."
+msgid "Maximum time, in seconds, for a web terminal websocket connection. 0 for unlimited."
+msgstr ""
+
+msgid "Maximum unauthenticated API requests per rate limit period per IP"
+msgstr ""
+
+msgid "Maximum unauthenticated web requests per rate limit period per IP"
msgstr ""
msgid "May"
@@ -20983,9 +21310,6 @@ msgstr ""
msgid "Medium vulnerabilities present"
msgstr ""
-msgid "Member lock"
-msgstr ""
-
msgid "Member since"
msgstr ""
@@ -21022,6 +21346,9 @@ msgstr ""
msgid "Members of a group may only view projects they have permission to access"
msgstr ""
+msgid "Membership"
+msgstr ""
+
msgid "Members|%{time} by %{user}"
msgstr ""
@@ -21082,9 +21409,6 @@ msgstr ""
msgid "Members|Expiration date updated successfully."
msgstr ""
-msgid "Members|Expired"
-msgstr ""
-
msgid "Members|Filter members"
msgstr ""
@@ -21100,9 +21424,6 @@ msgstr ""
msgid "Members|Membership"
msgstr ""
-msgid "Members|No expiration set"
-msgstr ""
-
msgid "Members|Remove \"%{groupName}\""
msgstr ""
@@ -21124,9 +21445,6 @@ msgstr ""
msgid "Members|Search invited"
msgstr ""
-msgid "Members|in %{time}"
-msgstr ""
-
msgid "Member|Deny access"
msgstr ""
@@ -21202,9 +21520,6 @@ msgstr ""
msgid "Merge request %{mr_link} was reviewed by %{mr_author}"
msgstr ""
-msgid "Merge request (MR) approvals"
-msgstr ""
-
msgid "Merge request analytics"
msgstr ""
@@ -21226,12 +21541,21 @@ msgstr ""
msgid "Merge requests"
msgstr ""
+msgid "Merge requests I've created"
+msgstr ""
+
msgid "Merge requests are a place to propose changes you've made to a project and discuss those changes with others"
msgstr ""
msgid "Merge requests are read-only in a secondary Geo node"
msgstr ""
+msgid "Merge requests assigned to me"
+msgstr ""
+
+msgid "Merge requests that I'm a reviewer"
+msgstr ""
+
msgid "Merge the branch and fix any conflicts that come up"
msgstr ""
@@ -21292,10 +21616,10 @@ msgstr ""
msgid "MergeRequests|An error occurred while saving the draft comment."
msgstr ""
-msgid "MergeRequests|Failed to squash. Should be done manually."
+msgid "MergeRequests|Create issue to resolve thread"
msgstr ""
-msgid "MergeRequests|Resolve this thread in a new issue"
+msgid "MergeRequests|Failed to squash. Should be done manually."
msgstr ""
msgid "MergeRequests|Saving the comment failed"
@@ -22111,6 +22435,9 @@ msgstr ""
msgid "MoveIssue|Cannot move issue to project it originates from!"
msgstr ""
+msgid "MoveIssue|Cannot move issues of '%{issue_type}' type."
+msgstr ""
+
msgid "Moved issue to %{label} column in the board."
msgstr ""
@@ -22237,6 +22564,15 @@ 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. To learn more about reducing storage capacity please visit our docs."
msgstr ""
+msgid "NamespaceUserCap|Pending users must be reviewed and approved by a group owner. Learn more about %{user_caps_link_start}User Caps%{link_end} and %{users_pending_approval_link_start}Users Pending Approval%{link_end}."
+msgstr ""
+
+msgid "NamespaceUserCap|View pending user approvals"
+msgstr ""
+
+msgid "NamespaceUserCap|Your group has reached its billable member limit"
+msgstr ""
+
msgid "Namespaces"
msgstr ""
@@ -22279,9 +22615,6 @@ msgstr ""
msgid "Network"
msgstr ""
-msgid "Network Policy|New rule"
-msgstr ""
-
msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is inbound from a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
msgstr ""
@@ -22303,16 +22636,13 @@ msgstr ""
msgid "NetworkPolicies|%{strongOpen}any%{strongClose} port"
msgstr ""
-msgid "NetworkPolicies|+ Add alert"
-msgstr ""
-
msgid "NetworkPolicies|.yaml"
msgstr ""
msgid "NetworkPolicies|.yaml mode"
msgstr ""
-msgid "NetworkPolicies|Actions"
+msgid "NetworkPolicies|Add alert"
msgstr ""
msgid "NetworkPolicies|Alerts are intended to be selectively used for a limited number of events that are potentially concerning and warrant a manual review. Alerts should not be used as a substitute for a SIEM or a logging tool. High volume alerts are likely to be dropped so as to preserve the stability of GitLab's integration with Kubernetes."
@@ -22348,9 +22678,6 @@ msgstr ""
msgid "NetworkPolicies|Deny all traffic"
msgstr ""
-msgid "NetworkPolicies|Description"
-msgstr ""
-
msgid "NetworkPolicies|Edit policy"
msgstr ""
@@ -22363,9 +22690,6 @@ msgstr ""
msgid "NetworkPolicies|IP/subnet"
msgstr ""
-msgid "NetworkPolicies|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
-msgstr ""
-
msgid "NetworkPolicies|Invalid or empty policy"
msgstr ""
@@ -22375,19 +22699,16 @@ msgstr ""
msgid "NetworkPolicies|Kubernetes error: %{error}"
msgstr ""
-msgid "NetworkPolicies|Name"
-msgstr ""
-
msgid "NetworkPolicies|Network"
msgstr ""
-msgid "NetworkPolicies|Network traffic"
+msgid "NetworkPolicies|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
msgstr ""
-msgid "NetworkPolicies|New policy"
+msgid "NetworkPolicies|Network policy can be created after the environment is loaded successfully."
msgstr ""
-msgid "NetworkPolicies|No policies detected"
+msgid "NetworkPolicies|Network traffic"
msgstr ""
msgid "NetworkPolicies|None selected"
@@ -22396,21 +22717,12 @@ msgstr ""
msgid "NetworkPolicies|Please %{installLinkStart}install%{installLinkEnd} and %{configureLinkStart}configure a Kubernetes Agent for this project%{configureLinkEnd} to enable alerts."
msgstr ""
-msgid "NetworkPolicies|Policies are a specification of how groups of pods are allowed to communicate with each other's network endpoints."
-msgstr ""
-
msgid "NetworkPolicies|Policy %{policyName} was successfully changed"
msgstr ""
msgid "NetworkPolicies|Policy definition"
msgstr ""
-msgid "NetworkPolicies|Policy editor"
-msgstr ""
-
-msgid "NetworkPolicies|Policy preview"
-msgstr ""
-
msgid "NetworkPolicies|Rule"
msgstr ""
@@ -22420,9 +22732,6 @@ msgstr ""
msgid "NetworkPolicies|Rule mode is unavailable for this policy. In some cases, we cannot parse the YAML file back into the rules editor."
msgstr ""
-msgid "NetworkPolicies|Rules"
-msgstr ""
-
msgid "NetworkPolicies|Save changes"
msgstr ""
@@ -22435,9 +22744,6 @@ msgstr ""
msgid "NetworkPolicies|Traffic that does not match any rule will be blocked."
msgstr ""
-msgid "NetworkPolicies|Unable to parse policy"
-msgstr ""
-
msgid "NetworkPolicies|all DNS names"
msgstr ""
@@ -22618,6 +22924,9 @@ msgstr ""
msgid "New issue"
msgstr ""
+msgid "New issue in %{project}"
+msgstr ""
+
msgid "New issue title"
msgstr ""
@@ -22696,7 +23005,7 @@ msgstr ""
msgid "Newest first"
msgstr ""
-msgid "Newly registered users will by default be external"
+msgid "Newly-registered users are external by default"
msgstr ""
msgid "Next"
@@ -23011,8 +23320,11 @@ msgstr ""
msgid "No webhooks found, add one in the form above."
msgstr ""
-msgid "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} to renew your subscription."
-msgstr ""
+msgid "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} day to renew your subscription."
+msgid_plural "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} days to renew your subscription."
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
msgid "No. of commits"
msgstr ""
@@ -23029,7 +23341,7 @@ msgstr ""
msgid "Nodes"
msgstr ""
-msgid "Non-admin users can sign in with read-only access and make read-only API requests."
+msgid "Non-admin users are restricted to read-only access, in both GitLab UI and API."
msgstr ""
msgid "None"
@@ -23110,7 +23422,7 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
-msgid "Notes Rate Limits"
+msgid "Notes rate limit"
msgstr ""
msgid "Notes|Are you sure you want to cancel creating this comment?"
@@ -23281,9 +23593,6 @@ msgstr ""
msgid "November"
msgstr ""
-msgid "Novice"
-msgstr ""
-
msgid "Now, personalize your GitLab experience"
msgstr ""
@@ -23452,7 +23761,7 @@ msgstr ""
msgid "OnCallSchedules|For this rotation, on-call will be:"
msgstr ""
-msgid "OnCallSchedules|On-call schedule %{schedule} in Project %{project}"
+msgid "OnCallSchedules|On-call schedule %{obstacle} in Project %{project}"
msgstr ""
msgid "OnCallSchedules|On-call schedules"
@@ -23599,22 +23908,22 @@ msgstr ""
msgid "OnDemandScans|Scanner profile"
msgstr ""
-msgid "OnDemandScans|Select one of the existing profiles"
+msgid "OnDemandScans|Schedule scan"
msgstr ""
-msgid "OnDemandScans|Site profile"
+msgid "OnDemandScans|Select one of the existing profiles"
msgstr ""
-msgid "OnDemandScans|Use existing scanner profile"
+msgid "OnDemandScans|Site profile"
msgstr ""
-msgid "OnDemandScans|Use existing site profile"
+msgid "OnDemandScans|Start time"
msgstr ""
-msgid "OnDemandScans|You can either choose a passive scan or validate the target site in your chosen site profile. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
+msgid "OnDemandScans|Use existing scanner profile"
msgstr ""
-msgid "OnDemandScans|You cannot run an active scan against an unvalidated site."
+msgid "OnDemandScans|Use existing site profile"
msgstr ""
msgid "OnDemandScans|You must create a repository within your project to run an on-demand scan."
@@ -23680,6 +23989,9 @@ msgstr ""
msgid "Only admins can delete project"
msgstr ""
+msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
+msgstr ""
+
msgid "Only include features new to your current subscription tier."
msgstr ""
@@ -23698,6 +24010,12 @@ msgstr ""
msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
+msgid "Only reCAPTCHA v2 is supported:"
+msgstr ""
+
+msgid "Only users from the specified IP address ranges are able to reach this group, including all subgroups, projects, and Git repositories."
+msgstr ""
+
msgid "Only verified users with an email address in any of these domains can be added to the group."
msgstr ""
@@ -23884,9 +24202,6 @@ msgstr ""
msgid "Package Registry"
msgstr ""
-msgid "Package Registry Rate Limits"
-msgstr ""
-
msgid "Package Registry: authenticated API requests"
msgstr ""
@@ -23905,6 +24220,9 @@ msgstr ""
msgid "Package recipe already exists"
msgstr ""
+msgid "Package registry rate limits"
+msgstr ""
+
msgid "Package type"
msgstr ""
@@ -23971,6 +24289,9 @@ msgstr ""
msgid "PackageRegistry|Composer"
msgstr ""
+msgid "PackageRegistry|Composer.json with license: %{license} and version: %{version}"
+msgstr ""
+
msgid "PackageRegistry|Conan"
msgstr ""
@@ -24034,6 +24355,9 @@ msgstr ""
msgid "PackageRegistry|Copy require package include"
msgstr ""
+msgid "PackageRegistry|Copy target SHA"
+msgstr ""
+
msgid "PackageRegistry|Copy yarn command"
msgstr ""
@@ -24100,6 +24424,9 @@ msgstr ""
msgid "PackageRegistry|Install package version"
msgstr ""
+msgid "PackageRegistry|Instance-level"
+msgstr ""
+
msgid "PackageRegistry|Invalid Package: failed metadata extraction"
msgstr ""
@@ -24145,6 +24472,9 @@ msgstr ""
msgid "PackageRegistry|Pip Command"
msgstr ""
+msgid "PackageRegistry|Project-level"
+msgstr ""
+
msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
msgstr ""
@@ -24166,6 +24496,9 @@ msgstr ""
msgid "PackageRegistry|Remove package"
msgstr ""
+msgid "PackageRegistry|Required Python: %{pythonVersion}"
+msgstr ""
+
msgid "PackageRegistry|RubyGems"
msgstr ""
@@ -24208,6 +24541,9 @@ msgstr ""
msgid "PackageRegistry|Source project located at %{link}"
msgstr ""
+msgid "PackageRegistry|Target SHA: %{sha}"
+msgstr ""
+
msgid "PackageRegistry|There are no other versions of this package."
msgstr ""
@@ -24376,6 +24712,18 @@ msgstr ""
msgid "Password was successfully updated. Please sign in again."
msgstr ""
+msgid "PasswordPrompt|Confirm password"
+msgstr ""
+
+msgid "PasswordPrompt|Confirm password to continue"
+msgstr ""
+
+msgid "PasswordPrompt|Password is required"
+msgstr ""
+
+msgid "PasswordPrompt|Please enter your password to confirm"
+msgstr ""
+
msgid "Passwords should be unique and not used for any other sites or services."
msgstr ""
@@ -24403,6 +24751,9 @@ msgstr ""
msgid "Paste project path (i.e. gitlab-org/gitlab)"
msgstr ""
+msgid "Paste this DSN into your Sentry SDK"
+msgstr ""
+
msgid "Paste your public SSH key, which is usually contained in the file '~/.ssh/id_ed25519.pub' or '~/.ssh/id_rsa.pub' and begins with 'ssh-ed25519' or 'ssh-rsa'. Do not paste your private SSH key, as that can compromise your identity."
msgstr ""
@@ -24487,6 +24838,9 @@ msgstr ""
msgid "PerformanceBar|First Contentful Paint"
msgstr ""
+msgid "PerformanceBar|Flamegraph with mode:"
+msgstr ""
+
msgid "PerformanceBar|Frontend resources"
msgstr ""
@@ -24520,6 +24874,15 @@ msgstr ""
msgid "PerformanceBar|Trace"
msgstr ""
+msgid "PerformanceBar|cpu"
+msgstr ""
+
+msgid "PerformanceBar|object"
+msgstr ""
+
+msgid "PerformanceBar|wall"
+msgstr ""
+
msgid "Period in seconds"
msgstr ""
@@ -24748,6 +25111,48 @@ msgstr ""
msgid "PipelineSchedules|Variables"
msgstr ""
+msgid "PipelineSource|API"
+msgstr ""
+
+msgid "PipelineSource|Chat"
+msgstr ""
+
+msgid "PipelineSource|External"
+msgstr ""
+
+msgid "PipelineSource|External Pull Request"
+msgstr ""
+
+msgid "PipelineSource|Merge Request"
+msgstr ""
+
+msgid "PipelineSource|On-Demand DAST Scan"
+msgstr ""
+
+msgid "PipelineSource|On-Demand DAST Validation"
+msgstr ""
+
+msgid "PipelineSource|Parent Pipeline"
+msgstr ""
+
+msgid "PipelineSource|Pipeline"
+msgstr ""
+
+msgid "PipelineSource|Push"
+msgstr ""
+
+msgid "PipelineSource|Schedule"
+msgstr ""
+
+msgid "PipelineSource|Trigger"
+msgstr ""
+
+msgid "PipelineSource|Web"
+msgstr ""
+
+msgid "PipelineSource|Web IDE"
+msgstr ""
+
msgid "PipelineStatusTooltip|Pipeline: %{ciStatus}"
msgstr ""
@@ -25048,46 +25453,7 @@ msgstr ""
msgid "Pipeline|Source"
msgstr ""
-msgid "Pipeline|Source|API"
-msgstr ""
-
-msgid "Pipeline|Source|Chat"
-msgstr ""
-
-msgid "Pipeline|Source|External"
-msgstr ""
-
-msgid "Pipeline|Source|External Pull Request"
-msgstr ""
-
-msgid "Pipeline|Source|Merge Request"
-msgstr ""
-
-msgid "Pipeline|Source|On-Demand DAST Scan"
-msgstr ""
-
-msgid "Pipeline|Source|On-Demand DAST Validation"
-msgstr ""
-
-msgid "Pipeline|Source|Parent Pipeline"
-msgstr ""
-
-msgid "Pipeline|Source|Pipeline"
-msgstr ""
-
-msgid "Pipeline|Source|Push"
-msgstr ""
-
-msgid "Pipeline|Source|Schedule"
-msgstr ""
-
-msgid "Pipeline|Source|Trigger"
-msgstr ""
-
-msgid "Pipeline|Source|Web"
-msgstr ""
-
-msgid "Pipeline|Source|Web IDE"
+msgid "Pipeline|Source|Security Policy"
msgstr ""
msgid "Pipeline|Specify variable values to be used in this run. The values specified in %{linkStart}CI/CD settings%{linkEnd} will be used by default."
@@ -25138,7 +25504,7 @@ msgstr ""
msgid "Pipeline|We are currently unable to fetch pipeline data"
msgstr ""
-msgid "Pipeline|You’re about to stop pipeline %{pipelineId}."
+msgid "Pipeline|You’re about to stop pipeline #%{pipelineId}."
msgstr ""
msgid "Pipeline|for"
@@ -25165,6 +25531,9 @@ msgstr ""
msgid "Plain diff"
msgstr ""
+msgid "Plain-text response to send to clients that hit a rate limit"
+msgstr ""
+
msgid "Plan:"
msgstr ""
@@ -25309,9 +25678,6 @@ msgstr ""
msgid "Please provide attributes to update"
msgstr ""
-msgid "Please provide your username or email address."
-msgstr ""
-
msgid "Please reach out if you have any questions and we'll be happy to assist."
msgstr ""
@@ -25354,9 +25720,6 @@ msgstr ""
msgid "Please set a new password before proceeding."
msgstr ""
-msgid "Please share your feedback about %{featureName} %{linkStart}in this issue%{linkEnd} to help us improve the experience."
-msgstr ""
-
msgid "Please solve the captcha"
msgstr ""
@@ -25534,6 +25897,9 @@ msgstr ""
msgid "Prevent adding new members to project membership within this group"
msgstr ""
+msgid "Prevent auto-stopping"
+msgstr ""
+
msgid "Prevent editing approval rules in projects and merge requests."
msgstr ""
@@ -25546,7 +25912,7 @@ msgstr ""
msgid "Prevent users from changing their profile name"
msgstr ""
-msgid "Prevent users from performing write operations on GitLab while performing maintenance."
+msgid "Prevent users from performing write operations while GitLab maintenance is in progress."
msgstr ""
msgid "Preview"
@@ -25819,6 +26185,9 @@ msgstr ""
msgid "Profiles|Enter your name, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Enter your password to confirm the email change"
+msgstr ""
+
msgid "Profiles|Enter your pronouns to let people know how to refer to you"
msgstr ""
@@ -26053,10 +26422,10 @@ msgstr ""
msgid "Profiles|e.g. My MacBook key"
msgstr ""
-msgid "Profiles|username"
+msgid "Profiles|https://website.com"
msgstr ""
-msgid "Profiles|website.com"
+msgid "Profiles|username"
msgstr ""
msgid "Profiles|your account"
@@ -26299,9 +26668,21 @@ msgstr ""
msgid "ProjectSelect| or group"
msgstr ""
+msgid "ProjectSelect|No matching results"
+msgstr ""
+
msgid "ProjectSelect|Search for project"
msgstr ""
+msgid "ProjectSelect|Search projects"
+msgstr ""
+
+msgid "ProjectSelect|Select a project"
+msgstr ""
+
+msgid "ProjectSelect|There was an error fetching the projects. Please try again."
+msgstr ""
+
msgid "ProjectService|Drone server URL"
msgstr ""
@@ -26389,6 +26770,9 @@ msgstr ""
msgid "ProjectService|Trigger event when a new, unique alert is recorded."
msgstr ""
+msgid "ProjectService|Trigger event when a new, unique vulnerability is recorded. (Note: This feature requires an Ultimate plan.)"
+msgstr ""
+
msgid "ProjectService|Trigger event when a pipeline status changes."
msgstr ""
@@ -26803,9 +27187,15 @@ msgstr ""
msgid "Projects are graded based on the highest severity vulnerability present"
msgstr ""
+msgid "Projects are organized into groups"
+msgstr ""
+
msgid "Projects contributed to"
msgstr ""
+msgid "Projects help you organize your work. They contain your file repository, issues, merge requests, and so much more."
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr ""
@@ -27040,10 +27430,10 @@ msgstr ""
msgid "PrometheusService|Prometheus cluster integration"
msgstr ""
-msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
+msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
msgstr ""
-msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
+msgid "PrometheusService|The ID of the IAP-secured resource."
msgstr ""
msgid "PrometheusService|The Prometheus API base URL."
@@ -27661,6 +28051,9 @@ msgstr ""
msgid "Rate limit"
msgstr ""
+msgid "Rate limits can help reduce request volume (like from crawlers or abusive bots)."
+msgstr ""
+
msgid "Raw blob request rate limit per minute"
msgstr ""
@@ -27673,6 +28066,9 @@ msgstr ""
msgid "Re-authentication required"
msgstr ""
+msgid "Re-import"
+msgstr ""
+
msgid "Re-request review"
msgstr ""
@@ -27694,6 +28090,9 @@ msgstr ""
msgid "Read more about related issues"
msgstr ""
+msgid "Read their documentation."
+msgstr ""
+
msgid "Ready to get started with GitLab? Follow these steps to set up your workspace, plan and commit changes, and deploy your project."
msgstr ""
@@ -27727,6 +28126,9 @@ msgstr ""
msgid "Receive any notifications from GitLab."
msgstr ""
+msgid "Receive notification of abuse reports by email."
+msgstr ""
+
msgid "Receive notifications about your own activity"
msgstr ""
@@ -27871,9 +28273,6 @@ msgstr ""
msgid "Registry setup"
msgstr ""
-msgid "Regulate approvals by authors/committers. Affects all projects."
-msgstr ""
-
msgid "Reindexing Status: %{status} (Slice multiplier: %{multiplier}, Maximum running slices: %{max_slices})"
msgstr ""
@@ -27970,6 +28369,9 @@ msgstr ""
msgid "Release|Something went wrong while saving the release details."
msgstr ""
+msgid "Reload page"
+msgstr ""
+
msgid "Remediations"
msgstr ""
@@ -28252,6 +28654,9 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
+msgid "Repeats"
+msgstr ""
+
msgid "Replace"
msgstr ""
@@ -28618,10 +29023,7 @@ msgstr ""
msgid "Require additional authentication for administrative tasks."
msgstr ""
-msgid "Require all users in this group to setup Two-factor authentication"
-msgstr ""
-
-msgid "Require all users in this group to setup two-factor authentication"
+msgid "Require all users in this group to set up two-factor authentication"
msgstr ""
msgid "Required approvals (%{approvals_given} given)"
@@ -28669,6 +29071,9 @@ msgstr[2] ""
msgid "Requires values to meet regular expression requirements."
msgstr ""
+msgid "Requires you to deploy or set up cloud-hosted Sentry."
+msgstr ""
+
msgid "Requires your primary GitLab email address."
msgstr ""
@@ -28729,9 +29134,6 @@ msgstr ""
msgid "Resolve"
msgstr ""
-msgid "Resolve all threads in new issue"
-msgstr ""
-
msgid "Resolve conflicts"
msgstr ""
@@ -28789,6 +29191,9 @@ msgstr ""
msgid "Response text"
msgstr ""
+msgid "Restart GitLab to apply changes."
+msgstr ""
+
msgid "Restart Terminal"
msgstr ""
@@ -28807,6 +29212,9 @@ msgstr ""
msgid "Restoring the project will prevent the project from being removed on this date and restore people's ability to make changes to it."
msgstr ""
+msgid "Restrict group access by IP address. %{link_start}Learn more%{link_end}."
+msgstr ""
+
msgid "Restrict membership by email domain"
msgstr ""
@@ -29122,6 +29530,9 @@ msgstr ""
msgid "Runners|Runner #%{runner_id}"
msgstr ""
+msgid "Runners|Runner assigned to project."
+msgstr ""
+
msgid "Runners|Runner is offline, last contact was %{runner_contact} ago"
msgstr ""
@@ -29134,6 +29545,9 @@ msgstr ""
msgid "Runners|Runner registration"
msgstr ""
+msgid "Runners|Runner unassigned from project."
+msgstr ""
+
msgid "Runners|Runners"
msgstr ""
@@ -29326,7 +29740,7 @@ msgstr ""
msgid "SastEntryPoints|How do I set up SAST?"
msgstr ""
-msgid "SastEntryPoints|Learn more."
+msgid "SastEntryPoints|Learn more"
msgstr ""
msgid "Satisfied"
@@ -29368,7 +29782,7 @@ msgstr ""
msgid "Save pipeline schedule"
msgstr ""
-msgid "Save space and find images in the container Registry. remove unneeded tags and keep only the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
+msgid "Save storage space by automatically deleting tags from the container registry and keeping the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
msgstr ""
msgid "Saving"
@@ -29542,6 +29956,9 @@ msgstr ""
msgid "Search or filter results…"
msgstr ""
+msgid "Search or jump to..."
+msgstr ""
+
msgid "Search project"
msgstr ""
@@ -29602,16 +30019,16 @@ msgstr ""
msgid "SearchCodeResults|of %{link_to_project}"
msgstr ""
-msgid "SearchResults|Showing %{count} %{scope} for%{term_element}"
+msgid "SearchResults|Showing %{count} %{scope} for %{term_element}"
msgstr ""
-msgid "SearchResults|Showing %{count} %{scope} for%{term_element} in your personal and project snippets"
+msgid "SearchResults|Showing %{count} %{scope} for %{term_element} in your personal and project snippets"
msgstr ""
-msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for%{term_element}"
+msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for %{term_element}"
msgstr ""
-msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for%{term_element} in your personal and project snippets"
+msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for %{term_element} in your personal and project snippets"
msgstr ""
msgid "SearchResults|code result"
@@ -29704,6 +30121,9 @@ msgstr ""
msgid "Secret Detection"
msgstr ""
+msgid "Secret access key"
+msgstr ""
+
msgid "Secret token"
msgstr ""
@@ -29743,9 +30163,6 @@ msgstr ""
msgid "SecurityApprovals|A merge request approval is required when the license compliance report contains a denied license."
msgstr ""
-msgid "SecurityApprovals|Configurable if security scanners are enabled. %{linkStart}Learn more.%{linkEnd}"
-msgstr ""
-
msgid "SecurityApprovals|Coverage-Check"
msgstr ""
@@ -29758,24 +30175,18 @@ msgstr ""
msgid "SecurityApprovals|Learn more about Vulnerability-Check"
msgstr ""
-msgid "SecurityApprovals|License Scanning must be enabled. %{linkStart}Learn more%{linkEnd}."
-msgstr ""
-
msgid "SecurityApprovals|License-Check"
msgstr ""
msgid "SecurityApprovals|Requires approval for Denied licenses. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}More information%{linkEnd}"
+msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "SecurityApprovals|Requires approval for vulnerabilities. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
-msgid "SecurityApprovals|Test coverage must be enabled. %{linkStart}Learn more%{linkEnd}."
-msgstr ""
-
msgid "SecurityApprovals|Vulnerability-Check"
msgstr ""
@@ -29839,6 +30250,12 @@ msgstr ""
msgid "SecurityConfiguration|Immediately begin risk analysis and remediation with application security features. Start with SAST and Secret Detection, available to all plans. Upgrade to Ultimate to get all features, including:"
msgstr ""
+msgid "SecurityConfiguration|Manage corpus"
+msgstr ""
+
+msgid "SecurityConfiguration|Manage corpus files used as mutation sources in coverage fuzzing."
+msgstr ""
+
msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
msgstr ""
@@ -29893,6 +30310,12 @@ msgstr ""
msgid "SecurityOrchestration|Action"
msgstr ""
+msgid "SecurityOrchestration|Actions"
+msgstr ""
+
+msgid "SecurityOrchestration|Add rule"
+msgstr ""
+
msgid "SecurityOrchestration|All policies"
msgstr ""
@@ -29926,9 +30349,6 @@ msgstr ""
msgid "SecurityOrchestration|Network"
msgstr ""
-msgid "SecurityOrchestration|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
-msgstr ""
-
msgid "SecurityOrchestration|New policy"
msgstr ""
@@ -29944,6 +30364,9 @@ msgstr ""
msgid "SecurityOrchestration|Policy editor"
msgstr ""
+msgid "SecurityOrchestration|Policy preview"
+msgstr ""
+
msgid "SecurityOrchestration|Policy status"
msgstr ""
@@ -29953,6 +30376,9 @@ msgstr ""
msgid "SecurityOrchestration|Rule"
msgstr ""
+msgid "SecurityOrchestration|Rules"
+msgstr ""
+
msgid "SecurityOrchestration|Scan Execution"
msgstr ""
@@ -30046,6 +30472,9 @@ msgstr ""
msgid "SecurityReports|Create issue"
msgstr ""
+msgid "SecurityReports|Development vulnerabilities"
+msgstr ""
+
msgid "SecurityReports|Dismiss vulnerability"
msgstr ""
@@ -30061,6 +30490,9 @@ msgstr ""
msgid "SecurityReports|Download results"
msgstr ""
+msgid "SecurityReports|Download scanned URLs"
+msgstr ""
+
msgid "SecurityReports|Download scanned resources"
msgstr ""
@@ -30184,6 +30616,9 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
+msgid "SecurityReports|The Vulnerability Report shows the results of the lastest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "SecurityReports|The security reports below contain one or more vulnerability findings that could not be parsed and were not recorded. Download the artifacts in the job output to investigate. Ensure any security report created conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
msgstr ""
@@ -30325,10 +30760,10 @@ msgstr ""
msgid "Select a repository"
msgstr ""
-msgid "Select a role"
+msgid "Select a repository containing templates for common files."
msgstr ""
-msgid "Select a shared template repository for all projects on this instance."
+msgid "Select a role"
msgstr ""
msgid "Select a template repository"
@@ -30406,6 +30841,9 @@ msgstr ""
msgid "Select project to choose zone"
msgstr ""
+msgid "Select project to create issue"
+msgstr ""
+
msgid "Select projects"
msgstr ""
@@ -30523,6 +30961,9 @@ msgstr ""
msgid "Send emails to help guide new users through the onboarding process."
msgstr ""
+msgid "Send emails to users upon account deactivation."
+msgstr ""
+
msgid "Send message"
msgstr ""
@@ -30541,6 +30982,9 @@ msgstr ""
msgid "Send service data"
msgstr ""
+msgid "Sentry"
+msgstr ""
+
msgid "Sentry API URL"
msgstr ""
@@ -30655,6 +31099,9 @@ msgstr ""
msgid "Service"
msgstr ""
+msgid "Service Accounts keys are required to authorize GitLab to deploy your Google Cloud project."
+msgstr ""
+
msgid "Service Desk"
msgstr ""
@@ -30727,15 +31174,15 @@ msgstr ""
msgid "Set a password on your account to pull or push via %{protocol}."
msgstr ""
-msgid "Set a template repository for projects in this group"
-msgstr ""
-
msgid "Set access permissions for this token."
msgstr ""
msgid "Set an instance-wide domain that will be available to all clusters when installing Knative."
msgstr ""
+msgid "Set any rate limit to %{code_open}0%{code_close} to disable the limit."
+msgstr ""
+
msgid "Set default and restrict visibility levels. Configure import sources and git access protocol."
msgstr ""
@@ -30748,7 +31195,7 @@ msgstr ""
msgid "Set limit to 0 to allow any file size."
msgstr ""
-msgid "Set max session time for web terminal."
+msgid "Set limits for web and API requests."
msgstr ""
msgid "Set milestone"
@@ -30757,15 +31204,18 @@ msgstr ""
msgid "Set new password"
msgstr ""
-msgid "Set notification email for abuse reports."
+msgid "Set parent epic to an epic"
msgstr ""
-msgid "Set parent epic to an epic"
+msgid "Set per-user rate limits for imports and exports of projects and groups."
msgstr ""
msgid "Set projects and maximum size limits, session duration, user options, and check feature availability for namespace plan."
msgstr ""
+msgid "Set rate limits for package registry API requests that supersede the general user and IP rate limits."
+msgstr ""
+
msgid "Set severity"
msgstr ""
@@ -30784,15 +31234,24 @@ msgstr ""
msgid "Set the default branch for this project. All merge requests and commits are made against this branch unless you specify a different one."
msgstr ""
+msgid "Set the default expiration time for job artifacts in all projects. Set to %{code_open}0%{code_close} to never expire artifacts by default. If no unit is written, it defaults to seconds. For example, these are all equivalent: %{code_open}3600%{code_close}, %{code_open}60 minutes%{code_close}, or %{code_open}one hour%{code_close}."
+msgstr ""
+
msgid "Set the due date to %{due_date}."
msgstr ""
msgid "Set the iteration to %{iteration_reference}."
msgstr ""
+msgid "Set the maximum session time for a web terminal."
+msgstr ""
+
msgid "Set the milestone to %{milestone_reference}."
msgstr ""
+msgid "Set the per-user rate limit for notes created by web or API requests."
+msgstr ""
+
msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
msgstr ""
@@ -30994,6 +31453,9 @@ msgstr ""
msgid "Show Pipeline IID"
msgstr ""
+msgid "Show all %{issuable_type}."
+msgstr ""
+
msgid "Show all activity"
msgstr ""
@@ -31045,15 +31507,9 @@ msgstr ""
msgid "Show list"
msgstr ""
-msgid "Show me advanced features"
-msgstr ""
-
msgid "Show me how to add a pipeline"
msgstr ""
-msgid "Show me the basics"
-msgstr ""
-
msgid "Show one file at a time"
msgstr ""
@@ -31096,15 +31552,15 @@ msgstr ""
msgid "Showing %{pageSize} of %{total} %{issuableType}"
msgstr ""
-msgid "Showing %{pageSize} of %{total} issues"
-msgstr ""
-
msgid "Showing all epics"
msgstr ""
msgid "Showing all issues"
msgstr ""
+msgid "Showing data for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
+msgstr ""
+
msgid "Showing data for workflow items created in this date range. Date range cannot exceed %{maxDateRange} days."
msgstr ""
@@ -31144,6 +31600,15 @@ msgstr ""
msgid "Sidebar|Weight"
msgstr ""
+msgid "Sidekiq job compression threshold (bytes)"
+msgstr ""
+
+msgid "Sidekiq job size limit (bytes)"
+msgstr ""
+
+msgid "Sidekiq job size limits"
+msgstr ""
+
msgid "Sign in"
msgstr ""
@@ -31264,6 +31729,9 @@ msgstr ""
msgid "Site profile not found for given parameters"
msgstr ""
+msgid "Sites"
+msgstr ""
+
msgid "Size"
msgstr ""
@@ -31294,19 +31762,22 @@ msgstr ""
msgid "SlackIntegration|Sends notifications about project events to Slack channels."
msgstr ""
-msgid "SlackService|2. Paste the %{strong_open}Token%{strong_close} into the field below"
+msgid "SlackService|1. %{slash_command_link_start}Add a slash command%{slash_command_link_end} in your Slack team using this information:"
msgstr ""
-msgid "SlackService|3. Select the %{strong_open}Active%{strong_close} checkbox, press %{strong_open}Save changes%{strong_close} and start using GitLab inside Slack!"
+msgid "SlackService|2. Paste the token from Slack in the %{strong_open}Token%{strong_close} field below."
msgstr ""
-msgid "SlackService|Fill in the word that works best for your team."
+msgid "SlackService|3. Select the %{strong_open}Active%{strong_close} checkbox, select %{strong_open}Save changes%{strong_close}, and start using slash commands in Slack!"
+msgstr ""
+
+msgid "SlackService|After setup, get a list of available Slack slash commands by entering"
msgstr ""
-msgid "SlackService|See list of available commands in Slack after setting up this service, by entering"
+msgid "SlackService|Fill in the word that works best for your team."
msgstr ""
-msgid "SlackService|This service allows users to perform common operations on this project by entering slash commands in Slack."
+msgid "SlackService|Perform common operations in this project by entering slash commands in Slack."
msgstr ""
msgid "Slice multiplier"
@@ -31372,7 +31843,7 @@ msgstr ""
msgid "Some child epics may be hidden due to applied filters"
msgstr ""
-msgid "Some common domains are not allowed. %{read_more_link}."
+msgid "Some common domains are not allowed. %{learn_more_link}."
msgstr ""
msgid "Some of the designs you tried uploading did not change:"
@@ -31456,9 +31927,6 @@ msgstr ""
msgid "Something went wrong while exporting requirements"
msgstr ""
-msgid "Something went wrong while fetching %{listType} list"
-msgstr ""
-
msgid "Something went wrong while fetching branches"
msgstr ""
@@ -31513,15 +31981,9 @@ msgstr ""
msgid "Something went wrong while merging this merge request. Please try again."
msgstr ""
-msgid "Something went wrong while moving issues."
-msgstr ""
-
msgid "Something went wrong while obtaining the Let's Encrypt certificate."
msgstr ""
-msgid "Something went wrong while performing the action."
-msgstr ""
-
msgid "Something went wrong while promoting the issue to an epic. Please try again."
msgstr ""
@@ -31849,7 +32311,10 @@ msgstr ""
msgid "SourcegraphPreferences|Uses a custom %{linkStart}Sourcegraph instance%{linkEnd}."
msgstr ""
-msgid "Spam Check API Key"
+msgid "Spam Check"
+msgstr ""
+
+msgid "Spam Check API key"
msgstr ""
msgid "Spam Logs"
@@ -31867,7 +32332,7 @@ msgstr ""
msgid "Specified URL cannot be used: \"%{reason}\""
msgstr ""
-msgid "Specify an e-mail address regex pattern to identify default internal users."
+msgid "Specify an email address regex pattern to identify default internal users."
msgstr ""
msgid "Speed up your pipelines with Needs relationships"
@@ -32122,7 +32587,7 @@ msgstr ""
msgid "StatusCheck|An error occurred fetching the status checks."
msgstr ""
-msgid "StatusCheck|Apply this status check to any branch or a specific protected branch."
+msgid "StatusCheck|Apply this status check to all branches or a specific protected branch."
msgstr ""
msgid "StatusCheck|Check for a status response in Merge Requests. Failures do not block merges. %{link_start}Learn more%{link_end}."
@@ -32461,6 +32926,9 @@ msgstr ""
msgid "Subscriptions"
msgstr ""
+msgid "Subscription|Your subscription for %{strong}%{namespace_name}%{strong_close} has expired and you are now on %{pricing_link_start}the GitLab Free tier%{pricing_link_end}. Don't worry, your data is safe. Get in touch with our support team (%{support_email}). They'll gladly help with your subscription renewal."
+msgstr ""
+
msgid "Subtracted"
msgstr ""
@@ -32689,6 +33157,9 @@ msgstr ""
msgid "SuperSonics|Plan"
msgstr ""
+msgid "SuperSonics|Please agree to the Subscription Agreement"
+msgstr ""
+
msgid "SuperSonics|Ready to get started? A GitLab plan is ideal for scaling organizations and for multi team usage."
msgstr ""
@@ -32719,6 +33190,9 @@ msgstr ""
msgid "SuperSonics|The activation code is not valid. Please make sure to copy it exactly from the Customers Portal or confirmation email. Learn more about %{linkStart}activating your subscription%{linkEnd}."
msgstr ""
+msgid "SuperSonics|The activation code should be a 24-character alphanumeric string"
+msgstr ""
+
msgid "SuperSonics|There is a connectivity issue."
msgstr ""
@@ -32761,9 +33235,15 @@ msgstr ""
msgid "SuperSonics|You do not have an active subscription"
msgstr ""
+msgid "SuperSonics|You have successfully added a license that activates on %{date}. Please see the subscription history table below for more details."
+msgstr ""
+
msgid "SuperSonics|You'll be charged for %{trueUpLinkStart}users over license%{trueUpLinkEnd} on a quarterly or annual basis, depending on the terms of your agreement."
msgstr ""
+msgid "SuperSonics|Your future dated license was successfully added"
+msgstr ""
+
msgid "SuperSonics|Your subscription"
msgstr ""
@@ -33016,7 +33496,7 @@ msgstr ""
msgid "Template to append to all Service Desk issues"
msgstr ""
-msgid "TemplateRepository|Select a repository to make its templates available to all projects. %{link_start}What should the repository contain?%{link_end} "
+msgid "TemplateRepository|Create common files more quickly, and standardize their format."
msgstr ""
msgid "Templates"
@@ -33226,7 +33706,7 @@ msgstr ""
msgid "TestCases|Search test cases"
msgstr ""
-msgid "TestCases|Something went wrong while adding test case to Todo."
+msgid "TestCases|Something went wrong while adding test case to a to-do item."
msgstr ""
msgid "TestCases|Something went wrong while creating a test case."
@@ -33238,7 +33718,7 @@ msgstr ""
msgid "TestCases|Something went wrong while fetching test cases list."
msgstr ""
-msgid "TestCases|Something went wrong while marking test case todo as done."
+msgid "TestCases|Something went wrong while marking test case to-do item as done."
msgstr ""
msgid "TestCases|Something went wrong while moving test case."
@@ -33358,7 +33838,7 @@ msgstr ""
msgid "Thanks for your purchase!"
msgstr ""
-msgid "That is ok, I do not want to renew"
+msgid "That's OK, I don't want to renew"
msgstr ""
msgid "That's it, well done!"
@@ -33382,7 +33862,7 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
-msgid "The API key used by GitLab for accessing the Spam Check service endpoint"
+msgid "The API key used by GitLab for accessing the Spam Check service endpoint."
msgstr ""
msgid "The GitLab subscription service (customers.gitlab.com) is currently experiencing an outage. You can monitor the status and get updates at %{linkStart}status.gitlab.com%{linkEnd}."
@@ -33421,9 +33901,6 @@ msgstr ""
msgid "The URL to use for connecting to Elasticsearch. Use a comma-separated list to support clustering (e.g., \"http://localhost:9200, http://localhost:9201\")."
msgstr ""
-msgid "The Vulnerability Report shows the results of the last successful pipeline run on the default branch."
-msgstr ""
-
msgid "The X509 Certificate to use when mutual TLS is required to communicate with the external authorization service. If left blank, the server certificate is still validated when accessing over HTTPS."
msgstr ""
@@ -33481,9 +33958,6 @@ msgstr ""
msgid "The default branch for this project has been changed. Please update your bookmarks."
msgstr ""
-msgid "The default expiration time for job artifacts. 0 for unlimited. The default unit is in seconds, but you can use other units, for example %{code_open}4 mins 2 sec%{code_close}, %{code_open}2h42min%{code_close}."
-msgstr ""
-
msgid "The dependency list details information about the components used within your project."
msgstr ""
@@ -33676,9 +34150,6 @@ msgstr ""
msgid "The merge conflicts for this merge request have already been resolved. Please return to the merge request."
msgstr ""
-msgid "The merge request can now be merged."
-msgstr ""
-
msgid "The metric must be one of %{metrics}."
msgstr ""
@@ -34054,7 +34525,7 @@ msgstr ""
msgid "There was a problem updating the keep latest artifacts setting."
msgstr ""
-msgid "There was an error %{message} todo."
+msgid "There was an error %{message} to-do item."
msgstr ""
msgid "There was an error adding a To Do."
@@ -34093,6 +34564,9 @@ msgstr ""
msgid "There was an error fetching projects"
msgstr ""
+msgid "There was an error fetching search autocomplete suggestions"
+msgstr ""
+
msgid "There was an error fetching stage total counts"
msgstr ""
@@ -34417,6 +34891,9 @@ msgstr ""
msgid "This field is required."
msgstr ""
+msgid "This form is disabled in preview"
+msgstr ""
+
msgid "This group"
msgstr ""
@@ -34438,9 +34915,6 @@ msgstr ""
msgid "This group is linked to a subscription"
msgstr ""
-msgid "This group, including all subgroups, projects and git repositories, will be reachable from only the specified IP address ranges."
-msgstr ""
-
msgid "This group, its subgroups and projects has been scheduled for removal on %{date}."
msgstr ""
@@ -34720,9 +35194,6 @@ msgstr ""
msgid "This user cannot be unlocked manually from GitLab"
msgstr ""
-msgid "This user does not have a pending request"
-msgstr ""
-
msgid "This user has an unconfirmed email address (%{email}). You may force a confirmation."
msgstr ""
@@ -34831,9 +35302,6 @@ msgstr ""
msgid "ThreatMonitoring|Packet Activity"
msgstr ""
-msgid "ThreatMonitoring|Policies"
-msgstr ""
-
msgid "ThreatMonitoring|Requests"
msgstr ""
@@ -34885,6 +35353,12 @@ msgstr ""
msgid "ThreatMonitoring|View documentation"
msgstr ""
+msgid "Threshold in bytes at which to compress Sidekiq job arguments."
+msgstr ""
+
+msgid "Threshold in bytes at which to reject Sidekiq jobs. Set this to 0 to if you don't want to limit Sidekiq jobs."
+msgstr ""
+
msgid "Throughput"
msgstr ""
@@ -34894,6 +35368,9 @@ msgstr ""
msgid "Time"
msgstr ""
+msgid "Time (in hours) that users are allowed to skip forced configuration of two-factor authentication."
+msgstr ""
+
msgid "Time Spent"
msgstr ""
@@ -34960,7 +35437,7 @@ msgstr ""
msgid "TimeTrackingEstimated|Est"
msgstr ""
-msgid "TimeTracking|%{startTag}Spent: %{endTag}%{timeSpentHumanReadable}"
+msgid "TimeTracking|%{spentStart}Spent: %{spentEnd}"
msgstr ""
msgid "TimeTracking|Estimated:"
@@ -35176,6 +35653,9 @@ msgstr ""
msgid "To access this domain create a new DNS record"
msgstr ""
+msgid "To add a custom suffix, set up a Service Desk email address. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "To add an SSH key you need to %{generate_link_start}generate one%{link_end} or use an %{existing_link_start}existing key%{link_end}."
msgstr ""
@@ -35197,13 +35677,16 @@ msgstr ""
msgid "To connect an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To continue using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
+msgstr ""
+
msgid "To continue, you need to select the link in the confirmation email we sent to verify your email address. If you didn't get our email, select %{strongStart}Resend confirmation email.%{strongEnd}"
msgstr ""
msgid "To define internal users, first enable new users set to external"
msgstr ""
-msgid "To enable Registration Features, make sure \"Enable service ping\" is checked."
+msgid "To enable Registration Features, first enable Service Ping."
msgstr ""
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
@@ -35230,7 +35713,7 @@ msgstr ""
msgid "To get started, use the link below to confirm your account."
msgstr ""
-msgid "To help improve GitLab and its user experience, GitLab will periodically collect usage information."
+msgid "To help improve GitLab and its user experience, GitLab periodically collects usage information."
msgstr ""
msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
@@ -35263,7 +35746,7 @@ msgstr ""
msgid "To preserve performance only %{strong_open}%{display_size} of %{real_size}%{strong_close} files are displayed."
msgstr ""
-msgid "To protect this issue's confidentiality, %{forkLink} and set the fork's visibility to private."
+msgid "To protect this issue's confidentiality, %{linkStart}fork this project%{linkEnd} and set the fork's visibility to private."
msgstr ""
msgid "To protect this issue's confidentiality, a private fork of this project was selected."
@@ -35296,12 +35779,15 @@ msgstr ""
msgid "To set up SAML authentication for your group through an identity provider like Azure, Okta, Onelogin, Ping Identity, or your custom SAML 2.0 provider:"
msgstr ""
-msgid "To set up this service:"
+msgid "To set up this integration:"
msgstr ""
msgid "To specify the notification level per project of a group you belong to, you need to visit project page and change notification level there."
msgstr ""
+msgid "To start using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
+msgstr ""
+
msgid "To unsubscribe from this issue, please paste the following link into your browser:"
msgstr ""
@@ -35890,9 +36376,6 @@ msgstr ""
msgid "Unable to fetch branches list, please close the form and try again"
msgstr ""
-msgid "Unable to fetch unscanned projects"
-msgstr ""
-
msgid "Unable to fetch vulnerable projects"
msgstr ""
@@ -35947,6 +36430,15 @@ msgstr ""
msgid "Unable to update this issue at this time."
msgstr ""
+msgid "Unapprove a merge request"
+msgstr ""
+
+msgid "Unapprove the current merge request."
+msgstr ""
+
+msgid "Unapproved the current merge request."
+msgstr ""
+
msgid "Unarchive project"
msgstr ""
@@ -35959,16 +36451,13 @@ msgstr ""
msgid "Unassigned"
msgstr ""
-msgid "Unauthenticated API request rate limit"
-msgstr ""
-
-msgid "Unauthenticated rate limit period in seconds"
+msgid "Unauthenticated API rate limit period in seconds"
msgstr ""
-msgid "Unauthenticated request rate limit"
+msgid "Unauthenticated requests"
msgstr ""
-msgid "Unauthenticated requests"
+msgid "Unauthenticated web rate limit period in seconds"
msgstr ""
msgid "Undo"
@@ -36070,18 +36559,6 @@ msgstr ""
msgid "Unresolved"
msgstr ""
-msgid "UnscannedProjects|15 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|30 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|5 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|60 or more days"
-msgstr ""
-
msgid "Unschedule job"
msgstr ""
@@ -36301,6 +36778,9 @@ msgstr ""
msgid "UsageQuota|%{help_link_start}Shared runners%{help_link_end} are disabled, so there are no limits set on pipeline usage"
msgstr ""
+msgid "UsageQuota|%{linkTitle} help link"
+msgstr ""
+
msgid "UsageQuota|%{percentageLeft} of purchased storage is available"
msgstr ""
@@ -36310,6 +36790,9 @@ msgstr ""
msgid "UsageQuota|Artifacts is a sum of build and pipeline artifacts."
msgstr ""
+msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
+msgstr ""
+
msgid "UsageQuota|Buy additional minutes"
msgstr ""
@@ -36319,9 +36802,21 @@ msgstr ""
msgid "UsageQuota|CI minutes usage by project"
msgstr ""
+msgid "UsageQuota|Code packages and container images."
+msgstr ""
+
msgid "UsageQuota|Current period usage"
msgstr ""
+msgid "UsageQuota|File attachments and smaller design graphics."
+msgstr ""
+
+msgid "UsageQuota|Git repository, managed by the Gitaly service."
+msgstr ""
+
+msgid "UsageQuota|Includes project registry, artifacts, packages, wiki, uploads and other items."
+msgstr ""
+
msgid "UsageQuota|Increase storage temporarily"
msgstr ""
@@ -36340,6 +36835,9 @@ msgstr ""
msgid "UsageQuota|Packages"
msgstr ""
+msgid "UsageQuota|Pipeline artifacts and job artifacts, created with CI/CD."
+msgstr ""
+
msgid "UsageQuota|Pipelines"
msgstr ""
@@ -36358,6 +36856,9 @@ msgstr ""
msgid "UsageQuota|Seats"
msgstr ""
+msgid "UsageQuota|Shared bits of code and text."
+msgstr ""
+
msgid "UsageQuota|Snippets"
msgstr ""
@@ -36367,6 +36868,12 @@ msgstr ""
msgid "UsageQuota|Storage"
msgstr ""
+msgid "UsageQuota|Storage type"
+msgstr ""
+
+msgid "UsageQuota|There is a known issue with Artifact storage where the total could be incorrect for some projects. More details and progress are available in %{warningLinkStart}the epic%{warningLinkEnd}."
+msgstr ""
+
msgid "UsageQuota|This is the total amount of storage used across your projects within this namespace."
msgstr ""
@@ -36406,6 +36913,9 @@ msgstr ""
msgid "UsageQuota|Usage"
msgstr ""
+msgid "UsageQuota|Usage Breakdown"
+msgstr ""
+
msgid "UsageQuota|Usage Quotas"
msgstr ""
@@ -36430,6 +36940,9 @@ msgstr ""
msgid "UsageQuota|Wiki"
msgstr ""
+msgid "UsageQuota|Wiki content."
+msgstr ""
+
msgid "UsageQuota|Wikis"
msgstr ""
@@ -36646,7 +37159,10 @@ msgstr ""
msgid "User Settings"
msgstr ""
-msgid "User and IP Rate Limits"
+msgid "User and IP rate limits"
+msgstr ""
+
+msgid "User does not have a pending request"
msgstr ""
msgid "User identity was successfully created."
@@ -36943,6 +37459,9 @@ msgstr ""
msgid "Users can launch a development environment from a GitLab browser tab when the %{linkStart}Gitpod%{linkEnd} integration is enabled."
msgstr ""
+msgid "Users can reactivate their account by signing in."
+msgstr ""
+
msgid "Users can render diagrams in AsciiDoc, Markdown, reStructuredText, and Textile documents using Kroki."
msgstr ""
@@ -36958,6 +37477,9 @@ msgstr ""
msgid "Users requesting access to"
msgstr ""
+msgid "Users to exclude from the rate limit"
+msgstr ""
+
msgid "Users were successfully added."
msgstr ""
@@ -36979,6 +37501,9 @@ msgstr ""
msgid "UsersSelect|Unassigned"
msgstr ""
+msgid "Uses GitLab as a lightweight alternative to Sentry."
+msgstr ""
+
msgid "Using %{code_start}::%{code_end} denotes a %{link_start}scoped label set%{link_end}"
msgstr ""
@@ -37009,10 +37534,7 @@ msgstr ""
msgid "Value Stream Analytics can help you determine your team’s velocity"
msgstr ""
-msgid "Value Stream Analytics gives an overview of how much time it takes to go from idea to production in your project."
-msgstr ""
-
-msgid "Value may contain a variable reference"
+msgid "Value might contain a variable reference"
msgstr ""
msgid "Value stream"
@@ -37078,10 +37600,10 @@ msgstr ""
msgid "ValueStream|The Default Value Stream cannot be deleted"
msgstr ""
-msgid "Variable"
+msgid "Values that contain the %{codeStart}$%{codeEnd} character can be considered a variable reference and expanded. %{docsLinkStart}Learn more.%{docsLinkEnd}"
msgstr ""
-msgid "Variable references indicated by %{codeStart}$%{codeEnd} may be expanded. If this is not what you want, consider %{docsLinkStart}using a workaround to prevent expansion%{docsLinkEnd}."
+msgid "Variable"
msgstr ""
msgid "Variable will be masked in job logs."
@@ -37489,6 +38011,9 @@ msgstr ""
msgid "Vulnerability|Evidence"
msgstr ""
+msgid "Vulnerability|False positive detected"
+msgstr ""
+
msgid "Vulnerability|File"
msgstr ""
@@ -37531,6 +38056,9 @@ msgstr ""
msgid "Vulnerability|Status"
msgstr ""
+msgid "Vulnerability|The scanner determined this vulnerability to be a false positive. Verify the evaluation before changing its status. %{linkStart}Learn more about false positive detection.%{linkEnd}"
+msgstr ""
+
msgid "Vulnerability|The unmodified response is the original response that had no mutations done to the request"
msgstr ""
@@ -37855,9 +38383,6 @@ msgstr ""
msgid "Welcome to GitLab,%{br_tag}%{name}!"
msgstr ""
-msgid "Welcome to the guided GitLab tour"
-msgstr ""
-
msgid "Welcome, %{name}!"
msgstr ""
@@ -37876,9 +38401,6 @@ msgstr ""
msgid "What are you searching for?"
msgstr ""
-msgid "What describes you best?"
-msgstr ""
-
msgid "What does this command do?"
msgstr ""
@@ -37900,13 +38422,13 @@ msgstr ""
msgid "What is your job title? (optional)"
msgstr ""
-msgid "What will you use this group for?"
+msgid "What templates can I create?"
msgstr ""
-msgid "What's new"
+msgid "What will you use this group for?"
msgstr ""
-msgid "What’s your experience level?"
+msgid "What's new"
msgstr ""
msgid "When a deployment job is successful, skip older deployment jobs that are still pending."
@@ -37918,6 +38440,9 @@ msgstr ""
msgid "When an event in GitLab triggers a webhook, you can use the request details to figure out if something went wrong."
msgstr ""
+msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+msgstr ""
+
msgid "When inactive, an external authentication provider must be used."
msgstr ""
@@ -37942,6 +38467,9 @@ msgstr ""
msgid "When:"
msgstr ""
+msgid "Which API requests are affected?"
+msgstr ""
+
msgid "While it's rare to have no vulnerabilities, it can happen. In any event, we ask that you please double check your settings to make sure you've set up your dashboard correctly."
msgstr ""
@@ -38221,6 +38749,9 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|Work Items"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -38296,6 +38827,9 @@ msgstr ""
msgid "You are already a member of this %{member_source}."
msgstr ""
+msgid "You are already impersonating another user"
+msgstr ""
+
msgid "You are an admin, which means granting access to %{client_name} will allow them to interact with GitLab as an admin as well. Proceed with caution."
msgstr ""
@@ -38398,6 +38932,9 @@ msgstr ""
msgid "You can also use project access tokens with Git to authenticate over HTTP(S). %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "You can always change your URL later"
+msgstr ""
+
msgid "You can always edit this later"
msgstr ""
@@ -38554,10 +39091,10 @@ msgstr ""
msgid "You can’t %{tag_start}edit%{tag_end} files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
-msgid "You could not create a new trigger."
+msgid "You can’t edit files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
-msgid "You didn't renew your subscription for %{strong}%{namespace_name}%{strong_close} so it was downgraded to the free plan."
+msgid "You could not create a new trigger."
msgstr ""
msgid "You do not have any subscriptions yet"
@@ -38725,6 +39262,12 @@ msgstr ""
msgid "You must provide your current password in order to change it."
msgstr ""
+msgid "You must sign in to search for specific projects."
+msgstr ""
+
+msgid "You must sign in to search for specific terms."
+msgstr ""
+
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
@@ -38752,6 +39295,9 @@ msgstr ""
msgid "You need to upload a GitLab project export archive (ending in .gz)."
msgstr ""
+msgid "You need to verify your primary email first before enabling Two-Factor Authentication."
+msgstr ""
+
msgid "You successfully declined the invitation"
msgstr ""
@@ -38860,10 +39406,10 @@ msgstr ""
msgid "Your %{host} account was signed in to from a new location"
msgstr ""
-msgid "Your %{strong}%{plan_name}%{strong_close} subscription for %{strong}%{namespace_name}%{strong_close} will expire on %{strong}%{expires_on}%{strong_close}."
+msgid "Your %{strong}%{plan_name}%{strong_close} subscription expires on %{strong}%{expires_on}%{strong_close}. After that date, you cannot create issues or merge requests, or use many other features."
msgstr ""
-msgid "Your %{strong}%{plan_name}%{strong_close} subscription will expire on %{strong}%{expires_on}%{strong_close}. After that, you will not be able to create issues or merge requests as well as many other features."
+msgid "Your %{strong}%{plan_name}%{strong_close} subscription for %{strong}%{namespace_name}%{strong_close} will expire on %{strong}%{expires_on}%{strong_close}."
msgstr ""
msgid "Your CI/CD configuration syntax is invalid. View Lint tab for more details."
@@ -38887,7 +39433,7 @@ msgstr ""
msgid "Your GPG keys (%{count})"
msgstr ""
-msgid "Your GitLab account has been locked due to an excessive amount of unsuccessful sign in attempts. Your account will automatically unlock in %{duration} or you may click the link below to unlock now."
+msgid "Your GitLab account has been locked due to an excessive number of unsuccessful sign in attempts. You can wait for your account to automatically unlock in %{duration} or you can click the link below to unlock now."
msgstr ""
msgid "Your GitLab account request has been approved!"
@@ -38998,6 +39544,9 @@ msgstr ""
msgid "Your commit email is used for web based operations, such as edits and merges."
msgstr ""
+msgid "Your current password is required to register a two-factor authenticator app."
+msgstr ""
+
msgid "Your dashboard has been copied. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
@@ -39097,6 +39646,9 @@ msgstr ""
msgid "Your project limit is %{limit} projects! Please contact your administrator to increase it"
msgstr ""
+msgid "Your project will be created at:"
+msgstr ""
+
msgid "Your projects"
msgstr ""
@@ -39136,11 +39688,11 @@ msgstr ""
msgid "Your subscription expired!"
msgstr ""
-msgid "Your subscription has been downgraded."
-msgstr ""
-
-msgid "Your subscription will expire in %{remaining_days}."
-msgstr ""
+msgid "Your subscription will expire in %{remaining_days} day."
+msgid_plural "Your subscription will expire in %{remaining_days} days."
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
msgid "Your username is %{username}."
msgstr ""
@@ -39349,6 +39901,9 @@ msgstr ""
msgid "cannot merge"
msgstr ""
+msgid "cannot not be used for user namespace"
+msgstr ""
+
msgid "ciReport|%{degradedNum} degraded"
msgstr ""
@@ -39673,6 +40228,9 @@ msgstr ""
msgid "created %{timeAgo}"
msgstr ""
+msgid "created %{timeAgo} by %{author}"
+msgstr ""
+
msgid "created by"
msgstr ""
@@ -39718,9 +40276,6 @@ msgstr ""
msgid "does not have a supported extension. Only %{extension_list} are supported"
msgstr ""
-msgid "domain is not authorized for sign-up."
-msgstr ""
-
msgid "download it"
msgstr ""
@@ -39739,19 +40294,13 @@ msgstr ""
msgid "email '%{email}' is not a verified email."
msgstr ""
-msgid "email does not match the allowed domain of %{email_domains}"
-msgid_plural "email does not match the allowed domains: %{email_domains}"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-
msgid "enabled"
msgstr ""
msgid "encrypted: needs to be a :required, :optional or :migrating!"
msgstr ""
-msgid "ending with MIME type format is not allowed."
+msgid "ending with a reserved file extension is not allowed."
msgstr ""
msgid "entries cannot be larger than 255 characters"
@@ -39775,6 +40324,9 @@ msgstr ""
msgid "estimateCommand|%{slash_command} overwrites the total estimated time."
msgstr ""
+msgid "example.com"
+msgstr ""
+
msgid "exceeds the limit of %{bytes} bytes"
msgstr ""
@@ -39826,9 +40378,6 @@ msgstr ""
msgid "fork"
msgstr ""
-msgid "fork this project"
-msgstr ""
-
msgid "from"
msgstr ""
@@ -39838,6 +40387,9 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
+msgid "frontmatter"
+msgstr ""
+
msgid "group"
msgstr ""
@@ -39865,6 +40417,9 @@ msgstr ""
msgid "has been completed."
msgstr ""
+msgid "has too deep level of nesting"
+msgstr ""
+
msgid "help"
msgstr ""
@@ -39898,9 +40453,21 @@ msgstr ""
msgid "in"
msgstr ""
+msgid "in Infrastructure :: Kubernetes clusters"
+msgstr ""
+
+msgid "in all GitLab"
+msgstr ""
+
+msgid "in group"
+msgstr ""
+
msgid "in group %{link_to_group}"
msgstr ""
+msgid "in project"
+msgstr ""
+
msgid "in project %{link_to_project}"
msgstr ""
@@ -39943,16 +40510,19 @@ msgstr ""
msgid "is not a valid X509 certificate."
msgstr ""
-msgid "is not allowed since the group is not top-level group."
+msgid "is not allowed for sign-up."
msgstr ""
-msgid "is not allowed. Try again with a different email address, or contact your GitLab admin."
+msgid "is not allowed for this group."
msgstr ""
-msgid "is not allowed. We do not currently support project-level iterations"
+msgid "is not allowed for this project."
msgstr ""
-msgid "is not from an allowed domain."
+msgid "is not allowed since the group is not top-level group."
+msgstr ""
+
+msgid "is not allowed. We do not currently support project-level iterations"
msgstr ""
msgid "is not in the group enforcing Group Managed Account"
@@ -40045,6 +40615,9 @@ msgstr ""
msgid "log in"
msgstr ""
+msgid "managed"
+msgstr ""
+
msgid "manual"
msgstr ""
@@ -40093,6 +40666,9 @@ msgstr ""
msgid "mrWidget| Please restore it or use a different %{missingBranchName} branch"
msgstr ""
+msgid "mrWidget|%{linkStart}Set up now%{linkEnd} to analyze your source code for known security vulnerabilities."
+msgstr ""
+
msgid "mrWidget|%{mergeError}."
msgstr ""
@@ -40174,6 +40750,9 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
+msgid "mrWidget|Create issue to resolve all threads"
+msgstr ""
+
msgid "mrWidget|Delete source branch"
msgstr ""
@@ -40183,12 +40762,18 @@ msgstr ""
msgid "mrWidget|Did not close"
msgstr ""
+msgid "mrWidget|Dismiss"
+msgstr ""
+
msgid "mrWidget|Email patches"
msgstr ""
msgid "mrWidget|Failed to load deployment statistics"
msgstr ""
+msgid "mrWidget|Hide %{widget} details"
+msgstr ""
+
msgid "mrWidget|If the %{missingBranchName} branch exists in your local repository, you can merge this merge request manually using the command line"
msgstr ""
@@ -40285,9 +40870,6 @@ msgstr ""
msgid "mrWidget|Request to merge"
msgstr ""
-msgid "mrWidget|Resolve all threads in new issue"
-msgstr ""
-
msgid "mrWidget|Resolve conflicts"
msgstr ""
@@ -40303,6 +40885,9 @@ msgstr ""
msgid "mrWidget|Revoke approval"
msgstr ""
+msgid "mrWidget|SAST and Secret Detection is not enabled."
+msgstr ""
+
msgid "mrWidget|Set by %{merge_author} to be added to the merge train when the pipeline succeeds"
msgstr ""
@@ -40312,6 +40897,9 @@ msgstr ""
msgid "mrWidget|Set by %{merge_author} to start a merge train when the pipeline succeeds"
msgstr ""
+msgid "mrWidget|Show %{widget} details"
+msgstr ""
+
msgid "mrWidget|The changes were merged into"
msgstr ""
@@ -40324,6 +40912,9 @@ msgstr ""
msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure, or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
msgstr ""
+msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure."
+msgstr ""
+
msgid "mrWidget|The source branch has been deleted"
msgstr ""
@@ -40366,6 +40957,9 @@ msgstr ""
msgid "mrWidget|You can merge after removing denied licenses"
msgstr ""
+msgid "mrWidget|You can only merge once this merge request is approved."
+msgstr ""
+
msgid "mrWidget|Your password"
msgstr ""
@@ -40402,6 +40996,9 @@ msgstr ""
msgid "must be less than the limit of %{tag_limit} tags"
msgstr ""
+msgid "must be set for a project namespace"
+msgstr ""
+
msgid "must be unique by status and elapsed time within a policy"
msgstr ""
@@ -40513,6 +41110,9 @@ msgstr ""
msgid "pipeline"
msgstr ""
+msgid "pipeline schedules documentation"
+msgstr ""
+
msgid "pod_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
msgstr ""
@@ -40564,16 +41164,25 @@ msgstr ""
msgid "project name"
msgstr ""
+msgid "project namespace cannot be the parent of another namespace"
+msgstr ""
+
msgid "projects"
msgstr ""
msgid "quick actions"
msgstr ""
-msgid "reCAPTCHA Private Key"
+msgid "reCAPTCHA"
+msgstr ""
+
+msgid "reCAPTCHA helps prevent credential stuffing."
msgstr ""
-msgid "reCAPTCHA Site Key"
+msgid "reCAPTCHA private key"
+msgstr ""
+
+msgid "reCAPTCHA site key"
msgstr ""
msgid "recent activity"
@@ -40801,6 +41410,9 @@ msgstr ""
msgid "user avatar"
msgstr ""
+msgid "user namespace cannot be the parent of another namespace"
+msgstr ""
+
msgid "user preferences"
msgstr ""
@@ -40894,3 +41506,9 @@ msgstr ""
msgid "your settings"
msgstr ""
+msgid "{group}"
+msgstr ""
+
+msgid "{project}"
+msgstr ""
+
diff --git a/locale/sr_SP/gitlab.po b/locale/sr_SP/gitlab.po
index 677bd00bc92..10ffb180094 100644
--- a/locale/sr_SP/gitlab.po
+++ b/locale/sr_SP/gitlab.po
@@ -14,10 +14,7 @@ msgstr ""
"X-Crowdin-Language: sr\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-09-01 22:34\n"
-
-msgid " %{name}, confirm your email address now! "
-msgstr ""
+"PO-Revision-Date: 2021-10-04 20:24\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -94,6 +91,18 @@ msgstr ""
msgid "#general, #development"
msgstr ""
+msgid "%d Alert"
+msgid_plural "%d Alerts"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+msgid "%d Alert:"
+msgid_plural "%d Alerts:"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
msgid "%d Approval"
msgid_plural "%d Approvals"
msgstr[0] ""
@@ -523,7 +532,10 @@ msgstr ""
msgid "%{code_open}Protected:%{code_close} Only exposed to protected branches or tags."
msgstr ""
-msgid "%{commit_author_link} authored %{commit_timeago}"
+msgid "%{commit_author_link} authored %{commit_authored_timeago}"
+msgstr ""
+
+msgid "%{commit_author_link} authored %{commit_authored_timeago} and %{commit_committer_avatar} %{commit_committer_link} committed %{commit_committer_timeago}"
msgstr ""
msgid "%{completedCount} completed weight"
@@ -622,6 +634,15 @@ msgstr ""
msgid "%{doc_link_start}Advanced search%{doc_link_end} is enabled."
msgstr ""
+msgid "%{docs_link_start}Learn about visibility levels.%{docs_link_end}"
+msgstr ""
+
+msgid "%{docs_link_start}What is Large File Storage?%{docs_link_end}"
+msgstr ""
+
+msgid "%{docs_link_start}What is two-factor authentication?%{docs_link_end}"
+msgstr ""
+
msgid "%{due_date} (Past due)"
msgstr ""
@@ -694,9 +715,6 @@ msgstr ""
msgid "%{issueType} actions"
msgstr ""
-msgid "%{issuesCount} issues with a limit of %{maxIssueCount}"
-msgstr ""
-
msgid "%{issuesSize} with a limit of %{maxIssueCount}"
msgstr ""
@@ -754,6 +772,12 @@ msgstr ""
msgid "%{label_for_message} unavailable"
msgstr ""
+msgid "%{learn_more_link}."
+msgstr ""
+
+msgid "%{lessThan} 1 hour"
+msgstr ""
+
msgid "%{lets_encrypt_link_start}Let's Encrypt%{lets_encrypt_link_end} is a free, automated, and open certificate authority (CA) that issues digital certificates to enable HTTPS (SSL/TLS) for sites."
msgstr ""
@@ -766,15 +790,15 @@ msgstr ""
msgid "%{link_start}Learn more%{link_end} about roles."
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
-msgstr ""
-
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
msgstr ""
msgid "%{link_start}Start the title with %{draft_snippet}%{link_end} to prevent a merge request that is a work in progress from being merged before it's ready."
msgstr ""
+msgid "%{link_start}What information does GitLab Inc. collect?%{link_end}"
+msgstr ""
+
msgid "%{listToShow}, and %{awardsListLength} more"
msgstr ""
@@ -931,7 +955,7 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
-msgid "%{service_ping_link_start}Learn more%{service_ping_link_end} about what information is shared with GitLab Inc."
+msgid "%{service_ping_link_start}What information is shared with GitLab Inc.?%{service_ping_link_end}"
msgstr ""
msgid "%{size} %{unit}"
@@ -967,6 +991,9 @@ msgstr ""
msgid "%{state} epics"
msgstr ""
+msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
+msgstr ""
+
msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
msgstr ""
@@ -1033,12 +1060,6 @@ msgstr ""
msgid "%{template_project_id} is unknown or invalid"
msgstr ""
-msgid "%{text} %{files}"
-msgid_plural "%{text} %{files} files"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-
msgid "%{text} is available"
msgstr ""
@@ -1123,9 +1144,6 @@ msgstr ""
msgid "%{wildcards_link_start}Wildcards%{wildcards_link_end} such as %{code_tag_start}v*%{code_tag_end} or %{code_tag_start}*-release%{code_tag_end} are supported."
msgstr ""
-msgid "&lt; 1 hour"
-msgstr ""
-
msgid "'%{data}' at %{location} does not match format: %{format}"
msgstr ""
@@ -1210,9 +1228,6 @@ msgstr ""
msgid "(we need your current password to confirm your changes)"
msgstr ""
-msgid "* * * * *"
-msgstr ""
-
msgid "+ %{amount} more"
msgstr ""
@@ -1282,10 +1297,10 @@ msgstr ""
msgid "."
msgstr ""
-msgid "0 bytes"
+msgid "/"
msgstr ""
-msgid "0 for unlimited, only effective with remote storage enabled."
+msgid "0 bytes"
msgstr ""
msgid "0t1DgySidms"
@@ -1438,6 +1453,9 @@ msgstr ""
msgid "1000+"
msgstr ""
+msgid "192.168.0.0/24"
+msgstr ""
+
msgid "1st contribution!"
msgstr ""
@@ -1591,9 +1609,6 @@ msgstr ""
msgid "A plain HTML site that uses Netlify for CI/CD instead of GitLab, but still with all the other great GitLab features"
msgstr ""
-msgid "A plain-text response to show to clients that hit the rate limit."
-msgstr ""
-
msgid "A platform value can be web, mob or app."
msgstr ""
@@ -1675,7 +1690,7 @@ msgstr ""
msgid "APIFuzzing|Configure HTTP basic authentication values. Other authentication methods are supported. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
+msgid "APIFuzzing|Customize your project's API fuzzing configuration options and copy the code snippet to your .gitlab-ci.yml file to apply any changes. Note that this tool does not reflect or update your .gitlab-ci.yml file automatically. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
msgstr ""
msgid "APIFuzzing|Enable authentication"
@@ -1738,9 +1753,6 @@ msgstr ""
msgid "APIFuzzing|To prevent a security leak, authentication info must be added as a %{ciVariablesLinkStart}CI variable%{ciVariablesLinkEnd}. As a user with maintainer access rights, you can manage CI variables in the %{ciSettingsLinkStart}Settings%{ciSettingsLinkEnd} area."
msgstr ""
-msgid "APIFuzzing|Use this tool to generate API fuzzing configuration YAML to copy into your .gitlab-ci.yml file. This tool does not reflect or update your .gitlab-ci.yml file automatically."
-msgstr ""
-
msgid "APIFuzzing|Username for basic authentication"
msgstr ""
@@ -1792,9 +1804,6 @@ msgstr ""
msgid "Abuse reports notification email"
msgstr ""
-msgid "Abuse reports will be sent to this address if it is set. Abuse reports are always available in the admin area."
-msgstr ""
-
msgid "Accept invitation"
msgstr ""
@@ -1831,12 +1840,18 @@ msgstr ""
msgid "Access granted"
msgstr ""
+msgid "Access key ID"
+msgstr ""
+
msgid "Access requests"
msgstr ""
msgid "Access to '%{classification_label}' not allowed"
msgstr ""
+msgid "Access tokens expire after 2 hours. A refresh token may be used at any time to generate a new access token. Non-expiring access tokens are deprecated. Clear this setting to enable backward compatibility."
+msgstr ""
+
msgid "AccessDropdown|Deploy Keys"
msgstr ""
@@ -2149,6 +2164,9 @@ msgstr ""
msgid "Add new directory"
msgstr ""
+msgid "Add new service account"
+msgstr ""
+
msgid "Add or remove previously merged commits"
msgstr ""
@@ -2386,6 +2404,9 @@ msgstr ""
msgid "AdminArea|Features"
msgstr ""
+msgid "AdminArea|Get security updates from GitLab and stay up to date"
+msgstr ""
+
msgid "AdminArea|Groups"
msgstr ""
@@ -2425,6 +2446,12 @@ msgstr ""
msgid "AdminArea|Reporter"
msgstr ""
+msgid "AdminArea|Sign up for the GitLab Security Newsletter to get notified for security updates."
+msgstr ""
+
+msgid "AdminArea|Sign up for the GitLab newsletter"
+msgstr ""
+
msgid "AdminArea|Stop all jobs"
msgstr ""
@@ -2494,9 +2521,15 @@ msgstr ""
msgid "AdminSettings|Disable public access to Pages sites"
msgstr ""
+msgid "AdminSettings|Display a banner on merge requests in projects with no pipelines to initiate steps to add a .gitlab-ci.yml file."
+msgstr ""
+
msgid "AdminSettings|Domain verification is an essential security measure for public GitLab sites. Users are required to demonstrate they control a domain before it is enabled. %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "AdminSettings|Enable pipeline suggestion banner"
+msgstr ""
+
msgid "AdminSettings|Enable shared runners for new projects"
msgstr ""
@@ -2968,10 +3001,10 @@ msgstr ""
msgid "Admin|Quarterly reconciliation will occur on %{qrtlyDate}"
msgstr ""
-msgid "Admin|The number of max seats used for your namespace is currently exceeding the number of seats in your subscription. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgid "Admin|The number of max seats in your namespace exceeds the number of seats in your subscription. On %{qrtlyDate}, quarterly reconciliation occurs and you are automatically billed a prorated amount for the overage. No action is needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice. For more information about the timing of the invoicing process, view the documentation."
msgstr ""
-msgid "Admin|The number of maximum users for your instance is currently exceeding the number of users in license. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgid "Admin|The number of max users in your instance exceeds the number of users in your license. On %{qrtlyDate}, quarterly reconciliation occurs and you are automatically billed a prorated amount for the overage. No action is needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice. For more information about the timing of the invoicing process, view the documentation."
msgstr ""
msgid "Admin|View pending user approvals"
@@ -2992,9 +3025,6 @@ msgstr ""
msgid "Advanced export options"
msgstr ""
-msgid "Advanced permissions, Large File Storage and Two-Factor authentication settings."
-msgstr ""
-
msgid "After a successful password update you will be redirected to login screen."
msgstr ""
@@ -3013,14 +3043,14 @@ msgstr ""
msgid "After you've reviewed these contribution guidelines, you'll be all set to"
msgstr ""
+msgid "Akismet"
+msgstr ""
+
msgid "Akismet API Key"
msgstr ""
-msgid "Alert"
-msgid_plural "Alerts"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgid "Akismet helps prevent the creation of spam issues in public projects."
+msgstr ""
msgid "AlertManagement|Acknowledged"
msgstr ""
@@ -3376,6 +3406,9 @@ msgstr ""
msgid "All (default)"
msgstr ""
+msgid "All GitLab"
+msgstr ""
+
msgid "All Members"
msgstr ""
@@ -3490,6 +3523,9 @@ msgstr ""
msgid "Allow this secondary node to replicate content on Object Storage"
msgstr ""
+msgid "Allow use of licensed EE features"
+msgstr ""
+
msgid "Allow users to dismiss the broadcast message"
msgstr ""
@@ -3565,9 +3601,6 @@ msgstr ""
msgid "Amazon authentication is not %{link_start}correctly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
-msgid "Amount of time (in hours) that users are allowed to skip forced configuration of two-factor authentication"
-msgstr ""
-
msgid "An %{link_start}alert%{link_end} with the same fingerprint is already open. To change the status of this alert, resolve the linked alert."
msgstr ""
@@ -3628,12 +3661,6 @@ msgstr ""
msgid "An error occurred when removing the label."
msgstr ""
-msgid "An error occurred when toggling the notification subscription"
-msgstr ""
-
-msgid "An error occurred when updating the issue weight"
-msgstr ""
-
msgid "An error occurred when updating the title"
msgstr ""
@@ -3682,6 +3709,9 @@ msgstr ""
msgid "An error occurred while enabling Service Desk."
msgstr ""
+msgid "An error occurred while fetching Markdown preview"
+msgstr ""
+
msgid "An error occurred while fetching ancestors"
msgstr ""
@@ -3712,9 +3742,6 @@ msgstr ""
msgid "An error occurred while fetching label colors."
msgstr ""
-msgid "An error occurred while fetching markdown preview"
-msgstr ""
-
msgid "An error occurred while fetching participants"
msgstr ""
@@ -3730,9 +3757,6 @@ msgstr ""
msgid "An error occurred while fetching reference"
msgstr ""
-msgid "An error occurred while fetching sidebar data"
-msgstr ""
-
msgid "An error occurred while fetching tags. Retry the search."
msgstr ""
@@ -3808,6 +3832,9 @@ msgstr ""
msgid "An error occurred while loading merge requests."
msgstr ""
+msgid "An error occurred while loading projects."
+msgstr ""
+
msgid "An error occurred while loading the Needs tab."
msgstr ""
@@ -4042,12 +4069,6 @@ msgstr ""
msgid "Any Milestone"
msgstr ""
-msgid "Any branch"
-msgstr ""
-
-msgid "Any eligible user"
-msgstr ""
-
msgid "Any encrypted tokens"
msgstr ""
@@ -4066,6 +4087,9 @@ msgstr ""
msgid "Any namespace"
msgstr ""
+msgid "App Engine description and apps that are suitable for this deployment target"
+msgstr ""
+
msgid "App ID"
msgstr ""
@@ -4216,6 +4240,12 @@ msgstr ""
msgid "Apply"
msgstr ""
+msgid "Apply %d suggestion"
+msgid_plural "Apply %d suggestions"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
msgid "Apply a label"
msgstr ""
@@ -4225,13 +4255,10 @@ msgstr ""
msgid "Apply suggestion"
msgstr ""
-msgid "Apply suggestions"
-msgstr ""
-
msgid "Apply template"
msgstr ""
-msgid "Apply this approval rule to any branch or a specific protected branch."
+msgid "Apply this approval rule to all branches or a specific protected branch."
msgstr ""
msgid "Applying"
@@ -4378,9 +4405,6 @@ msgstr ""
msgid "ApprovalSettings|Prevent editing approval rules in projects and merge requests."
msgstr ""
-msgid "ApprovalSettings|Prevent editing approval rules in projects and merge requests. "
-msgstr ""
-
msgid "ApprovalSettings|Remove all approvals when commits are added to the source branch."
msgstr ""
@@ -4396,6 +4420,9 @@ msgstr ""
msgid "ApprovalSettings|This setting is configured at the instance level and can only be changed by an administrator."
msgstr ""
+msgid "ApprovalSettings|This setting is configured in %{groupName} and can only be changed by an administrator or group owner."
+msgstr ""
+
msgid "ApprovalStatusTooltip|Adheres to separation of duties"
msgstr ""
@@ -4885,9 +4912,6 @@ msgstr ""
msgid "Authenticated API rate limit period in seconds"
msgstr ""
-msgid "Authenticated API request rate limit"
-msgstr ""
-
msgid "Authenticated API requests"
msgstr ""
@@ -4897,10 +4921,10 @@ msgstr ""
msgid "Authenticated Git LFS request rate limit"
msgstr ""
-msgid "Authenticated web rate limit period in seconds"
+msgid "Authenticated Git LFS requests"
msgstr ""
-msgid "Authenticated web request rate limit"
+msgid "Authenticated web rate limit period in seconds"
msgstr ""
msgid "Authenticated web requests"
@@ -5278,9 +5302,6 @@ msgstr ""
msgid "Below you will find all the groups that are public."
msgstr ""
-msgid "Beta"
-msgstr ""
-
msgid "Bi-weekly code coverage"
msgstr ""
@@ -5521,6 +5542,21 @@ msgstr ""
msgid "Board scope affects which issues are displayed for anyone who visits this board"
msgstr ""
+msgid "BoardNewEpic|Groups"
+msgstr ""
+
+msgid "BoardNewEpic|Loading groups"
+msgstr ""
+
+msgid "BoardNewEpic|No matching results"
+msgstr ""
+
+msgid "BoardNewEpic|Search groups"
+msgstr ""
+
+msgid "BoardNewEpic|Select a group"
+msgstr ""
+
msgid "BoardNewIssue|No matching results"
msgstr ""
@@ -5599,6 +5635,9 @@ msgstr ""
msgid "Boards|An error occurred while creating the list. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching child groups. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching group projects. Please try again."
msgstr ""
@@ -5932,6 +5971,9 @@ msgstr ""
msgid "Bulk update"
msgstr ""
+msgid "BulkImports|Re-import creates a new group. It does not sync with the existing group."
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -5941,6 +5983,9 @@ msgstr ""
msgid "BulkImport|From source group"
msgstr ""
+msgid "BulkImport|Group import history"
+msgstr ""
+
msgid "BulkImport|Import failed: Destination cannot be a subgroup of the source group. Change the destination and try again."
msgstr ""
@@ -5953,9 +5998,18 @@ msgstr ""
msgid "BulkImport|Importing the group failed"
msgstr ""
+msgid "BulkImport|Last imported to %{link}"
+msgstr ""
+
msgid "BulkImport|Name already exists."
msgstr ""
+msgid "BulkImport|New group"
+msgstr ""
+
+msgid "BulkImport|No history is available"
+msgstr ""
+
msgid "BulkImport|No parent"
msgstr ""
@@ -5968,6 +6022,9 @@ msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} matching filter \"%{filter}\" from %{link}"
msgstr ""
+msgid "BulkImport|Source group"
+msgstr ""
+
msgid "BulkImport|To new group"
msgstr ""
@@ -5977,6 +6034,9 @@ msgstr ""
msgid "BulkImport|You have no groups to import"
msgstr ""
+msgid "BulkImport|Your imported groups will appear here."
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -6220,6 +6280,9 @@ msgstr ""
msgid "Can be manually deployed to"
msgstr ""
+msgid "Can be overridden in each project."
+msgstr ""
+
msgid "Can create groups:"
msgstr ""
@@ -6322,6 +6385,9 @@ msgstr ""
msgid "Cancelling Preview"
msgstr ""
+msgid "Cannot assign a confidential epic to a non-confidential issue. Make the issue confidential and try again"
+msgstr ""
+
msgid "Cannot be assigned to other projects."
msgstr ""
@@ -6373,9 +6439,6 @@ msgstr ""
msgid "Cannot refer to a group %{timebox_type} by an internal id!"
msgstr ""
-msgid "Cannot set confidential epic for a non-confidential issue"
-msgstr ""
-
msgid "Cannot show preview. For previews on sketch files, they must have the file format introduced by Sketch version 43 and above."
msgstr ""
@@ -6613,15 +6676,15 @@ msgstr ""
msgid "Check out, review, and merge locally"
msgstr ""
-msgid "Check the %{docs_link_start}documentation%{docs_link_end}."
-msgstr ""
-
msgid "Check the current instance configuration "
msgstr ""
msgid "Check the elasticsearch.log file to debug why the migration was halted and make any changes before retrying the migration. When you fix the cause of the failure, click \"Retry migration\", and the migration will be scheduled to be retried in the background."
msgstr ""
+msgid "Check with your administrator."
+msgstr ""
+
msgid "Check your Docker images for known vulnerabilities."
msgstr ""
@@ -6652,6 +6715,9 @@ msgstr ""
msgid "Checkout"
msgstr ""
+msgid "Checkout|$%{selectedPlanPrice} per 10 GB storage per pack"
+msgstr ""
+
msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 minutes"
msgstr ""
@@ -6673,18 +6739,24 @@ msgstr ""
msgid "Checkout|%{name}'s GitLab subscription"
msgstr ""
-msgid "Checkout|%{selectedPlanText} plan"
+msgid "Checkout|%{name}'s storage subscription"
msgstr ""
-msgid "Checkout|%{startDate} - %{endDate}"
+msgid "Checkout|%{quantity} GB of storage"
msgstr ""
-msgid "Checkout|%{totalCiMinutes} CI minute"
-msgid_plural "Checkout|%{totalCiMinutes} CI minutes"
+msgid "Checkout|%{quantity} storage pack"
+msgid_plural "Checkout|%{quantity} storage packs"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
+msgid "Checkout|%{selectedPlanText} plan"
+msgstr ""
+
+msgid "Checkout|%{startDate} - %{endDate}"
+msgstr ""
+
msgid "Checkout|%{totalCiMinutes} CI minutes"
msgstr ""
@@ -6760,6 +6832,9 @@ msgstr ""
msgid "Checkout|Failed to register credit card. Please try again."
msgstr ""
+msgid "Checkout|GB"
+msgstr ""
+
msgid "Checkout|GitLab group"
msgstr ""
@@ -6796,6 +6871,9 @@ msgstr ""
msgid "Checkout|State"
msgstr ""
+msgid "Checkout|Storage packs"
+msgstr ""
+
msgid "Checkout|Street address"
msgstr ""
@@ -6817,6 +6895,9 @@ msgstr ""
msgid "Checkout|Total minutes: %{quantity}"
msgstr ""
+msgid "Checkout|Total storage: %{quantity} GB"
+msgstr ""
+
msgid "Checkout|Users"
msgstr ""
@@ -6826,16 +6907,25 @@ msgstr ""
msgid "Checkout|Your organization"
msgstr ""
+msgid "Checkout|Your storage subscription has the same term as your main subscription, and the price is prorated accordingly."
+msgstr ""
+
msgid "Checkout|Your subscription will be applied to this group"
msgstr ""
msgid "Checkout|Zip code"
msgstr ""
+msgid "Checkout|a storage subscription"
+msgstr ""
+
msgid "Checkout|company or team"
msgstr ""
-msgid "Checkout|x 1,000 minutes per pack = %{strong}"
+msgid "Checkout|minutes"
+msgstr ""
+
+msgid "Checkout|x %{quantity} %{units} per pack ="
msgstr ""
msgid "Cherry-pick this commit"
@@ -7192,6 +7282,9 @@ msgstr ""
msgid "CloneIssue|Cannot clone issue to target project as it is pending deletion."
msgstr ""
+msgid "CloneIssue|Cannot clone issues of '%{issue_type}' type."
+msgstr ""
+
msgid "Cloned this issue to %{path_to_project}."
msgstr ""
@@ -7246,7 +7339,10 @@ msgstr ""
msgid "Closes this %{quick_action_target}."
msgstr ""
-msgid "Cloud licenses can not be removed."
+msgid "Cloud Functions description and apps that are suitable for this deployment target"
+msgstr ""
+
+msgid "Cloud Run description and apps that are suitable for this deployment target"
msgstr ""
msgid "Cluster"
@@ -7273,6 +7369,12 @@ msgstr ""
msgid "ClusterAgents|Access tokens"
msgstr ""
+msgid "ClusterAgents|Agent might not be connected to GitLab"
+msgstr ""
+
+msgid "ClusterAgents|Agent never connected to GitLab"
+msgstr ""
+
msgid "ClusterAgents|Alternative installation methods"
msgstr ""
@@ -7288,6 +7390,12 @@ msgstr ""
msgid "ClusterAgents|Configuration"
msgstr ""
+msgid "ClusterAgents|Connected"
+msgstr ""
+
+msgid "ClusterAgents|Connection status"
+msgstr ""
+
msgid "ClusterAgents|Copy token"
msgstr ""
@@ -7306,6 +7414,9 @@ msgstr ""
msgid "ClusterAgents|For alternative installation methods %{linkStart}go to the documentation%{linkEnd}."
msgstr ""
+msgid "ClusterAgents|For more troubleshooting information go to"
+msgstr ""
+
msgid "ClusterAgents|Go to the repository"
msgstr ""
@@ -7321,18 +7432,30 @@ msgstr ""
msgid "ClusterAgents|Integrate with the GitLab Agent"
msgstr ""
-msgid "ClusterAgents|Last used"
+msgid "ClusterAgents|Last connected %{timeAgo}."
+msgstr ""
+
+msgid "ClusterAgents|Last contact"
msgstr ""
msgid "ClusterAgents|Learn how to create an agent access token"
msgstr ""
+msgid "ClusterAgents|Make sure you are using a valid token."
+msgstr ""
+
msgid "ClusterAgents|Name"
msgstr ""
msgid "ClusterAgents|Never"
msgstr ""
+msgid "ClusterAgents|Never connected"
+msgstr ""
+
+msgid "ClusterAgents|Not connected"
+msgstr ""
+
msgid "ClusterAgents|Read more about getting started"
msgstr ""
@@ -7354,6 +7477,9 @@ msgstr ""
msgid "ClusterAgents|Select which Agent you want to install"
msgstr ""
+msgid "ClusterAgents|The Agent has not been connected in a long time. There might be a connectivity issue. Last contact was %{timeAgo}."
+msgstr ""
+
msgid "ClusterAgents|The GitLab Agent also requires %{linkStart}enabling the Agent Server%{linkEnd}"
msgstr ""
@@ -7381,9 +7507,6 @@ msgstr ""
msgid "ClusterAgents|You will need to create a token to connect to your agent"
msgstr ""
-msgid "ClusterAgent|This feature is only available for premium plans"
-msgstr ""
-
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -7573,9 +7696,6 @@ msgstr ""
msgid "ClusterIntegration|Create Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Create a provision role on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the account and external ID above. %{startMoreInfoLink}More information%{endLink}"
-msgstr ""
-
msgid "ClusterIntegration|Create cluster on"
msgstr ""
@@ -8008,7 +8128,7 @@ msgstr ""
msgid "ClusterIntegration|Subnets"
msgstr ""
-msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provisioned role, first create one on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the above account and external IDs. %{startMoreInfoLink}More information%{endLink}"
+msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provisioned role, first create one on %{awsLinkStart}Amazon Web Services %{awsLinkEnd} using the above account and external IDs. %{moreInfoStart}More information%{moreInfoEnd}"
msgstr ""
msgid "ClusterIntegration|The Kubernetes certificate used to authenticate to the cluster."
@@ -8242,6 +8362,9 @@ msgstr ""
msgid "Collapse replies"
msgstr ""
+msgid "Collapse settings section"
+msgstr ""
+
msgid "Collapse sidebar"
msgstr ""
@@ -8260,6 +8383,9 @@ msgstr ""
msgid "Comma-separated list of email addresses."
msgstr ""
+msgid "Comma-separated list of users allowed to exceed the rate limit."
+msgstr ""
+
msgid "Comma-separated, e.g. '1.1.1.1, 2.2.2.0/24'"
msgstr ""
@@ -8581,6 +8707,9 @@ msgstr ""
msgid "Configure %{repository_checks_link_start}repository checks%{link_end} and %{housekeeping_link_start}housekeeping%{link_end} on repositories."
msgstr ""
+msgid "Configure CAPTCHAs, IP address limits, and other anti-spam measures."
+msgstr ""
+
msgid "Configure Dependency Scanning in `.gitlab-ci.yml` using the GitLab managed template. You can [add variable overrides](https://docs.gitlab.com/ee/user/application_security/dependency_scanning/#customizing-the-dependency-scanning-settings) to customize Dependency Scanning settings."
msgstr ""
@@ -8617,16 +8746,13 @@ msgstr ""
msgid "Configure a %{codeStart}.gitlab-webide.yml%{codeEnd} file in the %{codeStart}.gitlab%{codeEnd} directory to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
msgstr ""
-msgid "Configure existing installation"
-msgstr ""
-
-msgid "Configure limit for notes created per minute by web and API requests."
+msgid "Configure advanced permissions, Large File Storage, and two-factor authentication settings."
msgstr ""
-msgid "Configure limits for Project/Group Import/Export."
+msgid "Configure approvals by authors and committers on all projects."
msgstr ""
-msgid "Configure limits for web and API requests."
+msgid "Configure existing installation"
msgstr ""
msgid "Configure paths to be protected by Rack Attack."
@@ -8641,10 +8767,13 @@ msgstr ""
msgid "Configure settings for Advanced Search with Elasticsearch."
msgstr ""
+msgid "Configure specific limits for Files API requests that supersede the general user and IP rate limits."
+msgstr ""
+
msgid "Configure specific limits for Git LFS requests that supersede the general user and IP rate limits."
msgstr ""
-msgid "Configure specific limits for Packages API requests that supersede the general user and IP rate limits."
+msgid "Configure specific limits for deprecated API requests that supersede the general user and IP rate limits."
msgstr ""
msgid "Configure the %{link} integration."
@@ -8656,6 +8785,9 @@ msgstr ""
msgid "Configure the way a user creates a new account."
msgstr ""
+msgid "Configure via Merge Request"
+msgstr ""
+
msgid "Configure which lists are shown for anyone who visits this board"
msgstr ""
@@ -9127,6 +9259,9 @@ msgstr ""
msgid "Content parsed with %{link}."
msgstr ""
+msgid "ContentEditor|Table of Contents"
+msgstr ""
+
msgid "ContentEditor|You have to provide a renderMarkdown function or a custom serializer"
msgstr ""
@@ -9313,6 +9448,9 @@ msgstr ""
msgid "Copy link to chart"
msgstr ""
+msgid "Copy prefix"
+msgstr ""
+
msgid "Copy reference"
msgstr ""
@@ -9343,6 +9481,9 @@ msgstr ""
msgid "Copy value"
msgstr ""
+msgid "Corpus Management"
+msgstr ""
+
msgid "Corpus Management|Are you sure you want to delete the corpus?"
msgstr ""
@@ -9571,6 +9712,9 @@ msgstr ""
msgid "Create commit"
msgstr ""
+msgid "Create common files more quickly, and standardize their format."
+msgstr ""
+
msgid "Create confidential merge request"
msgstr ""
@@ -9604,6 +9748,9 @@ msgstr ""
msgid "Create issue"
msgstr ""
+msgid "Create issue to resolve all threads"
+msgstr ""
+
msgid "Create iteration"
msgstr ""
@@ -9658,6 +9805,9 @@ msgstr ""
msgid "Create new..."
msgstr ""
+msgid "Create or import your first project"
+msgstr ""
+
msgid "Create project"
msgstr ""
@@ -10015,7 +10165,7 @@ msgstr ""
msgid "Custom notification events"
msgstr ""
-msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notificationLinkStart} notification emails%{notificationLinkEnd}."
+msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notificationLinkStart}notification emails%{notificationLinkEnd}."
msgstr ""
msgid "Custom project templates"
@@ -10216,10 +10366,10 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
-msgid "CycleAnalytics|Showing data for group '%{groupName}' and %{selectedProjectCount} projects from %{startDate} to %{endDate}"
+msgid "CycleAnalytics|Showing data for group '%{groupName}' and %{selectedProjectCount} projects from %{createdAfter} to %{createdBefore}"
msgstr ""
-msgid "CycleAnalytics|Showing data for group '%{groupName}' from %{startDate} to %{endDate}"
+msgid "CycleAnalytics|Showing data for group '%{groupName}' from %{createdAfter} to %{createdBefore}"
msgstr ""
msgid "CycleAnalytics|Stages"
@@ -10453,6 +10603,9 @@ msgstr ""
msgid "DastProfiles|Manage profiles"
msgstr ""
+msgid "DastProfiles|Manage site profiles"
+msgstr ""
+
msgid "DastProfiles|Minimum = 0 (no timeout enabled), Maximum = 2880 minutes"
msgstr ""
@@ -10528,6 +10681,9 @@ msgstr ""
msgid "DastProfiles|Scanner name"
msgstr ""
+msgid "DastProfiles|Schedule"
+msgstr ""
+
msgid "DastProfiles|Select branch"
msgstr ""
@@ -10597,7 +10753,7 @@ msgstr ""
msgid "DastProfiles|Website"
msgstr ""
-msgid "DastProfiles|You can either choose a passive scan or validate the target site in your chosen site profile. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
+msgid "DastProfiles|You can either choose a passive scan or validate the target site from the site profile management page. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
msgstr ""
msgid "DastProfiles|You cannot run an active scan against an unvalidated site."
@@ -10771,7 +10927,7 @@ msgstr ""
msgid "Days to merge"
msgstr ""
-msgid "Deactivate dormant users after 90 days of inactivity. Users can return to active status by signing in to their account. While inactive, a user is not counted as an active user in the instance."
+msgid "Deactivate dormant users after 90 days of inactivity"
msgstr ""
msgid "Dear Administrator,"
@@ -10858,10 +11014,10 @@ msgstr ""
msgid "Define a custom pattern with cron syntax"
msgstr ""
-msgid "Define approval settings."
+msgid "Define approval rules."
msgstr ""
-msgid "Define approval settings. %{linkStart}Learn more.%{linkEnd}"
+msgid "Define approval rules. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "Define custom rules for what constitutes spam, independent of Akismet"
@@ -10870,7 +11026,7 @@ msgstr ""
msgid "Define environments in the deploy stage(s) in %{code_open}.gitlab-ci.yml%{code_close} to track deployments here."
msgstr ""
-msgid "Define how approval rules are applied as a merge request moves toward completion."
+msgid "Define how approval rules are applied to merge requests."
msgstr ""
msgid "Definition"
@@ -10885,6 +11041,12 @@ msgstr ""
msgid "DelayedJobs|Are you sure you want to run %{job_name} immediately? This job will run automatically after it's timer finishes."
msgstr ""
+msgid "DelayedJobs|Are you sure you want to run %{job_name} immediately? This job will run automatically after its timer finishes."
+msgstr ""
+
+msgid "DelayedJobs|Run the delayed job now?"
+msgstr ""
+
msgid "DelayedJobs|Start now"
msgstr ""
@@ -11164,6 +11326,12 @@ msgstr ""
msgid "Dependency proxy image prefix"
msgstr ""
+msgid "DependencyProxy|Create a local proxy for storing frequently used upstream images. %{docLinkStart}Learn more%{docLinkEnd} about dependency proxies."
+msgstr ""
+
+msgid "DependencyProxy|Dependency Proxy"
+msgstr ""
+
msgid "DependencyProxy|Toggle Dependency Proxy"
msgstr ""
@@ -11407,6 +11575,9 @@ msgstr ""
msgid "Deployments"
msgstr ""
+msgid "Deployments to Google Kubernetes Engine can be "
+msgstr ""
+
msgid "Deployments|%{deployments} environment impacted."
msgid_plural "Deployments|%{deployments} environments impacted."
msgstr[0] ""
@@ -11437,6 +11608,9 @@ msgstr ""
msgid "Deployment|success"
msgstr ""
+msgid "Deprecated API rate limits"
+msgstr ""
+
msgid "Deprioritize label"
msgstr ""
@@ -11839,6 +12013,18 @@ msgstr ""
msgid "DiffsCompareBaseBranch|(base)"
msgstr ""
+msgid "Diffs|%d addition"
+msgid_plural "Diffs|%d additions"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+msgid "Diffs|%d deletion"
+msgid_plural "Diffs|%d deletions"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
msgid "Diffs|No file name available"
msgstr ""
@@ -11848,9 +12034,18 @@ msgstr ""
msgid "Diffs|Show all unchanged lines"
msgstr ""
+msgid "Diffs|Showing %{dropdownStart}%{count} changed file%{dropdownEnd}"
+msgid_plural "Diffs|Showing %{dropdownStart}%{count} changed files%{dropdownEnd}"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
msgid "Diffs|Something went wrong while fetching diff lines."
msgstr ""
+msgid "Diffs|with %{additions} and %{deletions}"
+msgstr ""
+
msgid "Direct member"
msgstr ""
@@ -11977,9 +12172,6 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
-msgid "Dismiss Value Stream Analytics introduction box"
-msgstr ""
-
msgid "Dismiss merge request promotion"
msgstr ""
@@ -12301,6 +12493,9 @@ msgstr ""
msgid "Edit issues"
msgstr ""
+msgid "Edit merge requests"
+msgstr ""
+
msgid "Edit public deploy key"
msgstr ""
@@ -12376,6 +12571,9 @@ msgstr ""
msgid "Elastic|None. Select projects to index."
msgstr ""
+msgid "Eligible users"
+msgstr ""
+
msgid "Email"
msgstr ""
@@ -12505,6 +12703,9 @@ msgstr ""
msgid "Enable"
msgstr ""
+msgid "Enable Amazon EKS integration"
+msgstr ""
+
msgid "Enable Auto DevOps"
msgstr ""
@@ -12538,6 +12739,9 @@ msgstr ""
msgid "Enable SSL verification"
msgstr ""
+msgid "Enable Service Ping"
+msgstr ""
+
msgid "Enable Snowplow tracking"
msgstr ""
@@ -12568,6 +12772,9 @@ msgstr ""
msgid "Enable authenticated Git LFS request rate limit"
msgstr ""
+msgid "Enable authenticated web request rate limit"
+msgstr ""
+
msgid "Enable authentication"
msgstr ""
@@ -12628,7 +12835,7 @@ msgstr ""
msgid "Enable or disable the Pseudonymizer data collection."
msgstr ""
-msgid "Enable or disable version check and service ping."
+msgid "Enable or disable version check and Service Ping."
msgstr ""
msgid "Enable protected paths rate limit"
@@ -12640,18 +12847,12 @@ msgstr ""
msgid "Enable reCAPTCHA"
msgstr ""
-msgid "Enable reCAPTCHA for login"
-msgstr ""
-
-msgid "Enable reCAPTCHA, Invisible Captcha, Akismet and set IP limits. For reCAPTCHA, we currently only support %{recaptcha_v2_link_start}v2%{recaptcha_v2_link_end}"
+msgid "Enable reCAPTCHA for login."
msgstr ""
msgid "Enable repository checks"
msgstr ""
-msgid "Enable service ping"
-msgstr ""
-
msgid "Enable shared runners for all projects and subgroups in this group."
msgstr ""
@@ -12673,7 +12874,10 @@ msgstr ""
msgid "Enable unauthenticated API request rate limit"
msgstr ""
-msgid "Enable unauthenticated request rate limit"
+msgid "Enable unauthenticated web request rate limit"
+msgstr ""
+
+msgid "Enable user deactivation emails"
msgstr ""
msgid "Enable version check"
@@ -12709,9 +12913,6 @@ msgstr ""
msgid "Enabled sources for code import during project creation. OmniAuth must be configured for GitHub"
msgstr ""
-msgid "Enabling this will only make licensed EE features available to projects if the project namespace's plan includes the feature or if the project is public."
-msgstr ""
-
msgid "Encountered an error while rendering: %{err}"
msgstr ""
@@ -12760,9 +12961,6 @@ msgstr ""
msgid "Enter Admin Mode"
msgstr ""
-msgid "Enter IP address range"
-msgstr ""
-
msgid "Enter a number"
msgstr ""
@@ -12775,9 +12973,6 @@ msgstr ""
msgid "Enter at least three characters to search"
msgstr ""
-msgid "Enter domain"
-msgstr ""
-
msgid "Enter in your Bitbucket Server URL and personal access token below"
msgstr ""
@@ -12964,9 +13159,6 @@ msgstr ""
msgid "Environments|Deployment %{status}"
msgstr ""
-msgid "Environments|Dismiss"
-msgstr ""
-
msgid "Environments|Enable review app"
msgstr ""
@@ -12979,9 +13171,6 @@ msgstr ""
msgid "Environments|Environments are places where code gets deployed, such as staging or production."
msgstr ""
-msgid "Environments|Help us improve environments"
-msgstr ""
-
msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
msgstr ""
@@ -13018,6 +13207,9 @@ msgstr ""
msgid "Environments|Note that this action will stop the environment, but it will %{emphasisStart}not%{emphasisEnd} have an effect on any existing deployment due to no “stop environment action†being defined in the %{ciConfigLinkStart}.gitlab-ci.yml%{ciConfigLinkEnd} file."
msgstr ""
+msgid "Environments|Open"
+msgstr ""
+
msgid "Environments|Open live environment"
msgstr ""
@@ -13057,9 +13249,6 @@ msgstr ""
msgid "Environments|Stopping %{environmentName}"
msgstr ""
-msgid "Environments|Take the survey"
-msgstr ""
-
msgid "Environments|There was an error fetching the logs. Please try again."
msgstr ""
@@ -13081,9 +13270,6 @@ msgstr ""
msgid "Environments|You don't have any environments right now"
msgstr ""
-msgid "Environments|Your feedback helps GitLab make environments better for you and other users. Participate and enter a sweepstake to win a USD 30 gift card."
-msgstr ""
-
msgid "Environments|by %{avatar}"
msgstr ""
@@ -13366,7 +13552,7 @@ msgstr ""
msgid "Error parsing CSV file. Please make sure it has"
msgstr ""
-msgid "Error rendering markdown preview"
+msgid "Error rendering Markdown preview"
msgstr ""
msgid "Error saving label update."
@@ -13414,6 +13600,9 @@ msgstr ""
msgid "Error: %{error_message}"
msgstr ""
+msgid "Error: Couldn't load some or all of the changes."
+msgstr ""
+
msgid "Error: No AWS credentials were supplied"
msgstr ""
@@ -13447,6 +13636,9 @@ msgstr ""
msgid "ErrorTracking|Enable error tracking"
msgstr ""
+msgid "ErrorTracking|Error tracking backend"
+msgstr ""
+
msgid "ErrorTracking|If you self-host Sentry, enter your Sentry instance's full URL. If you use Sentry's hosted solution, enter https://sentry.io"
msgstr ""
@@ -13480,6 +13672,12 @@ msgstr ""
msgid "Escalation policies must have at least one rule"
msgstr ""
+msgid "EscalationPolicies|%{clockIcon} IF alert is not %{alertStatus} in %{minutes}"
+msgstr ""
+
+msgid "EscalationPolicies|%{notificationIcon} THEN %{doAction} %{forScheduleOrUser}"
+msgstr ""
+
msgid "EscalationPolicies|+ Add an additional rule"
msgstr ""
@@ -13522,13 +13720,13 @@ msgstr ""
msgid "EscalationPolicies|Escalation policies"
msgstr ""
-msgid "EscalationPolicies|Escalation rules"
+msgid "EscalationPolicies|Escalation policy %{obstacle} in Project %{project}"
msgstr ""
-msgid "EscalationPolicies|Failed to load oncall-schedules"
+msgid "EscalationPolicies|Escalation rules"
msgstr ""
-msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} %{then} THEN %{doAction} %{scheduleOrUser}"
+msgid "EscalationPolicies|Failed to load oncall-schedules"
msgstr ""
msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} minutes"
@@ -13606,18 +13804,36 @@ msgstr ""
msgid "Every %{action} attempt has failed: %{job_error_message}. Please try again."
msgstr ""
+msgid "Every 3 months"
+msgstr ""
+
+msgid "Every 3 months on the %{day} at %{time} %{timezone}"
+msgstr ""
+
+msgid "Every 6 months"
+msgstr ""
+
+msgid "Every 6 months on the %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Every day"
msgstr ""
msgid "Every day (at %{time})"
msgstr ""
+msgid "Every day at %{time} %{timezone}"
+msgstr ""
+
msgid "Every month"
msgstr ""
msgid "Every month (Day %{day} at %{time})"
msgstr ""
+msgid "Every month on the %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Every three months"
msgstr ""
@@ -13633,6 +13849,15 @@ msgstr[2] ""
msgid "Every week (%{weekday} at %{time})"
msgstr ""
+msgid "Every week on %{day} at %{time} %{timezone}"
+msgstr ""
+
+msgid "Every year"
+msgstr ""
+
+msgid "Every year on %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Everyone"
msgstr ""
@@ -13669,9 +13894,6 @@ msgstr ""
msgid "Exactly one of %{attributes} is required"
msgstr ""
-msgid "Example: %{ip_address}. %{read_more_link}."
-msgstr ""
-
msgid "Example: @sub\\.company\\.com$"
msgstr ""
@@ -13738,13 +13960,13 @@ msgstr ""
msgid "Expand pipeline"
msgstr ""
-msgid "Expand sidebar"
+msgid "Expand settings section"
msgstr ""
-msgid "Expected documents: %{expected_documents}"
+msgid "Expand sidebar"
msgstr ""
-msgid "Experienced"
+msgid "Expected documents: %{expected_documents}"
msgstr ""
msgid "ExperimentSubject|Must have exactly one of User, Namespace, or Project."
@@ -14029,9 +14251,6 @@ msgstr ""
msgid "Failed to load related branches"
msgstr ""
-msgid "Failed to load sidebar lock status"
-msgstr ""
-
msgid "Failed to load stacktrace."
msgstr ""
@@ -14458,6 +14677,9 @@ msgstr ""
msgid "Files"
msgstr ""
+msgid "Files API Rate Limits"
+msgstr ""
+
msgid "Files breadcrumb"
msgstr ""
@@ -15457,6 +15679,9 @@ msgstr ""
msgid "GitLab group: %{source_link}"
msgstr ""
+msgid "GitLab informs you if a new version is available."
+msgstr ""
+
msgid "GitLab is a complete DevOps platform, delivered as a single application, fundamentally changing the way Development, Security, and Ops teams collaborate"
msgstr ""
@@ -15472,7 +15697,7 @@ msgstr ""
msgid "GitLab is open source software to collaborate on code."
msgstr ""
-msgid "GitLab is undergoing maintenance and is operating in a read-only mode."
+msgid "GitLab is undergoing maintenance and is operating in read-only mode."
msgstr ""
msgid "GitLab member or Email address"
@@ -15484,9 +15709,6 @@ msgstr ""
msgid "GitLab project export"
msgstr ""
-msgid "GitLab restart is required to apply changes."
-msgstr ""
-
msgid "GitLab single sign-on URL"
msgstr ""
@@ -15502,9 +15724,6 @@ msgstr ""
msgid "GitLab version"
msgstr ""
-msgid "GitLab will inform you if a new version is available."
-msgstr ""
-
msgid "GitLab will run a background job that will produce pseudonymized CSVs of the GitLab database that will be uploaded to your configured object storage directory."
msgstr ""
@@ -15769,9 +15988,21 @@ msgstr ""
msgid "Go to snippets"
msgstr ""
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check 'Allowed domains for sign-ups'."
+msgstr ""
+
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check 'Email restrictions for sign-ups'."
+msgstr ""
+
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check the 'Domain denylist'."
+msgstr ""
+
msgid "Go to the activity feed"
msgstr ""
+msgid "Go to the group’s 'Settings &gt; General' page, and check 'Restrict membership by email domain'."
+msgstr ""
+
msgid "Go to the milestone list"
msgstr ""
@@ -15808,6 +16039,12 @@ msgstr ""
msgid "Goal of the changes and what reviewers should be aware of"
msgstr ""
+msgid "Google Cloud"
+msgstr ""
+
+msgid "Google Cloud offers several deployment targets. Select the one most suitable for your project."
+msgstr ""
+
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
@@ -15892,9 +16129,6 @@ msgstr ""
msgid "Group ID"
msgstr ""
-msgid "Group ID: %{group_id}"
-msgstr ""
-
msgid "Group Owner must have signed in with SAML before enabling Group Managed Accounts"
msgstr ""
@@ -16069,6 +16303,12 @@ msgstr ""
msgid "GroupImport|Unable to process group import file"
msgstr ""
+msgid "GroupPage|Copy group ID"
+msgstr ""
+
+msgid "GroupPage|Group ID: %{group_id}"
+msgstr ""
+
msgid "GroupRoadmap|%{dateWord} – No end date"
msgstr ""
@@ -16123,6 +16363,9 @@ msgstr ""
msgid "GroupRoadmap|Within 3 years"
msgstr ""
+msgid "GroupSAML|\"persistent\" recommended"
+msgstr ""
+
msgid "GroupSAML|%{strongOpen}Warning%{strongClose} - Enabling %{linkStart}SSO enforcement%{linkEnd} can reduce security risks."
msgstr ""
@@ -16255,6 +16498,9 @@ msgstr ""
msgid "GroupSAML|To be able to prohibit outer forks, you first need to enforce dedicate group managed accounts."
msgstr ""
+msgid "GroupSAML|Use SAML group links to manage group membership using SAML."
+msgstr ""
+
msgid "GroupSAML|Valid SAML Response"
msgstr ""
@@ -16267,13 +16513,10 @@ msgstr ""
msgid "GroupSAML|as %{access_level}"
msgstr ""
-msgid "GroupSAML|must match stored NameID of \"%{extern_uid}\" as we use this to identify users. If the NameID changes users will be unable to sign in."
-msgstr ""
-
-msgid "GroupSAML|should be \"persistent\""
+msgid "GroupSAML|must match stored NameID of \"%{extern_uid}\" to identify user and allow sign in"
msgstr ""
-msgid "GroupSAML|should be a random persistent ID, emails are discouraged"
+msgid "GroupSAML|recommend persistent ID instead of email"
msgstr ""
msgid "GroupSelect|No matching results"
@@ -16288,9 +16531,15 @@ msgstr ""
msgid "GroupSettings|Allow project access token creation"
msgstr ""
+msgid "GroupSettings|Applied to all subgroups unless overridden by a group owner. Groups already added to the project lose access."
+msgstr ""
+
msgid "GroupSettings|Auto DevOps pipeline was updated for the group"
msgstr ""
+msgid "GroupSettings|Available only on the top-level group. Applies to all subgroups. Groups already shared with a group outside %{group} are still shared unless removed manually."
+msgstr ""
+
msgid "GroupSettings|Badges"
msgstr ""
@@ -16342,6 +16591,9 @@ msgstr ""
msgid "GroupSettings|New runners registration token has been generated!"
msgstr ""
+msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgstr ""
+
msgid "GroupSettings|Pipeline settings was updated for the group"
msgstr ""
@@ -16354,12 +16606,15 @@ msgstr ""
msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
-msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups."
+msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups"
msgstr ""
msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
msgstr ""
+msgid "GroupSettings|Prevents group members from being notified if the group is mentioned."
+msgstr ""
+
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
msgstr ""
@@ -16396,21 +16651,6 @@ msgstr ""
msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}."
msgstr ""
-msgid "GroupSettings|This setting is only available on the top-level group and it applies to all subgroups. Groups that have already been shared with a group outside %{group} will still be shared, and this access will have to be revoked manually."
-msgstr ""
-
-msgid "GroupSettings|This setting will be applied to all subgroups unless overridden by a group owner. Groups that already have access to the project will continue to have access unless removed manually."
-msgstr ""
-
-msgid "GroupSettings|This setting will override user notification preferences for all members of the group, subgroups, and projects."
-msgstr ""
-
-msgid "GroupSettings|This setting will prevent group members from being notified if the group is mentioned."
-msgstr ""
-
-msgid "GroupSettings|This setting will prevent group members from forking projects outside of the group."
-msgstr ""
-
msgid "GroupSettings|Transfer group"
msgstr ""
@@ -16528,7 +16768,7 @@ msgstr ""
msgid "GroupsNew|No import options available"
msgstr ""
-msgid "GroupsNew|Not all related objects are migrated, as %{docs_link_start}described here%{docs_link_end}. Please %{feedback_link_start}leave feedback%{feedback_link_end} on this feature."
+msgid "GroupsNew|Not all related objects are migrated. %{docs_link_start}More info%{docs_link_end}."
msgstr ""
msgid "GroupsNew|Personal access token"
@@ -16660,15 +16900,27 @@ msgstr ""
msgid "Hello %{name},"
msgstr ""
-msgid "Hello there"
-msgstr ""
-
msgid "Hello, %{name}!"
msgstr ""
msgid "Hello, %{username}!"
msgstr ""
+msgid "HelloMessage|%{handshake_emoji} Contribute to GitLab: %{contribute_link}"
+msgstr ""
+
+msgid "HelloMessage|%{magnifier_emoji} Create a new GitLab issue: %{new_issue_link}"
+msgstr ""
+
+msgid "HelloMessage|%{rocket_emoji} We like your curiosity! Help us improve GitLab by joining the team: %{jobs_page_link}"
+msgstr ""
+
+msgid "HelloMessage|Does this page need fixes or improvements? Open an issue or contribute a merge request to help make GitLab more lovable. At GitLab, everyone can contribute!"
+msgstr ""
+
+msgid "HelloMessage|Welcome to GitLab!"
+msgstr ""
+
msgid "Help"
msgstr ""
@@ -16678,13 +16930,10 @@ msgstr ""
msgid "Helps prevent bots from creating accounts."
msgstr ""
-msgid "Helps prevent bots from creating issues"
-msgstr ""
-
-msgid "Helps prevent malicious users hide their activity"
+msgid "Helps prevent bots from creating issues."
msgstr ""
-msgid "Helps reduce request volume (e.g. from crawlers or abusive bots)"
+msgid "Helps prevent malicious users hide their activity."
msgstr ""
msgid "Helps reduce request volume (for example, from crawlers or abusive bots)"
@@ -16810,6 +17059,12 @@ msgstr ""
msgid "Housekeeping, export, path, transfer, remove, archive."
msgstr ""
+msgid "How do I configure Akismet?"
+msgstr ""
+
+msgid "How do I configure it?"
+msgstr ""
+
msgid "How do I configure runners?"
msgstr ""
@@ -16831,19 +17086,25 @@ msgstr ""
msgid "How do I set up this service?"
msgstr ""
+msgid "How do I use a web terminal?"
+msgstr ""
+
+msgid "How do I use file templates?"
+msgstr ""
+
msgid "How it works"
msgstr ""
msgid "How many days need to pass between marking entity for deletion and actual removing it."
msgstr ""
-msgid "How many seconds an IP will be counted towards the limit"
+msgid "How many seconds an IP counts toward the IP address limit."
msgstr ""
-msgid "I accept the %{terms_link}"
+msgid "How the job limiter handles jobs exceeding the thresholds specified below. The 'track' mode only logs the jobs. The 'compress' mode compresses the jobs and raises an exception if the compressed size exceeds the limit."
msgstr ""
-msgid "I accept the|Terms of Service and Privacy Policy"
+msgid "I accept the %{terms_link}"
msgstr ""
msgid "I forgot my password"
@@ -16927,13 +17188,16 @@ msgstr ""
msgid "IP Address"
msgstr ""
-msgid "IP expiration time"
+msgid "IP address expiration time"
msgstr ""
-msgid "IP subnet restriction only allowed for top-level groups"
+msgid "IP address restrictions"
+msgstr ""
+
+msgid "IP addresses per user"
msgstr ""
-msgid "IPs per user"
+msgid "IP subnet restriction only allowed for top-level groups"
msgstr ""
msgid "Identifier"
@@ -16948,6 +17212,9 @@ msgstr ""
msgid "If any indexed field exceeds this limit it will be truncated to this number of characters and the rest will not be indexed or searchable. This does not apply to repository and wiki indexing. Setting this to 0 means it is unlimited."
msgstr ""
+msgid "If blank, defaults to %{code_open}Retry later%{code_close}."
+msgstr ""
+
msgid "If blank, set allowable lifetime to %{instance_level_policy_in_words}, as defined by the instance admin. Once set, existing tokens for users in this group may be revoked."
msgstr ""
@@ -16999,6 +17266,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 did not initiate these sign-in attempts, please reach out to your administrator or enable two-factor authentication (2FA) on your account."
+msgstr ""
+
msgid "If you did not initiate this change, please contact your administrator immediately."
msgstr ""
@@ -17092,10 +17362,10 @@ msgstr ""
msgid "Import Projects from Gitea"
msgstr ""
-msgid "Import a project"
+msgid "Import an exported GitLab project"
msgstr ""
-msgid "Import an exported GitLab project"
+msgid "Import and export rate limits"
msgstr ""
msgid "Import failed due to a GitHub error: %{original}"
@@ -17107,12 +17377,18 @@ msgstr ""
msgid "Import from Jira"
msgstr ""
+msgid "Import group"
+msgstr ""
+
msgid "Import group from file"
msgstr ""
msgid "Import groups"
msgstr ""
+msgid "Import history"
+msgstr ""
+
msgid "Import in progress"
msgstr ""
@@ -17176,7 +17452,25 @@ msgstr ""
msgid "Import timed out. Import took longer than %{import_jobs_expiration} seconds"
msgstr ""
-msgid "Import/Export Rate Limits"
+msgid "ImportAProjectModal|Import from a project"
+msgstr ""
+
+msgid "ImportAProjectModal|Import members from another project"
+msgstr ""
+
+msgid "ImportAProjectModal|Import project members"
+msgstr ""
+
+msgid "ImportAProjectModal|Only project members (not group members) are imported, and they get the same permissions as the project you import from."
+msgstr ""
+
+msgid "ImportAProjectModal|Successfully imported"
+msgstr ""
+
+msgid "ImportAProjectModal|Unable to import project members"
+msgstr ""
+
+msgid "ImportAProjectModal|You're importing members to the %{strongStart}%{name}%{strongEnd} project."
msgstr ""
msgid "ImportButtons|Connect repositories from"
@@ -17230,7 +17524,7 @@ msgstr[2] ""
msgid "Importing..."
msgstr ""
-msgid "Import|A repository URL usually ends in a .git suffix, although this is not required. Double check to make sure your repository URL is correct."
+msgid "Import|There is not a valid Git repository at this URL. If your HTTP repository is not publicly accessible, verify your credentials."
msgstr ""
msgid "Improve customer support with Service Desk"
@@ -17239,9 +17533,6 @@ msgstr ""
msgid "Improves Git cloning performance."
msgstr ""
-msgid "In %{time_to_now}"
-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 ""
@@ -17527,7 +17818,7 @@ msgstr ""
msgid "InProductMarketing|Start a GitLab Ultimate trial today in less than one minute, no credit card required."
msgstr ""
-msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no CC required"
+msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no credit card required"
msgstr ""
msgid "InProductMarketing|Start a trial"
@@ -17566,7 +17857,7 @@ msgstr ""
msgid "InProductMarketing|Team up in GitLab for greater efficiency"
msgstr ""
-msgid "InProductMarketing|Team work makes the dream work"
+msgid "InProductMarketing|Team work makes the dream work"
msgstr ""
msgid "InProductMarketing|Test, create, deploy"
@@ -18148,6 +18439,9 @@ msgstr ""
msgid "Integrations|Create new issue in Jira"
msgstr ""
+msgid "Integrations|Create new issue in ZenTao"
+msgstr ""
+
msgid "Integrations|Default settings are inherited from the group level."
msgstr ""
@@ -18241,9 +18535,15 @@ msgstr ""
msgid "Integrations|Search Jira issues"
msgstr ""
+msgid "Integrations|Search ZenTao issues"
+msgstr ""
+
msgid "Integrations|Send notifications about project events to Unify Circuit."
msgstr ""
+msgid "Integrations|Send notifications about project events to a Unify Circuit conversation. %{docs_link}"
+msgstr ""
+
msgid "Integrations|Sign in to add namespaces"
msgstr ""
@@ -18283,6 +18583,9 @@ msgstr ""
msgid "Integrations|You've activated every integration 🎉"
msgstr ""
+msgid "Integrations|ZenTao issues display here when you create issues in your project in ZenTao."
+msgstr ""
+
msgid "Interactive mode"
msgstr ""
@@ -18310,9 +18613,6 @@ msgstr ""
msgid "Interval Pattern"
msgstr ""
-msgid "Introducing Value Stream Analytics"
-msgstr ""
-
msgid "Introducing Your DevOps Report"
msgstr ""
@@ -18409,6 +18709,12 @@ msgstr ""
msgid "Investigate vulnerability: %{title}"
msgstr ""
+msgid "Invisible Captcha"
+msgstr ""
+
+msgid "Invisible Captcha helps prevent the creation of spam accounts. It adds a honeypot field and time-sensitive form submission to the account signup form."
+msgstr ""
+
msgid "Invitation"
msgstr ""
@@ -18862,12 +19168,18 @@ msgstr ""
msgid "Issues"
msgstr ""
+msgid "Issues I've created"
+msgstr ""
+
msgid "Issues Rate Limits"
msgstr ""
msgid "Issues and merge requests"
msgstr ""
+msgid "Issues assigned to me"
+msgstr ""
+
msgid "Issues can be bugs, tasks or ideas to be discussed. Also, issues are searchable and filterable."
msgstr ""
@@ -18979,7 +19291,7 @@ msgstr ""
msgid "Iterations|Create cadence"
msgstr ""
-msgid "Iterations|Create your first iteration"
+msgid "Iterations|Create iteration"
msgstr ""
msgid "Iterations|Delete cadence"
@@ -18988,6 +19300,9 @@ msgstr ""
msgid "Iterations|Delete iteration cadence?"
msgstr ""
+msgid "Iterations|Delete iteration?"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -19021,12 +19336,18 @@ msgstr ""
msgid "Iterations|New iteration cadence"
msgstr ""
+msgid "Iterations|No closed iterations."
+msgstr ""
+
msgid "Iterations|No iteration cadences to show."
msgstr ""
msgid "Iterations|No iterations in cadence."
msgstr ""
+msgid "Iterations|No open iterations."
+msgstr ""
+
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
@@ -19057,6 +19378,9 @@ msgstr ""
msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
msgstr ""
+msgid "Iterations|This will remove the iteration from any issues that are assigned to it."
+msgstr ""
+
msgid "Iterations|Title"
msgstr ""
@@ -19072,15 +19396,9 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "I’m familiar with the basics of DevOps."
-msgstr ""
-
msgid "I’m joining my team who’s already on GitLab"
msgstr ""
-msgid "I’m not familiar with the basics of DevOps."
-msgstr ""
-
msgid "Jaeger URL"
msgstr ""
@@ -19345,6 +19663,9 @@ msgstr ""
msgid "Job"
msgstr ""
+msgid "Job %{jobName}"
+msgstr ""
+
msgid "Job Failed #%{build_id}"
msgstr ""
@@ -19936,9 +20257,6 @@ msgstr ""
msgid "Learn more in the"
msgstr ""
-msgid "Learn more in the|pipeline schedules documentation"
-msgstr ""
-
msgid "Learn more."
msgstr ""
@@ -20050,9 +20368,6 @@ msgstr ""
msgid "Leave Admin Mode"
msgstr ""
-msgid "Leave blank for no limit. Once set, existing personal access tokens may be revoked."
-msgstr ""
-
msgid "Leave edit mode? All unsaved changes will be lost."
msgstr ""
@@ -20098,10 +20413,10 @@ msgstr ""
msgid "LicenseCompliance|Acceptable license to be used in the project"
msgstr ""
-msgid "LicenseCompliance|Add a license"
+msgid "LicenseCompliance|Add license and related policy"
msgstr ""
-msgid "LicenseCompliance|Add license and related policy"
+msgid "LicenseCompliance|Add license policy"
msgstr ""
msgid "LicenseCompliance|Allow"
@@ -20197,6 +20512,9 @@ msgstr ""
msgid "LicenseManagement|Uncategorized"
msgstr ""
+msgid "Licensed Enterprise Edition features can be used if the project namespace's plan includes the feature, or if the project is public."
+msgstr ""
+
msgid "Licensed Features"
msgstr ""
@@ -20263,7 +20581,10 @@ msgstr ""
msgid "Limit namespaces and projects that can be indexed"
msgstr ""
-msgid "Limit sign in from multiple ips"
+msgid "Limit project size at a global, group, and project level. %{link_start}Learn more%{link_end}."
+msgstr ""
+
+msgid "Limit sign in from multiple IP addresses"
msgstr ""
msgid "Limit the number of concurrent operations this secondary site can run in the background."
@@ -20275,12 +20596,18 @@ msgstr ""
msgid "Limit the number of issues and epics per minute a user can create through web and API requests."
msgstr ""
+msgid "Limit the size of Sidekiq jobs stored in Redis."
+msgstr ""
+
msgid "Limited to showing %d event at most"
msgid_plural "Limited to showing %d events at most"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
+msgid "Limiting mode"
+msgstr ""
+
msgid "Line changes"
msgstr ""
@@ -20350,9 +20677,6 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
-msgid "List of users to be excluded from the limit"
-msgstr ""
-
msgid "List options"
msgstr ""
@@ -20392,9 +20716,6 @@ msgstr ""
msgid "Loading functions timed out. Please reload the page to try again."
msgstr ""
-msgid "Loading issues"
-msgstr ""
-
msgid "Loading more"
msgstr ""
@@ -20686,6 +21007,9 @@ msgstr ""
msgid "Marked For Deletion At - %{deletion_time}"
msgstr ""
+msgid "Marked as ready. Merging is now allowed."
+msgstr ""
+
msgid "Marked this %{noun} as a draft."
msgstr ""
@@ -20758,52 +21082,22 @@ msgstr ""
msgid "Max 100,000 events"
msgstr ""
-msgid "Max 20 characters"
-msgstr ""
-
-msgid "Max Group Export Download requests per minute per user"
-msgstr ""
-
-msgid "Max Group Export requests per minute per user"
-msgstr ""
-
-msgid "Max Group Import requests per minute per user"
-msgstr ""
-
-msgid "Max Project Export Download requests per minute per user"
-msgstr ""
-
-msgid "Max Project Export requests per minute per user"
-msgstr ""
-
-msgid "Max Project Import requests per minute per user"
-msgstr ""
-
-msgid "Max authenticated API requests per period per user"
-msgstr ""
-
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
-msgid "Max authenticated web requests per period per user"
-msgstr ""
-
msgid "Max file size is 200 KB."
msgstr ""
-msgid "Max requests per minute per user"
-msgstr ""
-
msgid "Max role"
msgstr ""
msgid "Max session time"
msgstr ""
-msgid "Max unauthenticated requests per period per IP"
+msgid "MaxBuilds"
msgstr ""
-msgid "MaxBuilds"
+msgid "Maximum 20 characters"
msgstr ""
msgid "Maximum Conan package file size in bytes"
@@ -20839,6 +21133,12 @@ msgstr ""
msgid "Maximum attachment size (MB)"
msgstr ""
+msgid "Maximum authenticated API requests per rate limit period per user"
+msgstr ""
+
+msgid "Maximum authenticated web requests per rate limit period per user"
+msgstr ""
+
msgid "Maximum bulk request size (MiB)"
msgstr ""
@@ -20884,6 +21184,15 @@ msgstr ""
msgid "Maximum files in a diff"
msgstr ""
+msgid "Maximum group export download requests per minute"
+msgstr ""
+
+msgid "Maximum group export requests per minute"
+msgstr ""
+
+msgid "Maximum group import requests per minute"
+msgstr ""
+
msgid "Maximum import size"
msgstr ""
@@ -20920,7 +21229,7 @@ msgstr ""
msgid "Maximum number of projects."
msgstr ""
-msgid "Maximum number of unique IPs per user"
+msgid "Maximum number of unique IP addresses per user."
msgstr ""
msgid "Maximum page reached"
@@ -20929,12 +21238,24 @@ msgstr ""
msgid "Maximum page size"
msgstr ""
+msgid "Maximum project export download requests per minute"
+msgstr ""
+
+msgid "Maximum project export requests per minute"
+msgstr ""
+
+msgid "Maximum project import requests per minute"
+msgstr ""
+
msgid "Maximum push size"
msgstr ""
msgid "Maximum push size (MB)"
msgstr ""
+msgid "Maximum requests per minute"
+msgstr ""
+
msgid "Maximum running slices"
msgstr ""
@@ -20962,10 +21283,16 @@ msgstr ""
msgid "Maximum time between updates that a mirror can have when scheduled to synchronize."
msgstr ""
-msgid "Maximum time for web terminal websocket connection (in seconds). 0 for unlimited."
+msgid "Maximum time that users are allowed to skip the setup of two-factor authentication (in hours). Set to 0 (zero) to enforce at next sign in."
msgstr ""
-msgid "Maximum time that users are allowed to skip the setup of two-factor authentication (in hours). Set to 0 (zero) to enforce at next sign in."
+msgid "Maximum time, in seconds, for a web terminal websocket connection. 0 for unlimited."
+msgstr ""
+
+msgid "Maximum unauthenticated API requests per rate limit period per IP"
+msgstr ""
+
+msgid "Maximum unauthenticated web requests per rate limit period per IP"
msgstr ""
msgid "May"
@@ -20983,9 +21310,6 @@ msgstr ""
msgid "Medium vulnerabilities present"
msgstr ""
-msgid "Member lock"
-msgstr ""
-
msgid "Member since"
msgstr ""
@@ -21022,6 +21346,9 @@ msgstr ""
msgid "Members of a group may only view projects they have permission to access"
msgstr ""
+msgid "Membership"
+msgstr ""
+
msgid "Members|%{time} by %{user}"
msgstr ""
@@ -21082,9 +21409,6 @@ msgstr ""
msgid "Members|Expiration date updated successfully."
msgstr ""
-msgid "Members|Expired"
-msgstr ""
-
msgid "Members|Filter members"
msgstr ""
@@ -21100,9 +21424,6 @@ msgstr ""
msgid "Members|Membership"
msgstr ""
-msgid "Members|No expiration set"
-msgstr ""
-
msgid "Members|Remove \"%{groupName}\""
msgstr ""
@@ -21124,9 +21445,6 @@ msgstr ""
msgid "Members|Search invited"
msgstr ""
-msgid "Members|in %{time}"
-msgstr ""
-
msgid "Member|Deny access"
msgstr ""
@@ -21202,9 +21520,6 @@ msgstr ""
msgid "Merge request %{mr_link} was reviewed by %{mr_author}"
msgstr ""
-msgid "Merge request (MR) approvals"
-msgstr ""
-
msgid "Merge request analytics"
msgstr ""
@@ -21226,12 +21541,21 @@ msgstr ""
msgid "Merge requests"
msgstr ""
+msgid "Merge requests I've created"
+msgstr ""
+
msgid "Merge requests are a place to propose changes you've made to a project and discuss those changes with others"
msgstr ""
msgid "Merge requests are read-only in a secondary Geo node"
msgstr ""
+msgid "Merge requests assigned to me"
+msgstr ""
+
+msgid "Merge requests that I'm a reviewer"
+msgstr ""
+
msgid "Merge the branch and fix any conflicts that come up"
msgstr ""
@@ -21292,10 +21616,10 @@ msgstr ""
msgid "MergeRequests|An error occurred while saving the draft comment."
msgstr ""
-msgid "MergeRequests|Failed to squash. Should be done manually."
+msgid "MergeRequests|Create issue to resolve thread"
msgstr ""
-msgid "MergeRequests|Resolve this thread in a new issue"
+msgid "MergeRequests|Failed to squash. Should be done manually."
msgstr ""
msgid "MergeRequests|Saving the comment failed"
@@ -22111,6 +22435,9 @@ msgstr ""
msgid "MoveIssue|Cannot move issue to project it originates from!"
msgstr ""
+msgid "MoveIssue|Cannot move issues of '%{issue_type}' type."
+msgstr ""
+
msgid "Moved issue to %{label} column in the board."
msgstr ""
@@ -22237,6 +22564,15 @@ 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. To learn more about reducing storage capacity please visit our docs."
msgstr ""
+msgid "NamespaceUserCap|Pending users must be reviewed and approved by a group owner. Learn more about %{user_caps_link_start}User Caps%{link_end} and %{users_pending_approval_link_start}Users Pending Approval%{link_end}."
+msgstr ""
+
+msgid "NamespaceUserCap|View pending user approvals"
+msgstr ""
+
+msgid "NamespaceUserCap|Your group has reached its billable member limit"
+msgstr ""
+
msgid "Namespaces"
msgstr ""
@@ -22279,9 +22615,6 @@ msgstr ""
msgid "Network"
msgstr ""
-msgid "Network Policy|New rule"
-msgstr ""
-
msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is inbound from a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
msgstr ""
@@ -22303,16 +22636,13 @@ msgstr ""
msgid "NetworkPolicies|%{strongOpen}any%{strongClose} port"
msgstr ""
-msgid "NetworkPolicies|+ Add alert"
-msgstr ""
-
msgid "NetworkPolicies|.yaml"
msgstr ""
msgid "NetworkPolicies|.yaml mode"
msgstr ""
-msgid "NetworkPolicies|Actions"
+msgid "NetworkPolicies|Add alert"
msgstr ""
msgid "NetworkPolicies|Alerts are intended to be selectively used for a limited number of events that are potentially concerning and warrant a manual review. Alerts should not be used as a substitute for a SIEM or a logging tool. High volume alerts are likely to be dropped so as to preserve the stability of GitLab's integration with Kubernetes."
@@ -22348,9 +22678,6 @@ msgstr ""
msgid "NetworkPolicies|Deny all traffic"
msgstr ""
-msgid "NetworkPolicies|Description"
-msgstr ""
-
msgid "NetworkPolicies|Edit policy"
msgstr ""
@@ -22363,9 +22690,6 @@ msgstr ""
msgid "NetworkPolicies|IP/subnet"
msgstr ""
-msgid "NetworkPolicies|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
-msgstr ""
-
msgid "NetworkPolicies|Invalid or empty policy"
msgstr ""
@@ -22375,19 +22699,16 @@ msgstr ""
msgid "NetworkPolicies|Kubernetes error: %{error}"
msgstr ""
-msgid "NetworkPolicies|Name"
-msgstr ""
-
msgid "NetworkPolicies|Network"
msgstr ""
-msgid "NetworkPolicies|Network traffic"
+msgid "NetworkPolicies|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
msgstr ""
-msgid "NetworkPolicies|New policy"
+msgid "NetworkPolicies|Network policy can be created after the environment is loaded successfully."
msgstr ""
-msgid "NetworkPolicies|No policies detected"
+msgid "NetworkPolicies|Network traffic"
msgstr ""
msgid "NetworkPolicies|None selected"
@@ -22396,21 +22717,12 @@ msgstr ""
msgid "NetworkPolicies|Please %{installLinkStart}install%{installLinkEnd} and %{configureLinkStart}configure a Kubernetes Agent for this project%{configureLinkEnd} to enable alerts."
msgstr ""
-msgid "NetworkPolicies|Policies are a specification of how groups of pods are allowed to communicate with each other's network endpoints."
-msgstr ""
-
msgid "NetworkPolicies|Policy %{policyName} was successfully changed"
msgstr ""
msgid "NetworkPolicies|Policy definition"
msgstr ""
-msgid "NetworkPolicies|Policy editor"
-msgstr ""
-
-msgid "NetworkPolicies|Policy preview"
-msgstr ""
-
msgid "NetworkPolicies|Rule"
msgstr ""
@@ -22420,9 +22732,6 @@ msgstr ""
msgid "NetworkPolicies|Rule mode is unavailable for this policy. In some cases, we cannot parse the YAML file back into the rules editor."
msgstr ""
-msgid "NetworkPolicies|Rules"
-msgstr ""
-
msgid "NetworkPolicies|Save changes"
msgstr ""
@@ -22435,9 +22744,6 @@ msgstr ""
msgid "NetworkPolicies|Traffic that does not match any rule will be blocked."
msgstr ""
-msgid "NetworkPolicies|Unable to parse policy"
-msgstr ""
-
msgid "NetworkPolicies|all DNS names"
msgstr ""
@@ -22618,6 +22924,9 @@ msgstr ""
msgid "New issue"
msgstr ""
+msgid "New issue in %{project}"
+msgstr ""
+
msgid "New issue title"
msgstr ""
@@ -22696,7 +23005,7 @@ msgstr ""
msgid "Newest first"
msgstr ""
-msgid "Newly registered users will by default be external"
+msgid "Newly-registered users are external by default"
msgstr ""
msgid "Next"
@@ -23011,8 +23320,11 @@ msgstr ""
msgid "No webhooks found, add one in the form above."
msgstr ""
-msgid "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} to renew your subscription."
-msgstr ""
+msgid "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} day to renew your subscription."
+msgid_plural "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} days to renew your subscription."
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
msgid "No. of commits"
msgstr ""
@@ -23029,7 +23341,7 @@ msgstr ""
msgid "Nodes"
msgstr ""
-msgid "Non-admin users can sign in with read-only access and make read-only API requests."
+msgid "Non-admin users are restricted to read-only access, in both GitLab UI and API."
msgstr ""
msgid "None"
@@ -23110,7 +23422,7 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
-msgid "Notes Rate Limits"
+msgid "Notes rate limit"
msgstr ""
msgid "Notes|Are you sure you want to cancel creating this comment?"
@@ -23281,9 +23593,6 @@ msgstr ""
msgid "November"
msgstr ""
-msgid "Novice"
-msgstr ""
-
msgid "Now, personalize your GitLab experience"
msgstr ""
@@ -23452,7 +23761,7 @@ msgstr ""
msgid "OnCallSchedules|For this rotation, on-call will be:"
msgstr ""
-msgid "OnCallSchedules|On-call schedule %{schedule} in Project %{project}"
+msgid "OnCallSchedules|On-call schedule %{obstacle} in Project %{project}"
msgstr ""
msgid "OnCallSchedules|On-call schedules"
@@ -23599,22 +23908,22 @@ msgstr ""
msgid "OnDemandScans|Scanner profile"
msgstr ""
-msgid "OnDemandScans|Select one of the existing profiles"
+msgid "OnDemandScans|Schedule scan"
msgstr ""
-msgid "OnDemandScans|Site profile"
+msgid "OnDemandScans|Select one of the existing profiles"
msgstr ""
-msgid "OnDemandScans|Use existing scanner profile"
+msgid "OnDemandScans|Site profile"
msgstr ""
-msgid "OnDemandScans|Use existing site profile"
+msgid "OnDemandScans|Start time"
msgstr ""
-msgid "OnDemandScans|You can either choose a passive scan or validate the target site in your chosen site profile. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
+msgid "OnDemandScans|Use existing scanner profile"
msgstr ""
-msgid "OnDemandScans|You cannot run an active scan against an unvalidated site."
+msgid "OnDemandScans|Use existing site profile"
msgstr ""
msgid "OnDemandScans|You must create a repository within your project to run an on-demand scan."
@@ -23680,6 +23989,9 @@ msgstr ""
msgid "Only admins can delete project"
msgstr ""
+msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
+msgstr ""
+
msgid "Only include features new to your current subscription tier."
msgstr ""
@@ -23698,6 +24010,12 @@ msgstr ""
msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
+msgid "Only reCAPTCHA v2 is supported:"
+msgstr ""
+
+msgid "Only users from the specified IP address ranges are able to reach this group, including all subgroups, projects, and Git repositories."
+msgstr ""
+
msgid "Only verified users with an email address in any of these domains can be added to the group."
msgstr ""
@@ -23884,9 +24202,6 @@ msgstr ""
msgid "Package Registry"
msgstr ""
-msgid "Package Registry Rate Limits"
-msgstr ""
-
msgid "Package Registry: authenticated API requests"
msgstr ""
@@ -23905,6 +24220,9 @@ msgstr ""
msgid "Package recipe already exists"
msgstr ""
+msgid "Package registry rate limits"
+msgstr ""
+
msgid "Package type"
msgstr ""
@@ -23971,6 +24289,9 @@ msgstr ""
msgid "PackageRegistry|Composer"
msgstr ""
+msgid "PackageRegistry|Composer.json with license: %{license} and version: %{version}"
+msgstr ""
+
msgid "PackageRegistry|Conan"
msgstr ""
@@ -24034,6 +24355,9 @@ msgstr ""
msgid "PackageRegistry|Copy require package include"
msgstr ""
+msgid "PackageRegistry|Copy target SHA"
+msgstr ""
+
msgid "PackageRegistry|Copy yarn command"
msgstr ""
@@ -24100,6 +24424,9 @@ msgstr ""
msgid "PackageRegistry|Install package version"
msgstr ""
+msgid "PackageRegistry|Instance-level"
+msgstr ""
+
msgid "PackageRegistry|Invalid Package: failed metadata extraction"
msgstr ""
@@ -24145,6 +24472,9 @@ msgstr ""
msgid "PackageRegistry|Pip Command"
msgstr ""
+msgid "PackageRegistry|Project-level"
+msgstr ""
+
msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
msgstr ""
@@ -24166,6 +24496,9 @@ msgstr ""
msgid "PackageRegistry|Remove package"
msgstr ""
+msgid "PackageRegistry|Required Python: %{pythonVersion}"
+msgstr ""
+
msgid "PackageRegistry|RubyGems"
msgstr ""
@@ -24208,6 +24541,9 @@ msgstr ""
msgid "PackageRegistry|Source project located at %{link}"
msgstr ""
+msgid "PackageRegistry|Target SHA: %{sha}"
+msgstr ""
+
msgid "PackageRegistry|There are no other versions of this package."
msgstr ""
@@ -24376,6 +24712,18 @@ msgstr ""
msgid "Password was successfully updated. Please sign in again."
msgstr ""
+msgid "PasswordPrompt|Confirm password"
+msgstr ""
+
+msgid "PasswordPrompt|Confirm password to continue"
+msgstr ""
+
+msgid "PasswordPrompt|Password is required"
+msgstr ""
+
+msgid "PasswordPrompt|Please enter your password to confirm"
+msgstr ""
+
msgid "Passwords should be unique and not used for any other sites or services."
msgstr ""
@@ -24403,6 +24751,9 @@ msgstr ""
msgid "Paste project path (i.e. gitlab-org/gitlab)"
msgstr ""
+msgid "Paste this DSN into your Sentry SDK"
+msgstr ""
+
msgid "Paste your public SSH key, which is usually contained in the file '~/.ssh/id_ed25519.pub' or '~/.ssh/id_rsa.pub' and begins with 'ssh-ed25519' or 'ssh-rsa'. Do not paste your private SSH key, as that can compromise your identity."
msgstr ""
@@ -24487,6 +24838,9 @@ msgstr ""
msgid "PerformanceBar|First Contentful Paint"
msgstr ""
+msgid "PerformanceBar|Flamegraph with mode:"
+msgstr ""
+
msgid "PerformanceBar|Frontend resources"
msgstr ""
@@ -24520,6 +24874,15 @@ msgstr ""
msgid "PerformanceBar|Trace"
msgstr ""
+msgid "PerformanceBar|cpu"
+msgstr ""
+
+msgid "PerformanceBar|object"
+msgstr ""
+
+msgid "PerformanceBar|wall"
+msgstr ""
+
msgid "Period in seconds"
msgstr ""
@@ -24748,6 +25111,48 @@ msgstr ""
msgid "PipelineSchedules|Variables"
msgstr ""
+msgid "PipelineSource|API"
+msgstr ""
+
+msgid "PipelineSource|Chat"
+msgstr ""
+
+msgid "PipelineSource|External"
+msgstr ""
+
+msgid "PipelineSource|External Pull Request"
+msgstr ""
+
+msgid "PipelineSource|Merge Request"
+msgstr ""
+
+msgid "PipelineSource|On-Demand DAST Scan"
+msgstr ""
+
+msgid "PipelineSource|On-Demand DAST Validation"
+msgstr ""
+
+msgid "PipelineSource|Parent Pipeline"
+msgstr ""
+
+msgid "PipelineSource|Pipeline"
+msgstr ""
+
+msgid "PipelineSource|Push"
+msgstr ""
+
+msgid "PipelineSource|Schedule"
+msgstr ""
+
+msgid "PipelineSource|Trigger"
+msgstr ""
+
+msgid "PipelineSource|Web"
+msgstr ""
+
+msgid "PipelineSource|Web IDE"
+msgstr ""
+
msgid "PipelineStatusTooltip|Pipeline: %{ciStatus}"
msgstr ""
@@ -25048,46 +25453,7 @@ msgstr ""
msgid "Pipeline|Source"
msgstr ""
-msgid "Pipeline|Source|API"
-msgstr ""
-
-msgid "Pipeline|Source|Chat"
-msgstr ""
-
-msgid "Pipeline|Source|External"
-msgstr ""
-
-msgid "Pipeline|Source|External Pull Request"
-msgstr ""
-
-msgid "Pipeline|Source|Merge Request"
-msgstr ""
-
-msgid "Pipeline|Source|On-Demand DAST Scan"
-msgstr ""
-
-msgid "Pipeline|Source|On-Demand DAST Validation"
-msgstr ""
-
-msgid "Pipeline|Source|Parent Pipeline"
-msgstr ""
-
-msgid "Pipeline|Source|Pipeline"
-msgstr ""
-
-msgid "Pipeline|Source|Push"
-msgstr ""
-
-msgid "Pipeline|Source|Schedule"
-msgstr ""
-
-msgid "Pipeline|Source|Trigger"
-msgstr ""
-
-msgid "Pipeline|Source|Web"
-msgstr ""
-
-msgid "Pipeline|Source|Web IDE"
+msgid "Pipeline|Source|Security Policy"
msgstr ""
msgid "Pipeline|Specify variable values to be used in this run. The values specified in %{linkStart}CI/CD settings%{linkEnd} will be used by default."
@@ -25138,7 +25504,7 @@ msgstr ""
msgid "Pipeline|We are currently unable to fetch pipeline data"
msgstr ""
-msgid "Pipeline|You’re about to stop pipeline %{pipelineId}."
+msgid "Pipeline|You’re about to stop pipeline #%{pipelineId}."
msgstr ""
msgid "Pipeline|for"
@@ -25165,6 +25531,9 @@ msgstr ""
msgid "Plain diff"
msgstr ""
+msgid "Plain-text response to send to clients that hit a rate limit"
+msgstr ""
+
msgid "Plan:"
msgstr ""
@@ -25309,9 +25678,6 @@ msgstr ""
msgid "Please provide attributes to update"
msgstr ""
-msgid "Please provide your username or email address."
-msgstr ""
-
msgid "Please reach out if you have any questions and we'll be happy to assist."
msgstr ""
@@ -25354,9 +25720,6 @@ msgstr ""
msgid "Please set a new password before proceeding."
msgstr ""
-msgid "Please share your feedback about %{featureName} %{linkStart}in this issue%{linkEnd} to help us improve the experience."
-msgstr ""
-
msgid "Please solve the captcha"
msgstr ""
@@ -25534,6 +25897,9 @@ msgstr ""
msgid "Prevent adding new members to project membership within this group"
msgstr ""
+msgid "Prevent auto-stopping"
+msgstr ""
+
msgid "Prevent editing approval rules in projects and merge requests."
msgstr ""
@@ -25546,7 +25912,7 @@ msgstr ""
msgid "Prevent users from changing their profile name"
msgstr ""
-msgid "Prevent users from performing write operations on GitLab while performing maintenance."
+msgid "Prevent users from performing write operations while GitLab maintenance is in progress."
msgstr ""
msgid "Preview"
@@ -25819,6 +26185,9 @@ msgstr ""
msgid "Profiles|Enter your name, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Enter your password to confirm the email change"
+msgstr ""
+
msgid "Profiles|Enter your pronouns to let people know how to refer to you"
msgstr ""
@@ -26053,10 +26422,10 @@ msgstr ""
msgid "Profiles|e.g. My MacBook key"
msgstr ""
-msgid "Profiles|username"
+msgid "Profiles|https://website.com"
msgstr ""
-msgid "Profiles|website.com"
+msgid "Profiles|username"
msgstr ""
msgid "Profiles|your account"
@@ -26299,9 +26668,21 @@ msgstr ""
msgid "ProjectSelect| or group"
msgstr ""
+msgid "ProjectSelect|No matching results"
+msgstr ""
+
msgid "ProjectSelect|Search for project"
msgstr ""
+msgid "ProjectSelect|Search projects"
+msgstr ""
+
+msgid "ProjectSelect|Select a project"
+msgstr ""
+
+msgid "ProjectSelect|There was an error fetching the projects. Please try again."
+msgstr ""
+
msgid "ProjectService|Drone server URL"
msgstr ""
@@ -26389,6 +26770,9 @@ msgstr ""
msgid "ProjectService|Trigger event when a new, unique alert is recorded."
msgstr ""
+msgid "ProjectService|Trigger event when a new, unique vulnerability is recorded. (Note: This feature requires an Ultimate plan.)"
+msgstr ""
+
msgid "ProjectService|Trigger event when a pipeline status changes."
msgstr ""
@@ -26803,9 +27187,15 @@ msgstr ""
msgid "Projects are graded based on the highest severity vulnerability present"
msgstr ""
+msgid "Projects are organized into groups"
+msgstr ""
+
msgid "Projects contributed to"
msgstr ""
+msgid "Projects help you organize your work. They contain your file repository, issues, merge requests, and so much more."
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr ""
@@ -27040,10 +27430,10 @@ msgstr ""
msgid "PrometheusService|Prometheus cluster integration"
msgstr ""
-msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
+msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
msgstr ""
-msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
+msgid "PrometheusService|The ID of the IAP-secured resource."
msgstr ""
msgid "PrometheusService|The Prometheus API base URL."
@@ -27661,6 +28051,9 @@ msgstr ""
msgid "Rate limit"
msgstr ""
+msgid "Rate limits can help reduce request volume (like from crawlers or abusive bots)."
+msgstr ""
+
msgid "Raw blob request rate limit per minute"
msgstr ""
@@ -27673,6 +28066,9 @@ msgstr ""
msgid "Re-authentication required"
msgstr ""
+msgid "Re-import"
+msgstr ""
+
msgid "Re-request review"
msgstr ""
@@ -27694,6 +28090,9 @@ msgstr ""
msgid "Read more about related issues"
msgstr ""
+msgid "Read their documentation."
+msgstr ""
+
msgid "Ready to get started with GitLab? Follow these steps to set up your workspace, plan and commit changes, and deploy your project."
msgstr ""
@@ -27727,6 +28126,9 @@ msgstr ""
msgid "Receive any notifications from GitLab."
msgstr ""
+msgid "Receive notification of abuse reports by email."
+msgstr ""
+
msgid "Receive notifications about your own activity"
msgstr ""
@@ -27871,9 +28273,6 @@ msgstr ""
msgid "Registry setup"
msgstr ""
-msgid "Regulate approvals by authors/committers. Affects all projects."
-msgstr ""
-
msgid "Reindexing Status: %{status} (Slice multiplier: %{multiplier}, Maximum running slices: %{max_slices})"
msgstr ""
@@ -27970,6 +28369,9 @@ msgstr ""
msgid "Release|Something went wrong while saving the release details."
msgstr ""
+msgid "Reload page"
+msgstr ""
+
msgid "Remediations"
msgstr ""
@@ -28252,6 +28654,9 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
+msgid "Repeats"
+msgstr ""
+
msgid "Replace"
msgstr ""
@@ -28618,10 +29023,7 @@ msgstr ""
msgid "Require additional authentication for administrative tasks."
msgstr ""
-msgid "Require all users in this group to setup Two-factor authentication"
-msgstr ""
-
-msgid "Require all users in this group to setup two-factor authentication"
+msgid "Require all users in this group to set up two-factor authentication"
msgstr ""
msgid "Required approvals (%{approvals_given} given)"
@@ -28669,6 +29071,9 @@ msgstr[2] ""
msgid "Requires values to meet regular expression requirements."
msgstr ""
+msgid "Requires you to deploy or set up cloud-hosted Sentry."
+msgstr ""
+
msgid "Requires your primary GitLab email address."
msgstr ""
@@ -28729,9 +29134,6 @@ msgstr ""
msgid "Resolve"
msgstr ""
-msgid "Resolve all threads in new issue"
-msgstr ""
-
msgid "Resolve conflicts"
msgstr ""
@@ -28789,6 +29191,9 @@ msgstr ""
msgid "Response text"
msgstr ""
+msgid "Restart GitLab to apply changes."
+msgstr ""
+
msgid "Restart Terminal"
msgstr ""
@@ -28807,6 +29212,9 @@ msgstr ""
msgid "Restoring the project will prevent the project from being removed on this date and restore people's ability to make changes to it."
msgstr ""
+msgid "Restrict group access by IP address. %{link_start}Learn more%{link_end}."
+msgstr ""
+
msgid "Restrict membership by email domain"
msgstr ""
@@ -29122,6 +29530,9 @@ msgstr ""
msgid "Runners|Runner #%{runner_id}"
msgstr ""
+msgid "Runners|Runner assigned to project."
+msgstr ""
+
msgid "Runners|Runner is offline, last contact was %{runner_contact} ago"
msgstr ""
@@ -29134,6 +29545,9 @@ msgstr ""
msgid "Runners|Runner registration"
msgstr ""
+msgid "Runners|Runner unassigned from project."
+msgstr ""
+
msgid "Runners|Runners"
msgstr ""
@@ -29326,7 +29740,7 @@ msgstr ""
msgid "SastEntryPoints|How do I set up SAST?"
msgstr ""
-msgid "SastEntryPoints|Learn more."
+msgid "SastEntryPoints|Learn more"
msgstr ""
msgid "Satisfied"
@@ -29368,7 +29782,7 @@ msgstr ""
msgid "Save pipeline schedule"
msgstr ""
-msgid "Save space and find images in the container Registry. remove unneeded tags and keep only the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
+msgid "Save storage space by automatically deleting tags from the container registry and keeping the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
msgstr ""
msgid "Saving"
@@ -29542,6 +29956,9 @@ msgstr ""
msgid "Search or filter results…"
msgstr ""
+msgid "Search or jump to..."
+msgstr ""
+
msgid "Search project"
msgstr ""
@@ -29602,16 +30019,16 @@ msgstr ""
msgid "SearchCodeResults|of %{link_to_project}"
msgstr ""
-msgid "SearchResults|Showing %{count} %{scope} for%{term_element}"
+msgid "SearchResults|Showing %{count} %{scope} for %{term_element}"
msgstr ""
-msgid "SearchResults|Showing %{count} %{scope} for%{term_element} in your personal and project snippets"
+msgid "SearchResults|Showing %{count} %{scope} for %{term_element} in your personal and project snippets"
msgstr ""
-msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for%{term_element}"
+msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for %{term_element}"
msgstr ""
-msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for%{term_element} in your personal and project snippets"
+msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for %{term_element} in your personal and project snippets"
msgstr ""
msgid "SearchResults|code result"
@@ -29704,6 +30121,9 @@ msgstr ""
msgid "Secret Detection"
msgstr ""
+msgid "Secret access key"
+msgstr ""
+
msgid "Secret token"
msgstr ""
@@ -29743,9 +30163,6 @@ msgstr ""
msgid "SecurityApprovals|A merge request approval is required when the license compliance report contains a denied license."
msgstr ""
-msgid "SecurityApprovals|Configurable if security scanners are enabled. %{linkStart}Learn more.%{linkEnd}"
-msgstr ""
-
msgid "SecurityApprovals|Coverage-Check"
msgstr ""
@@ -29758,24 +30175,18 @@ msgstr ""
msgid "SecurityApprovals|Learn more about Vulnerability-Check"
msgstr ""
-msgid "SecurityApprovals|License Scanning must be enabled. %{linkStart}Learn more%{linkEnd}."
-msgstr ""
-
msgid "SecurityApprovals|License-Check"
msgstr ""
msgid "SecurityApprovals|Requires approval for Denied licenses. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}More information%{linkEnd}"
+msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "SecurityApprovals|Requires approval for vulnerabilities. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
-msgid "SecurityApprovals|Test coverage must be enabled. %{linkStart}Learn more%{linkEnd}."
-msgstr ""
-
msgid "SecurityApprovals|Vulnerability-Check"
msgstr ""
@@ -29839,6 +30250,12 @@ msgstr ""
msgid "SecurityConfiguration|Immediately begin risk analysis and remediation with application security features. Start with SAST and Secret Detection, available to all plans. Upgrade to Ultimate to get all features, including:"
msgstr ""
+msgid "SecurityConfiguration|Manage corpus"
+msgstr ""
+
+msgid "SecurityConfiguration|Manage corpus files used as mutation sources in coverage fuzzing."
+msgstr ""
+
msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
msgstr ""
@@ -29893,6 +30310,12 @@ msgstr ""
msgid "SecurityOrchestration|Action"
msgstr ""
+msgid "SecurityOrchestration|Actions"
+msgstr ""
+
+msgid "SecurityOrchestration|Add rule"
+msgstr ""
+
msgid "SecurityOrchestration|All policies"
msgstr ""
@@ -29926,9 +30349,6 @@ msgstr ""
msgid "SecurityOrchestration|Network"
msgstr ""
-msgid "SecurityOrchestration|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
-msgstr ""
-
msgid "SecurityOrchestration|New policy"
msgstr ""
@@ -29944,6 +30364,9 @@ msgstr ""
msgid "SecurityOrchestration|Policy editor"
msgstr ""
+msgid "SecurityOrchestration|Policy preview"
+msgstr ""
+
msgid "SecurityOrchestration|Policy status"
msgstr ""
@@ -29953,6 +30376,9 @@ msgstr ""
msgid "SecurityOrchestration|Rule"
msgstr ""
+msgid "SecurityOrchestration|Rules"
+msgstr ""
+
msgid "SecurityOrchestration|Scan Execution"
msgstr ""
@@ -30046,6 +30472,9 @@ msgstr ""
msgid "SecurityReports|Create issue"
msgstr ""
+msgid "SecurityReports|Development vulnerabilities"
+msgstr ""
+
msgid "SecurityReports|Dismiss vulnerability"
msgstr ""
@@ -30061,6 +30490,9 @@ msgstr ""
msgid "SecurityReports|Download results"
msgstr ""
+msgid "SecurityReports|Download scanned URLs"
+msgstr ""
+
msgid "SecurityReports|Download scanned resources"
msgstr ""
@@ -30184,6 +30616,9 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
+msgid "SecurityReports|The Vulnerability Report shows the results of the lastest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "SecurityReports|The security reports below contain one or more vulnerability findings that could not be parsed and were not recorded. Download the artifacts in the job output to investigate. Ensure any security report created conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
msgstr ""
@@ -30325,10 +30760,10 @@ msgstr ""
msgid "Select a repository"
msgstr ""
-msgid "Select a role"
+msgid "Select a repository containing templates for common files."
msgstr ""
-msgid "Select a shared template repository for all projects on this instance."
+msgid "Select a role"
msgstr ""
msgid "Select a template repository"
@@ -30406,6 +30841,9 @@ msgstr ""
msgid "Select project to choose zone"
msgstr ""
+msgid "Select project to create issue"
+msgstr ""
+
msgid "Select projects"
msgstr ""
@@ -30523,6 +30961,9 @@ msgstr ""
msgid "Send emails to help guide new users through the onboarding process."
msgstr ""
+msgid "Send emails to users upon account deactivation."
+msgstr ""
+
msgid "Send message"
msgstr ""
@@ -30541,6 +30982,9 @@ msgstr ""
msgid "Send service data"
msgstr ""
+msgid "Sentry"
+msgstr ""
+
msgid "Sentry API URL"
msgstr ""
@@ -30655,6 +31099,9 @@ msgstr ""
msgid "Service"
msgstr ""
+msgid "Service Accounts keys are required to authorize GitLab to deploy your Google Cloud project."
+msgstr ""
+
msgid "Service Desk"
msgstr ""
@@ -30727,15 +31174,15 @@ msgstr ""
msgid "Set a password on your account to pull or push via %{protocol}."
msgstr ""
-msgid "Set a template repository for projects in this group"
-msgstr ""
-
msgid "Set access permissions for this token."
msgstr ""
msgid "Set an instance-wide domain that will be available to all clusters when installing Knative."
msgstr ""
+msgid "Set any rate limit to %{code_open}0%{code_close} to disable the limit."
+msgstr ""
+
msgid "Set default and restrict visibility levels. Configure import sources and git access protocol."
msgstr ""
@@ -30748,7 +31195,7 @@ msgstr ""
msgid "Set limit to 0 to allow any file size."
msgstr ""
-msgid "Set max session time for web terminal."
+msgid "Set limits for web and API requests."
msgstr ""
msgid "Set milestone"
@@ -30757,15 +31204,18 @@ msgstr ""
msgid "Set new password"
msgstr ""
-msgid "Set notification email for abuse reports."
+msgid "Set parent epic to an epic"
msgstr ""
-msgid "Set parent epic to an epic"
+msgid "Set per-user rate limits for imports and exports of projects and groups."
msgstr ""
msgid "Set projects and maximum size limits, session duration, user options, and check feature availability for namespace plan."
msgstr ""
+msgid "Set rate limits for package registry API requests that supersede the general user and IP rate limits."
+msgstr ""
+
msgid "Set severity"
msgstr ""
@@ -30784,15 +31234,24 @@ msgstr ""
msgid "Set the default branch for this project. All merge requests and commits are made against this branch unless you specify a different one."
msgstr ""
+msgid "Set the default expiration time for job artifacts in all projects. Set to %{code_open}0%{code_close} to never expire artifacts by default. If no unit is written, it defaults to seconds. For example, these are all equivalent: %{code_open}3600%{code_close}, %{code_open}60 minutes%{code_close}, or %{code_open}one hour%{code_close}."
+msgstr ""
+
msgid "Set the due date to %{due_date}."
msgstr ""
msgid "Set the iteration to %{iteration_reference}."
msgstr ""
+msgid "Set the maximum session time for a web terminal."
+msgstr ""
+
msgid "Set the milestone to %{milestone_reference}."
msgstr ""
+msgid "Set the per-user rate limit for notes created by web or API requests."
+msgstr ""
+
msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
msgstr ""
@@ -30994,6 +31453,9 @@ msgstr ""
msgid "Show Pipeline IID"
msgstr ""
+msgid "Show all %{issuable_type}."
+msgstr ""
+
msgid "Show all activity"
msgstr ""
@@ -31045,15 +31507,9 @@ msgstr ""
msgid "Show list"
msgstr ""
-msgid "Show me advanced features"
-msgstr ""
-
msgid "Show me how to add a pipeline"
msgstr ""
-msgid "Show me the basics"
-msgstr ""
-
msgid "Show one file at a time"
msgstr ""
@@ -31096,15 +31552,15 @@ msgstr ""
msgid "Showing %{pageSize} of %{total} %{issuableType}"
msgstr ""
-msgid "Showing %{pageSize} of %{total} issues"
-msgstr ""
-
msgid "Showing all epics"
msgstr ""
msgid "Showing all issues"
msgstr ""
+msgid "Showing data for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
+msgstr ""
+
msgid "Showing data for workflow items created in this date range. Date range cannot exceed %{maxDateRange} days."
msgstr ""
@@ -31144,6 +31600,15 @@ msgstr ""
msgid "Sidebar|Weight"
msgstr ""
+msgid "Sidekiq job compression threshold (bytes)"
+msgstr ""
+
+msgid "Sidekiq job size limit (bytes)"
+msgstr ""
+
+msgid "Sidekiq job size limits"
+msgstr ""
+
msgid "Sign in"
msgstr ""
@@ -31264,6 +31729,9 @@ msgstr ""
msgid "Site profile not found for given parameters"
msgstr ""
+msgid "Sites"
+msgstr ""
+
msgid "Size"
msgstr ""
@@ -31294,19 +31762,22 @@ msgstr ""
msgid "SlackIntegration|Sends notifications about project events to Slack channels."
msgstr ""
-msgid "SlackService|2. Paste the %{strong_open}Token%{strong_close} into the field below"
+msgid "SlackService|1. %{slash_command_link_start}Add a slash command%{slash_command_link_end} in your Slack team using this information:"
msgstr ""
-msgid "SlackService|3. Select the %{strong_open}Active%{strong_close} checkbox, press %{strong_open}Save changes%{strong_close} and start using GitLab inside Slack!"
+msgid "SlackService|2. Paste the token from Slack in the %{strong_open}Token%{strong_close} field below."
msgstr ""
-msgid "SlackService|Fill in the word that works best for your team."
+msgid "SlackService|3. Select the %{strong_open}Active%{strong_close} checkbox, select %{strong_open}Save changes%{strong_close}, and start using slash commands in Slack!"
+msgstr ""
+
+msgid "SlackService|After setup, get a list of available Slack slash commands by entering"
msgstr ""
-msgid "SlackService|See list of available commands in Slack after setting up this service, by entering"
+msgid "SlackService|Fill in the word that works best for your team."
msgstr ""
-msgid "SlackService|This service allows users to perform common operations on this project by entering slash commands in Slack."
+msgid "SlackService|Perform common operations in this project by entering slash commands in Slack."
msgstr ""
msgid "Slice multiplier"
@@ -31372,7 +31843,7 @@ msgstr ""
msgid "Some child epics may be hidden due to applied filters"
msgstr ""
-msgid "Some common domains are not allowed. %{read_more_link}."
+msgid "Some common domains are not allowed. %{learn_more_link}."
msgstr ""
msgid "Some of the designs you tried uploading did not change:"
@@ -31456,9 +31927,6 @@ msgstr ""
msgid "Something went wrong while exporting requirements"
msgstr ""
-msgid "Something went wrong while fetching %{listType} list"
-msgstr ""
-
msgid "Something went wrong while fetching branches"
msgstr ""
@@ -31513,15 +31981,9 @@ msgstr ""
msgid "Something went wrong while merging this merge request. Please try again."
msgstr ""
-msgid "Something went wrong while moving issues."
-msgstr ""
-
msgid "Something went wrong while obtaining the Let's Encrypt certificate."
msgstr ""
-msgid "Something went wrong while performing the action."
-msgstr ""
-
msgid "Something went wrong while promoting the issue to an epic. Please try again."
msgstr ""
@@ -31849,7 +32311,10 @@ msgstr ""
msgid "SourcegraphPreferences|Uses a custom %{linkStart}Sourcegraph instance%{linkEnd}."
msgstr ""
-msgid "Spam Check API Key"
+msgid "Spam Check"
+msgstr ""
+
+msgid "Spam Check API key"
msgstr ""
msgid "Spam Logs"
@@ -31867,7 +32332,7 @@ msgstr ""
msgid "Specified URL cannot be used: \"%{reason}\""
msgstr ""
-msgid "Specify an e-mail address regex pattern to identify default internal users."
+msgid "Specify an email address regex pattern to identify default internal users."
msgstr ""
msgid "Speed up your pipelines with Needs relationships"
@@ -32122,7 +32587,7 @@ msgstr ""
msgid "StatusCheck|An error occurred fetching the status checks."
msgstr ""
-msgid "StatusCheck|Apply this status check to any branch or a specific protected branch."
+msgid "StatusCheck|Apply this status check to all branches or a specific protected branch."
msgstr ""
msgid "StatusCheck|Check for a status response in Merge Requests. Failures do not block merges. %{link_start}Learn more%{link_end}."
@@ -32461,6 +32926,9 @@ msgstr ""
msgid "Subscriptions"
msgstr ""
+msgid "Subscription|Your subscription for %{strong}%{namespace_name}%{strong_close} has expired and you are now on %{pricing_link_start}the GitLab Free tier%{pricing_link_end}. Don't worry, your data is safe. Get in touch with our support team (%{support_email}). They'll gladly help with your subscription renewal."
+msgstr ""
+
msgid "Subtracted"
msgstr ""
@@ -32689,6 +33157,9 @@ msgstr ""
msgid "SuperSonics|Plan"
msgstr ""
+msgid "SuperSonics|Please agree to the Subscription Agreement"
+msgstr ""
+
msgid "SuperSonics|Ready to get started? A GitLab plan is ideal for scaling organizations and for multi team usage."
msgstr ""
@@ -32719,6 +33190,9 @@ msgstr ""
msgid "SuperSonics|The activation code is not valid. Please make sure to copy it exactly from the Customers Portal or confirmation email. Learn more about %{linkStart}activating your subscription%{linkEnd}."
msgstr ""
+msgid "SuperSonics|The activation code should be a 24-character alphanumeric string"
+msgstr ""
+
msgid "SuperSonics|There is a connectivity issue."
msgstr ""
@@ -32761,9 +33235,15 @@ msgstr ""
msgid "SuperSonics|You do not have an active subscription"
msgstr ""
+msgid "SuperSonics|You have successfully added a license that activates on %{date}. Please see the subscription history table below for more details."
+msgstr ""
+
msgid "SuperSonics|You'll be charged for %{trueUpLinkStart}users over license%{trueUpLinkEnd} on a quarterly or annual basis, depending on the terms of your agreement."
msgstr ""
+msgid "SuperSonics|Your future dated license was successfully added"
+msgstr ""
+
msgid "SuperSonics|Your subscription"
msgstr ""
@@ -33016,7 +33496,7 @@ msgstr ""
msgid "Template to append to all Service Desk issues"
msgstr ""
-msgid "TemplateRepository|Select a repository to make its templates available to all projects. %{link_start}What should the repository contain?%{link_end} "
+msgid "TemplateRepository|Create common files more quickly, and standardize their format."
msgstr ""
msgid "Templates"
@@ -33226,7 +33706,7 @@ msgstr ""
msgid "TestCases|Search test cases"
msgstr ""
-msgid "TestCases|Something went wrong while adding test case to Todo."
+msgid "TestCases|Something went wrong while adding test case to a to-do item."
msgstr ""
msgid "TestCases|Something went wrong while creating a test case."
@@ -33238,7 +33718,7 @@ msgstr ""
msgid "TestCases|Something went wrong while fetching test cases list."
msgstr ""
-msgid "TestCases|Something went wrong while marking test case todo as done."
+msgid "TestCases|Something went wrong while marking test case to-do item as done."
msgstr ""
msgid "TestCases|Something went wrong while moving test case."
@@ -33358,7 +33838,7 @@ msgstr ""
msgid "Thanks for your purchase!"
msgstr ""
-msgid "That is ok, I do not want to renew"
+msgid "That's OK, I don't want to renew"
msgstr ""
msgid "That's it, well done!"
@@ -33382,7 +33862,7 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
-msgid "The API key used by GitLab for accessing the Spam Check service endpoint"
+msgid "The API key used by GitLab for accessing the Spam Check service endpoint."
msgstr ""
msgid "The GitLab subscription service (customers.gitlab.com) is currently experiencing an outage. You can monitor the status and get updates at %{linkStart}status.gitlab.com%{linkEnd}."
@@ -33421,9 +33901,6 @@ msgstr ""
msgid "The URL to use for connecting to Elasticsearch. Use a comma-separated list to support clustering (e.g., \"http://localhost:9200, http://localhost:9201\")."
msgstr ""
-msgid "The Vulnerability Report shows the results of the last successful pipeline run on the default branch."
-msgstr ""
-
msgid "The X509 Certificate to use when mutual TLS is required to communicate with the external authorization service. If left blank, the server certificate is still validated when accessing over HTTPS."
msgstr ""
@@ -33481,9 +33958,6 @@ msgstr ""
msgid "The default branch for this project has been changed. Please update your bookmarks."
msgstr ""
-msgid "The default expiration time for job artifacts. 0 for unlimited. The default unit is in seconds, but you can use other units, for example %{code_open}4 mins 2 sec%{code_close}, %{code_open}2h42min%{code_close}."
-msgstr ""
-
msgid "The dependency list details information about the components used within your project."
msgstr ""
@@ -33676,9 +34150,6 @@ msgstr ""
msgid "The merge conflicts for this merge request have already been resolved. Please return to the merge request."
msgstr ""
-msgid "The merge request can now be merged."
-msgstr ""
-
msgid "The metric must be one of %{metrics}."
msgstr ""
@@ -34054,7 +34525,7 @@ msgstr ""
msgid "There was a problem updating the keep latest artifacts setting."
msgstr ""
-msgid "There was an error %{message} todo."
+msgid "There was an error %{message} to-do item."
msgstr ""
msgid "There was an error adding a To Do."
@@ -34093,6 +34564,9 @@ msgstr ""
msgid "There was an error fetching projects"
msgstr ""
+msgid "There was an error fetching search autocomplete suggestions"
+msgstr ""
+
msgid "There was an error fetching stage total counts"
msgstr ""
@@ -34417,6 +34891,9 @@ msgstr ""
msgid "This field is required."
msgstr ""
+msgid "This form is disabled in preview"
+msgstr ""
+
msgid "This group"
msgstr ""
@@ -34438,9 +34915,6 @@ msgstr ""
msgid "This group is linked to a subscription"
msgstr ""
-msgid "This group, including all subgroups, projects and git repositories, will be reachable from only the specified IP address ranges."
-msgstr ""
-
msgid "This group, its subgroups and projects has been scheduled for removal on %{date}."
msgstr ""
@@ -34720,9 +35194,6 @@ msgstr ""
msgid "This user cannot be unlocked manually from GitLab"
msgstr ""
-msgid "This user does not have a pending request"
-msgstr ""
-
msgid "This user has an unconfirmed email address (%{email}). You may force a confirmation."
msgstr ""
@@ -34831,9 +35302,6 @@ msgstr ""
msgid "ThreatMonitoring|Packet Activity"
msgstr ""
-msgid "ThreatMonitoring|Policies"
-msgstr ""
-
msgid "ThreatMonitoring|Requests"
msgstr ""
@@ -34885,6 +35353,12 @@ msgstr ""
msgid "ThreatMonitoring|View documentation"
msgstr ""
+msgid "Threshold in bytes at which to compress Sidekiq job arguments."
+msgstr ""
+
+msgid "Threshold in bytes at which to reject Sidekiq jobs. Set this to 0 to if you don't want to limit Sidekiq jobs."
+msgstr ""
+
msgid "Throughput"
msgstr ""
@@ -34894,6 +35368,9 @@ msgstr ""
msgid "Time"
msgstr ""
+msgid "Time (in hours) that users are allowed to skip forced configuration of two-factor authentication."
+msgstr ""
+
msgid "Time Spent"
msgstr ""
@@ -34960,7 +35437,7 @@ msgstr ""
msgid "TimeTrackingEstimated|Est"
msgstr ""
-msgid "TimeTracking|%{startTag}Spent: %{endTag}%{timeSpentHumanReadable}"
+msgid "TimeTracking|%{spentStart}Spent: %{spentEnd}"
msgstr ""
msgid "TimeTracking|Estimated:"
@@ -35176,6 +35653,9 @@ msgstr ""
msgid "To access this domain create a new DNS record"
msgstr ""
+msgid "To add a custom suffix, set up a Service Desk email address. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "To add an SSH key you need to %{generate_link_start}generate one%{link_end} or use an %{existing_link_start}existing key%{link_end}."
msgstr ""
@@ -35197,13 +35677,16 @@ msgstr ""
msgid "To connect an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To continue using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
+msgstr ""
+
msgid "To continue, you need to select the link in the confirmation email we sent to verify your email address. If you didn't get our email, select %{strongStart}Resend confirmation email.%{strongEnd}"
msgstr ""
msgid "To define internal users, first enable new users set to external"
msgstr ""
-msgid "To enable Registration Features, make sure \"Enable service ping\" is checked."
+msgid "To enable Registration Features, first enable Service Ping."
msgstr ""
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
@@ -35230,7 +35713,7 @@ msgstr ""
msgid "To get started, use the link below to confirm your account."
msgstr ""
-msgid "To help improve GitLab and its user experience, GitLab will periodically collect usage information."
+msgid "To help improve GitLab and its user experience, GitLab periodically collects usage information."
msgstr ""
msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
@@ -35263,7 +35746,7 @@ msgstr ""
msgid "To preserve performance only %{strong_open}%{display_size} of %{real_size}%{strong_close} files are displayed."
msgstr ""
-msgid "To protect this issue's confidentiality, %{forkLink} and set the fork's visibility to private."
+msgid "To protect this issue's confidentiality, %{linkStart}fork this project%{linkEnd} and set the fork's visibility to private."
msgstr ""
msgid "To protect this issue's confidentiality, a private fork of this project was selected."
@@ -35296,12 +35779,15 @@ msgstr ""
msgid "To set up SAML authentication for your group through an identity provider like Azure, Okta, Onelogin, Ping Identity, or your custom SAML 2.0 provider:"
msgstr ""
-msgid "To set up this service:"
+msgid "To set up this integration:"
msgstr ""
msgid "To specify the notification level per project of a group you belong to, you need to visit project page and change notification level there."
msgstr ""
+msgid "To start using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
+msgstr ""
+
msgid "To unsubscribe from this issue, please paste the following link into your browser:"
msgstr ""
@@ -35890,9 +36376,6 @@ msgstr ""
msgid "Unable to fetch branches list, please close the form and try again"
msgstr ""
-msgid "Unable to fetch unscanned projects"
-msgstr ""
-
msgid "Unable to fetch vulnerable projects"
msgstr ""
@@ -35947,6 +36430,15 @@ msgstr ""
msgid "Unable to update this issue at this time."
msgstr ""
+msgid "Unapprove a merge request"
+msgstr ""
+
+msgid "Unapprove the current merge request."
+msgstr ""
+
+msgid "Unapproved the current merge request."
+msgstr ""
+
msgid "Unarchive project"
msgstr ""
@@ -35959,16 +36451,13 @@ msgstr ""
msgid "Unassigned"
msgstr ""
-msgid "Unauthenticated API request rate limit"
-msgstr ""
-
-msgid "Unauthenticated rate limit period in seconds"
+msgid "Unauthenticated API rate limit period in seconds"
msgstr ""
-msgid "Unauthenticated request rate limit"
+msgid "Unauthenticated requests"
msgstr ""
-msgid "Unauthenticated requests"
+msgid "Unauthenticated web rate limit period in seconds"
msgstr ""
msgid "Undo"
@@ -36070,18 +36559,6 @@ msgstr ""
msgid "Unresolved"
msgstr ""
-msgid "UnscannedProjects|15 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|30 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|5 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|60 or more days"
-msgstr ""
-
msgid "Unschedule job"
msgstr ""
@@ -36301,6 +36778,9 @@ msgstr ""
msgid "UsageQuota|%{help_link_start}Shared runners%{help_link_end} are disabled, so there are no limits set on pipeline usage"
msgstr ""
+msgid "UsageQuota|%{linkTitle} help link"
+msgstr ""
+
msgid "UsageQuota|%{percentageLeft} of purchased storage is available"
msgstr ""
@@ -36310,6 +36790,9 @@ msgstr ""
msgid "UsageQuota|Artifacts is a sum of build and pipeline artifacts."
msgstr ""
+msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
+msgstr ""
+
msgid "UsageQuota|Buy additional minutes"
msgstr ""
@@ -36319,9 +36802,21 @@ msgstr ""
msgid "UsageQuota|CI minutes usage by project"
msgstr ""
+msgid "UsageQuota|Code packages and container images."
+msgstr ""
+
msgid "UsageQuota|Current period usage"
msgstr ""
+msgid "UsageQuota|File attachments and smaller design graphics."
+msgstr ""
+
+msgid "UsageQuota|Git repository, managed by the Gitaly service."
+msgstr ""
+
+msgid "UsageQuota|Includes project registry, artifacts, packages, wiki, uploads and other items."
+msgstr ""
+
msgid "UsageQuota|Increase storage temporarily"
msgstr ""
@@ -36340,6 +36835,9 @@ msgstr ""
msgid "UsageQuota|Packages"
msgstr ""
+msgid "UsageQuota|Pipeline artifacts and job artifacts, created with CI/CD."
+msgstr ""
+
msgid "UsageQuota|Pipelines"
msgstr ""
@@ -36358,6 +36856,9 @@ msgstr ""
msgid "UsageQuota|Seats"
msgstr ""
+msgid "UsageQuota|Shared bits of code and text."
+msgstr ""
+
msgid "UsageQuota|Snippets"
msgstr ""
@@ -36367,6 +36868,12 @@ msgstr ""
msgid "UsageQuota|Storage"
msgstr ""
+msgid "UsageQuota|Storage type"
+msgstr ""
+
+msgid "UsageQuota|There is a known issue with Artifact storage where the total could be incorrect for some projects. More details and progress are available in %{warningLinkStart}the epic%{warningLinkEnd}."
+msgstr ""
+
msgid "UsageQuota|This is the total amount of storage used across your projects within this namespace."
msgstr ""
@@ -36406,6 +36913,9 @@ msgstr ""
msgid "UsageQuota|Usage"
msgstr ""
+msgid "UsageQuota|Usage Breakdown"
+msgstr ""
+
msgid "UsageQuota|Usage Quotas"
msgstr ""
@@ -36430,6 +36940,9 @@ msgstr ""
msgid "UsageQuota|Wiki"
msgstr ""
+msgid "UsageQuota|Wiki content."
+msgstr ""
+
msgid "UsageQuota|Wikis"
msgstr ""
@@ -36646,7 +37159,10 @@ msgstr ""
msgid "User Settings"
msgstr ""
-msgid "User and IP Rate Limits"
+msgid "User and IP rate limits"
+msgstr ""
+
+msgid "User does not have a pending request"
msgstr ""
msgid "User identity was successfully created."
@@ -36943,6 +37459,9 @@ msgstr ""
msgid "Users can launch a development environment from a GitLab browser tab when the %{linkStart}Gitpod%{linkEnd} integration is enabled."
msgstr ""
+msgid "Users can reactivate their account by signing in."
+msgstr ""
+
msgid "Users can render diagrams in AsciiDoc, Markdown, reStructuredText, and Textile documents using Kroki."
msgstr ""
@@ -36958,6 +37477,9 @@ msgstr ""
msgid "Users requesting access to"
msgstr ""
+msgid "Users to exclude from the rate limit"
+msgstr ""
+
msgid "Users were successfully added."
msgstr ""
@@ -36979,6 +37501,9 @@ msgstr ""
msgid "UsersSelect|Unassigned"
msgstr ""
+msgid "Uses GitLab as a lightweight alternative to Sentry."
+msgstr ""
+
msgid "Using %{code_start}::%{code_end} denotes a %{link_start}scoped label set%{link_end}"
msgstr ""
@@ -37009,10 +37534,7 @@ msgstr ""
msgid "Value Stream Analytics can help you determine your team’s velocity"
msgstr ""
-msgid "Value Stream Analytics gives an overview of how much time it takes to go from idea to production in your project."
-msgstr ""
-
-msgid "Value may contain a variable reference"
+msgid "Value might contain a variable reference"
msgstr ""
msgid "Value stream"
@@ -37078,10 +37600,10 @@ msgstr ""
msgid "ValueStream|The Default Value Stream cannot be deleted"
msgstr ""
-msgid "Variable"
+msgid "Values that contain the %{codeStart}$%{codeEnd} character can be considered a variable reference and expanded. %{docsLinkStart}Learn more.%{docsLinkEnd}"
msgstr ""
-msgid "Variable references indicated by %{codeStart}$%{codeEnd} may be expanded. If this is not what you want, consider %{docsLinkStart}using a workaround to prevent expansion%{docsLinkEnd}."
+msgid "Variable"
msgstr ""
msgid "Variable will be masked in job logs."
@@ -37489,6 +38011,9 @@ msgstr ""
msgid "Vulnerability|Evidence"
msgstr ""
+msgid "Vulnerability|False positive detected"
+msgstr ""
+
msgid "Vulnerability|File"
msgstr ""
@@ -37531,6 +38056,9 @@ msgstr ""
msgid "Vulnerability|Status"
msgstr ""
+msgid "Vulnerability|The scanner determined this vulnerability to be a false positive. Verify the evaluation before changing its status. %{linkStart}Learn more about false positive detection.%{linkEnd}"
+msgstr ""
+
msgid "Vulnerability|The unmodified response is the original response that had no mutations done to the request"
msgstr ""
@@ -37855,9 +38383,6 @@ msgstr ""
msgid "Welcome to GitLab,%{br_tag}%{name}!"
msgstr ""
-msgid "Welcome to the guided GitLab tour"
-msgstr ""
-
msgid "Welcome, %{name}!"
msgstr ""
@@ -37876,9 +38401,6 @@ msgstr ""
msgid "What are you searching for?"
msgstr ""
-msgid "What describes you best?"
-msgstr ""
-
msgid "What does this command do?"
msgstr ""
@@ -37900,13 +38422,13 @@ msgstr ""
msgid "What is your job title? (optional)"
msgstr ""
-msgid "What will you use this group for?"
+msgid "What templates can I create?"
msgstr ""
-msgid "What's new"
+msgid "What will you use this group for?"
msgstr ""
-msgid "What’s your experience level?"
+msgid "What's new"
msgstr ""
msgid "When a deployment job is successful, skip older deployment jobs that are still pending."
@@ -37918,6 +38440,9 @@ msgstr ""
msgid "When an event in GitLab triggers a webhook, you can use the request details to figure out if something went wrong."
msgstr ""
+msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+msgstr ""
+
msgid "When inactive, an external authentication provider must be used."
msgstr ""
@@ -37942,6 +38467,9 @@ msgstr ""
msgid "When:"
msgstr ""
+msgid "Which API requests are affected?"
+msgstr ""
+
msgid "While it's rare to have no vulnerabilities, it can happen. In any event, we ask that you please double check your settings to make sure you've set up your dashboard correctly."
msgstr ""
@@ -38221,6 +38749,9 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|Work Items"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -38296,6 +38827,9 @@ msgstr ""
msgid "You are already a member of this %{member_source}."
msgstr ""
+msgid "You are already impersonating another user"
+msgstr ""
+
msgid "You are an admin, which means granting access to %{client_name} will allow them to interact with GitLab as an admin as well. Proceed with caution."
msgstr ""
@@ -38398,6 +38932,9 @@ msgstr ""
msgid "You can also use project access tokens with Git to authenticate over HTTP(S). %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "You can always change your URL later"
+msgstr ""
+
msgid "You can always edit this later"
msgstr ""
@@ -38554,10 +39091,10 @@ msgstr ""
msgid "You can’t %{tag_start}edit%{tag_end} files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
-msgid "You could not create a new trigger."
+msgid "You can’t edit files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
-msgid "You didn't renew your subscription for %{strong}%{namespace_name}%{strong_close} so it was downgraded to the free plan."
+msgid "You could not create a new trigger."
msgstr ""
msgid "You do not have any subscriptions yet"
@@ -38725,6 +39262,12 @@ msgstr ""
msgid "You must provide your current password in order to change it."
msgstr ""
+msgid "You must sign in to search for specific projects."
+msgstr ""
+
+msgid "You must sign in to search for specific terms."
+msgstr ""
+
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
@@ -38752,6 +39295,9 @@ msgstr ""
msgid "You need to upload a GitLab project export archive (ending in .gz)."
msgstr ""
+msgid "You need to verify your primary email first before enabling Two-Factor Authentication."
+msgstr ""
+
msgid "You successfully declined the invitation"
msgstr ""
@@ -38860,10 +39406,10 @@ msgstr ""
msgid "Your %{host} account was signed in to from a new location"
msgstr ""
-msgid "Your %{strong}%{plan_name}%{strong_close} subscription for %{strong}%{namespace_name}%{strong_close} will expire on %{strong}%{expires_on}%{strong_close}."
+msgid "Your %{strong}%{plan_name}%{strong_close} subscription expires on %{strong}%{expires_on}%{strong_close}. After that date, you cannot create issues or merge requests, or use many other features."
msgstr ""
-msgid "Your %{strong}%{plan_name}%{strong_close} subscription will expire on %{strong}%{expires_on}%{strong_close}. After that, you will not be able to create issues or merge requests as well as many other features."
+msgid "Your %{strong}%{plan_name}%{strong_close} subscription for %{strong}%{namespace_name}%{strong_close} will expire on %{strong}%{expires_on}%{strong_close}."
msgstr ""
msgid "Your CI/CD configuration syntax is invalid. View Lint tab for more details."
@@ -38887,7 +39433,7 @@ msgstr ""
msgid "Your GPG keys (%{count})"
msgstr ""
-msgid "Your GitLab account has been locked due to an excessive amount of unsuccessful sign in attempts. Your account will automatically unlock in %{duration} or you may click the link below to unlock now."
+msgid "Your GitLab account has been locked due to an excessive number of unsuccessful sign in attempts. You can wait for your account to automatically unlock in %{duration} or you can click the link below to unlock now."
msgstr ""
msgid "Your GitLab account request has been approved!"
@@ -38998,6 +39544,9 @@ msgstr ""
msgid "Your commit email is used for web based operations, such as edits and merges."
msgstr ""
+msgid "Your current password is required to register a two-factor authenticator app."
+msgstr ""
+
msgid "Your dashboard has been copied. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
@@ -39097,6 +39646,9 @@ msgstr ""
msgid "Your project limit is %{limit} projects! Please contact your administrator to increase it"
msgstr ""
+msgid "Your project will be created at:"
+msgstr ""
+
msgid "Your projects"
msgstr ""
@@ -39136,11 +39688,11 @@ msgstr ""
msgid "Your subscription expired!"
msgstr ""
-msgid "Your subscription has been downgraded."
-msgstr ""
-
-msgid "Your subscription will expire in %{remaining_days}."
-msgstr ""
+msgid "Your subscription will expire in %{remaining_days} day."
+msgid_plural "Your subscription will expire in %{remaining_days} days."
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
msgid "Your username is %{username}."
msgstr ""
@@ -39349,6 +39901,9 @@ msgstr ""
msgid "cannot merge"
msgstr ""
+msgid "cannot not be used for user namespace"
+msgstr ""
+
msgid "ciReport|%{degradedNum} degraded"
msgstr ""
@@ -39673,6 +40228,9 @@ msgstr ""
msgid "created %{timeAgo}"
msgstr ""
+msgid "created %{timeAgo} by %{author}"
+msgstr ""
+
msgid "created by"
msgstr ""
@@ -39718,9 +40276,6 @@ msgstr ""
msgid "does not have a supported extension. Only %{extension_list} are supported"
msgstr ""
-msgid "domain is not authorized for sign-up."
-msgstr ""
-
msgid "download it"
msgstr ""
@@ -39739,19 +40294,13 @@ msgstr ""
msgid "email '%{email}' is not a verified email."
msgstr ""
-msgid "email does not match the allowed domain of %{email_domains}"
-msgid_plural "email does not match the allowed domains: %{email_domains}"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-
msgid "enabled"
msgstr ""
msgid "encrypted: needs to be a :required, :optional or :migrating!"
msgstr ""
-msgid "ending with MIME type format is not allowed."
+msgid "ending with a reserved file extension is not allowed."
msgstr ""
msgid "entries cannot be larger than 255 characters"
@@ -39775,6 +40324,9 @@ msgstr ""
msgid "estimateCommand|%{slash_command} overwrites the total estimated time."
msgstr ""
+msgid "example.com"
+msgstr ""
+
msgid "exceeds the limit of %{bytes} bytes"
msgstr ""
@@ -39826,9 +40378,6 @@ msgstr ""
msgid "fork"
msgstr ""
-msgid "fork this project"
-msgstr ""
-
msgid "from"
msgstr ""
@@ -39838,6 +40387,9 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
+msgid "frontmatter"
+msgstr ""
+
msgid "group"
msgstr ""
@@ -39865,6 +40417,9 @@ msgstr ""
msgid "has been completed."
msgstr ""
+msgid "has too deep level of nesting"
+msgstr ""
+
msgid "help"
msgstr ""
@@ -39898,9 +40453,21 @@ msgstr ""
msgid "in"
msgstr ""
+msgid "in Infrastructure :: Kubernetes clusters"
+msgstr ""
+
+msgid "in all GitLab"
+msgstr ""
+
+msgid "in group"
+msgstr ""
+
msgid "in group %{link_to_group}"
msgstr ""
+msgid "in project"
+msgstr ""
+
msgid "in project %{link_to_project}"
msgstr ""
@@ -39943,16 +40510,19 @@ msgstr ""
msgid "is not a valid X509 certificate."
msgstr ""
-msgid "is not allowed since the group is not top-level group."
+msgid "is not allowed for sign-up."
msgstr ""
-msgid "is not allowed. Try again with a different email address, or contact your GitLab admin."
+msgid "is not allowed for this group."
msgstr ""
-msgid "is not allowed. We do not currently support project-level iterations"
+msgid "is not allowed for this project."
msgstr ""
-msgid "is not from an allowed domain."
+msgid "is not allowed since the group is not top-level group."
+msgstr ""
+
+msgid "is not allowed. We do not currently support project-level iterations"
msgstr ""
msgid "is not in the group enforcing Group Managed Account"
@@ -40045,6 +40615,9 @@ msgstr ""
msgid "log in"
msgstr ""
+msgid "managed"
+msgstr ""
+
msgid "manual"
msgstr ""
@@ -40093,6 +40666,9 @@ msgstr ""
msgid "mrWidget| Please restore it or use a different %{missingBranchName} branch"
msgstr ""
+msgid "mrWidget|%{linkStart}Set up now%{linkEnd} to analyze your source code for known security vulnerabilities."
+msgstr ""
+
msgid "mrWidget|%{mergeError}."
msgstr ""
@@ -40174,6 +40750,9 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
+msgid "mrWidget|Create issue to resolve all threads"
+msgstr ""
+
msgid "mrWidget|Delete source branch"
msgstr ""
@@ -40183,12 +40762,18 @@ msgstr ""
msgid "mrWidget|Did not close"
msgstr ""
+msgid "mrWidget|Dismiss"
+msgstr ""
+
msgid "mrWidget|Email patches"
msgstr ""
msgid "mrWidget|Failed to load deployment statistics"
msgstr ""
+msgid "mrWidget|Hide %{widget} details"
+msgstr ""
+
msgid "mrWidget|If the %{missingBranchName} branch exists in your local repository, you can merge this merge request manually using the command line"
msgstr ""
@@ -40285,9 +40870,6 @@ msgstr ""
msgid "mrWidget|Request to merge"
msgstr ""
-msgid "mrWidget|Resolve all threads in new issue"
-msgstr ""
-
msgid "mrWidget|Resolve conflicts"
msgstr ""
@@ -40303,6 +40885,9 @@ msgstr ""
msgid "mrWidget|Revoke approval"
msgstr ""
+msgid "mrWidget|SAST and Secret Detection is not enabled."
+msgstr ""
+
msgid "mrWidget|Set by %{merge_author} to be added to the merge train when the pipeline succeeds"
msgstr ""
@@ -40312,6 +40897,9 @@ msgstr ""
msgid "mrWidget|Set by %{merge_author} to start a merge train when the pipeline succeeds"
msgstr ""
+msgid "mrWidget|Show %{widget} details"
+msgstr ""
+
msgid "mrWidget|The changes were merged into"
msgstr ""
@@ -40324,6 +40912,9 @@ msgstr ""
msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure, or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
msgstr ""
+msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure."
+msgstr ""
+
msgid "mrWidget|The source branch has been deleted"
msgstr ""
@@ -40366,6 +40957,9 @@ msgstr ""
msgid "mrWidget|You can merge after removing denied licenses"
msgstr ""
+msgid "mrWidget|You can only merge once this merge request is approved."
+msgstr ""
+
msgid "mrWidget|Your password"
msgstr ""
@@ -40402,6 +40996,9 @@ msgstr ""
msgid "must be less than the limit of %{tag_limit} tags"
msgstr ""
+msgid "must be set for a project namespace"
+msgstr ""
+
msgid "must be unique by status and elapsed time within a policy"
msgstr ""
@@ -40513,6 +41110,9 @@ msgstr ""
msgid "pipeline"
msgstr ""
+msgid "pipeline schedules documentation"
+msgstr ""
+
msgid "pod_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
msgstr ""
@@ -40564,16 +41164,25 @@ msgstr ""
msgid "project name"
msgstr ""
+msgid "project namespace cannot be the parent of another namespace"
+msgstr ""
+
msgid "projects"
msgstr ""
msgid "quick actions"
msgstr ""
-msgid "reCAPTCHA Private Key"
+msgid "reCAPTCHA"
+msgstr ""
+
+msgid "reCAPTCHA helps prevent credential stuffing."
msgstr ""
-msgid "reCAPTCHA Site Key"
+msgid "reCAPTCHA private key"
+msgstr ""
+
+msgid "reCAPTCHA site key"
msgstr ""
msgid "recent activity"
@@ -40801,6 +41410,9 @@ msgstr ""
msgid "user avatar"
msgstr ""
+msgid "user namespace cannot be the parent of another namespace"
+msgstr ""
+
msgid "user preferences"
msgstr ""
@@ -40894,3 +41506,9 @@ msgstr ""
msgid "your settings"
msgstr ""
+msgid "{group}"
+msgstr ""
+
+msgid "{project}"
+msgstr ""
+
diff --git a/locale/sv_SE/gitlab.po b/locale/sv_SE/gitlab.po
index 1a297be986d..f4d93bf0a8e 100644
--- a/locale/sv_SE/gitlab.po
+++ b/locale/sv_SE/gitlab.po
@@ -14,10 +14,7 @@ msgstr ""
"X-Crowdin-Language: sv-SE\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-09-01 22:34\n"
-
-msgid " %{name}, confirm your email address now! "
-msgstr " %{name}, bekräfta din e-postadress nu! "
+"PO-Revision-Date: 2021-10-04 20:24\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -92,6 +89,16 @@ msgstr ""
msgid "#general, #development"
msgstr ""
+msgid "%d Alert"
+msgid_plural "%d Alerts"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d Alert:"
+msgid_plural "%d Alerts:"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d Approval"
msgid_plural "%d Approvals"
msgstr[0] "%d Godkännande"
@@ -455,7 +462,10 @@ msgstr ""
msgid "%{code_open}Protected:%{code_close} Only exposed to protected branches or tags."
msgstr ""
-msgid "%{commit_author_link} authored %{commit_timeago}"
+msgid "%{commit_author_link} authored %{commit_authored_timeago}"
+msgstr ""
+
+msgid "%{commit_author_link} authored %{commit_authored_timeago} and %{commit_committer_avatar} %{commit_committer_link} committed %{commit_committer_timeago}"
msgstr ""
msgid "%{completedCount} completed weight"
@@ -549,6 +559,15 @@ msgstr ""
msgid "%{doc_link_start}Advanced search%{doc_link_end} is enabled."
msgstr ""
+msgid "%{docs_link_start}Learn about visibility levels.%{docs_link_end}"
+msgstr ""
+
+msgid "%{docs_link_start}What is Large File Storage?%{docs_link_end}"
+msgstr ""
+
+msgid "%{docs_link_start}What is two-factor authentication?%{docs_link_end}"
+msgstr ""
+
msgid "%{due_date} (Past due)"
msgstr "%{due_date} (förfallen)"
@@ -621,9 +640,6 @@ msgstr "%{issuableType} kommer att tas bort! Är du säker?"
msgid "%{issueType} actions"
msgstr ""
-msgid "%{issuesCount} issues with a limit of %{maxIssueCount}"
-msgstr ""
-
msgid "%{issuesSize} with a limit of %{maxIssueCount}"
msgstr ""
@@ -681,6 +697,12 @@ msgstr ""
msgid "%{label_for_message} unavailable"
msgstr ""
+msgid "%{learn_more_link}."
+msgstr ""
+
+msgid "%{lessThan} 1 hour"
+msgstr ""
+
msgid "%{lets_encrypt_link_start}Let's Encrypt%{lets_encrypt_link_end} is a free, automated, and open certificate authority (CA) that issues digital certificates to enable HTTPS (SSL/TLS) for sites."
msgstr ""
@@ -693,15 +715,15 @@ msgstr ""
msgid "%{link_start}Learn more%{link_end} about roles."
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
-msgstr "%{link_start}Läs mer%{link_end} om vilken information som delas med GitLab Inc."
-
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
msgstr ""
msgid "%{link_start}Start the title with %{draft_snippet}%{link_end} to prevent a merge request that is a work in progress from being merged before it's ready."
msgstr ""
+msgid "%{link_start}What information does GitLab Inc. collect?%{link_end}"
+msgstr ""
+
msgid "%{listToShow}, and %{awardsListLength} more"
msgstr ""
@@ -854,7 +876,7 @@ msgid_plural "%{securityScanner} results are not available because a pipeline ha
msgstr[0] ""
msgstr[1] ""
-msgid "%{service_ping_link_start}Learn more%{service_ping_link_end} about what information is shared with GitLab Inc."
+msgid "%{service_ping_link_start}What information is shared with GitLab Inc.?%{service_ping_link_end}"
msgstr ""
msgid "%{size} %{unit}"
@@ -890,6 +912,9 @@ msgstr "%{start} till %{end}"
msgid "%{state} epics"
msgstr ""
+msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
+msgstr ""
+
msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
msgstr ""
@@ -949,11 +974,6 @@ msgstr ""
msgid "%{template_project_id} is unknown or invalid"
msgstr ""
-msgid "%{text} %{files}"
-msgid_plural "%{text} %{files} files"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%{text} is available"
msgstr ""
@@ -1038,9 +1058,6 @@ msgstr ""
msgid "%{wildcards_link_start}Wildcards%{wildcards_link_end} such as %{code_tag_start}v*%{code_tag_end} or %{code_tag_start}*-release%{code_tag_end} are supported."
msgstr ""
-msgid "&lt; 1 hour"
-msgstr "&lt; 1 timme"
-
msgid "'%{data}' at %{location} does not match format: %{format}"
msgstr ""
@@ -1124,9 +1141,6 @@ msgstr "(Ã¥terkallad)"
msgid "(we need your current password to confirm your changes)"
msgstr ""
-msgid "* * * * *"
-msgstr "* * * * *"
-
msgid "+ %{amount} more"
msgstr ""
@@ -1193,10 +1207,10 @@ msgstr "- visa mindre"
msgid "."
msgstr "."
-msgid "0 bytes"
+msgid "/"
msgstr ""
-msgid "0 for unlimited, only effective with remote storage enabled."
+msgid "0 bytes"
msgstr ""
msgid "0t1DgySidms"
@@ -1326,6 +1340,9 @@ msgstr ""
msgid "1000+"
msgstr "1000+"
+msgid "192.168.0.0/24"
+msgstr ""
+
msgid "1st contribution!"
msgstr ""
@@ -1479,9 +1496,6 @@ msgstr ""
msgid "A plain HTML site that uses Netlify for CI/CD instead of GitLab, but still with all the other great GitLab features"
msgstr ""
-msgid "A plain-text response to show to clients that hit the rate limit."
-msgstr ""
-
msgid "A platform value can be web, mob or app."
msgstr ""
@@ -1563,7 +1577,7 @@ msgstr ""
msgid "APIFuzzing|Configure HTTP basic authentication values. Other authentication methods are supported. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
+msgid "APIFuzzing|Customize your project's API fuzzing configuration options and copy the code snippet to your .gitlab-ci.yml file to apply any changes. Note that this tool does not reflect or update your .gitlab-ci.yml file automatically. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
msgstr ""
msgid "APIFuzzing|Enable authentication"
@@ -1626,9 +1640,6 @@ msgstr ""
msgid "APIFuzzing|To prevent a security leak, authentication info must be added as a %{ciVariablesLinkStart}CI variable%{ciVariablesLinkEnd}. As a user with maintainer access rights, you can manage CI variables in the %{ciSettingsLinkStart}Settings%{ciSettingsLinkEnd} area."
msgstr ""
-msgid "APIFuzzing|Use this tool to generate API fuzzing configuration YAML to copy into your .gitlab-ci.yml file. This tool does not reflect or update your .gitlab-ci.yml file automatically."
-msgstr ""
-
msgid "APIFuzzing|Username for basic authentication"
msgstr ""
@@ -1680,9 +1691,6 @@ msgstr ""
msgid "Abuse reports notification email"
msgstr ""
-msgid "Abuse reports will be sent to this address if it is set. Abuse reports are always available in the admin area."
-msgstr ""
-
msgid "Accept invitation"
msgstr ""
@@ -1719,12 +1727,18 @@ msgstr ""
msgid "Access granted"
msgstr ""
+msgid "Access key ID"
+msgstr ""
+
msgid "Access requests"
msgstr ""
msgid "Access to '%{classification_label}' not allowed"
msgstr ""
+msgid "Access tokens expire after 2 hours. A refresh token may be used at any time to generate a new access token. Non-expiring access tokens are deprecated. Clear this setting to enable backward compatibility."
+msgstr ""
+
msgid "AccessDropdown|Deploy Keys"
msgstr ""
@@ -2037,6 +2051,9 @@ msgstr ""
msgid "Add new directory"
msgstr "Lägg till ny katalog"
+msgid "Add new service account"
+msgstr ""
+
msgid "Add or remove previously merged commits"
msgstr ""
@@ -2274,6 +2291,9 @@ msgstr ""
msgid "AdminArea|Features"
msgstr ""
+msgid "AdminArea|Get security updates from GitLab and stay up to date"
+msgstr ""
+
msgid "AdminArea|Groups"
msgstr ""
@@ -2313,6 +2333,12 @@ msgstr ""
msgid "AdminArea|Reporter"
msgstr ""
+msgid "AdminArea|Sign up for the GitLab Security Newsletter to get notified for security updates."
+msgstr ""
+
+msgid "AdminArea|Sign up for the GitLab newsletter"
+msgstr ""
+
msgid "AdminArea|Stop all jobs"
msgstr ""
@@ -2382,9 +2408,15 @@ msgstr ""
msgid "AdminSettings|Disable public access to Pages sites"
msgstr ""
+msgid "AdminSettings|Display a banner on merge requests in projects with no pipelines to initiate steps to add a .gitlab-ci.yml file."
+msgstr ""
+
msgid "AdminSettings|Domain verification is an essential security measure for public GitLab sites. Users are required to demonstrate they control a domain before it is enabled. %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "AdminSettings|Enable pipeline suggestion banner"
+msgstr ""
+
msgid "AdminSettings|Enable shared runners for new projects"
msgstr ""
@@ -2856,10 +2888,10 @@ msgstr ""
msgid "Admin|Quarterly reconciliation will occur on %{qrtlyDate}"
msgstr ""
-msgid "Admin|The number of max seats used for your namespace is currently exceeding the number of seats in your subscription. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgid "Admin|The number of max seats in your namespace exceeds the number of seats in your subscription. On %{qrtlyDate}, quarterly reconciliation occurs and you are automatically billed a prorated amount for the overage. No action is needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice. For more information about the timing of the invoicing process, view the documentation."
msgstr ""
-msgid "Admin|The number of maximum users for your instance is currently exceeding the number of users in license. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgid "Admin|The number of max users in your instance exceeds the number of users in your license. On %{qrtlyDate}, quarterly reconciliation occurs and you are automatically billed a prorated amount for the overage. No action is needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice. For more information about the timing of the invoicing process, view the documentation."
msgstr ""
msgid "Admin|View pending user approvals"
@@ -2880,9 +2912,6 @@ msgstr ""
msgid "Advanced export options"
msgstr ""
-msgid "Advanced permissions, Large File Storage and Two-Factor authentication settings."
-msgstr ""
-
msgid "After a successful password update you will be redirected to login screen."
msgstr ""
@@ -2901,13 +2930,14 @@ msgstr ""
msgid "After you've reviewed these contribution guidelines, you'll be all set to"
msgstr ""
+msgid "Akismet"
+msgstr ""
+
msgid "Akismet API Key"
msgstr ""
-msgid "Alert"
-msgid_plural "Alerts"
-msgstr[0] ""
-msgstr[1] ""
+msgid "Akismet helps prevent the creation of spam issues in public projects."
+msgstr ""
msgid "AlertManagement|Acknowledged"
msgstr ""
@@ -3263,6 +3293,9 @@ msgstr ""
msgid "All (default)"
msgstr ""
+msgid "All GitLab"
+msgstr ""
+
msgid "All Members"
msgstr ""
@@ -3377,6 +3410,9 @@ msgstr ""
msgid "Allow this secondary node to replicate content on Object Storage"
msgstr ""
+msgid "Allow use of licensed EE features"
+msgstr ""
+
msgid "Allow users to dismiss the broadcast message"
msgstr ""
@@ -3452,9 +3488,6 @@ msgstr ""
msgid "Amazon authentication is not %{link_start}correctly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
-msgid "Amount of time (in hours) that users are allowed to skip forced configuration of two-factor authentication"
-msgstr ""
-
msgid "An %{link_start}alert%{link_end} with the same fingerprint is already open. To change the status of this alert, resolve the linked alert."
msgstr ""
@@ -3515,12 +3548,6 @@ msgstr ""
msgid "An error occurred when removing the label."
msgstr ""
-msgid "An error occurred when toggling the notification subscription"
-msgstr ""
-
-msgid "An error occurred when updating the issue weight"
-msgstr ""
-
msgid "An error occurred when updating the title"
msgstr ""
@@ -3569,6 +3596,9 @@ msgstr ""
msgid "An error occurred while enabling Service Desk."
msgstr ""
+msgid "An error occurred while fetching Markdown preview"
+msgstr ""
+
msgid "An error occurred while fetching ancestors"
msgstr ""
@@ -3599,9 +3629,6 @@ msgstr ""
msgid "An error occurred while fetching label colors."
msgstr ""
-msgid "An error occurred while fetching markdown preview"
-msgstr ""
-
msgid "An error occurred while fetching participants"
msgstr ""
@@ -3617,9 +3644,6 @@ msgstr ""
msgid "An error occurred while fetching reference"
msgstr ""
-msgid "An error occurred while fetching sidebar data"
-msgstr ""
-
msgid "An error occurred while fetching tags. Retry the search."
msgstr ""
@@ -3695,6 +3719,9 @@ msgstr ""
msgid "An error occurred while loading merge requests."
msgstr ""
+msgid "An error occurred while loading projects."
+msgstr ""
+
msgid "An error occurred while loading the Needs tab."
msgstr ""
@@ -3929,12 +3956,6 @@ msgstr ""
msgid "Any Milestone"
msgstr ""
-msgid "Any branch"
-msgstr ""
-
-msgid "Any eligible user"
-msgstr ""
-
msgid "Any encrypted tokens"
msgstr ""
@@ -3953,6 +3974,9 @@ msgstr ""
msgid "Any namespace"
msgstr ""
+msgid "App Engine description and apps that are suitable for this deployment target"
+msgstr ""
+
msgid "App ID"
msgstr ""
@@ -4101,6 +4125,11 @@ msgstr ""
msgid "Apply"
msgstr ""
+msgid "Apply %d suggestion"
+msgid_plural "Apply %d suggestions"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Apply a label"
msgstr ""
@@ -4110,13 +4139,10 @@ msgstr ""
msgid "Apply suggestion"
msgstr ""
-msgid "Apply suggestions"
-msgstr ""
-
msgid "Apply template"
msgstr ""
-msgid "Apply this approval rule to any branch or a specific protected branch."
+msgid "Apply this approval rule to all branches or a specific protected branch."
msgstr ""
msgid "Applying"
@@ -4259,9 +4285,6 @@ msgstr ""
msgid "ApprovalSettings|Prevent editing approval rules in projects and merge requests."
msgstr ""
-msgid "ApprovalSettings|Prevent editing approval rules in projects and merge requests. "
-msgstr ""
-
msgid "ApprovalSettings|Remove all approvals when commits are added to the source branch."
msgstr ""
@@ -4277,6 +4300,9 @@ msgstr ""
msgid "ApprovalSettings|This setting is configured at the instance level and can only be changed by an administrator."
msgstr ""
+msgid "ApprovalSettings|This setting is configured in %{groupName} and can only be changed by an administrator or group owner."
+msgstr ""
+
msgid "ApprovalStatusTooltip|Adheres to separation of duties"
msgstr ""
@@ -4763,9 +4789,6 @@ msgstr ""
msgid "Authenticated API rate limit period in seconds"
msgstr ""
-msgid "Authenticated API request rate limit"
-msgstr ""
-
msgid "Authenticated API requests"
msgstr ""
@@ -4775,10 +4798,10 @@ msgstr ""
msgid "Authenticated Git LFS request rate limit"
msgstr ""
-msgid "Authenticated web rate limit period in seconds"
+msgid "Authenticated Git LFS requests"
msgstr ""
-msgid "Authenticated web request rate limit"
+msgid "Authenticated web rate limit period in seconds"
msgstr ""
msgid "Authenticated web requests"
@@ -5156,9 +5179,6 @@ msgstr ""
msgid "Below you will find all the groups that are public."
msgstr ""
-msgid "Beta"
-msgstr ""
-
msgid "Bi-weekly code coverage"
msgstr ""
@@ -5398,6 +5418,21 @@ msgstr ""
msgid "Board scope affects which issues are displayed for anyone who visits this board"
msgstr ""
+msgid "BoardNewEpic|Groups"
+msgstr ""
+
+msgid "BoardNewEpic|Loading groups"
+msgstr ""
+
+msgid "BoardNewEpic|No matching results"
+msgstr ""
+
+msgid "BoardNewEpic|Search groups"
+msgstr ""
+
+msgid "BoardNewEpic|Select a group"
+msgstr ""
+
msgid "BoardNewIssue|No matching results"
msgstr ""
@@ -5475,6 +5510,9 @@ msgstr ""
msgid "Boards|An error occurred while creating the list. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching child groups. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching group projects. Please try again."
msgstr ""
@@ -5807,6 +5845,9 @@ msgstr ""
msgid "Bulk update"
msgstr ""
+msgid "BulkImports|Re-import creates a new group. It does not sync with the existing group."
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -5816,6 +5857,9 @@ msgstr ""
msgid "BulkImport|From source group"
msgstr ""
+msgid "BulkImport|Group import history"
+msgstr ""
+
msgid "BulkImport|Import failed: Destination cannot be a subgroup of the source group. Change the destination and try again."
msgstr ""
@@ -5828,9 +5872,18 @@ msgstr ""
msgid "BulkImport|Importing the group failed"
msgstr ""
+msgid "BulkImport|Last imported to %{link}"
+msgstr ""
+
msgid "BulkImport|Name already exists."
msgstr ""
+msgid "BulkImport|New group"
+msgstr ""
+
+msgid "BulkImport|No history is available"
+msgstr ""
+
msgid "BulkImport|No parent"
msgstr ""
@@ -5843,6 +5896,9 @@ msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} matching filter \"%{filter}\" from %{link}"
msgstr ""
+msgid "BulkImport|Source group"
+msgstr ""
+
msgid "BulkImport|To new group"
msgstr ""
@@ -5852,6 +5908,9 @@ msgstr ""
msgid "BulkImport|You have no groups to import"
msgstr ""
+msgid "BulkImport|Your imported groups will appear here."
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -6094,6 +6153,9 @@ msgstr ""
msgid "Can be manually deployed to"
msgstr ""
+msgid "Can be overridden in each project."
+msgstr ""
+
msgid "Can create groups:"
msgstr ""
@@ -6196,6 +6258,9 @@ msgstr ""
msgid "Cancelling Preview"
msgstr ""
+msgid "Cannot assign a confidential epic to a non-confidential issue. Make the issue confidential and try again"
+msgstr ""
+
msgid "Cannot be assigned to other projects."
msgstr ""
@@ -6247,9 +6312,6 @@ msgstr ""
msgid "Cannot refer to a group %{timebox_type} by an internal id!"
msgstr ""
-msgid "Cannot set confidential epic for a non-confidential issue"
-msgstr ""
-
msgid "Cannot show preview. For previews on sketch files, they must have the file format introduced by Sketch version 43 and above."
msgstr ""
@@ -6487,15 +6549,15 @@ msgstr ""
msgid "Check out, review, and merge locally"
msgstr ""
-msgid "Check the %{docs_link_start}documentation%{docs_link_end}."
-msgstr ""
-
msgid "Check the current instance configuration "
msgstr ""
msgid "Check the elasticsearch.log file to debug why the migration was halted and make any changes before retrying the migration. When you fix the cause of the failure, click \"Retry migration\", and the migration will be scheduled to be retried in the background."
msgstr ""
+msgid "Check with your administrator."
+msgstr ""
+
msgid "Check your Docker images for known vulnerabilities."
msgstr ""
@@ -6526,6 +6588,9 @@ msgstr ""
msgid "Checkout"
msgstr ""
+msgid "Checkout|$%{selectedPlanPrice} per 10 GB storage per pack"
+msgstr ""
+
msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 minutes"
msgstr ""
@@ -6546,17 +6611,23 @@ msgstr ""
msgid "Checkout|%{name}'s GitLab subscription"
msgstr ""
-msgid "Checkout|%{selectedPlanText} plan"
+msgid "Checkout|%{name}'s storage subscription"
msgstr ""
-msgid "Checkout|%{startDate} - %{endDate}"
+msgid "Checkout|%{quantity} GB of storage"
msgstr ""
-msgid "Checkout|%{totalCiMinutes} CI minute"
-msgid_plural "Checkout|%{totalCiMinutes} CI minutes"
+msgid "Checkout|%{quantity} storage pack"
+msgid_plural "Checkout|%{quantity} storage packs"
msgstr[0] ""
msgstr[1] ""
+msgid "Checkout|%{selectedPlanText} plan"
+msgstr ""
+
+msgid "Checkout|%{startDate} - %{endDate}"
+msgstr ""
+
msgid "Checkout|%{totalCiMinutes} CI minutes"
msgstr ""
@@ -6632,6 +6703,9 @@ msgstr ""
msgid "Checkout|Failed to register credit card. Please try again."
msgstr ""
+msgid "Checkout|GB"
+msgstr ""
+
msgid "Checkout|GitLab group"
msgstr ""
@@ -6668,6 +6742,9 @@ msgstr ""
msgid "Checkout|State"
msgstr ""
+msgid "Checkout|Storage packs"
+msgstr ""
+
msgid "Checkout|Street address"
msgstr ""
@@ -6689,6 +6766,9 @@ msgstr ""
msgid "Checkout|Total minutes: %{quantity}"
msgstr ""
+msgid "Checkout|Total storage: %{quantity} GB"
+msgstr ""
+
msgid "Checkout|Users"
msgstr ""
@@ -6698,16 +6778,25 @@ msgstr ""
msgid "Checkout|Your organization"
msgstr ""
+msgid "Checkout|Your storage subscription has the same term as your main subscription, and the price is prorated accordingly."
+msgstr ""
+
msgid "Checkout|Your subscription will be applied to this group"
msgstr ""
msgid "Checkout|Zip code"
msgstr ""
+msgid "Checkout|a storage subscription"
+msgstr ""
+
msgid "Checkout|company or team"
msgstr ""
-msgid "Checkout|x 1,000 minutes per pack = %{strong}"
+msgid "Checkout|minutes"
+msgstr ""
+
+msgid "Checkout|x %{quantity} %{units} per pack ="
msgstr ""
msgid "Cherry-pick this commit"
@@ -7064,6 +7153,9 @@ msgstr ""
msgid "CloneIssue|Cannot clone issue to target project as it is pending deletion."
msgstr ""
+msgid "CloneIssue|Cannot clone issues of '%{issue_type}' type."
+msgstr ""
+
msgid "Cloned this issue to %{path_to_project}."
msgstr ""
@@ -7118,7 +7210,10 @@ msgstr ""
msgid "Closes this %{quick_action_target}."
msgstr ""
-msgid "Cloud licenses can not be removed."
+msgid "Cloud Functions description and apps that are suitable for this deployment target"
+msgstr ""
+
+msgid "Cloud Run description and apps that are suitable for this deployment target"
msgstr ""
msgid "Cluster"
@@ -7145,6 +7240,12 @@ msgstr ""
msgid "ClusterAgents|Access tokens"
msgstr ""
+msgid "ClusterAgents|Agent might not be connected to GitLab"
+msgstr ""
+
+msgid "ClusterAgents|Agent never connected to GitLab"
+msgstr ""
+
msgid "ClusterAgents|Alternative installation methods"
msgstr ""
@@ -7160,6 +7261,12 @@ msgstr ""
msgid "ClusterAgents|Configuration"
msgstr ""
+msgid "ClusterAgents|Connected"
+msgstr ""
+
+msgid "ClusterAgents|Connection status"
+msgstr ""
+
msgid "ClusterAgents|Copy token"
msgstr ""
@@ -7178,6 +7285,9 @@ msgstr ""
msgid "ClusterAgents|For alternative installation methods %{linkStart}go to the documentation%{linkEnd}."
msgstr ""
+msgid "ClusterAgents|For more troubleshooting information go to"
+msgstr ""
+
msgid "ClusterAgents|Go to the repository"
msgstr ""
@@ -7193,18 +7303,30 @@ msgstr ""
msgid "ClusterAgents|Integrate with the GitLab Agent"
msgstr ""
-msgid "ClusterAgents|Last used"
+msgid "ClusterAgents|Last connected %{timeAgo}."
+msgstr ""
+
+msgid "ClusterAgents|Last contact"
msgstr ""
msgid "ClusterAgents|Learn how to create an agent access token"
msgstr ""
+msgid "ClusterAgents|Make sure you are using a valid token."
+msgstr ""
+
msgid "ClusterAgents|Name"
msgstr ""
msgid "ClusterAgents|Never"
msgstr ""
+msgid "ClusterAgents|Never connected"
+msgstr ""
+
+msgid "ClusterAgents|Not connected"
+msgstr ""
+
msgid "ClusterAgents|Read more about getting started"
msgstr ""
@@ -7226,6 +7348,9 @@ msgstr ""
msgid "ClusterAgents|Select which Agent you want to install"
msgstr ""
+msgid "ClusterAgents|The Agent has not been connected in a long time. There might be a connectivity issue. Last contact was %{timeAgo}."
+msgstr ""
+
msgid "ClusterAgents|The GitLab Agent also requires %{linkStart}enabling the Agent Server%{linkEnd}"
msgstr ""
@@ -7253,9 +7378,6 @@ msgstr ""
msgid "ClusterAgents|You will need to create a token to connect to your agent"
msgstr ""
-msgid "ClusterAgent|This feature is only available for premium plans"
-msgstr ""
-
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -7445,9 +7567,6 @@ msgstr ""
msgid "ClusterIntegration|Create Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Create a provision role on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the account and external ID above. %{startMoreInfoLink}More information%{endLink}"
-msgstr ""
-
msgid "ClusterIntegration|Create cluster on"
msgstr ""
@@ -7880,7 +7999,7 @@ msgstr ""
msgid "ClusterIntegration|Subnets"
msgstr ""
-msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provisioned role, first create one on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the above account and external IDs. %{startMoreInfoLink}More information%{endLink}"
+msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provisioned role, first create one on %{awsLinkStart}Amazon Web Services %{awsLinkEnd} using the above account and external IDs. %{moreInfoStart}More information%{moreInfoEnd}"
msgstr ""
msgid "ClusterIntegration|The Kubernetes certificate used to authenticate to the cluster."
@@ -8114,6 +8233,9 @@ msgstr ""
msgid "Collapse replies"
msgstr ""
+msgid "Collapse settings section"
+msgstr ""
+
msgid "Collapse sidebar"
msgstr ""
@@ -8132,6 +8254,9 @@ msgstr ""
msgid "Comma-separated list of email addresses."
msgstr ""
+msgid "Comma-separated list of users allowed to exceed the rate limit."
+msgstr ""
+
msgid "Comma-separated, e.g. '1.1.1.1, 2.2.2.0/24'"
msgstr ""
@@ -8452,6 +8577,9 @@ msgstr ""
msgid "Configure %{repository_checks_link_start}repository checks%{link_end} and %{housekeeping_link_start}housekeeping%{link_end} on repositories."
msgstr ""
+msgid "Configure CAPTCHAs, IP address limits, and other anti-spam measures."
+msgstr ""
+
msgid "Configure Dependency Scanning in `.gitlab-ci.yml` using the GitLab managed template. You can [add variable overrides](https://docs.gitlab.com/ee/user/application_security/dependency_scanning/#customizing-the-dependency-scanning-settings) to customize Dependency Scanning settings."
msgstr ""
@@ -8488,16 +8616,13 @@ msgstr ""
msgid "Configure a %{codeStart}.gitlab-webide.yml%{codeEnd} file in the %{codeStart}.gitlab%{codeEnd} directory to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
msgstr ""
-msgid "Configure existing installation"
-msgstr ""
-
-msgid "Configure limit for notes created per minute by web and API requests."
+msgid "Configure advanced permissions, Large File Storage, and two-factor authentication settings."
msgstr ""
-msgid "Configure limits for Project/Group Import/Export."
+msgid "Configure approvals by authors and committers on all projects."
msgstr ""
-msgid "Configure limits for web and API requests."
+msgid "Configure existing installation"
msgstr ""
msgid "Configure paths to be protected by Rack Attack."
@@ -8512,10 +8637,13 @@ msgstr ""
msgid "Configure settings for Advanced Search with Elasticsearch."
msgstr ""
+msgid "Configure specific limits for Files API requests that supersede the general user and IP rate limits."
+msgstr ""
+
msgid "Configure specific limits for Git LFS requests that supersede the general user and IP rate limits."
msgstr ""
-msgid "Configure specific limits for Packages API requests that supersede the general user and IP rate limits."
+msgid "Configure specific limits for deprecated API requests that supersede the general user and IP rate limits."
msgstr ""
msgid "Configure the %{link} integration."
@@ -8527,6 +8655,9 @@ msgstr ""
msgid "Configure the way a user creates a new account."
msgstr ""
+msgid "Configure via Merge Request"
+msgstr ""
+
msgid "Configure which lists are shown for anyone who visits this board"
msgstr ""
@@ -8995,6 +9126,9 @@ msgstr ""
msgid "Content parsed with %{link}."
msgstr ""
+msgid "ContentEditor|Table of Contents"
+msgstr ""
+
msgid "ContentEditor|You have to provide a renderMarkdown function or a custom serializer"
msgstr ""
@@ -9181,6 +9315,9 @@ msgstr ""
msgid "Copy link to chart"
msgstr ""
+msgid "Copy prefix"
+msgstr ""
+
msgid "Copy reference"
msgstr ""
@@ -9211,6 +9348,9 @@ msgstr ""
msgid "Copy value"
msgstr ""
+msgid "Corpus Management"
+msgstr ""
+
msgid "Corpus Management|Are you sure you want to delete the corpus?"
msgstr ""
@@ -9439,6 +9579,9 @@ msgstr ""
msgid "Create commit"
msgstr ""
+msgid "Create common files more quickly, and standardize their format."
+msgstr ""
+
msgid "Create confidential merge request"
msgstr ""
@@ -9472,6 +9615,9 @@ msgstr ""
msgid "Create issue"
msgstr ""
+msgid "Create issue to resolve all threads"
+msgstr ""
+
msgid "Create iteration"
msgstr ""
@@ -9526,6 +9672,9 @@ msgstr ""
msgid "Create new..."
msgstr ""
+msgid "Create or import your first project"
+msgstr ""
+
msgid "Create project"
msgstr ""
@@ -9883,7 +10032,7 @@ msgstr ""
msgid "Custom notification events"
msgstr ""
-msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notificationLinkStart} notification emails%{notificationLinkEnd}."
+msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notificationLinkStart}notification emails%{notificationLinkEnd}."
msgstr ""
msgid "Custom project templates"
@@ -10082,10 +10231,10 @@ msgid_plural "CycleAnalytics|Showing %{subjectFilterText} and %{selectedLabelsCo
msgstr[0] ""
msgstr[1] ""
-msgid "CycleAnalytics|Showing data for group '%{groupName}' and %{selectedProjectCount} projects from %{startDate} to %{endDate}"
+msgid "CycleAnalytics|Showing data for group '%{groupName}' and %{selectedProjectCount} projects from %{createdAfter} to %{createdBefore}"
msgstr ""
-msgid "CycleAnalytics|Showing data for group '%{groupName}' from %{startDate} to %{endDate}"
+msgid "CycleAnalytics|Showing data for group '%{groupName}' from %{createdAfter} to %{createdBefore}"
msgstr ""
msgid "CycleAnalytics|Stages"
@@ -10319,6 +10468,9 @@ msgstr ""
msgid "DastProfiles|Manage profiles"
msgstr ""
+msgid "DastProfiles|Manage site profiles"
+msgstr ""
+
msgid "DastProfiles|Minimum = 0 (no timeout enabled), Maximum = 2880 minutes"
msgstr ""
@@ -10394,6 +10546,9 @@ msgstr ""
msgid "DastProfiles|Scanner name"
msgstr ""
+msgid "DastProfiles|Schedule"
+msgstr ""
+
msgid "DastProfiles|Select branch"
msgstr ""
@@ -10463,7 +10618,7 @@ msgstr ""
msgid "DastProfiles|Website"
msgstr ""
-msgid "DastProfiles|You can either choose a passive scan or validate the target site in your chosen site profile. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
+msgid "DastProfiles|You can either choose a passive scan or validate the target site from the site profile management page. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
msgstr ""
msgid "DastProfiles|You cannot run an active scan against an unvalidated site."
@@ -10636,7 +10791,7 @@ msgstr ""
msgid "Days to merge"
msgstr ""
-msgid "Deactivate dormant users after 90 days of inactivity. Users can return to active status by signing in to their account. While inactive, a user is not counted as an active user in the instance."
+msgid "Deactivate dormant users after 90 days of inactivity"
msgstr ""
msgid "Dear Administrator,"
@@ -10723,10 +10878,10 @@ msgstr ""
msgid "Define a custom pattern with cron syntax"
msgstr ""
-msgid "Define approval settings."
+msgid "Define approval rules."
msgstr ""
-msgid "Define approval settings. %{linkStart}Learn more.%{linkEnd}"
+msgid "Define approval rules. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "Define custom rules for what constitutes spam, independent of Akismet"
@@ -10735,7 +10890,7 @@ msgstr ""
msgid "Define environments in the deploy stage(s) in %{code_open}.gitlab-ci.yml%{code_close} to track deployments here."
msgstr ""
-msgid "Define how approval rules are applied as a merge request moves toward completion."
+msgid "Define how approval rules are applied to merge requests."
msgstr ""
msgid "Definition"
@@ -10750,6 +10905,12 @@ msgstr ""
msgid "DelayedJobs|Are you sure you want to run %{job_name} immediately? This job will run automatically after it's timer finishes."
msgstr ""
+msgid "DelayedJobs|Are you sure you want to run %{job_name} immediately? This job will run automatically after its timer finishes."
+msgstr ""
+
+msgid "DelayedJobs|Run the delayed job now?"
+msgstr ""
+
msgid "DelayedJobs|Start now"
msgstr ""
@@ -11026,6 +11187,12 @@ msgstr ""
msgid "Dependency proxy image prefix"
msgstr ""
+msgid "DependencyProxy|Create a local proxy for storing frequently used upstream images. %{docLinkStart}Learn more%{docLinkEnd} about dependency proxies."
+msgstr ""
+
+msgid "DependencyProxy|Dependency Proxy"
+msgstr ""
+
msgid "DependencyProxy|Toggle Dependency Proxy"
msgstr ""
@@ -11266,6 +11433,9 @@ msgstr ""
msgid "Deployments"
msgstr ""
+msgid "Deployments to Google Kubernetes Engine can be "
+msgstr ""
+
msgid "Deployments|%{deployments} environment impacted."
msgid_plural "Deployments|%{deployments} environments impacted."
msgstr[0] ""
@@ -11295,6 +11465,9 @@ msgstr ""
msgid "Deployment|success"
msgstr ""
+msgid "Deprecated API rate limits"
+msgstr ""
+
msgid "Deprioritize label"
msgstr ""
@@ -11697,6 +11870,16 @@ msgstr ""
msgid "DiffsCompareBaseBranch|(base)"
msgstr ""
+msgid "Diffs|%d addition"
+msgid_plural "Diffs|%d additions"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Diffs|%d deletion"
+msgid_plural "Diffs|%d deletions"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Diffs|No file name available"
msgstr ""
@@ -11706,9 +11889,17 @@ msgstr ""
msgid "Diffs|Show all unchanged lines"
msgstr ""
+msgid "Diffs|Showing %{dropdownStart}%{count} changed file%{dropdownEnd}"
+msgid_plural "Diffs|Showing %{dropdownStart}%{count} changed files%{dropdownEnd}"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Diffs|Something went wrong while fetching diff lines."
msgstr ""
+msgid "Diffs|with %{additions} and %{deletions}"
+msgstr ""
+
msgid "Direct member"
msgstr ""
@@ -11834,9 +12025,6 @@ msgid_plural "Dismiss %d selected vulnerabilities as"
msgstr[0] ""
msgstr[1] ""
-msgid "Dismiss Value Stream Analytics introduction box"
-msgstr ""
-
msgid "Dismiss merge request promotion"
msgstr ""
@@ -12158,6 +12346,9 @@ msgstr ""
msgid "Edit issues"
msgstr ""
+msgid "Edit merge requests"
+msgstr ""
+
msgid "Edit public deploy key"
msgstr ""
@@ -12233,6 +12424,9 @@ msgstr ""
msgid "Elastic|None. Select projects to index."
msgstr ""
+msgid "Eligible users"
+msgstr ""
+
msgid "Email"
msgstr ""
@@ -12362,6 +12556,9 @@ msgstr ""
msgid "Enable"
msgstr ""
+msgid "Enable Amazon EKS integration"
+msgstr ""
+
msgid "Enable Auto DevOps"
msgstr ""
@@ -12395,6 +12592,9 @@ msgstr ""
msgid "Enable SSL verification"
msgstr ""
+msgid "Enable Service Ping"
+msgstr ""
+
msgid "Enable Snowplow tracking"
msgstr ""
@@ -12425,6 +12625,9 @@ msgstr ""
msgid "Enable authenticated Git LFS request rate limit"
msgstr ""
+msgid "Enable authenticated web request rate limit"
+msgstr ""
+
msgid "Enable authentication"
msgstr ""
@@ -12485,7 +12688,7 @@ msgstr ""
msgid "Enable or disable the Pseudonymizer data collection."
msgstr ""
-msgid "Enable or disable version check and service ping."
+msgid "Enable or disable version check and Service Ping."
msgstr ""
msgid "Enable protected paths rate limit"
@@ -12497,18 +12700,12 @@ msgstr ""
msgid "Enable reCAPTCHA"
msgstr ""
-msgid "Enable reCAPTCHA for login"
-msgstr ""
-
-msgid "Enable reCAPTCHA, Invisible Captcha, Akismet and set IP limits. For reCAPTCHA, we currently only support %{recaptcha_v2_link_start}v2%{recaptcha_v2_link_end}"
+msgid "Enable reCAPTCHA for login."
msgstr ""
msgid "Enable repository checks"
msgstr ""
-msgid "Enable service ping"
-msgstr ""
-
msgid "Enable shared runners for all projects and subgroups in this group."
msgstr ""
@@ -12530,7 +12727,10 @@ msgstr ""
msgid "Enable unauthenticated API request rate limit"
msgstr ""
-msgid "Enable unauthenticated request rate limit"
+msgid "Enable unauthenticated web request rate limit"
+msgstr ""
+
+msgid "Enable user deactivation emails"
msgstr ""
msgid "Enable version check"
@@ -12566,9 +12766,6 @@ msgstr ""
msgid "Enabled sources for code import during project creation. OmniAuth must be configured for GitHub"
msgstr ""
-msgid "Enabling this will only make licensed EE features available to projects if the project namespace's plan includes the feature or if the project is public."
-msgstr ""
-
msgid "Encountered an error while rendering: %{err}"
msgstr ""
@@ -12617,9 +12814,6 @@ msgstr ""
msgid "Enter Admin Mode"
msgstr ""
-msgid "Enter IP address range"
-msgstr ""
-
msgid "Enter a number"
msgstr ""
@@ -12632,9 +12826,6 @@ msgstr ""
msgid "Enter at least three characters to search"
msgstr ""
-msgid "Enter domain"
-msgstr ""
-
msgid "Enter in your Bitbucket Server URL and personal access token below"
msgstr ""
@@ -12821,9 +13012,6 @@ msgstr ""
msgid "Environments|Deployment %{status}"
msgstr ""
-msgid "Environments|Dismiss"
-msgstr ""
-
msgid "Environments|Enable review app"
msgstr ""
@@ -12836,9 +13024,6 @@ msgstr ""
msgid "Environments|Environments are places where code gets deployed, such as staging or production."
msgstr ""
-msgid "Environments|Help us improve environments"
-msgstr ""
-
msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
msgstr ""
@@ -12875,6 +13060,9 @@ msgstr ""
msgid "Environments|Note that this action will stop the environment, but it will %{emphasisStart}not%{emphasisEnd} have an effect on any existing deployment due to no “stop environment action†being defined in the %{ciConfigLinkStart}.gitlab-ci.yml%{ciConfigLinkEnd} file."
msgstr ""
+msgid "Environments|Open"
+msgstr ""
+
msgid "Environments|Open live environment"
msgstr ""
@@ -12914,9 +13102,6 @@ msgstr ""
msgid "Environments|Stopping %{environmentName}"
msgstr ""
-msgid "Environments|Take the survey"
-msgstr ""
-
msgid "Environments|There was an error fetching the logs. Please try again."
msgstr ""
@@ -12938,9 +13123,6 @@ msgstr ""
msgid "Environments|You don't have any environments right now"
msgstr ""
-msgid "Environments|Your feedback helps GitLab make environments better for you and other users. Participate and enter a sweepstake to win a USD 30 gift card."
-msgstr ""
-
msgid "Environments|by %{avatar}"
msgstr ""
@@ -13223,7 +13405,7 @@ msgstr ""
msgid "Error parsing CSV file. Please make sure it has"
msgstr ""
-msgid "Error rendering markdown preview"
+msgid "Error rendering Markdown preview"
msgstr ""
msgid "Error saving label update."
@@ -13271,6 +13453,9 @@ msgstr ""
msgid "Error: %{error_message}"
msgstr ""
+msgid "Error: Couldn't load some or all of the changes."
+msgstr ""
+
msgid "Error: No AWS credentials were supplied"
msgstr ""
@@ -13304,6 +13489,9 @@ msgstr ""
msgid "ErrorTracking|Enable error tracking"
msgstr ""
+msgid "ErrorTracking|Error tracking backend"
+msgstr ""
+
msgid "ErrorTracking|If you self-host Sentry, enter your Sentry instance's full URL. If you use Sentry's hosted solution, enter https://sentry.io"
msgstr ""
@@ -13337,6 +13525,12 @@ msgstr ""
msgid "Escalation policies must have at least one rule"
msgstr ""
+msgid "EscalationPolicies|%{clockIcon} IF alert is not %{alertStatus} in %{minutes}"
+msgstr ""
+
+msgid "EscalationPolicies|%{notificationIcon} THEN %{doAction} %{forScheduleOrUser}"
+msgstr ""
+
msgid "EscalationPolicies|+ Add an additional rule"
msgstr ""
@@ -13379,13 +13573,13 @@ msgstr ""
msgid "EscalationPolicies|Escalation policies"
msgstr ""
-msgid "EscalationPolicies|Escalation rules"
+msgid "EscalationPolicies|Escalation policy %{obstacle} in Project %{project}"
msgstr ""
-msgid "EscalationPolicies|Failed to load oncall-schedules"
+msgid "EscalationPolicies|Escalation rules"
msgstr ""
-msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} %{then} THEN %{doAction} %{scheduleOrUser}"
+msgid "EscalationPolicies|Failed to load oncall-schedules"
msgstr ""
msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} minutes"
@@ -13463,18 +13657,36 @@ msgstr ""
msgid "Every %{action} attempt has failed: %{job_error_message}. Please try again."
msgstr ""
+msgid "Every 3 months"
+msgstr ""
+
+msgid "Every 3 months on the %{day} at %{time} %{timezone}"
+msgstr ""
+
+msgid "Every 6 months"
+msgstr ""
+
+msgid "Every 6 months on the %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Every day"
msgstr ""
msgid "Every day (at %{time})"
msgstr ""
+msgid "Every day at %{time} %{timezone}"
+msgstr ""
+
msgid "Every month"
msgstr ""
msgid "Every month (Day %{day} at %{time})"
msgstr ""
+msgid "Every month on the %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Every three months"
msgstr ""
@@ -13489,6 +13701,15 @@ msgstr[1] ""
msgid "Every week (%{weekday} at %{time})"
msgstr ""
+msgid "Every week on %{day} at %{time} %{timezone}"
+msgstr ""
+
+msgid "Every year"
+msgstr ""
+
+msgid "Every year on %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Everyone"
msgstr ""
@@ -13525,9 +13746,6 @@ msgstr ""
msgid "Exactly one of %{attributes} is required"
msgstr ""
-msgid "Example: %{ip_address}. %{read_more_link}."
-msgstr ""
-
msgid "Example: @sub\\.company\\.com$"
msgstr ""
@@ -13594,13 +13812,13 @@ msgstr ""
msgid "Expand pipeline"
msgstr ""
-msgid "Expand sidebar"
+msgid "Expand settings section"
msgstr ""
-msgid "Expected documents: %{expected_documents}"
+msgid "Expand sidebar"
msgstr ""
-msgid "Experienced"
+msgid "Expected documents: %{expected_documents}"
msgstr ""
msgid "ExperimentSubject|Must have exactly one of User, Namespace, or Project."
@@ -13885,9 +14103,6 @@ msgstr ""
msgid "Failed to load related branches"
msgstr ""
-msgid "Failed to load sidebar lock status"
-msgstr ""
-
msgid "Failed to load stacktrace."
msgstr ""
@@ -14312,6 +14527,9 @@ msgstr ""
msgid "Files"
msgstr ""
+msgid "Files API Rate Limits"
+msgstr ""
+
msgid "Files breadcrumb"
msgstr ""
@@ -15311,6 +15529,9 @@ msgstr ""
msgid "GitLab group: %{source_link}"
msgstr ""
+msgid "GitLab informs you if a new version is available."
+msgstr ""
+
msgid "GitLab is a complete DevOps platform, delivered as a single application, fundamentally changing the way Development, Security, and Ops teams collaborate"
msgstr ""
@@ -15326,7 +15547,7 @@ msgstr ""
msgid "GitLab is open source software to collaborate on code."
msgstr ""
-msgid "GitLab is undergoing maintenance and is operating in a read-only mode."
+msgid "GitLab is undergoing maintenance and is operating in read-only mode."
msgstr ""
msgid "GitLab member or Email address"
@@ -15338,9 +15559,6 @@ msgstr ""
msgid "GitLab project export"
msgstr ""
-msgid "GitLab restart is required to apply changes."
-msgstr ""
-
msgid "GitLab single sign-on URL"
msgstr ""
@@ -15356,9 +15574,6 @@ msgstr ""
msgid "GitLab version"
msgstr ""
-msgid "GitLab will inform you if a new version is available."
-msgstr ""
-
msgid "GitLab will run a background job that will produce pseudonymized CSVs of the GitLab database that will be uploaded to your configured object storage directory."
msgstr ""
@@ -15623,9 +15838,21 @@ msgstr ""
msgid "Go to snippets"
msgstr ""
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check 'Allowed domains for sign-ups'."
+msgstr ""
+
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check 'Email restrictions for sign-ups'."
+msgstr ""
+
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check the 'Domain denylist'."
+msgstr ""
+
msgid "Go to the activity feed"
msgstr ""
+msgid "Go to the group’s 'Settings &gt; General' page, and check 'Restrict membership by email domain'."
+msgstr ""
+
msgid "Go to the milestone list"
msgstr ""
@@ -15662,6 +15889,12 @@ msgstr ""
msgid "Goal of the changes and what reviewers should be aware of"
msgstr ""
+msgid "Google Cloud"
+msgstr ""
+
+msgid "Google Cloud offers several deployment targets. Select the one most suitable for your project."
+msgstr ""
+
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
@@ -15746,9 +15979,6 @@ msgstr ""
msgid "Group ID"
msgstr ""
-msgid "Group ID: %{group_id}"
-msgstr ""
-
msgid "Group Owner must have signed in with SAML before enabling Group Managed Accounts"
msgstr ""
@@ -15923,6 +16153,12 @@ msgstr ""
msgid "GroupImport|Unable to process group import file"
msgstr ""
+msgid "GroupPage|Copy group ID"
+msgstr ""
+
+msgid "GroupPage|Group ID: %{group_id}"
+msgstr ""
+
msgid "GroupRoadmap|%{dateWord} – No end date"
msgstr ""
@@ -15977,6 +16213,9 @@ msgstr ""
msgid "GroupRoadmap|Within 3 years"
msgstr ""
+msgid "GroupSAML|\"persistent\" recommended"
+msgstr ""
+
msgid "GroupSAML|%{strongOpen}Warning%{strongClose} - Enabling %{linkStart}SSO enforcement%{linkEnd} can reduce security risks."
msgstr ""
@@ -16109,6 +16348,9 @@ msgstr ""
msgid "GroupSAML|To be able to prohibit outer forks, you first need to enforce dedicate group managed accounts."
msgstr ""
+msgid "GroupSAML|Use SAML group links to manage group membership using SAML."
+msgstr ""
+
msgid "GroupSAML|Valid SAML Response"
msgstr ""
@@ -16121,13 +16363,10 @@ msgstr ""
msgid "GroupSAML|as %{access_level}"
msgstr ""
-msgid "GroupSAML|must match stored NameID of \"%{extern_uid}\" as we use this to identify users. If the NameID changes users will be unable to sign in."
-msgstr ""
-
-msgid "GroupSAML|should be \"persistent\""
+msgid "GroupSAML|must match stored NameID of \"%{extern_uid}\" to identify user and allow sign in"
msgstr ""
-msgid "GroupSAML|should be a random persistent ID, emails are discouraged"
+msgid "GroupSAML|recommend persistent ID instead of email"
msgstr ""
msgid "GroupSelect|No matching results"
@@ -16142,9 +16381,15 @@ msgstr ""
msgid "GroupSettings|Allow project access token creation"
msgstr ""
+msgid "GroupSettings|Applied to all subgroups unless overridden by a group owner. Groups already added to the project lose access."
+msgstr ""
+
msgid "GroupSettings|Auto DevOps pipeline was updated for the group"
msgstr ""
+msgid "GroupSettings|Available only on the top-level group. Applies to all subgroups. Groups already shared with a group outside %{group} are still shared unless removed manually."
+msgstr ""
+
msgid "GroupSettings|Badges"
msgstr ""
@@ -16196,6 +16441,9 @@ msgstr ""
msgid "GroupSettings|New runners registration token has been generated!"
msgstr ""
+msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgstr ""
+
msgid "GroupSettings|Pipeline settings was updated for the group"
msgstr ""
@@ -16208,12 +16456,15 @@ msgstr ""
msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
-msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups."
+msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups"
msgstr ""
msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
msgstr ""
+msgid "GroupSettings|Prevents group members from being notified if the group is mentioned."
+msgstr ""
+
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
msgstr ""
@@ -16250,21 +16501,6 @@ msgstr ""
msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}."
msgstr ""
-msgid "GroupSettings|This setting is only available on the top-level group and it applies to all subgroups. Groups that have already been shared with a group outside %{group} will still be shared, and this access will have to be revoked manually."
-msgstr ""
-
-msgid "GroupSettings|This setting will be applied to all subgroups unless overridden by a group owner. Groups that already have access to the project will continue to have access unless removed manually."
-msgstr ""
-
-msgid "GroupSettings|This setting will override user notification preferences for all members of the group, subgroups, and projects."
-msgstr ""
-
-msgid "GroupSettings|This setting will prevent group members from being notified if the group is mentioned."
-msgstr ""
-
-msgid "GroupSettings|This setting will prevent group members from forking projects outside of the group."
-msgstr ""
-
msgid "GroupSettings|Transfer group"
msgstr ""
@@ -16382,7 +16618,7 @@ msgstr ""
msgid "GroupsNew|No import options available"
msgstr ""
-msgid "GroupsNew|Not all related objects are migrated, as %{docs_link_start}described here%{docs_link_end}. Please %{feedback_link_start}leave feedback%{feedback_link_end} on this feature."
+msgid "GroupsNew|Not all related objects are migrated. %{docs_link_start}More info%{docs_link_end}."
msgstr ""
msgid "GroupsNew|Personal access token"
@@ -16514,15 +16750,27 @@ msgstr ""
msgid "Hello %{name},"
msgstr ""
-msgid "Hello there"
-msgstr ""
-
msgid "Hello, %{name}!"
msgstr ""
msgid "Hello, %{username}!"
msgstr ""
+msgid "HelloMessage|%{handshake_emoji} Contribute to GitLab: %{contribute_link}"
+msgstr ""
+
+msgid "HelloMessage|%{magnifier_emoji} Create a new GitLab issue: %{new_issue_link}"
+msgstr ""
+
+msgid "HelloMessage|%{rocket_emoji} We like your curiosity! Help us improve GitLab by joining the team: %{jobs_page_link}"
+msgstr ""
+
+msgid "HelloMessage|Does this page need fixes or improvements? Open an issue or contribute a merge request to help make GitLab more lovable. At GitLab, everyone can contribute!"
+msgstr ""
+
+msgid "HelloMessage|Welcome to GitLab!"
+msgstr ""
+
msgid "Help"
msgstr ""
@@ -16532,13 +16780,10 @@ msgstr ""
msgid "Helps prevent bots from creating accounts."
msgstr ""
-msgid "Helps prevent bots from creating issues"
-msgstr ""
-
-msgid "Helps prevent malicious users hide their activity"
+msgid "Helps prevent bots from creating issues."
msgstr ""
-msgid "Helps reduce request volume (e.g. from crawlers or abusive bots)"
+msgid "Helps prevent malicious users hide their activity."
msgstr ""
msgid "Helps reduce request volume (for example, from crawlers or abusive bots)"
@@ -16662,6 +16907,12 @@ msgstr ""
msgid "Housekeeping, export, path, transfer, remove, archive."
msgstr ""
+msgid "How do I configure Akismet?"
+msgstr ""
+
+msgid "How do I configure it?"
+msgstr ""
+
msgid "How do I configure runners?"
msgstr ""
@@ -16683,19 +16934,25 @@ msgstr ""
msgid "How do I set up this service?"
msgstr ""
+msgid "How do I use a web terminal?"
+msgstr ""
+
+msgid "How do I use file templates?"
+msgstr ""
+
msgid "How it works"
msgstr ""
msgid "How many days need to pass between marking entity for deletion and actual removing it."
msgstr ""
-msgid "How many seconds an IP will be counted towards the limit"
+msgid "How many seconds an IP counts toward the IP address limit."
msgstr ""
-msgid "I accept the %{terms_link}"
+msgid "How the job limiter handles jobs exceeding the thresholds specified below. The 'track' mode only logs the jobs. The 'compress' mode compresses the jobs and raises an exception if the compressed size exceeds the limit."
msgstr ""
-msgid "I accept the|Terms of Service and Privacy Policy"
+msgid "I accept the %{terms_link}"
msgstr ""
msgid "I forgot my password"
@@ -16779,13 +17036,16 @@ msgstr ""
msgid "IP Address"
msgstr ""
-msgid "IP expiration time"
+msgid "IP address expiration time"
msgstr ""
-msgid "IP subnet restriction only allowed for top-level groups"
+msgid "IP address restrictions"
msgstr ""
-msgid "IPs per user"
+msgid "IP addresses per user"
+msgstr ""
+
+msgid "IP subnet restriction only allowed for top-level groups"
msgstr ""
msgid "Identifier"
@@ -16800,6 +17060,9 @@ msgstr ""
msgid "If any indexed field exceeds this limit it will be truncated to this number of characters and the rest will not be indexed or searchable. This does not apply to repository and wiki indexing. Setting this to 0 means it is unlimited."
msgstr ""
+msgid "If blank, defaults to %{code_open}Retry later%{code_close}."
+msgstr ""
+
msgid "If blank, set allowable lifetime to %{instance_level_policy_in_words}, as defined by the instance admin. Once set, existing tokens for users in this group may be revoked."
msgstr ""
@@ -16851,6 +17114,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 did not initiate these sign-in attempts, please reach out to your administrator or enable two-factor authentication (2FA) on your account."
+msgstr ""
+
msgid "If you did not initiate this change, please contact your administrator immediately."
msgstr ""
@@ -16942,10 +17208,10 @@ msgstr ""
msgid "Import Projects from Gitea"
msgstr ""
-msgid "Import a project"
+msgid "Import an exported GitLab project"
msgstr ""
-msgid "Import an exported GitLab project"
+msgid "Import and export rate limits"
msgstr ""
msgid "Import failed due to a GitHub error: %{original}"
@@ -16957,12 +17223,18 @@ msgstr ""
msgid "Import from Jira"
msgstr ""
+msgid "Import group"
+msgstr ""
+
msgid "Import group from file"
msgstr ""
msgid "Import groups"
msgstr ""
+msgid "Import history"
+msgstr ""
+
msgid "Import in progress"
msgstr ""
@@ -17026,7 +17298,25 @@ msgstr ""
msgid "Import timed out. Import took longer than %{import_jobs_expiration} seconds"
msgstr ""
-msgid "Import/Export Rate Limits"
+msgid "ImportAProjectModal|Import from a project"
+msgstr ""
+
+msgid "ImportAProjectModal|Import members from another project"
+msgstr ""
+
+msgid "ImportAProjectModal|Import project members"
+msgstr ""
+
+msgid "ImportAProjectModal|Only project members (not group members) are imported, and they get the same permissions as the project you import from."
+msgstr ""
+
+msgid "ImportAProjectModal|Successfully imported"
+msgstr ""
+
+msgid "ImportAProjectModal|Unable to import project members"
+msgstr ""
+
+msgid "ImportAProjectModal|You're importing members to the %{strongStart}%{name}%{strongEnd} project."
msgstr ""
msgid "ImportButtons|Connect repositories from"
@@ -17079,7 +17369,7 @@ msgstr[1] ""
msgid "Importing..."
msgstr ""
-msgid "Import|A repository URL usually ends in a .git suffix, although this is not required. Double check to make sure your repository URL is correct."
+msgid "Import|There is not a valid Git repository at this URL. If your HTTP repository is not publicly accessible, verify your credentials."
msgstr ""
msgid "Improve customer support with Service Desk"
@@ -17088,9 +17378,6 @@ msgstr ""
msgid "Improves Git cloning performance."
msgstr ""
-msgid "In %{time_to_now}"
-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 ""
@@ -17376,7 +17663,7 @@ msgstr ""
msgid "InProductMarketing|Start a GitLab Ultimate trial today in less than one minute, no credit card required."
msgstr ""
-msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no CC required"
+msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no credit card required"
msgstr ""
msgid "InProductMarketing|Start a trial"
@@ -17415,7 +17702,7 @@ msgstr ""
msgid "InProductMarketing|Team up in GitLab for greater efficiency"
msgstr ""
-msgid "InProductMarketing|Team work makes the dream work"
+msgid "InProductMarketing|Team work makes the dream work"
msgstr ""
msgid "InProductMarketing|Test, create, deploy"
@@ -17996,6 +18283,9 @@ msgstr ""
msgid "Integrations|Create new issue in Jira"
msgstr ""
+msgid "Integrations|Create new issue in ZenTao"
+msgstr ""
+
msgid "Integrations|Default settings are inherited from the group level."
msgstr ""
@@ -18089,9 +18379,15 @@ msgstr ""
msgid "Integrations|Search Jira issues"
msgstr ""
+msgid "Integrations|Search ZenTao issues"
+msgstr ""
+
msgid "Integrations|Send notifications about project events to Unify Circuit."
msgstr ""
+msgid "Integrations|Send notifications about project events to a Unify Circuit conversation. %{docs_link}"
+msgstr ""
+
msgid "Integrations|Sign in to add namespaces"
msgstr ""
@@ -18131,6 +18427,9 @@ msgstr ""
msgid "Integrations|You've activated every integration 🎉"
msgstr ""
+msgid "Integrations|ZenTao issues display here when you create issues in your project in ZenTao."
+msgstr ""
+
msgid "Interactive mode"
msgstr ""
@@ -18158,9 +18457,6 @@ msgstr ""
msgid "Interval Pattern"
msgstr ""
-msgid "Introducing Value Stream Analytics"
-msgstr ""
-
msgid "Introducing Your DevOps Report"
msgstr ""
@@ -18257,6 +18553,12 @@ msgstr ""
msgid "Investigate vulnerability: %{title}"
msgstr ""
+msgid "Invisible Captcha"
+msgstr ""
+
+msgid "Invisible Captcha helps prevent the creation of spam accounts. It adds a honeypot field and time-sensitive form submission to the account signup form."
+msgstr ""
+
msgid "Invitation"
msgstr ""
@@ -18710,12 +19012,18 @@ msgstr ""
msgid "Issues"
msgstr ""
+msgid "Issues I've created"
+msgstr ""
+
msgid "Issues Rate Limits"
msgstr ""
msgid "Issues and merge requests"
msgstr ""
+msgid "Issues assigned to me"
+msgstr ""
+
msgid "Issues can be bugs, tasks or ideas to be discussed. Also, issues are searchable and filterable."
msgstr ""
@@ -18827,7 +19135,7 @@ msgstr ""
msgid "Iterations|Create cadence"
msgstr ""
-msgid "Iterations|Create your first iteration"
+msgid "Iterations|Create iteration"
msgstr ""
msgid "Iterations|Delete cadence"
@@ -18836,6 +19144,9 @@ msgstr ""
msgid "Iterations|Delete iteration cadence?"
msgstr ""
+msgid "Iterations|Delete iteration?"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -18869,12 +19180,18 @@ msgstr ""
msgid "Iterations|New iteration cadence"
msgstr ""
+msgid "Iterations|No closed iterations."
+msgstr ""
+
msgid "Iterations|No iteration cadences to show."
msgstr ""
msgid "Iterations|No iterations in cadence."
msgstr ""
+msgid "Iterations|No open iterations."
+msgstr ""
+
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
@@ -18905,6 +19222,9 @@ msgstr ""
msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
msgstr ""
+msgid "Iterations|This will remove the iteration from any issues that are assigned to it."
+msgstr ""
+
msgid "Iterations|Title"
msgstr ""
@@ -18920,15 +19240,9 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "I’m familiar with the basics of DevOps."
-msgstr ""
-
msgid "I’m joining my team who’s already on GitLab"
msgstr ""
-msgid "I’m not familiar with the basics of DevOps."
-msgstr ""
-
msgid "Jaeger URL"
msgstr ""
@@ -19193,6 +19507,9 @@ msgstr ""
msgid "Job"
msgstr ""
+msgid "Job %{jobName}"
+msgstr ""
+
msgid "Job Failed #%{build_id}"
msgstr ""
@@ -19783,9 +20100,6 @@ msgstr ""
msgid "Learn more in the"
msgstr ""
-msgid "Learn more in the|pipeline schedules documentation"
-msgstr ""
-
msgid "Learn more."
msgstr ""
@@ -19897,9 +20211,6 @@ msgstr ""
msgid "Leave Admin Mode"
msgstr ""
-msgid "Leave blank for no limit. Once set, existing personal access tokens may be revoked."
-msgstr ""
-
msgid "Leave edit mode? All unsaved changes will be lost."
msgstr ""
@@ -19945,10 +20256,10 @@ msgstr ""
msgid "LicenseCompliance|Acceptable license to be used in the project"
msgstr ""
-msgid "LicenseCompliance|Add a license"
+msgid "LicenseCompliance|Add license and related policy"
msgstr ""
-msgid "LicenseCompliance|Add license and related policy"
+msgid "LicenseCompliance|Add license policy"
msgstr ""
msgid "LicenseCompliance|Allow"
@@ -20038,6 +20349,9 @@ msgstr ""
msgid "LicenseManagement|Uncategorized"
msgstr ""
+msgid "Licensed Enterprise Edition features can be used if the project namespace's plan includes the feature, or if the project is public."
+msgstr ""
+
msgid "Licensed Features"
msgstr ""
@@ -20104,7 +20418,10 @@ msgstr ""
msgid "Limit namespaces and projects that can be indexed"
msgstr ""
-msgid "Limit sign in from multiple ips"
+msgid "Limit project size at a global, group, and project level. %{link_start}Learn more%{link_end}."
+msgstr ""
+
+msgid "Limit sign in from multiple IP addresses"
msgstr ""
msgid "Limit the number of concurrent operations this secondary site can run in the background."
@@ -20116,11 +20433,17 @@ msgstr ""
msgid "Limit the number of issues and epics per minute a user can create through web and API requests."
msgstr ""
+msgid "Limit the size of Sidekiq jobs stored in Redis."
+msgstr ""
+
msgid "Limited to showing %d event at most"
msgid_plural "Limited to showing %d events at most"
msgstr[0] ""
msgstr[1] ""
+msgid "Limiting mode"
+msgstr ""
+
msgid "Line changes"
msgstr ""
@@ -20190,9 +20513,6 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
-msgid "List of users to be excluded from the limit"
-msgstr ""
-
msgid "List options"
msgstr ""
@@ -20232,9 +20552,6 @@ msgstr ""
msgid "Loading functions timed out. Please reload the page to try again."
msgstr ""
-msgid "Loading issues"
-msgstr ""
-
msgid "Loading more"
msgstr ""
@@ -20526,6 +20843,9 @@ msgstr ""
msgid "Marked For Deletion At - %{deletion_time}"
msgstr ""
+msgid "Marked as ready. Merging is now allowed."
+msgstr ""
+
msgid "Marked this %{noun} as a draft."
msgstr ""
@@ -20598,52 +20918,22 @@ msgstr ""
msgid "Max 100,000 events"
msgstr ""
-msgid "Max 20 characters"
-msgstr ""
-
-msgid "Max Group Export Download requests per minute per user"
-msgstr ""
-
-msgid "Max Group Export requests per minute per user"
-msgstr ""
-
-msgid "Max Group Import requests per minute per user"
-msgstr ""
-
-msgid "Max Project Export Download requests per minute per user"
-msgstr ""
-
-msgid "Max Project Export requests per minute per user"
-msgstr ""
-
-msgid "Max Project Import requests per minute per user"
-msgstr ""
-
-msgid "Max authenticated API requests per period per user"
-msgstr ""
-
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
-msgid "Max authenticated web requests per period per user"
-msgstr ""
-
msgid "Max file size is 200 KB."
msgstr ""
-msgid "Max requests per minute per user"
-msgstr ""
-
msgid "Max role"
msgstr ""
msgid "Max session time"
msgstr ""
-msgid "Max unauthenticated requests per period per IP"
+msgid "MaxBuilds"
msgstr ""
-msgid "MaxBuilds"
+msgid "Maximum 20 characters"
msgstr ""
msgid "Maximum Conan package file size in bytes"
@@ -20679,6 +20969,12 @@ msgstr ""
msgid "Maximum attachment size (MB)"
msgstr ""
+msgid "Maximum authenticated API requests per rate limit period per user"
+msgstr ""
+
+msgid "Maximum authenticated web requests per rate limit period per user"
+msgstr ""
+
msgid "Maximum bulk request size (MiB)"
msgstr ""
@@ -20724,6 +21020,15 @@ msgstr ""
msgid "Maximum files in a diff"
msgstr ""
+msgid "Maximum group export download requests per minute"
+msgstr ""
+
+msgid "Maximum group export requests per minute"
+msgstr ""
+
+msgid "Maximum group import requests per minute"
+msgstr ""
+
msgid "Maximum import size"
msgstr ""
@@ -20760,7 +21065,7 @@ msgstr ""
msgid "Maximum number of projects."
msgstr ""
-msgid "Maximum number of unique IPs per user"
+msgid "Maximum number of unique IP addresses per user."
msgstr ""
msgid "Maximum page reached"
@@ -20769,12 +21074,24 @@ msgstr ""
msgid "Maximum page size"
msgstr ""
+msgid "Maximum project export download requests per minute"
+msgstr ""
+
+msgid "Maximum project export requests per minute"
+msgstr ""
+
+msgid "Maximum project import requests per minute"
+msgstr ""
+
msgid "Maximum push size"
msgstr ""
msgid "Maximum push size (MB)"
msgstr ""
+msgid "Maximum requests per minute"
+msgstr ""
+
msgid "Maximum running slices"
msgstr ""
@@ -20802,10 +21119,16 @@ msgstr ""
msgid "Maximum time between updates that a mirror can have when scheduled to synchronize."
msgstr ""
-msgid "Maximum time for web terminal websocket connection (in seconds). 0 for unlimited."
+msgid "Maximum time that users are allowed to skip the setup of two-factor authentication (in hours). Set to 0 (zero) to enforce at next sign in."
msgstr ""
-msgid "Maximum time that users are allowed to skip the setup of two-factor authentication (in hours). Set to 0 (zero) to enforce at next sign in."
+msgid "Maximum time, in seconds, for a web terminal websocket connection. 0 for unlimited."
+msgstr ""
+
+msgid "Maximum unauthenticated API requests per rate limit period per IP"
+msgstr ""
+
+msgid "Maximum unauthenticated web requests per rate limit period per IP"
msgstr ""
msgid "May"
@@ -20823,9 +21146,6 @@ msgstr ""
msgid "Medium vulnerabilities present"
msgstr ""
-msgid "Member lock"
-msgstr ""
-
msgid "Member since"
msgstr ""
@@ -20862,6 +21182,9 @@ msgstr ""
msgid "Members of a group may only view projects they have permission to access"
msgstr ""
+msgid "Membership"
+msgstr ""
+
msgid "Members|%{time} by %{user}"
msgstr ""
@@ -20922,9 +21245,6 @@ msgstr ""
msgid "Members|Expiration date updated successfully."
msgstr ""
-msgid "Members|Expired"
-msgstr ""
-
msgid "Members|Filter members"
msgstr ""
@@ -20940,9 +21260,6 @@ msgstr ""
msgid "Members|Membership"
msgstr ""
-msgid "Members|No expiration set"
-msgstr ""
-
msgid "Members|Remove \"%{groupName}\""
msgstr ""
@@ -20964,9 +21281,6 @@ msgstr ""
msgid "Members|Search invited"
msgstr ""
-msgid "Members|in %{time}"
-msgstr ""
-
msgid "Member|Deny access"
msgstr ""
@@ -21042,9 +21356,6 @@ msgstr ""
msgid "Merge request %{mr_link} was reviewed by %{mr_author}"
msgstr ""
-msgid "Merge request (MR) approvals"
-msgstr ""
-
msgid "Merge request analytics"
msgstr ""
@@ -21066,12 +21377,21 @@ msgstr ""
msgid "Merge requests"
msgstr ""
+msgid "Merge requests I've created"
+msgstr ""
+
msgid "Merge requests are a place to propose changes you've made to a project and discuss those changes with others"
msgstr ""
msgid "Merge requests are read-only in a secondary Geo node"
msgstr ""
+msgid "Merge requests assigned to me"
+msgstr ""
+
+msgid "Merge requests that I'm a reviewer"
+msgstr ""
+
msgid "Merge the branch and fix any conflicts that come up"
msgstr ""
@@ -21132,10 +21452,10 @@ msgstr ""
msgid "MergeRequests|An error occurred while saving the draft comment."
msgstr ""
-msgid "MergeRequests|Failed to squash. Should be done manually."
+msgid "MergeRequests|Create issue to resolve thread"
msgstr ""
-msgid "MergeRequests|Resolve this thread in a new issue"
+msgid "MergeRequests|Failed to squash. Should be done manually."
msgstr ""
msgid "MergeRequests|Saving the comment failed"
@@ -21949,6 +22269,9 @@ msgstr ""
msgid "MoveIssue|Cannot move issue to project it originates from!"
msgstr ""
+msgid "MoveIssue|Cannot move issues of '%{issue_type}' type."
+msgstr ""
+
msgid "Moved issue to %{label} column in the board."
msgstr ""
@@ -22074,6 +22397,15 @@ 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. To learn more about reducing storage capacity please visit our docs."
msgstr ""
+msgid "NamespaceUserCap|Pending users must be reviewed and approved by a group owner. Learn more about %{user_caps_link_start}User Caps%{link_end} and %{users_pending_approval_link_start}Users Pending Approval%{link_end}."
+msgstr ""
+
+msgid "NamespaceUserCap|View pending user approvals"
+msgstr ""
+
+msgid "NamespaceUserCap|Your group has reached its billable member limit"
+msgstr ""
+
msgid "Namespaces"
msgstr ""
@@ -22116,9 +22448,6 @@ msgstr ""
msgid "Network"
msgstr ""
-msgid "Network Policy|New rule"
-msgstr ""
-
msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is inbound from a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
msgstr ""
@@ -22140,16 +22469,13 @@ msgstr ""
msgid "NetworkPolicies|%{strongOpen}any%{strongClose} port"
msgstr ""
-msgid "NetworkPolicies|+ Add alert"
-msgstr ""
-
msgid "NetworkPolicies|.yaml"
msgstr ""
msgid "NetworkPolicies|.yaml mode"
msgstr ""
-msgid "NetworkPolicies|Actions"
+msgid "NetworkPolicies|Add alert"
msgstr ""
msgid "NetworkPolicies|Alerts are intended to be selectively used for a limited number of events that are potentially concerning and warrant a manual review. Alerts should not be used as a substitute for a SIEM or a logging tool. High volume alerts are likely to be dropped so as to preserve the stability of GitLab's integration with Kubernetes."
@@ -22185,9 +22511,6 @@ msgstr ""
msgid "NetworkPolicies|Deny all traffic"
msgstr ""
-msgid "NetworkPolicies|Description"
-msgstr ""
-
msgid "NetworkPolicies|Edit policy"
msgstr ""
@@ -22200,9 +22523,6 @@ msgstr ""
msgid "NetworkPolicies|IP/subnet"
msgstr ""
-msgid "NetworkPolicies|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
-msgstr ""
-
msgid "NetworkPolicies|Invalid or empty policy"
msgstr ""
@@ -22212,19 +22532,16 @@ msgstr ""
msgid "NetworkPolicies|Kubernetes error: %{error}"
msgstr ""
-msgid "NetworkPolicies|Name"
-msgstr ""
-
msgid "NetworkPolicies|Network"
msgstr ""
-msgid "NetworkPolicies|Network traffic"
+msgid "NetworkPolicies|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
msgstr ""
-msgid "NetworkPolicies|New policy"
+msgid "NetworkPolicies|Network policy can be created after the environment is loaded successfully."
msgstr ""
-msgid "NetworkPolicies|No policies detected"
+msgid "NetworkPolicies|Network traffic"
msgstr ""
msgid "NetworkPolicies|None selected"
@@ -22233,21 +22550,12 @@ msgstr ""
msgid "NetworkPolicies|Please %{installLinkStart}install%{installLinkEnd} and %{configureLinkStart}configure a Kubernetes Agent for this project%{configureLinkEnd} to enable alerts."
msgstr ""
-msgid "NetworkPolicies|Policies are a specification of how groups of pods are allowed to communicate with each other's network endpoints."
-msgstr ""
-
msgid "NetworkPolicies|Policy %{policyName} was successfully changed"
msgstr ""
msgid "NetworkPolicies|Policy definition"
msgstr ""
-msgid "NetworkPolicies|Policy editor"
-msgstr ""
-
-msgid "NetworkPolicies|Policy preview"
-msgstr ""
-
msgid "NetworkPolicies|Rule"
msgstr ""
@@ -22257,9 +22565,6 @@ msgstr ""
msgid "NetworkPolicies|Rule mode is unavailable for this policy. In some cases, we cannot parse the YAML file back into the rules editor."
msgstr ""
-msgid "NetworkPolicies|Rules"
-msgstr ""
-
msgid "NetworkPolicies|Save changes"
msgstr ""
@@ -22272,9 +22577,6 @@ msgstr ""
msgid "NetworkPolicies|Traffic that does not match any rule will be blocked."
msgstr ""
-msgid "NetworkPolicies|Unable to parse policy"
-msgstr ""
-
msgid "NetworkPolicies|all DNS names"
msgstr ""
@@ -22454,6 +22756,9 @@ msgstr ""
msgid "New issue"
msgstr ""
+msgid "New issue in %{project}"
+msgstr ""
+
msgid "New issue title"
msgstr ""
@@ -22532,7 +22837,7 @@ msgstr ""
msgid "Newest first"
msgstr ""
-msgid "Newly registered users will by default be external"
+msgid "Newly-registered users are external by default"
msgstr ""
msgid "Next"
@@ -22847,8 +23152,10 @@ msgstr ""
msgid "No webhooks found, add one in the form above."
msgstr ""
-msgid "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} to renew your subscription."
-msgstr ""
+msgid "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} day to renew your subscription."
+msgid_plural "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} days to renew your subscription."
+msgstr[0] ""
+msgstr[1] ""
msgid "No. of commits"
msgstr ""
@@ -22865,7 +23172,7 @@ msgstr ""
msgid "Nodes"
msgstr ""
-msgid "Non-admin users can sign in with read-only access and make read-only API requests."
+msgid "Non-admin users are restricted to read-only access, in both GitLab UI and API."
msgstr ""
msgid "None"
@@ -22946,7 +23253,7 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
-msgid "Notes Rate Limits"
+msgid "Notes rate limit"
msgstr ""
msgid "Notes|Are you sure you want to cancel creating this comment?"
@@ -23113,9 +23420,6 @@ msgstr ""
msgid "November"
msgstr ""
-msgid "Novice"
-msgstr ""
-
msgid "Now, personalize your GitLab experience"
msgstr ""
@@ -23284,7 +23588,7 @@ msgstr ""
msgid "OnCallSchedules|For this rotation, on-call will be:"
msgstr ""
-msgid "OnCallSchedules|On-call schedule %{schedule} in Project %{project}"
+msgid "OnCallSchedules|On-call schedule %{obstacle} in Project %{project}"
msgstr ""
msgid "OnCallSchedules|On-call schedules"
@@ -23431,22 +23735,22 @@ msgstr ""
msgid "OnDemandScans|Scanner profile"
msgstr ""
-msgid "OnDemandScans|Select one of the existing profiles"
+msgid "OnDemandScans|Schedule scan"
msgstr ""
-msgid "OnDemandScans|Site profile"
+msgid "OnDemandScans|Select one of the existing profiles"
msgstr ""
-msgid "OnDemandScans|Use existing scanner profile"
+msgid "OnDemandScans|Site profile"
msgstr ""
-msgid "OnDemandScans|Use existing site profile"
+msgid "OnDemandScans|Start time"
msgstr ""
-msgid "OnDemandScans|You can either choose a passive scan or validate the target site in your chosen site profile. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
+msgid "OnDemandScans|Use existing scanner profile"
msgstr ""
-msgid "OnDemandScans|You cannot run an active scan against an unvalidated site."
+msgid "OnDemandScans|Use existing site profile"
msgstr ""
msgid "OnDemandScans|You must create a repository within your project to run an on-demand scan."
@@ -23511,6 +23815,9 @@ msgstr ""
msgid "Only admins can delete project"
msgstr ""
+msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
+msgstr ""
+
msgid "Only include features new to your current subscription tier."
msgstr ""
@@ -23529,6 +23836,12 @@ msgstr ""
msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
+msgid "Only reCAPTCHA v2 is supported:"
+msgstr ""
+
+msgid "Only users from the specified IP address ranges are able to reach this group, including all subgroups, projects, and Git repositories."
+msgstr ""
+
msgid "Only verified users with an email address in any of these domains can be added to the group."
msgstr ""
@@ -23715,9 +24028,6 @@ msgstr ""
msgid "Package Registry"
msgstr ""
-msgid "Package Registry Rate Limits"
-msgstr ""
-
msgid "Package Registry: authenticated API requests"
msgstr ""
@@ -23736,6 +24046,9 @@ msgstr ""
msgid "Package recipe already exists"
msgstr ""
+msgid "Package registry rate limits"
+msgstr ""
+
msgid "Package type"
msgstr ""
@@ -23802,6 +24115,9 @@ msgstr ""
msgid "PackageRegistry|Composer"
msgstr ""
+msgid "PackageRegistry|Composer.json with license: %{license} and version: %{version}"
+msgstr ""
+
msgid "PackageRegistry|Conan"
msgstr ""
@@ -23865,6 +24181,9 @@ msgstr ""
msgid "PackageRegistry|Copy require package include"
msgstr ""
+msgid "PackageRegistry|Copy target SHA"
+msgstr ""
+
msgid "PackageRegistry|Copy yarn command"
msgstr ""
@@ -23931,6 +24250,9 @@ msgstr ""
msgid "PackageRegistry|Install package version"
msgstr ""
+msgid "PackageRegistry|Instance-level"
+msgstr ""
+
msgid "PackageRegistry|Invalid Package: failed metadata extraction"
msgstr ""
@@ -23976,6 +24298,9 @@ msgstr ""
msgid "PackageRegistry|Pip Command"
msgstr ""
+msgid "PackageRegistry|Project-level"
+msgstr ""
+
msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
msgstr ""
@@ -23997,6 +24322,9 @@ msgstr ""
msgid "PackageRegistry|Remove package"
msgstr ""
+msgid "PackageRegistry|Required Python: %{pythonVersion}"
+msgstr ""
+
msgid "PackageRegistry|RubyGems"
msgstr ""
@@ -24039,6 +24367,9 @@ msgstr ""
msgid "PackageRegistry|Source project located at %{link}"
msgstr ""
+msgid "PackageRegistry|Target SHA: %{sha}"
+msgstr ""
+
msgid "PackageRegistry|There are no other versions of this package."
msgstr ""
@@ -24207,6 +24538,18 @@ msgstr ""
msgid "Password was successfully updated. Please sign in again."
msgstr ""
+msgid "PasswordPrompt|Confirm password"
+msgstr ""
+
+msgid "PasswordPrompt|Confirm password to continue"
+msgstr ""
+
+msgid "PasswordPrompt|Password is required"
+msgstr ""
+
+msgid "PasswordPrompt|Please enter your password to confirm"
+msgstr ""
+
msgid "Passwords should be unique and not used for any other sites or services."
msgstr ""
@@ -24234,6 +24577,9 @@ msgstr ""
msgid "Paste project path (i.e. gitlab-org/gitlab)"
msgstr ""
+msgid "Paste this DSN into your Sentry SDK"
+msgstr ""
+
msgid "Paste your public SSH key, which is usually contained in the file '~/.ssh/id_ed25519.pub' or '~/.ssh/id_rsa.pub' and begins with 'ssh-ed25519' or 'ssh-rsa'. Do not paste your private SSH key, as that can compromise your identity."
msgstr ""
@@ -24318,6 +24664,9 @@ msgstr ""
msgid "PerformanceBar|First Contentful Paint"
msgstr ""
+msgid "PerformanceBar|Flamegraph with mode:"
+msgstr ""
+
msgid "PerformanceBar|Frontend resources"
msgstr ""
@@ -24351,6 +24700,15 @@ msgstr ""
msgid "PerformanceBar|Trace"
msgstr ""
+msgid "PerformanceBar|cpu"
+msgstr ""
+
+msgid "PerformanceBar|object"
+msgstr ""
+
+msgid "PerformanceBar|wall"
+msgstr ""
+
msgid "Period in seconds"
msgstr ""
@@ -24579,6 +24937,48 @@ msgstr ""
msgid "PipelineSchedules|Variables"
msgstr ""
+msgid "PipelineSource|API"
+msgstr ""
+
+msgid "PipelineSource|Chat"
+msgstr ""
+
+msgid "PipelineSource|External"
+msgstr ""
+
+msgid "PipelineSource|External Pull Request"
+msgstr ""
+
+msgid "PipelineSource|Merge Request"
+msgstr ""
+
+msgid "PipelineSource|On-Demand DAST Scan"
+msgstr ""
+
+msgid "PipelineSource|On-Demand DAST Validation"
+msgstr ""
+
+msgid "PipelineSource|Parent Pipeline"
+msgstr ""
+
+msgid "PipelineSource|Pipeline"
+msgstr ""
+
+msgid "PipelineSource|Push"
+msgstr ""
+
+msgid "PipelineSource|Schedule"
+msgstr ""
+
+msgid "PipelineSource|Trigger"
+msgstr ""
+
+msgid "PipelineSource|Web"
+msgstr ""
+
+msgid "PipelineSource|Web IDE"
+msgstr ""
+
msgid "PipelineStatusTooltip|Pipeline: %{ciStatus}"
msgstr ""
@@ -24879,46 +25279,7 @@ msgstr ""
msgid "Pipeline|Source"
msgstr ""
-msgid "Pipeline|Source|API"
-msgstr ""
-
-msgid "Pipeline|Source|Chat"
-msgstr ""
-
-msgid "Pipeline|Source|External"
-msgstr ""
-
-msgid "Pipeline|Source|External Pull Request"
-msgstr ""
-
-msgid "Pipeline|Source|Merge Request"
-msgstr ""
-
-msgid "Pipeline|Source|On-Demand DAST Scan"
-msgstr ""
-
-msgid "Pipeline|Source|On-Demand DAST Validation"
-msgstr ""
-
-msgid "Pipeline|Source|Parent Pipeline"
-msgstr ""
-
-msgid "Pipeline|Source|Pipeline"
-msgstr ""
-
-msgid "Pipeline|Source|Push"
-msgstr ""
-
-msgid "Pipeline|Source|Schedule"
-msgstr ""
-
-msgid "Pipeline|Source|Trigger"
-msgstr ""
-
-msgid "Pipeline|Source|Web"
-msgstr ""
-
-msgid "Pipeline|Source|Web IDE"
+msgid "Pipeline|Source|Security Policy"
msgstr ""
msgid "Pipeline|Specify variable values to be used in this run. The values specified in %{linkStart}CI/CD settings%{linkEnd} will be used by default."
@@ -24969,7 +25330,7 @@ msgstr ""
msgid "Pipeline|We are currently unable to fetch pipeline data"
msgstr ""
-msgid "Pipeline|You’re about to stop pipeline %{pipelineId}."
+msgid "Pipeline|You’re about to stop pipeline #%{pipelineId}."
msgstr ""
msgid "Pipeline|for"
@@ -24996,6 +25357,9 @@ msgstr ""
msgid "Plain diff"
msgstr ""
+msgid "Plain-text response to send to clients that hit a rate limit"
+msgstr ""
+
msgid "Plan:"
msgstr ""
@@ -25140,9 +25504,6 @@ msgstr ""
msgid "Please provide attributes to update"
msgstr ""
-msgid "Please provide your username or email address."
-msgstr ""
-
msgid "Please reach out if you have any questions and we'll be happy to assist."
msgstr ""
@@ -25185,9 +25546,6 @@ msgstr ""
msgid "Please set a new password before proceeding."
msgstr ""
-msgid "Please share your feedback about %{featureName} %{linkStart}in this issue%{linkEnd} to help us improve the experience."
-msgstr ""
-
msgid "Please solve the captcha"
msgstr ""
@@ -25365,6 +25723,9 @@ msgstr ""
msgid "Prevent adding new members to project membership within this group"
msgstr ""
+msgid "Prevent auto-stopping"
+msgstr ""
+
msgid "Prevent editing approval rules in projects and merge requests."
msgstr ""
@@ -25377,7 +25738,7 @@ msgstr ""
msgid "Prevent users from changing their profile name"
msgstr ""
-msgid "Prevent users from performing write operations on GitLab while performing maintenance."
+msgid "Prevent users from performing write operations while GitLab maintenance is in progress."
msgstr ""
msgid "Preview"
@@ -25650,6 +26011,9 @@ msgstr ""
msgid "Profiles|Enter your name, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Enter your password to confirm the email change"
+msgstr ""
+
msgid "Profiles|Enter your pronouns to let people know how to refer to you"
msgstr ""
@@ -25884,10 +26248,10 @@ msgstr ""
msgid "Profiles|e.g. My MacBook key"
msgstr ""
-msgid "Profiles|username"
+msgid "Profiles|https://website.com"
msgstr ""
-msgid "Profiles|website.com"
+msgid "Profiles|username"
msgstr ""
msgid "Profiles|your account"
@@ -26130,9 +26494,21 @@ msgstr ""
msgid "ProjectSelect| or group"
msgstr ""
+msgid "ProjectSelect|No matching results"
+msgstr ""
+
msgid "ProjectSelect|Search for project"
msgstr ""
+msgid "ProjectSelect|Search projects"
+msgstr ""
+
+msgid "ProjectSelect|Select a project"
+msgstr ""
+
+msgid "ProjectSelect|There was an error fetching the projects. Please try again."
+msgstr ""
+
msgid "ProjectService|Drone server URL"
msgstr ""
@@ -26220,6 +26596,9 @@ msgstr ""
msgid "ProjectService|Trigger event when a new, unique alert is recorded."
msgstr ""
+msgid "ProjectService|Trigger event when a new, unique vulnerability is recorded. (Note: This feature requires an Ultimate plan.)"
+msgstr ""
+
msgid "ProjectService|Trigger event when a pipeline status changes."
msgstr ""
@@ -26634,9 +27013,15 @@ msgstr ""
msgid "Projects are graded based on the highest severity vulnerability present"
msgstr ""
+msgid "Projects are organized into groups"
+msgstr ""
+
msgid "Projects contributed to"
msgstr ""
+msgid "Projects help you organize your work. They contain your file repository, issues, merge requests, and so much more."
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr ""
@@ -26871,10 +27256,10 @@ msgstr ""
msgid "PrometheusService|Prometheus cluster integration"
msgstr ""
-msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
+msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
msgstr ""
-msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
+msgid "PrometheusService|The ID of the IAP-secured resource."
msgstr ""
msgid "PrometheusService|The Prometheus API base URL."
@@ -27492,6 +27877,9 @@ msgstr ""
msgid "Rate limit"
msgstr ""
+msgid "Rate limits can help reduce request volume (like from crawlers or abusive bots)."
+msgstr ""
+
msgid "Raw blob request rate limit per minute"
msgstr ""
@@ -27504,6 +27892,9 @@ msgstr ""
msgid "Re-authentication required"
msgstr ""
+msgid "Re-import"
+msgstr ""
+
msgid "Re-request review"
msgstr ""
@@ -27525,6 +27916,9 @@ msgstr ""
msgid "Read more about related issues"
msgstr ""
+msgid "Read their documentation."
+msgstr ""
+
msgid "Ready to get started with GitLab? Follow these steps to set up your workspace, plan and commit changes, and deploy your project."
msgstr ""
@@ -27558,6 +27952,9 @@ msgstr ""
msgid "Receive any notifications from GitLab."
msgstr ""
+msgid "Receive notification of abuse reports by email."
+msgstr ""
+
msgid "Receive notifications about your own activity"
msgstr ""
@@ -27701,9 +28098,6 @@ msgstr ""
msgid "Registry setup"
msgstr ""
-msgid "Regulate approvals by authors/committers. Affects all projects."
-msgstr ""
-
msgid "Reindexing Status: %{status} (Slice multiplier: %{multiplier}, Maximum running slices: %{max_slices})"
msgstr ""
@@ -27799,6 +28193,9 @@ msgstr ""
msgid "Release|Something went wrong while saving the release details."
msgstr ""
+msgid "Reload page"
+msgstr ""
+
msgid "Remediations"
msgstr ""
@@ -28081,6 +28478,9 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
+msgid "Repeats"
+msgstr ""
+
msgid "Replace"
msgstr ""
@@ -28443,10 +28843,7 @@ msgstr ""
msgid "Require additional authentication for administrative tasks."
msgstr ""
-msgid "Require all users in this group to setup Two-factor authentication"
-msgstr ""
-
-msgid "Require all users in this group to setup two-factor authentication"
+msgid "Require all users in this group to set up two-factor authentication"
msgstr ""
msgid "Required approvals (%{approvals_given} given)"
@@ -28492,6 +28889,9 @@ msgstr[1] ""
msgid "Requires values to meet regular expression requirements."
msgstr ""
+msgid "Requires you to deploy or set up cloud-hosted Sentry."
+msgstr ""
+
msgid "Requires your primary GitLab email address."
msgstr ""
@@ -28552,9 +28952,6 @@ msgstr ""
msgid "Resolve"
msgstr ""
-msgid "Resolve all threads in new issue"
-msgstr ""
-
msgid "Resolve conflicts"
msgstr ""
@@ -28612,6 +29009,9 @@ msgstr ""
msgid "Response text"
msgstr ""
+msgid "Restart GitLab to apply changes."
+msgstr ""
+
msgid "Restart Terminal"
msgstr ""
@@ -28630,6 +29030,9 @@ msgstr ""
msgid "Restoring the project will prevent the project from being removed on this date and restore people's ability to make changes to it."
msgstr ""
+msgid "Restrict group access by IP address. %{link_start}Learn more%{link_end}."
+msgstr ""
+
msgid "Restrict membership by email domain"
msgstr ""
@@ -28943,6 +29346,9 @@ msgstr ""
msgid "Runners|Runner #%{runner_id}"
msgstr ""
+msgid "Runners|Runner assigned to project."
+msgstr ""
+
msgid "Runners|Runner is offline, last contact was %{runner_contact} ago"
msgstr ""
@@ -28955,6 +29361,9 @@ msgstr ""
msgid "Runners|Runner registration"
msgstr ""
+msgid "Runners|Runner unassigned from project."
+msgstr ""
+
msgid "Runners|Runners"
msgstr ""
@@ -29147,7 +29556,7 @@ msgstr ""
msgid "SastEntryPoints|How do I set up SAST?"
msgstr ""
-msgid "SastEntryPoints|Learn more."
+msgid "SastEntryPoints|Learn more"
msgstr ""
msgid "Satisfied"
@@ -29189,7 +29598,7 @@ msgstr ""
msgid "Save pipeline schedule"
msgstr ""
-msgid "Save space and find images in the container Registry. remove unneeded tags and keep only the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
+msgid "Save storage space by automatically deleting tags from the container registry and keeping the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
msgstr ""
msgid "Saving"
@@ -29363,6 +29772,9 @@ msgstr ""
msgid "Search or filter results…"
msgstr ""
+msgid "Search or jump to..."
+msgstr ""
+
msgid "Search project"
msgstr ""
@@ -29423,16 +29835,16 @@ msgstr ""
msgid "SearchCodeResults|of %{link_to_project}"
msgstr ""
-msgid "SearchResults|Showing %{count} %{scope} for%{term_element}"
+msgid "SearchResults|Showing %{count} %{scope} for %{term_element}"
msgstr ""
-msgid "SearchResults|Showing %{count} %{scope} for%{term_element} in your personal and project snippets"
+msgid "SearchResults|Showing %{count} %{scope} for %{term_element} in your personal and project snippets"
msgstr ""
-msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for%{term_element}"
+msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for %{term_element}"
msgstr ""
-msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for%{term_element} in your personal and project snippets"
+msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for %{term_element} in your personal and project snippets"
msgstr ""
msgid "SearchResults|code result"
@@ -29514,6 +29926,9 @@ msgstr ""
msgid "Secret Detection"
msgstr ""
+msgid "Secret access key"
+msgstr ""
+
msgid "Secret token"
msgstr ""
@@ -29553,9 +29968,6 @@ msgstr ""
msgid "SecurityApprovals|A merge request approval is required when the license compliance report contains a denied license."
msgstr ""
-msgid "SecurityApprovals|Configurable if security scanners are enabled. %{linkStart}Learn more.%{linkEnd}"
-msgstr ""
-
msgid "SecurityApprovals|Coverage-Check"
msgstr ""
@@ -29568,24 +29980,18 @@ msgstr ""
msgid "SecurityApprovals|Learn more about Vulnerability-Check"
msgstr ""
-msgid "SecurityApprovals|License Scanning must be enabled. %{linkStart}Learn more%{linkEnd}."
-msgstr ""
-
msgid "SecurityApprovals|License-Check"
msgstr ""
msgid "SecurityApprovals|Requires approval for Denied licenses. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}More information%{linkEnd}"
+msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "SecurityApprovals|Requires approval for vulnerabilities. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
-msgid "SecurityApprovals|Test coverage must be enabled. %{linkStart}Learn more%{linkEnd}."
-msgstr ""
-
msgid "SecurityApprovals|Vulnerability-Check"
msgstr ""
@@ -29649,6 +30055,12 @@ msgstr ""
msgid "SecurityConfiguration|Immediately begin risk analysis and remediation with application security features. Start with SAST and Secret Detection, available to all plans. Upgrade to Ultimate to get all features, including:"
msgstr ""
+msgid "SecurityConfiguration|Manage corpus"
+msgstr ""
+
+msgid "SecurityConfiguration|Manage corpus files used as mutation sources in coverage fuzzing."
+msgstr ""
+
msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
msgstr ""
@@ -29703,6 +30115,12 @@ msgstr ""
msgid "SecurityOrchestration|Action"
msgstr ""
+msgid "SecurityOrchestration|Actions"
+msgstr ""
+
+msgid "SecurityOrchestration|Add rule"
+msgstr ""
+
msgid "SecurityOrchestration|All policies"
msgstr ""
@@ -29736,9 +30154,6 @@ msgstr ""
msgid "SecurityOrchestration|Network"
msgstr ""
-msgid "SecurityOrchestration|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
-msgstr ""
-
msgid "SecurityOrchestration|New policy"
msgstr ""
@@ -29754,6 +30169,9 @@ msgstr ""
msgid "SecurityOrchestration|Policy editor"
msgstr ""
+msgid "SecurityOrchestration|Policy preview"
+msgstr ""
+
msgid "SecurityOrchestration|Policy status"
msgstr ""
@@ -29763,6 +30181,9 @@ msgstr ""
msgid "SecurityOrchestration|Rule"
msgstr ""
+msgid "SecurityOrchestration|Rules"
+msgstr ""
+
msgid "SecurityOrchestration|Scan Execution"
msgstr ""
@@ -29856,6 +30277,9 @@ msgstr ""
msgid "SecurityReports|Create issue"
msgstr ""
+msgid "SecurityReports|Development vulnerabilities"
+msgstr ""
+
msgid "SecurityReports|Dismiss vulnerability"
msgstr ""
@@ -29871,6 +30295,9 @@ msgstr ""
msgid "SecurityReports|Download results"
msgstr ""
+msgid "SecurityReports|Download scanned URLs"
+msgstr ""
+
msgid "SecurityReports|Download scanned resources"
msgstr ""
@@ -29994,6 +30421,9 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
+msgid "SecurityReports|The Vulnerability Report shows the results of the lastest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "SecurityReports|The security reports below contain one or more vulnerability findings that could not be parsed and were not recorded. Download the artifacts in the job output to investigate. Ensure any security report created conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
msgstr ""
@@ -30135,10 +30565,10 @@ msgstr ""
msgid "Select a repository"
msgstr ""
-msgid "Select a role"
+msgid "Select a repository containing templates for common files."
msgstr ""
-msgid "Select a shared template repository for all projects on this instance."
+msgid "Select a role"
msgstr ""
msgid "Select a template repository"
@@ -30216,6 +30646,9 @@ msgstr ""
msgid "Select project to choose zone"
msgstr ""
+msgid "Select project to create issue"
+msgstr ""
+
msgid "Select projects"
msgstr ""
@@ -30333,6 +30766,9 @@ msgstr ""
msgid "Send emails to help guide new users through the onboarding process."
msgstr ""
+msgid "Send emails to users upon account deactivation."
+msgstr ""
+
msgid "Send message"
msgstr ""
@@ -30351,6 +30787,9 @@ msgstr ""
msgid "Send service data"
msgstr ""
+msgid "Sentry"
+msgstr ""
+
msgid "Sentry API URL"
msgstr ""
@@ -30465,6 +30904,9 @@ msgstr ""
msgid "Service"
msgstr ""
+msgid "Service Accounts keys are required to authorize GitLab to deploy your Google Cloud project."
+msgstr ""
+
msgid "Service Desk"
msgstr ""
@@ -30537,15 +30979,15 @@ msgstr ""
msgid "Set a password on your account to pull or push via %{protocol}."
msgstr ""
-msgid "Set a template repository for projects in this group"
-msgstr ""
-
msgid "Set access permissions for this token."
msgstr ""
msgid "Set an instance-wide domain that will be available to all clusters when installing Knative."
msgstr ""
+msgid "Set any rate limit to %{code_open}0%{code_close} to disable the limit."
+msgstr ""
+
msgid "Set default and restrict visibility levels. Configure import sources and git access protocol."
msgstr ""
@@ -30558,7 +31000,7 @@ msgstr ""
msgid "Set limit to 0 to allow any file size."
msgstr ""
-msgid "Set max session time for web terminal."
+msgid "Set limits for web and API requests."
msgstr ""
msgid "Set milestone"
@@ -30567,15 +31009,18 @@ msgstr ""
msgid "Set new password"
msgstr ""
-msgid "Set notification email for abuse reports."
+msgid "Set parent epic to an epic"
msgstr ""
-msgid "Set parent epic to an epic"
+msgid "Set per-user rate limits for imports and exports of projects and groups."
msgstr ""
msgid "Set projects and maximum size limits, session duration, user options, and check feature availability for namespace plan."
msgstr ""
+msgid "Set rate limits for package registry API requests that supersede the general user and IP rate limits."
+msgstr ""
+
msgid "Set severity"
msgstr ""
@@ -30594,15 +31039,24 @@ msgstr ""
msgid "Set the default branch for this project. All merge requests and commits are made against this branch unless you specify a different one."
msgstr ""
+msgid "Set the default expiration time for job artifacts in all projects. Set to %{code_open}0%{code_close} to never expire artifacts by default. If no unit is written, it defaults to seconds. For example, these are all equivalent: %{code_open}3600%{code_close}, %{code_open}60 minutes%{code_close}, or %{code_open}one hour%{code_close}."
+msgstr ""
+
msgid "Set the due date to %{due_date}."
msgstr ""
msgid "Set the iteration to %{iteration_reference}."
msgstr ""
+msgid "Set the maximum session time for a web terminal."
+msgstr ""
+
msgid "Set the milestone to %{milestone_reference}."
msgstr ""
+msgid "Set the per-user rate limit for notes created by web or API requests."
+msgstr ""
+
msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
msgstr ""
@@ -30804,6 +31258,9 @@ msgstr ""
msgid "Show Pipeline IID"
msgstr ""
+msgid "Show all %{issuable_type}."
+msgstr ""
+
msgid "Show all activity"
msgstr ""
@@ -30855,15 +31312,9 @@ msgstr ""
msgid "Show list"
msgstr ""
-msgid "Show me advanced features"
-msgstr ""
-
msgid "Show me how to add a pipeline"
msgstr ""
-msgid "Show me the basics"
-msgstr ""
-
msgid "Show one file at a time"
msgstr ""
@@ -30904,15 +31355,15 @@ msgstr ""
msgid "Showing %{pageSize} of %{total} %{issuableType}"
msgstr ""
-msgid "Showing %{pageSize} of %{total} issues"
-msgstr ""
-
msgid "Showing all epics"
msgstr ""
msgid "Showing all issues"
msgstr ""
+msgid "Showing data for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
+msgstr ""
+
msgid "Showing data for workflow items created in this date range. Date range cannot exceed %{maxDateRange} days."
msgstr ""
@@ -30952,6 +31403,15 @@ msgstr ""
msgid "Sidebar|Weight"
msgstr ""
+msgid "Sidekiq job compression threshold (bytes)"
+msgstr ""
+
+msgid "Sidekiq job size limit (bytes)"
+msgstr ""
+
+msgid "Sidekiq job size limits"
+msgstr ""
+
msgid "Sign in"
msgstr ""
@@ -31072,6 +31532,9 @@ msgstr ""
msgid "Site profile not found for given parameters"
msgstr ""
+msgid "Sites"
+msgstr ""
+
msgid "Size"
msgstr ""
@@ -31102,19 +31565,22 @@ msgstr ""
msgid "SlackIntegration|Sends notifications about project events to Slack channels."
msgstr ""
-msgid "SlackService|2. Paste the %{strong_open}Token%{strong_close} into the field below"
+msgid "SlackService|1. %{slash_command_link_start}Add a slash command%{slash_command_link_end} in your Slack team using this information:"
msgstr ""
-msgid "SlackService|3. Select the %{strong_open}Active%{strong_close} checkbox, press %{strong_open}Save changes%{strong_close} and start using GitLab inside Slack!"
+msgid "SlackService|2. Paste the token from Slack in the %{strong_open}Token%{strong_close} field below."
msgstr ""
-msgid "SlackService|Fill in the word that works best for your team."
+msgid "SlackService|3. Select the %{strong_open}Active%{strong_close} checkbox, select %{strong_open}Save changes%{strong_close}, and start using slash commands in Slack!"
msgstr ""
-msgid "SlackService|See list of available commands in Slack after setting up this service, by entering"
+msgid "SlackService|After setup, get a list of available Slack slash commands by entering"
msgstr ""
-msgid "SlackService|This service allows users to perform common operations on this project by entering slash commands in Slack."
+msgid "SlackService|Fill in the word that works best for your team."
+msgstr ""
+
+msgid "SlackService|Perform common operations in this project by entering slash commands in Slack."
msgstr ""
msgid "Slice multiplier"
@@ -31180,7 +31646,7 @@ msgstr ""
msgid "Some child epics may be hidden due to applied filters"
msgstr ""
-msgid "Some common domains are not allowed. %{read_more_link}."
+msgid "Some common domains are not allowed. %{learn_more_link}."
msgstr ""
msgid "Some of the designs you tried uploading did not change:"
@@ -31264,9 +31730,6 @@ msgstr ""
msgid "Something went wrong while exporting requirements"
msgstr ""
-msgid "Something went wrong while fetching %{listType} list"
-msgstr ""
-
msgid "Something went wrong while fetching branches"
msgstr ""
@@ -31321,15 +31784,9 @@ msgstr ""
msgid "Something went wrong while merging this merge request. Please try again."
msgstr ""
-msgid "Something went wrong while moving issues."
-msgstr ""
-
msgid "Something went wrong while obtaining the Let's Encrypt certificate."
msgstr ""
-msgid "Something went wrong while performing the action."
-msgstr ""
-
msgid "Something went wrong while promoting the issue to an epic. Please try again."
msgstr ""
@@ -31657,7 +32114,10 @@ msgstr ""
msgid "SourcegraphPreferences|Uses a custom %{linkStart}Sourcegraph instance%{linkEnd}."
msgstr ""
-msgid "Spam Check API Key"
+msgid "Spam Check"
+msgstr ""
+
+msgid "Spam Check API key"
msgstr ""
msgid "Spam Logs"
@@ -31675,7 +32135,7 @@ msgstr ""
msgid "Specified URL cannot be used: \"%{reason}\""
msgstr ""
-msgid "Specify an e-mail address regex pattern to identify default internal users."
+msgid "Specify an email address regex pattern to identify default internal users."
msgstr ""
msgid "Speed up your pipelines with Needs relationships"
@@ -31930,7 +32390,7 @@ msgstr ""
msgid "StatusCheck|An error occurred fetching the status checks."
msgstr ""
-msgid "StatusCheck|Apply this status check to any branch or a specific protected branch."
+msgid "StatusCheck|Apply this status check to all branches or a specific protected branch."
msgstr ""
msgid "StatusCheck|Check for a status response in Merge Requests. Failures do not block merges. %{link_start}Learn more%{link_end}."
@@ -32269,6 +32729,9 @@ msgstr ""
msgid "Subscriptions"
msgstr ""
+msgid "Subscription|Your subscription for %{strong}%{namespace_name}%{strong_close} has expired and you are now on %{pricing_link_start}the GitLab Free tier%{pricing_link_end}. Don't worry, your data is safe. Get in touch with our support team (%{support_email}). They'll gladly help with your subscription renewal."
+msgstr ""
+
msgid "Subtracted"
msgstr ""
@@ -32497,6 +32960,9 @@ msgstr ""
msgid "SuperSonics|Plan"
msgstr ""
+msgid "SuperSonics|Please agree to the Subscription Agreement"
+msgstr ""
+
msgid "SuperSonics|Ready to get started? A GitLab plan is ideal for scaling organizations and for multi team usage."
msgstr ""
@@ -32527,6 +32993,9 @@ msgstr ""
msgid "SuperSonics|The activation code is not valid. Please make sure to copy it exactly from the Customers Portal or confirmation email. Learn more about %{linkStart}activating your subscription%{linkEnd}."
msgstr ""
+msgid "SuperSonics|The activation code should be a 24-character alphanumeric string"
+msgstr ""
+
msgid "SuperSonics|There is a connectivity issue."
msgstr ""
@@ -32569,9 +33038,15 @@ msgstr ""
msgid "SuperSonics|You do not have an active subscription"
msgstr ""
+msgid "SuperSonics|You have successfully added a license that activates on %{date}. Please see the subscription history table below for more details."
+msgstr ""
+
msgid "SuperSonics|You'll be charged for %{trueUpLinkStart}users over license%{trueUpLinkEnd} on a quarterly or annual basis, depending on the terms of your agreement."
msgstr ""
+msgid "SuperSonics|Your future dated license was successfully added"
+msgstr ""
+
msgid "SuperSonics|Your subscription"
msgstr ""
@@ -32824,7 +33299,7 @@ msgstr ""
msgid "Template to append to all Service Desk issues"
msgstr ""
-msgid "TemplateRepository|Select a repository to make its templates available to all projects. %{link_start}What should the repository contain?%{link_end} "
+msgid "TemplateRepository|Create common files more quickly, and standardize their format."
msgstr ""
msgid "Templates"
@@ -33030,7 +33505,7 @@ msgstr ""
msgid "TestCases|Search test cases"
msgstr ""
-msgid "TestCases|Something went wrong while adding test case to Todo."
+msgid "TestCases|Something went wrong while adding test case to a to-do item."
msgstr ""
msgid "TestCases|Something went wrong while creating a test case."
@@ -33042,7 +33517,7 @@ msgstr ""
msgid "TestCases|Something went wrong while fetching test cases list."
msgstr ""
-msgid "TestCases|Something went wrong while marking test case todo as done."
+msgid "TestCases|Something went wrong while marking test case to-do item as done."
msgstr ""
msgid "TestCases|Something went wrong while moving test case."
@@ -33162,7 +33637,7 @@ msgstr ""
msgid "Thanks for your purchase!"
msgstr ""
-msgid "That is ok, I do not want to renew"
+msgid "That's OK, I don't want to renew"
msgstr ""
msgid "That's it, well done!"
@@ -33185,7 +33660,7 @@ msgid_plural "The %{type} contains the following errors:"
msgstr[0] ""
msgstr[1] ""
-msgid "The API key used by GitLab for accessing the Spam Check service endpoint"
+msgid "The API key used by GitLab for accessing the Spam Check service endpoint."
msgstr ""
msgid "The GitLab subscription service (customers.gitlab.com) is currently experiencing an outage. You can monitor the status and get updates at %{linkStart}status.gitlab.com%{linkEnd}."
@@ -33224,9 +33699,6 @@ msgstr ""
msgid "The URL to use for connecting to Elasticsearch. Use a comma-separated list to support clustering (e.g., \"http://localhost:9200, http://localhost:9201\")."
msgstr ""
-msgid "The Vulnerability Report shows the results of the last successful pipeline run on the default branch."
-msgstr ""
-
msgid "The X509 Certificate to use when mutual TLS is required to communicate with the external authorization service. If left blank, the server certificate is still validated when accessing over HTTPS."
msgstr ""
@@ -33284,9 +33756,6 @@ msgstr ""
msgid "The default branch for this project has been changed. Please update your bookmarks."
msgstr ""
-msgid "The default expiration time for job artifacts. 0 for unlimited. The default unit is in seconds, but you can use other units, for example %{code_open}4 mins 2 sec%{code_close}, %{code_open}2h42min%{code_close}."
-msgstr ""
-
msgid "The dependency list details information about the components used within your project."
msgstr ""
@@ -33478,9 +33947,6 @@ msgstr ""
msgid "The merge conflicts for this merge request have already been resolved. Please return to the merge request."
msgstr ""
-msgid "The merge request can now be merged."
-msgstr ""
-
msgid "The metric must be one of %{metrics}."
msgstr ""
@@ -33856,7 +34322,7 @@ msgstr ""
msgid "There was a problem updating the keep latest artifacts setting."
msgstr ""
-msgid "There was an error %{message} todo."
+msgid "There was an error %{message} to-do item."
msgstr ""
msgid "There was an error adding a To Do."
@@ -33895,6 +34361,9 @@ msgstr ""
msgid "There was an error fetching projects"
msgstr ""
+msgid "There was an error fetching search autocomplete suggestions"
+msgstr ""
+
msgid "There was an error fetching stage total counts"
msgstr ""
@@ -34219,6 +34688,9 @@ msgstr ""
msgid "This field is required."
msgstr ""
+msgid "This form is disabled in preview"
+msgstr ""
+
msgid "This group"
msgstr ""
@@ -34240,9 +34712,6 @@ msgstr ""
msgid "This group is linked to a subscription"
msgstr ""
-msgid "This group, including all subgroups, projects and git repositories, will be reachable from only the specified IP address ranges."
-msgstr ""
-
msgid "This group, its subgroups and projects has been scheduled for removal on %{date}."
msgstr ""
@@ -34522,9 +34991,6 @@ msgstr ""
msgid "This user cannot be unlocked manually from GitLab"
msgstr ""
-msgid "This user does not have a pending request"
-msgstr ""
-
msgid "This user has an unconfirmed email address (%{email}). You may force a confirmation."
msgstr ""
@@ -34633,9 +35099,6 @@ msgstr ""
msgid "ThreatMonitoring|Packet Activity"
msgstr ""
-msgid "ThreatMonitoring|Policies"
-msgstr ""
-
msgid "ThreatMonitoring|Requests"
msgstr ""
@@ -34687,6 +35150,12 @@ msgstr ""
msgid "ThreatMonitoring|View documentation"
msgstr ""
+msgid "Threshold in bytes at which to compress Sidekiq job arguments."
+msgstr ""
+
+msgid "Threshold in bytes at which to reject Sidekiq jobs. Set this to 0 to if you don't want to limit Sidekiq jobs."
+msgstr ""
+
msgid "Throughput"
msgstr ""
@@ -34696,6 +35165,9 @@ msgstr ""
msgid "Time"
msgstr ""
+msgid "Time (in hours) that users are allowed to skip forced configuration of two-factor authentication."
+msgstr ""
+
msgid "Time Spent"
msgstr ""
@@ -34762,7 +35234,7 @@ msgstr ""
msgid "TimeTrackingEstimated|Est"
msgstr ""
-msgid "TimeTracking|%{startTag}Spent: %{endTag}%{timeSpentHumanReadable}"
+msgid "TimeTracking|%{spentStart}Spent: %{spentEnd}"
msgstr ""
msgid "TimeTracking|Estimated:"
@@ -34976,6 +35448,9 @@ msgstr ""
msgid "To access this domain create a new DNS record"
msgstr ""
+msgid "To add a custom suffix, set up a Service Desk email address. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "To add an SSH key you need to %{generate_link_start}generate one%{link_end} or use an %{existing_link_start}existing key%{link_end}."
msgstr ""
@@ -34997,13 +35472,16 @@ msgstr ""
msgid "To connect an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To continue using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
+msgstr ""
+
msgid "To continue, you need to select the link in the confirmation email we sent to verify your email address. If you didn't get our email, select %{strongStart}Resend confirmation email.%{strongEnd}"
msgstr ""
msgid "To define internal users, first enable new users set to external"
msgstr ""
-msgid "To enable Registration Features, make sure \"Enable service ping\" is checked."
+msgid "To enable Registration Features, first enable Service Ping."
msgstr ""
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
@@ -35030,7 +35508,7 @@ msgstr ""
msgid "To get started, use the link below to confirm your account."
msgstr ""
-msgid "To help improve GitLab and its user experience, GitLab will periodically collect usage information."
+msgid "To help improve GitLab and its user experience, GitLab periodically collects usage information."
msgstr ""
msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
@@ -35063,7 +35541,7 @@ msgstr ""
msgid "To preserve performance only %{strong_open}%{display_size} of %{real_size}%{strong_close} files are displayed."
msgstr ""
-msgid "To protect this issue's confidentiality, %{forkLink} and set the fork's visibility to private."
+msgid "To protect this issue's confidentiality, %{linkStart}fork this project%{linkEnd} and set the fork's visibility to private."
msgstr ""
msgid "To protect this issue's confidentiality, a private fork of this project was selected."
@@ -35096,12 +35574,15 @@ msgstr ""
msgid "To set up SAML authentication for your group through an identity provider like Azure, Okta, Onelogin, Ping Identity, or your custom SAML 2.0 provider:"
msgstr ""
-msgid "To set up this service:"
+msgid "To set up this integration:"
msgstr ""
msgid "To specify the notification level per project of a group you belong to, you need to visit project page and change notification level there."
msgstr ""
+msgid "To start using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
+msgstr ""
+
msgid "To unsubscribe from this issue, please paste the following link into your browser:"
msgstr ""
@@ -35689,9 +36170,6 @@ msgstr ""
msgid "Unable to fetch branches list, please close the form and try again"
msgstr ""
-msgid "Unable to fetch unscanned projects"
-msgstr ""
-
msgid "Unable to fetch vulnerable projects"
msgstr ""
@@ -35746,6 +36224,15 @@ msgstr ""
msgid "Unable to update this issue at this time."
msgstr ""
+msgid "Unapprove a merge request"
+msgstr ""
+
+msgid "Unapprove the current merge request."
+msgstr ""
+
+msgid "Unapproved the current merge request."
+msgstr ""
+
msgid "Unarchive project"
msgstr ""
@@ -35758,16 +36245,13 @@ msgstr ""
msgid "Unassigned"
msgstr ""
-msgid "Unauthenticated API request rate limit"
-msgstr ""
-
-msgid "Unauthenticated rate limit period in seconds"
+msgid "Unauthenticated API rate limit period in seconds"
msgstr ""
-msgid "Unauthenticated request rate limit"
+msgid "Unauthenticated requests"
msgstr ""
-msgid "Unauthenticated requests"
+msgid "Unauthenticated web rate limit period in seconds"
msgstr ""
msgid "Undo"
@@ -35869,18 +36353,6 @@ msgstr ""
msgid "Unresolved"
msgstr ""
-msgid "UnscannedProjects|15 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|30 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|5 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|60 or more days"
-msgstr ""
-
msgid "Unschedule job"
msgstr ""
@@ -36100,6 +36572,9 @@ msgstr ""
msgid "UsageQuota|%{help_link_start}Shared runners%{help_link_end} are disabled, so there are no limits set on pipeline usage"
msgstr ""
+msgid "UsageQuota|%{linkTitle} help link"
+msgstr ""
+
msgid "UsageQuota|%{percentageLeft} of purchased storage is available"
msgstr ""
@@ -36109,6 +36584,9 @@ msgstr ""
msgid "UsageQuota|Artifacts is a sum of build and pipeline artifacts."
msgstr ""
+msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
+msgstr ""
+
msgid "UsageQuota|Buy additional minutes"
msgstr ""
@@ -36118,9 +36596,21 @@ msgstr ""
msgid "UsageQuota|CI minutes usage by project"
msgstr ""
+msgid "UsageQuota|Code packages and container images."
+msgstr ""
+
msgid "UsageQuota|Current period usage"
msgstr ""
+msgid "UsageQuota|File attachments and smaller design graphics."
+msgstr ""
+
+msgid "UsageQuota|Git repository, managed by the Gitaly service."
+msgstr ""
+
+msgid "UsageQuota|Includes project registry, artifacts, packages, wiki, uploads and other items."
+msgstr ""
+
msgid "UsageQuota|Increase storage temporarily"
msgstr ""
@@ -36139,6 +36629,9 @@ msgstr ""
msgid "UsageQuota|Packages"
msgstr ""
+msgid "UsageQuota|Pipeline artifacts and job artifacts, created with CI/CD."
+msgstr ""
+
msgid "UsageQuota|Pipelines"
msgstr ""
@@ -36157,6 +36650,9 @@ msgstr ""
msgid "UsageQuota|Seats"
msgstr ""
+msgid "UsageQuota|Shared bits of code and text."
+msgstr ""
+
msgid "UsageQuota|Snippets"
msgstr ""
@@ -36166,6 +36662,12 @@ msgstr ""
msgid "UsageQuota|Storage"
msgstr ""
+msgid "UsageQuota|Storage type"
+msgstr ""
+
+msgid "UsageQuota|There is a known issue with Artifact storage where the total could be incorrect for some projects. More details and progress are available in %{warningLinkStart}the epic%{warningLinkEnd}."
+msgstr ""
+
msgid "UsageQuota|This is the total amount of storage used across your projects within this namespace."
msgstr ""
@@ -36205,6 +36707,9 @@ msgstr ""
msgid "UsageQuota|Usage"
msgstr ""
+msgid "UsageQuota|Usage Breakdown"
+msgstr ""
+
msgid "UsageQuota|Usage Quotas"
msgstr ""
@@ -36229,6 +36734,9 @@ msgstr ""
msgid "UsageQuota|Wiki"
msgstr ""
+msgid "UsageQuota|Wiki content."
+msgstr ""
+
msgid "UsageQuota|Wikis"
msgstr ""
@@ -36445,7 +36953,10 @@ msgstr ""
msgid "User Settings"
msgstr ""
-msgid "User and IP Rate Limits"
+msgid "User and IP rate limits"
+msgstr ""
+
+msgid "User does not have a pending request"
msgstr ""
msgid "User identity was successfully created."
@@ -36742,6 +37253,9 @@ msgstr ""
msgid "Users can launch a development environment from a GitLab browser tab when the %{linkStart}Gitpod%{linkEnd} integration is enabled."
msgstr ""
+msgid "Users can reactivate their account by signing in."
+msgstr ""
+
msgid "Users can render diagrams in AsciiDoc, Markdown, reStructuredText, and Textile documents using Kroki."
msgstr ""
@@ -36757,6 +37271,9 @@ msgstr ""
msgid "Users requesting access to"
msgstr ""
+msgid "Users to exclude from the rate limit"
+msgstr ""
+
msgid "Users were successfully added."
msgstr ""
@@ -36778,6 +37295,9 @@ msgstr ""
msgid "UsersSelect|Unassigned"
msgstr ""
+msgid "Uses GitLab as a lightweight alternative to Sentry."
+msgstr ""
+
msgid "Using %{code_start}::%{code_end} denotes a %{link_start}scoped label set%{link_end}"
msgstr ""
@@ -36808,10 +37328,7 @@ msgstr ""
msgid "Value Stream Analytics can help you determine your team’s velocity"
msgstr ""
-msgid "Value Stream Analytics gives an overview of how much time it takes to go from idea to production in your project."
-msgstr ""
-
-msgid "Value may contain a variable reference"
+msgid "Value might contain a variable reference"
msgstr ""
msgid "Value stream"
@@ -36877,10 +37394,10 @@ msgstr ""
msgid "ValueStream|The Default Value Stream cannot be deleted"
msgstr ""
-msgid "Variable"
+msgid "Values that contain the %{codeStart}$%{codeEnd} character can be considered a variable reference and expanded. %{docsLinkStart}Learn more.%{docsLinkEnd}"
msgstr ""
-msgid "Variable references indicated by %{codeStart}$%{codeEnd} may be expanded. If this is not what you want, consider %{docsLinkStart}using a workaround to prevent expansion%{docsLinkEnd}."
+msgid "Variable"
msgstr ""
msgid "Variable will be masked in job logs."
@@ -37285,6 +37802,9 @@ msgstr ""
msgid "Vulnerability|Evidence"
msgstr ""
+msgid "Vulnerability|False positive detected"
+msgstr ""
+
msgid "Vulnerability|File"
msgstr ""
@@ -37327,6 +37847,9 @@ msgstr ""
msgid "Vulnerability|Status"
msgstr ""
+msgid "Vulnerability|The scanner determined this vulnerability to be a false positive. Verify the evaluation before changing its status. %{linkStart}Learn more about false positive detection.%{linkEnd}"
+msgstr ""
+
msgid "Vulnerability|The unmodified response is the original response that had no mutations done to the request"
msgstr ""
@@ -37651,9 +38174,6 @@ msgstr ""
msgid "Welcome to GitLab,%{br_tag}%{name}!"
msgstr ""
-msgid "Welcome to the guided GitLab tour"
-msgstr ""
-
msgid "Welcome, %{name}!"
msgstr ""
@@ -37672,9 +38192,6 @@ msgstr ""
msgid "What are you searching for?"
msgstr ""
-msgid "What describes you best?"
-msgstr ""
-
msgid "What does this command do?"
msgstr ""
@@ -37696,13 +38213,13 @@ msgstr ""
msgid "What is your job title? (optional)"
msgstr ""
-msgid "What will you use this group for?"
+msgid "What templates can I create?"
msgstr ""
-msgid "What's new"
+msgid "What will you use this group for?"
msgstr ""
-msgid "What’s your experience level?"
+msgid "What's new"
msgstr ""
msgid "When a deployment job is successful, skip older deployment jobs that are still pending."
@@ -37714,6 +38231,9 @@ msgstr ""
msgid "When an event in GitLab triggers a webhook, you can use the request details to figure out if something went wrong."
msgstr ""
+msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+msgstr ""
+
msgid "When inactive, an external authentication provider must be used."
msgstr ""
@@ -37737,6 +38257,9 @@ msgstr ""
msgid "When:"
msgstr ""
+msgid "Which API requests are affected?"
+msgstr ""
+
msgid "While it's rare to have no vulnerabilities, it can happen. In any event, we ask that you please double check your settings to make sure you've set up your dashboard correctly."
msgstr ""
@@ -38016,6 +38539,9 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|Work Items"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -38091,6 +38617,9 @@ msgstr ""
msgid "You are already a member of this %{member_source}."
msgstr ""
+msgid "You are already impersonating another user"
+msgstr ""
+
msgid "You are an admin, which means granting access to %{client_name} will allow them to interact with GitLab as an admin as well. Proceed with caution."
msgstr ""
@@ -38193,6 +38722,9 @@ msgstr ""
msgid "You can also use project access tokens with Git to authenticate over HTTP(S). %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "You can always change your URL later"
+msgstr ""
+
msgid "You can always edit this later"
msgstr ""
@@ -38349,10 +38881,10 @@ msgstr ""
msgid "You can’t %{tag_start}edit%{tag_end} files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
-msgid "You could not create a new trigger."
+msgid "You can’t edit files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
-msgid "You didn't renew your subscription for %{strong}%{namespace_name}%{strong_close} so it was downgraded to the free plan."
+msgid "You could not create a new trigger."
msgstr ""
msgid "You do not have any subscriptions yet"
@@ -38520,6 +39052,12 @@ msgstr ""
msgid "You must provide your current password in order to change it."
msgstr ""
+msgid "You must sign in to search for specific projects."
+msgstr ""
+
+msgid "You must sign in to search for specific terms."
+msgstr ""
+
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
@@ -38547,6 +39085,9 @@ msgstr ""
msgid "You need to upload a GitLab project export archive (ending in .gz)."
msgstr ""
+msgid "You need to verify your primary email first before enabling Two-Factor Authentication."
+msgstr ""
+
msgid "You successfully declined the invitation"
msgstr ""
@@ -38655,10 +39196,10 @@ msgstr ""
msgid "Your %{host} account was signed in to from a new location"
msgstr ""
-msgid "Your %{strong}%{plan_name}%{strong_close} subscription for %{strong}%{namespace_name}%{strong_close} will expire on %{strong}%{expires_on}%{strong_close}."
+msgid "Your %{strong}%{plan_name}%{strong_close} subscription expires on %{strong}%{expires_on}%{strong_close}. After that date, you cannot create issues or merge requests, or use many other features."
msgstr ""
-msgid "Your %{strong}%{plan_name}%{strong_close} subscription will expire on %{strong}%{expires_on}%{strong_close}. After that, you will not be able to create issues or merge requests as well as many other features."
+msgid "Your %{strong}%{plan_name}%{strong_close} subscription for %{strong}%{namespace_name}%{strong_close} will expire on %{strong}%{expires_on}%{strong_close}."
msgstr ""
msgid "Your CI/CD configuration syntax is invalid. View Lint tab for more details."
@@ -38682,7 +39223,7 @@ msgstr ""
msgid "Your GPG keys (%{count})"
msgstr ""
-msgid "Your GitLab account has been locked due to an excessive amount of unsuccessful sign in attempts. Your account will automatically unlock in %{duration} or you may click the link below to unlock now."
+msgid "Your GitLab account has been locked due to an excessive number of unsuccessful sign in attempts. You can wait for your account to automatically unlock in %{duration} or you can click the link below to unlock now."
msgstr ""
msgid "Your GitLab account request has been approved!"
@@ -38793,6 +39334,9 @@ msgstr ""
msgid "Your commit email is used for web based operations, such as edits and merges."
msgstr ""
+msgid "Your current password is required to register a two-factor authenticator app."
+msgstr ""
+
msgid "Your dashboard has been copied. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
@@ -38892,6 +39436,9 @@ msgstr ""
msgid "Your project limit is %{limit} projects! Please contact your administrator to increase it"
msgstr ""
+msgid "Your project will be created at:"
+msgstr ""
+
msgid "Your projects"
msgstr ""
@@ -38931,11 +39478,10 @@ msgstr ""
msgid "Your subscription expired!"
msgstr ""
-msgid "Your subscription has been downgraded."
-msgstr ""
-
-msgid "Your subscription will expire in %{remaining_days}."
-msgstr ""
+msgid "Your subscription will expire in %{remaining_days} day."
+msgid_plural "Your subscription will expire in %{remaining_days} days."
+msgstr[0] ""
+msgstr[1] ""
msgid "Your username is %{username}."
msgstr ""
@@ -39142,6 +39688,9 @@ msgstr ""
msgid "cannot merge"
msgstr ""
+msgid "cannot not be used for user namespace"
+msgstr ""
+
msgid "ciReport|%{degradedNum} degraded"
msgstr ""
@@ -39465,6 +40014,9 @@ msgstr ""
msgid "created %{timeAgo}"
msgstr ""
+msgid "created %{timeAgo} by %{author}"
+msgstr ""
+
msgid "created by"
msgstr ""
@@ -39509,9 +40061,6 @@ msgstr ""
msgid "does not have a supported extension. Only %{extension_list} are supported"
msgstr ""
-msgid "domain is not authorized for sign-up."
-msgstr ""
-
msgid "download it"
msgstr ""
@@ -39529,18 +40078,13 @@ msgstr ""
msgid "email '%{email}' is not a verified email."
msgstr ""
-msgid "email does not match the allowed domain of %{email_domains}"
-msgid_plural "email does not match the allowed domains: %{email_domains}"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "enabled"
msgstr ""
msgid "encrypted: needs to be a :required, :optional or :migrating!"
msgstr ""
-msgid "ending with MIME type format is not allowed."
+msgid "ending with a reserved file extension is not allowed."
msgstr ""
msgid "entries cannot be larger than 255 characters"
@@ -39564,6 +40108,9 @@ msgstr ""
msgid "estimateCommand|%{slash_command} overwrites the total estimated time."
msgstr ""
+msgid "example.com"
+msgstr ""
+
msgid "exceeds the limit of %{bytes} bytes"
msgstr ""
@@ -39614,9 +40161,6 @@ msgstr ""
msgid "fork"
msgstr ""
-msgid "fork this project"
-msgstr ""
-
msgid "from"
msgstr ""
@@ -39625,6 +40169,9 @@ msgid_plural "from %d jobs"
msgstr[0] ""
msgstr[1] ""
+msgid "frontmatter"
+msgstr ""
+
msgid "group"
msgstr ""
@@ -39652,6 +40199,9 @@ msgstr ""
msgid "has been completed."
msgstr ""
+msgid "has too deep level of nesting"
+msgstr ""
+
msgid "help"
msgstr ""
@@ -39685,9 +40235,21 @@ msgstr ""
msgid "in"
msgstr ""
+msgid "in Infrastructure :: Kubernetes clusters"
+msgstr ""
+
+msgid "in all GitLab"
+msgstr ""
+
+msgid "in group"
+msgstr ""
+
msgid "in group %{link_to_group}"
msgstr ""
+msgid "in project"
+msgstr ""
+
msgid "in project %{link_to_project}"
msgstr ""
@@ -39729,16 +40291,19 @@ msgstr ""
msgid "is not a valid X509 certificate."
msgstr ""
-msgid "is not allowed since the group is not top-level group."
+msgid "is not allowed for sign-up."
msgstr ""
-msgid "is not allowed. Try again with a different email address, or contact your GitLab admin."
+msgid "is not allowed for this group."
msgstr ""
-msgid "is not allowed. We do not currently support project-level iterations"
+msgid "is not allowed for this project."
+msgstr ""
+
+msgid "is not allowed since the group is not top-level group."
msgstr ""
-msgid "is not from an allowed domain."
+msgid "is not allowed. We do not currently support project-level iterations"
msgstr ""
msgid "is not in the group enforcing Group Managed Account"
@@ -39831,6 +40396,9 @@ msgstr ""
msgid "log in"
msgstr ""
+msgid "managed"
+msgstr ""
+
msgid "manual"
msgstr ""
@@ -39878,6 +40446,9 @@ msgstr ""
msgid "mrWidget| Please restore it or use a different %{missingBranchName} branch"
msgstr ""
+msgid "mrWidget|%{linkStart}Set up now%{linkEnd} to analyze your source code for known security vulnerabilities."
+msgstr ""
+
msgid "mrWidget|%{mergeError}."
msgstr ""
@@ -39958,6 +40529,9 @@ msgid_plural "mrWidget|Closes issues"
msgstr[0] ""
msgstr[1] ""
+msgid "mrWidget|Create issue to resolve all threads"
+msgstr ""
+
msgid "mrWidget|Delete source branch"
msgstr ""
@@ -39967,12 +40541,18 @@ msgstr ""
msgid "mrWidget|Did not close"
msgstr ""
+msgid "mrWidget|Dismiss"
+msgstr ""
+
msgid "mrWidget|Email patches"
msgstr ""
msgid "mrWidget|Failed to load deployment statistics"
msgstr ""
+msgid "mrWidget|Hide %{widget} details"
+msgstr ""
+
msgid "mrWidget|If the %{missingBranchName} branch exists in your local repository, you can merge this merge request manually using the command line"
msgstr ""
@@ -40068,9 +40648,6 @@ msgstr ""
msgid "mrWidget|Request to merge"
msgstr ""
-msgid "mrWidget|Resolve all threads in new issue"
-msgstr ""
-
msgid "mrWidget|Resolve conflicts"
msgstr ""
@@ -40086,6 +40663,9 @@ msgstr ""
msgid "mrWidget|Revoke approval"
msgstr ""
+msgid "mrWidget|SAST and Secret Detection is not enabled."
+msgstr ""
+
msgid "mrWidget|Set by %{merge_author} to be added to the merge train when the pipeline succeeds"
msgstr ""
@@ -40095,6 +40675,9 @@ msgstr ""
msgid "mrWidget|Set by %{merge_author} to start a merge train when the pipeline succeeds"
msgstr ""
+msgid "mrWidget|Show %{widget} details"
+msgstr ""
+
msgid "mrWidget|The changes were merged into"
msgstr ""
@@ -40107,6 +40690,9 @@ msgstr ""
msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure, or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
msgstr ""
+msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure."
+msgstr ""
+
msgid "mrWidget|The source branch has been deleted"
msgstr ""
@@ -40149,6 +40735,9 @@ msgstr ""
msgid "mrWidget|You can merge after removing denied licenses"
msgstr ""
+msgid "mrWidget|You can only merge once this merge request is approved."
+msgstr ""
+
msgid "mrWidget|Your password"
msgstr ""
@@ -40185,6 +40774,9 @@ msgstr ""
msgid "must be less than the limit of %{tag_limit} tags"
msgstr ""
+msgid "must be set for a project namespace"
+msgstr ""
+
msgid "must be unique by status and elapsed time within a policy"
msgstr ""
@@ -40294,6 +40886,9 @@ msgstr ""
msgid "pipeline"
msgstr ""
+msgid "pipeline schedules documentation"
+msgstr ""
+
msgid "pod_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
msgstr ""
@@ -40343,16 +40938,25 @@ msgstr ""
msgid "project name"
msgstr ""
+msgid "project namespace cannot be the parent of another namespace"
+msgstr ""
+
msgid "projects"
msgstr ""
msgid "quick actions"
msgstr ""
-msgid "reCAPTCHA Private Key"
+msgid "reCAPTCHA"
+msgstr ""
+
+msgid "reCAPTCHA helps prevent credential stuffing."
msgstr ""
-msgid "reCAPTCHA Site Key"
+msgid "reCAPTCHA private key"
+msgstr ""
+
+msgid "reCAPTCHA site key"
msgstr ""
msgid "recent activity"
@@ -40579,6 +41183,9 @@ msgstr ""
msgid "user avatar"
msgstr ""
+msgid "user namespace cannot be the parent of another namespace"
+msgstr ""
+
msgid "user preferences"
msgstr ""
@@ -40671,3 +41278,9 @@ msgstr ""
msgid "your settings"
msgstr ""
+msgid "{group}"
+msgstr ""
+
+msgid "{project}"
+msgstr ""
+
diff --git a/locale/sw_KE/gitlab.po b/locale/sw_KE/gitlab.po
index eed9747487e..356772fb66d 100644
--- a/locale/sw_KE/gitlab.po
+++ b/locale/sw_KE/gitlab.po
@@ -14,10 +14,7 @@ msgstr ""
"X-Crowdin-Language: sw\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-09-01 22:31\n"
-
-msgid " %{name}, confirm your email address now! "
-msgstr ""
+"PO-Revision-Date: 2021-10-04 20:19\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -92,6 +89,16 @@ msgstr ""
msgid "#general, #development"
msgstr ""
+msgid "%d Alert"
+msgid_plural "%d Alerts"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d Alert:"
+msgid_plural "%d Alerts:"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d Approval"
msgid_plural "%d Approvals"
msgstr[0] ""
@@ -455,7 +462,10 @@ msgstr ""
msgid "%{code_open}Protected:%{code_close} Only exposed to protected branches or tags."
msgstr ""
-msgid "%{commit_author_link} authored %{commit_timeago}"
+msgid "%{commit_author_link} authored %{commit_authored_timeago}"
+msgstr ""
+
+msgid "%{commit_author_link} authored %{commit_authored_timeago} and %{commit_committer_avatar} %{commit_committer_link} committed %{commit_committer_timeago}"
msgstr ""
msgid "%{completedCount} completed weight"
@@ -549,6 +559,15 @@ msgstr ""
msgid "%{doc_link_start}Advanced search%{doc_link_end} is enabled."
msgstr ""
+msgid "%{docs_link_start}Learn about visibility levels.%{docs_link_end}"
+msgstr ""
+
+msgid "%{docs_link_start}What is Large File Storage?%{docs_link_end}"
+msgstr ""
+
+msgid "%{docs_link_start}What is two-factor authentication?%{docs_link_end}"
+msgstr ""
+
msgid "%{due_date} (Past due)"
msgstr ""
@@ -621,9 +640,6 @@ msgstr ""
msgid "%{issueType} actions"
msgstr ""
-msgid "%{issuesCount} issues with a limit of %{maxIssueCount}"
-msgstr ""
-
msgid "%{issuesSize} with a limit of %{maxIssueCount}"
msgstr ""
@@ -681,6 +697,12 @@ msgstr ""
msgid "%{label_for_message} unavailable"
msgstr ""
+msgid "%{learn_more_link}."
+msgstr ""
+
+msgid "%{lessThan} 1 hour"
+msgstr ""
+
msgid "%{lets_encrypt_link_start}Let's Encrypt%{lets_encrypt_link_end} is a free, automated, and open certificate authority (CA) that issues digital certificates to enable HTTPS (SSL/TLS) for sites."
msgstr ""
@@ -693,15 +715,15 @@ msgstr ""
msgid "%{link_start}Learn more%{link_end} about roles."
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
-msgstr ""
-
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
msgstr ""
msgid "%{link_start}Start the title with %{draft_snippet}%{link_end} to prevent a merge request that is a work in progress from being merged before it's ready."
msgstr ""
+msgid "%{link_start}What information does GitLab Inc. collect?%{link_end}"
+msgstr ""
+
msgid "%{listToShow}, and %{awardsListLength} more"
msgstr ""
@@ -854,7 +876,7 @@ msgid_plural "%{securityScanner} results are not available because a pipeline ha
msgstr[0] ""
msgstr[1] ""
-msgid "%{service_ping_link_start}Learn more%{service_ping_link_end} about what information is shared with GitLab Inc."
+msgid "%{service_ping_link_start}What information is shared with GitLab Inc.?%{service_ping_link_end}"
msgstr ""
msgid "%{size} %{unit}"
@@ -890,6 +912,9 @@ msgstr ""
msgid "%{state} epics"
msgstr ""
+msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
+msgstr ""
+
msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
msgstr ""
@@ -949,11 +974,6 @@ msgstr ""
msgid "%{template_project_id} is unknown or invalid"
msgstr ""
-msgid "%{text} %{files}"
-msgid_plural "%{text} %{files} files"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%{text} is available"
msgstr ""
@@ -1038,9 +1058,6 @@ msgstr ""
msgid "%{wildcards_link_start}Wildcards%{wildcards_link_end} such as %{code_tag_start}v*%{code_tag_end} or %{code_tag_start}*-release%{code_tag_end} are supported."
msgstr ""
-msgid "&lt; 1 hour"
-msgstr ""
-
msgid "'%{data}' at %{location} does not match format: %{format}"
msgstr ""
@@ -1124,9 +1141,6 @@ msgstr ""
msgid "(we need your current password to confirm your changes)"
msgstr ""
-msgid "* * * * *"
-msgstr ""
-
msgid "+ %{amount} more"
msgstr ""
@@ -1193,10 +1207,10 @@ msgstr ""
msgid "."
msgstr ""
-msgid "0 bytes"
+msgid "/"
msgstr ""
-msgid "0 for unlimited, only effective with remote storage enabled."
+msgid "0 bytes"
msgstr ""
msgid "0t1DgySidms"
@@ -1326,6 +1340,9 @@ msgstr ""
msgid "1000+"
msgstr ""
+msgid "192.168.0.0/24"
+msgstr ""
+
msgid "1st contribution!"
msgstr ""
@@ -1479,9 +1496,6 @@ msgstr ""
msgid "A plain HTML site that uses Netlify for CI/CD instead of GitLab, but still with all the other great GitLab features"
msgstr ""
-msgid "A plain-text response to show to clients that hit the rate limit."
-msgstr ""
-
msgid "A platform value can be web, mob or app."
msgstr ""
@@ -1563,7 +1577,7 @@ msgstr ""
msgid "APIFuzzing|Configure HTTP basic authentication values. Other authentication methods are supported. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
+msgid "APIFuzzing|Customize your project's API fuzzing configuration options and copy the code snippet to your .gitlab-ci.yml file to apply any changes. Note that this tool does not reflect or update your .gitlab-ci.yml file automatically. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
msgstr ""
msgid "APIFuzzing|Enable authentication"
@@ -1626,9 +1640,6 @@ msgstr ""
msgid "APIFuzzing|To prevent a security leak, authentication info must be added as a %{ciVariablesLinkStart}CI variable%{ciVariablesLinkEnd}. As a user with maintainer access rights, you can manage CI variables in the %{ciSettingsLinkStart}Settings%{ciSettingsLinkEnd} area."
msgstr ""
-msgid "APIFuzzing|Use this tool to generate API fuzzing configuration YAML to copy into your .gitlab-ci.yml file. This tool does not reflect or update your .gitlab-ci.yml file automatically."
-msgstr ""
-
msgid "APIFuzzing|Username for basic authentication"
msgstr ""
@@ -1680,9 +1691,6 @@ msgstr ""
msgid "Abuse reports notification email"
msgstr ""
-msgid "Abuse reports will be sent to this address if it is set. Abuse reports are always available in the admin area."
-msgstr ""
-
msgid "Accept invitation"
msgstr ""
@@ -1719,12 +1727,18 @@ msgstr ""
msgid "Access granted"
msgstr ""
+msgid "Access key ID"
+msgstr ""
+
msgid "Access requests"
msgstr ""
msgid "Access to '%{classification_label}' not allowed"
msgstr ""
+msgid "Access tokens expire after 2 hours. A refresh token may be used at any time to generate a new access token. Non-expiring access tokens are deprecated. Clear this setting to enable backward compatibility."
+msgstr ""
+
msgid "AccessDropdown|Deploy Keys"
msgstr ""
@@ -2037,6 +2051,9 @@ msgstr ""
msgid "Add new directory"
msgstr ""
+msgid "Add new service account"
+msgstr ""
+
msgid "Add or remove previously merged commits"
msgstr ""
@@ -2274,6 +2291,9 @@ msgstr ""
msgid "AdminArea|Features"
msgstr ""
+msgid "AdminArea|Get security updates from GitLab and stay up to date"
+msgstr ""
+
msgid "AdminArea|Groups"
msgstr ""
@@ -2313,6 +2333,12 @@ msgstr ""
msgid "AdminArea|Reporter"
msgstr ""
+msgid "AdminArea|Sign up for the GitLab Security Newsletter to get notified for security updates."
+msgstr ""
+
+msgid "AdminArea|Sign up for the GitLab newsletter"
+msgstr ""
+
msgid "AdminArea|Stop all jobs"
msgstr ""
@@ -2382,9 +2408,15 @@ msgstr ""
msgid "AdminSettings|Disable public access to Pages sites"
msgstr ""
+msgid "AdminSettings|Display a banner on merge requests in projects with no pipelines to initiate steps to add a .gitlab-ci.yml file."
+msgstr ""
+
msgid "AdminSettings|Domain verification is an essential security measure for public GitLab sites. Users are required to demonstrate they control a domain before it is enabled. %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "AdminSettings|Enable pipeline suggestion banner"
+msgstr ""
+
msgid "AdminSettings|Enable shared runners for new projects"
msgstr ""
@@ -2856,10 +2888,10 @@ msgstr ""
msgid "Admin|Quarterly reconciliation will occur on %{qrtlyDate}"
msgstr ""
-msgid "Admin|The number of max seats used for your namespace is currently exceeding the number of seats in your subscription. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgid "Admin|The number of max seats in your namespace exceeds the number of seats in your subscription. On %{qrtlyDate}, quarterly reconciliation occurs and you are automatically billed a prorated amount for the overage. No action is needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice. For more information about the timing of the invoicing process, view the documentation."
msgstr ""
-msgid "Admin|The number of maximum users for your instance is currently exceeding the number of users in license. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgid "Admin|The number of max users in your instance exceeds the number of users in your license. On %{qrtlyDate}, quarterly reconciliation occurs and you are automatically billed a prorated amount for the overage. No action is needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice. For more information about the timing of the invoicing process, view the documentation."
msgstr ""
msgid "Admin|View pending user approvals"
@@ -2880,9 +2912,6 @@ msgstr ""
msgid "Advanced export options"
msgstr ""
-msgid "Advanced permissions, Large File Storage and Two-Factor authentication settings."
-msgstr ""
-
msgid "After a successful password update you will be redirected to login screen."
msgstr ""
@@ -2901,13 +2930,14 @@ msgstr ""
msgid "After you've reviewed these contribution guidelines, you'll be all set to"
msgstr ""
+msgid "Akismet"
+msgstr ""
+
msgid "Akismet API Key"
msgstr ""
-msgid "Alert"
-msgid_plural "Alerts"
-msgstr[0] ""
-msgstr[1] ""
+msgid "Akismet helps prevent the creation of spam issues in public projects."
+msgstr ""
msgid "AlertManagement|Acknowledged"
msgstr ""
@@ -3263,6 +3293,9 @@ msgstr ""
msgid "All (default)"
msgstr ""
+msgid "All GitLab"
+msgstr ""
+
msgid "All Members"
msgstr ""
@@ -3377,6 +3410,9 @@ msgstr ""
msgid "Allow this secondary node to replicate content on Object Storage"
msgstr ""
+msgid "Allow use of licensed EE features"
+msgstr ""
+
msgid "Allow users to dismiss the broadcast message"
msgstr ""
@@ -3452,9 +3488,6 @@ msgstr ""
msgid "Amazon authentication is not %{link_start}correctly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
-msgid "Amount of time (in hours) that users are allowed to skip forced configuration of two-factor authentication"
-msgstr ""
-
msgid "An %{link_start}alert%{link_end} with the same fingerprint is already open. To change the status of this alert, resolve the linked alert."
msgstr ""
@@ -3515,12 +3548,6 @@ msgstr ""
msgid "An error occurred when removing the label."
msgstr ""
-msgid "An error occurred when toggling the notification subscription"
-msgstr ""
-
-msgid "An error occurred when updating the issue weight"
-msgstr ""
-
msgid "An error occurred when updating the title"
msgstr ""
@@ -3569,6 +3596,9 @@ msgstr ""
msgid "An error occurred while enabling Service Desk."
msgstr ""
+msgid "An error occurred while fetching Markdown preview"
+msgstr ""
+
msgid "An error occurred while fetching ancestors"
msgstr ""
@@ -3599,9 +3629,6 @@ msgstr ""
msgid "An error occurred while fetching label colors."
msgstr ""
-msgid "An error occurred while fetching markdown preview"
-msgstr ""
-
msgid "An error occurred while fetching participants"
msgstr ""
@@ -3617,9 +3644,6 @@ msgstr ""
msgid "An error occurred while fetching reference"
msgstr ""
-msgid "An error occurred while fetching sidebar data"
-msgstr ""
-
msgid "An error occurred while fetching tags. Retry the search."
msgstr ""
@@ -3695,6 +3719,9 @@ msgstr ""
msgid "An error occurred while loading merge requests."
msgstr ""
+msgid "An error occurred while loading projects."
+msgstr ""
+
msgid "An error occurred while loading the Needs tab."
msgstr ""
@@ -3929,12 +3956,6 @@ msgstr ""
msgid "Any Milestone"
msgstr ""
-msgid "Any branch"
-msgstr ""
-
-msgid "Any eligible user"
-msgstr ""
-
msgid "Any encrypted tokens"
msgstr ""
@@ -3953,6 +3974,9 @@ msgstr ""
msgid "Any namespace"
msgstr ""
+msgid "App Engine description and apps that are suitable for this deployment target"
+msgstr ""
+
msgid "App ID"
msgstr ""
@@ -4101,6 +4125,11 @@ msgstr ""
msgid "Apply"
msgstr ""
+msgid "Apply %d suggestion"
+msgid_plural "Apply %d suggestions"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Apply a label"
msgstr ""
@@ -4110,13 +4139,10 @@ msgstr ""
msgid "Apply suggestion"
msgstr ""
-msgid "Apply suggestions"
-msgstr ""
-
msgid "Apply template"
msgstr ""
-msgid "Apply this approval rule to any branch or a specific protected branch."
+msgid "Apply this approval rule to all branches or a specific protected branch."
msgstr ""
msgid "Applying"
@@ -4259,9 +4285,6 @@ msgstr ""
msgid "ApprovalSettings|Prevent editing approval rules in projects and merge requests."
msgstr ""
-msgid "ApprovalSettings|Prevent editing approval rules in projects and merge requests. "
-msgstr ""
-
msgid "ApprovalSettings|Remove all approvals when commits are added to the source branch."
msgstr ""
@@ -4277,6 +4300,9 @@ msgstr ""
msgid "ApprovalSettings|This setting is configured at the instance level and can only be changed by an administrator."
msgstr ""
+msgid "ApprovalSettings|This setting is configured in %{groupName} and can only be changed by an administrator or group owner."
+msgstr ""
+
msgid "ApprovalStatusTooltip|Adheres to separation of duties"
msgstr ""
@@ -4763,9 +4789,6 @@ msgstr ""
msgid "Authenticated API rate limit period in seconds"
msgstr ""
-msgid "Authenticated API request rate limit"
-msgstr ""
-
msgid "Authenticated API requests"
msgstr ""
@@ -4775,10 +4798,10 @@ msgstr ""
msgid "Authenticated Git LFS request rate limit"
msgstr ""
-msgid "Authenticated web rate limit period in seconds"
+msgid "Authenticated Git LFS requests"
msgstr ""
-msgid "Authenticated web request rate limit"
+msgid "Authenticated web rate limit period in seconds"
msgstr ""
msgid "Authenticated web requests"
@@ -5156,9 +5179,6 @@ msgstr ""
msgid "Below you will find all the groups that are public."
msgstr ""
-msgid "Beta"
-msgstr ""
-
msgid "Bi-weekly code coverage"
msgstr ""
@@ -5398,6 +5418,21 @@ msgstr ""
msgid "Board scope affects which issues are displayed for anyone who visits this board"
msgstr ""
+msgid "BoardNewEpic|Groups"
+msgstr ""
+
+msgid "BoardNewEpic|Loading groups"
+msgstr ""
+
+msgid "BoardNewEpic|No matching results"
+msgstr ""
+
+msgid "BoardNewEpic|Search groups"
+msgstr ""
+
+msgid "BoardNewEpic|Select a group"
+msgstr ""
+
msgid "BoardNewIssue|No matching results"
msgstr ""
@@ -5475,6 +5510,9 @@ msgstr ""
msgid "Boards|An error occurred while creating the list. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching child groups. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching group projects. Please try again."
msgstr ""
@@ -5807,6 +5845,9 @@ msgstr ""
msgid "Bulk update"
msgstr ""
+msgid "BulkImports|Re-import creates a new group. It does not sync with the existing group."
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -5816,6 +5857,9 @@ msgstr ""
msgid "BulkImport|From source group"
msgstr ""
+msgid "BulkImport|Group import history"
+msgstr ""
+
msgid "BulkImport|Import failed: Destination cannot be a subgroup of the source group. Change the destination and try again."
msgstr ""
@@ -5828,9 +5872,18 @@ msgstr ""
msgid "BulkImport|Importing the group failed"
msgstr ""
+msgid "BulkImport|Last imported to %{link}"
+msgstr ""
+
msgid "BulkImport|Name already exists."
msgstr ""
+msgid "BulkImport|New group"
+msgstr ""
+
+msgid "BulkImport|No history is available"
+msgstr ""
+
msgid "BulkImport|No parent"
msgstr ""
@@ -5843,6 +5896,9 @@ msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} matching filter \"%{filter}\" from %{link}"
msgstr ""
+msgid "BulkImport|Source group"
+msgstr ""
+
msgid "BulkImport|To new group"
msgstr ""
@@ -5852,6 +5908,9 @@ msgstr ""
msgid "BulkImport|You have no groups to import"
msgstr ""
+msgid "BulkImport|Your imported groups will appear here."
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -6094,6 +6153,9 @@ msgstr ""
msgid "Can be manually deployed to"
msgstr ""
+msgid "Can be overridden in each project."
+msgstr ""
+
msgid "Can create groups:"
msgstr ""
@@ -6196,6 +6258,9 @@ msgstr ""
msgid "Cancelling Preview"
msgstr ""
+msgid "Cannot assign a confidential epic to a non-confidential issue. Make the issue confidential and try again"
+msgstr ""
+
msgid "Cannot be assigned to other projects."
msgstr ""
@@ -6247,9 +6312,6 @@ msgstr ""
msgid "Cannot refer to a group %{timebox_type} by an internal id!"
msgstr ""
-msgid "Cannot set confidential epic for a non-confidential issue"
-msgstr ""
-
msgid "Cannot show preview. For previews on sketch files, they must have the file format introduced by Sketch version 43 and above."
msgstr ""
@@ -6487,15 +6549,15 @@ msgstr ""
msgid "Check out, review, and merge locally"
msgstr ""
-msgid "Check the %{docs_link_start}documentation%{docs_link_end}."
-msgstr ""
-
msgid "Check the current instance configuration "
msgstr ""
msgid "Check the elasticsearch.log file to debug why the migration was halted and make any changes before retrying the migration. When you fix the cause of the failure, click \"Retry migration\", and the migration will be scheduled to be retried in the background."
msgstr ""
+msgid "Check with your administrator."
+msgstr ""
+
msgid "Check your Docker images for known vulnerabilities."
msgstr ""
@@ -6526,6 +6588,9 @@ msgstr ""
msgid "Checkout"
msgstr ""
+msgid "Checkout|$%{selectedPlanPrice} per 10 GB storage per pack"
+msgstr ""
+
msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 minutes"
msgstr ""
@@ -6546,17 +6611,23 @@ msgstr ""
msgid "Checkout|%{name}'s GitLab subscription"
msgstr ""
-msgid "Checkout|%{selectedPlanText} plan"
+msgid "Checkout|%{name}'s storage subscription"
msgstr ""
-msgid "Checkout|%{startDate} - %{endDate}"
+msgid "Checkout|%{quantity} GB of storage"
msgstr ""
-msgid "Checkout|%{totalCiMinutes} CI minute"
-msgid_plural "Checkout|%{totalCiMinutes} CI minutes"
+msgid "Checkout|%{quantity} storage pack"
+msgid_plural "Checkout|%{quantity} storage packs"
msgstr[0] ""
msgstr[1] ""
+msgid "Checkout|%{selectedPlanText} plan"
+msgstr ""
+
+msgid "Checkout|%{startDate} - %{endDate}"
+msgstr ""
+
msgid "Checkout|%{totalCiMinutes} CI minutes"
msgstr ""
@@ -6632,6 +6703,9 @@ msgstr ""
msgid "Checkout|Failed to register credit card. Please try again."
msgstr ""
+msgid "Checkout|GB"
+msgstr ""
+
msgid "Checkout|GitLab group"
msgstr ""
@@ -6668,6 +6742,9 @@ msgstr ""
msgid "Checkout|State"
msgstr ""
+msgid "Checkout|Storage packs"
+msgstr ""
+
msgid "Checkout|Street address"
msgstr ""
@@ -6689,6 +6766,9 @@ msgstr ""
msgid "Checkout|Total minutes: %{quantity}"
msgstr ""
+msgid "Checkout|Total storage: %{quantity} GB"
+msgstr ""
+
msgid "Checkout|Users"
msgstr ""
@@ -6698,16 +6778,25 @@ msgstr ""
msgid "Checkout|Your organization"
msgstr ""
+msgid "Checkout|Your storage subscription has the same term as your main subscription, and the price is prorated accordingly."
+msgstr ""
+
msgid "Checkout|Your subscription will be applied to this group"
msgstr ""
msgid "Checkout|Zip code"
msgstr ""
+msgid "Checkout|a storage subscription"
+msgstr ""
+
msgid "Checkout|company or team"
msgstr ""
-msgid "Checkout|x 1,000 minutes per pack = %{strong}"
+msgid "Checkout|minutes"
+msgstr ""
+
+msgid "Checkout|x %{quantity} %{units} per pack ="
msgstr ""
msgid "Cherry-pick this commit"
@@ -7064,6 +7153,9 @@ msgstr ""
msgid "CloneIssue|Cannot clone issue to target project as it is pending deletion."
msgstr ""
+msgid "CloneIssue|Cannot clone issues of '%{issue_type}' type."
+msgstr ""
+
msgid "Cloned this issue to %{path_to_project}."
msgstr ""
@@ -7118,7 +7210,10 @@ msgstr ""
msgid "Closes this %{quick_action_target}."
msgstr ""
-msgid "Cloud licenses can not be removed."
+msgid "Cloud Functions description and apps that are suitable for this deployment target"
+msgstr ""
+
+msgid "Cloud Run description and apps that are suitable for this deployment target"
msgstr ""
msgid "Cluster"
@@ -7145,6 +7240,12 @@ msgstr ""
msgid "ClusterAgents|Access tokens"
msgstr ""
+msgid "ClusterAgents|Agent might not be connected to GitLab"
+msgstr ""
+
+msgid "ClusterAgents|Agent never connected to GitLab"
+msgstr ""
+
msgid "ClusterAgents|Alternative installation methods"
msgstr ""
@@ -7160,6 +7261,12 @@ msgstr ""
msgid "ClusterAgents|Configuration"
msgstr ""
+msgid "ClusterAgents|Connected"
+msgstr ""
+
+msgid "ClusterAgents|Connection status"
+msgstr ""
+
msgid "ClusterAgents|Copy token"
msgstr ""
@@ -7178,6 +7285,9 @@ msgstr ""
msgid "ClusterAgents|For alternative installation methods %{linkStart}go to the documentation%{linkEnd}."
msgstr ""
+msgid "ClusterAgents|For more troubleshooting information go to"
+msgstr ""
+
msgid "ClusterAgents|Go to the repository"
msgstr ""
@@ -7193,18 +7303,30 @@ msgstr ""
msgid "ClusterAgents|Integrate with the GitLab Agent"
msgstr ""
-msgid "ClusterAgents|Last used"
+msgid "ClusterAgents|Last connected %{timeAgo}."
+msgstr ""
+
+msgid "ClusterAgents|Last contact"
msgstr ""
msgid "ClusterAgents|Learn how to create an agent access token"
msgstr ""
+msgid "ClusterAgents|Make sure you are using a valid token."
+msgstr ""
+
msgid "ClusterAgents|Name"
msgstr ""
msgid "ClusterAgents|Never"
msgstr ""
+msgid "ClusterAgents|Never connected"
+msgstr ""
+
+msgid "ClusterAgents|Not connected"
+msgstr ""
+
msgid "ClusterAgents|Read more about getting started"
msgstr ""
@@ -7226,6 +7348,9 @@ msgstr ""
msgid "ClusterAgents|Select which Agent you want to install"
msgstr ""
+msgid "ClusterAgents|The Agent has not been connected in a long time. There might be a connectivity issue. Last contact was %{timeAgo}."
+msgstr ""
+
msgid "ClusterAgents|The GitLab Agent also requires %{linkStart}enabling the Agent Server%{linkEnd}"
msgstr ""
@@ -7253,9 +7378,6 @@ msgstr ""
msgid "ClusterAgents|You will need to create a token to connect to your agent"
msgstr ""
-msgid "ClusterAgent|This feature is only available for premium plans"
-msgstr ""
-
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -7445,9 +7567,6 @@ msgstr ""
msgid "ClusterIntegration|Create Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Create a provision role on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the account and external ID above. %{startMoreInfoLink}More information%{endLink}"
-msgstr ""
-
msgid "ClusterIntegration|Create cluster on"
msgstr ""
@@ -7880,7 +7999,7 @@ msgstr ""
msgid "ClusterIntegration|Subnets"
msgstr ""
-msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provisioned role, first create one on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the above account and external IDs. %{startMoreInfoLink}More information%{endLink}"
+msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provisioned role, first create one on %{awsLinkStart}Amazon Web Services %{awsLinkEnd} using the above account and external IDs. %{moreInfoStart}More information%{moreInfoEnd}"
msgstr ""
msgid "ClusterIntegration|The Kubernetes certificate used to authenticate to the cluster."
@@ -8114,6 +8233,9 @@ msgstr ""
msgid "Collapse replies"
msgstr ""
+msgid "Collapse settings section"
+msgstr ""
+
msgid "Collapse sidebar"
msgstr ""
@@ -8132,6 +8254,9 @@ msgstr ""
msgid "Comma-separated list of email addresses."
msgstr ""
+msgid "Comma-separated list of users allowed to exceed the rate limit."
+msgstr ""
+
msgid "Comma-separated, e.g. '1.1.1.1, 2.2.2.0/24'"
msgstr ""
@@ -8452,6 +8577,9 @@ msgstr ""
msgid "Configure %{repository_checks_link_start}repository checks%{link_end} and %{housekeeping_link_start}housekeeping%{link_end} on repositories."
msgstr ""
+msgid "Configure CAPTCHAs, IP address limits, and other anti-spam measures."
+msgstr ""
+
msgid "Configure Dependency Scanning in `.gitlab-ci.yml` using the GitLab managed template. You can [add variable overrides](https://docs.gitlab.com/ee/user/application_security/dependency_scanning/#customizing-the-dependency-scanning-settings) to customize Dependency Scanning settings."
msgstr ""
@@ -8488,16 +8616,13 @@ msgstr ""
msgid "Configure a %{codeStart}.gitlab-webide.yml%{codeEnd} file in the %{codeStart}.gitlab%{codeEnd} directory to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
msgstr ""
-msgid "Configure existing installation"
-msgstr ""
-
-msgid "Configure limit for notes created per minute by web and API requests."
+msgid "Configure advanced permissions, Large File Storage, and two-factor authentication settings."
msgstr ""
-msgid "Configure limits for Project/Group Import/Export."
+msgid "Configure approvals by authors and committers on all projects."
msgstr ""
-msgid "Configure limits for web and API requests."
+msgid "Configure existing installation"
msgstr ""
msgid "Configure paths to be protected by Rack Attack."
@@ -8512,10 +8637,13 @@ msgstr ""
msgid "Configure settings for Advanced Search with Elasticsearch."
msgstr ""
+msgid "Configure specific limits for Files API requests that supersede the general user and IP rate limits."
+msgstr ""
+
msgid "Configure specific limits for Git LFS requests that supersede the general user and IP rate limits."
msgstr ""
-msgid "Configure specific limits for Packages API requests that supersede the general user and IP rate limits."
+msgid "Configure specific limits for deprecated API requests that supersede the general user and IP rate limits."
msgstr ""
msgid "Configure the %{link} integration."
@@ -8527,6 +8655,9 @@ msgstr ""
msgid "Configure the way a user creates a new account."
msgstr ""
+msgid "Configure via Merge Request"
+msgstr ""
+
msgid "Configure which lists are shown for anyone who visits this board"
msgstr ""
@@ -8995,6 +9126,9 @@ msgstr ""
msgid "Content parsed with %{link}."
msgstr ""
+msgid "ContentEditor|Table of Contents"
+msgstr ""
+
msgid "ContentEditor|You have to provide a renderMarkdown function or a custom serializer"
msgstr ""
@@ -9181,6 +9315,9 @@ msgstr ""
msgid "Copy link to chart"
msgstr ""
+msgid "Copy prefix"
+msgstr ""
+
msgid "Copy reference"
msgstr ""
@@ -9211,6 +9348,9 @@ msgstr ""
msgid "Copy value"
msgstr ""
+msgid "Corpus Management"
+msgstr ""
+
msgid "Corpus Management|Are you sure you want to delete the corpus?"
msgstr ""
@@ -9439,6 +9579,9 @@ msgstr ""
msgid "Create commit"
msgstr ""
+msgid "Create common files more quickly, and standardize their format."
+msgstr ""
+
msgid "Create confidential merge request"
msgstr ""
@@ -9472,6 +9615,9 @@ msgstr ""
msgid "Create issue"
msgstr ""
+msgid "Create issue to resolve all threads"
+msgstr ""
+
msgid "Create iteration"
msgstr ""
@@ -9526,6 +9672,9 @@ msgstr ""
msgid "Create new..."
msgstr ""
+msgid "Create or import your first project"
+msgstr ""
+
msgid "Create project"
msgstr ""
@@ -9883,7 +10032,7 @@ msgstr ""
msgid "Custom notification events"
msgstr ""
-msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notificationLinkStart} notification emails%{notificationLinkEnd}."
+msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notificationLinkStart}notification emails%{notificationLinkEnd}."
msgstr ""
msgid "Custom project templates"
@@ -10082,10 +10231,10 @@ msgid_plural "CycleAnalytics|Showing %{subjectFilterText} and %{selectedLabelsCo
msgstr[0] ""
msgstr[1] ""
-msgid "CycleAnalytics|Showing data for group '%{groupName}' and %{selectedProjectCount} projects from %{startDate} to %{endDate}"
+msgid "CycleAnalytics|Showing data for group '%{groupName}' and %{selectedProjectCount} projects from %{createdAfter} to %{createdBefore}"
msgstr ""
-msgid "CycleAnalytics|Showing data for group '%{groupName}' from %{startDate} to %{endDate}"
+msgid "CycleAnalytics|Showing data for group '%{groupName}' from %{createdAfter} to %{createdBefore}"
msgstr ""
msgid "CycleAnalytics|Stages"
@@ -10319,6 +10468,9 @@ msgstr ""
msgid "DastProfiles|Manage profiles"
msgstr ""
+msgid "DastProfiles|Manage site profiles"
+msgstr ""
+
msgid "DastProfiles|Minimum = 0 (no timeout enabled), Maximum = 2880 minutes"
msgstr ""
@@ -10394,6 +10546,9 @@ msgstr ""
msgid "DastProfiles|Scanner name"
msgstr ""
+msgid "DastProfiles|Schedule"
+msgstr ""
+
msgid "DastProfiles|Select branch"
msgstr ""
@@ -10463,7 +10618,7 @@ msgstr ""
msgid "DastProfiles|Website"
msgstr ""
-msgid "DastProfiles|You can either choose a passive scan or validate the target site in your chosen site profile. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
+msgid "DastProfiles|You can either choose a passive scan or validate the target site from the site profile management page. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
msgstr ""
msgid "DastProfiles|You cannot run an active scan against an unvalidated site."
@@ -10636,7 +10791,7 @@ msgstr ""
msgid "Days to merge"
msgstr ""
-msgid "Deactivate dormant users after 90 days of inactivity. Users can return to active status by signing in to their account. While inactive, a user is not counted as an active user in the instance."
+msgid "Deactivate dormant users after 90 days of inactivity"
msgstr ""
msgid "Dear Administrator,"
@@ -10723,10 +10878,10 @@ msgstr ""
msgid "Define a custom pattern with cron syntax"
msgstr ""
-msgid "Define approval settings."
+msgid "Define approval rules."
msgstr ""
-msgid "Define approval settings. %{linkStart}Learn more.%{linkEnd}"
+msgid "Define approval rules. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "Define custom rules for what constitutes spam, independent of Akismet"
@@ -10735,7 +10890,7 @@ msgstr ""
msgid "Define environments in the deploy stage(s) in %{code_open}.gitlab-ci.yml%{code_close} to track deployments here."
msgstr ""
-msgid "Define how approval rules are applied as a merge request moves toward completion."
+msgid "Define how approval rules are applied to merge requests."
msgstr ""
msgid "Definition"
@@ -10750,6 +10905,12 @@ msgstr ""
msgid "DelayedJobs|Are you sure you want to run %{job_name} immediately? This job will run automatically after it's timer finishes."
msgstr ""
+msgid "DelayedJobs|Are you sure you want to run %{job_name} immediately? This job will run automatically after its timer finishes."
+msgstr ""
+
+msgid "DelayedJobs|Run the delayed job now?"
+msgstr ""
+
msgid "DelayedJobs|Start now"
msgstr ""
@@ -11026,6 +11187,12 @@ msgstr ""
msgid "Dependency proxy image prefix"
msgstr ""
+msgid "DependencyProxy|Create a local proxy for storing frequently used upstream images. %{docLinkStart}Learn more%{docLinkEnd} about dependency proxies."
+msgstr ""
+
+msgid "DependencyProxy|Dependency Proxy"
+msgstr ""
+
msgid "DependencyProxy|Toggle Dependency Proxy"
msgstr ""
@@ -11266,6 +11433,9 @@ msgstr ""
msgid "Deployments"
msgstr ""
+msgid "Deployments to Google Kubernetes Engine can be "
+msgstr ""
+
msgid "Deployments|%{deployments} environment impacted."
msgid_plural "Deployments|%{deployments} environments impacted."
msgstr[0] ""
@@ -11295,6 +11465,9 @@ msgstr ""
msgid "Deployment|success"
msgstr ""
+msgid "Deprecated API rate limits"
+msgstr ""
+
msgid "Deprioritize label"
msgstr ""
@@ -11697,6 +11870,16 @@ msgstr ""
msgid "DiffsCompareBaseBranch|(base)"
msgstr ""
+msgid "Diffs|%d addition"
+msgid_plural "Diffs|%d additions"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Diffs|%d deletion"
+msgid_plural "Diffs|%d deletions"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Diffs|No file name available"
msgstr ""
@@ -11706,9 +11889,17 @@ msgstr ""
msgid "Diffs|Show all unchanged lines"
msgstr ""
+msgid "Diffs|Showing %{dropdownStart}%{count} changed file%{dropdownEnd}"
+msgid_plural "Diffs|Showing %{dropdownStart}%{count} changed files%{dropdownEnd}"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Diffs|Something went wrong while fetching diff lines."
msgstr ""
+msgid "Diffs|with %{additions} and %{deletions}"
+msgstr ""
+
msgid "Direct member"
msgstr ""
@@ -11834,9 +12025,6 @@ msgid_plural "Dismiss %d selected vulnerabilities as"
msgstr[0] ""
msgstr[1] ""
-msgid "Dismiss Value Stream Analytics introduction box"
-msgstr ""
-
msgid "Dismiss merge request promotion"
msgstr ""
@@ -12158,6 +12346,9 @@ msgstr ""
msgid "Edit issues"
msgstr ""
+msgid "Edit merge requests"
+msgstr ""
+
msgid "Edit public deploy key"
msgstr ""
@@ -12233,6 +12424,9 @@ msgstr ""
msgid "Elastic|None. Select projects to index."
msgstr ""
+msgid "Eligible users"
+msgstr ""
+
msgid "Email"
msgstr ""
@@ -12362,6 +12556,9 @@ msgstr ""
msgid "Enable"
msgstr ""
+msgid "Enable Amazon EKS integration"
+msgstr ""
+
msgid "Enable Auto DevOps"
msgstr ""
@@ -12395,6 +12592,9 @@ msgstr ""
msgid "Enable SSL verification"
msgstr ""
+msgid "Enable Service Ping"
+msgstr ""
+
msgid "Enable Snowplow tracking"
msgstr ""
@@ -12425,6 +12625,9 @@ msgstr ""
msgid "Enable authenticated Git LFS request rate limit"
msgstr ""
+msgid "Enable authenticated web request rate limit"
+msgstr ""
+
msgid "Enable authentication"
msgstr ""
@@ -12485,7 +12688,7 @@ msgstr ""
msgid "Enable or disable the Pseudonymizer data collection."
msgstr ""
-msgid "Enable or disable version check and service ping."
+msgid "Enable or disable version check and Service Ping."
msgstr ""
msgid "Enable protected paths rate limit"
@@ -12497,18 +12700,12 @@ msgstr ""
msgid "Enable reCAPTCHA"
msgstr ""
-msgid "Enable reCAPTCHA for login"
-msgstr ""
-
-msgid "Enable reCAPTCHA, Invisible Captcha, Akismet and set IP limits. For reCAPTCHA, we currently only support %{recaptcha_v2_link_start}v2%{recaptcha_v2_link_end}"
+msgid "Enable reCAPTCHA for login."
msgstr ""
msgid "Enable repository checks"
msgstr ""
-msgid "Enable service ping"
-msgstr ""
-
msgid "Enable shared runners for all projects and subgroups in this group."
msgstr ""
@@ -12530,7 +12727,10 @@ msgstr ""
msgid "Enable unauthenticated API request rate limit"
msgstr ""
-msgid "Enable unauthenticated request rate limit"
+msgid "Enable unauthenticated web request rate limit"
+msgstr ""
+
+msgid "Enable user deactivation emails"
msgstr ""
msgid "Enable version check"
@@ -12566,9 +12766,6 @@ msgstr ""
msgid "Enabled sources for code import during project creation. OmniAuth must be configured for GitHub"
msgstr ""
-msgid "Enabling this will only make licensed EE features available to projects if the project namespace's plan includes the feature or if the project is public."
-msgstr ""
-
msgid "Encountered an error while rendering: %{err}"
msgstr ""
@@ -12617,9 +12814,6 @@ msgstr ""
msgid "Enter Admin Mode"
msgstr ""
-msgid "Enter IP address range"
-msgstr ""
-
msgid "Enter a number"
msgstr ""
@@ -12632,9 +12826,6 @@ msgstr ""
msgid "Enter at least three characters to search"
msgstr ""
-msgid "Enter domain"
-msgstr ""
-
msgid "Enter in your Bitbucket Server URL and personal access token below"
msgstr ""
@@ -12821,9 +13012,6 @@ msgstr ""
msgid "Environments|Deployment %{status}"
msgstr ""
-msgid "Environments|Dismiss"
-msgstr ""
-
msgid "Environments|Enable review app"
msgstr ""
@@ -12836,9 +13024,6 @@ msgstr ""
msgid "Environments|Environments are places where code gets deployed, such as staging or production."
msgstr ""
-msgid "Environments|Help us improve environments"
-msgstr ""
-
msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
msgstr ""
@@ -12875,6 +13060,9 @@ msgstr ""
msgid "Environments|Note that this action will stop the environment, but it will %{emphasisStart}not%{emphasisEnd} have an effect on any existing deployment due to no “stop environment action†being defined in the %{ciConfigLinkStart}.gitlab-ci.yml%{ciConfigLinkEnd} file."
msgstr ""
+msgid "Environments|Open"
+msgstr ""
+
msgid "Environments|Open live environment"
msgstr ""
@@ -12914,9 +13102,6 @@ msgstr ""
msgid "Environments|Stopping %{environmentName}"
msgstr ""
-msgid "Environments|Take the survey"
-msgstr ""
-
msgid "Environments|There was an error fetching the logs. Please try again."
msgstr ""
@@ -12938,9 +13123,6 @@ msgstr ""
msgid "Environments|You don't have any environments right now"
msgstr ""
-msgid "Environments|Your feedback helps GitLab make environments better for you and other users. Participate and enter a sweepstake to win a USD 30 gift card."
-msgstr ""
-
msgid "Environments|by %{avatar}"
msgstr ""
@@ -13223,7 +13405,7 @@ msgstr ""
msgid "Error parsing CSV file. Please make sure it has"
msgstr ""
-msgid "Error rendering markdown preview"
+msgid "Error rendering Markdown preview"
msgstr ""
msgid "Error saving label update."
@@ -13271,6 +13453,9 @@ msgstr ""
msgid "Error: %{error_message}"
msgstr ""
+msgid "Error: Couldn't load some or all of the changes."
+msgstr ""
+
msgid "Error: No AWS credentials were supplied"
msgstr ""
@@ -13304,6 +13489,9 @@ msgstr ""
msgid "ErrorTracking|Enable error tracking"
msgstr ""
+msgid "ErrorTracking|Error tracking backend"
+msgstr ""
+
msgid "ErrorTracking|If you self-host Sentry, enter your Sentry instance's full URL. If you use Sentry's hosted solution, enter https://sentry.io"
msgstr ""
@@ -13337,6 +13525,12 @@ msgstr ""
msgid "Escalation policies must have at least one rule"
msgstr ""
+msgid "EscalationPolicies|%{clockIcon} IF alert is not %{alertStatus} in %{minutes}"
+msgstr ""
+
+msgid "EscalationPolicies|%{notificationIcon} THEN %{doAction} %{forScheduleOrUser}"
+msgstr ""
+
msgid "EscalationPolicies|+ Add an additional rule"
msgstr ""
@@ -13379,13 +13573,13 @@ msgstr ""
msgid "EscalationPolicies|Escalation policies"
msgstr ""
-msgid "EscalationPolicies|Escalation rules"
+msgid "EscalationPolicies|Escalation policy %{obstacle} in Project %{project}"
msgstr ""
-msgid "EscalationPolicies|Failed to load oncall-schedules"
+msgid "EscalationPolicies|Escalation rules"
msgstr ""
-msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} %{then} THEN %{doAction} %{scheduleOrUser}"
+msgid "EscalationPolicies|Failed to load oncall-schedules"
msgstr ""
msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} minutes"
@@ -13463,18 +13657,36 @@ msgstr ""
msgid "Every %{action} attempt has failed: %{job_error_message}. Please try again."
msgstr ""
+msgid "Every 3 months"
+msgstr ""
+
+msgid "Every 3 months on the %{day} at %{time} %{timezone}"
+msgstr ""
+
+msgid "Every 6 months"
+msgstr ""
+
+msgid "Every 6 months on the %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Every day"
msgstr ""
msgid "Every day (at %{time})"
msgstr ""
+msgid "Every day at %{time} %{timezone}"
+msgstr ""
+
msgid "Every month"
msgstr ""
msgid "Every month (Day %{day} at %{time})"
msgstr ""
+msgid "Every month on the %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Every three months"
msgstr ""
@@ -13489,6 +13701,15 @@ msgstr[1] ""
msgid "Every week (%{weekday} at %{time})"
msgstr ""
+msgid "Every week on %{day} at %{time} %{timezone}"
+msgstr ""
+
+msgid "Every year"
+msgstr ""
+
+msgid "Every year on %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Everyone"
msgstr ""
@@ -13525,9 +13746,6 @@ msgstr ""
msgid "Exactly one of %{attributes} is required"
msgstr ""
-msgid "Example: %{ip_address}. %{read_more_link}."
-msgstr ""
-
msgid "Example: @sub\\.company\\.com$"
msgstr ""
@@ -13594,13 +13812,13 @@ msgstr ""
msgid "Expand pipeline"
msgstr ""
-msgid "Expand sidebar"
+msgid "Expand settings section"
msgstr ""
-msgid "Expected documents: %{expected_documents}"
+msgid "Expand sidebar"
msgstr ""
-msgid "Experienced"
+msgid "Expected documents: %{expected_documents}"
msgstr ""
msgid "ExperimentSubject|Must have exactly one of User, Namespace, or Project."
@@ -13885,9 +14103,6 @@ msgstr ""
msgid "Failed to load related branches"
msgstr ""
-msgid "Failed to load sidebar lock status"
-msgstr ""
-
msgid "Failed to load stacktrace."
msgstr ""
@@ -14312,6 +14527,9 @@ msgstr ""
msgid "Files"
msgstr ""
+msgid "Files API Rate Limits"
+msgstr ""
+
msgid "Files breadcrumb"
msgstr ""
@@ -15311,6 +15529,9 @@ msgstr ""
msgid "GitLab group: %{source_link}"
msgstr ""
+msgid "GitLab informs you if a new version is available."
+msgstr ""
+
msgid "GitLab is a complete DevOps platform, delivered as a single application, fundamentally changing the way Development, Security, and Ops teams collaborate"
msgstr ""
@@ -15326,7 +15547,7 @@ msgstr ""
msgid "GitLab is open source software to collaborate on code."
msgstr ""
-msgid "GitLab is undergoing maintenance and is operating in a read-only mode."
+msgid "GitLab is undergoing maintenance and is operating in read-only mode."
msgstr ""
msgid "GitLab member or Email address"
@@ -15338,9 +15559,6 @@ msgstr ""
msgid "GitLab project export"
msgstr ""
-msgid "GitLab restart is required to apply changes."
-msgstr ""
-
msgid "GitLab single sign-on URL"
msgstr ""
@@ -15356,9 +15574,6 @@ msgstr ""
msgid "GitLab version"
msgstr ""
-msgid "GitLab will inform you if a new version is available."
-msgstr ""
-
msgid "GitLab will run a background job that will produce pseudonymized CSVs of the GitLab database that will be uploaded to your configured object storage directory."
msgstr ""
@@ -15623,9 +15838,21 @@ msgstr ""
msgid "Go to snippets"
msgstr ""
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check 'Allowed domains for sign-ups'."
+msgstr ""
+
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check 'Email restrictions for sign-ups'."
+msgstr ""
+
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check the 'Domain denylist'."
+msgstr ""
+
msgid "Go to the activity feed"
msgstr ""
+msgid "Go to the group’s 'Settings &gt; General' page, and check 'Restrict membership by email domain'."
+msgstr ""
+
msgid "Go to the milestone list"
msgstr ""
@@ -15662,6 +15889,12 @@ msgstr ""
msgid "Goal of the changes and what reviewers should be aware of"
msgstr ""
+msgid "Google Cloud"
+msgstr ""
+
+msgid "Google Cloud offers several deployment targets. Select the one most suitable for your project."
+msgstr ""
+
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
@@ -15746,9 +15979,6 @@ msgstr ""
msgid "Group ID"
msgstr ""
-msgid "Group ID: %{group_id}"
-msgstr ""
-
msgid "Group Owner must have signed in with SAML before enabling Group Managed Accounts"
msgstr ""
@@ -15923,6 +16153,12 @@ msgstr ""
msgid "GroupImport|Unable to process group import file"
msgstr ""
+msgid "GroupPage|Copy group ID"
+msgstr ""
+
+msgid "GroupPage|Group ID: %{group_id}"
+msgstr ""
+
msgid "GroupRoadmap|%{dateWord} – No end date"
msgstr ""
@@ -15977,6 +16213,9 @@ msgstr ""
msgid "GroupRoadmap|Within 3 years"
msgstr ""
+msgid "GroupSAML|\"persistent\" recommended"
+msgstr ""
+
msgid "GroupSAML|%{strongOpen}Warning%{strongClose} - Enabling %{linkStart}SSO enforcement%{linkEnd} can reduce security risks."
msgstr ""
@@ -16109,6 +16348,9 @@ msgstr ""
msgid "GroupSAML|To be able to prohibit outer forks, you first need to enforce dedicate group managed accounts."
msgstr ""
+msgid "GroupSAML|Use SAML group links to manage group membership using SAML."
+msgstr ""
+
msgid "GroupSAML|Valid SAML Response"
msgstr ""
@@ -16121,13 +16363,10 @@ msgstr ""
msgid "GroupSAML|as %{access_level}"
msgstr ""
-msgid "GroupSAML|must match stored NameID of \"%{extern_uid}\" as we use this to identify users. If the NameID changes users will be unable to sign in."
-msgstr ""
-
-msgid "GroupSAML|should be \"persistent\""
+msgid "GroupSAML|must match stored NameID of \"%{extern_uid}\" to identify user and allow sign in"
msgstr ""
-msgid "GroupSAML|should be a random persistent ID, emails are discouraged"
+msgid "GroupSAML|recommend persistent ID instead of email"
msgstr ""
msgid "GroupSelect|No matching results"
@@ -16142,9 +16381,15 @@ msgstr ""
msgid "GroupSettings|Allow project access token creation"
msgstr ""
+msgid "GroupSettings|Applied to all subgroups unless overridden by a group owner. Groups already added to the project lose access."
+msgstr ""
+
msgid "GroupSettings|Auto DevOps pipeline was updated for the group"
msgstr ""
+msgid "GroupSettings|Available only on the top-level group. Applies to all subgroups. Groups already shared with a group outside %{group} are still shared unless removed manually."
+msgstr ""
+
msgid "GroupSettings|Badges"
msgstr ""
@@ -16196,6 +16441,9 @@ msgstr ""
msgid "GroupSettings|New runners registration token has been generated!"
msgstr ""
+msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgstr ""
+
msgid "GroupSettings|Pipeline settings was updated for the group"
msgstr ""
@@ -16208,12 +16456,15 @@ msgstr ""
msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
-msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups."
+msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups"
msgstr ""
msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
msgstr ""
+msgid "GroupSettings|Prevents group members from being notified if the group is mentioned."
+msgstr ""
+
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
msgstr ""
@@ -16250,21 +16501,6 @@ msgstr ""
msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}."
msgstr ""
-msgid "GroupSettings|This setting is only available on the top-level group and it applies to all subgroups. Groups that have already been shared with a group outside %{group} will still be shared, and this access will have to be revoked manually."
-msgstr ""
-
-msgid "GroupSettings|This setting will be applied to all subgroups unless overridden by a group owner. Groups that already have access to the project will continue to have access unless removed manually."
-msgstr ""
-
-msgid "GroupSettings|This setting will override user notification preferences for all members of the group, subgroups, and projects."
-msgstr ""
-
-msgid "GroupSettings|This setting will prevent group members from being notified if the group is mentioned."
-msgstr ""
-
-msgid "GroupSettings|This setting will prevent group members from forking projects outside of the group."
-msgstr ""
-
msgid "GroupSettings|Transfer group"
msgstr ""
@@ -16382,7 +16618,7 @@ msgstr ""
msgid "GroupsNew|No import options available"
msgstr ""
-msgid "GroupsNew|Not all related objects are migrated, as %{docs_link_start}described here%{docs_link_end}. Please %{feedback_link_start}leave feedback%{feedback_link_end} on this feature."
+msgid "GroupsNew|Not all related objects are migrated. %{docs_link_start}More info%{docs_link_end}."
msgstr ""
msgid "GroupsNew|Personal access token"
@@ -16514,15 +16750,27 @@ msgstr ""
msgid "Hello %{name},"
msgstr ""
-msgid "Hello there"
-msgstr ""
-
msgid "Hello, %{name}!"
msgstr ""
msgid "Hello, %{username}!"
msgstr ""
+msgid "HelloMessage|%{handshake_emoji} Contribute to GitLab: %{contribute_link}"
+msgstr ""
+
+msgid "HelloMessage|%{magnifier_emoji} Create a new GitLab issue: %{new_issue_link}"
+msgstr ""
+
+msgid "HelloMessage|%{rocket_emoji} We like your curiosity! Help us improve GitLab by joining the team: %{jobs_page_link}"
+msgstr ""
+
+msgid "HelloMessage|Does this page need fixes or improvements? Open an issue or contribute a merge request to help make GitLab more lovable. At GitLab, everyone can contribute!"
+msgstr ""
+
+msgid "HelloMessage|Welcome to GitLab!"
+msgstr ""
+
msgid "Help"
msgstr ""
@@ -16532,13 +16780,10 @@ msgstr ""
msgid "Helps prevent bots from creating accounts."
msgstr ""
-msgid "Helps prevent bots from creating issues"
-msgstr ""
-
-msgid "Helps prevent malicious users hide their activity"
+msgid "Helps prevent bots from creating issues."
msgstr ""
-msgid "Helps reduce request volume (e.g. from crawlers or abusive bots)"
+msgid "Helps prevent malicious users hide their activity."
msgstr ""
msgid "Helps reduce request volume (for example, from crawlers or abusive bots)"
@@ -16662,6 +16907,12 @@ msgstr ""
msgid "Housekeeping, export, path, transfer, remove, archive."
msgstr ""
+msgid "How do I configure Akismet?"
+msgstr ""
+
+msgid "How do I configure it?"
+msgstr ""
+
msgid "How do I configure runners?"
msgstr ""
@@ -16683,19 +16934,25 @@ msgstr ""
msgid "How do I set up this service?"
msgstr ""
+msgid "How do I use a web terminal?"
+msgstr ""
+
+msgid "How do I use file templates?"
+msgstr ""
+
msgid "How it works"
msgstr ""
msgid "How many days need to pass between marking entity for deletion and actual removing it."
msgstr ""
-msgid "How many seconds an IP will be counted towards the limit"
+msgid "How many seconds an IP counts toward the IP address limit."
msgstr ""
-msgid "I accept the %{terms_link}"
+msgid "How the job limiter handles jobs exceeding the thresholds specified below. The 'track' mode only logs the jobs. The 'compress' mode compresses the jobs and raises an exception if the compressed size exceeds the limit."
msgstr ""
-msgid "I accept the|Terms of Service and Privacy Policy"
+msgid "I accept the %{terms_link}"
msgstr ""
msgid "I forgot my password"
@@ -16779,13 +17036,16 @@ msgstr ""
msgid "IP Address"
msgstr ""
-msgid "IP expiration time"
+msgid "IP address expiration time"
msgstr ""
-msgid "IP subnet restriction only allowed for top-level groups"
+msgid "IP address restrictions"
+msgstr ""
+
+msgid "IP addresses per user"
msgstr ""
-msgid "IPs per user"
+msgid "IP subnet restriction only allowed for top-level groups"
msgstr ""
msgid "Identifier"
@@ -16800,6 +17060,9 @@ msgstr ""
msgid "If any indexed field exceeds this limit it will be truncated to this number of characters and the rest will not be indexed or searchable. This does not apply to repository and wiki indexing. Setting this to 0 means it is unlimited."
msgstr ""
+msgid "If blank, defaults to %{code_open}Retry later%{code_close}."
+msgstr ""
+
msgid "If blank, set allowable lifetime to %{instance_level_policy_in_words}, as defined by the instance admin. Once set, existing tokens for users in this group may be revoked."
msgstr ""
@@ -16851,6 +17114,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 did not initiate these sign-in attempts, please reach out to your administrator or enable two-factor authentication (2FA) on your account."
+msgstr ""
+
msgid "If you did not initiate this change, please contact your administrator immediately."
msgstr ""
@@ -16942,10 +17208,10 @@ msgstr ""
msgid "Import Projects from Gitea"
msgstr ""
-msgid "Import a project"
+msgid "Import an exported GitLab project"
msgstr ""
-msgid "Import an exported GitLab project"
+msgid "Import and export rate limits"
msgstr ""
msgid "Import failed due to a GitHub error: %{original}"
@@ -16957,12 +17223,18 @@ msgstr ""
msgid "Import from Jira"
msgstr ""
+msgid "Import group"
+msgstr ""
+
msgid "Import group from file"
msgstr ""
msgid "Import groups"
msgstr ""
+msgid "Import history"
+msgstr ""
+
msgid "Import in progress"
msgstr ""
@@ -17026,7 +17298,25 @@ msgstr ""
msgid "Import timed out. Import took longer than %{import_jobs_expiration} seconds"
msgstr ""
-msgid "Import/Export Rate Limits"
+msgid "ImportAProjectModal|Import from a project"
+msgstr ""
+
+msgid "ImportAProjectModal|Import members from another project"
+msgstr ""
+
+msgid "ImportAProjectModal|Import project members"
+msgstr ""
+
+msgid "ImportAProjectModal|Only project members (not group members) are imported, and they get the same permissions as the project you import from."
+msgstr ""
+
+msgid "ImportAProjectModal|Successfully imported"
+msgstr ""
+
+msgid "ImportAProjectModal|Unable to import project members"
+msgstr ""
+
+msgid "ImportAProjectModal|You're importing members to the %{strongStart}%{name}%{strongEnd} project."
msgstr ""
msgid "ImportButtons|Connect repositories from"
@@ -17079,7 +17369,7 @@ msgstr[1] ""
msgid "Importing..."
msgstr ""
-msgid "Import|A repository URL usually ends in a .git suffix, although this is not required. Double check to make sure your repository URL is correct."
+msgid "Import|There is not a valid Git repository at this URL. If your HTTP repository is not publicly accessible, verify your credentials."
msgstr ""
msgid "Improve customer support with Service Desk"
@@ -17088,9 +17378,6 @@ msgstr ""
msgid "Improves Git cloning performance."
msgstr ""
-msgid "In %{time_to_now}"
-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 ""
@@ -17376,7 +17663,7 @@ msgstr ""
msgid "InProductMarketing|Start a GitLab Ultimate trial today in less than one minute, no credit card required."
msgstr ""
-msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no CC required"
+msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no credit card required"
msgstr ""
msgid "InProductMarketing|Start a trial"
@@ -17415,7 +17702,7 @@ msgstr ""
msgid "InProductMarketing|Team up in GitLab for greater efficiency"
msgstr ""
-msgid "InProductMarketing|Team work makes the dream work"
+msgid "InProductMarketing|Team work makes the dream work"
msgstr ""
msgid "InProductMarketing|Test, create, deploy"
@@ -17996,6 +18283,9 @@ msgstr ""
msgid "Integrations|Create new issue in Jira"
msgstr ""
+msgid "Integrations|Create new issue in ZenTao"
+msgstr ""
+
msgid "Integrations|Default settings are inherited from the group level."
msgstr ""
@@ -18089,9 +18379,15 @@ msgstr ""
msgid "Integrations|Search Jira issues"
msgstr ""
+msgid "Integrations|Search ZenTao issues"
+msgstr ""
+
msgid "Integrations|Send notifications about project events to Unify Circuit."
msgstr ""
+msgid "Integrations|Send notifications about project events to a Unify Circuit conversation. %{docs_link}"
+msgstr ""
+
msgid "Integrations|Sign in to add namespaces"
msgstr ""
@@ -18131,6 +18427,9 @@ msgstr ""
msgid "Integrations|You've activated every integration 🎉"
msgstr ""
+msgid "Integrations|ZenTao issues display here when you create issues in your project in ZenTao."
+msgstr ""
+
msgid "Interactive mode"
msgstr ""
@@ -18158,9 +18457,6 @@ msgstr ""
msgid "Interval Pattern"
msgstr ""
-msgid "Introducing Value Stream Analytics"
-msgstr ""
-
msgid "Introducing Your DevOps Report"
msgstr ""
@@ -18257,6 +18553,12 @@ msgstr ""
msgid "Investigate vulnerability: %{title}"
msgstr ""
+msgid "Invisible Captcha"
+msgstr ""
+
+msgid "Invisible Captcha helps prevent the creation of spam accounts. It adds a honeypot field and time-sensitive form submission to the account signup form."
+msgstr ""
+
msgid "Invitation"
msgstr ""
@@ -18710,12 +19012,18 @@ msgstr ""
msgid "Issues"
msgstr ""
+msgid "Issues I've created"
+msgstr ""
+
msgid "Issues Rate Limits"
msgstr ""
msgid "Issues and merge requests"
msgstr ""
+msgid "Issues assigned to me"
+msgstr ""
+
msgid "Issues can be bugs, tasks or ideas to be discussed. Also, issues are searchable and filterable."
msgstr ""
@@ -18827,7 +19135,7 @@ msgstr ""
msgid "Iterations|Create cadence"
msgstr ""
-msgid "Iterations|Create your first iteration"
+msgid "Iterations|Create iteration"
msgstr ""
msgid "Iterations|Delete cadence"
@@ -18836,6 +19144,9 @@ msgstr ""
msgid "Iterations|Delete iteration cadence?"
msgstr ""
+msgid "Iterations|Delete iteration?"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -18869,12 +19180,18 @@ msgstr ""
msgid "Iterations|New iteration cadence"
msgstr ""
+msgid "Iterations|No closed iterations."
+msgstr ""
+
msgid "Iterations|No iteration cadences to show."
msgstr ""
msgid "Iterations|No iterations in cadence."
msgstr ""
+msgid "Iterations|No open iterations."
+msgstr ""
+
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
@@ -18905,6 +19222,9 @@ msgstr ""
msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
msgstr ""
+msgid "Iterations|This will remove the iteration from any issues that are assigned to it."
+msgstr ""
+
msgid "Iterations|Title"
msgstr ""
@@ -18920,15 +19240,9 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "I’m familiar with the basics of DevOps."
-msgstr ""
-
msgid "I’m joining my team who’s already on GitLab"
msgstr ""
-msgid "I’m not familiar with the basics of DevOps."
-msgstr ""
-
msgid "Jaeger URL"
msgstr ""
@@ -19193,6 +19507,9 @@ msgstr ""
msgid "Job"
msgstr ""
+msgid "Job %{jobName}"
+msgstr ""
+
msgid "Job Failed #%{build_id}"
msgstr ""
@@ -19783,9 +20100,6 @@ msgstr ""
msgid "Learn more in the"
msgstr ""
-msgid "Learn more in the|pipeline schedules documentation"
-msgstr ""
-
msgid "Learn more."
msgstr ""
@@ -19897,9 +20211,6 @@ msgstr ""
msgid "Leave Admin Mode"
msgstr ""
-msgid "Leave blank for no limit. Once set, existing personal access tokens may be revoked."
-msgstr ""
-
msgid "Leave edit mode? All unsaved changes will be lost."
msgstr ""
@@ -19945,10 +20256,10 @@ msgstr ""
msgid "LicenseCompliance|Acceptable license to be used in the project"
msgstr ""
-msgid "LicenseCompliance|Add a license"
+msgid "LicenseCompliance|Add license and related policy"
msgstr ""
-msgid "LicenseCompliance|Add license and related policy"
+msgid "LicenseCompliance|Add license policy"
msgstr ""
msgid "LicenseCompliance|Allow"
@@ -20038,6 +20349,9 @@ msgstr ""
msgid "LicenseManagement|Uncategorized"
msgstr ""
+msgid "Licensed Enterprise Edition features can be used if the project namespace's plan includes the feature, or if the project is public."
+msgstr ""
+
msgid "Licensed Features"
msgstr ""
@@ -20104,7 +20418,10 @@ msgstr ""
msgid "Limit namespaces and projects that can be indexed"
msgstr ""
-msgid "Limit sign in from multiple ips"
+msgid "Limit project size at a global, group, and project level. %{link_start}Learn more%{link_end}."
+msgstr ""
+
+msgid "Limit sign in from multiple IP addresses"
msgstr ""
msgid "Limit the number of concurrent operations this secondary site can run in the background."
@@ -20116,11 +20433,17 @@ msgstr ""
msgid "Limit the number of issues and epics per minute a user can create through web and API requests."
msgstr ""
+msgid "Limit the size of Sidekiq jobs stored in Redis."
+msgstr ""
+
msgid "Limited to showing %d event at most"
msgid_plural "Limited to showing %d events at most"
msgstr[0] ""
msgstr[1] ""
+msgid "Limiting mode"
+msgstr ""
+
msgid "Line changes"
msgstr ""
@@ -20190,9 +20513,6 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
-msgid "List of users to be excluded from the limit"
-msgstr ""
-
msgid "List options"
msgstr ""
@@ -20232,9 +20552,6 @@ msgstr ""
msgid "Loading functions timed out. Please reload the page to try again."
msgstr ""
-msgid "Loading issues"
-msgstr ""
-
msgid "Loading more"
msgstr ""
@@ -20526,6 +20843,9 @@ msgstr ""
msgid "Marked For Deletion At - %{deletion_time}"
msgstr ""
+msgid "Marked as ready. Merging is now allowed."
+msgstr ""
+
msgid "Marked this %{noun} as a draft."
msgstr ""
@@ -20598,52 +20918,22 @@ msgstr ""
msgid "Max 100,000 events"
msgstr ""
-msgid "Max 20 characters"
-msgstr ""
-
-msgid "Max Group Export Download requests per minute per user"
-msgstr ""
-
-msgid "Max Group Export requests per minute per user"
-msgstr ""
-
-msgid "Max Group Import requests per minute per user"
-msgstr ""
-
-msgid "Max Project Export Download requests per minute per user"
-msgstr ""
-
-msgid "Max Project Export requests per minute per user"
-msgstr ""
-
-msgid "Max Project Import requests per minute per user"
-msgstr ""
-
-msgid "Max authenticated API requests per period per user"
-msgstr ""
-
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
-msgid "Max authenticated web requests per period per user"
-msgstr ""
-
msgid "Max file size is 200 KB."
msgstr ""
-msgid "Max requests per minute per user"
-msgstr ""
-
msgid "Max role"
msgstr ""
msgid "Max session time"
msgstr ""
-msgid "Max unauthenticated requests per period per IP"
+msgid "MaxBuilds"
msgstr ""
-msgid "MaxBuilds"
+msgid "Maximum 20 characters"
msgstr ""
msgid "Maximum Conan package file size in bytes"
@@ -20679,6 +20969,12 @@ msgstr ""
msgid "Maximum attachment size (MB)"
msgstr ""
+msgid "Maximum authenticated API requests per rate limit period per user"
+msgstr ""
+
+msgid "Maximum authenticated web requests per rate limit period per user"
+msgstr ""
+
msgid "Maximum bulk request size (MiB)"
msgstr ""
@@ -20724,6 +21020,15 @@ msgstr ""
msgid "Maximum files in a diff"
msgstr ""
+msgid "Maximum group export download requests per minute"
+msgstr ""
+
+msgid "Maximum group export requests per minute"
+msgstr ""
+
+msgid "Maximum group import requests per minute"
+msgstr ""
+
msgid "Maximum import size"
msgstr ""
@@ -20760,7 +21065,7 @@ msgstr ""
msgid "Maximum number of projects."
msgstr ""
-msgid "Maximum number of unique IPs per user"
+msgid "Maximum number of unique IP addresses per user."
msgstr ""
msgid "Maximum page reached"
@@ -20769,12 +21074,24 @@ msgstr ""
msgid "Maximum page size"
msgstr ""
+msgid "Maximum project export download requests per minute"
+msgstr ""
+
+msgid "Maximum project export requests per minute"
+msgstr ""
+
+msgid "Maximum project import requests per minute"
+msgstr ""
+
msgid "Maximum push size"
msgstr ""
msgid "Maximum push size (MB)"
msgstr ""
+msgid "Maximum requests per minute"
+msgstr ""
+
msgid "Maximum running slices"
msgstr ""
@@ -20802,10 +21119,16 @@ msgstr ""
msgid "Maximum time between updates that a mirror can have when scheduled to synchronize."
msgstr ""
-msgid "Maximum time for web terminal websocket connection (in seconds). 0 for unlimited."
+msgid "Maximum time that users are allowed to skip the setup of two-factor authentication (in hours). Set to 0 (zero) to enforce at next sign in."
msgstr ""
-msgid "Maximum time that users are allowed to skip the setup of two-factor authentication (in hours). Set to 0 (zero) to enforce at next sign in."
+msgid "Maximum time, in seconds, for a web terminal websocket connection. 0 for unlimited."
+msgstr ""
+
+msgid "Maximum unauthenticated API requests per rate limit period per IP"
+msgstr ""
+
+msgid "Maximum unauthenticated web requests per rate limit period per IP"
msgstr ""
msgid "May"
@@ -20823,9 +21146,6 @@ msgstr ""
msgid "Medium vulnerabilities present"
msgstr ""
-msgid "Member lock"
-msgstr ""
-
msgid "Member since"
msgstr ""
@@ -20862,6 +21182,9 @@ msgstr ""
msgid "Members of a group may only view projects they have permission to access"
msgstr ""
+msgid "Membership"
+msgstr ""
+
msgid "Members|%{time} by %{user}"
msgstr ""
@@ -20922,9 +21245,6 @@ msgstr ""
msgid "Members|Expiration date updated successfully."
msgstr ""
-msgid "Members|Expired"
-msgstr ""
-
msgid "Members|Filter members"
msgstr ""
@@ -20940,9 +21260,6 @@ msgstr ""
msgid "Members|Membership"
msgstr ""
-msgid "Members|No expiration set"
-msgstr ""
-
msgid "Members|Remove \"%{groupName}\""
msgstr ""
@@ -20964,9 +21281,6 @@ msgstr ""
msgid "Members|Search invited"
msgstr ""
-msgid "Members|in %{time}"
-msgstr ""
-
msgid "Member|Deny access"
msgstr ""
@@ -21042,9 +21356,6 @@ msgstr ""
msgid "Merge request %{mr_link} was reviewed by %{mr_author}"
msgstr ""
-msgid "Merge request (MR) approvals"
-msgstr ""
-
msgid "Merge request analytics"
msgstr ""
@@ -21066,12 +21377,21 @@ msgstr ""
msgid "Merge requests"
msgstr ""
+msgid "Merge requests I've created"
+msgstr ""
+
msgid "Merge requests are a place to propose changes you've made to a project and discuss those changes with others"
msgstr ""
msgid "Merge requests are read-only in a secondary Geo node"
msgstr ""
+msgid "Merge requests assigned to me"
+msgstr ""
+
+msgid "Merge requests that I'm a reviewer"
+msgstr ""
+
msgid "Merge the branch and fix any conflicts that come up"
msgstr ""
@@ -21132,10 +21452,10 @@ msgstr ""
msgid "MergeRequests|An error occurred while saving the draft comment."
msgstr ""
-msgid "MergeRequests|Failed to squash. Should be done manually."
+msgid "MergeRequests|Create issue to resolve thread"
msgstr ""
-msgid "MergeRequests|Resolve this thread in a new issue"
+msgid "MergeRequests|Failed to squash. Should be done manually."
msgstr ""
msgid "MergeRequests|Saving the comment failed"
@@ -21949,6 +22269,9 @@ msgstr ""
msgid "MoveIssue|Cannot move issue to project it originates from!"
msgstr ""
+msgid "MoveIssue|Cannot move issues of '%{issue_type}' type."
+msgstr ""
+
msgid "Moved issue to %{label} column in the board."
msgstr ""
@@ -22074,6 +22397,15 @@ 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. To learn more about reducing storage capacity please visit our docs."
msgstr ""
+msgid "NamespaceUserCap|Pending users must be reviewed and approved by a group owner. Learn more about %{user_caps_link_start}User Caps%{link_end} and %{users_pending_approval_link_start}Users Pending Approval%{link_end}."
+msgstr ""
+
+msgid "NamespaceUserCap|View pending user approvals"
+msgstr ""
+
+msgid "NamespaceUserCap|Your group has reached its billable member limit"
+msgstr ""
+
msgid "Namespaces"
msgstr ""
@@ -22116,9 +22448,6 @@ msgstr ""
msgid "Network"
msgstr ""
-msgid "Network Policy|New rule"
-msgstr ""
-
msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is inbound from a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
msgstr ""
@@ -22140,16 +22469,13 @@ msgstr ""
msgid "NetworkPolicies|%{strongOpen}any%{strongClose} port"
msgstr ""
-msgid "NetworkPolicies|+ Add alert"
-msgstr ""
-
msgid "NetworkPolicies|.yaml"
msgstr ""
msgid "NetworkPolicies|.yaml mode"
msgstr ""
-msgid "NetworkPolicies|Actions"
+msgid "NetworkPolicies|Add alert"
msgstr ""
msgid "NetworkPolicies|Alerts are intended to be selectively used for a limited number of events that are potentially concerning and warrant a manual review. Alerts should not be used as a substitute for a SIEM or a logging tool. High volume alerts are likely to be dropped so as to preserve the stability of GitLab's integration with Kubernetes."
@@ -22185,9 +22511,6 @@ msgstr ""
msgid "NetworkPolicies|Deny all traffic"
msgstr ""
-msgid "NetworkPolicies|Description"
-msgstr ""
-
msgid "NetworkPolicies|Edit policy"
msgstr ""
@@ -22200,9 +22523,6 @@ msgstr ""
msgid "NetworkPolicies|IP/subnet"
msgstr ""
-msgid "NetworkPolicies|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
-msgstr ""
-
msgid "NetworkPolicies|Invalid or empty policy"
msgstr ""
@@ -22212,19 +22532,16 @@ msgstr ""
msgid "NetworkPolicies|Kubernetes error: %{error}"
msgstr ""
-msgid "NetworkPolicies|Name"
-msgstr ""
-
msgid "NetworkPolicies|Network"
msgstr ""
-msgid "NetworkPolicies|Network traffic"
+msgid "NetworkPolicies|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
msgstr ""
-msgid "NetworkPolicies|New policy"
+msgid "NetworkPolicies|Network policy can be created after the environment is loaded successfully."
msgstr ""
-msgid "NetworkPolicies|No policies detected"
+msgid "NetworkPolicies|Network traffic"
msgstr ""
msgid "NetworkPolicies|None selected"
@@ -22233,21 +22550,12 @@ msgstr ""
msgid "NetworkPolicies|Please %{installLinkStart}install%{installLinkEnd} and %{configureLinkStart}configure a Kubernetes Agent for this project%{configureLinkEnd} to enable alerts."
msgstr ""
-msgid "NetworkPolicies|Policies are a specification of how groups of pods are allowed to communicate with each other's network endpoints."
-msgstr ""
-
msgid "NetworkPolicies|Policy %{policyName} was successfully changed"
msgstr ""
msgid "NetworkPolicies|Policy definition"
msgstr ""
-msgid "NetworkPolicies|Policy editor"
-msgstr ""
-
-msgid "NetworkPolicies|Policy preview"
-msgstr ""
-
msgid "NetworkPolicies|Rule"
msgstr ""
@@ -22257,9 +22565,6 @@ msgstr ""
msgid "NetworkPolicies|Rule mode is unavailable for this policy. In some cases, we cannot parse the YAML file back into the rules editor."
msgstr ""
-msgid "NetworkPolicies|Rules"
-msgstr ""
-
msgid "NetworkPolicies|Save changes"
msgstr ""
@@ -22272,9 +22577,6 @@ msgstr ""
msgid "NetworkPolicies|Traffic that does not match any rule will be blocked."
msgstr ""
-msgid "NetworkPolicies|Unable to parse policy"
-msgstr ""
-
msgid "NetworkPolicies|all DNS names"
msgstr ""
@@ -22454,6 +22756,9 @@ msgstr ""
msgid "New issue"
msgstr ""
+msgid "New issue in %{project}"
+msgstr ""
+
msgid "New issue title"
msgstr ""
@@ -22532,7 +22837,7 @@ msgstr ""
msgid "Newest first"
msgstr ""
-msgid "Newly registered users will by default be external"
+msgid "Newly-registered users are external by default"
msgstr ""
msgid "Next"
@@ -22847,8 +23152,10 @@ msgstr ""
msgid "No webhooks found, add one in the form above."
msgstr ""
-msgid "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} to renew your subscription."
-msgstr ""
+msgid "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} day to renew your subscription."
+msgid_plural "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} days to renew your subscription."
+msgstr[0] ""
+msgstr[1] ""
msgid "No. of commits"
msgstr ""
@@ -22865,7 +23172,7 @@ msgstr ""
msgid "Nodes"
msgstr ""
-msgid "Non-admin users can sign in with read-only access and make read-only API requests."
+msgid "Non-admin users are restricted to read-only access, in both GitLab UI and API."
msgstr ""
msgid "None"
@@ -22946,7 +23253,7 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
-msgid "Notes Rate Limits"
+msgid "Notes rate limit"
msgstr ""
msgid "Notes|Are you sure you want to cancel creating this comment?"
@@ -23113,9 +23420,6 @@ msgstr ""
msgid "November"
msgstr ""
-msgid "Novice"
-msgstr ""
-
msgid "Now, personalize your GitLab experience"
msgstr ""
@@ -23284,7 +23588,7 @@ msgstr ""
msgid "OnCallSchedules|For this rotation, on-call will be:"
msgstr ""
-msgid "OnCallSchedules|On-call schedule %{schedule} in Project %{project}"
+msgid "OnCallSchedules|On-call schedule %{obstacle} in Project %{project}"
msgstr ""
msgid "OnCallSchedules|On-call schedules"
@@ -23431,22 +23735,22 @@ msgstr ""
msgid "OnDemandScans|Scanner profile"
msgstr ""
-msgid "OnDemandScans|Select one of the existing profiles"
+msgid "OnDemandScans|Schedule scan"
msgstr ""
-msgid "OnDemandScans|Site profile"
+msgid "OnDemandScans|Select one of the existing profiles"
msgstr ""
-msgid "OnDemandScans|Use existing scanner profile"
+msgid "OnDemandScans|Site profile"
msgstr ""
-msgid "OnDemandScans|Use existing site profile"
+msgid "OnDemandScans|Start time"
msgstr ""
-msgid "OnDemandScans|You can either choose a passive scan or validate the target site in your chosen site profile. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
+msgid "OnDemandScans|Use existing scanner profile"
msgstr ""
-msgid "OnDemandScans|You cannot run an active scan against an unvalidated site."
+msgid "OnDemandScans|Use existing site profile"
msgstr ""
msgid "OnDemandScans|You must create a repository within your project to run an on-demand scan."
@@ -23511,6 +23815,9 @@ msgstr ""
msgid "Only admins can delete project"
msgstr ""
+msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
+msgstr ""
+
msgid "Only include features new to your current subscription tier."
msgstr ""
@@ -23529,6 +23836,12 @@ msgstr ""
msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
+msgid "Only reCAPTCHA v2 is supported:"
+msgstr ""
+
+msgid "Only users from the specified IP address ranges are able to reach this group, including all subgroups, projects, and Git repositories."
+msgstr ""
+
msgid "Only verified users with an email address in any of these domains can be added to the group."
msgstr ""
@@ -23715,9 +24028,6 @@ msgstr ""
msgid "Package Registry"
msgstr ""
-msgid "Package Registry Rate Limits"
-msgstr ""
-
msgid "Package Registry: authenticated API requests"
msgstr ""
@@ -23736,6 +24046,9 @@ msgstr ""
msgid "Package recipe already exists"
msgstr ""
+msgid "Package registry rate limits"
+msgstr ""
+
msgid "Package type"
msgstr ""
@@ -23802,6 +24115,9 @@ msgstr ""
msgid "PackageRegistry|Composer"
msgstr ""
+msgid "PackageRegistry|Composer.json with license: %{license} and version: %{version}"
+msgstr ""
+
msgid "PackageRegistry|Conan"
msgstr ""
@@ -23865,6 +24181,9 @@ msgstr ""
msgid "PackageRegistry|Copy require package include"
msgstr ""
+msgid "PackageRegistry|Copy target SHA"
+msgstr ""
+
msgid "PackageRegistry|Copy yarn command"
msgstr ""
@@ -23931,6 +24250,9 @@ msgstr ""
msgid "PackageRegistry|Install package version"
msgstr ""
+msgid "PackageRegistry|Instance-level"
+msgstr ""
+
msgid "PackageRegistry|Invalid Package: failed metadata extraction"
msgstr ""
@@ -23976,6 +24298,9 @@ msgstr ""
msgid "PackageRegistry|Pip Command"
msgstr ""
+msgid "PackageRegistry|Project-level"
+msgstr ""
+
msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
msgstr ""
@@ -23997,6 +24322,9 @@ msgstr ""
msgid "PackageRegistry|Remove package"
msgstr ""
+msgid "PackageRegistry|Required Python: %{pythonVersion}"
+msgstr ""
+
msgid "PackageRegistry|RubyGems"
msgstr ""
@@ -24039,6 +24367,9 @@ msgstr ""
msgid "PackageRegistry|Source project located at %{link}"
msgstr ""
+msgid "PackageRegistry|Target SHA: %{sha}"
+msgstr ""
+
msgid "PackageRegistry|There are no other versions of this package."
msgstr ""
@@ -24207,6 +24538,18 @@ msgstr ""
msgid "Password was successfully updated. Please sign in again."
msgstr ""
+msgid "PasswordPrompt|Confirm password"
+msgstr ""
+
+msgid "PasswordPrompt|Confirm password to continue"
+msgstr ""
+
+msgid "PasswordPrompt|Password is required"
+msgstr ""
+
+msgid "PasswordPrompt|Please enter your password to confirm"
+msgstr ""
+
msgid "Passwords should be unique and not used for any other sites or services."
msgstr ""
@@ -24234,6 +24577,9 @@ msgstr ""
msgid "Paste project path (i.e. gitlab-org/gitlab)"
msgstr ""
+msgid "Paste this DSN into your Sentry SDK"
+msgstr ""
+
msgid "Paste your public SSH key, which is usually contained in the file '~/.ssh/id_ed25519.pub' or '~/.ssh/id_rsa.pub' and begins with 'ssh-ed25519' or 'ssh-rsa'. Do not paste your private SSH key, as that can compromise your identity."
msgstr ""
@@ -24318,6 +24664,9 @@ msgstr ""
msgid "PerformanceBar|First Contentful Paint"
msgstr ""
+msgid "PerformanceBar|Flamegraph with mode:"
+msgstr ""
+
msgid "PerformanceBar|Frontend resources"
msgstr ""
@@ -24351,6 +24700,15 @@ msgstr ""
msgid "PerformanceBar|Trace"
msgstr ""
+msgid "PerformanceBar|cpu"
+msgstr ""
+
+msgid "PerformanceBar|object"
+msgstr ""
+
+msgid "PerformanceBar|wall"
+msgstr ""
+
msgid "Period in seconds"
msgstr ""
@@ -24579,6 +24937,48 @@ msgstr ""
msgid "PipelineSchedules|Variables"
msgstr ""
+msgid "PipelineSource|API"
+msgstr ""
+
+msgid "PipelineSource|Chat"
+msgstr ""
+
+msgid "PipelineSource|External"
+msgstr ""
+
+msgid "PipelineSource|External Pull Request"
+msgstr ""
+
+msgid "PipelineSource|Merge Request"
+msgstr ""
+
+msgid "PipelineSource|On-Demand DAST Scan"
+msgstr ""
+
+msgid "PipelineSource|On-Demand DAST Validation"
+msgstr ""
+
+msgid "PipelineSource|Parent Pipeline"
+msgstr ""
+
+msgid "PipelineSource|Pipeline"
+msgstr ""
+
+msgid "PipelineSource|Push"
+msgstr ""
+
+msgid "PipelineSource|Schedule"
+msgstr ""
+
+msgid "PipelineSource|Trigger"
+msgstr ""
+
+msgid "PipelineSource|Web"
+msgstr ""
+
+msgid "PipelineSource|Web IDE"
+msgstr ""
+
msgid "PipelineStatusTooltip|Pipeline: %{ciStatus}"
msgstr ""
@@ -24879,46 +25279,7 @@ msgstr ""
msgid "Pipeline|Source"
msgstr ""
-msgid "Pipeline|Source|API"
-msgstr ""
-
-msgid "Pipeline|Source|Chat"
-msgstr ""
-
-msgid "Pipeline|Source|External"
-msgstr ""
-
-msgid "Pipeline|Source|External Pull Request"
-msgstr ""
-
-msgid "Pipeline|Source|Merge Request"
-msgstr ""
-
-msgid "Pipeline|Source|On-Demand DAST Scan"
-msgstr ""
-
-msgid "Pipeline|Source|On-Demand DAST Validation"
-msgstr ""
-
-msgid "Pipeline|Source|Parent Pipeline"
-msgstr ""
-
-msgid "Pipeline|Source|Pipeline"
-msgstr ""
-
-msgid "Pipeline|Source|Push"
-msgstr ""
-
-msgid "Pipeline|Source|Schedule"
-msgstr ""
-
-msgid "Pipeline|Source|Trigger"
-msgstr ""
-
-msgid "Pipeline|Source|Web"
-msgstr ""
-
-msgid "Pipeline|Source|Web IDE"
+msgid "Pipeline|Source|Security Policy"
msgstr ""
msgid "Pipeline|Specify variable values to be used in this run. The values specified in %{linkStart}CI/CD settings%{linkEnd} will be used by default."
@@ -24969,7 +25330,7 @@ msgstr ""
msgid "Pipeline|We are currently unable to fetch pipeline data"
msgstr ""
-msgid "Pipeline|You’re about to stop pipeline %{pipelineId}."
+msgid "Pipeline|You’re about to stop pipeline #%{pipelineId}."
msgstr ""
msgid "Pipeline|for"
@@ -24996,6 +25357,9 @@ msgstr ""
msgid "Plain diff"
msgstr ""
+msgid "Plain-text response to send to clients that hit a rate limit"
+msgstr ""
+
msgid "Plan:"
msgstr ""
@@ -25140,9 +25504,6 @@ msgstr ""
msgid "Please provide attributes to update"
msgstr ""
-msgid "Please provide your username or email address."
-msgstr ""
-
msgid "Please reach out if you have any questions and we'll be happy to assist."
msgstr ""
@@ -25185,9 +25546,6 @@ msgstr ""
msgid "Please set a new password before proceeding."
msgstr ""
-msgid "Please share your feedback about %{featureName} %{linkStart}in this issue%{linkEnd} to help us improve the experience."
-msgstr ""
-
msgid "Please solve the captcha"
msgstr ""
@@ -25365,6 +25723,9 @@ msgstr ""
msgid "Prevent adding new members to project membership within this group"
msgstr ""
+msgid "Prevent auto-stopping"
+msgstr ""
+
msgid "Prevent editing approval rules in projects and merge requests."
msgstr ""
@@ -25377,7 +25738,7 @@ msgstr ""
msgid "Prevent users from changing their profile name"
msgstr ""
-msgid "Prevent users from performing write operations on GitLab while performing maintenance."
+msgid "Prevent users from performing write operations while GitLab maintenance is in progress."
msgstr ""
msgid "Preview"
@@ -25650,6 +26011,9 @@ msgstr ""
msgid "Profiles|Enter your name, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Enter your password to confirm the email change"
+msgstr ""
+
msgid "Profiles|Enter your pronouns to let people know how to refer to you"
msgstr ""
@@ -25884,10 +26248,10 @@ msgstr ""
msgid "Profiles|e.g. My MacBook key"
msgstr ""
-msgid "Profiles|username"
+msgid "Profiles|https://website.com"
msgstr ""
-msgid "Profiles|website.com"
+msgid "Profiles|username"
msgstr ""
msgid "Profiles|your account"
@@ -26130,9 +26494,21 @@ msgstr ""
msgid "ProjectSelect| or group"
msgstr ""
+msgid "ProjectSelect|No matching results"
+msgstr ""
+
msgid "ProjectSelect|Search for project"
msgstr ""
+msgid "ProjectSelect|Search projects"
+msgstr ""
+
+msgid "ProjectSelect|Select a project"
+msgstr ""
+
+msgid "ProjectSelect|There was an error fetching the projects. Please try again."
+msgstr ""
+
msgid "ProjectService|Drone server URL"
msgstr ""
@@ -26220,6 +26596,9 @@ msgstr ""
msgid "ProjectService|Trigger event when a new, unique alert is recorded."
msgstr ""
+msgid "ProjectService|Trigger event when a new, unique vulnerability is recorded. (Note: This feature requires an Ultimate plan.)"
+msgstr ""
+
msgid "ProjectService|Trigger event when a pipeline status changes."
msgstr ""
@@ -26634,9 +27013,15 @@ msgstr ""
msgid "Projects are graded based on the highest severity vulnerability present"
msgstr ""
+msgid "Projects are organized into groups"
+msgstr ""
+
msgid "Projects contributed to"
msgstr ""
+msgid "Projects help you organize your work. They contain your file repository, issues, merge requests, and so much more."
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr ""
@@ -26871,10 +27256,10 @@ msgstr ""
msgid "PrometheusService|Prometheus cluster integration"
msgstr ""
-msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
+msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
msgstr ""
-msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
+msgid "PrometheusService|The ID of the IAP-secured resource."
msgstr ""
msgid "PrometheusService|The Prometheus API base URL."
@@ -27492,6 +27877,9 @@ msgstr ""
msgid "Rate limit"
msgstr ""
+msgid "Rate limits can help reduce request volume (like from crawlers or abusive bots)."
+msgstr ""
+
msgid "Raw blob request rate limit per minute"
msgstr ""
@@ -27504,6 +27892,9 @@ msgstr ""
msgid "Re-authentication required"
msgstr ""
+msgid "Re-import"
+msgstr ""
+
msgid "Re-request review"
msgstr ""
@@ -27525,6 +27916,9 @@ msgstr ""
msgid "Read more about related issues"
msgstr ""
+msgid "Read their documentation."
+msgstr ""
+
msgid "Ready to get started with GitLab? Follow these steps to set up your workspace, plan and commit changes, and deploy your project."
msgstr ""
@@ -27558,6 +27952,9 @@ msgstr ""
msgid "Receive any notifications from GitLab."
msgstr ""
+msgid "Receive notification of abuse reports by email."
+msgstr ""
+
msgid "Receive notifications about your own activity"
msgstr ""
@@ -27701,9 +28098,6 @@ msgstr ""
msgid "Registry setup"
msgstr ""
-msgid "Regulate approvals by authors/committers. Affects all projects."
-msgstr ""
-
msgid "Reindexing Status: %{status} (Slice multiplier: %{multiplier}, Maximum running slices: %{max_slices})"
msgstr ""
@@ -27799,6 +28193,9 @@ msgstr ""
msgid "Release|Something went wrong while saving the release details."
msgstr ""
+msgid "Reload page"
+msgstr ""
+
msgid "Remediations"
msgstr ""
@@ -28081,6 +28478,9 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
+msgid "Repeats"
+msgstr ""
+
msgid "Replace"
msgstr ""
@@ -28443,10 +28843,7 @@ msgstr ""
msgid "Require additional authentication for administrative tasks."
msgstr ""
-msgid "Require all users in this group to setup Two-factor authentication"
-msgstr ""
-
-msgid "Require all users in this group to setup two-factor authentication"
+msgid "Require all users in this group to set up two-factor authentication"
msgstr ""
msgid "Required approvals (%{approvals_given} given)"
@@ -28492,6 +28889,9 @@ msgstr[1] ""
msgid "Requires values to meet regular expression requirements."
msgstr ""
+msgid "Requires you to deploy or set up cloud-hosted Sentry."
+msgstr ""
+
msgid "Requires your primary GitLab email address."
msgstr ""
@@ -28552,9 +28952,6 @@ msgstr ""
msgid "Resolve"
msgstr ""
-msgid "Resolve all threads in new issue"
-msgstr ""
-
msgid "Resolve conflicts"
msgstr ""
@@ -28612,6 +29009,9 @@ msgstr ""
msgid "Response text"
msgstr ""
+msgid "Restart GitLab to apply changes."
+msgstr ""
+
msgid "Restart Terminal"
msgstr ""
@@ -28630,6 +29030,9 @@ msgstr ""
msgid "Restoring the project will prevent the project from being removed on this date and restore people's ability to make changes to it."
msgstr ""
+msgid "Restrict group access by IP address. %{link_start}Learn more%{link_end}."
+msgstr ""
+
msgid "Restrict membership by email domain"
msgstr ""
@@ -28943,6 +29346,9 @@ msgstr ""
msgid "Runners|Runner #%{runner_id}"
msgstr ""
+msgid "Runners|Runner assigned to project."
+msgstr ""
+
msgid "Runners|Runner is offline, last contact was %{runner_contact} ago"
msgstr ""
@@ -28955,6 +29361,9 @@ msgstr ""
msgid "Runners|Runner registration"
msgstr ""
+msgid "Runners|Runner unassigned from project."
+msgstr ""
+
msgid "Runners|Runners"
msgstr ""
@@ -29147,7 +29556,7 @@ msgstr ""
msgid "SastEntryPoints|How do I set up SAST?"
msgstr ""
-msgid "SastEntryPoints|Learn more."
+msgid "SastEntryPoints|Learn more"
msgstr ""
msgid "Satisfied"
@@ -29189,7 +29598,7 @@ msgstr ""
msgid "Save pipeline schedule"
msgstr ""
-msgid "Save space and find images in the container Registry. remove unneeded tags and keep only the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
+msgid "Save storage space by automatically deleting tags from the container registry and keeping the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
msgstr ""
msgid "Saving"
@@ -29363,6 +29772,9 @@ msgstr ""
msgid "Search or filter results…"
msgstr ""
+msgid "Search or jump to..."
+msgstr ""
+
msgid "Search project"
msgstr ""
@@ -29423,16 +29835,16 @@ msgstr ""
msgid "SearchCodeResults|of %{link_to_project}"
msgstr ""
-msgid "SearchResults|Showing %{count} %{scope} for%{term_element}"
+msgid "SearchResults|Showing %{count} %{scope} for %{term_element}"
msgstr ""
-msgid "SearchResults|Showing %{count} %{scope} for%{term_element} in your personal and project snippets"
+msgid "SearchResults|Showing %{count} %{scope} for %{term_element} in your personal and project snippets"
msgstr ""
-msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for%{term_element}"
+msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for %{term_element}"
msgstr ""
-msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for%{term_element} in your personal and project snippets"
+msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for %{term_element} in your personal and project snippets"
msgstr ""
msgid "SearchResults|code result"
@@ -29514,6 +29926,9 @@ msgstr ""
msgid "Secret Detection"
msgstr ""
+msgid "Secret access key"
+msgstr ""
+
msgid "Secret token"
msgstr ""
@@ -29553,9 +29968,6 @@ msgstr ""
msgid "SecurityApprovals|A merge request approval is required when the license compliance report contains a denied license."
msgstr ""
-msgid "SecurityApprovals|Configurable if security scanners are enabled. %{linkStart}Learn more.%{linkEnd}"
-msgstr ""
-
msgid "SecurityApprovals|Coverage-Check"
msgstr ""
@@ -29568,24 +29980,18 @@ msgstr ""
msgid "SecurityApprovals|Learn more about Vulnerability-Check"
msgstr ""
-msgid "SecurityApprovals|License Scanning must be enabled. %{linkStart}Learn more%{linkEnd}."
-msgstr ""
-
msgid "SecurityApprovals|License-Check"
msgstr ""
msgid "SecurityApprovals|Requires approval for Denied licenses. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}More information%{linkEnd}"
+msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "SecurityApprovals|Requires approval for vulnerabilities. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
-msgid "SecurityApprovals|Test coverage must be enabled. %{linkStart}Learn more%{linkEnd}."
-msgstr ""
-
msgid "SecurityApprovals|Vulnerability-Check"
msgstr ""
@@ -29649,6 +30055,12 @@ msgstr ""
msgid "SecurityConfiguration|Immediately begin risk analysis and remediation with application security features. Start with SAST and Secret Detection, available to all plans. Upgrade to Ultimate to get all features, including:"
msgstr ""
+msgid "SecurityConfiguration|Manage corpus"
+msgstr ""
+
+msgid "SecurityConfiguration|Manage corpus files used as mutation sources in coverage fuzzing."
+msgstr ""
+
msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
msgstr ""
@@ -29703,6 +30115,12 @@ msgstr ""
msgid "SecurityOrchestration|Action"
msgstr ""
+msgid "SecurityOrchestration|Actions"
+msgstr ""
+
+msgid "SecurityOrchestration|Add rule"
+msgstr ""
+
msgid "SecurityOrchestration|All policies"
msgstr ""
@@ -29736,9 +30154,6 @@ msgstr ""
msgid "SecurityOrchestration|Network"
msgstr ""
-msgid "SecurityOrchestration|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
-msgstr ""
-
msgid "SecurityOrchestration|New policy"
msgstr ""
@@ -29754,6 +30169,9 @@ msgstr ""
msgid "SecurityOrchestration|Policy editor"
msgstr ""
+msgid "SecurityOrchestration|Policy preview"
+msgstr ""
+
msgid "SecurityOrchestration|Policy status"
msgstr ""
@@ -29763,6 +30181,9 @@ msgstr ""
msgid "SecurityOrchestration|Rule"
msgstr ""
+msgid "SecurityOrchestration|Rules"
+msgstr ""
+
msgid "SecurityOrchestration|Scan Execution"
msgstr ""
@@ -29856,6 +30277,9 @@ msgstr ""
msgid "SecurityReports|Create issue"
msgstr ""
+msgid "SecurityReports|Development vulnerabilities"
+msgstr ""
+
msgid "SecurityReports|Dismiss vulnerability"
msgstr ""
@@ -29871,6 +30295,9 @@ msgstr ""
msgid "SecurityReports|Download results"
msgstr ""
+msgid "SecurityReports|Download scanned URLs"
+msgstr ""
+
msgid "SecurityReports|Download scanned resources"
msgstr ""
@@ -29994,6 +30421,9 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
+msgid "SecurityReports|The Vulnerability Report shows the results of the lastest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "SecurityReports|The security reports below contain one or more vulnerability findings that could not be parsed and were not recorded. Download the artifacts in the job output to investigate. Ensure any security report created conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
msgstr ""
@@ -30135,10 +30565,10 @@ msgstr ""
msgid "Select a repository"
msgstr ""
-msgid "Select a role"
+msgid "Select a repository containing templates for common files."
msgstr ""
-msgid "Select a shared template repository for all projects on this instance."
+msgid "Select a role"
msgstr ""
msgid "Select a template repository"
@@ -30216,6 +30646,9 @@ msgstr ""
msgid "Select project to choose zone"
msgstr ""
+msgid "Select project to create issue"
+msgstr ""
+
msgid "Select projects"
msgstr ""
@@ -30333,6 +30766,9 @@ msgstr ""
msgid "Send emails to help guide new users through the onboarding process."
msgstr ""
+msgid "Send emails to users upon account deactivation."
+msgstr ""
+
msgid "Send message"
msgstr ""
@@ -30351,6 +30787,9 @@ msgstr ""
msgid "Send service data"
msgstr ""
+msgid "Sentry"
+msgstr ""
+
msgid "Sentry API URL"
msgstr ""
@@ -30465,6 +30904,9 @@ msgstr ""
msgid "Service"
msgstr ""
+msgid "Service Accounts keys are required to authorize GitLab to deploy your Google Cloud project."
+msgstr ""
+
msgid "Service Desk"
msgstr ""
@@ -30537,15 +30979,15 @@ msgstr ""
msgid "Set a password on your account to pull or push via %{protocol}."
msgstr ""
-msgid "Set a template repository for projects in this group"
-msgstr ""
-
msgid "Set access permissions for this token."
msgstr ""
msgid "Set an instance-wide domain that will be available to all clusters when installing Knative."
msgstr ""
+msgid "Set any rate limit to %{code_open}0%{code_close} to disable the limit."
+msgstr ""
+
msgid "Set default and restrict visibility levels. Configure import sources and git access protocol."
msgstr ""
@@ -30558,7 +31000,7 @@ msgstr ""
msgid "Set limit to 0 to allow any file size."
msgstr ""
-msgid "Set max session time for web terminal."
+msgid "Set limits for web and API requests."
msgstr ""
msgid "Set milestone"
@@ -30567,15 +31009,18 @@ msgstr ""
msgid "Set new password"
msgstr ""
-msgid "Set notification email for abuse reports."
+msgid "Set parent epic to an epic"
msgstr ""
-msgid "Set parent epic to an epic"
+msgid "Set per-user rate limits for imports and exports of projects and groups."
msgstr ""
msgid "Set projects and maximum size limits, session duration, user options, and check feature availability for namespace plan."
msgstr ""
+msgid "Set rate limits for package registry API requests that supersede the general user and IP rate limits."
+msgstr ""
+
msgid "Set severity"
msgstr ""
@@ -30594,15 +31039,24 @@ msgstr ""
msgid "Set the default branch for this project. All merge requests and commits are made against this branch unless you specify a different one."
msgstr ""
+msgid "Set the default expiration time for job artifacts in all projects. Set to %{code_open}0%{code_close} to never expire artifacts by default. If no unit is written, it defaults to seconds. For example, these are all equivalent: %{code_open}3600%{code_close}, %{code_open}60 minutes%{code_close}, or %{code_open}one hour%{code_close}."
+msgstr ""
+
msgid "Set the due date to %{due_date}."
msgstr ""
msgid "Set the iteration to %{iteration_reference}."
msgstr ""
+msgid "Set the maximum session time for a web terminal."
+msgstr ""
+
msgid "Set the milestone to %{milestone_reference}."
msgstr ""
+msgid "Set the per-user rate limit for notes created by web or API requests."
+msgstr ""
+
msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
msgstr ""
@@ -30804,6 +31258,9 @@ msgstr ""
msgid "Show Pipeline IID"
msgstr ""
+msgid "Show all %{issuable_type}."
+msgstr ""
+
msgid "Show all activity"
msgstr ""
@@ -30855,15 +31312,9 @@ msgstr ""
msgid "Show list"
msgstr ""
-msgid "Show me advanced features"
-msgstr ""
-
msgid "Show me how to add a pipeline"
msgstr ""
-msgid "Show me the basics"
-msgstr ""
-
msgid "Show one file at a time"
msgstr ""
@@ -30904,15 +31355,15 @@ msgstr ""
msgid "Showing %{pageSize} of %{total} %{issuableType}"
msgstr ""
-msgid "Showing %{pageSize} of %{total} issues"
-msgstr ""
-
msgid "Showing all epics"
msgstr ""
msgid "Showing all issues"
msgstr ""
+msgid "Showing data for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
+msgstr ""
+
msgid "Showing data for workflow items created in this date range. Date range cannot exceed %{maxDateRange} days."
msgstr ""
@@ -30952,6 +31403,15 @@ msgstr ""
msgid "Sidebar|Weight"
msgstr ""
+msgid "Sidekiq job compression threshold (bytes)"
+msgstr ""
+
+msgid "Sidekiq job size limit (bytes)"
+msgstr ""
+
+msgid "Sidekiq job size limits"
+msgstr ""
+
msgid "Sign in"
msgstr ""
@@ -31072,6 +31532,9 @@ msgstr ""
msgid "Site profile not found for given parameters"
msgstr ""
+msgid "Sites"
+msgstr ""
+
msgid "Size"
msgstr ""
@@ -31102,19 +31565,22 @@ msgstr ""
msgid "SlackIntegration|Sends notifications about project events to Slack channels."
msgstr ""
-msgid "SlackService|2. Paste the %{strong_open}Token%{strong_close} into the field below"
+msgid "SlackService|1. %{slash_command_link_start}Add a slash command%{slash_command_link_end} in your Slack team using this information:"
msgstr ""
-msgid "SlackService|3. Select the %{strong_open}Active%{strong_close} checkbox, press %{strong_open}Save changes%{strong_close} and start using GitLab inside Slack!"
+msgid "SlackService|2. Paste the token from Slack in the %{strong_open}Token%{strong_close} field below."
msgstr ""
-msgid "SlackService|Fill in the word that works best for your team."
+msgid "SlackService|3. Select the %{strong_open}Active%{strong_close} checkbox, select %{strong_open}Save changes%{strong_close}, and start using slash commands in Slack!"
+msgstr ""
+
+msgid "SlackService|After setup, get a list of available Slack slash commands by entering"
msgstr ""
-msgid "SlackService|See list of available commands in Slack after setting up this service, by entering"
+msgid "SlackService|Fill in the word that works best for your team."
msgstr ""
-msgid "SlackService|This service allows users to perform common operations on this project by entering slash commands in Slack."
+msgid "SlackService|Perform common operations in this project by entering slash commands in Slack."
msgstr ""
msgid "Slice multiplier"
@@ -31180,7 +31646,7 @@ msgstr ""
msgid "Some child epics may be hidden due to applied filters"
msgstr ""
-msgid "Some common domains are not allowed. %{read_more_link}."
+msgid "Some common domains are not allowed. %{learn_more_link}."
msgstr ""
msgid "Some of the designs you tried uploading did not change:"
@@ -31264,9 +31730,6 @@ msgstr ""
msgid "Something went wrong while exporting requirements"
msgstr ""
-msgid "Something went wrong while fetching %{listType} list"
-msgstr ""
-
msgid "Something went wrong while fetching branches"
msgstr ""
@@ -31321,15 +31784,9 @@ msgstr ""
msgid "Something went wrong while merging this merge request. Please try again."
msgstr ""
-msgid "Something went wrong while moving issues."
-msgstr ""
-
msgid "Something went wrong while obtaining the Let's Encrypt certificate."
msgstr ""
-msgid "Something went wrong while performing the action."
-msgstr ""
-
msgid "Something went wrong while promoting the issue to an epic. Please try again."
msgstr ""
@@ -31657,7 +32114,10 @@ msgstr ""
msgid "SourcegraphPreferences|Uses a custom %{linkStart}Sourcegraph instance%{linkEnd}."
msgstr ""
-msgid "Spam Check API Key"
+msgid "Spam Check"
+msgstr ""
+
+msgid "Spam Check API key"
msgstr ""
msgid "Spam Logs"
@@ -31675,7 +32135,7 @@ msgstr ""
msgid "Specified URL cannot be used: \"%{reason}\""
msgstr ""
-msgid "Specify an e-mail address regex pattern to identify default internal users."
+msgid "Specify an email address regex pattern to identify default internal users."
msgstr ""
msgid "Speed up your pipelines with Needs relationships"
@@ -31930,7 +32390,7 @@ msgstr ""
msgid "StatusCheck|An error occurred fetching the status checks."
msgstr ""
-msgid "StatusCheck|Apply this status check to any branch or a specific protected branch."
+msgid "StatusCheck|Apply this status check to all branches or a specific protected branch."
msgstr ""
msgid "StatusCheck|Check for a status response in Merge Requests. Failures do not block merges. %{link_start}Learn more%{link_end}."
@@ -32269,6 +32729,9 @@ msgstr ""
msgid "Subscriptions"
msgstr ""
+msgid "Subscription|Your subscription for %{strong}%{namespace_name}%{strong_close} has expired and you are now on %{pricing_link_start}the GitLab Free tier%{pricing_link_end}. Don't worry, your data is safe. Get in touch with our support team (%{support_email}). They'll gladly help with your subscription renewal."
+msgstr ""
+
msgid "Subtracted"
msgstr ""
@@ -32497,6 +32960,9 @@ msgstr ""
msgid "SuperSonics|Plan"
msgstr ""
+msgid "SuperSonics|Please agree to the Subscription Agreement"
+msgstr ""
+
msgid "SuperSonics|Ready to get started? A GitLab plan is ideal for scaling organizations and for multi team usage."
msgstr ""
@@ -32527,6 +32993,9 @@ msgstr ""
msgid "SuperSonics|The activation code is not valid. Please make sure to copy it exactly from the Customers Portal or confirmation email. Learn more about %{linkStart}activating your subscription%{linkEnd}."
msgstr ""
+msgid "SuperSonics|The activation code should be a 24-character alphanumeric string"
+msgstr ""
+
msgid "SuperSonics|There is a connectivity issue."
msgstr ""
@@ -32569,9 +33038,15 @@ msgstr ""
msgid "SuperSonics|You do not have an active subscription"
msgstr ""
+msgid "SuperSonics|You have successfully added a license that activates on %{date}. Please see the subscription history table below for more details."
+msgstr ""
+
msgid "SuperSonics|You'll be charged for %{trueUpLinkStart}users over license%{trueUpLinkEnd} on a quarterly or annual basis, depending on the terms of your agreement."
msgstr ""
+msgid "SuperSonics|Your future dated license was successfully added"
+msgstr ""
+
msgid "SuperSonics|Your subscription"
msgstr ""
@@ -32824,7 +33299,7 @@ msgstr ""
msgid "Template to append to all Service Desk issues"
msgstr ""
-msgid "TemplateRepository|Select a repository to make its templates available to all projects. %{link_start}What should the repository contain?%{link_end} "
+msgid "TemplateRepository|Create common files more quickly, and standardize their format."
msgstr ""
msgid "Templates"
@@ -33030,7 +33505,7 @@ msgstr ""
msgid "TestCases|Search test cases"
msgstr ""
-msgid "TestCases|Something went wrong while adding test case to Todo."
+msgid "TestCases|Something went wrong while adding test case to a to-do item."
msgstr ""
msgid "TestCases|Something went wrong while creating a test case."
@@ -33042,7 +33517,7 @@ msgstr ""
msgid "TestCases|Something went wrong while fetching test cases list."
msgstr ""
-msgid "TestCases|Something went wrong while marking test case todo as done."
+msgid "TestCases|Something went wrong while marking test case to-do item as done."
msgstr ""
msgid "TestCases|Something went wrong while moving test case."
@@ -33162,7 +33637,7 @@ msgstr ""
msgid "Thanks for your purchase!"
msgstr ""
-msgid "That is ok, I do not want to renew"
+msgid "That's OK, I don't want to renew"
msgstr ""
msgid "That's it, well done!"
@@ -33185,7 +33660,7 @@ msgid_plural "The %{type} contains the following errors:"
msgstr[0] ""
msgstr[1] ""
-msgid "The API key used by GitLab for accessing the Spam Check service endpoint"
+msgid "The API key used by GitLab for accessing the Spam Check service endpoint."
msgstr ""
msgid "The GitLab subscription service (customers.gitlab.com) is currently experiencing an outage. You can monitor the status and get updates at %{linkStart}status.gitlab.com%{linkEnd}."
@@ -33224,9 +33699,6 @@ msgstr ""
msgid "The URL to use for connecting to Elasticsearch. Use a comma-separated list to support clustering (e.g., \"http://localhost:9200, http://localhost:9201\")."
msgstr ""
-msgid "The Vulnerability Report shows the results of the last successful pipeline run on the default branch."
-msgstr ""
-
msgid "The X509 Certificate to use when mutual TLS is required to communicate with the external authorization service. If left blank, the server certificate is still validated when accessing over HTTPS."
msgstr ""
@@ -33284,9 +33756,6 @@ msgstr ""
msgid "The default branch for this project has been changed. Please update your bookmarks."
msgstr ""
-msgid "The default expiration time for job artifacts. 0 for unlimited. The default unit is in seconds, but you can use other units, for example %{code_open}4 mins 2 sec%{code_close}, %{code_open}2h42min%{code_close}."
-msgstr ""
-
msgid "The dependency list details information about the components used within your project."
msgstr ""
@@ -33478,9 +33947,6 @@ msgstr ""
msgid "The merge conflicts for this merge request have already been resolved. Please return to the merge request."
msgstr ""
-msgid "The merge request can now be merged."
-msgstr ""
-
msgid "The metric must be one of %{metrics}."
msgstr ""
@@ -33856,7 +34322,7 @@ msgstr ""
msgid "There was a problem updating the keep latest artifacts setting."
msgstr ""
-msgid "There was an error %{message} todo."
+msgid "There was an error %{message} to-do item."
msgstr ""
msgid "There was an error adding a To Do."
@@ -33895,6 +34361,9 @@ msgstr ""
msgid "There was an error fetching projects"
msgstr ""
+msgid "There was an error fetching search autocomplete suggestions"
+msgstr ""
+
msgid "There was an error fetching stage total counts"
msgstr ""
@@ -34219,6 +34688,9 @@ msgstr ""
msgid "This field is required."
msgstr ""
+msgid "This form is disabled in preview"
+msgstr ""
+
msgid "This group"
msgstr ""
@@ -34240,9 +34712,6 @@ msgstr ""
msgid "This group is linked to a subscription"
msgstr ""
-msgid "This group, including all subgroups, projects and git repositories, will be reachable from only the specified IP address ranges."
-msgstr ""
-
msgid "This group, its subgroups and projects has been scheduled for removal on %{date}."
msgstr ""
@@ -34522,9 +34991,6 @@ msgstr ""
msgid "This user cannot be unlocked manually from GitLab"
msgstr ""
-msgid "This user does not have a pending request"
-msgstr ""
-
msgid "This user has an unconfirmed email address (%{email}). You may force a confirmation."
msgstr ""
@@ -34633,9 +35099,6 @@ msgstr ""
msgid "ThreatMonitoring|Packet Activity"
msgstr ""
-msgid "ThreatMonitoring|Policies"
-msgstr ""
-
msgid "ThreatMonitoring|Requests"
msgstr ""
@@ -34687,6 +35150,12 @@ msgstr ""
msgid "ThreatMonitoring|View documentation"
msgstr ""
+msgid "Threshold in bytes at which to compress Sidekiq job arguments."
+msgstr ""
+
+msgid "Threshold in bytes at which to reject Sidekiq jobs. Set this to 0 to if you don't want to limit Sidekiq jobs."
+msgstr ""
+
msgid "Throughput"
msgstr ""
@@ -34696,6 +35165,9 @@ msgstr ""
msgid "Time"
msgstr ""
+msgid "Time (in hours) that users are allowed to skip forced configuration of two-factor authentication."
+msgstr ""
+
msgid "Time Spent"
msgstr ""
@@ -34762,7 +35234,7 @@ msgstr ""
msgid "TimeTrackingEstimated|Est"
msgstr ""
-msgid "TimeTracking|%{startTag}Spent: %{endTag}%{timeSpentHumanReadable}"
+msgid "TimeTracking|%{spentStart}Spent: %{spentEnd}"
msgstr ""
msgid "TimeTracking|Estimated:"
@@ -34976,6 +35448,9 @@ msgstr ""
msgid "To access this domain create a new DNS record"
msgstr ""
+msgid "To add a custom suffix, set up a Service Desk email address. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "To add an SSH key you need to %{generate_link_start}generate one%{link_end} or use an %{existing_link_start}existing key%{link_end}."
msgstr ""
@@ -34997,13 +35472,16 @@ msgstr ""
msgid "To connect an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To continue using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
+msgstr ""
+
msgid "To continue, you need to select the link in the confirmation email we sent to verify your email address. If you didn't get our email, select %{strongStart}Resend confirmation email.%{strongEnd}"
msgstr ""
msgid "To define internal users, first enable new users set to external"
msgstr ""
-msgid "To enable Registration Features, make sure \"Enable service ping\" is checked."
+msgid "To enable Registration Features, first enable Service Ping."
msgstr ""
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
@@ -35030,7 +35508,7 @@ msgstr ""
msgid "To get started, use the link below to confirm your account."
msgstr ""
-msgid "To help improve GitLab and its user experience, GitLab will periodically collect usage information."
+msgid "To help improve GitLab and its user experience, GitLab periodically collects usage information."
msgstr ""
msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
@@ -35063,7 +35541,7 @@ msgstr ""
msgid "To preserve performance only %{strong_open}%{display_size} of %{real_size}%{strong_close} files are displayed."
msgstr ""
-msgid "To protect this issue's confidentiality, %{forkLink} and set the fork's visibility to private."
+msgid "To protect this issue's confidentiality, %{linkStart}fork this project%{linkEnd} and set the fork's visibility to private."
msgstr ""
msgid "To protect this issue's confidentiality, a private fork of this project was selected."
@@ -35096,12 +35574,15 @@ msgstr ""
msgid "To set up SAML authentication for your group through an identity provider like Azure, Okta, Onelogin, Ping Identity, or your custom SAML 2.0 provider:"
msgstr ""
-msgid "To set up this service:"
+msgid "To set up this integration:"
msgstr ""
msgid "To specify the notification level per project of a group you belong to, you need to visit project page and change notification level there."
msgstr ""
+msgid "To start using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
+msgstr ""
+
msgid "To unsubscribe from this issue, please paste the following link into your browser:"
msgstr ""
@@ -35689,9 +36170,6 @@ msgstr ""
msgid "Unable to fetch branches list, please close the form and try again"
msgstr ""
-msgid "Unable to fetch unscanned projects"
-msgstr ""
-
msgid "Unable to fetch vulnerable projects"
msgstr ""
@@ -35746,6 +36224,15 @@ msgstr ""
msgid "Unable to update this issue at this time."
msgstr ""
+msgid "Unapprove a merge request"
+msgstr ""
+
+msgid "Unapprove the current merge request."
+msgstr ""
+
+msgid "Unapproved the current merge request."
+msgstr ""
+
msgid "Unarchive project"
msgstr ""
@@ -35758,16 +36245,13 @@ msgstr ""
msgid "Unassigned"
msgstr ""
-msgid "Unauthenticated API request rate limit"
-msgstr ""
-
-msgid "Unauthenticated rate limit period in seconds"
+msgid "Unauthenticated API rate limit period in seconds"
msgstr ""
-msgid "Unauthenticated request rate limit"
+msgid "Unauthenticated requests"
msgstr ""
-msgid "Unauthenticated requests"
+msgid "Unauthenticated web rate limit period in seconds"
msgstr ""
msgid "Undo"
@@ -35869,18 +36353,6 @@ msgstr ""
msgid "Unresolved"
msgstr ""
-msgid "UnscannedProjects|15 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|30 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|5 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|60 or more days"
-msgstr ""
-
msgid "Unschedule job"
msgstr ""
@@ -36100,6 +36572,9 @@ msgstr ""
msgid "UsageQuota|%{help_link_start}Shared runners%{help_link_end} are disabled, so there are no limits set on pipeline usage"
msgstr ""
+msgid "UsageQuota|%{linkTitle} help link"
+msgstr ""
+
msgid "UsageQuota|%{percentageLeft} of purchased storage is available"
msgstr ""
@@ -36109,6 +36584,9 @@ msgstr ""
msgid "UsageQuota|Artifacts is a sum of build and pipeline artifacts."
msgstr ""
+msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
+msgstr ""
+
msgid "UsageQuota|Buy additional minutes"
msgstr ""
@@ -36118,9 +36596,21 @@ msgstr ""
msgid "UsageQuota|CI minutes usage by project"
msgstr ""
+msgid "UsageQuota|Code packages and container images."
+msgstr ""
+
msgid "UsageQuota|Current period usage"
msgstr ""
+msgid "UsageQuota|File attachments and smaller design graphics."
+msgstr ""
+
+msgid "UsageQuota|Git repository, managed by the Gitaly service."
+msgstr ""
+
+msgid "UsageQuota|Includes project registry, artifacts, packages, wiki, uploads and other items."
+msgstr ""
+
msgid "UsageQuota|Increase storage temporarily"
msgstr ""
@@ -36139,6 +36629,9 @@ msgstr ""
msgid "UsageQuota|Packages"
msgstr ""
+msgid "UsageQuota|Pipeline artifacts and job artifacts, created with CI/CD."
+msgstr ""
+
msgid "UsageQuota|Pipelines"
msgstr ""
@@ -36157,6 +36650,9 @@ msgstr ""
msgid "UsageQuota|Seats"
msgstr ""
+msgid "UsageQuota|Shared bits of code and text."
+msgstr ""
+
msgid "UsageQuota|Snippets"
msgstr ""
@@ -36166,6 +36662,12 @@ msgstr ""
msgid "UsageQuota|Storage"
msgstr ""
+msgid "UsageQuota|Storage type"
+msgstr ""
+
+msgid "UsageQuota|There is a known issue with Artifact storage where the total could be incorrect for some projects. More details and progress are available in %{warningLinkStart}the epic%{warningLinkEnd}."
+msgstr ""
+
msgid "UsageQuota|This is the total amount of storage used across your projects within this namespace."
msgstr ""
@@ -36205,6 +36707,9 @@ msgstr ""
msgid "UsageQuota|Usage"
msgstr ""
+msgid "UsageQuota|Usage Breakdown"
+msgstr ""
+
msgid "UsageQuota|Usage Quotas"
msgstr ""
@@ -36229,6 +36734,9 @@ msgstr ""
msgid "UsageQuota|Wiki"
msgstr ""
+msgid "UsageQuota|Wiki content."
+msgstr ""
+
msgid "UsageQuota|Wikis"
msgstr ""
@@ -36445,7 +36953,10 @@ msgstr ""
msgid "User Settings"
msgstr ""
-msgid "User and IP Rate Limits"
+msgid "User and IP rate limits"
+msgstr ""
+
+msgid "User does not have a pending request"
msgstr ""
msgid "User identity was successfully created."
@@ -36742,6 +37253,9 @@ msgstr ""
msgid "Users can launch a development environment from a GitLab browser tab when the %{linkStart}Gitpod%{linkEnd} integration is enabled."
msgstr ""
+msgid "Users can reactivate their account by signing in."
+msgstr ""
+
msgid "Users can render diagrams in AsciiDoc, Markdown, reStructuredText, and Textile documents using Kroki."
msgstr ""
@@ -36757,6 +37271,9 @@ msgstr ""
msgid "Users requesting access to"
msgstr ""
+msgid "Users to exclude from the rate limit"
+msgstr ""
+
msgid "Users were successfully added."
msgstr ""
@@ -36778,6 +37295,9 @@ msgstr ""
msgid "UsersSelect|Unassigned"
msgstr ""
+msgid "Uses GitLab as a lightweight alternative to Sentry."
+msgstr ""
+
msgid "Using %{code_start}::%{code_end} denotes a %{link_start}scoped label set%{link_end}"
msgstr ""
@@ -36808,10 +37328,7 @@ msgstr ""
msgid "Value Stream Analytics can help you determine your team’s velocity"
msgstr ""
-msgid "Value Stream Analytics gives an overview of how much time it takes to go from idea to production in your project."
-msgstr ""
-
-msgid "Value may contain a variable reference"
+msgid "Value might contain a variable reference"
msgstr ""
msgid "Value stream"
@@ -36877,10 +37394,10 @@ msgstr ""
msgid "ValueStream|The Default Value Stream cannot be deleted"
msgstr ""
-msgid "Variable"
+msgid "Values that contain the %{codeStart}$%{codeEnd} character can be considered a variable reference and expanded. %{docsLinkStart}Learn more.%{docsLinkEnd}"
msgstr ""
-msgid "Variable references indicated by %{codeStart}$%{codeEnd} may be expanded. If this is not what you want, consider %{docsLinkStart}using a workaround to prevent expansion%{docsLinkEnd}."
+msgid "Variable"
msgstr ""
msgid "Variable will be masked in job logs."
@@ -37285,6 +37802,9 @@ msgstr ""
msgid "Vulnerability|Evidence"
msgstr ""
+msgid "Vulnerability|False positive detected"
+msgstr ""
+
msgid "Vulnerability|File"
msgstr ""
@@ -37327,6 +37847,9 @@ msgstr ""
msgid "Vulnerability|Status"
msgstr ""
+msgid "Vulnerability|The scanner determined this vulnerability to be a false positive. Verify the evaluation before changing its status. %{linkStart}Learn more about false positive detection.%{linkEnd}"
+msgstr ""
+
msgid "Vulnerability|The unmodified response is the original response that had no mutations done to the request"
msgstr ""
@@ -37651,9 +38174,6 @@ msgstr ""
msgid "Welcome to GitLab,%{br_tag}%{name}!"
msgstr ""
-msgid "Welcome to the guided GitLab tour"
-msgstr ""
-
msgid "Welcome, %{name}!"
msgstr ""
@@ -37672,9 +38192,6 @@ msgstr ""
msgid "What are you searching for?"
msgstr ""
-msgid "What describes you best?"
-msgstr ""
-
msgid "What does this command do?"
msgstr ""
@@ -37696,13 +38213,13 @@ msgstr ""
msgid "What is your job title? (optional)"
msgstr ""
-msgid "What will you use this group for?"
+msgid "What templates can I create?"
msgstr ""
-msgid "What's new"
+msgid "What will you use this group for?"
msgstr ""
-msgid "What’s your experience level?"
+msgid "What's new"
msgstr ""
msgid "When a deployment job is successful, skip older deployment jobs that are still pending."
@@ -37714,6 +38231,9 @@ msgstr ""
msgid "When an event in GitLab triggers a webhook, you can use the request details to figure out if something went wrong."
msgstr ""
+msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+msgstr ""
+
msgid "When inactive, an external authentication provider must be used."
msgstr ""
@@ -37737,6 +38257,9 @@ msgstr ""
msgid "When:"
msgstr ""
+msgid "Which API requests are affected?"
+msgstr ""
+
msgid "While it's rare to have no vulnerabilities, it can happen. In any event, we ask that you please double check your settings to make sure you've set up your dashboard correctly."
msgstr ""
@@ -38016,6 +38539,9 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|Work Items"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -38091,6 +38617,9 @@ msgstr ""
msgid "You are already a member of this %{member_source}."
msgstr ""
+msgid "You are already impersonating another user"
+msgstr ""
+
msgid "You are an admin, which means granting access to %{client_name} will allow them to interact with GitLab as an admin as well. Proceed with caution."
msgstr ""
@@ -38193,6 +38722,9 @@ msgstr ""
msgid "You can also use project access tokens with Git to authenticate over HTTP(S). %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "You can always change your URL later"
+msgstr ""
+
msgid "You can always edit this later"
msgstr ""
@@ -38349,10 +38881,10 @@ msgstr ""
msgid "You can’t %{tag_start}edit%{tag_end} files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
-msgid "You could not create a new trigger."
+msgid "You can’t edit files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
-msgid "You didn't renew your subscription for %{strong}%{namespace_name}%{strong_close} so it was downgraded to the free plan."
+msgid "You could not create a new trigger."
msgstr ""
msgid "You do not have any subscriptions yet"
@@ -38520,6 +39052,12 @@ msgstr ""
msgid "You must provide your current password in order to change it."
msgstr ""
+msgid "You must sign in to search for specific projects."
+msgstr ""
+
+msgid "You must sign in to search for specific terms."
+msgstr ""
+
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
@@ -38547,6 +39085,9 @@ msgstr ""
msgid "You need to upload a GitLab project export archive (ending in .gz)."
msgstr ""
+msgid "You need to verify your primary email first before enabling Two-Factor Authentication."
+msgstr ""
+
msgid "You successfully declined the invitation"
msgstr ""
@@ -38655,10 +39196,10 @@ msgstr ""
msgid "Your %{host} account was signed in to from a new location"
msgstr ""
-msgid "Your %{strong}%{plan_name}%{strong_close} subscription for %{strong}%{namespace_name}%{strong_close} will expire on %{strong}%{expires_on}%{strong_close}."
+msgid "Your %{strong}%{plan_name}%{strong_close} subscription expires on %{strong}%{expires_on}%{strong_close}. After that date, you cannot create issues or merge requests, or use many other features."
msgstr ""
-msgid "Your %{strong}%{plan_name}%{strong_close} subscription will expire on %{strong}%{expires_on}%{strong_close}. After that, you will not be able to create issues or merge requests as well as many other features."
+msgid "Your %{strong}%{plan_name}%{strong_close} subscription for %{strong}%{namespace_name}%{strong_close} will expire on %{strong}%{expires_on}%{strong_close}."
msgstr ""
msgid "Your CI/CD configuration syntax is invalid. View Lint tab for more details."
@@ -38682,7 +39223,7 @@ msgstr ""
msgid "Your GPG keys (%{count})"
msgstr ""
-msgid "Your GitLab account has been locked due to an excessive amount of unsuccessful sign in attempts. Your account will automatically unlock in %{duration} or you may click the link below to unlock now."
+msgid "Your GitLab account has been locked due to an excessive number of unsuccessful sign in attempts. You can wait for your account to automatically unlock in %{duration} or you can click the link below to unlock now."
msgstr ""
msgid "Your GitLab account request has been approved!"
@@ -38793,6 +39334,9 @@ msgstr ""
msgid "Your commit email is used for web based operations, such as edits and merges."
msgstr ""
+msgid "Your current password is required to register a two-factor authenticator app."
+msgstr ""
+
msgid "Your dashboard has been copied. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
@@ -38892,6 +39436,9 @@ msgstr ""
msgid "Your project limit is %{limit} projects! Please contact your administrator to increase it"
msgstr ""
+msgid "Your project will be created at:"
+msgstr ""
+
msgid "Your projects"
msgstr ""
@@ -38931,11 +39478,10 @@ msgstr ""
msgid "Your subscription expired!"
msgstr ""
-msgid "Your subscription has been downgraded."
-msgstr ""
-
-msgid "Your subscription will expire in %{remaining_days}."
-msgstr ""
+msgid "Your subscription will expire in %{remaining_days} day."
+msgid_plural "Your subscription will expire in %{remaining_days} days."
+msgstr[0] ""
+msgstr[1] ""
msgid "Your username is %{username}."
msgstr ""
@@ -39142,6 +39688,9 @@ msgstr ""
msgid "cannot merge"
msgstr ""
+msgid "cannot not be used for user namespace"
+msgstr ""
+
msgid "ciReport|%{degradedNum} degraded"
msgstr ""
@@ -39465,6 +40014,9 @@ msgstr ""
msgid "created %{timeAgo}"
msgstr ""
+msgid "created %{timeAgo} by %{author}"
+msgstr ""
+
msgid "created by"
msgstr ""
@@ -39509,9 +40061,6 @@ msgstr ""
msgid "does not have a supported extension. Only %{extension_list} are supported"
msgstr ""
-msgid "domain is not authorized for sign-up."
-msgstr ""
-
msgid "download it"
msgstr ""
@@ -39529,18 +40078,13 @@ msgstr ""
msgid "email '%{email}' is not a verified email."
msgstr ""
-msgid "email does not match the allowed domain of %{email_domains}"
-msgid_plural "email does not match the allowed domains: %{email_domains}"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "enabled"
msgstr ""
msgid "encrypted: needs to be a :required, :optional or :migrating!"
msgstr ""
-msgid "ending with MIME type format is not allowed."
+msgid "ending with a reserved file extension is not allowed."
msgstr ""
msgid "entries cannot be larger than 255 characters"
@@ -39564,6 +40108,9 @@ msgstr ""
msgid "estimateCommand|%{slash_command} overwrites the total estimated time."
msgstr ""
+msgid "example.com"
+msgstr ""
+
msgid "exceeds the limit of %{bytes} bytes"
msgstr ""
@@ -39614,9 +40161,6 @@ msgstr ""
msgid "fork"
msgstr ""
-msgid "fork this project"
-msgstr ""
-
msgid "from"
msgstr ""
@@ -39625,6 +40169,9 @@ msgid_plural "from %d jobs"
msgstr[0] ""
msgstr[1] ""
+msgid "frontmatter"
+msgstr ""
+
msgid "group"
msgstr ""
@@ -39652,6 +40199,9 @@ msgstr ""
msgid "has been completed."
msgstr ""
+msgid "has too deep level of nesting"
+msgstr ""
+
msgid "help"
msgstr ""
@@ -39685,9 +40235,21 @@ msgstr ""
msgid "in"
msgstr ""
+msgid "in Infrastructure :: Kubernetes clusters"
+msgstr ""
+
+msgid "in all GitLab"
+msgstr ""
+
+msgid "in group"
+msgstr ""
+
msgid "in group %{link_to_group}"
msgstr ""
+msgid "in project"
+msgstr ""
+
msgid "in project %{link_to_project}"
msgstr ""
@@ -39729,16 +40291,19 @@ msgstr ""
msgid "is not a valid X509 certificate."
msgstr ""
-msgid "is not allowed since the group is not top-level group."
+msgid "is not allowed for sign-up."
msgstr ""
-msgid "is not allowed. Try again with a different email address, or contact your GitLab admin."
+msgid "is not allowed for this group."
msgstr ""
-msgid "is not allowed. We do not currently support project-level iterations"
+msgid "is not allowed for this project."
+msgstr ""
+
+msgid "is not allowed since the group is not top-level group."
msgstr ""
-msgid "is not from an allowed domain."
+msgid "is not allowed. We do not currently support project-level iterations"
msgstr ""
msgid "is not in the group enforcing Group Managed Account"
@@ -39831,6 +40396,9 @@ msgstr ""
msgid "log in"
msgstr ""
+msgid "managed"
+msgstr ""
+
msgid "manual"
msgstr ""
@@ -39878,6 +40446,9 @@ msgstr ""
msgid "mrWidget| Please restore it or use a different %{missingBranchName} branch"
msgstr ""
+msgid "mrWidget|%{linkStart}Set up now%{linkEnd} to analyze your source code for known security vulnerabilities."
+msgstr ""
+
msgid "mrWidget|%{mergeError}."
msgstr ""
@@ -39958,6 +40529,9 @@ msgid_plural "mrWidget|Closes issues"
msgstr[0] ""
msgstr[1] ""
+msgid "mrWidget|Create issue to resolve all threads"
+msgstr ""
+
msgid "mrWidget|Delete source branch"
msgstr ""
@@ -39967,12 +40541,18 @@ msgstr ""
msgid "mrWidget|Did not close"
msgstr ""
+msgid "mrWidget|Dismiss"
+msgstr ""
+
msgid "mrWidget|Email patches"
msgstr ""
msgid "mrWidget|Failed to load deployment statistics"
msgstr ""
+msgid "mrWidget|Hide %{widget} details"
+msgstr ""
+
msgid "mrWidget|If the %{missingBranchName} branch exists in your local repository, you can merge this merge request manually using the command line"
msgstr ""
@@ -40068,9 +40648,6 @@ msgstr ""
msgid "mrWidget|Request to merge"
msgstr ""
-msgid "mrWidget|Resolve all threads in new issue"
-msgstr ""
-
msgid "mrWidget|Resolve conflicts"
msgstr ""
@@ -40086,6 +40663,9 @@ msgstr ""
msgid "mrWidget|Revoke approval"
msgstr ""
+msgid "mrWidget|SAST and Secret Detection is not enabled."
+msgstr ""
+
msgid "mrWidget|Set by %{merge_author} to be added to the merge train when the pipeline succeeds"
msgstr ""
@@ -40095,6 +40675,9 @@ msgstr ""
msgid "mrWidget|Set by %{merge_author} to start a merge train when the pipeline succeeds"
msgstr ""
+msgid "mrWidget|Show %{widget} details"
+msgstr ""
+
msgid "mrWidget|The changes were merged into"
msgstr ""
@@ -40107,6 +40690,9 @@ msgstr ""
msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure, or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
msgstr ""
+msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure."
+msgstr ""
+
msgid "mrWidget|The source branch has been deleted"
msgstr ""
@@ -40149,6 +40735,9 @@ msgstr ""
msgid "mrWidget|You can merge after removing denied licenses"
msgstr ""
+msgid "mrWidget|You can only merge once this merge request is approved."
+msgstr ""
+
msgid "mrWidget|Your password"
msgstr ""
@@ -40185,6 +40774,9 @@ msgstr ""
msgid "must be less than the limit of %{tag_limit} tags"
msgstr ""
+msgid "must be set for a project namespace"
+msgstr ""
+
msgid "must be unique by status and elapsed time within a policy"
msgstr ""
@@ -40294,6 +40886,9 @@ msgstr ""
msgid "pipeline"
msgstr ""
+msgid "pipeline schedules documentation"
+msgstr ""
+
msgid "pod_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
msgstr ""
@@ -40343,16 +40938,25 @@ msgstr ""
msgid "project name"
msgstr ""
+msgid "project namespace cannot be the parent of another namespace"
+msgstr ""
+
msgid "projects"
msgstr ""
msgid "quick actions"
msgstr ""
-msgid "reCAPTCHA Private Key"
+msgid "reCAPTCHA"
+msgstr ""
+
+msgid "reCAPTCHA helps prevent credential stuffing."
msgstr ""
-msgid "reCAPTCHA Site Key"
+msgid "reCAPTCHA private key"
+msgstr ""
+
+msgid "reCAPTCHA site key"
msgstr ""
msgid "recent activity"
@@ -40579,6 +41183,9 @@ msgstr ""
msgid "user avatar"
msgstr ""
+msgid "user namespace cannot be the parent of another namespace"
+msgstr ""
+
msgid "user preferences"
msgstr ""
@@ -40671,3 +41278,9 @@ msgstr ""
msgid "your settings"
msgstr ""
+msgid "{group}"
+msgstr ""
+
+msgid "{project}"
+msgstr ""
+
diff --git a/locale/ta_IN/gitlab.po b/locale/ta_IN/gitlab.po
index b3ed544da02..9bce689c49c 100644
--- a/locale/ta_IN/gitlab.po
+++ b/locale/ta_IN/gitlab.po
@@ -14,10 +14,7 @@ msgstr ""
"X-Crowdin-Language: ta\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-09-01 22:30\n"
-
-msgid " %{name}, confirm your email address now! "
-msgstr ""
+"PO-Revision-Date: 2021-10-04 20:18\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -92,6 +89,16 @@ msgstr ""
msgid "#general, #development"
msgstr ""
+msgid "%d Alert"
+msgid_plural "%d Alerts"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d Alert:"
+msgid_plural "%d Alerts:"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d Approval"
msgid_plural "%d Approvals"
msgstr[0] ""
@@ -455,7 +462,10 @@ msgstr ""
msgid "%{code_open}Protected:%{code_close} Only exposed to protected branches or tags."
msgstr ""
-msgid "%{commit_author_link} authored %{commit_timeago}"
+msgid "%{commit_author_link} authored %{commit_authored_timeago}"
+msgstr ""
+
+msgid "%{commit_author_link} authored %{commit_authored_timeago} and %{commit_committer_avatar} %{commit_committer_link} committed %{commit_committer_timeago}"
msgstr ""
msgid "%{completedCount} completed weight"
@@ -549,6 +559,15 @@ msgstr ""
msgid "%{doc_link_start}Advanced search%{doc_link_end} is enabled."
msgstr ""
+msgid "%{docs_link_start}Learn about visibility levels.%{docs_link_end}"
+msgstr ""
+
+msgid "%{docs_link_start}What is Large File Storage?%{docs_link_end}"
+msgstr ""
+
+msgid "%{docs_link_start}What is two-factor authentication?%{docs_link_end}"
+msgstr ""
+
msgid "%{due_date} (Past due)"
msgstr ""
@@ -621,9 +640,6 @@ msgstr ""
msgid "%{issueType} actions"
msgstr ""
-msgid "%{issuesCount} issues with a limit of %{maxIssueCount}"
-msgstr ""
-
msgid "%{issuesSize} with a limit of %{maxIssueCount}"
msgstr ""
@@ -681,6 +697,12 @@ msgstr ""
msgid "%{label_for_message} unavailable"
msgstr ""
+msgid "%{learn_more_link}."
+msgstr ""
+
+msgid "%{lessThan} 1 hour"
+msgstr ""
+
msgid "%{lets_encrypt_link_start}Let's Encrypt%{lets_encrypt_link_end} is a free, automated, and open certificate authority (CA) that issues digital certificates to enable HTTPS (SSL/TLS) for sites."
msgstr ""
@@ -693,15 +715,15 @@ msgstr ""
msgid "%{link_start}Learn more%{link_end} about roles."
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
-msgstr ""
-
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
msgstr ""
msgid "%{link_start}Start the title with %{draft_snippet}%{link_end} to prevent a merge request that is a work in progress from being merged before it's ready."
msgstr ""
+msgid "%{link_start}What information does GitLab Inc. collect?%{link_end}"
+msgstr ""
+
msgid "%{listToShow}, and %{awardsListLength} more"
msgstr ""
@@ -854,7 +876,7 @@ msgid_plural "%{securityScanner} results are not available because a pipeline ha
msgstr[0] ""
msgstr[1] ""
-msgid "%{service_ping_link_start}Learn more%{service_ping_link_end} about what information is shared with GitLab Inc."
+msgid "%{service_ping_link_start}What information is shared with GitLab Inc.?%{service_ping_link_end}"
msgstr ""
msgid "%{size} %{unit}"
@@ -890,6 +912,9 @@ msgstr ""
msgid "%{state} epics"
msgstr ""
+msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
+msgstr ""
+
msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
msgstr ""
@@ -949,11 +974,6 @@ msgstr ""
msgid "%{template_project_id} is unknown or invalid"
msgstr ""
-msgid "%{text} %{files}"
-msgid_plural "%{text} %{files} files"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%{text} is available"
msgstr ""
@@ -1038,9 +1058,6 @@ msgstr ""
msgid "%{wildcards_link_start}Wildcards%{wildcards_link_end} such as %{code_tag_start}v*%{code_tag_end} or %{code_tag_start}*-release%{code_tag_end} are supported."
msgstr ""
-msgid "&lt; 1 hour"
-msgstr ""
-
msgid "'%{data}' at %{location} does not match format: %{format}"
msgstr ""
@@ -1124,9 +1141,6 @@ msgstr ""
msgid "(we need your current password to confirm your changes)"
msgstr ""
-msgid "* * * * *"
-msgstr ""
-
msgid "+ %{amount} more"
msgstr ""
@@ -1193,10 +1207,10 @@ msgstr ""
msgid "."
msgstr ""
-msgid "0 bytes"
+msgid "/"
msgstr ""
-msgid "0 for unlimited, only effective with remote storage enabled."
+msgid "0 bytes"
msgstr ""
msgid "0t1DgySidms"
@@ -1326,6 +1340,9 @@ msgstr ""
msgid "1000+"
msgstr ""
+msgid "192.168.0.0/24"
+msgstr ""
+
msgid "1st contribution!"
msgstr ""
@@ -1479,9 +1496,6 @@ msgstr ""
msgid "A plain HTML site that uses Netlify for CI/CD instead of GitLab, but still with all the other great GitLab features"
msgstr ""
-msgid "A plain-text response to show to clients that hit the rate limit."
-msgstr ""
-
msgid "A platform value can be web, mob or app."
msgstr ""
@@ -1563,7 +1577,7 @@ msgstr ""
msgid "APIFuzzing|Configure HTTP basic authentication values. Other authentication methods are supported. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
+msgid "APIFuzzing|Customize your project's API fuzzing configuration options and copy the code snippet to your .gitlab-ci.yml file to apply any changes. Note that this tool does not reflect or update your .gitlab-ci.yml file automatically. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
msgstr ""
msgid "APIFuzzing|Enable authentication"
@@ -1626,9 +1640,6 @@ msgstr ""
msgid "APIFuzzing|To prevent a security leak, authentication info must be added as a %{ciVariablesLinkStart}CI variable%{ciVariablesLinkEnd}. As a user with maintainer access rights, you can manage CI variables in the %{ciSettingsLinkStart}Settings%{ciSettingsLinkEnd} area."
msgstr ""
-msgid "APIFuzzing|Use this tool to generate API fuzzing configuration YAML to copy into your .gitlab-ci.yml file. This tool does not reflect or update your .gitlab-ci.yml file automatically."
-msgstr ""
-
msgid "APIFuzzing|Username for basic authentication"
msgstr ""
@@ -1680,9 +1691,6 @@ msgstr ""
msgid "Abuse reports notification email"
msgstr ""
-msgid "Abuse reports will be sent to this address if it is set. Abuse reports are always available in the admin area."
-msgstr ""
-
msgid "Accept invitation"
msgstr ""
@@ -1719,12 +1727,18 @@ msgstr ""
msgid "Access granted"
msgstr ""
+msgid "Access key ID"
+msgstr ""
+
msgid "Access requests"
msgstr ""
msgid "Access to '%{classification_label}' not allowed"
msgstr ""
+msgid "Access tokens expire after 2 hours. A refresh token may be used at any time to generate a new access token. Non-expiring access tokens are deprecated. Clear this setting to enable backward compatibility."
+msgstr ""
+
msgid "AccessDropdown|Deploy Keys"
msgstr ""
@@ -2037,6 +2051,9 @@ msgstr ""
msgid "Add new directory"
msgstr ""
+msgid "Add new service account"
+msgstr ""
+
msgid "Add or remove previously merged commits"
msgstr ""
@@ -2274,6 +2291,9 @@ msgstr ""
msgid "AdminArea|Features"
msgstr ""
+msgid "AdminArea|Get security updates from GitLab and stay up to date"
+msgstr ""
+
msgid "AdminArea|Groups"
msgstr ""
@@ -2313,6 +2333,12 @@ msgstr ""
msgid "AdminArea|Reporter"
msgstr ""
+msgid "AdminArea|Sign up for the GitLab Security Newsletter to get notified for security updates."
+msgstr ""
+
+msgid "AdminArea|Sign up for the GitLab newsletter"
+msgstr ""
+
msgid "AdminArea|Stop all jobs"
msgstr ""
@@ -2382,9 +2408,15 @@ msgstr ""
msgid "AdminSettings|Disable public access to Pages sites"
msgstr ""
+msgid "AdminSettings|Display a banner on merge requests in projects with no pipelines to initiate steps to add a .gitlab-ci.yml file."
+msgstr ""
+
msgid "AdminSettings|Domain verification is an essential security measure for public GitLab sites. Users are required to demonstrate they control a domain before it is enabled. %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "AdminSettings|Enable pipeline suggestion banner"
+msgstr ""
+
msgid "AdminSettings|Enable shared runners for new projects"
msgstr ""
@@ -2856,10 +2888,10 @@ msgstr ""
msgid "Admin|Quarterly reconciliation will occur on %{qrtlyDate}"
msgstr ""
-msgid "Admin|The number of max seats used for your namespace is currently exceeding the number of seats in your subscription. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgid "Admin|The number of max seats in your namespace exceeds the number of seats in your subscription. On %{qrtlyDate}, quarterly reconciliation occurs and you are automatically billed a prorated amount for the overage. No action is needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice. For more information about the timing of the invoicing process, view the documentation."
msgstr ""
-msgid "Admin|The number of maximum users for your instance is currently exceeding the number of users in license. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgid "Admin|The number of max users in your instance exceeds the number of users in your license. On %{qrtlyDate}, quarterly reconciliation occurs and you are automatically billed a prorated amount for the overage. No action is needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice. For more information about the timing of the invoicing process, view the documentation."
msgstr ""
msgid "Admin|View pending user approvals"
@@ -2880,9 +2912,6 @@ msgstr ""
msgid "Advanced export options"
msgstr ""
-msgid "Advanced permissions, Large File Storage and Two-Factor authentication settings."
-msgstr ""
-
msgid "After a successful password update you will be redirected to login screen."
msgstr ""
@@ -2901,13 +2930,14 @@ msgstr ""
msgid "After you've reviewed these contribution guidelines, you'll be all set to"
msgstr ""
+msgid "Akismet"
+msgstr ""
+
msgid "Akismet API Key"
msgstr ""
-msgid "Alert"
-msgid_plural "Alerts"
-msgstr[0] ""
-msgstr[1] ""
+msgid "Akismet helps prevent the creation of spam issues in public projects."
+msgstr ""
msgid "AlertManagement|Acknowledged"
msgstr ""
@@ -3263,6 +3293,9 @@ msgstr ""
msgid "All (default)"
msgstr ""
+msgid "All GitLab"
+msgstr ""
+
msgid "All Members"
msgstr ""
@@ -3377,6 +3410,9 @@ msgstr ""
msgid "Allow this secondary node to replicate content on Object Storage"
msgstr ""
+msgid "Allow use of licensed EE features"
+msgstr ""
+
msgid "Allow users to dismiss the broadcast message"
msgstr ""
@@ -3452,9 +3488,6 @@ msgstr ""
msgid "Amazon authentication is not %{link_start}correctly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
-msgid "Amount of time (in hours) that users are allowed to skip forced configuration of two-factor authentication"
-msgstr ""
-
msgid "An %{link_start}alert%{link_end} with the same fingerprint is already open. To change the status of this alert, resolve the linked alert."
msgstr ""
@@ -3515,12 +3548,6 @@ msgstr ""
msgid "An error occurred when removing the label."
msgstr ""
-msgid "An error occurred when toggling the notification subscription"
-msgstr ""
-
-msgid "An error occurred when updating the issue weight"
-msgstr ""
-
msgid "An error occurred when updating the title"
msgstr ""
@@ -3569,6 +3596,9 @@ msgstr ""
msgid "An error occurred while enabling Service Desk."
msgstr ""
+msgid "An error occurred while fetching Markdown preview"
+msgstr ""
+
msgid "An error occurred while fetching ancestors"
msgstr ""
@@ -3599,9 +3629,6 @@ msgstr ""
msgid "An error occurred while fetching label colors."
msgstr ""
-msgid "An error occurred while fetching markdown preview"
-msgstr ""
-
msgid "An error occurred while fetching participants"
msgstr ""
@@ -3617,9 +3644,6 @@ msgstr ""
msgid "An error occurred while fetching reference"
msgstr ""
-msgid "An error occurred while fetching sidebar data"
-msgstr ""
-
msgid "An error occurred while fetching tags. Retry the search."
msgstr ""
@@ -3695,6 +3719,9 @@ msgstr ""
msgid "An error occurred while loading merge requests."
msgstr ""
+msgid "An error occurred while loading projects."
+msgstr ""
+
msgid "An error occurred while loading the Needs tab."
msgstr ""
@@ -3929,12 +3956,6 @@ msgstr ""
msgid "Any Milestone"
msgstr ""
-msgid "Any branch"
-msgstr ""
-
-msgid "Any eligible user"
-msgstr ""
-
msgid "Any encrypted tokens"
msgstr ""
@@ -3953,6 +3974,9 @@ msgstr ""
msgid "Any namespace"
msgstr ""
+msgid "App Engine description and apps that are suitable for this deployment target"
+msgstr ""
+
msgid "App ID"
msgstr ""
@@ -4101,6 +4125,11 @@ msgstr ""
msgid "Apply"
msgstr ""
+msgid "Apply %d suggestion"
+msgid_plural "Apply %d suggestions"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Apply a label"
msgstr ""
@@ -4110,13 +4139,10 @@ msgstr ""
msgid "Apply suggestion"
msgstr ""
-msgid "Apply suggestions"
-msgstr ""
-
msgid "Apply template"
msgstr ""
-msgid "Apply this approval rule to any branch or a specific protected branch."
+msgid "Apply this approval rule to all branches or a specific protected branch."
msgstr ""
msgid "Applying"
@@ -4259,9 +4285,6 @@ msgstr ""
msgid "ApprovalSettings|Prevent editing approval rules in projects and merge requests."
msgstr ""
-msgid "ApprovalSettings|Prevent editing approval rules in projects and merge requests. "
-msgstr ""
-
msgid "ApprovalSettings|Remove all approvals when commits are added to the source branch."
msgstr ""
@@ -4277,6 +4300,9 @@ msgstr ""
msgid "ApprovalSettings|This setting is configured at the instance level and can only be changed by an administrator."
msgstr ""
+msgid "ApprovalSettings|This setting is configured in %{groupName} and can only be changed by an administrator or group owner."
+msgstr ""
+
msgid "ApprovalStatusTooltip|Adheres to separation of duties"
msgstr ""
@@ -4763,9 +4789,6 @@ msgstr ""
msgid "Authenticated API rate limit period in seconds"
msgstr ""
-msgid "Authenticated API request rate limit"
-msgstr ""
-
msgid "Authenticated API requests"
msgstr ""
@@ -4775,10 +4798,10 @@ msgstr ""
msgid "Authenticated Git LFS request rate limit"
msgstr ""
-msgid "Authenticated web rate limit period in seconds"
+msgid "Authenticated Git LFS requests"
msgstr ""
-msgid "Authenticated web request rate limit"
+msgid "Authenticated web rate limit period in seconds"
msgstr ""
msgid "Authenticated web requests"
@@ -5156,9 +5179,6 @@ msgstr ""
msgid "Below you will find all the groups that are public."
msgstr ""
-msgid "Beta"
-msgstr ""
-
msgid "Bi-weekly code coverage"
msgstr ""
@@ -5398,6 +5418,21 @@ msgstr ""
msgid "Board scope affects which issues are displayed for anyone who visits this board"
msgstr ""
+msgid "BoardNewEpic|Groups"
+msgstr ""
+
+msgid "BoardNewEpic|Loading groups"
+msgstr ""
+
+msgid "BoardNewEpic|No matching results"
+msgstr ""
+
+msgid "BoardNewEpic|Search groups"
+msgstr ""
+
+msgid "BoardNewEpic|Select a group"
+msgstr ""
+
msgid "BoardNewIssue|No matching results"
msgstr ""
@@ -5475,6 +5510,9 @@ msgstr ""
msgid "Boards|An error occurred while creating the list. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching child groups. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching group projects. Please try again."
msgstr ""
@@ -5807,6 +5845,9 @@ msgstr ""
msgid "Bulk update"
msgstr ""
+msgid "BulkImports|Re-import creates a new group. It does not sync with the existing group."
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -5816,6 +5857,9 @@ msgstr ""
msgid "BulkImport|From source group"
msgstr ""
+msgid "BulkImport|Group import history"
+msgstr ""
+
msgid "BulkImport|Import failed: Destination cannot be a subgroup of the source group. Change the destination and try again."
msgstr ""
@@ -5828,9 +5872,18 @@ msgstr ""
msgid "BulkImport|Importing the group failed"
msgstr ""
+msgid "BulkImport|Last imported to %{link}"
+msgstr ""
+
msgid "BulkImport|Name already exists."
msgstr ""
+msgid "BulkImport|New group"
+msgstr ""
+
+msgid "BulkImport|No history is available"
+msgstr ""
+
msgid "BulkImport|No parent"
msgstr ""
@@ -5843,6 +5896,9 @@ msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} matching filter \"%{filter}\" from %{link}"
msgstr ""
+msgid "BulkImport|Source group"
+msgstr ""
+
msgid "BulkImport|To new group"
msgstr ""
@@ -5852,6 +5908,9 @@ msgstr ""
msgid "BulkImport|You have no groups to import"
msgstr ""
+msgid "BulkImport|Your imported groups will appear here."
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -6094,6 +6153,9 @@ msgstr ""
msgid "Can be manually deployed to"
msgstr ""
+msgid "Can be overridden in each project."
+msgstr ""
+
msgid "Can create groups:"
msgstr ""
@@ -6196,6 +6258,9 @@ msgstr ""
msgid "Cancelling Preview"
msgstr ""
+msgid "Cannot assign a confidential epic to a non-confidential issue. Make the issue confidential and try again"
+msgstr ""
+
msgid "Cannot be assigned to other projects."
msgstr ""
@@ -6247,9 +6312,6 @@ msgstr ""
msgid "Cannot refer to a group %{timebox_type} by an internal id!"
msgstr ""
-msgid "Cannot set confidential epic for a non-confidential issue"
-msgstr ""
-
msgid "Cannot show preview. For previews on sketch files, they must have the file format introduced by Sketch version 43 and above."
msgstr ""
@@ -6487,15 +6549,15 @@ msgstr ""
msgid "Check out, review, and merge locally"
msgstr ""
-msgid "Check the %{docs_link_start}documentation%{docs_link_end}."
-msgstr ""
-
msgid "Check the current instance configuration "
msgstr ""
msgid "Check the elasticsearch.log file to debug why the migration was halted and make any changes before retrying the migration. When you fix the cause of the failure, click \"Retry migration\", and the migration will be scheduled to be retried in the background."
msgstr ""
+msgid "Check with your administrator."
+msgstr ""
+
msgid "Check your Docker images for known vulnerabilities."
msgstr ""
@@ -6526,6 +6588,9 @@ msgstr ""
msgid "Checkout"
msgstr ""
+msgid "Checkout|$%{selectedPlanPrice} per 10 GB storage per pack"
+msgstr ""
+
msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 minutes"
msgstr ""
@@ -6546,17 +6611,23 @@ msgstr ""
msgid "Checkout|%{name}'s GitLab subscription"
msgstr ""
-msgid "Checkout|%{selectedPlanText} plan"
+msgid "Checkout|%{name}'s storage subscription"
msgstr ""
-msgid "Checkout|%{startDate} - %{endDate}"
+msgid "Checkout|%{quantity} GB of storage"
msgstr ""
-msgid "Checkout|%{totalCiMinutes} CI minute"
-msgid_plural "Checkout|%{totalCiMinutes} CI minutes"
+msgid "Checkout|%{quantity} storage pack"
+msgid_plural "Checkout|%{quantity} storage packs"
msgstr[0] ""
msgstr[1] ""
+msgid "Checkout|%{selectedPlanText} plan"
+msgstr ""
+
+msgid "Checkout|%{startDate} - %{endDate}"
+msgstr ""
+
msgid "Checkout|%{totalCiMinutes} CI minutes"
msgstr ""
@@ -6632,6 +6703,9 @@ msgstr ""
msgid "Checkout|Failed to register credit card. Please try again."
msgstr ""
+msgid "Checkout|GB"
+msgstr ""
+
msgid "Checkout|GitLab group"
msgstr ""
@@ -6668,6 +6742,9 @@ msgstr ""
msgid "Checkout|State"
msgstr ""
+msgid "Checkout|Storage packs"
+msgstr ""
+
msgid "Checkout|Street address"
msgstr ""
@@ -6689,6 +6766,9 @@ msgstr ""
msgid "Checkout|Total minutes: %{quantity}"
msgstr ""
+msgid "Checkout|Total storage: %{quantity} GB"
+msgstr ""
+
msgid "Checkout|Users"
msgstr ""
@@ -6698,16 +6778,25 @@ msgstr ""
msgid "Checkout|Your organization"
msgstr ""
+msgid "Checkout|Your storage subscription has the same term as your main subscription, and the price is prorated accordingly."
+msgstr ""
+
msgid "Checkout|Your subscription will be applied to this group"
msgstr ""
msgid "Checkout|Zip code"
msgstr ""
+msgid "Checkout|a storage subscription"
+msgstr ""
+
msgid "Checkout|company or team"
msgstr ""
-msgid "Checkout|x 1,000 minutes per pack = %{strong}"
+msgid "Checkout|minutes"
+msgstr ""
+
+msgid "Checkout|x %{quantity} %{units} per pack ="
msgstr ""
msgid "Cherry-pick this commit"
@@ -7064,6 +7153,9 @@ msgstr ""
msgid "CloneIssue|Cannot clone issue to target project as it is pending deletion."
msgstr ""
+msgid "CloneIssue|Cannot clone issues of '%{issue_type}' type."
+msgstr ""
+
msgid "Cloned this issue to %{path_to_project}."
msgstr ""
@@ -7118,7 +7210,10 @@ msgstr ""
msgid "Closes this %{quick_action_target}."
msgstr ""
-msgid "Cloud licenses can not be removed."
+msgid "Cloud Functions description and apps that are suitable for this deployment target"
+msgstr ""
+
+msgid "Cloud Run description and apps that are suitable for this deployment target"
msgstr ""
msgid "Cluster"
@@ -7145,6 +7240,12 @@ msgstr ""
msgid "ClusterAgents|Access tokens"
msgstr ""
+msgid "ClusterAgents|Agent might not be connected to GitLab"
+msgstr ""
+
+msgid "ClusterAgents|Agent never connected to GitLab"
+msgstr ""
+
msgid "ClusterAgents|Alternative installation methods"
msgstr ""
@@ -7160,6 +7261,12 @@ msgstr ""
msgid "ClusterAgents|Configuration"
msgstr ""
+msgid "ClusterAgents|Connected"
+msgstr ""
+
+msgid "ClusterAgents|Connection status"
+msgstr ""
+
msgid "ClusterAgents|Copy token"
msgstr ""
@@ -7178,6 +7285,9 @@ msgstr ""
msgid "ClusterAgents|For alternative installation methods %{linkStart}go to the documentation%{linkEnd}."
msgstr ""
+msgid "ClusterAgents|For more troubleshooting information go to"
+msgstr ""
+
msgid "ClusterAgents|Go to the repository"
msgstr ""
@@ -7193,18 +7303,30 @@ msgstr ""
msgid "ClusterAgents|Integrate with the GitLab Agent"
msgstr ""
-msgid "ClusterAgents|Last used"
+msgid "ClusterAgents|Last connected %{timeAgo}."
+msgstr ""
+
+msgid "ClusterAgents|Last contact"
msgstr ""
msgid "ClusterAgents|Learn how to create an agent access token"
msgstr ""
+msgid "ClusterAgents|Make sure you are using a valid token."
+msgstr ""
+
msgid "ClusterAgents|Name"
msgstr ""
msgid "ClusterAgents|Never"
msgstr ""
+msgid "ClusterAgents|Never connected"
+msgstr ""
+
+msgid "ClusterAgents|Not connected"
+msgstr ""
+
msgid "ClusterAgents|Read more about getting started"
msgstr ""
@@ -7226,6 +7348,9 @@ msgstr ""
msgid "ClusterAgents|Select which Agent you want to install"
msgstr ""
+msgid "ClusterAgents|The Agent has not been connected in a long time. There might be a connectivity issue. Last contact was %{timeAgo}."
+msgstr ""
+
msgid "ClusterAgents|The GitLab Agent also requires %{linkStart}enabling the Agent Server%{linkEnd}"
msgstr ""
@@ -7253,9 +7378,6 @@ msgstr ""
msgid "ClusterAgents|You will need to create a token to connect to your agent"
msgstr ""
-msgid "ClusterAgent|This feature is only available for premium plans"
-msgstr ""
-
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -7445,9 +7567,6 @@ msgstr ""
msgid "ClusterIntegration|Create Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Create a provision role on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the account and external ID above. %{startMoreInfoLink}More information%{endLink}"
-msgstr ""
-
msgid "ClusterIntegration|Create cluster on"
msgstr ""
@@ -7880,7 +7999,7 @@ msgstr ""
msgid "ClusterIntegration|Subnets"
msgstr ""
-msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provisioned role, first create one on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the above account and external IDs. %{startMoreInfoLink}More information%{endLink}"
+msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provisioned role, first create one on %{awsLinkStart}Amazon Web Services %{awsLinkEnd} using the above account and external IDs. %{moreInfoStart}More information%{moreInfoEnd}"
msgstr ""
msgid "ClusterIntegration|The Kubernetes certificate used to authenticate to the cluster."
@@ -8114,6 +8233,9 @@ msgstr ""
msgid "Collapse replies"
msgstr ""
+msgid "Collapse settings section"
+msgstr ""
+
msgid "Collapse sidebar"
msgstr ""
@@ -8132,6 +8254,9 @@ msgstr ""
msgid "Comma-separated list of email addresses."
msgstr ""
+msgid "Comma-separated list of users allowed to exceed the rate limit."
+msgstr ""
+
msgid "Comma-separated, e.g. '1.1.1.1, 2.2.2.0/24'"
msgstr ""
@@ -8452,6 +8577,9 @@ msgstr ""
msgid "Configure %{repository_checks_link_start}repository checks%{link_end} and %{housekeeping_link_start}housekeeping%{link_end} on repositories."
msgstr ""
+msgid "Configure CAPTCHAs, IP address limits, and other anti-spam measures."
+msgstr ""
+
msgid "Configure Dependency Scanning in `.gitlab-ci.yml` using the GitLab managed template. You can [add variable overrides](https://docs.gitlab.com/ee/user/application_security/dependency_scanning/#customizing-the-dependency-scanning-settings) to customize Dependency Scanning settings."
msgstr ""
@@ -8488,16 +8616,13 @@ msgstr ""
msgid "Configure a %{codeStart}.gitlab-webide.yml%{codeEnd} file in the %{codeStart}.gitlab%{codeEnd} directory to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
msgstr ""
-msgid "Configure existing installation"
-msgstr ""
-
-msgid "Configure limit for notes created per minute by web and API requests."
+msgid "Configure advanced permissions, Large File Storage, and two-factor authentication settings."
msgstr ""
-msgid "Configure limits for Project/Group Import/Export."
+msgid "Configure approvals by authors and committers on all projects."
msgstr ""
-msgid "Configure limits for web and API requests."
+msgid "Configure existing installation"
msgstr ""
msgid "Configure paths to be protected by Rack Attack."
@@ -8512,10 +8637,13 @@ msgstr ""
msgid "Configure settings for Advanced Search with Elasticsearch."
msgstr ""
+msgid "Configure specific limits for Files API requests that supersede the general user and IP rate limits."
+msgstr ""
+
msgid "Configure specific limits for Git LFS requests that supersede the general user and IP rate limits."
msgstr ""
-msgid "Configure specific limits for Packages API requests that supersede the general user and IP rate limits."
+msgid "Configure specific limits for deprecated API requests that supersede the general user and IP rate limits."
msgstr ""
msgid "Configure the %{link} integration."
@@ -8527,6 +8655,9 @@ msgstr ""
msgid "Configure the way a user creates a new account."
msgstr ""
+msgid "Configure via Merge Request"
+msgstr ""
+
msgid "Configure which lists are shown for anyone who visits this board"
msgstr ""
@@ -8995,6 +9126,9 @@ msgstr ""
msgid "Content parsed with %{link}."
msgstr ""
+msgid "ContentEditor|Table of Contents"
+msgstr ""
+
msgid "ContentEditor|You have to provide a renderMarkdown function or a custom serializer"
msgstr ""
@@ -9181,6 +9315,9 @@ msgstr ""
msgid "Copy link to chart"
msgstr ""
+msgid "Copy prefix"
+msgstr ""
+
msgid "Copy reference"
msgstr ""
@@ -9211,6 +9348,9 @@ msgstr ""
msgid "Copy value"
msgstr ""
+msgid "Corpus Management"
+msgstr ""
+
msgid "Corpus Management|Are you sure you want to delete the corpus?"
msgstr ""
@@ -9439,6 +9579,9 @@ msgstr ""
msgid "Create commit"
msgstr ""
+msgid "Create common files more quickly, and standardize their format."
+msgstr ""
+
msgid "Create confidential merge request"
msgstr ""
@@ -9472,6 +9615,9 @@ msgstr ""
msgid "Create issue"
msgstr ""
+msgid "Create issue to resolve all threads"
+msgstr ""
+
msgid "Create iteration"
msgstr ""
@@ -9526,6 +9672,9 @@ msgstr ""
msgid "Create new..."
msgstr ""
+msgid "Create or import your first project"
+msgstr ""
+
msgid "Create project"
msgstr ""
@@ -9883,7 +10032,7 @@ msgstr ""
msgid "Custom notification events"
msgstr ""
-msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notificationLinkStart} notification emails%{notificationLinkEnd}."
+msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notificationLinkStart}notification emails%{notificationLinkEnd}."
msgstr ""
msgid "Custom project templates"
@@ -10082,10 +10231,10 @@ msgid_plural "CycleAnalytics|Showing %{subjectFilterText} and %{selectedLabelsCo
msgstr[0] ""
msgstr[1] ""
-msgid "CycleAnalytics|Showing data for group '%{groupName}' and %{selectedProjectCount} projects from %{startDate} to %{endDate}"
+msgid "CycleAnalytics|Showing data for group '%{groupName}' and %{selectedProjectCount} projects from %{createdAfter} to %{createdBefore}"
msgstr ""
-msgid "CycleAnalytics|Showing data for group '%{groupName}' from %{startDate} to %{endDate}"
+msgid "CycleAnalytics|Showing data for group '%{groupName}' from %{createdAfter} to %{createdBefore}"
msgstr ""
msgid "CycleAnalytics|Stages"
@@ -10319,6 +10468,9 @@ msgstr ""
msgid "DastProfiles|Manage profiles"
msgstr ""
+msgid "DastProfiles|Manage site profiles"
+msgstr ""
+
msgid "DastProfiles|Minimum = 0 (no timeout enabled), Maximum = 2880 minutes"
msgstr ""
@@ -10394,6 +10546,9 @@ msgstr ""
msgid "DastProfiles|Scanner name"
msgstr ""
+msgid "DastProfiles|Schedule"
+msgstr ""
+
msgid "DastProfiles|Select branch"
msgstr ""
@@ -10463,7 +10618,7 @@ msgstr ""
msgid "DastProfiles|Website"
msgstr ""
-msgid "DastProfiles|You can either choose a passive scan or validate the target site in your chosen site profile. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
+msgid "DastProfiles|You can either choose a passive scan or validate the target site from the site profile management page. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
msgstr ""
msgid "DastProfiles|You cannot run an active scan against an unvalidated site."
@@ -10636,7 +10791,7 @@ msgstr ""
msgid "Days to merge"
msgstr ""
-msgid "Deactivate dormant users after 90 days of inactivity. Users can return to active status by signing in to their account. While inactive, a user is not counted as an active user in the instance."
+msgid "Deactivate dormant users after 90 days of inactivity"
msgstr ""
msgid "Dear Administrator,"
@@ -10723,10 +10878,10 @@ msgstr ""
msgid "Define a custom pattern with cron syntax"
msgstr ""
-msgid "Define approval settings."
+msgid "Define approval rules."
msgstr ""
-msgid "Define approval settings. %{linkStart}Learn more.%{linkEnd}"
+msgid "Define approval rules. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "Define custom rules for what constitutes spam, independent of Akismet"
@@ -10735,7 +10890,7 @@ msgstr ""
msgid "Define environments in the deploy stage(s) in %{code_open}.gitlab-ci.yml%{code_close} to track deployments here."
msgstr ""
-msgid "Define how approval rules are applied as a merge request moves toward completion."
+msgid "Define how approval rules are applied to merge requests."
msgstr ""
msgid "Definition"
@@ -10750,6 +10905,12 @@ msgstr ""
msgid "DelayedJobs|Are you sure you want to run %{job_name} immediately? This job will run automatically after it's timer finishes."
msgstr ""
+msgid "DelayedJobs|Are you sure you want to run %{job_name} immediately? This job will run automatically after its timer finishes."
+msgstr ""
+
+msgid "DelayedJobs|Run the delayed job now?"
+msgstr ""
+
msgid "DelayedJobs|Start now"
msgstr ""
@@ -11026,6 +11187,12 @@ msgstr ""
msgid "Dependency proxy image prefix"
msgstr ""
+msgid "DependencyProxy|Create a local proxy for storing frequently used upstream images. %{docLinkStart}Learn more%{docLinkEnd} about dependency proxies."
+msgstr ""
+
+msgid "DependencyProxy|Dependency Proxy"
+msgstr ""
+
msgid "DependencyProxy|Toggle Dependency Proxy"
msgstr ""
@@ -11266,6 +11433,9 @@ msgstr ""
msgid "Deployments"
msgstr ""
+msgid "Deployments to Google Kubernetes Engine can be "
+msgstr ""
+
msgid "Deployments|%{deployments} environment impacted."
msgid_plural "Deployments|%{deployments} environments impacted."
msgstr[0] ""
@@ -11295,6 +11465,9 @@ msgstr ""
msgid "Deployment|success"
msgstr ""
+msgid "Deprecated API rate limits"
+msgstr ""
+
msgid "Deprioritize label"
msgstr ""
@@ -11697,6 +11870,16 @@ msgstr ""
msgid "DiffsCompareBaseBranch|(base)"
msgstr ""
+msgid "Diffs|%d addition"
+msgid_plural "Diffs|%d additions"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Diffs|%d deletion"
+msgid_plural "Diffs|%d deletions"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Diffs|No file name available"
msgstr ""
@@ -11706,9 +11889,17 @@ msgstr ""
msgid "Diffs|Show all unchanged lines"
msgstr ""
+msgid "Diffs|Showing %{dropdownStart}%{count} changed file%{dropdownEnd}"
+msgid_plural "Diffs|Showing %{dropdownStart}%{count} changed files%{dropdownEnd}"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Diffs|Something went wrong while fetching diff lines."
msgstr ""
+msgid "Diffs|with %{additions} and %{deletions}"
+msgstr ""
+
msgid "Direct member"
msgstr ""
@@ -11834,9 +12025,6 @@ msgid_plural "Dismiss %d selected vulnerabilities as"
msgstr[0] ""
msgstr[1] ""
-msgid "Dismiss Value Stream Analytics introduction box"
-msgstr ""
-
msgid "Dismiss merge request promotion"
msgstr ""
@@ -12158,6 +12346,9 @@ msgstr ""
msgid "Edit issues"
msgstr ""
+msgid "Edit merge requests"
+msgstr ""
+
msgid "Edit public deploy key"
msgstr ""
@@ -12233,6 +12424,9 @@ msgstr ""
msgid "Elastic|None. Select projects to index."
msgstr ""
+msgid "Eligible users"
+msgstr ""
+
msgid "Email"
msgstr ""
@@ -12362,6 +12556,9 @@ msgstr ""
msgid "Enable"
msgstr ""
+msgid "Enable Amazon EKS integration"
+msgstr ""
+
msgid "Enable Auto DevOps"
msgstr ""
@@ -12395,6 +12592,9 @@ msgstr ""
msgid "Enable SSL verification"
msgstr ""
+msgid "Enable Service Ping"
+msgstr ""
+
msgid "Enable Snowplow tracking"
msgstr ""
@@ -12425,6 +12625,9 @@ msgstr ""
msgid "Enable authenticated Git LFS request rate limit"
msgstr ""
+msgid "Enable authenticated web request rate limit"
+msgstr ""
+
msgid "Enable authentication"
msgstr ""
@@ -12485,7 +12688,7 @@ msgstr ""
msgid "Enable or disable the Pseudonymizer data collection."
msgstr ""
-msgid "Enable or disable version check and service ping."
+msgid "Enable or disable version check and Service Ping."
msgstr ""
msgid "Enable protected paths rate limit"
@@ -12497,18 +12700,12 @@ msgstr ""
msgid "Enable reCAPTCHA"
msgstr ""
-msgid "Enable reCAPTCHA for login"
-msgstr ""
-
-msgid "Enable reCAPTCHA, Invisible Captcha, Akismet and set IP limits. For reCAPTCHA, we currently only support %{recaptcha_v2_link_start}v2%{recaptcha_v2_link_end}"
+msgid "Enable reCAPTCHA for login."
msgstr ""
msgid "Enable repository checks"
msgstr ""
-msgid "Enable service ping"
-msgstr ""
-
msgid "Enable shared runners for all projects and subgroups in this group."
msgstr ""
@@ -12530,7 +12727,10 @@ msgstr ""
msgid "Enable unauthenticated API request rate limit"
msgstr ""
-msgid "Enable unauthenticated request rate limit"
+msgid "Enable unauthenticated web request rate limit"
+msgstr ""
+
+msgid "Enable user deactivation emails"
msgstr ""
msgid "Enable version check"
@@ -12566,9 +12766,6 @@ msgstr ""
msgid "Enabled sources for code import during project creation. OmniAuth must be configured for GitHub"
msgstr ""
-msgid "Enabling this will only make licensed EE features available to projects if the project namespace's plan includes the feature or if the project is public."
-msgstr ""
-
msgid "Encountered an error while rendering: %{err}"
msgstr ""
@@ -12617,9 +12814,6 @@ msgstr ""
msgid "Enter Admin Mode"
msgstr ""
-msgid "Enter IP address range"
-msgstr ""
-
msgid "Enter a number"
msgstr ""
@@ -12632,9 +12826,6 @@ msgstr ""
msgid "Enter at least three characters to search"
msgstr ""
-msgid "Enter domain"
-msgstr ""
-
msgid "Enter in your Bitbucket Server URL and personal access token below"
msgstr ""
@@ -12821,9 +13012,6 @@ msgstr ""
msgid "Environments|Deployment %{status}"
msgstr ""
-msgid "Environments|Dismiss"
-msgstr ""
-
msgid "Environments|Enable review app"
msgstr ""
@@ -12836,9 +13024,6 @@ msgstr ""
msgid "Environments|Environments are places where code gets deployed, such as staging or production."
msgstr ""
-msgid "Environments|Help us improve environments"
-msgstr ""
-
msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
msgstr ""
@@ -12875,6 +13060,9 @@ msgstr ""
msgid "Environments|Note that this action will stop the environment, but it will %{emphasisStart}not%{emphasisEnd} have an effect on any existing deployment due to no “stop environment action†being defined in the %{ciConfigLinkStart}.gitlab-ci.yml%{ciConfigLinkEnd} file."
msgstr ""
+msgid "Environments|Open"
+msgstr ""
+
msgid "Environments|Open live environment"
msgstr ""
@@ -12914,9 +13102,6 @@ msgstr ""
msgid "Environments|Stopping %{environmentName}"
msgstr ""
-msgid "Environments|Take the survey"
-msgstr ""
-
msgid "Environments|There was an error fetching the logs. Please try again."
msgstr ""
@@ -12938,9 +13123,6 @@ msgstr ""
msgid "Environments|You don't have any environments right now"
msgstr ""
-msgid "Environments|Your feedback helps GitLab make environments better for you and other users. Participate and enter a sweepstake to win a USD 30 gift card."
-msgstr ""
-
msgid "Environments|by %{avatar}"
msgstr ""
@@ -13223,7 +13405,7 @@ msgstr ""
msgid "Error parsing CSV file. Please make sure it has"
msgstr ""
-msgid "Error rendering markdown preview"
+msgid "Error rendering Markdown preview"
msgstr ""
msgid "Error saving label update."
@@ -13271,6 +13453,9 @@ msgstr ""
msgid "Error: %{error_message}"
msgstr ""
+msgid "Error: Couldn't load some or all of the changes."
+msgstr ""
+
msgid "Error: No AWS credentials were supplied"
msgstr ""
@@ -13304,6 +13489,9 @@ msgstr ""
msgid "ErrorTracking|Enable error tracking"
msgstr ""
+msgid "ErrorTracking|Error tracking backend"
+msgstr ""
+
msgid "ErrorTracking|If you self-host Sentry, enter your Sentry instance's full URL. If you use Sentry's hosted solution, enter https://sentry.io"
msgstr ""
@@ -13337,6 +13525,12 @@ msgstr ""
msgid "Escalation policies must have at least one rule"
msgstr ""
+msgid "EscalationPolicies|%{clockIcon} IF alert is not %{alertStatus} in %{minutes}"
+msgstr ""
+
+msgid "EscalationPolicies|%{notificationIcon} THEN %{doAction} %{forScheduleOrUser}"
+msgstr ""
+
msgid "EscalationPolicies|+ Add an additional rule"
msgstr ""
@@ -13379,13 +13573,13 @@ msgstr ""
msgid "EscalationPolicies|Escalation policies"
msgstr ""
-msgid "EscalationPolicies|Escalation rules"
+msgid "EscalationPolicies|Escalation policy %{obstacle} in Project %{project}"
msgstr ""
-msgid "EscalationPolicies|Failed to load oncall-schedules"
+msgid "EscalationPolicies|Escalation rules"
msgstr ""
-msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} %{then} THEN %{doAction} %{scheduleOrUser}"
+msgid "EscalationPolicies|Failed to load oncall-schedules"
msgstr ""
msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} minutes"
@@ -13463,18 +13657,36 @@ msgstr ""
msgid "Every %{action} attempt has failed: %{job_error_message}. Please try again."
msgstr ""
+msgid "Every 3 months"
+msgstr ""
+
+msgid "Every 3 months on the %{day} at %{time} %{timezone}"
+msgstr ""
+
+msgid "Every 6 months"
+msgstr ""
+
+msgid "Every 6 months on the %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Every day"
msgstr ""
msgid "Every day (at %{time})"
msgstr ""
+msgid "Every day at %{time} %{timezone}"
+msgstr ""
+
msgid "Every month"
msgstr ""
msgid "Every month (Day %{day} at %{time})"
msgstr ""
+msgid "Every month on the %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Every three months"
msgstr ""
@@ -13489,6 +13701,15 @@ msgstr[1] ""
msgid "Every week (%{weekday} at %{time})"
msgstr ""
+msgid "Every week on %{day} at %{time} %{timezone}"
+msgstr ""
+
+msgid "Every year"
+msgstr ""
+
+msgid "Every year on %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Everyone"
msgstr ""
@@ -13525,9 +13746,6 @@ msgstr ""
msgid "Exactly one of %{attributes} is required"
msgstr ""
-msgid "Example: %{ip_address}. %{read_more_link}."
-msgstr ""
-
msgid "Example: @sub\\.company\\.com$"
msgstr ""
@@ -13594,13 +13812,13 @@ msgstr ""
msgid "Expand pipeline"
msgstr ""
-msgid "Expand sidebar"
+msgid "Expand settings section"
msgstr ""
-msgid "Expected documents: %{expected_documents}"
+msgid "Expand sidebar"
msgstr ""
-msgid "Experienced"
+msgid "Expected documents: %{expected_documents}"
msgstr ""
msgid "ExperimentSubject|Must have exactly one of User, Namespace, or Project."
@@ -13885,9 +14103,6 @@ msgstr ""
msgid "Failed to load related branches"
msgstr ""
-msgid "Failed to load sidebar lock status"
-msgstr ""
-
msgid "Failed to load stacktrace."
msgstr ""
@@ -14312,6 +14527,9 @@ msgstr ""
msgid "Files"
msgstr ""
+msgid "Files API Rate Limits"
+msgstr ""
+
msgid "Files breadcrumb"
msgstr ""
@@ -15311,6 +15529,9 @@ msgstr ""
msgid "GitLab group: %{source_link}"
msgstr ""
+msgid "GitLab informs you if a new version is available."
+msgstr ""
+
msgid "GitLab is a complete DevOps platform, delivered as a single application, fundamentally changing the way Development, Security, and Ops teams collaborate"
msgstr ""
@@ -15326,7 +15547,7 @@ msgstr ""
msgid "GitLab is open source software to collaborate on code."
msgstr ""
-msgid "GitLab is undergoing maintenance and is operating in a read-only mode."
+msgid "GitLab is undergoing maintenance and is operating in read-only mode."
msgstr ""
msgid "GitLab member or Email address"
@@ -15338,9 +15559,6 @@ msgstr ""
msgid "GitLab project export"
msgstr ""
-msgid "GitLab restart is required to apply changes."
-msgstr ""
-
msgid "GitLab single sign-on URL"
msgstr ""
@@ -15356,9 +15574,6 @@ msgstr ""
msgid "GitLab version"
msgstr ""
-msgid "GitLab will inform you if a new version is available."
-msgstr ""
-
msgid "GitLab will run a background job that will produce pseudonymized CSVs of the GitLab database that will be uploaded to your configured object storage directory."
msgstr ""
@@ -15623,9 +15838,21 @@ msgstr ""
msgid "Go to snippets"
msgstr ""
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check 'Allowed domains for sign-ups'."
+msgstr ""
+
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check 'Email restrictions for sign-ups'."
+msgstr ""
+
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check the 'Domain denylist'."
+msgstr ""
+
msgid "Go to the activity feed"
msgstr ""
+msgid "Go to the group’s 'Settings &gt; General' page, and check 'Restrict membership by email domain'."
+msgstr ""
+
msgid "Go to the milestone list"
msgstr ""
@@ -15662,6 +15889,12 @@ msgstr ""
msgid "Goal of the changes and what reviewers should be aware of"
msgstr ""
+msgid "Google Cloud"
+msgstr ""
+
+msgid "Google Cloud offers several deployment targets. Select the one most suitable for your project."
+msgstr ""
+
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
@@ -15746,9 +15979,6 @@ msgstr ""
msgid "Group ID"
msgstr ""
-msgid "Group ID: %{group_id}"
-msgstr ""
-
msgid "Group Owner must have signed in with SAML before enabling Group Managed Accounts"
msgstr ""
@@ -15923,6 +16153,12 @@ msgstr ""
msgid "GroupImport|Unable to process group import file"
msgstr ""
+msgid "GroupPage|Copy group ID"
+msgstr ""
+
+msgid "GroupPage|Group ID: %{group_id}"
+msgstr ""
+
msgid "GroupRoadmap|%{dateWord} – No end date"
msgstr ""
@@ -15977,6 +16213,9 @@ msgstr ""
msgid "GroupRoadmap|Within 3 years"
msgstr ""
+msgid "GroupSAML|\"persistent\" recommended"
+msgstr ""
+
msgid "GroupSAML|%{strongOpen}Warning%{strongClose} - Enabling %{linkStart}SSO enforcement%{linkEnd} can reduce security risks."
msgstr ""
@@ -16109,6 +16348,9 @@ msgstr ""
msgid "GroupSAML|To be able to prohibit outer forks, you first need to enforce dedicate group managed accounts."
msgstr ""
+msgid "GroupSAML|Use SAML group links to manage group membership using SAML."
+msgstr ""
+
msgid "GroupSAML|Valid SAML Response"
msgstr ""
@@ -16121,13 +16363,10 @@ msgstr ""
msgid "GroupSAML|as %{access_level}"
msgstr ""
-msgid "GroupSAML|must match stored NameID of \"%{extern_uid}\" as we use this to identify users. If the NameID changes users will be unable to sign in."
-msgstr ""
-
-msgid "GroupSAML|should be \"persistent\""
+msgid "GroupSAML|must match stored NameID of \"%{extern_uid}\" to identify user and allow sign in"
msgstr ""
-msgid "GroupSAML|should be a random persistent ID, emails are discouraged"
+msgid "GroupSAML|recommend persistent ID instead of email"
msgstr ""
msgid "GroupSelect|No matching results"
@@ -16142,9 +16381,15 @@ msgstr ""
msgid "GroupSettings|Allow project access token creation"
msgstr ""
+msgid "GroupSettings|Applied to all subgroups unless overridden by a group owner. Groups already added to the project lose access."
+msgstr ""
+
msgid "GroupSettings|Auto DevOps pipeline was updated for the group"
msgstr ""
+msgid "GroupSettings|Available only on the top-level group. Applies to all subgroups. Groups already shared with a group outside %{group} are still shared unless removed manually."
+msgstr ""
+
msgid "GroupSettings|Badges"
msgstr ""
@@ -16196,6 +16441,9 @@ msgstr ""
msgid "GroupSettings|New runners registration token has been generated!"
msgstr ""
+msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgstr ""
+
msgid "GroupSettings|Pipeline settings was updated for the group"
msgstr ""
@@ -16208,12 +16456,15 @@ msgstr ""
msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
-msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups."
+msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups"
msgstr ""
msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
msgstr ""
+msgid "GroupSettings|Prevents group members from being notified if the group is mentioned."
+msgstr ""
+
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
msgstr ""
@@ -16250,21 +16501,6 @@ msgstr ""
msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}."
msgstr ""
-msgid "GroupSettings|This setting is only available on the top-level group and it applies to all subgroups. Groups that have already been shared with a group outside %{group} will still be shared, and this access will have to be revoked manually."
-msgstr ""
-
-msgid "GroupSettings|This setting will be applied to all subgroups unless overridden by a group owner. Groups that already have access to the project will continue to have access unless removed manually."
-msgstr ""
-
-msgid "GroupSettings|This setting will override user notification preferences for all members of the group, subgroups, and projects."
-msgstr ""
-
-msgid "GroupSettings|This setting will prevent group members from being notified if the group is mentioned."
-msgstr ""
-
-msgid "GroupSettings|This setting will prevent group members from forking projects outside of the group."
-msgstr ""
-
msgid "GroupSettings|Transfer group"
msgstr ""
@@ -16382,7 +16618,7 @@ msgstr ""
msgid "GroupsNew|No import options available"
msgstr ""
-msgid "GroupsNew|Not all related objects are migrated, as %{docs_link_start}described here%{docs_link_end}. Please %{feedback_link_start}leave feedback%{feedback_link_end} on this feature."
+msgid "GroupsNew|Not all related objects are migrated. %{docs_link_start}More info%{docs_link_end}."
msgstr ""
msgid "GroupsNew|Personal access token"
@@ -16514,15 +16750,27 @@ msgstr ""
msgid "Hello %{name},"
msgstr ""
-msgid "Hello there"
-msgstr ""
-
msgid "Hello, %{name}!"
msgstr ""
msgid "Hello, %{username}!"
msgstr ""
+msgid "HelloMessage|%{handshake_emoji} Contribute to GitLab: %{contribute_link}"
+msgstr ""
+
+msgid "HelloMessage|%{magnifier_emoji} Create a new GitLab issue: %{new_issue_link}"
+msgstr ""
+
+msgid "HelloMessage|%{rocket_emoji} We like your curiosity! Help us improve GitLab by joining the team: %{jobs_page_link}"
+msgstr ""
+
+msgid "HelloMessage|Does this page need fixes or improvements? Open an issue or contribute a merge request to help make GitLab more lovable. At GitLab, everyone can contribute!"
+msgstr ""
+
+msgid "HelloMessage|Welcome to GitLab!"
+msgstr ""
+
msgid "Help"
msgstr ""
@@ -16532,13 +16780,10 @@ msgstr ""
msgid "Helps prevent bots from creating accounts."
msgstr ""
-msgid "Helps prevent bots from creating issues"
-msgstr ""
-
-msgid "Helps prevent malicious users hide their activity"
+msgid "Helps prevent bots from creating issues."
msgstr ""
-msgid "Helps reduce request volume (e.g. from crawlers or abusive bots)"
+msgid "Helps prevent malicious users hide their activity."
msgstr ""
msgid "Helps reduce request volume (for example, from crawlers or abusive bots)"
@@ -16662,6 +16907,12 @@ msgstr ""
msgid "Housekeeping, export, path, transfer, remove, archive."
msgstr ""
+msgid "How do I configure Akismet?"
+msgstr ""
+
+msgid "How do I configure it?"
+msgstr ""
+
msgid "How do I configure runners?"
msgstr ""
@@ -16683,19 +16934,25 @@ msgstr ""
msgid "How do I set up this service?"
msgstr ""
+msgid "How do I use a web terminal?"
+msgstr ""
+
+msgid "How do I use file templates?"
+msgstr ""
+
msgid "How it works"
msgstr ""
msgid "How many days need to pass between marking entity for deletion and actual removing it."
msgstr ""
-msgid "How many seconds an IP will be counted towards the limit"
+msgid "How many seconds an IP counts toward the IP address limit."
msgstr ""
-msgid "I accept the %{terms_link}"
+msgid "How the job limiter handles jobs exceeding the thresholds specified below. The 'track' mode only logs the jobs. The 'compress' mode compresses the jobs and raises an exception if the compressed size exceeds the limit."
msgstr ""
-msgid "I accept the|Terms of Service and Privacy Policy"
+msgid "I accept the %{terms_link}"
msgstr ""
msgid "I forgot my password"
@@ -16779,13 +17036,16 @@ msgstr ""
msgid "IP Address"
msgstr ""
-msgid "IP expiration time"
+msgid "IP address expiration time"
msgstr ""
-msgid "IP subnet restriction only allowed for top-level groups"
+msgid "IP address restrictions"
+msgstr ""
+
+msgid "IP addresses per user"
msgstr ""
-msgid "IPs per user"
+msgid "IP subnet restriction only allowed for top-level groups"
msgstr ""
msgid "Identifier"
@@ -16800,6 +17060,9 @@ msgstr ""
msgid "If any indexed field exceeds this limit it will be truncated to this number of characters and the rest will not be indexed or searchable. This does not apply to repository and wiki indexing. Setting this to 0 means it is unlimited."
msgstr ""
+msgid "If blank, defaults to %{code_open}Retry later%{code_close}."
+msgstr ""
+
msgid "If blank, set allowable lifetime to %{instance_level_policy_in_words}, as defined by the instance admin. Once set, existing tokens for users in this group may be revoked."
msgstr ""
@@ -16851,6 +17114,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 did not initiate these sign-in attempts, please reach out to your administrator or enable two-factor authentication (2FA) on your account."
+msgstr ""
+
msgid "If you did not initiate this change, please contact your administrator immediately."
msgstr ""
@@ -16942,10 +17208,10 @@ msgstr ""
msgid "Import Projects from Gitea"
msgstr ""
-msgid "Import a project"
+msgid "Import an exported GitLab project"
msgstr ""
-msgid "Import an exported GitLab project"
+msgid "Import and export rate limits"
msgstr ""
msgid "Import failed due to a GitHub error: %{original}"
@@ -16957,12 +17223,18 @@ msgstr ""
msgid "Import from Jira"
msgstr ""
+msgid "Import group"
+msgstr ""
+
msgid "Import group from file"
msgstr ""
msgid "Import groups"
msgstr ""
+msgid "Import history"
+msgstr ""
+
msgid "Import in progress"
msgstr ""
@@ -17026,7 +17298,25 @@ msgstr ""
msgid "Import timed out. Import took longer than %{import_jobs_expiration} seconds"
msgstr ""
-msgid "Import/Export Rate Limits"
+msgid "ImportAProjectModal|Import from a project"
+msgstr ""
+
+msgid "ImportAProjectModal|Import members from another project"
+msgstr ""
+
+msgid "ImportAProjectModal|Import project members"
+msgstr ""
+
+msgid "ImportAProjectModal|Only project members (not group members) are imported, and they get the same permissions as the project you import from."
+msgstr ""
+
+msgid "ImportAProjectModal|Successfully imported"
+msgstr ""
+
+msgid "ImportAProjectModal|Unable to import project members"
+msgstr ""
+
+msgid "ImportAProjectModal|You're importing members to the %{strongStart}%{name}%{strongEnd} project."
msgstr ""
msgid "ImportButtons|Connect repositories from"
@@ -17079,7 +17369,7 @@ msgstr[1] ""
msgid "Importing..."
msgstr ""
-msgid "Import|A repository URL usually ends in a .git suffix, although this is not required. Double check to make sure your repository URL is correct."
+msgid "Import|There is not a valid Git repository at this URL. If your HTTP repository is not publicly accessible, verify your credentials."
msgstr ""
msgid "Improve customer support with Service Desk"
@@ -17088,9 +17378,6 @@ msgstr ""
msgid "Improves Git cloning performance."
msgstr ""
-msgid "In %{time_to_now}"
-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 ""
@@ -17376,7 +17663,7 @@ msgstr ""
msgid "InProductMarketing|Start a GitLab Ultimate trial today in less than one minute, no credit card required."
msgstr ""
-msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no CC required"
+msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no credit card required"
msgstr ""
msgid "InProductMarketing|Start a trial"
@@ -17415,7 +17702,7 @@ msgstr ""
msgid "InProductMarketing|Team up in GitLab for greater efficiency"
msgstr ""
-msgid "InProductMarketing|Team work makes the dream work"
+msgid "InProductMarketing|Team work makes the dream work"
msgstr ""
msgid "InProductMarketing|Test, create, deploy"
@@ -17996,6 +18283,9 @@ msgstr ""
msgid "Integrations|Create new issue in Jira"
msgstr ""
+msgid "Integrations|Create new issue in ZenTao"
+msgstr ""
+
msgid "Integrations|Default settings are inherited from the group level."
msgstr ""
@@ -18089,9 +18379,15 @@ msgstr ""
msgid "Integrations|Search Jira issues"
msgstr ""
+msgid "Integrations|Search ZenTao issues"
+msgstr ""
+
msgid "Integrations|Send notifications about project events to Unify Circuit."
msgstr ""
+msgid "Integrations|Send notifications about project events to a Unify Circuit conversation. %{docs_link}"
+msgstr ""
+
msgid "Integrations|Sign in to add namespaces"
msgstr ""
@@ -18131,6 +18427,9 @@ msgstr ""
msgid "Integrations|You've activated every integration 🎉"
msgstr ""
+msgid "Integrations|ZenTao issues display here when you create issues in your project in ZenTao."
+msgstr ""
+
msgid "Interactive mode"
msgstr ""
@@ -18158,9 +18457,6 @@ msgstr ""
msgid "Interval Pattern"
msgstr ""
-msgid "Introducing Value Stream Analytics"
-msgstr ""
-
msgid "Introducing Your DevOps Report"
msgstr ""
@@ -18257,6 +18553,12 @@ msgstr ""
msgid "Investigate vulnerability: %{title}"
msgstr ""
+msgid "Invisible Captcha"
+msgstr ""
+
+msgid "Invisible Captcha helps prevent the creation of spam accounts. It adds a honeypot field and time-sensitive form submission to the account signup form."
+msgstr ""
+
msgid "Invitation"
msgstr ""
@@ -18710,12 +19012,18 @@ msgstr ""
msgid "Issues"
msgstr ""
+msgid "Issues I've created"
+msgstr ""
+
msgid "Issues Rate Limits"
msgstr ""
msgid "Issues and merge requests"
msgstr ""
+msgid "Issues assigned to me"
+msgstr ""
+
msgid "Issues can be bugs, tasks or ideas to be discussed. Also, issues are searchable and filterable."
msgstr ""
@@ -18827,7 +19135,7 @@ msgstr ""
msgid "Iterations|Create cadence"
msgstr ""
-msgid "Iterations|Create your first iteration"
+msgid "Iterations|Create iteration"
msgstr ""
msgid "Iterations|Delete cadence"
@@ -18836,6 +19144,9 @@ msgstr ""
msgid "Iterations|Delete iteration cadence?"
msgstr ""
+msgid "Iterations|Delete iteration?"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -18869,12 +19180,18 @@ msgstr ""
msgid "Iterations|New iteration cadence"
msgstr ""
+msgid "Iterations|No closed iterations."
+msgstr ""
+
msgid "Iterations|No iteration cadences to show."
msgstr ""
msgid "Iterations|No iterations in cadence."
msgstr ""
+msgid "Iterations|No open iterations."
+msgstr ""
+
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
@@ -18905,6 +19222,9 @@ msgstr ""
msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
msgstr ""
+msgid "Iterations|This will remove the iteration from any issues that are assigned to it."
+msgstr ""
+
msgid "Iterations|Title"
msgstr ""
@@ -18920,15 +19240,9 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "I’m familiar with the basics of DevOps."
-msgstr ""
-
msgid "I’m joining my team who’s already on GitLab"
msgstr ""
-msgid "I’m not familiar with the basics of DevOps."
-msgstr ""
-
msgid "Jaeger URL"
msgstr ""
@@ -19193,6 +19507,9 @@ msgstr ""
msgid "Job"
msgstr ""
+msgid "Job %{jobName}"
+msgstr ""
+
msgid "Job Failed #%{build_id}"
msgstr ""
@@ -19783,9 +20100,6 @@ msgstr ""
msgid "Learn more in the"
msgstr ""
-msgid "Learn more in the|pipeline schedules documentation"
-msgstr ""
-
msgid "Learn more."
msgstr ""
@@ -19897,9 +20211,6 @@ msgstr ""
msgid "Leave Admin Mode"
msgstr ""
-msgid "Leave blank for no limit. Once set, existing personal access tokens may be revoked."
-msgstr ""
-
msgid "Leave edit mode? All unsaved changes will be lost."
msgstr ""
@@ -19945,10 +20256,10 @@ msgstr ""
msgid "LicenseCompliance|Acceptable license to be used in the project"
msgstr ""
-msgid "LicenseCompliance|Add a license"
+msgid "LicenseCompliance|Add license and related policy"
msgstr ""
-msgid "LicenseCompliance|Add license and related policy"
+msgid "LicenseCompliance|Add license policy"
msgstr ""
msgid "LicenseCompliance|Allow"
@@ -20038,6 +20349,9 @@ msgstr ""
msgid "LicenseManagement|Uncategorized"
msgstr ""
+msgid "Licensed Enterprise Edition features can be used if the project namespace's plan includes the feature, or if the project is public."
+msgstr ""
+
msgid "Licensed Features"
msgstr ""
@@ -20104,7 +20418,10 @@ msgstr ""
msgid "Limit namespaces and projects that can be indexed"
msgstr ""
-msgid "Limit sign in from multiple ips"
+msgid "Limit project size at a global, group, and project level. %{link_start}Learn more%{link_end}."
+msgstr ""
+
+msgid "Limit sign in from multiple IP addresses"
msgstr ""
msgid "Limit the number of concurrent operations this secondary site can run in the background."
@@ -20116,11 +20433,17 @@ msgstr ""
msgid "Limit the number of issues and epics per minute a user can create through web and API requests."
msgstr ""
+msgid "Limit the size of Sidekiq jobs stored in Redis."
+msgstr ""
+
msgid "Limited to showing %d event at most"
msgid_plural "Limited to showing %d events at most"
msgstr[0] ""
msgstr[1] ""
+msgid "Limiting mode"
+msgstr ""
+
msgid "Line changes"
msgstr ""
@@ -20190,9 +20513,6 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
-msgid "List of users to be excluded from the limit"
-msgstr ""
-
msgid "List options"
msgstr ""
@@ -20232,9 +20552,6 @@ msgstr ""
msgid "Loading functions timed out. Please reload the page to try again."
msgstr ""
-msgid "Loading issues"
-msgstr ""
-
msgid "Loading more"
msgstr ""
@@ -20526,6 +20843,9 @@ msgstr ""
msgid "Marked For Deletion At - %{deletion_time}"
msgstr ""
+msgid "Marked as ready. Merging is now allowed."
+msgstr ""
+
msgid "Marked this %{noun} as a draft."
msgstr ""
@@ -20598,52 +20918,22 @@ msgstr ""
msgid "Max 100,000 events"
msgstr ""
-msgid "Max 20 characters"
-msgstr ""
-
-msgid "Max Group Export Download requests per minute per user"
-msgstr ""
-
-msgid "Max Group Export requests per minute per user"
-msgstr ""
-
-msgid "Max Group Import requests per minute per user"
-msgstr ""
-
-msgid "Max Project Export Download requests per minute per user"
-msgstr ""
-
-msgid "Max Project Export requests per minute per user"
-msgstr ""
-
-msgid "Max Project Import requests per minute per user"
-msgstr ""
-
-msgid "Max authenticated API requests per period per user"
-msgstr ""
-
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
-msgid "Max authenticated web requests per period per user"
-msgstr ""
-
msgid "Max file size is 200 KB."
msgstr ""
-msgid "Max requests per minute per user"
-msgstr ""
-
msgid "Max role"
msgstr ""
msgid "Max session time"
msgstr ""
-msgid "Max unauthenticated requests per period per IP"
+msgid "MaxBuilds"
msgstr ""
-msgid "MaxBuilds"
+msgid "Maximum 20 characters"
msgstr ""
msgid "Maximum Conan package file size in bytes"
@@ -20679,6 +20969,12 @@ msgstr ""
msgid "Maximum attachment size (MB)"
msgstr ""
+msgid "Maximum authenticated API requests per rate limit period per user"
+msgstr ""
+
+msgid "Maximum authenticated web requests per rate limit period per user"
+msgstr ""
+
msgid "Maximum bulk request size (MiB)"
msgstr ""
@@ -20724,6 +21020,15 @@ msgstr ""
msgid "Maximum files in a diff"
msgstr ""
+msgid "Maximum group export download requests per minute"
+msgstr ""
+
+msgid "Maximum group export requests per minute"
+msgstr ""
+
+msgid "Maximum group import requests per minute"
+msgstr ""
+
msgid "Maximum import size"
msgstr ""
@@ -20760,7 +21065,7 @@ msgstr ""
msgid "Maximum number of projects."
msgstr ""
-msgid "Maximum number of unique IPs per user"
+msgid "Maximum number of unique IP addresses per user."
msgstr ""
msgid "Maximum page reached"
@@ -20769,12 +21074,24 @@ msgstr ""
msgid "Maximum page size"
msgstr ""
+msgid "Maximum project export download requests per minute"
+msgstr ""
+
+msgid "Maximum project export requests per minute"
+msgstr ""
+
+msgid "Maximum project import requests per minute"
+msgstr ""
+
msgid "Maximum push size"
msgstr ""
msgid "Maximum push size (MB)"
msgstr ""
+msgid "Maximum requests per minute"
+msgstr ""
+
msgid "Maximum running slices"
msgstr ""
@@ -20802,10 +21119,16 @@ msgstr ""
msgid "Maximum time between updates that a mirror can have when scheduled to synchronize."
msgstr ""
-msgid "Maximum time for web terminal websocket connection (in seconds). 0 for unlimited."
+msgid "Maximum time that users are allowed to skip the setup of two-factor authentication (in hours). Set to 0 (zero) to enforce at next sign in."
msgstr ""
-msgid "Maximum time that users are allowed to skip the setup of two-factor authentication (in hours). Set to 0 (zero) to enforce at next sign in."
+msgid "Maximum time, in seconds, for a web terminal websocket connection. 0 for unlimited."
+msgstr ""
+
+msgid "Maximum unauthenticated API requests per rate limit period per IP"
+msgstr ""
+
+msgid "Maximum unauthenticated web requests per rate limit period per IP"
msgstr ""
msgid "May"
@@ -20823,9 +21146,6 @@ msgstr ""
msgid "Medium vulnerabilities present"
msgstr ""
-msgid "Member lock"
-msgstr ""
-
msgid "Member since"
msgstr ""
@@ -20862,6 +21182,9 @@ msgstr ""
msgid "Members of a group may only view projects they have permission to access"
msgstr ""
+msgid "Membership"
+msgstr ""
+
msgid "Members|%{time} by %{user}"
msgstr ""
@@ -20922,9 +21245,6 @@ msgstr ""
msgid "Members|Expiration date updated successfully."
msgstr ""
-msgid "Members|Expired"
-msgstr ""
-
msgid "Members|Filter members"
msgstr ""
@@ -20940,9 +21260,6 @@ msgstr ""
msgid "Members|Membership"
msgstr ""
-msgid "Members|No expiration set"
-msgstr ""
-
msgid "Members|Remove \"%{groupName}\""
msgstr ""
@@ -20964,9 +21281,6 @@ msgstr ""
msgid "Members|Search invited"
msgstr ""
-msgid "Members|in %{time}"
-msgstr ""
-
msgid "Member|Deny access"
msgstr ""
@@ -21042,9 +21356,6 @@ msgstr ""
msgid "Merge request %{mr_link} was reviewed by %{mr_author}"
msgstr ""
-msgid "Merge request (MR) approvals"
-msgstr ""
-
msgid "Merge request analytics"
msgstr ""
@@ -21066,12 +21377,21 @@ msgstr ""
msgid "Merge requests"
msgstr ""
+msgid "Merge requests I've created"
+msgstr ""
+
msgid "Merge requests are a place to propose changes you've made to a project and discuss those changes with others"
msgstr ""
msgid "Merge requests are read-only in a secondary Geo node"
msgstr ""
+msgid "Merge requests assigned to me"
+msgstr ""
+
+msgid "Merge requests that I'm a reviewer"
+msgstr ""
+
msgid "Merge the branch and fix any conflicts that come up"
msgstr ""
@@ -21132,10 +21452,10 @@ msgstr ""
msgid "MergeRequests|An error occurred while saving the draft comment."
msgstr ""
-msgid "MergeRequests|Failed to squash. Should be done manually."
+msgid "MergeRequests|Create issue to resolve thread"
msgstr ""
-msgid "MergeRequests|Resolve this thread in a new issue"
+msgid "MergeRequests|Failed to squash. Should be done manually."
msgstr ""
msgid "MergeRequests|Saving the comment failed"
@@ -21949,6 +22269,9 @@ msgstr ""
msgid "MoveIssue|Cannot move issue to project it originates from!"
msgstr ""
+msgid "MoveIssue|Cannot move issues of '%{issue_type}' type."
+msgstr ""
+
msgid "Moved issue to %{label} column in the board."
msgstr ""
@@ -22074,6 +22397,15 @@ 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. To learn more about reducing storage capacity please visit our docs."
msgstr ""
+msgid "NamespaceUserCap|Pending users must be reviewed and approved by a group owner. Learn more about %{user_caps_link_start}User Caps%{link_end} and %{users_pending_approval_link_start}Users Pending Approval%{link_end}."
+msgstr ""
+
+msgid "NamespaceUserCap|View pending user approvals"
+msgstr ""
+
+msgid "NamespaceUserCap|Your group has reached its billable member limit"
+msgstr ""
+
msgid "Namespaces"
msgstr ""
@@ -22116,9 +22448,6 @@ msgstr ""
msgid "Network"
msgstr ""
-msgid "Network Policy|New rule"
-msgstr ""
-
msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is inbound from a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
msgstr ""
@@ -22140,16 +22469,13 @@ msgstr ""
msgid "NetworkPolicies|%{strongOpen}any%{strongClose} port"
msgstr ""
-msgid "NetworkPolicies|+ Add alert"
-msgstr ""
-
msgid "NetworkPolicies|.yaml"
msgstr ""
msgid "NetworkPolicies|.yaml mode"
msgstr ""
-msgid "NetworkPolicies|Actions"
+msgid "NetworkPolicies|Add alert"
msgstr ""
msgid "NetworkPolicies|Alerts are intended to be selectively used for a limited number of events that are potentially concerning and warrant a manual review. Alerts should not be used as a substitute for a SIEM or a logging tool. High volume alerts are likely to be dropped so as to preserve the stability of GitLab's integration with Kubernetes."
@@ -22185,9 +22511,6 @@ msgstr ""
msgid "NetworkPolicies|Deny all traffic"
msgstr ""
-msgid "NetworkPolicies|Description"
-msgstr ""
-
msgid "NetworkPolicies|Edit policy"
msgstr ""
@@ -22200,9 +22523,6 @@ msgstr ""
msgid "NetworkPolicies|IP/subnet"
msgstr ""
-msgid "NetworkPolicies|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
-msgstr ""
-
msgid "NetworkPolicies|Invalid or empty policy"
msgstr ""
@@ -22212,19 +22532,16 @@ msgstr ""
msgid "NetworkPolicies|Kubernetes error: %{error}"
msgstr ""
-msgid "NetworkPolicies|Name"
-msgstr ""
-
msgid "NetworkPolicies|Network"
msgstr ""
-msgid "NetworkPolicies|Network traffic"
+msgid "NetworkPolicies|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
msgstr ""
-msgid "NetworkPolicies|New policy"
+msgid "NetworkPolicies|Network policy can be created after the environment is loaded successfully."
msgstr ""
-msgid "NetworkPolicies|No policies detected"
+msgid "NetworkPolicies|Network traffic"
msgstr ""
msgid "NetworkPolicies|None selected"
@@ -22233,21 +22550,12 @@ msgstr ""
msgid "NetworkPolicies|Please %{installLinkStart}install%{installLinkEnd} and %{configureLinkStart}configure a Kubernetes Agent for this project%{configureLinkEnd} to enable alerts."
msgstr ""
-msgid "NetworkPolicies|Policies are a specification of how groups of pods are allowed to communicate with each other's network endpoints."
-msgstr ""
-
msgid "NetworkPolicies|Policy %{policyName} was successfully changed"
msgstr ""
msgid "NetworkPolicies|Policy definition"
msgstr ""
-msgid "NetworkPolicies|Policy editor"
-msgstr ""
-
-msgid "NetworkPolicies|Policy preview"
-msgstr ""
-
msgid "NetworkPolicies|Rule"
msgstr ""
@@ -22257,9 +22565,6 @@ msgstr ""
msgid "NetworkPolicies|Rule mode is unavailable for this policy. In some cases, we cannot parse the YAML file back into the rules editor."
msgstr ""
-msgid "NetworkPolicies|Rules"
-msgstr ""
-
msgid "NetworkPolicies|Save changes"
msgstr ""
@@ -22272,9 +22577,6 @@ msgstr ""
msgid "NetworkPolicies|Traffic that does not match any rule will be blocked."
msgstr ""
-msgid "NetworkPolicies|Unable to parse policy"
-msgstr ""
-
msgid "NetworkPolicies|all DNS names"
msgstr ""
@@ -22454,6 +22756,9 @@ msgstr ""
msgid "New issue"
msgstr ""
+msgid "New issue in %{project}"
+msgstr ""
+
msgid "New issue title"
msgstr ""
@@ -22532,7 +22837,7 @@ msgstr ""
msgid "Newest first"
msgstr ""
-msgid "Newly registered users will by default be external"
+msgid "Newly-registered users are external by default"
msgstr ""
msgid "Next"
@@ -22847,8 +23152,10 @@ msgstr ""
msgid "No webhooks found, add one in the form above."
msgstr ""
-msgid "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} to renew your subscription."
-msgstr ""
+msgid "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} day to renew your subscription."
+msgid_plural "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} days to renew your subscription."
+msgstr[0] ""
+msgstr[1] ""
msgid "No. of commits"
msgstr ""
@@ -22865,7 +23172,7 @@ msgstr ""
msgid "Nodes"
msgstr ""
-msgid "Non-admin users can sign in with read-only access and make read-only API requests."
+msgid "Non-admin users are restricted to read-only access, in both GitLab UI and API."
msgstr ""
msgid "None"
@@ -22946,7 +23253,7 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
-msgid "Notes Rate Limits"
+msgid "Notes rate limit"
msgstr ""
msgid "Notes|Are you sure you want to cancel creating this comment?"
@@ -23113,9 +23420,6 @@ msgstr ""
msgid "November"
msgstr ""
-msgid "Novice"
-msgstr ""
-
msgid "Now, personalize your GitLab experience"
msgstr ""
@@ -23284,7 +23588,7 @@ msgstr ""
msgid "OnCallSchedules|For this rotation, on-call will be:"
msgstr ""
-msgid "OnCallSchedules|On-call schedule %{schedule} in Project %{project}"
+msgid "OnCallSchedules|On-call schedule %{obstacle} in Project %{project}"
msgstr ""
msgid "OnCallSchedules|On-call schedules"
@@ -23431,22 +23735,22 @@ msgstr ""
msgid "OnDemandScans|Scanner profile"
msgstr ""
-msgid "OnDemandScans|Select one of the existing profiles"
+msgid "OnDemandScans|Schedule scan"
msgstr ""
-msgid "OnDemandScans|Site profile"
+msgid "OnDemandScans|Select one of the existing profiles"
msgstr ""
-msgid "OnDemandScans|Use existing scanner profile"
+msgid "OnDemandScans|Site profile"
msgstr ""
-msgid "OnDemandScans|Use existing site profile"
+msgid "OnDemandScans|Start time"
msgstr ""
-msgid "OnDemandScans|You can either choose a passive scan or validate the target site in your chosen site profile. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
+msgid "OnDemandScans|Use existing scanner profile"
msgstr ""
-msgid "OnDemandScans|You cannot run an active scan against an unvalidated site."
+msgid "OnDemandScans|Use existing site profile"
msgstr ""
msgid "OnDemandScans|You must create a repository within your project to run an on-demand scan."
@@ -23511,6 +23815,9 @@ msgstr ""
msgid "Only admins can delete project"
msgstr ""
+msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
+msgstr ""
+
msgid "Only include features new to your current subscription tier."
msgstr ""
@@ -23529,6 +23836,12 @@ msgstr ""
msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
+msgid "Only reCAPTCHA v2 is supported:"
+msgstr ""
+
+msgid "Only users from the specified IP address ranges are able to reach this group, including all subgroups, projects, and Git repositories."
+msgstr ""
+
msgid "Only verified users with an email address in any of these domains can be added to the group."
msgstr ""
@@ -23715,9 +24028,6 @@ msgstr ""
msgid "Package Registry"
msgstr ""
-msgid "Package Registry Rate Limits"
-msgstr ""
-
msgid "Package Registry: authenticated API requests"
msgstr ""
@@ -23736,6 +24046,9 @@ msgstr ""
msgid "Package recipe already exists"
msgstr ""
+msgid "Package registry rate limits"
+msgstr ""
+
msgid "Package type"
msgstr ""
@@ -23802,6 +24115,9 @@ msgstr ""
msgid "PackageRegistry|Composer"
msgstr ""
+msgid "PackageRegistry|Composer.json with license: %{license} and version: %{version}"
+msgstr ""
+
msgid "PackageRegistry|Conan"
msgstr ""
@@ -23865,6 +24181,9 @@ msgstr ""
msgid "PackageRegistry|Copy require package include"
msgstr ""
+msgid "PackageRegistry|Copy target SHA"
+msgstr ""
+
msgid "PackageRegistry|Copy yarn command"
msgstr ""
@@ -23931,6 +24250,9 @@ msgstr ""
msgid "PackageRegistry|Install package version"
msgstr ""
+msgid "PackageRegistry|Instance-level"
+msgstr ""
+
msgid "PackageRegistry|Invalid Package: failed metadata extraction"
msgstr ""
@@ -23976,6 +24298,9 @@ msgstr ""
msgid "PackageRegistry|Pip Command"
msgstr ""
+msgid "PackageRegistry|Project-level"
+msgstr ""
+
msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
msgstr ""
@@ -23997,6 +24322,9 @@ msgstr ""
msgid "PackageRegistry|Remove package"
msgstr ""
+msgid "PackageRegistry|Required Python: %{pythonVersion}"
+msgstr ""
+
msgid "PackageRegistry|RubyGems"
msgstr ""
@@ -24039,6 +24367,9 @@ msgstr ""
msgid "PackageRegistry|Source project located at %{link}"
msgstr ""
+msgid "PackageRegistry|Target SHA: %{sha}"
+msgstr ""
+
msgid "PackageRegistry|There are no other versions of this package."
msgstr ""
@@ -24207,6 +24538,18 @@ msgstr ""
msgid "Password was successfully updated. Please sign in again."
msgstr ""
+msgid "PasswordPrompt|Confirm password"
+msgstr ""
+
+msgid "PasswordPrompt|Confirm password to continue"
+msgstr ""
+
+msgid "PasswordPrompt|Password is required"
+msgstr ""
+
+msgid "PasswordPrompt|Please enter your password to confirm"
+msgstr ""
+
msgid "Passwords should be unique and not used for any other sites or services."
msgstr ""
@@ -24234,6 +24577,9 @@ msgstr ""
msgid "Paste project path (i.e. gitlab-org/gitlab)"
msgstr ""
+msgid "Paste this DSN into your Sentry SDK"
+msgstr ""
+
msgid "Paste your public SSH key, which is usually contained in the file '~/.ssh/id_ed25519.pub' or '~/.ssh/id_rsa.pub' and begins with 'ssh-ed25519' or 'ssh-rsa'. Do not paste your private SSH key, as that can compromise your identity."
msgstr ""
@@ -24318,6 +24664,9 @@ msgstr ""
msgid "PerformanceBar|First Contentful Paint"
msgstr ""
+msgid "PerformanceBar|Flamegraph with mode:"
+msgstr ""
+
msgid "PerformanceBar|Frontend resources"
msgstr ""
@@ -24351,6 +24700,15 @@ msgstr ""
msgid "PerformanceBar|Trace"
msgstr ""
+msgid "PerformanceBar|cpu"
+msgstr ""
+
+msgid "PerformanceBar|object"
+msgstr ""
+
+msgid "PerformanceBar|wall"
+msgstr ""
+
msgid "Period in seconds"
msgstr ""
@@ -24579,6 +24937,48 @@ msgstr ""
msgid "PipelineSchedules|Variables"
msgstr ""
+msgid "PipelineSource|API"
+msgstr ""
+
+msgid "PipelineSource|Chat"
+msgstr ""
+
+msgid "PipelineSource|External"
+msgstr ""
+
+msgid "PipelineSource|External Pull Request"
+msgstr ""
+
+msgid "PipelineSource|Merge Request"
+msgstr ""
+
+msgid "PipelineSource|On-Demand DAST Scan"
+msgstr ""
+
+msgid "PipelineSource|On-Demand DAST Validation"
+msgstr ""
+
+msgid "PipelineSource|Parent Pipeline"
+msgstr ""
+
+msgid "PipelineSource|Pipeline"
+msgstr ""
+
+msgid "PipelineSource|Push"
+msgstr ""
+
+msgid "PipelineSource|Schedule"
+msgstr ""
+
+msgid "PipelineSource|Trigger"
+msgstr ""
+
+msgid "PipelineSource|Web"
+msgstr ""
+
+msgid "PipelineSource|Web IDE"
+msgstr ""
+
msgid "PipelineStatusTooltip|Pipeline: %{ciStatus}"
msgstr ""
@@ -24879,46 +25279,7 @@ msgstr ""
msgid "Pipeline|Source"
msgstr ""
-msgid "Pipeline|Source|API"
-msgstr ""
-
-msgid "Pipeline|Source|Chat"
-msgstr ""
-
-msgid "Pipeline|Source|External"
-msgstr ""
-
-msgid "Pipeline|Source|External Pull Request"
-msgstr ""
-
-msgid "Pipeline|Source|Merge Request"
-msgstr ""
-
-msgid "Pipeline|Source|On-Demand DAST Scan"
-msgstr ""
-
-msgid "Pipeline|Source|On-Demand DAST Validation"
-msgstr ""
-
-msgid "Pipeline|Source|Parent Pipeline"
-msgstr ""
-
-msgid "Pipeline|Source|Pipeline"
-msgstr ""
-
-msgid "Pipeline|Source|Push"
-msgstr ""
-
-msgid "Pipeline|Source|Schedule"
-msgstr ""
-
-msgid "Pipeline|Source|Trigger"
-msgstr ""
-
-msgid "Pipeline|Source|Web"
-msgstr ""
-
-msgid "Pipeline|Source|Web IDE"
+msgid "Pipeline|Source|Security Policy"
msgstr ""
msgid "Pipeline|Specify variable values to be used in this run. The values specified in %{linkStart}CI/CD settings%{linkEnd} will be used by default."
@@ -24969,7 +25330,7 @@ msgstr ""
msgid "Pipeline|We are currently unable to fetch pipeline data"
msgstr ""
-msgid "Pipeline|You’re about to stop pipeline %{pipelineId}."
+msgid "Pipeline|You’re about to stop pipeline #%{pipelineId}."
msgstr ""
msgid "Pipeline|for"
@@ -24996,6 +25357,9 @@ msgstr ""
msgid "Plain diff"
msgstr ""
+msgid "Plain-text response to send to clients that hit a rate limit"
+msgstr ""
+
msgid "Plan:"
msgstr ""
@@ -25140,9 +25504,6 @@ msgstr ""
msgid "Please provide attributes to update"
msgstr ""
-msgid "Please provide your username or email address."
-msgstr ""
-
msgid "Please reach out if you have any questions and we'll be happy to assist."
msgstr ""
@@ -25185,9 +25546,6 @@ msgstr ""
msgid "Please set a new password before proceeding."
msgstr ""
-msgid "Please share your feedback about %{featureName} %{linkStart}in this issue%{linkEnd} to help us improve the experience."
-msgstr ""
-
msgid "Please solve the captcha"
msgstr ""
@@ -25365,6 +25723,9 @@ msgstr ""
msgid "Prevent adding new members to project membership within this group"
msgstr ""
+msgid "Prevent auto-stopping"
+msgstr ""
+
msgid "Prevent editing approval rules in projects and merge requests."
msgstr ""
@@ -25377,7 +25738,7 @@ msgstr ""
msgid "Prevent users from changing their profile name"
msgstr ""
-msgid "Prevent users from performing write operations on GitLab while performing maintenance."
+msgid "Prevent users from performing write operations while GitLab maintenance is in progress."
msgstr ""
msgid "Preview"
@@ -25650,6 +26011,9 @@ msgstr ""
msgid "Profiles|Enter your name, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Enter your password to confirm the email change"
+msgstr ""
+
msgid "Profiles|Enter your pronouns to let people know how to refer to you"
msgstr ""
@@ -25884,10 +26248,10 @@ msgstr ""
msgid "Profiles|e.g. My MacBook key"
msgstr ""
-msgid "Profiles|username"
+msgid "Profiles|https://website.com"
msgstr ""
-msgid "Profiles|website.com"
+msgid "Profiles|username"
msgstr ""
msgid "Profiles|your account"
@@ -26130,9 +26494,21 @@ msgstr ""
msgid "ProjectSelect| or group"
msgstr ""
+msgid "ProjectSelect|No matching results"
+msgstr ""
+
msgid "ProjectSelect|Search for project"
msgstr ""
+msgid "ProjectSelect|Search projects"
+msgstr ""
+
+msgid "ProjectSelect|Select a project"
+msgstr ""
+
+msgid "ProjectSelect|There was an error fetching the projects. Please try again."
+msgstr ""
+
msgid "ProjectService|Drone server URL"
msgstr ""
@@ -26220,6 +26596,9 @@ msgstr ""
msgid "ProjectService|Trigger event when a new, unique alert is recorded."
msgstr ""
+msgid "ProjectService|Trigger event when a new, unique vulnerability is recorded. (Note: This feature requires an Ultimate plan.)"
+msgstr ""
+
msgid "ProjectService|Trigger event when a pipeline status changes."
msgstr ""
@@ -26634,9 +27013,15 @@ msgstr ""
msgid "Projects are graded based on the highest severity vulnerability present"
msgstr ""
+msgid "Projects are organized into groups"
+msgstr ""
+
msgid "Projects contributed to"
msgstr ""
+msgid "Projects help you organize your work. They contain your file repository, issues, merge requests, and so much more."
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr ""
@@ -26871,10 +27256,10 @@ msgstr ""
msgid "PrometheusService|Prometheus cluster integration"
msgstr ""
-msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
+msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
msgstr ""
-msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
+msgid "PrometheusService|The ID of the IAP-secured resource."
msgstr ""
msgid "PrometheusService|The Prometheus API base URL."
@@ -27492,6 +27877,9 @@ msgstr ""
msgid "Rate limit"
msgstr ""
+msgid "Rate limits can help reduce request volume (like from crawlers or abusive bots)."
+msgstr ""
+
msgid "Raw blob request rate limit per minute"
msgstr ""
@@ -27504,6 +27892,9 @@ msgstr ""
msgid "Re-authentication required"
msgstr ""
+msgid "Re-import"
+msgstr ""
+
msgid "Re-request review"
msgstr ""
@@ -27525,6 +27916,9 @@ msgstr ""
msgid "Read more about related issues"
msgstr ""
+msgid "Read their documentation."
+msgstr ""
+
msgid "Ready to get started with GitLab? Follow these steps to set up your workspace, plan and commit changes, and deploy your project."
msgstr ""
@@ -27558,6 +27952,9 @@ msgstr ""
msgid "Receive any notifications from GitLab."
msgstr ""
+msgid "Receive notification of abuse reports by email."
+msgstr ""
+
msgid "Receive notifications about your own activity"
msgstr ""
@@ -27701,9 +28098,6 @@ msgstr ""
msgid "Registry setup"
msgstr ""
-msgid "Regulate approvals by authors/committers. Affects all projects."
-msgstr ""
-
msgid "Reindexing Status: %{status} (Slice multiplier: %{multiplier}, Maximum running slices: %{max_slices})"
msgstr ""
@@ -27799,6 +28193,9 @@ msgstr ""
msgid "Release|Something went wrong while saving the release details."
msgstr ""
+msgid "Reload page"
+msgstr ""
+
msgid "Remediations"
msgstr ""
@@ -28081,6 +28478,9 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
+msgid "Repeats"
+msgstr ""
+
msgid "Replace"
msgstr ""
@@ -28443,10 +28843,7 @@ msgstr ""
msgid "Require additional authentication for administrative tasks."
msgstr ""
-msgid "Require all users in this group to setup Two-factor authentication"
-msgstr ""
-
-msgid "Require all users in this group to setup two-factor authentication"
+msgid "Require all users in this group to set up two-factor authentication"
msgstr ""
msgid "Required approvals (%{approvals_given} given)"
@@ -28492,6 +28889,9 @@ msgstr[1] ""
msgid "Requires values to meet regular expression requirements."
msgstr ""
+msgid "Requires you to deploy or set up cloud-hosted Sentry."
+msgstr ""
+
msgid "Requires your primary GitLab email address."
msgstr ""
@@ -28552,9 +28952,6 @@ msgstr ""
msgid "Resolve"
msgstr ""
-msgid "Resolve all threads in new issue"
-msgstr ""
-
msgid "Resolve conflicts"
msgstr ""
@@ -28612,6 +29009,9 @@ msgstr ""
msgid "Response text"
msgstr ""
+msgid "Restart GitLab to apply changes."
+msgstr ""
+
msgid "Restart Terminal"
msgstr ""
@@ -28630,6 +29030,9 @@ msgstr ""
msgid "Restoring the project will prevent the project from being removed on this date and restore people's ability to make changes to it."
msgstr ""
+msgid "Restrict group access by IP address. %{link_start}Learn more%{link_end}."
+msgstr ""
+
msgid "Restrict membership by email domain"
msgstr ""
@@ -28943,6 +29346,9 @@ msgstr ""
msgid "Runners|Runner #%{runner_id}"
msgstr ""
+msgid "Runners|Runner assigned to project."
+msgstr ""
+
msgid "Runners|Runner is offline, last contact was %{runner_contact} ago"
msgstr ""
@@ -28955,6 +29361,9 @@ msgstr ""
msgid "Runners|Runner registration"
msgstr ""
+msgid "Runners|Runner unassigned from project."
+msgstr ""
+
msgid "Runners|Runners"
msgstr ""
@@ -29147,7 +29556,7 @@ msgstr ""
msgid "SastEntryPoints|How do I set up SAST?"
msgstr ""
-msgid "SastEntryPoints|Learn more."
+msgid "SastEntryPoints|Learn more"
msgstr ""
msgid "Satisfied"
@@ -29189,7 +29598,7 @@ msgstr ""
msgid "Save pipeline schedule"
msgstr ""
-msgid "Save space and find images in the container Registry. remove unneeded tags and keep only the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
+msgid "Save storage space by automatically deleting tags from the container registry and keeping the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
msgstr ""
msgid "Saving"
@@ -29363,6 +29772,9 @@ msgstr ""
msgid "Search or filter results…"
msgstr ""
+msgid "Search or jump to..."
+msgstr ""
+
msgid "Search project"
msgstr ""
@@ -29423,16 +29835,16 @@ msgstr ""
msgid "SearchCodeResults|of %{link_to_project}"
msgstr ""
-msgid "SearchResults|Showing %{count} %{scope} for%{term_element}"
+msgid "SearchResults|Showing %{count} %{scope} for %{term_element}"
msgstr ""
-msgid "SearchResults|Showing %{count} %{scope} for%{term_element} in your personal and project snippets"
+msgid "SearchResults|Showing %{count} %{scope} for %{term_element} in your personal and project snippets"
msgstr ""
-msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for%{term_element}"
+msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for %{term_element}"
msgstr ""
-msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for%{term_element} in your personal and project snippets"
+msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for %{term_element} in your personal and project snippets"
msgstr ""
msgid "SearchResults|code result"
@@ -29514,6 +29926,9 @@ msgstr ""
msgid "Secret Detection"
msgstr ""
+msgid "Secret access key"
+msgstr ""
+
msgid "Secret token"
msgstr ""
@@ -29553,9 +29968,6 @@ msgstr ""
msgid "SecurityApprovals|A merge request approval is required when the license compliance report contains a denied license."
msgstr ""
-msgid "SecurityApprovals|Configurable if security scanners are enabled. %{linkStart}Learn more.%{linkEnd}"
-msgstr ""
-
msgid "SecurityApprovals|Coverage-Check"
msgstr ""
@@ -29568,24 +29980,18 @@ msgstr ""
msgid "SecurityApprovals|Learn more about Vulnerability-Check"
msgstr ""
-msgid "SecurityApprovals|License Scanning must be enabled. %{linkStart}Learn more%{linkEnd}."
-msgstr ""
-
msgid "SecurityApprovals|License-Check"
msgstr ""
msgid "SecurityApprovals|Requires approval for Denied licenses. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}More information%{linkEnd}"
+msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "SecurityApprovals|Requires approval for vulnerabilities. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
-msgid "SecurityApprovals|Test coverage must be enabled. %{linkStart}Learn more%{linkEnd}."
-msgstr ""
-
msgid "SecurityApprovals|Vulnerability-Check"
msgstr ""
@@ -29649,6 +30055,12 @@ msgstr ""
msgid "SecurityConfiguration|Immediately begin risk analysis and remediation with application security features. Start with SAST and Secret Detection, available to all plans. Upgrade to Ultimate to get all features, including:"
msgstr ""
+msgid "SecurityConfiguration|Manage corpus"
+msgstr ""
+
+msgid "SecurityConfiguration|Manage corpus files used as mutation sources in coverage fuzzing."
+msgstr ""
+
msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
msgstr ""
@@ -29703,6 +30115,12 @@ msgstr ""
msgid "SecurityOrchestration|Action"
msgstr ""
+msgid "SecurityOrchestration|Actions"
+msgstr ""
+
+msgid "SecurityOrchestration|Add rule"
+msgstr ""
+
msgid "SecurityOrchestration|All policies"
msgstr ""
@@ -29736,9 +30154,6 @@ msgstr ""
msgid "SecurityOrchestration|Network"
msgstr ""
-msgid "SecurityOrchestration|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
-msgstr ""
-
msgid "SecurityOrchestration|New policy"
msgstr ""
@@ -29754,6 +30169,9 @@ msgstr ""
msgid "SecurityOrchestration|Policy editor"
msgstr ""
+msgid "SecurityOrchestration|Policy preview"
+msgstr ""
+
msgid "SecurityOrchestration|Policy status"
msgstr ""
@@ -29763,6 +30181,9 @@ msgstr ""
msgid "SecurityOrchestration|Rule"
msgstr ""
+msgid "SecurityOrchestration|Rules"
+msgstr ""
+
msgid "SecurityOrchestration|Scan Execution"
msgstr ""
@@ -29856,6 +30277,9 @@ msgstr ""
msgid "SecurityReports|Create issue"
msgstr ""
+msgid "SecurityReports|Development vulnerabilities"
+msgstr ""
+
msgid "SecurityReports|Dismiss vulnerability"
msgstr ""
@@ -29871,6 +30295,9 @@ msgstr ""
msgid "SecurityReports|Download results"
msgstr ""
+msgid "SecurityReports|Download scanned URLs"
+msgstr ""
+
msgid "SecurityReports|Download scanned resources"
msgstr ""
@@ -29994,6 +30421,9 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
+msgid "SecurityReports|The Vulnerability Report shows the results of the lastest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "SecurityReports|The security reports below contain one or more vulnerability findings that could not be parsed and were not recorded. Download the artifacts in the job output to investigate. Ensure any security report created conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
msgstr ""
@@ -30135,10 +30565,10 @@ msgstr ""
msgid "Select a repository"
msgstr ""
-msgid "Select a role"
+msgid "Select a repository containing templates for common files."
msgstr ""
-msgid "Select a shared template repository for all projects on this instance."
+msgid "Select a role"
msgstr ""
msgid "Select a template repository"
@@ -30216,6 +30646,9 @@ msgstr ""
msgid "Select project to choose zone"
msgstr ""
+msgid "Select project to create issue"
+msgstr ""
+
msgid "Select projects"
msgstr ""
@@ -30333,6 +30766,9 @@ msgstr ""
msgid "Send emails to help guide new users through the onboarding process."
msgstr ""
+msgid "Send emails to users upon account deactivation."
+msgstr ""
+
msgid "Send message"
msgstr ""
@@ -30351,6 +30787,9 @@ msgstr ""
msgid "Send service data"
msgstr ""
+msgid "Sentry"
+msgstr ""
+
msgid "Sentry API URL"
msgstr ""
@@ -30465,6 +30904,9 @@ msgstr ""
msgid "Service"
msgstr ""
+msgid "Service Accounts keys are required to authorize GitLab to deploy your Google Cloud project."
+msgstr ""
+
msgid "Service Desk"
msgstr ""
@@ -30537,15 +30979,15 @@ msgstr ""
msgid "Set a password on your account to pull or push via %{protocol}."
msgstr ""
-msgid "Set a template repository for projects in this group"
-msgstr ""
-
msgid "Set access permissions for this token."
msgstr ""
msgid "Set an instance-wide domain that will be available to all clusters when installing Knative."
msgstr ""
+msgid "Set any rate limit to %{code_open}0%{code_close} to disable the limit."
+msgstr ""
+
msgid "Set default and restrict visibility levels. Configure import sources and git access protocol."
msgstr ""
@@ -30558,7 +31000,7 @@ msgstr ""
msgid "Set limit to 0 to allow any file size."
msgstr ""
-msgid "Set max session time for web terminal."
+msgid "Set limits for web and API requests."
msgstr ""
msgid "Set milestone"
@@ -30567,15 +31009,18 @@ msgstr ""
msgid "Set new password"
msgstr ""
-msgid "Set notification email for abuse reports."
+msgid "Set parent epic to an epic"
msgstr ""
-msgid "Set parent epic to an epic"
+msgid "Set per-user rate limits for imports and exports of projects and groups."
msgstr ""
msgid "Set projects and maximum size limits, session duration, user options, and check feature availability for namespace plan."
msgstr ""
+msgid "Set rate limits for package registry API requests that supersede the general user and IP rate limits."
+msgstr ""
+
msgid "Set severity"
msgstr ""
@@ -30594,15 +31039,24 @@ msgstr ""
msgid "Set the default branch for this project. All merge requests and commits are made against this branch unless you specify a different one."
msgstr ""
+msgid "Set the default expiration time for job artifacts in all projects. Set to %{code_open}0%{code_close} to never expire artifacts by default. If no unit is written, it defaults to seconds. For example, these are all equivalent: %{code_open}3600%{code_close}, %{code_open}60 minutes%{code_close}, or %{code_open}one hour%{code_close}."
+msgstr ""
+
msgid "Set the due date to %{due_date}."
msgstr ""
msgid "Set the iteration to %{iteration_reference}."
msgstr ""
+msgid "Set the maximum session time for a web terminal."
+msgstr ""
+
msgid "Set the milestone to %{milestone_reference}."
msgstr ""
+msgid "Set the per-user rate limit for notes created by web or API requests."
+msgstr ""
+
msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
msgstr ""
@@ -30804,6 +31258,9 @@ msgstr ""
msgid "Show Pipeline IID"
msgstr ""
+msgid "Show all %{issuable_type}."
+msgstr ""
+
msgid "Show all activity"
msgstr ""
@@ -30855,15 +31312,9 @@ msgstr ""
msgid "Show list"
msgstr ""
-msgid "Show me advanced features"
-msgstr ""
-
msgid "Show me how to add a pipeline"
msgstr ""
-msgid "Show me the basics"
-msgstr ""
-
msgid "Show one file at a time"
msgstr ""
@@ -30904,15 +31355,15 @@ msgstr ""
msgid "Showing %{pageSize} of %{total} %{issuableType}"
msgstr ""
-msgid "Showing %{pageSize} of %{total} issues"
-msgstr ""
-
msgid "Showing all epics"
msgstr ""
msgid "Showing all issues"
msgstr ""
+msgid "Showing data for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
+msgstr ""
+
msgid "Showing data for workflow items created in this date range. Date range cannot exceed %{maxDateRange} days."
msgstr ""
@@ -30952,6 +31403,15 @@ msgstr ""
msgid "Sidebar|Weight"
msgstr ""
+msgid "Sidekiq job compression threshold (bytes)"
+msgstr ""
+
+msgid "Sidekiq job size limit (bytes)"
+msgstr ""
+
+msgid "Sidekiq job size limits"
+msgstr ""
+
msgid "Sign in"
msgstr ""
@@ -31072,6 +31532,9 @@ msgstr ""
msgid "Site profile not found for given parameters"
msgstr ""
+msgid "Sites"
+msgstr ""
+
msgid "Size"
msgstr ""
@@ -31102,19 +31565,22 @@ msgstr ""
msgid "SlackIntegration|Sends notifications about project events to Slack channels."
msgstr ""
-msgid "SlackService|2. Paste the %{strong_open}Token%{strong_close} into the field below"
+msgid "SlackService|1. %{slash_command_link_start}Add a slash command%{slash_command_link_end} in your Slack team using this information:"
msgstr ""
-msgid "SlackService|3. Select the %{strong_open}Active%{strong_close} checkbox, press %{strong_open}Save changes%{strong_close} and start using GitLab inside Slack!"
+msgid "SlackService|2. Paste the token from Slack in the %{strong_open}Token%{strong_close} field below."
msgstr ""
-msgid "SlackService|Fill in the word that works best for your team."
+msgid "SlackService|3. Select the %{strong_open}Active%{strong_close} checkbox, select %{strong_open}Save changes%{strong_close}, and start using slash commands in Slack!"
+msgstr ""
+
+msgid "SlackService|After setup, get a list of available Slack slash commands by entering"
msgstr ""
-msgid "SlackService|See list of available commands in Slack after setting up this service, by entering"
+msgid "SlackService|Fill in the word that works best for your team."
msgstr ""
-msgid "SlackService|This service allows users to perform common operations on this project by entering slash commands in Slack."
+msgid "SlackService|Perform common operations in this project by entering slash commands in Slack."
msgstr ""
msgid "Slice multiplier"
@@ -31180,7 +31646,7 @@ msgstr ""
msgid "Some child epics may be hidden due to applied filters"
msgstr ""
-msgid "Some common domains are not allowed. %{read_more_link}."
+msgid "Some common domains are not allowed. %{learn_more_link}."
msgstr ""
msgid "Some of the designs you tried uploading did not change:"
@@ -31264,9 +31730,6 @@ msgstr ""
msgid "Something went wrong while exporting requirements"
msgstr ""
-msgid "Something went wrong while fetching %{listType} list"
-msgstr ""
-
msgid "Something went wrong while fetching branches"
msgstr ""
@@ -31321,15 +31784,9 @@ msgstr ""
msgid "Something went wrong while merging this merge request. Please try again."
msgstr ""
-msgid "Something went wrong while moving issues."
-msgstr ""
-
msgid "Something went wrong while obtaining the Let's Encrypt certificate."
msgstr ""
-msgid "Something went wrong while performing the action."
-msgstr ""
-
msgid "Something went wrong while promoting the issue to an epic. Please try again."
msgstr ""
@@ -31657,7 +32114,10 @@ msgstr ""
msgid "SourcegraphPreferences|Uses a custom %{linkStart}Sourcegraph instance%{linkEnd}."
msgstr ""
-msgid "Spam Check API Key"
+msgid "Spam Check"
+msgstr ""
+
+msgid "Spam Check API key"
msgstr ""
msgid "Spam Logs"
@@ -31675,7 +32135,7 @@ msgstr ""
msgid "Specified URL cannot be used: \"%{reason}\""
msgstr ""
-msgid "Specify an e-mail address regex pattern to identify default internal users."
+msgid "Specify an email address regex pattern to identify default internal users."
msgstr ""
msgid "Speed up your pipelines with Needs relationships"
@@ -31930,7 +32390,7 @@ msgstr ""
msgid "StatusCheck|An error occurred fetching the status checks."
msgstr ""
-msgid "StatusCheck|Apply this status check to any branch or a specific protected branch."
+msgid "StatusCheck|Apply this status check to all branches or a specific protected branch."
msgstr ""
msgid "StatusCheck|Check for a status response in Merge Requests. Failures do not block merges. %{link_start}Learn more%{link_end}."
@@ -32269,6 +32729,9 @@ msgstr ""
msgid "Subscriptions"
msgstr ""
+msgid "Subscription|Your subscription for %{strong}%{namespace_name}%{strong_close} has expired and you are now on %{pricing_link_start}the GitLab Free tier%{pricing_link_end}. Don't worry, your data is safe. Get in touch with our support team (%{support_email}). They'll gladly help with your subscription renewal."
+msgstr ""
+
msgid "Subtracted"
msgstr ""
@@ -32497,6 +32960,9 @@ msgstr ""
msgid "SuperSonics|Plan"
msgstr ""
+msgid "SuperSonics|Please agree to the Subscription Agreement"
+msgstr ""
+
msgid "SuperSonics|Ready to get started? A GitLab plan is ideal for scaling organizations and for multi team usage."
msgstr ""
@@ -32527,6 +32993,9 @@ msgstr ""
msgid "SuperSonics|The activation code is not valid. Please make sure to copy it exactly from the Customers Portal or confirmation email. Learn more about %{linkStart}activating your subscription%{linkEnd}."
msgstr ""
+msgid "SuperSonics|The activation code should be a 24-character alphanumeric string"
+msgstr ""
+
msgid "SuperSonics|There is a connectivity issue."
msgstr ""
@@ -32569,9 +33038,15 @@ msgstr ""
msgid "SuperSonics|You do not have an active subscription"
msgstr ""
+msgid "SuperSonics|You have successfully added a license that activates on %{date}. Please see the subscription history table below for more details."
+msgstr ""
+
msgid "SuperSonics|You'll be charged for %{trueUpLinkStart}users over license%{trueUpLinkEnd} on a quarterly or annual basis, depending on the terms of your agreement."
msgstr ""
+msgid "SuperSonics|Your future dated license was successfully added"
+msgstr ""
+
msgid "SuperSonics|Your subscription"
msgstr ""
@@ -32824,7 +33299,7 @@ msgstr ""
msgid "Template to append to all Service Desk issues"
msgstr ""
-msgid "TemplateRepository|Select a repository to make its templates available to all projects. %{link_start}What should the repository contain?%{link_end} "
+msgid "TemplateRepository|Create common files more quickly, and standardize their format."
msgstr ""
msgid "Templates"
@@ -33030,7 +33505,7 @@ msgstr ""
msgid "TestCases|Search test cases"
msgstr ""
-msgid "TestCases|Something went wrong while adding test case to Todo."
+msgid "TestCases|Something went wrong while adding test case to a to-do item."
msgstr ""
msgid "TestCases|Something went wrong while creating a test case."
@@ -33042,7 +33517,7 @@ msgstr ""
msgid "TestCases|Something went wrong while fetching test cases list."
msgstr ""
-msgid "TestCases|Something went wrong while marking test case todo as done."
+msgid "TestCases|Something went wrong while marking test case to-do item as done."
msgstr ""
msgid "TestCases|Something went wrong while moving test case."
@@ -33162,7 +33637,7 @@ msgstr ""
msgid "Thanks for your purchase!"
msgstr ""
-msgid "That is ok, I do not want to renew"
+msgid "That's OK, I don't want to renew"
msgstr ""
msgid "That's it, well done!"
@@ -33185,7 +33660,7 @@ msgid_plural "The %{type} contains the following errors:"
msgstr[0] ""
msgstr[1] ""
-msgid "The API key used by GitLab for accessing the Spam Check service endpoint"
+msgid "The API key used by GitLab for accessing the Spam Check service endpoint."
msgstr ""
msgid "The GitLab subscription service (customers.gitlab.com) is currently experiencing an outage. You can monitor the status and get updates at %{linkStart}status.gitlab.com%{linkEnd}."
@@ -33224,9 +33699,6 @@ msgstr ""
msgid "The URL to use for connecting to Elasticsearch. Use a comma-separated list to support clustering (e.g., \"http://localhost:9200, http://localhost:9201\")."
msgstr ""
-msgid "The Vulnerability Report shows the results of the last successful pipeline run on the default branch."
-msgstr ""
-
msgid "The X509 Certificate to use when mutual TLS is required to communicate with the external authorization service. If left blank, the server certificate is still validated when accessing over HTTPS."
msgstr ""
@@ -33284,9 +33756,6 @@ msgstr ""
msgid "The default branch for this project has been changed. Please update your bookmarks."
msgstr ""
-msgid "The default expiration time for job artifacts. 0 for unlimited. The default unit is in seconds, but you can use other units, for example %{code_open}4 mins 2 sec%{code_close}, %{code_open}2h42min%{code_close}."
-msgstr ""
-
msgid "The dependency list details information about the components used within your project."
msgstr ""
@@ -33478,9 +33947,6 @@ msgstr ""
msgid "The merge conflicts for this merge request have already been resolved. Please return to the merge request."
msgstr ""
-msgid "The merge request can now be merged."
-msgstr ""
-
msgid "The metric must be one of %{metrics}."
msgstr ""
@@ -33856,7 +34322,7 @@ msgstr ""
msgid "There was a problem updating the keep latest artifacts setting."
msgstr ""
-msgid "There was an error %{message} todo."
+msgid "There was an error %{message} to-do item."
msgstr ""
msgid "There was an error adding a To Do."
@@ -33895,6 +34361,9 @@ msgstr ""
msgid "There was an error fetching projects"
msgstr ""
+msgid "There was an error fetching search autocomplete suggestions"
+msgstr ""
+
msgid "There was an error fetching stage total counts"
msgstr ""
@@ -34219,6 +34688,9 @@ msgstr ""
msgid "This field is required."
msgstr ""
+msgid "This form is disabled in preview"
+msgstr ""
+
msgid "This group"
msgstr ""
@@ -34240,9 +34712,6 @@ msgstr ""
msgid "This group is linked to a subscription"
msgstr ""
-msgid "This group, including all subgroups, projects and git repositories, will be reachable from only the specified IP address ranges."
-msgstr ""
-
msgid "This group, its subgroups and projects has been scheduled for removal on %{date}."
msgstr ""
@@ -34522,9 +34991,6 @@ msgstr ""
msgid "This user cannot be unlocked manually from GitLab"
msgstr ""
-msgid "This user does not have a pending request"
-msgstr ""
-
msgid "This user has an unconfirmed email address (%{email}). You may force a confirmation."
msgstr ""
@@ -34633,9 +35099,6 @@ msgstr ""
msgid "ThreatMonitoring|Packet Activity"
msgstr ""
-msgid "ThreatMonitoring|Policies"
-msgstr ""
-
msgid "ThreatMonitoring|Requests"
msgstr ""
@@ -34687,6 +35150,12 @@ msgstr ""
msgid "ThreatMonitoring|View documentation"
msgstr ""
+msgid "Threshold in bytes at which to compress Sidekiq job arguments."
+msgstr ""
+
+msgid "Threshold in bytes at which to reject Sidekiq jobs. Set this to 0 to if you don't want to limit Sidekiq jobs."
+msgstr ""
+
msgid "Throughput"
msgstr ""
@@ -34696,6 +35165,9 @@ msgstr ""
msgid "Time"
msgstr ""
+msgid "Time (in hours) that users are allowed to skip forced configuration of two-factor authentication."
+msgstr ""
+
msgid "Time Spent"
msgstr ""
@@ -34762,7 +35234,7 @@ msgstr ""
msgid "TimeTrackingEstimated|Est"
msgstr ""
-msgid "TimeTracking|%{startTag}Spent: %{endTag}%{timeSpentHumanReadable}"
+msgid "TimeTracking|%{spentStart}Spent: %{spentEnd}"
msgstr ""
msgid "TimeTracking|Estimated:"
@@ -34976,6 +35448,9 @@ msgstr ""
msgid "To access this domain create a new DNS record"
msgstr ""
+msgid "To add a custom suffix, set up a Service Desk email address. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "To add an SSH key you need to %{generate_link_start}generate one%{link_end} or use an %{existing_link_start}existing key%{link_end}."
msgstr ""
@@ -34997,13 +35472,16 @@ msgstr ""
msgid "To connect an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To continue using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
+msgstr ""
+
msgid "To continue, you need to select the link in the confirmation email we sent to verify your email address. If you didn't get our email, select %{strongStart}Resend confirmation email.%{strongEnd}"
msgstr ""
msgid "To define internal users, first enable new users set to external"
msgstr ""
-msgid "To enable Registration Features, make sure \"Enable service ping\" is checked."
+msgid "To enable Registration Features, first enable Service Ping."
msgstr ""
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
@@ -35030,7 +35508,7 @@ msgstr ""
msgid "To get started, use the link below to confirm your account."
msgstr ""
-msgid "To help improve GitLab and its user experience, GitLab will periodically collect usage information."
+msgid "To help improve GitLab and its user experience, GitLab periodically collects usage information."
msgstr ""
msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
@@ -35063,7 +35541,7 @@ msgstr ""
msgid "To preserve performance only %{strong_open}%{display_size} of %{real_size}%{strong_close} files are displayed."
msgstr ""
-msgid "To protect this issue's confidentiality, %{forkLink} and set the fork's visibility to private."
+msgid "To protect this issue's confidentiality, %{linkStart}fork this project%{linkEnd} and set the fork's visibility to private."
msgstr ""
msgid "To protect this issue's confidentiality, a private fork of this project was selected."
@@ -35096,12 +35574,15 @@ msgstr ""
msgid "To set up SAML authentication for your group through an identity provider like Azure, Okta, Onelogin, Ping Identity, or your custom SAML 2.0 provider:"
msgstr ""
-msgid "To set up this service:"
+msgid "To set up this integration:"
msgstr ""
msgid "To specify the notification level per project of a group you belong to, you need to visit project page and change notification level there."
msgstr ""
+msgid "To start using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
+msgstr ""
+
msgid "To unsubscribe from this issue, please paste the following link into your browser:"
msgstr ""
@@ -35689,9 +36170,6 @@ msgstr ""
msgid "Unable to fetch branches list, please close the form and try again"
msgstr ""
-msgid "Unable to fetch unscanned projects"
-msgstr ""
-
msgid "Unable to fetch vulnerable projects"
msgstr ""
@@ -35746,6 +36224,15 @@ msgstr ""
msgid "Unable to update this issue at this time."
msgstr ""
+msgid "Unapprove a merge request"
+msgstr ""
+
+msgid "Unapprove the current merge request."
+msgstr ""
+
+msgid "Unapproved the current merge request."
+msgstr ""
+
msgid "Unarchive project"
msgstr ""
@@ -35758,16 +36245,13 @@ msgstr ""
msgid "Unassigned"
msgstr ""
-msgid "Unauthenticated API request rate limit"
-msgstr ""
-
-msgid "Unauthenticated rate limit period in seconds"
+msgid "Unauthenticated API rate limit period in seconds"
msgstr ""
-msgid "Unauthenticated request rate limit"
+msgid "Unauthenticated requests"
msgstr ""
-msgid "Unauthenticated requests"
+msgid "Unauthenticated web rate limit period in seconds"
msgstr ""
msgid "Undo"
@@ -35869,18 +36353,6 @@ msgstr ""
msgid "Unresolved"
msgstr ""
-msgid "UnscannedProjects|15 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|30 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|5 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|60 or more days"
-msgstr ""
-
msgid "Unschedule job"
msgstr ""
@@ -36100,6 +36572,9 @@ msgstr ""
msgid "UsageQuota|%{help_link_start}Shared runners%{help_link_end} are disabled, so there are no limits set on pipeline usage"
msgstr ""
+msgid "UsageQuota|%{linkTitle} help link"
+msgstr ""
+
msgid "UsageQuota|%{percentageLeft} of purchased storage is available"
msgstr ""
@@ -36109,6 +36584,9 @@ msgstr ""
msgid "UsageQuota|Artifacts is a sum of build and pipeline artifacts."
msgstr ""
+msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
+msgstr ""
+
msgid "UsageQuota|Buy additional minutes"
msgstr ""
@@ -36118,9 +36596,21 @@ msgstr ""
msgid "UsageQuota|CI minutes usage by project"
msgstr ""
+msgid "UsageQuota|Code packages and container images."
+msgstr ""
+
msgid "UsageQuota|Current period usage"
msgstr ""
+msgid "UsageQuota|File attachments and smaller design graphics."
+msgstr ""
+
+msgid "UsageQuota|Git repository, managed by the Gitaly service."
+msgstr ""
+
+msgid "UsageQuota|Includes project registry, artifacts, packages, wiki, uploads and other items."
+msgstr ""
+
msgid "UsageQuota|Increase storage temporarily"
msgstr ""
@@ -36139,6 +36629,9 @@ msgstr ""
msgid "UsageQuota|Packages"
msgstr ""
+msgid "UsageQuota|Pipeline artifacts and job artifacts, created with CI/CD."
+msgstr ""
+
msgid "UsageQuota|Pipelines"
msgstr ""
@@ -36157,6 +36650,9 @@ msgstr ""
msgid "UsageQuota|Seats"
msgstr ""
+msgid "UsageQuota|Shared bits of code and text."
+msgstr ""
+
msgid "UsageQuota|Snippets"
msgstr ""
@@ -36166,6 +36662,12 @@ msgstr ""
msgid "UsageQuota|Storage"
msgstr ""
+msgid "UsageQuota|Storage type"
+msgstr ""
+
+msgid "UsageQuota|There is a known issue with Artifact storage where the total could be incorrect for some projects. More details and progress are available in %{warningLinkStart}the epic%{warningLinkEnd}."
+msgstr ""
+
msgid "UsageQuota|This is the total amount of storage used across your projects within this namespace."
msgstr ""
@@ -36205,6 +36707,9 @@ msgstr ""
msgid "UsageQuota|Usage"
msgstr ""
+msgid "UsageQuota|Usage Breakdown"
+msgstr ""
+
msgid "UsageQuota|Usage Quotas"
msgstr ""
@@ -36229,6 +36734,9 @@ msgstr ""
msgid "UsageQuota|Wiki"
msgstr ""
+msgid "UsageQuota|Wiki content."
+msgstr ""
+
msgid "UsageQuota|Wikis"
msgstr ""
@@ -36445,7 +36953,10 @@ msgstr ""
msgid "User Settings"
msgstr ""
-msgid "User and IP Rate Limits"
+msgid "User and IP rate limits"
+msgstr ""
+
+msgid "User does not have a pending request"
msgstr ""
msgid "User identity was successfully created."
@@ -36742,6 +37253,9 @@ msgstr ""
msgid "Users can launch a development environment from a GitLab browser tab when the %{linkStart}Gitpod%{linkEnd} integration is enabled."
msgstr ""
+msgid "Users can reactivate their account by signing in."
+msgstr ""
+
msgid "Users can render diagrams in AsciiDoc, Markdown, reStructuredText, and Textile documents using Kroki."
msgstr ""
@@ -36757,6 +37271,9 @@ msgstr ""
msgid "Users requesting access to"
msgstr ""
+msgid "Users to exclude from the rate limit"
+msgstr ""
+
msgid "Users were successfully added."
msgstr ""
@@ -36778,6 +37295,9 @@ msgstr ""
msgid "UsersSelect|Unassigned"
msgstr ""
+msgid "Uses GitLab as a lightweight alternative to Sentry."
+msgstr ""
+
msgid "Using %{code_start}::%{code_end} denotes a %{link_start}scoped label set%{link_end}"
msgstr ""
@@ -36808,10 +37328,7 @@ msgstr ""
msgid "Value Stream Analytics can help you determine your team’s velocity"
msgstr ""
-msgid "Value Stream Analytics gives an overview of how much time it takes to go from idea to production in your project."
-msgstr ""
-
-msgid "Value may contain a variable reference"
+msgid "Value might contain a variable reference"
msgstr ""
msgid "Value stream"
@@ -36877,10 +37394,10 @@ msgstr ""
msgid "ValueStream|The Default Value Stream cannot be deleted"
msgstr ""
-msgid "Variable"
+msgid "Values that contain the %{codeStart}$%{codeEnd} character can be considered a variable reference and expanded. %{docsLinkStart}Learn more.%{docsLinkEnd}"
msgstr ""
-msgid "Variable references indicated by %{codeStart}$%{codeEnd} may be expanded. If this is not what you want, consider %{docsLinkStart}using a workaround to prevent expansion%{docsLinkEnd}."
+msgid "Variable"
msgstr ""
msgid "Variable will be masked in job logs."
@@ -37285,6 +37802,9 @@ msgstr ""
msgid "Vulnerability|Evidence"
msgstr ""
+msgid "Vulnerability|False positive detected"
+msgstr ""
+
msgid "Vulnerability|File"
msgstr ""
@@ -37327,6 +37847,9 @@ msgstr ""
msgid "Vulnerability|Status"
msgstr ""
+msgid "Vulnerability|The scanner determined this vulnerability to be a false positive. Verify the evaluation before changing its status. %{linkStart}Learn more about false positive detection.%{linkEnd}"
+msgstr ""
+
msgid "Vulnerability|The unmodified response is the original response that had no mutations done to the request"
msgstr ""
@@ -37651,9 +38174,6 @@ msgstr ""
msgid "Welcome to GitLab,%{br_tag}%{name}!"
msgstr ""
-msgid "Welcome to the guided GitLab tour"
-msgstr ""
-
msgid "Welcome, %{name}!"
msgstr ""
@@ -37672,9 +38192,6 @@ msgstr ""
msgid "What are you searching for?"
msgstr ""
-msgid "What describes you best?"
-msgstr ""
-
msgid "What does this command do?"
msgstr ""
@@ -37696,13 +38213,13 @@ msgstr ""
msgid "What is your job title? (optional)"
msgstr ""
-msgid "What will you use this group for?"
+msgid "What templates can I create?"
msgstr ""
-msgid "What's new"
+msgid "What will you use this group for?"
msgstr ""
-msgid "What’s your experience level?"
+msgid "What's new"
msgstr ""
msgid "When a deployment job is successful, skip older deployment jobs that are still pending."
@@ -37714,6 +38231,9 @@ msgstr ""
msgid "When an event in GitLab triggers a webhook, you can use the request details to figure out if something went wrong."
msgstr ""
+msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+msgstr ""
+
msgid "When inactive, an external authentication provider must be used."
msgstr ""
@@ -37737,6 +38257,9 @@ msgstr ""
msgid "When:"
msgstr ""
+msgid "Which API requests are affected?"
+msgstr ""
+
msgid "While it's rare to have no vulnerabilities, it can happen. In any event, we ask that you please double check your settings to make sure you've set up your dashboard correctly."
msgstr ""
@@ -38016,6 +38539,9 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|Work Items"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -38091,6 +38617,9 @@ msgstr ""
msgid "You are already a member of this %{member_source}."
msgstr ""
+msgid "You are already impersonating another user"
+msgstr ""
+
msgid "You are an admin, which means granting access to %{client_name} will allow them to interact with GitLab as an admin as well. Proceed with caution."
msgstr ""
@@ -38193,6 +38722,9 @@ msgstr ""
msgid "You can also use project access tokens with Git to authenticate over HTTP(S). %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "You can always change your URL later"
+msgstr ""
+
msgid "You can always edit this later"
msgstr ""
@@ -38349,10 +38881,10 @@ msgstr ""
msgid "You can’t %{tag_start}edit%{tag_end} files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
-msgid "You could not create a new trigger."
+msgid "You can’t edit files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
-msgid "You didn't renew your subscription for %{strong}%{namespace_name}%{strong_close} so it was downgraded to the free plan."
+msgid "You could not create a new trigger."
msgstr ""
msgid "You do not have any subscriptions yet"
@@ -38520,6 +39052,12 @@ msgstr ""
msgid "You must provide your current password in order to change it."
msgstr ""
+msgid "You must sign in to search for specific projects."
+msgstr ""
+
+msgid "You must sign in to search for specific terms."
+msgstr ""
+
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
@@ -38547,6 +39085,9 @@ msgstr ""
msgid "You need to upload a GitLab project export archive (ending in .gz)."
msgstr ""
+msgid "You need to verify your primary email first before enabling Two-Factor Authentication."
+msgstr ""
+
msgid "You successfully declined the invitation"
msgstr ""
@@ -38655,10 +39196,10 @@ msgstr ""
msgid "Your %{host} account was signed in to from a new location"
msgstr ""
-msgid "Your %{strong}%{plan_name}%{strong_close} subscription for %{strong}%{namespace_name}%{strong_close} will expire on %{strong}%{expires_on}%{strong_close}."
+msgid "Your %{strong}%{plan_name}%{strong_close} subscription expires on %{strong}%{expires_on}%{strong_close}. After that date, you cannot create issues or merge requests, or use many other features."
msgstr ""
-msgid "Your %{strong}%{plan_name}%{strong_close} subscription will expire on %{strong}%{expires_on}%{strong_close}. After that, you will not be able to create issues or merge requests as well as many other features."
+msgid "Your %{strong}%{plan_name}%{strong_close} subscription for %{strong}%{namespace_name}%{strong_close} will expire on %{strong}%{expires_on}%{strong_close}."
msgstr ""
msgid "Your CI/CD configuration syntax is invalid. View Lint tab for more details."
@@ -38682,7 +39223,7 @@ msgstr ""
msgid "Your GPG keys (%{count})"
msgstr ""
-msgid "Your GitLab account has been locked due to an excessive amount of unsuccessful sign in attempts. Your account will automatically unlock in %{duration} or you may click the link below to unlock now."
+msgid "Your GitLab account has been locked due to an excessive number of unsuccessful sign in attempts. You can wait for your account to automatically unlock in %{duration} or you can click the link below to unlock now."
msgstr ""
msgid "Your GitLab account request has been approved!"
@@ -38793,6 +39334,9 @@ msgstr ""
msgid "Your commit email is used for web based operations, such as edits and merges."
msgstr ""
+msgid "Your current password is required to register a two-factor authenticator app."
+msgstr ""
+
msgid "Your dashboard has been copied. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
@@ -38892,6 +39436,9 @@ msgstr ""
msgid "Your project limit is %{limit} projects! Please contact your administrator to increase it"
msgstr ""
+msgid "Your project will be created at:"
+msgstr ""
+
msgid "Your projects"
msgstr ""
@@ -38931,11 +39478,10 @@ msgstr ""
msgid "Your subscription expired!"
msgstr ""
-msgid "Your subscription has been downgraded."
-msgstr ""
-
-msgid "Your subscription will expire in %{remaining_days}."
-msgstr ""
+msgid "Your subscription will expire in %{remaining_days} day."
+msgid_plural "Your subscription will expire in %{remaining_days} days."
+msgstr[0] ""
+msgstr[1] ""
msgid "Your username is %{username}."
msgstr ""
@@ -39142,6 +39688,9 @@ msgstr ""
msgid "cannot merge"
msgstr ""
+msgid "cannot not be used for user namespace"
+msgstr ""
+
msgid "ciReport|%{degradedNum} degraded"
msgstr ""
@@ -39465,6 +40014,9 @@ msgstr ""
msgid "created %{timeAgo}"
msgstr ""
+msgid "created %{timeAgo} by %{author}"
+msgstr ""
+
msgid "created by"
msgstr ""
@@ -39509,9 +40061,6 @@ msgstr ""
msgid "does not have a supported extension. Only %{extension_list} are supported"
msgstr ""
-msgid "domain is not authorized for sign-up."
-msgstr ""
-
msgid "download it"
msgstr ""
@@ -39529,18 +40078,13 @@ msgstr ""
msgid "email '%{email}' is not a verified email."
msgstr ""
-msgid "email does not match the allowed domain of %{email_domains}"
-msgid_plural "email does not match the allowed domains: %{email_domains}"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "enabled"
msgstr ""
msgid "encrypted: needs to be a :required, :optional or :migrating!"
msgstr ""
-msgid "ending with MIME type format is not allowed."
+msgid "ending with a reserved file extension is not allowed."
msgstr ""
msgid "entries cannot be larger than 255 characters"
@@ -39564,6 +40108,9 @@ msgstr ""
msgid "estimateCommand|%{slash_command} overwrites the total estimated time."
msgstr ""
+msgid "example.com"
+msgstr ""
+
msgid "exceeds the limit of %{bytes} bytes"
msgstr ""
@@ -39614,9 +40161,6 @@ msgstr ""
msgid "fork"
msgstr ""
-msgid "fork this project"
-msgstr ""
-
msgid "from"
msgstr ""
@@ -39625,6 +40169,9 @@ msgid_plural "from %d jobs"
msgstr[0] ""
msgstr[1] ""
+msgid "frontmatter"
+msgstr ""
+
msgid "group"
msgstr ""
@@ -39652,6 +40199,9 @@ msgstr ""
msgid "has been completed."
msgstr ""
+msgid "has too deep level of nesting"
+msgstr ""
+
msgid "help"
msgstr ""
@@ -39685,9 +40235,21 @@ msgstr ""
msgid "in"
msgstr ""
+msgid "in Infrastructure :: Kubernetes clusters"
+msgstr ""
+
+msgid "in all GitLab"
+msgstr ""
+
+msgid "in group"
+msgstr ""
+
msgid "in group %{link_to_group}"
msgstr ""
+msgid "in project"
+msgstr ""
+
msgid "in project %{link_to_project}"
msgstr ""
@@ -39729,16 +40291,19 @@ msgstr ""
msgid "is not a valid X509 certificate."
msgstr ""
-msgid "is not allowed since the group is not top-level group."
+msgid "is not allowed for sign-up."
msgstr ""
-msgid "is not allowed. Try again with a different email address, or contact your GitLab admin."
+msgid "is not allowed for this group."
msgstr ""
-msgid "is not allowed. We do not currently support project-level iterations"
+msgid "is not allowed for this project."
+msgstr ""
+
+msgid "is not allowed since the group is not top-level group."
msgstr ""
-msgid "is not from an allowed domain."
+msgid "is not allowed. We do not currently support project-level iterations"
msgstr ""
msgid "is not in the group enforcing Group Managed Account"
@@ -39831,6 +40396,9 @@ msgstr ""
msgid "log in"
msgstr ""
+msgid "managed"
+msgstr ""
+
msgid "manual"
msgstr ""
@@ -39878,6 +40446,9 @@ msgstr ""
msgid "mrWidget| Please restore it or use a different %{missingBranchName} branch"
msgstr ""
+msgid "mrWidget|%{linkStart}Set up now%{linkEnd} to analyze your source code for known security vulnerabilities."
+msgstr ""
+
msgid "mrWidget|%{mergeError}."
msgstr ""
@@ -39958,6 +40529,9 @@ msgid_plural "mrWidget|Closes issues"
msgstr[0] ""
msgstr[1] ""
+msgid "mrWidget|Create issue to resolve all threads"
+msgstr ""
+
msgid "mrWidget|Delete source branch"
msgstr ""
@@ -39967,12 +40541,18 @@ msgstr ""
msgid "mrWidget|Did not close"
msgstr ""
+msgid "mrWidget|Dismiss"
+msgstr ""
+
msgid "mrWidget|Email patches"
msgstr ""
msgid "mrWidget|Failed to load deployment statistics"
msgstr ""
+msgid "mrWidget|Hide %{widget} details"
+msgstr ""
+
msgid "mrWidget|If the %{missingBranchName} branch exists in your local repository, you can merge this merge request manually using the command line"
msgstr ""
@@ -40068,9 +40648,6 @@ msgstr ""
msgid "mrWidget|Request to merge"
msgstr ""
-msgid "mrWidget|Resolve all threads in new issue"
-msgstr ""
-
msgid "mrWidget|Resolve conflicts"
msgstr ""
@@ -40086,6 +40663,9 @@ msgstr ""
msgid "mrWidget|Revoke approval"
msgstr ""
+msgid "mrWidget|SAST and Secret Detection is not enabled."
+msgstr ""
+
msgid "mrWidget|Set by %{merge_author} to be added to the merge train when the pipeline succeeds"
msgstr ""
@@ -40095,6 +40675,9 @@ msgstr ""
msgid "mrWidget|Set by %{merge_author} to start a merge train when the pipeline succeeds"
msgstr ""
+msgid "mrWidget|Show %{widget} details"
+msgstr ""
+
msgid "mrWidget|The changes were merged into"
msgstr ""
@@ -40107,6 +40690,9 @@ msgstr ""
msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure, or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
msgstr ""
+msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure."
+msgstr ""
+
msgid "mrWidget|The source branch has been deleted"
msgstr ""
@@ -40149,6 +40735,9 @@ msgstr ""
msgid "mrWidget|You can merge after removing denied licenses"
msgstr ""
+msgid "mrWidget|You can only merge once this merge request is approved."
+msgstr ""
+
msgid "mrWidget|Your password"
msgstr ""
@@ -40185,6 +40774,9 @@ msgstr ""
msgid "must be less than the limit of %{tag_limit} tags"
msgstr ""
+msgid "must be set for a project namespace"
+msgstr ""
+
msgid "must be unique by status and elapsed time within a policy"
msgstr ""
@@ -40294,6 +40886,9 @@ msgstr ""
msgid "pipeline"
msgstr ""
+msgid "pipeline schedules documentation"
+msgstr ""
+
msgid "pod_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
msgstr ""
@@ -40343,16 +40938,25 @@ msgstr ""
msgid "project name"
msgstr ""
+msgid "project namespace cannot be the parent of another namespace"
+msgstr ""
+
msgid "projects"
msgstr ""
msgid "quick actions"
msgstr ""
-msgid "reCAPTCHA Private Key"
+msgid "reCAPTCHA"
+msgstr ""
+
+msgid "reCAPTCHA helps prevent credential stuffing."
msgstr ""
-msgid "reCAPTCHA Site Key"
+msgid "reCAPTCHA private key"
+msgstr ""
+
+msgid "reCAPTCHA site key"
msgstr ""
msgid "recent activity"
@@ -40579,6 +41183,9 @@ msgstr ""
msgid "user avatar"
msgstr ""
+msgid "user namespace cannot be the parent of another namespace"
+msgstr ""
+
msgid "user preferences"
msgstr ""
@@ -40671,3 +41278,9 @@ msgstr ""
msgid "your settings"
msgstr ""
+msgid "{group}"
+msgstr ""
+
+msgid "{project}"
+msgstr ""
+
diff --git a/locale/tr_TR/gitlab.po b/locale/tr_TR/gitlab.po
index 35e0ffa24d3..154381c7065 100644
--- a/locale/tr_TR/gitlab.po
+++ b/locale/tr_TR/gitlab.po
@@ -14,10 +14,7 @@ msgstr ""
"X-Crowdin-Language: tr\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-09-01 22:33\n"
-
-msgid " %{name}, confirm your email address now! "
-msgstr ""
+"PO-Revision-Date: 2021-10-04 20:21\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -92,6 +89,16 @@ msgstr ""
msgid "#general, #development"
msgstr "#genel, #geliÅŸtirme"
+msgid "%d Alert"
+msgid_plural "%d Alerts"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d Alert:"
+msgid_plural "%d Alerts:"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d Approval"
msgid_plural "%d Approvals"
msgstr[0] "%d Onay"
@@ -455,8 +462,11 @@ msgstr ""
msgid "%{code_open}Protected:%{code_close} Only exposed to protected branches or tags."
msgstr ""
-msgid "%{commit_author_link} authored %{commit_timeago}"
-msgstr "%{commit_author_link} %{commit_timeago} oluÅŸturdu"
+msgid "%{commit_author_link} authored %{commit_authored_timeago}"
+msgstr ""
+
+msgid "%{commit_author_link} authored %{commit_authored_timeago} and %{commit_committer_avatar} %{commit_committer_link} committed %{commit_committer_timeago}"
+msgstr ""
msgid "%{completedCount} completed weight"
msgstr ""
@@ -549,6 +559,15 @@ msgstr ""
msgid "%{doc_link_start}Advanced search%{doc_link_end} is enabled."
msgstr ""
+msgid "%{docs_link_start}Learn about visibility levels.%{docs_link_end}"
+msgstr ""
+
+msgid "%{docs_link_start}What is Large File Storage?%{docs_link_end}"
+msgstr ""
+
+msgid "%{docs_link_start}What is two-factor authentication?%{docs_link_end}"
+msgstr ""
+
msgid "%{due_date} (Past due)"
msgstr ""
@@ -621,9 +640,6 @@ msgstr "%{issuableType} kaldırılacak! Emin misiniz?"
msgid "%{issueType} actions"
msgstr ""
-msgid "%{issuesCount} issues with a limit of %{maxIssueCount}"
-msgstr ""
-
msgid "%{issuesSize} with a limit of %{maxIssueCount}"
msgstr ""
@@ -681,6 +697,12 @@ msgstr ""
msgid "%{label_for_message} unavailable"
msgstr "%{label_for_message} kullanılamaz"
+msgid "%{learn_more_link}."
+msgstr ""
+
+msgid "%{lessThan} 1 hour"
+msgstr ""
+
msgid "%{lets_encrypt_link_start}Let's Encrypt%{lets_encrypt_link_end} is a free, automated, and open certificate authority (CA) that issues digital certificates to enable HTTPS (SSL/TLS) for sites."
msgstr ""
@@ -693,15 +715,15 @@ msgstr ""
msgid "%{link_start}Learn more%{link_end} about roles."
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
-msgstr "GitLab Inc. ile hangi bilgilerin paylaşıldığı hakkında %{link_start}daha fazla bilgi edinin%{link_end}."
-
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
msgstr ""
msgid "%{link_start}Start the title with %{draft_snippet}%{link_end} to prevent a merge request that is a work in progress from being merged before it's ready."
msgstr ""
+msgid "%{link_start}What information does GitLab Inc. collect?%{link_end}"
+msgstr ""
+
msgid "%{listToShow}, and %{awardsListLength} more"
msgstr ""
@@ -854,7 +876,7 @@ msgid_plural "%{securityScanner} results are not available because a pipeline ha
msgstr[0] ""
msgstr[1] ""
-msgid "%{service_ping_link_start}Learn more%{service_ping_link_end} about what information is shared with GitLab Inc."
+msgid "%{service_ping_link_start}What information is shared with GitLab Inc.?%{service_ping_link_end}"
msgstr ""
msgid "%{size} %{unit}"
@@ -888,7 +910,10 @@ msgid "%{start} to %{end}"
msgstr "%{start} - %{end}"
msgid "%{state} epics"
-msgstr "%{state} epik"
+msgstr ""
+
+msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
+msgstr ""
msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
msgstr ""
@@ -949,11 +974,6 @@ msgstr "%{tag}-%{evidence}-%{filename}"
msgid "%{template_project_id} is unknown or invalid"
msgstr "%{template_project_id} bilinmiyor ya da geçersiz"
-msgid "%{text} %{files}"
-msgid_plural "%{text} %{files} files"
-msgstr[0] "%{text} %{files}"
-msgstr[1] "%{text} %{files} dosyaları"
-
msgid "%{text} is available"
msgstr "%{text} kullanılabilir"
@@ -1038,9 +1058,6 @@ msgstr ""
msgid "%{wildcards_link_start}Wildcards%{wildcards_link_end} such as %{code_tag_start}v*%{code_tag_end} or %{code_tag_start}*-release%{code_tag_end} are supported."
msgstr ""
-msgid "&lt; 1 hour"
-msgstr "&lt; 1 saat"
-
msgid "'%{data}' at %{location} does not match format: %{format}"
msgstr ""
@@ -1124,9 +1141,6 @@ msgstr "(iptal edildi)"
msgid "(we need your current password to confirm your changes)"
msgstr ""
-msgid "* * * * *"
-msgstr "* * * * *"
-
msgid "+ %{amount} more"
msgstr "%{amount} tane daha"
@@ -1193,12 +1207,12 @@ msgstr "- daha az göster"
msgid "."
msgstr ""
+msgid "/"
+msgstr ""
+
msgid "0 bytes"
msgstr "0 bayt"
-msgid "0 for unlimited, only effective with remote storage enabled."
-msgstr ""
-
msgid "0t1DgySidms"
msgstr ""
@@ -1326,6 +1340,9 @@ msgstr "10-19 katkı"
msgid "1000+"
msgstr "1000+"
+msgid "192.168.0.0/24"
+msgstr ""
+
msgid "1st contribution!"
msgstr "İlk katkı!"
@@ -1366,7 +1383,7 @@ msgid "404|Page Not Found"
msgstr "Sayfa Bulunamadı"
msgid "404|Please contact your GitLab administrator if you think this is a mistake."
-msgstr "Lütfen bunun bir hata olduğunu düşünüyorsanız, GitLab yöneticinizle görüşün."
+msgstr ""
msgid "7 days"
msgstr "7 gün"
@@ -1479,9 +1496,6 @@ msgstr ""
msgid "A plain HTML site that uses Netlify for CI/CD instead of GitLab, but still with all the other great GitLab features"
msgstr ""
-msgid "A plain-text response to show to clients that hit the rate limit."
-msgstr ""
-
msgid "A platform value can be web, mob or app."
msgstr "Bir platform deÄŸeri web, mobil veya uygulama olabilir."
@@ -1563,7 +1577,7 @@ msgstr ""
msgid "APIFuzzing|Configure HTTP basic authentication values. Other authentication methods are supported. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
+msgid "APIFuzzing|Customize your project's API fuzzing configuration options and copy the code snippet to your .gitlab-ci.yml file to apply any changes. Note that this tool does not reflect or update your .gitlab-ci.yml file automatically. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
msgstr ""
msgid "APIFuzzing|Enable authentication"
@@ -1626,9 +1640,6 @@ msgstr ""
msgid "APIFuzzing|To prevent a security leak, authentication info must be added as a %{ciVariablesLinkStart}CI variable%{ciVariablesLinkEnd}. As a user with maintainer access rights, you can manage CI variables in the %{ciSettingsLinkStart}Settings%{ciSettingsLinkEnd} area."
msgstr ""
-msgid "APIFuzzing|Use this tool to generate API fuzzing configuration YAML to copy into your .gitlab-ci.yml file. This tool does not reflect or update your .gitlab-ci.yml file automatically."
-msgstr ""
-
msgid "APIFuzzing|Username for basic authentication"
msgstr ""
@@ -1680,9 +1691,6 @@ msgstr "Kötüye kullanım raporları"
msgid "Abuse reports notification email"
msgstr ""
-msgid "Abuse reports will be sent to this address if it is set. Abuse reports are always available in the admin area."
-msgstr ""
-
msgid "Accept invitation"
msgstr "Daveti kabul et"
@@ -1719,12 +1727,18 @@ msgstr "Erişim yasaklandı. Erişim seviyenizi kontrol edin."
msgid "Access granted"
msgstr "Erişim onaylandı"
+msgid "Access key ID"
+msgstr ""
+
msgid "Access requests"
msgstr "EriÅŸim istekleri"
msgid "Access to '%{classification_label}' not allowed"
msgstr "'%{classification_label}' eriÅŸimine izin verilmedi"
+msgid "Access tokens expire after 2 hours. A refresh token may be used at any time to generate a new access token. Non-expiring access tokens are deprecated. Clear this setting to enable backward compatibility."
+msgstr ""
+
msgid "AccessDropdown|Deploy Keys"
msgstr "Dağıtım Anahtarları"
@@ -1846,7 +1860,7 @@ msgid "Active Sessions"
msgstr "Etkin Oturumlar"
msgid "Activity"
-msgstr "Etkinlik"
+msgstr ""
msgid "Activity|An error occured while retrieving activity. Reload the page to try again."
msgstr ""
@@ -2037,6 +2051,9 @@ msgstr "Yeni uygulama ekle"
msgid "Add new directory"
msgstr "Yeni dizin ekle"
+msgid "Add new service account"
+msgstr ""
+
msgid "Add or remove previously merged commits"
msgstr ""
@@ -2274,6 +2291,9 @@ msgstr "GeliÅŸtirici"
msgid "AdminArea|Features"
msgstr "Özellikler"
+msgid "AdminArea|Get security updates from GitLab and stay up to date"
+msgstr ""
+
msgid "AdminArea|Groups"
msgstr "Gruplar"
@@ -2313,6 +2333,12 @@ msgstr "Projeler"
msgid "AdminArea|Reporter"
msgstr "Raporlayıcı"
+msgid "AdminArea|Sign up for the GitLab Security Newsletter to get notified for security updates."
+msgstr ""
+
+msgid "AdminArea|Sign up for the GitLab newsletter"
+msgstr ""
+
msgid "AdminArea|Stop all jobs"
msgstr "Tüm işleri durdur"
@@ -2382,9 +2408,15 @@ msgstr ""
msgid "AdminSettings|Disable public access to Pages sites"
msgstr ""
+msgid "AdminSettings|Display a banner on merge requests in projects with no pipelines to initiate steps to add a .gitlab-ci.yml file."
+msgstr ""
+
msgid "AdminSettings|Domain verification is an essential security measure for public GitLab sites. Users are required to demonstrate they control a domain before it is enabled. %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "AdminSettings|Enable pipeline suggestion banner"
+msgstr ""
+
msgid "AdminSettings|Enable shared runners for new projects"
msgstr "Yeni projeler için paylaşılan çalıştırıcıları etkinleştir"
@@ -2856,10 +2888,10 @@ msgstr ""
msgid "Admin|Quarterly reconciliation will occur on %{qrtlyDate}"
msgstr ""
-msgid "Admin|The number of max seats used for your namespace is currently exceeding the number of seats in your subscription. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgid "Admin|The number of max seats in your namespace exceeds the number of seats in your subscription. On %{qrtlyDate}, quarterly reconciliation occurs and you are automatically billed a prorated amount for the overage. No action is needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice. For more information about the timing of the invoicing process, view the documentation."
msgstr ""
-msgid "Admin|The number of maximum users for your instance is currently exceeding the number of users in license. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgid "Admin|The number of max users in your instance exceeds the number of users in your license. On %{qrtlyDate}, quarterly reconciliation occurs and you are automatically billed a prorated amount for the overage. No action is needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice. For more information about the timing of the invoicing process, view the documentation."
msgstr ""
msgid "Admin|View pending user approvals"
@@ -2880,9 +2912,6 @@ msgstr "GeliÅŸmiÅŸ Ayarlar"
msgid "Advanced export options"
msgstr ""
-msgid "Advanced permissions, Large File Storage and Two-Factor authentication settings."
-msgstr "Gelişmiş izinler, Büyük Dosya Depolama ve İki Adımlı Kimlik Doğrulama ayarları."
-
msgid "After a successful password update you will be redirected to login screen."
msgstr "Başarılı bir şifre güncellemesinden sonra giriş ekranına yönlendirileceksiniz."
@@ -2901,13 +2930,14 @@ msgstr ""
msgid "After you've reviewed these contribution guidelines, you'll be all set to"
msgstr ""
+msgid "Akismet"
+msgstr ""
+
msgid "Akismet API Key"
msgstr ""
-msgid "Alert"
-msgid_plural "Alerts"
-msgstr[0] "Uyarı"
-msgstr[1] "Uyarı"
+msgid "Akismet helps prevent the creation of spam issues in public projects."
+msgstr ""
msgid "AlertManagement|Acknowledged"
msgstr ""
@@ -3263,6 +3293,9 @@ msgstr "Tüm %{replicableType}, %{action} için planlanıyor"
msgid "All (default)"
msgstr "Tümü (varsayılan)"
+msgid "All GitLab"
+msgstr ""
+
msgid "All Members"
msgstr "Tüm Kullanıcılar"
@@ -3377,6 +3410,9 @@ msgstr ""
msgid "Allow this secondary node to replicate content on Object Storage"
msgstr ""
+msgid "Allow use of licensed EE features"
+msgstr ""
+
msgid "Allow users to dismiss the broadcast message"
msgstr "Kullanıcıların yayın mesajını kapatmalarına izin ver"
@@ -3452,9 +3488,6 @@ msgstr ""
msgid "Amazon authentication is not %{link_start}correctly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
-msgid "Amount of time (in hours) that users are allowed to skip forced configuration of two-factor authentication"
-msgstr ""
-
msgid "An %{link_start}alert%{link_end} with the same fingerprint is already open. To change the status of this alert, resolve the linked alert."
msgstr ""
@@ -3515,12 +3548,6 @@ msgstr "Blob datanın öngösteriminde, bir hata meydana geldi"
msgid "An error occurred when removing the label."
msgstr ""
-msgid "An error occurred when toggling the notification subscription"
-msgstr "Bildirim aboneliÄŸini deÄŸiÅŸtirirken bir sorun meydana geldi"
-
-msgid "An error occurred when updating the issue weight"
-msgstr "Sorun ağırlığı güncellenirken bir hata oluştu"
-
msgid "An error occurred when updating the title"
msgstr ""
@@ -3569,6 +3596,9 @@ msgstr ""
msgid "An error occurred while enabling Service Desk."
msgstr "Servis Masası etkinleştirilirken bir hata oluştu."
+msgid "An error occurred while fetching Markdown preview"
+msgstr ""
+
msgid "An error occurred while fetching ancestors"
msgstr ""
@@ -3599,9 +3629,6 @@ msgstr "Sorunlar alınırken bir hata oluştu."
msgid "An error occurred while fetching label colors."
msgstr "Etiket renkleri alınırken bir hata oluştu."
-msgid "An error occurred while fetching markdown preview"
-msgstr "Markdown ön izlemesi yüklenirken hata oluştu"
-
msgid "An error occurred while fetching participants"
msgstr ""
@@ -3617,9 +3644,6 @@ msgstr ""
msgid "An error occurred while fetching reference"
msgstr ""
-msgid "An error occurred while fetching sidebar data"
-msgstr "Kenar çubuğu verileri getirilirken bir hata oluştu"
-
msgid "An error occurred while fetching tags. Retry the search."
msgstr ""
@@ -3695,6 +3719,9 @@ msgstr "Sorunlar yüklenirken bir sorun oluştu"
msgid "An error occurred while loading merge requests."
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 Needs tab."
msgstr ""
@@ -3756,7 +3783,7 @@ msgid "An error occurred while parsing the file."
msgstr "Dosyayı ayrıştırırken bir hata oluştu."
msgid "An error occurred while removing epics."
-msgstr "Epikler kaldırılırken bir hata oluştu."
+msgstr ""
msgid "An error occurred while removing issues."
msgstr "Sorunlar kaldırılırken bir hata oluştu."
@@ -3929,12 +3956,6 @@ msgstr "Herhangi yazar"
msgid "Any Milestone"
msgstr ""
-msgid "Any branch"
-msgstr "Herhangi dal"
-
-msgid "Any eligible user"
-msgstr "Herhangi bir uygun kullanıcı"
-
msgid "Any encrypted tokens"
msgstr "Herhangi şifreli erişim anahtarları"
@@ -3953,6 +3974,9 @@ msgstr "Herhangi bir dönüm noktası"
msgid "Any namespace"
msgstr "Herhangi isim alanı"
+msgid "App Engine description and apps that are suitable for this deployment target"
+msgstr ""
+
msgid "App ID"
msgstr "Uygulama KimliÄŸi"
@@ -4101,6 +4125,11 @@ msgstr "Uygulandı"
msgid "Apply"
msgstr "Uygula"
+msgid "Apply %d suggestion"
+msgid_plural "Apply %d suggestions"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Apply a label"
msgstr "Etiket uygula"
@@ -4110,13 +4139,10 @@ msgstr "Bir ÅŸablon uygula"
msgid "Apply suggestion"
msgstr "Öneriyi uygula"
-msgid "Apply suggestions"
-msgstr "Önerileri uygula"
-
msgid "Apply template"
msgstr "Åžablonu uygula"
-msgid "Apply this approval rule to any branch or a specific protected branch."
+msgid "Apply this approval rule to all branches or a specific protected branch."
msgstr ""
msgid "Applying"
@@ -4259,9 +4285,6 @@ msgstr ""
msgid "ApprovalSettings|Prevent editing approval rules in projects and merge requests."
msgstr ""
-msgid "ApprovalSettings|Prevent editing approval rules in projects and merge requests. "
-msgstr ""
-
msgid "ApprovalSettings|Remove all approvals when commits are added to the source branch."
msgstr ""
@@ -4277,6 +4300,9 @@ msgstr ""
msgid "ApprovalSettings|This setting is configured at the instance level and can only be changed by an administrator."
msgstr ""
+msgid "ApprovalSettings|This setting is configured in %{groupName} and can only be changed by an administrator or group owner."
+msgstr ""
+
msgid "ApprovalStatusTooltip|Adheres to separation of duties"
msgstr ""
@@ -4763,9 +4789,6 @@ msgstr "GitHub ile Kimlik Doğrulaması"
msgid "Authenticated API rate limit period in seconds"
msgstr ""
-msgid "Authenticated API request rate limit"
-msgstr ""
-
msgid "Authenticated API requests"
msgstr ""
@@ -4775,10 +4798,10 @@ msgstr ""
msgid "Authenticated Git LFS request rate limit"
msgstr ""
-msgid "Authenticated web rate limit period in seconds"
+msgid "Authenticated Git LFS requests"
msgstr ""
-msgid "Authenticated web request rate limit"
+msgid "Authenticated web rate limit period in seconds"
msgstr ""
msgid "Authenticated web requests"
@@ -5156,9 +5179,6 @@ msgstr ""
msgid "Below you will find all the groups that are public."
msgstr ""
-msgid "Beta"
-msgstr ""
-
msgid "Bi-weekly code coverage"
msgstr ""
@@ -5398,6 +5418,21 @@ msgstr "Blog"
msgid "Board scope affects which issues are displayed for anyone who visits this board"
msgstr "Pano kapsamı, bu panoyu ziyaret eden kişilere hangi sorunların gösterileceğini belirler"
+msgid "BoardNewEpic|Groups"
+msgstr ""
+
+msgid "BoardNewEpic|Loading groups"
+msgstr ""
+
+msgid "BoardNewEpic|No matching results"
+msgstr ""
+
+msgid "BoardNewEpic|Search groups"
+msgstr ""
+
+msgid "BoardNewEpic|Select a group"
+msgstr ""
+
msgid "BoardNewIssue|No matching results"
msgstr ""
@@ -5475,6 +5510,9 @@ msgstr ""
msgid "Boards|An error occurred while creating the list. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching child groups. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching group projects. Please try again."
msgstr ""
@@ -5807,6 +5845,9 @@ msgstr ""
msgid "Bulk update"
msgstr ""
+msgid "BulkImports|Re-import creates a new group. It does not sync with the existing group."
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -5816,6 +5857,9 @@ msgstr "Kaynak gruba göre filtrele"
msgid "BulkImport|From source group"
msgstr ""
+msgid "BulkImport|Group import history"
+msgstr ""
+
msgid "BulkImport|Import failed: Destination cannot be a subgroup of the source group. Change the destination and try again."
msgstr ""
@@ -5828,9 +5872,18 @@ msgstr ""
msgid "BulkImport|Importing the group failed"
msgstr ""
+msgid "BulkImport|Last imported to %{link}"
+msgstr ""
+
msgid "BulkImport|Name already exists."
msgstr ""
+msgid "BulkImport|New group"
+msgstr ""
+
+msgid "BulkImport|No history is available"
+msgstr ""
+
msgid "BulkImport|No parent"
msgstr ""
@@ -5843,6 +5896,9 @@ msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} matching filter \"%{filter}\" from %{link}"
msgstr ""
+msgid "BulkImport|Source group"
+msgstr ""
+
msgid "BulkImport|To new group"
msgstr ""
@@ -5852,6 +5908,9 @@ msgstr ""
msgid "BulkImport|You have no groups to import"
msgstr ""
+msgid "BulkImport|Your imported groups will appear here."
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -6094,6 +6153,9 @@ msgstr ""
msgid "Can be manually deployed to"
msgstr ""
+msgid "Can be overridden in each project."
+msgstr ""
+
msgid "Can create groups:"
msgstr ""
@@ -6196,6 +6258,9 @@ msgstr ""
msgid "Cancelling Preview"
msgstr ""
+msgid "Cannot assign a confidential epic to a non-confidential issue. Make the issue confidential and try again"
+msgstr ""
+
msgid "Cannot be assigned to other projects."
msgstr ""
@@ -6247,9 +6312,6 @@ msgstr ""
msgid "Cannot refer to a group %{timebox_type} by an internal id!"
msgstr ""
-msgid "Cannot set confidential epic for a non-confidential issue"
-msgstr "Gizli olmayan bir sorun için gizli epik ayarlanamaz"
-
msgid "Cannot show preview. For previews on sketch files, they must have the file format introduced by Sketch version 43 and above."
msgstr ""
@@ -6487,15 +6549,15 @@ msgstr ""
msgid "Check out, review, and merge locally"
msgstr ""
-msgid "Check the %{docs_link_start}documentation%{docs_link_end}."
-msgstr ""
-
msgid "Check the current instance configuration "
msgstr ""
msgid "Check the elasticsearch.log file to debug why the migration was halted and make any changes before retrying the migration. When you fix the cause of the failure, click \"Retry migration\", and the migration will be scheduled to be retried in the background."
msgstr ""
+msgid "Check with your administrator."
+msgstr ""
+
msgid "Check your Docker images for known vulnerabilities."
msgstr ""
@@ -6526,6 +6588,9 @@ msgstr "Kullanıcı adının geçerliliği denetleniyor..."
msgid "Checkout"
msgstr "Ödeme"
+msgid "Checkout|$%{selectedPlanPrice} per 10 GB storage per pack"
+msgstr ""
+
msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 minutes"
msgstr ""
@@ -6546,17 +6611,23 @@ msgstr ""
msgid "Checkout|%{name}'s GitLab subscription"
msgstr ""
+msgid "Checkout|%{name}'s storage subscription"
+msgstr ""
+
+msgid "Checkout|%{quantity} GB of storage"
+msgstr ""
+
+msgid "Checkout|%{quantity} storage pack"
+msgid_plural "Checkout|%{quantity} storage packs"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Checkout|%{selectedPlanText} plan"
msgstr "%{selectedPlanText} planı"
msgid "Checkout|%{startDate} - %{endDate}"
msgstr "%{startDate} - %{endDate}"
-msgid "Checkout|%{totalCiMinutes} CI minute"
-msgid_plural "Checkout|%{totalCiMinutes} CI minutes"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "Checkout|%{totalCiMinutes} CI minutes"
msgstr ""
@@ -6632,6 +6703,9 @@ msgstr ""
msgid "Checkout|Failed to register credit card. Please try again."
msgstr "Kredi kartı kaydedilemedi. Lütfen tekrar deneyin."
+msgid "Checkout|GB"
+msgstr ""
+
msgid "Checkout|GitLab group"
msgstr "GitLab grubu"
@@ -6668,6 +6742,9 @@ msgstr ""
msgid "Checkout|State"
msgstr ""
+msgid "Checkout|Storage packs"
+msgstr ""
+
msgid "Checkout|Street address"
msgstr ""
@@ -6689,6 +6766,9 @@ msgstr ""
msgid "Checkout|Total minutes: %{quantity}"
msgstr ""
+msgid "Checkout|Total storage: %{quantity} GB"
+msgstr ""
+
msgid "Checkout|Users"
msgstr ""
@@ -6698,16 +6778,25 @@ msgstr ""
msgid "Checkout|Your organization"
msgstr "KuruluÅŸunuz"
+msgid "Checkout|Your storage subscription has the same term as your main subscription, and the price is prorated accordingly."
+msgstr ""
+
msgid "Checkout|Your subscription will be applied to this group"
msgstr ""
msgid "Checkout|Zip code"
msgstr ""
+msgid "Checkout|a storage subscription"
+msgstr ""
+
msgid "Checkout|company or team"
msgstr "ÅŸirket veya ekip"
-msgid "Checkout|x 1,000 minutes per pack = %{strong}"
+msgid "Checkout|minutes"
+msgstr ""
+
+msgid "Checkout|x %{quantity} %{units} per pack ="
msgstr ""
msgid "Cherry-pick this commit"
@@ -7064,6 +7153,9 @@ msgstr ""
msgid "CloneIssue|Cannot clone issue to target project as it is pending deletion."
msgstr ""
+msgid "CloneIssue|Cannot clone issues of '%{issue_type}' type."
+msgstr ""
+
msgid "Cloned this issue to %{path_to_project}."
msgstr ""
@@ -7118,7 +7210,10 @@ msgstr ""
msgid "Closes this %{quick_action_target}."
msgstr "%{quick_action_target} bunu kapatır."
-msgid "Cloud licenses can not be removed."
+msgid "Cloud Functions description and apps that are suitable for this deployment target"
+msgstr ""
+
+msgid "Cloud Run description and apps that are suitable for this deployment target"
msgstr ""
msgid "Cluster"
@@ -7145,6 +7240,12 @@ msgstr ""
msgid "ClusterAgents|Access tokens"
msgstr ""
+msgid "ClusterAgents|Agent might not be connected to GitLab"
+msgstr ""
+
+msgid "ClusterAgents|Agent never connected to GitLab"
+msgstr ""
+
msgid "ClusterAgents|Alternative installation methods"
msgstr ""
@@ -7160,6 +7261,12 @@ msgstr ""
msgid "ClusterAgents|Configuration"
msgstr ""
+msgid "ClusterAgents|Connected"
+msgstr ""
+
+msgid "ClusterAgents|Connection status"
+msgstr ""
+
msgid "ClusterAgents|Copy token"
msgstr ""
@@ -7178,6 +7285,9 @@ msgstr ""
msgid "ClusterAgents|For alternative installation methods %{linkStart}go to the documentation%{linkEnd}."
msgstr ""
+msgid "ClusterAgents|For more troubleshooting information go to"
+msgstr ""
+
msgid "ClusterAgents|Go to the repository"
msgstr ""
@@ -7193,18 +7303,30 @@ msgstr ""
msgid "ClusterAgents|Integrate with the GitLab Agent"
msgstr ""
-msgid "ClusterAgents|Last used"
+msgid "ClusterAgents|Last connected %{timeAgo}."
+msgstr ""
+
+msgid "ClusterAgents|Last contact"
msgstr ""
msgid "ClusterAgents|Learn how to create an agent access token"
msgstr ""
+msgid "ClusterAgents|Make sure you are using a valid token."
+msgstr ""
+
msgid "ClusterAgents|Name"
msgstr ""
msgid "ClusterAgents|Never"
msgstr ""
+msgid "ClusterAgents|Never connected"
+msgstr ""
+
+msgid "ClusterAgents|Not connected"
+msgstr ""
+
msgid "ClusterAgents|Read more about getting started"
msgstr ""
@@ -7226,6 +7348,9 @@ msgstr ""
msgid "ClusterAgents|Select which Agent you want to install"
msgstr ""
+msgid "ClusterAgents|The Agent has not been connected in a long time. There might be a connectivity issue. Last contact was %{timeAgo}."
+msgstr ""
+
msgid "ClusterAgents|The GitLab Agent also requires %{linkStart}enabling the Agent Server%{linkEnd}"
msgstr ""
@@ -7253,9 +7378,6 @@ msgstr ""
msgid "ClusterAgents|You will need to create a token to connect to your agent"
msgstr ""
-msgid "ClusterAgent|This feature is only available for premium plans"
-msgstr ""
-
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -7445,9 +7567,6 @@ msgstr ""
msgid "ClusterIntegration|Create Kubernetes cluster"
msgstr "Kubernetes kümesi oluştur"
-msgid "ClusterIntegration|Create a provision role on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the account and external ID above. %{startMoreInfoLink}More information%{endLink}"
-msgstr ""
-
msgid "ClusterIntegration|Create cluster on"
msgstr ""
@@ -7880,7 +7999,7 @@ msgstr ""
msgid "ClusterIntegration|Subnets"
msgstr ""
-msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provisioned role, first create one on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the above account and external IDs. %{startMoreInfoLink}More information%{endLink}"
+msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provisioned role, first create one on %{awsLinkStart}Amazon Web Services %{awsLinkEnd} using the above account and external IDs. %{moreInfoStart}More information%{moreInfoEnd}"
msgstr ""
msgid "ClusterIntegration|The Kubernetes certificate used to authenticate to the cluster."
@@ -8114,6 +8233,9 @@ msgstr ""
msgid "Collapse replies"
msgstr ""
+msgid "Collapse settings section"
+msgstr ""
+
msgid "Collapse sidebar"
msgstr "Kenar çubuğunu daralt"
@@ -8132,6 +8254,9 @@ msgstr ""
msgid "Comma-separated list of email addresses."
msgstr ""
+msgid "Comma-separated list of users allowed to exceed the rate limit."
+msgstr ""
+
msgid "Comma-separated, e.g. '1.1.1.1, 2.2.2.0/24'"
msgstr "Virgülle ayrılmış, örneğin '1.1.1.1, 2.2.2.0/24'"
@@ -8452,6 +8577,9 @@ msgstr ""
msgid "Configure %{repository_checks_link_start}repository checks%{link_end} and %{housekeeping_link_start}housekeeping%{link_end} on repositories."
msgstr ""
+msgid "Configure CAPTCHAs, IP address limits, and other anti-spam measures."
+msgstr ""
+
msgid "Configure Dependency Scanning in `.gitlab-ci.yml` using the GitLab managed template. You can [add variable overrides](https://docs.gitlab.com/ee/user/application_security/dependency_scanning/#customizing-the-dependency-scanning-settings) to customize Dependency Scanning settings."
msgstr ""
@@ -8488,16 +8616,13 @@ msgstr ""
msgid "Configure a %{codeStart}.gitlab-webide.yml%{codeEnd} file in the %{codeStart}.gitlab%{codeEnd} directory to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
msgstr ""
-msgid "Configure existing installation"
-msgstr ""
-
-msgid "Configure limit for notes created per minute by web and API requests."
+msgid "Configure advanced permissions, Large File Storage, and two-factor authentication settings."
msgstr ""
-msgid "Configure limits for Project/Group Import/Export."
+msgid "Configure approvals by authors and committers on all projects."
msgstr ""
-msgid "Configure limits for web and API requests."
+msgid "Configure existing installation"
msgstr ""
msgid "Configure paths to be protected by Rack Attack."
@@ -8512,10 +8637,13 @@ msgstr ""
msgid "Configure settings for Advanced Search with Elasticsearch."
msgstr ""
+msgid "Configure specific limits for Files API requests that supersede the general user and IP rate limits."
+msgstr ""
+
msgid "Configure specific limits for Git LFS requests that supersede the general user and IP rate limits."
msgstr ""
-msgid "Configure specific limits for Packages API requests that supersede the general user and IP rate limits."
+msgid "Configure specific limits for deprecated API requests that supersede the general user and IP rate limits."
msgstr ""
msgid "Configure the %{link} integration."
@@ -8527,6 +8655,9 @@ msgstr ""
msgid "Configure the way a user creates a new account."
msgstr ""
+msgid "Configure via Merge Request"
+msgstr ""
+
msgid "Configure which lists are shown for anyone who visits this board"
msgstr ""
@@ -8995,6 +9126,9 @@ msgstr ""
msgid "Content parsed with %{link}."
msgstr ""
+msgid "ContentEditor|Table of Contents"
+msgstr ""
+
msgid "ContentEditor|You have to provide a renderMarkdown function or a custom serializer"
msgstr ""
@@ -9181,6 +9315,9 @@ msgstr "Bağlantıyı kopyala"
msgid "Copy link to chart"
msgstr "Bağlantıyı grafiğe kopyala"
+msgid "Copy prefix"
+msgstr ""
+
msgid "Copy reference"
msgstr "Referansı kopyala"
@@ -9211,6 +9348,9 @@ msgstr ""
msgid "Copy value"
msgstr "DeÄŸeri kopyala"
+msgid "Corpus Management"
+msgstr ""
+
msgid "Corpus Management|Are you sure you want to delete the corpus?"
msgstr ""
@@ -9439,6 +9579,9 @@ msgstr "Dal oluÅŸtur"
msgid "Create commit"
msgstr "Ä°ÅŸlem oluÅŸtur"
+msgid "Create common files more quickly, and standardize their format."
+msgstr ""
+
msgid "Create confidential merge request"
msgstr ""
@@ -9472,6 +9615,9 @@ msgstr ""
msgid "Create issue"
msgstr "Sorun kaydı oluştur"
+msgid "Create issue to resolve all threads"
+msgstr ""
+
msgid "Create iteration"
msgstr ""
@@ -9526,6 +9672,9 @@ msgstr "Yeni proje oluÅŸtur"
msgid "Create new..."
msgstr "Yeni oluÅŸtur..."
+msgid "Create or import your first project"
+msgstr ""
+
msgid "Create project"
msgstr "Proje oluÅŸtur"
@@ -9883,7 +10032,7 @@ msgstr ""
msgid "Custom notification events"
msgstr "Özel bildirim etkinlikleri"
-msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notificationLinkStart} notification emails%{notificationLinkEnd}."
+msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notificationLinkStart}notification emails%{notificationLinkEnd}."
msgstr ""
msgid "Custom project templates"
@@ -10082,10 +10231,10 @@ msgid_plural "CycleAnalytics|Showing %{subjectFilterText} and %{selectedLabelsCo
msgstr[0] ""
msgstr[1] ""
-msgid "CycleAnalytics|Showing data for group '%{groupName}' and %{selectedProjectCount} projects from %{startDate} to %{endDate}"
+msgid "CycleAnalytics|Showing data for group '%{groupName}' and %{selectedProjectCount} projects from %{createdAfter} to %{createdBefore}"
msgstr ""
-msgid "CycleAnalytics|Showing data for group '%{groupName}' from %{startDate} to %{endDate}"
+msgid "CycleAnalytics|Showing data for group '%{groupName}' from %{createdAfter} to %{createdBefore}"
msgstr ""
msgid "CycleAnalytics|Stages"
@@ -10319,6 +10468,9 @@ msgstr ""
msgid "DastProfiles|Manage profiles"
msgstr "Profilleri yönet"
+msgid "DastProfiles|Manage site profiles"
+msgstr ""
+
msgid "DastProfiles|Minimum = 0 (no timeout enabled), Maximum = 2880 minutes"
msgstr ""
@@ -10394,6 +10546,9 @@ msgstr ""
msgid "DastProfiles|Scanner name"
msgstr ""
+msgid "DastProfiles|Schedule"
+msgstr ""
+
msgid "DastProfiles|Select branch"
msgstr ""
@@ -10463,7 +10618,7 @@ msgstr ""
msgid "DastProfiles|Website"
msgstr ""
-msgid "DastProfiles|You can either choose a passive scan or validate the target site in your chosen site profile. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
+msgid "DastProfiles|You can either choose a passive scan or validate the target site from the site profile management page. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
msgstr ""
msgid "DastProfiles|You cannot run an active scan against an unvalidated site."
@@ -10636,7 +10791,7 @@ msgstr ""
msgid "Days to merge"
msgstr ""
-msgid "Deactivate dormant users after 90 days of inactivity. Users can return to active status by signing in to their account. While inactive, a user is not counted as an active user in the instance."
+msgid "Deactivate dormant users after 90 days of inactivity"
msgstr ""
msgid "Dear Administrator,"
@@ -10723,10 +10878,10 @@ msgstr ""
msgid "Define a custom pattern with cron syntax"
msgstr ""
-msgid "Define approval settings."
+msgid "Define approval rules."
msgstr ""
-msgid "Define approval settings. %{linkStart}Learn more.%{linkEnd}"
+msgid "Define approval rules. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "Define custom rules for what constitutes spam, independent of Akismet"
@@ -10735,7 +10890,7 @@ msgstr ""
msgid "Define environments in the deploy stage(s) in %{code_open}.gitlab-ci.yml%{code_close} to track deployments here."
msgstr ""
-msgid "Define how approval rules are applied as a merge request moves toward completion."
+msgid "Define how approval rules are applied to merge requests."
msgstr ""
msgid "Definition"
@@ -10750,6 +10905,12 @@ msgstr ""
msgid "DelayedJobs|Are you sure you want to run %{job_name} immediately? This job will run automatically after it's timer finishes."
msgstr ""
+msgid "DelayedJobs|Are you sure you want to run %{job_name} immediately? This job will run automatically after its timer finishes."
+msgstr ""
+
+msgid "DelayedJobs|Run the delayed job now?"
+msgstr ""
+
msgid "DelayedJobs|Start now"
msgstr "Åžimdi baÅŸla"
@@ -11026,6 +11187,12 @@ msgstr ""
msgid "Dependency proxy image prefix"
msgstr ""
+msgid "DependencyProxy|Create a local proxy for storing frequently used upstream images. %{docLinkStart}Learn more%{docLinkEnd} about dependency proxies."
+msgstr ""
+
+msgid "DependencyProxy|Dependency Proxy"
+msgstr ""
+
msgid "DependencyProxy|Toggle Dependency Proxy"
msgstr "Bağımlılık vekil sunucusunu aç/kapat"
@@ -11266,6 +11433,9 @@ msgstr ""
msgid "Deployments"
msgstr ""
+msgid "Deployments to Google Kubernetes Engine can be "
+msgstr ""
+
msgid "Deployments|%{deployments} environment impacted."
msgid_plural "Deployments|%{deployments} environments impacted."
msgstr[0] ""
@@ -11295,6 +11465,9 @@ msgstr ""
msgid "Deployment|success"
msgstr "başarılı"
+msgid "Deprecated API rate limits"
+msgstr ""
+
msgid "Deprioritize label"
msgstr "Etiket önceliğini azalt"
@@ -11697,6 +11870,16 @@ msgstr ""
msgid "DiffsCompareBaseBranch|(base)"
msgstr ""
+msgid "Diffs|%d addition"
+msgid_plural "Diffs|%d additions"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Diffs|%d deletion"
+msgid_plural "Diffs|%d deletions"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Diffs|No file name available"
msgstr "Kullanılabilir dosya adı yok"
@@ -11706,9 +11889,17 @@ msgstr ""
msgid "Diffs|Show all unchanged lines"
msgstr ""
+msgid "Diffs|Showing %{dropdownStart}%{count} changed file%{dropdownEnd}"
+msgid_plural "Diffs|Showing %{dropdownStart}%{count} changed files%{dropdownEnd}"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Diffs|Something went wrong while fetching diff lines."
msgstr "Değişiklik çizgileri alırken bir şeyler ters gitti."
+msgid "Diffs|with %{additions} and %{deletions}"
+msgstr ""
+
msgid "Direct member"
msgstr ""
@@ -11834,9 +12025,6 @@ msgid_plural "Dismiss %d selected vulnerabilities as"
msgstr[0] ""
msgstr[1] ""
-msgid "Dismiss Value Stream Analytics introduction box"
-msgstr ""
-
msgid "Dismiss merge request promotion"
msgstr ""
@@ -12158,6 +12346,9 @@ msgstr ""
msgid "Edit issues"
msgstr "Sorunları düzenle"
+msgid "Edit merge requests"
+msgstr ""
+
msgid "Edit public deploy key"
msgstr "Genel dağıtım anahtarını düzenle"
@@ -12233,6 +12424,9 @@ msgstr ""
msgid "Elastic|None. Select projects to index."
msgstr ""
+msgid "Eligible users"
+msgstr ""
+
msgid "Email"
msgstr "E-posta"
@@ -12362,6 +12556,9 @@ msgstr "BoÅŸ dosya"
msgid "Enable"
msgstr "EtkinleÅŸtir"
+msgid "Enable Amazon EKS integration"
+msgstr ""
+
msgid "Enable Auto DevOps"
msgstr ""
@@ -12395,6 +12592,9 @@ msgstr ""
msgid "Enable SSL verification"
msgstr ""
+msgid "Enable Service Ping"
+msgstr ""
+
msgid "Enable Snowplow tracking"
msgstr ""
@@ -12425,6 +12625,9 @@ msgstr ""
msgid "Enable authenticated Git LFS request rate limit"
msgstr ""
+msgid "Enable authenticated web request rate limit"
+msgstr ""
+
msgid "Enable authentication"
msgstr ""
@@ -12485,7 +12688,7 @@ msgstr ""
msgid "Enable or disable the Pseudonymizer data collection."
msgstr ""
-msgid "Enable or disable version check and service ping."
+msgid "Enable or disable version check and Service Ping."
msgstr ""
msgid "Enable protected paths rate limit"
@@ -12497,18 +12700,12 @@ msgstr ""
msgid "Enable reCAPTCHA"
msgstr ""
-msgid "Enable reCAPTCHA for login"
-msgstr ""
-
-msgid "Enable reCAPTCHA, Invisible Captcha, Akismet and set IP limits. For reCAPTCHA, we currently only support %{recaptcha_v2_link_start}v2%{recaptcha_v2_link_end}"
+msgid "Enable reCAPTCHA for login."
msgstr ""
msgid "Enable repository checks"
msgstr ""
-msgid "Enable service ping"
-msgstr ""
-
msgid "Enable shared runners for all projects and subgroups in this group."
msgstr ""
@@ -12530,7 +12727,10 @@ msgstr "İki aşamalı doğrulamayı etkinleştir"
msgid "Enable unauthenticated API request rate limit"
msgstr ""
-msgid "Enable unauthenticated request rate limit"
+msgid "Enable unauthenticated web request rate limit"
+msgstr ""
+
+msgid "Enable user deactivation emails"
msgstr ""
msgid "Enable version check"
@@ -12566,9 +12766,6 @@ msgstr ""
msgid "Enabled sources for code import during project creation. OmniAuth must be configured for GitHub"
msgstr ""
-msgid "Enabling this will only make licensed EE features available to projects if the project namespace's plan includes the feature or if the project is public."
-msgstr ""
-
msgid "Encountered an error while rendering: %{err}"
msgstr ""
@@ -12617,9 +12814,6 @@ msgstr ""
msgid "Enter Admin Mode"
msgstr ""
-msgid "Enter IP address range"
-msgstr ""
-
msgid "Enter a number"
msgstr ""
@@ -12632,9 +12826,6 @@ msgstr ""
msgid "Enter at least three characters to search"
msgstr "Aramak için en az üç karakter girin"
-msgid "Enter domain"
-msgstr ""
-
msgid "Enter in your Bitbucket Server URL and personal access token below"
msgstr ""
@@ -12821,9 +13012,6 @@ msgstr "Dağıtım"
msgid "Environments|Deployment %{status}"
msgstr ""
-msgid "Environments|Dismiss"
-msgstr ""
-
msgid "Environments|Enable review app"
msgstr ""
@@ -12836,9 +13024,6 @@ msgstr "Ortamlar"
msgid "Environments|Environments are places where code gets deployed, such as staging or production."
msgstr ""
-msgid "Environments|Help us improve environments"
-msgstr ""
-
msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
msgstr ""
@@ -12875,6 +13060,9 @@ msgstr ""
msgid "Environments|Note that this action will stop the environment, but it will %{emphasisStart}not%{emphasisEnd} have an effect on any existing deployment due to no “stop environment action†being defined in the %{ciConfigLinkStart}.gitlab-ci.yml%{ciConfigLinkEnd} file."
msgstr ""
+msgid "Environments|Open"
+msgstr ""
+
msgid "Environments|Open live environment"
msgstr ""
@@ -12914,9 +13102,6 @@ msgstr "Ortamı durdur"
msgid "Environments|Stopping %{environmentName}"
msgstr ""
-msgid "Environments|Take the survey"
-msgstr ""
-
msgid "Environments|There was an error fetching the logs. Please try again."
msgstr ""
@@ -12938,9 +13123,6 @@ msgstr "Güncellendi"
msgid "Environments|You don't have any environments right now"
msgstr ""
-msgid "Environments|Your feedback helps GitLab make environments better for you and other users. Participate and enter a sweepstake to win a USD 30 gift card."
-msgstr ""
-
msgid "Environments|by %{avatar}"
msgstr ""
@@ -12966,7 +13148,7 @@ msgid "Epic not found for given params"
msgstr "Verilen parametrelerle epik bulunamadı"
msgid "Epics"
-msgstr "Epikler"
+msgstr ""
msgid "Epics Roadmap"
msgstr "Epiklerin Yol Haritası"
@@ -13223,8 +13405,8 @@ msgstr ""
msgid "Error parsing CSV file. Please make sure it has"
msgstr ""
-msgid "Error rendering markdown preview"
-msgstr "Biçimlendirme önizlemesi oluşturulurken hata oluştu"
+msgid "Error rendering Markdown preview"
+msgstr ""
msgid "Error saving label update."
msgstr "Etiket güncellenirken sorun oluştu."
@@ -13271,6 +13453,9 @@ msgstr ""
msgid "Error: %{error_message}"
msgstr ""
+msgid "Error: Couldn't load some or all of the changes."
+msgstr ""
+
msgid "Error: No AWS credentials were supplied"
msgstr ""
@@ -13304,6 +13489,9 @@ msgstr ""
msgid "ErrorTracking|Enable error tracking"
msgstr ""
+msgid "ErrorTracking|Error tracking backend"
+msgstr ""
+
msgid "ErrorTracking|If you self-host Sentry, enter your Sentry instance's full URL. If you use Sentry's hosted solution, enter https://sentry.io"
msgstr ""
@@ -13337,6 +13525,12 @@ msgstr ""
msgid "Escalation policies must have at least one rule"
msgstr ""
+msgid "EscalationPolicies|%{clockIcon} IF alert is not %{alertStatus} in %{minutes}"
+msgstr ""
+
+msgid "EscalationPolicies|%{notificationIcon} THEN %{doAction} %{forScheduleOrUser}"
+msgstr ""
+
msgid "EscalationPolicies|+ Add an additional rule"
msgstr ""
@@ -13379,13 +13573,13 @@ msgstr ""
msgid "EscalationPolicies|Escalation policies"
msgstr ""
-msgid "EscalationPolicies|Escalation rules"
+msgid "EscalationPolicies|Escalation policy %{obstacle} in Project %{project}"
msgstr ""
-msgid "EscalationPolicies|Failed to load oncall-schedules"
+msgid "EscalationPolicies|Escalation rules"
msgstr ""
-msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} %{then} THEN %{doAction} %{scheduleOrUser}"
+msgid "EscalationPolicies|Failed to load oncall-schedules"
msgstr ""
msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} minutes"
@@ -13463,18 +13657,36 @@ msgstr "Etkinlikler"
msgid "Every %{action} attempt has failed: %{job_error_message}. Please try again."
msgstr ""
+msgid "Every 3 months"
+msgstr ""
+
+msgid "Every 3 months on the %{day} at %{time} %{timezone}"
+msgstr ""
+
+msgid "Every 6 months"
+msgstr ""
+
+msgid "Every 6 months on the %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Every day"
msgstr "Her gün"
msgid "Every day (at %{time})"
msgstr "Her gün (saat %{time})"
+msgid "Every day at %{time} %{timezone}"
+msgstr ""
+
msgid "Every month"
msgstr "Her ay"
msgid "Every month (Day %{day} at %{time})"
msgstr "Her ay (%{day} günü saat %{time})"
+msgid "Every month on the %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Every three months"
msgstr "Her üç ayda bir"
@@ -13489,6 +13701,15 @@ msgstr[1] ""
msgid "Every week (%{weekday} at %{time})"
msgstr "Her hafta (%{weekday} saat %{time})"
+msgid "Every week on %{day} at %{time} %{timezone}"
+msgstr ""
+
+msgid "Every year"
+msgstr ""
+
+msgid "Every year on %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Everyone"
msgstr ""
@@ -13525,9 +13746,6 @@ msgstr ""
msgid "Exactly one of %{attributes} is required"
msgstr ""
-msgid "Example: %{ip_address}. %{read_more_link}."
-msgstr "Örnek: %{ip_address}. %{read_more_link}."
-
msgid "Example: @sub\\.company\\.com$"
msgstr ""
@@ -13594,15 +13812,15 @@ msgstr ""
msgid "Expand pipeline"
msgstr ""
+msgid "Expand settings section"
+msgstr ""
+
msgid "Expand sidebar"
msgstr "Kenar çubuğunu genişlet"
msgid "Expected documents: %{expected_documents}"
msgstr ""
-msgid "Experienced"
-msgstr "Deneyimli"
-
msgid "ExperimentSubject|Must have exactly one of User, Namespace, or Project."
msgstr ""
@@ -13885,9 +14103,6 @@ msgstr ""
msgid "Failed to load related branches"
msgstr "İlgili dalların yüklenmesi başarısız oldu"
-msgid "Failed to load sidebar lock status"
-msgstr ""
-
msgid "Failed to load stacktrace."
msgstr ""
@@ -14312,6 +14527,9 @@ msgstr ""
msgid "Files"
msgstr "Dosyalar"
+msgid "Files API Rate Limits"
+msgstr ""
+
msgid "Files breadcrumb"
msgstr ""
@@ -15311,6 +15529,9 @@ msgstr ""
msgid "GitLab group: %{source_link}"
msgstr ""
+msgid "GitLab informs you if a new version is available."
+msgstr ""
+
msgid "GitLab is a complete DevOps platform, delivered as a single application, fundamentally changing the way Development, Security, and Ops teams collaborate"
msgstr ""
@@ -15326,7 +15547,7 @@ msgstr ""
msgid "GitLab is open source software to collaborate on code."
msgstr ""
-msgid "GitLab is undergoing maintenance and is operating in a read-only mode."
+msgid "GitLab is undergoing maintenance and is operating in read-only mode."
msgstr ""
msgid "GitLab member or Email address"
@@ -15338,9 +15559,6 @@ msgstr ""
msgid "GitLab project export"
msgstr "GitLab proje dışa aktarımı"
-msgid "GitLab restart is required to apply changes."
-msgstr ""
-
msgid "GitLab single sign-on URL"
msgstr ""
@@ -15356,9 +15574,6 @@ msgstr ""
msgid "GitLab version"
msgstr ""
-msgid "GitLab will inform you if a new version is available."
-msgstr ""
-
msgid "GitLab will run a background job that will produce pseudonymized CSVs of the GitLab database that will be uploaded to your configured object storage directory."
msgstr ""
@@ -15623,9 +15838,21 @@ msgstr "Depo grafiÄŸine git"
msgid "Go to snippets"
msgstr "Parçacıklara git"
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check 'Allowed domains for sign-ups'."
+msgstr ""
+
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check 'Email restrictions for sign-ups'."
+msgstr ""
+
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check the 'Domain denylist'."
+msgstr ""
+
msgid "Go to the activity feed"
msgstr "Etkinlik akışına gidin"
+msgid "Go to the group’s 'Settings &gt; General' page, and check 'Restrict membership by email domain'."
+msgstr ""
+
msgid "Go to the milestone list"
msgstr "Dönüm noktası listesine gidin"
@@ -15662,6 +15889,12 @@ msgstr "Parçacıklarınıza gidin"
msgid "Goal of the changes and what reviewers should be aware of"
msgstr ""
+msgid "Google Cloud"
+msgstr ""
+
+msgid "Google Cloud offers several deployment targets. Select the one most suitable for your project."
+msgstr ""
+
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
@@ -15746,9 +15979,6 @@ msgstr ""
msgid "Group ID"
msgstr ""
-msgid "Group ID: %{group_id}"
-msgstr ""
-
msgid "Group Owner must have signed in with SAML before enabling Group Managed Accounts"
msgstr ""
@@ -15923,6 +16153,12 @@ msgstr ""
msgid "GroupImport|Unable to process group import file"
msgstr ""
+msgid "GroupPage|Copy group ID"
+msgstr ""
+
+msgid "GroupPage|Group ID: %{group_id}"
+msgstr ""
+
msgid "GroupRoadmap|%{dateWord} – No end date"
msgstr ""
@@ -15977,6 +16213,9 @@ msgstr "Aramanızı genişletmek için süzgeçleri değiştirin veya kaldırın
msgid "GroupRoadmap|Within 3 years"
msgstr ""
+msgid "GroupSAML|\"persistent\" recommended"
+msgstr ""
+
msgid "GroupSAML|%{strongOpen}Warning%{strongClose} - Enabling %{linkStart}SSO enforcement%{linkEnd} can reduce security risks."
msgstr ""
@@ -16109,6 +16348,9 @@ msgstr ""
msgid "GroupSAML|To be able to prohibit outer forks, you first need to enforce dedicate group managed accounts."
msgstr ""
+msgid "GroupSAML|Use SAML group links to manage group membership using SAML."
+msgstr ""
+
msgid "GroupSAML|Valid SAML Response"
msgstr ""
@@ -16121,13 +16363,10 @@ msgstr ""
msgid "GroupSAML|as %{access_level}"
msgstr ""
-msgid "GroupSAML|must match stored NameID of \"%{extern_uid}\" as we use this to identify users. If the NameID changes users will be unable to sign in."
-msgstr ""
-
-msgid "GroupSAML|should be \"persistent\""
+msgid "GroupSAML|must match stored NameID of \"%{extern_uid}\" to identify user and allow sign in"
msgstr ""
-msgid "GroupSAML|should be a random persistent ID, emails are discouraged"
+msgid "GroupSAML|recommend persistent ID instead of email"
msgstr ""
msgid "GroupSelect|No matching results"
@@ -16142,9 +16381,15 @@ msgstr ""
msgid "GroupSettings|Allow project access token creation"
msgstr ""
+msgid "GroupSettings|Applied to all subgroups unless overridden by a group owner. Groups already added to the project lose access."
+msgstr ""
+
msgid "GroupSettings|Auto DevOps pipeline was updated for the group"
msgstr "Grup için Otomatik DevOps iş hattı güncellendi"
+msgid "GroupSettings|Available only on the top-level group. Applies to all subgroups. Groups already shared with a group outside %{group} are still shared unless removed manually."
+msgstr ""
+
msgid "GroupSettings|Badges"
msgstr "Rozetler"
@@ -16196,6 +16441,9 @@ msgstr ""
msgid "GroupSettings|New runners registration token has been generated!"
msgstr ""
+msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgstr ""
+
msgid "GroupSettings|Pipeline settings was updated for the group"
msgstr ""
@@ -16208,12 +16456,15 @@ msgstr ""
msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
-msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups."
+msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups"
msgstr ""
msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
msgstr ""
+msgid "GroupSettings|Prevents group members from being notified if the group is mentioned."
+msgstr ""
+
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
msgstr ""
@@ -16250,21 +16501,6 @@ msgstr ""
msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}."
msgstr ""
-msgid "GroupSettings|This setting is only available on the top-level group and it applies to all subgroups. Groups that have already been shared with a group outside %{group} will still be shared, and this access will have to be revoked manually."
-msgstr ""
-
-msgid "GroupSettings|This setting will be applied to all subgroups unless overridden by a group owner. Groups that already have access to the project will continue to have access unless removed manually."
-msgstr ""
-
-msgid "GroupSettings|This setting will override user notification preferences for all members of the group, subgroups, and projects."
-msgstr ""
-
-msgid "GroupSettings|This setting will prevent group members from being notified if the group is mentioned."
-msgstr ""
-
-msgid "GroupSettings|This setting will prevent group members from forking projects outside of the group."
-msgstr ""
-
msgid "GroupSettings|Transfer group"
msgstr ""
@@ -16382,7 +16618,7 @@ msgstr ""
msgid "GroupsNew|No import options available"
msgstr ""
-msgid "GroupsNew|Not all related objects are migrated, as %{docs_link_start}described here%{docs_link_end}. Please %{feedback_link_start}leave feedback%{feedback_link_end} on this feature."
+msgid "GroupsNew|Not all related objects are migrated. %{docs_link_start}More info%{docs_link_end}."
msgstr ""
msgid "GroupsNew|Personal access token"
@@ -16514,15 +16750,27 @@ msgstr "Sağlıksız"
msgid "Hello %{name},"
msgstr ""
-msgid "Hello there"
-msgstr ""
-
msgid "Hello, %{name}!"
msgstr ""
msgid "Hello, %{username}!"
msgstr ""
+msgid "HelloMessage|%{handshake_emoji} Contribute to GitLab: %{contribute_link}"
+msgstr ""
+
+msgid "HelloMessage|%{magnifier_emoji} Create a new GitLab issue: %{new_issue_link}"
+msgstr ""
+
+msgid "HelloMessage|%{rocket_emoji} We like your curiosity! Help us improve GitLab by joining the team: %{jobs_page_link}"
+msgstr ""
+
+msgid "HelloMessage|Does this page need fixes or improvements? Open an issue or contribute a merge request to help make GitLab more lovable. At GitLab, everyone can contribute!"
+msgstr ""
+
+msgid "HelloMessage|Welcome to GitLab!"
+msgstr ""
+
msgid "Help"
msgstr "Yardım"
@@ -16532,13 +16780,10 @@ msgstr ""
msgid "Helps prevent bots from creating accounts."
msgstr ""
-msgid "Helps prevent bots from creating issues"
-msgstr ""
-
-msgid "Helps prevent malicious users hide their activity"
+msgid "Helps prevent bots from creating issues."
msgstr ""
-msgid "Helps reduce request volume (e.g. from crawlers or abusive bots)"
+msgid "Helps prevent malicious users hide their activity."
msgstr ""
msgid "Helps reduce request volume (for example, from crawlers or abusive bots)"
@@ -16662,6 +16907,12 @@ msgstr "Temizlik hizmeti başarıyla başlatıldı"
msgid "Housekeeping, export, path, transfer, remove, archive."
msgstr "Temizlik hizmeti, dışa aktarma, yol, transfer, kaldırma, arşivleme."
+msgid "How do I configure Akismet?"
+msgstr ""
+
+msgid "How do I configure it?"
+msgstr ""
+
msgid "How do I configure runners?"
msgstr ""
@@ -16683,19 +16934,25 @@ msgstr ""
msgid "How do I set up this service?"
msgstr ""
+msgid "How do I use a web terminal?"
+msgstr ""
+
+msgid "How do I use file templates?"
+msgstr ""
+
msgid "How it works"
msgstr ""
msgid "How many days need to pass between marking entity for deletion and actual removing it."
msgstr ""
-msgid "How many seconds an IP will be counted towards the limit"
+msgid "How many seconds an IP counts toward the IP address limit."
msgstr ""
-msgid "I accept the %{terms_link}"
+msgid "How the job limiter handles jobs exceeding the thresholds specified below. The 'track' mode only logs the jobs. The 'compress' mode compresses the jobs and raises an exception if the compressed size exceeds the limit."
msgstr ""
-msgid "I accept the|Terms of Service and Privacy Policy"
+msgid "I accept the %{terms_link}"
msgstr ""
msgid "I forgot my password"
@@ -16779,13 +17036,16 @@ msgstr ""
msgid "IP Address"
msgstr "IP Adresi"
-msgid "IP expiration time"
+msgid "IP address expiration time"
msgstr ""
-msgid "IP subnet restriction only allowed for top-level groups"
+msgid "IP address restrictions"
msgstr ""
-msgid "IPs per user"
+msgid "IP addresses per user"
+msgstr ""
+
+msgid "IP subnet restriction only allowed for top-level groups"
msgstr ""
msgid "Identifier"
@@ -16800,6 +17060,9 @@ msgstr ""
msgid "If any indexed field exceeds this limit it will be truncated to this number of characters and the rest will not be indexed or searchable. This does not apply to repository and wiki indexing. Setting this to 0 means it is unlimited."
msgstr ""
+msgid "If blank, defaults to %{code_open}Retry later%{code_close}."
+msgstr ""
+
msgid "If blank, set allowable lifetime to %{instance_level_policy_in_words}, as defined by the instance admin. Once set, existing tokens for users in this group may be revoked."
msgstr ""
@@ -16851,6 +17114,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 did not initiate these sign-in attempts, please reach out to your administrator or enable two-factor authentication (2FA) on your account."
+msgstr ""
+
msgid "If you did not initiate this change, please contact your administrator immediately."
msgstr ""
@@ -16942,10 +17208,10 @@ msgstr "CSV'yi içe aktar"
msgid "Import Projects from Gitea"
msgstr "Gitea'dan projeleri içe aktar"
-msgid "Import a project"
+msgid "Import an exported GitLab project"
msgstr ""
-msgid "Import an exported GitLab project"
+msgid "Import and export rate limits"
msgstr ""
msgid "Import failed due to a GitHub error: %{original}"
@@ -16957,12 +17223,18 @@ msgstr ""
msgid "Import from Jira"
msgstr ""
+msgid "Import group"
+msgstr ""
+
msgid "Import group from file"
msgstr "Grubu dosyadan içe aktar"
msgid "Import groups"
msgstr "Grupları içeri aktar"
+msgid "Import history"
+msgstr ""
+
msgid "Import in progress"
msgstr "İçe aktarma devam ediyor"
@@ -17026,7 +17298,25 @@ msgstr ""
msgid "Import timed out. Import took longer than %{import_jobs_expiration} seconds"
msgstr ""
-msgid "Import/Export Rate Limits"
+msgid "ImportAProjectModal|Import from a project"
+msgstr ""
+
+msgid "ImportAProjectModal|Import members from another project"
+msgstr ""
+
+msgid "ImportAProjectModal|Import project members"
+msgstr ""
+
+msgid "ImportAProjectModal|Only project members (not group members) are imported, and they get the same permissions as the project you import from."
+msgstr ""
+
+msgid "ImportAProjectModal|Successfully imported"
+msgstr ""
+
+msgid "ImportAProjectModal|Unable to import project members"
+msgstr ""
+
+msgid "ImportAProjectModal|You're importing members to the %{strongStart}%{name}%{strongEnd} project."
msgstr ""
msgid "ImportButtons|Connect repositories from"
@@ -17079,7 +17369,7 @@ msgstr[1] ""
msgid "Importing..."
msgstr ""
-msgid "Import|A repository URL usually ends in a .git suffix, although this is not required. Double check to make sure your repository URL is correct."
+msgid "Import|There is not a valid Git repository at this URL. If your HTTP repository is not publicly accessible, verify your credentials."
msgstr ""
msgid "Improve customer support with Service Desk"
@@ -17088,9 +17378,6 @@ msgstr ""
msgid "Improves Git cloning performance."
msgstr ""
-msgid "In %{time_to_now}"
-msgstr "%{time_to_now} içinde"
-
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 ""
@@ -17376,7 +17663,7 @@ msgstr ""
msgid "InProductMarketing|Start a GitLab Ultimate trial today in less than one minute, no credit card required."
msgstr ""
-msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no CC required"
+msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no credit card required"
msgstr ""
msgid "InProductMarketing|Start a trial"
@@ -17415,7 +17702,7 @@ msgstr ""
msgid "InProductMarketing|Team up in GitLab for greater efficiency"
msgstr ""
-msgid "InProductMarketing|Team work makes the dream work"
+msgid "InProductMarketing|Team work makes the dream work"
msgstr ""
msgid "InProductMarketing|Test, create, deploy"
@@ -17996,6 +18283,9 @@ msgstr ""
msgid "Integrations|Create new issue in Jira"
msgstr ""
+msgid "Integrations|Create new issue in ZenTao"
+msgstr ""
+
msgid "Integrations|Default settings are inherited from the group level."
msgstr ""
@@ -18089,9 +18379,15 @@ msgstr ""
msgid "Integrations|Search Jira issues"
msgstr ""
+msgid "Integrations|Search ZenTao issues"
+msgstr ""
+
msgid "Integrations|Send notifications about project events to Unify Circuit."
msgstr ""
+msgid "Integrations|Send notifications about project events to a Unify Circuit conversation. %{docs_link}"
+msgstr ""
+
msgid "Integrations|Sign in to add namespaces"
msgstr ""
@@ -18131,6 +18427,9 @@ msgstr ""
msgid "Integrations|You've activated every integration 🎉"
msgstr ""
+msgid "Integrations|ZenTao issues display here when you create issues in your project in ZenTao."
+msgstr ""
+
msgid "Interactive mode"
msgstr ""
@@ -18158,9 +18457,6 @@ msgstr ""
msgid "Interval Pattern"
msgstr "Aralık Deseni"
-msgid "Introducing Value Stream Analytics"
-msgstr ""
-
msgid "Introducing Your DevOps Report"
msgstr ""
@@ -18257,6 +18553,12 @@ msgstr ""
msgid "Investigate vulnerability: %{title}"
msgstr ""
+msgid "Invisible Captcha"
+msgstr ""
+
+msgid "Invisible Captcha helps prevent the creation of spam accounts. It adds a honeypot field and time-sensitive form submission to the account signup form."
+msgstr ""
+
msgid "Invitation"
msgstr ""
@@ -18710,12 +19012,18 @@ msgstr ""
msgid "Issues"
msgstr "Sorunlar"
+msgid "Issues I've created"
+msgstr ""
+
msgid "Issues Rate Limits"
msgstr ""
msgid "Issues and merge requests"
msgstr ""
+msgid "Issues assigned to me"
+msgstr ""
+
msgid "Issues can be bugs, tasks or ideas to be discussed. Also, issues are searchable and filterable."
msgstr ""
@@ -18827,7 +19135,7 @@ msgstr ""
msgid "Iterations|Create cadence"
msgstr ""
-msgid "Iterations|Create your first iteration"
+msgid "Iterations|Create iteration"
msgstr ""
msgid "Iterations|Delete cadence"
@@ -18836,6 +19144,9 @@ msgstr ""
msgid "Iterations|Delete iteration cadence?"
msgstr ""
+msgid "Iterations|Delete iteration?"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -18869,12 +19180,18 @@ msgstr ""
msgid "Iterations|New iteration cadence"
msgstr ""
+msgid "Iterations|No closed iterations."
+msgstr ""
+
msgid "Iterations|No iteration cadences to show."
msgstr ""
msgid "Iterations|No iterations in cadence."
msgstr ""
+msgid "Iterations|No open iterations."
+msgstr ""
+
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
@@ -18905,6 +19222,9 @@ msgstr ""
msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
msgstr ""
+msgid "Iterations|This will remove the iteration from any issues that are assigned to it."
+msgstr ""
+
msgid "Iterations|Title"
msgstr ""
@@ -18920,15 +19240,9 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "I’m familiar with the basics of DevOps."
-msgstr ""
-
msgid "I’m joining my team who’s already on GitLab"
msgstr ""
-msgid "I’m not familiar with the basics of DevOps."
-msgstr ""
-
msgid "Jaeger URL"
msgstr ""
@@ -19193,6 +19507,9 @@ msgstr ""
msgid "Job"
msgstr ""
+msgid "Job %{jobName}"
+msgstr ""
+
msgid "Job Failed #%{build_id}"
msgstr "İş Başarısız #%{build_id}"
@@ -19783,9 +20100,6 @@ msgstr ""
msgid "Learn more in the"
msgstr "Daha sonra iş hattı zamanlamaları belgelerinden"
-msgid "Learn more in the|pipeline schedules documentation"
-msgstr "daha fazla bilgi edinin"
-
msgid "Learn more."
msgstr "Daha fazlasını öğrenin."
@@ -19897,9 +20211,6 @@ msgstr "Ayrıl"
msgid "Leave Admin Mode"
msgstr ""
-msgid "Leave blank for no limit. Once set, existing personal access tokens may be revoked."
-msgstr ""
-
msgid "Leave edit mode? All unsaved changes will be lost."
msgstr ""
@@ -19945,12 +20256,12 @@ msgstr ""
msgid "LicenseCompliance|Acceptable license to be used in the project"
msgstr ""
-msgid "LicenseCompliance|Add a license"
-msgstr "Bir lisans ekle"
-
msgid "LicenseCompliance|Add license and related policy"
msgstr ""
+msgid "LicenseCompliance|Add license policy"
+msgstr ""
+
msgid "LicenseCompliance|Allow"
msgstr ""
@@ -20038,6 +20349,9 @@ msgstr ""
msgid "LicenseManagement|Uncategorized"
msgstr ""
+msgid "Licensed Enterprise Edition features can be used if the project namespace's plan includes the feature, or if the project is public."
+msgstr ""
+
msgid "Licensed Features"
msgstr "Lisanslı Özellikler"
@@ -20104,7 +20418,10 @@ msgstr ""
msgid "Limit namespaces and projects that can be indexed"
msgstr ""
-msgid "Limit sign in from multiple ips"
+msgid "Limit project size at a global, group, and project level. %{link_start}Learn more%{link_end}."
+msgstr ""
+
+msgid "Limit sign in from multiple IP addresses"
msgstr ""
msgid "Limit the number of concurrent operations this secondary site can run in the background."
@@ -20116,11 +20433,17 @@ msgstr ""
msgid "Limit the number of issues and epics per minute a user can create through web and API requests."
msgstr ""
+msgid "Limit the size of Sidekiq jobs stored in Redis."
+msgstr ""
+
msgid "Limited to showing %d event at most"
msgid_plural "Limited to showing %d events at most"
msgstr[0] "En fazla %d olay gösterimiyle sınırlı"
msgstr[1] "En fazla %d olay gösterimiyle sınırlı"
+msgid "Limiting mode"
+msgstr ""
+
msgid "Line changes"
msgstr ""
@@ -20190,9 +20513,6 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
-msgid "List of users to be excluded from the limit"
-msgstr ""
-
msgid "List options"
msgstr ""
@@ -20232,9 +20552,6 @@ msgstr ""
msgid "Loading functions timed out. Please reload the page to try again."
msgstr ""
-msgid "Loading issues"
-msgstr "Sorunlar yükleniyor"
-
msgid "Loading more"
msgstr ""
@@ -20526,6 +20843,9 @@ msgstr ""
msgid "Marked For Deletion At - %{deletion_time}"
msgstr ""
+msgid "Marked as ready. Merging is now allowed."
+msgstr ""
+
msgid "Marked this %{noun} as a draft."
msgstr ""
@@ -20598,52 +20918,22 @@ msgstr ""
msgid "Max 100,000 events"
msgstr ""
-msgid "Max 20 characters"
-msgstr ""
-
-msgid "Max Group Export Download requests per minute per user"
-msgstr ""
-
-msgid "Max Group Export requests per minute per user"
-msgstr ""
-
-msgid "Max Group Import requests per minute per user"
-msgstr ""
-
-msgid "Max Project Export Download requests per minute per user"
-msgstr ""
-
-msgid "Max Project Export requests per minute per user"
-msgstr ""
-
-msgid "Max Project Import requests per minute per user"
-msgstr ""
-
-msgid "Max authenticated API requests per period per user"
-msgstr ""
-
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
-msgid "Max authenticated web requests per period per user"
-msgstr ""
-
msgid "Max file size is 200 KB."
msgstr ""
-msgid "Max requests per minute per user"
-msgstr ""
-
msgid "Max role"
msgstr ""
msgid "Max session time"
msgstr ""
-msgid "Max unauthenticated requests per period per IP"
+msgid "MaxBuilds"
msgstr ""
-msgid "MaxBuilds"
+msgid "Maximum 20 characters"
msgstr ""
msgid "Maximum Conan package file size in bytes"
@@ -20679,6 +20969,12 @@ msgstr ""
msgid "Maximum attachment size (MB)"
msgstr "En yüksek ek boyutu (MB)"
+msgid "Maximum authenticated API requests per rate limit period per user"
+msgstr ""
+
+msgid "Maximum authenticated web requests per rate limit period per user"
+msgstr ""
+
msgid "Maximum bulk request size (MiB)"
msgstr ""
@@ -20724,6 +21020,15 @@ msgstr ""
msgid "Maximum files in a diff"
msgstr ""
+msgid "Maximum group export download requests per minute"
+msgstr ""
+
+msgid "Maximum group export requests per minute"
+msgstr ""
+
+msgid "Maximum group import requests per minute"
+msgstr ""
+
msgid "Maximum import size"
msgstr ""
@@ -20760,7 +21065,7 @@ msgstr ""
msgid "Maximum number of projects."
msgstr ""
-msgid "Maximum number of unique IPs per user"
+msgid "Maximum number of unique IP addresses per user."
msgstr ""
msgid "Maximum page reached"
@@ -20769,12 +21074,24 @@ msgstr ""
msgid "Maximum page size"
msgstr ""
+msgid "Maximum project export download requests per minute"
+msgstr ""
+
+msgid "Maximum project export requests per minute"
+msgstr ""
+
+msgid "Maximum project import requests per minute"
+msgstr ""
+
msgid "Maximum push size"
msgstr ""
msgid "Maximum push size (MB)"
msgstr ""
+msgid "Maximum requests per minute"
+msgstr ""
+
msgid "Maximum running slices"
msgstr ""
@@ -20802,10 +21119,16 @@ msgstr ""
msgid "Maximum time between updates that a mirror can have when scheduled to synchronize."
msgstr ""
-msgid "Maximum time for web terminal websocket connection (in seconds). 0 for unlimited."
+msgid "Maximum time that users are allowed to skip the setup of two-factor authentication (in hours). Set to 0 (zero) to enforce at next sign in."
+msgstr ""
+
+msgid "Maximum time, in seconds, for a web terminal websocket connection. 0 for unlimited."
msgstr ""
-msgid "Maximum 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."
+msgid "Maximum unauthenticated API requests per rate limit period per IP"
+msgstr ""
+
+msgid "Maximum unauthenticated web requests per rate limit period per IP"
msgstr ""
msgid "May"
@@ -20823,9 +21146,6 @@ msgstr ""
msgid "Medium vulnerabilities present"
msgstr ""
-msgid "Member lock"
-msgstr "Ãœye kilidi"
-
msgid "Member since"
msgstr ""
@@ -20862,6 +21182,9 @@ msgstr ""
msgid "Members of a group may only view projects they have permission to access"
msgstr ""
+msgid "Membership"
+msgstr ""
+
msgid "Members|%{time} by %{user}"
msgstr "%{user} tarafından %{time}"
@@ -20922,9 +21245,6 @@ msgstr ""
msgid "Members|Expiration date updated successfully."
msgstr ""
-msgid "Members|Expired"
-msgstr ""
-
msgid "Members|Filter members"
msgstr ""
@@ -20940,9 +21260,6 @@ msgstr ""
msgid "Members|Membership"
msgstr ""
-msgid "Members|No expiration set"
-msgstr ""
-
msgid "Members|Remove \"%{groupName}\""
msgstr ""
@@ -20964,9 +21281,6 @@ msgstr ""
msgid "Members|Search invited"
msgstr ""
-msgid "Members|in %{time}"
-msgstr "%{time} içinde"
-
msgid "Member|Deny access"
msgstr ""
@@ -21042,9 +21356,6 @@ msgstr "BirleÅŸtirme isteÄŸi"
msgid "Merge request %{mr_link} was reviewed by %{mr_author}"
msgstr ""
-msgid "Merge request (MR) approvals"
-msgstr ""
-
msgid "Merge request analytics"
msgstr ""
@@ -21066,12 +21377,21 @@ msgstr ""
msgid "Merge requests"
msgstr "BirleÅŸtirme istekleri"
+msgid "Merge requests I've created"
+msgstr ""
+
msgid "Merge requests are a place to propose changes you've made to a project and discuss those changes with others"
msgstr ""
msgid "Merge requests are read-only in a secondary Geo node"
msgstr ""
+msgid "Merge requests assigned to me"
+msgstr ""
+
+msgid "Merge requests that I'm a reviewer"
+msgstr ""
+
msgid "Merge the branch and fix any conflicts that come up"
msgstr ""
@@ -21132,10 +21452,10 @@ msgstr ""
msgid "MergeRequests|An error occurred while saving the draft comment."
msgstr "Taslak yorum kaydedilirken bir hata oluÅŸtu."
-msgid "MergeRequests|Failed to squash. Should be done manually."
+msgid "MergeRequests|Create issue to resolve thread"
msgstr ""
-msgid "MergeRequests|Resolve this thread in a new issue"
+msgid "MergeRequests|Failed to squash. Should be done manually."
msgstr ""
msgid "MergeRequests|Saving the comment failed"
@@ -21949,6 +22269,9 @@ msgstr ""
msgid "MoveIssue|Cannot move issue to project it originates from!"
msgstr ""
+msgid "MoveIssue|Cannot move issues of '%{issue_type}' type."
+msgstr ""
+
msgid "Moved issue to %{label} column in the board."
msgstr ""
@@ -22074,6 +22397,15 @@ 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. To learn more about reducing storage capacity please visit our docs."
msgstr ""
+msgid "NamespaceUserCap|Pending users must be reviewed and approved by a group owner. Learn more about %{user_caps_link_start}User Caps%{link_end} and %{users_pending_approval_link_start}Users Pending Approval%{link_end}."
+msgstr ""
+
+msgid "NamespaceUserCap|View pending user approvals"
+msgstr ""
+
+msgid "NamespaceUserCap|Your group has reached its billable member limit"
+msgstr ""
+
msgid "Namespaces"
msgstr ""
@@ -22116,9 +22448,6 @@ msgstr ""
msgid "Network"
msgstr ""
-msgid "Network Policy|New rule"
-msgstr ""
-
msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is inbound from a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
msgstr ""
@@ -22140,16 +22469,13 @@ msgstr ""
msgid "NetworkPolicies|%{strongOpen}any%{strongClose} port"
msgstr ""
-msgid "NetworkPolicies|+ Add alert"
-msgstr ""
-
msgid "NetworkPolicies|.yaml"
msgstr ""
msgid "NetworkPolicies|.yaml mode"
msgstr ""
-msgid "NetworkPolicies|Actions"
+msgid "NetworkPolicies|Add alert"
msgstr ""
msgid "NetworkPolicies|Alerts are intended to be selectively used for a limited number of events that are potentially concerning and warrant a manual review. Alerts should not be used as a substitute for a SIEM or a logging tool. High volume alerts are likely to be dropped so as to preserve the stability of GitLab's integration with Kubernetes."
@@ -22185,9 +22511,6 @@ msgstr ""
msgid "NetworkPolicies|Deny all traffic"
msgstr ""
-msgid "NetworkPolicies|Description"
-msgstr ""
-
msgid "NetworkPolicies|Edit policy"
msgstr ""
@@ -22200,9 +22523,6 @@ msgstr ""
msgid "NetworkPolicies|IP/subnet"
msgstr ""
-msgid "NetworkPolicies|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
-msgstr ""
-
msgid "NetworkPolicies|Invalid or empty policy"
msgstr ""
@@ -22212,19 +22532,16 @@ msgstr ""
msgid "NetworkPolicies|Kubernetes error: %{error}"
msgstr ""
-msgid "NetworkPolicies|Name"
-msgstr ""
-
msgid "NetworkPolicies|Network"
msgstr ""
-msgid "NetworkPolicies|Network traffic"
+msgid "NetworkPolicies|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
msgstr ""
-msgid "NetworkPolicies|New policy"
+msgid "NetworkPolicies|Network policy can be created after the environment is loaded successfully."
msgstr ""
-msgid "NetworkPolicies|No policies detected"
+msgid "NetworkPolicies|Network traffic"
msgstr ""
msgid "NetworkPolicies|None selected"
@@ -22233,21 +22550,12 @@ msgstr ""
msgid "NetworkPolicies|Please %{installLinkStart}install%{installLinkEnd} and %{configureLinkStart}configure a Kubernetes Agent for this project%{configureLinkEnd} to enable alerts."
msgstr ""
-msgid "NetworkPolicies|Policies are a specification of how groups of pods are allowed to communicate with each other's network endpoints."
-msgstr ""
-
msgid "NetworkPolicies|Policy %{policyName} was successfully changed"
msgstr ""
msgid "NetworkPolicies|Policy definition"
msgstr ""
-msgid "NetworkPolicies|Policy editor"
-msgstr ""
-
-msgid "NetworkPolicies|Policy preview"
-msgstr ""
-
msgid "NetworkPolicies|Rule"
msgstr ""
@@ -22257,9 +22565,6 @@ msgstr ""
msgid "NetworkPolicies|Rule mode is unavailable for this policy. In some cases, we cannot parse the YAML file back into the rules editor."
msgstr ""
-msgid "NetworkPolicies|Rules"
-msgstr ""
-
msgid "NetworkPolicies|Save changes"
msgstr ""
@@ -22272,9 +22577,6 @@ msgstr ""
msgid "NetworkPolicies|Traffic that does not match any rule will be blocked."
msgstr ""
-msgid "NetworkPolicies|Unable to parse policy"
-msgstr ""
-
msgid "NetworkPolicies|all DNS names"
msgstr ""
@@ -22454,6 +22756,9 @@ msgstr "Yeni kimlik"
msgid "New issue"
msgstr "Yeni sorun"
+msgid "New issue in %{project}"
+msgstr ""
+
msgid "New issue title"
msgstr "Yeni sorun başlığı"
@@ -22532,7 +22837,7 @@ msgstr "Yeni..."
msgid "Newest first"
msgstr ""
-msgid "Newly registered users will by default be external"
+msgid "Newly-registered users are external by default"
msgstr ""
msgid "Next"
@@ -22847,8 +23152,10 @@ msgstr ""
msgid "No webhooks found, add one in the form above."
msgstr ""
-msgid "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} to renew your subscription."
-msgstr ""
+msgid "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} day to renew your subscription."
+msgid_plural "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} days to renew your subscription."
+msgstr[0] ""
+msgstr[1] ""
msgid "No. of commits"
msgstr ""
@@ -22865,7 +23172,7 @@ msgstr "Düğüm başarıyla güncellendi."
msgid "Nodes"
msgstr ""
-msgid "Non-admin users can sign in with read-only access and make read-only API requests."
+msgid "Non-admin users are restricted to read-only access, in both GitLab UI and API."
msgstr ""
msgid "None"
@@ -22946,7 +23253,7 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
-msgid "Notes Rate Limits"
+msgid "Notes rate limit"
msgstr ""
msgid "Notes|Are you sure you want to cancel creating this comment?"
@@ -23113,9 +23420,6 @@ msgstr "Kas"
msgid "November"
msgstr "Kasım"
-msgid "Novice"
-msgstr ""
-
msgid "Now, personalize your GitLab experience"
msgstr ""
@@ -23284,7 +23588,7 @@ msgstr ""
msgid "OnCallSchedules|For this rotation, on-call will be:"
msgstr ""
-msgid "OnCallSchedules|On-call schedule %{schedule} in Project %{project}"
+msgid "OnCallSchedules|On-call schedule %{obstacle} in Project %{project}"
msgstr ""
msgid "OnCallSchedules|On-call schedules"
@@ -23431,22 +23735,22 @@ msgstr ""
msgid "OnDemandScans|Scanner profile"
msgstr ""
-msgid "OnDemandScans|Select one of the existing profiles"
+msgid "OnDemandScans|Schedule scan"
msgstr ""
-msgid "OnDemandScans|Site profile"
+msgid "OnDemandScans|Select one of the existing profiles"
msgstr ""
-msgid "OnDemandScans|Use existing scanner profile"
+msgid "OnDemandScans|Site profile"
msgstr ""
-msgid "OnDemandScans|Use existing site profile"
+msgid "OnDemandScans|Start time"
msgstr ""
-msgid "OnDemandScans|You can either choose a passive scan or validate the target site in your chosen site profile. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
+msgid "OnDemandScans|Use existing scanner profile"
msgstr ""
-msgid "OnDemandScans|You cannot run an active scan against an unvalidated site."
+msgid "OnDemandScans|Use existing site profile"
msgstr ""
msgid "OnDemandScans|You must create a repository within your project to run an on-demand scan."
@@ -23511,6 +23815,9 @@ msgstr ""
msgid "Only admins can delete project"
msgstr ""
+msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
+msgstr ""
+
msgid "Only include features new to your current subscription tier."
msgstr ""
@@ -23529,6 +23836,12 @@ msgstr ""
msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
+msgid "Only reCAPTCHA v2 is supported:"
+msgstr ""
+
+msgid "Only users from the specified IP address ranges are able to reach this group, including all subgroups, projects, and Git repositories."
+msgstr ""
+
msgid "Only verified users with an email address in any of these domains can be added to the group."
msgstr ""
@@ -23715,9 +24028,6 @@ msgstr "Sahibi"
msgid "Package Registry"
msgstr ""
-msgid "Package Registry Rate Limits"
-msgstr ""
-
msgid "Package Registry: authenticated API requests"
msgstr ""
@@ -23736,6 +24046,9 @@ msgstr ""
msgid "Package recipe already exists"
msgstr ""
+msgid "Package registry rate limits"
+msgstr ""
+
msgid "Package type"
msgstr ""
@@ -23802,6 +24115,9 @@ msgstr ""
msgid "PackageRegistry|Composer"
msgstr ""
+msgid "PackageRegistry|Composer.json with license: %{license} and version: %{version}"
+msgstr ""
+
msgid "PackageRegistry|Conan"
msgstr ""
@@ -23865,6 +24181,9 @@ msgstr ""
msgid "PackageRegistry|Copy require package include"
msgstr ""
+msgid "PackageRegistry|Copy target SHA"
+msgstr ""
+
msgid "PackageRegistry|Copy yarn command"
msgstr ""
@@ -23931,6 +24250,9 @@ msgstr ""
msgid "PackageRegistry|Install package version"
msgstr ""
+msgid "PackageRegistry|Instance-level"
+msgstr ""
+
msgid "PackageRegistry|Invalid Package: failed metadata extraction"
msgstr ""
@@ -23976,6 +24298,9 @@ msgstr ""
msgid "PackageRegistry|Pip Command"
msgstr ""
+msgid "PackageRegistry|Project-level"
+msgstr ""
+
msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
msgstr ""
@@ -23997,6 +24322,9 @@ msgstr ""
msgid "PackageRegistry|Remove package"
msgstr ""
+msgid "PackageRegistry|Required Python: %{pythonVersion}"
+msgstr ""
+
msgid "PackageRegistry|RubyGems"
msgstr ""
@@ -24039,6 +24367,9 @@ msgstr "Üzgünüz, filtreniz sonuç vermedi"
msgid "PackageRegistry|Source project located at %{link}"
msgstr ""
+msgid "PackageRegistry|Target SHA: %{sha}"
+msgstr ""
+
msgid "PackageRegistry|There are no other versions of this package."
msgstr ""
@@ -24207,6 +24538,18 @@ msgstr "Şifre başarıyla değiştirildi"
msgid "Password was successfully updated. Please sign in again."
msgstr ""
+msgid "PasswordPrompt|Confirm password"
+msgstr ""
+
+msgid "PasswordPrompt|Confirm password to continue"
+msgstr ""
+
+msgid "PasswordPrompt|Password is required"
+msgstr ""
+
+msgid "PasswordPrompt|Please enter your password to confirm"
+msgstr ""
+
msgid "Passwords should be unique and not used for any other sites or services."
msgstr "Şifreler benzersiz olmalı ve başka hiçbir site veya hizmet için kullanılmamalıdır."
@@ -24234,6 +24577,9 @@ msgstr ""
msgid "Paste project path (i.e. gitlab-org/gitlab)"
msgstr ""
+msgid "Paste this DSN into your Sentry SDK"
+msgstr ""
+
msgid "Paste your public SSH key, which is usually contained in the file '~/.ssh/id_ed25519.pub' or '~/.ssh/id_rsa.pub' and begins with 'ssh-ed25519' or 'ssh-rsa'. Do not paste your private SSH key, as that can compromise your identity."
msgstr ""
@@ -24318,6 +24664,9 @@ msgstr ""
msgid "PerformanceBar|First Contentful Paint"
msgstr ""
+msgid "PerformanceBar|Flamegraph with mode:"
+msgstr ""
+
msgid "PerformanceBar|Frontend resources"
msgstr ""
@@ -24351,6 +24700,15 @@ msgstr ""
msgid "PerformanceBar|Trace"
msgstr ""
+msgid "PerformanceBar|cpu"
+msgstr ""
+
+msgid "PerformanceBar|object"
+msgstr ""
+
+msgid "PerformanceBar|wall"
+msgstr ""
+
msgid "Period in seconds"
msgstr ""
@@ -24579,6 +24937,48 @@ msgstr "Hedef"
msgid "PipelineSchedules|Variables"
msgstr ""
+msgid "PipelineSource|API"
+msgstr ""
+
+msgid "PipelineSource|Chat"
+msgstr ""
+
+msgid "PipelineSource|External"
+msgstr ""
+
+msgid "PipelineSource|External Pull Request"
+msgstr ""
+
+msgid "PipelineSource|Merge Request"
+msgstr ""
+
+msgid "PipelineSource|On-Demand DAST Scan"
+msgstr ""
+
+msgid "PipelineSource|On-Demand DAST Validation"
+msgstr ""
+
+msgid "PipelineSource|Parent Pipeline"
+msgstr ""
+
+msgid "PipelineSource|Pipeline"
+msgstr ""
+
+msgid "PipelineSource|Push"
+msgstr ""
+
+msgid "PipelineSource|Schedule"
+msgstr ""
+
+msgid "PipelineSource|Trigger"
+msgstr ""
+
+msgid "PipelineSource|Web"
+msgstr ""
+
+msgid "PipelineSource|Web IDE"
+msgstr ""
+
msgid "PipelineStatusTooltip|Pipeline: %{ciStatus}"
msgstr ""
@@ -24879,46 +25279,7 @@ msgstr ""
msgid "Pipeline|Source"
msgstr ""
-msgid "Pipeline|Source|API"
-msgstr ""
-
-msgid "Pipeline|Source|Chat"
-msgstr ""
-
-msgid "Pipeline|Source|External"
-msgstr ""
-
-msgid "Pipeline|Source|External Pull Request"
-msgstr ""
-
-msgid "Pipeline|Source|Merge Request"
-msgstr ""
-
-msgid "Pipeline|Source|On-Demand DAST Scan"
-msgstr ""
-
-msgid "Pipeline|Source|On-Demand DAST Validation"
-msgstr ""
-
-msgid "Pipeline|Source|Parent Pipeline"
-msgstr ""
-
-msgid "Pipeline|Source|Pipeline"
-msgstr ""
-
-msgid "Pipeline|Source|Push"
-msgstr ""
-
-msgid "Pipeline|Source|Schedule"
-msgstr ""
-
-msgid "Pipeline|Source|Trigger"
-msgstr ""
-
-msgid "Pipeline|Source|Web"
-msgstr ""
-
-msgid "Pipeline|Source|Web IDE"
+msgid "Pipeline|Source|Security Policy"
msgstr ""
msgid "Pipeline|Specify variable values to be used in this run. The values specified in %{linkStart}CI/CD settings%{linkEnd} will be used by default."
@@ -24969,7 +25330,7 @@ msgstr ""
msgid "Pipeline|We are currently unable to fetch pipeline data"
msgstr ""
-msgid "Pipeline|You’re about to stop pipeline %{pipelineId}."
+msgid "Pipeline|You’re about to stop pipeline #%{pipelineId}."
msgstr ""
msgid "Pipeline|for"
@@ -24996,6 +25357,9 @@ msgstr ""
msgid "Plain diff"
msgstr ""
+msgid "Plain-text response to send to clients that hit a rate limit"
+msgstr ""
+
msgid "Plan:"
msgstr ""
@@ -25140,9 +25504,6 @@ msgstr ""
msgid "Please provide attributes to update"
msgstr ""
-msgid "Please provide your username or email address."
-msgstr ""
-
msgid "Please reach out if you have any questions and we'll be happy to assist."
msgstr ""
@@ -25185,9 +25546,6 @@ msgstr ""
msgid "Please set a new password before proceeding."
msgstr "Lütfen devam etmeden önce yeni bir şifre belirleyin."
-msgid "Please share your feedback about %{featureName} %{linkStart}in this issue%{linkEnd} to help us improve the experience."
-msgstr ""
-
msgid "Please solve the captcha"
msgstr ""
@@ -25365,6 +25723,9 @@ msgstr "Önceki"
msgid "Prevent adding new members to project membership within this group"
msgstr ""
+msgid "Prevent auto-stopping"
+msgstr ""
+
msgid "Prevent editing approval rules in projects and merge requests."
msgstr ""
@@ -25377,7 +25738,7 @@ msgstr ""
msgid "Prevent users from changing their profile name"
msgstr ""
-msgid "Prevent users from performing write operations on GitLab while performing maintenance."
+msgid "Prevent users from performing write operations while GitLab maintenance is in progress."
msgstr ""
msgid "Preview"
@@ -25650,6 +26011,9 @@ msgstr ""
msgid "Profiles|Enter your name, so people you know can recognize you"
msgstr "Adınızı girin, böylece insanlar sizi tanıyabilir"
+msgid "Profiles|Enter your password to confirm the email change"
+msgstr ""
+
msgid "Profiles|Enter your pronouns to let people know how to refer to you"
msgstr ""
@@ -25884,12 +26248,12 @@ msgstr "Durumunuz"
msgid "Profiles|e.g. My MacBook key"
msgstr "Örneğin. MacBook anahtarım"
+msgid "Profiles|https://website.com"
+msgstr ""
+
msgid "Profiles|username"
msgstr "kullanıcıadı"
-msgid "Profiles|website.com"
-msgstr "websitesi.com"
-
msgid "Profiles|your account"
msgstr "hesabınız"
@@ -26130,9 +26494,21 @@ msgstr "Proje KimliÄŸi: %{project_id}"
msgid "ProjectSelect| or group"
msgstr " veya grup"
+msgid "ProjectSelect|No matching results"
+msgstr ""
+
msgid "ProjectSelect|Search for project"
msgstr "Proje için ara"
+msgid "ProjectSelect|Search projects"
+msgstr ""
+
+msgid "ProjectSelect|Select a project"
+msgstr ""
+
+msgid "ProjectSelect|There was an error fetching the projects. Please try again."
+msgstr ""
+
msgid "ProjectService|Drone server URL"
msgstr ""
@@ -26220,6 +26596,9 @@ msgstr ""
msgid "ProjectService|Trigger event when a new, unique alert is recorded."
msgstr ""
+msgid "ProjectService|Trigger event when a new, unique vulnerability is recorded. (Note: This feature requires an Ultimate plan.)"
+msgstr ""
+
msgid "ProjectService|Trigger event when a pipeline status changes."
msgstr ""
@@ -26634,9 +27013,15 @@ msgstr ""
msgid "Projects are graded based on the highest severity vulnerability present"
msgstr ""
+msgid "Projects are organized into groups"
+msgstr ""
+
msgid "Projects contributed to"
msgstr ""
+msgid "Projects help you organize your work. They contain your file repository, issues, merge requests, and so much more."
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr "%{group_name} ile paylaşılan projeler"
@@ -26871,10 +27256,10 @@ msgstr ""
msgid "PrometheusService|Prometheus cluster integration"
msgstr ""
-msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
+msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
msgstr ""
-msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
+msgid "PrometheusService|The ID of the IAP-secured resource."
msgstr ""
msgid "PrometheusService|The Prometheus API base URL."
@@ -27492,6 +27877,9 @@ msgstr ""
msgid "Rate limit"
msgstr ""
+msgid "Rate limits can help reduce request volume (like from crawlers or abusive bots)."
+msgstr ""
+
msgid "Raw blob request rate limit per minute"
msgstr ""
@@ -27504,6 +27892,9 @@ msgstr ""
msgid "Re-authentication required"
msgstr ""
+msgid "Re-import"
+msgstr ""
+
msgid "Re-request review"
msgstr ""
@@ -27525,6 +27916,9 @@ msgstr ""
msgid "Read more about related issues"
msgstr "İlgili sorunlar hakkında daha fazla bilgi edinin"
+msgid "Read their documentation."
+msgstr ""
+
msgid "Ready to get started with GitLab? Follow these steps to set up your workspace, plan and commit changes, and deploy your project."
msgstr ""
@@ -27558,6 +27952,9 @@ msgstr ""
msgid "Receive any notifications from GitLab."
msgstr ""
+msgid "Receive notification of abuse reports by email."
+msgstr ""
+
msgid "Receive notifications about your own activity"
msgstr "Kendi etkinliğiniz ile ilgili bildirim alın"
@@ -27701,9 +28098,6 @@ msgstr ""
msgid "Registry setup"
msgstr ""
-msgid "Regulate approvals by authors/committers. Affects all projects."
-msgstr ""
-
msgid "Reindexing Status: %{status} (Slice multiplier: %{multiplier}, Maximum running slices: %{max_slices})"
msgstr ""
@@ -27799,6 +28193,9 @@ msgstr ""
msgid "Release|Something went wrong while saving the release details."
msgstr ""
+msgid "Reload page"
+msgstr ""
+
msgid "Remediations"
msgstr ""
@@ -28081,6 +28478,9 @@ msgstr "Bu %{quick_action_target} yeniden açıldı."
msgid "Reopens this %{quick_action_target}."
msgstr ""
+msgid "Repeats"
+msgstr ""
+
msgid "Replace"
msgstr "DeÄŸiÅŸtir"
@@ -28443,10 +28843,7 @@ msgstr ""
msgid "Require additional authentication for administrative tasks."
msgstr ""
-msgid "Require all users in this group to setup Two-factor authentication"
-msgstr ""
-
-msgid "Require all users in this group to setup two-factor authentication"
+msgid "Require all users in this group to set up two-factor authentication"
msgstr ""
msgid "Required approvals (%{approvals_given} given)"
@@ -28492,6 +28889,9 @@ msgstr[1] ""
msgid "Requires values to meet regular expression requirements."
msgstr ""
+msgid "Requires you to deploy or set up cloud-hosted Sentry."
+msgstr ""
+
msgid "Requires your primary GitLab email address."
msgstr ""
@@ -28552,9 +28952,6 @@ msgstr ""
msgid "Resolve"
msgstr ""
-msgid "Resolve all threads in new issue"
-msgstr ""
-
msgid "Resolve conflicts"
msgstr ""
@@ -28612,6 +29009,9 @@ msgstr ""
msgid "Response text"
msgstr ""
+msgid "Restart GitLab to apply changes."
+msgstr ""
+
msgid "Restart Terminal"
msgstr ""
@@ -28630,6 +29030,9 @@ msgstr ""
msgid "Restoring the project will prevent the project from being removed on this date and restore people's ability to make changes to it."
msgstr ""
+msgid "Restrict group access by IP address. %{link_start}Learn more%{link_end}."
+msgstr ""
+
msgid "Restrict membership by email domain"
msgstr ""
@@ -28943,6 +29346,9 @@ msgstr ""
msgid "Runners|Runner #%{runner_id}"
msgstr ""
+msgid "Runners|Runner assigned to project."
+msgstr ""
+
msgid "Runners|Runner is offline, last contact was %{runner_contact} ago"
msgstr ""
@@ -28955,6 +29361,9 @@ msgstr ""
msgid "Runners|Runner registration"
msgstr ""
+msgid "Runners|Runner unassigned from project."
+msgstr ""
+
msgid "Runners|Runners"
msgstr ""
@@ -29147,8 +29556,8 @@ msgstr ""
msgid "SastEntryPoints|How do I set up SAST?"
msgstr ""
-msgid "SastEntryPoints|Learn more."
-msgstr "Daha fazlasını öğrenin."
+msgid "SastEntryPoints|Learn more"
+msgstr ""
msgid "Satisfied"
msgstr ""
@@ -29189,7 +29598,7 @@ msgstr "Åžifreyi kaydet"
msgid "Save pipeline schedule"
msgstr "İş hattı takvimini kaydet"
-msgid "Save space and find images in the container Registry. remove unneeded tags and keep only the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
+msgid "Save storage space by automatically deleting tags from the container registry and keeping the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
msgstr ""
msgid "Saving"
@@ -29363,6 +29772,9 @@ msgstr "Ara veya sonuçları filtrele..."
msgid "Search or filter results…"
msgstr "Sonuçları ara ya da filtrele…"
+msgid "Search or jump to..."
+msgstr ""
+
msgid "Search project"
msgstr "Proje ara"
@@ -29423,16 +29835,16 @@ msgstr ""
msgid "SearchCodeResults|of %{link_to_project}"
msgstr ""
-msgid "SearchResults|Showing %{count} %{scope} for%{term_element}"
+msgid "SearchResults|Showing %{count} %{scope} for %{term_element}"
msgstr ""
-msgid "SearchResults|Showing %{count} %{scope} for%{term_element} in your personal and project snippets"
+msgid "SearchResults|Showing %{count} %{scope} for %{term_element} in your personal and project snippets"
msgstr ""
-msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for%{term_element}"
+msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for %{term_element}"
msgstr ""
-msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for%{term_element} in your personal and project snippets"
+msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for %{term_element} in your personal and project snippets"
msgstr ""
msgid "SearchResults|code result"
@@ -29514,6 +29926,9 @@ msgstr ""
msgid "Secret Detection"
msgstr ""
+msgid "Secret access key"
+msgstr ""
+
msgid "Secret token"
msgstr ""
@@ -29553,9 +29968,6 @@ msgstr ""
msgid "SecurityApprovals|A merge request approval is required when the license compliance report contains a denied license."
msgstr ""
-msgid "SecurityApprovals|Configurable if security scanners are enabled. %{linkStart}Learn more.%{linkEnd}"
-msgstr ""
-
msgid "SecurityApprovals|Coverage-Check"
msgstr ""
@@ -29568,24 +29980,18 @@ msgstr ""
msgid "SecurityApprovals|Learn more about Vulnerability-Check"
msgstr ""
-msgid "SecurityApprovals|License Scanning must be enabled. %{linkStart}Learn more%{linkEnd}."
-msgstr ""
-
msgid "SecurityApprovals|License-Check"
msgstr ""
msgid "SecurityApprovals|Requires approval for Denied licenses. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}More information%{linkEnd}"
+msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "SecurityApprovals|Requires approval for vulnerabilities. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
-msgid "SecurityApprovals|Test coverage must be enabled. %{linkStart}Learn more%{linkEnd}."
-msgstr ""
-
msgid "SecurityApprovals|Vulnerability-Check"
msgstr ""
@@ -29649,6 +30055,12 @@ msgstr ""
msgid "SecurityConfiguration|Immediately begin risk analysis and remediation with application security features. Start with SAST and Secret Detection, available to all plans. Upgrade to Ultimate to get all features, including:"
msgstr ""
+msgid "SecurityConfiguration|Manage corpus"
+msgstr ""
+
+msgid "SecurityConfiguration|Manage corpus files used as mutation sources in coverage fuzzing."
+msgstr ""
+
msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
msgstr ""
@@ -29703,6 +30115,12 @@ msgstr ""
msgid "SecurityOrchestration|Action"
msgstr ""
+msgid "SecurityOrchestration|Actions"
+msgstr ""
+
+msgid "SecurityOrchestration|Add rule"
+msgstr ""
+
msgid "SecurityOrchestration|All policies"
msgstr ""
@@ -29736,9 +30154,6 @@ msgstr ""
msgid "SecurityOrchestration|Network"
msgstr ""
-msgid "SecurityOrchestration|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
-msgstr ""
-
msgid "SecurityOrchestration|New policy"
msgstr ""
@@ -29754,6 +30169,9 @@ msgstr ""
msgid "SecurityOrchestration|Policy editor"
msgstr ""
+msgid "SecurityOrchestration|Policy preview"
+msgstr ""
+
msgid "SecurityOrchestration|Policy status"
msgstr ""
@@ -29763,6 +30181,9 @@ msgstr ""
msgid "SecurityOrchestration|Rule"
msgstr ""
+msgid "SecurityOrchestration|Rules"
+msgstr ""
+
msgid "SecurityOrchestration|Scan Execution"
msgstr ""
@@ -29856,6 +30277,9 @@ msgstr ""
msgid "SecurityReports|Create issue"
msgstr "Sorun oluÅŸtur"
+msgid "SecurityReports|Development vulnerabilities"
+msgstr ""
+
msgid "SecurityReports|Dismiss vulnerability"
msgstr ""
@@ -29871,6 +30295,9 @@ msgstr ""
msgid "SecurityReports|Download results"
msgstr ""
+msgid "SecurityReports|Download scanned URLs"
+msgstr ""
+
msgid "SecurityReports|Download scanned resources"
msgstr ""
@@ -29994,6 +30421,9 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
+msgid "SecurityReports|The Vulnerability Report shows the results of the lastest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "SecurityReports|The security reports below contain one or more vulnerability findings that could not be parsed and were not recorded. Download the artifacts in the job output to investigate. Ensure any security report created conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
msgstr ""
@@ -30135,10 +30565,10 @@ msgstr ""
msgid "Select a repository"
msgstr ""
-msgid "Select a role"
+msgid "Select a repository containing templates for common files."
msgstr ""
-msgid "Select a shared template repository for all projects on this instance."
+msgid "Select a role"
msgstr ""
msgid "Select a template repository"
@@ -30216,6 +30646,9 @@ msgstr "Makine tipini seçmek için proje ve bölge seçin"
msgid "Select project to choose zone"
msgstr "Bölge seçmek için proje seçin"
+msgid "Select project to create issue"
+msgstr ""
+
msgid "Select projects"
msgstr "Projeleri seç"
@@ -30333,6 +30766,9 @@ msgstr ""
msgid "Send emails to help guide new users through the onboarding process."
msgstr ""
+msgid "Send emails to users upon account deactivation."
+msgstr ""
+
msgid "Send message"
msgstr ""
@@ -30351,6 +30787,9 @@ msgstr ""
msgid "Send service data"
msgstr ""
+msgid "Sentry"
+msgstr ""
+
msgid "Sentry API URL"
msgstr ""
@@ -30465,6 +30904,9 @@ msgstr ""
msgid "Service"
msgstr ""
+msgid "Service Accounts keys are required to authorize GitLab to deploy your Google Cloud project."
+msgstr ""
+
msgid "Service Desk"
msgstr "Servis Masası"
@@ -30537,15 +30979,15 @@ msgstr ""
msgid "Set a password on your account to pull or push via %{protocol}."
msgstr ""
-msgid "Set a template repository for projects in this group"
-msgstr "Bu gruptaki projeler için bir şablon deposu ayarlayın"
-
msgid "Set access permissions for this token."
msgstr ""
msgid "Set an instance-wide domain that will be available to all clusters when installing Knative."
msgstr ""
+msgid "Set any rate limit to %{code_open}0%{code_close} to disable the limit."
+msgstr ""
+
msgid "Set default and restrict visibility levels. Configure import sources and git access protocol."
msgstr "Varsayılanı ayarlayın ve görünürlük seviyelerini sınırlayın. İçe aktarma kaynaklarını ve git erişim protokolünü yapılandırın."
@@ -30558,8 +31000,8 @@ msgstr ""
msgid "Set limit to 0 to allow any file size."
msgstr ""
-msgid "Set max session time for web terminal."
-msgstr "Web terminali için en yüksek oturum süresini ayarlayın."
+msgid "Set limits for web and API requests."
+msgstr ""
msgid "Set milestone"
msgstr ""
@@ -30567,15 +31009,18 @@ msgstr ""
msgid "Set new password"
msgstr "Yeni parola ayarla"
-msgid "Set notification email for abuse reports."
-msgstr "Kötüye kullanım raporları için bildirim e-postası ayarlayın."
-
msgid "Set parent epic to an epic"
msgstr "Bir epiğe üst epik ayarla"
+msgid "Set per-user rate limits for imports and exports of projects and groups."
+msgstr ""
+
msgid "Set projects and maximum size limits, session duration, user options, and check feature availability for namespace plan."
msgstr ""
+msgid "Set rate limits for package registry API requests that supersede the general user and IP rate limits."
+msgstr ""
+
msgid "Set severity"
msgstr ""
@@ -30594,15 +31039,24 @@ msgstr ""
msgid "Set the default branch for this project. All merge requests and commits are made against this branch unless you specify a different one."
msgstr ""
+msgid "Set the default expiration time for job artifacts in all projects. Set to %{code_open}0%{code_close} to never expire artifacts by default. If no unit is written, it defaults to seconds. For example, these are all equivalent: %{code_open}3600%{code_close}, %{code_open}60 minutes%{code_close}, or %{code_open}one hour%{code_close}."
+msgstr ""
+
msgid "Set the due date to %{due_date}."
msgstr ""
msgid "Set the iteration to %{iteration_reference}."
msgstr ""
+msgid "Set the maximum session time for a web terminal."
+msgstr ""
+
msgid "Set the milestone to %{milestone_reference}."
msgstr ""
+msgid "Set the per-user rate limit for notes created by web or API requests."
+msgstr ""
+
msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
msgstr ""
@@ -30804,6 +31258,9 @@ msgstr ""
msgid "Show Pipeline IID"
msgstr ""
+msgid "Show all %{issuable_type}."
+msgstr ""
+
msgid "Show all activity"
msgstr ""
@@ -30855,15 +31312,9 @@ msgstr ""
msgid "Show list"
msgstr ""
-msgid "Show me advanced features"
-msgstr ""
-
msgid "Show me how to add a pipeline"
msgstr ""
-msgid "Show me the basics"
-msgstr ""
-
msgid "Show one file at a time"
msgstr ""
@@ -30904,15 +31355,15 @@ msgstr "%{limit} / %{total_count} sorun gösteriliyor. "
msgid "Showing %{pageSize} of %{total} %{issuableType}"
msgstr ""
-msgid "Showing %{pageSize} of %{total} issues"
-msgstr "%{pageSize} / %{total} sorun gösteriliyor"
-
msgid "Showing all epics"
msgstr ""
msgid "Showing all issues"
msgstr "Tüm sorunlar gösteriliyor"
+msgid "Showing data for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
+msgstr ""
+
msgid "Showing data for workflow items created in this date range. Date range cannot exceed %{maxDateRange} days."
msgstr ""
@@ -30952,6 +31403,15 @@ msgstr "Yalnızca sayısal karakterlere izin verilir"
msgid "Sidebar|Weight"
msgstr "Ağırlık"
+msgid "Sidekiq job compression threshold (bytes)"
+msgstr ""
+
+msgid "Sidekiq job size limit (bytes)"
+msgstr ""
+
+msgid "Sidekiq job size limits"
+msgstr ""
+
msgid "Sign in"
msgstr "Oturum aç"
@@ -31072,6 +31532,9 @@ msgstr ""
msgid "Site profile not found for given parameters"
msgstr ""
+msgid "Sites"
+msgstr ""
+
msgid "Size"
msgstr ""
@@ -31102,19 +31565,22 @@ msgstr ""
msgid "SlackIntegration|Sends notifications about project events to Slack channels."
msgstr ""
-msgid "SlackService|2. Paste the %{strong_open}Token%{strong_close} into the field below"
+msgid "SlackService|1. %{slash_command_link_start}Add a slash command%{slash_command_link_end} in your Slack team using this information:"
msgstr ""
-msgid "SlackService|3. Select the %{strong_open}Active%{strong_close} checkbox, press %{strong_open}Save changes%{strong_close} and start using GitLab inside Slack!"
+msgid "SlackService|2. Paste the token from Slack in the %{strong_open}Token%{strong_close} field below."
msgstr ""
-msgid "SlackService|Fill in the word that works best for your team."
+msgid "SlackService|3. Select the %{strong_open}Active%{strong_close} checkbox, select %{strong_open}Save changes%{strong_close}, and start using slash commands in Slack!"
+msgstr ""
+
+msgid "SlackService|After setup, get a list of available Slack slash commands by entering"
msgstr ""
-msgid "SlackService|See list of available commands in Slack after setting up this service, by entering"
+msgid "SlackService|Fill in the word that works best for your team."
msgstr ""
-msgid "SlackService|This service allows users to perform common operations on this project by entering slash commands in Slack."
+msgid "SlackService|Perform common operations in this project by entering slash commands in Slack."
msgstr ""
msgid "Slice multiplier"
@@ -31180,7 +31646,7 @@ msgstr ""
msgid "Some child epics may be hidden due to applied filters"
msgstr ""
-msgid "Some common domains are not allowed. %{read_more_link}."
+msgid "Some common domains are not allowed. %{learn_more_link}."
msgstr ""
msgid "Some of the designs you tried uploading did not change:"
@@ -31264,9 +31730,6 @@ msgstr ""
msgid "Something went wrong while exporting requirements"
msgstr ""
-msgid "Something went wrong while fetching %{listType} list"
-msgstr ""
-
msgid "Something went wrong while fetching branches"
msgstr ""
@@ -31321,15 +31784,9 @@ msgstr ""
msgid "Something went wrong while merging this merge request. Please try again."
msgstr ""
-msgid "Something went wrong while moving issues."
-msgstr ""
-
msgid "Something went wrong while obtaining the Let's Encrypt certificate."
msgstr ""
-msgid "Something went wrong while performing the action."
-msgstr ""
-
msgid "Something went wrong while promoting the issue to an epic. Please try again."
msgstr ""
@@ -31657,7 +32114,10 @@ msgstr "%{linkStart}Sourcegraph.com%{linkEnd} kullanılır."
msgid "SourcegraphPreferences|Uses a custom %{linkStart}Sourcegraph instance%{linkEnd}."
msgstr "Özel bir %{linkStart}Sourcegraph örneği%{linkEnd} kullanılır."
-msgid "Spam Check API Key"
+msgid "Spam Check"
+msgstr ""
+
+msgid "Spam Check API key"
msgstr ""
msgid "Spam Logs"
@@ -31675,7 +32135,7 @@ msgstr ""
msgid "Specified URL cannot be used: \"%{reason}\""
msgstr ""
-msgid "Specify an e-mail address regex pattern to identify default internal users."
+msgid "Specify an email address regex pattern to identify default internal users."
msgstr ""
msgid "Speed up your pipelines with Needs relationships"
@@ -31930,7 +32390,7 @@ msgstr ""
msgid "StatusCheck|An error occurred fetching the status checks."
msgstr ""
-msgid "StatusCheck|Apply this status check to any branch or a specific protected branch."
+msgid "StatusCheck|Apply this status check to all branches or a specific protected branch."
msgstr ""
msgid "StatusCheck|Check for a status response in Merge Requests. Failures do not block merges. %{link_start}Learn more%{link_end}."
@@ -32269,6 +32729,9 @@ msgstr "Kullanım sayımı günde bir kez 12:00 ÖS yapılır."
msgid "Subscriptions"
msgstr ""
+msgid "Subscription|Your subscription for %{strong}%{namespace_name}%{strong_close} has expired and you are now on %{pricing_link_start}the GitLab Free tier%{pricing_link_end}. Don't worry, your data is safe. Get in touch with our support team (%{support_email}). They'll gladly help with your subscription renewal."
+msgstr ""
+
msgid "Subtracted"
msgstr ""
@@ -32497,6 +32960,9 @@ msgstr ""
msgid "SuperSonics|Plan"
msgstr ""
+msgid "SuperSonics|Please agree to the Subscription Agreement"
+msgstr ""
+
msgid "SuperSonics|Ready to get started? A GitLab plan is ideal for scaling organizations and for multi team usage."
msgstr ""
@@ -32527,6 +32993,9 @@ msgstr ""
msgid "SuperSonics|The activation code is not valid. Please make sure to copy it exactly from the Customers Portal or confirmation email. Learn more about %{linkStart}activating your subscription%{linkEnd}."
msgstr ""
+msgid "SuperSonics|The activation code should be a 24-character alphanumeric string"
+msgstr ""
+
msgid "SuperSonics|There is a connectivity issue."
msgstr ""
@@ -32569,9 +33038,15 @@ msgstr ""
msgid "SuperSonics|You do not have an active subscription"
msgstr ""
+msgid "SuperSonics|You have successfully added a license that activates on %{date}. Please see the subscription history table below for more details."
+msgstr ""
+
msgid "SuperSonics|You'll be charged for %{trueUpLinkStart}users over license%{trueUpLinkEnd} on a quarterly or annual basis, depending on the terms of your agreement."
msgstr ""
+msgid "SuperSonics|Your future dated license was successfully added"
+msgstr ""
+
msgid "SuperSonics|Your subscription"
msgstr ""
@@ -32824,7 +33299,7 @@ msgstr "Åžablon"
msgid "Template to append to all Service Desk issues"
msgstr ""
-msgid "TemplateRepository|Select a repository to make its templates available to all projects. %{link_start}What should the repository contain?%{link_end} "
+msgid "TemplateRepository|Create common files more quickly, and standardize their format."
msgstr ""
msgid "Templates"
@@ -33030,7 +33505,7 @@ msgstr ""
msgid "TestCases|Search test cases"
msgstr ""
-msgid "TestCases|Something went wrong while adding test case to Todo."
+msgid "TestCases|Something went wrong while adding test case to a to-do item."
msgstr ""
msgid "TestCases|Something went wrong while creating a test case."
@@ -33042,7 +33517,7 @@ msgstr ""
msgid "TestCases|Something went wrong while fetching test cases list."
msgstr ""
-msgid "TestCases|Something went wrong while marking test case todo as done."
+msgid "TestCases|Something went wrong while marking test case to-do item as done."
msgstr ""
msgid "TestCases|Something went wrong while moving test case."
@@ -33162,7 +33637,7 @@ msgstr ""
msgid "Thanks for your purchase!"
msgstr ""
-msgid "That is ok, I do not want to renew"
+msgid "That's OK, I don't want to renew"
msgstr ""
msgid "That's it, well done!"
@@ -33185,7 +33660,7 @@ msgid_plural "The %{type} contains the following errors:"
msgstr[0] ""
msgstr[1] ""
-msgid "The API key used by GitLab for accessing the Spam Check service endpoint"
+msgid "The API key used by GitLab for accessing the Spam Check service endpoint."
msgstr ""
msgid "The GitLab subscription service (customers.gitlab.com) is currently experiencing an outage. You can monitor the status and get updates at %{linkStart}status.gitlab.com%{linkEnd}."
@@ -33224,9 +33699,6 @@ msgstr ""
msgid "The URL to use for connecting to Elasticsearch. Use a comma-separated list to support clustering (e.g., \"http://localhost:9200, http://localhost:9201\")."
msgstr ""
-msgid "The Vulnerability Report shows the results of the last successful pipeline run on the default branch."
-msgstr ""
-
msgid "The X509 Certificate to use when mutual TLS is required to communicate with the external authorization service. If left blank, the server certificate is still validated when accessing over HTTPS."
msgstr ""
@@ -33284,9 +33756,6 @@ msgstr ""
msgid "The default branch for this project has been changed. Please update your bookmarks."
msgstr ""
-msgid "The default expiration time for job artifacts. 0 for unlimited. The default unit is in seconds, but you can use other units, for example %{code_open}4 mins 2 sec%{code_close}, %{code_open}2h42min%{code_close}."
-msgstr ""
-
msgid "The dependency list details information about the components used within your project."
msgstr ""
@@ -33478,9 +33947,6 @@ msgstr ""
msgid "The merge conflicts for this merge request have already been resolved. Please return to the merge request."
msgstr ""
-msgid "The merge request can now be merged."
-msgstr "Birleştirme isteği artık birleştirilebilir."
-
msgid "The metric must be one of %{metrics}."
msgstr ""
@@ -33856,7 +34322,7 @@ msgstr ""
msgid "There was a problem updating the keep latest artifacts setting."
msgstr ""
-msgid "There was an error %{message} todo."
+msgid "There was an error %{message} to-do item."
msgstr ""
msgid "There was an error adding a To Do."
@@ -33895,6 +34361,9 @@ msgstr ""
msgid "There was an error fetching projects"
msgstr ""
+msgid "There was an error fetching search autocomplete suggestions"
+msgstr ""
+
msgid "There was an error fetching stage total counts"
msgstr ""
@@ -34219,6 +34688,9 @@ msgstr ""
msgid "This field is required."
msgstr ""
+msgid "This form is disabled in preview"
+msgstr ""
+
msgid "This group"
msgstr "Bu grup"
@@ -34240,9 +34712,6 @@ msgstr ""
msgid "This group is linked to a subscription"
msgstr ""
-msgid "This group, including all subgroups, projects and git repositories, will be reachable from only the specified IP address ranges."
-msgstr ""
-
msgid "This group, its subgroups and projects has been scheduled for removal on %{date}."
msgstr ""
@@ -34522,9 +34991,6 @@ msgstr ""
msgid "This user cannot be unlocked manually from GitLab"
msgstr ""
-msgid "This user does not have a pending request"
-msgstr ""
-
msgid "This user has an unconfirmed email address (%{email}). You may force a confirmation."
msgstr ""
@@ -34633,9 +35099,6 @@ msgstr ""
msgid "ThreatMonitoring|Packet Activity"
msgstr ""
-msgid "ThreatMonitoring|Policies"
-msgstr ""
-
msgid "ThreatMonitoring|Requests"
msgstr ""
@@ -34687,6 +35150,12 @@ msgstr ""
msgid "ThreatMonitoring|View documentation"
msgstr ""
+msgid "Threshold in bytes at which to compress Sidekiq job arguments."
+msgstr ""
+
+msgid "Threshold in bytes at which to reject Sidekiq jobs. Set this to 0 to if you don't want to limit Sidekiq jobs."
+msgstr ""
+
msgid "Throughput"
msgstr ""
@@ -34696,6 +35165,9 @@ msgstr ""
msgid "Time"
msgstr "Zaman"
+msgid "Time (in hours) that users are allowed to skip forced configuration of two-factor authentication."
+msgstr ""
+
msgid "Time Spent"
msgstr ""
@@ -34762,7 +35234,7 @@ msgstr "Saat dilimi"
msgid "TimeTrackingEstimated|Est"
msgstr "Tah"
-msgid "TimeTracking|%{startTag}Spent: %{endTag}%{timeSpentHumanReadable}"
+msgid "TimeTracking|%{spentStart}Spent: %{spentEnd}"
msgstr ""
msgid "TimeTracking|Estimated:"
@@ -34976,6 +35448,9 @@ msgstr ""
msgid "To access this domain create a new DNS record"
msgstr ""
+msgid "To add a custom suffix, set up a Service Desk email address. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "To add an SSH key you need to %{generate_link_start}generate one%{link_end} or use an %{existing_link_start}existing key%{link_end}."
msgstr ""
@@ -34997,13 +35472,16 @@ msgstr ""
msgid "To connect an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To continue using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
+msgstr ""
+
msgid "To continue, you need to select the link in the confirmation email we sent to verify your email address. If you didn't get our email, select %{strongStart}Resend confirmation email.%{strongEnd}"
msgstr ""
msgid "To define internal users, first enable new users set to external"
msgstr ""
-msgid "To enable Registration Features, make sure \"Enable service ping\" is checked."
+msgid "To enable Registration Features, first enable Service Ping."
msgstr ""
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
@@ -35030,7 +35508,7 @@ msgstr ""
msgid "To get started, use the link below to confirm your account."
msgstr ""
-msgid "To help improve GitLab and its user experience, GitLab will periodically collect usage information."
+msgid "To help improve GitLab and its user experience, GitLab periodically collects usage information."
msgstr ""
msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
@@ -35063,7 +35541,7 @@ msgstr ""
msgid "To preserve performance only %{strong_open}%{display_size} of %{real_size}%{strong_close} files are displayed."
msgstr ""
-msgid "To protect this issue's confidentiality, %{forkLink} and set the fork's visibility to private."
+msgid "To protect this issue's confidentiality, %{linkStart}fork this project%{linkEnd} and set the fork's visibility to private."
msgstr ""
msgid "To protect this issue's confidentiality, a private fork of this project was selected."
@@ -35096,12 +35574,15 @@ msgstr ""
msgid "To set up SAML authentication for your group through an identity provider like Azure, Okta, Onelogin, Ping Identity, or your custom SAML 2.0 provider:"
msgstr ""
-msgid "To set up this service:"
+msgid "To set up this integration:"
msgstr ""
msgid "To specify the notification level per project of a group you belong to, you need to visit project page and change notification level there."
msgstr "Ait olduğunuz bir grubun proje başına bildirim seviyesini belirlemek için proje sayfasını ziyaret etmeniz ve orada bildirim seviyesini değiştirmeniz gerekir."
+msgid "To start using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
+msgstr ""
+
msgid "To unsubscribe from this issue, please paste the following link into your browser:"
msgstr ""
@@ -35689,9 +36170,6 @@ msgstr ""
msgid "Unable to fetch branches list, please close the form and try again"
msgstr ""
-msgid "Unable to fetch unscanned projects"
-msgstr ""
-
msgid "Unable to fetch vulnerable projects"
msgstr ""
@@ -35746,6 +36224,15 @@ msgstr "Bu epik şu anda güncellenemiyor."
msgid "Unable to update this issue at this time."
msgstr ""
+msgid "Unapprove a merge request"
+msgstr ""
+
+msgid "Unapprove the current merge request."
+msgstr ""
+
+msgid "Unapproved the current merge request."
+msgstr ""
+
msgid "Unarchive project"
msgstr ""
@@ -35758,16 +36245,13 @@ msgstr ""
msgid "Unassigned"
msgstr ""
-msgid "Unauthenticated API request rate limit"
-msgstr ""
-
-msgid "Unauthenticated rate limit period in seconds"
+msgid "Unauthenticated API rate limit period in seconds"
msgstr ""
-msgid "Unauthenticated request rate limit"
+msgid "Unauthenticated requests"
msgstr ""
-msgid "Unauthenticated requests"
+msgid "Unauthenticated web rate limit period in seconds"
msgstr ""
msgid "Undo"
@@ -35869,18 +36353,6 @@ msgstr ""
msgid "Unresolved"
msgstr ""
-msgid "UnscannedProjects|15 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|30 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|5 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|60 or more days"
-msgstr ""
-
msgid "Unschedule job"
msgstr ""
@@ -36100,6 +36572,9 @@ msgstr "Kullanım istatistikleri"
msgid "UsageQuota|%{help_link_start}Shared runners%{help_link_end} are disabled, so there are no limits set on pipeline usage"
msgstr ""
+msgid "UsageQuota|%{linkTitle} help link"
+msgstr ""
+
msgid "UsageQuota|%{percentageLeft} of purchased storage is available"
msgstr ""
@@ -36109,6 +36584,9 @@ msgstr ""
msgid "UsageQuota|Artifacts is a sum of build and pipeline artifacts."
msgstr ""
+msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
+msgstr ""
+
msgid "UsageQuota|Buy additional minutes"
msgstr "Ek dakika satın al"
@@ -36118,9 +36596,21 @@ msgstr ""
msgid "UsageQuota|CI minutes usage by project"
msgstr ""
+msgid "UsageQuota|Code packages and container images."
+msgstr ""
+
msgid "UsageQuota|Current period usage"
msgstr "Mevcut dönem kullanımı"
+msgid "UsageQuota|File attachments and smaller design graphics."
+msgstr ""
+
+msgid "UsageQuota|Git repository, managed by the Gitaly service."
+msgstr ""
+
+msgid "UsageQuota|Includes project registry, artifacts, packages, wiki, uploads and other items."
+msgstr ""
+
msgid "UsageQuota|Increase storage temporarily"
msgstr ""
@@ -36139,6 +36629,9 @@ msgstr ""
msgid "UsageQuota|Packages"
msgstr "Paketler"
+msgid "UsageQuota|Pipeline artifacts and job artifacts, created with CI/CD."
+msgstr ""
+
msgid "UsageQuota|Pipelines"
msgstr "İş hatları"
@@ -36157,6 +36650,9 @@ msgstr "Depo"
msgid "UsageQuota|Seats"
msgstr ""
+msgid "UsageQuota|Shared bits of code and text."
+msgstr ""
+
msgid "UsageQuota|Snippets"
msgstr "Parçacıklar"
@@ -36166,6 +36662,12 @@ msgstr ""
msgid "UsageQuota|Storage"
msgstr "Depolama"
+msgid "UsageQuota|Storage type"
+msgstr ""
+
+msgid "UsageQuota|There is a known issue with Artifact storage where the total could be incorrect for some projects. More details and progress are available in %{warningLinkStart}the epic%{warningLinkEnd}."
+msgstr ""
+
msgid "UsageQuota|This is the total amount of storage used across your projects within this namespace."
msgstr ""
@@ -36205,6 +36707,9 @@ msgstr ""
msgid "UsageQuota|Usage"
msgstr "Kullanım"
+msgid "UsageQuota|Usage Breakdown"
+msgstr ""
+
msgid "UsageQuota|Usage Quotas"
msgstr "Kullanım Kotaları"
@@ -36229,6 +36734,9 @@ msgstr ""
msgid "UsageQuota|Wiki"
msgstr "Viki"
+msgid "UsageQuota|Wiki content."
+msgstr ""
+
msgid "UsageQuota|Wikis"
msgstr "Viki"
@@ -36445,7 +36953,10 @@ msgstr ""
msgid "User Settings"
msgstr "Kullanıcı Ayarları"
-msgid "User and IP Rate Limits"
+msgid "User and IP rate limits"
+msgstr ""
+
+msgid "User does not have a pending request"
msgstr ""
msgid "User identity was successfully created."
@@ -36742,6 +37253,9 @@ msgstr "Kullanıcılar"
msgid "Users can launch a development environment from a GitLab browser tab when the %{linkStart}Gitpod%{linkEnd} integration is enabled."
msgstr ""
+msgid "Users can reactivate their account by signing in."
+msgstr ""
+
msgid "Users can render diagrams in AsciiDoc, Markdown, reStructuredText, and Textile documents using Kroki."
msgstr ""
@@ -36757,6 +37271,9 @@ msgstr ""
msgid "Users requesting access to"
msgstr ""
+msgid "Users to exclude from the rate limit"
+msgstr ""
+
msgid "Users were successfully added."
msgstr ""
@@ -36778,6 +37295,9 @@ msgstr "Vekil yok - %{openingTag} kendinizi atayın %{closingTag}"
msgid "UsersSelect|Unassigned"
msgstr ""
+msgid "Uses GitLab as a lightweight alternative to Sentry."
+msgstr ""
+
msgid "Using %{code_start}::%{code_end} denotes a %{link_start}scoped label set%{link_end}"
msgstr ""
@@ -36808,10 +37328,7 @@ msgstr "Değer Akışı Analizleri"
msgid "Value Stream Analytics can help you determine your team’s velocity"
msgstr ""
-msgid "Value Stream Analytics gives an overview of how much time it takes to go from idea to production in your project."
-msgstr ""
-
-msgid "Value may contain a variable reference"
+msgid "Value might contain a variable reference"
msgstr ""
msgid "Value stream"
@@ -36877,10 +37394,10 @@ msgstr ""
msgid "ValueStream|The Default Value Stream cannot be deleted"
msgstr ""
-msgid "Variable"
+msgid "Values that contain the %{codeStart}$%{codeEnd} character can be considered a variable reference and expanded. %{docsLinkStart}Learn more.%{docsLinkEnd}"
msgstr ""
-msgid "Variable references indicated by %{codeStart}$%{codeEnd} may be expanded. If this is not what you want, consider %{docsLinkStart}using a workaround to prevent expansion%{docsLinkEnd}."
+msgid "Variable"
msgstr ""
msgid "Variable will be masked in job logs."
@@ -37285,6 +37802,9 @@ msgstr ""
msgid "Vulnerability|Evidence"
msgstr ""
+msgid "Vulnerability|False positive detected"
+msgstr ""
+
msgid "Vulnerability|File"
msgstr "Dosya"
@@ -37327,6 +37847,9 @@ msgstr ""
msgid "Vulnerability|Status"
msgstr ""
+msgid "Vulnerability|The scanner determined this vulnerability to be a false positive. Verify the evaluation before changing its status. %{linkStart}Learn more about false positive detection.%{linkEnd}"
+msgstr ""
+
msgid "Vulnerability|The unmodified response is the original response that had no mutations done to the request"
msgstr ""
@@ -37651,9 +38174,6 @@ msgstr ""
msgid "Welcome to GitLab,%{br_tag}%{name}!"
msgstr ""
-msgid "Welcome to the guided GitLab tour"
-msgstr ""
-
msgid "Welcome, %{name}!"
msgstr ""
@@ -37672,9 +38192,6 @@ msgstr ""
msgid "What are you searching for?"
msgstr ""
-msgid "What describes you best?"
-msgstr ""
-
msgid "What does this command do?"
msgstr ""
@@ -37696,15 +38213,15 @@ msgstr ""
msgid "What is your job title? (optional)"
msgstr "İş ünvanınız nedir? (isteğe bağlı)"
+msgid "What templates can I create?"
+msgstr ""
+
msgid "What will you use this group for?"
msgstr ""
msgid "What's new"
msgstr "Yenilikler"
-msgid "What’s your experience level?"
-msgstr ""
-
msgid "When a deployment job is successful, skip older deployment jobs that are still pending."
msgstr ""
@@ -37714,6 +38231,9 @@ msgstr ""
msgid "When an event in GitLab triggers a webhook, you can use the request details to figure out if something went wrong."
msgstr ""
+msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+msgstr ""
+
msgid "When inactive, an external authentication provider must be used."
msgstr ""
@@ -37737,6 +38257,9 @@ msgstr ""
msgid "When:"
msgstr ""
+msgid "Which API requests are affected?"
+msgstr ""
+
msgid "While it's rare to have no vulnerabilities, it can happen. In any event, we ask that you please double check your settings to make sure you've set up your dashboard correctly."
msgstr ""
@@ -38016,6 +38539,9 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|Work Items"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -38091,6 +38617,9 @@ msgstr ""
msgid "You are already a member of this %{member_source}."
msgstr ""
+msgid "You are already impersonating another user"
+msgstr ""
+
msgid "You are an admin, which means granting access to %{client_name} will allow them to interact with GitLab as an admin as well. Proceed with caution."
msgstr ""
@@ -38193,6 +38722,9 @@ msgstr ""
msgid "You can also use project access tokens with Git to authenticate over HTTP(S). %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "You can always change your URL later"
+msgstr ""
+
msgid "You can always edit this later"
msgstr ""
@@ -38349,10 +38881,10 @@ msgstr "Bu salt okunur GitLab örneğine yazamazsınız."
msgid "You can’t %{tag_start}edit%{tag_end} files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
-msgid "You could not create a new trigger."
+msgid "You can’t edit files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
-msgid "You didn't renew your subscription for %{strong}%{namespace_name}%{strong_close} so it was downgraded to the free plan."
+msgid "You could not create a new trigger."
msgstr ""
msgid "You do not have any subscriptions yet"
@@ -38520,6 +39052,12 @@ msgstr "Geçerli bir mevcut şifre girmelisiniz"
msgid "You must provide your current password in order to change it."
msgstr "Değiştirmek için mevcut şifrenizi girmelisiniz."
+msgid "You must sign in to search for specific projects."
+msgstr ""
+
+msgid "You must sign in to search for specific terms."
+msgstr ""
+
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
@@ -38547,6 +39085,9 @@ msgstr ""
msgid "You need to upload a GitLab project export archive (ending in .gz)."
msgstr ""
+msgid "You need to verify your primary email first before enabling Two-Factor Authentication."
+msgstr ""
+
msgid "You successfully declined the invitation"
msgstr ""
@@ -38655,10 +39196,10 @@ msgstr ""
msgid "Your %{host} account was signed in to from a new location"
msgstr "%{host} hesabınıza yeni bir konumdan giriş yapıldı"
-msgid "Your %{strong}%{plan_name}%{strong_close} subscription for %{strong}%{namespace_name}%{strong_close} will expire on %{strong}%{expires_on}%{strong_close}."
+msgid "Your %{strong}%{plan_name}%{strong_close} subscription expires on %{strong}%{expires_on}%{strong_close}. After that date, you cannot create issues or merge requests, or use many other features."
msgstr ""
-msgid "Your %{strong}%{plan_name}%{strong_close} subscription will expire on %{strong}%{expires_on}%{strong_close}. After that, you will not be able to create issues or merge requests as well as many other features."
+msgid "Your %{strong}%{plan_name}%{strong_close} subscription for %{strong}%{namespace_name}%{strong_close} will expire on %{strong}%{expires_on}%{strong_close}."
msgstr ""
msgid "Your CI/CD configuration syntax is invalid. View Lint tab for more details."
@@ -38682,7 +39223,7 @@ msgstr ""
msgid "Your GPG keys (%{count})"
msgstr ""
-msgid "Your GitLab account has been locked due to an excessive amount of unsuccessful sign in attempts. Your account will automatically unlock in %{duration} or you may click the link below to unlock now."
+msgid "Your GitLab account has been locked due to an excessive number of unsuccessful sign in attempts. You can wait for your account to automatically unlock in %{duration} or you can click the link below to unlock now."
msgstr ""
msgid "Your GitLab account request has been approved!"
@@ -38793,6 +39334,9 @@ msgstr ""
msgid "Your commit email is used for web based operations, such as edits and merges."
msgstr ""
+msgid "Your current password is required to register a two-factor authenticator app."
+msgstr ""
+
msgid "Your dashboard has been copied. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
@@ -38892,6 +39436,9 @@ msgstr "Profiliniz"
msgid "Your project limit is %{limit} projects! Please contact your administrator to increase it"
msgstr ""
+msgid "Your project will be created at:"
+msgstr ""
+
msgid "Your projects"
msgstr "Projeleriniz"
@@ -38931,11 +39478,10 @@ msgstr ""
msgid "Your subscription expired!"
msgstr "AboneliÄŸiniz sona erdi!"
-msgid "Your subscription has been downgraded."
-msgstr ""
-
-msgid "Your subscription will expire in %{remaining_days}."
-msgstr ""
+msgid "Your subscription will expire in %{remaining_days} day."
+msgid_plural "Your subscription will expire in %{remaining_days} days."
+msgstr[0] ""
+msgstr[1] ""
msgid "Your username is %{username}."
msgstr ""
@@ -39142,6 +39688,9 @@ msgstr ""
msgid "cannot merge"
msgstr "birleÅŸtirilemez"
+msgid "cannot not be used for user namespace"
+msgstr ""
+
msgid "ciReport|%{degradedNum} degraded"
msgstr ""
@@ -39465,6 +40014,9 @@ msgstr "Jira'da %{user} tarafından %{timeAgoString} oluşturuldu"
msgid "created %{timeAgo}"
msgstr "%{timeAgo} oluÅŸturuldu"
+msgid "created %{timeAgo} by %{author}"
+msgstr ""
+
msgid "created by"
msgstr ""
@@ -39509,9 +40061,6 @@ msgstr ""
msgid "does not have a supported extension. Only %{extension_list} are supported"
msgstr ""
-msgid "domain is not authorized for sign-up."
-msgstr ""
-
msgid "download it"
msgstr ""
@@ -39529,18 +40078,13 @@ msgstr ""
msgid "email '%{email}' is not a verified email."
msgstr ""
-msgid "email does not match the allowed domain of %{email_domains}"
-msgid_plural "email does not match the allowed domains: %{email_domains}"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "enabled"
msgstr "etkin"
msgid "encrypted: needs to be a :required, :optional or :migrating!"
msgstr ""
-msgid "ending with MIME type format is not allowed."
+msgid "ending with a reserved file extension is not allowed."
msgstr ""
msgid "entries cannot be larger than 255 characters"
@@ -39564,6 +40108,9 @@ msgstr "hata"
msgid "estimateCommand|%{slash_command} overwrites the total estimated time."
msgstr ""
+msgid "example.com"
+msgstr ""
+
msgid "exceeds the limit of %{bytes} bytes"
msgstr ""
@@ -39614,9 +40161,6 @@ msgstr "bu proje için"
msgid "fork"
msgstr ""
-msgid "fork this project"
-msgstr "projeyi çatalla"
-
msgid "from"
msgstr ""
@@ -39625,6 +40169,9 @@ msgid_plural "from %d jobs"
msgstr[0] ""
msgstr[1] ""
+msgid "frontmatter"
+msgstr ""
+
msgid "group"
msgstr "grup"
@@ -39652,6 +40199,9 @@ msgstr ""
msgid "has been completed."
msgstr ""
+msgid "has too deep level of nesting"
+msgstr ""
+
msgid "help"
msgstr "yardım"
@@ -39685,9 +40235,21 @@ msgstr "içe aktarım akışı"
msgid "in"
msgstr ""
+msgid "in Infrastructure :: Kubernetes clusters"
+msgstr ""
+
+msgid "in all GitLab"
+msgstr ""
+
+msgid "in group"
+msgstr ""
+
msgid "in group %{link_to_group}"
msgstr ""
+msgid "in project"
+msgstr ""
+
msgid "in project %{link_to_project}"
msgstr ""
@@ -39729,16 +40291,19 @@ msgstr ""
msgid "is not a valid X509 certificate."
msgstr ""
-msgid "is not allowed since the group is not top-level group."
+msgid "is not allowed for sign-up."
msgstr ""
-msgid "is not allowed. Try again with a different email address, or contact your GitLab admin."
+msgid "is not allowed for this group."
msgstr ""
-msgid "is not allowed. We do not currently support project-level iterations"
+msgid "is not allowed for this project."
+msgstr ""
+
+msgid "is not allowed since the group is not top-level group."
msgstr ""
-msgid "is not from an allowed domain."
+msgid "is not allowed. We do not currently support project-level iterations"
msgstr ""
msgid "is not in the group enforcing Group Managed Account"
@@ -39831,6 +40396,9 @@ msgstr "%{path_lock_user_name} tarafından kilitlendi %{created_at}"
msgid "log in"
msgstr "oturum aç"
+msgid "managed"
+msgstr ""
+
msgid "manual"
msgstr ""
@@ -39878,6 +40446,9 @@ msgstr ""
msgid "mrWidget| Please restore it or use a different %{missingBranchName} branch"
msgstr ""
+msgid "mrWidget|%{linkStart}Set up now%{linkEnd} to analyze your source code for known security vulnerabilities."
+msgstr ""
+
msgid "mrWidget|%{mergeError}."
msgstr ""
@@ -39958,6 +40529,9 @@ msgid_plural "mrWidget|Closes issues"
msgstr[0] ""
msgstr[1] ""
+msgid "mrWidget|Create issue to resolve all threads"
+msgstr ""
+
msgid "mrWidget|Delete source branch"
msgstr "Kaynak dalı sil"
@@ -39967,12 +40541,18 @@ msgstr ""
msgid "mrWidget|Did not close"
msgstr "Kapatılmadı"
+msgid "mrWidget|Dismiss"
+msgstr ""
+
msgid "mrWidget|Email patches"
msgstr "E-posta yamaları"
msgid "mrWidget|Failed to load deployment statistics"
msgstr ""
+msgid "mrWidget|Hide %{widget} details"
+msgstr ""
+
msgid "mrWidget|If the %{missingBranchName} branch exists in your local repository, you can merge this merge request manually using the command line"
msgstr ""
@@ -40068,9 +40648,6 @@ msgstr "Birleştirme treninden kaldır"
msgid "mrWidget|Request to merge"
msgstr "BirleÅŸtirme isteÄŸi"
-msgid "mrWidget|Resolve all threads in new issue"
-msgstr ""
-
msgid "mrWidget|Resolve conflicts"
msgstr "Çakışmaları çöz"
@@ -40086,6 +40663,9 @@ msgstr ""
msgid "mrWidget|Revoke approval"
msgstr "Onayı iptal et"
+msgid "mrWidget|SAST and Secret Detection is not enabled."
+msgstr ""
+
msgid "mrWidget|Set by %{merge_author} to be added to the merge train when the pipeline succeeds"
msgstr ""
@@ -40095,6 +40675,9 @@ msgstr ""
msgid "mrWidget|Set by %{merge_author} to start a merge train when the pipeline succeeds"
msgstr ""
+msgid "mrWidget|Show %{widget} details"
+msgstr ""
+
msgid "mrWidget|The changes were merged into"
msgstr ""
@@ -40107,6 +40690,9 @@ msgstr ""
msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure, or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
msgstr ""
+msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure."
+msgstr ""
+
msgid "mrWidget|The source branch has been deleted"
msgstr "Kaynak dal silindi"
@@ -40149,6 +40735,9 @@ msgstr ""
msgid "mrWidget|You can merge after removing denied licenses"
msgstr ""
+msgid "mrWidget|You can only merge once this merge request is approved."
+msgstr ""
+
msgid "mrWidget|Your password"
msgstr "Åžifreniz"
@@ -40185,6 +40774,9 @@ msgstr ""
msgid "must be less than the limit of %{tag_limit} tags"
msgstr ""
+msgid "must be set for a project namespace"
+msgstr ""
+
msgid "must be unique by status and elapsed time within a policy"
msgstr ""
@@ -40294,6 +40886,9 @@ msgstr ""
msgid "pipeline"
msgstr "iş hattı"
+msgid "pipeline schedules documentation"
+msgstr ""
+
msgid "pod_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
msgstr ""
@@ -40343,16 +40938,25 @@ msgstr ""
msgid "project name"
msgstr ""
+msgid "project namespace cannot be the parent of another namespace"
+msgstr ""
+
msgid "projects"
msgstr ""
msgid "quick actions"
msgstr "hızlı işlemler"
-msgid "reCAPTCHA Private Key"
+msgid "reCAPTCHA"
+msgstr ""
+
+msgid "reCAPTCHA helps prevent credential stuffing."
msgstr ""
-msgid "reCAPTCHA Site Key"
+msgid "reCAPTCHA private key"
+msgstr ""
+
+msgid "reCAPTCHA site key"
msgstr ""
msgid "recent activity"
@@ -40579,6 +41183,9 @@ msgstr ""
msgid "user avatar"
msgstr "kullanıcının profil resmi"
+msgid "user namespace cannot be the parent of another namespace"
+msgstr ""
+
msgid "user preferences"
msgstr ""
@@ -40671,3 +41278,9 @@ msgstr "yaml geçersiz"
msgid "your settings"
msgstr ""
+msgid "{group}"
+msgstr ""
+
+msgid "{project}"
+msgstr ""
+
diff --git a/locale/uk/gitlab.po b/locale/uk/gitlab.po
index 7eadbcca8b7..d6f1419d28e 100644
--- a/locale/uk/gitlab.po
+++ b/locale/uk/gitlab.po
@@ -14,10 +14,7 @@ msgstr ""
"X-Crowdin-Language: uk\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-09-01 22:32\n"
-
-msgid " %{name}, confirm your email address now! "
-msgstr " %{name}, підтвердьте Ñвою адреÑу електронної пошти зараз! "
+"PO-Revision-Date: 2021-10-04 20:20\n"
msgid " %{start} to %{end}"
msgstr " %{start} до %{end}"
@@ -96,6 +93,20 @@ msgstr "Параметр \"el\" необхідний Ð´Ð»Ñ createInstance()"
msgid "#general, #development"
msgstr ""
+msgid "%d Alert"
+msgid_plural "%d Alerts"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
+msgid "%d Alert:"
+msgid_plural "%d Alerts:"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "%d Approval"
msgid_plural "%d Approvals"
msgstr[0] "%d ЗатвердженнÑ"
@@ -591,8 +602,11 @@ msgstr "%{code_open}ЗамаÑковано:%{code_close} Сховано в жуÑ
msgid "%{code_open}Protected:%{code_close} Only exposed to protected branches or tags."
msgstr "%{code_open}Захищений:%{code_close} Відкритий лише захищеними гілками або тегами."
-msgid "%{commit_author_link} authored %{commit_timeago}"
-msgstr "%{commit_author_link} закомітив %{commit_timeago}"
+msgid "%{commit_author_link} authored %{commit_authored_timeago}"
+msgstr ""
+
+msgid "%{commit_author_link} authored %{commit_authored_timeago} and %{commit_committer_avatar} %{commit_committer_link} committed %{commit_committer_timeago}"
+msgstr ""
msgid "%{completedCount} completed weight"
msgstr "%{completedCount} заповнена вага"
@@ -669,7 +683,7 @@ msgid "%{count} related %{pluralized_subject}: %{links}"
msgstr "%{count} пов’Ñзаних %{pluralized_subject}: %{links}"
msgid "%{count} selected"
-msgstr ""
+msgstr "Вибрано: %{count}"
msgid "%{count} total weight"
msgstr "%{count} загальна вага"
@@ -695,6 +709,15 @@ msgstr "%{doc_link_start}Розширений пошук%{doc_link_end} вимк
msgid "%{doc_link_start}Advanced search%{doc_link_end} is enabled."
msgstr "%{doc_link_start}Розширений пошук%{doc_link_end} увімкнено."
+msgid "%{docs_link_start}Learn about visibility levels.%{docs_link_end}"
+msgstr ""
+
+msgid "%{docs_link_start}What is Large File Storage?%{docs_link_end}"
+msgstr ""
+
+msgid "%{docs_link_start}What is two-factor authentication?%{docs_link_end}"
+msgstr ""
+
msgid "%{due_date} (Past due)"
msgstr "%{due_date} (з проÑтроченнÑм)"
@@ -759,7 +782,7 @@ msgid "%{host} sign-in from new location"
msgstr "вхід на %{host} з нового розташуваннÑ"
msgid "%{integrations_link_start}Integrations%{link_end} enable you to make third-party applications part of your GitLab workflow. If the available integrations don't meet your needs, consider using a %{webhooks_link_start}webhook%{link_end}."
-msgstr ""
+msgstr "%{integrations_link_start}Інтеграції%{link_end} дозволÑÑŽÑ‚ÑŒ зробити Ñторонні програми чаÑтиною вашого робочого процеÑу GitLab. Якщо наÑвні інтеграції не відповідають Вашим потребам, розглÑньте можливіÑÑ‚ÑŒ викориÑÑ‚Ð°Ð½Ð½Ñ %{webhooks_link_start}вебхуків (webhooks)%{link_end}."
msgid "%{issuableType} will be removed! Are you sure?"
msgstr "%{issuableType} буде видалено! Ви впевнені?"
@@ -767,9 +790,6 @@ msgstr "%{issuableType} буде видалено! Ви впевнені?"
msgid "%{issueType} actions"
msgstr "%{issueType} дії"
-msgid "%{issuesCount} issues with a limit of %{maxIssueCount}"
-msgstr "%{issuesCount} задач з обмеженнÑм %{maxIssueCount}"
-
msgid "%{issuesSize} with a limit of %{maxIssueCount}"
msgstr "%{issuesSize} з обмеженнÑм %{maxIssueCount}"
@@ -783,7 +803,7 @@ msgid "%{labelStart}Actual response:%{labelEnd} %{headers}"
msgstr "%{labelStart}Фактична відповідь:%{labelEnd} %{headers}"
msgid "%{labelStart}Assert:%{labelEnd} %{assertion}"
-msgstr ""
+msgstr "%{labelStart}СтвердженнÑ:%{labelEnd} %{assertion}"
msgid "%{labelStart}Class:%{labelEnd} %{class}"
msgstr "%{labelStart}КлаÑ:%{labelEnd} %{class}"
@@ -819,14 +839,20 @@ msgid "%{labelStart}Severity:%{labelEnd} %{severity}"
msgstr "%{labelStart}Рівень:%{labelEnd} %{severity}"
msgid "%{labelStart}Tool:%{labelEnd} %{reportType}"
-msgstr ""
+msgstr "%{labelStart}ІнÑтрумент:%{labelEnd} %{reportType}"
msgid "%{labelStart}Unmodified response:%{labelEnd} %{headers}"
-msgstr ""
+msgstr "%{labelStart}Ðезмінена відповідь:%{labelEnd} %{headers}"
msgid "%{label_for_message} unavailable"
msgstr "%{label_for_message} недоÑтупний"
+msgid "%{learn_more_link}."
+msgstr ""
+
+msgid "%{lessThan} 1 hour"
+msgstr ""
+
msgid "%{lets_encrypt_link_start}Let's Encrypt%{lets_encrypt_link_end} is a free, automated, and open certificate authority (CA) that issues digital certificates to enable HTTPS (SSL/TLS) for sites."
msgstr ""
@@ -839,15 +865,15 @@ msgstr "%{level_name} не допуÑкаєтьÑÑ, оÑкільки проєк
msgid "%{link_start}Learn more%{link_end} about roles."
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
-msgstr "%{link_start}ДізнатиÑÑ Ð±Ñ–Ð»ÑŒÑˆÐµ%{link_end} про те, Ñка Ñ–Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ Ð¿ÐµÑ€ÐµÐ´Ð°Ñ”Ñ‚ÑŒÑÑ GitLab Inc."
-
msgid "%{link_start}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} з назви , щоб зробити можливим Ð·Ð»Ð¸Ñ‚Ñ‚Ñ Ñ†ÑŒÐ¾Ð³Ð¾ запиту, коли він буде готовий."
msgid "%{link_start}Start the title with %{draft_snippet}%{link_end} to prevent a merge request that is a work in progress from being merged before it's ready."
msgstr ""
+msgid "%{link_start}What information does GitLab Inc. collect?%{link_end}"
+msgstr ""
+
msgid "%{listToShow}, and %{awardsListLength} more"
msgstr ""
@@ -996,10 +1022,10 @@ msgstr "%{seconds}Ñ"
msgid "%{securityScanner} is not enabled for this project. %{linkStart}More information%{linkEnd}"
msgid_plural "%{securityScanner} are not enabled for this project. %{linkStart}More information%{linkEnd}"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
+msgstr[0] "%{securityScanner} не увімкнено Ð´Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ проєкту. %{linkStart}Більше інформації%{linkEnd}"
+msgstr[1] "%{securityScanner} не увімкнено Ð´Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ проєкту. %{linkStart}Більше інформації%{linkEnd}"
+msgstr[2] "%{securityScanner} не увімкнено Ð´Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ проєкту. %{linkStart}Більше інформації%{linkEnd}"
+msgstr[3] "%{securityScanner} не активовано Ð´Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ проєкту. %{linkStart}більше інформації%{linkEnd}"
msgid "%{securityScanner} result is not available because a pipeline has not been run since it was enabled. %{linkStart}Run a pipeline%{linkEnd}"
msgid_plural "%{securityScanner} results are not available because a pipeline has not been run since it was enabled. %{linkStart}Run a pipeline%{linkEnd}"
@@ -1008,8 +1034,8 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-msgid "%{service_ping_link_start}Learn more%{service_ping_link_end} about what information is shared with GitLab Inc."
-msgstr "%{service_ping_link_start}ДізнатиÑÑ Ð±Ñ–Ð»ÑŒÑˆÐµ%{service_ping_link_end} про те, Ñка Ñ–Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ Ð¿ÐµÑ€ÐµÐ´Ð°Ñ”Ñ‚ÑŒÑÑ GitLab Inc."
+msgid "%{service_ping_link_start}What information is shared with GitLab Inc.?%{service_ping_link_end}"
+msgstr ""
msgid "%{size} %{unit}"
msgstr "%{size} %{unit}"
@@ -1044,6 +1070,9 @@ msgstr "%{start} до %{end}"
msgid "%{state} epics"
msgstr "%{state} епіки"
+msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
+msgstr ""
+
msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
msgstr ""
@@ -1117,13 +1146,6 @@ msgstr "%{tag}-%{evidence}-%{filename}"
msgid "%{template_project_id} is unknown or invalid"
msgstr "%{template_project_id} невідомий або неправильний"
-msgid "%{text} %{files}"
-msgid_plural "%{text} %{files} files"
-msgstr[0] "%{text} %{files}"
-msgstr[1] "%{text} %{files} файли"
-msgstr[2] "%{text} %{files} файлів"
-msgstr[3] "%{text} %{files} файлів"
-
msgid "%{text} is available"
msgstr "%{text} доÑтупний"
@@ -1208,11 +1230,8 @@ msgstr ""
msgid "%{wildcards_link_start}Wildcards%{wildcards_link_end} such as %{code_tag_start}v*%{code_tag_end} or %{code_tag_start}*-release%{code_tag_end} are supported."
msgstr ""
-msgid "&lt; 1 hour"
-msgstr "&lt; 1 година"
-
msgid "'%{data}' at %{location} does not match format: %{format}"
-msgstr ""
+msgstr "'%{data}' в %{location} не відповідає формату: %{format}"
msgid "'%{data}' at %{location} does not match pattern: %{pattern}"
msgstr "'%{data}' в %{location} не відповідає шаблону: %{pattern}"
@@ -1296,9 +1315,6 @@ msgstr "(відкликано)"
msgid "(we need your current password to confirm your changes)"
msgstr ""
-msgid "* * * * *"
-msgstr "* * * * *"
-
msgid "+ %{amount} more"
msgstr "+ %{amount} більше"
@@ -1371,12 +1387,12 @@ msgstr "- показати менше"
msgid "."
msgstr "."
+msgid "/"
+msgstr ""
+
msgid "0 bytes"
msgstr "0 байт"
-msgid "0 for unlimited, only effective with remote storage enabled."
-msgstr "0 Ð´Ð»Ñ Ð½ÐµÐ¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð¾Ð³Ð¾ запиÑу, ефективне лише Ð´Ð»Ñ ÑƒÐ²Ñ–Ð¼ÐºÐ½ÐµÐ½Ð¾Ð³Ð¾ віддаленого Ñховища."
-
msgid "0t1DgySidms"
msgstr "0t1DgySidms"
@@ -1550,6 +1566,9 @@ msgstr "10-19 внеÑків"
msgid "1000+"
msgstr "1000+"
+msgid "192.168.0.0/24"
+msgstr ""
+
msgid "1st contribution!"
msgstr "Перший внеÑок!"
@@ -1703,9 +1722,6 @@ msgstr ""
msgid "A plain HTML site that uses Netlify for CI/CD instead of GitLab, but still with all the other great GitLab features"
msgstr "Сайт на HTML, Ñкий викориÑтовує Netlify Ð´Ð»Ñ CI/CD заміÑÑ‚ÑŒ GitLab, але вÑе ще з уÑіма іншими чудовими функціÑми GitLab"
-msgid "A plain-text response to show to clients that hit the rate limit."
-msgstr ""
-
msgid "A platform value can be web, mob or app."
msgstr ""
@@ -1787,7 +1803,7 @@ msgstr ""
msgid "APIFuzzing|Configure HTTP basic authentication values. Other authentication methods are supported. %{linkStart}Learn more%{linkEnd}."
msgstr "ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð¾Ñновних значень автентифікації HTTP. ПідтримуютьÑÑ Ñ–Ð½ÑˆÑ– методи автентифікації. %{linkStart}Докладніше%{linkEnd}."
-msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
+msgid "APIFuzzing|Customize your project's API fuzzing configuration options and copy the code snippet to your .gitlab-ci.yml file to apply any changes. Note that this tool does not reflect or update your .gitlab-ci.yml file automatically. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
msgstr ""
msgid "APIFuzzing|Enable authentication"
@@ -1850,9 +1866,6 @@ msgstr ""
msgid "APIFuzzing|To prevent a security leak, authentication info must be added as a %{ciVariablesLinkStart}CI variable%{ciVariablesLinkEnd}. As a user with maintainer access rights, you can manage CI variables in the %{ciSettingsLinkStart}Settings%{ciSettingsLinkEnd} area."
msgstr ""
-msgid "APIFuzzing|Use this tool to generate API fuzzing configuration YAML to copy into your .gitlab-ci.yml file. This tool does not reflect or update your .gitlab-ci.yml file automatically."
-msgstr ""
-
msgid "APIFuzzing|Username for basic authentication"
msgstr ""
@@ -1904,9 +1917,6 @@ msgstr "Звіти про зловживаннÑ"
msgid "Abuse reports notification email"
msgstr ""
-msgid "Abuse reports will be sent to this address if it is set. Abuse reports are always available in the admin area."
-msgstr ""
-
msgid "Accept invitation"
msgstr "ПрийнÑти запрошеннÑ"
@@ -1943,12 +1953,18 @@ msgstr "ДоÑтуп заборонено. Перевірте рівень доÑ
msgid "Access granted"
msgstr "ДоÑтуп дозволено"
+msgid "Access key ID"
+msgstr ""
+
msgid "Access requests"
msgstr "Запити на доÑтуп"
msgid "Access to '%{classification_label}' not allowed"
msgstr "ДоÑтуп до \"%{classification_label}\" заборонено"
+msgid "Access tokens expire after 2 hours. A refresh token may be used at any time to generate a new access token. Non-expiring access tokens are deprecated. Clear this setting to enable backward compatibility."
+msgstr ""
+
msgid "AccessDropdown|Deploy Keys"
msgstr "Ключі Ð´Ð»Ñ Ñ€Ð¾Ð·Ð³Ð¾Ñ€Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ"
@@ -2217,7 +2233,7 @@ msgid "Add commit messages as comments to Pivotal Tracker stories. %{docs_link}"
msgstr ""
msgid "Add deploy freeze"
-msgstr ""
+msgstr "Додати Ð·Ð°Ð¼Ð¾Ñ€Ð¾Ð¶ÑƒÐ²Ð°Ð½Ð½Ñ Ñ€Ð¾Ð·Ð³Ð¾Ñ€Ñ‚Ð°Ð½Ð½Ñ"
msgid "Add deploy keys to grant read/write access to this repository. %{link_start}What are deploy keys?%{link_end}"
msgstr "Додайте ключі розгортаннÑ, щоб надати доÑтуп до читаннÑ/запиÑу цього репозиторію. %{link_start}Що таке ключі розгортаннÑ?%{link_end}"
@@ -2261,6 +2277,9 @@ msgstr "Додати новий додаток"
msgid "Add new directory"
msgstr "Додати новий каталог"
+msgid "Add new service account"
+msgstr ""
+
msgid "Add or remove previously merged commits"
msgstr "Ð”Ð¾Ð´Ð°Ð²Ð°Ð½Ð½Ñ Ð°Ð±Ð¾ Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ñ€Ð°Ð½Ñ–ÑˆÐµ злитих комітів"
@@ -2346,7 +2365,7 @@ msgid "AddMember|Invite email is invalid"
msgstr ""
msgid "AddMember|Invite limit of %{daily_invites} per day exceeded"
-msgstr ""
+msgstr "Перевищено ліміт запрошень: %{daily_invites} на день"
msgid "AddMember|No invite source provided."
msgstr ""
@@ -2397,13 +2416,13 @@ msgid "Additional text"
msgstr "Додатковий текÑÑ‚"
msgid "Additional text for the sign-in and Help page."
-msgstr ""
+msgstr "Додатковий текÑÑ‚ Ð´Ð»Ñ Ñторінок входу й довідки."
msgid "Additional text to show on the Help page"
-msgstr ""
+msgstr "Додатковий текÑÑ‚, що відображаєтьÑÑ Ð½Ð° Ñторінці довідки"
msgid "Additional text to show on the sign-in page"
-msgstr ""
+msgstr "Додатковий текÑÑ‚, що відображаєтьÑÑ Ð½Ð° Ñторінці входу"
msgid "Address"
msgstr "ÐдреÑа"
@@ -2472,13 +2491,13 @@ msgid "Admin notes"
msgstr "Ðотатки адмініÑтратора"
msgid "AdminArea|%{billable_users_link_start}Learn more%{billable_users_link_end} about what defines a billable user"
-msgstr ""
+msgstr "%{billable_users_link_start}ДізнайтеÑÑ Ð±Ñ–Ð»ÑŒÑˆÐµ%{billable_users_link_end} про те, що таке оплачуваний кориÑтувач"
msgid "AdminArea|Active users"
msgstr "Ðктивні кориÑтувачі"
msgid "AdminArea|All users created in the instance, including users who are not %{billable_users_link_start}billable users%{billable_users_link_end}."
-msgstr ""
+msgstr "Ð’ÑÑ– кориÑтувачі Ñтворили в інÑтанÑÑ–, включаючи кориÑтувачів , Ñкі не Ñ” %{billable_users_link_start}оплачувані кориÑтувачі%{billable_users_link_end}."
msgid "AdminArea|Billable users"
msgstr "Платні кориÑтувачі"
@@ -2498,6 +2517,9 @@ msgstr "Розробник"
msgid "AdminArea|Features"
msgstr "Функції"
+msgid "AdminArea|Get security updates from GitLab and stay up to date"
+msgstr ""
+
msgid "AdminArea|Groups"
msgstr "Групи"
@@ -2537,6 +2559,12 @@ msgstr "Проєкти"
msgid "AdminArea|Reporter"
msgstr "Репортер"
+msgid "AdminArea|Sign up for the GitLab Security Newsletter to get notified for security updates."
+msgstr ""
+
+msgid "AdminArea|Sign up for the GitLab newsletter"
+msgstr ""
+
msgid "AdminArea|Stop all jobs"
msgstr "Зупинити вÑÑ– завданнÑ"
@@ -2574,7 +2602,7 @@ msgid "AdminArea|View latest users"
msgstr "ПереглÑнути оÑтанніх кориÑтувачів"
msgid "AdminArea|You’re about to stop all jobs. This will halt all current jobs that are running."
-msgstr ""
+msgstr "Ви збираєтеÑÑ Ð·ÑƒÐ¿Ð¸Ð½Ð¸Ñ‚Ð¸ вÑÑ– завданнÑ. Ð’Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ Ð²ÑÑ–Ñ… запущених завдань буде перервано."
msgid "AdminDashboard|Error loading the statistics. Please try again"
msgstr "Помилка при завантаженні ÑтатиÑтики. Будь лаÑка, Ñпробуйте знову"
@@ -2606,9 +2634,15 @@ msgstr "Вимкнути токен Ð´Ð»Ñ ÐºÐ°Ð½Ð°Ð»Ñ–Ð²"
msgid "AdminSettings|Disable public access to Pages sites"
msgstr ""
+msgid "AdminSettings|Display a banner on merge requests in projects with no pipelines to initiate steps to add a .gitlab-ci.yml file."
+msgstr ""
+
msgid "AdminSettings|Domain verification is an essential security measure for public GitLab sites. Users are required to demonstrate they control a domain before it is enabled. %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "AdminSettings|Enable pipeline suggestion banner"
+msgstr ""
+
msgid "AdminSettings|Enable shared runners for new projects"
msgstr "Увімкнути загальні runner'и Ð´Ð»Ñ Ð½Ð¾Ð²Ð¸Ñ… проєктів"
@@ -2619,7 +2653,7 @@ msgid "AdminSettings|I have read and agree to the Let's Encrypt %{link_start}Ter
msgstr ""
msgid "AdminSettings|If not specified at the group or instance level, the default is %{default_initial_branch_name}. Does not affect existing repositories."
-msgstr ""
+msgstr "Якщо не вказано на рівні групи або інÑтанÑу, викориÑтовуєтьÑÑ Ñтандартне ім'Ñ %{default_initial_branch_name}. Ðе впливає на наÑвні репозиторії."
msgid "AdminSettings|Keep the latest artifacts for all jobs in the latest successful pipelines"
msgstr "Зберегти оÑтанні артефакти Ð´Ð»Ñ Ð²ÑÑ–Ñ… завдань в оÑтанніх уÑпішних конвеєрах"
@@ -2730,7 +2764,7 @@ msgid "AdminUsers|2FA Enabled"
msgstr "2FA увімкнено"
msgid "AdminUsers|A user can validate themselves by inputting a credit/debit card, or an admin can manually validate a user."
-msgstr ""
+msgstr "КориÑтувач може перевірити Ñебе, ввівши кредитну/дебетову картку, або адмініÑтратор може вручну перевірÑти кориÑтувача."
msgid "AdminUsers|Access"
msgstr "ДоÑтуп"
@@ -2811,7 +2845,7 @@ msgid "AdminUsers|Cohorts"
msgstr "Когорти"
msgid "AdminUsers|Confirm user"
-msgstr ""
+msgstr "Підтвердити кориÑтувача"
msgid "AdminUsers|Confirm user %{username}?"
msgstr ""
@@ -3080,10 +3114,10 @@ msgstr "Примітка"
msgid "Admin|Quarterly reconciliation will occur on %{qrtlyDate}"
msgstr ""
-msgid "Admin|The number of max seats used for your namespace is currently exceeding the number of seats in your subscription. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgid "Admin|The number of max seats in your namespace exceeds the number of seats in your subscription. On %{qrtlyDate}, quarterly reconciliation occurs and you are automatically billed a prorated amount for the overage. No action is needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice. For more information about the timing of the invoicing process, view the documentation."
msgstr ""
-msgid "Admin|The number of maximum users for your instance is currently exceeding the number of users in license. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgid "Admin|The number of max users in your instance exceeds the number of users in your license. On %{qrtlyDate}, quarterly reconciliation occurs and you are automatically billed a prorated amount for the overage. No action is needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice. For more information about the timing of the invoicing process, view the documentation."
msgstr ""
msgid "Admin|View pending user approvals"
@@ -3102,10 +3136,7 @@ msgid "Advanced Settings"
msgstr "Додаткові налаштуваннÑ"
msgid "Advanced export options"
-msgstr ""
-
-msgid "Advanced permissions, Large File Storage and Two-Factor authentication settings."
-msgstr "Додаткові дозволи, Ñховище великих файлів (LFS) Ñ– Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ð²Ð¾Ñ„Ð°ÐºÑ‚Ð¾Ñ€Ð½Ð¾Ñ— автентифікації."
+msgstr "Розширені параметри екÑпорту"
msgid "After a successful password update you will be redirected to login screen."
msgstr "ПіÑÐ»Ñ ÑƒÑпішного Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð¿Ð°Ñ€Ð¾Ð»Ñ Ð²Ð¸ перейдете на екран входу."
@@ -3125,15 +3156,14 @@ msgstr ""
msgid "After you've reviewed these contribution guidelines, you'll be all set to"
msgstr ""
+msgid "Akismet"
+msgstr ""
+
msgid "Akismet API Key"
msgstr ""
-msgid "Alert"
-msgid_plural "Alerts"
-msgstr[0] "ПопередженнÑ"
-msgstr[1] "ПопередженнÑ"
-msgstr[2] "Попереджень"
-msgstr[3] "Попереджень"
+msgid "Akismet helps prevent the creation of spam issues in public projects."
+msgstr ""
msgid "AlertManagement|Acknowledged"
msgstr ""
@@ -3355,7 +3385,7 @@ msgid "AlertSettings|Integration successfully saved"
msgstr ""
msgid "AlertSettings|Name integration"
-msgstr ""
+msgstr "Ð†Ð½Ñ‚ÐµÐ³Ñ€Ð°Ñ†Ñ–Ñ Ð· іменем"
msgid "AlertSettings|Parse payload fields"
msgstr ""
@@ -3489,6 +3519,9 @@ msgstr "Ð’ÑÑ– %{replicableType} заплановано на %{action}"
msgid "All (default)"
msgstr "Ð’ÑÑ– (за замовчуваннÑм)"
+msgid "All GitLab"
+msgstr ""
+
msgid "All Members"
msgstr "Ð’ÑÑ– учаÑники"
@@ -3535,7 +3568,7 @@ msgid "All threads resolved"
msgstr "УÑÑ– Ð¾Ð±Ð³Ð¾Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð²Ð¸Ñ€Ñ–ÑˆÐµÐ½Ð¾"
msgid "All users must accept the Terms of Service and Privacy Policy to access GitLab"
-msgstr ""
+msgstr "УÑÑ– кориÑтувачі мають прийнÑти умови Ð½Ð°Ð´Ð°Ð½Ð½Ñ Ð¿Ð¾Ñлуг Ñ– Ð¿Ð¾Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ Ð¿Ð¾Ð»Ñ–Ñ‚Ð¸ÐºÐ¸ конфіденційноÑÑ‚Ñ– Ð´Ð»Ñ Ð´Ð¾Ñтупу до GitLab"
msgid "All users must have a name."
msgstr "Ð’ÑÑ– кориÑтувачі повинні мати імена."
@@ -3547,7 +3580,7 @@ msgid "Allow access to members of the following group"
msgstr ""
msgid "Allow access to the following IP addresses"
-msgstr ""
+msgstr "Дозволити доÑтуп до таких IP-адреÑ"
msgid "Allow commits from members who can merge to the target branch."
msgstr "Дозволити коміти від учаÑників, Ñкі можуть зливати в цільову гілку."
@@ -3556,7 +3589,7 @@ msgid "Allow group owners to manage LDAP-related settings"
msgstr "Дозволити влаÑникам груп керувати налаштуваннÑми LDAP"
msgid "Allow non-administrators to access to the performance bar"
-msgstr ""
+msgstr "Дозволити кориÑтувачам без прав адмініÑтратора доÑтуп до панелі продуктивноÑÑ‚Ñ–"
msgid "Allow only the selected protocols to be used for Git access."
msgstr "Дозволити викориÑÑ‚Ð°Ð½Ð½Ñ Ñ‚Ñ–Ð»ÑŒÐºÐ¸ вибраних протоколів Ð´Ð»Ñ Ð´Ð¾Ñтупу до Git."
@@ -3603,6 +3636,9 @@ msgstr ""
msgid "Allow this secondary node to replicate content on Object Storage"
msgstr ""
+msgid "Allow use of licensed EE features"
+msgstr ""
+
msgid "Allow users to dismiss the broadcast message"
msgstr "Дозволити кориÑтувачам відхилÑти повідомленнÑ"
@@ -3658,7 +3694,7 @@ msgid "Also remove direct user membership from subgroups and projects"
msgstr ""
msgid "Also unassign this user from related issues and merge requests"
-msgstr ""
+msgstr "Також ÑкаÑуйте Ð¿Ñ€Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ñ†ÑŒÐ¾Ð³Ð¾ кориÑтувача з пов’Ñзаних задачами та запитами на злиттÑ"
msgid "Alternate support URL for Help page and Help dropdown."
msgstr ""
@@ -3678,9 +3714,6 @@ msgstr ""
msgid "Amazon authentication is not %{link_start}correctly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr "Amazon-автентифікацію не %{link_start}налаштовано коректно%{link_end}. ЗвернітьÑÑ Ð´Ð¾ вашого адмініÑтратора GitLab, Ñкщо хочете викориÑтовувати цю можливіÑÑ‚ÑŒ."
-msgid "Amount of time (in hours) that users are allowed to skip forced configuration of two-factor authentication"
-msgstr "Ð§Ð°Ñ (в годинах), впродовж Ñкого кориÑтувачам дозволено пропуÑкати примуÑове Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ð²Ð¾Ñ„Ð°ÐºÑ‚Ð¾Ñ€Ð½Ð¾Ñ— автентифікації"
-
msgid "An %{link_start}alert%{link_end} with the same fingerprint is already open. To change the status of this alert, resolve the linked alert."
msgstr ""
@@ -3741,12 +3774,6 @@ msgstr "СталаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ° під Ñ‡Ð°Ñ Ð¿Ð¾Ð¿ÐµÑ€ÐµÐ´Ð½ÑŒÐ¾Ð³Ð¾ пÐ
msgid "An error occurred when removing the label."
msgstr ""
-msgid "An error occurred when toggling the notification subscription"
-msgstr "Виникла помилка під Ñ‡Ð°Ñ Ð·Ð¼Ñ–Ð½Ð¸ підпиÑки на ÑповіщеннÑ"
-
-msgid "An error occurred when updating the issue weight"
-msgstr "Збій під Ñ‡Ð°Ñ Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð²Ð°Ð³Ð¸ задачі"
-
msgid "An error occurred when updating the title"
msgstr ""
@@ -3795,6 +3822,9 @@ msgstr ""
msgid "An error occurred while enabling Service Desk."
msgstr "СталаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ° під Ñ‡Ð°Ñ ÑƒÐ²Ñ–Ð¼ÐºÐ½ÐµÐ½Ð½Ñ Ð¡Ð»ÑƒÐ¶Ð±Ð¸ підтримки."
+msgid "An error occurred while fetching Markdown preview"
+msgstr ""
+
msgid "An error occurred while fetching ancestors"
msgstr ""
@@ -3825,9 +3855,6 @@ msgstr "Помилка при отриманні задач."
msgid "An error occurred while fetching label colors."
msgstr "Помилка при отриманні кольорів міток."
-msgid "An error occurred while fetching markdown preview"
-msgstr "СталаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ° при попередньому переглÑді markdown"
-
msgid "An error occurred while fetching participants"
msgstr ""
@@ -3843,9 +3870,6 @@ msgstr "Помилка при отриманні Ð°Ð²Ñ‚Ð¾Ð´Ð¾Ð¿Ð¾Ð²Ð½ÐµÐ½Ð½Ñ Ð¿
msgid "An error occurred while fetching reference"
msgstr ""
-msgid "An error occurred while fetching sidebar data"
-msgstr "Виникла помилка під Ñ‡Ð°Ñ Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ð´Ð°Ð½Ð¸Ñ… Ð´Ð»Ñ Ð±Ñ–Ñ‡Ð½Ð¾Ñ— панелі"
-
msgid "An error occurred while fetching tags. Retry the search."
msgstr ""
@@ -3921,6 +3945,9 @@ msgstr "Помилка при завантаженні задач"
msgid "An error occurred while loading merge requests."
msgstr "Помилка при завантаженні результатів злиттÑ."
+msgid "An error occurred while loading projects."
+msgstr ""
+
msgid "An error occurred while loading the Needs tab."
msgstr ""
@@ -4155,12 +4182,6 @@ msgstr "Будь-Ñкий автор"
msgid "Any Milestone"
msgstr ""
-msgid "Any branch"
-msgstr "Будь-Ñка гілка"
-
-msgid "Any eligible user"
-msgstr "Будь-Ñкий кориÑтувач з необхідним доÑтупом"
-
msgid "Any encrypted tokens"
msgstr "Будь-Ñкі зашифровані токени"
@@ -4179,6 +4200,9 @@ msgstr "Будь-Ñкий етап"
msgid "Any namespace"
msgstr "Будь-Ñкий проÑÑ‚Ñ–Ñ€ імен"
+msgid "App Engine description and apps that are suitable for this deployment target"
+msgstr ""
+
msgid "App ID"
msgstr "Ідентифікатор заÑтоÑунку"
@@ -4331,6 +4355,13 @@ msgstr "ЗаÑтоÑовано"
msgid "Apply"
msgstr "ЗаÑтоÑувати"
+msgid "Apply %d suggestion"
+msgid_plural "Apply %d suggestions"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "Apply a label"
msgstr "ЗаÑтоÑувати мітку"
@@ -4340,13 +4371,10 @@ msgstr "ЗаÑтоÑувати шаблон"
msgid "Apply suggestion"
msgstr "ЗаÑтоÑувати пропозицію"
-msgid "Apply suggestions"
-msgstr "ЗаÑтоÑувати пропозиції"
-
msgid "Apply template"
msgstr "ЗаÑтоÑувати шаблон"
-msgid "Apply this approval rule to any branch or a specific protected branch."
+msgid "Apply this approval rule to all branches or a specific protected branch."
msgstr ""
msgid "Applying"
@@ -4497,9 +4525,6 @@ msgstr ""
msgid "ApprovalSettings|Prevent editing approval rules in projects and merge requests."
msgstr ""
-msgid "ApprovalSettings|Prevent editing approval rules in projects and merge requests. "
-msgstr ""
-
msgid "ApprovalSettings|Remove all approvals when commits are added to the source branch."
msgstr ""
@@ -4515,6 +4540,9 @@ msgstr ""
msgid "ApprovalSettings|This setting is configured at the instance level and can only be changed by an administrator."
msgstr ""
+msgid "ApprovalSettings|This setting is configured in %{groupName} and can only be changed by an administrator or group owner."
+msgstr ""
+
msgid "ApprovalStatusTooltip|Adheres to separation of duties"
msgstr ""
@@ -4600,10 +4628,10 @@ msgid "Archiving the project will make it entirely read-only. It is hidden from
msgstr ""
msgid "Are you ABSOLUTELY SURE you wish to delete this project?"
-msgstr ""
+msgstr "Ви ÐБСОЛЮТÐО ВПЕВÐЕÐІ що бажаєте видалити цей проєкт?"
msgid "Are you ABSOLUTELY SURE you wish to remove this group?"
-msgstr ""
+msgstr "Ви ÐБСОЛЮТÐО ВПЕВÐЕÐІ що бажаєте видалити цю групу?"
msgid "Are you sure that you want to archive this project?"
msgstr "Ви впевнені, що хочете заархівувати цей проєкт?"
@@ -4688,7 +4716,7 @@ msgid "Are you sure you want to reindex?"
msgstr ""
msgid "Are you sure you want to remove %{email}?"
-msgstr ""
+msgstr "Ви впевнені, що хочете видалити %{email}?"
msgid "Are you sure you want to remove %{group_name}?"
msgstr "Ви впевнені, що хочете видалити %{group_name}?"
@@ -4697,7 +4725,7 @@ msgid "Are you sure you want to remove the attachment?"
msgstr "Ви впевнені, що бажаєте видалити вкладеннÑ?"
msgid "Are you sure you want to remove the license?"
-msgstr ""
+msgstr "Ви впевнені, що хочете видалити ліцензію?"
msgid "Are you sure you want to remove this deploy key? If anything is still using this key, it will stop working."
msgstr ""
@@ -4706,7 +4734,7 @@ msgid "Are you sure you want to remove this identity?"
msgstr "Ви впевнені, що хочете видалити цю ідентифікацію?"
msgid "Are you sure you want to remove this list?"
-msgstr ""
+msgstr "Ви впевнені, що хочете видалити цей ÑпиÑок?"
msgid "Are you sure you want to reset the SCIM token? SCIM provisioning will stop working until the new token is updated."
msgstr "Ви впевнені, що хочете Ñкинути токен SCIM? Ð’Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ SCIM переÑтане працювати доти, поки новий токен не буде оновлено."
@@ -5007,9 +5035,6 @@ msgstr "Ðвтентифікувати за допомогою GitHub"
msgid "Authenticated API rate limit period in seconds"
msgstr ""
-msgid "Authenticated API request rate limit"
-msgstr ""
-
msgid "Authenticated API requests"
msgstr ""
@@ -5019,10 +5044,10 @@ msgstr ""
msgid "Authenticated Git LFS request rate limit"
msgstr ""
-msgid "Authenticated web rate limit period in seconds"
+msgid "Authenticated Git LFS requests"
msgstr ""
-msgid "Authenticated web request rate limit"
+msgid "Authenticated web rate limit period in seconds"
msgstr ""
msgid "Authenticated web requests"
@@ -5149,7 +5174,7 @@ msgid "AutoDevopsAlert|Security testing tools enabled with %{linkStart}Auto DevO
msgstr ""
msgid "AutoRemediation| 1 Merge Request"
-msgstr ""
+msgstr "1 запит на злиттÑ"
msgid "AutoRemediation|%{mrsCount} ready for review"
msgstr ""
@@ -5380,7 +5405,7 @@ msgid "Be careful. Renaming a project's repository can have unintended side effe
msgstr "Будьте обережні. ÐŸÐµÑ€ÐµÐ¹Ð¼ÐµÐ½ÑƒÐ²Ð°Ð½Ð½Ñ Ñ€ÐµÐ¿Ð¾Ð·Ð¸Ñ‚Ð¾Ñ€Ñ–ÑŽ проєкту може мати небажані побічні ефекти."
msgid "Before enabling this integration, create a webhook for the room in Google Chat where you want to receive notifications from this project. %{docs_link}"
-msgstr ""
+msgstr "Перш ніж увімкнути цю інтеграцію, Ñтворіть вебхук Ð´Ð»Ñ ÐºÑ–Ð¼Ð½Ð°Ñ‚Ð¸ в Google Chat де ви хочете отримувати ÑÐ¿Ð¾Ð²Ñ–Ñ‰ÐµÐ½Ð½Ñ Ð²Ñ–Ð´ цього проєкту. %{docs_link}"
msgid "Before inserting code, be sure to read the comment that separated each code group."
msgstr ""
@@ -5400,9 +5425,6 @@ msgstr ""
msgid "Below you will find all the groups that are public."
msgstr "Ðижче ви знайдете вÑÑ– загальнодоÑтупні групи."
-msgid "Beta"
-msgstr "Бета"
-
msgid "Bi-weekly code coverage"
msgstr ""
@@ -5479,7 +5501,7 @@ msgid "BillingPlans|frequently asked questions"
msgstr "ЧаÑÑ‚Ñ– питаннÑ"
msgid "BillingPlans|group"
-msgstr ""
+msgstr "група"
msgid "BillingPlans|monthly"
msgstr "щоміÑÑцÑ"
@@ -5569,7 +5591,7 @@ msgid "Billing|Group"
msgstr "Група"
msgid "Billing|Group invite"
-msgstr ""
+msgstr "Ð—Ð°Ð¿Ñ€Ð¾ÑˆÐµÐ½Ð½Ñ Ð² групу"
msgid "Billing|Members who were invited via a group invitation cannot be removed. You can either remove the entire group, or ask an Owner of the invited group to remove the member."
msgstr ""
@@ -5581,7 +5603,7 @@ msgid "Billing|Private"
msgstr "Приватний"
msgid "Billing|Project invite"
-msgstr ""
+msgstr "Ð—Ð°Ð¿Ñ€Ð¾ÑˆÐµÐ½Ð½Ñ Ð´Ð¾ проєкту"
msgid "Billing|Remove user %{username} from your subscription"
msgstr ""
@@ -5590,7 +5612,7 @@ msgid "Billing|Toggle seat details"
msgstr ""
msgid "Billing|Type %{username} to confirm"
-msgstr ""
+msgstr "Введіть %{username} щоб підтвердити"
msgid "Billing|User was successfully removed"
msgstr ""
@@ -5611,7 +5633,7 @@ msgid "Bitbucket import"
msgstr "Імпорт з Bitbucket"
msgid "Blame"
-msgstr ""
+msgstr "ВідповідальніÑÑ‚ÑŒ"
msgid "Block user"
msgstr "Заблокувати кориÑтувача"
@@ -5644,6 +5666,21 @@ msgstr "Блог"
msgid "Board scope affects which issues are displayed for anyone who visits this board"
msgstr "ОблаÑÑ‚ÑŒ видимоÑÑ‚Ñ– дошки впливає на те, Ñкі задачі відображаютьÑÑ Ð´Ð»Ñ Ñ‚Ð¸Ñ…, хто Ñ—Ñ— переглÑдає"
+msgid "BoardNewEpic|Groups"
+msgstr ""
+
+msgid "BoardNewEpic|Loading groups"
+msgstr ""
+
+msgid "BoardNewEpic|No matching results"
+msgstr ""
+
+msgid "BoardNewEpic|Search groups"
+msgstr ""
+
+msgid "BoardNewEpic|Select a group"
+msgstr ""
+
msgid "BoardNewIssue|No matching results"
msgstr ""
@@ -5699,7 +5736,7 @@ msgid "BoardScope|Upcoming"
msgstr ""
msgid "BoardScope|Weight"
-msgstr ""
+msgstr "Вага"
msgid "Boards"
msgstr "Дошки"
@@ -5723,6 +5760,9 @@ msgstr ""
msgid "Boards|An error occurred while creating the list. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching child groups. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching group projects. Please try again."
msgstr ""
@@ -5881,7 +5921,7 @@ msgid "Branches|Delete branch"
msgstr "Видалити гілку"
msgid "Branches|Delete branch. Are you ABSOLUTELY SURE?"
-msgstr ""
+msgstr "Видалити гілку. Ви ÐБСОЛЮТÐО ВПЕВÐЕÐІ?"
msgid "Branches|Delete merged branches"
msgstr "Видалити злиті гілки"
@@ -5929,7 +5969,7 @@ msgid "Branches|Overview"
msgstr "ОглÑд"
msgid "Branches|Please type the following to confirm:"
-msgstr ""
+msgstr "Будь лаÑка, введіть наÑтупні дії Ð´Ð»Ñ Ð¿Ñ–Ð´Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ:"
msgid "Branches|Protected branches can be managed in %{project_settings_link}."
msgstr "Керувати захищеними гілками можливо в %{project_settings_link}."
@@ -6057,15 +6097,21 @@ msgstr ""
msgid "Bulk update"
msgstr ""
-msgid "BulkImport|Existing groups"
+msgid "BulkImports|Re-import creates a new group. It does not sync with the existing group."
msgstr ""
+msgid "BulkImport|Existing groups"
+msgstr "ІÑнуючі групи"
+
msgid "BulkImport|Filter by source group"
msgstr ""
msgid "BulkImport|From source group"
msgstr ""
+msgid "BulkImport|Group import history"
+msgstr ""
+
msgid "BulkImport|Import failed: Destination cannot be a subgroup of the source group. Change the destination and try again."
msgstr ""
@@ -6078,9 +6124,18 @@ msgstr ""
msgid "BulkImport|Importing the group failed"
msgstr ""
+msgid "BulkImport|Last imported to %{link}"
+msgstr ""
+
msgid "BulkImport|Name already exists."
msgstr "Ім'Ñ Ð²Ð¶Ðµ Ñ–Ñнує."
+msgid "BulkImport|New group"
+msgstr ""
+
+msgid "BulkImport|No history is available"
+msgstr ""
+
msgid "BulkImport|No parent"
msgstr ""
@@ -6093,15 +6148,21 @@ msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} matching filter \"%{filter}\" from %{link}"
msgstr ""
-msgid "BulkImport|To new group"
+msgid "BulkImport|Source group"
msgstr ""
+msgid "BulkImport|To new group"
+msgstr "Ð”Ð»Ñ Ð½Ð¾Ð²Ð¾Ñ— групи"
+
msgid "BulkImport|Update of import statuses with realtime changes failed"
msgstr ""
msgid "BulkImport|You have no groups to import"
msgstr ""
+msgid "BulkImport|Your imported groups will appear here."
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -6139,7 +6200,7 @@ msgid "Buy CI Minutes"
msgstr "Придбати CI Хвилин"
msgid "Buy Storage"
-msgstr ""
+msgstr "Купити Ñховище"
msgid "Buy more Pipeline minutes"
msgstr "Купити більше хвилин конвеєра"
@@ -6346,9 +6407,12 @@ msgstr ""
msgid "Can be manually deployed to"
msgstr "Можна вручну розгорнути на"
-msgid "Can create groups:"
+msgid "Can be overridden in each project."
msgstr ""
+msgid "Can create groups:"
+msgstr "Може Ñтворити групи:"
+
msgid "Can't apply as the source branch was deleted."
msgstr ""
@@ -6448,6 +6512,9 @@ msgstr "СкаÑовано"
msgid "Cancelling Preview"
msgstr "СкаÑÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ð¾Ð¿ÐµÑ€ÐµÐ´Ð½ÑŒÐ¾Ð³Ð¾ переглÑду"
+msgid "Cannot assign a confidential epic to a non-confidential issue. Make the issue confidential and try again"
+msgstr ""
+
msgid "Cannot be assigned to other projects."
msgstr ""
@@ -6499,9 +6566,6 @@ msgstr ""
msgid "Cannot refer to a group %{timebox_type} by an internal id!"
msgstr ""
-msgid "Cannot set confidential epic for a non-confidential issue"
-msgstr ""
-
msgid "Cannot show preview. For previews on sketch files, they must have the file format introduced by Sketch version 43 and above."
msgstr "Ðеможливо показати попередній переглÑд. Ð”Ð»Ñ Ð¿Ð¾Ð¿ÐµÑ€ÐµÐ´Ð½ÑŒÐ¾Ð³Ð¾ переглÑду файлів Sketch, вони повинні мати формат, введений верÑією 43 або вище."
@@ -6739,15 +6803,15 @@ msgstr "Перевірити наÑвніÑÑ‚ÑŒ функціональноÑÑ‚Ñ–
msgid "Check out, review, and merge locally"
msgstr ""
-msgid "Check the %{docs_link_start}documentation%{docs_link_end}."
-msgstr "ПереглÑньте %{docs_link_start}документацію%{docs_link_end}."
-
msgid "Check the current instance configuration "
msgstr ""
msgid "Check the elasticsearch.log file to debug why the migration was halted and make any changes before retrying the migration. When you fix the cause of the failure, click \"Retry migration\", and the migration will be scheduled to be retried in the background."
msgstr ""
+msgid "Check with your administrator."
+msgstr ""
+
msgid "Check your Docker images for known vulnerabilities."
msgstr "Перевірте Ñвої образи Docker на наÑвніÑÑ‚ÑŒ відомих вразливоÑтей."
@@ -6778,6 +6842,9 @@ msgstr "Перевірка доÑтупноÑÑ‚Ñ– імені кориÑтуваÑ
msgid "Checkout"
msgstr "ÐžÑ„Ð¾Ñ€Ð¼Ð»ÐµÐ½Ð½Ñ Ð·Ð°Ð¼Ð¾Ð²Ð»ÐµÐ½Ð½Ñ"
+msgid "Checkout|$%{selectedPlanPrice} per 10 GB storage per pack"
+msgstr ""
+
msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 minutes"
msgstr ""
@@ -6800,19 +6867,25 @@ msgstr ""
msgid "Checkout|%{name}'s GitLab subscription"
msgstr "ПідпиÑка GitLab Ð´Ð»Ñ %{name}"
-msgid "Checkout|%{selectedPlanText} plan"
-msgstr "%{selectedPlanText} план"
+msgid "Checkout|%{name}'s storage subscription"
+msgstr ""
-msgid "Checkout|%{startDate} - %{endDate}"
-msgstr "%{startDate} - %{endDate}"
+msgid "Checkout|%{quantity} GB of storage"
+msgstr ""
-msgid "Checkout|%{totalCiMinutes} CI minute"
-msgid_plural "Checkout|%{totalCiMinutes} CI minutes"
+msgid "Checkout|%{quantity} storage pack"
+msgid_plural "Checkout|%{quantity} storage packs"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "Checkout|%{selectedPlanText} plan"
+msgstr "%{selectedPlanText} план"
+
+msgid "Checkout|%{startDate} - %{endDate}"
+msgstr "%{startDate} - %{endDate}"
+
msgid "Checkout|%{totalCiMinutes} CI minutes"
msgstr ""
@@ -6888,6 +6961,9 @@ msgstr ""
msgid "Checkout|Failed to register credit card. Please try again."
msgstr "Ðе вдалоÑÑ Ð·Ð°Ñ€ÐµÑ”Ñтрувати кредитну картку. Будь лаÑка, Ñпробуйте ще раз."
+msgid "Checkout|GB"
+msgstr ""
+
msgid "Checkout|GitLab group"
msgstr "Група GitLab"
@@ -6924,6 +7000,9 @@ msgstr "Вибрати"
msgid "Checkout|State"
msgstr ""
+msgid "Checkout|Storage packs"
+msgstr ""
+
msgid "Checkout|Street address"
msgstr "ÐдреÑа"
@@ -6945,6 +7024,9 @@ msgstr "Ð’Ñього"
msgid "Checkout|Total minutes: %{quantity}"
msgstr ""
+msgid "Checkout|Total storage: %{quantity} GB"
+msgstr ""
+
msgid "Checkout|Users"
msgstr "КориÑтувачі"
@@ -6954,16 +7036,25 @@ msgstr ""
msgid "Checkout|Your organization"
msgstr "Ваша організаціÑ"
+msgid "Checkout|Your storage subscription has the same term as your main subscription, and the price is prorated accordingly."
+msgstr ""
+
msgid "Checkout|Your subscription will be applied to this group"
msgstr "Ваша підпиÑка буде заÑтоÑована до цієї групи"
msgid "Checkout|Zip code"
msgstr "Поштовий індекÑ"
+msgid "Checkout|a storage subscription"
+msgstr ""
+
msgid "Checkout|company or team"
msgstr "ÐºÐ¾Ð¼Ð¿Ð°Ð½Ñ–Ñ Ð°Ð±Ð¾ команда"
-msgid "Checkout|x 1,000 minutes per pack = %{strong}"
+msgid "Checkout|minutes"
+msgstr ""
+
+msgid "Checkout|x %{quantity} %{units} per pack ="
msgstr ""
msgid "Cherry-pick this commit"
@@ -7320,6 +7411,9 @@ msgstr ""
msgid "CloneIssue|Cannot clone issue to target project as it is pending deletion."
msgstr ""
+msgid "CloneIssue|Cannot clone issues of '%{issue_type}' type."
+msgstr ""
+
msgid "Cloned this issue to %{path_to_project}."
msgstr ""
@@ -7374,7 +7468,10 @@ msgstr "Закрито: %{closed}"
msgid "Closes this %{quick_action_target}."
msgstr "Закриває %{quick_action_target}."
-msgid "Cloud licenses can not be removed."
+msgid "Cloud Functions description and apps that are suitable for this deployment target"
+msgstr ""
+
+msgid "Cloud Run description and apps that are suitable for this deployment target"
msgstr ""
msgid "Cluster"
@@ -7401,6 +7498,12 @@ msgstr ""
msgid "ClusterAgents|Access tokens"
msgstr ""
+msgid "ClusterAgents|Agent might not be connected to GitLab"
+msgstr ""
+
+msgid "ClusterAgents|Agent never connected to GitLab"
+msgstr ""
+
msgid "ClusterAgents|Alternative installation methods"
msgstr ""
@@ -7416,6 +7519,12 @@ msgstr ""
msgid "ClusterAgents|Configuration"
msgstr "КонфігураціÑ"
+msgid "ClusterAgents|Connected"
+msgstr ""
+
+msgid "ClusterAgents|Connection status"
+msgstr ""
+
msgid "ClusterAgents|Copy token"
msgstr ""
@@ -7434,6 +7543,9 @@ msgstr "ОпиÑ"
msgid "ClusterAgents|For alternative installation methods %{linkStart}go to the documentation%{linkEnd}."
msgstr ""
+msgid "ClusterAgents|For more troubleshooting information go to"
+msgstr ""
+
msgid "ClusterAgents|Go to the repository"
msgstr ""
@@ -7449,18 +7561,30 @@ msgstr ""
msgid "ClusterAgents|Integrate with the GitLab Agent"
msgstr ""
-msgid "ClusterAgents|Last used"
+msgid "ClusterAgents|Last connected %{timeAgo}."
+msgstr ""
+
+msgid "ClusterAgents|Last contact"
msgstr ""
msgid "ClusterAgents|Learn how to create an agent access token"
msgstr ""
+msgid "ClusterAgents|Make sure you are using a valid token."
+msgstr ""
+
msgid "ClusterAgents|Name"
msgstr "Ім'Ñ"
msgid "ClusterAgents|Never"
msgstr "Ðіколи"
+msgid "ClusterAgents|Never connected"
+msgstr ""
+
+msgid "ClusterAgents|Not connected"
+msgstr ""
+
msgid "ClusterAgents|Read more about getting started"
msgstr ""
@@ -7482,6 +7606,9 @@ msgstr ""
msgid "ClusterAgents|Select which Agent you want to install"
msgstr ""
+msgid "ClusterAgents|The Agent has not been connected in a long time. There might be a connectivity issue. Last contact was %{timeAgo}."
+msgstr ""
+
msgid "ClusterAgents|The GitLab Agent also requires %{linkStart}enabling the Agent Server%{linkEnd}"
msgstr ""
@@ -7509,9 +7636,6 @@ msgstr "Ðевідомий кориÑтувач"
msgid "ClusterAgents|You will need to create a token to connect to your agent"
msgstr ""
-msgid "ClusterAgent|This feature is only available for premium plans"
-msgstr ""
-
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -7591,7 +7715,7 @@ msgid "ClusterIntegration|An unknown error occurred while attempting to connect
msgstr ""
msgid "ClusterIntegration|Any project namespaces"
-msgstr ""
+msgstr "Будь-Ñкі проÑтори імен проєкту"
msgid "ClusterIntegration|Apply for credit"
msgstr "ЗаÑтоÑувати кредит"
@@ -7701,9 +7825,6 @@ msgstr ""
msgid "ClusterIntegration|Create Kubernetes cluster"
msgstr "Створити Kubernetes-клаÑтер"
-msgid "ClusterIntegration|Create a provision role on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the account and external ID above. %{startMoreInfoLink}More information%{endLink}"
-msgstr "Створити роль Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð²Ñ–Ð·Ñ–ÑŽÐ²Ð°Ð½Ð½Ñ Ð² %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} за допомогою облікового запиÑу та external ID вказаних вище %{startMoreInfoLink}Додаткова інформаціÑ%{endLink}"
-
msgid "ClusterIntegration|Create cluster on"
msgstr "Створити клаÑтер на"
@@ -8136,7 +8257,7 @@ msgstr ""
msgid "ClusterIntegration|Subnets"
msgstr "Підмережі"
-msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provisioned role, first create one on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the above account and external IDs. %{startMoreInfoLink}More information%{endLink}"
+msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provisioned role, first create one on %{awsLinkStart}Amazon Web Services %{awsLinkEnd} using the above account and external IDs. %{moreInfoStart}More information%{moreInfoEnd}"
msgstr ""
msgid "ClusterIntegration|The Kubernetes certificate used to authenticate to the cluster."
@@ -8370,6 +8491,9 @@ msgstr "Згорнути етапи"
msgid "Collapse replies"
msgstr "Згорнути відповіді"
+msgid "Collapse settings section"
+msgstr ""
+
msgid "Collapse sidebar"
msgstr "Згорнути панель"
@@ -8388,6 +8512,9 @@ msgstr "ComboSearch не визначено"
msgid "Comma-separated list of email addresses."
msgstr ""
+msgid "Comma-separated list of users allowed to exceed the rate limit."
+msgstr ""
+
msgid "Comma-separated, e.g. '1.1.1.1, 2.2.2.0/24'"
msgstr "Розділений комами, напр. '1.1.1.1, 2.2.0/24'"
@@ -8573,7 +8700,7 @@ msgid "CompareRevisions|Compare"
msgstr ""
msgid "CompareRevisions|Create merge request"
-msgstr ""
+msgstr "Створити запит на злиттÑ"
msgid "CompareRevisions|Filter by Git revision"
msgstr ""
@@ -8675,7 +8802,7 @@ msgid "ComplianceFrameworks|You are about to permanently delete the compliance f
msgstr ""
msgid "ComplianceFrameworks|e.g. include-gitlab.ci.yml@group-name/project-name"
-msgstr ""
+msgstr "Ðаприклад include-gitlab.ci.yml@group-name/project-name"
msgid "ComplianceFramework|Edit Compliance Framework"
msgstr ""
@@ -8710,6 +8837,9 @@ msgstr ""
msgid "Configure %{repository_checks_link_start}repository checks%{link_end} and %{housekeeping_link_start}housekeeping%{link_end} on repositories."
msgstr ""
+msgid "Configure CAPTCHAs, IP address limits, and other anti-spam measures."
+msgstr ""
+
msgid "Configure Dependency Scanning in `.gitlab-ci.yml` using the GitLab managed template. You can [add variable overrides](https://docs.gitlab.com/ee/user/application_security/dependency_scanning/#customizing-the-dependency-scanning-settings) to customize Dependency Scanning settings."
msgstr ""
@@ -8746,17 +8876,14 @@ msgstr "ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð’Ñ–Ð´ÑтеженнÑ"
msgid "Configure a %{codeStart}.gitlab-webide.yml%{codeEnd} file in the %{codeStart}.gitlab%{codeEnd} directory to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
msgstr ""
-msgid "Configure existing installation"
-msgstr "Ðалаштувати Ñ–Ñнуючу інÑталÑцію"
-
-msgid "Configure limit for notes created per minute by web and API requests."
+msgid "Configure advanced permissions, Large File Storage, and two-factor authentication settings."
msgstr ""
-msgid "Configure limits for Project/Group Import/Export."
+msgid "Configure approvals by authors and committers on all projects."
msgstr ""
-msgid "Configure limits for web and API requests."
-msgstr "Ðалаштуйте Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ Ð´Ð»Ñ Ð²ÐµÐ± та API запитів."
+msgid "Configure existing installation"
+msgstr "Ðалаштувати Ñ–Ñнуючу інÑталÑцію"
msgid "Configure paths to be protected by Rack Attack."
msgstr "Ðалаштуйте шлÑхи Ð´Ð»Ñ Ð·Ð°Ñ…Ð¸Ñту від атак Rack Attack."
@@ -8770,10 +8897,13 @@ msgstr ""
msgid "Configure settings for Advanced Search with Elasticsearch."
msgstr ""
+msgid "Configure specific limits for Files API requests that supersede the general user and IP rate limits."
+msgstr ""
+
msgid "Configure specific limits for Git LFS requests that supersede the general user and IP rate limits."
msgstr ""
-msgid "Configure specific limits for Packages API requests that supersede the general user and IP rate limits."
+msgid "Configure specific limits for deprecated API requests that supersede the general user and IP rate limits."
msgstr ""
msgid "Configure the %{link} integration."
@@ -8785,6 +8915,9 @@ msgstr ""
msgid "Configure the way a user creates a new account."
msgstr "Ðалаштувати ÑпоÑіб ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ ÐºÐ¾Ñ€Ð¸Ñтувачем нового облікового запиÑу."
+msgid "Configure via Merge Request"
+msgstr ""
+
msgid "Configure which lists are shown for anyone who visits this board"
msgstr ""
@@ -8980,7 +9113,7 @@ msgid "ContainerRegistry|Cleanup is ongoing"
msgstr ""
msgid "ContainerRegistry|Cleanup pending"
-msgstr ""
+msgstr "ÐžÑ‡Ð¸Ñ‰ÐµÐ½Ð½Ñ Ð² очікуванні"
msgid "ContainerRegistry|Cleanup policies are now available for this project. %{linkStart}Click here to get started.%{linkEnd}"
msgstr ""
@@ -9259,6 +9392,9 @@ msgstr "МіÑтить %{count} бінарних даних зображень (
msgid "Content parsed with %{link}."
msgstr ""
+msgid "ContentEditor|Table of Contents"
+msgstr ""
+
msgid "ContentEditor|You have to provide a renderMarkdown function or a custom serializer"
msgstr ""
@@ -9317,7 +9453,7 @@ msgid "ContributionAnalytics|Last week"
msgstr "ОÑтанній тиждень"
msgid "ContributionAnalytics|Merge requests"
-msgstr ""
+msgstr "Запити на злиттÑ"
msgid "ContributionAnalytics|No issues for the selected time period."
msgstr "Ðемає задач за обраний період."
@@ -9389,7 +9525,7 @@ msgid "Copy ID"
msgstr "Скопіювати ID"
msgid "Copy IP Address"
-msgstr ""
+msgstr "Копіювати IP-адреÑу"
msgid "Copy KRB5 clone URL"
msgstr "Скопіювати URL Ð´Ð»Ñ ÐºÐ»Ð¾Ð½ÑƒÐ²Ð°Ð½Ð½Ñ Ñ‡ÐµÑ€ÐµÐ· KRB5"
@@ -9445,6 +9581,9 @@ msgstr "Скопіювати поÑиланнÑ"
msgid "Copy link to chart"
msgstr "Копіювати поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð° графік"
+msgid "Copy prefix"
+msgstr ""
+
msgid "Copy reference"
msgstr "Скопіювати поÑиланнÑ"
@@ -9475,11 +9614,14 @@ msgstr "Скопіювати токен тригера"
msgid "Copy value"
msgstr "Копіювати значеннÑ"
+msgid "Corpus Management"
+msgstr ""
+
msgid "Corpus Management|Are you sure you want to delete the corpus?"
msgstr ""
msgid "CorpusManagement|Actions"
-msgstr ""
+msgstr "Дії"
msgid "CorpusManagement|Corpus are used in fuzz testing as mutation source to Improve future testing."
msgstr ""
@@ -9632,7 +9774,7 @@ msgid "Could not upload your designs as one or more files uploaded are not suppo
msgstr "Ðе вдалоÑÑ Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶Ð¸Ñ‚Ð¸ ваші дизайни, оÑкільки один або кілька файлів, що завантажуютьÑÑ, не підтримуютьÑÑ."
msgid "Couldn't assign policy to project"
-msgstr ""
+msgstr "Ðе вдалоÑÑ Ð²Ð¸Ð·Ð½Ð°Ñ‡Ð¸Ñ‚Ð¸ політику Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñ”ÐºÑ‚Ñƒ"
msgid "Coverage"
msgstr "ПокриттÑ"
@@ -9703,6 +9845,9 @@ msgstr "Створити гілку"
msgid "Create commit"
msgstr "Створити коміт"
+msgid "Create common files more quickly, and standardize their format."
+msgstr ""
+
msgid "Create confidential merge request"
msgstr "Створити конфіденційний запит на злиттÑ"
@@ -9722,7 +9867,7 @@ msgid "Create file"
msgstr "Створити файл"
msgid "Create from"
-msgstr ""
+msgstr "Створити з"
msgid "Create group"
msgstr "Створити групу"
@@ -9736,6 +9881,9 @@ msgstr "Створити інцидент"
msgid "Create issue"
msgstr "Створити задачу"
+msgid "Create issue to resolve all threads"
+msgstr ""
+
msgid "Create iteration"
msgstr "Створити ітерацію"
@@ -9790,6 +9938,9 @@ msgstr "Створити новий проєкт"
msgid "Create new..."
msgstr "Створити..."
+msgid "Create or import your first project"
+msgstr ""
+
msgid "Create project"
msgstr "Створити проєкт"
@@ -10147,7 +10298,7 @@ msgstr ""
msgid "Custom notification events"
msgstr "КориÑтувацькі Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½ÑŒ про події"
-msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notificationLinkStart} notification emails%{notificationLinkEnd}."
+msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notificationLinkStart}notification emails%{notificationLinkEnd}."
msgstr ""
msgid "Custom project templates"
@@ -10350,11 +10501,11 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-msgid "CycleAnalytics|Showing data for group '%{groupName}' and %{selectedProjectCount} projects from %{startDate} to %{endDate}"
-msgstr "Показано дані по групі '%{groupName}' і %{selectedProjectCount} проєктам від %{startDate} до %{endDate}"
+msgid "CycleAnalytics|Showing data for group '%{groupName}' and %{selectedProjectCount} projects from %{createdAfter} to %{createdBefore}"
+msgstr ""
-msgid "CycleAnalytics|Showing data for group '%{groupName}' from %{startDate} to %{endDate}"
-msgstr "Показано дані по групі '%{groupName}' від %{startDate} до %{endDate}"
+msgid "CycleAnalytics|Showing data for group '%{groupName}' from %{createdAfter} to %{createdBefore}"
+msgstr ""
msgid "CycleAnalytics|Stages"
msgstr "Стадії"
@@ -10587,6 +10738,9 @@ msgstr ""
msgid "DastProfiles|Manage profiles"
msgstr ""
+msgid "DastProfiles|Manage site profiles"
+msgstr ""
+
msgid "DastProfiles|Minimum = 0 (no timeout enabled), Maximum = 2880 minutes"
msgstr ""
@@ -10662,6 +10816,9 @@ msgstr ""
msgid "DastProfiles|Scanner name"
msgstr "Ім'Ñ Ñканера"
+msgid "DastProfiles|Schedule"
+msgstr ""
+
msgid "DastProfiles|Select branch"
msgstr "Виберіть гілку"
@@ -10731,7 +10888,7 @@ msgstr ""
msgid "DastProfiles|Website"
msgstr ""
-msgid "DastProfiles|You can either choose a passive scan or validate the target site in your chosen site profile. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
+msgid "DastProfiles|You can either choose a passive scan or validate the target site from the site profile management page. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
msgstr ""
msgid "DastProfiles|You cannot run an active scan against an unvalidated site."
@@ -10811,7 +10968,7 @@ msgid "DastSiteValidation|Validate target site"
msgstr ""
msgid "DastSiteValidation|Validated"
-msgstr ""
+msgstr "Перевірена"
msgid "DastSiteValidation|Validating..."
msgstr ""
@@ -10906,7 +11063,7 @@ msgstr "Днів"
msgid "Days to merge"
msgstr "Днів до злиттÑ"
-msgid "Deactivate dormant users after 90 days of inactivity. Users can return to active status by signing in to their account. While inactive, a user is not counted as an active user in the instance."
+msgid "Deactivate dormant users after 90 days of inactivity"
msgstr ""
msgid "Dear Administrator,"
@@ -10993,10 +11150,10 @@ msgstr ""
msgid "Define a custom pattern with cron syntax"
msgstr "Визначте влаÑний шаблон за допомогою ÑинтакÑиÑу cron"
-msgid "Define approval settings."
+msgid "Define approval rules."
msgstr ""
-msgid "Define approval settings. %{linkStart}Learn more.%{linkEnd}"
+msgid "Define approval rules. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "Define custom rules for what constitutes spam, independent of Akismet"
@@ -11005,7 +11162,7 @@ msgstr ""
msgid "Define environments in the deploy stage(s) in %{code_open}.gitlab-ci.yml%{code_close} to track deployments here."
msgstr ""
-msgid "Define how approval rules are applied as a merge request moves toward completion."
+msgid "Define how approval rules are applied to merge requests."
msgstr ""
msgid "Definition"
@@ -11020,6 +11177,12 @@ msgstr ""
msgid "DelayedJobs|Are you sure you want to run %{job_name} immediately? This job will run automatically after it's timer finishes."
msgstr "Ви впевнені, що ви хочете запуÑтити %{job_name} відразу? Це Ð·Ð°Ð²Ð´Ð°Ð½Ð½Ñ Ð±ÑƒÐ´Ðµ виконано автоматично по завершенню таймера."
+msgid "DelayedJobs|Are you sure you want to run %{job_name} immediately? This job will run automatically after its timer finishes."
+msgstr ""
+
+msgid "DelayedJobs|Run the delayed job now?"
+msgstr ""
+
msgid "DelayedJobs|Start now"
msgstr "Почати зараз"
@@ -11078,7 +11241,7 @@ msgid "Delete label"
msgstr "Видалити мітку"
msgid "Delete label: %{labelName}"
-msgstr ""
+msgstr "Видалити мітку: %{labelName}"
msgid "Delete pipeline"
msgstr "Видалити конвеєр"
@@ -11087,7 +11250,7 @@ msgid "Delete project"
msgstr "Видалити проєкт"
msgid "Delete project. Are you ABSOLUTELY SURE?"
-msgstr ""
+msgstr "Видалити проєкт. Ви ÐБСОЛЮТÐО ВПЕВÐЕÐІ?"
msgid "Delete row"
msgstr ""
@@ -11302,6 +11465,12 @@ msgstr "Ð¤ÑƒÐ½ÐºÑ†Ñ–Ñ Ð¿Ñ€Ð¾ÐºÑÑ– залежноÑтей наразі доÑÑ‚
msgid "Dependency proxy image prefix"
msgstr ""
+msgid "DependencyProxy|Create a local proxy for storing frequently used upstream images. %{docLinkStart}Learn more%{docLinkEnd} about dependency proxies."
+msgstr ""
+
+msgid "DependencyProxy|Dependency Proxy"
+msgstr ""
+
msgid "DependencyProxy|Toggle Dependency Proxy"
msgstr "Увімкнути/вимкнути прокÑÑ– залежноÑтей"
@@ -11548,6 +11717,9 @@ msgstr ""
msgid "Deployments"
msgstr "РозгортаннÑ"
+msgid "Deployments to Google Kubernetes Engine can be "
+msgstr ""
+
msgid "Deployments|%{deployments} environment impacted."
msgid_plural "Deployments|%{deployments} environments impacted."
msgstr[0] ""
@@ -11579,6 +11751,9 @@ msgstr "Пропущено"
msgid "Deployment|success"
msgstr "уÑпішно"
+msgid "Deprecated API rate limits"
+msgstr ""
+
msgid "Deprioritize label"
msgstr "Зменшити пріоритет мітки"
@@ -11859,7 +12034,7 @@ msgid "DevopsAdoption|Edit groups"
msgstr "Редагувати групи"
msgid "DevopsAdoption|Edit subgroups"
-msgstr ""
+msgstr "Редагувати підгрупи"
msgid "DevopsAdoption|Feature adoption is based on usage in the previous calendar month. Data is updated at the beginning of each month. Last updated: %{timestamp}."
msgstr ""
@@ -11904,7 +12079,7 @@ msgid "DevopsAdoption|Runners"
msgstr "Runner'и"
msgid "DevopsAdoption|SAST"
-msgstr ""
+msgstr "SAST"
msgid "DevopsAdoption|SAST enabled for at least one project"
msgstr ""
@@ -11981,6 +12156,20 @@ msgstr ""
msgid "DiffsCompareBaseBranch|(base)"
msgstr "(базова)"
+msgid "Diffs|%d addition"
+msgid_plural "Diffs|%d additions"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
+msgid "Diffs|%d deletion"
+msgid_plural "Diffs|%d deletions"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "Diffs|No file name available"
msgstr "Ім'Ñ Ñ„Ð°Ð¹Ð»Ñƒ не доÑтупне"
@@ -11990,9 +12179,19 @@ msgstr ""
msgid "Diffs|Show all unchanged lines"
msgstr ""
+msgid "Diffs|Showing %{dropdownStart}%{count} changed file%{dropdownEnd}"
+msgid_plural "Diffs|Showing %{dropdownStart}%{count} changed files%{dropdownEnd}"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "Diffs|Something went wrong while fetching diff lines."
msgstr "Проблема при отриманні Ñ€Ñдків відмінноÑтей."
+msgid "Diffs|with %{additions} and %{deletions}"
+msgstr ""
+
msgid "Direct member"
msgstr ""
@@ -12120,9 +12319,6 @@ msgstr[1] "Відхилити %d виділені вразливоÑÑ‚Ñ– Ñк"
msgstr[2] "Відхилити %d виділених вразливоÑтей Ñк"
msgstr[3] "Відхилити %d виділених вразливоÑтей Ñк"
-msgid "Dismiss Value Stream Analytics introduction box"
-msgstr ""
-
msgid "Dismiss merge request promotion"
msgstr ""
@@ -12205,7 +12401,7 @@ msgid "Domain was successfully deleted."
msgstr "Домен уÑпішно видалено."
msgid "Domain was successfully updated."
-msgstr ""
+msgstr "Домен уÑпішно оновлено."
msgid "Don't have an account yet?"
msgstr "Ще не зареєÑтровані?"
@@ -12241,7 +12437,7 @@ msgid "Download %{name} artifact"
msgstr "Завантажити %{name} артефакт"
msgid "Download (%{fileSizeReadable})"
-msgstr ""
+msgstr "Завантажити (%{fileSizeReadable})"
msgid "Download (%{size})"
msgstr ""
@@ -12424,7 +12620,7 @@ msgid "Edit fork in Web IDE"
msgstr "Редагувати форк в Web IDE"
msgid "Edit group application"
-msgstr ""
+msgstr "Редагувати груповий заÑтоÑунок"
msgid "Edit group: %{group_name}"
msgstr "Редагувати групу: %{group_name}"
@@ -12439,11 +12635,14 @@ msgid "Edit in single-file editor"
msgstr ""
msgid "Edit inline"
-msgstr ""
+msgstr "Вбудоване редагуваннÑ"
msgid "Edit issues"
msgstr "Редагувати задачі"
+msgid "Edit merge requests"
+msgstr ""
+
msgid "Edit public deploy key"
msgstr "Редагувати публічний ключ Ð´Ð»Ñ Ñ€Ð¾Ð·Ð³Ð¾Ñ€Ñ‚Ð°Ð½Ð½Ñ"
@@ -12451,7 +12650,7 @@ msgid "Edit sidebar"
msgstr "Редагувати бічну панель"
msgid "Edit table"
-msgstr ""
+msgstr "Редагувати таблицю"
msgid "Edit this file only."
msgstr ""
@@ -12519,6 +12718,9 @@ msgstr "Ðемає. Виберіть проÑтори імен Ð´Ð»Ñ Ñ–Ð½Ð´ÐµÐº
msgid "Elastic|None. Select projects to index."
msgstr "Ðемає. Виберіть проєкти Ð´Ð»Ñ Ñ–Ð½Ð´ÐµÐºÑуваннÑ."
+msgid "Eligible users"
+msgstr ""
+
msgid "Email"
msgstr "Електронна пошта"
@@ -12648,6 +12850,9 @@ msgstr "Порожній файл"
msgid "Enable"
msgstr "Увімкнути"
+msgid "Enable Amazon EKS integration"
+msgstr ""
+
msgid "Enable Auto DevOps"
msgstr "Увімкнути Auto DevOps"
@@ -12681,6 +12886,9 @@ msgstr ""
msgid "Enable SSL verification"
msgstr ""
+msgid "Enable Service Ping"
+msgstr ""
+
msgid "Enable Snowplow tracking"
msgstr ""
@@ -12700,7 +12908,7 @@ msgid "Enable access to the performance bar for non-administrators in a given gr
msgstr ""
msgid "Enable admin mode"
-msgstr ""
+msgstr "Увімкнути режим адмініÑтратора"
msgid "Enable and disable Service Desk. Some additional configuration might be required. %{link_start}Learn more%{link_end}."
msgstr ""
@@ -12711,6 +12919,9 @@ msgstr ""
msgid "Enable authenticated Git LFS request rate limit"
msgstr ""
+msgid "Enable authenticated web request rate limit"
+msgstr ""
+
msgid "Enable authentication"
msgstr ""
@@ -12739,7 +12950,7 @@ msgid "Enable for this project"
msgstr "Увімкнути Ð´Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ проєкту"
msgid "Enable group runners"
-msgstr ""
+msgstr "Увімкнути групові Runner'и"
msgid "Enable header and footer in emails"
msgstr "Увімкнути заголовок та футер в електронних лиÑтах"
@@ -12771,7 +12982,7 @@ msgstr ""
msgid "Enable or disable the Pseudonymizer data collection."
msgstr "Увімкнути чи вимкнути збір даних Ð´Ð»Ñ Pseudonymizer."
-msgid "Enable or disable version check and service ping."
+msgid "Enable or disable version check and Service Ping."
msgstr ""
msgid "Enable protected paths rate limit"
@@ -12783,18 +12994,12 @@ msgstr "ЗадіÑти прокÑÑ–-Ñервер"
msgid "Enable reCAPTCHA"
msgstr "Увімкнути reCAPTCHA"
-msgid "Enable reCAPTCHA for login"
-msgstr ""
-
-msgid "Enable reCAPTCHA, Invisible Captcha, Akismet and set IP limits. For reCAPTCHA, we currently only support %{recaptcha_v2_link_start}v2%{recaptcha_v2_link_end}"
+msgid "Enable reCAPTCHA for login."
msgstr ""
msgid "Enable repository checks"
msgstr ""
-msgid "Enable service ping"
-msgstr ""
-
msgid "Enable shared runners for all projects and subgroups in this group."
msgstr ""
@@ -12816,7 +13021,10 @@ msgstr "Увімкнути двофакторну автентифікацію"
msgid "Enable unauthenticated API request rate limit"
msgstr ""
-msgid "Enable unauthenticated request rate limit"
+msgid "Enable unauthenticated web request rate limit"
+msgstr ""
+
+msgid "Enable user deactivation emails"
msgstr ""
msgid "Enable version check"
@@ -12852,9 +13060,6 @@ msgstr ""
msgid "Enabled sources for code import during project creation. OmniAuth must be configured for GitHub"
msgstr "Ðктивовані джерела Ð´Ð»Ñ Ñ–Ð¼Ð¿Ð¾Ñ€Ñ‚Ñƒ коду під Ñ‡Ð°Ñ ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾Ñ”ÐºÑ‚Ñƒ. OmniAuth має бути Ñконфігурована Ð´Ð»Ñ GitHub"
-msgid "Enabling this will only make licensed EE features available to projects if the project namespace's plan includes the feature or if the project is public."
-msgstr "Ð£Ð²Ñ–Ð¼ÐºÐ½ÐµÐ½Ð½Ñ Ñ†ÑŒÐ¾Ð³Ð¾ зробить ліцензовану функціональніÑÑ‚ÑŒ EE доÑтупною тільки Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñ”ÐºÑ‚Ñ–Ð², план проÑтору імен Ñких включає цю функціональніÑÑ‚ÑŒ або Ñкщо проєкт Ñ” публічним."
-
msgid "Encountered an error while rendering: %{err}"
msgstr ""
@@ -12903,9 +13108,6 @@ msgstr ""
msgid "Enter Admin Mode"
msgstr "Увійти в Режим ÐдмініÑтратора"
-msgid "Enter IP address range"
-msgstr "Введіть діапазон IP-адреÑ"
-
msgid "Enter a number"
msgstr "Введіть номер"
@@ -12918,9 +13120,6 @@ msgstr ""
msgid "Enter at least three characters to search"
msgstr "Введіть щонайменше 3 Ñимволи Ð´Ð»Ñ Ð¿Ð¾ÑˆÑƒÐºÑƒ"
-msgid "Enter domain"
-msgstr "Введіть домен"
-
msgid "Enter in your Bitbucket Server URL and personal access token below"
msgstr "Введіть URL-адреÑу вашого Bitbucket Server Ñ– ключ доÑтупу"
@@ -13107,9 +13306,6 @@ msgstr "РозгортаннÑ"
msgid "Environments|Deployment %{status}"
msgstr ""
-msgid "Environments|Dismiss"
-msgstr ""
-
msgid "Environments|Enable review app"
msgstr ""
@@ -13122,9 +13318,6 @@ msgstr "Середовища"
msgid "Environments|Environments are places where code gets deployed, such as staging or production."
msgstr "Середовища — це міÑцÑ, куди можна розгорнути код, наприклад staging або production."
-msgid "Environments|Help us improve environments"
-msgstr ""
-
msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
msgstr ""
@@ -13161,6 +13354,9 @@ msgstr "Ðемає pod'ів Ð´Ð»Ñ Ð²Ñ–Ð´Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ"
msgid "Environments|Note that this action will stop the environment, but it will %{emphasisStart}not%{emphasisEnd} have an effect on any existing deployment due to no “stop environment action†being defined in the %{ciConfigLinkStart}.gitlab-ci.yml%{ciConfigLinkEnd} file."
msgstr "Зверніть увагу, що Ñ†Ñ Ð´Ñ–Ñ Ð·ÑƒÐ¿Ð¸Ð½Ð¸Ñ‚ÑŒ Ñередовище, але це %{emphasisStart}не%{emphasisEnd} впливатиме на будь-Ñке Ñ–Ñнуюче Ñ€Ð¾Ð·Ð³Ð¾Ñ€Ñ‚Ð°Ð½Ð½Ñ Ñ‡ÐµÑ€ÐµÐ· відÑутніÑÑ‚ÑŒ операції зупинки в файлі %{ciConfigLinkStart}.gitlab-ci.yml%{ciConfigLinkEnd}."
+msgid "Environments|Open"
+msgstr ""
+
msgid "Environments|Open live environment"
msgstr "Відкрити працююче Ñередовище"
@@ -13200,9 +13396,6 @@ msgstr "Зупинити Ñередовище"
msgid "Environments|Stopping %{environmentName}"
msgstr ""
-msgid "Environments|Take the survey"
-msgstr ""
-
msgid "Environments|There was an error fetching the logs. Please try again."
msgstr "СталаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ° під Ñ‡Ð°Ñ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð»Ð¾Ð³Ñ–Ð². Будь лаÑка, Ñпробуйте ще раз."
@@ -13224,9 +13417,6 @@ msgstr "Оновлено"
msgid "Environments|You don't have any environments right now"
msgstr "Ви поки не налаштували жодного Ñередовища"
-msgid "Environments|Your feedback helps GitLab make environments better for you and other users. Participate and enter a sweepstake to win a USD 30 gift card."
-msgstr ""
-
msgid "Environments|by %{avatar}"
msgstr ""
@@ -13509,8 +13699,8 @@ msgstr "СталаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ°. КориÑтувач не був розб
msgid "Error parsing CSV file. Please make sure it has"
msgstr ""
-msgid "Error rendering markdown preview"
-msgstr "Помилка при попередньому переглÑді markdown"
+msgid "Error rendering Markdown preview"
+msgstr ""
msgid "Error saving label update."
msgstr "Помилка при збереженні мітки."
@@ -13557,6 +13747,9 @@ msgstr "Помилка з Akismet. Будь лаÑка, перевірте жуÑ
msgid "Error: %{error_message}"
msgstr "Помилка: %{error_message}"
+msgid "Error: Couldn't load some or all of the changes."
+msgstr ""
+
msgid "Error: No AWS credentials were supplied"
msgstr ""
@@ -13590,6 +13783,9 @@ msgstr ""
msgid "ErrorTracking|Enable error tracking"
msgstr ""
+msgid "ErrorTracking|Error tracking backend"
+msgstr ""
+
msgid "ErrorTracking|If you self-host Sentry, enter your Sentry instance's full URL. If you use Sentry's hosted solution, enter https://sentry.io"
msgstr ""
@@ -13623,6 +13819,12 @@ msgstr ""
msgid "Escalation policies must have at least one rule"
msgstr ""
+msgid "EscalationPolicies|%{clockIcon} IF alert is not %{alertStatus} in %{minutes}"
+msgstr ""
+
+msgid "EscalationPolicies|%{notificationIcon} THEN %{doAction} %{forScheduleOrUser}"
+msgstr ""
+
msgid "EscalationPolicies|+ Add an additional rule"
msgstr ""
@@ -13665,13 +13867,13 @@ msgstr ""
msgid "EscalationPolicies|Escalation policies"
msgstr ""
-msgid "EscalationPolicies|Escalation rules"
+msgid "EscalationPolicies|Escalation policy %{obstacle} in Project %{project}"
msgstr ""
-msgid "EscalationPolicies|Failed to load oncall-schedules"
+msgid "EscalationPolicies|Escalation rules"
msgstr ""
-msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} %{then} THEN %{doAction} %{scheduleOrUser}"
+msgid "EscalationPolicies|Failed to load oncall-schedules"
msgstr ""
msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} minutes"
@@ -13749,18 +13951,36 @@ msgstr "Події"
msgid "Every %{action} attempt has failed: %{job_error_message}. Please try again."
msgstr "УÑÑ– Ñпроби %{action} закінчилиÑÑ Ð½ÐµÐ²Ð´Ð°Ñ‡ÐµÑŽ: %{job_error_message}. Будь лаÑка, Ñпробуйте знову."
+msgid "Every 3 months"
+msgstr ""
+
+msgid "Every 3 months on the %{day} at %{time} %{timezone}"
+msgstr ""
+
+msgid "Every 6 months"
+msgstr ""
+
+msgid "Every 6 months on the %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Every day"
msgstr "ЩоднÑ"
msgid "Every day (at %{time})"
msgstr "Кожен день (в %{time})"
+msgid "Every day at %{time} %{timezone}"
+msgstr ""
+
msgid "Every month"
msgstr "ЩоміÑÑцÑ"
msgid "Every month (Day %{day} at %{time})"
msgstr ""
+msgid "Every month on the %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Every three months"
msgstr "Кожні 3 міÑÑці"
@@ -13777,6 +13997,15 @@ msgstr[3] ""
msgid "Every week (%{weekday} at %{time})"
msgstr ""
+msgid "Every week on %{day} at %{time} %{timezone}"
+msgstr ""
+
+msgid "Every year"
+msgstr ""
+
+msgid "Every year on %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Everyone"
msgstr "Будь-хто"
@@ -13813,9 +14042,6 @@ msgstr "Збір даних"
msgid "Exactly one of %{attributes} is required"
msgstr "Потрібен лише один з %{attributes}"
-msgid "Example: %{ip_address}. %{read_more_link}."
-msgstr ""
-
msgid "Example: @sub\\.company\\.com$"
msgstr "Приклад: @sub\\.company\\.com$"
@@ -13882,15 +14108,15 @@ msgstr ""
msgid "Expand pipeline"
msgstr "Розгорнути конвеєр"
+msgid "Expand settings section"
+msgstr ""
+
msgid "Expand sidebar"
msgstr "Розгорніть бічну панель"
msgid "Expected documents: %{expected_documents}"
msgstr ""
-msgid "Experienced"
-msgstr "ДоÑвідчений"
-
msgid "ExperimentSubject|Must have exactly one of User, Namespace, or Project."
msgstr ""
@@ -13946,7 +14172,7 @@ msgid "Export"
msgstr "ЕкÑпорт"
msgid "Export %{name}"
-msgstr ""
+msgstr "ЕкÑпорт %{name}"
msgid "Export %{requirementsCount} requirements?"
msgstr ""
@@ -14173,9 +14399,6 @@ msgstr "Ðе вдалоÑÑ Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶Ð¸Ñ‚Ð¸ проєкти"
msgid "Failed to load related branches"
msgstr "Ðе вдалоÑÑ Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶Ð¸Ñ‚Ð¸ пов’Ñзані гілки"
-msgid "Failed to load sidebar lock status"
-msgstr ""
-
msgid "Failed to load stacktrace."
msgstr "Ðе вдалоÑÑ Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶Ð¸Ñ‚Ð¸ траÑÑƒÐ²Ð°Ð½Ð½Ñ Ñтеку."
@@ -14604,6 +14827,9 @@ msgstr "Ім'Ñ Ñ„Ð°Ð¹Ð»Ñƒ"
msgid "Files"
msgstr "Файли"
+msgid "Files API Rate Limits"
+msgstr ""
+
msgid "Files breadcrumb"
msgstr "ÐÐ°Ð²Ñ–Ð³Ð°Ñ†Ñ–Ñ Ð¿Ð¾ файлам"
@@ -15601,6 +15827,9 @@ msgid "GitLab for Slack"
msgstr "GitLab Ð´Ð»Ñ Slack"
msgid "GitLab group: %{source_link}"
+msgstr "GitLab група : %{source_link}"
+
+msgid "GitLab informs you if a new version is available."
msgstr ""
msgid "GitLab is a complete DevOps platform, delivered as a single application, fundamentally changing the way Development, Security, and Ops teams collaborate"
@@ -15618,8 +15847,8 @@ msgstr "GitLab отримує SSL-Ñертифікат Ð´Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ домÐ
msgid "GitLab is open source software to collaborate on code."
msgstr ""
-msgid "GitLab is undergoing maintenance and is operating in a read-only mode."
-msgstr "GitLab проходить технічне обÑÐ»ÑƒÐ³Ð¾Ð²ÑƒÐ²Ð°Ð½Ð½Ñ Ñ– працює лише в режимі читаннÑ."
+msgid "GitLab is undergoing maintenance and is operating in read-only mode."
+msgstr ""
msgid "GitLab member or Email address"
msgstr "УчаÑник GitLab або адреÑа електронної пошти"
@@ -15630,9 +15859,6 @@ msgstr "URL-адреÑа метаданних GitLab"
msgid "GitLab project export"
msgstr "ЕкÑпорт проєкту GitLab"
-msgid "GitLab restart is required to apply changes."
-msgstr "Ðеобхідно перезавантажити GitLab Ð´Ð»Ñ Ð·Ð°ÑтоÑÑƒÐ²Ð°Ð½Ð½Ñ Ð·Ð¼Ñ–Ð½."
-
msgid "GitLab single sign-on URL"
msgstr ""
@@ -15648,9 +15874,6 @@ msgstr ""
msgid "GitLab version"
msgstr "ВерÑÑ–Ñ GitLab"
-msgid "GitLab will inform you if a new version is available."
-msgstr ""
-
msgid "GitLab will run a background job that will produce pseudonymized CSVs of the GitLab database that will be uploaded to your configured object storage directory."
msgstr "GitLab запуÑтить фонове завданнÑ, Ñке буде оброблÑти пÑевдонімізовані CSV-файли бази даних GitLab, Ñкі будуть надіÑлані до вашого налаштованого Ñховища об'єктів."
@@ -15841,7 +16064,7 @@ msgid "Go full screen"
msgstr "Ðа повний екран"
msgid "Go to %{source_name}"
-msgstr ""
+msgstr "Перейти до %{source_name}"
msgid "Go to commits"
msgstr "Перейти до комітів"
@@ -15915,9 +16138,21 @@ msgstr "Перейти до графу репозиторію"
msgid "Go to snippets"
msgstr "Перейти до Ñніпетів"
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check 'Allowed domains for sign-ups'."
+msgstr ""
+
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check 'Email restrictions for sign-ups'."
+msgstr ""
+
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check the 'Domain denylist'."
+msgstr ""
+
msgid "Go to the activity feed"
msgstr "Перейти до каналу активноÑÑ‚Ñ–"
+msgid "Go to the group’s 'Settings &gt; General' page, and check 'Restrict membership by email domain'."
+msgstr ""
+
msgid "Go to the milestone list"
msgstr "Перейти до ÑпиÑку етапів"
@@ -15954,6 +16189,12 @@ msgstr "Перейти до ваших Ñніпетів"
msgid "Goal of the changes and what reviewers should be aware of"
msgstr ""
+msgid "Google Cloud"
+msgstr ""
+
+msgid "Google Cloud offers several deployment targets. Select the one most suitable for your project."
+msgstr ""
+
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
@@ -16038,9 +16279,6 @@ msgstr "Хуки Групи"
msgid "Group ID"
msgstr "Ідентифікатор групи"
-msgid "Group ID: %{group_id}"
-msgstr "ID групи: %{group_id}"
-
msgid "Group Owner must have signed in with SAML before enabling Group Managed Accounts"
msgstr ""
@@ -16051,7 +16289,7 @@ msgid "Group URL"
msgstr "URL-адреÑа групи"
msgid "Group Wikis"
-msgstr ""
+msgstr "Wiki-Ñторінки груп"
msgid "Group application: %{name}"
msgstr ""
@@ -16186,7 +16424,7 @@ msgid "GroupActivityMetrics|Issues opened"
msgstr ""
msgid "GroupActivityMetrics|Last 90 days"
-msgstr ""
+msgstr "ОÑтанні 90 днів"
msgid "GroupActivityMetrics|Members added"
msgstr ""
@@ -16215,6 +16453,12 @@ msgstr ""
msgid "GroupImport|Unable to process group import file"
msgstr ""
+msgid "GroupPage|Copy group ID"
+msgstr ""
+
+msgid "GroupPage|Group ID: %{group_id}"
+msgstr ""
+
msgid "GroupRoadmap|%{dateWord} – No end date"
msgstr ""
@@ -16269,6 +16513,9 @@ msgstr "Щоб розширити пошук, змініть або видалі
msgid "GroupRoadmap|Within 3 years"
msgstr ""
+msgid "GroupSAML|\"persistent\" recommended"
+msgstr ""
+
msgid "GroupSAML|%{strongOpen}Warning%{strongClose} - Enabling %{linkStart}SSO enforcement%{linkEnd} can reduce security risks."
msgstr ""
@@ -16401,6 +16648,9 @@ msgstr ""
msgid "GroupSAML|To be able to prohibit outer forks, you first need to enforce dedicate group managed accounts."
msgstr ""
+msgid "GroupSAML|Use SAML group links to manage group membership using SAML."
+msgstr ""
+
msgid "GroupSAML|Valid SAML Response"
msgstr ""
@@ -16413,13 +16663,10 @@ msgstr "Ваш токен SCIM"
msgid "GroupSAML|as %{access_level}"
msgstr ""
-msgid "GroupSAML|must match stored NameID of \"%{extern_uid}\" as we use this to identify users. If the NameID changes users will be unable to sign in."
+msgid "GroupSAML|must match stored NameID of \"%{extern_uid}\" to identify user and allow sign in"
msgstr ""
-msgid "GroupSAML|should be \"persistent\""
-msgstr ""
-
-msgid "GroupSAML|should be a random persistent ID, emails are discouraged"
+msgid "GroupSAML|recommend persistent ID instead of email"
msgstr ""
msgid "GroupSelect|No matching results"
@@ -16429,14 +16676,20 @@ msgid "GroupSelect|Search groups"
msgstr ""
msgid "GroupSelect|Select a group"
-msgstr ""
+msgstr "Вибрати групу"
msgid "GroupSettings|Allow project access token creation"
msgstr "Дозволити ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ñ‚Ð¾ÐºÐµÐ½Ð° доÑтупу до проєкту"
+msgid "GroupSettings|Applied to all subgroups unless overridden by a group owner. Groups already added to the project lose access."
+msgstr ""
+
msgid "GroupSettings|Auto DevOps pipeline was updated for the group"
msgstr "Конвеєр Auto DevOps оновлено Ð´Ð»Ñ Ñ†Ñ–Ñ”Ñ— групи"
+msgid "GroupSettings|Available only on the top-level group. Applies to all subgroups. Groups already shared with a group outside %{group} are still shared unless removed manually."
+msgstr ""
+
msgid "GroupSettings|Badges"
msgstr "Значки"
@@ -16488,6 +16741,9 @@ msgstr "Якщо видиміÑÑ‚ÑŒ батьківÑької групи нижч
msgid "GroupSettings|New runners registration token has been generated!"
msgstr "Згенеровано новий токен Ð´Ð»Ñ Ñ€ÐµÑ”Ñтрації runner'ів!"
+msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgstr ""
+
msgid "GroupSettings|Pipeline settings was updated for the group"
msgstr "ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ ÐºÐ¾Ð½Ð²ÐµÑ”Ñ€Ñ–Ð² були оновлені Ð´Ð»Ñ Ñ†Ñ–Ñ”Ñ— групи"
@@ -16500,12 +16756,15 @@ msgstr ""
msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
-msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups."
+msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups"
msgstr ""
msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
msgstr "Заборонити Ñпільний доÑтуп до проєкту в рамках %{group} з іншими групами"
+msgid "GroupSettings|Prevents group members from being notified if the group is mentioned."
+msgstr ""
+
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
msgstr ""
@@ -16542,21 +16801,6 @@ msgstr "Цей параметр заÑтоÑовано до %{ancestor_group}. Ð
msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}."
msgstr "Цей параметр заÑтоÑовано до %{ancestor_group}. Ви можете перевизначити Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð°Ð±Ð¾ %{remove_ancestor_share_with_group_lock}."
-msgid "GroupSettings|This setting is only available on the top-level group and it applies to all subgroups. Groups that have already been shared with a group outside %{group} will still be shared, and this access will have to be revoked manually."
-msgstr ""
-
-msgid "GroupSettings|This setting will be applied to all subgroups unless overridden by a group owner. Groups that already have access to the project will continue to have access unless removed manually."
-msgstr "Цей параметр буде заÑтоÑовано до вÑÑ–Ñ… підгруп, Ñкщо тільки не буде перевизначено влаÑником групи. Групи, Ñкі вже мають доÑтуп до проєкту, будуть мати доÑтуп, Ñкщо вони не будуть вилучені вручну."
-
-msgid "GroupSettings|This setting will override user notification preferences for all members of the group, subgroups, and projects."
-msgstr "Це Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¿ÐµÑ€ÐµÐ²Ð¸Ð·Ð½Ð°Ñ‡Ð¸Ñ‚ÑŒ Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ñповіщень Ð´Ð»Ñ Ð²ÑÑ–Ñ… учаÑників групи, підгруп та проєктів."
-
-msgid "GroupSettings|This setting will prevent group members from being notified if the group is mentioned."
-msgstr "Цей параметр запобігає оповіщенню учаÑників групи в разі Ñ—Ñ— згадки."
-
-msgid "GroupSettings|This setting will prevent group members from forking projects outside of the group."
-msgstr ""
-
msgid "GroupSettings|Transfer group"
msgstr "ПеренеÑти групу"
@@ -16648,7 +16892,7 @@ msgid "GroupsNew|Create group"
msgstr "Створити групу"
msgid "GroupsNew|Create new group"
-msgstr ""
+msgstr "Створити нову групу"
msgid "GroupsNew|Export groups with all their related data and move to a new GitLab instance."
msgstr ""
@@ -16674,7 +16918,7 @@ msgstr ""
msgid "GroupsNew|No import options available"
msgstr ""
-msgid "GroupsNew|Not all related objects are migrated, as %{docs_link_start}described here%{docs_link_end}. Please %{feedback_link_start}leave feedback%{feedback_link_end} on this feature."
+msgid "GroupsNew|Not all related objects are migrated. %{docs_link_start}More info%{docs_link_end}."
msgstr ""
msgid "GroupsNew|Personal access token"
@@ -16693,7 +16937,7 @@ msgid "GroupsNew|To import a group, navigate to the group settings for the GitLa
msgstr ""
msgid "GroupsNew|Upload file"
-msgstr ""
+msgstr "Завантажити файл"
msgid "GroupsNew|e.g. h8d3f016698e..."
msgstr ""
@@ -16806,15 +17050,27 @@ msgstr "Ðездоровий"
msgid "Hello %{name},"
msgstr "Привіт %{name},"
-msgid "Hello there"
-msgstr "Привіт"
-
msgid "Hello, %{name}!"
msgstr "Привіт, %{name}!"
msgid "Hello, %{username}!"
msgstr "Привіт, %{username}!"
+msgid "HelloMessage|%{handshake_emoji} Contribute to GitLab: %{contribute_link}"
+msgstr ""
+
+msgid "HelloMessage|%{magnifier_emoji} Create a new GitLab issue: %{new_issue_link}"
+msgstr ""
+
+msgid "HelloMessage|%{rocket_emoji} We like your curiosity! Help us improve GitLab by joining the team: %{jobs_page_link}"
+msgstr ""
+
+msgid "HelloMessage|Does this page need fixes or improvements? Open an issue or contribute a merge request to help make GitLab more lovable. At GitLab, everyone can contribute!"
+msgstr ""
+
+msgid "HelloMessage|Welcome to GitLab!"
+msgstr ""
+
msgid "Help"
msgstr "Допомога"
@@ -16824,13 +17080,10 @@ msgstr "Допомагає запобігти брутфорÑ-атакам ві
msgid "Helps prevent bots from creating accounts."
msgstr "Допомагає запобігти Ñтворенню облікових запиÑів ботами."
-msgid "Helps prevent bots from creating issues"
+msgid "Helps prevent bots from creating issues."
msgstr ""
-msgid "Helps prevent malicious users hide their activity"
-msgstr ""
-
-msgid "Helps reduce request volume (e.g. from crawlers or abusive bots)"
+msgid "Helps prevent malicious users hide their activity."
msgstr ""
msgid "Helps reduce request volume (for example, from crawlers or abusive bots)"
@@ -16958,6 +17211,12 @@ msgstr "ÐžÑ‡Ð¸Ñ‰ÐµÐ½Ð½Ñ ÑƒÑпішно розпочато"
msgid "Housekeeping, export, path, transfer, remove, archive."
msgstr "ОчищеннÑ, екÑпорт, шлÑÑ…, перенеÑеннÑ, видаленнÑ, архівуваннÑ."
+msgid "How do I configure Akismet?"
+msgstr ""
+
+msgid "How do I configure it?"
+msgstr ""
+
msgid "How do I configure runners?"
msgstr ""
@@ -16979,21 +17238,27 @@ msgstr ""
msgid "How do I set up this service?"
msgstr ""
+msgid "How do I use a web terminal?"
+msgstr ""
+
+msgid "How do I use file templates?"
+msgstr ""
+
msgid "How it works"
msgstr "Як це працює"
msgid "How many days need to pass between marking entity for deletion and actual removing it."
msgstr ""
-msgid "How many seconds an IP will be counted towards the limit"
+msgid "How many seconds an IP counts toward the IP address limit."
+msgstr ""
+
+msgid "How the job limiter handles jobs exceeding the thresholds specified below. The 'track' mode only logs the jobs. The 'compress' mode compresses the jobs and raises an exception if the compressed size exceeds the limit."
msgstr ""
msgid "I accept the %{terms_link}"
msgstr "Я приймаю %{terms_link}"
-msgid "I accept the|Terms of Service and Privacy Policy"
-msgstr ""
-
msgid "I forgot my password"
msgstr "Я забув пароль"
@@ -17075,15 +17340,18 @@ msgstr ""
msgid "IP Address"
msgstr "IP-адреÑа"
-msgid "IP expiration time"
+msgid "IP address expiration time"
msgstr ""
-msgid "IP subnet restriction only allowed for top-level groups"
-msgstr "ÐžÐ±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ Ð¿Ñ–Ð´Ð¼ÐµÑ€ÐµÐ¶ IP дозволÑєтьÑÑ Ð»Ð¸ÑˆÐµ Ð´Ð»Ñ Ð³Ñ€ÑƒÐ¿ вищого рівнÑ"
+msgid "IP address restrictions"
+msgstr ""
-msgid "IPs per user"
+msgid "IP addresses per user"
msgstr ""
+msgid "IP subnet restriction only allowed for top-level groups"
+msgstr "ÐžÐ±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ Ð¿Ñ–Ð´Ð¼ÐµÑ€ÐµÐ¶ IP дозволÑєтьÑÑ Ð»Ð¸ÑˆÐµ Ð´Ð»Ñ Ð³Ñ€ÑƒÐ¿ вищого рівнÑ"
+
msgid "Identifier"
msgstr "Ідентифікатор"
@@ -17096,6 +17364,9 @@ msgstr "ІдентифікаціÑ"
msgid "If any indexed field exceeds this limit it will be truncated to this number of characters and the rest will not be indexed or searchable. This does not apply to repository and wiki indexing. Setting this to 0 means it is unlimited."
msgstr ""
+msgid "If blank, defaults to %{code_open}Retry later%{code_close}."
+msgstr ""
+
msgid "If blank, set allowable lifetime to %{instance_level_policy_in_words}, as defined by the instance admin. Once set, existing tokens for users in this group may be revoked."
msgstr ""
@@ -17147,6 +17418,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 did not initiate these sign-in attempts, please reach out to your administrator or enable two-factor authentication (2FA) on your account."
+msgstr ""
+
msgid "If you did not initiate this change, please contact your administrator immediately."
msgstr ""
@@ -17242,12 +17516,12 @@ msgstr "Імпортувати CSV"
msgid "Import Projects from Gitea"
msgstr "Імпортувати проєкти з Gitea"
-msgid "Import a project"
-msgstr "Імпорт проєкту"
-
msgid "Import an exported GitLab project"
msgstr "Імпортувати екÑпортований проєкт GitLab"
+msgid "Import and export rate limits"
+msgstr ""
+
msgid "Import failed due to a GitHub error: %{original}"
msgstr ""
@@ -17257,12 +17531,18 @@ msgstr "Імпортувати з"
msgid "Import from Jira"
msgstr "Імпортувати з Jira"
+msgid "Import group"
+msgstr ""
+
msgid "Import group from file"
msgstr ""
msgid "Import groups"
msgstr ""
+msgid "Import history"
+msgstr ""
+
msgid "Import in progress"
msgstr "Імпорт триває"
@@ -17326,7 +17606,25 @@ msgstr "Імпортувати задачі (tasks) із Phabricator Ñк зад
msgid "Import timed out. Import took longer than %{import_jobs_expiration} seconds"
msgstr "Ð§Ð°Ñ Ñ–Ð¼Ð¿Ð¾Ñ€Ñ‚Ñƒ вичерпано. Імпорт зайнÑв більше %{import_jobs_expiration} Ñекунд"
-msgid "Import/Export Rate Limits"
+msgid "ImportAProjectModal|Import from a project"
+msgstr ""
+
+msgid "ImportAProjectModal|Import members from another project"
+msgstr ""
+
+msgid "ImportAProjectModal|Import project members"
+msgstr ""
+
+msgid "ImportAProjectModal|Only project members (not group members) are imported, and they get the same permissions as the project you import from."
+msgstr ""
+
+msgid "ImportAProjectModal|Successfully imported"
+msgstr ""
+
+msgid "ImportAProjectModal|Unable to import project members"
+msgstr ""
+
+msgid "ImportAProjectModal|You're importing members to the %{strongStart}%{name}%{strongEnd} project."
msgstr ""
msgid "ImportButtons|Connect repositories from"
@@ -17381,7 +17679,7 @@ msgstr[3] ""
msgid "Importing..."
msgstr "Імпорт..."
-msgid "Import|A repository URL usually ends in a .git suffix, although this is not required. Double check to make sure your repository URL is correct."
+msgid "Import|There is not a valid Git repository at this URL. If your HTTP repository is not publicly accessible, verify your credentials."
msgstr ""
msgid "Improve customer support with Service Desk"
@@ -17390,9 +17688,6 @@ msgstr ""
msgid "Improves Git cloning performance."
msgstr ""
-msgid "In %{time_to_now}"
-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 ""
@@ -17619,10 +17914,10 @@ msgid "InProductMarketing|Invite your colleagues today"
msgstr ""
msgid "InProductMarketing|Invite your team in less than 60 seconds"
-msgstr ""
+msgstr "ЗапроÑÑ–Ñ‚ÑŒ Ñвою команду менш ніж за 60 Ñекунд"
msgid "InProductMarketing|Invite your team now"
-msgstr ""
+msgstr "ЗапроÑити Ñвою команду зараз"
msgid "InProductMarketing|Invite your team today to build better code (and processes) together"
msgstr ""
@@ -17678,7 +17973,7 @@ msgstr ""
msgid "InProductMarketing|Start a GitLab Ultimate trial today in less than one minute, no credit card required."
msgstr ""
-msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no CC required"
+msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no credit card required"
msgstr ""
msgid "InProductMarketing|Start a trial"
@@ -17717,7 +18012,7 @@ msgstr ""
msgid "InProductMarketing|Team up in GitLab for greater efficiency"
msgstr ""
-msgid "InProductMarketing|Team work makes the dream work"
+msgid "InProductMarketing|Team work makes the dream work"
msgstr ""
msgid "InProductMarketing|Test, create, deploy"
@@ -18300,6 +18595,9 @@ msgstr "З'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð¿Ñ€Ð¾Ð¹ÑˆÐ»Ð¾ уÑпішно."
msgid "Integrations|Create new issue in Jira"
msgstr "Створити нову задачу в Jira"
+msgid "Integrations|Create new issue in ZenTao"
+msgstr ""
+
msgid "Integrations|Default settings are inherited from the group level."
msgstr ""
@@ -18393,9 +18691,15 @@ msgstr ""
msgid "Integrations|Search Jira issues"
msgstr ""
+msgid "Integrations|Search ZenTao issues"
+msgstr ""
+
msgid "Integrations|Send notifications about project events to Unify Circuit."
msgstr ""
+msgid "Integrations|Send notifications about project events to a Unify Circuit conversation. %{docs_link}"
+msgstr ""
+
msgid "Integrations|Sign in to add namespaces"
msgstr ""
@@ -18435,6 +18739,9 @@ msgstr ""
msgid "Integrations|You've activated every integration 🎉"
msgstr "Ви активували кожну інтеграцію 🎉"
+msgid "Integrations|ZenTao issues display here when you create issues in your project in ZenTao."
+msgstr ""
+
msgid "Interactive mode"
msgstr "Інтерактивний режим"
@@ -18462,9 +18769,6 @@ msgstr ""
msgid "Interval Pattern"
msgstr "Шаблон інтервалу"
-msgid "Introducing Value Stream Analytics"
-msgstr ""
-
msgid "Introducing Your DevOps Report"
msgstr ""
@@ -18561,6 +18865,12 @@ msgstr "ÐедійÑний yaml"
msgid "Investigate vulnerability: %{title}"
msgstr ""
+msgid "Invisible Captcha"
+msgstr ""
+
+msgid "Invisible Captcha helps prevent the creation of spam accounts. It adds a honeypot field and time-sensitive form submission to the account signup form."
+msgstr ""
+
msgid "Invitation"
msgstr "ЗапрошеннÑ"
@@ -18592,7 +18902,7 @@ msgid "Invite member"
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 ""
@@ -18652,7 +18962,7 @@ msgid "InviteMembersModal|Collaborate on open issues and merge requests"
msgstr ""
msgid "InviteMembersModal|Configure CI/CD"
-msgstr ""
+msgstr "Ðалаштувати CI/CD"
msgid "InviteMembersModal|Configure security features"
msgstr ""
@@ -18667,7 +18977,7 @@ msgid "InviteMembersModal|Invite"
msgstr ""
msgid "InviteMembersModal|Invite a group"
-msgstr ""
+msgstr "ЗапроÑити групу"
msgid "InviteMembersModal|Invite members"
msgstr ""
@@ -18709,7 +19019,7 @@ msgid "InviteMembersModal|You're inviting members to the %{strongStart}%{name}%{
msgstr ""
msgid "InviteMembers|Invite a group"
-msgstr ""
+msgstr "ЗапроÑити групу"
msgid "InviteMembers|Invite team members"
msgstr ""
@@ -18718,7 +19028,7 @@ msgid "InviteMember|Add members to this project and start collaborating with you
msgstr ""
msgid "InviteMember|Invite Member"
-msgstr ""
+msgstr "ЗапроÑити учаÑника"
msgid "InviteMember|Invite Members (optional)"
msgstr ""
@@ -18727,10 +19037,10 @@ msgid "InviteMember|Invite another member"
msgstr ""
msgid "InviteMember|Invite members"
-msgstr ""
+msgstr "ЗапроÑити учаÑників"
msgid "InviteMember|Invite your team"
-msgstr ""
+msgstr "ЗапроÑити Ñвою команду"
msgid "InviteMember|Invited users will be added with developer level permissions. %{linkStart}View the documentation%{linkEnd} to see how to change this later."
msgstr ""
@@ -19014,10 +19324,16 @@ msgstr ""
msgid "Issues"
msgstr "Задачі"
+msgid "Issues I've created"
+msgstr ""
+
msgid "Issues Rate Limits"
msgstr "ÐžÐ±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ Ñ‡Ð°Ñтоти задач"
msgid "Issues and merge requests"
+msgstr "Задачі та запити на злиттÑ"
+
+msgid "Issues assigned to me"
msgstr ""
msgid "Issues can be bugs, tasks or ideas to be discussed. Also, issues are searchable and filterable."
@@ -19131,7 +19447,7 @@ msgstr ""
msgid "Iterations|Create cadence"
msgstr ""
-msgid "Iterations|Create your first iteration"
+msgid "Iterations|Create iteration"
msgstr ""
msgid "Iterations|Delete cadence"
@@ -19140,6 +19456,9 @@ msgstr ""
msgid "Iterations|Delete iteration cadence?"
msgstr ""
+msgid "Iterations|Delete iteration?"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -19173,12 +19492,18 @@ msgstr "Ðова ітераціÑ"
msgid "Iterations|New iteration cadence"
msgstr ""
+msgid "Iterations|No closed iterations."
+msgstr ""
+
msgid "Iterations|No iteration cadences to show."
msgstr ""
msgid "Iterations|No iterations in cadence."
msgstr ""
+msgid "Iterations|No open iterations."
+msgstr ""
+
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
@@ -19209,6 +19534,9 @@ msgstr ""
msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
msgstr ""
+msgid "Iterations|This will remove the iteration from any issues that are assigned to it."
+msgstr ""
+
msgid "Iterations|Title"
msgstr "Заголовок"
@@ -19224,15 +19552,9 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr "не може перевищувати 500 років у майбутньому"
-msgid "I’m familiar with the basics of DevOps."
-msgstr ""
-
msgid "I’m joining my team who’s already on GitLab"
msgstr ""
-msgid "I’m not familiar with the basics of DevOps."
-msgstr ""
-
msgid "Jaeger URL"
msgstr "URL-адреÑа Jaeger"
@@ -19497,6 +19819,9 @@ msgstr ""
msgid "Job"
msgstr "ЗавданнÑ"
+msgid "Job %{jobName}"
+msgstr ""
+
msgid "Job Failed #%{build_id}"
msgstr "Ð—Ð°Ð²Ð´Ð°Ð½Ð½Ñ Ð½ÐµÐ²Ð´Ð°Ð»Ðµ #%{build_id}"
@@ -20089,9 +20414,6 @@ msgstr "Докладніше про підпиÑÑƒÐ²Ð°Ð½Ð½Ñ ÐºÐ¾Ð¼Ñ–Ñ‚Ñ–Ð²"
msgid "Learn more in the"
msgstr "ДізнайтеÑÑŒ більше"
-msgid "Learn more in the|pipeline schedules documentation"
-msgstr "Детальніше в документації по розкладами конвеєрів"
-
msgid "Learn more."
msgstr "ДізнатиÑÑ Ð±Ñ–Ð»ÑŒÑˆÐµ."
@@ -20203,9 +20525,6 @@ msgstr "Вийти"
msgid "Leave Admin Mode"
msgstr "Вийти з Режиму ÐдмініÑтратора"
-msgid "Leave blank for no limit. Once set, existing personal access tokens may be revoked."
-msgstr ""
-
msgid "Leave edit mode? All unsaved changes will be lost."
msgstr "Вийти з режиму редагуваннÑ? УÑÑ– незбережені зміни буде втрачено."
@@ -20251,12 +20570,12 @@ msgstr ""
msgid "LicenseCompliance|Acceptable license to be used in the project"
msgstr ""
-msgid "LicenseCompliance|Add a license"
-msgstr "Додати ліцензію"
-
msgid "LicenseCompliance|Add license and related policy"
msgstr "Додати ліцензію та відповідну політику"
+msgid "LicenseCompliance|Add license policy"
+msgstr ""
+
msgid "LicenseCompliance|Allow"
msgstr "Дозволити"
@@ -20356,6 +20675,9 @@ msgstr ""
msgid "LicenseManagement|Uncategorized"
msgstr ""
+msgid "Licensed Enterprise Edition features can be used if the project namespace's plan includes the feature, or if the project is public."
+msgstr ""
+
msgid "Licensed Features"
msgstr "ФункціональніÑÑ‚ÑŒ, доÑтупна в ліцензії"
@@ -20422,7 +20744,10 @@ msgstr "Обмежити Ð²Ñ–Ð´Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ Ð¾Ð´Ð¸Ð½Ð¸Ñ†ÑŒ відÑтежÐ
msgid "Limit namespaces and projects that can be indexed"
msgstr "Обмежити проÑтори імен та проєкти Ñкі можуть бути проіндекÑовані"
-msgid "Limit sign in from multiple ips"
+msgid "Limit project size at a global, group, and project level. %{link_start}Learn more%{link_end}."
+msgstr ""
+
+msgid "Limit sign in from multiple IP addresses"
msgstr ""
msgid "Limit the number of concurrent operations this secondary site can run in the background."
@@ -20434,6 +20759,9 @@ msgstr ""
msgid "Limit the number of issues and epics per minute a user can create through web and API requests."
msgstr ""
+msgid "Limit the size of Sidekiq jobs stored in Redis."
+msgstr ""
+
msgid "Limited to showing %d event at most"
msgid_plural "Limited to showing %d events at most"
msgstr[0] "Показ обмежено тільки %d подією"
@@ -20441,6 +20769,9 @@ msgstr[1] "Показ обмежено тільки %d подіÑми"
msgstr[2] "Показ обмежено тільки %d подіÑми"
msgstr[3] "Показ обмежено тільки %d подіÑми"
+msgid "Limiting mode"
+msgstr ""
+
msgid "Line changes"
msgstr "Зміни Ñ€Ñдка"
@@ -20510,9 +20841,6 @@ msgstr "СпиÑок доÑтупних репозиторіїв"
msgid "List of all merge commits"
msgstr ""
-msgid "List of users to be excluded from the limit"
-msgstr ""
-
msgid "List options"
msgstr ""
@@ -20552,9 +20880,6 @@ msgstr "Ð—Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ñ„Ð°Ð¹Ð»Ñ–Ð², директорій та підÐ
msgid "Loading functions timed out. Please reload the page to try again."
msgstr "Ð—Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ñ„ÑƒÐ½ÐºÑ†Ñ–Ð¹ перевищило ліміт чаÑу. Будь лаÑка, перезавантажте цю Ñторінку Ñ– Ñпробуйте знову."
-msgid "Loading issues"
-msgstr "Ð—Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ð·Ð°Ð´Ð°Ñ‡"
-
msgid "Loading more"
msgstr "Завантажити більше"
@@ -20846,6 +21171,9 @@ msgstr ""
msgid "Marked For Deletion At - %{deletion_time}"
msgstr ""
+msgid "Marked as ready. Merging is now allowed."
+msgstr ""
+
msgid "Marked this %{noun} as a draft."
msgstr ""
@@ -20918,52 +21246,22 @@ msgstr ""
msgid "Max 100,000 events"
msgstr "МакÑ. 100 000 подій"
-msgid "Max 20 characters"
-msgstr ""
-
-msgid "Max Group Export Download requests per minute per user"
-msgstr ""
-
-msgid "Max Group Export requests per minute per user"
-msgstr ""
-
-msgid "Max Group Import requests per minute per user"
-msgstr ""
-
-msgid "Max Project Export Download requests per minute per user"
-msgstr ""
-
-msgid "Max Project Export requests per minute per user"
-msgstr ""
-
-msgid "Max Project Import requests per minute per user"
-msgstr ""
-
-msgid "Max authenticated API requests per period per user"
-msgstr ""
-
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
-msgid "Max authenticated web requests per period per user"
-msgstr ""
-
msgid "Max file size is 200 KB."
msgstr ""
-msgid "Max requests per minute per user"
-msgstr ""
-
msgid "Max role"
-msgstr ""
+msgstr "МакÑимальна роль"
msgid "Max session time"
msgstr ""
-msgid "Max unauthenticated requests per period per IP"
+msgid "MaxBuilds"
msgstr ""
-msgid "MaxBuilds"
+msgid "Maximum 20 characters"
msgstr ""
msgid "Maximum Conan package file size in bytes"
@@ -20999,6 +21297,12 @@ msgstr ""
msgid "Maximum attachment size (MB)"
msgstr "МакÑимальний розмір Ð²ÐºÐ»Ð°Ð´ÐµÐ½Ð½Ñ (МБ)"
+msgid "Maximum authenticated API requests per rate limit period per user"
+msgstr ""
+
+msgid "Maximum authenticated web requests per rate limit period per user"
+msgstr ""
+
msgid "Maximum bulk request size (MiB)"
msgstr ""
@@ -21044,6 +21348,15 @@ msgstr ""
msgid "Maximum files in a diff"
msgstr ""
+msgid "Maximum group export download requests per minute"
+msgstr ""
+
+msgid "Maximum group export requests per minute"
+msgstr ""
+
+msgid "Maximum group import requests per minute"
+msgstr ""
+
msgid "Maximum import size"
msgstr ""
@@ -21080,7 +21393,7 @@ msgstr "МакÑимальна кількіÑÑ‚ÑŒ дзеркал, що можуÑ
msgid "Maximum number of projects."
msgstr ""
-msgid "Maximum number of unique IPs per user"
+msgid "Maximum number of unique IP addresses per user."
msgstr ""
msgid "Maximum page reached"
@@ -21089,12 +21402,24 @@ msgstr ""
msgid "Maximum page size"
msgstr ""
+msgid "Maximum project export download requests per minute"
+msgstr ""
+
+msgid "Maximum project export requests per minute"
+msgstr ""
+
+msgid "Maximum project import requests per minute"
+msgstr ""
+
msgid "Maximum push size"
msgstr ""
msgid "Maximum push size (MB)"
msgstr "МакÑимальний розмір Ð´Ð»Ñ Ð²Ñ–Ð´Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð½Ñ (МБ)"
+msgid "Maximum requests per minute"
+msgstr ""
+
msgid "Maximum running slices"
msgstr ""
@@ -21122,10 +21447,16 @@ msgstr ""
msgid "Maximum time between updates that a mirror can have when scheduled to synchronize."
msgstr "МакÑимальний можливий Ñ‡Ð°Ñ Ð¼Ñ–Ð¶ оновленнÑми Ð´Ð»Ñ Ð´Ð·ÐµÑ€ÐºÐ°Ð»Ð° при запланованій Ñинхронізації."
-msgid "Maximum time for web terminal websocket connection (in seconds). 0 for unlimited."
+msgid "Maximum time that users are allowed to skip the setup of two-factor authentication (in hours). Set to 0 (zero) to enforce at next sign in."
msgstr ""
-msgid "Maximum time that users are allowed to skip the setup of two-factor authentication (in hours). Set to 0 (zero) to enforce at next sign in."
+msgid "Maximum time, in seconds, for a web terminal websocket connection. 0 for unlimited."
+msgstr ""
+
+msgid "Maximum unauthenticated API requests per rate limit period per IP"
+msgstr ""
+
+msgid "Maximum unauthenticated web requests per rate limit period per IP"
msgstr ""
msgid "May"
@@ -21143,9 +21474,6 @@ msgstr ""
msgid "Medium vulnerabilities present"
msgstr "ПриÑутні вразливоÑÑ‚Ñ– низького рівнÑ"
-msgid "Member lock"
-msgstr "Ð‘Ð»Ð¾ÐºÑƒÐ²Ð°Ð½Ð½Ñ ÑƒÑ‡Ð°Ñників"
-
msgid "Member since"
msgstr ""
@@ -21182,6 +21510,9 @@ msgstr ""
msgid "Members of a group may only view projects they have permission to access"
msgstr ""
+msgid "Membership"
+msgstr ""
+
msgid "Members|%{time} by %{user}"
msgstr ""
@@ -21210,10 +21541,10 @@ msgid "Members|Are you sure you want to leave \"%{source}\"?"
msgstr ""
msgid "Members|Are you sure you want to remove \"%{groupName}\"?"
-msgstr ""
+msgstr "Ви впевнені, що хочете видалити\"%{groupName}?"
msgid "Members|Are you sure you want to remove %{usersName} from \"%{source}\"?"
-msgstr ""
+msgstr "Ви впевнені, що хочете видалити %{usersName} з \"%{source}\"?"
msgid "Members|Are you sure you want to remove this orphaned member from \"%{source}\"?"
msgstr ""
@@ -21242,9 +21573,6 @@ msgstr ""
msgid "Members|Expiration date updated successfully."
msgstr ""
-msgid "Members|Expired"
-msgstr ""
-
msgid "Members|Filter members"
msgstr "Фільтр учаÑників"
@@ -21260,9 +21588,6 @@ msgstr ""
msgid "Members|Membership"
msgstr ""
-msgid "Members|No expiration set"
-msgstr ""
-
msgid "Members|Remove \"%{groupName}\""
msgstr "Видалити \"%{groupName}\""
@@ -21284,9 +21609,6 @@ msgstr ""
msgid "Members|Search invited"
msgstr ""
-msgid "Members|in %{time}"
-msgstr ""
-
msgid "Member|Deny access"
msgstr ""
@@ -21324,7 +21646,7 @@ msgid "Merge Requests in Review"
msgstr ""
msgid "Merge Requests merged"
-msgstr ""
+msgstr "Запити на Ð·Ð»Ð¸Ñ‚Ñ‚Ñ Ð¾Ð±'єднано"
msgid "Merge automatically (%{strategy})"
msgstr ""
@@ -21362,11 +21684,8 @@ msgstr "Запит на злиттÑ"
msgid "Merge request %{mr_link} was reviewed by %{mr_author}"
msgstr ""
-msgid "Merge request (MR) approvals"
-msgstr ""
-
msgid "Merge request analytics"
-msgstr ""
+msgstr "Ðналітика запиту на злиттÑ"
msgid "Merge request approvals"
msgstr "Ð—Ð°Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ Ð·Ð°Ð¿Ð¸Ñ‚Ñ–Ð² на злиттÑ"
@@ -21378,7 +21697,7 @@ msgid "Merge request dependencies"
msgstr "ЗалежноÑÑ‚Ñ– запиту на злиттÑ"
msgid "Merge request events"
-msgstr ""
+msgstr "Події запиту на злиттÑ"
msgid "Merge request was scheduled to merge after pipeline succeeds"
msgstr ""
@@ -21386,12 +21705,21 @@ msgstr ""
msgid "Merge requests"
msgstr "Запити на злиттÑ"
+msgid "Merge requests I've created"
+msgstr ""
+
msgid "Merge requests are a place to propose changes you've made to a project and discuss those changes with others"
msgstr "Запит на Ð·Ð»Ð¸Ñ‚Ñ‚Ñ â€” це ÑпоÑіб запропонувати Ñвої зміни до проєкту Ñ– обговорити Ñ—Ñ… із іншими"
msgid "Merge requests are read-only in a secondary Geo node"
msgstr "Запити на об'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð´Ð¾Ñтупні лише Ð´Ð»Ñ Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ Ð½Ð° вторинному вузлі Geo"
+msgid "Merge requests assigned to me"
+msgstr ""
+
+msgid "Merge requests that I'm a reviewer"
+msgstr ""
+
msgid "Merge the branch and fix any conflicts that come up"
msgstr ""
@@ -21452,12 +21780,12 @@ msgstr ""
msgid "MergeRequests|An error occurred while saving the draft comment."
msgstr "Виникла помилка під Ñ‡Ð°Ñ Ð·Ð±ÐµÑ€ÐµÐ¶ÐµÐ½Ð½Ñ Ñ‡ÐµÑ€Ð½ÐµÑ‚ÐºÐ¸ коментарÑ."
+msgid "MergeRequests|Create issue to resolve thread"
+msgstr ""
+
msgid "MergeRequests|Failed to squash. Should be done manually."
msgstr "ÐевдалоÑÑ Ð¾Ð±â€™Ñ”Ð´Ð½Ð°Ñ‚Ð¸ коміти. Це повинно бути виконано вручну."
-msgid "MergeRequests|Resolve this thread in a new issue"
-msgstr "Вирішити це Ð¾Ð±Ð³Ð¾Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð² новій задачі"
-
msgid "MergeRequests|Saving the comment failed"
msgstr "Помилка при збереженні коментарÑ"
@@ -22244,7 +22572,7 @@ msgid "Move"
msgstr "ПереміÑтити"
msgid "Move down"
-msgstr ""
+msgstr "ПереміÑтити вниз"
msgid "Move issue"
msgstr "ПереміÑтити задачу"
@@ -22265,7 +22593,7 @@ msgid "Move this issue to another project."
msgstr "ПереміÑтити цю задачу до іншого проєкту."
msgid "Move up"
-msgstr ""
+msgstr "ПереміÑтити вгору"
msgid "MoveIssue|Cannot move issue due to insufficient permissions!"
msgstr "Ðеможливо переміÑтити задачу через недоÑтатній набір дозволів!"
@@ -22273,6 +22601,9 @@ msgstr "Ðеможливо переміÑтити задачу через нед
msgid "MoveIssue|Cannot move issue to project it originates from!"
msgstr "Ðеможливо перенеÑти задачу до проєкту, в Ñкому вона знаходитьÑÑ!"
+msgid "MoveIssue|Cannot move issues of '%{issue_type}' type."
+msgstr ""
+
msgid "Moved issue to %{label} column in the board."
msgstr "Переміщено задачу в колонку %{label} на дошці."
@@ -22289,10 +22620,10 @@ msgid "MrDeploymentActions|Deploy"
msgstr ""
msgid "MrDeploymentActions|Re-deploy"
-msgstr ""
+msgstr "Повторно розгорнути"
msgid "MrDeploymentActions|Stop environment"
-msgstr ""
+msgstr "Зупинити Ñередовище"
msgid "Multi-project"
msgstr "Багатопроєкт"
@@ -22400,6 +22731,15 @@ 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. To learn more about reducing storage capacity please visit our docs."
msgstr ""
+msgid "NamespaceUserCap|Pending users must be reviewed and approved by a group owner. Learn more about %{user_caps_link_start}User Caps%{link_end} and %{users_pending_approval_link_start}Users Pending Approval%{link_end}."
+msgstr ""
+
+msgid "NamespaceUserCap|View pending user approvals"
+msgstr ""
+
+msgid "NamespaceUserCap|Your group has reached its billable member limit"
+msgstr ""
+
msgid "Namespaces"
msgstr "ПроÑтори імен"
@@ -22442,9 +22782,6 @@ msgstr "Потребує уваги"
msgid "Network"
msgstr "Мережа"
-msgid "Network Policy|New rule"
-msgstr ""
-
msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is inbound from a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
msgstr ""
@@ -22466,16 +22803,13 @@ msgstr ""
msgid "NetworkPolicies|%{strongOpen}any%{strongClose} port"
msgstr ""
-msgid "NetworkPolicies|+ Add alert"
-msgstr ""
-
msgid "NetworkPolicies|.yaml"
msgstr ".yaml"
msgid "NetworkPolicies|.yaml mode"
msgstr ""
-msgid "NetworkPolicies|Actions"
+msgid "NetworkPolicies|Add alert"
msgstr ""
msgid "NetworkPolicies|Alerts are intended to be selectively used for a limited number of events that are potentially concerning and warrant a manual review. Alerts should not be used as a substitute for a SIEM or a logging tool. High volume alerts are likely to be dropped so as to preserve the stability of GitLab's integration with Kubernetes."
@@ -22511,9 +22845,6 @@ msgstr ""
msgid "NetworkPolicies|Deny all traffic"
msgstr ""
-msgid "NetworkPolicies|Description"
-msgstr ""
-
msgid "NetworkPolicies|Edit policy"
msgstr "Редагувати політику"
@@ -22526,9 +22857,6 @@ msgstr ""
msgid "NetworkPolicies|IP/subnet"
msgstr ""
-msgid "NetworkPolicies|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
-msgstr ""
-
msgid "NetworkPolicies|Invalid or empty policy"
msgstr ""
@@ -22538,19 +22866,16 @@ msgstr ""
msgid "NetworkPolicies|Kubernetes error: %{error}"
msgstr ""
-msgid "NetworkPolicies|Name"
-msgstr "Ðазва"
-
msgid "NetworkPolicies|Network"
msgstr ""
-msgid "NetworkPolicies|Network traffic"
+msgid "NetworkPolicies|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
msgstr ""
-msgid "NetworkPolicies|New policy"
+msgid "NetworkPolicies|Network policy can be created after the environment is loaded successfully."
msgstr ""
-msgid "NetworkPolicies|No policies detected"
+msgid "NetworkPolicies|Network traffic"
msgstr ""
msgid "NetworkPolicies|None selected"
@@ -22559,21 +22884,12 @@ msgstr ""
msgid "NetworkPolicies|Please %{installLinkStart}install%{installLinkEnd} and %{configureLinkStart}configure a Kubernetes Agent for this project%{configureLinkEnd} to enable alerts."
msgstr ""
-msgid "NetworkPolicies|Policies are a specification of how groups of pods are allowed to communicate with each other's network endpoints."
-msgstr ""
-
msgid "NetworkPolicies|Policy %{policyName} was successfully changed"
msgstr ""
msgid "NetworkPolicies|Policy definition"
msgstr ""
-msgid "NetworkPolicies|Policy editor"
-msgstr ""
-
-msgid "NetworkPolicies|Policy preview"
-msgstr ""
-
msgid "NetworkPolicies|Rule"
msgstr ""
@@ -22583,9 +22899,6 @@ msgstr ""
msgid "NetworkPolicies|Rule mode is unavailable for this policy. In some cases, we cannot parse the YAML file back into the rules editor."
msgstr ""
-msgid "NetworkPolicies|Rules"
-msgstr ""
-
msgid "NetworkPolicies|Save changes"
msgstr ""
@@ -22598,9 +22911,6 @@ msgstr ""
msgid "NetworkPolicies|Traffic that does not match any rule will be blocked."
msgstr ""
-msgid "NetworkPolicies|Unable to parse policy"
-msgstr ""
-
msgid "NetworkPolicies|all DNS names"
msgstr ""
@@ -22771,7 +23081,7 @@ msgid "New group URL"
msgstr ""
msgid "New group name"
-msgstr ""
+msgstr "Ðова назва групи"
msgid "New health check access token has been generated!"
msgstr "Згенеровано новий токен Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ²Ñ–Ñ€ÐºÐ¸ працездатноÑÑ‚Ñ–!"
@@ -22782,6 +23092,9 @@ msgstr "Ðова ідентифікаціÑ"
msgid "New issue"
msgstr "Ðова задача"
+msgid "New issue in %{project}"
+msgstr ""
+
msgid "New issue title"
msgstr "Ðазва нової задачі"
@@ -22860,8 +23173,8 @@ msgstr "Ðовий..."
msgid "Newest first"
msgstr "Спочатку нові"
-msgid "Newly registered users will by default be external"
-msgstr "За замовчуваннÑм щойно зареєÑтровані кориÑтувачі будуть зовнішніми кориÑтувачами"
+msgid "Newly-registered users are external by default"
+msgstr ""
msgid "Next"
msgstr "Далі"
@@ -23175,8 +23488,12 @@ msgstr "ВразливоÑÑ‚Ñ– відÑутні"
msgid "No webhooks found, add one in the form above."
msgstr "Ðе знайдено жодного вебхука, додайте його у формі вище."
-msgid "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} to renew your subscription."
-msgstr "Ðе хвилюйтеÑÑ, на даний момент ви можете викориÑтовувати вÑÑ– функції %{strong}%{plan_name}%{strong_close}. Ви маєте %{remaining_days} щоб продовжити підпиÑку."
+msgid "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} day to renew your subscription."
+msgid_plural "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} days to renew your subscription."
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
msgid "No. of commits"
msgstr ""
@@ -23193,7 +23510,7 @@ msgstr "Вузол уÑпішно оновлено."
msgid "Nodes"
msgstr "Вузли"
-msgid "Non-admin users can sign in with read-only access and make read-only API requests."
+msgid "Non-admin users are restricted to read-only access, in both GitLab UI and API."
msgstr ""
msgid "None"
@@ -23274,7 +23591,7 @@ msgstr "Примітка: звернітьÑÑ Ð´Ð¾ вашого адмініÑÑ
msgid "NoteForm|Note"
msgstr "Примітка"
-msgid "Notes Rate Limits"
+msgid "Notes rate limit"
msgstr ""
msgid "Notes|Are you sure you want to cancel creating this comment?"
@@ -23449,11 +23766,8 @@ msgstr "лиÑÑ‚."
msgid "November"
msgstr "лиÑтопад"
-msgid "Novice"
-msgstr ""
-
msgid "Now, personalize your GitLab experience"
-msgstr ""
+msgstr "Тепер, перÑоналізуйте Ñвій доÑвід GitLab"
msgid "Nuget metadatum must have at least license_url, project_url or icon_url set"
msgstr ""
@@ -23620,8 +23934,8 @@ msgstr ""
msgid "OnCallSchedules|For this rotation, on-call will be:"
msgstr ""
-msgid "OnCallSchedules|On-call schedule %{schedule} in Project %{project}"
-msgstr "Розклад викликів %{schedule} в проєкті %{project}"
+msgid "OnCallSchedules|On-call schedule %{obstacle} in Project %{project}"
+msgstr ""
msgid "OnCallSchedules|On-call schedules"
msgstr "Розклад Ð´Ð»Ñ Ð²Ð¸ÐºÐ»Ð¸ÐºÑƒ"
@@ -23767,22 +24081,22 @@ msgstr ""
msgid "OnDemandScans|Scanner profile"
msgstr ""
-msgid "OnDemandScans|Select one of the existing profiles"
+msgid "OnDemandScans|Schedule scan"
msgstr ""
-msgid "OnDemandScans|Site profile"
+msgid "OnDemandScans|Select one of the existing profiles"
msgstr ""
-msgid "OnDemandScans|Use existing scanner profile"
+msgid "OnDemandScans|Site profile"
msgstr ""
-msgid "OnDemandScans|Use existing site profile"
+msgid "OnDemandScans|Start time"
msgstr ""
-msgid "OnDemandScans|You can either choose a passive scan or validate the target site in your chosen site profile. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
+msgid "OnDemandScans|Use existing scanner profile"
msgstr ""
-msgid "OnDemandScans|You cannot run an active scan against an unvalidated site."
+msgid "OnDemandScans|Use existing site profile"
msgstr ""
msgid "OnDemandScans|You must create a repository within your project to run an on-demand scan."
@@ -23849,6 +24163,9 @@ msgstr ""
msgid "Only admins can delete project"
msgstr "Тільки адмініÑтратори можуть видалÑти проєкт"
+msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
+msgstr ""
+
msgid "Only include features new to your current subscription tier."
msgstr ""
@@ -23867,6 +24184,12 @@ msgstr "Лише учаÑника проєкту будуть імпортова
msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
+msgid "Only reCAPTCHA v2 is supported:"
+msgstr ""
+
+msgid "Only users from the specified IP address ranges are able to reach this group, including all subgroups, projects, and Git repositories."
+msgstr ""
+
msgid "Only verified users with an email address in any of these domains can be added to the group."
msgstr ""
@@ -24053,9 +24376,6 @@ msgstr "ВлаÑник"
msgid "Package Registry"
msgstr "РеєÑÑ‚Ñ€ пакетів"
-msgid "Package Registry Rate Limits"
-msgstr ""
-
msgid "Package Registry: authenticated API requests"
msgstr ""
@@ -24074,9 +24394,12 @@ msgstr ""
msgid "Package recipe already exists"
msgstr ""
-msgid "Package type"
+msgid "Package registry rate limits"
msgstr ""
+msgid "Package type"
+msgstr "Тип пакету"
+
msgid "Package type must be Conan"
msgstr ""
@@ -24140,6 +24463,9 @@ msgstr ""
msgid "PackageRegistry|Composer"
msgstr ""
+msgid "PackageRegistry|Composer.json with license: %{license} and version: %{version}"
+msgstr ""
+
msgid "PackageRegistry|Conan"
msgstr "Conan"
@@ -24203,6 +24529,9 @@ msgstr ""
msgid "PackageRegistry|Copy require package include"
msgstr ""
+msgid "PackageRegistry|Copy target SHA"
+msgstr ""
+
msgid "PackageRegistry|Copy yarn command"
msgstr "Скопіювати команду yarn"
@@ -24269,6 +24598,9 @@ msgstr "Якщо ви ще не зробили цього, вам потрібн
msgid "PackageRegistry|Install package version"
msgstr ""
+msgid "PackageRegistry|Instance-level"
+msgstr ""
+
msgid "PackageRegistry|Invalid Package: failed metadata extraction"
msgstr ""
@@ -24314,6 +24646,9 @@ msgstr ""
msgid "PackageRegistry|Pip Command"
msgstr "Команда pip"
+msgid "PackageRegistry|Project-level"
+msgstr ""
+
msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
msgstr ""
@@ -24335,6 +24670,9 @@ msgstr "ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ñ€ÐµÑ”Ñтру"
msgid "PackageRegistry|Remove package"
msgstr "Видалити пакет"
+msgid "PackageRegistry|Required Python: %{pythonVersion}"
+msgstr ""
+
msgid "PackageRegistry|RubyGems"
msgstr ""
@@ -24377,6 +24715,9 @@ msgstr ""
msgid "PackageRegistry|Source project located at %{link}"
msgstr ""
+msgid "PackageRegistry|Target SHA: %{sha}"
+msgstr ""
+
msgid "PackageRegistry|There are no other versions of this package."
msgstr "Ðемає інших верÑій цього пакету."
@@ -24545,6 +24886,18 @@ msgstr "Пароль змінено уÑпішно"
msgid "Password was successfully updated. Please sign in again."
msgstr ""
+msgid "PasswordPrompt|Confirm password"
+msgstr ""
+
+msgid "PasswordPrompt|Confirm password to continue"
+msgstr ""
+
+msgid "PasswordPrompt|Password is required"
+msgstr ""
+
+msgid "PasswordPrompt|Please enter your password to confirm"
+msgstr ""
+
msgid "Passwords should be unique and not used for any other sites or services."
msgstr ""
@@ -24572,6 +24925,9 @@ msgstr "Ð’Ñтавити поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð° задачу"
msgid "Paste project path (i.e. gitlab-org/gitlab)"
msgstr ""
+msgid "Paste this DSN into your Sentry SDK"
+msgstr ""
+
msgid "Paste your public SSH key, which is usually contained in the file '~/.ssh/id_ed25519.pub' or '~/.ssh/id_rsa.pub' and begins with 'ssh-ed25519' or 'ssh-rsa'. Do not paste your private SSH key, as that can compromise your identity."
msgstr ""
@@ -24656,6 +25012,9 @@ msgstr ""
msgid "PerformanceBar|First Contentful Paint"
msgstr ""
+msgid "PerformanceBar|Flamegraph with mode:"
+msgstr ""
+
msgid "PerformanceBar|Frontend resources"
msgstr ""
@@ -24689,6 +25048,15 @@ msgstr ""
msgid "PerformanceBar|Trace"
msgstr ""
+msgid "PerformanceBar|cpu"
+msgstr ""
+
+msgid "PerformanceBar|object"
+msgstr ""
+
+msgid "PerformanceBar|wall"
+msgstr ""
+
msgid "Period in seconds"
msgstr ""
@@ -24762,7 +25130,7 @@ msgid "Pipeline Schedules"
msgstr "Розклади Конвеєрів"
msgid "Pipeline URL"
-msgstr ""
+msgstr "URL Конвеєра"
msgid "Pipeline durations for the last 30 commits"
msgstr ""
@@ -24774,7 +25142,7 @@ msgid "Pipeline minutes quota:"
msgstr "Квота хвилин Ð´Ð»Ñ ÐºÐ¾Ð½Ð²ÐµÑ”Ñ€Ñ–Ð²:"
msgid "Pipeline ran in fork of project"
-msgstr ""
+msgstr "Конвеєр запущений у форку проєкту"
msgid "Pipeline status emails"
msgstr "Електронні лиÑти про ÑÑ‚Ð°Ñ‚ÑƒÑ ÐºÐ¾Ð½Ð²ÐµÑ”Ñ€Ð°"
@@ -24822,16 +25190,16 @@ msgid "PipelineCharts|Total:"
msgstr "Ð’Ñього:"
msgid "PipelineEditorTutorial|Browse %{linkStart}CI/CD examples and templates%{linkEnd}"
-msgstr ""
+msgstr "ПереглÑньте %{linkStart}прикладів та шаблонів CI/CD%{linkEnd}"
msgid "PipelineEditorTutorial|Commit the file to your repository. The pipeline then runs automatically."
msgstr ""
msgid "PipelineEditorTutorial|Get started with GitLab CI/CD"
-msgstr ""
+msgstr "Розпочати роботу з GitLab CI/CD"
msgid "PipelineEditorTutorial|GitLab CI/CD can automatically build, test, and deploy your application."
-msgstr ""
+msgstr "GitLab CI/CD може автоматично Ñтворювати, теÑтувати та розгортати ваш заÑтоÑунок."
msgid "PipelineEditorTutorial|If you’re using a self-managed GitLab instance, %{linkStart}make sure your instance has runners available.%{linkEnd}"
msgstr ""
@@ -24917,6 +25285,48 @@ msgstr "Ціль"
msgid "PipelineSchedules|Variables"
msgstr "Змінні"
+msgid "PipelineSource|API"
+msgstr ""
+
+msgid "PipelineSource|Chat"
+msgstr ""
+
+msgid "PipelineSource|External"
+msgstr ""
+
+msgid "PipelineSource|External Pull Request"
+msgstr ""
+
+msgid "PipelineSource|Merge Request"
+msgstr ""
+
+msgid "PipelineSource|On-Demand DAST Scan"
+msgstr ""
+
+msgid "PipelineSource|On-Demand DAST Validation"
+msgstr ""
+
+msgid "PipelineSource|Parent Pipeline"
+msgstr ""
+
+msgid "PipelineSource|Pipeline"
+msgstr ""
+
+msgid "PipelineSource|Push"
+msgstr ""
+
+msgid "PipelineSource|Schedule"
+msgstr ""
+
+msgid "PipelineSource|Trigger"
+msgstr ""
+
+msgid "PipelineSource|Web"
+msgstr ""
+
+msgid "PipelineSource|Web IDE"
+msgstr ""
+
msgid "PipelineStatusTooltip|Pipeline: %{ciStatus}"
msgstr "Конвеєр: %{ciStatus}"
@@ -24939,7 +25349,7 @@ msgid "Pipelines|API"
msgstr "API"
msgid "Pipelines|Add a code quality job"
-msgstr ""
+msgstr "Додати Ð·Ð°Ð²Ð´Ð°Ð½Ð½Ñ ÑкоÑÑ‚Ñ– коду"
msgid "Pipelines|Are you sure you want to run this pipeline?"
msgstr "Ви впевнені, що хочете запуÑтити цей конвеєр?"
@@ -25005,7 +25415,7 @@ msgid "Pipelines|Last Used"
msgstr "ОÑтанній викориÑтаний"
msgid "Pipelines|Learn about Runners"
-msgstr ""
+msgstr "ДізнайтеÑÑ Ð±Ñ–Ð»ÑŒÑˆÐµ про Runner'ів"
msgid "Pipelines|Lint"
msgstr ""
@@ -25215,48 +25625,9 @@ msgid "Pipeline|Skipped"
msgstr "Пропущено"
msgid "Pipeline|Source"
-msgstr ""
-
-msgid "Pipeline|Source|API"
-msgstr ""
-
-msgid "Pipeline|Source|Chat"
-msgstr ""
-
-msgid "Pipeline|Source|External"
-msgstr ""
-
-msgid "Pipeline|Source|External Pull Request"
-msgstr ""
-
-msgid "Pipeline|Source|Merge Request"
-msgstr ""
-
-msgid "Pipeline|Source|On-Demand DAST Scan"
-msgstr ""
-
-msgid "Pipeline|Source|On-Demand DAST Validation"
-msgstr ""
-
-msgid "Pipeline|Source|Parent Pipeline"
-msgstr ""
-
-msgid "Pipeline|Source|Pipeline"
-msgstr ""
-
-msgid "Pipeline|Source|Push"
-msgstr ""
-
-msgid "Pipeline|Source|Schedule"
-msgstr ""
-
-msgid "Pipeline|Source|Trigger"
-msgstr ""
-
-msgid "Pipeline|Source|Web"
-msgstr ""
+msgstr "Джерело"
-msgid "Pipeline|Source|Web IDE"
+msgid "Pipeline|Source|Security Policy"
msgstr ""
msgid "Pipeline|Specify variable values to be used in this run. The values specified in %{linkStart}CI/CD settings%{linkEnd} will be used by default."
@@ -25307,8 +25678,8 @@ msgstr "ПереглÑнути конвеєр"
msgid "Pipeline|We are currently unable to fetch pipeline data"
msgstr ""
-msgid "Pipeline|You’re about to stop pipeline %{pipelineId}."
-msgstr "Зараз ви зупинете конвеєр %{pipelineId}."
+msgid "Pipeline|You’re about to stop pipeline #%{pipelineId}."
+msgstr ""
msgid "Pipeline|for"
msgstr "ДлÑ"
@@ -25334,6 +25705,9 @@ msgstr ""
msgid "Plain diff"
msgstr "ПроÑте порівнÑннÑ"
+msgid "Plain-text response to send to clients that hit a rate limit"
+msgstr ""
+
msgid "Plan:"
msgstr "План:"
@@ -25478,9 +25852,6 @@ msgstr "Будь лаÑка, вкажіть дійÑну e-mail адреÑу."
msgid "Please provide attributes to update"
msgstr ""
-msgid "Please provide your username or email address."
-msgstr ""
-
msgid "Please reach out if you have any questions and we'll be happy to assist."
msgstr ""
@@ -25523,9 +25894,6 @@ msgstr ""
msgid "Please set a new password before proceeding."
msgstr "Будь лаÑка, вÑтановіть пароль перед продовженнÑм."
-msgid "Please share your feedback about %{featureName} %{linkStart}in this issue%{linkEnd} to help us improve the experience."
-msgstr ""
-
msgid "Please solve the captcha"
msgstr ""
@@ -25539,7 +25907,7 @@ msgid "Please type %{phrase_code} to proceed or close this modal to cancel."
msgstr "Будь лаÑка, введіть %{phrase_code} Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð´Ð¾Ð²Ð¶ÐµÐ½Ð½Ñ Ð°Ð±Ð¾ закрийте це модальне вікно Ð´Ð»Ñ Ð²Ñ–Ð´Ð¼Ñ–Ð½Ð¸."
msgid "Please type the following to confirm:"
-msgstr ""
+msgstr "Будь лаÑка, введіть наÑтупні дії Ð´Ð»Ñ Ð¿Ñ–Ð´Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ:"
msgid "Please use this form to report to the admin users who create spam issues, comments or behave inappropriately."
msgstr "Будь лаÑка, викориÑтовуйте цю форму щоб повідомити адміну Ñкі кориÑтувачі Ñтворюють Ñпам (задачі або коментарі) або поводÑÑ‚ÑŒÑÑ Ð½ÐµÐ½Ð°Ð»ÐµÐ¶Ð½Ð¸Ð¼ чином."
@@ -25703,6 +26071,9 @@ msgstr "Ðазад"
msgid "Prevent adding new members to project membership within this group"
msgstr "Заборонити Ð´Ð¾Ð´Ð°Ð²Ð°Ð½Ð½Ñ Ð½Ð¾Ð²Ð¸Ñ… учаÑників до членÑтва в цій групі"
+msgid "Prevent auto-stopping"
+msgstr ""
+
msgid "Prevent editing approval rules in projects and merge requests."
msgstr ""
@@ -25715,7 +26086,7 @@ msgstr ""
msgid "Prevent users from changing their profile name"
msgstr "Заборонити кориÑтувачам змінювати ім'Ñ Ñвого профілю"
-msgid "Prevent users from performing write operations on GitLab while performing maintenance."
+msgid "Prevent users from performing write operations while GitLab maintenance is in progress."
msgstr ""
msgid "Preview"
@@ -25917,7 +26288,7 @@ msgid "Profiles|Bio"
msgstr "Про Ñебе"
msgid "Profiles|Busy"
-msgstr ""
+msgstr "ЗайнÑтий"
msgid "Profiles|Change username"
msgstr "Змінити ім'Ñ ÐºÐ¾Ñ€Ð¸Ñтувача"
@@ -25988,6 +26359,9 @@ msgstr ""
msgid "Profiles|Enter your name, so people you know can recognize you"
msgstr "Введіть ваше ім'Ñ, щоб люди, Ñких ви знаєте, могли Ð²Ð°Ñ ÑƒÐ¿Ñ–Ð·Ð½Ð°Ñ‚Ð¸"
+msgid "Profiles|Enter your password to confirm the email change"
+msgstr ""
+
msgid "Profiles|Enter your pronouns to let people know how to refer to you"
msgstr ""
@@ -26222,12 +26596,12 @@ msgstr "Ваш ÑтатуÑ"
msgid "Profiles|e.g. My MacBook key"
msgstr "наприклад, мій ключ MacBook"
+msgid "Profiles|https://website.com"
+msgstr ""
+
msgid "Profiles|username"
msgstr "ім'Ñ ÐºÐ¾Ñ€Ð¸Ñтувача"
-msgid "Profiles|website.com"
-msgstr "Ñайт.укр"
-
msgid "Profiles|your account"
msgstr "ваш обліковий запиÑ"
@@ -26334,7 +26708,7 @@ msgid "Project export download requests"
msgstr ""
msgid "Project export enabled"
-msgstr "ЕкÑпорт проєкту ввімкнено"
+msgstr "ЕкÑпорт проєкту увімкнено"
msgid "Project export has been deleted."
msgstr "ЕкÑпорт проєкту видалений."
@@ -26468,9 +26842,21 @@ msgstr "ID проєкту: %{project_id}"
msgid "ProjectSelect| or group"
msgstr "або групу"
+msgid "ProjectSelect|No matching results"
+msgstr ""
+
msgid "ProjectSelect|Search for project"
msgstr "Пошук проєкту"
+msgid "ProjectSelect|Search projects"
+msgstr ""
+
+msgid "ProjectSelect|Select a project"
+msgstr ""
+
+msgid "ProjectSelect|There was an error fetching the projects. Please try again."
+msgstr ""
+
msgid "ProjectService|Drone server URL"
msgstr ""
@@ -26558,6 +26944,9 @@ msgstr ""
msgid "ProjectService|Trigger event when a new, unique alert is recorded."
msgstr ""
+msgid "ProjectService|Trigger event when a new, unique vulnerability is recorded. (Note: This feature requires an Ultimate plan.)"
+msgstr ""
+
msgid "ProjectService|Trigger event when a pipeline status changes."
msgstr ""
@@ -26583,7 +26972,7 @@ msgid "ProjectSettings|Always show thumbs-up and thumbs-down award emoji buttons
msgstr ""
msgid "ProjectSettings|Analytics"
-msgstr ""
+msgstr "Ðналітика"
msgid "ProjectSettings|Automatically resolve merge request diff discussions when they become outdated"
msgstr "Ðвтоматично завершувати Ð¾Ð±Ð³Ð¾Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð² запитах на злиттÑ, коли відмінноÑÑ‚Ñ– Ñтають неактуальними"
@@ -26676,7 +27065,7 @@ msgid "ProjectSettings|Git Large File Storage (LFS)"
msgstr ""
msgid "ProjectSettings|Global"
-msgstr ""
+msgstr "Глобальні"
msgid "ProjectSettings|Internal"
msgstr "Внутрішні"
@@ -26820,7 +27209,7 @@ msgid "ProjectSettings|These checks must pass before merge requests can be merge
msgstr ""
msgid "ProjectSettings|This project"
-msgstr ""
+msgstr "Цей проєкт"
msgid "ProjectSettings|This setting is applied on the server level and can be overridden by an admin."
msgstr "Цей параметр заÑтоÑовуєтьÑÑ Ð½Ð° рівні Ñервера та може бути перевизначений адмініÑтратором."
@@ -26835,7 +27224,7 @@ msgid "ProjectSettings|To enable this feature, configure pipelines. %{link_start
msgstr ""
msgid "ProjectSettings|Transfer project"
-msgstr ""
+msgstr "ПеренеÑти проєкт"
msgid "ProjectSettings|Upstream project"
msgstr ""
@@ -26972,9 +27361,15 @@ msgstr "Проекти уÑпішно отримано"
msgid "Projects are graded based on the highest severity vulnerability present"
msgstr "Проєкти оцінюютьÑÑ Ð·Ð° найвищим наÑвним рівнем вразливоÑÑ‚Ñ–"
+msgid "Projects are organized into groups"
+msgstr ""
+
msgid "Projects contributed to"
msgstr ""
+msgid "Projects help you organize your work. They contain your file repository, issues, merge requests, and so much more."
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr "Спільні проєкти з %{group_name}"
@@ -27209,10 +27604,10 @@ msgstr "Жодної влаÑної метрики не було ÑтворенÐ
msgid "PrometheusService|Prometheus cluster integration"
msgstr ""
-msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
+msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
msgstr ""
-msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
+msgid "PrometheusService|The ID of the IAP-secured resource."
msgstr ""
msgid "PrometheusService|The Prometheus API base URL."
@@ -27830,6 +28225,9 @@ msgstr ""
msgid "Rate limit"
msgstr ""
+msgid "Rate limits can help reduce request volume (like from crawlers or abusive bots)."
+msgstr ""
+
msgid "Raw blob request rate limit per minute"
msgstr "Ліміт чаÑтоти запиту бінарних даних на хвилину"
@@ -27842,6 +28240,9 @@ msgstr ""
msgid "Re-authentication required"
msgstr "Ðеобхідна повторна автентифікаціÑ"
+msgid "Re-import"
+msgstr ""
+
msgid "Re-request review"
msgstr ""
@@ -27863,6 +28264,9 @@ msgstr ""
msgid "Read more about related issues"
msgstr "ДізнатиÑÑ Ð±Ñ–Ð»ÑŒÑˆÐµ про пов’Ñзані задачі"
+msgid "Read their documentation."
+msgstr ""
+
msgid "Ready to get started with GitLab? Follow these steps to set up your workspace, plan and commit changes, and deploy your project."
msgstr ""
@@ -27896,6 +28300,9 @@ msgstr "Отримувати Ð¿Ð¾Ð¿ÐµÑ€ÐµÐ´Ð¶ÐµÐ½Ð½Ñ Ð²Ñ–Ð´ налаштоваÐ
msgid "Receive any notifications from GitLab."
msgstr ""
+msgid "Receive notification of abuse reports by email."
+msgstr ""
+
msgid "Receive notifications about your own activity"
msgstr "Отримувати ÑÐ¿Ð¾Ð²Ñ–Ñ‰ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾ влаÑну активніÑÑ‚ÑŒ"
@@ -28033,7 +28440,7 @@ msgid "Registration|Your GitLab group"
msgstr ""
msgid "Registration|Your first project"
-msgstr ""
+msgstr "Ваш перший проєкт"
msgid "Registration|Your profile"
msgstr ""
@@ -28041,9 +28448,6 @@ msgstr ""
msgid "Registry setup"
msgstr ""
-msgid "Regulate approvals by authors/committers. Affects all projects."
-msgstr ""
-
msgid "Reindexing Status: %{status} (Slice multiplier: %{multiplier}, Maximum running slices: %{max_slices})"
msgstr ""
@@ -28141,6 +28545,9 @@ msgstr ""
msgid "Release|Something went wrong while saving the release details."
msgstr ""
+msgid "Reload page"
+msgstr ""
+
msgid "Remediations"
msgstr ""
@@ -28423,6 +28830,9 @@ msgstr "Повторно відкрито %{quick_action_target}."
msgid "Reopens this %{quick_action_target}."
msgstr "Повторно відкриває %{quick_action_target}."
+msgid "Repeats"
+msgstr ""
+
msgid "Replace"
msgstr "Замінити"
@@ -28587,7 +28997,7 @@ msgid "Reports|Test summary results are being parsed"
msgstr "Результати Ð´Ð»Ñ Ñ‚ÐµÑтового звіту оброблÑÑŽÑ‚ÑŒÑÑ"
msgid "Reports|Tool"
-msgstr ""
+msgstr "ІнÑтрумент"
msgid "Reports|Vulnerability"
msgstr "ВразливіÑÑ‚ÑŒ"
@@ -28793,10 +29203,7 @@ msgstr ""
msgid "Require additional authentication for administrative tasks."
msgstr ""
-msgid "Require all users in this group to setup Two-factor authentication"
-msgstr ""
-
-msgid "Require all users in this group to setup two-factor authentication"
+msgid "Require all users in this group to set up two-factor authentication"
msgstr ""
msgid "Required approvals (%{approvals_given} given)"
@@ -28846,6 +29253,9 @@ msgstr[3] "Ðеобхідно ще %d затверджень."
msgid "Requires values to meet regular expression requirements."
msgstr ""
+msgid "Requires you to deploy or set up cloud-hosted Sentry."
+msgstr ""
+
msgid "Requires your primary GitLab email address."
msgstr ""
@@ -28906,9 +29316,6 @@ msgstr "Ð¡ÐºÐ¸Ð´Ð°Ð½Ð½Ñ ÐºÐ»ÑŽÑ‡Ð° авторизації призведе до
msgid "Resolve"
msgstr "Вирішити"
-msgid "Resolve all threads in new issue"
-msgstr "Вирішити уÑÑ– Ð¾Ð±Ð³Ð¾Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð² новій задачі"
-
msgid "Resolve conflicts"
msgstr ""
@@ -28966,6 +29373,9 @@ msgstr "Метрики відповідей (NGINX)"
msgid "Response text"
msgstr ""
+msgid "Restart GitLab to apply changes."
+msgstr ""
+
msgid "Restart Terminal"
msgstr "ПерезапуÑтити термінал"
@@ -28984,6 +29394,9 @@ msgstr ""
msgid "Restoring the project will prevent the project from being removed on this date and restore people's ability to make changes to it."
msgstr "Ð’Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾Ñ”ÐºÑ‚Ñƒ запобіжить його видаленню в зазначений Ñ‡Ð°Ñ Ñ– поверне людÑм можливіÑÑ‚ÑŒ вноÑити до нього зміни."
+msgid "Restrict group access by IP address. %{link_start}Learn more%{link_end}."
+msgstr ""
+
msgid "Restrict membership by email domain"
msgstr ""
@@ -29043,7 +29456,7 @@ msgid "Review App|View latest app"
msgstr ""
msgid "Review changes"
-msgstr ""
+msgstr "ПереглÑнути зміни"
msgid "Review requested from %{name}"
msgstr ""
@@ -29061,7 +29474,7 @@ msgid "Review the target project before submitting to avoid exposing %{source} c
msgstr ""
msgid "Review time"
-msgstr ""
+msgstr "Ð§Ð°Ñ Ð¿ÐµÑ€ÐµÐ³Ð»Ñду"
msgid "Review time is defined as the time it takes from first comment until merged."
msgstr ""
@@ -29301,6 +29714,9 @@ msgstr ""
msgid "Runners|Runner #%{runner_id}"
msgstr ""
+msgid "Runners|Runner assigned to project."
+msgstr ""
+
msgid "Runners|Runner is offline, last contact was %{runner_contact} ago"
msgstr ""
@@ -29313,6 +29729,9 @@ msgstr ""
msgid "Runners|Runner registration"
msgstr ""
+msgid "Runners|Runner unassigned from project."
+msgstr ""
+
msgid "Runners|Runners"
msgstr "Runner'и"
@@ -29392,7 +29811,7 @@ msgid "Runners|You have used %{quotaUsed} out of %{quotaLimit} of your shared Ru
msgstr "Ви викориÑтали %{quotaUsed} із ваших %{quotaLimit} хвилин Ð´Ð»Ñ ÐºÐ¾Ð½Ð²ÐµÑ”Ñ€Ñ–Ð² загальних runner'ів."
msgid "Runners|group"
-msgstr ""
+msgstr "Група"
msgid "Runners|instance"
msgstr ""
@@ -29505,7 +29924,7 @@ msgstr ""
msgid "SastEntryPoints|How do I set up SAST?"
msgstr ""
-msgid "SastEntryPoints|Learn more."
+msgid "SastEntryPoints|Learn more"
msgstr ""
msgid "Satisfied"
@@ -29547,7 +29966,7 @@ msgstr "Зберегти пароль"
msgid "Save pipeline schedule"
msgstr "Зберегти розклад конвеєра"
-msgid "Save space and find images in the container Registry. remove unneeded tags and keep only the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
+msgid "Save storage space by automatically deleting tags from the container registry and keeping the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
msgstr ""
msgid "Saving"
@@ -29721,6 +30140,9 @@ msgstr "Шукати чи фільтрувати результати..."
msgid "Search or filter results…"
msgstr "Шукати чи фільтрувати результати…"
+msgid "Search or jump to..."
+msgstr ""
+
msgid "Search project"
msgstr "Пошук в проєкті"
@@ -29781,16 +30203,16 @@ msgstr ""
msgid "SearchCodeResults|of %{link_to_project}"
msgstr "із %{link_to_project}"
-msgid "SearchResults|Showing %{count} %{scope} for%{term_element}"
+msgid "SearchResults|Showing %{count} %{scope} for %{term_element}"
msgstr ""
-msgid "SearchResults|Showing %{count} %{scope} for%{term_element} in your personal and project snippets"
+msgid "SearchResults|Showing %{count} %{scope} for %{term_element} in your personal and project snippets"
msgstr ""
-msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for%{term_element}"
+msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for %{term_element}"
msgstr ""
-msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for%{term_element} in your personal and project snippets"
+msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for %{term_element} in your personal and project snippets"
msgstr ""
msgid "SearchResults|code result"
@@ -29894,6 +30316,9 @@ msgstr "Секрет"
msgid "Secret Detection"
msgstr "ВиÑÐ²Ð»ÐµÐ½Ð½Ñ Ñекретів"
+msgid "Secret access key"
+msgstr ""
+
msgid "Secret token"
msgstr "Секретний токен"
@@ -29933,9 +30358,6 @@ msgstr ""
msgid "SecurityApprovals|A merge request approval is required when the license compliance report contains a denied license."
msgstr ""
-msgid "SecurityApprovals|Configurable if security scanners are enabled. %{linkStart}Learn more.%{linkEnd}"
-msgstr ""
-
msgid "SecurityApprovals|Coverage-Check"
msgstr ""
@@ -29948,24 +30370,18 @@ msgstr ""
msgid "SecurityApprovals|Learn more about Vulnerability-Check"
msgstr ""
-msgid "SecurityApprovals|License Scanning must be enabled. %{linkStart}Learn more%{linkEnd}."
-msgstr ""
-
msgid "SecurityApprovals|License-Check"
msgstr ""
msgid "SecurityApprovals|Requires approval for Denied licenses. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}More information%{linkEnd}"
+msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "SecurityApprovals|Requires approval for vulnerabilities. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
-msgid "SecurityApprovals|Test coverage must be enabled. %{linkStart}Learn more%{linkEnd}."
-msgstr ""
-
msgid "SecurityApprovals|Vulnerability-Check"
msgstr ""
@@ -29997,7 +30413,7 @@ msgid "SecurityConfiguration|Configure %{feature}"
msgstr ""
msgid "SecurityConfiguration|Configure via Merge Request"
-msgstr ""
+msgstr "Ðалаштувати через запит на злиттÑ"
msgid "SecurityConfiguration|Copy code and open .gitlab-ci.yml file"
msgstr ""
@@ -30009,7 +30425,7 @@ msgid "SecurityConfiguration|Could not retrieve configuration data. Please refre
msgstr ""
msgid "SecurityConfiguration|Create Merge Request"
-msgstr ""
+msgstr "Створити запит на злиттÑ"
msgid "SecurityConfiguration|Customize common SAST settings to suit your requirements. Configuration changes made here override those provided by GitLab and are excluded from updates. For details of more advanced configuration options, see the %{linkStart}GitLab SAST documentation%{linkEnd}."
msgstr ""
@@ -30029,6 +30445,12 @@ msgstr ""
msgid "SecurityConfiguration|Immediately begin risk analysis and remediation with application security features. Start with SAST and Secret Detection, available to all plans. Upgrade to Ultimate to get all features, including:"
msgstr ""
+msgid "SecurityConfiguration|Manage corpus"
+msgstr ""
+
+msgid "SecurityConfiguration|Manage corpus files used as mutation sources in coverage fuzzing."
+msgstr ""
+
msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
msgstr ""
@@ -30083,6 +30505,12 @@ msgstr ""
msgid "SecurityOrchestration|Action"
msgstr ""
+msgid "SecurityOrchestration|Actions"
+msgstr ""
+
+msgid "SecurityOrchestration|Add rule"
+msgstr ""
+
msgid "SecurityOrchestration|All policies"
msgstr ""
@@ -30114,28 +30542,28 @@ msgid "SecurityOrchestration|Latest scan"
msgstr ""
msgid "SecurityOrchestration|Network"
-msgstr ""
-
-msgid "SecurityOrchestration|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
-msgstr ""
+msgstr "Мережа"
msgid "SecurityOrchestration|New policy"
-msgstr ""
+msgstr "Ðова політика"
msgid "SecurityOrchestration|Only owners can update Security Policy Project"
msgstr ""
msgid "SecurityOrchestration|Policies"
-msgstr ""
+msgstr "Політики"
msgid "SecurityOrchestration|Policy description"
-msgstr ""
+msgstr "ÐžÐ¿Ð¸Ñ Ð¿Ð¾Ð»Ñ–Ñ‚Ð¸ÐºÐ¸"
msgid "SecurityOrchestration|Policy editor"
+msgstr "Редактор політики"
+
+msgid "SecurityOrchestration|Policy preview"
msgstr ""
msgid "SecurityOrchestration|Policy status"
-msgstr ""
+msgstr "Ð¡Ñ‚Ð°Ñ‚ÑƒÑ Ð¿Ð¾Ð»Ñ–Ñ‚Ð¸ÐºÐ¸"
msgid "SecurityOrchestration|Policy type"
msgstr ""
@@ -30143,6 +30571,9 @@ msgstr ""
msgid "SecurityOrchestration|Rule"
msgstr ""
+msgid "SecurityOrchestration|Rules"
+msgstr ""
+
msgid "SecurityOrchestration|Scan Execution"
msgstr ""
@@ -30236,6 +30667,9 @@ msgstr ""
msgid "SecurityReports|Create issue"
msgstr "Створити задачу"
+msgid "SecurityReports|Development vulnerabilities"
+msgstr ""
+
msgid "SecurityReports|Dismiss vulnerability"
msgstr "Відхилити вразливіÑÑ‚ÑŒ"
@@ -30251,6 +30685,9 @@ msgstr ""
msgid "SecurityReports|Download results"
msgstr ""
+msgid "SecurityReports|Download scanned URLs"
+msgstr ""
+
msgid "SecurityReports|Download scanned resources"
msgstr ""
@@ -30374,6 +30811,9 @@ msgstr "СтатуÑ"
msgid "SecurityReports|Take survey"
msgstr ""
+msgid "SecurityReports|The Vulnerability Report shows the results of the lastest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "SecurityReports|The security reports below contain one or more vulnerability findings that could not be parsed and were not recorded. Download the artifacts in the job output to investigate. Ensure any security report created conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
msgstr ""
@@ -30408,7 +30848,7 @@ msgid "SecurityReports|To widen your search, change or remove filters above"
msgstr ""
msgid "SecurityReports|Tool"
-msgstr ""
+msgstr "ІнÑтрумент"
msgid "SecurityReports|Unable to add %{invalidProjectsMessage}: %{errorMessage}"
msgstr ""
@@ -30515,11 +30955,11 @@ msgstr ""
msgid "Select a repository"
msgstr "Виберіть репозиторій"
-msgid "Select a role"
+msgid "Select a repository containing templates for common files."
msgstr ""
-msgid "Select a shared template repository for all projects on this instance."
-msgstr ""
+msgid "Select a role"
+msgstr "Вибрати роль"
msgid "Select a template repository"
msgstr "Вибрати шаблон репозиторію"
@@ -30558,7 +30998,7 @@ msgid "Select file"
msgstr "Оберіть файл"
msgid "Select group"
-msgstr ""
+msgstr "Вибрати групу"
msgid "Select group or project"
msgstr "Вибрати групу чи проєкт"
@@ -30596,6 +31036,9 @@ msgstr "Вибрати проєкт та зону Ð´Ð»Ñ Ð²Ð¸Ð±Ð¾Ñ€Ñƒ типу Ð
msgid "Select project to choose zone"
msgstr "Вибрати проєкт Ð´Ð»Ñ Ð²Ð¸Ð±Ð¾Ñ€Ñƒ зони"
+msgid "Select project to create issue"
+msgstr ""
+
msgid "Select projects"
msgstr "Вибрати проєкти"
@@ -30713,6 +31156,9 @@ msgstr ""
msgid "Send emails to help guide new users through the onboarding process."
msgstr ""
+msgid "Send emails to users upon account deactivation."
+msgstr ""
+
msgid "Send message"
msgstr "ÐадіÑлати повідомленнÑ"
@@ -30731,6 +31177,9 @@ msgstr "ÐадіÑлати звіт"
msgid "Send service data"
msgstr ""
+msgid "Sentry"
+msgstr ""
+
msgid "Sentry API URL"
msgstr "URL-адреÑа Sentry API"
@@ -30845,6 +31294,9 @@ msgstr "Ваш репозиторій не міÑтить відповідног
msgid "Service"
msgstr "СервіÑ"
+msgid "Service Accounts keys are required to authorize GitLab to deploy your Google Cloud project."
+msgstr ""
+
msgid "Service Desk"
msgstr "Service Desk"
@@ -30917,15 +31369,15 @@ msgstr ""
msgid "Set a password on your account to pull or push via %{protocol}."
msgstr "Ð’Ñтановіть пароль Ð´Ð»Ñ Ñвого облікового запиÑу, щоб мати можливіÑÑ‚ÑŒ відправлÑти та отримувати через %{protocol}."
-msgid "Set a template repository for projects in this group"
-msgstr "Вибрати шаблон репозиторію Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñ”ÐºÑ‚Ñ–Ð² у цій групі"
-
msgid "Set access permissions for this token."
msgstr ""
msgid "Set an instance-wide domain that will be available to all clusters when installing Knative."
msgstr ""
+msgid "Set any rate limit to %{code_open}0%{code_close} to disable the limit."
+msgstr ""
+
msgid "Set default and restrict visibility levels. Configure import sources and git access protocol."
msgstr "Ð’Ñтановіть Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð·Ð° замовчуваннÑм Ñ– обмежте рівні видимоÑÑ‚Ñ–. Ðалаштуйте джерела імпорту Ñ– протокол доÑтупу git."
@@ -30938,8 +31390,8 @@ msgstr "Ð’Ñтановити ітерацію"
msgid "Set limit to 0 to allow any file size."
msgstr ""
-msgid "Set max session time for web terminal."
-msgstr "МакÑимальний термін дії ÑеÑÑ–Ñ— Ð´Ð»Ñ Ð²ÐµÐ±-терміналу."
+msgid "Set limits for web and API requests."
+msgstr ""
msgid "Set milestone"
msgstr "Ð’Ñтановити етап"
@@ -30947,15 +31399,18 @@ msgstr "Ð’Ñтановити етап"
msgid "Set new password"
msgstr "Ð’Ñтановити новий пароль"
-msgid "Set notification email for abuse reports."
-msgstr "Ðалаштувати ÑÐ¿Ð¾Ð²Ñ–Ñ‰ÐµÐ½Ð½Ñ Ð¿Ð¾ електронній пошті Ð´Ð»Ñ Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½ÑŒ про зловживаннÑ."
-
msgid "Set parent epic to an epic"
msgstr "Ð’Ñтановити батьківÑький епік Ð´Ð»Ñ ÐµÐ¿Ñ–ÐºÑƒ"
+msgid "Set per-user rate limits for imports and exports of projects and groups."
+msgstr ""
+
msgid "Set projects and maximum size limits, session duration, user options, and check feature availability for namespace plan."
msgstr ""
+msgid "Set rate limits for package registry API requests that supersede the general user and IP rate limits."
+msgstr ""
+
msgid "Set severity"
msgstr ""
@@ -30974,15 +31429,24 @@ msgstr "Ð’Ñтановити цільову гілку %{branch_name}."
msgid "Set the default branch for this project. All merge requests and commits are made against this branch unless you specify a different one."
msgstr ""
+msgid "Set the default expiration time for job artifacts in all projects. Set to %{code_open}0%{code_close} to never expire artifacts by default. If no unit is written, it defaults to seconds. For example, these are all equivalent: %{code_open}3600%{code_close}, %{code_open}60 minutes%{code_close}, or %{code_open}one hour%{code_close}."
+msgstr ""
+
msgid "Set the due date to %{due_date}."
msgstr "Ð’Ñтановити заплановану дату Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ %{due_date}."
msgid "Set the iteration to %{iteration_reference}."
msgstr "Ð’Ñтановлено ітерацію %{iteration_reference}."
+msgid "Set the maximum session time for a web terminal."
+msgstr ""
+
msgid "Set the milestone to %{milestone_reference}."
msgstr "Ð’Ñтановити етап %{milestone_reference}."
+msgid "Set the per-user rate limit for notes created by web or API requests."
+msgstr ""
+
msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
msgstr ""
@@ -31044,13 +31508,13 @@ msgid "SetStatusModal|Add status emoji"
msgstr "Додати Ñмайлик-ÑтатуÑ"
msgid "SetStatusModal|Busy"
-msgstr ""
+msgstr "ЗайнÑтий"
msgid "SetStatusModal|Clear status"
msgstr "ОчиÑтити ÑтатуÑ"
msgid "SetStatusModal|Clear status after"
-msgstr ""
+msgstr "ОчиÑтити ÑÑ‚Ð°Ñ‚ÑƒÑ Ð¿Ñ–ÑлÑ"
msgid "SetStatusModal|Edit status"
msgstr "Змінити ÑтатуÑ"
@@ -31184,6 +31648,9 @@ msgstr ""
msgid "Show Pipeline IID"
msgstr ""
+msgid "Show all %{issuable_type}."
+msgstr ""
+
msgid "Show all activity"
msgstr "Показати вÑÑŽ активніÑÑ‚ÑŒ"
@@ -31235,15 +31702,9 @@ msgstr "Показати оÑтанню верÑÑ–ÑŽ"
msgid "Show list"
msgstr "Показати ÑпиÑок"
-msgid "Show me advanced features"
-msgstr ""
-
msgid "Show me how to add a pipeline"
msgstr ""
-msgid "Show me the basics"
-msgstr ""
-
msgid "Show one file at a time"
msgstr ""
@@ -31288,15 +31749,15 @@ msgstr "Показано %{limit} з %{total_count} задач. "
msgid "Showing %{pageSize} of %{total} %{issuableType}"
msgstr ""
-msgid "Showing %{pageSize} of %{total} issues"
-msgstr "Показано %{pageSize} із %{total} задач"
-
msgid "Showing all epics"
msgstr "Показати вÑÑ– епіки"
msgid "Showing all issues"
msgstr "Ð’Ñ–Ð´Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ ÑƒÑÑ–Ñ… задач"
+msgid "Showing data for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
+msgstr ""
+
msgid "Showing data for workflow items created in this date range. Date range cannot exceed %{maxDateRange} days."
msgstr ""
@@ -31336,6 +31797,15 @@ msgstr "Дозволені лише цифри"
msgid "Sidebar|Weight"
msgstr "Вага"
+msgid "Sidekiq job compression threshold (bytes)"
+msgstr ""
+
+msgid "Sidekiq job size limit (bytes)"
+msgstr ""
+
+msgid "Sidekiq job size limits"
+msgstr ""
+
msgid "Sign in"
msgstr "Увійти"
@@ -31456,6 +31926,9 @@ msgstr ""
msgid "Site profile not found for given parameters"
msgstr ""
+msgid "Sites"
+msgstr ""
+
msgid "Size"
msgstr "Розмір"
@@ -31486,20 +31959,23 @@ msgstr "Slack Ñ–Ð½Ñ‚ÐµÐ³Ñ€Ð°Ñ†Ñ–Ñ Ð´Ð¾Ð·Ð²Ð¾Ð»Ð¸Ñ‚ÑŒ вам взаємодіÑÑ
msgid "SlackIntegration|Sends notifications about project events to Slack channels."
msgstr ""
-msgid "SlackService|2. Paste the %{strong_open}Token%{strong_close} into the field below"
+msgid "SlackService|1. %{slash_command_link_start}Add a slash command%{slash_command_link_end} in your Slack team using this information:"
+msgstr ""
+
+msgid "SlackService|2. Paste the token from Slack in the %{strong_open}Token%{strong_close} field below."
+msgstr ""
+
+msgid "SlackService|3. Select the %{strong_open}Active%{strong_close} checkbox, select %{strong_open}Save changes%{strong_close}, and start using slash commands in Slack!"
msgstr ""
-msgid "SlackService|3. Select the %{strong_open}Active%{strong_close} checkbox, press %{strong_open}Save changes%{strong_close} and start using GitLab inside Slack!"
+msgid "SlackService|After setup, get a list of available Slack slash commands by entering"
msgstr ""
msgid "SlackService|Fill in the word that works best for your team."
msgstr "Вкажіть Ñлово, Ñке найбільше підходить Ð´Ð»Ñ Ð²Ð°ÑˆÐ¾Ñ— команди."
-msgid "SlackService|See list of available commands in Slack after setting up this service, by entering"
-msgstr "ПереглÑньте ÑпиÑок уÑÑ–Ñ… доÑтупних команд у Slack піÑÐ»Ñ Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ñ†ÑŒÐ¾Ð³Ð¾ ÑервіÑу шлÑхом вводу"
-
-msgid "SlackService|This service allows users to perform common operations on this project by entering slash commands in Slack."
-msgstr "Цей ÑÐµÑ€Ð²Ñ–Ñ Ð´Ð¾Ð·Ð²Ð¾Ð»ÑÑ” кориÑтувачам виконувати загальні операції в цьому проєкті шлÑхом вводу команд із коÑою риÑкою (/) в Slack."
+msgid "SlackService|Perform common operations in this project by entering slash commands in Slack."
+msgstr ""
msgid "Slice multiplier"
msgstr ""
@@ -31564,7 +32040,7 @@ msgstr ""
msgid "Some child epics may be hidden due to applied filters"
msgstr ""
-msgid "Some common domains are not allowed. %{read_more_link}."
+msgid "Some common domains are not allowed. %{learn_more_link}."
msgstr ""
msgid "Some of the designs you tried uploading did not change:"
@@ -31648,9 +32124,6 @@ msgstr "Проблема при редагуванні вашого комент
msgid "Something went wrong while exporting requirements"
msgstr ""
-msgid "Something went wrong while fetching %{listType} list"
-msgstr "Помилка при отриманні ÑпиÑку %{listType}"
-
msgid "Something went wrong while fetching branches"
msgstr ""
@@ -31705,15 +32178,9 @@ msgstr ""
msgid "Something went wrong while merging this merge request. Please try again."
msgstr "Помилка при заÑтоÑуванні цього запиту на злиттÑ. Будь лаÑка, Ñпробуйте знову."
-msgid "Something went wrong while moving issues."
-msgstr "Помилка при переміщенні задач."
-
msgid "Something went wrong while obtaining the Let's Encrypt certificate."
msgstr ""
-msgid "Something went wrong while performing the action."
-msgstr "Помилка при виконанні цієї дії."
-
msgid "Something went wrong while promoting the issue to an epic. Please try again."
msgstr ""
@@ -32041,7 +32508,10 @@ msgstr ""
msgid "SourcegraphPreferences|Uses a custom %{linkStart}Sourcegraph instance%{linkEnd}."
msgstr ""
-msgid "Spam Check API Key"
+msgid "Spam Check"
+msgstr ""
+
+msgid "Spam Check API key"
msgstr ""
msgid "Spam Logs"
@@ -32059,8 +32529,8 @@ msgstr ""
msgid "Specified URL cannot be used: \"%{reason}\""
msgstr "Вказана URL-адреÑа не може бути викориÑтана: \"%{reason}\""
-msgid "Specify an e-mail address regex pattern to identify default internal users."
-msgstr "Вкажіть шаблон адреÑи електронної пошти у виглÑді регулÑрного виразу Ð´Ð»Ñ Ñ‚Ð¾Ð³Ð¾, щоб автоматично визначати внутрішніх кориÑтувачів."
+msgid "Specify an email address regex pattern to identify default internal users."
+msgstr ""
msgid "Speed up your pipelines with Needs relationships"
msgstr ""
@@ -32314,7 +32784,7 @@ msgstr ""
msgid "StatusCheck|An error occurred fetching the status checks."
msgstr ""
-msgid "StatusCheck|Apply this status check to any branch or a specific protected branch."
+msgid "StatusCheck|Apply this status check to all branches or a specific protected branch."
msgstr ""
msgid "StatusCheck|Check for a status response in Merge Requests. Failures do not block merges. %{link_start}Learn more%{link_end}."
@@ -32653,6 +33123,9 @@ msgstr "Облік викориÑÑ‚Ð°Ð½Ð½Ñ Ð²Ð¸ÐºÐ¾Ð½ÑƒÑ”Ñ‚ÑŒÑÑ Ð¾Ð´Ð¸Ð½ ра
msgid "Subscriptions"
msgstr "ПідпиÑки"
+msgid "Subscription|Your subscription for %{strong}%{namespace_name}%{strong_close} has expired and you are now on %{pricing_link_start}the GitLab Free tier%{pricing_link_end}. Don't worry, your data is safe. Get in touch with our support team (%{support_email}). They'll gladly help with your subscription renewal."
+msgstr ""
+
msgid "Subtracted"
msgstr "ВіднÑто"
@@ -32881,6 +33354,9 @@ msgstr ""
msgid "SuperSonics|Plan"
msgstr ""
+msgid "SuperSonics|Please agree to the Subscription Agreement"
+msgstr ""
+
msgid "SuperSonics|Ready to get started? A GitLab plan is ideal for scaling organizations and for multi team usage."
msgstr ""
@@ -32911,6 +33387,9 @@ msgstr ""
msgid "SuperSonics|The activation code is not valid. Please make sure to copy it exactly from the Customers Portal or confirmation email. Learn more about %{linkStart}activating your subscription%{linkEnd}."
msgstr ""
+msgid "SuperSonics|The activation code should be a 24-character alphanumeric string"
+msgstr ""
+
msgid "SuperSonics|There is a connectivity issue."
msgstr ""
@@ -32953,9 +33432,15 @@ msgstr ""
msgid "SuperSonics|You do not have an active subscription"
msgstr ""
+msgid "SuperSonics|You have successfully added a license that activates on %{date}. Please see the subscription history table below for more details."
+msgstr ""
+
msgid "SuperSonics|You'll be charged for %{trueUpLinkStart}users over license%{trueUpLinkEnd} on a quarterly or annual basis, depending on the terms of your agreement."
msgstr ""
+msgid "SuperSonics|Your future dated license was successfully added"
+msgstr ""
+
msgid "SuperSonics|Your subscription"
msgstr ""
@@ -33208,7 +33693,7 @@ msgstr "Шаблон"
msgid "Template to append to all Service Desk issues"
msgstr "Шаблон Ð´Ð»Ñ Ð´Ð¾Ð´Ð°Ð²Ð°Ð½Ð½Ñ Ð´Ð¾ вÑÑ–Ñ… задач Service Desk"
-msgid "TemplateRepository|Select a repository to make its templates available to all projects. %{link_start}What should the repository contain?%{link_end} "
+msgid "TemplateRepository|Create common files more quickly, and standardize their format."
msgstr ""
msgid "Templates"
@@ -33422,7 +33907,7 @@ msgstr ""
msgid "TestCases|Search test cases"
msgstr ""
-msgid "TestCases|Something went wrong while adding test case to Todo."
+msgid "TestCases|Something went wrong while adding test case to a to-do item."
msgstr ""
msgid "TestCases|Something went wrong while creating a test case."
@@ -33434,7 +33919,7 @@ msgstr ""
msgid "TestCases|Something went wrong while fetching test cases list."
msgstr ""
-msgid "TestCases|Something went wrong while marking test case todo as done."
+msgid "TestCases|Something went wrong while marking test case to-do item as done."
msgstr ""
msgid "TestCases|Something went wrong while moving test case."
@@ -33554,7 +34039,7 @@ msgstr ""
msgid "Thanks for your purchase!"
msgstr "ДÑкуємо за покупку!"
-msgid "That is ok, I do not want to renew"
+msgid "That's OK, I don't want to renew"
msgstr ""
msgid "That's it, well done!"
@@ -33579,7 +34064,7 @@ msgstr[1] "%{type} міÑтить наÑтупні помилки:"
msgstr[2] "%{type} міÑтить наÑтупні помилки:"
msgstr[3] "%{type} міÑтить наÑтупні помилки:"
-msgid "The API key used by GitLab for accessing the Spam Check service endpoint"
+msgid "The API key used by GitLab for accessing the Spam Check service endpoint."
msgstr ""
msgid "The GitLab subscription service (customers.gitlab.com) is currently experiencing an outage. You can monitor the status and get updates at %{linkStart}status.gitlab.com%{linkEnd}."
@@ -33618,9 +34103,6 @@ msgstr ""
msgid "The URL to use for connecting to Elasticsearch. Use a comma-separated list to support clustering (e.g., \"http://localhost:9200, http://localhost:9201\")."
msgstr "URL-адреÑа Ð´Ð»Ñ Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð´Ð¾ Elasticsearch. ВикориÑтовуйте ÑпиÑок, розділений комами, Ð´Ð»Ñ Ð¿Ñ–Ð´Ñ‚Ñ€Ð¸Ð¼ÐºÐ¸ клаÑтеризації (наприклад: \"http://localhost:9200, http://localhost:9201\")."
-msgid "The Vulnerability Report shows the results of the last successful pipeline run on the default branch."
-msgstr ""
-
msgid "The X509 Certificate to use when mutual TLS is required to communicate with the external authorization service. If left blank, the server certificate is still validated when accessing over HTTPS."
msgstr "Сертифікат X509 викориÑтовуєтьÑÑ Ð´Ð»Ñ Ð²Ð·Ð°Ñ”Ð¼Ð½Ð¾Ñ— перевірки автентичноÑÑ‚Ñ– TLS Ñ– необхідний Ð´Ð»Ñ Ð·Ð²'Ñзку з зовнішньою Ñлужбою авторизації. Якщо залишити порожнім, Ñертифікат Ñервера буде перевірÑтиÑÑŒ при доÑтупі через HTTPS."
@@ -33678,9 +34160,6 @@ msgstr ""
msgid "The default branch for this project has been changed. Please update your bookmarks."
msgstr ""
-msgid "The default expiration time for job artifacts. 0 for unlimited. The default unit is in seconds, but you can use other units, for example %{code_open}4 mins 2 sec%{code_close}, %{code_open}2h42min%{code_close}."
-msgstr ""
-
msgid "The dependency list details information about the components used within your project."
msgstr "СпиÑок залежноÑтей міÑтить детальну інформацію про компоненти, що викориÑтовуютьÑÑ Ñƒ вашому проєкті."
@@ -33874,9 +34353,6 @@ msgstr "Конфлікти у цьому запиті на Ð·Ð»Ð¸Ñ‚Ñ‚Ñ ÑƒÐ¶Ðµ Ð
msgid "The merge conflicts for this merge request have already been resolved. Please return to the merge request."
msgstr "Конфлікти у цьому запиті на Ð·Ð»Ð¸Ñ‚Ñ‚Ñ ÑƒÐ¶Ðµ вирішено. Будь лаÑка, повертайтеÑÑ Ð´Ð¾ запиту на злиттÑ."
-msgid "The merge request can now be merged."
-msgstr "Запит на Ð·Ð»Ð¸Ñ‚Ñ‚Ñ Ð¼Ð¾Ð¶Ðµ бути злито."
-
msgid "The metric must be one of %{metrics}."
msgstr ""
@@ -34252,8 +34728,8 @@ msgstr "Помилка при відÑиланні Ð¿Ñ–Ð´Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ Ð¿
msgid "There was a problem updating the keep latest artifacts setting."
msgstr ""
-msgid "There was an error %{message} todo."
-msgstr "Під Ñ‡Ð°Ñ %{message} Ð½Ð°Ð³Ð°Ð´ÑƒÐ²Ð°Ð½Ð½Ñ ÑталаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ°."
+msgid "There was an error %{message} to-do item."
+msgstr ""
msgid "There was an error adding a To Do."
msgstr "Помилка при додаванні нагадуваннÑ."
@@ -34291,6 +34767,9 @@ msgstr ""
msgid "There was an error fetching projects"
msgstr ""
+msgid "There was an error fetching search autocomplete suggestions"
+msgstr ""
+
msgid "There was an error fetching stage total counts"
msgstr ""
@@ -34615,6 +35094,9 @@ msgstr ""
msgid "This field is required."
msgstr "Це поле Ñ” обов'Ñзковим."
+msgid "This form is disabled in preview"
+msgstr ""
+
msgid "This group"
msgstr "Ð¦Ñ Ð³Ñ€ÑƒÐ¿Ð°"
@@ -34636,9 +35118,6 @@ msgstr ""
msgid "This group is linked to a subscription"
msgstr ""
-msgid "This group, including all subgroups, projects and git repositories, will be reachable from only the specified IP address ranges."
-msgstr ""
-
msgid "This group, its subgroups and projects has been scheduled for removal on %{date}."
msgstr ""
@@ -34918,9 +35397,6 @@ msgstr ""
msgid "This user cannot be unlocked manually from GitLab"
msgstr "Цей кориÑтувач не може бути розблокований вручну в GitLab"
-msgid "This user does not have a pending request"
-msgstr ""
-
msgid "This user has an unconfirmed email address (%{email}). You may force a confirmation."
msgstr ""
@@ -35029,9 +35505,6 @@ msgstr ""
msgid "ThreatMonitoring|Packet Activity"
msgstr ""
-msgid "ThreatMonitoring|Policies"
-msgstr ""
-
msgid "ThreatMonitoring|Requests"
msgstr ""
@@ -35083,6 +35556,12 @@ msgstr ""
msgid "ThreatMonitoring|View documentation"
msgstr ""
+msgid "Threshold in bytes at which to compress Sidekiq job arguments."
+msgstr ""
+
+msgid "Threshold in bytes at which to reject Sidekiq jobs. Set this to 0 to if you don't want to limit Sidekiq jobs."
+msgstr ""
+
msgid "Throughput"
msgstr ""
@@ -35092,6 +35571,9 @@ msgstr "Четвер"
msgid "Time"
msgstr "ЧаÑ"
+msgid "Time (in hours) that users are allowed to skip forced configuration of two-factor authentication."
+msgstr ""
+
msgid "Time Spent"
msgstr ""
@@ -35158,8 +35640,8 @@ msgstr "ЧаÑовий поÑÑ"
msgid "TimeTrackingEstimated|Est"
msgstr "Запланований чаÑ"
-msgid "TimeTracking|%{startTag}Spent: %{endTag}%{timeSpentHumanReadable}"
-msgstr "%{startTag}Витрачено: %{endTag}%{timeSpentHumanReadable}"
+msgid "TimeTracking|%{spentStart}Spent: %{spentEnd}"
+msgstr ""
msgid "TimeTracking|Estimated:"
msgstr "Запланований чаÑ:"
@@ -35376,6 +35858,9 @@ msgstr ""
msgid "To access this domain create a new DNS record"
msgstr "Щоб отримати доÑтуп до цього домену, Ñтворіть новий Ð·Ð°Ð¿Ð¸Ñ DNS"
+msgid "To add a custom suffix, set up a Service Desk email address. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "To add an SSH key you need to %{generate_link_start}generate one%{link_end} or use an %{existing_link_start}existing key%{link_end}."
msgstr "Ð”Ð»Ñ Ñ‚Ð¾Ð³Ð¾, щоб додати ключ SSH вам необхідно %{generate_link_start}згенерувати його%{link_end} або викориÑтати %{existing_link_start}Ñ–Ñнуючий ключ%{link_end}."
@@ -35397,13 +35882,16 @@ msgstr "Ð”Ð»Ñ Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ñ€ÐµÐ¿Ð¾Ð·Ð¸Ñ‚Ð¾Ñ€Ñ–Ñ—Ð² з GitHub, ви Ñ
msgid "To connect an SVN repository, check out %{svn_link}."
msgstr "Ð”Ð»Ñ Ð¿Ñ€Ð¸Ñ”Ð´Ð½Ð°Ð½Ð½Ñ SVN-репозиторію, переглÑньте %{svn_link}."
+msgid "To continue using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
+msgstr ""
+
msgid "To continue, you need to select the link in the confirmation email we sent to verify your email address. If you didn't get our email, select %{strongStart}Resend confirmation email.%{strongEnd}"
msgstr ""
msgid "To define internal users, first enable new users set to external"
msgstr "Ð”Ð»Ñ Ð²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð²Ð½ÑƒÑ‚Ñ€Ñ–ÑˆÐ½Ñ–Ñ… кориÑтувачів, Ñпочатку вÑтановіть Ð´Ð»Ñ Ð½Ð¾Ð²Ð¸Ñ… кориÑтувачів \"зовнішній по замовчанню\""
-msgid "To enable Registration Features, make sure \"Enable service ping\" is checked."
+msgid "To enable Registration Features, first enable Service Ping."
msgstr ""
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
@@ -35430,8 +35918,8 @@ msgstr "Спочатку введіть адреÑу Ñервера GÑ–tea Ñ– %{
msgid "To get started, use the link below to confirm your account."
msgstr ""
-msgid "To help improve GitLab and its user experience, GitLab will periodically collect usage information."
-msgstr "Щоб допомогти покращити GitLab та його зручніÑÑ‚ÑŒ викориÑтаннÑ, GitLab буде періодично збирати інформацію про викориÑтаннÑ."
+msgid "To help improve GitLab and its user experience, GitLab periodically collects usage information."
+msgstr ""
msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
msgstr ""
@@ -35463,7 +35951,7 @@ msgstr ""
msgid "To preserve performance only %{strong_open}%{display_size} of %{real_size}%{strong_close} files are displayed."
msgstr ""
-msgid "To protect this issue's confidentiality, %{forkLink} and set the fork's visibility to private."
+msgid "To protect this issue's confidentiality, %{linkStart}fork this project%{linkEnd} and set the fork's visibility to private."
msgstr ""
msgid "To protect this issue's confidentiality, a private fork of this project was selected."
@@ -35496,12 +35984,15 @@ msgstr "Щоб переглÑнути оперативні дані цього Ð
msgid "To set up SAML authentication for your group through an identity provider like Azure, Okta, Onelogin, Ping Identity, or your custom SAML 2.0 provider:"
msgstr "Щоб налаштувати автентифікацію SAML Ð´Ð»Ñ Ð²Ð°ÑˆÐ¾Ñ— групи через провайдера ідентифікації такої Ñк Azure, Okta, Onelogin, Ping Identity або вашого влаÑного поÑтачальника SAML 2.0:"
-msgid "To set up this service:"
-msgstr "Ðалаштувати цей ÑервіÑ:"
+msgid "To set up this integration:"
+msgstr ""
msgid "To specify the notification level per project of a group you belong to, you need to visit project page and change notification level there."
msgstr "Щоб визначити рівень Ñповіщень Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñ”ÐºÑ‚Ñ–Ð² груп, до Ñких ви належите, вам потрібно відвідати Ñторінку проєкту та змінити рівень Ñповіщень там."
+msgid "To start using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
+msgstr ""
+
msgid "To unsubscribe from this issue, please paste the following link into your browser:"
msgstr ""
@@ -35638,7 +36129,7 @@ msgid "Total Contributions"
msgstr "Загальна кількіÑÑ‚ÑŒ внеÑків"
msgid "Total Score"
-msgstr ""
+msgstr "Загальний рахунок"
msgid "Total artifacts size: %{total_size}"
msgstr "Загальний розмір артефактів: %{total_size}"
@@ -35695,7 +36186,7 @@ msgid "Transfer"
msgstr "Передача"
msgid "Transfer ownership"
-msgstr ""
+msgstr "Змінити відповідального"
msgid "Transfer project"
msgstr "ПеренеÑти проєкт"
@@ -35888,10 +36379,10 @@ msgid "Trigger token:"
msgstr "Токен тригера:"
msgid "Trigger variables:"
-msgstr "Змінні тригера:"
+msgstr ""
msgid "Trigger was created successfully."
-msgstr "Тригер Ñтворено уÑпішно."
+msgstr ""
msgid "Trigger was successfully updated."
msgstr "Тригер уÑпішно оновлено."
@@ -36091,9 +36582,6 @@ msgstr ""
msgid "Unable to fetch branches list, please close the form and try again"
msgstr ""
-msgid "Unable to fetch unscanned projects"
-msgstr ""
-
msgid "Unable to fetch vulnerable projects"
msgstr "Ðе вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ вразливі проєкти"
@@ -36148,6 +36636,15 @@ msgstr "Ðеможливо оновити цей епік в даний моме
msgid "Unable to update this issue at this time."
msgstr "Ðе вдалоÑÑ Ð¾Ð½Ð¾Ð²Ð¸Ñ‚Ð¸ цю задачу зараз."
+msgid "Unapprove a merge request"
+msgstr ""
+
+msgid "Unapprove the current merge request."
+msgstr ""
+
+msgid "Unapproved the current merge request."
+msgstr ""
+
msgid "Unarchive project"
msgstr "Розархівувати проєкт"
@@ -36160,16 +36657,13 @@ msgstr ""
msgid "Unassigned"
msgstr "Ðепризначено"
-msgid "Unauthenticated API request rate limit"
+msgid "Unauthenticated API rate limit period in seconds"
msgstr ""
-msgid "Unauthenticated rate limit period in seconds"
-msgstr ""
-
-msgid "Unauthenticated request rate limit"
+msgid "Unauthenticated requests"
msgstr ""
-msgid "Unauthenticated requests"
+msgid "Unauthenticated web rate limit period in seconds"
msgstr ""
msgid "Undo"
@@ -36271,18 +36765,6 @@ msgstr "Повторно відкрити обговореннÑ"
msgid "Unresolved"
msgstr "Ðе вирішено"
-msgid "UnscannedProjects|15 or more days"
-msgstr "15 або більше днів"
-
-msgid "UnscannedProjects|30 or more days"
-msgstr "30 або більше днів"
-
-msgid "UnscannedProjects|5 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|60 or more days"
-msgstr ""
-
msgid "Unschedule job"
msgstr "СкаÑувати заплановане завданнÑ"
@@ -36502,6 +36984,9 @@ msgstr "СтатиÑтика викориÑтаннÑ"
msgid "UsageQuota|%{help_link_start}Shared runners%{help_link_end} are disabled, so there are no limits set on pipeline usage"
msgstr "%{help_link_start}Загальні runner'и%{help_link_end} вимкнено, тому ліміти на викориÑÑ‚Ð°Ð½Ð½Ñ ÐºÐ¾Ð½Ð²ÐµÑ”Ñ€Ñ–Ð² відÑутні"
+msgid "UsageQuota|%{linkTitle} help link"
+msgstr ""
+
msgid "UsageQuota|%{percentageLeft} of purchased storage is available"
msgstr ""
@@ -36511,6 +36996,9 @@ msgstr "Ðртефакти"
msgid "UsageQuota|Artifacts is a sum of build and pipeline artifacts."
msgstr ""
+msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
+msgstr ""
+
msgid "UsageQuota|Buy additional minutes"
msgstr "Купити додаткові хвилини"
@@ -36520,9 +37008,21 @@ msgstr ""
msgid "UsageQuota|CI minutes usage by project"
msgstr ""
+msgid "UsageQuota|Code packages and container images."
+msgstr ""
+
msgid "UsageQuota|Current period usage"
msgstr "ВикориÑÑ‚Ð°Ð½Ð½Ñ Ð·Ð° поточний період"
+msgid "UsageQuota|File attachments and smaller design graphics."
+msgstr ""
+
+msgid "UsageQuota|Git repository, managed by the Gitaly service."
+msgstr ""
+
+msgid "UsageQuota|Includes project registry, artifacts, packages, wiki, uploads and other items."
+msgstr ""
+
msgid "UsageQuota|Increase storage temporarily"
msgstr ""
@@ -36541,6 +37041,9 @@ msgstr ""
msgid "UsageQuota|Packages"
msgstr "Пакети"
+msgid "UsageQuota|Pipeline artifacts and job artifacts, created with CI/CD."
+msgstr ""
+
msgid "UsageQuota|Pipelines"
msgstr "Конвеєри"
@@ -36559,6 +37062,9 @@ msgstr "Репозиторій"
msgid "UsageQuota|Seats"
msgstr ""
+msgid "UsageQuota|Shared bits of code and text."
+msgstr ""
+
msgid "UsageQuota|Snippets"
msgstr "Сніпети"
@@ -36568,6 +37074,12 @@ msgstr ""
msgid "UsageQuota|Storage"
msgstr "Сховище"
+msgid "UsageQuota|Storage type"
+msgstr ""
+
+msgid "UsageQuota|There is a known issue with Artifact storage where the total could be incorrect for some projects. More details and progress are available in %{warningLinkStart}the epic%{warningLinkEnd}."
+msgstr ""
+
msgid "UsageQuota|This is the total amount of storage used across your projects within this namespace."
msgstr ""
@@ -36607,6 +37119,9 @@ msgstr ""
msgid "UsageQuota|Usage"
msgstr "ВикориÑтаннÑ"
+msgid "UsageQuota|Usage Breakdown"
+msgstr ""
+
msgid "UsageQuota|Usage Quotas"
msgstr "Квоти на викориÑтаннÑ"
@@ -36631,6 +37146,9 @@ msgstr ""
msgid "UsageQuota|Wiki"
msgstr "Вікі"
+msgid "UsageQuota|Wiki content."
+msgstr ""
+
msgid "UsageQuota|Wikis"
msgstr "Вікі"
@@ -36698,7 +37216,7 @@ msgid "UsageTrends|Pipelines total"
msgstr "Ð’Ñього конвеєрів"
msgid "UsageTrends|Projects"
-msgstr ""
+msgstr "Проєкти"
msgid "UsageTrends|There was an error fetching the cancelled pipelines. Please try again."
msgstr ""
@@ -36731,10 +37249,10 @@ msgid "UsageTrends|Total groups"
msgstr "Ð’Ñього груп"
msgid "UsageTrends|Total projects"
-msgstr ""
+msgstr "Ð’Ñього проєктів"
msgid "UsageTrends|Total projects & groups"
-msgstr ""
+msgstr "Ð’Ñього проєктів Ñ– груп"
msgid "UsageTrends|Users"
msgstr "КориÑтувачі"
@@ -36847,8 +37365,11 @@ msgstr "OAuth заÑтоÑунки кориÑтувача"
msgid "User Settings"
msgstr "ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ ÐºÐ¾Ñ€Ð¸Ñтувача"
-msgid "User and IP Rate Limits"
-msgstr "Ліміти чаÑтоти Ð´Ð»Ñ ÐºÐ¾Ñ€Ð¸Ñтувачів та IP"
+msgid "User and IP rate limits"
+msgstr ""
+
+msgid "User does not have a pending request"
+msgstr ""
msgid "User identity was successfully created."
msgstr "Ідентифікацію кориÑтувача уÑпішно Ñтворено."
@@ -36905,7 +37426,7 @@ msgid "UserAvailability|%{author} %{spanStart}(Busy)%{spanEnd}"
msgstr ""
msgid "UserAvailability|%{author} (Busy)"
-msgstr ""
+msgstr "%{author} (ЗайнÑтий)"
msgid "UserAvailability|(Busy)"
msgstr ""
@@ -37144,6 +37665,9 @@ msgstr "КориÑтувачі"
msgid "Users can launch a development environment from a GitLab browser tab when the %{linkStart}Gitpod%{linkEnd} integration is enabled."
msgstr ""
+msgid "Users can reactivate their account by signing in."
+msgstr ""
+
msgid "Users can render diagrams in AsciiDoc, Markdown, reStructuredText, and Textile documents using Kroki."
msgstr ""
@@ -37159,6 +37683,9 @@ msgstr ""
msgid "Users requesting access to"
msgstr "КориÑтувачі, Ñкі запитують доÑтуп до"
+msgid "Users to exclude from the rate limit"
+msgstr ""
+
msgid "Users were successfully added."
msgstr "КориÑтувачів уÑпішно додано."
@@ -37180,6 +37707,9 @@ msgstr "Ðемає Ð²Ð¸ÐºÐ¾Ð½Ð°Ð²Ñ†Ñ â€” %{openingTag} призначити нÐ
msgid "UsersSelect|Unassigned"
msgstr "Ðепризначено"
+msgid "Uses GitLab as a lightweight alternative to Sentry."
+msgstr ""
+
msgid "Using %{code_start}::%{code_end} denotes a %{link_start}scoped label set%{link_end}"
msgstr "ВикориÑÑ‚Ð°Ð½Ð½Ñ %{code_start}::%{code_end} вказує на %{link_start}набір Ñелективних міток%{link_end}"
@@ -37210,10 +37740,7 @@ msgstr ""
msgid "Value Stream Analytics can help you determine your team’s velocity"
msgstr ""
-msgid "Value Stream Analytics gives an overview of how much time it takes to go from idea to production in your project."
-msgstr ""
-
-msgid "Value may contain a variable reference"
+msgid "Value might contain a variable reference"
msgstr ""
msgid "Value stream"
@@ -37279,12 +37806,12 @@ msgstr ""
msgid "ValueStream|The Default Value Stream cannot be deleted"
msgstr ""
+msgid "Values that contain the %{codeStart}$%{codeEnd} character can be considered a variable reference and expanded. %{docsLinkStart}Learn more.%{docsLinkEnd}"
+msgstr ""
+
msgid "Variable"
msgstr "Змінна"
-msgid "Variable references indicated by %{codeStart}$%{codeEnd} may be expanded. If this is not what you want, consider %{docsLinkStart}using a workaround to prevent expansion%{docsLinkEnd}."
-msgstr ""
-
msgid "Variable will be masked in job logs."
msgstr "Змінна буде замаÑкована в журналі завдань."
@@ -37693,6 +38220,9 @@ msgstr ""
msgid "Vulnerability|Evidence"
msgstr "Дані"
+msgid "Vulnerability|False positive detected"
+msgstr ""
+
msgid "Vulnerability|File"
msgstr "Файл"
@@ -37735,6 +38265,9 @@ msgstr "Рівень"
msgid "Vulnerability|Status"
msgstr "СтатуÑ"
+msgid "Vulnerability|The scanner determined this vulnerability to be a false positive. Verify the evaluation before changing its status. %{linkStart}Learn more about false positive detection.%{linkEnd}"
+msgstr ""
+
msgid "Vulnerability|The unmodified response is the original response that had no mutations done to the request"
msgstr ""
@@ -37847,7 +38380,7 @@ msgid "We'll continuously validate your pipeline configuration. The validation r
msgstr ""
msgid "We'll use this to help surface the right features and information to you."
-msgstr ""
+msgstr "Це допоможе нам предÑтавити вам перÑоналізовані функції та інформацію."
msgid "We've found no vulnerabilities"
msgstr "Ми не виÑвили вразливоÑтей"
@@ -38059,9 +38592,6 @@ msgstr "ЛаÑкаво проÑимо до GitLab, %{first_name}!"
msgid "Welcome to GitLab,%{br_tag}%{name}!"
msgstr ""
-msgid "Welcome to the guided GitLab tour"
-msgstr ""
-
msgid "Welcome, %{name}!"
msgstr ""
@@ -38080,9 +38610,6 @@ msgstr ""
msgid "What are you searching for?"
msgstr "Що ви шукаєте?"
-msgid "What describes you best?"
-msgstr ""
-
msgid "What does this command do?"
msgstr "Що робить Ñ†Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð°?"
@@ -38104,15 +38631,15 @@ msgstr ""
msgid "What is your job title? (optional)"
msgstr ""
+msgid "What templates can I create?"
+msgstr ""
+
msgid "What will you use this group for?"
msgstr ""
msgid "What's new"
msgstr "Що нового"
-msgid "What’s your experience level?"
-msgstr ""
-
msgid "When a deployment job is successful, skip older deployment jobs that are still pending."
msgstr ""
@@ -38122,6 +38649,9 @@ msgstr "Коли runner закріплений (за проєктами), йог
msgid "When an event in GitLab triggers a webhook, you can use the request details to figure out if something went wrong."
msgstr ""
+msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+msgstr ""
+
msgid "When inactive, an external authentication provider must be used."
msgstr ""
@@ -38147,6 +38677,9 @@ msgstr ""
msgid "When:"
msgstr "Коли:"
+msgid "Which API requests are affected?"
+msgstr ""
+
msgid "While it's rare to have no vulnerabilities, it can happen. In any event, we ask that you please double check your settings to make sure you've set up your dashboard correctly."
msgstr "Хоча й рідко, але можливо не мати вразливоÑтей. Ð’ будь-Ñкому разі, ми проÑимо Ð²Ð°Ñ Ð¿ÐµÑ€ÐµÐ²Ñ–Ñ€Ð¸Ñ‚Ð¸ ваші налаштуваннÑ, щоб впевнитиÑÑ, що ваша панель налаштована правильно."
@@ -38426,6 +38959,9 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|Work Items"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -38493,7 +39029,7 @@ msgid "You are about to delete %{domain} from your instance. This domain will no
msgstr ""
msgid "You are about to permanently delete this project"
-msgstr ""
+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}, Ñк тільки Ñ†Ñ Ð¿ÐµÑ€ÐµÐ´Ð°Ñ‡Ð° буде завершена."
@@ -38501,6 +39037,9 @@ msgstr "Ви збираєтеÑÑŒ передати контроль над ÑвÐ
msgid "You are already a member of this %{member_source}."
msgstr ""
+msgid "You are already impersonating another user"
+msgstr ""
+
msgid "You are an admin, which means granting access to %{client_name} will allow them to interact with GitLab as an admin as well. Proceed with caution."
msgstr ""
@@ -38603,6 +39142,9 @@ msgstr "Також ви можете завантажувати файли з в
msgid "You can also use project access tokens with Git to authenticate over HTTP(S). %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "You can always change your URL later"
+msgstr ""
+
msgid "You can always edit this later"
msgstr "Ви завжди можете відредагувати це пізніше"
@@ -38759,12 +39301,12 @@ msgstr "Ви не можете запиÑувати на цей \"тільки Ð
msgid "You can’t %{tag_start}edit%{tag_end} files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
+msgid "You can’t edit files directly in this project. Fork this project and submit a merge request with your changes."
+msgstr ""
+
msgid "You could not create a new trigger."
msgstr "Ви не змогли Ñтворити новий тригер."
-msgid "You didn't renew your subscription for %{strong}%{namespace_name}%{strong_close} so it was downgraded to the free plan."
-msgstr ""
-
msgid "You do not have any subscriptions yet"
msgstr "У Ð²Ð°Ñ Ñ‰Ðµ немає підпиÑок"
@@ -38930,6 +39472,12 @@ msgstr "Вам потрібно вказати дійÑний поточний Ð
msgid "You must provide your current password in order to change it."
msgstr "Вам потрібно вказати поточний пароль Ð´Ð»Ñ Ð¹Ð¾Ð³Ð¾ зміни."
+msgid "You must sign in to search for specific projects."
+msgstr ""
+
+msgid "You must sign in to search for specific terms."
+msgstr ""
+
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
@@ -38957,6 +39505,9 @@ msgstr "Вам необхідно вказати Ñк токен доÑтупу,
msgid "You need to upload a GitLab project export archive (ending in .gz)."
msgstr "Ви повинні завантажити екÑпортований архів проєкту Gitlab (що закінчуєтьÑÑ Ð½Ð° .gz)."
+msgid "You need to verify your primary email first before enabling Two-Factor Authentication."
+msgstr ""
+
msgid "You successfully declined the invitation"
msgstr ""
@@ -39065,10 +39616,10 @@ msgstr ""
msgid "Your %{host} account was signed in to from a new location"
msgstr ""
-msgid "Your %{strong}%{plan_name}%{strong_close} subscription for %{strong}%{namespace_name}%{strong_close} will expire on %{strong}%{expires_on}%{strong_close}."
+msgid "Your %{strong}%{plan_name}%{strong_close} subscription expires on %{strong}%{expires_on}%{strong_close}. After that date, you cannot create issues or merge requests, or use many other features."
msgstr ""
-msgid "Your %{strong}%{plan_name}%{strong_close} subscription will expire on %{strong}%{expires_on}%{strong_close}. After that, you will not be able to create issues or merge requests as well as many other features."
+msgid "Your %{strong}%{plan_name}%{strong_close} subscription for %{strong}%{namespace_name}%{strong_close} will expire on %{strong}%{expires_on}%{strong_close}."
msgstr ""
msgid "Your CI/CD configuration syntax is invalid. View Lint tab for more details."
@@ -39092,7 +39643,7 @@ msgstr ""
msgid "Your GPG keys (%{count})"
msgstr "Ваші ключі GPG (%{count})"
-msgid "Your GitLab account has been locked due to an excessive amount of unsuccessful sign in attempts. Your account will automatically unlock in %{duration} or you may click the link below to unlock now."
+msgid "Your GitLab account has been locked due to an excessive number of unsuccessful sign in attempts. You can wait for your account to automatically unlock in %{duration} or you can click the link below to unlock now."
msgstr ""
msgid "Your GitLab account request has been approved!"
@@ -39203,6 +39754,9 @@ msgstr ""
msgid "Your commit email is used for web based operations, such as edits and merges."
msgstr ""
+msgid "Your current password is required to register a two-factor authenticator app."
+msgstr ""
+
msgid "Your dashboard has been copied. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr "Ваша панель ÐºÐµÑ€ÑƒÐ²Ð°Ð½Ð½Ñ Ð±ÑƒÐ»Ð° Ñкопійована. Ви можете %{web_ide_link_start}відредагувати Ñ—Ñ— тут%{web_ide_link_end}."
@@ -39302,6 +39856,9 @@ msgstr "Ваш профіль"
msgid "Your project limit is %{limit} projects! Please contact your administrator to increase it"
msgstr "Ваш ліміт проєктів Ñкладає %{limit}! Будь лаÑка, звернітьÑÑ Ð´Ð¾ адмініÑтратора, щоб його збільшити"
+msgid "Your project will be created at:"
+msgstr ""
+
msgid "Your projects"
msgstr "Ваші проєкти"
@@ -39341,11 +39898,12 @@ msgstr ""
msgid "Your subscription expired!"
msgstr "Термін дії вашої підпиÑки закінчивÑÑ!"
-msgid "Your subscription has been downgraded."
-msgstr ""
-
-msgid "Your subscription will expire in %{remaining_days}."
-msgstr ""
+msgid "Your subscription will expire in %{remaining_days} day."
+msgid_plural "Your subscription will expire in %{remaining_days} days."
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
msgid "Your username is %{username}."
msgstr ""
@@ -39556,6 +40114,9 @@ msgstr "не може блокувати Ñам Ñебе"
msgid "cannot merge"
msgstr "не може виконувати злиттÑ"
+msgid "cannot not be used for user namespace"
+msgstr ""
+
msgid "ciReport|%{degradedNum} degraded"
msgstr ""
@@ -39614,7 +40175,7 @@ msgid "ciReport|All severities"
msgstr "Ð’ÑÑ– рівні"
msgid "ciReport|All tools"
-msgstr ""
+msgstr "Ð’ÑÑ– інÑтрументи"
msgid "ciReport|Automatically apply the patch in a new branch"
msgstr "Ðвтоматично заÑтоÑувати патч у новій гілці"
@@ -39881,6 +40442,9 @@ msgstr ""
msgid "created %{timeAgo}"
msgstr ""
+msgid "created %{timeAgo} by %{author}"
+msgstr ""
+
msgid "created by"
msgstr ""
@@ -39927,9 +40491,6 @@ msgstr "не Ñ–Ñнує"
msgid "does not have a supported extension. Only %{extension_list} are supported"
msgstr "не підтримує розширеннÑ. ПідтримуютьÑÑ Ð»Ð¸ÑˆÐµ %{extension_list}"
-msgid "domain is not authorized for sign-up."
-msgstr ""
-
msgid "download it"
msgstr "завантажити це"
@@ -39949,20 +40510,13 @@ msgstr "елемент відÑутній в ієрархії"
msgid "email '%{email}' is not a verified email."
msgstr ""
-msgid "email does not match the allowed domain of %{email_domains}"
-msgid_plural "email does not match the allowed domains: %{email_domains}"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
-
msgid "enabled"
msgstr "увімкнено"
msgid "encrypted: needs to be a :required, :optional or :migrating!"
msgstr "зашифровано: має бути :required, :optional або :migrating!"
-msgid "ending with MIME type format is not allowed."
+msgid "ending with a reserved file extension is not allowed."
msgstr ""
msgid "entries cannot be larger than 255 characters"
@@ -39986,6 +40540,9 @@ msgstr "помилка"
msgid "estimateCommand|%{slash_command} overwrites the total estimated time."
msgstr ""
+msgid "example.com"
+msgstr ""
+
msgid "exceeds the limit of %{bytes} bytes"
msgstr ""
@@ -40038,9 +40595,6 @@ msgstr "Ð´Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ проєкту"
msgid "fork"
msgstr "форк"
-msgid "fork this project"
-msgstr "зробити форк цього проєкту"
-
msgid "from"
msgstr "від"
@@ -40051,6 +40605,9 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "frontmatter"
+msgstr ""
+
msgid "group"
msgstr "група"
@@ -40078,6 +40635,9 @@ msgstr ""
msgid "has been completed."
msgstr ""
+msgid "has too deep level of nesting"
+msgstr ""
+
msgid "help"
msgstr "допомога"
@@ -40111,9 +40671,21 @@ msgstr "процедура імпорту"
msgid "in"
msgstr ""
+msgid "in Infrastructure :: Kubernetes clusters"
+msgstr ""
+
+msgid "in all GitLab"
+msgstr ""
+
+msgid "in group"
+msgstr ""
+
msgid "in group %{link_to_group}"
msgstr "в групі %{link_to_group}"
+msgid "in project"
+msgstr ""
+
msgid "in project %{link_to_project}"
msgstr "в проєкті %{link_to_project}"
@@ -40157,16 +40729,19 @@ msgstr "не Ñ” нащадком групи, Ñкій належить шаблÐ
msgid "is not a valid X509 certificate."
msgstr "не відповідний Ñертифікат X509."
-msgid "is not allowed since the group is not top-level group."
+msgid "is not allowed for sign-up."
msgstr ""
-msgid "is not allowed. Try again with a different email address, or contact your GitLab admin."
-msgstr "не дозволено. Спробуйте ще раз з іншою адреÑою електронної пошти або зв'ÑжітьÑÑ Ð· адмініÑтратором GitLab."
+msgid "is not allowed for this group."
+msgstr ""
-msgid "is not allowed. We do not currently support project-level iterations"
+msgid "is not allowed for this project."
msgstr ""
-msgid "is not from an allowed domain."
+msgid "is not allowed since the group is not top-level group."
+msgstr ""
+
+msgid "is not allowed. We do not currently support project-level iterations"
msgstr ""
msgid "is not in the group enforcing Group Managed Account"
@@ -40248,7 +40823,7 @@ msgid "limit of %{project_limit} reached"
msgstr "доÑÑгнуто ліміт %{project_limit}"
msgid "load it anyway"
-msgstr ""
+msgstr "вÑе одно завантажити"
msgid "loading"
msgstr "завантаженнÑ"
@@ -40259,6 +40834,9 @@ msgstr "заблоковано %{path_lock_user_name} %{created_at}"
msgid "log in"
msgstr "увійти"
+msgid "managed"
+msgstr ""
+
msgid "manual"
msgstr "вручну"
@@ -40308,6 +40886,9 @@ msgstr ""
msgid "mrWidget| Please restore it or use a different %{missingBranchName} branch"
msgstr "Будь лаÑка відновіть Ñ—Ñ— або викориÑтовуйте іншу %{missingBranchName} гілку"
+msgid "mrWidget|%{linkStart}Set up now%{linkEnd} to analyze your source code for known security vulnerabilities."
+msgstr ""
+
msgid "mrWidget|%{mergeError}."
msgstr ""
@@ -40390,6 +40971,9 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "mrWidget|Create issue to resolve all threads"
+msgstr ""
+
msgid "mrWidget|Delete source branch"
msgstr "Видалити гілку-джерело"
@@ -40399,12 +40983,18 @@ msgstr "СтатиÑтика Ñ€Ð¾Ð·Ð³Ð¾Ñ€Ñ‚Ð°Ð½Ð½Ñ Ð½Ð°Ñ€Ð°Ð·Ñ– недоÑтуÐ
msgid "mrWidget|Did not close"
msgstr "Ðе закрив"
+msgid "mrWidget|Dismiss"
+msgstr ""
+
msgid "mrWidget|Email patches"
msgstr "Email-патчі"
msgid "mrWidget|Failed to load deployment statistics"
msgstr "Ðе вдалоÑÑ Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶Ð¸Ñ‚Ð¸ ÑтатиÑтику розгортаннÑ"
+msgid "mrWidget|Hide %{widget} details"
+msgstr ""
+
msgid "mrWidget|If the %{missingBranchName} branch exists in your local repository, you can merge this merge request manually using the command line"
msgstr "Якщо гілка %{missingBranchName} Ñ–Ñнує у вашому локальному репозиторії, то ви можете заÑтоÑувати цей запит на Ð·Ð»Ð¸Ñ‚Ñ‚Ñ Ð²Ñ€ÑƒÑ‡Ð½Ñƒ за допомогою командного Ñ€Ñдка"
@@ -40502,9 +41092,6 @@ msgstr "Видалити із ланцюжка змін"
msgid "mrWidget|Request to merge"
msgstr "Запит на злиттÑ"
-msgid "mrWidget|Resolve all threads in new issue"
-msgstr ""
-
msgid "mrWidget|Resolve conflicts"
msgstr "Вирішити конфлікти"
@@ -40520,6 +41107,9 @@ msgstr "Ðнулювати цей запит на Ð·Ð»Ð¸Ñ‚Ñ‚Ñ Ð·Ð° допомо
msgid "mrWidget|Revoke approval"
msgstr "СкаÑувати затвердженнÑ"
+msgid "mrWidget|SAST and Secret Detection is not enabled."
+msgstr ""
+
msgid "mrWidget|Set by %{merge_author} to be added to the merge train when the pipeline succeeds"
msgstr ""
@@ -40529,6 +41119,9 @@ msgstr ""
msgid "mrWidget|Set by %{merge_author} to start a merge train when the pipeline succeeds"
msgstr ""
+msgid "mrWidget|Show %{widget} details"
+msgstr ""
+
msgid "mrWidget|The changes were merged into"
msgstr "Зміни були злиті в"
@@ -40541,6 +41134,9 @@ msgstr "Зміни будуть злиті в"
msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure, or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
msgstr ""
+msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure."
+msgstr ""
+
msgid "mrWidget|The source branch has been deleted"
msgstr "Гілку-джерело видалено"
@@ -40583,6 +41179,9 @@ msgstr ""
msgid "mrWidget|You can merge after removing denied licenses"
msgstr ""
+msgid "mrWidget|You can only merge once this merge request is approved."
+msgstr ""
+
msgid "mrWidget|Your password"
msgstr "Ваш пароль"
@@ -40619,6 +41218,9 @@ msgstr ""
msgid "must be less than the limit of %{tag_limit} tags"
msgstr ""
+msgid "must be set for a project namespace"
+msgstr ""
+
msgid "must be unique by status and elapsed time within a policy"
msgstr ""
@@ -40732,6 +41334,9 @@ msgstr ""
msgid "pipeline"
msgstr "конвеєр"
+msgid "pipeline schedules documentation"
+msgstr ""
+
msgid "pod_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
msgstr ""
@@ -40785,16 +41390,25 @@ msgstr "учаÑники проєкту"
msgid "project name"
msgstr "назва проєкту"
+msgid "project namespace cannot be the parent of another namespace"
+msgstr ""
+
msgid "projects"
msgstr "проєкти"
msgid "quick actions"
msgstr "швидкі дії"
-msgid "reCAPTCHA Private Key"
+msgid "reCAPTCHA"
+msgstr ""
+
+msgid "reCAPTCHA helps prevent credential stuffing."
+msgstr ""
+
+msgid "reCAPTCHA private key"
msgstr ""
-msgid "reCAPTCHA Site Key"
+msgid "reCAPTCHA site key"
msgstr ""
msgid "recent activity"
@@ -41023,6 +41637,9 @@ msgstr "завантаженнÑ"
msgid "user avatar"
msgstr "аватар кориÑтувача"
+msgid "user namespace cannot be the parent of another namespace"
+msgstr ""
+
msgid "user preferences"
msgstr ""
@@ -41117,3 +41734,9 @@ msgstr "yaml недійÑний"
msgid "your settings"
msgstr "ваші налаштуваннÑ"
+msgid "{group}"
+msgstr ""
+
+msgid "{project}"
+msgstr ""
+
diff --git a/locale/ur_PK/gitlab.po b/locale/ur_PK/gitlab.po
index 392a9f3a524..9973e95818b 100644
--- a/locale/ur_PK/gitlab.po
+++ b/locale/ur_PK/gitlab.po
@@ -14,10 +14,7 @@ msgstr ""
"X-Crowdin-Language: ur-PK\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-09-01 22:30\n"
-
-msgid " %{name}, confirm your email address now! "
-msgstr ""
+"PO-Revision-Date: 2021-10-04 20:18\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -92,6 +89,16 @@ msgstr ""
msgid "#general, #development"
msgstr ""
+msgid "%d Alert"
+msgid_plural "%d Alerts"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d Alert:"
+msgid_plural "%d Alerts:"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d Approval"
msgid_plural "%d Approvals"
msgstr[0] ""
@@ -455,7 +462,10 @@ msgstr ""
msgid "%{code_open}Protected:%{code_close} Only exposed to protected branches or tags."
msgstr ""
-msgid "%{commit_author_link} authored %{commit_timeago}"
+msgid "%{commit_author_link} authored %{commit_authored_timeago}"
+msgstr ""
+
+msgid "%{commit_author_link} authored %{commit_authored_timeago} and %{commit_committer_avatar} %{commit_committer_link} committed %{commit_committer_timeago}"
msgstr ""
msgid "%{completedCount} completed weight"
@@ -549,6 +559,15 @@ msgstr ""
msgid "%{doc_link_start}Advanced search%{doc_link_end} is enabled."
msgstr ""
+msgid "%{docs_link_start}Learn about visibility levels.%{docs_link_end}"
+msgstr ""
+
+msgid "%{docs_link_start}What is Large File Storage?%{docs_link_end}"
+msgstr ""
+
+msgid "%{docs_link_start}What is two-factor authentication?%{docs_link_end}"
+msgstr ""
+
msgid "%{due_date} (Past due)"
msgstr ""
@@ -621,9 +640,6 @@ msgstr ""
msgid "%{issueType} actions"
msgstr ""
-msgid "%{issuesCount} issues with a limit of %{maxIssueCount}"
-msgstr ""
-
msgid "%{issuesSize} with a limit of %{maxIssueCount}"
msgstr ""
@@ -681,6 +697,12 @@ msgstr ""
msgid "%{label_for_message} unavailable"
msgstr ""
+msgid "%{learn_more_link}."
+msgstr ""
+
+msgid "%{lessThan} 1 hour"
+msgstr ""
+
msgid "%{lets_encrypt_link_start}Let's Encrypt%{lets_encrypt_link_end} is a free, automated, and open certificate authority (CA) that issues digital certificates to enable HTTPS (SSL/TLS) for sites."
msgstr ""
@@ -693,15 +715,15 @@ msgstr ""
msgid "%{link_start}Learn more%{link_end} about roles."
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
-msgstr ""
-
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
msgstr ""
msgid "%{link_start}Start the title with %{draft_snippet}%{link_end} to prevent a merge request that is a work in progress from being merged before it's ready."
msgstr ""
+msgid "%{link_start}What information does GitLab Inc. collect?%{link_end}"
+msgstr ""
+
msgid "%{listToShow}, and %{awardsListLength} more"
msgstr ""
@@ -854,7 +876,7 @@ msgid_plural "%{securityScanner} results are not available because a pipeline ha
msgstr[0] ""
msgstr[1] ""
-msgid "%{service_ping_link_start}Learn more%{service_ping_link_end} about what information is shared with GitLab Inc."
+msgid "%{service_ping_link_start}What information is shared with GitLab Inc.?%{service_ping_link_end}"
msgstr ""
msgid "%{size} %{unit}"
@@ -890,6 +912,9 @@ msgstr ""
msgid "%{state} epics"
msgstr ""
+msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
+msgstr ""
+
msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
msgstr ""
@@ -949,11 +974,6 @@ msgstr ""
msgid "%{template_project_id} is unknown or invalid"
msgstr ""
-msgid "%{text} %{files}"
-msgid_plural "%{text} %{files} files"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%{text} is available"
msgstr ""
@@ -1038,9 +1058,6 @@ msgstr ""
msgid "%{wildcards_link_start}Wildcards%{wildcards_link_end} such as %{code_tag_start}v*%{code_tag_end} or %{code_tag_start}*-release%{code_tag_end} are supported."
msgstr ""
-msgid "&lt; 1 hour"
-msgstr ""
-
msgid "'%{data}' at %{location} does not match format: %{format}"
msgstr ""
@@ -1124,9 +1141,6 @@ msgstr ""
msgid "(we need your current password to confirm your changes)"
msgstr ""
-msgid "* * * * *"
-msgstr ""
-
msgid "+ %{amount} more"
msgstr ""
@@ -1193,10 +1207,10 @@ msgstr ""
msgid "."
msgstr ""
-msgid "0 bytes"
+msgid "/"
msgstr ""
-msgid "0 for unlimited, only effective with remote storage enabled."
+msgid "0 bytes"
msgstr ""
msgid "0t1DgySidms"
@@ -1326,6 +1340,9 @@ msgstr ""
msgid "1000+"
msgstr ""
+msgid "192.168.0.0/24"
+msgstr ""
+
msgid "1st contribution!"
msgstr ""
@@ -1479,9 +1496,6 @@ msgstr ""
msgid "A plain HTML site that uses Netlify for CI/CD instead of GitLab, but still with all the other great GitLab features"
msgstr ""
-msgid "A plain-text response to show to clients that hit the rate limit."
-msgstr ""
-
msgid "A platform value can be web, mob or app."
msgstr ""
@@ -1563,7 +1577,7 @@ msgstr ""
msgid "APIFuzzing|Configure HTTP basic authentication values. Other authentication methods are supported. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
+msgid "APIFuzzing|Customize your project's API fuzzing configuration options and copy the code snippet to your .gitlab-ci.yml file to apply any changes. Note that this tool does not reflect or update your .gitlab-ci.yml file automatically. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
msgstr ""
msgid "APIFuzzing|Enable authentication"
@@ -1626,9 +1640,6 @@ msgstr ""
msgid "APIFuzzing|To prevent a security leak, authentication info must be added as a %{ciVariablesLinkStart}CI variable%{ciVariablesLinkEnd}. As a user with maintainer access rights, you can manage CI variables in the %{ciSettingsLinkStart}Settings%{ciSettingsLinkEnd} area."
msgstr ""
-msgid "APIFuzzing|Use this tool to generate API fuzzing configuration YAML to copy into your .gitlab-ci.yml file. This tool does not reflect or update your .gitlab-ci.yml file automatically."
-msgstr ""
-
msgid "APIFuzzing|Username for basic authentication"
msgstr ""
@@ -1680,9 +1691,6 @@ msgstr ""
msgid "Abuse reports notification email"
msgstr ""
-msgid "Abuse reports will be sent to this address if it is set. Abuse reports are always available in the admin area."
-msgstr ""
-
msgid "Accept invitation"
msgstr ""
@@ -1719,12 +1727,18 @@ msgstr ""
msgid "Access granted"
msgstr ""
+msgid "Access key ID"
+msgstr ""
+
msgid "Access requests"
msgstr ""
msgid "Access to '%{classification_label}' not allowed"
msgstr ""
+msgid "Access tokens expire after 2 hours. A refresh token may be used at any time to generate a new access token. Non-expiring access tokens are deprecated. Clear this setting to enable backward compatibility."
+msgstr ""
+
msgid "AccessDropdown|Deploy Keys"
msgstr ""
@@ -2037,6 +2051,9 @@ msgstr ""
msgid "Add new directory"
msgstr ""
+msgid "Add new service account"
+msgstr ""
+
msgid "Add or remove previously merged commits"
msgstr ""
@@ -2274,6 +2291,9 @@ msgstr ""
msgid "AdminArea|Features"
msgstr ""
+msgid "AdminArea|Get security updates from GitLab and stay up to date"
+msgstr ""
+
msgid "AdminArea|Groups"
msgstr ""
@@ -2313,6 +2333,12 @@ msgstr ""
msgid "AdminArea|Reporter"
msgstr ""
+msgid "AdminArea|Sign up for the GitLab Security Newsletter to get notified for security updates."
+msgstr ""
+
+msgid "AdminArea|Sign up for the GitLab newsletter"
+msgstr ""
+
msgid "AdminArea|Stop all jobs"
msgstr ""
@@ -2382,9 +2408,15 @@ msgstr ""
msgid "AdminSettings|Disable public access to Pages sites"
msgstr ""
+msgid "AdminSettings|Display a banner on merge requests in projects with no pipelines to initiate steps to add a .gitlab-ci.yml file."
+msgstr ""
+
msgid "AdminSettings|Domain verification is an essential security measure for public GitLab sites. Users are required to demonstrate they control a domain before it is enabled. %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "AdminSettings|Enable pipeline suggestion banner"
+msgstr ""
+
msgid "AdminSettings|Enable shared runners for new projects"
msgstr ""
@@ -2856,10 +2888,10 @@ msgstr ""
msgid "Admin|Quarterly reconciliation will occur on %{qrtlyDate}"
msgstr ""
-msgid "Admin|The number of max seats used for your namespace is currently exceeding the number of seats in your subscription. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgid "Admin|The number of max seats in your namespace exceeds the number of seats in your subscription. On %{qrtlyDate}, quarterly reconciliation occurs and you are automatically billed a prorated amount for the overage. No action is needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice. For more information about the timing of the invoicing process, view the documentation."
msgstr ""
-msgid "Admin|The number of maximum users for your instance is currently exceeding the number of users in license. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgid "Admin|The number of max users in your instance exceeds the number of users in your license. On %{qrtlyDate}, quarterly reconciliation occurs and you are automatically billed a prorated amount for the overage. No action is needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice. For more information about the timing of the invoicing process, view the documentation."
msgstr ""
msgid "Admin|View pending user approvals"
@@ -2880,9 +2912,6 @@ msgstr ""
msgid "Advanced export options"
msgstr ""
-msgid "Advanced permissions, Large File Storage and Two-Factor authentication settings."
-msgstr ""
-
msgid "After a successful password update you will be redirected to login screen."
msgstr ""
@@ -2901,13 +2930,14 @@ msgstr ""
msgid "After you've reviewed these contribution guidelines, you'll be all set to"
msgstr ""
+msgid "Akismet"
+msgstr ""
+
msgid "Akismet API Key"
msgstr ""
-msgid "Alert"
-msgid_plural "Alerts"
-msgstr[0] ""
-msgstr[1] ""
+msgid "Akismet helps prevent the creation of spam issues in public projects."
+msgstr ""
msgid "AlertManagement|Acknowledged"
msgstr ""
@@ -3263,6 +3293,9 @@ msgstr ""
msgid "All (default)"
msgstr ""
+msgid "All GitLab"
+msgstr ""
+
msgid "All Members"
msgstr ""
@@ -3377,6 +3410,9 @@ msgstr ""
msgid "Allow this secondary node to replicate content on Object Storage"
msgstr ""
+msgid "Allow use of licensed EE features"
+msgstr ""
+
msgid "Allow users to dismiss the broadcast message"
msgstr ""
@@ -3452,9 +3488,6 @@ msgstr ""
msgid "Amazon authentication is not %{link_start}correctly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
-msgid "Amount of time (in hours) that users are allowed to skip forced configuration of two-factor authentication"
-msgstr ""
-
msgid "An %{link_start}alert%{link_end} with the same fingerprint is already open. To change the status of this alert, resolve the linked alert."
msgstr ""
@@ -3515,12 +3548,6 @@ msgstr ""
msgid "An error occurred when removing the label."
msgstr ""
-msgid "An error occurred when toggling the notification subscription"
-msgstr ""
-
-msgid "An error occurred when updating the issue weight"
-msgstr ""
-
msgid "An error occurred when updating the title"
msgstr ""
@@ -3569,6 +3596,9 @@ msgstr ""
msgid "An error occurred while enabling Service Desk."
msgstr ""
+msgid "An error occurred while fetching Markdown preview"
+msgstr ""
+
msgid "An error occurred while fetching ancestors"
msgstr ""
@@ -3599,9 +3629,6 @@ msgstr ""
msgid "An error occurred while fetching label colors."
msgstr ""
-msgid "An error occurred while fetching markdown preview"
-msgstr ""
-
msgid "An error occurred while fetching participants"
msgstr ""
@@ -3617,9 +3644,6 @@ msgstr ""
msgid "An error occurred while fetching reference"
msgstr ""
-msgid "An error occurred while fetching sidebar data"
-msgstr ""
-
msgid "An error occurred while fetching tags. Retry the search."
msgstr ""
@@ -3695,6 +3719,9 @@ msgstr ""
msgid "An error occurred while loading merge requests."
msgstr ""
+msgid "An error occurred while loading projects."
+msgstr ""
+
msgid "An error occurred while loading the Needs tab."
msgstr ""
@@ -3929,12 +3956,6 @@ msgstr ""
msgid "Any Milestone"
msgstr ""
-msgid "Any branch"
-msgstr ""
-
-msgid "Any eligible user"
-msgstr ""
-
msgid "Any encrypted tokens"
msgstr ""
@@ -3953,6 +3974,9 @@ msgstr ""
msgid "Any namespace"
msgstr ""
+msgid "App Engine description and apps that are suitable for this deployment target"
+msgstr ""
+
msgid "App ID"
msgstr ""
@@ -4101,6 +4125,11 @@ msgstr ""
msgid "Apply"
msgstr ""
+msgid "Apply %d suggestion"
+msgid_plural "Apply %d suggestions"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Apply a label"
msgstr ""
@@ -4110,13 +4139,10 @@ msgstr ""
msgid "Apply suggestion"
msgstr ""
-msgid "Apply suggestions"
-msgstr ""
-
msgid "Apply template"
msgstr ""
-msgid "Apply this approval rule to any branch or a specific protected branch."
+msgid "Apply this approval rule to all branches or a specific protected branch."
msgstr ""
msgid "Applying"
@@ -4259,9 +4285,6 @@ msgstr ""
msgid "ApprovalSettings|Prevent editing approval rules in projects and merge requests."
msgstr ""
-msgid "ApprovalSettings|Prevent editing approval rules in projects and merge requests. "
-msgstr ""
-
msgid "ApprovalSettings|Remove all approvals when commits are added to the source branch."
msgstr ""
@@ -4277,6 +4300,9 @@ msgstr ""
msgid "ApprovalSettings|This setting is configured at the instance level and can only be changed by an administrator."
msgstr ""
+msgid "ApprovalSettings|This setting is configured in %{groupName} and can only be changed by an administrator or group owner."
+msgstr ""
+
msgid "ApprovalStatusTooltip|Adheres to separation of duties"
msgstr ""
@@ -4763,9 +4789,6 @@ msgstr ""
msgid "Authenticated API rate limit period in seconds"
msgstr ""
-msgid "Authenticated API request rate limit"
-msgstr ""
-
msgid "Authenticated API requests"
msgstr ""
@@ -4775,10 +4798,10 @@ msgstr ""
msgid "Authenticated Git LFS request rate limit"
msgstr ""
-msgid "Authenticated web rate limit period in seconds"
+msgid "Authenticated Git LFS requests"
msgstr ""
-msgid "Authenticated web request rate limit"
+msgid "Authenticated web rate limit period in seconds"
msgstr ""
msgid "Authenticated web requests"
@@ -5156,9 +5179,6 @@ msgstr ""
msgid "Below you will find all the groups that are public."
msgstr ""
-msgid "Beta"
-msgstr ""
-
msgid "Bi-weekly code coverage"
msgstr ""
@@ -5398,6 +5418,21 @@ msgstr ""
msgid "Board scope affects which issues are displayed for anyone who visits this board"
msgstr ""
+msgid "BoardNewEpic|Groups"
+msgstr ""
+
+msgid "BoardNewEpic|Loading groups"
+msgstr ""
+
+msgid "BoardNewEpic|No matching results"
+msgstr ""
+
+msgid "BoardNewEpic|Search groups"
+msgstr ""
+
+msgid "BoardNewEpic|Select a group"
+msgstr ""
+
msgid "BoardNewIssue|No matching results"
msgstr ""
@@ -5475,6 +5510,9 @@ msgstr ""
msgid "Boards|An error occurred while creating the list. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching child groups. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching group projects. Please try again."
msgstr ""
@@ -5807,6 +5845,9 @@ msgstr ""
msgid "Bulk update"
msgstr ""
+msgid "BulkImports|Re-import creates a new group. It does not sync with the existing group."
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -5816,6 +5857,9 @@ msgstr ""
msgid "BulkImport|From source group"
msgstr ""
+msgid "BulkImport|Group import history"
+msgstr ""
+
msgid "BulkImport|Import failed: Destination cannot be a subgroup of the source group. Change the destination and try again."
msgstr ""
@@ -5828,9 +5872,18 @@ msgstr ""
msgid "BulkImport|Importing the group failed"
msgstr ""
+msgid "BulkImport|Last imported to %{link}"
+msgstr ""
+
msgid "BulkImport|Name already exists."
msgstr ""
+msgid "BulkImport|New group"
+msgstr ""
+
+msgid "BulkImport|No history is available"
+msgstr ""
+
msgid "BulkImport|No parent"
msgstr ""
@@ -5843,6 +5896,9 @@ msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} matching filter \"%{filter}\" from %{link}"
msgstr ""
+msgid "BulkImport|Source group"
+msgstr ""
+
msgid "BulkImport|To new group"
msgstr ""
@@ -5852,6 +5908,9 @@ msgstr ""
msgid "BulkImport|You have no groups to import"
msgstr ""
+msgid "BulkImport|Your imported groups will appear here."
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -6094,6 +6153,9 @@ msgstr ""
msgid "Can be manually deployed to"
msgstr ""
+msgid "Can be overridden in each project."
+msgstr ""
+
msgid "Can create groups:"
msgstr ""
@@ -6196,6 +6258,9 @@ msgstr ""
msgid "Cancelling Preview"
msgstr ""
+msgid "Cannot assign a confidential epic to a non-confidential issue. Make the issue confidential and try again"
+msgstr ""
+
msgid "Cannot be assigned to other projects."
msgstr ""
@@ -6247,9 +6312,6 @@ msgstr ""
msgid "Cannot refer to a group %{timebox_type} by an internal id!"
msgstr ""
-msgid "Cannot set confidential epic for a non-confidential issue"
-msgstr ""
-
msgid "Cannot show preview. For previews on sketch files, they must have the file format introduced by Sketch version 43 and above."
msgstr ""
@@ -6487,15 +6549,15 @@ msgstr ""
msgid "Check out, review, and merge locally"
msgstr ""
-msgid "Check the %{docs_link_start}documentation%{docs_link_end}."
-msgstr ""
-
msgid "Check the current instance configuration "
msgstr ""
msgid "Check the elasticsearch.log file to debug why the migration was halted and make any changes before retrying the migration. When you fix the cause of the failure, click \"Retry migration\", and the migration will be scheduled to be retried in the background."
msgstr ""
+msgid "Check with your administrator."
+msgstr ""
+
msgid "Check your Docker images for known vulnerabilities."
msgstr ""
@@ -6526,6 +6588,9 @@ msgstr ""
msgid "Checkout"
msgstr ""
+msgid "Checkout|$%{selectedPlanPrice} per 10 GB storage per pack"
+msgstr ""
+
msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 minutes"
msgstr ""
@@ -6546,17 +6611,23 @@ msgstr ""
msgid "Checkout|%{name}'s GitLab subscription"
msgstr ""
-msgid "Checkout|%{selectedPlanText} plan"
+msgid "Checkout|%{name}'s storage subscription"
msgstr ""
-msgid "Checkout|%{startDate} - %{endDate}"
+msgid "Checkout|%{quantity} GB of storage"
msgstr ""
-msgid "Checkout|%{totalCiMinutes} CI minute"
-msgid_plural "Checkout|%{totalCiMinutes} CI minutes"
+msgid "Checkout|%{quantity} storage pack"
+msgid_plural "Checkout|%{quantity} storage packs"
msgstr[0] ""
msgstr[1] ""
+msgid "Checkout|%{selectedPlanText} plan"
+msgstr ""
+
+msgid "Checkout|%{startDate} - %{endDate}"
+msgstr ""
+
msgid "Checkout|%{totalCiMinutes} CI minutes"
msgstr ""
@@ -6632,6 +6703,9 @@ msgstr ""
msgid "Checkout|Failed to register credit card. Please try again."
msgstr ""
+msgid "Checkout|GB"
+msgstr ""
+
msgid "Checkout|GitLab group"
msgstr ""
@@ -6668,6 +6742,9 @@ msgstr ""
msgid "Checkout|State"
msgstr ""
+msgid "Checkout|Storage packs"
+msgstr ""
+
msgid "Checkout|Street address"
msgstr ""
@@ -6689,6 +6766,9 @@ msgstr ""
msgid "Checkout|Total minutes: %{quantity}"
msgstr ""
+msgid "Checkout|Total storage: %{quantity} GB"
+msgstr ""
+
msgid "Checkout|Users"
msgstr ""
@@ -6698,16 +6778,25 @@ msgstr ""
msgid "Checkout|Your organization"
msgstr ""
+msgid "Checkout|Your storage subscription has the same term as your main subscription, and the price is prorated accordingly."
+msgstr ""
+
msgid "Checkout|Your subscription will be applied to this group"
msgstr ""
msgid "Checkout|Zip code"
msgstr ""
+msgid "Checkout|a storage subscription"
+msgstr ""
+
msgid "Checkout|company or team"
msgstr ""
-msgid "Checkout|x 1,000 minutes per pack = %{strong}"
+msgid "Checkout|minutes"
+msgstr ""
+
+msgid "Checkout|x %{quantity} %{units} per pack ="
msgstr ""
msgid "Cherry-pick this commit"
@@ -7064,6 +7153,9 @@ msgstr ""
msgid "CloneIssue|Cannot clone issue to target project as it is pending deletion."
msgstr ""
+msgid "CloneIssue|Cannot clone issues of '%{issue_type}' type."
+msgstr ""
+
msgid "Cloned this issue to %{path_to_project}."
msgstr ""
@@ -7118,7 +7210,10 @@ msgstr ""
msgid "Closes this %{quick_action_target}."
msgstr ""
-msgid "Cloud licenses can not be removed."
+msgid "Cloud Functions description and apps that are suitable for this deployment target"
+msgstr ""
+
+msgid "Cloud Run description and apps that are suitable for this deployment target"
msgstr ""
msgid "Cluster"
@@ -7145,6 +7240,12 @@ msgstr ""
msgid "ClusterAgents|Access tokens"
msgstr ""
+msgid "ClusterAgents|Agent might not be connected to GitLab"
+msgstr ""
+
+msgid "ClusterAgents|Agent never connected to GitLab"
+msgstr ""
+
msgid "ClusterAgents|Alternative installation methods"
msgstr ""
@@ -7160,6 +7261,12 @@ msgstr ""
msgid "ClusterAgents|Configuration"
msgstr ""
+msgid "ClusterAgents|Connected"
+msgstr ""
+
+msgid "ClusterAgents|Connection status"
+msgstr ""
+
msgid "ClusterAgents|Copy token"
msgstr ""
@@ -7178,6 +7285,9 @@ msgstr ""
msgid "ClusterAgents|For alternative installation methods %{linkStart}go to the documentation%{linkEnd}."
msgstr ""
+msgid "ClusterAgents|For more troubleshooting information go to"
+msgstr ""
+
msgid "ClusterAgents|Go to the repository"
msgstr ""
@@ -7193,18 +7303,30 @@ msgstr ""
msgid "ClusterAgents|Integrate with the GitLab Agent"
msgstr ""
-msgid "ClusterAgents|Last used"
+msgid "ClusterAgents|Last connected %{timeAgo}."
+msgstr ""
+
+msgid "ClusterAgents|Last contact"
msgstr ""
msgid "ClusterAgents|Learn how to create an agent access token"
msgstr ""
+msgid "ClusterAgents|Make sure you are using a valid token."
+msgstr ""
+
msgid "ClusterAgents|Name"
msgstr ""
msgid "ClusterAgents|Never"
msgstr ""
+msgid "ClusterAgents|Never connected"
+msgstr ""
+
+msgid "ClusterAgents|Not connected"
+msgstr ""
+
msgid "ClusterAgents|Read more about getting started"
msgstr ""
@@ -7226,6 +7348,9 @@ msgstr ""
msgid "ClusterAgents|Select which Agent you want to install"
msgstr ""
+msgid "ClusterAgents|The Agent has not been connected in a long time. There might be a connectivity issue. Last contact was %{timeAgo}."
+msgstr ""
+
msgid "ClusterAgents|The GitLab Agent also requires %{linkStart}enabling the Agent Server%{linkEnd}"
msgstr ""
@@ -7253,9 +7378,6 @@ msgstr ""
msgid "ClusterAgents|You will need to create a token to connect to your agent"
msgstr ""
-msgid "ClusterAgent|This feature is only available for premium plans"
-msgstr ""
-
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -7445,9 +7567,6 @@ msgstr ""
msgid "ClusterIntegration|Create Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Create a provision role on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the account and external ID above. %{startMoreInfoLink}More information%{endLink}"
-msgstr ""
-
msgid "ClusterIntegration|Create cluster on"
msgstr ""
@@ -7880,7 +7999,7 @@ msgstr ""
msgid "ClusterIntegration|Subnets"
msgstr ""
-msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provisioned role, first create one on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the above account and external IDs. %{startMoreInfoLink}More information%{endLink}"
+msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provisioned role, first create one on %{awsLinkStart}Amazon Web Services %{awsLinkEnd} using the above account and external IDs. %{moreInfoStart}More information%{moreInfoEnd}"
msgstr ""
msgid "ClusterIntegration|The Kubernetes certificate used to authenticate to the cluster."
@@ -8114,6 +8233,9 @@ msgstr ""
msgid "Collapse replies"
msgstr ""
+msgid "Collapse settings section"
+msgstr ""
+
msgid "Collapse sidebar"
msgstr ""
@@ -8132,6 +8254,9 @@ msgstr ""
msgid "Comma-separated list of email addresses."
msgstr ""
+msgid "Comma-separated list of users allowed to exceed the rate limit."
+msgstr ""
+
msgid "Comma-separated, e.g. '1.1.1.1, 2.2.2.0/24'"
msgstr ""
@@ -8452,6 +8577,9 @@ msgstr ""
msgid "Configure %{repository_checks_link_start}repository checks%{link_end} and %{housekeeping_link_start}housekeeping%{link_end} on repositories."
msgstr ""
+msgid "Configure CAPTCHAs, IP address limits, and other anti-spam measures."
+msgstr ""
+
msgid "Configure Dependency Scanning in `.gitlab-ci.yml` using the GitLab managed template. You can [add variable overrides](https://docs.gitlab.com/ee/user/application_security/dependency_scanning/#customizing-the-dependency-scanning-settings) to customize Dependency Scanning settings."
msgstr ""
@@ -8488,16 +8616,13 @@ msgstr ""
msgid "Configure a %{codeStart}.gitlab-webide.yml%{codeEnd} file in the %{codeStart}.gitlab%{codeEnd} directory to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
msgstr ""
-msgid "Configure existing installation"
-msgstr ""
-
-msgid "Configure limit for notes created per minute by web and API requests."
+msgid "Configure advanced permissions, Large File Storage, and two-factor authentication settings."
msgstr ""
-msgid "Configure limits for Project/Group Import/Export."
+msgid "Configure approvals by authors and committers on all projects."
msgstr ""
-msgid "Configure limits for web and API requests."
+msgid "Configure existing installation"
msgstr ""
msgid "Configure paths to be protected by Rack Attack."
@@ -8512,10 +8637,13 @@ msgstr ""
msgid "Configure settings for Advanced Search with Elasticsearch."
msgstr ""
+msgid "Configure specific limits for Files API requests that supersede the general user and IP rate limits."
+msgstr ""
+
msgid "Configure specific limits for Git LFS requests that supersede the general user and IP rate limits."
msgstr ""
-msgid "Configure specific limits for Packages API requests that supersede the general user and IP rate limits."
+msgid "Configure specific limits for deprecated API requests that supersede the general user and IP rate limits."
msgstr ""
msgid "Configure the %{link} integration."
@@ -8527,6 +8655,9 @@ msgstr ""
msgid "Configure the way a user creates a new account."
msgstr ""
+msgid "Configure via Merge Request"
+msgstr ""
+
msgid "Configure which lists are shown for anyone who visits this board"
msgstr ""
@@ -8995,6 +9126,9 @@ msgstr ""
msgid "Content parsed with %{link}."
msgstr ""
+msgid "ContentEditor|Table of Contents"
+msgstr ""
+
msgid "ContentEditor|You have to provide a renderMarkdown function or a custom serializer"
msgstr ""
@@ -9181,6 +9315,9 @@ msgstr ""
msgid "Copy link to chart"
msgstr ""
+msgid "Copy prefix"
+msgstr ""
+
msgid "Copy reference"
msgstr ""
@@ -9211,6 +9348,9 @@ msgstr ""
msgid "Copy value"
msgstr ""
+msgid "Corpus Management"
+msgstr ""
+
msgid "Corpus Management|Are you sure you want to delete the corpus?"
msgstr ""
@@ -9439,6 +9579,9 @@ msgstr ""
msgid "Create commit"
msgstr ""
+msgid "Create common files more quickly, and standardize their format."
+msgstr ""
+
msgid "Create confidential merge request"
msgstr ""
@@ -9472,6 +9615,9 @@ msgstr ""
msgid "Create issue"
msgstr ""
+msgid "Create issue to resolve all threads"
+msgstr ""
+
msgid "Create iteration"
msgstr ""
@@ -9526,6 +9672,9 @@ msgstr ""
msgid "Create new..."
msgstr ""
+msgid "Create or import your first project"
+msgstr ""
+
msgid "Create project"
msgstr ""
@@ -9883,7 +10032,7 @@ msgstr ""
msgid "Custom notification events"
msgstr ""
-msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notificationLinkStart} notification emails%{notificationLinkEnd}."
+msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notificationLinkStart}notification emails%{notificationLinkEnd}."
msgstr ""
msgid "Custom project templates"
@@ -10082,10 +10231,10 @@ msgid_plural "CycleAnalytics|Showing %{subjectFilterText} and %{selectedLabelsCo
msgstr[0] ""
msgstr[1] ""
-msgid "CycleAnalytics|Showing data for group '%{groupName}' and %{selectedProjectCount} projects from %{startDate} to %{endDate}"
+msgid "CycleAnalytics|Showing data for group '%{groupName}' and %{selectedProjectCount} projects from %{createdAfter} to %{createdBefore}"
msgstr ""
-msgid "CycleAnalytics|Showing data for group '%{groupName}' from %{startDate} to %{endDate}"
+msgid "CycleAnalytics|Showing data for group '%{groupName}' from %{createdAfter} to %{createdBefore}"
msgstr ""
msgid "CycleAnalytics|Stages"
@@ -10319,6 +10468,9 @@ msgstr ""
msgid "DastProfiles|Manage profiles"
msgstr ""
+msgid "DastProfiles|Manage site profiles"
+msgstr ""
+
msgid "DastProfiles|Minimum = 0 (no timeout enabled), Maximum = 2880 minutes"
msgstr ""
@@ -10394,6 +10546,9 @@ msgstr ""
msgid "DastProfiles|Scanner name"
msgstr ""
+msgid "DastProfiles|Schedule"
+msgstr ""
+
msgid "DastProfiles|Select branch"
msgstr ""
@@ -10463,7 +10618,7 @@ msgstr ""
msgid "DastProfiles|Website"
msgstr ""
-msgid "DastProfiles|You can either choose a passive scan or validate the target site in your chosen site profile. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
+msgid "DastProfiles|You can either choose a passive scan or validate the target site from the site profile management page. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
msgstr ""
msgid "DastProfiles|You cannot run an active scan against an unvalidated site."
@@ -10636,7 +10791,7 @@ msgstr ""
msgid "Days to merge"
msgstr ""
-msgid "Deactivate dormant users after 90 days of inactivity. Users can return to active status by signing in to their account. While inactive, a user is not counted as an active user in the instance."
+msgid "Deactivate dormant users after 90 days of inactivity"
msgstr ""
msgid "Dear Administrator,"
@@ -10723,10 +10878,10 @@ msgstr ""
msgid "Define a custom pattern with cron syntax"
msgstr ""
-msgid "Define approval settings."
+msgid "Define approval rules."
msgstr ""
-msgid "Define approval settings. %{linkStart}Learn more.%{linkEnd}"
+msgid "Define approval rules. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "Define custom rules for what constitutes spam, independent of Akismet"
@@ -10735,7 +10890,7 @@ msgstr ""
msgid "Define environments in the deploy stage(s) in %{code_open}.gitlab-ci.yml%{code_close} to track deployments here."
msgstr ""
-msgid "Define how approval rules are applied as a merge request moves toward completion."
+msgid "Define how approval rules are applied to merge requests."
msgstr ""
msgid "Definition"
@@ -10750,6 +10905,12 @@ msgstr ""
msgid "DelayedJobs|Are you sure you want to run %{job_name} immediately? This job will run automatically after it's timer finishes."
msgstr ""
+msgid "DelayedJobs|Are you sure you want to run %{job_name} immediately? This job will run automatically after its timer finishes."
+msgstr ""
+
+msgid "DelayedJobs|Run the delayed job now?"
+msgstr ""
+
msgid "DelayedJobs|Start now"
msgstr ""
@@ -11026,6 +11187,12 @@ msgstr ""
msgid "Dependency proxy image prefix"
msgstr ""
+msgid "DependencyProxy|Create a local proxy for storing frequently used upstream images. %{docLinkStart}Learn more%{docLinkEnd} about dependency proxies."
+msgstr ""
+
+msgid "DependencyProxy|Dependency Proxy"
+msgstr ""
+
msgid "DependencyProxy|Toggle Dependency Proxy"
msgstr ""
@@ -11266,6 +11433,9 @@ msgstr ""
msgid "Deployments"
msgstr ""
+msgid "Deployments to Google Kubernetes Engine can be "
+msgstr ""
+
msgid "Deployments|%{deployments} environment impacted."
msgid_plural "Deployments|%{deployments} environments impacted."
msgstr[0] ""
@@ -11295,6 +11465,9 @@ msgstr ""
msgid "Deployment|success"
msgstr ""
+msgid "Deprecated API rate limits"
+msgstr ""
+
msgid "Deprioritize label"
msgstr ""
@@ -11697,6 +11870,16 @@ msgstr ""
msgid "DiffsCompareBaseBranch|(base)"
msgstr ""
+msgid "Diffs|%d addition"
+msgid_plural "Diffs|%d additions"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Diffs|%d deletion"
+msgid_plural "Diffs|%d deletions"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Diffs|No file name available"
msgstr ""
@@ -11706,9 +11889,17 @@ msgstr ""
msgid "Diffs|Show all unchanged lines"
msgstr ""
+msgid "Diffs|Showing %{dropdownStart}%{count} changed file%{dropdownEnd}"
+msgid_plural "Diffs|Showing %{dropdownStart}%{count} changed files%{dropdownEnd}"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Diffs|Something went wrong while fetching diff lines."
msgstr ""
+msgid "Diffs|with %{additions} and %{deletions}"
+msgstr ""
+
msgid "Direct member"
msgstr ""
@@ -11834,9 +12025,6 @@ msgid_plural "Dismiss %d selected vulnerabilities as"
msgstr[0] ""
msgstr[1] ""
-msgid "Dismiss Value Stream Analytics introduction box"
-msgstr ""
-
msgid "Dismiss merge request promotion"
msgstr ""
@@ -12158,6 +12346,9 @@ msgstr ""
msgid "Edit issues"
msgstr ""
+msgid "Edit merge requests"
+msgstr ""
+
msgid "Edit public deploy key"
msgstr ""
@@ -12233,6 +12424,9 @@ msgstr ""
msgid "Elastic|None. Select projects to index."
msgstr ""
+msgid "Eligible users"
+msgstr ""
+
msgid "Email"
msgstr ""
@@ -12362,6 +12556,9 @@ msgstr ""
msgid "Enable"
msgstr ""
+msgid "Enable Amazon EKS integration"
+msgstr ""
+
msgid "Enable Auto DevOps"
msgstr ""
@@ -12395,6 +12592,9 @@ msgstr ""
msgid "Enable SSL verification"
msgstr ""
+msgid "Enable Service Ping"
+msgstr ""
+
msgid "Enable Snowplow tracking"
msgstr ""
@@ -12425,6 +12625,9 @@ msgstr ""
msgid "Enable authenticated Git LFS request rate limit"
msgstr ""
+msgid "Enable authenticated web request rate limit"
+msgstr ""
+
msgid "Enable authentication"
msgstr ""
@@ -12485,7 +12688,7 @@ msgstr ""
msgid "Enable or disable the Pseudonymizer data collection."
msgstr ""
-msgid "Enable or disable version check and service ping."
+msgid "Enable or disable version check and Service Ping."
msgstr ""
msgid "Enable protected paths rate limit"
@@ -12497,18 +12700,12 @@ msgstr ""
msgid "Enable reCAPTCHA"
msgstr ""
-msgid "Enable reCAPTCHA for login"
-msgstr ""
-
-msgid "Enable reCAPTCHA, Invisible Captcha, Akismet and set IP limits. For reCAPTCHA, we currently only support %{recaptcha_v2_link_start}v2%{recaptcha_v2_link_end}"
+msgid "Enable reCAPTCHA for login."
msgstr ""
msgid "Enable repository checks"
msgstr ""
-msgid "Enable service ping"
-msgstr ""
-
msgid "Enable shared runners for all projects and subgroups in this group."
msgstr ""
@@ -12530,7 +12727,10 @@ msgstr ""
msgid "Enable unauthenticated API request rate limit"
msgstr ""
-msgid "Enable unauthenticated request rate limit"
+msgid "Enable unauthenticated web request rate limit"
+msgstr ""
+
+msgid "Enable user deactivation emails"
msgstr ""
msgid "Enable version check"
@@ -12566,9 +12766,6 @@ msgstr ""
msgid "Enabled sources for code import during project creation. OmniAuth must be configured for GitHub"
msgstr ""
-msgid "Enabling this will only make licensed EE features available to projects if the project namespace's plan includes the feature or if the project is public."
-msgstr ""
-
msgid "Encountered an error while rendering: %{err}"
msgstr ""
@@ -12617,9 +12814,6 @@ msgstr ""
msgid "Enter Admin Mode"
msgstr ""
-msgid "Enter IP address range"
-msgstr ""
-
msgid "Enter a number"
msgstr ""
@@ -12632,9 +12826,6 @@ msgstr ""
msgid "Enter at least three characters to search"
msgstr ""
-msgid "Enter domain"
-msgstr ""
-
msgid "Enter in your Bitbucket Server URL and personal access token below"
msgstr ""
@@ -12821,9 +13012,6 @@ msgstr ""
msgid "Environments|Deployment %{status}"
msgstr ""
-msgid "Environments|Dismiss"
-msgstr ""
-
msgid "Environments|Enable review app"
msgstr ""
@@ -12836,9 +13024,6 @@ msgstr ""
msgid "Environments|Environments are places where code gets deployed, such as staging or production."
msgstr ""
-msgid "Environments|Help us improve environments"
-msgstr ""
-
msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
msgstr ""
@@ -12875,6 +13060,9 @@ msgstr ""
msgid "Environments|Note that this action will stop the environment, but it will %{emphasisStart}not%{emphasisEnd} have an effect on any existing deployment due to no “stop environment action†being defined in the %{ciConfigLinkStart}.gitlab-ci.yml%{ciConfigLinkEnd} file."
msgstr ""
+msgid "Environments|Open"
+msgstr ""
+
msgid "Environments|Open live environment"
msgstr ""
@@ -12914,9 +13102,6 @@ msgstr ""
msgid "Environments|Stopping %{environmentName}"
msgstr ""
-msgid "Environments|Take the survey"
-msgstr ""
-
msgid "Environments|There was an error fetching the logs. Please try again."
msgstr ""
@@ -12938,9 +13123,6 @@ msgstr ""
msgid "Environments|You don't have any environments right now"
msgstr ""
-msgid "Environments|Your feedback helps GitLab make environments better for you and other users. Participate and enter a sweepstake to win a USD 30 gift card."
-msgstr ""
-
msgid "Environments|by %{avatar}"
msgstr ""
@@ -13223,7 +13405,7 @@ msgstr ""
msgid "Error parsing CSV file. Please make sure it has"
msgstr ""
-msgid "Error rendering markdown preview"
+msgid "Error rendering Markdown preview"
msgstr ""
msgid "Error saving label update."
@@ -13271,6 +13453,9 @@ msgstr ""
msgid "Error: %{error_message}"
msgstr ""
+msgid "Error: Couldn't load some or all of the changes."
+msgstr ""
+
msgid "Error: No AWS credentials were supplied"
msgstr ""
@@ -13304,6 +13489,9 @@ msgstr ""
msgid "ErrorTracking|Enable error tracking"
msgstr ""
+msgid "ErrorTracking|Error tracking backend"
+msgstr ""
+
msgid "ErrorTracking|If you self-host Sentry, enter your Sentry instance's full URL. If you use Sentry's hosted solution, enter https://sentry.io"
msgstr ""
@@ -13337,6 +13525,12 @@ msgstr ""
msgid "Escalation policies must have at least one rule"
msgstr ""
+msgid "EscalationPolicies|%{clockIcon} IF alert is not %{alertStatus} in %{minutes}"
+msgstr ""
+
+msgid "EscalationPolicies|%{notificationIcon} THEN %{doAction} %{forScheduleOrUser}"
+msgstr ""
+
msgid "EscalationPolicies|+ Add an additional rule"
msgstr ""
@@ -13379,13 +13573,13 @@ msgstr ""
msgid "EscalationPolicies|Escalation policies"
msgstr ""
-msgid "EscalationPolicies|Escalation rules"
+msgid "EscalationPolicies|Escalation policy %{obstacle} in Project %{project}"
msgstr ""
-msgid "EscalationPolicies|Failed to load oncall-schedules"
+msgid "EscalationPolicies|Escalation rules"
msgstr ""
-msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} %{then} THEN %{doAction} %{scheduleOrUser}"
+msgid "EscalationPolicies|Failed to load oncall-schedules"
msgstr ""
msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} minutes"
@@ -13463,18 +13657,36 @@ msgstr ""
msgid "Every %{action} attempt has failed: %{job_error_message}. Please try again."
msgstr ""
+msgid "Every 3 months"
+msgstr ""
+
+msgid "Every 3 months on the %{day} at %{time} %{timezone}"
+msgstr ""
+
+msgid "Every 6 months"
+msgstr ""
+
+msgid "Every 6 months on the %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Every day"
msgstr ""
msgid "Every day (at %{time})"
msgstr ""
+msgid "Every day at %{time} %{timezone}"
+msgstr ""
+
msgid "Every month"
msgstr ""
msgid "Every month (Day %{day} at %{time})"
msgstr ""
+msgid "Every month on the %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Every three months"
msgstr ""
@@ -13489,6 +13701,15 @@ msgstr[1] ""
msgid "Every week (%{weekday} at %{time})"
msgstr ""
+msgid "Every week on %{day} at %{time} %{timezone}"
+msgstr ""
+
+msgid "Every year"
+msgstr ""
+
+msgid "Every year on %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Everyone"
msgstr ""
@@ -13525,9 +13746,6 @@ msgstr ""
msgid "Exactly one of %{attributes} is required"
msgstr ""
-msgid "Example: %{ip_address}. %{read_more_link}."
-msgstr ""
-
msgid "Example: @sub\\.company\\.com$"
msgstr ""
@@ -13594,13 +13812,13 @@ msgstr ""
msgid "Expand pipeline"
msgstr ""
-msgid "Expand sidebar"
+msgid "Expand settings section"
msgstr ""
-msgid "Expected documents: %{expected_documents}"
+msgid "Expand sidebar"
msgstr ""
-msgid "Experienced"
+msgid "Expected documents: %{expected_documents}"
msgstr ""
msgid "ExperimentSubject|Must have exactly one of User, Namespace, or Project."
@@ -13885,9 +14103,6 @@ msgstr ""
msgid "Failed to load related branches"
msgstr ""
-msgid "Failed to load sidebar lock status"
-msgstr ""
-
msgid "Failed to load stacktrace."
msgstr ""
@@ -14312,6 +14527,9 @@ msgstr ""
msgid "Files"
msgstr ""
+msgid "Files API Rate Limits"
+msgstr ""
+
msgid "Files breadcrumb"
msgstr ""
@@ -15311,6 +15529,9 @@ msgstr ""
msgid "GitLab group: %{source_link}"
msgstr ""
+msgid "GitLab informs you if a new version is available."
+msgstr ""
+
msgid "GitLab is a complete DevOps platform, delivered as a single application, fundamentally changing the way Development, Security, and Ops teams collaborate"
msgstr ""
@@ -15326,7 +15547,7 @@ msgstr ""
msgid "GitLab is open source software to collaborate on code."
msgstr ""
-msgid "GitLab is undergoing maintenance and is operating in a read-only mode."
+msgid "GitLab is undergoing maintenance and is operating in read-only mode."
msgstr ""
msgid "GitLab member or Email address"
@@ -15338,9 +15559,6 @@ msgstr ""
msgid "GitLab project export"
msgstr ""
-msgid "GitLab restart is required to apply changes."
-msgstr ""
-
msgid "GitLab single sign-on URL"
msgstr ""
@@ -15356,9 +15574,6 @@ msgstr ""
msgid "GitLab version"
msgstr ""
-msgid "GitLab will inform you if a new version is available."
-msgstr ""
-
msgid "GitLab will run a background job that will produce pseudonymized CSVs of the GitLab database that will be uploaded to your configured object storage directory."
msgstr ""
@@ -15623,9 +15838,21 @@ msgstr ""
msgid "Go to snippets"
msgstr ""
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check 'Allowed domains for sign-ups'."
+msgstr ""
+
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check 'Email restrictions for sign-ups'."
+msgstr ""
+
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check the 'Domain denylist'."
+msgstr ""
+
msgid "Go to the activity feed"
msgstr ""
+msgid "Go to the group’s 'Settings &gt; General' page, and check 'Restrict membership by email domain'."
+msgstr ""
+
msgid "Go to the milestone list"
msgstr ""
@@ -15662,6 +15889,12 @@ msgstr ""
msgid "Goal of the changes and what reviewers should be aware of"
msgstr ""
+msgid "Google Cloud"
+msgstr ""
+
+msgid "Google Cloud offers several deployment targets. Select the one most suitable for your project."
+msgstr ""
+
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
@@ -15746,9 +15979,6 @@ msgstr ""
msgid "Group ID"
msgstr ""
-msgid "Group ID: %{group_id}"
-msgstr ""
-
msgid "Group Owner must have signed in with SAML before enabling Group Managed Accounts"
msgstr ""
@@ -15923,6 +16153,12 @@ msgstr ""
msgid "GroupImport|Unable to process group import file"
msgstr ""
+msgid "GroupPage|Copy group ID"
+msgstr ""
+
+msgid "GroupPage|Group ID: %{group_id}"
+msgstr ""
+
msgid "GroupRoadmap|%{dateWord} – No end date"
msgstr ""
@@ -15977,6 +16213,9 @@ msgstr ""
msgid "GroupRoadmap|Within 3 years"
msgstr ""
+msgid "GroupSAML|\"persistent\" recommended"
+msgstr ""
+
msgid "GroupSAML|%{strongOpen}Warning%{strongClose} - Enabling %{linkStart}SSO enforcement%{linkEnd} can reduce security risks."
msgstr ""
@@ -16109,6 +16348,9 @@ msgstr ""
msgid "GroupSAML|To be able to prohibit outer forks, you first need to enforce dedicate group managed accounts."
msgstr ""
+msgid "GroupSAML|Use SAML group links to manage group membership using SAML."
+msgstr ""
+
msgid "GroupSAML|Valid SAML Response"
msgstr ""
@@ -16121,13 +16363,10 @@ msgstr ""
msgid "GroupSAML|as %{access_level}"
msgstr ""
-msgid "GroupSAML|must match stored NameID of \"%{extern_uid}\" as we use this to identify users. If the NameID changes users will be unable to sign in."
-msgstr ""
-
-msgid "GroupSAML|should be \"persistent\""
+msgid "GroupSAML|must match stored NameID of \"%{extern_uid}\" to identify user and allow sign in"
msgstr ""
-msgid "GroupSAML|should be a random persistent ID, emails are discouraged"
+msgid "GroupSAML|recommend persistent ID instead of email"
msgstr ""
msgid "GroupSelect|No matching results"
@@ -16142,9 +16381,15 @@ msgstr ""
msgid "GroupSettings|Allow project access token creation"
msgstr ""
+msgid "GroupSettings|Applied to all subgroups unless overridden by a group owner. Groups already added to the project lose access."
+msgstr ""
+
msgid "GroupSettings|Auto DevOps pipeline was updated for the group"
msgstr ""
+msgid "GroupSettings|Available only on the top-level group. Applies to all subgroups. Groups already shared with a group outside %{group} are still shared unless removed manually."
+msgstr ""
+
msgid "GroupSettings|Badges"
msgstr ""
@@ -16196,6 +16441,9 @@ msgstr ""
msgid "GroupSettings|New runners registration token has been generated!"
msgstr ""
+msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgstr ""
+
msgid "GroupSettings|Pipeline settings was updated for the group"
msgstr ""
@@ -16208,12 +16456,15 @@ msgstr ""
msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
-msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups."
+msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups"
msgstr ""
msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
msgstr ""
+msgid "GroupSettings|Prevents group members from being notified if the group is mentioned."
+msgstr ""
+
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
msgstr ""
@@ -16250,21 +16501,6 @@ msgstr ""
msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}."
msgstr ""
-msgid "GroupSettings|This setting is only available on the top-level group and it applies to all subgroups. Groups that have already been shared with a group outside %{group} will still be shared, and this access will have to be revoked manually."
-msgstr ""
-
-msgid "GroupSettings|This setting will be applied to all subgroups unless overridden by a group owner. Groups that already have access to the project will continue to have access unless removed manually."
-msgstr ""
-
-msgid "GroupSettings|This setting will override user notification preferences for all members of the group, subgroups, and projects."
-msgstr ""
-
-msgid "GroupSettings|This setting will prevent group members from being notified if the group is mentioned."
-msgstr ""
-
-msgid "GroupSettings|This setting will prevent group members from forking projects outside of the group."
-msgstr ""
-
msgid "GroupSettings|Transfer group"
msgstr ""
@@ -16382,7 +16618,7 @@ msgstr ""
msgid "GroupsNew|No import options available"
msgstr ""
-msgid "GroupsNew|Not all related objects are migrated, as %{docs_link_start}described here%{docs_link_end}. Please %{feedback_link_start}leave feedback%{feedback_link_end} on this feature."
+msgid "GroupsNew|Not all related objects are migrated. %{docs_link_start}More info%{docs_link_end}."
msgstr ""
msgid "GroupsNew|Personal access token"
@@ -16514,15 +16750,27 @@ msgstr ""
msgid "Hello %{name},"
msgstr ""
-msgid "Hello there"
-msgstr ""
-
msgid "Hello, %{name}!"
msgstr ""
msgid "Hello, %{username}!"
msgstr ""
+msgid "HelloMessage|%{handshake_emoji} Contribute to GitLab: %{contribute_link}"
+msgstr ""
+
+msgid "HelloMessage|%{magnifier_emoji} Create a new GitLab issue: %{new_issue_link}"
+msgstr ""
+
+msgid "HelloMessage|%{rocket_emoji} We like your curiosity! Help us improve GitLab by joining the team: %{jobs_page_link}"
+msgstr ""
+
+msgid "HelloMessage|Does this page need fixes or improvements? Open an issue or contribute a merge request to help make GitLab more lovable. At GitLab, everyone can contribute!"
+msgstr ""
+
+msgid "HelloMessage|Welcome to GitLab!"
+msgstr ""
+
msgid "Help"
msgstr ""
@@ -16532,13 +16780,10 @@ msgstr ""
msgid "Helps prevent bots from creating accounts."
msgstr ""
-msgid "Helps prevent bots from creating issues"
-msgstr ""
-
-msgid "Helps prevent malicious users hide their activity"
+msgid "Helps prevent bots from creating issues."
msgstr ""
-msgid "Helps reduce request volume (e.g. from crawlers or abusive bots)"
+msgid "Helps prevent malicious users hide their activity."
msgstr ""
msgid "Helps reduce request volume (for example, from crawlers or abusive bots)"
@@ -16662,6 +16907,12 @@ msgstr ""
msgid "Housekeeping, export, path, transfer, remove, archive."
msgstr ""
+msgid "How do I configure Akismet?"
+msgstr ""
+
+msgid "How do I configure it?"
+msgstr ""
+
msgid "How do I configure runners?"
msgstr ""
@@ -16683,19 +16934,25 @@ msgstr ""
msgid "How do I set up this service?"
msgstr ""
+msgid "How do I use a web terminal?"
+msgstr ""
+
+msgid "How do I use file templates?"
+msgstr ""
+
msgid "How it works"
msgstr ""
msgid "How many days need to pass between marking entity for deletion and actual removing it."
msgstr ""
-msgid "How many seconds an IP will be counted towards the limit"
+msgid "How many seconds an IP counts toward the IP address limit."
msgstr ""
-msgid "I accept the %{terms_link}"
+msgid "How the job limiter handles jobs exceeding the thresholds specified below. The 'track' mode only logs the jobs. The 'compress' mode compresses the jobs and raises an exception if the compressed size exceeds the limit."
msgstr ""
-msgid "I accept the|Terms of Service and Privacy Policy"
+msgid "I accept the %{terms_link}"
msgstr ""
msgid "I forgot my password"
@@ -16779,13 +17036,16 @@ msgstr ""
msgid "IP Address"
msgstr ""
-msgid "IP expiration time"
+msgid "IP address expiration time"
msgstr ""
-msgid "IP subnet restriction only allowed for top-level groups"
+msgid "IP address restrictions"
+msgstr ""
+
+msgid "IP addresses per user"
msgstr ""
-msgid "IPs per user"
+msgid "IP subnet restriction only allowed for top-level groups"
msgstr ""
msgid "Identifier"
@@ -16800,6 +17060,9 @@ msgstr ""
msgid "If any indexed field exceeds this limit it will be truncated to this number of characters and the rest will not be indexed or searchable. This does not apply to repository and wiki indexing. Setting this to 0 means it is unlimited."
msgstr ""
+msgid "If blank, defaults to %{code_open}Retry later%{code_close}."
+msgstr ""
+
msgid "If blank, set allowable lifetime to %{instance_level_policy_in_words}, as defined by the instance admin. Once set, existing tokens for users in this group may be revoked."
msgstr ""
@@ -16851,6 +17114,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 did not initiate these sign-in attempts, please reach out to your administrator or enable two-factor authentication (2FA) on your account."
+msgstr ""
+
msgid "If you did not initiate this change, please contact your administrator immediately."
msgstr ""
@@ -16942,10 +17208,10 @@ msgstr ""
msgid "Import Projects from Gitea"
msgstr ""
-msgid "Import a project"
+msgid "Import an exported GitLab project"
msgstr ""
-msgid "Import an exported GitLab project"
+msgid "Import and export rate limits"
msgstr ""
msgid "Import failed due to a GitHub error: %{original}"
@@ -16957,12 +17223,18 @@ msgstr ""
msgid "Import from Jira"
msgstr ""
+msgid "Import group"
+msgstr ""
+
msgid "Import group from file"
msgstr ""
msgid "Import groups"
msgstr ""
+msgid "Import history"
+msgstr ""
+
msgid "Import in progress"
msgstr ""
@@ -17026,7 +17298,25 @@ msgstr ""
msgid "Import timed out. Import took longer than %{import_jobs_expiration} seconds"
msgstr ""
-msgid "Import/Export Rate Limits"
+msgid "ImportAProjectModal|Import from a project"
+msgstr ""
+
+msgid "ImportAProjectModal|Import members from another project"
+msgstr ""
+
+msgid "ImportAProjectModal|Import project members"
+msgstr ""
+
+msgid "ImportAProjectModal|Only project members (not group members) are imported, and they get the same permissions as the project you import from."
+msgstr ""
+
+msgid "ImportAProjectModal|Successfully imported"
+msgstr ""
+
+msgid "ImportAProjectModal|Unable to import project members"
+msgstr ""
+
+msgid "ImportAProjectModal|You're importing members to the %{strongStart}%{name}%{strongEnd} project."
msgstr ""
msgid "ImportButtons|Connect repositories from"
@@ -17079,7 +17369,7 @@ msgstr[1] ""
msgid "Importing..."
msgstr ""
-msgid "Import|A repository URL usually ends in a .git suffix, although this is not required. Double check to make sure your repository URL is correct."
+msgid "Import|There is not a valid Git repository at this URL. If your HTTP repository is not publicly accessible, verify your credentials."
msgstr ""
msgid "Improve customer support with Service Desk"
@@ -17088,9 +17378,6 @@ msgstr ""
msgid "Improves Git cloning performance."
msgstr ""
-msgid "In %{time_to_now}"
-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 ""
@@ -17376,7 +17663,7 @@ msgstr ""
msgid "InProductMarketing|Start a GitLab Ultimate trial today in less than one minute, no credit card required."
msgstr ""
-msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no CC required"
+msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no credit card required"
msgstr ""
msgid "InProductMarketing|Start a trial"
@@ -17415,7 +17702,7 @@ msgstr ""
msgid "InProductMarketing|Team up in GitLab for greater efficiency"
msgstr ""
-msgid "InProductMarketing|Team work makes the dream work"
+msgid "InProductMarketing|Team work makes the dream work"
msgstr ""
msgid "InProductMarketing|Test, create, deploy"
@@ -17996,6 +18283,9 @@ msgstr ""
msgid "Integrations|Create new issue in Jira"
msgstr ""
+msgid "Integrations|Create new issue in ZenTao"
+msgstr ""
+
msgid "Integrations|Default settings are inherited from the group level."
msgstr ""
@@ -18089,9 +18379,15 @@ msgstr ""
msgid "Integrations|Search Jira issues"
msgstr ""
+msgid "Integrations|Search ZenTao issues"
+msgstr ""
+
msgid "Integrations|Send notifications about project events to Unify Circuit."
msgstr ""
+msgid "Integrations|Send notifications about project events to a Unify Circuit conversation. %{docs_link}"
+msgstr ""
+
msgid "Integrations|Sign in to add namespaces"
msgstr ""
@@ -18131,6 +18427,9 @@ msgstr ""
msgid "Integrations|You've activated every integration 🎉"
msgstr ""
+msgid "Integrations|ZenTao issues display here when you create issues in your project in ZenTao."
+msgstr ""
+
msgid "Interactive mode"
msgstr ""
@@ -18158,9 +18457,6 @@ msgstr ""
msgid "Interval Pattern"
msgstr ""
-msgid "Introducing Value Stream Analytics"
-msgstr ""
-
msgid "Introducing Your DevOps Report"
msgstr ""
@@ -18257,6 +18553,12 @@ msgstr ""
msgid "Investigate vulnerability: %{title}"
msgstr ""
+msgid "Invisible Captcha"
+msgstr ""
+
+msgid "Invisible Captcha helps prevent the creation of spam accounts. It adds a honeypot field and time-sensitive form submission to the account signup form."
+msgstr ""
+
msgid "Invitation"
msgstr ""
@@ -18710,12 +19012,18 @@ msgstr ""
msgid "Issues"
msgstr ""
+msgid "Issues I've created"
+msgstr ""
+
msgid "Issues Rate Limits"
msgstr ""
msgid "Issues and merge requests"
msgstr ""
+msgid "Issues assigned to me"
+msgstr ""
+
msgid "Issues can be bugs, tasks or ideas to be discussed. Also, issues are searchable and filterable."
msgstr ""
@@ -18827,7 +19135,7 @@ msgstr ""
msgid "Iterations|Create cadence"
msgstr ""
-msgid "Iterations|Create your first iteration"
+msgid "Iterations|Create iteration"
msgstr ""
msgid "Iterations|Delete cadence"
@@ -18836,6 +19144,9 @@ msgstr ""
msgid "Iterations|Delete iteration cadence?"
msgstr ""
+msgid "Iterations|Delete iteration?"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -18869,12 +19180,18 @@ msgstr ""
msgid "Iterations|New iteration cadence"
msgstr ""
+msgid "Iterations|No closed iterations."
+msgstr ""
+
msgid "Iterations|No iteration cadences to show."
msgstr ""
msgid "Iterations|No iterations in cadence."
msgstr ""
+msgid "Iterations|No open iterations."
+msgstr ""
+
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
@@ -18905,6 +19222,9 @@ msgstr ""
msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
msgstr ""
+msgid "Iterations|This will remove the iteration from any issues that are assigned to it."
+msgstr ""
+
msgid "Iterations|Title"
msgstr ""
@@ -18920,15 +19240,9 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "I’m familiar with the basics of DevOps."
-msgstr ""
-
msgid "I’m joining my team who’s already on GitLab"
msgstr ""
-msgid "I’m not familiar with the basics of DevOps."
-msgstr ""
-
msgid "Jaeger URL"
msgstr ""
@@ -19193,6 +19507,9 @@ msgstr ""
msgid "Job"
msgstr ""
+msgid "Job %{jobName}"
+msgstr ""
+
msgid "Job Failed #%{build_id}"
msgstr ""
@@ -19783,9 +20100,6 @@ msgstr ""
msgid "Learn more in the"
msgstr ""
-msgid "Learn more in the|pipeline schedules documentation"
-msgstr ""
-
msgid "Learn more."
msgstr ""
@@ -19897,9 +20211,6 @@ msgstr ""
msgid "Leave Admin Mode"
msgstr ""
-msgid "Leave blank for no limit. Once set, existing personal access tokens may be revoked."
-msgstr ""
-
msgid "Leave edit mode? All unsaved changes will be lost."
msgstr ""
@@ -19945,10 +20256,10 @@ msgstr ""
msgid "LicenseCompliance|Acceptable license to be used in the project"
msgstr ""
-msgid "LicenseCompliance|Add a license"
+msgid "LicenseCompliance|Add license and related policy"
msgstr ""
-msgid "LicenseCompliance|Add license and related policy"
+msgid "LicenseCompliance|Add license policy"
msgstr ""
msgid "LicenseCompliance|Allow"
@@ -20038,6 +20349,9 @@ msgstr ""
msgid "LicenseManagement|Uncategorized"
msgstr ""
+msgid "Licensed Enterprise Edition features can be used if the project namespace's plan includes the feature, or if the project is public."
+msgstr ""
+
msgid "Licensed Features"
msgstr ""
@@ -20104,7 +20418,10 @@ msgstr ""
msgid "Limit namespaces and projects that can be indexed"
msgstr ""
-msgid "Limit sign in from multiple ips"
+msgid "Limit project size at a global, group, and project level. %{link_start}Learn more%{link_end}."
+msgstr ""
+
+msgid "Limit sign in from multiple IP addresses"
msgstr ""
msgid "Limit the number of concurrent operations this secondary site can run in the background."
@@ -20116,11 +20433,17 @@ msgstr ""
msgid "Limit the number of issues and epics per minute a user can create through web and API requests."
msgstr ""
+msgid "Limit the size of Sidekiq jobs stored in Redis."
+msgstr ""
+
msgid "Limited to showing %d event at most"
msgid_plural "Limited to showing %d events at most"
msgstr[0] ""
msgstr[1] ""
+msgid "Limiting mode"
+msgstr ""
+
msgid "Line changes"
msgstr ""
@@ -20190,9 +20513,6 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
-msgid "List of users to be excluded from the limit"
-msgstr ""
-
msgid "List options"
msgstr ""
@@ -20232,9 +20552,6 @@ msgstr ""
msgid "Loading functions timed out. Please reload the page to try again."
msgstr ""
-msgid "Loading issues"
-msgstr ""
-
msgid "Loading more"
msgstr ""
@@ -20526,6 +20843,9 @@ msgstr ""
msgid "Marked For Deletion At - %{deletion_time}"
msgstr ""
+msgid "Marked as ready. Merging is now allowed."
+msgstr ""
+
msgid "Marked this %{noun} as a draft."
msgstr ""
@@ -20598,52 +20918,22 @@ msgstr ""
msgid "Max 100,000 events"
msgstr ""
-msgid "Max 20 characters"
-msgstr ""
-
-msgid "Max Group Export Download requests per minute per user"
-msgstr ""
-
-msgid "Max Group Export requests per minute per user"
-msgstr ""
-
-msgid "Max Group Import requests per minute per user"
-msgstr ""
-
-msgid "Max Project Export Download requests per minute per user"
-msgstr ""
-
-msgid "Max Project Export requests per minute per user"
-msgstr ""
-
-msgid "Max Project Import requests per minute per user"
-msgstr ""
-
-msgid "Max authenticated API requests per period per user"
-msgstr ""
-
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
-msgid "Max authenticated web requests per period per user"
-msgstr ""
-
msgid "Max file size is 200 KB."
msgstr ""
-msgid "Max requests per minute per user"
-msgstr ""
-
msgid "Max role"
msgstr ""
msgid "Max session time"
msgstr ""
-msgid "Max unauthenticated requests per period per IP"
+msgid "MaxBuilds"
msgstr ""
-msgid "MaxBuilds"
+msgid "Maximum 20 characters"
msgstr ""
msgid "Maximum Conan package file size in bytes"
@@ -20679,6 +20969,12 @@ msgstr ""
msgid "Maximum attachment size (MB)"
msgstr ""
+msgid "Maximum authenticated API requests per rate limit period per user"
+msgstr ""
+
+msgid "Maximum authenticated web requests per rate limit period per user"
+msgstr ""
+
msgid "Maximum bulk request size (MiB)"
msgstr ""
@@ -20724,6 +21020,15 @@ msgstr ""
msgid "Maximum files in a diff"
msgstr ""
+msgid "Maximum group export download requests per minute"
+msgstr ""
+
+msgid "Maximum group export requests per minute"
+msgstr ""
+
+msgid "Maximum group import requests per minute"
+msgstr ""
+
msgid "Maximum import size"
msgstr ""
@@ -20760,7 +21065,7 @@ msgstr ""
msgid "Maximum number of projects."
msgstr ""
-msgid "Maximum number of unique IPs per user"
+msgid "Maximum number of unique IP addresses per user."
msgstr ""
msgid "Maximum page reached"
@@ -20769,12 +21074,24 @@ msgstr ""
msgid "Maximum page size"
msgstr ""
+msgid "Maximum project export download requests per minute"
+msgstr ""
+
+msgid "Maximum project export requests per minute"
+msgstr ""
+
+msgid "Maximum project import requests per minute"
+msgstr ""
+
msgid "Maximum push size"
msgstr ""
msgid "Maximum push size (MB)"
msgstr ""
+msgid "Maximum requests per minute"
+msgstr ""
+
msgid "Maximum running slices"
msgstr ""
@@ -20802,10 +21119,16 @@ msgstr ""
msgid "Maximum time between updates that a mirror can have when scheduled to synchronize."
msgstr ""
-msgid "Maximum time for web terminal websocket connection (in seconds). 0 for unlimited."
+msgid "Maximum time that users are allowed to skip the setup of two-factor authentication (in hours). Set to 0 (zero) to enforce at next sign in."
msgstr ""
-msgid "Maximum time that users are allowed to skip the setup of two-factor authentication (in hours). Set to 0 (zero) to enforce at next sign in."
+msgid "Maximum time, in seconds, for a web terminal websocket connection. 0 for unlimited."
+msgstr ""
+
+msgid "Maximum unauthenticated API requests per rate limit period per IP"
+msgstr ""
+
+msgid "Maximum unauthenticated web requests per rate limit period per IP"
msgstr ""
msgid "May"
@@ -20823,9 +21146,6 @@ msgstr ""
msgid "Medium vulnerabilities present"
msgstr ""
-msgid "Member lock"
-msgstr ""
-
msgid "Member since"
msgstr ""
@@ -20862,6 +21182,9 @@ msgstr ""
msgid "Members of a group may only view projects they have permission to access"
msgstr ""
+msgid "Membership"
+msgstr ""
+
msgid "Members|%{time} by %{user}"
msgstr ""
@@ -20922,9 +21245,6 @@ msgstr ""
msgid "Members|Expiration date updated successfully."
msgstr ""
-msgid "Members|Expired"
-msgstr ""
-
msgid "Members|Filter members"
msgstr ""
@@ -20940,9 +21260,6 @@ msgstr ""
msgid "Members|Membership"
msgstr ""
-msgid "Members|No expiration set"
-msgstr ""
-
msgid "Members|Remove \"%{groupName}\""
msgstr ""
@@ -20964,9 +21281,6 @@ msgstr ""
msgid "Members|Search invited"
msgstr ""
-msgid "Members|in %{time}"
-msgstr ""
-
msgid "Member|Deny access"
msgstr ""
@@ -21042,9 +21356,6 @@ msgstr ""
msgid "Merge request %{mr_link} was reviewed by %{mr_author}"
msgstr ""
-msgid "Merge request (MR) approvals"
-msgstr ""
-
msgid "Merge request analytics"
msgstr ""
@@ -21066,12 +21377,21 @@ msgstr ""
msgid "Merge requests"
msgstr ""
+msgid "Merge requests I've created"
+msgstr ""
+
msgid "Merge requests are a place to propose changes you've made to a project and discuss those changes with others"
msgstr ""
msgid "Merge requests are read-only in a secondary Geo node"
msgstr ""
+msgid "Merge requests assigned to me"
+msgstr ""
+
+msgid "Merge requests that I'm a reviewer"
+msgstr ""
+
msgid "Merge the branch and fix any conflicts that come up"
msgstr ""
@@ -21132,10 +21452,10 @@ msgstr ""
msgid "MergeRequests|An error occurred while saving the draft comment."
msgstr ""
-msgid "MergeRequests|Failed to squash. Should be done manually."
+msgid "MergeRequests|Create issue to resolve thread"
msgstr ""
-msgid "MergeRequests|Resolve this thread in a new issue"
+msgid "MergeRequests|Failed to squash. Should be done manually."
msgstr ""
msgid "MergeRequests|Saving the comment failed"
@@ -21949,6 +22269,9 @@ msgstr ""
msgid "MoveIssue|Cannot move issue to project it originates from!"
msgstr ""
+msgid "MoveIssue|Cannot move issues of '%{issue_type}' type."
+msgstr ""
+
msgid "Moved issue to %{label} column in the board."
msgstr ""
@@ -22074,6 +22397,15 @@ 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. To learn more about reducing storage capacity please visit our docs."
msgstr ""
+msgid "NamespaceUserCap|Pending users must be reviewed and approved by a group owner. Learn more about %{user_caps_link_start}User Caps%{link_end} and %{users_pending_approval_link_start}Users Pending Approval%{link_end}."
+msgstr ""
+
+msgid "NamespaceUserCap|View pending user approvals"
+msgstr ""
+
+msgid "NamespaceUserCap|Your group has reached its billable member limit"
+msgstr ""
+
msgid "Namespaces"
msgstr ""
@@ -22116,9 +22448,6 @@ msgstr ""
msgid "Network"
msgstr ""
-msgid "Network Policy|New rule"
-msgstr ""
-
msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is inbound from a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
msgstr ""
@@ -22140,16 +22469,13 @@ msgstr ""
msgid "NetworkPolicies|%{strongOpen}any%{strongClose} port"
msgstr ""
-msgid "NetworkPolicies|+ Add alert"
-msgstr ""
-
msgid "NetworkPolicies|.yaml"
msgstr ""
msgid "NetworkPolicies|.yaml mode"
msgstr ""
-msgid "NetworkPolicies|Actions"
+msgid "NetworkPolicies|Add alert"
msgstr ""
msgid "NetworkPolicies|Alerts are intended to be selectively used for a limited number of events that are potentially concerning and warrant a manual review. Alerts should not be used as a substitute for a SIEM or a logging tool. High volume alerts are likely to be dropped so as to preserve the stability of GitLab's integration with Kubernetes."
@@ -22185,9 +22511,6 @@ msgstr ""
msgid "NetworkPolicies|Deny all traffic"
msgstr ""
-msgid "NetworkPolicies|Description"
-msgstr ""
-
msgid "NetworkPolicies|Edit policy"
msgstr ""
@@ -22200,9 +22523,6 @@ msgstr ""
msgid "NetworkPolicies|IP/subnet"
msgstr ""
-msgid "NetworkPolicies|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
-msgstr ""
-
msgid "NetworkPolicies|Invalid or empty policy"
msgstr ""
@@ -22212,19 +22532,16 @@ msgstr ""
msgid "NetworkPolicies|Kubernetes error: %{error}"
msgstr ""
-msgid "NetworkPolicies|Name"
-msgstr ""
-
msgid "NetworkPolicies|Network"
msgstr ""
-msgid "NetworkPolicies|Network traffic"
+msgid "NetworkPolicies|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
msgstr ""
-msgid "NetworkPolicies|New policy"
+msgid "NetworkPolicies|Network policy can be created after the environment is loaded successfully."
msgstr ""
-msgid "NetworkPolicies|No policies detected"
+msgid "NetworkPolicies|Network traffic"
msgstr ""
msgid "NetworkPolicies|None selected"
@@ -22233,21 +22550,12 @@ msgstr ""
msgid "NetworkPolicies|Please %{installLinkStart}install%{installLinkEnd} and %{configureLinkStart}configure a Kubernetes Agent for this project%{configureLinkEnd} to enable alerts."
msgstr ""
-msgid "NetworkPolicies|Policies are a specification of how groups of pods are allowed to communicate with each other's network endpoints."
-msgstr ""
-
msgid "NetworkPolicies|Policy %{policyName} was successfully changed"
msgstr ""
msgid "NetworkPolicies|Policy definition"
msgstr ""
-msgid "NetworkPolicies|Policy editor"
-msgstr ""
-
-msgid "NetworkPolicies|Policy preview"
-msgstr ""
-
msgid "NetworkPolicies|Rule"
msgstr ""
@@ -22257,9 +22565,6 @@ msgstr ""
msgid "NetworkPolicies|Rule mode is unavailable for this policy. In some cases, we cannot parse the YAML file back into the rules editor."
msgstr ""
-msgid "NetworkPolicies|Rules"
-msgstr ""
-
msgid "NetworkPolicies|Save changes"
msgstr ""
@@ -22272,9 +22577,6 @@ msgstr ""
msgid "NetworkPolicies|Traffic that does not match any rule will be blocked."
msgstr ""
-msgid "NetworkPolicies|Unable to parse policy"
-msgstr ""
-
msgid "NetworkPolicies|all DNS names"
msgstr ""
@@ -22454,6 +22756,9 @@ msgstr ""
msgid "New issue"
msgstr ""
+msgid "New issue in %{project}"
+msgstr ""
+
msgid "New issue title"
msgstr ""
@@ -22532,7 +22837,7 @@ msgstr ""
msgid "Newest first"
msgstr ""
-msgid "Newly registered users will by default be external"
+msgid "Newly-registered users are external by default"
msgstr ""
msgid "Next"
@@ -22847,8 +23152,10 @@ msgstr ""
msgid "No webhooks found, add one in the form above."
msgstr ""
-msgid "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} to renew your subscription."
-msgstr ""
+msgid "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} day to renew your subscription."
+msgid_plural "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} days to renew your subscription."
+msgstr[0] ""
+msgstr[1] ""
msgid "No. of commits"
msgstr ""
@@ -22865,7 +23172,7 @@ msgstr ""
msgid "Nodes"
msgstr ""
-msgid "Non-admin users can sign in with read-only access and make read-only API requests."
+msgid "Non-admin users are restricted to read-only access, in both GitLab UI and API."
msgstr ""
msgid "None"
@@ -22946,7 +23253,7 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
-msgid "Notes Rate Limits"
+msgid "Notes rate limit"
msgstr ""
msgid "Notes|Are you sure you want to cancel creating this comment?"
@@ -23113,9 +23420,6 @@ msgstr ""
msgid "November"
msgstr ""
-msgid "Novice"
-msgstr ""
-
msgid "Now, personalize your GitLab experience"
msgstr ""
@@ -23284,7 +23588,7 @@ msgstr ""
msgid "OnCallSchedules|For this rotation, on-call will be:"
msgstr ""
-msgid "OnCallSchedules|On-call schedule %{schedule} in Project %{project}"
+msgid "OnCallSchedules|On-call schedule %{obstacle} in Project %{project}"
msgstr ""
msgid "OnCallSchedules|On-call schedules"
@@ -23431,22 +23735,22 @@ msgstr ""
msgid "OnDemandScans|Scanner profile"
msgstr ""
-msgid "OnDemandScans|Select one of the existing profiles"
+msgid "OnDemandScans|Schedule scan"
msgstr ""
-msgid "OnDemandScans|Site profile"
+msgid "OnDemandScans|Select one of the existing profiles"
msgstr ""
-msgid "OnDemandScans|Use existing scanner profile"
+msgid "OnDemandScans|Site profile"
msgstr ""
-msgid "OnDemandScans|Use existing site profile"
+msgid "OnDemandScans|Start time"
msgstr ""
-msgid "OnDemandScans|You can either choose a passive scan or validate the target site in your chosen site profile. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
+msgid "OnDemandScans|Use existing scanner profile"
msgstr ""
-msgid "OnDemandScans|You cannot run an active scan against an unvalidated site."
+msgid "OnDemandScans|Use existing site profile"
msgstr ""
msgid "OnDemandScans|You must create a repository within your project to run an on-demand scan."
@@ -23511,6 +23815,9 @@ msgstr ""
msgid "Only admins can delete project"
msgstr ""
+msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
+msgstr ""
+
msgid "Only include features new to your current subscription tier."
msgstr ""
@@ -23529,6 +23836,12 @@ msgstr ""
msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
+msgid "Only reCAPTCHA v2 is supported:"
+msgstr ""
+
+msgid "Only users from the specified IP address ranges are able to reach this group, including all subgroups, projects, and Git repositories."
+msgstr ""
+
msgid "Only verified users with an email address in any of these domains can be added to the group."
msgstr ""
@@ -23715,9 +24028,6 @@ msgstr ""
msgid "Package Registry"
msgstr ""
-msgid "Package Registry Rate Limits"
-msgstr ""
-
msgid "Package Registry: authenticated API requests"
msgstr ""
@@ -23736,6 +24046,9 @@ msgstr ""
msgid "Package recipe already exists"
msgstr ""
+msgid "Package registry rate limits"
+msgstr ""
+
msgid "Package type"
msgstr ""
@@ -23802,6 +24115,9 @@ msgstr ""
msgid "PackageRegistry|Composer"
msgstr ""
+msgid "PackageRegistry|Composer.json with license: %{license} and version: %{version}"
+msgstr ""
+
msgid "PackageRegistry|Conan"
msgstr ""
@@ -23865,6 +24181,9 @@ msgstr ""
msgid "PackageRegistry|Copy require package include"
msgstr ""
+msgid "PackageRegistry|Copy target SHA"
+msgstr ""
+
msgid "PackageRegistry|Copy yarn command"
msgstr ""
@@ -23931,6 +24250,9 @@ msgstr ""
msgid "PackageRegistry|Install package version"
msgstr ""
+msgid "PackageRegistry|Instance-level"
+msgstr ""
+
msgid "PackageRegistry|Invalid Package: failed metadata extraction"
msgstr ""
@@ -23976,6 +24298,9 @@ msgstr ""
msgid "PackageRegistry|Pip Command"
msgstr ""
+msgid "PackageRegistry|Project-level"
+msgstr ""
+
msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
msgstr ""
@@ -23997,6 +24322,9 @@ msgstr ""
msgid "PackageRegistry|Remove package"
msgstr ""
+msgid "PackageRegistry|Required Python: %{pythonVersion}"
+msgstr ""
+
msgid "PackageRegistry|RubyGems"
msgstr ""
@@ -24039,6 +24367,9 @@ msgstr ""
msgid "PackageRegistry|Source project located at %{link}"
msgstr ""
+msgid "PackageRegistry|Target SHA: %{sha}"
+msgstr ""
+
msgid "PackageRegistry|There are no other versions of this package."
msgstr ""
@@ -24207,6 +24538,18 @@ msgstr ""
msgid "Password was successfully updated. Please sign in again."
msgstr ""
+msgid "PasswordPrompt|Confirm password"
+msgstr ""
+
+msgid "PasswordPrompt|Confirm password to continue"
+msgstr ""
+
+msgid "PasswordPrompt|Password is required"
+msgstr ""
+
+msgid "PasswordPrompt|Please enter your password to confirm"
+msgstr ""
+
msgid "Passwords should be unique and not used for any other sites or services."
msgstr ""
@@ -24234,6 +24577,9 @@ msgstr ""
msgid "Paste project path (i.e. gitlab-org/gitlab)"
msgstr ""
+msgid "Paste this DSN into your Sentry SDK"
+msgstr ""
+
msgid "Paste your public SSH key, which is usually contained in the file '~/.ssh/id_ed25519.pub' or '~/.ssh/id_rsa.pub' and begins with 'ssh-ed25519' or 'ssh-rsa'. Do not paste your private SSH key, as that can compromise your identity."
msgstr ""
@@ -24318,6 +24664,9 @@ msgstr ""
msgid "PerformanceBar|First Contentful Paint"
msgstr ""
+msgid "PerformanceBar|Flamegraph with mode:"
+msgstr ""
+
msgid "PerformanceBar|Frontend resources"
msgstr ""
@@ -24351,6 +24700,15 @@ msgstr ""
msgid "PerformanceBar|Trace"
msgstr ""
+msgid "PerformanceBar|cpu"
+msgstr ""
+
+msgid "PerformanceBar|object"
+msgstr ""
+
+msgid "PerformanceBar|wall"
+msgstr ""
+
msgid "Period in seconds"
msgstr ""
@@ -24579,6 +24937,48 @@ msgstr ""
msgid "PipelineSchedules|Variables"
msgstr ""
+msgid "PipelineSource|API"
+msgstr ""
+
+msgid "PipelineSource|Chat"
+msgstr ""
+
+msgid "PipelineSource|External"
+msgstr ""
+
+msgid "PipelineSource|External Pull Request"
+msgstr ""
+
+msgid "PipelineSource|Merge Request"
+msgstr ""
+
+msgid "PipelineSource|On-Demand DAST Scan"
+msgstr ""
+
+msgid "PipelineSource|On-Demand DAST Validation"
+msgstr ""
+
+msgid "PipelineSource|Parent Pipeline"
+msgstr ""
+
+msgid "PipelineSource|Pipeline"
+msgstr ""
+
+msgid "PipelineSource|Push"
+msgstr ""
+
+msgid "PipelineSource|Schedule"
+msgstr ""
+
+msgid "PipelineSource|Trigger"
+msgstr ""
+
+msgid "PipelineSource|Web"
+msgstr ""
+
+msgid "PipelineSource|Web IDE"
+msgstr ""
+
msgid "PipelineStatusTooltip|Pipeline: %{ciStatus}"
msgstr ""
@@ -24879,46 +25279,7 @@ msgstr ""
msgid "Pipeline|Source"
msgstr ""
-msgid "Pipeline|Source|API"
-msgstr ""
-
-msgid "Pipeline|Source|Chat"
-msgstr ""
-
-msgid "Pipeline|Source|External"
-msgstr ""
-
-msgid "Pipeline|Source|External Pull Request"
-msgstr ""
-
-msgid "Pipeline|Source|Merge Request"
-msgstr ""
-
-msgid "Pipeline|Source|On-Demand DAST Scan"
-msgstr ""
-
-msgid "Pipeline|Source|On-Demand DAST Validation"
-msgstr ""
-
-msgid "Pipeline|Source|Parent Pipeline"
-msgstr ""
-
-msgid "Pipeline|Source|Pipeline"
-msgstr ""
-
-msgid "Pipeline|Source|Push"
-msgstr ""
-
-msgid "Pipeline|Source|Schedule"
-msgstr ""
-
-msgid "Pipeline|Source|Trigger"
-msgstr ""
-
-msgid "Pipeline|Source|Web"
-msgstr ""
-
-msgid "Pipeline|Source|Web IDE"
+msgid "Pipeline|Source|Security Policy"
msgstr ""
msgid "Pipeline|Specify variable values to be used in this run. The values specified in %{linkStart}CI/CD settings%{linkEnd} will be used by default."
@@ -24969,7 +25330,7 @@ msgstr ""
msgid "Pipeline|We are currently unable to fetch pipeline data"
msgstr ""
-msgid "Pipeline|You’re about to stop pipeline %{pipelineId}."
+msgid "Pipeline|You’re about to stop pipeline #%{pipelineId}."
msgstr ""
msgid "Pipeline|for"
@@ -24996,6 +25357,9 @@ msgstr ""
msgid "Plain diff"
msgstr ""
+msgid "Plain-text response to send to clients that hit a rate limit"
+msgstr ""
+
msgid "Plan:"
msgstr ""
@@ -25140,9 +25504,6 @@ msgstr ""
msgid "Please provide attributes to update"
msgstr ""
-msgid "Please provide your username or email address."
-msgstr ""
-
msgid "Please reach out if you have any questions and we'll be happy to assist."
msgstr ""
@@ -25185,9 +25546,6 @@ msgstr ""
msgid "Please set a new password before proceeding."
msgstr ""
-msgid "Please share your feedback about %{featureName} %{linkStart}in this issue%{linkEnd} to help us improve the experience."
-msgstr ""
-
msgid "Please solve the captcha"
msgstr ""
@@ -25365,6 +25723,9 @@ msgstr ""
msgid "Prevent adding new members to project membership within this group"
msgstr ""
+msgid "Prevent auto-stopping"
+msgstr ""
+
msgid "Prevent editing approval rules in projects and merge requests."
msgstr ""
@@ -25377,7 +25738,7 @@ msgstr ""
msgid "Prevent users from changing their profile name"
msgstr ""
-msgid "Prevent users from performing write operations on GitLab while performing maintenance."
+msgid "Prevent users from performing write operations while GitLab maintenance is in progress."
msgstr ""
msgid "Preview"
@@ -25650,6 +26011,9 @@ msgstr ""
msgid "Profiles|Enter your name, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Enter your password to confirm the email change"
+msgstr ""
+
msgid "Profiles|Enter your pronouns to let people know how to refer to you"
msgstr ""
@@ -25884,10 +26248,10 @@ msgstr ""
msgid "Profiles|e.g. My MacBook key"
msgstr ""
-msgid "Profiles|username"
+msgid "Profiles|https://website.com"
msgstr ""
-msgid "Profiles|website.com"
+msgid "Profiles|username"
msgstr ""
msgid "Profiles|your account"
@@ -26130,9 +26494,21 @@ msgstr ""
msgid "ProjectSelect| or group"
msgstr ""
+msgid "ProjectSelect|No matching results"
+msgstr ""
+
msgid "ProjectSelect|Search for project"
msgstr ""
+msgid "ProjectSelect|Search projects"
+msgstr ""
+
+msgid "ProjectSelect|Select a project"
+msgstr ""
+
+msgid "ProjectSelect|There was an error fetching the projects. Please try again."
+msgstr ""
+
msgid "ProjectService|Drone server URL"
msgstr ""
@@ -26220,6 +26596,9 @@ msgstr ""
msgid "ProjectService|Trigger event when a new, unique alert is recorded."
msgstr ""
+msgid "ProjectService|Trigger event when a new, unique vulnerability is recorded. (Note: This feature requires an Ultimate plan.)"
+msgstr ""
+
msgid "ProjectService|Trigger event when a pipeline status changes."
msgstr ""
@@ -26634,9 +27013,15 @@ msgstr ""
msgid "Projects are graded based on the highest severity vulnerability present"
msgstr ""
+msgid "Projects are organized into groups"
+msgstr ""
+
msgid "Projects contributed to"
msgstr ""
+msgid "Projects help you organize your work. They contain your file repository, issues, merge requests, and so much more."
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr ""
@@ -26871,10 +27256,10 @@ msgstr ""
msgid "PrometheusService|Prometheus cluster integration"
msgstr ""
-msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
+msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
msgstr ""
-msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
+msgid "PrometheusService|The ID of the IAP-secured resource."
msgstr ""
msgid "PrometheusService|The Prometheus API base URL."
@@ -27492,6 +27877,9 @@ msgstr ""
msgid "Rate limit"
msgstr ""
+msgid "Rate limits can help reduce request volume (like from crawlers or abusive bots)."
+msgstr ""
+
msgid "Raw blob request rate limit per minute"
msgstr ""
@@ -27504,6 +27892,9 @@ msgstr ""
msgid "Re-authentication required"
msgstr ""
+msgid "Re-import"
+msgstr ""
+
msgid "Re-request review"
msgstr ""
@@ -27525,6 +27916,9 @@ msgstr ""
msgid "Read more about related issues"
msgstr ""
+msgid "Read their documentation."
+msgstr ""
+
msgid "Ready to get started with GitLab? Follow these steps to set up your workspace, plan and commit changes, and deploy your project."
msgstr ""
@@ -27558,6 +27952,9 @@ msgstr ""
msgid "Receive any notifications from GitLab."
msgstr ""
+msgid "Receive notification of abuse reports by email."
+msgstr ""
+
msgid "Receive notifications about your own activity"
msgstr ""
@@ -27701,9 +28098,6 @@ msgstr ""
msgid "Registry setup"
msgstr ""
-msgid "Regulate approvals by authors/committers. Affects all projects."
-msgstr ""
-
msgid "Reindexing Status: %{status} (Slice multiplier: %{multiplier}, Maximum running slices: %{max_slices})"
msgstr ""
@@ -27799,6 +28193,9 @@ msgstr ""
msgid "Release|Something went wrong while saving the release details."
msgstr ""
+msgid "Reload page"
+msgstr ""
+
msgid "Remediations"
msgstr ""
@@ -28081,6 +28478,9 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
+msgid "Repeats"
+msgstr ""
+
msgid "Replace"
msgstr ""
@@ -28443,10 +28843,7 @@ msgstr ""
msgid "Require additional authentication for administrative tasks."
msgstr ""
-msgid "Require all users in this group to setup Two-factor authentication"
-msgstr ""
-
-msgid "Require all users in this group to setup two-factor authentication"
+msgid "Require all users in this group to set up two-factor authentication"
msgstr ""
msgid "Required approvals (%{approvals_given} given)"
@@ -28492,6 +28889,9 @@ msgstr[1] ""
msgid "Requires values to meet regular expression requirements."
msgstr ""
+msgid "Requires you to deploy or set up cloud-hosted Sentry."
+msgstr ""
+
msgid "Requires your primary GitLab email address."
msgstr ""
@@ -28552,9 +28952,6 @@ msgstr ""
msgid "Resolve"
msgstr ""
-msgid "Resolve all threads in new issue"
-msgstr ""
-
msgid "Resolve conflicts"
msgstr ""
@@ -28612,6 +29009,9 @@ msgstr ""
msgid "Response text"
msgstr ""
+msgid "Restart GitLab to apply changes."
+msgstr ""
+
msgid "Restart Terminal"
msgstr ""
@@ -28630,6 +29030,9 @@ msgstr ""
msgid "Restoring the project will prevent the project from being removed on this date and restore people's ability to make changes to it."
msgstr ""
+msgid "Restrict group access by IP address. %{link_start}Learn more%{link_end}."
+msgstr ""
+
msgid "Restrict membership by email domain"
msgstr ""
@@ -28943,6 +29346,9 @@ msgstr ""
msgid "Runners|Runner #%{runner_id}"
msgstr ""
+msgid "Runners|Runner assigned to project."
+msgstr ""
+
msgid "Runners|Runner is offline, last contact was %{runner_contact} ago"
msgstr ""
@@ -28955,6 +29361,9 @@ msgstr ""
msgid "Runners|Runner registration"
msgstr ""
+msgid "Runners|Runner unassigned from project."
+msgstr ""
+
msgid "Runners|Runners"
msgstr ""
@@ -29147,7 +29556,7 @@ msgstr ""
msgid "SastEntryPoints|How do I set up SAST?"
msgstr ""
-msgid "SastEntryPoints|Learn more."
+msgid "SastEntryPoints|Learn more"
msgstr ""
msgid "Satisfied"
@@ -29189,7 +29598,7 @@ msgstr ""
msgid "Save pipeline schedule"
msgstr ""
-msgid "Save space and find images in the container Registry. remove unneeded tags and keep only the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
+msgid "Save storage space by automatically deleting tags from the container registry and keeping the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
msgstr ""
msgid "Saving"
@@ -29363,6 +29772,9 @@ msgstr ""
msgid "Search or filter results…"
msgstr ""
+msgid "Search or jump to..."
+msgstr ""
+
msgid "Search project"
msgstr ""
@@ -29423,16 +29835,16 @@ msgstr ""
msgid "SearchCodeResults|of %{link_to_project}"
msgstr ""
-msgid "SearchResults|Showing %{count} %{scope} for%{term_element}"
+msgid "SearchResults|Showing %{count} %{scope} for %{term_element}"
msgstr ""
-msgid "SearchResults|Showing %{count} %{scope} for%{term_element} in your personal and project snippets"
+msgid "SearchResults|Showing %{count} %{scope} for %{term_element} in your personal and project snippets"
msgstr ""
-msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for%{term_element}"
+msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for %{term_element}"
msgstr ""
-msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for%{term_element} in your personal and project snippets"
+msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for %{term_element} in your personal and project snippets"
msgstr ""
msgid "SearchResults|code result"
@@ -29514,6 +29926,9 @@ msgstr ""
msgid "Secret Detection"
msgstr ""
+msgid "Secret access key"
+msgstr ""
+
msgid "Secret token"
msgstr ""
@@ -29553,9 +29968,6 @@ msgstr ""
msgid "SecurityApprovals|A merge request approval is required when the license compliance report contains a denied license."
msgstr ""
-msgid "SecurityApprovals|Configurable if security scanners are enabled. %{linkStart}Learn more.%{linkEnd}"
-msgstr ""
-
msgid "SecurityApprovals|Coverage-Check"
msgstr ""
@@ -29568,24 +29980,18 @@ msgstr ""
msgid "SecurityApprovals|Learn more about Vulnerability-Check"
msgstr ""
-msgid "SecurityApprovals|License Scanning must be enabled. %{linkStart}Learn more%{linkEnd}."
-msgstr ""
-
msgid "SecurityApprovals|License-Check"
msgstr ""
msgid "SecurityApprovals|Requires approval for Denied licenses. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}More information%{linkEnd}"
+msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "SecurityApprovals|Requires approval for vulnerabilities. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
-msgid "SecurityApprovals|Test coverage must be enabled. %{linkStart}Learn more%{linkEnd}."
-msgstr ""
-
msgid "SecurityApprovals|Vulnerability-Check"
msgstr ""
@@ -29649,6 +30055,12 @@ msgstr ""
msgid "SecurityConfiguration|Immediately begin risk analysis and remediation with application security features. Start with SAST and Secret Detection, available to all plans. Upgrade to Ultimate to get all features, including:"
msgstr ""
+msgid "SecurityConfiguration|Manage corpus"
+msgstr ""
+
+msgid "SecurityConfiguration|Manage corpus files used as mutation sources in coverage fuzzing."
+msgstr ""
+
msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
msgstr ""
@@ -29703,6 +30115,12 @@ msgstr ""
msgid "SecurityOrchestration|Action"
msgstr ""
+msgid "SecurityOrchestration|Actions"
+msgstr ""
+
+msgid "SecurityOrchestration|Add rule"
+msgstr ""
+
msgid "SecurityOrchestration|All policies"
msgstr ""
@@ -29736,9 +30154,6 @@ msgstr ""
msgid "SecurityOrchestration|Network"
msgstr ""
-msgid "SecurityOrchestration|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
-msgstr ""
-
msgid "SecurityOrchestration|New policy"
msgstr ""
@@ -29754,6 +30169,9 @@ msgstr ""
msgid "SecurityOrchestration|Policy editor"
msgstr ""
+msgid "SecurityOrchestration|Policy preview"
+msgstr ""
+
msgid "SecurityOrchestration|Policy status"
msgstr ""
@@ -29763,6 +30181,9 @@ msgstr ""
msgid "SecurityOrchestration|Rule"
msgstr ""
+msgid "SecurityOrchestration|Rules"
+msgstr ""
+
msgid "SecurityOrchestration|Scan Execution"
msgstr ""
@@ -29856,6 +30277,9 @@ msgstr ""
msgid "SecurityReports|Create issue"
msgstr ""
+msgid "SecurityReports|Development vulnerabilities"
+msgstr ""
+
msgid "SecurityReports|Dismiss vulnerability"
msgstr ""
@@ -29871,6 +30295,9 @@ msgstr ""
msgid "SecurityReports|Download results"
msgstr ""
+msgid "SecurityReports|Download scanned URLs"
+msgstr ""
+
msgid "SecurityReports|Download scanned resources"
msgstr ""
@@ -29994,6 +30421,9 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
+msgid "SecurityReports|The Vulnerability Report shows the results of the lastest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "SecurityReports|The security reports below contain one or more vulnerability findings that could not be parsed and were not recorded. Download the artifacts in the job output to investigate. Ensure any security report created conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
msgstr ""
@@ -30135,10 +30565,10 @@ msgstr ""
msgid "Select a repository"
msgstr ""
-msgid "Select a role"
+msgid "Select a repository containing templates for common files."
msgstr ""
-msgid "Select a shared template repository for all projects on this instance."
+msgid "Select a role"
msgstr ""
msgid "Select a template repository"
@@ -30216,6 +30646,9 @@ msgstr ""
msgid "Select project to choose zone"
msgstr ""
+msgid "Select project to create issue"
+msgstr ""
+
msgid "Select projects"
msgstr ""
@@ -30333,6 +30766,9 @@ msgstr ""
msgid "Send emails to help guide new users through the onboarding process."
msgstr ""
+msgid "Send emails to users upon account deactivation."
+msgstr ""
+
msgid "Send message"
msgstr ""
@@ -30351,6 +30787,9 @@ msgstr ""
msgid "Send service data"
msgstr ""
+msgid "Sentry"
+msgstr ""
+
msgid "Sentry API URL"
msgstr ""
@@ -30465,6 +30904,9 @@ msgstr ""
msgid "Service"
msgstr ""
+msgid "Service Accounts keys are required to authorize GitLab to deploy your Google Cloud project."
+msgstr ""
+
msgid "Service Desk"
msgstr ""
@@ -30537,15 +30979,15 @@ msgstr ""
msgid "Set a password on your account to pull or push via %{protocol}."
msgstr ""
-msgid "Set a template repository for projects in this group"
-msgstr ""
-
msgid "Set access permissions for this token."
msgstr ""
msgid "Set an instance-wide domain that will be available to all clusters when installing Knative."
msgstr ""
+msgid "Set any rate limit to %{code_open}0%{code_close} to disable the limit."
+msgstr ""
+
msgid "Set default and restrict visibility levels. Configure import sources and git access protocol."
msgstr ""
@@ -30558,7 +31000,7 @@ msgstr ""
msgid "Set limit to 0 to allow any file size."
msgstr ""
-msgid "Set max session time for web terminal."
+msgid "Set limits for web and API requests."
msgstr ""
msgid "Set milestone"
@@ -30567,15 +31009,18 @@ msgstr ""
msgid "Set new password"
msgstr ""
-msgid "Set notification email for abuse reports."
+msgid "Set parent epic to an epic"
msgstr ""
-msgid "Set parent epic to an epic"
+msgid "Set per-user rate limits for imports and exports of projects and groups."
msgstr ""
msgid "Set projects and maximum size limits, session duration, user options, and check feature availability for namespace plan."
msgstr ""
+msgid "Set rate limits for package registry API requests that supersede the general user and IP rate limits."
+msgstr ""
+
msgid "Set severity"
msgstr ""
@@ -30594,15 +31039,24 @@ msgstr ""
msgid "Set the default branch for this project. All merge requests and commits are made against this branch unless you specify a different one."
msgstr ""
+msgid "Set the default expiration time for job artifacts in all projects. Set to %{code_open}0%{code_close} to never expire artifacts by default. If no unit is written, it defaults to seconds. For example, these are all equivalent: %{code_open}3600%{code_close}, %{code_open}60 minutes%{code_close}, or %{code_open}one hour%{code_close}."
+msgstr ""
+
msgid "Set the due date to %{due_date}."
msgstr ""
msgid "Set the iteration to %{iteration_reference}."
msgstr ""
+msgid "Set the maximum session time for a web terminal."
+msgstr ""
+
msgid "Set the milestone to %{milestone_reference}."
msgstr ""
+msgid "Set the per-user rate limit for notes created by web or API requests."
+msgstr ""
+
msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
msgstr ""
@@ -30804,6 +31258,9 @@ msgstr ""
msgid "Show Pipeline IID"
msgstr ""
+msgid "Show all %{issuable_type}."
+msgstr ""
+
msgid "Show all activity"
msgstr ""
@@ -30855,15 +31312,9 @@ msgstr ""
msgid "Show list"
msgstr ""
-msgid "Show me advanced features"
-msgstr ""
-
msgid "Show me how to add a pipeline"
msgstr ""
-msgid "Show me the basics"
-msgstr ""
-
msgid "Show one file at a time"
msgstr ""
@@ -30904,15 +31355,15 @@ msgstr ""
msgid "Showing %{pageSize} of %{total} %{issuableType}"
msgstr ""
-msgid "Showing %{pageSize} of %{total} issues"
-msgstr ""
-
msgid "Showing all epics"
msgstr ""
msgid "Showing all issues"
msgstr ""
+msgid "Showing data for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
+msgstr ""
+
msgid "Showing data for workflow items created in this date range. Date range cannot exceed %{maxDateRange} days."
msgstr ""
@@ -30952,6 +31403,15 @@ msgstr ""
msgid "Sidebar|Weight"
msgstr ""
+msgid "Sidekiq job compression threshold (bytes)"
+msgstr ""
+
+msgid "Sidekiq job size limit (bytes)"
+msgstr ""
+
+msgid "Sidekiq job size limits"
+msgstr ""
+
msgid "Sign in"
msgstr ""
@@ -31072,6 +31532,9 @@ msgstr ""
msgid "Site profile not found for given parameters"
msgstr ""
+msgid "Sites"
+msgstr ""
+
msgid "Size"
msgstr ""
@@ -31102,19 +31565,22 @@ msgstr ""
msgid "SlackIntegration|Sends notifications about project events to Slack channels."
msgstr ""
-msgid "SlackService|2. Paste the %{strong_open}Token%{strong_close} into the field below"
+msgid "SlackService|1. %{slash_command_link_start}Add a slash command%{slash_command_link_end} in your Slack team using this information:"
msgstr ""
-msgid "SlackService|3. Select the %{strong_open}Active%{strong_close} checkbox, press %{strong_open}Save changes%{strong_close} and start using GitLab inside Slack!"
+msgid "SlackService|2. Paste the token from Slack in the %{strong_open}Token%{strong_close} field below."
msgstr ""
-msgid "SlackService|Fill in the word that works best for your team."
+msgid "SlackService|3. Select the %{strong_open}Active%{strong_close} checkbox, select %{strong_open}Save changes%{strong_close}, and start using slash commands in Slack!"
+msgstr ""
+
+msgid "SlackService|After setup, get a list of available Slack slash commands by entering"
msgstr ""
-msgid "SlackService|See list of available commands in Slack after setting up this service, by entering"
+msgid "SlackService|Fill in the word that works best for your team."
msgstr ""
-msgid "SlackService|This service allows users to perform common operations on this project by entering slash commands in Slack."
+msgid "SlackService|Perform common operations in this project by entering slash commands in Slack."
msgstr ""
msgid "Slice multiplier"
@@ -31180,7 +31646,7 @@ msgstr ""
msgid "Some child epics may be hidden due to applied filters"
msgstr ""
-msgid "Some common domains are not allowed. %{read_more_link}."
+msgid "Some common domains are not allowed. %{learn_more_link}."
msgstr ""
msgid "Some of the designs you tried uploading did not change:"
@@ -31264,9 +31730,6 @@ msgstr ""
msgid "Something went wrong while exporting requirements"
msgstr ""
-msgid "Something went wrong while fetching %{listType} list"
-msgstr ""
-
msgid "Something went wrong while fetching branches"
msgstr ""
@@ -31321,15 +31784,9 @@ msgstr ""
msgid "Something went wrong while merging this merge request. Please try again."
msgstr ""
-msgid "Something went wrong while moving issues."
-msgstr ""
-
msgid "Something went wrong while obtaining the Let's Encrypt certificate."
msgstr ""
-msgid "Something went wrong while performing the action."
-msgstr ""
-
msgid "Something went wrong while promoting the issue to an epic. Please try again."
msgstr ""
@@ -31657,7 +32114,10 @@ msgstr ""
msgid "SourcegraphPreferences|Uses a custom %{linkStart}Sourcegraph instance%{linkEnd}."
msgstr ""
-msgid "Spam Check API Key"
+msgid "Spam Check"
+msgstr ""
+
+msgid "Spam Check API key"
msgstr ""
msgid "Spam Logs"
@@ -31675,7 +32135,7 @@ msgstr ""
msgid "Specified URL cannot be used: \"%{reason}\""
msgstr ""
-msgid "Specify an e-mail address regex pattern to identify default internal users."
+msgid "Specify an email address regex pattern to identify default internal users."
msgstr ""
msgid "Speed up your pipelines with Needs relationships"
@@ -31930,7 +32390,7 @@ msgstr ""
msgid "StatusCheck|An error occurred fetching the status checks."
msgstr ""
-msgid "StatusCheck|Apply this status check to any branch or a specific protected branch."
+msgid "StatusCheck|Apply this status check to all branches or a specific protected branch."
msgstr ""
msgid "StatusCheck|Check for a status response in Merge Requests. Failures do not block merges. %{link_start}Learn more%{link_end}."
@@ -32269,6 +32729,9 @@ msgstr ""
msgid "Subscriptions"
msgstr ""
+msgid "Subscription|Your subscription for %{strong}%{namespace_name}%{strong_close} has expired and you are now on %{pricing_link_start}the GitLab Free tier%{pricing_link_end}. Don't worry, your data is safe. Get in touch with our support team (%{support_email}). They'll gladly help with your subscription renewal."
+msgstr ""
+
msgid "Subtracted"
msgstr ""
@@ -32497,6 +32960,9 @@ msgstr ""
msgid "SuperSonics|Plan"
msgstr ""
+msgid "SuperSonics|Please agree to the Subscription Agreement"
+msgstr ""
+
msgid "SuperSonics|Ready to get started? A GitLab plan is ideal for scaling organizations and for multi team usage."
msgstr ""
@@ -32527,6 +32993,9 @@ msgstr ""
msgid "SuperSonics|The activation code is not valid. Please make sure to copy it exactly from the Customers Portal or confirmation email. Learn more about %{linkStart}activating your subscription%{linkEnd}."
msgstr ""
+msgid "SuperSonics|The activation code should be a 24-character alphanumeric string"
+msgstr ""
+
msgid "SuperSonics|There is a connectivity issue."
msgstr ""
@@ -32569,9 +33038,15 @@ msgstr ""
msgid "SuperSonics|You do not have an active subscription"
msgstr ""
+msgid "SuperSonics|You have successfully added a license that activates on %{date}. Please see the subscription history table below for more details."
+msgstr ""
+
msgid "SuperSonics|You'll be charged for %{trueUpLinkStart}users over license%{trueUpLinkEnd} on a quarterly or annual basis, depending on the terms of your agreement."
msgstr ""
+msgid "SuperSonics|Your future dated license was successfully added"
+msgstr ""
+
msgid "SuperSonics|Your subscription"
msgstr ""
@@ -32824,7 +33299,7 @@ msgstr ""
msgid "Template to append to all Service Desk issues"
msgstr ""
-msgid "TemplateRepository|Select a repository to make its templates available to all projects. %{link_start}What should the repository contain?%{link_end} "
+msgid "TemplateRepository|Create common files more quickly, and standardize their format."
msgstr ""
msgid "Templates"
@@ -33030,7 +33505,7 @@ msgstr ""
msgid "TestCases|Search test cases"
msgstr ""
-msgid "TestCases|Something went wrong while adding test case to Todo."
+msgid "TestCases|Something went wrong while adding test case to a to-do item."
msgstr ""
msgid "TestCases|Something went wrong while creating a test case."
@@ -33042,7 +33517,7 @@ msgstr ""
msgid "TestCases|Something went wrong while fetching test cases list."
msgstr ""
-msgid "TestCases|Something went wrong while marking test case todo as done."
+msgid "TestCases|Something went wrong while marking test case to-do item as done."
msgstr ""
msgid "TestCases|Something went wrong while moving test case."
@@ -33162,7 +33637,7 @@ msgstr ""
msgid "Thanks for your purchase!"
msgstr ""
-msgid "That is ok, I do not want to renew"
+msgid "That's OK, I don't want to renew"
msgstr ""
msgid "That's it, well done!"
@@ -33185,7 +33660,7 @@ msgid_plural "The %{type} contains the following errors:"
msgstr[0] ""
msgstr[1] ""
-msgid "The API key used by GitLab for accessing the Spam Check service endpoint"
+msgid "The API key used by GitLab for accessing the Spam Check service endpoint."
msgstr ""
msgid "The GitLab subscription service (customers.gitlab.com) is currently experiencing an outage. You can monitor the status and get updates at %{linkStart}status.gitlab.com%{linkEnd}."
@@ -33224,9 +33699,6 @@ msgstr ""
msgid "The URL to use for connecting to Elasticsearch. Use a comma-separated list to support clustering (e.g., \"http://localhost:9200, http://localhost:9201\")."
msgstr ""
-msgid "The Vulnerability Report shows the results of the last successful pipeline run on the default branch."
-msgstr ""
-
msgid "The X509 Certificate to use when mutual TLS is required to communicate with the external authorization service. If left blank, the server certificate is still validated when accessing over HTTPS."
msgstr ""
@@ -33284,9 +33756,6 @@ msgstr ""
msgid "The default branch for this project has been changed. Please update your bookmarks."
msgstr ""
-msgid "The default expiration time for job artifacts. 0 for unlimited. The default unit is in seconds, but you can use other units, for example %{code_open}4 mins 2 sec%{code_close}, %{code_open}2h42min%{code_close}."
-msgstr ""
-
msgid "The dependency list details information about the components used within your project."
msgstr ""
@@ -33478,9 +33947,6 @@ msgstr ""
msgid "The merge conflicts for this merge request have already been resolved. Please return to the merge request."
msgstr ""
-msgid "The merge request can now be merged."
-msgstr ""
-
msgid "The metric must be one of %{metrics}."
msgstr ""
@@ -33856,7 +34322,7 @@ msgstr ""
msgid "There was a problem updating the keep latest artifacts setting."
msgstr ""
-msgid "There was an error %{message} todo."
+msgid "There was an error %{message} to-do item."
msgstr ""
msgid "There was an error adding a To Do."
@@ -33895,6 +34361,9 @@ msgstr ""
msgid "There was an error fetching projects"
msgstr ""
+msgid "There was an error fetching search autocomplete suggestions"
+msgstr ""
+
msgid "There was an error fetching stage total counts"
msgstr ""
@@ -34219,6 +34688,9 @@ msgstr ""
msgid "This field is required."
msgstr ""
+msgid "This form is disabled in preview"
+msgstr ""
+
msgid "This group"
msgstr ""
@@ -34240,9 +34712,6 @@ msgstr ""
msgid "This group is linked to a subscription"
msgstr ""
-msgid "This group, including all subgroups, projects and git repositories, will be reachable from only the specified IP address ranges."
-msgstr ""
-
msgid "This group, its subgroups and projects has been scheduled for removal on %{date}."
msgstr ""
@@ -34522,9 +34991,6 @@ msgstr ""
msgid "This user cannot be unlocked manually from GitLab"
msgstr ""
-msgid "This user does not have a pending request"
-msgstr ""
-
msgid "This user has an unconfirmed email address (%{email}). You may force a confirmation."
msgstr ""
@@ -34633,9 +35099,6 @@ msgstr ""
msgid "ThreatMonitoring|Packet Activity"
msgstr ""
-msgid "ThreatMonitoring|Policies"
-msgstr ""
-
msgid "ThreatMonitoring|Requests"
msgstr ""
@@ -34687,6 +35150,12 @@ msgstr ""
msgid "ThreatMonitoring|View documentation"
msgstr ""
+msgid "Threshold in bytes at which to compress Sidekiq job arguments."
+msgstr ""
+
+msgid "Threshold in bytes at which to reject Sidekiq jobs. Set this to 0 to if you don't want to limit Sidekiq jobs."
+msgstr ""
+
msgid "Throughput"
msgstr ""
@@ -34696,6 +35165,9 @@ msgstr ""
msgid "Time"
msgstr ""
+msgid "Time (in hours) that users are allowed to skip forced configuration of two-factor authentication."
+msgstr ""
+
msgid "Time Spent"
msgstr ""
@@ -34762,7 +35234,7 @@ msgstr ""
msgid "TimeTrackingEstimated|Est"
msgstr ""
-msgid "TimeTracking|%{startTag}Spent: %{endTag}%{timeSpentHumanReadable}"
+msgid "TimeTracking|%{spentStart}Spent: %{spentEnd}"
msgstr ""
msgid "TimeTracking|Estimated:"
@@ -34976,6 +35448,9 @@ msgstr ""
msgid "To access this domain create a new DNS record"
msgstr ""
+msgid "To add a custom suffix, set up a Service Desk email address. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "To add an SSH key you need to %{generate_link_start}generate one%{link_end} or use an %{existing_link_start}existing key%{link_end}."
msgstr ""
@@ -34997,13 +35472,16 @@ msgstr ""
msgid "To connect an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To continue using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
+msgstr ""
+
msgid "To continue, you need to select the link in the confirmation email we sent to verify your email address. If you didn't get our email, select %{strongStart}Resend confirmation email.%{strongEnd}"
msgstr ""
msgid "To define internal users, first enable new users set to external"
msgstr ""
-msgid "To enable Registration Features, make sure \"Enable service ping\" is checked."
+msgid "To enable Registration Features, first enable Service Ping."
msgstr ""
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
@@ -35030,7 +35508,7 @@ msgstr ""
msgid "To get started, use the link below to confirm your account."
msgstr ""
-msgid "To help improve GitLab and its user experience, GitLab will periodically collect usage information."
+msgid "To help improve GitLab and its user experience, GitLab periodically collects usage information."
msgstr ""
msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
@@ -35063,7 +35541,7 @@ msgstr ""
msgid "To preserve performance only %{strong_open}%{display_size} of %{real_size}%{strong_close} files are displayed."
msgstr ""
-msgid "To protect this issue's confidentiality, %{forkLink} and set the fork's visibility to private."
+msgid "To protect this issue's confidentiality, %{linkStart}fork this project%{linkEnd} and set the fork's visibility to private."
msgstr ""
msgid "To protect this issue's confidentiality, a private fork of this project was selected."
@@ -35096,12 +35574,15 @@ msgstr ""
msgid "To set up SAML authentication for your group through an identity provider like Azure, Okta, Onelogin, Ping Identity, or your custom SAML 2.0 provider:"
msgstr ""
-msgid "To set up this service:"
+msgid "To set up this integration:"
msgstr ""
msgid "To specify the notification level per project of a group you belong to, you need to visit project page and change notification level there."
msgstr ""
+msgid "To start using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
+msgstr ""
+
msgid "To unsubscribe from this issue, please paste the following link into your browser:"
msgstr ""
@@ -35689,9 +36170,6 @@ msgstr ""
msgid "Unable to fetch branches list, please close the form and try again"
msgstr ""
-msgid "Unable to fetch unscanned projects"
-msgstr ""
-
msgid "Unable to fetch vulnerable projects"
msgstr ""
@@ -35746,6 +36224,15 @@ msgstr ""
msgid "Unable to update this issue at this time."
msgstr ""
+msgid "Unapprove a merge request"
+msgstr ""
+
+msgid "Unapprove the current merge request."
+msgstr ""
+
+msgid "Unapproved the current merge request."
+msgstr ""
+
msgid "Unarchive project"
msgstr ""
@@ -35758,16 +36245,13 @@ msgstr ""
msgid "Unassigned"
msgstr ""
-msgid "Unauthenticated API request rate limit"
-msgstr ""
-
-msgid "Unauthenticated rate limit period in seconds"
+msgid "Unauthenticated API rate limit period in seconds"
msgstr ""
-msgid "Unauthenticated request rate limit"
+msgid "Unauthenticated requests"
msgstr ""
-msgid "Unauthenticated requests"
+msgid "Unauthenticated web rate limit period in seconds"
msgstr ""
msgid "Undo"
@@ -35869,18 +36353,6 @@ msgstr ""
msgid "Unresolved"
msgstr ""
-msgid "UnscannedProjects|15 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|30 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|5 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|60 or more days"
-msgstr ""
-
msgid "Unschedule job"
msgstr ""
@@ -36100,6 +36572,9 @@ msgstr ""
msgid "UsageQuota|%{help_link_start}Shared runners%{help_link_end} are disabled, so there are no limits set on pipeline usage"
msgstr ""
+msgid "UsageQuota|%{linkTitle} help link"
+msgstr ""
+
msgid "UsageQuota|%{percentageLeft} of purchased storage is available"
msgstr ""
@@ -36109,6 +36584,9 @@ msgstr ""
msgid "UsageQuota|Artifacts is a sum of build and pipeline artifacts."
msgstr ""
+msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
+msgstr ""
+
msgid "UsageQuota|Buy additional minutes"
msgstr ""
@@ -36118,9 +36596,21 @@ msgstr ""
msgid "UsageQuota|CI minutes usage by project"
msgstr ""
+msgid "UsageQuota|Code packages and container images."
+msgstr ""
+
msgid "UsageQuota|Current period usage"
msgstr ""
+msgid "UsageQuota|File attachments and smaller design graphics."
+msgstr ""
+
+msgid "UsageQuota|Git repository, managed by the Gitaly service."
+msgstr ""
+
+msgid "UsageQuota|Includes project registry, artifacts, packages, wiki, uploads and other items."
+msgstr ""
+
msgid "UsageQuota|Increase storage temporarily"
msgstr ""
@@ -36139,6 +36629,9 @@ msgstr ""
msgid "UsageQuota|Packages"
msgstr ""
+msgid "UsageQuota|Pipeline artifacts and job artifacts, created with CI/CD."
+msgstr ""
+
msgid "UsageQuota|Pipelines"
msgstr ""
@@ -36157,6 +36650,9 @@ msgstr ""
msgid "UsageQuota|Seats"
msgstr ""
+msgid "UsageQuota|Shared bits of code and text."
+msgstr ""
+
msgid "UsageQuota|Snippets"
msgstr ""
@@ -36166,6 +36662,12 @@ msgstr ""
msgid "UsageQuota|Storage"
msgstr ""
+msgid "UsageQuota|Storage type"
+msgstr ""
+
+msgid "UsageQuota|There is a known issue with Artifact storage where the total could be incorrect for some projects. More details and progress are available in %{warningLinkStart}the epic%{warningLinkEnd}."
+msgstr ""
+
msgid "UsageQuota|This is the total amount of storage used across your projects within this namespace."
msgstr ""
@@ -36205,6 +36707,9 @@ msgstr ""
msgid "UsageQuota|Usage"
msgstr ""
+msgid "UsageQuota|Usage Breakdown"
+msgstr ""
+
msgid "UsageQuota|Usage Quotas"
msgstr ""
@@ -36229,6 +36734,9 @@ msgstr ""
msgid "UsageQuota|Wiki"
msgstr ""
+msgid "UsageQuota|Wiki content."
+msgstr ""
+
msgid "UsageQuota|Wikis"
msgstr ""
@@ -36445,7 +36953,10 @@ msgstr ""
msgid "User Settings"
msgstr ""
-msgid "User and IP Rate Limits"
+msgid "User and IP rate limits"
+msgstr ""
+
+msgid "User does not have a pending request"
msgstr ""
msgid "User identity was successfully created."
@@ -36742,6 +37253,9 @@ msgstr ""
msgid "Users can launch a development environment from a GitLab browser tab when the %{linkStart}Gitpod%{linkEnd} integration is enabled."
msgstr ""
+msgid "Users can reactivate their account by signing in."
+msgstr ""
+
msgid "Users can render diagrams in AsciiDoc, Markdown, reStructuredText, and Textile documents using Kroki."
msgstr ""
@@ -36757,6 +37271,9 @@ msgstr ""
msgid "Users requesting access to"
msgstr ""
+msgid "Users to exclude from the rate limit"
+msgstr ""
+
msgid "Users were successfully added."
msgstr ""
@@ -36778,6 +37295,9 @@ msgstr ""
msgid "UsersSelect|Unassigned"
msgstr ""
+msgid "Uses GitLab as a lightweight alternative to Sentry."
+msgstr ""
+
msgid "Using %{code_start}::%{code_end} denotes a %{link_start}scoped label set%{link_end}"
msgstr ""
@@ -36808,10 +37328,7 @@ msgstr ""
msgid "Value Stream Analytics can help you determine your team’s velocity"
msgstr ""
-msgid "Value Stream Analytics gives an overview of how much time it takes to go from idea to production in your project."
-msgstr ""
-
-msgid "Value may contain a variable reference"
+msgid "Value might contain a variable reference"
msgstr ""
msgid "Value stream"
@@ -36877,10 +37394,10 @@ msgstr ""
msgid "ValueStream|The Default Value Stream cannot be deleted"
msgstr ""
-msgid "Variable"
+msgid "Values that contain the %{codeStart}$%{codeEnd} character can be considered a variable reference and expanded. %{docsLinkStart}Learn more.%{docsLinkEnd}"
msgstr ""
-msgid "Variable references indicated by %{codeStart}$%{codeEnd} may be expanded. If this is not what you want, consider %{docsLinkStart}using a workaround to prevent expansion%{docsLinkEnd}."
+msgid "Variable"
msgstr ""
msgid "Variable will be masked in job logs."
@@ -37285,6 +37802,9 @@ msgstr ""
msgid "Vulnerability|Evidence"
msgstr ""
+msgid "Vulnerability|False positive detected"
+msgstr ""
+
msgid "Vulnerability|File"
msgstr ""
@@ -37327,6 +37847,9 @@ msgstr ""
msgid "Vulnerability|Status"
msgstr ""
+msgid "Vulnerability|The scanner determined this vulnerability to be a false positive. Verify the evaluation before changing its status. %{linkStart}Learn more about false positive detection.%{linkEnd}"
+msgstr ""
+
msgid "Vulnerability|The unmodified response is the original response that had no mutations done to the request"
msgstr ""
@@ -37651,9 +38174,6 @@ msgstr ""
msgid "Welcome to GitLab,%{br_tag}%{name}!"
msgstr ""
-msgid "Welcome to the guided GitLab tour"
-msgstr ""
-
msgid "Welcome, %{name}!"
msgstr ""
@@ -37672,9 +38192,6 @@ msgstr ""
msgid "What are you searching for?"
msgstr ""
-msgid "What describes you best?"
-msgstr ""
-
msgid "What does this command do?"
msgstr ""
@@ -37696,13 +38213,13 @@ msgstr ""
msgid "What is your job title? (optional)"
msgstr ""
-msgid "What will you use this group for?"
+msgid "What templates can I create?"
msgstr ""
-msgid "What's new"
+msgid "What will you use this group for?"
msgstr ""
-msgid "What’s your experience level?"
+msgid "What's new"
msgstr ""
msgid "When a deployment job is successful, skip older deployment jobs that are still pending."
@@ -37714,6 +38231,9 @@ msgstr ""
msgid "When an event in GitLab triggers a webhook, you can use the request details to figure out if something went wrong."
msgstr ""
+msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+msgstr ""
+
msgid "When inactive, an external authentication provider must be used."
msgstr ""
@@ -37737,6 +38257,9 @@ msgstr ""
msgid "When:"
msgstr ""
+msgid "Which API requests are affected?"
+msgstr ""
+
msgid "While it's rare to have no vulnerabilities, it can happen. In any event, we ask that you please double check your settings to make sure you've set up your dashboard correctly."
msgstr ""
@@ -38016,6 +38539,9 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|Work Items"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -38091,6 +38617,9 @@ msgstr ""
msgid "You are already a member of this %{member_source}."
msgstr ""
+msgid "You are already impersonating another user"
+msgstr ""
+
msgid "You are an admin, which means granting access to %{client_name} will allow them to interact with GitLab as an admin as well. Proceed with caution."
msgstr ""
@@ -38193,6 +38722,9 @@ msgstr ""
msgid "You can also use project access tokens with Git to authenticate over HTTP(S). %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "You can always change your URL later"
+msgstr ""
+
msgid "You can always edit this later"
msgstr ""
@@ -38349,10 +38881,10 @@ msgstr ""
msgid "You can’t %{tag_start}edit%{tag_end} files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
-msgid "You could not create a new trigger."
+msgid "You can’t edit files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
-msgid "You didn't renew your subscription for %{strong}%{namespace_name}%{strong_close} so it was downgraded to the free plan."
+msgid "You could not create a new trigger."
msgstr ""
msgid "You do not have any subscriptions yet"
@@ -38520,6 +39052,12 @@ msgstr ""
msgid "You must provide your current password in order to change it."
msgstr ""
+msgid "You must sign in to search for specific projects."
+msgstr ""
+
+msgid "You must sign in to search for specific terms."
+msgstr ""
+
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
@@ -38547,6 +39085,9 @@ msgstr ""
msgid "You need to upload a GitLab project export archive (ending in .gz)."
msgstr ""
+msgid "You need to verify your primary email first before enabling Two-Factor Authentication."
+msgstr ""
+
msgid "You successfully declined the invitation"
msgstr ""
@@ -38655,10 +39196,10 @@ msgstr ""
msgid "Your %{host} account was signed in to from a new location"
msgstr ""
-msgid "Your %{strong}%{plan_name}%{strong_close} subscription for %{strong}%{namespace_name}%{strong_close} will expire on %{strong}%{expires_on}%{strong_close}."
+msgid "Your %{strong}%{plan_name}%{strong_close} subscription expires on %{strong}%{expires_on}%{strong_close}. After that date, you cannot create issues or merge requests, or use many other features."
msgstr ""
-msgid "Your %{strong}%{plan_name}%{strong_close} subscription will expire on %{strong}%{expires_on}%{strong_close}. After that, you will not be able to create issues or merge requests as well as many other features."
+msgid "Your %{strong}%{plan_name}%{strong_close} subscription for %{strong}%{namespace_name}%{strong_close} will expire on %{strong}%{expires_on}%{strong_close}."
msgstr ""
msgid "Your CI/CD configuration syntax is invalid. View Lint tab for more details."
@@ -38682,7 +39223,7 @@ msgstr ""
msgid "Your GPG keys (%{count})"
msgstr ""
-msgid "Your GitLab account has been locked due to an excessive amount of unsuccessful sign in attempts. Your account will automatically unlock in %{duration} or you may click the link below to unlock now."
+msgid "Your GitLab account has been locked due to an excessive number of unsuccessful sign in attempts. You can wait for your account to automatically unlock in %{duration} or you can click the link below to unlock now."
msgstr ""
msgid "Your GitLab account request has been approved!"
@@ -38793,6 +39334,9 @@ msgstr ""
msgid "Your commit email is used for web based operations, such as edits and merges."
msgstr ""
+msgid "Your current password is required to register a two-factor authenticator app."
+msgstr ""
+
msgid "Your dashboard has been copied. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
@@ -38892,6 +39436,9 @@ msgstr ""
msgid "Your project limit is %{limit} projects! Please contact your administrator to increase it"
msgstr ""
+msgid "Your project will be created at:"
+msgstr ""
+
msgid "Your projects"
msgstr ""
@@ -38931,11 +39478,10 @@ msgstr ""
msgid "Your subscription expired!"
msgstr ""
-msgid "Your subscription has been downgraded."
-msgstr ""
-
-msgid "Your subscription will expire in %{remaining_days}."
-msgstr ""
+msgid "Your subscription will expire in %{remaining_days} day."
+msgid_plural "Your subscription will expire in %{remaining_days} days."
+msgstr[0] ""
+msgstr[1] ""
msgid "Your username is %{username}."
msgstr ""
@@ -39142,6 +39688,9 @@ msgstr ""
msgid "cannot merge"
msgstr ""
+msgid "cannot not be used for user namespace"
+msgstr ""
+
msgid "ciReport|%{degradedNum} degraded"
msgstr ""
@@ -39465,6 +40014,9 @@ msgstr ""
msgid "created %{timeAgo}"
msgstr ""
+msgid "created %{timeAgo} by %{author}"
+msgstr ""
+
msgid "created by"
msgstr ""
@@ -39509,9 +40061,6 @@ msgstr ""
msgid "does not have a supported extension. Only %{extension_list} are supported"
msgstr ""
-msgid "domain is not authorized for sign-up."
-msgstr ""
-
msgid "download it"
msgstr ""
@@ -39529,18 +40078,13 @@ msgstr ""
msgid "email '%{email}' is not a verified email."
msgstr ""
-msgid "email does not match the allowed domain of %{email_domains}"
-msgid_plural "email does not match the allowed domains: %{email_domains}"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "enabled"
msgstr ""
msgid "encrypted: needs to be a :required, :optional or :migrating!"
msgstr ""
-msgid "ending with MIME type format is not allowed."
+msgid "ending with a reserved file extension is not allowed."
msgstr ""
msgid "entries cannot be larger than 255 characters"
@@ -39564,6 +40108,9 @@ msgstr ""
msgid "estimateCommand|%{slash_command} overwrites the total estimated time."
msgstr ""
+msgid "example.com"
+msgstr ""
+
msgid "exceeds the limit of %{bytes} bytes"
msgstr ""
@@ -39614,9 +40161,6 @@ msgstr ""
msgid "fork"
msgstr ""
-msgid "fork this project"
-msgstr ""
-
msgid "from"
msgstr ""
@@ -39625,6 +40169,9 @@ msgid_plural "from %d jobs"
msgstr[0] ""
msgstr[1] ""
+msgid "frontmatter"
+msgstr ""
+
msgid "group"
msgstr ""
@@ -39652,6 +40199,9 @@ msgstr ""
msgid "has been completed."
msgstr ""
+msgid "has too deep level of nesting"
+msgstr ""
+
msgid "help"
msgstr ""
@@ -39685,9 +40235,21 @@ msgstr ""
msgid "in"
msgstr ""
+msgid "in Infrastructure :: Kubernetes clusters"
+msgstr ""
+
+msgid "in all GitLab"
+msgstr ""
+
+msgid "in group"
+msgstr ""
+
msgid "in group %{link_to_group}"
msgstr ""
+msgid "in project"
+msgstr ""
+
msgid "in project %{link_to_project}"
msgstr ""
@@ -39729,16 +40291,19 @@ msgstr ""
msgid "is not a valid X509 certificate."
msgstr ""
-msgid "is not allowed since the group is not top-level group."
+msgid "is not allowed for sign-up."
msgstr ""
-msgid "is not allowed. Try again with a different email address, or contact your GitLab admin."
+msgid "is not allowed for this group."
msgstr ""
-msgid "is not allowed. We do not currently support project-level iterations"
+msgid "is not allowed for this project."
+msgstr ""
+
+msgid "is not allowed since the group is not top-level group."
msgstr ""
-msgid "is not from an allowed domain."
+msgid "is not allowed. We do not currently support project-level iterations"
msgstr ""
msgid "is not in the group enforcing Group Managed Account"
@@ -39831,6 +40396,9 @@ msgstr ""
msgid "log in"
msgstr ""
+msgid "managed"
+msgstr ""
+
msgid "manual"
msgstr ""
@@ -39878,6 +40446,9 @@ msgstr ""
msgid "mrWidget| Please restore it or use a different %{missingBranchName} branch"
msgstr ""
+msgid "mrWidget|%{linkStart}Set up now%{linkEnd} to analyze your source code for known security vulnerabilities."
+msgstr ""
+
msgid "mrWidget|%{mergeError}."
msgstr ""
@@ -39958,6 +40529,9 @@ msgid_plural "mrWidget|Closes issues"
msgstr[0] ""
msgstr[1] ""
+msgid "mrWidget|Create issue to resolve all threads"
+msgstr ""
+
msgid "mrWidget|Delete source branch"
msgstr ""
@@ -39967,12 +40541,18 @@ msgstr ""
msgid "mrWidget|Did not close"
msgstr ""
+msgid "mrWidget|Dismiss"
+msgstr ""
+
msgid "mrWidget|Email patches"
msgstr ""
msgid "mrWidget|Failed to load deployment statistics"
msgstr ""
+msgid "mrWidget|Hide %{widget} details"
+msgstr ""
+
msgid "mrWidget|If the %{missingBranchName} branch exists in your local repository, you can merge this merge request manually using the command line"
msgstr ""
@@ -40068,9 +40648,6 @@ msgstr ""
msgid "mrWidget|Request to merge"
msgstr ""
-msgid "mrWidget|Resolve all threads in new issue"
-msgstr ""
-
msgid "mrWidget|Resolve conflicts"
msgstr ""
@@ -40086,6 +40663,9 @@ msgstr ""
msgid "mrWidget|Revoke approval"
msgstr ""
+msgid "mrWidget|SAST and Secret Detection is not enabled."
+msgstr ""
+
msgid "mrWidget|Set by %{merge_author} to be added to the merge train when the pipeline succeeds"
msgstr ""
@@ -40095,6 +40675,9 @@ msgstr ""
msgid "mrWidget|Set by %{merge_author} to start a merge train when the pipeline succeeds"
msgstr ""
+msgid "mrWidget|Show %{widget} details"
+msgstr ""
+
msgid "mrWidget|The changes were merged into"
msgstr ""
@@ -40107,6 +40690,9 @@ msgstr ""
msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure, or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
msgstr ""
+msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure."
+msgstr ""
+
msgid "mrWidget|The source branch has been deleted"
msgstr ""
@@ -40149,6 +40735,9 @@ msgstr ""
msgid "mrWidget|You can merge after removing denied licenses"
msgstr ""
+msgid "mrWidget|You can only merge once this merge request is approved."
+msgstr ""
+
msgid "mrWidget|Your password"
msgstr ""
@@ -40185,6 +40774,9 @@ msgstr ""
msgid "must be less than the limit of %{tag_limit} tags"
msgstr ""
+msgid "must be set for a project namespace"
+msgstr ""
+
msgid "must be unique by status and elapsed time within a policy"
msgstr ""
@@ -40294,6 +40886,9 @@ msgstr ""
msgid "pipeline"
msgstr ""
+msgid "pipeline schedules documentation"
+msgstr ""
+
msgid "pod_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
msgstr ""
@@ -40343,16 +40938,25 @@ msgstr ""
msgid "project name"
msgstr ""
+msgid "project namespace cannot be the parent of another namespace"
+msgstr ""
+
msgid "projects"
msgstr ""
msgid "quick actions"
msgstr ""
-msgid "reCAPTCHA Private Key"
+msgid "reCAPTCHA"
+msgstr ""
+
+msgid "reCAPTCHA helps prevent credential stuffing."
msgstr ""
-msgid "reCAPTCHA Site Key"
+msgid "reCAPTCHA private key"
+msgstr ""
+
+msgid "reCAPTCHA site key"
msgstr ""
msgid "recent activity"
@@ -40579,6 +41183,9 @@ msgstr ""
msgid "user avatar"
msgstr ""
+msgid "user namespace cannot be the parent of another namespace"
+msgstr ""
+
msgid "user preferences"
msgstr ""
@@ -40671,3 +41278,9 @@ msgstr ""
msgid "your settings"
msgstr ""
+msgid "{group}"
+msgstr ""
+
+msgid "{project}"
+msgstr ""
+
diff --git a/locale/uz_UZ/gitlab.po b/locale/uz_UZ/gitlab.po
index 324d9f79a54..8691840795f 100644
--- a/locale/uz_UZ/gitlab.po
+++ b/locale/uz_UZ/gitlab.po
@@ -14,10 +14,7 @@ msgstr ""
"X-Crowdin-Language: uz\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-09-01 22:31\n"
-
-msgid " %{name}, confirm your email address now! "
-msgstr ""
+"PO-Revision-Date: 2021-10-04 20:19\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -92,6 +89,16 @@ msgstr ""
msgid "#general, #development"
msgstr ""
+msgid "%d Alert"
+msgid_plural "%d Alerts"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d Alert:"
+msgid_plural "%d Alerts:"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d Approval"
msgid_plural "%d Approvals"
msgstr[0] ""
@@ -455,7 +462,10 @@ msgstr ""
msgid "%{code_open}Protected:%{code_close} Only exposed to protected branches or tags."
msgstr ""
-msgid "%{commit_author_link} authored %{commit_timeago}"
+msgid "%{commit_author_link} authored %{commit_authored_timeago}"
+msgstr ""
+
+msgid "%{commit_author_link} authored %{commit_authored_timeago} and %{commit_committer_avatar} %{commit_committer_link} committed %{commit_committer_timeago}"
msgstr ""
msgid "%{completedCount} completed weight"
@@ -549,6 +559,15 @@ msgstr ""
msgid "%{doc_link_start}Advanced search%{doc_link_end} is enabled."
msgstr ""
+msgid "%{docs_link_start}Learn about visibility levels.%{docs_link_end}"
+msgstr ""
+
+msgid "%{docs_link_start}What is Large File Storage?%{docs_link_end}"
+msgstr ""
+
+msgid "%{docs_link_start}What is two-factor authentication?%{docs_link_end}"
+msgstr ""
+
msgid "%{due_date} (Past due)"
msgstr ""
@@ -621,9 +640,6 @@ msgstr ""
msgid "%{issueType} actions"
msgstr ""
-msgid "%{issuesCount} issues with a limit of %{maxIssueCount}"
-msgstr ""
-
msgid "%{issuesSize} with a limit of %{maxIssueCount}"
msgstr ""
@@ -681,6 +697,12 @@ msgstr ""
msgid "%{label_for_message} unavailable"
msgstr ""
+msgid "%{learn_more_link}."
+msgstr ""
+
+msgid "%{lessThan} 1 hour"
+msgstr ""
+
msgid "%{lets_encrypt_link_start}Let's Encrypt%{lets_encrypt_link_end} is a free, automated, and open certificate authority (CA) that issues digital certificates to enable HTTPS (SSL/TLS) for sites."
msgstr ""
@@ -693,15 +715,15 @@ msgstr ""
msgid "%{link_start}Learn more%{link_end} about roles."
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
-msgstr ""
-
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
msgstr ""
msgid "%{link_start}Start the title with %{draft_snippet}%{link_end} to prevent a merge request that is a work in progress from being merged before it's ready."
msgstr ""
+msgid "%{link_start}What information does GitLab Inc. collect?%{link_end}"
+msgstr ""
+
msgid "%{listToShow}, and %{awardsListLength} more"
msgstr ""
@@ -854,7 +876,7 @@ msgid_plural "%{securityScanner} results are not available because a pipeline ha
msgstr[0] ""
msgstr[1] ""
-msgid "%{service_ping_link_start}Learn more%{service_ping_link_end} about what information is shared with GitLab Inc."
+msgid "%{service_ping_link_start}What information is shared with GitLab Inc.?%{service_ping_link_end}"
msgstr ""
msgid "%{size} %{unit}"
@@ -890,6 +912,9 @@ msgstr ""
msgid "%{state} epics"
msgstr ""
+msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
+msgstr ""
+
msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
msgstr ""
@@ -949,11 +974,6 @@ msgstr ""
msgid "%{template_project_id} is unknown or invalid"
msgstr ""
-msgid "%{text} %{files}"
-msgid_plural "%{text} %{files} files"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%{text} is available"
msgstr ""
@@ -1038,9 +1058,6 @@ msgstr ""
msgid "%{wildcards_link_start}Wildcards%{wildcards_link_end} such as %{code_tag_start}v*%{code_tag_end} or %{code_tag_start}*-release%{code_tag_end} are supported."
msgstr ""
-msgid "&lt; 1 hour"
-msgstr ""
-
msgid "'%{data}' at %{location} does not match format: %{format}"
msgstr ""
@@ -1124,9 +1141,6 @@ msgstr ""
msgid "(we need your current password to confirm your changes)"
msgstr ""
-msgid "* * * * *"
-msgstr ""
-
msgid "+ %{amount} more"
msgstr ""
@@ -1193,10 +1207,10 @@ msgstr ""
msgid "."
msgstr ""
-msgid "0 bytes"
+msgid "/"
msgstr ""
-msgid "0 for unlimited, only effective with remote storage enabled."
+msgid "0 bytes"
msgstr ""
msgid "0t1DgySidms"
@@ -1326,6 +1340,9 @@ msgstr ""
msgid "1000+"
msgstr ""
+msgid "192.168.0.0/24"
+msgstr ""
+
msgid "1st contribution!"
msgstr ""
@@ -1479,9 +1496,6 @@ msgstr ""
msgid "A plain HTML site that uses Netlify for CI/CD instead of GitLab, but still with all the other great GitLab features"
msgstr ""
-msgid "A plain-text response to show to clients that hit the rate limit."
-msgstr ""
-
msgid "A platform value can be web, mob or app."
msgstr ""
@@ -1563,7 +1577,7 @@ msgstr ""
msgid "APIFuzzing|Configure HTTP basic authentication values. Other authentication methods are supported. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
+msgid "APIFuzzing|Customize your project's API fuzzing configuration options and copy the code snippet to your .gitlab-ci.yml file to apply any changes. Note that this tool does not reflect or update your .gitlab-ci.yml file automatically. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
msgstr ""
msgid "APIFuzzing|Enable authentication"
@@ -1626,9 +1640,6 @@ msgstr ""
msgid "APIFuzzing|To prevent a security leak, authentication info must be added as a %{ciVariablesLinkStart}CI variable%{ciVariablesLinkEnd}. As a user with maintainer access rights, you can manage CI variables in the %{ciSettingsLinkStart}Settings%{ciSettingsLinkEnd} area."
msgstr ""
-msgid "APIFuzzing|Use this tool to generate API fuzzing configuration YAML to copy into your .gitlab-ci.yml file. This tool does not reflect or update your .gitlab-ci.yml file automatically."
-msgstr ""
-
msgid "APIFuzzing|Username for basic authentication"
msgstr ""
@@ -1680,9 +1691,6 @@ msgstr ""
msgid "Abuse reports notification email"
msgstr ""
-msgid "Abuse reports will be sent to this address if it is set. Abuse reports are always available in the admin area."
-msgstr ""
-
msgid "Accept invitation"
msgstr ""
@@ -1719,12 +1727,18 @@ msgstr ""
msgid "Access granted"
msgstr ""
+msgid "Access key ID"
+msgstr ""
+
msgid "Access requests"
msgstr ""
msgid "Access to '%{classification_label}' not allowed"
msgstr ""
+msgid "Access tokens expire after 2 hours. A refresh token may be used at any time to generate a new access token. Non-expiring access tokens are deprecated. Clear this setting to enable backward compatibility."
+msgstr ""
+
msgid "AccessDropdown|Deploy Keys"
msgstr ""
@@ -2037,6 +2051,9 @@ msgstr ""
msgid "Add new directory"
msgstr ""
+msgid "Add new service account"
+msgstr ""
+
msgid "Add or remove previously merged commits"
msgstr ""
@@ -2274,6 +2291,9 @@ msgstr ""
msgid "AdminArea|Features"
msgstr ""
+msgid "AdminArea|Get security updates from GitLab and stay up to date"
+msgstr ""
+
msgid "AdminArea|Groups"
msgstr ""
@@ -2313,6 +2333,12 @@ msgstr ""
msgid "AdminArea|Reporter"
msgstr ""
+msgid "AdminArea|Sign up for the GitLab Security Newsletter to get notified for security updates."
+msgstr ""
+
+msgid "AdminArea|Sign up for the GitLab newsletter"
+msgstr ""
+
msgid "AdminArea|Stop all jobs"
msgstr ""
@@ -2382,9 +2408,15 @@ msgstr ""
msgid "AdminSettings|Disable public access to Pages sites"
msgstr ""
+msgid "AdminSettings|Display a banner on merge requests in projects with no pipelines to initiate steps to add a .gitlab-ci.yml file."
+msgstr ""
+
msgid "AdminSettings|Domain verification is an essential security measure for public GitLab sites. Users are required to demonstrate they control a domain before it is enabled. %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "AdminSettings|Enable pipeline suggestion banner"
+msgstr ""
+
msgid "AdminSettings|Enable shared runners for new projects"
msgstr ""
@@ -2856,10 +2888,10 @@ msgstr ""
msgid "Admin|Quarterly reconciliation will occur on %{qrtlyDate}"
msgstr ""
-msgid "Admin|The number of max seats used for your namespace is currently exceeding the number of seats in your subscription. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgid "Admin|The number of max seats in your namespace exceeds the number of seats in your subscription. On %{qrtlyDate}, quarterly reconciliation occurs and you are automatically billed a prorated amount for the overage. No action is needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice. For more information about the timing of the invoicing process, view the documentation."
msgstr ""
-msgid "Admin|The number of maximum users for your instance is currently exceeding the number of users in license. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgid "Admin|The number of max users in your instance exceeds the number of users in your license. On %{qrtlyDate}, quarterly reconciliation occurs and you are automatically billed a prorated amount for the overage. No action is needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice. For more information about the timing of the invoicing process, view the documentation."
msgstr ""
msgid "Admin|View pending user approvals"
@@ -2880,9 +2912,6 @@ msgstr ""
msgid "Advanced export options"
msgstr ""
-msgid "Advanced permissions, Large File Storage and Two-Factor authentication settings."
-msgstr ""
-
msgid "After a successful password update you will be redirected to login screen."
msgstr ""
@@ -2901,13 +2930,14 @@ msgstr ""
msgid "After you've reviewed these contribution guidelines, you'll be all set to"
msgstr ""
+msgid "Akismet"
+msgstr ""
+
msgid "Akismet API Key"
msgstr ""
-msgid "Alert"
-msgid_plural "Alerts"
-msgstr[0] ""
-msgstr[1] ""
+msgid "Akismet helps prevent the creation of spam issues in public projects."
+msgstr ""
msgid "AlertManagement|Acknowledged"
msgstr ""
@@ -3263,6 +3293,9 @@ msgstr ""
msgid "All (default)"
msgstr ""
+msgid "All GitLab"
+msgstr ""
+
msgid "All Members"
msgstr ""
@@ -3377,6 +3410,9 @@ msgstr ""
msgid "Allow this secondary node to replicate content on Object Storage"
msgstr ""
+msgid "Allow use of licensed EE features"
+msgstr ""
+
msgid "Allow users to dismiss the broadcast message"
msgstr ""
@@ -3452,9 +3488,6 @@ msgstr ""
msgid "Amazon authentication is not %{link_start}correctly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
-msgid "Amount of time (in hours) that users are allowed to skip forced configuration of two-factor authentication"
-msgstr ""
-
msgid "An %{link_start}alert%{link_end} with the same fingerprint is already open. To change the status of this alert, resolve the linked alert."
msgstr ""
@@ -3515,12 +3548,6 @@ msgstr ""
msgid "An error occurred when removing the label."
msgstr ""
-msgid "An error occurred when toggling the notification subscription"
-msgstr ""
-
-msgid "An error occurred when updating the issue weight"
-msgstr ""
-
msgid "An error occurred when updating the title"
msgstr ""
@@ -3569,6 +3596,9 @@ msgstr ""
msgid "An error occurred while enabling Service Desk."
msgstr ""
+msgid "An error occurred while fetching Markdown preview"
+msgstr ""
+
msgid "An error occurred while fetching ancestors"
msgstr ""
@@ -3599,9 +3629,6 @@ msgstr ""
msgid "An error occurred while fetching label colors."
msgstr ""
-msgid "An error occurred while fetching markdown preview"
-msgstr ""
-
msgid "An error occurred while fetching participants"
msgstr ""
@@ -3617,9 +3644,6 @@ msgstr ""
msgid "An error occurred while fetching reference"
msgstr ""
-msgid "An error occurred while fetching sidebar data"
-msgstr ""
-
msgid "An error occurred while fetching tags. Retry the search."
msgstr ""
@@ -3695,6 +3719,9 @@ msgstr ""
msgid "An error occurred while loading merge requests."
msgstr ""
+msgid "An error occurred while loading projects."
+msgstr ""
+
msgid "An error occurred while loading the Needs tab."
msgstr ""
@@ -3929,12 +3956,6 @@ msgstr ""
msgid "Any Milestone"
msgstr ""
-msgid "Any branch"
-msgstr ""
-
-msgid "Any eligible user"
-msgstr ""
-
msgid "Any encrypted tokens"
msgstr ""
@@ -3953,6 +3974,9 @@ msgstr ""
msgid "Any namespace"
msgstr ""
+msgid "App Engine description and apps that are suitable for this deployment target"
+msgstr ""
+
msgid "App ID"
msgstr ""
@@ -4101,6 +4125,11 @@ msgstr ""
msgid "Apply"
msgstr ""
+msgid "Apply %d suggestion"
+msgid_plural "Apply %d suggestions"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Apply a label"
msgstr ""
@@ -4110,13 +4139,10 @@ msgstr ""
msgid "Apply suggestion"
msgstr ""
-msgid "Apply suggestions"
-msgstr ""
-
msgid "Apply template"
msgstr ""
-msgid "Apply this approval rule to any branch or a specific protected branch."
+msgid "Apply this approval rule to all branches or a specific protected branch."
msgstr ""
msgid "Applying"
@@ -4259,9 +4285,6 @@ msgstr ""
msgid "ApprovalSettings|Prevent editing approval rules in projects and merge requests."
msgstr ""
-msgid "ApprovalSettings|Prevent editing approval rules in projects and merge requests. "
-msgstr ""
-
msgid "ApprovalSettings|Remove all approvals when commits are added to the source branch."
msgstr ""
@@ -4277,6 +4300,9 @@ msgstr ""
msgid "ApprovalSettings|This setting is configured at the instance level and can only be changed by an administrator."
msgstr ""
+msgid "ApprovalSettings|This setting is configured in %{groupName} and can only be changed by an administrator or group owner."
+msgstr ""
+
msgid "ApprovalStatusTooltip|Adheres to separation of duties"
msgstr ""
@@ -4763,9 +4789,6 @@ msgstr ""
msgid "Authenticated API rate limit period in seconds"
msgstr ""
-msgid "Authenticated API request rate limit"
-msgstr ""
-
msgid "Authenticated API requests"
msgstr ""
@@ -4775,10 +4798,10 @@ msgstr ""
msgid "Authenticated Git LFS request rate limit"
msgstr ""
-msgid "Authenticated web rate limit period in seconds"
+msgid "Authenticated Git LFS requests"
msgstr ""
-msgid "Authenticated web request rate limit"
+msgid "Authenticated web rate limit period in seconds"
msgstr ""
msgid "Authenticated web requests"
@@ -5156,9 +5179,6 @@ msgstr ""
msgid "Below you will find all the groups that are public."
msgstr ""
-msgid "Beta"
-msgstr ""
-
msgid "Bi-weekly code coverage"
msgstr ""
@@ -5398,6 +5418,21 @@ msgstr ""
msgid "Board scope affects which issues are displayed for anyone who visits this board"
msgstr ""
+msgid "BoardNewEpic|Groups"
+msgstr ""
+
+msgid "BoardNewEpic|Loading groups"
+msgstr ""
+
+msgid "BoardNewEpic|No matching results"
+msgstr ""
+
+msgid "BoardNewEpic|Search groups"
+msgstr ""
+
+msgid "BoardNewEpic|Select a group"
+msgstr ""
+
msgid "BoardNewIssue|No matching results"
msgstr ""
@@ -5475,6 +5510,9 @@ msgstr ""
msgid "Boards|An error occurred while creating the list. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching child groups. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching group projects. Please try again."
msgstr ""
@@ -5807,6 +5845,9 @@ msgstr ""
msgid "Bulk update"
msgstr ""
+msgid "BulkImports|Re-import creates a new group. It does not sync with the existing group."
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -5816,6 +5857,9 @@ msgstr ""
msgid "BulkImport|From source group"
msgstr ""
+msgid "BulkImport|Group import history"
+msgstr ""
+
msgid "BulkImport|Import failed: Destination cannot be a subgroup of the source group. Change the destination and try again."
msgstr ""
@@ -5828,9 +5872,18 @@ msgstr ""
msgid "BulkImport|Importing the group failed"
msgstr ""
+msgid "BulkImport|Last imported to %{link}"
+msgstr ""
+
msgid "BulkImport|Name already exists."
msgstr ""
+msgid "BulkImport|New group"
+msgstr ""
+
+msgid "BulkImport|No history is available"
+msgstr ""
+
msgid "BulkImport|No parent"
msgstr ""
@@ -5843,6 +5896,9 @@ msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} matching filter \"%{filter}\" from %{link}"
msgstr ""
+msgid "BulkImport|Source group"
+msgstr ""
+
msgid "BulkImport|To new group"
msgstr ""
@@ -5852,6 +5908,9 @@ msgstr ""
msgid "BulkImport|You have no groups to import"
msgstr ""
+msgid "BulkImport|Your imported groups will appear here."
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -6094,6 +6153,9 @@ msgstr ""
msgid "Can be manually deployed to"
msgstr ""
+msgid "Can be overridden in each project."
+msgstr ""
+
msgid "Can create groups:"
msgstr ""
@@ -6196,6 +6258,9 @@ msgstr ""
msgid "Cancelling Preview"
msgstr ""
+msgid "Cannot assign a confidential epic to a non-confidential issue. Make the issue confidential and try again"
+msgstr ""
+
msgid "Cannot be assigned to other projects."
msgstr ""
@@ -6247,9 +6312,6 @@ msgstr ""
msgid "Cannot refer to a group %{timebox_type} by an internal id!"
msgstr ""
-msgid "Cannot set confidential epic for a non-confidential issue"
-msgstr ""
-
msgid "Cannot show preview. For previews on sketch files, they must have the file format introduced by Sketch version 43 and above."
msgstr ""
@@ -6487,15 +6549,15 @@ msgstr ""
msgid "Check out, review, and merge locally"
msgstr ""
-msgid "Check the %{docs_link_start}documentation%{docs_link_end}."
-msgstr ""
-
msgid "Check the current instance configuration "
msgstr ""
msgid "Check the elasticsearch.log file to debug why the migration was halted and make any changes before retrying the migration. When you fix the cause of the failure, click \"Retry migration\", and the migration will be scheduled to be retried in the background."
msgstr ""
+msgid "Check with your administrator."
+msgstr ""
+
msgid "Check your Docker images for known vulnerabilities."
msgstr ""
@@ -6526,6 +6588,9 @@ msgstr ""
msgid "Checkout"
msgstr ""
+msgid "Checkout|$%{selectedPlanPrice} per 10 GB storage per pack"
+msgstr ""
+
msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 minutes"
msgstr ""
@@ -6546,17 +6611,23 @@ msgstr ""
msgid "Checkout|%{name}'s GitLab subscription"
msgstr ""
-msgid "Checkout|%{selectedPlanText} plan"
+msgid "Checkout|%{name}'s storage subscription"
msgstr ""
-msgid "Checkout|%{startDate} - %{endDate}"
+msgid "Checkout|%{quantity} GB of storage"
msgstr ""
-msgid "Checkout|%{totalCiMinutes} CI minute"
-msgid_plural "Checkout|%{totalCiMinutes} CI minutes"
+msgid "Checkout|%{quantity} storage pack"
+msgid_plural "Checkout|%{quantity} storage packs"
msgstr[0] ""
msgstr[1] ""
+msgid "Checkout|%{selectedPlanText} plan"
+msgstr ""
+
+msgid "Checkout|%{startDate} - %{endDate}"
+msgstr ""
+
msgid "Checkout|%{totalCiMinutes} CI minutes"
msgstr ""
@@ -6632,6 +6703,9 @@ msgstr ""
msgid "Checkout|Failed to register credit card. Please try again."
msgstr ""
+msgid "Checkout|GB"
+msgstr ""
+
msgid "Checkout|GitLab group"
msgstr ""
@@ -6668,6 +6742,9 @@ msgstr ""
msgid "Checkout|State"
msgstr ""
+msgid "Checkout|Storage packs"
+msgstr ""
+
msgid "Checkout|Street address"
msgstr ""
@@ -6689,6 +6766,9 @@ msgstr ""
msgid "Checkout|Total minutes: %{quantity}"
msgstr ""
+msgid "Checkout|Total storage: %{quantity} GB"
+msgstr ""
+
msgid "Checkout|Users"
msgstr ""
@@ -6698,16 +6778,25 @@ msgstr ""
msgid "Checkout|Your organization"
msgstr ""
+msgid "Checkout|Your storage subscription has the same term as your main subscription, and the price is prorated accordingly."
+msgstr ""
+
msgid "Checkout|Your subscription will be applied to this group"
msgstr ""
msgid "Checkout|Zip code"
msgstr ""
+msgid "Checkout|a storage subscription"
+msgstr ""
+
msgid "Checkout|company or team"
msgstr ""
-msgid "Checkout|x 1,000 minutes per pack = %{strong}"
+msgid "Checkout|minutes"
+msgstr ""
+
+msgid "Checkout|x %{quantity} %{units} per pack ="
msgstr ""
msgid "Cherry-pick this commit"
@@ -7064,6 +7153,9 @@ msgstr ""
msgid "CloneIssue|Cannot clone issue to target project as it is pending deletion."
msgstr ""
+msgid "CloneIssue|Cannot clone issues of '%{issue_type}' type."
+msgstr ""
+
msgid "Cloned this issue to %{path_to_project}."
msgstr ""
@@ -7118,7 +7210,10 @@ msgstr ""
msgid "Closes this %{quick_action_target}."
msgstr ""
-msgid "Cloud licenses can not be removed."
+msgid "Cloud Functions description and apps that are suitable for this deployment target"
+msgstr ""
+
+msgid "Cloud Run description and apps that are suitable for this deployment target"
msgstr ""
msgid "Cluster"
@@ -7145,6 +7240,12 @@ msgstr ""
msgid "ClusterAgents|Access tokens"
msgstr ""
+msgid "ClusterAgents|Agent might not be connected to GitLab"
+msgstr ""
+
+msgid "ClusterAgents|Agent never connected to GitLab"
+msgstr ""
+
msgid "ClusterAgents|Alternative installation methods"
msgstr ""
@@ -7160,6 +7261,12 @@ msgstr ""
msgid "ClusterAgents|Configuration"
msgstr ""
+msgid "ClusterAgents|Connected"
+msgstr ""
+
+msgid "ClusterAgents|Connection status"
+msgstr ""
+
msgid "ClusterAgents|Copy token"
msgstr ""
@@ -7178,6 +7285,9 @@ msgstr ""
msgid "ClusterAgents|For alternative installation methods %{linkStart}go to the documentation%{linkEnd}."
msgstr ""
+msgid "ClusterAgents|For more troubleshooting information go to"
+msgstr ""
+
msgid "ClusterAgents|Go to the repository"
msgstr ""
@@ -7193,18 +7303,30 @@ msgstr ""
msgid "ClusterAgents|Integrate with the GitLab Agent"
msgstr ""
-msgid "ClusterAgents|Last used"
+msgid "ClusterAgents|Last connected %{timeAgo}."
+msgstr ""
+
+msgid "ClusterAgents|Last contact"
msgstr ""
msgid "ClusterAgents|Learn how to create an agent access token"
msgstr ""
+msgid "ClusterAgents|Make sure you are using a valid token."
+msgstr ""
+
msgid "ClusterAgents|Name"
msgstr ""
msgid "ClusterAgents|Never"
msgstr ""
+msgid "ClusterAgents|Never connected"
+msgstr ""
+
+msgid "ClusterAgents|Not connected"
+msgstr ""
+
msgid "ClusterAgents|Read more about getting started"
msgstr ""
@@ -7226,6 +7348,9 @@ msgstr ""
msgid "ClusterAgents|Select which Agent you want to install"
msgstr ""
+msgid "ClusterAgents|The Agent has not been connected in a long time. There might be a connectivity issue. Last contact was %{timeAgo}."
+msgstr ""
+
msgid "ClusterAgents|The GitLab Agent also requires %{linkStart}enabling the Agent Server%{linkEnd}"
msgstr ""
@@ -7253,9 +7378,6 @@ msgstr ""
msgid "ClusterAgents|You will need to create a token to connect to your agent"
msgstr ""
-msgid "ClusterAgent|This feature is only available for premium plans"
-msgstr ""
-
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -7445,9 +7567,6 @@ msgstr ""
msgid "ClusterIntegration|Create Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Create a provision role on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the account and external ID above. %{startMoreInfoLink}More information%{endLink}"
-msgstr ""
-
msgid "ClusterIntegration|Create cluster on"
msgstr ""
@@ -7880,7 +7999,7 @@ msgstr ""
msgid "ClusterIntegration|Subnets"
msgstr ""
-msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provisioned role, first create one on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the above account and external IDs. %{startMoreInfoLink}More information%{endLink}"
+msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provisioned role, first create one on %{awsLinkStart}Amazon Web Services %{awsLinkEnd} using the above account and external IDs. %{moreInfoStart}More information%{moreInfoEnd}"
msgstr ""
msgid "ClusterIntegration|The Kubernetes certificate used to authenticate to the cluster."
@@ -8114,6 +8233,9 @@ msgstr ""
msgid "Collapse replies"
msgstr ""
+msgid "Collapse settings section"
+msgstr ""
+
msgid "Collapse sidebar"
msgstr ""
@@ -8132,6 +8254,9 @@ msgstr ""
msgid "Comma-separated list of email addresses."
msgstr ""
+msgid "Comma-separated list of users allowed to exceed the rate limit."
+msgstr ""
+
msgid "Comma-separated, e.g. '1.1.1.1, 2.2.2.0/24'"
msgstr ""
@@ -8452,6 +8577,9 @@ msgstr ""
msgid "Configure %{repository_checks_link_start}repository checks%{link_end} and %{housekeeping_link_start}housekeeping%{link_end} on repositories."
msgstr ""
+msgid "Configure CAPTCHAs, IP address limits, and other anti-spam measures."
+msgstr ""
+
msgid "Configure Dependency Scanning in `.gitlab-ci.yml` using the GitLab managed template. You can [add variable overrides](https://docs.gitlab.com/ee/user/application_security/dependency_scanning/#customizing-the-dependency-scanning-settings) to customize Dependency Scanning settings."
msgstr ""
@@ -8488,16 +8616,13 @@ msgstr ""
msgid "Configure a %{codeStart}.gitlab-webide.yml%{codeEnd} file in the %{codeStart}.gitlab%{codeEnd} directory to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
msgstr ""
-msgid "Configure existing installation"
-msgstr ""
-
-msgid "Configure limit for notes created per minute by web and API requests."
+msgid "Configure advanced permissions, Large File Storage, and two-factor authentication settings."
msgstr ""
-msgid "Configure limits for Project/Group Import/Export."
+msgid "Configure approvals by authors and committers on all projects."
msgstr ""
-msgid "Configure limits for web and API requests."
+msgid "Configure existing installation"
msgstr ""
msgid "Configure paths to be protected by Rack Attack."
@@ -8512,10 +8637,13 @@ msgstr ""
msgid "Configure settings for Advanced Search with Elasticsearch."
msgstr ""
+msgid "Configure specific limits for Files API requests that supersede the general user and IP rate limits."
+msgstr ""
+
msgid "Configure specific limits for Git LFS requests that supersede the general user and IP rate limits."
msgstr ""
-msgid "Configure specific limits for Packages API requests that supersede the general user and IP rate limits."
+msgid "Configure specific limits for deprecated API requests that supersede the general user and IP rate limits."
msgstr ""
msgid "Configure the %{link} integration."
@@ -8527,6 +8655,9 @@ msgstr ""
msgid "Configure the way a user creates a new account."
msgstr ""
+msgid "Configure via Merge Request"
+msgstr ""
+
msgid "Configure which lists are shown for anyone who visits this board"
msgstr ""
@@ -8995,6 +9126,9 @@ msgstr ""
msgid "Content parsed with %{link}."
msgstr ""
+msgid "ContentEditor|Table of Contents"
+msgstr ""
+
msgid "ContentEditor|You have to provide a renderMarkdown function or a custom serializer"
msgstr ""
@@ -9181,6 +9315,9 @@ msgstr ""
msgid "Copy link to chart"
msgstr ""
+msgid "Copy prefix"
+msgstr ""
+
msgid "Copy reference"
msgstr ""
@@ -9211,6 +9348,9 @@ msgstr ""
msgid "Copy value"
msgstr ""
+msgid "Corpus Management"
+msgstr ""
+
msgid "Corpus Management|Are you sure you want to delete the corpus?"
msgstr ""
@@ -9439,6 +9579,9 @@ msgstr ""
msgid "Create commit"
msgstr ""
+msgid "Create common files more quickly, and standardize their format."
+msgstr ""
+
msgid "Create confidential merge request"
msgstr ""
@@ -9472,6 +9615,9 @@ msgstr ""
msgid "Create issue"
msgstr ""
+msgid "Create issue to resolve all threads"
+msgstr ""
+
msgid "Create iteration"
msgstr ""
@@ -9526,6 +9672,9 @@ msgstr ""
msgid "Create new..."
msgstr ""
+msgid "Create or import your first project"
+msgstr ""
+
msgid "Create project"
msgstr ""
@@ -9883,7 +10032,7 @@ msgstr ""
msgid "Custom notification events"
msgstr ""
-msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notificationLinkStart} notification emails%{notificationLinkEnd}."
+msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notificationLinkStart}notification emails%{notificationLinkEnd}."
msgstr ""
msgid "Custom project templates"
@@ -10082,10 +10231,10 @@ msgid_plural "CycleAnalytics|Showing %{subjectFilterText} and %{selectedLabelsCo
msgstr[0] ""
msgstr[1] ""
-msgid "CycleAnalytics|Showing data for group '%{groupName}' and %{selectedProjectCount} projects from %{startDate} to %{endDate}"
+msgid "CycleAnalytics|Showing data for group '%{groupName}' and %{selectedProjectCount} projects from %{createdAfter} to %{createdBefore}"
msgstr ""
-msgid "CycleAnalytics|Showing data for group '%{groupName}' from %{startDate} to %{endDate}"
+msgid "CycleAnalytics|Showing data for group '%{groupName}' from %{createdAfter} to %{createdBefore}"
msgstr ""
msgid "CycleAnalytics|Stages"
@@ -10319,6 +10468,9 @@ msgstr ""
msgid "DastProfiles|Manage profiles"
msgstr ""
+msgid "DastProfiles|Manage site profiles"
+msgstr ""
+
msgid "DastProfiles|Minimum = 0 (no timeout enabled), Maximum = 2880 minutes"
msgstr ""
@@ -10394,6 +10546,9 @@ msgstr ""
msgid "DastProfiles|Scanner name"
msgstr ""
+msgid "DastProfiles|Schedule"
+msgstr ""
+
msgid "DastProfiles|Select branch"
msgstr ""
@@ -10463,7 +10618,7 @@ msgstr ""
msgid "DastProfiles|Website"
msgstr ""
-msgid "DastProfiles|You can either choose a passive scan or validate the target site in your chosen site profile. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
+msgid "DastProfiles|You can either choose a passive scan or validate the target site from the site profile management page. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
msgstr ""
msgid "DastProfiles|You cannot run an active scan against an unvalidated site."
@@ -10636,7 +10791,7 @@ msgstr ""
msgid "Days to merge"
msgstr ""
-msgid "Deactivate dormant users after 90 days of inactivity. Users can return to active status by signing in to their account. While inactive, a user is not counted as an active user in the instance."
+msgid "Deactivate dormant users after 90 days of inactivity"
msgstr ""
msgid "Dear Administrator,"
@@ -10723,10 +10878,10 @@ msgstr ""
msgid "Define a custom pattern with cron syntax"
msgstr ""
-msgid "Define approval settings."
+msgid "Define approval rules."
msgstr ""
-msgid "Define approval settings. %{linkStart}Learn more.%{linkEnd}"
+msgid "Define approval rules. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "Define custom rules for what constitutes spam, independent of Akismet"
@@ -10735,7 +10890,7 @@ msgstr ""
msgid "Define environments in the deploy stage(s) in %{code_open}.gitlab-ci.yml%{code_close} to track deployments here."
msgstr ""
-msgid "Define how approval rules are applied as a merge request moves toward completion."
+msgid "Define how approval rules are applied to merge requests."
msgstr ""
msgid "Definition"
@@ -10750,6 +10905,12 @@ msgstr ""
msgid "DelayedJobs|Are you sure you want to run %{job_name} immediately? This job will run automatically after it's timer finishes."
msgstr ""
+msgid "DelayedJobs|Are you sure you want to run %{job_name} immediately? This job will run automatically after its timer finishes."
+msgstr ""
+
+msgid "DelayedJobs|Run the delayed job now?"
+msgstr ""
+
msgid "DelayedJobs|Start now"
msgstr ""
@@ -11026,6 +11187,12 @@ msgstr ""
msgid "Dependency proxy image prefix"
msgstr ""
+msgid "DependencyProxy|Create a local proxy for storing frequently used upstream images. %{docLinkStart}Learn more%{docLinkEnd} about dependency proxies."
+msgstr ""
+
+msgid "DependencyProxy|Dependency Proxy"
+msgstr ""
+
msgid "DependencyProxy|Toggle Dependency Proxy"
msgstr ""
@@ -11266,6 +11433,9 @@ msgstr ""
msgid "Deployments"
msgstr ""
+msgid "Deployments to Google Kubernetes Engine can be "
+msgstr ""
+
msgid "Deployments|%{deployments} environment impacted."
msgid_plural "Deployments|%{deployments} environments impacted."
msgstr[0] ""
@@ -11295,6 +11465,9 @@ msgstr ""
msgid "Deployment|success"
msgstr ""
+msgid "Deprecated API rate limits"
+msgstr ""
+
msgid "Deprioritize label"
msgstr ""
@@ -11697,6 +11870,16 @@ msgstr ""
msgid "DiffsCompareBaseBranch|(base)"
msgstr ""
+msgid "Diffs|%d addition"
+msgid_plural "Diffs|%d additions"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Diffs|%d deletion"
+msgid_plural "Diffs|%d deletions"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Diffs|No file name available"
msgstr ""
@@ -11706,9 +11889,17 @@ msgstr ""
msgid "Diffs|Show all unchanged lines"
msgstr ""
+msgid "Diffs|Showing %{dropdownStart}%{count} changed file%{dropdownEnd}"
+msgid_plural "Diffs|Showing %{dropdownStart}%{count} changed files%{dropdownEnd}"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Diffs|Something went wrong while fetching diff lines."
msgstr ""
+msgid "Diffs|with %{additions} and %{deletions}"
+msgstr ""
+
msgid "Direct member"
msgstr ""
@@ -11834,9 +12025,6 @@ msgid_plural "Dismiss %d selected vulnerabilities as"
msgstr[0] ""
msgstr[1] ""
-msgid "Dismiss Value Stream Analytics introduction box"
-msgstr ""
-
msgid "Dismiss merge request promotion"
msgstr ""
@@ -12158,6 +12346,9 @@ msgstr ""
msgid "Edit issues"
msgstr ""
+msgid "Edit merge requests"
+msgstr ""
+
msgid "Edit public deploy key"
msgstr ""
@@ -12233,6 +12424,9 @@ msgstr ""
msgid "Elastic|None. Select projects to index."
msgstr ""
+msgid "Eligible users"
+msgstr ""
+
msgid "Email"
msgstr ""
@@ -12362,6 +12556,9 @@ msgstr ""
msgid "Enable"
msgstr ""
+msgid "Enable Amazon EKS integration"
+msgstr ""
+
msgid "Enable Auto DevOps"
msgstr ""
@@ -12395,6 +12592,9 @@ msgstr ""
msgid "Enable SSL verification"
msgstr ""
+msgid "Enable Service Ping"
+msgstr ""
+
msgid "Enable Snowplow tracking"
msgstr ""
@@ -12425,6 +12625,9 @@ msgstr ""
msgid "Enable authenticated Git LFS request rate limit"
msgstr ""
+msgid "Enable authenticated web request rate limit"
+msgstr ""
+
msgid "Enable authentication"
msgstr ""
@@ -12485,7 +12688,7 @@ msgstr ""
msgid "Enable or disable the Pseudonymizer data collection."
msgstr ""
-msgid "Enable or disable version check and service ping."
+msgid "Enable or disable version check and Service Ping."
msgstr ""
msgid "Enable protected paths rate limit"
@@ -12497,18 +12700,12 @@ msgstr ""
msgid "Enable reCAPTCHA"
msgstr ""
-msgid "Enable reCAPTCHA for login"
-msgstr ""
-
-msgid "Enable reCAPTCHA, Invisible Captcha, Akismet and set IP limits. For reCAPTCHA, we currently only support %{recaptcha_v2_link_start}v2%{recaptcha_v2_link_end}"
+msgid "Enable reCAPTCHA for login."
msgstr ""
msgid "Enable repository checks"
msgstr ""
-msgid "Enable service ping"
-msgstr ""
-
msgid "Enable shared runners for all projects and subgroups in this group."
msgstr ""
@@ -12530,7 +12727,10 @@ msgstr ""
msgid "Enable unauthenticated API request rate limit"
msgstr ""
-msgid "Enable unauthenticated request rate limit"
+msgid "Enable unauthenticated web request rate limit"
+msgstr ""
+
+msgid "Enable user deactivation emails"
msgstr ""
msgid "Enable version check"
@@ -12566,9 +12766,6 @@ msgstr ""
msgid "Enabled sources for code import during project creation. OmniAuth must be configured for GitHub"
msgstr ""
-msgid "Enabling this will only make licensed EE features available to projects if the project namespace's plan includes the feature or if the project is public."
-msgstr ""
-
msgid "Encountered an error while rendering: %{err}"
msgstr ""
@@ -12617,9 +12814,6 @@ msgstr ""
msgid "Enter Admin Mode"
msgstr ""
-msgid "Enter IP address range"
-msgstr ""
-
msgid "Enter a number"
msgstr ""
@@ -12632,9 +12826,6 @@ msgstr ""
msgid "Enter at least three characters to search"
msgstr ""
-msgid "Enter domain"
-msgstr ""
-
msgid "Enter in your Bitbucket Server URL and personal access token below"
msgstr ""
@@ -12821,9 +13012,6 @@ msgstr ""
msgid "Environments|Deployment %{status}"
msgstr ""
-msgid "Environments|Dismiss"
-msgstr ""
-
msgid "Environments|Enable review app"
msgstr ""
@@ -12836,9 +13024,6 @@ msgstr ""
msgid "Environments|Environments are places where code gets deployed, such as staging or production."
msgstr ""
-msgid "Environments|Help us improve environments"
-msgstr ""
-
msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
msgstr ""
@@ -12875,6 +13060,9 @@ msgstr ""
msgid "Environments|Note that this action will stop the environment, but it will %{emphasisStart}not%{emphasisEnd} have an effect on any existing deployment due to no “stop environment action†being defined in the %{ciConfigLinkStart}.gitlab-ci.yml%{ciConfigLinkEnd} file."
msgstr ""
+msgid "Environments|Open"
+msgstr ""
+
msgid "Environments|Open live environment"
msgstr ""
@@ -12914,9 +13102,6 @@ msgstr ""
msgid "Environments|Stopping %{environmentName}"
msgstr ""
-msgid "Environments|Take the survey"
-msgstr ""
-
msgid "Environments|There was an error fetching the logs. Please try again."
msgstr ""
@@ -12938,9 +13123,6 @@ msgstr ""
msgid "Environments|You don't have any environments right now"
msgstr ""
-msgid "Environments|Your feedback helps GitLab make environments better for you and other users. Participate and enter a sweepstake to win a USD 30 gift card."
-msgstr ""
-
msgid "Environments|by %{avatar}"
msgstr ""
@@ -13223,7 +13405,7 @@ msgstr ""
msgid "Error parsing CSV file. Please make sure it has"
msgstr ""
-msgid "Error rendering markdown preview"
+msgid "Error rendering Markdown preview"
msgstr ""
msgid "Error saving label update."
@@ -13271,6 +13453,9 @@ msgstr ""
msgid "Error: %{error_message}"
msgstr ""
+msgid "Error: Couldn't load some or all of the changes."
+msgstr ""
+
msgid "Error: No AWS credentials were supplied"
msgstr ""
@@ -13304,6 +13489,9 @@ msgstr ""
msgid "ErrorTracking|Enable error tracking"
msgstr ""
+msgid "ErrorTracking|Error tracking backend"
+msgstr ""
+
msgid "ErrorTracking|If you self-host Sentry, enter your Sentry instance's full URL. If you use Sentry's hosted solution, enter https://sentry.io"
msgstr ""
@@ -13337,6 +13525,12 @@ msgstr ""
msgid "Escalation policies must have at least one rule"
msgstr ""
+msgid "EscalationPolicies|%{clockIcon} IF alert is not %{alertStatus} in %{minutes}"
+msgstr ""
+
+msgid "EscalationPolicies|%{notificationIcon} THEN %{doAction} %{forScheduleOrUser}"
+msgstr ""
+
msgid "EscalationPolicies|+ Add an additional rule"
msgstr ""
@@ -13379,13 +13573,13 @@ msgstr ""
msgid "EscalationPolicies|Escalation policies"
msgstr ""
-msgid "EscalationPolicies|Escalation rules"
+msgid "EscalationPolicies|Escalation policy %{obstacle} in Project %{project}"
msgstr ""
-msgid "EscalationPolicies|Failed to load oncall-schedules"
+msgid "EscalationPolicies|Escalation rules"
msgstr ""
-msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} %{then} THEN %{doAction} %{scheduleOrUser}"
+msgid "EscalationPolicies|Failed to load oncall-schedules"
msgstr ""
msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} minutes"
@@ -13463,18 +13657,36 @@ msgstr ""
msgid "Every %{action} attempt has failed: %{job_error_message}. Please try again."
msgstr ""
+msgid "Every 3 months"
+msgstr ""
+
+msgid "Every 3 months on the %{day} at %{time} %{timezone}"
+msgstr ""
+
+msgid "Every 6 months"
+msgstr ""
+
+msgid "Every 6 months on the %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Every day"
msgstr ""
msgid "Every day (at %{time})"
msgstr ""
+msgid "Every day at %{time} %{timezone}"
+msgstr ""
+
msgid "Every month"
msgstr ""
msgid "Every month (Day %{day} at %{time})"
msgstr ""
+msgid "Every month on the %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Every three months"
msgstr ""
@@ -13489,6 +13701,15 @@ msgstr[1] ""
msgid "Every week (%{weekday} at %{time})"
msgstr ""
+msgid "Every week on %{day} at %{time} %{timezone}"
+msgstr ""
+
+msgid "Every year"
+msgstr ""
+
+msgid "Every year on %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Everyone"
msgstr ""
@@ -13525,9 +13746,6 @@ msgstr ""
msgid "Exactly one of %{attributes} is required"
msgstr ""
-msgid "Example: %{ip_address}. %{read_more_link}."
-msgstr ""
-
msgid "Example: @sub\\.company\\.com$"
msgstr ""
@@ -13594,13 +13812,13 @@ msgstr ""
msgid "Expand pipeline"
msgstr ""
-msgid "Expand sidebar"
+msgid "Expand settings section"
msgstr ""
-msgid "Expected documents: %{expected_documents}"
+msgid "Expand sidebar"
msgstr ""
-msgid "Experienced"
+msgid "Expected documents: %{expected_documents}"
msgstr ""
msgid "ExperimentSubject|Must have exactly one of User, Namespace, or Project."
@@ -13885,9 +14103,6 @@ msgstr ""
msgid "Failed to load related branches"
msgstr ""
-msgid "Failed to load sidebar lock status"
-msgstr ""
-
msgid "Failed to load stacktrace."
msgstr ""
@@ -14312,6 +14527,9 @@ msgstr ""
msgid "Files"
msgstr ""
+msgid "Files API Rate Limits"
+msgstr ""
+
msgid "Files breadcrumb"
msgstr ""
@@ -15311,6 +15529,9 @@ msgstr ""
msgid "GitLab group: %{source_link}"
msgstr ""
+msgid "GitLab informs you if a new version is available."
+msgstr ""
+
msgid "GitLab is a complete DevOps platform, delivered as a single application, fundamentally changing the way Development, Security, and Ops teams collaborate"
msgstr ""
@@ -15326,7 +15547,7 @@ msgstr ""
msgid "GitLab is open source software to collaborate on code."
msgstr ""
-msgid "GitLab is undergoing maintenance and is operating in a read-only mode."
+msgid "GitLab is undergoing maintenance and is operating in read-only mode."
msgstr ""
msgid "GitLab member or Email address"
@@ -15338,9 +15559,6 @@ msgstr ""
msgid "GitLab project export"
msgstr ""
-msgid "GitLab restart is required to apply changes."
-msgstr ""
-
msgid "GitLab single sign-on URL"
msgstr ""
@@ -15356,9 +15574,6 @@ msgstr ""
msgid "GitLab version"
msgstr ""
-msgid "GitLab will inform you if a new version is available."
-msgstr ""
-
msgid "GitLab will run a background job that will produce pseudonymized CSVs of the GitLab database that will be uploaded to your configured object storage directory."
msgstr ""
@@ -15623,9 +15838,21 @@ msgstr ""
msgid "Go to snippets"
msgstr ""
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check 'Allowed domains for sign-ups'."
+msgstr ""
+
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check 'Email restrictions for sign-ups'."
+msgstr ""
+
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check the 'Domain denylist'."
+msgstr ""
+
msgid "Go to the activity feed"
msgstr ""
+msgid "Go to the group’s 'Settings &gt; General' page, and check 'Restrict membership by email domain'."
+msgstr ""
+
msgid "Go to the milestone list"
msgstr ""
@@ -15662,6 +15889,12 @@ msgstr ""
msgid "Goal of the changes and what reviewers should be aware of"
msgstr ""
+msgid "Google Cloud"
+msgstr ""
+
+msgid "Google Cloud offers several deployment targets. Select the one most suitable for your project."
+msgstr ""
+
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
@@ -15746,9 +15979,6 @@ msgstr ""
msgid "Group ID"
msgstr ""
-msgid "Group ID: %{group_id}"
-msgstr ""
-
msgid "Group Owner must have signed in with SAML before enabling Group Managed Accounts"
msgstr ""
@@ -15923,6 +16153,12 @@ msgstr ""
msgid "GroupImport|Unable to process group import file"
msgstr ""
+msgid "GroupPage|Copy group ID"
+msgstr ""
+
+msgid "GroupPage|Group ID: %{group_id}"
+msgstr ""
+
msgid "GroupRoadmap|%{dateWord} – No end date"
msgstr ""
@@ -15977,6 +16213,9 @@ msgstr ""
msgid "GroupRoadmap|Within 3 years"
msgstr ""
+msgid "GroupSAML|\"persistent\" recommended"
+msgstr ""
+
msgid "GroupSAML|%{strongOpen}Warning%{strongClose} - Enabling %{linkStart}SSO enforcement%{linkEnd} can reduce security risks."
msgstr ""
@@ -16109,6 +16348,9 @@ msgstr ""
msgid "GroupSAML|To be able to prohibit outer forks, you first need to enforce dedicate group managed accounts."
msgstr ""
+msgid "GroupSAML|Use SAML group links to manage group membership using SAML."
+msgstr ""
+
msgid "GroupSAML|Valid SAML Response"
msgstr ""
@@ -16121,13 +16363,10 @@ msgstr ""
msgid "GroupSAML|as %{access_level}"
msgstr ""
-msgid "GroupSAML|must match stored NameID of \"%{extern_uid}\" as we use this to identify users. If the NameID changes users will be unable to sign in."
-msgstr ""
-
-msgid "GroupSAML|should be \"persistent\""
+msgid "GroupSAML|must match stored NameID of \"%{extern_uid}\" to identify user and allow sign in"
msgstr ""
-msgid "GroupSAML|should be a random persistent ID, emails are discouraged"
+msgid "GroupSAML|recommend persistent ID instead of email"
msgstr ""
msgid "GroupSelect|No matching results"
@@ -16142,9 +16381,15 @@ msgstr ""
msgid "GroupSettings|Allow project access token creation"
msgstr ""
+msgid "GroupSettings|Applied to all subgroups unless overridden by a group owner. Groups already added to the project lose access."
+msgstr ""
+
msgid "GroupSettings|Auto DevOps pipeline was updated for the group"
msgstr ""
+msgid "GroupSettings|Available only on the top-level group. Applies to all subgroups. Groups already shared with a group outside %{group} are still shared unless removed manually."
+msgstr ""
+
msgid "GroupSettings|Badges"
msgstr ""
@@ -16196,6 +16441,9 @@ msgstr ""
msgid "GroupSettings|New runners registration token has been generated!"
msgstr ""
+msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgstr ""
+
msgid "GroupSettings|Pipeline settings was updated for the group"
msgstr ""
@@ -16208,12 +16456,15 @@ msgstr ""
msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
-msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups."
+msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups"
msgstr ""
msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
msgstr ""
+msgid "GroupSettings|Prevents group members from being notified if the group is mentioned."
+msgstr ""
+
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
msgstr ""
@@ -16250,21 +16501,6 @@ msgstr ""
msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}."
msgstr ""
-msgid "GroupSettings|This setting is only available on the top-level group and it applies to all subgroups. Groups that have already been shared with a group outside %{group} will still be shared, and this access will have to be revoked manually."
-msgstr ""
-
-msgid "GroupSettings|This setting will be applied to all subgroups unless overridden by a group owner. Groups that already have access to the project will continue to have access unless removed manually."
-msgstr ""
-
-msgid "GroupSettings|This setting will override user notification preferences for all members of the group, subgroups, and projects."
-msgstr ""
-
-msgid "GroupSettings|This setting will prevent group members from being notified if the group is mentioned."
-msgstr ""
-
-msgid "GroupSettings|This setting will prevent group members from forking projects outside of the group."
-msgstr ""
-
msgid "GroupSettings|Transfer group"
msgstr ""
@@ -16382,7 +16618,7 @@ msgstr ""
msgid "GroupsNew|No import options available"
msgstr ""
-msgid "GroupsNew|Not all related objects are migrated, as %{docs_link_start}described here%{docs_link_end}. Please %{feedback_link_start}leave feedback%{feedback_link_end} on this feature."
+msgid "GroupsNew|Not all related objects are migrated. %{docs_link_start}More info%{docs_link_end}."
msgstr ""
msgid "GroupsNew|Personal access token"
@@ -16514,15 +16750,27 @@ msgstr ""
msgid "Hello %{name},"
msgstr ""
-msgid "Hello there"
-msgstr ""
-
msgid "Hello, %{name}!"
msgstr ""
msgid "Hello, %{username}!"
msgstr ""
+msgid "HelloMessage|%{handshake_emoji} Contribute to GitLab: %{contribute_link}"
+msgstr ""
+
+msgid "HelloMessage|%{magnifier_emoji} Create a new GitLab issue: %{new_issue_link}"
+msgstr ""
+
+msgid "HelloMessage|%{rocket_emoji} We like your curiosity! Help us improve GitLab by joining the team: %{jobs_page_link}"
+msgstr ""
+
+msgid "HelloMessage|Does this page need fixes or improvements? Open an issue or contribute a merge request to help make GitLab more lovable. At GitLab, everyone can contribute!"
+msgstr ""
+
+msgid "HelloMessage|Welcome to GitLab!"
+msgstr ""
+
msgid "Help"
msgstr ""
@@ -16532,13 +16780,10 @@ msgstr ""
msgid "Helps prevent bots from creating accounts."
msgstr ""
-msgid "Helps prevent bots from creating issues"
-msgstr ""
-
-msgid "Helps prevent malicious users hide their activity"
+msgid "Helps prevent bots from creating issues."
msgstr ""
-msgid "Helps reduce request volume (e.g. from crawlers or abusive bots)"
+msgid "Helps prevent malicious users hide their activity."
msgstr ""
msgid "Helps reduce request volume (for example, from crawlers or abusive bots)"
@@ -16662,6 +16907,12 @@ msgstr ""
msgid "Housekeeping, export, path, transfer, remove, archive."
msgstr ""
+msgid "How do I configure Akismet?"
+msgstr ""
+
+msgid "How do I configure it?"
+msgstr ""
+
msgid "How do I configure runners?"
msgstr ""
@@ -16683,19 +16934,25 @@ msgstr ""
msgid "How do I set up this service?"
msgstr ""
+msgid "How do I use a web terminal?"
+msgstr ""
+
+msgid "How do I use file templates?"
+msgstr ""
+
msgid "How it works"
msgstr ""
msgid "How many days need to pass between marking entity for deletion and actual removing it."
msgstr ""
-msgid "How many seconds an IP will be counted towards the limit"
+msgid "How many seconds an IP counts toward the IP address limit."
msgstr ""
-msgid "I accept the %{terms_link}"
+msgid "How the job limiter handles jobs exceeding the thresholds specified below. The 'track' mode only logs the jobs. The 'compress' mode compresses the jobs and raises an exception if the compressed size exceeds the limit."
msgstr ""
-msgid "I accept the|Terms of Service and Privacy Policy"
+msgid "I accept the %{terms_link}"
msgstr ""
msgid "I forgot my password"
@@ -16779,13 +17036,16 @@ msgstr ""
msgid "IP Address"
msgstr ""
-msgid "IP expiration time"
+msgid "IP address expiration time"
msgstr ""
-msgid "IP subnet restriction only allowed for top-level groups"
+msgid "IP address restrictions"
+msgstr ""
+
+msgid "IP addresses per user"
msgstr ""
-msgid "IPs per user"
+msgid "IP subnet restriction only allowed for top-level groups"
msgstr ""
msgid "Identifier"
@@ -16800,6 +17060,9 @@ msgstr ""
msgid "If any indexed field exceeds this limit it will be truncated to this number of characters and the rest will not be indexed or searchable. This does not apply to repository and wiki indexing. Setting this to 0 means it is unlimited."
msgstr ""
+msgid "If blank, defaults to %{code_open}Retry later%{code_close}."
+msgstr ""
+
msgid "If blank, set allowable lifetime to %{instance_level_policy_in_words}, as defined by the instance admin. Once set, existing tokens for users in this group may be revoked."
msgstr ""
@@ -16851,6 +17114,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 did not initiate these sign-in attempts, please reach out to your administrator or enable two-factor authentication (2FA) on your account."
+msgstr ""
+
msgid "If you did not initiate this change, please contact your administrator immediately."
msgstr ""
@@ -16942,10 +17208,10 @@ msgstr ""
msgid "Import Projects from Gitea"
msgstr ""
-msgid "Import a project"
+msgid "Import an exported GitLab project"
msgstr ""
-msgid "Import an exported GitLab project"
+msgid "Import and export rate limits"
msgstr ""
msgid "Import failed due to a GitHub error: %{original}"
@@ -16957,12 +17223,18 @@ msgstr ""
msgid "Import from Jira"
msgstr ""
+msgid "Import group"
+msgstr ""
+
msgid "Import group from file"
msgstr ""
msgid "Import groups"
msgstr ""
+msgid "Import history"
+msgstr ""
+
msgid "Import in progress"
msgstr ""
@@ -17026,7 +17298,25 @@ msgstr ""
msgid "Import timed out. Import took longer than %{import_jobs_expiration} seconds"
msgstr ""
-msgid "Import/Export Rate Limits"
+msgid "ImportAProjectModal|Import from a project"
+msgstr ""
+
+msgid "ImportAProjectModal|Import members from another project"
+msgstr ""
+
+msgid "ImportAProjectModal|Import project members"
+msgstr ""
+
+msgid "ImportAProjectModal|Only project members (not group members) are imported, and they get the same permissions as the project you import from."
+msgstr ""
+
+msgid "ImportAProjectModal|Successfully imported"
+msgstr ""
+
+msgid "ImportAProjectModal|Unable to import project members"
+msgstr ""
+
+msgid "ImportAProjectModal|You're importing members to the %{strongStart}%{name}%{strongEnd} project."
msgstr ""
msgid "ImportButtons|Connect repositories from"
@@ -17079,7 +17369,7 @@ msgstr[1] ""
msgid "Importing..."
msgstr ""
-msgid "Import|A repository URL usually ends in a .git suffix, although this is not required. Double check to make sure your repository URL is correct."
+msgid "Import|There is not a valid Git repository at this URL. If your HTTP repository is not publicly accessible, verify your credentials."
msgstr ""
msgid "Improve customer support with Service Desk"
@@ -17088,9 +17378,6 @@ msgstr ""
msgid "Improves Git cloning performance."
msgstr ""
-msgid "In %{time_to_now}"
-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 ""
@@ -17376,7 +17663,7 @@ msgstr ""
msgid "InProductMarketing|Start a GitLab Ultimate trial today in less than one minute, no credit card required."
msgstr ""
-msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no CC required"
+msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no credit card required"
msgstr ""
msgid "InProductMarketing|Start a trial"
@@ -17415,7 +17702,7 @@ msgstr ""
msgid "InProductMarketing|Team up in GitLab for greater efficiency"
msgstr ""
-msgid "InProductMarketing|Team work makes the dream work"
+msgid "InProductMarketing|Team work makes the dream work"
msgstr ""
msgid "InProductMarketing|Test, create, deploy"
@@ -17996,6 +18283,9 @@ msgstr ""
msgid "Integrations|Create new issue in Jira"
msgstr ""
+msgid "Integrations|Create new issue in ZenTao"
+msgstr ""
+
msgid "Integrations|Default settings are inherited from the group level."
msgstr ""
@@ -18089,9 +18379,15 @@ msgstr ""
msgid "Integrations|Search Jira issues"
msgstr ""
+msgid "Integrations|Search ZenTao issues"
+msgstr ""
+
msgid "Integrations|Send notifications about project events to Unify Circuit."
msgstr ""
+msgid "Integrations|Send notifications about project events to a Unify Circuit conversation. %{docs_link}"
+msgstr ""
+
msgid "Integrations|Sign in to add namespaces"
msgstr ""
@@ -18131,6 +18427,9 @@ msgstr ""
msgid "Integrations|You've activated every integration 🎉"
msgstr ""
+msgid "Integrations|ZenTao issues display here when you create issues in your project in ZenTao."
+msgstr ""
+
msgid "Interactive mode"
msgstr ""
@@ -18158,9 +18457,6 @@ msgstr ""
msgid "Interval Pattern"
msgstr ""
-msgid "Introducing Value Stream Analytics"
-msgstr ""
-
msgid "Introducing Your DevOps Report"
msgstr ""
@@ -18257,6 +18553,12 @@ msgstr ""
msgid "Investigate vulnerability: %{title}"
msgstr ""
+msgid "Invisible Captcha"
+msgstr ""
+
+msgid "Invisible Captcha helps prevent the creation of spam accounts. It adds a honeypot field and time-sensitive form submission to the account signup form."
+msgstr ""
+
msgid "Invitation"
msgstr ""
@@ -18710,12 +19012,18 @@ msgstr ""
msgid "Issues"
msgstr ""
+msgid "Issues I've created"
+msgstr ""
+
msgid "Issues Rate Limits"
msgstr ""
msgid "Issues and merge requests"
msgstr ""
+msgid "Issues assigned to me"
+msgstr ""
+
msgid "Issues can be bugs, tasks or ideas to be discussed. Also, issues are searchable and filterable."
msgstr ""
@@ -18827,7 +19135,7 @@ msgstr ""
msgid "Iterations|Create cadence"
msgstr ""
-msgid "Iterations|Create your first iteration"
+msgid "Iterations|Create iteration"
msgstr ""
msgid "Iterations|Delete cadence"
@@ -18836,6 +19144,9 @@ msgstr ""
msgid "Iterations|Delete iteration cadence?"
msgstr ""
+msgid "Iterations|Delete iteration?"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -18869,12 +19180,18 @@ msgstr ""
msgid "Iterations|New iteration cadence"
msgstr ""
+msgid "Iterations|No closed iterations."
+msgstr ""
+
msgid "Iterations|No iteration cadences to show."
msgstr ""
msgid "Iterations|No iterations in cadence."
msgstr ""
+msgid "Iterations|No open iterations."
+msgstr ""
+
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
@@ -18905,6 +19222,9 @@ msgstr ""
msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
msgstr ""
+msgid "Iterations|This will remove the iteration from any issues that are assigned to it."
+msgstr ""
+
msgid "Iterations|Title"
msgstr ""
@@ -18920,15 +19240,9 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "I’m familiar with the basics of DevOps."
-msgstr ""
-
msgid "I’m joining my team who’s already on GitLab"
msgstr ""
-msgid "I’m not familiar with the basics of DevOps."
-msgstr ""
-
msgid "Jaeger URL"
msgstr ""
@@ -19193,6 +19507,9 @@ msgstr ""
msgid "Job"
msgstr ""
+msgid "Job %{jobName}"
+msgstr ""
+
msgid "Job Failed #%{build_id}"
msgstr ""
@@ -19783,9 +20100,6 @@ msgstr ""
msgid "Learn more in the"
msgstr ""
-msgid "Learn more in the|pipeline schedules documentation"
-msgstr ""
-
msgid "Learn more."
msgstr ""
@@ -19897,9 +20211,6 @@ msgstr ""
msgid "Leave Admin Mode"
msgstr ""
-msgid "Leave blank for no limit. Once set, existing personal access tokens may be revoked."
-msgstr ""
-
msgid "Leave edit mode? All unsaved changes will be lost."
msgstr ""
@@ -19945,10 +20256,10 @@ msgstr ""
msgid "LicenseCompliance|Acceptable license to be used in the project"
msgstr ""
-msgid "LicenseCompliance|Add a license"
+msgid "LicenseCompliance|Add license and related policy"
msgstr ""
-msgid "LicenseCompliance|Add license and related policy"
+msgid "LicenseCompliance|Add license policy"
msgstr ""
msgid "LicenseCompliance|Allow"
@@ -20038,6 +20349,9 @@ msgstr ""
msgid "LicenseManagement|Uncategorized"
msgstr ""
+msgid "Licensed Enterprise Edition features can be used if the project namespace's plan includes the feature, or if the project is public."
+msgstr ""
+
msgid "Licensed Features"
msgstr ""
@@ -20104,7 +20418,10 @@ msgstr ""
msgid "Limit namespaces and projects that can be indexed"
msgstr ""
-msgid "Limit sign in from multiple ips"
+msgid "Limit project size at a global, group, and project level. %{link_start}Learn more%{link_end}."
+msgstr ""
+
+msgid "Limit sign in from multiple IP addresses"
msgstr ""
msgid "Limit the number of concurrent operations this secondary site can run in the background."
@@ -20116,11 +20433,17 @@ msgstr ""
msgid "Limit the number of issues and epics per minute a user can create through web and API requests."
msgstr ""
+msgid "Limit the size of Sidekiq jobs stored in Redis."
+msgstr ""
+
msgid "Limited to showing %d event at most"
msgid_plural "Limited to showing %d events at most"
msgstr[0] ""
msgstr[1] ""
+msgid "Limiting mode"
+msgstr ""
+
msgid "Line changes"
msgstr ""
@@ -20190,9 +20513,6 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
-msgid "List of users to be excluded from the limit"
-msgstr ""
-
msgid "List options"
msgstr ""
@@ -20232,9 +20552,6 @@ msgstr ""
msgid "Loading functions timed out. Please reload the page to try again."
msgstr ""
-msgid "Loading issues"
-msgstr ""
-
msgid "Loading more"
msgstr ""
@@ -20526,6 +20843,9 @@ msgstr ""
msgid "Marked For Deletion At - %{deletion_time}"
msgstr ""
+msgid "Marked as ready. Merging is now allowed."
+msgstr ""
+
msgid "Marked this %{noun} as a draft."
msgstr ""
@@ -20598,52 +20918,22 @@ msgstr ""
msgid "Max 100,000 events"
msgstr ""
-msgid "Max 20 characters"
-msgstr ""
-
-msgid "Max Group Export Download requests per minute per user"
-msgstr ""
-
-msgid "Max Group Export requests per minute per user"
-msgstr ""
-
-msgid "Max Group Import requests per minute per user"
-msgstr ""
-
-msgid "Max Project Export Download requests per minute per user"
-msgstr ""
-
-msgid "Max Project Export requests per minute per user"
-msgstr ""
-
-msgid "Max Project Import requests per minute per user"
-msgstr ""
-
-msgid "Max authenticated API requests per period per user"
-msgstr ""
-
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
-msgid "Max authenticated web requests per period per user"
-msgstr ""
-
msgid "Max file size is 200 KB."
msgstr ""
-msgid "Max requests per minute per user"
-msgstr ""
-
msgid "Max role"
msgstr ""
msgid "Max session time"
msgstr ""
-msgid "Max unauthenticated requests per period per IP"
+msgid "MaxBuilds"
msgstr ""
-msgid "MaxBuilds"
+msgid "Maximum 20 characters"
msgstr ""
msgid "Maximum Conan package file size in bytes"
@@ -20679,6 +20969,12 @@ msgstr ""
msgid "Maximum attachment size (MB)"
msgstr ""
+msgid "Maximum authenticated API requests per rate limit period per user"
+msgstr ""
+
+msgid "Maximum authenticated web requests per rate limit period per user"
+msgstr ""
+
msgid "Maximum bulk request size (MiB)"
msgstr ""
@@ -20724,6 +21020,15 @@ msgstr ""
msgid "Maximum files in a diff"
msgstr ""
+msgid "Maximum group export download requests per minute"
+msgstr ""
+
+msgid "Maximum group export requests per minute"
+msgstr ""
+
+msgid "Maximum group import requests per minute"
+msgstr ""
+
msgid "Maximum import size"
msgstr ""
@@ -20760,7 +21065,7 @@ msgstr ""
msgid "Maximum number of projects."
msgstr ""
-msgid "Maximum number of unique IPs per user"
+msgid "Maximum number of unique IP addresses per user."
msgstr ""
msgid "Maximum page reached"
@@ -20769,12 +21074,24 @@ msgstr ""
msgid "Maximum page size"
msgstr ""
+msgid "Maximum project export download requests per minute"
+msgstr ""
+
+msgid "Maximum project export requests per minute"
+msgstr ""
+
+msgid "Maximum project import requests per minute"
+msgstr ""
+
msgid "Maximum push size"
msgstr ""
msgid "Maximum push size (MB)"
msgstr ""
+msgid "Maximum requests per minute"
+msgstr ""
+
msgid "Maximum running slices"
msgstr ""
@@ -20802,10 +21119,16 @@ msgstr ""
msgid "Maximum time between updates that a mirror can have when scheduled to synchronize."
msgstr ""
-msgid "Maximum time for web terminal websocket connection (in seconds). 0 for unlimited."
+msgid "Maximum time that users are allowed to skip the setup of two-factor authentication (in hours). Set to 0 (zero) to enforce at next sign in."
msgstr ""
-msgid "Maximum time that users are allowed to skip the setup of two-factor authentication (in hours). Set to 0 (zero) to enforce at next sign in."
+msgid "Maximum time, in seconds, for a web terminal websocket connection. 0 for unlimited."
+msgstr ""
+
+msgid "Maximum unauthenticated API requests per rate limit period per IP"
+msgstr ""
+
+msgid "Maximum unauthenticated web requests per rate limit period per IP"
msgstr ""
msgid "May"
@@ -20823,9 +21146,6 @@ msgstr ""
msgid "Medium vulnerabilities present"
msgstr ""
-msgid "Member lock"
-msgstr ""
-
msgid "Member since"
msgstr ""
@@ -20862,6 +21182,9 @@ msgstr ""
msgid "Members of a group may only view projects they have permission to access"
msgstr ""
+msgid "Membership"
+msgstr ""
+
msgid "Members|%{time} by %{user}"
msgstr ""
@@ -20922,9 +21245,6 @@ msgstr ""
msgid "Members|Expiration date updated successfully."
msgstr ""
-msgid "Members|Expired"
-msgstr ""
-
msgid "Members|Filter members"
msgstr ""
@@ -20940,9 +21260,6 @@ msgstr ""
msgid "Members|Membership"
msgstr ""
-msgid "Members|No expiration set"
-msgstr ""
-
msgid "Members|Remove \"%{groupName}\""
msgstr ""
@@ -20964,9 +21281,6 @@ msgstr ""
msgid "Members|Search invited"
msgstr ""
-msgid "Members|in %{time}"
-msgstr ""
-
msgid "Member|Deny access"
msgstr ""
@@ -21042,9 +21356,6 @@ msgstr ""
msgid "Merge request %{mr_link} was reviewed by %{mr_author}"
msgstr ""
-msgid "Merge request (MR) approvals"
-msgstr ""
-
msgid "Merge request analytics"
msgstr ""
@@ -21066,12 +21377,21 @@ msgstr ""
msgid "Merge requests"
msgstr ""
+msgid "Merge requests I've created"
+msgstr ""
+
msgid "Merge requests are a place to propose changes you've made to a project and discuss those changes with others"
msgstr ""
msgid "Merge requests are read-only in a secondary Geo node"
msgstr ""
+msgid "Merge requests assigned to me"
+msgstr ""
+
+msgid "Merge requests that I'm a reviewer"
+msgstr ""
+
msgid "Merge the branch and fix any conflicts that come up"
msgstr ""
@@ -21132,10 +21452,10 @@ msgstr ""
msgid "MergeRequests|An error occurred while saving the draft comment."
msgstr ""
-msgid "MergeRequests|Failed to squash. Should be done manually."
+msgid "MergeRequests|Create issue to resolve thread"
msgstr ""
-msgid "MergeRequests|Resolve this thread in a new issue"
+msgid "MergeRequests|Failed to squash. Should be done manually."
msgstr ""
msgid "MergeRequests|Saving the comment failed"
@@ -21949,6 +22269,9 @@ msgstr ""
msgid "MoveIssue|Cannot move issue to project it originates from!"
msgstr ""
+msgid "MoveIssue|Cannot move issues of '%{issue_type}' type."
+msgstr ""
+
msgid "Moved issue to %{label} column in the board."
msgstr ""
@@ -22074,6 +22397,15 @@ 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. To learn more about reducing storage capacity please visit our docs."
msgstr ""
+msgid "NamespaceUserCap|Pending users must be reviewed and approved by a group owner. Learn more about %{user_caps_link_start}User Caps%{link_end} and %{users_pending_approval_link_start}Users Pending Approval%{link_end}."
+msgstr ""
+
+msgid "NamespaceUserCap|View pending user approvals"
+msgstr ""
+
+msgid "NamespaceUserCap|Your group has reached its billable member limit"
+msgstr ""
+
msgid "Namespaces"
msgstr ""
@@ -22116,9 +22448,6 @@ msgstr ""
msgid "Network"
msgstr ""
-msgid "Network Policy|New rule"
-msgstr ""
-
msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is inbound from a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
msgstr ""
@@ -22140,16 +22469,13 @@ msgstr ""
msgid "NetworkPolicies|%{strongOpen}any%{strongClose} port"
msgstr ""
-msgid "NetworkPolicies|+ Add alert"
-msgstr ""
-
msgid "NetworkPolicies|.yaml"
msgstr ""
msgid "NetworkPolicies|.yaml mode"
msgstr ""
-msgid "NetworkPolicies|Actions"
+msgid "NetworkPolicies|Add alert"
msgstr ""
msgid "NetworkPolicies|Alerts are intended to be selectively used for a limited number of events that are potentially concerning and warrant a manual review. Alerts should not be used as a substitute for a SIEM or a logging tool. High volume alerts are likely to be dropped so as to preserve the stability of GitLab's integration with Kubernetes."
@@ -22185,9 +22511,6 @@ msgstr ""
msgid "NetworkPolicies|Deny all traffic"
msgstr ""
-msgid "NetworkPolicies|Description"
-msgstr ""
-
msgid "NetworkPolicies|Edit policy"
msgstr ""
@@ -22200,9 +22523,6 @@ msgstr ""
msgid "NetworkPolicies|IP/subnet"
msgstr ""
-msgid "NetworkPolicies|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
-msgstr ""
-
msgid "NetworkPolicies|Invalid or empty policy"
msgstr ""
@@ -22212,19 +22532,16 @@ msgstr ""
msgid "NetworkPolicies|Kubernetes error: %{error}"
msgstr ""
-msgid "NetworkPolicies|Name"
-msgstr ""
-
msgid "NetworkPolicies|Network"
msgstr ""
-msgid "NetworkPolicies|Network traffic"
+msgid "NetworkPolicies|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
msgstr ""
-msgid "NetworkPolicies|New policy"
+msgid "NetworkPolicies|Network policy can be created after the environment is loaded successfully."
msgstr ""
-msgid "NetworkPolicies|No policies detected"
+msgid "NetworkPolicies|Network traffic"
msgstr ""
msgid "NetworkPolicies|None selected"
@@ -22233,21 +22550,12 @@ msgstr ""
msgid "NetworkPolicies|Please %{installLinkStart}install%{installLinkEnd} and %{configureLinkStart}configure a Kubernetes Agent for this project%{configureLinkEnd} to enable alerts."
msgstr ""
-msgid "NetworkPolicies|Policies are a specification of how groups of pods are allowed to communicate with each other's network endpoints."
-msgstr ""
-
msgid "NetworkPolicies|Policy %{policyName} was successfully changed"
msgstr ""
msgid "NetworkPolicies|Policy definition"
msgstr ""
-msgid "NetworkPolicies|Policy editor"
-msgstr ""
-
-msgid "NetworkPolicies|Policy preview"
-msgstr ""
-
msgid "NetworkPolicies|Rule"
msgstr ""
@@ -22257,9 +22565,6 @@ msgstr ""
msgid "NetworkPolicies|Rule mode is unavailable for this policy. In some cases, we cannot parse the YAML file back into the rules editor."
msgstr ""
-msgid "NetworkPolicies|Rules"
-msgstr ""
-
msgid "NetworkPolicies|Save changes"
msgstr ""
@@ -22272,9 +22577,6 @@ msgstr ""
msgid "NetworkPolicies|Traffic that does not match any rule will be blocked."
msgstr ""
-msgid "NetworkPolicies|Unable to parse policy"
-msgstr ""
-
msgid "NetworkPolicies|all DNS names"
msgstr ""
@@ -22454,6 +22756,9 @@ msgstr ""
msgid "New issue"
msgstr ""
+msgid "New issue in %{project}"
+msgstr ""
+
msgid "New issue title"
msgstr ""
@@ -22532,7 +22837,7 @@ msgstr ""
msgid "Newest first"
msgstr ""
-msgid "Newly registered users will by default be external"
+msgid "Newly-registered users are external by default"
msgstr ""
msgid "Next"
@@ -22847,8 +23152,10 @@ msgstr ""
msgid "No webhooks found, add one in the form above."
msgstr ""
-msgid "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} to renew your subscription."
-msgstr ""
+msgid "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} day to renew your subscription."
+msgid_plural "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} days to renew your subscription."
+msgstr[0] ""
+msgstr[1] ""
msgid "No. of commits"
msgstr ""
@@ -22865,7 +23172,7 @@ msgstr ""
msgid "Nodes"
msgstr ""
-msgid "Non-admin users can sign in with read-only access and make read-only API requests."
+msgid "Non-admin users are restricted to read-only access, in both GitLab UI and API."
msgstr ""
msgid "None"
@@ -22946,7 +23253,7 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
-msgid "Notes Rate Limits"
+msgid "Notes rate limit"
msgstr ""
msgid "Notes|Are you sure you want to cancel creating this comment?"
@@ -23113,9 +23420,6 @@ msgstr ""
msgid "November"
msgstr ""
-msgid "Novice"
-msgstr ""
-
msgid "Now, personalize your GitLab experience"
msgstr ""
@@ -23284,7 +23588,7 @@ msgstr ""
msgid "OnCallSchedules|For this rotation, on-call will be:"
msgstr ""
-msgid "OnCallSchedules|On-call schedule %{schedule} in Project %{project}"
+msgid "OnCallSchedules|On-call schedule %{obstacle} in Project %{project}"
msgstr ""
msgid "OnCallSchedules|On-call schedules"
@@ -23431,22 +23735,22 @@ msgstr ""
msgid "OnDemandScans|Scanner profile"
msgstr ""
-msgid "OnDemandScans|Select one of the existing profiles"
+msgid "OnDemandScans|Schedule scan"
msgstr ""
-msgid "OnDemandScans|Site profile"
+msgid "OnDemandScans|Select one of the existing profiles"
msgstr ""
-msgid "OnDemandScans|Use existing scanner profile"
+msgid "OnDemandScans|Site profile"
msgstr ""
-msgid "OnDemandScans|Use existing site profile"
+msgid "OnDemandScans|Start time"
msgstr ""
-msgid "OnDemandScans|You can either choose a passive scan or validate the target site in your chosen site profile. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
+msgid "OnDemandScans|Use existing scanner profile"
msgstr ""
-msgid "OnDemandScans|You cannot run an active scan against an unvalidated site."
+msgid "OnDemandScans|Use existing site profile"
msgstr ""
msgid "OnDemandScans|You must create a repository within your project to run an on-demand scan."
@@ -23511,6 +23815,9 @@ msgstr ""
msgid "Only admins can delete project"
msgstr ""
+msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
+msgstr ""
+
msgid "Only include features new to your current subscription tier."
msgstr ""
@@ -23529,6 +23836,12 @@ msgstr ""
msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
+msgid "Only reCAPTCHA v2 is supported:"
+msgstr ""
+
+msgid "Only users from the specified IP address ranges are able to reach this group, including all subgroups, projects, and Git repositories."
+msgstr ""
+
msgid "Only verified users with an email address in any of these domains can be added to the group."
msgstr ""
@@ -23715,9 +24028,6 @@ msgstr ""
msgid "Package Registry"
msgstr ""
-msgid "Package Registry Rate Limits"
-msgstr ""
-
msgid "Package Registry: authenticated API requests"
msgstr ""
@@ -23736,6 +24046,9 @@ msgstr ""
msgid "Package recipe already exists"
msgstr ""
+msgid "Package registry rate limits"
+msgstr ""
+
msgid "Package type"
msgstr ""
@@ -23802,6 +24115,9 @@ msgstr ""
msgid "PackageRegistry|Composer"
msgstr ""
+msgid "PackageRegistry|Composer.json with license: %{license} and version: %{version}"
+msgstr ""
+
msgid "PackageRegistry|Conan"
msgstr ""
@@ -23865,6 +24181,9 @@ msgstr ""
msgid "PackageRegistry|Copy require package include"
msgstr ""
+msgid "PackageRegistry|Copy target SHA"
+msgstr ""
+
msgid "PackageRegistry|Copy yarn command"
msgstr ""
@@ -23931,6 +24250,9 @@ msgstr ""
msgid "PackageRegistry|Install package version"
msgstr ""
+msgid "PackageRegistry|Instance-level"
+msgstr ""
+
msgid "PackageRegistry|Invalid Package: failed metadata extraction"
msgstr ""
@@ -23976,6 +24298,9 @@ msgstr ""
msgid "PackageRegistry|Pip Command"
msgstr ""
+msgid "PackageRegistry|Project-level"
+msgstr ""
+
msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
msgstr ""
@@ -23997,6 +24322,9 @@ msgstr ""
msgid "PackageRegistry|Remove package"
msgstr ""
+msgid "PackageRegistry|Required Python: %{pythonVersion}"
+msgstr ""
+
msgid "PackageRegistry|RubyGems"
msgstr ""
@@ -24039,6 +24367,9 @@ msgstr ""
msgid "PackageRegistry|Source project located at %{link}"
msgstr ""
+msgid "PackageRegistry|Target SHA: %{sha}"
+msgstr ""
+
msgid "PackageRegistry|There are no other versions of this package."
msgstr ""
@@ -24207,6 +24538,18 @@ msgstr ""
msgid "Password was successfully updated. Please sign in again."
msgstr ""
+msgid "PasswordPrompt|Confirm password"
+msgstr ""
+
+msgid "PasswordPrompt|Confirm password to continue"
+msgstr ""
+
+msgid "PasswordPrompt|Password is required"
+msgstr ""
+
+msgid "PasswordPrompt|Please enter your password to confirm"
+msgstr ""
+
msgid "Passwords should be unique and not used for any other sites or services."
msgstr ""
@@ -24234,6 +24577,9 @@ msgstr ""
msgid "Paste project path (i.e. gitlab-org/gitlab)"
msgstr ""
+msgid "Paste this DSN into your Sentry SDK"
+msgstr ""
+
msgid "Paste your public SSH key, which is usually contained in the file '~/.ssh/id_ed25519.pub' or '~/.ssh/id_rsa.pub' and begins with 'ssh-ed25519' or 'ssh-rsa'. Do not paste your private SSH key, as that can compromise your identity."
msgstr ""
@@ -24318,6 +24664,9 @@ msgstr ""
msgid "PerformanceBar|First Contentful Paint"
msgstr ""
+msgid "PerformanceBar|Flamegraph with mode:"
+msgstr ""
+
msgid "PerformanceBar|Frontend resources"
msgstr ""
@@ -24351,6 +24700,15 @@ msgstr ""
msgid "PerformanceBar|Trace"
msgstr ""
+msgid "PerformanceBar|cpu"
+msgstr ""
+
+msgid "PerformanceBar|object"
+msgstr ""
+
+msgid "PerformanceBar|wall"
+msgstr ""
+
msgid "Period in seconds"
msgstr ""
@@ -24579,6 +24937,48 @@ msgstr ""
msgid "PipelineSchedules|Variables"
msgstr ""
+msgid "PipelineSource|API"
+msgstr ""
+
+msgid "PipelineSource|Chat"
+msgstr ""
+
+msgid "PipelineSource|External"
+msgstr ""
+
+msgid "PipelineSource|External Pull Request"
+msgstr ""
+
+msgid "PipelineSource|Merge Request"
+msgstr ""
+
+msgid "PipelineSource|On-Demand DAST Scan"
+msgstr ""
+
+msgid "PipelineSource|On-Demand DAST Validation"
+msgstr ""
+
+msgid "PipelineSource|Parent Pipeline"
+msgstr ""
+
+msgid "PipelineSource|Pipeline"
+msgstr ""
+
+msgid "PipelineSource|Push"
+msgstr ""
+
+msgid "PipelineSource|Schedule"
+msgstr ""
+
+msgid "PipelineSource|Trigger"
+msgstr ""
+
+msgid "PipelineSource|Web"
+msgstr ""
+
+msgid "PipelineSource|Web IDE"
+msgstr ""
+
msgid "PipelineStatusTooltip|Pipeline: %{ciStatus}"
msgstr ""
@@ -24879,46 +25279,7 @@ msgstr ""
msgid "Pipeline|Source"
msgstr ""
-msgid "Pipeline|Source|API"
-msgstr ""
-
-msgid "Pipeline|Source|Chat"
-msgstr ""
-
-msgid "Pipeline|Source|External"
-msgstr ""
-
-msgid "Pipeline|Source|External Pull Request"
-msgstr ""
-
-msgid "Pipeline|Source|Merge Request"
-msgstr ""
-
-msgid "Pipeline|Source|On-Demand DAST Scan"
-msgstr ""
-
-msgid "Pipeline|Source|On-Demand DAST Validation"
-msgstr ""
-
-msgid "Pipeline|Source|Parent Pipeline"
-msgstr ""
-
-msgid "Pipeline|Source|Pipeline"
-msgstr ""
-
-msgid "Pipeline|Source|Push"
-msgstr ""
-
-msgid "Pipeline|Source|Schedule"
-msgstr ""
-
-msgid "Pipeline|Source|Trigger"
-msgstr ""
-
-msgid "Pipeline|Source|Web"
-msgstr ""
-
-msgid "Pipeline|Source|Web IDE"
+msgid "Pipeline|Source|Security Policy"
msgstr ""
msgid "Pipeline|Specify variable values to be used in this run. The values specified in %{linkStart}CI/CD settings%{linkEnd} will be used by default."
@@ -24969,7 +25330,7 @@ msgstr ""
msgid "Pipeline|We are currently unable to fetch pipeline data"
msgstr ""
-msgid "Pipeline|You’re about to stop pipeline %{pipelineId}."
+msgid "Pipeline|You’re about to stop pipeline #%{pipelineId}."
msgstr ""
msgid "Pipeline|for"
@@ -24996,6 +25357,9 @@ msgstr ""
msgid "Plain diff"
msgstr ""
+msgid "Plain-text response to send to clients that hit a rate limit"
+msgstr ""
+
msgid "Plan:"
msgstr ""
@@ -25140,9 +25504,6 @@ msgstr ""
msgid "Please provide attributes to update"
msgstr ""
-msgid "Please provide your username or email address."
-msgstr ""
-
msgid "Please reach out if you have any questions and we'll be happy to assist."
msgstr ""
@@ -25185,9 +25546,6 @@ msgstr ""
msgid "Please set a new password before proceeding."
msgstr ""
-msgid "Please share your feedback about %{featureName} %{linkStart}in this issue%{linkEnd} to help us improve the experience."
-msgstr ""
-
msgid "Please solve the captcha"
msgstr ""
@@ -25365,6 +25723,9 @@ msgstr ""
msgid "Prevent adding new members to project membership within this group"
msgstr ""
+msgid "Prevent auto-stopping"
+msgstr ""
+
msgid "Prevent editing approval rules in projects and merge requests."
msgstr ""
@@ -25377,7 +25738,7 @@ msgstr ""
msgid "Prevent users from changing their profile name"
msgstr ""
-msgid "Prevent users from performing write operations on GitLab while performing maintenance."
+msgid "Prevent users from performing write operations while GitLab maintenance is in progress."
msgstr ""
msgid "Preview"
@@ -25650,6 +26011,9 @@ msgstr ""
msgid "Profiles|Enter your name, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Enter your password to confirm the email change"
+msgstr ""
+
msgid "Profiles|Enter your pronouns to let people know how to refer to you"
msgstr ""
@@ -25884,10 +26248,10 @@ msgstr ""
msgid "Profiles|e.g. My MacBook key"
msgstr ""
-msgid "Profiles|username"
+msgid "Profiles|https://website.com"
msgstr ""
-msgid "Profiles|website.com"
+msgid "Profiles|username"
msgstr ""
msgid "Profiles|your account"
@@ -26130,9 +26494,21 @@ msgstr ""
msgid "ProjectSelect| or group"
msgstr ""
+msgid "ProjectSelect|No matching results"
+msgstr ""
+
msgid "ProjectSelect|Search for project"
msgstr ""
+msgid "ProjectSelect|Search projects"
+msgstr ""
+
+msgid "ProjectSelect|Select a project"
+msgstr ""
+
+msgid "ProjectSelect|There was an error fetching the projects. Please try again."
+msgstr ""
+
msgid "ProjectService|Drone server URL"
msgstr ""
@@ -26220,6 +26596,9 @@ msgstr ""
msgid "ProjectService|Trigger event when a new, unique alert is recorded."
msgstr ""
+msgid "ProjectService|Trigger event when a new, unique vulnerability is recorded. (Note: This feature requires an Ultimate plan.)"
+msgstr ""
+
msgid "ProjectService|Trigger event when a pipeline status changes."
msgstr ""
@@ -26634,9 +27013,15 @@ msgstr ""
msgid "Projects are graded based on the highest severity vulnerability present"
msgstr ""
+msgid "Projects are organized into groups"
+msgstr ""
+
msgid "Projects contributed to"
msgstr ""
+msgid "Projects help you organize your work. They contain your file repository, issues, merge requests, and so much more."
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr ""
@@ -26871,10 +27256,10 @@ msgstr ""
msgid "PrometheusService|Prometheus cluster integration"
msgstr ""
-msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
+msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
msgstr ""
-msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
+msgid "PrometheusService|The ID of the IAP-secured resource."
msgstr ""
msgid "PrometheusService|The Prometheus API base URL."
@@ -27492,6 +27877,9 @@ msgstr ""
msgid "Rate limit"
msgstr ""
+msgid "Rate limits can help reduce request volume (like from crawlers or abusive bots)."
+msgstr ""
+
msgid "Raw blob request rate limit per minute"
msgstr ""
@@ -27504,6 +27892,9 @@ msgstr ""
msgid "Re-authentication required"
msgstr ""
+msgid "Re-import"
+msgstr ""
+
msgid "Re-request review"
msgstr ""
@@ -27525,6 +27916,9 @@ msgstr ""
msgid "Read more about related issues"
msgstr ""
+msgid "Read their documentation."
+msgstr ""
+
msgid "Ready to get started with GitLab? Follow these steps to set up your workspace, plan and commit changes, and deploy your project."
msgstr ""
@@ -27558,6 +27952,9 @@ msgstr ""
msgid "Receive any notifications from GitLab."
msgstr ""
+msgid "Receive notification of abuse reports by email."
+msgstr ""
+
msgid "Receive notifications about your own activity"
msgstr ""
@@ -27701,9 +28098,6 @@ msgstr ""
msgid "Registry setup"
msgstr ""
-msgid "Regulate approvals by authors/committers. Affects all projects."
-msgstr ""
-
msgid "Reindexing Status: %{status} (Slice multiplier: %{multiplier}, Maximum running slices: %{max_slices})"
msgstr ""
@@ -27799,6 +28193,9 @@ msgstr ""
msgid "Release|Something went wrong while saving the release details."
msgstr ""
+msgid "Reload page"
+msgstr ""
+
msgid "Remediations"
msgstr ""
@@ -28081,6 +28478,9 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
+msgid "Repeats"
+msgstr ""
+
msgid "Replace"
msgstr ""
@@ -28443,10 +28843,7 @@ msgstr ""
msgid "Require additional authentication for administrative tasks."
msgstr ""
-msgid "Require all users in this group to setup Two-factor authentication"
-msgstr ""
-
-msgid "Require all users in this group to setup two-factor authentication"
+msgid "Require all users in this group to set up two-factor authentication"
msgstr ""
msgid "Required approvals (%{approvals_given} given)"
@@ -28492,6 +28889,9 @@ msgstr[1] ""
msgid "Requires values to meet regular expression requirements."
msgstr ""
+msgid "Requires you to deploy or set up cloud-hosted Sentry."
+msgstr ""
+
msgid "Requires your primary GitLab email address."
msgstr ""
@@ -28552,9 +28952,6 @@ msgstr ""
msgid "Resolve"
msgstr ""
-msgid "Resolve all threads in new issue"
-msgstr ""
-
msgid "Resolve conflicts"
msgstr ""
@@ -28612,6 +29009,9 @@ msgstr ""
msgid "Response text"
msgstr ""
+msgid "Restart GitLab to apply changes."
+msgstr ""
+
msgid "Restart Terminal"
msgstr ""
@@ -28630,6 +29030,9 @@ msgstr ""
msgid "Restoring the project will prevent the project from being removed on this date and restore people's ability to make changes to it."
msgstr ""
+msgid "Restrict group access by IP address. %{link_start}Learn more%{link_end}."
+msgstr ""
+
msgid "Restrict membership by email domain"
msgstr ""
@@ -28943,6 +29346,9 @@ msgstr ""
msgid "Runners|Runner #%{runner_id}"
msgstr ""
+msgid "Runners|Runner assigned to project."
+msgstr ""
+
msgid "Runners|Runner is offline, last contact was %{runner_contact} ago"
msgstr ""
@@ -28955,6 +29361,9 @@ msgstr ""
msgid "Runners|Runner registration"
msgstr ""
+msgid "Runners|Runner unassigned from project."
+msgstr ""
+
msgid "Runners|Runners"
msgstr ""
@@ -29147,7 +29556,7 @@ msgstr ""
msgid "SastEntryPoints|How do I set up SAST?"
msgstr ""
-msgid "SastEntryPoints|Learn more."
+msgid "SastEntryPoints|Learn more"
msgstr ""
msgid "Satisfied"
@@ -29189,7 +29598,7 @@ msgstr ""
msgid "Save pipeline schedule"
msgstr ""
-msgid "Save space and find images in the container Registry. remove unneeded tags and keep only the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
+msgid "Save storage space by automatically deleting tags from the container registry and keeping the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
msgstr ""
msgid "Saving"
@@ -29363,6 +29772,9 @@ msgstr ""
msgid "Search or filter results…"
msgstr ""
+msgid "Search or jump to..."
+msgstr ""
+
msgid "Search project"
msgstr ""
@@ -29423,16 +29835,16 @@ msgstr ""
msgid "SearchCodeResults|of %{link_to_project}"
msgstr ""
-msgid "SearchResults|Showing %{count} %{scope} for%{term_element}"
+msgid "SearchResults|Showing %{count} %{scope} for %{term_element}"
msgstr ""
-msgid "SearchResults|Showing %{count} %{scope} for%{term_element} in your personal and project snippets"
+msgid "SearchResults|Showing %{count} %{scope} for %{term_element} in your personal and project snippets"
msgstr ""
-msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for%{term_element}"
+msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for %{term_element}"
msgstr ""
-msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for%{term_element} in your personal and project snippets"
+msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for %{term_element} in your personal and project snippets"
msgstr ""
msgid "SearchResults|code result"
@@ -29514,6 +29926,9 @@ msgstr ""
msgid "Secret Detection"
msgstr ""
+msgid "Secret access key"
+msgstr ""
+
msgid "Secret token"
msgstr ""
@@ -29553,9 +29968,6 @@ msgstr ""
msgid "SecurityApprovals|A merge request approval is required when the license compliance report contains a denied license."
msgstr ""
-msgid "SecurityApprovals|Configurable if security scanners are enabled. %{linkStart}Learn more.%{linkEnd}"
-msgstr ""
-
msgid "SecurityApprovals|Coverage-Check"
msgstr ""
@@ -29568,24 +29980,18 @@ msgstr ""
msgid "SecurityApprovals|Learn more about Vulnerability-Check"
msgstr ""
-msgid "SecurityApprovals|License Scanning must be enabled. %{linkStart}Learn more%{linkEnd}."
-msgstr ""
-
msgid "SecurityApprovals|License-Check"
msgstr ""
msgid "SecurityApprovals|Requires approval for Denied licenses. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}More information%{linkEnd}"
+msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "SecurityApprovals|Requires approval for vulnerabilities. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
-msgid "SecurityApprovals|Test coverage must be enabled. %{linkStart}Learn more%{linkEnd}."
-msgstr ""
-
msgid "SecurityApprovals|Vulnerability-Check"
msgstr ""
@@ -29649,6 +30055,12 @@ msgstr ""
msgid "SecurityConfiguration|Immediately begin risk analysis and remediation with application security features. Start with SAST and Secret Detection, available to all plans. Upgrade to Ultimate to get all features, including:"
msgstr ""
+msgid "SecurityConfiguration|Manage corpus"
+msgstr ""
+
+msgid "SecurityConfiguration|Manage corpus files used as mutation sources in coverage fuzzing."
+msgstr ""
+
msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
msgstr ""
@@ -29703,6 +30115,12 @@ msgstr ""
msgid "SecurityOrchestration|Action"
msgstr ""
+msgid "SecurityOrchestration|Actions"
+msgstr ""
+
+msgid "SecurityOrchestration|Add rule"
+msgstr ""
+
msgid "SecurityOrchestration|All policies"
msgstr ""
@@ -29736,9 +30154,6 @@ msgstr ""
msgid "SecurityOrchestration|Network"
msgstr ""
-msgid "SecurityOrchestration|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
-msgstr ""
-
msgid "SecurityOrchestration|New policy"
msgstr ""
@@ -29754,6 +30169,9 @@ msgstr ""
msgid "SecurityOrchestration|Policy editor"
msgstr ""
+msgid "SecurityOrchestration|Policy preview"
+msgstr ""
+
msgid "SecurityOrchestration|Policy status"
msgstr ""
@@ -29763,6 +30181,9 @@ msgstr ""
msgid "SecurityOrchestration|Rule"
msgstr ""
+msgid "SecurityOrchestration|Rules"
+msgstr ""
+
msgid "SecurityOrchestration|Scan Execution"
msgstr ""
@@ -29856,6 +30277,9 @@ msgstr ""
msgid "SecurityReports|Create issue"
msgstr ""
+msgid "SecurityReports|Development vulnerabilities"
+msgstr ""
+
msgid "SecurityReports|Dismiss vulnerability"
msgstr ""
@@ -29871,6 +30295,9 @@ msgstr ""
msgid "SecurityReports|Download results"
msgstr ""
+msgid "SecurityReports|Download scanned URLs"
+msgstr ""
+
msgid "SecurityReports|Download scanned resources"
msgstr ""
@@ -29994,6 +30421,9 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
+msgid "SecurityReports|The Vulnerability Report shows the results of the lastest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "SecurityReports|The security reports below contain one or more vulnerability findings that could not be parsed and were not recorded. Download the artifacts in the job output to investigate. Ensure any security report created conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
msgstr ""
@@ -30135,10 +30565,10 @@ msgstr ""
msgid "Select a repository"
msgstr ""
-msgid "Select a role"
+msgid "Select a repository containing templates for common files."
msgstr ""
-msgid "Select a shared template repository for all projects on this instance."
+msgid "Select a role"
msgstr ""
msgid "Select a template repository"
@@ -30216,6 +30646,9 @@ msgstr ""
msgid "Select project to choose zone"
msgstr ""
+msgid "Select project to create issue"
+msgstr ""
+
msgid "Select projects"
msgstr ""
@@ -30333,6 +30766,9 @@ msgstr ""
msgid "Send emails to help guide new users through the onboarding process."
msgstr ""
+msgid "Send emails to users upon account deactivation."
+msgstr ""
+
msgid "Send message"
msgstr ""
@@ -30351,6 +30787,9 @@ msgstr ""
msgid "Send service data"
msgstr ""
+msgid "Sentry"
+msgstr ""
+
msgid "Sentry API URL"
msgstr ""
@@ -30465,6 +30904,9 @@ msgstr ""
msgid "Service"
msgstr ""
+msgid "Service Accounts keys are required to authorize GitLab to deploy your Google Cloud project."
+msgstr ""
+
msgid "Service Desk"
msgstr ""
@@ -30537,15 +30979,15 @@ msgstr ""
msgid "Set a password on your account to pull or push via %{protocol}."
msgstr ""
-msgid "Set a template repository for projects in this group"
-msgstr ""
-
msgid "Set access permissions for this token."
msgstr ""
msgid "Set an instance-wide domain that will be available to all clusters when installing Knative."
msgstr ""
+msgid "Set any rate limit to %{code_open}0%{code_close} to disable the limit."
+msgstr ""
+
msgid "Set default and restrict visibility levels. Configure import sources and git access protocol."
msgstr ""
@@ -30558,7 +31000,7 @@ msgstr ""
msgid "Set limit to 0 to allow any file size."
msgstr ""
-msgid "Set max session time for web terminal."
+msgid "Set limits for web and API requests."
msgstr ""
msgid "Set milestone"
@@ -30567,15 +31009,18 @@ msgstr ""
msgid "Set new password"
msgstr ""
-msgid "Set notification email for abuse reports."
+msgid "Set parent epic to an epic"
msgstr ""
-msgid "Set parent epic to an epic"
+msgid "Set per-user rate limits for imports and exports of projects and groups."
msgstr ""
msgid "Set projects and maximum size limits, session duration, user options, and check feature availability for namespace plan."
msgstr ""
+msgid "Set rate limits for package registry API requests that supersede the general user and IP rate limits."
+msgstr ""
+
msgid "Set severity"
msgstr ""
@@ -30594,15 +31039,24 @@ msgstr ""
msgid "Set the default branch for this project. All merge requests and commits are made against this branch unless you specify a different one."
msgstr ""
+msgid "Set the default expiration time for job artifacts in all projects. Set to %{code_open}0%{code_close} to never expire artifacts by default. If no unit is written, it defaults to seconds. For example, these are all equivalent: %{code_open}3600%{code_close}, %{code_open}60 minutes%{code_close}, or %{code_open}one hour%{code_close}."
+msgstr ""
+
msgid "Set the due date to %{due_date}."
msgstr ""
msgid "Set the iteration to %{iteration_reference}."
msgstr ""
+msgid "Set the maximum session time for a web terminal."
+msgstr ""
+
msgid "Set the milestone to %{milestone_reference}."
msgstr ""
+msgid "Set the per-user rate limit for notes created by web or API requests."
+msgstr ""
+
msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
msgstr ""
@@ -30804,6 +31258,9 @@ msgstr ""
msgid "Show Pipeline IID"
msgstr ""
+msgid "Show all %{issuable_type}."
+msgstr ""
+
msgid "Show all activity"
msgstr ""
@@ -30855,15 +31312,9 @@ msgstr ""
msgid "Show list"
msgstr ""
-msgid "Show me advanced features"
-msgstr ""
-
msgid "Show me how to add a pipeline"
msgstr ""
-msgid "Show me the basics"
-msgstr ""
-
msgid "Show one file at a time"
msgstr ""
@@ -30904,15 +31355,15 @@ msgstr ""
msgid "Showing %{pageSize} of %{total} %{issuableType}"
msgstr ""
-msgid "Showing %{pageSize} of %{total} issues"
-msgstr ""
-
msgid "Showing all epics"
msgstr ""
msgid "Showing all issues"
msgstr ""
+msgid "Showing data for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
+msgstr ""
+
msgid "Showing data for workflow items created in this date range. Date range cannot exceed %{maxDateRange} days."
msgstr ""
@@ -30952,6 +31403,15 @@ msgstr ""
msgid "Sidebar|Weight"
msgstr ""
+msgid "Sidekiq job compression threshold (bytes)"
+msgstr ""
+
+msgid "Sidekiq job size limit (bytes)"
+msgstr ""
+
+msgid "Sidekiq job size limits"
+msgstr ""
+
msgid "Sign in"
msgstr ""
@@ -31072,6 +31532,9 @@ msgstr ""
msgid "Site profile not found for given parameters"
msgstr ""
+msgid "Sites"
+msgstr ""
+
msgid "Size"
msgstr ""
@@ -31102,19 +31565,22 @@ msgstr ""
msgid "SlackIntegration|Sends notifications about project events to Slack channels."
msgstr ""
-msgid "SlackService|2. Paste the %{strong_open}Token%{strong_close} into the field below"
+msgid "SlackService|1. %{slash_command_link_start}Add a slash command%{slash_command_link_end} in your Slack team using this information:"
msgstr ""
-msgid "SlackService|3. Select the %{strong_open}Active%{strong_close} checkbox, press %{strong_open}Save changes%{strong_close} and start using GitLab inside Slack!"
+msgid "SlackService|2. Paste the token from Slack in the %{strong_open}Token%{strong_close} field below."
msgstr ""
-msgid "SlackService|Fill in the word that works best for your team."
+msgid "SlackService|3. Select the %{strong_open}Active%{strong_close} checkbox, select %{strong_open}Save changes%{strong_close}, and start using slash commands in Slack!"
+msgstr ""
+
+msgid "SlackService|After setup, get a list of available Slack slash commands by entering"
msgstr ""
-msgid "SlackService|See list of available commands in Slack after setting up this service, by entering"
+msgid "SlackService|Fill in the word that works best for your team."
msgstr ""
-msgid "SlackService|This service allows users to perform common operations on this project by entering slash commands in Slack."
+msgid "SlackService|Perform common operations in this project by entering slash commands in Slack."
msgstr ""
msgid "Slice multiplier"
@@ -31180,7 +31646,7 @@ msgstr ""
msgid "Some child epics may be hidden due to applied filters"
msgstr ""
-msgid "Some common domains are not allowed. %{read_more_link}."
+msgid "Some common domains are not allowed. %{learn_more_link}."
msgstr ""
msgid "Some of the designs you tried uploading did not change:"
@@ -31264,9 +31730,6 @@ msgstr ""
msgid "Something went wrong while exporting requirements"
msgstr ""
-msgid "Something went wrong while fetching %{listType} list"
-msgstr ""
-
msgid "Something went wrong while fetching branches"
msgstr ""
@@ -31321,15 +31784,9 @@ msgstr ""
msgid "Something went wrong while merging this merge request. Please try again."
msgstr ""
-msgid "Something went wrong while moving issues."
-msgstr ""
-
msgid "Something went wrong while obtaining the Let's Encrypt certificate."
msgstr ""
-msgid "Something went wrong while performing the action."
-msgstr ""
-
msgid "Something went wrong while promoting the issue to an epic. Please try again."
msgstr ""
@@ -31657,7 +32114,10 @@ msgstr ""
msgid "SourcegraphPreferences|Uses a custom %{linkStart}Sourcegraph instance%{linkEnd}."
msgstr ""
-msgid "Spam Check API Key"
+msgid "Spam Check"
+msgstr ""
+
+msgid "Spam Check API key"
msgstr ""
msgid "Spam Logs"
@@ -31675,7 +32135,7 @@ msgstr ""
msgid "Specified URL cannot be used: \"%{reason}\""
msgstr ""
-msgid "Specify an e-mail address regex pattern to identify default internal users."
+msgid "Specify an email address regex pattern to identify default internal users."
msgstr ""
msgid "Speed up your pipelines with Needs relationships"
@@ -31930,7 +32390,7 @@ msgstr ""
msgid "StatusCheck|An error occurred fetching the status checks."
msgstr ""
-msgid "StatusCheck|Apply this status check to any branch or a specific protected branch."
+msgid "StatusCheck|Apply this status check to all branches or a specific protected branch."
msgstr ""
msgid "StatusCheck|Check for a status response in Merge Requests. Failures do not block merges. %{link_start}Learn more%{link_end}."
@@ -32269,6 +32729,9 @@ msgstr ""
msgid "Subscriptions"
msgstr ""
+msgid "Subscription|Your subscription for %{strong}%{namespace_name}%{strong_close} has expired and you are now on %{pricing_link_start}the GitLab Free tier%{pricing_link_end}. Don't worry, your data is safe. Get in touch with our support team (%{support_email}). They'll gladly help with your subscription renewal."
+msgstr ""
+
msgid "Subtracted"
msgstr ""
@@ -32497,6 +32960,9 @@ msgstr ""
msgid "SuperSonics|Plan"
msgstr ""
+msgid "SuperSonics|Please agree to the Subscription Agreement"
+msgstr ""
+
msgid "SuperSonics|Ready to get started? A GitLab plan is ideal for scaling organizations and for multi team usage."
msgstr ""
@@ -32527,6 +32993,9 @@ msgstr ""
msgid "SuperSonics|The activation code is not valid. Please make sure to copy it exactly from the Customers Portal or confirmation email. Learn more about %{linkStart}activating your subscription%{linkEnd}."
msgstr ""
+msgid "SuperSonics|The activation code should be a 24-character alphanumeric string"
+msgstr ""
+
msgid "SuperSonics|There is a connectivity issue."
msgstr ""
@@ -32569,9 +33038,15 @@ msgstr ""
msgid "SuperSonics|You do not have an active subscription"
msgstr ""
+msgid "SuperSonics|You have successfully added a license that activates on %{date}. Please see the subscription history table below for more details."
+msgstr ""
+
msgid "SuperSonics|You'll be charged for %{trueUpLinkStart}users over license%{trueUpLinkEnd} on a quarterly or annual basis, depending on the terms of your agreement."
msgstr ""
+msgid "SuperSonics|Your future dated license was successfully added"
+msgstr ""
+
msgid "SuperSonics|Your subscription"
msgstr ""
@@ -32824,7 +33299,7 @@ msgstr ""
msgid "Template to append to all Service Desk issues"
msgstr ""
-msgid "TemplateRepository|Select a repository to make its templates available to all projects. %{link_start}What should the repository contain?%{link_end} "
+msgid "TemplateRepository|Create common files more quickly, and standardize their format."
msgstr ""
msgid "Templates"
@@ -33030,7 +33505,7 @@ msgstr ""
msgid "TestCases|Search test cases"
msgstr ""
-msgid "TestCases|Something went wrong while adding test case to Todo."
+msgid "TestCases|Something went wrong while adding test case to a to-do item."
msgstr ""
msgid "TestCases|Something went wrong while creating a test case."
@@ -33042,7 +33517,7 @@ msgstr ""
msgid "TestCases|Something went wrong while fetching test cases list."
msgstr ""
-msgid "TestCases|Something went wrong while marking test case todo as done."
+msgid "TestCases|Something went wrong while marking test case to-do item as done."
msgstr ""
msgid "TestCases|Something went wrong while moving test case."
@@ -33162,7 +33637,7 @@ msgstr ""
msgid "Thanks for your purchase!"
msgstr ""
-msgid "That is ok, I do not want to renew"
+msgid "That's OK, I don't want to renew"
msgstr ""
msgid "That's it, well done!"
@@ -33185,7 +33660,7 @@ msgid_plural "The %{type} contains the following errors:"
msgstr[0] ""
msgstr[1] ""
-msgid "The API key used by GitLab for accessing the Spam Check service endpoint"
+msgid "The API key used by GitLab for accessing the Spam Check service endpoint."
msgstr ""
msgid "The GitLab subscription service (customers.gitlab.com) is currently experiencing an outage. You can monitor the status and get updates at %{linkStart}status.gitlab.com%{linkEnd}."
@@ -33224,9 +33699,6 @@ msgstr ""
msgid "The URL to use for connecting to Elasticsearch. Use a comma-separated list to support clustering (e.g., \"http://localhost:9200, http://localhost:9201\")."
msgstr ""
-msgid "The Vulnerability Report shows the results of the last successful pipeline run on the default branch."
-msgstr ""
-
msgid "The X509 Certificate to use when mutual TLS is required to communicate with the external authorization service. If left blank, the server certificate is still validated when accessing over HTTPS."
msgstr ""
@@ -33284,9 +33756,6 @@ msgstr ""
msgid "The default branch for this project has been changed. Please update your bookmarks."
msgstr ""
-msgid "The default expiration time for job artifacts. 0 for unlimited. The default unit is in seconds, but you can use other units, for example %{code_open}4 mins 2 sec%{code_close}, %{code_open}2h42min%{code_close}."
-msgstr ""
-
msgid "The dependency list details information about the components used within your project."
msgstr ""
@@ -33478,9 +33947,6 @@ msgstr ""
msgid "The merge conflicts for this merge request have already been resolved. Please return to the merge request."
msgstr ""
-msgid "The merge request can now be merged."
-msgstr ""
-
msgid "The metric must be one of %{metrics}."
msgstr ""
@@ -33856,7 +34322,7 @@ msgstr ""
msgid "There was a problem updating the keep latest artifacts setting."
msgstr ""
-msgid "There was an error %{message} todo."
+msgid "There was an error %{message} to-do item."
msgstr ""
msgid "There was an error adding a To Do."
@@ -33895,6 +34361,9 @@ msgstr ""
msgid "There was an error fetching projects"
msgstr ""
+msgid "There was an error fetching search autocomplete suggestions"
+msgstr ""
+
msgid "There was an error fetching stage total counts"
msgstr ""
@@ -34219,6 +34688,9 @@ msgstr ""
msgid "This field is required."
msgstr ""
+msgid "This form is disabled in preview"
+msgstr ""
+
msgid "This group"
msgstr ""
@@ -34240,9 +34712,6 @@ msgstr ""
msgid "This group is linked to a subscription"
msgstr ""
-msgid "This group, including all subgroups, projects and git repositories, will be reachable from only the specified IP address ranges."
-msgstr ""
-
msgid "This group, its subgroups and projects has been scheduled for removal on %{date}."
msgstr ""
@@ -34522,9 +34991,6 @@ msgstr ""
msgid "This user cannot be unlocked manually from GitLab"
msgstr ""
-msgid "This user does not have a pending request"
-msgstr ""
-
msgid "This user has an unconfirmed email address (%{email}). You may force a confirmation."
msgstr ""
@@ -34633,9 +35099,6 @@ msgstr ""
msgid "ThreatMonitoring|Packet Activity"
msgstr ""
-msgid "ThreatMonitoring|Policies"
-msgstr ""
-
msgid "ThreatMonitoring|Requests"
msgstr ""
@@ -34687,6 +35150,12 @@ msgstr ""
msgid "ThreatMonitoring|View documentation"
msgstr ""
+msgid "Threshold in bytes at which to compress Sidekiq job arguments."
+msgstr ""
+
+msgid "Threshold in bytes at which to reject Sidekiq jobs. Set this to 0 to if you don't want to limit Sidekiq jobs."
+msgstr ""
+
msgid "Throughput"
msgstr ""
@@ -34696,6 +35165,9 @@ msgstr ""
msgid "Time"
msgstr ""
+msgid "Time (in hours) that users are allowed to skip forced configuration of two-factor authentication."
+msgstr ""
+
msgid "Time Spent"
msgstr ""
@@ -34762,7 +35234,7 @@ msgstr ""
msgid "TimeTrackingEstimated|Est"
msgstr ""
-msgid "TimeTracking|%{startTag}Spent: %{endTag}%{timeSpentHumanReadable}"
+msgid "TimeTracking|%{spentStart}Spent: %{spentEnd}"
msgstr ""
msgid "TimeTracking|Estimated:"
@@ -34976,6 +35448,9 @@ msgstr ""
msgid "To access this domain create a new DNS record"
msgstr ""
+msgid "To add a custom suffix, set up a Service Desk email address. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "To add an SSH key you need to %{generate_link_start}generate one%{link_end} or use an %{existing_link_start}existing key%{link_end}."
msgstr ""
@@ -34997,13 +35472,16 @@ msgstr ""
msgid "To connect an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To continue using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
+msgstr ""
+
msgid "To continue, you need to select the link in the confirmation email we sent to verify your email address. If you didn't get our email, select %{strongStart}Resend confirmation email.%{strongEnd}"
msgstr ""
msgid "To define internal users, first enable new users set to external"
msgstr ""
-msgid "To enable Registration Features, make sure \"Enable service ping\" is checked."
+msgid "To enable Registration Features, first enable Service Ping."
msgstr ""
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
@@ -35030,7 +35508,7 @@ msgstr ""
msgid "To get started, use the link below to confirm your account."
msgstr ""
-msgid "To help improve GitLab and its user experience, GitLab will periodically collect usage information."
+msgid "To help improve GitLab and its user experience, GitLab periodically collects usage information."
msgstr ""
msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
@@ -35063,7 +35541,7 @@ msgstr ""
msgid "To preserve performance only %{strong_open}%{display_size} of %{real_size}%{strong_close} files are displayed."
msgstr ""
-msgid "To protect this issue's confidentiality, %{forkLink} and set the fork's visibility to private."
+msgid "To protect this issue's confidentiality, %{linkStart}fork this project%{linkEnd} and set the fork's visibility to private."
msgstr ""
msgid "To protect this issue's confidentiality, a private fork of this project was selected."
@@ -35096,12 +35574,15 @@ msgstr ""
msgid "To set up SAML authentication for your group through an identity provider like Azure, Okta, Onelogin, Ping Identity, or your custom SAML 2.0 provider:"
msgstr ""
-msgid "To set up this service:"
+msgid "To set up this integration:"
msgstr ""
msgid "To specify the notification level per project of a group you belong to, you need to visit project page and change notification level there."
msgstr ""
+msgid "To start using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
+msgstr ""
+
msgid "To unsubscribe from this issue, please paste the following link into your browser:"
msgstr ""
@@ -35689,9 +36170,6 @@ msgstr ""
msgid "Unable to fetch branches list, please close the form and try again"
msgstr ""
-msgid "Unable to fetch unscanned projects"
-msgstr ""
-
msgid "Unable to fetch vulnerable projects"
msgstr ""
@@ -35746,6 +36224,15 @@ msgstr ""
msgid "Unable to update this issue at this time."
msgstr ""
+msgid "Unapprove a merge request"
+msgstr ""
+
+msgid "Unapprove the current merge request."
+msgstr ""
+
+msgid "Unapproved the current merge request."
+msgstr ""
+
msgid "Unarchive project"
msgstr ""
@@ -35758,16 +36245,13 @@ msgstr ""
msgid "Unassigned"
msgstr ""
-msgid "Unauthenticated API request rate limit"
-msgstr ""
-
-msgid "Unauthenticated rate limit period in seconds"
+msgid "Unauthenticated API rate limit period in seconds"
msgstr ""
-msgid "Unauthenticated request rate limit"
+msgid "Unauthenticated requests"
msgstr ""
-msgid "Unauthenticated requests"
+msgid "Unauthenticated web rate limit period in seconds"
msgstr ""
msgid "Undo"
@@ -35869,18 +36353,6 @@ msgstr ""
msgid "Unresolved"
msgstr ""
-msgid "UnscannedProjects|15 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|30 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|5 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|60 or more days"
-msgstr ""
-
msgid "Unschedule job"
msgstr ""
@@ -36100,6 +36572,9 @@ msgstr ""
msgid "UsageQuota|%{help_link_start}Shared runners%{help_link_end} are disabled, so there are no limits set on pipeline usage"
msgstr ""
+msgid "UsageQuota|%{linkTitle} help link"
+msgstr ""
+
msgid "UsageQuota|%{percentageLeft} of purchased storage is available"
msgstr ""
@@ -36109,6 +36584,9 @@ msgstr ""
msgid "UsageQuota|Artifacts is a sum of build and pipeline artifacts."
msgstr ""
+msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
+msgstr ""
+
msgid "UsageQuota|Buy additional minutes"
msgstr ""
@@ -36118,9 +36596,21 @@ msgstr ""
msgid "UsageQuota|CI minutes usage by project"
msgstr ""
+msgid "UsageQuota|Code packages and container images."
+msgstr ""
+
msgid "UsageQuota|Current period usage"
msgstr ""
+msgid "UsageQuota|File attachments and smaller design graphics."
+msgstr ""
+
+msgid "UsageQuota|Git repository, managed by the Gitaly service."
+msgstr ""
+
+msgid "UsageQuota|Includes project registry, artifacts, packages, wiki, uploads and other items."
+msgstr ""
+
msgid "UsageQuota|Increase storage temporarily"
msgstr ""
@@ -36139,6 +36629,9 @@ msgstr ""
msgid "UsageQuota|Packages"
msgstr ""
+msgid "UsageQuota|Pipeline artifacts and job artifacts, created with CI/CD."
+msgstr ""
+
msgid "UsageQuota|Pipelines"
msgstr ""
@@ -36157,6 +36650,9 @@ msgstr ""
msgid "UsageQuota|Seats"
msgstr ""
+msgid "UsageQuota|Shared bits of code and text."
+msgstr ""
+
msgid "UsageQuota|Snippets"
msgstr ""
@@ -36166,6 +36662,12 @@ msgstr ""
msgid "UsageQuota|Storage"
msgstr ""
+msgid "UsageQuota|Storage type"
+msgstr ""
+
+msgid "UsageQuota|There is a known issue with Artifact storage where the total could be incorrect for some projects. More details and progress are available in %{warningLinkStart}the epic%{warningLinkEnd}."
+msgstr ""
+
msgid "UsageQuota|This is the total amount of storage used across your projects within this namespace."
msgstr ""
@@ -36205,6 +36707,9 @@ msgstr ""
msgid "UsageQuota|Usage"
msgstr ""
+msgid "UsageQuota|Usage Breakdown"
+msgstr ""
+
msgid "UsageQuota|Usage Quotas"
msgstr ""
@@ -36229,6 +36734,9 @@ msgstr ""
msgid "UsageQuota|Wiki"
msgstr ""
+msgid "UsageQuota|Wiki content."
+msgstr ""
+
msgid "UsageQuota|Wikis"
msgstr ""
@@ -36445,7 +36953,10 @@ msgstr ""
msgid "User Settings"
msgstr ""
-msgid "User and IP Rate Limits"
+msgid "User and IP rate limits"
+msgstr ""
+
+msgid "User does not have a pending request"
msgstr ""
msgid "User identity was successfully created."
@@ -36742,6 +37253,9 @@ msgstr ""
msgid "Users can launch a development environment from a GitLab browser tab when the %{linkStart}Gitpod%{linkEnd} integration is enabled."
msgstr ""
+msgid "Users can reactivate their account by signing in."
+msgstr ""
+
msgid "Users can render diagrams in AsciiDoc, Markdown, reStructuredText, and Textile documents using Kroki."
msgstr ""
@@ -36757,6 +37271,9 @@ msgstr ""
msgid "Users requesting access to"
msgstr ""
+msgid "Users to exclude from the rate limit"
+msgstr ""
+
msgid "Users were successfully added."
msgstr ""
@@ -36778,6 +37295,9 @@ msgstr ""
msgid "UsersSelect|Unassigned"
msgstr ""
+msgid "Uses GitLab as a lightweight alternative to Sentry."
+msgstr ""
+
msgid "Using %{code_start}::%{code_end} denotes a %{link_start}scoped label set%{link_end}"
msgstr ""
@@ -36808,10 +37328,7 @@ msgstr ""
msgid "Value Stream Analytics can help you determine your team’s velocity"
msgstr ""
-msgid "Value Stream Analytics gives an overview of how much time it takes to go from idea to production in your project."
-msgstr ""
-
-msgid "Value may contain a variable reference"
+msgid "Value might contain a variable reference"
msgstr ""
msgid "Value stream"
@@ -36877,10 +37394,10 @@ msgstr ""
msgid "ValueStream|The Default Value Stream cannot be deleted"
msgstr ""
-msgid "Variable"
+msgid "Values that contain the %{codeStart}$%{codeEnd} character can be considered a variable reference and expanded. %{docsLinkStart}Learn more.%{docsLinkEnd}"
msgstr ""
-msgid "Variable references indicated by %{codeStart}$%{codeEnd} may be expanded. If this is not what you want, consider %{docsLinkStart}using a workaround to prevent expansion%{docsLinkEnd}."
+msgid "Variable"
msgstr ""
msgid "Variable will be masked in job logs."
@@ -37285,6 +37802,9 @@ msgstr ""
msgid "Vulnerability|Evidence"
msgstr ""
+msgid "Vulnerability|False positive detected"
+msgstr ""
+
msgid "Vulnerability|File"
msgstr ""
@@ -37327,6 +37847,9 @@ msgstr ""
msgid "Vulnerability|Status"
msgstr ""
+msgid "Vulnerability|The scanner determined this vulnerability to be a false positive. Verify the evaluation before changing its status. %{linkStart}Learn more about false positive detection.%{linkEnd}"
+msgstr ""
+
msgid "Vulnerability|The unmodified response is the original response that had no mutations done to the request"
msgstr ""
@@ -37651,9 +38174,6 @@ msgstr ""
msgid "Welcome to GitLab,%{br_tag}%{name}!"
msgstr ""
-msgid "Welcome to the guided GitLab tour"
-msgstr ""
-
msgid "Welcome, %{name}!"
msgstr ""
@@ -37672,9 +38192,6 @@ msgstr ""
msgid "What are you searching for?"
msgstr ""
-msgid "What describes you best?"
-msgstr ""
-
msgid "What does this command do?"
msgstr ""
@@ -37696,13 +38213,13 @@ msgstr ""
msgid "What is your job title? (optional)"
msgstr ""
-msgid "What will you use this group for?"
+msgid "What templates can I create?"
msgstr ""
-msgid "What's new"
+msgid "What will you use this group for?"
msgstr ""
-msgid "What’s your experience level?"
+msgid "What's new"
msgstr ""
msgid "When a deployment job is successful, skip older deployment jobs that are still pending."
@@ -37714,6 +38231,9 @@ msgstr ""
msgid "When an event in GitLab triggers a webhook, you can use the request details to figure out if something went wrong."
msgstr ""
+msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+msgstr ""
+
msgid "When inactive, an external authentication provider must be used."
msgstr ""
@@ -37737,6 +38257,9 @@ msgstr ""
msgid "When:"
msgstr ""
+msgid "Which API requests are affected?"
+msgstr ""
+
msgid "While it's rare to have no vulnerabilities, it can happen. In any event, we ask that you please double check your settings to make sure you've set up your dashboard correctly."
msgstr ""
@@ -38016,6 +38539,9 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|Work Items"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -38091,6 +38617,9 @@ msgstr ""
msgid "You are already a member of this %{member_source}."
msgstr ""
+msgid "You are already impersonating another user"
+msgstr ""
+
msgid "You are an admin, which means granting access to %{client_name} will allow them to interact with GitLab as an admin as well. Proceed with caution."
msgstr ""
@@ -38193,6 +38722,9 @@ msgstr ""
msgid "You can also use project access tokens with Git to authenticate over HTTP(S). %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "You can always change your URL later"
+msgstr ""
+
msgid "You can always edit this later"
msgstr ""
@@ -38349,10 +38881,10 @@ msgstr ""
msgid "You can’t %{tag_start}edit%{tag_end} files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
-msgid "You could not create a new trigger."
+msgid "You can’t edit files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
-msgid "You didn't renew your subscription for %{strong}%{namespace_name}%{strong_close} so it was downgraded to the free plan."
+msgid "You could not create a new trigger."
msgstr ""
msgid "You do not have any subscriptions yet"
@@ -38520,6 +39052,12 @@ msgstr ""
msgid "You must provide your current password in order to change it."
msgstr ""
+msgid "You must sign in to search for specific projects."
+msgstr ""
+
+msgid "You must sign in to search for specific terms."
+msgstr ""
+
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
@@ -38547,6 +39085,9 @@ msgstr ""
msgid "You need to upload a GitLab project export archive (ending in .gz)."
msgstr ""
+msgid "You need to verify your primary email first before enabling Two-Factor Authentication."
+msgstr ""
+
msgid "You successfully declined the invitation"
msgstr ""
@@ -38655,10 +39196,10 @@ msgstr ""
msgid "Your %{host} account was signed in to from a new location"
msgstr ""
-msgid "Your %{strong}%{plan_name}%{strong_close} subscription for %{strong}%{namespace_name}%{strong_close} will expire on %{strong}%{expires_on}%{strong_close}."
+msgid "Your %{strong}%{plan_name}%{strong_close} subscription expires on %{strong}%{expires_on}%{strong_close}. After that date, you cannot create issues or merge requests, or use many other features."
msgstr ""
-msgid "Your %{strong}%{plan_name}%{strong_close} subscription will expire on %{strong}%{expires_on}%{strong_close}. After that, you will not be able to create issues or merge requests as well as many other features."
+msgid "Your %{strong}%{plan_name}%{strong_close} subscription for %{strong}%{namespace_name}%{strong_close} will expire on %{strong}%{expires_on}%{strong_close}."
msgstr ""
msgid "Your CI/CD configuration syntax is invalid. View Lint tab for more details."
@@ -38682,7 +39223,7 @@ msgstr ""
msgid "Your GPG keys (%{count})"
msgstr ""
-msgid "Your GitLab account has been locked due to an excessive amount of unsuccessful sign in attempts. Your account will automatically unlock in %{duration} or you may click the link below to unlock now."
+msgid "Your GitLab account has been locked due to an excessive number of unsuccessful sign in attempts. You can wait for your account to automatically unlock in %{duration} or you can click the link below to unlock now."
msgstr ""
msgid "Your GitLab account request has been approved!"
@@ -38793,6 +39334,9 @@ msgstr ""
msgid "Your commit email is used for web based operations, such as edits and merges."
msgstr ""
+msgid "Your current password is required to register a two-factor authenticator app."
+msgstr ""
+
msgid "Your dashboard has been copied. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
@@ -38892,6 +39436,9 @@ msgstr ""
msgid "Your project limit is %{limit} projects! Please contact your administrator to increase it"
msgstr ""
+msgid "Your project will be created at:"
+msgstr ""
+
msgid "Your projects"
msgstr ""
@@ -38931,11 +39478,10 @@ msgstr ""
msgid "Your subscription expired!"
msgstr ""
-msgid "Your subscription has been downgraded."
-msgstr ""
-
-msgid "Your subscription will expire in %{remaining_days}."
-msgstr ""
+msgid "Your subscription will expire in %{remaining_days} day."
+msgid_plural "Your subscription will expire in %{remaining_days} days."
+msgstr[0] ""
+msgstr[1] ""
msgid "Your username is %{username}."
msgstr ""
@@ -39142,6 +39688,9 @@ msgstr ""
msgid "cannot merge"
msgstr ""
+msgid "cannot not be used for user namespace"
+msgstr ""
+
msgid "ciReport|%{degradedNum} degraded"
msgstr ""
@@ -39465,6 +40014,9 @@ msgstr ""
msgid "created %{timeAgo}"
msgstr ""
+msgid "created %{timeAgo} by %{author}"
+msgstr ""
+
msgid "created by"
msgstr ""
@@ -39509,9 +40061,6 @@ msgstr ""
msgid "does not have a supported extension. Only %{extension_list} are supported"
msgstr ""
-msgid "domain is not authorized for sign-up."
-msgstr ""
-
msgid "download it"
msgstr ""
@@ -39529,18 +40078,13 @@ msgstr ""
msgid "email '%{email}' is not a verified email."
msgstr ""
-msgid "email does not match the allowed domain of %{email_domains}"
-msgid_plural "email does not match the allowed domains: %{email_domains}"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "enabled"
msgstr ""
msgid "encrypted: needs to be a :required, :optional or :migrating!"
msgstr ""
-msgid "ending with MIME type format is not allowed."
+msgid "ending with a reserved file extension is not allowed."
msgstr ""
msgid "entries cannot be larger than 255 characters"
@@ -39564,6 +40108,9 @@ msgstr ""
msgid "estimateCommand|%{slash_command} overwrites the total estimated time."
msgstr ""
+msgid "example.com"
+msgstr ""
+
msgid "exceeds the limit of %{bytes} bytes"
msgstr ""
@@ -39614,9 +40161,6 @@ msgstr ""
msgid "fork"
msgstr ""
-msgid "fork this project"
-msgstr ""
-
msgid "from"
msgstr ""
@@ -39625,6 +40169,9 @@ msgid_plural "from %d jobs"
msgstr[0] ""
msgstr[1] ""
+msgid "frontmatter"
+msgstr ""
+
msgid "group"
msgstr ""
@@ -39652,6 +40199,9 @@ msgstr ""
msgid "has been completed."
msgstr ""
+msgid "has too deep level of nesting"
+msgstr ""
+
msgid "help"
msgstr ""
@@ -39685,9 +40235,21 @@ msgstr ""
msgid "in"
msgstr ""
+msgid "in Infrastructure :: Kubernetes clusters"
+msgstr ""
+
+msgid "in all GitLab"
+msgstr ""
+
+msgid "in group"
+msgstr ""
+
msgid "in group %{link_to_group}"
msgstr ""
+msgid "in project"
+msgstr ""
+
msgid "in project %{link_to_project}"
msgstr ""
@@ -39729,16 +40291,19 @@ msgstr ""
msgid "is not a valid X509 certificate."
msgstr ""
-msgid "is not allowed since the group is not top-level group."
+msgid "is not allowed for sign-up."
msgstr ""
-msgid "is not allowed. Try again with a different email address, or contact your GitLab admin."
+msgid "is not allowed for this group."
msgstr ""
-msgid "is not allowed. We do not currently support project-level iterations"
+msgid "is not allowed for this project."
+msgstr ""
+
+msgid "is not allowed since the group is not top-level group."
msgstr ""
-msgid "is not from an allowed domain."
+msgid "is not allowed. We do not currently support project-level iterations"
msgstr ""
msgid "is not in the group enforcing Group Managed Account"
@@ -39831,6 +40396,9 @@ msgstr ""
msgid "log in"
msgstr ""
+msgid "managed"
+msgstr ""
+
msgid "manual"
msgstr ""
@@ -39878,6 +40446,9 @@ msgstr ""
msgid "mrWidget| Please restore it or use a different %{missingBranchName} branch"
msgstr ""
+msgid "mrWidget|%{linkStart}Set up now%{linkEnd} to analyze your source code for known security vulnerabilities."
+msgstr ""
+
msgid "mrWidget|%{mergeError}."
msgstr ""
@@ -39958,6 +40529,9 @@ msgid_plural "mrWidget|Closes issues"
msgstr[0] ""
msgstr[1] ""
+msgid "mrWidget|Create issue to resolve all threads"
+msgstr ""
+
msgid "mrWidget|Delete source branch"
msgstr ""
@@ -39967,12 +40541,18 @@ msgstr ""
msgid "mrWidget|Did not close"
msgstr ""
+msgid "mrWidget|Dismiss"
+msgstr ""
+
msgid "mrWidget|Email patches"
msgstr ""
msgid "mrWidget|Failed to load deployment statistics"
msgstr ""
+msgid "mrWidget|Hide %{widget} details"
+msgstr ""
+
msgid "mrWidget|If the %{missingBranchName} branch exists in your local repository, you can merge this merge request manually using the command line"
msgstr ""
@@ -40068,9 +40648,6 @@ msgstr ""
msgid "mrWidget|Request to merge"
msgstr ""
-msgid "mrWidget|Resolve all threads in new issue"
-msgstr ""
-
msgid "mrWidget|Resolve conflicts"
msgstr ""
@@ -40086,6 +40663,9 @@ msgstr ""
msgid "mrWidget|Revoke approval"
msgstr ""
+msgid "mrWidget|SAST and Secret Detection is not enabled."
+msgstr ""
+
msgid "mrWidget|Set by %{merge_author} to be added to the merge train when the pipeline succeeds"
msgstr ""
@@ -40095,6 +40675,9 @@ msgstr ""
msgid "mrWidget|Set by %{merge_author} to start a merge train when the pipeline succeeds"
msgstr ""
+msgid "mrWidget|Show %{widget} details"
+msgstr ""
+
msgid "mrWidget|The changes were merged into"
msgstr ""
@@ -40107,6 +40690,9 @@ msgstr ""
msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure, or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
msgstr ""
+msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure."
+msgstr ""
+
msgid "mrWidget|The source branch has been deleted"
msgstr ""
@@ -40149,6 +40735,9 @@ msgstr ""
msgid "mrWidget|You can merge after removing denied licenses"
msgstr ""
+msgid "mrWidget|You can only merge once this merge request is approved."
+msgstr ""
+
msgid "mrWidget|Your password"
msgstr ""
@@ -40185,6 +40774,9 @@ msgstr ""
msgid "must be less than the limit of %{tag_limit} tags"
msgstr ""
+msgid "must be set for a project namespace"
+msgstr ""
+
msgid "must be unique by status and elapsed time within a policy"
msgstr ""
@@ -40294,6 +40886,9 @@ msgstr ""
msgid "pipeline"
msgstr ""
+msgid "pipeline schedules documentation"
+msgstr ""
+
msgid "pod_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
msgstr ""
@@ -40343,16 +40938,25 @@ msgstr ""
msgid "project name"
msgstr ""
+msgid "project namespace cannot be the parent of another namespace"
+msgstr ""
+
msgid "projects"
msgstr ""
msgid "quick actions"
msgstr ""
-msgid "reCAPTCHA Private Key"
+msgid "reCAPTCHA"
+msgstr ""
+
+msgid "reCAPTCHA helps prevent credential stuffing."
msgstr ""
-msgid "reCAPTCHA Site Key"
+msgid "reCAPTCHA private key"
+msgstr ""
+
+msgid "reCAPTCHA site key"
msgstr ""
msgid "recent activity"
@@ -40579,6 +41183,9 @@ msgstr ""
msgid "user avatar"
msgstr ""
+msgid "user namespace cannot be the parent of another namespace"
+msgstr ""
+
msgid "user preferences"
msgstr ""
@@ -40671,3 +41278,9 @@ msgstr ""
msgid "your settings"
msgstr ""
+msgid "{group}"
+msgstr ""
+
+msgid "{project}"
+msgstr ""
+
diff --git a/locale/vi_VN/gitlab.po b/locale/vi_VN/gitlab.po
index 9a748d881ad..52ecf819c77 100644
--- a/locale/vi_VN/gitlab.po
+++ b/locale/vi_VN/gitlab.po
@@ -14,10 +14,7 @@ msgstr ""
"X-Crowdin-Language: vi\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-09-01 22:30\n"
-
-msgid " %{name}, confirm your email address now! "
-msgstr ""
+"PO-Revision-Date: 2021-10-04 20:18\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -90,6 +87,14 @@ msgstr ""
msgid "#general, #development"
msgstr ""
+msgid "%d Alert"
+msgid_plural "%d Alerts"
+msgstr[0] ""
+
+msgid "%d Alert:"
+msgid_plural "%d Alerts:"
+msgstr[0] ""
+
msgid "%d Approval"
msgid_plural "%d Approvals"
msgstr[0] ""
@@ -387,7 +392,10 @@ msgstr ""
msgid "%{code_open}Protected:%{code_close} Only exposed to protected branches or tags."
msgstr ""
-msgid "%{commit_author_link} authored %{commit_timeago}"
+msgid "%{commit_author_link} authored %{commit_authored_timeago}"
+msgstr ""
+
+msgid "%{commit_author_link} authored %{commit_authored_timeago} and %{commit_committer_avatar} %{commit_committer_link} committed %{commit_committer_timeago}"
msgstr ""
msgid "%{completedCount} completed weight"
@@ -476,6 +484,15 @@ msgstr ""
msgid "%{doc_link_start}Advanced search%{doc_link_end} is enabled."
msgstr ""
+msgid "%{docs_link_start}Learn about visibility levels.%{docs_link_end}"
+msgstr ""
+
+msgid "%{docs_link_start}What is Large File Storage?%{docs_link_end}"
+msgstr ""
+
+msgid "%{docs_link_start}What is two-factor authentication?%{docs_link_end}"
+msgstr ""
+
msgid "%{due_date} (Past due)"
msgstr ""
@@ -548,9 +565,6 @@ msgstr ""
msgid "%{issueType} actions"
msgstr ""
-msgid "%{issuesCount} issues with a limit of %{maxIssueCount}"
-msgstr ""
-
msgid "%{issuesSize} with a limit of %{maxIssueCount}"
msgstr ""
@@ -608,6 +622,12 @@ msgstr ""
msgid "%{label_for_message} unavailable"
msgstr ""
+msgid "%{learn_more_link}."
+msgstr ""
+
+msgid "%{lessThan} 1 hour"
+msgstr ""
+
msgid "%{lets_encrypt_link_start}Let's Encrypt%{lets_encrypt_link_end} is a free, automated, and open certificate authority (CA) that issues digital certificates to enable HTTPS (SSL/TLS) for sites."
msgstr ""
@@ -620,15 +640,15 @@ msgstr ""
msgid "%{link_start}Learn more%{link_end} about roles."
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
-msgstr ""
-
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
msgstr ""
msgid "%{link_start}Start the title with %{draft_snippet}%{link_end} to prevent a merge request that is a work in progress from being merged before it's ready."
msgstr ""
+msgid "%{link_start}What information does GitLab Inc. collect?%{link_end}"
+msgstr ""
+
msgid "%{listToShow}, and %{awardsListLength} more"
msgstr ""
@@ -777,7 +797,7 @@ msgid "%{securityScanner} result is not available because a pipeline has not bee
msgid_plural "%{securityScanner} results are not available because a pipeline has not been run since it was enabled. %{linkStart}Run a pipeline%{linkEnd}"
msgstr[0] ""
-msgid "%{service_ping_link_start}Learn more%{service_ping_link_end} about what information is shared with GitLab Inc."
+msgid "%{service_ping_link_start}What information is shared with GitLab Inc.?%{service_ping_link_end}"
msgstr ""
msgid "%{size} %{unit}"
@@ -813,6 +833,9 @@ msgstr ""
msgid "%{state} epics"
msgstr ""
+msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
+msgstr ""
+
msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
msgstr ""
@@ -865,10 +888,6 @@ msgstr ""
msgid "%{template_project_id} is unknown or invalid"
msgstr ""
-msgid "%{text} %{files}"
-msgid_plural "%{text} %{files} files"
-msgstr[0] ""
-
msgid "%{text} is available"
msgstr ""
@@ -953,9 +972,6 @@ msgstr ""
msgid "%{wildcards_link_start}Wildcards%{wildcards_link_end} such as %{code_tag_start}v*%{code_tag_end} or %{code_tag_start}*-release%{code_tag_end} are supported."
msgstr ""
-msgid "&lt; 1 hour"
-msgstr ""
-
msgid "'%{data}' at %{location} does not match format: %{format}"
msgstr ""
@@ -1038,9 +1054,6 @@ msgstr ""
msgid "(we need your current password to confirm your changes)"
msgstr ""
-msgid "* * * * *"
-msgstr ""
-
msgid "+ %{amount} more"
msgstr ""
@@ -1104,10 +1117,10 @@ msgstr ""
msgid "."
msgstr ""
-msgid "0 bytes"
+msgid "/"
msgstr ""
-msgid "0 for unlimited, only effective with remote storage enabled."
+msgid "0 bytes"
msgstr ""
msgid "0t1DgySidms"
@@ -1214,6 +1227,9 @@ msgstr ""
msgid "1000+"
msgstr ""
+msgid "192.168.0.0/24"
+msgstr ""
+
msgid "1st contribution!"
msgstr ""
@@ -1367,9 +1383,6 @@ msgstr ""
msgid "A plain HTML site that uses Netlify for CI/CD instead of GitLab, but still with all the other great GitLab features"
msgstr ""
-msgid "A plain-text response to show to clients that hit the rate limit."
-msgstr ""
-
msgid "A platform value can be web, mob or app."
msgstr ""
@@ -1451,7 +1464,7 @@ msgstr ""
msgid "APIFuzzing|Configure HTTP basic authentication values. Other authentication methods are supported. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
+msgid "APIFuzzing|Customize your project's API fuzzing configuration options and copy the code snippet to your .gitlab-ci.yml file to apply any changes. Note that this tool does not reflect or update your .gitlab-ci.yml file automatically. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
msgstr ""
msgid "APIFuzzing|Enable authentication"
@@ -1514,9 +1527,6 @@ msgstr ""
msgid "APIFuzzing|To prevent a security leak, authentication info must be added as a %{ciVariablesLinkStart}CI variable%{ciVariablesLinkEnd}. As a user with maintainer access rights, you can manage CI variables in the %{ciSettingsLinkStart}Settings%{ciSettingsLinkEnd} area."
msgstr ""
-msgid "APIFuzzing|Use this tool to generate API fuzzing configuration YAML to copy into your .gitlab-ci.yml file. This tool does not reflect or update your .gitlab-ci.yml file automatically."
-msgstr ""
-
msgid "APIFuzzing|Username for basic authentication"
msgstr ""
@@ -1568,9 +1578,6 @@ msgstr ""
msgid "Abuse reports notification email"
msgstr ""
-msgid "Abuse reports will be sent to this address if it is set. Abuse reports are always available in the admin area."
-msgstr ""
-
msgid "Accept invitation"
msgstr ""
@@ -1607,12 +1614,18 @@ msgstr ""
msgid "Access granted"
msgstr ""
+msgid "Access key ID"
+msgstr ""
+
msgid "Access requests"
msgstr ""
msgid "Access to '%{classification_label}' not allowed"
msgstr ""
+msgid "Access tokens expire after 2 hours. A refresh token may be used at any time to generate a new access token. Non-expiring access tokens are deprecated. Clear this setting to enable backward compatibility."
+msgstr ""
+
msgid "AccessDropdown|Deploy Keys"
msgstr ""
@@ -1925,6 +1938,9 @@ msgstr ""
msgid "Add new directory"
msgstr ""
+msgid "Add new service account"
+msgstr ""
+
msgid "Add or remove previously merged commits"
msgstr ""
@@ -2162,6 +2178,9 @@ msgstr ""
msgid "AdminArea|Features"
msgstr ""
+msgid "AdminArea|Get security updates from GitLab and stay up to date"
+msgstr ""
+
msgid "AdminArea|Groups"
msgstr ""
@@ -2201,6 +2220,12 @@ msgstr ""
msgid "AdminArea|Reporter"
msgstr ""
+msgid "AdminArea|Sign up for the GitLab Security Newsletter to get notified for security updates."
+msgstr ""
+
+msgid "AdminArea|Sign up for the GitLab newsletter"
+msgstr ""
+
msgid "AdminArea|Stop all jobs"
msgstr ""
@@ -2270,9 +2295,15 @@ msgstr ""
msgid "AdminSettings|Disable public access to Pages sites"
msgstr ""
+msgid "AdminSettings|Display a banner on merge requests in projects with no pipelines to initiate steps to add a .gitlab-ci.yml file."
+msgstr ""
+
msgid "AdminSettings|Domain verification is an essential security measure for public GitLab sites. Users are required to demonstrate they control a domain before it is enabled. %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "AdminSettings|Enable pipeline suggestion banner"
+msgstr ""
+
msgid "AdminSettings|Enable shared runners for new projects"
msgstr ""
@@ -2744,10 +2775,10 @@ msgstr ""
msgid "Admin|Quarterly reconciliation will occur on %{qrtlyDate}"
msgstr ""
-msgid "Admin|The number of max seats used for your namespace is currently exceeding the number of seats in your subscription. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgid "Admin|The number of max seats in your namespace exceeds the number of seats in your subscription. On %{qrtlyDate}, quarterly reconciliation occurs and you are automatically billed a prorated amount for the overage. No action is needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice. For more information about the timing of the invoicing process, view the documentation."
msgstr ""
-msgid "Admin|The number of maximum users for your instance is currently exceeding the number of users in license. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgid "Admin|The number of max users in your instance exceeds the number of users in your license. On %{qrtlyDate}, quarterly reconciliation occurs and you are automatically billed a prorated amount for the overage. No action is needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice. For more information about the timing of the invoicing process, view the documentation."
msgstr ""
msgid "Admin|View pending user approvals"
@@ -2768,9 +2799,6 @@ msgstr ""
msgid "Advanced export options"
msgstr ""
-msgid "Advanced permissions, Large File Storage and Two-Factor authentication settings."
-msgstr ""
-
msgid "After a successful password update you will be redirected to login screen."
msgstr ""
@@ -2789,12 +2817,14 @@ msgstr ""
msgid "After you've reviewed these contribution guidelines, you'll be all set to"
msgstr ""
+msgid "Akismet"
+msgstr ""
+
msgid "Akismet API Key"
msgstr ""
-msgid "Alert"
-msgid_plural "Alerts"
-msgstr[0] ""
+msgid "Akismet helps prevent the creation of spam issues in public projects."
+msgstr ""
msgid "AlertManagement|Acknowledged"
msgstr ""
@@ -3150,6 +3180,9 @@ msgstr ""
msgid "All (default)"
msgstr ""
+msgid "All GitLab"
+msgstr ""
+
msgid "All Members"
msgstr ""
@@ -3264,6 +3297,9 @@ msgstr ""
msgid "Allow this secondary node to replicate content on Object Storage"
msgstr ""
+msgid "Allow use of licensed EE features"
+msgstr ""
+
msgid "Allow users to dismiss the broadcast message"
msgstr ""
@@ -3339,9 +3375,6 @@ msgstr ""
msgid "Amazon authentication is not %{link_start}correctly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
-msgid "Amount of time (in hours) that users are allowed to skip forced configuration of two-factor authentication"
-msgstr ""
-
msgid "An %{link_start}alert%{link_end} with the same fingerprint is already open. To change the status of this alert, resolve the linked alert."
msgstr ""
@@ -3402,12 +3435,6 @@ msgstr ""
msgid "An error occurred when removing the label."
msgstr ""
-msgid "An error occurred when toggling the notification subscription"
-msgstr ""
-
-msgid "An error occurred when updating the issue weight"
-msgstr ""
-
msgid "An error occurred when updating the title"
msgstr ""
@@ -3456,6 +3483,9 @@ msgstr ""
msgid "An error occurred while enabling Service Desk."
msgstr ""
+msgid "An error occurred while fetching Markdown preview"
+msgstr ""
+
msgid "An error occurred while fetching ancestors"
msgstr ""
@@ -3486,9 +3516,6 @@ msgstr ""
msgid "An error occurred while fetching label colors."
msgstr ""
-msgid "An error occurred while fetching markdown preview"
-msgstr ""
-
msgid "An error occurred while fetching participants"
msgstr ""
@@ -3504,9 +3531,6 @@ msgstr ""
msgid "An error occurred while fetching reference"
msgstr ""
-msgid "An error occurred while fetching sidebar data"
-msgstr ""
-
msgid "An error occurred while fetching tags. Retry the search."
msgstr ""
@@ -3582,6 +3606,9 @@ msgstr ""
msgid "An error occurred while loading merge requests."
msgstr ""
+msgid "An error occurred while loading projects."
+msgstr ""
+
msgid "An error occurred while loading the Needs tab."
msgstr ""
@@ -3816,12 +3843,6 @@ msgstr ""
msgid "Any Milestone"
msgstr ""
-msgid "Any branch"
-msgstr ""
-
-msgid "Any eligible user"
-msgstr ""
-
msgid "Any encrypted tokens"
msgstr ""
@@ -3840,6 +3861,9 @@ msgstr ""
msgid "Any namespace"
msgstr ""
+msgid "App Engine description and apps that are suitable for this deployment target"
+msgstr ""
+
msgid "App ID"
msgstr ""
@@ -3986,6 +4010,10 @@ msgstr ""
msgid "Apply"
msgstr ""
+msgid "Apply %d suggestion"
+msgid_plural "Apply %d suggestions"
+msgstr[0] ""
+
msgid "Apply a label"
msgstr ""
@@ -3995,13 +4023,10 @@ msgstr ""
msgid "Apply suggestion"
msgstr ""
-msgid "Apply suggestions"
-msgstr ""
-
msgid "Apply template"
msgstr ""
-msgid "Apply this approval rule to any branch or a specific protected branch."
+msgid "Apply this approval rule to all branches or a specific protected branch."
msgstr ""
msgid "Applying"
@@ -4140,9 +4165,6 @@ msgstr ""
msgid "ApprovalSettings|Prevent editing approval rules in projects and merge requests."
msgstr ""
-msgid "ApprovalSettings|Prevent editing approval rules in projects and merge requests. "
-msgstr ""
-
msgid "ApprovalSettings|Remove all approvals when commits are added to the source branch."
msgstr ""
@@ -4158,6 +4180,9 @@ msgstr ""
msgid "ApprovalSettings|This setting is configured at the instance level and can only be changed by an administrator."
msgstr ""
+msgid "ApprovalSettings|This setting is configured in %{groupName} and can only be changed by an administrator or group owner."
+msgstr ""
+
msgid "ApprovalStatusTooltip|Adheres to separation of duties"
msgstr ""
@@ -4641,9 +4666,6 @@ msgstr ""
msgid "Authenticated API rate limit period in seconds"
msgstr ""
-msgid "Authenticated API request rate limit"
-msgstr ""
-
msgid "Authenticated API requests"
msgstr ""
@@ -4653,10 +4675,10 @@ msgstr ""
msgid "Authenticated Git LFS request rate limit"
msgstr ""
-msgid "Authenticated web rate limit period in seconds"
+msgid "Authenticated Git LFS requests"
msgstr ""
-msgid "Authenticated web request rate limit"
+msgid "Authenticated web rate limit period in seconds"
msgstr ""
msgid "Authenticated web requests"
@@ -5034,9 +5056,6 @@ msgstr ""
msgid "Below you will find all the groups that are public."
msgstr ""
-msgid "Beta"
-msgstr ""
-
msgid "Bi-weekly code coverage"
msgstr ""
@@ -5275,6 +5294,21 @@ msgstr ""
msgid "Board scope affects which issues are displayed for anyone who visits this board"
msgstr ""
+msgid "BoardNewEpic|Groups"
+msgstr ""
+
+msgid "BoardNewEpic|Loading groups"
+msgstr ""
+
+msgid "BoardNewEpic|No matching results"
+msgstr ""
+
+msgid "BoardNewEpic|Search groups"
+msgstr ""
+
+msgid "BoardNewEpic|Select a group"
+msgstr ""
+
msgid "BoardNewIssue|No matching results"
msgstr ""
@@ -5351,6 +5385,9 @@ msgstr ""
msgid "Boards|An error occurred while creating the list. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching child groups. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching group projects. Please try again."
msgstr ""
@@ -5682,6 +5719,9 @@ msgstr ""
msgid "Bulk update"
msgstr ""
+msgid "BulkImports|Re-import creates a new group. It does not sync with the existing group."
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -5691,6 +5731,9 @@ msgstr ""
msgid "BulkImport|From source group"
msgstr ""
+msgid "BulkImport|Group import history"
+msgstr ""
+
msgid "BulkImport|Import failed: Destination cannot be a subgroup of the source group. Change the destination and try again."
msgstr ""
@@ -5703,9 +5746,18 @@ msgstr ""
msgid "BulkImport|Importing the group failed"
msgstr ""
+msgid "BulkImport|Last imported to %{link}"
+msgstr ""
+
msgid "BulkImport|Name already exists."
msgstr ""
+msgid "BulkImport|New group"
+msgstr ""
+
+msgid "BulkImport|No history is available"
+msgstr ""
+
msgid "BulkImport|No parent"
msgstr ""
@@ -5718,6 +5770,9 @@ msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} matching filter \"%{filter}\" from %{link}"
msgstr ""
+msgid "BulkImport|Source group"
+msgstr ""
+
msgid "BulkImport|To new group"
msgstr ""
@@ -5727,6 +5782,9 @@ msgstr ""
msgid "BulkImport|You have no groups to import"
msgstr ""
+msgid "BulkImport|Your imported groups will appear here."
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -5968,6 +6026,9 @@ msgstr ""
msgid "Can be manually deployed to"
msgstr ""
+msgid "Can be overridden in each project."
+msgstr ""
+
msgid "Can create groups:"
msgstr ""
@@ -6070,6 +6131,9 @@ msgstr ""
msgid "Cancelling Preview"
msgstr ""
+msgid "Cannot assign a confidential epic to a non-confidential issue. Make the issue confidential and try again"
+msgstr ""
+
msgid "Cannot be assigned to other projects."
msgstr ""
@@ -6121,9 +6185,6 @@ msgstr ""
msgid "Cannot refer to a group %{timebox_type} by an internal id!"
msgstr ""
-msgid "Cannot set confidential epic for a non-confidential issue"
-msgstr ""
-
msgid "Cannot show preview. For previews on sketch files, they must have the file format introduced by Sketch version 43 and above."
msgstr ""
@@ -6361,15 +6422,15 @@ msgstr ""
msgid "Check out, review, and merge locally"
msgstr ""
-msgid "Check the %{docs_link_start}documentation%{docs_link_end}."
-msgstr ""
-
msgid "Check the current instance configuration "
msgstr ""
msgid "Check the elasticsearch.log file to debug why the migration was halted and make any changes before retrying the migration. When you fix the cause of the failure, click \"Retry migration\", and the migration will be scheduled to be retried in the background."
msgstr ""
+msgid "Check with your administrator."
+msgstr ""
+
msgid "Check your Docker images for known vulnerabilities."
msgstr ""
@@ -6400,6 +6461,9 @@ msgstr ""
msgid "Checkout"
msgstr ""
+msgid "Checkout|$%{selectedPlanPrice} per 10 GB storage per pack"
+msgstr ""
+
msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 minutes"
msgstr ""
@@ -6419,16 +6483,22 @@ msgstr ""
msgid "Checkout|%{name}'s GitLab subscription"
msgstr ""
-msgid "Checkout|%{selectedPlanText} plan"
+msgid "Checkout|%{name}'s storage subscription"
msgstr ""
-msgid "Checkout|%{startDate} - %{endDate}"
+msgid "Checkout|%{quantity} GB of storage"
msgstr ""
-msgid "Checkout|%{totalCiMinutes} CI minute"
-msgid_plural "Checkout|%{totalCiMinutes} CI minutes"
+msgid "Checkout|%{quantity} storage pack"
+msgid_plural "Checkout|%{quantity} storage packs"
msgstr[0] ""
+msgid "Checkout|%{selectedPlanText} plan"
+msgstr ""
+
+msgid "Checkout|%{startDate} - %{endDate}"
+msgstr ""
+
msgid "Checkout|%{totalCiMinutes} CI minutes"
msgstr ""
@@ -6504,6 +6574,9 @@ msgstr ""
msgid "Checkout|Failed to register credit card. Please try again."
msgstr ""
+msgid "Checkout|GB"
+msgstr ""
+
msgid "Checkout|GitLab group"
msgstr ""
@@ -6540,6 +6613,9 @@ msgstr ""
msgid "Checkout|State"
msgstr ""
+msgid "Checkout|Storage packs"
+msgstr ""
+
msgid "Checkout|Street address"
msgstr ""
@@ -6561,6 +6637,9 @@ msgstr ""
msgid "Checkout|Total minutes: %{quantity}"
msgstr ""
+msgid "Checkout|Total storage: %{quantity} GB"
+msgstr ""
+
msgid "Checkout|Users"
msgstr ""
@@ -6570,16 +6649,25 @@ msgstr ""
msgid "Checkout|Your organization"
msgstr ""
+msgid "Checkout|Your storage subscription has the same term as your main subscription, and the price is prorated accordingly."
+msgstr ""
+
msgid "Checkout|Your subscription will be applied to this group"
msgstr ""
msgid "Checkout|Zip code"
msgstr ""
+msgid "Checkout|a storage subscription"
+msgstr ""
+
msgid "Checkout|company or team"
msgstr ""
-msgid "Checkout|x 1,000 minutes per pack = %{strong}"
+msgid "Checkout|minutes"
+msgstr ""
+
+msgid "Checkout|x %{quantity} %{units} per pack ="
msgstr ""
msgid "Cherry-pick this commit"
@@ -6936,6 +7024,9 @@ msgstr ""
msgid "CloneIssue|Cannot clone issue to target project as it is pending deletion."
msgstr ""
+msgid "CloneIssue|Cannot clone issues of '%{issue_type}' type."
+msgstr ""
+
msgid "Cloned this issue to %{path_to_project}."
msgstr ""
@@ -6990,7 +7081,10 @@ msgstr ""
msgid "Closes this %{quick_action_target}."
msgstr ""
-msgid "Cloud licenses can not be removed."
+msgid "Cloud Functions description and apps that are suitable for this deployment target"
+msgstr ""
+
+msgid "Cloud Run description and apps that are suitable for this deployment target"
msgstr ""
msgid "Cluster"
@@ -7017,6 +7111,12 @@ msgstr ""
msgid "ClusterAgents|Access tokens"
msgstr ""
+msgid "ClusterAgents|Agent might not be connected to GitLab"
+msgstr ""
+
+msgid "ClusterAgents|Agent never connected to GitLab"
+msgstr ""
+
msgid "ClusterAgents|Alternative installation methods"
msgstr ""
@@ -7032,6 +7132,12 @@ msgstr ""
msgid "ClusterAgents|Configuration"
msgstr ""
+msgid "ClusterAgents|Connected"
+msgstr ""
+
+msgid "ClusterAgents|Connection status"
+msgstr ""
+
msgid "ClusterAgents|Copy token"
msgstr ""
@@ -7050,6 +7156,9 @@ msgstr ""
msgid "ClusterAgents|For alternative installation methods %{linkStart}go to the documentation%{linkEnd}."
msgstr ""
+msgid "ClusterAgents|For more troubleshooting information go to"
+msgstr ""
+
msgid "ClusterAgents|Go to the repository"
msgstr ""
@@ -7065,18 +7174,30 @@ msgstr ""
msgid "ClusterAgents|Integrate with the GitLab Agent"
msgstr ""
-msgid "ClusterAgents|Last used"
+msgid "ClusterAgents|Last connected %{timeAgo}."
+msgstr ""
+
+msgid "ClusterAgents|Last contact"
msgstr ""
msgid "ClusterAgents|Learn how to create an agent access token"
msgstr ""
+msgid "ClusterAgents|Make sure you are using a valid token."
+msgstr ""
+
msgid "ClusterAgents|Name"
msgstr ""
msgid "ClusterAgents|Never"
msgstr ""
+msgid "ClusterAgents|Never connected"
+msgstr ""
+
+msgid "ClusterAgents|Not connected"
+msgstr ""
+
msgid "ClusterAgents|Read more about getting started"
msgstr ""
@@ -7098,6 +7219,9 @@ msgstr ""
msgid "ClusterAgents|Select which Agent you want to install"
msgstr ""
+msgid "ClusterAgents|The Agent has not been connected in a long time. There might be a connectivity issue. Last contact was %{timeAgo}."
+msgstr ""
+
msgid "ClusterAgents|The GitLab Agent also requires %{linkStart}enabling the Agent Server%{linkEnd}"
msgstr ""
@@ -7125,9 +7249,6 @@ msgstr ""
msgid "ClusterAgents|You will need to create a token to connect to your agent"
msgstr ""
-msgid "ClusterAgent|This feature is only available for premium plans"
-msgstr ""
-
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -7317,9 +7438,6 @@ msgstr ""
msgid "ClusterIntegration|Create Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Create a provision role on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the account and external ID above. %{startMoreInfoLink}More information%{endLink}"
-msgstr ""
-
msgid "ClusterIntegration|Create cluster on"
msgstr ""
@@ -7752,7 +7870,7 @@ msgstr ""
msgid "ClusterIntegration|Subnets"
msgstr ""
-msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provisioned role, first create one on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the above account and external IDs. %{startMoreInfoLink}More information%{endLink}"
+msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provisioned role, first create one on %{awsLinkStart}Amazon Web Services %{awsLinkEnd} using the above account and external IDs. %{moreInfoStart}More information%{moreInfoEnd}"
msgstr ""
msgid "ClusterIntegration|The Kubernetes certificate used to authenticate to the cluster."
@@ -7986,6 +8104,9 @@ msgstr ""
msgid "Collapse replies"
msgstr ""
+msgid "Collapse settings section"
+msgstr ""
+
msgid "Collapse sidebar"
msgstr ""
@@ -8004,6 +8125,9 @@ msgstr ""
msgid "Comma-separated list of email addresses."
msgstr ""
+msgid "Comma-separated list of users allowed to exceed the rate limit."
+msgstr ""
+
msgid "Comma-separated, e.g. '1.1.1.1, 2.2.2.0/24'"
msgstr ""
@@ -8323,6 +8447,9 @@ msgstr ""
msgid "Configure %{repository_checks_link_start}repository checks%{link_end} and %{housekeeping_link_start}housekeeping%{link_end} on repositories."
msgstr ""
+msgid "Configure CAPTCHAs, IP address limits, and other anti-spam measures."
+msgstr ""
+
msgid "Configure Dependency Scanning in `.gitlab-ci.yml` using the GitLab managed template. You can [add variable overrides](https://docs.gitlab.com/ee/user/application_security/dependency_scanning/#customizing-the-dependency-scanning-settings) to customize Dependency Scanning settings."
msgstr ""
@@ -8359,16 +8486,13 @@ msgstr ""
msgid "Configure a %{codeStart}.gitlab-webide.yml%{codeEnd} file in the %{codeStart}.gitlab%{codeEnd} directory to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
msgstr ""
-msgid "Configure existing installation"
-msgstr ""
-
-msgid "Configure limit for notes created per minute by web and API requests."
+msgid "Configure advanced permissions, Large File Storage, and two-factor authentication settings."
msgstr ""
-msgid "Configure limits for Project/Group Import/Export."
+msgid "Configure approvals by authors and committers on all projects."
msgstr ""
-msgid "Configure limits for web and API requests."
+msgid "Configure existing installation"
msgstr ""
msgid "Configure paths to be protected by Rack Attack."
@@ -8383,10 +8507,13 @@ msgstr ""
msgid "Configure settings for Advanced Search with Elasticsearch."
msgstr ""
+msgid "Configure specific limits for Files API requests that supersede the general user and IP rate limits."
+msgstr ""
+
msgid "Configure specific limits for Git LFS requests that supersede the general user and IP rate limits."
msgstr ""
-msgid "Configure specific limits for Packages API requests that supersede the general user and IP rate limits."
+msgid "Configure specific limits for deprecated API requests that supersede the general user and IP rate limits."
msgstr ""
msgid "Configure the %{link} integration."
@@ -8398,6 +8525,9 @@ msgstr ""
msgid "Configure the way a user creates a new account."
msgstr ""
+msgid "Configure via Merge Request"
+msgstr ""
+
msgid "Configure which lists are shown for anyone who visits this board"
msgstr ""
@@ -8863,6 +8993,9 @@ msgstr ""
msgid "Content parsed with %{link}."
msgstr ""
+msgid "ContentEditor|Table of Contents"
+msgstr ""
+
msgid "ContentEditor|You have to provide a renderMarkdown function or a custom serializer"
msgstr ""
@@ -9049,6 +9182,9 @@ msgstr ""
msgid "Copy link to chart"
msgstr ""
+msgid "Copy prefix"
+msgstr ""
+
msgid "Copy reference"
msgstr ""
@@ -9079,6 +9215,9 @@ msgstr ""
msgid "Copy value"
msgstr ""
+msgid "Corpus Management"
+msgstr ""
+
msgid "Corpus Management|Are you sure you want to delete the corpus?"
msgstr ""
@@ -9307,6 +9446,9 @@ msgstr ""
msgid "Create commit"
msgstr ""
+msgid "Create common files more quickly, and standardize their format."
+msgstr ""
+
msgid "Create confidential merge request"
msgstr ""
@@ -9340,6 +9482,9 @@ msgstr ""
msgid "Create issue"
msgstr ""
+msgid "Create issue to resolve all threads"
+msgstr ""
+
msgid "Create iteration"
msgstr ""
@@ -9394,6 +9539,9 @@ msgstr ""
msgid "Create new..."
msgstr ""
+msgid "Create or import your first project"
+msgstr ""
+
msgid "Create project"
msgstr ""
@@ -9751,7 +9899,7 @@ msgstr ""
msgid "Custom notification events"
msgstr ""
-msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notificationLinkStart} notification emails%{notificationLinkEnd}."
+msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notificationLinkStart}notification emails%{notificationLinkEnd}."
msgstr ""
msgid "Custom project templates"
@@ -9948,10 +10096,10 @@ msgid "CycleAnalytics|Showing %{subjectFilterText} and %{selectedLabelsCount} la
msgid_plural "CycleAnalytics|Showing %{subjectFilterText} and %{selectedLabelsCount} labels"
msgstr[0] ""
-msgid "CycleAnalytics|Showing data for group '%{groupName}' and %{selectedProjectCount} projects from %{startDate} to %{endDate}"
+msgid "CycleAnalytics|Showing data for group '%{groupName}' and %{selectedProjectCount} projects from %{createdAfter} to %{createdBefore}"
msgstr ""
-msgid "CycleAnalytics|Showing data for group '%{groupName}' from %{startDate} to %{endDate}"
+msgid "CycleAnalytics|Showing data for group '%{groupName}' from %{createdAfter} to %{createdBefore}"
msgstr ""
msgid "CycleAnalytics|Stages"
@@ -10185,6 +10333,9 @@ msgstr ""
msgid "DastProfiles|Manage profiles"
msgstr ""
+msgid "DastProfiles|Manage site profiles"
+msgstr ""
+
msgid "DastProfiles|Minimum = 0 (no timeout enabled), Maximum = 2880 minutes"
msgstr ""
@@ -10260,6 +10411,9 @@ msgstr ""
msgid "DastProfiles|Scanner name"
msgstr ""
+msgid "DastProfiles|Schedule"
+msgstr ""
+
msgid "DastProfiles|Select branch"
msgstr ""
@@ -10329,7 +10483,7 @@ msgstr ""
msgid "DastProfiles|Website"
msgstr ""
-msgid "DastProfiles|You can either choose a passive scan or validate the target site in your chosen site profile. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
+msgid "DastProfiles|You can either choose a passive scan or validate the target site from the site profile management page. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
msgstr ""
msgid "DastProfiles|You cannot run an active scan against an unvalidated site."
@@ -10501,7 +10655,7 @@ msgstr ""
msgid "Days to merge"
msgstr ""
-msgid "Deactivate dormant users after 90 days of inactivity. Users can return to active status by signing in to their account. While inactive, a user is not counted as an active user in the instance."
+msgid "Deactivate dormant users after 90 days of inactivity"
msgstr ""
msgid "Dear Administrator,"
@@ -10588,10 +10742,10 @@ msgstr ""
msgid "Define a custom pattern with cron syntax"
msgstr ""
-msgid "Define approval settings."
+msgid "Define approval rules."
msgstr ""
-msgid "Define approval settings. %{linkStart}Learn more.%{linkEnd}"
+msgid "Define approval rules. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "Define custom rules for what constitutes spam, independent of Akismet"
@@ -10600,7 +10754,7 @@ msgstr ""
msgid "Define environments in the deploy stage(s) in %{code_open}.gitlab-ci.yml%{code_close} to track deployments here."
msgstr ""
-msgid "Define how approval rules are applied as a merge request moves toward completion."
+msgid "Define how approval rules are applied to merge requests."
msgstr ""
msgid "Definition"
@@ -10615,6 +10769,12 @@ msgstr ""
msgid "DelayedJobs|Are you sure you want to run %{job_name} immediately? This job will run automatically after it's timer finishes."
msgstr ""
+msgid "DelayedJobs|Are you sure you want to run %{job_name} immediately? This job will run automatically after its timer finishes."
+msgstr ""
+
+msgid "DelayedJobs|Run the delayed job now?"
+msgstr ""
+
msgid "DelayedJobs|Start now"
msgstr ""
@@ -10888,6 +11048,12 @@ msgstr ""
msgid "Dependency proxy image prefix"
msgstr ""
+msgid "DependencyProxy|Create a local proxy for storing frequently used upstream images. %{docLinkStart}Learn more%{docLinkEnd} about dependency proxies."
+msgstr ""
+
+msgid "DependencyProxy|Dependency Proxy"
+msgstr ""
+
msgid "DependencyProxy|Toggle Dependency Proxy"
msgstr ""
@@ -11125,6 +11291,9 @@ msgstr ""
msgid "Deployments"
msgstr ""
+msgid "Deployments to Google Kubernetes Engine can be "
+msgstr ""
+
msgid "Deployments|%{deployments} environment impacted."
msgid_plural "Deployments|%{deployments} environments impacted."
msgstr[0] ""
@@ -11153,6 +11322,9 @@ msgstr ""
msgid "Deployment|success"
msgstr ""
+msgid "Deprecated API rate limits"
+msgstr ""
+
msgid "Deprioritize label"
msgstr ""
@@ -11555,6 +11727,14 @@ msgstr ""
msgid "DiffsCompareBaseBranch|(base)"
msgstr ""
+msgid "Diffs|%d addition"
+msgid_plural "Diffs|%d additions"
+msgstr[0] ""
+
+msgid "Diffs|%d deletion"
+msgid_plural "Diffs|%d deletions"
+msgstr[0] ""
+
msgid "Diffs|No file name available"
msgstr ""
@@ -11564,9 +11744,16 @@ msgstr ""
msgid "Diffs|Show all unchanged lines"
msgstr ""
+msgid "Diffs|Showing %{dropdownStart}%{count} changed file%{dropdownEnd}"
+msgid_plural "Diffs|Showing %{dropdownStart}%{count} changed files%{dropdownEnd}"
+msgstr[0] ""
+
msgid "Diffs|Something went wrong while fetching diff lines."
msgstr ""
+msgid "Diffs|with %{additions} and %{deletions}"
+msgstr ""
+
msgid "Direct member"
msgstr ""
@@ -11691,9 +11878,6 @@ msgid "Dismiss %d selected vulnerability as"
msgid_plural "Dismiss %d selected vulnerabilities as"
msgstr[0] ""
-msgid "Dismiss Value Stream Analytics introduction box"
-msgstr ""
-
msgid "Dismiss merge request promotion"
msgstr ""
@@ -12015,6 +12199,9 @@ msgstr ""
msgid "Edit issues"
msgstr ""
+msgid "Edit merge requests"
+msgstr ""
+
msgid "Edit public deploy key"
msgstr ""
@@ -12090,6 +12277,9 @@ msgstr ""
msgid "Elastic|None. Select projects to index."
msgstr ""
+msgid "Eligible users"
+msgstr ""
+
msgid "Email"
msgstr ""
@@ -12219,6 +12409,9 @@ msgstr ""
msgid "Enable"
msgstr ""
+msgid "Enable Amazon EKS integration"
+msgstr ""
+
msgid "Enable Auto DevOps"
msgstr ""
@@ -12252,6 +12445,9 @@ msgstr ""
msgid "Enable SSL verification"
msgstr ""
+msgid "Enable Service Ping"
+msgstr ""
+
msgid "Enable Snowplow tracking"
msgstr ""
@@ -12282,6 +12478,9 @@ msgstr ""
msgid "Enable authenticated Git LFS request rate limit"
msgstr ""
+msgid "Enable authenticated web request rate limit"
+msgstr ""
+
msgid "Enable authentication"
msgstr ""
@@ -12342,7 +12541,7 @@ msgstr ""
msgid "Enable or disable the Pseudonymizer data collection."
msgstr ""
-msgid "Enable or disable version check and service ping."
+msgid "Enable or disable version check and Service Ping."
msgstr ""
msgid "Enable protected paths rate limit"
@@ -12354,18 +12553,12 @@ msgstr ""
msgid "Enable reCAPTCHA"
msgstr ""
-msgid "Enable reCAPTCHA for login"
-msgstr ""
-
-msgid "Enable reCAPTCHA, Invisible Captcha, Akismet and set IP limits. For reCAPTCHA, we currently only support %{recaptcha_v2_link_start}v2%{recaptcha_v2_link_end}"
+msgid "Enable reCAPTCHA for login."
msgstr ""
msgid "Enable repository checks"
msgstr ""
-msgid "Enable service ping"
-msgstr ""
-
msgid "Enable shared runners for all projects and subgroups in this group."
msgstr ""
@@ -12387,7 +12580,10 @@ msgstr ""
msgid "Enable unauthenticated API request rate limit"
msgstr ""
-msgid "Enable unauthenticated request rate limit"
+msgid "Enable unauthenticated web request rate limit"
+msgstr ""
+
+msgid "Enable user deactivation emails"
msgstr ""
msgid "Enable version check"
@@ -12423,9 +12619,6 @@ msgstr ""
msgid "Enabled sources for code import during project creation. OmniAuth must be configured for GitHub"
msgstr ""
-msgid "Enabling this will only make licensed EE features available to projects if the project namespace's plan includes the feature or if the project is public."
-msgstr ""
-
msgid "Encountered an error while rendering: %{err}"
msgstr ""
@@ -12474,9 +12667,6 @@ msgstr ""
msgid "Enter Admin Mode"
msgstr ""
-msgid "Enter IP address range"
-msgstr ""
-
msgid "Enter a number"
msgstr ""
@@ -12489,9 +12679,6 @@ msgstr ""
msgid "Enter at least three characters to search"
msgstr ""
-msgid "Enter domain"
-msgstr ""
-
msgid "Enter in your Bitbucket Server URL and personal access token below"
msgstr ""
@@ -12678,9 +12865,6 @@ msgstr ""
msgid "Environments|Deployment %{status}"
msgstr ""
-msgid "Environments|Dismiss"
-msgstr ""
-
msgid "Environments|Enable review app"
msgstr ""
@@ -12693,9 +12877,6 @@ msgstr ""
msgid "Environments|Environments are places where code gets deployed, such as staging or production."
msgstr ""
-msgid "Environments|Help us improve environments"
-msgstr ""
-
msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
msgstr ""
@@ -12732,6 +12913,9 @@ msgstr ""
msgid "Environments|Note that this action will stop the environment, but it will %{emphasisStart}not%{emphasisEnd} have an effect on any existing deployment due to no “stop environment action†being defined in the %{ciConfigLinkStart}.gitlab-ci.yml%{ciConfigLinkEnd} file."
msgstr ""
+msgid "Environments|Open"
+msgstr ""
+
msgid "Environments|Open live environment"
msgstr ""
@@ -12771,9 +12955,6 @@ msgstr ""
msgid "Environments|Stopping %{environmentName}"
msgstr ""
-msgid "Environments|Take the survey"
-msgstr ""
-
msgid "Environments|There was an error fetching the logs. Please try again."
msgstr ""
@@ -12795,9 +12976,6 @@ msgstr ""
msgid "Environments|You don't have any environments right now"
msgstr ""
-msgid "Environments|Your feedback helps GitLab make environments better for you and other users. Participate and enter a sweepstake to win a USD 30 gift card."
-msgstr ""
-
msgid "Environments|by %{avatar}"
msgstr ""
@@ -13080,7 +13258,7 @@ msgstr ""
msgid "Error parsing CSV file. Please make sure it has"
msgstr ""
-msgid "Error rendering markdown preview"
+msgid "Error rendering Markdown preview"
msgstr ""
msgid "Error saving label update."
@@ -13128,6 +13306,9 @@ msgstr ""
msgid "Error: %{error_message}"
msgstr ""
+msgid "Error: Couldn't load some or all of the changes."
+msgstr ""
+
msgid "Error: No AWS credentials were supplied"
msgstr ""
@@ -13161,6 +13342,9 @@ msgstr ""
msgid "ErrorTracking|Enable error tracking"
msgstr ""
+msgid "ErrorTracking|Error tracking backend"
+msgstr ""
+
msgid "ErrorTracking|If you self-host Sentry, enter your Sentry instance's full URL. If you use Sentry's hosted solution, enter https://sentry.io"
msgstr ""
@@ -13194,6 +13378,12 @@ msgstr ""
msgid "Escalation policies must have at least one rule"
msgstr ""
+msgid "EscalationPolicies|%{clockIcon} IF alert is not %{alertStatus} in %{minutes}"
+msgstr ""
+
+msgid "EscalationPolicies|%{notificationIcon} THEN %{doAction} %{forScheduleOrUser}"
+msgstr ""
+
msgid "EscalationPolicies|+ Add an additional rule"
msgstr ""
@@ -13236,13 +13426,13 @@ msgstr ""
msgid "EscalationPolicies|Escalation policies"
msgstr ""
-msgid "EscalationPolicies|Escalation rules"
+msgid "EscalationPolicies|Escalation policy %{obstacle} in Project %{project}"
msgstr ""
-msgid "EscalationPolicies|Failed to load oncall-schedules"
+msgid "EscalationPolicies|Escalation rules"
msgstr ""
-msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} %{then} THEN %{doAction} %{scheduleOrUser}"
+msgid "EscalationPolicies|Failed to load oncall-schedules"
msgstr ""
msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} minutes"
@@ -13320,18 +13510,36 @@ msgstr ""
msgid "Every %{action} attempt has failed: %{job_error_message}. Please try again."
msgstr ""
+msgid "Every 3 months"
+msgstr ""
+
+msgid "Every 3 months on the %{day} at %{time} %{timezone}"
+msgstr ""
+
+msgid "Every 6 months"
+msgstr ""
+
+msgid "Every 6 months on the %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Every day"
msgstr ""
msgid "Every day (at %{time})"
msgstr ""
+msgid "Every day at %{time} %{timezone}"
+msgstr ""
+
msgid "Every month"
msgstr ""
msgid "Every month (Day %{day} at %{time})"
msgstr ""
+msgid "Every month on the %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Every three months"
msgstr ""
@@ -13345,6 +13553,15 @@ msgstr[0] ""
msgid "Every week (%{weekday} at %{time})"
msgstr ""
+msgid "Every week on %{day} at %{time} %{timezone}"
+msgstr ""
+
+msgid "Every year"
+msgstr ""
+
+msgid "Every year on %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Everyone"
msgstr ""
@@ -13381,9 +13598,6 @@ msgstr ""
msgid "Exactly one of %{attributes} is required"
msgstr ""
-msgid "Example: %{ip_address}. %{read_more_link}."
-msgstr ""
-
msgid "Example: @sub\\.company\\.com$"
msgstr ""
@@ -13450,13 +13664,13 @@ msgstr ""
msgid "Expand pipeline"
msgstr ""
-msgid "Expand sidebar"
+msgid "Expand settings section"
msgstr ""
-msgid "Expected documents: %{expected_documents}"
+msgid "Expand sidebar"
msgstr ""
-msgid "Experienced"
+msgid "Expected documents: %{expected_documents}"
msgstr ""
msgid "ExperimentSubject|Must have exactly one of User, Namespace, or Project."
@@ -13741,9 +13955,6 @@ msgstr ""
msgid "Failed to load related branches"
msgstr ""
-msgid "Failed to load sidebar lock status"
-msgstr ""
-
msgid "Failed to load stacktrace."
msgstr ""
@@ -14166,6 +14377,9 @@ msgstr ""
msgid "Files"
msgstr ""
+msgid "Files API Rate Limits"
+msgstr ""
+
msgid "Files breadcrumb"
msgstr ""
@@ -15165,6 +15379,9 @@ msgstr ""
msgid "GitLab group: %{source_link}"
msgstr ""
+msgid "GitLab informs you if a new version is available."
+msgstr ""
+
msgid "GitLab is a complete DevOps platform, delivered as a single application, fundamentally changing the way Development, Security, and Ops teams collaborate"
msgstr ""
@@ -15180,7 +15397,7 @@ msgstr ""
msgid "GitLab is open source software to collaborate on code."
msgstr ""
-msgid "GitLab is undergoing maintenance and is operating in a read-only mode."
+msgid "GitLab is undergoing maintenance and is operating in read-only mode."
msgstr ""
msgid "GitLab member or Email address"
@@ -15192,9 +15409,6 @@ msgstr ""
msgid "GitLab project export"
msgstr ""
-msgid "GitLab restart is required to apply changes."
-msgstr ""
-
msgid "GitLab single sign-on URL"
msgstr ""
@@ -15210,9 +15424,6 @@ msgstr ""
msgid "GitLab version"
msgstr ""
-msgid "GitLab will inform you if a new version is available."
-msgstr ""
-
msgid "GitLab will run a background job that will produce pseudonymized CSVs of the GitLab database that will be uploaded to your configured object storage directory."
msgstr ""
@@ -15477,9 +15688,21 @@ msgstr ""
msgid "Go to snippets"
msgstr ""
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check 'Allowed domains for sign-ups'."
+msgstr ""
+
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check 'Email restrictions for sign-ups'."
+msgstr ""
+
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check the 'Domain denylist'."
+msgstr ""
+
msgid "Go to the activity feed"
msgstr ""
+msgid "Go to the group’s 'Settings &gt; General' page, and check 'Restrict membership by email domain'."
+msgstr ""
+
msgid "Go to the milestone list"
msgstr ""
@@ -15516,6 +15739,12 @@ msgstr ""
msgid "Goal of the changes and what reviewers should be aware of"
msgstr ""
+msgid "Google Cloud"
+msgstr ""
+
+msgid "Google Cloud offers several deployment targets. Select the one most suitable for your project."
+msgstr ""
+
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
@@ -15600,9 +15829,6 @@ msgstr ""
msgid "Group ID"
msgstr ""
-msgid "Group ID: %{group_id}"
-msgstr ""
-
msgid "Group Owner must have signed in with SAML before enabling Group Managed Accounts"
msgstr ""
@@ -15777,6 +16003,12 @@ msgstr ""
msgid "GroupImport|Unable to process group import file"
msgstr ""
+msgid "GroupPage|Copy group ID"
+msgstr ""
+
+msgid "GroupPage|Group ID: %{group_id}"
+msgstr ""
+
msgid "GroupRoadmap|%{dateWord} – No end date"
msgstr ""
@@ -15831,6 +16063,9 @@ msgstr ""
msgid "GroupRoadmap|Within 3 years"
msgstr ""
+msgid "GroupSAML|\"persistent\" recommended"
+msgstr ""
+
msgid "GroupSAML|%{strongOpen}Warning%{strongClose} - Enabling %{linkStart}SSO enforcement%{linkEnd} can reduce security risks."
msgstr ""
@@ -15963,6 +16198,9 @@ msgstr ""
msgid "GroupSAML|To be able to prohibit outer forks, you first need to enforce dedicate group managed accounts."
msgstr ""
+msgid "GroupSAML|Use SAML group links to manage group membership using SAML."
+msgstr ""
+
msgid "GroupSAML|Valid SAML Response"
msgstr ""
@@ -15975,13 +16213,10 @@ msgstr ""
msgid "GroupSAML|as %{access_level}"
msgstr ""
-msgid "GroupSAML|must match stored NameID of \"%{extern_uid}\" as we use this to identify users. If the NameID changes users will be unable to sign in."
-msgstr ""
-
-msgid "GroupSAML|should be \"persistent\""
+msgid "GroupSAML|must match stored NameID of \"%{extern_uid}\" to identify user and allow sign in"
msgstr ""
-msgid "GroupSAML|should be a random persistent ID, emails are discouraged"
+msgid "GroupSAML|recommend persistent ID instead of email"
msgstr ""
msgid "GroupSelect|No matching results"
@@ -15996,9 +16231,15 @@ msgstr ""
msgid "GroupSettings|Allow project access token creation"
msgstr ""
+msgid "GroupSettings|Applied to all subgroups unless overridden by a group owner. Groups already added to the project lose access."
+msgstr ""
+
msgid "GroupSettings|Auto DevOps pipeline was updated for the group"
msgstr ""
+msgid "GroupSettings|Available only on the top-level group. Applies to all subgroups. Groups already shared with a group outside %{group} are still shared unless removed manually."
+msgstr ""
+
msgid "GroupSettings|Badges"
msgstr ""
@@ -16050,6 +16291,9 @@ msgstr ""
msgid "GroupSettings|New runners registration token has been generated!"
msgstr ""
+msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgstr ""
+
msgid "GroupSettings|Pipeline settings was updated for the group"
msgstr ""
@@ -16062,12 +16306,15 @@ msgstr ""
msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
-msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups."
+msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups"
msgstr ""
msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
msgstr ""
+msgid "GroupSettings|Prevents group members from being notified if the group is mentioned."
+msgstr ""
+
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
msgstr ""
@@ -16104,21 +16351,6 @@ msgstr ""
msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}."
msgstr ""
-msgid "GroupSettings|This setting is only available on the top-level group and it applies to all subgroups. Groups that have already been shared with a group outside %{group} will still be shared, and this access will have to be revoked manually."
-msgstr ""
-
-msgid "GroupSettings|This setting will be applied to all subgroups unless overridden by a group owner. Groups that already have access to the project will continue to have access unless removed manually."
-msgstr ""
-
-msgid "GroupSettings|This setting will override user notification preferences for all members of the group, subgroups, and projects."
-msgstr ""
-
-msgid "GroupSettings|This setting will prevent group members from being notified if the group is mentioned."
-msgstr ""
-
-msgid "GroupSettings|This setting will prevent group members from forking projects outside of the group."
-msgstr ""
-
msgid "GroupSettings|Transfer group"
msgstr ""
@@ -16236,7 +16468,7 @@ msgstr ""
msgid "GroupsNew|No import options available"
msgstr ""
-msgid "GroupsNew|Not all related objects are migrated, as %{docs_link_start}described here%{docs_link_end}. Please %{feedback_link_start}leave feedback%{feedback_link_end} on this feature."
+msgid "GroupsNew|Not all related objects are migrated. %{docs_link_start}More info%{docs_link_end}."
msgstr ""
msgid "GroupsNew|Personal access token"
@@ -16368,15 +16600,27 @@ msgstr ""
msgid "Hello %{name},"
msgstr ""
-msgid "Hello there"
-msgstr ""
-
msgid "Hello, %{name}!"
msgstr ""
msgid "Hello, %{username}!"
msgstr ""
+msgid "HelloMessage|%{handshake_emoji} Contribute to GitLab: %{contribute_link}"
+msgstr ""
+
+msgid "HelloMessage|%{magnifier_emoji} Create a new GitLab issue: %{new_issue_link}"
+msgstr ""
+
+msgid "HelloMessage|%{rocket_emoji} We like your curiosity! Help us improve GitLab by joining the team: %{jobs_page_link}"
+msgstr ""
+
+msgid "HelloMessage|Does this page need fixes or improvements? Open an issue or contribute a merge request to help make GitLab more lovable. At GitLab, everyone can contribute!"
+msgstr ""
+
+msgid "HelloMessage|Welcome to GitLab!"
+msgstr ""
+
msgid "Help"
msgstr ""
@@ -16386,13 +16630,10 @@ msgstr ""
msgid "Helps prevent bots from creating accounts."
msgstr ""
-msgid "Helps prevent bots from creating issues"
-msgstr ""
-
-msgid "Helps prevent malicious users hide their activity"
+msgid "Helps prevent bots from creating issues."
msgstr ""
-msgid "Helps reduce request volume (e.g. from crawlers or abusive bots)"
+msgid "Helps prevent malicious users hide their activity."
msgstr ""
msgid "Helps reduce request volume (for example, from crawlers or abusive bots)"
@@ -16514,6 +16755,12 @@ msgstr ""
msgid "Housekeeping, export, path, transfer, remove, archive."
msgstr ""
+msgid "How do I configure Akismet?"
+msgstr ""
+
+msgid "How do I configure it?"
+msgstr ""
+
msgid "How do I configure runners?"
msgstr ""
@@ -16535,19 +16782,25 @@ msgstr ""
msgid "How do I set up this service?"
msgstr ""
+msgid "How do I use a web terminal?"
+msgstr ""
+
+msgid "How do I use file templates?"
+msgstr ""
+
msgid "How it works"
msgstr ""
msgid "How many days need to pass between marking entity for deletion and actual removing it."
msgstr ""
-msgid "How many seconds an IP will be counted towards the limit"
+msgid "How many seconds an IP counts toward the IP address limit."
msgstr ""
-msgid "I accept the %{terms_link}"
+msgid "How the job limiter handles jobs exceeding the thresholds specified below. The 'track' mode only logs the jobs. The 'compress' mode compresses the jobs and raises an exception if the compressed size exceeds the limit."
msgstr ""
-msgid "I accept the|Terms of Service and Privacy Policy"
+msgid "I accept the %{terms_link}"
msgstr ""
msgid "I forgot my password"
@@ -16631,13 +16884,16 @@ msgstr ""
msgid "IP Address"
msgstr ""
-msgid "IP expiration time"
+msgid "IP address expiration time"
msgstr ""
-msgid "IP subnet restriction only allowed for top-level groups"
+msgid "IP address restrictions"
+msgstr ""
+
+msgid "IP addresses per user"
msgstr ""
-msgid "IPs per user"
+msgid "IP subnet restriction only allowed for top-level groups"
msgstr ""
msgid "Identifier"
@@ -16652,6 +16908,9 @@ msgstr ""
msgid "If any indexed field exceeds this limit it will be truncated to this number of characters and the rest will not be indexed or searchable. This does not apply to repository and wiki indexing. Setting this to 0 means it is unlimited."
msgstr ""
+msgid "If blank, defaults to %{code_open}Retry later%{code_close}."
+msgstr ""
+
msgid "If blank, set allowable lifetime to %{instance_level_policy_in_words}, as defined by the instance admin. Once set, existing tokens for users in this group may be revoked."
msgstr ""
@@ -16703,6 +16962,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 did not initiate these sign-in attempts, please reach out to your administrator or enable two-factor authentication (2FA) on your account."
+msgstr ""
+
msgid "If you did not initiate this change, please contact your administrator immediately."
msgstr ""
@@ -16792,10 +17054,10 @@ msgstr ""
msgid "Import Projects from Gitea"
msgstr ""
-msgid "Import a project"
+msgid "Import an exported GitLab project"
msgstr ""
-msgid "Import an exported GitLab project"
+msgid "Import and export rate limits"
msgstr ""
msgid "Import failed due to a GitHub error: %{original}"
@@ -16807,12 +17069,18 @@ msgstr ""
msgid "Import from Jira"
msgstr ""
+msgid "Import group"
+msgstr ""
+
msgid "Import group from file"
msgstr ""
msgid "Import groups"
msgstr ""
+msgid "Import history"
+msgstr ""
+
msgid "Import in progress"
msgstr ""
@@ -16876,7 +17144,25 @@ msgstr ""
msgid "Import timed out. Import took longer than %{import_jobs_expiration} seconds"
msgstr ""
-msgid "Import/Export Rate Limits"
+msgid "ImportAProjectModal|Import from a project"
+msgstr ""
+
+msgid "ImportAProjectModal|Import members from another project"
+msgstr ""
+
+msgid "ImportAProjectModal|Import project members"
+msgstr ""
+
+msgid "ImportAProjectModal|Only project members (not group members) are imported, and they get the same permissions as the project you import from."
+msgstr ""
+
+msgid "ImportAProjectModal|Successfully imported"
+msgstr ""
+
+msgid "ImportAProjectModal|Unable to import project members"
+msgstr ""
+
+msgid "ImportAProjectModal|You're importing members to the %{strongStart}%{name}%{strongEnd} project."
msgstr ""
msgid "ImportButtons|Connect repositories from"
@@ -16928,7 +17214,7 @@ msgstr[0] ""
msgid "Importing..."
msgstr ""
-msgid "Import|A repository URL usually ends in a .git suffix, although this is not required. Double check to make sure your repository URL is correct."
+msgid "Import|There is not a valid Git repository at this URL. If your HTTP repository is not publicly accessible, verify your credentials."
msgstr ""
msgid "Improve customer support with Service Desk"
@@ -16937,9 +17223,6 @@ msgstr ""
msgid "Improves Git cloning performance."
msgstr ""
-msgid "In %{time_to_now}"
-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 ""
@@ -17225,7 +17508,7 @@ msgstr ""
msgid "InProductMarketing|Start a GitLab Ultimate trial today in less than one minute, no credit card required."
msgstr ""
-msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no CC required"
+msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no credit card required"
msgstr ""
msgid "InProductMarketing|Start a trial"
@@ -17264,7 +17547,7 @@ msgstr ""
msgid "InProductMarketing|Team up in GitLab for greater efficiency"
msgstr ""
-msgid "InProductMarketing|Team work makes the dream work"
+msgid "InProductMarketing|Team work makes the dream work"
msgstr ""
msgid "InProductMarketing|Test, create, deploy"
@@ -17844,6 +18127,9 @@ msgstr ""
msgid "Integrations|Create new issue in Jira"
msgstr ""
+msgid "Integrations|Create new issue in ZenTao"
+msgstr ""
+
msgid "Integrations|Default settings are inherited from the group level."
msgstr ""
@@ -17937,9 +18223,15 @@ msgstr ""
msgid "Integrations|Search Jira issues"
msgstr ""
+msgid "Integrations|Search ZenTao issues"
+msgstr ""
+
msgid "Integrations|Send notifications about project events to Unify Circuit."
msgstr ""
+msgid "Integrations|Send notifications about project events to a Unify Circuit conversation. %{docs_link}"
+msgstr ""
+
msgid "Integrations|Sign in to add namespaces"
msgstr ""
@@ -17979,6 +18271,9 @@ msgstr ""
msgid "Integrations|You've activated every integration 🎉"
msgstr ""
+msgid "Integrations|ZenTao issues display here when you create issues in your project in ZenTao."
+msgstr ""
+
msgid "Interactive mode"
msgstr ""
@@ -18006,9 +18301,6 @@ msgstr ""
msgid "Interval Pattern"
msgstr ""
-msgid "Introducing Value Stream Analytics"
-msgstr ""
-
msgid "Introducing Your DevOps Report"
msgstr ""
@@ -18105,6 +18397,12 @@ msgstr ""
msgid "Investigate vulnerability: %{title}"
msgstr ""
+msgid "Invisible Captcha"
+msgstr ""
+
+msgid "Invisible Captcha helps prevent the creation of spam accounts. It adds a honeypot field and time-sensitive form submission to the account signup form."
+msgstr ""
+
msgid "Invitation"
msgstr ""
@@ -18558,12 +18856,18 @@ msgstr ""
msgid "Issues"
msgstr ""
+msgid "Issues I've created"
+msgstr ""
+
msgid "Issues Rate Limits"
msgstr ""
msgid "Issues and merge requests"
msgstr ""
+msgid "Issues assigned to me"
+msgstr ""
+
msgid "Issues can be bugs, tasks or ideas to be discussed. Also, issues are searchable and filterable."
msgstr ""
@@ -18675,7 +18979,7 @@ msgstr ""
msgid "Iterations|Create cadence"
msgstr ""
-msgid "Iterations|Create your first iteration"
+msgid "Iterations|Create iteration"
msgstr ""
msgid "Iterations|Delete cadence"
@@ -18684,6 +18988,9 @@ msgstr ""
msgid "Iterations|Delete iteration cadence?"
msgstr ""
+msgid "Iterations|Delete iteration?"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -18717,12 +19024,18 @@ msgstr ""
msgid "Iterations|New iteration cadence"
msgstr ""
+msgid "Iterations|No closed iterations."
+msgstr ""
+
msgid "Iterations|No iteration cadences to show."
msgstr ""
msgid "Iterations|No iterations in cadence."
msgstr ""
+msgid "Iterations|No open iterations."
+msgstr ""
+
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
@@ -18753,6 +19066,9 @@ msgstr ""
msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
msgstr ""
+msgid "Iterations|This will remove the iteration from any issues that are assigned to it."
+msgstr ""
+
msgid "Iterations|Title"
msgstr ""
@@ -18768,15 +19084,9 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "I’m familiar with the basics of DevOps."
-msgstr ""
-
msgid "I’m joining my team who’s already on GitLab"
msgstr ""
-msgid "I’m not familiar with the basics of DevOps."
-msgstr ""
-
msgid "Jaeger URL"
msgstr ""
@@ -19041,6 +19351,9 @@ msgstr ""
msgid "Job"
msgstr ""
+msgid "Job %{jobName}"
+msgstr ""
+
msgid "Job Failed #%{build_id}"
msgstr ""
@@ -19630,9 +19943,6 @@ msgstr ""
msgid "Learn more in the"
msgstr ""
-msgid "Learn more in the|pipeline schedules documentation"
-msgstr ""
-
msgid "Learn more."
msgstr ""
@@ -19744,9 +20054,6 @@ msgstr ""
msgid "Leave Admin Mode"
msgstr ""
-msgid "Leave blank for no limit. Once set, existing personal access tokens may be revoked."
-msgstr ""
-
msgid "Leave edit mode? All unsaved changes will be lost."
msgstr ""
@@ -19792,10 +20099,10 @@ msgstr ""
msgid "LicenseCompliance|Acceptable license to be used in the project"
msgstr ""
-msgid "LicenseCompliance|Add a license"
+msgid "LicenseCompliance|Add license and related policy"
msgstr ""
-msgid "LicenseCompliance|Add license and related policy"
+msgid "LicenseCompliance|Add license policy"
msgstr ""
msgid "LicenseCompliance|Allow"
@@ -19879,6 +20186,9 @@ msgstr ""
msgid "LicenseManagement|Uncategorized"
msgstr ""
+msgid "Licensed Enterprise Edition features can be used if the project namespace's plan includes the feature, or if the project is public."
+msgstr ""
+
msgid "Licensed Features"
msgstr ""
@@ -19945,7 +20255,10 @@ msgstr ""
msgid "Limit namespaces and projects that can be indexed"
msgstr ""
-msgid "Limit sign in from multiple ips"
+msgid "Limit project size at a global, group, and project level. %{link_start}Learn more%{link_end}."
+msgstr ""
+
+msgid "Limit sign in from multiple IP addresses"
msgstr ""
msgid "Limit the number of concurrent operations this secondary site can run in the background."
@@ -19957,10 +20270,16 @@ msgstr ""
msgid "Limit the number of issues and epics per minute a user can create through web and API requests."
msgstr ""
+msgid "Limit the size of Sidekiq jobs stored in Redis."
+msgstr ""
+
msgid "Limited to showing %d event at most"
msgid_plural "Limited to showing %d events at most"
msgstr[0] ""
+msgid "Limiting mode"
+msgstr ""
+
msgid "Line changes"
msgstr ""
@@ -20030,9 +20349,6 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
-msgid "List of users to be excluded from the limit"
-msgstr ""
-
msgid "List options"
msgstr ""
@@ -20072,9 +20388,6 @@ msgstr ""
msgid "Loading functions timed out. Please reload the page to try again."
msgstr ""
-msgid "Loading issues"
-msgstr ""
-
msgid "Loading more"
msgstr ""
@@ -20366,6 +20679,9 @@ msgstr ""
msgid "Marked For Deletion At - %{deletion_time}"
msgstr ""
+msgid "Marked as ready. Merging is now allowed."
+msgstr ""
+
msgid "Marked this %{noun} as a draft."
msgstr ""
@@ -20438,52 +20754,22 @@ msgstr ""
msgid "Max 100,000 events"
msgstr ""
-msgid "Max 20 characters"
-msgstr ""
-
-msgid "Max Group Export Download requests per minute per user"
-msgstr ""
-
-msgid "Max Group Export requests per minute per user"
-msgstr ""
-
-msgid "Max Group Import requests per minute per user"
-msgstr ""
-
-msgid "Max Project Export Download requests per minute per user"
-msgstr ""
-
-msgid "Max Project Export requests per minute per user"
-msgstr ""
-
-msgid "Max Project Import requests per minute per user"
-msgstr ""
-
-msgid "Max authenticated API requests per period per user"
-msgstr ""
-
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
-msgid "Max authenticated web requests per period per user"
-msgstr ""
-
msgid "Max file size is 200 KB."
msgstr ""
-msgid "Max requests per minute per user"
-msgstr ""
-
msgid "Max role"
msgstr ""
msgid "Max session time"
msgstr ""
-msgid "Max unauthenticated requests per period per IP"
+msgid "MaxBuilds"
msgstr ""
-msgid "MaxBuilds"
+msgid "Maximum 20 characters"
msgstr ""
msgid "Maximum Conan package file size in bytes"
@@ -20519,6 +20805,12 @@ msgstr ""
msgid "Maximum attachment size (MB)"
msgstr ""
+msgid "Maximum authenticated API requests per rate limit period per user"
+msgstr ""
+
+msgid "Maximum authenticated web requests per rate limit period per user"
+msgstr ""
+
msgid "Maximum bulk request size (MiB)"
msgstr ""
@@ -20564,6 +20856,15 @@ msgstr ""
msgid "Maximum files in a diff"
msgstr ""
+msgid "Maximum group export download requests per minute"
+msgstr ""
+
+msgid "Maximum group export requests per minute"
+msgstr ""
+
+msgid "Maximum group import requests per minute"
+msgstr ""
+
msgid "Maximum import size"
msgstr ""
@@ -20600,7 +20901,7 @@ msgstr ""
msgid "Maximum number of projects."
msgstr ""
-msgid "Maximum number of unique IPs per user"
+msgid "Maximum number of unique IP addresses per user."
msgstr ""
msgid "Maximum page reached"
@@ -20609,12 +20910,24 @@ msgstr ""
msgid "Maximum page size"
msgstr ""
+msgid "Maximum project export download requests per minute"
+msgstr ""
+
+msgid "Maximum project export requests per minute"
+msgstr ""
+
+msgid "Maximum project import requests per minute"
+msgstr ""
+
msgid "Maximum push size"
msgstr ""
msgid "Maximum push size (MB)"
msgstr ""
+msgid "Maximum requests per minute"
+msgstr ""
+
msgid "Maximum running slices"
msgstr ""
@@ -20642,10 +20955,16 @@ msgstr ""
msgid "Maximum time between updates that a mirror can have when scheduled to synchronize."
msgstr ""
-msgid "Maximum time for web terminal websocket connection (in seconds). 0 for unlimited."
+msgid "Maximum time that users are allowed to skip the setup of two-factor authentication (in hours). Set to 0 (zero) to enforce at next sign in."
msgstr ""
-msgid "Maximum time that users are allowed to skip the setup of two-factor authentication (in hours). Set to 0 (zero) to enforce at next sign in."
+msgid "Maximum time, in seconds, for a web terminal websocket connection. 0 for unlimited."
+msgstr ""
+
+msgid "Maximum unauthenticated API requests per rate limit period per IP"
+msgstr ""
+
+msgid "Maximum unauthenticated web requests per rate limit period per IP"
msgstr ""
msgid "May"
@@ -20663,9 +20982,6 @@ msgstr ""
msgid "Medium vulnerabilities present"
msgstr ""
-msgid "Member lock"
-msgstr ""
-
msgid "Member since"
msgstr ""
@@ -20702,6 +21018,9 @@ msgstr ""
msgid "Members of a group may only view projects they have permission to access"
msgstr ""
+msgid "Membership"
+msgstr ""
+
msgid "Members|%{time} by %{user}"
msgstr ""
@@ -20762,9 +21081,6 @@ msgstr ""
msgid "Members|Expiration date updated successfully."
msgstr ""
-msgid "Members|Expired"
-msgstr ""
-
msgid "Members|Filter members"
msgstr ""
@@ -20780,9 +21096,6 @@ msgstr ""
msgid "Members|Membership"
msgstr ""
-msgid "Members|No expiration set"
-msgstr ""
-
msgid "Members|Remove \"%{groupName}\""
msgstr ""
@@ -20804,9 +21117,6 @@ msgstr ""
msgid "Members|Search invited"
msgstr ""
-msgid "Members|in %{time}"
-msgstr ""
-
msgid "Member|Deny access"
msgstr ""
@@ -20882,9 +21192,6 @@ msgstr ""
msgid "Merge request %{mr_link} was reviewed by %{mr_author}"
msgstr ""
-msgid "Merge request (MR) approvals"
-msgstr ""
-
msgid "Merge request analytics"
msgstr ""
@@ -20906,12 +21213,21 @@ msgstr ""
msgid "Merge requests"
msgstr ""
+msgid "Merge requests I've created"
+msgstr ""
+
msgid "Merge requests are a place to propose changes you've made to a project and discuss those changes with others"
msgstr ""
msgid "Merge requests are read-only in a secondary Geo node"
msgstr ""
+msgid "Merge requests assigned to me"
+msgstr ""
+
+msgid "Merge requests that I'm a reviewer"
+msgstr ""
+
msgid "Merge the branch and fix any conflicts that come up"
msgstr ""
@@ -20972,10 +21288,10 @@ msgstr ""
msgid "MergeRequests|An error occurred while saving the draft comment."
msgstr ""
-msgid "MergeRequests|Failed to squash. Should be done manually."
+msgid "MergeRequests|Create issue to resolve thread"
msgstr ""
-msgid "MergeRequests|Resolve this thread in a new issue"
+msgid "MergeRequests|Failed to squash. Should be done manually."
msgstr ""
msgid "MergeRequests|Saving the comment failed"
@@ -21787,6 +22103,9 @@ msgstr ""
msgid "MoveIssue|Cannot move issue to project it originates from!"
msgstr ""
+msgid "MoveIssue|Cannot move issues of '%{issue_type}' type."
+msgstr ""
+
msgid "Moved issue to %{label} column in the board."
msgstr ""
@@ -21911,6 +22230,15 @@ 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. To learn more about reducing storage capacity please visit our docs."
msgstr ""
+msgid "NamespaceUserCap|Pending users must be reviewed and approved by a group owner. Learn more about %{user_caps_link_start}User Caps%{link_end} and %{users_pending_approval_link_start}Users Pending Approval%{link_end}."
+msgstr ""
+
+msgid "NamespaceUserCap|View pending user approvals"
+msgstr ""
+
+msgid "NamespaceUserCap|Your group has reached its billable member limit"
+msgstr ""
+
msgid "Namespaces"
msgstr ""
@@ -21953,9 +22281,6 @@ msgstr ""
msgid "Network"
msgstr ""
-msgid "Network Policy|New rule"
-msgstr ""
-
msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is inbound from a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
msgstr ""
@@ -21977,16 +22302,13 @@ msgstr ""
msgid "NetworkPolicies|%{strongOpen}any%{strongClose} port"
msgstr ""
-msgid "NetworkPolicies|+ Add alert"
-msgstr ""
-
msgid "NetworkPolicies|.yaml"
msgstr ""
msgid "NetworkPolicies|.yaml mode"
msgstr ""
-msgid "NetworkPolicies|Actions"
+msgid "NetworkPolicies|Add alert"
msgstr ""
msgid "NetworkPolicies|Alerts are intended to be selectively used for a limited number of events that are potentially concerning and warrant a manual review. Alerts should not be used as a substitute for a SIEM or a logging tool. High volume alerts are likely to be dropped so as to preserve the stability of GitLab's integration with Kubernetes."
@@ -22022,9 +22344,6 @@ msgstr ""
msgid "NetworkPolicies|Deny all traffic"
msgstr ""
-msgid "NetworkPolicies|Description"
-msgstr ""
-
msgid "NetworkPolicies|Edit policy"
msgstr ""
@@ -22037,9 +22356,6 @@ msgstr ""
msgid "NetworkPolicies|IP/subnet"
msgstr ""
-msgid "NetworkPolicies|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
-msgstr ""
-
msgid "NetworkPolicies|Invalid or empty policy"
msgstr ""
@@ -22049,19 +22365,16 @@ msgstr ""
msgid "NetworkPolicies|Kubernetes error: %{error}"
msgstr ""
-msgid "NetworkPolicies|Name"
-msgstr ""
-
msgid "NetworkPolicies|Network"
msgstr ""
-msgid "NetworkPolicies|Network traffic"
+msgid "NetworkPolicies|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
msgstr ""
-msgid "NetworkPolicies|New policy"
+msgid "NetworkPolicies|Network policy can be created after the environment is loaded successfully."
msgstr ""
-msgid "NetworkPolicies|No policies detected"
+msgid "NetworkPolicies|Network traffic"
msgstr ""
msgid "NetworkPolicies|None selected"
@@ -22070,21 +22383,12 @@ msgstr ""
msgid "NetworkPolicies|Please %{installLinkStart}install%{installLinkEnd} and %{configureLinkStart}configure a Kubernetes Agent for this project%{configureLinkEnd} to enable alerts."
msgstr ""
-msgid "NetworkPolicies|Policies are a specification of how groups of pods are allowed to communicate with each other's network endpoints."
-msgstr ""
-
msgid "NetworkPolicies|Policy %{policyName} was successfully changed"
msgstr ""
msgid "NetworkPolicies|Policy definition"
msgstr ""
-msgid "NetworkPolicies|Policy editor"
-msgstr ""
-
-msgid "NetworkPolicies|Policy preview"
-msgstr ""
-
msgid "NetworkPolicies|Rule"
msgstr ""
@@ -22094,9 +22398,6 @@ msgstr ""
msgid "NetworkPolicies|Rule mode is unavailable for this policy. In some cases, we cannot parse the YAML file back into the rules editor."
msgstr ""
-msgid "NetworkPolicies|Rules"
-msgstr ""
-
msgid "NetworkPolicies|Save changes"
msgstr ""
@@ -22109,9 +22410,6 @@ msgstr ""
msgid "NetworkPolicies|Traffic that does not match any rule will be blocked."
msgstr ""
-msgid "NetworkPolicies|Unable to parse policy"
-msgstr ""
-
msgid "NetworkPolicies|all DNS names"
msgstr ""
@@ -22290,6 +22588,9 @@ msgstr ""
msgid "New issue"
msgstr ""
+msgid "New issue in %{project}"
+msgstr ""
+
msgid "New issue title"
msgstr ""
@@ -22368,7 +22669,7 @@ msgstr ""
msgid "Newest first"
msgstr ""
-msgid "Newly registered users will by default be external"
+msgid "Newly-registered users are external by default"
msgstr ""
msgid "Next"
@@ -22683,8 +22984,9 @@ msgstr ""
msgid "No webhooks found, add one in the form above."
msgstr ""
-msgid "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} to renew your subscription."
-msgstr ""
+msgid "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} day to renew your subscription."
+msgid_plural "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} days to renew your subscription."
+msgstr[0] ""
msgid "No. of commits"
msgstr ""
@@ -22701,7 +23003,7 @@ msgstr ""
msgid "Nodes"
msgstr ""
-msgid "Non-admin users can sign in with read-only access and make read-only API requests."
+msgid "Non-admin users are restricted to read-only access, in both GitLab UI and API."
msgstr ""
msgid "None"
@@ -22782,7 +23084,7 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
-msgid "Notes Rate Limits"
+msgid "Notes rate limit"
msgstr ""
msgid "Notes|Are you sure you want to cancel creating this comment?"
@@ -22945,9 +23247,6 @@ msgstr ""
msgid "November"
msgstr ""
-msgid "Novice"
-msgstr ""
-
msgid "Now, personalize your GitLab experience"
msgstr ""
@@ -23116,7 +23415,7 @@ msgstr ""
msgid "OnCallSchedules|For this rotation, on-call will be:"
msgstr ""
-msgid "OnCallSchedules|On-call schedule %{schedule} in Project %{project}"
+msgid "OnCallSchedules|On-call schedule %{obstacle} in Project %{project}"
msgstr ""
msgid "OnCallSchedules|On-call schedules"
@@ -23263,22 +23562,22 @@ msgstr ""
msgid "OnDemandScans|Scanner profile"
msgstr ""
-msgid "OnDemandScans|Select one of the existing profiles"
+msgid "OnDemandScans|Schedule scan"
msgstr ""
-msgid "OnDemandScans|Site profile"
+msgid "OnDemandScans|Select one of the existing profiles"
msgstr ""
-msgid "OnDemandScans|Use existing scanner profile"
+msgid "OnDemandScans|Site profile"
msgstr ""
-msgid "OnDemandScans|Use existing site profile"
+msgid "OnDemandScans|Start time"
msgstr ""
-msgid "OnDemandScans|You can either choose a passive scan or validate the target site in your chosen site profile. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
+msgid "OnDemandScans|Use existing scanner profile"
msgstr ""
-msgid "OnDemandScans|You cannot run an active scan against an unvalidated site."
+msgid "OnDemandScans|Use existing site profile"
msgstr ""
msgid "OnDemandScans|You must create a repository within your project to run an on-demand scan."
@@ -23342,6 +23641,9 @@ msgstr ""
msgid "Only admins can delete project"
msgstr ""
+msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
+msgstr ""
+
msgid "Only include features new to your current subscription tier."
msgstr ""
@@ -23360,6 +23662,12 @@ msgstr ""
msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
+msgid "Only reCAPTCHA v2 is supported:"
+msgstr ""
+
+msgid "Only users from the specified IP address ranges are able to reach this group, including all subgroups, projects, and Git repositories."
+msgstr ""
+
msgid "Only verified users with an email address in any of these domains can be added to the group."
msgstr ""
@@ -23546,9 +23854,6 @@ msgstr ""
msgid "Package Registry"
msgstr ""
-msgid "Package Registry Rate Limits"
-msgstr ""
-
msgid "Package Registry: authenticated API requests"
msgstr ""
@@ -23567,6 +23872,9 @@ msgstr ""
msgid "Package recipe already exists"
msgstr ""
+msgid "Package registry rate limits"
+msgstr ""
+
msgid "Package type"
msgstr ""
@@ -23633,6 +23941,9 @@ msgstr ""
msgid "PackageRegistry|Composer"
msgstr ""
+msgid "PackageRegistry|Composer.json with license: %{license} and version: %{version}"
+msgstr ""
+
msgid "PackageRegistry|Conan"
msgstr ""
@@ -23696,6 +24007,9 @@ msgstr ""
msgid "PackageRegistry|Copy require package include"
msgstr ""
+msgid "PackageRegistry|Copy target SHA"
+msgstr ""
+
msgid "PackageRegistry|Copy yarn command"
msgstr ""
@@ -23762,6 +24076,9 @@ msgstr ""
msgid "PackageRegistry|Install package version"
msgstr ""
+msgid "PackageRegistry|Instance-level"
+msgstr ""
+
msgid "PackageRegistry|Invalid Package: failed metadata extraction"
msgstr ""
@@ -23807,6 +24124,9 @@ msgstr ""
msgid "PackageRegistry|Pip Command"
msgstr ""
+msgid "PackageRegistry|Project-level"
+msgstr ""
+
msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
msgstr ""
@@ -23828,6 +24148,9 @@ msgstr ""
msgid "PackageRegistry|Remove package"
msgstr ""
+msgid "PackageRegistry|Required Python: %{pythonVersion}"
+msgstr ""
+
msgid "PackageRegistry|RubyGems"
msgstr ""
@@ -23870,6 +24193,9 @@ msgstr ""
msgid "PackageRegistry|Source project located at %{link}"
msgstr ""
+msgid "PackageRegistry|Target SHA: %{sha}"
+msgstr ""
+
msgid "PackageRegistry|There are no other versions of this package."
msgstr ""
@@ -24038,6 +24364,18 @@ msgstr ""
msgid "Password was successfully updated. Please sign in again."
msgstr ""
+msgid "PasswordPrompt|Confirm password"
+msgstr ""
+
+msgid "PasswordPrompt|Confirm password to continue"
+msgstr ""
+
+msgid "PasswordPrompt|Password is required"
+msgstr ""
+
+msgid "PasswordPrompt|Please enter your password to confirm"
+msgstr ""
+
msgid "Passwords should be unique and not used for any other sites or services."
msgstr ""
@@ -24065,6 +24403,9 @@ msgstr ""
msgid "Paste project path (i.e. gitlab-org/gitlab)"
msgstr ""
+msgid "Paste this DSN into your Sentry SDK"
+msgstr ""
+
msgid "Paste your public SSH key, which is usually contained in the file '~/.ssh/id_ed25519.pub' or '~/.ssh/id_rsa.pub' and begins with 'ssh-ed25519' or 'ssh-rsa'. Do not paste your private SSH key, as that can compromise your identity."
msgstr ""
@@ -24149,6 +24490,9 @@ msgstr ""
msgid "PerformanceBar|First Contentful Paint"
msgstr ""
+msgid "PerformanceBar|Flamegraph with mode:"
+msgstr ""
+
msgid "PerformanceBar|Frontend resources"
msgstr ""
@@ -24182,6 +24526,15 @@ msgstr ""
msgid "PerformanceBar|Trace"
msgstr ""
+msgid "PerformanceBar|cpu"
+msgstr ""
+
+msgid "PerformanceBar|object"
+msgstr ""
+
+msgid "PerformanceBar|wall"
+msgstr ""
+
msgid "Period in seconds"
msgstr ""
@@ -24410,6 +24763,48 @@ msgstr ""
msgid "PipelineSchedules|Variables"
msgstr ""
+msgid "PipelineSource|API"
+msgstr ""
+
+msgid "PipelineSource|Chat"
+msgstr ""
+
+msgid "PipelineSource|External"
+msgstr ""
+
+msgid "PipelineSource|External Pull Request"
+msgstr ""
+
+msgid "PipelineSource|Merge Request"
+msgstr ""
+
+msgid "PipelineSource|On-Demand DAST Scan"
+msgstr ""
+
+msgid "PipelineSource|On-Demand DAST Validation"
+msgstr ""
+
+msgid "PipelineSource|Parent Pipeline"
+msgstr ""
+
+msgid "PipelineSource|Pipeline"
+msgstr ""
+
+msgid "PipelineSource|Push"
+msgstr ""
+
+msgid "PipelineSource|Schedule"
+msgstr ""
+
+msgid "PipelineSource|Trigger"
+msgstr ""
+
+msgid "PipelineSource|Web"
+msgstr ""
+
+msgid "PipelineSource|Web IDE"
+msgstr ""
+
msgid "PipelineStatusTooltip|Pipeline: %{ciStatus}"
msgstr ""
@@ -24710,46 +25105,7 @@ msgstr ""
msgid "Pipeline|Source"
msgstr ""
-msgid "Pipeline|Source|API"
-msgstr ""
-
-msgid "Pipeline|Source|Chat"
-msgstr ""
-
-msgid "Pipeline|Source|External"
-msgstr ""
-
-msgid "Pipeline|Source|External Pull Request"
-msgstr ""
-
-msgid "Pipeline|Source|Merge Request"
-msgstr ""
-
-msgid "Pipeline|Source|On-Demand DAST Scan"
-msgstr ""
-
-msgid "Pipeline|Source|On-Demand DAST Validation"
-msgstr ""
-
-msgid "Pipeline|Source|Parent Pipeline"
-msgstr ""
-
-msgid "Pipeline|Source|Pipeline"
-msgstr ""
-
-msgid "Pipeline|Source|Push"
-msgstr ""
-
-msgid "Pipeline|Source|Schedule"
-msgstr ""
-
-msgid "Pipeline|Source|Trigger"
-msgstr ""
-
-msgid "Pipeline|Source|Web"
-msgstr ""
-
-msgid "Pipeline|Source|Web IDE"
+msgid "Pipeline|Source|Security Policy"
msgstr ""
msgid "Pipeline|Specify variable values to be used in this run. The values specified in %{linkStart}CI/CD settings%{linkEnd} will be used by default."
@@ -24800,7 +25156,7 @@ msgstr ""
msgid "Pipeline|We are currently unable to fetch pipeline data"
msgstr ""
-msgid "Pipeline|You’re about to stop pipeline %{pipelineId}."
+msgid "Pipeline|You’re about to stop pipeline #%{pipelineId}."
msgstr ""
msgid "Pipeline|for"
@@ -24827,6 +25183,9 @@ msgstr ""
msgid "Plain diff"
msgstr ""
+msgid "Plain-text response to send to clients that hit a rate limit"
+msgstr ""
+
msgid "Plan:"
msgstr ""
@@ -24971,9 +25330,6 @@ msgstr ""
msgid "Please provide attributes to update"
msgstr ""
-msgid "Please provide your username or email address."
-msgstr ""
-
msgid "Please reach out if you have any questions and we'll be happy to assist."
msgstr ""
@@ -25016,9 +25372,6 @@ msgstr ""
msgid "Please set a new password before proceeding."
msgstr ""
-msgid "Please share your feedback about %{featureName} %{linkStart}in this issue%{linkEnd} to help us improve the experience."
-msgstr ""
-
msgid "Please solve the captcha"
msgstr ""
@@ -25196,6 +25549,9 @@ msgstr ""
msgid "Prevent adding new members to project membership within this group"
msgstr ""
+msgid "Prevent auto-stopping"
+msgstr ""
+
msgid "Prevent editing approval rules in projects and merge requests."
msgstr ""
@@ -25208,7 +25564,7 @@ msgstr ""
msgid "Prevent users from changing their profile name"
msgstr ""
-msgid "Prevent users from performing write operations on GitLab while performing maintenance."
+msgid "Prevent users from performing write operations while GitLab maintenance is in progress."
msgstr ""
msgid "Preview"
@@ -25481,6 +25837,9 @@ msgstr ""
msgid "Profiles|Enter your name, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Enter your password to confirm the email change"
+msgstr ""
+
msgid "Profiles|Enter your pronouns to let people know how to refer to you"
msgstr ""
@@ -25715,10 +26074,10 @@ msgstr ""
msgid "Profiles|e.g. My MacBook key"
msgstr ""
-msgid "Profiles|username"
+msgid "Profiles|https://website.com"
msgstr ""
-msgid "Profiles|website.com"
+msgid "Profiles|username"
msgstr ""
msgid "Profiles|your account"
@@ -25961,9 +26320,21 @@ msgstr ""
msgid "ProjectSelect| or group"
msgstr ""
+msgid "ProjectSelect|No matching results"
+msgstr ""
+
msgid "ProjectSelect|Search for project"
msgstr ""
+msgid "ProjectSelect|Search projects"
+msgstr ""
+
+msgid "ProjectSelect|Select a project"
+msgstr ""
+
+msgid "ProjectSelect|There was an error fetching the projects. Please try again."
+msgstr ""
+
msgid "ProjectService|Drone server URL"
msgstr ""
@@ -26051,6 +26422,9 @@ msgstr ""
msgid "ProjectService|Trigger event when a new, unique alert is recorded."
msgstr ""
+msgid "ProjectService|Trigger event when a new, unique vulnerability is recorded. (Note: This feature requires an Ultimate plan.)"
+msgstr ""
+
msgid "ProjectService|Trigger event when a pipeline status changes."
msgstr ""
@@ -26465,9 +26839,15 @@ msgstr ""
msgid "Projects are graded based on the highest severity vulnerability present"
msgstr ""
+msgid "Projects are organized into groups"
+msgstr ""
+
msgid "Projects contributed to"
msgstr ""
+msgid "Projects help you organize your work. They contain your file repository, issues, merge requests, and so much more."
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr ""
@@ -26702,10 +27082,10 @@ msgstr ""
msgid "PrometheusService|Prometheus cluster integration"
msgstr ""
-msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
+msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
msgstr ""
-msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
+msgid "PrometheusService|The ID of the IAP-secured resource."
msgstr ""
msgid "PrometheusService|The Prometheus API base URL."
@@ -27323,6 +27703,9 @@ msgstr ""
msgid "Rate limit"
msgstr ""
+msgid "Rate limits can help reduce request volume (like from crawlers or abusive bots)."
+msgstr ""
+
msgid "Raw blob request rate limit per minute"
msgstr ""
@@ -27335,6 +27718,9 @@ msgstr ""
msgid "Re-authentication required"
msgstr ""
+msgid "Re-import"
+msgstr ""
+
msgid "Re-request review"
msgstr ""
@@ -27356,6 +27742,9 @@ msgstr ""
msgid "Read more about related issues"
msgstr ""
+msgid "Read their documentation."
+msgstr ""
+
msgid "Ready to get started with GitLab? Follow these steps to set up your workspace, plan and commit changes, and deploy your project."
msgstr ""
@@ -27389,6 +27778,9 @@ msgstr ""
msgid "Receive any notifications from GitLab."
msgstr ""
+msgid "Receive notification of abuse reports by email."
+msgstr ""
+
msgid "Receive notifications about your own activity"
msgstr ""
@@ -27531,9 +27923,6 @@ msgstr ""
msgid "Registry setup"
msgstr ""
-msgid "Regulate approvals by authors/committers. Affects all projects."
-msgstr ""
-
msgid "Reindexing Status: %{status} (Slice multiplier: %{multiplier}, Maximum running slices: %{max_slices})"
msgstr ""
@@ -27628,6 +28017,9 @@ msgstr ""
msgid "Release|Something went wrong while saving the release details."
msgstr ""
+msgid "Reload page"
+msgstr ""
+
msgid "Remediations"
msgstr ""
@@ -27910,6 +28302,9 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
+msgid "Repeats"
+msgstr ""
+
msgid "Replace"
msgstr ""
@@ -28268,10 +28663,7 @@ msgstr ""
msgid "Require additional authentication for administrative tasks."
msgstr ""
-msgid "Require all users in this group to setup Two-factor authentication"
-msgstr ""
-
-msgid "Require all users in this group to setup two-factor authentication"
+msgid "Require all users in this group to set up two-factor authentication"
msgstr ""
msgid "Required approvals (%{approvals_given} given)"
@@ -28315,6 +28707,9 @@ msgstr[0] ""
msgid "Requires values to meet regular expression requirements."
msgstr ""
+msgid "Requires you to deploy or set up cloud-hosted Sentry."
+msgstr ""
+
msgid "Requires your primary GitLab email address."
msgstr ""
@@ -28375,9 +28770,6 @@ msgstr ""
msgid "Resolve"
msgstr ""
-msgid "Resolve all threads in new issue"
-msgstr ""
-
msgid "Resolve conflicts"
msgstr ""
@@ -28435,6 +28827,9 @@ msgstr ""
msgid "Response text"
msgstr ""
+msgid "Restart GitLab to apply changes."
+msgstr ""
+
msgid "Restart Terminal"
msgstr ""
@@ -28453,6 +28848,9 @@ msgstr ""
msgid "Restoring the project will prevent the project from being removed on this date and restore people's ability to make changes to it."
msgstr ""
+msgid "Restrict group access by IP address. %{link_start}Learn more%{link_end}."
+msgstr ""
+
msgid "Restrict membership by email domain"
msgstr ""
@@ -28764,6 +29162,9 @@ msgstr ""
msgid "Runners|Runner #%{runner_id}"
msgstr ""
+msgid "Runners|Runner assigned to project."
+msgstr ""
+
msgid "Runners|Runner is offline, last contact was %{runner_contact} ago"
msgstr ""
@@ -28776,6 +29177,9 @@ msgstr ""
msgid "Runners|Runner registration"
msgstr ""
+msgid "Runners|Runner unassigned from project."
+msgstr ""
+
msgid "Runners|Runners"
msgstr ""
@@ -28968,7 +29372,7 @@ msgstr ""
msgid "SastEntryPoints|How do I set up SAST?"
msgstr ""
-msgid "SastEntryPoints|Learn more."
+msgid "SastEntryPoints|Learn more"
msgstr ""
msgid "Satisfied"
@@ -29010,7 +29414,7 @@ msgstr ""
msgid "Save pipeline schedule"
msgstr ""
-msgid "Save space and find images in the container Registry. remove unneeded tags and keep only the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
+msgid "Save storage space by automatically deleting tags from the container registry and keeping the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
msgstr ""
msgid "Saving"
@@ -29184,6 +29588,9 @@ msgstr ""
msgid "Search or filter results…"
msgstr ""
+msgid "Search or jump to..."
+msgstr ""
+
msgid "Search project"
msgstr ""
@@ -29244,16 +29651,16 @@ msgstr ""
msgid "SearchCodeResults|of %{link_to_project}"
msgstr ""
-msgid "SearchResults|Showing %{count} %{scope} for%{term_element}"
+msgid "SearchResults|Showing %{count} %{scope} for %{term_element}"
msgstr ""
-msgid "SearchResults|Showing %{count} %{scope} for%{term_element} in your personal and project snippets"
+msgid "SearchResults|Showing %{count} %{scope} for %{term_element} in your personal and project snippets"
msgstr ""
-msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for%{term_element}"
+msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for %{term_element}"
msgstr ""
-msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for%{term_element} in your personal and project snippets"
+msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for %{term_element} in your personal and project snippets"
msgstr ""
msgid "SearchResults|code result"
@@ -29324,6 +29731,9 @@ msgstr ""
msgid "Secret Detection"
msgstr ""
+msgid "Secret access key"
+msgstr ""
+
msgid "Secret token"
msgstr ""
@@ -29363,9 +29773,6 @@ msgstr ""
msgid "SecurityApprovals|A merge request approval is required when the license compliance report contains a denied license."
msgstr ""
-msgid "SecurityApprovals|Configurable if security scanners are enabled. %{linkStart}Learn more.%{linkEnd}"
-msgstr ""
-
msgid "SecurityApprovals|Coverage-Check"
msgstr ""
@@ -29378,24 +29785,18 @@ msgstr ""
msgid "SecurityApprovals|Learn more about Vulnerability-Check"
msgstr ""
-msgid "SecurityApprovals|License Scanning must be enabled. %{linkStart}Learn more%{linkEnd}."
-msgstr ""
-
msgid "SecurityApprovals|License-Check"
msgstr ""
msgid "SecurityApprovals|Requires approval for Denied licenses. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}More information%{linkEnd}"
+msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "SecurityApprovals|Requires approval for vulnerabilities. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
-msgid "SecurityApprovals|Test coverage must be enabled. %{linkStart}Learn more%{linkEnd}."
-msgstr ""
-
msgid "SecurityApprovals|Vulnerability-Check"
msgstr ""
@@ -29459,6 +29860,12 @@ msgstr ""
msgid "SecurityConfiguration|Immediately begin risk analysis and remediation with application security features. Start with SAST and Secret Detection, available to all plans. Upgrade to Ultimate to get all features, including:"
msgstr ""
+msgid "SecurityConfiguration|Manage corpus"
+msgstr ""
+
+msgid "SecurityConfiguration|Manage corpus files used as mutation sources in coverage fuzzing."
+msgstr ""
+
msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
msgstr ""
@@ -29513,6 +29920,12 @@ msgstr ""
msgid "SecurityOrchestration|Action"
msgstr ""
+msgid "SecurityOrchestration|Actions"
+msgstr ""
+
+msgid "SecurityOrchestration|Add rule"
+msgstr ""
+
msgid "SecurityOrchestration|All policies"
msgstr ""
@@ -29546,9 +29959,6 @@ msgstr ""
msgid "SecurityOrchestration|Network"
msgstr ""
-msgid "SecurityOrchestration|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
-msgstr ""
-
msgid "SecurityOrchestration|New policy"
msgstr ""
@@ -29564,6 +29974,9 @@ msgstr ""
msgid "SecurityOrchestration|Policy editor"
msgstr ""
+msgid "SecurityOrchestration|Policy preview"
+msgstr ""
+
msgid "SecurityOrchestration|Policy status"
msgstr ""
@@ -29573,6 +29986,9 @@ msgstr ""
msgid "SecurityOrchestration|Rule"
msgstr ""
+msgid "SecurityOrchestration|Rules"
+msgstr ""
+
msgid "SecurityOrchestration|Scan Execution"
msgstr ""
@@ -29666,6 +30082,9 @@ msgstr ""
msgid "SecurityReports|Create issue"
msgstr ""
+msgid "SecurityReports|Development vulnerabilities"
+msgstr ""
+
msgid "SecurityReports|Dismiss vulnerability"
msgstr ""
@@ -29681,6 +30100,9 @@ msgstr ""
msgid "SecurityReports|Download results"
msgstr ""
+msgid "SecurityReports|Download scanned URLs"
+msgstr ""
+
msgid "SecurityReports|Download scanned resources"
msgstr ""
@@ -29804,6 +30226,9 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
+msgid "SecurityReports|The Vulnerability Report shows the results of the lastest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "SecurityReports|The security reports below contain one or more vulnerability findings that could not be parsed and were not recorded. Download the artifacts in the job output to investigate. Ensure any security report created conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
msgstr ""
@@ -29945,10 +30370,10 @@ msgstr ""
msgid "Select a repository"
msgstr ""
-msgid "Select a role"
+msgid "Select a repository containing templates for common files."
msgstr ""
-msgid "Select a shared template repository for all projects on this instance."
+msgid "Select a role"
msgstr ""
msgid "Select a template repository"
@@ -30026,6 +30451,9 @@ msgstr ""
msgid "Select project to choose zone"
msgstr ""
+msgid "Select project to create issue"
+msgstr ""
+
msgid "Select projects"
msgstr ""
@@ -30143,6 +30571,9 @@ msgstr ""
msgid "Send emails to help guide new users through the onboarding process."
msgstr ""
+msgid "Send emails to users upon account deactivation."
+msgstr ""
+
msgid "Send message"
msgstr ""
@@ -30161,6 +30592,9 @@ msgstr ""
msgid "Send service data"
msgstr ""
+msgid "Sentry"
+msgstr ""
+
msgid "Sentry API URL"
msgstr ""
@@ -30275,6 +30709,9 @@ msgstr ""
msgid "Service"
msgstr ""
+msgid "Service Accounts keys are required to authorize GitLab to deploy your Google Cloud project."
+msgstr ""
+
msgid "Service Desk"
msgstr ""
@@ -30347,15 +30784,15 @@ msgstr ""
msgid "Set a password on your account to pull or push via %{protocol}."
msgstr ""
-msgid "Set a template repository for projects in this group"
-msgstr ""
-
msgid "Set access permissions for this token."
msgstr ""
msgid "Set an instance-wide domain that will be available to all clusters when installing Knative."
msgstr ""
+msgid "Set any rate limit to %{code_open}0%{code_close} to disable the limit."
+msgstr ""
+
msgid "Set default and restrict visibility levels. Configure import sources and git access protocol."
msgstr ""
@@ -30368,7 +30805,7 @@ msgstr ""
msgid "Set limit to 0 to allow any file size."
msgstr ""
-msgid "Set max session time for web terminal."
+msgid "Set limits for web and API requests."
msgstr ""
msgid "Set milestone"
@@ -30377,15 +30814,18 @@ msgstr ""
msgid "Set new password"
msgstr ""
-msgid "Set notification email for abuse reports."
+msgid "Set parent epic to an epic"
msgstr ""
-msgid "Set parent epic to an epic"
+msgid "Set per-user rate limits for imports and exports of projects and groups."
msgstr ""
msgid "Set projects and maximum size limits, session duration, user options, and check feature availability for namespace plan."
msgstr ""
+msgid "Set rate limits for package registry API requests that supersede the general user and IP rate limits."
+msgstr ""
+
msgid "Set severity"
msgstr ""
@@ -30404,15 +30844,24 @@ msgstr ""
msgid "Set the default branch for this project. All merge requests and commits are made against this branch unless you specify a different one."
msgstr ""
+msgid "Set the default expiration time for job artifacts in all projects. Set to %{code_open}0%{code_close} to never expire artifacts by default. If no unit is written, it defaults to seconds. For example, these are all equivalent: %{code_open}3600%{code_close}, %{code_open}60 minutes%{code_close}, or %{code_open}one hour%{code_close}."
+msgstr ""
+
msgid "Set the due date to %{due_date}."
msgstr ""
msgid "Set the iteration to %{iteration_reference}."
msgstr ""
+msgid "Set the maximum session time for a web terminal."
+msgstr ""
+
msgid "Set the milestone to %{milestone_reference}."
msgstr ""
+msgid "Set the per-user rate limit for notes created by web or API requests."
+msgstr ""
+
msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
msgstr ""
@@ -30614,6 +31063,9 @@ msgstr ""
msgid "Show Pipeline IID"
msgstr ""
+msgid "Show all %{issuable_type}."
+msgstr ""
+
msgid "Show all activity"
msgstr ""
@@ -30665,15 +31117,9 @@ msgstr ""
msgid "Show list"
msgstr ""
-msgid "Show me advanced features"
-msgstr ""
-
msgid "Show me how to add a pipeline"
msgstr ""
-msgid "Show me the basics"
-msgstr ""
-
msgid "Show one file at a time"
msgstr ""
@@ -30712,15 +31158,15 @@ msgstr ""
msgid "Showing %{pageSize} of %{total} %{issuableType}"
msgstr ""
-msgid "Showing %{pageSize} of %{total} issues"
-msgstr ""
-
msgid "Showing all epics"
msgstr ""
msgid "Showing all issues"
msgstr ""
+msgid "Showing data for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
+msgstr ""
+
msgid "Showing data for workflow items created in this date range. Date range cannot exceed %{maxDateRange} days."
msgstr ""
@@ -30760,6 +31206,15 @@ msgstr ""
msgid "Sidebar|Weight"
msgstr ""
+msgid "Sidekiq job compression threshold (bytes)"
+msgstr ""
+
+msgid "Sidekiq job size limit (bytes)"
+msgstr ""
+
+msgid "Sidekiq job size limits"
+msgstr ""
+
msgid "Sign in"
msgstr ""
@@ -30880,6 +31335,9 @@ msgstr ""
msgid "Site profile not found for given parameters"
msgstr ""
+msgid "Sites"
+msgstr ""
+
msgid "Size"
msgstr ""
@@ -30910,19 +31368,22 @@ msgstr ""
msgid "SlackIntegration|Sends notifications about project events to Slack channels."
msgstr ""
-msgid "SlackService|2. Paste the %{strong_open}Token%{strong_close} into the field below"
+msgid "SlackService|1. %{slash_command_link_start}Add a slash command%{slash_command_link_end} in your Slack team using this information:"
msgstr ""
-msgid "SlackService|3. Select the %{strong_open}Active%{strong_close} checkbox, press %{strong_open}Save changes%{strong_close} and start using GitLab inside Slack!"
+msgid "SlackService|2. Paste the token from Slack in the %{strong_open}Token%{strong_close} field below."
msgstr ""
-msgid "SlackService|Fill in the word that works best for your team."
+msgid "SlackService|3. Select the %{strong_open}Active%{strong_close} checkbox, select %{strong_open}Save changes%{strong_close}, and start using slash commands in Slack!"
+msgstr ""
+
+msgid "SlackService|After setup, get a list of available Slack slash commands by entering"
msgstr ""
-msgid "SlackService|See list of available commands in Slack after setting up this service, by entering"
+msgid "SlackService|Fill in the word that works best for your team."
msgstr ""
-msgid "SlackService|This service allows users to perform common operations on this project by entering slash commands in Slack."
+msgid "SlackService|Perform common operations in this project by entering slash commands in Slack."
msgstr ""
msgid "Slice multiplier"
@@ -30988,7 +31449,7 @@ msgstr ""
msgid "Some child epics may be hidden due to applied filters"
msgstr ""
-msgid "Some common domains are not allowed. %{read_more_link}."
+msgid "Some common domains are not allowed. %{learn_more_link}."
msgstr ""
msgid "Some of the designs you tried uploading did not change:"
@@ -31072,9 +31533,6 @@ msgstr ""
msgid "Something went wrong while exporting requirements"
msgstr ""
-msgid "Something went wrong while fetching %{listType} list"
-msgstr ""
-
msgid "Something went wrong while fetching branches"
msgstr ""
@@ -31129,15 +31587,9 @@ msgstr ""
msgid "Something went wrong while merging this merge request. Please try again."
msgstr ""
-msgid "Something went wrong while moving issues."
-msgstr ""
-
msgid "Something went wrong while obtaining the Let's Encrypt certificate."
msgstr ""
-msgid "Something went wrong while performing the action."
-msgstr ""
-
msgid "Something went wrong while promoting the issue to an epic. Please try again."
msgstr ""
@@ -31465,7 +31917,10 @@ msgstr ""
msgid "SourcegraphPreferences|Uses a custom %{linkStart}Sourcegraph instance%{linkEnd}."
msgstr ""
-msgid "Spam Check API Key"
+msgid "Spam Check"
+msgstr ""
+
+msgid "Spam Check API key"
msgstr ""
msgid "Spam Logs"
@@ -31483,7 +31938,7 @@ msgstr ""
msgid "Specified URL cannot be used: \"%{reason}\""
msgstr ""
-msgid "Specify an e-mail address regex pattern to identify default internal users."
+msgid "Specify an email address regex pattern to identify default internal users."
msgstr ""
msgid "Speed up your pipelines with Needs relationships"
@@ -31738,7 +32193,7 @@ msgstr ""
msgid "StatusCheck|An error occurred fetching the status checks."
msgstr ""
-msgid "StatusCheck|Apply this status check to any branch or a specific protected branch."
+msgid "StatusCheck|Apply this status check to all branches or a specific protected branch."
msgstr ""
msgid "StatusCheck|Check for a status response in Merge Requests. Failures do not block merges. %{link_start}Learn more%{link_end}."
@@ -32077,6 +32532,9 @@ msgstr ""
msgid "Subscriptions"
msgstr ""
+msgid "Subscription|Your subscription for %{strong}%{namespace_name}%{strong_close} has expired and you are now on %{pricing_link_start}the GitLab Free tier%{pricing_link_end}. Don't worry, your data is safe. Get in touch with our support team (%{support_email}). They'll gladly help with your subscription renewal."
+msgstr ""
+
msgid "Subtracted"
msgstr ""
@@ -32305,6 +32763,9 @@ msgstr ""
msgid "SuperSonics|Plan"
msgstr ""
+msgid "SuperSonics|Please agree to the Subscription Agreement"
+msgstr ""
+
msgid "SuperSonics|Ready to get started? A GitLab plan is ideal for scaling organizations and for multi team usage."
msgstr ""
@@ -32335,6 +32796,9 @@ msgstr ""
msgid "SuperSonics|The activation code is not valid. Please make sure to copy it exactly from the Customers Portal or confirmation email. Learn more about %{linkStart}activating your subscription%{linkEnd}."
msgstr ""
+msgid "SuperSonics|The activation code should be a 24-character alphanumeric string"
+msgstr ""
+
msgid "SuperSonics|There is a connectivity issue."
msgstr ""
@@ -32377,9 +32841,15 @@ msgstr ""
msgid "SuperSonics|You do not have an active subscription"
msgstr ""
+msgid "SuperSonics|You have successfully added a license that activates on %{date}. Please see the subscription history table below for more details."
+msgstr ""
+
msgid "SuperSonics|You'll be charged for %{trueUpLinkStart}users over license%{trueUpLinkEnd} on a quarterly or annual basis, depending on the terms of your agreement."
msgstr ""
+msgid "SuperSonics|Your future dated license was successfully added"
+msgstr ""
+
msgid "SuperSonics|Your subscription"
msgstr ""
@@ -32632,7 +33102,7 @@ msgstr ""
msgid "Template to append to all Service Desk issues"
msgstr ""
-msgid "TemplateRepository|Select a repository to make its templates available to all projects. %{link_start}What should the repository contain?%{link_end} "
+msgid "TemplateRepository|Create common files more quickly, and standardize their format."
msgstr ""
msgid "Templates"
@@ -32834,7 +33304,7 @@ msgstr ""
msgid "TestCases|Search test cases"
msgstr ""
-msgid "TestCases|Something went wrong while adding test case to Todo."
+msgid "TestCases|Something went wrong while adding test case to a to-do item."
msgstr ""
msgid "TestCases|Something went wrong while creating a test case."
@@ -32846,7 +33316,7 @@ msgstr ""
msgid "TestCases|Something went wrong while fetching test cases list."
msgstr ""
-msgid "TestCases|Something went wrong while marking test case todo as done."
+msgid "TestCases|Something went wrong while marking test case to-do item as done."
msgstr ""
msgid "TestCases|Something went wrong while moving test case."
@@ -32966,7 +33436,7 @@ msgstr ""
msgid "Thanks for your purchase!"
msgstr ""
-msgid "That is ok, I do not want to renew"
+msgid "That's OK, I don't want to renew"
msgstr ""
msgid "That's it, well done!"
@@ -32988,7 +33458,7 @@ msgid "The %{type} contains the following error:"
msgid_plural "The %{type} contains the following errors:"
msgstr[0] ""
-msgid "The API key used by GitLab for accessing the Spam Check service endpoint"
+msgid "The API key used by GitLab for accessing the Spam Check service endpoint."
msgstr ""
msgid "The GitLab subscription service (customers.gitlab.com) is currently experiencing an outage. You can monitor the status and get updates at %{linkStart}status.gitlab.com%{linkEnd}."
@@ -33027,9 +33497,6 @@ msgstr ""
msgid "The URL to use for connecting to Elasticsearch. Use a comma-separated list to support clustering (e.g., \"http://localhost:9200, http://localhost:9201\")."
msgstr ""
-msgid "The Vulnerability Report shows the results of the last successful pipeline run on the default branch."
-msgstr ""
-
msgid "The X509 Certificate to use when mutual TLS is required to communicate with the external authorization service. If left blank, the server certificate is still validated when accessing over HTTPS."
msgstr ""
@@ -33087,9 +33554,6 @@ msgstr ""
msgid "The default branch for this project has been changed. Please update your bookmarks."
msgstr ""
-msgid "The default expiration time for job artifacts. 0 for unlimited. The default unit is in seconds, but you can use other units, for example %{code_open}4 mins 2 sec%{code_close}, %{code_open}2h42min%{code_close}."
-msgstr ""
-
msgid "The dependency list details information about the components used within your project."
msgstr ""
@@ -33280,9 +33744,6 @@ msgstr ""
msgid "The merge conflicts for this merge request have already been resolved. Please return to the merge request."
msgstr ""
-msgid "The merge request can now be merged."
-msgstr ""
-
msgid "The metric must be one of %{metrics}."
msgstr ""
@@ -33658,7 +34119,7 @@ msgstr ""
msgid "There was a problem updating the keep latest artifacts setting."
msgstr ""
-msgid "There was an error %{message} todo."
+msgid "There was an error %{message} to-do item."
msgstr ""
msgid "There was an error adding a To Do."
@@ -33697,6 +34158,9 @@ msgstr ""
msgid "There was an error fetching projects"
msgstr ""
+msgid "There was an error fetching search autocomplete suggestions"
+msgstr ""
+
msgid "There was an error fetching stage total counts"
msgstr ""
@@ -34021,6 +34485,9 @@ msgstr ""
msgid "This field is required."
msgstr ""
+msgid "This form is disabled in preview"
+msgstr ""
+
msgid "This group"
msgstr ""
@@ -34042,9 +34509,6 @@ msgstr ""
msgid "This group is linked to a subscription"
msgstr ""
-msgid "This group, including all subgroups, projects and git repositories, will be reachable from only the specified IP address ranges."
-msgstr ""
-
msgid "This group, its subgroups and projects has been scheduled for removal on %{date}."
msgstr ""
@@ -34324,9 +34788,6 @@ msgstr ""
msgid "This user cannot be unlocked manually from GitLab"
msgstr ""
-msgid "This user does not have a pending request"
-msgstr ""
-
msgid "This user has an unconfirmed email address (%{email}). You may force a confirmation."
msgstr ""
@@ -34435,9 +34896,6 @@ msgstr ""
msgid "ThreatMonitoring|Packet Activity"
msgstr ""
-msgid "ThreatMonitoring|Policies"
-msgstr ""
-
msgid "ThreatMonitoring|Requests"
msgstr ""
@@ -34489,6 +34947,12 @@ msgstr ""
msgid "ThreatMonitoring|View documentation"
msgstr ""
+msgid "Threshold in bytes at which to compress Sidekiq job arguments."
+msgstr ""
+
+msgid "Threshold in bytes at which to reject Sidekiq jobs. Set this to 0 to if you don't want to limit Sidekiq jobs."
+msgstr ""
+
msgid "Throughput"
msgstr ""
@@ -34498,6 +34962,9 @@ msgstr ""
msgid "Time"
msgstr ""
+msgid "Time (in hours) that users are allowed to skip forced configuration of two-factor authentication."
+msgstr ""
+
msgid "Time Spent"
msgstr ""
@@ -34564,7 +35031,7 @@ msgstr ""
msgid "TimeTrackingEstimated|Est"
msgstr ""
-msgid "TimeTracking|%{startTag}Spent: %{endTag}%{timeSpentHumanReadable}"
+msgid "TimeTracking|%{spentStart}Spent: %{spentEnd}"
msgstr ""
msgid "TimeTracking|Estimated:"
@@ -34776,6 +35243,9 @@ msgstr ""
msgid "To access this domain create a new DNS record"
msgstr ""
+msgid "To add a custom suffix, set up a Service Desk email address. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "To add an SSH key you need to %{generate_link_start}generate one%{link_end} or use an %{existing_link_start}existing key%{link_end}."
msgstr ""
@@ -34797,13 +35267,16 @@ msgstr ""
msgid "To connect an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To continue using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
+msgstr ""
+
msgid "To continue, you need to select the link in the confirmation email we sent to verify your email address. If you didn't get our email, select %{strongStart}Resend confirmation email.%{strongEnd}"
msgstr ""
msgid "To define internal users, first enable new users set to external"
msgstr ""
-msgid "To enable Registration Features, make sure \"Enable service ping\" is checked."
+msgid "To enable Registration Features, first enable Service Ping."
msgstr ""
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
@@ -34830,7 +35303,7 @@ msgstr ""
msgid "To get started, use the link below to confirm your account."
msgstr ""
-msgid "To help improve GitLab and its user experience, GitLab will periodically collect usage information."
+msgid "To help improve GitLab and its user experience, GitLab periodically collects usage information."
msgstr ""
msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
@@ -34863,7 +35336,7 @@ msgstr ""
msgid "To preserve performance only %{strong_open}%{display_size} of %{real_size}%{strong_close} files are displayed."
msgstr ""
-msgid "To protect this issue's confidentiality, %{forkLink} and set the fork's visibility to private."
+msgid "To protect this issue's confidentiality, %{linkStart}fork this project%{linkEnd} and set the fork's visibility to private."
msgstr ""
msgid "To protect this issue's confidentiality, a private fork of this project was selected."
@@ -34896,12 +35369,15 @@ msgstr ""
msgid "To set up SAML authentication for your group through an identity provider like Azure, Okta, Onelogin, Ping Identity, or your custom SAML 2.0 provider:"
msgstr ""
-msgid "To set up this service:"
+msgid "To set up this integration:"
msgstr ""
msgid "To specify the notification level per project of a group you belong to, you need to visit project page and change notification level there."
msgstr ""
+msgid "To start using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
+msgstr ""
+
msgid "To unsubscribe from this issue, please paste the following link into your browser:"
msgstr ""
@@ -35488,9 +35964,6 @@ msgstr ""
msgid "Unable to fetch branches list, please close the form and try again"
msgstr ""
-msgid "Unable to fetch unscanned projects"
-msgstr ""
-
msgid "Unable to fetch vulnerable projects"
msgstr ""
@@ -35545,6 +36018,15 @@ msgstr ""
msgid "Unable to update this issue at this time."
msgstr ""
+msgid "Unapprove a merge request"
+msgstr ""
+
+msgid "Unapprove the current merge request."
+msgstr ""
+
+msgid "Unapproved the current merge request."
+msgstr ""
+
msgid "Unarchive project"
msgstr ""
@@ -35557,16 +36039,13 @@ msgstr ""
msgid "Unassigned"
msgstr ""
-msgid "Unauthenticated API request rate limit"
-msgstr ""
-
-msgid "Unauthenticated rate limit period in seconds"
+msgid "Unauthenticated API rate limit period in seconds"
msgstr ""
-msgid "Unauthenticated request rate limit"
+msgid "Unauthenticated requests"
msgstr ""
-msgid "Unauthenticated requests"
+msgid "Unauthenticated web rate limit period in seconds"
msgstr ""
msgid "Undo"
@@ -35668,18 +36147,6 @@ msgstr ""
msgid "Unresolved"
msgstr ""
-msgid "UnscannedProjects|15 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|30 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|5 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|60 or more days"
-msgstr ""
-
msgid "Unschedule job"
msgstr ""
@@ -35899,6 +36366,9 @@ msgstr ""
msgid "UsageQuota|%{help_link_start}Shared runners%{help_link_end} are disabled, so there are no limits set on pipeline usage"
msgstr ""
+msgid "UsageQuota|%{linkTitle} help link"
+msgstr ""
+
msgid "UsageQuota|%{percentageLeft} of purchased storage is available"
msgstr ""
@@ -35908,6 +36378,9 @@ msgstr ""
msgid "UsageQuota|Artifacts is a sum of build and pipeline artifacts."
msgstr ""
+msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
+msgstr ""
+
msgid "UsageQuota|Buy additional minutes"
msgstr ""
@@ -35917,9 +36390,21 @@ msgstr ""
msgid "UsageQuota|CI minutes usage by project"
msgstr ""
+msgid "UsageQuota|Code packages and container images."
+msgstr ""
+
msgid "UsageQuota|Current period usage"
msgstr ""
+msgid "UsageQuota|File attachments and smaller design graphics."
+msgstr ""
+
+msgid "UsageQuota|Git repository, managed by the Gitaly service."
+msgstr ""
+
+msgid "UsageQuota|Includes project registry, artifacts, packages, wiki, uploads and other items."
+msgstr ""
+
msgid "UsageQuota|Increase storage temporarily"
msgstr ""
@@ -35938,6 +36423,9 @@ msgstr ""
msgid "UsageQuota|Packages"
msgstr ""
+msgid "UsageQuota|Pipeline artifacts and job artifacts, created with CI/CD."
+msgstr ""
+
msgid "UsageQuota|Pipelines"
msgstr ""
@@ -35956,6 +36444,9 @@ msgstr ""
msgid "UsageQuota|Seats"
msgstr ""
+msgid "UsageQuota|Shared bits of code and text."
+msgstr ""
+
msgid "UsageQuota|Snippets"
msgstr ""
@@ -35965,6 +36456,12 @@ msgstr ""
msgid "UsageQuota|Storage"
msgstr ""
+msgid "UsageQuota|Storage type"
+msgstr ""
+
+msgid "UsageQuota|There is a known issue with Artifact storage where the total could be incorrect for some projects. More details and progress are available in %{warningLinkStart}the epic%{warningLinkEnd}."
+msgstr ""
+
msgid "UsageQuota|This is the total amount of storage used across your projects within this namespace."
msgstr ""
@@ -36004,6 +36501,9 @@ msgstr ""
msgid "UsageQuota|Usage"
msgstr ""
+msgid "UsageQuota|Usage Breakdown"
+msgstr ""
+
msgid "UsageQuota|Usage Quotas"
msgstr ""
@@ -36028,6 +36528,9 @@ msgstr ""
msgid "UsageQuota|Wiki"
msgstr ""
+msgid "UsageQuota|Wiki content."
+msgstr ""
+
msgid "UsageQuota|Wikis"
msgstr ""
@@ -36244,7 +36747,10 @@ msgstr ""
msgid "User Settings"
msgstr ""
-msgid "User and IP Rate Limits"
+msgid "User and IP rate limits"
+msgstr ""
+
+msgid "User does not have a pending request"
msgstr ""
msgid "User identity was successfully created."
@@ -36541,6 +37047,9 @@ msgstr ""
msgid "Users can launch a development environment from a GitLab browser tab when the %{linkStart}Gitpod%{linkEnd} integration is enabled."
msgstr ""
+msgid "Users can reactivate their account by signing in."
+msgstr ""
+
msgid "Users can render diagrams in AsciiDoc, Markdown, reStructuredText, and Textile documents using Kroki."
msgstr ""
@@ -36556,6 +37065,9 @@ msgstr ""
msgid "Users requesting access to"
msgstr ""
+msgid "Users to exclude from the rate limit"
+msgstr ""
+
msgid "Users were successfully added."
msgstr ""
@@ -36577,6 +37089,9 @@ msgstr ""
msgid "UsersSelect|Unassigned"
msgstr ""
+msgid "Uses GitLab as a lightweight alternative to Sentry."
+msgstr ""
+
msgid "Using %{code_start}::%{code_end} denotes a %{link_start}scoped label set%{link_end}"
msgstr ""
@@ -36607,10 +37122,7 @@ msgstr ""
msgid "Value Stream Analytics can help you determine your team’s velocity"
msgstr ""
-msgid "Value Stream Analytics gives an overview of how much time it takes to go from idea to production in your project."
-msgstr ""
-
-msgid "Value may contain a variable reference"
+msgid "Value might contain a variable reference"
msgstr ""
msgid "Value stream"
@@ -36676,10 +37188,10 @@ msgstr ""
msgid "ValueStream|The Default Value Stream cannot be deleted"
msgstr ""
-msgid "Variable"
+msgid "Values that contain the %{codeStart}$%{codeEnd} character can be considered a variable reference and expanded. %{docsLinkStart}Learn more.%{docsLinkEnd}"
msgstr ""
-msgid "Variable references indicated by %{codeStart}$%{codeEnd} may be expanded. If this is not what you want, consider %{docsLinkStart}using a workaround to prevent expansion%{docsLinkEnd}."
+msgid "Variable"
msgstr ""
msgid "Variable will be masked in job logs."
@@ -37081,6 +37593,9 @@ msgstr ""
msgid "Vulnerability|Evidence"
msgstr ""
+msgid "Vulnerability|False positive detected"
+msgstr ""
+
msgid "Vulnerability|File"
msgstr ""
@@ -37123,6 +37638,9 @@ msgstr ""
msgid "Vulnerability|Status"
msgstr ""
+msgid "Vulnerability|The scanner determined this vulnerability to be a false positive. Verify the evaluation before changing its status. %{linkStart}Learn more about false positive detection.%{linkEnd}"
+msgstr ""
+
msgid "Vulnerability|The unmodified response is the original response that had no mutations done to the request"
msgstr ""
@@ -37447,9 +37965,6 @@ msgstr ""
msgid "Welcome to GitLab,%{br_tag}%{name}!"
msgstr ""
-msgid "Welcome to the guided GitLab tour"
-msgstr ""
-
msgid "Welcome, %{name}!"
msgstr ""
@@ -37468,9 +37983,6 @@ msgstr ""
msgid "What are you searching for?"
msgstr ""
-msgid "What describes you best?"
-msgstr ""
-
msgid "What does this command do?"
msgstr ""
@@ -37492,13 +38004,13 @@ msgstr ""
msgid "What is your job title? (optional)"
msgstr ""
-msgid "What will you use this group for?"
+msgid "What templates can I create?"
msgstr ""
-msgid "What's new"
+msgid "What will you use this group for?"
msgstr ""
-msgid "What’s your experience level?"
+msgid "What's new"
msgstr ""
msgid "When a deployment job is successful, skip older deployment jobs that are still pending."
@@ -37510,6 +38022,9 @@ msgstr ""
msgid "When an event in GitLab triggers a webhook, you can use the request details to figure out if something went wrong."
msgstr ""
+msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+msgstr ""
+
msgid "When inactive, an external authentication provider must be used."
msgstr ""
@@ -37532,6 +38047,9 @@ msgstr ""
msgid "When:"
msgstr ""
+msgid "Which API requests are affected?"
+msgstr ""
+
msgid "While it's rare to have no vulnerabilities, it can happen. In any event, we ask that you please double check your settings to make sure you've set up your dashboard correctly."
msgstr ""
@@ -37811,6 +38329,9 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|Work Items"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -37886,6 +38407,9 @@ msgstr ""
msgid "You are already a member of this %{member_source}."
msgstr ""
+msgid "You are already impersonating another user"
+msgstr ""
+
msgid "You are an admin, which means granting access to %{client_name} will allow them to interact with GitLab as an admin as well. Proceed with caution."
msgstr ""
@@ -37988,6 +38512,9 @@ msgstr ""
msgid "You can also use project access tokens with Git to authenticate over HTTP(S). %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "You can always change your URL later"
+msgstr ""
+
msgid "You can always edit this later"
msgstr ""
@@ -38144,10 +38671,10 @@ msgstr ""
msgid "You can’t %{tag_start}edit%{tag_end} files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
-msgid "You could not create a new trigger."
+msgid "You can’t edit files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
-msgid "You didn't renew your subscription for %{strong}%{namespace_name}%{strong_close} so it was downgraded to the free plan."
+msgid "You could not create a new trigger."
msgstr ""
msgid "You do not have any subscriptions yet"
@@ -38315,6 +38842,12 @@ msgstr ""
msgid "You must provide your current password in order to change it."
msgstr ""
+msgid "You must sign in to search for specific projects."
+msgstr ""
+
+msgid "You must sign in to search for specific terms."
+msgstr ""
+
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
@@ -38342,6 +38875,9 @@ msgstr ""
msgid "You need to upload a GitLab project export archive (ending in .gz)."
msgstr ""
+msgid "You need to verify your primary email first before enabling Two-Factor Authentication."
+msgstr ""
+
msgid "You successfully declined the invitation"
msgstr ""
@@ -38450,10 +38986,10 @@ msgstr ""
msgid "Your %{host} account was signed in to from a new location"
msgstr ""
-msgid "Your %{strong}%{plan_name}%{strong_close} subscription for %{strong}%{namespace_name}%{strong_close} will expire on %{strong}%{expires_on}%{strong_close}."
+msgid "Your %{strong}%{plan_name}%{strong_close} subscription expires on %{strong}%{expires_on}%{strong_close}. After that date, you cannot create issues or merge requests, or use many other features."
msgstr ""
-msgid "Your %{strong}%{plan_name}%{strong_close} subscription will expire on %{strong}%{expires_on}%{strong_close}. After that, you will not be able to create issues or merge requests as well as many other features."
+msgid "Your %{strong}%{plan_name}%{strong_close} subscription for %{strong}%{namespace_name}%{strong_close} will expire on %{strong}%{expires_on}%{strong_close}."
msgstr ""
msgid "Your CI/CD configuration syntax is invalid. View Lint tab for more details."
@@ -38477,7 +39013,7 @@ msgstr ""
msgid "Your GPG keys (%{count})"
msgstr ""
-msgid "Your GitLab account has been locked due to an excessive amount of unsuccessful sign in attempts. Your account will automatically unlock in %{duration} or you may click the link below to unlock now."
+msgid "Your GitLab account has been locked due to an excessive number of unsuccessful sign in attempts. You can wait for your account to automatically unlock in %{duration} or you can click the link below to unlock now."
msgstr ""
msgid "Your GitLab account request has been approved!"
@@ -38588,6 +39124,9 @@ msgstr ""
msgid "Your commit email is used for web based operations, such as edits and merges."
msgstr ""
+msgid "Your current password is required to register a two-factor authenticator app."
+msgstr ""
+
msgid "Your dashboard has been copied. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
@@ -38687,6 +39226,9 @@ msgstr ""
msgid "Your project limit is %{limit} projects! Please contact your administrator to increase it"
msgstr ""
+msgid "Your project will be created at:"
+msgstr ""
+
msgid "Your projects"
msgstr ""
@@ -38726,11 +39268,9 @@ msgstr ""
msgid "Your subscription expired!"
msgstr ""
-msgid "Your subscription has been downgraded."
-msgstr ""
-
-msgid "Your subscription will expire in %{remaining_days}."
-msgstr ""
+msgid "Your subscription will expire in %{remaining_days} day."
+msgid_plural "Your subscription will expire in %{remaining_days} days."
+msgstr[0] ""
msgid "Your username is %{username}."
msgstr ""
@@ -38935,6 +39475,9 @@ msgstr ""
msgid "cannot merge"
msgstr ""
+msgid "cannot not be used for user namespace"
+msgstr ""
+
msgid "ciReport|%{degradedNum} degraded"
msgstr ""
@@ -39257,6 +39800,9 @@ msgstr ""
msgid "created %{timeAgo}"
msgstr ""
+msgid "created %{timeAgo} by %{author}"
+msgstr ""
+
msgid "created by"
msgstr ""
@@ -39300,9 +39846,6 @@ msgstr ""
msgid "does not have a supported extension. Only %{extension_list} are supported"
msgstr ""
-msgid "domain is not authorized for sign-up."
-msgstr ""
-
msgid "download it"
msgstr ""
@@ -39319,17 +39862,13 @@ msgstr ""
msgid "email '%{email}' is not a verified email."
msgstr ""
-msgid "email does not match the allowed domain of %{email_domains}"
-msgid_plural "email does not match the allowed domains: %{email_domains}"
-msgstr[0] ""
-
msgid "enabled"
msgstr ""
msgid "encrypted: needs to be a :required, :optional or :migrating!"
msgstr ""
-msgid "ending with MIME type format is not allowed."
+msgid "ending with a reserved file extension is not allowed."
msgstr ""
msgid "entries cannot be larger than 255 characters"
@@ -39353,6 +39892,9 @@ msgstr ""
msgid "estimateCommand|%{slash_command} overwrites the total estimated time."
msgstr ""
+msgid "example.com"
+msgstr ""
+
msgid "exceeds the limit of %{bytes} bytes"
msgstr ""
@@ -39402,9 +39944,6 @@ msgstr ""
msgid "fork"
msgstr ""
-msgid "fork this project"
-msgstr ""
-
msgid "from"
msgstr ""
@@ -39412,6 +39951,9 @@ msgid "from %d job"
msgid_plural "from %d jobs"
msgstr[0] ""
+msgid "frontmatter"
+msgstr ""
+
msgid "group"
msgstr ""
@@ -39439,6 +39981,9 @@ msgstr ""
msgid "has been completed."
msgstr ""
+msgid "has too deep level of nesting"
+msgstr ""
+
msgid "help"
msgstr ""
@@ -39472,9 +40017,21 @@ msgstr ""
msgid "in"
msgstr ""
+msgid "in Infrastructure :: Kubernetes clusters"
+msgstr ""
+
+msgid "in all GitLab"
+msgstr ""
+
+msgid "in group"
+msgstr ""
+
msgid "in group %{link_to_group}"
msgstr ""
+msgid "in project"
+msgstr ""
+
msgid "in project %{link_to_project}"
msgstr ""
@@ -39515,16 +40072,19 @@ msgstr ""
msgid "is not a valid X509 certificate."
msgstr ""
-msgid "is not allowed since the group is not top-level group."
+msgid "is not allowed for sign-up."
msgstr ""
-msgid "is not allowed. Try again with a different email address, or contact your GitLab admin."
+msgid "is not allowed for this group."
msgstr ""
-msgid "is not allowed. We do not currently support project-level iterations"
+msgid "is not allowed for this project."
+msgstr ""
+
+msgid "is not allowed since the group is not top-level group."
msgstr ""
-msgid "is not from an allowed domain."
+msgid "is not allowed. We do not currently support project-level iterations"
msgstr ""
msgid "is not in the group enforcing Group Managed Account"
@@ -39617,6 +40177,9 @@ msgstr ""
msgid "log in"
msgstr ""
+msgid "managed"
+msgstr ""
+
msgid "manual"
msgstr ""
@@ -39663,6 +40226,9 @@ msgstr ""
msgid "mrWidget| Please restore it or use a different %{missingBranchName} branch"
msgstr ""
+msgid "mrWidget|%{linkStart}Set up now%{linkEnd} to analyze your source code for known security vulnerabilities."
+msgstr ""
+
msgid "mrWidget|%{mergeError}."
msgstr ""
@@ -39742,6 +40308,9 @@ msgid "mrWidget|Closes issue"
msgid_plural "mrWidget|Closes issues"
msgstr[0] ""
+msgid "mrWidget|Create issue to resolve all threads"
+msgstr ""
+
msgid "mrWidget|Delete source branch"
msgstr ""
@@ -39751,12 +40320,18 @@ msgstr ""
msgid "mrWidget|Did not close"
msgstr ""
+msgid "mrWidget|Dismiss"
+msgstr ""
+
msgid "mrWidget|Email patches"
msgstr ""
msgid "mrWidget|Failed to load deployment statistics"
msgstr ""
+msgid "mrWidget|Hide %{widget} details"
+msgstr ""
+
msgid "mrWidget|If the %{missingBranchName} branch exists in your local repository, you can merge this merge request manually using the command line"
msgstr ""
@@ -39851,9 +40426,6 @@ msgstr ""
msgid "mrWidget|Request to merge"
msgstr ""
-msgid "mrWidget|Resolve all threads in new issue"
-msgstr ""
-
msgid "mrWidget|Resolve conflicts"
msgstr ""
@@ -39869,6 +40441,9 @@ msgstr ""
msgid "mrWidget|Revoke approval"
msgstr ""
+msgid "mrWidget|SAST and Secret Detection is not enabled."
+msgstr ""
+
msgid "mrWidget|Set by %{merge_author} to be added to the merge train when the pipeline succeeds"
msgstr ""
@@ -39878,6 +40453,9 @@ msgstr ""
msgid "mrWidget|Set by %{merge_author} to start a merge train when the pipeline succeeds"
msgstr ""
+msgid "mrWidget|Show %{widget} details"
+msgstr ""
+
msgid "mrWidget|The changes were merged into"
msgstr ""
@@ -39890,6 +40468,9 @@ msgstr ""
msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure, or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
msgstr ""
+msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure."
+msgstr ""
+
msgid "mrWidget|The source branch has been deleted"
msgstr ""
@@ -39932,6 +40513,9 @@ msgstr ""
msgid "mrWidget|You can merge after removing denied licenses"
msgstr ""
+msgid "mrWidget|You can only merge once this merge request is approved."
+msgstr ""
+
msgid "mrWidget|Your password"
msgstr ""
@@ -39968,6 +40552,9 @@ msgstr ""
msgid "must be less than the limit of %{tag_limit} tags"
msgstr ""
+msgid "must be set for a project namespace"
+msgstr ""
+
msgid "must be unique by status and elapsed time within a policy"
msgstr ""
@@ -40075,6 +40662,9 @@ msgstr ""
msgid "pipeline"
msgstr ""
+msgid "pipeline schedules documentation"
+msgstr ""
+
msgid "pod_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
msgstr ""
@@ -40122,16 +40712,25 @@ msgstr ""
msgid "project name"
msgstr ""
+msgid "project namespace cannot be the parent of another namespace"
+msgstr ""
+
msgid "projects"
msgstr ""
msgid "quick actions"
msgstr ""
-msgid "reCAPTCHA Private Key"
+msgid "reCAPTCHA"
+msgstr ""
+
+msgid "reCAPTCHA helps prevent credential stuffing."
msgstr ""
-msgid "reCAPTCHA Site Key"
+msgid "reCAPTCHA private key"
+msgstr ""
+
+msgid "reCAPTCHA site key"
msgstr ""
msgid "recent activity"
@@ -40357,6 +40956,9 @@ msgstr ""
msgid "user avatar"
msgstr ""
+msgid "user namespace cannot be the parent of another namespace"
+msgstr ""
+
msgid "user preferences"
msgstr ""
@@ -40448,3 +41050,9 @@ msgstr ""
msgid "your settings"
msgstr ""
+msgid "{group}"
+msgstr ""
+
+msgid "{project}"
+msgstr ""
+
diff --git a/locale/zh_CN/gitlab.po b/locale/zh_CN/gitlab.po
index 5a011c2be95..7bdd455e3a1 100644
--- a/locale/zh_CN/gitlab.po
+++ b/locale/zh_CN/gitlab.po
@@ -14,10 +14,7 @@ msgstr ""
"X-Crowdin-Language: zh-CN\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-09-01 22:31\n"
-
-msgid " %{name}, confirm your email address now! "
-msgstr " %{name},现在确认您的电å­é‚®ä»¶åœ°å€ï¼ "
+"PO-Revision-Date: 2021-10-04 20:19\n"
msgid " %{start} to %{end}"
msgstr "从%{start}到%{end}"
@@ -88,7 +85,15 @@ msgid "\"el\" parameter is required for createInstance()"
msgstr "createInstance()必需“elâ€å‚æ•°"
msgid "#general, #development"
-msgstr ""
+msgstr "#一般, #å¼€å‘"
+
+msgid "%d Alert"
+msgid_plural "%d Alerts"
+msgstr[0] ""
+
+msgid "%d Alert:"
+msgid_plural "%d Alerts:"
+msgstr[0] ""
msgid "%d Approval"
msgid_plural "%d Approvals"
@@ -315,7 +320,7 @@ msgstr[0] "æ¯ä¸ªé•œåƒå称有%d个标签"
msgid "%d token has expired"
msgid_plural "%d tokens have expired"
-msgstr[0] ""
+msgstr[0] "%d 个令牌已过期"
msgid "%d unassigned issue"
msgid_plural "%d unassigned issues"
@@ -387,8 +392,11 @@ msgstr "%{code_open}éšè—:%{code_close} éšè—在作业日志中。必须符å
msgid "%{code_open}Protected:%{code_close} Only exposed to protected branches or tags."
msgstr "%{code_open}å—ä¿æŠ¤ï¼š%{code_close} 仅暴露于å—ä¿æŠ¤çš„分支或标签。"
-msgid "%{commit_author_link} authored %{commit_timeago}"
-msgstr "由%{commit_author_link}编写于%{commit_timeago}"
+msgid "%{commit_author_link} authored %{commit_authored_timeago}"
+msgstr ""
+
+msgid "%{commit_author_link} authored %{commit_authored_timeago} and %{commit_committer_avatar} %{commit_committer_link} committed %{commit_committer_timeago}"
+msgstr ""
msgid "%{completedCount} completed weight"
msgstr "%{completedCount}已完æˆæƒé‡"
@@ -450,7 +458,7 @@ msgid "%{count} related %{pluralized_subject}: %{links}"
msgstr "%{count}个相关的%{pluralized_subject}: %{links}"
msgid "%{count} selected"
-msgstr ""
+msgstr "已选择 %{count} 个"
msgid "%{count} total weight"
msgstr "总æƒé‡%{count}"
@@ -476,6 +484,15 @@ msgstr "%{doc_link_start}高级æœç´¢%{doc_link_end} 被ç¦ç”¨ï¼Œå› ä¸º %{ref_el
msgid "%{doc_link_start}Advanced search%{doc_link_end} is enabled."
msgstr "%{doc_link_start}高级æœç´¢%{doc_link_end} å·²å¯ç”¨ã€‚"
+msgid "%{docs_link_start}Learn about visibility levels.%{docs_link_end}"
+msgstr ""
+
+msgid "%{docs_link_start}What is Large File Storage?%{docs_link_end}"
+msgstr ""
+
+msgid "%{docs_link_start}What is two-factor authentication?%{docs_link_end}"
+msgstr ""
+
msgid "%{due_date} (Past due)"
msgstr "%{due_date} (已过期)"
@@ -548,9 +565,6 @@ msgstr "%{issuableType} 将被删除ï¼æ‚¨ç¡®å®šå—?"
msgid "%{issueType} actions"
msgstr "%{issueType}æ“作"
-msgid "%{issuesCount} issues with a limit of %{maxIssueCount}"
-msgstr "%{issuesCount}个议题,上é™ä¸º%{maxIssueCount}"
-
msgid "%{issuesSize} with a limit of %{maxIssueCount}"
msgstr "%{issuesSize}个,上é™ä¸º%{maxIssueCount}"
@@ -600,7 +614,7 @@ msgid "%{labelStart}Severity:%{labelEnd} %{severity}"
msgstr "%{labelStart}严é‡ç¨‹åº¦ :%{labelEnd}%{severity}"
msgid "%{labelStart}Tool:%{labelEnd} %{reportType}"
-msgstr ""
+msgstr "%{labelStart}工具:%{labelEnd} %{reportType}"
msgid "%{labelStart}Unmodified response:%{labelEnd} %{headers}"
msgstr "%{labelStart}未修改的å“应:%{labelEnd} %{headers}"
@@ -608,6 +622,12 @@ msgstr "%{labelStart}未修改的å“应:%{labelEnd} %{headers}"
msgid "%{label_for_message} unavailable"
msgstr "%{label_for_message}ä¸å¯ç”¨"
+msgid "%{learn_more_link}."
+msgstr ""
+
+msgid "%{lessThan} 1 hour"
+msgstr ""
+
msgid "%{lets_encrypt_link_start}Let's Encrypt%{lets_encrypt_link_end} is a free, automated, and open certificate authority (CA) that issues digital certificates to enable HTTPS (SSL/TLS) for sites."
msgstr "%{lets_encrypt_link_start}Let's Encrypt%{lets_encrypt_link_end} 是一个å…费的ã€è‡ªåŠ¨åŒ–çš„ã€å¼€æ”¾çš„è¯ä¹¦é¢å‘机构(CA),æ供数字è¯ä¹¦ï¼Œä»¥ä¾¿ä¸ºç½‘ç«™å¯ç”¨ HTTPS(SSL / TLS)。"
@@ -620,15 +640,15 @@ msgstr "由于派生的æºé¡¹ç›®å¯è§æ€§è¾ƒä½Žï¼Œå› æ­¤ä¸å…许使用%{level_n
msgid "%{link_start}Learn more%{link_end} about roles."
msgstr "%{link_start}查看更多%{link_end} 关于角色的信æ¯ã€‚"
-msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
-msgstr "%{link_start}了解更多%{link_end}哪些信æ¯ä¼šåˆ†äº«ç»™GitLab Inc.。"
-
msgid "%{link_start}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},å…许此åˆå¹¶è¯·æ±‚在准备就绪时被åˆå¹¶ã€‚"
msgid "%{link_start}Start the title with %{draft_snippet}%{link_end} to prevent a merge request that is a work in progress from being merged before it's ready."
msgstr "%{link_start}以%{draft_snippet}作为标题的开头%{link_end} ,以防止正在工作进程中的åˆå¹¶è¯·æ±‚在准备就绪之å‰è¢«åˆå¹¶ã€‚"
+msgid "%{link_start}What information does GitLab Inc. collect?%{link_end}"
+msgstr ""
+
msgid "%{listToShow}, and %{awardsListLength} more"
msgstr "%{listToShow},还有 %{awardsListLength} 个。"
@@ -764,7 +784,7 @@ msgid "%{rotation} has been recalculated with the remaining participants. Please
msgstr "%{rotation} 已与其余å‚与者é‡æ–°è®¡ç®—。请审查 %{rotation} 的新设置。建议您与目å‰çš„on-call人员å–å¾—è”系,以确ä¿on-call工作的连续性。"
msgid "%{scope} results for term '%{term}'"
-msgstr ""
+msgstr "'%{term}' 的结果 %{scope} "
msgid "%{seconds}s"
msgstr "%{seconds}秒"
@@ -777,8 +797,8 @@ msgid "%{securityScanner} result is not available because a pipeline has not bee
msgid_plural "%{securityScanner} results are not available because a pipeline has not been run since it was enabled. %{linkStart}Run a pipeline%{linkEnd}"
msgstr[0] "%{securityScanner}无结果,因为自å¯ç”¨ä»¥æ¥å°šæœªè¿è¡Œæµæ°´çº¿ã€‚%{linkStart}è¿è¡Œæµæ°´çº¿%{linkEnd}"
-msgid "%{service_ping_link_start}Learn more%{service_ping_link_end} about what information is shared with GitLab Inc."
-msgstr "%{service_ping_link_start}了解更多%{service_ping_link_end}关于哪些信æ¯ä¼šåˆ†äº«ç»™GitLab Inc.。"
+msgid "%{service_ping_link_start}What information is shared with GitLab Inc.?%{service_ping_link_end}"
+msgstr ""
msgid "%{size} %{unit}"
msgstr "%{size} %{unit}"
@@ -813,6 +833,9 @@ msgstr "从%{start}到%{end}"
msgid "%{state} epics"
msgstr "%{state}å²è¯—"
+msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
+msgstr ""
+
msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
msgstr "%{strongStart}æ示:%{strongEnd}您å¯ä»¥%{linkStart}通过以下命令%{linkEnd}å°†åˆå¹¶è¯·æ±‚检出到本地。"
@@ -865,10 +888,6 @@ msgstr "%{tag}-%{evidence}-%{filename}"
msgid "%{template_project_id} is unknown or invalid"
msgstr "%{template_project_id}为未知或无效"
-msgid "%{text} %{files}"
-msgid_plural "%{text} %{files} files"
-msgstr[0] "%{text}%{files}"
-
msgid "%{text} is available"
msgstr "%{text}å¯ç”¨"
@@ -953,9 +972,6 @@ msgstr "%{webhooks_link_start}%{webhook_type}%{link_end}å…许您针对æŸä¸ªç¾¤
msgid "%{wildcards_link_start}Wildcards%{wildcards_link_end} such as %{code_tag_start}v*%{code_tag_end} or %{code_tag_start}*-release%{code_tag_end} are supported."
msgstr "支æŒ%{wildcards_link_start}通é…符%{wildcards_link_end} ,例如 %{code_tag_start}v *%{code_tag_end} 或 %{code_tag_start}* -release%{code_tag_end}。"
-msgid "&lt; 1 hour"
-msgstr "&lt; 1å°æ—¶"
-
msgid "'%{data}' at %{location} does not match format: %{format}"
msgstr "%{location}上的'%{data}'ä¸ç¬¦åˆæ ¼å¼: %{format}"
@@ -1038,9 +1054,6 @@ msgstr "(已撤销)"
msgid "(we need your current password to confirm your changes)"
msgstr "(我们需è¦æ‚¨å½“å‰çš„密ç æ¥ç¡®è®¤æ‚¨çš„更改)"
-msgid "* * * * *"
-msgstr "* * * * *"
-
msgid "+ %{amount} more"
msgstr "+ 其余 %{amount} 项"
@@ -1104,12 +1117,12 @@ msgstr "- 显示较少"
msgid "."
msgstr "."
+msgid "/"
+msgstr ""
+
msgid "0 bytes"
msgstr "0 字节"
-msgid "0 for unlimited, only effective with remote storage enabled."
-msgstr "0表示无é™åˆ¶ï¼Œä»…在å¯ç”¨è¿œç¨‹å­˜å‚¨æ—¶æœ‰æ•ˆã€‚"
-
msgid "0t1DgySidms"
msgstr "0t1DgySidms"
@@ -1214,6 +1227,9 @@ msgstr "10-19项贡献"
msgid "1000+"
msgstr "1000+"
+msgid "192.168.0.0/24"
+msgstr ""
+
msgid "1st contribution!"
msgstr "最高贡献"
@@ -1367,9 +1383,6 @@ msgstr "éžç§å¯†å²è¯—ä¸èƒ½åˆ†é…ç»™ç§å¯†çš„父å²è¯—。"
msgid "A plain HTML site that uses Netlify for CI/CD instead of GitLab, but still with all the other great GitLab features"
msgstr "一个纯HTML站点,它使用NetLifyæ¥ä»£æ›¿Gitlabçš„CI/CD,但ä»ç„¶å…·æœ‰æ‰€æœ‰å…¶ä»–主è¦çš„Gitlab功能。"
-msgid "A plain-text response to show to clients that hit the rate limit."
-msgstr "å‘达到速率é™åˆ¶çš„客户显示的纯文本å“应。"
-
msgid "A platform value can be web, mob or app."
msgstr "å¹³å°å€¼å¯ä»¥æ˜¯web, mob或app。"
@@ -1428,10 +1441,10 @@ msgid "API?"
msgstr "API?"
msgid "APIFuzzing|$VARIABLE_WITH_PASSWORD"
-msgstr ""
+msgstr "$VARIABLE_WITH_PASSWORD"
msgid "APIFuzzing|$VARIABLE_WITH_USERNAME"
-msgstr ""
+msgstr "$VARIABLE_WITH_USERNAME"
msgid "APIFuzzing|API Fuzzing Configuration"
msgstr "API Fuzzingé…ç½®"
@@ -1451,17 +1464,17 @@ msgstr "无法生æˆä»£ç ç‰‡æ–­ã€‚请ç¨åŽå†è¯•ã€‚"
msgid "APIFuzzing|Configure HTTP basic authentication values. Other authentication methods are supported. %{linkStart}Learn more%{linkEnd}."
msgstr "é…ç½®HTTP基本身份验è¯å€¼ã€‚支æŒå…¶å®ƒèº«ä»½éªŒè¯æ–¹æ³•ã€‚ %{linkStart}了解更多%{linkEnd}。"
-msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
-msgstr "自定义常è§çš„API模糊设置以适åˆæ‚¨çš„è¦æ±‚。有关更多高级é…置选项的详细信æ¯ï¼Œè¯·å‚è§ %{docsLinkStart}GitLab API Fuzzing文档%{docsLinkEnd}。"
+msgid "APIFuzzing|Customize your project's API fuzzing configuration options and copy the code snippet to your .gitlab-ci.yml file to apply any changes. Note that this tool does not reflect or update your .gitlab-ci.yml file automatically. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
+msgstr ""
msgid "APIFuzzing|Enable authentication"
msgstr "å¯ç”¨èº«ä»½éªŒè¯"
msgid "APIFuzzing|Enter the name of the CI variable containing the password. For example, $VARIABLE_WITH_PASSWORD."
-msgstr ""
+msgstr "输入包å«å¯†ç çš„ CI å˜é‡çš„å称。例如: $VARIABLE_WITH_PASSWORD。"
msgid "APIFuzzing|Enter the name of the CI variable containing the username. For example, $VARIABLE_WITH_USERNAME."
-msgstr ""
+msgstr "输入包å«ç”¨æˆ·åçš„ CI å˜é‡å称。例如: $VARIABLE_WITH_USERNAME。"
msgid "APIFuzzing|File path or URL to APIs to be tested. For example, folder/example_fuzz.har. HAR files may contain sensitive information such as authentication tokens, API keys, and session cookies. We recommend that you review the HAR files' contents before adding them to a repository."
msgstr "è¦æµ‹è¯•çš„ API 的文件路径或 URL。例如,folder/example_fuzz.har。 HAR 文件å¯èƒ½åŒ…å«æ•æ„Ÿä¿¡æ¯ï¼Œä¾‹å¦‚身份验è¯ä»¤ç‰Œã€API å¯†é’¥å’Œä¼šè¯ cookie。我们建议您在将 HAR 文件添加到仓库之å‰æŸ¥çœ‹å®ƒä»¬çš„内容。"
@@ -1514,9 +1527,6 @@ msgstr "为了防止安全æ¼æ´žï¼Œèº«ä»½éªŒè¯ä¿¡æ¯å¿…须添加为 %{ciVariabl
msgid "APIFuzzing|To prevent a security leak, authentication info must be added as a %{ciVariablesLinkStart}CI variable%{ciVariablesLinkEnd}. As a user with maintainer access rights, you can manage CI variables in the %{ciSettingsLinkStart}Settings%{ciSettingsLinkEnd} area."
msgstr "为了防止安全æ¼æ´žï¼Œèº«ä»½éªŒè¯ä¿¡æ¯å¿…须添加为 %{ciVariablesLinkStart}CI å˜é‡%{ciVariablesLinkEnd}。 拥有维护者访问æƒé™çš„用户å¯ä»¥åœ¨ %{ciSettingsLinkStart}设置%{ciSettingsLinkEnd} 区域管ç†CI å˜é‡ã€‚"
-msgid "APIFuzzing|Use this tool to generate API fuzzing configuration YAML to copy into your .gitlab-ci.yml file. This tool does not reflect or update your .gitlab-ci.yml file automatically."
-msgstr "使用此工具生æˆAPI模糊é…ç½®YAML,以å¤åˆ¶åˆ°æ‚¨çš„.gitlab-ci.yml文件中。该工具ä¸ä¼šè‡ªåŠ¨å映或更新您的.gitlab-ci.yml文件。"
-
msgid "APIFuzzing|Username for basic authentication"
msgstr "用于基本身份验è¯çš„用户å"
@@ -1568,9 +1578,6 @@ msgstr "滥用报告"
msgid "Abuse reports notification email"
msgstr "报告滥用邮件通知"
-msgid "Abuse reports will be sent to this address if it is set. Abuse reports are always available in the admin area."
-msgstr "如果设置了滥用报告,它将被å‘é€åˆ°è¯¥åœ°å€ã€‚滥用报告始终在管ç†ä¸­å¿ƒå†…å¯ç”¨ã€‚"
-
msgid "Accept invitation"
msgstr "接å—邀请"
@@ -1607,12 +1614,18 @@ msgstr "访问被ç¦æ­¢ã€‚检查您的访问æƒé™ã€‚"
msgid "Access granted"
msgstr "已授予访问"
+msgid "Access key ID"
+msgstr ""
+
msgid "Access requests"
msgstr "访问请求"
msgid "Access to '%{classification_label}' not allowed"
msgstr "ä¸å…许访问%{classification_label}"
+msgid "Access tokens expire after 2 hours. A refresh token may be used at any time to generate a new access token. Non-expiring access tokens are deprecated. Clear this setting to enable backward compatibility."
+msgstr ""
+
msgid "AccessDropdown|Deploy Keys"
msgstr "部署密钥"
@@ -1925,6 +1938,9 @@ msgstr "新建应用"
msgid "Add new directory"
msgstr "添加目录"
+msgid "Add new service account"
+msgstr ""
+
msgid "Add or remove previously merged commits"
msgstr "添加或删除先å‰åˆå¹¶çš„æ交"
@@ -2162,6 +2178,9 @@ msgstr "å¼€å‘人员"
msgid "AdminArea|Features"
msgstr "功能"
+msgid "AdminArea|Get security updates from GitLab and stay up to date"
+msgstr ""
+
msgid "AdminArea|Groups"
msgstr "群组"
@@ -2201,6 +2220,12 @@ msgstr "项目"
msgid "AdminArea|Reporter"
msgstr "报告者"
+msgid "AdminArea|Sign up for the GitLab Security Newsletter to get notified for security updates."
+msgstr ""
+
+msgid "AdminArea|Sign up for the GitLab newsletter"
+msgstr ""
+
msgid "AdminArea|Stop all jobs"
msgstr "åœæ­¢æ‰€æœ‰ä½œä¸š"
@@ -2238,7 +2263,7 @@ msgid "AdminArea|View latest users"
msgstr "查看最新的用户"
msgid "AdminArea|You’re about to stop all jobs. This will halt all current jobs that are running."
-msgstr ""
+msgstr "您å³å°†åœæ­¢æ‰€æœ‰ä½œä¸šï¼Œè¿™ä¼šä¸­æ–­å¹¶ç»“æŸæ‰€æœ‰æ­£åœ¨è¿è¡Œçš„作业。"
msgid "AdminDashboard|Error loading the statistics. Please try again"
msgstr "加载统计数æ®æ—¶å‡ºé”™ã€‚请å†è¯•ä¸€æ¬¡"
@@ -2270,9 +2295,15 @@ msgstr "ç¦ç”¨ä¿¡æ¯æµä»¤ç‰Œ"
msgid "AdminSettings|Disable public access to Pages sites"
msgstr "ç¦æ­¢å…¬å¼€è®¿é—® Pages 站点"
+msgid "AdminSettings|Display a banner on merge requests in projects with no pipelines to initiate steps to add a .gitlab-ci.yml file."
+msgstr ""
+
msgid "AdminSettings|Domain verification is an essential security measure for public GitLab sites. Users are required to demonstrate they control a domain before it is enabled. %{link_start}Learn more.%{link_end}"
msgstr "域å验è¯æ˜¯å…¬å…± GitLab 站点的基本安全措施。用户需è¦è¯æ˜Žä»–们在å¯ç”¨åŸŸå之å‰æ‹¥æœ‰åŸŸå的所有æƒã€‚%{link_start}了解更多。%{link_end}"
+msgid "AdminSettings|Enable pipeline suggestion banner"
+msgstr ""
+
msgid "AdminSettings|Enable shared runners for new projects"
msgstr "为新项目å¯ç”¨å…±äº«Runner"
@@ -2532,7 +2563,7 @@ msgid "AdminUsers|Is using seat"
msgstr "正在使用许å¯å¸­ä½"
msgid "AdminUsers|Issues authored by this user are hidden from other users."
-msgstr ""
+msgstr "由该用户创建的议题对其他用户ä¸å¯è§ã€‚"
msgid "AdminUsers|It's you!"
msgstr "自己ï¼"
@@ -2598,10 +2629,10 @@ msgid "AdminUsers|Sort by"
msgstr "排åºæ–¹å¼"
msgid "AdminUsers|The user can't access git repositories."
-msgstr ""
+msgstr "用户无法访问 git 仓库。"
msgid "AdminUsers|The user can't log in."
-msgstr ""
+msgstr "用户无法登录。"
msgid "AdminUsers|The user will be logged out"
msgstr "此用户将被注销"
@@ -2670,7 +2701,7 @@ msgid "AdminUsers|What does this mean?"
msgstr "这是什么æ„æ€ï¼Ÿ"
msgid "AdminUsers|When banned:"
-msgstr ""
+msgstr "被å°ç¦æ—¶ï¼š"
msgid "AdminUsers|When the user logs back in, their account will reactivate as a fully active account"
msgstr "用户é‡æ–°ç™»å½•åŽï¼Œå…¶å¸æˆ·å°†æ¢å¤ä¸ºå®Œå…¨æœ‰æ•ˆçš„å¸æˆ·"
@@ -2744,11 +2775,11 @@ msgstr "备注"
msgid "Admin|Quarterly reconciliation will occur on %{qrtlyDate}"
msgstr "季度对账将在 %{qrtlyDate}"
-msgid "Admin|The number of max seats used for your namespace is currently exceeding the number of seats in your subscription. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
-msgstr "您的命å空间使用的最大席ä½æ•°é‡ç›®å‰è¶…过您订阅的席ä½æ•°é‡ã€‚ 在 %{qrtlyDate},将处ç†ä¸€ä¸ªå­£åº¦è°ƒèŠ‚,并自动å‘您å‘é€ä¸€ä¸ªæŒ‰æ¯”例计算的支付金é¢è´¦å•ã€‚ 您无需æ“作。如果您在文件上有信用å¡ï¼Œå®ƒå°†è¢«æ”¶å–费用。å¦åˆ™ï¼Œæ‚¨å°†æ”¶åˆ°è´¹ç”¨æ¸…å•ã€‚"
+msgid "Admin|The number of max seats in your namespace exceeds the number of seats in your subscription. On %{qrtlyDate}, quarterly reconciliation occurs and you are automatically billed a prorated amount for the overage. No action is needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice. For more information about the timing of the invoicing process, view the documentation."
+msgstr ""
-msgid "Admin|The number of maximum users for your instance is currently exceeding the number of users in license. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
-msgstr "您的实例的最大用户数é‡ç›®å‰è¶…过了许å¯è¯ä¸­çš„用户数é‡ã€‚ 在 %{qrtlyDate},将处ç†ä¸€ä¸ªå­£åº¦è°ƒèŠ‚,并自动å‘您å‘é€ä¸€ä¸ªæŒ‰æ¯”例计算的支付金é¢è´¦å•ã€‚ 您无需æ“作。如果您在文件上有信用å¡ï¼Œå®ƒå°†è¢«æ”¶å–费用。å¦åˆ™ï¼Œæ‚¨å°†æ”¶åˆ°è´¹ç”¨æ¸…å•ã€‚"
+msgid "Admin|The number of max users in your instance exceeds the number of users in your license. On %{qrtlyDate}, quarterly reconciliation occurs and you are automatically billed a prorated amount for the overage. No action is needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice. For more information about the timing of the invoicing process, view the documentation."
+msgstr ""
msgid "Admin|View pending user approvals"
msgstr "查看等待中的用户批准"
@@ -2768,9 +2799,6 @@ msgstr "高级设置"
msgid "Advanced export options"
msgstr "高级导出选项"
-msgid "Advanced permissions, Large File Storage and Two-Factor authentication settings."
-msgstr "高级æƒé™ï¼Œå¤§æ–‡ä»¶å­˜å‚¨(LFS)å’ŒåŒé‡è®¤è¯è®¾ç½®ã€‚"
-
msgid "After a successful password update you will be redirected to login screen."
msgstr "密ç æ›´æ–°æˆåŠŸåŽï¼Œæ‚¨å°†è¢«é‡å®šå‘到登录页é¢ã€‚"
@@ -2787,14 +2815,16 @@ msgid "After that, you will not be able to use merge approvals or epics as well
msgstr "在那之åŽï¼Œæ‚¨å°†æ— æ³•ä½¿ç”¨åˆå¹¶æ‰¹å‡†æˆ–å²è¯—以åŠä¼—多安全功能。"
msgid "After you've reviewed these contribution guidelines, you'll be all set to"
-msgstr "在您审阅了这些贡献指å—åŽï¼Œæ‚¨å°†è¢«è®¾ç½®ä¸º"
+msgstr "在阅读这些贡献指å—åŽï¼Œæ‚¨å°†å‡†å¤‡å¥½"
+
+msgid "Akismet"
+msgstr ""
msgid "Akismet API Key"
msgstr "Akismet API 密钥"
-msgid "Alert"
-msgid_plural "Alerts"
-msgstr[0] "警报"
+msgid "Akismet helps prevent the creation of spam issues in public projects."
+msgstr ""
msgid "AlertManagement|Acknowledged"
msgstr "已确认"
@@ -3150,6 +3180,9 @@ msgstr "所有%{replicableType}已安排%{action}"
msgid "All (default)"
msgstr "全部(默认)"
+msgid "All GitLab"
+msgstr ""
+
msgid "All Members"
msgstr "所有æˆå‘˜"
@@ -3264,6 +3297,9 @@ msgstr "å…许此密钥推é€åˆ°è¿™ä¸ªä»“库"
msgid "Allow this secondary node to replicate content on Object Storage"
msgstr "å…许此次è¦èŠ‚点在对象存储上å¤åˆ¶å†…容"
+msgid "Allow use of licensed EE features"
+msgstr ""
+
msgid "Allow users to dismiss the broadcast message"
msgstr "å…许用户关闭广播消æ¯"
@@ -3339,14 +3375,11 @@ msgstr "Amazon网络æœåŠ¡æ ‡å¿—"
msgid "Amazon authentication is not %{link_start}correctly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr "Amazon的身份验è¯æœª%{link_start}正确é…ç½®%{link_end}。如需使用这项æœåŠ¡ï¼Œè¯·è”ç³»GitLab管ç†å‘˜ã€‚"
-msgid "Amount of time (in hours) that users are allowed to skip forced configuration of two-factor authentication"
-msgstr "å…许用户跳过强制é…ç½®åŒé‡è®¤è¯çš„时间(以å°æ—¶ä¸ºå•ä½ï¼‰"
-
msgid "An %{link_start}alert%{link_end} with the same fingerprint is already open. To change the status of this alert, resolve the linked alert."
msgstr "具有相åŒæŒ‡çº¹çš„%{link_start}警报%{link_end}已打开。è¦æ›´æ”¹æ­¤è­¦æŠ¥çš„状æ€ï¼Œè¯·å…ˆè§£å†³é“¾æŽ¥ä¸­çš„警报。"
msgid "An Enterprise User GitLab account has been created for you by your organization:"
-msgstr ""
+msgstr "您的组织已ç»ä¸ºæ‚¨åˆ›å»ºäº†ä¼ä¸š GitLab è´¦å·ï¼š"
msgid "An administrator changed the password for your GitLab account on %{link_to}."
msgstr "管ç†å‘˜ä¿®æ”¹äº†æ‚¨åœ¨%{link_to}上的GitLabå¸æˆ·å¯†ç ã€‚"
@@ -3402,12 +3435,6 @@ msgstr "预览 blob 时出错"
msgid "An error occurred when removing the label."
msgstr "删除标签时出错。"
-msgid "An error occurred when toggling the notification subscription"
-msgstr "切æ¢é€šçŸ¥è®¢é˜…æ—¶å‘生错误"
-
-msgid "An error occurred when updating the issue weight"
-msgstr "更新议题æƒé‡æ—¶å‘生错误"
-
msgid "An error occurred when updating the title"
msgstr "更新标题时出现错误"
@@ -3456,6 +3483,9 @@ msgstr "绘制作业关系链接时出错。"
msgid "An error occurred while enabling Service Desk."
msgstr "å¯ç”¨æœåŠ¡å°æ—¶å‘生错误。"
+msgid "An error occurred while fetching Markdown preview"
+msgstr ""
+
msgid "An error occurred while fetching ancestors"
msgstr "获å–上级时å‘生错误"
@@ -3486,9 +3516,6 @@ msgstr "获å–议题时å‘生错误。"
msgid "An error occurred while fetching label colors."
msgstr "获å–标记颜色时出错。"
-msgid "An error occurred while fetching markdown preview"
-msgstr "èŽ·å– markdown 预览时出错"
-
msgid "An error occurred while fetching participants"
msgstr "获å–å‚与者时出现错误"
@@ -3504,9 +3531,6 @@ msgstr "获å–项目自动完æˆæ—¶å‡ºé”™ã€‚"
msgid "An error occurred while fetching reference"
msgstr "获å–å‚考时å‘生错误"
-msgid "An error occurred while fetching sidebar data"
-msgstr "获å–侧边æ æ•°æ®æ—¶å‘生错误"
-
msgid "An error occurred while fetching tags. Retry the search."
msgstr "获å–标签时å‘生错误,请é‡è¯•æœç´¢ã€‚"
@@ -3582,11 +3606,14 @@ msgstr "加载议题时å‘生错误。"
msgid "An error occurred while loading merge requests."
msgstr "加载åˆå¹¶è¯·æ±‚æ—¶å‘生错误。"
-msgid "An error occurred while loading the Needs tab."
+msgid "An error occurred while loading projects."
msgstr ""
+msgid "An error occurred while loading the Needs tab."
+msgstr "加载Needs选项å¡æ—¶å‡ºé”™ã€‚"
+
msgid "An error occurred while loading the Test Reports tab."
-msgstr ""
+msgstr "加载测试报告选项å¡æ—¶å‘生错误。"
msgid "An error occurred while loading the access tokens form, please try again."
msgstr "加载访问令牌表å•æ—¶å‘生错误,请é‡è¯•ã€‚"
@@ -3816,12 +3843,6 @@ msgstr "任何作者"
msgid "Any Milestone"
msgstr "任何里程碑"
-msgid "Any branch"
-msgstr "任何分支"
-
-msgid "Any eligible user"
-msgstr "任何符åˆæ¡ä»¶çš„用户"
-
msgid "Any encrypted tokens"
msgstr "任何加密的令牌"
@@ -3840,6 +3861,9 @@ msgstr "任何里程碑"
msgid "Any namespace"
msgstr "任何命å空间"
+msgid "App Engine description and apps that are suitable for this deployment target"
+msgstr ""
+
msgid "App ID"
msgstr "应用ID"
@@ -3986,6 +4010,10 @@ msgstr "已应用"
msgid "Apply"
msgstr "应用"
+msgid "Apply %d suggestion"
+msgid_plural "Apply %d suggestions"
+msgstr[0] ""
+
msgid "Apply a label"
msgstr "应用标记"
@@ -3995,14 +4023,11 @@ msgstr "应用模æ¿"
msgid "Apply suggestion"
msgstr "应用建议"
-msgid "Apply suggestions"
-msgstr "应用建议"
-
msgid "Apply template"
msgstr "应用模æ¿"
-msgid "Apply this approval rule to any branch or a specific protected branch."
-msgstr "将此批准规则应用于任何分支或指定的ä¿æŠ¤åˆ†æ”¯ã€‚"
+msgid "Apply this approval rule to all branches or a specific protected branch."
+msgstr ""
msgid "Applying"
msgstr "应用中"
@@ -4054,7 +4079,7 @@ msgid_plural "ApprovalRuleSummary|%{count} approvals required from %{membersCoun
msgstr[0] "%{membersCount} éœ€è¦ %{count} 个核准"
msgid "ApprovalRule|%{firstLabel} +%{numberOfAdditionalLabels} more"
-msgstr ""
+msgstr "%{firstLabel} +%{numberOfAdditionalLabels} 更多"
msgid "ApprovalRule|Add approvers"
msgstr "添加核准人"
@@ -4063,13 +4088,13 @@ msgid "ApprovalRule|All scanners"
msgstr "所有扫æ工具"
msgid "ApprovalRule|All severity levels"
-msgstr ""
+msgstr "所有严é‡çº§åˆ«"
msgid "ApprovalRule|Apply this approval rule to consider only the selected security scanners."
msgstr "应用此审批规则åªè€ƒè™‘选定的安全扫æ工具。"
msgid "ApprovalRule|Apply this approval rule to consider only the selected severity levels."
-msgstr ""
+msgstr "应用此审批规则åªè€ƒè™‘选定的严é‡çº§åˆ«ã€‚"
msgid "ApprovalRule|Approval rules"
msgstr "核准规则"
@@ -4099,7 +4124,7 @@ msgid "ApprovalRule|Please select at least one security scanner"
msgstr "请选择至少一个安全扫æ工具"
msgid "ApprovalRule|Please select at least one severity level"
-msgstr ""
+msgstr "请选择至少一个严é‡çº§åˆ«"
msgid "ApprovalRule|Rule name"
msgstr "规则å称"
@@ -4114,10 +4139,10 @@ msgid "ApprovalRule|Select scanners"
msgstr "选择扫æ工具"
msgid "ApprovalRule|Select severity levels"
-msgstr ""
+msgstr "选择严é‡çº§åˆ«"
msgid "ApprovalRule|Severity levels"
-msgstr ""
+msgstr "严é‡çº§åˆ«"
msgid "ApprovalRule|Target branch"
msgstr "目标分支"
@@ -4129,25 +4154,22 @@ msgid "ApprovalSettings|Merge request approval settings have been updated."
msgstr "åˆå¹¶è¯·æ±‚核准设置已更新。"
msgid "ApprovalSettings|Prevent approval by author."
-msgstr ""
+msgstr "ç¦æ­¢ä½œè€…审批。"
msgid "ApprovalSettings|Prevent approvals by users who add commits."
-msgstr ""
+msgstr "ç¦æ­¢æ·»åŠ æ交的用户审批。"
msgid "ApprovalSettings|Prevent editing approval rules in merge requests."
-msgstr ""
+msgstr "ç¦æ­¢åœ¨åˆå¹¶è¯·æ±‚中编辑审批规则。"
msgid "ApprovalSettings|Prevent editing approval rules in projects and merge requests."
-msgstr ""
-
-msgid "ApprovalSettings|Prevent editing approval rules in projects and merge requests. "
-msgstr ""
+msgstr "ç¦æ­¢åœ¨é¡¹ç›®å’Œåˆå¹¶è¯·æ±‚中编辑审批规则。"
msgid "ApprovalSettings|Remove all approvals when commits are added to the source branch."
-msgstr ""
+msgstr "当æ交被添加到æºåˆ†æ”¯æ—¶ï¼Œåˆ é™¤æ‰€æœ‰å®¡æ‰¹ã€‚"
msgid "ApprovalSettings|Require user password to approve."
-msgstr ""
+msgstr "需è¦ç”¨æˆ·å¯†ç æ‰èƒ½å®¡æ‰¹ã€‚"
msgid "ApprovalSettings|There was an error loading merge request approval settings."
msgstr "加载åˆå¹¶è¯·æ±‚批准设置时出错。"
@@ -4158,6 +4180,9 @@ msgstr "æ›´æ–°åˆå¹¶è¯·æ±‚审批设置时出错。"
msgid "ApprovalSettings|This setting is configured at the instance level and can only be changed by an administrator."
msgstr "此设置在实例级别é…置,åªèƒ½ç”±ç®¡ç†å‘˜æ›´æ”¹ã€‚"
+msgid "ApprovalSettings|This setting is configured in %{groupName} and can only be changed by an administrator or group owner."
+msgstr ""
+
msgid "ApprovalStatusTooltip|Adheres to separation of duties"
msgstr "éµå®ˆèŒè´£åˆ†ç¦»"
@@ -4258,7 +4283,7 @@ msgid "Are you sure you want to %{action} %{name}?"
msgstr "æ‚¨ç¡®å®šè¦ %{action} %{name}å—?"
msgid "Are you sure you want to attempt to merge?"
-msgstr ""
+msgstr "您确定è¦å°è¯•åˆå¹¶å—?"
msgid "Are you sure you want to cancel editing this comment?"
msgstr "确定è¦å–消编辑此评论å—?"
@@ -4641,24 +4666,21 @@ msgstr "使用GitHub身份验è¯"
msgid "Authenticated API rate limit period in seconds"
msgstr "以秒为å•ä½çš„èº«ä»½éªŒè¯ API 速率é™åˆ¶æœŸé™"
-msgid "Authenticated API request rate limit"
-msgstr "ç»è¿‡èº«ä»½éªŒè¯çš„API请求速率é™åˆ¶"
-
msgid "Authenticated API requests"
msgstr "ç»è¿‡èº«ä»½éªŒè¯çš„ API 请求"
msgid "Authenticated Git LFS rate limit period in seconds"
-msgstr ""
+msgstr "认è¯çš„ Git LFS 速率é™åˆ¶æ—¶é—´ï¼ˆç§’)"
msgid "Authenticated Git LFS request rate limit"
+msgstr "认è¯çš„ Git LFS 请求速率é™åˆ¶"
+
+msgid "Authenticated Git LFS requests"
msgstr ""
msgid "Authenticated web rate limit period in seconds"
msgstr "认è¯çš„网页速率é™åˆ¶æ—¶é—´ï¼ˆç§’)"
-msgid "Authenticated web request rate limit"
-msgstr "ç»è¿‡èº«ä»½éªŒè¯çš„web请求速率é™åˆ¶"
-
msgid "Authenticated web requests"
msgstr "ç»è¿‡èº«ä»½éªŒè¯çš„ Web 请求"
@@ -4831,7 +4853,7 @@ msgid "Automatic deployment rollbacks"
msgstr "自动部署回滚"
msgid "Automatic event tracking provides a traceable history for audits."
-msgstr ""
+msgstr "自动跟踪事件为审计æ供了一个å¯è¿½è¸ªçš„历å²è®°å½•ã€‚"
msgid "Automatically close associated incident when a recovery alert notification resolves an alert"
msgstr "当æ¢å¤è­¦æŠ¥é€šçŸ¥è§£å†³è­¦æŠ¥æ—¶è‡ªåŠ¨å…³é—­ç›¸å…³äº‹ä»¶"
@@ -5034,9 +5056,6 @@ msgstr "以下是%{link_to_gitlab_pages}的设置。"
msgid "Below you will find all the groups that are public."
msgstr "您将在下é¢æ‰¾åˆ°æ‰€æœ‰å…¬å¼€çš„群组。"
-msgid "Beta"
-msgstr "测试版"
-
msgid "Bi-weekly code coverage"
msgstr "åŒå‘¨ä»£ç è¦†ç›–率"
@@ -5275,6 +5294,21 @@ msgstr "åšå®¢"
msgid "Board scope affects which issues are displayed for anyone who visits this board"
msgstr "看æ¿èŒƒå›´ä¼šå½±å“访问此看æ¿çš„人å¯ä»¥æ˜¾ç¤ºå“ªäº›è®®é¢˜"
+msgid "BoardNewEpic|Groups"
+msgstr ""
+
+msgid "BoardNewEpic|Loading groups"
+msgstr ""
+
+msgid "BoardNewEpic|No matching results"
+msgstr ""
+
+msgid "BoardNewEpic|Search groups"
+msgstr ""
+
+msgid "BoardNewEpic|Select a group"
+msgstr ""
+
msgid "BoardNewIssue|No matching results"
msgstr "没有匹é…结果"
@@ -5321,7 +5355,7 @@ msgid "BoardScope|Select milestone"
msgstr "选择里程碑"
msgid "BoardScope|Select weight"
-msgstr ""
+msgstr "选择æƒé‡"
msgid "BoardScope|Started"
msgstr "已开始"
@@ -5330,7 +5364,7 @@ msgid "BoardScope|Upcoming"
msgstr "å³å°†åˆ°æ¥"
msgid "BoardScope|Weight"
-msgstr ""
+msgstr "æƒé‡"
msgid "Boards"
msgstr "看æ¿"
@@ -5351,6 +5385,9 @@ msgstr "创建列表时å‘生错误。请å†è¯•ä¸€é。"
msgid "Boards|An error occurred while creating the list. Please try again."
msgstr "创建列表时å‘生错误。请å†è¯•ä¸€é。"
+msgid "Boards|An error occurred while fetching child groups. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching group projects. Please try again."
msgstr "获å–群组项目时å‘生错误。请é‡è¯•ã€‚"
@@ -5682,6 +5719,9 @@ msgstr "并å‘批é‡è¯·æ±‚"
msgid "Bulk update"
msgstr "批é‡æ›´æ–°"
+msgid "BulkImports|Re-import creates a new group. It does not sync with the existing group."
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr "现有群组"
@@ -5691,6 +5731,9 @@ msgstr "按æºç¾¤ç»„过滤"
msgid "BulkImport|From source group"
msgstr "从æºç¾¤ç»„"
+msgid "BulkImport|Group import history"
+msgstr ""
+
msgid "BulkImport|Import failed: Destination cannot be a subgroup of the source group. Change the destination and try again."
msgstr "导入失败:目标ä¸èƒ½æ˜¯æºç»„çš„å­ç»„。更改目标,然åŽé‡è¯•ã€‚"
@@ -5698,14 +5741,23 @@ msgid "BulkImport|Import groups from GitLab"
msgstr "从GitLab导入群组"
msgid "BulkImport|Import selected"
-msgstr ""
+msgstr "导入已选择项"
msgid "BulkImport|Importing the group failed"
msgstr "导入群组失败"
+msgid "BulkImport|Last imported to %{link}"
+msgstr ""
+
msgid "BulkImport|Name already exists."
msgstr "å称已存在。"
+msgid "BulkImport|New group"
+msgstr ""
+
+msgid "BulkImport|No history is available"
+msgstr ""
+
msgid "BulkImport|No parent"
msgstr "没有父级"
@@ -5718,6 +5770,9 @@ msgstr "显示 %{start}-%{end} / %{total} - %{link}"
msgid "BulkImport|Showing %{start}-%{end} of %{total} matching filter \"%{filter}\" from %{link}"
msgstr "显示从%{link}中匹é…筛选器“%{filter}†的 %{start}-%{end} / %{total}"
+msgid "BulkImport|Source group"
+msgstr ""
+
msgid "BulkImport|To new group"
msgstr "到新群组"
@@ -5727,6 +5782,9 @@ msgstr "更新具有实时å˜æ›´çš„导入状æ€å¤±è´¥"
msgid "BulkImport|You have no groups to import"
msgstr "您没有è¦å¯¼å…¥çš„群组"
+msgid "BulkImport|Your imported groups will appear here."
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr "需与群组关è”但是当å‰ä¸Žé¡¹ç›®å…³è”"
@@ -5764,7 +5822,7 @@ msgid "Buy CI Minutes"
msgstr "购买CI分钟数"
msgid "Buy Storage"
-msgstr ""
+msgstr "购买存储"
msgid "Buy more Pipeline minutes"
msgstr "购买更多æµæ°´çº¿æ—¶é—´"
@@ -5773,7 +5831,7 @@ msgid "By %{user_name}"
msgstr "ç”± %{user_name}"
msgid "By authenticating with an account tied to an Enterprise e-mail address, it is understood that this account is an Enterprise User. "
-msgstr ""
+msgstr "通过与ä¼ä¸šç”µå­é‚®ä»¶åœ°å€ç»‘定的账å·è¿›è¡Œèº«ä»½éªŒè¯ï¼Œè¯´æ˜Žè¯¥è´¦å·æ˜¯ä¼ä¸šç”¨æˆ·ã€‚ "
msgid "By default, all projects and groups will use the global notifications setting."
msgstr "默认情况下,所有项目和群组将使用全局通知设置。"
@@ -5915,7 +5973,7 @@ msgid "CPU"
msgstr "CPU"
msgid "CSV is being generated and will be emailed to you upon completion."
-msgstr ""
+msgstr "æ­£åœ¨ç”Ÿæˆ CSV,完æˆåŽå°†é€šè¿‡ç”µå­é‚®ä»¶å‘é€ç»™æ‚¨ã€‚"
msgid "CVE|As a maintainer, requesting a CVE for a vulnerability in your project will help your users stay secure and informed."
msgstr "作为维护者,为您的项目中的æ¼æ´žè¯·æ±‚CVE将有助于您的用户ä¿æŒå®‰å…¨å’ŒçŸ¥æƒ…。"
@@ -5968,6 +6026,9 @@ msgstr "%{code_open}.campfirenow.com%{code_close} å­åŸŸå。"
msgid "Can be manually deployed to"
msgstr "å¯ä»¥æ‰‹åŠ¨éƒ¨ç½²åˆ°"
+msgid "Can be overridden in each project."
+msgstr ""
+
msgid "Can create groups:"
msgstr "å¯ä»¥åˆ›å»ºç¾¤ç»„:"
@@ -6038,7 +6099,7 @@ msgid "CanaryIngress|Stable"
msgstr "Stable"
msgid "CanaryIngress|You are changing the ratio of the canary rollout for %{environment} compared to the stable deployment to:"
-msgstr ""
+msgstr "与稳定部署相比,您将 %{environment} 的canary推出比例更改为:"
msgid "Cancel"
msgstr "å–消"
@@ -6070,6 +6131,9 @@ msgstr "å·²å–消"
msgid "Cancelling Preview"
msgstr "å–消预览"
+msgid "Cannot assign a confidential epic to a non-confidential issue. Make the issue confidential and try again"
+msgstr ""
+
msgid "Cannot be assigned to other projects."
msgstr "无法分é…给其他项目。"
@@ -6121,9 +6185,6 @@ msgstr "由于æƒé™ä¸è¶³ï¼Œæ— æ³•å‡çº§è®®é¢˜ã€‚"
msgid "Cannot refer to a group %{timebox_type} by an internal id!"
msgstr "无法通过内部ID引用群组%{timebox_type}ï¼"
-msgid "Cannot set confidential epic for a non-confidential issue"
-msgstr "无法将éžç§å¯†è®®é¢˜çš„加入ç§å¯†å²è¯—。"
-
msgid "Cannot show preview. For previews on sketch files, they must have the file format introduced by Sketch version 43 and above."
msgstr "无法显示预览。如需预览,è‰å›¾æ–‡ä»¶å¿…须具有Sketch 43åŠä»¥ä¸Šç‰ˆæœ¬çš„文件格å¼ã€‚"
@@ -6361,15 +6422,15 @@ msgstr "检查命å空间方案的功能å¯ç”¨æ€§"
msgid "Check out, review, and merge locally"
msgstr "在本地检出ã€å®¡æ ¸å’Œåˆå¹¶"
-msgid "Check the %{docs_link_start}documentation%{docs_link_end}."
-msgstr "查看%{docs_link_start}文档%{docs_link_end}。"
-
msgid "Check the current instance configuration "
msgstr "检查当å‰å®žä¾‹é…ç½® "
msgid "Check the elasticsearch.log file to debug why the migration was halted and make any changes before retrying the migration. When you fix the cause of the failure, click \"Retry migration\", and the migration will be scheduled to be retried in the background."
msgstr "检查elasticsearch.log文件以调试为什么åœæ­¢è¿ç§»ï¼Œåœ¨é‡æ–°å°è¯•è¿ç§»ä¹‹å‰è¿›è¡Œä»»ä½•æ›´æ”¹ã€‚解决故障原因åŽï¼Œè¯·å•å‡»â€œé‡è¯•è¿ç§»â€ï¼ŒåŽå°ä¼šè®¡åˆ’é‡è¯•è¿ç§»ã€‚"
+msgid "Check with your administrator."
+msgstr ""
+
msgid "Check your Docker images for known vulnerabilities."
msgstr "检查您的Dockeré•œåƒæ˜¯å¦å­˜åœ¨å·²çŸ¥æ¼æ´ž."
@@ -6400,15 +6461,18 @@ msgstr "检查用户å是å¦å¯ç”¨..."
msgid "Checkout"
msgstr "支付"
-msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 minutes"
+msgid "Checkout|$%{selectedPlanPrice} per 10 GB storage per pack"
msgstr ""
+msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 minutes"
+msgstr "$%{selectedPlanPrice} æ¯åŒ… 1,000 分钟"
+
msgid "Checkout|$%{selectedPlanPrice} per user per year"
msgstr "æ¯ä¸ªç”¨æˆ·æ¯å¹´%{selectedPlanPrice}美元"
msgid "Checkout|%d CI minute pack"
msgid_plural "Checkout|%d CI minute packs"
-msgstr[0] ""
+msgstr[0] "%d 个 CI 分钟包"
msgid "Checkout|%{cardType} ending in %{lastFourDigits}"
msgstr "以%{lastFourDigits}结尾的%{cardType} "
@@ -6419,21 +6483,27 @@ msgstr "%{name}的 CI 分钟"
msgid "Checkout|%{name}'s GitLab subscription"
msgstr "%{name}的GitLab订阅"
+msgid "Checkout|%{name}'s storage subscription"
+msgstr ""
+
+msgid "Checkout|%{quantity} GB of storage"
+msgstr ""
+
+msgid "Checkout|%{quantity} storage pack"
+msgid_plural "Checkout|%{quantity} storage packs"
+msgstr[0] ""
+
msgid "Checkout|%{selectedPlanText} plan"
msgstr "%{selectedPlanText}计划"
msgid "Checkout|%{startDate} - %{endDate}"
msgstr "%{startDate} - %{endDate}"
-msgid "Checkout|%{totalCiMinutes} CI minute"
-msgid_plural "Checkout|%{totalCiMinutes} CI minutes"
-msgstr[0] ""
-
msgid "Checkout|%{totalCiMinutes} CI minutes"
msgstr "%{totalCiMinutes} CI 分钟"
msgid "Checkout|(may be %{linkStart}charged upon purchase%{linkEnd})"
-msgstr ""
+msgstr "(å¯èƒ½ä¼šåœ¨%{linkStart}购买时收费%{linkEnd})"
msgid "Checkout|(x%{numberOfUsers})"
msgstr "(x%{numberOfUsers})"
@@ -6445,7 +6515,7 @@ msgid "Checkout|Billing address"
msgstr "å¸å•åœ°å€"
msgid "Checkout|CI minute pack"
-msgstr ""
+msgstr "CI 分钟包"
msgid "Checkout|CI minute packs are only used after you've used your subscription's monthly quota. The additional minutes will roll over month to month and are valid for one year."
msgstr "CI 分钟包仅在您使用完订阅的æ¯æœˆé…é¢åŽä½¿ç”¨ã€‚é¢å¤–的分钟数将é€æœˆæ»šåŠ¨ï¼Œæœ‰æ•ˆæœŸä¸ºä¸€å¹´ã€‚"
@@ -6504,6 +6574,9 @@ msgstr "加载付款表å•å¤±è´¥ã€‚请å†è¯•ä¸€æ¬¡ã€‚"
msgid "Checkout|Failed to register credit card. Please try again."
msgstr "注册信用å¡å¤±è´¥ã€‚请å†è¯•ä¸€æ¬¡ã€‚"
+msgid "Checkout|GB"
+msgstr ""
+
msgid "Checkout|GitLab group"
msgstr "GitLab群组"
@@ -6540,6 +6613,9 @@ msgstr "选择"
msgid "Checkout|State"
msgstr "å·ž"
+msgid "Checkout|Storage packs"
+msgstr ""
+
msgid "Checkout|Street address"
msgstr "è¡—é“地å€"
@@ -6561,6 +6637,9 @@ msgstr "总计"
msgid "Checkout|Total minutes: %{quantity}"
msgstr "总分钟数:%{quantity}"
+msgid "Checkout|Total storage: %{quantity} GB"
+msgstr ""
+
msgid "Checkout|Users"
msgstr "用户"
@@ -6570,17 +6649,26 @@ msgstr "您å¯åœ¨æ”¯ä»˜åŽåˆ›å»ºæ–°çš„群组"
msgid "Checkout|Your organization"
msgstr "您的组织"
+msgid "Checkout|Your storage subscription has the same term as your main subscription, and the price is prorated accordingly."
+msgstr ""
+
msgid "Checkout|Your subscription will be applied to this group"
msgstr "您的订阅将应用于该群组"
msgid "Checkout|Zip code"
msgstr "邮政编ç "
+msgid "Checkout|a storage subscription"
+msgstr ""
+
msgid "Checkout|company or team"
msgstr "å…¬å¸æˆ–团队"
-msgid "Checkout|x 1,000 minutes per pack = %{strong}"
-msgstr "æ¯ä¸ªåŒ…x 1000分钟 = %{strong}"
+msgid "Checkout|minutes"
+msgstr ""
+
+msgid "Checkout|x %{quantity} %{units} per pack ="
+msgstr ""
msgid "Cherry-pick this commit"
msgstr "拣选此æ交"
@@ -6936,6 +7024,9 @@ msgstr "由于æƒé™ä¸è¶³ï¼Œæ— æ³•å…‹éš†è®®é¢˜ ï¼"
msgid "CloneIssue|Cannot clone issue to target project as it is pending deletion."
msgstr "无法克隆议题到目标项目,因为它正在等待删除。"
+msgid "CloneIssue|Cannot clone issues of '%{issue_type}' type."
+msgstr ""
+
msgid "Cloned this issue to %{path_to_project}."
msgstr "将此议题克隆到%{path_to_project}。"
@@ -6990,8 +7081,11 @@ msgstr "关闭: %{closed}"
msgid "Closes this %{quick_action_target}."
msgstr "关闭此%{quick_action_target}."
-msgid "Cloud licenses can not be removed."
-msgstr "无法删除云端许å¯è¯ã€‚"
+msgid "Cloud Functions description and apps that are suitable for this deployment target"
+msgstr ""
+
+msgid "Cloud Run description and apps that are suitable for this deployment target"
+msgstr ""
msgid "Cluster"
msgstr "集群"
@@ -7017,6 +7111,12 @@ msgstr "Stages::ClusterEndpointInserter需è¦é›†ç¾¤ç±»åž‹"
msgid "ClusterAgents|Access tokens"
msgstr "访问令牌"
+msgid "ClusterAgents|Agent might not be connected to GitLab"
+msgstr ""
+
+msgid "ClusterAgents|Agent never connected to GitLab"
+msgstr ""
+
msgid "ClusterAgents|Alternative installation methods"
msgstr "其他安装方法"
@@ -7032,6 +7132,12 @@ msgstr "å‘生未知错误。请é‡è¯•ã€‚"
msgid "ClusterAgents|Configuration"
msgstr "é…ç½®"
+msgid "ClusterAgents|Connected"
+msgstr ""
+
+msgid "ClusterAgents|Connection status"
+msgstr ""
+
msgid "ClusterAgents|Copy token"
msgstr "å¤åˆ¶ä»¤ç‰Œ"
@@ -7050,11 +7156,14 @@ msgstr "æè¿°"
msgid "ClusterAgents|For alternative installation methods %{linkStart}go to the documentation%{linkEnd}."
msgstr "关于替代安装方法,%{linkStart}转到文档%{linkEnd}。"
+msgid "ClusterAgents|For more troubleshooting information go to"
+msgstr ""
+
msgid "ClusterAgents|Go to the repository"
msgstr "转到仓库"
msgid "ClusterAgents|Install a new GitLab Agent"
-msgstr ""
+msgstr "安装新的 GitLab 代ç†"
msgid "ClusterAgents|Install new Agent"
msgstr "安装新代ç†"
@@ -7065,18 +7174,30 @@ msgstr "å°†Kubernetes与GitLab Agent集æˆ"
msgid "ClusterAgents|Integrate with the GitLab Agent"
msgstr "与GitLab Agent集æˆ"
-msgid "ClusterAgents|Last used"
-msgstr "上次使用"
+msgid "ClusterAgents|Last connected %{timeAgo}."
+msgstr ""
+
+msgid "ClusterAgents|Last contact"
+msgstr ""
msgid "ClusterAgents|Learn how to create an agent access token"
msgstr "了解如何创建一个 agent 访问令牌"
+msgid "ClusterAgents|Make sure you are using a valid token."
+msgstr ""
+
msgid "ClusterAgents|Name"
msgstr "å称"
msgid "ClusterAgents|Never"
msgstr "从ä¸"
+msgid "ClusterAgents|Never connected"
+msgstr ""
+
+msgid "ClusterAgents|Not connected"
+msgstr ""
+
msgid "ClusterAgents|Read more about getting started"
msgstr "阅读有关入门的更多信æ¯"
@@ -7098,6 +7219,9 @@ msgstr "选择è¦å‘ GitLab 注册并安装在集群上的代ç†ã€‚è¦äº†è§£æœ‰å
msgid "ClusterAgents|Select which Agent you want to install"
msgstr "选择您想è¦å®‰è£…的代ç†"
+msgid "ClusterAgents|The Agent has not been connected in a long time. There might be a connectivity issue. Last contact was %{timeAgo}."
+msgstr ""
+
msgid "ClusterAgents|The GitLab Agent also requires %{linkStart}enabling the Agent Server%{linkEnd}"
msgstr "GitLab Agent也需è¦%{linkStart}å¯ç”¨ä»£ç†æœåŠ¡å™¨%{linkEnd}"
@@ -7125,9 +7249,6 @@ msgstr "未知用户"
msgid "ClusterAgents|You will need to create a token to connect to your agent"
msgstr "您需è¦åˆ›å»ºä¸€ä¸ªä»¤ç‰Œæ‰èƒ½è¿žæŽ¥åˆ°æ‚¨çš„代ç†"
-msgid "ClusterAgent|This feature is only available for premium plans"
-msgstr "此功能仅适用于高级计划"
-
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr "用户æƒé™ä¸è¶³ï¼Œæ— æ³•ä¸ºæ­¤é¡¹ç›®åˆ›å»ºä»¤ç‰Œ"
@@ -7317,9 +7438,6 @@ msgstr "无法加载å­ç½‘"
msgid "ClusterIntegration|Create Kubernetes cluster"
msgstr "创建Kubernetes集群"
-msgid "ClusterIntegration|Create a provision role on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the account and external ID above. %{startMoreInfoLink}More information%{endLink}"
-msgstr "使用上é¢çš„å¸æˆ·å’Œå¤–部ID在%{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink}上创建一个预置角色。详è§%{startMoreInfoLink}更多信æ¯%{endLink}"
-
msgid "ClusterIntegration|Create cluster on"
msgstr "创建集群于"
@@ -7752,7 +7870,7 @@ msgstr "指定域将å…许您使用%{linkStart}Auto DevOps%{linkEnd}中的自动
msgid "ClusterIntegration|Subnets"
msgstr "å­ç½‘"
-msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provisioned role, first create one on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the above account and external IDs. %{startMoreInfoLink}More information%{endLink}"
+msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provisioned role, first create one on %{awsLinkStart}Amazon Web Services %{awsLinkEnd} using the above account and external IDs. %{moreInfoStart}More information%{moreInfoEnd}"
msgstr ""
msgid "ClusterIntegration|The Kubernetes certificate used to authenticate to the cluster."
@@ -7986,6 +8104,9 @@ msgstr "折å é‡Œç¨‹ç¢‘"
msgid "Collapse replies"
msgstr "收起回å¤"
+msgid "Collapse settings section"
+msgstr ""
+
msgid "Collapse sidebar"
msgstr "收起侧边æ "
@@ -8004,6 +8125,9 @@ msgstr "ComboSearch未定义"
msgid "Comma-separated list of email addresses."
msgstr "逗å·åˆ†éš”的电å­é‚®ä»¶åœ°å€åˆ—表。"
+msgid "Comma-separated list of users allowed to exceed the rate limit."
+msgstr ""
+
msgid "Comma-separated, e.g. '1.1.1.1, 2.2.2.0/24'"
msgstr "以逗å·åˆ†éš”,例如 '1.1.1, 2.2.2.0/24'"
@@ -8315,7 +8439,7 @@ msgid "Configuration help"
msgstr "é…置帮助"
msgid "Configure %{italic_start}What's new%{italic_end} drawer and content."
-msgstr ""
+msgstr "é…ç½® %{italic_start}新增功能%{italic_end} 抽屉和内容。"
msgid "Configure %{link} to track events. %{link_start}Learn more.%{link_end}"
msgstr "é…ç½® %{link} æ¥è·Ÿè¸ªäº‹ä»¶ã€‚ %{link_start}了解更多信æ¯ã€‚%{link_end}"
@@ -8323,9 +8447,12 @@ msgstr "é…ç½® %{link} æ¥è·Ÿè¸ªäº‹ä»¶ã€‚ %{link_start}了解更多信æ¯ã€‚%{li
msgid "Configure %{repository_checks_link_start}repository checks%{link_end} and %{housekeeping_link_start}housekeeping%{link_end} on repositories."
msgstr "在仓库上é…ç½® %{repository_checks_link_start}仓库检查%{link_end} å’Œ %{housekeeping_link_start}例行维护%{link_end}。"
-msgid "Configure Dependency Scanning in `.gitlab-ci.yml` using the GitLab managed template. You can [add variable overrides](https://docs.gitlab.com/ee/user/application_security/dependency_scanning/#customizing-the-dependency-scanning-settings) to customize Dependency Scanning settings."
+msgid "Configure CAPTCHAs, IP address limits, and other anti-spam measures."
msgstr ""
+msgid "Configure Dependency Scanning in `.gitlab-ci.yml` using the GitLab managed template. You can [add variable overrides](https://docs.gitlab.com/ee/user/application_security/dependency_scanning/#customizing-the-dependency-scanning-settings) to customize Dependency Scanning settings."
+msgstr "使用 GitLab 托管模æ¿åœ¨ `.gitlab-ci.yml` 中é…ç½®ä¾èµ–扫æ。您å¯ä»¥[添加å˜é‡è¦†ç›–](https://docs.gitlab.com/ee/user/application_security/dependency_scanning/#customizing-the-dependency-scanning-settings) æ¥è‡ªå®šä¹‰ä¾èµ–项扫æ设置。"
+
msgid "Configure Dependency Scanning in `.gitlab-ci.yml`, creating this file if it does not already exist"
msgstr "在`.gitlab-ci.yml`中é…ç½®ä¾èµ–扫æ,如果该文件ä¸å­˜åœ¨åˆ™åˆ›å»ºè¯¥æ–‡ä»¶"
@@ -8342,13 +8469,13 @@ msgid "Configure Prometheus"
msgstr "é…ç½®Promethes"
msgid "Configure SAST in `.gitlab-ci.yml` using the GitLab managed template. You can [add variable overrides](https://docs.gitlab.com/ee/user/application_security/sast/#customizing-the-sast-settings) to customize SAST settings."
-msgstr ""
+msgstr "使用 GitLab 托管模æ¿åœ¨ `.gitlab-ci.yml` 中é…ç½® SAST。您å¯ä»¥[添加å˜é‡é‡å†™](https://docs.gitlab.com/ee/user/application_security/sast/#customizing-the-sast-settings) æ¥è‡ªå®šä¹‰ SAST 设置。"
msgid "Configure SAST in `.gitlab-ci.yml`, creating this file if it does not already exist"
msgstr "在 `.gitlab-ci.yml` 中é…ç½® SAST,如果该文件ä¸å­˜åœ¨åˆ™åˆ›å»ºæ­¤æ–‡ä»¶"
msgid "Configure Secret Detection in `.gitlab-ci.yml` using the GitLab managed template. You can [add variable overrides](https://docs.gitlab.com/ee/user/application_security/secret_detection/#customizing-settings) to customize Secret Detection settings."
-msgstr ""
+msgstr "使用 GitLab 托管模æ¿åœ¨ `.gitlab-ci.yml` 中é…置密钥检测。您å¯ä»¥[添加å˜é‡è¦†ç›–](https://docs.gitlab.com/ee/user/application_security/secret_detection/#customizing-settings) æ¥è‡ªå®šä¹‰å¯†é’¥æ£€æµ‹è®¾ç½®ã€‚"
msgid "Configure Secret Detection in `.gitlab-ci.yml`, creating this file if it does not already exist"
msgstr "在 `.gitlab-ci.yml` 中é…ç½® Secret Detection,如果该文件ä¸å­˜åœ¨åˆ™åˆ›å»ºæ­¤æ–‡ä»¶"
@@ -8359,17 +8486,14 @@ msgstr "é…置跟踪"
msgid "Configure a %{codeStart}.gitlab-webide.yml%{codeEnd} file in the %{codeStart}.gitlab%{codeEnd} directory to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
msgstr "在%{codeStart}.gitlab%{codeEnd}目录中é…ç½®%{codeStart}gitlab-webide.yml%{codeEnd}文件以开始使用Web终端。 %{helpStart}了解更多。%{helpEnd}"
-msgid "Configure existing installation"
-msgstr "é…置现有安装"
-
-msgid "Configure limit for notes created per minute by web and API requests."
-msgstr "é…置由网页和API请求创建的æ¯åˆ†é’Ÿå¤‡æ³¨æ•°é‡é™åˆ¶ã€‚"
+msgid "Configure advanced permissions, Large File Storage, and two-factor authentication settings."
+msgstr ""
-msgid "Configure limits for Project/Group Import/Export."
-msgstr "é…置项目/群组的导入/导出é™åˆ¶ã€‚"
+msgid "Configure approvals by authors and committers on all projects."
+msgstr ""
-msgid "Configure limits for web and API requests."
-msgstr "é…ç½® web å’Œ API 请求é™åˆ¶ã€‚"
+msgid "Configure existing installation"
+msgstr "é…置现有安装"
msgid "Configure paths to be protected by Rack Attack."
msgstr "é…ç½®è¦ä¿æŠ¤æœºæž¶æ”»å‡»çš„路径。"
@@ -8383,10 +8507,13 @@ msgstr "é…置仓库存储。"
msgid "Configure settings for Advanced Search with Elasticsearch."
msgstr "使用 Elasticsearch é…置高级æœç´¢çš„设置。"
-msgid "Configure specific limits for Git LFS requests that supersede the general user and IP rate limits."
+msgid "Configure specific limits for Files API requests that supersede the general user and IP rate limits."
msgstr ""
-msgid "Configure specific limits for Packages API requests that supersede the general user and IP rate limits."
+msgid "Configure specific limits for Git LFS requests that supersede the general user and IP rate limits."
+msgstr "é…ç½®å–代一般用户和 IP 率é™åˆ¶çš„ Git LFS 请求的特定é™åˆ¶ã€‚"
+
+msgid "Configure specific limits for deprecated API requests that supersede the general user and IP rate limits."
msgstr ""
msgid "Configure the %{link} integration."
@@ -8398,6 +8525,9 @@ msgstr "é…置默认的æ¯å‘¨ç¬¬ä¸€å¤©å’Œæ—¶é—´è·Ÿè¸ªå•ä½ã€‚"
msgid "Configure the way a user creates a new account."
msgstr "é…置用户创建新å¸æˆ·çš„æ–¹å¼ã€‚"
+msgid "Configure via Merge Request"
+msgstr ""
+
msgid "Configure which lists are shown for anyone who visits this board"
msgstr "é…置显示给任何访问此看æ¿çš„人的列表"
@@ -8522,7 +8652,7 @@ msgid "Container does not exist"
msgstr "容器ä¸å­˜åœ¨"
msgid "Container must be a project or a group."
-msgstr ""
+msgstr "容器必须是一个项目或一个群组。"
msgid "Container registry images"
msgstr "容器镜åƒåº“é•œåƒ"
@@ -8863,6 +8993,9 @@ msgstr "包å«é•œåƒ(%{size})çš„%{count}个blob"
msgid "Content parsed with %{link}."
msgstr "%{link}解æžçš„内容。"
+msgid "ContentEditor|Table of Contents"
+msgstr ""
+
msgid "ContentEditor|You have to provide a renderMarkdown function or a custom serializer"
msgstr "您必须æä¾›renderMarkdown 函数或自定义åºåˆ—化程åº"
@@ -9049,6 +9182,9 @@ msgstr "å¤åˆ¶é“¾æŽ¥"
msgid "Copy link to chart"
msgstr "å¤åˆ¶å›¾è¡¨çš„链接"
+msgid "Copy prefix"
+msgstr ""
+
msgid "Copy reference"
msgstr "å¤åˆ¶å‚ç…§"
@@ -9079,6 +9215,9 @@ msgstr "å¤åˆ¶è§¦å‘令牌"
msgid "Copy value"
msgstr "å¤åˆ¶å€¼"
+msgid "Corpus Management"
+msgstr ""
+
msgid "Corpus Management|Are you sure you want to delete the corpus?"
msgstr "确定è¦åˆ é™¤è¯­æ–™åº“å—?"
@@ -9104,7 +9243,7 @@ msgid "CorpusManagement|Latest Job:"
msgstr "最新作业:"
msgid "CorpusManagement|New corpus needs to be a upload in *.zip format. Maximum 10GB"
-msgstr ""
+msgstr "新语料库需è¦ä¸Šä¼ *.zip æ ¼å¼ã€‚最大10Gib"
msgid "CorpusManagement|New upload"
msgstr "新上传"
@@ -9307,6 +9446,9 @@ msgstr "创建分支"
msgid "Create commit"
msgstr "创建æ交"
+msgid "Create common files more quickly, and standardize their format."
+msgstr ""
+
msgid "Create confidential merge request"
msgstr "创建ç§å¯†åˆå¹¶è¯·æ±‚"
@@ -9340,6 +9482,9 @@ msgstr "创建事件"
msgid "Create issue"
msgstr "创建议题"
+msgid "Create issue to resolve all threads"
+msgstr ""
+
msgid "Create iteration"
msgstr "创建迭代"
@@ -9394,6 +9539,9 @@ msgstr "新建项目"
msgid "Create new..."
msgstr "创建..."
+msgid "Create or import your first project"
+msgstr ""
+
msgid "Create project"
msgstr "新建项目"
@@ -9751,8 +9899,8 @@ msgstr "自定义指标"
msgid "Custom notification events"
msgstr "自定义通知事件"
-msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notificationLinkStart} notification emails%{notificationLinkEnd}."
-msgstr "自定义通知级别与å‚与级别相åŒã€‚通过自定义通知级别,您也会收到所选事件的通知。è¦æŸ¥æ‰¾æ›´å¤šä¿¡æ¯ï¼Œè¯·æŸ¥çœ‹ %{notificationLinkStart} 通知电å­é‚®ä»¶%{notificationLinkEnd}。"
+msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notificationLinkStart}notification emails%{notificationLinkEnd}."
+msgstr ""
msgid "Custom project templates"
msgstr "自定义项目模æ¿"
@@ -9948,11 +10096,11 @@ msgid "CycleAnalytics|Showing %{subjectFilterText} and %{selectedLabelsCount} la
msgid_plural "CycleAnalytics|Showing %{subjectFilterText} and %{selectedLabelsCount} labels"
msgstr[0] "显示 %{subjectFilterText} 和 %{selectedLabelsCount} 标记"
-msgid "CycleAnalytics|Showing data for group '%{groupName}' and %{selectedProjectCount} projects from %{startDate} to %{endDate}"
-msgstr "显示群组'%{groupName}'å’Œ%{selectedProjectCount}个项目从%{startDate}到%{endDate}çš„æ•°æ®"
+msgid "CycleAnalytics|Showing data for group '%{groupName}' and %{selectedProjectCount} projects from %{createdAfter} to %{createdBefore}"
+msgstr ""
-msgid "CycleAnalytics|Showing data for group '%{groupName}' from %{startDate} to %{endDate}"
-msgstr "显示群组'%{groupName}'%{startDate}到%{endDate}çš„æ•°æ®"
+msgid "CycleAnalytics|Showing data for group '%{groupName}' from %{createdAfter} to %{createdBefore}"
+msgstr ""
msgid "CycleAnalytics|Stages"
msgstr "阶段"
@@ -10185,6 +10333,9 @@ msgstr "ç®¡ç† DAST 扫æ"
msgid "DastProfiles|Manage profiles"
msgstr "管ç†é…ç½®"
+msgid "DastProfiles|Manage site profiles"
+msgstr ""
+
msgid "DastProfiles|Minimum = 0 (no timeout enabled), Maximum = 2880 minutes"
msgstr "æœ€å° = 0 (无超时),最大 = 2880 分钟"
@@ -10260,6 +10411,9 @@ msgstr "扫æ工具é…ç½®"
msgid "DastProfiles|Scanner name"
msgstr "扫æ工具å称"
+msgid "DastProfiles|Schedule"
+msgstr ""
+
msgid "DastProfiles|Select branch"
msgstr "选择分支"
@@ -10329,8 +10483,8 @@ msgstr "验è¯çŠ¶æ€"
msgid "DastProfiles|Website"
msgstr "网站"
-msgid "DastProfiles|You can either choose a passive scan or validate the target site in your chosen site profile. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
-msgstr "您å¯ä»¥é€‰æ‹©è¢«åŠ¨æ‰«æ或验è¯æ‰€é€‰ç«™ç‚¹é…置文件中的目标站点。 %{docsLinkStart}了解有关站点验è¯çš„更多信æ¯ã€‚%{docsLinkEnd}"
+msgid "DastProfiles|You can either choose a passive scan or validate the target site from the site profile management page. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
+msgstr ""
msgid "DastProfiles|You cannot run an active scan against an unvalidated site."
msgstr "ä¸èƒ½å¯¹æœªç»éªŒè¯çš„站点è¿è¡Œä¸»åŠ¨æ‰«æ。"
@@ -10339,7 +10493,7 @@ msgid "DastSiteValidation|Copy HTTP header to clipboard"
msgstr "å¤åˆ¶HTTP报头到剪贴æ¿"
msgid "DastSiteValidation|Copy Meta tag to clipboard"
-msgstr ""
+msgstr "å¤åˆ¶ Meta 标签到剪贴æ¿"
msgid "DastSiteValidation|Could not create validation token. Please try again."
msgstr "无法创建验è¯ä»¤ç‰Œã€‚请é‡è¯•ã€‚"
@@ -10354,7 +10508,7 @@ msgid "DastSiteValidation|Header validation"
msgstr "报头验è¯"
msgid "DastSiteValidation|Meta tag validation"
-msgstr ""
+msgstr "Meta 标签验è¯"
msgid "DastSiteValidation|Retry validation"
msgstr "é‡è¯•éªŒè¯"
@@ -10369,7 +10523,7 @@ msgid "DastSiteValidation|Step 2 - Add following HTTP header to your site"
msgstr "步骤2 - 将以下HTTP标头添加到您的网站"
msgid "DastSiteValidation|Step 2 - Add following meta tag to your site"
-msgstr ""
+msgstr "步骤 2 - 添加以下 Meta 标签到您的网站"
msgid "DastSiteValidation|Step 2 - Add following text to the target site"
msgstr "步骤 2 - 将以下文本添加到目标站点"
@@ -10378,7 +10532,7 @@ msgid "DastSiteValidation|Step 3 - Confirm header location and validate"
msgstr "步骤 3 - 确认报头ä½ç½®å¹¶éªŒè¯"
msgid "DastSiteValidation|Step 3 - Confirm meta tag location and validate"
-msgstr ""
+msgstr "步骤 3 - 确认 Meta 标签ä½ç½®å¹¶éªŒè¯"
msgid "DastSiteValidation|Step 3 - Confirm text file location and validate"
msgstr "步骤 3 - 确认文本文件ä½ç½®å¹¶éªŒè¯"
@@ -10397,7 +10551,7 @@ msgid_plural "DastSiteValidation|This will affect %d other profiles targeting th
msgstr[0] "è¿™å°†å½±å“ %d 个针对åŒä¸€ URL 的其他é…置文件。"
msgid "DastSiteValidation|To run an active scan, validate your target site. All site profiles that share the same base URL share the same validation status."
-msgstr ""
+msgstr "è¦è¿è¡Œä¸€ä¸ªæ´»åŠ¨æ‰«æ,请验è¯æ‚¨çš„目标站点。共享相åŒåŸºç¡€URL的所有站点é…置都共享相åŒçš„验è¯çŠ¶æ€ã€‚"
msgid "DastSiteValidation|Validate"
msgstr "验è¯"
@@ -10501,8 +10655,8 @@ msgstr "天"
msgid "Days to merge"
msgstr "åˆå¹¶æ‰€éœ€å¤©æ•°"
-msgid "Deactivate dormant users after 90 days of inactivity. Users can return to active status by signing in to their account. While inactive, a user is not counted as an active user in the instance."
-msgstr "闲置 90 天åŽåœç”¨ä¼‘眠用户。用户å¯ä»¥é€šè¿‡ç™»å½•å…¶è´¦å·æ¥æ¢å¤æ¿€æ´»ã€‚处于未激活状æ€æ—¶ï¼Œç”¨æˆ·ä¸è®¡ä¸ºå®žä¾‹ä¸­çš„激活用户。"
+msgid "Deactivate dormant users after 90 days of inactivity"
+msgstr ""
msgid "Dear Administrator,"
msgstr "亲爱的管ç†å‘˜ï¼Œ"
@@ -10588,11 +10742,11 @@ msgstr "使用%{cronSyntaxStart}cron语法%{cronSyntaxEnd}定义自定义部署å
msgid "Define a custom pattern with cron syntax"
msgstr "使用 Cron 语法定义自定义模å¼"
-msgid "Define approval settings."
-msgstr "定义核准设置。"
+msgid "Define approval rules."
+msgstr ""
-msgid "Define approval settings. %{linkStart}Learn more.%{linkEnd}"
-msgstr "定义审批设置。 %{linkStart}了解更多。%{linkEnd}"
+msgid "Define approval rules. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
msgid "Define custom rules for what constitutes spam, independent of Akismet"
msgstr "定义独立于Akismet的垃圾邮件自定义规则"
@@ -10600,7 +10754,7 @@ msgstr "定义独立于Akismet的垃圾邮件自定义规则"
msgid "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 "Define how approval rules are applied as a merge request moves toward completion."
+msgid "Define how approval rules are applied to merge requests."
msgstr ""
msgid "Definition"
@@ -10615,6 +10769,12 @@ msgstr "确定è¦ç«‹å³è¿è¡Œ%{jobName}å—?å¦åˆ™è¯¥ä½œä¸šå°†åœ¨è®¡æ—¶å™¨ç»“æ
msgid "DelayedJobs|Are you sure you want to run %{job_name} immediately? This job will run automatically after it's timer finishes."
msgstr "您确定è¦ç«‹å³è¿è¡Œ %{job_name} å—?该作业将在计时结æŸåŽè‡ªåŠ¨è¿è¡Œã€‚"
+msgid "DelayedJobs|Are you sure you want to run %{job_name} immediately? This job will run automatically after its timer finishes."
+msgstr ""
+
+msgid "DelayedJobs|Run the delayed job now?"
+msgstr ""
+
msgid "DelayedJobs|Start now"
msgstr "ç«‹å³å¼€å§‹"
@@ -10652,13 +10812,13 @@ msgid "Delete badge"
msgstr "删除徽章"
msgid "Delete column"
-msgstr ""
+msgstr "删除列"
msgid "Delete comment"
msgstr "删除评论"
msgid "Delete corpus"
-msgstr ""
+msgstr "删除语料库"
msgid "Delete domain"
msgstr "删除域"
@@ -10685,7 +10845,7 @@ msgid "Delete project. Are you ABSOLUTELY SURE?"
msgstr "删除项目。您ç»å¯¹ç¡®å®šå—?"
msgid "Delete row"
-msgstr ""
+msgstr "删除行"
msgid "Delete self monitoring project"
msgstr "删除自监控项目"
@@ -10706,7 +10866,7 @@ msgid "Delete subscription"
msgstr "删除订阅"
msgid "Delete table"
-msgstr ""
+msgstr "删除表"
msgid "Delete this attachment"
msgstr "删除此附件"
@@ -10886,6 +11046,12 @@ msgid "Dependency proxy feature is limited to public groups for now."
msgstr "ä¾èµ–项代ç†åŠŸèƒ½ç›®å‰ä»…é™äºŽå…¬å¼€ç¾¤ç»„。"
msgid "Dependency proxy image prefix"
+msgstr "ä¾èµ–代ç†é•œåƒå‰ç¼€"
+
+msgid "DependencyProxy|Create a local proxy for storing frequently used upstream images. %{docLinkStart}Learn more%{docLinkEnd} about dependency proxies."
+msgstr ""
+
+msgid "DependencyProxy|Dependency Proxy"
msgstr ""
msgid "DependencyProxy|Toggle Dependency Proxy"
@@ -10931,16 +11097,16 @@ msgid "DeployFreeze|Add deploy freeze"
msgstr "添加部署冻结"
msgid "DeployFreeze|Delete"
-msgstr ""
+msgstr "删除"
msgid "DeployFreeze|Delete deploy freeze?"
-msgstr ""
+msgstr "删除部署冻结?"
msgid "DeployFreeze|Delete freeze period"
-msgstr ""
+msgstr "删除冻结期"
msgid "DeployFreeze|Deploy freeze from %{start} to %{end} in %{timezone} will be removed. Are you sure?"
-msgstr ""
+msgstr "在 %{timezone} 的从 %{start} 到 %{end} 的部署冻结将被删除。您确定å—?"
msgid "DeployFreeze|Edit"
msgstr "编辑"
@@ -11125,6 +11291,9 @@ msgstr "部署频率"
msgid "Deployments"
msgstr "部署"
+msgid "Deployments to Google Kubernetes Engine can be "
+msgstr ""
+
msgid "Deployments|%{deployments} environment impacted."
msgid_plural "Deployments|%{deployments} environments impacted."
msgstr[0] "%{deployments} 环境å—到影å“。"
@@ -11153,6 +11322,9 @@ msgstr "已跳过"
msgid "Deployment|success"
msgstr "æˆåŠŸ"
+msgid "Deprecated API rate limits"
+msgstr ""
+
msgid "Deprioritize label"
msgstr "å–消优先标记"
@@ -11370,10 +11542,10 @@ msgid "DevopsAdoption|Adopted"
msgstr "已采用"
msgid "DevopsAdoption|Adoption by group"
-msgstr ""
+msgstr "按群组采用"
msgid "DevopsAdoption|Adoption by subgroup"
-msgstr ""
+msgstr "按å­ç»„采用"
msgid "DevopsAdoption|An error occurred while removing the group. Please try again."
msgstr "删除群组时出错,请é‡è¯•ã€‚"
@@ -11436,7 +11608,7 @@ msgid "DevopsAdoption|Edit subgroups"
msgstr "编辑å­ç»„"
msgid "DevopsAdoption|Feature adoption is based on usage in the previous calendar month. Data is updated at the beginning of each month. Last updated: %{timestamp}."
-msgstr ""
+msgstr "功能采用基于上一个日历月的使用情况,数æ®åœ¨æ¯ä¸ªæœˆåˆæ›´æ–°ï¼Œæœ€åŽæ›´æ–°ï¼š %{timestamp}。"
msgid "DevopsAdoption|Fuzz Testing"
msgstr "模糊测试"
@@ -11511,7 +11683,7 @@ msgid "DevopsReport|High"
msgstr "高"
msgid "DevopsReport|Leader usage"
-msgstr ""
+msgstr "领导者使用情况"
msgid "DevopsReport|Low"
msgstr "低"
@@ -11555,6 +11727,14 @@ msgstr "(HEAD)"
msgid "DiffsCompareBaseBranch|(base)"
msgstr "(æº)"
+msgid "Diffs|%d addition"
+msgid_plural "Diffs|%d additions"
+msgstr[0] ""
+
+msgid "Diffs|%d deletion"
+msgid_plural "Diffs|%d deletions"
+msgstr[0] ""
+
msgid "Diffs|No file name available"
msgstr "æ— å¯ç”¨çš„文件å"
@@ -11564,9 +11744,16 @@ msgstr "显示%{unfoldCount}行"
msgid "Diffs|Show all unchanged lines"
msgstr "显示所有未改å˜çš„è¡Œ"
+msgid "Diffs|Showing %{dropdownStart}%{count} changed file%{dropdownEnd}"
+msgid_plural "Diffs|Showing %{dropdownStart}%{count} changed files%{dropdownEnd}"
+msgstr[0] ""
+
msgid "Diffs|Something went wrong while fetching diff lines."
msgstr "获å–差异线时å‘生错误。"
+msgid "Diffs|with %{additions} and %{deletions}"
+msgstr ""
+
msgid "Direct member"
msgstr "直接æˆå‘˜"
@@ -11691,9 +11878,6 @@ msgid "Dismiss %d selected vulnerability as"
msgid_plural "Dismiss %d selected vulnerabilities as"
msgstr[0] "忽略%d个选定的æ¼æ´žï¼Œå°†å®ƒä»¬å½’类为"
-msgid "Dismiss Value Stream Analytics introduction box"
-msgstr "ä¸å†æ˜¾ç¤ºä»·å€¼æµåˆ†æžä»‹ç»æ¡†"
-
msgid "Dismiss merge request promotion"
msgstr "关闭åˆå¹¶è¯·æ±‚推è"
@@ -11944,7 +12128,7 @@ msgid "Edit Group Hook"
msgstr "编辑群组钩å­"
msgid "Edit Identity"
-msgstr ""
+msgstr "编辑身份"
msgid "Edit Label"
msgstr "编辑标签"
@@ -12015,6 +12199,9 @@ msgstr "内è”编辑"
msgid "Edit issues"
msgstr "编辑议题"
+msgid "Edit merge requests"
+msgstr ""
+
msgid "Edit public deploy key"
msgstr "编辑公共部署密钥"
@@ -12022,7 +12209,7 @@ msgid "Edit sidebar"
msgstr "编辑侧边æ "
msgid "Edit table"
-msgstr ""
+msgstr "编辑表"
msgid "Edit this file only."
msgstr "仅编辑此文件。"
@@ -12090,6 +12277,9 @@ msgstr "无。请选择è¦å»ºç«‹ç´¢å¼•çš„命å空间。"
msgid "Elastic|None. Select projects to index."
msgstr "无。请选择è¦å»ºç«‹ç´¢å¼•çš„项目。"
+msgid "Eligible users"
+msgstr ""
+
msgid "Email"
msgstr "电å­é‚®ä»¶"
@@ -12199,7 +12389,7 @@ msgid "EmailsOnPushService|Send from committer"
msgstr "å‘é€è‡ªæ交者"
msgid "EmailsOnPushService|Send notifications from the committer's email address if the domain matches the domain used by your GitLab instance (such as %{domains})."
-msgstr ""
+msgstr "如果这个域å是 GitLab 域å的一部分(例如%{domains}),则从æ交者电å­é‚®ä»¶åœ°å€å‘é€é€šçŸ¥ 。"
msgid "EmailsOnPushService|can't exceed %{recipients_limit}"
msgstr "ä¸èƒ½è¶…过 %{recipients_limit}"
@@ -12211,7 +12401,7 @@ msgid "Embed"
msgstr "嵌入"
msgid "Embed an image of your existing Jaeger server in GitLab."
-msgstr ""
+msgstr "在 GitLab 中嵌入现有 Jaeger æœåŠ¡å™¨çš„图åƒã€‚"
msgid "Empty file"
msgstr "空文件"
@@ -12219,6 +12409,9 @@ msgstr "空文件"
msgid "Enable"
msgstr "å¯ç”¨"
+msgid "Enable Amazon EKS integration"
+msgstr ""
+
msgid "Enable Auto DevOps"
msgstr "å¯ç”¨Auto DevOps"
@@ -12252,6 +12445,9 @@ msgstr "å¯ç”¨æ³¨å†ŒåŠŸèƒ½"
msgid "Enable SSL verification"
msgstr "å¯ç”¨ SSL 验è¯"
+msgid "Enable Service Ping"
+msgstr ""
+
msgid "Enable Snowplow tracking"
msgstr "å¯ç”¨Snowplow跟踪"
@@ -12280,6 +12476,9 @@ msgid "Enable authenticated API request rate limit"
msgstr "å¯ç”¨å·²èº«ä»½éªŒè¯çš„ API 请求速率é™åˆ¶"
msgid "Enable authenticated Git LFS request rate limit"
+msgstr "å¯ç”¨è®¤è¯çš„ Git LFS 请求速率é™åˆ¶"
+
+msgid "Enable authenticated web request rate limit"
msgstr ""
msgid "Enable authentication"
@@ -12322,7 +12521,7 @@ msgid "Enable in-product marketing emails"
msgstr "接收产å“è¥é”€ç”µå­é‚®ä»¶"
msgid "Enable incident management inbound alert limit"
-msgstr ""
+msgstr "å¯ç”¨äº‹ä»¶ç®¡ç†ä¼ å…¥è­¦å‘Šé™åˆ¶"
msgid "Enable integration"
msgstr "å¯ç”¨é›†æˆ"
@@ -12342,8 +12541,8 @@ msgstr "å¯ç”¨ multipart 邮件"
msgid "Enable or disable the Pseudonymizer data collection."
msgstr "å¯ç”¨æˆ–ç¦ç”¨åŒ¿å化数æ®æ”¶é›†."
-msgid "Enable or disable version check and service ping."
-msgstr "å¯ç”¨æˆ–ç¦ç”¨ç‰ˆæœ¬æ£€æŸ¥å’ŒæœåŠ¡ ping。"
+msgid "Enable or disable version check and Service Ping."
+msgstr ""
msgid "Enable protected paths rate limit"
msgstr "å¯ç”¨ä¿æŠ¤è·¯å¾„速率é™åˆ¶"
@@ -12354,18 +12553,12 @@ msgstr "å¯ç”¨ä»£ç†"
msgid "Enable reCAPTCHA"
msgstr "å¯ç”¨ reCAPTCHA"
-msgid "Enable reCAPTCHA for login"
-msgstr "å¯ç”¨ reCAPTCHA 进行登录"
-
-msgid "Enable reCAPTCHA, Invisible Captcha, Akismet and set IP limits. For reCAPTCHA, we currently only support %{recaptcha_v2_link_start}v2%{recaptcha_v2_link_end}"
-msgstr "å¯ç”¨ reCAPTCHAã€Invisible Captchaã€Akismet 并设置 IP é™åˆ¶ã€‚对于 reCAPTCHA,我们目å‰ä»…æ”¯æŒ %{recaptcha_v2_link_start}v2%{recaptcha_v2_link_end}"
+msgid "Enable reCAPTCHA for login."
+msgstr ""
msgid "Enable repository checks"
msgstr "å¯ç”¨ä»“库检查"
-msgid "Enable service ping"
-msgstr "å¯ç”¨æœåŠ¡ Ping"
-
msgid "Enable shared runners for all projects and subgroups in this group."
msgstr "为该组中的所有项目和å­ç»„å¯ç”¨å…±äº«Runner。"
@@ -12387,8 +12580,11 @@ msgstr "å¯ç”¨åŒé‡è®¤è¯"
msgid "Enable unauthenticated API request rate limit"
msgstr "å¯ç”¨æœªç»èº«ä»½éªŒè¯çš„ API 请求速率é™åˆ¶"
-msgid "Enable unauthenticated request rate limit"
-msgstr "å¯ç”¨æœªç»éªŒè¯çš„请求速率é™åˆ¶"
+msgid "Enable unauthenticated web request rate limit"
+msgstr ""
+
+msgid "Enable user deactivation emails"
+msgstr ""
msgid "Enable version check"
msgstr "å¯ç”¨ç‰ˆæœ¬æ£€æŸ¥"
@@ -12423,9 +12619,6 @@ msgstr "å¯ç”¨ OAuth 身份验è¯æº"
msgid "Enabled sources for code import during project creation. OmniAuth must be configured for GitHub"
msgstr "è¦åœ¨é¡¹ç›®åˆ›å»ºæœŸé—´å¯ç”¨ä»£ç å¯¼å…¥æºã€‚必须为 GitHub é…ç½® OmniAuth"
-msgid "Enabling this will only make licensed EE features available to projects if the project namespace's plan includes the feature or if the project is public."
-msgstr "此功能仅在 GitLab EE 许å¯ä¸‹å¯ç”¨ã€‚如果è¦å¯ç”¨ï¼Œè¯·ç¡®è®¤å‘½å空间包å«æ­¤åŠŸèƒ½æˆ–者是公开项目。"
-
msgid "Encountered an error while rendering: %{err}"
msgstr "渲染时出现错误: %{err}"
@@ -12474,9 +12667,6 @@ msgstr "输入管ç†å‘˜æ¨¡å¼çš„åŒé‡éªŒè¯ç "
msgid "Enter Admin Mode"
msgstr "进入管ç†å‘˜æ¨¡å¼"
-msgid "Enter IP address range"
-msgstr "输入IP地å€èŒƒå›´"
-
msgid "Enter a number"
msgstr "输入数字"
@@ -12489,9 +12679,6 @@ msgstr "输入一个介于0到100之间的整数"
msgid "Enter at least three characters to search"
msgstr "请至少输入三个字符æ‰å¯æœç´¢"
-msgid "Enter domain"
-msgstr "输入域å"
-
msgid "Enter in your Bitbucket Server URL and personal access token below"
msgstr "输入您的BitbucketæœåŠ¡å™¨URL和个人访问令牌"
@@ -12678,9 +12865,6 @@ msgstr "部署"
msgid "Environments|Deployment %{status}"
msgstr "部署%{status}"
-msgid "Environments|Dismiss"
-msgstr ""
-
msgid "Environments|Enable review app"
msgstr "å¯ç”¨å®¡æ ¸åº”用"
@@ -12693,9 +12877,6 @@ msgstr "环境"
msgid "Environments|Environments are places where code gets deployed, such as staging or production."
msgstr "环境是指部署代ç çš„ä½ç½®ï¼Œä¾‹å¦‚预å‘布或生产。"
-msgid "Environments|Help us improve environments"
-msgstr ""
-
msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
msgstr "在群集上安装Elastic Stack,以å¯ç”¨é«˜çº§æŸ¥è¯¢åŠŸèƒ½ï¼Œä¾‹å¦‚全文æœç´¢ã€‚"
@@ -12732,6 +12913,9 @@ msgstr "没有å¯æ˜¾ç¤ºçš„pod"
msgid "Environments|Note that this action will stop the environment, but it will %{emphasisStart}not%{emphasisEnd} have an effect on any existing deployment due to no “stop environment action†being defined in the %{ciConfigLinkStart}.gitlab-ci.yml%{ciConfigLinkEnd} file."
msgstr "注æ„:继续æ“作将终止当å‰çŽ¯å¢ƒï¼ç”±äºŽæœªåœ¨%{ciConfigLinkStart}.gitlab-ci.yml%{ciConfigLinkEnd}文件中定义“终止环境æ“作â€ï¼Œå› æ­¤%{emphasisStart}ä¸ä¼š%{emphasisEnd}å½±å“å·²ç»å­˜åœ¨çš„部署。"
+msgid "Environments|Open"
+msgstr ""
+
msgid "Environments|Open live environment"
msgstr "打开è¿è¡Œä¸­çš„环境"
@@ -12771,9 +12955,6 @@ msgstr "终止环境"
msgid "Environments|Stopping %{environmentName}"
msgstr "终止%{environmentName}"
-msgid "Environments|Take the survey"
-msgstr ""
-
msgid "Environments|There was an error fetching the logs. Please try again."
msgstr "获å–日志时出错。请é‡è¯•ã€‚"
@@ -12795,11 +12976,8 @@ msgstr "更新于"
msgid "Environments|You don't have any environments right now"
msgstr "当å‰æœªè®¾ç½®çŽ¯å¢ƒ"
-msgid "Environments|Your feedback helps GitLab make environments better for you and other users. Participate and enter a sweepstake to win a USD 30 gift card."
-msgstr ""
-
msgid "Environments|by %{avatar}"
-msgstr ""
+msgstr "ç”± %{avatar} æä¾›"
msgid "Environments|protected"
msgstr "å—ä¿æŠ¤çš„"
@@ -13080,8 +13258,8 @@ msgstr "å‘生了错误。用户未解除é”定"
msgid "Error parsing CSV file. Please make sure it has"
msgstr "解æžCSV文件时出错。请确认它是å¦åŒ…å«"
-msgid "Error rendering markdown preview"
-msgstr "渲染Markdown预览时出错"
+msgid "Error rendering Markdown preview"
+msgstr ""
msgid "Error saving label update."
msgstr "ä¿å­˜æ ‡è®°æ›´æ–°æ—¶å‡ºé”™ã€‚"
@@ -13128,6 +13306,9 @@ msgstr "Akismet 错误。请检查日志以获å–更多信æ¯ã€‚"
msgid "Error: %{error_message}"
msgstr "错误: %{error_message}"
+msgid "Error: Couldn't load some or all of the changes."
+msgstr ""
+
msgid "Error: No AWS credentials were supplied"
msgstr "错误:未æ供任何AWS凭æ®"
@@ -13138,7 +13319,7 @@ msgid "Error: Unable to create deploy freeze"
msgstr "错误:无法创建部署冻结。"
msgid "Error: Unable to delete deploy freeze"
-msgstr ""
+msgstr "错误:无法删除部署冻结"
msgid "Error: Unable to find AWS role for current user"
msgstr "错误:找ä¸åˆ°å½“å‰ç”¨æˆ·çš„AWS角色"
@@ -13161,6 +13342,9 @@ msgstr "连接失败,请å†æ¬¡æ£€æŸ¥éªŒè¯ä»¤ç‰Œï¼Œå¹¶é‡è¯•ã€‚"
msgid "ErrorTracking|Enable error tracking"
msgstr "å¯ç”¨é”™è¯¯è·Ÿè¸ª"
+msgid "ErrorTracking|Error tracking backend"
+msgstr ""
+
msgid "ErrorTracking|If you self-host Sentry, enter your Sentry instance's full URL. If you use Sentry's hosted solution, enter https://sentry.io"
msgstr "如果您自托管 Sentry,请输入您的 Sentry 实例的完整 URL。如果您使用 Sentry 的托管解决方案,请输入 https://sentry.io"
@@ -13194,6 +13378,12 @@ msgstr "å‡çº§ç­–ç•¥ä¸èƒ½è¶…过 %{rule_count} 个规则"
msgid "Escalation policies must have at least one rule"
msgstr "å‡çº§ç­–略必须至少有一个规则"
+msgid "EscalationPolicies|%{clockIcon} IF alert is not %{alertStatus} in %{minutes}"
+msgstr ""
+
+msgid "EscalationPolicies|%{notificationIcon} THEN %{doAction} %{forScheduleOrUser}"
+msgstr ""
+
msgid "EscalationPolicies|+ Add an additional rule"
msgstr "+ 添加附加规则"
@@ -13236,15 +13426,15 @@ msgstr "电å­é‚®ä»¶ç”¨æˆ·"
msgid "EscalationPolicies|Escalation policies"
msgstr "å‡çº§ç­–ç•¥"
+msgid "EscalationPolicies|Escalation policy %{obstacle} in Project %{project}"
+msgstr ""
+
msgid "EscalationPolicies|Escalation rules"
msgstr "å‡çº§è§„则"
msgid "EscalationPolicies|Failed to load oncall-schedules"
msgstr "加载 on-call 计划失败"
-msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} %{then} THEN %{doAction} %{scheduleOrUser}"
-msgstr "如果警报在%{minutes}中ä¸æ˜¯%{alertStatus},%{then} 那么 %{doAction} %{scheduleOrUser}"
-
msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} minutes"
msgstr "如果警报在%{minutes}分钟内ä¸æ˜¯%{alertStatus}"
@@ -13264,7 +13454,7 @@ msgid "EscalationPolicies|Select schedule"
msgstr "选择计划"
msgid "EscalationPolicies|Set up escalation policies to define who is paged, and when, in the event the first users paged don't respond."
-msgstr ""
+msgstr "设置å‡çº§ç­–略以定义在第一个被呼å«çš„用户ä¸å›žåº”的事件中,è°åº”被呼å«ä»¥åŠä½•æ—¶å‘¼å«ã€‚"
msgid "EscalationPolicies|THEN %{doAction} %{scheduleOrUser}"
msgstr "然åŽ%{doAction}%{scheduleOrUser}"
@@ -13320,18 +13510,36 @@ msgstr "事件"
msgid "Every %{action} attempt has failed: %{job_error_message}. Please try again."
msgstr "所有 %{action} å°è¯•éƒ½å·²å¤±è´¥ï¼š %{job_error_message}。请å†è¯•ä¸€æ¬¡ã€‚"
+msgid "Every 3 months"
+msgstr ""
+
+msgid "Every 3 months on the %{day} at %{time} %{timezone}"
+msgstr ""
+
+msgid "Every 6 months"
+msgstr ""
+
+msgid "Every 6 months on the %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Every day"
msgstr "æ¯å¤©"
msgid "Every day (at %{time})"
msgstr "æ¯å¤©(%{time})"
+msgid "Every day at %{time} %{timezone}"
+msgstr ""
+
msgid "Every month"
msgstr "æ¯æœˆ"
msgid "Every month (Day %{day} at %{time})"
msgstr "æ¯æœˆ(%{day}日的%{time})"
+msgid "Every month on the %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Every three months"
msgstr "æ¯ä¸‰ä¸ªæœˆ"
@@ -13345,6 +13553,15 @@ msgstr[0] "æ¯%d周"
msgid "Every week (%{weekday} at %{time})"
msgstr "æ¯å‘¨(%{weekday}çš„%{time})"
+msgid "Every week on %{day} at %{time} %{timezone}"
+msgstr ""
+
+msgid "Every year"
+msgstr ""
+
+msgid "Every year on %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Everyone"
msgstr "所有人"
@@ -13381,9 +13598,6 @@ msgstr "凭è¯é›†"
msgid "Exactly one of %{attributes} is required"
msgstr "其中的一个%{attributes}是必需的"
-msgid "Example: %{ip_address}. %{read_more_link}."
-msgstr "示例: %{ip_address}. %{read_more_link}."
-
msgid "Example: @sub\\.company\\.com$"
msgstr "示例: @sub\\.company\\.com$"
@@ -13450,15 +13664,15 @@ msgstr "展开é¢æ¿"
msgid "Expand pipeline"
msgstr "展开æµæ°´çº¿"
+msgid "Expand settings section"
+msgstr ""
+
msgid "Expand sidebar"
msgstr "展开侧边æ "
msgid "Expected documents: %{expected_documents}"
msgstr "需è¦çš„文档: %{expected_documents}"
-msgid "Experienced"
-msgstr "有ç»éªŒçš„"
-
msgid "ExperimentSubject|Must have exactly one of User, Namespace, or Project."
msgstr "必须有一个用户ã€å‘½å空间或项目。"
@@ -13544,7 +13758,7 @@ msgid "Export variable to pipelines running on protected branches and tags only.
msgstr "仅导出å˜é‡åˆ°ä¿æŠ¤åˆ†æ”¯å’Œæ ‡ç­¾ä¸Šè¿è¡Œçš„æµæ°´çº¿ã€‚"
msgid "Exported requirements"
-msgstr "导出的需求"
+msgstr "导出的è¦æ±‚"
msgid "External Classification Policy Authorization"
msgstr "外部分类政策授æƒ"
@@ -13741,9 +13955,6 @@ msgstr "加载项目失败"
msgid "Failed to load related branches"
msgstr "加载相关分支失败"
-msgid "Failed to load sidebar lock status"
-msgstr "加载侧边æ é”状æ€å¤±è´¥"
-
msgid "Failed to load stacktrace."
msgstr "加载堆栈跟踪失败。"
@@ -14149,7 +14360,7 @@ msgid "File renamed with no changes."
msgstr "文件已é‡å‘½å,但无更改。"
msgid "File suppressed by a .gitattributes entry or the file's encoding is unsupported."
-msgstr ""
+msgstr "文件被 .gitattributes æ¡ç›®åŽ‹åˆ¶æˆ–文件的编ç ä¸å—支æŒã€‚"
msgid "File synchronization concurrency limit"
msgstr "文件åŒæ­¥å¹¶å‘é™åˆ¶"
@@ -14166,6 +14377,9 @@ msgstr "文件å"
msgid "Files"
msgstr "文件"
+msgid "Files API Rate Limits"
+msgstr ""
+
msgid "Files breadcrumb"
msgstr "文件导航"
@@ -14326,7 +14540,7 @@ msgid "FloC|Enable FloC (Federated Learning of Cohorts)"
msgstr "å¯ç”¨ FloC(Federated Learning of Cohorts)"
msgid "FloC|Federated Learning of Cohorts"
-msgstr ""
+msgstr "Federated Learning of Cohorts"
msgid "FlowdockService|1b609b52537..."
msgstr "1b609b52537..."
@@ -14509,7 +14723,7 @@ msgid "Format: %{dateFormat}"
msgstr "æ ¼å¼ï¼š%{dateFormat}"
msgid "Forward %{package_type} package requests to the %{registry_type} Registry if the packages are not found in the GitLab Package Registry"
-msgstr ""
+msgstr "如果在 GitLab 软件包库中找ä¸åˆ°è½¯ä»¶åŒ…,则将 %{package_type} 软件包请求转å‘到 %{registry_type} 库"
msgid "Found errors in your %{gitlab_ci_yml}:"
msgstr "在您的 %{gitlab_ci_yml} 中找到错误:"
@@ -14599,7 +14813,7 @@ msgid "Generate site and private keys at"
msgstr "生æˆç«™ç‚¹å’Œç§é’¥åœ¨"
msgid "Generic"
-msgstr ""
+msgstr "通用"
msgid "Generic package file size in bytes"
msgstr "通用文件包大å°ï¼ˆå­—节)"
@@ -14737,7 +14951,7 @@ msgid "Geo|Geo sites"
msgstr "Geo站点"
msgid "Geo|Geo sites are paused using a command run on the site"
-msgstr ""
+msgstr "使用在站点上è¿è¡Œçš„命令æ¥æš‚åœGeo站点"
msgid "Geo|Geo supports replication of many data types."
msgstr "Geo 支æŒå¤šç§æ•°æ®ç±»åž‹çš„å¤åˆ¶ã€‚"
@@ -14782,7 +14996,7 @@ msgid "Geo|Learn more about Geo"
msgstr "了解更多关于Geo"
msgid "Geo|Learn more about Geo site statuses"
-msgstr ""
+msgstr "了解更多关于Geo站点状æ€çš„ä¿¡æ¯"
msgid "Geo|Make everyone on your team more productive regardless of their location. GitLab Geo creates read-only mirrors of your GitLab instance so you can reduce the time it takes to clone and fetch large repos."
msgstr "GitLab Geo å¯ä»¥åˆ›å»º GitLab 实例的åªè¯»é•œåƒ, 使得从远端克隆和拉å–大型代ç ä»“库的时间大大缩短,从而æ高团队æˆå‘˜çš„工作效率。"
@@ -14860,13 +15074,13 @@ msgid "Geo|Remove tracking database entry"
msgstr "移除跟踪数æ®åº“æ¡ç›®"
msgid "Geo|Removing a Geo node stops the synchronization to and from that node. Are you sure?"
-msgstr ""
+msgstr "删除一个 Geo 节点会åœæ­¢ä¸Žè¯¥èŠ‚点的åŒæ­¥ï¼Œä½ ç¡®å®šå—?"
msgid "Geo|Replicated data is verified with the secondary site(s) using checksums"
-msgstr ""
+msgstr "å¤åˆ¶çš„æ•°æ®ç”±ä½¿ç”¨æ ¡éªŒå’Œçš„次è¦ç«™ç‚¹éªŒè¯"
msgid "Geo|Replicated data is verified with the secondary site(s) using checksums."
-msgstr ""
+msgstr "å¤åˆ¶çš„æ•°æ®ç”±ä½¿ç”¨æ ¡éªŒå’Œçš„次è¦ç«™ç‚¹éªŒè¯ã€‚"
msgid "Geo|Replication Details"
msgstr "å¤åˆ¶è¯¦æƒ…"
@@ -14911,7 +15125,7 @@ msgid "Geo|Reverify all projects"
msgstr "é‡æ–°æ ¡éªŒæ‰€æœ‰é¡¹ç›®"
msgid "Geo|Review replication status, and resynchronize and reverify items with the primary site."
-msgstr ""
+msgstr "查看å¤åˆ¶çŠ¶æ€å¹¶ä¸Žä¸»è¦ç«™ç‚¹é‡æ–°åŒæ­¥å’Œé‡æ–°éªŒè¯é¡¹ç›®ã€‚"
msgid "Geo|Secondary node"
msgstr "次节点"
@@ -14923,7 +15137,7 @@ msgid "Geo|Selective (%{syncLabel})"
msgstr "选择性 (%{syncLabel})"
msgid "Geo|Site's status was updated %{timeAgo}."
-msgstr ""
+msgstr "站点状æ€æ›´æ–°äºŽ%{timeAgo}。"
msgid "Geo|Status"
msgstr "状æ€"
@@ -14950,10 +15164,10 @@ msgid "Geo|Synchronization status"
msgstr "åŒæ­¥çŠ¶æ€"
msgid "Geo|The database is currently %{db_lag} behind the primary site."
-msgstr ""
+msgstr "æ•°æ®åº“当å‰ä½äºŽä¸»ç«™ç‚¹åŽé¢ %{db_lag}。"
msgid "Geo|The site is currently %{minutes_behind} behind the primary site."
-msgstr ""
+msgstr "站点当å‰ä½äºŽä¸»ç«™ç‚¹åŽé¢ %{minutes_behind}。"
msgid "Geo|There are no %{replicable_type} to show"
msgstr "没有%{replicable_type}å¯æ˜¾ç¤º"
@@ -15025,7 +15239,7 @@ msgid "Geo|With GitLab Geo, you can install a special read-only and replicated i
msgstr "使用 GitLab Geo,您å¯ä»¥åœ¨ä»»ä½•åœ°æ–¹å®‰è£…特殊的ã€åªè¯»çš„å¤åˆ¶å®žä¾‹ã€‚ %{linkStart}了解更多%{linkEnd}"
msgid "Geo|You are on a secondary, %{b_open}read-only%{b_close} Geo site."
-msgstr ""
+msgstr "当å‰å¤„于一个次è¦çš„,%{b_open}åªè¯»çš„%{b_close}Geo站点。"
msgid "Geo|You may be able to make a limited amount of changes or perform a limited amount of actions on this page."
msgstr "您å¯ä»¥åœ¨æ­¤é¡µé¢ä¸Šè¿›è¡Œæœ‰é™çš„更改或执行有é™çš„æ“作。"
@@ -15070,7 +15284,7 @@ msgid "Git GC period"
msgstr "Git GC 周期"
msgid "Git LFS Rate Limits"
-msgstr ""
+msgstr "Git LFS 速率é™åˆ¶"
msgid "Git LFS is not enabled on this GitLab server, contact your admin."
msgstr "æ­¤ GitLab æœåŠ¡å™¨ä¸Šæœªå¯ç”¨ Git LFS,请è”系管ç†å‘˜ã€‚"
@@ -15165,6 +15379,9 @@ msgstr "GitLab for Slack"
msgid "GitLab group: %{source_link}"
msgstr "GitLab 群组:%{source_link}"
+msgid "GitLab informs you if a new version is available."
+msgstr ""
+
msgid "GitLab is a complete DevOps platform, delivered as a single application, fundamentally changing the way Development, Security, and Ops teams collaborate"
msgstr "GitLab是一个完整的DevOpså¹³å°ï¼Œä½œä¸ºå•ä¸ªåº”用程åºå‘ˆçŽ°ï¼Œä»Žæ ¹æœ¬ä¸Šæ”¹å˜äº†å¼€å‘,安全和è¿ç»´å›¢é˜Ÿçš„å作方å¼"
@@ -15180,8 +15397,8 @@ msgstr "GitLab正在为该域获å–Let's Encrypt SSLè¯ä¹¦ã€‚这个过程å¯èƒ½é
msgid "GitLab is open source software to collaborate on code."
msgstr "GitLab 是用于代ç å作的开æºè½¯ä»¶ã€‚"
-msgid "GitLab is undergoing maintenance and is operating in a read-only mode."
-msgstr "GitLab正在维护中,处于åªè¯»æ¨¡å¼ã€‚"
+msgid "GitLab is undergoing maintenance and is operating in read-only mode."
+msgstr ""
msgid "GitLab member or Email address"
msgstr "GitLabæˆå‘˜æˆ–电å­é‚®ä»¶åœ°å€"
@@ -15192,9 +15409,6 @@ msgstr "GitLab å…ƒæ•°æ® URL"
msgid "GitLab project export"
msgstr "GitLab项目导出"
-msgid "GitLab restart is required to apply changes."
-msgstr "GitLab需é‡å¯æ›´æ”¹æ‰ä¼šç”Ÿæ•ˆã€‚"
-
msgid "GitLab single sign-on URL"
msgstr "GitLabå•ç‚¹ç™»å½•ç½‘å€"
@@ -15210,9 +15424,6 @@ msgstr "GitLab 使用 %{linkStart}Sidekiq%{linkEnd} 处ç†åŽå°ä½œä¸š"
msgid "GitLab version"
msgstr "GitLab 版本"
-msgid "GitLab will inform you if a new version is available."
-msgstr "如果有新版本,GitLab 将通知您。"
-
msgid "GitLab will run a background job that will produce pseudonymized CSVs of the GitLab database that will be uploaded to your configured object storage directory."
msgstr "GitLabå°†è¿è¡ŒåŽå°ä»»åŠ¡ï¼Œç”Ÿæˆæ•°æ®åº“的匿å化CSV,并上传到预先设定的对象存储目录。"
@@ -15301,7 +15512,7 @@ msgid "GitLabPages|When enabled, all attempts to visit your website through HTTP
msgstr "å¯ç”¨åŽï¼Œæ‰€æœ‰é€šè¿‡HTTP的访问å°è¯•éƒ½ä¼šè‡ªåŠ¨é‡å®šå‘到HTTPS,使用状æ€ä»£ç 301。 需è¦å¯¹æ‰€æœ‰åŸŸå有效的è¯ä¹¦ã€‚%{docs_link_start}了解更多信æ¯ã€‚%{link_end}"
msgid "GitLabPages|When using Pages under the general domain of a GitLab instance (%{pages_host}), you cannot use HTTPS with sub-subdomains. This means that if your username/groupname contains a dot it will not work. This is a limitation of the HTTP Over TLS protocol. HTTP pages will continue to work provided you don't redirect HTTP to HTTPS. %{docs_link_start}Learn more.%{link_end}"
-msgstr ""
+msgstr "在 GitLab 实例的通用域å (%{pages_host}) 下使用 Pages 时,ä¸èƒ½å°† HTTPS 与å­åŸŸä¸€èµ·ä½¿ç”¨ã€‚è¿™æ„味ç€å¦‚果您的用户å/群组å包å«ä¸€ä¸ªç‚¹ï¼Œå®ƒå°†ä¸èµ·ä½œç”¨ã€‚这是 HTTP Over TLS å议的é™åˆ¶ã€‚如果您ä¸å°† HTTP é‡å®šå‘到 HTTPS,HTTP 页é¢å°†ç»§ç»­å·¥ä½œã€‚ %{docs_link_start}了解更多。%{link_end}"
msgid "GitLabPages|With GitLab Pages you can host your static website directly from your GitLab repository. %{docs_link_start}Learn more.%{link_end}"
msgstr "使用 GitLab Pages,您å¯ä»¥ç›´æŽ¥ä»Žæ‚¨çš„ GitLab 仓库托管您的é™æ€ç½‘站。%{docs_link_start}了解更多。%{link_end}"
@@ -15376,7 +15587,7 @@ msgid "Given epic is already related to this epic."
msgstr "给定å²è¯—å·²ç»ä¸Žæ­¤å²è¯—å…³è”。"
msgid "Global Search is disabled for this scope"
-msgstr ""
+msgstr "此范围的全局æœç´¢å·²ç¦ç”¨"
msgid "Global Shortcuts"
msgstr "全局快æ·é”®"
@@ -15460,7 +15671,7 @@ msgid "Go to previous page"
msgstr "转到上一页"
msgid "Go to primary site"
-msgstr ""
+msgstr "转到主站点"
msgid "Go to project"
msgstr "跳转到项目"
@@ -15477,9 +15688,21 @@ msgstr "转到仓库图表"
msgid "Go to snippets"
msgstr "转到代ç ç‰‡æ®µ"
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check 'Allowed domains for sign-ups'."
+msgstr ""
+
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check 'Email restrictions for sign-ups'."
+msgstr ""
+
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check the 'Domain denylist'."
+msgstr ""
+
msgid "Go to the activity feed"
msgstr "转到动æ€æº"
+msgid "Go to the group’s 'Settings &gt; General' page, and check 'Restrict membership by email domain'."
+msgstr ""
+
msgid "Go to the milestone list"
msgstr "转到里程碑列表"
@@ -15516,6 +15739,12 @@ msgstr "转到您的代ç ç‰‡æ®µ"
msgid "Goal of the changes and what reviewers should be aware of"
msgstr "å˜æ›´çš„目的以åŠè¯„审人员应注æ„的事项。"
+msgid "Google Cloud"
+msgstr ""
+
+msgid "Google Cloud offers several deployment targets. Select the one most suitable for your project."
+msgstr ""
+
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr "谷歌的身份验è¯æœª%{link_start}正确é…ç½®%{link_end}。如需使用这项æœåŠ¡ï¼Œè¯·è”ç³»GitLab管ç†å‘˜ã€‚"
@@ -15600,9 +15829,6 @@ msgstr "群组钩å­"
msgid "Group ID"
msgstr "群组 ID"
-msgid "Group ID: %{group_id}"
-msgstr "群组ID: %{group_id}"
-
msgid "Group Owner must have signed in with SAML before enabling Group Managed Accounts"
msgstr "群组所有者必须先使用SAML登录,然åŽæ‰èƒ½å¯ç”¨ç¾¤ç»„托管å¸æˆ·"
@@ -15777,6 +16003,12 @@ msgstr "群组已æˆåŠŸå¯¼å…¥ã€‚"
msgid "GroupImport|Unable to process group import file"
msgstr "无法处ç†ç¾¤ç»„导入文件"
+msgid "GroupPage|Copy group ID"
+msgstr ""
+
+msgid "GroupPage|Group ID: %{group_id}"
+msgstr ""
+
msgid "GroupRoadmap|%{dateWord} – No end date"
msgstr "%{dateWord} - 无结æŸæ—¥æœŸ"
@@ -15811,10 +16043,10 @@ msgid "GroupRoadmap|The roadmap shows the progress of your epics along a timelin
msgstr "路线图显示了å²è¯— 沿ç€æ—¶é—´çº¿çš„进展情况"
msgid "GroupRoadmap|This quarter"
-msgstr ""
+msgstr "本季度"
msgid "GroupRoadmap|This year"
-msgstr ""
+msgstr "本年"
msgid "GroupRoadmap|To make your epics appear in the roadmap, add start or due dates to them."
msgstr "è¦ä½¿æ‚¨çš„å²è¯—出现在路线图中,请为其添加开始日期或截止日期。"
@@ -15829,6 +16061,9 @@ msgid "GroupRoadmap|To widen your search, change or remove filters; from %{start
msgstr "è¦æ‰©å¤§æ‚¨çš„æœç´¢ï¼Œè¯·æ›´æ”¹æˆ–移除筛选器,从 %{startDate} 到 %{endDate}。"
msgid "GroupRoadmap|Within 3 years"
+msgstr "3年内"
+
+msgid "GroupSAML|\"persistent\" recommended"
msgstr ""
msgid "GroupSAML|%{strongOpen}Warning%{strongClose} - Enabling %{linkStart}SSO enforcement%{linkEnd} can reduce security risks."
@@ -15844,7 +16079,7 @@ msgid "GroupSAML|Before enforcing SSO, enable SAML authentication."
msgstr "在执行SSO之å‰ï¼Œå¯ç”¨SAML身份验è¯ã€‚"
msgid "GroupSAML|Before enforcing SSO-only authentication for Git activity, enable SSO-only authentication for web activity."
-msgstr ""
+msgstr "在对 Git 活动强制执行仅 SSO 身份验è¯ä¹‹å‰ï¼Œä¸º Web 活动å¯ç”¨ä»… SSO 身份验è¯ã€‚"
msgid "GroupSAML|Certificate fingerprint"
msgstr "è¯ä¹¦æŒ‡çº¹"
@@ -15865,7 +16100,7 @@ msgid "GroupSAML|Enable SAML authentication for this group"
msgstr "为此群组å¯ç”¨ SAML 身份认è¯"
msgid "GroupSAML|Enforce SSO-only authentication for Git and Dependency Proxy activity for this group"
-msgstr ""
+msgstr "对该组的 Git å’Œä¾èµ–代ç†æ´»åŠ¨å¼ºåˆ¶æ‰§è¡Œä»… SSO 身份验è¯"
msgid "GroupSAML|Enforce SSO-only authentication for web activity for this group"
msgstr "对该群组的 Web 活动强制执行仅 SSO 身份验è¯"
@@ -15963,6 +16198,9 @@ msgstr "为了能够å¯ç”¨ç»„管ç†å¸æˆ·ï¼Œæ‚¨é¦–先需è¦å¯ç”¨æ‰§è¡Œ SSO。"
msgid "GroupSAML|To be able to prohibit outer forks, you first need to enforce dedicate group managed accounts."
msgstr "如需ç¦æ­¢å¤–部派生,您首先需è¦å¼ºåˆ¶æ‰§è¡ŒæŒ‡å®šç¾¤ç»„托管账户。"
+msgid "GroupSAML|Use SAML group links to manage group membership using SAML."
+msgstr ""
+
msgid "GroupSAML|Valid SAML Response"
msgstr "有效的SAMLå“应"
@@ -15975,14 +16213,11 @@ msgstr "您的 SCIM 令牌"
msgid "GroupSAML|as %{access_level}"
msgstr "以%{access_level}身份"
-msgid "GroupSAML|must match stored NameID of \"%{extern_uid}\" as we use this to identify users. If the NameID changes users will be unable to sign in."
-msgstr "必须匹é…“%{extern_uid}â€å­˜å‚¨çš„NameID,因为它用æ¥æ ‡è¯†ç”¨æˆ·ã€‚如果NameID更改,则用户将无法登录。"
-
-msgid "GroupSAML|should be \"persistent\""
-msgstr "应为“永久â€"
+msgid "GroupSAML|must match stored NameID of \"%{extern_uid}\" to identify user and allow sign in"
+msgstr ""
-msgid "GroupSAML|should be a random persistent ID, emails are discouraged"
-msgstr "应为éšæœºçš„永久性ID,ä¸å»ºè®®ä½¿ç”¨ç”µå­é‚®ç®±"
+msgid "GroupSAML|recommend persistent ID instead of email"
+msgstr ""
msgid "GroupSelect|No matching results"
msgstr "没有匹é…的结果"
@@ -15996,9 +16231,15 @@ msgstr "选择一个群组"
msgid "GroupSettings|Allow project access token creation"
msgstr "å…许创建项目访问令牌"
+msgid "GroupSettings|Applied to all subgroups unless overridden by a group owner. Groups already added to the project lose access."
+msgstr ""
+
msgid "GroupSettings|Auto DevOps pipeline was updated for the group"
msgstr "已为群组更新 Auto DevOps æµæ°´çº¿"
+msgid "GroupSettings|Available only on the top-level group. Applies to all subgroups. Groups already shared with a group outside %{group} are still shared unless removed manually."
+msgstr ""
+
msgid "GroupSettings|Badges"
msgstr "徽章"
@@ -16050,6 +16291,9 @@ msgstr "如果新父群组的å¯è§æ€§ä½ŽäºŽå½“å‰ç¾¤ç»„çš„å¯è§æ€§ï¼Œå­ç¾¤ç»„
msgid "GroupSettings|New runners registration token has been generated!"
msgstr "已生æˆæ–°çš„Runner注册令牌ï¼"
+msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgstr ""
+
msgid "GroupSettings|Pipeline settings was updated for the group"
msgstr "群组æµæ°´çº¿è®¾ç½®å·²æ›´æ–°"
@@ -16062,12 +16306,15 @@ msgstr "阻止派生到群组外。"
msgid "GroupSettings|Prevent forking setting was not saved"
msgstr "阻止派生设置未ä¿å­˜"
-msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups."
-msgstr "ç¦æ­¢æˆå‘˜å‘é€é‚€è¯·åˆ° %{group} åŠå…¶å­ç¾¤ç»„。"
+msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups"
+msgstr ""
msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
msgstr "ç¦æ­¢ä¸Žå…¶ä»–群组共享 %{group} 中的项目"
+msgid "GroupSettings|Prevents group members from being notified if the group is mentioned."
+msgstr ""
+
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
msgstr "项目将在 %{waiting_period}天延迟åŽæ°¸ä¹…删除,由å­ç»„继承。"
@@ -16104,21 +16351,6 @@ msgstr "此设置已应用于 %{ancestor_group}。若è¦ä¸Žå…¶å®ƒç¾¤ç»„共享此
msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}."
msgstr "此设置已应用于 %{ancestor_group}。 您å¯ä»¥è¦†ç›–此设置或 %{remove_ancestor_share_with_group_lock}。"
-msgid "GroupSettings|This setting is only available on the top-level group and it applies to all subgroups. Groups that have already been shared with a group outside %{group} will still be shared, and this access will have to be revoked manually."
-msgstr "此设置仅适用于顶级群组并且应用于所有å­ç»„。%{group}以外的其它群组所共享的群组ä»å°†è¢«å…±äº«ï¼Œå¿…须手动撤消此访问æƒé™ã€‚"
-
-msgid "GroupSettings|This setting will be applied to all subgroups unless overridden by a group owner. Groups that already have access to the project will continue to have access unless removed manually."
-msgstr "此设置将应用于所有å­ç¾¤ç»„。å­ç¾¤ç»„所有者å¯åœ¨å…¶å±‚级更改此设置。在访问æƒé™è¢«æ‰‹åŠ¨ç§»é™¤å‰ï¼Œå·²æœ‰æƒè®¿é—®è¯¥é¡¹ç›®çš„群组将继续ä¿æŒè®¿é—®æƒé™ã€‚"
-
-msgid "GroupSettings|This setting will override user notification preferences for all members of the group, subgroups, and projects."
-msgstr "此设置将覆盖所有æˆå‘˜ã€å­ç¾¤ç»„和项目的用户通知å好。"
-
-msgid "GroupSettings|This setting will prevent group members from being notified if the group is mentioned."
-msgstr "此设置将使群组æˆå‘˜åœ¨æåŠç¾¤ç»„æ—¶ä¸è¢«é€šçŸ¥ã€‚"
-
-msgid "GroupSettings|This setting will prevent group members from forking projects outside of the group."
-msgstr "此设置将阻止群组æˆå‘˜å‘在群组之外派生项目。"
-
msgid "GroupSettings|Transfer group"
msgstr "转移群组"
@@ -16236,8 +16468,8 @@ msgstr "导航到用户设置以查找您的 %{link_start}个人访问令牌%{li
msgid "GroupsNew|No import options available"
msgstr "æ— å¯ç”¨çš„导入选项"
-msgid "GroupsNew|Not all related objects are migrated, as %{docs_link_start}described here%{docs_link_end}. Please %{feedback_link_start}leave feedback%{feedback_link_end} on this feature."
-msgstr "并éžæ‰€æœ‰ç›¸å…³å¯¹è±¡éƒ½è¢«è¿ç§»ï¼Œå¦‚%{docs_link_start}此处æè¿°%{docs_link_end}。请留下关于此功能的%{feedback_link_start}å馈%{feedback_link_end}。"
+msgid "GroupsNew|Not all related objects are migrated. %{docs_link_start}More info%{docs_link_end}."
+msgstr ""
msgid "GroupsNew|Personal access token"
msgstr "个人访问令牌"
@@ -16368,15 +16600,27 @@ msgstr "éžå¥åº·"
msgid "Hello %{name},"
msgstr "您好 %{name},"
-msgid "Hello there"
-msgstr "你好"
-
msgid "Hello, %{name}!"
msgstr "%{name},您好!"
msgid "Hello, %{username}!"
msgstr "%{username},您好!"
+msgid "HelloMessage|%{handshake_emoji} Contribute to GitLab: %{contribute_link}"
+msgstr ""
+
+msgid "HelloMessage|%{magnifier_emoji} Create a new GitLab issue: %{new_issue_link}"
+msgstr ""
+
+msgid "HelloMessage|%{rocket_emoji} We like your curiosity! Help us improve GitLab by joining the team: %{jobs_page_link}"
+msgstr ""
+
+msgid "HelloMessage|Does this page need fixes or improvements? Open an issue or contribute a merge request to help make GitLab more lovable. At GitLab, everyone can contribute!"
+msgstr ""
+
+msgid "HelloMessage|Welcome to GitLab!"
+msgstr ""
+
msgid "Help"
msgstr "帮助"
@@ -16386,17 +16630,14 @@ msgstr "有助于防止机器人暴力攻击。"
msgid "Helps prevent bots from creating accounts."
msgstr "有助于防止机器人程åºåˆ›å»ºè´¦æˆ·ã€‚"
-msgid "Helps prevent bots from creating issues"
-msgstr "有助于防止机器人创建议题"
-
-msgid "Helps prevent malicious users hide their activity"
-msgstr "帮助防止æ¶æ„用户éšè—其活动"
+msgid "Helps prevent bots from creating issues."
+msgstr ""
-msgid "Helps reduce request volume (e.g. from crawlers or abusive bots)"
-msgstr "帮助å‡å°‘请求é‡ï¼ˆä¾‹å¦‚æ¥è‡ªçˆ¬è™«æˆ–滥用机器人的请求)"
+msgid "Helps prevent malicious users hide their activity."
+msgstr ""
msgid "Helps reduce request volume (for example, from crawlers or abusive bots)"
-msgstr ""
+msgstr "帮助å‡å°‘请求é‡ï¼ˆä¾‹å¦‚æ¥è‡ªçˆ¬è™«æˆ–滥用机器人的请求)"
msgid "Helps reduce request volume for protected paths"
msgstr "有助于帮助å‡å°‘å—ä¿æŠ¤è·¯å¾„的请求é‡"
@@ -16514,6 +16755,12 @@ msgstr "已开始维护"
msgid "Housekeeping, export, path, transfer, remove, archive."
msgstr "管家,导出,路径,转移,删除,存档。"
+msgid "How do I configure Akismet?"
+msgstr ""
+
+msgid "How do I configure it?"
+msgstr ""
+
msgid "How do I configure runners?"
msgstr "如何é…ç½® Runner?"
@@ -16527,7 +16774,7 @@ msgid "How do I mirror repositories?"
msgstr "如何镜åƒä»“库?"
msgid "How do I rename an environment?"
-msgstr ""
+msgstr "如何é‡å‘½å环境?"
msgid "How do I set up a Google Chat webhook?"
msgstr "如何设置 Google Chat webhook?"
@@ -16535,21 +16782,27 @@ msgstr "如何设置 Google Chat webhook?"
msgid "How do I set up this service?"
msgstr "如何设置此æœåŠ¡ï¼Ÿ"
+msgid "How do I use a web terminal?"
+msgstr ""
+
+msgid "How do I use file templates?"
+msgstr ""
+
msgid "How it works"
msgstr "工作原ç†"
msgid "How many days need to pass between marking entity for deletion and actual removing it."
msgstr "对象标记被删除和实际被删除之间的天数。"
-msgid "How many seconds an IP will be counted towards the limit"
+msgid "How many seconds an IP counts toward the IP address limit."
+msgstr ""
+
+msgid "How the job limiter handles jobs exceeding the thresholds specified below. The 'track' mode only logs the jobs. The 'compress' mode compresses the jobs and raises an exception if the compressed size exceeds the limit."
msgstr ""
msgid "I accept the %{terms_link}"
msgstr "æˆ‘æŽ¥å— %{terms_link}"
-msgid "I accept the|Terms of Service and Privacy Policy"
-msgstr ""
-
msgid "I forgot my password"
msgstr "我忘记了密ç "
@@ -16631,15 +16884,18 @@ msgstr "ä¿¡æ¯ï¼šæ‚¨çš„SSH密钥å³å°†è¿‡æœŸã€‚请生æˆä¸€ä¸ªæ–°å¯†é’¥ã€‚"
msgid "IP Address"
msgstr "IP地å€"
-msgid "IP expiration time"
-msgstr "IP 过期时间"
+msgid "IP address expiration time"
+msgstr ""
+
+msgid "IP address restrictions"
+msgstr ""
+
+msgid "IP addresses per user"
+msgstr ""
msgid "IP subnet restriction only allowed for top-level groups"
msgstr "åªå…许在最顶层群组设置IPå­ç½‘é™åˆ¶"
-msgid "IPs per user"
-msgstr "æ¯ä¸ªç”¨æˆ·çš„ IP"
-
msgid "Identifier"
msgstr "身份标识"
@@ -16652,6 +16908,9 @@ msgstr "身份标识"
msgid "If any indexed field exceeds this limit it will be truncated to this number of characters and the rest will not be indexed or searchable. This does not apply to repository and wiki indexing. Setting this to 0 means it is unlimited."
msgstr "如果任何索引字段超过此é™åˆ¶ï¼Œå®ƒå°†è¢«æˆªæ–­ä¸ºè¯¥å­—符数,其余部分将无法索引或ä¸å¯æœç´¢ã€‚此设置ä¸é€‚用于仓库和Wiki索引。将此设置为0表示它是无é™çš„。"
+msgid "If blank, defaults to %{code_open}Retry later%{code_close}."
+msgstr ""
+
msgid "If blank, set allowable lifetime to %{instance_level_policy_in_words}, as defined by the instance admin. Once set, existing tokens for users in this group may be revoked."
msgstr "如果为空,则将å…许寿命设置为 %{instance_level_policy_in_words},如实例管ç†å‘˜æ‰€å®šä¹‰ã€‚设置åŽï¼Œè¯¥ç¾¤ç»„中的用户现有令牌å¯èƒ½ä¼šè¢«æ’¤é”€ã€‚"
@@ -16668,7 +16927,7 @@ msgid "If disabled, only administrators can configure repository mirroring."
msgstr "如果ç¦ç”¨ï¼Œåˆ™åªæœ‰ç®¡ç†å‘˜å¯ä»¥é…置仓库镜åƒã€‚"
msgid "If enabled, GitLab will handle Object Storage replication using Geo. %{linkStart}Learn more%{linkEnd}"
-msgstr ""
+msgstr "如果å¯ç”¨ï¼ŒGitLab 将使用 Geo 处ç†å¯¹è±¡å­˜å‚¨å¤åˆ¶ã€‚ %{linkStart}了解更多%{linkEnd}"
msgid "If enabled, access to projects will be validated on an external service using their classification label."
msgstr "如果å¯ç”¨ï¼Œåˆ™ä½¿ç”¨å¤–部æœåŠ¡ä¸Šçš„分类标签æ¥éªŒè¯å¯¹é¡¹ç›®çš„访问æƒé™ã€‚"
@@ -16703,6 +16962,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 did not initiate these sign-in attempts, please reach out to your administrator or enable two-factor authentication (2FA) on your account."
+msgstr ""
+
msgid "If you did not initiate this change, please contact your administrator immediately."
msgstr "如果您没有å‘起此更改,请立å³è”系您的管ç†å‘˜ã€‚"
@@ -16792,12 +17054,12 @@ msgstr "导入CSV"
msgid "Import Projects from Gitea"
msgstr "从Gitea导入项目"
-msgid "Import a project"
-msgstr "导入项目"
-
msgid "Import an exported GitLab project"
msgstr "导入一个从GitLab导出的项目"
+msgid "Import and export rate limits"
+msgstr ""
+
msgid "Import failed due to a GitHub error: %{original}"
msgstr "由于GitHub错误,导入失败: %{original}"
@@ -16807,12 +17069,18 @@ msgstr "导入自"
msgid "Import from Jira"
msgstr "从Jira导入"
+msgid "Import group"
+msgstr ""
+
msgid "Import group from file"
msgstr "从文件导入群组"
msgid "Import groups"
msgstr "导入群组"
+msgid "Import history"
+msgstr ""
+
msgid "Import in progress"
msgstr "正在导入"
@@ -16876,8 +17144,26 @@ msgstr "从Pharbricator导入任务到议题"
msgid "Import timed out. Import took longer than %{import_jobs_expiration} seconds"
msgstr "导入超时。耗时已超过 %{import_jobs_expiration} 秒"
-msgid "Import/Export Rate Limits"
-msgstr "导入/导出速率é™åˆ¶"
+msgid "ImportAProjectModal|Import from a project"
+msgstr ""
+
+msgid "ImportAProjectModal|Import members from another project"
+msgstr ""
+
+msgid "ImportAProjectModal|Import project members"
+msgstr ""
+
+msgid "ImportAProjectModal|Only project members (not group members) are imported, and they get the same permissions as the project you import from."
+msgstr ""
+
+msgid "ImportAProjectModal|Successfully imported"
+msgstr ""
+
+msgid "ImportAProjectModal|Unable to import project members"
+msgstr ""
+
+msgid "ImportAProjectModal|You're importing members to the %{strongStart}%{name}%{strongEnd} project."
+msgstr ""
msgid "ImportButtons|Connect repositories from"
msgstr "用以下方å¼è¿žæŽ¥å‚¨å­˜åº“"
@@ -16928,8 +17214,8 @@ msgstr[0] "正在导入%d个仓库"
msgid "Importing..."
msgstr "导入中..."
-msgid "Import|A repository URL usually ends in a .git suffix, although this is not required. Double check to make sure your repository URL is correct."
-msgstr "仓库 URL 通常以 .git åŽç¼€ç»“尾,尽管这ä¸æ˜¯å¿…需的。仔细检查以确ä¿æ‚¨çš„仓库 URL 正确。"
+msgid "Import|There is not a valid Git repository at this URL. If your HTTP repository is not publicly accessible, verify your credentials."
+msgstr ""
msgid "Improve customer support with Service Desk"
msgstr "通过æœåŠ¡å°æ”¹å–„客户支æŒ"
@@ -16937,9 +17223,6 @@ msgstr "通过æœåŠ¡å°æ”¹å–„客户支æŒ"
msgid "Improves Git cloning performance."
msgstr "æ高 Git 克隆性能。"
-msgid "In %{time_to_now}"
-msgstr "%{time_to_now}åŽ"
-
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 "在拉å–é•œåƒçš„情况下,您的用户将æˆä¸ºæ´»åŠ¨æè¦ä¸­æ‰€æœ‰ä½œä¸ºæ›´æ–°ç»“果的事件的作者,例如创建新分支或将新æ交推é€åˆ°çŽ°æœ‰åˆ†æ”¯ã€‚"
@@ -16953,7 +17236,7 @@ msgid "In this page you will find information about the settings that are used i
msgstr "在此页é¢ä¸­ï¼Œæ‚¨å°†æ‰¾åˆ°æœ‰å…³å½“å‰å®žä¾‹ä¸­ä½¿ç”¨çš„设置的信æ¯ã€‚"
msgid "InProductMarketing|%{organization_name} logo"
-msgstr ""
+msgstr "%{organization_name} 标志"
msgid "InProductMarketing|%{strong_start}Advanced application security%{strong_end} — including SAST, DAST scanning, FUZZ testing, dependency scanning, license compliance, secrete detection"
msgstr "%{strong_start}高级应用程åºå®‰å…¨%{strong_end} — 包括 SASTã€DAST 扫æã€FUZZ 测试ã€ä¾èµ–性扫æã€è®¸å¯è¯åˆè§„性ã€ç§˜å¯†æ£€æµ‹"
@@ -16965,7 +17248,7 @@ msgid "InProductMarketing|%{strong_start}Executive level insights%{strong_end} â
msgstr "%{strong_start}高管级洞察%{strong_end} — 包括生产力报告ã€ä»»åŠ¡ç±»åž‹ã€å®Œæˆå¤©æ•°ã€ä»·å€¼æµ"
msgid "InProductMarketing|%{strong_start}GitLab Inc.%{strong_end} 268 Bush Street, #350, San Francisco, CA 94104, USA"
-msgstr ""
+msgstr "%{strong_start}GitLab Inc.%{strong_end} 268 Bush Street, #350, San Francisco, CA 94104, USA"
msgid "InProductMarketing|%{strong_start}Multiple approval roles%{strong_end} — including code owners and required merge approvals"
msgstr "%{strong_start}多个批准角色%{strong_end} — 包括代ç æ‰€æœ‰è€…和所需的åˆå¹¶æ‰¹å‡†"
@@ -16974,7 +17257,7 @@ msgid "InProductMarketing|%{strong_start}Overall, how difficult or easy was it t
msgstr "%{strong_start}总体而言,开始使用 GitLab 的难易程度如何?%{strong_end}"
msgid "InProductMarketing|*GitLab*, noun: a synonym for efficient teams"
-msgstr ""
+msgstr "*GitLab*,åè¯ï¼šé«˜æ•ˆå›¢é˜Ÿçš„åŒä¹‰è¯"
msgid "InProductMarketing|...and you can get a free trial of GitLab Ultimate"
msgstr "...您å¯ä»¥èŽ·å¾—旗舰版的å…费试用"
@@ -17178,13 +17461,13 @@ msgid "InProductMarketing|It's all in the stats"
msgstr "一切尽在统计中"
msgid "InProductMarketing|It's also possible to simply %{external_repo_link} in order to take advantage of GitLab's CI/CD."
-msgstr ""
+msgstr "为了利用 GitLab çš„ CI/CD,也å¯ä»¥ç®€å•åœ°è®¾ç½®ä¸º %{external_repo_link}"
msgid "InProductMarketing|Launch GitLab CI/CD in 20 minutes or less"
msgstr "在 20 分钟或更短的时间内å¯åŠ¨ GitLab CI/CD"
msgid "InProductMarketing|Making the switch? It's easier than you think to import your projects into GitLab. Move %{github_link}, or import something %{bitbucket_link}."
-msgstr ""
+msgstr "进行转æ¢ï¼Ÿå°†é¡¹ç›®å¯¼å…¥ GitLab 比您想象的è¦å®¹æ˜“,移动 %{github_link},或者导入一些东西 %{bitbucket_link}。"
msgid "InProductMarketing|Master the art of importing!"
msgstr "掌æ¡å¯¼å…¥çš„艺术ï¼"
@@ -17217,15 +17500,15 @@ msgid "InProductMarketing|Security that's integrated into your development lifec
msgstr "集æˆåˆ°æ‚¨çš„å¼€å‘生命周期中的安全性"
msgid "InProductMarketing|Sometimes you're not ready to make a full transition to a new tool. If you're not ready to fully commit, %{mirroring_link} gives you a safe way to try out GitLab in parallel with your current tool."
-msgstr ""
+msgstr "有时您还没有准备好完全过渡到新工具。如果您还没有准备好完全æ交, %{mirroring_link} 为您æ供了一ç§ä¸Žå½“å‰å·¥å…·å¹¶è¡Œè¯•ç”¨ GitLab 的安全方法。"
msgid "InProductMarketing|Spin up an autoscaling runner in GitLab"
msgstr "在 GitLab 中å¯åŠ¨è‡ªåŠ¨ç¼©æ”¾Runner"
msgid "InProductMarketing|Start a GitLab Ultimate trial today in less than one minute, no credit card required."
-msgstr ""
+msgstr "ç«‹å³åœ¨ä¸åˆ°ä¸€åˆ†é’Ÿçš„时间内开始 GitLab Ultimate 试用,无需信用å¡ã€‚"
-msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no CC required"
+msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no credit card required"
msgstr ""
msgid "InProductMarketing|Start a trial"
@@ -17238,61 +17521,61 @@ msgid "InProductMarketing|Start by importing your projects"
msgstr "从导入您的项目开始"
msgid "InProductMarketing|Start with a GitLab Ultimate free trial"
-msgstr ""
+msgstr "开始å…费试用 GitLab Ultimate"
msgid "InProductMarketing|Start your trial now!"
msgstr "现在就开始试用ï¼"
msgid "InProductMarketing|Start your trial today to experience single application success and discover all the features of GitLab Ultimate for free!"
-msgstr ""
+msgstr "å³åˆ»å¼€å§‹è¯•ç”¨ï¼Œä½“验å•ä¸ªåº”用的æˆåŠŸï¼Œå¹¶å…è´¹å‘现GitLab Ultimate的所有功能。"
msgid "InProductMarketing|Stop wondering and use GitLab to answer questions like:"
-msgstr ""
+msgstr "åœæ­¢ç–‘惑,使用GitLab回答以下问题:"
msgid "InProductMarketing|Streamline code review, know at a glance who's unavailable, communicate in comments or in email and integrate with Slack so everyone's on the same page."
-msgstr ""
+msgstr "简化代ç å®¡æŸ¥ï¼Œä¸€ç›®äº†ç„¶åœ°çŸ¥é“è°ä¸å¯ç”¨ï¼Œåœ¨è¯„论或电å­é‚®ä»¶ä¸­æ²Ÿé€šï¼Œå¹¶ä¸ŽSlackæ•´åˆï¼Œè®©æ¯ä¸ªäººéƒ½åœ¨åŒä¸€é¡µé¢ä¸Šã€‚"
msgid "InProductMarketing|Take this 1-question survey!"
-msgstr ""
+msgstr "å‚加这个åªæœ‰ä¸€ä¸ªé—®é¢˜çš„调查ï¼"
msgid "InProductMarketing|Take your first steps with GitLab"
-msgstr ""
+msgstr "使用GitLab的第一步"
msgid "InProductMarketing|Take your source code management to the next level"
-msgstr ""
+msgstr "让您的æºä»£ç ç®¡ç†æ›´ä¸Šä¸€å±‚楼"
msgid "InProductMarketing|Team up in GitLab for greater efficiency"
-msgstr ""
+msgstr "在 GitLab 中组队以æ高效率"
-msgid "InProductMarketing|Team work makes the dream work"
+msgid "InProductMarketing|Team work makes the dream work"
msgstr ""
msgid "InProductMarketing|Test, create, deploy"
msgstr "测试,创建,部署"
msgid "InProductMarketing|That's all it takes to get going with GitLab, but if you're new to working with Git, check out our %{basics_link} for helpful tips and tricks for getting started."
-msgstr ""
+msgstr "这就是开始使用 GitLab 所需的全部内容,但是如果您ä¸ç†Ÿæ‚‰ Git,请查看我们的 %{basics_link} 以获å–有用的入门æ示和技巧。"
msgid "InProductMarketing|This is email %{current_series} of %{total_series} in the %{track} series."
-msgstr ""
+msgstr "这是 %{track} 系列中的第 %{current_series} å°ç”µå­é‚®ä»¶ï¼Œå…± %{total_series} å°"
msgid "InProductMarketing|This is email %{current_series} of %{total_series} in the %{track} series. To disable notification emails sent by your local GitLab instance, either contact your administrator or %{unsubscribe_link}."
-msgstr ""
+msgstr "这是 %{track} 系列中的第 %{current_series} å°ç”µå­é‚®ä»¶ï¼Œå…± %{total_series} å°ã€‚è¦ç¦ç”¨æœ¬åœ° GitLab 实例å‘é€çš„通知电å­é‚®ä»¶ï¼Œè¯·è”系您的管ç†å‘˜æˆ– %{unsubscribe_link}。"
msgid "InProductMarketing|Ticketmaster decreased their CI build time by 15X"
-msgstr ""
+msgstr "Ticketmaster å°† CI 构建时间缩短了 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 "厌倦了与ä¸åŒçš„工具链ã€ä¿¡æ¯å­¤å²›å’Œä½Žæ•ˆæµç¨‹çš„æ斗? GitLab çš„ CI/CD 建立在 DevOps å¹³å°ä¸Šï¼Œå…·æœ‰æºä»£ç ç®¡ç†ã€è§„划ã€ç›‘控等功能。å‚阅 %{ci_link}。"
msgid "InProductMarketing|To opt out of these onboarding emails, %{unsubscribe_link}."
-msgstr ""
+msgstr "选择退出Onboarding邮件,%{unsubscribe_link}。"
msgid "InProductMarketing|To understand and get the most out of GitLab, start at the beginning and %{project_link}. In GitLab, repositories are part of a project, so after you've created your project you can go ahead and %{repo_link}."
-msgstr ""
+msgstr "è¦äº†è§£å¹¶å……分利用GitLab,请从头开始,从%{project_link}开始。在GitLab中,仓库是项目的一部分,所以在您创建了您的项目之åŽï¼Œæ‚¨å¯ä»¥ç»§ç»­æ‰§è¡Œ%{repo_link}。"
msgid "InProductMarketing|Try GitLab Ultimate for free"
-msgstr ""
+msgstr "å…费试用 GitLab 旗舰版"
msgid "InProductMarketing|Try it out"
msgstr "å°è¯•ä¸€ä¸‹"
@@ -17301,7 +17584,7 @@ msgid "InProductMarketing|Try it yourself"
msgstr "å°è¯•ä¸€ä¸‹"
msgid "InProductMarketing|Turn coworkers into collaborators"
-msgstr ""
+msgstr "å°†åŒäº‹å˜æˆåˆä½œè€…"
msgid "InProductMarketing|Twitter"
msgstr "Twitter"
@@ -17316,10 +17599,10 @@ msgid "InProductMarketing|Use GitLab CI/CD"
msgstr "使用 GitLab CI/CD"
msgid "InProductMarketing|Use our AWS cloudformation template to spin up your runners in just a few clicks!"
-msgstr ""
+msgstr "使用我们的AWS cloudformation模æ¿ï¼Œåªéœ€ç‚¹å‡»å‡ ä¸‹ï¼Œå³å¯è®©æ‚¨çš„ runner 加速ï¼"
msgid "InProductMarketing|Used by more than 100,000 organizations from around the globe:"
-msgstr ""
+msgstr "å…¨çƒè¶…过10万个组织使用:"
msgid "InProductMarketing|Very difficult"
msgstr "éžå¸¸å›°éš¾"
@@ -17328,19 +17611,19 @@ msgid "InProductMarketing|Very easy"
msgstr "éžå¸¸å®¹æ˜“"
msgid "InProductMarketing|We know a thing or two about efficiency and we don't want to keep that to ourselves. Sign up for a free trial of GitLab Ultimate and your teams will be on it from day one."
-msgstr ""
+msgstr "我们知é“一些关于效率的事情,我们想分享给大家。注册GitLab Ultimateçš„å…费试用版,您的团队将从第一天开始使用它。"
msgid "InProductMarketing|We want your GitLab experience to be great"
-msgstr ""
+msgstr "我们希望您的GitLab体验éžå¸¸å¥½"
msgid "InProductMarketing|What does our value stream timeline look like from product to development to review and production?"
-msgstr ""
+msgstr "从产å“到开å‘,å†åˆ°å®¡æŸ¥å’Œç”Ÿäº§ï¼Œæˆ‘们的价值æµæ—¶é—´è¡¨æ˜¯ä»€ä¹ˆæ ·çš„?"
msgid "InProductMarketing|When your team is on GitLab these answers are a click away."
-msgstr ""
+msgstr "当您的团队在 GitLab 上时,åªéœ€å•å‡»ä¸€ä¸‹å³å¯èŽ·å¾—这些答案。"
msgid "InProductMarketing|Working in GitLab = more efficient"
-msgstr ""
+msgstr "在 GitLab 中工作 = 更高效"
msgid "InProductMarketing|YouTube"
msgstr "YouTube"
@@ -17358,13 +17641,13 @@ msgid "InProductMarketing|create a project"
msgstr "创建一个项目"
msgid "InProductMarketing|from Bitbucket"
-msgstr ""
+msgstr "从 Bitbucket"
msgid "InProductMarketing|go to about.gitlab.com"
-msgstr ""
+msgstr "转到about.gitlab.com"
msgid "InProductMarketing|how easy it is to get started"
-msgstr ""
+msgstr "如何轻æ¾åœ°å¼€å§‹"
msgid "InProductMarketing|quick start guide"
msgstr "快速开始指å—"
@@ -17373,7 +17656,7 @@ msgid "InProductMarketing|repository mirroring"
msgstr "仓库镜åƒ"
msgid "InProductMarketing|set up a repo"
-msgstr ""
+msgstr "设置 repo"
msgid "InProductMarketing|test and deploy"
msgstr "测试和部署"
@@ -17538,7 +17821,7 @@ msgid "Incidents|Add a URL"
msgstr "添加 URL"
msgid "Incidents|Drop or %{linkStart}upload%{linkEnd} a metric screenshot to attach it to the incident"
-msgstr ""
+msgstr "放置或%{linkStart}上传%{linkEnd}指标截图,将其附加到事件中。"
msgid "Incidents|Must start with http or https"
msgstr "必须以http或https开头"
@@ -17589,7 +17872,7 @@ msgid "Include new features from all tiers."
msgstr "包å«æ‰€æœ‰çº§åˆ«çš„新功能。"
msgid "Include the name of the author of the issue, merge request or comment in the email body. By default, GitLab overrides the email sender's name. Some email servers don't support that option."
-msgstr ""
+msgstr "在邮件正文中包括议题ã€åˆå¹¶è¯·æ±‚或评论的作者å称。默认情况下,GitLab会覆盖电å­é‚®ä»¶å‘件人的å字。有些电å­é‚®ä»¶æœåŠ¡å™¨ä¸æ”¯æŒè¿™ä¸ªé€‰é¡¹ã€‚"
msgid "Include the username in the URL if required: %{code_open}https://username@gitlab.company.com/group/project.git%{code_close}."
msgstr "如果需è¦ï¼Œè¯·åœ¨URL中包å«ç”¨æˆ·å:%{code_open}https://username@gitlab.company.com/group/project.git%{code_close}。"
@@ -17601,10 +17884,10 @@ msgid "Includes an MVC structure to help you get started"
msgstr "åŒ…å« MVC 结构以帮助您入门"
msgid "Includes an MVC structure, Gemfile, Rakefile, along with many others, to help you get started"
-msgstr ""
+msgstr "包括 MVC 结构ã€Gemfileã€Rakefile 以åŠè®¸å¤šå…¶ä»–结构,以帮助您入门"
msgid "Includes an MVC structure, mvnw and pom.xml to help you get started"
-msgstr ""
+msgstr "åŒ…å« MVC 结构ã€mvnw å’Œ pom.xml 以帮助您入门"
msgid "Incoming email"
msgstr "接收电å­é‚®ä»¶"
@@ -17715,10 +17998,10 @@ msgid "Insert code"
msgstr "æ’入代ç "
msgid "Insert column after"
-msgstr ""
+msgstr "å‘åŽæ’入列"
msgid "Insert column before"
-msgstr ""
+msgstr "å‘å‰æ’入列"
msgid "Insert image"
msgstr "æ’入图片"
@@ -17730,10 +18013,10 @@ msgid "Insert link"
msgstr "æ’入链接"
msgid "Insert row after"
-msgstr ""
+msgstr "下方æ’入行"
msgid "Insert row before"
-msgstr ""
+msgstr "上方æ’入行"
msgid "Insert suggestion"
msgstr "æ’入建议"
@@ -17824,7 +18107,7 @@ msgid "Integrations|All projects inheriting these settings will also be reset."
msgstr "继承这些设置的所有项目也将被é‡ç½®ã€‚"
msgid "Integrations|An error occurred while loading projects using custom settings."
-msgstr ""
+msgstr "使用自定义设置加载项目时å‘生错误。"
msgid "Integrations|Browser limitations"
msgstr "æµè§ˆå™¨é™åˆ¶"
@@ -17844,6 +18127,9 @@ msgstr "连接æˆåŠŸã€‚"
msgid "Integrations|Create new issue in Jira"
msgstr "在Jira中创建新议题"
+msgid "Integrations|Create new issue in ZenTao"
+msgstr ""
+
msgid "Integrations|Default settings are inherited from the group level."
msgstr "默认设置继承自群组级别。"
@@ -17851,7 +18137,7 @@ msgid "Integrations|Default settings are inherited from the instance level."
msgstr "默认设置继承自实例级别。"
msgid "Integrations|Enable GitLab.com slash commands in a Slack workspace."
-msgstr ""
+msgstr "在 Slack 工作区中å¯ç”¨ GitLab.com æ–œæ å‘½ä»¤ã€‚"
msgid "Integrations|Enable comments"
msgstr "å¯ç”¨è¯„论"
@@ -17875,7 +18161,7 @@ msgid "Integrations|Group-level integration management"
msgstr "群组级集æˆç®¡ç†"
msgid "Integrations|Includes Standard, plus the entire commit message, commit hash, and issue IDs"
-msgstr ""
+msgstr "包括标准,以åŠæ•´ä¸ªæ交消æ¯ã€æ交哈希和议题 ID"
msgid "Integrations|Includes commit title and branch."
msgstr "包括æ交标题和分支。"
@@ -17908,7 +18194,7 @@ msgid "Integrations|No linked namespaces"
msgstr "没有链接的命å空间"
msgid "Integrations|Note: this integration only works with accounts on GitLab.com (SaaS)."
-msgstr ""
+msgstr "注æ„:此集æˆä»…适用于 GitLab.com (SaaS) 上的账å·ã€‚"
msgid "Integrations|Projects using custom settings"
msgstr "使用自定义设置的项目"
@@ -17937,9 +18223,15 @@ msgstr "ä¿å­˜å°†æ›´æ–°æ‰€æœ‰ä¸ä½¿ç”¨è‡ªå®šä¹‰è®¾ç½®çš„项目的默认设置。
msgid "Integrations|Search Jira issues"
msgstr "æœç´¢Jira议题"
+msgid "Integrations|Search ZenTao issues"
+msgstr ""
+
msgid "Integrations|Send notifications about project events to Unify Circuit."
msgstr "将有关项目事件的通知å‘é€åˆ° Unify Circuit。"
+msgid "Integrations|Send notifications about project events to a Unify Circuit conversation. %{docs_link}"
+msgstr ""
+
msgid "Integrations|Sign in to add namespaces"
msgstr "登录以添加命å空间"
@@ -17947,7 +18239,7 @@ msgid "Integrations|Standard"
msgstr "标准"
msgid "Integrations|There are no projects using custom settings"
-msgstr ""
+msgstr "没有使用自定义设置的项目"
msgid "Integrations|This integration, and inheriting projects were reset."
msgstr "此集æˆå’Œç»§æ‰¿é¡¹ç›®å·²è¢«é‡ç½®ã€‚"
@@ -17974,11 +18266,14 @@ msgid "Integrations|You must have owner or maintainer permissions to link namesp
msgstr "您必须拥有所有者或维护者æƒé™æ‰èƒ½é“¾æŽ¥å‘½å空间。"
msgid "Integrations|You should now see GitLab.com activity inside your Jira Cloud issues. %{linkStart}Learn more%{linkEnd}"
-msgstr ""
+msgstr "您现在应该在 Jira Cloud 议题中看到 GitLab.com 活动。 %{linkStart}了解更多%{linkEnd}"
msgid "Integrations|You've activated every integration 🎉"
msgstr "æ‚¨å·²æ¿€æ´»æ‰€æœ‰é›†æˆ ðŸŽ‰"
+msgid "Integrations|ZenTao issues display here when you create issues in your project in ZenTao."
+msgstr ""
+
msgid "Interactive mode"
msgstr "交互模å¼"
@@ -18006,9 +18301,6 @@ msgstr "ä¸èƒ½åœç”¨å†…部用户"
msgid "Interval Pattern"
msgstr "循环周期"
-msgid "Introducing Value Stream Analytics"
-msgstr "价值æµåˆ†æžä»‹ç»"
-
msgid "Introducing Your DevOps Report"
msgstr "了解您的DevOps报告"
@@ -18064,7 +18356,7 @@ msgid "Invalid login or password"
msgstr "登录å或密ç æ— æ•ˆ"
msgid "Invalid period"
-msgstr ""
+msgstr "无效的周期"
msgid "Invalid pin code"
msgstr "无效的 pin ç "
@@ -18105,6 +18397,12 @@ msgstr "无效的yaml"
msgid "Investigate vulnerability: %{title}"
msgstr "调查æ¼æ´ž: %{title}"
+msgid "Invisible Captcha"
+msgstr ""
+
+msgid "Invisible Captcha helps prevent the creation of spam accounts. It adds a honeypot field and time-sensitive form submission to the account signup form."
+msgstr ""
+
msgid "Invitation"
msgstr "邀请"
@@ -18558,12 +18856,18 @@ msgstr "使用ä¸åœ¨é›†æˆåˆ—表中的自定义议题追踪器。 %{docs_link}"
msgid "Issues"
msgstr "议题"
+msgid "Issues I've created"
+msgstr ""
+
msgid "Issues Rate Limits"
msgstr "议题速率é™åˆ¶"
msgid "Issues and merge requests"
msgstr "议题和åˆå¹¶è¯·æ±‚"
+msgid "Issues assigned to me"
+msgstr ""
+
msgid "Issues can be bugs, tasks or ideas to be discussed. Also, issues are searchable and filterable."
msgstr "议题å¯ä»¥æ˜¯ç¼ºé™·ï¼Œä»»åŠ¡æˆ–è¦è®¨è®ºçš„想法。此外,å¯ä»¥é€šè¿‡æœç´¢å’Œç­›é€‰æ¥æŸ¥æ‰¾è®®é¢˜ã€‚"
@@ -18675,7 +18979,7 @@ msgstr "找ä¸åˆ°è¿­ä»£å‘¨æœŸ"
msgid "Iterations|Create cadence"
msgstr "创建周期"
-msgid "Iterations|Create your first iteration"
+msgid "Iterations|Create iteration"
msgstr ""
msgid "Iterations|Delete cadence"
@@ -18684,6 +18988,9 @@ msgstr "删除周期"
msgid "Iterations|Delete iteration cadence?"
msgstr "删除迭代周期?"
+msgid "Iterations|Delete iteration?"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr "时长"
@@ -18717,12 +19024,18 @@ msgstr "新建迭代"
msgid "Iterations|New iteration cadence"
msgstr "新建迭代周期"
+msgid "Iterations|No closed iterations."
+msgstr ""
+
msgid "Iterations|No iteration cadences to show."
msgstr "没有è¦æ˜¾ç¤ºçš„迭代周期。"
msgid "Iterations|No iterations in cadence."
msgstr "周期中没有迭代。"
+msgid "Iterations|No open iterations."
+msgstr ""
+
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr "您希望安排的未æ¥è¿­ä»£æ¬¡æ•°"
@@ -18753,6 +19066,9 @@ msgstr "第一次迭代的开始日期"
msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
msgstr "这将删除周期以åŠå…¶ä¸­çš„所有迭代。"
+msgid "Iterations|This will remove the iteration from any issues that are assigned to it."
+msgstr ""
+
msgid "Iterations|Title"
msgstr "标题"
@@ -18768,15 +19084,9 @@ msgstr "日期ä¸èƒ½ä¸Žæ­¤è¿­ä»£å‘¨æœŸå†…的其他现有迭代é‡å "
msgid "Iteration|cannot be more than 500 years in the future"
msgstr "ä¸èƒ½è¶…过未æ¥çš„500å¹´"
-msgid "I’m familiar with the basics of DevOps."
-msgstr "我熟悉Devops的基本知识。"
-
msgid "I’m joining my team who’s already on GitLab"
msgstr "我è¦åŠ å…¥æˆ‘å·²ç»åœ¨ GitLab 上的团队"
-msgid "I’m not familiar with the basics of DevOps."
-msgstr "我ä¸ç†Ÿæ‚‰Devops的基本知识。"
-
msgid "Jaeger URL"
msgstr "Jaeger 地å€"
@@ -18985,7 +19295,7 @@ msgid "JiraService|Set a custom final state by using transition IDs. %{linkStart
msgstr "ä½¿ç”¨è½¬æ¢ ID 设置自定义最终状æ€ã€‚ %{linkStart}äº†è§£è½¬æ¢ ID%{linkEnd}"
msgid "JiraService|Sign in to GitLab.com to get started."
-msgstr ""
+msgstr "登录 GitLab.com 以开始使用。"
msgid "JiraService|This feature requires a Premium plan."
msgstr "此功能需è¦é«˜çº§è®¡åˆ’。"
@@ -19041,6 +19351,9 @@ msgstr "您需è¦åœ¨å¯ç”¨æ­¤é›†æˆä¹‹å‰é…ç½® Jira。有关更多详细信æ¯ï
msgid "Job"
msgstr "作业"
+msgid "Job %{jobName}"
+msgstr ""
+
msgid "Job Failed #%{build_id}"
msgstr "作业 #%{build_id} 已失败 "
@@ -19087,7 +19400,7 @@ msgid "Jobs fail if they run longer than the timeout time. Input value is in sec
msgstr "如果作业è¿è¡Œæ—¶é—´è¶…过超时时间,则作业将失败。默认情况下,输入值以秒为å•ä½ã€‚也接å—å¯è¯»çš„输入,例如 %{code_open}1 å°æ—¶%{code_close}。"
msgid "Jobs older than the configured time are considered expired and are archived. Archived jobs can no longer be retried. Leave empty to never archive jobs automatically. The default unit is in days, but you can use other units, for example %{code_open}15 days%{code_close}, %{code_open}1 month%{code_close}, %{code_open}2 years%{code_close}. Minimum value is 1 day."
-msgstr ""
+msgstr "早于é…置时间的作业被视为已过期并已存档。无法å†é‡è¯•å­˜æ¡£çš„作业。留空以从ä¸è‡ªåŠ¨å­˜æ¡£ä½œä¸šã€‚默认å•ä½æ˜¯å¤©ï¼Œä½†æ‚¨å¯ä»¥ä½¿ç”¨å…¶ä»–å•ä½ï¼Œä¾‹å¦‚ %{code_open}15 days%{code_close}, %{code_open}1 month%{code_close}, %{code_open}2 years%{code_close}。最å°å€¼ä¸º 1 天。"
msgid "Jobs|Are you sure you want to proceed?"
msgstr "确定è¦ç»§ç»­å—?"
@@ -19511,7 +19824,7 @@ msgid "Last successful update"
msgstr "最近æˆåŠŸçš„æ›´æ–°"
msgid "Last time checked"
-msgstr ""
+msgstr "上次检查时间"
msgid "Last time verified"
msgstr "最近一次验è¯"
@@ -19568,7 +19881,7 @@ msgid "Learn GitLab"
msgstr "学习GitLab"
msgid "Learn GitLab - Ultimate trial"
-msgstr ""
+msgstr "学习 GitLab - 旗舰版试用"
msgid "Learn GitLab|Trial only"
msgstr "ä»…é™è¯•ç”¨"
@@ -19630,9 +19943,6 @@ msgstr "了解更多有关签åæ交的详细信æ¯"
msgid "Learn more in the"
msgstr "了解更多"
-msgid "Learn more in the|pipeline schedules documentation"
-msgstr "æµæ°´çº¿è®¡åˆ’文档"
-
msgid "Learn more."
msgstr "了解更多。"
@@ -19724,16 +20034,16 @@ msgid "LearnGitLab|Try GitLab Ultimate for free"
msgstr "å…费试用旗舰版"
msgid "LearnGitLab|Try all GitLab features for 30 days, no credit card required."
-msgstr ""
+msgstr "试用所有 GitLab 功能 30 天,无需信用å¡ã€‚"
msgid "LearnGitLab|Use your new GitLab workflow to deploy your application, monitor its health, and keep it secure:"
-msgstr ""
+msgstr "使用您的新 GitLab 工作æµç¨‹éƒ¨ç½²æ‚¨çš„应用程åºã€ç›‘控其è¿è¡ŒçŠ¶å†µå¹¶ç¡®ä¿å…¶å®‰å…¨ï¼š"
msgid "LearnGitlab|Creating your onboarding experience..."
msgstr "正在创建您的入门体验..."
msgid "LearnGitlab|Ok, let's go"
-msgstr ""
+msgstr "好的,让我们去å§"
msgid "LearnGitlab|Trial only"
msgstr "ä»…é™è¯•ç”¨"
@@ -19744,9 +20054,6 @@ msgstr "退出"
msgid "Leave Admin Mode"
msgstr "离开管ç†å‘˜æ¨¡å¼"
-msgid "Leave blank for no limit. Once set, existing personal access tokens may be revoked."
-msgstr "留空为无é™åˆ¶ã€‚此项设置åŽï¼ŒçŽ°æœ‰çš„个人访问令牌å¯èƒ½è¢«æ’¤é”€ã€‚"
-
msgid "Leave edit mode? All unsaved changes will be lost."
msgstr "退出编辑模å¼ï¼Ÿæ‰€æœ‰æœªä¿å­˜çš„更改都将丢失。"
@@ -19792,12 +20099,12 @@ msgstr "%{docLinkStart}许å¯è¯æ‰¹å‡†%{docLinkEnd}无效"
msgid "LicenseCompliance|Acceptable license to be used in the project"
msgstr "项目中å¯æŽ¥å—的许å¯è¯"
-msgid "LicenseCompliance|Add a license"
-msgstr "添加许å¯è¯"
-
msgid "LicenseCompliance|Add license and related policy"
msgstr "添加许å¯è¯å’Œç›¸å…³æ”¿ç­–"
+msgid "LicenseCompliance|Add license policy"
+msgstr ""
+
msgid "LicenseCompliance|Allow"
msgstr "å…许"
@@ -19879,6 +20186,9 @@ msgstr "已拒ç»"
msgid "LicenseManagement|Uncategorized"
msgstr "未分类"
+msgid "Licensed Enterprise Edition features can be used if the project namespace's plan includes the feature, or if the project is public."
+msgstr ""
+
msgid "Licensed Features"
msgstr "需è¦è®¸å¯çš„功能"
@@ -19945,22 +20255,31 @@ msgstr "é™åˆ¶æ—¶é—´è·Ÿè¸ªå•ä½æ˜¾ç¤ºåˆ°å°æ—¶ã€‚"
msgid "Limit namespaces and projects that can be indexed"
msgstr "é™åˆ¶å¯ç´¢å¼•å‘½å空间和项目"
-msgid "Limit sign in from multiple ips"
-msgstr "é™åˆ¶ä»Žå¤šä¸ªIP登录"
+msgid "Limit project size at a global, group, and project level. %{link_start}Learn more%{link_end}."
+msgstr ""
+
+msgid "Limit sign in from multiple IP addresses"
+msgstr ""
msgid "Limit the number of concurrent operations this secondary site can run in the background."
-msgstr ""
+msgstr "é™åˆ¶æ­¤æ¬¡è¦èŠ‚点在åŽå°è¿è¡Œçš„并行æ“作数é‡ã€‚"
msgid "Limit the number of inbound incident management alerts that can be sent to a project."
-msgstr ""
+msgstr "é™åˆ¶å¯ä»¥å‘é€åˆ°é¡¹ç›®çš„入站事件管ç†è­¦æŠ¥çš„æ•°é‡ã€‚"
msgid "Limit the number of issues and epics per minute a user can create through web and API requests."
+msgstr "é™åˆ¶ç”¨æˆ·æ¯åˆ†é’Ÿå¯ä»¥é€šè¿‡ Web å’Œ API 请求创建的议题和å²è¯—çš„æ•°é‡ã€‚"
+
+msgid "Limit the size of Sidekiq jobs stored in Redis."
msgstr ""
msgid "Limited to showing %d event at most"
msgid_plural "Limited to showing %d events at most"
msgstr[0] "最多显示 %d 个事件"
+msgid "Limiting mode"
+msgstr ""
+
msgid "Line changes"
msgstr "è¡Œå˜æ›´"
@@ -20030,9 +20349,6 @@ msgstr "列出å¯ç”¨ä»“库"
msgid "List of all merge commits"
msgstr "所有åˆå¹¶æ交列表"
-msgid "List of users to be excluded from the limit"
-msgstr "è¦æŽ’除在é™åˆ¶èŒƒå›´ä¹‹å¤–的用户列表"
-
msgid "List options"
msgstr "列表选项"
@@ -20072,9 +20388,6 @@ msgstr "加载æ交引用%{ref}路径%{path}中的文件,目录和å­æ¨¡å—"
msgid "Loading functions timed out. Please reload the page to try again."
msgstr "加载功能超时。请刷新页é¢é‡è¯•ã€‚"
-msgid "Loading issues"
-msgstr "加载议题"
-
msgid "Loading more"
msgstr "加载更多"
@@ -20366,6 +20679,9 @@ msgstr "添加斜体文本(%{modifier_key}I)"
msgid "Marked For Deletion At - %{deletion_time}"
msgstr "标记删除于 - %{deletion_time}"
+msgid "Marked as ready. Merging is now allowed."
+msgstr ""
+
msgid "Marked this %{noun} as a draft."
msgstr "已标记此%{noun}为è‰ç¨¿ã€‚"
@@ -20438,54 +20754,24 @@ msgstr "通过在 Mattermost 中输入斜æ å‘½ä»¤ï¼Œä½¿ç”¨æ­¤æœåŠ¡æ‰§è¡Œé¡¹ç›®
msgid "Max 100,000 events"
msgstr "最多100,000个事件"
-msgid "Max 20 characters"
-msgstr "最多20个字符"
-
-msgid "Max Group Export Download requests per minute per user"
-msgstr "æ¯ä¸ªç”¨æˆ·æ¯åˆ†é’Ÿæœ€å¤§ç¾¤ç»„导出下载请求数"
-
-msgid "Max Group Export requests per minute per user"
-msgstr "æ¯ä¸ªç”¨æˆ·æ¯åˆ†é’Ÿæœ€å¤§ç¾¤ç»„导出请求数"
-
-msgid "Max Group Import requests per minute per user"
-msgstr "æ¯ä¸ªç”¨æˆ·æ¯åˆ†é’Ÿæœ€å¤§ç¾¤ç»„导入请求数"
-
-msgid "Max Project Export Download requests per minute per user"
-msgstr "æ¯ä¸ªç”¨æˆ·æ¯åˆ†é’Ÿæœ€å¤§é¡¹ç›®å¯¼å‡ºä¸‹è½½è¯·æ±‚æ•°"
-
-msgid "Max Project Export requests per minute per user"
-msgstr "æ¯ä¸ªç”¨æˆ·æ¯åˆ†é’Ÿæœ€å¤§é¡¹ç›®å¯¼å‡ºè¯·æ±‚æ•°"
-
-msgid "Max Project Import requests per minute per user"
-msgstr "æ¯ä¸ªç”¨æˆ·æ¯åˆ†é’Ÿæœ€å¤§é¡¹ç›®å¯¼å…¥è¯·æ±‚æ•°"
-
-msgid "Max authenticated API requests per period per user"
-msgstr ""
-
msgid "Max authenticated Git LFS requests per period per user"
-msgstr ""
-
-msgid "Max authenticated web requests per period per user"
-msgstr ""
+msgstr "æ¯ä¸ªç”¨æˆ·æ¯ä¸ªæ—¶æœŸçš„最大ç»è¿‡èº«ä»½éªŒè¯çš„ Git LFS 请求"
msgid "Max file size is 200 KB."
msgstr "最大文件大å°ä¸º200 KB。"
-msgid "Max requests per minute per user"
-msgstr "æ¯ä¸ªç”¨æˆ·æ¯åˆ†é’Ÿæœ€å¤§è¯·æ±‚æ•°"
-
msgid "Max role"
msgstr "最大角色"
msgid "Max session time"
msgstr "最大会è¯æ—¶é—´"
-msgid "Max unauthenticated requests per period per IP"
-msgstr ""
-
msgid "MaxBuilds"
msgstr "MaxBuilds"
+msgid "Maximum 20 characters"
+msgstr ""
+
msgid "Maximum Conan package file size in bytes"
msgstr "最大Conan文件包大å°ï¼ˆå­—节)"
@@ -20514,11 +20800,17 @@ msgid "Maximum artifacts size (MB)"
msgstr "最大产物大å°ï¼ˆMB)"
msgid "Maximum attachment size"
-msgstr ""
+msgstr "最大附件大å°"
msgid "Maximum attachment size (MB)"
msgstr "æœ€å¤§é™„ä»¶å¤§å° (MB)"
+msgid "Maximum authenticated API requests per rate limit period per user"
+msgstr ""
+
+msgid "Maximum authenticated web requests per rate limit period per user"
+msgstr ""
+
msgid "Maximum bulk request size (MiB)"
msgstr "最大批é‡è¯·æ±‚大å°(MiB)"
@@ -20535,7 +20827,7 @@ msgid "Maximum delay (Minutes)"
msgstr "最大延迟 (分钟)"
msgid "Maximum diff patch size"
-msgstr ""
+msgstr "最大差异补ä¸å¤§å°"
msgid "Maximum diff patch size (Bytes)"
msgstr "最大差异补ä¸å¤§å°ï¼ˆå­—节)"
@@ -20550,7 +20842,7 @@ msgid "Maximum file size indexed (KiB)"
msgstr "索引的最大文件大å°(KiB)"
msgid "Maximum file size is 1 MB. Image size must be 32 x 32 pixels. Allowed image formats are %{favicon_extension_whitelist}."
-msgstr ""
+msgstr "最大文件大å°ä¸º 1 MB。图片大å°å¿…须为 32 x 32 åƒç´ ã€‚å…许的图åƒæ ¼å¼ä¸º %{favicon_extension_whitelist}。"
msgid "Maximum file size is 1MB. Pages are optimized for a 28px tall header logo"
msgstr "最大文件大å°ä¸º 1MB,页é¢é’ˆå¯¹ 28 åƒç´ é«˜çš„标题LOGO进行了优化"
@@ -20564,14 +20856,23 @@ msgstr "最大文件大å°ä¸º 2MB。请选择一个较å°çš„文件。"
msgid "Maximum files in a diff"
msgstr "差异中的最大文件数"
-msgid "Maximum import size"
+msgid "Maximum group export download requests per minute"
+msgstr ""
+
+msgid "Maximum group export requests per minute"
msgstr ""
+msgid "Maximum group import requests per minute"
+msgstr ""
+
+msgid "Maximum import size"
+msgstr "最大导入大å°"
+
msgid "Maximum import size (MB)"
msgstr "æœ€å¤§å¯¼å…¥å¤§å° (MB)"
msgid "Maximum job artifact size"
-msgstr ""
+msgstr "最大作业产物大å°"
msgid "Maximum job timeout"
msgstr "最大作业超时"
@@ -20600,21 +20901,33 @@ msgstr "å¯ä»¥åŒæ—¶åŒæ­¥çš„最大镜åƒæ•°ã€‚"
msgid "Maximum number of projects."
msgstr "最大项目数é‡ã€‚"
-msgid "Maximum number of unique IPs per user"
-msgstr "æ¯ä¸ªç”¨æˆ·æœ€å¤§å•ä¸€IPæ•°"
+msgid "Maximum number of unique IP addresses per user."
+msgstr ""
msgid "Maximum page reached"
msgstr "已达到最大页é¢"
msgid "Maximum page size"
+msgstr "最大页é¢å¤§å°"
+
+msgid "Maximum project export download requests per minute"
msgstr ""
-msgid "Maximum push size"
+msgid "Maximum project export requests per minute"
msgstr ""
+msgid "Maximum project import requests per minute"
+msgstr ""
+
+msgid "Maximum push size"
+msgstr "最大推é€å¤§å°"
+
msgid "Maximum push size (MB)"
msgstr "最大推é€å¤§å° (MB)"
+msgid "Maximum requests per minute"
+msgstr ""
+
msgid "Maximum running slices"
msgstr "最大è¿è¡Œåˆ‡ç‰‡"
@@ -20637,15 +20950,21 @@ msgid "Maximum size of pages (MB)"
msgstr "最大页é¢å¤§å°ï¼ˆMB)"
msgid "Maximum snippet size"
-msgstr ""
+msgstr "最大代ç ç‰‡æ®µå¤§å°"
msgid "Maximum time between updates that a mirror can have when scheduled to synchronize."
msgstr "åŒæ­¥é•œåƒè®¡åˆ’的最大时间间隔。"
-msgid "Maximum time for web terminal websocket connection (in seconds). 0 for unlimited."
-msgstr "Web 终端 websocket 连接的最长时间(以秒为å•ä½ï¼‰ï¼Œ 0 表示无é™åˆ¶ã€‚"
-
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 "å…许用户跳过åŒé‡èº«ä»½éªŒè¯çš„最长时间(以å°æ—¶ä¸ºå•ä½ï¼‰ã€‚设置为 0(零)以在下次登录时强制执行。"
+
+msgid "Maximum time, in seconds, for a web terminal websocket connection. 0 for unlimited."
+msgstr ""
+
+msgid "Maximum unauthenticated API requests per rate limit period per IP"
+msgstr ""
+
+msgid "Maximum unauthenticated web requests per rate limit period per IP"
msgstr ""
msgid "May"
@@ -20658,14 +20977,11 @@ msgid "Measured in bytes of code. Excludes generated and vendored code."
msgstr "以代ç å­—节为å•ä½ã€‚排除生æˆçš„代ç å’Œä¾›åº”商代ç ã€‚"
msgid "Medium timeout"
-msgstr ""
+msgstr "中等超时"
msgid "Medium vulnerabilities present"
msgstr "存在中å±æ¼æ´ž"
-msgid "Member lock"
-msgstr "æˆå‘˜é”"
-
msgid "Member since"
msgstr "æˆå‘˜è‡ª"
@@ -20679,7 +20995,7 @@ msgid "MemberInviteEmail|%{member_name} invited you to join GitLab"
msgstr "%{member_name}邀请您使用GitLab"
msgid "MemberInviteEmail|I've invited you to join me in GitLab"
-msgstr ""
+msgstr "我邀请您加入GitLab"
msgid "MemberInviteEmail|Invitation to join the %{project_or_group} %{project_or_group_name}"
msgstr "邀请加入%{project_or_group}%{project_or_group_name}"
@@ -20702,6 +21018,9 @@ msgstr "%{group}çš„æˆå‘˜ä¹Ÿå¯ä»¥æŽ¨é€åˆ°æ­¤åˆ†æ”¯: %{branch}"
msgid "Members of a group may only view projects they have permission to access"
msgstr "群组æˆå‘˜åªèƒ½æŸ¥çœ‹ä»–们有æƒè®¿é—®çš„项目"
+msgid "Membership"
+msgstr ""
+
msgid "Members|%{time} by %{user}"
msgstr "于%{time}由%{user}"
@@ -20762,9 +21081,6 @@ msgstr "æˆåŠŸåˆ é™¤è¿‡æœŸæ—¥æœŸã€‚"
msgid "Members|Expiration date updated successfully."
msgstr "æˆåŠŸæ›´æ–°è¿‡æœŸæ—¥æœŸã€‚"
-msgid "Members|Expired"
-msgstr "已过期"
-
msgid "Members|Filter members"
msgstr "筛选æˆå‘˜"
@@ -20780,9 +21096,6 @@ msgstr "离开\"%{source}\""
msgid "Members|Membership"
msgstr "æˆå‘˜"
-msgid "Members|No expiration set"
-msgstr "没有过期设置"
-
msgid "Members|Remove \"%{groupName}\""
msgstr "删除\"%{groupName}\""
@@ -20804,9 +21117,6 @@ msgstr "æœç´¢ç¾¤ç»„"
msgid "Members|Search invited"
msgstr "æœç´¢å·²é‚€è¯·"
-msgid "Members|in %{time}"
-msgstr "于%{time}åŽ"
-
msgid "Member|Deny access"
msgstr "æ‹’ç»è®¿é—®"
@@ -20850,7 +21160,7 @@ msgid "Merge automatically (%{strategy})"
msgstr "自动åˆå¹¶(%{strategy})"
msgid "Merge blocked: new changes were just added."
-msgstr ""
+msgstr "åˆå¹¶è¢«é˜»æ­¢ï¼šåˆšåˆšæ·»åŠ äº†æ–°çš„更改。"
msgid "Merge blocked: the source branch must be rebased onto the target branch."
msgstr "åˆå¹¶å—阻:æºåˆ†æ”¯å¿…é¡»å˜åŸºï¼ˆrebase)到目标分支。"
@@ -20882,9 +21192,6 @@ msgstr "åˆå¹¶è¯·æ±‚"
msgid "Merge request %{mr_link} was reviewed by %{mr_author}"
msgstr "åˆå¹¶è¯·æ±‚%{mr_link}已被%{mr_author}审核"
-msgid "Merge request (MR) approvals"
-msgstr "åˆå¹¶è¯·æ±‚ (MR) 核准"
-
msgid "Merge request analytics"
msgstr "åˆå¹¶è¯·æ±‚分æž"
@@ -20906,12 +21213,21 @@ msgstr "åˆå¹¶è¯·æ±‚已安排在æµæ°´çº¿æˆåŠŸåŽåˆå¹¶"
msgid "Merge requests"
msgstr "åˆå¹¶è¯·æ±‚"
+msgid "Merge requests I've created"
+msgstr ""
+
msgid "Merge requests are a place to propose changes you've made to a project and discuss those changes with others"
msgstr "åˆå¹¶è¯·æ±‚用于æ出对项目的更改并与他人进行讨论"
msgid "Merge requests are read-only in a secondary Geo node"
msgstr "åˆå¹¶è¯·æ±‚在Geo次è¦èŠ‚点中为åªè¯»"
+msgid "Merge requests assigned to me"
+msgstr ""
+
+msgid "Merge requests that I'm a reviewer"
+msgstr ""
+
msgid "Merge the branch and fix any conflicts that come up"
msgstr "åˆå¹¶åˆ†æ”¯å¹¶è§£å†³å‡ºçŽ°çš„任何冲çª"
@@ -20972,12 +21288,12 @@ msgstr "选择评论起始行"
msgid "MergeRequests|An error occurred while saving the draft comment."
msgstr "ä¿å­˜è¯„论è‰ç¨¿æ—¶å‘生错误。"
+msgid "MergeRequests|Create issue to resolve thread"
+msgstr ""
+
msgid "MergeRequests|Failed to squash. Should be done manually."
msgstr "无法压缩(Squash)。应该手动完æˆã€‚"
-msgid "MergeRequests|Resolve this thread in a new issue"
-msgstr "创建新议题以解决此主题"
-
msgid "MergeRequests|Saving the comment failed"
msgstr "ä¿å­˜è¯„论失败"
@@ -21265,7 +21581,7 @@ msgid "Metrics|For grouping similar metrics"
msgstr "用于分组类似指标"
msgid "Metrics|GitLab-managed Prometheus is deprecated and %{linkStart}scheduled for removal%{linkEnd}. Following this removal, your existing alerts will continue to function as part of the new cluster integration. However, you will no longer be able to add new alerts or edit existing alerts from the metrics dashboard."
-msgstr ""
+msgstr "GitLab 管ç†çš„ Prometheus 已弃用, %{linkStart}计划删除%{linkEnd}。移除åŽï¼Œæ‚¨çŽ°æœ‰çš„警报将继续作为新集群集æˆçš„一部分å‘挥作用。但是,您将无法å†ä»ŽæŒ‡æ ‡ä»ªè¡¨æ¿æ·»åŠ æ–°è­¦æŠ¥æˆ–编辑现有警报。"
msgid "Metrics|Invalid time range, please verify."
msgstr "无效的时间范围,请验è¯ã€‚"
@@ -21644,7 +21960,7 @@ msgid "Miscellaneous"
msgstr "æ‚项"
msgid "Missing"
-msgstr ""
+msgstr "丢失"
msgid "Missing OAuth configuration for GitHub."
msgstr "缺少GitHubçš„OAuthé…置。"
@@ -21734,7 +22050,7 @@ msgid "More information and share feedback"
msgstr "更多信æ¯å’Œå…±äº«å馈"
msgid "More information is available|here"
-msgstr ""
+msgstr "这里"
msgid "More information."
msgstr "更多信æ¯ã€‚"
@@ -21787,6 +22103,9 @@ msgstr "由于æƒé™ä¸è¶³è€Œæ— æ³•ç§»åŠ¨è®®é¢˜!"
msgid "MoveIssue|Cannot move issue to project it originates from!"
msgstr "无法将议题移动到æºé¡¹ç›®ä¸­!"
+msgid "MoveIssue|Cannot move issues of '%{issue_type}' type."
+msgstr ""
+
msgid "Moved issue to %{label} column in the board."
msgstr "将议题移动到看æ¿ä¸­çš„%{label}列。"
@@ -21833,13 +22152,13 @@ msgid "Multiple uploaders found: %{uploader_types}"
msgstr "找到多个上传器: %{uploader_types}"
msgid "Multiplier to apply to polling intervals. Decimal values are supported. Defaults to 1."
-msgstr ""
+msgstr "应用于轮询间隔的乘数。支æŒå进制值。默认为 1。"
msgid "Must match with the %{codeStart}external_url%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}."
msgstr "必须匹é…%{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}中的%{codeStart}external_url%{codeEnd}。"
msgid "Must match with the %{codeStart}geo_node_name%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}. %{linkStart}Learn more%{linkEnd}"
-msgstr ""
+msgstr "必须与 %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd} 中的 %{codeStart}geo_node_name%{codeEnd} 匹é…。%{linkStart}了解更多%{linkEnd}"
msgid "My Awesome Group"
msgstr "My Awesome Group"
@@ -21911,6 +22230,15 @@ 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. To learn more about reducing storage capacity please visit our docs."
msgstr "推é€åˆ°æ‚¨çš„仓库ã€åˆ›å»ºæµæ°´çº¿ã€åˆ›å»ºè®®é¢˜æˆ–添加评论。è¦å‡å°‘存储容é‡ï¼Œè¯·åˆ é™¤æœªä½¿ç”¨çš„仓库ã€äº§ç‰©ã€wikiã€è®®é¢˜å’Œæµæ°´çº¿ã€‚è¦äº†è§£æœ‰å…³å‡å°‘存储容é‡çš„更多信æ¯ï¼Œè¯·è®¿é—®æˆ‘们的文档。"
+msgid "NamespaceUserCap|Pending users must be reviewed and approved by a group owner. Learn more about %{user_caps_link_start}User Caps%{link_end} and %{users_pending_approval_link_start}Users Pending Approval%{link_end}."
+msgstr ""
+
+msgid "NamespaceUserCap|View pending user approvals"
+msgstr ""
+
+msgid "NamespaceUserCap|Your group has reached its billable member limit"
+msgstr ""
+
msgid "Namespaces"
msgstr "命å空间"
@@ -21953,9 +22281,6 @@ msgstr "需è¦å…³æ³¨"
msgid "Network"
msgstr "网络"
-msgid "Network Policy|New rule"
-msgstr "新建规则"
-
msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is inbound from a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
msgstr "%{ifLabelStart}如果%{ifLabelEnd}%{ruleType}%{isLabelStart}为%{isLabelEnd}%{ruleDirection}%{ruleSelector}%{directionLabelStart}且由%{directionLabelEnd}%{rule}%{portsLabelStart}在%{portsLabelEnd} %{ports}传入。"
@@ -21977,20 +22302,17 @@ msgstr "%{strongOpen}所有%{strongClose}pod"
msgid "NetworkPolicies|%{strongOpen}any%{strongClose} port"
msgstr "%{strongOpen}任何%{strongClose}端å£"
-msgid "NetworkPolicies|+ Add alert"
-msgstr "+ 添加警报"
-
msgid "NetworkPolicies|.yaml"
msgstr ".yaml"
msgid "NetworkPolicies|.yaml mode"
msgstr ".yaml模å¼"
-msgid "NetworkPolicies|Actions"
-msgstr "动作"
+msgid "NetworkPolicies|Add alert"
+msgstr ""
msgid "NetworkPolicies|Alerts are intended to be selectively used for a limited number of events that are potentially concerning and warrant a manual review. Alerts should not be used as a substitute for a SIEM or a logging tool. High volume alerts are likely to be dropped so as to preserve the stability of GitLab's integration with Kubernetes."
-msgstr ""
+msgstr "警报是为了有选择地用于少数å¯èƒ½æ¶‰åŠå¹¶éœ€è¦äººå·¥å®¡æŸ¥çš„事件。ä¸åº”将警报用作 SIEM 或记录工具的替代å“。为了ä¿æŒGitLab与Kubernetes一体化的稳定性,å¯èƒ½ä¼šæ”¾å¼ƒå¤§é‡è­¦æŠ¥ã€‚"
msgid "NetworkPolicies|All selected"
msgstr "全选"
@@ -22022,9 +22344,6 @@ msgstr "删除策略: %{policy}"
msgid "NetworkPolicies|Deny all traffic"
msgstr "æ‹’ç»æ‰€æœ‰æµé‡"
-msgid "NetworkPolicies|Description"
-msgstr "æè¿°"
-
msgid "NetworkPolicies|Edit policy"
msgstr "编辑策略"
@@ -22037,9 +22356,6 @@ msgstr "环境没有部署平å°"
msgid "NetworkPolicies|IP/subnet"
msgstr "IP/å­ç½‘"
-msgid "NetworkPolicies|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
-msgstr "如果您正在使用Auto DevOps,并在此处改å˜äº†ç­–略,您的%{monospacedStart}auto-deploy-values.yaml%{monospacedEnd}文件将ä¸ä¼šè¢«æ›´æ–°ã€‚Auto DevOps用户需è¦æŒ‰ç…§%{linkStart}容器网络策略文档%{linkEnd}进行修改。"
-
msgid "NetworkPolicies|Invalid or empty policy"
msgstr "无效或空策略"
@@ -22049,20 +22365,17 @@ msgstr "无效或ä¸æ”¯æŒçš„策略类型"
msgid "NetworkPolicies|Kubernetes error: %{error}"
msgstr "Kubernetes错误: %{error}"
-msgid "NetworkPolicies|Name"
-msgstr "å称"
-
msgid "NetworkPolicies|Network"
msgstr "网络"
-msgid "NetworkPolicies|Network traffic"
-msgstr "网络æµé‡"
+msgid "NetworkPolicies|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
+msgstr ""
-msgid "NetworkPolicies|New policy"
-msgstr "新建策略"
+msgid "NetworkPolicies|Network policy can be created after the environment is loaded successfully."
+msgstr ""
-msgid "NetworkPolicies|No policies detected"
-msgstr "未检测到策略"
+msgid "NetworkPolicies|Network traffic"
+msgstr "网络æµé‡"
msgid "NetworkPolicies|None selected"
msgstr "未选择"
@@ -22070,21 +22383,12 @@ msgstr "未选择"
msgid "NetworkPolicies|Please %{installLinkStart}install%{installLinkEnd} and %{configureLinkStart}configure a Kubernetes Agent for this project%{configureLinkEnd} to enable alerts."
msgstr "请%{installLinkStart}安装%{installLinkEnd}并%{configureLinkStart}为该项目é…ç½® Kubernetes 代ç†%{configureLinkEnd}以å¯ç”¨è­¦æŠ¥ã€‚"
-msgid "NetworkPolicies|Policies are a specification of how groups of pods are allowed to communicate with each other's network endpoints."
-msgstr "策略具体定义了pod组如何与其他组中的pod进行网络端点通信。"
-
msgid "NetworkPolicies|Policy %{policyName} was successfully changed"
msgstr "å·²æˆåŠŸæ›´æ”¹ç­–ç•¥%{policyName}"
msgid "NetworkPolicies|Policy definition"
msgstr "策略定义"
-msgid "NetworkPolicies|Policy editor"
-msgstr "策略编辑"
-
-msgid "NetworkPolicies|Policy preview"
-msgstr "策略预览"
-
msgid "NetworkPolicies|Rule"
msgstr "规则"
@@ -22094,9 +22398,6 @@ msgstr "规则模å¼"
msgid "NetworkPolicies|Rule mode is unavailable for this policy. In some cases, we cannot parse the YAML file back into the rules editor."
msgstr "规则模å¼æ— æ³•ç”¨äºŽæ­¤ç­–略。在æŸäº›æƒ…况下,我们无法将YAML文件解æžå›žåˆ°è§„则编辑器中。"
-msgid "NetworkPolicies|Rules"
-msgstr "规则"
-
msgid "NetworkPolicies|Save changes"
msgstr "ä¿å­˜æ›´æ”¹"
@@ -22109,9 +22410,6 @@ msgstr "出现错误,无法获å–ç­–ç•¥"
msgid "NetworkPolicies|Traffic that does not match any rule will be blocked."
msgstr "ä¸åŒ¹é…任何规则的æµé‡å°†è¢«é˜»æ­¢ã€‚"
-msgid "NetworkPolicies|Unable to parse policy"
-msgstr "无法解æžç­–ç•¥"
-
msgid "NetworkPolicies|all DNS names"
msgstr "所有DNS域å"
@@ -22290,6 +22588,9 @@ msgstr "新建身份标识"
msgid "New issue"
msgstr "新建议题"
+msgid "New issue in %{project}"
+msgstr ""
+
msgid "New issue title"
msgstr "新议题标题"
@@ -22368,11 +22669,11 @@ msgstr "新建..."
msgid "Newest first"
msgstr "最新在å‰"
-msgid "Newly registered users will by default be external"
-msgstr "默认情况下,新注册的用户将是外部用户"
+msgid "Newly-registered users are external by default"
+msgstr ""
msgid "Next"
-msgstr "下一页"
+msgstr "Next"
msgid "Next commit"
msgstr "下一次æ交"
@@ -22429,7 +22730,7 @@ msgid "No approvers"
msgstr "没有核准人"
msgid "No artifacts found"
-msgstr ""
+msgstr "未找到产物"
msgid "No assignee"
msgstr "无指派人"
@@ -22683,8 +22984,9 @@ msgstr "æ— æ¼æ´ž"
msgid "No webhooks found, add one in the form above."
msgstr "没有找到Webhook,请通过上é¢è¡¨å•æ·»åŠ ã€‚"
-msgid "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} to renew your subscription."
-msgstr "ä¸ç”¨æ‹…心,您现在ä»ç„¶å¯ä»¥ä½¿ç”¨%{strong}%{plan_name}%{strong_close}的所有功能。您有%{remaining_days}æ¥æ›´æ–°æ‚¨çš„订阅。"
+msgid "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} day to renew your subscription."
+msgid_plural "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} days to renew your subscription."
+msgstr[0] ""
msgid "No. of commits"
msgstr "æ交次数"
@@ -22701,8 +23003,8 @@ msgstr "节点已æˆåŠŸæ›´æ–°ã€‚"
msgid "Nodes"
msgstr "节点"
-msgid "Non-admin users can sign in with read-only access and make read-only API requests."
-msgstr "éžç®¡ç†å‘˜ç”¨æˆ·å¯ä»¥ä½¿ç”¨åªè¯»æƒé™ç™»å½•å¹¶å‘èµ·åªè¯»çš„API请求。"
+msgid "Non-admin users are restricted to read-only access, in both GitLab UI and API."
+msgstr ""
msgid "None"
msgstr "æ— "
@@ -22782,8 +23084,8 @@ msgstr "æ示:如GitLab管ç†å‘˜é…ç½® %{github_integration_link},将å…许
msgid "NoteForm|Note"
msgstr "注æ„"
-msgid "Notes Rate Limits"
-msgstr "备注速率é™åˆ¶"
+msgid "Notes rate limit"
+msgstr ""
msgid "Notes|Are you sure you want to cancel creating this comment?"
msgstr "确定è¦å–消此评论å—?"
@@ -22945,11 +23247,8 @@ msgstr "11月"
msgid "November"
msgstr "11月"
-msgid "Novice"
-msgstr "新手"
-
msgid "Now, personalize your GitLab experience"
-msgstr ""
+msgstr "现在,个性化您的 GitLab 体验"
msgid "Nuget metadatum must have at least license_url, project_url or icon_url set"
msgstr "Nuget元数æ®å¿…须至少设置了license_url,project_url或icon_url"
@@ -23081,7 +23380,7 @@ msgid "OnCallSchedules|Collapse schedule"
msgstr "折å è®¡åˆ’"
msgid "OnCallSchedules|Create on-call schedules in GitLab"
-msgstr ""
+msgstr "在GitLab中创建 on-call 计划"
msgid "OnCallSchedules|Currently no rotation."
msgstr "ç›®å‰æ²¡æœ‰è½®æ¢ã€‚"
@@ -23116,8 +23415,8 @@ msgstr "编辑计划失败"
msgid "OnCallSchedules|For this rotation, on-call will be:"
msgstr "对于这个循环,待命计划将是:"
-msgid "OnCallSchedules|On-call schedule %{schedule} in Project %{project}"
-msgstr "项目 %{project} 的待命计划 %{schedule}"
+msgid "OnCallSchedules|On-call schedule %{obstacle} in Project %{project}"
+msgstr ""
msgid "OnCallSchedules|On-call schedules"
msgstr "待命计划"
@@ -23263,24 +23562,24 @@ msgstr "扫æå称"
msgid "OnDemandScans|Scanner profile"
msgstr "扫æ工具é…ç½®"
+msgid "OnDemandScans|Schedule scan"
+msgstr ""
+
msgid "OnDemandScans|Select one of the existing profiles"
msgstr "选择一个现有的é…置文件"
msgid "OnDemandScans|Site profile"
msgstr "站点é…ç½®"
+msgid "OnDemandScans|Start time"
+msgstr ""
+
msgid "OnDemandScans|Use existing scanner profile"
msgstr "使用现有的站点é…ç½®"
msgid "OnDemandScans|Use existing site profile"
msgstr "使用现有的站点é…置文件"
-msgid "OnDemandScans|You can either choose a passive scan or validate the target site in your chosen site profile. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
-msgstr "您å¯ä»¥è¿›è¡Œè¢«åŠ¨æ‰«æ或验è¯æ‚¨é€‰æ‹©çš„站点é…置中的目标网站。%{docsLinkStart}了解更多关于站点验è¯çš„ä¿¡æ¯ã€‚%{docsLinkEnd}"
-
-msgid "OnDemandScans|You cannot run an active scan against an unvalidated site."
-msgstr "您ä¸èƒ½å¯¹æœªéªŒè¯çš„网站上è¿è¡Œä¸»åŠ¨æ‰«æ。"
-
msgid "OnDemandScans|You must create a repository within your project to run an on-demand scan."
msgstr "您必须在项目中创建仓库æ‰èƒ½è¿è¡ŒæŒ‰éœ€æ‰«æ。"
@@ -23325,7 +23624,7 @@ msgid "One or more of your personal access tokens will expire in %{days_to_expir
msgstr "您的一个或多个个人访问令牌将在 %{days_to_expire} 天或更短的时间内到期:"
msgid "Only 'Reporter' roles and above on tiers Premium and above can see Value Stream Analytics."
-msgstr ""
+msgstr "åªæœ‰åœ¨ä¸“业版åŠä»¥ä¸Šç‰ˆæœ¬ä¸­ï¼Œâ€œæŠ¥å‘Šè€…â€åŠä»¥ä¸Šè§’色æ‰èƒ½çœ‹åˆ°ä»·å€¼æµåˆ†æžã€‚"
msgid "Only 1 appearances row can exist"
msgstr "åªèƒ½å­˜åœ¨ä¸€ä¸ªå¤–观行"
@@ -23342,6 +23641,9 @@ msgstr "仅活动的项目显示在æœç´¢å’Œä»ªè¡¨æ¿ä¸Šã€‚"
msgid "Only admins can delete project"
msgstr "åªæœ‰ç®¡ç†å‘˜å¯ä»¥åˆ é™¤é¡¹ç›®"
+msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
+msgstr ""
+
msgid "Only include features new to your current subscription tier."
msgstr "仅包括您当å‰è®¢é˜…级别的新功能。"
@@ -23360,11 +23662,17 @@ msgstr "仅导入项目æˆå‘˜ã€‚群组æˆå‘˜å°†è¢«è·³è¿‡ã€‚"
msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr "åªæœ‰åœ¨æ——舰版许å¯ä¸‹åˆ›å»ºçš„项目æ‰èƒ½åœ¨å®‰å…¨ä»ªè¡¨æ¿ä¸­ä½¿ç”¨ã€‚"
+msgid "Only reCAPTCHA v2 is supported:"
+msgstr ""
+
+msgid "Only users from the specified IP address ranges are able to reach this group, including all subgroups, projects, and Git repositories."
+msgstr ""
+
msgid "Only verified users with an email address in any of these domains can be added to the group."
msgstr "åªæœ‰å…·æœ‰è¿™äº›åŸŸå电å­é‚®ä»¶åœ°å€çš„已验è¯ç”¨æˆ·æ‰èƒ½æ·»åŠ åˆ°ç¾¤ç»„。"
msgid "Only ‘Reporter’ roles and above on tiers Premium and above can see Productivity Analytics."
-msgstr ""
+msgstr "åªæœ‰åœ¨ä¸“业版åŠä»¥ä¸Šç‰ˆæœ¬ä¸­ï¼Œâ€œæŠ¥å‘Šè€…â€åŠä»¥ä¸Šè§’色æ‰èƒ½çœ‹åˆ°ç”Ÿäº§åŠ›åˆ†æžã€‚"
msgid "Oops, are you sure?"
msgstr "å•Š~~, 确定å—?"
@@ -23376,7 +23684,7 @@ msgid "Open Selection"
msgstr "打开所选项"
msgid "Open a CLI and connect to the cluster you want to install the Agent in. Use this installation method to minimize any manual steps. The token is already included in the command."
-msgstr ""
+msgstr "打开 CLI 并连接到您想è¦å®‰è£…代ç†çš„集群。使用此安装方法æ¥æœ€å°åŒ–任何手动步骤。令牌已ç»åŒ…å«åœ¨å‘½ä»¤ä¸­ã€‚"
msgid "Open comment type dropdown"
msgstr "打开评论类型下拉列表"
@@ -23546,9 +23854,6 @@ msgstr "所有者"
msgid "Package Registry"
msgstr "软件包注册表"
-msgid "Package Registry Rate Limits"
-msgstr "软件包仓库速率é™åˆ¶"
-
msgid "Package Registry: authenticated API requests"
msgstr "软件包库:ç»è¿‡èº«ä»½éªŒè¯çš„ API 请求"
@@ -23567,9 +23872,12 @@ msgstr "软件包文件大å°é™åˆ¶"
msgid "Package recipe already exists"
msgstr "软件包构æˆå·²å­˜åœ¨"
-msgid "Package type"
+msgid "Package registry rate limits"
msgstr ""
+msgid "Package type"
+msgstr "包类型"
+
msgid "Package type must be Conan"
msgstr "包类型必须是Conan"
@@ -23633,6 +23941,9 @@ msgstr "ç”±%{author}在%{datetime}触å‘çš„æµæ°´çº¿%{link}所构建"
msgid "PackageRegistry|Composer"
msgstr "Composer"
+msgid "PackageRegistry|Composer.json with license: %{license} and version: %{version}"
+msgstr ""
+
msgid "PackageRegistry|Conan"
msgstr "Conan"
@@ -23696,6 +24007,9 @@ msgstr "å¤åˆ¶æ³¨å†Œè¡¨åŒ…å«"
msgid "PackageRegistry|Copy require package include"
msgstr "å¤åˆ¶æ‰€éœ€çš„软件包并包å«"
+msgid "PackageRegistry|Copy target SHA"
+msgstr ""
+
msgid "PackageRegistry|Copy yarn command"
msgstr "å¤åˆ¶yarn命令"
@@ -23762,6 +24076,9 @@ msgstr "如果尚未é…置,需è¦å°†ä»¥ä¸‹å†…容添加到%{codeStart}pom.xml%{
msgid "PackageRegistry|Install package version"
msgstr "安装软件包版本"
+msgid "PackageRegistry|Instance-level"
+msgstr ""
+
msgid "PackageRegistry|Invalid Package: failed metadata extraction"
msgstr "无效的软件包:元数æ®æå–失败"
@@ -23807,6 +24124,9 @@ msgstr "软件包由分支%{branch}上的%{link}æ交所更新,由æµæ°´çº¿%{
msgid "PackageRegistry|Pip Command"
msgstr "Pip命令"
+msgid "PackageRegistry|Project-level"
+msgstr ""
+
msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
msgstr "å‘布和分享å„ç§å¸¸è§çš„软件包管ç†å·¥å…·æ”¯æŒçš„软件包。 %{docLinkStart}更多信æ¯%{docLinkEnd}"
@@ -23828,6 +24148,9 @@ msgstr "仓库设置"
msgid "PackageRegistry|Remove package"
msgstr "删除软件包"
+msgid "PackageRegistry|Required Python: %{pythonVersion}"
+msgstr ""
+
msgid "PackageRegistry|RubyGems"
msgstr "RubyGems"
@@ -23870,6 +24193,9 @@ msgstr "对ä¸èµ·ï¼Œæ²¡æœ‰ç¬¦åˆç­›é€‰å™¨çš„任何结果"
msgid "PackageRegistry|Source project located at %{link}"
msgstr "æºé¡¹ç›®ä½äºŽ%{link}"
+msgid "PackageRegistry|Target SHA: %{sha}"
+msgstr ""
+
msgid "PackageRegistry|There are no other versions of this package."
msgstr "此软件包没有其他版本。"
@@ -23928,7 +24254,7 @@ msgid "PagerDutySettings|Active"
msgstr "å¯ç”¨"
msgid "PagerDutySettings|Create a GitLab incident for each PagerDuty incident by %{linkStart}configuring a webhook in PagerDuty%{linkEnd}"
-msgstr ""
+msgstr "通过%{linkStart}在 PagerDuty 中é…ç½® webhook%{linkEnd},为æ¯ä¸ª PagerDuty 事件创建 GitLab 事件"
msgid "PagerDutySettings|Failed to update Webhook URL"
msgstr "æ›´æ–°Webhook网å€å¤±è´¥"
@@ -24038,6 +24364,18 @@ msgstr "密ç ä¿®æ”¹æˆåŠŸ"
msgid "Password was successfully updated. Please sign in again."
msgstr "密ç æ›´æ–°æˆåŠŸã€‚请é‡æ–°ç™»å½•ã€‚"
+msgid "PasswordPrompt|Confirm password"
+msgstr ""
+
+msgid "PasswordPrompt|Confirm password to continue"
+msgstr ""
+
+msgid "PasswordPrompt|Password is required"
+msgstr ""
+
+msgid "PasswordPrompt|Please enter your password to confirm"
+msgstr ""
+
msgid "Passwords should be unique and not used for any other sites or services."
msgstr "密ç åº”唯一并未用于任何其他网站或æœåŠ¡ã€‚"
@@ -24063,6 +24401,9 @@ msgid "Paste issue link"
msgstr "粘贴议题链接"
msgid "Paste project path (i.e. gitlab-org/gitlab)"
+msgstr "粘贴项目路径(å³gitlab-org/gitlab)"
+
+msgid "Paste this DSN into your Sentry SDK"
msgstr ""
msgid "Paste your public SSH key, which is usually contained in the file '~/.ssh/id_ed25519.pub' or '~/.ssh/id_rsa.pub' and begins with 'ssh-ed25519' or 'ssh-rsa'. Do not paste your private SSH key, as that can compromise your identity."
@@ -24147,6 +24488,9 @@ msgid "PerformanceBar|External Http calls"
msgstr "外部 Http 调用"
msgid "PerformanceBar|First Contentful Paint"
+msgstr "第一次内容绘制"
+
+msgid "PerformanceBar|Flamegraph with mode:"
msgstr ""
msgid "PerformanceBar|Frontend resources"
@@ -24182,6 +24526,15 @@ msgstr "总æŒç»­æ—¶é—´"
msgid "PerformanceBar|Trace"
msgstr "跟踪"
+msgid "PerformanceBar|cpu"
+msgstr ""
+
+msgid "PerformanceBar|object"
+msgstr ""
+
+msgid "PerformanceBar|wall"
+msgstr ""
+
msgid "Period in seconds"
msgstr "周期(秒)"
@@ -24410,6 +24763,48 @@ msgstr "目标"
msgid "PipelineSchedules|Variables"
msgstr "å˜é‡"
+msgid "PipelineSource|API"
+msgstr ""
+
+msgid "PipelineSource|Chat"
+msgstr ""
+
+msgid "PipelineSource|External"
+msgstr ""
+
+msgid "PipelineSource|External Pull Request"
+msgstr ""
+
+msgid "PipelineSource|Merge Request"
+msgstr ""
+
+msgid "PipelineSource|On-Demand DAST Scan"
+msgstr ""
+
+msgid "PipelineSource|On-Demand DAST Validation"
+msgstr ""
+
+msgid "PipelineSource|Parent Pipeline"
+msgstr ""
+
+msgid "PipelineSource|Pipeline"
+msgstr ""
+
+msgid "PipelineSource|Push"
+msgstr ""
+
+msgid "PipelineSource|Schedule"
+msgstr ""
+
+msgid "PipelineSource|Trigger"
+msgstr ""
+
+msgid "PipelineSource|Web"
+msgstr ""
+
+msgid "PipelineSource|Web IDE"
+msgstr ""
+
msgid "PipelineStatusTooltip|Pipeline: %{ciStatus}"
msgstr "æµæ°´çº¿ï¼š%{ciStatus}"
@@ -24684,7 +25079,7 @@ msgid "Pipeline|Pipeline"
msgstr "æµæ°´çº¿"
msgid "Pipeline|Pipeline %{idStart}#%{idEnd} %{statusStart}%{statusEnd} for %{commitStart}%{commitEnd}"
-msgstr ""
+msgstr "æµæ°´çº¿ %{idStart}#%{idEnd} %{statusStart}%{statusEnd} for %{commitStart}%{commitEnd}"
msgid "Pipeline|Pipeline cannot be run."
msgstr "æµæ°´çº¿æ— æ³•è¿è¡Œã€‚"
@@ -24708,48 +25103,9 @@ msgid "Pipeline|Skipped"
msgstr "已跳过"
msgid "Pipeline|Source"
-msgstr ""
-
-msgid "Pipeline|Source|API"
-msgstr ""
-
-msgid "Pipeline|Source|Chat"
-msgstr ""
-
-msgid "Pipeline|Source|External"
-msgstr ""
-
-msgid "Pipeline|Source|External Pull Request"
-msgstr ""
-
-msgid "Pipeline|Source|Merge Request"
-msgstr ""
-
-msgid "Pipeline|Source|On-Demand DAST Scan"
-msgstr ""
-
-msgid "Pipeline|Source|On-Demand DAST Validation"
-msgstr ""
-
-msgid "Pipeline|Source|Parent Pipeline"
-msgstr ""
-
-msgid "Pipeline|Source|Pipeline"
-msgstr ""
+msgstr "æ¥æº"
-msgid "Pipeline|Source|Push"
-msgstr ""
-
-msgid "Pipeline|Source|Schedule"
-msgstr ""
-
-msgid "Pipeline|Source|Trigger"
-msgstr ""
-
-msgid "Pipeline|Source|Web"
-msgstr ""
-
-msgid "Pipeline|Source|Web IDE"
+msgid "Pipeline|Source|Security Policy"
msgstr ""
msgid "Pipeline|Specify variable values to be used in this run. The values specified in %{linkStart}CI/CD settings%{linkEnd} will be used by default."
@@ -24800,8 +25156,8 @@ msgstr "查看æµæ°´çº¿"
msgid "Pipeline|We are currently unable to fetch pipeline data"
msgstr "我们目å‰æ— æ³•èŽ·å–æµæ°´çº¿æ•°æ®"
-msgid "Pipeline|You’re about to stop pipeline %{pipelineId}."
-msgstr "å³å°†åœæ­¢æµæ°´çº¿ %{pipelineId}。"
+msgid "Pipeline|You’re about to stop pipeline #%{pipelineId}."
+msgstr ""
msgid "Pipeline|for"
msgstr "使用æ交"
@@ -24827,6 +25183,9 @@ msgstr "Pivotal Tracker API 令牌。用户必须有æƒè®¿é—®æ•…事。所有评è
msgid "Plain diff"
msgstr "文本差异"
+msgid "Plain-text response to send to clients that hit a rate limit"
+msgstr ""
+
msgid "Plan:"
msgstr "计划:"
@@ -24971,9 +25330,6 @@ msgstr "请æ供有效的电å­é‚®ä»¶åœ°å€ã€‚"
msgid "Please provide attributes to update"
msgstr "请æä¾›è¦æ›´æ–°çš„属性"
-msgid "Please provide your username or email address."
-msgstr "请æ供您的用户å或电å­é‚®ä»¶åœ°å€ã€‚"
-
msgid "Please reach out if you have any questions and we'll be happy to assist."
msgstr "如果您有任何疑问,请è”系我们,我们将竭诚为您æœåŠ¡ã€‚"
@@ -25016,9 +25372,6 @@ msgstr "请选择..."
msgid "Please set a new password before proceeding."
msgstr "请设置新密ç ä»¥ç»§ç»­ä¸‹ä¸€æ­¥ã€‚"
-msgid "Please share your feedback about %{featureName} %{linkStart}in this issue%{linkEnd} to help us improve the experience."
-msgstr "请在%{linkStart}此议题中%{linkEnd}分享您对%{featureName}çš„å馈,以帮助我们改善体验。"
-
msgid "Please solve the captcha"
msgstr "请处ç†éªŒè¯ç "
@@ -25196,9 +25549,12 @@ msgstr "上一页"
msgid "Prevent adding new members to project membership within this group"
msgstr "ç¦æ­¢å‘当å‰ç¾¤ç»„中的项目添加新æˆå‘˜"
-msgid "Prevent editing approval rules in projects and merge requests."
+msgid "Prevent auto-stopping"
msgstr ""
+msgid "Prevent editing approval rules in projects and merge requests."
+msgstr "ç¦æ­¢åœ¨é¡¹ç›®å’Œåˆå¹¶è¯·æ±‚中编辑审批规则。"
+
msgid "Prevent environment from auto-stopping"
msgstr "防止环境自动终止"
@@ -25208,8 +25564,8 @@ msgstr "阻止项目派生到当å‰ç¾¤ç»„以外"
msgid "Prevent users from changing their profile name"
msgstr "ç¦æ­¢ç”¨æˆ·æ›´æ”¹é…置文件å称"
-msgid "Prevent users from performing write operations on GitLab while performing maintenance."
-msgstr "阻止用户在GitLab进行维护时进行写入æ“作。"
+msgid "Prevent users from performing write operations while GitLab maintenance is in progress."
+msgstr ""
msgid "Preview"
msgstr "预览"
@@ -25473,7 +25829,7 @@ msgid "Profiles|Edit Profile"
msgstr "编辑个人资料"
msgid "Profiles|Ensure you have two-factor authentication recovery codes stored in a safe place."
-msgstr ""
+msgstr "ç¡®ä¿æ‚¨å°†åŒé‡èº«ä»½éªŒè¯æ¢å¤ç å­˜å‚¨åœ¨å®‰å…¨çš„地方。"
msgid "Profiles|Enter how your name is pronounced to help people address you correctly"
msgstr "输入您姓åçš„å‘音以帮助人们正确称呼您"
@@ -25481,6 +25837,9 @@ msgstr "输入您姓åçš„å‘音以帮助人们正确称呼您"
msgid "Profiles|Enter your name, so people you know can recognize you"
msgstr "输入您的姓å,以便大家认识您"
+msgid "Profiles|Enter your password to confirm the email change"
+msgstr ""
+
msgid "Profiles|Enter your pronouns to let people know how to refer to you"
msgstr "输入您的昵称,让人们知é“如何称呼您"
@@ -25503,7 +25862,7 @@ msgid "Profiles|Full name"
msgstr "å…¨å"
msgid "Profiles|GitLab is unable to verify your identity automatically. For security purposes, you must set a password by %{openingTag}resetting your password%{closingTag} to delete your account."
-msgstr ""
+msgstr "GitLab 无法自动验è¯æ‚¨çš„身份。为了安全起è§ï¼Œæ‚¨å¿…须通过 %{openingTag}é‡ç½®æ‚¨çš„密ç %{closingTag} 进行密ç è®¾ç½®æ¥åˆ é™¤æ‚¨çš„è´¦å·ã€‚"
msgid "Profiles|Give your individual key a title. This will be publicly visible."
msgstr "为您的个人密钥命å。这将是公开å¯è§çš„。"
@@ -25715,12 +26074,12 @@ msgstr "您当å‰çš„状æ€ï¼Ÿ"
msgid "Profiles|e.g. My MacBook key"
msgstr "例如: My MacBook Key"
+msgid "Profiles|https://website.com"
+msgstr ""
+
msgid "Profiles|username"
msgstr "用户å"
-msgid "Profiles|website.com"
-msgstr "website.com"
-
msgid "Profiles|your account"
msgstr "您的å¸æˆ·"
@@ -25961,9 +26320,21 @@ msgstr "项目ID: %{project_id}"
msgid "ProjectSelect| or group"
msgstr "或群组"
+msgid "ProjectSelect|No matching results"
+msgstr ""
+
msgid "ProjectSelect|Search for project"
msgstr "æœç´¢é¡¹ç›®"
+msgid "ProjectSelect|Search projects"
+msgstr ""
+
+msgid "ProjectSelect|Select a project"
+msgstr ""
+
+msgid "ProjectSelect|There was an error fetching the projects. Please try again."
+msgstr ""
+
msgid "ProjectService|Drone server URL"
msgstr "Drone æœåŠ¡å™¨URL"
@@ -26051,6 +26422,9 @@ msgstr "在创建ã€æ›´æ–°æˆ–åˆå¹¶åˆå¹¶è¯·æ±‚时触å‘事件。"
msgid "ProjectService|Trigger event when a new, unique alert is recorded."
msgstr "在记录新的ã€å”¯ä¸€çš„警报时触å‘事件。"
+msgid "ProjectService|Trigger event when a new, unique vulnerability is recorded. (Note: This feature requires an Ultimate plan.)"
+msgstr ""
+
msgid "ProjectService|Trigger event when a pipeline status changes."
msgstr "æµæ°´çº¿çŠ¶æ€æ›´æ”¹æ—¶è§¦å‘事件。"
@@ -26465,9 +26839,15 @@ msgstr "项目æˆåŠŸè¯»å–"
msgid "Projects are graded based on the highest severity vulnerability present"
msgstr "按项目所包å«æœ€é«˜å±é™©ç¨‹åº¦å®‰å…¨æ¼æ´žåˆ†çº§"
+msgid "Projects are organized into groups"
+msgstr ""
+
msgid "Projects contributed to"
msgstr "贡献的项目"
+msgid "Projects help you organize your work. They contain your file repository, issues, merge requests, and so much more."
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr "与 %{group_name} 共享的项目"
@@ -26702,12 +27082,12 @@ msgstr "尚未创建自定义指标。使用上é¢çš„按钮创建一个"
msgid "PrometheusService|Prometheus cluster integration"
msgstr "Prometheus集群集æˆ"
-msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
-msgstr "IAP 安全资æºçš„ ID。"
-
msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
msgstr "选中此å¤é€‰æ¡†å¯ä½¿ç”¨æ‚¨è‡ªå·±çš„设置覆盖自动é…置设置。"
+msgid "PrometheusService|The ID of the IAP-secured resource."
+msgstr ""
+
msgid "PrometheusService|The Prometheus API base URL."
msgstr "Prometheus API 基本 URL。"
@@ -26763,7 +27143,7 @@ msgid "Promotion is not supported."
msgstr "ä¸æ”¯æŒå‡çº§ã€‚"
msgid "Promotions|Add Group Webhooks and GitLab Enterprise Edition."
-msgstr ""
+msgstr "添加群组 Webhooks å’Œ GitLab ä¼ä¸šç‰ˆã€‚"
msgid "Promotions|Better Protected Branches"
msgstr "更好的å—ä¿æŠ¤çš„分支"
@@ -26787,13 +27167,13 @@ msgid "Promotions|Contact your Administrator to upgrade your license."
msgstr "请与管ç†å‘˜è”系以å‡çº§è®¸å¯è¯ã€‚"
msgid "Promotions|Description templates allow you to define context-specific templates for issue and merge request description fields for your project."
-msgstr ""
+msgstr "æ述模æ¿å…许您为项目的议题和åˆå¹¶è¯·æ±‚æ述字段定义特定上下文的模æ¿ã€‚"
msgid "Promotions|Dismiss burndown charts promotion"
msgstr "关闭燃尽图æ示"
msgid "Promotions|Dismiss repository features promotion"
-msgstr ""
+msgstr "关闭仓库功能促销"
msgid "Promotions|Don't show me this again"
msgstr "ä¸å†æ˜¾ç¤º"
@@ -26817,7 +27197,7 @@ msgid "Promotions|Improve search with Advanced Search and GitLab Enterprise Edit
msgstr "使用高级æœç´¢å’Œæžç‹GitLabæå‡æœç´¢èƒ½åŠ›ã€‚"
msgid "Promotions|Keep track of events in your project"
-msgstr ""
+msgstr "跟踪项目中的事件"
msgid "Promotions|Learn more"
msgstr "了解更多"
@@ -26850,7 +27230,7 @@ msgid "Promotions|Start GitLab Ultimate trial"
msgstr "å¯åŠ¨GitLab Ultimate试用"
msgid "Promotions|The Advanced Search in GitLab is a powerful search service that saves you time. Instead of creating duplicate code and wasting time, you can now search for code within other teams that can help your own project."
-msgstr ""
+msgstr "高级æœç´¢æ˜¯ä¸€é¡¹åŠŸèƒ½å¼ºå¤§çš„æœç´¢æœåŠ¡ï¼Œå¯ä»¥èŠ‚çœæ‚¨çš„时间。您现在å¯ä»¥åœ¨å…¶å®ƒå›¢é˜Ÿä¸­æœç´¢å¯ä»¥å¸®åŠ©æ‚¨è‡ªå·±çš„项目的代ç ï¼Œè€Œä¸æ˜¯åˆ›å»ºé‡å¤çš„代ç å’Œæµªè´¹æ—¶é—´ã€‚"
msgid "Promotions|This feature is locked."
msgstr "此功能已é”定"
@@ -26886,7 +27266,7 @@ msgid "Promotions|Upgrade your plan to improve repositories."
msgstr "å‡çº§æ‚¨çš„方案以æå‡ä»“库功能。"
msgid "Promotions|Webhooks allow you to trigger a URL if, for example, new code is pushed or a new issue is created. You can configure webhooks to listen for specific events like pushes, issues or merge requests. Group webhooks will apply to all projects in a group, allowing you to standardize webhook functionality across your entire group."
-msgstr ""
+msgstr "Webhooks å…许您在例如推é€æ–°ä»£ç æˆ–åˆ›å»ºæ–°è®®é¢˜æ—¶è§¦å‘ URL。您å¯ä»¥é…ç½® webhook æ¥ä¾¦å¬ç‰¹å®šäº‹ä»¶ï¼Œä¾‹å¦‚推é€ã€è®®é¢˜æˆ–åˆå¹¶è¯·æ±‚。群组 webhook 将应用于群组中的所有项目,å…许您在整个群组中标准化 webhook 功能。"
msgid "Promotions|Weight"
msgstr "æƒé‡"
@@ -26901,13 +27281,13 @@ msgid "Promotions|With Contribution Analytics you can have an overview for the a
msgstr "通过贡献度分æžï¼Œæ‚¨å¯ä»¥ä»Žæ€»ä½“上了解您的组织åŠå…¶æˆå‘˜çš„议题〠åˆå¹¶è¯·æ±‚和推é€æ´»åŠ¨çš„情况。"
msgid "Promotions|You can restrict access to protected branches by choosing a role (Maintainers, Developers) as well as certain users."
-msgstr ""
+msgstr "您å¯ä»¥é€šè¿‡é€‰æ‹©è§’色(维护者ã€å¼€å‘者)以åŠæŸäº›ç”¨æˆ·æ¥é™åˆ¶å¯¹å—ä¿æŠ¤åˆ†æ”¯çš„访问。"
msgid "Promotions|description templates"
msgstr "æ述模æ¿"
msgid "Promotions|to help your contributors communicate effectively!"
-msgstr ""
+msgstr "帮助您的贡献者有效沟通ï¼"
msgid "Prompt users to upload SSH keys"
msgstr "æ示用户上传SSH密钥"
@@ -27057,7 +27437,7 @@ msgid "ProtectedEnvironment|Select users"
msgstr "选择用户"
msgid "ProtectedEnvironment|There are currently no protected environments. Protect an environment with this form."
-msgstr ""
+msgstr "当å‰æ²¡æœ‰å—ä¿æŠ¤çš„环境。使用该方å¼ä¿æŠ¤çŽ¯å¢ƒã€‚"
msgid "ProtectedEnvironment|Unprotect"
msgstr "å–消ä¿æŠ¤"
@@ -27093,7 +27473,7 @@ msgid "Provider"
msgstr "æ供者"
msgid "Provision instructions"
-msgstr ""
+msgstr "æ供说明"
msgid "Provisioned by:"
msgstr "æ供者:"
@@ -27153,7 +27533,7 @@ msgid "Purchase more storage"
msgstr "购买更多存储"
msgid "PurchaseStep|An error occured in the purchase step. If the problem persists please contact support@gitlab.com."
-msgstr ""
+msgstr "购买步骤中å‘生错误。如果问题ä»ç„¶å­˜åœ¨ï¼Œè¯·è”ç³» support@gitlab.com。"
msgid "Push"
msgstr "推é€"
@@ -27323,6 +27703,9 @@ msgstr "速率é™åˆ¶"
msgid "Rate limit"
msgstr "速率é™åˆ¶"
+msgid "Rate limits can help reduce request volume (like from crawlers or abusive bots)."
+msgstr ""
+
msgid "Raw blob request rate limit per minute"
msgstr "æ¯åˆ†é’ŸåŽŸå§‹Blob请求速率é™åˆ¶"
@@ -27335,6 +27718,9 @@ msgstr "é‡æ–°è®¤è¯æœŸå·²è¿‡æœŸæˆ–从未请求过。请å†è¯•ä¸€é"
msgid "Re-authentication required"
msgstr "需è¦é‡æ–°è®¤è¯"
+msgid "Re-import"
+msgstr ""
+
msgid "Re-request review"
msgstr "é‡æ–°è¯·æ±‚审核"
@@ -27356,14 +27742,17 @@ msgstr "于%{help_link_open}此处%{help_link_close}了解有关项目æƒé™çš„æ
msgid "Read more about related issues"
msgstr "了解更多关于相关议题的信æ¯"
+msgid "Read their documentation."
+msgstr ""
+
msgid "Ready to get started with GitLab? Follow these steps to set up your workspace, plan and commit changes, and deploy your project."
msgstr "准备好开始使用 GitLab 了å—?按照以下步骤设置您的工作区ã€è®¡åˆ’å’Œæ交更改以åŠéƒ¨ç½²æ‚¨çš„项目。"
msgid "Ready to merge by members who can write to the target branch."
-msgstr ""
+msgstr "准备由å¯ä»¥å†™å…¥ç›®æ ‡åˆ†æ”¯çš„æˆå‘˜åˆå¹¶ã€‚"
msgid "Ready to merge!"
-msgstr ""
+msgstr "准备åˆå¹¶ï¼"
msgid "Reauthenticating with SAML provider."
msgstr "正在与 SAML æ供商é‡æ–°éªŒè¯ã€‚"
@@ -27389,6 +27778,9 @@ msgstr "从手动é…置的 Prometheus æœåŠ¡å™¨æŽ¥æ”¶è­¦æŠ¥ã€‚"
msgid "Receive any notifications from GitLab."
msgstr "接收æ¥è‡ª GitLab 的任何通知。"
+msgid "Receive notification of abuse reports by email."
+msgstr ""
+
msgid "Receive notifications about your own activity"
msgstr "接收关于您自己活动的通知"
@@ -27435,7 +27827,7 @@ msgid "Redis"
msgstr "Redis"
msgid "Reduce incident management alert volume (for example, if too many issues are being created)."
-msgstr ""
+msgstr "å‡å°‘事件管ç†è­¦æŠ¥é‡ï¼ˆä¾‹å¦‚,如果创建的议题过多)。"
msgid "Reduce project visibility"
msgstr "é™ä½Žé¡¹ç›®å¯è§æ€§"
@@ -27444,13 +27836,13 @@ msgid "Reduce this project’s visibility?"
msgstr "é™ä½Žæ­¤é¡¹ç›®å¯è§æ€§å—?"
msgid "Reference"
-msgstr ""
+msgstr "å‚考"
msgid "References"
msgstr "引用"
msgid "Refine your search criteria (select a %{strong_open}group%{strong_close} and %{strong_open}project%{strong_close} when possible)"
-msgstr ""
+msgstr "优化您的æœç´¢æ¡ä»¶ï¼ˆå°½å¯èƒ½é€‰æ‹© %{strong_open}群组%{strong_close} å’Œ %{strong_open}项目%{strong_close}"
msgid "Refresh"
msgstr "刷新"
@@ -27531,11 +27923,8 @@ msgstr "您的个人资料"
msgid "Registry setup"
msgstr "é•œåƒåº“设置"
-msgid "Regulate approvals by authors/committers. Affects all projects."
-msgstr "监管作者/æ交者的批准。影å“所有项目。"
-
msgid "Reindexing Status: %{status} (Slice multiplier: %{multiplier}, Maximum running slices: %{max_slices})"
-msgstr ""
+msgstr "é‡æ–°ç´¢å¼•çŠ¶æ€ï¼š %{status} (切片乘数: %{multiplier},最大è¿è¡Œåˆ‡ç‰‡ï¼š %{max_slices})"
msgid "Rejected (closed)"
msgstr "已拒ç»(关闭)"
@@ -27550,7 +27939,7 @@ msgid "Related merge requests"
msgstr "相关åˆå¹¶è¯·æ±‚"
msgid "Related to #%{issue_id}."
-msgstr ""
+msgstr "与#%{issue_id}相关。"
msgid "Relates to"
msgstr "å…³è”到"
@@ -27611,7 +28000,7 @@ msgid "Releases are based on Git tags and mark specific points in a project's de
msgstr "å‘布基于Git标签,并标记项目开å‘历å²ä¸­çš„特定点。它们å¯ä»¥åŒ…å«æœ‰å…³æ›´æ”¹ç±»åž‹çš„ä¿¡æ¯ï¼Œè¿˜å¯ä»¥æ供二进制文件,例如软件的编译版本。"
msgid "Releases are based on Git tags. We recommend tags that use semantic versioning, for example %{codeStart}v1.0.0%{codeEnd}, %{codeStart}v2.1.0-pre%{codeEnd}."
-msgstr ""
+msgstr "å‘布基于 Git 标签,我们推è使用语义版本控制的标签,例如 %{codeStart}v1.0.0%{codeEnd}〠%{codeStart}v2.1.0-pre%{codeEnd}。"
msgid "Releases documentation"
msgstr "å‘布文档"
@@ -27628,6 +28017,9 @@ msgstr "获å–å‘布详情时出现问题。"
msgid "Release|Something went wrong while saving the release details."
msgstr "ä¿å­˜å‘布详细信æ¯æ—¶å‡ºé”™ã€‚"
+msgid "Reload page"
+msgstr ""
+
msgid "Remediations"
msgstr "ä¿®å¤æŽªæ–½"
@@ -27910,6 +28302,9 @@ msgstr "é‡æ–°æ‰“å¼€%{quick_action_target}。"
msgid "Reopens this %{quick_action_target}."
msgstr "é‡æ–°æ‰“å¼€%{quick_action_target}。"
+msgid "Repeats"
+msgstr ""
+
msgid "Replace"
msgstr "替æ¢"
@@ -28062,7 +28457,7 @@ msgid "Reports|Test summary results are being parsed"
msgstr "测试总结报告解æžä¸­"
msgid "Reports|Tool"
-msgstr ""
+msgstr "工具"
msgid "Reports|Vulnerability"
msgstr "æ¼æ´ž"
@@ -28257,7 +28652,7 @@ msgid "Requests Profiles"
msgstr "请求分æž"
msgid "Requests for pages at %{code_start}%{help_text_url}%{code_end} redirect to the URL. The destination must meet certain requirements. %{docs_link_start}Learn more.%{docs_link_end}"
-msgstr ""
+msgstr "%{code_start}%{help_text_url}%{code_end} 页é¢çš„请求é‡å®šå‘到 URL。目的地必须满足æŸäº›è¦æ±‚。 %{docs_link_start}了解更多。%{docs_link_end}"
msgid "Requests per period"
msgstr "æ¯ä¸ªå‘¨æœŸçš„请求"
@@ -28268,11 +28663,8 @@ msgstr "当ä¸å…许æ¥è‡ªé’©å­å’ŒæœåŠ¡çš„本地请求时,将å…许对本地
msgid "Require additional authentication for administrative tasks."
msgstr "需è¦å¯¹ç®¡ç†ä»»åŠ¡è¿›è¡Œé¢å¤–的身份验è¯ã€‚"
-msgid "Require all users in this group to setup Two-factor authentication"
-msgstr "è¦æ±‚此群组中的所有用户都设置åŒé‡èº«ä»½éªŒè¯"
-
-msgid "Require all users in this group to setup two-factor authentication"
-msgstr "è¦æ±‚此群组中的所有用户都å¯ç”¨åŒé‡è®¤è¯"
+msgid "Require all users in this group to set up two-factor authentication"
+msgstr ""
msgid "Required approvals (%{approvals_given} given)"
msgstr "必需的核准(%{approvals_given}已完æˆ)"
@@ -28315,6 +28707,9 @@ msgstr[0] "éœ€è¦ %d 个核准"
msgid "Requires values to meet regular expression requirements."
msgstr "需è¦å€¼åŒ¹é…正则表达å¼ã€‚"
+msgid "Requires you to deploy or set up cloud-hosted Sentry."
+msgstr ""
+
msgid "Requires your primary GitLab email address."
msgstr "需è¦æ‚¨çš„主GitLab电å­é‚®ä»¶åœ°å€ã€‚"
@@ -28375,9 +28770,6 @@ msgstr "é‡ç½®æŽˆæƒå¯†é’¥å°†ä¼šä½¿å…ˆå‰çš„密钥无效。现有警报é…置需
msgid "Resolve"
msgstr "解决"
-msgid "Resolve all threads in new issue"
-msgstr "在新议题中解决所有主题"
-
msgid "Resolve conflicts"
msgstr "解决冲çª"
@@ -28435,6 +28827,9 @@ msgstr "å“应指标(NGINX)"
msgid "Response text"
msgstr "å“应文本"
+msgid "Restart GitLab to apply changes."
+msgstr ""
+
msgid "Restart Terminal"
msgstr "é‡å¯ç»ˆç«¯"
@@ -28453,6 +28848,9 @@ msgstr "æ¢å¤è¯¥ç¾¤ç»„将防止该群组åŠå…¶å­ç¾¤ç»„和项目在此日期被
msgid "Restoring the project will prevent the project from being removed on this date and restore people's ability to make changes to it."
msgstr "æ¢å¤è¯¥é¡¹ç›®å°†é˜²æ­¢é¡¹ç›®åœ¨æ­¤æ—¥æœŸè¢«åˆ é™¤å¹¶æ¢å¤ç”¨æˆ·å¯¹å…¶è¿›è¡Œæ›´æ”¹çš„能力。"
+msgid "Restrict group access by IP address. %{link_start}Learn more%{link_end}."
+msgstr ""
+
msgid "Restrict membership by email domain"
msgstr "通过电å­é‚®ä»¶åŸŸé™åˆ¶æˆå‘˜èµ„æ ¼"
@@ -28460,7 +28858,7 @@ msgid "Restrict projects for this runner"
msgstr "é™åˆ¶é€‚用于该Runner的项目"
msgid "Restricted shift times are not available for hourly shifts"
-msgstr ""
+msgstr "é™åˆ¶è½®ç­æ—¶é—´ä¸é€‚用于æ¯å°æ—¶è½®ç­"
msgid "Resume"
msgstr "æ¢å¤"
@@ -28509,7 +28907,7 @@ msgid "Review App|View latest app"
msgstr "查看最新应用"
msgid "Review changes"
-msgstr ""
+msgstr "审阅更改"
msgid "Review requested from %{name}"
msgstr "æ¥è‡ª%{name}的审核请求"
@@ -28660,10 +29058,10 @@ msgid "Runners|Active"
msgstr "å¯ç”¨"
msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. %{percentage} spot."
-msgstr ""
+msgstr "Amazon Linux 2 Docker HA,具有手动扩展和å¯é€‰è°ƒåº¦åŠŸèƒ½ã€‚ %{percentage} 点。"
msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot. Default choice for Linux Docker executor."
-msgstr ""
+msgstr "Amazon Linux 2 Docker HA,具有手动扩展和å¯é€‰è°ƒåº¦åŠŸèƒ½ã€‚éžçŽ°åœºã€‚ Linux Docker 执行器的默认选择。"
msgid "Runners|An error has occurred fetching instructions"
msgstr "获å–指令时å‘生错误"
@@ -28699,7 +29097,7 @@ msgid "Runners|Enter the number of seconds. This timeout takes precedence over l
msgstr "输入秒数。此超时时间优先级高于为项目设定的较低超时时间。"
msgid "Runners|For each solution, you will choose a capacity. 1 enables warm HA through Auto Scaling group re-spawn. 2 enables hot HA because the service is available even when a node is lost. 3 or more enables hot HA and manual scaling of runner fleet."
-msgstr ""
+msgstr "对于æ¯ä¸ªè§£å†³æ–¹æ¡ˆï¼Œæ‚¨å°†é€‰æ‹©ä¸€ä¸ªå®¹é‡ã€‚ 1 通过自动扩展组é‡æ–°ç”Ÿæˆå¯ç”¨æš– HA。 2 å¯ç”¨çƒ­ HA,因为å³ä½¿èŠ‚点丢失,该æœåŠ¡ä¹Ÿå¯ç”¨ã€‚ 3 个或更多å¯ç”¨çƒ­ HA 和手动扩展runner组。"
msgid "Runners|Group Runners"
msgstr "群组Runner"
@@ -28708,7 +29106,7 @@ msgid "Runners|IP Address"
msgstr "IP地å€"
msgid "Runners|If you do not select an AWS VPC, the runner will deploy to the Default VPC in the AWS Region you select. Please consult with your AWS administrator to understand if there are any security risks to deploying into the Default VPC in any given region in your AWS account."
-msgstr ""
+msgstr "如果您ä¸é€‰æ‹© AWS VPC,runner将部署到您选择的 AWS 区域中的默认 VPC。请咨询您的 AWS 管ç†å‘˜ï¼Œä»¥äº†è§£éƒ¨ç½²åˆ°æ‚¨ AWS 账户中任何给定区域的默认 VPC 中是å¦å­˜åœ¨ä»»ä½•å®‰å…¨é£Žé™©ã€‚"
msgid "Runners|Install a runner"
msgstr "安装Runner"
@@ -28764,6 +29162,9 @@ msgstr "Runner"
msgid "Runners|Runner #%{runner_id}"
msgstr "Runner #%{runner_id}"
+msgid "Runners|Runner assigned to project."
+msgstr ""
+
msgid "Runners|Runner is offline, last contact was %{runner_contact} ago"
msgstr "Runner 处于离线状æ€ï¼Œæœ€åŽè¿žæŽ¥æ˜¯åœ¨%{runner_contact}å‰"
@@ -28776,11 +29177,14 @@ msgstr "Runner 处于已暂åœçŠ¶æ€ï¼Œæœ€åŽè¿žæŽ¥æ˜¯åœ¨%{runner_contact}å‰"
msgid "Runners|Runner registration"
msgstr "Runner 注册"
+msgid "Runners|Runner unassigned from project."
+msgstr ""
+
msgid "Runners|Runners"
msgstr "Runner"
msgid "Runners|Runners in this group: %{groupRunnersCount}"
-msgstr ""
+msgstr "本群组的è¿è¡Œå™¨ï¼š%{groupRunnersCount}"
msgid "Runners|Shared runners are available to every project in a GitLab instance. If you want a runner to build only specific projects, restrict the project in the table below. After you restrict a runner to a project, you cannot change it back to a shared runner."
msgstr "共享Runnerå¯ç”¨äºŽ GitLab 实例中的æ¯ä¸ªé¡¹ç›®ã€‚如果您希望Runner仅构建特定项目,请é™åˆ¶ä¸‹è¡¨ä¸­çš„项目。当é™åˆ¶Runner的特定项目åŽï¼Œæ‚¨æ— æ³•å°†å…¶æ”¹å›žå…±äº«Runner。"
@@ -28840,13 +29244,13 @@ msgid "Runners|View installation instructions"
msgstr "查看安装说明"
msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. %{percentage} spot."
-msgstr ""
+msgstr "Windows 2019 Shell,具有手动缩放和å¯é€‰è°ƒåº¦åŠŸèƒ½ã€‚ %{percentage} 点。"
msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot. Default choice for Windows Shell executor."
-msgstr ""
+msgstr "Windows 2019 Shell,具有手动缩放和å¯é€‰è°ƒåº¦åŠŸèƒ½ã€‚éžçŽ°åœºã€‚ Windows Shell 执行程åºçš„默认选择。"
msgid "Runners|You are about to change this instance runner to a project runner. This operation is not reversible. Are you sure you want to continue?"
-msgstr ""
+msgstr "您将è¦å°†æ­¤å®žä¾‹çš„runner更改为项目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。"
@@ -28968,8 +29372,8 @@ msgstr "GitLab å¯ä»¥æ‰«æ您的代ç ä»¥æŸ¥æ‰¾å®‰å…¨æ¼æ´žã€‚SAST å¯å¸®åŠ©æ‚¨
msgid "SastEntryPoints|How do I set up SAST?"
msgstr "如何设置 SAST?"
-msgid "SastEntryPoints|Learn more."
-msgstr "了解更多。"
+msgid "SastEntryPoints|Learn more"
+msgstr ""
msgid "Satisfied"
msgstr "满足"
@@ -29010,8 +29414,8 @@ msgstr "ä¿å­˜å¯†ç "
msgid "Save pipeline schedule"
msgstr "ä¿å­˜æµæ°´çº¿è®¡åˆ’"
-msgid "Save space and find images in the container Registry. remove unneeded tags and keep only the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
-msgstr "ä¿ç•™ç©ºé—´å¹¶åœ¨å®¹å™¨é•œåƒåº“中找到镜åƒã€‚删除ä¸éœ€è¦çš„标签,仅ä¿ç•™æ‚¨æƒ³è¦çš„。%{linkStart}清ç†å¦‚何工作?%{linkEnd}"
+msgid "Save storage space by automatically deleting tags from the container registry and keeping the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
+msgstr ""
msgid "Saving"
msgstr "ä¿å­˜ä¸­"
@@ -29032,7 +29436,7 @@ msgid "Schedule a new pipeline"
msgstr "新建æµæ°´çº¿è®¡åˆ’"
msgid "Schedule-based escalation rules must have a schedule in the same project as the policy"
-msgstr ""
+msgstr "基于时间表的å‡çº§è§„则必须在与策略相åŒçš„项目中具有时间表"
msgid "Scheduled"
msgstr "按计划"
@@ -29044,7 +29448,7 @@ msgid "Scheduled a rebase of branch %{branch}."
msgstr "计划了分支%{branch}çš„å˜åŸºï¼ˆrebase)。"
msgid "Scheduled pipelines cannot run more frequently than once per %{limit} minutes. A pipeline configured to run more frequently only starts after %{limit} minutes have elapsed since the last time it ran."
-msgstr ""
+msgstr "计划的管é“æ¯æ¬¡è¿è¡Œæ—¶é—´ä¸èƒ½è¶…过一次 %{limit} 分钟。 一个é…置更频ç¹è¿è¡Œçš„管é“仅在 %{limit} 分钟åŽæ‰å¼€å§‹è¿è¡Œã€‚"
msgid "Scheduled to merge this merge request (%{strategy})."
msgstr "已计划åˆå¹¶æ­¤åˆå¹¶è¯·æ±‚ (%{strategy})。"
@@ -29184,6 +29588,9 @@ msgstr "æœç´¢æˆ–筛选结果......"
msgid "Search or filter results…"
msgstr "æœç´¢æˆ–筛选结果…"
+msgid "Search or jump to..."
+msgstr ""
+
msgid "Search project"
msgstr "æœç´¢é¡¹ç›®"
@@ -29244,17 +29651,17 @@ msgstr "在项目%{projectName}中"
msgid "SearchCodeResults|of %{link_to_project}"
msgstr "于%{link_to_project}项目中"
-msgid "SearchResults|Showing %{count} %{scope} for%{term_element}"
-msgstr "显示包å«%{term_element}中%{count}项的%{scope}"
+msgid "SearchResults|Showing %{count} %{scope} for %{term_element}"
+msgstr ""
-msgid "SearchResults|Showing %{count} %{scope} for%{term_element} in your personal and project snippets"
-msgstr "在个人和项目代ç ç‰‡æ®µä¸­æ˜¾ç¤ºæœç´¢%{term_element}结果的%{count}项%{scope}"
+msgid "SearchResults|Showing %{count} %{scope} for %{term_element} in your personal and project snippets"
+msgstr ""
-msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for%{term_element}"
-msgstr "显示%{term_element}的 %{from} - %{to}/ %{count} %{scope} "
+msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for %{term_element}"
+msgstr ""
-msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for%{term_element} in your personal and project snippets"
-msgstr "在个人和项目代ç ç‰‡æ®µä¸­æ˜¾ç¤ºæœç´¢%{term_element}结果的%{count}项%{scope}里的第%{from}项 - 第%{to}项"
+msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for %{term_element} in your personal and project snippets"
+msgstr ""
msgid "SearchResults|code result"
msgid_plural "SearchResults|code results"
@@ -29324,6 +29731,9 @@ msgstr "密ç "
msgid "Secret Detection"
msgstr "密ç æ£€æµ‹"
+msgid "Secret access key"
+msgstr ""
+
msgid "Secret token"
msgstr "Secret令牌"
@@ -29355,7 +29765,7 @@ msgid "Security report is out of date. Run %{newPipelineLinkStart}a new pipeline
msgstr "安全报告已过时。请在目标分支(%{targetBranchName})上è¿è¡Œ%{newPipelineLinkStart}æ–°çš„æµæ°´çº¿%{newPipelineLinkEnd}"
msgid "SecurityApprovals|A merge request approval is required when a security report contains a new vulnerability."
-msgstr ""
+msgstr "当安全报告包å«æ–°æ¼æ´žæ—¶éœ€è¦åˆå¹¶è¯·æ±‚审批。"
msgid "SecurityApprovals|A merge request approval is required when test coverage declines."
msgstr "当测试覆盖率下é™æ—¶éœ€è¦åˆå¹¶è¯·æ±‚批准。"
@@ -29363,9 +29773,6 @@ msgstr "当测试覆盖率下é™æ—¶éœ€è¦åˆå¹¶è¯·æ±‚批准。"
msgid "SecurityApprovals|A merge request approval is required when the license compliance report contains a denied license."
msgstr "当许å¯è¯åˆè§„性报告包å«åˆ—å…¥ç¦æ­¢åå•çš„许å¯è¯æ—¶ï¼Œåˆå¹¶è¯·æ±‚批准为必需。"
-msgid "SecurityApprovals|Configurable if security scanners are enabled. %{linkStart}Learn more.%{linkEnd}"
-msgstr "如果å¯ç”¨äº†å®‰å…¨æ‰«æ程åºï¼Œåˆ™å¯é…置。 %{linkStart}了解更多。%{linkEnd}"
-
msgid "SecurityApprovals|Coverage-Check"
msgstr "覆盖范围检查"
@@ -29378,29 +29785,23 @@ msgstr "了解更多关于许å¯è¯æ£€æŸ¥çš„ä¿¡æ¯"
msgid "SecurityApprovals|Learn more about Vulnerability-Check"
msgstr "了解更多关于æ¼æ´žæ£€æŸ¥çš„ä¿¡æ¯"
-msgid "SecurityApprovals|License Scanning must be enabled. %{linkStart}Learn more%{linkEnd}."
-msgstr "å¿…é¡»å¯ç”¨è®¸å¯è¯æ‰«æ。 %{linkStart}了解更多%{linkEnd}."
-
msgid "SecurityApprovals|License-Check"
msgstr "许å¯è¯æ£€æŸ¥"
msgid "SecurityApprovals|Requires approval for Denied licenses. %{linkStart}More information%{linkEnd}"
msgstr "当结果中包å«æ‹’ç»çš„许å¯è¯æ—¶æ ¸å‡†ä¸ºå¿…须。%{linkStart}更多信æ¯%{linkEnd}"
-msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}More information%{linkEnd}"
-msgstr "需è¦å®¡æ ¸æ‰èƒ½å‡å°‘测试覆盖范围。 %{linkStart}更多信æ¯%{linkEnd}"
-
-msgid "SecurityApprovals|Requires approval for vulnerabilities. %{linkStart}Learn more.%{linkEnd}"
+msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
-msgid "SecurityApprovals|Test coverage must be enabled. %{linkStart}Learn more%{linkEnd}."
-msgstr "å¿…é¡»å¯ç”¨æµ‹è¯•è¦†ç›–范围。%{linkStart}了解更多%{linkEnd}。"
+msgid "SecurityApprovals|Requires approval for vulnerabilities. %{linkStart}Learn more.%{linkEnd}"
+msgstr "需è¦å¯¹æ¼æ´žè¿›è¡Œå®¡æ‰¹ã€‚ %{linkStart}了解更多。%{linkEnd}"
msgid "SecurityApprovals|Vulnerability-Check"
msgstr "æ¼æ´žæ£€æŸ¥"
msgid "SecurityConfiguration|%{featureName} merge request creation mutation failed"
-msgstr ""
+msgstr "%{featureName} åˆå¹¶è¯·æ±‚创建çªå˜å¤±è´¥"
msgid "SecurityConfiguration|%{scanType} configuration code snippet"
msgstr "%{scanType} é…置代ç ç‰‡æ®µ"
@@ -29457,6 +29858,12 @@ msgid "SecurityConfiguration|High-level vulnerability statistics across projects
msgstr "跨项目和群组的高级别æ¼æ´žç»Ÿè®¡"
msgid "SecurityConfiguration|Immediately begin risk analysis and remediation with application security features. Start with SAST and Secret Detection, available to all plans. Upgrade to Ultimate to get all features, including:"
+msgstr "使用应用程åºå®‰å…¨åŠŸèƒ½ç«‹å³å¼€å§‹é£Žé™©åˆ†æžå’Œè¡¥æ•‘。从 SAST å’Œ Secret 检测开始,适用于所有计划。å‡çº§åˆ° Ultimate 以获得所有功能,包括:"
+
+msgid "SecurityConfiguration|Manage corpus"
+msgstr ""
+
+msgid "SecurityConfiguration|Manage corpus files used as mutation sources in coverage fuzzing."
msgstr ""
msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
@@ -29475,10 +29882,10 @@ msgid "SecurityConfiguration|Once you've enabled a scan for the default branch,
msgstr "一旦您å¯ç”¨äº†é»˜è®¤åˆ†æ”¯æ‰«æ,éšåŽåˆ›å»ºçš„任何功能分支将包括扫æ。"
msgid "SecurityConfiguration|Quickly enable all continuous testing and compliance tools by enabling %{linkStart}Auto DevOps%{linkEnd}"
-msgstr ""
+msgstr "%{linkStart}Auto DevOps%{linkEnd}快速å¯ç”¨æ‰€æœ‰æŒç»­æµ‹è¯•å’Œåˆè§„性工具"
msgid "SecurityConfiguration|Runtime security metrics for application environments"
-msgstr ""
+msgstr "应用程åºçŽ¯å¢ƒçš„è¿è¡Œæ—¶å®‰å…¨æŒ‡æ ‡"
msgid "SecurityConfiguration|SAST Analyzers"
msgstr "SAST分æžå·¥å…·"
@@ -29505,85 +29912,94 @@ msgid "SecurityConfiguration|Vulnerability details and statistics in the merge r
msgstr "åˆå¹¶è¯·æ±‚中的æ¼æ´žè¯¦ç»†ä¿¡æ¯å’Œç»Ÿè®¡"
msgid "SecurityOrchestration|%{branches} %{plural}"
-msgstr ""
+msgstr "%{branches} %{plural}"
msgid "SecurityOrchestration|%{branches} and %{lastBranch} %{plural}"
-msgstr ""
+msgstr "%{branches} 和 %{lastBranch} %{plural}"
msgid "SecurityOrchestration|Action"
+msgstr "行动"
+
+msgid "SecurityOrchestration|Actions"
msgstr ""
-msgid "SecurityOrchestration|All policies"
+msgid "SecurityOrchestration|Add rule"
msgstr ""
+msgid "SecurityOrchestration|All policies"
+msgstr "所有策略"
+
msgid "SecurityOrchestration|An error occurred assigning your security policy project"
msgstr "分é…您的安全策略项目时出错"
msgid "SecurityOrchestration|Description"
-msgstr ""
+msgstr "æè¿°"
msgid "SecurityOrchestration|Edit policy"
-msgstr ""
+msgstr "编辑策略"
msgid "SecurityOrchestration|Edit policy project"
-msgstr ""
+msgstr "编辑策略项目"
msgid "SecurityOrchestration|Enforce security for this project. %{linkStart}More information.%{linkEnd}"
-msgstr ""
+msgstr "强制此项目的安全性。 %{linkStart}更多信æ¯ã€‚%{linkEnd}"
msgid "SecurityOrchestration|Enforcement Status"
-msgstr ""
+msgstr "执行状æ€"
msgid "SecurityOrchestration|Executes a %{scanType} scan"
-msgstr ""
+msgstr "执行 %{scanType} 扫æ"
msgid "SecurityOrchestration|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
-msgstr ""
+msgstr "如果您正在使用Auto DevOps,如果您改å˜äº†æ­¤éƒ¨åˆ†çš„策略,您的 %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} 文件将ä¸ä¼šè¢«æ›´æ–° Auto DevOps 用户应按照 %{linkStart}容器网络策略文档%{linkEnd}进行更改。"
msgid "SecurityOrchestration|Latest scan"
-msgstr ""
+msgstr "最新扫æ"
msgid "SecurityOrchestration|Network"
-msgstr ""
-
-msgid "SecurityOrchestration|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
-msgstr ""
+msgstr "网络"
msgid "SecurityOrchestration|New policy"
-msgstr ""
+msgstr "æ–°ç­–ç•¥"
msgid "SecurityOrchestration|Only owners can update Security Policy Project"
msgstr "åªæœ‰æ‰€æœ‰è€…å¯ä»¥æ›´æ–°å®‰å…¨ç­–略项目"
msgid "SecurityOrchestration|Policies"
-msgstr ""
+msgstr "ç­–ç•¥"
msgid "SecurityOrchestration|Policy description"
-msgstr ""
+msgstr "ç­–ç•¥æè¿°"
msgid "SecurityOrchestration|Policy editor"
+msgstr "策略编辑器"
+
+msgid "SecurityOrchestration|Policy preview"
msgstr ""
msgid "SecurityOrchestration|Policy status"
-msgstr ""
+msgstr "策略状æ€"
msgid "SecurityOrchestration|Policy type"
-msgstr ""
+msgstr "策略类型"
msgid "SecurityOrchestration|Rule"
+msgstr "规则"
+
+msgid "SecurityOrchestration|Rules"
msgstr ""
msgid "SecurityOrchestration|Scan Execution"
-msgstr ""
+msgstr "扫æ执行"
msgid "SecurityOrchestration|Scan execution"
-msgstr ""
+msgstr "扫æ执行"
msgid "SecurityOrchestration|Scan to be performed every %{cadence} on the %{branches}"
-msgstr ""
+msgstr "在 %{branches} 上扫ææ¯ä¸€ä¸ª %{cadence}"
msgid "SecurityOrchestration|Scan to be performed on every pipeline on the %{branches}"
-msgstr ""
+msgstr "在%{branches}上扫ææ¯ä¸ªæµæ°´çº¿"
msgid "SecurityOrchestration|Security policy project was linked successfully"
msgstr "安全策略项目已æˆåŠŸè¿žæŽ¥"
@@ -29595,28 +30011,28 @@ msgid "SecurityOrchestration|Select security project"
msgstr "选择安全项目"
msgid "SecurityOrchestration|Sorry, your filter produced no results."
-msgstr ""
+msgstr "对ä¸èµ·ï¼Œæ‚¨çš„过滤器没有产生任何结果。"
msgid "SecurityOrchestration|There was a problem creating the new security policy"
-msgstr ""
+msgstr "创建新的安全策略时出现问题"
msgid "SecurityOrchestration|This project does not contain any security policies."
-msgstr ""
+msgstr "此项目ä¸åŒ…å«ä»»ä½•å®‰å…¨ç­–略。"
msgid "SecurityOrchestration|To widen your search, change filters above or select a different security policy project."
-msgstr ""
+msgstr "è¦æ‰©å¤§æ‚¨çš„æœç´¢èŒƒå›´ï¼Œè¯·åœ¨ä¸Šé¢æ›´æ”¹è¿‡æ»¤è§„则或选择ä¸åŒçš„安全策略项目。"
msgid "SecurityOrchestration|Update scan execution policies"
-msgstr ""
+msgstr "更新扫æ执行策略"
msgid "SecurityOrchestration|view results"
-msgstr ""
+msgstr "查看结果"
msgid "SecurityOrhestration|No rules defined - policy will not run."
-msgstr ""
+msgstr "未定义规则 - 策略无法è¿è¡Œã€‚"
msgid "SecurityPolicies|+%{count} more"
-msgstr ""
+msgstr "+%{count} 更多"
msgid "SecurityPolicies|Environment(s)"
msgstr "环境"
@@ -29643,7 +30059,7 @@ msgid "SecurityReports|Although it's rare to have no vulnerabilities, it can hap
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 ""
+msgstr "在 GitLab,我们专注于迭代和å馈。这就是为什么我们è¦è”ç³»åƒæ‚¨è¿™æ ·çš„客户æ¥å¸®åŠ©æŒ‡å¯¼æˆ‘们今年在æ¼æ´žç®¡ç†æ–¹é¢çš„工作。我们有很多令人兴奋的想法,请您å助我们进行ä¸è¶…过 10 分钟 %{boldStart}%{boldEnd} æ¥è¯„估我们的一些潜在功能。"
msgid "SecurityReports|Change status"
msgstr "更改状æ€"
@@ -29666,6 +30082,9 @@ msgstr "创建 Jira 议题"
msgid "SecurityReports|Create issue"
msgstr "创建议题"
+msgid "SecurityReports|Development vulnerabilities"
+msgstr ""
+
msgid "SecurityReports|Dismiss vulnerability"
msgstr "忽略æ¼æ´ž"
@@ -29681,6 +30100,9 @@ msgstr "下载 %{artifactName}"
msgid "SecurityReports|Download results"
msgstr "下载结果"
+msgid "SecurityReports|Download scanned URLs"
+msgstr ""
+
msgid "SecurityReports|Download scanned resources"
msgstr "下载扫æ资æº"
@@ -29804,6 +30226,9 @@ msgstr "状æ€"
msgid "SecurityReports|Take survey"
msgstr "å‚加调查"
+msgid "SecurityReports|The Vulnerability Report shows the results of the lastest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "SecurityReports|The security reports below contain one or more vulnerability findings that could not be parsed and were not recorded. Download the artifacts in the job output to investigate. Ensure any security report created conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
msgstr "下é¢çš„安全报告包å«ä¸€ä¸ªæˆ–多个无法解æžä¸”未记录的æ¼æ´žå‘现。下载作业输出中的产物以进行调查。确ä¿åˆ›å»ºçš„任何安全报告都符åˆç›¸å…³çš„ %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}。"
@@ -29838,7 +30263,7 @@ msgid "SecurityReports|To widen your search, change or remove filters above"
msgstr "è¦æ‰©å¤§æœç´¢èŒƒå›´ï¼Œè¯·æ›´æ”¹æˆ–删除上é¢çš„筛选器。"
msgid "SecurityReports|Tool"
-msgstr ""
+msgstr "工具"
msgid "SecurityReports|Unable to add %{invalidProjectsMessage}: %{errorMessage}"
msgstr "无法添加%{invalidProjectsMessage}: %{errorMessage}"
@@ -29945,12 +30370,12 @@ msgstr "选择原因"
msgid "Select a repository"
msgstr "选择一个仓库"
+msgid "Select a repository containing templates for common files."
+msgstr ""
+
msgid "Select a role"
msgstr "选择一个角色"
-msgid "Select a shared template repository for all projects on this instance."
-msgstr "为该实例上的所有项目选择一个共享模æ¿ä»“库。"
-
msgid "Select a template repository"
msgstr "选择模æ¿ä»“库"
@@ -30026,6 +30451,9 @@ msgstr "按项目和地域选择实例类型"
msgid "Select project to choose zone"
msgstr "按项目选择地域"
+msgid "Select project to create issue"
+msgstr ""
+
msgid "Select projects"
msgstr "选择项目"
@@ -30143,6 +30571,9 @@ msgstr "å‘é€ç”µå­é‚®ä»¶é€šçŸ¥"
msgid "Send emails to help guide new users through the onboarding process."
msgstr "å‘é€ç”µå­é‚®ä»¶ä»¥å¸®åŠ©æŒ‡å¯¼æ–°ç”¨æˆ·å®Œæˆæ–°äººæµç¨‹ã€‚"
+msgid "Send emails to users upon account deactivation."
+msgstr ""
+
msgid "Send message"
msgstr "å‘é€ä¿¡æ¯â€‹â€‹â€‹â€‹â€‹â€‹â€‹â€‹"
@@ -30161,6 +30592,9 @@ msgstr "å‘é€æŠ¥å‘Š"
msgid "Send service data"
msgstr "å‘é€æœåŠ¡æ•°æ®"
+msgid "Sentry"
+msgstr ""
+
msgid "Sentry API URL"
msgstr "Sentry API URL"
@@ -30180,7 +30614,7 @@ msgid "SeriesFinalConjunction|and"
msgstr "与"
msgid "Serve repository static objects (for example, archives and blobs) from external storage."
-msgstr ""
+msgstr "从外部存储æ供仓库é™æ€å¯¹è±¡ï¼ˆä¾‹å¦‚,档案和 blob)。"
msgid "Server (optional)"
msgstr "æœåŠ¡å™¨ï¼ˆå¯é€‰ï¼‰"
@@ -30275,6 +30709,9 @@ msgstr "仓库中没有相应的%{startTag}serverless.yml%{endTag}文件。"
msgid "Service"
msgstr "æœåŠ¡"
+msgid "Service Accounts keys are required to authorize GitLab to deploy your Google Cloud project."
+msgstr ""
+
msgid "Service Desk"
msgstr "æœåŠ¡å°"
@@ -30347,15 +30784,15 @@ msgstr "设置用于新议题的默认æ述模æ¿ã€‚ %{link_start}什么是æè
msgid "Set a password on your account to pull or push via %{protocol}."
msgstr "为账å·åˆ›å»ºä¸€ä¸ªç”¨äºŽæŽ¨é€æˆ–拉å–çš„ %{protocol} 密ç ã€‚"
-msgid "Set a template repository for projects in this group"
-msgstr "为该群组中的项目设置文件模æ¿ä»“库"
-
msgid "Set access permissions for this token."
msgstr "设置此令牌的访问æƒé™ã€‚"
msgid "Set an instance-wide domain that will be available to all clusters when installing Knative."
msgstr "设置实例级别的域,å¯ç”¨äºŽæ‰€æœ‰é›†ç¾¤å®‰è£…Knative。"
+msgid "Set any rate limit to %{code_open}0%{code_close} to disable the limit."
+msgstr ""
+
msgid "Set default and restrict visibility levels. Configure import sources and git access protocol."
msgstr "设定缺çœåŠå—é™å¯è§æ€§çº§åˆ«ã€‚é…置导入æ¥æºåŠgit访问å议。"
@@ -30368,8 +30805,8 @@ msgstr "设置迭代"
msgid "Set limit to 0 to allow any file size."
msgstr "设置é™åˆ¶ä¸º 0 以å…许任何文件大å°ã€‚"
-msgid "Set max session time for web terminal."
-msgstr "为Web终端设置最长会è¯æ—¶é—´ã€‚"
+msgid "Set limits for web and API requests."
+msgstr ""
msgid "Set milestone"
msgstr "设置里程碑"
@@ -30377,15 +30814,18 @@ msgstr "设置里程碑"
msgid "Set new password"
msgstr "设置新密ç "
-msgid "Set notification email for abuse reports."
-msgstr "为滥用报告设置通知电å­é‚®ä»¶ã€‚"
-
msgid "Set parent epic to an epic"
msgstr "为å²è¯—设置上级å²è¯—"
+msgid "Set per-user rate limits for imports and exports of projects and groups."
+msgstr ""
+
msgid "Set projects and maximum size limits, session duration, user options, and check feature availability for namespace plan."
msgstr "设置项目和最大空间é™åˆ¶ã€ä¼šè¯æŒç»­æ—¶é—´ã€ç”¨æˆ·é€‰é¡¹ï¼Œå¹¶æ£€æŸ¥å‘½å空间计划的功能å¯ç”¨æ€§ã€‚"
+msgid "Set rate limits for package registry API requests that supersede the general user and IP rate limits."
+msgstr ""
+
msgid "Set severity"
msgstr "设置严é‡æ€§"
@@ -30404,18 +30844,27 @@ msgstr "设置目标分支为%{branch_name}。"
msgid "Set the default branch for this project. All merge requests and commits are made against this branch unless you specify a different one."
msgstr "设置此项目的默认分支。除éžæ‚¨æŒ‡å®šä¸åŒçš„分支,å¦åˆ™æ‰€æœ‰åˆå¹¶è¯·æ±‚å’Œæ交都是针对此分支进行的。"
+msgid "Set the default expiration time for job artifacts in all projects. Set to %{code_open}0%{code_close} to never expire artifacts by default. If no unit is written, it defaults to seconds. For example, these are all equivalent: %{code_open}3600%{code_close}, %{code_open}60 minutes%{code_close}, or %{code_open}one hour%{code_close}."
+msgstr ""
+
msgid "Set the due date to %{due_date}."
msgstr "设置到期日期为%{due_date}。"
msgid "Set the iteration to %{iteration_reference}."
msgstr "将迭代设置为%{iteration_reference}。"
+msgid "Set the maximum session time for a web terminal."
+msgstr ""
+
msgid "Set the milestone to %{milestone_reference}."
msgstr "将里程碑设置为%{milestone_reference}。"
-msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
+msgid "Set the per-user rate limit for notes created by web or API requests."
msgstr ""
+msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
+msgstr "以秒为å•ä½è®¾ç½®è¶…时,以将次è¦ç«™ç‚¹çŠ¶æ€å‘é€åˆ°ä¸»ç«™ç‚¹å’Œæ¬¡è¦ç«™ç‚¹å…许的 IP。"
+
msgid "Set time estimate"
msgstr "设置时间估计"
@@ -30462,7 +30911,7 @@ msgid "Set weight to %{weight}."
msgstr "å°†æƒé‡è®¾ç½®ä¸º%{weight}。"
msgid "Set what should be replicated by this secondary site."
-msgstr ""
+msgstr "设置此次è¦èŠ‚点应该å¤åˆ¶çš„内容。"
msgid "SetPasswordToCloneLink|set a password"
msgstr "设置密ç "
@@ -30480,7 +30929,7 @@ msgid "SetStatusModal|Clear status"
msgstr "清除状æ€"
msgid "SetStatusModal|Clear status after"
-msgstr ""
+msgstr "清除状æ€æ åŽçš„状æ€"
msgid "SetStatusModal|Edit status"
msgstr "编辑状æ€"
@@ -30614,6 +31063,9 @@ msgstr "显示æµæ°´çº¿ID"
msgid "Show Pipeline IID"
msgstr "显示æµæ°´çº¿IID"
+msgid "Show all %{issuable_type}."
+msgstr ""
+
msgid "Show all activity"
msgstr "显示所有活动"
@@ -30665,15 +31117,9 @@ msgstr "显示最新版本"
msgid "Show list"
msgstr "显示列表"
-msgid "Show me advanced features"
-msgstr "显示高级功能"
-
msgid "Show me how to add a pipeline"
msgstr "演示如何添加æµæ°´çº¿"
-msgid "Show me the basics"
-msgstr "展示基本功能"
-
msgid "Show one file at a time"
msgstr "一次显示一个文件"
@@ -30712,18 +31158,18 @@ msgstr "显示%{total_count}个议题中的%{limit}项. "
msgid "Showing %{pageSize} of %{total} %{issuableType}"
msgstr "显示 %{pageSize} / %{total} %{issuableType}"
-msgid "Showing %{pageSize} of %{total} issues"
-msgstr "显示%{total}议题中的%{pageSize}项"
-
msgid "Showing all epics"
msgstr "显示所有å²è¯—"
msgid "Showing all issues"
msgstr "显示所有议题"
-msgid "Showing data for workflow items created in this date range. Date range cannot exceed %{maxDateRange} days."
+msgid "Showing data for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
msgstr ""
+msgid "Showing data for workflow items created in this date range. Date range cannot exceed %{maxDateRange} days."
+msgstr "显示在此日期范围内创建的工作æµé¡¹ç›®çš„æ•°æ®ã€‚日期范围ä¸èƒ½è¶…过 %{maxDateRange} 天。"
+
msgid "Showing graphs based on events of the last %{timerange} days."
msgstr "显示基于最近%{timerange}天的事件的图表。"
@@ -30760,6 +31206,15 @@ msgstr "åªå…许使用数字字符"
msgid "Sidebar|Weight"
msgstr "æƒé‡"
+msgid "Sidekiq job compression threshold (bytes)"
+msgstr ""
+
+msgid "Sidekiq job size limit (bytes)"
+msgstr ""
+
+msgid "Sidekiq job size limits"
+msgstr ""
+
msgid "Sign in"
msgstr "登录"
@@ -30767,7 +31222,7 @@ msgid "Sign in / Register"
msgstr "登录/注册"
msgid "Sign in as a user with the matching email address, add the email to this account, or sign-up for a new account using the matching email."
-msgstr ""
+msgstr "以具有匹é…电å­é‚®ä»¶åœ°å€çš„用户身份登录,将电å­é‚®ä»¶æ·»åŠ åˆ°æ­¤è´¦å·ï¼Œæˆ–使用匹é…的电å­é‚®ä»¶æ³¨å†Œæ–°è´¦å·ã€‚"
msgid "Sign in preview"
msgstr "登录预览"
@@ -30880,11 +31335,14 @@ msgstr "网站é…置文件删除失败"
msgid "Site profile not found for given parameters"
msgstr "找ä¸åˆ°ç»™å®šå‚数的站点é…置文件"
+msgid "Sites"
+msgstr ""
+
msgid "Size"
msgstr "大å°"
msgid "Size Limits"
-msgstr ""
+msgstr "大å°é™åˆ¶"
msgid "Size limit per repository (MB)"
msgstr "æ¯ä¸ªä»“库的大å°é™åˆ¶ (MB)"
@@ -30910,20 +31368,23 @@ msgstr "Slack集æˆå…许您通过èŠå¤©çª—å£ä¸­çš„shash命令与GitLab交互ã€
msgid "SlackIntegration|Sends notifications about project events to Slack channels."
msgstr "å‘ Slack 频é“å‘é€æœ‰å…³é¡¹ç›®äº‹ä»¶çš„通知。"
-msgid "SlackService|2. Paste the %{strong_open}Token%{strong_close} into the field below"
-msgstr "2. å°†%{strong_open}Token%{strong_close}粘贴到下é¢çš„字段中"
+msgid "SlackService|1. %{slash_command_link_start}Add a slash command%{slash_command_link_end} in your Slack team using this information:"
+msgstr ""
+
+msgid "SlackService|2. Paste the token from Slack in the %{strong_open}Token%{strong_close} field below."
+msgstr ""
+
+msgid "SlackService|3. Select the %{strong_open}Active%{strong_close} checkbox, select %{strong_open}Save changes%{strong_close}, and start using slash commands in Slack!"
+msgstr ""
-msgid "SlackService|3. Select the %{strong_open}Active%{strong_close} checkbox, press %{strong_open}Save changes%{strong_close} and start using GitLab inside Slack!"
-msgstr "3. 选择%{strong_open}å¯ç”¨%{strong_close}å¤é€‰æ¡†ï¼Œç‚¹å‡»%{strong_open}ä¿å­˜æ›´æ”¹%{strong_close}åŽå¼€å§‹åœ¨Slack中使用GitLabï¼"
+msgid "SlackService|After setup, get a list of available Slack slash commands by entering"
+msgstr ""
msgid "SlackService|Fill in the word that works best for your team."
msgstr "填写最适åˆä½ çš„团队的文字。"
-msgid "SlackService|See list of available commands in Slack after setting up this service, by entering"
-msgstr "设置此æœåŠ¡åŽï¼Œè¯·è¾“入以下内容,查看Slack中å¯ç”¨å‘½ä»¤çš„列表:"
-
-msgid "SlackService|This service allows users to perform common operations on this project by entering slash commands in Slack."
-msgstr "æ­¤æœåŠ¡å…许用户通过在Slack中输入斜æ å‘½ä»¤æ¥å¯¹è¯¥é¡¹ç›®æ‰§è¡Œå¸¸è§æ“作。"
+msgid "SlackService|Perform common operations in this project by entering slash commands in Slack."
+msgstr ""
msgid "Slice multiplier"
msgstr "切片å€æ•°"
@@ -30988,8 +31449,8 @@ msgstr "一些å˜åŒ–未显示"
msgid "Some child epics may be hidden due to applied filters"
msgstr "æŸäº›å­å²è¯—å¯èƒ½ç”±äºŽåº”用筛选器而被éšè—"
-msgid "Some common domains are not allowed. %{read_more_link}."
-msgstr "æŸäº›å¸¸è§åŸŸåä¸è¢«å…许。 %{read_more_link}"
+msgid "Some common domains are not allowed. %{learn_more_link}."
+msgstr ""
msgid "Some of the designs you tried uploading did not change:"
msgstr "您å°è¯•ä¸Šä¼ çš„部分设计没有改å˜ã€‚"
@@ -31072,9 +31533,6 @@ msgstr "编辑评论时出错。请é‡è¯•ã€‚"
msgid "Something went wrong while exporting requirements"
msgstr "导出需求时出现问题"
-msgid "Something went wrong while fetching %{listType} list"
-msgstr "åœ¨èŽ·å– %{listType} 列表时出错了"
-
msgid "Something went wrong while fetching branches"
msgstr "获å–分支时出了错。"
@@ -31129,15 +31587,9 @@ msgstr "æ’入图åƒæ—¶å‡ºäº†é”™ã€‚请é‡è¯•ã€‚"
msgid "Something went wrong while merging this merge request. Please try again."
msgstr "åˆå¹¶æ­¤åˆå¹¶è¯·æ±‚时出错。请é‡è¯•ã€‚"
-msgid "Something went wrong while moving issues."
-msgstr "移动议题时出错。"
-
msgid "Something went wrong while obtaining the Let's Encrypt certificate."
msgstr "获å–Let's Encryptè¯ä¹¦æ—¶å‡ºäº†é”™ã€‚"
-msgid "Something went wrong while performing the action."
-msgstr "执行æ“作时出错。"
-
msgid "Something went wrong while promoting the issue to an epic. Please try again."
msgstr "将议题å‡çº§åˆ°å²è¯—时出错。请å†è¯•ä¸€æ¬¡ã€‚"
@@ -31238,13 +31690,13 @@ msgid "SortOptions|Blocking"
msgstr "阻塞议题数"
msgid "SortOptions|Closed date"
-msgstr ""
+msgstr "关闭日期"
msgid "SortOptions|Closed earlier"
-msgstr ""
+msgstr "更早关闭"
msgid "SortOptions|Closed recently"
-msgstr ""
+msgstr "最近关闭"
msgid "SortOptions|Created date"
msgstr "创建日期"
@@ -31400,7 +31852,7 @@ msgid "Source Branch"
msgstr "æºåˆ†æ”¯"
msgid "Source Editor instance is required to set up an extension."
-msgstr ""
+msgstr "éœ€è¦ Source Editor 实例æ¥è®¾ç½®æ‰©å±•ã€‚"
msgid "Source IP"
msgstr "æºIP"
@@ -31465,8 +31917,11 @@ msgstr "使用%{linkStart}Sourcegraph.com%{linkEnd}。"
msgid "SourcegraphPreferences|Uses a custom %{linkStart}Sourcegraph instance%{linkEnd}."
msgstr "使用自定义的%{linkStart}Sourcegraph实例%{linkEnd}。"
-msgid "Spam Check API Key"
-msgstr "垃圾邮件检查 API 密钥"
+msgid "Spam Check"
+msgstr ""
+
+msgid "Spam Check API key"
+msgstr ""
msgid "Spam Logs"
msgstr "垃圾信æ¯æ—¥å¿—"
@@ -31483,14 +31938,14 @@ msgstr "指定Runner"
msgid "Specified URL cannot be used: \"%{reason}\""
msgstr "无法使用指定的URL:“%{reason}â€"
-msgid "Specify an e-mail address regex pattern to identify default internal users."
-msgstr "指定电å­é‚®ä»¶åœ°å€æ­£åˆ™è¡¨è¾¾å¼æ¨¡å¼ä»¥æ ‡è¯†é»˜è®¤å†…部用户。"
+msgid "Specify an email address regex pattern to identify default internal users."
+msgstr ""
msgid "Speed up your pipelines with Needs relationships"
msgstr "通过Needs关系加速您的æµæ°´çº¿"
msgid "Spent At"
-msgstr ""
+msgstr "花费在"
msgid "Squash commit message"
msgstr "压缩æ交消æ¯"
@@ -31721,7 +32176,7 @@ msgid "Status: %{title}"
msgstr "状æ€: %{title}"
msgid "StatusCheck|%{pending} pending"
-msgstr ""
+msgstr "%{pending} 等待"
msgid "StatusCheck|API to check"
msgstr "API检查"
@@ -31738,8 +32193,8 @@ msgstr "删除 %{name} 状æ€æ£€æŸ¥æ—¶å‡ºé”™ã€‚"
msgid "StatusCheck|An error occurred fetching the status checks."
msgstr "获å–状æ€æ£€æŸ¥æ—¶å‡ºé”™ã€‚"
-msgid "StatusCheck|Apply this status check to any branch or a specific protected branch."
-msgstr "将此状æ€æ£€æŸ¥åº”用于任何分支或特定的å—ä¿æŠ¤åˆ†æ”¯ã€‚"
+msgid "StatusCheck|Apply this status check to all branches or a specific protected branch."
+msgstr ""
msgid "StatusCheck|Check for a status response in Merge Requests. Failures do not block merges. %{link_start}Learn more%{link_end}."
msgstr "检查åˆå¹¶è¯·æ±‚中的状æ€å“应,失败ä¸ä¼šé˜»æ­¢åˆå¹¶ã€‚ %{link_start}了解更多%{link_end}."
@@ -31910,7 +32365,7 @@ msgid "Submit a review"
msgstr "æ交评审"
msgid "Submit as ham"
-msgstr ""
+msgstr "以ham身份æ交"
msgid "Submit as spam"
msgstr "垃圾信æ¯ä¸¾æŠ¥"
@@ -31937,7 +32392,7 @@ msgid "Submit your changes"
msgstr "æ交您的更改"
msgid "Submitted as ham"
-msgstr ""
+msgstr "以ham身份æ交"
msgid "Submitted the current review."
msgstr "å·²æ交当å‰è¯„审。"
@@ -32077,6 +32532,9 @@ msgstr "使用次数将在æ¯å¤©ä¸­åˆ12:00进行更新。"
msgid "Subscriptions"
msgstr "订阅"
+msgid "Subscription|Your subscription for %{strong}%{namespace_name}%{strong_close} has expired and you are now on %{pricing_link_start}the GitLab Free tier%{pricing_link_end}. Don't worry, your data is safe. Get in touch with our support team (%{support_email}). They'll gladly help with your subscription renewal."
+msgstr ""
+
msgid "Subtracted"
msgstr "å‡åŽ»"
@@ -32264,7 +32722,7 @@ msgid "SuperSonics|Cloud licensing"
msgstr "云授æƒ"
msgid "SuperSonics|Cloud licensing is now available. It's an easier way to activate instances and manage subscriptions. Read more about it in our %{blogPostLinkStart}blog post%{blogPostLinkEnd}. Activation codes are available in the %{portalLinkStart}Customers Portal%{portalLinkEnd}."
-msgstr ""
+msgstr "Cloud 许å¯çŽ°å·²æŽ¨å‡ºã€‚这是激活实例和管ç†è®¢é˜…的更简å•æ–¹æ³•ã€‚阅读 %{blogPostLinkStart}åšå®¢æ–‡ç« %{blogPostLinkEnd}中的更多相关信æ¯ã€‚激活ç åœ¨ %{portalLinkStart}客户门户%{portalLinkEnd}中å¯ç”¨ã€‚"
msgid "SuperSonics|Expires on"
msgstr "到期"
@@ -32279,7 +32737,7 @@ msgid "SuperSonics|Get help for the most common connectivity issues by %{linkSta
msgstr "通过 %{linkStart}激活ç æ•…障排查%{linkEnd},获å–最常è§çš„连接问题的帮助。"
msgid "SuperSonics|I agree that my use of the GitLab Software is subject to the Subscription Agreement located at the %{linkStart}Terms of Service%{linkEnd}, unless otherwise agreed to in writing with GitLab."
-msgstr ""
+msgstr "我åŒæ„我对GitLab 软件的使用必须éµå®ˆä½äºŽ %{linkStart}æœåŠ¡æ¡æ¬¾%{linkEnd}的订阅å议, 除éžä¸ŽGitLabå¦æœ‰ä¹¦é¢å议。"
msgid "SuperSonics|ID"
msgstr "ID"
@@ -32291,7 +32749,7 @@ msgid "SuperSonics|Learn how to %{linkStart}activate your subscription%{linkEnd}
msgstr "了解如何 %{linkStart}激活您的订阅%{linkEnd}。"
msgid "SuperSonics|Licensed to"
-msgstr ""
+msgstr "授æƒ"
msgid "SuperSonics|Manage"
msgstr "管ç†"
@@ -32305,9 +32763,12 @@ msgstr "粘贴您的激活ç "
msgid "SuperSonics|Plan"
msgstr "方案"
-msgid "SuperSonics|Ready to get started? A GitLab plan is ideal for scaling organizations and for multi team usage."
+msgid "SuperSonics|Please agree to the Subscription Agreement"
msgstr ""
+msgid "SuperSonics|Ready to get started? A GitLab plan is ideal for scaling organizations and for multi team usage."
+msgstr "准备好开始了å—? GitLab 方案éžå¸¸é€‚åˆæ‰©å±•ç»„织和多团队使用。"
+
msgid "SuperSonics|Renews"
msgstr "续订"
@@ -32335,6 +32796,9 @@ msgstr "åŒæ­¥è®¢é˜…请求。"
msgid "SuperSonics|The activation code is not valid. Please make sure to copy it exactly from the Customers Portal or confirmation email. Learn more about %{linkStart}activating your subscription%{linkEnd}."
msgstr "激活ç æ— æ•ˆã€‚请确ä¿ä»Žå®¢æˆ·ç«¯é—¨æˆ·æˆ–确认电å­é‚®ä»¶å¤åˆ¶å®ƒã€‚ 了解更多关于 %{linkStart}激活您的订阅%{linkEnd}。"
+msgid "SuperSonics|The activation code should be a 24-character alphanumeric string"
+msgstr ""
+
msgid "SuperSonics|There is a connectivity issue."
msgstr "存在连接问题。"
@@ -32377,9 +32841,15 @@ msgstr "您å¯ä»¥å¼€å§‹å…费试用 GitLab 旗舰版,无需任何承诺或付æ
msgid "SuperSonics|You do not have an active subscription"
msgstr "您没有有效订阅"
+msgid "SuperSonics|You have successfully added a license that activates on %{date}. Please see the subscription history table below for more details."
+msgstr ""
+
msgid "SuperSonics|You'll be charged for %{trueUpLinkStart}users over license%{trueUpLinkEnd} on a quarterly or annual basis, depending on the terms of your agreement."
msgstr "æ ¹æ®æ‚¨çš„åè®®æ¡æ¬¾ï¼Œæ‚¨å°†æŒ‰å­£åº¦æˆ–æ¯å¹´ä¸º %{trueUpLinkStart}超过许å¯è¯çš„用户%{trueUpLinkEnd}付费。"
+msgid "SuperSonics|Your future dated license was successfully added"
+msgstr ""
+
msgid "SuperSonics|Your subscription"
msgstr "您的订阅"
@@ -32468,7 +32938,7 @@ msgid "System hook was successfully updated."
msgstr "系统钩å­å·²æˆåŠŸæ›´æ–°ã€‚"
msgid "System hooks are triggered on sets of events like creating a project or adding an SSH key. You can also enable extra triggers, such as push events."
-msgstr ""
+msgstr "系统钩å­æ˜¯åœ¨ä¸€ç³»åˆ—事件上触å‘的,例如创建项目或添加 SSH 密钥。您还å¯ä»¥å¯ç”¨é¢å¤–的触å‘器,例如推é€äº‹ä»¶ã€‚"
msgid "System metrics (Custom)"
msgstr "系统指标(自定义)"
@@ -32632,8 +33102,8 @@ msgstr "模æ¿"
msgid "Template to append to all Service Desk issues"
msgstr "附加到所有æœåŠ¡å°ç”Ÿæˆè®®é¢˜çš„模æ¿"
-msgid "TemplateRepository|Select a repository to make its templates available to all projects. %{link_start}What should the repository contain?%{link_end} "
-msgstr "选择一个仓库以使其模æ¿å¯ç”¨äºŽæ‰€æœ‰é¡¹ç›®ã€‚ %{link_start}仓库应该包å«ä»€ä¹ˆï¼Ÿ%{link_end} "
+msgid "TemplateRepository|Create common files more quickly, and standardize their format."
+msgstr ""
msgid "Templates"
msgstr "模æ¿"
@@ -32675,10 +33145,10 @@ msgid "TerraformBanner|Learn more about GitLab's Backend State"
msgstr "了解有关 GitLab åŽç«¯çŠ¶æ€çš„更多信æ¯"
msgid "TerraformBanner|The GitLab managed Terraform state backend can store your Terraform state easily and securely, and spares you from setting up additional remote resources. Its features include: versioning, encryption of the state file both in transit and at rest, locking, and remote Terraform plan/apply execution."
-msgstr ""
+msgstr "GitLab 管ç†çš„ Terraform state åŽç«¯å¯ä»¥è½»æ¾å®‰å…¨åœ°å­˜å‚¨æ‚¨çš„ Terraform state,并使您无需设置é¢å¤–的远程资æºã€‚它的功能包括:版本控制ã€ä¼ è¾“å’Œé™æ­¢çŠ¶æ€æ–‡ä»¶çš„加密ã€é”定和远程 Terraform 计划/应用执行。"
msgid "TerraformBanner|Using Terraform? Try the GitLab Managed Terraform State"
-msgstr ""
+msgstr "使用 Terraform?å°è¯• GitLab 托管 Terraform State"
msgid "Terraform|%{name} successfully removed"
msgstr "%{name} å·²æˆåŠŸåˆ é™¤"
@@ -32716,7 +33186,7 @@ msgid "Terraform|Cancel"
msgstr "å–消"
msgid "Terraform|Copy Terraform init command"
-msgstr ""
+msgstr "å¤åˆ¶ Terraform init 命令"
msgid "Terraform|Details"
msgstr "详细信æ¯"
@@ -32731,7 +33201,7 @@ msgid "Terraform|Get started with Terraform"
msgstr "Terraform入门"
msgid "Terraform|How to use GitLab-managed Terraform State?"
-msgstr ""
+msgstr "如何使用 GitLab 管ç†çš„ Terraform State?"
msgid "Terraform|Job status"
msgstr "作业状æ€"
@@ -32770,7 +33240,7 @@ msgid "Terraform|States"
msgstr "状æ€"
msgid "Terraform|Terraform init command"
-msgstr ""
+msgstr "Terraform init 命令"
msgid "Terraform|The report %{name} failed to generate."
msgstr "报告%{name}生æˆå¤±è´¥ã€‚"
@@ -32779,7 +33249,7 @@ msgid "Terraform|The report %{name} was generated in your pipelines."
msgstr "报告 %{name} 是在您的æµæ°´çº¿ä¸­ç”Ÿæˆçš„。"
msgid "Terraform|To get access to this terraform state from your local computer, run the following command at the command line. The first line requires a personal access token with API read and write access. %{linkStart}How do I create a personal access token?%{linkEnd}."
-msgstr ""
+msgstr "è¦ä»Žæœ¬åœ°è®¡ç®—机访问此 terraform state,请在命令行中è¿è¡Œä»¥ä¸‹å‘½ä»¤ã€‚第一行需è¦å…·æœ‰ API 读写访问æƒé™çš„个人访问令牌。 %{linkStart}如何创建个人访问令牌?%{linkEnd}."
msgid "Terraform|To remove the State file and its versions, type %{name} to confirm:"
msgstr "è¦åˆ é™¤çŠ¶æ€æ–‡ä»¶åŠå…¶ç‰ˆæœ¬ï¼Œè¯·è¾“å…¥%{name}确认:"
@@ -32794,7 +33264,7 @@ msgid "Terraform|Unlocking state"
msgstr "解é”状æ€"
msgid "Terraform|You are about to remove the state file %{name}. This will permanently delete all the State versions and history. The infrastructure provisioned previously will remain intact, and only the state file with all its versions will be removed. This action cannot be undone."
-msgstr ""
+msgstr "您将è¦åˆ é™¤ state 文件 %{name}。这将永久删除所有 State 版本和历å²è®°å½•ã€‚之å‰é…置的基础架构将ä¿æŒä¸å˜ï¼Œå¹¶ä¸”åªä¼šåˆ é™¤åŒ…å«æ‰€æœ‰ç‰ˆæœ¬çš„ state 文件。此æ“作无法撤消。"
msgid "Terraform|You cannot remove the State file because it's locked. Unlock the State file first before removing it."
msgstr "无法删除状æ€æ–‡ä»¶ï¼Œå› ä¸ºå®ƒå·²è¢«é”定。在删除之å‰å…ˆè§£é”状æ€æ–‡ä»¶ã€‚"
@@ -32834,8 +33304,8 @@ msgstr "新建测试用例"
msgid "TestCases|Search test cases"
msgstr "æœç´¢æµ‹è¯•ç”¨ä¾‹"
-msgid "TestCases|Something went wrong while adding test case to Todo."
-msgstr "添加测试用例到待办事项时出了错。"
+msgid "TestCases|Something went wrong while adding test case to a to-do item."
+msgstr ""
msgid "TestCases|Something went wrong while creating a test case."
msgstr "创建新测试用例时出现错误."
@@ -32846,8 +33316,8 @@ msgstr "获å–测试用例时出错。"
msgid "TestCases|Something went wrong while fetching test cases list."
msgstr "获å–测试用例列表时出错。"
-msgid "TestCases|Something went wrong while marking test case todo as done."
-msgstr "将测试案例标记为完æˆæ—¶å‡ºé”™ã€‚"
+msgid "TestCases|Something went wrong while marking test case to-do item as done."
+msgstr ""
msgid "TestCases|Something went wrong while moving test case."
msgstr "移动测试用例时出错。"
@@ -32943,7 +33413,7 @@ msgid "Tests"
msgstr "测试"
msgid "Text added to the body of all email messages. %{character_limit} character limit"
-msgstr ""
+msgstr "添加到所有电å­é‚®ä»¶æ­£æ–‡çš„文本。 %{character_limit} 字符é™åˆ¶"
msgid "Text style"
msgstr "文本样å¼"
@@ -32961,13 +33431,13 @@ msgid "Thank you for your support request! We are tracking your request as ticke
msgstr "感谢您的支æŒè¯·æ±‚ï¼æˆ‘们会通过工å•#%{issue_iid}追踪您的请求。我们将尽快回å¤æ‚¨ã€‚"
msgid "Thanks for signing up to GitLab!"
-msgstr ""
+msgstr "感谢您注册 GitLabï¼"
msgid "Thanks for your purchase!"
msgstr "感谢购买ï¼"
-msgid "That is ok, I do not want to renew"
-msgstr "好的,我ä¸å¸Œæœ›ç»­çº¦"
+msgid "That's OK, I don't want to renew"
+msgstr ""
msgid "That's it, well done!"
msgstr "就是这样,åšå¾—好ï¼"
@@ -32976,7 +33446,7 @@ msgid "The \"%{group_path}\" group allows you to sign in with your Single Sign-O
msgstr "群组“%{group_path}â€å…许您使用SSO以登录å¸æˆ·"
msgid "The %{featureName} feature is part of your GitLab Ultimate trial."
-msgstr ""
+msgstr "%{featureName} 功能是 GitLab 旗舰版 试用版的一部分。"
msgid "The %{link_start}true-up model%{link_end} allows having more users, and additional users will incur a retroactive charge on renewal."
msgstr "%{link_start}校准模å¼%{link_end}å…许有é¢å¤–用户,这些é¢å¤–用户在更新订阅时将会产生追溯费用。"
@@ -32988,11 +33458,11 @@ msgid "The %{type} contains the following error:"
msgid_plural "The %{type} contains the following errors:"
msgstr[0] "%{type} 包å«ä»¥ä¸‹é”™è¯¯ï¼š"
-msgid "The API key used by GitLab for accessing the Spam Check service endpoint"
+msgid "The API key used by GitLab for accessing the Spam Check service endpoint."
msgstr ""
msgid "The GitLab subscription service (customers.gitlab.com) is currently experiencing an outage. You can monitor the status and get updates at %{linkStart}status.gitlab.com%{linkEnd}."
-msgstr ""
+msgstr "GitLab 订阅æœåŠ¡ (customers.gitlab.com) ç›®å‰æ­£åœ¨ä¸­æ–­ã€‚您å¯ä»¥é€šè¿‡ %{linkStart}status.gitlab.com%{linkEnd}监控状æ€å¹¶èŽ·å–更新。"
msgid "The GitLab user to which the Jira user %{jiraDisplayName} will be mapped"
msgstr "Jira用户%{jiraDisplayName}将映射到的GitLab用户"
@@ -33016,7 +33486,7 @@ msgid "The URL defined on the primary node that secondary nodes should use to co
msgstr "在主节点上定义的URL,次è¦èŠ‚点应使用该URL与其è”系。"
msgid "The URL defined on the primary node that secondary nodes should use to contact it. %{linkStart}Learn more%{linkEnd}"
-msgstr ""
+msgstr "在主节点上定义的URL,次è¦èŠ‚点将用此网å€æ¥è”络主节点。%{linkStart}更多信æ¯%{linkEnd}"
msgid "The URL of the Jenkins server."
msgstr "Jenkins æœåŠ¡å™¨çš„ URL。"
@@ -33027,9 +33497,6 @@ msgstr "URL 应该以 http:// 或 https:// 开头"
msgid "The URL to use for connecting to Elasticsearch. Use a comma-separated list to support clustering (e.g., \"http://localhost:9200, http://localhost:9201\")."
msgstr "用于连接到Elasticsearchçš„URL。使用逗å·åˆ†éš”的列表æ¥æ”¯æŒç¾¤é›†(例如,“http://localhost:9200, http://localhost:9201â€)。"
-msgid "The Vulnerability Report shows the results of the last successful pipeline run on the default branch."
-msgstr "æ¼æ´žæŠ¥å‘Šæ˜¾ç¤ºäº†åœ¨é»˜è®¤åˆ†æ”¯ä¸Šæœ€åŽä¸€æ¬¡æˆåŠŸæµæ°´çº¿ä¸­çš„结果。"
-
msgid "The X509 Certificate to use when mutual TLS is required to communicate with the external authorization service. If left blank, the server certificate is still validated when accessing over HTTPS."
msgstr "在需è¦ç›¸äº’ TLS 与外部授æƒæœåŠ¡é€šä¿¡æ—¶ä½¿ç”¨çš„ X509 è¯ä¹¦ã€‚如果ä¿ç•™ä¸ºç©º, 则在访问 HTTPS æ—¶ä»ç„¶éªŒè¯æœåŠ¡å™¨è¯ä¹¦ã€‚"
@@ -33087,9 +33554,6 @@ msgstr "新项目的默认 CI/CD é…置文件和路径。"
msgid "The default branch for this project has been changed. Please update your bookmarks."
msgstr "此项目的默认分支已更改,请更新您的书签。"
-msgid "The default expiration time for job artifacts. 0 for unlimited. The default unit is in seconds, but you can use other units, for example %{code_open}4 mins 2 sec%{code_close}, %{code_open}2h42min%{code_close}."
-msgstr "作业产物的默认过期时间。 0 表示无é™åˆ¶ã€‚默认å•ä½ä¸ºç§’,但您å¯ä»¥ä½¿ç”¨å…¶ä»–å•ä½ï¼Œä¾‹å¦‚ %{code_open}4 mins 2 sec%{code_close}〠%{code_open}2h42min%{code_close}。"
-
msgid "The dependency list details information about the components used within your project."
msgstr "ä¾èµ–项列表详细说明了项目中使用组件的信æ¯ã€‚"
@@ -33233,7 +33697,7 @@ msgid "The latest pipeline for this merge request did not complete successfully.
msgstr "æ­¤åˆå¹¶è¯·æ±‚的最新æµæ°´çº¿æœªæˆåŠŸå®Œæˆã€‚"
msgid "The latest pipeline for this merge request has failed."
-msgstr ""
+msgstr "æ­¤åˆå¹¶è¯·æ±‚的最新æµæ°´çº¿å·²å¤±è´¥ã€‚"
msgid "The license key is invalid. Make sure it is exactly as you received it from GitLab Inc."
msgstr "许å¯è¯å¯†é’¥æ— æ•ˆã€‚请确ä¿å®ƒä¸Žæ‚¨ä»ŽGitLab Inc.收到的一致。"
@@ -33280,9 +33744,6 @@ msgstr "æ­¤åˆå¹¶è¯·æ±‚çš„åˆå¹¶å†²çªå·²è§£å†³ã€‚"
msgid "The merge conflicts for this merge request have already been resolved. Please return to the merge request."
msgstr "æ­¤åˆå¹¶è¯·æ±‚çš„åˆå¹¶å†²çªå·²å¾—到解决。请返回åˆå¹¶è¯·æ±‚。"
-msgid "The merge request can now be merged."
-msgstr "åˆå¹¶è¯·æ±‚现在å¯ä»¥åˆå¹¶äº†ã€‚"
-
msgid "The metric must be one of %{metrics}."
msgstr "指标必须是 %{metrics} 之一。"
@@ -33425,7 +33886,7 @@ msgid "The tag name can't be changed for an existing release."
msgstr "对于现有å‘布,ä¸èƒ½æ›´æ”¹æ ‡ç­¾å称。"
msgid "The time period in seconds that the maximum requests per project limit applies to."
-msgstr ""
+msgstr "æ¯ä¸ªé¡¹ç›®æœ€å¤§è¯·æ±‚所适用的时间间隔(秒)。"
msgid "The update action will time out after %{number_of_minutes} minutes. For big repositories, use a clone/push combination."
msgstr "æ›´æ–°æ“作将在 %{number_of_minutes} 分钟åŽè¶…时。对于大型仓库,请使用clone/push组åˆã€‚"
@@ -33560,19 +34021,19 @@ msgid "There are no variables yet."
msgstr "还没有å˜é‡ã€‚"
msgid "There are pending advanced search migrations which require indexing to be paused. Indexing must remain paused until the migrations are completed."
-msgstr ""
+msgstr "存在需è¦æš‚åœç´¢å¼•çš„待处ç†é«˜çº§æœç´¢è¿ç§»ã€‚索引必须ä¿æŒæš‚åœï¼Œç›´åˆ°è¿ç§»å®Œæˆã€‚"
msgid "There are running deployments on the environment. Please retry later."
msgstr "环境上有正在è¿è¡Œçš„部署。请ç¨åŽé‡è¯•ã€‚"
msgid "There are several file size limits in place for the Package Registry."
-msgstr ""
+msgstr "软件包库有几个文件大å°é™åˆ¶ã€‚"
msgid "There are several rate limits in place to protect the system."
msgstr "为了ä¿æŠ¤è¯¥ç³»ç»Ÿï¼Œå®žè¡Œäº†å‡ ç§é€ŸçŽ‡é™åˆ¶ã€‚"
msgid "There are several size limits in place."
-msgstr ""
+msgstr "有几个大å°é™åˆ¶ã€‚"
msgid "There is a halted Elasticsearch migration"
msgstr "Elasticsearch è¿ç§»å·²åœæ­¢"
@@ -33620,7 +34081,7 @@ msgid "There was a problem fetching labels."
msgstr "获å–标记时出错。"
msgid "There was a problem fetching linked pipelines."
-msgstr ""
+msgstr "获å–链接的æµæ°´çº¿æ—¶å‡ºçŽ°é—®é¢˜ã€‚"
msgid "There was a problem fetching milestones."
msgstr "获å–里程碑时出错。"
@@ -33658,8 +34119,8 @@ msgstr "å‘é€ç¡®è®¤é‚®ä»¶æ—¶å‡ºçŽ°é—®é¢˜"
msgid "There was a problem updating the keep latest artifacts setting."
msgstr "æ›´æ–°ä¿æŒæœ€æ–°äº§ç‰©è®¾ç½®æ—¶å‡ºçŽ°é—®é¢˜ã€‚"
-msgid "There was an error %{message} todo."
-msgstr "%{message}待办事项时出现错误"
+msgid "There was an error %{message} to-do item."
+msgstr ""
msgid "There was an error adding a To Do."
msgstr "添加待办事项时出现错误"
@@ -33697,6 +34158,9 @@ msgstr "获å–阶段中ä½æ•°æ®æ—¶å‡ºé”™"
msgid "There was an error fetching projects"
msgstr "获å–项目时出错"
+msgid "There was an error fetching search autocomplete suggestions"
+msgstr ""
+
msgid "There was an error fetching stage total counts"
msgstr "获å–阶段总计数时出错"
@@ -33815,7 +34279,7 @@ msgid "There was an error with the reCAPTCHA. Please solve the reCAPTCHA again."
msgstr "reCAPTCHA 验è¯é”™è¯¯ã€‚请å†æ¬¡éªŒè¯ reCAPTCHA。"
msgid "These dates affect how your epics appear in the roadmap. Set a fixed date or one inherited from the milestones assigned to issues in this epic."
-msgstr ""
+msgstr "这些日期会影å“您的å²è¯—在路线图中的显示方å¼ã€‚设置一个固定日期或从分é…给此å²è¯—中议题的里程碑继承的日期。"
msgid "These examples show how to trigger this project's pipeline for a branch or tag."
msgstr "这些示例显示了如何为分支或标记触å‘此项目的æµæ°´çº¿ã€‚"
@@ -34021,6 +34485,9 @@ msgstr "此字段为必填项"
msgid "This field is required."
msgstr "该字段是必填字段。"
+msgid "This form is disabled in preview"
+msgstr ""
+
msgid "This group"
msgstr "当å‰ç¾¤ç»„"
@@ -34042,9 +34509,6 @@ msgstr "此群组已安排在%{date}永久删除"
msgid "This group is linked to a subscription"
msgstr "此群组已链接到订阅"
-msgid "This group, including all subgroups, projects and git repositories, will be reachable from only the specified IP address ranges."
-msgstr "此群组,包括所有å­ç¾¤ç»„ã€é¡¹ç›®å’Œgit仓库,将åªèƒ½ä»ŽæŒ‡å®šçš„IP地å€èŒƒå›´å†…访问。"
-
msgid "This group, its subgroups and projects has been scheduled for removal on %{date}."
msgstr "此群组ã€å…¶å­ç¾¤ç»„和项目已安排在%{date}移除。"
@@ -34094,7 +34558,7 @@ msgid "This issue is currently blocked by the following issues:"
msgstr "此问题目å‰è¢«ä»¥ä¸‹é—®é¢˜é˜»æ­¢ï¼š"
msgid "This issue is hidden because its author has been banned"
-msgstr ""
+msgstr "此议题已éšè—,因为其作者已被å°ç¦"
msgid "This issue is in a child epic of the filtered epic"
msgstr "此议题在筛选å²è¯—çš„å­å²è¯—中"
@@ -34324,9 +34788,6 @@ msgstr "此建议已ç»ä¸Žå®ƒçš„内容相åŒã€‚"
msgid "This user cannot be unlocked manually from GitLab"
msgstr "无法从GitLab手动解ç¦æ­¤ç”¨æˆ·"
-msgid "This user does not have a pending request"
-msgstr "此用户没有待处ç†è¯·æ±‚"
-
msgid "This user has an unconfirmed email address (%{email}). You may force a confirmation."
msgstr "此用户有一个未ç»ç¡®è®¤çš„电å­é‚®ä»¶åœ°å€ (%{email})。您å¯ä»¥å¼ºåˆ¶ç¡®è®¤ã€‚"
@@ -34435,9 +34896,6 @@ msgstr "æ¯ç§’æ“作数"
msgid "ThreatMonitoring|Packet Activity"
msgstr "æ•°æ®åŒ…活动"
-msgid "ThreatMonitoring|Policies"
-msgstr "ç­–ç•¥"
-
msgid "ThreatMonitoring|Requests"
msgstr "请求"
@@ -34489,6 +34947,12 @@ msgstr "未审核"
msgid "ThreatMonitoring|View documentation"
msgstr "查看文档"
+msgid "Threshold in bytes at which to compress Sidekiq job arguments."
+msgstr ""
+
+msgid "Threshold in bytes at which to reject Sidekiq jobs. Set this to 0 to if you don't want to limit Sidekiq jobs."
+msgstr ""
+
msgid "Throughput"
msgstr "åžåé‡"
@@ -34498,6 +34962,9 @@ msgstr "星期四"
msgid "Time"
msgstr "时间"
+msgid "Time (in hours) that users are allowed to skip forced configuration of two-factor authentication."
+msgstr ""
+
msgid "Time Spent"
msgstr "耗时"
@@ -34564,8 +35031,8 @@ msgstr "时区"
msgid "TimeTrackingEstimated|Est"
msgstr "预计"
-msgid "TimeTracking|%{startTag}Spent: %{endTag}%{timeSpentHumanReadable}"
-msgstr "%{startTag}花费时间: %{endTag}%{timeSpentHumanReadable}"
+msgid "TimeTracking|%{spentStart}Spent: %{spentEnd}"
+msgstr ""
msgid "TimeTracking|Estimated:"
msgstr "预计:"
@@ -34715,13 +35182,13 @@ msgid "Timeout connecting to the Google API. Please try again."
msgstr "连接Google API超时。请é‡è¯•ã€‚"
msgid "Timeout for moderately fast Gitaly operations (in seconds). Provide a value between Default timeout and Fast timeout."
-msgstr ""
+msgstr "中等速度的 Gitaly æ“作超时(以秒为å•ä½ï¼‰ã€‚æ供一个介于默认超时和快速超时之间的值。"
msgid "Timeout for most Gitaly operations (in seconds)."
-msgstr ""
+msgstr "大多数 Gitaly æ“作的超时(以秒为å•ä½ï¼‰ã€‚"
msgid "Timeout for the fastest Gitaly operations (in seconds)."
-msgstr ""
+msgstr "最快的 Gitaly æ“作超时(以秒为å•ä½ï¼‰ã€‚"
msgid "Timezone"
msgstr "时区"
@@ -34776,6 +35243,9 @@ msgstr "è¦æŽ¥å—此邀请,请登录。"
msgid "To access this domain create a new DNS record"
msgstr "è¦è®¿é—®æ­¤åŸŸï¼Œè¯·åˆ›å»ºæ–°çš„DNS记录"
+msgid "To add a custom suffix, set up a Service Desk email address. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "To add an SSH key you need to %{generate_link_start}generate one%{link_end} or use an %{existing_link_start}existing key%{link_end}."
msgstr "è¦æ·»åŠ ä¸€ä¸ªSSH密钥, 您需è¦%{generate_link_start}生æˆä¸€ä¸ª%{link_end}或使用一个%{existing_link_start}现有的密钥%{link_end}。"
@@ -34797,14 +35267,17 @@ msgstr "è¦è¿žæŽ¥GitHub仓库,首先需è¦æŽˆæƒGitLab访问列表中的GitHub
msgid "To connect an SVN repository, check out %{svn_link}."
msgstr "如è¦è¿žæŽ¥SVN仓库,请查看 %{svn_link}。"
+msgid "To continue using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
+msgstr ""
+
msgid "To continue, you need to select the link in the confirmation email we sent to verify your email address. If you didn't get our email, select %{strongStart}Resend confirmation email.%{strongEnd}"
msgstr "è¦ç»§ç»­ï¼Œæ‚¨éœ€è¦é€‰æ‹©æˆ‘们å‘é€çš„确认电å­é‚®ä»¶ä¸­çš„链接以验è¯æ‚¨çš„电å­é‚®ä»¶åœ°å€ã€‚如果您没有收到我们的电å­é‚®ä»¶ï¼Œè¯·é€‰æ‹© %{strongStart}é‡æ–°å‘é€ç¡®è®¤ç”µå­é‚®ä»¶ã€‚%{strongEnd}"
msgid "To define internal users, first enable new users set to external"
msgstr "è¦å®šä¹‰å†…部用户,请首先å¯ç”¨è®¾ç½®ä¸ºå¤–部的新用户"
-msgid "To enable Registration Features, make sure \"Enable service ping\" is checked."
-msgstr "è¦å¯ç”¨æ³¨å†ŒåŠŸèƒ½ï¼Œè¯·ç¡®ä¿é€‰ä¸­â€œå¯ç”¨æœåŠ¡ pingâ€ã€‚"
+msgid "To enable Registration Features, first enable Service Ping."
+msgstr ""
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
msgstr "为ä¿è¯ä¸ªäººå†…容ä¸ä¸¢å¤±ï¼Œæœ¬è´¦å·ä»…用于与 %{group_name}相关的事项。"
@@ -34830,8 +35303,8 @@ msgstr "首先,请您输入您的 Gitea æœåŠ¡å™¨åœ°å€å’Œä¸€ä¸ª %{link_to_per
msgid "To get started, use the link below to confirm your account."
msgstr "首先,请使用以下链接确认您的å¸æˆ·ã€‚"
-msgid "To help improve GitLab and its user experience, GitLab will periodically collect usage information."
-msgstr "为了帮助改进GitLabåŠæå‡ç”¨æˆ·ä½“验, GitLab将定期收集使用信æ¯ã€‚"
+msgid "To help improve GitLab and its user experience, GitLab periodically collects usage information."
+msgstr ""
msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
msgstr "为了帮助改进GitLab,我们会定期%{docs_link}。您å¯ä»¥éšæ—¶é€šè¿‡%{settings_link}更改设置。"
@@ -34863,8 +35336,8 @@ msgstr "为了个性化您的GitLab体验,我们想了解更多关于您的信
msgid "To preserve performance only %{strong_open}%{display_size} of %{real_size}%{strong_close} files are displayed."
msgstr "为了ä¿è¯æ€§èƒ½ï¼Œä»…显示文件中的总计%{strong_open}%{real_size}中的%{display_size}%{strong_close}。"
-msgid "To protect this issue's confidentiality, %{forkLink} and set the fork's visibility to private."
-msgstr "为了ä¿è¯æ­¤è®®é¢˜çš„ç§å¯†æ€§ï¼Œ%{forkLink}并将派生项目的å¯è§æ€§è®¾ç½®ä¸ºç§æœ‰ã€‚"
+msgid "To protect this issue's confidentiality, %{linkStart}fork this project%{linkEnd} and set the fork's visibility to private."
+msgstr ""
msgid "To protect this issue's confidentiality, a private fork of this project was selected."
msgstr "为了ä¿è¯æ­¤è®®é¢˜çš„ç§å¯†æ€§ï¼Œé€‰æ‹©äº†è¯¥é¡¹ç›®çš„ç§æœ‰æ´¾ç”Ÿã€‚"
@@ -34896,12 +35369,15 @@ msgstr "è¦æŸ¥çœ‹è¯¥é¡¹ç›®çš„è¿ç»´è¯¦ç»†ä¿¡æ¯ï¼Œè¯·ä¸Ž%{groupName}群组的所
msgid "To set up SAML authentication for your group through an identity provider like Azure, Okta, Onelogin, Ping Identity, or your custom SAML 2.0 provider:"
msgstr "通过Azure,Okta,Onelogin,Ping Identity或自定义SAML 2.0等身份验è¯ç¨‹åºä¸ºæ‚¨çš„群组设置SAML身份验è¯ï¼š"
-msgid "To set up this service:"
-msgstr "设置此æœåŠ¡ï¼š"
+msgid "To set up this integration:"
+msgstr ""
msgid "To specify the notification level per project of a group you belong to, you need to visit project page and change notification level there."
msgstr "è‹¥è¦æŒ‡å®šæ‚¨æ‰€å±žçš„群组的æ¯ä¸ªé¡¹ç›®çš„通知级别,您需è¦è®¿é—®é¡¹ç›®é¡µé¢ï¼Œæ›´æ”¹é€šçŸ¥çº§åˆ«ã€‚"
+msgid "To start using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
+msgstr ""
+
msgid "To unsubscribe from this issue, please paste the following link into your browser:"
msgstr "è‹¥è¦é€€è®¢æ­¤é—®é¢˜ï¼Œè¯·å°†ä»¥ä¸‹é“¾æŽ¥ç²˜è´´åˆ°æ‚¨çš„æµè§ˆå™¨ï¼š"
@@ -35140,7 +35616,7 @@ msgid "TransferProject|Project cannot be transferred, because tags are present i
msgstr "项目无法转移,因为标签存在于其容器镜åƒåº“中"
msgid "TransferProject|Project is already in this namespace."
-msgstr ""
+msgstr "项目已ç»åœ¨è¿™ä¸ªå‘½å空间中。"
msgid "TransferProject|Project with same name or path in target namespace already exists"
msgstr "目标命å空间中已存在具有相åŒå称或路径的项目"
@@ -35149,10 +35625,10 @@ msgid "TransferProject|Root namespace can't be updated if project has NPM packag
msgstr "如果项目具有NPM软件包,则无法更新根命å空间"
msgid "TransferProject|You don't have permission to transfer projects into that namespace."
-msgstr ""
+msgstr "您没有æƒé™å°†é¡¹ç›®ä¼ è¾“到该命å空间中。"
msgid "TransferProject|You don't have permission to transfer this project."
-msgstr ""
+msgstr "您没有æƒé™ä¼ è¾“此项目。"
msgid "Tree view"
msgstr "树形视图"
@@ -35204,25 +35680,25 @@ msgid "Trial|Continue using the basic features of GitLab for free."
msgstr "继续å…费使用基本功能。"
msgid "Trial|Country"
-msgstr ""
+msgstr "国家"
msgid "Trial|Dismiss"
-msgstr ""
+msgstr "驳回"
msgid "Trial|First name"
msgstr "åå­—"
msgid "Trial|GitLab Ultimate trial (optional)"
-msgstr ""
+msgstr "GitLab Ultimate 试用版(å¯é€‰ï¼‰"
msgid "Trial|Hi%{salutation}, your GitLab Ultimate trial lasts for 30 days, but you can keep your free GitLab account forever. We just need some additional information about %{company} to activate your trial."
-msgstr ""
+msgstr "å—¨%{salutation},您的 GitLab Ultimate 试用期为 30 天,但您å¯ä»¥æ°¸ä¹…ä¿ç•™å…费的 GitLab è´¦å·ã€‚我们åªéœ€è¦ä¸€äº›å…³äºŽ %{company} 附加信æ¯å³å¯æ¿€æ´»æ‚¨çš„试用版。"
msgid "Trial|How many employees will use Gitlab?"
-msgstr ""
+msgstr "有多少员工会使用Gitlab?"
msgid "Trial|How many users will be evaluating the trial?"
-msgstr ""
+msgstr "有多少用户会评价试用版?"
msgid "Trial|Last name"
msgstr "姓æ°"
@@ -35231,25 +35707,25 @@ msgid "Trial|Number of employees"
msgstr "员工人数"
msgid "Trial|Please select a country"
-msgstr ""
+msgstr "请选择国家"
msgid "Trial|Successful trial activation image"
-msgstr ""
+msgstr "å·²æˆåŠŸæ¿€æ´»é•œåƒ"
msgid "Trial|Telephone number"
msgstr "电è¯å·ç "
msgid "Trial|Upgrade to Ultimate to keep using GitLab with advanced features."
-msgstr ""
+msgstr "å‡çº§ä¸ºæ——舰版以ä¿æŒä½¿ç”¨ GitLab 高级功能。"
msgid "Trial|We will activate your trial on your group after you complete this step. After 30 days, you can:"
-msgstr ""
+msgstr "在您完æˆæ­¤æ­¥éª¤åŽï¼Œæˆ‘们将在您的群组中激活您的试用。 30 天åŽï¼Œæ‚¨å¯ä»¥ï¼š"
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 ""
+msgstr "您的 GitLab Ultimate 试用期为 30 天,但您å¯ä»¥æ°¸ä¹…ä¿ç•™å…费的 GitLab å¸æˆ·ã€‚我们åªéœ€è¦ä¸€äº›é¢å¤–çš„ä¿¡æ¯æ¥æ¿€æ´»æ‚¨çš„试用版。"
msgid "Trial|your company"
-msgstr ""
+msgstr "您的公å¸"
msgid "Trigger"
msgstr "触å‘器"
@@ -35261,7 +35737,7 @@ msgid "Trigger cluster reindexing"
msgstr "触å‘集群é‡å»ºç´¢å¼•"
msgid "Trigger cluster reindexing. This feature should be used with an index that was created after 13.0."
-msgstr ""
+msgstr "触å‘集群索引é‡å»ºï¼Œæ­¤åŠŸèƒ½åº”与 13.0 之åŽåˆ›å»ºçš„索引一起使用。"
msgid "Trigger manual job"
msgstr "触å‘手动作业"
@@ -35270,7 +35746,7 @@ msgid "Trigger pipelines for mirror updates"
msgstr "触å‘é•œåƒæ›´æ–°çš„æµæ°´çº¿"
msgid "Trigger pipelines when branches or tags are updated in the upstream repository. Depending on the activity of the upstream repository, this may greatly increase the load on your CI runners. Only enable this if you know they can handle the load."
-msgstr ""
+msgstr "当分支或标签更新到上游仓库时触å‘管é“, å–决于上游存储库的活动,这å¯èƒ½ä¼šå¤§å¤§å¢žåŠ æ‚¨çš„ CI è¿è¡Œå™¨çš„è´Ÿè·ï¼Œ åªæœ‰å½“你知é“他们å¯ä»¥å¤„ç†è´Ÿè½½æ—¶æ‰å¯ç”¨æ­¤åŠŸèƒ½ã€‚"
msgid "Trigger removed."
msgstr "触å‘器已删除。"
@@ -35384,7 +35860,7 @@ msgid "Two-factor authentication is not enabled for this user"
msgstr "此用户未å¯ç”¨åŒé‡éªŒè¯"
msgid "Two-factor grace period"
-msgstr ""
+msgstr "åŒå› ç´ å®½é™æœŸ"
msgid "Type"
msgstr "类型"
@@ -35429,19 +35905,19 @@ msgid "URL must start with %{codeStart}http://%{codeEnd}, %{codeStart}https://%{
msgstr "URL必须以%{codeStart}http://%{codeEnd}, %{codeStart}https://%{codeEnd}或%{codeStart}ftp://%{codeEnd}开始"
msgid "URL of the Grafana instance to link to from the Metrics Dashboard menu item."
-msgstr ""
+msgstr "è¦ä»ŽæŒ‡æ ‡ä»ªè¡¨ç›˜èœå•é¡¹é“¾æŽ¥åˆ° Grafana 实例的 URL。"
msgid "URL of the external Spam Check endpoint"
msgstr "外部垃圾信æ¯æ£€æŸ¥ç«¯ç‚¹URL"
msgid "URL of the external storage to serve the repository static objects."
-msgstr ""
+msgstr "用于为仓库é™æ€å¯¹è±¡æä¾›æœåŠ¡çš„外部存储的 URL。"
msgid "URL or request ID"
msgstr "URL或请求ID"
msgid "USER %{user_name} WILL BE REMOVED! Are you sure?"
-msgstr ""
+msgstr "用户 %{user_name} 将被删除ï¼æ‚¨ç¡®å®šå—?"
msgid "USER %{user} WILL BE REMOVED! Are you sure?"
msgstr "用户 %{user} 将被删除ï¼ä½ ç¡®å®šå—?"
@@ -35488,9 +35964,6 @@ msgstr "无法获å–此项目的分支列表。"
msgid "Unable to fetch branches list, please close the form and try again"
msgstr "无法获å–分支列表,请关闭表å•å¹¶é‡è¯•"
-msgid "Unable to fetch unscanned projects"
-msgstr "无法获å–未扫æ的项目"
-
msgid "Unable to fetch vulnerable projects"
msgstr "无法获å–å¯èƒ½å­˜åœ¨æ¼æ´žçš„项目"
@@ -35545,11 +36018,20 @@ msgstr "当å‰æ— æ³•æ›´æ–°æ­¤ å²è¯—。"
msgid "Unable to update this issue at this time."
msgstr "当å‰æ— æ³•æ›´æ–°è¿™ä¸ªè®®é¢˜ã€‚"
+msgid "Unapprove a merge request"
+msgstr ""
+
+msgid "Unapprove the current merge request."
+msgstr ""
+
+msgid "Unapproved the current merge request."
+msgstr ""
+
msgid "Unarchive project"
msgstr "å–消归档项目"
msgid "Unarchiving the project will restore its members' ability to make changes to it. The repository can be committed to, and issues, comments, and other entities can be created. %{strong_start}Once active, this project shows up in the search and on the dashboard.%{strong_end} %{link_start}Learn more.%{link_end}"
-msgstr ""
+msgstr "å–消归档项目将æ¢å¤å…¶æˆå‘˜å¯¹å…¶è¿›è¡Œæ›´æ”¹çš„能力。å¯ä»¥æ交仓库,并且å¯ä»¥åˆ›å»ºè®®é¢˜ã€è¯„论和其他实体。 %{strong_start}一旦激活,该项目就会显示在æœç´¢å’Œä»ªè¡¨æ¿ä¸Šã€‚%{strong_end} %{link_start}了解更多。%{link_end}"
msgid "Unassign from commenting user"
msgstr "å–消分é…给评论用户"
@@ -35557,18 +36039,15 @@ msgstr "å–消分é…给评论用户"
msgid "Unassigned"
msgstr "未分é…"
-msgid "Unauthenticated API request rate limit"
-msgstr "未ç»èº«ä»½éªŒè¯çš„ API 请求速率é™åˆ¶"
-
-msgid "Unauthenticated rate limit period in seconds"
-msgstr "未ç»èº«ä»½éªŒè¯çš„速率é™åˆ¶æ—¶é—´ï¼ˆä»¥ç§’为å•ä½ï¼‰"
-
-msgid "Unauthenticated request rate limit"
-msgstr "无身份验è¯çš„API请求速率é™åˆ¶"
+msgid "Unauthenticated API rate limit period in seconds"
+msgstr ""
msgid "Unauthenticated requests"
msgstr "未认è¯çš„请求"
+msgid "Unauthenticated web rate limit period in seconds"
+msgstr ""
+
msgid "Undo"
msgstr "撤消"
@@ -35588,7 +36067,7 @@ msgid "Unfortunately, your email message to GitLab could not be processed."
msgstr "很é—憾,您å‘é€ç»™GitLab的电å­é‚®ä»¶æ— æ³•å¤„ç†ã€‚"
msgid "Unhappy?"
-msgstr ""
+msgstr "ä¸å–œæ¬¢ï¼Ÿ"
msgid "Units|ms"
msgstr "毫秒"
@@ -35668,18 +36147,6 @@ msgstr "将主题置为未解决"
msgid "Unresolved"
msgstr "未解决的"
-msgid "UnscannedProjects|15 or more days"
-msgstr "15日或更多"
-
-msgid "UnscannedProjects|30 or more days"
-msgstr "30日或更多"
-
-msgid "UnscannedProjects|5 or more days"
-msgstr "5日或更多"
-
-msgid "UnscannedProjects|60 or more days"
-msgstr "60日或更多"
-
msgid "Unschedule job"
msgstr "å–消作业计划"
@@ -35714,13 +36181,13 @@ msgid "Until"
msgstr "直到"
msgid "Until revoked, expired personal access tokens pose a security risk."
-msgstr ""
+msgstr "在撤销之å‰ï¼Œè¿‡æœŸçš„个人访问令牌会带æ¥å®‰å…¨é£Žé™©ã€‚"
msgid "Unused"
msgstr "未使用"
msgid "Unused, previous indices: %{index_names} will be deleted after %{time} automatically."
-msgstr ""
+msgstr "未使用,以å‰çš„索引: %{index_names} 将在 %{time} åŽè‡ªåŠ¨åˆ é™¤ã€‚"
msgid "Unverified"
msgstr "未验è¯"
@@ -35876,7 +36343,7 @@ msgid "Uploads"
msgstr "上传"
msgid "Upon performing this action, the contents of this group, its subgroup and projects will be permanently deleted after %{deletion_adjourned_period} days on %{date}. Until that time:"
-msgstr ""
+msgstr "执行此æ“作åŽï¼Œè¯¥ç¾¤ç»„ã€å…¶å­ç»„和项目的内容将%{deletion_adjourned_period} 天åŽåœ¨ %{date} 永久删除。到那时之å‰ï¼š"
msgid "Upstream"
msgstr "上游"
@@ -35899,6 +36366,9 @@ msgstr "使用情况统计"
msgid "UsageQuota|%{help_link_start}Shared runners%{help_link_end} are disabled, so there are no limits set on pipeline usage"
msgstr "%{help_link_start}共享Runner%{help_link_end}å·²ç¦ç”¨ï¼Œæ‰€ä»¥æµæ°´çº¿ä½¿ç”¨æ²¡æœ‰è®¾ç½®é™åˆ¶"
+msgid "UsageQuota|%{linkTitle} help link"
+msgstr ""
+
msgid "UsageQuota|%{percentageLeft} of purchased storage is available"
msgstr "%{percentageLeft}购买的存储空间å¯ç”¨"
@@ -35908,6 +36378,9 @@ msgstr "产物"
msgid "UsageQuota|Artifacts is a sum of build and pipeline artifacts."
msgstr "产物是构建产物和æµæ°´çº¿äº§ç‰©çš„总和。"
+msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
+msgstr ""
+
msgid "UsageQuota|Buy additional minutes"
msgstr "购买更多分钟数"
@@ -35917,9 +36390,21 @@ msgstr "CI 分钟使用é‡ï¼ˆæŒ‰æœˆï¼‰"
msgid "UsageQuota|CI minutes usage by project"
msgstr "CI 分钟使用é‡ï¼ˆæŒ‰é¡¹ç›®ï¼‰"
+msgid "UsageQuota|Code packages and container images."
+msgstr ""
+
msgid "UsageQuota|Current period usage"
msgstr "当å‰å‘¨æœŸä½¿ç”¨é‡"
+msgid "UsageQuota|File attachments and smaller design graphics."
+msgstr ""
+
+msgid "UsageQuota|Git repository, managed by the Gitaly service."
+msgstr ""
+
+msgid "UsageQuota|Includes project registry, artifacts, packages, wiki, uploads and other items."
+msgstr ""
+
msgid "UsageQuota|Increase storage temporarily"
msgstr "临时增加存储"
@@ -35938,6 +36423,9 @@ msgstr "了解有关使用é…é¢çš„更多信æ¯"
msgid "UsageQuota|Packages"
msgstr "软件包"
+msgid "UsageQuota|Pipeline artifacts and job artifacts, created with CI/CD."
+msgstr ""
+
msgid "UsageQuota|Pipelines"
msgstr "æµæ°´çº¿"
@@ -35954,17 +36442,26 @@ msgid "UsageQuota|Repository"
msgstr "仓库"
msgid "UsageQuota|Seats"
+msgstr "席ä½"
+
+msgid "UsageQuota|Shared bits of code and text."
msgstr ""
msgid "UsageQuota|Snippets"
msgstr "代ç ç‰‡æ®µ"
msgid "UsageQuota|Something went wrong while fetching project storage statistics"
-msgstr ""
+msgstr "获å–项目存储统计时出现错误"
msgid "UsageQuota|Storage"
msgstr "存储"
+msgid "UsageQuota|Storage type"
+msgstr ""
+
+msgid "UsageQuota|There is a known issue with Artifact storage where the total could be incorrect for some projects. More details and progress are available in %{warningLinkStart}the epic%{warningLinkEnd}."
+msgstr ""
+
msgid "UsageQuota|This is the total amount of storage used across your projects within this namespace."
msgstr "这是此å称空间中所有项目使用的存储空间总和。"
@@ -36004,6 +36501,9 @@ msgstr "上传"
msgid "UsageQuota|Usage"
msgstr "使用é‡"
+msgid "UsageQuota|Usage Breakdown"
+msgstr ""
+
msgid "UsageQuota|Usage Quotas"
msgstr "使用é‡é…é¢"
@@ -36011,7 +36511,7 @@ msgid "UsageQuota|Usage of group resources across the projects in the %{strong_s
msgstr "%{strong_start}%{group_name}%{strong_end}群组中的项目使用群组资æºçŠ¶å†µ"
msgid "UsageQuota|Usage of project resources across the %{strong_start}%{project_name}%{strong_end} project"
-msgstr ""
+msgstr "%{strong_start}%{project_name}%{strong_end} 项目中项目资æºä½¿ç”¨æƒ…况"
msgid "UsageQuota|Usage of resources across your projects"
msgstr "您的项目中资æºä½¿ç”¨æƒ…况"
@@ -36028,6 +36528,9 @@ msgstr "当您购买更多的存储空间时,我们会自动解é”达到%{actu
msgid "UsageQuota|Wiki"
msgstr "Wiki"
+msgid "UsageQuota|Wiki content."
+msgstr ""
+
msgid "UsageQuota|Wikis"
msgstr "Wiki"
@@ -36149,7 +36652,7 @@ msgid "Use a one-time password authenticator on your mobile device or computer t
msgstr "在您的移动设备或计算机上使用一次性密ç éªŒè¯å™¨æ¥å¯ç”¨åŒé‡éªŒè¯ (2FA)。"
msgid "Use an AWS CloudFormation Template (CFT) to install and configure GitLab Runner in AWS."
-msgstr ""
+msgstr "使用 AWS CloudFormation æ¨¡æ¿ (CFT) 在 AWS 中安装和é…ç½® GitLab Runner。"
msgid "Use cURL"
msgstr "使用 cURL"
@@ -36164,13 +36667,13 @@ msgid "Use hashed storage"
msgstr "使用哈希存储"
msgid "Use hashed storage paths for newly created and renamed repositories. Always enabled since 13.0."
-msgstr ""
+msgstr "对新创建和é‡å‘½å的仓库使用哈希存储路径。从 13.0 版起始终å¯ç”¨ã€‚"
msgid "Use one line per URI"
msgstr "æ¯ä¸ªURIå ä¸€è¡Œ"
msgid "Use primary email (%{email})"
-msgstr ""
+msgstr "使用主电å­é‚®ä»¶(%{email})"
msgid "Use shortcuts"
msgstr "使用快æ·é”®"
@@ -36218,7 +36721,7 @@ msgid "Used programming language"
msgstr "使用的编程语言"
msgid "Used to calculate the number of slices during reindexing. The multiplier will be applied to the number of shards per index. Learn more about %{slice_multiplier_link_start}slice multiplier configuration%{slice_multiplier_link_end}."
-msgstr ""
+msgstr "用于计算é‡æ–°ç´¢å¼•æœŸé—´çš„切片数。å€æ•°å°†åº”用于æ¯ä¸ªç´¢å¼•çš„切片数。了解有关 %{slice_multiplier_link_start}切片å€æ•°é…ç½®%{slice_multiplier_link_end}的更多信æ¯ã€‚"
msgid "Used to help configure your identity provider"
msgstr "用于帮助é…置您的身份æ供者"
@@ -36244,8 +36747,11 @@ msgstr "用户的 OAuth 应用程åº"
msgid "User Settings"
msgstr "用户设置"
-msgid "User and IP Rate Limits"
-msgstr "用户和IP频率é™åˆ¶"
+msgid "User and IP rate limits"
+msgstr ""
+
+msgid "User does not have a pending request"
+msgstr ""
msgid "User identity was successfully created."
msgstr "å·²æˆåŠŸåˆ›å»ºç”¨æˆ·æ ‡è¯†ã€‚"
@@ -36296,7 +36802,7 @@ msgid "User was successfully updated."
msgstr "用户已æˆåŠŸæ›´æ–°ã€‚"
msgid "User-based escalation rules must have a user with access to the project"
-msgstr ""
+msgstr "基于用户的å‡çº§è§„则必须有一个用户å¯ä»¥è®¿é—®é¡¹ç›®"
msgid "UserAvailability|%{author} %{spanStart}(Busy)%{spanEnd}"
msgstr "%{author} %{spanStart}(忙碌)%{spanEnd}"
@@ -36434,7 +36940,7 @@ msgid "UserProfile|Personal projects"
msgstr "个人项目"
msgid "UserProfile|Pronounced as: %{pronunciation}"
-msgstr ""
+msgstr "读作: %{pronunciation}"
msgid "UserProfile|Report abuse"
msgstr "举报滥用行为"
@@ -36541,6 +37047,9 @@ msgstr "用户"
msgid "Users can launch a development environment from a GitLab browser tab when the %{linkStart}Gitpod%{linkEnd} integration is enabled."
msgstr "%{linkStart}Gitpod%{linkEnd} 集æˆåŽï¼Œç”¨æˆ·å¯ä»¥ä»Ž GitLab æµè§ˆå™¨é€‰é¡¹å¡å¯åŠ¨å¼€å‘环境。"
+msgid "Users can reactivate their account by signing in."
+msgstr ""
+
msgid "Users can render diagrams in AsciiDoc, Markdown, reStructuredText, and Textile documents using Kroki."
msgstr "用户å¯ä»¥ä½¿ç”¨ Kroki 在 AsciiDocã€Markdownã€reStructuredText å’Œ Textile 文档中渲染图表。"
@@ -36556,6 +37065,9 @@ msgstr "超出许å¯è¯çš„用户数"
msgid "Users requesting access to"
msgstr "请求访问的用户"
+msgid "Users to exclude from the rate limit"
+msgstr ""
+
msgid "Users were successfully added."
msgstr "å·²æˆåŠŸæ·»åŠ ç”¨æˆ·ã€‚"
@@ -36577,6 +37089,9 @@ msgstr "没有指派人 - %{openingTag}分é…给自己%{closingTag}"
msgid "UsersSelect|Unassigned"
msgstr "未分é…"
+msgid "Uses GitLab as a lightweight alternative to Sentry."
+msgstr ""
+
msgid "Using %{code_start}::%{code_end} denotes a %{link_start}scoped label set%{link_end}"
msgstr "使用 %{code_start}::%{code_end} 表示 %{link_start}范围标签集%{link_end}"
@@ -36607,11 +37122,8 @@ msgstr "价值æµåˆ†æž"
msgid "Value Stream Analytics can help you determine your team’s velocity"
msgstr "价值æµåˆ†æžå¯ä»¥å¸®åŠ©æ‚¨äº†è§£å›¢é˜Ÿçš„效率"
-msgid "Value Stream Analytics gives an overview of how much time it takes to go from idea to production in your project."
-msgstr "价值æµåˆ†æžæ¦‚述了项目从想法到产å“实现的å„阶段所需的时间。"
-
-msgid "Value may contain a variable reference"
-msgstr "值å¯èƒ½åŒ…å«å˜é‡å¼•ç”¨"
+msgid "Value might contain a variable reference"
+msgstr ""
msgid "Value stream"
msgstr "价值æµ"
@@ -36650,19 +37162,19 @@ msgid "ValueStreamAnalytics|Median time from issue first merge request created t
msgstr "从议题的第一个åˆå¹¶è¯·æ±‚创建到议题关闭的中ä½æ—¶é—´ã€‚"
msgid "ValueStreamAnalytics|Number of commits pushed to the default branch"
-msgstr ""
+msgstr "推é€åˆ°é»˜è®¤åˆ†æ”¯çš„æ交数é‡"
msgid "ValueStreamAnalytics|Number of new issues created."
msgstr "创建新议题的数é‡"
msgid "ValueStreamAnalytics|There was an error while fetching value stream analytics %{requestTypeName} data."
-msgstr ""
+msgstr "获å–价值æµåˆ†æž %{requestTypeName} æ•°æ®æ—¶å‡ºçŽ°é”™è¯¯ã€‚"
msgid "ValueStreamAnalytics|Total number of deploys to production."
msgstr "生产环境部署的总数。"
msgid "ValueStreamEvent|Items in stage"
-msgstr ""
+msgstr "阶段中的事项"
msgid "ValueStreamEvent|Stage time (median)"
msgstr "阶段时间(中ä½æ•°ï¼‰"
@@ -36676,12 +37188,12 @@ msgstr "åœæ­¢"
msgid "ValueStream|The Default Value Stream cannot be deleted"
msgstr "默认价值æµä¸å¯åˆ é™¤"
+msgid "Values that contain the %{codeStart}$%{codeEnd} character can be considered a variable reference and expanded. %{docsLinkStart}Learn more.%{docsLinkEnd}"
+msgstr ""
+
msgid "Variable"
msgstr "å˜é‡"
-msgid "Variable references indicated by %{codeStart}$%{codeEnd} may be expanded. If this is not what you want, consider %{docsLinkStart}using a workaround to prevent expansion%{docsLinkEnd}."
-msgstr ""
-
msgid "Variable will be masked in job logs."
msgstr "å˜é‡å€¼å°†åœ¨ä½œä¸šæ—¥å¿—中被éšè—。"
@@ -36854,7 +37366,7 @@ msgstr "查看项目标记"
msgid "View public GPG key"
msgid_plural "View public GPG keys"
-msgstr[0] ""
+msgstr[0] "查看公共 GPG 密钥"
msgid "View replaced file @ "
msgstr "查看替æ¢æ–‡ä»¶ @ "
@@ -37081,6 +37593,9 @@ msgstr "下载"
msgid "Vulnerability|Evidence"
msgstr "è¯æ®"
+msgid "Vulnerability|False positive detected"
+msgstr ""
+
msgid "Vulnerability|File"
msgstr "文件"
@@ -37123,11 +37638,14 @@ msgstr "严é‡çº§åˆ«"
msgid "Vulnerability|Status"
msgstr "状æ€"
+msgid "Vulnerability|The scanner determined this vulnerability to be a false positive. Verify the evaluation before changing its status. %{linkStart}Learn more about false positive detection.%{linkEnd}"
+msgstr ""
+
msgid "Vulnerability|The unmodified response is the original response that had no mutations done to the request"
msgstr "未修改的å“应是原始å“应没有对请求进行çªå˜çš„å“应"
msgid "Vulnerability|Tool"
-msgstr ""
+msgstr "工具"
msgid "Vulnerability|Unmodified Response"
msgstr "未修改的å“应"
@@ -37235,7 +37753,7 @@ msgid "We'll continuously validate your pipeline configuration. The validation r
msgstr "我们将ä¸æ–­éªŒè¯æ‚¨çš„æµæ°´çº¿é…置。验è¯ç»“果将显示在此处。"
msgid "We'll use this to help surface the right features and information to you."
-msgstr ""
+msgstr "我们将使用它æ¥å¸®åŠ©å‘您展示正确的功能和信æ¯ã€‚"
msgid "We've found no vulnerabilities"
msgstr "未å‘现安全æ¼æ´ž"
@@ -37259,7 +37777,7 @@ msgid "WebIDE|Fork project"
msgstr "Fork 项目"
msgid "WebIDE|Go to fork"
-msgstr ""
+msgstr "转到派生"
msgid "WebIDE|Merge request"
msgstr "åˆå¹¶è¯·æ±‚"
@@ -37445,10 +37963,7 @@ msgid "Welcome to GitLab, %{first_name}!"
msgstr "欢迎使用GitLab,%{first_name}ï¼"
msgid "Welcome to GitLab,%{br_tag}%{name}!"
-msgstr ""
-
-msgid "Welcome to the guided GitLab tour"
-msgstr "欢迎æ¥åˆ°GitLab导览"
+msgstr "欢迎使用 GitLab,%{br_tag}%{name}ï¼"
msgid "Welcome, %{name}!"
msgstr "欢迎, %{name}ï¼"
@@ -37468,9 +37983,6 @@ msgstr "什么是共享Runneræµæ°´çº¿åˆ†é’Ÿï¼Ÿ"
msgid "What are you searching for?"
msgstr "您è¦æœç´¢ä»€ä¹ˆï¼Ÿ"
-msgid "What describes you best?"
-msgstr "如何形容您最åˆé€‚?"
-
msgid "What does this command do?"
msgstr "这个命令有什么作用?"
@@ -37492,15 +38004,15 @@ msgstr "什么是时间追踪?"
msgid "What is your job title? (optional)"
msgstr "您的工作èŒä½æ˜¯ä»€ä¹ˆï¼Ÿ(å¯é€‰)"
-msgid "What will you use this group for?"
+msgid "What templates can I create?"
msgstr ""
+msgid "What will you use this group for?"
+msgstr "你会用这个群组åšä»€ä¹ˆï¼Ÿ"
+
msgid "What's new"
msgstr "新增功能"
-msgid "What’s your experience level?"
-msgstr "您的体验水平是多少?"
-
msgid "When a deployment job is successful, skip older deployment jobs that are still pending."
msgstr "部署作业æˆåŠŸæ—¶ï¼Œè·³è¿‡å°šæœªå®Œæˆçš„旧部署任务。"
@@ -37510,6 +38022,9 @@ msgstr "当Runner被é”定时,ä¸èƒ½å°†å…¶åˆ†é…给其他项目"
msgid "When an event in GitLab triggers a webhook, you can use the request details to figure out if something went wrong."
msgstr "å½“äº‹ä»¶è§¦å‘ webhook 时,您å¯ä»¥ä½¿ç”¨è¯·æ±‚详细信æ¯æ¥ç¡®å®šæ˜¯å¦å‡ºçŽ°é—®é¢˜ã€‚"
+msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+msgstr ""
+
msgid "When inactive, an external authentication provider must be used."
msgstr "当未激活时,必须使用外部身份验è¯æ供程åºã€‚"
@@ -37527,11 +38042,14 @@ msgid "When using the %{code_open}http://%{code_close} or %{code_open}https://%{
msgstr "使用%{code_open}http://%{code_close}或%{code_open}https://%{code_close}å议时,请æ供仓库的实际地å€ã€‚ä¸æ”¯æŒHTTPé‡å®šå‘。"
msgid "When using the %{code_open}http://%{code_close} or %{code_open}https://%{code_close} protocols, provide the exact URL to the repository. HTTP redirects will not be followed."
-msgstr ""
+msgstr "使用 %{code_open}http://%{code_close} 或 %{code_open}https://%{code_close} å议时,请æ供仓库的确切 URL。将ä¸ä¼šéµå¾ª HTTP é‡å®šå‘。"
msgid "When:"
msgstr "当:"
+msgid "Which API requests are affected?"
+msgstr ""
+
msgid "While it's rare to have no vulnerabilities, it can happen. In any event, we ask that you please double check your settings to make sure you've set up your dashboard correctly."
msgstr "虽然没有å‘现æ¼æ´žï¼Œè¿™ç§çŽ°è±¡å¾ˆç½•è§ï¼Œä½†ä¹Ÿæ˜¯æœ‰å¯èƒ½çš„。无论如何,建议您仔细检查设置以确ä¿ä»ªè¡¨æ¿çš„é…置正确。"
@@ -37554,7 +38072,7 @@ msgid "Who will be using this GitLab trial?"
msgstr "è°å°†ä½¿ç”¨æ­¤GitLab试用?"
msgid "Who will be using this group?"
-msgstr ""
+msgstr "è°å°†ä½¿ç”¨è¿™ä¸ªç¾¤ç»„?"
msgid "Why are you signing up? (Optional)"
msgstr "您为什么è¦æ³¨å†Œï¼Ÿ(å¯é€‰)"
@@ -37719,7 +38237,7 @@ msgid "WikiPage|Switching to the classic editor will discard any changes you've
msgstr "切æ¢åˆ°ç»å…¸ç¼–辑器将放弃您在新编辑器中所åšçš„任何更改。"
msgid "WikiPage|This editor is in beta and may not display the page's contents properly. Switching back to the classic editor will discard changes you've made in the new editor."
-msgstr ""
+msgstr "此编辑器处于测试阶段,å¯èƒ½æ— æ³•æ­£ç¡®æ˜¾ç¤ºé¡µé¢å†…容。切æ¢å›žç»å…¸ç¼–辑器将放弃您在新编辑器中所åšçš„更改。"
msgid "WikiPage|Tip: You can move this page by adding the path to the beginning of the title."
msgstr "æ示:您å¯ä»¥é€šè¿‡åœ¨æ ‡é¢˜å¼€å¤´æ·»åŠ è·¯å¾„æ¥ç§»åŠ¨æ­¤é¡µé¢ã€‚"
@@ -37811,6 +38329,9 @@ msgstr "正在进行中(开放和未分é…)"
msgid "Work in progress Limit"
msgstr "“进行中â€é™åˆ¶"
+msgid "WorkItem|Work Items"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr "您è¦åˆ›å»ºä¸€ä¸ªæ–°åˆ†æ”¯å—?"
@@ -37886,6 +38407,9 @@ msgstr "您å³å°†æŠŠå¸æˆ·æŽ§åˆ¶æƒè½¬ç§»åˆ°%{group_name}群组。此æ“作ä¸å
msgid "You are already a member of this %{member_source}."
msgstr "您已ç»æ˜¯%{member_source}çš„æˆå‘˜ã€‚"
+msgid "You are already impersonating another user"
+msgstr ""
+
msgid "You are an admin, which means granting access to %{client_name} will allow them to interact with GitLab as an admin as well. Proceed with caution."
msgstr "您是管ç†å‘˜ï¼Œè¿™æ„味ç€èµ‹äºˆ%{client_name}æƒé™å°†å…许他们作为管ç†å‘˜æ¥å¯¹GitLab进行æ“作。请谨慎行事。"
@@ -37914,7 +38438,7 @@ msgid "You are going to turn off the confidentiality. This means %{strongStart}e
msgstr "å³å°†å…³é—­ç§å¯†æ€§ã€‚这将使得%{strongStart}所有用户%{strongEnd}都å¯ä»¥æŸ¥çœ‹å¹¶ä¸”评论当å‰%{issuableType}。"
msgid "You are going to turn on confidentiality. Only team members with %{strongStart}at least Reporter access%{strongEnd} will be able to see and leave comments on the %{issuableType}."
-msgstr ""
+msgstr "您将开å¯ä¿å¯†åŠŸèƒ½ã€‚ åªæœ‰æ‹¥æœ‰%{strongStart}报告者åŠä»¥ä¸Šæƒé™%{strongEnd}的团队æˆå‘˜æ‰èƒ½åœ¨ %{issuableType} 上看到并留下评论。"
msgid "You are not allowed to %{action} a user"
msgstr "您无æƒ%{action}一å用户"
@@ -37962,7 +38486,7 @@ msgid "You are using PostgreSQL %{pg_version_current}, but PostgreSQL %{pg_versi
msgstr "您正在使用PostgreSQL %{pg_version_current},但此版本的GitLab需è¦PostgreSQL %{pg_version_minimum}。请将您的环境å‡çº§åˆ°æ”¯æŒçš„ PostgreSQL版本,详情请è§%{pg_requirements_url}。"
msgid "You can %{gitlabLinkStart}resolve conflicts on GitLab%{gitlabLinkEnd} or %{resolveLocallyStart}resolve it locally%{resolveLocallyEnd}."
-msgstr ""
+msgstr "您å¯ä»¥%{gitlabLinkStart}在 GitLab 上解决冲çª%{gitlabLinkEnd} 或 %{resolveLocallyStart}本地解决%{resolveLocallyEnd}。"
msgid "You can %{resolveLocallyStart}resolve it locally%{resolveLocallyEnd}."
msgstr "您å¯ä»¥ %{resolveLocallyStart}在本地解决它%{resolveLocallyEnd}。"
@@ -37988,6 +38512,9 @@ msgstr "您还å¯ä»¥æŒ‰ç…§ä»¥ä¸‹è¯´æ˜Žä»Žè®¡ç®—机中上传现有文件。"
msgid "You can also use project access tokens with Git to authenticate over HTTP(S). %{link_start}Learn more.%{link_end}"
msgstr "您还å¯ä»¥å°†é¡¹ç›®è®¿é—®ä»¤ç‰Œä¸Ž Git 结åˆä½¿ç”¨ä»¥é€šè¿‡ HTTP(S) 进行身份验è¯ã€‚ %{link_start}了解更多。%{link_end}"
+msgid "You can always change your URL later"
+msgstr ""
+
msgid "You can always edit this later"
msgstr "您也å¯ä»¥ç¨åŽç¼–辑此选项。"
@@ -37995,7 +38522,7 @@ msgid "You can create a new %{link}."
msgstr "您å¯ä»¥åˆ›å»ºä¸€ä¸ªæ–°çš„%{link}。"
msgid "You can create a new %{name} inside this project by sending an email to the following email address:"
-msgstr ""
+msgstr "您å¯ä»¥é€šè¿‡å‘以下电å­é‚®ä»¶åœ°å€å‘é€ç”µå­é‚®ä»¶æ¥åœ¨æ­¤é¡¹ç›®ä¸­åˆ›å»ºä¸€ä¸ªæ–°çš„ %{name}"
msgid "You can create a new Personal Access Token by visiting %{link}"
msgstr "您å¯ä»¥é€šè¿‡è®¿é—®%{link}创建一个新的个人访问令牌"
@@ -38025,7 +38552,7 @@ msgid "You can easily contribute to them by requesting to join these groups."
msgstr "您å¯ä»¥è¯·æ±‚加入这些群组,以便为群组项目åšå‡ºè´¡çŒ®ã€‚"
msgid "You can enable Registration Features because Service Ping is enabled. To continue using Registration Features in the future, you will also need to register with GitLab via a new cloud licensing service."
-msgstr ""
+msgstr "您å¯ä»¥å¯ç”¨æ³¨å†ŒåŠŸèƒ½ï¼Œå› ä¸ºæœåŠ¡ Ping å·²å¯ç”¨ã€‚è¦åœ¨æœªæ¥ç»§ç»­ä½¿ç”¨æ³¨å†ŒåŠŸèƒ½ï¼Œæ‚¨è¿˜éœ€è¦é€šè¿‡æ–°çš„云许å¯æœåŠ¡å‘ GitLab 注册。"
msgid "You can enable project access token creation in %{link_start}group settings%{link_end}."
msgstr "您å¯ä»¥åœ¨ %{link_start}群组设置%{link_end} 中å¯ç”¨é¡¹ç›®è®¿é—®ä»¤ç‰Œåˆ›å»ºã€‚"
@@ -38115,7 +38642,7 @@ msgid "You can view the source or %{linkStart}%{cloneIcon} clone the repository%
msgstr "您å¯ä»¥æŸ¥çœ‹æºä»£ç æˆ–%{linkStart}%{cloneIcon}克隆仓库%{linkEnd}"
msgid "You cannot %{action} %{state} users."
-msgstr ""
+msgstr "您ä¸èƒ½ %{action} %{state} 用户。"
msgid "You cannot access the raw file. Please wait a minute."
msgstr "您ä¸èƒ½è®¿é—®åŽŸå§‹æ–‡ä»¶ã€‚请ç¨å€™ã€‚"
@@ -38133,7 +38660,7 @@ msgid "You cannot play this scheduled pipeline at the moment. Please wait a minu
msgstr "您目å‰æ— æ³•è¿è¡Œæ­¤æµæ°´çº¿è®¡åˆ’。请ç¨å€™ã€‚"
msgid "You cannot rename an environment after it's created."
-msgstr ""
+msgstr "环境创建åŽä¸èƒ½é‡å‘½å。"
msgid "You cannot write to a read-only secondary GitLab Geo instance. Please use %{link_to_primary_node} instead."
msgstr "您ä¸èƒ½å†™å…¥åªè¯»çš„æ¬¡è¦ GitLab Geo 实例。请改用%{link_to_primary_node}。"
@@ -38144,12 +38671,12 @@ msgstr "您ä¸èƒ½å†™å…¥è¿™ä¸ªåªè¯»çš„ GitLab 实例。"
msgid "You can’t %{tag_start}edit%{tag_end} files directly in this project. Fork this project and submit a merge request with your changes."
msgstr "您ä¸èƒ½åœ¨æ­¤é¡¹ç›®ä¸­ç›´æŽ¥ %{tag_start}编辑%{tag_end},派生(fork)这个项目并æ交一个包å«æ‚¨çš„更改的åˆå¹¶è¯·æ±‚。"
+msgid "You can’t edit files directly in this project. Fork this project and submit a merge request with your changes."
+msgstr ""
+
msgid "You could not create a new trigger."
msgstr "您无法创建新的触å‘器。"
-msgid "You didn't renew your subscription for %{strong}%{namespace_name}%{strong_close} so it was downgraded to the free plan."
-msgstr "您没有为%{strong}%{namespace_name}%{strong_close}的订阅进行续订,因此它已é™çº§ä¸ºå…费计划。"
-
msgid "You do not have any subscriptions yet"
msgstr "您当å‰å°šæœªè®¢é˜…任何计划"
@@ -38277,10 +38804,10 @@ msgid "You have reached your project limit"
msgstr "您已达到项目数é‡é™åˆ¶"
msgid "You have set up 2FA for your account! If you lose access to your 2FA device, you can use your recovery codes to access your account. Alternatively, if you upload an SSH key, you can %{anchorOpen}use that key to generate additional recovery codes%{anchorClose}."
-msgstr ""
+msgstr "您已ç»ä¸ºæ‚¨çš„å¸æˆ·è®¾ç½®äº†ä¸¤æ­¥éªŒè¯ï¼ 如果您无法访问您的2FA 设备,您å¯ä»¥ä½¿ç”¨æ¢å¤ç è®¿é—®æ‚¨çš„å¸æˆ·ã€‚ 或者,如果您上传一个 SSH 密钥,您å¯ä»¥ä½¿ç”¨ %{anchorOpen}使用该密钥生æˆé¢å¤–çš„æ¢å¤ç %{anchorClose}。"
msgid "You have successfully purchased %{product}. You'll receive a receipt by email."
-msgstr ""
+msgstr "您已æˆåŠŸè´­ä¹° %{product}。您将通过邮件收到收æ®ã€‚"
msgid "You have successfully purchased a %{plan} plan subscription for %{seats}. You’ll receive a receipt via email."
msgstr "您已æˆåŠŸè´­ä¹°äº†%{seats}用户的%{plan}计划订阅。收æ®å°†é€šè¿‡ç”µå­é‚®ä»¶å‘é€ç»™æ‚¨ã€‚"
@@ -38298,7 +38825,7 @@ msgid "You must disassociate %{domain} from all clusters it is attached to befor
msgstr "删除å‰æ‚¨å¿…须将%{domain}从所有相关的集群中解除关è”。"
msgid "You must have developer or higher permissions in the associated project to view job logs when debug trace is enabled. To disable debug trace, set the 'CI_DEBUG_TRACE' variable to 'false' in your pipeline configuration or CI/CD settings. If you need to view this job log, a project maintainer must add you to the project with developer permissions or higher."
-msgstr ""
+msgstr "å¯ç”¨è°ƒè¯•è·Ÿè¸ªæ—¶ï¼Œæ‚¨å¿…须在关è”项目中拥有开å‘人员或更高æƒé™æ‰èƒ½æŸ¥çœ‹ä½œä¸šæ—¥å¿—。è¦ç¦ç”¨è°ƒè¯•è·Ÿè¸ªï¼Œè¯·åœ¨æµæ°´çº¿é…置或 CI/CD 设置中将“CI_DEBUG_TRACEâ€å˜é‡è®¾ç½®ä¸ºâ€œfalseâ€ã€‚如果您需è¦æŸ¥çœ‹æ­¤ä½œä¸šæ—¥å¿—,项目维护者必须将您添加到具有开å‘人员æƒé™æˆ–更高æƒé™çš„项目中。"
msgid "You must have maintainer access to force delete a lock"
msgstr "必须拥有维护者æƒé™æ‰èƒ½å¼ºåˆ¶åˆ é™¤é”"
@@ -38315,6 +38842,12 @@ msgstr "您必须æ供一个有效的当å‰å¯†ç "
msgid "You must provide your current password in order to change it."
msgstr "您必须æ供当å‰å¯†ç æ‰èƒ½è¿›è¡Œæ›´æ”¹ã€‚"
+msgid "You must sign in to search for specific projects."
+msgstr ""
+
+msgid "You must sign in to search for specific terms."
+msgstr ""
+
msgid "You must solve the CAPTCHA in order to submit"
msgstr "您必须解决验è¯ç æ‰èƒ½æ交"
@@ -38342,6 +38875,9 @@ msgstr "您需è¦åŒæ—¶æŒ‡å®šè®¿é—®ä»¤ç‰Œå’Œä¸»æœºURL。"
msgid "You need to upload a GitLab project export archive (ending in .gz)."
msgstr "您需è¦ä¸Šä¼ GitLab项目导出文件(以.gz结尾)."
+msgid "You need to verify your primary email first before enabling Two-Factor Authentication."
+msgstr ""
+
msgid "You successfully declined the invitation"
msgstr "您æˆåŠŸæ‹’ç»äº†é‚€è¯·"
@@ -38450,12 +38986,12 @@ msgstr "您的%{group}æˆå‘˜èµ„格将在%{days}天内到期。"
msgid "Your %{host} account was signed in to from a new location"
msgstr "您在%{host}上的å¸æˆ·å·²ä»Žä¸€ä¸ªæ–°çš„ä½ç½®ç™»å½•"
+msgid "Your %{strong}%{plan_name}%{strong_close} subscription expires on %{strong}%{expires_on}%{strong_close}. After that date, you cannot create issues or merge requests, or use many other features."
+msgstr ""
+
msgid "Your %{strong}%{plan_name}%{strong_close} subscription for %{strong}%{namespace_name}%{strong_close} will expire on %{strong}%{expires_on}%{strong_close}."
msgstr "您为%{strong}%{namespace_name}%{strong_close}的%{strong}%{plan_name}%{strong_close}订阅将于%{strong}%{expires_on}%{strong_close}到期。"
-msgid "Your %{strong}%{plan_name}%{strong_close} subscription will expire on %{strong}%{expires_on}%{strong_close}. After that, you will not be able to create issues or merge requests as well as many other features."
-msgstr "您的%{strong}%{plan_name}%{strong_close}订阅将于%{strong}%{expires_on}%{strong_close}到期。此åŽï¼Œæ‚¨å°†æ— æ³•åˆ›å»ºè®®é¢˜æˆ–åˆå¹¶è¯·æ±‚,åŒæ—¶ä¹Ÿæ— æ³•è®¿é—®å…¶ä»–众多功能。"
-
msgid "Your CI/CD configuration syntax is invalid. View Lint tab for more details."
msgstr "您的 CI/CD é…置语法无效。查看 Lint 选项å¡ä»¥èŽ·å–更多详细信æ¯ã€‚"
@@ -38472,12 +39008,12 @@ msgid "Your CSV import for project"
msgstr "您的项目CSV导入"
msgid "Your DevOps Report gives an overview of how you are using GitLab from a feature perspective. Use it to view how you compare with other organizations."
-msgstr ""
+msgstr "您的 DevOps 报告从功能角度概述了您如何使用 GitLab。使用它å¯ä»¥æŸ¥çœ‹æ‚¨ä¸Žå…¶ä»–组织的比较情况。"
msgid "Your GPG keys (%{count})"
msgstr "您的GPG密钥 (%{count})"
-msgid "Your GitLab account has been locked due to an excessive amount of unsuccessful sign in attempts. Your account will automatically unlock in %{duration} or you may click the link below to unlock now."
+msgid "Your GitLab account has been locked due to an excessive number of unsuccessful sign in attempts. You can wait for your account to automatically unlock in %{duration} or you can click the link below to unlock now."
msgstr ""
msgid "Your GitLab account request has been approved!"
@@ -38588,6 +39124,9 @@ msgstr "您的评论将被丢弃。"
msgid "Your commit email is used for web based operations, such as edits and merges."
msgstr "您的æ交电å­é‚®ä»¶ç”¨äºŽåŸºäºŽ web çš„æ“作,例如编辑和åˆå¹¶ã€‚"
+msgid "Your current password is required to register a two-factor authenticator app."
+msgstr ""
+
msgid "Your dashboard has been copied. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr "仪表æ¿å·²ç»è¢«å¤åˆ¶ã€‚ ä½ å¯ä»¥%{web_ide_link_start}在这里进行编辑%{web_ide_link_end}。"
@@ -38687,6 +39226,9 @@ msgstr "个人资料"
msgid "Your project limit is %{limit} projects! Please contact your administrator to increase it"
msgstr "您的被é™åˆ¶ä¸ºæœ€å¤§ %{limit} 个项目ï¼è¯·ä¸Žæ‚¨çš„管ç†å‘˜è”系以增加它"
+msgid "Your project will be created at:"
+msgstr ""
+
msgid "Your projects"
msgstr "您的项目"
@@ -38706,7 +39248,7 @@ msgid "Your requirements are being imported. Once finished, you'll receive a con
msgstr "您的需求正在导入。导入完æˆæ—¶æ‚¨å°†æ”¶åˆ°ä¸€å°ç¡®è®¤ç”µå­é‚®ä»¶ã€‚"
msgid "Your requirements will be imported in the background. After it's finished, you'll get a confirmation email."
-msgstr ""
+msgstr "您的需求将在åŽå°å¯¼å…¥ã€‚完æˆåŽï¼Œæ‚¨å°†æ”¶åˆ°ä¸€å°ç¡®è®¤ç”µå­é‚®ä»¶ã€‚"
msgid "Your response has been recorded."
msgstr "ä½ çš„å馈已被记录。"
@@ -38726,38 +39268,36 @@ msgstr "您的登录页é¢ä¸º%{url}。"
msgid "Your subscription expired!"
msgstr "您的订阅已过期ï¼"
-msgid "Your subscription has been downgraded."
-msgstr "您的订阅已é™çº§."
-
-msgid "Your subscription will expire in %{remaining_days}."
-msgstr "您的订阅将在%{remaining_days}åŽè¿‡æœŸ."
+msgid "Your subscription will expire in %{remaining_days} day."
+msgid_plural "Your subscription will expire in %{remaining_days} days."
+msgstr[0] ""
msgid "Your username is %{username}."
msgstr "您的用户å是%{username}。"
msgid "ZentaoIntegration|Base URL of the Zentao instance."
-msgstr ""
+msgstr "禅é“实例的基础URL。"
msgid "ZentaoIntegration|Enter API token"
-msgstr ""
+msgstr "输入 API 令牌"
msgid "ZentaoIntegration|If different from Web URL."
-msgstr ""
+msgstr "如果与 Web URL ä¸åŒã€‚"
msgid "ZentaoIntegration|Use Zentao as this project's issue tracker."
-msgstr ""
+msgstr "使用禅é“作为此项目的议题跟踪器。"
msgid "ZentaoIntegration|Zentao API URL (optional)"
-msgstr ""
+msgstr "ç¦…é“ API URL(å¯é€‰ï¼‰"
msgid "ZentaoIntegration|Zentao API token"
-msgstr ""
+msgstr "ç¦…é“ API 令牌"
msgid "ZentaoIntegration|Zentao Product ID"
-msgstr ""
+msgstr "ç¦…é“ Product ID"
msgid "ZentaoIntegration|Zentao Web URL"
-msgstr ""
+msgstr "ç¦…é“ Web URL"
msgid "Zoom meeting added"
msgstr "已添加Zoom会议"
@@ -38864,7 +39404,7 @@ msgstr "阻止"
msgid "branch"
msgid_plural "branches"
-msgstr[0] ""
+msgstr[0] "分支"
msgid "branch name"
msgstr "分支å称"
@@ -38935,6 +39475,9 @@ msgstr "本身ä¸èƒ½è¢«é˜»å¡ž"
msgid "cannot merge"
msgstr "无法åˆå¹¶"
+msgid "cannot not be used for user namespace"
+msgstr ""
+
msgid "ciReport|%{degradedNum} degraded"
msgstr "å·²é™ä½Ž%{degradedNum}"
@@ -38993,7 +39536,7 @@ msgid "ciReport|All severities"
msgstr "全部严é‡çº§åˆ«"
msgid "ciReport|All tools"
-msgstr ""
+msgstr "所有工具"
msgid "ciReport|Automatically apply the patch in a new branch"
msgstr "在新分支中自动应用补ä¸"
@@ -39026,7 +39569,7 @@ msgid "ciReport|Container scanning detects known vulnerabilities in your docker
msgstr "容器扫æå¯ä»¥æ£€æµ‹Dockeré•œåƒä¸­ä¸­å·²çŸ¥çš„安全æ¼æ´žã€‚"
msgid "ciReport|Could not dismiss vulnerability because the associated pipeline no longer exists. Refresh the page and try again."
-msgstr ""
+msgstr "无法消除æ¼æ´žï¼Œå› ä¸ºå…³è”çš„æµæ°´çº¿ä¸å†å­˜åœ¨ã€‚刷新页é¢å¹¶é‡è¯•ã€‚"
msgid "ciReport|Coverage Fuzzing"
msgstr "Coverage Fuzzing"
@@ -39246,7 +39789,7 @@ msgid "created %{issuable_created} by %{author}"
msgstr "%{issuable_created}由%{author}创建"
msgid "created %{timeAgoString} by %{email} via %{user}"
-msgstr ""
+msgstr "由 %{user} 通过 %{email} 创建于 %{timeAgoString}"
msgid "created %{timeAgoString} by %{user}"
msgstr "于 %{timeAgoString} å‰ç”±%{user}创建"
@@ -39257,6 +39800,9 @@ msgstr "在 Jira 中,由%{user}于%{timeAgoString}å‰åˆ›å»º"
msgid "created %{timeAgo}"
msgstr "创建于%{timeAgo}"
+msgid "created %{timeAgo} by %{author}"
+msgstr ""
+
msgid "created by"
msgstr "创建人:"
@@ -39300,9 +39846,6 @@ msgstr "ä¸å­˜åœ¨"
msgid "does not have a supported extension. Only %{extension_list} are supported"
msgstr "当å‰æ‰©å±•åä¸æ”¯æŒã€‚åªæ”¯æŒ%{extension_list}"
-msgid "domain is not authorized for sign-up."
-msgstr "域å未被授æƒæ³¨å†Œã€‚"
-
msgid "download it"
msgstr "下载"
@@ -39319,18 +39862,14 @@ msgstr "此元素并éžç¾¤ç»„层级"
msgid "email '%{email}' is not a verified email."
msgstr "邮箱“%{email}â€è¿˜æœªè¢«éªŒè¯ã€‚"
-msgid "email does not match the allowed domain of %{email_domains}"
-msgid_plural "email does not match the allowed domains: %{email_domains}"
-msgstr[0] ""
-
msgid "enabled"
msgstr "å·²å¯ç”¨"
msgid "encrypted: needs to be a :required, :optional or :migrating!"
msgstr "加密:必须是 :requiredã€:optional 或 :migrating 之一"
-msgid "ending with MIME type format is not allowed."
-msgstr "ä¸å…许以 MIME 类型格å¼ç»“尾。"
+msgid "ending with a reserved file extension is not allowed."
+msgstr ""
msgid "entries cannot be larger than 255 characters"
msgstr "æ¡ç›®ä¸èƒ½è¶…过255个字符"
@@ -39342,7 +39881,7 @@ msgid "entries cannot contain HTML tags"
msgstr "æ¡ç›®ä¸èƒ½åŒ…å«HTML标记"
msgid "environment_id parameter is required when type is container_policy"
-msgstr ""
+msgstr "当类型为container_policy时,需è¦environment_id å‚æ•°"
msgid "epic"
msgstr "å²è¯—"
@@ -39353,6 +39892,9 @@ msgstr "错误"
msgid "estimateCommand|%{slash_command} overwrites the total estimated time."
msgstr "%{slash_command} 覆盖总估计时间。"
+msgid "example.com"
+msgstr ""
+
msgid "exceeds the limit of %{bytes} bytes"
msgstr "超过%{bytes}字节的é™åˆ¶"
@@ -39402,9 +39944,6 @@ msgstr "对于这个项目"
msgid "fork"
msgstr "派生"
-msgid "fork this project"
-msgstr "派生此项目"
-
msgid "from"
msgstr "æ¥è‡ª"
@@ -39412,6 +39951,9 @@ msgid "from %d job"
msgid_plural "from %d jobs"
msgstr[0] "æ¥è‡ª%d个作业"
+msgid "frontmatter"
+msgstr ""
+
msgid "group"
msgstr "群组"
@@ -39431,7 +39973,7 @@ msgid "has already been taken"
msgstr "已被使用"
msgid "has already been taken as Codename"
-msgstr ""
+msgstr "å·²ç»è¢«ä½œä¸ºæ˜µç§°ä»£å·"
msgid "has already been taken as Suite"
msgstr "在Suite中已ç»è¢«ä½¿ç”¨"
@@ -39439,6 +39981,9 @@ msgstr "在Suite中已ç»è¢«ä½¿ç”¨"
msgid "has been completed."
msgstr "已完æˆã€‚"
+msgid "has too deep level of nesting"
+msgstr ""
+
msgid "help"
msgstr "帮助"
@@ -39472,9 +40017,21 @@ msgstr "导入æµç¨‹"
msgid "in"
msgstr "于"
+msgid "in Infrastructure :: Kubernetes clusters"
+msgstr ""
+
+msgid "in all GitLab"
+msgstr ""
+
+msgid "in group"
+msgstr ""
+
msgid "in group %{link_to_group}"
msgstr "在 %{link_to_group} 群组"
+msgid "in project"
+msgstr ""
+
msgid "in project %{link_to_project}"
msgstr "在 %{link_to_project} 项目"
@@ -39515,18 +40072,21 @@ msgstr "相关群组ä¸å«æ¨¡ç‰ˆ"
msgid "is not a valid X509 certificate."
msgstr "ä¸æ˜¯æœ‰æ•ˆçš„X509è¯ä¹¦ã€‚"
+msgid "is not allowed for sign-up."
+msgstr ""
+
+msgid "is not allowed for this group."
+msgstr ""
+
+msgid "is not allowed for this project."
+msgstr ""
+
msgid "is not allowed since the group is not top-level group."
msgstr "ä¸å…许,因为该群组ä¸æ˜¯é¡¶çº§ç¾¤ç»„。"
-msgid "is not allowed. Try again with a different email address, or contact your GitLab admin."
-msgstr "ä¸è¢«å…许。请使用其他电å­é‚®ä»¶åœ°å€é‡è¯•ï¼Œæˆ–与您的GitLab管ç†å‘˜è”系。"
-
msgid "is not allowed. We do not currently support project-level iterations"
msgstr "ä¸è¢«å…许。我们目å‰ä¸æ”¯æŒé¡¹ç›®çº§è¿­ä»£"
-msgid "is not from an allowed domain."
-msgstr "ä¸æ˜¯æ¥è‡ªå…许的域å。"
-
msgid "is not in the group enforcing Group Managed Account"
msgstr "ä¸åœ¨å¼ºåˆ¶æ‰§è¡Œç¾¤ç»„托管账户的群组"
@@ -39617,11 +40177,14 @@ msgstr "被 %{path_lock_user_name} 在 %{created_at} é”定"
msgid "log in"
msgstr "登录"
+msgid "managed"
+msgstr ""
+
msgid "manual"
msgstr "手动"
msgid "math|Displaying this math block may cause performance issues on this page"
-msgstr ""
+msgstr "显示此公å¼å—å¯èƒ½ä¼šå¯¼è‡´æ­¤é¡µé¢å‡ºçŽ°æ€§èƒ½é—®é¢˜"
msgid "math|There was an error rendering this math block"
msgstr "渲染此数学表达å¼æ—¶å‡ºé”™"
@@ -39658,11 +40221,14 @@ msgid "mrWidgetNothingToMerge|This merge request contains no changes."
msgstr "æ­¤åˆå¹¶è¯·æ±‚ä¸åŒ…å«ä»»ä½•æ›´æ”¹ã€‚"
msgid "mrWidgetNothingToMerge|Use merge requests to propose changes to your project and discuss them with your team. To make changes, push a commit or edit this merge request to use a different branch. With %{linkStart}CI/CD%{linkEnd}, automatically test your changes before merging."
-msgstr ""
+msgstr "使用åˆå¹¶è¯·æ±‚å‘您的项目æ出更改建议并与您的团队讨论。è¦è¿›è¡Œæ›´æ”¹ï¼Œè¯·æŽ¨é€æ交或编辑此åˆå¹¶è¯·æ±‚以使用ä¸åŒçš„分支。使用 %{linkStart}CI/CD%{linkEnd},在åˆå¹¶ä¹‹å‰è‡ªåŠ¨æµ‹è¯•æ‚¨çš„更改。"
msgid "mrWidget| Please restore it or use a different %{missingBranchName} branch"
msgstr "请æ¢å¤æ­¤åˆ†æ”¯æˆ–使用其他的 %{missingBranchName} 分支"
+msgid "mrWidget|%{linkStart}Set up now%{linkEnd} to analyze your source code for known security vulnerabilities."
+msgstr ""
+
msgid "mrWidget|%{mergeError}."
msgstr "%{mergeError}。"
@@ -39740,7 +40306,10 @@ msgstr "关闭:"
msgid "mrWidget|Closes issue"
msgid_plural "mrWidget|Closes issues"
-msgstr[0] ""
+msgstr[0] "关闭议题"
+
+msgid "mrWidget|Create issue to resolve all threads"
+msgstr ""
msgid "mrWidget|Delete source branch"
msgstr "删除æºåˆ†æ”¯"
@@ -39751,12 +40320,18 @@ msgstr "部署统计信æ¯å½“å‰ä¸å¯ç”¨"
msgid "mrWidget|Did not close"
msgstr "未关闭"
+msgid "mrWidget|Dismiss"
+msgstr ""
+
msgid "mrWidget|Email patches"
msgstr "通过电å­é‚®ä»¶å‘出补ä¸"
msgid "mrWidget|Failed to load deployment statistics"
msgstr "无法加载部署统计信æ¯"
+msgid "mrWidget|Hide %{widget} details"
+msgstr ""
+
msgid "mrWidget|If the %{missingBranchName} branch exists in your local repository, you can merge this merge request manually using the command line"
msgstr "如果 %{missingBranchName} 分支存在于本地仓库中,则å¯ä»¥é€šè¿‡ä»¥ä¸‹å‘½ä»¤è¡Œæ‰‹åŠ¨åˆå¹¶è¯¥åˆå¹¶è¯·æ±‚。"
@@ -39777,7 +40352,7 @@ msgstr "å…许å¯ä»¥åˆå¹¶çš„æˆå‘˜æ·»åŠ æ交。"
msgid "mrWidget|Mentions issue"
msgid_plural "mrWidget|Mentions issues"
-msgstr[0] ""
+msgstr[0] "æåŠè®®é¢˜"
msgid "mrWidget|Merge"
msgstr "åˆå¹¶"
@@ -39825,7 +40400,7 @@ msgid "mrWidget|More information"
msgstr "更多信æ¯"
msgid "mrWidget|Open in Gitpod"
-msgstr ""
+msgstr "在 Gitpod 中打开"
msgid "mrWidget|Open in Web IDE"
msgstr "在Web IDE中打开"
@@ -39851,9 +40426,6 @@ msgstr "从åˆå¹¶é˜Ÿåˆ—中移除"
msgid "mrWidget|Request to merge"
msgstr "请求åˆå¹¶"
-msgid "mrWidget|Resolve all threads in new issue"
-msgstr "在新议题中解决所有主题"
-
msgid "mrWidget|Resolve conflicts"
msgstr "解决冲çª"
@@ -39869,6 +40441,9 @@ msgstr "通过新的åˆå¹¶è¯·æ±‚中还原此åˆå¹¶è¯·æ±‚"
msgid "mrWidget|Revoke approval"
msgstr "撤销核准"
+msgid "mrWidget|SAST and Secret Detection is not enabled."
+msgstr ""
+
msgid "mrWidget|Set by %{merge_author} to be added to the merge train when the pipeline succeeds"
msgstr "ç”±%{merge_author}设置为在æµæ°´çº¿æˆåŠŸæ—¶æ·»åŠ åˆ°åˆå¹¶é˜Ÿåˆ—中"
@@ -39878,6 +40453,9 @@ msgstr "ç”±%{merge_author}设置为æµæ°´çº¿æˆåŠŸæ—¶è‡ªåŠ¨åˆå¹¶"
msgid "mrWidget|Set by %{merge_author} to start a merge train when the pipeline succeeds"
msgstr "ç”±%{merge_author}设置为在æµæ°´çº¿æˆåŠŸæ—¶å¯åŠ¨åˆå¹¶é˜Ÿåˆ—"
+msgid "mrWidget|Show %{widget} details"
+msgstr ""
+
msgid "mrWidget|The changes were merged into"
msgstr "更改已åˆå¹¶åˆ°"
@@ -39890,11 +40468,14 @@ msgstr "更改将被åˆå¹¶åˆ°"
msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure, or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
msgstr "æ­¤åˆå¹¶è¯·æ±‚çš„æµæ°´çº¿æœªå®Œæˆã€‚推é€æ–°çš„æ交以修å¤å¤±è´¥ï¼Œæˆ–检查 %{linkStart}故障排查文档%{linkEnd} 以查看其它å¯èƒ½çš„æ“作。"
+msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure."
+msgstr ""
+
msgid "mrWidget|The source branch has been deleted"
msgstr "æºåˆ†æ”¯å·²åˆ é™¤"
msgid "mrWidget|The source branch is %{link} the target branch"
-msgstr ""
+msgstr "æºåˆ†æ”¯æ˜¯ %{link} 的目标分支"
msgid "mrWidget|The source branch is being deleted"
msgstr "æºåˆ†æ”¯æ­£åœ¨åˆ é™¤"
@@ -39932,6 +40513,9 @@ msgstr "使用%{linkStart}CIæµæ°´çº¿æµ‹è¯•ä½ çš„代ç %{linkEnd},åªéœ€ç®€å•
msgid "mrWidget|You can merge after removing denied licenses"
msgstr "您å¯ä»¥åœ¨åˆ é™¤æ‹’ç»çš„许å¯è¯åŽåˆå¹¶"
+msgid "mrWidget|You can only merge once this merge request is approved."
+msgstr ""
+
msgid "mrWidget|Your password"
msgstr "您的密ç "
@@ -39957,7 +40541,7 @@ msgid "must be after start"
msgstr "必须在开始之åŽ"
msgid "must be an email you have verified"
-msgstr ""
+msgstr "必须是您已验è¯çš„电å­é‚®ä»¶"
msgid "must be greater than start date"
msgstr "必须大于开始日期"
@@ -39966,10 +40550,13 @@ msgid "must be inside the fork network"
msgstr "必须在派生(fork)网络内"
msgid "must be less than the limit of %{tag_limit} tags"
+msgstr "å¿…é¡»å°äºŽ %{tag_limit} 个标签的数é‡é™åˆ¶"
+
+msgid "must be set for a project namespace"
msgstr ""
msgid "must be unique by status and elapsed time within a policy"
-msgstr ""
+msgstr "必须在策略中的状æ€å’Œç»è¿‡æ—¶é—´ä¸Šæ˜¯å”¯ä¸€çš„"
msgid "my-awesome-group"
msgstr "my-awesome-group"
@@ -40075,6 +40662,9 @@ msgstr "个人访问令牌"
msgid "pipeline"
msgstr "æµæ°´çº¿"
+msgid "pipeline schedules documentation"
+msgstr ""
+
msgid "pod_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
msgstr "pod_nameåªèƒ½åŒ…å«å°å†™å­—æ¯ï¼Œæ•°å­—,'-'å’Œ'.',并且必须以字æ¯å’Œæ•°å­—字符开头和结尾"
@@ -40122,17 +40712,26 @@ msgstr "项目æˆå‘˜"
msgid "project name"
msgstr "项目å称"
+msgid "project namespace cannot be the parent of another namespace"
+msgstr ""
+
msgid "projects"
msgstr "项目"
msgid "quick actions"
msgstr "å¿«æ·æ“作"
-msgid "reCAPTCHA Private Key"
-msgstr "reCAPTCHA ç§é’¥"
+msgid "reCAPTCHA"
+msgstr ""
-msgid "reCAPTCHA Site Key"
-msgstr "reCAPTCHA 站点密钥"
+msgid "reCAPTCHA helps prevent credential stuffing."
+msgstr ""
+
+msgid "reCAPTCHA private key"
+msgstr ""
+
+msgid "reCAPTCHA site key"
+msgstr ""
msgid "recent activity"
msgstr "最近活动"
@@ -40357,6 +40956,9 @@ msgstr "上传"
msgid "user avatar"
msgstr "用户头åƒ"
+msgid "user namespace cannot be the parent of another namespace"
+msgstr ""
+
msgid "user preferences"
msgstr "用户首选项"
@@ -40448,3 +41050,9 @@ msgstr "yaml无效"
msgid "your settings"
msgstr "您的设置"
+msgid "{group}"
+msgstr ""
+
+msgid "{project}"
+msgstr ""
+
diff --git a/locale/zh_HK/gitlab.po b/locale/zh_HK/gitlab.po
index e98b5ac1a6e..61c83c95abe 100644
--- a/locale/zh_HK/gitlab.po
+++ b/locale/zh_HK/gitlab.po
@@ -14,10 +14,7 @@ msgstr ""
"X-Crowdin-Language: zh-HK\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-09-01 22:31\n"
-
-msgid " %{name}, confirm your email address now! "
-msgstr ""
+"PO-Revision-Date: 2021-10-04 20:19\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -90,6 +87,14 @@ msgstr ""
msgid "#general, #development"
msgstr ""
+msgid "%d Alert"
+msgid_plural "%d Alerts"
+msgstr[0] ""
+
+msgid "%d Alert:"
+msgid_plural "%d Alerts:"
+msgstr[0] ""
+
msgid "%d Approval"
msgid_plural "%d Approvals"
msgstr[0] ""
@@ -387,8 +392,11 @@ msgstr ""
msgid "%{code_open}Protected:%{code_close} Only exposed to protected branches or tags."
msgstr ""
-msgid "%{commit_author_link} authored %{commit_timeago}"
-msgstr "ç”± %{commit_author_link} æ交於 %{commit_timeago}"
+msgid "%{commit_author_link} authored %{commit_authored_timeago}"
+msgstr ""
+
+msgid "%{commit_author_link} authored %{commit_authored_timeago} and %{commit_committer_avatar} %{commit_committer_link} committed %{commit_committer_timeago}"
+msgstr ""
msgid "%{completedCount} completed weight"
msgstr ""
@@ -476,6 +484,15 @@ msgstr ""
msgid "%{doc_link_start}Advanced search%{doc_link_end} is enabled."
msgstr ""
+msgid "%{docs_link_start}Learn about visibility levels.%{docs_link_end}"
+msgstr ""
+
+msgid "%{docs_link_start}What is Large File Storage?%{docs_link_end}"
+msgstr ""
+
+msgid "%{docs_link_start}What is two-factor authentication?%{docs_link_end}"
+msgstr ""
+
msgid "%{due_date} (Past due)"
msgstr ""
@@ -548,9 +565,6 @@ msgstr "將會移除 %{issuableType}ï¼ç¢ºå®šï¼Ÿ"
msgid "%{issueType} actions"
msgstr ""
-msgid "%{issuesCount} issues with a limit of %{maxIssueCount}"
-msgstr ""
-
msgid "%{issuesSize} with a limit of %{maxIssueCount}"
msgstr ""
@@ -608,6 +622,12 @@ msgstr ""
msgid "%{label_for_message} unavailable"
msgstr ""
+msgid "%{learn_more_link}."
+msgstr ""
+
+msgid "%{lessThan} 1 hour"
+msgstr ""
+
msgid "%{lets_encrypt_link_start}Let's Encrypt%{lets_encrypt_link_end} is a free, automated, and open certificate authority (CA) that issues digital certificates to enable HTTPS (SSL/TLS) for sites."
msgstr ""
@@ -620,15 +640,15 @@ msgstr ""
msgid "%{link_start}Learn more%{link_end} about roles."
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
-msgstr ""
-
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
msgstr ""
msgid "%{link_start}Start the title with %{draft_snippet}%{link_end} to prevent a merge request that is a work in progress from being merged before it's ready."
msgstr ""
+msgid "%{link_start}What information does GitLab Inc. collect?%{link_end}"
+msgstr ""
+
msgid "%{listToShow}, and %{awardsListLength} more"
msgstr ""
@@ -777,7 +797,7 @@ msgid "%{securityScanner} result is not available because a pipeline has not bee
msgid_plural "%{securityScanner} results are not available because a pipeline has not been run since it was enabled. %{linkStart}Run a pipeline%{linkEnd}"
msgstr[0] ""
-msgid "%{service_ping_link_start}Learn more%{service_ping_link_end} about what information is shared with GitLab Inc."
+msgid "%{service_ping_link_start}What information is shared with GitLab Inc.?%{service_ping_link_end}"
msgstr ""
msgid "%{size} %{unit}"
@@ -813,6 +833,9 @@ msgstr ""
msgid "%{state} epics"
msgstr ""
+msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
+msgstr ""
+
msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
msgstr ""
@@ -865,10 +888,6 @@ msgstr ""
msgid "%{template_project_id} is unknown or invalid"
msgstr ""
-msgid "%{text} %{files}"
-msgid_plural "%{text} %{files} files"
-msgstr[0] "%{text} %{files} 個檔案"
-
msgid "%{text} is available"
msgstr "%{text} å¯ç”¨"
@@ -953,9 +972,6 @@ msgstr ""
msgid "%{wildcards_link_start}Wildcards%{wildcards_link_end} such as %{code_tag_start}v*%{code_tag_end} or %{code_tag_start}*-release%{code_tag_end} are supported."
msgstr ""
-msgid "&lt; 1 hour"
-msgstr ""
-
msgid "'%{data}' at %{location} does not match format: %{format}"
msgstr ""
@@ -1038,9 +1054,6 @@ msgstr ""
msgid "(we need your current password to confirm your changes)"
msgstr ""
-msgid "* * * * *"
-msgstr ""
-
msgid "+ %{amount} more"
msgstr ""
@@ -1104,10 +1117,10 @@ msgstr "顯示較少"
msgid "."
msgstr ""
-msgid "0 bytes"
+msgid "/"
msgstr ""
-msgid "0 for unlimited, only effective with remote storage enabled."
+msgid "0 bytes"
msgstr ""
msgid "0t1DgySidms"
@@ -1115,7 +1128,7 @@ msgstr ""
msgid "1 Day"
msgid_plural "%d Days"
-msgstr[0] "%d 天"
+msgstr[0] ""
msgid "1 Issue"
msgid_plural "%d Issues"
@@ -1214,6 +1227,9 @@ msgstr ""
msgid "1000+"
msgstr ""
+msgid "192.168.0.0/24"
+msgstr ""
+
msgid "1st contribution!"
msgstr "第一個貢ç»!"
@@ -1367,9 +1383,6 @@ msgstr ""
msgid "A plain HTML site that uses Netlify for CI/CD instead of GitLab, but still with all the other great GitLab features"
msgstr ""
-msgid "A plain-text response to show to clients that hit the rate limit."
-msgstr ""
-
msgid "A platform value can be web, mob or app."
msgstr ""
@@ -1451,7 +1464,7 @@ msgstr ""
msgid "APIFuzzing|Configure HTTP basic authentication values. Other authentication methods are supported. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
+msgid "APIFuzzing|Customize your project's API fuzzing configuration options and copy the code snippet to your .gitlab-ci.yml file to apply any changes. Note that this tool does not reflect or update your .gitlab-ci.yml file automatically. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
msgstr ""
msgid "APIFuzzing|Enable authentication"
@@ -1514,9 +1527,6 @@ msgstr ""
msgid "APIFuzzing|To prevent a security leak, authentication info must be added as a %{ciVariablesLinkStart}CI variable%{ciVariablesLinkEnd}. As a user with maintainer access rights, you can manage CI variables in the %{ciSettingsLinkStart}Settings%{ciSettingsLinkEnd} area."
msgstr ""
-msgid "APIFuzzing|Use this tool to generate API fuzzing configuration YAML to copy into your .gitlab-ci.yml file. This tool does not reflect or update your .gitlab-ci.yml file automatically."
-msgstr ""
-
msgid "APIFuzzing|Username for basic authentication"
msgstr ""
@@ -1568,9 +1578,6 @@ msgstr "濫用報告"
msgid "Abuse reports notification email"
msgstr ""
-msgid "Abuse reports will be sent to this address if it is set. Abuse reports are always available in the admin area."
-msgstr ""
-
msgid "Accept invitation"
msgstr ""
@@ -1607,12 +1614,18 @@ msgstr ""
msgid "Access granted"
msgstr ""
+msgid "Access key ID"
+msgstr ""
+
msgid "Access requests"
msgstr ""
msgid "Access to '%{classification_label}' not allowed"
msgstr ""
+msgid "Access tokens expire after 2 hours. A refresh token may be used at any time to generate a new access token. Non-expiring access tokens are deprecated. Clear this setting to enable backward compatibility."
+msgstr ""
+
msgid "AccessDropdown|Deploy Keys"
msgstr ""
@@ -1925,6 +1938,9 @@ msgstr ""
msgid "Add new directory"
msgstr "添加新目錄"
+msgid "Add new service account"
+msgstr ""
+
msgid "Add or remove previously merged commits"
msgstr ""
@@ -2162,6 +2178,9 @@ msgstr ""
msgid "AdminArea|Features"
msgstr ""
+msgid "AdminArea|Get security updates from GitLab and stay up to date"
+msgstr ""
+
msgid "AdminArea|Groups"
msgstr ""
@@ -2201,6 +2220,12 @@ msgstr ""
msgid "AdminArea|Reporter"
msgstr ""
+msgid "AdminArea|Sign up for the GitLab Security Newsletter to get notified for security updates."
+msgstr ""
+
+msgid "AdminArea|Sign up for the GitLab newsletter"
+msgstr ""
+
msgid "AdminArea|Stop all jobs"
msgstr "åœæ­¢æ‰€æœ‰ä»»å‹™"
@@ -2270,9 +2295,15 @@ msgstr ""
msgid "AdminSettings|Disable public access to Pages sites"
msgstr ""
+msgid "AdminSettings|Display a banner on merge requests in projects with no pipelines to initiate steps to add a .gitlab-ci.yml file."
+msgstr ""
+
msgid "AdminSettings|Domain verification is an essential security measure for public GitLab sites. Users are required to demonstrate they control a domain before it is enabled. %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "AdminSettings|Enable pipeline suggestion banner"
+msgstr ""
+
msgid "AdminSettings|Enable shared runners for new projects"
msgstr ""
@@ -2744,10 +2775,10 @@ msgstr ""
msgid "Admin|Quarterly reconciliation will occur on %{qrtlyDate}"
msgstr ""
-msgid "Admin|The number of max seats used for your namespace is currently exceeding the number of seats in your subscription. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgid "Admin|The number of max seats in your namespace exceeds the number of seats in your subscription. On %{qrtlyDate}, quarterly reconciliation occurs and you are automatically billed a prorated amount for the overage. No action is needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice. For more information about the timing of the invoicing process, view the documentation."
msgstr ""
-msgid "Admin|The number of maximum users for your instance is currently exceeding the number of users in license. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgid "Admin|The number of max users in your instance exceeds the number of users in your license. On %{qrtlyDate}, quarterly reconciliation occurs and you are automatically billed a prorated amount for the overage. No action is needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice. For more information about the timing of the invoicing process, view the documentation."
msgstr ""
msgid "Admin|View pending user approvals"
@@ -2768,9 +2799,6 @@ msgstr ""
msgid "Advanced export options"
msgstr ""
-msgid "Advanced permissions, Large File Storage and Two-Factor authentication settings."
-msgstr "é€²éšŽæ¬Šé™ ï¼Œå¤§æª”æ¡ˆå„²å­˜èˆ‡é›™é‡é‘‘證設定"
-
msgid "After a successful password update you will be redirected to login screen."
msgstr ""
@@ -2789,12 +2817,14 @@ msgstr ""
msgid "After you've reviewed these contribution guidelines, you'll be all set to"
msgstr ""
+msgid "Akismet"
+msgstr ""
+
msgid "Akismet API Key"
msgstr ""
-msgid "Alert"
-msgid_plural "Alerts"
-msgstr[0] "æ示"
+msgid "Akismet helps prevent the creation of spam issues in public projects."
+msgstr ""
msgid "AlertManagement|Acknowledged"
msgstr ""
@@ -3150,6 +3180,9 @@ msgstr ""
msgid "All (default)"
msgstr ""
+msgid "All GitLab"
+msgstr ""
+
msgid "All Members"
msgstr ""
@@ -3264,6 +3297,9 @@ msgstr ""
msgid "Allow this secondary node to replicate content on Object Storage"
msgstr ""
+msgid "Allow use of licensed EE features"
+msgstr ""
+
msgid "Allow users to dismiss the broadcast message"
msgstr ""
@@ -3339,9 +3375,6 @@ msgstr ""
msgid "Amazon authentication is not %{link_start}correctly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
-msgid "Amount of time (in hours) that users are allowed to skip forced configuration of two-factor authentication"
-msgstr ""
-
msgid "An %{link_start}alert%{link_end} with the same fingerprint is already open. To change the status of this alert, resolve the linked alert."
msgstr ""
@@ -3402,12 +3435,6 @@ msgstr "é è¦½ blob 檔案時發生錯誤"
msgid "An error occurred when removing the label."
msgstr ""
-msgid "An error occurred when toggling the notification subscription"
-msgstr "切æ›è¨‚閱通知時發生錯誤"
-
-msgid "An error occurred when updating the issue weight"
-msgstr "更新議題權é‡æ™‚發生錯誤"
-
msgid "An error occurred when updating the title"
msgstr ""
@@ -3456,6 +3483,9 @@ msgstr ""
msgid "An error occurred while enabling Service Desk."
msgstr ""
+msgid "An error occurred while fetching Markdown preview"
+msgstr ""
+
msgid "An error occurred while fetching ancestors"
msgstr ""
@@ -3486,9 +3516,6 @@ msgstr ""
msgid "An error occurred while fetching label colors."
msgstr ""
-msgid "An error occurred while fetching markdown preview"
-msgstr "è®€å– markdown é è¦½æ™‚發生錯誤"
-
msgid "An error occurred while fetching participants"
msgstr ""
@@ -3504,9 +3531,6 @@ msgstr ""
msgid "An error occurred while fetching reference"
msgstr ""
-msgid "An error occurred while fetching sidebar data"
-msgstr "讀å–å´é‚Šæ¬„資料時發生錯誤"
-
msgid "An error occurred while fetching tags. Retry the search."
msgstr ""
@@ -3582,6 +3606,9 @@ msgstr ""
msgid "An error occurred while loading merge requests."
msgstr ""
+msgid "An error occurred while loading projects."
+msgstr ""
+
msgid "An error occurred while loading the Needs tab."
msgstr ""
@@ -3816,12 +3843,6 @@ msgstr ""
msgid "Any Milestone"
msgstr ""
-msgid "Any branch"
-msgstr ""
-
-msgid "Any eligible user"
-msgstr ""
-
msgid "Any encrypted tokens"
msgstr ""
@@ -3840,6 +3861,9 @@ msgstr ""
msgid "Any namespace"
msgstr ""
+msgid "App Engine description and apps that are suitable for this deployment target"
+msgstr ""
+
msgid "App ID"
msgstr ""
@@ -3986,6 +4010,10 @@ msgstr ""
msgid "Apply"
msgstr ""
+msgid "Apply %d suggestion"
+msgid_plural "Apply %d suggestions"
+msgstr[0] ""
+
msgid "Apply a label"
msgstr ""
@@ -3995,13 +4023,10 @@ msgstr ""
msgid "Apply suggestion"
msgstr ""
-msgid "Apply suggestions"
-msgstr ""
-
msgid "Apply template"
msgstr ""
-msgid "Apply this approval rule to any branch or a specific protected branch."
+msgid "Apply this approval rule to all branches or a specific protected branch."
msgstr ""
msgid "Applying"
@@ -4140,9 +4165,6 @@ msgstr ""
msgid "ApprovalSettings|Prevent editing approval rules in projects and merge requests."
msgstr ""
-msgid "ApprovalSettings|Prevent editing approval rules in projects and merge requests. "
-msgstr ""
-
msgid "ApprovalSettings|Remove all approvals when commits are added to the source branch."
msgstr ""
@@ -4158,6 +4180,9 @@ msgstr ""
msgid "ApprovalSettings|This setting is configured at the instance level and can only be changed by an administrator."
msgstr ""
+msgid "ApprovalSettings|This setting is configured in %{groupName} and can only be changed by an administrator or group owner."
+msgstr ""
+
msgid "ApprovalStatusTooltip|Adheres to separation of duties"
msgstr ""
@@ -4641,9 +4666,6 @@ msgstr ""
msgid "Authenticated API rate limit period in seconds"
msgstr ""
-msgid "Authenticated API request rate limit"
-msgstr ""
-
msgid "Authenticated API requests"
msgstr ""
@@ -4653,10 +4675,10 @@ msgstr ""
msgid "Authenticated Git LFS request rate limit"
msgstr ""
-msgid "Authenticated web rate limit period in seconds"
+msgid "Authenticated Git LFS requests"
msgstr ""
-msgid "Authenticated web request rate limit"
+msgid "Authenticated web rate limit period in seconds"
msgstr ""
msgid "Authenticated web requests"
@@ -5034,9 +5056,6 @@ msgstr ""
msgid "Below you will find all the groups that are public."
msgstr ""
-msgid "Beta"
-msgstr ""
-
msgid "Bi-weekly code coverage"
msgstr ""
@@ -5275,6 +5294,21 @@ msgstr ""
msgid "Board scope affects which issues are displayed for anyone who visits this board"
msgstr ""
+msgid "BoardNewEpic|Groups"
+msgstr ""
+
+msgid "BoardNewEpic|Loading groups"
+msgstr ""
+
+msgid "BoardNewEpic|No matching results"
+msgstr ""
+
+msgid "BoardNewEpic|Search groups"
+msgstr ""
+
+msgid "BoardNewEpic|Select a group"
+msgstr ""
+
msgid "BoardNewIssue|No matching results"
msgstr ""
@@ -5351,6 +5385,9 @@ msgstr ""
msgid "Boards|An error occurred while creating the list. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching child groups. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching group projects. Please try again."
msgstr ""
@@ -5682,6 +5719,9 @@ msgstr ""
msgid "Bulk update"
msgstr ""
+msgid "BulkImports|Re-import creates a new group. It does not sync with the existing group."
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -5691,6 +5731,9 @@ msgstr ""
msgid "BulkImport|From source group"
msgstr ""
+msgid "BulkImport|Group import history"
+msgstr ""
+
msgid "BulkImport|Import failed: Destination cannot be a subgroup of the source group. Change the destination and try again."
msgstr ""
@@ -5703,9 +5746,18 @@ msgstr ""
msgid "BulkImport|Importing the group failed"
msgstr ""
+msgid "BulkImport|Last imported to %{link}"
+msgstr ""
+
msgid "BulkImport|Name already exists."
msgstr ""
+msgid "BulkImport|New group"
+msgstr ""
+
+msgid "BulkImport|No history is available"
+msgstr ""
+
msgid "BulkImport|No parent"
msgstr ""
@@ -5718,6 +5770,9 @@ msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} matching filter \"%{filter}\" from %{link}"
msgstr ""
+msgid "BulkImport|Source group"
+msgstr ""
+
msgid "BulkImport|To new group"
msgstr ""
@@ -5727,6 +5782,9 @@ msgstr ""
msgid "BulkImport|You have no groups to import"
msgstr ""
+msgid "BulkImport|Your imported groups will appear here."
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -5968,6 +6026,9 @@ msgstr ""
msgid "Can be manually deployed to"
msgstr ""
+msgid "Can be overridden in each project."
+msgstr ""
+
msgid "Can create groups:"
msgstr ""
@@ -6070,6 +6131,9 @@ msgstr ""
msgid "Cancelling Preview"
msgstr ""
+msgid "Cannot assign a confidential epic to a non-confidential issue. Make the issue confidential and try again"
+msgstr ""
+
msgid "Cannot be assigned to other projects."
msgstr ""
@@ -6121,9 +6185,6 @@ msgstr ""
msgid "Cannot refer to a group %{timebox_type} by an internal id!"
msgstr ""
-msgid "Cannot set confidential epic for a non-confidential issue"
-msgstr ""
-
msgid "Cannot show preview. For previews on sketch files, they must have the file format introduced by Sketch version 43 and above."
msgstr ""
@@ -6361,15 +6422,15 @@ msgstr ""
msgid "Check out, review, and merge locally"
msgstr ""
-msgid "Check the %{docs_link_start}documentation%{docs_link_end}."
-msgstr ""
-
msgid "Check the current instance configuration "
msgstr ""
msgid "Check the elasticsearch.log file to debug why the migration was halted and make any changes before retrying the migration. When you fix the cause of the failure, click \"Retry migration\", and the migration will be scheduled to be retried in the background."
msgstr ""
+msgid "Check with your administrator."
+msgstr ""
+
msgid "Check your Docker images for known vulnerabilities."
msgstr ""
@@ -6400,6 +6461,9 @@ msgstr ""
msgid "Checkout"
msgstr ""
+msgid "Checkout|$%{selectedPlanPrice} per 10 GB storage per pack"
+msgstr ""
+
msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 minutes"
msgstr ""
@@ -6419,16 +6483,22 @@ msgstr ""
msgid "Checkout|%{name}'s GitLab subscription"
msgstr ""
-msgid "Checkout|%{selectedPlanText} plan"
+msgid "Checkout|%{name}'s storage subscription"
msgstr ""
-msgid "Checkout|%{startDate} - %{endDate}"
+msgid "Checkout|%{quantity} GB of storage"
msgstr ""
-msgid "Checkout|%{totalCiMinutes} CI minute"
-msgid_plural "Checkout|%{totalCiMinutes} CI minutes"
+msgid "Checkout|%{quantity} storage pack"
+msgid_plural "Checkout|%{quantity} storage packs"
msgstr[0] ""
+msgid "Checkout|%{selectedPlanText} plan"
+msgstr ""
+
+msgid "Checkout|%{startDate} - %{endDate}"
+msgstr ""
+
msgid "Checkout|%{totalCiMinutes} CI minutes"
msgstr ""
@@ -6504,6 +6574,9 @@ msgstr ""
msgid "Checkout|Failed to register credit card. Please try again."
msgstr ""
+msgid "Checkout|GB"
+msgstr ""
+
msgid "Checkout|GitLab group"
msgstr ""
@@ -6540,6 +6613,9 @@ msgstr ""
msgid "Checkout|State"
msgstr ""
+msgid "Checkout|Storage packs"
+msgstr ""
+
msgid "Checkout|Street address"
msgstr ""
@@ -6561,6 +6637,9 @@ msgstr ""
msgid "Checkout|Total minutes: %{quantity}"
msgstr ""
+msgid "Checkout|Total storage: %{quantity} GB"
+msgstr ""
+
msgid "Checkout|Users"
msgstr ""
@@ -6570,16 +6649,25 @@ msgstr ""
msgid "Checkout|Your organization"
msgstr ""
+msgid "Checkout|Your storage subscription has the same term as your main subscription, and the price is prorated accordingly."
+msgstr ""
+
msgid "Checkout|Your subscription will be applied to this group"
msgstr ""
msgid "Checkout|Zip code"
msgstr ""
+msgid "Checkout|a storage subscription"
+msgstr ""
+
msgid "Checkout|company or team"
msgstr ""
-msgid "Checkout|x 1,000 minutes per pack = %{strong}"
+msgid "Checkout|minutes"
+msgstr ""
+
+msgid "Checkout|x %{quantity} %{units} per pack ="
msgstr ""
msgid "Cherry-pick this commit"
@@ -6936,6 +7024,9 @@ msgstr ""
msgid "CloneIssue|Cannot clone issue to target project as it is pending deletion."
msgstr ""
+msgid "CloneIssue|Cannot clone issues of '%{issue_type}' type."
+msgstr ""
+
msgid "Cloned this issue to %{path_to_project}."
msgstr ""
@@ -6990,7 +7081,10 @@ msgstr ""
msgid "Closes this %{quick_action_target}."
msgstr ""
-msgid "Cloud licenses can not be removed."
+msgid "Cloud Functions description and apps that are suitable for this deployment target"
+msgstr ""
+
+msgid "Cloud Run description and apps that are suitable for this deployment target"
msgstr ""
msgid "Cluster"
@@ -7017,6 +7111,12 @@ msgstr ""
msgid "ClusterAgents|Access tokens"
msgstr ""
+msgid "ClusterAgents|Agent might not be connected to GitLab"
+msgstr ""
+
+msgid "ClusterAgents|Agent never connected to GitLab"
+msgstr ""
+
msgid "ClusterAgents|Alternative installation methods"
msgstr ""
@@ -7032,6 +7132,12 @@ msgstr ""
msgid "ClusterAgents|Configuration"
msgstr ""
+msgid "ClusterAgents|Connected"
+msgstr ""
+
+msgid "ClusterAgents|Connection status"
+msgstr ""
+
msgid "ClusterAgents|Copy token"
msgstr ""
@@ -7050,6 +7156,9 @@ msgstr ""
msgid "ClusterAgents|For alternative installation methods %{linkStart}go to the documentation%{linkEnd}."
msgstr ""
+msgid "ClusterAgents|For more troubleshooting information go to"
+msgstr ""
+
msgid "ClusterAgents|Go to the repository"
msgstr ""
@@ -7065,18 +7174,30 @@ msgstr ""
msgid "ClusterAgents|Integrate with the GitLab Agent"
msgstr ""
-msgid "ClusterAgents|Last used"
+msgid "ClusterAgents|Last connected %{timeAgo}."
+msgstr ""
+
+msgid "ClusterAgents|Last contact"
msgstr ""
msgid "ClusterAgents|Learn how to create an agent access token"
msgstr ""
+msgid "ClusterAgents|Make sure you are using a valid token."
+msgstr ""
+
msgid "ClusterAgents|Name"
msgstr ""
msgid "ClusterAgents|Never"
msgstr ""
+msgid "ClusterAgents|Never connected"
+msgstr ""
+
+msgid "ClusterAgents|Not connected"
+msgstr ""
+
msgid "ClusterAgents|Read more about getting started"
msgstr ""
@@ -7098,6 +7219,9 @@ msgstr ""
msgid "ClusterAgents|Select which Agent you want to install"
msgstr ""
+msgid "ClusterAgents|The Agent has not been connected in a long time. There might be a connectivity issue. Last contact was %{timeAgo}."
+msgstr ""
+
msgid "ClusterAgents|The GitLab Agent also requires %{linkStart}enabling the Agent Server%{linkEnd}"
msgstr ""
@@ -7125,9 +7249,6 @@ msgstr ""
msgid "ClusterAgents|You will need to create a token to connect to your agent"
msgstr ""
-msgid "ClusterAgent|This feature is only available for premium plans"
-msgstr ""
-
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -7317,9 +7438,6 @@ msgstr ""
msgid "ClusterIntegration|Create Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Create a provision role on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the account and external ID above. %{startMoreInfoLink}More information%{endLink}"
-msgstr ""
-
msgid "ClusterIntegration|Create cluster on"
msgstr ""
@@ -7752,7 +7870,7 @@ msgstr ""
msgid "ClusterIntegration|Subnets"
msgstr ""
-msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provisioned role, first create one on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the above account and external IDs. %{startMoreInfoLink}More information%{endLink}"
+msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provisioned role, first create one on %{awsLinkStart}Amazon Web Services %{awsLinkEnd} using the above account and external IDs. %{moreInfoStart}More information%{moreInfoEnd}"
msgstr ""
msgid "ClusterIntegration|The Kubernetes certificate used to authenticate to the cluster."
@@ -7986,6 +8104,9 @@ msgstr ""
msgid "Collapse replies"
msgstr ""
+msgid "Collapse settings section"
+msgstr ""
+
msgid "Collapse sidebar"
msgstr "收起å´é‚Šæ¬„"
@@ -8004,6 +8125,9 @@ msgstr ""
msgid "Comma-separated list of email addresses."
msgstr ""
+msgid "Comma-separated list of users allowed to exceed the rate limit."
+msgstr ""
+
msgid "Comma-separated, e.g. '1.1.1.1, 2.2.2.0/24'"
msgstr ""
@@ -8323,6 +8447,9 @@ msgstr ""
msgid "Configure %{repository_checks_link_start}repository checks%{link_end} and %{housekeeping_link_start}housekeeping%{link_end} on repositories."
msgstr ""
+msgid "Configure CAPTCHAs, IP address limits, and other anti-spam measures."
+msgstr ""
+
msgid "Configure Dependency Scanning in `.gitlab-ci.yml` using the GitLab managed template. You can [add variable overrides](https://docs.gitlab.com/ee/user/application_security/dependency_scanning/#customizing-the-dependency-scanning-settings) to customize Dependency Scanning settings."
msgstr ""
@@ -8359,16 +8486,13 @@ msgstr ""
msgid "Configure a %{codeStart}.gitlab-webide.yml%{codeEnd} file in the %{codeStart}.gitlab%{codeEnd} directory to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
msgstr ""
-msgid "Configure existing installation"
-msgstr ""
-
-msgid "Configure limit for notes created per minute by web and API requests."
+msgid "Configure advanced permissions, Large File Storage, and two-factor authentication settings."
msgstr ""
-msgid "Configure limits for Project/Group Import/Export."
+msgid "Configure approvals by authors and committers on all projects."
msgstr ""
-msgid "Configure limits for web and API requests."
+msgid "Configure existing installation"
msgstr ""
msgid "Configure paths to be protected by Rack Attack."
@@ -8383,10 +8507,13 @@ msgstr ""
msgid "Configure settings for Advanced Search with Elasticsearch."
msgstr ""
+msgid "Configure specific limits for Files API requests that supersede the general user and IP rate limits."
+msgstr ""
+
msgid "Configure specific limits for Git LFS requests that supersede the general user and IP rate limits."
msgstr ""
-msgid "Configure specific limits for Packages API requests that supersede the general user and IP rate limits."
+msgid "Configure specific limits for deprecated API requests that supersede the general user and IP rate limits."
msgstr ""
msgid "Configure the %{link} integration."
@@ -8398,6 +8525,9 @@ msgstr ""
msgid "Configure the way a user creates a new account."
msgstr ""
+msgid "Configure via Merge Request"
+msgstr ""
+
msgid "Configure which lists are shown for anyone who visits this board"
msgstr ""
@@ -8863,6 +8993,9 @@ msgstr ""
msgid "Content parsed with %{link}."
msgstr ""
+msgid "ContentEditor|Table of Contents"
+msgstr ""
+
msgid "ContentEditor|You have to provide a renderMarkdown function or a custom serializer"
msgstr ""
@@ -9049,6 +9182,9 @@ msgstr ""
msgid "Copy link to chart"
msgstr ""
+msgid "Copy prefix"
+msgstr ""
+
msgid "Copy reference"
msgstr ""
@@ -9079,6 +9215,9 @@ msgstr ""
msgid "Copy value"
msgstr ""
+msgid "Corpus Management"
+msgstr ""
+
msgid "Corpus Management|Are you sure you want to delete the corpus?"
msgstr ""
@@ -9307,6 +9446,9 @@ msgstr "建立分支"
msgid "Create commit"
msgstr ""
+msgid "Create common files more quickly, and standardize their format."
+msgstr ""
+
msgid "Create confidential merge request"
msgstr ""
@@ -9340,6 +9482,9 @@ msgstr ""
msgid "Create issue"
msgstr ""
+msgid "Create issue to resolve all threads"
+msgstr ""
+
msgid "Create iteration"
msgstr ""
@@ -9394,6 +9539,9 @@ msgstr ""
msgid "Create new..."
msgstr "創建..."
+msgid "Create or import your first project"
+msgstr ""
+
msgid "Create project"
msgstr ""
@@ -9751,7 +9899,7 @@ msgstr ""
msgid "Custom notification events"
msgstr "自定義通知事件"
-msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notificationLinkStart} notification emails%{notificationLinkEnd}."
+msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notificationLinkStart}notification emails%{notificationLinkEnd}."
msgstr ""
msgid "Custom project templates"
@@ -9948,10 +10096,10 @@ msgid "CycleAnalytics|Showing %{subjectFilterText} and %{selectedLabelsCount} la
msgid_plural "CycleAnalytics|Showing %{subjectFilterText} and %{selectedLabelsCount} labels"
msgstr[0] ""
-msgid "CycleAnalytics|Showing data for group '%{groupName}' and %{selectedProjectCount} projects from %{startDate} to %{endDate}"
+msgid "CycleAnalytics|Showing data for group '%{groupName}' and %{selectedProjectCount} projects from %{createdAfter} to %{createdBefore}"
msgstr ""
-msgid "CycleAnalytics|Showing data for group '%{groupName}' from %{startDate} to %{endDate}"
+msgid "CycleAnalytics|Showing data for group '%{groupName}' from %{createdAfter} to %{createdBefore}"
msgstr ""
msgid "CycleAnalytics|Stages"
@@ -10185,6 +10333,9 @@ msgstr ""
msgid "DastProfiles|Manage profiles"
msgstr ""
+msgid "DastProfiles|Manage site profiles"
+msgstr ""
+
msgid "DastProfiles|Minimum = 0 (no timeout enabled), Maximum = 2880 minutes"
msgstr ""
@@ -10260,6 +10411,9 @@ msgstr ""
msgid "DastProfiles|Scanner name"
msgstr ""
+msgid "DastProfiles|Schedule"
+msgstr ""
+
msgid "DastProfiles|Select branch"
msgstr ""
@@ -10329,7 +10483,7 @@ msgstr ""
msgid "DastProfiles|Website"
msgstr ""
-msgid "DastProfiles|You can either choose a passive scan or validate the target site in your chosen site profile. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
+msgid "DastProfiles|You can either choose a passive scan or validate the target site from the site profile management page. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
msgstr ""
msgid "DastProfiles|You cannot run an active scan against an unvalidated site."
@@ -10501,7 +10655,7 @@ msgstr ""
msgid "Days to merge"
msgstr ""
-msgid "Deactivate dormant users after 90 days of inactivity. Users can return to active status by signing in to their account. While inactive, a user is not counted as an active user in the instance."
+msgid "Deactivate dormant users after 90 days of inactivity"
msgstr ""
msgid "Dear Administrator,"
@@ -10588,10 +10742,10 @@ msgstr ""
msgid "Define a custom pattern with cron syntax"
msgstr "使用 Cron 語法定義自定義模å¼"
-msgid "Define approval settings."
+msgid "Define approval rules."
msgstr ""
-msgid "Define approval settings. %{linkStart}Learn more.%{linkEnd}"
+msgid "Define approval rules. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "Define custom rules for what constitutes spam, independent of Akismet"
@@ -10600,7 +10754,7 @@ msgstr ""
msgid "Define environments in the deploy stage(s) in %{code_open}.gitlab-ci.yml%{code_close} to track deployments here."
msgstr ""
-msgid "Define how approval rules are applied as a merge request moves toward completion."
+msgid "Define how approval rules are applied to merge requests."
msgstr ""
msgid "Definition"
@@ -10615,6 +10769,12 @@ msgstr ""
msgid "DelayedJobs|Are you sure you want to run %{job_name} immediately? This job will run automatically after it's timer finishes."
msgstr ""
+msgid "DelayedJobs|Are you sure you want to run %{job_name} immediately? This job will run automatically after its timer finishes."
+msgstr ""
+
+msgid "DelayedJobs|Run the delayed job now?"
+msgstr ""
+
msgid "DelayedJobs|Start now"
msgstr ""
@@ -10888,6 +11048,12 @@ msgstr ""
msgid "Dependency proxy image prefix"
msgstr ""
+msgid "DependencyProxy|Create a local proxy for storing frequently used upstream images. %{docLinkStart}Learn more%{docLinkEnd} about dependency proxies."
+msgstr ""
+
+msgid "DependencyProxy|Dependency Proxy"
+msgstr ""
+
msgid "DependencyProxy|Toggle Dependency Proxy"
msgstr ""
@@ -11125,6 +11291,9 @@ msgstr ""
msgid "Deployments"
msgstr ""
+msgid "Deployments to Google Kubernetes Engine can be "
+msgstr ""
+
msgid "Deployments|%{deployments} environment impacted."
msgid_plural "Deployments|%{deployments} environments impacted."
msgstr[0] ""
@@ -11153,6 +11322,9 @@ msgstr ""
msgid "Deployment|success"
msgstr ""
+msgid "Deprecated API rate limits"
+msgstr ""
+
msgid "Deprioritize label"
msgstr ""
@@ -11555,6 +11727,14 @@ msgstr ""
msgid "DiffsCompareBaseBranch|(base)"
msgstr ""
+msgid "Diffs|%d addition"
+msgid_plural "Diffs|%d additions"
+msgstr[0] ""
+
+msgid "Diffs|%d deletion"
+msgid_plural "Diffs|%d deletions"
+msgstr[0] ""
+
msgid "Diffs|No file name available"
msgstr ""
@@ -11564,9 +11744,16 @@ msgstr ""
msgid "Diffs|Show all unchanged lines"
msgstr ""
+msgid "Diffs|Showing %{dropdownStart}%{count} changed file%{dropdownEnd}"
+msgid_plural "Diffs|Showing %{dropdownStart}%{count} changed files%{dropdownEnd}"
+msgstr[0] ""
+
msgid "Diffs|Something went wrong while fetching diff lines."
msgstr ""
+msgid "Diffs|with %{additions} and %{deletions}"
+msgstr ""
+
msgid "Direct member"
msgstr ""
@@ -11691,9 +11878,6 @@ msgid "Dismiss %d selected vulnerability as"
msgid_plural "Dismiss %d selected vulnerabilities as"
msgstr[0] ""
-msgid "Dismiss Value Stream Analytics introduction box"
-msgstr ""
-
msgid "Dismiss merge request promotion"
msgstr ""
@@ -12015,6 +12199,9 @@ msgstr ""
msgid "Edit issues"
msgstr "編輯議題"
+msgid "Edit merge requests"
+msgstr ""
+
msgid "Edit public deploy key"
msgstr ""
@@ -12090,6 +12277,9 @@ msgstr ""
msgid "Elastic|None. Select projects to index."
msgstr ""
+msgid "Eligible users"
+msgstr ""
+
msgid "Email"
msgstr ""
@@ -12219,6 +12409,9 @@ msgstr ""
msgid "Enable"
msgstr ""
+msgid "Enable Amazon EKS integration"
+msgstr ""
+
msgid "Enable Auto DevOps"
msgstr ""
@@ -12252,6 +12445,9 @@ msgstr ""
msgid "Enable SSL verification"
msgstr ""
+msgid "Enable Service Ping"
+msgstr ""
+
msgid "Enable Snowplow tracking"
msgstr ""
@@ -12282,6 +12478,9 @@ msgstr ""
msgid "Enable authenticated Git LFS request rate limit"
msgstr ""
+msgid "Enable authenticated web request rate limit"
+msgstr ""
+
msgid "Enable authentication"
msgstr ""
@@ -12342,7 +12541,7 @@ msgstr ""
msgid "Enable or disable the Pseudonymizer data collection."
msgstr ""
-msgid "Enable or disable version check and service ping."
+msgid "Enable or disable version check and Service Ping."
msgstr ""
msgid "Enable protected paths rate limit"
@@ -12354,18 +12553,12 @@ msgstr ""
msgid "Enable reCAPTCHA"
msgstr ""
-msgid "Enable reCAPTCHA for login"
-msgstr ""
-
-msgid "Enable reCAPTCHA, Invisible Captcha, Akismet and set IP limits. For reCAPTCHA, we currently only support %{recaptcha_v2_link_start}v2%{recaptcha_v2_link_end}"
+msgid "Enable reCAPTCHA for login."
msgstr ""
msgid "Enable repository checks"
msgstr ""
-msgid "Enable service ping"
-msgstr ""
-
msgid "Enable shared runners for all projects and subgroups in this group."
msgstr ""
@@ -12387,7 +12580,10 @@ msgstr ""
msgid "Enable unauthenticated API request rate limit"
msgstr ""
-msgid "Enable unauthenticated request rate limit"
+msgid "Enable unauthenticated web request rate limit"
+msgstr ""
+
+msgid "Enable user deactivation emails"
msgstr ""
msgid "Enable version check"
@@ -12423,9 +12619,6 @@ msgstr ""
msgid "Enabled sources for code import during project creation. OmniAuth must be configured for GitHub"
msgstr ""
-msgid "Enabling this will only make licensed EE features available to projects if the project namespace's plan includes the feature or if the project is public."
-msgstr ""
-
msgid "Encountered an error while rendering: %{err}"
msgstr ""
@@ -12474,9 +12667,6 @@ msgstr ""
msgid "Enter Admin Mode"
msgstr ""
-msgid "Enter IP address range"
-msgstr ""
-
msgid "Enter a number"
msgstr ""
@@ -12489,9 +12679,6 @@ msgstr ""
msgid "Enter at least three characters to search"
msgstr ""
-msgid "Enter domain"
-msgstr ""
-
msgid "Enter in your Bitbucket Server URL and personal access token below"
msgstr ""
@@ -12678,9 +12865,6 @@ msgstr ""
msgid "Environments|Deployment %{status}"
msgstr ""
-msgid "Environments|Dismiss"
-msgstr ""
-
msgid "Environments|Enable review app"
msgstr ""
@@ -12693,9 +12877,6 @@ msgstr ""
msgid "Environments|Environments are places where code gets deployed, such as staging or production."
msgstr ""
-msgid "Environments|Help us improve environments"
-msgstr ""
-
msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
msgstr ""
@@ -12732,6 +12913,9 @@ msgstr ""
msgid "Environments|Note that this action will stop the environment, but it will %{emphasisStart}not%{emphasisEnd} have an effect on any existing deployment due to no “stop environment action†being defined in the %{ciConfigLinkStart}.gitlab-ci.yml%{ciConfigLinkEnd} file."
msgstr ""
+msgid "Environments|Open"
+msgstr ""
+
msgid "Environments|Open live environment"
msgstr ""
@@ -12771,9 +12955,6 @@ msgstr ""
msgid "Environments|Stopping %{environmentName}"
msgstr ""
-msgid "Environments|Take the survey"
-msgstr ""
-
msgid "Environments|There was an error fetching the logs. Please try again."
msgstr ""
@@ -12795,9 +12976,6 @@ msgstr ""
msgid "Environments|You don't have any environments right now"
msgstr ""
-msgid "Environments|Your feedback helps GitLab make environments better for you and other users. Participate and enter a sweepstake to win a USD 30 gift card."
-msgstr ""
-
msgid "Environments|by %{avatar}"
msgstr ""
@@ -13080,7 +13258,7 @@ msgstr ""
msgid "Error parsing CSV file. Please make sure it has"
msgstr ""
-msgid "Error rendering markdown preview"
+msgid "Error rendering Markdown preview"
msgstr ""
msgid "Error saving label update."
@@ -13128,6 +13306,9 @@ msgstr ""
msgid "Error: %{error_message}"
msgstr ""
+msgid "Error: Couldn't load some or all of the changes."
+msgstr ""
+
msgid "Error: No AWS credentials were supplied"
msgstr ""
@@ -13161,6 +13342,9 @@ msgstr ""
msgid "ErrorTracking|Enable error tracking"
msgstr ""
+msgid "ErrorTracking|Error tracking backend"
+msgstr ""
+
msgid "ErrorTracking|If you self-host Sentry, enter your Sentry instance's full URL. If you use Sentry's hosted solution, enter https://sentry.io"
msgstr ""
@@ -13194,6 +13378,12 @@ msgstr ""
msgid "Escalation policies must have at least one rule"
msgstr ""
+msgid "EscalationPolicies|%{clockIcon} IF alert is not %{alertStatus} in %{minutes}"
+msgstr ""
+
+msgid "EscalationPolicies|%{notificationIcon} THEN %{doAction} %{forScheduleOrUser}"
+msgstr ""
+
msgid "EscalationPolicies|+ Add an additional rule"
msgstr ""
@@ -13236,13 +13426,13 @@ msgstr ""
msgid "EscalationPolicies|Escalation policies"
msgstr ""
-msgid "EscalationPolicies|Escalation rules"
+msgid "EscalationPolicies|Escalation policy %{obstacle} in Project %{project}"
msgstr ""
-msgid "EscalationPolicies|Failed to load oncall-schedules"
+msgid "EscalationPolicies|Escalation rules"
msgstr ""
-msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} %{then} THEN %{doAction} %{scheduleOrUser}"
+msgid "EscalationPolicies|Failed to load oncall-schedules"
msgstr ""
msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} minutes"
@@ -13320,18 +13510,36 @@ msgstr ""
msgid "Every %{action} attempt has failed: %{job_error_message}. Please try again."
msgstr ""
+msgid "Every 3 months"
+msgstr ""
+
+msgid "Every 3 months on the %{day} at %{time} %{timezone}"
+msgstr ""
+
+msgid "Every 6 months"
+msgstr ""
+
+msgid "Every 6 months on the %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Every day"
msgstr ""
msgid "Every day (at %{time})"
msgstr ""
+msgid "Every day at %{time} %{timezone}"
+msgstr ""
+
msgid "Every month"
msgstr ""
msgid "Every month (Day %{day} at %{time})"
msgstr ""
+msgid "Every month on the %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Every three months"
msgstr ""
@@ -13345,6 +13553,15 @@ msgstr[0] ""
msgid "Every week (%{weekday} at %{time})"
msgstr ""
+msgid "Every week on %{day} at %{time} %{timezone}"
+msgstr ""
+
+msgid "Every year"
+msgstr ""
+
+msgid "Every year on %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Everyone"
msgstr ""
@@ -13381,9 +13598,6 @@ msgstr ""
msgid "Exactly one of %{attributes} is required"
msgstr ""
-msgid "Example: %{ip_address}. %{read_more_link}."
-msgstr ""
-
msgid "Example: @sub\\.company\\.com$"
msgstr ""
@@ -13450,13 +13664,13 @@ msgstr ""
msgid "Expand pipeline"
msgstr ""
-msgid "Expand sidebar"
+msgid "Expand settings section"
msgstr ""
-msgid "Expected documents: %{expected_documents}"
+msgid "Expand sidebar"
msgstr ""
-msgid "Experienced"
+msgid "Expected documents: %{expected_documents}"
msgstr ""
msgid "ExperimentSubject|Must have exactly one of User, Namespace, or Project."
@@ -13741,9 +13955,6 @@ msgstr ""
msgid "Failed to load related branches"
msgstr ""
-msgid "Failed to load sidebar lock status"
-msgstr ""
-
msgid "Failed to load stacktrace."
msgstr ""
@@ -14166,6 +14377,9 @@ msgstr ""
msgid "Files"
msgstr "文件"
+msgid "Files API Rate Limits"
+msgstr ""
+
msgid "Files breadcrumb"
msgstr ""
@@ -15165,6 +15379,9 @@ msgstr ""
msgid "GitLab group: %{source_link}"
msgstr ""
+msgid "GitLab informs you if a new version is available."
+msgstr ""
+
msgid "GitLab is a complete DevOps platform, delivered as a single application, fundamentally changing the way Development, Security, and Ops teams collaborate"
msgstr ""
@@ -15180,7 +15397,7 @@ msgstr ""
msgid "GitLab is open source software to collaborate on code."
msgstr ""
-msgid "GitLab is undergoing maintenance and is operating in a read-only mode."
+msgid "GitLab is undergoing maintenance and is operating in read-only mode."
msgstr ""
msgid "GitLab member or Email address"
@@ -15192,9 +15409,6 @@ msgstr ""
msgid "GitLab project export"
msgstr ""
-msgid "GitLab restart is required to apply changes."
-msgstr ""
-
msgid "GitLab single sign-on URL"
msgstr ""
@@ -15210,9 +15424,6 @@ msgstr ""
msgid "GitLab version"
msgstr ""
-msgid "GitLab will inform you if a new version is available."
-msgstr ""
-
msgid "GitLab will run a background job that will produce pseudonymized CSVs of the GitLab database that will be uploaded to your configured object storage directory."
msgstr ""
@@ -15477,9 +15688,21 @@ msgstr ""
msgid "Go to snippets"
msgstr ""
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check 'Allowed domains for sign-ups'."
+msgstr ""
+
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check 'Email restrictions for sign-ups'."
+msgstr ""
+
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check the 'Domain denylist'."
+msgstr ""
+
msgid "Go to the activity feed"
msgstr ""
+msgid "Go to the group’s 'Settings &gt; General' page, and check 'Restrict membership by email domain'."
+msgstr ""
+
msgid "Go to the milestone list"
msgstr ""
@@ -15516,6 +15739,12 @@ msgstr ""
msgid "Goal of the changes and what reviewers should be aware of"
msgstr ""
+msgid "Google Cloud"
+msgstr ""
+
+msgid "Google Cloud offers several deployment targets. Select the one most suitable for your project."
+msgstr ""
+
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
@@ -15600,9 +15829,6 @@ msgstr ""
msgid "Group ID"
msgstr ""
-msgid "Group ID: %{group_id}"
-msgstr ""
-
msgid "Group Owner must have signed in with SAML before enabling Group Managed Accounts"
msgstr ""
@@ -15777,6 +16003,12 @@ msgstr ""
msgid "GroupImport|Unable to process group import file"
msgstr ""
+msgid "GroupPage|Copy group ID"
+msgstr ""
+
+msgid "GroupPage|Group ID: %{group_id}"
+msgstr ""
+
msgid "GroupRoadmap|%{dateWord} – No end date"
msgstr ""
@@ -15831,6 +16063,9 @@ msgstr ""
msgid "GroupRoadmap|Within 3 years"
msgstr ""
+msgid "GroupSAML|\"persistent\" recommended"
+msgstr ""
+
msgid "GroupSAML|%{strongOpen}Warning%{strongClose} - Enabling %{linkStart}SSO enforcement%{linkEnd} can reduce security risks."
msgstr ""
@@ -15963,6 +16198,9 @@ msgstr ""
msgid "GroupSAML|To be able to prohibit outer forks, you first need to enforce dedicate group managed accounts."
msgstr ""
+msgid "GroupSAML|Use SAML group links to manage group membership using SAML."
+msgstr ""
+
msgid "GroupSAML|Valid SAML Response"
msgstr ""
@@ -15975,13 +16213,10 @@ msgstr ""
msgid "GroupSAML|as %{access_level}"
msgstr ""
-msgid "GroupSAML|must match stored NameID of \"%{extern_uid}\" as we use this to identify users. If the NameID changes users will be unable to sign in."
-msgstr ""
-
-msgid "GroupSAML|should be \"persistent\""
+msgid "GroupSAML|must match stored NameID of \"%{extern_uid}\" to identify user and allow sign in"
msgstr ""
-msgid "GroupSAML|should be a random persistent ID, emails are discouraged"
+msgid "GroupSAML|recommend persistent ID instead of email"
msgstr ""
msgid "GroupSelect|No matching results"
@@ -15996,9 +16231,15 @@ msgstr ""
msgid "GroupSettings|Allow project access token creation"
msgstr ""
+msgid "GroupSettings|Applied to all subgroups unless overridden by a group owner. Groups already added to the project lose access."
+msgstr ""
+
msgid "GroupSettings|Auto DevOps pipeline was updated for the group"
msgstr ""
+msgid "GroupSettings|Available only on the top-level group. Applies to all subgroups. Groups already shared with a group outside %{group} are still shared unless removed manually."
+msgstr ""
+
msgid "GroupSettings|Badges"
msgstr ""
@@ -16050,6 +16291,9 @@ msgstr ""
msgid "GroupSettings|New runners registration token has been generated!"
msgstr ""
+msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgstr ""
+
msgid "GroupSettings|Pipeline settings was updated for the group"
msgstr ""
@@ -16062,12 +16306,15 @@ msgstr ""
msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
-msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups."
+msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups"
msgstr ""
msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
msgstr ""
+msgid "GroupSettings|Prevents group members from being notified if the group is mentioned."
+msgstr ""
+
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
msgstr ""
@@ -16104,21 +16351,6 @@ msgstr ""
msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}."
msgstr ""
-msgid "GroupSettings|This setting is only available on the top-level group and it applies to all subgroups. Groups that have already been shared with a group outside %{group} will still be shared, and this access will have to be revoked manually."
-msgstr ""
-
-msgid "GroupSettings|This setting will be applied to all subgroups unless overridden by a group owner. Groups that already have access to the project will continue to have access unless removed manually."
-msgstr ""
-
-msgid "GroupSettings|This setting will override user notification preferences for all members of the group, subgroups, and projects."
-msgstr ""
-
-msgid "GroupSettings|This setting will prevent group members from being notified if the group is mentioned."
-msgstr ""
-
-msgid "GroupSettings|This setting will prevent group members from forking projects outside of the group."
-msgstr ""
-
msgid "GroupSettings|Transfer group"
msgstr ""
@@ -16236,7 +16468,7 @@ msgstr ""
msgid "GroupsNew|No import options available"
msgstr ""
-msgid "GroupsNew|Not all related objects are migrated, as %{docs_link_start}described here%{docs_link_end}. Please %{feedback_link_start}leave feedback%{feedback_link_end} on this feature."
+msgid "GroupsNew|Not all related objects are migrated. %{docs_link_start}More info%{docs_link_end}."
msgstr ""
msgid "GroupsNew|Personal access token"
@@ -16368,15 +16600,27 @@ msgstr "ä¸è‰¯"
msgid "Hello %{name},"
msgstr ""
-msgid "Hello there"
-msgstr ""
-
msgid "Hello, %{name}!"
msgstr ""
msgid "Hello, %{username}!"
msgstr ""
+msgid "HelloMessage|%{handshake_emoji} Contribute to GitLab: %{contribute_link}"
+msgstr ""
+
+msgid "HelloMessage|%{magnifier_emoji} Create a new GitLab issue: %{new_issue_link}"
+msgstr ""
+
+msgid "HelloMessage|%{rocket_emoji} We like your curiosity! Help us improve GitLab by joining the team: %{jobs_page_link}"
+msgstr ""
+
+msgid "HelloMessage|Does this page need fixes or improvements? Open an issue or contribute a merge request to help make GitLab more lovable. At GitLab, everyone can contribute!"
+msgstr ""
+
+msgid "HelloMessage|Welcome to GitLab!"
+msgstr ""
+
msgid "Help"
msgstr "説明"
@@ -16386,13 +16630,10 @@ msgstr ""
msgid "Helps prevent bots from creating accounts."
msgstr ""
-msgid "Helps prevent bots from creating issues"
-msgstr ""
-
-msgid "Helps prevent malicious users hide their activity"
+msgid "Helps prevent bots from creating issues."
msgstr ""
-msgid "Helps reduce request volume (e.g. from crawlers or abusive bots)"
+msgid "Helps prevent malicious users hide their activity."
msgstr ""
msgid "Helps reduce request volume (for example, from crawlers or abusive bots)"
@@ -16514,6 +16755,12 @@ msgstr "已開始維護"
msgid "Housekeeping, export, path, transfer, remove, archive."
msgstr ""
+msgid "How do I configure Akismet?"
+msgstr ""
+
+msgid "How do I configure it?"
+msgstr ""
+
msgid "How do I configure runners?"
msgstr ""
@@ -16535,19 +16782,25 @@ msgstr ""
msgid "How do I set up this service?"
msgstr ""
+msgid "How do I use a web terminal?"
+msgstr ""
+
+msgid "How do I use file templates?"
+msgstr ""
+
msgid "How it works"
msgstr ""
msgid "How many days need to pass between marking entity for deletion and actual removing it."
msgstr ""
-msgid "How many seconds an IP will be counted towards the limit"
+msgid "How many seconds an IP counts toward the IP address limit."
msgstr ""
-msgid "I accept the %{terms_link}"
+msgid "How the job limiter handles jobs exceeding the thresholds specified below. The 'track' mode only logs the jobs. The 'compress' mode compresses the jobs and raises an exception if the compressed size exceeds the limit."
msgstr ""
-msgid "I accept the|Terms of Service and Privacy Policy"
+msgid "I accept the %{terms_link}"
msgstr ""
msgid "I forgot my password"
@@ -16631,13 +16884,16 @@ msgstr ""
msgid "IP Address"
msgstr ""
-msgid "IP expiration time"
+msgid "IP address expiration time"
msgstr ""
-msgid "IP subnet restriction only allowed for top-level groups"
+msgid "IP address restrictions"
msgstr ""
-msgid "IPs per user"
+msgid "IP addresses per user"
+msgstr ""
+
+msgid "IP subnet restriction only allowed for top-level groups"
msgstr ""
msgid "Identifier"
@@ -16652,6 +16908,9 @@ msgstr ""
msgid "If any indexed field exceeds this limit it will be truncated to this number of characters and the rest will not be indexed or searchable. This does not apply to repository and wiki indexing. Setting this to 0 means it is unlimited."
msgstr ""
+msgid "If blank, defaults to %{code_open}Retry later%{code_close}."
+msgstr ""
+
msgid "If blank, set allowable lifetime to %{instance_level_policy_in_words}, as defined by the instance admin. Once set, existing tokens for users in this group may be revoked."
msgstr ""
@@ -16703,6 +16962,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 did not initiate these sign-in attempts, please reach out to your administrator or enable two-factor authentication (2FA) on your account."
+msgstr ""
+
msgid "If you did not initiate this change, please contact your administrator immediately."
msgstr ""
@@ -16792,10 +17054,10 @@ msgstr ""
msgid "Import Projects from Gitea"
msgstr ""
-msgid "Import a project"
+msgid "Import an exported GitLab project"
msgstr ""
-msgid "Import an exported GitLab project"
+msgid "Import and export rate limits"
msgstr ""
msgid "Import failed due to a GitHub error: %{original}"
@@ -16807,12 +17069,18 @@ msgstr ""
msgid "Import from Jira"
msgstr ""
+msgid "Import group"
+msgstr ""
+
msgid "Import group from file"
msgstr ""
msgid "Import groups"
msgstr ""
+msgid "Import history"
+msgstr ""
+
msgid "Import in progress"
msgstr ""
@@ -16876,7 +17144,25 @@ msgstr ""
msgid "Import timed out. Import took longer than %{import_jobs_expiration} seconds"
msgstr ""
-msgid "Import/Export Rate Limits"
+msgid "ImportAProjectModal|Import from a project"
+msgstr ""
+
+msgid "ImportAProjectModal|Import members from another project"
+msgstr ""
+
+msgid "ImportAProjectModal|Import project members"
+msgstr ""
+
+msgid "ImportAProjectModal|Only project members (not group members) are imported, and they get the same permissions as the project you import from."
+msgstr ""
+
+msgid "ImportAProjectModal|Successfully imported"
+msgstr ""
+
+msgid "ImportAProjectModal|Unable to import project members"
+msgstr ""
+
+msgid "ImportAProjectModal|You're importing members to the %{strongStart}%{name}%{strongEnd} project."
msgstr ""
msgid "ImportButtons|Connect repositories from"
@@ -16928,7 +17214,7 @@ msgstr[0] ""
msgid "Importing..."
msgstr ""
-msgid "Import|A repository URL usually ends in a .git suffix, although this is not required. Double check to make sure your repository URL is correct."
+msgid "Import|There is not a valid Git repository at this URL. If your HTTP repository is not publicly accessible, verify your credentials."
msgstr ""
msgid "Improve customer support with Service Desk"
@@ -16937,9 +17223,6 @@ msgstr ""
msgid "Improves Git cloning performance."
msgstr ""
-msgid "In %{time_to_now}"
-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 ""
@@ -17225,7 +17508,7 @@ msgstr ""
msgid "InProductMarketing|Start a GitLab Ultimate trial today in less than one minute, no credit card required."
msgstr ""
-msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no CC required"
+msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no credit card required"
msgstr ""
msgid "InProductMarketing|Start a trial"
@@ -17264,7 +17547,7 @@ msgstr ""
msgid "InProductMarketing|Team up in GitLab for greater efficiency"
msgstr ""
-msgid "InProductMarketing|Team work makes the dream work"
+msgid "InProductMarketing|Team work makes the dream work"
msgstr ""
msgid "InProductMarketing|Test, create, deploy"
@@ -17844,6 +18127,9 @@ msgstr ""
msgid "Integrations|Create new issue in Jira"
msgstr ""
+msgid "Integrations|Create new issue in ZenTao"
+msgstr ""
+
msgid "Integrations|Default settings are inherited from the group level."
msgstr ""
@@ -17937,9 +18223,15 @@ msgstr ""
msgid "Integrations|Search Jira issues"
msgstr ""
+msgid "Integrations|Search ZenTao issues"
+msgstr ""
+
msgid "Integrations|Send notifications about project events to Unify Circuit."
msgstr ""
+msgid "Integrations|Send notifications about project events to a Unify Circuit conversation. %{docs_link}"
+msgstr ""
+
msgid "Integrations|Sign in to add namespaces"
msgstr ""
@@ -17979,6 +18271,9 @@ msgstr ""
msgid "Integrations|You've activated every integration 🎉"
msgstr ""
+msgid "Integrations|ZenTao issues display here when you create issues in your project in ZenTao."
+msgstr ""
+
msgid "Interactive mode"
msgstr ""
@@ -18006,9 +18301,6 @@ msgstr ""
msgid "Interval Pattern"
msgstr "循環週期"
-msgid "Introducing Value Stream Analytics"
-msgstr ""
-
msgid "Introducing Your DevOps Report"
msgstr ""
@@ -18105,6 +18397,12 @@ msgstr ""
msgid "Investigate vulnerability: %{title}"
msgstr ""
+msgid "Invisible Captcha"
+msgstr ""
+
+msgid "Invisible Captcha helps prevent the creation of spam accounts. It adds a honeypot field and time-sensitive form submission to the account signup form."
+msgstr ""
+
msgid "Invitation"
msgstr ""
@@ -18558,12 +18856,18 @@ msgstr ""
msgid "Issues"
msgstr "議題"
+msgid "Issues I've created"
+msgstr ""
+
msgid "Issues Rate Limits"
msgstr ""
msgid "Issues and merge requests"
msgstr ""
+msgid "Issues assigned to me"
+msgstr ""
+
msgid "Issues can be bugs, tasks or ideas to be discussed. Also, issues are searchable and filterable."
msgstr ""
@@ -18675,7 +18979,7 @@ msgstr ""
msgid "Iterations|Create cadence"
msgstr ""
-msgid "Iterations|Create your first iteration"
+msgid "Iterations|Create iteration"
msgstr ""
msgid "Iterations|Delete cadence"
@@ -18684,6 +18988,9 @@ msgstr ""
msgid "Iterations|Delete iteration cadence?"
msgstr ""
+msgid "Iterations|Delete iteration?"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -18717,12 +19024,18 @@ msgstr ""
msgid "Iterations|New iteration cadence"
msgstr ""
+msgid "Iterations|No closed iterations."
+msgstr ""
+
msgid "Iterations|No iteration cadences to show."
msgstr ""
msgid "Iterations|No iterations in cadence."
msgstr ""
+msgid "Iterations|No open iterations."
+msgstr ""
+
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
@@ -18753,6 +19066,9 @@ msgstr ""
msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
msgstr ""
+msgid "Iterations|This will remove the iteration from any issues that are assigned to it."
+msgstr ""
+
msgid "Iterations|Title"
msgstr ""
@@ -18768,15 +19084,9 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "I’m familiar with the basics of DevOps."
-msgstr ""
-
msgid "I’m joining my team who’s already on GitLab"
msgstr ""
-msgid "I’m not familiar with the basics of DevOps."
-msgstr ""
-
msgid "Jaeger URL"
msgstr ""
@@ -19041,6 +19351,9 @@ msgstr ""
msgid "Job"
msgstr ""
+msgid "Job %{jobName}"
+msgstr ""
+
msgid "Job Failed #%{build_id}"
msgstr ""
@@ -19630,9 +19943,6 @@ msgstr ""
msgid "Learn more in the"
msgstr "了解更多"
-msgid "Learn more in the|pipeline schedules documentation"
-msgstr "æµæ°´ç·šè¨ˆåŠƒæ–‡æª”"
-
msgid "Learn more."
msgstr ""
@@ -19744,9 +20054,6 @@ msgstr ""
msgid "Leave Admin Mode"
msgstr ""
-msgid "Leave blank for no limit. Once set, existing personal access tokens may be revoked."
-msgstr ""
-
msgid "Leave edit mode? All unsaved changes will be lost."
msgstr ""
@@ -19792,10 +20099,10 @@ msgstr ""
msgid "LicenseCompliance|Acceptable license to be used in the project"
msgstr ""
-msgid "LicenseCompliance|Add a license"
+msgid "LicenseCompliance|Add license and related policy"
msgstr ""
-msgid "LicenseCompliance|Add license and related policy"
+msgid "LicenseCompliance|Add license policy"
msgstr ""
msgid "LicenseCompliance|Allow"
@@ -19879,6 +20186,9 @@ msgstr ""
msgid "LicenseManagement|Uncategorized"
msgstr ""
+msgid "Licensed Enterprise Edition features can be used if the project namespace's plan includes the feature, or if the project is public."
+msgstr ""
+
msgid "Licensed Features"
msgstr ""
@@ -19945,7 +20255,10 @@ msgstr ""
msgid "Limit namespaces and projects that can be indexed"
msgstr ""
-msgid "Limit sign in from multiple ips"
+msgid "Limit project size at a global, group, and project level. %{link_start}Learn more%{link_end}."
+msgstr ""
+
+msgid "Limit sign in from multiple IP addresses"
msgstr ""
msgid "Limit the number of concurrent operations this secondary site can run in the background."
@@ -19957,10 +20270,16 @@ msgstr ""
msgid "Limit the number of issues and epics per minute a user can create through web and API requests."
msgstr ""
+msgid "Limit the size of Sidekiq jobs stored in Redis."
+msgstr ""
+
msgid "Limited to showing %d event at most"
msgid_plural "Limited to showing %d events at most"
msgstr[0] ""
+msgid "Limiting mode"
+msgstr ""
+
msgid "Line changes"
msgstr ""
@@ -20030,9 +20349,6 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
-msgid "List of users to be excluded from the limit"
-msgstr ""
-
msgid "List options"
msgstr ""
@@ -20072,9 +20388,6 @@ msgstr ""
msgid "Loading functions timed out. Please reload the page to try again."
msgstr ""
-msgid "Loading issues"
-msgstr ""
-
msgid "Loading more"
msgstr ""
@@ -20366,6 +20679,9 @@ msgstr ""
msgid "Marked For Deletion At - %{deletion_time}"
msgstr ""
+msgid "Marked as ready. Merging is now allowed."
+msgstr ""
+
msgid "Marked this %{noun} as a draft."
msgstr ""
@@ -20438,52 +20754,22 @@ msgstr ""
msgid "Max 100,000 events"
msgstr ""
-msgid "Max 20 characters"
-msgstr ""
-
-msgid "Max Group Export Download requests per minute per user"
-msgstr ""
-
-msgid "Max Group Export requests per minute per user"
-msgstr ""
-
-msgid "Max Group Import requests per minute per user"
-msgstr ""
-
-msgid "Max Project Export Download requests per minute per user"
-msgstr ""
-
-msgid "Max Project Export requests per minute per user"
-msgstr ""
-
-msgid "Max Project Import requests per minute per user"
-msgstr ""
-
-msgid "Max authenticated API requests per period per user"
-msgstr ""
-
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
-msgid "Max authenticated web requests per period per user"
-msgstr ""
-
msgid "Max file size is 200 KB."
msgstr ""
-msgid "Max requests per minute per user"
-msgstr ""
-
msgid "Max role"
msgstr ""
msgid "Max session time"
msgstr ""
-msgid "Max unauthenticated requests per period per IP"
+msgid "MaxBuilds"
msgstr ""
-msgid "MaxBuilds"
+msgid "Maximum 20 characters"
msgstr ""
msgid "Maximum Conan package file size in bytes"
@@ -20519,6 +20805,12 @@ msgstr ""
msgid "Maximum attachment size (MB)"
msgstr ""
+msgid "Maximum authenticated API requests per rate limit period per user"
+msgstr ""
+
+msgid "Maximum authenticated web requests per rate limit period per user"
+msgstr ""
+
msgid "Maximum bulk request size (MiB)"
msgstr ""
@@ -20564,6 +20856,15 @@ msgstr ""
msgid "Maximum files in a diff"
msgstr ""
+msgid "Maximum group export download requests per minute"
+msgstr ""
+
+msgid "Maximum group export requests per minute"
+msgstr ""
+
+msgid "Maximum group import requests per minute"
+msgstr ""
+
msgid "Maximum import size"
msgstr ""
@@ -20600,7 +20901,7 @@ msgstr ""
msgid "Maximum number of projects."
msgstr ""
-msgid "Maximum number of unique IPs per user"
+msgid "Maximum number of unique IP addresses per user."
msgstr ""
msgid "Maximum page reached"
@@ -20609,12 +20910,24 @@ msgstr ""
msgid "Maximum page size"
msgstr ""
+msgid "Maximum project export download requests per minute"
+msgstr ""
+
+msgid "Maximum project export requests per minute"
+msgstr ""
+
+msgid "Maximum project import requests per minute"
+msgstr ""
+
msgid "Maximum push size"
msgstr ""
msgid "Maximum push size (MB)"
msgstr ""
+msgid "Maximum requests per minute"
+msgstr ""
+
msgid "Maximum running slices"
msgstr ""
@@ -20642,10 +20955,16 @@ msgstr ""
msgid "Maximum time between updates that a mirror can have when scheduled to synchronize."
msgstr ""
-msgid "Maximum time for web terminal websocket connection (in seconds). 0 for unlimited."
+msgid "Maximum time that users are allowed to skip the setup of two-factor authentication (in hours). Set to 0 (zero) to enforce at next sign in."
msgstr ""
-msgid "Maximum time that users are allowed to skip the setup of two-factor authentication (in hours). Set to 0 (zero) to enforce at next sign in."
+msgid "Maximum time, in seconds, for a web terminal websocket connection. 0 for unlimited."
+msgstr ""
+
+msgid "Maximum unauthenticated API requests per rate limit period per IP"
+msgstr ""
+
+msgid "Maximum unauthenticated web requests per rate limit period per IP"
msgstr ""
msgid "May"
@@ -20663,9 +20982,6 @@ msgstr ""
msgid "Medium vulnerabilities present"
msgstr ""
-msgid "Member lock"
-msgstr ""
-
msgid "Member since"
msgstr ""
@@ -20702,6 +21018,9 @@ msgstr ""
msgid "Members of a group may only view projects they have permission to access"
msgstr ""
+msgid "Membership"
+msgstr ""
+
msgid "Members|%{time} by %{user}"
msgstr ""
@@ -20762,9 +21081,6 @@ msgstr ""
msgid "Members|Expiration date updated successfully."
msgstr ""
-msgid "Members|Expired"
-msgstr ""
-
msgid "Members|Filter members"
msgstr ""
@@ -20780,9 +21096,6 @@ msgstr ""
msgid "Members|Membership"
msgstr ""
-msgid "Members|No expiration set"
-msgstr ""
-
msgid "Members|Remove \"%{groupName}\""
msgstr ""
@@ -20804,9 +21117,6 @@ msgstr ""
msgid "Members|Search invited"
msgstr ""
-msgid "Members|in %{time}"
-msgstr ""
-
msgid "Member|Deny access"
msgstr ""
@@ -20882,9 +21192,6 @@ msgstr "åˆä½µè«‹æ±‚"
msgid "Merge request %{mr_link} was reviewed by %{mr_author}"
msgstr ""
-msgid "Merge request (MR) approvals"
-msgstr ""
-
msgid "Merge request analytics"
msgstr ""
@@ -20906,12 +21213,21 @@ msgstr ""
msgid "Merge requests"
msgstr "åˆä½µè«‹æ±‚"
+msgid "Merge requests I've created"
+msgstr ""
+
msgid "Merge requests are a place to propose changes you've made to a project and discuss those changes with others"
msgstr ""
msgid "Merge requests are read-only in a secondary Geo node"
msgstr ""
+msgid "Merge requests assigned to me"
+msgstr ""
+
+msgid "Merge requests that I'm a reviewer"
+msgstr ""
+
msgid "Merge the branch and fix any conflicts that come up"
msgstr ""
@@ -20972,10 +21288,10 @@ msgstr ""
msgid "MergeRequests|An error occurred while saving the draft comment."
msgstr ""
-msgid "MergeRequests|Failed to squash. Should be done manually."
+msgid "MergeRequests|Create issue to resolve thread"
msgstr ""
-msgid "MergeRequests|Resolve this thread in a new issue"
+msgid "MergeRequests|Failed to squash. Should be done manually."
msgstr ""
msgid "MergeRequests|Saving the comment failed"
@@ -21787,6 +22103,9 @@ msgstr ""
msgid "MoveIssue|Cannot move issue to project it originates from!"
msgstr ""
+msgid "MoveIssue|Cannot move issues of '%{issue_type}' type."
+msgstr ""
+
msgid "Moved issue to %{label} column in the board."
msgstr ""
@@ -21911,6 +22230,15 @@ 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. To learn more about reducing storage capacity please visit our docs."
msgstr ""
+msgid "NamespaceUserCap|Pending users must be reviewed and approved by a group owner. Learn more about %{user_caps_link_start}User Caps%{link_end} and %{users_pending_approval_link_start}Users Pending Approval%{link_end}."
+msgstr ""
+
+msgid "NamespaceUserCap|View pending user approvals"
+msgstr ""
+
+msgid "NamespaceUserCap|Your group has reached its billable member limit"
+msgstr ""
+
msgid "Namespaces"
msgstr ""
@@ -21953,9 +22281,6 @@ msgstr ""
msgid "Network"
msgstr ""
-msgid "Network Policy|New rule"
-msgstr ""
-
msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is inbound from a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
msgstr ""
@@ -21977,16 +22302,13 @@ msgstr ""
msgid "NetworkPolicies|%{strongOpen}any%{strongClose} port"
msgstr ""
-msgid "NetworkPolicies|+ Add alert"
-msgstr ""
-
msgid "NetworkPolicies|.yaml"
msgstr ""
msgid "NetworkPolicies|.yaml mode"
msgstr ""
-msgid "NetworkPolicies|Actions"
+msgid "NetworkPolicies|Add alert"
msgstr ""
msgid "NetworkPolicies|Alerts are intended to be selectively used for a limited number of events that are potentially concerning and warrant a manual review. Alerts should not be used as a substitute for a SIEM or a logging tool. High volume alerts are likely to be dropped so as to preserve the stability of GitLab's integration with Kubernetes."
@@ -22022,9 +22344,6 @@ msgstr ""
msgid "NetworkPolicies|Deny all traffic"
msgstr ""
-msgid "NetworkPolicies|Description"
-msgstr ""
-
msgid "NetworkPolicies|Edit policy"
msgstr ""
@@ -22037,9 +22356,6 @@ msgstr ""
msgid "NetworkPolicies|IP/subnet"
msgstr ""
-msgid "NetworkPolicies|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
-msgstr ""
-
msgid "NetworkPolicies|Invalid or empty policy"
msgstr ""
@@ -22049,19 +22365,16 @@ msgstr ""
msgid "NetworkPolicies|Kubernetes error: %{error}"
msgstr ""
-msgid "NetworkPolicies|Name"
-msgstr ""
-
msgid "NetworkPolicies|Network"
msgstr ""
-msgid "NetworkPolicies|Network traffic"
+msgid "NetworkPolicies|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
msgstr ""
-msgid "NetworkPolicies|New policy"
+msgid "NetworkPolicies|Network policy can be created after the environment is loaded successfully."
msgstr ""
-msgid "NetworkPolicies|No policies detected"
+msgid "NetworkPolicies|Network traffic"
msgstr ""
msgid "NetworkPolicies|None selected"
@@ -22070,21 +22383,12 @@ msgstr ""
msgid "NetworkPolicies|Please %{installLinkStart}install%{installLinkEnd} and %{configureLinkStart}configure a Kubernetes Agent for this project%{configureLinkEnd} to enable alerts."
msgstr ""
-msgid "NetworkPolicies|Policies are a specification of how groups of pods are allowed to communicate with each other's network endpoints."
-msgstr ""
-
msgid "NetworkPolicies|Policy %{policyName} was successfully changed"
msgstr ""
msgid "NetworkPolicies|Policy definition"
msgstr ""
-msgid "NetworkPolicies|Policy editor"
-msgstr ""
-
-msgid "NetworkPolicies|Policy preview"
-msgstr ""
-
msgid "NetworkPolicies|Rule"
msgstr ""
@@ -22094,9 +22398,6 @@ msgstr ""
msgid "NetworkPolicies|Rule mode is unavailable for this policy. In some cases, we cannot parse the YAML file back into the rules editor."
msgstr ""
-msgid "NetworkPolicies|Rules"
-msgstr ""
-
msgid "NetworkPolicies|Save changes"
msgstr ""
@@ -22109,9 +22410,6 @@ msgstr ""
msgid "NetworkPolicies|Traffic that does not match any rule will be blocked."
msgstr ""
-msgid "NetworkPolicies|Unable to parse policy"
-msgstr ""
-
msgid "NetworkPolicies|all DNS names"
msgstr ""
@@ -22290,6 +22588,9 @@ msgstr ""
msgid "New issue"
msgstr "新議題"
+msgid "New issue in %{project}"
+msgstr ""
+
msgid "New issue title"
msgstr ""
@@ -22368,7 +22669,7 @@ msgstr ""
msgid "Newest first"
msgstr ""
-msgid "Newly registered users will by default be external"
+msgid "Newly-registered users are external by default"
msgstr ""
msgid "Next"
@@ -22683,8 +22984,9 @@ msgstr ""
msgid "No webhooks found, add one in the form above."
msgstr ""
-msgid "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} to renew your subscription."
-msgstr ""
+msgid "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} day to renew your subscription."
+msgid_plural "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} days to renew your subscription."
+msgstr[0] ""
msgid "No. of commits"
msgstr ""
@@ -22701,7 +23003,7 @@ msgstr ""
msgid "Nodes"
msgstr ""
-msgid "Non-admin users can sign in with read-only access and make read-only API requests."
+msgid "Non-admin users are restricted to read-only access, in both GitLab UI and API."
msgstr ""
msgid "None"
@@ -22782,7 +23084,7 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
-msgid "Notes Rate Limits"
+msgid "Notes rate limit"
msgstr ""
msgid "Notes|Are you sure you want to cancel creating this comment?"
@@ -22945,9 +23247,6 @@ msgstr "å一月"
msgid "November"
msgstr "å一月"
-msgid "Novice"
-msgstr ""
-
msgid "Now, personalize your GitLab experience"
msgstr ""
@@ -23116,7 +23415,7 @@ msgstr ""
msgid "OnCallSchedules|For this rotation, on-call will be:"
msgstr ""
-msgid "OnCallSchedules|On-call schedule %{schedule} in Project %{project}"
+msgid "OnCallSchedules|On-call schedule %{obstacle} in Project %{project}"
msgstr ""
msgid "OnCallSchedules|On-call schedules"
@@ -23263,22 +23562,22 @@ msgstr ""
msgid "OnDemandScans|Scanner profile"
msgstr ""
-msgid "OnDemandScans|Select one of the existing profiles"
+msgid "OnDemandScans|Schedule scan"
msgstr ""
-msgid "OnDemandScans|Site profile"
+msgid "OnDemandScans|Select one of the existing profiles"
msgstr ""
-msgid "OnDemandScans|Use existing scanner profile"
+msgid "OnDemandScans|Site profile"
msgstr ""
-msgid "OnDemandScans|Use existing site profile"
+msgid "OnDemandScans|Start time"
msgstr ""
-msgid "OnDemandScans|You can either choose a passive scan or validate the target site in your chosen site profile. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
+msgid "OnDemandScans|Use existing scanner profile"
msgstr ""
-msgid "OnDemandScans|You cannot run an active scan against an unvalidated site."
+msgid "OnDemandScans|Use existing site profile"
msgstr ""
msgid "OnDemandScans|You must create a repository within your project to run an on-demand scan."
@@ -23342,6 +23641,9 @@ msgstr ""
msgid "Only admins can delete project"
msgstr ""
+msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
+msgstr ""
+
msgid "Only include features new to your current subscription tier."
msgstr ""
@@ -23360,6 +23662,12 @@ msgstr ""
msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
+msgid "Only reCAPTCHA v2 is supported:"
+msgstr ""
+
+msgid "Only users from the specified IP address ranges are able to reach this group, including all subgroups, projects, and Git repositories."
+msgstr ""
+
msgid "Only verified users with an email address in any of these domains can be added to the group."
msgstr ""
@@ -23546,9 +23854,6 @@ msgstr "所有者"
msgid "Package Registry"
msgstr ""
-msgid "Package Registry Rate Limits"
-msgstr ""
-
msgid "Package Registry: authenticated API requests"
msgstr ""
@@ -23567,6 +23872,9 @@ msgstr ""
msgid "Package recipe already exists"
msgstr ""
+msgid "Package registry rate limits"
+msgstr ""
+
msgid "Package type"
msgstr ""
@@ -23633,6 +23941,9 @@ msgstr ""
msgid "PackageRegistry|Composer"
msgstr ""
+msgid "PackageRegistry|Composer.json with license: %{license} and version: %{version}"
+msgstr ""
+
msgid "PackageRegistry|Conan"
msgstr ""
@@ -23696,6 +24007,9 @@ msgstr ""
msgid "PackageRegistry|Copy require package include"
msgstr ""
+msgid "PackageRegistry|Copy target SHA"
+msgstr ""
+
msgid "PackageRegistry|Copy yarn command"
msgstr ""
@@ -23762,6 +24076,9 @@ msgstr ""
msgid "PackageRegistry|Install package version"
msgstr ""
+msgid "PackageRegistry|Instance-level"
+msgstr ""
+
msgid "PackageRegistry|Invalid Package: failed metadata extraction"
msgstr ""
@@ -23807,6 +24124,9 @@ msgstr ""
msgid "PackageRegistry|Pip Command"
msgstr ""
+msgid "PackageRegistry|Project-level"
+msgstr ""
+
msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
msgstr ""
@@ -23828,6 +24148,9 @@ msgstr ""
msgid "PackageRegistry|Remove package"
msgstr ""
+msgid "PackageRegistry|Required Python: %{pythonVersion}"
+msgstr ""
+
msgid "PackageRegistry|RubyGems"
msgstr ""
@@ -23870,6 +24193,9 @@ msgstr ""
msgid "PackageRegistry|Source project located at %{link}"
msgstr ""
+msgid "PackageRegistry|Target SHA: %{sha}"
+msgstr ""
+
msgid "PackageRegistry|There are no other versions of this package."
msgstr ""
@@ -24038,6 +24364,18 @@ msgstr ""
msgid "Password was successfully updated. Please sign in again."
msgstr ""
+msgid "PasswordPrompt|Confirm password"
+msgstr ""
+
+msgid "PasswordPrompt|Confirm password to continue"
+msgstr ""
+
+msgid "PasswordPrompt|Password is required"
+msgstr ""
+
+msgid "PasswordPrompt|Please enter your password to confirm"
+msgstr ""
+
msgid "Passwords should be unique and not used for any other sites or services."
msgstr ""
@@ -24065,6 +24403,9 @@ msgstr ""
msgid "Paste project path (i.e. gitlab-org/gitlab)"
msgstr ""
+msgid "Paste this DSN into your Sentry SDK"
+msgstr ""
+
msgid "Paste your public SSH key, which is usually contained in the file '~/.ssh/id_ed25519.pub' or '~/.ssh/id_rsa.pub' and begins with 'ssh-ed25519' or 'ssh-rsa'. Do not paste your private SSH key, as that can compromise your identity."
msgstr ""
@@ -24149,6 +24490,9 @@ msgstr ""
msgid "PerformanceBar|First Contentful Paint"
msgstr ""
+msgid "PerformanceBar|Flamegraph with mode:"
+msgstr ""
+
msgid "PerformanceBar|Frontend resources"
msgstr ""
@@ -24182,6 +24526,15 @@ msgstr ""
msgid "PerformanceBar|Trace"
msgstr ""
+msgid "PerformanceBar|cpu"
+msgstr ""
+
+msgid "PerformanceBar|object"
+msgstr ""
+
+msgid "PerformanceBar|wall"
+msgstr ""
+
msgid "Period in seconds"
msgstr ""
@@ -24410,6 +24763,48 @@ msgstr "目標"
msgid "PipelineSchedules|Variables"
msgstr "變é‡"
+msgid "PipelineSource|API"
+msgstr ""
+
+msgid "PipelineSource|Chat"
+msgstr ""
+
+msgid "PipelineSource|External"
+msgstr ""
+
+msgid "PipelineSource|External Pull Request"
+msgstr ""
+
+msgid "PipelineSource|Merge Request"
+msgstr ""
+
+msgid "PipelineSource|On-Demand DAST Scan"
+msgstr ""
+
+msgid "PipelineSource|On-Demand DAST Validation"
+msgstr ""
+
+msgid "PipelineSource|Parent Pipeline"
+msgstr ""
+
+msgid "PipelineSource|Pipeline"
+msgstr ""
+
+msgid "PipelineSource|Push"
+msgstr ""
+
+msgid "PipelineSource|Schedule"
+msgstr ""
+
+msgid "PipelineSource|Trigger"
+msgstr ""
+
+msgid "PipelineSource|Web"
+msgstr ""
+
+msgid "PipelineSource|Web IDE"
+msgstr ""
+
msgid "PipelineStatusTooltip|Pipeline: %{ciStatus}"
msgstr ""
@@ -24710,46 +25105,7 @@ msgstr ""
msgid "Pipeline|Source"
msgstr ""
-msgid "Pipeline|Source|API"
-msgstr ""
-
-msgid "Pipeline|Source|Chat"
-msgstr ""
-
-msgid "Pipeline|Source|External"
-msgstr ""
-
-msgid "Pipeline|Source|External Pull Request"
-msgstr ""
-
-msgid "Pipeline|Source|Merge Request"
-msgstr ""
-
-msgid "Pipeline|Source|On-Demand DAST Scan"
-msgstr ""
-
-msgid "Pipeline|Source|On-Demand DAST Validation"
-msgstr ""
-
-msgid "Pipeline|Source|Parent Pipeline"
-msgstr ""
-
-msgid "Pipeline|Source|Pipeline"
-msgstr ""
-
-msgid "Pipeline|Source|Push"
-msgstr ""
-
-msgid "Pipeline|Source|Schedule"
-msgstr ""
-
-msgid "Pipeline|Source|Trigger"
-msgstr ""
-
-msgid "Pipeline|Source|Web"
-msgstr ""
-
-msgid "Pipeline|Source|Web IDE"
+msgid "Pipeline|Source|Security Policy"
msgstr ""
msgid "Pipeline|Specify variable values to be used in this run. The values specified in %{linkStart}CI/CD settings%{linkEnd} will be used by default."
@@ -24800,7 +25156,7 @@ msgstr ""
msgid "Pipeline|We are currently unable to fetch pipeline data"
msgstr ""
-msgid "Pipeline|You’re about to stop pipeline %{pipelineId}."
+msgid "Pipeline|You’re about to stop pipeline #%{pipelineId}."
msgstr ""
msgid "Pipeline|for"
@@ -24827,6 +25183,9 @@ msgstr ""
msgid "Plain diff"
msgstr ""
+msgid "Plain-text response to send to clients that hit a rate limit"
+msgstr ""
+
msgid "Plan:"
msgstr ""
@@ -24971,9 +25330,6 @@ msgstr ""
msgid "Please provide attributes to update"
msgstr ""
-msgid "Please provide your username or email address."
-msgstr ""
-
msgid "Please reach out if you have any questions and we'll be happy to assist."
msgstr ""
@@ -25016,9 +25372,6 @@ msgstr ""
msgid "Please set a new password before proceeding."
msgstr ""
-msgid "Please share your feedback about %{featureName} %{linkStart}in this issue%{linkEnd} to help us improve the experience."
-msgstr ""
-
msgid "Please solve the captcha"
msgstr ""
@@ -25196,6 +25549,9 @@ msgstr ""
msgid "Prevent adding new members to project membership within this group"
msgstr ""
+msgid "Prevent auto-stopping"
+msgstr ""
+
msgid "Prevent editing approval rules in projects and merge requests."
msgstr ""
@@ -25208,7 +25564,7 @@ msgstr ""
msgid "Prevent users from changing their profile name"
msgstr ""
-msgid "Prevent users from performing write operations on GitLab while performing maintenance."
+msgid "Prevent users from performing write operations while GitLab maintenance is in progress."
msgstr ""
msgid "Preview"
@@ -25481,6 +25837,9 @@ msgstr ""
msgid "Profiles|Enter your name, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Enter your password to confirm the email change"
+msgstr ""
+
msgid "Profiles|Enter your pronouns to let people know how to refer to you"
msgstr ""
@@ -25715,10 +26074,10 @@ msgstr ""
msgid "Profiles|e.g. My MacBook key"
msgstr ""
-msgid "Profiles|username"
+msgid "Profiles|https://website.com"
msgstr ""
-msgid "Profiles|website.com"
+msgid "Profiles|username"
msgstr ""
msgid "Profiles|your account"
@@ -25961,9 +26320,21 @@ msgstr ""
msgid "ProjectSelect| or group"
msgstr ""
+msgid "ProjectSelect|No matching results"
+msgstr ""
+
msgid "ProjectSelect|Search for project"
msgstr ""
+msgid "ProjectSelect|Search projects"
+msgstr ""
+
+msgid "ProjectSelect|Select a project"
+msgstr ""
+
+msgid "ProjectSelect|There was an error fetching the projects. Please try again."
+msgstr ""
+
msgid "ProjectService|Drone server URL"
msgstr ""
@@ -26051,6 +26422,9 @@ msgstr ""
msgid "ProjectService|Trigger event when a new, unique alert is recorded."
msgstr ""
+msgid "ProjectService|Trigger event when a new, unique vulnerability is recorded. (Note: This feature requires an Ultimate plan.)"
+msgstr ""
+
msgid "ProjectService|Trigger event when a pipeline status changes."
msgstr ""
@@ -26465,9 +26839,15 @@ msgstr ""
msgid "Projects are graded based on the highest severity vulnerability present"
msgstr ""
+msgid "Projects are organized into groups"
+msgstr ""
+
msgid "Projects contributed to"
msgstr ""
+msgid "Projects help you organize your work. They contain your file repository, issues, merge requests, and so much more."
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr ""
@@ -26702,10 +27082,10 @@ msgstr ""
msgid "PrometheusService|Prometheus cluster integration"
msgstr ""
-msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
+msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
msgstr ""
-msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
+msgid "PrometheusService|The ID of the IAP-secured resource."
msgstr ""
msgid "PrometheusService|The Prometheus API base URL."
@@ -27323,6 +27703,9 @@ msgstr ""
msgid "Rate limit"
msgstr ""
+msgid "Rate limits can help reduce request volume (like from crawlers or abusive bots)."
+msgstr ""
+
msgid "Raw blob request rate limit per minute"
msgstr ""
@@ -27335,6 +27718,9 @@ msgstr ""
msgid "Re-authentication required"
msgstr ""
+msgid "Re-import"
+msgstr ""
+
msgid "Re-request review"
msgstr ""
@@ -27356,6 +27742,9 @@ msgstr ""
msgid "Read more about related issues"
msgstr ""
+msgid "Read their documentation."
+msgstr ""
+
msgid "Ready to get started with GitLab? Follow these steps to set up your workspace, plan and commit changes, and deploy your project."
msgstr ""
@@ -27389,6 +27778,9 @@ msgstr ""
msgid "Receive any notifications from GitLab."
msgstr ""
+msgid "Receive notification of abuse reports by email."
+msgstr ""
+
msgid "Receive notifications about your own activity"
msgstr ""
@@ -27531,9 +27923,6 @@ msgstr ""
msgid "Registry setup"
msgstr ""
-msgid "Regulate approvals by authors/committers. Affects all projects."
-msgstr ""
-
msgid "Reindexing Status: %{status} (Slice multiplier: %{multiplier}, Maximum running slices: %{max_slices})"
msgstr ""
@@ -27628,6 +28017,9 @@ msgstr ""
msgid "Release|Something went wrong while saving the release details."
msgstr ""
+msgid "Reload page"
+msgstr ""
+
msgid "Remediations"
msgstr ""
@@ -27910,6 +28302,9 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
+msgid "Repeats"
+msgstr ""
+
msgid "Replace"
msgstr "å–代"
@@ -28268,10 +28663,7 @@ msgstr ""
msgid "Require additional authentication for administrative tasks."
msgstr ""
-msgid "Require all users in this group to setup Two-factor authentication"
-msgstr ""
-
-msgid "Require all users in this group to setup two-factor authentication"
+msgid "Require all users in this group to set up two-factor authentication"
msgstr ""
msgid "Required approvals (%{approvals_given} given)"
@@ -28315,6 +28707,9 @@ msgstr[0] "éœ€è¦ %d 個批准。"
msgid "Requires values to meet regular expression requirements."
msgstr ""
+msgid "Requires you to deploy or set up cloud-hosted Sentry."
+msgstr ""
+
msgid "Requires your primary GitLab email address."
msgstr ""
@@ -28375,9 +28770,6 @@ msgstr ""
msgid "Resolve"
msgstr ""
-msgid "Resolve all threads in new issue"
-msgstr ""
-
msgid "Resolve conflicts"
msgstr ""
@@ -28435,6 +28827,9 @@ msgstr ""
msgid "Response text"
msgstr ""
+msgid "Restart GitLab to apply changes."
+msgstr ""
+
msgid "Restart Terminal"
msgstr ""
@@ -28453,6 +28848,9 @@ msgstr ""
msgid "Restoring the project will prevent the project from being removed on this date and restore people's ability to make changes to it."
msgstr ""
+msgid "Restrict group access by IP address. %{link_start}Learn more%{link_end}."
+msgstr ""
+
msgid "Restrict membership by email domain"
msgstr ""
@@ -28764,6 +29162,9 @@ msgstr ""
msgid "Runners|Runner #%{runner_id}"
msgstr ""
+msgid "Runners|Runner assigned to project."
+msgstr ""
+
msgid "Runners|Runner is offline, last contact was %{runner_contact} ago"
msgstr ""
@@ -28776,6 +29177,9 @@ msgstr ""
msgid "Runners|Runner registration"
msgstr ""
+msgid "Runners|Runner unassigned from project."
+msgstr ""
+
msgid "Runners|Runners"
msgstr ""
@@ -28968,7 +29372,7 @@ msgstr ""
msgid "SastEntryPoints|How do I set up SAST?"
msgstr ""
-msgid "SastEntryPoints|Learn more."
+msgid "SastEntryPoints|Learn more"
msgstr ""
msgid "Satisfied"
@@ -29010,7 +29414,7 @@ msgstr ""
msgid "Save pipeline schedule"
msgstr "ä¿å­˜æµæ°´ç·šè¨ˆåŠƒ"
-msgid "Save space and find images in the container Registry. remove unneeded tags and keep only the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
+msgid "Save storage space by automatically deleting tags from the container registry and keeping the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
msgstr ""
msgid "Saving"
@@ -29184,6 +29588,9 @@ msgstr ""
msgid "Search or filter results…"
msgstr ""
+msgid "Search or jump to..."
+msgstr ""
+
msgid "Search project"
msgstr ""
@@ -29244,16 +29651,16 @@ msgstr ""
msgid "SearchCodeResults|of %{link_to_project}"
msgstr ""
-msgid "SearchResults|Showing %{count} %{scope} for%{term_element}"
+msgid "SearchResults|Showing %{count} %{scope} for %{term_element}"
msgstr ""
-msgid "SearchResults|Showing %{count} %{scope} for%{term_element} in your personal and project snippets"
+msgid "SearchResults|Showing %{count} %{scope} for %{term_element} in your personal and project snippets"
msgstr ""
-msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for%{term_element}"
+msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for %{term_element}"
msgstr ""
-msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for%{term_element} in your personal and project snippets"
+msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for %{term_element} in your personal and project snippets"
msgstr ""
msgid "SearchResults|code result"
@@ -29324,6 +29731,9 @@ msgstr ""
msgid "Secret Detection"
msgstr ""
+msgid "Secret access key"
+msgstr ""
+
msgid "Secret token"
msgstr ""
@@ -29363,9 +29773,6 @@ msgstr ""
msgid "SecurityApprovals|A merge request approval is required when the license compliance report contains a denied license."
msgstr ""
-msgid "SecurityApprovals|Configurable if security scanners are enabled. %{linkStart}Learn more.%{linkEnd}"
-msgstr ""
-
msgid "SecurityApprovals|Coverage-Check"
msgstr ""
@@ -29378,24 +29785,18 @@ msgstr ""
msgid "SecurityApprovals|Learn more about Vulnerability-Check"
msgstr ""
-msgid "SecurityApprovals|License Scanning must be enabled. %{linkStart}Learn more%{linkEnd}."
-msgstr ""
-
msgid "SecurityApprovals|License-Check"
msgstr ""
msgid "SecurityApprovals|Requires approval for Denied licenses. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}More information%{linkEnd}"
+msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "SecurityApprovals|Requires approval for vulnerabilities. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
-msgid "SecurityApprovals|Test coverage must be enabled. %{linkStart}Learn more%{linkEnd}."
-msgstr ""
-
msgid "SecurityApprovals|Vulnerability-Check"
msgstr ""
@@ -29459,6 +29860,12 @@ msgstr ""
msgid "SecurityConfiguration|Immediately begin risk analysis and remediation with application security features. Start with SAST and Secret Detection, available to all plans. Upgrade to Ultimate to get all features, including:"
msgstr ""
+msgid "SecurityConfiguration|Manage corpus"
+msgstr ""
+
+msgid "SecurityConfiguration|Manage corpus files used as mutation sources in coverage fuzzing."
+msgstr ""
+
msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
msgstr ""
@@ -29513,6 +29920,12 @@ msgstr ""
msgid "SecurityOrchestration|Action"
msgstr ""
+msgid "SecurityOrchestration|Actions"
+msgstr ""
+
+msgid "SecurityOrchestration|Add rule"
+msgstr ""
+
msgid "SecurityOrchestration|All policies"
msgstr ""
@@ -29546,9 +29959,6 @@ msgstr ""
msgid "SecurityOrchestration|Network"
msgstr ""
-msgid "SecurityOrchestration|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
-msgstr ""
-
msgid "SecurityOrchestration|New policy"
msgstr ""
@@ -29564,6 +29974,9 @@ msgstr ""
msgid "SecurityOrchestration|Policy editor"
msgstr ""
+msgid "SecurityOrchestration|Policy preview"
+msgstr ""
+
msgid "SecurityOrchestration|Policy status"
msgstr ""
@@ -29573,6 +29986,9 @@ msgstr ""
msgid "SecurityOrchestration|Rule"
msgstr ""
+msgid "SecurityOrchestration|Rules"
+msgstr ""
+
msgid "SecurityOrchestration|Scan Execution"
msgstr ""
@@ -29666,6 +30082,9 @@ msgstr ""
msgid "SecurityReports|Create issue"
msgstr ""
+msgid "SecurityReports|Development vulnerabilities"
+msgstr ""
+
msgid "SecurityReports|Dismiss vulnerability"
msgstr ""
@@ -29681,6 +30100,9 @@ msgstr ""
msgid "SecurityReports|Download results"
msgstr ""
+msgid "SecurityReports|Download scanned URLs"
+msgstr ""
+
msgid "SecurityReports|Download scanned resources"
msgstr ""
@@ -29804,6 +30226,9 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
+msgid "SecurityReports|The Vulnerability Report shows the results of the lastest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "SecurityReports|The security reports below contain one or more vulnerability findings that could not be parsed and were not recorded. Download the artifacts in the job output to investigate. Ensure any security report created conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
msgstr ""
@@ -29945,10 +30370,10 @@ msgstr ""
msgid "Select a repository"
msgstr ""
-msgid "Select a role"
+msgid "Select a repository containing templates for common files."
msgstr ""
-msgid "Select a shared template repository for all projects on this instance."
+msgid "Select a role"
msgstr ""
msgid "Select a template repository"
@@ -30026,6 +30451,9 @@ msgstr ""
msgid "Select project to choose zone"
msgstr ""
+msgid "Select project to create issue"
+msgstr ""
+
msgid "Select projects"
msgstr ""
@@ -30143,6 +30571,9 @@ msgstr ""
msgid "Send emails to help guide new users through the onboarding process."
msgstr ""
+msgid "Send emails to users upon account deactivation."
+msgstr ""
+
msgid "Send message"
msgstr ""
@@ -30161,6 +30592,9 @@ msgstr ""
msgid "Send service data"
msgstr ""
+msgid "Sentry"
+msgstr ""
+
msgid "Sentry API URL"
msgstr ""
@@ -30275,6 +30709,9 @@ msgstr ""
msgid "Service"
msgstr ""
+msgid "Service Accounts keys are required to authorize GitLab to deploy your Google Cloud project."
+msgstr ""
+
msgid "Service Desk"
msgstr ""
@@ -30347,15 +30784,15 @@ msgstr ""
msgid "Set a password on your account to pull or push via %{protocol}."
msgstr "為賬號添加壹個用於推é€æˆ–拉å–çš„ %{protocol} 密碼。"
-msgid "Set a template repository for projects in this group"
-msgstr ""
-
msgid "Set access permissions for this token."
msgstr ""
msgid "Set an instance-wide domain that will be available to all clusters when installing Knative."
msgstr ""
+msgid "Set any rate limit to %{code_open}0%{code_close} to disable the limit."
+msgstr ""
+
msgid "Set default and restrict visibility levels. Configure import sources and git access protocol."
msgstr ""
@@ -30368,7 +30805,7 @@ msgstr ""
msgid "Set limit to 0 to allow any file size."
msgstr ""
-msgid "Set max session time for web terminal."
+msgid "Set limits for web and API requests."
msgstr ""
msgid "Set milestone"
@@ -30377,15 +30814,18 @@ msgstr ""
msgid "Set new password"
msgstr ""
-msgid "Set notification email for abuse reports."
+msgid "Set parent epic to an epic"
msgstr ""
-msgid "Set parent epic to an epic"
+msgid "Set per-user rate limits for imports and exports of projects and groups."
msgstr ""
msgid "Set projects and maximum size limits, session duration, user options, and check feature availability for namespace plan."
msgstr ""
+msgid "Set rate limits for package registry API requests that supersede the general user and IP rate limits."
+msgstr ""
+
msgid "Set severity"
msgstr ""
@@ -30404,15 +30844,24 @@ msgstr ""
msgid "Set the default branch for this project. All merge requests and commits are made against this branch unless you specify a different one."
msgstr ""
+msgid "Set the default expiration time for job artifacts in all projects. Set to %{code_open}0%{code_close} to never expire artifacts by default. If no unit is written, it defaults to seconds. For example, these are all equivalent: %{code_open}3600%{code_close}, %{code_open}60 minutes%{code_close}, or %{code_open}one hour%{code_close}."
+msgstr ""
+
msgid "Set the due date to %{due_date}."
msgstr ""
msgid "Set the iteration to %{iteration_reference}."
msgstr ""
+msgid "Set the maximum session time for a web terminal."
+msgstr ""
+
msgid "Set the milestone to %{milestone_reference}."
msgstr ""
+msgid "Set the per-user rate limit for notes created by web or API requests."
+msgstr ""
+
msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
msgstr ""
@@ -30614,6 +31063,9 @@ msgstr ""
msgid "Show Pipeline IID"
msgstr ""
+msgid "Show all %{issuable_type}."
+msgstr ""
+
msgid "Show all activity"
msgstr "顯示所有活動"
@@ -30665,15 +31117,9 @@ msgstr ""
msgid "Show list"
msgstr ""
-msgid "Show me advanced features"
-msgstr ""
-
msgid "Show me how to add a pipeline"
msgstr ""
-msgid "Show me the basics"
-msgstr ""
-
msgid "Show one file at a time"
msgstr ""
@@ -30712,15 +31158,15 @@ msgstr ""
msgid "Showing %{pageSize} of %{total} %{issuableType}"
msgstr ""
-msgid "Showing %{pageSize} of %{total} issues"
-msgstr ""
-
msgid "Showing all epics"
msgstr ""
msgid "Showing all issues"
msgstr ""
+msgid "Showing data for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
+msgstr ""
+
msgid "Showing data for workflow items created in this date range. Date range cannot exceed %{maxDateRange} days."
msgstr ""
@@ -30760,6 +31206,15 @@ msgstr ""
msgid "Sidebar|Weight"
msgstr "權é‡"
+msgid "Sidekiq job compression threshold (bytes)"
+msgstr ""
+
+msgid "Sidekiq job size limit (bytes)"
+msgstr ""
+
+msgid "Sidekiq job size limits"
+msgstr ""
+
msgid "Sign in"
msgstr ""
@@ -30880,6 +31335,9 @@ msgstr ""
msgid "Site profile not found for given parameters"
msgstr ""
+msgid "Sites"
+msgstr ""
+
msgid "Size"
msgstr ""
@@ -30910,19 +31368,22 @@ msgstr ""
msgid "SlackIntegration|Sends notifications about project events to Slack channels."
msgstr ""
-msgid "SlackService|2. Paste the %{strong_open}Token%{strong_close} into the field below"
+msgid "SlackService|1. %{slash_command_link_start}Add a slash command%{slash_command_link_end} in your Slack team using this information:"
msgstr ""
-msgid "SlackService|3. Select the %{strong_open}Active%{strong_close} checkbox, press %{strong_open}Save changes%{strong_close} and start using GitLab inside Slack!"
+msgid "SlackService|2. Paste the token from Slack in the %{strong_open}Token%{strong_close} field below."
msgstr ""
-msgid "SlackService|Fill in the word that works best for your team."
+msgid "SlackService|3. Select the %{strong_open}Active%{strong_close} checkbox, select %{strong_open}Save changes%{strong_close}, and start using slash commands in Slack!"
+msgstr ""
+
+msgid "SlackService|After setup, get a list of available Slack slash commands by entering"
msgstr ""
-msgid "SlackService|See list of available commands in Slack after setting up this service, by entering"
+msgid "SlackService|Fill in the word that works best for your team."
msgstr ""
-msgid "SlackService|This service allows users to perform common operations on this project by entering slash commands in Slack."
+msgid "SlackService|Perform common operations in this project by entering slash commands in Slack."
msgstr ""
msgid "Slice multiplier"
@@ -30988,7 +31449,7 @@ msgstr ""
msgid "Some child epics may be hidden due to applied filters"
msgstr ""
-msgid "Some common domains are not allowed. %{read_more_link}."
+msgid "Some common domains are not allowed. %{learn_more_link}."
msgstr ""
msgid "Some of the designs you tried uploading did not change:"
@@ -31072,9 +31533,6 @@ msgstr ""
msgid "Something went wrong while exporting requirements"
msgstr ""
-msgid "Something went wrong while fetching %{listType} list"
-msgstr ""
-
msgid "Something went wrong while fetching branches"
msgstr ""
@@ -31129,15 +31587,9 @@ msgstr ""
msgid "Something went wrong while merging this merge request. Please try again."
msgstr ""
-msgid "Something went wrong while moving issues."
-msgstr ""
-
msgid "Something went wrong while obtaining the Let's Encrypt certificate."
msgstr ""
-msgid "Something went wrong while performing the action."
-msgstr ""
-
msgid "Something went wrong while promoting the issue to an epic. Please try again."
msgstr ""
@@ -31465,7 +31917,10 @@ msgstr ""
msgid "SourcegraphPreferences|Uses a custom %{linkStart}Sourcegraph instance%{linkEnd}."
msgstr ""
-msgid "Spam Check API Key"
+msgid "Spam Check"
+msgstr ""
+
+msgid "Spam Check API key"
msgstr ""
msgid "Spam Logs"
@@ -31483,7 +31938,7 @@ msgstr ""
msgid "Specified URL cannot be used: \"%{reason}\""
msgstr ""
-msgid "Specify an e-mail address regex pattern to identify default internal users."
+msgid "Specify an email address regex pattern to identify default internal users."
msgstr ""
msgid "Speed up your pipelines with Needs relationships"
@@ -31738,7 +32193,7 @@ msgstr ""
msgid "StatusCheck|An error occurred fetching the status checks."
msgstr ""
-msgid "StatusCheck|Apply this status check to any branch or a specific protected branch."
+msgid "StatusCheck|Apply this status check to all branches or a specific protected branch."
msgstr ""
msgid "StatusCheck|Check for a status response in Merge Requests. Failures do not block merges. %{link_start}Learn more%{link_end}."
@@ -32077,6 +32532,9 @@ msgstr ""
msgid "Subscriptions"
msgstr ""
+msgid "Subscription|Your subscription for %{strong}%{namespace_name}%{strong_close} has expired and you are now on %{pricing_link_start}the GitLab Free tier%{pricing_link_end}. Don't worry, your data is safe. Get in touch with our support team (%{support_email}). They'll gladly help with your subscription renewal."
+msgstr ""
+
msgid "Subtracted"
msgstr ""
@@ -32305,6 +32763,9 @@ msgstr ""
msgid "SuperSonics|Plan"
msgstr ""
+msgid "SuperSonics|Please agree to the Subscription Agreement"
+msgstr ""
+
msgid "SuperSonics|Ready to get started? A GitLab plan is ideal for scaling organizations and for multi team usage."
msgstr ""
@@ -32335,6 +32796,9 @@ msgstr ""
msgid "SuperSonics|The activation code is not valid. Please make sure to copy it exactly from the Customers Portal or confirmation email. Learn more about %{linkStart}activating your subscription%{linkEnd}."
msgstr ""
+msgid "SuperSonics|The activation code should be a 24-character alphanumeric string"
+msgstr ""
+
msgid "SuperSonics|There is a connectivity issue."
msgstr ""
@@ -32377,9 +32841,15 @@ msgstr ""
msgid "SuperSonics|You do not have an active subscription"
msgstr ""
+msgid "SuperSonics|You have successfully added a license that activates on %{date}. Please see the subscription history table below for more details."
+msgstr ""
+
msgid "SuperSonics|You'll be charged for %{trueUpLinkStart}users over license%{trueUpLinkEnd} on a quarterly or annual basis, depending on the terms of your agreement."
msgstr ""
+msgid "SuperSonics|Your future dated license was successfully added"
+msgstr ""
+
msgid "SuperSonics|Your subscription"
msgstr ""
@@ -32632,7 +33102,7 @@ msgstr ""
msgid "Template to append to all Service Desk issues"
msgstr ""
-msgid "TemplateRepository|Select a repository to make its templates available to all projects. %{link_start}What should the repository contain?%{link_end} "
+msgid "TemplateRepository|Create common files more quickly, and standardize their format."
msgstr ""
msgid "Templates"
@@ -32834,7 +33304,7 @@ msgstr ""
msgid "TestCases|Search test cases"
msgstr ""
-msgid "TestCases|Something went wrong while adding test case to Todo."
+msgid "TestCases|Something went wrong while adding test case to a to-do item."
msgstr ""
msgid "TestCases|Something went wrong while creating a test case."
@@ -32846,7 +33316,7 @@ msgstr ""
msgid "TestCases|Something went wrong while fetching test cases list."
msgstr ""
-msgid "TestCases|Something went wrong while marking test case todo as done."
+msgid "TestCases|Something went wrong while marking test case to-do item as done."
msgstr ""
msgid "TestCases|Something went wrong while moving test case."
@@ -32966,7 +33436,7 @@ msgstr ""
msgid "Thanks for your purchase!"
msgstr ""
-msgid "That is ok, I do not want to renew"
+msgid "That's OK, I don't want to renew"
msgstr ""
msgid "That's it, well done!"
@@ -32988,7 +33458,7 @@ msgid "The %{type} contains the following error:"
msgid_plural "The %{type} contains the following errors:"
msgstr[0] ""
-msgid "The API key used by GitLab for accessing the Spam Check service endpoint"
+msgid "The API key used by GitLab for accessing the Spam Check service endpoint."
msgstr ""
msgid "The GitLab subscription service (customers.gitlab.com) is currently experiencing an outage. You can monitor the status and get updates at %{linkStart}status.gitlab.com%{linkEnd}."
@@ -33027,9 +33497,6 @@ msgstr ""
msgid "The URL to use for connecting to Elasticsearch. Use a comma-separated list to support clustering (e.g., \"http://localhost:9200, http://localhost:9201\")."
msgstr ""
-msgid "The Vulnerability Report shows the results of the last successful pipeline run on the default branch."
-msgstr ""
-
msgid "The X509 Certificate to use when mutual TLS is required to communicate with the external authorization service. If left blank, the server certificate is still validated when accessing over HTTPS."
msgstr ""
@@ -33087,9 +33554,6 @@ msgstr ""
msgid "The default branch for this project has been changed. Please update your bookmarks."
msgstr ""
-msgid "The default expiration time for job artifacts. 0 for unlimited. The default unit is in seconds, but you can use other units, for example %{code_open}4 mins 2 sec%{code_close}, %{code_open}2h42min%{code_close}."
-msgstr ""
-
msgid "The dependency list details information about the components used within your project."
msgstr ""
@@ -33280,9 +33744,6 @@ msgstr ""
msgid "The merge conflicts for this merge request have already been resolved. Please return to the merge request."
msgstr ""
-msgid "The merge request can now be merged."
-msgstr ""
-
msgid "The metric must be one of %{metrics}."
msgstr ""
@@ -33658,7 +34119,7 @@ msgstr ""
msgid "There was a problem updating the keep latest artifacts setting."
msgstr ""
-msgid "There was an error %{message} todo."
+msgid "There was an error %{message} to-do item."
msgstr ""
msgid "There was an error adding a To Do."
@@ -33697,6 +34158,9 @@ msgstr ""
msgid "There was an error fetching projects"
msgstr ""
+msgid "There was an error fetching search autocomplete suggestions"
+msgstr ""
+
msgid "There was an error fetching stage total counts"
msgstr ""
@@ -34021,6 +34485,9 @@ msgstr ""
msgid "This field is required."
msgstr ""
+msgid "This form is disabled in preview"
+msgstr ""
+
msgid "This group"
msgstr ""
@@ -34042,9 +34509,6 @@ msgstr ""
msgid "This group is linked to a subscription"
msgstr ""
-msgid "This group, including all subgroups, projects and git repositories, will be reachable from only the specified IP address ranges."
-msgstr ""
-
msgid "This group, its subgroups and projects has been scheduled for removal on %{date}."
msgstr ""
@@ -34324,9 +34788,6 @@ msgstr ""
msgid "This user cannot be unlocked manually from GitLab"
msgstr ""
-msgid "This user does not have a pending request"
-msgstr ""
-
msgid "This user has an unconfirmed email address (%{email}). You may force a confirmation."
msgstr ""
@@ -34435,9 +34896,6 @@ msgstr ""
msgid "ThreatMonitoring|Packet Activity"
msgstr ""
-msgid "ThreatMonitoring|Policies"
-msgstr ""
-
msgid "ThreatMonitoring|Requests"
msgstr ""
@@ -34489,6 +34947,12 @@ msgstr ""
msgid "ThreatMonitoring|View documentation"
msgstr ""
+msgid "Threshold in bytes at which to compress Sidekiq job arguments."
+msgstr ""
+
+msgid "Threshold in bytes at which to reject Sidekiq jobs. Set this to 0 to if you don't want to limit Sidekiq jobs."
+msgstr ""
+
msgid "Throughput"
msgstr ""
@@ -34498,6 +34962,9 @@ msgstr ""
msgid "Time"
msgstr ""
+msgid "Time (in hours) that users are allowed to skip forced configuration of two-factor authentication."
+msgstr ""
+
msgid "Time Spent"
msgstr ""
@@ -34564,7 +35031,7 @@ msgstr ""
msgid "TimeTrackingEstimated|Est"
msgstr "é ä¼°"
-msgid "TimeTracking|%{startTag}Spent: %{endTag}%{timeSpentHumanReadable}"
+msgid "TimeTracking|%{spentStart}Spent: %{spentEnd}"
msgstr ""
msgid "TimeTracking|Estimated:"
@@ -34776,6 +35243,9 @@ msgstr ""
msgid "To access this domain create a new DNS record"
msgstr ""
+msgid "To add a custom suffix, set up a Service Desk email address. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "To add an SSH key you need to %{generate_link_start}generate one%{link_end} or use an %{existing_link_start}existing key%{link_end}."
msgstr ""
@@ -34797,13 +35267,16 @@ msgstr ""
msgid "To connect an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To continue using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
+msgstr ""
+
msgid "To continue, you need to select the link in the confirmation email we sent to verify your email address. If you didn't get our email, select %{strongStart}Resend confirmation email.%{strongEnd}"
msgstr ""
msgid "To define internal users, first enable new users set to external"
msgstr ""
-msgid "To enable Registration Features, make sure \"Enable service ping\" is checked."
+msgid "To enable Registration Features, first enable Service Ping."
msgstr ""
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
@@ -34830,7 +35303,7 @@ msgstr ""
msgid "To get started, use the link below to confirm your account."
msgstr ""
-msgid "To help improve GitLab and its user experience, GitLab will periodically collect usage information."
+msgid "To help improve GitLab and its user experience, GitLab periodically collects usage information."
msgstr ""
msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
@@ -34863,7 +35336,7 @@ msgstr ""
msgid "To preserve performance only %{strong_open}%{display_size} of %{real_size}%{strong_close} files are displayed."
msgstr ""
-msgid "To protect this issue's confidentiality, %{forkLink} and set the fork's visibility to private."
+msgid "To protect this issue's confidentiality, %{linkStart}fork this project%{linkEnd} and set the fork's visibility to private."
msgstr ""
msgid "To protect this issue's confidentiality, a private fork of this project was selected."
@@ -34896,12 +35369,15 @@ msgstr ""
msgid "To set up SAML authentication for your group through an identity provider like Azure, Okta, Onelogin, Ping Identity, or your custom SAML 2.0 provider:"
msgstr ""
-msgid "To set up this service:"
+msgid "To set up this integration:"
msgstr ""
msgid "To specify the notification level per project of a group you belong to, you need to visit project page and change notification level there."
msgstr ""
+msgid "To start using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
+msgstr ""
+
msgid "To unsubscribe from this issue, please paste the following link into your browser:"
msgstr ""
@@ -35488,9 +35964,6 @@ msgstr ""
msgid "Unable to fetch branches list, please close the form and try again"
msgstr ""
-msgid "Unable to fetch unscanned projects"
-msgstr ""
-
msgid "Unable to fetch vulnerable projects"
msgstr ""
@@ -35545,6 +36018,15 @@ msgstr ""
msgid "Unable to update this issue at this time."
msgstr ""
+msgid "Unapprove a merge request"
+msgstr ""
+
+msgid "Unapprove the current merge request."
+msgstr ""
+
+msgid "Unapproved the current merge request."
+msgstr ""
+
msgid "Unarchive project"
msgstr ""
@@ -35557,16 +36039,13 @@ msgstr ""
msgid "Unassigned"
msgstr ""
-msgid "Unauthenticated API request rate limit"
-msgstr ""
-
-msgid "Unauthenticated rate limit period in seconds"
+msgid "Unauthenticated API rate limit period in seconds"
msgstr ""
-msgid "Unauthenticated request rate limit"
+msgid "Unauthenticated requests"
msgstr ""
-msgid "Unauthenticated requests"
+msgid "Unauthenticated web rate limit period in seconds"
msgstr ""
msgid "Undo"
@@ -35668,18 +36147,6 @@ msgstr ""
msgid "Unresolved"
msgstr ""
-msgid "UnscannedProjects|15 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|30 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|5 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|60 or more days"
-msgstr ""
-
msgid "Unschedule job"
msgstr ""
@@ -35899,6 +36366,9 @@ msgstr ""
msgid "UsageQuota|%{help_link_start}Shared runners%{help_link_end} are disabled, so there are no limits set on pipeline usage"
msgstr ""
+msgid "UsageQuota|%{linkTitle} help link"
+msgstr ""
+
msgid "UsageQuota|%{percentageLeft} of purchased storage is available"
msgstr ""
@@ -35908,6 +36378,9 @@ msgstr ""
msgid "UsageQuota|Artifacts is a sum of build and pipeline artifacts."
msgstr ""
+msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
+msgstr ""
+
msgid "UsageQuota|Buy additional minutes"
msgstr ""
@@ -35917,9 +36390,21 @@ msgstr ""
msgid "UsageQuota|CI minutes usage by project"
msgstr ""
+msgid "UsageQuota|Code packages and container images."
+msgstr ""
+
msgid "UsageQuota|Current period usage"
msgstr ""
+msgid "UsageQuota|File attachments and smaller design graphics."
+msgstr ""
+
+msgid "UsageQuota|Git repository, managed by the Gitaly service."
+msgstr ""
+
+msgid "UsageQuota|Includes project registry, artifacts, packages, wiki, uploads and other items."
+msgstr ""
+
msgid "UsageQuota|Increase storage temporarily"
msgstr ""
@@ -35938,6 +36423,9 @@ msgstr ""
msgid "UsageQuota|Packages"
msgstr ""
+msgid "UsageQuota|Pipeline artifacts and job artifacts, created with CI/CD."
+msgstr ""
+
msgid "UsageQuota|Pipelines"
msgstr ""
@@ -35956,6 +36444,9 @@ msgstr ""
msgid "UsageQuota|Seats"
msgstr ""
+msgid "UsageQuota|Shared bits of code and text."
+msgstr ""
+
msgid "UsageQuota|Snippets"
msgstr ""
@@ -35965,6 +36456,12 @@ msgstr ""
msgid "UsageQuota|Storage"
msgstr ""
+msgid "UsageQuota|Storage type"
+msgstr ""
+
+msgid "UsageQuota|There is a known issue with Artifact storage where the total could be incorrect for some projects. More details and progress are available in %{warningLinkStart}the epic%{warningLinkEnd}."
+msgstr ""
+
msgid "UsageQuota|This is the total amount of storage used across your projects within this namespace."
msgstr ""
@@ -36004,6 +36501,9 @@ msgstr ""
msgid "UsageQuota|Usage"
msgstr ""
+msgid "UsageQuota|Usage Breakdown"
+msgstr ""
+
msgid "UsageQuota|Usage Quotas"
msgstr ""
@@ -36028,6 +36528,9 @@ msgstr ""
msgid "UsageQuota|Wiki"
msgstr ""
+msgid "UsageQuota|Wiki content."
+msgstr ""
+
msgid "UsageQuota|Wikis"
msgstr ""
@@ -36244,7 +36747,10 @@ msgstr ""
msgid "User Settings"
msgstr ""
-msgid "User and IP Rate Limits"
+msgid "User and IP rate limits"
+msgstr ""
+
+msgid "User does not have a pending request"
msgstr ""
msgid "User identity was successfully created."
@@ -36541,6 +37047,9 @@ msgstr ""
msgid "Users can launch a development environment from a GitLab browser tab when the %{linkStart}Gitpod%{linkEnd} integration is enabled."
msgstr ""
+msgid "Users can reactivate their account by signing in."
+msgstr ""
+
msgid "Users can render diagrams in AsciiDoc, Markdown, reStructuredText, and Textile documents using Kroki."
msgstr ""
@@ -36556,6 +37065,9 @@ msgstr ""
msgid "Users requesting access to"
msgstr ""
+msgid "Users to exclude from the rate limit"
+msgstr ""
+
msgid "Users were successfully added."
msgstr ""
@@ -36577,6 +37089,9 @@ msgstr ""
msgid "UsersSelect|Unassigned"
msgstr ""
+msgid "Uses GitLab as a lightweight alternative to Sentry."
+msgstr ""
+
msgid "Using %{code_start}::%{code_end} denotes a %{link_start}scoped label set%{link_end}"
msgstr ""
@@ -36607,10 +37122,7 @@ msgstr ""
msgid "Value Stream Analytics can help you determine your team’s velocity"
msgstr ""
-msgid "Value Stream Analytics gives an overview of how much time it takes to go from idea to production in your project."
-msgstr ""
-
-msgid "Value may contain a variable reference"
+msgid "Value might contain a variable reference"
msgstr ""
msgid "Value stream"
@@ -36676,10 +37188,10 @@ msgstr ""
msgid "ValueStream|The Default Value Stream cannot be deleted"
msgstr ""
-msgid "Variable"
+msgid "Values that contain the %{codeStart}$%{codeEnd} character can be considered a variable reference and expanded. %{docsLinkStart}Learn more.%{docsLinkEnd}"
msgstr ""
-msgid "Variable references indicated by %{codeStart}$%{codeEnd} may be expanded. If this is not what you want, consider %{docsLinkStart}using a workaround to prevent expansion%{docsLinkEnd}."
+msgid "Variable"
msgstr ""
msgid "Variable will be masked in job logs."
@@ -37081,6 +37593,9 @@ msgstr ""
msgid "Vulnerability|Evidence"
msgstr ""
+msgid "Vulnerability|False positive detected"
+msgstr ""
+
msgid "Vulnerability|File"
msgstr ""
@@ -37123,6 +37638,9 @@ msgstr ""
msgid "Vulnerability|Status"
msgstr ""
+msgid "Vulnerability|The scanner determined this vulnerability to be a false positive. Verify the evaluation before changing its status. %{linkStart}Learn more about false positive detection.%{linkEnd}"
+msgstr ""
+
msgid "Vulnerability|The unmodified response is the original response that had no mutations done to the request"
msgstr ""
@@ -37447,9 +37965,6 @@ msgstr ""
msgid "Welcome to GitLab,%{br_tag}%{name}!"
msgstr ""
-msgid "Welcome to the guided GitLab tour"
-msgstr ""
-
msgid "Welcome, %{name}!"
msgstr ""
@@ -37468,9 +37983,6 @@ msgstr ""
msgid "What are you searching for?"
msgstr ""
-msgid "What describes you best?"
-msgstr ""
-
msgid "What does this command do?"
msgstr ""
@@ -37492,13 +38004,13 @@ msgstr ""
msgid "What is your job title? (optional)"
msgstr ""
-msgid "What will you use this group for?"
+msgid "What templates can I create?"
msgstr ""
-msgid "What's new"
+msgid "What will you use this group for?"
msgstr ""
-msgid "What’s your experience level?"
+msgid "What's new"
msgstr ""
msgid "When a deployment job is successful, skip older deployment jobs that are still pending."
@@ -37510,6 +38022,9 @@ msgstr ""
msgid "When an event in GitLab triggers a webhook, you can use the request details to figure out if something went wrong."
msgstr ""
+msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+msgstr ""
+
msgid "When inactive, an external authentication provider must be used."
msgstr ""
@@ -37532,6 +38047,9 @@ msgstr ""
msgid "When:"
msgstr ""
+msgid "Which API requests are affected?"
+msgstr ""
+
msgid "While it's rare to have no vulnerabilities, it can happen. In any event, we ask that you please double check your settings to make sure you've set up your dashboard correctly."
msgstr ""
@@ -37811,6 +38329,9 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|Work Items"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -37886,6 +38407,9 @@ msgstr ""
msgid "You are already a member of this %{member_source}."
msgstr ""
+msgid "You are already impersonating another user"
+msgstr ""
+
msgid "You are an admin, which means granting access to %{client_name} will allow them to interact with GitLab as an admin as well. Proceed with caution."
msgstr ""
@@ -37988,6 +38512,9 @@ msgstr ""
msgid "You can also use project access tokens with Git to authenticate over HTTP(S). %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "You can always change your URL later"
+msgstr ""
+
msgid "You can always edit this later"
msgstr ""
@@ -38144,10 +38671,10 @@ msgstr ""
msgid "You can’t %{tag_start}edit%{tag_end} files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
-msgid "You could not create a new trigger."
+msgid "You can’t edit files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
-msgid "You didn't renew your subscription for %{strong}%{namespace_name}%{strong_close} so it was downgraded to the free plan."
+msgid "You could not create a new trigger."
msgstr ""
msgid "You do not have any subscriptions yet"
@@ -38315,6 +38842,12 @@ msgstr ""
msgid "You must provide your current password in order to change it."
msgstr ""
+msgid "You must sign in to search for specific projects."
+msgstr ""
+
+msgid "You must sign in to search for specific terms."
+msgstr ""
+
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
@@ -38342,6 +38875,9 @@ msgstr ""
msgid "You need to upload a GitLab project export archive (ending in .gz)."
msgstr ""
+msgid "You need to verify your primary email first before enabling Two-Factor Authentication."
+msgstr ""
+
msgid "You successfully declined the invitation"
msgstr ""
@@ -38450,10 +38986,10 @@ msgstr ""
msgid "Your %{host} account was signed in to from a new location"
msgstr ""
-msgid "Your %{strong}%{plan_name}%{strong_close} subscription for %{strong}%{namespace_name}%{strong_close} will expire on %{strong}%{expires_on}%{strong_close}."
+msgid "Your %{strong}%{plan_name}%{strong_close} subscription expires on %{strong}%{expires_on}%{strong_close}. After that date, you cannot create issues or merge requests, or use many other features."
msgstr ""
-msgid "Your %{strong}%{plan_name}%{strong_close} subscription will expire on %{strong}%{expires_on}%{strong_close}. After that, you will not be able to create issues or merge requests as well as many other features."
+msgid "Your %{strong}%{plan_name}%{strong_close} subscription for %{strong}%{namespace_name}%{strong_close} will expire on %{strong}%{expires_on}%{strong_close}."
msgstr ""
msgid "Your CI/CD configuration syntax is invalid. View Lint tab for more details."
@@ -38477,7 +39013,7 @@ msgstr ""
msgid "Your GPG keys (%{count})"
msgstr ""
-msgid "Your GitLab account has been locked due to an excessive amount of unsuccessful sign in attempts. Your account will automatically unlock in %{duration} or you may click the link below to unlock now."
+msgid "Your GitLab account has been locked due to an excessive number of unsuccessful sign in attempts. You can wait for your account to automatically unlock in %{duration} or you can click the link below to unlock now."
msgstr ""
msgid "Your GitLab account request has been approved!"
@@ -38588,6 +39124,9 @@ msgstr ""
msgid "Your commit email is used for web based operations, such as edits and merges."
msgstr ""
+msgid "Your current password is required to register a two-factor authenticator app."
+msgstr ""
+
msgid "Your dashboard has been copied. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
@@ -38687,6 +39226,9 @@ msgstr ""
msgid "Your project limit is %{limit} projects! Please contact your administrator to increase it"
msgstr ""
+msgid "Your project will be created at:"
+msgstr ""
+
msgid "Your projects"
msgstr ""
@@ -38726,11 +39268,9 @@ msgstr ""
msgid "Your subscription expired!"
msgstr ""
-msgid "Your subscription has been downgraded."
-msgstr ""
-
-msgid "Your subscription will expire in %{remaining_days}."
-msgstr ""
+msgid "Your subscription will expire in %{remaining_days} day."
+msgid_plural "Your subscription will expire in %{remaining_days} days."
+msgstr[0] ""
msgid "Your username is %{username}."
msgstr ""
@@ -38935,6 +39475,9 @@ msgstr ""
msgid "cannot merge"
msgstr ""
+msgid "cannot not be used for user namespace"
+msgstr ""
+
msgid "ciReport|%{degradedNum} degraded"
msgstr ""
@@ -39257,6 +39800,9 @@ msgstr ""
msgid "created %{timeAgo}"
msgstr ""
+msgid "created %{timeAgo} by %{author}"
+msgstr ""
+
msgid "created by"
msgstr ""
@@ -39300,9 +39846,6 @@ msgstr ""
msgid "does not have a supported extension. Only %{extension_list} are supported"
msgstr ""
-msgid "domain is not authorized for sign-up."
-msgstr ""
-
msgid "download it"
msgstr ""
@@ -39319,17 +39862,13 @@ msgstr ""
msgid "email '%{email}' is not a verified email."
msgstr ""
-msgid "email does not match the allowed domain of %{email_domains}"
-msgid_plural "email does not match the allowed domains: %{email_domains}"
-msgstr[0] ""
-
msgid "enabled"
msgstr ""
msgid "encrypted: needs to be a :required, :optional or :migrating!"
msgstr ""
-msgid "ending with MIME type format is not allowed."
+msgid "ending with a reserved file extension is not allowed."
msgstr ""
msgid "entries cannot be larger than 255 characters"
@@ -39353,6 +39892,9 @@ msgstr ""
msgid "estimateCommand|%{slash_command} overwrites the total estimated time."
msgstr ""
+msgid "example.com"
+msgstr ""
+
msgid "exceeds the limit of %{bytes} bytes"
msgstr ""
@@ -39402,9 +39944,6 @@ msgstr "為此專案"
msgid "fork"
msgstr ""
-msgid "fork this project"
-msgstr ""
-
msgid "from"
msgstr ""
@@ -39412,6 +39951,9 @@ msgid "from %d job"
msgid_plural "from %d jobs"
msgstr[0] ""
+msgid "frontmatter"
+msgstr ""
+
msgid "group"
msgstr ""
@@ -39439,6 +39981,9 @@ msgstr ""
msgid "has been completed."
msgstr ""
+msgid "has too deep level of nesting"
+msgstr ""
+
msgid "help"
msgstr ""
@@ -39472,9 +40017,21 @@ msgstr ""
msgid "in"
msgstr ""
+msgid "in Infrastructure :: Kubernetes clusters"
+msgstr ""
+
+msgid "in all GitLab"
+msgstr ""
+
+msgid "in group"
+msgstr ""
+
msgid "in group %{link_to_group}"
msgstr ""
+msgid "in project"
+msgstr ""
+
msgid "in project %{link_to_project}"
msgstr ""
@@ -39515,16 +40072,19 @@ msgstr ""
msgid "is not a valid X509 certificate."
msgstr ""
-msgid "is not allowed since the group is not top-level group."
+msgid "is not allowed for sign-up."
msgstr ""
-msgid "is not allowed. Try again with a different email address, or contact your GitLab admin."
+msgid "is not allowed for this group."
msgstr ""
-msgid "is not allowed. We do not currently support project-level iterations"
+msgid "is not allowed for this project."
msgstr ""
-msgid "is not from an allowed domain."
+msgid "is not allowed since the group is not top-level group."
+msgstr ""
+
+msgid "is not allowed. We do not currently support project-level iterations"
msgstr ""
msgid "is not in the group enforcing Group Managed Account"
@@ -39617,6 +40177,9 @@ msgstr ""
msgid "log in"
msgstr ""
+msgid "managed"
+msgstr ""
+
msgid "manual"
msgstr ""
@@ -39663,6 +40226,9 @@ msgstr ""
msgid "mrWidget| Please restore it or use a different %{missingBranchName} branch"
msgstr ""
+msgid "mrWidget|%{linkStart}Set up now%{linkEnd} to analyze your source code for known security vulnerabilities."
+msgstr ""
+
msgid "mrWidget|%{mergeError}."
msgstr ""
@@ -39742,6 +40308,9 @@ msgid "mrWidget|Closes issue"
msgid_plural "mrWidget|Closes issues"
msgstr[0] ""
+msgid "mrWidget|Create issue to resolve all threads"
+msgstr ""
+
msgid "mrWidget|Delete source branch"
msgstr ""
@@ -39751,12 +40320,18 @@ msgstr ""
msgid "mrWidget|Did not close"
msgstr ""
+msgid "mrWidget|Dismiss"
+msgstr ""
+
msgid "mrWidget|Email patches"
msgstr ""
msgid "mrWidget|Failed to load deployment statistics"
msgstr ""
+msgid "mrWidget|Hide %{widget} details"
+msgstr ""
+
msgid "mrWidget|If the %{missingBranchName} branch exists in your local repository, you can merge this merge request manually using the command line"
msgstr ""
@@ -39851,9 +40426,6 @@ msgstr ""
msgid "mrWidget|Request to merge"
msgstr "請求åˆä½µ"
-msgid "mrWidget|Resolve all threads in new issue"
-msgstr ""
-
msgid "mrWidget|Resolve conflicts"
msgstr ""
@@ -39869,6 +40441,9 @@ msgstr ""
msgid "mrWidget|Revoke approval"
msgstr ""
+msgid "mrWidget|SAST and Secret Detection is not enabled."
+msgstr ""
+
msgid "mrWidget|Set by %{merge_author} to be added to the merge train when the pipeline succeeds"
msgstr ""
@@ -39878,6 +40453,9 @@ msgstr ""
msgid "mrWidget|Set by %{merge_author} to start a merge train when the pipeline succeeds"
msgstr ""
+msgid "mrWidget|Show %{widget} details"
+msgstr ""
+
msgid "mrWidget|The changes were merged into"
msgstr ""
@@ -39890,6 +40468,9 @@ msgstr ""
msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure, or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
msgstr ""
+msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure."
+msgstr ""
+
msgid "mrWidget|The source branch has been deleted"
msgstr ""
@@ -39932,6 +40513,9 @@ msgstr ""
msgid "mrWidget|You can merge after removing denied licenses"
msgstr ""
+msgid "mrWidget|You can only merge once this merge request is approved."
+msgstr ""
+
msgid "mrWidget|Your password"
msgstr ""
@@ -39968,6 +40552,9 @@ msgstr ""
msgid "must be less than the limit of %{tag_limit} tags"
msgstr ""
+msgid "must be set for a project namespace"
+msgstr ""
+
msgid "must be unique by status and elapsed time within a policy"
msgstr ""
@@ -40075,6 +40662,9 @@ msgstr ""
msgid "pipeline"
msgstr ""
+msgid "pipeline schedules documentation"
+msgstr ""
+
msgid "pod_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
msgstr ""
@@ -40122,16 +40712,25 @@ msgstr ""
msgid "project name"
msgstr ""
+msgid "project namespace cannot be the parent of another namespace"
+msgstr ""
+
msgid "projects"
msgstr ""
msgid "quick actions"
msgstr "快速æ“作"
-msgid "reCAPTCHA Private Key"
+msgid "reCAPTCHA"
+msgstr ""
+
+msgid "reCAPTCHA helps prevent credential stuffing."
msgstr ""
-msgid "reCAPTCHA Site Key"
+msgid "reCAPTCHA private key"
+msgstr ""
+
+msgid "reCAPTCHA site key"
msgstr ""
msgid "recent activity"
@@ -40357,6 +40956,9 @@ msgstr ""
msgid "user avatar"
msgstr ""
+msgid "user namespace cannot be the parent of another namespace"
+msgstr ""
+
msgid "user preferences"
msgstr ""
@@ -40448,3 +41050,9 @@ msgstr ""
msgid "your settings"
msgstr ""
+msgid "{group}"
+msgstr ""
+
+msgid "{project}"
+msgstr ""
+
diff --git a/locale/zh_TW/gitlab.po b/locale/zh_TW/gitlab.po
index b4ea86b9b53..6f45fa86aa7 100644
--- a/locale/zh_TW/gitlab.po
+++ b/locale/zh_TW/gitlab.po
@@ -14,10 +14,7 @@ msgstr ""
"X-Crowdin-Language: zh-TW\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2021-09-01 22:32\n"
-
-msgid " %{name}, confirm your email address now! "
-msgstr ""
+"PO-Revision-Date: 2021-10-04 20:20\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -90,6 +87,14 @@ msgstr ""
msgid "#general, #development"
msgstr ""
+msgid "%d Alert"
+msgid_plural "%d Alerts"
+msgstr[0] ""
+
+msgid "%d Alert:"
+msgid_plural "%d Alerts:"
+msgstr[0] ""
+
msgid "%d Approval"
msgid_plural "%d Approvals"
msgstr[0] ""
@@ -387,8 +392,11 @@ msgstr ""
msgid "%{code_open}Protected:%{code_close} Only exposed to protected branches or tags."
msgstr ""
-msgid "%{commit_author_link} authored %{commit_timeago}"
-msgstr "ç”± %{commit_author_link} æ交於 %{commit_timeago}"
+msgid "%{commit_author_link} authored %{commit_authored_timeago}"
+msgstr ""
+
+msgid "%{commit_author_link} authored %{commit_authored_timeago} and %{commit_committer_avatar} %{commit_committer_link} committed %{commit_committer_timeago}"
+msgstr ""
msgid "%{completedCount} completed weight"
msgstr ""
@@ -476,6 +484,15 @@ msgstr ""
msgid "%{doc_link_start}Advanced search%{doc_link_end} is enabled."
msgstr ""
+msgid "%{docs_link_start}Learn about visibility levels.%{docs_link_end}"
+msgstr ""
+
+msgid "%{docs_link_start}What is Large File Storage?%{docs_link_end}"
+msgstr ""
+
+msgid "%{docs_link_start}What is two-factor authentication?%{docs_link_end}"
+msgstr ""
+
msgid "%{due_date} (Past due)"
msgstr ""
@@ -548,9 +565,6 @@ msgstr "%{issuableType} 將被刪除ï¼æ‚¨ç¢ºå®šå—Žï¼Ÿ"
msgid "%{issueType} actions"
msgstr ""
-msgid "%{issuesCount} issues with a limit of %{maxIssueCount}"
-msgstr ""
-
msgid "%{issuesSize} with a limit of %{maxIssueCount}"
msgstr ""
@@ -608,6 +622,12 @@ msgstr ""
msgid "%{label_for_message} unavailable"
msgstr "%{label_for_message} 無法使用"
+msgid "%{learn_more_link}."
+msgstr ""
+
+msgid "%{lessThan} 1 hour"
+msgstr ""
+
msgid "%{lets_encrypt_link_start}Let's Encrypt%{lets_encrypt_link_end} is a free, automated, and open certificate authority (CA) that issues digital certificates to enable HTTPS (SSL/TLS) for sites."
msgstr ""
@@ -620,15 +640,15 @@ msgstr "由於分å‰çš„æºé …ç›®å¯è¦‹æ€§è¼ƒä½Žï¼Œå› æ­¤ä¸å…許使用 %{level_
msgid "%{link_start}Learn more%{link_end} about roles."
msgstr ""
-msgid "%{link_start}Learn more%{link_end} about what information is shared with GitLab Inc."
-msgstr ""
-
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
msgstr ""
msgid "%{link_start}Start the title with %{draft_snippet}%{link_end} to prevent a merge request that is a work in progress from being merged before it's ready."
msgstr ""
+msgid "%{link_start}What information does GitLab Inc. collect?%{link_end}"
+msgstr ""
+
msgid "%{listToShow}, and %{awardsListLength} more"
msgstr ""
@@ -777,7 +797,7 @@ msgid "%{securityScanner} result is not available because a pipeline has not bee
msgid_plural "%{securityScanner} results are not available because a pipeline has not been run since it was enabled. %{linkStart}Run a pipeline%{linkEnd}"
msgstr[0] ""
-msgid "%{service_ping_link_start}Learn more%{service_ping_link_end} about what information is shared with GitLab Inc."
+msgid "%{service_ping_link_start}What information is shared with GitLab Inc.?%{service_ping_link_end}"
msgstr ""
msgid "%{size} %{unit}"
@@ -813,6 +833,9 @@ msgstr "%{start} 到 %{end}"
msgid "%{state} epics"
msgstr "%{state} å²è©©"
+msgid "%{strongOpen}Warning:%{strongClose} SAML group links can cause GitLab to automatically remove members from groups."
+msgstr ""
+
msgid "%{strongStart}Tip:%{strongEnd} You can also checkout merge requests locally by %{linkStart}following these guidelines%{linkEnd}"
msgstr ""
@@ -865,10 +888,6 @@ msgstr ""
msgid "%{template_project_id} is unknown or invalid"
msgstr "%{template_project_id} 為未知或無效"
-msgid "%{text} %{files}"
-msgid_plural "%{text} %{files} files"
-msgstr[0] "%{text}%{files}"
-
msgid "%{text} is available"
msgstr "%{text} å¯ç”¨"
@@ -953,9 +972,6 @@ msgstr ""
msgid "%{wildcards_link_start}Wildcards%{wildcards_link_end} such as %{code_tag_start}v*%{code_tag_end} or %{code_tag_start}*-release%{code_tag_end} are supported."
msgstr ""
-msgid "&lt; 1 hour"
-msgstr ""
-
msgid "'%{data}' at %{location} does not match format: %{format}"
msgstr ""
@@ -1038,9 +1054,6 @@ msgstr ""
msgid "(we need your current password to confirm your changes)"
msgstr ""
-msgid "* * * * *"
-msgstr ""
-
msgid "+ %{amount} more"
msgstr "+ 其餘 %{amount} 項"
@@ -1104,10 +1117,10 @@ msgstr "- 顯示較少內容"
msgid "."
msgstr ""
-msgid "0 bytes"
+msgid "/"
msgstr ""
-msgid "0 for unlimited, only effective with remote storage enabled."
+msgid "0 bytes"
msgstr ""
msgid "0t1DgySidms"
@@ -1214,6 +1227,9 @@ msgstr "10-19 é …è²¢ç»"
msgid "1000+"
msgstr ""
+msgid "192.168.0.0/24"
+msgstr ""
+
msgid "1st contribution!"
msgstr "您的第一次貢ç»ï¼"
@@ -1367,9 +1383,6 @@ msgstr ""
msgid "A plain HTML site that uses Netlify for CI/CD instead of GitLab, but still with all the other great GitLab features"
msgstr ""
-msgid "A plain-text response to show to clients that hit the rate limit."
-msgstr ""
-
msgid "A platform value can be web, mob or app."
msgstr ""
@@ -1451,7 +1464,7 @@ msgstr ""
msgid "APIFuzzing|Configure HTTP basic authentication values. Other authentication methods are supported. %{linkStart}Learn more%{linkEnd}."
msgstr ""
-msgid "APIFuzzing|Customize common API fuzzing settings to suit your requirements. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
+msgid "APIFuzzing|Customize your project's API fuzzing configuration options and copy the code snippet to your .gitlab-ci.yml file to apply any changes. Note that this tool does not reflect or update your .gitlab-ci.yml file automatically. For details of more advanced configuration options, see the %{docsLinkStart}GitLab API Fuzzing documentation%{docsLinkEnd}."
msgstr ""
msgid "APIFuzzing|Enable authentication"
@@ -1514,9 +1527,6 @@ msgstr ""
msgid "APIFuzzing|To prevent a security leak, authentication info must be added as a %{ciVariablesLinkStart}CI variable%{ciVariablesLinkEnd}. As a user with maintainer access rights, you can manage CI variables in the %{ciSettingsLinkStart}Settings%{ciSettingsLinkEnd} area."
msgstr ""
-msgid "APIFuzzing|Use this tool to generate API fuzzing configuration YAML to copy into your .gitlab-ci.yml file. This tool does not reflect or update your .gitlab-ci.yml file automatically."
-msgstr ""
-
msgid "APIFuzzing|Username for basic authentication"
msgstr ""
@@ -1568,9 +1578,6 @@ msgstr "濫用報告"
msgid "Abuse reports notification email"
msgstr ""
-msgid "Abuse reports will be sent to this address if it is set. Abuse reports are always available in the admin area."
-msgstr ""
-
msgid "Accept invitation"
msgstr "接å—邀請"
@@ -1607,12 +1614,18 @@ msgstr "ç¦æ­¢å­˜å–。請檢查您的存å–權é™ã€‚"
msgid "Access granted"
msgstr ""
+msgid "Access key ID"
+msgstr ""
+
msgid "Access requests"
msgstr ""
msgid "Access to '%{classification_label}' not allowed"
msgstr "ä¸å…許存å–「%{classification_label}ã€"
+msgid "Access tokens expire after 2 hours. A refresh token may be used at any time to generate a new access token. Non-expiring access tokens are deprecated. Clear this setting to enable backward compatibility."
+msgstr ""
+
msgid "AccessDropdown|Deploy Keys"
msgstr ""
@@ -1925,6 +1938,9 @@ msgstr "新增應用程å¼"
msgid "Add new directory"
msgstr "新增目錄"
+msgid "Add new service account"
+msgstr ""
+
msgid "Add or remove previously merged commits"
msgstr ""
@@ -2162,6 +2178,9 @@ msgstr ""
msgid "AdminArea|Features"
msgstr ""
+msgid "AdminArea|Get security updates from GitLab and stay up to date"
+msgstr ""
+
msgid "AdminArea|Groups"
msgstr ""
@@ -2201,6 +2220,12 @@ msgstr ""
msgid "AdminArea|Reporter"
msgstr ""
+msgid "AdminArea|Sign up for the GitLab Security Newsletter to get notified for security updates."
+msgstr ""
+
+msgid "AdminArea|Sign up for the GitLab newsletter"
+msgstr ""
+
msgid "AdminArea|Stop all jobs"
msgstr "åœæ­¢æ‰€æœ‰ä½œæ¥­"
@@ -2270,9 +2295,15 @@ msgstr ""
msgid "AdminSettings|Disable public access to Pages sites"
msgstr ""
+msgid "AdminSettings|Display a banner on merge requests in projects with no pipelines to initiate steps to add a .gitlab-ci.yml file."
+msgstr ""
+
msgid "AdminSettings|Domain verification is an essential security measure for public GitLab sites. Users are required to demonstrate they control a domain before it is enabled. %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "AdminSettings|Enable pipeline suggestion banner"
+msgstr ""
+
msgid "AdminSettings|Enable shared runners for new projects"
msgstr "啟用新專案的共享執行器"
@@ -2744,10 +2775,10 @@ msgstr ""
msgid "Admin|Quarterly reconciliation will occur on %{qrtlyDate}"
msgstr ""
-msgid "Admin|The number of max seats used for your namespace is currently exceeding the number of seats in your subscription. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgid "Admin|The number of max seats in your namespace exceeds the number of seats in your subscription. On %{qrtlyDate}, quarterly reconciliation occurs and you are automatically billed a prorated amount for the overage. No action is needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice. For more information about the timing of the invoicing process, view the documentation."
msgstr ""
-msgid "Admin|The number of maximum users for your instance is currently exceeding the number of users in license. On %{qrtlyDate}, GitLab will process a quarterly reconciliation and automatically bill you a prorated amount for the overage. There is no action needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice."
+msgid "Admin|The number of max users in your instance exceeds the number of users in your license. On %{qrtlyDate}, quarterly reconciliation occurs and you are automatically billed a prorated amount for the overage. No action is needed from you. If you have a credit card on file, it will be charged. Otherwise, you will receive an invoice. For more information about the timing of the invoicing process, view the documentation."
msgstr ""
msgid "Admin|View pending user approvals"
@@ -2768,9 +2799,6 @@ msgstr ""
msgid "Advanced export options"
msgstr ""
-msgid "Advanced permissions, Large File Storage and Two-Factor authentication settings."
-msgstr "進階權é™ï¼Œå¤§åž‹æª”案儲存 (LFS) 和兩步驟èªè­‰è¨­å®šã€‚"
-
msgid "After a successful password update you will be redirected to login screen."
msgstr "密碼更新æˆåŠŸå¾Œï¼Œæ‚¨å°‡è¢«é‡æ–°å°Žå‘至登入é é¢ã€‚"
@@ -2789,12 +2817,14 @@ msgstr ""
msgid "After you've reviewed these contribution guidelines, you'll be all set to"
msgstr ""
+msgid "Akismet"
+msgstr ""
+
msgid "Akismet API Key"
msgstr ""
-msgid "Alert"
-msgid_plural "Alerts"
-msgstr[0] "警示"
+msgid "Akismet helps prevent the creation of spam issues in public projects."
+msgstr ""
msgid "AlertManagement|Acknowledged"
msgstr ""
@@ -3150,6 +3180,9 @@ msgstr ""
msgid "All (default)"
msgstr ""
+msgid "All GitLab"
+msgstr ""
+
msgid "All Members"
msgstr "所有æˆå“¡"
@@ -3264,6 +3297,9 @@ msgstr ""
msgid "Allow this secondary node to replicate content on Object Storage"
msgstr ""
+msgid "Allow use of licensed EE features"
+msgstr ""
+
msgid "Allow users to dismiss the broadcast message"
msgstr ""
@@ -3339,9 +3375,6 @@ msgstr ""
msgid "Amazon authentication is not %{link_start}correctly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr "Amazon 身份驗證未%{link_start}正確設定%{link_end}。如需使用這項æœå‹™ï¼Œè«‹è¯çµ¡ GitLab 管ç†å“¡ã€‚"
-msgid "Amount of time (in hours) that users are allowed to skip forced configuration of two-factor authentication"
-msgstr "å…許使用者跳éŽå¼·åˆ¶è¨­å®šå…©æ­¥é©Ÿé©—證的時間(以å°æ™‚為單ä½ï¼‰"
-
msgid "An %{link_start}alert%{link_end} with the same fingerprint is already open. To change the status of this alert, resolve the linked alert."
msgstr ""
@@ -3402,12 +3435,6 @@ msgstr "é è¦½ blob 時發生錯誤"
msgid "An error occurred when removing the label."
msgstr ""
-msgid "An error occurred when toggling the notification subscription"
-msgstr "切æ›é€šçŸ¥è¨‚閱時發生錯誤"
-
-msgid "An error occurred when updating the issue weight"
-msgstr "更新議題權é‡æ™‚發生錯誤"
-
msgid "An error occurred when updating the title"
msgstr ""
@@ -3456,6 +3483,9 @@ msgstr ""
msgid "An error occurred while enabling Service Desk."
msgstr "啟用æœå‹™å°æ™‚發生錯誤。"
+msgid "An error occurred while fetching Markdown preview"
+msgstr ""
+
msgid "An error occurred while fetching ancestors"
msgstr ""
@@ -3486,9 +3516,6 @@ msgstr "抓å–議題時發生錯誤。"
msgid "An error occurred while fetching label colors."
msgstr "抓å–標籤é¡è‰²æ™‚發生錯誤。"
-msgid "An error occurred while fetching markdown preview"
-msgstr "æŠ“å– Markdown é è¦½æ™‚發生錯誤"
-
msgid "An error occurred while fetching participants"
msgstr ""
@@ -3504,9 +3531,6 @@ msgstr "抓å–專案自動完æˆæ™‚發生錯誤。"
msgid "An error occurred while fetching reference"
msgstr ""
-msgid "An error occurred while fetching sidebar data"
-msgstr "抓å–å´é‚Šæ¬„資料時發生錯誤"
-
msgid "An error occurred while fetching tags. Retry the search."
msgstr ""
@@ -3582,6 +3606,9 @@ msgstr "載入議題時發生錯誤"
msgid "An error occurred while loading merge requests."
msgstr ""
+msgid "An error occurred while loading projects."
+msgstr ""
+
msgid "An error occurred while loading the Needs tab."
msgstr ""
@@ -3816,12 +3843,6 @@ msgstr ""
msgid "Any Milestone"
msgstr ""
-msgid "Any branch"
-msgstr ""
-
-msgid "Any eligible user"
-msgstr ""
-
msgid "Any encrypted tokens"
msgstr ""
@@ -3840,6 +3861,9 @@ msgstr ""
msgid "Any namespace"
msgstr ""
+msgid "App Engine description and apps that are suitable for this deployment target"
+msgstr ""
+
msgid "App ID"
msgstr ""
@@ -3986,6 +4010,10 @@ msgstr ""
msgid "Apply"
msgstr ""
+msgid "Apply %d suggestion"
+msgid_plural "Apply %d suggestions"
+msgstr[0] ""
+
msgid "Apply a label"
msgstr ""
@@ -3995,13 +4023,10 @@ msgstr ""
msgid "Apply suggestion"
msgstr ""
-msgid "Apply suggestions"
-msgstr ""
-
msgid "Apply template"
msgstr ""
-msgid "Apply this approval rule to any branch or a specific protected branch."
+msgid "Apply this approval rule to all branches or a specific protected branch."
msgstr ""
msgid "Applying"
@@ -4140,9 +4165,6 @@ msgstr ""
msgid "ApprovalSettings|Prevent editing approval rules in projects and merge requests."
msgstr ""
-msgid "ApprovalSettings|Prevent editing approval rules in projects and merge requests. "
-msgstr ""
-
msgid "ApprovalSettings|Remove all approvals when commits are added to the source branch."
msgstr ""
@@ -4158,6 +4180,9 @@ msgstr ""
msgid "ApprovalSettings|This setting is configured at the instance level and can only be changed by an administrator."
msgstr ""
+msgid "ApprovalSettings|This setting is configured in %{groupName} and can only be changed by an administrator or group owner."
+msgstr ""
+
msgid "ApprovalStatusTooltip|Adheres to separation of duties"
msgstr ""
@@ -4641,9 +4666,6 @@ msgstr ""
msgid "Authenticated API rate limit period in seconds"
msgstr ""
-msgid "Authenticated API request rate limit"
-msgstr ""
-
msgid "Authenticated API requests"
msgstr ""
@@ -4653,10 +4675,10 @@ msgstr ""
msgid "Authenticated Git LFS request rate limit"
msgstr ""
-msgid "Authenticated web rate limit period in seconds"
+msgid "Authenticated Git LFS requests"
msgstr ""
-msgid "Authenticated web request rate limit"
+msgid "Authenticated web rate limit period in seconds"
msgstr ""
msgid "Authenticated web requests"
@@ -5034,9 +5056,6 @@ msgstr ""
msgid "Below you will find all the groups that are public."
msgstr ""
-msgid "Beta"
-msgstr ""
-
msgid "Bi-weekly code coverage"
msgstr ""
@@ -5275,6 +5294,21 @@ msgstr ""
msgid "Board scope affects which issues are displayed for anyone who visits this board"
msgstr ""
+msgid "BoardNewEpic|Groups"
+msgstr ""
+
+msgid "BoardNewEpic|Loading groups"
+msgstr ""
+
+msgid "BoardNewEpic|No matching results"
+msgstr ""
+
+msgid "BoardNewEpic|Search groups"
+msgstr ""
+
+msgid "BoardNewEpic|Select a group"
+msgstr ""
+
msgid "BoardNewIssue|No matching results"
msgstr ""
@@ -5351,6 +5385,9 @@ msgstr ""
msgid "Boards|An error occurred while creating the list. Please try again."
msgstr ""
+msgid "Boards|An error occurred while fetching child groups. Please try again."
+msgstr ""
+
msgid "Boards|An error occurred while fetching group projects. Please try again."
msgstr ""
@@ -5682,6 +5719,9 @@ msgstr ""
msgid "Bulk update"
msgstr ""
+msgid "BulkImports|Re-import creates a new group. It does not sync with the existing group."
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -5691,6 +5731,9 @@ msgstr ""
msgid "BulkImport|From source group"
msgstr ""
+msgid "BulkImport|Group import history"
+msgstr ""
+
msgid "BulkImport|Import failed: Destination cannot be a subgroup of the source group. Change the destination and try again."
msgstr ""
@@ -5703,9 +5746,18 @@ msgstr ""
msgid "BulkImport|Importing the group failed"
msgstr ""
+msgid "BulkImport|Last imported to %{link}"
+msgstr ""
+
msgid "BulkImport|Name already exists."
msgstr ""
+msgid "BulkImport|New group"
+msgstr ""
+
+msgid "BulkImport|No history is available"
+msgstr ""
+
msgid "BulkImport|No parent"
msgstr ""
@@ -5718,6 +5770,9 @@ msgstr ""
msgid "BulkImport|Showing %{start}-%{end} of %{total} matching filter \"%{filter}\" from %{link}"
msgstr ""
+msgid "BulkImport|Source group"
+msgstr ""
+
msgid "BulkImport|To new group"
msgstr ""
@@ -5727,6 +5782,9 @@ msgstr ""
msgid "BulkImport|You have no groups to import"
msgstr ""
+msgid "BulkImport|Your imported groups will appear here."
+msgstr ""
+
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr ""
@@ -5968,6 +6026,9 @@ msgstr ""
msgid "Can be manually deployed to"
msgstr ""
+msgid "Can be overridden in each project."
+msgstr ""
+
msgid "Can create groups:"
msgstr ""
@@ -6070,6 +6131,9 @@ msgstr ""
msgid "Cancelling Preview"
msgstr ""
+msgid "Cannot assign a confidential epic to a non-confidential issue. Make the issue confidential and try again"
+msgstr ""
+
msgid "Cannot be assigned to other projects."
msgstr ""
@@ -6121,9 +6185,6 @@ msgstr ""
msgid "Cannot refer to a group %{timebox_type} by an internal id!"
msgstr ""
-msgid "Cannot set confidential epic for a non-confidential issue"
-msgstr ""
-
msgid "Cannot show preview. For previews on sketch files, they must have the file format introduced by Sketch version 43 and above."
msgstr ""
@@ -6361,15 +6422,15 @@ msgstr ""
msgid "Check out, review, and merge locally"
msgstr ""
-msgid "Check the %{docs_link_start}documentation%{docs_link_end}."
-msgstr ""
-
msgid "Check the current instance configuration "
msgstr ""
msgid "Check the elasticsearch.log file to debug why the migration was halted and make any changes before retrying the migration. When you fix the cause of the failure, click \"Retry migration\", and the migration will be scheduled to be retried in the background."
msgstr ""
+msgid "Check with your administrator."
+msgstr ""
+
msgid "Check your Docker images for known vulnerabilities."
msgstr ""
@@ -6400,6 +6461,9 @@ msgstr ""
msgid "Checkout"
msgstr ""
+msgid "Checkout|$%{selectedPlanPrice} per 10 GB storage per pack"
+msgstr ""
+
msgid "Checkout|$%{selectedPlanPrice} per pack of 1,000 minutes"
msgstr ""
@@ -6419,16 +6483,22 @@ msgstr ""
msgid "Checkout|%{name}'s GitLab subscription"
msgstr ""
-msgid "Checkout|%{selectedPlanText} plan"
+msgid "Checkout|%{name}'s storage subscription"
msgstr ""
-msgid "Checkout|%{startDate} - %{endDate}"
+msgid "Checkout|%{quantity} GB of storage"
msgstr ""
-msgid "Checkout|%{totalCiMinutes} CI minute"
-msgid_plural "Checkout|%{totalCiMinutes} CI minutes"
+msgid "Checkout|%{quantity} storage pack"
+msgid_plural "Checkout|%{quantity} storage packs"
msgstr[0] ""
+msgid "Checkout|%{selectedPlanText} plan"
+msgstr ""
+
+msgid "Checkout|%{startDate} - %{endDate}"
+msgstr ""
+
msgid "Checkout|%{totalCiMinutes} CI minutes"
msgstr ""
@@ -6504,6 +6574,9 @@ msgstr ""
msgid "Checkout|Failed to register credit card. Please try again."
msgstr ""
+msgid "Checkout|GB"
+msgstr ""
+
msgid "Checkout|GitLab group"
msgstr ""
@@ -6540,6 +6613,9 @@ msgstr ""
msgid "Checkout|State"
msgstr ""
+msgid "Checkout|Storage packs"
+msgstr ""
+
msgid "Checkout|Street address"
msgstr ""
@@ -6561,6 +6637,9 @@ msgstr ""
msgid "Checkout|Total minutes: %{quantity}"
msgstr ""
+msgid "Checkout|Total storage: %{quantity} GB"
+msgstr ""
+
msgid "Checkout|Users"
msgstr ""
@@ -6570,16 +6649,25 @@ msgstr ""
msgid "Checkout|Your organization"
msgstr ""
+msgid "Checkout|Your storage subscription has the same term as your main subscription, and the price is prorated accordingly."
+msgstr ""
+
msgid "Checkout|Your subscription will be applied to this group"
msgstr ""
msgid "Checkout|Zip code"
msgstr ""
+msgid "Checkout|a storage subscription"
+msgstr ""
+
msgid "Checkout|company or team"
msgstr ""
-msgid "Checkout|x 1,000 minutes per pack = %{strong}"
+msgid "Checkout|minutes"
+msgstr ""
+
+msgid "Checkout|x %{quantity} %{units} per pack ="
msgstr ""
msgid "Cherry-pick this commit"
@@ -6936,6 +7024,9 @@ msgstr ""
msgid "CloneIssue|Cannot clone issue to target project as it is pending deletion."
msgstr ""
+msgid "CloneIssue|Cannot clone issues of '%{issue_type}' type."
+msgstr ""
+
msgid "Cloned this issue to %{path_to_project}."
msgstr ""
@@ -6990,7 +7081,10 @@ msgstr ""
msgid "Closes this %{quick_action_target}."
msgstr ""
-msgid "Cloud licenses can not be removed."
+msgid "Cloud Functions description and apps that are suitable for this deployment target"
+msgstr ""
+
+msgid "Cloud Run description and apps that are suitable for this deployment target"
msgstr ""
msgid "Cluster"
@@ -7017,6 +7111,12 @@ msgstr ""
msgid "ClusterAgents|Access tokens"
msgstr ""
+msgid "ClusterAgents|Agent might not be connected to GitLab"
+msgstr ""
+
+msgid "ClusterAgents|Agent never connected to GitLab"
+msgstr ""
+
msgid "ClusterAgents|Alternative installation methods"
msgstr ""
@@ -7032,6 +7132,12 @@ msgstr ""
msgid "ClusterAgents|Configuration"
msgstr ""
+msgid "ClusterAgents|Connected"
+msgstr ""
+
+msgid "ClusterAgents|Connection status"
+msgstr ""
+
msgid "ClusterAgents|Copy token"
msgstr ""
@@ -7050,6 +7156,9 @@ msgstr ""
msgid "ClusterAgents|For alternative installation methods %{linkStart}go to the documentation%{linkEnd}."
msgstr ""
+msgid "ClusterAgents|For more troubleshooting information go to"
+msgstr ""
+
msgid "ClusterAgents|Go to the repository"
msgstr ""
@@ -7065,18 +7174,30 @@ msgstr ""
msgid "ClusterAgents|Integrate with the GitLab Agent"
msgstr ""
-msgid "ClusterAgents|Last used"
+msgid "ClusterAgents|Last connected %{timeAgo}."
+msgstr ""
+
+msgid "ClusterAgents|Last contact"
msgstr ""
msgid "ClusterAgents|Learn how to create an agent access token"
msgstr ""
+msgid "ClusterAgents|Make sure you are using a valid token."
+msgstr ""
+
msgid "ClusterAgents|Name"
msgstr ""
msgid "ClusterAgents|Never"
msgstr ""
+msgid "ClusterAgents|Never connected"
+msgstr ""
+
+msgid "ClusterAgents|Not connected"
+msgstr ""
+
msgid "ClusterAgents|Read more about getting started"
msgstr ""
@@ -7098,6 +7219,9 @@ msgstr ""
msgid "ClusterAgents|Select which Agent you want to install"
msgstr ""
+msgid "ClusterAgents|The Agent has not been connected in a long time. There might be a connectivity issue. Last contact was %{timeAgo}."
+msgstr ""
+
msgid "ClusterAgents|The GitLab Agent also requires %{linkStart}enabling the Agent Server%{linkEnd}"
msgstr ""
@@ -7125,9 +7249,6 @@ msgstr ""
msgid "ClusterAgents|You will need to create a token to connect to your agent"
msgstr ""
-msgid "ClusterAgent|This feature is only available for premium plans"
-msgstr ""
-
msgid "ClusterAgent|User has insufficient permissions to create a token for this project"
msgstr ""
@@ -7317,9 +7438,6 @@ msgstr ""
msgid "ClusterIntegration|Create Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Create a provision role on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the account and external ID above. %{startMoreInfoLink}More information%{endLink}"
-msgstr ""
-
msgid "ClusterIntegration|Create cluster on"
msgstr ""
@@ -7752,7 +7870,7 @@ msgstr ""
msgid "ClusterIntegration|Subnets"
msgstr ""
-msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provisioned role, first create one on %{startAwsLink}Amazon Web Services %{externalLinkIcon}%{endLink} using the above account and external IDs. %{startMoreInfoLink}More information%{endLink}"
+msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provisioned role, first create one on %{awsLinkStart}Amazon Web Services %{awsLinkEnd} using the above account and external IDs. %{moreInfoStart}More information%{moreInfoEnd}"
msgstr ""
msgid "ClusterIntegration|The Kubernetes certificate used to authenticate to the cluster."
@@ -7986,6 +8104,9 @@ msgstr ""
msgid "Collapse replies"
msgstr ""
+msgid "Collapse settings section"
+msgstr ""
+
msgid "Collapse sidebar"
msgstr ""
@@ -8004,6 +8125,9 @@ msgstr ""
msgid "Comma-separated list of email addresses."
msgstr ""
+msgid "Comma-separated list of users allowed to exceed the rate limit."
+msgstr ""
+
msgid "Comma-separated, e.g. '1.1.1.1, 2.2.2.0/24'"
msgstr ""
@@ -8323,6 +8447,9 @@ msgstr ""
msgid "Configure %{repository_checks_link_start}repository checks%{link_end} and %{housekeeping_link_start}housekeeping%{link_end} on repositories."
msgstr ""
+msgid "Configure CAPTCHAs, IP address limits, and other anti-spam measures."
+msgstr ""
+
msgid "Configure Dependency Scanning in `.gitlab-ci.yml` using the GitLab managed template. You can [add variable overrides](https://docs.gitlab.com/ee/user/application_security/dependency_scanning/#customizing-the-dependency-scanning-settings) to customize Dependency Scanning settings."
msgstr ""
@@ -8359,16 +8486,13 @@ msgstr ""
msgid "Configure a %{codeStart}.gitlab-webide.yml%{codeEnd} file in the %{codeStart}.gitlab%{codeEnd} directory to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}"
msgstr ""
-msgid "Configure existing installation"
+msgid "Configure advanced permissions, Large File Storage, and two-factor authentication settings."
msgstr ""
-msgid "Configure limit for notes created per minute by web and API requests."
+msgid "Configure approvals by authors and committers on all projects."
msgstr ""
-msgid "Configure limits for Project/Group Import/Export."
-msgstr ""
-
-msgid "Configure limits for web and API requests."
+msgid "Configure existing installation"
msgstr ""
msgid "Configure paths to be protected by Rack Attack."
@@ -8383,10 +8507,13 @@ msgstr ""
msgid "Configure settings for Advanced Search with Elasticsearch."
msgstr ""
+msgid "Configure specific limits for Files API requests that supersede the general user and IP rate limits."
+msgstr ""
+
msgid "Configure specific limits for Git LFS requests that supersede the general user and IP rate limits."
msgstr ""
-msgid "Configure specific limits for Packages API requests that supersede the general user and IP rate limits."
+msgid "Configure specific limits for deprecated API requests that supersede the general user and IP rate limits."
msgstr ""
msgid "Configure the %{link} integration."
@@ -8398,6 +8525,9 @@ msgstr ""
msgid "Configure the way a user creates a new account."
msgstr ""
+msgid "Configure via Merge Request"
+msgstr ""
+
msgid "Configure which lists are shown for anyone who visits this board"
msgstr ""
@@ -8863,6 +8993,9 @@ msgstr ""
msgid "Content parsed with %{link}."
msgstr ""
+msgid "ContentEditor|Table of Contents"
+msgstr ""
+
msgid "ContentEditor|You have to provide a renderMarkdown function or a custom serializer"
msgstr ""
@@ -9049,6 +9182,9 @@ msgstr ""
msgid "Copy link to chart"
msgstr ""
+msgid "Copy prefix"
+msgstr ""
+
msgid "Copy reference"
msgstr ""
@@ -9079,6 +9215,9 @@ msgstr ""
msgid "Copy value"
msgstr ""
+msgid "Corpus Management"
+msgstr ""
+
msgid "Corpus Management|Are you sure you want to delete the corpus?"
msgstr ""
@@ -9307,6 +9446,9 @@ msgstr ""
msgid "Create commit"
msgstr ""
+msgid "Create common files more quickly, and standardize their format."
+msgstr ""
+
msgid "Create confidential merge request"
msgstr ""
@@ -9340,6 +9482,9 @@ msgstr ""
msgid "Create issue"
msgstr ""
+msgid "Create issue to resolve all threads"
+msgstr ""
+
msgid "Create iteration"
msgstr ""
@@ -9394,6 +9539,9 @@ msgstr ""
msgid "Create new..."
msgstr ""
+msgid "Create or import your first project"
+msgstr ""
+
msgid "Create project"
msgstr ""
@@ -9751,7 +9899,7 @@ msgstr ""
msgid "Custom notification events"
msgstr ""
-msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notificationLinkStart} notification emails%{notificationLinkEnd}."
+msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notificationLinkStart}notification emails%{notificationLinkEnd}."
msgstr ""
msgid "Custom project templates"
@@ -9948,10 +10096,10 @@ msgid "CycleAnalytics|Showing %{subjectFilterText} and %{selectedLabelsCount} la
msgid_plural "CycleAnalytics|Showing %{subjectFilterText} and %{selectedLabelsCount} labels"
msgstr[0] ""
-msgid "CycleAnalytics|Showing data for group '%{groupName}' and %{selectedProjectCount} projects from %{startDate} to %{endDate}"
+msgid "CycleAnalytics|Showing data for group '%{groupName}' and %{selectedProjectCount} projects from %{createdAfter} to %{createdBefore}"
msgstr ""
-msgid "CycleAnalytics|Showing data for group '%{groupName}' from %{startDate} to %{endDate}"
+msgid "CycleAnalytics|Showing data for group '%{groupName}' from %{createdAfter} to %{createdBefore}"
msgstr ""
msgid "CycleAnalytics|Stages"
@@ -10185,6 +10333,9 @@ msgstr ""
msgid "DastProfiles|Manage profiles"
msgstr ""
+msgid "DastProfiles|Manage site profiles"
+msgstr ""
+
msgid "DastProfiles|Minimum = 0 (no timeout enabled), Maximum = 2880 minutes"
msgstr ""
@@ -10260,6 +10411,9 @@ msgstr ""
msgid "DastProfiles|Scanner name"
msgstr ""
+msgid "DastProfiles|Schedule"
+msgstr ""
+
msgid "DastProfiles|Select branch"
msgstr ""
@@ -10329,7 +10483,7 @@ msgstr ""
msgid "DastProfiles|Website"
msgstr ""
-msgid "DastProfiles|You can either choose a passive scan or validate the target site in your chosen site profile. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
+msgid "DastProfiles|You can either choose a passive scan or validate the target site from the site profile management page. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
msgstr ""
msgid "DastProfiles|You cannot run an active scan against an unvalidated site."
@@ -10501,7 +10655,7 @@ msgstr ""
msgid "Days to merge"
msgstr ""
-msgid "Deactivate dormant users after 90 days of inactivity. Users can return to active status by signing in to their account. While inactive, a user is not counted as an active user in the instance."
+msgid "Deactivate dormant users after 90 days of inactivity"
msgstr ""
msgid "Dear Administrator,"
@@ -10588,10 +10742,10 @@ msgstr ""
msgid "Define a custom pattern with cron syntax"
msgstr ""
-msgid "Define approval settings."
+msgid "Define approval rules."
msgstr ""
-msgid "Define approval settings. %{linkStart}Learn more.%{linkEnd}"
+msgid "Define approval rules. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "Define custom rules for what constitutes spam, independent of Akismet"
@@ -10600,7 +10754,7 @@ msgstr ""
msgid "Define environments in the deploy stage(s) in %{code_open}.gitlab-ci.yml%{code_close} to track deployments here."
msgstr ""
-msgid "Define how approval rules are applied as a merge request moves toward completion."
+msgid "Define how approval rules are applied to merge requests."
msgstr ""
msgid "Definition"
@@ -10615,6 +10769,12 @@ msgstr ""
msgid "DelayedJobs|Are you sure you want to run %{job_name} immediately? This job will run automatically after it's timer finishes."
msgstr ""
+msgid "DelayedJobs|Are you sure you want to run %{job_name} immediately? This job will run automatically after its timer finishes."
+msgstr ""
+
+msgid "DelayedJobs|Run the delayed job now?"
+msgstr ""
+
msgid "DelayedJobs|Start now"
msgstr ""
@@ -10888,6 +11048,12 @@ msgstr ""
msgid "Dependency proxy image prefix"
msgstr ""
+msgid "DependencyProxy|Create a local proxy for storing frequently used upstream images. %{docLinkStart}Learn more%{docLinkEnd} about dependency proxies."
+msgstr ""
+
+msgid "DependencyProxy|Dependency Proxy"
+msgstr ""
+
msgid "DependencyProxy|Toggle Dependency Proxy"
msgstr ""
@@ -11125,6 +11291,9 @@ msgstr ""
msgid "Deployments"
msgstr ""
+msgid "Deployments to Google Kubernetes Engine can be "
+msgstr ""
+
msgid "Deployments|%{deployments} environment impacted."
msgid_plural "Deployments|%{deployments} environments impacted."
msgstr[0] ""
@@ -11153,6 +11322,9 @@ msgstr ""
msgid "Deployment|success"
msgstr ""
+msgid "Deprecated API rate limits"
+msgstr ""
+
msgid "Deprioritize label"
msgstr ""
@@ -11555,6 +11727,14 @@ msgstr ""
msgid "DiffsCompareBaseBranch|(base)"
msgstr ""
+msgid "Diffs|%d addition"
+msgid_plural "Diffs|%d additions"
+msgstr[0] ""
+
+msgid "Diffs|%d deletion"
+msgid_plural "Diffs|%d deletions"
+msgstr[0] ""
+
msgid "Diffs|No file name available"
msgstr ""
@@ -11564,9 +11744,16 @@ msgstr ""
msgid "Diffs|Show all unchanged lines"
msgstr ""
+msgid "Diffs|Showing %{dropdownStart}%{count} changed file%{dropdownEnd}"
+msgid_plural "Diffs|Showing %{dropdownStart}%{count} changed files%{dropdownEnd}"
+msgstr[0] ""
+
msgid "Diffs|Something went wrong while fetching diff lines."
msgstr ""
+msgid "Diffs|with %{additions} and %{deletions}"
+msgstr ""
+
msgid "Direct member"
msgstr ""
@@ -11691,9 +11878,6 @@ msgid "Dismiss %d selected vulnerability as"
msgid_plural "Dismiss %d selected vulnerabilities as"
msgstr[0] ""
-msgid "Dismiss Value Stream Analytics introduction box"
-msgstr ""
-
msgid "Dismiss merge request promotion"
msgstr ""
@@ -12015,6 +12199,9 @@ msgstr ""
msgid "Edit issues"
msgstr ""
+msgid "Edit merge requests"
+msgstr ""
+
msgid "Edit public deploy key"
msgstr ""
@@ -12090,6 +12277,9 @@ msgstr ""
msgid "Elastic|None. Select projects to index."
msgstr ""
+msgid "Eligible users"
+msgstr ""
+
msgid "Email"
msgstr ""
@@ -12219,6 +12409,9 @@ msgstr ""
msgid "Enable"
msgstr ""
+msgid "Enable Amazon EKS integration"
+msgstr ""
+
msgid "Enable Auto DevOps"
msgstr ""
@@ -12252,6 +12445,9 @@ msgstr ""
msgid "Enable SSL verification"
msgstr ""
+msgid "Enable Service Ping"
+msgstr ""
+
msgid "Enable Snowplow tracking"
msgstr ""
@@ -12282,6 +12478,9 @@ msgstr ""
msgid "Enable authenticated Git LFS request rate limit"
msgstr ""
+msgid "Enable authenticated web request rate limit"
+msgstr ""
+
msgid "Enable authentication"
msgstr ""
@@ -12342,7 +12541,7 @@ msgstr ""
msgid "Enable or disable the Pseudonymizer data collection."
msgstr ""
-msgid "Enable or disable version check and service ping."
+msgid "Enable or disable version check and Service Ping."
msgstr ""
msgid "Enable protected paths rate limit"
@@ -12354,18 +12553,12 @@ msgstr ""
msgid "Enable reCAPTCHA"
msgstr ""
-msgid "Enable reCAPTCHA for login"
-msgstr ""
-
-msgid "Enable reCAPTCHA, Invisible Captcha, Akismet and set IP limits. For reCAPTCHA, we currently only support %{recaptcha_v2_link_start}v2%{recaptcha_v2_link_end}"
+msgid "Enable reCAPTCHA for login."
msgstr ""
msgid "Enable repository checks"
msgstr ""
-msgid "Enable service ping"
-msgstr ""
-
msgid "Enable shared runners for all projects and subgroups in this group."
msgstr ""
@@ -12387,7 +12580,10 @@ msgstr ""
msgid "Enable unauthenticated API request rate limit"
msgstr ""
-msgid "Enable unauthenticated request rate limit"
+msgid "Enable unauthenticated web request rate limit"
+msgstr ""
+
+msgid "Enable user deactivation emails"
msgstr ""
msgid "Enable version check"
@@ -12423,9 +12619,6 @@ msgstr ""
msgid "Enabled sources for code import during project creation. OmniAuth must be configured for GitHub"
msgstr ""
-msgid "Enabling this will only make licensed EE features available to projects if the project namespace's plan includes the feature or if the project is public."
-msgstr ""
-
msgid "Encountered an error while rendering: %{err}"
msgstr ""
@@ -12474,9 +12667,6 @@ msgstr ""
msgid "Enter Admin Mode"
msgstr ""
-msgid "Enter IP address range"
-msgstr ""
-
msgid "Enter a number"
msgstr ""
@@ -12489,9 +12679,6 @@ msgstr ""
msgid "Enter at least three characters to search"
msgstr ""
-msgid "Enter domain"
-msgstr ""
-
msgid "Enter in your Bitbucket Server URL and personal access token below"
msgstr ""
@@ -12678,9 +12865,6 @@ msgstr ""
msgid "Environments|Deployment %{status}"
msgstr ""
-msgid "Environments|Dismiss"
-msgstr ""
-
msgid "Environments|Enable review app"
msgstr ""
@@ -12693,9 +12877,6 @@ msgstr ""
msgid "Environments|Environments are places where code gets deployed, such as staging or production."
msgstr ""
-msgid "Environments|Help us improve environments"
-msgstr ""
-
msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
msgstr ""
@@ -12732,6 +12913,9 @@ msgstr ""
msgid "Environments|Note that this action will stop the environment, but it will %{emphasisStart}not%{emphasisEnd} have an effect on any existing deployment due to no “stop environment action†being defined in the %{ciConfigLinkStart}.gitlab-ci.yml%{ciConfigLinkEnd} file."
msgstr ""
+msgid "Environments|Open"
+msgstr ""
+
msgid "Environments|Open live environment"
msgstr ""
@@ -12771,9 +12955,6 @@ msgstr ""
msgid "Environments|Stopping %{environmentName}"
msgstr ""
-msgid "Environments|Take the survey"
-msgstr ""
-
msgid "Environments|There was an error fetching the logs. Please try again."
msgstr ""
@@ -12795,9 +12976,6 @@ msgstr ""
msgid "Environments|You don't have any environments right now"
msgstr ""
-msgid "Environments|Your feedback helps GitLab make environments better for you and other users. Participate and enter a sweepstake to win a USD 30 gift card."
-msgstr ""
-
msgid "Environments|by %{avatar}"
msgstr ""
@@ -13080,7 +13258,7 @@ msgstr ""
msgid "Error parsing CSV file. Please make sure it has"
msgstr ""
-msgid "Error rendering markdown preview"
+msgid "Error rendering Markdown preview"
msgstr ""
msgid "Error saving label update."
@@ -13128,6 +13306,9 @@ msgstr ""
msgid "Error: %{error_message}"
msgstr ""
+msgid "Error: Couldn't load some or all of the changes."
+msgstr ""
+
msgid "Error: No AWS credentials were supplied"
msgstr ""
@@ -13161,6 +13342,9 @@ msgstr ""
msgid "ErrorTracking|Enable error tracking"
msgstr ""
+msgid "ErrorTracking|Error tracking backend"
+msgstr ""
+
msgid "ErrorTracking|If you self-host Sentry, enter your Sentry instance's full URL. If you use Sentry's hosted solution, enter https://sentry.io"
msgstr ""
@@ -13194,6 +13378,12 @@ msgstr ""
msgid "Escalation policies must have at least one rule"
msgstr ""
+msgid "EscalationPolicies|%{clockIcon} IF alert is not %{alertStatus} in %{minutes}"
+msgstr ""
+
+msgid "EscalationPolicies|%{notificationIcon} THEN %{doAction} %{forScheduleOrUser}"
+msgstr ""
+
msgid "EscalationPolicies|+ Add an additional rule"
msgstr ""
@@ -13236,13 +13426,13 @@ msgstr ""
msgid "EscalationPolicies|Escalation policies"
msgstr ""
-msgid "EscalationPolicies|Escalation rules"
+msgid "EscalationPolicies|Escalation policy %{obstacle} in Project %{project}"
msgstr ""
-msgid "EscalationPolicies|Failed to load oncall-schedules"
+msgid "EscalationPolicies|Escalation rules"
msgstr ""
-msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} %{then} THEN %{doAction} %{scheduleOrUser}"
+msgid "EscalationPolicies|Failed to load oncall-schedules"
msgstr ""
msgid "EscalationPolicies|IF alert is not %{alertStatus} in %{minutes} minutes"
@@ -13320,18 +13510,36 @@ msgstr ""
msgid "Every %{action} attempt has failed: %{job_error_message}. Please try again."
msgstr ""
+msgid "Every 3 months"
+msgstr ""
+
+msgid "Every 3 months on the %{day} at %{time} %{timezone}"
+msgstr ""
+
+msgid "Every 6 months"
+msgstr ""
+
+msgid "Every 6 months on the %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Every day"
msgstr ""
msgid "Every day (at %{time})"
msgstr ""
+msgid "Every day at %{time} %{timezone}"
+msgstr ""
+
msgid "Every month"
msgstr ""
msgid "Every month (Day %{day} at %{time})"
msgstr ""
+msgid "Every month on the %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Every three months"
msgstr ""
@@ -13345,6 +13553,15 @@ msgstr[0] ""
msgid "Every week (%{weekday} at %{time})"
msgstr ""
+msgid "Every week on %{day} at %{time} %{timezone}"
+msgstr ""
+
+msgid "Every year"
+msgstr ""
+
+msgid "Every year on %{day} at %{time} %{timezone}"
+msgstr ""
+
msgid "Everyone"
msgstr ""
@@ -13381,9 +13598,6 @@ msgstr ""
msgid "Exactly one of %{attributes} is required"
msgstr ""
-msgid "Example: %{ip_address}. %{read_more_link}."
-msgstr ""
-
msgid "Example: @sub\\.company\\.com$"
msgstr ""
@@ -13450,13 +13664,13 @@ msgstr ""
msgid "Expand pipeline"
msgstr ""
-msgid "Expand sidebar"
+msgid "Expand settings section"
msgstr ""
-msgid "Expected documents: %{expected_documents}"
+msgid "Expand sidebar"
msgstr ""
-msgid "Experienced"
+msgid "Expected documents: %{expected_documents}"
msgstr ""
msgid "ExperimentSubject|Must have exactly one of User, Namespace, or Project."
@@ -13741,9 +13955,6 @@ msgstr ""
msgid "Failed to load related branches"
msgstr ""
-msgid "Failed to load sidebar lock status"
-msgstr ""
-
msgid "Failed to load stacktrace."
msgstr ""
@@ -14166,6 +14377,9 @@ msgstr ""
msgid "Files"
msgstr ""
+msgid "Files API Rate Limits"
+msgstr ""
+
msgid "Files breadcrumb"
msgstr ""
@@ -15165,6 +15379,9 @@ msgstr ""
msgid "GitLab group: %{source_link}"
msgstr ""
+msgid "GitLab informs you if a new version is available."
+msgstr ""
+
msgid "GitLab is a complete DevOps platform, delivered as a single application, fundamentally changing the way Development, Security, and Ops teams collaborate"
msgstr ""
@@ -15180,7 +15397,7 @@ msgstr ""
msgid "GitLab is open source software to collaborate on code."
msgstr ""
-msgid "GitLab is undergoing maintenance and is operating in a read-only mode."
+msgid "GitLab is undergoing maintenance and is operating in read-only mode."
msgstr ""
msgid "GitLab member or Email address"
@@ -15192,9 +15409,6 @@ msgstr ""
msgid "GitLab project export"
msgstr ""
-msgid "GitLab restart is required to apply changes."
-msgstr ""
-
msgid "GitLab single sign-on URL"
msgstr ""
@@ -15210,9 +15424,6 @@ msgstr ""
msgid "GitLab version"
msgstr ""
-msgid "GitLab will inform you if a new version is available."
-msgstr ""
-
msgid "GitLab will run a background job that will produce pseudonymized CSVs of the GitLab database that will be uploaded to your configured object storage directory."
msgstr ""
@@ -15477,9 +15688,21 @@ msgstr ""
msgid "Go to snippets"
msgstr ""
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check 'Allowed domains for sign-ups'."
+msgstr ""
+
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check 'Email restrictions for sign-ups'."
+msgstr ""
+
+msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check the 'Domain denylist'."
+msgstr ""
+
msgid "Go to the activity feed"
msgstr ""
+msgid "Go to the group’s 'Settings &gt; General' page, and check 'Restrict membership by email domain'."
+msgstr ""
+
msgid "Go to the milestone list"
msgstr ""
@@ -15516,6 +15739,12 @@ msgstr ""
msgid "Goal of the changes and what reviewers should be aware of"
msgstr ""
+msgid "Google Cloud"
+msgstr ""
+
+msgid "Google Cloud offers several deployment targets. Select the one most suitable for your project."
+msgstr ""
+
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
msgstr ""
@@ -15600,9 +15829,6 @@ msgstr ""
msgid "Group ID"
msgstr ""
-msgid "Group ID: %{group_id}"
-msgstr ""
-
msgid "Group Owner must have signed in with SAML before enabling Group Managed Accounts"
msgstr ""
@@ -15777,6 +16003,12 @@ msgstr ""
msgid "GroupImport|Unable to process group import file"
msgstr ""
+msgid "GroupPage|Copy group ID"
+msgstr ""
+
+msgid "GroupPage|Group ID: %{group_id}"
+msgstr ""
+
msgid "GroupRoadmap|%{dateWord} – No end date"
msgstr ""
@@ -15831,6 +16063,9 @@ msgstr ""
msgid "GroupRoadmap|Within 3 years"
msgstr ""
+msgid "GroupSAML|\"persistent\" recommended"
+msgstr ""
+
msgid "GroupSAML|%{strongOpen}Warning%{strongClose} - Enabling %{linkStart}SSO enforcement%{linkEnd} can reduce security risks."
msgstr ""
@@ -15963,6 +16198,9 @@ msgstr ""
msgid "GroupSAML|To be able to prohibit outer forks, you first need to enforce dedicate group managed accounts."
msgstr ""
+msgid "GroupSAML|Use SAML group links to manage group membership using SAML."
+msgstr ""
+
msgid "GroupSAML|Valid SAML Response"
msgstr ""
@@ -15975,13 +16213,10 @@ msgstr ""
msgid "GroupSAML|as %{access_level}"
msgstr ""
-msgid "GroupSAML|must match stored NameID of \"%{extern_uid}\" as we use this to identify users. If the NameID changes users will be unable to sign in."
-msgstr ""
-
-msgid "GroupSAML|should be \"persistent\""
+msgid "GroupSAML|must match stored NameID of \"%{extern_uid}\" to identify user and allow sign in"
msgstr ""
-msgid "GroupSAML|should be a random persistent ID, emails are discouraged"
+msgid "GroupSAML|recommend persistent ID instead of email"
msgstr ""
msgid "GroupSelect|No matching results"
@@ -15996,9 +16231,15 @@ msgstr ""
msgid "GroupSettings|Allow project access token creation"
msgstr ""
+msgid "GroupSettings|Applied to all subgroups unless overridden by a group owner. Groups already added to the project lose access."
+msgstr ""
+
msgid "GroupSettings|Auto DevOps pipeline was updated for the group"
msgstr ""
+msgid "GroupSettings|Available only on the top-level group. Applies to all subgroups. Groups already shared with a group outside %{group} are still shared unless removed manually."
+msgstr ""
+
msgid "GroupSettings|Badges"
msgstr ""
@@ -16050,6 +16291,9 @@ msgstr ""
msgid "GroupSettings|New runners registration token has been generated!"
msgstr ""
+msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
+msgstr ""
+
msgid "GroupSettings|Pipeline settings was updated for the group"
msgstr ""
@@ -16062,12 +16306,15 @@ msgstr ""
msgid "GroupSettings|Prevent forking setting was not saved"
msgstr ""
-msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups."
+msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups"
msgstr ""
msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
msgstr ""
+msgid "GroupSettings|Prevents group members from being notified if the group is mentioned."
+msgstr ""
+
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
msgstr ""
@@ -16104,21 +16351,6 @@ msgstr ""
msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}."
msgstr ""
-msgid "GroupSettings|This setting is only available on the top-level group and it applies to all subgroups. Groups that have already been shared with a group outside %{group} will still be shared, and this access will have to be revoked manually."
-msgstr ""
-
-msgid "GroupSettings|This setting will be applied to all subgroups unless overridden by a group owner. Groups that already have access to the project will continue to have access unless removed manually."
-msgstr ""
-
-msgid "GroupSettings|This setting will override user notification preferences for all members of the group, subgroups, and projects."
-msgstr ""
-
-msgid "GroupSettings|This setting will prevent group members from being notified if the group is mentioned."
-msgstr ""
-
-msgid "GroupSettings|This setting will prevent group members from forking projects outside of the group."
-msgstr ""
-
msgid "GroupSettings|Transfer group"
msgstr ""
@@ -16236,7 +16468,7 @@ msgstr ""
msgid "GroupsNew|No import options available"
msgstr ""
-msgid "GroupsNew|Not all related objects are migrated, as %{docs_link_start}described here%{docs_link_end}. Please %{feedback_link_start}leave feedback%{feedback_link_end} on this feature."
+msgid "GroupsNew|Not all related objects are migrated. %{docs_link_start}More info%{docs_link_end}."
msgstr ""
msgid "GroupsNew|Personal access token"
@@ -16368,15 +16600,27 @@ msgstr ""
msgid "Hello %{name},"
msgstr ""
-msgid "Hello there"
-msgstr ""
-
msgid "Hello, %{name}!"
msgstr ""
msgid "Hello, %{username}!"
msgstr ""
+msgid "HelloMessage|%{handshake_emoji} Contribute to GitLab: %{contribute_link}"
+msgstr ""
+
+msgid "HelloMessage|%{magnifier_emoji} Create a new GitLab issue: %{new_issue_link}"
+msgstr ""
+
+msgid "HelloMessage|%{rocket_emoji} We like your curiosity! Help us improve GitLab by joining the team: %{jobs_page_link}"
+msgstr ""
+
+msgid "HelloMessage|Does this page need fixes or improvements? Open an issue or contribute a merge request to help make GitLab more lovable. At GitLab, everyone can contribute!"
+msgstr ""
+
+msgid "HelloMessage|Welcome to GitLab!"
+msgstr ""
+
msgid "Help"
msgstr ""
@@ -16386,13 +16630,10 @@ msgstr ""
msgid "Helps prevent bots from creating accounts."
msgstr ""
-msgid "Helps prevent bots from creating issues"
+msgid "Helps prevent bots from creating issues."
msgstr ""
-msgid "Helps prevent malicious users hide their activity"
-msgstr ""
-
-msgid "Helps reduce request volume (e.g. from crawlers or abusive bots)"
+msgid "Helps prevent malicious users hide their activity."
msgstr ""
msgid "Helps reduce request volume (for example, from crawlers or abusive bots)"
@@ -16514,6 +16755,12 @@ msgstr ""
msgid "Housekeeping, export, path, transfer, remove, archive."
msgstr ""
+msgid "How do I configure Akismet?"
+msgstr ""
+
+msgid "How do I configure it?"
+msgstr ""
+
msgid "How do I configure runners?"
msgstr ""
@@ -16535,19 +16782,25 @@ msgstr ""
msgid "How do I set up this service?"
msgstr ""
+msgid "How do I use a web terminal?"
+msgstr ""
+
+msgid "How do I use file templates?"
+msgstr ""
+
msgid "How it works"
msgstr ""
msgid "How many days need to pass between marking entity for deletion and actual removing it."
msgstr ""
-msgid "How many seconds an IP will be counted towards the limit"
+msgid "How many seconds an IP counts toward the IP address limit."
msgstr ""
-msgid "I accept the %{terms_link}"
+msgid "How the job limiter handles jobs exceeding the thresholds specified below. The 'track' mode only logs the jobs. The 'compress' mode compresses the jobs and raises an exception if the compressed size exceeds the limit."
msgstr ""
-msgid "I accept the|Terms of Service and Privacy Policy"
+msgid "I accept the %{terms_link}"
msgstr ""
msgid "I forgot my password"
@@ -16631,13 +16884,16 @@ msgstr ""
msgid "IP Address"
msgstr ""
-msgid "IP expiration time"
+msgid "IP address expiration time"
msgstr ""
-msgid "IP subnet restriction only allowed for top-level groups"
+msgid "IP address restrictions"
+msgstr ""
+
+msgid "IP addresses per user"
msgstr ""
-msgid "IPs per user"
+msgid "IP subnet restriction only allowed for top-level groups"
msgstr ""
msgid "Identifier"
@@ -16652,6 +16908,9 @@ msgstr ""
msgid "If any indexed field exceeds this limit it will be truncated to this number of characters and the rest will not be indexed or searchable. This does not apply to repository and wiki indexing. Setting this to 0 means it is unlimited."
msgstr ""
+msgid "If blank, defaults to %{code_open}Retry later%{code_close}."
+msgstr ""
+
msgid "If blank, set allowable lifetime to %{instance_level_policy_in_words}, as defined by the instance admin. Once set, existing tokens for users in this group may be revoked."
msgstr ""
@@ -16703,6 +16962,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 did not initiate these sign-in attempts, please reach out to your administrator or enable two-factor authentication (2FA) on your account."
+msgstr ""
+
msgid "If you did not initiate this change, please contact your administrator immediately."
msgstr ""
@@ -16792,10 +17054,10 @@ msgstr ""
msgid "Import Projects from Gitea"
msgstr ""
-msgid "Import a project"
+msgid "Import an exported GitLab project"
msgstr ""
-msgid "Import an exported GitLab project"
+msgid "Import and export rate limits"
msgstr ""
msgid "Import failed due to a GitHub error: %{original}"
@@ -16807,12 +17069,18 @@ msgstr ""
msgid "Import from Jira"
msgstr ""
+msgid "Import group"
+msgstr ""
+
msgid "Import group from file"
msgstr ""
msgid "Import groups"
msgstr ""
+msgid "Import history"
+msgstr ""
+
msgid "Import in progress"
msgstr ""
@@ -16876,7 +17144,25 @@ msgstr ""
msgid "Import timed out. Import took longer than %{import_jobs_expiration} seconds"
msgstr ""
-msgid "Import/Export Rate Limits"
+msgid "ImportAProjectModal|Import from a project"
+msgstr ""
+
+msgid "ImportAProjectModal|Import members from another project"
+msgstr ""
+
+msgid "ImportAProjectModal|Import project members"
+msgstr ""
+
+msgid "ImportAProjectModal|Only project members (not group members) are imported, and they get the same permissions as the project you import from."
+msgstr ""
+
+msgid "ImportAProjectModal|Successfully imported"
+msgstr ""
+
+msgid "ImportAProjectModal|Unable to import project members"
+msgstr ""
+
+msgid "ImportAProjectModal|You're importing members to the %{strongStart}%{name}%{strongEnd} project."
msgstr ""
msgid "ImportButtons|Connect repositories from"
@@ -16928,7 +17214,7 @@ msgstr[0] ""
msgid "Importing..."
msgstr ""
-msgid "Import|A repository URL usually ends in a .git suffix, although this is not required. Double check to make sure your repository URL is correct."
+msgid "Import|There is not a valid Git repository at this URL. If your HTTP repository is not publicly accessible, verify your credentials."
msgstr ""
msgid "Improve customer support with Service Desk"
@@ -16937,9 +17223,6 @@ msgstr ""
msgid "Improves Git cloning performance."
msgstr ""
-msgid "In %{time_to_now}"
-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 ""
@@ -17225,7 +17508,7 @@ msgstr ""
msgid "InProductMarketing|Start a GitLab Ultimate trial today in less than one minute, no credit card required."
msgstr ""
-msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no CC required"
+msgid "InProductMarketing|Start a free trial of GitLab Ultimate – no credit card required"
msgstr ""
msgid "InProductMarketing|Start a trial"
@@ -17264,7 +17547,7 @@ msgstr ""
msgid "InProductMarketing|Team up in GitLab for greater efficiency"
msgstr ""
-msgid "InProductMarketing|Team work makes the dream work"
+msgid "InProductMarketing|Team work makes the dream work"
msgstr ""
msgid "InProductMarketing|Test, create, deploy"
@@ -17844,6 +18127,9 @@ msgstr ""
msgid "Integrations|Create new issue in Jira"
msgstr ""
+msgid "Integrations|Create new issue in ZenTao"
+msgstr ""
+
msgid "Integrations|Default settings are inherited from the group level."
msgstr ""
@@ -17937,9 +18223,15 @@ msgstr ""
msgid "Integrations|Search Jira issues"
msgstr ""
+msgid "Integrations|Search ZenTao issues"
+msgstr ""
+
msgid "Integrations|Send notifications about project events to Unify Circuit."
msgstr ""
+msgid "Integrations|Send notifications about project events to a Unify Circuit conversation. %{docs_link}"
+msgstr ""
+
msgid "Integrations|Sign in to add namespaces"
msgstr ""
@@ -17979,6 +18271,9 @@ msgstr ""
msgid "Integrations|You've activated every integration 🎉"
msgstr ""
+msgid "Integrations|ZenTao issues display here when you create issues in your project in ZenTao."
+msgstr ""
+
msgid "Interactive mode"
msgstr ""
@@ -18006,9 +18301,6 @@ msgstr ""
msgid "Interval Pattern"
msgstr ""
-msgid "Introducing Value Stream Analytics"
-msgstr ""
-
msgid "Introducing Your DevOps Report"
msgstr ""
@@ -18105,6 +18397,12 @@ msgstr ""
msgid "Investigate vulnerability: %{title}"
msgstr ""
+msgid "Invisible Captcha"
+msgstr ""
+
+msgid "Invisible Captcha helps prevent the creation of spam accounts. It adds a honeypot field and time-sensitive form submission to the account signup form."
+msgstr ""
+
msgid "Invitation"
msgstr ""
@@ -18558,12 +18856,18 @@ msgstr ""
msgid "Issues"
msgstr ""
+msgid "Issues I've created"
+msgstr ""
+
msgid "Issues Rate Limits"
msgstr ""
msgid "Issues and merge requests"
msgstr ""
+msgid "Issues assigned to me"
+msgstr ""
+
msgid "Issues can be bugs, tasks or ideas to be discussed. Also, issues are searchable and filterable."
msgstr ""
@@ -18675,7 +18979,7 @@ msgstr ""
msgid "Iterations|Create cadence"
msgstr ""
-msgid "Iterations|Create your first iteration"
+msgid "Iterations|Create iteration"
msgstr ""
msgid "Iterations|Delete cadence"
@@ -18684,6 +18988,9 @@ msgstr ""
msgid "Iterations|Delete iteration cadence?"
msgstr ""
+msgid "Iterations|Delete iteration?"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -18717,12 +19024,18 @@ msgstr ""
msgid "Iterations|New iteration cadence"
msgstr ""
+msgid "Iterations|No closed iterations."
+msgstr ""
+
msgid "Iterations|No iteration cadences to show."
msgstr ""
msgid "Iterations|No iterations in cadence."
msgstr ""
+msgid "Iterations|No open iterations."
+msgstr ""
+
msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
@@ -18753,6 +19066,9 @@ msgstr ""
msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
msgstr ""
+msgid "Iterations|This will remove the iteration from any issues that are assigned to it."
+msgstr ""
+
msgid "Iterations|Title"
msgstr ""
@@ -18768,15 +19084,9 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "I’m familiar with the basics of DevOps."
-msgstr ""
-
msgid "I’m joining my team who’s already on GitLab"
msgstr ""
-msgid "I’m not familiar with the basics of DevOps."
-msgstr ""
-
msgid "Jaeger URL"
msgstr ""
@@ -19041,6 +19351,9 @@ msgstr ""
msgid "Job"
msgstr "作業"
+msgid "Job %{jobName}"
+msgstr ""
+
msgid "Job Failed #%{build_id}"
msgstr ""
@@ -19630,9 +19943,6 @@ msgstr ""
msgid "Learn more in the"
msgstr ""
-msgid "Learn more in the|pipeline schedules documentation"
-msgstr ""
-
msgid "Learn more."
msgstr ""
@@ -19744,9 +20054,6 @@ msgstr ""
msgid "Leave Admin Mode"
msgstr ""
-msgid "Leave blank for no limit. Once set, existing personal access tokens may be revoked."
-msgstr ""
-
msgid "Leave edit mode? All unsaved changes will be lost."
msgstr ""
@@ -19792,10 +20099,10 @@ msgstr ""
msgid "LicenseCompliance|Acceptable license to be used in the project"
msgstr ""
-msgid "LicenseCompliance|Add a license"
+msgid "LicenseCompliance|Add license and related policy"
msgstr ""
-msgid "LicenseCompliance|Add license and related policy"
+msgid "LicenseCompliance|Add license policy"
msgstr ""
msgid "LicenseCompliance|Allow"
@@ -19879,6 +20186,9 @@ msgstr ""
msgid "LicenseManagement|Uncategorized"
msgstr ""
+msgid "Licensed Enterprise Edition features can be used if the project namespace's plan includes the feature, or if the project is public."
+msgstr ""
+
msgid "Licensed Features"
msgstr ""
@@ -19945,7 +20255,10 @@ msgstr ""
msgid "Limit namespaces and projects that can be indexed"
msgstr ""
-msgid "Limit sign in from multiple ips"
+msgid "Limit project size at a global, group, and project level. %{link_start}Learn more%{link_end}."
+msgstr ""
+
+msgid "Limit sign in from multiple IP addresses"
msgstr ""
msgid "Limit the number of concurrent operations this secondary site can run in the background."
@@ -19957,10 +20270,16 @@ msgstr ""
msgid "Limit the number of issues and epics per minute a user can create through web and API requests."
msgstr ""
+msgid "Limit the size of Sidekiq jobs stored in Redis."
+msgstr ""
+
msgid "Limited to showing %d event at most"
msgid_plural "Limited to showing %d events at most"
msgstr[0] ""
+msgid "Limiting mode"
+msgstr ""
+
msgid "Line changes"
msgstr ""
@@ -20030,9 +20349,6 @@ msgstr ""
msgid "List of all merge commits"
msgstr ""
-msgid "List of users to be excluded from the limit"
-msgstr ""
-
msgid "List options"
msgstr ""
@@ -20072,9 +20388,6 @@ msgstr ""
msgid "Loading functions timed out. Please reload the page to try again."
msgstr ""
-msgid "Loading issues"
-msgstr ""
-
msgid "Loading more"
msgstr ""
@@ -20366,6 +20679,9 @@ msgstr ""
msgid "Marked For Deletion At - %{deletion_time}"
msgstr ""
+msgid "Marked as ready. Merging is now allowed."
+msgstr ""
+
msgid "Marked this %{noun} as a draft."
msgstr ""
@@ -20438,52 +20754,22 @@ msgstr ""
msgid "Max 100,000 events"
msgstr ""
-msgid "Max 20 characters"
-msgstr ""
-
-msgid "Max Group Export Download requests per minute per user"
-msgstr ""
-
-msgid "Max Group Export requests per minute per user"
-msgstr ""
-
-msgid "Max Group Import requests per minute per user"
-msgstr ""
-
-msgid "Max Project Export Download requests per minute per user"
-msgstr ""
-
-msgid "Max Project Export requests per minute per user"
-msgstr ""
-
-msgid "Max Project Import requests per minute per user"
-msgstr ""
-
-msgid "Max authenticated API requests per period per user"
-msgstr ""
-
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
-msgid "Max authenticated web requests per period per user"
-msgstr ""
-
msgid "Max file size is 200 KB."
msgstr ""
-msgid "Max requests per minute per user"
-msgstr ""
-
msgid "Max role"
msgstr ""
msgid "Max session time"
msgstr ""
-msgid "Max unauthenticated requests per period per IP"
+msgid "MaxBuilds"
msgstr ""
-msgid "MaxBuilds"
+msgid "Maximum 20 characters"
msgstr ""
msgid "Maximum Conan package file size in bytes"
@@ -20519,6 +20805,12 @@ msgstr ""
msgid "Maximum attachment size (MB)"
msgstr ""
+msgid "Maximum authenticated API requests per rate limit period per user"
+msgstr ""
+
+msgid "Maximum authenticated web requests per rate limit period per user"
+msgstr ""
+
msgid "Maximum bulk request size (MiB)"
msgstr ""
@@ -20564,6 +20856,15 @@ msgstr ""
msgid "Maximum files in a diff"
msgstr ""
+msgid "Maximum group export download requests per minute"
+msgstr ""
+
+msgid "Maximum group export requests per minute"
+msgstr ""
+
+msgid "Maximum group import requests per minute"
+msgstr ""
+
msgid "Maximum import size"
msgstr ""
@@ -20600,7 +20901,7 @@ msgstr ""
msgid "Maximum number of projects."
msgstr ""
-msgid "Maximum number of unique IPs per user"
+msgid "Maximum number of unique IP addresses per user."
msgstr ""
msgid "Maximum page reached"
@@ -20609,12 +20910,24 @@ msgstr ""
msgid "Maximum page size"
msgstr ""
+msgid "Maximum project export download requests per minute"
+msgstr ""
+
+msgid "Maximum project export requests per minute"
+msgstr ""
+
+msgid "Maximum project import requests per minute"
+msgstr ""
+
msgid "Maximum push size"
msgstr ""
msgid "Maximum push size (MB)"
msgstr ""
+msgid "Maximum requests per minute"
+msgstr ""
+
msgid "Maximum running slices"
msgstr ""
@@ -20642,10 +20955,16 @@ msgstr ""
msgid "Maximum time between updates that a mirror can have when scheduled to synchronize."
msgstr ""
-msgid "Maximum time for web terminal websocket connection (in seconds). 0 for unlimited."
+msgid "Maximum time that users are allowed to skip the setup of two-factor authentication (in hours). Set to 0 (zero) to enforce at next sign in."
msgstr ""
-msgid "Maximum time that users are allowed to skip the setup of two-factor authentication (in hours). Set to 0 (zero) to enforce at next sign in."
+msgid "Maximum time, in seconds, for a web terminal websocket connection. 0 for unlimited."
+msgstr ""
+
+msgid "Maximum unauthenticated API requests per rate limit period per IP"
+msgstr ""
+
+msgid "Maximum unauthenticated web requests per rate limit period per IP"
msgstr ""
msgid "May"
@@ -20663,9 +20982,6 @@ msgstr ""
msgid "Medium vulnerabilities present"
msgstr ""
-msgid "Member lock"
-msgstr ""
-
msgid "Member since"
msgstr ""
@@ -20702,6 +21018,9 @@ msgstr ""
msgid "Members of a group may only view projects they have permission to access"
msgstr ""
+msgid "Membership"
+msgstr ""
+
msgid "Members|%{time} by %{user}"
msgstr ""
@@ -20762,9 +21081,6 @@ msgstr ""
msgid "Members|Expiration date updated successfully."
msgstr ""
-msgid "Members|Expired"
-msgstr ""
-
msgid "Members|Filter members"
msgstr ""
@@ -20780,9 +21096,6 @@ msgstr ""
msgid "Members|Membership"
msgstr ""
-msgid "Members|No expiration set"
-msgstr ""
-
msgid "Members|Remove \"%{groupName}\""
msgstr ""
@@ -20804,9 +21117,6 @@ msgstr ""
msgid "Members|Search invited"
msgstr ""
-msgid "Members|in %{time}"
-msgstr ""
-
msgid "Member|Deny access"
msgstr ""
@@ -20882,9 +21192,6 @@ msgstr ""
msgid "Merge request %{mr_link} was reviewed by %{mr_author}"
msgstr ""
-msgid "Merge request (MR) approvals"
-msgstr ""
-
msgid "Merge request analytics"
msgstr ""
@@ -20906,12 +21213,21 @@ msgstr ""
msgid "Merge requests"
msgstr ""
+msgid "Merge requests I've created"
+msgstr ""
+
msgid "Merge requests are a place to propose changes you've made to a project and discuss those changes with others"
msgstr ""
msgid "Merge requests are read-only in a secondary Geo node"
msgstr ""
+msgid "Merge requests assigned to me"
+msgstr ""
+
+msgid "Merge requests that I'm a reviewer"
+msgstr ""
+
msgid "Merge the branch and fix any conflicts that come up"
msgstr ""
@@ -20972,10 +21288,10 @@ msgstr ""
msgid "MergeRequests|An error occurred while saving the draft comment."
msgstr ""
-msgid "MergeRequests|Failed to squash. Should be done manually."
+msgid "MergeRequests|Create issue to resolve thread"
msgstr ""
-msgid "MergeRequests|Resolve this thread in a new issue"
+msgid "MergeRequests|Failed to squash. Should be done manually."
msgstr ""
msgid "MergeRequests|Saving the comment failed"
@@ -21787,6 +22103,9 @@ msgstr ""
msgid "MoveIssue|Cannot move issue to project it originates from!"
msgstr ""
+msgid "MoveIssue|Cannot move issues of '%{issue_type}' type."
+msgstr ""
+
msgid "Moved issue to %{label} column in the board."
msgstr ""
@@ -21911,6 +22230,15 @@ 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. To learn more about reducing storage capacity please visit our docs."
msgstr ""
+msgid "NamespaceUserCap|Pending users must be reviewed and approved by a group owner. Learn more about %{user_caps_link_start}User Caps%{link_end} and %{users_pending_approval_link_start}Users Pending Approval%{link_end}."
+msgstr ""
+
+msgid "NamespaceUserCap|View pending user approvals"
+msgstr ""
+
+msgid "NamespaceUserCap|Your group has reached its billable member limit"
+msgstr ""
+
msgid "Namespaces"
msgstr ""
@@ -21953,9 +22281,6 @@ msgstr ""
msgid "Network"
msgstr ""
-msgid "Network Policy|New rule"
-msgstr ""
-
msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is inbound from a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
msgstr ""
@@ -21977,16 +22302,13 @@ msgstr ""
msgid "NetworkPolicies|%{strongOpen}any%{strongClose} port"
msgstr ""
-msgid "NetworkPolicies|+ Add alert"
-msgstr ""
-
msgid "NetworkPolicies|.yaml"
msgstr ""
msgid "NetworkPolicies|.yaml mode"
msgstr ""
-msgid "NetworkPolicies|Actions"
+msgid "NetworkPolicies|Add alert"
msgstr ""
msgid "NetworkPolicies|Alerts are intended to be selectively used for a limited number of events that are potentially concerning and warrant a manual review. Alerts should not be used as a substitute for a SIEM or a logging tool. High volume alerts are likely to be dropped so as to preserve the stability of GitLab's integration with Kubernetes."
@@ -22022,9 +22344,6 @@ msgstr ""
msgid "NetworkPolicies|Deny all traffic"
msgstr ""
-msgid "NetworkPolicies|Description"
-msgstr ""
-
msgid "NetworkPolicies|Edit policy"
msgstr ""
@@ -22037,9 +22356,6 @@ msgstr ""
msgid "NetworkPolicies|IP/subnet"
msgstr ""
-msgid "NetworkPolicies|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
-msgstr ""
-
msgid "NetworkPolicies|Invalid or empty policy"
msgstr ""
@@ -22049,19 +22365,16 @@ msgstr ""
msgid "NetworkPolicies|Kubernetes error: %{error}"
msgstr ""
-msgid "NetworkPolicies|Name"
-msgstr ""
-
msgid "NetworkPolicies|Network"
msgstr ""
-msgid "NetworkPolicies|Network traffic"
+msgid "NetworkPolicies|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
msgstr ""
-msgid "NetworkPolicies|New policy"
+msgid "NetworkPolicies|Network policy can be created after the environment is loaded successfully."
msgstr ""
-msgid "NetworkPolicies|No policies detected"
+msgid "NetworkPolicies|Network traffic"
msgstr ""
msgid "NetworkPolicies|None selected"
@@ -22070,21 +22383,12 @@ msgstr ""
msgid "NetworkPolicies|Please %{installLinkStart}install%{installLinkEnd} and %{configureLinkStart}configure a Kubernetes Agent for this project%{configureLinkEnd} to enable alerts."
msgstr ""
-msgid "NetworkPolicies|Policies are a specification of how groups of pods are allowed to communicate with each other's network endpoints."
-msgstr ""
-
msgid "NetworkPolicies|Policy %{policyName} was successfully changed"
msgstr ""
msgid "NetworkPolicies|Policy definition"
msgstr ""
-msgid "NetworkPolicies|Policy editor"
-msgstr ""
-
-msgid "NetworkPolicies|Policy preview"
-msgstr ""
-
msgid "NetworkPolicies|Rule"
msgstr ""
@@ -22094,9 +22398,6 @@ msgstr ""
msgid "NetworkPolicies|Rule mode is unavailable for this policy. In some cases, we cannot parse the YAML file back into the rules editor."
msgstr ""
-msgid "NetworkPolicies|Rules"
-msgstr ""
-
msgid "NetworkPolicies|Save changes"
msgstr ""
@@ -22109,9 +22410,6 @@ msgstr ""
msgid "NetworkPolicies|Traffic that does not match any rule will be blocked."
msgstr ""
-msgid "NetworkPolicies|Unable to parse policy"
-msgstr ""
-
msgid "NetworkPolicies|all DNS names"
msgstr ""
@@ -22290,6 +22588,9 @@ msgstr ""
msgid "New issue"
msgstr ""
+msgid "New issue in %{project}"
+msgstr ""
+
msgid "New issue title"
msgstr ""
@@ -22368,7 +22669,7 @@ msgstr ""
msgid "Newest first"
msgstr ""
-msgid "Newly registered users will by default be external"
+msgid "Newly-registered users are external by default"
msgstr ""
msgid "Next"
@@ -22683,8 +22984,9 @@ msgstr ""
msgid "No webhooks found, add one in the form above."
msgstr ""
-msgid "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} to renew your subscription."
-msgstr ""
+msgid "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} day to renew your subscription."
+msgid_plural "No worries, you can still use all the %{strong}%{plan_name}%{strong_close} features for now. You have %{remaining_days} days to renew your subscription."
+msgstr[0] ""
msgid "No. of commits"
msgstr ""
@@ -22701,7 +23003,7 @@ msgstr ""
msgid "Nodes"
msgstr ""
-msgid "Non-admin users can sign in with read-only access and make read-only API requests."
+msgid "Non-admin users are restricted to read-only access, in both GitLab UI and API."
msgstr ""
msgid "None"
@@ -22782,7 +23084,7 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
-msgid "Notes Rate Limits"
+msgid "Notes rate limit"
msgstr ""
msgid "Notes|Are you sure you want to cancel creating this comment?"
@@ -22945,9 +23247,6 @@ msgstr "11月"
msgid "November"
msgstr ""
-msgid "Novice"
-msgstr ""
-
msgid "Now, personalize your GitLab experience"
msgstr ""
@@ -23116,7 +23415,7 @@ msgstr ""
msgid "OnCallSchedules|For this rotation, on-call will be:"
msgstr ""
-msgid "OnCallSchedules|On-call schedule %{schedule} in Project %{project}"
+msgid "OnCallSchedules|On-call schedule %{obstacle} in Project %{project}"
msgstr ""
msgid "OnCallSchedules|On-call schedules"
@@ -23263,22 +23562,22 @@ msgstr ""
msgid "OnDemandScans|Scanner profile"
msgstr ""
+msgid "OnDemandScans|Schedule scan"
+msgstr ""
+
msgid "OnDemandScans|Select one of the existing profiles"
msgstr ""
msgid "OnDemandScans|Site profile"
msgstr ""
-msgid "OnDemandScans|Use existing scanner profile"
+msgid "OnDemandScans|Start time"
msgstr ""
-msgid "OnDemandScans|Use existing site profile"
-msgstr ""
-
-msgid "OnDemandScans|You can either choose a passive scan or validate the target site in your chosen site profile. %{docsLinkStart}Learn more about site validation.%{docsLinkEnd}"
+msgid "OnDemandScans|Use existing scanner profile"
msgstr ""
-msgid "OnDemandScans|You cannot run an active scan against an unvalidated site."
+msgid "OnDemandScans|Use existing site profile"
msgstr ""
msgid "OnDemandScans|You must create a repository within your project to run an on-demand scan."
@@ -23342,6 +23641,9 @@ msgstr ""
msgid "Only admins can delete project"
msgstr ""
+msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
+msgstr ""
+
msgid "Only include features new to your current subscription tier."
msgstr ""
@@ -23360,6 +23662,12 @@ msgstr ""
msgid "Only projects created under a Ultimate license are available in Security Dashboards."
msgstr ""
+msgid "Only reCAPTCHA v2 is supported:"
+msgstr ""
+
+msgid "Only users from the specified IP address ranges are able to reach this group, including all subgroups, projects, and Git repositories."
+msgstr ""
+
msgid "Only verified users with an email address in any of these domains can be added to the group."
msgstr ""
@@ -23546,9 +23854,6 @@ msgstr ""
msgid "Package Registry"
msgstr ""
-msgid "Package Registry Rate Limits"
-msgstr ""
-
msgid "Package Registry: authenticated API requests"
msgstr ""
@@ -23567,6 +23872,9 @@ msgstr ""
msgid "Package recipe already exists"
msgstr ""
+msgid "Package registry rate limits"
+msgstr ""
+
msgid "Package type"
msgstr ""
@@ -23633,6 +23941,9 @@ msgstr ""
msgid "PackageRegistry|Composer"
msgstr ""
+msgid "PackageRegistry|Composer.json with license: %{license} and version: %{version}"
+msgstr ""
+
msgid "PackageRegistry|Conan"
msgstr ""
@@ -23696,6 +24007,9 @@ msgstr ""
msgid "PackageRegistry|Copy require package include"
msgstr ""
+msgid "PackageRegistry|Copy target SHA"
+msgstr ""
+
msgid "PackageRegistry|Copy yarn command"
msgstr ""
@@ -23762,6 +24076,9 @@ msgstr ""
msgid "PackageRegistry|Install package version"
msgstr ""
+msgid "PackageRegistry|Instance-level"
+msgstr ""
+
msgid "PackageRegistry|Invalid Package: failed metadata extraction"
msgstr ""
@@ -23807,6 +24124,9 @@ msgstr ""
msgid "PackageRegistry|Pip Command"
msgstr ""
+msgid "PackageRegistry|Project-level"
+msgstr ""
+
msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
msgstr ""
@@ -23828,6 +24148,9 @@ msgstr ""
msgid "PackageRegistry|Remove package"
msgstr ""
+msgid "PackageRegistry|Required Python: %{pythonVersion}"
+msgstr ""
+
msgid "PackageRegistry|RubyGems"
msgstr ""
@@ -23870,6 +24193,9 @@ msgstr ""
msgid "PackageRegistry|Source project located at %{link}"
msgstr ""
+msgid "PackageRegistry|Target SHA: %{sha}"
+msgstr ""
+
msgid "PackageRegistry|There are no other versions of this package."
msgstr ""
@@ -24038,6 +24364,18 @@ msgstr ""
msgid "Password was successfully updated. Please sign in again."
msgstr ""
+msgid "PasswordPrompt|Confirm password"
+msgstr ""
+
+msgid "PasswordPrompt|Confirm password to continue"
+msgstr ""
+
+msgid "PasswordPrompt|Password is required"
+msgstr ""
+
+msgid "PasswordPrompt|Please enter your password to confirm"
+msgstr ""
+
msgid "Passwords should be unique and not used for any other sites or services."
msgstr ""
@@ -24065,6 +24403,9 @@ msgstr ""
msgid "Paste project path (i.e. gitlab-org/gitlab)"
msgstr ""
+msgid "Paste this DSN into your Sentry SDK"
+msgstr ""
+
msgid "Paste your public SSH key, which is usually contained in the file '~/.ssh/id_ed25519.pub' or '~/.ssh/id_rsa.pub' and begins with 'ssh-ed25519' or 'ssh-rsa'. Do not paste your private SSH key, as that can compromise your identity."
msgstr ""
@@ -24149,6 +24490,9 @@ msgstr ""
msgid "PerformanceBar|First Contentful Paint"
msgstr ""
+msgid "PerformanceBar|Flamegraph with mode:"
+msgstr ""
+
msgid "PerformanceBar|Frontend resources"
msgstr ""
@@ -24182,6 +24526,15 @@ msgstr ""
msgid "PerformanceBar|Trace"
msgstr ""
+msgid "PerformanceBar|cpu"
+msgstr ""
+
+msgid "PerformanceBar|object"
+msgstr ""
+
+msgid "PerformanceBar|wall"
+msgstr ""
+
msgid "Period in seconds"
msgstr ""
@@ -24410,6 +24763,48 @@ msgstr ""
msgid "PipelineSchedules|Variables"
msgstr ""
+msgid "PipelineSource|API"
+msgstr ""
+
+msgid "PipelineSource|Chat"
+msgstr ""
+
+msgid "PipelineSource|External"
+msgstr ""
+
+msgid "PipelineSource|External Pull Request"
+msgstr ""
+
+msgid "PipelineSource|Merge Request"
+msgstr ""
+
+msgid "PipelineSource|On-Demand DAST Scan"
+msgstr ""
+
+msgid "PipelineSource|On-Demand DAST Validation"
+msgstr ""
+
+msgid "PipelineSource|Parent Pipeline"
+msgstr ""
+
+msgid "PipelineSource|Pipeline"
+msgstr ""
+
+msgid "PipelineSource|Push"
+msgstr ""
+
+msgid "PipelineSource|Schedule"
+msgstr ""
+
+msgid "PipelineSource|Trigger"
+msgstr ""
+
+msgid "PipelineSource|Web"
+msgstr ""
+
+msgid "PipelineSource|Web IDE"
+msgstr ""
+
msgid "PipelineStatusTooltip|Pipeline: %{ciStatus}"
msgstr ""
@@ -24710,46 +25105,7 @@ msgstr ""
msgid "Pipeline|Source"
msgstr ""
-msgid "Pipeline|Source|API"
-msgstr ""
-
-msgid "Pipeline|Source|Chat"
-msgstr ""
-
-msgid "Pipeline|Source|External"
-msgstr ""
-
-msgid "Pipeline|Source|External Pull Request"
-msgstr ""
-
-msgid "Pipeline|Source|Merge Request"
-msgstr ""
-
-msgid "Pipeline|Source|On-Demand DAST Scan"
-msgstr ""
-
-msgid "Pipeline|Source|On-Demand DAST Validation"
-msgstr ""
-
-msgid "Pipeline|Source|Parent Pipeline"
-msgstr ""
-
-msgid "Pipeline|Source|Pipeline"
-msgstr ""
-
-msgid "Pipeline|Source|Push"
-msgstr ""
-
-msgid "Pipeline|Source|Schedule"
-msgstr ""
-
-msgid "Pipeline|Source|Trigger"
-msgstr ""
-
-msgid "Pipeline|Source|Web"
-msgstr ""
-
-msgid "Pipeline|Source|Web IDE"
+msgid "Pipeline|Source|Security Policy"
msgstr ""
msgid "Pipeline|Specify variable values to be used in this run. The values specified in %{linkStart}CI/CD settings%{linkEnd} will be used by default."
@@ -24800,7 +25156,7 @@ msgstr ""
msgid "Pipeline|We are currently unable to fetch pipeline data"
msgstr ""
-msgid "Pipeline|You’re about to stop pipeline %{pipelineId}."
+msgid "Pipeline|You’re about to stop pipeline #%{pipelineId}."
msgstr ""
msgid "Pipeline|for"
@@ -24827,6 +25183,9 @@ msgstr ""
msgid "Plain diff"
msgstr ""
+msgid "Plain-text response to send to clients that hit a rate limit"
+msgstr ""
+
msgid "Plan:"
msgstr ""
@@ -24971,9 +25330,6 @@ msgstr ""
msgid "Please provide attributes to update"
msgstr ""
-msgid "Please provide your username or email address."
-msgstr ""
-
msgid "Please reach out if you have any questions and we'll be happy to assist."
msgstr ""
@@ -25016,9 +25372,6 @@ msgstr ""
msgid "Please set a new password before proceeding."
msgstr ""
-msgid "Please share your feedback about %{featureName} %{linkStart}in this issue%{linkEnd} to help us improve the experience."
-msgstr ""
-
msgid "Please solve the captcha"
msgstr ""
@@ -25196,6 +25549,9 @@ msgstr ""
msgid "Prevent adding new members to project membership within this group"
msgstr ""
+msgid "Prevent auto-stopping"
+msgstr ""
+
msgid "Prevent editing approval rules in projects and merge requests."
msgstr ""
@@ -25208,7 +25564,7 @@ msgstr ""
msgid "Prevent users from changing their profile name"
msgstr ""
-msgid "Prevent users from performing write operations on GitLab while performing maintenance."
+msgid "Prevent users from performing write operations while GitLab maintenance is in progress."
msgstr ""
msgid "Preview"
@@ -25481,6 +25837,9 @@ msgstr ""
msgid "Profiles|Enter your name, so people you know can recognize you"
msgstr ""
+msgid "Profiles|Enter your password to confirm the email change"
+msgstr ""
+
msgid "Profiles|Enter your pronouns to let people know how to refer to you"
msgstr ""
@@ -25715,10 +26074,10 @@ msgstr ""
msgid "Profiles|e.g. My MacBook key"
msgstr ""
-msgid "Profiles|username"
+msgid "Profiles|https://website.com"
msgstr ""
-msgid "Profiles|website.com"
+msgid "Profiles|username"
msgstr ""
msgid "Profiles|your account"
@@ -25961,9 +26320,21 @@ msgstr ""
msgid "ProjectSelect| or group"
msgstr ""
+msgid "ProjectSelect|No matching results"
+msgstr ""
+
msgid "ProjectSelect|Search for project"
msgstr ""
+msgid "ProjectSelect|Search projects"
+msgstr ""
+
+msgid "ProjectSelect|Select a project"
+msgstr ""
+
+msgid "ProjectSelect|There was an error fetching the projects. Please try again."
+msgstr ""
+
msgid "ProjectService|Drone server URL"
msgstr ""
@@ -26051,6 +26422,9 @@ msgstr ""
msgid "ProjectService|Trigger event when a new, unique alert is recorded."
msgstr ""
+msgid "ProjectService|Trigger event when a new, unique vulnerability is recorded. (Note: This feature requires an Ultimate plan.)"
+msgstr ""
+
msgid "ProjectService|Trigger event when a pipeline status changes."
msgstr ""
@@ -26465,9 +26839,15 @@ msgstr ""
msgid "Projects are graded based on the highest severity vulnerability present"
msgstr ""
+msgid "Projects are organized into groups"
+msgstr ""
+
msgid "Projects contributed to"
msgstr ""
+msgid "Projects help you organize your work. They contain your file repository, issues, merge requests, and so much more."
+msgstr ""
+
msgid "Projects shared with %{group_name}"
msgstr ""
@@ -26702,10 +27082,10 @@ msgstr ""
msgid "PrometheusService|Prometheus cluster integration"
msgstr ""
-msgid "PrometheusService|PrometheusService|The ID of the IAP-secured resource."
+msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
msgstr ""
-msgid "PrometheusService|Select this checkbox to override the auto configuration settings with your own settings."
+msgid "PrometheusService|The ID of the IAP-secured resource."
msgstr ""
msgid "PrometheusService|The Prometheus API base URL."
@@ -27323,6 +27703,9 @@ msgstr ""
msgid "Rate limit"
msgstr ""
+msgid "Rate limits can help reduce request volume (like from crawlers or abusive bots)."
+msgstr ""
+
msgid "Raw blob request rate limit per minute"
msgstr ""
@@ -27335,6 +27718,9 @@ msgstr ""
msgid "Re-authentication required"
msgstr ""
+msgid "Re-import"
+msgstr ""
+
msgid "Re-request review"
msgstr ""
@@ -27356,6 +27742,9 @@ msgstr ""
msgid "Read more about related issues"
msgstr ""
+msgid "Read their documentation."
+msgstr ""
+
msgid "Ready to get started with GitLab? Follow these steps to set up your workspace, plan and commit changes, and deploy your project."
msgstr ""
@@ -27389,6 +27778,9 @@ msgstr ""
msgid "Receive any notifications from GitLab."
msgstr ""
+msgid "Receive notification of abuse reports by email."
+msgstr ""
+
msgid "Receive notifications about your own activity"
msgstr ""
@@ -27531,9 +27923,6 @@ msgstr ""
msgid "Registry setup"
msgstr ""
-msgid "Regulate approvals by authors/committers. Affects all projects."
-msgstr ""
-
msgid "Reindexing Status: %{status} (Slice multiplier: %{multiplier}, Maximum running slices: %{max_slices})"
msgstr ""
@@ -27628,6 +28017,9 @@ msgstr ""
msgid "Release|Something went wrong while saving the release details."
msgstr ""
+msgid "Reload page"
+msgstr ""
+
msgid "Remediations"
msgstr ""
@@ -27910,6 +28302,9 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
+msgid "Repeats"
+msgstr ""
+
msgid "Replace"
msgstr ""
@@ -28268,10 +28663,7 @@ msgstr ""
msgid "Require additional authentication for administrative tasks."
msgstr ""
-msgid "Require all users in this group to setup Two-factor authentication"
-msgstr ""
-
-msgid "Require all users in this group to setup two-factor authentication"
+msgid "Require all users in this group to set up two-factor authentication"
msgstr ""
msgid "Required approvals (%{approvals_given} given)"
@@ -28315,6 +28707,9 @@ msgstr[0] ""
msgid "Requires values to meet regular expression requirements."
msgstr ""
+msgid "Requires you to deploy or set up cloud-hosted Sentry."
+msgstr ""
+
msgid "Requires your primary GitLab email address."
msgstr ""
@@ -28375,9 +28770,6 @@ msgstr ""
msgid "Resolve"
msgstr ""
-msgid "Resolve all threads in new issue"
-msgstr ""
-
msgid "Resolve conflicts"
msgstr ""
@@ -28435,6 +28827,9 @@ msgstr ""
msgid "Response text"
msgstr ""
+msgid "Restart GitLab to apply changes."
+msgstr ""
+
msgid "Restart Terminal"
msgstr ""
@@ -28453,6 +28848,9 @@ msgstr ""
msgid "Restoring the project will prevent the project from being removed on this date and restore people's ability to make changes to it."
msgstr ""
+msgid "Restrict group access by IP address. %{link_start}Learn more%{link_end}."
+msgstr ""
+
msgid "Restrict membership by email domain"
msgstr ""
@@ -28764,6 +29162,9 @@ msgstr ""
msgid "Runners|Runner #%{runner_id}"
msgstr ""
+msgid "Runners|Runner assigned to project."
+msgstr ""
+
msgid "Runners|Runner is offline, last contact was %{runner_contact} ago"
msgstr ""
@@ -28776,6 +29177,9 @@ msgstr ""
msgid "Runners|Runner registration"
msgstr ""
+msgid "Runners|Runner unassigned from project."
+msgstr ""
+
msgid "Runners|Runners"
msgstr ""
@@ -28968,7 +29372,7 @@ msgstr ""
msgid "SastEntryPoints|How do I set up SAST?"
msgstr ""
-msgid "SastEntryPoints|Learn more."
+msgid "SastEntryPoints|Learn more"
msgstr ""
msgid "Satisfied"
@@ -29010,7 +29414,7 @@ msgstr ""
msgid "Save pipeline schedule"
msgstr ""
-msgid "Save space and find images in the container Registry. remove unneeded tags and keep only the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
+msgid "Save storage space by automatically deleting tags from the container registry and keeping the ones you want. %{linkStart}How does cleanup work?%{linkEnd}"
msgstr ""
msgid "Saving"
@@ -29184,6 +29588,9 @@ msgstr ""
msgid "Search or filter results…"
msgstr ""
+msgid "Search or jump to..."
+msgstr ""
+
msgid "Search project"
msgstr ""
@@ -29244,16 +29651,16 @@ msgstr ""
msgid "SearchCodeResults|of %{link_to_project}"
msgstr ""
-msgid "SearchResults|Showing %{count} %{scope} for%{term_element}"
+msgid "SearchResults|Showing %{count} %{scope} for %{term_element}"
msgstr ""
-msgid "SearchResults|Showing %{count} %{scope} for%{term_element} in your personal and project snippets"
+msgid "SearchResults|Showing %{count} %{scope} for %{term_element} in your personal and project snippets"
msgstr ""
-msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for%{term_element}"
+msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for %{term_element}"
msgstr ""
-msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for%{term_element} in your personal and project snippets"
+msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for %{term_element} in your personal and project snippets"
msgstr ""
msgid "SearchResults|code result"
@@ -29324,6 +29731,9 @@ msgstr ""
msgid "Secret Detection"
msgstr ""
+msgid "Secret access key"
+msgstr ""
+
msgid "Secret token"
msgstr ""
@@ -29363,9 +29773,6 @@ msgstr ""
msgid "SecurityApprovals|A merge request approval is required when the license compliance report contains a denied license."
msgstr ""
-msgid "SecurityApprovals|Configurable if security scanners are enabled. %{linkStart}Learn more.%{linkEnd}"
-msgstr ""
-
msgid "SecurityApprovals|Coverage-Check"
msgstr ""
@@ -29378,24 +29785,18 @@ msgstr ""
msgid "SecurityApprovals|Learn more about Vulnerability-Check"
msgstr ""
-msgid "SecurityApprovals|License Scanning must be enabled. %{linkStart}Learn more%{linkEnd}."
-msgstr ""
-
msgid "SecurityApprovals|License-Check"
msgstr ""
msgid "SecurityApprovals|Requires approval for Denied licenses. %{linkStart}More information%{linkEnd}"
msgstr ""
-msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}More information%{linkEnd}"
+msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
msgid "SecurityApprovals|Requires approval for vulnerabilities. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
-msgid "SecurityApprovals|Test coverage must be enabled. %{linkStart}Learn more%{linkEnd}."
-msgstr ""
-
msgid "SecurityApprovals|Vulnerability-Check"
msgstr ""
@@ -29459,6 +29860,12 @@ msgstr ""
msgid "SecurityConfiguration|Immediately begin risk analysis and remediation with application security features. Start with SAST and Secret Detection, available to all plans. Upgrade to Ultimate to get all features, including:"
msgstr ""
+msgid "SecurityConfiguration|Manage corpus"
+msgstr ""
+
+msgid "SecurityConfiguration|Manage corpus files used as mutation sources in coverage fuzzing."
+msgstr ""
+
msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
msgstr ""
@@ -29513,6 +29920,12 @@ msgstr ""
msgid "SecurityOrchestration|Action"
msgstr ""
+msgid "SecurityOrchestration|Actions"
+msgstr ""
+
+msgid "SecurityOrchestration|Add rule"
+msgstr ""
+
msgid "SecurityOrchestration|All policies"
msgstr ""
@@ -29546,9 +29959,6 @@ msgstr ""
msgid "SecurityOrchestration|Network"
msgstr ""
-msgid "SecurityOrchestration|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
-msgstr ""
-
msgid "SecurityOrchestration|New policy"
msgstr ""
@@ -29564,6 +29974,9 @@ msgstr ""
msgid "SecurityOrchestration|Policy editor"
msgstr ""
+msgid "SecurityOrchestration|Policy preview"
+msgstr ""
+
msgid "SecurityOrchestration|Policy status"
msgstr ""
@@ -29573,6 +29986,9 @@ msgstr ""
msgid "SecurityOrchestration|Rule"
msgstr ""
+msgid "SecurityOrchestration|Rules"
+msgstr ""
+
msgid "SecurityOrchestration|Scan Execution"
msgstr ""
@@ -29666,6 +30082,9 @@ msgstr ""
msgid "SecurityReports|Create issue"
msgstr ""
+msgid "SecurityReports|Development vulnerabilities"
+msgstr ""
+
msgid "SecurityReports|Dismiss vulnerability"
msgstr ""
@@ -29681,6 +30100,9 @@ msgstr ""
msgid "SecurityReports|Download results"
msgstr ""
+msgid "SecurityReports|Download scanned URLs"
+msgstr ""
+
msgid "SecurityReports|Download scanned resources"
msgstr ""
@@ -29804,6 +30226,9 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
+msgid "SecurityReports|The Vulnerability Report shows the results of the lastest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "SecurityReports|The security reports below contain one or more vulnerability findings that could not be parsed and were not recorded. Download the artifacts in the job output to investigate. Ensure any security report created conforms to the relevant %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}."
msgstr ""
@@ -29945,10 +30370,10 @@ msgstr ""
msgid "Select a repository"
msgstr ""
-msgid "Select a role"
+msgid "Select a repository containing templates for common files."
msgstr ""
-msgid "Select a shared template repository for all projects on this instance."
+msgid "Select a role"
msgstr ""
msgid "Select a template repository"
@@ -30026,6 +30451,9 @@ msgstr ""
msgid "Select project to choose zone"
msgstr ""
+msgid "Select project to create issue"
+msgstr ""
+
msgid "Select projects"
msgstr ""
@@ -30143,6 +30571,9 @@ msgstr ""
msgid "Send emails to help guide new users through the onboarding process."
msgstr ""
+msgid "Send emails to users upon account deactivation."
+msgstr ""
+
msgid "Send message"
msgstr ""
@@ -30161,6 +30592,9 @@ msgstr ""
msgid "Send service data"
msgstr ""
+msgid "Sentry"
+msgstr ""
+
msgid "Sentry API URL"
msgstr ""
@@ -30275,6 +30709,9 @@ msgstr ""
msgid "Service"
msgstr ""
+msgid "Service Accounts keys are required to authorize GitLab to deploy your Google Cloud project."
+msgstr ""
+
msgid "Service Desk"
msgstr ""
@@ -30347,15 +30784,15 @@ msgstr ""
msgid "Set a password on your account to pull or push via %{protocol}."
msgstr ""
-msgid "Set a template repository for projects in this group"
-msgstr ""
-
msgid "Set access permissions for this token."
msgstr ""
msgid "Set an instance-wide domain that will be available to all clusters when installing Knative."
msgstr ""
+msgid "Set any rate limit to %{code_open}0%{code_close} to disable the limit."
+msgstr ""
+
msgid "Set default and restrict visibility levels. Configure import sources and git access protocol."
msgstr ""
@@ -30368,7 +30805,7 @@ msgstr ""
msgid "Set limit to 0 to allow any file size."
msgstr ""
-msgid "Set max session time for web terminal."
+msgid "Set limits for web and API requests."
msgstr ""
msgid "Set milestone"
@@ -30377,15 +30814,18 @@ msgstr ""
msgid "Set new password"
msgstr ""
-msgid "Set notification email for abuse reports."
+msgid "Set parent epic to an epic"
msgstr ""
-msgid "Set parent epic to an epic"
+msgid "Set per-user rate limits for imports and exports of projects and groups."
msgstr ""
msgid "Set projects and maximum size limits, session duration, user options, and check feature availability for namespace plan."
msgstr ""
+msgid "Set rate limits for package registry API requests that supersede the general user and IP rate limits."
+msgstr ""
+
msgid "Set severity"
msgstr ""
@@ -30404,15 +30844,24 @@ msgstr ""
msgid "Set the default branch for this project. All merge requests and commits are made against this branch unless you specify a different one."
msgstr ""
+msgid "Set the default expiration time for job artifacts in all projects. Set to %{code_open}0%{code_close} to never expire artifacts by default. If no unit is written, it defaults to seconds. For example, these are all equivalent: %{code_open}3600%{code_close}, %{code_open}60 minutes%{code_close}, or %{code_open}one hour%{code_close}."
+msgstr ""
+
msgid "Set the due date to %{due_date}."
msgstr ""
msgid "Set the iteration to %{iteration_reference}."
msgstr ""
+msgid "Set the maximum session time for a web terminal."
+msgstr ""
+
msgid "Set the milestone to %{milestone_reference}."
msgstr ""
+msgid "Set the per-user rate limit for notes created by web or API requests."
+msgstr ""
+
msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
msgstr ""
@@ -30614,6 +31063,9 @@ msgstr ""
msgid "Show Pipeline IID"
msgstr ""
+msgid "Show all %{issuable_type}."
+msgstr ""
+
msgid "Show all activity"
msgstr ""
@@ -30665,15 +31117,9 @@ msgstr ""
msgid "Show list"
msgstr ""
-msgid "Show me advanced features"
-msgstr ""
-
msgid "Show me how to add a pipeline"
msgstr ""
-msgid "Show me the basics"
-msgstr ""
-
msgid "Show one file at a time"
msgstr ""
@@ -30712,15 +31158,15 @@ msgstr ""
msgid "Showing %{pageSize} of %{total} %{issuableType}"
msgstr ""
-msgid "Showing %{pageSize} of %{total} issues"
-msgstr ""
-
msgid "Showing all epics"
msgstr ""
msgid "Showing all issues"
msgstr ""
+msgid "Showing data for group '%{group_name}' from Nov 1, 2019 to Dec 31, 2019"
+msgstr ""
+
msgid "Showing data for workflow items created in this date range. Date range cannot exceed %{maxDateRange} days."
msgstr ""
@@ -30760,6 +31206,15 @@ msgstr ""
msgid "Sidebar|Weight"
msgstr ""
+msgid "Sidekiq job compression threshold (bytes)"
+msgstr ""
+
+msgid "Sidekiq job size limit (bytes)"
+msgstr ""
+
+msgid "Sidekiq job size limits"
+msgstr ""
+
msgid "Sign in"
msgstr ""
@@ -30880,6 +31335,9 @@ msgstr ""
msgid "Site profile not found for given parameters"
msgstr ""
+msgid "Sites"
+msgstr ""
+
msgid "Size"
msgstr ""
@@ -30910,19 +31368,22 @@ msgstr ""
msgid "SlackIntegration|Sends notifications about project events to Slack channels."
msgstr ""
-msgid "SlackService|2. Paste the %{strong_open}Token%{strong_close} into the field below"
+msgid "SlackService|1. %{slash_command_link_start}Add a slash command%{slash_command_link_end} in your Slack team using this information:"
msgstr ""
-msgid "SlackService|3. Select the %{strong_open}Active%{strong_close} checkbox, press %{strong_open}Save changes%{strong_close} and start using GitLab inside Slack!"
+msgid "SlackService|2. Paste the token from Slack in the %{strong_open}Token%{strong_close} field below."
msgstr ""
-msgid "SlackService|Fill in the word that works best for your team."
+msgid "SlackService|3. Select the %{strong_open}Active%{strong_close} checkbox, select %{strong_open}Save changes%{strong_close}, and start using slash commands in Slack!"
+msgstr ""
+
+msgid "SlackService|After setup, get a list of available Slack slash commands by entering"
msgstr ""
-msgid "SlackService|See list of available commands in Slack after setting up this service, by entering"
+msgid "SlackService|Fill in the word that works best for your team."
msgstr ""
-msgid "SlackService|This service allows users to perform common operations on this project by entering slash commands in Slack."
+msgid "SlackService|Perform common operations in this project by entering slash commands in Slack."
msgstr ""
msgid "Slice multiplier"
@@ -30988,7 +31449,7 @@ msgstr ""
msgid "Some child epics may be hidden due to applied filters"
msgstr ""
-msgid "Some common domains are not allowed. %{read_more_link}."
+msgid "Some common domains are not allowed. %{learn_more_link}."
msgstr ""
msgid "Some of the designs you tried uploading did not change:"
@@ -31072,9 +31533,6 @@ msgstr ""
msgid "Something went wrong while exporting requirements"
msgstr ""
-msgid "Something went wrong while fetching %{listType} list"
-msgstr ""
-
msgid "Something went wrong while fetching branches"
msgstr ""
@@ -31129,15 +31587,9 @@ msgstr ""
msgid "Something went wrong while merging this merge request. Please try again."
msgstr ""
-msgid "Something went wrong while moving issues."
-msgstr ""
-
msgid "Something went wrong while obtaining the Let's Encrypt certificate."
msgstr ""
-msgid "Something went wrong while performing the action."
-msgstr ""
-
msgid "Something went wrong while promoting the issue to an epic. Please try again."
msgstr ""
@@ -31465,7 +31917,10 @@ msgstr ""
msgid "SourcegraphPreferences|Uses a custom %{linkStart}Sourcegraph instance%{linkEnd}."
msgstr ""
-msgid "Spam Check API Key"
+msgid "Spam Check"
+msgstr ""
+
+msgid "Spam Check API key"
msgstr ""
msgid "Spam Logs"
@@ -31483,7 +31938,7 @@ msgstr ""
msgid "Specified URL cannot be used: \"%{reason}\""
msgstr ""
-msgid "Specify an e-mail address regex pattern to identify default internal users."
+msgid "Specify an email address regex pattern to identify default internal users."
msgstr ""
msgid "Speed up your pipelines with Needs relationships"
@@ -31738,7 +32193,7 @@ msgstr ""
msgid "StatusCheck|An error occurred fetching the status checks."
msgstr ""
-msgid "StatusCheck|Apply this status check to any branch or a specific protected branch."
+msgid "StatusCheck|Apply this status check to all branches or a specific protected branch."
msgstr ""
msgid "StatusCheck|Check for a status response in Merge Requests. Failures do not block merges. %{link_start}Learn more%{link_end}."
@@ -32077,6 +32532,9 @@ msgstr ""
msgid "Subscriptions"
msgstr ""
+msgid "Subscription|Your subscription for %{strong}%{namespace_name}%{strong_close} has expired and you are now on %{pricing_link_start}the GitLab Free tier%{pricing_link_end}. Don't worry, your data is safe. Get in touch with our support team (%{support_email}). They'll gladly help with your subscription renewal."
+msgstr ""
+
msgid "Subtracted"
msgstr ""
@@ -32305,6 +32763,9 @@ msgstr ""
msgid "SuperSonics|Plan"
msgstr ""
+msgid "SuperSonics|Please agree to the Subscription Agreement"
+msgstr ""
+
msgid "SuperSonics|Ready to get started? A GitLab plan is ideal for scaling organizations and for multi team usage."
msgstr ""
@@ -32335,6 +32796,9 @@ msgstr ""
msgid "SuperSonics|The activation code is not valid. Please make sure to copy it exactly from the Customers Portal or confirmation email. Learn more about %{linkStart}activating your subscription%{linkEnd}."
msgstr ""
+msgid "SuperSonics|The activation code should be a 24-character alphanumeric string"
+msgstr ""
+
msgid "SuperSonics|There is a connectivity issue."
msgstr ""
@@ -32377,9 +32841,15 @@ msgstr ""
msgid "SuperSonics|You do not have an active subscription"
msgstr ""
+msgid "SuperSonics|You have successfully added a license that activates on %{date}. Please see the subscription history table below for more details."
+msgstr ""
+
msgid "SuperSonics|You'll be charged for %{trueUpLinkStart}users over license%{trueUpLinkEnd} on a quarterly or annual basis, depending on the terms of your agreement."
msgstr ""
+msgid "SuperSonics|Your future dated license was successfully added"
+msgstr ""
+
msgid "SuperSonics|Your subscription"
msgstr ""
@@ -32632,7 +33102,7 @@ msgstr ""
msgid "Template to append to all Service Desk issues"
msgstr ""
-msgid "TemplateRepository|Select a repository to make its templates available to all projects. %{link_start}What should the repository contain?%{link_end} "
+msgid "TemplateRepository|Create common files more quickly, and standardize their format."
msgstr ""
msgid "Templates"
@@ -32834,7 +33304,7 @@ msgstr ""
msgid "TestCases|Search test cases"
msgstr ""
-msgid "TestCases|Something went wrong while adding test case to Todo."
+msgid "TestCases|Something went wrong while adding test case to a to-do item."
msgstr ""
msgid "TestCases|Something went wrong while creating a test case."
@@ -32846,7 +33316,7 @@ msgstr ""
msgid "TestCases|Something went wrong while fetching test cases list."
msgstr ""
-msgid "TestCases|Something went wrong while marking test case todo as done."
+msgid "TestCases|Something went wrong while marking test case to-do item as done."
msgstr ""
msgid "TestCases|Something went wrong while moving test case."
@@ -32966,7 +33436,7 @@ msgstr ""
msgid "Thanks for your purchase!"
msgstr ""
-msgid "That is ok, I do not want to renew"
+msgid "That's OK, I don't want to renew"
msgstr ""
msgid "That's it, well done!"
@@ -32988,7 +33458,7 @@ msgid "The %{type} contains the following error:"
msgid_plural "The %{type} contains the following errors:"
msgstr[0] ""
-msgid "The API key used by GitLab for accessing the Spam Check service endpoint"
+msgid "The API key used by GitLab for accessing the Spam Check service endpoint."
msgstr ""
msgid "The GitLab subscription service (customers.gitlab.com) is currently experiencing an outage. You can monitor the status and get updates at %{linkStart}status.gitlab.com%{linkEnd}."
@@ -33027,9 +33497,6 @@ msgstr ""
msgid "The URL to use for connecting to Elasticsearch. Use a comma-separated list to support clustering (e.g., \"http://localhost:9200, http://localhost:9201\")."
msgstr ""
-msgid "The Vulnerability Report shows the results of the last successful pipeline run on the default branch."
-msgstr ""
-
msgid "The X509 Certificate to use when mutual TLS is required to communicate with the external authorization service. If left blank, the server certificate is still validated when accessing over HTTPS."
msgstr ""
@@ -33087,9 +33554,6 @@ msgstr ""
msgid "The default branch for this project has been changed. Please update your bookmarks."
msgstr ""
-msgid "The default expiration time for job artifacts. 0 for unlimited. The default unit is in seconds, but you can use other units, for example %{code_open}4 mins 2 sec%{code_close}, %{code_open}2h42min%{code_close}."
-msgstr ""
-
msgid "The dependency list details information about the components used within your project."
msgstr ""
@@ -33280,9 +33744,6 @@ msgstr ""
msgid "The merge conflicts for this merge request have already been resolved. Please return to the merge request."
msgstr ""
-msgid "The merge request can now be merged."
-msgstr ""
-
msgid "The metric must be one of %{metrics}."
msgstr ""
@@ -33658,7 +34119,7 @@ msgstr ""
msgid "There was a problem updating the keep latest artifacts setting."
msgstr ""
-msgid "There was an error %{message} todo."
+msgid "There was an error %{message} to-do item."
msgstr ""
msgid "There was an error adding a To Do."
@@ -33697,6 +34158,9 @@ msgstr ""
msgid "There was an error fetching projects"
msgstr ""
+msgid "There was an error fetching search autocomplete suggestions"
+msgstr ""
+
msgid "There was an error fetching stage total counts"
msgstr ""
@@ -34021,6 +34485,9 @@ msgstr ""
msgid "This field is required."
msgstr ""
+msgid "This form is disabled in preview"
+msgstr ""
+
msgid "This group"
msgstr ""
@@ -34042,9 +34509,6 @@ msgstr ""
msgid "This group is linked to a subscription"
msgstr ""
-msgid "This group, including all subgroups, projects and git repositories, will be reachable from only the specified IP address ranges."
-msgstr ""
-
msgid "This group, its subgroups and projects has been scheduled for removal on %{date}."
msgstr ""
@@ -34324,9 +34788,6 @@ msgstr ""
msgid "This user cannot be unlocked manually from GitLab"
msgstr ""
-msgid "This user does not have a pending request"
-msgstr ""
-
msgid "This user has an unconfirmed email address (%{email}). You may force a confirmation."
msgstr ""
@@ -34435,9 +34896,6 @@ msgstr ""
msgid "ThreatMonitoring|Packet Activity"
msgstr ""
-msgid "ThreatMonitoring|Policies"
-msgstr ""
-
msgid "ThreatMonitoring|Requests"
msgstr ""
@@ -34489,6 +34947,12 @@ msgstr ""
msgid "ThreatMonitoring|View documentation"
msgstr ""
+msgid "Threshold in bytes at which to compress Sidekiq job arguments."
+msgstr ""
+
+msgid "Threshold in bytes at which to reject Sidekiq jobs. Set this to 0 to if you don't want to limit Sidekiq jobs."
+msgstr ""
+
msgid "Throughput"
msgstr ""
@@ -34498,6 +34962,9 @@ msgstr ""
msgid "Time"
msgstr ""
+msgid "Time (in hours) that users are allowed to skip forced configuration of two-factor authentication."
+msgstr ""
+
msgid "Time Spent"
msgstr ""
@@ -34564,7 +35031,7 @@ msgstr ""
msgid "TimeTrackingEstimated|Est"
msgstr ""
-msgid "TimeTracking|%{startTag}Spent: %{endTag}%{timeSpentHumanReadable}"
+msgid "TimeTracking|%{spentStart}Spent: %{spentEnd}"
msgstr ""
msgid "TimeTracking|Estimated:"
@@ -34776,6 +35243,9 @@ msgstr ""
msgid "To access this domain create a new DNS record"
msgstr ""
+msgid "To add a custom suffix, set up a Service Desk email address. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
msgid "To add an SSH key you need to %{generate_link_start}generate one%{link_end} or use an %{existing_link_start}existing key%{link_end}."
msgstr ""
@@ -34797,13 +35267,16 @@ msgstr ""
msgid "To connect an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To continue using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
+msgstr ""
+
msgid "To continue, you need to select the link in the confirmation email we sent to verify your email address. If you didn't get our email, select %{strongStart}Resend confirmation email.%{strongEnd}"
msgstr ""
msgid "To define internal users, first enable new users set to external"
msgstr ""
-msgid "To enable Registration Features, make sure \"Enable service ping\" is checked."
+msgid "To enable Registration Features, first enable Service Ping."
msgstr ""
msgid "To ensure no loss of personal content, this account should only be used for matters related to %{group_name}."
@@ -34830,7 +35303,7 @@ msgstr ""
msgid "To get started, use the link below to confirm your account."
msgstr ""
-msgid "To help improve GitLab and its user experience, GitLab will periodically collect usage information."
+msgid "To help improve GitLab and its user experience, GitLab periodically collects usage information."
msgstr ""
msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
@@ -34863,7 +35336,7 @@ msgstr ""
msgid "To preserve performance only %{strong_open}%{display_size} of %{real_size}%{strong_close} files are displayed."
msgstr ""
-msgid "To protect this issue's confidentiality, %{forkLink} and set the fork's visibility to private."
+msgid "To protect this issue's confidentiality, %{linkStart}fork this project%{linkEnd} and set the fork's visibility to private."
msgstr ""
msgid "To protect this issue's confidentiality, a private fork of this project was selected."
@@ -34896,12 +35369,15 @@ msgstr ""
msgid "To set up SAML authentication for your group through an identity provider like Azure, Okta, Onelogin, Ping Identity, or your custom SAML 2.0 provider:"
msgstr ""
-msgid "To set up this service:"
+msgid "To set up this integration:"
msgstr ""
msgid "To specify the notification level per project of a group you belong to, you need to visit project page and change notification level there."
msgstr ""
+msgid "To start using GitLab Enterprise Edition, upload the %{codeOpen}.gitlab-license%{codeClose} file or enter the license key you have received from GitLab Inc."
+msgstr ""
+
msgid "To unsubscribe from this issue, please paste the following link into your browser:"
msgstr ""
@@ -35488,9 +35964,6 @@ msgstr ""
msgid "Unable to fetch branches list, please close the form and try again"
msgstr ""
-msgid "Unable to fetch unscanned projects"
-msgstr ""
-
msgid "Unable to fetch vulnerable projects"
msgstr ""
@@ -35545,6 +36018,15 @@ msgstr ""
msgid "Unable to update this issue at this time."
msgstr ""
+msgid "Unapprove a merge request"
+msgstr ""
+
+msgid "Unapprove the current merge request."
+msgstr ""
+
+msgid "Unapproved the current merge request."
+msgstr ""
+
msgid "Unarchive project"
msgstr ""
@@ -35557,16 +36039,13 @@ msgstr ""
msgid "Unassigned"
msgstr ""
-msgid "Unauthenticated API request rate limit"
-msgstr ""
-
-msgid "Unauthenticated rate limit period in seconds"
+msgid "Unauthenticated API rate limit period in seconds"
msgstr ""
-msgid "Unauthenticated request rate limit"
+msgid "Unauthenticated requests"
msgstr ""
-msgid "Unauthenticated requests"
+msgid "Unauthenticated web rate limit period in seconds"
msgstr ""
msgid "Undo"
@@ -35668,18 +36147,6 @@ msgstr ""
msgid "Unresolved"
msgstr ""
-msgid "UnscannedProjects|15 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|30 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|5 or more days"
-msgstr ""
-
-msgid "UnscannedProjects|60 or more days"
-msgstr ""
-
msgid "Unschedule job"
msgstr ""
@@ -35899,6 +36366,9 @@ msgstr ""
msgid "UsageQuota|%{help_link_start}Shared runners%{help_link_end} are disabled, so there are no limits set on pipeline usage"
msgstr ""
+msgid "UsageQuota|%{linkTitle} help link"
+msgstr ""
+
msgid "UsageQuota|%{percentageLeft} of purchased storage is available"
msgstr ""
@@ -35908,6 +36378,9 @@ msgstr ""
msgid "UsageQuota|Artifacts is a sum of build and pipeline artifacts."
msgstr ""
+msgid "UsageQuota|Audio samples, videos, datasets, and graphics."
+msgstr ""
+
msgid "UsageQuota|Buy additional minutes"
msgstr ""
@@ -35917,9 +36390,21 @@ msgstr ""
msgid "UsageQuota|CI minutes usage by project"
msgstr ""
+msgid "UsageQuota|Code packages and container images."
+msgstr ""
+
msgid "UsageQuota|Current period usage"
msgstr ""
+msgid "UsageQuota|File attachments and smaller design graphics."
+msgstr ""
+
+msgid "UsageQuota|Git repository, managed by the Gitaly service."
+msgstr ""
+
+msgid "UsageQuota|Includes project registry, artifacts, packages, wiki, uploads and other items."
+msgstr ""
+
msgid "UsageQuota|Increase storage temporarily"
msgstr ""
@@ -35938,6 +36423,9 @@ msgstr ""
msgid "UsageQuota|Packages"
msgstr ""
+msgid "UsageQuota|Pipeline artifacts and job artifacts, created with CI/CD."
+msgstr ""
+
msgid "UsageQuota|Pipelines"
msgstr ""
@@ -35956,6 +36444,9 @@ msgstr ""
msgid "UsageQuota|Seats"
msgstr ""
+msgid "UsageQuota|Shared bits of code and text."
+msgstr ""
+
msgid "UsageQuota|Snippets"
msgstr ""
@@ -35965,6 +36456,12 @@ msgstr ""
msgid "UsageQuota|Storage"
msgstr ""
+msgid "UsageQuota|Storage type"
+msgstr ""
+
+msgid "UsageQuota|There is a known issue with Artifact storage where the total could be incorrect for some projects. More details and progress are available in %{warningLinkStart}the epic%{warningLinkEnd}."
+msgstr ""
+
msgid "UsageQuota|This is the total amount of storage used across your projects within this namespace."
msgstr ""
@@ -36004,6 +36501,9 @@ msgstr ""
msgid "UsageQuota|Usage"
msgstr ""
+msgid "UsageQuota|Usage Breakdown"
+msgstr ""
+
msgid "UsageQuota|Usage Quotas"
msgstr ""
@@ -36028,6 +36528,9 @@ msgstr ""
msgid "UsageQuota|Wiki"
msgstr ""
+msgid "UsageQuota|Wiki content."
+msgstr ""
+
msgid "UsageQuota|Wikis"
msgstr ""
@@ -36244,7 +36747,10 @@ msgstr ""
msgid "User Settings"
msgstr ""
-msgid "User and IP Rate Limits"
+msgid "User and IP rate limits"
+msgstr ""
+
+msgid "User does not have a pending request"
msgstr ""
msgid "User identity was successfully created."
@@ -36541,6 +37047,9 @@ msgstr ""
msgid "Users can launch a development environment from a GitLab browser tab when the %{linkStart}Gitpod%{linkEnd} integration is enabled."
msgstr ""
+msgid "Users can reactivate their account by signing in."
+msgstr ""
+
msgid "Users can render diagrams in AsciiDoc, Markdown, reStructuredText, and Textile documents using Kroki."
msgstr ""
@@ -36556,6 +37065,9 @@ msgstr ""
msgid "Users requesting access to"
msgstr ""
+msgid "Users to exclude from the rate limit"
+msgstr ""
+
msgid "Users were successfully added."
msgstr ""
@@ -36577,6 +37089,9 @@ msgstr ""
msgid "UsersSelect|Unassigned"
msgstr ""
+msgid "Uses GitLab as a lightweight alternative to Sentry."
+msgstr ""
+
msgid "Using %{code_start}::%{code_end} denotes a %{link_start}scoped label set%{link_end}"
msgstr ""
@@ -36607,10 +37122,7 @@ msgstr ""
msgid "Value Stream Analytics can help you determine your team’s velocity"
msgstr ""
-msgid "Value Stream Analytics gives an overview of how much time it takes to go from idea to production in your project."
-msgstr ""
-
-msgid "Value may contain a variable reference"
+msgid "Value might contain a variable reference"
msgstr ""
msgid "Value stream"
@@ -36676,10 +37188,10 @@ msgstr ""
msgid "ValueStream|The Default Value Stream cannot be deleted"
msgstr ""
-msgid "Variable"
+msgid "Values that contain the %{codeStart}$%{codeEnd} character can be considered a variable reference and expanded. %{docsLinkStart}Learn more.%{docsLinkEnd}"
msgstr ""
-msgid "Variable references indicated by %{codeStart}$%{codeEnd} may be expanded. If this is not what you want, consider %{docsLinkStart}using a workaround to prevent expansion%{docsLinkEnd}."
+msgid "Variable"
msgstr ""
msgid "Variable will be masked in job logs."
@@ -37081,6 +37593,9 @@ msgstr ""
msgid "Vulnerability|Evidence"
msgstr ""
+msgid "Vulnerability|False positive detected"
+msgstr ""
+
msgid "Vulnerability|File"
msgstr ""
@@ -37123,6 +37638,9 @@ msgstr ""
msgid "Vulnerability|Status"
msgstr ""
+msgid "Vulnerability|The scanner determined this vulnerability to be a false positive. Verify the evaluation before changing its status. %{linkStart}Learn more about false positive detection.%{linkEnd}"
+msgstr ""
+
msgid "Vulnerability|The unmodified response is the original response that had no mutations done to the request"
msgstr ""
@@ -37447,9 +37965,6 @@ msgstr ""
msgid "Welcome to GitLab,%{br_tag}%{name}!"
msgstr ""
-msgid "Welcome to the guided GitLab tour"
-msgstr ""
-
msgid "Welcome, %{name}!"
msgstr ""
@@ -37468,9 +37983,6 @@ msgstr ""
msgid "What are you searching for?"
msgstr ""
-msgid "What describes you best?"
-msgstr ""
-
msgid "What does this command do?"
msgstr ""
@@ -37492,13 +38004,13 @@ msgstr ""
msgid "What is your job title? (optional)"
msgstr ""
-msgid "What will you use this group for?"
+msgid "What templates can I create?"
msgstr ""
-msgid "What's new"
+msgid "What will you use this group for?"
msgstr ""
-msgid "What’s your experience level?"
+msgid "What's new"
msgstr ""
msgid "When a deployment job is successful, skip older deployment jobs that are still pending."
@@ -37510,6 +38022,9 @@ msgstr ""
msgid "When an event in GitLab triggers a webhook, you can use the request details to figure out if something went wrong."
msgstr ""
+msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+msgstr ""
+
msgid "When inactive, an external authentication provider must be used."
msgstr ""
@@ -37532,6 +38047,9 @@ msgstr ""
msgid "When:"
msgstr ""
+msgid "Which API requests are affected?"
+msgstr ""
+
msgid "While it's rare to have no vulnerabilities, it can happen. In any event, we ask that you please double check your settings to make sure you've set up your dashboard correctly."
msgstr ""
@@ -37811,6 +38329,9 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|Work Items"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -37886,6 +38407,9 @@ msgstr ""
msgid "You are already a member of this %{member_source}."
msgstr ""
+msgid "You are already impersonating another user"
+msgstr ""
+
msgid "You are an admin, which means granting access to %{client_name} will allow them to interact with GitLab as an admin as well. Proceed with caution."
msgstr ""
@@ -37988,6 +38512,9 @@ msgstr ""
msgid "You can also use project access tokens with Git to authenticate over HTTP(S). %{link_start}Learn more.%{link_end}"
msgstr ""
+msgid "You can always change your URL later"
+msgstr ""
+
msgid "You can always edit this later"
msgstr ""
@@ -38144,10 +38671,10 @@ msgstr ""
msgid "You can’t %{tag_start}edit%{tag_end} files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
-msgid "You could not create a new trigger."
+msgid "You can’t edit files directly in this project. Fork this project and submit a merge request with your changes."
msgstr ""
-msgid "You didn't renew your subscription for %{strong}%{namespace_name}%{strong_close} so it was downgraded to the free plan."
+msgid "You could not create a new trigger."
msgstr ""
msgid "You do not have any subscriptions yet"
@@ -38315,6 +38842,12 @@ msgstr ""
msgid "You must provide your current password in order to change it."
msgstr ""
+msgid "You must sign in to search for specific projects."
+msgstr ""
+
+msgid "You must sign in to search for specific terms."
+msgstr ""
+
msgid "You must solve the CAPTCHA in order to submit"
msgstr ""
@@ -38342,6 +38875,9 @@ msgstr ""
msgid "You need to upload a GitLab project export archive (ending in .gz)."
msgstr ""
+msgid "You need to verify your primary email first before enabling Two-Factor Authentication."
+msgstr ""
+
msgid "You successfully declined the invitation"
msgstr ""
@@ -38450,10 +38986,10 @@ msgstr ""
msgid "Your %{host} account was signed in to from a new location"
msgstr ""
-msgid "Your %{strong}%{plan_name}%{strong_close} subscription for %{strong}%{namespace_name}%{strong_close} will expire on %{strong}%{expires_on}%{strong_close}."
+msgid "Your %{strong}%{plan_name}%{strong_close} subscription expires on %{strong}%{expires_on}%{strong_close}. After that date, you cannot create issues or merge requests, or use many other features."
msgstr ""
-msgid "Your %{strong}%{plan_name}%{strong_close} subscription will expire on %{strong}%{expires_on}%{strong_close}. After that, you will not be able to create issues or merge requests as well as many other features."
+msgid "Your %{strong}%{plan_name}%{strong_close} subscription for %{strong}%{namespace_name}%{strong_close} will expire on %{strong}%{expires_on}%{strong_close}."
msgstr ""
msgid "Your CI/CD configuration syntax is invalid. View Lint tab for more details."
@@ -38477,7 +39013,7 @@ msgstr ""
msgid "Your GPG keys (%{count})"
msgstr ""
-msgid "Your GitLab account has been locked due to an excessive amount of unsuccessful sign in attempts. Your account will automatically unlock in %{duration} or you may click the link below to unlock now."
+msgid "Your GitLab account has been locked due to an excessive number of unsuccessful sign in attempts. You can wait for your account to automatically unlock in %{duration} or you can click the link below to unlock now."
msgstr ""
msgid "Your GitLab account request has been approved!"
@@ -38588,6 +39124,9 @@ msgstr ""
msgid "Your commit email is used for web based operations, such as edits and merges."
msgstr ""
+msgid "Your current password is required to register a two-factor authenticator app."
+msgstr ""
+
msgid "Your dashboard has been copied. You can %{web_ide_link_start}edit it here%{web_ide_link_end}."
msgstr ""
@@ -38687,6 +39226,9 @@ msgstr ""
msgid "Your project limit is %{limit} projects! Please contact your administrator to increase it"
msgstr ""
+msgid "Your project will be created at:"
+msgstr ""
+
msgid "Your projects"
msgstr ""
@@ -38726,11 +39268,9 @@ msgstr ""
msgid "Your subscription expired!"
msgstr ""
-msgid "Your subscription has been downgraded."
-msgstr ""
-
-msgid "Your subscription will expire in %{remaining_days}."
-msgstr ""
+msgid "Your subscription will expire in %{remaining_days} day."
+msgid_plural "Your subscription will expire in %{remaining_days} days."
+msgstr[0] ""
msgid "Your username is %{username}."
msgstr ""
@@ -38935,6 +39475,9 @@ msgstr ""
msgid "cannot merge"
msgstr ""
+msgid "cannot not be used for user namespace"
+msgstr ""
+
msgid "ciReport|%{degradedNum} degraded"
msgstr ""
@@ -39257,6 +39800,9 @@ msgstr ""
msgid "created %{timeAgo}"
msgstr ""
+msgid "created %{timeAgo} by %{author}"
+msgstr ""
+
msgid "created by"
msgstr ""
@@ -39300,9 +39846,6 @@ msgstr ""
msgid "does not have a supported extension. Only %{extension_list} are supported"
msgstr ""
-msgid "domain is not authorized for sign-up."
-msgstr ""
-
msgid "download it"
msgstr ""
@@ -39319,17 +39862,13 @@ msgstr ""
msgid "email '%{email}' is not a verified email."
msgstr ""
-msgid "email does not match the allowed domain of %{email_domains}"
-msgid_plural "email does not match the allowed domains: %{email_domains}"
-msgstr[0] ""
-
msgid "enabled"
msgstr ""
msgid "encrypted: needs to be a :required, :optional or :migrating!"
msgstr ""
-msgid "ending with MIME type format is not allowed."
+msgid "ending with a reserved file extension is not allowed."
msgstr ""
msgid "entries cannot be larger than 255 characters"
@@ -39353,6 +39892,9 @@ msgstr ""
msgid "estimateCommand|%{slash_command} overwrites the total estimated time."
msgstr ""
+msgid "example.com"
+msgstr ""
+
msgid "exceeds the limit of %{bytes} bytes"
msgstr ""
@@ -39402,9 +39944,6 @@ msgstr ""
msgid "fork"
msgstr ""
-msgid "fork this project"
-msgstr ""
-
msgid "from"
msgstr ""
@@ -39412,6 +39951,9 @@ msgid "from %d job"
msgid_plural "from %d jobs"
msgstr[0] ""
+msgid "frontmatter"
+msgstr ""
+
msgid "group"
msgstr ""
@@ -39439,6 +39981,9 @@ msgstr ""
msgid "has been completed."
msgstr ""
+msgid "has too deep level of nesting"
+msgstr ""
+
msgid "help"
msgstr ""
@@ -39472,9 +40017,21 @@ msgstr ""
msgid "in"
msgstr ""
+msgid "in Infrastructure :: Kubernetes clusters"
+msgstr ""
+
+msgid "in all GitLab"
+msgstr ""
+
+msgid "in group"
+msgstr ""
+
msgid "in group %{link_to_group}"
msgstr ""
+msgid "in project"
+msgstr ""
+
msgid "in project %{link_to_project}"
msgstr ""
@@ -39515,16 +40072,19 @@ msgstr ""
msgid "is not a valid X509 certificate."
msgstr ""
-msgid "is not allowed since the group is not top-level group."
+msgid "is not allowed for sign-up."
msgstr ""
-msgid "is not allowed. Try again with a different email address, or contact your GitLab admin."
+msgid "is not allowed for this group."
msgstr ""
-msgid "is not allowed. We do not currently support project-level iterations"
+msgid "is not allowed for this project."
msgstr ""
-msgid "is not from an allowed domain."
+msgid "is not allowed since the group is not top-level group."
+msgstr ""
+
+msgid "is not allowed. We do not currently support project-level iterations"
msgstr ""
msgid "is not in the group enforcing Group Managed Account"
@@ -39617,6 +40177,9 @@ msgstr ""
msgid "log in"
msgstr ""
+msgid "managed"
+msgstr ""
+
msgid "manual"
msgstr ""
@@ -39663,6 +40226,9 @@ msgstr ""
msgid "mrWidget| Please restore it or use a different %{missingBranchName} branch"
msgstr ""
+msgid "mrWidget|%{linkStart}Set up now%{linkEnd} to analyze your source code for known security vulnerabilities."
+msgstr ""
+
msgid "mrWidget|%{mergeError}."
msgstr ""
@@ -39742,6 +40308,9 @@ msgid "mrWidget|Closes issue"
msgid_plural "mrWidget|Closes issues"
msgstr[0] ""
+msgid "mrWidget|Create issue to resolve all threads"
+msgstr ""
+
msgid "mrWidget|Delete source branch"
msgstr ""
@@ -39751,12 +40320,18 @@ msgstr ""
msgid "mrWidget|Did not close"
msgstr ""
+msgid "mrWidget|Dismiss"
+msgstr ""
+
msgid "mrWidget|Email patches"
msgstr ""
msgid "mrWidget|Failed to load deployment statistics"
msgstr ""
+msgid "mrWidget|Hide %{widget} details"
+msgstr ""
+
msgid "mrWidget|If the %{missingBranchName} branch exists in your local repository, you can merge this merge request manually using the command line"
msgstr ""
@@ -39851,9 +40426,6 @@ msgstr ""
msgid "mrWidget|Request to merge"
msgstr ""
-msgid "mrWidget|Resolve all threads in new issue"
-msgstr ""
-
msgid "mrWidget|Resolve conflicts"
msgstr ""
@@ -39869,6 +40441,9 @@ msgstr ""
msgid "mrWidget|Revoke approval"
msgstr ""
+msgid "mrWidget|SAST and Secret Detection is not enabled."
+msgstr ""
+
msgid "mrWidget|Set by %{merge_author} to be added to the merge train when the pipeline succeeds"
msgstr ""
@@ -39878,6 +40453,9 @@ msgstr ""
msgid "mrWidget|Set by %{merge_author} to start a merge train when the pipeline succeeds"
msgstr ""
+msgid "mrWidget|Show %{widget} details"
+msgstr ""
+
msgid "mrWidget|The changes were merged into"
msgstr ""
@@ -39890,6 +40468,9 @@ msgstr ""
msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure, or check the %{linkStart}troubleshooting documentation%{linkEnd} to see other possible actions."
msgstr ""
+msgid "mrWidget|The pipeline for this merge request did not complete. Push a new commit to fix the failure."
+msgstr ""
+
msgid "mrWidget|The source branch has been deleted"
msgstr ""
@@ -39932,6 +40513,9 @@ msgstr ""
msgid "mrWidget|You can merge after removing denied licenses"
msgstr ""
+msgid "mrWidget|You can only merge once this merge request is approved."
+msgstr ""
+
msgid "mrWidget|Your password"
msgstr ""
@@ -39968,6 +40552,9 @@ msgstr ""
msgid "must be less than the limit of %{tag_limit} tags"
msgstr ""
+msgid "must be set for a project namespace"
+msgstr ""
+
msgid "must be unique by status and elapsed time within a policy"
msgstr ""
@@ -40075,6 +40662,9 @@ msgstr ""
msgid "pipeline"
msgstr ""
+msgid "pipeline schedules documentation"
+msgstr ""
+
msgid "pod_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
msgstr ""
@@ -40122,16 +40712,25 @@ msgstr ""
msgid "project name"
msgstr ""
+msgid "project namespace cannot be the parent of another namespace"
+msgstr ""
+
msgid "projects"
msgstr ""
msgid "quick actions"
msgstr ""
-msgid "reCAPTCHA Private Key"
+msgid "reCAPTCHA"
+msgstr ""
+
+msgid "reCAPTCHA helps prevent credential stuffing."
msgstr ""
-msgid "reCAPTCHA Site Key"
+msgid "reCAPTCHA private key"
+msgstr ""
+
+msgid "reCAPTCHA site key"
msgstr ""
msgid "recent activity"
@@ -40357,6 +40956,9 @@ msgstr ""
msgid "user avatar"
msgstr ""
+msgid "user namespace cannot be the parent of another namespace"
+msgstr ""
+
msgid "user preferences"
msgstr ""
@@ -40448,3 +41050,9 @@ msgstr ""
msgid "your settings"
msgstr ""
+msgid "{group}"
+msgstr ""
+
+msgid "{project}"
+msgstr ""
+
diff --git a/package.json b/package.json
index 28ed6bf9393..b8ad3a5e84b 100644
--- a/package.json
+++ b/package.json
@@ -40,7 +40,7 @@
"postinstall": "node ./scripts/frontend/postinstall.js",
"storybook:install": "yarn --cwd ./storybook install",
"storybook:build": "yarn --cwd ./storybook build",
- "storybook:start": "yarn --cwd ./storybook start",
+ "storybook:start": "./scripts/frontend/start_storybook.sh",
"stylelint-create-utility-map": "node scripts/frontend/stylelint/stylelint-utility-map.js",
"webpack": "NODE_OPTIONS=\"--max-old-space-size=3584\" webpack --config config/webpack.config.js",
"webpack-vendor": "NODE_OPTIONS=\"--max-old-space-size=3584\" webpack --config config/webpack.vendor.config.js",
@@ -55,27 +55,27 @@
"@babel/preset-env": "^7.10.1",
"@gitlab/at.js": "1.5.7",
"@gitlab/favicon-overlay": "2.0.0",
- "@gitlab/svgs": "1.212.0",
+ "@gitlab/svgs": "1.218.0",
"@gitlab/tributejs": "1.0.0",
- "@gitlab/ui": "32.11.0",
+ "@gitlab/ui": "32.19.1",
"@gitlab/visual-review-tools": "1.6.1",
- "@rails/actioncable": "6.1.3-2",
- "@rails/ujs": "6.1.3-2",
+ "@rails/actioncable": "6.1.4-1",
+ "@rails/ujs": "6.1.4-1",
"@sentry/browser": "5.30.0",
"@sourcegraph/code-host-integration": "0.0.60",
- "@tiptap/core": "^2.0.0-beta.105",
+ "@tiptap/core": "^2.0.0-beta.118",
"@tiptap/extension-blockquote": "^2.0.0-beta.15",
"@tiptap/extension-bold": "^2.0.0-beta.15",
"@tiptap/extension-bullet-list": "^2.0.0-beta.15",
"@tiptap/extension-code": "^2.0.0-beta.16",
- "@tiptap/extension-code-block-lowlight": "2.0.0-beta.37",
+ "@tiptap/extension-code-block-lowlight": "2.0.0-beta.41",
"@tiptap/extension-document": "^2.0.0-beta.13",
"@tiptap/extension-dropcursor": "^2.0.0-beta.19",
- "@tiptap/extension-gapcursor": "^2.0.0-beta.19",
- "@tiptap/extension-hard-break": "^2.0.0-beta.16",
+ "@tiptap/extension-gapcursor": "^2.0.0-beta.24",
+ "@tiptap/extension-hard-break": "^2.0.0-beta.21",
"@tiptap/extension-heading": "^2.0.0-beta.15",
"@tiptap/extension-history": "^2.0.0-beta.16",
- "@tiptap/extension-horizontal-rule": "^2.0.0-beta.19",
+ "@tiptap/extension-horizontal-rule": "^2.0.0-beta.21",
"@tiptap/extension-image": "^2.0.0-beta.15",
"@tiptap/extension-italic": "^2.0.0-beta.15",
"@tiptap/extension-link": "^2.0.0-beta.20",
@@ -85,20 +85,21 @@
"@tiptap/extension-strike": "^2.0.0-beta.17",
"@tiptap/extension-subscript": "^2.0.0-beta.4",
"@tiptap/extension-superscript": "^2.0.0-beta.4",
- "@tiptap/extension-table": "^2.0.0-beta.30",
+ "@tiptap/extension-table": "^2.0.0-beta.31",
"@tiptap/extension-table-cell": "^2.0.0-beta.15",
"@tiptap/extension-table-header": "^2.0.0-beta.17",
"@tiptap/extension-table-row": "^2.0.0-beta.14",
"@tiptap/extension-task-item": "^2.0.0-beta.18",
"@tiptap/extension-task-list": "^2.0.0-beta.17",
"@tiptap/extension-text": "^2.0.0-beta.13",
- "@tiptap/vue-2": "^2.0.0-beta.50",
+ "@tiptap/vue-2": "^2.0.0-beta.57",
"@toast-ui/editor": "^2.5.2",
"@toast-ui/vue-editor": "^2.5.2",
"apollo-cache-inmemory": "^1.6.6",
"apollo-client": "^2.6.10",
"apollo-link": "^1.2.14",
"apollo-link-batch-http": "^1.2.14",
+ "apollo-link-error": "^1.1.13",
"apollo-link-http": "^1.5.17",
"apollo-upload-client": "^13.0.0",
"autosize": "^4.0.2",
@@ -113,17 +114,17 @@
"codesandbox-api": "0.0.23",
"compression-webpack-plugin": "^5.0.2",
"copy-webpack-plugin": "^6.4.1",
- "core-js": "^3.17.3",
+ "core-js": "^3.18.2",
"cron-validator": "^1.1.1",
"cropper": "^2.3.0",
"css-loader": "^2.1.1",
"d3": "^5.16.0",
"d3-sankey": "^0.12.3",
"d3-selection": "^1.2.0",
- "dateformat": "^4.5.1",
+ "dateformat": "^5.0.1",
"deckar01-task_list": "^2.3.1",
"diff": "^3.4.0",
- "dompurify": "^2.3.2",
+ "dompurify": "^2.3.3",
"dropzone": "^4.2.0",
"editorconfig": "^0.15.3",
"emoji-regex": "^7.0.3",
@@ -147,7 +148,7 @@
"lowlight": "^1.20.0",
"marked": "^0.3.12",
"mathjax": "3",
- "mermaid": "^8.11.5",
+ "mermaid": "^8.13.2",
"minimatch": "^3.0.4",
"monaco-editor": "^0.25.2",
"monaco-editor-webpack-plugin": "^4.0.0",
@@ -160,10 +161,11 @@
"portal-vue": "^2.1.7",
"prismjs": "^1.21.0",
"prosemirror-inputrules": "^1.1.3",
- "prosemirror-markdown": "^1.5.2",
+ "prosemirror-markdown": "^1.6.0",
"prosemirror-model": "^1.14.3",
"prosemirror-state": "^1.3.4",
"prosemirror-tables": "^1.1.1",
+ "prosemirror-view": "^1.20.2",
"raphael": "^2.2.7",
"raw-loader": "^4.0.2",
"scrollparent": "^2.0.1",
@@ -173,7 +175,7 @@
"sql.js": "^0.4.0",
"string-hash": "1.1.3",
"style-loader": "^2.0.0",
- "swagger-ui-dist": "^3.44.1",
+ "swagger-ui-dist": "^3.52.3",
"three": "^0.84.0",
"three-orbit-controls": "^82.1.0",
"three-stl-loader": "^1.0.4",
@@ -203,7 +205,7 @@
},
"devDependencies": {
"@babel/plugin-transform-modules-commonjs": "^7.10.1",
- "@gitlab/eslint-plugin": "9.3.0",
+ "@gitlab/eslint-plugin": "9.4.0",
"@gitlab/stylelint-config": "2.3.0",
"@testing-library/dom": "^7.16.2",
"@vue/test-utils": "1.2.0",
@@ -218,7 +220,7 @@
"custom-jquery-matchers": "^2.1.0",
"docdash": "^1.0.2",
"eslint": "7.32.0",
- "eslint-import-resolver-jest": "3.0.0",
+ "eslint-import-resolver-jest": "3.0.2",
"eslint-import-resolver-webpack": "0.13.1",
"eslint-plugin-no-jquery": "2.6.0",
"gettext-extractor": "^3.5.3",
@@ -244,7 +246,7 @@
"postcss": "^7.0.14",
"prettier": "2.2.1",
"prosemirror-schema-basic": "^1.1.2",
- "prosemirror-schema-list": "^1.1.5",
+ "prosemirror-schema-list": "^1.1.6",
"prosemirror-test-builder": "^1.0.4",
"purgecss": "^4.0.3",
"purgecss-from-html": "^4.0.3",
diff --git a/qa/Gemfile b/qa/Gemfile
index cc2355cdfa3..ee90d049d7b 100644
--- a/qa/Gemfile
+++ b/qa/Gemfile
@@ -3,13 +3,13 @@
source 'https://rubygems.org'
gem 'gitlab-qa', require: 'gitlab/qa'
-gem 'activesupport', '~> 6.1.3.2' # This should stay in sync with the root's Gemfile
-gem 'allure-rspec', '~> 2.14.5'
+gem 'activesupport', '~> 6.1.4.1' # This should stay in sync with the root's Gemfile
+gem 'allure-rspec', '~> 2.15.0'
gem 'capybara', '~> 3.35.0'
gem 'capybara-screenshot', '~> 1.0.23'
gem 'rake', '~> 12.3.3'
gem 'rspec', '~> 3.10'
-gem 'selenium-webdriver', '~> 4.0.0.beta4'
+gem 'selenium-webdriver', '~> 4.0.0.rc1'
gem 'airborne', '~> 0.3.4', require: false # airborne is messing with rspec sandboxed mode so not requiring by default
gem 'rest-client', '~> 2.1.0'
gem 'rspec-retry', '~> 0.6.1', require: 'rspec/retry'
@@ -26,7 +26,7 @@ gem 'webdrivers', '~> 4.6'
gem 'zeitwerk', '~> 2.4'
gem 'influxdb-client', '~> 1.17'
-gem 'chemlab', '~> 0.7'
+gem 'chemlab', '~> 0.9'
gem 'chemlab-library-www-gitlab-com', '~> 0.1'
gem 'deprecation_toolkit', '~> 1.5.1', require: false
diff --git a/qa/Gemfile.lock b/qa/Gemfile.lock
index 5f33afaa77b..153a141d3fd 100644
--- a/qa/Gemfile.lock
+++ b/qa/Gemfile.lock
@@ -2,7 +2,7 @@ GEM
remote: https://rubygems.org/
specs:
abstract_type (0.0.7)
- activesupport (6.1.3.2)
+ activesupport (6.1.4.1)
concurrent-ruby (~> 1.0, >= 1.0.2)
i18n (>= 1.6, < 2)
minitest (>= 5.1)
@@ -19,10 +19,10 @@ GEM
rack-test (>= 1.1.0, < 2.0)
rest-client (>= 2.0.2, < 3.0)
rspec (~> 3.8)
- allure-rspec (2.14.5)
- allure-ruby-commons (= 2.14.5)
+ allure-rspec (2.15.0)
+ allure-ruby-commons (= 2.15.0)
rspec-core (>= 3.8, < 4)
- allure-ruby-commons (2.14.5)
+ allure-ruby-commons (2.15.0)
mime-types (>= 3.3, < 4)
oj (>= 3.10, < 4)
require_all (>= 2, < 4)
@@ -41,7 +41,7 @@ GEM
capybara-screenshot (1.0.23)
capybara (>= 1.0, < 4)
launchy
- chemlab (0.7.2)
+ chemlab (0.9.1)
colorize (~> 0.8)
i18n (~> 1.8)
rake (>= 12, < 14)
@@ -81,10 +81,33 @@ GEM
faraday-net_http (1.0.1)
faraday-net_http_persistent (1.2.0)
faraday-patron (1.0.0)
- gitlab-qa (4.0.0)
+ ffi (1.15.4)
+ ffi-compiler (1.0.1)
+ ffi (>= 1.0.0)
+ rake
+ gitlab (4.16.1)
+ httparty (~> 0.14, >= 0.14.0)
+ terminal-table (~> 1.5, >= 1.5.1)
+ gitlab-qa (7.9.1)
+ activesupport (~> 6.1)
+ gitlab (~> 4.16.1)
+ http (= 4.3.0)
+ nokogiri (~> 1.10)
+ table_print (= 1.5.7)
+ http (4.3.0)
+ addressable (~> 2.3)
+ http-cookie (~> 1.0)
+ http-form_data (~> 2.2)
+ http-parser (~> 1.2.0)
http-accept (1.7.0)
http-cookie (1.0.3)
domain_name (~> 0.5)
+ http-form_data (2.3.0)
+ http-parser (1.2.3)
+ ffi-compiler (>= 1.0, < 2.0)
+ httparty (0.19.0)
+ mime-types (~> 3.0)
+ multi_xml (>= 0.5.2)
i18n (1.8.10)
concurrent-ruby (~> 1.0)
ice_nine (0.11.2)
@@ -104,6 +127,7 @@ GEM
mini_mime (1.1.0)
mini_portile2 (2.5.3)
minitest (5.14.4)
+ multi_xml (0.6.0)
multipart-post (2.1.1)
netrc (0.11.0)
nokogiri (1.11.7)
@@ -112,7 +136,7 @@ GEM
octokit (4.21.0)
faraday (>= 0.9)
sawyer (~> 0.8.0, >= 0.5.3)
- oj (3.13.2)
+ oj (3.13.8)
parallel (1.19.2)
parallel_tests (2.29.0)
parallel
@@ -135,7 +159,7 @@ GEM
rack-test (1.1.0)
rack (>= 1.0, < 3)
rake (12.3.3)
- regexp_parser (1.8.2)
+ regexp_parser (2.1.1)
require_all (3.0.0)
rest-client (2.1.0)
http-accept (>= 1.7.0, < 2.0)
@@ -174,11 +198,14 @@ GEM
sawyer (0.8.2)
addressable (>= 2.3.5)
faraday (> 0.8, < 2.0)
- selenium-webdriver (4.0.0.beta4)
+ selenium-webdriver (4.0.0.rc1)
childprocess (>= 0.5, < 5.0)
rexml (~> 3.2)
rubyzip (>= 1.2.2)
systemu (2.6.5)
+ table_print (1.5.7)
+ terminal-table (1.8.0)
+ unicode-display_width (~> 1.1, >= 1.1.1)
thread_safe (0.3.6)
timecop (0.9.1)
tzinfo (2.0.4)
@@ -186,6 +213,7 @@ GEM
unf (0.1.4)
unf_ext
unf_ext (0.0.7.7)
+ unicode-display_width (1.8.0)
unparser (0.4.7)
abstract_type (~> 0.0.7)
adamantium (~> 0.2.0)
@@ -211,12 +239,12 @@ PLATFORMS
ruby
DEPENDENCIES
- activesupport (~> 6.1.3.2)
+ activesupport (~> 6.1.4.1)
airborne (~> 0.3.4)
- allure-rspec (~> 2.14.5)
+ allure-rspec (~> 2.15.0)
capybara (~> 3.35.0)
capybara-screenshot (~> 1.0.23)
- chemlab (~> 0.7)
+ chemlab (~> 0.9)
chemlab-library-www-gitlab-com (~> 0.1)
deprecation_toolkit (~> 1.5.1)
faker (~> 2.19, >= 2.19.0)
@@ -235,7 +263,7 @@ DEPENDENCIES
rspec-retry (~> 0.6.1)
rspec_junit_formatter (~> 0.4.1)
ruby-debug-ide (~> 0.7.0)
- selenium-webdriver (~> 4.0.0.beta4)
+ selenium-webdriver (~> 4.0.0.rc1)
timecop (~> 0.9.1)
webdrivers (~> 4.6)
zeitwerk (~> 2.4)
diff --git a/qa/chemlab-library-gitlab.gemspec b/qa/chemlab-library-gitlab.gemspec
index 908aad01850..34a55ba8927 100644
--- a/qa/chemlab-library-gitlab.gemspec
+++ b/qa/chemlab-library-gitlab.gemspec
@@ -4,7 +4,7 @@ $:.unshift(File.expand_path('lib', __dir__))
Gem::Specification.new do |spec|
spec.name = 'chemlab-library-gitlab'
- spec.version = '0.1.1'
+ spec.version = '0.3.0'
spec.authors = ['GitLab Quality']
spec.email = ['quality@gitlab.com']
@@ -18,5 +18,5 @@ Gem::Specification.new do |spec|
spec.require_paths = ['lib']
- spec.add_runtime_dependency 'chemlab', '~> 0.7'
+ spec.add_runtime_dependency 'chemlab', '~> 0.9'
end
diff --git a/qa/lib/gitlab.rb b/qa/lib/gitlab.rb
index d0d1d535114..4418e51facb 100644
--- a/qa/lib/gitlab.rb
+++ b/qa/lib/gitlab.rb
@@ -1,19 +1,30 @@
# frozen_string_literal: true
+require 'chemlab/library'
+
# Chemlab Page Libraries for GitLab
module Gitlab
+ include Chemlab::Library
+
module Page
module Main
autoload :Login, 'gitlab/page/main/login'
+ autoload :SignUp, 'gitlab/page/main/sign_up'
end
module Subscriptions
autoload :New, 'gitlab/page/subscriptions/new'
end
+ module Admin
+ autoload :Dashboard, 'gitlab/page/admin/dashboard'
+ autoload :Subscription, 'gitlab/page/admin/subscription'
+ end
+
module Group
module Settings
autoload :Billing, 'gitlab/page/group/settings/billing'
+ autoload :UsageQuotas, 'gitlab/page/group/settings/usage_quotas'
end
end
end
diff --git a/qa/lib/gitlab/page/admin/dashboard.rb b/qa/lib/gitlab/page/admin/dashboard.rb
new file mode 100644
index 00000000000..f1a732f8fac
--- /dev/null
+++ b/qa/lib/gitlab/page/admin/dashboard.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Page
+ module Admin
+ class Dashboard < Chemlab::Page
+ path '/admin'
+
+ h2 :users_in_license
+ h2 :billable_users
+ h3 :number_of_users
+ end
+ end
+ end
+end
diff --git a/qa/lib/gitlab/page/admin/dashboard.stub.rb b/qa/lib/gitlab/page/admin/dashboard.stub.rb
new file mode 100644
index 00000000000..820acf79b9b
--- /dev/null
+++ b/qa/lib/gitlab/page/admin/dashboard.stub.rb
@@ -0,0 +1,81 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Page
+ module Admin
+ module Dashboard
+ # @note Defined as +h2 :users_in_license+
+ # @return [String] The text content or value of +users_in_license+
+ def users_in_license
+ # This is a stub, used for indexing. The method is dynamically generated.
+ end
+
+ # @example
+ # Gitlab::Page::Admin::Dashboard.perform do |dashboard|
+ # expect(dashboard.users_in_license_element).to exist
+ # end
+ # @return [Watir::H2] The raw +H2+ element
+ def users_in_license_element
+ # This is a stub, used for indexing. The method is dynamically generated.
+ end
+
+ # @example
+ # Gitlab::Page::Admin::Dashboard.perform do |dashboard|
+ # expect(dashboard).to be_users_in_license
+ # end
+ # @return [Boolean] true if the +users_in_license+ element is present on the page
+ def users_in_license?
+ # This is a stub, used for indexing. The method is dynamically generated.
+ end
+
+ # @note Defined as +h2 :billable_users+
+ # @return [String] The text content or value of +billable_users+
+ def billable_users
+ # This is a stub, used for indexing. The method is dynamically generated.
+ end
+
+ # @example
+ # Gitlab::Page::Admin::Dashboard.perform do |dashboard|
+ # expect(dashboard.billable_users_element).to exist
+ # end
+ # @return [Watir::H2] The raw +H2+ element
+ def billable_users_element
+ # This is a stub, used for indexing. The method is dynamically generated.
+ end
+
+ # @example
+ # Gitlab::Page::Admin::Dashboard.perform do |dashboard|
+ # expect(dashboard).to be_billable_users
+ # end
+ # @return [Boolean] true if the +billable_users+ element is present on the page
+ def billable_users?
+ # This is a stub, used for indexing. The method is dynamically generated.
+ end
+
+ # @note Defined as +h3 :number_of_users+
+ # @return [String] The text content or value of +number_of_users+
+ def number_of_users
+ # This is a stub, used for indexing. The method is dynamically generated.
+ end
+
+ # @example
+ # Gitlab::Page::Admin::Dashboard.perform do |dashboard|
+ # expect(dashboard.number_of_users_element).to exist
+ # end
+ # @return [Watir::H3] The raw +H3+ element
+ def number_of_users_element
+ # This is a stub, used for indexing. The method is dynamically generated.
+ end
+
+ # @example
+ # Gitlab::Page::Admin::Dashboard.perform do |dashboard|
+ # expect(dashboard).to be_number_of_users
+ # end
+ # @return [Boolean] true if the +number_of_users+ element is present on the page
+ def number_of_users?
+ # This is a stub, used for indexing. The method is dynamically generated.
+ end
+ end
+ end
+ end
+end
diff --git a/qa/lib/gitlab/page/admin/subscription.rb b/qa/lib/gitlab/page/admin/subscription.rb
new file mode 100644
index 00000000000..0f7c6b4c211
--- /dev/null
+++ b/qa/lib/gitlab/page/admin/subscription.rb
@@ -0,0 +1,13 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Page
+ module Admin
+ class Subscription < Chemlab::Page
+ path '/admin/subscription'
+
+ h2 :users_in_subscription
+ end
+ end
+ end
+end
diff --git a/qa/lib/gitlab/page/admin/subscription.stub.rb b/qa/lib/gitlab/page/admin/subscription.stub.rb
new file mode 100644
index 00000000000..51f23e7f0d0
--- /dev/null
+++ b/qa/lib/gitlab/page/admin/subscription.stub.rb
@@ -0,0 +1,33 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Page
+ module Admin
+ module Subscription
+ # @note Defined as +h2 :users_in_subscription+
+ # @return [String] The text content or value of +users_in_subscription+
+ def users_in_subscription
+ # This is a stub, used for indexing. The method is dynamically generated.
+ end
+
+ # @example
+ # Gitlab::Page::Admin::Subscription.perform do |subscription|
+ # expect(subscription.users_in_subscription_element).to exist
+ # end
+ # @return [Watir::H2] The raw +H2+ element
+ def users_in_subscription_element
+ # This is a stub, used for indexing. The method is dynamically generated.
+ end
+
+ # @example
+ # Gitlab::Page::Admin::Subscription.perform do |subscription|
+ # expect(subscription).to be_users_in_subscription
+ # end
+ # @return [Boolean] true if the +users_in_subscription+ element is present on the page
+ def users_in_subscription?
+ # This is a stub, used for indexing. The method is dynamically generated.
+ end
+ end
+ end
+ end
+end
diff --git a/qa/lib/gitlab/page/group/settings/usage_quota.stub.rb b/qa/lib/gitlab/page/group/settings/usage_quota.stub.rb
new file mode 100644
index 00000000000..192e71e6c90
--- /dev/null
+++ b/qa/lib/gitlab/page/group/settings/usage_quota.stub.rb
@@ -0,0 +1,227 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Page
+ module Group
+ module Settings
+ module UsageQuota
+ # @note Defined as +link :pipeline_tab+
+ # Clicks +pipeline_tab+
+ def pipeline_tab
+ # This is a stub, used for indexing. The method is dynamically generated.
+ end
+
+ # @example
+ # Gitlab::Page::Group::Settings::UsageQuota.perform do |usage_quota|
+ # expect(usage_quota.pipeline_tab_element).to exist
+ # end
+ # @return [Watir::Link] The raw +Link+ element
+ def pipeline_tab_element
+ # This is a stub, used for indexing. The method is dynamically generated.
+ end
+
+ # @example
+ # Gitlab::Page::Group::Settings::UsageQuota.perform do |usage_quota|
+ # expect(usage_quota).to be_pipeline_tab
+ # end
+ # @return [Boolean] true if the +pipeline_tab+ element is present on the page
+ def pipeline_tab?
+ # This is a stub, used for indexing. The method is dynamically generated.
+ end
+
+ # @note Defined as +link :storage_tab+
+ # Clicks +storage_tab+
+ def storage_tab
+ # This is a stub, used for indexing. The method is dynamically generated.
+ end
+
+ # @example
+ # Gitlab::Page::Group::Settings::UsageQuota.perform do |usage_quota|
+ # expect(usage_quota.storage_tab_element).to exist
+ # end
+ # @return [Watir::Link] The raw +Link+ element
+ def storage_tab_element
+ # This is a stub, used for indexing. The method is dynamically generated.
+ end
+
+ # @example
+ # Gitlab::Page::Group::Settings::UsageQuota.perform do |usage_quota|
+ # expect(usage_quota).to be_storage_tab
+ # end
+ # @return [Boolean] true if the +storage_tab+ element is present on the page
+ def storage_tab?
+ # This is a stub, used for indexing. The method is dynamically generated.
+ end
+
+ # @note Defined as +link :buy_ci_minutes+
+ # Clicks +buy_ci_minutes+
+ def buy_ci_minutes
+ # This is a stub, used for indexing. The method is dynamically generated.
+ end
+
+ # @example
+ # Gitlab::Page::Group::Settings::UsageQuota.perform do |usage_quota|
+ # expect(usage_quota.buy_ci_minutes_element).to exist
+ # end
+ # @return [Watir::Link] The raw +Link+ element
+ def buy_ci_minutes_element
+ # This is a stub, used for indexing. The method is dynamically generated.
+ end
+
+ # @example
+ # Gitlab::Page::Group::Settings::UsageQuota.perform do |usage_quota|
+ # expect(usage_quota).to be_buy_ci_minutes
+ # end
+ # @return [Boolean] true if the +buy_ci_minutes+ element is present on the page
+ def buy_ci_minutes?
+ # This is a stub, used for indexing. The method is dynamically generated.
+ end
+
+ # @note Defined as +link :buy_storage+
+ # Clicks +buy_storage+
+ def buy_storage
+ # This is a stub, used for indexing. The method is dynamically generated.
+ end
+
+ # @example
+ # Gitlab::Page::Group::Settings::UsageQuota.perform do |usage_quota|
+ # expect(usage_quota.buy_storage_element).to exist
+ # end
+ # @return [Watir::Link] The raw +Link+ element
+ def buy_storage_element
+ # This is a stub, used for indexing. The method is dynamically generated.
+ end
+
+ # @example
+ # Gitlab::Page::Group::Settings::UsageQuota.perform do |usage_quota|
+ # expect(usage_quota).to be_buy_storage
+ # end
+ # @return [Boolean] true if the +buy_storage+ element is present on the page
+ def buy_storage?
+ # This is a stub, used for indexing. The method is dynamically generated.
+ end
+
+ # @note Defined as +strong :additional_minutes+
+ # @return [String] The text content or value of +additional_minutes+
+ def additional_minutes
+ # This is a stub, used for indexing. The method is dynamically generated.
+ end
+
+ # @example
+ # Gitlab::Page::Group::Settings::UsageQuota.perform do |usage_quota|
+ # expect(usage_quota.additional_minutes_element).to exist
+ # end
+ # @return [Watir::Strong] The raw +Strong+ element
+ def additional_minutes_element
+ # This is a stub, used for indexing. The method is dynamically generated.
+ end
+
+ # @example
+ # Gitlab::Page::Group::Settings::UsageQuota.perform do |usage_quota|
+ # expect(usage_quota).to be_additional_minutes
+ # end
+ # @return [Boolean] true if the +additional_minutes+ element is present on the page
+ def additional_minutes?
+ # This is a stub, used for indexing. The method is dynamically generated.
+ end
+
+ # @note Defined as +div :additional_minutes_usage+
+ # @return [String] The text content or value of +additional_minutes_usage+
+ def additional_minutes_usage
+ # This is a stub, used for indexing. The method is dynamically generated.
+ end
+
+ # @example
+ # Gitlab::Page::Group::Settings::UsageQuota.perform do |usage_quota|
+ # expect(usage_quota.additional_minutes_usage_element).to exist
+ # end
+ # @return [Watir::Div] The raw +Div+ element
+ def additional_minutes_usage_element
+ # This is a stub, used for indexing. The method is dynamically generated.
+ end
+
+ # @example
+ # Gitlab::Page::Group::Settings::UsageQuota.perform do |usage_quota|
+ # expect(usage_quota).to be_additional_minutes_usage
+ # end
+ # @return [Boolean] true if the +additional_minutes_usage+ element is present on the page
+ def additional_minutes_usage?
+ # This is a stub, used for indexing. The method is dynamically generated.
+ end
+
+ # @note Defined as +strong :plan_minutes+
+ # @return [String] The text content or value of +plan_minutes+
+ def plan_minutes
+ # This is a stub, used for indexing. The method is dynamically generated.
+ end
+
+ # @example
+ # Gitlab::Page::Group::Settings::UsageQuota.perform do |usage_quota|
+ # expect(usage_quota.plan_minutes_element).to exist
+ # end
+ # @return [Watir::Strong] The raw +Strong+ element
+ def plan_minutes_element
+ # This is a stub, used for indexing. The method is dynamically generated.
+ end
+
+ # @example
+ # Gitlab::Page::Group::Settings::UsageQuota.perform do |usage_quota|
+ # expect(usage_quota).to be_plan_minutes
+ # end
+ # @return [Boolean] true if the +plan_minutes+ element is present on the page
+ def plan_minutes?
+ # This is a stub, used for indexing. The method is dynamically generated.
+ end
+
+ # @note Defined as +div :plan_minutes_usage+
+ # @return [String] The text content or value of +plan_minutes_usage+
+ def plan_minutes_usage
+ # This is a stub, used for indexing. The method is dynamically generated.
+ end
+
+ # @example
+ # Gitlab::Page::Group::Settings::UsageQuota.perform do |usage_quota|
+ # expect(usage_quota.plan_minutes_usage_element).to exist
+ # end
+ # @return [Watir::Div] The raw +Div+ element
+ def plan_minutes_usage_element
+ # This is a stub, used for indexing. The method is dynamically generated.
+ end
+
+ # @example
+ # Gitlab::Page::Group::Settings::UsageQuota.perform do |usage_quota|
+ # expect(usage_quota).to be_plan_minutes_usage
+ # end
+ # @return [Boolean] true if the +plan_minutes_usage+ element is present on the page
+ def plan_minutes_usage?
+ # This is a stub, used for indexing. The method is dynamically generated.
+ end
+
+ # @note Defined as +div :purchase_successful_alert+
+ # @return [String] The text content or value of +purchase_successful_alert+
+ def purchase_successful_alert
+ # This is a stub, used for indexing. The method is dynamically generated.
+ end
+
+ # @example
+ # Gitlab::Page::Group::Settings::UsageQuota.perform do |usage_quota|
+ # expect(usage_quota.purchase_successful_alert_element).to exist
+ # end
+ # @return [Watir::Div] The raw +Div+ element
+ def purchase_successful_alert_element
+ # This is a stub, used for indexing. The method is dynamically generated.
+ end
+
+ # @example
+ # Gitlab::Page::Group::Settings::UsageQuota.perform do |usage_quota|
+ # expect(usage_quota).to be_purchase_successful_alert
+ # end
+ # @return [Boolean] true if the +purchase_successful_alert+ element is present on the page
+ def purchase_successful_alert?
+ # This is a stub, used for indexing. The method is dynamically generated.
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/qa/lib/gitlab/page/group/settings/usage_quotas.rb b/qa/lib/gitlab/page/group/settings/usage_quotas.rb
new file mode 100644
index 00000000000..455a695f703
--- /dev/null
+++ b/qa/lib/gitlab/page/group/settings/usage_quotas.rb
@@ -0,0 +1,27 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Page
+ module Group
+ module Settings
+ class UsageQuotas < Chemlab::Page
+ link :pipeline_tab, id: 'pipelines-quota'
+ link :storage_tab, id: 'storage-quota'
+ link :buy_ci_minutes, text: 'Buy additional minutes'
+ link :buy_storage, text: /Purchase more storage/
+ strong :additional_minutes, text: 'Additional minutes'
+ div(:additional_minutes_usage) { additional_minutes_element.following_sibling.span }
+ div :purchase_successful_alert, text: /You have successfully purchased CI minutes/
+
+ def plan_minutes_limits
+ plan_minutes_usage[%r{([^/ ]+)$}]
+ end
+
+ def additional_limits
+ additional_minutes_usage[%r{([^/ ]+)$}]
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/qa/lib/gitlab/page/main/login.rb b/qa/lib/gitlab/page/main/login.rb
index 9f20a040550..de05df1a086 100644
--- a/qa/lib/gitlab/page/main/login.rb
+++ b/qa/lib/gitlab/page/main/login.rb
@@ -10,11 +10,27 @@ module Gitlab
text_field :password_field
button :sign_in_button
- def sign_in_as(username:, password:)
+ button :accept_terms, text: 'Accept terms'
+
+ # password change tab
+ text_field :password_confirmation_field
+ button :change_password_button
+
+ # Sign in using a given username and password
+ # @note this will also automatically accept terms if prompted
+ # @param [String] username the username to sign in with
+ # @param [String] password the password to sign in with
+ # @example
+ # Page::Main::Login.perform do |login|
+ # login.sign_in_as(username: 'username', password: 'password')
+ # login.sign_in_as(username: 'username', password: 'password', accept_terms: false)
+ # end
+ def sign_in_as(username:, password:, accept_terms: true)
self.login_field = username
self.password_field = password
sign_in_button
+ self.accept_terms if accept_terms && accept_terms?
end
end
end
diff --git a/qa/lib/gitlab/page/main/login.stub.rb b/qa/lib/gitlab/page/main/login.stub.rb
index a4cef291616..a819ca4bcc8 100644
--- a/qa/lib/gitlab/page/main/login.stub.rb
+++ b/qa/lib/gitlab/page/main/login.stub.rb
@@ -95,6 +95,88 @@ module Gitlab
def sign_in_button?
# This is a stub, used for indexing. The method is dynamically generated.
end
+
+ # @note Defined as +button :accept_terms+
+ # Clicks +accept_terms+
+ def accept_terms
+ # This is a stub, used for indexing. The method is dynamically generated.
+ end
+
+ # @example
+ # Gitlab::Page::Main::Login.perform do |login|
+ # expect(login.accept_terms_element).to exist
+ # end
+ # @return [Watir::Button] The raw +Button+ element
+ def accept_terms_element
+ # This is a stub, used for indexing. The method is dynamically generated.
+ end
+
+ # @example
+ # Gitlab::Page::Main::Login.perform do |login|
+ # expect(login).to be_accept_terms
+ # end
+ # @return [Boolean] true if the +accept_terms+ element is present on the page
+ def accept_terms?
+ # This is a stub, used for indexing. The method is dynamically generated.
+ end
+
+ # @note Defined as +text_field :password_confirmation_field+
+ # @return [String] The text content or value of +password_confirmation_field+
+ def password_confirmation_field
+ # This is a stub, used for indexing. The method is dynamically generated.
+ end
+
+ # Set the value of password_confirmation_field
+ # @example
+ # Gitlab::Page::Main::Login.perform do |login|
+ # login.password_confirmation_field = 'value'
+ # end
+ # @param value [String] The value to set.
+ def password_confirmation_field=(value)
+ # This is a stub, used for indexing. The method is dynamically generated.
+ end
+
+ # @example
+ # Gitlab::Page::Main::Login.perform do |login|
+ # expect(login.password_confirmation_field_element).to exist
+ # end
+ # @return [Watir::TextField] The raw +TextField+ element
+ def password_confirmation_field_element
+ # This is a stub, used for indexing. The method is dynamically generated.
+ end
+
+ # @example
+ # Gitlab::Page::Main::Login.perform do |login|
+ # expect(login).to be_password_confirmation_field
+ # end
+ # @return [Boolean] true if the +password_confirmation_field+ element is present on the page
+ def password_confirmation_field?
+ # This is a stub, used for indexing. The method is dynamically generated.
+ end
+
+ # @note Defined as +button :change_password_button+
+ # Clicks +change_password_button+
+ def change_password_button
+ # This is a stub, used for indexing. The method is dynamically generated.
+ end
+
+ # @example
+ # Gitlab::Page::Main::Login.perform do |login|
+ # expect(login.change_password_button_element).to exist
+ # end
+ # @return [Watir::Button] The raw +Button+ element
+ def change_password_button_element
+ # This is a stub, used for indexing. The method is dynamically generated.
+ end
+
+ # @example
+ # Gitlab::Page::Main::Login.perform do |login|
+ # expect(login).to be_change_password_button
+ # end
+ # @return [Boolean] true if the +change_password_button+ element is present on the page
+ def change_password_button?
+ # This is a stub, used for indexing. The method is dynamically generated.
+ end
end
end
end
diff --git a/qa/lib/gitlab/page/main/sign_up.rb b/qa/lib/gitlab/page/main/sign_up.rb
new file mode 100644
index 00000000000..85d7f482461
--- /dev/null
+++ b/qa/lib/gitlab/page/main/sign_up.rb
@@ -0,0 +1,36 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Page
+ module Main
+ class SignUp < Chemlab::Page
+ path '/users/sign_up'
+
+ # TODO: Refactor data-qa-selectors to be more terse
+ text_field :first_name, 'data-qa-selector': 'new_user_first_name_field'
+ text_field :last_name, 'data-qa-selector': 'new_user_last_name_field'
+
+ text_field :username, 'data-qa-selector': 'new_user_username_field'
+
+ text_field :email, 'data-qa-selector': 'new_user_email_field'
+ text_field :password, 'data-qa-selector': 'new_user_password_field'
+
+ button :register, 'data-qa-selector': 'new_user_register_button'
+
+ # Register a user
+ # @param [Resource::User] user the user to register
+ def register_user(user)
+ raise ArgumentError, 'User must be of type Resource::User' unless user.is_a? ::QA::Resource::User
+
+ self.first_name = user.first_name
+ self.last_name = user.last_name
+ self.username = user.username
+ self.email = user.email
+ self.password = user.password
+
+ self.register
+ end
+ end
+ end
+ end
+end
diff --git a/qa/lib/gitlab/page/main/sign_up.stub.rb b/qa/lib/gitlab/page/main/sign_up.stub.rb
new file mode 100644
index 00000000000..881bd922c45
--- /dev/null
+++ b/qa/lib/gitlab/page/main/sign_up.stub.rb
@@ -0,0 +1,203 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Page
+ module Main
+ module SignUp
+ # @note Defined as +text_field :first_name+
+ # @return [String] The text content or value of +first_name+
+ def first_name
+ # This is a stub, used for indexing. The method is dynamically generated.
+ end
+
+ # Set the value of first_name
+ # @example
+ # Gitlab::Page::Main::SignUp.perform do |sign_up|
+ # sign_up.first_name = 'value'
+ # end
+ # @param value [String] The value to set.
+ def first_name=(value)
+ # This is a stub, used for indexing. The method is dynamically generated.
+ end
+
+ # @example
+ # Gitlab::Page::Main::SignUp.perform do |sign_up|
+ # expect(sign_up.first_name_element).to exist
+ # end
+ # @return [Watir::TextField] The raw +TextField+ element
+ def first_name_element
+ # This is a stub, used for indexing. The method is dynamically generated.
+ end
+
+ # @example
+ # Gitlab::Page::Main::SignUp.perform do |sign_up|
+ # expect(sign_up).to be_first_name
+ # end
+ # @return [Boolean] true if the +first_name+ element is present on the page
+ def first_name?
+ # This is a stub, used for indexing. The method is dynamically generated.
+ end
+
+ # @note Defined as +text_field :last_name+
+ # @return [String] The text content or value of +last_name+
+ def last_name
+ # This is a stub, used for indexing. The method is dynamically generated.
+ end
+
+ # Set the value of last_name
+ # @example
+ # Gitlab::Page::Main::SignUp.perform do |sign_up|
+ # sign_up.last_name = 'value'
+ # end
+ # @param value [String] The value to set.
+ def last_name=(value)
+ # This is a stub, used for indexing. The method is dynamically generated.
+ end
+
+ # @example
+ # Gitlab::Page::Main::SignUp.perform do |sign_up|
+ # expect(sign_up.last_name_element).to exist
+ # end
+ # @return [Watir::TextField] The raw +TextField+ element
+ def last_name_element
+ # This is a stub, used for indexing. The method is dynamically generated.
+ end
+
+ # @example
+ # Gitlab::Page::Main::SignUp.perform do |sign_up|
+ # expect(sign_up).to be_last_name
+ # end
+ # @return [Boolean] true if the +last_name+ element is present on the page
+ def last_name?
+ # This is a stub, used for indexing. The method is dynamically generated.
+ end
+
+ # @note Defined as +text_field :username+
+ # @return [String] The text content or value of +username+
+ def username
+ # This is a stub, used for indexing. The method is dynamically generated.
+ end
+
+ # Set the value of username
+ # @example
+ # Gitlab::Page::Main::SignUp.perform do |sign_up|
+ # sign_up.username = 'value'
+ # end
+ # @param value [String] The value to set.
+ def username=(value)
+ # This is a stub, used for indexing. The method is dynamically generated.
+ end
+
+ # @example
+ # Gitlab::Page::Main::SignUp.perform do |sign_up|
+ # expect(sign_up.username_element).to exist
+ # end
+ # @return [Watir::TextField] The raw +TextField+ element
+ def username_element
+ # This is a stub, used for indexing. The method is dynamically generated.
+ end
+
+ # @example
+ # Gitlab::Page::Main::SignUp.perform do |sign_up|
+ # expect(sign_up).to be_username
+ # end
+ # @return [Boolean] true if the +username+ element is present on the page
+ def username?
+ # This is a stub, used for indexing. The method is dynamically generated.
+ end
+
+ # @note Defined as +text_field :email+
+ # @return [String] The text content or value of +email+
+ def email
+ # This is a stub, used for indexing. The method is dynamically generated.
+ end
+
+ # Set the value of email
+ # @example
+ # Gitlab::Page::Main::SignUp.perform do |sign_up|
+ # sign_up.email = 'value'
+ # end
+ # @param value [String] The value to set.
+ def email=(value)
+ # This is a stub, used for indexing. The method is dynamically generated.
+ end
+
+ # @example
+ # Gitlab::Page::Main::SignUp.perform do |sign_up|
+ # expect(sign_up.email_element).to exist
+ # end
+ # @return [Watir::TextField] The raw +TextField+ element
+ def email_element
+ # This is a stub, used for indexing. The method is dynamically generated.
+ end
+
+ # @example
+ # Gitlab::Page::Main::SignUp.perform do |sign_up|
+ # expect(sign_up).to be_email
+ # end
+ # @return [Boolean] true if the +email+ element is present on the page
+ def email?
+ # This is a stub, used for indexing. The method is dynamically generated.
+ end
+
+ # @note Defined as +text_field :password+
+ # @return [String] The text content or value of +password+
+ def password
+ # This is a stub, used for indexing. The method is dynamically generated.
+ end
+
+ # Set the value of password
+ # @example
+ # Gitlab::Page::Main::SignUp.perform do |sign_up|
+ # sign_up.password = 'value'
+ # end
+ # @param value [String] The value to set.
+ def password=(value)
+ # This is a stub, used for indexing. The method is dynamically generated.
+ end
+
+ # @example
+ # Gitlab::Page::Main::SignUp.perform do |sign_up|
+ # expect(sign_up.password_element).to exist
+ # end
+ # @return [Watir::TextField] The raw +TextField+ element
+ def password_element
+ # This is a stub, used for indexing. The method is dynamically generated.
+ end
+
+ # @example
+ # Gitlab::Page::Main::SignUp.perform do |sign_up|
+ # expect(sign_up).to be_password
+ # end
+ # @return [Boolean] true if the +password+ element is present on the page
+ def password?
+ # This is a stub, used for indexing. The method is dynamically generated.
+ end
+
+ # @note Defined as +button :register+
+ # Clicks +register+
+ def register
+ # This is a stub, used for indexing. The method is dynamically generated.
+ end
+
+ # @example
+ # Gitlab::Page::Main::SignUp.perform do |sign_up|
+ # expect(sign_up.register_element).to exist
+ # end
+ # @return [Watir::Button] The raw +Button+ element
+ def register_element
+ # This is a stub, used for indexing. The method is dynamically generated.
+ end
+
+ # @example
+ # Gitlab::Page::Main::SignUp.perform do |sign_up|
+ # expect(sign_up).to be_register
+ # end
+ # @return [Boolean] true if the +register+ element is present on the page
+ def register?
+ # This is a stub, used for indexing. The method is dynamically generated.
+ end
+ end
+ end
+ end
+end
diff --git a/qa/lib/gitlab/page/subscriptions/new.rb b/qa/lib/gitlab/page/subscriptions/new.rb
index 4c0e5446444..6e3cb45fd29 100644
--- a/qa/lib/gitlab/page/subscriptions/new.rb
+++ b/qa/lib/gitlab/page/subscriptions/new.rb
@@ -6,10 +6,11 @@ module Gitlab
class New < Chemlab::Page
path '/subscriptions/new'
- # Subscription Details
+ # Purchase Details
select :plan_name
select :group_name
text_field :number_of_users
+ text_field :quantity
button :continue_to_billing, text: /Continue to billing/
# Billing address
@@ -35,6 +36,10 @@ module Gitlab
# Confirmation
button :confirm_purchase, text: /Confirm purchase/
+
+ # Order Summary
+ div :selected_plan, 'data-testid': 'selected-plan'
+ div :order_total, 'data-testid': 'total-amount'
end
end
end
diff --git a/qa/qa/page/component/issue_board/show.rb b/qa/qa/page/component/issue_board/show.rb
index 1c1f7ab17f3..4b842412c0f 100644
--- a/qa/qa/page/component/issue_board/show.rb
+++ b/qa/qa/page/component/issue_board/show.rb
@@ -48,7 +48,7 @@ module QA
# with the attribute `data-qa-selector` since such element is not unique when the
# `is-focused` class is not set, and it was not possible to find a better solution.
def focused_board
- find('.issue-boards-content.js-focus-mode-board.is-focused')
+ find('.js-focus-mode-board.is-focused')
end
def boards_dropdown
diff --git a/qa/qa/page/component/snippet.rb b/qa/qa/page/component/snippet.rb
index 73f41e0aa51..ad264bd6d56 100644
--- a/qa/qa/page/component/snippet.rb
+++ b/qa/qa/page/component/snippet.rb
@@ -79,6 +79,11 @@ module QA
element :default_actions_container
element :copy_contents_button
end
+
+ base.view 'app/views/layouts/nav/_breadcrumbs.html.haml' do
+ element :breadcrumb_links_content
+ element :breadcrumb_sub_title_content
+ end
end
def has_snippet_title?(snippet_title)
@@ -249,6 +254,12 @@ module QA
raise ElementNotFound, "Comment did not appear as expected"
end
end
+
+ def snippet_id
+ within_element(:breadcrumb_links_content) do
+ find_element(:breadcrumb_sub_title_content).text.delete_prefix('$')
+ end
+ end
end
end
end
diff --git a/qa/qa/page/component/web_ide/web_terminal_panel.rb b/qa/qa/page/component/web_ide/web_terminal_panel.rb
new file mode 100644
index 00000000000..80f83bcff7c
--- /dev/null
+++ b/qa/qa/page/component/web_ide/web_terminal_panel.rb
@@ -0,0 +1,63 @@
+# frozen_string_literal: true
+
+module QA
+ module Page
+ module Component
+ module WebIDE
+ module WebTerminalPanel
+ extend QA::Page::PageConcern
+
+ def self.prepended(base)
+ super
+
+ base.class_eval do
+ view 'app/assets/javascripts/ide/components/panes/collapsible_sidebar.vue' do
+ element :ide_right_sidebar, %q(:data-qa-selector="`ide_${side}_sidebar`") # rubocop:disable QA/ElementWithPattern
+ end
+
+ view 'app/assets/javascripts/ide/components/ide_sidebar_nav.vue' do
+ element :terminal_tab_button, %q(:data-qa-selector="`${tab.title.toLowerCase()}_tab_button`") # rubocop:disable QA/ElementWithPattern
+ end
+
+ view 'app/assets/javascripts/ide/components/terminal/empty_state.vue' do
+ element :start_web_terminal_button
+ end
+
+ view 'app/assets/javascripts/ide/components/terminal/terminal.vue' do
+ element :loading_container
+ element :terminal_screen
+ end
+ end
+ end
+
+ def has_finished_loading?
+ has_no_element?(:loading_container, wait: QA::Support::Repeater::DEFAULT_MAX_WAIT_TIME)
+ end
+
+ def has_terminal_screen?
+ wait_until(reload: false) do
+ within_element :terminal_screen do
+ # The DOM initially just includes the :terminal_screen element
+ # and then the xterm package dynamically loads when the user
+ # clicks the Start Web Terminal button. If it loads succesfully
+ # an element with the class `xterm` is added to the DOM.
+ # The xterm is a third-party library, so we can't add a selector
+ find(".xterm")
+ end
+ end
+ end
+
+ def start_web_terminal
+ within_element :ide_right_sidebar do
+ click_element :terminal_tab_button
+ end
+
+ click_element :start_web_terminal_button
+
+ has_element? :loading_container, text: "Starting"
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/qa/qa/page/group/bulk_import.rb b/qa/qa/page/group/bulk_import.rb
index b9497aeb6e5..a62823f3469 100644
--- a/qa/qa/page/group/bulk_import.rb
+++ b/qa/qa/page/group/bulk_import.rb
@@ -33,7 +33,12 @@ module QA
within_element(:import_item, source_group: source_group_name) do
click_element(:target_namespace_selector_dropdown)
click_element(:target_group_dropdown_item, group_name: target_group_name)
- click_element(:import_group_button)
+
+ retry_until do
+ click_element(:import_group_button)
+ # Make sure import started before waiting for completion
+ has_no_element?(:import_status_indicator, text: "Not started", wait: 1)
+ end
end
end
diff --git a/qa/qa/page/group/dependency_proxy.rb b/qa/qa/page/group/dependency_proxy.rb
index f637c79cffc..fa37e8eac83 100644
--- a/qa/qa/page/group/dependency_proxy.rb
+++ b/qa/qa/page/group/dependency_proxy.rb
@@ -4,19 +4,10 @@ module QA
module Page
module Group
class DependencyProxy < QA::Page::Base
- view 'app/views/groups/dependency_proxies/show.html.haml' do
- element :dependency_proxy_setting_toggle
- end
-
- view 'app/views/groups/dependency_proxies/_url.html.haml' do
+ view 'app/assets/javascripts/packages_and_registries/dependency_proxy/app.vue' do
element :dependency_proxy_count
end
- def has_dependency_proxy_enabled?
- toggle = find_element(:dependency_proxy_setting_toggle)
- toggle[:class].include?('is-checked')
- end
-
def has_blob_count?(blob_text)
has_element?(:dependency_proxy_count, text: blob_text)
end
diff --git a/qa/qa/page/group/settings/package_registries.rb b/qa/qa/page/group/settings/package_registries.rb
index 8a2802b0035..5c93c0d6222 100644
--- a/qa/qa/page/group/settings/package_registries.rb
+++ b/qa/qa/page/group/settings/package_registries.rb
@@ -7,15 +7,17 @@ module QA
class PackageRegistries < QA::Page::Base
include ::QA::Page::Settings::Common
- view 'app/assets/javascripts/packages_and_registries/settings/group/components/group_settings_app.vue' do
+ view 'app/assets/javascripts/packages_and_registries/settings/group/components/packages_settings.vue' do
element :package_registry_settings_content
- end
-
- view 'app/assets/javascripts/packages_and_registries/settings/group/components/group_settings_app.vue' do
element :allow_duplicates_toggle
element :allow_duplicates_label
end
+ view 'app/assets/javascripts/packages_and_registries/settings/group/components/dependency_proxy_settings.vue' do
+ element :dependency_proxy_settings_content
+ element :dependency_proxy_setting_toggle
+ end
+
def set_allow_duplicates_disabled
expand_content :package_registry_settings_content do
click_element(:allow_duplicates_toggle) if duplicates_enabled?
@@ -35,6 +37,15 @@ module QA
def duplicates_disabled?
has_element?(:allow_duplicates_label, text: 'Do not allow duplicates')
end
+
+ def has_dependency_proxy_enabled?
+ expand_content :dependency_proxy_settings_content do
+ within_element :dependency_proxy_setting_toggle do
+ toggle = find('button.gl-toggle')
+ toggle[:class].include?('is-checked')
+ end
+ end
+ end
end
end
end
diff --git a/qa/qa/page/merge_request/new.rb b/qa/qa/page/merge_request/new.rb
index 71e51ddd504..bcc60a8275d 100644
--- a/qa/qa/page/merge_request/new.rb
+++ b/qa/qa/page/merge_request/new.rb
@@ -20,6 +20,13 @@ module QA
element :file_name_content
end
+ def has_secure_description?(scanner_name)
+ scanner_url_name = scanner_name.downcase.tr('_', '-')
+ "Configure #{scanner_name} in `.gitlab-ci.yml` using the GitLab managed template. You can " \
+ "[add variable overrides](https://docs.gitlab.com/ee/user/application_security/#{scanner_url_name}/#customizing-the-#{scanner_url_name}-settings) " \
+ "to customize #{scanner_name} settings."
+ end
+
def create_merge_request
click_element(:issuable_create_button, Page::MergeRequest::Show)
end
diff --git a/qa/qa/page/merge_request/show.rb b/qa/qa/page/merge_request/show.rb
index 1d8d9ed6859..d4fa3b38f02 100644
--- a/qa/qa/page/merge_request/show.rb
+++ b/qa/qa/page/merge_request/show.rb
@@ -25,6 +25,11 @@ module QA
view 'app/assets/javascripts/diffs/components/compare_versions.vue' do
element :target_version_dropdown
+ element :file_tree_button
+ end
+
+ view 'app/assets/javascripts/diffs/components/tree_list.vue' do
+ element :file_tree_container
end
view 'app/assets/javascripts/diffs/components/diff_file_header.vue' do
@@ -93,7 +98,6 @@ module QA
end
view 'app/assets/javascripts/vue_shared/components/markdown/suggestion_diff_header.vue' do
- element :apply_suggestions_batch_button
element :add_suggestion_batch_button
end
@@ -187,11 +191,17 @@ module QA
end
def has_file?(file_name)
- has_element?(:file_name_content, text: file_name)
+ open_file_tree
+ has_element?(:file_name_content, file_name: file_name)
end
def has_no_file?(file_name)
- has_no_element?(:file_name_content, text: file_name)
+ open_file_tree
+ has_no_element?(:file_name_content, file_name: file_name)
+ end
+
+ def open_file_tree
+ click_element(:file_tree_button) unless has_element?(:file_tree_container)
end
def has_merge_button?
@@ -202,7 +212,7 @@ module QA
def has_pipeline_status?(text)
# Pipelines can be slow, so we wait a bit longer than the usual 10 seconds
- wait_until(sleep_interval: 5, reload: false) do
+ wait_until(max_duration: 120, sleep_interval: 5, reload: true) do
has_element?(:merge_request_pipeline_info_content, text: text, wait: 15 )
end
end
@@ -288,13 +298,11 @@ module QA
end
def merge_immediately!
- merge_moment_dropdown_found = has_element?(:merge_moment_dropdown, wait: 0)
-
- if merge_moment_dropdown_found
- click_element(:merge_moment_dropdown)
- click_element(:merge_immediately_menu_item)
+ if has_element?(:merge_moment_dropdown)
+ click_element(:merge_moment_dropdown, skip_finished_loading_check: true)
+ click_element(:merge_immediately_menu_item, skip_finished_loading_check: true)
else
- click_element(:merge_button)
+ click_element(:merge_button, skip_finished_loading_check: true)
end
end
@@ -355,10 +363,6 @@ module QA
all_elements(:add_suggestion_batch_button, minimum: 1).first.click
end
- def apply_suggestions_batch
- all_elements(:apply_suggestions_batch_button, minimum: 1).first.click
- end
-
def cherry_pick!
click_element(:cherry_pick_button, Page::Component::CommitModal)
click_element(:submit_commit_button)
diff --git a/qa/qa/page/profile/two_factor_auth.rb b/qa/qa/page/profile/two_factor_auth.rb
index a0dd230d8ab..63593bf0482 100644
--- a/qa/qa/page/profile/two_factor_auth.rb
+++ b/qa/qa/page/profile/two_factor_auth.rb
@@ -11,6 +11,7 @@ module QA
view 'app/views/profiles/two_factor_auths/show.html.haml' do
element :otp_secret_content
element :pin_code_field
+ element :current_password_field
element :register_2fa_app_button
end
@@ -33,6 +34,10 @@ module QA
fill_element(:pin_code_field, pin_code)
end
+ def set_current_password(password)
+ fill_element(:current_password_field, password)
+ end
+
def click_register_2fa_app_button
click_element :register_2fa_app_button
end
diff --git a/qa/qa/page/project/artifact/show.rb b/qa/qa/page/project/artifact/show.rb
index 437363d4a98..5e05eec79f0 100644
--- a/qa/qa/page/project/artifact/show.rb
+++ b/qa/qa/page/project/artifact/show.rb
@@ -9,8 +9,10 @@ module QA
element :directory_name_link
end
- def go_to_directory(name)
- click_element(:directory_name_link, directory_name: name)
+ def go_to_directory(name, retry_attempts = 1)
+ retry_on_exception(max_attempts: retry_attempts, reload: true, sleep_interval: 10) do
+ click_element(:directory_name_link, directory_name: name)
+ end
end
end
end
diff --git a/qa/qa/page/project/import/repo_by_url.rb b/qa/qa/page/project/import/repo_by_url.rb
index 0e7524a181a..4a8d08d6499 100644
--- a/qa/qa/page/project/import/repo_by_url.rb
+++ b/qa/qa/page/project/import/repo_by_url.rb
@@ -5,10 +5,9 @@ module QA
module Project
module Import
class RepoByURL < Page::Base
- include Page::Component::Select2
-
- view 'app/views/projects/_new_project_fields.html.haml' do
+ view 'app/assets/javascripts/projects/new/components/new_project_url_select.vue' do
element :select_namespace_dropdown
+ element :select_namespace_dropdown_search_field
end
def import!(gitlab_repo_path, name)
@@ -33,8 +32,15 @@ module QA
end
def choose_test_namespace
- find('.js-select-namespace').click
- search_and_select(Runtime::Namespace.path)
+ choose_namespace(Runtime::Namespace.path)
+ end
+
+ def choose_namespace(namespace)
+ retry_on_exception do
+ click_element :select_namespace_dropdown
+ fill_element :select_namespace_dropdown_search_field, namespace
+ click_button namespace
+ end
end
def click_create_button
diff --git a/qa/qa/page/project/new.rb b/qa/qa/page/project/new.rb
index 06e476f009a..3ecdabeeed2 100644
--- a/qa/qa/page/project/new.rb
+++ b/qa/qa/page/project/new.rb
@@ -5,7 +5,6 @@ module QA
module Project
class New < Page::Base
include Page::Component::Project::Templates
- include Page::Component::Select2
include Page::Component::VisibilitySetting
include Layout::Flash
@@ -14,7 +13,6 @@ module QA
view 'app/views/projects/_new_project_fields.html.haml' do
element :initialize_with_readme_checkbox
- element :project_namespace_select
element :project_namespace_field, 'namespaces_options' # rubocop:disable QA/ElementWithPattern
element :project_name, 'text_field :name' # rubocop:disable QA/ElementWithPattern
element :project_path, 'text_field :path' # rubocop:disable QA/ElementWithPattern
@@ -28,6 +26,11 @@ module QA
element :template_option_row
end
+ view 'app/assets/javascripts/projects/new/components/new_project_url_select.vue' do
+ element :select_namespace_dropdown
+ element :select_namespace_dropdown_search_field
+ end
+
view 'app/assets/javascripts/vue_shared/new_namespace/components/welcome.vue' do
element :panel_link
end
@@ -46,8 +49,9 @@ module QA
def choose_namespace(namespace)
retry_on_exception do
- click_element :project_namespace_select unless dropdown_open?
- search_and_select(namespace)
+ click_element :select_namespace_dropdown
+ fill_element :select_namespace_dropdown_search_field, namespace
+ click_button namespace
end
end
diff --git a/qa/qa/page/project/packages/show.rb b/qa/qa/page/project/packages/show.rb
index 59e9a3752c7..4872c0bc705 100644
--- a/qa/qa/page/project/packages/show.rb
+++ b/qa/qa/page/project/packages/show.rb
@@ -5,7 +5,7 @@ module QA
module Project
module Packages
class Show < QA::Page::Base
- view 'app/assets/javascripts/packages/details/components/app.vue' do
+ view 'app/assets/javascripts/packages_and_registries/package_registry/components/details/app.vue' do
element :delete_button
element :delete_modal_button
element :package_information_content
diff --git a/qa/qa/page/project/registry/show.rb b/qa/qa/page/project/registry/show.rb
index 03c547fc8b5..f2472a83401 100644
--- a/qa/qa/page/project/registry/show.rb
+++ b/qa/qa/page/project/registry/show.rb
@@ -10,6 +10,10 @@ module QA
end
view 'app/assets/javascripts/registry/explorer/components/details_page/tags_list_row.vue' do
+ element :more_actions_menu
+ end
+
+ view 'app/assets/javascripts/registry/explorer/components/details_page/tags_list_row.vue' do
element :tag_delete_button
end
@@ -30,6 +34,7 @@ module QA
end
def click_delete
+ click_element(:more_actions_menu)
click_element(:tag_delete_button)
find_button('Delete').click
end
diff --git a/qa/qa/page/project/secure/configuration_form.rb b/qa/qa/page/project/secure/configuration_form.rb
index 73d1601b61e..3e89a57e870 100644
--- a/qa/qa/page/project/secure/configuration_form.rb
+++ b/qa/qa/page/project/secure/configuration_form.rb
@@ -9,19 +9,31 @@ module QA
include QA::Page::Settings::Common
view 'app/assets/javascripts/security_configuration/components/feature_card.vue' do
+ element :dependency_scanning_status, "`${feature.type}_status`" # rubocop:disable QA/ElementWithPattern
element :sast_status, "`${feature.type}_status`" # rubocop:disable QA/ElementWithPattern
element :sast_enable_button, "`${feature.type}_enable_button`" # rubocop:disable QA/ElementWithPattern
+ element :dependency_scanning_mr_button, "`${feature.type}_mr_button`" # rubocop:disable QA/ElementWithPattern
end
def click_sast_enable_button
click_element(:sast_enable_button)
end
+ def click_dependency_scanning_mr_button
+ click_element(:dependency_scanning_mr_button)
+ end
+
def has_sast_status?(status_text)
within_element(:sast_status) do
has_text?(status_text)
end
end
+
+ def has_dependency_scanning_status?(status_text)
+ within_element(:dependency_scanning_status) do
+ has_text?(status_text)
+ end
+ end
end
end
end
diff --git a/qa/qa/page/project/web_ide/edit.rb b/qa/qa/page/project/web_ide/edit.rb
index 78b2db7d723..9c0a3ab691c 100644
--- a/qa/qa/page/project/web_ide/edit.rb
+++ b/qa/qa/page/project/web_ide/edit.rb
@@ -6,6 +6,7 @@ module QA
module WebIDE
class Edit < Page::Base
prepend Page::Component::WebIDE::Alert
+ prepend Page::Component::WebIDE::WebTerminalPanel
include Page::Component::DropdownFilter
view 'app/assets/javascripts/ide/components/activity_bar.vue' do
@@ -330,5 +331,3 @@ module QA
end
end
end
-
-QA::Page::Project::WebIDE::Edit.prepend_mod_with('Page::Component::WebIDE::WebTerminalPanel', namespace: QA)
diff --git a/qa/qa/resource/api_fabricator.rb b/qa/qa/resource/api_fabricator.rb
index c1533577657..b94fa543b48 100644
--- a/qa/qa/resource/api_fabricator.rb
+++ b/qa/qa/resource/api_fabricator.rb
@@ -96,31 +96,35 @@ module QA
end
def api_post
- if api_post_path == "/graphql"
- graphql_response = post(
- Runtime::API::Request.new(api_client, api_post_path).url,
- query: api_post_body)
+ process_api_response(api_post_to(api_post_path, api_post_body))
+ end
+
+ def api_post_to(post_path, post_body)
+ if post_path == "/graphql"
+ graphql_response = post(Runtime::API::Request.new(api_client, post_path).url, query: post_body)
- flattened_response = flatten_hash(parse_body(graphql_response))
+ body = flatten_hash(parse_body(graphql_response))
- unless graphql_response.code == HTTP_STATUS_OK && flattened_response[:errors].empty?
- raise ResourceFabricationFailedError, "Fabrication of #{self.class.name} using the API failed (#{graphql_response.code}) with `#{graphql_response}`."
+ unless graphql_response.code == HTTP_STATUS_OK && (body[:errors].nil? || body[:errors].empty?)
+ raise(ResourceFabricationFailedError, <<~MSG)
+ Fabrication of #{self.class.name} using the API failed (#{graphql_response.code}) with `#{graphql_response}`.
+ MSG
end
- flattened_response[:web_url] = flattened_response.delete(:webUrl)
- flattened_response[:id] = flattened_response.fetch(:id).split('/')[-1]
+ body[:id] = body.fetch(:id).split('/').last
- process_api_response(flattened_response)
+ body.transform_keys { |key| key.to_s.underscore.to_sym }
else
- response = post(
- Runtime::API::Request.new(api_client, api_post_path).url,
- api_post_body)
+ response = post(Runtime::API::Request.new(api_client, post_path).url, post_body)
unless response.code == HTTP_STATUS_CREATED
- raise ResourceFabricationFailedError, "Fabrication of #{self.class.name} using the API failed (#{response.code}) with `#{response}`."
+ raise(
+ ResourceFabricationFailedError,
+ "Fabrication of #{self.class.name} using the API failed (#{response.code}) with `#{response}`."
+ )
end
- process_api_response(parse_body(response))
+ parse_body(response)
end
end
diff --git a/qa/qa/resource/base.rb b/qa/qa/resource/base.rb
index 2848e3ba7d2..a7243b7ebc2 100644
--- a/qa/qa/resource/base.rb
+++ b/qa/qa/resource/base.rb
@@ -100,7 +100,9 @@ module QA
attr_writer(name)
define_method(name) do
- instance_variable_get("@#{name}") || instance_variable_set("@#{name}", populate_attribute(name, block))
+ return instance_variable_get("@#{name}") if instance_variable_defined?("@#{name}")
+
+ instance_variable_set("@#{name}", attribute_value(name, block))
end
end
@@ -121,9 +123,7 @@ module QA
return self unless api_resource
all_attributes.each do |attribute_name|
- api_value = api_resource[attribute_name]
-
- instance_variable_set("@#{attribute_name}", api_value) if api_value
+ instance_variable_set("@#{attribute_name}", api_resource[attribute_name]) if api_resource.key?(attribute_name)
end
self
@@ -160,20 +160,17 @@ module QA
private
- def populate_attribute(name, block)
- value = attribute_value(name, block)
-
- raise NoValueError, "No value was computed for #{name} of #{self.class.name}." unless value
-
- value
- end
-
def attribute_value(name, block)
- api_value = api_resource&.dig(name)
+ no_api_value = !api_resource&.key?(name)
+ raise NoValueError, "No value was computed for #{name} of #{self.class.name}." if no_api_value && !block
- log_having_both_api_result_and_block(name, api_value) if api_value && block
+ unless no_api_value
+ api_value = api_resource[name]
+ log_having_both_api_result_and_block(name, api_value) if block
+ return api_value
+ end
- api_value || (block && instance_exec(&block))
+ instance_exec(&block)
end
# Get all defined attributes across all parents
diff --git a/qa/qa/resource/fork.rb b/qa/qa/resource/fork.rb
index 106d1d5548a..b3814011f2c 100644
--- a/qa/qa/resource/fork.rb
+++ b/qa/qa/resource/fork.rb
@@ -14,6 +14,7 @@ module QA
resource.add_name_uuid = false
resource.name = name
resource.path_with_namespace = "#{user.username}/#{name}"
+ resource.api_client = @api_client
end
end
@@ -69,6 +70,12 @@ module QA
populate(:project)
end
+ def remove_via_api!
+ project.remove_via_api!
+ upstream.remove_via_api!
+ user.remove_via_api! unless Specs::Helpers::ContextSelector.dot_com?
+ end
+
def api_get_path
"/projects/#{CGI.escape(path_with_namespace)}"
end
diff --git a/qa/qa/resource/group_badge.rb b/qa/qa/resource/group_badge.rb
new file mode 100644
index 00000000000..fd76f066e8b
--- /dev/null
+++ b/qa/qa/resource/group_badge.rb
@@ -0,0 +1,73 @@
+# frozen_string_literal: true
+
+module QA
+ module Resource
+ class GroupBadge < Base
+ attributes :id,
+ :name,
+ :link_url,
+ :image_url,
+ :group
+
+ # API get path
+ #
+ # @return [String]
+ def api_get_path
+ "/groups/#{CGI.escape(group.full_path)}/badges/#{id}"
+ end
+
+ # API post path
+ #
+ # @return [String]
+ def api_post_path
+ "/groups/#{CGI.escape(group.full_path)}/badges"
+ end
+
+ # Params for label creation
+ #
+ # @return [Hash]
+ def api_post_body
+ {
+ link_url: link_url,
+ image_url: image_url
+ }
+ end
+
+ # Override base method as this particular resource does not expose a web_url property
+ #
+ # @param [Hash] resource
+ # @return [String]
+ def resource_web_url(_resource); end
+
+ # Object comparison
+ #
+ # @param [QA::Resource::GroupBadge] other
+ # @return [Boolean]
+ def ==(other)
+ other.is_a?(GroupBadge) && comparable_badge == other.comparable_badge
+ end
+
+ # Override inspect for a better rspec failure diff output
+ #
+ # @return [String]
+ def inspect
+ JSON.pretty_generate(comparable_badge)
+ end
+
+ protected
+
+ # Return subset of fields for comparing badges
+ #
+ # @return [Hash]
+ def comparable_badge
+ reload! unless api_response
+
+ api_response.slice(
+ :name,
+ :link_url,
+ :image_url
+ )
+ end
+ end
+ end
+end
diff --git a/qa/qa/resource/group_base.rb b/qa/qa/resource/group_base.rb
index a1e5b19f409..932d39675a3 100644
--- a/qa/qa/resource/group_base.rb
+++ b/qa/qa/resource/group_base.rb
@@ -14,6 +14,22 @@ module QA
:name,
:full_path
+ # Get group projects
+ #
+ # @return [Array<QA::Resource::Project>]
+ def projects
+ parse_body(api_get_from("#{api_get_path}/projects")).map do |project|
+ Project.init do |resource|
+ resource.api_client = api_client
+ resource.group = self
+ resource.id = project[:id]
+ resource.name = project[:name]
+ resource.description = project[:description]
+ resource.path_with_namespace = project[:path_with_namespace]
+ end
+ end
+ end
+
# Get group labels
#
# @return [Array<QA::Resource::GroupLabel>]
@@ -46,6 +62,38 @@ module QA
end
end
+ # Get group badges
+ #
+ # @return [Array<QA::Resource::GroupBadge>]
+ def badges
+ parse_body(api_get_from("#{api_get_path}/badges")).map do |badge|
+ GroupBadge.init do |resource|
+ resource.api_client = api_client
+ resource.group = self
+ resource.id = badge[:id]
+ resource.name = badge[:name]
+ resource.link_url = badge[:link_url]
+ resource.image_url = badge[:image_url]
+ end
+ end
+ end
+
+ # Get group members
+ #
+ # @return [Array<QA::Resource::User>]
+ def members
+ parse_body(api_get_from("#{api_get_path}/members")).map do |member|
+ User.init do |resource|
+ resource.api_client = api_client
+ resource.id = member[:id]
+ resource.name = member[:name]
+ resource.username = member[:username]
+ resource.email = member[:email]
+ resource.access_level = member[:access_level]
+ end
+ end
+ end
+
# API get path
#
# @return [String]
diff --git a/qa/qa/resource/merge_request_from_fork.rb b/qa/qa/resource/merge_request_from_fork.rb
index 4eebbdf0a52..b0579cf37b8 100644
--- a/qa/qa/resource/merge_request_from_fork.rb
+++ b/qa/qa/resource/merge_request_from_fork.rb
@@ -6,7 +6,7 @@ module QA
attr_accessor :fork_branch
attribute :fork do
- Fork.fabricate_via_browser_ui!
+ Fork.fabricate_via_api!
end
attribute :push do
@@ -23,8 +23,15 @@ module QA
fork.project.visit!
- Page::Project::Show.perform(&:new_merge_request)
- Page::MergeRequest::New.perform(&:create_merge_request)
+ mr_url = Flow::Login.while_signed_in(as: fork.user) do
+ Page::Project::Show.perform(&:new_merge_request)
+ Page::MergeRequest::New.perform(&:create_merge_request)
+
+ current_url
+ end
+
+ Flow::Login.sign_in
+ visit(mr_url)
end
def fabricate_via_api!
diff --git a/qa/qa/resource/personal_access_token.rb b/qa/qa/resource/personal_access_token.rb
index 924e4206166..d992d7987b4 100644
--- a/qa/qa/resource/personal_access_token.rb
+++ b/qa/qa/resource/personal_access_token.rb
@@ -8,7 +8,7 @@ module QA
attr_accessor :name
# The user for which the personal access token is to be created
- # This *could* be different than the api_client.user or the api_user provided by the QA::Resource::ApiFabricator module
+ # This *could* be different than the api_client.user or the api_user provided by the QA::Resource::ApiFabricator
attr_writer :user
attribute :token
@@ -17,7 +17,9 @@ module QA
# If Runtime::Env.admin_personal_access_token is provided, fabricate via the API,
# else, fabricate via the browser.
def fabricate_via_api!
- @token = QA::Resource::PersonalAccessTokenCache.get_token_for_username(user.username)
+ QA::Resource::PersonalAccessTokenCache.get_token_for_username(user.username).tap do |cached_token|
+ @token = cached_token if cached_token
+ end
return if @token
resource = if Runtime::Env.admin_personal_access_token && !@user.nil?
@@ -28,7 +30,7 @@ module QA
fabricate!
end
- QA::Resource::PersonalAccessTokenCache.set_token_for_username(user.username, self.token)
+ QA::Resource::PersonalAccessTokenCache.set_token_for_username(user.username, token)
resource
end
diff --git a/qa/qa/resource/project.rb b/qa/qa/resource/project.rb
index 5ad55090f8c..3f6a4eee5ac 100644
--- a/qa/qa/resource/project.rb
+++ b/qa/qa/resource/project.rb
@@ -12,13 +12,13 @@ module QA
:auto_devops_enabled,
:github_personal_access_token,
:github_repository_path,
- :gitlab_repository_path
+ :gitlab_repository_path,
+ :personal_namespace
attributes :id,
:name,
:add_name_uuid,
:description,
- :personal_namespace,
:runners_token,
:visibility,
:template_name,
@@ -31,13 +31,15 @@ module QA
end
attribute :path_with_namespace do
- "#{group.full_path}/#{name}"
+ "#{personal_namespace || group.full_path}/#{name}"
end
alias_method :full_path, :path_with_namespace
def sandbox_path
- group.respond_to?('sandbox') ? "#{group.sandbox.path}/" : ''
+ return '' if personal_namespace || !group.respond_to?('sandbox')
+
+ "#{group.sandbox.path}/"
end
attribute :repository_ssh_location do
@@ -50,12 +52,12 @@ module QA
def initialize
@add_name_uuid = true
- @personal_namespace = false
@description = 'My awesome project'
@initialize_with_readme = false
@auto_devops_enabled = false
@visibility = :public
@template_name = nil
+ @personal_namespace = nil
@import = false
self.name = "the_awesome_project"
@@ -68,7 +70,7 @@ module QA
def fabricate!
return if @import
- if @personal_namespace
+ if personal_namespace
Page::Dashboard::Projects.perform(&:click_new_project_button)
else
group.visit!
@@ -356,6 +358,46 @@ module QA
parse_body(response)
end
+ # Object comparison
+ #
+ # @param [QA::Resource::Project] other
+ # @return [Boolean]
+ def ==(other)
+ other.is_a?(Project) && comparable_project == other.comparable_project
+ end
+
+ # Override inspect for a better rspec failure diff output
+ #
+ # @return [String]
+ def inspect
+ JSON.pretty_generate(comparable_project)
+ end
+
+ protected
+
+ # Return subset of fields for comparing projects
+ #
+ # @return [Hash]
+ def comparable_project
+ reload! if api_response.nil?
+
+ api_resource.slice(
+ :name,
+ :path,
+ :description,
+ :tag_list,
+ :archived,
+ :issues_enabled,
+ :merge_request_enabled,
+ :wiki_enabled,
+ :jobs_enabled,
+ :snippets_enabled,
+ :shared_runners_enabled,
+ :request_access_enabled,
+ :avatar_url
+ )
+ end
+
private
def transform_api_resource(api_resource)
diff --git a/qa/qa/resource/project_imported_from_github.rb b/qa/qa/resource/project_imported_from_github.rb
index cffeed7a64b..28a0f12b3e3 100644
--- a/qa/qa/resource/project_imported_from_github.rb
+++ b/qa/qa/resource/project_imported_from_github.rb
@@ -34,7 +34,7 @@ module QA
def fabricate_via_api!
super
rescue ResourceURLMissingError
- "#{Runtime::Scenario.gitlab_address}/#{group.full_path}/#{name}"
+ "#{Runtime::Scenario.gitlab_address}/#{full_path}"
end
def api_post_path
@@ -49,7 +49,7 @@ module QA
{
repo_id: github_repo_id,
new_name: name,
- target_namespace: group.full_path,
+ target_namespace: @personal_namespace || group.full_path,
personal_access_token: github_personal_access_token,
ci_cd_only: false
}
diff --git a/qa/qa/resource/project_snippet.rb b/qa/qa/resource/project_snippet.rb
index 9ab4612d117..9a22966efdb 100644
--- a/qa/qa/resource/project_snippet.rb
+++ b/qa/qa/resource/project_snippet.rb
@@ -30,6 +30,8 @@ module QA
new_snippet.click_create_snippet_button
end
+
+ @id = Page::Project::Snippet::Show.perform(&:snippet_id)
end
def api_get_path
diff --git a/qa/qa/resource/snippet.rb b/qa/qa/resource/snippet.rb
index a94ae02b8fd..a79e8c7de6b 100644
--- a/qa/qa/resource/snippet.rb
+++ b/qa/qa/resource/snippet.rb
@@ -22,6 +22,10 @@ module QA
end
def fabricate!
+ Page::Main::Menu.perform do |menu|
+ menu.go_to_menu_dropdown_option(:snippets_link)
+ end
+
Page::Dashboard::Snippet::Index.perform(&:go_to_new_snippet_page)
Page::Dashboard::Snippet::New.perform do |new_page|
@@ -38,6 +42,8 @@ module QA
end
new_page.click_create_snippet_button
end
+
+ @id = Page::Dashboard::Snippet::Show.perform(&:snippet_id)
end
def fabricate_via_api!
diff --git a/qa/qa/resource/user.rb b/qa/qa/resource/user.rb
index 811ce5e0505..ed4ea057484 100644
--- a/qa/qa/resource/user.rb
+++ b/qa/qa/resource/user.rb
@@ -7,13 +7,18 @@ module QA
attr_reader :unique_id
attr_writer :username, :password
- attr_accessor :admin, :provider, :extern_uid, :expect_fabrication_success, :hard_delete_on_api_removal
-
- attribute :id
- attribute :name
- attribute :first_name
- attribute :last_name
- attribute :email
+ attr_accessor :admin,
+ :provider,
+ :extern_uid,
+ :expect_fabrication_success,
+ :hard_delete_on_api_removal,
+ :access_level
+
+ attributes :id,
+ :name,
+ :first_name,
+ :last_name,
+ :email
def initialize
@admin = false
@@ -123,6 +128,10 @@ module QA
"/users/#{id}/block"
end
+ def api_approve_path
+ "/users/#{id}/approve"
+ end
+
def api_post_body
{
admin: admin,
@@ -148,6 +157,13 @@ module QA
end
end
+ def approve!
+ response = post(Runtime::API::Request.new(api_client, api_approve_path).url, nil)
+ return if response.code == 201
+
+ raise ResourceUpdateFailedError, "Failed to approve user. Request returned (#{response.code}): `#{response}`"
+ end
+
def block!
response = post(Runtime::API::Request.new(api_client, api_block_path).url, nil)
return if response.code == HTTP_STATUS_CREATED
diff --git a/qa/qa/runtime/allure_report.rb b/qa/qa/runtime/allure_report.rb
index 5b0456dc607..5f628050f3b 100644
--- a/qa/qa/runtime/allure_report.rb
+++ b/qa/qa/runtime/allure_report.rb
@@ -5,6 +5,8 @@ require 'active_support/core_ext/enumerable'
module QA
module Runtime
class AllureReport
+ extend QA::Support::API
+
class << self
# Configure allure reports
#
@@ -77,27 +79,21 @@ module QA
end
end
- # Custom environment info hash
+ # Gitlab version and revision information
#
# @return [Hash]
def environment_info
- %w[
- CI_COMMIT_SHA
- CI_MERGE_REQUEST_SOURCE_BRANCH_SHA
- CI_MERGE_REQUEST_IID
- TOP_UPSTREAM_SOURCE_SHA
- TOP_UPSTREAM_MERGE_REQUEST_IID
- DEPLOY_VERSION
- GITLAB_VERSION
- GITLAB_SHELL_VERSION
- GITLAB_ELASTICSEARCH_INDEXER_VERSION
- GITLAB_KAS_VERSION
- GITLAB_WORKHORSE_VERSION
- GITLAB_PAGES_VERSION
- GITALY_SERVER_VERSION
- QA_IMAGE
- QA_BROWSER
- ].index_with { |val| ENV[val] }.compact_blank
+ lambda do
+ return {} unless Env.admin_personal_access_token || Env.personal_access_token
+
+ client = Env.admin_personal_access_token ? API::Client.as_admin : API::Client.new
+ response = get(API::Request.new(client, '/version').url)
+
+ JSON.parse(response.body, symbolize_names: true)
+ rescue StandardError, ArgumentError => e
+ Logger.error("Failed to attach version info to allure report: #{e}")
+ {}
+ end
end
end
end
diff --git a/qa/qa/runtime/api/client.rb b/qa/qa/runtime/api/client.rb
index 8a5e22fbc37..b5b572890c1 100644
--- a/qa/qa/runtime/api/client.rb
+++ b/qa/qa/runtime/api/client.rb
@@ -16,17 +16,21 @@ module QA
enable_ip_limits if ip_limits
end
+ # Personal access token
+ #
+ # It is possible to set the environment variable GITLAB_QA_ACCESS_TOKEN
+ # to use a specific access token rather than create one from the UI
+ # unless a specific user has been passed
+ #
+ # @return [String]
def personal_access_token
- @personal_access_token ||= begin
- # you can set the environment variable GITLAB_QA_ACCESS_TOKEN
- # to use a specific access token rather than create one from the UI
- # unless a specific user has been passed
- @user.nil? ? Runtime::Env.personal_access_token ||= create_personal_access_token : create_personal_access_token
- end
+ @personal_access_token ||= if user.nil?
+ Runtime::Env.personal_access_token ||= create_personal_access_token
+ else
+ create_personal_access_token
+ end
- if @user&.admin?
- Runtime::Env.admin_personal_access_token = @personal_access_token
- end
+ Runtime::Env.admin_personal_access_token = @personal_access_token if user&.admin? # rubocop:disable Cop/UserAdmin
@personal_access_token
end
@@ -82,27 +86,38 @@ module QA
Page::Main::Menu.perform(&:sign_out)
end
+ # Create PAT
+ #
+ # Use api if admin personal access token is present and skip any UI actions otherwise perform creation via UI
+ #
+ # @return [String]
def create_personal_access_token
- signed_in_initially = Page::Main::Menu.perform(&:signed_in?)
-
- Page::Main::Menu.perform(&:sign_out) if @is_new_session && signed_in_initially
-
- token = Resource::PersonalAccessToken.fabricate! do |pat|
- pat.user = user
- end.token
-
- # If this is a new session, that tests that follow could fail if they
- # try to sign in without starting a new session.
- # Also, if the browser wasn't already signed in, leaving it
- # signed in could cause tests to fail when they try to sign
- # in again. For example, that would happen if a test has a
- # before(:context) block that fabricates via the API, and
- # it's the first test to run so it creates an access token
- #
- # Sign out so the tests can successfully sign in
- Page::Main::Menu.perform(&:sign_out) if @is_new_session || !signed_in_initially
-
- token
+ if Runtime::Env.admin_personal_access_token
+ Resource::PersonalAccessToken.fabricate_via_api! do |pat|
+ pat.user = user
+ end.token
+ else
+ signed_in_initially = Page::Main::Menu.perform(&:signed_in?)
+
+ Page::Main::Menu.perform(&:sign_out) if @is_new_session && signed_in_initially
+
+ token = Resource::PersonalAccessToken.fabricate! do |pat|
+ pat.user = user
+ end.token
+
+ # If this is a new session, that tests that follow could fail if they
+ # try to sign in without starting a new session.
+ # Also, if the browser wasn't already signed in, leaving it
+ # signed in could cause tests to fail when they try to sign
+ # in again. For example, that would happen if a test has a
+ # before(:context) block that fabricates via the API, and
+ # it's the first test to run so it creates an access token
+ #
+ # Sign out so the tests can successfully sign in
+ Page::Main::Menu.perform(&:sign_out) if @is_new_session || !signed_in_initially
+
+ token
+ end
end
end
end
diff --git a/qa/qa/service/praefect_manager.rb b/qa/qa/service/praefect_manager.rb
index 5adc52680f0..71e3383a534 100644
--- a/qa/qa/service/praefect_manager.rb
+++ b/qa/qa/service/praefect_manager.rb
@@ -46,6 +46,10 @@ module QA
end
end
+ def stop_primary_node
+ stop_node(@primary_node)
+ end
+
def start_primary_node
start_node(@primary_node)
end
@@ -66,20 +70,29 @@ module QA
start_node(@secondary_node)
end
+ def stop_tertiary_node
+ stop_node(@tertiary_node)
+ end
+
+ def start_tertiary_node
+ start_node(@tertiary_node)
+ end
+
def start_node(name)
shell "docker start #{name}"
+ wait_until_shell_command_matches(
+ "docker inspect -f {{.State.Running}} #{name}",
+ /true/,
+ sleep_interval: 3,
+ max_duration: 180,
+ retry_on_exception: true
+ )
end
def stop_node(name)
shell "docker stop #{name}"
end
- def trigger_failover_by_stopping_primary_node
- QA::Runtime::Logger.info("Stopping node #{@primary_node} to trigger failover")
- stop_node(@primary_node)
- wait_for_new_primary
- end
-
def clear_replication_queue
QA::Runtime::Logger.info("Clearing the replication queue")
shell sql_to_docker_exec_cmd(
@@ -157,22 +170,8 @@ module QA
result[2].to_i
end
- # Makes the original primary (gitaly1) the primary again by
- # stopping the other nodes, waiting for gitaly1 to be made the
- # primary again, and then it starts the other nodes and enables
- # writes
- def reset_primary_to_original
- QA::Runtime::Logger.info("Checking primary node...")
-
- return if @primary_node == current_primary_node
-
- QA::Runtime::Logger.info("Reset primary node to #{@primary_node}")
+ def start_all_nodes
start_node(@primary_node)
- stop_node(@secondary_node)
- stop_node(@tertiary_node)
-
- wait_for_new_primary_node(@primary_node)
-
start_node(@secondary_node)
start_node(@tertiary_node)
@@ -189,10 +188,12 @@ module QA
end
def wait_for_praefect
- QA::Runtime::Logger.info('Wait until Praefect starts and is listening')
wait_until_shell_command_matches(
- "docker exec #{@praefect} bash -c 'cat /var/log/gitlab/praefect/current'",
- /listening at tcp address/
+ "docker inspect -f {{.State.Running}} #{@praefect}",
+ /true/,
+ sleep_interval: 3,
+ max_duration: 180,
+ retry_on_exception: true
)
# Praefect can fail to start if unable to dial one of the gitaly nodes
@@ -204,20 +205,6 @@ module QA
end
end
- def wait_for_new_primary_node(node)
- QA::Runtime::Logger.info("Wait until #{node} is the primary node")
- with_praefect_log(max_duration: 120) do |log|
- break true if log['msg'] == 'primary node changed' && log['newPrimary'] == node
- end
- end
-
- def wait_for_new_primary
- QA::Runtime::Logger.info("Wait until a new primary node is selected")
- with_praefect_log(max_duration: 120) do |log|
- break true if log['msg'] == 'primary node changed'
- end
- end
-
def wait_for_sql_ping
wait_until_shell_command_matches(
"docker exec #{@praefect} bash -c '/opt/gitlab/embedded/bin/praefect -config /var/opt/gitlab/praefect/config.toml sql-ping'",
@@ -274,10 +261,6 @@ module QA
end
end
- def wait_for_health_check_current_primary_node
- wait_for_health_check(current_primary_node)
- end
-
def wait_for_health_check_all_nodes
wait_for_health_check(@primary_node)
wait_for_health_check(@secondary_node)
@@ -286,29 +269,58 @@ module QA
def wait_for_health_check(node)
QA::Runtime::Logger.info("Waiting for health check on #{node}")
- wait_until_shell_command("docker exec #{node} bash -c 'cat /var/log/gitlab/gitaly/current'") do |line|
- QA::Runtime::Logger.debug(line.chomp)
- log = JSON.parse(line)
+ wait_until_node_is_marked_as_healthy_storage(node)
+ end
- log['grpc.request.fullMethod'] == '/grpc.health.v1.Health/Check' && log['grpc.code'] == 'OK'
- rescue JSON::ParserError
- # Ignore lines that can't be parsed as JSON
- end
+ def wait_for_primary_node_health_check
+ wait_for_health_check(@primary_node)
+ end
+
+ def wait_for_secondary_node_health_check
+ wait_for_health_check(@secondary_node)
+ end
+
+ def wait_for_tertiary_node_health_check
+ wait_for_health_check(@tertiary_node)
+ end
+
+ def wait_for_health_check_failure(node)
+ QA::Runtime::Logger.info("Waiting for health check failure on #{node}")
+ wait_until_node_is_removed_from_healthy_storages(node)
+ end
+
+ def wait_for_primary_node_health_check_failure
+ wait_for_health_check_failure(@primary_node)
end
def wait_for_secondary_node_health_check_failure
wait_for_health_check_failure(@secondary_node)
end
- def wait_for_health_check_failure(node)
- QA::Runtime::Logger.info("Waiting for Praefect to record a health check failure on #{node}")
- wait_until_shell_command("docker exec #{@praefect} bash -c 'tail -n 1 /var/log/gitlab/praefect/current'") do |line|
- QA::Runtime::Logger.debug(line.chomp)
- log = JSON.parse(line)
+ def wait_for_tertiary_node_health_check_failure
+ wait_for_health_check_failure(@tertiary_node)
+ end
- health_check_failure_message?(log['msg']) && log['storage'] == node
- rescue JSON::ParserError
- # Ignore lines that can't be parsed as JSON
+ def wait_until_node_is_removed_from_healthy_storages(node)
+ Support::Waiter.wait_until(max_duration: 60, sleep_interval: 3, raise_on_failure: false) do
+ result = []
+ shell sql_to_docker_exec_cmd("SELECT count(*) FROM healthy_storages WHERE storage = '#{node}';") do |line|
+ result << line
+ end
+ QA::Runtime::Logger.debug("result is ---#{result}")
+ result[2].to_i == 0
+ end
+ end
+
+ def wait_until_node_is_marked_as_healthy_storage(node)
+ Support::Waiter.wait_until(max_duration: 60, sleep_interval: 3, raise_on_failure: false) do
+ result = []
+ shell sql_to_docker_exec_cmd("SELECT count(*) FROM healthy_storages WHERE storage = '#{node}';") do |line|
+ result << line
+ end
+
+ QA::Runtime::Logger.debug("result is ---#{result}")
+ result[2].to_i == 1
end
end
diff --git a/qa/qa/service/shellout.rb b/qa/qa/service/shellout.rb
index 81cfaa125a9..5a35d8c251e 100644
--- a/qa/qa/service/shellout.rb
+++ b/qa/qa/service/shellout.rb
@@ -52,7 +52,7 @@ module QA
end
def wait_until_shell_command_matches(cmd, regex, **kwargs)
- wait_until_shell_command(cmd, kwargs) do |line|
+ wait_until_shell_command(cmd, **kwargs) do |line|
QA::Runtime::Logger.debug(line.chomp)
line =~ regex
diff --git a/qa/qa/specs/features/api/1_manage/bulk_import_group_spec.rb b/qa/qa/specs/features/api/1_manage/bulk_import_group_spec.rb
index 1422dd5a029..8b4900957c5 100644
--- a/qa/qa/specs/features/api/1_manage/bulk_import_group_spec.rb
+++ b/qa/qa/specs/features/api/1_manage/bulk_import_group_spec.rb
@@ -89,7 +89,7 @@ module QA
end
end
- context 'with milestones' do
+ context 'with milestones and badges' do
let(:source_milestone) do
Resource::GroupMilestone.fabricate_via_api! do |milestone|
milestone.api_client = api_client
@@ -99,10 +99,17 @@ module QA
before do
source_milestone
+
+ Resource::GroupBadge.fabricate_via_api! do |badge|
+ badge.api_client = api_client
+ badge.group = source_group
+ badge.link_url = "http://example.com/badge"
+ badge.image_url = "http://shields.io/badge"
+ end
end
it(
- 'successfully imports group milestones',
+ 'successfully imports group milestones and badges',
testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/quality/test_cases/2245'
) do
expect { imported_group.import_status }.to eventually_eq('finished').within(import_wait_duration)
@@ -113,8 +120,40 @@ module QA
expect(imported_milestone.iid).to eq(source_milestone.iid)
expect(imported_milestone.created_at).to eq(source_milestone.created_at)
expect(imported_milestone.updated_at).to eq(source_milestone.updated_at)
+
+ expect(imported_group.badges).to eq(source_group.badges)
+ end
+ end
+ end
+
+ context 'with group members' do
+ let(:member) do
+ Resource::User.fabricate_via_api! do |usr|
+ usr.api_client = admin_api_client
+ usr.hard_delete_on_api_removal = true
end
end
+
+ before do
+ member.set_public_email
+ source_group.add_member(member, Resource::Members::AccessLevel::DEVELOPER)
+ end
+
+ after do
+ member.remove_via_api!
+ end
+
+ it(
+ 'adds members for imported group',
+ testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/quality/test_cases/2310'
+ ) do
+ expect { imported_group.import_status }.to eventually_eq('finished').within(import_wait_duration)
+
+ imported_member = imported_group.reload!.members.find { |usr| usr.username == member.username }
+
+ expect(imported_member).not_to be_nil
+ expect(imported_member.access_level).to eq(Resource::Members::AccessLevel::DEVELOPER)
+ end
end
after do
diff --git a/qa/qa/specs/features/api/1_manage/bulk_import_project_spec.rb b/qa/qa/specs/features/api/1_manage/bulk_import_project_spec.rb
new file mode 100644
index 00000000000..9935908d55e
--- /dev/null
+++ b/qa/qa/specs/features/api/1_manage/bulk_import_project_spec.rb
@@ -0,0 +1,79 @@
+# frozen_string_literal: true
+
+module QA
+ RSpec.describe 'Manage', :requires_admin do
+ describe 'Bulk project import' do
+ let!(:staging?) { Runtime::Scenario.gitlab_address.include?('staging.gitlab.com') }
+
+ let(:import_wait_duration) { { max_duration: 300, sleep_interval: 2 } }
+ let(:admin_api_client) { Runtime::API::Client.as_admin }
+ let(:user) do
+ Resource::User.fabricate_via_api! do |usr|
+ usr.api_client = admin_api_client
+ usr.hard_delete_on_api_removal = true
+ end
+ end
+
+ let(:api_client) { Runtime::API::Client.new(user: user) }
+
+ let(:sandbox) do
+ Resource::Sandbox.fabricate_via_api! do |group|
+ group.api_client = admin_api_client
+ end
+ end
+
+ let(:source_group) do
+ Resource::Sandbox.fabricate_via_api! do |group|
+ group.api_client = api_client
+ group.path = "source-group-for-import-#{SecureRandom.hex(4)}"
+ end
+ end
+
+ let(:source_project) do
+ Resource::Project.fabricate_via_api! do |project|
+ project.api_client = api_client
+ project.group = source_group
+ end
+ end
+
+ let(:imported_group) do
+ Resource::BulkImportGroup.fabricate_via_api! do |group|
+ group.api_client = api_client
+ group.sandbox = sandbox
+ group.source_group_path = source_group.path
+ end
+ end
+
+ before do
+ Runtime::Feature.enable(:bulk_import_projects)
+ Runtime::Feature.enable(:top_level_group_creation_enabled) if staging?
+
+ sandbox.add_member(user, Resource::Members::AccessLevel::MAINTAINER)
+
+ source_project # fabricate source group and project
+ end
+
+ after do
+ user.remove_via_api!
+ ensure
+ Runtime::Feature.disable(:bulk_import_projects)
+ Runtime::Feature.disable(:top_level_group_creation_enabled) if staging?
+ end
+
+ context 'with project' do
+ it(
+ 'successfully imports project',
+ testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/quality/test_cases/2297'
+ ) do
+ expect { imported_group.import_status }.to eventually_eq('finished').within(import_wait_duration)
+
+ imported_projects = imported_group.reload!.projects
+ aggregate_failures do
+ expect(imported_projects.count).to eq(1)
+ expect(imported_projects.first).to eq(source_project)
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/qa/qa/specs/features/api/1_manage/import_large_github_repo_spec.rb b/qa/qa/specs/features/api/1_manage/import_large_github_repo_spec.rb
index b51a79f239c..3a2f960d812 100644
--- a/qa/qa/specs/features/api/1_manage/import_large_github_repo_spec.rb
+++ b/qa/qa/specs/features/api/1_manage/import_large_github_repo_spec.rb
@@ -9,11 +9,6 @@ module QA
let(:differ) { RSpec::Support::Differ.new(color: true) }
let(:api_client) { Runtime::API::Client.as_admin }
- let(:group) do
- Resource::Group.fabricate_via_api! do |resource|
- resource.api_client = api_client
- end
- end
let(:user) do
Resource::User.fabricate_via_api! do |resource|
@@ -86,19 +81,15 @@ module QA
Resource::ProjectImportedFromGithub.fabricate_via_api! do |project|
project.add_name_uuid = false
project.name = 'imported-project'
- project.group = group
project.github_personal_access_token = Runtime::Env.github_access_token
project.github_repository_path = github_repo
+ project.personal_namespace = user.username
project.api_client = api_client
end
end
- before do
- group.add_member(user, Resource::Members::AccessLevel::MAINTAINER)
- end
-
after do |example|
- user.remove_via_api!
+ user.remove_via_api! unless example.exception
next unless defined?(@import_time)
# save data for comparison after run finished
@@ -128,7 +119,10 @@ module QA
)
end
- it 'imports large Github repo via api', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/quality/test_cases/1880' do
+ it(
+ 'imports large Github repo via api',
+ testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/quality/test_cases/1880'
+ ) do
start = Time.now
Runtime::Logger.info("Importing project '#{imported_project.full_path}'") # import the project and log path
diff --git a/qa/qa/specs/features/api/3_create/gitaly/automatic_failover_and_recovery_spec.rb b/qa/qa/specs/features/api/3_create/gitaly/automatic_failover_and_recovery_spec.rb
index 19fdb37f788..ec4f0387128 100644
--- a/qa/qa/specs/features/api/3_create/gitaly/automatic_failover_and_recovery_spec.rb
+++ b/qa/qa/specs/features/api/3_create/gitaly/automatic_failover_and_recovery_spec.rb
@@ -14,7 +14,7 @@ module QA
before(:context) do
# Reset the cluster in case previous tests left it in a bad state
- praefect_manager.reset_primary_to_original
+ praefect_manager.start_all_nodes
project = Resource::Project.fabricate! do |project|
project.name = "gitaly_cluster"
@@ -25,25 +25,35 @@ module QA
after(:context, quarantine: { issue: 'https://gitlab.com/gitlab-org/gitlab/-/issues/238187', type: :stale }) do
# Leave the cluster in a suitable state for subsequent tests,
# if there was a problem during the tests here
- praefect_manager.reset_primary_to_original
+ praefect_manager.start_all_nodes
end
it 'automatically fails over', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/quality/test_cases/1267' do
# Create a new project with a commit and wait for it to replicate
+
+ # make sure that our project is published to the 'primary' node
+ praefect_manager.stop_secondary_node
+ praefect_manager.stop_tertiary_node
+ praefect_manager.wait_for_secondary_node_health_check_failure
+ praefect_manager.wait_for_tertiary_node_health_check_failure
+
Resource::Repository::ProjectPush.fabricate! do |push|
push.project = project
push.commit_message = first_added_commit_message
push.new_branch = false
- push.file_content = "This should exist on both nodes"
+ push.file_content = "This should exist on all nodes"
end
+ praefect_manager.start_secondary_node
+ praefect_manager.start_tertiary_node
+ praefect_manager.wait_for_health_check_all_nodes
+
praefect_manager.wait_for_replication(project.id)
# Stop the primary node to trigger failover, and then wait
# for Gitaly to be ready for writes again
- praefect_manager.trigger_failover_by_stopping_primary_node
- praefect_manager.wait_for_new_primary
- praefect_manager.wait_for_health_check_current_primary_node
+ praefect_manager.stop_primary_node
+ praefect_manager.wait_for_primary_node_health_check_failure
praefect_manager.wait_for_gitaly_check
Resource::Repository::Commit.fabricate_via_api! do |commit|
@@ -69,7 +79,7 @@ module QA
it 'automatically reconciles', quarantine: { issue: 'https://gitlab.com/gitlab-org/gitlab/-/issues/238187', type: :stale }, testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/quality/test_cases/1266' do
# Start the old primary node again
praefect_manager.start_primary_node
- praefect_manager.wait_for_health_check_current_primary_node
+ praefect_manager.wait_for_primary_node_health_check
# Confirm automatic reconciliation
expect(praefect_manager.replicated?(project.id)).to be true
@@ -81,7 +91,7 @@ module QA
.and include(second_added_commit_message)
# Restore the original primary node
- praefect_manager.reset_primary_to_original
+ praefect_manager.start_all_nodes
# Check that all commits are still available even though the primary
# node was offline when one was made
diff --git a/qa/qa/specs/features/api/3_create/gitaly/backend_node_recovery_spec.rb b/qa/qa/specs/features/api/3_create/gitaly/backend_node_recovery_spec.rb
index f00321ee3f5..37670b70fd8 100644
--- a/qa/qa/specs/features/api/3_create/gitaly/backend_node_recovery_spec.rb
+++ b/qa/qa/specs/features/api/3_create/gitaly/backend_node_recovery_spec.rb
@@ -14,12 +14,12 @@ module QA
before do
# Reset the cluster in case previous tests left it in a bad state
- praefect_manager.reset_primary_to_original
+ praefect_manager.start_all_nodes
end
after do
# Leave the cluster in a suitable state for subsequent tests
- praefect_manager.reset_primary_to_original
+ praefect_manager.start_all_nodes
end
it 'recovers from dataloss', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/quality/test_cases/1265' do
@@ -28,9 +28,7 @@ module QA
# Stop the primary node to trigger failover, and then wait
# for Gitaly to be ready for writes again
- praefect_manager.trigger_failover_by_stopping_primary_node
- praefect_manager.wait_for_new_primary
- praefect_manager.wait_for_health_check_current_primary_node
+ praefect_manager.stop_primary_node
praefect_manager.wait_for_gitaly_check
# Confirm that we have access to the repo after failover
diff --git a/qa/qa/specs/features/api/3_create/repository/project_archive_compare_spec.rb b/qa/qa/specs/features/api/3_create/repository/project_archive_compare_spec.rb
index caaa615149d..db75d4639ff 100644
--- a/qa/qa/specs/features/api/3_create/repository/project_archive_compare_spec.rb
+++ b/qa/qa/specs/features/api/3_create/repository/project_archive_compare_spec.rb
@@ -46,10 +46,9 @@ module QA
def create_project(user, api_client, project_name)
project = Resource::Project.fabricate_via_api! do |project|
- project.personal_namespace = true
+ project.personal_namespace = user.username
project.add_name_uuid = false
project.name = project_name
- project.path_with_namespace = "#{user.username}/#{project_name}"
project.api_client = api_client
end
diff --git a/qa/qa/specs/features/browser_ui/1_manage/group/bulk_import_group_spec.rb b/qa/qa/specs/features/browser_ui/1_manage/group/bulk_import_group_spec.rb
index c3be58fda74..c136d14c1e5 100644
--- a/qa/qa/specs/features/browser_ui/1_manage/group/bulk_import_group_spec.rb
+++ b/qa/qa/specs/features/browser_ui/1_manage/group/bulk_import_group_spec.rb
@@ -58,8 +58,8 @@ module QA
testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/quality/test_cases/1806',
issue_1: 'https://gitlab.com/gitlab-org/gitlab/-/issues/331252',
issue_2: 'https://gitlab.com/gitlab-org/gitlab/-/issues/333678',
- # mostly impacts testing as it makes small groups import slower
- issue_3: 'https://gitlab.com/gitlab-org/gitlab/-/issues/332351'
+ issue_3: 'https://gitlab.com/gitlab-org/gitlab/-/issues/332351',
+ except: { job: 'instance-image-slow-network' }
) do
Page::Group::BulkImport.perform do |import_page|
import_page.import_group(imported_group.path, imported_group.sandbox.path)
diff --git a/qa/qa/specs/features/browser_ui/1_manage/login/2fa_recovery_spec.rb b/qa/qa/specs/features/browser_ui/1_manage/login/2fa_recovery_spec.rb
index a3235543998..4e15aa79623 100644
--- a/qa/qa/specs/features/browser_ui/1_manage/login/2fa_recovery_spec.rb
+++ b/qa/qa/specs/features/browser_ui/1_manage/login/2fa_recovery_spec.rb
@@ -78,6 +78,7 @@ module QA
@otp = QA::Support::OTP.new(two_fa_auth.otp_secret_content)
two_fa_auth.set_pin_code(@otp.fresh_otp)
+ two_fa_auth.set_current_password(user.password)
two_fa_auth.click_register_2fa_app_button
recovery_code = two_fa_auth.recovery_codes.sample
diff --git a/qa/qa/specs/features/browser_ui/1_manage/login/2fa_ssh_recovery_spec.rb b/qa/qa/specs/features/browser_ui/1_manage/login/2fa_ssh_recovery_spec.rb
index 8a2bbc92eca..b97da194795 100644
--- a/qa/qa/specs/features/browser_ui/1_manage/login/2fa_ssh_recovery_spec.rb
+++ b/qa/qa/specs/features/browser_ui/1_manage/login/2fa_ssh_recovery_spec.rb
@@ -55,6 +55,7 @@ module QA
Page::Profile::TwoFactorAuth.perform do |two_fa_auth|
otp = QA::Support::OTP.new(two_fa_auth.otp_secret_content)
two_fa_auth.set_pin_code(otp.fresh_otp)
+ two_fa_auth.set_current_password(user.password)
two_fa_auth.click_register_2fa_app_button
two_fa_auth.click_copy_and_proceed
end
diff --git a/qa/qa/specs/features/browser_ui/1_manage/login/log_in_with_2fa_spec.rb b/qa/qa/specs/features/browser_ui/1_manage/login/log_in_with_2fa_spec.rb
index 2fe1cbabee3..78fbec594a3 100644
--- a/qa/qa/specs/features/browser_ui/1_manage/login/log_in_with_2fa_spec.rb
+++ b/qa/qa/specs/features/browser_ui/1_manage/login/log_in_with_2fa_spec.rb
@@ -98,6 +98,7 @@ module QA
@otp = QA::Support::OTP.new(two_fa_auth.otp_secret_content)
two_fa_auth.set_pin_code(@otp.fresh_otp)
+ two_fa_auth.set_current_password(user.password)
two_fa_auth.click_register_2fa_app_button
two_fa_auth.click_copy_and_proceed
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 974d9b02f4d..af4e7126c29 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
@@ -2,7 +2,7 @@
module QA
RSpec.describe 'Manage', :smoke do
- describe 'Project' do
+ describe 'Project', :requires_admin do
shared_examples 'successful project creation' do
it 'creates a new project' do
Page::Project::Show.perform do |project|
@@ -17,6 +17,7 @@ module QA
end
before do
+ Runtime::Feature.enable(:paginatable_namespace_drop_down_for_project_creation)
Flow::Login.sign_in
project
end
@@ -39,7 +40,7 @@ module QA
Resource::Project.fabricate_via_browser_ui! do |project|
project.name = project_name
project.description = 'create awesome project test'
- project.personal_namespace = true
+ project.personal_namespace = Runtime::User.username
end
end
diff --git a/qa/qa/specs/features/browser_ui/3_create/merge_request/merge_merge_request_from_fork_spec.rb b/qa/qa/specs/features/browser_ui/3_create/merge_request/merge_merge_request_from_fork_spec.rb
index 4090837d5c9..f2d4fc6e677 100644
--- a/qa/qa/specs/features/browser_ui/3_create/merge_request/merge_merge_request_from_fork_spec.rb
+++ b/qa/qa/specs/features/browser_ui/3_create/merge_request/merge_merge_request_from_fork_spec.rb
@@ -1,22 +1,29 @@
# frozen_string_literal: true
module QA
- RSpec.describe 'Create', quarantine: { issue: 'https://gitlab.com/gitlab-org/gitlab/-/issues/332588', type: :investigating } do
+ RSpec.describe 'Create' do
describe 'Merge request creation from fork' do
- # TODO: Please add this back to :smoke suite as soon as https://gitlab.com/gitlab-org/gitlab/-/issues/332588 is addressed
- it 'can merge feature branch fork to mainline', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/quality/test_cases/1305' do
- merge_request = Resource::MergeRequestFromFork.fabricate_via_browser_ui! do |merge_request|
+ let(:merge_request) do
+ Resource::MergeRequestFromFork.fabricate_via_browser_ui! do |merge_request|
merge_request.fork_branch = 'feature-branch'
end
+ end
+
+ before do
+ Flow::Login.sign_in
+ end
- Flow::Login.while_signed_in do
- merge_request.visit!
+ after do
+ merge_request.fork.remove_via_api!
+ end
+
+ it 'can merge feature branch fork to mainline', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/quality/test_cases/1305' do
+ merge_request.visit!
- Page::MergeRequest::Show.perform do |merge_request|
- merge_request.merge!
+ Page::MergeRequest::Show.perform do |merge_request|
+ merge_request.merge!
- expect(merge_request).to have_content('The changes were merged')
- end
+ expect(merge_request).to be_merged
end
end
end
diff --git a/qa/qa/specs/features/browser_ui/3_create/merge_request/revert/reverting_merge_request_spec.rb b/qa/qa/specs/features/browser_ui/3_create/merge_request/revert/reverting_merge_request_spec.rb
index 0ea294b8e51..6a79a2d8078 100644
--- a/qa/qa/specs/features/browser_ui/3_create/merge_request/revert/reverting_merge_request_spec.rb
+++ b/qa/qa/specs/features/browser_ui/3_create/merge_request/revert/reverting_merge_request_spec.rb
@@ -1,11 +1,7 @@
# frozen_string_literal: true
module QA
- RSpec.describe 'Create', quarantine: {
- only: { job: 'large-setup' },
- issue: 'https://gitlab.com/gitlab-org/gitlab/-/issues/338324',
- type: :stale
- } do
+ RSpec.describe 'Create' do
describe 'Merged merge request' do
let(:project) do
Resource::Project.fabricate_via_api! do |project|
@@ -23,7 +19,7 @@ module QA
Flow::Login.sign_in
end
- it 'can be reverted', :can_use_large_setup, testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/quality/test_cases/1818' do
+ it 'can be reverted', :can_use_large_setup, testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/quality/test_cases/1818', quarantine: { issue: 'https://gitlab.com/gitlab-org/gitlab/-/issues/335987', type: :investigating } do
revertable_merge_request.visit!
Page::MergeRequest::Show.perform do |merge_request|
diff --git a/qa/qa/specs/features/browser_ui/3_create/merge_request/suggestions/batch_suggestion_spec.rb b/qa/qa/specs/features/browser_ui/3_create/merge_request/suggestions/batch_suggestion_spec.rb
index 5cebbb32ade..1752513a831 100644
--- a/qa/qa/specs/features/browser_ui/3_create/merge_request/suggestions/batch_suggestion_spec.rb
+++ b/qa/qa/specs/features/browser_ui/3_create/merge_request/suggestions/batch_suggestion_spec.rb
@@ -46,11 +46,11 @@ module QA
merge_request.visit!
end
- it 'applies multiple suggestions', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/quality/test_cases/1838' do
+ it 'applies multiple suggestions', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/quality/test_cases/1838', quarantine: { issue: 'https://gitlab.com/gitlab-org/gitlab/-/issues/342131', type: :stale } do
Page::MergeRequest::Show.perform do |merge_request|
merge_request.click_diffs_tab
4.times { merge_request.add_suggestion_to_batch }
- merge_request.apply_suggestions_batch
+ merge_request.apply_suggestion_with_message("Custom commit message")
expect(merge_request).to have_css('.badge-success', text: "Applied", count: 4)
end
diff --git a/qa/qa/specs/features/browser_ui/3_create/snippet/create_personal_snippet_spec.rb b/qa/qa/specs/features/browser_ui/3_create/snippet/create_personal_snippet_spec.rb
index 1080d8ab849..300fd6a1be2 100644
--- a/qa/qa/specs/features/browser_ui/3_create/snippet/create_personal_snippet_spec.rb
+++ b/qa/qa/specs/features/browser_ui/3_create/snippet/create_personal_snippet_spec.rb
@@ -3,13 +3,7 @@
module QA
RSpec.describe 'Create' do # convert back to a smoke test once proved to be stable
describe 'Personal snippet creation' do
- it 'user creates a personal snippet', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/quality/test_cases/1357' do
- Flow::Login.sign_in
-
- Page::Main::Menu.perform do |menu|
- menu.go_to_menu_dropdown_option(:snippets_link)
- end
-
+ let(:snippet) do
Resource::Snippet.fabricate_via_browser_ui! do |snippet|
snippet.title = 'Snippet title'
snippet.description = 'Snippet description'
@@ -17,6 +11,18 @@ module QA
snippet.file_name = 'ruby_file.rb'
snippet.file_content = 'File.read("test.txt").split(/\n/)'
end
+ end
+
+ before do
+ Flow::Login.sign_in
+ end
+
+ after do
+ snippet.remove_via_api!
+ end
+
+ it 'user creates a personal snippet', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/quality/test_cases/1357' do
+ snippet.visit!
Page::Dashboard::Snippet::Show.perform do |snippet|
expect(snippet).to have_snippet_title('Snippet title')
diff --git a/qa/qa/specs/features/browser_ui/3_create/snippet/create_personal_snippet_with_multiple_files_spec.rb b/qa/qa/specs/features/browser_ui/3_create/snippet/create_personal_snippet_with_multiple_files_spec.rb
index 525fc5799a9..a32ee472150 100644
--- a/qa/qa/specs/features/browser_ui/3_create/snippet/create_personal_snippet_with_multiple_files_spec.rb
+++ b/qa/qa/specs/features/browser_ui/3_create/snippet/create_personal_snippet_with_multiple_files_spec.rb
@@ -3,17 +3,11 @@
module QA
RSpec.describe 'Create' do
describe 'Multiple file snippet' do
- it 'creates a personal snippet with multiple files', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/quality/test_cases/1654' do
- Flow::Login.sign_in
-
- Page::Main::Menu.perform do |menu|
- menu.go_to_menu_dropdown_option(:snippets_link)
- end
-
+ let(:snippet) do
Resource::Snippet.fabricate_via_browser_ui! do |snippet|
snippet.title = 'Personal snippet with multiple files'
snippet.description = 'Snippet description'
- snippet.visibility = 'Public'
+ snippet.visibility = 'Private'
snippet.file_name = 'First file name'
snippet.file_content = 'First file content'
@@ -22,11 +16,23 @@ module QA
files.append(name: 'Third file name', content: 'Third file content')
end
end
+ end
+
+ before do
+ Flow::Login.sign_in
+ end
+
+ after do
+ snippet.remove_via_api!
+ end
+
+ it 'creates a personal snippet with multiple files', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/quality/test_cases/1654' do
+ snippet.visit!
Page::Dashboard::Snippet::Show.perform do |snippet|
expect(snippet).to have_snippet_title('Personal snippet with multiple files')
expect(snippet).to have_snippet_description('Snippet description')
- expect(snippet).to have_visibility_type(/public/i)
+ expect(snippet).to have_visibility_type(/private/i)
expect(snippet).to have_file_name('First file name', 1)
expect(snippet).to have_file_content('First file content', 1)
expect(snippet).to have_file_name('Second file name', 2)
diff --git a/qa/qa/specs/features/browser_ui/3_create/snippet/create_project_snippet_spec.rb b/qa/qa/specs/features/browser_ui/3_create/snippet/create_project_snippet_spec.rb
index e4c2488e8df..1967273ca17 100644
--- a/qa/qa/specs/features/browser_ui/3_create/snippet/create_project_snippet_spec.rb
+++ b/qa/qa/specs/features/browser_ui/3_create/snippet/create_project_snippet_spec.rb
@@ -3,9 +3,7 @@
module QA
RSpec.describe 'Create' do # to be converted to a smoke test once proved to be stable
describe 'Project snippet creation' do
- it 'user creates a project snippet', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/quality/test_cases/1358' do
- Flow::Login.sign_in
-
+ let(:snippet) do
Resource::ProjectSnippet.fabricate_via_browser_ui! do |snippet|
snippet.title = 'Project snippet'
snippet.description = ' '
@@ -13,6 +11,18 @@ module QA
snippet.file_name = 'markdown_file.md'
snippet.file_content = "### Snippet heading\n\n[Gitlab link](https://gitlab.com/)"
end
+ end
+
+ before do
+ Flow::Login.sign_in
+ end
+
+ after do
+ snippet.remove_via_api!
+ end
+
+ it 'user creates a project snippet', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/quality/test_cases/1358' do
+ snippet.visit!
Page::Dashboard::Snippet::Show.perform do |snippet|
expect(snippet).to have_snippet_title('Project snippet')
diff --git a/qa/qa/specs/features/browser_ui/3_create/snippet/create_project_snippet_with_multiple_files_spec.rb b/qa/qa/specs/features/browser_ui/3_create/snippet/create_project_snippet_with_multiple_files_spec.rb
index 3298989cc12..ae71be26a38 100644
--- a/qa/qa/specs/features/browser_ui/3_create/snippet/create_project_snippet_with_multiple_files_spec.rb
+++ b/qa/qa/specs/features/browser_ui/3_create/snippet/create_project_snippet_with_multiple_files_spec.rb
@@ -3,9 +3,7 @@
module QA
RSpec.describe 'Create' do
describe 'Multiple file snippet' do
- it 'creates a project snippet with multiple files', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/quality/test_cases/1648' do
- Flow::Login.sign_in
-
+ let(:snippet) do
Resource::ProjectSnippet.fabricate_via_browser_ui! do |snippet|
snippet.title = 'Project snippet with multiple files'
snippet.description = 'Snippet description'
@@ -20,6 +18,18 @@ module QA
end
end
end
+ end
+
+ before do
+ Flow::Login.sign_in
+ end
+
+ after do
+ snippet.remove_via_api!
+ end
+
+ it 'creates a project snippet with multiple files', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/quality/test_cases/1648' do
+ snippet.visit!
Page::Dashboard::Snippet::Show.perform do |snippet|
aggregate_failures 'file content verification' 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
new file mode 100644
index 00000000000..51791c01048
--- /dev/null
+++ b/qa/qa/specs/features/browser_ui/3_create/web_ide/web_terminal_spec.rb
@@ -0,0 +1,84 @@
+# frozen_string_literal: true
+
+module QA
+ RSpec.describe(
+ 'Create',
+ :runner,
+ quarantine: {
+ issue: 'https://gitlab.com/gitlab-org/gitlab/-/issues/338179',
+ type: :bug
+ }
+ ) do
+ describe 'Web IDE web terminal' do
+ before do
+ project = Resource::Project.fabricate_via_api! do |project|
+ project.name = 'web-terminal-project'
+ end
+
+ Resource::Repository::Commit.fabricate_via_api! do |commit|
+ commit.project = project
+ commit.commit_message = 'Add .gitlab/.gitlab-webide.yml'
+ commit.add_files(
+ [
+ {
+ file_path: '.gitlab/.gitlab-webide.yml',
+ content: <<~YAML
+ terminal:
+ tags: ["web-ide"]
+ script: sleep 60
+ YAML
+ }
+ ]
+ )
+ end
+
+ @runner = Resource::Runner.fabricate_via_api! do |runner|
+ runner.project = project
+ runner.name = "qa-runner-#{Time.now.to_i}"
+ runner.tags = %w[web-ide]
+ runner.image = 'gitlab/gitlab-runner:latest'
+ runner.config = <<~END
+ concurrent = 1
+
+ [session_server]
+ listen_address = "0.0.0.0:8093"
+ advertise_address = "localhost:8093"
+ session_timeout = 120
+ END
+ end
+
+ Flow::Login.sign_in
+
+ project.visit!
+ end
+
+ after do
+ @runner.remove_via_api! if @runner
+ end
+
+ it 'user starts the web terminal', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/quality/test_cases/1593' do
+ Page::Project::Show.perform(&:open_web_ide!)
+
+ # Start the web terminal and check that there were no errors
+ # The terminal screen is a canvas element, so we can't read its content,
+ # so we infer that it's working if:
+ # a) The terminal JS package has loaded, and
+ # b) It's not stuck in a "Loading/Starting" state, and
+ # c) There's no alert stating there was a problem
+ #
+ # The terminal itself is a third-party package so we assume it is
+ # adequately tested elsewhere.
+ #
+ # There are also FE specs
+ # * spec/frontend/ide/components/terminal/terminal_controls_spec.js
+ Page::Project::WebIDE::Edit.perform do |edit|
+ edit.start_web_terminal
+
+ expect(edit).to have_no_alert
+ expect(edit).to have_finished_loading
+ expect(edit).to have_terminal_screen
+ end
+ end
+ end
+ end
+end
diff --git a/qa/qa/specs/features/browser_ui/5_package/dependency_proxy_spec.rb b/qa/qa/specs/features/browser_ui/5_package/dependency_proxy_spec.rb
index bfcc49885a0..ea7f7cc1c05 100644
--- a/qa/qa/specs/features/browser_ui/5_package/dependency_proxy_spec.rb
+++ b/qa/qa/specs/features/browser_ui/5_package/dependency_proxy_spec.rb
@@ -28,9 +28,9 @@ module QA
project.group.visit!
- Page::Group::Menu.perform(&:go_to_dependency_proxy)
+ Page::Group::Menu.perform(&:go_to_package_settings)
- Page::Group::DependencyProxy.perform do |index|
+ Page::Group::Settings::PackageRegistries.perform do |index|
expect(index).to have_dependency_proxy_enabled
end
end
diff --git a/qa/qa/specs/features/browser_ui/5_package/helm_registry_spec.rb b/qa/qa/specs/features/browser_ui/5_package/helm_registry_spec.rb
new file mode 100644
index 00000000000..fe52fd03ad8
--- /dev/null
+++ b/qa/qa/specs/features/browser_ui/5_package/helm_registry_spec.rb
@@ -0,0 +1,150 @@
+# frozen_string_literal: true
+
+module QA
+ RSpec.describe 'Package', :orchestrated, :packages, :object_storage do
+ describe 'Helm Registry' do
+ include Runtime::Fixtures
+ include_context 'packages registry qa scenario'
+
+ let(:package_name) { 'gitlab_qa_helm' }
+ let(:package_version) { '1.3.7' }
+ let(:package_type) { 'helm' }
+
+ let(:package_gitlab_ci_file) do
+ {
+ file_path: '.gitlab-ci.yml',
+ content:
+ <<~YAML
+ deploy:
+ image: alpine:3
+ script:
+ - apk add helm --repository=http://dl-cdn.alpinelinux.org/alpine/edge/testing
+ - apk add curl
+ - helm create #{package_name}
+ - cp ./Chart.yaml #{package_name}
+ - helm package #{package_name}
+ - http_code=$(curl --write-out "%{http_code}" --request POST --form 'chart=@#{package_name}-#{package_version}.tgz' --user #{username}:#{access_token} ${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/helm/api/stable/charts --output /dev/null --silent)
+ - '[ $http_code = "201" ]'
+ only:
+ - "#{package_project.default_branch}"
+ tags:
+ - "runner-for-#{package_project.group.name}"
+ YAML
+ }
+ end
+
+ let(:package_chart_yaml_file) do
+ {
+ file_path: "Chart.yaml",
+ content:
+ <<~EOF
+ apiVersion: v2
+ name: #{package_name}
+ description: GitLab QA helm package
+ type: application
+ version: #{package_version}
+ appVersion: "1.16.0"
+ EOF
+ }
+ end
+
+ let(:client_gitlab_ci_file) do
+ {
+ file_path: '.gitlab-ci.yml',
+ content:
+ <<~YAML
+ pull:
+ image: alpine:3
+ script:
+ - apk add helm --repository=http://dl-cdn.alpinelinux.org/alpine/edge/testing
+ - helm repo add --username #{username} --password #{access_token} gitlab_qa ${CI_API_V4_URL}/projects/#{package_project.id}/packages/helm/stable
+ - helm repo update
+ - helm pull gitlab_qa/#{package_name}
+ only:
+ - "#{client_project.default_branch}"
+ tags:
+ - "runner-for-#{client_project.group.name}"
+ YAML
+ }
+ end
+
+ %i[personal_access_token ci_job_token project_deploy_token].each do |authentication_token_type|
+ context "using a #{authentication_token_type}" do
+ let(:username) do
+ case authentication_token_type
+ when :personal_access_token
+ Runtime::User.username
+ when :ci_job_token
+ 'gitlab-ci-token'
+ when :project_deploy_token
+ project_deploy_token.username
+ end
+ end
+
+ let(:access_token) do
+ case authentication_token_type
+ when :personal_access_token
+ personal_access_token
+ when :ci_job_token
+ '${CI_JOB_TOKEN}'
+ when :project_deploy_token
+ project_deploy_token.password
+ end
+ end
+
+ it "pushes and pulls a helm chart" do
+ # pushing
+ Resource::Repository::Commit.fabricate_via_api! do |commit|
+ commit.project = package_project
+ commit.commit_message = 'Add .gitlab-ci.yml'
+ commit.add_files([package_gitlab_ci_file, package_chart_yaml_file])
+ end
+
+ package_project.visit!
+
+ Flow::Pipeline.visit_latest_pipeline
+
+ Page::Project::Pipeline::Show.perform do |pipeline|
+ pipeline.click_job('deploy')
+ end
+
+ Page::Project::Job::Show.perform do |job|
+ expect(job).to be_successful(timeout: 800)
+ end
+
+ Page::Project::Menu.perform(&:click_packages_link)
+
+ Page::Project::Packages::Index.perform do |index|
+ expect(index).to have_package(package_name)
+
+ index.click_package(package_name)
+ end
+
+ Page::Project::Packages::Show.perform do |show|
+ expect(show).to have_package_info(package_name, package_version)
+ end
+
+ # pulling
+ Resource::Repository::Commit.fabricate_via_api! do |commit|
+ commit.project = client_project
+ commit.commit_message = 'Add .gitlab-ci.yml'
+ commit.add_files([client_gitlab_ci_file])
+ end
+
+ client_project.visit!
+
+ Flow::Pipeline.visit_latest_pipeline
+
+ Page::Project::Pipeline::Show.perform do |pipeline|
+ pipeline.click_job('pull')
+ end
+
+ Page::Project::Job::Show.perform do |job|
+ expect(job).to be_successful(timeout: 800)
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/qa/qa/specs/features/browser_ui/5_package/maven_gradle_repository_spec.rb b/qa/qa/specs/features/browser_ui/5_package/maven_gradle_repository_spec.rb
index fb3f2abd87a..ec9feca84b9 100644
--- a/qa/qa/specs/features/browser_ui/5_package/maven_gradle_repository_spec.rb
+++ b/qa/qa/specs/features/browser_ui/5_package/maven_gradle_repository_spec.rb
@@ -5,57 +5,13 @@ module QA
describe 'Maven Repository with Gradle' do
using RSpec::Parameterized::TableSyntax
include Runtime::Fixtures
+ include_context 'packages registry qa scenario'
let(:group_id) { 'com.gitlab.qa' }
let(:artifact_id) { 'maven_gradle' }
let(:package_name) { "#{group_id}/#{artifact_id}".tr('.', '/') }
let(:package_version) { '1.3.7' }
-
- let(:personal_access_token) { Runtime::Env.personal_access_token }
-
- let(:package_project) do
- Resource::Project.fabricate_via_api! do |project|
- project.name = 'maven-with-gradle-project'
- project.initialize_with_readme = true
- project.visibility = :private
- end
- end
-
- let(:client_project) do
- Resource::Project.fabricate_via_api! do |client_project|
- client_project.name = 'gradle_client'
- client_project.initialize_with_readme = true
- client_project.group = package_project.group
- end
- end
-
- let(:package) do
- Resource::Package.init do |package|
- package.name = package_name
- package.project = package_project
- end
- end
-
- let(:runner) do
- Resource::Runner.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.runners_token
- end
- end
-
- let(:gitlab_address_with_port) do
- uri = URI.parse(Runtime::Scenario.gitlab_address)
- "#{uri.scheme}://#{uri.host}:#{uri.port}"
- end
-
- let(:project_deploy_token) do
- Resource::DeployToken.fabricate_via_browser_ui! do |deploy_token|
- deploy_token.name = 'maven-with-gradle-deploy-token'
- deploy_token.project = package_project
- end
- end
+ let(:package_type) { 'maven_gradle' }
let(:package_gitlab_ci_file) do
{
@@ -127,18 +83,6 @@ module QA
}
end
- before do
- Flow::Login.sign_in_unless_signed_in
- runner
- end
-
- after do
- runner.remove_via_api!
- package.remove_via_api!
- package_project.remove_via_api!
- client_project.remove_via_api!
- end
-
where(:authentication_token_type, :maven_header_name) do
:personal_access_token | 'Private-Token'
:ci_job_token | 'Job-Token'
diff --git a/qa/qa/specs/features/browser_ui/7_configure/kubernetes/kubernetes_integration_spec.rb b/qa/qa/specs/features/browser_ui/7_configure/kubernetes/kubernetes_integration_spec.rb
index ba41285ebca..b928eae62e6 100644
--- a/qa/qa/specs/features/browser_ui/7_configure/kubernetes/kubernetes_integration_spec.rb
+++ b/qa/qa/specs/features/browser_ui/7_configure/kubernetes/kubernetes_integration_spec.rb
@@ -2,7 +2,7 @@
module QA
RSpec.describe 'Configure', except: { job: 'review-qa-*' } do
- describe 'Kubernetes Cluster Integration', :requires_admin, :skip_live_env, :smoke do
+ describe 'Kubernetes Cluster Integration', :orchestrated, :requires_admin, :skip_live_env do
context 'Project Clusters' do
let!(:cluster) { Service::KubernetesCluster.new(provider_class: Service::ClusterProvider::K3s).create! }
let(:project) do
diff --git a/qa/qa/support/api.rb b/qa/qa/support/api.rb
index 205ddf7ad3a..663761805ee 100644
--- a/qa/qa/support/api.rb
+++ b/qa/qa/support/api.rb
@@ -8,63 +8,93 @@ module QA
HTTP_STATUS_NO_CONTENT = 204
HTTP_STATUS_ACCEPTED = 202
HTTP_STATUS_NOT_FOUND = 404
+ HTTP_STATUS_TOO_MANY_REQUESTS = 429
HTTP_STATUS_SERVER_ERROR = 500
def post(url, payload, args = {})
- default_args = {
- method: :post,
- url: url,
- payload: payload,
- verify_ssl: false
- }
-
- RestClient::Request.execute(
- default_args.merge(args)
- )
- rescue RestClient::ExceptionWithResponse => e
- return_response_or_raise(e)
+ with_retry_on_too_many_requests do
+ default_args = {
+ method: :post,
+ url: url,
+ payload: payload,
+ verify_ssl: false
+ }
+
+ RestClient::Request.execute(
+ default_args.merge(args)
+ )
+ rescue RestClient::ExceptionWithResponse => e
+ return_response_or_raise(e)
+ end
end
def get(url, args = {})
- default_args = {
- method: :get,
- url: url,
- verify_ssl: false
- }
-
- RestClient::Request.execute(
- default_args.merge(args)
- )
- rescue RestClient::ExceptionWithResponse => e
- return_response_or_raise(e)
+ with_retry_on_too_many_requests do
+ default_args = {
+ method: :get,
+ url: url,
+ verify_ssl: false
+ }
+
+ RestClient::Request.execute(
+ default_args.merge(args)
+ )
+ rescue RestClient::ExceptionWithResponse => e
+ return_response_or_raise(e)
+ end
end
def put(url, payload = nil)
- RestClient::Request.execute(
- method: :put,
- url: url,
- payload: payload,
- verify_ssl: false)
- rescue RestClient::ExceptionWithResponse => e
- return_response_or_raise(e)
+ with_retry_on_too_many_requests do
+ RestClient::Request.execute(
+ method: :put,
+ url: url,
+ payload: payload,
+ verify_ssl: false)
+ rescue RestClient::ExceptionWithResponse => e
+ return_response_or_raise(e)
+ end
end
def delete(url)
- RestClient::Request.execute(
- method: :delete,
- url: url,
- verify_ssl: false)
- rescue RestClient::ExceptionWithResponse => e
- return_response_or_raise(e)
+ with_retry_on_too_many_requests do
+ RestClient::Request.execute(
+ method: :delete,
+ url: url,
+ verify_ssl: false)
+ rescue RestClient::ExceptionWithResponse => e
+ return_response_or_raise(e)
+ end
end
def head(url)
- RestClient::Request.execute(
- method: :head,
- url: url,
- verify_ssl: false)
- rescue RestClient::ExceptionWithResponse => e
- return_response_or_raise(e)
+ with_retry_on_too_many_requests do
+ RestClient::Request.execute(
+ method: :head,
+ url: url,
+ verify_ssl: false)
+ rescue RestClient::ExceptionWithResponse => e
+ return_response_or_raise(e)
+ end
+ end
+
+ def with_retry_on_too_many_requests
+ response = nil
+
+ Support::Retrier.retry_until(log: false) do
+ response = yield
+
+ if response.code == HTTP_STATUS_TOO_MANY_REQUESTS
+ wait_seconds = response.headers[:retry_after].to_i
+ QA::Runtime::Logger.debug("Received 429 - Too many requests. Waiting for #{wait_seconds} seconds.")
+
+ sleep wait_seconds
+ end
+
+ response.code != HTTP_STATUS_TOO_MANY_REQUESTS
+ end
+
+ response
end
def parse_body(response)
diff --git a/qa/qa/support/formatters/test_stats_formatter.rb b/qa/qa/support/formatters/test_stats_formatter.rb
index 0f76a924b10..0484bd7f90f 100644
--- a/qa/qa/support/formatters/test_stats_formatter.rb
+++ b/qa/qa/support/formatters/test_stats_formatter.rb
@@ -32,7 +32,6 @@ module QA
influxdb_token,
bucket: 'e2e-test-stats',
org: 'gitlab-qa',
- use_ssl: false,
precision: InfluxDB2::WritePrecision::NANOSECOND
)
end
@@ -57,19 +56,22 @@ module QA
# @param [RSpec::Core::Example] example
# @return [Hash]
def test_stats(example)
+ file_path = example.metadata[:file_path].gsub('./qa/specs/features', '')
+
{
name: 'test-stats',
time: time,
tags: {
name: example.full_description,
- file_path: example.metadata[:file_path].gsub('./qa/specs/features', ''),
+ file_path: file_path,
status: example.execution_result.status,
reliable: example.metadata.key?(:reliable).to_s,
quarantined: example.metadata.key?(:quarantine).to_s,
retried: ((example.metadata[:retry_attempts] || 0) > 0).to_s,
job_name: job_name,
merge_request: merge_request,
- run_type: env('QA_RUN_TYPE') || run_type
+ run_type: env('QA_RUN_TYPE') || run_type,
+ stage: devops_stage(file_path)
},
fields: {
id: example.id,
@@ -113,11 +115,11 @@ module QA
@merge_request ||= (!!env('CI_MERGE_REQUEST_IID') || !!env('TOP_UPSTREAM_MERGE_REQUEST_IID')).to_s
end
- # Test run type from staging, canary or production env
+ # Test run type from staging, canary, preprod or production env
#
- # @return [String>, nil]
+ # @return [String, nil]
def run_type
- return unless %w[staging canary production].include?(project_name)
+ return unless %w[staging canary preprod production].include?(project_name)
@run_type ||= begin
test_subset = if env('NO_ADMIN') == 'true'
@@ -150,6 +152,14 @@ module QA
ENV[name]
end
+
+ # Get spec devops stage
+ #
+ # @param [String] location
+ # @return [String, nil]
+ def devops_stage(file_path)
+ file_path.match(%r{(\d{1,2}_\w+)/})&.captures&.first
+ end
end
end
end
diff --git a/qa/qa/support/retrier.rb b/qa/qa/support/retrier.rb
index fde8ac263ca..aa568d633fc 100644
--- a/qa/qa/support/retrier.rb
+++ b/qa/qa/support/retrier.rb
@@ -34,15 +34,29 @@ module QA
result
end
- def retry_until(max_attempts: nil, max_duration: nil, reload_page: nil, sleep_interval: 0, raise_on_failure: true, retry_on_exception: false, log: true)
+ def retry_until(
+ max_attempts: nil,
+ max_duration: nil,
+ reload_page: nil,
+ sleep_interval: 0,
+ raise_on_failure: true,
+ retry_on_exception: false,
+ log: true
+ )
# For backwards-compatibility
max_attempts = 3 if max_attempts.nil? && max_duration.nil?
if log
- start_msg ||= ["with retry_until:"]
+ start_msg = ["with retry_until:"]
start_msg << "max_attempts: #{max_attempts};" if max_attempts
start_msg << "max_duration: #{max_duration};" if max_duration
- start_msg << "reload_page: #{reload_page}; sleep_interval: #{sleep_interval}; raise_on_failure: #{raise_on_failure}; retry_on_exception: #{retry_on_exception}"
+ start_msg.push(*[
+ "reload_page: #{reload_page};",
+ "sleep_interval: #{sleep_interval};",
+ "raise_on_failure: #{raise_on_failure};",
+ "retry_on_exception: #{retry_on_exception}"
+ ])
+
QA::Runtime::Logger.debug(start_msg.join(' '))
end
@@ -58,7 +72,7 @@ module QA
) do
result = yield
end
- QA::Runtime::Logger.debug("ended retry_until")
+ QA::Runtime::Logger.debug("ended retry_until") if log
result
end
diff --git a/qa/qa/tools/delete_subgroups.rb b/qa/qa/tools/delete_subgroups.rb
index 2734a702536..bc905fdeadd 100644
--- a/qa/qa/tools/delete_subgroups.rb
+++ b/qa/qa/tools/delete_subgroups.rb
@@ -20,16 +20,10 @@ module QA
end
def run
- $stdout.puts 'Running...'
+ $stdout.puts 'Fetching subgroups for deletion...'
- # Fetch group's id
- group_id = fetch_group_id
-
- sub_groups_head_response = head Runtime::API::Request.new(@api_client, "/groups/#{group_id}/subgroups", per_page: "100").url
- total_sub_group_pages = sub_groups_head_response.headers[:x_total_pages]
-
- sub_group_ids = fetch_subgroup_ids(group_id, total_sub_group_pages)
- $stdout.puts "Number of Sub Groups not already marked for deletion: #{sub_group_ids.length}"
+ sub_group_ids = fetch_subgroup_ids
+ $stdout.puts "\nNumber of Sub Groups not already marked for deletion: #{sub_group_ids.length}"
delete_subgroups(sub_group_ids) unless sub_group_ids.empty?
$stdout.puts "\nDone"
@@ -52,12 +46,20 @@ module QA
JSON.parse(group_search_response.body)["id"]
end
- def fetch_subgroup_ids(group_id, group_pages)
+ def fetch_subgroup_ids
+ group_id = fetch_group_id
sub_groups_ids = []
+ page_no = '1'
+
+ # When we reach the last page, the x-next-page header is a blank string
+ while page_no.present?
+ $stdout.print '.'
+
+ sub_groups_response = get Runtime::API::Request.new(@api_client, "/groups/#{group_id}/subgroups", page: page_no, per_page: '100').url
+ sub_groups_ids.concat(JSON.parse(sub_groups_response.body)
+ .reject { |subgroup| !subgroup["marked_for_deletion_on"].nil? }.map { |subgroup| subgroup['id'] })
- group_pages.to_i.times do |page_no|
- sub_groups_response = get Runtime::API::Request.new(@api_client, "/groups/#{group_id}/subgroups", page: (page_no + 1).to_s, per_page: "100").url
- sub_groups_ids.concat(JSON.parse(sub_groups_response.body).reject { |subgroup| !subgroup["marked_for_deletion_on"].nil? }.map { |subgroup| subgroup["id"] })
+ page_no = sub_groups_response.headers[:x_next_page].to_s
end
sub_groups_ids.uniq
diff --git a/qa/spec/spec_helper.rb b/qa/spec/spec_helper.rb
index 4f0f93bf020..e25892a008f 100644
--- a/qa/spec/spec_helper.rb
+++ b/qa/spec/spec_helper.rb
@@ -17,6 +17,7 @@ QA::Runtime::AllureReport.configure!
QA::Runtime::Scenario.from_env(QA::Runtime::Env.runtime_scenario_attributes)
Dir[::File.join(__dir__, "support/shared_examples/*.rb")].sort.each { |f| require f }
+Dir[::File.join(__dir__, "support/shared_contexts/*.rb")].sort.each { |f| require f }
RSpec.configure do |config|
config.include QA::Support::Matchers::EventuallyMatcher
diff --git a/qa/spec/specs/allure_report_spec.rb b/qa/spec/specs/allure_report_spec.rb
index 34116ca6cbd..03bf77039cc 100644
--- a/qa/spec/specs/allure_report_spec.rb
+++ b/qa/spec/specs/allure_report_spec.rb
@@ -45,14 +45,18 @@ describe QA::Runtime::AllureReport do
let(:png_file) { 'png-file' }
let(:html_file) { 'html-file' }
let(:ci_job) { 'ee:relative 5' }
+ let(:versions) { { version: '14', revision: '6ced31db947' } }
before do
stub_env('CI', 'true')
stub_env('CI_JOB_NAME', ci_job)
+ stub_env('GITLAB_QA_ADMIN_ACCESS_TOKEN', 'token')
allow(Allure).to receive(:add_attachment)
allow(File).to receive(:open).with(png_path) { png_file }
allow(File).to receive(:open).with(html_path) { html_file }
+ allow(RestClient::Request).to receive(:execute) { double('response', code: 200, body: versions.to_json) }
+ allow(QA::Runtime::Scenario).to receive(:method_missing).with(:gitlab_address).and_return('gitlab.com')
described_class.configure!
end
@@ -61,7 +65,7 @@ describe QA::Runtime::AllureReport do
aggregate_failures do
expect(allure_config.results_directory).to eq('tmp/allure-results')
expect(allure_config.clean_results_directory).to eq(true)
- expect(allure_config.environment_properties).to be_a_kind_of(Hash)
+ expect(allure_config.environment_properties.call).to eq(versions)
expect(allure_config.environment).to eq('ee:relative')
end
end
diff --git a/qa/spec/support/formatters/test_stats_formatter_spec.rb b/qa/spec/support/formatters/test_stats_formatter_spec.rb
index fec7ec1c7c0..859d45a660b 100644
--- a/qa/spec/support/formatters/test_stats_formatter_spec.rb
+++ b/qa/spec/support/formatters/test_stats_formatter_spec.rb
@@ -18,12 +18,13 @@ describe QA::Support::Formatters::TestStatsFormatter do
let(:quarantined) { 'false' }
let(:influx_client) { instance_double('InfluxDB2::Client', create_write_api: influx_write_api) }
let(:influx_write_api) { instance_double('InfluxDB2::WriteApi', write: nil) }
+ let(:stage) { '1_manage' }
+ let(:file_path) { "./qa/specs/features/#{stage}/subfolder/some_spec.rb" }
let(:influx_client_args) do
{
bucket: 'e2e-test-stats',
org: 'gitlab-qa',
- use_ssl: false,
precision: InfluxDB2::WritePrecision::NANOSECOND
}
end
@@ -34,14 +35,15 @@ describe QA::Support::Formatters::TestStatsFormatter do
time: DateTime.strptime(ci_timestamp).to_time,
tags: {
name: 'stats export spec',
- file_path: './spec/support/formatters/test_stats_formatter_spec.rb',
+ file_path: file_path.gsub('./qa/specs/features', ''),
status: :passed,
reliable: reliable,
quarantined: quarantined,
retried: "false",
job_name: "test-job",
merge_request: "false",
- run_type: run_type
+ run_type: run_type,
+ stage: stage
},
fields: {
id: './spec/support/formatters/test_stats_formatter_spec.rb[1:1]',
@@ -57,7 +59,9 @@ describe QA::Support::Formatters::TestStatsFormatter do
def run_spec(&spec)
spec ||= -> { it('spec') {} }
- describe_successfully('stats export', &spec)
+ describe_successfully('stats export', &spec).tap do |example_group|
+ example_group.examples.each { |ex| ex.metadata[:file_path] = file_path }
+ end
send_stop_notification
end
diff --git a/qa/spec/support/shared_contexts/packages_registry_shared_context.rb b/qa/spec/support/shared_contexts/packages_registry_shared_context.rb
new file mode 100644
index 00000000000..6e197015640
--- /dev/null
+++ b/qa/spec/support/shared_contexts/packages_registry_shared_context.rb
@@ -0,0 +1,63 @@
+# frozen_string_literal: true
+
+module QA
+ RSpec.shared_context 'packages registry qa scenario' do
+ let(:personal_access_token) { Runtime::Env.personal_access_token }
+
+ let(:package_project) do
+ Resource::Project.fabricate_via_api! do |project|
+ project.name = "#{package_type}_package_project"
+ project.initialize_with_readme = true
+ project.visibility = :private
+ end
+ end
+
+ let(:client_project) do
+ Resource::Project.fabricate_via_api! do |client_project|
+ client_project.name = "#{package_type}_client_project"
+ client_project.initialize_with_readme = true
+ client_project.group = package_project.group
+ end
+ end
+
+ let(:package) do
+ Resource::Package.init do |package|
+ package.name = package_name
+ package.project = package_project
+ end
+ end
+
+ let(:runner) do
+ Resource::Runner.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.runners_token
+ end
+ end
+
+ let(:gitlab_address_with_port) do
+ uri = URI.parse(Runtime::Scenario.gitlab_address)
+ "#{uri.scheme}://#{uri.host}:#{uri.port}"
+ end
+
+ let(:project_deploy_token) do
+ Resource::DeployToken.fabricate_via_browser_ui! do |deploy_token|
+ deploy_token.name = 'helm-package-deploy-token'
+ deploy_token.project = package_project
+ end
+ end
+
+ before do
+ Flow::Login.sign_in_unless_signed_in
+ runner
+ end
+
+ after do
+ runner.remove_via_api!
+ package.remove_via_api!
+ package_project.remove_via_api!
+ client_project.remove_via_api!
+ end
+ end
+end
diff --git a/scripts/frontend/start_storybook.sh b/scripts/frontend/start_storybook.sh
new file mode 100755
index 00000000000..7ae0a21b15b
--- /dev/null
+++ b/scripts/frontend/start_storybook.sh
@@ -0,0 +1,18 @@
+#!/bin/bash
+
+bold=$(tput bold)
+normal=$(tput sgr0)
+
+echo -e "Storybook provides a mock server that allows creating stories for components that make HTTP requests."
+echo -e "${bold}Storybook will fail to start if it can’t find the fixtures used by the mock server.${normal}\n"
+read -rp "Would you like to generate/update the frontend fixtures used by the mock server (y/N)? " answer
+
+if [[ "$answer" =~ ^(Y|y)$ ]] ; then
+ bundle exec rake frontend:mock_server_fixtures
+fi
+
+if ! [[ -d storybook/node_modules ]] ; then
+ yarn storybook:install
+fi
+
+yarn --cwd ./storybook start
diff --git a/scripts/frontend/startup_css/startup_css_changed.sh b/scripts/frontend/startup_css/startup_css_changed.sh
index 2713d752974..db6fb575d1d 100755
--- a/scripts/frontend/startup_css/startup_css_changed.sh
+++ b/scripts/frontend/startup_css/startup_css_changed.sh
@@ -7,7 +7,13 @@ echo ""
echo "https://gitlab.com/gitlab-org/gitlab/-/issues/331812"
echo "-----------------------------------------------------------"
-startup_glob="*stylesheets/startup*"
+startup_glob="app/assets/stylesheets/startup*"
+
+if ! [ "$FOSS_ONLY" ]
+then
+ startup_glob="*${startup_glob}"
+fi
+
echo "Staging changes to '${startup_glob}' so we can check for untracked files..."
git add "${startup_glob}"
diff --git a/scripts/lint-doc.sh b/scripts/lint-doc.sh
index 0157f0c0812..e99b8a47301 100755
--- a/scripts/lint-doc.sh
+++ b/scripts/lint-doc.sh
@@ -67,7 +67,7 @@ fi
# Do not use 'README.md', instead use 'index.md'
# Number of 'README.md's as of 2021-08-17
-NUMBER_READMES=13
+NUMBER_READMES=0
FIND_READMES=$(find doc/ -name "README.md" | wc -l)
echo '=> Checking for new README.md files...'
echo
@@ -81,6 +81,22 @@ then
((ERRORCODE++))
fi
+# Do not use dashes (-) in directory names, use underscores (_) instead.
+# Number of directories with dashes as of 2021-09-17
+NUMBER_DASHES=2
+FIND_DASHES=$(find doc -type d -name "*-*" | wc -l)
+echo '=> Checking for directory names containing dashes...'
+echo
+if [ ${FIND_DASHES} -ne $NUMBER_DASHES ]
+then
+ echo
+ echo ' ✖ ERROR: The number of directory names containing dashes has changed. Use underscores instead of dashes for the directory names.' >&2
+ echo ' ✖ If removing a directory containing dashes, update NUMBER_DASHES in lint-doc.sh.' >&2
+ echo ' https://docs.gitlab.com/ee/development/documentation/styleguide/index.html#work-with-directories-and-files'
+ echo
+ ((ERRORCODE++))
+fi
+
# Run Vale and Markdownlint 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 test on all files.
diff --git a/scripts/prepare_build.sh b/scripts/prepare_build.sh
index f3b9ac56082..4b528696322 100644
--- a/scripts/prepare_build.sh
+++ b/scripts/prepare_build.sh
@@ -38,18 +38,6 @@ sed -i 's|url:.*$|url: redis://redis:6379|g' config/cable.yml
cp config/resque.yml.example config/resque.yml
sed -i 's|url:.*$|url: redis://redis:6379|g' config/resque.yml
-cp config/redis.cache.yml.example config/redis.cache.yml
-sed -i 's|url:.*$|url: redis://redis:6379/10|g' config/redis.cache.yml
-
-cp config/redis.queues.yml.example config/redis.queues.yml
-sed -i 's|url:.*$|url: redis://redis:6379/11|g' config/redis.queues.yml
-
-cp config/redis.shared_state.yml.example config/redis.shared_state.yml
-sed -i 's|url:.*$|url: redis://redis:6379/12|g' config/redis.shared_state.yml
-
-cp config/redis.trace_chunks.yml.example config/redis.trace_chunks.yml
-sed -i 's|url:.*$|url: redis://redis:6379/13|g' config/redis.trace_chunks.yml
-
if [ "$SETUP_DB" != "false" ]; then
setup_db
elif getent hosts postgres; then
diff --git a/scripts/rails-update-bisect b/scripts/rails-update-bisect
new file mode 100755
index 00000000000..77a01e2dadc
--- /dev/null
+++ b/scripts/rails-update-bisect
@@ -0,0 +1,39 @@
+#!/bin/bash
+SCRIPT_DIR="$( cd "$( dirname "$0" )" && pwd )"
+GITLAB_DIR="$(dirname "$SCRIPT_DIR")"
+
+# Because this script is intended to be run with `git bisect run`,
+# we are returning `-1` status code to alert `git bisect` of failures.
+#
+# See: https://git-scm.com/docs/git-bisect#_bisect_run
+#
+abort_bisect () {
+ exit -1
+}
+
+if [ $# -eq 0 ]; then
+ echo "No arguments supplied. Please provide spec file(s) as first argument(s)"
+ abort_bisect
+fi
+
+[[ -z "${RAILS_FOLDER}" ]] && { echo >&2 "RAILS_FOLDER env variable is not set"; abort_bisect; }
+
+if ! grep -q -E "gem 'rails'.+RAILS_VERSION.+RAILS_FOLDER" $GITLAB_DIR/Gemfile; then
+ echo "Gemfile is not modified"
+ echo "Please alter the gem 'rails' line in Gemfile with:"
+ echo "gem 'rails', ENV['RAILS_VERSION'], path: ENV['RAILS_FOLDER']"
+ abort_bisect
+fi
+
+export RAILS_VERSION=$(cat $RAILS_FOLDER/RAILS_VERSION)
+
+cd $GITLAB_DIR && \
+echo "Updating dependencies... this could take a while." && \
+bundle update rails --quiet
+
+test $? -eq 0 || { echo >&2 "bundle update has failed"; abort_bisect; }
+
+# Stop spring if it's installed
+command -v spring >/dev/null 2>&1 && spring stop
+
+bin/rspec $@
diff --git a/scripts/review_apps/automated_cleanup.rb b/scripts/review_apps/automated_cleanup.rb
index 90dc0fd418e..e6efbca9e86 100755
--- a/scripts/review_apps/automated_cleanup.rb
+++ b/scripts/review_apps/automated_cleanup.rb
@@ -8,6 +8,10 @@ class AutomatedCleanup
attr_reader :project_path, :gitlab_token
DEPLOYMENTS_PER_PAGE = 100
+ ENVIRONMENT_PREFIX = {
+ review_app: 'review/',
+ docs_review_app: 'review-docs/'
+ }.freeze
IGNORED_HELM_ERRORS = [
'transport is closing',
'error upgrading connection',
@@ -62,13 +66,14 @@ class AutomatedCleanup
releases_to_delete = []
+ # Delete environments via deployments
gitlab.deployments(project_path, per_page: DEPLOYMENTS_PER_PAGE, sort: 'desc').auto_paginate do |deployment|
break if Time.parse(deployment.created_at) < deployments_look_back_threshold
environment = deployment.environment
next unless environment
- next unless environment.name.start_with?('review/')
+ next unless environment.name.start_with?(ENVIRONMENT_PREFIX[:review_app])
next if checked_environments.include?(environment.slug)
last_deploy = deployment.created_at
@@ -92,6 +97,10 @@ class AutomatedCleanup
checked_environments << environment.slug
end
+ delete_stopped_environments(environment_type: :review_app, checked_environments: checked_environments, last_updated_threshold: delete_threshold) do |environment|
+ releases_to_delete << Tooling::Helm3Client::Release.new(environment.slug, 1, environment.updated_at, nil, nil, review_apps_namespace)
+ end
+
delete_helm_releases(releases_to_delete)
end
@@ -102,14 +111,12 @@ class AutomatedCleanup
stop_threshold = threshold_time(days: days_for_stop)
delete_threshold = threshold_time(days: days_for_delete)
- max_delete_count = 1000
- delete_count = 0
-
+ # Delete environments via deployments
gitlab.deployments(project_path, per_page: DEPLOYMENTS_PER_PAGE, sort: 'desc').auto_paginate do |deployment|
environment = deployment.environment
next unless environment
- next unless environment.name.start_with?('review-docs/')
+ next unless environment.name.start_with?(ENVIRONMENT_PREFIX[:docs_review_app])
next if checked_environments.include?(environment.slug)
last_deploy = deployment.created_at
@@ -120,15 +127,12 @@ class AutomatedCleanup
stop_environment(environment, deployment) if environment_state && environment_state != 'stopped'
end
- if deployed_at < delete_threshold
- delete_environment(environment, deployment)
- delete_count += 1
-
- break if delete_count > max_delete_count
- end
+ delete_environment(environment, deployment) if deployed_at < delete_threshold
checked_environments << environment.slug
end
+
+ delete_stopped_environments(environment_type: :docs_review_app, checked_environments: checked_environments, last_updated_threshold: delete_threshold)
end
def perform_helm_releases_cleanup!(days:)
@@ -171,8 +175,9 @@ class AutomatedCleanup
nil
end
- def delete_environment(environment, deployment)
- print_release_state(subject: 'Review app', release_name: environment.slug, release_date: deployment.created_at, action: 'deleting')
+ def delete_environment(environment, deployment = nil)
+ release_date = deployment ? deployment.created_at : environment.updated_at
+ print_release_state(subject: 'Review app', release_name: environment.slug, release_date: release_date, action: 'deleting')
gitlab.delete_environment(project_path, environment.id)
rescue Gitlab::Error::Forbidden
@@ -187,6 +192,24 @@ class AutomatedCleanup
puts "Review app '#{environment.name}' / '#{environment.slug}' (##{environment.id}) is forbidden: skipping it"
end
+ def delete_stopped_environments(environment_type:, checked_environments:, last_updated_threshold:)
+ 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)
+
+ checked_environments << environment.slug
+ end
+ end
+
+ def skip_environment?(environment:, checked_environments:, last_updated_threshold:, environment_type:)
+ return true unless environment.name.start_with?(ENVIRONMENT_PREFIX[environment_type])
+ return true if checked_environments.include?(environment.slug)
+ return true if Time.parse(environment.updated_at) > last_updated_threshold
+
+ false
+ end
+
def helm_releases
args = ['--all', '--date']
diff --git a/scripts/rspec_helpers.sh b/scripts/rspec_helpers.sh
index 797d9188f81..accc52a7ece 100644
--- a/scripts/rspec_helpers.sh
+++ b/scripts/rspec_helpers.sh
@@ -98,7 +98,7 @@ function rspec_simple_job() {
}
function rspec_db_library_code() {
- local db_files="spec/lib/gitlab/database/ spec/support/helpers/database/"
+ local db_files="spec/lib/gitlab/database/"
rspec_simple_job "-- ${db_files}"
}
@@ -109,14 +109,18 @@ function rspec_paralellized_job() {
local test_level="${job_name[1]}"
local report_name=$(echo "${CI_JOB_NAME}" | sed -E 's|[/ ]|_|g') # e.g. 'rspec unit pg12 1/24' would become 'rspec_unit_pg12_1_24'
local rspec_opts="${1}"
- local spec_folder_prefix=""
+ local spec_folder_prefixes=""
if [[ "${test_tool}" =~ "-ee" ]]; then
- spec_folder_prefix="ee/"
+ spec_folder_prefixes="'ee/'"
fi
if [[ "${test_tool}" =~ "-jh" ]]; then
- spec_folder_prefix="jh/"
+ spec_folder_prefixes="'jh/'"
+ fi
+
+ if [[ "${test_tool}" =~ "-all" ]]; then
+ spec_folder_prefixes="['', 'ee/', 'jh/']"
fi
export KNAPSACK_LOG_LEVEL="debug"
@@ -131,7 +135,7 @@ function rspec_paralellized_job() {
cp "${KNAPSACK_RSPEC_SUITE_REPORT_PATH}" "${KNAPSACK_REPORT_PATH}"
if [[ -z "${KNAPSACK_TEST_FILE_PATTERN}" ]]; then
- pattern=$(ruby -r./tooling/quality/test_level.rb -e "puts Quality::TestLevel.new(%(${spec_folder_prefix})).pattern(:${test_level})")
+ pattern=$(ruby -r./tooling/quality/test_level.rb -e "puts Quality::TestLevel.new(${spec_folder_prefixes}).pattern(:${test_level})")
export KNAPSACK_TEST_FILE_PATTERN="${pattern}"
fi
diff --git a/scripts/rubocop-max-files-in-cache-check b/scripts/rubocop-max-files-in-cache-check
new file mode 100755
index 00000000000..5b422d0a0f4
--- /dev/null
+++ b/scripts/rubocop-max-files-in-cache-check
@@ -0,0 +1,27 @@
+#!/usr/bin/env ruby
+# frozen_string_literal: true
+
+require 'yaml'
+
+MINIMUM_MAX_FILES_IN_CACHE_MARGIN = 1.05
+RECOMMENDED_MAX_FILES_IN_CACHE_MARGIN = 1.25
+RUBOCOP_LIST_TARGET_FILES_COMMAND = 'bundle exec rubocop --list-target-files | wc -l'
+
+RuboCopMaxFilesInCacheIsTooSmall = Class.new(StandardError)
+
+rubocop_target_files_count = `#{RUBOCOP_LIST_TARGET_FILES_COMMAND}`.strip.to_i
+
+raise Error, "#{RUBOCOP_LIST_TARGET_FILES_COMMAND} failed with status #{$?}!" if rubocop_target_files_count == 0
+
+rubocop_target_files_count = rubocop_target_files_count.to_i
+rubocop_current_max_files_in_cache = YAML.load_file(File.expand_path('../.rubocop.yml', __dir__)).dig('AllCops', 'MaxFilesInCache').to_i
+minimum_max_files_in_cache = (rubocop_target_files_count * MINIMUM_MAX_FILES_IN_CACHE_MARGIN).round(-3)
+
+# We want AllCops.MaxFilesInCache to be at least 5% above the actual files count at any time to give us enough time to increase it accordingly
+if rubocop_current_max_files_in_cache <= minimum_max_files_in_cache
+ recommended_max_files_in_cache = (rubocop_target_files_count * RECOMMENDED_MAX_FILES_IN_CACHE_MARGIN).round(-3)
+ raise RuboCopMaxFilesInCacheIsTooSmall, "Current count of RuboCop target file is #{rubocop_target_files_count} but AllCops.MaxFilesInCache is set to #{rubocop_current_max_files_in_cache}. We recommend to increase it to #{recommended_max_files_in_cache}."
+else
+ puts "Current count of RuboCop target file is #{rubocop_target_files_count} and AllCops.MaxFilesInCache is set to #{rubocop_current_max_files_in_cache}. All good."
+ exit(0)
+end
diff --git a/scripts/static-analysis b/scripts/static-analysis
index de5a1b407f9..f50e4a24b58 100755
--- a/scripts/static-analysis
+++ b/scripts/static-analysis
@@ -54,6 +54,7 @@ class StaticAnalysis
Task.new(%w[bin/rake gettext:lint], 85),
Task.new(%W[bundle exec license_finder --decisions-file config/dependency_decisions.yml --project-path #{project_path}], 20),
Task.new(%w[bin/rake lint:static_verification], 35),
+ Task.new(%w[scripts/rubocop-max-files-in-cache-check], 20),
Task.new(%w[bin/rake config_lint], 10),
Task.new(%w[bin/rake gitlab:sidekiq:all_queues_yml:check], 15),
(Gitlab.ee? ? Task.new(%w[bin/rake gitlab:sidekiq:sidekiq_queues_yml:check], 11) : nil),
@@ -65,7 +66,9 @@ class StaticAnalysis
].compact.freeze
def run_tasks!(options = {})
- node_assignment = tasks_to_run((ENV['CI_NODE_TOTAL'] || 1).to_i)[(ENV['CI_NODE_INDEX'] || 1).to_i - 1]
+ total_nodes = (ENV['CI_NODE_TOTAL'] || 1).to_i
+ current_node_number = (ENV['CI_NODE_INDEX'] || 1).to_i
+ node_assignment = tasks_to_run(total_nodes)[current_node_number - 1]
if options[:dry_run]
puts "Dry-run mode!"
diff --git a/scripts/utils.sh b/scripts/utils.sh
index d2e8c151438..faabc151963 100644
--- a/scripts/utils.sh
+++ b/scripts/utils.sh
@@ -60,7 +60,7 @@ function setup_db_user_only() {
function setup_db() {
run_timed_command "setup_db_user_only"
- run_timed_command "bundle exec rake db:drop db:create db:structure:load db:migrate gitlab:db:setup_ee"
+ run_timed_command_with_metric "bundle exec rake db:drop db:create db:structure:load db:migrate gitlab:db:setup_ee" "setup_db"
}
function install_api_client_dependencies_with_apk() {
@@ -78,15 +78,27 @@ function install_tff_gem() {
function run_timed_command() {
local cmd="${1}"
+ local metric_name="${2}"
+ local timed_metric_file
local start=$(date +%s)
+
echosuccess "\$ ${cmd}"
eval "${cmd}"
+
local ret=$?
local end=$(date +%s)
local runtime=$((end-start))
if [[ $ret -eq 0 ]]; then
echosuccess "==> '${cmd}' succeeded in ${runtime} seconds."
+
+ if [[ -n "${metric_name}" ]]; then
+ timed_metric_file=$(timed_metric_file $metric_name)
+ echo "# TYPE ${metric_name} gauge" > "${timed_metric_file}"
+ echo "# UNIT ${metric_name} seconds" >> "${timed_metric_file}"
+ echo "${metric_name} ${runtime}" >> "${timed_metric_file}"
+ fi
+
return 0
else
echoerr "==> '${cmd}' failed (${ret}) in ${runtime} seconds."
@@ -94,6 +106,26 @@ function run_timed_command() {
fi
}
+function run_timed_command_with_metric() {
+ local cmd="${1}"
+ local metric_name="${2}"
+ local metrics_file=${METRICS_FILE:-metrics.txt}
+
+ run_timed_command "${cmd}" "${metric_name}"
+
+ local ret=$?
+
+ cat $(timed_metric_file $metric_name) >> "${metrics_file}"
+
+ return $ret
+}
+
+function timed_metric_file() {
+ local metric_name="${1}"
+
+ echo "$(pwd)/tmp/duration_${metric_name}.txt"
+}
+
function echoerr() {
local header="${2}"
diff --git a/scripts/verify-tff-mapping b/scripts/verify-tff-mapping
index ca73d4f5f7a..ee86f9ecde5 100755
--- a/scripts/verify-tff-mapping
+++ b/scripts/verify-tff-mapping
@@ -102,14 +102,14 @@ tests = [
{
explanation: 'Migration should map to its non-timestamped spec',
- source: 'db/migrate/20191023152913_add_default_and_free_plans.rb',
- expected: ['spec/migrations/add_default_and_free_plans_spec.rb']
+ source: 'db/migrate/20200116175538_update_timestamp_softwarelicensespolicy.rb',
+ expected: ['spec/migrations/update_timestamp_softwarelicensespolicy_spec.rb']
},
{
explanation: 'Migration should map to its timestamped spec',
- source: 'db/post_migrate/20190924152703_migrate_issue_trackers_data.rb',
- expected: ['spec/migrations/20190924152703_migrate_issue_trackers_data_spec.rb']
+ source: 'db/post_migrate/20210915022415_cleanup_bigint_conversion_for_ci_builds.rb',
+ expected: ['spec/migrations/20210915022415_cleanup_bigint_conversion_for_ci_builds_spec.rb']
},
{
diff --git a/spec/config/grape_entity_patch_spec.rb b/spec/config/grape_entity_patch_spec.rb
deleted file mode 100644
index 7334f270ca1..00000000000
--- a/spec/config/grape_entity_patch_spec.rb
+++ /dev/null
@@ -1,21 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe 'Grape::Entity patch' do
- let(:entity_class) { Class.new(Grape::Entity) }
-
- describe 'NameError in block exposure with argument' do
- subject(:represent) { entity_class.represent({}, serializable: true) }
-
- before do
- entity_class.expose :raise_no_method_error do |_|
- foo
- end
- end
-
- it 'propagates the error to the caller' do
- expect { represent }.to raise_error(NameError)
- end
- end
-end
diff --git a/spec/controllers/admin/instance_review_controller_spec.rb b/spec/controllers/admin/instance_review_controller_spec.rb
index d15894eeb5d..898cd30cdca 100644
--- a/spec/controllers/admin/instance_review_controller_spec.rb
+++ b/spec/controllers/admin/instance_review_controller_spec.rb
@@ -6,7 +6,7 @@ RSpec.describe Admin::InstanceReviewController do
include UsageDataHelpers
let(:admin) { create(:admin) }
- let(:subscriptions_url) { ::Gitlab::SubscriptionPortal::SUBSCRIPTIONS_URL }
+ let(:subscriptions_instance_review_url) { Gitlab::SubscriptionPortal.subscriptions_instance_review_url }
before do
sign_in(admin)
@@ -44,7 +44,7 @@ RSpec.describe Admin::InstanceReviewController do
notes_count: 0
} }.to_query
- expect(response).to redirect_to("#{subscriptions_url}/instance_review?#{params}")
+ expect(response).to redirect_to("#{subscriptions_instance_review_url}?#{params}")
end
end
@@ -61,7 +61,7 @@ RSpec.describe Admin::InstanceReviewController do
version: ::Gitlab::VERSION
} }.to_query
- expect(response).to redirect_to("#{subscriptions_url}/instance_review?#{params}")
+ expect(response).to redirect_to("#{subscriptions_instance_review_url}?#{params}")
end
end
end
diff --git a/spec/controllers/admin/serverless/domains_controller_spec.rb b/spec/controllers/admin/serverless/domains_controller_spec.rb
deleted file mode 100644
index e7503fb37fa..00000000000
--- a/spec/controllers/admin/serverless/domains_controller_spec.rb
+++ /dev/null
@@ -1,370 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Admin::Serverless::DomainsController do
- let(:admin) { create(:admin) }
- let(:user) { create(:user) }
-
- describe '#index' do
- context 'non-admin user' do
- before do
- sign_in(user)
- end
-
- it 'responds with 404' do
- get :index
-
- expect(response).to have_gitlab_http_status(:not_found)
- end
- end
-
- context 'admin user' do
- before do
- create(:pages_domain)
- sign_in(admin)
- end
-
- context 'with serverless_domain feature disabled' do
- before do
- stub_feature_flags(serverless_domain: false)
- end
-
- it 'responds with 404' do
- get :index
-
- expect(response).to have_gitlab_http_status(:not_found)
- end
- end
-
- context 'when instance-level serverless domain exists' do
- let!(:serverless_domain) { create(:pages_domain, :instance_serverless) }
-
- it 'loads the instance serverless domain' do
- get :index
-
- expect(assigns(:domain).id).to eq(serverless_domain.id)
- end
- end
-
- context 'when domain does not exist' do
- it 'initializes an instance serverless domain' do
- get :index
-
- domain = assigns(:domain)
-
- expect(domain.persisted?).to eq(false)
- expect(domain.wildcard).to eq(true)
- expect(domain.scope).to eq('instance')
- expect(domain.usage).to eq('serverless')
- end
- end
- end
- end
-
- describe '#create' do
- let(:create_params) do
- sample_domain = build(:pages_domain)
-
- {
- domain: 'serverless.gitlab.io',
- user_provided_certificate: sample_domain.certificate,
- user_provided_key: sample_domain.key
- }
- end
-
- context 'non-admin user' do
- before do
- sign_in(user)
- end
-
- it 'responds with 404' do
- post :create, params: { pages_domain: create_params }
-
- expect(response).to have_gitlab_http_status(:not_found)
- end
- end
-
- context 'admin user' do
- before do
- sign_in(admin)
- end
-
- context 'with serverless_domain feature disabled' do
- before do
- stub_feature_flags(serverless_domain: false)
- end
-
- it 'responds with 404' do
- post :create, params: { pages_domain: create_params }
-
- expect(response).to have_gitlab_http_status(:not_found)
- end
- end
-
- context 'when an instance-level serverless domain exists' do
- let!(:serverless_domain) { create(:pages_domain, :instance_serverless) }
-
- it 'does not create a new domain' do
- expect { post :create, params: { pages_domain: create_params } }.not_to change { PagesDomain.instance_serverless.count }
- end
-
- it 'redirects to index' do
- post :create, params: { pages_domain: create_params }
-
- expect(response).to redirect_to admin_serverless_domains_path
- expect(flash[:notice]).to include('An instance-level serverless domain already exists.')
- end
- end
-
- context 'when an instance-level serverless domain does not exist' do
- it 'creates an instance serverless domain with the provided attributes' do
- expect { post :create, params: { pages_domain: create_params } }.to change { PagesDomain.instance_serverless.count }.by(1)
-
- domain = PagesDomain.instance_serverless.first
- expect(domain.domain).to eq(create_params[:domain])
- expect(domain.certificate).to eq(create_params[:user_provided_certificate])
- expect(domain.key).to eq(create_params[:user_provided_key])
- expect(domain.wildcard).to eq(true)
- expect(domain.scope).to eq('instance')
- expect(domain.usage).to eq('serverless')
- end
-
- it 'redirects to index' do
- post :create, params: { pages_domain: create_params }
-
- expect(response).to redirect_to admin_serverless_domains_path
- expect(flash[:notice]).to include('Domain was successfully created.')
- end
- end
-
- context 'when there are errors' do
- it 'renders index view' do
- post :create, params: { pages_domain: { foo: 'bar' } }
-
- expect(assigns(:domain).errors.size).to be > 0
- expect(response).to render_template('index')
- end
- end
- end
- end
-
- describe '#update' do
- let(:domain) { create(:pages_domain, :instance_serverless) }
-
- let(:update_params) do
- sample_domain = build(:pages_domain)
-
- {
- user_provided_certificate: sample_domain.certificate,
- user_provided_key: sample_domain.key
- }
- end
-
- context 'non-admin user' do
- before do
- sign_in(user)
- end
-
- it 'responds with 404' do
- put :update, params: { id: domain.id, pages_domain: update_params }
-
- expect(response).to have_gitlab_http_status(:not_found)
- end
- end
-
- context 'admin user' do
- before do
- sign_in(admin)
- end
-
- context 'with serverless_domain feature disabled' do
- before do
- stub_feature_flags(serverless_domain: false)
- end
-
- it 'responds with 404' do
- put :update, params: { id: domain.id, pages_domain: update_params }
-
- expect(response).to have_gitlab_http_status(:not_found)
- end
- end
-
- context 'when domain exists' do
- it 'updates the domain with the provided attributes' do
- new_certificate = build(:pages_domain, :ecdsa).certificate
- new_key = build(:pages_domain, :ecdsa).key
-
- put :update, params: { id: domain.id, pages_domain: { user_provided_certificate: new_certificate, user_provided_key: new_key } }
-
- domain.reload
-
- expect(domain.certificate).to eq(new_certificate)
- expect(domain.key).to eq(new_key)
- end
-
- it 'does not update the domain name' do
- put :update, params: { id: domain.id, pages_domain: { domain: 'new.com' } }
-
- expect(domain.reload.domain).not_to eq('new.com')
- end
-
- it 'redirects to index' do
- put :update, params: { id: domain.id, pages_domain: update_params }
-
- expect(response).to redirect_to admin_serverless_domains_path
- expect(flash[:notice]).to include('Domain was successfully updated.')
- end
- end
-
- context 'when domain does not exist' do
- it 'returns 404' do
- put :update, params: { id: 0, pages_domain: update_params }
-
- expect(response).to have_gitlab_http_status(:not_found)
- end
- end
-
- context 'when there are errors' do
- it 'renders index view' do
- put :update, params: { id: domain.id, pages_domain: { user_provided_certificate: 'bad certificate' } }
-
- expect(assigns(:domain).errors.size).to be > 0
- expect(response).to render_template('index')
- end
- end
- end
- end
-
- describe '#verify' do
- let(:domain) { create(:pages_domain, :instance_serverless) }
-
- context 'non-admin user' do
- before do
- sign_in(user)
- end
-
- it 'responds with 404' do
- post :verify, params: { id: domain.id }
-
- expect(response).to have_gitlab_http_status(:not_found)
- end
- end
-
- context 'admin user' do
- before do
- sign_in(admin)
- end
-
- def stub_service
- service = double(:service)
-
- expect(VerifyPagesDomainService).to receive(:new).with(domain).and_return(service)
-
- service
- end
-
- context 'with serverless_domain feature disabled' do
- before do
- stub_feature_flags(serverless_domain: false)
- end
-
- it 'responds with 404' do
- post :verify, params: { id: domain.id }
-
- expect(response).to have_gitlab_http_status(:not_found)
- end
- end
-
- it 'handles verification success' do
- expect(stub_service).to receive(:execute).and_return(status: :success)
-
- post :verify, params: { id: domain.id }
-
- expect(response).to redirect_to admin_serverless_domains_path
- expect(flash[:notice]).to eq('Successfully verified domain ownership')
- end
-
- it 'handles verification failure' do
- expect(stub_service).to receive(:execute).and_return(status: :failed)
-
- post :verify, params: { id: domain.id }
-
- expect(response).to redirect_to admin_serverless_domains_path
- expect(flash[:alert]).to eq('Failed to verify domain ownership')
- end
- end
- end
-
- describe '#destroy' do
- let!(:domain) { create(:pages_domain, :instance_serverless) }
-
- context 'non-admin user' do
- before do
- sign_in(user)
- end
-
- it 'responds with 404' do
- delete :destroy, params: { id: domain.id }
-
- expect(response).to have_gitlab_http_status(:not_found)
- end
- end
-
- context 'admin user' do
- before do
- sign_in(admin)
- end
-
- context 'with serverless_domain feature disabled' do
- before do
- stub_feature_flags(serverless_domain: false)
- end
-
- it 'responds with 404' do
- delete :destroy, params: { id: domain.id }
-
- expect(response).to have_gitlab_http_status(:not_found)
- end
- end
-
- context 'when domain exists' do
- context 'and is not associated to any clusters' do
- it 'deletes the domain' do
- expect { delete :destroy, params: { id: domain.id } }
- .to change { PagesDomain.count }.from(1).to(0)
-
- expect(response).to have_gitlab_http_status(:found)
- expect(flash[:notice]).to include('Domain was successfully deleted.')
- end
- end
-
- context 'and is associated to any clusters' do
- before do
- create(:serverless_domain_cluster, pages_domain: domain)
- end
-
- it 'does not delete the domain' do
- expect { delete :destroy, params: { id: domain.id } }
- .not_to change { PagesDomain.count }
-
- expect(response).to have_gitlab_http_status(:conflict)
- expect(flash[:notice]).to include('Domain cannot be deleted while associated to one or more clusters.')
- end
- end
- end
-
- context 'when domain does not exist' do
- before do
- domain.destroy!
- end
-
- it 'responds with 404' do
- delete :destroy, params: { id: domain.id }
-
- expect(response).to have_gitlab_http_status(:not_found)
- end
- end
- end
- end
-end
diff --git a/spec/controllers/admin/topics/avatars_controller_spec.rb b/spec/controllers/admin/topics/avatars_controller_spec.rb
new file mode 100644
index 00000000000..7edc0e0c497
--- /dev/null
+++ b/spec/controllers/admin/topics/avatars_controller_spec.rb
@@ -0,0 +1,20 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Admin::Topics::AvatarsController do
+ let(:user) { create(:admin) }
+ let(:topic) { create(:topic, avatar: fixture_file_upload("spec/fixtures/dk.png")) }
+
+ before do
+ sign_in(user)
+ controller.instance_variable_set(:@topic, topic)
+ end
+
+ it 'removes avatar from DB by calling destroy' do
+ delete :destroy, params: { topic_id: topic.id }
+ @topic = assigns(:topic)
+ expect(@topic.avatar.present?).to be_falsey
+ expect(@topic).to be_valid
+ end
+end
diff --git a/spec/controllers/admin/topics_controller_spec.rb b/spec/controllers/admin/topics_controller_spec.rb
new file mode 100644
index 00000000000..6d66cb43338
--- /dev/null
+++ b/spec/controllers/admin/topics_controller_spec.rb
@@ -0,0 +1,131 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Admin::TopicsController do
+ let_it_be(:topic) { create(:topic, name: 'topic') }
+ let_it_be(:admin) { create(:admin) }
+ let_it_be(:user) { create(:user) }
+
+ before do
+ sign_in(admin)
+ end
+
+ describe 'GET #index' do
+ it 'renders the template' do
+ get :index
+
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(response).to render_template('index')
+ end
+
+ context 'as a normal user' do
+ before do
+ sign_in(user)
+ end
+
+ it 'renders a 404 error' do
+ get :index
+
+ expect(response).to have_gitlab_http_status(:not_found)
+ end
+ end
+ end
+
+ describe 'GET #new' do
+ it 'renders the template' do
+ get :new
+
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(response).to render_template('new')
+ end
+
+ context 'as a normal user' do
+ before do
+ sign_in(user)
+ end
+
+ it 'renders a 404 error' do
+ get :new
+
+ expect(response).to have_gitlab_http_status(:not_found)
+ end
+ end
+ end
+
+ describe 'GET #edit' do
+ it 'renders the template' do
+ get :edit, params: { id: topic.id }
+
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(response).to render_template('edit')
+ end
+
+ context 'as a normal user' do
+ before do
+ sign_in(user)
+ end
+
+ it 'renders a 404 error' do
+ get :edit, params: { id: topic.id }
+
+ expect(response).to have_gitlab_http_status(:not_found)
+ end
+ end
+ end
+
+ describe 'POST #create' do
+ it 'creates topic' do
+ expect do
+ post :create, params: { projects_topic: { name: 'test' } }
+ end.to change { Projects::Topic.count }.by(1)
+ end
+
+ it 'shows error message for invalid topic' do
+ post :create, params: { projects_topic: { name: nil } }
+
+ errors = assigns[:topic].errors
+ expect(errors).to contain_exactly(errors.full_message(:name, I18n.t('errors.messages.blank')))
+ end
+
+ context 'as a normal user' do
+ before do
+ sign_in(user)
+ end
+
+ it 'renders a 404 error' do
+ post :create, params: { projects_topic: { name: 'test' } }
+
+ expect(response).to have_gitlab_http_status(:not_found)
+ end
+ end
+ end
+
+ describe 'PUT #update' do
+ it 'updates topic' do
+ put :update, params: { id: topic.id, projects_topic: { name: 'test' } }
+
+ expect(response).to redirect_to(edit_admin_topic_path(topic))
+ expect(topic.reload.name).to eq('test')
+ end
+
+ it 'shows error message for invalid topic' do
+ put :update, params: { id: topic.id, projects_topic: { name: nil } }
+
+ errors = assigns[:topic].errors
+ expect(errors).to contain_exactly(errors.full_message(:name, I18n.t('errors.messages.blank')))
+ end
+
+ context 'as a normal user' do
+ before do
+ sign_in(user)
+ end
+
+ it 'renders a 404 error' do
+ put :update, params: { id: topic.id, projects_topic: { name: 'test' } }
+
+ expect(response).to have_gitlab_http_status(:not_found)
+ end
+ end
+ end
+end
diff --git a/spec/controllers/application_controller_spec.rb b/spec/controllers/application_controller_spec.rb
index 218aa04dd3f..e9a49319f21 100644
--- a/spec/controllers/application_controller_spec.rb
+++ b/spec/controllers/application_controller_spec.rb
@@ -704,7 +704,7 @@ RSpec.describe ApplicationController do
get :index
- expect(response.headers['Cache-Control']).to eq 'no-store'
+ expect(response.headers['Cache-Control']).to eq 'private, no-store'
expect(response.headers['Pragma']).to eq 'no-cache'
end
@@ -740,7 +740,7 @@ RSpec.describe ApplicationController do
it 'sets no-cache headers', :aggregate_failures do
subject
- expect(response.headers['Cache-Control']).to eq 'no-store'
+ expect(response.headers['Cache-Control']).to eq 'private, no-store'
expect(response.headers['Pragma']).to eq 'no-cache'
expect(response.headers['Expires']).to eq 'Fri, 01 Jan 1990 00:00:00 GMT'
end
@@ -967,6 +967,14 @@ RSpec.describe ApplicationController do
end
end
+ describe '.endpoint_id_for_action' do
+ controller(described_class) { }
+
+ it 'returns an expected endpoint id' do
+ expect(controller.class.endpoint_id_for_action('hello')).to eq('AnonymousController#hello')
+ end
+ end
+
describe '#current_user' do
controller(described_class) do
def index; end
diff --git a/spec/controllers/boards/issues_controller_spec.rb b/spec/controllers/boards/issues_controller_spec.rb
index cc60ab16d2e..b2200050e41 100644
--- a/spec/controllers/boards/issues_controller_spec.rb
+++ b/spec/controllers/boards/issues_controller_spec.rb
@@ -116,7 +116,7 @@ RSpec.describe Boards::IssuesController do
it 'does not query issues table more than once' do
recorder = ActiveRecord::QueryRecorder.new { list_issues(user: user, board: board, list: list1) }
- query_count = recorder.occurrences.select { |query,| query.start_with?('SELECT issues.*') }.each_value.first
+ query_count = recorder.occurrences.select { |query,| query.match?(/FROM "?issues"?/) }.each_value.first
expect(query_count).to eq(1)
end
diff --git a/spec/controllers/concerns/group_tree_spec.rb b/spec/controllers/concerns/group_tree_spec.rb
index a0707688e54..e808f1caa6e 100644
--- a/spec/controllers/concerns/group_tree_spec.rb
+++ b/spec/controllers/concerns/group_tree_spec.rb
@@ -21,82 +21,94 @@ RSpec.describe GroupTree do
end
describe 'GET #index' do
- it 'filters groups' do
- other_group = create(:group, name: 'filter')
- other_group.add_owner(user)
+ shared_examples 'returns filtered groups' do
+ it 'filters groups' do
+ other_group = create(:group, name: 'filter')
+ other_group.add_owner(user)
- get :index, params: { filter: 'filt' }, format: :json
+ get :index, params: { filter: 'filt' }, format: :json
- expect(assigns(:groups)).to contain_exactly(other_group)
- end
+ expect(assigns(:groups)).to contain_exactly(other_group)
+ end
- context 'for subgroups' do
- it 'only renders root groups when no parent was given' do
- create(:group, :public, parent: group)
+ context 'for subgroups' do
+ it 'only renders root groups when no parent was given' do
+ create(:group, :public, parent: group)
- get :index, format: :json
+ get :index, format: :json
- expect(assigns(:groups)).to contain_exactly(group)
- end
+ expect(assigns(:groups)).to contain_exactly(group)
+ end
- it 'contains only the subgroup when a parent was given' do
- subgroup = create(:group, :public, parent: group)
+ it 'contains only the subgroup when a parent was given' do
+ subgroup = create(:group, :public, parent: group)
- get :index, params: { parent_id: group.id }, format: :json
+ get :index, params: { parent_id: group.id }, format: :json
- expect(assigns(:groups)).to contain_exactly(subgroup)
- end
+ expect(assigns(:groups)).to contain_exactly(subgroup)
+ end
- it 'allows filtering for subgroups and includes the parents for rendering' do
- subgroup = create(:group, :public, parent: group, name: 'filter')
+ it 'allows filtering for subgroups and includes the parents for rendering' do
+ subgroup = create(:group, :public, parent: group, name: 'filter')
- get :index, params: { filter: 'filt' }, format: :json
+ get :index, params: { filter: 'filt' }, format: :json
- expect(assigns(:groups)).to contain_exactly(group, subgroup)
- end
+ expect(assigns(:groups)).to contain_exactly(group, subgroup)
+ end
- it 'does not include groups the user does not have access to' do
- parent = create(:group, :private)
- subgroup = create(:group, :private, parent: parent, name: 'filter')
- subgroup.add_developer(user)
- _other_subgroup = create(:group, :private, parent: parent, name: 'filte')
+ it 'does not include groups the user does not have access to' do
+ parent = create(:group, :private)
+ subgroup = create(:group, :private, parent: parent, name: 'filter')
+ subgroup.add_developer(user)
+ _other_subgroup = create(:group, :private, parent: parent, name: 'filte')
- get :index, params: { filter: 'filt' }, format: :json
+ get :index, params: { filter: 'filt' }, format: :json
- expect(assigns(:groups)).to contain_exactly(parent, subgroup)
- end
+ expect(assigns(:groups)).to contain_exactly(parent, subgroup)
+ end
- it 'preloads parents regardless of pagination' do
- allow(Kaminari.config).to receive(:default_per_page).and_return(1)
- group = create(:group, :public)
- subgroup = create(:group, :public, parent: group)
- search_result = create(:group, :public, name: 'result', parent: subgroup)
+ it 'preloads parents regardless of pagination' do
+ allow(Kaminari.config).to receive(:default_per_page).and_return(1)
+ group = create(:group, :public)
+ subgroup = create(:group, :public, parent: group)
+ search_result = create(:group, :public, name: 'result', parent: subgroup)
- get :index, params: { filter: 'resu' }, format: :json
+ get :index, params: { filter: 'resu' }, format: :json
- expect(assigns(:groups)).to contain_exactly(group, subgroup, search_result)
+ expect(assigns(:groups)).to contain_exactly(group, subgroup, search_result)
+ end
end
- end
- context 'json content' do
- it 'shows groups as json' do
- get :index, format: :json
+ context 'json content' do
+ it 'shows groups as json' do
+ get :index, format: :json
- expect(json_response.first['id']).to eq(group.id)
- end
+ expect(json_response.first['id']).to eq(group.id)
+ end
- context 'nested groups' do
- it 'expands the tree when filtering' do
- subgroup = create(:group, :public, parent: group, name: 'filter')
+ context 'nested groups' do
+ it 'expands the tree when filtering' do
+ subgroup = create(:group, :public, parent: group, name: 'filter')
- get :index, params: { filter: 'filt' }, format: :json
+ get :index, params: { filter: 'filt' }, format: :json
- children_response = json_response.first['children']
+ children_response = json_response.first['children']
- expect(json_response.first['id']).to eq(group.id)
- expect(children_response.first['id']).to eq(subgroup.id)
+ expect(json_response.first['id']).to eq(group.id)
+ expect(children_response.first['id']).to eq(subgroup.id)
+ end
end
end
end
+
+ it_behaves_like 'returns filtered groups'
+
+ context 'when feature flag :linear_group_tree_ancestor_scopes is disabled' do
+ before do
+ stub_feature_flags(linear_group_tree_ancestor_scopes: false)
+ end
+
+ it_behaves_like 'returns filtered groups'
+ end
end
end
diff --git a/spec/controllers/dashboard/milestones_controller_spec.rb b/spec/controllers/dashboard/milestones_controller_spec.rb
index 899aa7a41c1..2d41bc431ec 100644
--- a/spec/controllers/dashboard/milestones_controller_spec.rb
+++ b/spec/controllers/dashboard/milestones_controller_spec.rb
@@ -65,11 +65,12 @@ RSpec.describe Dashboard::MilestonesController do
expect(response.body).not_to include(project_milestone.title)
end
- it 'shows counts of open and closed group and project milestones to which the user belongs to' do
+ it 'shows counts of open/closed/all group and project milestones to which the user belongs to' do
get :index
- expect(response.body).to include("Open\n<span class=\"badge badge-pill\">2</span>")
- expect(response.body).to include("Closed\n<span class=\"badge badge-pill\">2</span>")
+ expect(response.body).to have_content('Open 2')
+ expect(response.body).to have_content('Closed 2')
+ expect(response.body).to have_content('All 4')
end
context 'external authorization' do
diff --git a/spec/controllers/every_controller_spec.rb b/spec/controllers/every_controller_spec.rb
index a1c377eff76..902872b6e92 100644
--- a/spec/controllers/every_controller_spec.rb
+++ b/spec/controllers/every_controller_spec.rb
@@ -1,24 +1,14 @@
# frozen_string_literal: true
require 'spec_helper'
-
RSpec.describe "Every controller" do
context "feature categories" do
let_it_be(:feature_categories) do
- YAML.load_file(Rails.root.join('config', 'feature_categories.yml')).map(&:to_sym).to_set
+ Gitlab::FeatureCategories.default.categories.map(&:to_sym).to_set
end
let_it_be(:controller_actions) do
- # This will return tuples of all controller actions defined in the routes
- # Only for controllers inheriting ApplicationController
- # Excluding controllers from gems (OAuth, Sidekiq)
- Rails.application.routes.routes
- .map { |route| route.required_defaults.presence }
- .compact
- .select { |route| route[:controller].present? && route[:action].present? }
- .map { |route| [constantize_controller(route[:controller]), route[:action]] }
- .select { |(controller, action)| controller&.include?(::Gitlab::WithFeatureCategory) }
- .reject { |(controller, action)| controller == ApplicationController || controller == Devise::UnlocksController }
+ Gitlab::RequestEndpoints.all_controller_actions
end
let_it_be(:routes_without_category) do
@@ -74,9 +64,6 @@ RSpec.describe "Every controller" do
end
def actions_defined_in_feature_category_config(controller)
- controller.send(:class_attributes)[:feature_category_config]
- .values
- .flatten
- .map(&:to_s)
+ controller.send(:class_attributes)[:endpoint_attributes_config].defined_actions
end
end
diff --git a/spec/controllers/graphql_controller_spec.rb b/spec/controllers/graphql_controller_spec.rb
index aed97a01a72..6e7bcfdaa08 100644
--- a/spec/controllers/graphql_controller_spec.rb
+++ b/spec/controllers/graphql_controller_spec.rb
@@ -38,6 +38,14 @@ RSpec.describe GraphqlController do
sign_in(user)
end
+ it 'sets feature category in ApplicationContext from request' do
+ request.headers["HTTP_X_GITLAB_FEATURE_CATEGORY"] = "web_ide"
+
+ post :execute
+
+ expect(::Gitlab::ApplicationContext.current_context_attribute(:feature_category)).to eq('web_ide')
+ end
+
it 'returns 200 when user can access API' do
post :execute
diff --git a/spec/controllers/groups/dependency_proxy_for_containers_controller_spec.rb b/spec/controllers/groups/dependency_proxy_for_containers_controller_spec.rb
index 7415c2860c8..fa402d556c7 100644
--- a/spec/controllers/groups/dependency_proxy_for_containers_controller_spec.rb
+++ b/spec/controllers/groups/dependency_proxy_for_containers_controller_spec.rb
@@ -5,6 +5,7 @@ require 'spec_helper'
RSpec.describe Groups::DependencyProxyForContainersController do
include HttpBasicAuthHelpers
include DependencyProxyHelpers
+ include WorkhorseHelpers
let_it_be(:user) { create(:user) }
let_it_be_with_reload(:group) { create(:group, :private) }
@@ -242,16 +243,9 @@ RSpec.describe Groups::DependencyProxyForContainersController do
end
describe 'GET #blob' do
- let_it_be(:blob) { create(:dependency_proxy_blob) }
+ let(:blob) { create(:dependency_proxy_blob, group: group) }
let(:blob_sha) { blob.file_name.sub('.gz', '') }
- let(:blob_response) { { status: :success, blob: blob, from_cache: false } }
-
- before do
- allow_next_instance_of(DependencyProxy::FindOrCreateBlobService) do |instance|
- allow(instance).to receive(:execute).and_return(blob_response)
- end
- end
subject { get_blob }
@@ -264,40 +258,31 @@ RSpec.describe Groups::DependencyProxyForContainersController do
it_behaves_like 'without permission'
it_behaves_like 'feature flag disabled with private group'
- context 'remote blob request fails' do
- let(:blob_response) do
- {
- status: :error,
- http_status: 400,
- message: ''
- }
- end
-
- before do
- group.add_guest(user)
- end
-
- it 'proxies status from the remote blob request', :aggregate_failures do
- subject
-
- expect(response).to have_gitlab_http_status(:bad_request)
- expect(response.body).to be_empty
- end
- end
-
context 'a valid user' do
before do
group.add_guest(user)
end
it_behaves_like 'a successful blob pull'
- it_behaves_like 'a package tracking event', described_class.name, 'pull_blob'
+ it_behaves_like 'a package tracking event', described_class.name, 'pull_blob_from_cache'
- context 'with a cache entry' do
- let(:blob_response) { { status: :success, blob: blob, from_cache: true } }
+ context 'when cache entry does not exist' do
+ let(:blob_sha) { 'a3ed95caeb02ffe68cdd9fd84406680ae93d633cb16422d00e8a7c22955b46d4' }
- it_behaves_like 'returning response status', :success
- it_behaves_like 'a package tracking event', described_class.name, 'pull_blob_from_cache'
+ it 'returns Workhorse send-dependency instructions' do
+ subject
+
+ send_data_type, send_data = workhorse_send_data
+ header, url = send_data.values_at('Header', 'Url')
+
+ expect(send_data_type).to eq('send-dependency')
+ expect(header).to eq("Authorization" => ["Bearer abcd1234"])
+ expect(url).to eq(DependencyProxy::Registry.blob_url('alpine', blob_sha))
+ expect(response.headers['Content-Type']).to eq('application/gzip')
+ expect(response.headers['Content-Disposition']).to eq(
+ ActionDispatch::Http::ContentDisposition.format(disposition: 'attachment', filename: blob.file_name)
+ )
+ end
end
end
@@ -319,6 +304,74 @@ RSpec.describe Groups::DependencyProxyForContainersController do
it_behaves_like 'a successful blob pull'
end
end
+
+ context 'when dependency_proxy_workhorse disabled' do
+ let(:blob_response) { { status: :success, blob: blob, from_cache: false } }
+
+ before do
+ stub_feature_flags(dependency_proxy_workhorse: false)
+
+ allow_next_instance_of(DependencyProxy::FindOrCreateBlobService) do |instance|
+ allow(instance).to receive(:execute).and_return(blob_response)
+ end
+ end
+
+ context 'remote blob request fails' do
+ let(:blob_response) do
+ {
+ status: :error,
+ http_status: 400,
+ message: ''
+ }
+ end
+
+ before do
+ group.add_guest(user)
+ end
+
+ it 'proxies status from the remote blob request', :aggregate_failures do
+ subject
+
+ expect(response).to have_gitlab_http_status(:bad_request)
+ expect(response.body).to be_empty
+ end
+ end
+
+ context 'a valid user' do
+ before do
+ group.add_guest(user)
+ end
+
+ it_behaves_like 'a successful blob pull'
+ it_behaves_like 'a package tracking event', described_class.name, 'pull_blob'
+
+ context 'with a cache entry' do
+ let(:blob_response) { { status: :success, blob: blob, from_cache: true } }
+
+ it_behaves_like 'returning response status', :success
+ it_behaves_like 'a package tracking event', described_class.name, 'pull_blob_from_cache'
+ end
+ end
+
+ context 'a valid deploy token' do
+ let_it_be(:user) { create(:deploy_token, :group, :dependency_proxy_scopes) }
+ let_it_be(:group_deploy_token) { create(:group_deploy_token, deploy_token: user, group: group) }
+
+ it_behaves_like 'a successful blob pull'
+
+ context 'pulling from a subgroup' do
+ let_it_be_with_reload(:parent_group) { create(:group) }
+ let_it_be_with_reload(:group) { create(:group, parent: parent_group) }
+
+ before do
+ parent_group.create_dependency_proxy_setting!(enabled: true)
+ group_deploy_token.update_column(:group_id, parent_group.id)
+ end
+
+ it_behaves_like 'a successful blob pull'
+ end
+ end
+ end
end
it_behaves_like 'not found when disabled'
@@ -328,6 +381,61 @@ RSpec.describe Groups::DependencyProxyForContainersController do
end
end
+ describe 'GET #authorize_upload_blob' do
+ let(:blob_sha) { 'a3ed95caeb02ffe68cdd9fd84406680ae93d633cb16422d00e8a7c22955b46d4' }
+
+ subject(:authorize_upload_blob) do
+ request.headers.merge!(workhorse_internal_api_request_header)
+
+ get :authorize_upload_blob, params: { group_id: group.to_param, image: 'alpine', sha: blob_sha }
+ end
+
+ it_behaves_like 'without permission'
+
+ context 'with a valid user' do
+ before do
+ group.add_guest(user)
+ end
+
+ it 'sends Workhorse file upload instructions', :aggregate_failures do
+ authorize_upload_blob
+
+ expect(response.headers['Content-Type']).to eq(Gitlab::Workhorse::INTERNAL_API_CONTENT_TYPE)
+ expect(json_response['TempPath']).to eq(DependencyProxy::FileUploader.workhorse_local_upload_path)
+ end
+ end
+ end
+
+ describe 'GET #upload_blob' do
+ let(:blob_sha) { 'a3ed95caeb02ffe68cdd9fd84406680ae93d633cb16422d00e8a7c22955b46d4' }
+ let(:file) { fixture_file_upload("spec/fixtures/dependency_proxy/#{blob_sha}.gz", 'application/gzip') }
+
+ subject do
+ request.headers.merge!(workhorse_internal_api_request_header)
+
+ get :upload_blob, params: {
+ group_id: group.to_param,
+ image: 'alpine',
+ sha: blob_sha,
+ file: file
+ }
+ end
+
+ it_behaves_like 'without permission'
+
+ context 'with a valid user' do
+ before do
+ group.add_guest(user)
+
+ expect_next_found_instance_of(Group) do |instance|
+ expect(instance).to receive_message_chain(:dependency_proxy_blobs, :create!)
+ end
+ end
+
+ it_behaves_like 'a package tracking event', described_class.name, 'pull_blob'
+ end
+ end
+
def enable_dependency_proxy
group.create_dependency_proxy_setting!(enabled: true)
end
diff --git a/spec/controllers/groups/registry/repositories_controller_spec.rb b/spec/controllers/groups/registry/repositories_controller_spec.rb
index f4541eda293..9ac19b06718 100644
--- a/spec/controllers/groups/registry/repositories_controller_spec.rb
+++ b/spec/controllers/groups/registry/repositories_controller_spec.rb
@@ -19,6 +19,7 @@ RSpec.describe Groups::Registry::RepositoriesController do
before do
stub_container_registry_config(enabled: true)
stub_container_registry_tags(repository: :any, tags: [])
+ stub_container_registry_info
group.add_owner(user)
group.add_guest(guest)
sign_in(user)
@@ -37,6 +38,18 @@ RSpec.describe Groups::Registry::RepositoriesController do
'name' => repo.name
)
end
+
+ [ContainerRegistry::Path::InvalidRegistryPathError, Faraday::Error].each do |error_class|
+ context "when there is a #{error_class}" do
+ it 'displays a connection error message' do
+ expect(::ContainerRegistry::Client).to receive(:registry_info).and_raise(error_class, nil, nil)
+
+ subject
+
+ expect(response).to have_gitlab_http_status(:ok)
+ end
+ end
+ end
end
shared_examples 'with name parameter' do
@@ -71,6 +84,18 @@ RSpec.describe Groups::Registry::RepositoriesController do
expect(response).to have_gitlab_http_status(:ok)
expect_no_snowplow_event
end
+
+ [ContainerRegistry::Path::InvalidRegistryPathError, Faraday::Error].each do |error_class|
+ context "when there is an invalid path error #{error_class}" do
+ it 'displays a connection error message' do
+ expect(::ContainerRegistry::Client).to receive(:registry_info).and_raise(error_class, nil, nil)
+
+ subject
+
+ expect(response).to have_gitlab_http_status(:ok)
+ end
+ end
+ end
end
context 'json format' do
diff --git a/spec/controllers/help_controller_spec.rb b/spec/controllers/help_controller_spec.rb
index 599e82afe9b..4e2123c8cc4 100644
--- a/spec/controllers/help_controller_spec.rb
+++ b/spec/controllers/help_controller_spec.rb
@@ -34,14 +34,6 @@ RSpec.describe HelpController do
is_expected.to redirect_to("#{documentation_base_url}/ee/#{path}.html")
end
end
-
- context 'when feature flag is disabled' do
- before do
- stub_feature_flags(help_page_documentation_redirect: false)
- end
-
- it_behaves_like 'documentation pages local render'
- end
end
before do
diff --git a/spec/controllers/import/bulk_imports_controller_spec.rb b/spec/controllers/import/bulk_imports_controller_spec.rb
index 3b2ed2c63ed..3adba32c74a 100644
--- a/spec/controllers/import/bulk_imports_controller_spec.rb
+++ b/spec/controllers/import/bulk_imports_controller_spec.rb
@@ -51,62 +51,87 @@ RSpec.describe Import::BulkImportsController do
end
describe 'GET status' do
+ def get_status(params_override = {})
+ params = { page: 1, per_page: 20, filter: '' }.merge(params_override)
+
+ get :status,
+ params: params,
+ format: :json,
+ session: {
+ bulk_import_gitlab_url: 'https://gitlab.example.com',
+ bulk_import_gitlab_access_token: 'demo-pat'
+ }
+ end
+
+ include_context 'bulk imports requests context', 'https://gitlab.example.com'
+
let(:client) { BulkImports::Clients::HTTP.new(url: 'http://gitlab.example', token: 'token') }
+ let(:version) { "#{BulkImport::MIN_MAJOR_VERSION}.#{BulkImport::MIN_MINOR_VERSION_FOR_PROJECT}.0" }
+ let(:version_response) { double(code: 200, success?: true, parsed_response: { 'version' => version }) }
describe 'serialized group data' do
- let(:client_response) do
+ let(:expected_response) do
double(
parsed_response: [
- { 'id' => 1, 'full_name' => 'group1', 'full_path' => 'full/path/group1', 'web_url' => 'http://demo.host/full/path/group1' },
- { 'id' => 2, 'full_name' => 'group2', 'full_path' => 'full/path/group2', 'web_url' => 'http://demo.host/full/path/group1' }
+ {
+ "full_name" => "Stub",
+ "full_path" => "stub-group",
+ "id" => 2595438,
+ "web_url" => "https://gitlab.com/groups/auto-breakfast"
+ }
],
headers: {
'x-next-page' => '2',
'x-page' => '1',
'x-per-page' => '20',
- 'x-total' => '37',
+ 'x-total' => '42',
'x-total-pages' => '2'
}
)
end
- let(:client_params) do
- {
- top_level_only: true,
- min_access_level: Gitlab::Access::OWNER
- }
- end
-
- before do
- allow(controller).to receive(:client).and_return(client)
- allow(client).to receive(:get).with('groups', client_params).and_return(client_response)
- end
-
it 'returns serialized group data' do
- get :status, format: :json
+ get_status
+
+ version_validation = {
+ "features" => {
+ "project_migration" => {
+ "available" => true,
+ "min_version" => BulkImport.min_gl_version_for_project_migration.to_s
+ },
+ "source_instance_version" => version
+ }
+ }
- expect(json_response).to eq({ importable_data: client_response.parsed_response }.as_json)
+ expect(json_response).to include("importable_data" => expected_response.parsed_response, "version_validation" => hash_including(version_validation))
end
it 'forwards pagination headers' do
- get :status, format: :json
-
- expect(response.headers['x-per-page']).to eq client_response.headers['x-per-page']
- expect(response.headers['x-page']).to eq client_response.headers['x-page']
- expect(response.headers['x-next-page']).to eq client_response.headers['x-next-page']
- expect(response.headers['x-prev-page']).to eq client_response.headers['x-prev-page']
- expect(response.headers['x-total']).to eq client_response.headers['x-total']
- expect(response.headers['x-total-pages']).to eq client_response.headers['x-total-pages']
+ get_status
+
+ expect(response.headers['x-per-page']).to eq expected_response.headers['x-per-page']
+ expect(response.headers['x-page']).to eq expected_response.headers['x-page']
+ expect(response.headers['x-next-page']).to eq expected_response.headers['x-next-page']
+ expect(response.headers['x-prev-page']).to eq expected_response.headers['x-prev-page']
+ expect(response.headers['x-total']).to eq expected_response.headers['x-total']
+ expect(response.headers['x-total-pages']).to eq expected_response.headers['x-total-pages']
end
context 'when filtering' do
- it 'returns filtered result' do
- filter = 'test'
- search_params = client_params.merge(search: filter)
+ let_it_be(:filter) { 'test' }
- expect(client).to receive(:get).with('groups', search_params).and_return(client_response)
+ let(:client_params) do
+ {
+ top_level_only: true,
+ min_access_level: Gitlab::Access::OWNER,
+ search: filter
+ }
+ end
+
+ it 'returns filtered result' do
+ get_status(filter: filter)
- get :status, format: :json, params: { filter: filter }
+ expect(json_response['importable_data'].first['full_name']).to eq('Test')
end
end
end
@@ -148,18 +173,19 @@ RSpec.describe Import::BulkImportsController do
context 'when connection error occurs' do
before do
- allow(controller).to receive(:client).and_return(client)
- allow(client).to receive(:get).and_raise(BulkImports::Error)
+ allow_next_instance_of(BulkImports::Clients::HTTP) do |instance|
+ allow(instance).to receive(:get).and_raise(BulkImports::Error)
+ end
end
it 'returns 422' do
- get :status, format: :json
+ get_status
expect(response).to have_gitlab_http_status(:unprocessable_entity)
end
it 'clears session' do
- get :status, format: :json
+ get_status
expect(session[:gitlab_url]).to be_nil
expect(session[:gitlab_access_token]).to be_nil
@@ -199,9 +225,9 @@ RSpec.describe Import::BulkImportsController do
session[:bulk_import_gitlab_url] = instance_url
end
- it 'executes BulkImportService' do
+ it 'executes BulkImpors::CreatetService' do
expect_next_instance_of(
- BulkImportService, user, bulk_import_params, { url: instance_url, access_token: pat }) do |service|
+ ::BulkImports::CreateService, user, bulk_import_params, { url: instance_url, access_token: pat }) do |service|
allow(service).to receive(:execute).and_return(ServiceResponse.success(payload: bulk_import))
end
@@ -214,7 +240,7 @@ RSpec.describe Import::BulkImportsController do
it 'returns error when validation fails' do
error_response = ServiceResponse.error(message: 'Record invalid', http_status: :unprocessable_entity)
expect_next_instance_of(
- BulkImportService, user, bulk_import_params, { url: instance_url, access_token: pat }) do |service|
+ ::BulkImports::CreateService, user, bulk_import_params, { url: instance_url, access_token: pat }) do |service|
allow(service).to receive(:execute).and_return(error_response)
end
diff --git a/spec/controllers/jira_connect/app_descriptor_controller_spec.rb b/spec/controllers/jira_connect/app_descriptor_controller_spec.rb
index 25c11d92b4e..9d890efdd33 100644
--- a/spec/controllers/jira_connect/app_descriptor_controller_spec.rb
+++ b/spec/controllers/jira_connect/app_descriptor_controller_spec.rb
@@ -46,7 +46,8 @@ RSpec.describe JiraConnect::AppDescriptorController do
apiVersion: 1,
apiMigrations: {
'context-qsh': true,
- gdpr: true
+ gdpr: true,
+ 'signed-install': true
}
)
@@ -89,5 +90,17 @@ RSpec.describe JiraConnect::AppDescriptorController do
)
)
end
+
+ context 'when jira_connect_asymmetric_jwt is disabled' do
+ before do
+ stub_feature_flags(jira_connect_asymmetric_jwt: false)
+ end
+
+ specify do
+ get :show
+
+ expect(json_response).to include('apiMigrations' => include('signed-install' => false))
+ end
+ end
end
end
diff --git a/spec/controllers/jira_connect/events_controller_spec.rb b/spec/controllers/jira_connect/events_controller_spec.rb
index e9fecb594a7..78bd0dc8318 100644
--- a/spec/controllers/jira_connect/events_controller_spec.rb
+++ b/spec/controllers/jira_connect/events_controller_spec.rb
@@ -3,9 +3,49 @@
require 'spec_helper'
RSpec.describe JiraConnect::EventsController do
+ shared_examples 'verifies asymmetric JWT token' do
+ context 'when token is valid' do
+ include_context 'valid JWT token'
+
+ it 'renders successful' do
+ send_request
+
+ expect(response).to have_gitlab_http_status(:success)
+ end
+ end
+
+ context 'when token is invalid' do
+ include_context 'invalid JWT token'
+
+ it 'renders unauthorized' do
+ send_request
+
+ expect(response).to have_gitlab_http_status(:unauthorized)
+ end
+ end
+ end
+
+ shared_context 'valid JWT token' do
+ before do
+ allow_next_instance_of(Atlassian::JiraConnect::AsymmetricJwt) do |asymmetric_jwt|
+ allow(asymmetric_jwt).to receive(:valid?).and_return(true)
+ allow(asymmetric_jwt).to receive(:iss_claim).and_return(client_key)
+ end
+ end
+ end
+
+ shared_context 'invalid JWT token' do
+ before do
+ allow_next_instance_of(Atlassian::JiraConnect::AsymmetricJwt) do |asymmetric_jwt|
+ allow(asymmetric_jwt).to receive(:valid?).and_return(false)
+ end
+ end
+ end
+
describe '#installed' do
let(:client_key) { '1234' }
let(:shared_secret) { 'secret' }
+
let(:params) do
{
clientKey: client_key,
@@ -14,10 +54,16 @@ RSpec.describe JiraConnect::EventsController do
}
end
+ include_context 'valid JWT token'
+
subject do
post :installed, params: params
end
+ it_behaves_like 'verifies asymmetric JWT token' do
+ let(:send_request) { subject }
+ end
+
it 'saves the jira installation data' do
expect { subject }.to change { JiraConnectInstallation.count }.by(1)
end
@@ -31,13 +77,15 @@ RSpec.describe JiraConnect::EventsController do
expect(installation.base_url).to eq('https://test.atlassian.net')
end
- context 'client key already exists' do
- it 'returns 422' do
- create(:jira_connect_installation, client_key: client_key)
+ context 'when jira_connect_asymmetric_jwt is disabled' do
+ before do
+ stub_feature_flags(jira_connect_asymmetric_jwt: false)
+ end
- subject
+ it 'saves the jira installation data without JWT validation' do
+ expect(Atlassian::JiraConnect::AsymmetricJwt).not_to receive(:new)
- expect(response).to have_gitlab_http_status(:unprocessable_entity)
+ expect { subject }.to change { JiraConnectInstallation.count }.by(1)
end
end
@@ -49,27 +97,68 @@ RSpec.describe JiraConnect::EventsController do
}
end
- it 'validates the JWT token in authorization header and returns 200 without creating a new installation' do
- create(:jira_connect_installation, client_key: client_key, shared_secret: shared_secret)
- request.headers["Authorization"] = "Bearer #{Atlassian::Jwt.encode({ iss: client_key }, shared_secret)}"
+ it 'returns 422' do
+ subject
- expect { subject }.not_to change { JiraConnectInstallation.count }
- expect(response).to have_gitlab_http_status(:ok)
+ expect(response).to have_gitlab_http_status(:unprocessable_entity)
end
- end
- describe '#uninstalled' do
- let!(:installation) { create(:jira_connect_installation) }
- let(:qsh) { Atlassian::Jwt.create_query_string_hash('https://gitlab.test/events/uninstalled', 'POST', 'https://gitlab.test') }
+ context 'and an installation exists' do
+ let!(:installation) { create(:jira_connect_installation, client_key: client_key, shared_secret: shared_secret) }
- before do
- request.headers['Authorization'] = "JWT #{auth_token}"
+ it 'validates the JWT token in authorization header and returns 200 without creating a new installation' do
+ expect { subject }.not_to change { JiraConnectInstallation.count }
+ expect(response).to have_gitlab_http_status(:ok)
+ end
+
+ context 'when jira_connect_asymmetric_jwt is disabled' do
+ before do
+ stub_feature_flags(jira_connect_asymmetric_jwt: false)
+ end
+
+ it 'decodes the JWT token in authorization header and returns 200 without creating a new installation' do
+ request.headers["Authorization"] = "Bearer #{Atlassian::Jwt.encode({ iss: client_key }, shared_secret)}"
+
+ expect(Atlassian::JiraConnect::AsymmetricJwt).not_to receive(:new)
+
+ expect { subject }.not_to change { JiraConnectInstallation.count }
+
+ expect(response).to have_gitlab_http_status(:ok)
+ end
+ end
end
+ end
+ end
+
+ describe '#uninstalled' do
+ let_it_be(:installation) { create(:jira_connect_installation) }
+
+ let(:client_key) { installation.client_key }
+ let(:params) do
+ {
+ clientKey: client_key,
+ baseUrl: 'https://test.atlassian.net'
+ }
+ end
+
+ it_behaves_like 'verifies asymmetric JWT token' do
+ let(:send_request) { post :uninstalled, params: params }
+ end
+
+ subject(:post_uninstalled) { post :uninstalled, params: params }
- subject(:post_uninstalled) { post :uninstalled }
+ context 'when JWT is invalid' do
+ include_context 'invalid JWT token'
- context 'when JWT is invalid' do
- let(:auth_token) { 'invalid_token' }
+ it 'does not delete the installation' do
+ expect { post_uninstalled }.not_to change { JiraConnectInstallation.count }
+ end
+
+ context 'when jira_connect_asymmetric_jwt is disabled' do
+ before do
+ stub_feature_flags(jira_connect_asymmetric_jwt: false)
+ request.headers['Authorization'] = 'JWT invalid token'
+ end
it 'returns 403' do
post_uninstalled
@@ -81,14 +170,42 @@ RSpec.describe JiraConnect::EventsController do
expect { post_uninstalled }.not_to change { JiraConnectInstallation.count }
end
end
+ end
+
+ context 'when JWT is valid' do
+ include_context 'valid JWT token'
+
+ let(:jira_base_path) { '/-/jira_connect' }
+ let(:jira_event_path) { '/-/jira_connect/events/uninstalled' }
+
+ it 'calls the DestroyService and returns ok in case of success' do
+ expect_next_instance_of(JiraConnectInstallations::DestroyService, installation, jira_base_path, jira_event_path) do |destroy_service|
+ expect(destroy_service).to receive(:execute).and_return(true)
+ end
+
+ post_uninstalled
+
+ expect(response).to have_gitlab_http_status(:ok)
+ end
+
+ it 'calls the DestroyService and returns unprocessable_entity in case of failure' do
+ expect_next_instance_of(JiraConnectInstallations::DestroyService, installation, jira_base_path, jira_event_path) do |destroy_service|
+ expect(destroy_service).to receive(:execute).and_return(false)
+ end
+
+ post_uninstalled
+
+ expect(response).to have_gitlab_http_status(:unprocessable_entity)
+ end
+
+ context 'when jira_connect_asymmetric_jwt is disabled' do
+ before do
+ stub_feature_flags(jira_connect_asymmetric_jwt: false)
- context 'when JWT is valid' do
- let(:auth_token) do
- Atlassian::Jwt.encode({ iss: installation.client_key, qsh: qsh }, installation.shared_secret)
+ request.headers['Authorization'] = "JWT #{Atlassian::Jwt.encode({ iss: installation.client_key, qsh: qsh }, installation.shared_secret)}"
end
- let(:jira_base_path) { '/-/jira_connect' }
- let(:jira_event_path) { '/-/jira_connect/events/uninstalled' }
+ let(:qsh) { Atlassian::Jwt.create_query_string_hash('https://gitlab.test/events/uninstalled', 'POST', 'https://gitlab.test') }
it 'calls the DestroyService and returns ok in case of success' do
expect_next_instance_of(JiraConnectInstallations::DestroyService, installation, jira_base_path, jira_event_path) do |destroy_service|
diff --git a/spec/controllers/metrics_controller_spec.rb b/spec/controllers/metrics_controller_spec.rb
index 9fa90dde997..4f74af295c6 100644
--- a/spec/controllers/metrics_controller_spec.rb
+++ b/spec/controllers/metrics_controller_spec.rb
@@ -67,6 +67,12 @@ RSpec.describe MetricsController, :request_store do
expect(response.body).to match(/^prometheus_counter 1$/)
end
+ it 'initializes the rails request SLIs' do
+ expect(Gitlab::Metrics::RailsSlis).to receive(:initialize_request_slis_if_needed!).and_call_original
+
+ get :index
+ end
+
context 'prometheus metrics are disabled' do
before do
allow(Gitlab::Metrics).to receive(:prometheus_metrics_enabled?).and_return(false)
diff --git a/spec/controllers/profiles/two_factor_auths_controller_spec.rb b/spec/controllers/profiles/two_factor_auths_controller_spec.rb
index ca63760d988..e57bd5be937 100644
--- a/spec/controllers/profiles/two_factor_auths_controller_spec.rb
+++ b/spec/controllers/profiles/two_factor_auths_controller_spec.rb
@@ -27,12 +27,6 @@ RSpec.describe Profiles::TwoFactorAuthsController do
expect(flash[:notice])
.to eq _('You need to verify your primary email first before enabling Two-Factor Authentication.')
end
-
- it 'does not redirect when the `ensure_verified_primary_email_for_2fa` feature flag is disabled' do
- stub_feature_flags(ensure_verified_primary_email_for_2fa: false)
-
- expect(response).not_to redirect_to(profile_emails_path)
- end
end
shared_examples 'user must enter a valid current password' do
diff --git a/spec/controllers/profiles_controller_spec.rb b/spec/controllers/profiles_controller_spec.rb
index b4019643baf..4959003d788 100644
--- a/spec/controllers/profiles_controller_spec.rb
+++ b/spec/controllers/profiles_controller_spec.rb
@@ -3,7 +3,8 @@
require('spec_helper')
RSpec.describe ProfilesController, :request_store do
- let(:user) { create(:user) }
+ let(:password) { 'longsecret987!' }
+ let(:user) { create(:user, password: password) }
describe 'POST update' do
it 'does not update password' do
@@ -23,7 +24,7 @@ RSpec.describe ProfilesController, :request_store do
sign_in(user)
put :update,
- params: { user: { email: "john@gmail.com", name: "John" } }
+ params: { user: { email: "john@gmail.com", name: "John", validation_password: password } }
user.reload
diff --git a/spec/controllers/projects/alerting/notifications_controller_spec.rb b/spec/controllers/projects/alerting/notifications_controller_spec.rb
index fe0c4ce00bf..2fff8026b22 100644
--- a/spec/controllers/projects/alerting/notifications_controller_spec.rb
+++ b/spec/controllers/projects/alerting/notifications_controller_spec.rb
@@ -3,6 +3,8 @@
require 'spec_helper'
RSpec.describe Projects::Alerting::NotificationsController do
+ include HttpBasicAuthHelpers
+
let_it_be(:project) { create(:project) }
let_it_be(:environment) { create(:environment, project: project) }
@@ -53,86 +55,96 @@ RSpec.describe Projects::Alerting::NotificationsController do
end
end
- context 'bearer token' do
- context 'when set' do
- context 'when extractable' do
- before do
- request.headers['HTTP_AUTHORIZATION'] = 'Bearer some token'
- end
-
- it 'extracts bearer token' do
- expect(notify_service).to receive(:execute).with('some token', nil)
-
- make_request
- end
-
- context 'with a corresponding integration' do
- context 'with integration parameters specified' do
- let_it_be_with_reload(:integration) { create(:alert_management_http_integration, project: project) }
+ shared_examples 'a working token' do
+ it 'extracts token' do
+ expect(notify_service).to receive(:execute).with('some token', nil)
- let(:params) { project_params(endpoint_identifier: integration.endpoint_identifier, name: integration.name) }
-
- context 'the integration is active' do
- it 'extracts and finds the integration' do
- expect(notify_service).to receive(:execute).with('some token', integration)
+ make_request
+ end
- make_request
- end
- end
+ context 'with a corresponding integration' do
+ context 'with integration parameters specified' do
+ let_it_be_with_reload(:integration) { create(:alert_management_http_integration, project: project) }
- context 'when the integration is inactive' do
- before do
- integration.update!(active: false)
- end
+ let(:params) { project_params(endpoint_identifier: integration.endpoint_identifier, name: integration.name) }
- it 'does not find an integration' do
- expect(notify_service).to receive(:execute).with('some token', nil)
+ context 'the integration is active' do
+ it 'extracts and finds the integration' do
+ expect(notify_service).to receive(:execute).with('some token', integration)
- make_request
- end
- end
+ make_request
end
+ end
- context 'without integration parameters specified' do
- let_it_be(:integration) { create(:alert_management_http_integration, :legacy, project: project) }
+ context 'when the integration is inactive' do
+ before do
+ integration.update!(active: false)
+ end
- it 'extracts and finds the legacy integration' do
- expect(notify_service).to receive(:execute).with('some token', integration)
+ it 'does not find an integration' do
+ expect(notify_service).to receive(:execute).with('some token', nil)
- make_request
- end
+ make_request
end
end
end
- context 'when inextractable' do
- it 'passes nil for a non-bearer token' do
- request.headers['HTTP_AUTHORIZATION'] = 'some token'
+ context 'without integration parameters specified' do
+ let_it_be(:integration) { create(:alert_management_http_integration, :legacy, project: project) }
- expect(notify_service).to receive(:execute).with(nil, nil)
+ it 'extracts and finds the legacy integration' do
+ expect(notify_service).to receive(:execute).with('some token', integration)
make_request
end
end
end
+ end
- context 'when missing' do
- it 'passes nil' do
- expect(notify_service).to receive(:execute).with(nil, nil)
-
- make_request
+ context 'with bearer token' do
+ context 'when set' do
+ before do
+ request.headers.merge(build_token_auth_header('some token'))
end
+
+ it_behaves_like 'a working token'
+ end
+ end
+
+ context 'with basic auth token' do
+ before do
+ request.headers.merge basic_auth_header(nil, 'some token')
+ end
+
+ it_behaves_like 'a working token'
+ end
+
+ context 'when inextractable token' do
+ it 'passes nil for a non-bearer token' do
+ request.headers['HTTP_AUTHORIZATION'] = 'some token'
+
+ expect(notify_service).to receive(:execute).with(nil, nil)
+
+ make_request
+ end
+ end
+
+ context 'when missing token' do
+ it 'passes nil' do
+ expect(notify_service).to receive(:execute).with(nil, nil)
+
+ make_request
end
end
end
- context 'generic alert payload' do
+ context 'with generic alert payload' do
it_behaves_like 'process alert payload', Projects::Alerting::NotifyService do
let(:payload) { { title: 'Alert title' } }
end
end
- context 'Prometheus alert payload' do
+ context 'with Prometheus alert payload' do
include PrometheusHelpers
it_behaves_like 'process alert payload', Projects::Prometheus::Alerts::NotifyService do
diff --git a/spec/controllers/projects/branches_controller_spec.rb b/spec/controllers/projects/branches_controller_spec.rb
index a00e302a64f..43e8bbd83cf 100644
--- a/spec/controllers/projects/branches_controller_spec.rb
+++ b/spec/controllers/projects/branches_controller_spec.rb
@@ -239,7 +239,7 @@ RSpec.describe Projects::BranchesController do
end
end
- context 'without issue feature access' do
+ context 'without issue feature access', :sidekiq_inline do
before do
project.update!(visibility_level: Gitlab::VisibilityLevel::PUBLIC)
project.project_feature.update!(issues_access_level: ProjectFeature::PRIVATE)
@@ -656,6 +656,26 @@ RSpec.describe Projects::BranchesController do
)
end
end
+
+ context 'when gitaly is not available' do
+ before do
+ allow_next_instance_of(Gitlab::GitalyClient::RefService) do |ref_service|
+ allow(ref_service).to receive(:local_branches).and_raise(GRPC::DeadlineExceeded)
+ end
+
+ get :index, format: :html, params: {
+ namespace_id: project.namespace, project_id: project
+ }
+ end
+
+ it 'returns with a status 200' do
+ expect(response).to have_gitlab_http_status(:ok)
+ end
+
+ it 'sets gitaly_unavailable variable' do
+ expect(assigns[:gitaly_unavailable]).to be_truthy
+ end
+ end
end
describe 'GET diverging_commit_counts' do
diff --git a/spec/controllers/projects/compare_controller_spec.rb b/spec/controllers/projects/compare_controller_spec.rb
index 2412b970342..48afd42e8ff 100644
--- a/spec/controllers/projects/compare_controller_spec.rb
+++ b/spec/controllers/projects/compare_controller_spec.rb
@@ -409,7 +409,7 @@ RSpec.describe Projects::CompareController do
end
end
- context 'when the user does not have access to the project' do
+ context 'when the user does not have access to the project', :sidekiq_inline do
before do
project.team.truncate
project.update!(visibility: 'private')
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 56c0ef592ca..cc0f4a426f4 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
@@ -91,7 +91,7 @@ RSpec.describe Projects::DesignManagement::Designs::ResizedImageController do
# (the record that represents the design at a specific version), to
# verify that the correct file is being returned.
def etag(action)
- ActionDispatch::TestResponse.new.send(:generate_weak_etag, [action.cache_key, ''])
+ ActionDispatch::TestResponse.new.send(:generate_weak_etag, [action.cache_key])
end
specify { expect(newest_version.sha).not_to eq(oldest_version.sha) }
diff --git a/spec/controllers/projects/issues_controller_spec.rb b/spec/controllers/projects/issues_controller_spec.rb
index 977879b453c..0b3bd4d78ac 100644
--- a/spec/controllers/projects/issues_controller_spec.rb
+++ b/spec/controllers/projects/issues_controller_spec.rb
@@ -1411,39 +1411,42 @@ RSpec.describe Projects::IssuesController do
stub_application_setting(issues_create_limit: 5)
end
- it 'prevents from creating more issues', :request_store do
- 5.times { post_new_issue }
-
- expect { post_new_issue }
- .to change { Gitlab::GitalyClient.get_request_count }.by(1) # creates 1 projects and 0 issues
-
- post_new_issue
- expect(response.body).to eq(_('This endpoint has been requested too many times. Try again later.'))
- expect(response).to have_gitlab_http_status(:too_many_requests)
- end
-
- it 'logs the event on auth.log' do
- attributes = {
- message: 'Application_Rate_Limiter_Request',
- env: :issues_create_request_limit,
- remote_ip: '0.0.0.0',
- request_method: 'POST',
- path: "/#{project.full_path}/-/issues",
- user_id: user.id,
- username: user.username
- }
+ context 'when issue creation limits imposed' do
+ it 'prevents from creating more issues', :request_store do
+ 5.times { post_new_issue }
- expect(Gitlab::AuthLogger).to receive(:error).with(attributes).once
+ expect { post_new_issue }
+ .to change { Gitlab::GitalyClient.get_request_count }.by(1) # creates 1 projects and 0 issues
- project.add_developer(user)
- sign_in(user)
+ post_new_issue
- 6.times do
- post :create, params: {
- namespace_id: project.namespace.to_param,
- project_id: project,
- issue: { title: 'Title', description: 'Description' }
+ expect(response.body).to eq(_('This endpoint has been requested too many times. Try again later.'))
+ expect(response).to have_gitlab_http_status(:too_many_requests)
+ end
+
+ it 'logs the event on auth.log' do
+ attributes = {
+ message: 'Application_Rate_Limiter_Request',
+ env: :issues_create_request_limit,
+ remote_ip: '0.0.0.0',
+ request_method: 'POST',
+ path: "/#{project.full_path}/-/issues",
+ user_id: user.id,
+ username: user.username
}
+
+ expect(Gitlab::AuthLogger).to receive(:error).with(attributes).once
+
+ project.add_developer(user)
+ sign_in(user)
+
+ 6.times do
+ post :create, params: {
+ namespace_id: project.namespace.to_param,
+ project_id: project,
+ issue: { title: 'Title', description: 'Description' }
+ }
+ end
end
end
end
diff --git a/spec/controllers/projects/merge_requests_controller_spec.rb b/spec/controllers/projects/merge_requests_controller_spec.rb
index 0da8a30611c..438fc2f2106 100644
--- a/spec/controllers/projects/merge_requests_controller_spec.rb
+++ b/spec/controllers/projects/merge_requests_controller_spec.rb
@@ -1876,8 +1876,7 @@ RSpec.describe Projects::MergeRequestsController do
let(:sha) { forked.commit.sha }
let(:environment) { create(:environment, project: forked) }
let(:pipeline) { create(:ci_pipeline, sha: sha, project: forked) }
- let(:build) { create(:ci_build, pipeline: pipeline) }
- let!(:deployment) { create(:deployment, :succeed, environment: environment, sha: sha, ref: 'master', deployable: build) }
+ let!(:build) { create(:ci_build, :with_deployment, environment: environment.name, pipeline: pipeline) }
let(:merge_request) do
create(:merge_request, source_project: forked, target_project: project, target_branch: 'master', head_pipeline: pipeline)
@@ -1901,8 +1900,7 @@ RSpec.describe Projects::MergeRequestsController do
let(:source_environment) { create(:environment, project: project) }
let(:merge_commit_sha) { project.repository.merge(user, forked.commit.id, merge_request, "merged in test") }
let(:post_merge_pipeline) { create(:ci_pipeline, sha: merge_commit_sha, project: project) }
- let(:post_merge_build) { create(:ci_build, pipeline: post_merge_pipeline) }
- let!(:source_deployment) { create(:deployment, :succeed, environment: source_environment, sha: merge_commit_sha, ref: 'master', deployable: post_merge_build) }
+ let!(:post_merge_build) { create(:ci_build, :with_deployment, environment: source_environment.name, pipeline: post_merge_pipeline) }
before do
merge_request.update!(merge_commit_sha: merge_commit_sha)
@@ -1944,9 +1942,6 @@ RSpec.describe Projects::MergeRequestsController do
context 'when a merge request has multiple environments with deployments' do
let(:sha) { merge_request.diff_head_sha }
- let(:ref) { merge_request.source_branch }
-
- let!(:build) { create(:ci_build, pipeline: pipeline) }
let!(:pipeline) { create(:ci_pipeline, sha: sha, project: project) }
let!(:environment) { create(:environment, name: 'env_a', project: project) }
let!(:another_environment) { create(:environment, name: 'env_b', project: project) }
@@ -1954,8 +1949,8 @@ RSpec.describe Projects::MergeRequestsController do
before do
merge_request.update_head_pipeline
- create(:deployment, :succeed, environment: environment, sha: sha, ref: ref, deployable: build)
- create(:deployment, :succeed, environment: another_environment, sha: sha, ref: ref, deployable: build)
+ create(:ci_build, :with_deployment, environment: environment.name, pipeline: pipeline)
+ create(:ci_build, :with_deployment, environment: another_environment.name, pipeline: pipeline)
end
it 'exposes multiple environment statuses' do
diff --git a/spec/controllers/projects/pipeline_schedules_controller_spec.rb b/spec/controllers/projects/pipeline_schedules_controller_spec.rb
index 27a3e95896a..d86f38c1f0b 100644
--- a/spec/controllers/projects/pipeline_schedules_controller_spec.rb
+++ b/spec/controllers/projects/pipeline_schedules_controller_spec.rb
@@ -397,7 +397,7 @@ RSpec.describe Projects::PipelineSchedulesController do
end
end
- describe 'POST #play', :clean_gitlab_redis_cache do
+ describe 'POST #play', :clean_gitlab_redis_rate_limiting do
let(:ref) { 'master' }
before do
diff --git a/spec/controllers/projects/raw_controller_spec.rb b/spec/controllers/projects/raw_controller_spec.rb
index 2c25c7e20ea..a81173ccaac 100644
--- a/spec/controllers/projects/raw_controller_spec.rb
+++ b/spec/controllers/projects/raw_controller_spec.rb
@@ -84,7 +84,7 @@ RSpec.describe Projects::RawController do
include_examples 'single Gitaly request'
end
- context 'when the endpoint receives requests above the limit', :clean_gitlab_redis_cache do
+ context 'when the endpoint receives requests above the limit', :clean_gitlab_redis_rate_limiting do
let(:file_path) { 'master/README.md' }
before do
diff --git a/spec/controllers/projects/registry/repositories_controller_spec.rb b/spec/controllers/projects/registry/repositories_controller_spec.rb
index 0685e5a2055..a5faaaf5969 100644
--- a/spec/controllers/projects/registry/repositories_controller_spec.rb
+++ b/spec/controllers/projects/registry/repositories_controller_spec.rb
@@ -9,6 +9,7 @@ RSpec.describe Projects::Registry::RepositoriesController do
before do
sign_in(user)
stub_container_registry_config(enabled: true)
+ stub_container_registry_info
end
context 'when user has access to registry' do
@@ -30,6 +31,18 @@ RSpec.describe Projects::Registry::RepositoriesController do
expect(response).to have_gitlab_http_status(:not_found)
end
+
+ [ContainerRegistry::Path::InvalidRegistryPathError, Faraday::Error].each do |error_class|
+ context "when there is a #{error_class}" do
+ it 'displays a connection error message' do
+ expect(::ContainerRegistry::Client).to receive(:registry_info).and_raise(error_class, nil, nil)
+
+ go_to_index
+
+ expect(response).to have_gitlab_http_status(:ok)
+ end
+ end
+ end
end
shared_examples 'renders a list of repositories' do
diff --git a/spec/controllers/projects/tags_controller_spec.rb b/spec/controllers/projects/tags_controller_spec.rb
index efb57494f82..d0719643b7f 100644
--- a/spec/controllers/projects/tags_controller_spec.rb
+++ b/spec/controllers/projects/tags_controller_spec.rb
@@ -17,6 +17,25 @@ RSpec.describe Projects::TagsController do
expect(assigns(:tags).map(&:name)).to include('v1.1.0', 'v1.0.0')
end
+ context 'when Gitaly is unavailable' do
+ where(:format) do
+ [:html, :atom]
+ end
+
+ with_them do
+ it 'returns 503 status code' do
+ expect_next_instance_of(TagsFinder) do |finder|
+ expect(finder).to receive(:execute).and_return([[], Gitlab::Git::CommandError.new])
+ end
+
+ get :index, params: { namespace_id: project.namespace.to_param, project_id: project }, format: format
+
+ expect(assigns(:tags)).to eq([])
+ expect(response).to have_gitlab_http_status(:service_unavailable)
+ end
+ end
+ end
+
it 'returns releases matching those tags' do
subject
diff --git a/spec/controllers/projects/usage_quotas_controller_spec.rb b/spec/controllers/projects/usage_quotas_controller_spec.rb
new file mode 100644
index 00000000000..6125ba13f96
--- /dev/null
+++ b/spec/controllers/projects/usage_quotas_controller_spec.rb
@@ -0,0 +1,20 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Projects::UsageQuotasController do
+ let_it_be(:user) { create(:user) }
+ let_it_be(:project) { create(:project, namespace: user.namespace) }
+
+ describe 'GET #index' do
+ render_views
+
+ it 'does not render search settings partial' do
+ sign_in(user)
+ get(:index, params: { namespace_id: user.namespace, project_id: project })
+
+ expect(response).to render_template('index')
+ expect(response).not_to render_template('shared/search_settings')
+ end
+ end
+end
diff --git a/spec/controllers/projects_controller_spec.rb b/spec/controllers/projects_controller_spec.rb
index 9d070061850..3d966848c5b 100644
--- a/spec/controllers/projects_controller_spec.rb
+++ b/spec/controllers/projects_controller_spec.rb
@@ -312,6 +312,17 @@ RSpec.describe ProjectsController do
expect { get_show }.not_to change { Gitlab::GitalyClient.get_request_count }
end
+
+ it "renders files even with invalid license" do
+ controller.instance_variable_set(:@project, public_project)
+ expect(public_project.repository).to receive(:license_key).and_return('woozle wuzzle').at_least(:once)
+
+ get_show
+
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(response).to render_template('_files')
+ expect(response.body).to have_content('LICENSE') # would be 'MIT license' if stub not works
+ end
end
context "when the url contains .atom" do
@@ -409,42 +420,66 @@ RSpec.describe ProjectsController do
end
describe 'POST create' do
- let!(:params) do
- {
- path: 'foo',
- description: 'bar',
- import_url: project.http_url_to_repo,
- namespace_id: user.namespace.id
- }
- end
-
subject { post :create, params: { project: params } }
before do
sign_in(user)
end
- context 'when import by url is disabled' do
- before do
- stub_application_setting(import_sources: [])
+ context 'on import' do
+ let(:params) do
+ {
+ path: 'foo',
+ description: 'bar',
+ namespace_id: user.namespace.id,
+ import_url: project.http_url_to_repo
+ }
+ end
+
+ context 'when import by url is disabled' do
+ before do
+ stub_application_setting(import_sources: [])
+ end
+
+ it 'does not create project and reports an error' do
+ expect { subject }.not_to change { Project.count }
+
+ expect(response).to have_gitlab_http_status(:not_found)
+ end
end
- it 'does not create project and reports an error' do
- expect { subject }.not_to change { Project.count }
+ context 'when import by url is enabled' do
+ before do
+ stub_application_setting(import_sources: ['git'])
+ end
+
+ it 'creates project' do
+ expect { subject }.to change { Project.count }
- expect(response).to have_gitlab_http_status(:not_found)
+ expect(response).to have_gitlab_http_status(:redirect)
+ end
end
end
- context 'when import by url is enabled' do
- before do
- stub_application_setting(import_sources: ['git'])
+ context 'with new_project_sast_enabled', :experiment do
+ let(:params) do
+ {
+ path: 'foo',
+ description: 'bar',
+ namespace_id: user.namespace.id,
+ initialize_with_sast: '1'
+ }
end
- it 'creates project' do
- expect { subject }.to change { Project.count }
+ it 'tracks an event on project creation' do
+ expect(experiment(:new_project_sast_enabled)).to track(:created,
+ property: 'blank',
+ checked: true,
+ project: an_instance_of(Project),
+ namespace: user.namespace
+ ).on_next_instance.with_context(user: user)
- expect(response).to have_gitlab_http_status(:redirect)
+ post :create, params: { project: params }
end
end
end
@@ -1373,12 +1408,12 @@ RSpec.describe ProjectsController do
end
end
- context 'when the endpoint receives requests above the limit', :clean_gitlab_redis_cache do
+ context 'when the endpoint receives requests above the limit', :clean_gitlab_redis_rate_limiting do
include_examples 'rate limits project export endpoint'
end
end
- describe '#download_export', :clean_gitlab_redis_cache do
+ describe '#download_export', :clean_gitlab_redis_rate_limiting do
let(:action) { :download_export }
context 'object storage enabled' do
@@ -1413,7 +1448,7 @@ RSpec.describe ProjectsController do
end
end
- context 'when the endpoint receives requests above the limit', :clean_gitlab_redis_cache do
+ context 'when the endpoint receives requests above the limit', :clean_gitlab_redis_rate_limiting do
before do
allow(Gitlab::ApplicationRateLimiter)
.to receive(:increment)
@@ -1485,7 +1520,7 @@ RSpec.describe ProjectsController do
end
end
- context 'when the endpoint receives requests above the limit', :clean_gitlab_redis_cache do
+ context 'when the endpoint receives requests above the limit', :clean_gitlab_redis_rate_limiting do
include_examples 'rate limits project export endpoint'
end
end
diff --git a/spec/controllers/registrations_controller_spec.rb b/spec/controllers/registrations_controller_spec.rb
index 5edd60ebc79..a25c597edb2 100644
--- a/spec/controllers/registrations_controller_spec.rb
+++ b/spec/controllers/registrations_controller_spec.rb
@@ -602,6 +602,22 @@ RSpec.describe RegistrationsController do
end
end
+ context 'when user did not accept app terms' do
+ let(:user) { create(:user, accepted_term: nil) }
+
+ before do
+ stub_application_setting(password_authentication_enabled_for_web: false)
+ stub_application_setting(password_authentication_enabled_for_git: false)
+ stub_application_setting(enforce_terms: true)
+ end
+
+ it 'fails with message' do
+ post :destroy, params: { username: user.username }
+
+ expect_failure(s_('Profiles|You must accept the Terms of Service in order to perform this action.'))
+ end
+ end
+
it 'sets the username and caller_id in the context' do
expect(controller).to receive(:destroy).and_wrap_original do |m, *args|
m.call(*args)
diff --git a/spec/controllers/repositories/git_http_controller_spec.rb b/spec/controllers/repositories/git_http_controller_spec.rb
index 04d5008cb34..b5cd14154a3 100644
--- a/spec/controllers/repositories/git_http_controller_spec.rb
+++ b/spec/controllers/repositories/git_http_controller_spec.rb
@@ -7,12 +7,33 @@ RSpec.describe Repositories::GitHttpController do
let_it_be(:personal_snippet) { create(:personal_snippet, :public, :repository) }
let_it_be(:project_snippet) { create(:project_snippet, :public, :repository, project: project) }
+ shared_examples 'handles unavailable Gitaly' do
+ let(:params) { super().merge(service: 'git-upload-pack') }
+
+ before do
+ request.headers.merge! auth_env(user.username, user.password, nil)
+ end
+
+ context 'when Gitaly is unavailable' do
+ it 'responds with a 503 message' do
+ expect(Gitlab::GitalyClient).to receive(:call).and_raise(GRPC::Unavailable)
+
+ get :info_refs, params: params
+
+ expect(response).to have_gitlab_http_status(:service_unavailable)
+ expect(response.body).to eq('The git server, Gitaly, is not available at this time. Please contact your administrator.')
+ end
+ end
+ end
+
context 'when repository container is a project' do
it_behaves_like Repositories::GitHttpController do
let(:container) { project }
let(:user) { project.owner }
let(:access_checker_class) { Gitlab::GitAccess }
+ it_behaves_like 'handles unavailable Gitaly'
+
describe 'POST #git_upload_pack' do
before do
allow(controller).to receive(:verify_workhorse_api!).and_return(true)
@@ -84,6 +105,8 @@ RSpec.describe Repositories::GitHttpController do
let(:container) { personal_snippet }
let(:user) { personal_snippet.author }
let(:access_checker_class) { Gitlab::GitAccessSnippet }
+
+ it_behaves_like 'handles unavailable Gitaly'
end
end
@@ -92,6 +115,8 @@ RSpec.describe Repositories::GitHttpController do
let(:container) { project_snippet }
let(:user) { project_snippet.author }
let(:access_checker_class) { Gitlab::GitAccessSnippet }
+
+ it_behaves_like 'handles unavailable Gitaly'
end
end
end
diff --git a/spec/controllers/search_controller_spec.rb b/spec/controllers/search_controller_spec.rb
index 4e87a9fc1ba..73e8e0c7dd4 100644
--- a/spec/controllers/search_controller_spec.rb
+++ b/spec/controllers/search_controller_spec.rb
@@ -215,6 +215,16 @@ RSpec.describe SearchController do
end
end
+ it 'strips surrounding whitespace from search query' do
+ get :show, params: { scope: 'notes', search: ' foobar ' }
+ expect(assigns[:search_term]).to eq 'foobar'
+ end
+
+ it 'strips surrounding whitespace from autocomplete term' do
+ expect(controller).to receive(:search_autocomplete_opts).with('youcompleteme')
+ get :autocomplete, params: { term: ' youcompleteme ' }
+ end
+
it 'finds issue comments' do
project = create(:project, :public)
note = create(:note_on_issue, project: project)
@@ -305,7 +315,7 @@ RSpec.describe SearchController do
expect(response).to have_gitlab_http_status(:ok)
- expect(response.headers['Cache-Control']).to eq('no-store')
+ expect(response.headers['Cache-Control']).to eq('private, no-store')
end
end
diff --git a/spec/controllers/uploads_controller_spec.rb b/spec/controllers/uploads_controller_spec.rb
index 2aa9b86b20e..8442c214cd3 100644
--- a/spec/controllers/uploads_controller_spec.rb
+++ b/spec/controllers/uploads_controller_spec.rb
@@ -599,6 +599,46 @@ RSpec.describe UploadsController do
end
end
+ context "when viewing a topic avatar" do
+ let!(:topic) { create(:topic, 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: "projects/topic", mounted_as: "avatar", id: topic.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: "projects/topic", mounted_as: "avatar", id: topic.id, filename: "dk.png" }
+
+ response
+ end
+ end
+ end
+
+ context "when not signed in" do
+ it "responds with status 200" do
+ get :show, params: { model: "projects/topic", mounted_as: "avatar", id: topic.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: "projects/topic", mounted_as: "avatar", id: topic.id, filename: "dk.png" }
+
+ response
+ end
+ end
+ end
+ 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') }
diff --git a/spec/db/schema_spec.rb b/spec/db/schema_spec.rb
index c7739e2ff5f..5eccb0b46ef 100644
--- a/spec/db/schema_spec.rb
+++ b/spec/db/schema_spec.rb
@@ -67,6 +67,8 @@ RSpec.describe 'Database schema' do
oauth_access_tokens: %w[resource_owner_id application_id],
oauth_applications: %w[owner_id],
open_project_tracker_data: %w[closed_status_id],
+ packages_build_infos: %w[pipeline_id],
+ packages_package_file_build_infos: %w[pipeline_id],
product_analytics_events_experimental: %w[event_id txn_id user_id],
project_group_links: %w[group_id],
project_statistics: %w[namespace_id],
@@ -82,6 +84,7 @@ RSpec.describe 'Database schema' do
subscriptions: %w[user_id subscribable_id],
suggestions: %w[commit_id],
taggings: %w[tag_id taggable_id tagger_id],
+ terraform_state_versions: %w[ci_build_id],
timelogs: %w[user_id],
todos: %w[target_id commit_id],
uploads: %w[model_id],
@@ -201,7 +204,8 @@ RSpec.describe 'Database schema' do
"Operations::FeatureFlags::Strategy" => %w[parameters],
"Packages::Composer::Metadatum" => %w[composer_json],
"RawUsageData" => %w[payload], # Usage data payload changes often, we cannot use one schema
- "Releases::Evidence" => %w[summary]
+ "Releases::Evidence" => %w[summary],
+ "Vulnerabilities::Finding::Evidence" => %w[data] # Validation work in progress
}.freeze
# We are skipping GEO models for now as it adds up complexity
diff --git a/spec/experiments/new_project_sast_enabled_experiment_spec.rb b/spec/experiments/new_project_sast_enabled_experiment_spec.rb
new file mode 100644
index 00000000000..dcf71bfffd7
--- /dev/null
+++ b/spec/experiments/new_project_sast_enabled_experiment_spec.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe NewProjectSastEnabledExperiment do
+ it "defines the expected behaviors and variants" do
+ expect(subject.behaviors.keys).to match_array(%w[control candidate free_indicator])
+ end
+
+ it "publishes to the database" do
+ expect(subject).to receive(:publish_to_database)
+
+ subject.publish
+ end
+end
diff --git a/spec/factories/bulk_import.rb b/spec/factories/bulk_import.rb
index 07907bab3df..748afc0c67c 100644
--- a/spec/factories/bulk_import.rb
+++ b/spec/factories/bulk_import.rb
@@ -4,6 +4,7 @@ FactoryBot.define do
factory :bulk_import, class: 'BulkImport' do
user
source_type { :gitlab }
+ source_version { BulkImport.min_gl_version_for_project_migration.to_s }
trait :created do
status { 0 }
diff --git a/spec/factories/ci/pending_builds.rb b/spec/factories/ci/pending_builds.rb
index 31e42e1bc9e..28258b0339f 100644
--- a/spec/factories/ci/pending_builds.rb
+++ b/spec/factories/ci/pending_builds.rb
@@ -9,5 +9,6 @@ FactoryBot.define do
namespace { project.namespace }
minutes_exceeded { false }
tag_ids { build.tags_ids }
+ namespace_traversal_ids { project.namespace.traversal_ids }
end
end
diff --git a/spec/factories/ci/pipelines.rb b/spec/factories/ci/pipelines.rb
index 4fc7d945881..ae3404a41a2 100644
--- a/spec/factories/ci/pipelines.rb
+++ b/spec/factories/ci/pipelines.rb
@@ -18,6 +18,10 @@ FactoryBot.define do
transient { child_of { nil } }
transient { upstream_of { nil } }
+ before(:create) do |pipeline, evaluator|
+ pipeline.ensure_project_iid!
+ end
+
after(:build) do |pipeline, evaluator|
if evaluator.child_of
pipeline.project = evaluator.child_of.project
diff --git a/spec/factories/ci/runner_projects.rb b/spec/factories/ci/runner_projects.rb
index ead9fe10f6e..31536275ff4 100644
--- a/spec/factories/ci/runner_projects.rb
+++ b/spec/factories/ci/runner_projects.rb
@@ -2,7 +2,14 @@
FactoryBot.define do
factory :ci_runner_project, class: 'Ci::RunnerProject' do
- runner factory: [:ci_runner, :project]
project
+
+ after(:build) do |runner_project, evaluator|
+ unless runner_project.runner.present?
+ runner_project.runner = build(
+ :ci_runner, :project, runner_projects: [runner_project]
+ )
+ end
+ end
end
end
diff --git a/spec/factories/ci/runners.rb b/spec/factories/ci/runners.rb
index 30f78531324..d0853df4e4b 100644
--- a/spec/factories/ci/runners.rb
+++ b/spec/factories/ci/runners.rb
@@ -10,6 +10,16 @@ FactoryBot.define do
runner_type { :instance_type }
+ transient do
+ projects { [] }
+ end
+
+ after(:build) do |runner, evaluator|
+ evaluator.projects.each do |proj|
+ runner.runner_projects << build(:ci_runner_project, project: proj)
+ end
+ end
+
trait :online do
contacted_at { Time.now }
end
@@ -30,7 +40,9 @@ FactoryBot.define do
runner_type { :project_type }
after(:build) do |runner, evaluator|
- runner.projects << build(:project) if runner.projects.empty?
+ if runner.runner_projects.empty?
+ runner.runner_projects << build(:ci_runner_project)
+ end
end
end
diff --git a/spec/factories/dependency_proxy.rb b/spec/factories/dependency_proxy.rb
index c2873ce9b5e..836ee87e4d7 100644
--- a/spec/factories/dependency_proxy.rb
+++ b/spec/factories/dependency_proxy.rb
@@ -6,6 +6,11 @@ FactoryBot.define do
size { 1234 }
file { fixture_file_upload('spec/fixtures/dependency_proxy/a3ed95caeb02ffe68cdd9fd84406680ae93d633cb16422d00e8a7c22955b46d4.gz') }
file_name { 'a3ed95caeb02ffe68cdd9fd84406680ae93d633cb16422d00e8a7c22955b46d4.gz' }
+ status { :default }
+
+ trait :expired do
+ status { :expired }
+ end
end
factory :dependency_proxy_manifest, class: 'DependencyProxy::Manifest' do
@@ -13,7 +18,12 @@ FactoryBot.define do
size { 1234 }
file { fixture_file_upload('spec/fixtures/dependency_proxy/manifest') }
digest { 'sha256:d0710affa17fad5f466a70159cc458227bd25d4afb39514ef662ead3e6c99515' }
- file_name { 'alpine:latest.json' }
+ sequence(:file_name) { |n| "alpine:latest#{n}.json" }
content_type { 'application/vnd.docker.distribution.manifest.v2+json' }
+ status { :default }
+
+ trait :expired do
+ status { :expired }
+ end
end
end
diff --git a/spec/factories/dependency_proxy/group_settings.rb b/spec/factories/dependency_proxy/group_settings.rb
new file mode 100644
index 00000000000..c15cddf7430
--- /dev/null
+++ b/spec/factories/dependency_proxy/group_settings.rb
@@ -0,0 +1,9 @@
+# frozen_string_literal: true
+
+FactoryBot.define do
+ factory :dependency_proxy_group_setting, class: 'DependencyProxy::GroupSetting' do
+ group
+
+ enabled { true }
+ end
+end
diff --git a/spec/factories/dependency_proxy/image_ttl_group_policies.rb b/spec/factories/dependency_proxy/image_ttl_group_policies.rb
index 21e5dd44cf5..068c87f578c 100644
--- a/spec/factories/dependency_proxy/image_ttl_group_policies.rb
+++ b/spec/factories/dependency_proxy/image_ttl_group_policies.rb
@@ -6,5 +6,9 @@ FactoryBot.define do
enabled { true }
ttl { 90 }
+
+ trait :disabled do
+ enabled { false }
+ end
end
end
diff --git a/spec/factories/design_management/versions.rb b/spec/factories/design_management/versions.rb
index 247a385bd0e..e505a77d6bd 100644
--- a/spec/factories/design_management/versions.rb
+++ b/spec/factories/design_management/versions.rb
@@ -52,9 +52,9 @@ FactoryBot.define do
.where(design_id: evaluator.deleted_designs.map(&:id))
.update_all(event: events[:deletion])
- version.designs.reload
# Ensure version.issue == design.issue for all version.designs
version.designs.update_all(issue_id: version.issue_id)
+ version.designs.reload
needed = evaluator.designs_count
have = version.designs.size
diff --git a/spec/factories/groups.rb b/spec/factories/groups.rb
index bd6e37c1cef..859f381e4c1 100644
--- a/spec/factories/groups.rb
+++ b/spec/factories/groups.rb
@@ -4,7 +4,7 @@ FactoryBot.define do
factory :group, class: 'Group', parent: :namespace do
sequence(:name) { |n| "group#{n}" }
path { name.downcase.gsub(/\s/, '_') }
- type { 'Group' }
+ type { Group.sti_name }
owner { nil }
project_creation_level { ::Gitlab::Access::MAINTAINER_PROJECT_ACCESS }
@@ -69,6 +69,20 @@ FactoryBot.define do
allow_descendants_override_disabled_shared_runners { true }
end
+ trait :disabled_and_unoverridable do
+ shared_runners_disabled
+ allow_descendants_override_disabled_shared_runners { false }
+ end
+
+ trait :disabled_with_override do
+ shared_runners_disabled
+ allow_descendants_override_disabled_shared_runners
+ end
+
+ trait :shared_runners_enabled do
+ shared_runners_enabled { true }
+ end
+
# Construct a hierarchy underneath the group.
# Each group will have `children` amount of children,
# and `depth` levels of descendants.
diff --git a/spec/factories/integration_data.rb b/spec/factories/integration_data.rb
index 4d0892556f8..7ff2f3ae846 100644
--- a/spec/factories/integration_data.rb
+++ b/spec/factories/integration_data.rb
@@ -18,12 +18,4 @@ FactoryBot.define do
factory :issue_tracker_data, class: 'Integrations::IssueTrackerData' do
integration
end
-
- factory :open_project_tracker_data, class: 'Integrations::OpenProjectTrackerData' do
- integration factory: :open_project_service
- url { 'http://openproject.example.com' }
- token { 'supersecret' }
- project_identifier_code { 'PRJ-1' }
- closed_status_id { '15' }
- end
end
diff --git a/spec/factories/integrations.rb b/spec/factories/integrations.rb
index cb1c94c25c1..63f85c04ac7 100644
--- a/spec/factories/integrations.rb
+++ b/spec/factories/integrations.rb
@@ -166,26 +166,6 @@ FactoryBot.define do
external_wiki_url { 'http://external-wiki-url.com' }
end
- factory :open_project_service, class: 'Integrations::OpenProject' do
- project
- active { true }
-
- transient do
- url { 'http://openproject.example.com' }
- api_url { 'http://openproject.example.com/issues/:id' }
- token { 'supersecret' }
- closed_status_id { '15' }
- project_identifier_code { 'PRJ-1' }
- end
-
- after(:build) do |integration, evaluator|
- integration.open_project_tracker_data = build(:open_project_tracker_data,
- integration: integration, url: evaluator.url, api_url: evaluator.api_url, token: evaluator.token,
- closed_status_id: evaluator.closed_status_id, project_identifier_code: evaluator.project_identifier_code
- )
- end
- end
-
trait :jira_cloud_service do
url { 'https://mysite.atlassian.net' }
username { 'jira_user' }
diff --git a/spec/factories/namespaces.rb b/spec/factories/namespaces.rb
index 957ec88420d..959183f227d 100644
--- a/spec/factories/namespaces.rb
+++ b/spec/factories/namespaces.rb
@@ -5,6 +5,8 @@ FactoryBot.define do
sequence(:name) { |n| "namespace#{n}" }
path { name.downcase.gsub(/\s/, '_') }
+ # TODO: can this be moved into the :user_namespace factory?
+ # evaluate in issue https://gitlab.com/gitlab-org/gitlab/-/issues/341070
owner { association(:user, strategy: :build, namespace: instance, username: path) }
trait :with_aggregation_schedule do
diff --git a/spec/factories/namespaces/project_namespaces.rb b/spec/factories/namespaces/project_namespaces.rb
index 10b86f48090..ca9fc5f8768 100644
--- a/spec/factories/namespaces/project_namespaces.rb
+++ b/spec/factories/namespaces/project_namespaces.rb
@@ -3,10 +3,11 @@
FactoryBot.define do
factory :project_namespace, class: 'Namespaces::ProjectNamespace' do
project
+ parent { project.namespace }
+ visibility_level { project.visibility_level }
name { project.name }
path { project.path }
type { Namespaces::ProjectNamespace.sti_name }
owner { nil }
- parent factory: :group
end
end
diff --git a/spec/factories/namespaces/user_namespaces.rb b/spec/factories/namespaces/user_namespaces.rb
new file mode 100644
index 00000000000..31c924462d7
--- /dev/null
+++ b/spec/factories/namespaces/user_namespaces.rb
@@ -0,0 +1,8 @@
+# frozen_string_literal: true
+
+FactoryBot.define do
+ factory :user_namespace, class: 'Namespaces::UserNamespace', parent: :namespace do
+ sequence(:name) { |n| "user_namespace#{n}" }
+ type { Namespaces::UserNamespace.sti_name }
+ end
+end
diff --git a/spec/factories/packages.rb b/spec/factories/packages.rb
deleted file mode 100644
index b04b7e691fe..00000000000
--- a/spec/factories/packages.rb
+++ /dev/null
@@ -1,365 +0,0 @@
-# frozen_string_literal: true
-FactoryBot.define do
- factory :package, class: 'Packages::Package' do
- project
- creator { project&.creator }
- name { 'my/company/app/my-app' }
- sequence(:version) { |n| "1.#{n}-SNAPSHOT" }
- package_type { :maven }
- status { :default }
-
- trait :hidden do
- status { :hidden }
- end
-
- trait :processing do
- status { :processing }
- end
-
- trait :error do
- status { :error }
- end
-
- factory :maven_package do
- maven_metadatum
-
- after :build do |package|
- package.maven_metadatum.path = package.version? ? "#{package.name}/#{package.version}" : package.name
- end
-
- after :create do |package|
- create :package_file, :xml, package: package
- create :package_file, :jar, package: package
- create :package_file, :pom, package: package
- end
- end
-
- factory :rubygems_package do
- sequence(:name) { |n| "my_gem_#{n}" }
- sequence(:version) { |n| "1.#{n}" }
- package_type { :rubygems }
-
- after :create do |package|
- create :package_file, package.processing? ? :unprocessed_gem : :gem, package: package
- create :package_file, :gemspec, package: package unless package.processing?
- end
-
- trait(:with_metadatum) do
- after :build do |pkg|
- pkg.rubygems_metadatum = build(:rubygems_metadatum)
- end
- end
- end
-
- factory :debian_package do
- sequence(:name) { |n| "package-#{n}" }
- sequence(:version) { |n| "1.0-#{n}" }
- package_type { :debian }
-
- transient do
- without_package_files { false }
- file_metadatum_trait { :keep }
- published_in { :create }
- end
-
- after :build do |package, evaluator|
- if evaluator.published_in == :create
- create(:debian_publication, package: package)
- elsif !evaluator.published_in.nil?
- create(:debian_publication, package: package, distribution: evaluator.published_in)
- end
- end
-
- after :create do |package, evaluator|
- unless evaluator.without_package_files
- create :debian_package_file, :source, evaluator.file_metadatum_trait, package: package
- create :debian_package_file, :dsc, evaluator.file_metadatum_trait, package: package
- create :debian_package_file, :deb, evaluator.file_metadatum_trait, package: package
- create :debian_package_file, :deb_dev, evaluator.file_metadatum_trait, package: package
- create :debian_package_file, :udeb, evaluator.file_metadatum_trait, package: package
- create :debian_package_file, :buildinfo, evaluator.file_metadatum_trait, package: package
- create :debian_package_file, :changes, evaluator.file_metadatum_trait, package: package
- end
- end
-
- factory :debian_incoming do
- name { 'incoming' }
- version { nil }
-
- transient do
- without_package_files { false }
- file_metadatum_trait { :unknown }
- published_in { nil }
- end
- end
- end
-
- factory :helm_package do
- sequence(:name) { |n| "package-#{n}" }
- sequence(:version) { |n| "v1.0.#{n}" }
- package_type { :helm }
-
- transient do
- without_package_files { false }
- end
-
- after :create do |package, evaluator|
- unless evaluator.without_package_files
- create :helm_package_file, package: package
- end
- end
- end
-
- factory :npm_package do
- sequence(:name) { |n| "@#{project.root_namespace.path}/package-#{n}"}
- sequence(:version) { |n| "1.0.#{n}" }
- package_type { :npm }
-
- after :create do |package|
- create :package_file, :npm, package: package
- end
-
- trait :with_build do
- after :create do |package|
- user = package.project.creator
- pipeline = create(:ci_pipeline, user: user)
- create(:ci_build, user: user, pipeline: pipeline)
- create :package_build_info, package: package, pipeline: pipeline
- end
- end
- end
-
- factory :terraform_module_package do
- sequence(:name) { |n| "module-#{n}/system" }
- version { '1.0.0' }
- package_type { :terraform_module }
-
- after :create do |package|
- create :package_file, :terraform_module, package: package
- end
-
- trait :with_build do
- after :create do |package|
- user = package.project.creator
- pipeline = create(:ci_pipeline, user: user)
- create(:ci_build, user: user, pipeline: pipeline)
- create :package_build_info, package: package, pipeline: pipeline
- end
- end
- end
-
- factory :nuget_package do
- sequence(:name) { |n| "NugetPackage#{n}"}
- sequence(:version) { |n| "1.0.#{n}" }
- package_type { :nuget }
-
- after :create do |package|
- create :package_file, :nuget, package: package, file_name: "#{package.name}.#{package.version}.nupkg"
- end
-
- trait(:with_metadatum) do
- after :build do |pkg|
- pkg.nuget_metadatum = build(:nuget_metadatum)
- end
- end
-
- trait(:with_symbol_package) do
- after :create do |package|
- create :package_file, :snupkg, package: package, file_name: "#{package.name}.#{package.version}.snupkg"
- end
- end
- end
-
- factory :pypi_package do
- sequence(:name) { |n| "pypi-package-#{n}"}
- sequence(:version) { |n| "1.0.#{n}" }
- package_type { :pypi }
-
- transient do
- without_loaded_metadatum { false }
- end
-
- after :create do |package, evaluator|
- create :package_file, :pypi, package: package, file_name: "#{package.name}-#{package.version}.tar.gz"
-
- unless evaluator.without_loaded_metadatum
- create :pypi_metadatum, package: package
- end
- end
- end
-
- factory :composer_package do
- sequence(:name) { |n| "composer-package-#{n}"}
- sequence(:version) { |n| "1.0.#{n}" }
- package_type { :composer }
-
- transient do
- sha { project.repository.find_branch('master').target }
- json { { name: name, version: version } }
- end
-
- trait(:with_metadatum) do
- after :create do |package, evaluator|
- create :composer_metadatum, package: package, target_sha: evaluator.sha, composer_json: evaluator.json
- end
- end
- end
-
- factory :golang_package do
- sequence(:name) { |n| "golang.org/x/pkg-#{n}"}
- sequence(:version) { |n| "v1.0.#{n}" }
- package_type { :golang }
- end
-
- factory :conan_package do
- conan_metadatum
-
- transient do
- without_package_files { false }
- end
-
- after :build do |package|
- package.conan_metadatum.package_username = Packages::Conan::Metadatum.package_username_from(
- full_path: package.project.full_path
- )
- end
-
- sequence(:name) { |n| "package-#{n}" }
- version { '1.0.0' }
- package_type { :conan }
-
- after :create do |package, evaluator|
- unless evaluator.without_package_files
- create :conan_package_file, :conan_recipe_file, package: package
- create :conan_package_file, :conan_recipe_manifest, package: package
- create :conan_package_file, :conan_package_info, package: package
- create :conan_package_file, :conan_package_manifest, package: package
- create :conan_package_file, :conan_package, package: package
- end
- end
-
- trait(:without_loaded_metadatum) do
- conan_metadatum { build(:conan_metadatum, package: nil) } # rubocop:disable FactoryBot/InlineAssociation
- end
- end
-
- factory :generic_package do
- sequence(:name) { |n| "generic-package-#{n}" }
- version { '1.0.0' }
- package_type { :generic }
- end
- end
-
- factory :composer_metadatum, class: 'Packages::Composer::Metadatum' do
- package { association(:composer_package) }
-
- target_sha { '123' }
- composer_json { { name: 'foo' } }
- end
-
- factory :composer_cache_file, class: 'Packages::Composer::CacheFile' do
- group
-
- file_sha256 { '1' * 64 }
-
- transient do
- file_fixture { 'spec/fixtures/packages/composer/package.json' }
- end
-
- after(:build) do |cache_file, evaluator|
- cache_file.file = fixture_file_upload(evaluator.file_fixture)
- end
-
- trait(:object_storage) do
- file_store { Packages::Composer::CacheUploader::Store::REMOTE }
- end
- end
-
- factory :maven_metadatum, class: 'Packages::Maven::Metadatum' do
- association :package, package_type: :maven
- path { 'my/company/app/my-app/1.0-SNAPSHOT' }
- app_group { 'my.company.app' }
- app_name { 'my-app' }
- app_version { '1.0-SNAPSHOT' }
- end
-
- factory :conan_metadatum, class: 'Packages::Conan::Metadatum' do
- association :package, factory: [:conan_package, :without_loaded_metadatum], without_package_files: true
- package_username { 'username' }
- package_channel { 'stable' }
- end
-
- factory :pypi_metadatum, class: 'Packages::Pypi::Metadatum' do
- package { association(:pypi_package, without_loaded_metadatum: true) }
- required_python { '>=2.7' }
- end
-
- factory :nuget_metadatum, class: 'Packages::Nuget::Metadatum' do
- package { association(:nuget_package) }
-
- license_url { 'http://www.gitlab.com' }
- project_url { 'http://www.gitlab.com' }
- icon_url { 'http://www.gitlab.com' }
- end
-
- factory :conan_file_metadatum, class: 'Packages::Conan::FileMetadatum' do
- package_file { association(:conan_package_file, :conan_recipe_file, without_loaded_metadatum: true) }
- recipe_revision { '0' }
- conan_file_type { 'recipe_file' }
-
- trait(:recipe_file) do
- conan_file_type { 'recipe_file' }
- end
-
- trait(:package_file) do
- package_file { association(:conan_package_file, :conan_package, without_loaded_metadatum: true) }
- conan_file_type { 'package_file' }
- package_revision { '0' }
- conan_package_reference { '123456789' }
- end
- end
-
- factory :packages_dependency, class: 'Packages::Dependency' do
- sequence(:name) { |n| "@test/package-#{n}"}
- sequence(:version_pattern) { |n| "~6.2.#{n}" }
-
- trait(:rubygems) do
- sequence(:name) { |n| "gem-dependency-#{n}"}
- end
- end
-
- factory :packages_dependency_link, class: 'Packages::DependencyLink' do
- package { association(:nuget_package) }
- dependency { association(:packages_dependency) }
- dependency_type { :dependencies }
-
- trait(:with_nuget_metadatum) do
- after :build do |link|
- link.nuget_metadatum = build(:nuget_dependency_link_metadatum)
- end
- end
-
- trait(:rubygems) do
- package { association(:rubygems_package) }
- dependency { association(:packages_dependency, :rubygems) }
- end
- end
-
- factory :nuget_dependency_link_metadatum, class: 'Packages::Nuget::DependencyLinkMetadatum' do
- dependency_link { association(:packages_dependency_link) }
- target_framework { '.NETStandard2.0' }
- end
-
- factory :packages_tag, class: 'Packages::Tag' do
- package
- sequence(:name) { |n| "tag-#{n}"}
- end
-
- factory :packages_build_info, class: 'Packages::BuildInfo' do
- package
-
- trait :with_pipeline do
- association :pipeline, factory: [:ci_pipeline, :with_job]
- end
- end
-end
diff --git a/spec/factories/packages/build_info.rb b/spec/factories/packages/build_infos.rb
index dc6208d72a9..dc6208d72a9 100644
--- a/spec/factories/packages/build_info.rb
+++ b/spec/factories/packages/build_infos.rb
diff --git a/spec/factories/packages/composer/cache_files.rb b/spec/factories/packages/composer/cache_files.rb
new file mode 100644
index 00000000000..30c28ec175b
--- /dev/null
+++ b/spec/factories/packages/composer/cache_files.rb
@@ -0,0 +1,20 @@
+# frozen_string_literal: true
+FactoryBot.define do
+ factory :composer_cache_file, class: 'Packages::Composer::CacheFile' do
+ group
+
+ file_sha256 { '1' * 64 }
+
+ transient do
+ file_fixture { 'spec/fixtures/packages/composer/package.json' }
+ end
+
+ after(:build) do |cache_file, evaluator|
+ cache_file.file = fixture_file_upload(evaluator.file_fixture)
+ end
+
+ trait(:object_storage) do
+ file_store { Packages::Composer::CacheUploader::Store::REMOTE }
+ end
+ end
+end
diff --git a/spec/factories/packages/composer/metadata.rb b/spec/factories/packages/composer/metadata.rb
new file mode 100644
index 00000000000..e4b38faa9ba
--- /dev/null
+++ b/spec/factories/packages/composer/metadata.rb
@@ -0,0 +1,10 @@
+# frozen_string_literal: true
+
+FactoryBot.define do
+ factory :composer_metadatum, class: 'Packages::Composer::Metadatum' do
+ package { association(:composer_package) }
+
+ target_sha { '123' }
+ composer_json { { name: 'foo' } }
+ end
+end
diff --git a/spec/factories/packages/conan/file_metadata.rb b/spec/factories/packages/conan/file_metadata.rb
new file mode 100644
index 00000000000..609f80e54c7
--- /dev/null
+++ b/spec/factories/packages/conan/file_metadata.rb
@@ -0,0 +1,20 @@
+# frozen_string_literal: true
+
+FactoryBot.define do
+ factory :conan_file_metadatum, class: 'Packages::Conan::FileMetadatum' do
+ package_file { association(:conan_package_file, :conan_recipe_file, without_loaded_metadatum: true) }
+ recipe_revision { '0' }
+ conan_file_type { 'recipe_file' }
+
+ trait(:recipe_file) do
+ conan_file_type { 'recipe_file' }
+ end
+
+ trait(:package_file) do
+ package_file { association(:conan_package_file, :conan_package, without_loaded_metadatum: true) }
+ conan_file_type { 'package_file' }
+ package_revision { '0' }
+ conan_package_reference { '123456789' }
+ end
+ end
+end
diff --git a/spec/factories/packages/conan/metadata.rb b/spec/factories/packages/conan/metadata.rb
new file mode 100644
index 00000000000..81ded799684
--- /dev/null
+++ b/spec/factories/packages/conan/metadata.rb
@@ -0,0 +1,9 @@
+# frozen_string_literal: true
+
+FactoryBot.define do
+ factory :conan_metadatum, class: 'Packages::Conan::Metadatum' do
+ association :package, factory: [:conan_package, :without_loaded_metadatum], without_package_files: true
+ package_username { 'username' }
+ package_channel { 'stable' }
+ end
+end
diff --git a/spec/factories/packages/dependencies.rb b/spec/factories/packages/dependencies.rb
new file mode 100644
index 00000000000..a62d48c2e73
--- /dev/null
+++ b/spec/factories/packages/dependencies.rb
@@ -0,0 +1,12 @@
+# frozen_string_literal: true
+
+FactoryBot.define do
+ factory :packages_dependency, class: 'Packages::Dependency' do
+ sequence(:name) { |n| "@test/package-#{n}"}
+ sequence(:version_pattern) { |n| "~6.2.#{n}" }
+
+ trait(:rubygems) do
+ sequence(:name) { |n| "gem-dependency-#{n}"}
+ end
+ end
+end
diff --git a/spec/factories/packages/dependency_links.rb b/spec/factories/packages/dependency_links.rb
new file mode 100644
index 00000000000..6470cbdc9a6
--- /dev/null
+++ b/spec/factories/packages/dependency_links.rb
@@ -0,0 +1,20 @@
+# frozen_string_literal: true
+
+FactoryBot.define do
+ factory :packages_dependency_link, class: 'Packages::DependencyLink' do
+ package { association(:nuget_package) }
+ dependency { association(:packages_dependency) }
+ dependency_type { :dependencies }
+
+ trait(:with_nuget_metadatum) do
+ after :build do |link|
+ link.nuget_metadatum = build(:nuget_dependency_link_metadatum)
+ end
+ end
+
+ trait(:rubygems) do
+ package { association(:rubygems_package) }
+ dependency { association(:packages_dependency, :rubygems) }
+ end
+ end
+end
diff --git a/spec/factories/packages/maven/maven_metadata.rb b/spec/factories/packages/maven/maven_metadata.rb
new file mode 100644
index 00000000000..861daab3a74
--- /dev/null
+++ b/spec/factories/packages/maven/maven_metadata.rb
@@ -0,0 +1,11 @@
+# frozen_string_literal: true
+
+FactoryBot.define do
+ factory :maven_metadatum, class: 'Packages::Maven::Metadatum' do
+ association :package, package_type: :maven
+ path { 'my/company/app/my-app/1.0-SNAPSHOT' }
+ app_group { 'my.company.app' }
+ app_name { 'my-app' }
+ app_version { '1.0-SNAPSHOT' }
+ end
+end
diff --git a/spec/factories/packages/nuget/dependency_link_metadata.rb b/spec/factories/packages/nuget/dependency_link_metadata.rb
new file mode 100644
index 00000000000..ed632e72cbf
--- /dev/null
+++ b/spec/factories/packages/nuget/dependency_link_metadata.rb
@@ -0,0 +1,8 @@
+# frozen_string_literal: true
+
+FactoryBot.define do
+ factory :nuget_dependency_link_metadatum, class: 'Packages::Nuget::DependencyLinkMetadatum' do
+ dependency_link { association(:packages_dependency_link) }
+ target_framework { '.NETStandard2.0' }
+ end
+end
diff --git a/spec/factories/packages/nuget/metadata.rb b/spec/factories/packages/nuget/metadata.rb
new file mode 100644
index 00000000000..d2a2a666928
--- /dev/null
+++ b/spec/factories/packages/nuget/metadata.rb
@@ -0,0 +1,11 @@
+# frozen_string_literal: true
+
+FactoryBot.define do
+ factory :nuget_metadatum, class: 'Packages::Nuget::Metadatum' do
+ package { association(:nuget_package) }
+
+ license_url { 'http://www.gitlab.com' }
+ project_url { 'http://www.gitlab.com' }
+ icon_url { 'http://www.gitlab.com' }
+ end
+end
diff --git a/spec/factories/packages/package_file.rb b/spec/factories/packages/package_files.rb
index d9afbac1048..d9afbac1048 100644
--- a/spec/factories/packages/package_file.rb
+++ b/spec/factories/packages/package_files.rb
diff --git a/spec/factories/packages/package_tags.rb b/spec/factories/packages/package_tags.rb
new file mode 100644
index 00000000000..3d2eea4a73b
--- /dev/null
+++ b/spec/factories/packages/package_tags.rb
@@ -0,0 +1,8 @@
+# frozen_string_literal: true
+
+FactoryBot.define do
+ factory :packages_tag, class: 'Packages::Tag' do
+ package
+ sequence(:name) { |n| "tag-#{n}"}
+ end
+end
diff --git a/spec/factories/packages/packages.rb b/spec/factories/packages/packages.rb
new file mode 100644
index 00000000000..bb9aa95fe08
--- /dev/null
+++ b/spec/factories/packages/packages.rb
@@ -0,0 +1,252 @@
+# frozen_string_literal: true
+FactoryBot.define do
+ factory :package, class: 'Packages::Package' do
+ project
+ creator { project&.creator }
+ name { 'my/company/app/my-app' }
+ sequence(:version) { |n| "1.#{n}-SNAPSHOT" }
+ package_type { :maven }
+ status { :default }
+
+ trait :hidden do
+ status { :hidden }
+ end
+
+ trait :processing do
+ status { :processing }
+ end
+
+ trait :error do
+ status { :error }
+ end
+
+ factory :maven_package do
+ maven_metadatum
+
+ after :build do |package|
+ package.maven_metadatum.path = package.version? ? "#{package.name}/#{package.version}" : package.name
+ end
+
+ after :create do |package|
+ create :package_file, :xml, package: package
+ create :package_file, :jar, package: package
+ create :package_file, :pom, package: package
+ end
+ end
+
+ factory :rubygems_package do
+ sequence(:name) { |n| "my_gem_#{n}" }
+ sequence(:version) { |n| "1.#{n}" }
+ package_type { :rubygems }
+
+ after :create do |package|
+ create :package_file, package.processing? ? :unprocessed_gem : :gem, package: package
+ create :package_file, :gemspec, package: package unless package.processing?
+ end
+
+ trait(:with_metadatum) do
+ after :build do |pkg|
+ pkg.rubygems_metadatum = build(:rubygems_metadatum)
+ end
+ end
+ end
+
+ factory :debian_package do
+ sequence(:name) { |n| "package-#{n}" }
+ sequence(:version) { |n| "1.0-#{n}" }
+ package_type { :debian }
+
+ transient do
+ without_package_files { false }
+ file_metadatum_trait { :keep }
+ published_in { :create }
+ end
+
+ after :build do |package, evaluator|
+ if evaluator.published_in == :create
+ create(:debian_publication, package: package)
+ elsif !evaluator.published_in.nil?
+ create(:debian_publication, package: package, distribution: evaluator.published_in)
+ end
+ end
+
+ after :create do |package, evaluator|
+ unless evaluator.without_package_files
+ create :debian_package_file, :source, evaluator.file_metadatum_trait, package: package
+ create :debian_package_file, :dsc, evaluator.file_metadatum_trait, package: package
+ create :debian_package_file, :deb, evaluator.file_metadatum_trait, package: package
+ create :debian_package_file, :deb_dev, evaluator.file_metadatum_trait, package: package
+ create :debian_package_file, :udeb, evaluator.file_metadatum_trait, package: package
+ create :debian_package_file, :buildinfo, evaluator.file_metadatum_trait, package: package
+ create :debian_package_file, :changes, evaluator.file_metadatum_trait, package: package
+ end
+ end
+
+ factory :debian_incoming do
+ name { 'incoming' }
+ version { nil }
+
+ transient do
+ without_package_files { false }
+ file_metadatum_trait { :unknown }
+ published_in { nil }
+ end
+ end
+ end
+
+ factory :helm_package do
+ sequence(:name) { |n| "package-#{n}" }
+ sequence(:version) { |n| "v1.0.#{n}" }
+ package_type { :helm }
+
+ transient do
+ without_package_files { false }
+ end
+
+ after :create do |package, evaluator|
+ unless evaluator.without_package_files
+ create :helm_package_file, package: package
+ end
+ end
+ end
+
+ factory :npm_package do
+ sequence(:name) { |n| "@#{project.root_namespace.path}/package-#{n}"}
+ sequence(:version) { |n| "1.0.#{n}" }
+ package_type { :npm }
+
+ after :create do |package|
+ create :package_file, :npm, package: package
+ end
+
+ trait :with_build do
+ after :create do |package|
+ user = package.project.creator
+ pipeline = create(:ci_pipeline, user: user)
+ create(:ci_build, user: user, pipeline: pipeline)
+ create :package_build_info, package: package, pipeline: pipeline
+ end
+ end
+ end
+
+ factory :terraform_module_package do
+ sequence(:name) { |n| "module-#{n}/system" }
+ version { '1.0.0' }
+ package_type { :terraform_module }
+
+ after :create do |package|
+ create :package_file, :terraform_module, package: package
+ end
+
+ trait :with_build do
+ after :create do |package|
+ user = package.project.creator
+ pipeline = create(:ci_pipeline, user: user)
+ create(:ci_build, user: user, pipeline: pipeline)
+ create :package_build_info, package: package, pipeline: pipeline
+ end
+ end
+ end
+
+ factory :nuget_package do
+ sequence(:name) { |n| "NugetPackage#{n}"}
+ sequence(:version) { |n| "1.0.#{n}" }
+ package_type { :nuget }
+
+ after :create do |package|
+ create :package_file, :nuget, package: package, file_name: "#{package.name}.#{package.version}.nupkg"
+ end
+
+ trait(:with_metadatum) do
+ after :build do |pkg|
+ pkg.nuget_metadatum = build(:nuget_metadatum)
+ end
+ end
+
+ trait(:with_symbol_package) do
+ after :create do |package|
+ create :package_file, :snupkg, package: package, file_name: "#{package.name}.#{package.version}.snupkg"
+ end
+ end
+ end
+
+ factory :pypi_package do
+ sequence(:name) { |n| "pypi-package-#{n}"}
+ sequence(:version) { |n| "1.0.#{n}" }
+ package_type { :pypi }
+
+ transient do
+ without_loaded_metadatum { false }
+ end
+
+ after :create do |package, evaluator|
+ create :package_file, :pypi, package: package, file_name: "#{package.name}-#{package.version}.tar.gz"
+
+ unless evaluator.without_loaded_metadatum
+ create :pypi_metadatum, package: package
+ end
+ end
+ end
+
+ factory :composer_package do
+ sequence(:name) { |n| "composer-package-#{n}"}
+ sequence(:version) { |n| "1.0.#{n}" }
+ package_type { :composer }
+
+ transient do
+ sha { project.repository.find_branch('master').target }
+ json { { name: name, version: version } }
+ end
+
+ trait(:with_metadatum) do
+ after :create do |package, evaluator|
+ create :composer_metadatum, package: package, target_sha: evaluator.sha, composer_json: evaluator.json
+ end
+ end
+ end
+
+ factory :golang_package do
+ sequence(:name) { |n| "golang.org/x/pkg-#{n}"}
+ sequence(:version) { |n| "v1.0.#{n}" }
+ package_type { :golang }
+ end
+
+ factory :conan_package do
+ conan_metadatum
+
+ transient do
+ without_package_files { false }
+ end
+
+ after :build do |package|
+ package.conan_metadatum.package_username = Packages::Conan::Metadatum.package_username_from(
+ full_path: package.project.full_path
+ )
+ end
+
+ sequence(:name) { |n| "package-#{n}" }
+ version { '1.0.0' }
+ package_type { :conan }
+
+ after :create do |package, evaluator|
+ unless evaluator.without_package_files
+ create :conan_package_file, :conan_recipe_file, package: package
+ create :conan_package_file, :conan_recipe_manifest, package: package
+ create :conan_package_file, :conan_package_info, package: package
+ create :conan_package_file, :conan_package_manifest, package: package
+ create :conan_package_file, :conan_package, package: package
+ end
+ end
+
+ trait(:without_loaded_metadatum) do
+ conan_metadatum { build(:conan_metadatum, package: nil) } # rubocop:disable FactoryBot/InlineAssociation
+ end
+ end
+
+ factory :generic_package do
+ sequence(:name) { |n| "generic-package-#{n}" }
+ version { '1.0.0' }
+ package_type { :generic }
+ end
+ end
+end
diff --git a/spec/factories/packages/pypi/metadata.rb b/spec/factories/packages/pypi/metadata.rb
new file mode 100644
index 00000000000..00abe403bd1
--- /dev/null
+++ b/spec/factories/packages/pypi/metadata.rb
@@ -0,0 +1,8 @@
+# frozen_string_literal: true
+
+FactoryBot.define do
+ factory :pypi_metadatum, class: 'Packages::Pypi::Metadatum' do
+ package { association(:pypi_package, without_loaded_metadatum: true) }
+ required_python { '>=2.7' }
+ end
+end
diff --git a/spec/factories/pages_domains.rb b/spec/factories/pages_domains.rb
index 2ba5cbb48bf..f3f2af79b76 100644
--- a/spec/factories/pages_domains.rb
+++ b/spec/factories/pages_domains.rb
@@ -258,6 +258,18 @@ ZDXgrA==
certificate_source { :gitlab_provided }
end
+ # This contains:
+ # webdioxide.com
+ # Let's Encrypt R3
+ # ISRG Root X1 (issued by DST Root CA X3)
+ #
+ # DST Root CA X3 expired on 2021-09-30, but ISRG Root X1 should be trusted on most systems.
+ trait :letsencrypt_expired_x3_root do
+ certificate do
+ File.read(Rails.root.join('spec/fixtures/ssl', 'letsencrypt_expired_x3.pem'))
+ end
+ end
+
trait :explicit_ecdsa do
certificate do
'-----BEGIN CERTIFICATE-----
diff --git a/spec/factories/project_error_tracking_settings.rb b/spec/factories/project_error_tracking_settings.rb
index 424f462e1a0..ed743d8283c 100644
--- a/spec/factories/project_error_tracking_settings.rb
+++ b/spec/factories/project_error_tracking_settings.rb
@@ -8,6 +8,7 @@ FactoryBot.define do
token { 'access_token_123' }
project_name { 'Sentry Project' }
organization_name { 'Sentry Org' }
+ integrated { false }
trait :disabled do
enabled { false }
diff --git a/spec/factories/usage_data.rb b/spec/factories/usage_data.rb
index c02bcfc2169..fc1f5d71f39 100644
--- a/spec/factories/usage_data.rb
+++ b/spec/factories/usage_data.rb
@@ -88,17 +88,9 @@ FactoryBot.define do
create(:cluster, :group, :disabled)
create(:cluster, :instance, :disabled)
- # Applications
- create(:clusters_applications_helm, :installed, cluster: gcp_cluster)
- create(:clusters_applications_ingress, :installed, cluster: gcp_cluster)
- create(:clusters_applications_cert_manager, :installed, cluster: gcp_cluster)
- create(:clusters_applications_prometheus, :installed, cluster: gcp_cluster)
- create(:clusters_applications_crossplane, :installed, cluster: gcp_cluster)
- create(:clusters_applications_runner, :installed, cluster: gcp_cluster)
- create(:clusters_applications_knative, :installed, cluster: gcp_cluster)
- create(:clusters_applications_elastic_stack, :installed, cluster: gcp_cluster)
- create(:clusters_applications_jupyter, :installed, cluster: gcp_cluster)
- create(:clusters_applications_cilium, :installed, cluster: gcp_cluster)
+ # Cluster Integrations
+ create(:clusters_integrations_prometheus, cluster: gcp_cluster)
+ create(:clusters_integrations_elastic_stack, cluster: gcp_cluster)
create(:grafana_integration, project: projects[0], enabled: true)
create(:grafana_integration, project: projects[1], enabled: true)
diff --git a/spec/factories/users.rb b/spec/factories/users.rb
index 04bacbe14e7..325f62f6028 100644
--- a/spec/factories/users.rb
+++ b/spec/factories/users.rb
@@ -139,6 +139,8 @@ FactoryBot.define do
end
factory :omniauth_user do
+ password_automatically_set { true }
+
transient do
extern_uid { '123456' }
provider { 'ldapmain' }
diff --git a/spec/factories_spec.rb b/spec/factories_spec.rb
index 6c7c3776c4a..7dc38b25fac 100644
--- a/spec/factories_spec.rb
+++ b/spec/factories_spec.rb
@@ -29,6 +29,7 @@ RSpec.describe 'factories' do
[:pages_domain, :with_trusted_chain],
[:pages_domain, :with_trusted_expired_chain],
[:pages_domain, :explicit_ecdsa],
+ [:pages_domain, :letsencrypt_expired_x3_root],
[:project_member, :blocked],
[:remote_mirror, :ssh],
[:user_preference, :only_comments],
diff --git a/spec/features/admin/admin_appearance_spec.rb b/spec/features/admin/admin_appearance_spec.rb
index cd148642b90..cb69eac8035 100644
--- a/spec/features/admin/admin_appearance_spec.rb
+++ b/spec/features/admin/admin_appearance_spec.rb
@@ -34,6 +34,10 @@ RSpec.describe 'Admin Appearance' do
visit admin_application_settings_appearances_path
click_link "Sign-in page"
+ expect(find('#login')).to be_disabled
+ expect(find('#password')).to be_disabled
+ expect(find('button')).to be_disabled
+
expect_custom_sign_in_appearance(appearance)
end
diff --git a/spec/features/admin/admin_builds_spec.rb b/spec/features/admin/admin_builds_spec.rb
deleted file mode 100644
index 42827dd5b49..00000000000
--- a/spec/features/admin/admin_builds_spec.rb
+++ /dev/null
@@ -1,141 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe 'Admin Builds' do
- before do
- admin = create(:admin)
- sign_in(admin)
- gitlab_enable_admin_mode_sign_in(admin)
- end
-
- describe 'GET /admin/builds' do
- let(:pipeline) { create(:ci_pipeline) }
-
- context 'All tab' do
- context 'when have jobs' do
- it 'shows all jobs', :js do
- create(:ci_build, pipeline: pipeline, status: :pending)
- create(:ci_build, pipeline: pipeline, status: :running)
- create(:ci_build, pipeline: pipeline, status: :success)
- create(:ci_build, pipeline: pipeline, status: :failed)
-
- visit admin_jobs_path
-
- expect(page).to have_selector('.nav-links li.active', text: 'All')
- expect(page).to have_selector('.row-content-block', text: 'All jobs')
- expect(page.all('.build-link').size).to eq(4)
- expect(page).to have_button 'Stop all jobs'
-
- click_button 'Stop all jobs'
- expect(page).to have_button 'Stop jobs'
- expect(page).to have_content 'Stop all jobs?'
- end
- end
-
- context 'when have no jobs' do
- it 'shows a message' do
- visit admin_jobs_path
-
- expect(page).to have_selector('.nav-links li.active', text: 'All')
- expect(page).to have_content 'No jobs to show'
- expect(page).not_to have_button 'Stop all jobs'
- end
- end
- end
-
- context 'Pending tab' do
- context 'when have pending jobs' do
- it 'shows pending jobs' do
- build1 = create(:ci_build, pipeline: pipeline, status: :pending)
- build2 = create(:ci_build, pipeline: pipeline, status: :running)
- build3 = create(:ci_build, pipeline: pipeline, status: :success)
- build4 = create(:ci_build, pipeline: pipeline, status: :failed)
-
- visit admin_jobs_path(scope: :pending)
-
- expect(page).to have_selector('.nav-links li.active', text: 'Pending')
- expect(page.find('.build-link')).to have_content(build1.id)
- expect(page.find('.build-link')).not_to have_content(build2.id)
- expect(page.find('.build-link')).not_to have_content(build3.id)
- expect(page.find('.build-link')).not_to have_content(build4.id)
- expect(page).to have_button 'Stop all jobs'
- end
- end
-
- context 'when have no jobs pending' do
- it 'shows a message' do
- create(:ci_build, pipeline: pipeline, status: :success)
-
- visit admin_jobs_path(scope: :pending)
-
- expect(page).to have_selector('.nav-links li.active', text: 'Pending')
- expect(page).to have_content 'No jobs to show'
- expect(page).not_to have_button 'Stop all jobs'
- end
- end
- end
-
- context 'Running tab' do
- context 'when have running jobs' do
- it 'shows running jobs' do
- build1 = create(:ci_build, pipeline: pipeline, status: :running)
- build2 = create(:ci_build, pipeline: pipeline, status: :success)
- build3 = create(:ci_build, pipeline: pipeline, status: :failed)
- build4 = create(:ci_build, pipeline: pipeline, status: :pending)
-
- visit admin_jobs_path(scope: :running)
-
- expect(page).to have_selector('.nav-links li.active', text: 'Running')
- expect(page.find('.build-link')).to have_content(build1.id)
- expect(page.find('.build-link')).not_to have_content(build2.id)
- expect(page.find('.build-link')).not_to have_content(build3.id)
- expect(page.find('.build-link')).not_to have_content(build4.id)
- expect(page).to have_button 'Stop all jobs'
- end
- end
-
- context 'when have no jobs running' do
- it 'shows a message' do
- create(:ci_build, pipeline: pipeline, status: :success)
-
- visit admin_jobs_path(scope: :running)
-
- expect(page).to have_selector('.nav-links li.active', text: 'Running')
- expect(page).to have_content 'No jobs to show'
- expect(page).not_to have_button 'Stop all jobs'
- end
- end
- end
-
- context 'Finished tab' do
- context 'when have finished jobs' do
- it 'shows finished jobs' do
- build1 = create(:ci_build, pipeline: pipeline, status: :pending)
- build2 = create(:ci_build, pipeline: pipeline, status: :running)
- build3 = create(:ci_build, pipeline: pipeline, status: :success)
-
- visit admin_jobs_path(scope: :finished)
-
- expect(page).to have_selector('.nav-links li.active', text: 'Finished')
- expect(page.find('.build-link')).not_to have_content(build1.id)
- expect(page.find('.build-link')).not_to have_content(build2.id)
- expect(page.find('.build-link')).to have_content(build3.id)
- expect(page).to have_button 'Stop all jobs'
- end
- end
-
- context 'when have no jobs finished' do
- it 'shows a message' do
- create(:ci_build, pipeline: pipeline, status: :running)
-
- visit admin_jobs_path(scope: :finished)
-
- expect(page).to have_selector('.nav-links li.active', text: 'Finished')
- expect(page).to have_content 'No jobs to show'
- expect(page).to have_button 'Stop all jobs'
- end
- end
- end
- end
-end
diff --git a/spec/features/admin/admin_hook_logs_spec.rb b/spec/features/admin/admin_hook_logs_spec.rb
index 3f63bf9a15c..837cab49bd4 100644
--- a/spec/features/admin/admin_hook_logs_spec.rb
+++ b/spec/features/admin/admin_hook_logs_spec.rb
@@ -17,8 +17,8 @@ RSpec.describe 'Admin::HookLogs' do
hook_log
visit edit_admin_hook_path(system_hook)
- expect(page).to have_content('Recent Deliveries')
- expect(page).to have_content(hook_log.url)
+ expect(page).to have_content('Recent events')
+ expect(page).to have_link('View details', href: admin_hook_hook_log_path(system_hook, hook_log))
end
it 'show hook log details' do
diff --git a/spec/features/admin/admin_jobs_spec.rb b/spec/features/admin/admin_jobs_spec.rb
new file mode 100644
index 00000000000..36822f89c12
--- /dev/null
+++ b/spec/features/admin/admin_jobs_spec.rb
@@ -0,0 +1,141 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe 'Admin Jobs' do
+ before do
+ admin = create(:admin)
+ sign_in(admin)
+ gitlab_enable_admin_mode_sign_in(admin)
+ end
+
+ describe 'GET /admin/jobs' do
+ let(:pipeline) { create(:ci_pipeline) }
+
+ context 'All tab' do
+ context 'when have jobs' do
+ it 'shows all jobs', :js do
+ create(:ci_build, pipeline: pipeline, status: :pending)
+ create(:ci_build, pipeline: pipeline, status: :running)
+ create(:ci_build, pipeline: pipeline, status: :success)
+ create(:ci_build, pipeline: pipeline, status: :failed)
+
+ visit admin_jobs_path
+
+ expect(page).to have_selector('[data-testid="jobs-tabs"] a.active', text: 'All')
+ expect(page).to have_selector('.row-content-block', text: 'All jobs')
+ expect(page.all('.build-link').size).to eq(4)
+ expect(page).to have_button 'Stop all jobs'
+
+ click_button 'Stop all jobs'
+ expect(page).to have_button 'Stop jobs'
+ expect(page).to have_content 'Stop all jobs?'
+ end
+ end
+
+ context 'when have no jobs' do
+ it 'shows a message' do
+ visit admin_jobs_path
+
+ expect(page).to have_selector('[data-testid="jobs-tabs"] a.active', text: 'All')
+ expect(page).to have_content 'No jobs to show'
+ expect(page).not_to have_button 'Stop all jobs'
+ end
+ end
+ end
+
+ context 'Pending tab' do
+ context 'when have pending jobs' do
+ it 'shows pending jobs' do
+ build1 = create(:ci_build, pipeline: pipeline, status: :pending)
+ build2 = create(:ci_build, pipeline: pipeline, status: :running)
+ build3 = create(:ci_build, pipeline: pipeline, status: :success)
+ build4 = create(:ci_build, pipeline: pipeline, status: :failed)
+
+ visit admin_jobs_path(scope: :pending)
+
+ expect(page).to have_selector('[data-testid="jobs-tabs"] a.active', text: 'Pending')
+ expect(page.find('.build-link')).to have_content(build1.id)
+ expect(page.find('.build-link')).not_to have_content(build2.id)
+ expect(page.find('.build-link')).not_to have_content(build3.id)
+ expect(page.find('.build-link')).not_to have_content(build4.id)
+ expect(page).to have_button 'Stop all jobs'
+ end
+ end
+
+ context 'when have no jobs pending' do
+ it 'shows a message' do
+ create(:ci_build, pipeline: pipeline, status: :success)
+
+ visit admin_jobs_path(scope: :pending)
+
+ expect(page).to have_selector('[data-testid="jobs-tabs"] a.active', text: 'Pending')
+ expect(page).to have_content 'No jobs to show'
+ expect(page).not_to have_button 'Stop all jobs'
+ end
+ end
+ end
+
+ context 'Running tab' do
+ context 'when have running jobs' do
+ it 'shows running jobs' do
+ build1 = create(:ci_build, pipeline: pipeline, status: :running)
+ build2 = create(:ci_build, pipeline: pipeline, status: :success)
+ build3 = create(:ci_build, pipeline: pipeline, status: :failed)
+ build4 = create(:ci_build, pipeline: pipeline, status: :pending)
+
+ visit admin_jobs_path(scope: :running)
+
+ expect(page).to have_selector('[data-testid="jobs-tabs"] a.active', text: 'Running')
+ expect(page.find('.build-link')).to have_content(build1.id)
+ expect(page.find('.build-link')).not_to have_content(build2.id)
+ expect(page.find('.build-link')).not_to have_content(build3.id)
+ expect(page.find('.build-link')).not_to have_content(build4.id)
+ expect(page).to have_button 'Stop all jobs'
+ end
+ end
+
+ context 'when have no jobs running' do
+ it 'shows a message' do
+ create(:ci_build, pipeline: pipeline, status: :success)
+
+ visit admin_jobs_path(scope: :running)
+
+ expect(page).to have_selector('[data-testid="jobs-tabs"] a.active', text: 'Running')
+ expect(page).to have_content 'No jobs to show'
+ expect(page).not_to have_button 'Stop all jobs'
+ end
+ end
+ end
+
+ context 'Finished tab' do
+ context 'when have finished jobs' do
+ it 'shows finished jobs' do
+ build1 = create(:ci_build, pipeline: pipeline, status: :pending)
+ build2 = create(:ci_build, pipeline: pipeline, status: :running)
+ build3 = create(:ci_build, pipeline: pipeline, status: :success)
+
+ visit admin_jobs_path(scope: :finished)
+
+ expect(page).to have_selector('[data-testid="jobs-tabs"] a.active', text: 'Finished')
+ expect(page.find('.build-link')).not_to have_content(build1.id)
+ expect(page.find('.build-link')).not_to have_content(build2.id)
+ expect(page.find('.build-link')).to have_content(build3.id)
+ expect(page).to have_button 'Stop all jobs'
+ end
+ end
+
+ context 'when have no jobs finished' do
+ it 'shows a message' do
+ create(:ci_build, pipeline: pipeline, status: :running)
+
+ visit admin_jobs_path(scope: :finished)
+
+ expect(page).to have_selector('[data-testid="jobs-tabs"] a.active', text: 'Finished')
+ expect(page).to have_content 'No jobs to show'
+ expect(page).to have_button 'Stop all jobs'
+ end
+ end
+ end
+ end
+end
diff --git a/spec/features/admin/admin_mode/login_spec.rb b/spec/features/admin/admin_mode/login_spec.rb
index 5b2dfdb2941..c8ee6c14499 100644
--- a/spec/features/admin/admin_mode/login_spec.rb
+++ b/spec/features/admin/admin_mode/login_spec.rb
@@ -121,7 +121,7 @@ RSpec.describe 'Admin Mode Login' do
end
context 'when logging in via omniauth' do
- let(:user) { create(:omniauth_user, :admin, :two_factor, extern_uid: 'my-uid', provider: 'saml')}
+ let(:user) { create(:omniauth_user, :admin, :two_factor, extern_uid: 'my-uid', provider: 'saml', password_automatically_set: false)}
let(:mock_saml_response) do
File.read('spec/fixtures/authentication/saml_response.xml')
end
diff --git a/spec/features/admin/admin_projects_spec.rb b/spec/features/admin/admin_projects_spec.rb
index 15def00f354..a50ef34d327 100644
--- a/spec/features/admin/admin_projects_spec.rb
+++ b/spec/features/admin/admin_projects_spec.rb
@@ -96,7 +96,7 @@ RSpec.describe "Admin::Projects" do
visit admin_project_path(project)
click_button 'Search for Namespace'
- click_link 'group: web'
+ click_button 'group: web'
click_button 'Transfer'
expect(page).to have_content("Web / #{project.name}")
diff --git a/spec/features/admin/admin_serverless_domains_spec.rb b/spec/features/admin/admin_serverless_domains_spec.rb
deleted file mode 100644
index 0312e82e1ba..00000000000
--- a/spec/features/admin/admin_serverless_domains_spec.rb
+++ /dev/null
@@ -1,89 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe 'Admin Serverless Domains', :js do
- let(:sample_domain) { build(:pages_domain) }
-
- before do
- allow(Gitlab.config.pages).to receive(:enabled).and_return(true)
- admin = create(:admin)
- sign_in(admin)
- gitlab_enable_admin_mode_sign_in(admin)
- end
-
- it 'add domain with certificate' do
- visit admin_serverless_domains_path
-
- fill_in 'pages_domain[domain]', with: 'foo.com'
- fill_in 'pages_domain[user_provided_certificate]', with: sample_domain.certificate
- fill_in 'pages_domain[user_provided_key]', with: sample_domain.key
- click_button 'Add domain'
-
- expect(current_path).to eq admin_serverless_domains_path
-
- expect(page).to have_field('pages_domain[domain]', with: 'foo.com')
- expect(page).to have_field('serverless_domain_dns', with: /^\*\.foo\.com CNAME /)
- expect(page).to have_field('serverless_domain_verification', with: /^_gitlab-pages-verification-code.foo.com TXT /)
- expect(page).not_to have_field('pages_domain[user_provided_certificate]')
- expect(page).not_to have_field('pages_domain[user_provided_key]')
-
- expect(page).to have_content 'Unverified'
- expect(page).to have_content '/CN=test-certificate'
- end
-
- it 'update domain certificate' do
- visit admin_serverless_domains_path
-
- fill_in 'pages_domain[domain]', with: 'foo.com'
- fill_in 'pages_domain[user_provided_certificate]', with: sample_domain.certificate
- fill_in 'pages_domain[user_provided_key]', with: sample_domain.key
- click_button 'Add domain'
-
- expect(current_path).to eq admin_serverless_domains_path
-
- expect(page).not_to have_field('pages_domain[user_provided_certificate]')
- expect(page).not_to have_field('pages_domain[user_provided_key]')
-
- click_button 'Replace'
-
- expect(page).to have_field('pages_domain[user_provided_certificate]')
- expect(page).to have_field('pages_domain[user_provided_key]')
-
- fill_in 'pages_domain[user_provided_certificate]', with: sample_domain.certificate
- fill_in 'pages_domain[user_provided_key]', with: sample_domain.key
-
- click_button 'Save changes'
-
- expect(page).to have_content 'Domain was successfully updated'
- expect(page).to have_content '/CN=test-certificate'
- end
-
- context 'when domain exists' do
- let!(:domain) { create(:pages_domain, :instance_serverless) }
-
- it 'displays a modal when attempting to delete a domain' do
- visit admin_serverless_domains_path
-
- click_button 'Delete domain'
-
- page.within '#modal-delete-domain' do
- expect(page).to have_content "You are about to delete #{domain.domain} from your instance."
- expect(page).to have_link('Delete domain')
- end
- end
-
- it 'displays a modal with disabled button if unable to delete a domain' do
- create(:serverless_domain_cluster, pages_domain: domain)
-
- visit admin_serverless_domains_path
-
- click_button 'Delete domain'
-
- page.within '#modal-delete-domain' do
- expect(page).to have_content "You must disassociate #{domain.domain} from all clusters it is attached to before deletion."
- expect(page).to have_link('Delete domain')
- end
- end
- end
-end
diff --git a/spec/features/admin/admin_settings_spec.rb b/spec/features/admin/admin_settings_spec.rb
index b25fc9f257a..1c50a7f891f 100644
--- a/spec/features/admin/admin_settings_spec.rb
+++ b/spec/features/admin/admin_settings_spec.rb
@@ -314,12 +314,14 @@ RSpec.describe 'Admin updates settings' do
check 'Default to Auto DevOps pipeline for all projects'
fill_in 'application_setting_auto_devops_domain', with: 'domain.com'
uncheck 'Keep the latest artifacts for all jobs in the latest successful pipelines'
+ uncheck 'Enable pipeline suggestion banner'
click_button 'Save changes'
end
expect(current_settings.auto_devops_enabled?).to be true
expect(current_settings.auto_devops_domain).to eq('domain.com')
expect(current_settings.keep_latest_artifact).to be false
+ expect(current_settings.suggest_pipeline_enabled).to be false
expect(page).to have_content "Application settings saved successfully"
end
@@ -450,14 +452,14 @@ RSpec.describe 'Admin updates settings' do
visit reporting_admin_application_settings_path
page.within('.as-spam') do
- fill_in 'reCAPTCHA Site Key', with: 'key'
- fill_in 'reCAPTCHA Private Key', with: 'key'
+ fill_in 'reCAPTCHA site key', with: 'key'
+ fill_in 'reCAPTCHA private key', with: 'key'
check 'Enable reCAPTCHA'
check 'Enable reCAPTCHA for login'
- fill_in 'IPs per user', with: 15
+ fill_in 'IP addresses per user', with: 15
check 'Enable Spam Check via external API endpoint'
fill_in 'URL of the external Spam Check endpoint', with: 'grpc://www.example.com/spamcheck'
- fill_in 'Spam Check API Key', with: 'SPAM_CHECK_API_KEY'
+ fill_in 'Spam Check API key', with: 'SPAM_CHECK_API_KEY'
click_button 'Save changes'
end
@@ -602,18 +604,54 @@ RSpec.describe 'Admin updates settings' do
expect(current_settings.issues_create_limit).to eq(0)
end
- it 'changes Files API rate limits settings' do
- visit network_admin_application_settings_path
+ shared_examples 'regular throttle rate limit settings' do
+ it 'changes rate limit settings' do
+ visit network_admin_application_settings_path
- page.within('[data-testid="files-limits-settings"]') do
- check 'Enable unauthenticated API request rate limit'
- fill_in 'Max unauthenticated API requests per period per IP', with: 10
- click_button 'Save changes'
+ page.within(".#{selector}") do
+ check 'Enable unauthenticated API request rate limit'
+ fill_in 'Maximum unauthenticated API requests per rate limit period per IP', with: 12
+ fill_in 'Unauthenticated API rate limit period in seconds', with: 34
+
+ check 'Enable authenticated API request rate limit'
+ fill_in 'Maximum authenticated API requests per rate limit period per user', with: 56
+ fill_in 'Authenticated API rate limit period in seconds', with: 78
+
+ click_button 'Save changes'
+ end
+
+ expect(page).to have_content "Application settings saved successfully"
+
+ expect(current_settings).to have_attributes(
+ "throttle_unauthenticated_#{fragment}_enabled" => true,
+ "throttle_unauthenticated_#{fragment}_requests_per_period" => 12,
+ "throttle_unauthenticated_#{fragment}_period_in_seconds" => 34,
+ "throttle_authenticated_#{fragment}_enabled" => true,
+ "throttle_authenticated_#{fragment}_requests_per_period" => 56,
+ "throttle_authenticated_#{fragment}_period_in_seconds" => 78
+ )
end
+ end
- expect(page).to have_content "Application settings saved successfully"
- expect(current_settings.throttle_unauthenticated_files_api_enabled).to be true
- expect(current_settings.throttle_unauthenticated_files_api_requests_per_period).to eq(10)
+ context 'Package Registry API rate limits' do
+ let(:selector) { 'as-packages-limits' }
+ let(:fragment) { :packages_api }
+
+ include_examples 'regular throttle rate limit settings'
+ end
+
+ context 'Files API rate limits' do
+ let(:selector) { 'as-files-limits' }
+ let(:fragment) { :files_api }
+
+ include_examples 'regular throttle rate limit settings'
+ end
+
+ context 'Deprecated API rate limits' do
+ let(:selector) { 'as-deprecated-limits' }
+ let(:fragment) { :deprecated_api }
+
+ include_examples 'regular throttle rate limit settings'
end
end
@@ -623,8 +661,6 @@ RSpec.describe 'Admin updates settings' do
end
it 'change Help page' do
- stub_feature_flags(help_page_documentation_redirect: true)
-
new_support_url = 'http://example.com/help'
new_documentation_url = 'https://docs.gitlab.com'
diff --git a/spec/features/boards/new_issue_spec.rb b/spec/features/boards/new_issue_spec.rb
index e055e8092d4..f88d31bda88 100644
--- a/spec/features/boards/new_issue_spec.rb
+++ b/spec/features/boards/new_issue_spec.rb
@@ -56,7 +56,7 @@ RSpec.describe 'Issue Boards new issue', :js do
end
end
- it 'creates new issue' do
+ it 'creates new issue and opens sidebar' do
page.within(first('.board')) do
click_button 'New issue'
end
@@ -68,7 +68,7 @@ RSpec.describe 'Issue Boards new issue', :js do
wait_for_requests
- page.within(first('.board .issue-count-badge-count')) do
+ page.within(first('.board [data-testid="issue-count-badge"]')) do
expect(page).to have_content('1')
end
@@ -78,20 +78,6 @@ RSpec.describe 'Issue Boards new issue', :js do
expect(page).to have_content(issue.to_reference)
expect(page).to have_link(issue.title, href: /#{issue_path(issue)}/)
end
- end
-
- # TODO https://gitlab.com/gitlab-org/gitlab/-/issues/323446
- xit 'shows sidebar when creating new issue' do
- page.within(first('.board')) do
- click_button 'New issue'
- end
-
- page.within(first('.board-new-issue-form')) do
- find('.form-control').set('bug')
- click_button 'Create issue'
- end
-
- wait_for_requests
expect(page).to have_selector('[data-testid="issue-boards-sidebar"]')
end
@@ -108,10 +94,6 @@ RSpec.describe 'Issue Boards new issue', :js do
wait_for_requests
- page.within(first('.board')) do
- find('.board-card').click
- end
-
page.within('[data-testid="sidebar-labels"]') do
click_button 'Edit'
diff --git a/spec/features/boards/reload_boards_on_browser_back_spec.rb b/spec/features/boards/reload_boards_on_browser_back_spec.rb
index 36682036d48..6a09e3c9506 100644
--- a/spec/features/boards/reload_boards_on_browser_back_spec.rb
+++ b/spec/features/boards/reload_boards_on_browser_back_spec.rb
@@ -16,7 +16,7 @@ RSpec.describe 'Ensure Boards do not show stale data on browser back', :js do
visit project_board_path(project, board)
wait_for_requests
- page.within(first('.board .issue-count-badge-count')) do
+ page.within(first('.board [data-testid="issue-count-badge"]')) do
expect(page).to have_content('0')
end
end
@@ -35,7 +35,7 @@ RSpec.describe 'Ensure Boards do not show stale data on browser back', :js do
page.go_back
wait_for_requests
- page.within(first('.board .issue-count-badge-count')) do
+ page.within(first('.board [data-testid="issue-count-badge"]')) do
expect(page).to have_content('1')
end
diff --git a/spec/features/boards/sidebar_labels_spec.rb b/spec/features/boards/sidebar_labels_spec.rb
index fa16f47f69a..511233b50c0 100644
--- a/spec/features/boards/sidebar_labels_spec.rb
+++ b/spec/features/boards/sidebar_labels_spec.rb
@@ -29,12 +29,11 @@ RSpec.describe 'Project issue boards sidebar labels', :js do
end
context 'labels' do
- # https://gitlab.com/gitlab-org/gitlab/-/issues/322725
- xit 'shows current labels when editing' do
+ it 'shows current labels when editing' do
click_card(card)
page.within('.labels') do
- click_link 'Edit'
+ click_button 'Edit'
wait_for_requests
@@ -54,9 +53,9 @@ RSpec.describe 'Project issue boards sidebar labels', :js do
wait_for_requests
- click_link bug.title
+ click_on bug.title
- find('[data-testid="close-icon"]').click
+ click_button 'Close'
wait_for_requests
@@ -79,11 +78,11 @@ RSpec.describe 'Project issue boards sidebar labels', :js do
wait_for_requests
- click_link bug.title
+ click_on bug.title
- click_link regression.title
+ click_on regression.title
- find('[data-testid="close-icon"]').click
+ click_button 'Close'
wait_for_requests
@@ -108,9 +107,9 @@ RSpec.describe 'Project issue boards sidebar labels', :js do
wait_for_requests
- click_link stretch.title
+ click_button stretch.title
- find('[data-testid="close-icon"]').click
+ click_button 'Close'
wait_for_requests
@@ -125,43 +124,22 @@ RSpec.describe 'Project issue boards sidebar labels', :js do
expect(card).not_to have_content(stretch.title)
end
- # https://gitlab.com/gitlab-org/gitlab/-/issues/324290
- xit 'creates project label' do
+ it 'creates project label' do
click_card(card)
page.within('.labels') do
- click_link 'Edit'
+ click_button 'Edit'
wait_for_requests
- click_link 'Create project label'
- fill_in 'new_label_name', with: 'test label'
+ click_on 'Create project label'
+ fill_in 'Name new label', with: 'test label'
first('.suggest-colors-dropdown a').click
click_button 'Create'
wait_for_requests
- expect(page).to have_link 'test label'
+ expect(page).to have_button 'test label'
end
expect(page).to have_selector('.board', count: 3)
end
-
- # https://gitlab.com/gitlab-org/gitlab/-/issues/324290
- xit 'creates project label and list' do
- click_card(card)
-
- page.within('.labels') do
- click_link 'Edit'
- wait_for_requests
-
- click_link 'Create project label'
- fill_in 'new_label_name', with: 'test label'
- first('.suggest-colors-dropdown a').click
- first('.js-add-list').click
- click_button 'Create'
- wait_for_requests
-
- expect(page).to have_link 'test label'
- end
- expect(page).to have_selector('.board', count: 4)
- end
end
end
diff --git a/spec/features/clusters/cluster_detail_page_spec.rb b/spec/features/clusters/cluster_detail_page_spec.rb
index cba8aaef1ef..06e3e00db7d 100644
--- a/spec/features/clusters/cluster_detail_page_spec.rb
+++ b/spec/features/clusters/cluster_detail_page_spec.rb
@@ -34,7 +34,7 @@ RSpec.describe 'Clusterable > Show page' do
it 'does not show the environments tab' do
visit cluster_path
- expect(page).not_to have_selector('.js-cluster-nav-environments', text: 'Environments')
+ expect(page).not_to have_selector('[data-testid="cluster-environments-tab"]')
end
end
diff --git a/spec/features/cycle_analytics_spec.rb b/spec/features/cycle_analytics_spec.rb
index bec474f6cfe..34a55118cb3 100644
--- a/spec/features/cycle_analytics_spec.rb
+++ b/spec/features/cycle_analytics_spec.rb
@@ -7,10 +7,13 @@ RSpec.describe 'Value Stream Analytics', :js do
let_it_be(:guest) { create(:user) }
let_it_be(:stage_table_selector) { '[data-testid="vsa-stage-table"]' }
let_it_be(:stage_table_event_selector) { '[data-testid="vsa-stage-event"]' }
+ let_it_be(:stage_table_event_title_selector) { '[data-testid="vsa-stage-event-title"]' }
+ let_it_be(:stage_table_pagination_selector) { '[data-testid="vsa-stage-pagination"]' }
+ let_it_be(:stage_table_duration_column_header_selector) { '[data-testid="vsa-stage-header-duration"]' }
let_it_be(:metrics_selector) { "[data-testid='vsa-time-metrics']" }
let_it_be(:metric_value_selector) { "[data-testid='displayValue']" }
- let(:stage_table) { page.find(stage_table_selector) }
+ let(:stage_table) { find(stage_table_selector) }
let(:project) { create(:project, :repository) }
let(:issue) { create(:issue, project: project, created_at: 2.days.ago) }
let(:milestone) { create(:milestone, project: project) }
@@ -53,6 +56,7 @@ RSpec.describe 'Value Stream Analytics', :js do
# So setting the date range to be the last 2 days should skip past the existing data
from = 2.days.ago.strftime("%Y-%m-%d")
to = 1.day.ago.strftime("%Y-%m-%d")
+ max_items_per_page = 20
around do |example|
travel_to(5.days.ago) { example.run }
@@ -60,9 +64,8 @@ RSpec.describe 'Value Stream Analytics', :js do
before do
project.add_maintainer(user)
- create_list(:issue, 2, project: project, created_at: 2.weeks.ago, milestone: milestone)
-
create_cycle(user, project, issue, mr, milestone, pipeline)
+ create_list(:issue, max_items_per_page, project: project, created_at: 2.weeks.ago, milestone: milestone)
deploy_master(user, project)
issue.metrics.update!(first_mentioned_in_commit_at: issue.metrics.first_associated_with_milestone_at + 1.hour)
@@ -81,6 +84,8 @@ RSpec.describe 'Value Stream Analytics', :js do
wait_for_requests
end
+ let(:stage_table_events) { stage_table.all(stage_table_event_selector) }
+
it 'displays metrics' do
metrics_tiles = page.find(metrics_selector)
@@ -112,20 +117,62 @@ RSpec.describe 'Value Stream Analytics', :js do
end
it 'can filter the issues by date' do
- expect(stage_table.all(stage_table_event_selector).length).to eq(3)
+ expect(page).to have_selector(stage_table_event_selector)
set_daterange(from, to)
- expect(stage_table.all(stage_table_event_selector).length).to eq(0)
+ expect(page).not_to have_selector(stage_table_event_selector)
+ expect(page).not_to have_selector(stage_table_pagination_selector)
end
it 'can filter the metrics by date' do
- expect(metrics_values).to eq(["3.0", "2.0", "1.0", "0.0"])
+ expect(metrics_values).to match_array(["21.0", "2.0", "1.0", "0.0"])
set_daterange(from, to)
expect(metrics_values).to eq(['-'] * 4)
end
+
+ it 'can sort records' do
+ # NOTE: checking that the string changes should suffice
+ # depending on the order the tests are run we might run into problems with hard coded strings
+ original_first_title = first_stage_title
+ stage_time_column.click
+
+ expect_to_be_sorted "descending"
+ expect(first_stage_title).not_to have_text(original_first_title, exact: true)
+
+ stage_time_column.click
+
+ expect_to_be_sorted "ascending"
+ expect(first_stage_title).to have_text(original_first_title, exact: true)
+ end
+
+ it 'paginates the results' do
+ original_first_title = first_stage_title
+
+ expect(page).to have_selector(stage_table_pagination_selector)
+
+ go_to_next_page
+
+ expect(page).not_to have_text(original_first_title, exact: true)
+ end
+
+ def stage_time_column
+ stage_table.find(stage_table_duration_column_header_selector).ancestor("th")
+ end
+
+ def first_stage_title
+ stage_table.all(stage_table_event_title_selector).first.text
+ end
+
+ def expect_to_be_sorted(direction)
+ expect(stage_time_column['aria-sort']).to eq(direction)
+ end
+
+ def go_to_next_page
+ page.find(stage_table_pagination_selector).find_link("Next").click
+ end
end
end
diff --git a/spec/features/dashboard/activity_spec.rb b/spec/features/dashboard/activity_spec.rb
index e75e661b513..7390edc3c47 100644
--- a/spec/features/dashboard/activity_spec.rb
+++ b/spec/features/dashboard/activity_spec.rb
@@ -13,19 +13,19 @@ RSpec.describe 'Dashboard > Activity' do
it 'shows Your Projects' do
visit activity_dashboard_path
- expect(find('.top-area .nav-tabs li.active')).to have_content('Your projects')
+ expect(find('[data-testid="dashboard-activity-tabs"] a.active')).to have_content('Your projects')
end
it 'shows Starred Projects' do
visit activity_dashboard_path(filter: 'starred')
- expect(find('.top-area .nav-tabs li.active')).to have_content('Starred projects')
+ expect(find('[data-testid="dashboard-activity-tabs"] a.active')).to have_content('Starred projects')
end
it 'shows Followed Projects' do
visit activity_dashboard_path(filter: 'followed')
- expect(find('.top-area .nav-tabs li.active')).to have_content('Followed users')
+ expect(find('[data-testid="dashboard-activity-tabs"] a.active')).to have_content('Followed users')
end
end
diff --git a/spec/features/dashboard/issuables_counter_spec.rb b/spec/features/dashboard/issuables_counter_spec.rb
index d4c6b6faa79..8e938fef155 100644
--- a/spec/features/dashboard/issuables_counter_spec.rb
+++ b/spec/features/dashboard/issuables_counter_spec.rb
@@ -55,7 +55,7 @@ RSpec.describe 'Navigation bar counter', :use_clean_rails_memory_store_caching d
end
def expect_counters(issuable_type, count)
- dashboard_count = find('.nav-links li.active')
+ dashboard_count = find('.gl-tabs-nav li a.active')
nav_count = find(".dashboard-shortcuts-#{issuable_type}")
header_count = find(".header-content .#{issuable_type.tr('_', '-')}-count")
diff --git a/spec/features/groups/board_spec.rb b/spec/features/groups/board_spec.rb
index afe36dabcb5..aece6d790b5 100644
--- a/spec/features/groups/board_spec.rb
+++ b/spec/features/groups/board_spec.rb
@@ -24,7 +24,7 @@ RSpec.describe 'Group Boards' do
it 'adds an issue to the backlog' do
page.within(find('.board', match: :first)) do
issue_title = 'New Issue'
- find(:css, '.issue-count-badge-add-button').click
+ click_button 'New issue'
wait_for_requests
diff --git a/spec/features/groups/container_registry_spec.rb b/spec/features/groups/container_registry_spec.rb
index 65374263f45..098559dc3f8 100644
--- a/spec/features/groups/container_registry_spec.rb
+++ b/spec/features/groups/container_registry_spec.rb
@@ -16,6 +16,7 @@ RSpec.describe 'Container Registry', :js do
sign_in(user)
stub_container_registry_config(enabled: true)
stub_container_registry_tags(repository: :any, tags: [])
+ stub_container_registry_info
end
it 'has a page title set' do
@@ -57,6 +58,16 @@ RSpec.describe 'Container Registry', :js do
expect(page).to have_content 'latest'
end
+ [ContainerRegistry::Path::InvalidRegistryPathError, Faraday::Error].each do |error_class|
+ context "when there is a #{error_class}" do
+ before do
+ expect(::ContainerRegistry::Client).to receive(:registry_info).and_raise(error_class, nil, nil)
+ end
+
+ it_behaves_like 'handling feature network errors with the container registry'
+ end
+ end
+
describe 'image repo details' do
before do
visit_container_registry_details 'my/image'
@@ -81,6 +92,7 @@ RSpec.describe 'Container Registry', :js do
expect(service).to receive(:execute).with(container_repository) { { status: :success } }
expect(Projects::ContainerRepository::DeleteTagsService).to receive(:new).with(container_repository.project, user, tags: ['latest']) { service }
+ first('[data-testid="additional-actions"]').click
first('[data-testid="single-delete-button"]').click
expect(find('.modal .modal-title')).to have_content _('Remove tag')
find('.modal .modal-footer .btn-danger').click
diff --git a/spec/features/groups/dependency_proxy_for_containers_spec.rb b/spec/features/groups/dependency_proxy_for_containers_spec.rb
new file mode 100644
index 00000000000..a4cd6d0f503
--- /dev/null
+++ b/spec/features/groups/dependency_proxy_for_containers_spec.rb
@@ -0,0 +1,108 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe 'Group Dependency Proxy for containers', :js do
+ include DependencyProxyHelpers
+
+ include_context 'file upload requests helpers'
+
+ let_it_be(:user) { create(:user) }
+ let_it_be(:group) { create(:group) }
+ let_it_be(:sha) { 'a3ed95caeb02ffe68cdd9fd84406680ae93d633cb16422d00e8a7c22955b46d4' }
+ let_it_be(:content) { fixture_file_upload("spec/fixtures/dependency_proxy/#{sha}.gz").read }
+
+ let(:image) { 'alpine' }
+ let(:url) { capybara_url("/v2/#{group.full_path}/dependency_proxy/containers/#{image}/blobs/sha256:#{sha}") }
+ let(:token) { 'token' }
+ let(:headers) { { 'Authorization' => "Bearer #{build_jwt(user).encoded}" } }
+
+ subject do
+ HTTParty.get(url, headers: headers)
+ end
+
+ def run_server(handler)
+ default_server = Capybara.server
+
+ Capybara.server = Capybara.servers[:puma]
+ server = Capybara::Server.new(handler)
+ server.boot
+ server
+ ensure
+ Capybara.server = default_server
+ end
+
+ let_it_be(:external_server) do
+ handler = lambda do |env|
+ if env['REQUEST_PATH'] == '/token'
+ [200, {}, [{ token: 'token' }.to_json]]
+ else
+ [200, {}, [content]]
+ end
+ end
+
+ run_server(handler)
+ end
+
+ before do
+ stub_application_setting(allow_local_requests_from_web_hooks_and_services: true)
+ stub_config(dependency_proxy: { enabled: true })
+ group.add_developer(user)
+
+ stub_const("DependencyProxy::Registry::AUTH_URL", external_server.base_url)
+ stub_const("DependencyProxy::Registry::LIBRARY_URL", external_server.base_url)
+ end
+
+ shared_examples 'responds with the file' do
+ it 'sends file' do
+ expect(subject.code).to eq(200)
+ expect(subject.body).to eq(content)
+ expect(subject.headers.to_h).to include(
+ "content-type" => ["application/gzip"],
+ "content-disposition" => ["attachment; filename=\"#{sha}.gz\"; filename*=UTF-8''#{sha}.gz"],
+ "content-length" => ["32"]
+ )
+ end
+ end
+
+ shared_examples 'caches the file' do
+ it 'caches the file' do
+ expect { subject }.to change {
+ group.dependency_proxy_blobs.count
+ }.from(0).to(1)
+
+ expect(subject.code).to eq(200)
+ expect(group.dependency_proxy_blobs.first.file.read).to eq(content)
+ end
+ end
+
+ context 'fetching a blob' do
+ context 'when the blob is cached for the group' do
+ let!(:dependency_proxy_blob) { create(:dependency_proxy_blob, group: group) }
+
+ it_behaves_like 'responds with the file'
+
+ context 'dependency_proxy_workhorse feature flag disabled' do
+ before do
+ stub_feature_flags({ dependency_proxy_workhorse: false })
+ end
+
+ it_behaves_like 'responds with the file'
+ end
+ end
+ end
+
+ context 'when the blob must be downloaded' do
+ it_behaves_like 'responds with the file'
+ it_behaves_like 'caches the file'
+
+ context 'dependency_proxy_workhorse feature flag disabled' do
+ before do
+ stub_feature_flags({ dependency_proxy_workhorse: false })
+ end
+
+ it_behaves_like 'responds with the file'
+ it_behaves_like 'caches the file'
+ end
+ end
+end
diff --git a/spec/features/groups/dependency_proxy_spec.rb b/spec/features/groups/dependency_proxy_spec.rb
index 51371ddc532..d6b0bdc8ea4 100644
--- a/spec/features/groups/dependency_proxy_spec.rb
+++ b/spec/features/groups/dependency_proxy_spec.rb
@@ -3,13 +3,14 @@
require 'spec_helper'
RSpec.describe 'Group Dependency Proxy' do
- let(:developer) { create(:user) }
+ let(:owner) { create(:user) }
let(:reporter) { create(:user) }
let(:group) { create(:group) }
let(:path) { group_dependency_proxy_path(group) }
+ let(:settings_path) { group_settings_packages_and_registries_path(group) }
before do
- group.add_developer(developer)
+ group.add_owner(owner)
group.add_reporter(reporter)
enable_feature
@@ -22,42 +23,46 @@ RSpec.describe 'Group Dependency Proxy' do
visit path
- expect(page).not_to have_css('.js-dependency-proxy-toggle-area')
- expect(page).not_to have_css('.js-dependency-proxy-url')
+ expect(page).not_to have_css('[data-testid="proxy-url"]')
end
end
context 'feature is available', :js do
- context 'when logged in as group developer' do
+ context 'when logged in as group owner' do
before do
- sign_in(developer)
- visit path
+ sign_in(owner)
end
it 'sidebar menu is open' do
+ visit path
+
sidebar = find('.nav-sidebar')
expect(sidebar).to have_link _('Dependency Proxy')
end
it 'toggles defaults to enabled' do
- page.within('.js-dependency-proxy-toggle-area') do
- expect(find('.js-project-feature-toggle-input', visible: false).value).to eq('true')
- end
+ visit path
+
+ expect(page).to have_css('[data-testid="proxy-url"]')
end
it 'shows the proxy URL' do
- page.within('.edit_dependency_proxy_group_setting') do
- expect(find('.js-dependency-proxy-url').value).to have_content('/dependency_proxy/containers')
- end
+ visit path
+
+ expect(find('input[data-testid="proxy-url"]').value).to have_content('/dependency_proxy/containers')
end
it 'hides the proxy URL when feature is disabled' do
- page.within('.edit_dependency_proxy_group_setting') do
- find('.js-project-feature-toggle').click
- end
+ visit settings_path
+ wait_for_requests
+
+ click_button 'Enable Proxy'
+
+ expect(page).to have_button 'Enable Proxy', class: '!is-checked'
+
+ visit path
- expect(page).not_to have_css('.js-dependency-proxy-url')
- expect(find('.js-project-feature-toggle-input', visible: false).value).to eq('false')
+ expect(page).not_to have_css('input[data-testid="proxy-url"]')
end
end
@@ -68,18 +73,17 @@ RSpec.describe 'Group Dependency Proxy' do
end
it 'does not show the feature toggle but shows the proxy URL' do
- expect(page).not_to have_css('.js-dependency-proxy-toggle-area')
- expect(find('.js-dependency-proxy-url').value).to have_content('/dependency_proxy/containers')
+ expect(find('input[data-testid="proxy-url"]').value).to have_content('/dependency_proxy/containers')
end
end
end
context 'feature is not avaible' do
before do
- sign_in(developer)
+ sign_in(owner)
end
- context 'feature flag is disabled' do
+ context 'feature flag is disabled', :js do
before do
stub_feature_flags(dependency_proxy_for_private_groups: false)
end
@@ -90,7 +94,7 @@ RSpec.describe 'Group Dependency Proxy' do
it 'informs user that feature is only available for public groups' do
visit path
- expect(page).to have_content('Dependency proxy feature is limited to public groups for now.')
+ expect(page).to have_content('Dependency Proxy feature is limited to public groups for now.')
end
end
end
diff --git a/spec/features/groups/import_export/connect_instance_spec.rb b/spec/features/groups/import_export/connect_instance_spec.rb
index cf893e444c4..552b599a3f3 100644
--- a/spec/features/groups/import_export/connect_instance_spec.rb
+++ b/spec/features/groups/import_export/connect_instance_spec.rb
@@ -19,34 +19,12 @@ RSpec.describe 'Import/Export - Connect to another instance', :js do
end
context 'when the user provides valid credentials' do
+ source_url = 'https://gitlab.com'
+
+ include_context 'bulk imports requests context', source_url
+
it 'successfully connects to remote instance' do
- source_url = 'https://gitlab.com'
pat = 'demo-pat'
- stub_path = 'stub-group'
- total = 37
-
- stub_request(:get, "%{url}/api/v4/groups?page=1&per_page=20&top_level_only=true&min_access_level=50&search=" % { url: source_url }).to_return(
- body: [{
- id: 2595438,
- web_url: 'https://gitlab.com/groups/auto-breakfast',
- name: 'Stub',
- path: stub_path,
- full_name: 'Stub',
- full_path: stub_path
- }].to_json,
- headers: {
- 'Content-Type' => 'application/json',
- 'X-Next-Page' => 2,
- 'X-Page' => 1,
- 'X-Per-Page' => 20,
- 'X-Total' => total,
- 'X-Total-Pages' => 2
- }
- )
-
- allow_next_instance_of(BulkImports::Clients::HTTP) do |client|
- allow(client).to receive(:validate_instance_version!).and_return(true)
- end
expect(page).to have_content 'Import groups from another instance of GitLab'
expect(page).to have_content 'Not all related objects are migrated'
@@ -56,8 +34,8 @@ RSpec.describe 'Import/Export - Connect to another instance', :js do
click_on 'Connect instance'
- expect(page).to have_content 'Showing 1-1 of %{total} groups from %{url}' % { url: source_url, total: total }
- expect(page).to have_content stub_path
+ expect(page).to have_content 'Showing 1-1 of 42 groups from %{url}' % { url: source_url }
+ expect(page).to have_content 'stub-group'
visit '/'
diff --git a/spec/features/groups/import_export/migration_history_spec.rb b/spec/features/groups/import_export/migration_history_spec.rb
new file mode 100644
index 00000000000..243bdcc13a9
--- /dev/null
+++ b/spec/features/groups/import_export/migration_history_spec.rb
@@ -0,0 +1,30 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe 'Import/Export - GitLab migration history', :js do
+ let_it_be(:user) { create(:user) }
+
+ let_it_be(:user_import_1) { create(:bulk_import, user: user) }
+ let_it_be(:finished_entity_1) { create(:bulk_import_entity, :finished, bulk_import: user_import_1) }
+
+ let_it_be(:user_import_2) { create(:bulk_import, user: user) }
+ let_it_be(:failed_entity_2) { create(:bulk_import_entity, :failed, bulk_import: user_import_2) }
+
+ before do
+ gitlab_sign_in(user)
+
+ visit new_group_path
+
+ click_link 'Import group'
+ end
+
+ it 'successfully displays import history' do
+ click_link 'History'
+
+ wait_for_requests
+
+ expect(page).to have_content 'Group import history'
+ expect(page.find('tbody')).to have_css('tr', count: 2)
+ end
+end
diff --git a/spec/features/groups/members/manage_groups_spec.rb b/spec/features/groups/members/manage_groups_spec.rb
index 2dfcd941b4f..d822a5ea871 100644
--- a/spec/features/groups/members/manage_groups_spec.rb
+++ b/spec/features/groups/members/manage_groups_spec.rb
@@ -63,6 +63,7 @@ RSpec.describe 'Groups > Members > Manage groups', :js do
context 'when group link exists' do
let_it_be(:shared_with_group) { create(:group) }
let_it_be(:shared_group) { create(:group) }
+ let_it_be(:expiration_date) { 5.days.from_now.to_date }
let(:additional_link_attrs) { {} }
@@ -115,29 +116,29 @@ RSpec.describe 'Groups > Members > Manage groups', :js do
click_groups_tab
page.within first_row do
- fill_in 'Expiration date', with: 5.days.from_now.to_date
+ fill_in 'Expiration date', with: expiration_date
find_field('Expiration date').native.send_keys :enter
wait_for_requests
- expect(page).to have_content(/in \d days/)
+ expect(page).to have_field('Expiration date', with: expiration_date)
end
end
context 'when expiry date is set' do
- let(:additional_link_attrs) { { expires_at: 5.days.from_now.to_date } }
+ let(:additional_link_attrs) { { expires_at: expiration_date } }
it 'clears expiry date' do
click_groups_tab
page.within first_row do
- expect(page).to have_content(/in \d days/)
+ expect(page).to have_field('Expiration date', with: expiration_date)
find('[data-testid="clear-button"]').click
wait_for_requests
- expect(page).to have_content('No expiration set')
+ expect(page).to have_field('Expiration date', with: '')
end
end
end
diff --git a/spec/features/groups/members/master_adds_member_with_expiration_date_spec.rb b/spec/features/groups/members/master_adds_member_with_expiration_date_spec.rb
index ddf3c6d8f9b..86185b8dd32 100644
--- a/spec/features/groups/members/master_adds_member_with_expiration_date_spec.rb
+++ b/spec/features/groups/members/master_adds_member_with_expiration_date_spec.rb
@@ -8,6 +8,7 @@ RSpec.describe 'Groups > Members > Owner adds member with expiration date', :js
let_it_be(:user1) { create(:user, name: 'John Doe') }
let_it_be(:group) { create(:group) }
+ let_it_be(:expiration_date) { 5.days.from_now.to_date }
let(:new_member) { create(:user, name: 'Mary Jane') }
@@ -19,10 +20,10 @@ RSpec.describe 'Groups > Members > Owner adds member with expiration date', :js
it 'expiration date is displayed in the members list' do
visit group_group_members_path(group)
- invite_member(new_member.name, role: 'Guest', expires_at: 5.days.from_now.to_date)
+ invite_member(new_member.name, role: 'Guest', expires_at: expiration_date)
page.within second_row do
- expect(page).to have_content(/in \d days/)
+ expect(page).to have_field('Expiration date', with: expiration_date)
end
end
@@ -31,27 +32,27 @@ RSpec.describe 'Groups > Members > Owner adds member with expiration date', :js
visit group_group_members_path(group)
page.within second_row do
- fill_in 'Expiration date', with: 5.days.from_now.to_date
+ fill_in 'Expiration date', with: expiration_date
find_field('Expiration date').native.send_keys :enter
wait_for_requests
- expect(page).to have_content(/in \d days/)
+ expect(page).to have_field('Expiration date', with: expiration_date)
end
end
it 'clears expiration date' do
- create(:group_member, :developer, user: new_member, group: group, expires_at: 5.days.from_now.to_date)
+ create(:group_member, :developer, user: new_member, group: group, expires_at: expiration_date)
visit group_group_members_path(group)
page.within second_row do
- expect(page).to have_content(/in \d days/)
+ expect(page).to have_field('Expiration date', with: expiration_date)
find('[data-testid="clear-button"]').click
wait_for_requests
- expect(page).to have_content('No expiration set')
+ expect(page).to have_field('Expiration date', with: '')
end
end
end
diff --git a/spec/features/groups/milestone_spec.rb b/spec/features/groups/milestone_spec.rb
index c51ee250331..4edf27e8fa4 100644
--- a/spec/features/groups/milestone_spec.rb
+++ b/spec/features/groups/milestone_spec.rb
@@ -98,9 +98,11 @@ RSpec.describe 'Group milestones' do
end
it 'counts milestones correctly' do
- expect(find('.top-area .active .badge').text).to eq("3")
- expect(find('.top-area .closed .badge').text).to eq("3")
- expect(find('.top-area .all .badge').text).to eq("6")
+ page.within '[data-testid="milestones-filter"]' do
+ expect(page).to have_content('Open 3')
+ expect(page).to have_content('Closed 3')
+ expect(page).to have_content('All 6')
+ end
end
it 'lists group and project milestones' do
diff --git a/spec/features/groups/packages_spec.rb b/spec/features/groups/packages_spec.rb
index 3c2ade6b274..0dfc7180187 100644
--- a/spec/features/groups/packages_spec.rb
+++ b/spec/features/groups/packages_spec.rb
@@ -28,6 +28,10 @@ RSpec.describe 'Group Packages' do
context 'when feature is available', :js do
before do
+ # we are simply setting the featrure flag to false because the new UI has nothing to test yet
+ # when the refactor is complete or almost complete we will turn on the feature tests
+ # see https://gitlab.com/gitlab-org/gitlab/-/issues/330846 for status of this work
+ stub_feature_flags(package_list_apollo: false)
visit_group_packages
end
diff --git a/spec/features/issues/related_issues_spec.rb b/spec/features/issues/related_issues_spec.rb
index 837859bbe26..a95229d4f1b 100644
--- a/spec/features/issues/related_issues_spec.rb
+++ b/spec/features/issues/related_issues_spec.rb
@@ -41,13 +41,13 @@ RSpec.describe 'Related issues', :js do
visit project_issue_path(project, issue)
expect(page).to have_css('.related-issues-block')
- expect(page).not_to have_selector('.js-issue-count-badge-add-button')
+ expect(page).not_to have_button 'Add a related issue'
end
end
context 'when logged in but not a member' do
before do
- gitlab_sign_in(user)
+ sign_in(user)
end
it 'shows widget when internal project' do
@@ -57,7 +57,7 @@ RSpec.describe 'Related issues', :js do
visit project_issue_path(project, issue)
expect(page).to have_css('.related-issues-block')
- expect(page).not_to have_selector('.js-issue-count-badge-add-button')
+ expect(page).not_to have_button 'Add a related issue'
end
it 'does not show widget when private project' do
@@ -76,7 +76,7 @@ RSpec.describe 'Related issues', :js do
visit project_issue_path(project, issue)
expect(page).to have_css('.related-issues-block')
- expect(page).not_to have_selector('.js-issue-count-badge-add-button')
+ expect(page).not_to have_button 'Add a related issue'
end
it 'shows widget on their own public issue' do
@@ -86,13 +86,13 @@ RSpec.describe 'Related issues', :js do
visit project_issue_path(project, issue)
expect(page).to have_css('.related-issues-block')
- expect(page).not_to have_selector('.js-issue-count-badge-add-button')
+ expect(page).not_to have_button 'Add a related issue'
end
end
context 'when logged in and a guest' do
before do
- gitlab_sign_in(user)
+ sign_in(user)
end
it 'shows widget when internal project' do
@@ -103,7 +103,7 @@ RSpec.describe 'Related issues', :js do
visit project_issue_path(project, issue)
expect(page).to have_css('.related-issues-block')
- expect(page).not_to have_selector('.js-issue-count-badge-add-button')
+ expect(page).not_to have_button 'Add a related issue'
end
it 'shows widget when private project' do
@@ -114,7 +114,7 @@ RSpec.describe 'Related issues', :js do
visit project_issue_path(project, issue)
expect(page).to have_css('.related-issues-block')
- expect(page).not_to have_selector('.js-issue-count-badge-add-button')
+ expect(page).not_to have_button 'Add a related issue'
end
it 'shows widget when public project' do
@@ -125,13 +125,13 @@ RSpec.describe 'Related issues', :js do
visit project_issue_path(project, issue)
expect(page).to have_css('.related-issues-block')
- expect(page).not_to have_selector('.js-issue-count-badge-add-button')
+ expect(page).not_to have_button 'Add a related issue'
end
end
context 'when logged in and a reporter' do
before do
- gitlab_sign_in(user)
+ sign_in(user)
end
it 'shows widget when internal project' do
@@ -142,7 +142,7 @@ RSpec.describe 'Related issues', :js do
visit project_issue_path(project, issue)
expect(page).to have_css('.related-issues-block')
- expect(page).to have_selector('.js-issue-count-badge-add-button')
+ expect(page).to have_button 'Add a related issue'
end
it 'shows widget when private project' do
@@ -153,7 +153,7 @@ RSpec.describe 'Related issues', :js do
visit project_issue_path(project, issue)
expect(page).to have_css('.related-issues-block')
- expect(page).to have_selector('.js-issue-count-badge-add-button')
+ expect(page).to have_button 'Add a related issue'
end
it 'shows widget when public project' do
@@ -164,7 +164,7 @@ RSpec.describe 'Related issues', :js do
visit project_issue_path(project, issue)
expect(page).to have_css('.related-issues-block')
- expect(page).to have_selector('.js-issue-count-badge-add-button')
+ expect(page).to have_button 'Add a related issue'
end
it 'shows widget on their own public issue' do
@@ -175,7 +175,7 @@ RSpec.describe 'Related issues', :js do
visit project_issue_path(project, issue)
expect(page).to have_css('.related-issues-block')
- expect(page).to have_selector('.js-issue-count-badge-add-button')
+ expect(page).to have_button 'Add a related issue'
end
end
end
@@ -186,7 +186,7 @@ RSpec.describe 'Related issues', :js do
before do
project.add_guest(user)
- gitlab_sign_in(user)
+ sign_in(user)
end
context 'visiting some issue someone else created' do
@@ -216,7 +216,7 @@ RSpec.describe 'Related issues', :js do
before do
project.add_maintainer(user)
project_b.add_maintainer(user)
- gitlab_sign_in(user)
+ sign_in(user)
end
context 'without existing related issues' do
@@ -230,9 +230,9 @@ RSpec.describe 'Related issues', :js do
end
it 'add related issue' do
- find('.js-issue-count-badge-add-button').click
- find('.js-add-issuable-form-input').set "#{issue_b.to_reference(project)} "
- find('.js-add-issuable-form-add-button').click
+ click_button 'Add a related issue'
+ fill_in 'Paste issue link', with: "#{issue_b.to_reference(project)} "
+ click_button 'Add'
wait_for_requests
@@ -247,9 +247,9 @@ RSpec.describe 'Related issues', :js do
end
it 'add cross-project related issue' do
- find('.js-issue-count-badge-add-button').click
- find('.js-add-issuable-form-input').set "#{issue_project_b_a.to_reference(project)} "
- find('.js-add-issuable-form-add-button').click
+ click_button 'Add a related issue'
+ fill_in 'Paste issue link', with: "#{issue_project_b_a.to_reference(project)} "
+ click_button 'Add'
wait_for_requests
@@ -261,9 +261,9 @@ RSpec.describe 'Related issues', :js do
end
it 'pressing enter should submit the form' do
- find('.js-issue-count-badge-add-button').click
- find('.js-add-issuable-form-input').set "#{issue_project_b_a.to_reference(project)} "
- find('.js-add-issuable-form-input').native.send_key(:enter)
+ click_button 'Add a related issue'
+ fill_in 'Paste issue link', with: "#{issue_project_b_a.to_reference(project)} "
+ find_field('Paste issue link').native.send_key(:enter)
wait_for_requests
@@ -275,10 +275,10 @@ RSpec.describe 'Related issues', :js do
end
it 'disallows duplicate entries' do
- find('.js-issue-count-badge-add-button').click
- find('.js-add-issuable-form-input').set 'duplicate duplicate duplicate'
+ click_button 'Add a related issue'
+ fill_in 'Paste issue link', with: 'duplicate duplicate duplicate'
- items = all('.js-add-issuable-form-token-list-item')
+ items = all('.issue-token')
expect(items.count).to eq(1)
expect(items[0].text).to eq('duplicate')
@@ -288,29 +288,35 @@ RSpec.describe 'Related issues', :js do
it 'allows us to remove pending issues' do
# Tests against https://gitlab.com/gitlab-org/gitlab/issues/11625
- find('.js-issue-count-badge-add-button').click
- find('.js-add-issuable-form-input').set 'issue1 issue2 issue3 '
+ click_button 'Add a related issue'
+ fill_in 'Paste issue link', with: 'issue1 issue2 issue3 '
- items = all('.js-add-issuable-form-token-list-item')
+ items = all('.issue-token')
expect(items.count).to eq(3)
expect(items[0].text).to eq('issue1')
expect(items[1].text).to eq('issue2')
expect(items[2].text).to eq('issue3')
# Remove pending issues left to right to make sure none get stuck
- items[0].find('.js-issue-token-remove-button').click
- items = all('.js-add-issuable-form-token-list-item')
+ within items[0] do
+ click_button 'Remove'
+ end
+ items = all('.issue-token')
expect(items.count).to eq(2)
expect(items[0].text).to eq('issue2')
expect(items[1].text).to eq('issue3')
- items[0].find('.js-issue-token-remove-button').click
- items = all('.js-add-issuable-form-token-list-item')
+ within items[0] do
+ click_button 'Remove'
+ end
+ items = all('.issue-token')
expect(items.count).to eq(1)
expect(items[0].text).to eq('issue3')
- items[0].find('.js-issue-token-remove-button').click
- items = all('.js-add-issuable-form-token-list-item')
+ within items[0] do
+ click_button 'Remove'
+ end
+ items = all('.issue-token')
expect(items.count).to eq(0)
end
end
@@ -351,9 +357,9 @@ RSpec.describe 'Related issues', :js do
end
it 'add related issue' do
- find('.js-issue-count-badge-add-button').click
- find('.js-add-issuable-form-input').set "##{issue_d.iid} "
- find('.js-add-issuable-form-add-button').click
+ click_button 'Add a related issue'
+ fill_in 'Paste issue link', with: "##{issue_d.iid} "
+ click_button 'Add'
wait_for_requests
@@ -367,9 +373,9 @@ RSpec.describe 'Related issues', :js do
end
it 'add invalid related issue' do
- find('.js-issue-count-badge-add-button').click
- find('.js-add-issuable-form-input').set "#9999999 "
- find('.js-add-issuable-form-add-button').click
+ click_button 'Add a related issue'
+ fill_in 'Paste issue link', with: '#9999999 '
+ click_button 'Add'
wait_for_requests
@@ -382,9 +388,9 @@ RSpec.describe 'Related issues', :js do
end
it 'add unauthorized related issue' do
- find('.js-issue-count-badge-add-button').click
- find('.js-add-issuable-form-input').set "#{issue_project_unauthorized_a.to_reference(project)} "
- find('.js-add-issuable-form-add-button').click
+ click_button 'Add a related issue'
+ fill_in 'Paste issue link', with: "#{issue_project_unauthorized_a.to_reference(project)} "
+ click_button 'Add'
wait_for_requests
diff --git a/spec/features/markdown/copy_as_gfm_spec.rb b/spec/features/markdown/copy_as_gfm_spec.rb
index c700f878df6..d3aaf339421 100644
--- a/spec/features/markdown/copy_as_gfm_spec.rb
+++ b/spec/features/markdown/copy_as_gfm_spec.rb
@@ -201,6 +201,15 @@ RSpec.describe 'Copy as GFM', :js do
GFM
)
+ aggregate_failures('CustomEmojiFilter') do
+ gfm = ':custom_emoji:'
+
+ html = '<img class="emoji" src="custom_emoji.svg" title=":custom_emoji:" height="20" width="20">'
+
+ output_gfm = html_to_gfm(html)
+ expect(output_gfm.strip).to eq(gfm.strip)
+ end
+
aggregate_failures('MathFilter: math as transformed from HTML to KaTeX') do
gfm = '$`c = \pm\sqrt{a^2 + b^2}`$'
diff --git a/spec/features/markdown/markdown_spec.rb b/spec/features/markdown/markdown_spec.rb
index 3208ad82c03..9eff02a8c1b 100644
--- a/spec/features/markdown/markdown_spec.rb
+++ b/spec/features/markdown/markdown_spec.rb
@@ -133,8 +133,9 @@ RSpec.describe 'GitLab Markdown', :aggregate_failures do
expect(doc.at_css('td:contains("Baz")')['align']).to eq 'left'
end
+ # note that 2 are from the hardcoded <sup>, and 2 from footnotes
aggregate_failures 'permits superscript elements' do
- expect(doc).to have_selector('sup', count: 2)
+ expect(doc).to have_selector('sup', count: 4)
end
aggregate_failures 'permits subscript elements' do
@@ -148,6 +149,11 @@ RSpec.describe 'GitLab Markdown', :aggregate_failures do
aggregate_failures "removes `href` from `a` elements if it's fishy" do
expect(doc).not_to have_selector('a[href*="javascript"]')
end
+
+ aggregate_failures 'permits footnotes' do
+ expect(doc).to have_selector('section.footnotes ol li p:contains("Footnote 1")')
+ expect(doc).to have_selector('section.footnotes ol li p:contains("Footnote with w")')
+ end
end
describe 'Escaping' do
diff --git a/spec/features/merge_request/user_merges_immediately_spec.rb b/spec/features/merge_request/user_merges_immediately_spec.rb
index bca6e6ceba5..3a05f35a671 100644
--- a/spec/features/merge_request/user_merges_immediately_spec.rb
+++ b/spec/features/merge_request/user_merges_immediately_spec.rb
@@ -36,7 +36,7 @@ RSpec.describe 'Merge requests > User merges immediately', :js do
Sidekiq::Testing.fake! do
click_button 'Merge immediately'
- expect(find('.accept-merge-request.btn-confirm')).to have_content('Merge in progress')
+ expect(find('.media-body h4')).to have_content('Merging!')
wait_for_requests
end
diff --git a/spec/features/merge_request/user_resolves_conflicts_spec.rb b/spec/features/merge_request/user_resolves_conflicts_spec.rb
index 03ab42aaccd..982e75760d7 100644
--- a/spec/features/merge_request/user_resolves_conflicts_spec.rb
+++ b/spec/features/merge_request/user_resolves_conflicts_spec.rb
@@ -9,7 +9,7 @@ RSpec.describe 'Merge request > User resolves conflicts', :js do
let(:user) { project.creator }
def create_merge_request(source_branch)
- create(:merge_request, source_branch: source_branch, target_branch: 'conflict-start', source_project: project, merge_status: :unchecked) do |mr|
+ create(:merge_request, source_branch: source_branch, target_branch: 'conflict-start', source_project: project, merge_status: :unchecked, reviewers: [user]) do |mr|
mr.mark_as_unmergeable
end
end
@@ -178,6 +178,23 @@ RSpec.describe 'Merge request > User resolves conflicts', :js do
end
end
+ context 'sidebar' do
+ let(:merge_request) { create_merge_request('conflict-resolvable') }
+
+ before do
+ project.add_developer(user)
+ sign_in(user)
+
+ visit conflicts_project_merge_request_path(project, merge_request)
+ end
+
+ it 'displays reviewers' do
+ page.within '.issuable-sidebar' do
+ expect(page).to have_selector('[data-testid="reviewer"]', count: 1)
+ end
+ end
+ end
+
unresolvable_conflicts = {
'conflict-too-large' => 'when the conflicts contain a large file',
'conflict-binary-file' => 'when the conflicts contain a binary file',
diff --git a/spec/features/merge_request/user_sees_deployment_widget_spec.rb b/spec/features/merge_request/user_sees_deployment_widget_spec.rb
index 1e547d504ef..873cc0a89c6 100644
--- a/spec/features/merge_request/user_sees_deployment_widget_spec.rb
+++ b/spec/features/merge_request/user_sees_deployment_widget_spec.rb
@@ -13,6 +13,8 @@ RSpec.describe 'Merge request > User sees deployment widget', :js do
let(:sha) { project.commit(ref).id }
let(:pipeline) { create(:ci_pipeline, sha: sha, project: project, ref: ref) }
let!(:manual) { }
+ let(:build) { create(:ci_build, :with_deployment, environment: environment.name, pipeline: pipeline) }
+ let!(:deployment) { build.deployment }
before do
merge_request.update!(merge_commit_sha: sha)
@@ -21,8 +23,9 @@ RSpec.describe 'Merge request > User sees deployment widget', :js do
end
context 'when deployment succeeded' do
- let(:build) { create(:ci_build, :success, pipeline: pipeline) }
- let!(:deployment) { create(:deployment, :succeed, environment: environment, sha: sha, ref: ref, deployable: build) }
+ before do
+ build.success!
+ end
it 'displays that the environment is deployed' do
visit project_merge_request_path(project, merge_request)
@@ -34,9 +37,8 @@ RSpec.describe 'Merge request > User sees deployment widget', :js do
context 'when a user created a new merge request with the same SHA' do
let(:pipeline2) { create(:ci_pipeline, sha: sha, project: project, ref: 'video') }
- let(:build2) { create(:ci_build, :success, pipeline: pipeline2) }
let(:environment2) { create(:environment, project: project) }
- let!(:deployment2) { create(:deployment, environment: environment2, sha: sha, ref: 'video', deployable: build2) }
+ let!(:build2) { create(:ci_build, :with_deployment, :success, environment: environment2.name, pipeline: pipeline2) }
it 'displays one environment which is related to the pipeline' do
visit project_merge_request_path(project, merge_request)
@@ -50,8 +52,9 @@ RSpec.describe 'Merge request > User sees deployment widget', :js do
end
context 'when deployment failed' do
- let(:build) { create(:ci_build, :failed, pipeline: pipeline) }
- let!(:deployment) { create(:deployment, :failed, environment: environment, sha: sha, ref: ref, deployable: build) }
+ before do
+ build.drop!
+ end
it 'displays that the deployment failed' do
visit project_merge_request_path(project, merge_request)
@@ -63,8 +66,9 @@ RSpec.describe 'Merge request > User sees deployment widget', :js do
end
context 'when deployment running' do
- let(:build) { create(:ci_build, :running, pipeline: pipeline) }
- let!(:deployment) { create(:deployment, :running, environment: environment, sha: sha, ref: ref, deployable: build) }
+ before do
+ build.run!
+ end
it 'displays that the running deployment' do
visit project_merge_request_path(project, merge_request)
@@ -76,8 +80,8 @@ RSpec.describe 'Merge request > User sees deployment widget', :js do
end
context 'when deployment will happen' do
- let(:build) { create(:ci_build, :created, pipeline: pipeline) }
- let!(:deployment) { create(:deployment, environment: environment, sha: sha, ref: ref, deployable: build) }
+ let(:build) { create(:ci_build, :with_deployment, environment: environment.name, pipeline: pipeline) }
+ let!(:deployment) { build.deployment }
it 'displays that the environment name' do
visit project_merge_request_path(project, merge_request)
@@ -89,8 +93,9 @@ RSpec.describe 'Merge request > User sees deployment widget', :js do
end
context 'when deployment was cancelled' do
- let(:build) { create(:ci_build, :canceled, pipeline: pipeline) }
- let!(:deployment) { create(:deployment, :canceled, environment: environment, sha: sha, ref: ref, deployable: build) }
+ before do
+ build.cancel!
+ end
it 'displays that the environment name' do
visit project_merge_request_path(project, merge_request)
@@ -102,11 +107,10 @@ RSpec.describe 'Merge request > User sees deployment widget', :js do
end
context 'with stop action' do
- let(:build) { create(:ci_build, :success, pipeline: pipeline) }
- let!(:deployment) { create(:deployment, :succeed, environment: environment, sha: sha, ref: ref, deployable: build) }
let(:manual) { create(:ci_build, :manual, pipeline: pipeline, name: 'close_app') }
before do
+ build.success!
deployment.update!(on_stop: manual.name)
visit project_merge_request_path(project, merge_request)
wait_for_requests
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 2f7758143a1..f74b097ab3e 100644
--- a/spec/features/merge_request/user_sees_merge_widget_spec.rb
+++ b/spec/features/merge_request/user_sees_merge_widget_spec.rb
@@ -45,18 +45,12 @@ RSpec.describe 'Merge request > User sees merge widget', :js do
let!(:environment) { create(:environment, project: project) }
let(:sha) { project.commit(merge_request.source_branch).sha }
let(:pipeline) { create(:ci_pipeline, status: 'success', sha: sha, project: project, ref: merge_request.source_branch) }
- let(:build) { create(:ci_build, :success, pipeline: pipeline) }
-
- let!(:deployment) do
- create(:deployment, :succeed,
- environment: environment,
- ref: merge_request.source_branch,
- deployable: build,
- sha: sha)
- end
+ let!(:build) { create(:ci_build, :with_deployment, :success, environment: environment.name, pipeline: pipeline) }
+ let!(:deployment) { build.deployment }
before do
merge_request.update!(head_pipeline: pipeline)
+ deployment.update!(status: :success)
visit project_merge_request_path(project, merge_request)
end
diff --git a/spec/features/merge_request/user_sees_suggest_pipeline_spec.rb b/spec/features/merge_request/user_sees_suggest_pipeline_spec.rb
index 4bb6c3265a4..3893a9cdf28 100644
--- a/spec/features/merge_request/user_sees_suggest_pipeline_spec.rb
+++ b/spec/features/merge_request/user_sees_suggest_pipeline_spec.rb
@@ -6,9 +6,10 @@ RSpec.describe 'Merge request > User sees suggest pipeline', :js do
let(:merge_request) { create(:merge_request) }
let(:project) { merge_request.source_project }
let(:user) { project.creator }
+ let(:suggest_pipeline_enabled) { true }
before do
- stub_application_setting(auto_devops_enabled: false)
+ stub_application_setting(suggest_pipeline_enabled: suggest_pipeline_enabled, auto_devops_enabled: false)
project.add_maintainer(user)
sign_in(user)
visit project_merge_request_path(project, merge_request)
@@ -66,4 +67,12 @@ RSpec.describe 'Merge request > User sees suggest pipeline', :js do
# nudge 4
expect(page).to have_content("That's it, well done!")
end
+
+ context 'when feature setting is disabled' do
+ let(:suggest_pipeline_enabled) { false }
+
+ it 'does not show the suggest pipeline widget' do
+ expect(page).not_to have_content('Are you adding technical debt or code vulnerabilities?')
+ end
+ end
end
diff --git a/spec/features/merge_request/user_selects_branches_for_new_mr_spec.rb b/spec/features/merge_request/user_selects_branches_for_new_mr_spec.rb
index 275a87ca391..d2bde320c54 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
@@ -64,7 +64,7 @@ RSpec.describe 'Merge request > User selects branches for new MR', :js do
click_button "Check out branch"
- expect(page).to have_content 'git checkout -b "orphaned-branch" "origin/orphaned-branch"'
+ expect(page).to have_content 'git checkout -b \'orphaned-branch\' \'origin/orphaned-branch\''
end
it 'allows filtering multiple dropdowns' do
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 dbc88d0cce2..690a292937a 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
@@ -159,7 +159,12 @@ RSpec.describe 'User comments on a diff', :js do
wait_for_requests
expect(page).to have_content('Remove from batch')
- expect(page).to have_content("Apply suggestions #{index + 1}")
+
+ if index < 1
+ expect(page).to have_content("Apply suggestion")
+ else
+ expect(page).to have_content("Apply #{index + 1} suggestions")
+ end
end
end
@@ -167,13 +172,12 @@ RSpec.describe 'User comments on a diff', :js do
click_button('Remove from batch')
wait_for_requests
- expect(page).to have_content('Apply suggestion')
expect(page).to have_content('Add suggestion to batch')
end
page.within("[id='#{files[1][:hash]}']") do
expect(page).to have_content('Remove from batch')
- expect(page).to have_content('Apply suggestions 1')
+ expect(page).to have_content('Apply suggestion')
end
end
diff --git a/spec/features/profiles/password_spec.rb b/spec/features/profiles/password_spec.rb
index 893dd2c76e0..7059697354d 100644
--- a/spec/features/profiles/password_spec.rb
+++ b/spec/features/profiles/password_spec.rb
@@ -89,7 +89,7 @@ RSpec.describe 'Profile > Password' do
shared_examples 'user enters an incorrect current password' do
subject do
page.within '.update-password' do
- fill_in 'user_current_password', with: user_current_password
+ fill_in 'user_password', with: user_current_password
fill_passwords(new_password, new_password)
end
end
@@ -131,7 +131,7 @@ RSpec.describe 'Profile > Password' do
end
context 'when current password is incorrect' do
- let(:user_current_password) {'invalid' }
+ let(:user_current_password) { 'invalid' }
it_behaves_like 'user enters an incorrect current password'
end
@@ -139,7 +139,7 @@ RSpec.describe 'Profile > Password' do
context 'when the password reset is successful' do
subject do
page.within '.update-password' do
- fill_in "user_current_password", with: user.password
+ fill_in "user_password", with: user.password
fill_passwords(new_password, new_password)
end
end
@@ -169,8 +169,8 @@ RSpec.describe 'Profile > Password' do
expect(current_path).to eq new_profile_password_path
- fill_in :user_current_password, with: user.password
- fill_in :user_password, with: '12345678'
+ fill_in :user_password, with: user.password
+ fill_in :user_new_password, with: '12345678'
fill_in :user_password_confirmation, with: '12345678'
click_button 'Set new password'
diff --git a/spec/features/profiles/two_factor_auths_spec.rb b/spec/features/profiles/two_factor_auths_spec.rb
index 7f3ce617846..3f5789e119a 100644
--- a/spec/features/profiles/two_factor_auths_spec.rb
+++ b/spec/features/profiles/two_factor_auths_spec.rb
@@ -29,7 +29,7 @@ RSpec.describe 'Two factor auths' do
end
context 'when user authenticates with an external service' do
- let_it_be(:user) { create(:omniauth_user, password_automatically_set: true) }
+ let_it_be(:user) { create(:omniauth_user) }
it 'does not require the current password to set up two factor authentication', :js do
visit profile_two_factor_auth_path
@@ -88,7 +88,7 @@ RSpec.describe 'Two factor auths' do
end
context 'when user authenticates with an external service' do
- let_it_be(:user) { create(:omniauth_user, :two_factor, password_automatically_set: true) }
+ let_it_be(:user) { create(:omniauth_user, :two_factor) }
it 'does not require the current_password to disable two-factor authentication', :js do
visit profile_two_factor_auth_path
diff --git a/spec/features/profiles/user_edit_profile_spec.rb b/spec/features/profiles/user_edit_profile_spec.rb
index af085b63155..026da5814e3 100644
--- a/spec/features/profiles/user_edit_profile_spec.rb
+++ b/spec/features/profiles/user_edit_profile_spec.rb
@@ -19,6 +19,17 @@ RSpec.describe 'User edit profile' do
wait_for_requests if respond_to?(:wait_for_requests)
end
+ def update_user_email
+ fill_in 'user_email', with: 'new-email@example.com'
+ click_button 'Update profile settings'
+ end
+
+ def confirm_password(password)
+ fill_in 'password-confirmation', with: password
+ click_button 'Confirm password'
+ wait_for_requests if respond_to?(:wait_for_requests)
+ end
+
def visit_user
visit user_path(user)
wait_for_requests
@@ -88,16 +99,42 @@ RSpec.describe 'User edit profile' do
expect(page).to have_content('Website url is not a valid URL')
end
- describe 'when I change my email' do
+ describe 'when I change my email', :js do
before do
user.send_reset_password_instructions
end
+ it 'will prompt to confirm my password' do
+ expect(user.reset_password_token?).to be true
+
+ update_user_email
+
+ expect(page).to have_selector('[data-testid="password-prompt-modal"]')
+ end
+
+ context 'when prompted to confirm password' do
+ before do
+ update_user_email
+ end
+
+ it 'with the correct password successfully updates' do
+ confirm_password(user.password)
+
+ expect(page).to have_text("Profile was successfully updated")
+ end
+
+ it 'with the incorrect password fails to update' do
+ confirm_password("Fake password")
+
+ expect(page).to have_text("Invalid password")
+ end
+ end
+
it 'clears the reset password token' do
expect(user.reset_password_token?).to be true
- fill_in 'user_email', with: 'new-email@example.com'
- submit_settings
+ update_user_email
+ confirm_password(user.password)
user.reload
expect(user.confirmation_token).not_to be_nil
@@ -524,14 +561,11 @@ RSpec.describe 'User edit profile' do
page.find("a", text: "Nuku'alofa").click
- tz = page.find('.user-time-preferences #user_timezone', visible: false)
-
- expect(tz.value).to eq('Pacific/Tongatapu')
+ expect(page).to have_field(:user_timezone, with: 'Pacific/Tongatapu', type: :hidden)
end
- it 'timezone defaults to servers default' do
- timezone_name = Time.zone.tzinfo.name
- expect(page.find('.user-time-preferences #user_timezone', visible: false).value).to eq(timezone_name)
+ it 'timezone defaults to empty' do
+ expect(page).to have_field(:user_timezone, with: '', type: :hidden)
end
end
end
diff --git a/spec/features/projects/badges/coverage_spec.rb b/spec/features/projects/badges/coverage_spec.rb
index 1760ec880bc..5c1bc1ad239 100644
--- a/spec/features/projects/badges/coverage_spec.rb
+++ b/spec/features/projects/badges/coverage_spec.rb
@@ -12,6 +12,120 @@ RSpec.describe 'test coverage badge' do
sign_in(user)
end
+ it 'user requests coverage badge image for pipeline with custom limits - 80% good' do
+ create_pipeline do |pipeline|
+ create_build(pipeline, coverage: 80, name: 'test:1')
+ end
+
+ show_test_coverage_badge(min_good: 75, min_acceptable: 50, min_medium: 25)
+
+ expect_coverage_badge_color(:good)
+ expect_coverage_badge('80.00%')
+ end
+
+ it 'user requests coverage badge image for pipeline with custom limits - 74% - bad config' do
+ create_pipeline do |pipeline|
+ create_build(pipeline, coverage: 74, name: 'test:1')
+ end
+ # User sets a minimum good value that is lower than min acceptable and min medium,
+ # in which case we force the min acceptable value to be min good -1 and min medium value to be min acceptable -1
+ show_test_coverage_badge(min_good: 75, min_acceptable: 76, min_medium: 77)
+
+ expect_coverage_badge_color(:acceptable)
+ expect_coverage_badge('74.00%')
+ end
+
+ it 'user requests coverage badge image for pipeline with custom limits - 73% - bad config' do
+ create_pipeline do |pipeline|
+ create_build(pipeline, coverage: 73, name: 'test:1')
+ end
+ # User sets a minimum good value that is lower than min acceptable and min medium,
+ # in which case we force the min acceptable value to be min good -1 and min medium value to be min acceptable -1
+ show_test_coverage_badge(min_good: 75, min_acceptable: 76, min_medium: 77)
+
+ expect_coverage_badge_color(:medium)
+ expect_coverage_badge('73.00%')
+ end
+
+ it 'user requests coverage badge image for pipeline with custom limits - 72% - partial config - low' do
+ create_pipeline do |pipeline|
+ create_build(pipeline, coverage: 72, name: 'test:1')
+ end
+ # User only sets good to 75 and leaves the others on the default settings,
+ # in which case we force the min acceptable value to be min good -1 and min medium value to be min acceptable -1
+ show_test_coverage_badge(min_good: 75)
+
+ expect_coverage_badge_color(:low)
+ expect_coverage_badge('72.00%')
+ end
+
+ it 'user requests coverage badge image for pipeline with custom limits - 72% - partial config - medium' do
+ create_pipeline do |pipeline|
+ create_build(pipeline, coverage: 72, name: 'test:1')
+ end
+ # User only sets good to 74 and leaves the others on the default settings,
+ # in which case we force the min acceptable value to be min good -1 and min medium value to be min acceptable -1
+ show_test_coverage_badge(min_good: 74)
+
+ expect_coverage_badge_color(:medium)
+ expect_coverage_badge('72.00%')
+ end
+
+ it 'user requests coverage badge image for pipeline with custom limits - 72% - partial config - medium v2' do
+ create_pipeline do |pipeline|
+ create_build(pipeline, coverage: 72, name: 'test:1')
+ end
+ # User only sets medium to 72 and leaves the others on the defaults good as 95 and acceptable as 90
+ show_test_coverage_badge(min_medium: 72)
+
+ expect_coverage_badge_color(:medium)
+ expect_coverage_badge('72.00%')
+ end
+
+ it 'user requests coverage badge image for pipeline with custom limits - 70% acceptable' do
+ create_pipeline do |pipeline|
+ create_build(pipeline, coverage: 70, name: 'test:1')
+ end
+
+ show_test_coverage_badge(min_good: 75, min_acceptable: 50, min_medium: 25)
+
+ expect_coverage_badge_color(:acceptable)
+ expect_coverage_badge('70.00%')
+ end
+
+ it 'user requests coverage badge image for pipeline with custom limits - 30% medium' do
+ create_pipeline do |pipeline|
+ create_build(pipeline, coverage: 30, name: 'test:1')
+ end
+
+ show_test_coverage_badge(min_good: 75, min_acceptable: 50, min_medium: 25)
+
+ expect_coverage_badge_color(:medium)
+ expect_coverage_badge('30.00%')
+ end
+
+ it 'user requests coverage badge image for pipeline with custom limits - 20% low' do
+ create_pipeline do |pipeline|
+ create_build(pipeline, coverage: 20, name: 'test:1')
+ end
+
+ show_test_coverage_badge(min_good: 75, min_acceptable: 50, min_medium: 25)
+
+ expect_coverage_badge_color(:low)
+ expect_coverage_badge('20.00%')
+ end
+
+ it 'user requests coverage badge image for pipeline with custom limits - nonsense values which use the defaults' do
+ create_pipeline do |pipeline|
+ create_build(pipeline, coverage: 92, name: 'test:1')
+ end
+
+ show_test_coverage_badge(min_good: "nonsense", min_acceptable: "rubbish", min_medium: "NaN")
+
+ expect_coverage_badge_color(:acceptable)
+ expect_coverage_badge('92.00%')
+ end
+
it 'user requests coverage badge image for pipeline' do
create_pipeline do |pipeline|
create_build(pipeline, coverage: 100, name: 'test:1')
@@ -20,6 +134,7 @@ RSpec.describe 'test coverage badge' do
show_test_coverage_badge
+ expect_coverage_badge_color(:good)
expect_coverage_badge('95.00%')
end
@@ -32,6 +147,7 @@ RSpec.describe 'test coverage badge' do
show_test_coverage_badge(job: 'coverage')
+ expect_coverage_badge_color(:medium)
expect_coverage_badge('85.00%')
end
@@ -73,8 +189,9 @@ RSpec.describe 'test coverage badge' do
create(:ci_build, :success, opts)
end
- def show_test_coverage_badge(job: nil)
- visit coverage_project_badges_path(project, ref: :master, job: job, format: :svg)
+ def show_test_coverage_badge(job: nil, min_good: nil, min_acceptable: nil, min_medium: nil)
+ visit coverage_project_badges_path(project, ref: :master, job: job, min_good: min_good,
+ min_acceptable: min_acceptable, min_medium: min_medium, format: :svg)
end
def expect_coverage_badge(coverage)
@@ -82,4 +199,12 @@ RSpec.describe 'test coverage badge' do
expect(page.response_headers['Content-Type']).to include('image/svg+xml')
expect(svg.at(%Q{text:contains("#{coverage}")})).to be_truthy
end
+
+ def expect_coverage_badge_color(color)
+ svg = Nokogiri::HTML(page.body)
+ expect(page.response_headers['Content-Type']).to include('image/svg+xml')
+ badge_color = svg.xpath("//path[starts-with(@d, 'M62')]")[0].attributes['fill'].to_s
+ expected_badge_color = Gitlab::Ci::Badge::Coverage::Template::STATUS_COLOR[color]
+ expect(badge_color).to eq(expected_badge_color)
+ end
end
diff --git a/spec/features/projects/badges/pipeline_badge_spec.rb b/spec/features/projects/badges/pipeline_badge_spec.rb
index 9d8f9872a1a..e3a01ab6fa2 100644
--- a/spec/features/projects/badges/pipeline_badge_spec.rb
+++ b/spec/features/projects/badges/pipeline_badge_spec.rb
@@ -68,7 +68,7 @@ RSpec.describe 'Pipeline Badge' do
visit pipeline_project_badges_path(project, ref: ref, format: :svg)
expect(page.status_code).to eq(200)
- expect(page.response_headers['Cache-Control']).to eq('no-store')
+ expect(page.response_headers['Cache-Control']).to eq('private, no-store')
end
end
diff --git a/spec/features/projects/ci/lint_spec.rb b/spec/features/projects/ci/lint_spec.rb
index 0d9ea6331a7..7f10c6afcd5 100644
--- a/spec/features/projects/ci/lint_spec.rb
+++ b/spec/features/projects/ci/lint_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe 'CI Lint', :js, quarantine: 'https://gitlab.com/gitlab-org/gitlab/-/issues/297782' do
+RSpec.describe 'CI Lint', :js do
include Spec::Support::Helpers::Features::SourceEditorSpecHelpers
let(:project) { create(:project, :repository) }
diff --git a/spec/features/projects/container_registry_spec.rb b/spec/features/projects/container_registry_spec.rb
index 40d0260eafd..eec50c3a66a 100644
--- a/spec/features/projects/container_registry_spec.rb
+++ b/spec/features/projects/container_registry_spec.rb
@@ -20,6 +20,7 @@ RSpec.describe 'Container Registry', :js do
sign_in(user)
project.add_developer(user)
stub_container_registry_config(enabled: true)
+ stub_container_registry_info
stub_container_registry_tags(repository: :any, tags: [])
end
@@ -96,6 +97,7 @@ RSpec.describe 'Container Registry', :js do
expect(service).to receive(:execute).with(container_repository) { { status: :success } }
expect(Projects::ContainerRepository::DeleteTagsService).to receive(:new).with(container_repository.project, user, tags: ['1']) { service }
+ first('[data-testid="additional-actions"]').click
first('[data-testid="single-delete-button"]').click
expect(find('.modal .modal-title')).to have_content _('Remove tag')
find('.modal .modal-footer .btn-danger').click
@@ -121,6 +123,16 @@ RSpec.describe 'Container Registry', :js do
expect(page).to have_content('Digest: N/A')
end
end
+
+ [ContainerRegistry::Path::InvalidRegistryPathError, Faraday::Error].each do |error_class|
+ context "when there is a #{error_class}" do
+ before do
+ expect(::ContainerRegistry::Client).to receive(:registry_info).and_raise(error_class, nil, nil)
+ end
+
+ it_behaves_like 'handling feature network errors with the container registry'
+ end
+ end
end
describe 'image repo details when image has no name' do
diff --git a/spec/features/projects/environments/environments_spec.rb b/spec/features/projects/environments/environments_spec.rb
index 9413fae02e0..34e2ca7c8a7 100644
--- a/spec/features/projects/environments/environments_spec.rb
+++ b/spec/features/projects/environments/environments_spec.rb
@@ -226,6 +226,7 @@ RSpec.describe 'Environments page', :js do
end
it 'does not show terminal button' do
+ expect(page).not_to have_button(_('More actions'))
expect(page).not_to have_terminal_button
end
@@ -273,6 +274,7 @@ RSpec.describe 'Environments page', :js do
let(:role) { :maintainer }
it 'shows the terminal button' do
+ click_button(_('More actions'))
expect(page).to have_terminal_button
end
end
@@ -281,6 +283,7 @@ RSpec.describe 'Environments page', :js do
let(:role) { :developer }
it 'does not show terminal button' do
+ expect(page).not_to have_button(_('More actions'))
expect(page).not_to have_terminal_button
end
end
@@ -515,7 +518,7 @@ RSpec.describe 'Environments page', :js do
end
def have_terminal_button
- have_link(nil, href: terminal_project_environment_path(project, environment))
+ have_link(_('Terminal'), href: terminal_project_environment_path(project, environment))
end
def visit_environments(project, **opts)
diff --git a/spec/features/projects/files/user_creates_directory_spec.rb b/spec/features/projects/files/user_creates_directory_spec.rb
index 46b93d738e1..5ad7641a5be 100644
--- a/spec/features/projects/files/user_creates_directory_spec.rb
+++ b/spec/features/projects/files/user_creates_directory_spec.rb
@@ -98,12 +98,14 @@ RSpec.describe 'Projects > Files > User creates a directory', :js do
expect(page).to have_content(fork_message)
find('.add-to-tree').click
+ wait_for_requests
click_link('New directory')
fill_in(:dir_name, with: 'new_directory')
fill_in(:commit_message, with: 'New commit message', visible: true)
click_button('Create directory')
fork = user.fork_of(project2.reload)
+ wait_for_requests
expect(current_path).to eq(project_new_merge_request_path(fork))
end
diff --git a/spec/features/projects/files/user_uploads_files_spec.rb b/spec/features/projects/files/user_uploads_files_spec.rb
index 54e816d3d13..cc621dfd9f8 100644
--- a/spec/features/projects/files/user_uploads_files_spec.rb
+++ b/spec/features/projects/files/user_uploads_files_spec.rb
@@ -19,13 +19,15 @@ RSpec.describe 'Projects > Files > User uploads files' do
wait_for_requests
end
- include_examples 'it uploads and commits a new text file'
+ [true, false].each do |value|
+ include_examples 'it uploads and commits a new text file', drop: value
- include_examples 'it uploads and commits a new image file'
+ include_examples 'it uploads and commits a new image file', drop: value
- include_examples 'it uploads and commits a new pdf file'
+ include_examples 'it uploads and commits a new pdf file', drop: value
- include_examples 'it uploads a file to a sub-directory'
+ include_examples 'it uploads a file to a sub-directory', drop: value
+ end
end
context 'when a user does not have write access' do
@@ -35,6 +37,8 @@ RSpec.describe 'Projects > Files > User uploads files' do
visit(project_tree_path(project2))
end
- include_examples 'it uploads and commits a new file to a forked project'
+ [true, false].each do |value|
+ include_examples 'it uploads and commits a new file to a forked project', drop: value
+ end
end
end
diff --git a/spec/features/projects/infrastructure_registry_spec.rb b/spec/features/projects/infrastructure_registry_spec.rb
index 16dd96e6c02..ee35e02b5e8 100644
--- a/spec/features/projects/infrastructure_registry_spec.rb
+++ b/spec/features/projects/infrastructure_registry_spec.rb
@@ -45,10 +45,8 @@ RSpec.describe 'Infrastructure Registry' do
expect(page).to have_css('.packages-app h1[data-testid="title"]', text: terraform_module.name)
- page.within(%Q([name="#{terraform_module.name}"])) do
- expect(page).to have_content('Provision instructions')
- expect(page).to have_content('Registry setup')
- end
+ expect(page).to have_content('Provision instructions')
+ expect(page).to have_content('Registry setup')
end
end
diff --git a/spec/features/projects/jobs/user_browses_jobs_spec.rb b/spec/features/projects/jobs/user_browses_jobs_spec.rb
index dbcd7b5caf5..8538b894869 100644
--- a/spec/features/projects/jobs/user_browses_jobs_spec.rb
+++ b/spec/features/projects/jobs/user_browses_jobs_spec.rb
@@ -2,36 +2,276 @@
require 'spec_helper'
+def visit_jobs_page
+ visit(project_jobs_path(project))
+
+ wait_for_requests
+end
+
RSpec.describe 'User browses jobs' do
- let!(:build) { create(:ci_build, :coverage, pipeline: pipeline) }
- let(:pipeline) { create(:ci_empty_pipeline, project: project, sha: project.commit.sha, ref: 'master') }
- let(:project) { create(:project, :repository, namespace: user.namespace) }
- let(:user) { create(:user) }
+ describe 'with jobs_table_vue feature flag turned off' do
+ let!(:build) { create(:ci_build, :coverage, pipeline: pipeline) }
+ let(:pipeline) { create(:ci_empty_pipeline, project: project, sha: project.commit.sha, ref: 'master') }
+ let(:project) { create(:project, :repository, namespace: user.namespace) }
+ let(:user) { create(:user) }
- before do
- stub_feature_flags(jobs_table_vue: false)
- project.add_maintainer(user)
- project.enable_ci
- project.update_attribute(:build_coverage_regex, /Coverage (\d+)%/)
+ before do
+ stub_feature_flags(jobs_table_vue: false)
+ project.add_maintainer(user)
+ project.enable_ci
+ project.update_attribute(:build_coverage_regex, /Coverage (\d+)%/)
- sign_in(user)
+ sign_in(user)
- visit(project_jobs_path(project))
- end
+ visit(project_jobs_path(project))
+ end
- it 'shows the coverage' do
- page.within('td.coverage') do
- expect(page).to have_content('99.9%')
+ it 'shows the coverage' do
+ page.within('td.coverage') do
+ expect(page).to have_content('99.9%')
+ end
+ end
+
+ context 'with a failed job' do
+ let!(:build) { create(:ci_build, :coverage, :failed, pipeline: pipeline) }
+
+ it 'displays a tooltip with the failure reason' do
+ page.within('.ci-table') do
+ failed_job_link = page.find('.ci-failed')
+ expect(failed_job_link[:title]).to eq('Failed - (unknown failure)')
+ end
+ end
end
end
- context 'with a failed job' do
- let!(:build) { create(:ci_build, :coverage, :failed, pipeline: pipeline) }
+ describe 'with jobs_table_vue feature flag turned on', :js do
+ let(:project) { create(:project, :repository) }
+ let(:user) { create(:user) }
+
+ before do
+ stub_feature_flags(jobs_table_vue: true)
+
+ project.add_maintainer(user)
+ project.enable_ci
+
+ sign_in(user)
+ end
+
+ describe 'header tabs' do
+ before do
+ visit_jobs_page
+ end
+
+ it 'shows a tab for All jobs and count' do
+ expect(page.find('[data-testid="jobs-all-tab"]').text).to include('All')
+ expect(page.find('[data-testid="jobs-all-tab"] .badge').text).to include('0')
+ end
+
+ it 'shows a tab for Pending jobs and count' do
+ expect(page.find('[data-testid="jobs-pending-tab"]').text).to include('Pending')
+ expect(page.find('[data-testid="jobs-pending-tab"] .badge').text).to include('0')
+ end
+
+ it 'shows a tab for Running jobs and count' do
+ expect(page.find('[data-testid="jobs-running-tab"]').text).to include('Running')
+ expect(page.find('[data-testid="jobs-running-tab"] .badge').text).to include('0')
+ end
+
+ it 'shows a tab for Finished jobs and count' do
+ expect(page.find('[data-testid="jobs-finished-tab"]').text).to include('Finished')
+ expect(page.find('[data-testid="jobs-finished-tab"] .badge').text).to include('0')
+ end
+
+ it 'updates the content when tab is clicked' do
+ page.find('[data-testid="jobs-finished-tab"]').click
+ wait_for_requests
+
+ expect(page).to have_content('No jobs to show')
+ end
+ end
+
+ describe 'Empty state' do
+ before do
+ visit_jobs_page
+ end
+
+ it 'renders an empty state' do
+ expect(page).to have_content 'Use jobs to automate your tasks'
+ expect(page).to have_content 'Create CI/CD configuration file'
+ end
+ end
+
+ describe 'Job actions' do
+ let!(:pipeline) { create(:ci_empty_pipeline, project: project, sha: project.commit.id, ref: 'master') }
+
+ context 'when a job can be canceled' do
+ let!(:job) do
+ create(:ci_build, pipeline: pipeline,
+ stage: 'test')
+ end
+
+ before do
+ job.run
+
+ visit_jobs_page
+ end
+
+ it 'cancels a job successfully' do
+ page.find('[data-testid="cancel-button"]').click
+
+ wait_for_requests
+
+ expect(page).to have_selector('.ci-canceled')
+ end
+ end
+
+ context 'when a job can be retried' do
+ let!(:job) do
+ create(:ci_build, pipeline: pipeline,
+ stage: 'test')
+ end
+
+ before do
+ job.drop
+
+ visit_jobs_page
+ end
+
+ it 'retries a job successfully' do
+ page.find('[data-testid="retry"]').click
+
+ wait_for_requests
+
+ expect(page).to have_selector('.ci-pending')
+ end
+ end
+
+ context 'with a scheduled job' do
+ let!(:scheduled_job) { create(:ci_build, :scheduled, pipeline: pipeline, name: 'build') }
+
+ before do
+ visit_jobs_page
+ end
+
+ it 'plays a job successfully' do
+ page.find('[data-testid="play-scheduled"]').click
+
+ page.within '#play-job-modal' do
+ page.find_button('OK').click
+ end
+
+ wait_for_requests
+
+ expect(page).to have_selector('.ci-pending')
+ end
+
+ it 'unschedules a job successfully' do
+ page.find('[data-testid="unschedule"]').click
+
+ wait_for_requests
+
+ expect(page).to have_selector('.ci-manual')
+ end
+ end
+
+ context 'with downloadable artifacts' do
+ let!(:with_artifacts) do
+ build = create(:ci_build, :success,
+ pipeline: pipeline,
+ name: 'rspec tests',
+ stage: 'test')
+
+ create(:ci_job_artifact, :codequality, job: build)
+ end
+
+ before do
+ visit_jobs_page
+ end
+
+ it 'shows the download artifacts button' do
+ expect(page).to have_selector('[data-testid="download-artifacts"]')
+ end
+ end
+
+ context 'with artifacts expired' do
+ let!(:with_artifacts_expired) do
+ create(:ci_build, :expired, :success,
+ pipeline: pipeline,
+ name: 'rspec',
+ stage: 'test')
+ end
+
+ before do
+ visit_jobs_page
+ end
+
+ it 'does not show the download artifacts button' do
+ expect(page).not_to have_selector('[data-testid="download-artifacts"]')
+ end
+ end
+ end
+
+ describe 'Jobs table' do
+ let!(:pipeline) { create(:ci_empty_pipeline, project: project, sha: project.commit.id, ref: 'master') }
+
+ context 'column links' do
+ let!(:job) do
+ create(:ci_build, pipeline: pipeline,
+ stage: 'test')
+ end
+
+ before do
+ job.run
+
+ visit_jobs_page
+ end
+
+ it 'contains a link to the pipeline' do
+ expect(page.find('[data-testid="pipeline-id"]')).to have_content "##{pipeline.id}"
+ end
+
+ it 'contains a link to the job sha' do
+ expect(page.find('[data-testid="job-sha"]')).to have_content "#{job.sha[0..7]}"
+ end
+
+ it 'contains a link to the job id' do
+ expect(page.find('[data-testid="job-id-link"]')).to have_content "#{job.id}"
+ end
+
+ it 'contains a link to the job ref' do
+ expect(page.find('[data-testid="job-ref"]')).to have_content "#{job.ref}"
+ end
+ end
+ end
+
+ describe 'when user is not logged in' do
+ before do
+ sign_out(user)
+ end
+
+ context 'when project is public' do
+ let(:public_project) { create(:project, :public, :repository) }
+
+ context 'without jobs' do
+ it 'shows an empty state' do
+ visit project_jobs_path(public_project)
+ wait_for_requests
+
+ expect(page).to have_content 'Use jobs to automate your tasks'
+ end
+ end
+ end
+
+ context 'when project is private' do
+ let(:private_project) { create(:project, :private, :repository) }
+
+ it 'redirects the user to sign_in and displays the flash alert' do
+ visit project_jobs_path(private_project)
+ wait_for_requests
- it 'displays a tooltip with the failure reason' do
- page.within('.ci-table') do
- failed_job_link = page.find('.ci-failed')
- expect(failed_job_link[:title]).to eq('Failed - (unknown failure)')
+ expect(page).to have_content 'You need to sign in'
+ expect(page.current_path).to eq("/users/sign_in")
+ end
end
end
end
diff --git a/spec/features/projects/jobs_spec.rb b/spec/features/projects/jobs_spec.rb
index a1416f3f563..7ccd5c51493 100644
--- a/spec/features/projects/jobs_spec.rb
+++ b/spec/features/projects/jobs_spec.rb
@@ -46,7 +46,7 @@ RSpec.describe 'Jobs', :clean_gitlab_redis_shared_state do
end
it "shows Pending tab jobs" do
- expect(page).to have_selector('.nav-links li.active', text: 'Pending')
+ expect(page).to have_selector('[data-testid="jobs-tabs"] a.active', text: 'Pending')
expect(page).to have_content job.short_sha
expect(page).to have_content job.ref
expect(page).to have_content job.name
@@ -60,7 +60,7 @@ RSpec.describe 'Jobs', :clean_gitlab_redis_shared_state do
end
it "shows Running tab jobs" do
- expect(page).to have_selector('.nav-links li.active', text: 'Running')
+ expect(page).to have_selector('[data-testid="jobs-tabs"] a.active', text: 'Running')
expect(page).to have_content job.short_sha
expect(page).to have_content job.ref
expect(page).to have_content job.name
@@ -74,7 +74,7 @@ RSpec.describe 'Jobs', :clean_gitlab_redis_shared_state do
end
it "shows Finished tab jobs" do
- expect(page).to have_selector('.nav-links li.active', text: 'Finished')
+ expect(page).to have_selector('[data-testid="jobs-tabs"] a.active', text: 'Finished')
expect(page).to have_content('Use jobs to automate your tasks')
end
end
@@ -86,7 +86,7 @@ RSpec.describe 'Jobs', :clean_gitlab_redis_shared_state do
end
it "shows All tab jobs" do
- expect(page).to have_selector('.nav-links li.active', text: 'All')
+ expect(page).to have_selector('[data-testid="jobs-tabs"] a.active', text: 'All')
expect(page).to have_content job.short_sha
expect(page).to have_content job.ref
expect(page).to have_content job.name
diff --git a/spec/features/projects/members/groups_with_access_list_spec.rb b/spec/features/projects/members/groups_with_access_list_spec.rb
index 84a972b3027..eb32570448b 100644
--- a/spec/features/projects/members/groups_with_access_list_spec.rb
+++ b/spec/features/projects/members/groups_with_access_list_spec.rb
@@ -8,6 +8,7 @@ RSpec.describe 'Projects > Members > Groups with access list', :js do
let_it_be(:user) { create(:user) }
let_it_be(:group) { create(:group, :public) }
let_it_be(:project) { create(:project, :public) }
+ let_it_be(:expiration_date) { 5.days.from_now.to_date }
let(:additional_link_attrs) { {} }
let!(:group_link) { create(:project_group_link, project: project, group: group, **additional_link_attrs) }
@@ -37,27 +38,27 @@ RSpec.describe 'Projects > Members > Groups with access list', :js do
it 'updates expiry date' do
page.within find_group_row(group) do
- fill_in 'Expiration date', with: 5.days.from_now.to_date
+ fill_in 'Expiration date', with: expiration_date
find_field('Expiration date').native.send_keys :enter
wait_for_requests
- expect(page).to have_content(/in \d days/)
+ expect(page).to have_field('Expiration date', with: expiration_date)
end
end
context 'when link has expiry date set' do
- let(:additional_link_attrs) { { expires_at: 5.days.from_now.to_date } }
+ let(:additional_link_attrs) { { expires_at: expiration_date } }
it 'clears expiry date' do
page.within find_group_row(group) do
- expect(page).to have_content(/in \d days/)
+ expect(page).to have_field('Expiration date', with: expiration_date)
find('[data-testid="clear-button"]').click
wait_for_requests
- expect(page).to have_content('No expiration set')
+ expect(page).to have_field('Expiration date', with: '')
end
end
end
diff --git a/spec/features/projects/members/invite_group_spec.rb b/spec/features/projects/members/invite_group_spec.rb
index 8c3646125a5..b674cad0312 100644
--- a/spec/features/projects/members/invite_group_spec.rb
+++ b/spec/features/projects/members/invite_group_spec.rb
@@ -165,6 +165,8 @@ RSpec.describe 'Project > Members > Invite group', :js do
let(:project) { create(:project) }
let!(:group) { create(:group) }
+ let_it_be(:expiration_date) { 5.days.from_now.to_date }
+
around do |example|
freeze_time { example.run }
end
@@ -176,15 +178,14 @@ RSpec.describe 'Project > Members > Invite group', :js do
visit project_project_members_path(project)
- invite_group(group.name, role: 'Guest', expires_at: 5.days.from_now)
+ invite_group(group.name, role: 'Guest', expires_at: expiration_date)
end
it 'the group link shows the expiration time with a warning class' do
setup
click_link 'Groups'
- expect(find_group_row(group)).to have_content(/in \d days/)
- expect(find_group_row(group)).to have_selector('.gl-text-orange-500')
+ expect(page).to have_field('Expiration date', with: expiration_date)
end
end
diff --git a/spec/features/projects/members/master_adds_member_with_expiration_date_spec.rb b/spec/features/projects/members/master_adds_member_with_expiration_date_spec.rb
index c1b14cf60e7..830ada29a2e 100644
--- a/spec/features/projects/members/master_adds_member_with_expiration_date_spec.rb
+++ b/spec/features/projects/members/master_adds_member_with_expiration_date_spec.rb
@@ -9,6 +9,8 @@ RSpec.describe 'Projects > Members > Maintainer adds member with expiration date
let_it_be(:maintainer) { create(:user) }
let_it_be(:project) { create(:project) }
+ let_it_be(:three_days_from_now) { 3.days.from_now.to_date }
+ let_it_be(:five_days_from_now) { 5.days.from_now.to_date }
let(:new_member) { create(:user) }
@@ -22,39 +24,39 @@ RSpec.describe 'Projects > Members > Maintainer adds member with expiration date
it 'expiration date is displayed in the members list' do
visit project_project_members_path(project)
- invite_member(new_member.name, role: 'Guest', expires_at: 5.days.from_now.to_date)
+ invite_member(new_member.name, role: 'Guest', expires_at: five_days_from_now)
page.within find_member_row(new_member) do
- expect(page).to have_content(/in \d days/)
+ expect(page).to have_field('Expiration date', with: five_days_from_now)
end
end
it 'changes expiration date' do
- project.team.add_users([new_member.id], :developer, expires_at: 3.days.from_now.to_date)
+ project.team.add_users([new_member.id], :developer, expires_at: three_days_from_now)
visit project_project_members_path(project)
page.within find_member_row(new_member) do
- fill_in 'Expiration date', with: 5.days.from_now.to_date
+ fill_in 'Expiration date', with: five_days_from_now
find_field('Expiration date').native.send_keys :enter
wait_for_requests
- expect(page).to have_content(/in \d days/)
+ expect(page).to have_field('Expiration date', with: five_days_from_now)
end
end
it 'clears expiration date' do
- project.team.add_users([new_member.id], :developer, expires_at: 5.days.from_now.to_date)
+ project.team.add_users([new_member.id], :developer, expires_at: five_days_from_now)
visit project_project_members_path(project)
page.within find_member_row(new_member) do
- expect(page).to have_content(/in \d days/)
+ expect(page).to have_field('Expiration date', with: five_days_from_now)
find('[data-testid="clear-button"]').click
wait_for_requests
- expect(page).to have_content('No expiration set')
+ expect(page).to have_field('Expiration date', with: '')
end
end
diff --git a/spec/features/projects/navbar_spec.rb b/spec/features/projects/navbar_spec.rb
index 876bc82d16c..f61eaccf5b9 100644
--- a/spec/features/projects/navbar_spec.rb
+++ b/spec/features/projects/navbar_spec.rb
@@ -18,6 +18,7 @@ RSpec.describe 'Project navbar' do
stub_config(registry: { enabled: false })
insert_package_nav(_('Infrastructure'))
insert_infrastructure_registry_nav
+ insert_infrastructure_google_cloud_nav
end
it_behaves_like 'verified navigation bar' do
diff --git a/spec/features/projects/new_project_spec.rb b/spec/features/projects/new_project_spec.rb
index 39f9d3b331b..dacbaa826a0 100644
--- a/spec/features/projects/new_project_spec.rb
+++ b/spec/features/projects/new_project_spec.rb
@@ -296,12 +296,16 @@ RSpec.describe 'New project', :js do
expect(git_import_instructions).to have_content 'Git repository URL'
end
- it 'reports error if repo URL does not end with .git' do
+ it 'reports error if repo URL is not a valid Git repository' do
+ stub_request(:get, "http://foo/bar/info/refs?service=git-upload-pack").to_return(status: 200, body: "not-a-git-repo")
+
fill_in 'project_import_url', with: 'http://foo/bar'
# simulate blur event
find('body').click
- expect(page).to have_text('A repository URL usually ends in a .git suffix')
+ wait_for_requests
+
+ expect(page).to have_text('There is not a valid Git repository at this URL')
end
it 'keeps "Import project" tab open after form validation error' do
diff --git a/spec/features/projects/packages_spec.rb b/spec/features/projects/packages_spec.rb
index 7fcc8200b1c..9b1e87192f5 100644
--- a/spec/features/projects/packages_spec.rb
+++ b/spec/features/projects/packages_spec.rb
@@ -27,6 +27,10 @@ RSpec.describe 'Packages' do
context 'when feature is available', :js do
before do
+ # we are simply setting the featrure flag to false because the new UI has nothing to test yet
+ # when the refactor is complete or almost complete we will turn on the feature tests
+ # see https://gitlab.com/gitlab-org/gitlab/-/issues/330846 for status of this work
+ stub_feature_flags(package_list_apollo: false)
visit_project_packages
end
diff --git a/spec/features/projects/settings/monitor_settings_spec.rb b/spec/features/projects/settings/monitor_settings_spec.rb
index e3d75c30e5e..3f6c4646f00 100644
--- a/spec/features/projects/settings/monitor_settings_spec.rb
+++ b/spec/features/projects/settings/monitor_settings_spec.rb
@@ -5,7 +5,7 @@ require 'spec_helper'
RSpec.describe 'Projects > Settings > For a forked project', :js do
let_it_be(:project) { create(:project, :repository, create_templates: :issue) }
- let(:user) { project.owner}
+ let(:user) { project.owner }
before do
sign_in(user)
@@ -16,7 +16,8 @@ RSpec.describe 'Projects > Settings > For a forked project', :js do
visit project_path(project)
wait_for_requests
- expect(page).to have_selector('.sidebar-sub-level-items a[aria-label="Monitor"]', text: 'Monitor', visible: false)
+ expect(page).to have_selector('.sidebar-sub-level-items a[aria-label="Monitor"]',
+ text: 'Monitor', visible: :hidden)
end
end
@@ -42,7 +43,7 @@ RSpec.describe 'Projects > Settings > For a forked project', :js do
expect(find_field(send_email)).to be_checked
end
- it 'updates form values', quarantine: 'https://gitlab.com/gitlab-org/gitlab/-/issues/333665' do
+ it 'updates form values' do
check(create_issue)
uncheck(send_email)
click_on('No template selected')
@@ -52,10 +53,8 @@ RSpec.describe 'Projects > Settings > For a forked project', :js do
click_settings_tab
expect(find_field(create_issue)).to be_checked
- expect(page).to have_selector(:id, 'alert-integration-settings-issue-template', text: 'bug')
-
- click_settings_tab
expect(find_field(send_email)).not_to be_checked
+ expect(page).to have_selector(:id, 'alert-integration-settings-issue-template', text: 'bug')
end
def click_settings_tab
@@ -68,13 +67,15 @@ RSpec.describe 'Projects > Settings > For a forked project', :js do
page.within '[data-testid="alert-integration-settings"]' do
click_button 'Save changes'
end
+
+ wait_for_all_requests
end
end
- context 'error tracking settings form' do
+ describe 'error tracking settings form' do
let(:sentry_list_projects_url) { 'http://sentry.example.com/api/0/projects/' }
- context 'success path' do
+ context 'when project dropdown is loaded' do
let(:projects_sample_response) do
Gitlab::Utils.deep_indifferent_access(
Gitlab::Json.parse(fixture_file('sentry/list_projects_sample_response.json'))
@@ -97,7 +98,9 @@ RSpec.describe 'Projects > Settings > For a forked project', :js do
within '.js-error-tracking-settings' do
click_button('Expand')
+ choose('cloud-hosted Sentry')
end
+
expect(page).to have_content('Sentry API URL')
expect(page.body).to include('Error Tracking')
expect(page).to have_button('Connect')
@@ -121,7 +124,7 @@ RSpec.describe 'Projects > Settings > For a forked project', :js do
end
end
- context 'project dropdown fails to load' do
+ context 'when project dropdown fails to load' do
before do
WebMock.stub_request(:get, sentry_list_projects_url)
.to_return(
@@ -140,8 +143,10 @@ RSpec.describe 'Projects > Settings > For a forked project', :js do
within '.js-error-tracking-settings' do
click_button('Expand')
+ choose('cloud-hosted Sentry')
+ check('Active')
end
- check('Active')
+
fill_in('error-tracking-api-host', with: 'http://sentry.example.com')
fill_in('error-tracking-token', with: 'token')
@@ -151,7 +156,7 @@ RSpec.describe 'Projects > Settings > For a forked project', :js do
end
end
- context 'integrated error tracking backend' do
+ context 'with integrated error tracking backend' do
it 'successfully fills and submits the form' do
visit project_settings_operations_path(project)
@@ -175,11 +180,17 @@ RSpec.describe 'Projects > Settings > For a forked project', :js do
wait_for_requests
assert_text('Your changes have been saved')
+
+ within '.js-error-tracking-settings' do
+ click_button('Expand')
+ end
+
+ expect(page).to have_content('Paste this DSN into your Sentry SDK')
end
end
end
- context 'grafana integration settings form' do
+ describe 'grafana integration settings form' do
it 'successfully fills and completes the form' do
visit project_settings_operations_path(project)
diff --git a/spec/features/projects/settings/webhooks_settings_spec.rb b/spec/features/projects/settings/webhooks_settings_spec.rb
index 528fd58cbe6..8d73ffecd46 100644
--- a/spec/features/projects/settings/webhooks_settings_spec.rb
+++ b/spec/features/projects/settings/webhooks_settings_spec.rb
@@ -115,8 +115,8 @@ RSpec.describe 'Projects > Settings > Webhook Settings' do
hook_log
visit edit_project_hook_path(project, hook)
- expect(page).to have_content('Recent Deliveries')
- expect(page).to have_content(hook_log.url)
+ expect(page).to have_content('Recent events')
+ expect(page).to have_link('View details', href: hook_log.present.details_path)
end
it 'show hook log details' do
diff --git a/spec/features/projects/show/user_uploads_files_spec.rb b/spec/features/projects/show/user_uploads_files_spec.rb
index eb230082bfa..51e41397439 100644
--- a/spec/features/projects/show/user_uploads_files_spec.rb
+++ b/spec/features/projects/show/user_uploads_files_spec.rb
@@ -21,13 +21,15 @@ RSpec.describe 'Projects > Show > User uploads files' do
wait_for_requests
end
- include_examples 'it uploads and commits a new text file'
+ [true, false].each do |value|
+ include_examples 'it uploads and commits a new text file', drop: value
- include_examples 'it uploads and commits a new image file'
+ include_examples 'it uploads and commits a new image file', drop: value
- include_examples 'it uploads and commits a new pdf file'
+ include_examples 'it uploads and commits a new pdf file', drop: value
- include_examples 'it uploads a file to a sub-directory'
+ include_examples 'it uploads a file to a sub-directory', drop: value
+ end
end
context 'when a user does not have write access' do
@@ -37,7 +39,9 @@ RSpec.describe 'Projects > Show > User uploads files' do
visit(project_path(project2))
end
- include_examples 'it uploads and commits a new file to a forked project'
+ [true, false].each do |value|
+ include_examples 'it uploads and commits a new file to a forked project', drop: value
+ end
end
context 'when in the empty_repo_upload experiment' do
@@ -50,13 +54,17 @@ RSpec.describe 'Projects > Show > User uploads files' do
context 'with an empty repo' do
let(:project) { create(:project, :empty_repo, creator: user) }
- include_examples 'uploads and commits a new text file via "upload file" button'
+ [true, false].each do |value|
+ include_examples 'uploads and commits a new text file via "upload file" button', drop: value
+ end
end
context 'with a nonempty repo' do
let(:project) { create(:project, :repository, creator: user) }
- include_examples 'uploads and commits a new text file via "upload file" button'
+ [true, false].each do |value|
+ include_examples 'uploads and commits a new text file via "upload file" button', drop: value
+ end
end
end
end
diff --git a/spec/features/projects/user_creates_project_spec.rb b/spec/features/projects/user_creates_project_spec.rb
index 9f08759603e..5d482f9fbd0 100644
--- a/spec/features/projects/user_creates_project_spec.rb
+++ b/spec/features/projects/user_creates_project_spec.rb
@@ -33,6 +33,29 @@ RSpec.describe 'User creates a project', :js do
expect(page).to have_content(project.url_to_repo)
end
+ it 'creates a new project that is not blank' do
+ stub_experiments(new_project_sast_enabled: 'candidate')
+
+ visit(new_project_path)
+
+ find('[data-qa-panel-name="blank_project"]').click # rubocop:disable QA/SelectorUsage
+ fill_in(:project_name, with: 'With initial commits')
+
+ expect(page).to have_checked_field 'Initialize repository with a README'
+ expect(page).to have_checked_field 'Enable Static Application Security Testing (SAST)'
+
+ page.within('#content-body') do
+ click_button('Create project')
+ end
+
+ project = Project.last
+
+ expect(current_path).to eq(project_path(project))
+ expect(page).to have_content('With initial commits')
+ expect(page).to have_content('Configure SAST in `.gitlab-ci.yml`, creating this file if it does not already exist')
+ expect(page).to have_content('README.md Initial commit')
+ end
+
context 'in a subgroup they do not own' do
let(:parent) { create(:group) }
let!(:subgroup) { create(:group, parent: parent) }
diff --git a/spec/features/security/project/internal_access_spec.rb b/spec/features/security/project/internal_access_spec.rb
index 9dcef13757a..4012a302196 100644
--- a/spec/features/security/project/internal_access_spec.rb
+++ b/spec/features/security/project/internal_access_spec.rb
@@ -553,6 +553,7 @@ RSpec.describe "Internal Project Access" do
before do
stub_container_registry_tags(repository: :any, tags: ['latest'])
stub_container_registry_config(enabled: true)
+ stub_container_registry_info
project.container_repositories << container_repository
end
diff --git a/spec/features/security/project/private_access_spec.rb b/spec/features/security/project/private_access_spec.rb
index 5a200bea80a..aa34ccce2c1 100644
--- a/spec/features/security/project/private_access_spec.rb
+++ b/spec/features/security/project/private_access_spec.rb
@@ -570,6 +570,7 @@ RSpec.describe "Private Project Access" do
before do
stub_container_registry_tags(repository: :any, tags: ['latest'])
stub_container_registry_config(enabled: true)
+ stub_container_registry_info
project.container_repositories << container_repository
end
diff --git a/spec/features/security/project/public_access_spec.rb b/spec/features/security/project/public_access_spec.rb
index 8ceb6920e77..abe128c6f78 100644
--- a/spec/features/security/project/public_access_spec.rb
+++ b/spec/features/security/project/public_access_spec.rb
@@ -552,6 +552,7 @@ RSpec.describe "Public Project Access" do
before do
stub_container_registry_tags(repository: :any, tags: ['latest'])
stub_container_registry_config(enabled: true)
+ stub_container_registry_info
project.container_repositories << container_repository
end
diff --git a/spec/features/snippets/notes_on_personal_snippets_spec.rb b/spec/features/snippets/notes_on_personal_snippets_spec.rb
index e03f71c5352..fc88cd9205c 100644
--- a/spec/features/snippets/notes_on_personal_snippets_spec.rb
+++ b/spec/features/snippets/notes_on_personal_snippets_spec.rb
@@ -70,8 +70,8 @@ RSpec.describe 'Comments on personal snippets', :js do
context 'when submitting a note' do
it 'shows a valid form' do
is_expected.to have_css('.js-main-target-form', visible: true, count: 1)
- expect(find('.js-main-target-form .js-comment-button').value)
- .to eq('Comment')
+ expect(find('.js-main-target-form .js-comment-button button', match: :first))
+ .to have_content('Comment')
page.within('.js-main-target-form') do
expect(page).not_to have_link('Cancel')
diff --git a/spec/features/users/login_spec.rb b/spec/features/users/login_spec.rb
index 79c4057a8b9..10c1c2cb26e 100644
--- a/spec/features/users/login_spec.rb
+++ b/spec/features/users/login_spec.rb
@@ -171,6 +171,18 @@ RSpec.describe 'Login', :clean_gitlab_redis_shared_state do
end
end
+ describe 'with OneTrust authentication' do
+ before do
+ stub_config(extra: { one_trust_id: SecureRandom.uuid })
+ end
+
+ it 'has proper Content-Security-Policy headers' do
+ visit root_path
+
+ expect(response_headers['Content-Security-Policy']).to include('https://cdn.cookielaw.org https://*.onetrust.com')
+ end
+ end
+
describe 'with two-factor authentication', :js do
def enter_code(code)
fill_in 'user_otp_attempt', with: code
@@ -866,8 +878,8 @@ RSpec.describe 'Login', :clean_gitlab_redis_shared_state do
expect(current_path).to eq(new_profile_password_path)
- fill_in 'user_current_password', with: '12345678'
- fill_in 'user_password', with: 'new password'
+ fill_in 'user_password', with: '12345678'
+ fill_in 'user_new_password', with: 'new password'
fill_in 'user_password_confirmation', with: 'new password'
click_button 'Set new password'
@@ -875,7 +887,7 @@ RSpec.describe 'Login', :clean_gitlab_redis_shared_state do
end
end
- context 'when the user does not have an email configured' do
+ context 'when the user does not have an email configured', :js do
let(:user) { create(:omniauth_user, extern_uid: 'my-uid', provider: 'saml', email: 'temp-email-for-oauth-user@gitlab.localhost') }
before do
diff --git a/spec/features/users/show_spec.rb b/spec/features/users/show_spec.rb
index e629d329033..61672662fbe 100644
--- a/spec/features/users/show_spec.rb
+++ b/spec/features/users/show_spec.rb
@@ -81,6 +81,7 @@ RSpec.describe 'User page' do
context 'timezone' do
let_it_be(:timezone) { 'America/Los_Angeles' }
+ let_it_be(:local_time_selector) { '[data-testid="user-local-time"]' }
before do
travel_to Time.find_zone(timezone).local(2021, 7, 20, 15, 30, 45)
@@ -92,7 +93,19 @@ RSpec.describe 'User page' do
it 'shows local time' do
subject
- expect(page).to have_content('3:30 PM')
+ within local_time_selector do
+ expect(page).to have_content('3:30 PM')
+ end
+ end
+ end
+
+ context 'when timezone is not set' do
+ let_it_be(:user) { create(:user, timezone: nil) }
+
+ it 'does not show local time' do
+ subject
+
+ expect(page).not_to have_selector(local_time_selector)
end
end
@@ -102,7 +115,9 @@ RSpec.describe 'User page' do
it 'shows local time using the configured default timezone (UTC in this case)' do
subject
- expect(page).to have_content('10:30 PM')
+ within local_time_selector do
+ expect(page).to have_content('10:30 PM')
+ end
end
end
end
diff --git a/spec/finders/ci/commit_statuses_finder_spec.rb b/spec/finders/ci/commit_statuses_finder_spec.rb
index 2e26e38f4b4..9f66b53dd1f 100644
--- a/spec/finders/ci/commit_statuses_finder_spec.rb
+++ b/spec/finders/ci/commit_statuses_finder_spec.rb
@@ -8,7 +8,7 @@ RSpec.describe Ci::CommitStatusesFinder, '#execute' do
let_it_be(:user) { create(:user) }
context 'tag refs' do
- let_it_be(:tags) { TagsFinder.new(project.repository, {}).execute }
+ let_it_be(:tags) { project.repository.tags }
let(:subject) { described_class.new(project, project.repository, user, tags).execute }
@@ -131,7 +131,7 @@ RSpec.describe Ci::CommitStatusesFinder, '#execute' do
end
context 'CI pipelines visible to' do
- let_it_be(:tags) { TagsFinder.new(project.repository, {}).execute }
+ let_it_be(:tags) { project.repository.tags }
let(:subject) { described_class.new(project, project.repository, user, tags).execute }
@@ -161,7 +161,7 @@ RSpec.describe Ci::CommitStatusesFinder, '#execute' do
context 'when not a member of a private project' do
let(:private_project) { create(:project, :private, :repository) }
- let(:private_tags) { TagsFinder.new(private_tags.repository, {}).execute }
+ let(:private_tags) { private_tags.repository.tags }
let(:private_subject) { described_class.new(private_project, private_project.repository, user, tags).execute }
before do
diff --git a/spec/finders/ci/pipelines_for_merge_request_finder_spec.rb b/spec/finders/ci/pipelines_for_merge_request_finder_spec.rb
index 65f6dc0ba74..8a802e9660b 100644
--- a/spec/finders/ci/pipelines_for_merge_request_finder_spec.rb
+++ b/spec/finders/ci/pipelines_for_merge_request_finder_spec.rb
@@ -44,7 +44,7 @@ RSpec.describe Ci::PipelinesForMergeRequestFinder do
let(:actor) { developer_in_both }
it 'returns all pipelines' do
- is_expected.to eq([pipeline_in_fork, pipeline_in_parent])
+ is_expected.to match_array([pipeline_in_fork, pipeline_in_parent])
end
end
@@ -52,7 +52,7 @@ RSpec.describe Ci::PipelinesForMergeRequestFinder do
let(:actor) { reporter_in_parent_and_developer_in_fork }
it 'returns all pipelines' do
- is_expected.to eq([pipeline_in_fork, pipeline_in_parent])
+ is_expected.to match_array([pipeline_in_fork, pipeline_in_parent])
end
end
@@ -60,7 +60,7 @@ RSpec.describe Ci::PipelinesForMergeRequestFinder do
let(:actor) { developer_in_parent }
it 'returns pipelines in parent' do
- is_expected.to eq([pipeline_in_parent])
+ is_expected.to match_array([pipeline_in_parent])
end
end
@@ -68,7 +68,7 @@ RSpec.describe Ci::PipelinesForMergeRequestFinder do
let(:actor) { developer_in_fork }
it 'returns pipelines in fork' do
- is_expected.to eq([pipeline_in_fork])
+ is_expected.to match_array([pipeline_in_fork])
end
end
@@ -97,7 +97,7 @@ RSpec.describe Ci::PipelinesForMergeRequestFinder do
shared_examples 'returning pipelines with proper ordering' do
let!(:all_pipelines) do
- merge_request.all_commit_shas.map do |sha|
+ merge_request.recent_diff_head_shas.map do |sha|
create(:ci_empty_pipeline,
project: project, sha: sha, ref: merge_request.source_branch)
end
@@ -135,12 +135,92 @@ RSpec.describe Ci::PipelinesForMergeRequestFinder do
end
context 'when pipelines exist for the branch and merge request' do
+ shared_examples 'returns all pipelines for merge request' do
+ it 'returns merge request pipeline first' do
+ expect(subject.all).to eq([detached_merge_request_pipeline, branch_pipeline])
+ end
+
+ context 'when there are a branch pipeline and a merge request pipeline' do
+ let!(:branch_pipeline_2) do
+ create(:ci_pipeline, source: :push, project: project,
+ ref: source_ref, sha: shas.first)
+ end
+
+ let!(:detached_merge_request_pipeline_2) do
+ create(:ci_pipeline, source: :merge_request_event, project: project,
+ ref: source_ref, sha: shas.first, merge_request: merge_request)
+ end
+
+ it 'returns merge request pipelines first' do
+ expect(subject.all)
+ .to eq([detached_merge_request_pipeline_2,
+ detached_merge_request_pipeline,
+ branch_pipeline_2,
+ branch_pipeline])
+ end
+ end
+
+ context 'when there are multiple merge request pipelines from the same branch' do
+ let!(:branch_pipeline_2) do
+ create(:ci_pipeline, source: :push, project: project,
+ ref: source_ref, sha: shas.first)
+ end
+
+ let!(:branch_pipeline_with_sha_not_belonging_to_merge_request) do
+ create(:ci_pipeline, source: :push, project: project, ref: source_ref)
+ end
+
+ let!(:detached_merge_request_pipeline_2) do
+ create(:ci_pipeline, source: :merge_request_event, project: project,
+ ref: source_ref, sha: shas.first, merge_request: merge_request_2)
+ end
+
+ let(:merge_request_2) do
+ create(:merge_request, source_project: project, source_branch: source_ref,
+ target_project: project, target_branch: 'stable')
+ end
+
+ before do
+ shas.each.with_index do |sha, index|
+ create(:merge_request_diff_commit,
+ merge_request_diff: merge_request_2.merge_request_diff,
+ sha: sha, relative_order: index)
+ end
+ end
+
+ it 'returns only related merge request pipelines' do
+ expect(subject.all)
+ .to eq([detached_merge_request_pipeline,
+ branch_pipeline_2,
+ branch_pipeline])
+
+ expect(described_class.new(merge_request_2, nil).all)
+ .to match_array([detached_merge_request_pipeline_2, branch_pipeline_2, branch_pipeline])
+ end
+ end
+
+ context 'when detached merge request pipeline is run on head ref of the merge request' do
+ let!(:detached_merge_request_pipeline) do
+ create(:ci_pipeline, source: :merge_request_event, project: project,
+ ref: merge_request.ref_path, sha: shas.second, merge_request: merge_request)
+ end
+
+ it 'sets the head ref of the merge request to the pipeline ref' do
+ expect(detached_merge_request_pipeline.ref).to match(%r{refs/merge-requests/\d+/head})
+ end
+
+ it 'includes the detached merge request pipeline even though the ref is custom path' do
+ expect(merge_request.all_pipelines).to include(detached_merge_request_pipeline)
+ end
+ end
+ end
+
let(:source_ref) { 'feature' }
let(:target_ref) { 'master' }
let!(:branch_pipeline) do
create(:ci_pipeline, source: :push, project: project,
- ref: source_ref, sha: shas.second)
+ ref: source_ref, sha: merge_request.merge_request_diff.head_commit_sha)
end
let!(:tag_pipeline) do
@@ -149,97 +229,31 @@ RSpec.describe Ci::PipelinesForMergeRequestFinder do
let!(:detached_merge_request_pipeline) do
create(:ci_pipeline, source: :merge_request_event, project: project,
- ref: source_ref, sha: shas.second, merge_request: merge_request)
+ ref: source_ref, sha: shas.second, merge_request: merge_request)
end
let(:merge_request) do
create(:merge_request, source_project: project, source_branch: source_ref,
- target_project: project, target_branch: target_ref)
+ target_project: project, target_branch: target_ref)
end
let(:project) { create(:project, :repository) }
let(:shas) { project.repository.commits(source_ref, limit: 2).map(&:id) }
- before do
- create(:merge_request_diff_commit,
- merge_request_diff: merge_request.merge_request_diff,
- sha: shas.second, relative_order: 1)
- end
-
- it 'returns merge request pipeline first' do
- expect(subject.all).to eq([detached_merge_request_pipeline, branch_pipeline])
- end
-
- context 'when there are a branch pipeline and a merge request pipeline' do
- let!(:branch_pipeline_2) do
- create(:ci_pipeline, source: :push, project: project,
- ref: source_ref, sha: shas.first)
- end
-
- let!(:detached_merge_request_pipeline_2) do
- create(:ci_pipeline, source: :merge_request_event, project: project,
- ref: source_ref, sha: shas.first, merge_request: merge_request)
- end
-
- it 'returns merge request pipelines first' do
- expect(subject.all)
- .to eq([detached_merge_request_pipeline_2,
- detached_merge_request_pipeline,
- branch_pipeline_2,
- branch_pipeline])
- end
- end
-
- context 'when there are multiple merge request pipelines from the same branch' do
- let!(:branch_pipeline_2) do
- create(:ci_pipeline, source: :push, project: project,
- ref: source_ref, sha: shas.first)
- end
-
- let!(:detached_merge_request_pipeline_2) do
- create(:ci_pipeline, source: :merge_request_event, project: project,
- ref: source_ref, sha: shas.first, merge_request: merge_request_2)
- end
-
- let(:merge_request_2) do
- create(:merge_request, source_project: project, source_branch: source_ref,
- target_project: project, target_branch: 'stable')
- end
-
+ context 'when `decomposed_ci_query_in_pipelines_for_merge_request_finder` feature flag enabled' do
before do
- shas.each.with_index do |sha, index|
- create(:merge_request_diff_commit,
- merge_request_diff: merge_request_2.merge_request_diff,
- sha: sha, relative_order: index)
- end
+ stub_feature_flags(decomposed_ci_query_in_pipelines_for_merge_request_finder: merge_request.target_project)
end
- it 'returns only related merge request pipelines' do
- expect(subject.all)
- .to eq([detached_merge_request_pipeline,
- branch_pipeline_2,
- branch_pipeline])
-
- expect(described_class.new(merge_request_2, nil).all)
- .to eq([detached_merge_request_pipeline_2,
- branch_pipeline_2,
- branch_pipeline])
- end
+ it_behaves_like 'returns all pipelines for merge request'
end
- context 'when detached merge request pipeline is run on head ref of the merge request' do
- let!(:detached_merge_request_pipeline) do
- create(:ci_pipeline, source: :merge_request_event, project: project,
- ref: merge_request.ref_path, sha: shas.second, merge_request: merge_request)
- end
-
- it 'sets the head ref of the merge request to the pipeline ref' do
- expect(detached_merge_request_pipeline.ref).to match(%r{refs/merge-requests/\d+/head})
+ context 'when `decomposed_ci_query_in_pipelines_for_merge_request_finder` feature flag disabled' do
+ before do
+ stub_feature_flags(decomposed_ci_query_in_pipelines_for_merge_request_finder: false)
end
- it 'includes the detached merge request pipeline even though the ref is custom path' do
- expect(merge_request.all_pipelines).to include(detached_merge_request_pipeline)
- end
+ it_behaves_like 'returns all pipelines for merge request'
end
end
end
diff --git a/spec/finders/clusters/agents_finder_spec.rb b/spec/finders/clusters/agents_finder_spec.rb
new file mode 100644
index 00000000000..0996d76b723
--- /dev/null
+++ b/spec/finders/clusters/agents_finder_spec.rb
@@ -0,0 +1,41 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Clusters::AgentsFinder do
+ describe '#execute' do
+ let(:project) { create(:project) }
+ let(:user) { create(:user, maintainer_projects: [project]) }
+
+ let!(:matching_agent) { create(:cluster_agent, project: project) }
+ let!(:wrong_project) { create(:cluster_agent) }
+
+ subject { described_class.new(project, user).execute }
+
+ it { is_expected.to contain_exactly(matching_agent) }
+
+ context 'user does not have permission' do
+ let(:user) { create(:user, developer_projects: [project]) }
+
+ it { is_expected.to be_empty }
+ end
+
+ context 'filtering by name' do
+ let(:params) { Hash(name: name_param) }
+
+ subject { described_class.new(project, user, params: params).execute }
+
+ context 'name does not match' do
+ let(:name_param) { 'other-name' }
+
+ it { is_expected.to be_empty }
+ end
+
+ context 'name does match' do
+ let(:name_param) { matching_agent.name }
+
+ it { is_expected.to contain_exactly(matching_agent) }
+ end
+ end
+ end
+end
diff --git a/spec/finders/error_tracking/errors_finder_spec.rb b/spec/finders/error_tracking/errors_finder_spec.rb
index 29053054f9d..66eb7769a4c 100644
--- a/spec/finders/error_tracking/errors_finder_spec.rb
+++ b/spec/finders/error_tracking/errors_finder_spec.rb
@@ -29,14 +29,25 @@ RSpec.describe ErrorTracking::ErrorsFinder do
context 'with sort parameter' do
let(:params) { { status: 'unresolved', sort: 'first_seen' } }
- it { is_expected.to eq([error, error_yesterday]) }
+ it { expect(subject.to_a).to eq([error, error_yesterday]) }
end
- context 'with limit parameter' do
+ context 'pagination' do
let(:params) { { limit: '1', sort: 'first_seen' } }
# Sort by first_seen is DESC by default, so the most recent error is `error`
it { is_expected.to contain_exactly(error) }
+
+ it { expect(subject.has_next_page?).to be_truthy }
+
+ it 'returns next page by cursor' do
+ params_with_cursor = params.merge(cursor: subject.cursor_for_next_page)
+ errors = described_class.new(user, project, params_with_cursor).execute
+
+ expect(errors).to contain_exactly(error_resolved)
+ expect(errors.has_next_page?).to be_truthy
+ expect(errors.has_previous_page?).to be_truthy
+ end
end
end
end
diff --git a/spec/finders/issues_finder_spec.rb b/spec/finders/issues_finder_spec.rb
index ed35d75720c..9f12308013e 100644
--- a/spec/finders/issues_finder_spec.rb
+++ b/spec/finders/issues_finder_spec.rb
@@ -1199,6 +1199,14 @@ RSpec.describe IssuesFinder do
end
end
+ context 'when a non-simple sort is given' do
+ let(:params) { { search: 'foo', attempt_project_search_optimizations: true, sort: 'popularity' } }
+
+ it 'returns false' do
+ expect(finder.use_cte_for_search?).to be_falsey
+ end
+ end
+
context 'when all conditions are met' do
context "uses group search optimization" do
let(:params) { { search: 'foo', attempt_group_search_optimizations: true } }
@@ -1217,6 +1225,24 @@ RSpec.describe IssuesFinder do
expect(finder.execute.to_sql).to match(/^WITH "issues" AS #{Gitlab::Database::AsWithMaterialized.materialized_if_supported}/)
end
end
+
+ context 'with simple sort' do
+ let(:params) { { search: 'foo', attempt_project_search_optimizations: true, sort: 'updated_desc' } }
+
+ it 'returns true' do
+ expect(finder.use_cte_for_search?).to be_truthy
+ expect(finder.execute.to_sql).to match(/^WITH "issues" AS #{Gitlab::Database::AsWithMaterialized.materialized_if_supported}/)
+ end
+ end
+
+ context 'with simple sort as a symbol' do
+ let(:params) { { search: 'foo', attempt_project_search_optimizations: true, sort: :updated_desc } }
+
+ it 'returns true' do
+ expect(finder.use_cte_for_search?).to be_truthy
+ expect(finder.execute.to_sql).to match(/^WITH "issues" AS #{Gitlab::Database::AsWithMaterialized.materialized_if_supported}/)
+ end
+ end
end
end
diff --git a/spec/finders/members_finder_spec.rb b/spec/finders/members_finder_spec.rb
index d25e1b9ca4b..749e319f9c7 100644
--- a/spec/finders/members_finder_spec.rb
+++ b/spec/finders/members_finder_spec.rb
@@ -161,42 +161,54 @@ RSpec.describe MembersFinder, '#execute' do
end
context 'when :invited_groups is passed' do
- subject { described_class.new(project, user2).execute(include_relations: [:inherited, :direct, :invited_groups]) }
+ 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)
+ 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)
+
+ 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
- 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)
+ it_behaves_like 'with invited_groups param'
- expect(subject.map(&:user)).to contain_exactly(user1, user2)
- expect(subject.max_by(&:access_level).access_level).to eq(Gitlab::Access::REPORTER)
+ context 'when feature flag :linear_members_finder_ancestor_scopes is disabled' do
+ before do
+ stub_feature_flags(linear_members_finder_ancestor_scopes: false)
end
+
+ it_behaves_like 'with invited_groups param'
end
end
end
diff --git a/spec/finders/packages/group_packages_finder_spec.rb b/spec/finders/packages/group_packages_finder_spec.rb
index d7f62bdfbb4..3254c436674 100644
--- a/spec/finders/packages/group_packages_finder_spec.rb
+++ b/spec/finders/packages/group_packages_finder_spec.rb
@@ -147,6 +147,19 @@ RSpec.describe Packages::GroupPackagesFinder do
end
end
+ context 'with exact package_name' do
+ let_it_be(:named_package) { create(:maven_package, project: project, name: 'maven') }
+ let_it_be(:other_package) { create(:maven_package, project: project, name: 'maventoo') }
+
+ let(:params) { { exact_name: true, package_name: package_name } }
+
+ context 'as complete name' do
+ let(:package_name) { 'maven' }
+
+ it { is_expected.to match_array([named_package]) }
+ end
+ end
+
it_behaves_like 'concerning versionless param'
it_behaves_like 'concerning package statuses'
end
diff --git a/spec/finders/projects/members/effective_access_level_finder_spec.rb b/spec/finders/projects/members/effective_access_level_finder_spec.rb
index 1112dbd0d6e..33fbb5aca30 100644
--- a/spec/finders/projects/members/effective_access_level_finder_spec.rb
+++ b/spec/finders/projects/members/effective_access_level_finder_spec.rb
@@ -194,6 +194,7 @@ RSpec.describe Projects::Members::EffectiveAccessLevelFinder, '#execute' do
context 'for a project that is shared with other group(s)' do
let_it_be(:shared_with_group) { create(:group) }
let_it_be(:user_from_shared_with_group) { create(:user) }
+ let_it_be(:project) { create(:project, group: create(:group)) }
before do
create(:project_group_link, :developer, project: project, group: shared_with_group)
@@ -211,9 +212,24 @@ RSpec.describe Projects::Members::EffectiveAccessLevelFinder, '#execute' do
)
end
- context 'when the group containing the project has forbidden group shares for any of its projects' do
- let_it_be(:project) { create(:project, group: create(:group)) }
+ context 'even when the `lock_memberships_to_ldap` setting has been turned ON' do
+ before do
+ stub_application_setting(lock_memberships_to_ldap: true)
+ end
+ it 'includes the least among the specified access levels' do
+ expect(subject).to(
+ include(
+ hash_including(
+ 'user_id' => user_from_shared_with_group.id,
+ 'access_level' => Gitlab::Access::DEVELOPER
+ )
+ )
+ )
+ end
+ end
+
+ context 'when the group containing the project has forbidden group shares for any of its projects' do
before do
project.namespace.update!(share_with_group_lock: true)
end
diff --git a/spec/finders/projects/topics_finder_spec.rb b/spec/finders/projects/topics_finder_spec.rb
new file mode 100644
index 00000000000..28802c5d49e
--- /dev/null
+++ b/spec/finders/projects/topics_finder_spec.rb
@@ -0,0 +1,45 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Projects::TopicsFinder do
+ let_it_be(:user) { create(:user) }
+
+ let!(:topic1) { create(:topic, name: 'topicB') }
+ let!(:topic2) { create(:topic, name: 'topicC') }
+ let!(:topic3) { create(:topic, name: 'topicA') }
+
+ let!(:project1) { create(:project, namespace: user.namespace, topic_list: 'topicC, topicA, topicB') }
+ let!(:project2) { create(:project, namespace: user.namespace, topic_list: 'topicC, topicA') }
+ let!(:project3) { create(:project, namespace: user.namespace, topic_list: 'topicC') }
+
+ describe '#execute' do
+ it 'returns topics' do
+ topics = described_class.new.execute
+
+ expect(topics).to eq([topic2, topic3, topic1])
+ end
+
+ context 'filter by name' do
+ using RSpec::Parameterized::TableSyntax
+
+ where(:search, :result) do
+ 'topic' | %w[topicC topicA topicB]
+ 'pic' | %w[topicC topicA topicB]
+ 'B' | %w[]
+ 'cB' | %w[]
+ 'icB' | %w[topicB]
+ 'topicA' | %w[topicA]
+ 'topica' | %w[topicA]
+ end
+
+ with_them do
+ it 'returns filtered topics' do
+ topics = described_class.new(params: { search: search }).execute
+
+ expect(topics.map(&:name)).to eq(result)
+ end
+ end
+ end
+ end
+end
diff --git a/spec/finders/tags_finder_spec.rb b/spec/finders/tags_finder_spec.rb
index 08978a32e50..fe015d53ac9 100644
--- a/spec/finders/tags_finder_spec.rb
+++ b/spec/finders/tags_finder_spec.rb
@@ -3,93 +3,76 @@
require 'spec_helper'
RSpec.describe TagsFinder do
- let(:user) { create(:user) }
- let(:project) { create(:project, :repository) }
- let(:repository) { project.repository }
+ let_it_be(:user) { create(:user) }
+ let_it_be(:project) { create(:project, :repository) }
+ let_it_be(:repository) { project.repository }
+
+ def load_tags(params)
+ tags_finder = described_class.new(repository, params)
+ tags, error = tags_finder.execute
+
+ expect(error).to eq(nil)
+
+ tags
+ end
describe '#execute' do
context 'sort only' do
it 'sorts by name' do
- tags_finder = described_class.new(repository, {})
-
- result = tags_finder.execute
-
- expect(result.first.name).to eq("v1.0.0")
+ expect(load_tags({}).first.name).to eq("v1.0.0")
end
it 'sorts by recently_updated' do
- tags_finder = described_class.new(repository, { sort: 'updated_desc' })
-
- result = tags_finder.execute
recently_updated_tag = repository.tags.max do |a, b|
repository.commit(a.dereferenced_target).committed_date <=> repository.commit(b.dereferenced_target).committed_date
end
- expect(result.first.name).to eq(recently_updated_tag.name)
+ params = { sort: 'updated_desc' }
+
+ expect(load_tags(params).first.name).to eq(recently_updated_tag.name)
end
it 'sorts by last_updated' do
- tags_finder = described_class.new(repository, { sort: 'updated_asc' })
-
- result = tags_finder.execute
+ params = { sort: 'updated_asc' }
- expect(result.first.name).to eq('v1.0.0')
+ expect(load_tags(params).first.name).to eq('v1.0.0')
end
end
context 'filter only' do
it 'filters tags by name' do
- tags_finder = described_class.new(repository, { search: '1.0.0' })
-
- result = tags_finder.execute
+ result = load_tags({ search: '1.0.0' })
expect(result.first.name).to eq('v1.0.0')
expect(result.count).to eq(1)
end
it 'does not find any tags with that name' do
- tags_finder = described_class.new(repository, { search: 'hey' })
-
- result = tags_finder.execute
-
- expect(result.count).to eq(0)
+ expect(load_tags({ search: 'hey' }).count).to eq(0)
end
it 'filters tags by name that begins with' do
- params = { search: '^v1.0' }
- tags_finder = described_class.new(repository, params)
-
- result = tags_finder.execute
+ result = load_tags({ search: '^v1.0' })
expect(result.first.name).to eq('v1.0.0')
expect(result.count).to eq(1)
end
it 'filters tags by name that ends with' do
- params = { search: '0.0$' }
- tags_finder = described_class.new(repository, params)
-
- result = tags_finder.execute
+ result = load_tags({ search: '0.0$' })
expect(result.first.name).to eq('v1.0.0')
expect(result.count).to eq(1)
end
it 'filters tags by nonexistent name that begins with' do
- params = { search: '^nope' }
- tags_finder = described_class.new(repository, params)
-
- result = tags_finder.execute
+ result = load_tags({ search: '^nope' })
expect(result.count).to eq(0)
end
it 'filters tags by nonexistent name that ends with' do
- params = { search: 'nope$' }
- tags_finder = described_class.new(repository, params)
-
- result = tags_finder.execute
-
+ result = load_tags({ search: 'nope$' })
expect(result.count).to eq(0)
end
end
@@ -97,7 +80,7 @@ RSpec.describe TagsFinder do
context 'filter and sort' do
let(:tags_to_compare) { %w[v1.0.0 v1.1.0] }
- subject { described_class.new(repository, params).execute.select { |tag| tags_to_compare.include?(tag.name) } }
+ subject { load_tags(params).select { |tag| tags_to_compare.include?(tag.name) } }
context 'when sort by updated_desc' do
let(:params) { { sort: 'updated_desc', search: 'v1' } }
@@ -117,5 +100,17 @@ RSpec.describe TagsFinder do
end
end
end
+
+ context 'when Gitaly is unavailable' do
+ it 'returns empty list of tags' do
+ expect(Gitlab::GitalyClient).to receive(:call).and_raise(GRPC::Unavailable)
+
+ tags_finder = described_class.new(repository, {})
+ tags, error = tags_finder.execute
+
+ expect(error).to be_a(Gitlab::Git::CommandError)
+ expect(tags).to eq([])
+ end
+ end
end
end
diff --git a/spec/fixtures/api/schemas/entities/member.json b/spec/fixtures/api/schemas/entities/member.json
index f06687f9809..dec98123e85 100644
--- a/spec/fixtures/api/schemas/entities/member.json
+++ b/spec/fixtures/api/schemas/entities/member.json
@@ -56,13 +56,15 @@
{ "$ref": "member_user.json" }
]
},
+ "state": { "type": "integer" },
"invite": {
"type": "object",
- "required": ["email", "avatar_url", "can_resend"],
+ "required": ["email", "avatar_url", "can_resend", "user_state"],
"properties": {
"email": { "type": "string" },
"avatar_url": { "type": "string" },
- "can_resend": { "type": "boolean" }
+ "can_resend": { "type": "boolean" },
+ "user_state": { "type": "string" }
},
"additionalProperties": false
}
diff --git a/spec/fixtures/api/schemas/external_validation.json b/spec/fixtures/api/schemas/external_validation.json
index 280b77b221a..e95909a2922 100644
--- a/spec/fixtures/api/schemas/external_validation.json
+++ b/spec/fixtures/api/schemas/external_validation.json
@@ -34,7 +34,8 @@
"email": { "type": "string" },
"created_at": { "type": ["string", "null"], "format": "date-time" },
"current_sign_in_ip": { "type": ["string", "null"] },
- "last_sign_in_ip": { "type": ["string", "null"] }
+ "last_sign_in_ip": { "type": ["string", "null"] },
+ "sign_in_count": { "type": "integer" }
}
},
"pipeline": {
diff --git a/spec/fixtures/api/schemas/graphql/packages/package_details.json b/spec/fixtures/api/schemas/graphql/packages/package_details.json
index 9e8bf7c52d0..2824ca64325 100644
--- a/spec/fixtures/api/schemas/graphql/packages/package_details.json
+++ b/spec/fixtures/api/schemas/graphql/packages/package_details.json
@@ -13,7 +13,8 @@
"pipelines",
"versions",
"metadata",
- "status"
+ "status",
+ "canDestroy"
],
"properties": {
"id": {
@@ -31,6 +32,9 @@
"version": {
"type": ["string", "null"]
},
+ "canDestroy": {
+ "type": ["boolean"]
+ },
"packageType": {
"type": ["string"],
"enum": [
@@ -50,6 +54,7 @@
"type": "object",
"additionalProperties": false,
"properties": {
+ "count": { "type": "integer" },
"pageInfo": { "type": "object" },
"edges": { "type": "array" },
"nodes": { "type": "array" }
@@ -72,6 +77,7 @@
"type": "object",
"additionalProperties": false,
"properties": {
+ "count": { "type": "integer" },
"pageInfo": { "type": "object" },
"edges": { "type": "array" },
"nodes": { "type": "array" }
@@ -91,6 +97,7 @@
"type": "object",
"additionalProperties": false,
"properties": {
+ "count": { "type": "integer" },
"pageInfo": { "type": "object" },
"edges": { "type": "array" },
"nodes": { "type": "array" }
@@ -106,6 +113,7 @@
"properties": {
"pageInfo": { "type": "object" },
"edges": { "type": "array" },
+ "count": { "type": "integer" },
"nodes": {
"type": "array",
"items": {
diff --git a/spec/fixtures/api/schemas/public_api/v4/environment.json b/spec/fixtures/api/schemas/public_api/v4/environment.json
index b90bfe8de55..30104adaf5c 100644
--- a/spec/fixtures/api/schemas/public_api/v4/environment.json
+++ b/spec/fixtures/api/schemas/public_api/v4/environment.json
@@ -5,7 +5,9 @@
"name",
"slug",
"external_url",
- "last_deployment"
+ "state",
+ "created_at",
+ "updated_at"
],
"properties": {
"id": { "type": "integer" },
@@ -19,6 +21,9 @@
]
},
"state": { "type": "string" },
+ "created_at": { "type": "string", "format": "date-time" },
+ "updated_at": { "type": "string", "format": "date-time" },
+ "project": { "$ref": "project.json" },
"enable_advanced_logs_querying": { "type": "boolean" },
"logs_api_path": { "type": "string" },
"gitlab_managed_apps_logs_path": { "type": "string" }
diff --git a/spec/fixtures/api/schemas/public_api/v4/service.json b/spec/fixtures/api/schemas/public_api/v4/integration.json
index b6f13d1cfe7..b6f13d1cfe7 100644
--- a/spec/fixtures/api/schemas/public_api/v4/service.json
+++ b/spec/fixtures/api/schemas/public_api/v4/integration.json
diff --git a/spec/fixtures/api/schemas/public_api/v4/integrations.json b/spec/fixtures/api/schemas/public_api/v4/integrations.json
new file mode 100644
index 00000000000..e7ebe7652c9
--- /dev/null
+++ b/spec/fixtures/api/schemas/public_api/v4/integrations.json
@@ -0,0 +1,4 @@
+{
+ "type": "array",
+ "items": { "$ref": "integration.json" }
+}
diff --git a/spec/fixtures/api/schemas/public_api/v4/services.json b/spec/fixtures/api/schemas/public_api/v4/services.json
deleted file mode 100644
index 78c59ecfa10..00000000000
--- a/spec/fixtures/api/schemas/public_api/v4/services.json
+++ /dev/null
@@ -1,4 +0,0 @@
-{
- "type": "array",
- "items": { "$ref": "service.json" }
-}
diff --git a/spec/fixtures/lib/gitlab/import_export/complex/project.json b/spec/fixtures/lib/gitlab/import_export/complex/project.json
index 1072e63b20b..fd4c2d55124 100644
--- a/spec/fixtures/lib/gitlab/import_export/complex/project.json
+++ b/spec/fixtures/lib/gitlab/import_export/complex/project.json
@@ -7759,7 +7759,29 @@
"created_at": "2019-06-06T14:01:06.204Z",
"updated_at": "2019-06-06T14:22:37.045Z",
"name": "TestBoardABC",
- "milestone_id": null,
+ "milestone": {
+ "id": 1,
+ "title": "test milestone",
+ "project_id": 8,
+ "description": "test milestone",
+ "due_date": null,
+ "created_at": "2016-06-14T15:02:04.415Z",
+ "updated_at": "2016-06-14T15:02:04.415Z",
+ "state": "active",
+ "iid": 1,
+ "events": [
+ {
+ "id": 487,
+ "target_type": "Milestone",
+ "target_id": 1,
+ "project_id": 46,
+ "created_at": "2016-06-14T15:02:04.418Z",
+ "updated_at": "2016-06-14T15:02:04.418Z",
+ "action": 1,
+ "author_id": 18
+ }
+ ]
+ },
"group_id": null,
"weight": null,
"lists": [
@@ -7772,7 +7794,29 @@
"created_at": "2019-06-06T14:01:06.214Z",
"updated_at": "2019-06-06T14:01:06.214Z",
"user_id": null,
- "milestone_id": null
+ "milestone": {
+ "id": 1,
+ "title": "test milestone",
+ "project_id": 8,
+ "description": "test milestone",
+ "due_date": null,
+ "created_at": "2016-06-14T15:02:04.415Z",
+ "updated_at": "2016-06-14T15:02:04.415Z",
+ "state": "active",
+ "iid": 1,
+ "events": [
+ {
+ "id": 487,
+ "target_type": "Milestone",
+ "target_id": 1,
+ "project_id": 46,
+ "created_at": "2016-06-14T15:02:04.418Z",
+ "updated_at": "2016-06-14T15:02:04.418Z",
+ "action": 1,
+ "author_id": 18
+ }
+ ]
+ }
},
{
"id": 61,
@@ -7783,7 +7827,29 @@
"created_at": "2019-06-06T14:01:43.197Z",
"updated_at": "2019-06-06T14:01:43.197Z",
"user_id": null,
- "milestone_id": null,
+ "milestone": {
+ "id": 1,
+ "title": "test milestone",
+ "project_id": 8,
+ "description": "test milestone",
+ "due_date": null,
+ "created_at": "2016-06-14T15:02:04.415Z",
+ "updated_at": "2016-06-14T15:02:04.415Z",
+ "state": "active",
+ "iid": 1,
+ "events": [
+ {
+ "id": 487,
+ "target_type": "Milestone",
+ "target_id": 1,
+ "project_id": 46,
+ "created_at": "2016-06-14T15:02:04.418Z",
+ "updated_at": "2016-06-14T15:02:04.418Z",
+ "action": 1,
+ "author_id": 18
+ }
+ ]
+ },
"label": {
"id": 20,
"title": "testlabel",
@@ -7807,7 +7873,29 @@
"created_at": "2019-06-06T14:01:06.221Z",
"updated_at": "2019-06-06T14:01:06.221Z",
"user_id": null,
- "milestone_id": null
+ "milestone": {
+ "id": 1,
+ "title": "test milestone",
+ "project_id": 8,
+ "description": "test milestone",
+ "due_date": null,
+ "created_at": "2016-06-14T15:02:04.415Z",
+ "updated_at": "2016-06-14T15:02:04.415Z",
+ "state": "active",
+ "iid": 1,
+ "events": [
+ {
+ "id": 487,
+ "target_type": "Milestone",
+ "target_id": 1,
+ "project_id": 46,
+ "created_at": "2016-06-14T15:02:04.418Z",
+ "updated_at": "2016-06-14T15:02:04.418Z",
+ "action": 1,
+ "author_id": 18
+ }
+ ]
+ }
}
]
}
diff --git a/spec/fixtures/lib/gitlab/import_export/complex/tree/project.json b/spec/fixtures/lib/gitlab/import_export/complex/tree/project.json
index 203b0264f9e..2c5045ce806 100644
--- a/spec/fixtures/lib/gitlab/import_export/complex/tree/project.json
+++ b/spec/fixtures/lib/gitlab/import_export/complex/tree/project.json
@@ -1 +1,10 @@
-{"description":"Nisi et repellendus ut enim quo accusamus vel magnam.","import_type":"gitlab_project","creator_id":123,"visibility_level":10,"archived":false,"deploy_keys":[],"hooks":[]}
+{
+ "description": "Nisi et repellendus ut enim quo accusamus vel magnam.",
+ "import_type": "gitlab_project",
+ "creator_id": 123,
+ "visibility_level": 10,
+ "archived": false,
+ "deploy_keys": [],
+ "hooks": [],
+ "shared_runners_enabled": true
+}
diff --git a/spec/fixtures/lib/gitlab/import_export/complex/tree/project/boards.ndjson b/spec/fixtures/lib/gitlab/import_export/complex/tree/project/boards.ndjson
index ef18af69c9b..a63b583f087 100644
--- a/spec/fixtures/lib/gitlab/import_export/complex/tree/project/boards.ndjson
+++ b/spec/fixtures/lib/gitlab/import_export/complex/tree/project/boards.ndjson
@@ -1 +1 @@
-{"id":29,"project_id":49,"created_at":"2019-06-06T14:01:06.204Z","updated_at":"2019-06-06T14:22:37.045Z","name":"TestBoardABC","milestone_id":null,"group_id":null,"weight":null,"lists":[{"id":59,"board_id":29,"label_id":null,"list_type":"backlog","position":null,"created_at":"2019-06-06T14:01:06.214Z","updated_at":"2019-06-06T14:01:06.214Z","user_id":null,"milestone_id":null},{"id":61,"board_id":29,"label_id":20,"list_type":"label","position":0,"created_at":"2019-06-06T14:01:43.197Z","updated_at":"2019-06-06T14:01:43.197Z","user_id":null,"milestone_id":null,"label":{"id":20,"title":"testlabel","color":"#0033CC","project_id":49,"created_at":"2019-06-06T14:01:19.698Z","updated_at":"2019-06-06T14:01:19.698Z","template":false,"description":null,"group_id":null,"type":"ProjectLabel","priorities":[]}},{"id":60,"board_id":29,"label_id":null,"list_type":"closed","position":null,"created_at":"2019-06-06T14:01:06.221Z","updated_at":"2019-06-06T14:01:06.221Z","user_id":null,"milestone_id":null}]}
+{"id":29,"project_id":49,"created_at":"2019-06-06T14:01:06.204Z","updated_at":"2019-06-06T14:22:37.045Z","name":"TestBoardABC","group_id":null,"weight":null,"milestone":{"id":1,"title":"test milestone","project_id":8,"description":"test milestone","due_date":null,"created_at":"2016-06-14T15:02:04.415Z","updated_at":"2016-06-14T15:02:04.415Z","state":"active","iid":1,"events":[{"id":487,"target_type":"Milestone","target_id":1,"project_id":46,"created_at":"2016-06-14T15:02:04.418Z","updated_at":"2016-06-14T15:02:04.418Z","action":1,"author_id":18}]},"lists":[{"id":59,"board_id":29,"label_id":null,"list_type":"backlog","position":null,"created_at":"2019-06-06T14:01:06.214Z","updated_at":"2019-06-06T14:01:06.214Z","user_id":null,"milestone":{"id":1,"title":"test milestone","project_id":8,"description":"test milestone","due_date":null,"created_at":"2016-06-14T15:02:04.415Z","updated_at":"2016-06-14T15:02:04.415Z","state":"active","iid":1,"events":[{"id":487,"target_type":"Milestone","target_id":1,"project_id":46,"created_at":"2016-06-14T15:02:04.418Z","updated_at":"2016-06-14T15:02:04.418Z","action":1,"author_id":18}]}},{"id":61,"board_id":29,"label_id":20,"list_type":"label","position":0,"created_at":"2019-06-06T14:01:43.197Z","updated_at":"2019-06-06T14:01:43.197Z","user_id":null,"milestone":{"id":1,"title":"test milestone","project_id":8,"description":"test milestone","due_date":null,"created_at":"2016-06-14T15:02:04.415Z","updated_at":"2016-06-14T15:02:04.415Z","state":"active","iid":1,"events":[{"id":487,"target_type":"Milestone","target_id":1,"project_id":46,"created_at":"2016-06-14T15:02:04.418Z","updated_at":"2016-06-14T15:02:04.418Z","action":1,"author_id":18}]},"label":{"id":20,"title":"testlabel","color":"#0033CC","project_id":49,"created_at":"2019-06-06T14:01:19.698Z","updated_at":"2019-06-06T14:01:19.698Z","template":false,"description":null,"group_id":null,"type":"ProjectLabel","priorities":[]}},{"id":60,"board_id":29,"label_id":null,"list_type":"closed","position":null,"created_at":"2019-06-06T14:01:06.221Z","updated_at":"2019-06-06T14:01:06.221Z","user_id":null,"milestone":{"id":1,"title":"test milestone","project_id":8,"description":"test milestone","due_date":null,"created_at":"2016-06-14T15:02:04.415Z","updated_at":"2016-06-14T15:02:04.415Z","state":"active","iid":1,"events":[{"id":487,"target_type":"Milestone","target_id":1,"project_id":46,"created_at":"2016-06-14T15:02:04.418Z","updated_at":"2016-06-14T15:02:04.418Z","action":1,"author_id":18}]}}]}
diff --git a/spec/fixtures/lib/gitlab/performance_bar/peek_data.json b/spec/fixtures/lib/gitlab/performance_bar/peek_data.json
index c60e787ddb1..69512c52cbd 100644
--- a/spec/fixtures/lib/gitlab/performance_bar/peek_data.json
+++ b/spec/fixtures/lib/gitlab/performance_bar/peek_data.json
@@ -64,9 +64,90 @@
"warnings": []
},
"gitaly": {
- "duration": "0ms",
- "calls": 0,
- "details": [],
+ "duration": "30ms",
+ "calls": 2,
+ "details": [
+ {
+ "start": 6301.575665897,
+ "feature": "commit_service#get_tree_entries",
+ "duration": 23.709,
+ "request": "{:repository=>\n {:storage_name=>\"nfs-file-cny01\",\n :relative_path=>\n \"@hashed/a6/80/a68072e80f075e89bc74a300101a9e71e8363bdb542182580162553462480a52.git\",\n :git_object_directory=>\"\",\n :git_alternate_object_directories=>[],\n :gl_repository=>\"project-278964\",\n :gl_project_path=>\"gitlab-org/gitlab\"},\n :revision=>\"master\",\n :path=>\".\",\n :sort=>:TREES_FIRST,\n :pagination_params=>{:page_token=>\"\", :limit=>100}}\n",
+ "rpc": "get_tree_entries",
+ "backtrace": [
+ "lib/gitlab/gitaly_client/call.rb:48:in `block in instrument_stream'",
+ "lib/gitlab/gitaly_client/commit_service.rb:128:in `each'",
+ "lib/gitlab/gitaly_client/commit_service.rb:128:in `each'",
+ "lib/gitlab/gitaly_client/commit_service.rb:128:in `flat_map'",
+ "lib/gitlab/gitaly_client/commit_service.rb:128:in `tree_entries'",
+ "lib/gitlab/git/tree.rb:26:in `block in tree_entries'",
+ "lib/gitlab/git/wraps_gitaly_errors.rb:7:in `wrapped_gitaly_errors'",
+ "lib/gitlab/git/tree.rb:25:in `tree_entries'",
+ "lib/gitlab/git/rugged_impl/tree.rb:29:in `tree_entries'",
+ "lib/gitlab/git/tree.rb:21:in `where'",
+ "app/models/tree.rb:17:in `initialize'",
+ "app/models/repository.rb:681:in `new'",
+ "app/models/repository.rb:681:in `tree'",
+ "app/graphql/resolvers/paginated_tree_resolver.rb:35:in `resolve'",
+ "lib/gitlab/graphql/present/field_extension.rb:18:in `resolve'",
+ "lib/gitlab/graphql/extensions/externally_paginated_array_extension.rb:7:in `resolve'",
+ "lib/gitlab/graphql/generic_tracing.rb:40:in `with_labkit_tracing'",
+ "lib/gitlab/graphql/generic_tracing.rb:30:in `platform_trace'",
+ "lib/gitlab/graphql/generic_tracing.rb:40:in `with_labkit_tracing'",
+ "lib/gitlab/graphql/generic_tracing.rb:30:in `platform_trace'",
+ "lib/gitlab/graphql/generic_tracing.rb:40:in `with_labkit_tracing'",
+ "lib/gitlab/graphql/generic_tracing.rb:30:in `platform_trace'",
+ "app/graphql/gitlab_schema.rb:40:in `multiplex'",
+ "app/controllers/graphql_controller.rb:110:in `execute_multiplex'",
+ "app/controllers/graphql_controller.rb:41:in `execute'",
+ "ee/lib/gitlab/ip_address_state.rb:10:in `with'",
+ "ee/app/controllers/ee/application_controller.rb:44:in `set_current_ip_address'",
+ "app/controllers/application_controller.rb:497:in `set_current_admin'",
+ "lib/gitlab/session.rb:11:in `with_session'",
+ "app/controllers/application_controller.rb:488:in `set_session_storage'",
+ "app/controllers/application_controller.rb:482:in `set_locale'",
+ "app/controllers/application_controller.rb:476:in `set_current_context'",
+ "ee/lib/omni_auth/strategies/group_saml.rb:41:in `other_phase'",
+ "lib/gitlab/jira/middleware.rb:19:in `call'"
+ ],
+ "warnings": []
+ }, {
+ "start": 9081.502219885,
+ "feature": "commit_service#find_commit",
+ "duration": 6.678,
+ "request": "{:repository=>\n {:storage_name=>\"nfs-file-cny01\",\n :relative_path=>\n \"@hashed/a6/80/a68072e80f075e89bc74a300101a9e71e8363bdb542182580162553462480a52.git\",\n :git_object_directory=>\"\",\n :git_alternate_object_directories=>[],\n :gl_repository=>\"project-278964\",\n :gl_project_path=>\"gitlab-org/gitlab\"},\n :revision=>\"master\"}\n",
+ "rpc": "find_commit",
+ "backtrace": [
+ "lib/gitlab/gitaly_client/call.rb:30:in `call'",
+ "lib/gitlab/gitaly_client.rb:167:in `call'",
+ "lib/gitlab/gitaly_client/commit_service.rb:520:in `call_find_commit'",
+ "lib/gitlab/gitaly_client/commit_service.rb:354:in `find_commit'",
+ "lib/gitlab/git/commit.rb:74:in `block in find_commit'",
+ "lib/gitlab/git/wraps_gitaly_errors.rb:7:in `wrapped_gitaly_errors'",
+ "lib/gitlab/git/commit.rb:73:in `find_commit'",
+ "lib/gitlab/git/rugged_impl/commit.rb:41:in `find_commit'",
+ "lib/gitlab/git/commit.rb:65:in `find'",
+ "lib/gitlab/git/repository.rb:789:in `commit'",
+ "app/services/branches/diverging_commit_counts_service.rb:21:in `diverging_commit_counts'",
+ "app/services/branches/diverging_commit_counts_service.rb:11:in `call'",
+ "app/controllers/projects/branches_controller.rb:57:in `block (4 levels) in diverging_commit_counts'",
+ "app/controllers/projects/branches_controller.rb:57:in `to_h'",
+ "app/controllers/projects/branches_controller.rb:57:in `block (3 levels) in diverging_commit_counts'",
+ "lib/gitlab/gitaly_client.rb:325:in `allow_n_plus_1_calls'",
+ "app/controllers/projects/branches_controller.rb:56:in `block (2 levels) in diverging_commit_counts'",
+ "app/controllers/projects/branches_controller.rb:51:in `diverging_commit_counts'",
+ "ee/lib/gitlab/ip_address_state.rb:10:in `with'",
+ "ee/app/controllers/ee/application_controller.rb:44:in `set_current_ip_address'",
+ "app/controllers/application_controller.rb:497:in `set_current_admin'",
+ "lib/gitlab/session.rb:11:in `with_session'",
+ "app/controllers/application_controller.rb:488:in `set_session_storage'",
+ "app/controllers/application_controller.rb:482:in `set_locale'",
+ "app/controllers/application_controller.rb:476:in `set_current_context'",
+ "ee/lib/omni_auth/strategies/group_saml.rb:41:in `other_phase'",
+ "lib/gitlab/jira/middleware.rb:19:in `call'"
+ ],
+ "warnings": []
+ }
+ ],
"warnings": []
},
"redis": {
diff --git a/spec/fixtures/markdown.md.erb b/spec/fixtures/markdown.md.erb
index 100d17cc16e..2da16408fbc 100644
--- a/spec/fixtures/markdown.md.erb
+++ b/spec/fixtures/markdown.md.erb
@@ -52,6 +52,15 @@ Redcarpet supports this superscript syntax ( x^2 ).
This (C<sub>6</sub>H<sub>12</sub>O<sub>6</sub>) is an example of subscripts in Markdown.
+### Footnotes
+
+This is footnote 1.[^f1]
+
+A footnote with a `w` was failing.[^f2-w]
+
+[^f1]: Footnote 1
+[^f2-w]: Footnote with w
+
### Next step
After the Markdown has been turned into HTML, it gets passed through...
diff --git a/spec/fixtures/ssl/letsencrypt_expired_x3.pem b/spec/fixtures/ssl/letsencrypt_expired_x3.pem
new file mode 100644
index 00000000000..462df721ed7
--- /dev/null
+++ b/spec/fixtures/ssl/letsencrypt_expired_x3.pem
@@ -0,0 +1,98 @@
+-----BEGIN CERTIFICATE-----
+MIIGJDCCBQygAwIBAgISBOSAE/WwQGsTbDJI1vDL9+eKMA0GCSqGSIb3DQEBCwUA
+MDIxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MQswCQYDVQQD
+EwJSMzAeFw0yMTEwMDEyMjIxMTlaFw0yMTEyMzAyMjIxMThaMBkxFzAVBgNVBAMT
+DndlYmRpb3hpZGUuY29tMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA
+wf/TpE5AjzoLXMFQ+WHle7Dn5rlEe0bPee2JU386cZmMYnGFS5DR251FerSX28U4
+pqk2yS8oefHGi2PS6h8/MWxr+Zy/6hk3WkgwdIK3uPiUcfCdPV/btXDd4YqikEDm
+BoOE4fQlqKQwtLOnhEZu9y8FQoxxoQ+7DndHrDixDoMbpUloxpqUZwziQnH4QHXE
+32rQhq25+NUK/lVFGKOFnmZ2s/yUildKafqulHrLHOhumKMOEivzlFDZbtqP+RKt
+nsrJ3i9O+nSQz6j5dv3Du6eaResrtK7tT1MFDNhcg2cgjNW64VLXQdFXYXE1OYsw
+yAuXUnHNzWFhinyf80qeh2046YR21dlG8voIDQH4fGG5GmWLyu7glsWYVwQQ36VA
+TTxPmAoaqUTl8A7cnlJpAo+BJ00mS/9DwJ7pkgGC7dYOhJzWlI7lPqzEfmJ+o8pj
+CJlLIuqsn0vcCZQlmqCFMxK4asn+puLLnMjRLHIYEJKDNyPGHQEr2e5t4GUYZKaN
+MEpXMwJd97tUamUKWeBPNIND/kOuqexe+okbOTRp34VAsK5oCpawEJckoNkK+sv0
+OrSWFOdfLBHv66p9qsrz8LQXxmN5JUBUe51SBSUo1Ul4/vGYdhuKd/8KcLw9/Al+
+HJN2hAeo3v+2fVey4hgGna7XNe8e3+E+OEQb4zpQDLkCAwEAAaOCAkswggJHMA4G
+A1UdDwEB/wQEAwIFoDAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwDAYD
+VR0TAQH/BAIwADAdBgNVHQ4EFgQU4PbvqCKatjx6GZMXy7v9GwykZq4wHwYDVR0j
+BBgwFoAUFC6zF7dYVsuuUAlA5h+vnYsUwsYwVQYIKwYBBQUHAQEESTBHMCEGCCsG
+AQUFBzABhhVodHRwOi8vcjMuby5sZW5jci5vcmcwIgYIKwYBBQUHMAKGFmh0dHA6
+Ly9yMy5pLmxlbmNyLm9yZy8wGQYDVR0RBBIwEIIOd2ViZGlveGlkZS5jb20wTAYD
+VR0gBEUwQzAIBgZngQwBAgEwNwYLKwYBBAGC3xMBAQEwKDAmBggrBgEFBQcCARYa
+aHR0cDovL2Nwcy5sZXRzZW5jcnlwdC5vcmcwggEGBgorBgEEAdZ5AgQCBIH3BIH0
+APIAdwBc3EOS/uarRUSxXprUVuYQN/vV+kfcoXOUsl7m9scOygAAAXw+KYGHAAAE
+AwBIMEYCIQCqD6jMtHrGlE02Qh1FzFd4+qYzJTrChHmHBFIncPGQKAIhALeYk0Vf
+/Lw2tX2beVlKN4/h1o8srNJv+06xkr1N6XmiAHcAfT7y+I//iFVoJMLAyp5SiXkr
+xQ54CX8uapdomX4i8NcAAAF8PimBogAABAMASDBGAiEA0h883FFj1dSYKGym9+Wa
+XgJRj526X7YlkhkZ5J1TjioCIQDyjMPrbo5liVi/e5b8gfDw5Fd9WNiTu1W1LKKu
+UpE/qTANBgkqhkiG9w0BAQsFAAOCAQEAcx10nqp1kh2awwoqwf7Jo8Gycqx2bA2O
+E2rveQ/BK9UhwvrNeEpE9SG6liMsYJKxGar0vbbBHvxzuMU00bhGjXFtUT5XuQ8q
+FcU0OdycyZj8fjZmUNsJr82l8HvfJ50jfxFORTgj8Ln5MWVUFlbl0nD+06l28sDc
+V+r/B4394fkoMsKXtiTA4/ZeOD1tHNsdxQ7sNQtEfqCG0wFCYHK3rs7XTZ1K0F3c
+M051JShko1UKP/k5blrendOwVRwLtq+9pavGnJBeqNIVgugTER/IHlp4427WyhdY
+KYjKoytW+XQyWqxU/Mh/O4rxkD8cZaE+FdZpP67VZ185AuZMbn+LcQ==
+-----END CERTIFICATE-----
+
+-----BEGIN CERTIFICATE-----
+MIIFFjCCAv6gAwIBAgIRAJErCErPDBinU/bWLiWnX1owDQYJKoZIhvcNAQELBQAw
+TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh
+cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMjAwOTA0MDAwMDAw
+WhcNMjUwOTE1MTYwMDAwWjAyMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNTGV0J3Mg
+RW5jcnlwdDELMAkGA1UEAxMCUjMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK
+AoIBAQC7AhUozPaglNMPEuyNVZLD+ILxmaZ6QoinXSaqtSu5xUyxr45r+XXIo9cP
+R5QUVTVXjJ6oojkZ9YI8QqlObvU7wy7bjcCwXPNZOOftz2nwWgsbvsCUJCWH+jdx
+sxPnHKzhm+/b5DtFUkWWqcFTzjTIUu61ru2P3mBw4qVUq7ZtDpelQDRrK9O8Zutm
+NHz6a4uPVymZ+DAXXbpyb/uBxa3Shlg9F8fnCbvxK/eG3MHacV3URuPMrSXBiLxg
+Z3Vms/EY96Jc5lP/Ooi2R6X/ExjqmAl3P51T+c8B5fWmcBcUr2Ok/5mzk53cU6cG
+/kiFHaFpriV1uxPMUgP17VGhi9sVAgMBAAGjggEIMIIBBDAOBgNVHQ8BAf8EBAMC
+AYYwHQYDVR0lBBYwFAYIKwYBBQUHAwIGCCsGAQUFBwMBMBIGA1UdEwEB/wQIMAYB
+Af8CAQAwHQYDVR0OBBYEFBQusxe3WFbLrlAJQOYfr52LFMLGMB8GA1UdIwQYMBaA
+FHm0WeZ7tuXkAXOACIjIGlj26ZtuMDIGCCsGAQUFBwEBBCYwJDAiBggrBgEFBQcw
+AoYWaHR0cDovL3gxLmkubGVuY3Iub3JnLzAnBgNVHR8EIDAeMBygGqAYhhZodHRw
+Oi8veDEuYy5sZW5jci5vcmcvMCIGA1UdIAQbMBkwCAYGZ4EMAQIBMA0GCysGAQQB
+gt8TAQEBMA0GCSqGSIb3DQEBCwUAA4ICAQCFyk5HPqP3hUSFvNVneLKYY611TR6W
+PTNlclQtgaDqw+34IL9fzLdwALduO/ZelN7kIJ+m74uyA+eitRY8kc607TkC53wl
+ikfmZW4/RvTZ8M6UK+5UzhK8jCdLuMGYL6KvzXGRSgi3yLgjewQtCPkIVz6D2QQz
+CkcheAmCJ8MqyJu5zlzyZMjAvnnAT45tRAxekrsu94sQ4egdRCnbWSDtY7kh+BIm
+lJNXoB1lBMEKIq4QDUOXoRgffuDghje1WrG9ML+Hbisq/yFOGwXD9RiX8F6sw6W4
+avAuvDszue5L3sz85K+EC4Y/wFVDNvZo4TYXao6Z0f+lQKc0t8DQYzk1OXVu8rp2
+yJMC6alLbBfODALZvYH7n7do1AZls4I9d1P4jnkDrQoxB3UqQ9hVl3LEKQ73xF1O
+yK5GhDDX8oVfGKF5u+decIsH4YaTw7mP3GFxJSqv3+0lUFJoi5Lc5da149p90Ids
+hCExroL1+7mryIkXPeFM5TgO9r0rvZaBFOvV2z0gp35Z0+L4WPlbuEjN/lxPFin+
+HlUjr8gRsI3qfJOQFy/9rKIJR0Y/8Omwt/8oTWgy1mdeHmmjk7j1nYsvC9JSQ6Zv
+MldlTTKB3zhThV1+XWYp6rjd5JW1zbVWEkLNxE7GJThEUG3szgBVGP7pSWTUTsqX
+nLRbwHOoq7hHwg==
+-----END CERTIFICATE-----
+
+-----BEGIN CERTIFICATE-----
+MIIFYDCCBEigAwIBAgIQQAF3ITfU6UK47naqPGQKtzANBgkqhkiG9w0BAQsFADA/
+MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMT
+DkRTVCBSb290IENBIFgzMB4XDTIxMDEyMDE5MTQwM1oXDTI0MDkzMDE4MTQwM1ow
+TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh
+cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwggIiMA0GCSqGSIb3DQEB
+AQUAA4ICDwAwggIKAoICAQCt6CRz9BQ385ueK1coHIe+3LffOJCMbjzmV6B493XC
+ov71am72AE8o295ohmxEk7axY/0UEmu/H9LqMZshftEzPLpI9d1537O4/xLxIZpL
+wYqGcWlKZmZsj348cL+tKSIG8+TA5oCu4kuPt5l+lAOf00eXfJlII1PoOK5PCm+D
+LtFJV4yAdLbaL9A4jXsDcCEbdfIwPPqPrt3aY6vrFk/CjhFLfs8L6P+1dy70sntK
+4EwSJQxwjQMpoOFTJOwT2e4ZvxCzSow/iaNhUd6shweU9GNx7C7ib1uYgeGJXDR5
+bHbvO5BieebbpJovJsXQEOEO3tkQjhb7t/eo98flAgeYjzYIlefiN5YNNnWe+w5y
+sR2bvAP5SQXYgd0FtCrWQemsAXaVCg/Y39W9Eh81LygXbNKYwagJZHduRze6zqxZ
+Xmidf3LWicUGQSk+WT7dJvUkyRGnWqNMQB9GoZm1pzpRboY7nn1ypxIFeFntPlF4
+FQsDj43QLwWyPntKHEtzBRL8xurgUBN8Q5N0s8p0544fAQjQMNRbcTa0B7rBMDBc
+SLeCO5imfWCKoqMpgsy6vYMEG6KDA0Gh1gXxG8K28Kh8hjtGqEgqiNx2mna/H2ql
+PRmP6zjzZN7IKw0KKP/32+IVQtQi0Cdd4Xn+GOdwiK1O5tmLOsbdJ1Fu/7xk9TND
+TwIDAQABo4IBRjCCAUIwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYw
+SwYIKwYBBQUHAQEEPzA9MDsGCCsGAQUFBzAChi9odHRwOi8vYXBwcy5pZGVudHJ1
+c3QuY29tL3Jvb3RzL2RzdHJvb3RjYXgzLnA3YzAfBgNVHSMEGDAWgBTEp7Gkeyxx
++tvhS5B1/8QVYIWJEDBUBgNVHSAETTBLMAgGBmeBDAECATA/BgsrBgEEAYLfEwEB
+ATAwMC4GCCsGAQUFBwIBFiJodHRwOi8vY3BzLnJvb3QteDEubGV0c2VuY3J5cHQu
+b3JnMDwGA1UdHwQ1MDMwMaAvoC2GK2h0dHA6Ly9jcmwuaWRlbnRydXN0LmNvbS9E
+U1RST09UQ0FYM0NSTC5jcmwwHQYDVR0OBBYEFHm0WeZ7tuXkAXOACIjIGlj26Ztu
+MA0GCSqGSIb3DQEBCwUAA4IBAQAKcwBslm7/DlLQrt2M51oGrS+o44+/yQoDFVDC
+5WxCu2+b9LRPwkSICHXM6webFGJueN7sJ7o5XPWioW5WlHAQU7G75K/QosMrAdSW
+9MUgNTP52GE24HGNtLi1qoJFlcDyqSMo59ahy2cI2qBDLKobkx/J3vWraV0T9VuG
+WCLKTVXkcGdtwlfFRjlBz4pYg1htmf5X6DYO8A4jqv2Il9DjXA6USbW1FzXSLr9O
+he8Y4IWS6wY7bCkjCWDcRQJMEhg76fsO3txE+FiYruq9RUWhiF1myv4Q6W+CyBFC
+Dfvp7OOGAN6dEOM4+qR9sdjoSYKEBpsr6GtPAQw4dy753ec5
+-----END CERTIFICATE-----
diff --git a/spec/frontend/.eslintrc.yml b/spec/frontend/.eslintrc.yml
index 145e6c8961a..e12c4e5e820 100644
--- a/spec/frontend/.eslintrc.yml
+++ b/spec/frontend/.eslintrc.yml
@@ -12,7 +12,6 @@ settings:
jest:
jestConfigFile: 'jest.config.js'
globals:
- getJSONFixture: false
loadFixtures: false
setFixtures: false
rules:
@@ -26,4 +25,9 @@ rules:
- off
"@gitlab/no-global-event-off":
- off
-
+ import/no-unresolved:
+ - error
+ # The test fixtures and graphql schema are dynamically generated in CI
+ # during the `frontend-fixtures` and `graphql-schema-dump` jobs.
+ # They may not be present during linting.
+ - ignore: ['^test_fixtures\/', 'tmp/tests/graphql/gitlab_schema.graphql']
diff --git a/spec/frontend/__helpers__/fixtures.js b/spec/frontend/__helpers__/fixtures.js
index 4b86724df93..d8054d32fae 100644
--- a/spec/frontend/__helpers__/fixtures.js
+++ b/spec/frontend/__helpers__/fixtures.js
@@ -20,6 +20,11 @@ Did you run bin/rake frontend:fixtures?`,
return fs.readFileSync(absolutePath, 'utf8');
}
+/**
+ * @deprecated Use `import` to load a JSON fixture instead.
+ * See https://docs.gitlab.com/ee/development/testing_guide/frontend_testing.html#use-fixtures,
+ * https://gitlab.com/gitlab-org/gitlab/-/issues/339346.
+ */
export const getJSONFixture = (relativePath) => JSON.parse(getFixture(relativePath));
export const resetHTMLFixture = () => {
diff --git a/spec/frontend/__helpers__/flush_promises.js b/spec/frontend/__helpers__/flush_promises.js
new file mode 100644
index 00000000000..5287a060753
--- /dev/null
+++ b/spec/frontend/__helpers__/flush_promises.js
@@ -0,0 +1,3 @@
+export default function flushPromises() {
+ return new Promise(setImmediate);
+}
diff --git a/spec/frontend/access_tokens/components/projects_token_selector_spec.js b/spec/frontend/access_tokens/components/projects_token_selector_spec.js
index 09f52fe9a5f..40aaf16d41f 100644
--- a/spec/frontend/access_tokens/components/projects_token_selector_spec.js
+++ b/spec/frontend/access_tokens/components/projects_token_selector_spec.js
@@ -11,7 +11,7 @@ import produce from 'immer';
import Vue from 'vue';
import VueApollo from 'vue-apollo';
-import { getJSONFixture } from 'helpers/fixtures';
+import getProjectsQueryResponse from 'test_fixtures/graphql/projects/access_tokens/get_projects.query.graphql.json';
import createMockApollo from 'helpers/mock_apollo_helper';
import { extendedWrapper } from 'helpers/vue_test_utils_helper';
import waitForPromises from 'helpers/wait_for_promises';
@@ -20,9 +20,6 @@ import getProjectsQuery from '~/access_tokens/graphql/queries/get_projects.query
import { getIdFromGraphQLId } from '~/graphql_shared/utils';
describe('ProjectsTokenSelector', () => {
- const getProjectsQueryResponse = getJSONFixture(
- 'graphql/projects/access_tokens/get_projects.query.graphql.json',
- );
const getProjectsQueryResponsePage2 = produce(
getProjectsQueryResponse,
(getProjectsQueryResponseDraft) => {
diff --git a/spec/frontend/add_context_commits_modal/components/add_context_commits_modal_spec.js b/spec/frontend/add_context_commits_modal/components/add_context_commits_modal_spec.js
index 2832de98769..e7a20ae114c 100644
--- a/spec/frontend/add_context_commits_modal/components/add_context_commits_modal_spec.js
+++ b/spec/frontend/add_context_commits_modal/components/add_context_commits_modal_spec.js
@@ -1,12 +1,12 @@
import { GlModal, GlSearchBoxByType } from '@gitlab/ui';
import { shallowMount, createLocalVue } from '@vue/test-utils';
import Vuex from 'vuex';
+import getDiffWithCommit from 'test_fixtures/merge_request_diffs/with_commit.json';
import AddReviewItemsModal from '~/add_context_commits_modal/components/add_context_commits_modal_wrapper.vue';
import * as actions from '~/add_context_commits_modal/store/actions';
import mutations from '~/add_context_commits_modal/store/mutations';
import defaultState from '~/add_context_commits_modal/store/state';
-import getDiffWithCommit from '../../diffs/mock_data/diff_with_commit';
const localVue = createLocalVue();
localVue.use(Vuex);
@@ -18,7 +18,7 @@ describe('AddContextCommitsModal', () => {
const removeContextCommits = jest.fn();
const resetModalState = jest.fn();
const searchCommits = jest.fn();
- const { commit } = getDiffWithCommit();
+ const { commit } = getDiffWithCommit;
const createWrapper = (props = {}) => {
store = new Vuex.Store({
diff --git a/spec/frontend/add_context_commits_modal/components/review_tab_container_spec.js b/spec/frontend/add_context_commits_modal/components/review_tab_container_spec.js
index 75f1cc41e23..85ecb4313c2 100644
--- a/spec/frontend/add_context_commits_modal/components/review_tab_container_spec.js
+++ b/spec/frontend/add_context_commits_modal/components/review_tab_container_spec.js
@@ -1,12 +1,12 @@
import { GlLoadingIcon } from '@gitlab/ui';
import { shallowMount } from '@vue/test-utils';
+import getDiffWithCommit from 'test_fixtures/merge_request_diffs/with_commit.json';
import ReviewTabContainer from '~/add_context_commits_modal/components/review_tab_container.vue';
import CommitItem from '~/diffs/components/commit_item.vue';
-import getDiffWithCommit from '../../diffs/mock_data/diff_with_commit';
describe('ReviewTabContainer', () => {
let wrapper;
- const { commit } = getDiffWithCommit();
+ const { commit } = getDiffWithCommit;
const createWrapper = (props = {}) => {
wrapper = shallowMount(ReviewTabContainer, {
diff --git a/spec/frontend/add_context_commits_modal/store/mutations_spec.js b/spec/frontend/add_context_commits_modal/store/mutations_spec.js
index 2331a4af1bc..7517c1c391e 100644
--- a/spec/frontend/add_context_commits_modal/store/mutations_spec.js
+++ b/spec/frontend/add_context_commits_modal/store/mutations_spec.js
@@ -1,10 +1,10 @@
+import getDiffWithCommit from 'test_fixtures/merge_request_diffs/with_commit.json';
import { TEST_HOST } from 'helpers/test_constants';
import * as types from '~/add_context_commits_modal/store/mutation_types';
import mutations from '~/add_context_commits_modal/store/mutations';
-import getDiffWithCommit from '../../diffs/mock_data/diff_with_commit';
describe('AddContextCommitsModalStoreMutations', () => {
- const { commit } = getDiffWithCommit();
+ const { commit } = getDiffWithCommit;
describe('SET_BASE_CONFIG', () => {
it('should set contextCommitsPath, mergeRequestIid and projectId', () => {
const state = {};
diff --git a/spec/frontend/admin/signup_restrictions/components/signup_form_spec.js b/spec/frontend/admin/signup_restrictions/components/signup_form_spec.js
index 4bb22feb913..5b4f954b672 100644
--- a/spec/frontend/admin/signup_restrictions/components/signup_form_spec.js
+++ b/spec/frontend/admin/signup_restrictions/components/signup_form_spec.js
@@ -35,9 +35,6 @@ describe('Signup Form', () => {
const findDenyListRawInputGroup = () => wrapper.findByTestId('domain-denylist-raw-input-group');
const findDenyListFileInputGroup = () => wrapper.findByTestId('domain-denylist-file-input-group');
-
- const findRequireAdminApprovalCheckbox = () =>
- wrapper.findByTestId('require-admin-approval-checkbox');
const findUserCapInput = () => wrapper.findByTestId('user-cap-input');
const findModal = () => wrapper.find(GlModal);
@@ -191,125 +188,6 @@ describe('Signup Form', () => {
});
describe('form submit button confirmation modal for side-effect of adding possibly unwanted new users', () => {
- it.each`
- requireAdminApprovalAction | userCapAction | pendingUserCount | buttonEffect
- ${'unchanged from true'} | ${'unchanged'} | ${0} | ${'submits form'}
- ${'unchanged from false'} | ${'unchanged'} | ${0} | ${'submits form'}
- ${'toggled off'} | ${'unchanged'} | ${1} | ${'shows confirmation modal'}
- ${'toggled off'} | ${'unchanged'} | ${0} | ${'submits form'}
- ${'toggled on'} | ${'unchanged'} | ${0} | ${'submits form'}
- ${'unchanged from false'} | ${'increased'} | ${1} | ${'shows confirmation modal'}
- ${'unchanged from true'} | ${'increased'} | ${0} | ${'submits form'}
- ${'toggled off'} | ${'increased'} | ${1} | ${'shows confirmation modal'}
- ${'toggled off'} | ${'increased'} | ${0} | ${'submits form'}
- ${'toggled on'} | ${'increased'} | ${1} | ${'shows confirmation modal'}
- ${'toggled on'} | ${'increased'} | ${0} | ${'submits form'}
- ${'toggled on'} | ${'decreased'} | ${0} | ${'submits form'}
- ${'toggled on'} | ${'decreased'} | ${1} | ${'submits form'}
- ${'unchanged from false'} | ${'changed from limited to unlimited'} | ${1} | ${'shows confirmation modal'}
- ${'unchanged from false'} | ${'changed from limited to unlimited'} | ${0} | ${'submits form'}
- ${'unchanged from false'} | ${'changed from unlimited to limited'} | ${0} | ${'submits form'}
- ${'unchanged from false'} | ${'unchanged from unlimited'} | ${0} | ${'submits form'}
- `(
- '$buttonEffect if require admin approval for new sign-ups is $requireAdminApprovalAction and the user cap is $userCapAction and pending user count is $pendingUserCount',
- async ({ requireAdminApprovalAction, userCapAction, pendingUserCount, buttonEffect }) => {
- let isModalDisplayed;
-
- switch (buttonEffect) {
- case 'shows confirmation modal':
- isModalDisplayed = true;
- break;
- case 'submits form':
- isModalDisplayed = false;
- break;
- default:
- isModalDisplayed = false;
- break;
- }
-
- const isFormSubmittedWhenClickingFormSubmitButton = !isModalDisplayed;
-
- const injectedProps = {
- pendingUserCount,
- };
-
- const USER_CAP_DEFAULT = 5;
-
- switch (userCapAction) {
- case 'changed from unlimited to limited':
- injectedProps.newUserSignupsCap = '';
- break;
- case 'unchanged from unlimited':
- injectedProps.newUserSignupsCap = '';
- break;
- default:
- injectedProps.newUserSignupsCap = USER_CAP_DEFAULT;
- break;
- }
-
- switch (requireAdminApprovalAction) {
- case 'unchanged from true':
- injectedProps.requireAdminApprovalAfterUserSignup = true;
- break;
- case 'unchanged from false':
- injectedProps.requireAdminApprovalAfterUserSignup = false;
- break;
- case 'toggled off':
- injectedProps.requireAdminApprovalAfterUserSignup = true;
- break;
- case 'toggled on':
- injectedProps.requireAdminApprovalAfterUserSignup = false;
- break;
- default:
- injectedProps.requireAdminApprovalAfterUserSignup = false;
- break;
- }
-
- formSubmitSpy = jest.spyOn(HTMLFormElement.prototype, 'submit').mockImplementation();
-
- await mountComponent({
- injectedProps,
- stubs: { GlButton, GlModal: stubComponent(GlModal) },
- });
-
- findModal().vm.show = jest.fn();
-
- if (
- requireAdminApprovalAction === 'toggled off' ||
- requireAdminApprovalAction === 'toggled on'
- ) {
- await findRequireAdminApprovalCheckbox().vm.$emit('input', false);
- }
-
- switch (userCapAction) {
- case 'increased':
- await findUserCapInput().vm.$emit('input', USER_CAP_DEFAULT + 1);
- break;
- case 'decreased':
- await findUserCapInput().vm.$emit('input', USER_CAP_DEFAULT - 1);
- break;
- case 'changed from limited to unlimited':
- await findUserCapInput().vm.$emit('input', '');
- break;
- case 'changed from unlimited to limited':
- await findUserCapInput().vm.$emit('input', USER_CAP_DEFAULT);
- break;
- default:
- break;
- }
-
- await findFormSubmitButton().trigger('click');
-
- if (isFormSubmittedWhenClickingFormSubmitButton) {
- expect(formSubmitSpy).toHaveBeenCalled();
- expect(findModal().vm.show).not.toHaveBeenCalled();
- } else {
- expect(formSubmitSpy).not.toHaveBeenCalled();
- expect(findModal().vm.show).toHaveBeenCalled();
- }
- },
- );
-
describe('modal actions', () => {
beforeEach(async () => {
const INITIAL_USER_CAP = 5;
diff --git a/spec/frontend/admin/users/components/actions/actions_spec.js b/spec/frontend/admin/users/components/actions/actions_spec.js
index fd05b08a3fb..67dcf5c6149 100644
--- a/spec/frontend/admin/users/components/actions/actions_spec.js
+++ b/spec/frontend/admin/users/components/actions/actions_spec.js
@@ -5,6 +5,7 @@ import { nextTick } from 'vue';
import Actions from '~/admin/users/components/actions';
import SharedDeleteAction from '~/admin/users/components/actions/shared/shared_delete_action.vue';
import { capitalizeFirstCharacter } from '~/lib/utils/text_utility';
+import { OBSTACLE_TYPES } from '~/vue_shared/components/user_deletion_obstacles/constants';
import { CONFIRMATION_ACTIONS, DELETE_ACTIONS } from '../../constants';
import { paths } from '../../mock_data';
@@ -46,7 +47,10 @@ describe('Action components', () => {
});
describe('DELETE_ACTION_COMPONENTS', () => {
- const oncallSchedules = [{ name: 'schedule1' }, { name: 'schedule2' }];
+ const userDeletionObstacles = [
+ { name: 'schedule1', type: OBSTACLE_TYPES.oncallSchedules },
+ { name: 'policy1', type: OBSTACLE_TYPES.escalationPolicies },
+ ];
it.each(DELETE_ACTIONS.map((action) => [action, paths[action]]))(
'renders a dropdown item for "%s"',
@@ -56,7 +60,7 @@ describe('Action components', () => {
props: {
username: 'John Doe',
paths,
- oncallSchedules,
+ userDeletionObstacles,
},
stubs: { SharedDeleteAction },
});
@@ -69,8 +73,8 @@ describe('Action components', () => {
expect(sharedAction.attributes('data-delete-user-url')).toBe(expectedPath);
expect(sharedAction.attributes('data-gl-modal-action')).toBe(kebabCase(action));
expect(sharedAction.attributes('data-username')).toBe('John Doe');
- expect(sharedAction.attributes('data-oncall-schedules')).toBe(
- JSON.stringify(oncallSchedules),
+ expect(sharedAction.attributes('data-user-deletion-obstacles')).toBe(
+ JSON.stringify(userDeletionObstacles),
);
expect(findDropdownItem().exists()).toBe(true);
},
diff --git a/spec/frontend/admin/users/components/modals/__snapshots__/delete_user_modal_spec.js.snap b/spec/frontend/admin/users/components/modals/__snapshots__/delete_user_modal_spec.js.snap
index 5e367891337..472158a9b10 100644
--- a/spec/frontend/admin/users/components/modals/__snapshots__/delete_user_modal_spec.js.snap
+++ b/spec/frontend/admin/users/components/modals/__snapshots__/delete_user_modal_spec.js.snap
@@ -8,8 +8,8 @@ exports[`User Operation confirmation modal renders modal with form included 1`]
/>
</p>
- <oncall-schedules-list-stub
- schedules="schedule1,schedule2"
+ <user-deletion-obstacles-list-stub
+ obstacles="schedule1,policy1"
username="username"
/>
diff --git a/spec/frontend/admin/users/components/modals/delete_user_modal_spec.js b/spec/frontend/admin/users/components/modals/delete_user_modal_spec.js
index fee74764645..82307c9e3b3 100644
--- a/spec/frontend/admin/users/components/modals/delete_user_modal_spec.js
+++ b/spec/frontend/admin/users/components/modals/delete_user_modal_spec.js
@@ -1,7 +1,7 @@
import { GlButton, GlFormInput } from '@gitlab/ui';
import { shallowMount } from '@vue/test-utils';
import DeleteUserModal from '~/admin/users/components/modals/delete_user_modal.vue';
-import OncallSchedulesList from '~/vue_shared/components/oncall_schedules_list.vue';
+import UserDeletionObstaclesList from '~/vue_shared/components/user_deletion_obstacles/user_deletion_obstacles_list.vue';
import ModalStub from './stubs/modal_stub';
const TEST_DELETE_USER_URL = 'delete-url';
@@ -25,7 +25,7 @@ describe('User Operation confirmation modal', () => {
const getUsername = () => findUsernameInput().attributes('value');
const getMethodParam = () => new FormData(findForm().element).get('_method');
const getFormAction = () => findForm().attributes('action');
- const findOnCallSchedulesList = () => wrapper.findComponent(OncallSchedulesList);
+ const findUserDeletionObstaclesList = () => wrapper.findComponent(UserDeletionObstaclesList);
const setUsername = (username) => {
findUsernameInput().vm.$emit('input', username);
@@ -33,7 +33,7 @@ describe('User Operation confirmation modal', () => {
const username = 'username';
const badUsername = 'bad_username';
- const oncallSchedules = '["schedule1", "schedule2"]';
+ const userDeletionObstacles = '["schedule1", "policy1"]';
const createComponent = (props = {}) => {
wrapper = shallowMount(DeleteUserModal, {
@@ -46,7 +46,7 @@ describe('User Operation confirmation modal', () => {
deleteUserUrl: TEST_DELETE_USER_URL,
blockUserUrl: TEST_BLOCK_USER_URL,
csrfToken: TEST_CSRF,
- oncallSchedules,
+ userDeletionObstacles,
...props,
},
stubs: {
@@ -150,18 +150,18 @@ describe('User Operation confirmation modal', () => {
});
});
- describe('Related oncall-schedules list', () => {
- it('does NOT render the list when user has no related schedules', () => {
- createComponent({ oncallSchedules: '[]' });
- expect(findOnCallSchedulesList().exists()).toBe(false);
+ describe('Related user-deletion-obstacles list', () => {
+ it('does NOT render the list when user has no related obstacles', () => {
+ createComponent({ userDeletionObstacles: '[]' });
+ expect(findUserDeletionObstaclesList().exists()).toBe(false);
});
- it('renders the list when user has related schedules', () => {
+ it('renders the list when user has related obstalces', () => {
createComponent();
- const schedules = findOnCallSchedulesList();
- expect(schedules.exists()).toBe(true);
- expect(schedules.props('schedules')).toEqual(JSON.parse(oncallSchedules));
+ const obstacles = findUserDeletionObstaclesList();
+ expect(obstacles.exists()).toBe(true);
+ expect(obstacles.props('obstacles')).toEqual(JSON.parse(userDeletionObstacles));
});
});
});
diff --git a/spec/frontend/alerts_settings/components/__snapshots__/alerts_form_spec.js.snap b/spec/frontend/alerts_settings/components/__snapshots__/alerts_form_spec.js.snap
index ddb188edb10..f4d3fd97fd8 100644
--- a/spec/frontend/alerts_settings/components/__snapshots__/alerts_form_spec.js.snap
+++ b/spec/frontend/alerts_settings/components/__snapshots__/alerts_form_spec.js.snap
@@ -52,13 +52,13 @@ exports[`Alert integration settings form default state should match the default
block="true"
category="primary"
clearalltext="Clear all"
+ clearalltextclass="gl-px-5"
data-qa-selector="incident_templates_dropdown"
headertext=""
hideheaderborder="true"
highlighteditemstitle="Selected"
highlighteditemstitleclass="gl-px-5"
id="alert-integration-settings-issue-template"
- showhighlighteditemstitle="true"
size="medium"
text="selecte_tmpl"
variant="default"
diff --git a/spec/frontend/analytics/shared/components/projects_dropdown_filter_spec.js b/spec/frontend/analytics/shared/components/projects_dropdown_filter_spec.js
index 2537b8fb816..5d681c7da4f 100644
--- a/spec/frontend/analytics/shared/components/projects_dropdown_filter_spec.js
+++ b/spec/frontend/analytics/shared/components/projects_dropdown_filter_spec.js
@@ -1,6 +1,8 @@
import { GlDropdown, GlDropdownItem } from '@gitlab/ui';
-import { mount } from '@vue/test-utils';
+import { mountExtended } from 'helpers/vue_test_utils_helper';
+import { stubComponent } from 'helpers/stub_component';
import { TEST_HOST } from 'helpers/test_constants';
+import waitForPromises from 'helpers/wait_for_promises';
import ProjectsDropdownFilter from '~/analytics/shared/components/projects_dropdown_filter.vue';
import getProjects from '~/analytics/shared/graphql/projects.query.graphql';
@@ -25,6 +27,17 @@ const projects = [
},
];
+const MockGlDropdown = stubComponent(GlDropdown, {
+ template: `
+ <div>
+ <div data-testid="vsa-highlighted-items">
+ <slot name="highlighted-items"></slot>
+ </div>
+ <div data-testid="vsa-default-items"><slot></slot></div>
+ </div>
+ `,
+});
+
const defaultMocks = {
$apollo: {
query: jest.fn().mockResolvedValue({
@@ -38,22 +51,33 @@ let spyQuery;
describe('ProjectsDropdownFilter component', () => {
let wrapper;
- const createComponent = (props = {}) => {
+ const createComponent = (props = {}, stubs = {}) => {
spyQuery = defaultMocks.$apollo.query;
- wrapper = mount(ProjectsDropdownFilter, {
+ wrapper = mountExtended(ProjectsDropdownFilter, {
mocks: { ...defaultMocks },
propsData: {
groupId: 1,
groupNamespace: 'gitlab-org',
...props,
},
+ stubs,
});
};
+ const createWithMockDropdown = (props) => {
+ createComponent(props, { GlDropdown: MockGlDropdown });
+ return waitForPromises();
+ };
+
afterEach(() => {
wrapper.destroy();
});
+ const findHighlightedItems = () => wrapper.findByTestId('vsa-highlighted-items');
+ const findUnhighlightedItems = () => wrapper.findByTestId('vsa-default-items');
+ const findHighlightedItemsTitle = () => wrapper.findByText('Selected');
+ const findClearAllButton = () => wrapper.findByText('Clear all');
+
const findDropdown = () => wrapper.find(GlDropdown);
const findDropdownItems = () =>
@@ -75,8 +99,19 @@ describe('ProjectsDropdownFilter component', () => {
const findDropdownFullPathAtIndex = (index) =>
findDropdownAtIndex(index).find('[data-testid="project-full-path"]');
- const selectDropdownItemAtIndex = (index) =>
+ const selectDropdownItemAtIndex = (index) => {
findDropdownAtIndex(index).find('button').trigger('click');
+ return wrapper.vm.$nextTick();
+ };
+
+ // NOTE: Selected items are now visually separated from unselected items
+ const findSelectedDropdownItems = () => findHighlightedItems().findAll(GlDropdownItem);
+
+ const findSelectedDropdownAtIndex = (index) => findSelectedDropdownItems().at(index);
+ const findSelectedButtonIdentIconAtIndex = (index) =>
+ findSelectedDropdownAtIndex(index).find('div.gl-avatar-identicon');
+ const findSelectedButtonAvatarItemAtIndex = (index) =>
+ findSelectedDropdownAtIndex(index).find('img.gl-avatar');
const selectedIds = () => wrapper.vm.selectedProjects.map(({ id }) => id);
@@ -109,7 +144,80 @@ describe('ProjectsDropdownFilter component', () => {
});
});
- describe('when passed a an array of defaultProject as prop', () => {
+ describe('highlighted items', () => {
+ const blockDefaultProps = { multiSelect: true };
+ beforeEach(() => {
+ createComponent(blockDefaultProps);
+ });
+
+ describe('with no project selected', () => {
+ it('does not render the highlighted items', async () => {
+ await createWithMockDropdown(blockDefaultProps);
+ expect(findSelectedDropdownItems().length).toBe(0);
+ });
+
+ it('does not render the highlighted items title', () => {
+ expect(findHighlightedItemsTitle().exists()).toBe(false);
+ });
+
+ it('does not render the clear all button', () => {
+ expect(findClearAllButton().exists()).toBe(false);
+ });
+ });
+
+ describe('with a selected project', () => {
+ beforeEach(async () => {
+ await selectDropdownItemAtIndex(0);
+ });
+
+ it('renders the highlighted items', async () => {
+ await createWithMockDropdown(blockDefaultProps);
+ await selectDropdownItemAtIndex(0);
+
+ expect(findSelectedDropdownItems().length).toBe(1);
+ });
+
+ it('renders the highlighted items title', () => {
+ expect(findHighlightedItemsTitle().exists()).toBe(true);
+ });
+
+ it('renders the clear all button', () => {
+ expect(findClearAllButton().exists()).toBe(true);
+ });
+
+ it('clears all selected items when the clear all button is clicked', async () => {
+ await selectDropdownItemAtIndex(1);
+
+ expect(wrapper.text()).toContain('2 projects selected');
+
+ findClearAllButton().trigger('click');
+ await wrapper.vm.$nextTick();
+
+ expect(wrapper.text()).not.toContain('2 projects selected');
+ expect(wrapper.text()).toContain('Select projects');
+ });
+ });
+ });
+
+ describe('with a selected project and search term', () => {
+ beforeEach(async () => {
+ await createWithMockDropdown({ multiSelect: true });
+
+ selectDropdownItemAtIndex(0);
+ wrapper.setData({ searchTerm: 'this is a very long search string' });
+ });
+
+ it('renders the highlighted items', async () => {
+ expect(findUnhighlightedItems().findAll('li').length).toBe(1);
+ });
+
+ it('hides the unhighlighted items that do not match the string', async () => {
+ expect(findUnhighlightedItems().findAll('li').length).toBe(1);
+ expect(findUnhighlightedItems().text()).toContain('No matching results');
+ });
+ });
+
+ describe('when passed an array of defaultProject as prop', () => {
beforeEach(() => {
createComponent({
defaultProjects: [projects[0]],
@@ -130,8 +238,9 @@ describe('ProjectsDropdownFilter component', () => {
});
describe('when multiSelect is false', () => {
+ const blockDefaultProps = { multiSelect: false };
beforeEach(() => {
- createComponent({ multiSelect: false });
+ createComponent(blockDefaultProps);
});
describe('displays the correct information', () => {
@@ -183,21 +292,19 @@ describe('ProjectsDropdownFilter component', () => {
});
it('renders an avatar in the dropdown button when the project has an avatarUrl', async () => {
- selectDropdownItemAtIndex(0);
+ await createWithMockDropdown(blockDefaultProps);
+ await selectDropdownItemAtIndex(0);
- await wrapper.vm.$nextTick().then(() => {
- expect(findDropdownButtonAvatarAtIndex(0).exists()).toBe(true);
- expect(findDropdownButtonIdentIconAtIndex(0).exists()).toBe(false);
- });
+ expect(findSelectedButtonAvatarItemAtIndex(0).exists()).toBe(true);
+ expect(findSelectedButtonIdentIconAtIndex(0).exists()).toBe(false);
});
it("renders an identicon in the dropdown button when the project doesn't have an avatarUrl", async () => {
- selectDropdownItemAtIndex(1);
+ await createWithMockDropdown(blockDefaultProps);
+ await selectDropdownItemAtIndex(1);
- await wrapper.vm.$nextTick().then(() => {
- expect(findDropdownButtonAvatarAtIndex(1).exists()).toBe(false);
- expect(findDropdownButtonIdentIconAtIndex(1).exists()).toBe(true);
- });
+ expect(findSelectedButtonAvatarItemAtIndex(0).exists()).toBe(false);
+ expect(findSelectedButtonIdentIconAtIndex(0).exists()).toBe(true);
});
});
});
diff --git a/spec/frontend/analytics/shared/utils_spec.js b/spec/frontend/analytics/shared/utils_spec.js
index e3293f2d8bd..0513ccb2890 100644
--- a/spec/frontend/analytics/shared/utils_spec.js
+++ b/spec/frontend/analytics/shared/utils_spec.js
@@ -1,4 +1,10 @@
-import { filterBySearchTerm } from '~/analytics/shared/utils';
+import {
+ filterBySearchTerm,
+ extractFilterQueryParameters,
+ extractPaginationQueryParameters,
+ getDataZoomOption,
+} from '~/analytics/shared/utils';
+import { objectToQuery } from '~/lib/utils/url_utility';
describe('filterBySearchTerm', () => {
const data = [
@@ -22,3 +28,151 @@ describe('filterBySearchTerm', () => {
expect(filterBySearchTerm(data, 'ne', 'title')).toEqual([data[0]]);
});
});
+
+describe('extractFilterQueryParameters', () => {
+ const selectedAuthor = 'Author 1';
+ const selectedMilestone = 'Milestone 1.0';
+ const selectedSourceBranch = 'main';
+ const selectedTargetBranch = 'feature-1';
+ const selectedAssigneeList = ['Alice', 'Bob'];
+ const selectedLabelList = ['Label 1', 'Label 2'];
+
+ const queryParamsString = objectToQuery({
+ source_branch_name: selectedSourceBranch,
+ target_branch_name: selectedTargetBranch,
+ author_username: selectedAuthor,
+ milestone_title: selectedMilestone,
+ assignee_username: selectedAssigneeList,
+ label_name: selectedLabelList,
+ });
+
+ it('extracts the correct filter parameters from a url', () => {
+ const result = extractFilterQueryParameters(queryParamsString);
+ const operator = '=';
+ const expectedFilters = {
+ selectedAssigneeList: { operator, value: selectedAssigneeList.join(',') },
+ selectedLabelList: { operator, value: selectedLabelList.join(',') },
+ selectedAuthor: { operator, value: selectedAuthor },
+ selectedMilestone: { operator, value: selectedMilestone },
+ selectedSourceBranch: { operator, value: selectedSourceBranch },
+ selectedTargetBranch: { operator, value: selectedTargetBranch },
+ };
+ expect(result).toMatchObject(expectedFilters);
+ });
+
+ it('returns null for missing parameters', () => {
+ const result = extractFilterQueryParameters('');
+ const expectedFilters = {
+ selectedAuthor: null,
+ selectedMilestone: null,
+ selectedSourceBranch: null,
+ selectedTargetBranch: null,
+ };
+ expect(result).toMatchObject(expectedFilters);
+ });
+
+ it('only returns the parameters we expect', () => {
+ const result = extractFilterQueryParameters('foo="one"&bar="two"');
+ const resultKeys = Object.keys(result);
+ ['foo', 'bar'].forEach((key) => {
+ expect(resultKeys).not.toContain(key);
+ });
+
+ [
+ 'selectedAuthor',
+ 'selectedMilestone',
+ 'selectedSourceBranch',
+ 'selectedTargetBranch',
+ 'selectedAssigneeList',
+ 'selectedLabelList',
+ ].forEach((key) => {
+ expect(resultKeys).toContain(key);
+ });
+ });
+
+ it('returns an empty array for missing list parameters', () => {
+ const result = extractFilterQueryParameters('');
+ const expectedFilters = { selectedAssigneeList: [], selectedLabelList: [] };
+ expect(result).toMatchObject(expectedFilters);
+ });
+});
+
+describe('extractPaginationQueryParameters', () => {
+ const sort = 'title';
+ const direction = 'asc';
+ const page = '1';
+ const queryParamsString = objectToQuery({ sort, direction, page });
+
+ it('extracts the correct filter parameters from a url', () => {
+ const result = extractPaginationQueryParameters(queryParamsString);
+ const expectedFilters = { sort, page, direction };
+ expect(result).toMatchObject(expectedFilters);
+ });
+
+ it('returns null for missing parameters', () => {
+ const result = extractPaginationQueryParameters('');
+ const expectedFilters = { sort: null, direction: null, page: null };
+ expect(result).toMatchObject(expectedFilters);
+ });
+
+ it('only returns the parameters we expect', () => {
+ const result = extractPaginationQueryParameters('foo="one"&bar="two"&qux="three"');
+ const resultKeys = Object.keys(result);
+ ['foo', 'bar', 'qux'].forEach((key) => {
+ expect(resultKeys).not.toContain(key);
+ });
+
+ ['sort', 'page', 'direction'].forEach((key) => {
+ expect(resultKeys).toContain(key);
+ });
+ });
+});
+
+describe('getDataZoomOption', () => {
+ it('returns an empty object when totalItems <= maxItemsPerPage', () => {
+ const totalItems = 10;
+ const maxItemsPerPage = 20;
+
+ expect(getDataZoomOption({ totalItems, maxItemsPerPage })).toEqual({});
+ });
+
+ describe('when totalItems > maxItemsPerPage', () => {
+ const totalItems = 30;
+ const maxItemsPerPage = 20;
+
+ it('properly computes the end interval for the default datazoom config', () => {
+ const expected = [
+ {
+ type: 'slider',
+ bottom: 10,
+ start: 0,
+ end: 67,
+ },
+ ];
+
+ expect(getDataZoomOption({ totalItems, maxItemsPerPage })).toEqual(expected);
+ });
+
+ it('properly computes the end interval for a custom datazoom config', () => {
+ const dataZoom = [
+ { type: 'slider', bottom: 0, start: 0 },
+ { type: 'inside', start: 0 },
+ ];
+ const expected = [
+ {
+ type: 'slider',
+ bottom: 0,
+ start: 0,
+ end: 67,
+ },
+ {
+ type: 'inside',
+ start: 0,
+ end: 67,
+ },
+ ];
+
+ expect(getDataZoomOption({ totalItems, maxItemsPerPage, dataZoom })).toEqual(expected);
+ });
+ });
+});
diff --git a/spec/frontend/authentication/two_factor_auth/components/manage_two_factor_form_spec.js b/spec/frontend/authentication/two_factor_auth/components/manage_two_factor_form_spec.js
index 61c6a1dd167..870375318e3 100644
--- a/spec/frontend/authentication/two_factor_auth/components/manage_two_factor_form_spec.js
+++ b/spec/frontend/authentication/two_factor_auth/components/manage_two_factor_form_spec.js
@@ -1,5 +1,5 @@
-import { GlForm } from '@gitlab/ui';
import { within } from '@testing-library/dom';
+import { GlForm } from '@gitlab/ui';
import { mount } from '@vue/test-utils';
import { extendedWrapper } from 'helpers/vue_test_utils_helper';
import ManageTwoFactorForm, {
diff --git a/spec/frontend/blob/file_template_mediator_spec.js b/spec/frontend/blob/file_template_mediator_spec.js
new file mode 100644
index 00000000000..44e12deb564
--- /dev/null
+++ b/spec/frontend/blob/file_template_mediator_spec.js
@@ -0,0 +1,53 @@
+import TemplateSelectorMediator from '~/blob/file_template_mediator';
+
+describe('Template Selector Mediator', () => {
+ let mediator;
+
+ describe('setFilename', () => {
+ let input;
+ const newFileName = 'foo';
+ const editor = jest.fn().mockImplementationOnce(() => ({
+ getValue: jest.fn().mockImplementation(() => {}),
+ }))();
+
+ beforeEach(() => {
+ setFixtures('<div class="file-editor"><input class="js-file-path-name-input" /></div>');
+ input = document.querySelector('.js-file-path-name-input');
+ mediator = new TemplateSelectorMediator({
+ editor,
+ currentAction: jest.fn(),
+ projectId: jest.fn(),
+ });
+ });
+
+ it('fills out the input field', () => {
+ expect(input.value).toBe('');
+ mediator.setFilename(newFileName);
+ expect(input.value).toBe(newFileName);
+ });
+
+ it.each`
+ name | newName | shouldDispatch
+ ${newFileName} | ${newFileName} | ${false}
+ ${newFileName} | ${''} | ${true}
+ ${newFileName} | ${undefined} | ${false}
+ ${''} | ${''} | ${false}
+ ${''} | ${newFileName} | ${true}
+ ${''} | ${undefined} | ${false}
+ `(
+ 'correctly reacts to the name change when current name is $name and newName is $newName',
+ ({ name, newName, shouldDispatch }) => {
+ input.value = name;
+ const eventHandler = jest.fn();
+ input.addEventListener('change', eventHandler);
+
+ mediator.setFilename(newName);
+ if (shouldDispatch) {
+ expect(eventHandler).toHaveBeenCalledTimes(1);
+ } else {
+ expect(eventHandler).not.toHaveBeenCalled();
+ }
+ },
+ );
+ });
+});
diff --git a/spec/frontend/boards/components/board_add_new_column_trigger_spec.js b/spec/frontend/boards/components/board_add_new_column_trigger_spec.js
new file mode 100644
index 00000000000..c35f2463f69
--- /dev/null
+++ b/spec/frontend/boards/components/board_add_new_column_trigger_spec.js
@@ -0,0 +1,59 @@
+import { GlButton } from '@gitlab/ui';
+import Vue from 'vue';
+import Vuex from 'vuex';
+import { mountExtended } from 'helpers/vue_test_utils_helper';
+import BoardAddNewColumnTrigger from '~/boards/components/board_add_new_column_trigger.vue';
+import { createStore } from '~/boards/stores';
+import { createMockDirective, getBinding } from 'helpers/vue_mock_directive';
+
+Vue.use(Vuex);
+
+describe('BoardAddNewColumnTrigger', () => {
+ let wrapper;
+
+ const findBoardsCreateList = () => wrapper.findByTestId('boards-create-list');
+ const findTooltipText = () => getBinding(findBoardsCreateList().element, 'gl-tooltip');
+
+ const mountComponent = () => {
+ wrapper = mountExtended(BoardAddNewColumnTrigger, {
+ directives: {
+ GlTooltip: createMockDirective(),
+ },
+ store: createStore(),
+ });
+ };
+
+ beforeEach(() => {
+ mountComponent();
+ });
+
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ describe('when button is active', () => {
+ it('does not show the tooltip', () => {
+ const tooltip = findTooltipText();
+
+ expect(tooltip.value).toBe('');
+ });
+
+ it('renders an enabled button', () => {
+ const button = wrapper.find(GlButton);
+
+ expect(button.props('disabled')).toBe(false);
+ });
+ });
+
+ describe('when button is disabled', () => {
+ it('shows the tooltip', async () => {
+ wrapper.find(GlButton).vm.$emit('click');
+
+ await wrapper.vm.$nextTick();
+
+ const tooltip = findTooltipText();
+
+ expect(tooltip.value).toBe('The list creation wizard is already open');
+ });
+ });
+});
diff --git a/spec/frontend/boards/stores/actions_spec.js b/spec/frontend/boards/stores/actions_spec.js
index 62e0fa7a68a..0b90912a584 100644
--- a/spec/frontend/boards/stores/actions_spec.js
+++ b/spec/frontend/boards/stores/actions_spec.js
@@ -21,9 +21,10 @@ import {
getMoveData,
updateListPosition,
} from '~/boards/boards_util';
+import { gqlClient } from '~/boards/graphql';
import destroyBoardListMutation from '~/boards/graphql/board_list_destroy.mutation.graphql';
import issueCreateMutation from '~/boards/graphql/issue_create.mutation.graphql';
-import actions, { gqlClient } from '~/boards/stores/actions';
+import actions from '~/boards/stores/actions';
import * as types from '~/boards/stores/mutation_types';
import mutations from '~/boards/stores/mutations';
@@ -1331,20 +1332,54 @@ describe('addListItem', () => {
list: mockLists[0],
item: mockIssue,
position: 0,
+ inProgress: true,
};
- testAction(actions.addListItem, payload, {}, [
- {
- type: types.ADD_BOARD_ITEM_TO_LIST,
- payload: {
- listId: mockLists[0].id,
- itemId: mockIssue.id,
- atIndex: 0,
- inProgress: false,
+ testAction(
+ actions.addListItem,
+ payload,
+ {},
+ [
+ {
+ type: types.ADD_BOARD_ITEM_TO_LIST,
+ payload: {
+ listId: mockLists[0].id,
+ itemId: mockIssue.id,
+ atIndex: 0,
+ inProgress: true,
+ },
},
- },
- { type: types.UPDATE_BOARD_ITEM, payload: mockIssue },
- ]);
+ { type: types.UPDATE_BOARD_ITEM, payload: mockIssue },
+ ],
+ [],
+ );
+ });
+
+ it('should commit ADD_BOARD_ITEM_TO_LIST and UPDATE_BOARD_ITEM mutations, dispatch setActiveId action when inProgress is false', () => {
+ const payload = {
+ list: mockLists[0],
+ item: mockIssue,
+ position: 0,
+ };
+
+ testAction(
+ actions.addListItem,
+ payload,
+ {},
+ [
+ {
+ type: types.ADD_BOARD_ITEM_TO_LIST,
+ payload: {
+ listId: mockLists[0].id,
+ itemId: mockIssue.id,
+ atIndex: 0,
+ inProgress: false,
+ },
+ },
+ { type: types.UPDATE_BOARD_ITEM, payload: mockIssue },
+ ],
+ [{ type: 'setActiveId', payload: { id: mockIssue.id, sidebarType: ISSUABLE } }],
+ );
});
});
@@ -1542,7 +1577,7 @@ describe('setActiveIssueLabels', () => {
projectPath: 'h/b',
};
- it('should assign labels on success', (done) => {
+ it('should assign labels on success, and sets loading state for labels', (done) => {
jest
.spyOn(gqlClient, 'mutate')
.mockResolvedValue({ data: { updateIssue: { issue: { labels: { nodes: labels } } } } });
@@ -1559,6 +1594,14 @@ describe('setActiveIssueLabels', () => {
{ ...state, ...getters },
[
{
+ type: types.SET_LABELS_LOADING,
+ payload: true,
+ },
+ {
+ type: types.SET_LABELS_LOADING,
+ payload: false,
+ },
+ {
type: types.UPDATE_BOARD_ITEM_BY_ID,
payload,
},
diff --git a/spec/frontend/clusters/agents/components/show_spec.js b/spec/frontend/clusters/agents/components/show_spec.js
new file mode 100644
index 00000000000..fd04ff8b3e7
--- /dev/null
+++ b/spec/frontend/clusters/agents/components/show_spec.js
@@ -0,0 +1,195 @@
+import { GlAlert, GlKeysetPagination, GlLoadingIcon, GlSprintf, GlTab } from '@gitlab/ui';
+import { createLocalVue, shallowMount } from '@vue/test-utils';
+import VueApollo from 'vue-apollo';
+import ClusterAgentShow from '~/clusters/agents/components/show.vue';
+import TokenTable from '~/clusters/agents/components/token_table.vue';
+import getAgentQuery from '~/clusters/agents/graphql/queries/get_cluster_agent.query.graphql';
+import { useFakeDate } from 'helpers/fake_date';
+import createMockApollo from 'helpers/mock_apollo_helper';
+import waitForPromises from 'helpers/wait_for_promises';
+import TimeAgoTooltip from '~/vue_shared/components/time_ago_tooltip.vue';
+
+const localVue = createLocalVue();
+localVue.use(VueApollo);
+
+describe('ClusterAgentShow', () => {
+ let wrapper;
+ useFakeDate([2021, 2, 15]);
+
+ const propsData = {
+ agentName: 'cluster-agent',
+ projectPath: 'path/to/project',
+ };
+
+ const defaultClusterAgent = {
+ id: '1',
+ createdAt: '2021-02-13T00:00:00Z',
+ createdByUser: {
+ name: 'user-1',
+ },
+ name: 'token-1',
+ tokens: {
+ count: 1,
+ nodes: [],
+ pageInfo: null,
+ },
+ };
+
+ const createWrapper = ({ clusterAgent, queryResponse = null }) => {
+ const agentQueryResponse =
+ queryResponse || jest.fn().mockResolvedValue({ data: { project: { clusterAgent } } });
+ const apolloProvider = createMockApollo([[getAgentQuery, agentQueryResponse]]);
+
+ wrapper = shallowMount(ClusterAgentShow, {
+ localVue,
+ apolloProvider,
+ propsData,
+ stubs: { GlSprintf, TimeAgoTooltip, GlTab },
+ });
+ };
+
+ const createWrapperWithoutApollo = ({ clusterAgent, loading = false }) => {
+ const $apollo = { queries: { clusterAgent: { loading } } };
+
+ wrapper = shallowMount(ClusterAgentShow, {
+ propsData,
+ mocks: { $apollo, clusterAgent },
+ stubs: { GlTab },
+ });
+ };
+
+ const findCreatedText = () => wrapper.find('[data-testid="cluster-agent-create-info"]').text();
+ const findLoadingIcon = () => wrapper.find(GlLoadingIcon);
+ const findPaginationButtons = () => wrapper.find(GlKeysetPagination);
+ const findTokenCount = () => wrapper.find('[data-testid="cluster-agent-token-count"]').text();
+
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ describe('default behaviour', () => {
+ beforeEach(() => {
+ return createWrapper({ clusterAgent: defaultClusterAgent });
+ });
+
+ it('displays the agent name', () => {
+ expect(wrapper.text()).toContain(propsData.agentName);
+ });
+
+ it('displays agent create information', () => {
+ expect(findCreatedText()).toMatchInterpolatedText('Created by user-1 2 days ago');
+ });
+
+ it('displays token count', () => {
+ expect(findTokenCount()).toMatchInterpolatedText(
+ `${ClusterAgentShow.i18n.tokens} ${defaultClusterAgent.tokens.count}`,
+ );
+ });
+
+ it('renders token table', () => {
+ expect(wrapper.find(TokenTable).exists()).toBe(true);
+ });
+
+ it('should not render pagination buttons when there are no additional pages', () => {
+ expect(findPaginationButtons().exists()).toBe(false);
+ });
+ });
+
+ describe('when create user is unknown', () => {
+ const missingUser = {
+ ...defaultClusterAgent,
+ createdByUser: null,
+ };
+
+ beforeEach(() => {
+ return createWrapper({ clusterAgent: missingUser });
+ });
+
+ it('displays agent create information with unknown user', () => {
+ expect(findCreatedText()).toMatchInterpolatedText('Created by Unknown user 2 days ago');
+ });
+ });
+
+ describe('when token count is missing', () => {
+ const missingTokens = {
+ ...defaultClusterAgent,
+ tokens: null,
+ };
+
+ beforeEach(() => {
+ return createWrapper({ clusterAgent: missingTokens });
+ });
+
+ it('displays token header with no count', () => {
+ expect(findTokenCount()).toMatchInterpolatedText(`${ClusterAgentShow.i18n.tokens}`);
+ });
+ });
+
+ describe('when the token list has additional pages', () => {
+ const pageInfo = {
+ hasNextPage: true,
+ hasPreviousPage: false,
+ startCursor: 'prev',
+ endCursor: 'next',
+ };
+
+ const tokenPagination = {
+ ...defaultClusterAgent,
+ tokens: {
+ ...defaultClusterAgent.tokens,
+ pageInfo,
+ },
+ };
+
+ beforeEach(() => {
+ return createWrapper({ clusterAgent: tokenPagination });
+ });
+
+ it('should render pagination buttons', () => {
+ expect(findPaginationButtons().exists()).toBe(true);
+ });
+
+ it('should pass pageInfo to the pagination component', () => {
+ expect(findPaginationButtons().props()).toMatchObject(pageInfo);
+ });
+ });
+
+ describe('when the agent query is loading', () => {
+ describe('when the clusterAgent is missing', () => {
+ beforeEach(() => {
+ return createWrapper({
+ clusterAgent: null,
+ queryResponse: jest.fn().mockReturnValue(new Promise(() => {})),
+ });
+ });
+
+ it('displays a loading icon and hides the token tab', () => {
+ expect(findLoadingIcon().exists()).toBe(true);
+ expect(wrapper.text()).not.toContain(ClusterAgentShow.i18n.tokens);
+ });
+ });
+
+ describe('when the clusterAgent is present', () => {
+ beforeEach(() => {
+ createWrapperWithoutApollo({ clusterAgent: defaultClusterAgent, loading: true });
+ });
+
+ it('displays a loading icon and token tab', () => {
+ expect(findLoadingIcon().exists()).toBe(true);
+ expect(wrapper.text()).toContain(ClusterAgentShow.i18n.tokens);
+ });
+ });
+ });
+
+ describe('when the agent query has errored', () => {
+ beforeEach(() => {
+ createWrapper({ clusterAgent: null, queryResponse: jest.fn().mockRejectedValue() });
+ return waitForPromises();
+ });
+
+ it('displays an alert message', () => {
+ expect(wrapper.find(GlAlert).exists()).toBe(true);
+ expect(wrapper.text()).toContain(ClusterAgentShow.i18n.loadingError);
+ });
+ });
+});
diff --git a/spec/frontend/clusters/agents/components/token_table_spec.js b/spec/frontend/clusters/agents/components/token_table_spec.js
new file mode 100644
index 00000000000..47ff944dd84
--- /dev/null
+++ b/spec/frontend/clusters/agents/components/token_table_spec.js
@@ -0,0 +1,135 @@
+import { GlEmptyState, GlLink, GlTooltip, GlTruncate } from '@gitlab/ui';
+import { mount } from '@vue/test-utils';
+import TokenTable from '~/clusters/agents/components/token_table.vue';
+import { useFakeDate } from 'helpers/fake_date';
+import { extendedWrapper } from 'helpers/vue_test_utils_helper';
+
+describe('ClusterAgentTokenTable', () => {
+ let wrapper;
+ useFakeDate([2021, 2, 15]);
+
+ const defaultTokens = [
+ {
+ id: '1',
+ createdAt: '2021-02-13T00:00:00Z',
+ description: 'Description of token 1',
+ createdByUser: {
+ name: 'user-1',
+ },
+ lastUsedAt: '2021-02-13T00:00:00Z',
+ name: 'token-1',
+ },
+ {
+ id: '2',
+ createdAt: '2021-02-10T00:00:00Z',
+ description: null,
+ createdByUser: null,
+ lastUsedAt: null,
+ name: 'token-2',
+ },
+ ];
+
+ const createComponent = (tokens) => {
+ wrapper = extendedWrapper(mount(TokenTable, { propsData: { tokens } }));
+ };
+
+ const findEmptyState = () => wrapper.find(GlEmptyState);
+ const findLink = () => wrapper.find(GlLink);
+
+ beforeEach(() => {
+ return createComponent(defaultTokens);
+ });
+
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ it('displays a learn more link', () => {
+ const learnMoreLink = findLink();
+
+ expect(learnMoreLink.exists()).toBe(true);
+ expect(learnMoreLink.text()).toBe(TokenTable.i18n.learnMore);
+ });
+
+ it.each`
+ name | lineNumber
+ ${'token-1'} | ${0}
+ ${'token-2'} | ${1}
+ `('displays token name "$name" for line "$lineNumber"', ({ name, lineNumber }) => {
+ const tokens = wrapper.findAll('[data-testid="agent-token-name"]');
+ const token = tokens.at(lineNumber);
+
+ expect(token.text()).toBe(name);
+ });
+
+ it.each`
+ lastContactText | lineNumber
+ ${'2 days ago'} | ${0}
+ ${'Never'} | ${1}
+ `(
+ 'displays last contact information "$lastContactText" for line "$lineNumber"',
+ ({ lastContactText, lineNumber }) => {
+ const tokens = wrapper.findAllByTestId('agent-token-used');
+ const token = tokens.at(lineNumber);
+
+ expect(token.text()).toBe(lastContactText);
+ },
+ );
+
+ it.each`
+ createdText | lineNumber
+ ${'2 days ago'} | ${0}
+ ${'5 days ago'} | ${1}
+ `(
+ 'displays created information "$createdText" for line "$lineNumber"',
+ ({ createdText, lineNumber }) => {
+ const tokens = wrapper.findAll('[data-testid="agent-token-created-time"]');
+ const token = tokens.at(lineNumber);
+
+ expect(token.text()).toBe(createdText);
+ },
+ );
+
+ it.each`
+ createdBy | lineNumber
+ ${'user-1'} | ${0}
+ ${'Unknown user'} | ${1}
+ `(
+ 'displays creator information "$createdBy" for line "$lineNumber"',
+ ({ createdBy, lineNumber }) => {
+ const tokens = wrapper.findAll('[data-testid="agent-token-created-user"]');
+ const token = tokens.at(lineNumber);
+
+ expect(token.text()).toBe(createdBy);
+ },
+ );
+
+ it.each`
+ description | truncatesText | hasTooltip | lineNumber
+ ${'Description of token 1'} | ${true} | ${true} | ${0}
+ ${''} | ${false} | ${false} | ${1}
+ `(
+ 'displays description information "$description" for line "$lineNumber"',
+ ({ description, truncatesText, hasTooltip, lineNumber }) => {
+ const tokens = wrapper.findAll('[data-testid="agent-token-description"]');
+ const token = tokens.at(lineNumber);
+
+ expect(token.text()).toContain(description);
+ expect(token.find(GlTruncate).exists()).toBe(truncatesText);
+ expect(token.find(GlTooltip).exists()).toBe(hasTooltip);
+ },
+ );
+
+ describe('when there are no tokens', () => {
+ beforeEach(() => {
+ return createComponent([]);
+ });
+
+ it('displays an empty state', () => {
+ const emptyState = findEmptyState();
+
+ expect(emptyState.exists()).toBe(true);
+ expect(emptyState.text()).toContain(TokenTable.i18n.noTokens);
+ });
+ });
+});
diff --git a/spec/frontend/clusters/components/__snapshots__/remove_cluster_confirmation_spec.js.snap b/spec/frontend/clusters/components/__snapshots__/remove_cluster_confirmation_spec.js.snap
index b34265b7234..42d81900911 100644
--- a/spec/frontend/clusters/components/__snapshots__/remove_cluster_confirmation_spec.js.snap
+++ b/spec/frontend/clusters/components/__snapshots__/remove_cluster_confirmation_spec.js.snap
@@ -33,7 +33,7 @@ exports[`Remove cluster confirmation modal renders splitbutton with modal includ
<span
class="sr-only"
>
- Toggle Dropdown
+ Toggle dropdown
</span>
</button>
<ul
@@ -46,21 +46,7 @@ exports[`Remove cluster confirmation modal renders splitbutton with modal includ
>
<!---->
- <div
- class="gl-display-flex gl-flex-direction-row gl-justify-content-space-between gl-align-items-center gl-px-5"
- >
- <div
- class="gl-display-flex"
- >
- <!---->
- </div>
-
- <div
- class="gl-display-flex"
- >
- <!---->
- </div>
- </div>
+ <!---->
<div
class="gl-new-dropdown-contents"
diff --git a/spec/frontend/clusters_list/components/agent_empty_state_spec.js b/spec/frontend/clusters_list/components/agent_empty_state_spec.js
new file mode 100644
index 00000000000..a548721588e
--- /dev/null
+++ b/spec/frontend/clusters_list/components/agent_empty_state_spec.js
@@ -0,0 +1,77 @@
+import { GlAlert, GlEmptyState, GlSprintf } from '@gitlab/ui';
+import AgentEmptyState from '~/clusters_list/components/agent_empty_state.vue';
+import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
+
+const emptyStateImage = '/path/to/image';
+const projectPath = 'path/to/project';
+const agentDocsUrl = 'path/to/agentDocs';
+const installDocsUrl = 'path/to/installDocs';
+const getStartedDocsUrl = 'path/to/getStartedDocs';
+const integrationDocsUrl = 'path/to/integrationDocs';
+
+describe('AgentEmptyStateComponent', () => {
+ let wrapper;
+
+ const propsData = {
+ hasConfigurations: false,
+ };
+ const provideData = {
+ emptyStateImage,
+ projectPath,
+ agentDocsUrl,
+ installDocsUrl,
+ getStartedDocsUrl,
+ integrationDocsUrl,
+ };
+
+ const findConfigurationsAlert = () => wrapper.findComponent(GlAlert);
+ const findAgentDocsLink = () => wrapper.findByTestId('agent-docs-link');
+ const findInstallDocsLink = () => wrapper.findByTestId('install-docs-link');
+ const findIntegrationButton = () => wrapper.findByTestId('integration-primary-button');
+ const findEmptyState = () => wrapper.findComponent(GlEmptyState);
+
+ beforeEach(() => {
+ wrapper = shallowMountExtended(AgentEmptyState, {
+ propsData,
+ provide: provideData,
+ stubs: { GlEmptyState, GlSprintf },
+ });
+ });
+
+ afterEach(() => {
+ if (wrapper) {
+ wrapper.destroy();
+ wrapper = null;
+ }
+ });
+
+ it('renders correct href attributes for the links', () => {
+ expect(findAgentDocsLink().attributes('href')).toBe(agentDocsUrl);
+ expect(findInstallDocsLink().attributes('href')).toBe(installDocsUrl);
+ });
+
+ describe('when there are no agent configurations in repository', () => {
+ it('should render notification message box', () => {
+ expect(findConfigurationsAlert().exists()).toBe(true);
+ });
+
+ it('should disable integration button', () => {
+ expect(findIntegrationButton().attributes('disabled')).toBe('true');
+ });
+ });
+
+ describe('when there is a list of agent configurations', () => {
+ beforeEach(() => {
+ propsData.hasConfigurations = true;
+ wrapper = shallowMountExtended(AgentEmptyState, {
+ propsData,
+ provide: provideData,
+ });
+ });
+ it('should render content without notification message box', () => {
+ expect(findEmptyState().exists()).toBe(true);
+ expect(findConfigurationsAlert().exists()).toBe(false);
+ expect(findIntegrationButton().attributes('disabled')).toBeUndefined();
+ });
+ });
+});
diff --git a/spec/frontend/clusters_list/components/agent_table_spec.js b/spec/frontend/clusters_list/components/agent_table_spec.js
new file mode 100644
index 00000000000..e3b90584f29
--- /dev/null
+++ b/spec/frontend/clusters_list/components/agent_table_spec.js
@@ -0,0 +1,117 @@
+import { GlButton, GlLink, GlIcon } from '@gitlab/ui';
+import AgentTable from '~/clusters_list/components/agent_table.vue';
+import { ACTIVE_CONNECTION_TIME } from '~/clusters_list/constants';
+import { mountExtended } from 'helpers/vue_test_utils_helper';
+import timeagoMixin from '~/vue_shared/mixins/timeago';
+
+const connectedTimeNow = new Date();
+const connectedTimeInactive = new Date(connectedTimeNow.getTime() - ACTIVE_CONNECTION_TIME);
+
+const propsData = {
+ agents: [
+ {
+ name: 'agent-1',
+ configFolder: {
+ webPath: '/agent/full/path',
+ },
+ webPath: '/agent-1',
+ status: 'unused',
+ lastContact: null,
+ tokens: null,
+ },
+ {
+ name: 'agent-2',
+ webPath: '/agent-2',
+ status: 'active',
+ lastContact: connectedTimeNow.getTime(),
+ tokens: {
+ nodes: [
+ {
+ lastUsedAt: connectedTimeNow,
+ },
+ ],
+ },
+ },
+ {
+ name: 'agent-3',
+ webPath: '/agent-3',
+ status: 'inactive',
+ lastContact: connectedTimeInactive.getTime(),
+ tokens: {
+ nodes: [
+ {
+ lastUsedAt: connectedTimeInactive,
+ },
+ ],
+ },
+ },
+ ],
+};
+const provideData = { integrationDocsUrl: 'path/to/integrationDocs' };
+
+describe('AgentTable', () => {
+ let wrapper;
+
+ const findAgentLink = (at) => wrapper.findAllByTestId('cluster-agent-name-link').at(at);
+ const findStatusIcon = (at) => wrapper.findAllComponents(GlIcon).at(at);
+ const findStatusText = (at) => wrapper.findAllByTestId('cluster-agent-connection-status').at(at);
+ const findLastContactText = (at) => wrapper.findAllByTestId('cluster-agent-last-contact').at(at);
+ const findConfiguration = (at) =>
+ wrapper.findAllByTestId('cluster-agent-configuration-link').at(at);
+
+ beforeEach(() => {
+ wrapper = mountExtended(AgentTable, { propsData, provide: provideData });
+ });
+
+ afterEach(() => {
+ if (wrapper) {
+ wrapper.destroy();
+ wrapper = null;
+ }
+ });
+
+ it('displays header button', () => {
+ expect(wrapper.find(GlButton).text()).toBe('Install a new GitLab Agent');
+ });
+
+ describe('agent table', () => {
+ it.each`
+ agentName | link | lineNumber
+ ${'agent-1'} | ${'/agent-1'} | ${0}
+ ${'agent-2'} | ${'/agent-2'} | ${1}
+ `('displays agent link', ({ agentName, link, lineNumber }) => {
+ expect(findAgentLink(lineNumber).text()).toBe(agentName);
+ expect(findAgentLink(lineNumber).attributes('href')).toBe(link);
+ });
+
+ it.each`
+ status | iconName | lineNumber
+ ${'Never connected'} | ${'status-neutral'} | ${0}
+ ${'Connected'} | ${'status-success'} | ${1}
+ ${'Not connected'} | ${'severity-critical'} | ${2}
+ `('displays agent connection status', ({ status, iconName, lineNumber }) => {
+ expect(findStatusText(lineNumber).text()).toBe(status);
+ expect(findStatusIcon(lineNumber).props('name')).toBe(iconName);
+ });
+
+ it.each`
+ lastContact | lineNumber
+ ${'Never'} | ${0}
+ ${timeagoMixin.methods.timeFormatted(connectedTimeNow)} | ${1}
+ ${timeagoMixin.methods.timeFormatted(connectedTimeInactive)} | ${2}
+ `('displays agent last contact time', ({ lastContact, lineNumber }) => {
+ expect(findLastContactText(lineNumber).text()).toBe(lastContact);
+ });
+
+ it.each`
+ agentPath | hasLink | lineNumber
+ ${'.gitlab/agents/agent-1'} | ${true} | ${0}
+ ${'.gitlab/agents/agent-2'} | ${false} | ${1}
+ `('displays config file path', ({ agentPath, hasLink, lineNumber }) => {
+ const findLink = findConfiguration(lineNumber).find(GlLink);
+
+ expect(findLink.exists()).toBe(hasLink);
+ expect(findConfiguration(lineNumber).text()).toBe(agentPath);
+ });
+ });
+});
diff --git a/spec/frontend/clusters_list/components/agents_spec.js b/spec/frontend/clusters_list/components/agents_spec.js
new file mode 100644
index 00000000000..54d5ae94172
--- /dev/null
+++ b/spec/frontend/clusters_list/components/agents_spec.js
@@ -0,0 +1,246 @@
+import { GlAlert, GlKeysetPagination, GlLoadingIcon } from '@gitlab/ui';
+import { createLocalVue, shallowMount } from '@vue/test-utils';
+import VueApollo from 'vue-apollo';
+import AgentEmptyState from '~/clusters_list/components/agent_empty_state.vue';
+import AgentTable from '~/clusters_list/components/agent_table.vue';
+import Agents from '~/clusters_list/components/agents.vue';
+import { ACTIVE_CONNECTION_TIME } from '~/clusters_list/constants';
+import getAgentsQuery from '~/clusters_list/graphql/queries/get_agents.query.graphql';
+import createMockApollo from 'helpers/mock_apollo_helper';
+
+const localVue = createLocalVue();
+localVue.use(VueApollo);
+
+describe('Agents', () => {
+ let wrapper;
+
+ const propsData = {
+ defaultBranchName: 'default',
+ };
+ const provideData = {
+ projectPath: 'path/to/project',
+ kasAddress: 'kas.example.com',
+ };
+
+ const createWrapper = ({ agents = [], pageInfo = null, trees = [] }) => {
+ const provide = provideData;
+ const apolloQueryResponse = {
+ data: {
+ project: {
+ clusterAgents: { nodes: agents, pageInfo, tokens: { nodes: [] } },
+ repository: { tree: { trees: { nodes: trees, pageInfo } } },
+ },
+ },
+ };
+
+ const apolloProvider = createMockApollo([
+ [getAgentsQuery, jest.fn().mockResolvedValue(apolloQueryResponse, provide)],
+ ]);
+
+ wrapper = shallowMount(Agents, {
+ localVue,
+ apolloProvider,
+ propsData,
+ provide: provideData,
+ });
+
+ return wrapper.vm.$nextTick();
+ };
+
+ const findAgentTable = () => wrapper.find(AgentTable);
+ const findEmptyState = () => wrapper.find(AgentEmptyState);
+ const findPaginationButtons = () => wrapper.find(GlKeysetPagination);
+
+ afterEach(() => {
+ if (wrapper) {
+ wrapper.destroy();
+ wrapper = null;
+ }
+ });
+
+ describe('when there is a list of agents', () => {
+ let testDate = new Date();
+ const agents = [
+ {
+ id: '1',
+ name: 'agent-1',
+ webPath: '/agent-1',
+ tokens: null,
+ },
+ {
+ id: '2',
+ name: 'agent-2',
+ webPath: '/agent-2',
+ tokens: {
+ nodes: [
+ {
+ lastUsedAt: testDate,
+ },
+ ],
+ },
+ },
+ ];
+
+ const trees = [
+ {
+ name: 'agent-2',
+ path: '.gitlab/agents/agent-2',
+ webPath: '/project/path/.gitlab/agents/agent-2',
+ },
+ ];
+
+ const expectedAgentsList = [
+ {
+ id: '1',
+ name: 'agent-1',
+ webPath: '/agent-1',
+ configFolder: undefined,
+ status: 'unused',
+ lastContact: null,
+ tokens: null,
+ },
+ {
+ id: '2',
+ name: 'agent-2',
+ configFolder: {
+ name: 'agent-2',
+ path: '.gitlab/agents/agent-2',
+ webPath: '/project/path/.gitlab/agents/agent-2',
+ },
+ webPath: '/agent-2',
+ status: 'active',
+ lastContact: new Date(testDate).getTime(),
+ tokens: {
+ nodes: [
+ {
+ lastUsedAt: testDate,
+ },
+ ],
+ },
+ },
+ ];
+
+ beforeEach(() => {
+ return createWrapper({ agents, trees });
+ });
+
+ it('should render agent table', () => {
+ expect(findAgentTable().exists()).toBe(true);
+ expect(findEmptyState().exists()).toBe(false);
+ });
+
+ it('should pass agent and folder info to table component', () => {
+ expect(findAgentTable().props('agents')).toMatchObject(expectedAgentsList);
+ });
+
+ describe('when the agent has recently connected tokens', () => {
+ it('should set agent status to active', () => {
+ expect(findAgentTable().props('agents')).toMatchObject(expectedAgentsList);
+ });
+ });
+
+ describe('when the agent has tokens connected more then 8 minutes ago', () => {
+ const now = new Date();
+ testDate = new Date(now.getTime() - ACTIVE_CONNECTION_TIME);
+ it('should set agent status to inactive', () => {
+ expect(findAgentTable().props('agents')).toMatchObject(expectedAgentsList);
+ });
+ });
+
+ describe('when the agent has no connected tokens', () => {
+ testDate = null;
+ it('should set agent status to unused', () => {
+ expect(findAgentTable().props('agents')).toMatchObject(expectedAgentsList);
+ });
+ });
+
+ it('should not render pagination buttons when there are no additional pages', () => {
+ expect(findPaginationButtons().exists()).toBe(false);
+ });
+
+ describe('when the list has additional pages', () => {
+ const pageInfo = {
+ hasNextPage: true,
+ hasPreviousPage: false,
+ startCursor: 'prev',
+ endCursor: 'next',
+ };
+
+ beforeEach(() => {
+ return createWrapper({
+ agents,
+ pageInfo,
+ });
+ });
+
+ it('should render pagination buttons', () => {
+ expect(findPaginationButtons().exists()).toBe(true);
+ });
+
+ it('should pass pageInfo to the pagination component', () => {
+ expect(findPaginationButtons().props()).toMatchObject(pageInfo);
+ });
+ });
+ });
+
+ describe('when the agent list is empty', () => {
+ beforeEach(() => {
+ return createWrapper({ agents: [] });
+ });
+
+ it('should render empty state', () => {
+ expect(findAgentTable().exists()).toBe(false);
+ expect(findEmptyState().exists()).toBe(true);
+ });
+ });
+
+ describe('when the agent configurations are present', () => {
+ const trees = [
+ {
+ name: 'agent-1',
+ path: '.gitlab/agents/agent-1',
+ webPath: '/project/path/.gitlab/agents/agent-1',
+ },
+ ];
+
+ beforeEach(() => {
+ return createWrapper({ agents: [], trees });
+ });
+
+ it('should pass the correct hasConfigurations boolean value to empty state component', () => {
+ expect(findEmptyState().props('hasConfigurations')).toEqual(true);
+ });
+ });
+
+ describe('when agents query has errored', () => {
+ beforeEach(() => {
+ return createWrapper({ agents: null });
+ });
+
+ it('displays an alert message', () => {
+ expect(wrapper.find(GlAlert).exists()).toBe(true);
+ });
+ });
+
+ describe('when agents query is loading', () => {
+ const mocks = {
+ $apollo: {
+ queries: {
+ agents: {
+ loading: true,
+ },
+ },
+ },
+ };
+
+ beforeEach(() => {
+ wrapper = shallowMount(Agents, { mocks, propsData, provide: provideData });
+
+ return wrapper.vm.$nextTick();
+ });
+
+ it('displays a loading icon', () => {
+ expect(wrapper.find(GlLoadingIcon).exists()).toBe(true);
+ });
+ });
+});
diff --git a/spec/frontend/clusters_list/components/available_agents_dropwdown_spec.js b/spec/frontend/clusters_list/components/available_agents_dropwdown_spec.js
new file mode 100644
index 00000000000..40c2c59e187
--- /dev/null
+++ b/spec/frontend/clusters_list/components/available_agents_dropwdown_spec.js
@@ -0,0 +1,129 @@
+import { GlDropdown, GlDropdownItem } from '@gitlab/ui';
+import { createLocalVue, mount } from '@vue/test-utils';
+import VueApollo from 'vue-apollo';
+import AvailableAgentsDropdown from '~/clusters_list/components/available_agents_dropdown.vue';
+import { I18N_AVAILABLE_AGENTS_DROPDOWN } from '~/clusters_list/constants';
+import agentConfigurationsQuery from '~/clusters_list/graphql/queries/agent_configurations.query.graphql';
+import createMockApollo from 'helpers/mock_apollo_helper';
+import { agentConfigurationsResponse } from './mock_data';
+
+const localVue = createLocalVue();
+localVue.use(VueApollo);
+
+describe('AvailableAgentsDropdown', () => {
+ let wrapper;
+
+ const i18n = I18N_AVAILABLE_AGENTS_DROPDOWN;
+ const findDropdown = () => wrapper.findComponent(GlDropdown);
+ const findDropdownItems = () => wrapper.findAllComponents(GlDropdownItem);
+ const findConfiguredAgentItem = () => findDropdownItems().at(0);
+
+ const createWrapper = ({ propsData = {}, isLoading = false }) => {
+ const provide = {
+ projectPath: 'path/to/project',
+ };
+
+ wrapper = (() => {
+ if (isLoading) {
+ const mocks = {
+ $apollo: {
+ queries: {
+ agents: {
+ loading: true,
+ },
+ },
+ },
+ };
+
+ return mount(AvailableAgentsDropdown, { mocks, provide, propsData });
+ }
+
+ const apolloProvider = createMockApollo([
+ [agentConfigurationsQuery, jest.fn().mockResolvedValue(agentConfigurationsResponse)],
+ ]);
+
+ return mount(AvailableAgentsDropdown, {
+ localVue,
+ apolloProvider,
+ provide,
+ propsData,
+ });
+ })();
+ };
+
+ afterEach(() => {
+ wrapper.destroy();
+ wrapper = null;
+ });
+
+ describe('there are agents available', () => {
+ const propsData = {
+ isRegistering: false,
+ };
+
+ beforeEach(() => {
+ createWrapper({ propsData });
+ });
+
+ it('prompts to select an agent', () => {
+ expect(findDropdown().props('text')).toBe(i18n.selectAgent);
+ });
+
+ it('shows only agents that are not yet installed', () => {
+ expect(findDropdownItems()).toHaveLength(1);
+ expect(findConfiguredAgentItem().text()).toBe('configured-agent');
+ expect(findConfiguredAgentItem().props('isChecked')).toBe(false);
+ });
+
+ describe('click events', () => {
+ beforeEach(() => {
+ findConfiguredAgentItem().vm.$emit('click');
+ });
+
+ it('emits agentSelected with the name of the clicked agent', () => {
+ expect(wrapper.emitted('agentSelected')).toEqual([['configured-agent']]);
+ });
+
+ it('marks the clicked item as selected', () => {
+ expect(findDropdown().props('text')).toBe('configured-agent');
+ expect(findConfiguredAgentItem().props('isChecked')).toBe(true);
+ });
+ });
+ });
+
+ describe('registration in progress', () => {
+ const propsData = {
+ isRegistering: true,
+ };
+
+ beforeEach(() => {
+ createWrapper({ propsData });
+ });
+
+ it('updates the text in the dropdown', () => {
+ expect(findDropdown().props('text')).toBe(i18n.registeringAgent);
+ });
+
+ it('displays a loading icon', () => {
+ expect(findDropdown().props('loading')).toBe(true);
+ });
+ });
+
+ describe('agents query is loading', () => {
+ const propsData = {
+ isRegistering: false,
+ };
+
+ beforeEach(() => {
+ createWrapper({ propsData, isLoading: true });
+ });
+
+ it('updates the text in the dropdown', () => {
+ expect(findDropdown().text()).toBe(i18n.selectAgent);
+ });
+
+ it('displays a loading icon', () => {
+ expect(findDropdown().props('loading')).toBe(true);
+ });
+ });
+});
diff --git a/spec/frontend/clusters_list/components/install_agent_modal_spec.js b/spec/frontend/clusters_list/components/install_agent_modal_spec.js
new file mode 100644
index 00000000000..98ca5e05b3f
--- /dev/null
+++ b/spec/frontend/clusters_list/components/install_agent_modal_spec.js
@@ -0,0 +1,190 @@
+import { GlAlert, GlButton, GlFormInputGroup } from '@gitlab/ui';
+import { createLocalVue, shallowMount } from '@vue/test-utils';
+import VueApollo from 'vue-apollo';
+import AvailableAgentsDropdown from '~/clusters_list/components/available_agents_dropdown.vue';
+import InstallAgentModal from '~/clusters_list/components/install_agent_modal.vue';
+import { I18N_INSTALL_AGENT_MODAL } from '~/clusters_list/constants';
+import createAgentMutation from '~/clusters_list/graphql/mutations/create_agent.mutation.graphql';
+import createAgentTokenMutation from '~/clusters_list/graphql/mutations/create_agent_token.mutation.graphql';
+import createMockApollo from 'helpers/mock_apollo_helper';
+import waitForPromises from 'helpers/wait_for_promises';
+import CodeBlock from '~/vue_shared/components/code_block.vue';
+import {
+ createAgentResponse,
+ createAgentErrorResponse,
+ createAgentTokenResponse,
+ createAgentTokenErrorResponse,
+} from '../mocks/apollo';
+import ModalStub from '../stubs';
+
+const localVue = createLocalVue();
+localVue.use(VueApollo);
+
+describe('InstallAgentModal', () => {
+ let wrapper;
+ let apolloProvider;
+
+ const i18n = I18N_INSTALL_AGENT_MODAL;
+ const findModal = () => wrapper.findComponent(ModalStub);
+ const findAgentDropdown = () => findModal().findComponent(AvailableAgentsDropdown);
+ const findAlert = () => findModal().findComponent(GlAlert);
+ const findButtonByVariant = (variant) =>
+ findModal()
+ .findAll(GlButton)
+ .wrappers.find((button) => button.props('variant') === variant);
+ const findActionButton = () => findButtonByVariant('confirm');
+ const findCancelButton = () => findButtonByVariant('default');
+
+ const expectDisabledAttribute = (element, disabled) => {
+ if (disabled) {
+ expect(element.attributes('disabled')).toBe('true');
+ } else {
+ expect(element.attributes('disabled')).toBeUndefined();
+ }
+ };
+
+ const createWrapper = () => {
+ const provide = {
+ projectPath: 'path/to/project',
+ kasAddress: 'kas.example.com',
+ };
+
+ wrapper = shallowMount(InstallAgentModal, {
+ attachTo: document.body,
+ stubs: {
+ GlModal: ModalStub,
+ },
+ localVue,
+ apolloProvider,
+ provide,
+ });
+ };
+
+ const mockSelectedAgentResponse = () => {
+ createWrapper();
+
+ wrapper.vm.setAgentName('agent-name');
+ findActionButton().vm.$emit('click');
+
+ return waitForPromises();
+ };
+
+ beforeEach(() => {
+ createWrapper();
+ });
+
+ afterEach(() => {
+ wrapper.destroy();
+ wrapper = null;
+ apolloProvider = null;
+ });
+
+ describe('initial state', () => {
+ it('renders the dropdown for available agents', () => {
+ expect(findAgentDropdown().isVisible()).toBe(true);
+ expect(findModal().text()).not.toContain(i18n.basicInstallTitle);
+ expect(findModal().findComponent(GlFormInputGroup).exists()).toBe(false);
+ expect(findModal().findComponent(GlAlert).exists()).toBe(false);
+ expect(findModal().findComponent(CodeBlock).exists()).toBe(false);
+ });
+
+ it('renders a cancel button', () => {
+ expect(findCancelButton().isVisible()).toBe(true);
+ expectDisabledAttribute(findCancelButton(), false);
+ });
+
+ it('renders a disabled next button', () => {
+ expect(findActionButton().isVisible()).toBe(true);
+ expect(findActionButton().text()).toBe(i18n.next);
+ expectDisabledAttribute(findActionButton(), true);
+ });
+ });
+
+ describe('an agent is selected', () => {
+ beforeEach(() => {
+ findAgentDropdown().vm.$emit('agentSelected');
+ });
+
+ it('enables the next button', () => {
+ expect(findActionButton().isVisible()).toBe(true);
+ expectDisabledAttribute(findActionButton(), false);
+ });
+ });
+
+ describe('registering an agent', () => {
+ const createAgentHandler = jest.fn().mockResolvedValue(createAgentResponse);
+ const createAgentTokenHandler = jest.fn().mockResolvedValue(createAgentTokenResponse);
+
+ beforeEach(() => {
+ apolloProvider = createMockApollo([
+ [createAgentMutation, createAgentHandler],
+ [createAgentTokenMutation, createAgentTokenHandler],
+ ]);
+
+ return mockSelectedAgentResponse(apolloProvider);
+ });
+
+ it('creates an agent and token', () => {
+ expect(createAgentHandler).toHaveBeenCalledWith({
+ input: { name: 'agent-name', projectPath: 'path/to/project' },
+ });
+
+ expect(createAgentTokenHandler).toHaveBeenCalledWith({
+ input: { clusterAgentId: 'agent-id', name: 'agent-name' },
+ });
+ });
+
+ it('renders a done button', () => {
+ expect(findActionButton().isVisible()).toBe(true);
+ expect(findActionButton().text()).toBe(i18n.done);
+ expectDisabledAttribute(findActionButton(), false);
+ });
+
+ it('shows agent instructions', () => {
+ const modalText = findModal().text();
+ expect(modalText).toContain(i18n.basicInstallTitle);
+ expect(modalText).toContain(i18n.basicInstallBody);
+
+ const token = findModal().findComponent(GlFormInputGroup);
+ expect(token.props('value')).toBe('mock-agent-token');
+
+ const alert = findModal().findComponent(GlAlert);
+ expect(alert.props('title')).toBe(i18n.tokenSingleUseWarningTitle);
+
+ const code = findModal().findComponent(CodeBlock).props('code');
+ expect(code).toContain('--agent-token=mock-agent-token');
+ expect(code).toContain('--kas-address=kas.example.com');
+ });
+
+ describe('error creating agent', () => {
+ beforeEach(() => {
+ apolloProvider = createMockApollo([
+ [createAgentMutation, jest.fn().mockResolvedValue(createAgentErrorResponse)],
+ ]);
+
+ return mockSelectedAgentResponse();
+ });
+
+ it('displays the error message', () => {
+ expect(findAlert().text()).toBe(createAgentErrorResponse.data.createClusterAgent.errors[0]);
+ });
+ });
+
+ describe('error creating token', () => {
+ beforeEach(() => {
+ apolloProvider = createMockApollo([
+ [createAgentMutation, jest.fn().mockResolvedValue(createAgentResponse)],
+ [createAgentTokenMutation, jest.fn().mockResolvedValue(createAgentTokenErrorResponse)],
+ ]);
+
+ return mockSelectedAgentResponse();
+ });
+
+ it('displays the error message', () => {
+ expect(findAlert().text()).toBe(
+ createAgentTokenErrorResponse.data.clusterAgentTokenCreate.errors[0],
+ );
+ });
+ });
+ });
+});
diff --git a/spec/frontend/clusters_list/components/mock_data.js b/spec/frontend/clusters_list/components/mock_data.js
new file mode 100644
index 00000000000..e388d791b89
--- /dev/null
+++ b/spec/frontend/clusters_list/components/mock_data.js
@@ -0,0 +1,12 @@
+export const agentConfigurationsResponse = {
+ data: {
+ project: {
+ agentConfigurations: {
+ nodes: [{ agentName: 'installed-agent' }, { agentName: 'configured-agent' }],
+ },
+ clusterAgents: {
+ nodes: [{ name: 'installed-agent' }],
+ },
+ },
+ },
+};
diff --git a/spec/frontend/clusters_list/mocks/apollo.js b/spec/frontend/clusters_list/mocks/apollo.js
new file mode 100644
index 00000000000..27b71a0d4b5
--- /dev/null
+++ b/spec/frontend/clusters_list/mocks/apollo.js
@@ -0,0 +1,45 @@
+export const createAgentResponse = {
+ data: {
+ createClusterAgent: {
+ clusterAgent: {
+ id: 'agent-id',
+ },
+ errors: [],
+ },
+ },
+};
+
+export const createAgentErrorResponse = {
+ data: {
+ createClusterAgent: {
+ clusterAgent: {
+ id: 'agent-id',
+ },
+ errors: ['could not create agent'],
+ },
+ },
+};
+
+export const createAgentTokenResponse = {
+ data: {
+ clusterAgentTokenCreate: {
+ token: {
+ id: 'token-id',
+ },
+ secret: 'mock-agent-token',
+ errors: [],
+ },
+ },
+};
+
+export const createAgentTokenErrorResponse = {
+ data: {
+ clusterAgentTokenCreate: {
+ token: {
+ id: 'token-id',
+ },
+ secret: 'mock-agent-token',
+ errors: ['could not create agent token'],
+ },
+ },
+};
diff --git a/spec/frontend/clusters_list/stubs.js b/spec/frontend/clusters_list/stubs.js
new file mode 100644
index 00000000000..5769d6190f6
--- /dev/null
+++ b/spec/frontend/clusters_list/stubs.js
@@ -0,0 +1,14 @@
+const ModalStub = {
+ name: 'glmodal-stub',
+ template: `
+ <div>
+ <slot></slot>
+ <slot name="modal-footer"></slot>
+ </div>
+ `,
+ methods: {
+ hide: jest.fn(),
+ },
+};
+
+export default ModalStub;
diff --git a/spec/frontend/comment_type_toggle_spec.js b/spec/frontend/comment_type_toggle_spec.js
deleted file mode 100644
index 06dbfac1803..00000000000
--- a/spec/frontend/comment_type_toggle_spec.js
+++ /dev/null
@@ -1,169 +0,0 @@
-import CommentTypeToggle from '~/comment_type_toggle';
-import DropLab from '~/droplab/drop_lab';
-import InputSetter from '~/droplab/plugins/input_setter';
-
-describe('CommentTypeToggle', () => {
- const testContext = {};
-
- describe('class constructor', () => {
- beforeEach(() => {
- testContext.dropdownTrigger = {};
- testContext.dropdownList = {};
- testContext.noteTypeInput = {};
- testContext.submitButton = {};
- testContext.closeButton = {};
-
- testContext.commentTypeToggle = new CommentTypeToggle({
- dropdownTrigger: testContext.dropdownTrigger,
- dropdownList: testContext.dropdownList,
- noteTypeInput: testContext.noteTypeInput,
- submitButton: testContext.submitButton,
- closeButton: testContext.closeButton,
- });
- });
-
- it('should set .dropdownTrigger', () => {
- expect(testContext.commentTypeToggle.dropdownTrigger).toBe(testContext.dropdownTrigger);
- });
-
- it('should set .dropdownList', () => {
- expect(testContext.commentTypeToggle.dropdownList).toBe(testContext.dropdownList);
- });
-
- it('should set .noteTypeInput', () => {
- expect(testContext.commentTypeToggle.noteTypeInput).toBe(testContext.noteTypeInput);
- });
-
- it('should set .submitButton', () => {
- expect(testContext.commentTypeToggle.submitButton).toBe(testContext.submitButton);
- });
-
- it('should set .closeButton', () => {
- expect(testContext.commentTypeToggle.closeButton).toBe(testContext.closeButton);
- });
-
- it('should set .reopenButton', () => {
- expect(testContext.commentTypeToggle.reopenButton).toBe(testContext.reopenButton);
- });
- });
-
- describe('initDroplab', () => {
- beforeEach(() => {
- testContext.commentTypeToggle = {
- dropdownTrigger: {},
- dropdownList: {},
- noteTypeInput: {},
- submitButton: {},
- closeButton: {},
- setConfig: () => {},
- };
- testContext.config = {};
-
- jest.spyOn(DropLab.prototype, 'init').mockImplementation();
- jest.spyOn(DropLab.prototype, 'constructor').mockImplementation();
-
- jest.spyOn(testContext.commentTypeToggle, 'setConfig').mockReturnValue(testContext.config);
-
- CommentTypeToggle.prototype.initDroplab.call(testContext.commentTypeToggle);
- });
-
- it('should instantiate a DropLab instance and set .droplab', () => {
- expect(testContext.commentTypeToggle.droplab instanceof DropLab).toBe(true);
- });
-
- it('should call .setConfig', () => {
- expect(testContext.commentTypeToggle.setConfig).toHaveBeenCalled();
- });
-
- it('should call DropLab.prototype.init', () => {
- expect(DropLab.prototype.init).toHaveBeenCalledWith(
- testContext.commentTypeToggle.dropdownTrigger,
- testContext.commentTypeToggle.dropdownList,
- [InputSetter],
- testContext.config,
- );
- });
- });
-
- describe('setConfig', () => {
- describe('if no .closeButton is provided', () => {
- beforeEach(() => {
- testContext.commentTypeToggle = {
- dropdownTrigger: {},
- dropdownList: {},
- noteTypeInput: {},
- submitButton: {},
- reopenButton: {},
- };
-
- testContext.setConfig = CommentTypeToggle.prototype.setConfig.call(
- testContext.commentTypeToggle,
- );
- });
-
- it('should not add .closeButton related InputSetter config', () => {
- expect(testContext.setConfig).toEqual({
- InputSetter: [
- {
- input: testContext.commentTypeToggle.noteTypeInput,
- valueAttribute: 'data-value',
- },
- {
- input: testContext.commentTypeToggle.submitButton,
- valueAttribute: 'data-submit-text',
- },
- {
- input: testContext.commentTypeToggle.reopenButton,
- valueAttribute: 'data-reopen-text',
- },
- {
- input: testContext.commentTypeToggle.reopenButton,
- valueAttribute: 'data-reopen-text',
- inputAttribute: 'data-alternative-text',
- },
- ],
- });
- });
- });
-
- describe('if no .reopenButton is provided', () => {
- beforeEach(() => {
- testContext.commentTypeToggle = {
- dropdownTrigger: {},
- dropdownList: {},
- noteTypeInput: {},
- submitButton: {},
- closeButton: {},
- };
-
- testContext.setConfig = CommentTypeToggle.prototype.setConfig.call(
- testContext.commentTypeToggle,
- );
- });
-
- it('should not add .reopenButton related InputSetter config', () => {
- expect(testContext.setConfig).toEqual({
- InputSetter: [
- {
- input: testContext.commentTypeToggle.noteTypeInput,
- valueAttribute: 'data-value',
- },
- {
- input: testContext.commentTypeToggle.submitButton,
- valueAttribute: 'data-submit-text',
- },
- {
- input: testContext.commentTypeToggle.closeButton,
- valueAttribute: 'data-close-text',
- },
- {
- input: testContext.commentTypeToggle.closeButton,
- valueAttribute: 'data-close-text',
- inputAttribute: 'data-alternative-text',
- },
- ],
- });
- });
- });
- });
-});
diff --git a/spec/frontend/commit/commit_pipeline_status_component_spec.js b/spec/frontend/commit/commit_pipeline_status_component_spec.js
index 8082b8524e7..3a549e66eb7 100644
--- a/spec/frontend/commit/commit_pipeline_status_component_spec.js
+++ b/spec/frontend/commit/commit_pipeline_status_component_spec.js
@@ -1,7 +1,7 @@
import { GlLoadingIcon } from '@gitlab/ui';
import { shallowMount } from '@vue/test-utils';
import Visibility from 'visibilityjs';
-import { getJSONFixture } from 'helpers/fixtures';
+import fixture from 'test_fixtures/pipelines/pipelines.json';
import createFlash from '~/flash';
import Poll from '~/lib/utils/poll';
import CommitPipelineStatus from '~/projects/tree/components/commit_pipeline_status_component.vue';
@@ -20,7 +20,7 @@ jest.mock('~/projects/tree/services/commit_pipeline_service', () =>
describe('Commit pipeline status component', () => {
let wrapper;
- const { pipelines } = getJSONFixture('pipelines/pipelines.json');
+ const { pipelines } = fixture;
const { status: mockCiStatus } = pipelines[0].details;
const defaultProps = {
diff --git a/spec/frontend/commit/pipelines/pipelines_table_spec.js b/spec/frontend/commit/pipelines/pipelines_table_spec.js
index 1defb3d586c..17f7be9d1d7 100644
--- a/spec/frontend/commit/pipelines/pipelines_table_spec.js
+++ b/spec/frontend/commit/pipelines/pipelines_table_spec.js
@@ -1,6 +1,7 @@
import { GlEmptyState, GlLoadingIcon, GlModal, GlTable } from '@gitlab/ui';
import { mount } from '@vue/test-utils';
import MockAdapter from 'axios-mock-adapter';
+import fixture from 'test_fixtures/pipelines/pipelines.json';
import { extendedWrapper } from 'helpers/vue_test_utils_helper';
import waitForPromises from 'helpers/wait_for_promises';
import Api from '~/api';
@@ -8,7 +9,6 @@ import PipelinesTable from '~/commit/pipelines/pipelines_table.vue';
import axios from '~/lib/utils/axios_utils';
describe('Pipelines table in Commits and Merge requests', () => {
- const jsonFixtureName = 'pipelines/pipelines.json';
let wrapper;
let pipeline;
let mock;
@@ -37,7 +37,7 @@ describe('Pipelines table in Commits and Merge requests', () => {
beforeEach(() => {
mock = new MockAdapter(axios);
- const { pipelines } = getJSONFixture(jsonFixtureName);
+ const { pipelines } = fixture;
pipeline = pipelines.find((p) => p.user !== null && p.commit !== null);
});
diff --git a/spec/frontend/content_editor/components/__snapshots__/toolbar_link_button_spec.js.snap b/spec/frontend/content_editor/components/__snapshots__/toolbar_link_button_spec.js.snap
index 8f5516545eb..178c7d749c8 100644
--- a/spec/frontend/content_editor/components/__snapshots__/toolbar_link_button_spec.js.snap
+++ b/spec/frontend/content_editor/components/__snapshots__/toolbar_link_button_spec.js.snap
@@ -11,14 +11,7 @@ exports[`content_editor/components/toolbar_link_button renders dropdown componen
<ul role=\\"menu\\" tabindex=\\"-1\\" class=\\"dropdown-menu\\">
<div class=\\"gl-new-dropdown-inner\\">
<!---->
- <div class=\\"gl-display-flex gl-flex-direction-row gl-justify-content-space-between gl-align-items-center gl-px-5\\">
- <div class=\\"gl-display-flex\\">
- <!---->
- </div>
- <div class=\\"gl-display-flex\\">
- <!---->
- </div>
- </div>
+ <!---->
<div class=\\"gl-new-dropdown-contents\\">
<!---->
<li role=\\"presentation\\" class=\\"gl-px-3!\\">
diff --git a/spec/frontend/content_editor/components/top_toolbar_spec.js b/spec/frontend/content_editor/components/top_toolbar_spec.js
index a5df3d73289..ec58877470c 100644
--- a/spec/frontend/content_editor/components/top_toolbar_spec.js
+++ b/spec/frontend/content_editor/components/top_toolbar_spec.js
@@ -31,6 +31,7 @@ describe('content_editor/components/top_toolbar', () => {
${'blockquote'} | ${{ contentType: 'blockquote', iconName: 'quote', label: 'Insert a quote', editorCommand: 'toggleBlockquote' }}
${'bullet-list'} | ${{ contentType: 'bulletList', iconName: 'list-bulleted', label: 'Add a bullet list', editorCommand: 'toggleBulletList' }}
${'ordered-list'} | ${{ contentType: 'orderedList', iconName: 'list-numbered', label: 'Add a numbered list', editorCommand: 'toggleOrderedList' }}
+ ${'details'} | ${{ contentType: 'details', iconName: 'details-block', label: 'Add a collapsible section', editorCommand: 'toggleDetails' }}
${'horizontal-rule'} | ${{ contentType: 'horizontalRule', iconName: 'dash', label: 'Add a horizontal rule', editorCommand: 'setHorizontalRule' }}
${'code-block'} | ${{ contentType: 'codeBlock', iconName: 'doc-code', label: 'Insert a code block', editorCommand: 'toggleCodeBlock' }}
${'text-styles'} | ${{}}
diff --git a/spec/frontend/content_editor/components/wrappers/details_spec.js b/spec/frontend/content_editor/components/wrappers/details_spec.js
new file mode 100644
index 00000000000..d746b9fa2f1
--- /dev/null
+++ b/spec/frontend/content_editor/components/wrappers/details_spec.js
@@ -0,0 +1,40 @@
+import { NodeViewContent } from '@tiptap/vue-2';
+import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
+import DetailsWrapper from '~/content_editor/components/wrappers/details.vue';
+
+describe('content/components/wrappers/details', () => {
+ let wrapper;
+
+ const createWrapper = async () => {
+ wrapper = shallowMountExtended(DetailsWrapper, {
+ propsData: {
+ node: {},
+ },
+ });
+ };
+
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ it('renders a node-view-content as a ul element', () => {
+ createWrapper();
+
+ expect(wrapper.findComponent(NodeViewContent).props().as).toBe('ul');
+ });
+
+ it('is "open" by default', () => {
+ createWrapper();
+
+ expect(wrapper.findByTestId('details-toggle-icon').classes()).toContain('is-open');
+ expect(wrapper.findComponent(NodeViewContent).classes()).toContain('is-open');
+ });
+
+ it('closes the details block on clicking the details toggle icon', async () => {
+ createWrapper();
+
+ await wrapper.findByTestId('details-toggle-icon').trigger('click');
+ expect(wrapper.findByTestId('details-toggle-icon').classes()).not.toContain('is-open');
+ expect(wrapper.findComponent(NodeViewContent).classes()).not.toContain('is-open');
+ });
+});
diff --git a/spec/frontend/content_editor/components/wrappers/frontmatter_spec.js b/spec/frontend/content_editor/components/wrappers/frontmatter_spec.js
new file mode 100644
index 00000000000..de8f8efd260
--- /dev/null
+++ b/spec/frontend/content_editor/components/wrappers/frontmatter_spec.js
@@ -0,0 +1,43 @@
+import { NodeViewWrapper, NodeViewContent } from '@tiptap/vue-2';
+import { shallowMount } from '@vue/test-utils';
+import FrontmatterWrapper from '~/content_editor/components/wrappers/frontmatter.vue';
+
+describe('content/components/wrappers/frontmatter', () => {
+ let wrapper;
+
+ const createWrapper = async (nodeAttrs = { language: 'yaml' }) => {
+ wrapper = shallowMount(FrontmatterWrapper, {
+ propsData: {
+ node: {
+ attrs: nodeAttrs,
+ },
+ },
+ });
+ };
+
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ it('renders a node-view-wrapper as a pre element', () => {
+ createWrapper();
+
+ expect(wrapper.findComponent(NodeViewWrapper).props().as).toBe('pre');
+ expect(wrapper.findComponent(NodeViewWrapper).classes()).toContain('gl-relative');
+ });
+
+ it('renders a node-view-content as a code element', () => {
+ createWrapper();
+
+ expect(wrapper.findComponent(NodeViewContent).props().as).toBe('code');
+ });
+
+ it('renders label indicating that code block is frontmatter', () => {
+ createWrapper();
+
+ const label = wrapper.find('[data-testid="frontmatter-label"]');
+
+ expect(label.text()).toEqual('frontmatter:yaml');
+ expect(label.classes()).toEqual(['gl-absolute', 'gl-top-0', 'gl-right-3']);
+ });
+});
diff --git a/spec/frontend/content_editor/extensions/color_chip_spec.js b/spec/frontend/content_editor/extensions/color_chip_spec.js
new file mode 100644
index 00000000000..4bb6f344ab4
--- /dev/null
+++ b/spec/frontend/content_editor/extensions/color_chip_spec.js
@@ -0,0 +1,33 @@
+import ColorChip, { colorDecoratorPlugin } from '~/content_editor/extensions/color_chip';
+import Code from '~/content_editor/extensions/code';
+import { createTestEditor } from '../test_utils';
+
+describe('content_editor/extensions/color_chip', () => {
+ let tiptapEditor;
+
+ beforeEach(() => {
+ tiptapEditor = createTestEditor({ extensions: [ColorChip, Code] });
+ });
+
+ describe.each`
+ colorExpression | decorated
+ ${'#F00'} | ${true}
+ ${'rgba(0,0,0,0)'} | ${true}
+ ${'hsl(540,70%,50%)'} | ${true}
+ ${'F00'} | ${false}
+ ${'F00'} | ${false}
+ ${'gba(0,0,0,0)'} | ${false}
+ ${'hls(540,70%,50%)'} | ${false}
+ ${'red'} | ${false}
+ `(
+ 'when a code span with $colorExpression color expression is found',
+ ({ colorExpression, decorated }) => {
+ it(`${decorated ? 'adds' : 'does not add'} a color chip decorator`, () => {
+ tiptapEditor.commands.setContent(`<p><code>${colorExpression}</code></p>`);
+ const pluginState = colorDecoratorPlugin.getState(tiptapEditor.state);
+
+ expect(pluginState.children).toHaveLength(decorated ? 3 : 0);
+ });
+ },
+ );
+});
diff --git a/spec/frontend/content_editor/extensions/details_content_spec.js b/spec/frontend/content_editor/extensions/details_content_spec.js
new file mode 100644
index 00000000000..575f3bf65e4
--- /dev/null
+++ b/spec/frontend/content_editor/extensions/details_content_spec.js
@@ -0,0 +1,76 @@
+import Details from '~/content_editor/extensions/details';
+import DetailsContent from '~/content_editor/extensions/details_content';
+import { createTestEditor, createDocBuilder } from '../test_utils';
+
+describe('content_editor/extensions/details_content', () => {
+ let tiptapEditor;
+ let doc;
+ let p;
+ let details;
+ let detailsContent;
+
+ beforeEach(() => {
+ tiptapEditor = createTestEditor({ extensions: [Details, DetailsContent] });
+
+ ({
+ builders: { doc, p, details, detailsContent },
+ } = createDocBuilder({
+ tiptapEditor,
+ names: {
+ details: { nodeType: Details.name },
+ detailsContent: { nodeType: DetailsContent.name },
+ },
+ }));
+ });
+
+ describe('shortcut: Enter', () => {
+ it('splits a details content into two items', () => {
+ const initialDoc = doc(
+ details(
+ detailsContent(p('Summary')),
+ detailsContent(p('Text content')),
+ detailsContent(p('Text content')),
+ ),
+ );
+ const expectedDoc = doc(
+ details(
+ detailsContent(p('Summary')),
+ detailsContent(p('')),
+ detailsContent(p('Text content')),
+ detailsContent(p('Text content')),
+ ),
+ );
+
+ tiptapEditor.commands.setContent(initialDoc.toJSON());
+
+ tiptapEditor.commands.setTextSelection(10);
+ tiptapEditor.commands.keyboardShortcut('Enter');
+
+ expect(tiptapEditor.getJSON()).toEqual(expectedDoc.toJSON());
+ });
+ });
+
+ describe('shortcut: Shift-Tab', () => {
+ it('lifts a details content and creates two separate details items', () => {
+ const initialDoc = doc(
+ details(
+ detailsContent(p('Summary')),
+ detailsContent(p('Text content')),
+ detailsContent(p('Text content')),
+ ),
+ );
+ const expectedDoc = doc(
+ details(detailsContent(p('Summary'))),
+ p('Text content'),
+ details(detailsContent(p('Text content'))),
+ );
+
+ tiptapEditor.commands.setContent(initialDoc.toJSON());
+
+ tiptapEditor.commands.setTextSelection(20);
+ tiptapEditor.commands.keyboardShortcut('Shift-Tab');
+
+ expect(tiptapEditor.getJSON()).toEqual(expectedDoc.toJSON());
+ });
+ });
+});
diff --git a/spec/frontend/content_editor/extensions/details_spec.js b/spec/frontend/content_editor/extensions/details_spec.js
new file mode 100644
index 00000000000..cd59943982f
--- /dev/null
+++ b/spec/frontend/content_editor/extensions/details_spec.js
@@ -0,0 +1,92 @@
+import Details from '~/content_editor/extensions/details';
+import DetailsContent from '~/content_editor/extensions/details_content';
+import { createTestEditor, createDocBuilder } from '../test_utils';
+
+describe('content_editor/extensions/details', () => {
+ let tiptapEditor;
+ let doc;
+ let p;
+ let details;
+ let detailsContent;
+
+ beforeEach(() => {
+ tiptapEditor = createTestEditor({ extensions: [Details, DetailsContent] });
+
+ ({
+ builders: { doc, p, details, detailsContent },
+ } = createDocBuilder({
+ tiptapEditor,
+ names: {
+ details: { nodeType: Details.name },
+ detailsContent: { nodeType: DetailsContent.name },
+ },
+ }));
+ });
+
+ describe('setDetails command', () => {
+ describe('when current block is a paragraph', () => {
+ it('converts current paragraph into a details block', () => {
+ const initialDoc = doc(p('Text content'));
+ const expectedDoc = doc(details(detailsContent(p('Text content'))));
+
+ tiptapEditor.commands.setContent(initialDoc.toJSON());
+ tiptapEditor.commands.setDetails();
+
+ expect(tiptapEditor.getJSON()).toEqual(expectedDoc.toJSON());
+ });
+ });
+
+ describe('when current block is a details block', () => {
+ it('maintains the same document structure', () => {
+ const initialDoc = doc(details(detailsContent(p('Text content'))));
+
+ tiptapEditor.commands.setContent(initialDoc.toJSON());
+ tiptapEditor.commands.setDetails();
+
+ expect(tiptapEditor.getJSON()).toEqual(initialDoc.toJSON());
+ });
+ });
+ });
+
+ describe('toggleDetails command', () => {
+ describe('when current block is a paragraph', () => {
+ it('converts current paragraph into a details block', () => {
+ const initialDoc = doc(p('Text content'));
+ const expectedDoc = doc(details(detailsContent(p('Text content'))));
+
+ tiptapEditor.commands.setContent(initialDoc.toJSON());
+ tiptapEditor.commands.toggleDetails();
+
+ expect(tiptapEditor.getJSON()).toEqual(expectedDoc.toJSON());
+ });
+ });
+
+ describe('when current block is a details block', () => {
+ it('convert details block into a paragraph', () => {
+ const initialDoc = doc(details(detailsContent(p('Text content'))));
+ const expectedDoc = doc(p('Text content'));
+
+ tiptapEditor.commands.setContent(initialDoc.toJSON());
+ tiptapEditor.commands.toggleDetails();
+
+ expect(tiptapEditor.getJSON()).toEqual(expectedDoc.toJSON());
+ });
+ });
+ });
+
+ it.each`
+ input | insertedNode
+ ${'<details>'} | ${(...args) => details(detailsContent(p(...args)))}
+ ${'<details'} | ${(...args) => p(...args)}
+ ${'details>'} | ${(...args) => p(...args)}
+ `('with input=$input, then should insert a $insertedNode', ({ input, insertedNode }) => {
+ const { view } = tiptapEditor;
+ const { selection } = view.state;
+ const expectedDoc = doc(insertedNode());
+
+ // Triggers the event handler that input rules listen to
+ view.someProp('handleTextInput', (f) => f(view, selection.from, selection.to, input));
+
+ expect(tiptapEditor.getJSON()).toEqual(expectedDoc.toJSON());
+ });
+});
diff --git a/spec/frontend/content_editor/extensions/math_inline_spec.js b/spec/frontend/content_editor/extensions/math_inline_spec.js
new file mode 100644
index 00000000000..82eb85477de
--- /dev/null
+++ b/spec/frontend/content_editor/extensions/math_inline_spec.js
@@ -0,0 +1,42 @@
+import MathInline from '~/content_editor/extensions/math_inline';
+import { createTestEditor, createDocBuilder } from '../test_utils';
+
+describe('content_editor/extensions/math_inline', () => {
+ let tiptapEditor;
+ let doc;
+ let p;
+ let mathInline;
+
+ beforeEach(() => {
+ tiptapEditor = createTestEditor({ extensions: [MathInline] });
+
+ ({
+ builders: { doc, p, mathInline },
+ } = createDocBuilder({
+ tiptapEditor,
+ names: {
+ details: { markType: MathInline.name },
+ },
+ }));
+ });
+
+ it.each`
+ input | insertedNode
+ ${'$`a^2`$'} | ${() => p(mathInline('a^2'))}
+ ${'$`a^2`'} | ${() => p('$`a^2`')}
+ ${'`a^2`$'} | ${() => p('`a^2`$')}
+ `('with input=$input, then should insert a $insertedNode', ({ input, insertedNode }) => {
+ const { view } = tiptapEditor;
+ const expectedDoc = doc(insertedNode());
+
+ tiptapEditor.chain().setContent(input).setTextSelection(0).run();
+
+ const { state } = tiptapEditor;
+ const { selection } = state;
+
+ // Triggers the event handler that input rules listen to
+ view.someProp('handleTextInput', (f) => f(view, selection.from, input.length + 1, input));
+
+ expect(tiptapEditor.getJSON()).toEqual(expectedDoc.toJSON());
+ });
+});
diff --git a/spec/frontend/content_editor/extensions/table_of_contents_spec.js b/spec/frontend/content_editor/extensions/table_of_contents_spec.js
new file mode 100644
index 00000000000..83818899c17
--- /dev/null
+++ b/spec/frontend/content_editor/extensions/table_of_contents_spec.js
@@ -0,0 +1,35 @@
+import TableOfContents from '~/content_editor/extensions/table_of_contents';
+import { createTestEditor, createDocBuilder } from '../test_utils';
+
+describe('content_editor/extensions/emoji', () => {
+ let tiptapEditor;
+ let builders;
+
+ beforeEach(() => {
+ tiptapEditor = createTestEditor({ extensions: [TableOfContents] });
+ ({ builders } = createDocBuilder({
+ tiptapEditor,
+ names: { tableOfContents: { nodeType: TableOfContents.name } },
+ }));
+ });
+
+ it.each`
+ input | insertedNode
+ ${'[[_TOC_]]'} | ${'tableOfContents'}
+ ${'[TOC]'} | ${'tableOfContents'}
+ ${'[toc]'} | ${'p'}
+ ${'TOC'} | ${'p'}
+ ${'[_TOC_]'} | ${'p'}
+ ${'[[TOC]]'} | ${'p'}
+ `('with input=$input, then should insert a $insertedNode', ({ input, insertedNode }) => {
+ const { doc } = builders;
+ const { view } = tiptapEditor;
+ const { selection } = view.state;
+ const expectedDoc = doc(builders[insertedNode]());
+
+ // Triggers the event handler that input rules listen to
+ view.someProp('handleTextInput', (f) => f(view, selection.from, selection.to, input));
+
+ expect(tiptapEditor.getJSON()).toEqual(expectedDoc.toJSON());
+ });
+});
diff --git a/spec/frontend/content_editor/markdown_processing_examples.js b/spec/frontend/content_editor/markdown_processing_examples.js
index b3aabfeb145..da895970289 100644
--- a/spec/frontend/content_editor/markdown_processing_examples.js
+++ b/spec/frontend/content_editor/markdown_processing_examples.js
@@ -1,11 +1,13 @@
import fs from 'fs';
import path from 'path';
import jsYaml from 'js-yaml';
+// eslint-disable-next-line import/no-deprecated
import { getJSONFixture } from 'helpers/fixtures';
export const loadMarkdownApiResult = (testName) => {
const fixturePathPrefix = `api/markdown/${testName}.json`;
+ // eslint-disable-next-line import/no-deprecated
const fixture = getJSONFixture(fixturePathPrefix);
return fixture.body || fixture.html;
};
diff --git a/spec/frontend/content_editor/services/markdown_serializer_spec.js b/spec/frontend/content_editor/services/markdown_serializer_spec.js
index 6f2c908c289..33056ab9e4a 100644
--- a/spec/frontend/content_editor/services/markdown_serializer_spec.js
+++ b/spec/frontend/content_editor/services/markdown_serializer_spec.js
@@ -5,6 +5,8 @@ import Code from '~/content_editor/extensions/code';
import CodeBlockHighlight from '~/content_editor/extensions/code_block_highlight';
import DescriptionItem from '~/content_editor/extensions/description_item';
import DescriptionList from '~/content_editor/extensions/description_list';
+import Details from '~/content_editor/extensions/details';
+import DetailsContent from '~/content_editor/extensions/details_content';
import Division from '~/content_editor/extensions/division';
import Emoji from '~/content_editor/extensions/emoji';
import Figure from '~/content_editor/extensions/figure';
@@ -45,6 +47,8 @@ const tiptapEditor = createTestEditor({
CodeBlockHighlight,
DescriptionItem,
DescriptionList,
+ Details,
+ DetailsContent,
Division,
Emoji,
Figure,
@@ -78,6 +82,8 @@ const {
bulletList,
code,
codeBlock,
+ details,
+ detailsContent,
division,
descriptionItem,
descriptionList,
@@ -110,6 +116,8 @@ const {
bulletList: { nodeType: BulletList.name },
code: { markType: Code.name },
codeBlock: { nodeType: CodeBlockHighlight.name },
+ details: { nodeType: Details.name },
+ detailsContent: { nodeType: DetailsContent.name },
division: { nodeType: Division.name },
descriptionItem: { nodeType: DescriptionItem.name },
descriptionList: { nodeType: DescriptionList.name },
@@ -588,6 +596,105 @@ A giant _owl-like_ creature.
);
});
+ it('correctly renders a simple details/summary', () => {
+ expect(
+ serialize(
+ details(
+ detailsContent(paragraph('this is the summary')),
+ detailsContent(paragraph('this content will be hidden')),
+ ),
+ ),
+ ).toBe(
+ `
+<details>
+<summary>this is the summary</summary>
+this content will be hidden
+</details>
+ `.trim(),
+ );
+ });
+
+ it('correctly renders details/summary with styled content', () => {
+ expect(
+ serialize(
+ details(
+ detailsContent(paragraph('this is the ', bold('summary'))),
+ detailsContent(
+ codeBlock(
+ { language: 'javascript' },
+ 'var a = 2;\nvar b = 3;\nvar c = a + d;\n\nconsole.log(c);',
+ ),
+ ),
+ detailsContent(paragraph('this content will be ', italic('hidden'))),
+ ),
+ details(detailsContent(paragraph('summary 2')), detailsContent(paragraph('content 2'))),
+ ),
+ ).toBe(
+ `
+<details>
+<summary>
+
+this is the **summary**
+
+</summary>
+
+\`\`\`javascript
+var a = 2;
+var b = 3;
+var c = a + d;
+
+console.log(c);
+\`\`\`
+
+this content will be _hidden_
+
+</details>
+<details>
+<summary>summary 2</summary>
+content 2
+</details>
+ `.trim(),
+ );
+ });
+
+ it('correctly renders nested details', () => {
+ expect(
+ serialize(
+ details(
+ detailsContent(paragraph('dream level 1')),
+ detailsContent(
+ details(
+ detailsContent(paragraph('dream level 2')),
+ detailsContent(
+ details(
+ detailsContent(paragraph('dream level 3')),
+ detailsContent(paragraph(italic('inception'))),
+ ),
+ ),
+ ),
+ ),
+ ),
+ ),
+ ).toBe(
+ `
+<details>
+<summary>dream level 1</summary>
+
+<details>
+<summary>dream level 2</summary>
+
+<details>
+<summary>dream level 3</summary>
+
+_inception_
+
+</details>
+</details>
+</details>
+ `.trim(),
+ );
+ });
+
it('correctly renders div', () => {
expect(
serialize(
diff --git a/spec/frontend/cycle_analytics/base_spec.js b/spec/frontend/cycle_analytics/base_spec.js
index 5d3361bfa35..9a9415cc12a 100644
--- a/spec/frontend/cycle_analytics/base_spec.js
+++ b/spec/frontend/cycle_analytics/base_spec.js
@@ -19,6 +19,7 @@ import {
createdAfter,
currentGroup,
stageCounts,
+ initialPaginationState as pagination,
} from './mock_data';
const selectedStageEvents = issueEvents.events;
@@ -81,6 +82,7 @@ const findOverviewMetrics = () => wrapper.findComponent(ValueStreamMetrics);
const findStageTable = () => wrapper.findComponent(StageTable);
const findStageEvents = () => findStageTable().props('stageEvents');
const findEmptyStageTitle = () => wrapper.findComponent(GlEmptyState).props('title');
+const findPagination = () => wrapper.findByTestId('vsa-stage-pagination');
const hasMetricsRequests = (reqs) => {
const foundReqs = findOverviewMetrics().props('requests');
@@ -90,7 +92,7 @@ const hasMetricsRequests = (reqs) => {
describe('Value stream analytics component', () => {
beforeEach(() => {
- wrapper = createComponent({ initialState: { selectedStage, selectedStageEvents } });
+ wrapper = createComponent({ initialState: { selectedStage, selectedStageEvents, pagination } });
});
afterEach(() => {
@@ -153,6 +155,10 @@ describe('Value stream analytics component', () => {
expect(findLoadingIcon().exists()).toBe(false);
});
+ it('renders pagination', () => {
+ expect(findPagination().exists()).toBe(true);
+ });
+
describe('with `cycleAnalyticsForGroups=true` license', () => {
beforeEach(() => {
wrapper = createComponent({ initialState: { features: { cycleAnalyticsForGroups: true } } });
diff --git a/spec/frontend/cycle_analytics/mock_data.js b/spec/frontend/cycle_analytics/mock_data.js
index d9659d5d4c3..1882457960a 100644
--- a/spec/frontend/cycle_analytics/mock_data.js
+++ b/spec/frontend/cycle_analytics/mock_data.js
@@ -1,6 +1,14 @@
+/* eslint-disable import/no-deprecated */
+
import { getJSONFixture } from 'helpers/fixtures';
import { TEST_HOST } from 'helpers/test_constants';
-import { DEFAULT_VALUE_STREAM, DEFAULT_DAYS_IN_PAST } from '~/cycle_analytics/constants';
+import {
+ DEFAULT_VALUE_STREAM,
+ DEFAULT_DAYS_IN_PAST,
+ PAGINATION_TYPE,
+ PAGINATION_SORT_DIRECTION_DESC,
+ PAGINATION_SORT_FIELD_END_EVENT,
+} from '~/cycle_analytics/constants';
import { convertObjectPropsToCamelCase } from '~/lib/utils/common_utils';
import { getDateInPast } from '~/lib/utils/datetime_utility';
@@ -13,9 +21,10 @@ export const getStageByTitle = (stages, title) =>
stages.find((stage) => stage.title && stage.title.toLowerCase().trim() === title) || {};
const fixtureEndpoints = {
- customizableCycleAnalyticsStagesAndEvents: 'projects/analytics/value_stream_analytics/stages',
- stageEvents: (stage) => `projects/analytics/value_stream_analytics/events/${stage}`,
- metricsData: 'projects/analytics/value_stream_analytics/summary',
+ customizableCycleAnalyticsStagesAndEvents:
+ 'projects/analytics/value_stream_analytics/stages.json',
+ stageEvents: (stage) => `projects/analytics/value_stream_analytics/events/${stage}.json`,
+ metricsData: 'projects/analytics/value_stream_analytics/summary.json',
};
export const metricsData = getJSONFixture(fixtureEndpoints.metricsData);
@@ -256,3 +265,22 @@ export const rawValueStreamStages = customizableStagesAndEvents.stages;
export const valueStreamStages = rawValueStreamStages.map((s) =>
convertObjectPropsToCamelCase(s, { deep: true }),
);
+
+export const initialPaginationQuery = {
+ page: 15,
+ sort: PAGINATION_SORT_FIELD_END_EVENT,
+ direction: PAGINATION_SORT_DIRECTION_DESC,
+};
+
+export const initialPaginationState = {
+ ...initialPaginationQuery,
+ page: null,
+ hasNextPage: false,
+};
+
+export const basePaginationResult = {
+ pagination: PAGINATION_TYPE,
+ sort: PAGINATION_SORT_FIELD_END_EVENT,
+ direction: PAGINATION_SORT_DIRECTION_DESC,
+ page: null,
+};
diff --git a/spec/frontend/cycle_analytics/store/actions_spec.js b/spec/frontend/cycle_analytics/store/actions_spec.js
index 97b5bd03e18..993e6b6b73a 100644
--- a/spec/frontend/cycle_analytics/store/actions_spec.js
+++ b/spec/frontend/cycle_analytics/store/actions_spec.js
@@ -11,6 +11,8 @@ import {
currentGroup,
createdAfter,
createdBefore,
+ initialPaginationState,
+ reviewEvents,
} from '../mock_data';
const { id: groupId, path: groupPath } = currentGroup;
@@ -31,7 +33,13 @@ const mockSetDateActionCommit = {
type: 'SET_DATE_RANGE',
};
-const defaultState = { ...getters, selectedValueStream, createdAfter, createdBefore };
+const defaultState = {
+ ...getters,
+ selectedValueStream,
+ createdAfter,
+ createdBefore,
+ pagination: initialPaginationState,
+};
describe('Project Value Stream Analytics actions', () => {
let state;
@@ -112,6 +120,21 @@ describe('Project Value Stream Analytics actions', () => {
});
});
+ describe('updateStageTablePagination', () => {
+ beforeEach(() => {
+ state = { ...state, selectedStage };
+ });
+
+ it(`will dispatch the "fetchStageData" action and commit the 'SET_PAGINATION' mutation`, () => {
+ return testAction({
+ action: actions.updateStageTablePagination,
+ state,
+ expectedMutations: [{ type: 'SET_PAGINATION' }],
+ expectedActions: [{ type: 'fetchStageData', payload: selectedStage.id }],
+ });
+ });
+ });
+
describe('fetchCycleAnalyticsData', () => {
beforeEach(() => {
state = { ...defaultState, endpoints: mockEndpoints };
@@ -154,6 +177,10 @@ describe('Project Value Stream Analytics actions', () => {
describe('fetchStageData', () => {
const mockStagePath = /value_streams\/\w+\/stages\/\w+\/records/;
+ const headers = {
+ 'X-Next-Page': 2,
+ 'X-Page': 1,
+ };
beforeEach(() => {
state = {
@@ -162,7 +189,7 @@ describe('Project Value Stream Analytics actions', () => {
selectedStage,
};
mock = new MockAdapter(axios);
- mock.onGet(mockStagePath).reply(httpStatusCodes.OK);
+ mock.onGet(mockStagePath).reply(httpStatusCodes.OK, reviewEvents, headers);
});
it(`commits the 'RECEIVE_STAGE_DATA_SUCCESS' mutation`, () =>
@@ -170,7 +197,11 @@ describe('Project Value Stream Analytics actions', () => {
action: actions.fetchStageData,
state,
payload: {},
- expectedMutations: [{ type: 'REQUEST_STAGE_DATA' }, { type: 'RECEIVE_STAGE_DATA_SUCCESS' }],
+ expectedMutations: [
+ { type: 'REQUEST_STAGE_DATA' },
+ { type: 'RECEIVE_STAGE_DATA_SUCCESS', payload: reviewEvents },
+ { type: 'SET_PAGINATION', payload: { hasNextPage: true, page: 1 } },
+ ],
expectedActions: [],
}));
diff --git a/spec/frontend/cycle_analytics/store/getters_spec.js b/spec/frontend/cycle_analytics/store/getters_spec.js
index c47a30a5f79..c9208045a68 100644
--- a/spec/frontend/cycle_analytics/store/getters_spec.js
+++ b/spec/frontend/cycle_analytics/store/getters_spec.js
@@ -1,17 +1,42 @@
import * as getters from '~/cycle_analytics/store/getters';
+
import {
allowedStages,
stageMedians,
transformedProjectStagePathData,
selectedStage,
stageCounts,
+ basePaginationResult,
+ initialPaginationState,
} from '../mock_data';
describe('Value stream analytics getters', () => {
+ let state = {};
+
describe('pathNavigationData', () => {
it('returns the transformed data', () => {
- const state = { stages: allowedStages, medians: stageMedians, selectedStage, stageCounts };
+ state = { stages: allowedStages, medians: stageMedians, selectedStage, stageCounts };
expect(getters.pathNavigationData(state)).toEqual(transformedProjectStagePathData);
});
});
+
+ describe('paginationParams', () => {
+ beforeEach(() => {
+ state = { pagination: initialPaginationState };
+ });
+
+ it('returns the `pagination` type', () => {
+ expect(getters.paginationParams(state)).toEqual(basePaginationResult);
+ });
+
+ it('returns the `sort` type', () => {
+ expect(getters.paginationParams(state)).toEqual(basePaginationResult);
+ });
+
+ it('with page=10, sets the `page` property', () => {
+ const page = 10;
+ state = { pagination: { ...initialPaginationState, page } };
+ expect(getters.paginationParams(state)).toEqual({ ...basePaginationResult, page });
+ });
+ });
});
diff --git a/spec/frontend/cycle_analytics/store/mutations_spec.js b/spec/frontend/cycle_analytics/store/mutations_spec.js
index 628e2a4e7ae..4860225c995 100644
--- a/spec/frontend/cycle_analytics/store/mutations_spec.js
+++ b/spec/frontend/cycle_analytics/store/mutations_spec.js
@@ -2,6 +2,10 @@ import { useFakeDate } from 'helpers/fake_date';
import * as types from '~/cycle_analytics/store/mutation_types';
import mutations from '~/cycle_analytics/store/mutations';
import {
+ PAGINATION_SORT_FIELD_END_EVENT,
+ PAGINATION_SORT_DIRECTION_DESC,
+} from '~/cycle_analytics/constants';
+import {
selectedStage,
rawIssueEvents,
issueEvents,
@@ -12,6 +16,7 @@ import {
formattedStageMedians,
rawStageCounts,
stageCounts,
+ initialPaginationState as pagination,
} from '../mock_data';
let state;
@@ -25,7 +30,7 @@ describe('Project Value Stream Analytics mutations', () => {
useFakeDate(2020, 6, 18);
beforeEach(() => {
- state = {};
+ state = { pagination };
});
afterEach(() => {
@@ -88,16 +93,18 @@ describe('Project Value Stream Analytics mutations', () => {
});
it.each`
- mutation | payload | stateKey | value
- ${types.SET_DATE_RANGE} | ${mockSetDatePayload} | ${'createdAfter'} | ${mockCreatedAfter}
- ${types.SET_DATE_RANGE} | ${mockSetDatePayload} | ${'createdBefore'} | ${mockCreatedBefore}
- ${types.SET_LOADING} | ${true} | ${'isLoading'} | ${true}
- ${types.SET_LOADING} | ${false} | ${'isLoading'} | ${false}
- ${types.SET_SELECTED_VALUE_STREAM} | ${selectedValueStream} | ${'selectedValueStream'} | ${selectedValueStream}
- ${types.RECEIVE_VALUE_STREAMS_SUCCESS} | ${[selectedValueStream]} | ${'valueStreams'} | ${[selectedValueStream]}
- ${types.RECEIVE_VALUE_STREAM_STAGES_SUCCESS} | ${{ stages: rawValueStreamStages }} | ${'stages'} | ${valueStreamStages}
- ${types.RECEIVE_STAGE_MEDIANS_SUCCESS} | ${rawStageMedians} | ${'medians'} | ${formattedStageMedians}
- ${types.RECEIVE_STAGE_COUNTS_SUCCESS} | ${rawStageCounts} | ${'stageCounts'} | ${stageCounts}
+ mutation | payload | stateKey | value
+ ${types.SET_DATE_RANGE} | ${mockSetDatePayload} | ${'createdAfter'} | ${mockCreatedAfter}
+ ${types.SET_DATE_RANGE} | ${mockSetDatePayload} | ${'createdBefore'} | ${mockCreatedBefore}
+ ${types.SET_LOADING} | ${true} | ${'isLoading'} | ${true}
+ ${types.SET_LOADING} | ${false} | ${'isLoading'} | ${false}
+ ${types.SET_SELECTED_VALUE_STREAM} | ${selectedValueStream} | ${'selectedValueStream'} | ${selectedValueStream}
+ ${types.SET_PAGINATION} | ${pagination} | ${'pagination'} | ${{ ...pagination, sort: PAGINATION_SORT_FIELD_END_EVENT, direction: PAGINATION_SORT_DIRECTION_DESC }}
+ ${types.SET_PAGINATION} | ${{ ...pagination, sort: 'duration', direction: 'asc' }} | ${'pagination'} | ${{ ...pagination, sort: 'duration', direction: 'asc' }}
+ ${types.RECEIVE_VALUE_STREAMS_SUCCESS} | ${[selectedValueStream]} | ${'valueStreams'} | ${[selectedValueStream]}
+ ${types.RECEIVE_VALUE_STREAM_STAGES_SUCCESS} | ${{ stages: rawValueStreamStages }} | ${'stages'} | ${valueStreamStages}
+ ${types.RECEIVE_STAGE_MEDIANS_SUCCESS} | ${rawStageMedians} | ${'medians'} | ${formattedStageMedians}
+ ${types.RECEIVE_STAGE_COUNTS_SUCCESS} | ${rawStageCounts} | ${'stageCounts'} | ${stageCounts}
`(
'$mutation with $payload will set $stateKey to $value',
({ mutation, payload, stateKey, value }) => {
diff --git a/spec/frontend/cycle_analytics/utils_spec.js b/spec/frontend/cycle_analytics/utils_spec.js
index 69fed879fd8..74d64cd8d71 100644
--- a/spec/frontend/cycle_analytics/utils_spec.js
+++ b/spec/frontend/cycle_analytics/utils_spec.js
@@ -1,7 +1,6 @@
import { useFakeDate } from 'helpers/fake_date';
import {
transformStagesForPathNavigation,
- timeSummaryForPathNavigation,
medianTimeToParsedSeconds,
formatMedianValues,
filterStagesByHiddenStatus,
@@ -47,21 +46,6 @@ describe('Value stream analytics utils', () => {
});
});
- describe('timeSummaryForPathNavigation', () => {
- it.each`
- unit | value | result
- ${'months'} | ${1.5} | ${'1.5M'}
- ${'weeks'} | ${1.25} | ${'1.5w'}
- ${'days'} | ${2} | ${'2d'}
- ${'hours'} | ${10} | ${'10h'}
- ${'minutes'} | ${20} | ${'20m'}
- ${'seconds'} | ${10} | ${'<1m'}
- ${'seconds'} | ${0} | ${'-'}
- `('will format $value $unit to $result', ({ unit, value, result }) => {
- expect(timeSummaryForPathNavigation({ [unit]: value })).toBe(result);
- });
- });
-
describe('medianTimeToParsedSeconds', () => {
it.each`
value | result
diff --git a/spec/frontend/deploy_freeze/helpers.js b/spec/frontend/deploy_freeze/helpers.js
index 598f14d45f6..43e66183ab5 100644
--- a/spec/frontend/deploy_freeze/helpers.js
+++ b/spec/frontend/deploy_freeze/helpers.js
@@ -1,7 +1,8 @@
+import freezePeriodsFixture from 'test_fixtures/api/freeze-periods/freeze_periods.json';
+import timezoneDataFixture from 'test_fixtures/timezones/short.json';
import { secondsToHours } from '~/lib/utils/datetime_utility';
-export const freezePeriodsFixture = getJSONFixture('/api/freeze-periods/freeze_periods.json');
-export const timezoneDataFixture = getJSONFixture('/timezones/short.json');
+export { freezePeriodsFixture, timezoneDataFixture };
export const findTzByName = (identifier = '') =>
timezoneDataFixture.find(({ name }) => name.toLowerCase() === identifier.toLowerCase());
diff --git a/spec/frontend/deploy_keys/components/action_btn_spec.js b/spec/frontend/deploy_keys/components/action_btn_spec.js
index 307a0b6d8b0..6ac68061518 100644
--- a/spec/frontend/deploy_keys/components/action_btn_spec.js
+++ b/spec/frontend/deploy_keys/components/action_btn_spec.js
@@ -1,10 +1,10 @@
import { GlButton } from '@gitlab/ui';
import { shallowMount } from '@vue/test-utils';
+import data from 'test_fixtures/deploy_keys/keys.json';
import actionBtn from '~/deploy_keys/components/action_btn.vue';
import eventHub from '~/deploy_keys/eventhub';
describe('Deploy keys action btn', () => {
- const data = getJSONFixture('deploy_keys/keys.json');
const deployKey = data.enabled_keys[0];
let wrapper;
diff --git a/spec/frontend/deploy_keys/components/app_spec.js b/spec/frontend/deploy_keys/components/app_spec.js
index a72b2b00776..598b7a0f173 100644
--- a/spec/frontend/deploy_keys/components/app_spec.js
+++ b/spec/frontend/deploy_keys/components/app_spec.js
@@ -1,5 +1,6 @@
import { mount } from '@vue/test-utils';
import MockAdapter from 'axios-mock-adapter';
+import data from 'test_fixtures/deploy_keys/keys.json';
import waitForPromises from 'helpers/wait_for_promises';
import { TEST_HOST } from 'spec/test_constants';
import deployKeysApp from '~/deploy_keys/components/app.vue';
@@ -10,7 +11,6 @@ import axios from '~/lib/utils/axios_utils';
const TEST_ENDPOINT = `${TEST_HOST}/dummy/`;
describe('Deploy keys app component', () => {
- const data = getJSONFixture('deploy_keys/keys.json');
let wrapper;
let mock;
diff --git a/spec/frontend/deploy_keys/components/key_spec.js b/spec/frontend/deploy_keys/components/key_spec.js
index 5420f9a01f9..511b9d6ef55 100644
--- a/spec/frontend/deploy_keys/components/key_spec.js
+++ b/spec/frontend/deploy_keys/components/key_spec.js
@@ -1,4 +1,5 @@
import { mount } from '@vue/test-utils';
+import data from 'test_fixtures/deploy_keys/keys.json';
import key from '~/deploy_keys/components/key.vue';
import DeployKeysStore from '~/deploy_keys/store';
import { getTimeago } from '~/lib/utils/datetime_utility';
@@ -7,8 +8,6 @@ describe('Deploy keys key', () => {
let wrapper;
let store;
- const data = getJSONFixture('deploy_keys/keys.json');
-
const findTextAndTrim = (selector) => wrapper.find(selector).text().trim();
const createComponent = (propsData) => {
diff --git a/spec/frontend/deploy_keys/components/keys_panel_spec.js b/spec/frontend/deploy_keys/components/keys_panel_spec.js
index d6419356166..f3b907e5450 100644
--- a/spec/frontend/deploy_keys/components/keys_panel_spec.js
+++ b/spec/frontend/deploy_keys/components/keys_panel_spec.js
@@ -1,9 +1,9 @@
import { mount } from '@vue/test-utils';
+import data from 'test_fixtures/deploy_keys/keys.json';
import deployKeysPanel from '~/deploy_keys/components/keys_panel.vue';
import DeployKeysStore from '~/deploy_keys/store';
describe('Deploy keys panel', () => {
- const data = getJSONFixture('deploy_keys/keys.json');
let wrapper;
const findTableRowHeader = () => wrapper.find('.table-row-header');
diff --git a/spec/frontend/deprecated_jquery_dropdown_spec.js b/spec/frontend/deprecated_jquery_dropdown_spec.js
index 4a6dee31cd5..7e4c6e131b4 100644
--- a/spec/frontend/deprecated_jquery_dropdown_spec.js
+++ b/spec/frontend/deprecated_jquery_dropdown_spec.js
@@ -3,6 +3,8 @@
import $ from 'jquery';
import initDeprecatedJQueryDropdown from '~/deprecated_jquery_dropdown';
import '~/lib/utils/common_utils';
+// eslint-disable-next-line import/no-deprecated
+import { getJSONFixture } from 'helpers/fixtures';
import { visitUrl } from '~/lib/utils/url_utility';
jest.mock('~/lib/utils/url_utility', () => ({
@@ -66,6 +68,7 @@ describe('deprecatedJQueryDropdown', () => {
loadFixtures('static/deprecated_jquery_dropdown.html');
test.dropdownContainerElement = $('.dropdown.inline');
test.$dropdownMenuElement = $('.dropdown-menu', test.dropdownContainerElement);
+ // eslint-disable-next-line import/no-deprecated
test.projectsData = getJSONFixture('static/projects.json');
});
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 67e4a82787c..2b706d21f51 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
@@ -4,13 +4,13 @@ exports[`Design management design version dropdown component renders design vers
<gl-dropdown-stub
category="primary"
clearalltext="Clear all"
+ clearalltextclass="gl-px-5"
headertext=""
hideheaderborder="true"
highlighteditemstitle="Selected"
highlighteditemstitleclass="gl-px-5"
issueiid=""
projectpath=""
- showhighlighteditemstitle="true"
size="small"
text="Showing latest version"
variant="default"
@@ -85,13 +85,13 @@ exports[`Design management design version dropdown component renders design vers
<gl-dropdown-stub
category="primary"
clearalltext="Clear all"
+ clearalltextclass="gl-px-5"
headertext=""
hideheaderborder="true"
highlighteditemstitle="Selected"
highlighteditemstitleclass="gl-px-5"
issueiid=""
projectpath=""
- showhighlighteditemstitle="true"
size="small"
text="Showing latest version"
variant="default"
diff --git a/spec/frontend/design_management/utils/cache_update_spec.js b/spec/frontend/design_management/utils/cache_update_spec.js
index 7327cf00abd..fa6a666bb37 100644
--- a/spec/frontend/design_management/utils/cache_update_spec.js
+++ b/spec/frontend/design_management/utils/cache_update_spec.js
@@ -26,11 +26,11 @@ describe('Design Management cache update', () => {
describe('error handling', () => {
it.each`
- fnName | subject | errorMessage | extraArgs
- ${'updateStoreAfterDesignsDelete'} | ${updateStoreAfterDesignsDelete} | ${designDeletionError({ singular: true })} | ${[[design]]}
- ${'updateStoreAfterAddImageDiffNote'} | ${updateStoreAfterAddImageDiffNote} | ${ADD_IMAGE_DIFF_NOTE_ERROR} | ${[]}
- ${'updateStoreAfterUploadDesign'} | ${updateStoreAfterUploadDesign} | ${mockErrors[0]} | ${[]}
- ${'updateStoreAfterUpdateImageDiffNote'} | ${updateStoreAfterRepositionImageDiffNote} | ${UPDATE_IMAGE_DIFF_NOTE_ERROR} | ${[]}
+ fnName | subject | errorMessage | extraArgs
+ ${'updateStoreAfterDesignsDelete'} | ${updateStoreAfterDesignsDelete} | ${designDeletionError()} | ${[[design]]}
+ ${'updateStoreAfterAddImageDiffNote'} | ${updateStoreAfterAddImageDiffNote} | ${ADD_IMAGE_DIFF_NOTE_ERROR} | ${[]}
+ ${'updateStoreAfterUploadDesign'} | ${updateStoreAfterUploadDesign} | ${mockErrors[0]} | ${[]}
+ ${'updateStoreAfterUpdateImageDiffNote'} | ${updateStoreAfterRepositionImageDiffNote} | ${UPDATE_IMAGE_DIFF_NOTE_ERROR} | ${[]}
`('$fnName handles errors in response', ({ subject, extraArgs, errorMessage }) => {
expect(createFlash).not.toHaveBeenCalled();
expect(() => subject(mockStore, { errors: mockErrors }, {}, ...extraArgs)).toThrow();
diff --git a/spec/frontend/design_management/utils/error_messages_spec.js b/spec/frontend/design_management/utils/error_messages_spec.js
index b80dcd9abde..4994f4f6fd0 100644
--- a/spec/frontend/design_management/utils/error_messages_spec.js
+++ b/spec/frontend/design_management/utils/error_messages_spec.js
@@ -10,20 +10,21 @@ const mockFilenames = (n) =>
describe('Error message', () => {
describe('designDeletionError', () => {
- const singularMsg = 'Could not archive a design. Please try again.';
- const pluralMsg = 'Could not archive designs. Please try again.';
+ const singularMsg = 'Failed to archive a design. Please try again.';
+ const pluralMsg = 'Failed to archive designs. Please try again.';
- describe('when [singular=true]', () => {
- it.each([[undefined], [true]])('uses singular grammar', (singularOption) => {
- expect(designDeletionError({ singular: singularOption })).toEqual(singularMsg);
- });
- });
-
- describe('when [singular=false]', () => {
- it('uses plural grammar', () => {
- expect(designDeletionError({ singular: false })).toEqual(pluralMsg);
- });
- });
+ it.each`
+ designsLength | expectedText
+ ${undefined} | ${singularMsg}
+ ${0} | ${pluralMsg}
+ ${1} | ${singularMsg}
+ ${2} | ${pluralMsg}
+ `(
+ 'returns "$expectedText" when designsLength is $designsLength',
+ ({ designsLength, expectedText }) => {
+ expect(designDeletionError(designsLength)).toBe(expectedText);
+ },
+ );
});
describe.each([
@@ -47,12 +48,12 @@ describe('Error message', () => {
[
mockFilenames(7),
mockFilenames(6),
- 'Upload skipped. Some of the designs you tried uploading did not change: 1.jpg, 2.jpg, 3.jpg, 4.jpg, 5.jpg, and 1 more.',
+ 'Upload skipped. Some of the designs you tried uploading did not change: 1.jpg, 2.jpg, 3.jpg, 4.jpg, 5.jpg and 1 more.',
],
[
mockFilenames(8),
mockFilenames(7),
- 'Upload skipped. Some of the designs you tried uploading did not change: 1.jpg, 2.jpg, 3.jpg, 4.jpg, 5.jpg, and 2 more.',
+ 'Upload skipped. Some of the designs you tried uploading did not change: 1.jpg, 2.jpg, 3.jpg, 4.jpg, 5.jpg and 2 more.',
],
])('designUploadSkippedWarning', (uploadedFiles, skippedFiles, expected) => {
it('returns expected warning message', () => {
diff --git a/spec/frontend/diffs/components/app_spec.js b/spec/frontend/diffs/components/app_spec.js
index 9dc82bbdc93..0527c2153f4 100644
--- a/spec/frontend/diffs/components/app_spec.js
+++ b/spec/frontend/diffs/components/app_spec.js
@@ -13,11 +13,8 @@ import DiffFile from '~/diffs/components/diff_file.vue';
import NoChanges from '~/diffs/components/no_changes.vue';
import TreeList from '~/diffs/components/tree_list.vue';
-/* eslint-disable import/order */
-/* You know what: sometimes alphabetical isn't the best order */
import CollapsedFilesWarning from '~/diffs/components/collapsed_files_warning.vue';
import HiddenFilesWarning from '~/diffs/components/hidden_files_warning.vue';
-/* eslint-enable import/order */
import axios from '~/lib/utils/axios_utils';
import * as urlUtils from '~/lib/utils/url_utility';
@@ -705,4 +702,23 @@ describe('diffs/components/app', () => {
);
});
});
+
+ describe('fluid layout', () => {
+ beforeEach(() => {
+ setFixtures(
+ '<div><div class="merge-request-container limit-container-width container-limited"></div></div>',
+ );
+ });
+
+ it('removes limited container classes when on diffs tab', () => {
+ createComponent({ isFluidLayout: false, shouldShow: true }, () => {}, {
+ glFeatures: { mrChangesFluidLayout: true },
+ });
+
+ const containerClassList = document.querySelector('.merge-request-container').classList;
+
+ expect(containerClassList).not.toContain('container-limited');
+ expect(containerClassList).not.toContain('limit-container-width');
+ });
+ });
});
diff --git a/spec/frontend/diffs/components/commit_item_spec.js b/spec/frontend/diffs/components/commit_item_spec.js
index 0191822d97a..d887029124f 100644
--- a/spec/frontend/diffs/components/commit_item_spec.js
+++ b/spec/frontend/diffs/components/commit_item_spec.js
@@ -1,10 +1,10 @@
import { mount } from '@vue/test-utils';
+import getDiffWithCommit from 'test_fixtures/merge_request_diffs/with_commit.json';
import { TEST_HOST } from 'helpers/test_constants';
import { trimText } from 'helpers/text_helper';
import Component from '~/diffs/components/commit_item.vue';
import { getTimeago } from '~/lib/utils/datetime_utility';
import CommitPipelineStatus from '~/projects/tree/components/commit_pipeline_status_component.vue';
-import getDiffWithCommit from '../mock_data/diff_with_commit';
jest.mock('~/user_popovers');
@@ -18,7 +18,7 @@ describe('diffs/components/commit_item', () => {
let wrapper;
const timeago = getTimeago();
- const { commit } = getDiffWithCommit();
+ const { commit } = getDiffWithCommit;
const getTitleElement = () => wrapper.find('.commit-row-message.item-title');
const getDescElement = () => wrapper.find('pre.commit-row-description');
diff --git a/spec/frontend/diffs/components/compare_versions_spec.js b/spec/frontend/diffs/components/compare_versions_spec.js
index 1c0cb1193fa..c48935bc4f0 100644
--- a/spec/frontend/diffs/components/compare_versions_spec.js
+++ b/spec/frontend/diffs/components/compare_versions_spec.js
@@ -1,11 +1,11 @@
import { mount, createLocalVue } from '@vue/test-utils';
import Vuex from 'vuex';
+import getDiffWithCommit from 'test_fixtures/merge_request_diffs/with_commit.json';
import setWindowLocation from 'helpers/set_window_location_helper';
import { TEST_HOST } from 'helpers/test_constants';
import { trimText } from 'helpers/text_helper';
import CompareVersionsComponent from '~/diffs/components/compare_versions.vue';
import { createStore } from '~/mr_notes/stores';
-import getDiffWithCommit from '../mock_data/diff_with_commit';
import diffsMockData from '../mock_data/merge_request_diffs';
const localVue = createLocalVue();
@@ -22,7 +22,7 @@ describe('CompareVersions', () => {
let wrapper;
let store;
const targetBranchName = 'tmp-wine-dev';
- const { commit } = getDiffWithCommit();
+ const { commit } = getDiffWithCommit;
const createWrapper = (props = {}, commitArgs = {}, createCommit = true) => {
if (createCommit) {
@@ -150,7 +150,7 @@ describe('CompareVersions', () => {
describe('commit', () => {
beforeEach(() => {
- store.state.diffs.commit = getDiffWithCommit().commit;
+ store.state.diffs.commit = getDiffWithCommit.commit;
createWrapper();
});
diff --git a/spec/frontend/diffs/mock_data/diff_with_commit.js b/spec/frontend/diffs/mock_data/diff_with_commit.js
deleted file mode 100644
index f3b39bd3577..00000000000
--- a/spec/frontend/diffs/mock_data/diff_with_commit.js
+++ /dev/null
@@ -1,5 +0,0 @@
-const FIXTURE = 'merge_request_diffs/with_commit.json';
-
-export default function getDiffWithCommit() {
- return getJSONFixture(FIXTURE);
-}
diff --git a/spec/frontend/diffs/store/actions_spec.js b/spec/frontend/diffs/store/actions_spec.js
index b35abc9da02..85734e05aeb 100644
--- a/spec/frontend/diffs/store/actions_spec.js
+++ b/spec/frontend/diffs/store/actions_spec.js
@@ -51,7 +51,7 @@ import {
} from '~/diffs/store/actions';
import * as types from '~/diffs/store/mutation_types';
import * as utils from '~/diffs/store/utils';
-import * as workerUtils from '~/diffs/utils/workers';
+import * as treeWorkerUtils from '~/diffs/utils/tree_worker_utils';
import createFlash from '~/flash';
import axios from '~/lib/utils/axios_utils';
import * as commonUtils from '~/lib/utils/common_utils';
@@ -253,7 +253,7 @@ describe('DiffsStoreActions', () => {
// Workers are synchronous in Jest environment (see https://gitlab.com/gitlab-org/gitlab/-/merge_requests/58805)
{
type: types.SET_TREE_DATA,
- payload: workerUtils.generateTreeList(diffMetadata.diff_files),
+ payload: treeWorkerUtils.generateTreeList(diffMetadata.diff_files),
},
],
[],
diff --git a/spec/frontend/diffs/utils/tree_worker_utils_spec.js b/spec/frontend/diffs/utils/tree_worker_utils_spec.js
new file mode 100644
index 00000000000..8113428f712
--- /dev/null
+++ b/spec/frontend/diffs/utils/tree_worker_utils_spec.js
@@ -0,0 +1,313 @@
+import {
+ generateTreeList,
+ getLowestSingleFolder,
+ flattenTree,
+} from '~/diffs/utils/tree_worker_utils';
+
+describe('~/diffs/utils/tree_worker_utils', () => {
+ describe('generateTreeList', () => {
+ let files;
+
+ beforeAll(() => {
+ files = [
+ {
+ new_path: 'app/index.js',
+ deleted_file: false,
+ new_file: false,
+ removed_lines: 10,
+ added_lines: 0,
+ file_hash: 'test',
+ },
+ {
+ new_path: 'app/test/index.js',
+ deleted_file: false,
+ new_file: true,
+ removed_lines: 0,
+ added_lines: 0,
+ file_hash: 'test',
+ },
+ {
+ new_path: 'app/test/filepathneedstruncating.js',
+ deleted_file: false,
+ new_file: true,
+ removed_lines: 0,
+ added_lines: 0,
+ file_hash: 'test',
+ },
+ {
+ new_path: 'package.json',
+ deleted_file: true,
+ new_file: false,
+ removed_lines: 0,
+ added_lines: 0,
+ file_hash: 'test',
+ },
+ ];
+ });
+
+ it('creates a tree of files', () => {
+ const { tree } = generateTreeList(files);
+
+ expect(tree).toEqual([
+ {
+ key: 'app',
+ path: 'app',
+ name: 'app',
+ type: 'tree',
+ tree: [
+ {
+ addedLines: 0,
+ changed: true,
+ deleted: false,
+ fileHash: 'test',
+ key: 'app/index.js',
+ name: 'index.js',
+ parentPath: 'app/',
+ path: 'app/index.js',
+ removedLines: 10,
+ tempFile: false,
+ type: 'blob',
+ tree: [],
+ },
+ {
+ key: 'app/test',
+ path: 'app/test',
+ name: 'test',
+ type: 'tree',
+ opened: true,
+ tree: [
+ {
+ addedLines: 0,
+ changed: true,
+ deleted: false,
+ fileHash: 'test',
+ key: 'app/test/index.js',
+ name: 'index.js',
+ parentPath: 'app/test/',
+ path: 'app/test/index.js',
+ removedLines: 0,
+ tempFile: true,
+ type: 'blob',
+ tree: [],
+ },
+ {
+ addedLines: 0,
+ changed: true,
+ deleted: false,
+ fileHash: 'test',
+ key: 'app/test/filepathneedstruncating.js',
+ name: 'filepathneedstruncating.js',
+ parentPath: 'app/test/',
+ path: 'app/test/filepathneedstruncating.js',
+ removedLines: 0,
+ tempFile: true,
+ type: 'blob',
+ tree: [],
+ },
+ ],
+ },
+ ],
+ opened: true,
+ },
+ {
+ key: 'package.json',
+ parentPath: '/',
+ path: 'package.json',
+ name: 'package.json',
+ type: 'blob',
+ changed: true,
+ tempFile: false,
+ deleted: true,
+ fileHash: 'test',
+ addedLines: 0,
+ removedLines: 0,
+ tree: [],
+ },
+ ]);
+ });
+
+ it('creates flat list of blobs & folders', () => {
+ const { treeEntries } = generateTreeList(files);
+
+ expect(Object.keys(treeEntries)).toEqual([
+ 'app',
+ 'app/index.js',
+ 'app/test',
+ 'app/test/index.js',
+ 'app/test/filepathneedstruncating.js',
+ 'package.json',
+ ]);
+ });
+ });
+
+ describe('getLowestSingleFolder', () => {
+ it('returns path and tree of lowest single folder tree', () => {
+ const folder = {
+ name: 'app',
+ type: 'tree',
+ tree: [
+ {
+ name: 'javascripts',
+ type: 'tree',
+ tree: [
+ {
+ type: 'blob',
+ name: 'index.js',
+ },
+ ],
+ },
+ ],
+ };
+ const { path, treeAcc } = getLowestSingleFolder(folder);
+
+ expect(path).toEqual('app/javascripts');
+ expect(treeAcc).toEqual([
+ {
+ type: 'blob',
+ name: 'index.js',
+ },
+ ]);
+ });
+
+ it('returns passed in folders path & tree when more than tree exists', () => {
+ const folder = {
+ name: 'app',
+ type: 'tree',
+ tree: [
+ {
+ name: 'spec',
+ type: 'blob',
+ tree: [],
+ },
+ ],
+ };
+ const { path, treeAcc } = getLowestSingleFolder(folder);
+
+ expect(path).toEqual('app');
+ expect(treeAcc).toBeNull();
+ });
+ });
+
+ describe('flattenTree', () => {
+ it('returns flattened directory structure', () => {
+ const tree = [
+ {
+ type: 'tree',
+ name: 'app',
+ tree: [
+ {
+ type: 'tree',
+ name: 'javascripts',
+ tree: [
+ {
+ type: 'blob',
+ name: 'index.js',
+ tree: [],
+ },
+ ],
+ },
+ ],
+ },
+ {
+ type: 'tree',
+ name: 'ee',
+ tree: [
+ {
+ type: 'tree',
+ name: 'lib',
+ tree: [
+ {
+ type: 'tree',
+ name: 'ee',
+ tree: [
+ {
+ type: 'tree',
+ name: 'gitlab',
+ tree: [
+ {
+ type: 'tree',
+ name: 'checks',
+ tree: [
+ {
+ type: 'tree',
+ name: 'longtreenametomakepath',
+ tree: [
+ {
+ type: 'blob',
+ name: 'diff_check.rb',
+ tree: [],
+ },
+ ],
+ },
+ ],
+ },
+ ],
+ },
+ ],
+ },
+ ],
+ },
+ ],
+ },
+ {
+ type: 'tree',
+ name: 'spec',
+ tree: [
+ {
+ type: 'tree',
+ name: 'javascripts',
+ tree: [],
+ },
+ {
+ type: 'blob',
+ name: 'index_spec.js',
+ tree: [],
+ },
+ ],
+ },
+ ];
+ const flattened = flattenTree(tree);
+
+ expect(flattened).toEqual([
+ {
+ type: 'tree',
+ name: 'app/javascripts',
+ tree: [
+ {
+ type: 'blob',
+ name: 'index.js',
+ tree: [],
+ },
+ ],
+ },
+ {
+ type: 'tree',
+ name: 'ee/lib/…/…/…/longtreenametomakepath',
+ tree: [
+ {
+ name: 'diff_check.rb',
+ tree: [],
+ type: 'blob',
+ },
+ ],
+ },
+ {
+ type: 'tree',
+ name: 'spec',
+ tree: [
+ {
+ type: 'tree',
+ name: 'javascripts',
+ tree: [],
+ },
+ {
+ type: 'blob',
+ name: 'index_spec.js',
+ tree: [],
+ },
+ ],
+ },
+ ]);
+ });
+ });
+});
diff --git a/spec/frontend/diffs/utils/workers_spec.js b/spec/frontend/diffs/utils/workers_spec.js
deleted file mode 100644
index 25d8183b777..00000000000
--- a/spec/frontend/diffs/utils/workers_spec.js
+++ /dev/null
@@ -1,309 +0,0 @@
-import { generateTreeList, getLowestSingleFolder, flattenTree } from '~/diffs/utils/workers';
-
-describe('~/diffs/utils/workers', () => {
- describe('generateTreeList', () => {
- let files;
-
- beforeAll(() => {
- files = [
- {
- new_path: 'app/index.js',
- deleted_file: false,
- new_file: false,
- removed_lines: 10,
- added_lines: 0,
- file_hash: 'test',
- },
- {
- new_path: 'app/test/index.js',
- deleted_file: false,
- new_file: true,
- removed_lines: 0,
- added_lines: 0,
- file_hash: 'test',
- },
- {
- new_path: 'app/test/filepathneedstruncating.js',
- deleted_file: false,
- new_file: true,
- removed_lines: 0,
- added_lines: 0,
- file_hash: 'test',
- },
- {
- new_path: 'package.json',
- deleted_file: true,
- new_file: false,
- removed_lines: 0,
- added_lines: 0,
- file_hash: 'test',
- },
- ];
- });
-
- it('creates a tree of files', () => {
- const { tree } = generateTreeList(files);
-
- expect(tree).toEqual([
- {
- key: 'app',
- path: 'app',
- name: 'app',
- type: 'tree',
- tree: [
- {
- addedLines: 0,
- changed: true,
- deleted: false,
- fileHash: 'test',
- key: 'app/index.js',
- name: 'index.js',
- parentPath: 'app/',
- path: 'app/index.js',
- removedLines: 10,
- tempFile: false,
- type: 'blob',
- tree: [],
- },
- {
- key: 'app/test',
- path: 'app/test',
- name: 'test',
- type: 'tree',
- opened: true,
- tree: [
- {
- addedLines: 0,
- changed: true,
- deleted: false,
- fileHash: 'test',
- key: 'app/test/index.js',
- name: 'index.js',
- parentPath: 'app/test/',
- path: 'app/test/index.js',
- removedLines: 0,
- tempFile: true,
- type: 'blob',
- tree: [],
- },
- {
- addedLines: 0,
- changed: true,
- deleted: false,
- fileHash: 'test',
- key: 'app/test/filepathneedstruncating.js',
- name: 'filepathneedstruncating.js',
- parentPath: 'app/test/',
- path: 'app/test/filepathneedstruncating.js',
- removedLines: 0,
- tempFile: true,
- type: 'blob',
- tree: [],
- },
- ],
- },
- ],
- opened: true,
- },
- {
- key: 'package.json',
- parentPath: '/',
- path: 'package.json',
- name: 'package.json',
- type: 'blob',
- changed: true,
- tempFile: false,
- deleted: true,
- fileHash: 'test',
- addedLines: 0,
- removedLines: 0,
- tree: [],
- },
- ]);
- });
-
- it('creates flat list of blobs & folders', () => {
- const { treeEntries } = generateTreeList(files);
-
- expect(Object.keys(treeEntries)).toEqual([
- 'app',
- 'app/index.js',
- 'app/test',
- 'app/test/index.js',
- 'app/test/filepathneedstruncating.js',
- 'package.json',
- ]);
- });
- });
-
- describe('getLowestSingleFolder', () => {
- it('returns path and tree of lowest single folder tree', () => {
- const folder = {
- name: 'app',
- type: 'tree',
- tree: [
- {
- name: 'javascripts',
- type: 'tree',
- tree: [
- {
- type: 'blob',
- name: 'index.js',
- },
- ],
- },
- ],
- };
- const { path, treeAcc } = getLowestSingleFolder(folder);
-
- expect(path).toEqual('app/javascripts');
- expect(treeAcc).toEqual([
- {
- type: 'blob',
- name: 'index.js',
- },
- ]);
- });
-
- it('returns passed in folders path & tree when more than tree exists', () => {
- const folder = {
- name: 'app',
- type: 'tree',
- tree: [
- {
- name: 'spec',
- type: 'blob',
- tree: [],
- },
- ],
- };
- const { path, treeAcc } = getLowestSingleFolder(folder);
-
- expect(path).toEqual('app');
- expect(treeAcc).toBeNull();
- });
- });
-
- describe('flattenTree', () => {
- it('returns flattened directory structure', () => {
- const tree = [
- {
- type: 'tree',
- name: 'app',
- tree: [
- {
- type: 'tree',
- name: 'javascripts',
- tree: [
- {
- type: 'blob',
- name: 'index.js',
- tree: [],
- },
- ],
- },
- ],
- },
- {
- type: 'tree',
- name: 'ee',
- tree: [
- {
- type: 'tree',
- name: 'lib',
- tree: [
- {
- type: 'tree',
- name: 'ee',
- tree: [
- {
- type: 'tree',
- name: 'gitlab',
- tree: [
- {
- type: 'tree',
- name: 'checks',
- tree: [
- {
- type: 'tree',
- name: 'longtreenametomakepath',
- tree: [
- {
- type: 'blob',
- name: 'diff_check.rb',
- tree: [],
- },
- ],
- },
- ],
- },
- ],
- },
- ],
- },
- ],
- },
- ],
- },
- {
- type: 'tree',
- name: 'spec',
- tree: [
- {
- type: 'tree',
- name: 'javascripts',
- tree: [],
- },
- {
- type: 'blob',
- name: 'index_spec.js',
- tree: [],
- },
- ],
- },
- ];
- const flattened = flattenTree(tree);
-
- expect(flattened).toEqual([
- {
- type: 'tree',
- name: 'app/javascripts',
- tree: [
- {
- type: 'blob',
- name: 'index.js',
- tree: [],
- },
- ],
- },
- {
- type: 'tree',
- name: 'ee/lib/…/…/…/longtreenametomakepath',
- tree: [
- {
- name: 'diff_check.rb',
- tree: [],
- type: 'blob',
- },
- ],
- },
- {
- type: 'tree',
- name: 'spec',
- tree: [
- {
- type: 'tree',
- name: 'javascripts',
- tree: [],
- },
- {
- type: 'blob',
- name: 'index_spec.js',
- tree: [],
- },
- ],
- },
- ]);
- });
- });
-});
diff --git a/spec/frontend/droplab/constants_spec.js b/spec/frontend/droplab/constants_spec.js
deleted file mode 100644
index fd48228d6a2..00000000000
--- a/spec/frontend/droplab/constants_spec.js
+++ /dev/null
@@ -1,39 +0,0 @@
-import * as constants from '~/droplab/constants';
-
-describe('constants', () => {
- describe('DATA_TRIGGER', () => {
- it('should be `data-dropdown-trigger`', () => {
- expect(constants.DATA_TRIGGER).toBe('data-dropdown-trigger');
- });
- });
-
- describe('DATA_DROPDOWN', () => {
- it('should be `data-dropdown`', () => {
- expect(constants.DATA_DROPDOWN).toBe('data-dropdown');
- });
- });
-
- describe('SELECTED_CLASS', () => {
- it('should be `droplab-item-selected`', () => {
- expect(constants.SELECTED_CLASS).toBe('droplab-item-selected');
- });
- });
-
- describe('ACTIVE_CLASS', () => {
- it('should be `droplab-item-active`', () => {
- expect(constants.ACTIVE_CLASS).toBe('droplab-item-active');
- });
- });
-
- describe('TEMPLATE_REGEX', () => {
- it('should be a handlebars templating syntax regex', () => {
- expect(constants.TEMPLATE_REGEX).toEqual(/\{\{(.+?)\}\}/g);
- });
- });
-
- describe('IGNORE_CLASS', () => {
- it('should be `droplab-item-ignore`', () => {
- expect(constants.IGNORE_CLASS).toBe('droplab-item-ignore');
- });
- });
-});
diff --git a/spec/frontend/droplab/drop_down_spec.js b/spec/frontend/droplab/drop_down_spec.js
deleted file mode 100644
index dcdbbcd4ccf..00000000000
--- a/spec/frontend/droplab/drop_down_spec.js
+++ /dev/null
@@ -1,662 +0,0 @@
-import { SELECTED_CLASS } from '~/droplab/constants';
-import DropDown from '~/droplab/drop_down';
-import utils from '~/droplab/utils';
-
-describe('DropLab DropDown', () => {
- let testContext;
-
- beforeEach(() => {
- testContext = {};
- });
-
- describe('class constructor', () => {
- beforeEach(() => {
- jest.spyOn(DropDown.prototype, 'getItems').mockImplementation(() => {});
- jest.spyOn(DropDown.prototype, 'initTemplateString').mockImplementation(() => {});
- jest.spyOn(DropDown.prototype, 'addEvents').mockImplementation(() => {});
-
- testContext.list = { innerHTML: 'innerHTML' };
- testContext.dropdown = new DropDown(testContext.list);
- });
-
- it('sets the .hidden property to true', () => {
- expect(testContext.dropdown.hidden).toBe(true);
- });
-
- it('sets the .list property', () => {
- expect(testContext.dropdown.list).toBe(testContext.list);
- });
-
- it('calls .getItems', () => {
- expect(DropDown.prototype.getItems).toHaveBeenCalled();
- });
-
- it('calls .initTemplateString', () => {
- expect(DropDown.prototype.initTemplateString).toHaveBeenCalled();
- });
-
- it('calls .addEvents', () => {
- expect(DropDown.prototype.addEvents).toHaveBeenCalled();
- });
-
- it('sets the .initialState property to the .list.innerHTML', () => {
- expect(testContext.dropdown.initialState).toBe(testContext.list.innerHTML);
- });
-
- describe('if the list argument is a string', () => {
- beforeEach(() => {
- testContext.element = {};
- testContext.selector = '.selector';
-
- jest.spyOn(Document.prototype, 'querySelector').mockReturnValue(testContext.element);
-
- testContext.dropdown = new DropDown(testContext.selector);
- });
-
- it('calls .querySelector with the selector string', () => {
- expect(Document.prototype.querySelector).toHaveBeenCalledWith(testContext.selector);
- });
-
- it('sets the .list property element', () => {
- expect(testContext.dropdown.list).toBe(testContext.element);
- });
- });
- });
-
- describe('getItems', () => {
- beforeEach(() => {
- testContext.list = { querySelectorAll: () => {} };
- testContext.dropdown = { list: testContext.list };
- testContext.nodeList = [];
-
- jest.spyOn(testContext.list, 'querySelectorAll').mockReturnValue(testContext.nodeList);
-
- testContext.getItems = DropDown.prototype.getItems.call(testContext.dropdown);
- });
-
- it('calls .querySelectorAll with a list item query', () => {
- expect(testContext.list.querySelectorAll).toHaveBeenCalledWith('li');
- });
-
- it('sets the .items property to the returned list items', () => {
- expect(testContext.dropdown.items).toEqual(expect.any(Array));
- });
-
- it('returns the .items', () => {
- expect(testContext.getItems).toEqual(expect.any(Array));
- });
- });
-
- describe('initTemplateString', () => {
- beforeEach(() => {
- testContext.items = [{ outerHTML: '<a></a>' }, { outerHTML: '<img>' }];
- testContext.dropdown = { items: testContext.items };
-
- DropDown.prototype.initTemplateString.call(testContext.dropdown);
- });
-
- it('should set .templateString to the last items .outerHTML', () => {
- expect(testContext.dropdown.templateString).toBe(testContext.items[1].outerHTML);
- });
-
- it('should not set .templateString to a non-last items .outerHTML', () => {
- expect(testContext.dropdown.templateString).not.toBe(testContext.items[0].outerHTML);
- });
-
- describe('if .items is not set', () => {
- beforeEach(() => {
- testContext.dropdown = { getItems: () => {} };
-
- jest.spyOn(testContext.dropdown, 'getItems').mockReturnValue([]);
-
- DropDown.prototype.initTemplateString.call(testContext.dropdown);
- });
-
- it('should call .getItems', () => {
- expect(testContext.dropdown.getItems).toHaveBeenCalled();
- });
- });
-
- describe('if items array is empty', () => {
- beforeEach(() => {
- testContext.dropdown = { items: [] };
-
- DropDown.prototype.initTemplateString.call(testContext.dropdown);
- });
-
- it('should set .templateString to an empty string', () => {
- expect(testContext.dropdown.templateString).toBe('');
- });
- });
- });
-
- describe('clickEvent', () => {
- beforeEach(() => {
- testContext.classList = {
- contains: jest.fn(),
- };
- testContext.list = { dispatchEvent: () => {} };
- testContext.dropdown = {
- hideOnClick: true,
- hide: () => {},
- list: testContext.list,
- addSelectedClass: () => {},
- };
- testContext.event = {
- preventDefault: () => {},
- target: {
- classList: testContext.classList,
- closest: () => null,
- },
- };
-
- testContext.dummyListItem = document.createElement('li');
- jest.spyOn(testContext.event.target, 'closest').mockImplementation((selector) => {
- if (selector === 'li') {
- return testContext.dummyListItem;
- }
-
- return null;
- });
-
- jest.spyOn(testContext.dropdown, 'hide').mockImplementation(() => {});
- jest.spyOn(testContext.dropdown, 'addSelectedClass').mockImplementation(() => {});
- jest.spyOn(testContext.list, 'dispatchEvent').mockImplementation(() => {});
- jest.spyOn(testContext.event, 'preventDefault').mockImplementation(() => {});
- window.CustomEvent = jest.fn();
- testContext.classList.contains.mockReturnValue(false);
- });
-
- describe('normal click event', () => {
- beforeEach(() => {
- DropDown.prototype.clickEvent.call(testContext.dropdown, testContext.event);
- });
- it('should call event.target.closest', () => {
- expect(testContext.event.target.closest).toHaveBeenCalledWith('.droplab-item-ignore');
- expect(testContext.event.target.closest).toHaveBeenCalledWith('li');
- });
-
- it('should call addSelectedClass', () => {
- expect(testContext.dropdown.addSelectedClass).toHaveBeenCalledWith(
- testContext.dummyListItem,
- );
- });
-
- it('should call .preventDefault', () => {
- expect(testContext.event.preventDefault).toHaveBeenCalled();
- });
-
- it('should call .hide', () => {
- expect(testContext.dropdown.hide).toHaveBeenCalled();
- });
-
- it('should construct CustomEvent', () => {
- expect(window.CustomEvent).toHaveBeenCalledWith('click.dl', expect.any(Object));
- });
-
- it('should call .dispatchEvent with the customEvent', () => {
- expect(testContext.list.dispatchEvent).toHaveBeenCalledWith({});
- });
- });
-
- describe('if the target is a UL element', () => {
- beforeEach(() => {
- testContext.event.target = document.createElement('ul');
-
- jest.spyOn(testContext.event.target, 'closest').mockImplementation(() => {});
- });
-
- it('should return immediately', () => {
- DropDown.prototype.clickEvent.call(testContext.dropdown, testContext.event);
-
- expect(testContext.event.target.closest).not.toHaveBeenCalled();
- expect(testContext.dropdown.addSelectedClass).not.toHaveBeenCalled();
- });
- });
-
- describe('if the target has the droplab-item-ignore class', () => {
- beforeEach(() => {
- testContext.ignoredButton = document.createElement('button');
- testContext.ignoredButton.classList.add('droplab-item-ignore');
- testContext.event.target = testContext.ignoredButton;
-
- jest.spyOn(testContext.ignoredButton, 'closest');
- });
-
- it('does not select element', () => {
- DropDown.prototype.clickEvent.call(testContext.dropdown, testContext.event);
-
- expect(testContext.ignoredButton.closest.mock.calls.length).toBe(1);
- expect(testContext.ignoredButton.closest).toHaveBeenCalledWith('.droplab-item-ignore');
- expect(testContext.dropdown.addSelectedClass).not.toHaveBeenCalled();
- });
- });
-
- describe('if no selected element exists', () => {
- beforeEach(() => {
- testContext.event.preventDefault.mockReset();
- testContext.dummyListItem = null;
- });
-
- it('should return before .preventDefault is called', () => {
- DropDown.prototype.clickEvent.call(testContext.dropdown, testContext.event);
-
- expect(testContext.event.preventDefault).not.toHaveBeenCalled();
- expect(testContext.dropdown.addSelectedClass).not.toHaveBeenCalled();
- });
- });
-
- describe('if hideOnClick is false', () => {
- beforeEach(() => {
- testContext.dropdown.hideOnClick = false;
- testContext.dropdown.hide.mockReset();
- });
-
- it('should not call .hide', () => {
- DropDown.prototype.clickEvent.call(testContext.dropdown, testContext.event);
-
- expect(testContext.dropdown.hide).not.toHaveBeenCalled();
- });
- });
- });
-
- describe('addSelectedClass', () => {
- beforeEach(() => {
- testContext.items = Array(4).forEach((item, i) => {
- testContext.items[i] = { classList: { add: () => {} } };
- jest.spyOn(testContext.items[i].classList, 'add').mockImplementation(() => {});
- });
- testContext.selected = { classList: { add: () => {} } };
- testContext.dropdown = { removeSelectedClasses: () => {} };
-
- jest.spyOn(testContext.dropdown, 'removeSelectedClasses').mockImplementation(() => {});
- jest.spyOn(testContext.selected.classList, 'add').mockImplementation(() => {});
-
- DropDown.prototype.addSelectedClass.call(testContext.dropdown, testContext.selected);
- });
-
- it('should call .removeSelectedClasses', () => {
- expect(testContext.dropdown.removeSelectedClasses).toHaveBeenCalled();
- });
-
- it('should call .classList.add', () => {
- expect(testContext.selected.classList.add).toHaveBeenCalledWith(SELECTED_CLASS);
- });
- });
-
- describe('removeSelectedClasses', () => {
- beforeEach(() => {
- testContext.items = [...Array(4)];
- testContext.items.forEach((item, i) => {
- testContext.items[i] = { classList: { add: jest.fn(), remove: jest.fn() } };
- });
- testContext.dropdown = { items: testContext.items };
-
- DropDown.prototype.removeSelectedClasses.call(testContext.dropdown);
- });
-
- it('should call .classList.remove for all items', () => {
- testContext.items.forEach((_, i) => {
- expect(testContext.items[i].classList.remove).toHaveBeenCalledWith(SELECTED_CLASS);
- });
- });
-
- describe('if .items is not set', () => {
- beforeEach(() => {
- testContext.dropdown = { getItems: () => {} };
-
- jest.spyOn(testContext.dropdown, 'getItems').mockReturnValue([]);
-
- DropDown.prototype.removeSelectedClasses.call(testContext.dropdown);
- });
-
- it('should call .getItems', () => {
- expect(testContext.dropdown.getItems).toHaveBeenCalled();
- });
- });
- });
-
- describe('addEvents', () => {
- beforeEach(() => {
- testContext.list = {
- addEventListener: () => {},
- querySelectorAll: () => [],
- };
- testContext.dropdown = {
- list: testContext.list,
- clickEvent: () => {},
- closeDropdown: () => {},
- eventWrapper: {},
- };
- });
-
- it('should call .addEventListener', () => {
- jest.spyOn(testContext.list, 'addEventListener').mockImplementation(() => {});
-
- DropDown.prototype.addEvents.call(testContext.dropdown);
-
- expect(testContext.list.addEventListener).toHaveBeenCalledWith('click', expect.any(Function));
- expect(testContext.list.addEventListener).toHaveBeenCalledWith('keyup', expect.any(Function));
- });
- });
-
- describe('setData', () => {
- beforeEach(() => {
- testContext.dropdown = { render: () => {} };
- testContext.data = ['data'];
-
- jest.spyOn(testContext.dropdown, 'render').mockImplementation(() => {});
-
- DropDown.prototype.setData.call(testContext.dropdown, testContext.data);
- });
-
- it('should set .data', () => {
- expect(testContext.dropdown.data).toBe(testContext.data);
- });
-
- it('should call .render with the .data', () => {
- expect(testContext.dropdown.render).toHaveBeenCalledWith(testContext.data);
- });
- });
-
- describe('addData', () => {
- beforeEach(() => {
- testContext.dropdown = { render: () => {}, data: ['data1'] };
- testContext.data = ['data2'];
-
- jest.spyOn(testContext.dropdown, 'render').mockImplementation(() => {});
- jest.spyOn(Array.prototype, 'concat');
-
- DropDown.prototype.addData.call(testContext.dropdown, testContext.data);
- });
-
- it('should call .concat with data', () => {
- expect(Array.prototype.concat).toHaveBeenCalledWith(testContext.data);
- });
-
- it('should set .data with concatination', () => {
- expect(testContext.dropdown.data).toStrictEqual(['data1', 'data2']);
- });
-
- it('should call .render with the .data', () => {
- expect(testContext.dropdown.render).toHaveBeenCalledWith(['data1', 'data2']);
- });
-
- describe('if .data is undefined', () => {
- beforeEach(() => {
- testContext.dropdown = { render: () => {}, data: undefined };
- testContext.data = ['data2'];
-
- jest.spyOn(testContext.dropdown, 'render').mockImplementation(() => {});
-
- DropDown.prototype.addData.call(testContext.dropdown, testContext.data);
- });
-
- it('should set .data with concatination', () => {
- expect(testContext.dropdown.data).toStrictEqual(['data2']);
- });
- });
- });
-
- describe('render', () => {
- beforeEach(() => {
- testContext.renderableList = {};
- testContext.list = {
- querySelector: (q) => {
- if (q === '.filter-dropdown-loading') {
- return false;
- }
- return testContext.renderableList;
- },
- dispatchEvent: () => {},
- };
- testContext.dropdown = { renderChildren: () => {}, list: testContext.list };
- testContext.data = [0, 1];
- testContext.customEvent = {};
-
- jest.spyOn(testContext.dropdown, 'renderChildren').mockImplementation((data) => data);
- jest.spyOn(testContext.list, 'dispatchEvent').mockImplementation(() => {});
- jest.spyOn(testContext.data, 'map');
- jest.spyOn(window, 'CustomEvent').mockReturnValue(testContext.customEvent);
-
- DropDown.prototype.render.call(testContext.dropdown, testContext.data);
- });
-
- it('should call .map', () => {
- expect(testContext.data.map).toHaveBeenCalledWith(expect.any(Function));
- });
-
- it('should call .renderChildren for each data item', () => {
- expect(testContext.dropdown.renderChildren.mock.calls.length).toBe(testContext.data.length);
- });
-
- it('sets the renderableList .innerHTML', () => {
- expect(testContext.renderableList.innerHTML).toBe('01');
- });
-
- it('should call render.dl', () => {
- expect(window.CustomEvent).toHaveBeenCalledWith('render.dl', expect.any(Object));
- });
-
- it('should call dispatchEvent with the customEvent', () => {
- expect(testContext.list.dispatchEvent).toHaveBeenCalledWith(testContext.customEvent);
- });
-
- describe('if no data argument is passed', () => {
- beforeEach(() => {
- testContext.data.map.mockReset();
- testContext.dropdown.renderChildren.mockReset();
-
- DropDown.prototype.render.call(testContext.dropdown, undefined);
- });
-
- it('should not call .map', () => {
- expect(testContext.data.map).not.toHaveBeenCalled();
- });
-
- it('should not call .renderChildren', () => {
- expect(testContext.dropdown.renderChildren).not.toHaveBeenCalled();
- });
- });
-
- describe('if no dynamic list is present', () => {
- beforeEach(() => {
- testContext.list = { querySelector: () => {}, dispatchEvent: () => {} };
- testContext.dropdown = { renderChildren: () => {}, list: testContext.list };
- testContext.data = [0, 1];
-
- jest.spyOn(testContext.dropdown, 'renderChildren').mockImplementation((data) => data);
- jest.spyOn(testContext.list, 'querySelector').mockImplementation(() => {});
- jest.spyOn(testContext.data, 'map');
-
- DropDown.prototype.render.call(testContext.dropdown, testContext.data);
- });
-
- it('sets the .list .innerHTML', () => {
- expect(testContext.list.innerHTML).toBe('01');
- });
- });
- });
-
- describe('renderChildren', () => {
- beforeEach(() => {
- testContext.templateString = 'templateString';
- testContext.dropdown = { templateString: testContext.templateString };
- testContext.data = { droplab_hidden: true };
- testContext.html = 'html';
- testContext.template = { firstChild: { outerHTML: 'outerHTML', style: {} } };
-
- jest.spyOn(utils, 'template').mockReturnValue(testContext.html);
- jest.spyOn(document, 'createElement').mockReturnValue(testContext.template);
- jest.spyOn(DropDown, 'setImagesSrc').mockImplementation(() => {});
-
- testContext.renderChildren = DropDown.prototype.renderChildren.call(
- testContext.dropdown,
- testContext.data,
- );
- });
-
- it('should call utils.t with .templateString and data', () => {
- expect(utils.template).toHaveBeenCalledWith(testContext.templateString, testContext.data);
- });
-
- it('should call document.createElement', () => {
- expect(document.createElement).toHaveBeenCalledWith('div');
- });
-
- it('should set the templates .innerHTML to the HTML', () => {
- expect(testContext.template.innerHTML).toBe(testContext.html);
- });
-
- it('should call .setImagesSrc with the template', () => {
- expect(DropDown.setImagesSrc).toHaveBeenCalledWith(testContext.template);
- });
-
- it('should set the template display to none', () => {
- expect(testContext.template.firstChild.style.display).toBe('none');
- });
-
- it('should return the templates .firstChild.outerHTML', () => {
- expect(testContext.renderChildren).toBe(testContext.template.firstChild.outerHTML);
- });
-
- describe('if droplab_hidden is false', () => {
- beforeEach(() => {
- testContext.data = { droplab_hidden: false };
- testContext.renderChildren = DropDown.prototype.renderChildren.call(
- testContext.dropdown,
- testContext.data,
- );
- });
-
- it('should set the template display to block', () => {
- expect(testContext.template.firstChild.style.display).toBe('block');
- });
- });
- });
-
- describe('setImagesSrc', () => {
- beforeEach(() => {
- testContext.template = { querySelectorAll: () => {} };
-
- jest.spyOn(testContext.template, 'querySelectorAll').mockReturnValue([]);
-
- DropDown.setImagesSrc(testContext.template);
- });
-
- it('should call .querySelectorAll', () => {
- expect(testContext.template.querySelectorAll).toHaveBeenCalledWith('img[data-src]');
- });
- });
-
- describe('show', () => {
- beforeEach(() => {
- testContext.list = { style: {} };
- testContext.dropdown = { list: testContext.list, hidden: true };
-
- DropDown.prototype.show.call(testContext.dropdown);
- });
-
- it('it should set .list display to block', () => {
- expect(testContext.list.style.display).toBe('block');
- });
-
- it('it should set .hidden to false', () => {
- expect(testContext.dropdown.hidden).toBe(false);
- });
-
- describe('if .hidden is false', () => {
- beforeEach(() => {
- testContext.list = { style: {} };
- testContext.dropdown = { list: testContext.list, hidden: false };
-
- testContext.show = DropDown.prototype.show.call(testContext.dropdown);
- });
-
- it('should return undefined', () => {
- expect(testContext.show).toBeUndefined();
- });
-
- it('should not set .list display to block', () => {
- expect(testContext.list.style.display).not.toBe('block');
- });
- });
- });
-
- describe('hide', () => {
- beforeEach(() => {
- testContext.list = { style: {} };
- testContext.dropdown = { list: testContext.list };
-
- DropDown.prototype.hide.call(testContext.dropdown);
- });
-
- it('it should set .list display to none', () => {
- expect(testContext.list.style.display).toBe('none');
- });
-
- it('it should set .hidden to true', () => {
- expect(testContext.dropdown.hidden).toBe(true);
- });
- });
-
- describe('toggle', () => {
- beforeEach(() => {
- testContext.hidden = true;
- testContext.dropdown = { hidden: testContext.hidden, show: () => {}, hide: () => {} };
-
- jest.spyOn(testContext.dropdown, 'show').mockImplementation(() => {});
- jest.spyOn(testContext.dropdown, 'hide').mockImplementation(() => {});
-
- DropDown.prototype.toggle.call(testContext.dropdown);
- });
-
- it('should call .show', () => {
- expect(testContext.dropdown.show).toHaveBeenCalled();
- });
-
- describe('if .hidden is false', () => {
- beforeEach(() => {
- testContext.hidden = false;
- testContext.dropdown = { hidden: testContext.hidden, show: () => {}, hide: () => {} };
-
- jest.spyOn(testContext.dropdown, 'show').mockImplementation(() => {});
- jest.spyOn(testContext.dropdown, 'hide').mockImplementation(() => {});
-
- DropDown.prototype.toggle.call(testContext.dropdown);
- });
-
- it('should call .hide', () => {
- expect(testContext.dropdown.hide).toHaveBeenCalled();
- });
- });
- });
-
- describe('destroy', () => {
- beforeEach(() => {
- testContext.list = { removeEventListener: () => {} };
- testContext.eventWrapper = { clickEvent: 'clickEvent' };
- testContext.dropdown = {
- list: testContext.list,
- hide: () => {},
- eventWrapper: testContext.eventWrapper,
- };
-
- jest.spyOn(testContext.list, 'removeEventListener').mockImplementation(() => {});
- jest.spyOn(testContext.dropdown, 'hide').mockImplementation(() => {});
-
- DropDown.prototype.destroy.call(testContext.dropdown);
- });
-
- it('it should call .hide', () => {
- expect(testContext.dropdown.hide).toHaveBeenCalled();
- });
-
- it('it should call .removeEventListener', () => {
- expect(testContext.list.removeEventListener).toHaveBeenCalledWith(
- 'click',
- testContext.eventWrapper.clickEvent,
- );
- });
- });
-});
diff --git a/spec/frontend/droplab/hook_spec.js b/spec/frontend/droplab/hook_spec.js
deleted file mode 100644
index 0b897a570f6..00000000000
--- a/spec/frontend/droplab/hook_spec.js
+++ /dev/null
@@ -1,94 +0,0 @@
-import DropDown from '~/droplab/drop_down';
-import Hook from '~/droplab/hook';
-
-jest.mock('~/droplab/drop_down', () => jest.fn());
-
-describe('Hook', () => {
- let testContext;
-
- beforeEach(() => {
- testContext = {};
- });
-
- describe('class constructor', () => {
- beforeEach(() => {
- testContext.trigger = { id: 'id' };
- testContext.list = {};
- testContext.plugins = {};
- testContext.config = {};
-
- testContext.hook = new Hook(
- testContext.trigger,
- testContext.list,
- testContext.plugins,
- testContext.config,
- );
- });
-
- it('should set .trigger', () => {
- expect(testContext.hook.trigger).toBe(testContext.trigger);
- });
-
- it('should set .list', () => {
- expect(testContext.hook.list).toEqual({});
- });
-
- it('should call DropDown constructor', () => {
- expect(DropDown).toHaveBeenCalledWith(testContext.list, testContext.config);
- });
-
- it('should set .type', () => {
- expect(testContext.hook.type).toBe('Hook');
- });
-
- it('should set .event', () => {
- expect(testContext.hook.event).toBe('click');
- });
-
- it('should set .plugins', () => {
- expect(testContext.hook.plugins).toBe(testContext.plugins);
- });
-
- it('should set .config', () => {
- expect(testContext.hook.config).toBe(testContext.config);
- });
-
- it('should set .id', () => {
- expect(testContext.hook.id).toBe(testContext.trigger.id);
- });
-
- describe('if config argument is undefined', () => {
- beforeEach(() => {
- testContext.config = undefined;
-
- testContext.hook = new Hook(
- testContext.trigger,
- testContext.list,
- testContext.plugins,
- testContext.config,
- );
- });
-
- it('should set .config to an empty object', () => {
- expect(testContext.hook.config).toEqual({});
- });
- });
-
- describe('if plugins argument is undefined', () => {
- beforeEach(() => {
- testContext.plugins = undefined;
-
- testContext.hook = new Hook(
- testContext.trigger,
- testContext.list,
- testContext.plugins,
- testContext.config,
- );
- });
-
- it('should set .plugins to an empty array', () => {
- expect(testContext.hook.plugins).toEqual([]);
- });
- });
- });
-});
diff --git a/spec/frontend/droplab/plugins/ajax_filter_spec.js b/spec/frontend/droplab/plugins/ajax_filter_spec.js
deleted file mode 100644
index d442d5cf416..00000000000
--- a/spec/frontend/droplab/plugins/ajax_filter_spec.js
+++ /dev/null
@@ -1,72 +0,0 @@
-import AjaxFilter from '~/droplab/plugins/ajax_filter';
-import AjaxCache from '~/lib/utils/ajax_cache';
-
-describe('AjaxFilter', () => {
- let dummyConfig;
- const dummyData = 'dummy data';
- let dummyList;
-
- beforeEach(() => {
- dummyConfig = {
- endpoint: 'dummy endpoint',
- searchKey: 'dummy search key',
- };
- dummyList = {
- data: [],
- list: document.createElement('div'),
- };
-
- AjaxFilter.hook = {
- config: {
- AjaxFilter: dummyConfig,
- },
- list: dummyList,
- };
- });
-
- describe('trigger', () => {
- let ajaxSpy;
-
- beforeEach(() => {
- jest.spyOn(AjaxCache, 'retrieve').mockImplementation((url) => ajaxSpy(url));
- jest.spyOn(AjaxFilter, '_loadData').mockImplementation(() => {});
-
- dummyConfig.onLoadingFinished = jest.fn();
-
- const dynamicList = document.createElement('div');
- dynamicList.dataset.dynamic = true;
- dummyList.list.appendChild(dynamicList);
- });
-
- it('calls onLoadingFinished after loading data', (done) => {
- ajaxSpy = (url) => {
- expect(url).toBe('dummy endpoint?dummy search key=');
- return Promise.resolve(dummyData);
- };
-
- AjaxFilter.trigger()
- .then(() => {
- expect(dummyConfig.onLoadingFinished.mock.calls.length).toBe(1);
- })
- .then(done)
- .catch(done.fail);
- });
-
- it('does not call onLoadingFinished if Ajax call fails', (done) => {
- const dummyError = new Error('My dummy is sick! :-(');
- ajaxSpy = (url) => {
- expect(url).toBe('dummy endpoint?dummy search key=');
- return Promise.reject(dummyError);
- };
-
- AjaxFilter.trigger()
- .then(done.fail)
- .catch((error) => {
- expect(error).toBe(dummyError);
- expect(dummyConfig.onLoadingFinished.mock.calls.length).toBe(0);
- })
- .then(done)
- .catch(done.fail);
- });
- });
-});
diff --git a/spec/frontend/droplab/plugins/ajax_spec.js b/spec/frontend/droplab/plugins/ajax_spec.js
deleted file mode 100644
index 7c6452e8337..00000000000
--- a/spec/frontend/droplab/plugins/ajax_spec.js
+++ /dev/null
@@ -1,41 +0,0 @@
-import Ajax from '~/droplab/plugins/ajax';
-import AjaxCache from '~/lib/utils/ajax_cache';
-
-describe('Ajax', () => {
- describe('preprocessing', () => {
- const config = {};
-
- describe('is not configured', () => {
- it('passes the data through', () => {
- const data = ['data'];
-
- expect(Ajax.preprocessing(config, data)).toEqual(data);
- });
- });
-
- describe('is configured', () => {
- const processedArray = ['processed'];
-
- beforeEach(() => {
- config.preprocessing = () => processedArray;
- jest.spyOn(config, 'preprocessing').mockImplementation(() => processedArray);
- });
-
- it('calls preprocessing', () => {
- Ajax.preprocessing(config, []);
-
- expect(config.preprocessing.mock.calls.length).toBe(1);
- });
-
- it('overrides AjaxCache', () => {
- jest.spyOn(AjaxCache, 'override').mockImplementation((endpoint, results) => {
- expect(results).toEqual(processedArray);
- });
-
- Ajax.preprocessing(config, []);
-
- expect(AjaxCache.override.mock.calls.length).toBe(1);
- });
- });
- });
-});
diff --git a/spec/frontend/droplab/plugins/input_setter_spec.js b/spec/frontend/droplab/plugins/input_setter_spec.js
deleted file mode 100644
index eebde018fa1..00000000000
--- a/spec/frontend/droplab/plugins/input_setter_spec.js
+++ /dev/null
@@ -1,259 +0,0 @@
-import InputSetter from '~/droplab/plugins/input_setter';
-
-describe('InputSetter', () => {
- let testContext;
-
- beforeEach(() => {
- testContext = {};
- });
-
- describe('init', () => {
- beforeEach(() => {
- testContext.config = { InputSetter: {} };
- testContext.hook = { config: testContext.config };
- testContext.inputSetter = {
- addEvents: jest.fn(),
- };
-
- InputSetter.init.call(testContext.inputSetter, testContext.hook);
- });
-
- it('should set .hook', () => {
- expect(testContext.inputSetter.hook).toBe(testContext.hook);
- });
-
- it('should set .config', () => {
- expect(testContext.inputSetter.config).toBe(testContext.config.InputSetter);
- });
-
- it('should set .eventWrapper', () => {
- expect(testContext.inputSetter.eventWrapper).toEqual({});
- });
-
- it('should call .addEvents', () => {
- expect(testContext.inputSetter.addEvents).toHaveBeenCalled();
- });
-
- describe('if config.InputSetter is not set', () => {
- beforeEach(() => {
- testContext.config = { InputSetter: undefined };
- testContext.hook = { config: testContext.config };
-
- InputSetter.init.call(testContext.inputSetter, testContext.hook);
- });
-
- it('should set .config to an empty object', () => {
- expect(testContext.inputSetter.config).toEqual({});
- });
-
- it('should set hook.config to an empty object', () => {
- expect(testContext.hook.config.InputSetter).toEqual({});
- });
- });
- });
-
- describe('addEvents', () => {
- beforeEach(() => {
- testContext.hook = {
- list: {
- list: {
- addEventListener: jest.fn(),
- },
- },
- };
- testContext.inputSetter = { eventWrapper: {}, hook: testContext.hook, setInputs: () => {} };
-
- InputSetter.addEvents.call(testContext.inputSetter);
- });
-
- it('should set .eventWrapper.setInputs', () => {
- expect(testContext.inputSetter.eventWrapper.setInputs).toEqual(expect.any(Function));
- });
-
- it('should call .addEventListener', () => {
- expect(testContext.hook.list.list.addEventListener).toHaveBeenCalledWith(
- 'click.dl',
- testContext.inputSetter.eventWrapper.setInputs,
- );
- });
- });
-
- describe('removeEvents', () => {
- beforeEach(() => {
- testContext.hook = {
- list: {
- list: {
- removeEventListener: jest.fn(),
- },
- },
- };
- testContext.eventWrapper = {
- setInputs: jest.fn(),
- };
- testContext.inputSetter = { eventWrapper: testContext.eventWrapper, hook: testContext.hook };
-
- InputSetter.removeEvents.call(testContext.inputSetter);
- });
-
- it('should call .removeEventListener', () => {
- expect(testContext.hook.list.list.removeEventListener).toHaveBeenCalledWith(
- 'click.dl',
- testContext.eventWrapper.setInputs,
- );
- });
- });
-
- describe('setInputs', () => {
- beforeEach(() => {
- testContext.event = { detail: { selected: {} } };
- testContext.config = [0, 1];
- testContext.inputSetter = { config: testContext.config, setInput: () => {} };
-
- jest.spyOn(testContext.inputSetter, 'setInput').mockImplementation(() => {});
-
- InputSetter.setInputs.call(testContext.inputSetter, testContext.event);
- });
-
- it('should call .setInput for each config element', () => {
- const allArgs = testContext.inputSetter.setInput.mock.calls;
-
- expect(allArgs.length).toEqual(2);
-
- allArgs.forEach((args, i) => {
- expect(args[0]).toBe(testContext.config[i]);
- expect(args[1]).toBe(testContext.event.detail.selected);
- });
- });
-
- describe('if config isnt an array', () => {
- beforeEach(() => {
- testContext.inputSetter = { config: {}, setInput: () => {} };
-
- InputSetter.setInputs.call(testContext.inputSetter, testContext.event);
- });
-
- it('should set .config to an array with .config as the first element', () => {
- expect(testContext.inputSetter.config).toEqual([{}]);
- });
- });
- });
-
- describe('setInput', () => {
- beforeEach(() => {
- testContext.selectedItem = { getAttribute: () => {} };
- testContext.input = { value: 'oldValue', tagName: 'INPUT', hasAttribute: () => {} };
- testContext.config = { valueAttribute: {}, input: testContext.input };
- testContext.inputSetter = { hook: { trigger: {} } };
- testContext.newValue = 'newValue';
-
- jest.spyOn(testContext.selectedItem, 'getAttribute').mockReturnValue(testContext.newValue);
- jest.spyOn(testContext.input, 'hasAttribute').mockReturnValue(false);
-
- InputSetter.setInput.call(
- testContext.inputSetter,
- testContext.config,
- testContext.selectedItem,
- );
- });
-
- it('should call .getAttribute', () => {
- expect(testContext.selectedItem.getAttribute).toHaveBeenCalledWith(
- testContext.config.valueAttribute,
- );
- });
-
- it('should call .hasAttribute', () => {
- expect(testContext.input.hasAttribute).toHaveBeenCalledWith(undefined);
- });
-
- it('should set the value of the input', () => {
- expect(testContext.input.value).toBe(testContext.newValue);
- });
-
- describe('if no config.input is provided', () => {
- beforeEach(() => {
- testContext.config = { valueAttribute: {} };
- testContext.trigger = { value: 'oldValue', tagName: 'INPUT', hasAttribute: () => {} };
- testContext.inputSetter = { hook: { trigger: testContext.trigger } };
-
- InputSetter.setInput.call(
- testContext.inputSetter,
- testContext.config,
- testContext.selectedItem,
- );
- });
-
- it('should set the value of the hook.trigger', () => {
- expect(testContext.trigger.value).toBe(testContext.newValue);
- });
- });
-
- describe('if the input tag is not INPUT', () => {
- beforeEach(() => {
- testContext.input = { textContent: 'oldValue', tagName: 'SPAN', hasAttribute: () => {} };
- testContext.config = { valueAttribute: {}, input: testContext.input };
-
- InputSetter.setInput.call(
- testContext.inputSetter,
- testContext.config,
- testContext.selectedItem,
- );
- });
-
- it('should set the textContent of the input', () => {
- expect(testContext.input.textContent).toBe(testContext.newValue);
- });
- });
-
- describe('if there is an inputAttribute', () => {
- beforeEach(() => {
- testContext.selectedItem = { getAttribute: () => {} };
- testContext.input = { id: 'oldValue', hasAttribute: () => {}, setAttribute: () => {} };
- testContext.inputSetter = { hook: { trigger: {} } };
- testContext.newValue = 'newValue';
- testContext.inputAttribute = 'id';
- testContext.config = {
- valueAttribute: {},
- input: testContext.input,
- inputAttribute: testContext.inputAttribute,
- };
-
- jest.spyOn(testContext.selectedItem, 'getAttribute').mockReturnValue(testContext.newValue);
- jest.spyOn(testContext.input, 'hasAttribute').mockReturnValue(true);
- jest.spyOn(testContext.input, 'setAttribute').mockImplementation(() => {});
-
- InputSetter.setInput.call(
- testContext.inputSetter,
- testContext.config,
- testContext.selectedItem,
- );
- });
-
- it('should call setAttribute', () => {
- expect(testContext.input.setAttribute).toHaveBeenCalledWith(
- testContext.inputAttribute,
- testContext.newValue,
- );
- });
-
- it('should not set the value or textContent of the input', () => {
- expect(testContext.input.value).not.toBe('newValue');
- expect(testContext.input.textContent).not.toBe('newValue');
- });
- });
- });
-
- describe('destroy', () => {
- beforeEach(() => {
- testContext.inputSetter = {
- removeEvents: jest.fn(),
- };
-
- InputSetter.destroy.call(testContext.inputSetter);
- });
-
- it('should call .removeEvents', () => {
- expect(testContext.inputSetter.removeEvents).toHaveBeenCalled();
- });
- });
-});
diff --git a/spec/frontend/editor/source_editor_ci_schema_ext_spec.js b/spec/frontend/editor/source_editor_ci_schema_ext_spec.js
index 07ac080fe08..8a0d1ecf1af 100644
--- a/spec/frontend/editor/source_editor_ci_schema_ext_spec.js
+++ b/spec/frontend/editor/source_editor_ci_schema_ext_spec.js
@@ -1,7 +1,7 @@
import { languages } from 'monaco-editor';
import { TEST_HOST } from 'helpers/test_constants';
-import { EXTENSION_CI_SCHEMA_FILE_NAME_MATCH } from '~/editor/constants';
import { CiSchemaExtension } from '~/editor/extensions/source_editor_ci_schema_ext';
+import ciSchemaPath from '~/editor/schema/ci.json';
import SourceEditor from '~/editor/source_editor';
const mockRef = 'AABBCCDD';
@@ -84,7 +84,7 @@ describe('~/editor/editor_ci_config_ext', () => {
});
expect(getConfiguredYmlSchema()).toEqual({
- uri: `${TEST_HOST}/${mockProjectNamespace}/${mockProjectPath}/-/schema/${mockRef}/${EXTENSION_CI_SCHEMA_FILE_NAME_MATCH}`,
+ uri: `${TEST_HOST}${ciSchemaPath}`,
fileMatch: [defaultBlobPath],
});
});
@@ -99,7 +99,7 @@ describe('~/editor/editor_ci_config_ext', () => {
});
expect(getConfiguredYmlSchema()).toEqual({
- uri: `${TEST_HOST}/${mockProjectNamespace}/${mockProjectPath}/-/schema/${mockRef}/${EXTENSION_CI_SCHEMA_FILE_NAME_MATCH}`,
+ uri: `${TEST_HOST}${ciSchemaPath}`,
fileMatch: ['another-ci-filename.yml'],
});
});
diff --git a/spec/frontend/environments/environment_delete_spec.js b/spec/frontend/environments/environment_delete_spec.js
index a8c288a3bd8..2d8cff0c74a 100644
--- a/spec/frontend/environments/environment_delete_spec.js
+++ b/spec/frontend/environments/environment_delete_spec.js
@@ -1,4 +1,4 @@
-import { GlButton } from '@gitlab/ui';
+import { GlDropdownItem } from '@gitlab/ui';
import { shallowMount } from '@vue/test-utils';
import DeleteComponent from '~/environments/components/environment_delete.vue';
@@ -15,7 +15,7 @@ describe('External URL Component', () => {
});
};
- const findButton = () => wrapper.find(GlButton);
+ const findDropdownItem = () => wrapper.find(GlDropdownItem);
beforeEach(() => {
jest.spyOn(window, 'confirm');
@@ -23,14 +23,15 @@ describe('External URL Component', () => {
createWrapper();
});
- it('should render a button to delete the environment', () => {
- expect(findButton().exists()).toBe(true);
- expect(wrapper.attributes('title')).toEqual('Delete environment');
+ it('should render a dropdown item to delete the environment', () => {
+ expect(findDropdownItem().exists()).toBe(true);
+ expect(wrapper.text()).toEqual('Delete environment');
+ expect(findDropdownItem().attributes('variant')).toBe('danger');
});
it('emits requestDeleteEnvironment in the event hub when button is clicked', () => {
jest.spyOn(eventHub, '$emit');
- findButton().vm.$emit('click');
+ findDropdownItem().vm.$emit('click');
expect(eventHub.$emit).toHaveBeenCalledWith('requestDeleteEnvironment', wrapper.vm.environment);
});
});
diff --git a/spec/frontend/environments/environment_monitoring_spec.js b/spec/frontend/environments/environment_monitoring_spec.js
index 3a53b57c3c6..98dd9edd812 100644
--- a/spec/frontend/environments/environment_monitoring_spec.js
+++ b/spec/frontend/environments/environment_monitoring_spec.js
@@ -1,6 +1,6 @@
-import { GlButton } from '@gitlab/ui';
-import { shallowMount } from '@vue/test-utils';
+import { mountExtended } from 'helpers/vue_test_utils_helper';
import MonitoringComponent from '~/environments/components/environment_monitoring.vue';
+import { __ } from '~/locale';
describe('Monitoring Component', () => {
let wrapper;
@@ -8,31 +8,19 @@ describe('Monitoring Component', () => {
const monitoringUrl = 'https://gitlab.com';
const createWrapper = () => {
- wrapper = shallowMount(MonitoringComponent, {
+ wrapper = mountExtended(MonitoringComponent, {
propsData: {
monitoringUrl,
},
});
};
- const findButtons = () => wrapper.findAll(GlButton);
- const findButtonsByIcon = (icon) =>
- findButtons().filter((button) => button.props('icon') === icon);
-
beforeEach(() => {
createWrapper();
});
- describe('computed', () => {
- it('title', () => {
- expect(wrapper.vm.title).toBe('Monitoring');
- });
- });
-
it('should render a link to environment monitoring page', () => {
- expect(wrapper.attributes('href')).toEqual(monitoringUrl);
- expect(findButtonsByIcon('chart').length).toBe(1);
- expect(wrapper.attributes('title')).toBe('Monitoring');
- expect(wrapper.attributes('aria-label')).toBe('Monitoring');
+ const link = wrapper.findByRole('menuitem', { name: __('Monitoring') });
+ expect(link.attributes('href')).toEqual(monitoringUrl);
});
});
diff --git a/spec/frontend/environments/environment_pin_spec.js b/spec/frontend/environments/environment_pin_spec.js
index 5cdd52294b6..a9a58071e12 100644
--- a/spec/frontend/environments/environment_pin_spec.js
+++ b/spec/frontend/environments/environment_pin_spec.js
@@ -1,4 +1,4 @@
-import { GlButton, GlIcon } from '@gitlab/ui';
+import { GlDropdownItem } from '@gitlab/ui';
import { shallowMount } from '@vue/test-utils';
import PinComponent from '~/environments/components/environment_pin.vue';
import eventHub from '~/environments/event_hub';
@@ -30,15 +30,15 @@ describe('Pin Component', () => {
wrapper.destroy();
});
- it('should render the component with thumbtack icon', () => {
- expect(wrapper.find(GlIcon).props('name')).toBe('thumbtack');
+ it('should render the component with descriptive text', () => {
+ expect(wrapper.text()).toBe('Prevent auto-stopping');
});
it('should emit onPinClick when clicked', () => {
const eventHubSpy = jest.spyOn(eventHub, '$emit');
- const button = wrapper.find(GlButton);
+ const item = wrapper.find(GlDropdownItem);
- button.vm.$emit('click');
+ item.vm.$emit('click');
expect(eventHubSpy).toHaveBeenCalledWith('cancelAutoStop', autoStopUrl);
});
diff --git a/spec/frontend/environments/environment_rollback_spec.js b/spec/frontend/environments/environment_rollback_spec.js
index b6c3d436c18..cde675cd9e7 100644
--- a/spec/frontend/environments/environment_rollback_spec.js
+++ b/spec/frontend/environments/environment_rollback_spec.js
@@ -1,5 +1,5 @@
-import { GlButton } from '@gitlab/ui';
-import { shallowMount, mount } from '@vue/test-utils';
+import { GlDropdownItem } from '@gitlab/ui';
+import { shallowMount } from '@vue/test-utils';
import RollbackComponent from '~/environments/components/environment_rollback.vue';
import eventHub from '~/environments/event_hub';
@@ -7,7 +7,7 @@ describe('Rollback Component', () => {
const retryUrl = 'https://gitlab.com/retry';
it('Should render Re-deploy label when isLastDeployment is true', () => {
- const wrapper = mount(RollbackComponent, {
+ const wrapper = shallowMount(RollbackComponent, {
propsData: {
retryUrl,
isLastDeployment: true,
@@ -15,11 +15,11 @@ describe('Rollback Component', () => {
},
});
- expect(wrapper.element).toHaveSpriteIcon('repeat');
+ expect(wrapper.text()).toBe('Re-deploy to environment');
});
it('Should render Rollback label when isLastDeployment is false', () => {
- const wrapper = mount(RollbackComponent, {
+ const wrapper = shallowMount(RollbackComponent, {
propsData: {
retryUrl,
isLastDeployment: false,
@@ -27,7 +27,7 @@ describe('Rollback Component', () => {
},
});
- expect(wrapper.element).toHaveSpriteIcon('redo');
+ expect(wrapper.text()).toBe('Rollback environment');
});
it('should emit a "rollback" event on button click', () => {
@@ -40,7 +40,7 @@ describe('Rollback Component', () => {
},
},
});
- const button = wrapper.find(GlButton);
+ const button = wrapper.find(GlDropdownItem);
button.vm.$emit('click');
diff --git a/spec/frontend/environments/environment_terminal_button_spec.js b/spec/frontend/environments/environment_terminal_button_spec.js
index 2475785a927..ab9f370595f 100644
--- a/spec/frontend/environments/environment_terminal_button_spec.js
+++ b/spec/frontend/environments/environment_terminal_button_spec.js
@@ -1,12 +1,13 @@
-import { shallowMount } from '@vue/test-utils';
+import { mountExtended } from 'helpers/vue_test_utils_helper';
import TerminalComponent from '~/environments/components/environment_terminal_button.vue';
+import { __ } from '~/locale';
-describe('Stop Component', () => {
+describe('Terminal Component', () => {
let wrapper;
const terminalPath = '/path';
const mountWithProps = (props) => {
- wrapper = shallowMount(TerminalComponent, {
+ wrapper = mountExtended(TerminalComponent, {
propsData: props,
});
};
@@ -15,17 +16,9 @@ describe('Stop Component', () => {
mountWithProps({ terminalPath });
});
- describe('computed', () => {
- it('title', () => {
- expect(wrapper.vm.title).toEqual('Terminal');
- });
- });
-
it('should render a link to open a web terminal with the provided path', () => {
- expect(wrapper.element.tagName).toBe('A');
- expect(wrapper.attributes('title')).toBe('Terminal');
- expect(wrapper.attributes('aria-label')).toBe('Terminal');
- expect(wrapper.attributes('href')).toBe(terminalPath);
+ const link = wrapper.findByRole('menuitem', { name: __('Terminal') });
+ expect(link.attributes('href')).toBe(terminalPath);
});
it('should render a non-disabled button', () => {
diff --git a/spec/frontend/error_tracking/components/error_details_spec.js b/spec/frontend/error_tracking/components/error_details_spec.js
index babbc0c8a4d..4e459d800e8 100644
--- a/spec/frontend/error_tracking/components/error_details_spec.js
+++ b/spec/frontend/error_tracking/components/error_details_spec.js
@@ -503,6 +503,53 @@ describe('ErrorDetails', () => {
});
});
});
+
+ describe('Release links', () => {
+ const firstReleaseVersion = '7975be01';
+ const firstCommitLink = '/gitlab/-/commit/7975be01';
+ const firstReleaseLink = '/sentry/releases/7975be01';
+ const findFirstCommitLink = () => wrapper.find(`[href$="${firstCommitLink}"]`);
+ const findFirstReleaseLink = () => wrapper.find(`[href$="${firstReleaseLink}"]`);
+
+ const lastReleaseVersion = '6ca5a5c1';
+ const lastCommitLink = '/gitlab/-/commit/6ca5a5c1';
+ const lastReleaseLink = '/sentry/releases/6ca5a5c1';
+ const findLastCommitLink = () => wrapper.find(`[href$="${lastCommitLink}"]`);
+ const findLastReleaseLink = () => wrapper.find(`[href$="${lastReleaseLink}"]`);
+
+ it('should display links to Sentry', async () => {
+ mocks.$apollo.queries.error.loading = false;
+ await wrapper.setData({
+ error: {
+ firstReleaseVersion,
+ lastReleaseVersion,
+ externalBaseUrl: '/sentry',
+ },
+ });
+
+ expect(findFirstReleaseLink().exists()).toBe(true);
+ expect(findLastReleaseLink().exists()).toBe(true);
+ expect(findFirstCommitLink().exists()).toBe(false);
+ expect(findLastCommitLink().exists()).toBe(false);
+ });
+
+ it('should display links to GitLab when integrated', async () => {
+ mocks.$apollo.queries.error.loading = false;
+ await wrapper.setData({
+ error: {
+ firstReleaseVersion,
+ lastReleaseVersion,
+ integrated: true,
+ externalBaseUrl: '/gitlab',
+ },
+ });
+
+ expect(findFirstCommitLink().exists()).toBe(true);
+ expect(findLastCommitLink().exists()).toBe(true);
+ expect(findFirstReleaseLink().exists()).toBe(false);
+ expect(findLastReleaseLink().exists()).toBe(false);
+ });
+ });
});
describe('Snowplow tracking', () => {
diff --git a/spec/frontend/error_tracking_settings/components/app_spec.js b/spec/frontend/error_tracking_settings/components/app_spec.js
index 30541ba68a5..844faff64a1 100644
--- a/spec/frontend/error_tracking_settings/components/app_spec.js
+++ b/spec/frontend/error_tracking_settings/components/app_spec.js
@@ -1,7 +1,8 @@
-import { GlFormRadioGroup, GlFormRadio } from '@gitlab/ui';
+import { GlFormRadioGroup, GlFormRadio, GlFormInputGroup } from '@gitlab/ui';
import { createLocalVue, shallowMount } from '@vue/test-utils';
import { nextTick } from 'vue';
import Vuex from 'vuex';
+import ClipboardButton from '~/vue_shared/components/clipboard_button.vue';
import { TEST_HOST } from 'helpers/test_constants';
import { extendedWrapper } from 'helpers/vue_test_utils_helper';
import ErrorTrackingSettings from '~/error_tracking_settings/components/app.vue';
@@ -12,6 +13,8 @@ import createStore from '~/error_tracking_settings/store';
const localVue = createLocalVue();
localVue.use(Vuex);
+const TEST_GITLAB_DSN = 'https://gitlab.example.com/123456';
+
describe('error tracking settings app', () => {
let store;
let wrapper;
@@ -29,6 +32,10 @@ describe('error tracking settings app', () => {
initialProject: null,
listProjectsEndpoint: TEST_HOST,
operationsSettingsEndpoint: TEST_HOST,
+ gitlabDsn: TEST_GITLAB_DSN,
+ },
+ stubs: {
+ GlFormInputGroup, // we need this non-shallow to query for a component within a slot
},
}),
);
@@ -41,6 +48,12 @@ describe('error tracking settings app', () => {
findBackendSettingsRadioGroup().findAllComponents(GlFormRadio);
const findElementWithText = (wrappers, text) => wrappers.filter((item) => item.text() === text);
const findSentrySettings = () => wrapper.findByTestId('sentry-setting-form');
+ const findDsnSettings = () => wrapper.findByTestId('gitlab-dsn-setting-form');
+
+ const enableGitLabErrorTracking = async () => {
+ findBackendSettingsRadioGroup().vm.$emit('change', true);
+ await nextTick();
+ };
beforeEach(() => {
store = createStore();
@@ -93,17 +106,35 @@ describe('error tracking settings app', () => {
expect(findElementWithText(findBackendSettingsRadioButtons(), 'GitLab')).toHaveLength(1);
});
- it('toggles the sentry-settings section when sentry is selected as a tracking-backend', async () => {
+ it('hides the Sentry settings when GitLab is selected as a tracking-backend', async () => {
expect(findSentrySettings().exists()).toBe(true);
- // set the "integrated" setting to "true"
- findBackendSettingsRadioGroup().vm.$emit('change', true);
-
- await nextTick();
+ await enableGitLabErrorTracking();
expect(findSentrySettings().exists()).toBe(false);
});
+ describe('GitLab DSN section', () => {
+ it('is visible when GitLab is selected as a tracking-backend and DSN is present', async () => {
+ expect(findDsnSettings().exists()).toBe(false);
+
+ await enableGitLabErrorTracking();
+
+ expect(findDsnSettings().exists()).toBe(true);
+ });
+
+ it('contains copy-to-clipboard functionality for the GitLab DSN string', async () => {
+ await enableGitLabErrorTracking();
+
+ const clipBoardInput = findDsnSettings().findComponent(GlFormInputGroup);
+ const clipBoardButton = findDsnSettings().findComponent(ClipboardButton);
+
+ expect(clipBoardInput.props('value')).toBe(TEST_GITLAB_DSN);
+ expect(clipBoardInput.attributes('readonly')).toBeTruthy();
+ expect(clipBoardButton.props('text')).toBe(TEST_GITLAB_DSN);
+ });
+ });
+
it.each([true, false])(
'calls the `updateIntegrated` action when the setting changes to `%s`',
(integrated) => {
diff --git a/spec/frontend/experimentation/utils_spec.js b/spec/frontend/experimentation/utils_spec.js
index 999bed1ffbd..de060f5eb8c 100644
--- a/spec/frontend/experimentation/utils_spec.js
+++ b/spec/frontend/experimentation/utils_spec.js
@@ -23,20 +23,6 @@ describe('experiment Utilities', () => {
});
});
- describe('getExperimentContexts', () => {
- describe.each`
- gon | input | output
- ${[TEST_KEY, '_data_']} | ${[TEST_KEY]} | ${[{ schema: TRACKING_CONTEXT_SCHEMA, data: { variant: '_data_' } }]}
- ${[]} | ${[TEST_KEY]} | ${[]}
- `('with input=$input and gon=$gon', ({ gon, input, output }) => {
- assignGitlabExperiment(...gon);
-
- it(`returns ${output}`, () => {
- expect(experimentUtils.getExperimentContexts(...input)).toEqual(output);
- });
- });
- });
-
describe('getAllExperimentContexts', () => {
const schema = TRACKING_CONTEXT_SCHEMA;
let origGon;
diff --git a/spec/frontend/feature_flags/components/edit_feature_flag_spec.js b/spec/frontend/feature_flags/components/edit_feature_flag_spec.js
index 799b567a2c0..721b7249abc 100644
--- a/spec/frontend/feature_flags/components/edit_feature_flag_spec.js
+++ b/spec/frontend/feature_flags/components/edit_feature_flag_spec.js
@@ -4,6 +4,7 @@ import MockAdapter from 'axios-mock-adapter';
import Vue from 'vue';
import Vuex from 'vuex';
import { mockTracking } from 'helpers/tracking_helper';
+import waitForPromises from 'helpers/wait_for_promises';
import { TEST_HOST } from 'spec/test_constants';
import EditFeatureFlag from '~/feature_flags/components/edit_feature_flag.vue';
import Form from '~/feature_flags/components/form.vue';
@@ -20,7 +21,7 @@ describe('Edit feature flag form', () => {
endpoint: `${TEST_HOST}/feature_flags.json`,
});
- const factory = (provide = {}) => {
+ const factory = (provide = { searchPath: '/search' }) => {
if (wrapper) {
wrapper.destroy();
wrapper = null;
@@ -31,7 +32,7 @@ describe('Edit feature flag form', () => {
});
};
- beforeEach((done) => {
+ beforeEach(() => {
mock = new MockAdapter(axios);
mock.onGet(`${TEST_HOST}/feature_flags.json`).replyOnce(200, {
id: 21,
@@ -45,7 +46,8 @@ describe('Edit feature flag form', () => {
destroy_path: '/h5bp/html5-boilerplate/-/feature_flags/21',
});
factory();
- setImmediate(() => done());
+
+ return waitForPromises();
});
afterEach(() => {
@@ -60,7 +62,7 @@ describe('Edit feature flag form', () => {
});
it('should render the toggle', () => {
- expect(wrapper.find(GlToggle).exists()).toBe(true);
+ expect(wrapper.findComponent(GlToggle).exists()).toBe(true);
});
describe('with error', () => {
@@ -80,11 +82,11 @@ describe('Edit feature flag form', () => {
});
it('should render feature flag form', () => {
- expect(wrapper.find(Form).exists()).toEqual(true);
+ expect(wrapper.findComponent(Form).exists()).toEqual(true);
});
it('should track when the toggle is clicked', () => {
- const toggle = wrapper.find(GlToggle);
+ const toggle = wrapper.findComponent(GlToggle);
const spy = mockTracking('_category_', toggle.element, jest.spyOn);
toggle.trigger('click');
@@ -95,7 +97,7 @@ describe('Edit feature flag form', () => {
});
it('should render the toggle with a visually hidden label', () => {
- expect(wrapper.find(GlToggle).props()).toMatchObject({
+ expect(wrapper.findComponent(GlToggle).props()).toMatchObject({
label: 'Feature flag status',
labelPosition: 'hidden',
});
diff --git a/spec/frontend/filterable_list_spec.js b/spec/frontend/filterable_list_spec.js
index 8c6a71abad7..556cf6f8137 100644
--- a/spec/frontend/filterable_list_spec.js
+++ b/spec/frontend/filterable_list_spec.js
@@ -1,3 +1,4 @@
+// eslint-disable-next-line import/no-deprecated
import { getJSONFixture, setHTMLFixture } from 'helpers/fixtures';
import FilterableList from '~/filterable_list';
@@ -14,6 +15,7 @@ describe('FilterableList', () => {
</div>
<div class="js-projects-list-holder"></div>
`);
+ // eslint-disable-next-line import/no-deprecated
getJSONFixture('static/projects.json');
form = document.querySelector('form#project-filter-form');
filter = document.querySelector('.js-projects-list-filter');
diff --git a/spec/frontend/filtered_search/dropdown_user_spec.js b/spec/frontend/filtered_search/dropdown_user_spec.js
index 961587f7146..9a20fb1bae6 100644
--- a/spec/frontend/filtered_search/dropdown_user_spec.js
+++ b/spec/frontend/filtered_search/dropdown_user_spec.js
@@ -1,8 +1,5 @@
-import DropdownUtils from '~/filtered_search/dropdown_utils';
-// TODO: Moving this line up throws an error about `FilteredSearchDropdown`
-// being undefined in test. See gitlab-org/gitlab#321476 for more info.
-// eslint-disable-next-line import/order
import DropdownUser from '~/filtered_search/dropdown_user';
+import DropdownUtils from '~/filtered_search/dropdown_utils';
import FilteredSearchTokenizer from '~/filtered_search/filtered_search_tokenizer';
import IssuableFilteredTokenKeys from '~/filtered_search/issuable_filtered_search_token_keys';
diff --git a/spec/frontend/filtered_search/droplab/constants_spec.js b/spec/frontend/filtered_search/droplab/constants_spec.js
new file mode 100644
index 00000000000..9c1caf90ac0
--- /dev/null
+++ b/spec/frontend/filtered_search/droplab/constants_spec.js
@@ -0,0 +1,39 @@
+import * as constants from '~/filtered_search/droplab/constants';
+
+describe('constants', () => {
+ describe('DATA_TRIGGER', () => {
+ it('should be `data-dropdown-trigger`', () => {
+ expect(constants.DATA_TRIGGER).toBe('data-dropdown-trigger');
+ });
+ });
+
+ describe('DATA_DROPDOWN', () => {
+ it('should be `data-dropdown`', () => {
+ expect(constants.DATA_DROPDOWN).toBe('data-dropdown');
+ });
+ });
+
+ describe('SELECTED_CLASS', () => {
+ it('should be `droplab-item-selected`', () => {
+ expect(constants.SELECTED_CLASS).toBe('droplab-item-selected');
+ });
+ });
+
+ describe('ACTIVE_CLASS', () => {
+ it('should be `droplab-item-active`', () => {
+ expect(constants.ACTIVE_CLASS).toBe('droplab-item-active');
+ });
+ });
+
+ describe('TEMPLATE_REGEX', () => {
+ it('should be a handlebars templating syntax regex', () => {
+ expect(constants.TEMPLATE_REGEX).toEqual(/\{\{(.+?)\}\}/g);
+ });
+ });
+
+ describe('IGNORE_CLASS', () => {
+ it('should be `droplab-item-ignore`', () => {
+ expect(constants.IGNORE_CLASS).toBe('droplab-item-ignore');
+ });
+ });
+});
diff --git a/spec/frontend/filtered_search/droplab/drop_down_spec.js b/spec/frontend/filtered_search/droplab/drop_down_spec.js
new file mode 100644
index 00000000000..f49dbfcf79c
--- /dev/null
+++ b/spec/frontend/filtered_search/droplab/drop_down_spec.js
@@ -0,0 +1,662 @@
+import { SELECTED_CLASS } from '~/filtered_search/droplab/constants';
+import DropDown from '~/filtered_search/droplab/drop_down';
+import utils from '~/filtered_search/droplab/utils';
+
+describe('DropLab DropDown', () => {
+ let testContext;
+
+ beforeEach(() => {
+ testContext = {};
+ });
+
+ describe('class constructor', () => {
+ beforeEach(() => {
+ jest.spyOn(DropDown.prototype, 'getItems').mockImplementation(() => {});
+ jest.spyOn(DropDown.prototype, 'initTemplateString').mockImplementation(() => {});
+ jest.spyOn(DropDown.prototype, 'addEvents').mockImplementation(() => {});
+
+ testContext.list = { innerHTML: 'innerHTML' };
+ testContext.dropdown = new DropDown(testContext.list);
+ });
+
+ it('sets the .hidden property to true', () => {
+ expect(testContext.dropdown.hidden).toBe(true);
+ });
+
+ it('sets the .list property', () => {
+ expect(testContext.dropdown.list).toBe(testContext.list);
+ });
+
+ it('calls .getItems', () => {
+ expect(DropDown.prototype.getItems).toHaveBeenCalled();
+ });
+
+ it('calls .initTemplateString', () => {
+ expect(DropDown.prototype.initTemplateString).toHaveBeenCalled();
+ });
+
+ it('calls .addEvents', () => {
+ expect(DropDown.prototype.addEvents).toHaveBeenCalled();
+ });
+
+ it('sets the .initialState property to the .list.innerHTML', () => {
+ expect(testContext.dropdown.initialState).toBe(testContext.list.innerHTML);
+ });
+
+ describe('if the list argument is a string', () => {
+ beforeEach(() => {
+ testContext.element = {};
+ testContext.selector = '.selector';
+
+ jest.spyOn(Document.prototype, 'querySelector').mockReturnValue(testContext.element);
+
+ testContext.dropdown = new DropDown(testContext.selector);
+ });
+
+ it('calls .querySelector with the selector string', () => {
+ expect(Document.prototype.querySelector).toHaveBeenCalledWith(testContext.selector);
+ });
+
+ it('sets the .list property element', () => {
+ expect(testContext.dropdown.list).toBe(testContext.element);
+ });
+ });
+ });
+
+ describe('getItems', () => {
+ beforeEach(() => {
+ testContext.list = { querySelectorAll: () => {} };
+ testContext.dropdown = { list: testContext.list };
+ testContext.nodeList = [];
+
+ jest.spyOn(testContext.list, 'querySelectorAll').mockReturnValue(testContext.nodeList);
+
+ testContext.getItems = DropDown.prototype.getItems.call(testContext.dropdown);
+ });
+
+ it('calls .querySelectorAll with a list item query', () => {
+ expect(testContext.list.querySelectorAll).toHaveBeenCalledWith('li');
+ });
+
+ it('sets the .items property to the returned list items', () => {
+ expect(testContext.dropdown.items).toEqual(expect.any(Array));
+ });
+
+ it('returns the .items', () => {
+ expect(testContext.getItems).toEqual(expect.any(Array));
+ });
+ });
+
+ describe('initTemplateString', () => {
+ beforeEach(() => {
+ testContext.items = [{ outerHTML: '<a></a>' }, { outerHTML: '<img>' }];
+ testContext.dropdown = { items: testContext.items };
+
+ DropDown.prototype.initTemplateString.call(testContext.dropdown);
+ });
+
+ it('should set .templateString to the last items .outerHTML', () => {
+ expect(testContext.dropdown.templateString).toBe(testContext.items[1].outerHTML);
+ });
+
+ it('should not set .templateString to a non-last items .outerHTML', () => {
+ expect(testContext.dropdown.templateString).not.toBe(testContext.items[0].outerHTML);
+ });
+
+ describe('if .items is not set', () => {
+ beforeEach(() => {
+ testContext.dropdown = { getItems: () => {} };
+
+ jest.spyOn(testContext.dropdown, 'getItems').mockReturnValue([]);
+
+ DropDown.prototype.initTemplateString.call(testContext.dropdown);
+ });
+
+ it('should call .getItems', () => {
+ expect(testContext.dropdown.getItems).toHaveBeenCalled();
+ });
+ });
+
+ describe('if items array is empty', () => {
+ beforeEach(() => {
+ testContext.dropdown = { items: [] };
+
+ DropDown.prototype.initTemplateString.call(testContext.dropdown);
+ });
+
+ it('should set .templateString to an empty string', () => {
+ expect(testContext.dropdown.templateString).toBe('');
+ });
+ });
+ });
+
+ describe('clickEvent', () => {
+ beforeEach(() => {
+ testContext.classList = {
+ contains: jest.fn(),
+ };
+ testContext.list = { dispatchEvent: () => {} };
+ testContext.dropdown = {
+ hideOnClick: true,
+ hide: () => {},
+ list: testContext.list,
+ addSelectedClass: () => {},
+ };
+ testContext.event = {
+ preventDefault: () => {},
+ target: {
+ classList: testContext.classList,
+ closest: () => null,
+ },
+ };
+
+ testContext.dummyListItem = document.createElement('li');
+ jest.spyOn(testContext.event.target, 'closest').mockImplementation((selector) => {
+ if (selector === 'li') {
+ return testContext.dummyListItem;
+ }
+
+ return null;
+ });
+
+ jest.spyOn(testContext.dropdown, 'hide').mockImplementation(() => {});
+ jest.spyOn(testContext.dropdown, 'addSelectedClass').mockImplementation(() => {});
+ jest.spyOn(testContext.list, 'dispatchEvent').mockImplementation(() => {});
+ jest.spyOn(testContext.event, 'preventDefault').mockImplementation(() => {});
+ window.CustomEvent = jest.fn();
+ testContext.classList.contains.mockReturnValue(false);
+ });
+
+ describe('normal click event', () => {
+ beforeEach(() => {
+ DropDown.prototype.clickEvent.call(testContext.dropdown, testContext.event);
+ });
+ it('should call event.target.closest', () => {
+ expect(testContext.event.target.closest).toHaveBeenCalledWith('.droplab-item-ignore');
+ expect(testContext.event.target.closest).toHaveBeenCalledWith('li');
+ });
+
+ it('should call addSelectedClass', () => {
+ expect(testContext.dropdown.addSelectedClass).toHaveBeenCalledWith(
+ testContext.dummyListItem,
+ );
+ });
+
+ it('should call .preventDefault', () => {
+ expect(testContext.event.preventDefault).toHaveBeenCalled();
+ });
+
+ it('should call .hide', () => {
+ expect(testContext.dropdown.hide).toHaveBeenCalled();
+ });
+
+ it('should construct CustomEvent', () => {
+ expect(window.CustomEvent).toHaveBeenCalledWith('click.dl', expect.any(Object));
+ });
+
+ it('should call .dispatchEvent with the customEvent', () => {
+ expect(testContext.list.dispatchEvent).toHaveBeenCalledWith({});
+ });
+ });
+
+ describe('if the target is a UL element', () => {
+ beforeEach(() => {
+ testContext.event.target = document.createElement('ul');
+
+ jest.spyOn(testContext.event.target, 'closest').mockImplementation(() => {});
+ });
+
+ it('should return immediately', () => {
+ DropDown.prototype.clickEvent.call(testContext.dropdown, testContext.event);
+
+ expect(testContext.event.target.closest).not.toHaveBeenCalled();
+ expect(testContext.dropdown.addSelectedClass).not.toHaveBeenCalled();
+ });
+ });
+
+ describe('if the target has the droplab-item-ignore class', () => {
+ beforeEach(() => {
+ testContext.ignoredButton = document.createElement('button');
+ testContext.ignoredButton.classList.add('droplab-item-ignore');
+ testContext.event.target = testContext.ignoredButton;
+
+ jest.spyOn(testContext.ignoredButton, 'closest');
+ });
+
+ it('does not select element', () => {
+ DropDown.prototype.clickEvent.call(testContext.dropdown, testContext.event);
+
+ expect(testContext.ignoredButton.closest.mock.calls.length).toBe(1);
+ expect(testContext.ignoredButton.closest).toHaveBeenCalledWith('.droplab-item-ignore');
+ expect(testContext.dropdown.addSelectedClass).not.toHaveBeenCalled();
+ });
+ });
+
+ describe('if no selected element exists', () => {
+ beforeEach(() => {
+ testContext.event.preventDefault.mockReset();
+ testContext.dummyListItem = null;
+ });
+
+ it('should return before .preventDefault is called', () => {
+ DropDown.prototype.clickEvent.call(testContext.dropdown, testContext.event);
+
+ expect(testContext.event.preventDefault).not.toHaveBeenCalled();
+ expect(testContext.dropdown.addSelectedClass).not.toHaveBeenCalled();
+ });
+ });
+
+ describe('if hideOnClick is false', () => {
+ beforeEach(() => {
+ testContext.dropdown.hideOnClick = false;
+ testContext.dropdown.hide.mockReset();
+ });
+
+ it('should not call .hide', () => {
+ DropDown.prototype.clickEvent.call(testContext.dropdown, testContext.event);
+
+ expect(testContext.dropdown.hide).not.toHaveBeenCalled();
+ });
+ });
+ });
+
+ describe('addSelectedClass', () => {
+ beforeEach(() => {
+ testContext.items = Array(4).forEach((item, i) => {
+ testContext.items[i] = { classList: { add: () => {} } };
+ jest.spyOn(testContext.items[i].classList, 'add').mockImplementation(() => {});
+ });
+ testContext.selected = { classList: { add: () => {} } };
+ testContext.dropdown = { removeSelectedClasses: () => {} };
+
+ jest.spyOn(testContext.dropdown, 'removeSelectedClasses').mockImplementation(() => {});
+ jest.spyOn(testContext.selected.classList, 'add').mockImplementation(() => {});
+
+ DropDown.prototype.addSelectedClass.call(testContext.dropdown, testContext.selected);
+ });
+
+ it('should call .removeSelectedClasses', () => {
+ expect(testContext.dropdown.removeSelectedClasses).toHaveBeenCalled();
+ });
+
+ it('should call .classList.add', () => {
+ expect(testContext.selected.classList.add).toHaveBeenCalledWith(SELECTED_CLASS);
+ });
+ });
+
+ describe('removeSelectedClasses', () => {
+ beforeEach(() => {
+ testContext.items = [...Array(4)];
+ testContext.items.forEach((item, i) => {
+ testContext.items[i] = { classList: { add: jest.fn(), remove: jest.fn() } };
+ });
+ testContext.dropdown = { items: testContext.items };
+
+ DropDown.prototype.removeSelectedClasses.call(testContext.dropdown);
+ });
+
+ it('should call .classList.remove for all items', () => {
+ testContext.items.forEach((_, i) => {
+ expect(testContext.items[i].classList.remove).toHaveBeenCalledWith(SELECTED_CLASS);
+ });
+ });
+
+ describe('if .items is not set', () => {
+ beforeEach(() => {
+ testContext.dropdown = { getItems: () => {} };
+
+ jest.spyOn(testContext.dropdown, 'getItems').mockReturnValue([]);
+
+ DropDown.prototype.removeSelectedClasses.call(testContext.dropdown);
+ });
+
+ it('should call .getItems', () => {
+ expect(testContext.dropdown.getItems).toHaveBeenCalled();
+ });
+ });
+ });
+
+ describe('addEvents', () => {
+ beforeEach(() => {
+ testContext.list = {
+ addEventListener: () => {},
+ querySelectorAll: () => [],
+ };
+ testContext.dropdown = {
+ list: testContext.list,
+ clickEvent: () => {},
+ closeDropdown: () => {},
+ eventWrapper: {},
+ };
+ });
+
+ it('should call .addEventListener', () => {
+ jest.spyOn(testContext.list, 'addEventListener').mockImplementation(() => {});
+
+ DropDown.prototype.addEvents.call(testContext.dropdown);
+
+ expect(testContext.list.addEventListener).toHaveBeenCalledWith('click', expect.any(Function));
+ expect(testContext.list.addEventListener).toHaveBeenCalledWith('keyup', expect.any(Function));
+ });
+ });
+
+ describe('setData', () => {
+ beforeEach(() => {
+ testContext.dropdown = { render: () => {} };
+ testContext.data = ['data'];
+
+ jest.spyOn(testContext.dropdown, 'render').mockImplementation(() => {});
+
+ DropDown.prototype.setData.call(testContext.dropdown, testContext.data);
+ });
+
+ it('should set .data', () => {
+ expect(testContext.dropdown.data).toBe(testContext.data);
+ });
+
+ it('should call .render with the .data', () => {
+ expect(testContext.dropdown.render).toHaveBeenCalledWith(testContext.data);
+ });
+ });
+
+ describe('addData', () => {
+ beforeEach(() => {
+ testContext.dropdown = { render: () => {}, data: ['data1'] };
+ testContext.data = ['data2'];
+
+ jest.spyOn(testContext.dropdown, 'render').mockImplementation(() => {});
+ jest.spyOn(Array.prototype, 'concat');
+
+ DropDown.prototype.addData.call(testContext.dropdown, testContext.data);
+ });
+
+ it('should call .concat with data', () => {
+ expect(Array.prototype.concat).toHaveBeenCalledWith(testContext.data);
+ });
+
+ it('should set .data with concatination', () => {
+ expect(testContext.dropdown.data).toStrictEqual(['data1', 'data2']);
+ });
+
+ it('should call .render with the .data', () => {
+ expect(testContext.dropdown.render).toHaveBeenCalledWith(['data1', 'data2']);
+ });
+
+ describe('if .data is undefined', () => {
+ beforeEach(() => {
+ testContext.dropdown = { render: () => {}, data: undefined };
+ testContext.data = ['data2'];
+
+ jest.spyOn(testContext.dropdown, 'render').mockImplementation(() => {});
+
+ DropDown.prototype.addData.call(testContext.dropdown, testContext.data);
+ });
+
+ it('should set .data with concatination', () => {
+ expect(testContext.dropdown.data).toStrictEqual(['data2']);
+ });
+ });
+ });
+
+ describe('render', () => {
+ beforeEach(() => {
+ testContext.renderableList = {};
+ testContext.list = {
+ querySelector: (q) => {
+ if (q === '.filter-dropdown-loading') {
+ return false;
+ }
+ return testContext.renderableList;
+ },
+ dispatchEvent: () => {},
+ };
+ testContext.dropdown = { renderChildren: () => {}, list: testContext.list };
+ testContext.data = [0, 1];
+ testContext.customEvent = {};
+
+ jest.spyOn(testContext.dropdown, 'renderChildren').mockImplementation((data) => data);
+ jest.spyOn(testContext.list, 'dispatchEvent').mockImplementation(() => {});
+ jest.spyOn(testContext.data, 'map');
+ jest.spyOn(window, 'CustomEvent').mockReturnValue(testContext.customEvent);
+
+ DropDown.prototype.render.call(testContext.dropdown, testContext.data);
+ });
+
+ it('should call .map', () => {
+ expect(testContext.data.map).toHaveBeenCalledWith(expect.any(Function));
+ });
+
+ it('should call .renderChildren for each data item', () => {
+ expect(testContext.dropdown.renderChildren.mock.calls.length).toBe(testContext.data.length);
+ });
+
+ it('sets the renderableList .innerHTML', () => {
+ expect(testContext.renderableList.innerHTML).toBe('01');
+ });
+
+ it('should call render.dl', () => {
+ expect(window.CustomEvent).toHaveBeenCalledWith('render.dl', expect.any(Object));
+ });
+
+ it('should call dispatchEvent with the customEvent', () => {
+ expect(testContext.list.dispatchEvent).toHaveBeenCalledWith(testContext.customEvent);
+ });
+
+ describe('if no data argument is passed', () => {
+ beforeEach(() => {
+ testContext.data.map.mockReset();
+ testContext.dropdown.renderChildren.mockReset();
+
+ DropDown.prototype.render.call(testContext.dropdown, undefined);
+ });
+
+ it('should not call .map', () => {
+ expect(testContext.data.map).not.toHaveBeenCalled();
+ });
+
+ it('should not call .renderChildren', () => {
+ expect(testContext.dropdown.renderChildren).not.toHaveBeenCalled();
+ });
+ });
+
+ describe('if no dynamic list is present', () => {
+ beforeEach(() => {
+ testContext.list = { querySelector: () => {}, dispatchEvent: () => {} };
+ testContext.dropdown = { renderChildren: () => {}, list: testContext.list };
+ testContext.data = [0, 1];
+
+ jest.spyOn(testContext.dropdown, 'renderChildren').mockImplementation((data) => data);
+ jest.spyOn(testContext.list, 'querySelector').mockImplementation(() => {});
+ jest.spyOn(testContext.data, 'map');
+
+ DropDown.prototype.render.call(testContext.dropdown, testContext.data);
+ });
+
+ it('sets the .list .innerHTML', () => {
+ expect(testContext.list.innerHTML).toBe('01');
+ });
+ });
+ });
+
+ describe('renderChildren', () => {
+ beforeEach(() => {
+ testContext.templateString = 'templateString';
+ testContext.dropdown = { templateString: testContext.templateString };
+ testContext.data = { droplab_hidden: true };
+ testContext.html = 'html';
+ testContext.template = { firstChild: { outerHTML: 'outerHTML', style: {} } };
+
+ jest.spyOn(utils, 'template').mockReturnValue(testContext.html);
+ jest.spyOn(document, 'createElement').mockReturnValue(testContext.template);
+ jest.spyOn(DropDown, 'setImagesSrc').mockImplementation(() => {});
+
+ testContext.renderChildren = DropDown.prototype.renderChildren.call(
+ testContext.dropdown,
+ testContext.data,
+ );
+ });
+
+ it('should call utils.t with .templateString and data', () => {
+ expect(utils.template).toHaveBeenCalledWith(testContext.templateString, testContext.data);
+ });
+
+ it('should call document.createElement', () => {
+ expect(document.createElement).toHaveBeenCalledWith('div');
+ });
+
+ it('should set the templates .innerHTML to the HTML', () => {
+ expect(testContext.template.innerHTML).toBe(testContext.html);
+ });
+
+ it('should call .setImagesSrc with the template', () => {
+ expect(DropDown.setImagesSrc).toHaveBeenCalledWith(testContext.template);
+ });
+
+ it('should set the template display to none', () => {
+ expect(testContext.template.firstChild.style.display).toBe('none');
+ });
+
+ it('should return the templates .firstChild.outerHTML', () => {
+ expect(testContext.renderChildren).toBe(testContext.template.firstChild.outerHTML);
+ });
+
+ describe('if droplab_hidden is false', () => {
+ beforeEach(() => {
+ testContext.data = { droplab_hidden: false };
+ testContext.renderChildren = DropDown.prototype.renderChildren.call(
+ testContext.dropdown,
+ testContext.data,
+ );
+ });
+
+ it('should set the template display to block', () => {
+ expect(testContext.template.firstChild.style.display).toBe('block');
+ });
+ });
+ });
+
+ describe('setImagesSrc', () => {
+ beforeEach(() => {
+ testContext.template = { querySelectorAll: () => {} };
+
+ jest.spyOn(testContext.template, 'querySelectorAll').mockReturnValue([]);
+
+ DropDown.setImagesSrc(testContext.template);
+ });
+
+ it('should call .querySelectorAll', () => {
+ expect(testContext.template.querySelectorAll).toHaveBeenCalledWith('img[data-src]');
+ });
+ });
+
+ describe('show', () => {
+ beforeEach(() => {
+ testContext.list = { style: {} };
+ testContext.dropdown = { list: testContext.list, hidden: true };
+
+ DropDown.prototype.show.call(testContext.dropdown);
+ });
+
+ it('it should set .list display to block', () => {
+ expect(testContext.list.style.display).toBe('block');
+ });
+
+ it('it should set .hidden to false', () => {
+ expect(testContext.dropdown.hidden).toBe(false);
+ });
+
+ describe('if .hidden is false', () => {
+ beforeEach(() => {
+ testContext.list = { style: {} };
+ testContext.dropdown = { list: testContext.list, hidden: false };
+
+ testContext.show = DropDown.prototype.show.call(testContext.dropdown);
+ });
+
+ it('should return undefined', () => {
+ expect(testContext.show).toBeUndefined();
+ });
+
+ it('should not set .list display to block', () => {
+ expect(testContext.list.style.display).not.toBe('block');
+ });
+ });
+ });
+
+ describe('hide', () => {
+ beforeEach(() => {
+ testContext.list = { style: {} };
+ testContext.dropdown = { list: testContext.list };
+
+ DropDown.prototype.hide.call(testContext.dropdown);
+ });
+
+ it('it should set .list display to none', () => {
+ expect(testContext.list.style.display).toBe('none');
+ });
+
+ it('it should set .hidden to true', () => {
+ expect(testContext.dropdown.hidden).toBe(true);
+ });
+ });
+
+ describe('toggle', () => {
+ beforeEach(() => {
+ testContext.hidden = true;
+ testContext.dropdown = { hidden: testContext.hidden, show: () => {}, hide: () => {} };
+
+ jest.spyOn(testContext.dropdown, 'show').mockImplementation(() => {});
+ jest.spyOn(testContext.dropdown, 'hide').mockImplementation(() => {});
+
+ DropDown.prototype.toggle.call(testContext.dropdown);
+ });
+
+ it('should call .show', () => {
+ expect(testContext.dropdown.show).toHaveBeenCalled();
+ });
+
+ describe('if .hidden is false', () => {
+ beforeEach(() => {
+ testContext.hidden = false;
+ testContext.dropdown = { hidden: testContext.hidden, show: () => {}, hide: () => {} };
+
+ jest.spyOn(testContext.dropdown, 'show').mockImplementation(() => {});
+ jest.spyOn(testContext.dropdown, 'hide').mockImplementation(() => {});
+
+ DropDown.prototype.toggle.call(testContext.dropdown);
+ });
+
+ it('should call .hide', () => {
+ expect(testContext.dropdown.hide).toHaveBeenCalled();
+ });
+ });
+ });
+
+ describe('destroy', () => {
+ beforeEach(() => {
+ testContext.list = { removeEventListener: () => {} };
+ testContext.eventWrapper = { clickEvent: 'clickEvent' };
+ testContext.dropdown = {
+ list: testContext.list,
+ hide: () => {},
+ eventWrapper: testContext.eventWrapper,
+ };
+
+ jest.spyOn(testContext.list, 'removeEventListener').mockImplementation(() => {});
+ jest.spyOn(testContext.dropdown, 'hide').mockImplementation(() => {});
+
+ DropDown.prototype.destroy.call(testContext.dropdown);
+ });
+
+ it('it should call .hide', () => {
+ expect(testContext.dropdown.hide).toHaveBeenCalled();
+ });
+
+ it('it should call .removeEventListener', () => {
+ expect(testContext.list.removeEventListener).toHaveBeenCalledWith(
+ 'click',
+ testContext.eventWrapper.clickEvent,
+ );
+ });
+ });
+});
diff --git a/spec/frontend/filtered_search/droplab/hook_spec.js b/spec/frontend/filtered_search/droplab/hook_spec.js
new file mode 100644
index 00000000000..0d92170cfcf
--- /dev/null
+++ b/spec/frontend/filtered_search/droplab/hook_spec.js
@@ -0,0 +1,94 @@
+import DropDown from '~/filtered_search/droplab/drop_down';
+import Hook from '~/filtered_search/droplab/hook';
+
+jest.mock('~/filtered_search/droplab/drop_down', () => jest.fn());
+
+describe('Hook', () => {
+ let testContext;
+
+ beforeEach(() => {
+ testContext = {};
+ });
+
+ describe('class constructor', () => {
+ beforeEach(() => {
+ testContext.trigger = { id: 'id' };
+ testContext.list = {};
+ testContext.plugins = {};
+ testContext.config = {};
+
+ testContext.hook = new Hook(
+ testContext.trigger,
+ testContext.list,
+ testContext.plugins,
+ testContext.config,
+ );
+ });
+
+ it('should set .trigger', () => {
+ expect(testContext.hook.trigger).toBe(testContext.trigger);
+ });
+
+ it('should set .list', () => {
+ expect(testContext.hook.list).toEqual({});
+ });
+
+ it('should call DropDown constructor', () => {
+ expect(DropDown).toHaveBeenCalledWith(testContext.list, testContext.config);
+ });
+
+ it('should set .type', () => {
+ expect(testContext.hook.type).toBe('Hook');
+ });
+
+ it('should set .event', () => {
+ expect(testContext.hook.event).toBe('click');
+ });
+
+ it('should set .plugins', () => {
+ expect(testContext.hook.plugins).toBe(testContext.plugins);
+ });
+
+ it('should set .config', () => {
+ expect(testContext.hook.config).toBe(testContext.config);
+ });
+
+ it('should set .id', () => {
+ expect(testContext.hook.id).toBe(testContext.trigger.id);
+ });
+
+ describe('if config argument is undefined', () => {
+ beforeEach(() => {
+ testContext.config = undefined;
+
+ testContext.hook = new Hook(
+ testContext.trigger,
+ testContext.list,
+ testContext.plugins,
+ testContext.config,
+ );
+ });
+
+ it('should set .config to an empty object', () => {
+ expect(testContext.hook.config).toEqual({});
+ });
+ });
+
+ describe('if plugins argument is undefined', () => {
+ beforeEach(() => {
+ testContext.plugins = undefined;
+
+ testContext.hook = new Hook(
+ testContext.trigger,
+ testContext.list,
+ testContext.plugins,
+ testContext.config,
+ );
+ });
+
+ it('should set .plugins to an empty array', () => {
+ expect(testContext.hook.plugins).toEqual([]);
+ });
+ });
+ });
+});
diff --git a/spec/frontend/filtered_search/droplab/plugins/ajax_filter_spec.js b/spec/frontend/filtered_search/droplab/plugins/ajax_filter_spec.js
new file mode 100644
index 00000000000..88b3fc236e4
--- /dev/null
+++ b/spec/frontend/filtered_search/droplab/plugins/ajax_filter_spec.js
@@ -0,0 +1,72 @@
+import AjaxFilter from '~/filtered_search/droplab/plugins/ajax_filter';
+import AjaxCache from '~/lib/utils/ajax_cache';
+
+describe('AjaxFilter', () => {
+ let dummyConfig;
+ const dummyData = 'dummy data';
+ let dummyList;
+
+ beforeEach(() => {
+ dummyConfig = {
+ endpoint: 'dummy endpoint',
+ searchKey: 'dummy search key',
+ };
+ dummyList = {
+ data: [],
+ list: document.createElement('div'),
+ };
+
+ AjaxFilter.hook = {
+ config: {
+ AjaxFilter: dummyConfig,
+ },
+ list: dummyList,
+ };
+ });
+
+ describe('trigger', () => {
+ let ajaxSpy;
+
+ beforeEach(() => {
+ jest.spyOn(AjaxCache, 'retrieve').mockImplementation((url) => ajaxSpy(url));
+ jest.spyOn(AjaxFilter, '_loadData').mockImplementation(() => {});
+
+ dummyConfig.onLoadingFinished = jest.fn();
+
+ const dynamicList = document.createElement('div');
+ dynamicList.dataset.dynamic = true;
+ dummyList.list.appendChild(dynamicList);
+ });
+
+ it('calls onLoadingFinished after loading data', (done) => {
+ ajaxSpy = (url) => {
+ expect(url).toBe('dummy endpoint?dummy search key=');
+ return Promise.resolve(dummyData);
+ };
+
+ AjaxFilter.trigger()
+ .then(() => {
+ expect(dummyConfig.onLoadingFinished.mock.calls.length).toBe(1);
+ })
+ .then(done)
+ .catch(done.fail);
+ });
+
+ it('does not call onLoadingFinished if Ajax call fails', (done) => {
+ const dummyError = new Error('My dummy is sick! :-(');
+ ajaxSpy = (url) => {
+ expect(url).toBe('dummy endpoint?dummy search key=');
+ return Promise.reject(dummyError);
+ };
+
+ AjaxFilter.trigger()
+ .then(done.fail)
+ .catch((error) => {
+ expect(error).toBe(dummyError);
+ expect(dummyConfig.onLoadingFinished.mock.calls.length).toBe(0);
+ })
+ .then(done)
+ .catch(done.fail);
+ });
+ });
+});
diff --git a/spec/frontend/filtered_search/droplab/plugins/ajax_spec.js b/spec/frontend/filtered_search/droplab/plugins/ajax_spec.js
new file mode 100644
index 00000000000..c968b982091
--- /dev/null
+++ b/spec/frontend/filtered_search/droplab/plugins/ajax_spec.js
@@ -0,0 +1,41 @@
+import Ajax from '~/filtered_search/droplab/plugins/ajax';
+import AjaxCache from '~/lib/utils/ajax_cache';
+
+describe('Ajax', () => {
+ describe('preprocessing', () => {
+ const config = {};
+
+ describe('is not configured', () => {
+ it('passes the data through', () => {
+ const data = ['data'];
+
+ expect(Ajax.preprocessing(config, data)).toEqual(data);
+ });
+ });
+
+ describe('is configured', () => {
+ const processedArray = ['processed'];
+
+ beforeEach(() => {
+ config.preprocessing = () => processedArray;
+ jest.spyOn(config, 'preprocessing').mockImplementation(() => processedArray);
+ });
+
+ it('calls preprocessing', () => {
+ Ajax.preprocessing(config, []);
+
+ expect(config.preprocessing.mock.calls.length).toBe(1);
+ });
+
+ it('overrides AjaxCache', () => {
+ jest.spyOn(AjaxCache, 'override').mockImplementation((endpoint, results) => {
+ expect(results).toEqual(processedArray);
+ });
+
+ Ajax.preprocessing(config, []);
+
+ expect(AjaxCache.override.mock.calls.length).toBe(1);
+ });
+ });
+ });
+});
diff --git a/spec/frontend/filtered_search/droplab/plugins/input_setter_spec.js b/spec/frontend/filtered_search/droplab/plugins/input_setter_spec.js
new file mode 100644
index 00000000000..811b5ca4573
--- /dev/null
+++ b/spec/frontend/filtered_search/droplab/plugins/input_setter_spec.js
@@ -0,0 +1,259 @@
+import InputSetter from '~/filtered_search/droplab/plugins/input_setter';
+
+describe('InputSetter', () => {
+ let testContext;
+
+ beforeEach(() => {
+ testContext = {};
+ });
+
+ describe('init', () => {
+ beforeEach(() => {
+ testContext.config = { InputSetter: {} };
+ testContext.hook = { config: testContext.config };
+ testContext.inputSetter = {
+ addEvents: jest.fn(),
+ };
+
+ InputSetter.init.call(testContext.inputSetter, testContext.hook);
+ });
+
+ it('should set .hook', () => {
+ expect(testContext.inputSetter.hook).toBe(testContext.hook);
+ });
+
+ it('should set .config', () => {
+ expect(testContext.inputSetter.config).toBe(testContext.config.InputSetter);
+ });
+
+ it('should set .eventWrapper', () => {
+ expect(testContext.inputSetter.eventWrapper).toEqual({});
+ });
+
+ it('should call .addEvents', () => {
+ expect(testContext.inputSetter.addEvents).toHaveBeenCalled();
+ });
+
+ describe('if config.InputSetter is not set', () => {
+ beforeEach(() => {
+ testContext.config = { InputSetter: undefined };
+ testContext.hook = { config: testContext.config };
+
+ InputSetter.init.call(testContext.inputSetter, testContext.hook);
+ });
+
+ it('should set .config to an empty object', () => {
+ expect(testContext.inputSetter.config).toEqual({});
+ });
+
+ it('should set hook.config to an empty object', () => {
+ expect(testContext.hook.config.InputSetter).toEqual({});
+ });
+ });
+ });
+
+ describe('addEvents', () => {
+ beforeEach(() => {
+ testContext.hook = {
+ list: {
+ list: {
+ addEventListener: jest.fn(),
+ },
+ },
+ };
+ testContext.inputSetter = { eventWrapper: {}, hook: testContext.hook, setInputs: () => {} };
+
+ InputSetter.addEvents.call(testContext.inputSetter);
+ });
+
+ it('should set .eventWrapper.setInputs', () => {
+ expect(testContext.inputSetter.eventWrapper.setInputs).toEqual(expect.any(Function));
+ });
+
+ it('should call .addEventListener', () => {
+ expect(testContext.hook.list.list.addEventListener).toHaveBeenCalledWith(
+ 'click.dl',
+ testContext.inputSetter.eventWrapper.setInputs,
+ );
+ });
+ });
+
+ describe('removeEvents', () => {
+ beforeEach(() => {
+ testContext.hook = {
+ list: {
+ list: {
+ removeEventListener: jest.fn(),
+ },
+ },
+ };
+ testContext.eventWrapper = {
+ setInputs: jest.fn(),
+ };
+ testContext.inputSetter = { eventWrapper: testContext.eventWrapper, hook: testContext.hook };
+
+ InputSetter.removeEvents.call(testContext.inputSetter);
+ });
+
+ it('should call .removeEventListener', () => {
+ expect(testContext.hook.list.list.removeEventListener).toHaveBeenCalledWith(
+ 'click.dl',
+ testContext.eventWrapper.setInputs,
+ );
+ });
+ });
+
+ describe('setInputs', () => {
+ beforeEach(() => {
+ testContext.event = { detail: { selected: {} } };
+ testContext.config = [0, 1];
+ testContext.inputSetter = { config: testContext.config, setInput: () => {} };
+
+ jest.spyOn(testContext.inputSetter, 'setInput').mockImplementation(() => {});
+
+ InputSetter.setInputs.call(testContext.inputSetter, testContext.event);
+ });
+
+ it('should call .setInput for each config element', () => {
+ const allArgs = testContext.inputSetter.setInput.mock.calls;
+
+ expect(allArgs.length).toEqual(2);
+
+ allArgs.forEach((args, i) => {
+ expect(args[0]).toBe(testContext.config[i]);
+ expect(args[1]).toBe(testContext.event.detail.selected);
+ });
+ });
+
+ describe('if config isnt an array', () => {
+ beforeEach(() => {
+ testContext.inputSetter = { config: {}, setInput: () => {} };
+
+ InputSetter.setInputs.call(testContext.inputSetter, testContext.event);
+ });
+
+ it('should set .config to an array with .config as the first element', () => {
+ expect(testContext.inputSetter.config).toEqual([{}]);
+ });
+ });
+ });
+
+ describe('setInput', () => {
+ beforeEach(() => {
+ testContext.selectedItem = { getAttribute: () => {} };
+ testContext.input = { value: 'oldValue', tagName: 'INPUT', hasAttribute: () => {} };
+ testContext.config = { valueAttribute: {}, input: testContext.input };
+ testContext.inputSetter = { hook: { trigger: {} } };
+ testContext.newValue = 'newValue';
+
+ jest.spyOn(testContext.selectedItem, 'getAttribute').mockReturnValue(testContext.newValue);
+ jest.spyOn(testContext.input, 'hasAttribute').mockReturnValue(false);
+
+ InputSetter.setInput.call(
+ testContext.inputSetter,
+ testContext.config,
+ testContext.selectedItem,
+ );
+ });
+
+ it('should call .getAttribute', () => {
+ expect(testContext.selectedItem.getAttribute).toHaveBeenCalledWith(
+ testContext.config.valueAttribute,
+ );
+ });
+
+ it('should call .hasAttribute', () => {
+ expect(testContext.input.hasAttribute).toHaveBeenCalledWith(undefined);
+ });
+
+ it('should set the value of the input', () => {
+ expect(testContext.input.value).toBe(testContext.newValue);
+ });
+
+ describe('if no config.input is provided', () => {
+ beforeEach(() => {
+ testContext.config = { valueAttribute: {} };
+ testContext.trigger = { value: 'oldValue', tagName: 'INPUT', hasAttribute: () => {} };
+ testContext.inputSetter = { hook: { trigger: testContext.trigger } };
+
+ InputSetter.setInput.call(
+ testContext.inputSetter,
+ testContext.config,
+ testContext.selectedItem,
+ );
+ });
+
+ it('should set the value of the hook.trigger', () => {
+ expect(testContext.trigger.value).toBe(testContext.newValue);
+ });
+ });
+
+ describe('if the input tag is not INPUT', () => {
+ beforeEach(() => {
+ testContext.input = { textContent: 'oldValue', tagName: 'SPAN', hasAttribute: () => {} };
+ testContext.config = { valueAttribute: {}, input: testContext.input };
+
+ InputSetter.setInput.call(
+ testContext.inputSetter,
+ testContext.config,
+ testContext.selectedItem,
+ );
+ });
+
+ it('should set the textContent of the input', () => {
+ expect(testContext.input.textContent).toBe(testContext.newValue);
+ });
+ });
+
+ describe('if there is an inputAttribute', () => {
+ beforeEach(() => {
+ testContext.selectedItem = { getAttribute: () => {} };
+ testContext.input = { id: 'oldValue', hasAttribute: () => {}, setAttribute: () => {} };
+ testContext.inputSetter = { hook: { trigger: {} } };
+ testContext.newValue = 'newValue';
+ testContext.inputAttribute = 'id';
+ testContext.config = {
+ valueAttribute: {},
+ input: testContext.input,
+ inputAttribute: testContext.inputAttribute,
+ };
+
+ jest.spyOn(testContext.selectedItem, 'getAttribute').mockReturnValue(testContext.newValue);
+ jest.spyOn(testContext.input, 'hasAttribute').mockReturnValue(true);
+ jest.spyOn(testContext.input, 'setAttribute').mockImplementation(() => {});
+
+ InputSetter.setInput.call(
+ testContext.inputSetter,
+ testContext.config,
+ testContext.selectedItem,
+ );
+ });
+
+ it('should call setAttribute', () => {
+ expect(testContext.input.setAttribute).toHaveBeenCalledWith(
+ testContext.inputAttribute,
+ testContext.newValue,
+ );
+ });
+
+ it('should not set the value or textContent of the input', () => {
+ expect(testContext.input.value).not.toBe('newValue');
+ expect(testContext.input.textContent).not.toBe('newValue');
+ });
+ });
+ });
+
+ describe('destroy', () => {
+ beforeEach(() => {
+ testContext.inputSetter = {
+ removeEvents: jest.fn(),
+ };
+
+ InputSetter.destroy.call(testContext.inputSetter);
+ });
+
+ it('should call .removeEvents', () => {
+ expect(testContext.inputSetter.removeEvents).toHaveBeenCalled();
+ });
+ });
+});
diff --git a/spec/frontend/filtered_search/visual_token_value_spec.js b/spec/frontend/filtered_search/visual_token_value_spec.js
index 7185f382fc1..8ac5b6fbea6 100644
--- a/spec/frontend/filtered_search/visual_token_value_spec.js
+++ b/spec/frontend/filtered_search/visual_token_value_spec.js
@@ -1,4 +1,5 @@
import { escape } from 'lodash';
+import labelData from 'test_fixtures/labels/project_labels.json';
import FilteredSearchSpecHelper from 'helpers/filtered_search_spec_helper';
import { TEST_HOST } from 'helpers/test_constants';
import DropdownUtils from '~/filtered_search/dropdown_utils';
@@ -132,15 +133,8 @@ describe('Filtered Search Visual Tokens', () => {
});
describe('updateLabelTokenColor', () => {
- const jsonFixtureName = 'labels/project_labels.json';
const dummyEndpoint = '/dummy/endpoint';
- let labelData;
-
- beforeAll(() => {
- labelData = getJSONFixture(jsonFixtureName);
- });
-
const missingLabelToken = FilteredSearchSpecHelper.createFilterVisualToken(
'label',
'=',
diff --git a/spec/frontend/fixtures/abuse_reports.rb b/spec/frontend/fixtures/abuse_reports.rb
index f5524a10033..d8c8737b125 100644
--- a/spec/frontend/fixtures/abuse_reports.rb
+++ b/spec/frontend/fixtures/abuse_reports.rb
@@ -13,10 +13,6 @@ RSpec.describe Admin::AbuseReportsController, '(JavaScript fixtures)', type: :co
render_views
- before(:all) do
- clean_frontend_fixtures('abuse_reports/')
- end
-
before do
sign_in(admin)
enable_admin_mode!(admin)
diff --git a/spec/frontend/fixtures/admin_users.rb b/spec/frontend/fixtures/admin_users.rb
index e0fecbdb1aa..5579f50da74 100644
--- a/spec/frontend/fixtures/admin_users.rb
+++ b/spec/frontend/fixtures/admin_users.rb
@@ -17,10 +17,6 @@ RSpec.describe Admin::UsersController, '(JavaScript fixtures)', type: :controlle
render_views
- before(:all) do
- clean_frontend_fixtures('admin/users')
- end
-
it 'admin/users/new_with_internal_user_regex.html' do
stub_application_setting(user_default_external: true)
stub_application_setting(user_default_internal_regex: '^(?:(?!\.ext@).)*$\r?')
diff --git a/spec/frontend/fixtures/analytics.rb b/spec/frontend/fixtures/analytics.rb
index 6d106dce166..b6a5ea6616d 100644
--- a/spec/frontend/fixtures/analytics.rb
+++ b/spec/frontend/fixtures/analytics.rb
@@ -6,10 +6,6 @@ RSpec.describe 'Analytics (JavaScript fixtures)', :sidekiq_inline do
let_it_be(:value_stream_id) { 'default' }
- before(:all) do
- clean_frontend_fixtures('projects/analytics/value_stream_analytics/')
- end
-
before do
update_metrics
create_deployment
@@ -26,7 +22,7 @@ RSpec.describe 'Analytics (JavaScript fixtures)', :sidekiq_inline do
sign_in(user)
end
- it 'projects/analytics/value_stream_analytics/stages' do
+ it 'projects/analytics/value_stream_analytics/stages.json' do
get(:index, params: params, format: :json)
expect(response).to be_successful
@@ -44,7 +40,7 @@ RSpec.describe 'Analytics (JavaScript fixtures)', :sidekiq_inline do
end
Gitlab::Analytics::CycleAnalytics::DefaultStages.all.each do |stage|
- it "projects/analytics/value_stream_analytics/events/#{stage[:name]}" do
+ it "projects/analytics/value_stream_analytics/events/#{stage[:name]}.json" do
get(stage[:name], params: params, format: :json)
expect(response).to be_successful
@@ -62,7 +58,7 @@ RSpec.describe 'Analytics (JavaScript fixtures)', :sidekiq_inline do
sign_in(user)
end
- it "projects/analytics/value_stream_analytics/summary" do
+ it "projects/analytics/value_stream_analytics/summary.json" do
get(:show, params: params, format: :json)
expect(response).to be_successful
diff --git a/spec/frontend/fixtures/api_markdown.rb b/spec/frontend/fixtures/api_markdown.rb
index cb9a116f293..89f012a5110 100644
--- a/spec/frontend/fixtures/api_markdown.rb
+++ b/spec/frontend/fixtures/api_markdown.rb
@@ -21,11 +21,7 @@ RSpec.describe API::MergeRequests, '(JavaScript fixtures)', type: :request do
let(:project_wiki_page) { create(:wiki_page, wiki: project_wiki) }
- fixture_subdir = 'api/markdown'
-
before(:all) do
- clean_frontend_fixtures(fixture_subdir)
-
group.add_owner(user)
project.add_maintainer(user)
end
@@ -49,7 +45,7 @@ RSpec.describe API::MergeRequests, '(JavaScript fixtures)', type: :request do
name = "#{context}_#{name}" unless context.empty?
- it "#{fixture_subdir}/#{name}.json" do
+ it "api/markdown/#{name}.json" do
api_url = case context
when 'project'
"/#{project.full_path}/preview_markdown"
diff --git a/spec/frontend/fixtures/api_markdown.yml b/spec/frontend/fixtures/api_markdown.yml
index 1edb8cb3f41..45f73260887 100644
--- a/spec/frontend/fixtures/api_markdown.yml
+++ b/spec/frontend/fixtures/api_markdown.yml
@@ -77,6 +77,35 @@
</dd>
</dl>
+- name: details
+ markdown: |-
+ <details>
+ <summary>Apply this patch</summary>
+
+ ```diff
+ diff --git a/spec/frontend/fixtures/api_markdown.yml b/spec/frontend/fixtures/api_markdown.yml
+ index 8433efaf00c..69b12c59d46 100644
+ --- a/spec/frontend/fixtures/api_markdown.yml
+ +++ b/spec/frontend/fixtures/api_markdown.yml
+ @@ -33,6 +33,13 @@
+ * <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>.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>
+ +- name: details
+ + markdown: |-
+ + <details>
+ + <summary>Apply this patch</summary>
+ +
+ + 🶠much meta, 🶠many patch
+ + 🶠such diff, 🶠very meme
+ + 🶠wow!
+ + </details>
+ - name: link
+ markdown: '[GitLab](https://gitlab.com)'
+ - name: attachment_link
+ ```
+
+ </details>
- name: link
markdown: '[GitLab](https://gitlab.com)'
- name: attachment_link
@@ -204,3 +233,57 @@
* [x] ![Sample Audio](https://gitlab.com/1.mp3)
* [x] ![Sample Audio](https://gitlab.com/2.mp3)
* [x] ![Sample Video](https://gitlab.com/3.mp4)
+- name: table_of_contents
+ markdown: |-
+ [[_TOC_]]
+
+ # Lorem
+
+ Well, that's just like... your opinion.. man.
+
+ ## Ipsum
+
+ ### Dolar
+
+ # Sit amit
+
+ ### I don't know
+- name: word_break
+ markdown: Fernstraßen<wbr>bau<wbr>privat<wbr>finanzierungs<wbr>gesetz
+- name: frontmatter_yaml
+ markdown: |-
+ ---
+ title: Page title
+ ---
+- name: frontmatter_toml
+ markdown: |-
+ +++
+ title = "Page title"
+ +++
+- name: frontmatter_json
+ markdown: |-
+ ;;;
+ {
+ "title": "Page title"
+ }
+ ;;;
+- 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)`
+- 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
+ ```
diff --git a/spec/frontend/fixtures/api_merge_requests.rb b/spec/frontend/fixtures/api_merge_requests.rb
index 7117c9a1c7a..47321fbbeaa 100644
--- a/spec/frontend/fixtures/api_merge_requests.rb
+++ b/spec/frontend/fixtures/api_merge_requests.rb
@@ -11,10 +11,6 @@ RSpec.describe API::MergeRequests, '(JavaScript fixtures)', type: :request do
let_it_be(:project) { create(:project, :repository, namespace: namespace, path: 'lorem-ipsum') }
let_it_be(:mr) { create(:merge_request, source_project: project) }
- before(:all) do
- clean_frontend_fixtures('api/merge_requests')
- end
-
it 'api/merge_requests/get.json' do
4.times { |i| create(:merge_request, source_project: project, source_branch: "branch-#{i}") }
diff --git a/spec/frontend/fixtures/api_projects.rb b/spec/frontend/fixtures/api_projects.rb
index fa77ca1c0cf..eada2f8e0f7 100644
--- a/spec/frontend/fixtures/api_projects.rb
+++ b/spec/frontend/fixtures/api_projects.rb
@@ -11,10 +11,6 @@ RSpec.describe API::Projects, '(JavaScript fixtures)', type: :request do
let(:project) { create(:project, :repository, namespace: namespace, path: 'lorem-ipsum') }
let(:project_empty) { create(:project_empty_repo, namespace: namespace, path: 'lorem-ipsum-empty') }
- before(:all) do
- clean_frontend_fixtures('api/projects')
- end
-
it 'api/projects/get.json' do
get api("/projects/#{project.id}", admin)
diff --git a/spec/frontend/fixtures/application_settings.rb b/spec/frontend/fixtures/application_settings.rb
index b09bea56b94..9fa8d68e695 100644
--- a/spec/frontend/fixtures/application_settings.rb
+++ b/spec/frontend/fixtures/application_settings.rb
@@ -19,10 +19,6 @@ RSpec.describe Admin::ApplicationSettingsController, '(JavaScript fixtures)', ty
render_views
- before(:all) do
- clean_frontend_fixtures('application_settings/')
- end
-
after do
remove_repository(project)
end
diff --git a/spec/frontend/fixtures/autocomplete.rb b/spec/frontend/fixtures/autocomplete.rb
index 8983e241aa5..6215fa44e27 100644
--- a/spec/frontend/fixtures/autocomplete.rb
+++ b/spec/frontend/fixtures/autocomplete.rb
@@ -11,10 +11,6 @@ RSpec.describe ::AutocompleteController, '(JavaScript fixtures)', type: :control
let(:project) { create(:project, namespace: group, path: 'autocomplete-project') }
let(:merge_request) { create(:merge_request, source_project: project, author: user) }
- before(:all) do
- clean_frontend_fixtures('autocomplete/')
- end
-
before do
group.add_owner(user)
sign_in(user)
diff --git a/spec/frontend/fixtures/autocomplete_sources.rb b/spec/frontend/fixtures/autocomplete_sources.rb
index 9ff0f959c11..74bf58cc106 100644
--- a/spec/frontend/fixtures/autocomplete_sources.rb
+++ b/spec/frontend/fixtures/autocomplete_sources.rb
@@ -10,10 +10,6 @@ RSpec.describe Projects::AutocompleteSourcesController, '(JavaScript fixtures)',
let_it_be(:project) { create(:project, namespace: group, path: 'autocomplete-sources-project') }
let_it_be(:issue) { create(:issue, project: project) }
- before(:all) do
- clean_frontend_fixtures('autocomplete_sources/')
- end
-
before do
group.add_owner(user)
sign_in(user)
diff --git a/spec/frontend/fixtures/blob.rb b/spec/frontend/fixtures/blob.rb
index b112886b2ca..f90e3662e98 100644
--- a/spec/frontend/fixtures/blob.rb
+++ b/spec/frontend/fixtures/blob.rb
@@ -11,10 +11,6 @@ RSpec.describe Projects::BlobController, '(JavaScript fixtures)', type: :control
render_views
- before(:all) do
- clean_frontend_fixtures('blob/')
- end
-
before do
sign_in(user)
allow(SecureRandom).to receive(:hex).and_return('securerandomhex:thereisnospoon')
diff --git a/spec/frontend/fixtures/branches.rb b/spec/frontend/fixtures/branches.rb
index f3b3633347d..828564977e0 100644
--- a/spec/frontend/fixtures/branches.rb
+++ b/spec/frontend/fixtures/branches.rb
@@ -9,11 +9,6 @@ RSpec.describe 'Branches (JavaScript fixtures)' do
let_it_be(:project) { create(:project, :repository, namespace: namespace, path: 'branches-project') }
let_it_be(:user) { project.owner }
- before(:all) do
- clean_frontend_fixtures('branches/')
- clean_frontend_fixtures('api/branches/')
- end
-
after(:all) do
remove_repository(project)
end
diff --git a/spec/frontend/fixtures/clusters.rb b/spec/frontend/fixtures/clusters.rb
index b37aa137504..ea883555255 100644
--- a/spec/frontend/fixtures/clusters.rb
+++ b/spec/frontend/fixtures/clusters.rb
@@ -12,10 +12,6 @@ RSpec.describe Projects::ClustersController, '(JavaScript fixtures)', type: :con
render_views
- before(:all) do
- clean_frontend_fixtures('clusters/')
- end
-
before do
sign_in(user)
end
diff --git a/spec/frontend/fixtures/commit.rb b/spec/frontend/fixtures/commit.rb
index ff62a8286fc..f9e0f604b52 100644
--- a/spec/frontend/fixtures/commit.rb
+++ b/spec/frontend/fixtures/commit.rb
@@ -9,11 +9,6 @@ RSpec.describe 'Commit (JavaScript fixtures)' do
let_it_be(:user) { project.owner }
let_it_be(:commit) { project.commit("master") }
- before(:all) do
- clean_frontend_fixtures('commit/')
- clean_frontend_fixtures('api/commits/')
- end
-
before do
allow(SecureRandom).to receive(:hex).and_return('securerandomhex:thereisnospoon')
end
diff --git a/spec/frontend/fixtures/deploy_keys.rb b/spec/frontend/fixtures/deploy_keys.rb
index 5c24c071792..bed6c798793 100644
--- a/spec/frontend/fixtures/deploy_keys.rb
+++ b/spec/frontend/fixtures/deploy_keys.rb
@@ -13,10 +13,6 @@ RSpec.describe Projects::DeployKeysController, '(JavaScript fixtures)', type: :c
let(:project3) { create(:project, :internal)}
let(:project4) { create(:project, :internal)}
- before(:all) do
- clean_frontend_fixtures('deploy_keys/')
- end
-
before do
# Using an admin for these fixtures because they are used for verifying a frontend
# component that would normally get its data from `Admin::DeployKeysController`
diff --git a/spec/frontend/fixtures/freeze_period.rb b/spec/frontend/fixtures/freeze_period.rb
index 42762fa56f9..d9573c8000d 100644
--- a/spec/frontend/fixtures/freeze_period.rb
+++ b/spec/frontend/fixtures/freeze_period.rb
@@ -9,10 +9,6 @@ RSpec.describe 'Freeze Periods (JavaScript fixtures)' do
let_it_be(:project) { create(:project, :repository, path: 'freeze-periods-project') }
let_it_be(:user) { project.owner }
- before(:all) do
- clean_frontend_fixtures('api/freeze-periods/')
- end
-
after(:all) do
remove_repository(project)
end
diff --git a/spec/frontend/fixtures/groups.rb b/spec/frontend/fixtures/groups.rb
index 42aad9f187e..ddd436b98c6 100644
--- a/spec/frontend/fixtures/groups.rb
+++ b/spec/frontend/fixtures/groups.rb
@@ -8,10 +8,6 @@ RSpec.describe 'Groups (JavaScript fixtures)', type: :controller do
let(:user) { create(:user) }
let(:group) { create(:group, name: 'frontend-fixtures-group', runners_token: 'runnerstoken:intabulasreferre')}
- before(:all) do
- clean_frontend_fixtures('groups/')
- end
-
before do
group.add_owner(user)
sign_in(user)
diff --git a/spec/frontend/fixtures/issues.rb b/spec/frontend/fixtures/issues.rb
index a027247bd0d..6519416cb9e 100644
--- a/spec/frontend/fixtures/issues.rb
+++ b/spec/frontend/fixtures/issues.rb
@@ -11,10 +11,6 @@ RSpec.describe Projects::IssuesController, '(JavaScript fixtures)', type: :contr
render_views
- before(:all) do
- clean_frontend_fixtures('issues/')
- end
-
before do
project.add_maintainer(user)
sign_in(user)
diff --git a/spec/frontend/fixtures/jobs.rb b/spec/frontend/fixtures/jobs.rb
index 22179c790bd..12584f38629 100644
--- a/spec/frontend/fixtures/jobs.rb
+++ b/spec/frontend/fixtures/jobs.rb
@@ -21,10 +21,6 @@ RSpec.describe Projects::JobsController, '(JavaScript fixtures)', type: :control
render_views
- before(:all) do
- clean_frontend_fixtures('jobs/')
- end
-
before do
sign_in(user)
end
diff --git a/spec/frontend/fixtures/labels.rb b/spec/frontend/fixtures/labels.rb
index d7ca2aff18c..6736baed199 100644
--- a/spec/frontend/fixtures/labels.rb
+++ b/spec/frontend/fixtures/labels.rb
@@ -17,10 +17,6 @@ RSpec.describe 'Labels (JavaScript fixtures)' do
let!(:groub_label_space) { create(:group_label, group: group, title: 'some space', color: '#FFFFFF') }
let!(:groub_label_violets) { create(:group_label, group: group, title: 'violets', color: '#0000FF') }
- before(:all) do
- clean_frontend_fixtures('labels/')
- end
-
after do
remove_repository(project)
end
diff --git a/spec/frontend/fixtures/merge_requests.rb b/spec/frontend/fixtures/merge_requests.rb
index f10f96f2516..68ed2ca2359 100644
--- a/spec/frontend/fixtures/merge_requests.rb
+++ b/spec/frontend/fixtures/merge_requests.rb
@@ -49,10 +49,6 @@ RSpec.describe Projects::MergeRequestsController, '(JavaScript fixtures)', type:
render_views
- before(:all) do
- clean_frontend_fixtures('merge_requests/')
- end
-
before do
sign_in(user)
allow(Discussion).to receive(:build_discussion_id).and_return(['discussionid:ceterumcenseo'])
diff --git a/spec/frontend/fixtures/merge_requests_diffs.rb b/spec/frontend/fixtures/merge_requests_diffs.rb
index edf1fcf3c0a..e733764f248 100644
--- a/spec/frontend/fixtures/merge_requests_diffs.rb
+++ b/spec/frontend/fixtures/merge_requests_diffs.rb
@@ -20,10 +20,6 @@ RSpec.describe Projects::MergeRequests::DiffsController, '(JavaScript fixtures)'
render_views
- before(:all) do
- clean_frontend_fixtures('merge_request_diffs/')
- end
-
before do
# Create a user that matches the project.commit author
# This is so that the "author" information will be populated
diff --git a/spec/frontend/fixtures/metrics_dashboard.rb b/spec/frontend/fixtures/metrics_dashboard.rb
index eef79825ae7..d59b01b04af 100644
--- a/spec/frontend/fixtures/metrics_dashboard.rb
+++ b/spec/frontend/fixtures/metrics_dashboard.rb
@@ -12,10 +12,6 @@ RSpec.describe MetricsDashboard, '(JavaScript fixtures)', type: :controller do
let_it_be(:environment) { create(:environment, id: 1, project: project) }
let_it_be(:params) { { environment: environment } }
- before(:all) do
- clean_frontend_fixtures('metrics_dashboard/')
- end
-
controller(::ApplicationController) do
include MetricsDashboard
end
diff --git a/spec/frontend/fixtures/pipeline_schedules.rb b/spec/frontend/fixtures/pipeline_schedules.rb
index a7d43fdbe62..6389f59aa0a 100644
--- a/spec/frontend/fixtures/pipeline_schedules.rb
+++ b/spec/frontend/fixtures/pipeline_schedules.rb
@@ -15,10 +15,6 @@ RSpec.describe Projects::PipelineSchedulesController, '(JavaScript fixtures)', t
render_views
- before(:all) do
- clean_frontend_fixtures('pipeline_schedules/')
- end
-
before do
sign_in(user)
end
diff --git a/spec/frontend/fixtures/pipelines.rb b/spec/frontend/fixtures/pipelines.rb
index f695b74ec87..709e14183df 100644
--- a/spec/frontend/fixtures/pipelines.rb
+++ b/spec/frontend/fixtures/pipelines.rb
@@ -23,10 +23,6 @@ RSpec.describe Projects::PipelinesController, '(JavaScript fixtures)', type: :co
let!(:build_test) { create(:ci_build, pipeline: pipeline, stage: 'test') }
let!(:build_deploy_failed) { create(:ci_build, status: :failed, pipeline: pipeline, stage: 'deploy') }
- before(:all) do
- clean_frontend_fixtures('pipelines/')
- end
-
before do
sign_in(user)
end
diff --git a/spec/frontend/fixtures/projects.rb b/spec/frontend/fixtures/projects.rb
index 7873d59dbad..3c8964d398a 100644
--- a/spec/frontend/fixtures/projects.rb
+++ b/spec/frontend/fixtures/projects.rb
@@ -16,10 +16,6 @@ RSpec.describe 'Projects (JavaScript fixtures)', type: :controller do
render_views
- before(:all) do
- clean_frontend_fixtures('projects/')
- end
-
before do
project_with_repo.add_maintainer(user)
sign_in(user)
@@ -57,10 +53,6 @@ RSpec.describe 'Projects (JavaScript fixtures)', type: :controller do
project_variable_populated.add_maintainer(user)
end
- before(:all) do
- clean_frontend_fixtures('graphql/projects/access_tokens')
- end
-
base_input_path = 'access_tokens/graphql/queries/'
base_output_path = 'graphql/projects/access_tokens/'
query_name = 'get_projects.query.graphql'
diff --git a/spec/frontend/fixtures/projects_json.rb b/spec/frontend/fixtures/projects_json.rb
index c081d4f08dc..c4de56ccfab 100644
--- a/spec/frontend/fixtures/projects_json.rb
+++ b/spec/frontend/fixtures/projects_json.rb
@@ -8,10 +8,6 @@ RSpec.describe 'Projects JSON endpoints (JavaScript fixtures)', type: :controlle
let(:admin) { create(:admin, name: 'root') }
let(:project) { create(:project, :repository) }
- before(:all) do
- clean_frontend_fixtures('projects_json/')
- end
-
before do
project.add_maintainer(admin)
sign_in(admin)
diff --git a/spec/frontend/fixtures/prometheus_service.rb b/spec/frontend/fixtures/prometheus_service.rb
index c349f2a24bc..bbd938c66f6 100644
--- a/spec/frontend/fixtures/prometheus_service.rb
+++ b/spec/frontend/fixtures/prometheus_service.rb
@@ -12,10 +12,6 @@ RSpec.describe Projects::ServicesController, '(JavaScript fixtures)', type: :con
render_views
- before(:all) do
- clean_frontend_fixtures('services/prometheus')
- end
-
before do
sign_in(user)
end
diff --git a/spec/frontend/fixtures/raw.rb b/spec/frontend/fixtures/raw.rb
index 44927bd29d8..211c4e7c048 100644
--- a/spec/frontend/fixtures/raw.rb
+++ b/spec/frontend/fixtures/raw.rb
@@ -9,14 +9,6 @@ RSpec.describe 'Raw files', '(JavaScript fixtures)' do
let(:project) { create(:project, :repository, namespace: namespace, path: 'raw-project') }
let(:response) { @blob.data.force_encoding('UTF-8') }
- before(:all) do
- clean_frontend_fixtures('blob/notebook/')
- clean_frontend_fixtures('blob/pdf/')
- clean_frontend_fixtures('blob/text/')
- clean_frontend_fixtures('blob/binary/')
- clean_frontend_fixtures('blob/images/')
- end
-
after do
remove_repository(project)
end
diff --git a/spec/frontend/fixtures/releases.rb b/spec/frontend/fixtures/releases.rb
index e8f259fba15..fc344472588 100644
--- a/spec/frontend/fixtures/releases.rb
+++ b/spec/frontend/fixtures/releases.rb
@@ -116,10 +116,6 @@ RSpec.describe 'Releases (JavaScript fixtures)' do
end
describe API::Releases, type: :request do
- before(:all) do
- clean_frontend_fixtures('api/releases/')
- end
-
it 'api/releases/release.json' do
get api("/projects/#{project.id}/releases/#{release.tag}", admin)
@@ -134,10 +130,6 @@ RSpec.describe 'Releases (JavaScript fixtures)' do
one_release_query_path = 'releases/graphql/queries/one_release.query.graphql'
one_release_for_editing_query_path = 'releases/graphql/queries/one_release_for_editing.query.graphql'
- before(:all) do
- clean_frontend_fixtures('graphql/releases/')
- end
-
it "graphql/#{all_releases_query_path}.json" do
query = get_graphql_query_as_string(all_releases_query_path)
diff --git a/spec/frontend/fixtures/runner.rb b/spec/frontend/fixtures/runner.rb
index d5d6f534def..fa150fbf57c 100644
--- a/spec/frontend/fixtures/runner.rb
+++ b/spec/frontend/fixtures/runner.rb
@@ -20,10 +20,6 @@ RSpec.describe 'Runner (JavaScript fixtures)' do
query_path = 'runner/graphql/'
fixtures_path = 'graphql/runner/'
- before(:all) do
- clean_frontend_fixtures(fixtures_path)
- end
-
after(:all) do
remove_repository(project)
end
diff --git a/spec/frontend/fixtures/search.rb b/spec/frontend/fixtures/search.rb
index 264ce7d010c..db1ef67998f 100644
--- a/spec/frontend/fixtures/search.rb
+++ b/spec/frontend/fixtures/search.rb
@@ -9,10 +9,6 @@ RSpec.describe SearchController, '(JavaScript fixtures)', type: :controller do
let_it_be(:user) { create(:user) }
- before(:all) do
- clean_frontend_fixtures('search/')
- end
-
before do
sign_in(user)
end
diff --git a/spec/frontend/fixtures/services.rb b/spec/frontend/fixtures/services.rb
index 91e6c2eb280..a8293a080a9 100644
--- a/spec/frontend/fixtures/services.rb
+++ b/spec/frontend/fixtures/services.rb
@@ -12,10 +12,6 @@ RSpec.describe Projects::ServicesController, '(JavaScript fixtures)', type: :con
render_views
- before(:all) do
- clean_frontend_fixtures('services/')
- end
-
before do
sign_in(user)
end
diff --git a/spec/frontend/fixtures/sessions.rb b/spec/frontend/fixtures/sessions.rb
index 0ef14c1d4fa..bb73bf3215c 100644
--- a/spec/frontend/fixtures/sessions.rb
+++ b/spec/frontend/fixtures/sessions.rb
@@ -5,10 +5,6 @@ require 'spec_helper'
RSpec.describe 'Sessions (JavaScript fixtures)' do
include JavaScriptFixturesHelpers
- before(:all) do
- clean_frontend_fixtures('sessions/')
- end
-
describe SessionsController, '(JavaScript fixtures)', type: :controller do
include DeviseHelpers
diff --git a/spec/frontend/fixtures/snippet.rb b/spec/frontend/fixtures/snippet.rb
index 5211d52f374..397fb3e7124 100644
--- a/spec/frontend/fixtures/snippet.rb
+++ b/spec/frontend/fixtures/snippet.rb
@@ -12,10 +12,6 @@ RSpec.describe SnippetsController, '(JavaScript fixtures)', type: :controller do
render_views
- before(:all) do
- clean_frontend_fixtures('snippets/')
- end
-
before do
sign_in(user)
allow(Discussion).to receive(:build_discussion_id).and_return(['discussionid:ceterumcenseo'])
diff --git a/spec/frontend/fixtures/startup_css.rb b/spec/frontend/fixtures/startup_css.rb
index 1bd99f5cd7f..e19a98c3bab 100644
--- a/spec/frontend/fixtures/startup_css.rb
+++ b/spec/frontend/fixtures/startup_css.rb
@@ -9,15 +9,15 @@ RSpec.describe 'Startup CSS fixtures', type: :controller do
render_views
- before(:all) do
- clean_frontend_fixtures('startup_css/')
- end
-
shared_examples 'startup css project fixtures' do |type|
let(:user) { create(:user, :admin) }
let(:project) { create(:project, :public, :repository, description: 'Code and stuff', creator: user) }
before do
+ # We want vNext badge to be included and com/canary don't remove/hide any other elements.
+ # This is why we're turning com and canary on by default for now.
+ allow(Gitlab).to receive(:com?).and_return(true)
+ allow(Gitlab).to receive(:canary?).and_return(true)
sign_in(user)
end
diff --git a/spec/frontend/fixtures/static/oauth_remember_me.html b/spec/frontend/fixtures/static/oauth_remember_me.html
index c6af8129b4d..0b4d482925d 100644
--- a/spec/frontend/fixtures/static/oauth_remember_me.html
+++ b/spec/frontend/fixtures/static/oauth_remember_me.html
@@ -1,22 +1,21 @@
<div id="oauth-container">
-<input id="remember_me" type="checkbox">
+ <input id="remember_me" type="checkbox" />
-<form method="post" action="http://example.com/">
- <button class="oauth-login twitter" type="submit">
- <span>Twitter</span>
- </button>
-</form>
+ <form method="post" action="http://example.com/">
+ <button class="js-oauth-login twitter" type="submit">
+ <span>Twitter</span>
+ </button>
+ </form>
-<form method="post" action="http://example.com/">
- <button class="oauth-login github" type="submit">
- <span>GitHub</span>
- </button>
-</form>
-
-<form method="post" action="http://example.com/?redirect_fragment=L1">
- <button class="oauth-login facebook" type="submit">
- <span>Facebook</span>
- </button>
-</form>
+ <form method="post" action="http://example.com/">
+ <button class="js-oauth-login github" type="submit">
+ <span>GitHub</span>
+ </button>
+ </form>
+ <form method="post" action="http://example.com/?redirect_fragment=L1">
+ <button class="js-oauth-login facebook" type="submit">
+ <span>Facebook</span>
+ </button>
+ </form>
</div>
diff --git a/spec/frontend/fixtures/tags.rb b/spec/frontend/fixtures/tags.rb
index 9483f0a4492..6cfa5f82efe 100644
--- a/spec/frontend/fixtures/tags.rb
+++ b/spec/frontend/fixtures/tags.rb
@@ -8,10 +8,6 @@ RSpec.describe 'Tags (JavaScript fixtures)' do
let_it_be(:project) { create(:project, :repository, path: 'tags-project') }
let_it_be(:user) { project.owner }
- before(:all) do
- clean_frontend_fixtures('api/tags/')
- end
-
after(:all) do
remove_repository(project)
end
diff --git a/spec/frontend/fixtures/timezones.rb b/spec/frontend/fixtures/timezones.rb
index 261dcf5e116..157f47855ea 100644
--- a/spec/frontend/fixtures/timezones.rb
+++ b/spec/frontend/fixtures/timezones.rb
@@ -8,10 +8,6 @@ RSpec.describe TimeZoneHelper, '(JavaScript fixtures)' do
let(:response) { @timezones.sort_by! { |tz| tz[:name] }.to_json }
- before(:all) do
- clean_frontend_fixtures('timezones/')
- end
-
it 'timezones/short.json' do
@timezones = timezone_data(format: :short)
end
diff --git a/spec/frontend/fixtures/todos.rb b/spec/frontend/fixtures/todos.rb
index 985afafe50e..a0573b0b658 100644
--- a/spec/frontend/fixtures/todos.rb
+++ b/spec/frontend/fixtures/todos.rb
@@ -13,10 +13,6 @@ RSpec.describe 'Todos (JavaScript fixtures)' do
let(:issue_2) { create(:issue, title: 'issue_2', project: project) }
let!(:todo_2) { create(:todo, :done, user: user, project: project, target: issue_2, created_at: 50.hours.ago) }
- before(:all) do
- clean_frontend_fixtures('todos/')
- end
-
after do
remove_repository(project)
end
diff --git a/spec/frontend/fixtures/u2f.rb b/spec/frontend/fixtures/u2f.rb
index a6a8ba7318b..96820c9ae80 100644
--- a/spec/frontend/fixtures/u2f.rb
+++ b/spec/frontend/fixtures/u2f.rb
@@ -7,10 +7,6 @@ RSpec.context 'U2F' do
let(:user) { create(:user, :two_factor_via_u2f, otp_secret: 'otpsecret:coolkids') }
- before(:all) do
- clean_frontend_fixtures('u2f/')
- end
-
before do
stub_feature_flags(webauthn: false)
end
diff --git a/spec/frontend/fixtures/webauthn.rb b/spec/frontend/fixtures/webauthn.rb
index b195fee76f0..c6e9b41b584 100644
--- a/spec/frontend/fixtures/webauthn.rb
+++ b/spec/frontend/fixtures/webauthn.rb
@@ -7,10 +7,6 @@ RSpec.context 'WebAuthn' do
let(:user) { create(:user, :two_factor_via_webauthn, otp_secret: 'otpsecret:coolkids') }
- before(:all) do
- clean_frontend_fixtures('webauthn/')
- end
-
describe SessionsController, '(JavaScript fixtures)', type: :controller do
include DeviseHelpers
diff --git a/spec/frontend/gfm_auto_complete_spec.js b/spec/frontend/gfm_auto_complete_spec.js
index 94ad7759110..eb11df2fe43 100644
--- a/spec/frontend/gfm_auto_complete_spec.js
+++ b/spec/frontend/gfm_auto_complete_spec.js
@@ -1,17 +1,15 @@
/* eslint no-param-reassign: "off" */
import MockAdapter from 'axios-mock-adapter';
import $ from 'jquery';
+import labelsFixture from 'test_fixtures/autocomplete_sources/labels.json';
import GfmAutoComplete, { membersBeforeSave } from 'ee_else_ce/gfm_auto_complete';
import { initEmojiMock } from 'helpers/emoji';
import '~/lib/utils/jquery_at_who';
-import { getJSONFixture } from 'helpers/fixtures';
import { TEST_HOST } from 'helpers/test_constants';
import waitForPromises from 'helpers/wait_for_promises';
import AjaxCache from '~/lib/utils/ajax_cache';
import axios from '~/lib/utils/axios_utils';
-const labelsFixture = getJSONFixture('autocomplete_sources/labels.json');
-
describe('GfmAutoComplete', () => {
const fetchDataMock = { fetchData: jest.fn() };
let gfmAutoCompleteCallbacks = GfmAutoComplete.prototype.getDefaultCallbacks.call(fetchDataMock);
diff --git a/spec/frontend/header_search/components/app_spec.js b/spec/frontend/header_search/components/app_spec.js
index 2cbcb73ce5b..2ea2693a978 100644
--- a/spec/frontend/header_search/components/app_spec.js
+++ b/spec/frontend/header_search/components/app_spec.js
@@ -3,6 +3,7 @@ import Vue from 'vue';
import Vuex from 'vuex';
import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
import HeaderSearchApp from '~/header_search/components/app.vue';
+import HeaderSearchAutocompleteItems from '~/header_search/components/header_search_autocomplete_items.vue';
import HeaderSearchDefaultItems from '~/header_search/components/header_search_default_items.vue';
import HeaderSearchScopedItems from '~/header_search/components/header_search_scoped_items.vue';
import { ENTER_KEY, ESC_KEY } from '~/lib/utils/keys';
@@ -20,6 +21,7 @@ describe('HeaderSearchApp', () => {
const actionSpies = {
setSearch: jest.fn(),
+ fetchAutocompleteOptions: jest.fn(),
};
const createComponent = (initialState) => {
@@ -46,6 +48,8 @@ describe('HeaderSearchApp', () => {
const findHeaderSearchDropdown = () => wrapper.findByTestId('header-search-dropdown-menu');
const findHeaderSearchDefaultItems = () => wrapper.findComponent(HeaderSearchDefaultItems);
const findHeaderSearchScopedItems = () => wrapper.findComponent(HeaderSearchScopedItems);
+ const findHeaderSearchAutocompleteItems = () =>
+ wrapper.findComponent(HeaderSearchAutocompleteItems);
describe('template', () => {
it('always renders Header Search Input', () => {
@@ -74,11 +78,11 @@ describe('HeaderSearchApp', () => {
});
describe.each`
- search | showDefault | showScoped
- ${null} | ${true} | ${false}
- ${''} | ${true} | ${false}
- ${MOCK_SEARCH} | ${false} | ${true}
- `('Header Search Dropdown Items', ({ search, showDefault, showScoped }) => {
+ search | showDefault | showScoped | showAutocomplete
+ ${null} | ${true} | ${false} | ${false}
+ ${''} | ${true} | ${false} | ${false}
+ ${MOCK_SEARCH} | ${false} | ${true} | ${true}
+ `('Header Search Dropdown Items', ({ search, showDefault, showScoped, showAutocomplete }) => {
describe(`when search is ${search}`, () => {
beforeEach(() => {
createComponent({ search });
@@ -93,6 +97,10 @@ describe('HeaderSearchApp', () => {
it(`should${showScoped ? '' : ' not'} render the Scoped Dropdown Items`, () => {
expect(findHeaderSearchScopedItems().exists()).toBe(showScoped);
});
+
+ it(`should${showAutocomplete ? '' : ' not'} render the Autocomplete Dropdown Items`, () => {
+ expect(findHeaderSearchAutocompleteItems().exists()).toBe(showAutocomplete);
+ });
});
});
});
@@ -139,12 +147,18 @@ describe('HeaderSearchApp', () => {
});
});
- it('calls setSearch when search input event is fired', async () => {
- findHeaderSearchInput().vm.$emit('input', MOCK_SEARCH);
+ describe('onInput', () => {
+ beforeEach(() => {
+ findHeaderSearchInput().vm.$emit('input', MOCK_SEARCH);
+ });
- await wrapper.vm.$nextTick();
+ it('calls setSearch with search term', () => {
+ expect(actionSpies.setSearch).toHaveBeenCalledWith(expect.any(Object), MOCK_SEARCH);
+ });
- expect(actionSpies.setSearch).toHaveBeenCalledWith(expect.any(Object), MOCK_SEARCH);
+ it('calls fetchAutocompleteOptions', () => {
+ expect(actionSpies.fetchAutocompleteOptions).toHaveBeenCalled();
+ });
});
it('submits a search onKey-Enter', async () => {
diff --git a/spec/frontend/header_search/components/header_search_autocomplete_items_spec.js b/spec/frontend/header_search/components/header_search_autocomplete_items_spec.js
new file mode 100644
index 00000000000..6b84e63989d
--- /dev/null
+++ b/spec/frontend/header_search/components/header_search_autocomplete_items_spec.js
@@ -0,0 +1,108 @@
+import { GlDropdownItem, GlLoadingIcon, GlAvatar } from '@gitlab/ui';
+import { shallowMount } from '@vue/test-utils';
+import Vue from 'vue';
+import Vuex from 'vuex';
+import HeaderSearchAutocompleteItems from '~/header_search/components/header_search_autocomplete_items.vue';
+import {
+ GROUPS_CATEGORY,
+ LARGE_AVATAR_PX,
+ PROJECTS_CATEGORY,
+ SMALL_AVATAR_PX,
+} from '~/header_search/constants';
+import { MOCK_GROUPED_AUTOCOMPLETE_OPTIONS, MOCK_AUTOCOMPLETE_OPTIONS } from '../mock_data';
+
+Vue.use(Vuex);
+
+describe('HeaderSearchAutocompleteItems', () => {
+ let wrapper;
+
+ const createComponent = (initialState, mockGetters) => {
+ const store = new Vuex.Store({
+ state: {
+ loading: false,
+ ...initialState,
+ },
+ getters: {
+ autocompleteGroupedSearchOptions: () => MOCK_GROUPED_AUTOCOMPLETE_OPTIONS,
+ ...mockGetters,
+ },
+ });
+
+ wrapper = shallowMount(HeaderSearchAutocompleteItems, {
+ store,
+ });
+ };
+
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ const findDropdownItems = () => wrapper.findAllComponents(GlDropdownItem);
+ const findDropdownItemTitles = () => findDropdownItems().wrappers.map((w) => w.text());
+ const findDropdownItemLinks = () => findDropdownItems().wrappers.map((w) => w.attributes('href'));
+ const findGlLoadingIcon = () => wrapper.findComponent(GlLoadingIcon);
+ const findGlAvatar = () => wrapper.findComponent(GlAvatar);
+
+ describe('template', () => {
+ describe('when loading is true', () => {
+ beforeEach(() => {
+ createComponent({ loading: true });
+ });
+
+ it('renders GlLoadingIcon', () => {
+ expect(findGlLoadingIcon().exists()).toBe(true);
+ });
+
+ it('does not render autocomplete options', () => {
+ expect(findDropdownItems()).toHaveLength(0);
+ });
+ });
+
+ describe('when loading is false', () => {
+ beforeEach(() => {
+ createComponent({ loading: false });
+ });
+
+ it('does not render GlLoadingIcon', () => {
+ expect(findGlLoadingIcon().exists()).toBe(false);
+ });
+
+ describe('Dropdown items', () => {
+ it('renders item for each option in autocomplete option', () => {
+ expect(findDropdownItems()).toHaveLength(MOCK_AUTOCOMPLETE_OPTIONS.length);
+ });
+
+ it('renders titles correctly', () => {
+ const expectedTitles = MOCK_AUTOCOMPLETE_OPTIONS.map((o) => o.label);
+ expect(findDropdownItemTitles()).toStrictEqual(expectedTitles);
+ });
+
+ it('renders links correctly', () => {
+ const expectedLinks = MOCK_AUTOCOMPLETE_OPTIONS.map((o) => o.url);
+ expect(findDropdownItemLinks()).toStrictEqual(expectedLinks);
+ });
+ });
+ describe.each`
+ item | showAvatar | avatarSize
+ ${{ data: [{ category: PROJECTS_CATEGORY, avatar_url: null }] }} | ${true} | ${String(LARGE_AVATAR_PX)}
+ ${{ data: [{ category: GROUPS_CATEGORY, avatar_url: '/123' }] }} | ${true} | ${String(LARGE_AVATAR_PX)}
+ ${{ data: [{ category: 'Help', avatar_url: '' }] }} | ${true} | ${String(SMALL_AVATAR_PX)}
+ ${{ data: [{ category: 'Settings' }] }} | ${false} | ${false}
+ `('GlAvatar', ({ item, showAvatar, avatarSize }) => {
+ describe(`when category is ${item.data[0].category} and avatar_url is ${item.data[0].avatar_url}`, () => {
+ beforeEach(() => {
+ createComponent({}, { autocompleteGroupedSearchOptions: () => [item] });
+ });
+
+ it(`should${showAvatar ? '' : ' not'} render`, () => {
+ expect(findGlAvatar().exists()).toBe(showAvatar);
+ });
+
+ it(`should set avatarSize to ${avatarSize}`, () => {
+ expect(findGlAvatar().exists() && findGlAvatar().attributes('size')).toBe(avatarSize);
+ });
+ });
+ });
+ });
+ });
+});
diff --git a/spec/frontend/header_search/mock_data.js b/spec/frontend/header_search/mock_data.js
index 5963ad9c279..915b3a4a678 100644
--- a/spec/frontend/header_search/mock_data.js
+++ b/spec/frontend/header_search/mock_data.js
@@ -19,6 +19,8 @@ export const MOCK_MR_PATH = '/dashboard/merge_requests';
export const MOCK_ALL_PATH = '/';
+export const MOCK_AUTOCOMPLETE_PATH = '/autocomplete';
+
export const MOCK_PROJECT = {
id: 123,
name: 'MockProject',
@@ -81,3 +83,70 @@ export const MOCK_SCOPED_SEARCH_OPTIONS = [
url: MOCK_ALL_PATH,
},
];
+
+export const MOCK_AUTOCOMPLETE_OPTIONS = [
+ {
+ category: 'Projects',
+ id: 1,
+ label: 'MockProject1',
+ url: 'project/1',
+ },
+ {
+ category: 'Projects',
+ id: 2,
+ label: 'MockProject2',
+ url: 'project/2',
+ },
+ {
+ category: 'Groups',
+ id: 1,
+ label: 'MockGroup1',
+ url: 'group/1',
+ },
+ {
+ category: 'Help',
+ label: 'GitLab Help',
+ url: 'help/gitlab',
+ },
+];
+
+export const MOCK_GROUPED_AUTOCOMPLETE_OPTIONS = [
+ {
+ category: 'Projects',
+ data: [
+ {
+ category: 'Projects',
+ id: 1,
+ label: 'MockProject1',
+ url: 'project/1',
+ },
+ {
+ category: 'Projects',
+ id: 2,
+ label: 'MockProject2',
+ url: 'project/2',
+ },
+ ],
+ },
+ {
+ category: 'Groups',
+ data: [
+ {
+ category: 'Groups',
+ id: 1,
+ label: 'MockGroup1',
+ url: 'group/1',
+ },
+ ],
+ },
+ {
+ category: 'Help',
+ data: [
+ {
+ category: 'Help',
+ label: 'GitLab Help',
+ url: 'help/gitlab',
+ },
+ ],
+ },
+];
diff --git a/spec/frontend/header_search/store/actions_spec.js b/spec/frontend/header_search/store/actions_spec.js
index 4530df0d91c..ee2c72df77b 100644
--- a/spec/frontend/header_search/store/actions_spec.js
+++ b/spec/frontend/header_search/store/actions_spec.js
@@ -1,18 +1,50 @@
+import MockAdapter from 'axios-mock-adapter';
import testAction from 'helpers/vuex_action_helper';
+import createFlash from '~/flash';
import * as actions from '~/header_search/store/actions';
import * as types from '~/header_search/store/mutation_types';
import createState from '~/header_search/store/state';
-import { MOCK_SEARCH } from '../mock_data';
+import axios from '~/lib/utils/axios_utils';
+import { MOCK_SEARCH, MOCK_AUTOCOMPLETE_OPTIONS } from '../mock_data';
+
+jest.mock('~/flash');
describe('Header Search Store Actions', () => {
let state;
+ let mock;
+
+ const flashCallback = (callCount) => {
+ expect(createFlash).toHaveBeenCalledTimes(callCount);
+ createFlash.mockClear();
+ };
beforeEach(() => {
state = createState({});
+ mock = new MockAdapter(axios);
});
afterEach(() => {
state = null;
+ mock.restore();
+ });
+
+ describe.each`
+ axiosMock | type | expectedMutations | flashCallCount
+ ${{ method: 'onGet', code: 200, res: MOCK_AUTOCOMPLETE_OPTIONS }} | ${'success'} | ${[{ type: types.REQUEST_AUTOCOMPLETE }, { type: types.RECEIVE_AUTOCOMPLETE_SUCCESS, payload: MOCK_AUTOCOMPLETE_OPTIONS }]} | ${0}
+ ${{ method: 'onGet', code: 500, res: null }} | ${'error'} | ${[{ type: types.REQUEST_AUTOCOMPLETE }, { type: types.RECEIVE_AUTOCOMPLETE_ERROR }]} | ${1}
+ `('fetchAutocompleteOptions', ({ axiosMock, type, expectedMutations, flashCallCount }) => {
+ describe(`on ${type}`, () => {
+ beforeEach(() => {
+ mock[axiosMock.method]().replyOnce(axiosMock.code, axiosMock.res);
+ });
+ it(`should dispatch the correct mutations`, () => {
+ return testAction({
+ action: actions.fetchAutocompleteOptions,
+ state,
+ expectedMutations,
+ }).then(() => flashCallback(flashCallCount));
+ });
+ });
});
describe('setSearch', () => {
diff --git a/spec/frontend/header_search/store/getters_spec.js b/spec/frontend/header_search/store/getters_spec.js
index 2ad0a082f6a..d55db07188e 100644
--- a/spec/frontend/header_search/store/getters_spec.js
+++ b/spec/frontend/header_search/store/getters_spec.js
@@ -5,6 +5,7 @@ import {
MOCK_SEARCH_PATH,
MOCK_ISSUE_PATH,
MOCK_MR_PATH,
+ MOCK_AUTOCOMPLETE_PATH,
MOCK_SEARCH_CONTEXT,
MOCK_DEFAULT_SEARCH_OPTIONS,
MOCK_SCOPED_SEARCH_OPTIONS,
@@ -12,6 +13,8 @@ import {
MOCK_GROUP,
MOCK_ALL_PATH,
MOCK_SEARCH,
+ MOCK_AUTOCOMPLETE_OPTIONS,
+ MOCK_GROUPED_AUTOCOMPLETE_OPTIONS,
} from '../mock_data';
describe('Header Search Store Getters', () => {
@@ -22,6 +25,7 @@ describe('Header Search Store Getters', () => {
searchPath: MOCK_SEARCH_PATH,
issuesPath: MOCK_ISSUE_PATH,
mrPath: MOCK_MR_PATH,
+ autocompletePath: MOCK_AUTOCOMPLETE_PATH,
searchContext: MOCK_SEARCH_CONTEXT,
...initialState,
});
@@ -56,6 +60,29 @@ describe('Header Search Store Getters', () => {
});
describe.each`
+ project | ref | expectedPath
+ ${null} | ${null} | ${`${MOCK_AUTOCOMPLETE_PATH}?term=${MOCK_SEARCH}&project_id=undefined&project_ref=null`}
+ ${MOCK_PROJECT} | ${null} | ${`${MOCK_AUTOCOMPLETE_PATH}?term=${MOCK_SEARCH}&project_id=${MOCK_PROJECT.id}&project_ref=null`}
+ ${MOCK_PROJECT} | ${MOCK_PROJECT.id} | ${`${MOCK_AUTOCOMPLETE_PATH}?term=${MOCK_SEARCH}&project_id=${MOCK_PROJECT.id}&project_ref=${MOCK_PROJECT.id}`}
+ `('autocompleteQuery', ({ project, ref, expectedPath }) => {
+ describe(`when project is ${project?.name} and project ref is ${ref}`, () => {
+ beforeEach(() => {
+ createState({
+ searchContext: {
+ project,
+ ref,
+ },
+ });
+ state.search = MOCK_SEARCH;
+ });
+
+ it(`should return ${expectedPath}`, () => {
+ expect(getters.autocompleteQuery(state)).toBe(expectedPath);
+ });
+ });
+ });
+
+ describe.each`
group | group_metadata | project | project_metadata | expectedPath
${null} | ${null} | ${null} | ${null} | ${MOCK_ISSUE_PATH}
${{ name: 'Test Group' }} | ${{ issues_path: 'group/path' }} | ${null} | ${null} | ${'group/path'}
@@ -208,4 +235,17 @@ describe('Header Search Store Getters', () => {
);
});
});
+
+ describe('autocompleteGroupedSearchOptions', () => {
+ beforeEach(() => {
+ createState();
+ state.autocompleteOptions = MOCK_AUTOCOMPLETE_OPTIONS;
+ });
+
+ it('returns the correct grouped array', () => {
+ expect(getters.autocompleteGroupedSearchOptions(state)).toStrictEqual(
+ MOCK_GROUPED_AUTOCOMPLETE_OPTIONS,
+ );
+ });
+ });
});
diff --git a/spec/frontend/header_search/store/mutations_spec.js b/spec/frontend/header_search/store/mutations_spec.js
index 8196c06099d..7f9b7631a7e 100644
--- a/spec/frontend/header_search/store/mutations_spec.js
+++ b/spec/frontend/header_search/store/mutations_spec.js
@@ -1,7 +1,7 @@
import * as types from '~/header_search/store/mutation_types';
import mutations from '~/header_search/store/mutations';
import createState from '~/header_search/store/state';
-import { MOCK_SEARCH } from '../mock_data';
+import { MOCK_SEARCH, MOCK_AUTOCOMPLETE_OPTIONS } from '../mock_data';
describe('Header Search Store Mutations', () => {
let state;
@@ -10,6 +10,33 @@ describe('Header Search Store Mutations', () => {
state = createState({});
});
+ describe('REQUEST_AUTOCOMPLETE', () => {
+ it('sets loading to true and empties autocompleteOptions array', () => {
+ mutations[types.REQUEST_AUTOCOMPLETE](state);
+
+ expect(state.loading).toBe(true);
+ expect(state.autocompleteOptions).toStrictEqual([]);
+ });
+ });
+
+ describe('RECEIVE_AUTOCOMPLETE_SUCCESS', () => {
+ it('sets loading to false and sets autocompleteOptions array', () => {
+ mutations[types.RECEIVE_AUTOCOMPLETE_SUCCESS](state, MOCK_AUTOCOMPLETE_OPTIONS);
+
+ expect(state.loading).toBe(false);
+ expect(state.autocompleteOptions).toStrictEqual(MOCK_AUTOCOMPLETE_OPTIONS);
+ });
+ });
+
+ describe('RECEIVE_AUTOCOMPLETE_ERROR', () => {
+ it('sets loading to false and empties autocompleteOptions array', () => {
+ mutations[types.RECEIVE_AUTOCOMPLETE_ERROR](state);
+
+ expect(state.loading).toBe(false);
+ expect(state.autocompleteOptions).toStrictEqual([]);
+ });
+ });
+
describe('SET_SEARCH', () => {
it('sets search to value', () => {
mutations[types.SET_SEARCH](state, MOCK_SEARCH);
diff --git a/spec/frontend/ide/components/jobs/detail_spec.js b/spec/frontend/ide/components/jobs/detail_spec.js
index 79ac0a8122a..3634599f328 100644
--- a/spec/frontend/ide/components/jobs/detail_spec.js
+++ b/spec/frontend/ide/components/jobs/detail_spec.js
@@ -41,7 +41,7 @@ describe('IDE jobs detail view', () => {
});
it('scrolls to bottom', () => {
- expect(vm.$refs.buildTrace.scrollTo).toHaveBeenCalled();
+ expect(vm.$refs.buildJobLog.scrollTo).toHaveBeenCalled();
});
it('renders job output', () => {
@@ -125,15 +125,15 @@ describe('IDE jobs detail view', () => {
beforeEach(() => {
vm = vm.$mount();
- jest.spyOn(vm.$refs.buildTrace, 'scrollTo').mockImplementation();
+ jest.spyOn(vm.$refs.buildJobLog, 'scrollTo').mockImplementation();
});
it('scrolls build trace to bottom', () => {
- jest.spyOn(vm.$refs.buildTrace, 'scrollHeight', 'get').mockReturnValue(1000);
+ jest.spyOn(vm.$refs.buildJobLog, 'scrollHeight', 'get').mockReturnValue(1000);
vm.scrollDown();
- expect(vm.$refs.buildTrace.scrollTo).toHaveBeenCalledWith(0, 1000);
+ expect(vm.$refs.buildJobLog.scrollTo).toHaveBeenCalledWith(0, 1000);
});
});
@@ -141,26 +141,26 @@ describe('IDE jobs detail view', () => {
beforeEach(() => {
vm = vm.$mount();
- jest.spyOn(vm.$refs.buildTrace, 'scrollTo').mockImplementation();
+ jest.spyOn(vm.$refs.buildJobLog, 'scrollTo').mockImplementation();
});
it('scrolls build trace to top', () => {
vm.scrollUp();
- expect(vm.$refs.buildTrace.scrollTo).toHaveBeenCalledWith(0, 0);
+ expect(vm.$refs.buildJobLog.scrollTo).toHaveBeenCalledWith(0, 0);
});
});
describe('scrollBuildLog', () => {
beforeEach(() => {
vm = vm.$mount();
- jest.spyOn(vm.$refs.buildTrace, 'scrollTo').mockImplementation();
- jest.spyOn(vm.$refs.buildTrace, 'offsetHeight', 'get').mockReturnValue(100);
- jest.spyOn(vm.$refs.buildTrace, 'scrollHeight', 'get').mockReturnValue(200);
+ jest.spyOn(vm.$refs.buildJobLog, 'scrollTo').mockImplementation();
+ jest.spyOn(vm.$refs.buildJobLog, 'offsetHeight', 'get').mockReturnValue(100);
+ jest.spyOn(vm.$refs.buildJobLog, 'scrollHeight', 'get').mockReturnValue(200);
});
it('sets scrollPos to bottom when at the bottom', () => {
- jest.spyOn(vm.$refs.buildTrace, 'scrollTop', 'get').mockReturnValue(100);
+ jest.spyOn(vm.$refs.buildJobLog, 'scrollTop', 'get').mockReturnValue(100);
vm.scrollBuildLog();
@@ -168,7 +168,7 @@ describe('IDE jobs detail view', () => {
});
it('sets scrollPos to top when at the top', () => {
- jest.spyOn(vm.$refs.buildTrace, 'scrollTop', 'get').mockReturnValue(0);
+ jest.spyOn(vm.$refs.buildJobLog, 'scrollTop', 'get').mockReturnValue(0);
vm.scrollPos = 1;
vm.scrollBuildLog();
@@ -177,7 +177,7 @@ describe('IDE jobs detail view', () => {
});
it('resets scrollPos when not at top or bottom', () => {
- jest.spyOn(vm.$refs.buildTrace, 'scrollTop', 'get').mockReturnValue(10);
+ jest.spyOn(vm.$refs.buildJobLog, 'scrollTop', 'get').mockReturnValue(10);
vm.scrollBuildLog();
diff --git a/spec/frontend/ide/stores/modules/commit/getters_spec.js b/spec/frontend/ide/stores/modules/commit/getters_spec.js
index 7a07ed05201..1e34087b290 100644
--- a/spec/frontend/ide/stores/modules/commit/getters_spec.js
+++ b/spec/frontend/ide/stores/modules/commit/getters_spec.js
@@ -126,7 +126,7 @@ describe('IDE commit module getters', () => {
);
expect(getters.preBuiltCommitMessage(state, null, rootState)).toBe(
- 'Update test-file, index.js files',
+ 'Update test-file, index.js',
);
});
diff --git a/spec/frontend/ide/stores/utils_spec.js b/spec/frontend/ide/stores/utils_spec.js
index 79b6b66319e..a8875e0cd02 100644
--- a/spec/frontend/ide/stores/utils_spec.js
+++ b/spec/frontend/ide/stores/utils_spec.js
@@ -94,7 +94,7 @@ describe('Multi-file store utils', () => {
{
action: commitActionTypes.move,
file_path: 'renamedFile',
- content: null,
+ content: undefined,
encoding: 'text',
last_commit_id: undefined,
previous_path: 'prevPath',
diff --git a/spec/frontend/import_entities/components/pagination_bar_spec.js b/spec/frontend/import_entities/components/pagination_bar_spec.js
new file mode 100644
index 00000000000..163ce11a8db
--- /dev/null
+++ b/spec/frontend/import_entities/components/pagination_bar_spec.js
@@ -0,0 +1,92 @@
+import { GlPagination, GlDropdown, GlDropdownItem } from '@gitlab/ui';
+import { mount } from '@vue/test-utils';
+import PaginationBar from '~/import_entities/components/pagination_bar.vue';
+import PaginationLinks from '~/vue_shared/components/pagination_links.vue';
+
+describe('Pagination bar', () => {
+ const DEFAULT_PROPS = {
+ pageInfo: {
+ total: 50,
+ page: 1,
+ perPage: 20,
+ },
+ itemsCount: 17,
+ };
+ let wrapper;
+
+ const createComponent = (propsData) => {
+ wrapper = mount(PaginationBar, {
+ propsData: {
+ ...DEFAULT_PROPS,
+ ...propsData,
+ },
+ });
+ };
+
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ describe('events', () => {
+ beforeEach(() => {
+ createComponent();
+ });
+
+ it('emits set-page event when page is selected', () => {
+ const NEXT_PAGE = 3;
+ // PaginationLinks uses prop instead of event for handling page change
+ // So we go one level deep to test this
+ wrapper
+ .findComponent(PaginationLinks)
+ .findComponent(GlPagination)
+ .vm.$emit('input', NEXT_PAGE);
+ expect(wrapper.emitted('set-page')).toEqual([[NEXT_PAGE]]);
+ });
+
+ it('emits set-page-size event when page size is selected', () => {
+ const firstItemInPageSizeDropdown = wrapper.findComponent(GlDropdownItem);
+ firstItemInPageSizeDropdown.vm.$emit('click');
+
+ const [emittedPageSizeChange] = wrapper.emitted('set-page-size')[0];
+ expect(firstItemInPageSizeDropdown.text()).toMatchInterpolatedText(
+ `${emittedPageSizeChange} items per page`,
+ );
+ });
+ });
+
+ it('renders current page size', () => {
+ const CURRENT_PAGE_SIZE = 40;
+
+ createComponent({
+ pageInfo: {
+ ...DEFAULT_PROPS.pageInfo,
+ perPage: CURRENT_PAGE_SIZE,
+ },
+ });
+
+ expect(wrapper.find(GlDropdown).find('button').text()).toMatchInterpolatedText(
+ `${CURRENT_PAGE_SIZE} items per page`,
+ );
+ });
+
+ it('renders current page information', () => {
+ createComponent();
+
+ expect(wrapper.find('[data-testid="information"]').text()).toMatchInterpolatedText(
+ 'Showing 1 - 17 of 50',
+ );
+ });
+
+ it('renders current page information when total count is over 1000', () => {
+ createComponent({
+ pageInfo: {
+ ...DEFAULT_PROPS.pageInfo,
+ total: 1200,
+ },
+ });
+
+ expect(wrapper.find('[data-testid="information"]').text()).toMatchInterpolatedText(
+ 'Showing 1 - 17 of 1000+',
+ );
+ });
+});
diff --git a/spec/frontend/integrations/edit/components/integration_form_spec.js b/spec/frontend/integrations/edit/components/integration_form_spec.js
index ff602327592..0a9cbadb249 100644
--- a/spec/frontend/integrations/edit/components/integration_form_spec.js
+++ b/spec/frontend/integrations/edit/components/integration_form_spec.js
@@ -11,7 +11,7 @@ import JiraTriggerFields from '~/integrations/edit/components/jira_trigger_field
import OverrideDropdown from '~/integrations/edit/components/override_dropdown.vue';
import ResetConfirmationModal from '~/integrations/edit/components/reset_confirmation_modal.vue';
import TriggerFields from '~/integrations/edit/components/trigger_fields.vue';
-import { integrationLevels } from '~/integrations/edit/constants';
+import { integrationLevels } from '~/integrations/constants';
import { createStore } from '~/integrations/edit/store';
describe('IntegrationForm', () => {
diff --git a/spec/frontend/integrations/edit/components/jira_issues_fields_spec.js b/spec/frontend/integrations/edit/components/jira_issues_fields_spec.js
index 2860d3cc37a..119afbfecfe 100644
--- a/spec/frontend/integrations/edit/components/jira_issues_fields_spec.js
+++ b/spec/frontend/integrations/edit/components/jira_issues_fields_spec.js
@@ -1,6 +1,7 @@
import { GlFormCheckbox, GlFormInput } from '@gitlab/ui';
import { mountExtended } from 'helpers/vue_test_utils_helper';
+import { GET_JIRA_ISSUE_TYPES_EVENT } from '~/integrations/constants';
import JiraIssuesFields from '~/integrations/edit/components/jira_issues_fields.vue';
import eventHub from '~/integrations/edit/event_hub';
import { createStore } from '~/integrations/edit/store';
@@ -207,7 +208,7 @@ describe('JiraIssuesFields', () => {
await setEnableCheckbox(true);
await findJiraForVulnerabilities().vm.$emit('request-get-issue-types');
- expect(eventHubEmitSpy).toHaveBeenCalledWith('getJiraIssueTypes');
+ expect(eventHubEmitSpy).toHaveBeenCalledWith(GET_JIRA_ISSUE_TYPES_EVENT);
});
});
});
diff --git a/spec/frontend/integrations/edit/components/override_dropdown_spec.js b/spec/frontend/integrations/edit/components/override_dropdown_spec.js
index eb43d940f5e..90facaff1f9 100644
--- a/spec/frontend/integrations/edit/components/override_dropdown_spec.js
+++ b/spec/frontend/integrations/edit/components/override_dropdown_spec.js
@@ -2,7 +2,7 @@ import { GlDropdown, GlLink } from '@gitlab/ui';
import { shallowMount } from '@vue/test-utils';
import OverrideDropdown from '~/integrations/edit/components/override_dropdown.vue';
-import { integrationLevels, overrideDropdownDescriptions } from '~/integrations/edit/constants';
+import { integrationLevels, overrideDropdownDescriptions } from '~/integrations/constants';
import { createStore } from '~/integrations/edit/store';
describe('OverrideDropdown', () => {
diff --git a/spec/frontend/integrations/integration_settings_form_spec.js b/spec/frontend/integrations/integration_settings_form_spec.js
index cbb2ef380ba..f8f3f0fd318 100644
--- a/spec/frontend/integrations/integration_settings_form_spec.js
+++ b/spec/frontend/integrations/integration_settings_form_spec.js
@@ -23,7 +23,7 @@ describe('IntegrationSettingsForm', () => {
it('should initialize form element refs on class object', () => {
// Form Reference
expect(integrationSettingsForm.$form).toBeDefined();
- expect(integrationSettingsForm.$form.prop('nodeName')).toEqual('FORM');
+ expect(integrationSettingsForm.$form.nodeName).toBe('FORM');
expect(integrationSettingsForm.formActive).toBeDefined();
});
@@ -43,14 +43,14 @@ describe('IntegrationSettingsForm', () => {
integrationSettingsForm.formActive = true;
integrationSettingsForm.toggleServiceState();
- expect(integrationSettingsForm.$form.attr('novalidate')).not.toBeDefined();
+ expect(integrationSettingsForm.$form.getAttribute('novalidate')).toBe(null);
});
it('should set `novalidate` attribute to form when called with `false`', () => {
integrationSettingsForm.formActive = false;
integrationSettingsForm.toggleServiceState();
- expect(integrationSettingsForm.$form.attr('novalidate')).toBeDefined();
+ expect(integrationSettingsForm.$form.getAttribute('novalidate')).toBeDefined();
});
});
@@ -67,8 +67,7 @@ describe('IntegrationSettingsForm', () => {
integrationSettingsForm = new IntegrationSettingsForm('.js-integration-settings-form');
integrationSettingsForm.init();
- // eslint-disable-next-line no-jquery/no-serialize
- formData = integrationSettingsForm.$form.serialize();
+ formData = new FormData(integrationSettingsForm.$form);
});
afterEach(() => {
@@ -145,8 +144,7 @@ describe('IntegrationSettingsForm', () => {
integrationSettingsForm = new IntegrationSettingsForm('.js-integration-settings-form');
integrationSettingsForm.init();
- // eslint-disable-next-line no-jquery/no-serialize
- formData = integrationSettingsForm.$form.serialize();
+ formData = new FormData(integrationSettingsForm.$form);
});
afterEach(() => {
diff --git a/spec/frontend/integrations/overrides/components/integration_overrides_spec.js b/spec/frontend/integrations/overrides/components/integration_overrides_spec.js
index dbed236d7df..ae89d05cead 100644
--- a/spec/frontend/integrations/overrides/components/integration_overrides_spec.js
+++ b/spec/frontend/integrations/overrides/components/integration_overrides_spec.js
@@ -1,16 +1,14 @@
-import { GlTable, GlLink, GlPagination } from '@gitlab/ui';
+import { GlTable, GlLink, GlPagination, GlAlert } from '@gitlab/ui';
+import * as Sentry from '@sentry/browser';
import { shallowMount, mount } from '@vue/test-utils';
import MockAdapter from 'axios-mock-adapter';
import waitForPromises from 'helpers/wait_for_promises';
import { DEFAULT_PER_PAGE } from '~/api';
-import createFlash from '~/flash';
import IntegrationOverrides from '~/integrations/overrides/components/integration_overrides.vue';
import axios from '~/lib/utils/axios_utils';
import httpStatus from '~/lib/utils/http_status';
import ProjectAvatar from '~/vue_shared/components/project_avatar.vue';
-jest.mock('~/flash');
-
const mockOverrides = Array(DEFAULT_PER_PAGE * 3)
.fill(1)
.map((_, index) => ({
@@ -62,6 +60,7 @@ describe('IntegrationOverrides', () => {
text: link.text(),
};
});
+ const findAlert = () => wrapper.findComponent(GlAlert);
describe('while loading', () => {
it('sets GlTable `busy` attribute to `true`', () => {
@@ -104,18 +103,26 @@ describe('IntegrationOverrides', () => {
describe('when request fails', () => {
beforeEach(async () => {
+ jest.spyOn(Sentry, 'captureException');
mockAxios.onGet(defaultProps.overridesPath).reply(httpStatus.INTERNAL_SERVER_ERROR);
+
createComponent();
await waitForPromises();
});
- it('calls createFlash', () => {
- expect(createFlash).toHaveBeenCalledTimes(1);
- expect(createFlash).toHaveBeenCalledWith({
- message: IntegrationOverrides.i18n.defaultErrorMessage,
- captureError: true,
- error: expect.any(Error),
- });
+ it('displays error alert', () => {
+ const alert = findAlert();
+ expect(alert.exists()).toBe(true);
+ expect(alert.text()).toBe(IntegrationOverrides.i18n.defaultErrorMessage);
+ });
+
+ it('hides overrides table', () => {
+ const table = findGlTable();
+ expect(table.exists()).toBe(false);
+ });
+
+ it('captures exception in Sentry', () => {
+ expect(Sentry.captureException).toHaveBeenCalledWith(expect.any(Error));
});
});
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 95b1c55b82d..8c3c549a5eb 100644
--- a/spec/frontend/invite_members/components/invite_members_modal_spec.js
+++ b/spec/frontend/invite_members/components/invite_members_modal_spec.js
@@ -242,7 +242,7 @@ describe('InviteMembersModal', () => {
};
const expectedEmailRestrictedError =
- "email 'email@example.com' does not match the allowed domains: example1.org";
+ "The member's email address is not allowed for this project. Go to the Admin area > Sign-up restrictions, and check Allowed domains for sign-ups.";
const expectedSyntaxError = 'email contains an invalid email address';
it('calls the API with the expected focus data when an areas_of_focus checkbox is clicked', () => {
@@ -421,7 +421,7 @@ describe('InviteMembersModal', () => {
await waitForPromises();
expect(membersFormGroupInvalidFeedback()).toBe(
- "root: User email 'admin@example.com' does not match the allowed domain of example2.com",
+ "The member's email address is not allowed for this project. Go to the Admin area > Sign-up restrictions, and check Allowed domains for sign-ups.",
);
expect(findMembersSelect().props('validationState')).toBe(false);
});
diff --git a/spec/frontend/invite_members/mock_data/api_responses.js b/spec/frontend/invite_members/mock_data/api_responses.js
index 79b56a33708..dd84b4fd78f 100644
--- a/spec/frontend/invite_members/mock_data/api_responses.js
+++ b/spec/frontend/invite_members/mock_data/api_responses.js
@@ -9,7 +9,7 @@ const INVITATIONS_API_ERROR_EMAIL_INVALID = {
const INVITATIONS_API_EMAIL_RESTRICTED = {
message: {
'email@example.com':
- "Invite email 'email@example.com' does not match the allowed domains: example1.org",
+ "The member's email address is not allowed for this project. Go to the Admin area > Sign-up restrictions, and check Allowed domains for sign-ups.",
},
status: 'error',
};
@@ -17,9 +17,9 @@ const INVITATIONS_API_EMAIL_RESTRICTED = {
const INVITATIONS_API_MULTIPLE_EMAIL_RESTRICTED = {
message: {
'email@example.com':
- "Invite email email 'email@example.com' does not match the allowed domains: example1.org",
+ "The member's email address is not allowed for this project. Go to the Admin area > Sign-up restrictions, and check Allowed domains for sign-ups.",
'email4@example.com':
- "Invite email email 'email4@example.com' does not match the allowed domains: example1.org",
+ "The member's email address is not allowed for this project. Go to the Admin area > Sign-up restrictions, and check the Domain denylist.",
},
status: 'error',
};
@@ -36,7 +36,11 @@ const MEMBERS_API_MEMBER_ALREADY_EXISTS = {
};
const MEMBERS_API_SINGLE_USER_RESTRICTED = {
- message: { user: ["email 'email@example.com' does not match the allowed domains: example1.org"] },
+ message: {
+ user: [
+ "The member's email address is not allowed for this project. Go to the Admin area > Sign-up restrictions, and check Allowed domains for sign-ups.",
+ ],
+ },
};
const MEMBERS_API_SINGLE_USER_ACCESS_LEVEL = {
@@ -49,7 +53,7 @@ const MEMBERS_API_SINGLE_USER_ACCESS_LEVEL = {
const MEMBERS_API_MULTIPLE_USERS_RESTRICTED = {
message:
- "root: User email 'admin@example.com' does not match the allowed domain of example2.com and user18: User email 'user18@example.org' does not match the allowed domain of example2.com",
+ "root: The member's email address is not allowed for this project. Go to the Admin area > Sign-up restrictions, and check Allowed domains for sign-ups. and user18: The member's email address is not allowed for this project. Go to the Admin area > Sign-up restrictions, and check the Domain denylist. and john_doe31: The member's email address is not allowed for this project. Go to the Admin area > Sign-up restrictions, and check Email restrictions for sign-ups.",
status: 'error',
};
diff --git a/spec/frontend/invite_members/utils/response_message_parser_spec.js b/spec/frontend/invite_members/utils/response_message_parser_spec.js
index 3c88b5a2418..e2cc87c8547 100644
--- a/spec/frontend/invite_members/utils/response_message_parser_spec.js
+++ b/spec/frontend/invite_members/utils/response_message_parser_spec.js
@@ -2,18 +2,20 @@ import {
responseMessageFromSuccess,
responseMessageFromError,
} from '~/invite_members/utils/response_message_parser';
+import { membersApiResponse, invitationsApiResponse } from '../mock_data/api_responses';
describe('Response message parser', () => {
- const expectedMessage = 'expected display message';
+ const expectedMessage = 'expected display and message.';
describe('parse message from successful response', () => {
const exampleKeyedMsg = { 'email@example.com': expectedMessage };
+ const exampleFirstPartMultiple = 'username1: expected display and message.';
const exampleUserMsgMultiple =
- ' and username1: id not found and username2: email is restricted';
+ ' and username2: id not found and restricted email. and username3: email is restricted.';
it.each([
[[{ data: { message: expectedMessage } }]],
- [[{ data: { message: expectedMessage + exampleUserMsgMultiple } }]],
+ [[{ data: { message: exampleFirstPartMultiple + exampleUserMsgMultiple } }]],
[[{ data: { error: expectedMessage } }]],
[[{ data: { message: [expectedMessage] } }]],
[[{ data: { message: exampleKeyedMsg } }]],
@@ -33,4 +35,24 @@ describe('Response message parser', () => {
expect(responseMessageFromError(errorResponse)).toBe(expectedMessage);
});
});
+
+ describe('displaying only the first error when a response has messages for multiple users', () => {
+ const expected =
+ "The member's email address is not allowed for this project. Go to the Admin area > Sign-up restrictions, and check Allowed domains for sign-ups.";
+
+ it.each([
+ [[{ data: membersApiResponse.MULTIPLE_USERS_RESTRICTED }]],
+ [[{ data: invitationsApiResponse.MULTIPLE_EMAIL_RESTRICTED }]],
+ [[{ data: invitationsApiResponse.EMAIL_RESTRICTED }]],
+ ])(`returns "${expectedMessage}" from success response: %j`, (restrictedResponse) => {
+ expect(responseMessageFromSuccess(restrictedResponse)).toBe(expected);
+ });
+
+ it.each([[{ response: { data: membersApiResponse.SINGLE_USER_RESTRICTED } }]])(
+ `returns "${expectedMessage}" from error response: %j`,
+ (singleRestrictedResponse) => {
+ expect(responseMessageFromError(singleRestrictedResponse)).toBe(expected);
+ },
+ );
+ });
});
diff --git a/spec/frontend/issuable/components/csv_export_modal_spec.js b/spec/frontend/issuable/components/csv_export_modal_spec.js
index 34094d22e68..ad4abda6912 100644
--- a/spec/frontend/issuable/components/csv_export_modal_spec.js
+++ b/spec/frontend/issuable/components/csv_export_modal_spec.js
@@ -61,11 +61,6 @@ describe('CsvExportModal', () => {
expect(wrapper.text()).toContain('10 issues selected');
expect(findIcon().exists()).toBe(true);
});
-
- it("doesn't display the info text when issuableCount is -1", () => {
- wrapper = createComponent({ props: { issuableCount: -1 } });
- expect(wrapper.text()).not.toContain('issues selected');
- });
});
describe('email info text', () => {
diff --git a/spec/frontend/issuable/components/csv_import_modal_spec.js b/spec/frontend/issuable/components/csv_import_modal_spec.js
index 0c88b6b1283..307323ef07a 100644
--- a/spec/frontend/issuable/components/csv_import_modal_spec.js
+++ b/spec/frontend/issuable/components/csv_import_modal_spec.js
@@ -17,7 +17,6 @@ describe('CsvImportModal', () => {
...props,
},
provide: {
- issuableType: 'issues',
...injectedProperties,
},
stubs: {
@@ -43,9 +42,9 @@ describe('CsvImportModal', () => {
const findAuthenticityToken = () => new FormData(findForm().element).get('authenticity_token');
describe('template', () => {
- it('displays modal title', () => {
+ it('passes correct title props to modal', () => {
wrapper = createComponent();
- expect(findModal().text()).toContain('Import issues');
+ expect(findModal().props('title')).toContain('Import issues');
});
it('displays a note about the maximum allowed file size', () => {
@@ -73,7 +72,7 @@ describe('CsvImportModal', () => {
});
it('submits the form when the primary action is clicked', () => {
- findPrimaryButton().trigger('click');
+ findModal().vm.$emit('primary');
expect(formSubmitSpy).toHaveBeenCalled();
});
diff --git a/spec/frontend/issuable/related_issues/components/add_issuable_form_spec.js b/spec/frontend/issuable/related_issues/components/add_issuable_form_spec.js
index 173d12757e3..ff6922989cb 100644
--- a/spec/frontend/issuable/related_issues/components/add_issuable_form_spec.js
+++ b/spec/frontend/issuable/related_issues/components/add_issuable_form_spec.js
@@ -1,5 +1,6 @@
import { mount, shallowMount } from '@vue/test-utils';
import AddIssuableForm from '~/related_issues/components/add_issuable_form.vue';
+import IssueToken from '~/related_issues/components/issue_token.vue';
import { issuableTypesMap, linkedIssueTypesMap, PathIdSeparator } from '~/related_issues/constants';
const issuable1 = {
@@ -22,7 +23,7 @@ const issuable2 = {
const pathIdSeparator = PathIdSeparator.Issue;
-const findFormInput = (wrapper) => wrapper.find('.js-add-issuable-form-input').element;
+const findFormInput = (wrapper) => wrapper.find('input').element;
const findRadioInput = (inputs, value) =>
inputs.filter((input) => input.element.value === value)[0];
@@ -105,11 +106,11 @@ describe('AddIssuableForm', () => {
});
it('should put input value in place', () => {
- expect(findFormInput(wrapper).value).toEqual(inputValue);
+ expect(findFormInput(wrapper).value).toBe(inputValue);
});
it('should render pending issuables items', () => {
- expect(wrapper.findAll('.js-add-issuable-form-token-list-item').length).toEqual(2);
+ expect(wrapper.findAllComponents(IssueToken)).toHaveLength(2);
});
it('should not have disabled submit button', () => {
diff --git a/spec/frontend/issuable_form_spec.js b/spec/frontend/issuable_form_spec.js
index bc7a87eb65c..c77fde4261e 100644
--- a/spec/frontend/issuable_form_spec.js
+++ b/spec/frontend/issuable_form_spec.js
@@ -20,16 +20,13 @@ describe('IssuableForm', () => {
describe('removeWip', () => {
it.each`
prefix
- ${'drAft '}
${'draFT: '}
${' [DRaft] '}
${'drAft:'}
${'[draFT]'}
- ${' dRaFt - '}
- ${'dRaFt - '}
${'(draft) '}
${' (DrafT)'}
- ${'draft draft - draft: [draft] (draft)'}
+ ${'draft: [draft] (draft)'}
`('removes "$prefix" from the beginning of the title', ({ prefix }) => {
instance.titleField.val(`${prefix}The Issuable's Title Value`);
@@ -48,4 +45,18 @@ describe('IssuableForm', () => {
expect(instance.titleField.val()).toBe("Draft: The Issuable's Title Value");
});
});
+
+ describe('workInProgress', () => {
+ it.each`
+ title | expected
+ ${'draFT: something is happening'} | ${true}
+ ${'draft something is happening'} | ${false}
+ ${'something is happening to drafts'} | ${false}
+ ${'something is happening'} | ${false}
+ `('returns $expected with "$title"', ({ title, expected }) => {
+ instance.titleField.val(title);
+
+ expect(instance.workInProgress()).toBe(expected);
+ });
+ });
});
diff --git a/spec/frontend/issuable_list/components/issuable_item_spec.js b/spec/frontend/issuable_list/components/issuable_item_spec.js
index ea36d59ff83..ac3bf7f3269 100644
--- a/spec/frontend/issuable_list/components/issuable_item_spec.js
+++ b/spec/frontend/issuable_list/components/issuable_item_spec.js
@@ -1,4 +1,4 @@
-import { GlLink, GlLabel, GlIcon, GlFormCheckbox } from '@gitlab/ui';
+import { GlLink, GlLabel, GlIcon, GlFormCheckbox, GlSprintf } from '@gitlab/ui';
import { shallowMount } from '@vue/test-utils';
import { useFakeDate } from 'helpers/fake_date';
import IssuableItem from '~/issuable_list/components/issuable_item.vue';
@@ -16,6 +16,9 @@ const createComponent = ({ issuableSymbol = '#', issuable = mockIssuable, slots
showCheckbox: false,
},
slots,
+ stubs: {
+ GlSprintf,
+ },
});
const MOCK_GITLAB_URL = 'http://0.0.0.0:3000';
@@ -135,13 +138,6 @@ describe('IssuableItem', () => {
});
});
- describe('createdAt', () => {
- it('returns string containing timeago string based on `issuable.createdAt`', () => {
- expect(wrapper.vm.createdAt).toContain('created');
- expect(wrapper.vm.createdAt).toContain('ago');
- });
- });
-
describe('updatedAt', () => {
it('returns string containing timeago string based on `issuable.updatedAt`', () => {
expect(wrapper.vm.updatedAt).toContain('updated');
@@ -449,8 +445,7 @@ describe('IssuableItem', () => {
it('renders issuable updatedAt info', () => {
const updatedAtEl = wrapper.find('[data-testid="issuable-updated-at"]');
- expect(updatedAtEl.exists()).toBe(true);
- expect(updatedAtEl.find('span').attributes('title')).toBe('Sep 10, 2020 11:41am UTC');
+ expect(updatedAtEl.attributes('title')).toBe('Sep 10, 2020 11:41am UTC');
expect(updatedAtEl.text()).toBe(wrapper.vm.updatedAt);
});
diff --git a/spec/frontend/issuable_suggestions/components/item_spec.js b/spec/frontend/issuable_suggestions/components/item_spec.js
index 39083b3d8fb..45f96103e3e 100644
--- a/spec/frontend/issuable_suggestions/components/item_spec.js
+++ b/spec/frontend/issuable_suggestions/components/item_spec.js
@@ -6,10 +6,10 @@ import UserAvatarImage from '~/vue_shared/components/user_avatar/user_avatar_ima
import mockData from '../mock_data';
describe('Issuable suggestions suggestion component', () => {
- let vm;
+ let wrapper;
function createComponent(suggestion = {}) {
- vm = shallowMount(Suggestion, {
+ wrapper = shallowMount(Suggestion, {
propsData: {
suggestion: {
...mockData(),
@@ -19,37 +19,40 @@ describe('Issuable suggestions suggestion component', () => {
});
}
+ const findLink = () => wrapper.findComponent(GlLink);
+ const findAuthorLink = () => wrapper.findAll(GlLink).at(1);
+ const findIcon = () => wrapper.findComponent(GlIcon);
+ const findTooltip = () => wrapper.findComponent(GlTooltip);
+ const findUserAvatar = () => wrapper.findComponent(UserAvatarImage);
+
afterEach(() => {
- vm.destroy();
+ wrapper.destroy();
});
it('renders title', () => {
createComponent();
- expect(vm.text()).toContain('Test issue');
+ expect(wrapper.text()).toContain('Test issue');
});
it('renders issue link', () => {
createComponent();
- const link = vm.find(GlLink);
-
- expect(link.attributes('href')).toBe(`${TEST_HOST}/test/issue/1`);
+ expect(findLink().attributes('href')).toBe(`${TEST_HOST}/test/issue/1`);
});
it('renders IID', () => {
createComponent();
- expect(vm.text()).toContain('#1');
+ expect(wrapper.text()).toContain('#1');
});
describe('opened state', () => {
it('renders icon', () => {
createComponent();
- const icon = vm.find(GlIcon);
-
- expect(icon.props('name')).toBe('issue-open-m');
+ expect(findIcon().props('name')).toBe('issue-open-m');
+ expect(findIcon().attributes('class')).toMatch('gl-text-green-500');
});
it('renders created timeago', () => {
@@ -57,10 +60,8 @@ describe('Issuable suggestions suggestion component', () => {
closedAt: '',
});
- const tooltip = vm.find(GlTooltip);
-
- expect(tooltip.find('.d-block').text()).toContain('Opened');
- expect(tooltip.text()).toContain('3 days ago');
+ expect(findTooltip().text()).toContain('Opened');
+ expect(findTooltip().text()).toContain('3 days ago');
});
});
@@ -70,18 +71,15 @@ describe('Issuable suggestions suggestion component', () => {
state: 'closed',
});
- const icon = vm.find(GlIcon);
-
- expect(icon.props('name')).toBe('issue-close');
+ expect(findIcon().props('name')).toBe('issue-close');
+ expect(findIcon().attributes('class')).toMatch('gl-text-blue-500');
});
it('renders closed timeago', () => {
createComponent();
- const tooltip = vm.find(GlTooltip);
-
- expect(tooltip.find('.d-block').text()).toContain('Opened');
- expect(tooltip.text()).toContain('1 day ago');
+ expect(findTooltip().text()).toContain('Opened');
+ expect(findTooltip().text()).toContain('1 day ago');
});
});
@@ -89,18 +87,14 @@ describe('Issuable suggestions suggestion component', () => {
it('renders author info', () => {
createComponent();
- const link = vm.findAll(GlLink).at(1);
-
- expect(link.text()).toContain('Author Name');
- expect(link.text()).toContain('@author.username');
+ expect(findAuthorLink().text()).toContain('Author Name');
+ expect(findAuthorLink().text()).toContain('@author.username');
});
it('renders author image', () => {
createComponent();
- const image = vm.find(UserAvatarImage);
-
- expect(image.props('imgSrc')).toBe(`${TEST_HOST}/avatar`);
+ expect(findUserAvatar().props('imgSrc')).toBe(`${TEST_HOST}/avatar`);
});
});
@@ -108,7 +102,7 @@ describe('Issuable suggestions suggestion component', () => {
it('renders upvotes count', () => {
createComponent();
- const count = vm.findAll('.suggestion-counts span').at(0);
+ const count = wrapper.findAll('.suggestion-counts span').at(0);
expect(count.text()).toContain('1');
expect(count.find(GlIcon).props('name')).toBe('thumb-up');
@@ -117,7 +111,7 @@ describe('Issuable suggestions suggestion component', () => {
it('renders notes count', () => {
createComponent();
- const count = vm.findAll('.suggestion-counts span').at(1);
+ const count = wrapper.findAll('.suggestion-counts span').at(1);
expect(count.text()).toContain('2');
expect(count.find(GlIcon).props('name')).toBe('comment');
@@ -130,10 +124,9 @@ describe('Issuable suggestions suggestion component', () => {
confidential: true,
});
- const icon = vm.find(GlIcon);
-
- expect(icon.props('name')).toBe('eye-slash');
- expect(icon.attributes('title')).toBe('Confidential');
+ expect(findIcon().props('name')).toBe('eye-slash');
+ expect(findIcon().attributes('class')).toMatch('gl-text-orange-500');
+ expect(findIcon().attributes('title')).toBe('Confidential');
});
});
});
diff --git a/spec/frontend/issues_list/components/issues_list_app_spec.js b/spec/frontend/issues_list/components/issues_list_app_spec.js
index 8d79a5eed35..6b443062f12 100644
--- a/spec/frontend/issues_list/components/issues_list_app_spec.js
+++ b/spec/frontend/issues_list/components/issues_list_app_spec.js
@@ -24,6 +24,7 @@ import IssuableByEmail from '~/issuable/components/issuable_by_email.vue';
import IssuableList from '~/issuable_list/components/issuable_list_root.vue';
import { IssuableListTabs, IssuableStates } from '~/issuable_list/constants';
import IssuesListApp from '~/issues_list/components/issues_list_app.vue';
+import NewIssueDropdown from '~/issues_list/components/new_issue_dropdown.vue';
import {
CREATED_DESC,
DUE_DATE_OVERDUE,
@@ -65,6 +66,7 @@ describe('IssuesListApp component', () => {
exportCsvPath: 'export/csv/path',
fullPath: 'path/to/project',
hasAnyIssues: true,
+ hasAnyProjects: true,
hasBlockedIssuesFeature: true,
hasIssueWeightsFeature: true,
hasIterationsFeature: true,
@@ -93,6 +95,7 @@ describe('IssuesListApp component', () => {
const findGlEmptyState = () => wrapper.findComponent(GlEmptyState);
const findGlLink = () => wrapper.findComponent(GlLink);
const findIssuableList = () => wrapper.findComponent(IssuableList);
+ const findNewIssueDropdown = () => wrapper.findComponent(NewIssueDropdown);
const mountComponent = ({
provide = {},
@@ -190,10 +193,7 @@ describe('IssuesListApp component', () => {
beforeEach(() => {
setWindowLocation(search);
- wrapper = mountComponent({
- provide: { isSignedIn: true },
- mountFn: mount,
- });
+ wrapper = mountComponent({ provide: { isSignedIn: true }, mountFn: mount });
jest.runOnlyPendingTimers();
});
@@ -208,7 +208,7 @@ describe('IssuesListApp component', () => {
describe('when user is not signed in', () => {
it('does not render', () => {
- wrapper = mountComponent({ provide: { isSignedIn: false } });
+ wrapper = mountComponent({ provide: { isSignedIn: false }, mountFn: mount });
expect(findCsvImportExportButtons().exists()).toBe(false);
});
@@ -216,7 +216,7 @@ describe('IssuesListApp component', () => {
describe('when in a group context', () => {
it('does not render', () => {
- wrapper = mountComponent({ provide: { isProject: false } });
+ wrapper = mountComponent({ provide: { isProject: false }, mountFn: mount });
expect(findCsvImportExportButtons().exists()).toBe(false);
});
@@ -231,7 +231,7 @@ describe('IssuesListApp component', () => {
});
it('does not render when user does not have permissions', () => {
- wrapper = mountComponent({ provide: { canBulkUpdate: false } });
+ wrapper = mountComponent({ provide: { canBulkUpdate: false }, mountFn: mount });
expect(findGlButtons().filter((button) => button.text() === 'Edit issues')).toHaveLength(0);
});
@@ -258,11 +258,25 @@ describe('IssuesListApp component', () => {
});
it('does not render when user does not have permissions', () => {
- wrapper = mountComponent({ provide: { showNewIssueLink: false } });
+ wrapper = mountComponent({ provide: { showNewIssueLink: false }, mountFn: mount });
expect(findGlButtons().filter((button) => button.text() === 'New issue')).toHaveLength(0);
});
});
+
+ describe('new issue split dropdown', () => {
+ it('does not render in a project context', () => {
+ wrapper = mountComponent({ provide: { isProject: true }, mountFn: mount });
+
+ expect(findNewIssueDropdown().exists()).toBe(false);
+ });
+
+ it('renders in a group context', () => {
+ wrapper = mountComponent({ provide: { isProject: false }, mountFn: mount });
+
+ expect(findNewIssueDropdown().exists()).toBe(true);
+ });
+ });
});
describe('initial url params', () => {
@@ -506,7 +520,7 @@ describe('IssuesListApp component', () => {
beforeEach(() => {
wrapper = mountComponent({
provide: {
- groupEpicsPath: '',
+ groupPath: '',
},
});
});
@@ -522,7 +536,7 @@ describe('IssuesListApp component', () => {
beforeEach(() => {
wrapper = mountComponent({
provide: {
- groupEpicsPath: '',
+ groupPath: '',
},
});
});
@@ -550,7 +564,7 @@ describe('IssuesListApp component', () => {
provide: {
isSignedIn: true,
projectIterationsPath: 'project/iterations/path',
- groupEpicsPath: 'group/epics/path',
+ groupPath: 'group/path',
hasIssueWeightsFeature: true,
},
});
diff --git a/spec/frontend/issues_list/components/new_issue_dropdown_spec.js b/spec/frontend/issues_list/components/new_issue_dropdown_spec.js
new file mode 100644
index 00000000000..1fcaa99cf5a
--- /dev/null
+++ b/spec/frontend/issues_list/components/new_issue_dropdown_spec.js
@@ -0,0 +1,131 @@
+import { GlDropdown, GlDropdownItem, GlSearchBoxByType } from '@gitlab/ui';
+import { createLocalVue, mount, shallowMount } from '@vue/test-utils';
+import VueApollo from 'vue-apollo';
+import createMockApollo from 'helpers/mock_apollo_helper';
+import NewIssueDropdown from '~/issues_list/components/new_issue_dropdown.vue';
+import searchProjectsQuery from '~/issues_list/queries/search_projects.query.graphql';
+import { DASH_SCOPE, joinPaths } from '~/lib/utils/url_utility';
+import {
+ emptySearchProjectsQueryResponse,
+ project1,
+ project2,
+ searchProjectsQueryResponse,
+} from '../mock_data';
+
+describe('NewIssueDropdown component', () => {
+ let wrapper;
+
+ const localVue = createLocalVue();
+ localVue.use(VueApollo);
+
+ const mountComponent = ({
+ search = '',
+ queryResponse = searchProjectsQueryResponse,
+ mountFn = shallowMount,
+ } = {}) => {
+ const requestHandlers = [[searchProjectsQuery, jest.fn().mockResolvedValue(queryResponse)]];
+ const apolloProvider = createMockApollo(requestHandlers);
+
+ return mountFn(NewIssueDropdown, {
+ localVue,
+ apolloProvider,
+ provide: {
+ fullPath: 'mushroom-kingdom',
+ },
+ data() {
+ return { search };
+ },
+ });
+ };
+
+ const findDropdown = () => wrapper.findComponent(GlDropdown);
+ const findInput = () => wrapper.findComponent(GlSearchBoxByType);
+ const showDropdown = async () => {
+ findDropdown().vm.$emit('shown');
+ await wrapper.vm.$apollo.queries.projects.refetch();
+ jest.runOnlyPendingTimers();
+ };
+
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ it('renders a split dropdown', () => {
+ wrapper = mountComponent();
+
+ expect(findDropdown().props('split')).toBe(true);
+ });
+
+ it('renders a label for the dropdown toggle button', () => {
+ wrapper = mountComponent();
+
+ expect(findDropdown().attributes('toggle-text')).toBe(NewIssueDropdown.i18n.toggleButtonLabel);
+ });
+
+ it('focuses on input when dropdown is shown', async () => {
+ wrapper = mountComponent({ mountFn: mount });
+
+ const inputSpy = jest.spyOn(findInput().vm, 'focusInput');
+
+ await showDropdown();
+
+ expect(inputSpy).toHaveBeenCalledTimes(1);
+ });
+
+ it('renders expected dropdown items', async () => {
+ wrapper = mountComponent({ mountFn: mount });
+
+ await showDropdown();
+
+ const listItems = wrapper.findAll('li');
+
+ expect(listItems.at(0).text()).toBe(project1.nameWithNamespace);
+ expect(listItems.at(1).text()).toBe(project2.nameWithNamespace);
+ });
+
+ it('renders `No matches found` when there are no matches', async () => {
+ wrapper = mountComponent({
+ search: 'no matches',
+ queryResponse: emptySearchProjectsQueryResponse,
+ mountFn: mount,
+ });
+
+ await showDropdown();
+
+ expect(wrapper.find('li').text()).toBe(NewIssueDropdown.i18n.noMatchesFound);
+ });
+
+ describe('when no project is selected', () => {
+ beforeEach(() => {
+ wrapper = mountComponent();
+ });
+
+ it('dropdown button is not a link', () => {
+ expect(findDropdown().attributes('split-href')).toBeUndefined();
+ });
+
+ it('displays default text on the dropdown button', () => {
+ expect(findDropdown().props('text')).toBe(NewIssueDropdown.i18n.defaultDropdownText);
+ });
+ });
+
+ describe('when a project is selected', () => {
+ beforeEach(async () => {
+ wrapper = mountComponent({ mountFn: mount });
+
+ await showDropdown();
+
+ wrapper.findComponent(GlDropdownItem).vm.$emit('click', project1);
+ });
+
+ it('dropdown button is a link', () => {
+ const href = joinPaths(project1.webUrl, DASH_SCOPE, 'issues/new');
+
+ expect(findDropdown().attributes('split-href')).toBe(href);
+ });
+
+ it('displays project name on the dropdown button', () => {
+ expect(findDropdown().props('text')).toBe(`New issue in ${project1.name}`);
+ });
+ });
+});
diff --git a/spec/frontend/issues_list/mock_data.js b/spec/frontend/issues_list/mock_data.js
index 720f9cac986..3be256d8094 100644
--- a/spec/frontend/issues_list/mock_data.js
+++ b/spec/frontend/issues_list/mock_data.js
@@ -221,3 +221,37 @@ export const urlParamsWithSpecialValues = {
epic_id: 'None',
weight: 'None',
};
+
+export const project1 = {
+ id: 'gid://gitlab/Group/26',
+ name: 'Super Mario Project',
+ nameWithNamespace: 'Mushroom Kingdom / Super Mario Project',
+ webUrl: 'https://127.0.0.1:3000/mushroom-kingdom/super-mario-project',
+};
+
+export const project2 = {
+ id: 'gid://gitlab/Group/59',
+ name: 'Mario Kart Project',
+ nameWithNamespace: 'Mushroom Kingdom / Mario Kart Project',
+ webUrl: 'https://127.0.0.1:3000/mushroom-kingdom/mario-kart-project',
+};
+
+export const searchProjectsQueryResponse = {
+ data: {
+ group: {
+ projects: {
+ nodes: [project1, project2],
+ },
+ },
+ },
+};
+
+export const emptySearchProjectsQueryResponse = {
+ data: {
+ group: {
+ projects: {
+ nodes: [],
+ },
+ },
+ },
+};
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 891ba9c223c..9f5b772a5c7 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
@@ -127,21 +127,7 @@ exports[`JiraImportForm table body shows correct information in each cell 1`] =
>
<!---->
- <div
- class="gl-display-flex gl-flex-direction-row gl-justify-content-space-between gl-align-items-center gl-px-5"
- >
- <div
- class="gl-display-flex"
- >
- <!---->
- </div>
-
- <div
- class="gl-display-flex"
- >
- <!---->
- </div>
- </div>
+ <!---->
<div
class="gl-new-dropdown-contents"
@@ -272,21 +258,7 @@ exports[`JiraImportForm table body shows correct information in each cell 1`] =
>
<!---->
- <div
- class="gl-display-flex gl-flex-direction-row gl-justify-content-space-between gl-align-items-center gl-px-5"
- >
- <div
- class="gl-display-flex"
- >
- <!---->
- </div>
-
- <div
- class="gl-display-flex"
- >
- <!---->
- </div>
- </div>
+ <!---->
<div
class="gl-new-dropdown-contents"
diff --git a/spec/frontend/jobs/components/job_app_spec.js b/spec/frontend/jobs/components/job_app_spec.js
index f8a0059bf21..07e6ee46c41 100644
--- a/spec/frontend/jobs/components/job_app_spec.js
+++ b/spec/frontend/jobs/components/job_app_spec.js
@@ -2,7 +2,7 @@ import { GlLoadingIcon } from '@gitlab/ui';
import { mount, createLocalVue } from '@vue/test-utils';
import MockAdapter from 'axios-mock-adapter';
import Vuex from 'vuex';
-import { getJSONFixture } from 'helpers/fixtures';
+import delayedJobFixture from 'test_fixtures/jobs/delayed.json';
import { TEST_HOST } from 'helpers/test_constants';
import EmptyState from '~/jobs/components/empty_state.vue';
import EnvironmentsBlock from '~/jobs/components/environments_block.vue';
@@ -19,8 +19,6 @@ describe('Job App', () => {
const localVue = createLocalVue();
localVue.use(Vuex);
- const delayedJobFixture = getJSONFixture('jobs/delayed.json');
-
let store;
let wrapper;
let mock;
@@ -47,9 +45,9 @@ describe('Job App', () => {
wrapper = mount(JobApp, { propsData: { ...props }, store });
};
- const setupAndMount = ({ jobData = {}, traceData = {} } = {}) => {
+ const setupAndMount = ({ jobData = {}, jobLogData = {} } = {}) => {
mock.onGet(initSettings.endpoint).replyOnce(200, { ...job, ...jobData });
- mock.onGet(`${initSettings.pagePath}/trace.json`).reply(200, traceData);
+ mock.onGet(`${initSettings.pagePath}/trace.json`).reply(200, jobLogData);
const asyncInit = store.dispatch('init', initSettings);
@@ -77,11 +75,10 @@ describe('Job App', () => {
const findEmptyState = () => wrapper.find(EmptyState);
const findJobNewIssueLink = () => wrapper.find('[data-testid="job-new-issue"]');
const findJobEmptyStateTitle = () => wrapper.find('[data-testid="job-empty-state-title"]');
- const findJobTraceScrollTop = () => wrapper.find('[data-testid="job-controller-scroll-top"]');
- const findJobTraceScrollBottom = () =>
- wrapper.find('[data-testid="job-controller-scroll-bottom"]');
- const findJobTraceController = () => wrapper.find('[data-testid="job-raw-link-controller"]');
- const findJobTraceEraseLink = () => wrapper.find('[data-testid="job-log-erase-link"]');
+ const findJobLogScrollTop = () => wrapper.find('[data-testid="job-controller-scroll-top"]');
+ const findJobLogScrollBottom = () => wrapper.find('[data-testid="job-controller-scroll-bottom"]');
+ const findJobLogController = () => wrapper.find('[data-testid="job-raw-link-controller"]');
+ const findJobLogEraseLink = () => wrapper.find('[data-testid="job-log-erase-link"]');
beforeEach(() => {
mock = new MockAdapter(axios);
@@ -315,7 +312,7 @@ describe('Job App', () => {
});
describe('empty states block', () => {
- it('renders empty state when job does not have trace and is not running', () =>
+ it('renders empty state when job does not have log and is not running', () =>
setupAndMount({
jobData: {
has_trace: false,
@@ -342,7 +339,7 @@ describe('Job App', () => {
expect(findEmptyState().exists()).toBe(true);
}));
- it('does not render empty state when job does not have trace but it is running', () =>
+ it('does not render empty state when job does not have log but it is running', () =>
setupAndMount({
jobData: {
has_trace: false,
@@ -358,7 +355,7 @@ describe('Job App', () => {
expect(findEmptyState().exists()).toBe(false);
}));
- it('does not render empty state when job has trace but it is not running', () =>
+ it('does not render empty state when job has log but it is not running', () =>
setupAndMount({ jobData: { has_trace: true } }).then(() => {
expect(findEmptyState().exists()).toBe(false);
}));
@@ -424,10 +421,10 @@ describe('Job App', () => {
});
});
- describe('trace controls', () => {
+ describe('job log controls', () => {
beforeEach(() =>
setupAndMount({
- traceData: {
+ jobLogData: {
html: '<span>Update</span>',
status: 'success',
append: false,
@@ -439,16 +436,16 @@ describe('Job App', () => {
);
it('should render scroll buttons', () => {
- expect(findJobTraceScrollTop().exists()).toBe(true);
- expect(findJobTraceScrollBottom().exists()).toBe(true);
+ expect(findJobLogScrollTop().exists()).toBe(true);
+ expect(findJobLogScrollBottom().exists()).toBe(true);
});
it('should render link to raw ouput', () => {
- expect(findJobTraceController().exists()).toBe(true);
+ expect(findJobLogController().exists()).toBe(true);
});
it('should render link to erase job', () => {
- expect(findJobTraceEraseLink().exists()).toBe(true);
+ expect(findJobLogEraseLink().exists()).toBe(true);
});
});
});
diff --git a/spec/frontend/jobs/components/job_container_item_spec.js b/spec/frontend/jobs/components/job_container_item_spec.js
index 36038b69e64..6b488821bc1 100644
--- a/spec/frontend/jobs/components/job_container_item_spec.js
+++ b/spec/frontend/jobs/components/job_container_item_spec.js
@@ -1,12 +1,12 @@
import { GlIcon, GlLink } from '@gitlab/ui';
import { shallowMount } from '@vue/test-utils';
+import delayedJobFixture from 'test_fixtures/jobs/delayed.json';
import JobContainerItem from '~/jobs/components/job_container_item.vue';
import CiIcon from '~/vue_shared/components/ci_icon.vue';
import job from '../mock_data';
describe('JobContainerItem', () => {
let wrapper;
- const delayedJobFixture = getJSONFixture('jobs/delayed.json');
const findCiIconComponent = () => wrapper.findComponent(CiIcon);
const findGlIconComponent = () => wrapper.findComponent(GlIcon);
diff --git a/spec/frontend/jobs/components/job_log_controllers_spec.js b/spec/frontend/jobs/components/job_log_controllers_spec.js
index 97b0333cb32..0ba07522243 100644
--- a/spec/frontend/jobs/components/job_log_controllers_spec.js
+++ b/spec/frontend/jobs/components/job_log_controllers_spec.js
@@ -18,7 +18,7 @@ describe('Job log controllers', () => {
isScrollTopDisabled: false,
isScrollBottomDisabled: false,
isScrollingDown: true,
- isTraceSizeVisible: true,
+ isJobLogSizeVisible: true,
};
const createWrapper = (props) => {
@@ -38,7 +38,7 @@ describe('Job log controllers', () => {
const findScrollBottom = () => wrapper.find('[data-testid="job-controller-scroll-bottom"]');
describe('Truncate information', () => {
- describe('with isTraceSizeVisible', () => {
+ describe('with isJobLogSizeVisible', () => {
beforeEach(() => {
createWrapper();
});
@@ -47,31 +47,31 @@ describe('Job log controllers', () => {
expect(findTruncatedInfo().text()).toMatch('499.95 KiB');
});
- it('renders link to raw trace', () => {
+ it('renders link to raw job log', () => {
expect(findRawLink().attributes('href')).toBe(defaultProps.rawPath);
});
});
});
describe('links section', () => {
- describe('with raw trace path', () => {
+ describe('with raw job log path', () => {
beforeEach(() => {
createWrapper();
});
- it('renders raw trace link', () => {
+ it('renders raw job log link', () => {
expect(findRawLinkController().attributes('href')).toBe(defaultProps.rawPath);
});
});
- describe('without raw trace path', () => {
+ describe('without raw job log path', () => {
beforeEach(() => {
createWrapper({
rawPath: null,
});
});
- it('does not render raw trace link', () => {
+ it('does not render raw job log link', () => {
expect(findRawLinkController().exists()).toBe(false);
});
});
diff --git a/spec/frontend/jobs/components/log/collapsible_section_spec.js b/spec/frontend/jobs/components/log/collapsible_section_spec.js
index 4e23a3ba7b8..96bdf03796b 100644
--- a/spec/frontend/jobs/components/log/collapsible_section_spec.js
+++ b/spec/frontend/jobs/components/log/collapsible_section_spec.js
@@ -6,7 +6,7 @@ describe('Job Log Collapsible Section', () => {
let wrapper;
let origGon;
- const traceEndpoint = 'jobs/335';
+ const jobLogEndpoint = 'jobs/335';
const findCollapsibleLine = () => wrapper.find('.collapsible-line');
const findCollapsibleLineSvg = () => wrapper.find('.collapsible-line svg');
@@ -35,7 +35,7 @@ describe('Job Log Collapsible Section', () => {
beforeEach(() => {
createComponent({
section: collapsibleSectionClosed,
- traceEndpoint,
+ jobLogEndpoint,
});
});
@@ -52,7 +52,7 @@ describe('Job Log Collapsible Section', () => {
beforeEach(() => {
createComponent({
section: collapsibleSectionOpened,
- traceEndpoint,
+ jobLogEndpoint,
});
});
@@ -72,7 +72,7 @@ describe('Job Log Collapsible Section', () => {
it('emits onClickCollapsibleLine on click', () => {
createComponent({
section: collapsibleSectionOpened,
- traceEndpoint,
+ jobLogEndpoint,
});
findCollapsibleLine().trigger('click');
diff --git a/spec/frontend/jobs/components/log/log_spec.js b/spec/frontend/jobs/components/log/log_spec.js
index 99fb6846ce5..9a5522ab4cd 100644
--- a/spec/frontend/jobs/components/log/log_spec.js
+++ b/spec/frontend/jobs/components/log/log_spec.js
@@ -31,8 +31,8 @@ describe('Job Log', () => {
window.gon = { features: { infinitelyCollapsibleSections: false } };
state = {
- trace: logLinesParserLegacy(jobLog),
- traceEndpoint: 'jobs/id',
+ jobLog: logLinesParserLegacy(jobLog),
+ jobLogEndpoint: 'jobs/id',
};
store = new Vuex.Store({
@@ -59,7 +59,7 @@ describe('Job Log', () => {
});
it('links to the provided path and correct line number', () => {
- expect(wrapper.find('#L1').attributes('href')).toBe(`${state.traceEndpoint}#L1`);
+ expect(wrapper.find('#L1').attributes('href')).toBe(`${state.jobLogEndpoint}#L1`);
});
});
@@ -111,8 +111,8 @@ describe('Job Log, infinitelyCollapsibleSections feature flag enabled', () => {
window.gon = { features: { infinitelyCollapsibleSections: true } };
state = {
- trace: logLinesParser(jobLog).parsedLines,
- traceEndpoint: 'jobs/id',
+ jobLog: logLinesParser(jobLog).parsedLines,
+ jobLogEndpoint: 'jobs/id',
};
store = new Vuex.Store({
@@ -139,7 +139,7 @@ describe('Job Log, infinitelyCollapsibleSections feature flag enabled', () => {
});
it('links to the provided path and correct line number', () => {
- expect(wrapper.find('#L1').attributes('href')).toBe(`${state.traceEndpoint}#L1`);
+ expect(wrapper.find('#L1').attributes('href')).toBe(`${state.jobLogEndpoint}#L1`);
});
});
diff --git a/spec/frontend/jobs/mixins/delayed_job_mixin_spec.js b/spec/frontend/jobs/mixins/delayed_job_mixin_spec.js
index 838323df755..63dcd72f967 100644
--- a/spec/frontend/jobs/mixins/delayed_job_mixin_spec.js
+++ b/spec/frontend/jobs/mixins/delayed_job_mixin_spec.js
@@ -1,9 +1,9 @@
import { shallowMount } from '@vue/test-utils';
+import delayedJobFixture from 'test_fixtures/jobs/delayed.json';
import delayedJobMixin from '~/jobs/mixins/delayed_job_mixin';
describe('DelayedJobMixin', () => {
let wrapper;
- const delayedJobFixture = getJSONFixture('jobs/delayed.json');
const dummyComponent = {
props: {
job: {
diff --git a/spec/frontend/jobs/store/actions_spec.js b/spec/frontend/jobs/store/actions_spec.js
index a29bd15099f..16448d6a3ca 100644
--- a/spec/frontend/jobs/store/actions_spec.js
+++ b/spec/frontend/jobs/store/actions_spec.js
@@ -3,7 +3,7 @@ import { TEST_HOST } from 'helpers/test_constants';
import testAction from 'helpers/vuex_action_helper';
import {
setJobEndpoint,
- setTraceOptions,
+ setJobLogOptions,
clearEtagPoll,
stopPolling,
requestJob,
@@ -12,12 +12,12 @@ import {
receiveJobError,
scrollTop,
scrollBottom,
- requestTrace,
- fetchTrace,
- startPollingTrace,
- stopPollingTrace,
- receiveTraceSuccess,
- receiveTraceError,
+ requestJobLog,
+ fetchJobLog,
+ startPollingJobLog,
+ stopPollingJobLog,
+ receiveJobLogSuccess,
+ receiveJobLogError,
toggleCollapsibleLine,
requestJobsForStage,
fetchJobsForStage,
@@ -51,13 +51,13 @@ describe('Job State actions', () => {
});
});
- describe('setTraceOptions', () => {
- it('should commit SET_TRACE_OPTIONS mutation', (done) => {
+ describe('setJobLogOptions', () => {
+ it('should commit SET_JOB_LOG_OPTIONS mutation', (done) => {
testAction(
- setTraceOptions,
+ setJobLogOptions,
{ pagePath: 'job/872324/trace.json' },
mockedState,
- [{ type: types.SET_TRACE_OPTIONS, payload: { pagePath: 'job/872324/trace.json' } }],
+ [{ type: types.SET_JOB_LOG_OPTIONS, payload: { pagePath: 'job/872324/trace.json' } }],
[],
done,
);
@@ -191,17 +191,17 @@ describe('Job State actions', () => {
});
});
- describe('requestTrace', () => {
- it('should commit REQUEST_TRACE mutation', (done) => {
- testAction(requestTrace, null, mockedState, [{ type: types.REQUEST_TRACE }], [], done);
+ describe('requestJobLog', () => {
+ it('should commit REQUEST_JOB_LOG mutation', (done) => {
+ testAction(requestJobLog, null, mockedState, [{ type: types.REQUEST_JOB_LOG }], [], done);
});
});
- describe('fetchTrace', () => {
+ describe('fetchJobLog', () => {
let mock;
beforeEach(() => {
- mockedState.traceEndpoint = `${TEST_HOST}/endpoint`;
+ mockedState.jobLogEndpoint = `${TEST_HOST}/endpoint`;
mock = new MockAdapter(axios);
});
@@ -212,14 +212,14 @@ describe('Job State actions', () => {
});
describe('success', () => {
- it('dispatches requestTrace, receiveTraceSuccess and stopPollingTrace when job is complete', (done) => {
+ it('dispatches requestJobLog, receiveJobLogSuccess and stopPollingJobLog when job is complete', (done) => {
mock.onGet(`${TEST_HOST}/endpoint/trace.json`).replyOnce(200, {
html: 'I, [2018-08-17T22:57:45.707325 #1841] INFO -- :',
complete: true,
});
testAction(
- fetchTrace,
+ fetchJobLog,
null,
mockedState,
[],
@@ -233,10 +233,10 @@ describe('Job State actions', () => {
html: 'I, [2018-08-17T22:57:45.707325 #1841] INFO -- :',
complete: true,
},
- type: 'receiveTraceSuccess',
+ type: 'receiveJobLogSuccess',
},
{
- type: 'stopPollingTrace',
+ type: 'stopPollingJobLog',
},
],
done,
@@ -244,43 +244,43 @@ describe('Job State actions', () => {
});
describe('when job is incomplete', () => {
- let tracePayload;
+ let jobLogPayload;
beforeEach(() => {
- tracePayload = {
+ jobLogPayload = {
html: 'I, [2018-08-17T22:57:45.707325 #1841] INFO -- :',
complete: false,
};
- mock.onGet(`${TEST_HOST}/endpoint/trace.json`).replyOnce(200, tracePayload);
+ mock.onGet(`${TEST_HOST}/endpoint/trace.json`).replyOnce(200, jobLogPayload);
});
- it('dispatches startPollingTrace', (done) => {
+ it('dispatches startPollingJobLog', (done) => {
testAction(
- fetchTrace,
+ fetchJobLog,
null,
mockedState,
[],
[
{ type: 'toggleScrollisInBottom', payload: true },
- { type: 'receiveTraceSuccess', payload: tracePayload },
- { type: 'startPollingTrace' },
+ { type: 'receiveJobLogSuccess', payload: jobLogPayload },
+ { type: 'startPollingJobLog' },
],
done,
);
});
- it('does not dispatch startPollingTrace when timeout is non-empty', (done) => {
- mockedState.traceTimeout = 1;
+ it('does not dispatch startPollingJobLog when timeout is non-empty', (done) => {
+ mockedState.jobLogTimeout = 1;
testAction(
- fetchTrace,
+ fetchJobLog,
null,
mockedState,
[],
[
{ type: 'toggleScrollisInBottom', payload: true },
- { type: 'receiveTraceSuccess', payload: tracePayload },
+ { type: 'receiveJobLogSuccess', payload: jobLogPayload },
],
done,
);
@@ -293,15 +293,15 @@ describe('Job State actions', () => {
mock.onGet(`${TEST_HOST}/endpoint/trace.json`).reply(500);
});
- it('dispatches requestTrace and receiveTraceError ', (done) => {
+ it('dispatches requestJobLog and receiveJobLogError ', (done) => {
testAction(
- fetchTrace,
+ fetchJobLog,
null,
mockedState,
[],
[
{
- type: 'receiveTraceError',
+ type: 'receiveJobLogError',
},
],
done,
@@ -310,7 +310,7 @@ describe('Job State actions', () => {
});
});
- describe('startPollingTrace', () => {
+ describe('startPollingJobLog', () => {
let dispatch;
let commit;
@@ -318,18 +318,18 @@ describe('Job State actions', () => {
dispatch = jest.fn();
commit = jest.fn();
- startPollingTrace({ dispatch, commit });
+ startPollingJobLog({ dispatch, commit });
});
afterEach(() => {
jest.clearAllTimers();
});
- it('should save the timeout id but not call fetchTrace', () => {
- expect(commit).toHaveBeenCalledWith(types.SET_TRACE_TIMEOUT, expect.any(Number));
+ it('should save the timeout id but not call fetchJobLog', () => {
+ expect(commit).toHaveBeenCalledWith(types.SET_JOB_LOG_TIMEOUT, expect.any(Number));
expect(commit.mock.calls[0][1]).toBeGreaterThan(0);
- expect(dispatch).not.toHaveBeenCalledWith('fetchTrace');
+ expect(dispatch).not.toHaveBeenCalledWith('fetchJobLog');
});
describe('after timeout has passed', () => {
@@ -337,14 +337,14 @@ describe('Job State actions', () => {
jest.advanceTimersByTime(4000);
});
- it('should clear the timeout id and fetchTrace', () => {
- expect(commit).toHaveBeenCalledWith(types.SET_TRACE_TIMEOUT, 0);
- expect(dispatch).toHaveBeenCalledWith('fetchTrace');
+ it('should clear the timeout id and fetchJobLog', () => {
+ expect(commit).toHaveBeenCalledWith(types.SET_JOB_LOG_TIMEOUT, 0);
+ expect(dispatch).toHaveBeenCalledWith('fetchJobLog');
});
});
});
- describe('stopPollingTrace', () => {
+ describe('stopPollingJobLog', () => {
let origTimeout;
beforeEach(() => {
@@ -358,40 +358,40 @@ describe('Job State actions', () => {
window.clearTimeout = origTimeout;
});
- it('should commit STOP_POLLING_TRACE mutation ', (done) => {
- const traceTimeout = 7;
+ it('should commit STOP_POLLING_JOB_LOG mutation ', (done) => {
+ const jobLogTimeout = 7;
testAction(
- stopPollingTrace,
+ stopPollingJobLog,
null,
- { ...mockedState, traceTimeout },
- [{ type: types.SET_TRACE_TIMEOUT, payload: 0 }, { type: types.STOP_POLLING_TRACE }],
+ { ...mockedState, jobLogTimeout },
+ [{ type: types.SET_JOB_LOG_TIMEOUT, payload: 0 }, { type: types.STOP_POLLING_JOB_LOG }],
[],
)
.then(() => {
- expect(window.clearTimeout).toHaveBeenCalledWith(traceTimeout);
+ expect(window.clearTimeout).toHaveBeenCalledWith(jobLogTimeout);
})
.then(done)
.catch(done.fail);
});
});
- describe('receiveTraceSuccess', () => {
- it('should commit RECEIVE_TRACE_SUCCESS mutation ', (done) => {
+ describe('receiveJobLogSuccess', () => {
+ it('should commit RECEIVE_JOB_LOG_SUCCESS mutation ', (done) => {
testAction(
- receiveTraceSuccess,
+ receiveJobLogSuccess,
'hello world',
mockedState,
- [{ type: types.RECEIVE_TRACE_SUCCESS, payload: 'hello world' }],
+ [{ type: types.RECEIVE_JOB_LOG_SUCCESS, payload: 'hello world' }],
[],
done,
);
});
});
- describe('receiveTraceError', () => {
- it('should commit stop polling trace', (done) => {
- testAction(receiveTraceError, null, mockedState, [], [{ type: 'stopPollingTrace' }], done);
+ describe('receiveJobLogError', () => {
+ it('should commit stop polling job log', (done) => {
+ testAction(receiveJobLogError, null, mockedState, [], [{ type: 'stopPollingJobLog' }], done);
});
});
diff --git a/spec/frontend/jobs/store/getters_spec.js b/spec/frontend/jobs/store/getters_spec.js
index 379114c3737..f26c0cf00fd 100644
--- a/spec/frontend/jobs/store/getters_spec.js
+++ b/spec/frontend/jobs/store/getters_spec.js
@@ -102,13 +102,13 @@ describe('Job Store Getters', () => {
});
});
- describe('hasTrace', () => {
+ describe('hasJobLog', () => {
describe('when has_trace is true', () => {
it('returns true', () => {
localState.job.has_trace = true;
localState.job.status = {};
- expect(getters.hasTrace(localState)).toEqual(true);
+ expect(getters.hasJobLog(localState)).toEqual(true);
});
});
@@ -117,7 +117,7 @@ describe('Job Store Getters', () => {
localState.job.has_trace = false;
localState.job.status = { group: 'running' };
- expect(getters.hasTrace(localState)).toEqual(true);
+ expect(getters.hasJobLog(localState)).toEqual(true);
});
});
@@ -126,7 +126,7 @@ describe('Job Store Getters', () => {
localState.job.has_trace = false;
localState.job.status = { group: 'pending' };
- expect(getters.hasTrace(localState)).toEqual(false);
+ expect(getters.hasJobLog(localState)).toEqual(false);
});
});
});
diff --git a/spec/frontend/jobs/store/mutations_spec.js b/spec/frontend/jobs/store/mutations_spec.js
index 159315330e4..b73aa8abf4e 100644
--- a/spec/frontend/jobs/store/mutations_spec.js
+++ b/spec/frontend/jobs/store/mutations_spec.js
@@ -45,39 +45,39 @@ describe('Jobs Store Mutations', () => {
});
});
- describe('RECEIVE_TRACE_SUCCESS', () => {
- describe('when trace has state', () => {
- it('sets traceState', () => {
+ describe('RECEIVE_JOB_LOG_SUCCESS', () => {
+ describe('when job log has state', () => {
+ it('sets jobLogState', () => {
const stateLog =
'eyJvZmZzZXQiOjczNDQ1MSwibl9vcGVuX3RhZ3MiOjAsImZnX2NvbG9yIjpudWxsLCJiZ19jb2xvciI6bnVsbCwic3R5bGVfbWFzayI6MH0=';
- mutations[types.RECEIVE_TRACE_SUCCESS](stateCopy, {
+ mutations[types.RECEIVE_JOB_LOG_SUCCESS](stateCopy, {
state: stateLog,
});
- expect(stateCopy.traceState).toEqual(stateLog);
+ expect(stateCopy.jobLogState).toEqual(stateLog);
});
});
- describe('when traceSize is smaller than the total size', () => {
- it('sets isTraceSizeVisible to true', () => {
- mutations[types.RECEIVE_TRACE_SUCCESS](stateCopy, { total: 51184600, size: 1231 });
+ describe('when jobLogSize is smaller than the total size', () => {
+ it('sets isJobLogSizeVisible to true', () => {
+ mutations[types.RECEIVE_JOB_LOG_SUCCESS](stateCopy, { total: 51184600, size: 1231 });
- expect(stateCopy.isTraceSizeVisible).toEqual(true);
+ expect(stateCopy.isJobLogSizeVisible).toEqual(true);
});
});
- describe('when traceSize is bigger than the total size', () => {
- it('sets isTraceSizeVisible to false', () => {
- const copy = { ...stateCopy, traceSize: 5118460, size: 2321312 };
+ describe('when jobLogSize is bigger than the total size', () => {
+ it('sets isJobLogSizeVisible to false', () => {
+ const copy = { ...stateCopy, jobLogSize: 5118460, size: 2321312 };
- mutations[types.RECEIVE_TRACE_SUCCESS](copy, { total: 511846 });
+ mutations[types.RECEIVE_JOB_LOG_SUCCESS](copy, { total: 511846 });
- expect(copy.isTraceSizeVisible).toEqual(false);
+ expect(copy.isJobLogSizeVisible).toEqual(false);
});
});
- it('sets trace, trace size and isTraceComplete', () => {
- mutations[types.RECEIVE_TRACE_SUCCESS](stateCopy, {
+ it('sets job log size and isJobLogComplete', () => {
+ mutations[types.RECEIVE_JOB_LOG_SUCCESS](stateCopy, {
append: true,
html,
size: 511846,
@@ -85,15 +85,15 @@ describe('Jobs Store Mutations', () => {
lines: [],
});
- expect(stateCopy.traceSize).toEqual(511846);
- expect(stateCopy.isTraceComplete).toEqual(true);
+ expect(stateCopy.jobLogSize).toEqual(511846);
+ expect(stateCopy.isJobLogComplete).toEqual(true);
});
describe('with new job log', () => {
describe('log.lines', () => {
describe('when append is true', () => {
it('sets the parsed log ', () => {
- mutations[types.RECEIVE_TRACE_SUCCESS](stateCopy, {
+ mutations[types.RECEIVE_JOB_LOG_SUCCESS](stateCopy, {
append: true,
size: 511846,
complete: true,
@@ -105,7 +105,7 @@ describe('Jobs Store Mutations', () => {
],
});
- expect(stateCopy.trace).toEqual([
+ expect(stateCopy.jobLog).toEqual([
{
offset: 1,
content: [{ text: 'Running with gitlab-runner 11.12.1 (5a147c92)' }],
@@ -117,7 +117,7 @@ describe('Jobs Store Mutations', () => {
describe('when it is defined', () => {
it('sets the parsed log ', () => {
- mutations[types.RECEIVE_TRACE_SUCCESS](stateCopy, {
+ mutations[types.RECEIVE_JOB_LOG_SUCCESS](stateCopy, {
append: false,
size: 511846,
complete: true,
@@ -126,7 +126,7 @@ describe('Jobs Store Mutations', () => {
],
});
- expect(stateCopy.trace).toEqual([
+ expect(stateCopy.jobLog).toEqual([
{
offset: 0,
content: [{ text: 'Running with gitlab-runner 11.11.1 (5a147c92)' }],
@@ -138,7 +138,7 @@ describe('Jobs Store Mutations', () => {
describe('when it is null', () => {
it('sets the default value', () => {
- mutations[types.RECEIVE_TRACE_SUCCESS](stateCopy, {
+ mutations[types.RECEIVE_JOB_LOG_SUCCESS](stateCopy, {
append: true,
html,
size: 511846,
@@ -146,30 +146,30 @@ describe('Jobs Store Mutations', () => {
lines: null,
});
- expect(stateCopy.trace).toEqual([]);
+ expect(stateCopy.jobLog).toEqual([]);
});
});
});
});
});
- describe('SET_TRACE_TIMEOUT', () => {
- it('sets the traceTimeout id', () => {
+ describe('SET_JOB_LOG_TIMEOUT', () => {
+ it('sets the jobLogTimeout id', () => {
const id = 7;
- expect(stateCopy.traceTimeout).not.toEqual(id);
+ expect(stateCopy.jobLogTimeout).not.toEqual(id);
- mutations[types.SET_TRACE_TIMEOUT](stateCopy, id);
+ mutations[types.SET_JOB_LOG_TIMEOUT](stateCopy, id);
- expect(stateCopy.traceTimeout).toEqual(id);
+ expect(stateCopy.jobLogTimeout).toEqual(id);
});
});
- describe('STOP_POLLING_TRACE', () => {
- it('sets isTraceComplete to true', () => {
- mutations[types.STOP_POLLING_TRACE](stateCopy);
+ describe('STOP_POLLING_JOB_LOG', () => {
+ it('sets isJobLogComplete to true', () => {
+ mutations[types.STOP_POLLING_JOB_LOG](stateCopy);
- expect(stateCopy.isTraceComplete).toEqual(true);
+ expect(stateCopy.isJobLogComplete).toEqual(true);
});
});
@@ -296,12 +296,12 @@ describe('Job Store mutations, feature flag ON', () => {
window.gon = origGon;
});
- describe('RECEIVE_TRACE_SUCCESS', () => {
+ describe('RECEIVE_JOB_LOG_SUCCESS', () => {
describe('with new job log', () => {
describe('log.lines', () => {
describe('when append is true', () => {
it('sets the parsed log ', () => {
- mutations[types.RECEIVE_TRACE_SUCCESS](stateCopy, {
+ mutations[types.RECEIVE_JOB_LOG_SUCCESS](stateCopy, {
append: true,
size: 511846,
complete: true,
@@ -313,7 +313,7 @@ describe('Job Store mutations, feature flag ON', () => {
],
});
- expect(stateCopy.trace).toEqual([
+ expect(stateCopy.jobLog).toEqual([
{
offset: 1,
content: [{ text: 'Running with gitlab-runner 11.12.1 (5a147c92)' }],
@@ -325,7 +325,7 @@ describe('Job Store mutations, feature flag ON', () => {
describe('when lines are defined', () => {
it('sets the parsed log ', () => {
- mutations[types.RECEIVE_TRACE_SUCCESS](stateCopy, {
+ mutations[types.RECEIVE_JOB_LOG_SUCCESS](stateCopy, {
append: false,
size: 511846,
complete: true,
@@ -334,7 +334,7 @@ describe('Job Store mutations, feature flag ON', () => {
],
});
- expect(stateCopy.trace).toEqual([
+ expect(stateCopy.jobLog).toEqual([
{
offset: 0,
content: [{ text: 'Running with gitlab-runner 11.11.1 (5a147c92)' }],
@@ -346,7 +346,7 @@ describe('Job Store mutations, feature flag ON', () => {
describe('when lines are null', () => {
it('sets the default value', () => {
- mutations[types.RECEIVE_TRACE_SUCCESS](stateCopy, {
+ mutations[types.RECEIVE_JOB_LOG_SUCCESS](stateCopy, {
append: true,
html,
size: 511846,
@@ -354,7 +354,7 @@ describe('Job Store mutations, feature flag ON', () => {
lines: null,
});
- expect(stateCopy.trace).toEqual([]);
+ expect(stateCopy.jobLog).toEqual([]);
});
});
});
diff --git a/spec/frontend/jobs/store/utils_spec.js b/spec/frontend/jobs/store/utils_spec.js
index 0c5fa150002..92ac33c8792 100644
--- a/spec/frontend/jobs/store/utils_spec.js
+++ b/spec/frontend/jobs/store/utils_spec.js
@@ -1,7 +1,7 @@
import {
logLinesParser,
logLinesParserLegacy,
- updateIncrementalTrace,
+ updateIncrementalJobLog,
parseHeaderLine,
parseLine,
addDurationToHeader,
@@ -487,11 +487,11 @@ describe('Jobs Store Utils', () => {
});
});
- describe('updateIncrementalTrace', () => {
+ describe('updateIncrementalJobLog', () => {
describe('without repeated section', () => {
it('concats and parses both arrays', () => {
const oldLog = logLinesParserLegacy(originalTrace);
- const result = updateIncrementalTrace(regularIncremental, oldLog);
+ const result = updateIncrementalJobLog(regularIncremental, oldLog);
expect(result).toEqual([
{
@@ -519,7 +519,7 @@ describe('Jobs Store Utils', () => {
describe('with regular line repeated offset', () => {
it('updates the last line and formats with the incremental part', () => {
const oldLog = logLinesParserLegacy(originalTrace);
- const result = updateIncrementalTrace(regularIncrementalRepeated, oldLog);
+ const result = updateIncrementalJobLog(regularIncrementalRepeated, oldLog);
expect(result).toEqual([
{
@@ -538,7 +538,7 @@ describe('Jobs Store Utils', () => {
describe('with header line repeated', () => {
it('updates the header line and formats with the incremental part', () => {
const oldLog = logLinesParserLegacy(headerTrace);
- const result = updateIncrementalTrace(headerTraceIncremental, oldLog);
+ const result = updateIncrementalJobLog(headerTraceIncremental, oldLog);
expect(result).toEqual([
{
@@ -564,7 +564,7 @@ describe('Jobs Store Utils', () => {
describe('with collapsible line repeated', () => {
it('updates the collapsible line and formats with the incremental part', () => {
const oldLog = logLinesParserLegacy(collapsibleTrace);
- const result = updateIncrementalTrace(collapsibleTraceIncremental, oldLog);
+ const result = updateIncrementalJobLog(collapsibleTraceIncremental, oldLog);
expect(result).toEqual([
{
diff --git a/spec/frontend/lib/apollo/suppress_network_errors_during_navigation_link_spec.js b/spec/frontend/lib/apollo/suppress_network_errors_during_navigation_link_spec.js
new file mode 100644
index 00000000000..852106db44e
--- /dev/null
+++ b/spec/frontend/lib/apollo/suppress_network_errors_during_navigation_link_spec.js
@@ -0,0 +1,155 @@
+import { ApolloLink, Observable } from 'apollo-link';
+import waitForPromises from 'helpers/wait_for_promises';
+import { getSuppressNetworkErrorsDuringNavigationLink } from '~/lib/apollo/suppress_network_errors_during_navigation_link';
+import { isNavigatingAway } from '~/lib/utils/is_navigating_away';
+
+jest.mock('~/lib/utils/is_navigating_away');
+
+describe('getSuppressNetworkErrorsDuringNavigationLink', () => {
+ const originalGon = window.gon;
+ let subscription;
+
+ beforeEach(() => {
+ window.gon = originalGon;
+ });
+
+ afterEach(() => {
+ if (subscription) {
+ subscription.unsubscribe();
+ }
+ });
+
+ const makeMockGraphQLErrorLink = () =>
+ new ApolloLink(() =>
+ Observable.of({
+ errors: [
+ {
+ message: 'foo',
+ },
+ ],
+ }),
+ );
+
+ const makeMockNetworkErrorLink = () =>
+ new ApolloLink(
+ () =>
+ new Observable(() => {
+ throw new Error('NetworkError');
+ }),
+ );
+
+ const makeMockSuccessLink = () =>
+ new ApolloLink(() => Observable.of({ data: { foo: { id: 1 } } }));
+
+ const createSubscription = (otherLink, observer) => {
+ const mockOperation = { operationName: 'foo' };
+ const link = getSuppressNetworkErrorsDuringNavigationLink().concat(otherLink);
+ subscription = link.request(mockOperation).subscribe(observer);
+ };
+
+ describe('when disabled', () => {
+ it('returns null', () => {
+ expect(getSuppressNetworkErrorsDuringNavigationLink()).toBe(null);
+ });
+ });
+
+ describe('when enabled', () => {
+ beforeEach(() => {
+ window.gon = { features: { suppressApolloErrorsDuringNavigation: true } };
+ });
+
+ it('returns an ApolloLink', () => {
+ expect(getSuppressNetworkErrorsDuringNavigationLink()).toEqual(expect.any(ApolloLink));
+ });
+
+ describe('suppression case', () => {
+ describe('when navigating away', () => {
+ beforeEach(() => {
+ isNavigatingAway.mockReturnValue(true);
+ });
+
+ describe('given a network error', () => {
+ it('does not forward the error', async () => {
+ const spy = jest.fn();
+
+ createSubscription(makeMockNetworkErrorLink(), {
+ next: spy,
+ error: spy,
+ complete: spy,
+ });
+
+ // It's hard to test for something _not_ happening. The best we can
+ // do is wait a bit to make sure nothing happens.
+ await waitForPromises();
+ expect(spy).not.toHaveBeenCalled();
+ });
+ });
+ });
+ });
+
+ describe('non-suppression cases', () => {
+ describe('when not navigating away', () => {
+ beforeEach(() => {
+ isNavigatingAway.mockReturnValue(false);
+ });
+
+ it('forwards successful requests', (done) => {
+ createSubscription(makeMockSuccessLink(), {
+ next({ data }) {
+ expect(data).toEqual({ foo: { id: 1 } });
+ },
+ error: () => done.fail('Should not happen'),
+ complete: () => done(),
+ });
+ });
+
+ it('forwards GraphQL errors', (done) => {
+ createSubscription(makeMockGraphQLErrorLink(), {
+ next({ errors }) {
+ expect(errors).toEqual([{ message: 'foo' }]);
+ },
+ error: () => done.fail('Should not happen'),
+ complete: () => done(),
+ });
+ });
+
+ it('forwards network errors', (done) => {
+ createSubscription(makeMockNetworkErrorLink(), {
+ next: () => done.fail('Should not happen'),
+ error: (error) => {
+ expect(error.message).toBe('NetworkError');
+ done();
+ },
+ complete: () => done.fail('Should not happen'),
+ });
+ });
+ });
+
+ describe('when navigating away', () => {
+ beforeEach(() => {
+ isNavigatingAway.mockReturnValue(true);
+ });
+
+ it('forwards successful requests', (done) => {
+ createSubscription(makeMockSuccessLink(), {
+ next({ data }) {
+ expect(data).toEqual({ foo: { id: 1 } });
+ },
+ error: () => done.fail('Should not happen'),
+ complete: () => done(),
+ });
+ });
+
+ it('forwards GraphQL errors', (done) => {
+ createSubscription(makeMockGraphQLErrorLink(), {
+ next({ errors }) {
+ expect(errors).toEqual([{ message: 'foo' }]);
+ },
+ error: () => done.fail('Should not happen'),
+ complete: () => done(),
+ });
+ });
+ });
+ });
+ });
+});
diff --git a/spec/frontend/lib/logger/__snapshots__/hello_spec.js.snap b/spec/frontend/lib/logger/__snapshots__/hello_spec.js.snap
index 791ec05befd..0b156049dab 100644
--- a/spec/frontend/lib/logger/__snapshots__/hello_spec.js.snap
+++ b/spec/frontend/lib/logger/__snapshots__/hello_spec.js.snap
@@ -1,6 +1,6 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP
-exports[`~/lib/logger/hello logHello console logs a friendly hello message 1`] = `
+exports[`~/lib/logger/hello logHello when on dot_com console logs a friendly hello message including the careers page 1`] = `
Array [
Array [
"%cWelcome to GitLab!%c
@@ -8,7 +8,24 @@ Array [
Does this page need fixes or improvements? Open an issue or contribute a merge request to help make GitLab more lovable. At GitLab, everyone can contribute!
🤠Contribute to GitLab: https://about.gitlab.com/community/contribute/
-🔎 Create a new GitLab issue: https://gitlab.com/gitlab-org/gitlab/-/issues/new",
+🔎 Create a new GitLab issue: https://gitlab.com/gitlab-org/gitlab/-/issues/new
+🚀 We like your curiosity! Help us improve GitLab by joining the team: https://about.gitlab.com/jobs/",
+ "padding-top: 0.5em; font-size: 2em;",
+ "padding-bottom: 0.5em;",
+ ],
+]
+`;
+
+exports[`~/lib/logger/hello logHello when on self managed console logs a friendly hello message without including the careers page 1`] = `
+Array [
+ Array [
+ "%cWelcome to GitLab!%c
+
+Does this page need fixes or improvements? Open an issue or contribute a merge request to help make GitLab more lovable. At GitLab, everyone can contribute!
+
+🤠Contribute to GitLab: https://about.gitlab.com/community/contribute/
+🔎 Create a new GitLab issue: https://gitlab.com/gitlab-org/gitlab/-/issues/new
+",
"padding-top: 0.5em; font-size: 2em;",
"padding-bottom: 0.5em;",
],
diff --git a/spec/frontend/lib/logger/hello_spec.js b/spec/frontend/lib/logger/hello_spec.js
index 39abe0e0dd0..39c1b55313b 100644
--- a/spec/frontend/lib/logger/hello_spec.js
+++ b/spec/frontend/lib/logger/hello_spec.js
@@ -9,12 +9,32 @@ describe('~/lib/logger/hello', () => {
});
describe('logHello', () => {
- it('console logs a friendly hello message', () => {
- expect(consoleLogSpy).not.toHaveBeenCalled();
+ describe('when on dot_com', () => {
+ beforeEach(() => {
+ gon.dot_com = true;
+ });
- logHello();
+ it('console logs a friendly hello message including the careers page', () => {
+ expect(consoleLogSpy).not.toHaveBeenCalled();
- expect(consoleLogSpy.mock.calls).toMatchSnapshot();
+ logHello();
+
+ expect(consoleLogSpy.mock.calls).toMatchSnapshot();
+ });
+ });
+
+ describe('when on self managed', () => {
+ beforeEach(() => {
+ gon.dot_com = false;
+ });
+
+ it('console logs a friendly hello message without including the careers page', () => {
+ expect(consoleLogSpy).not.toHaveBeenCalled();
+
+ logHello();
+
+ expect(consoleLogSpy.mock.calls).toMatchSnapshot();
+ });
});
});
});
diff --git a/spec/frontend/lib/utils/color_utils_spec.js b/spec/frontend/lib/utils/color_utils_spec.js
index c6b88b2957c..87966cf9fba 100644
--- a/spec/frontend/lib/utils/color_utils_spec.js
+++ b/spec/frontend/lib/utils/color_utils_spec.js
@@ -1,4 +1,5 @@
import {
+ isValidColorExpression,
textColorForBackground,
hexToRgb,
validateHexColor,
@@ -72,4 +73,21 @@ describe('Color utils', () => {
},
);
});
+
+ describe('isValidColorExpression', () => {
+ it.each`
+ colorExpression | valid | desc
+ ${'#F00'} | ${true} | ${'valid'}
+ ${'rgba(0,0,0,0)'} | ${true} | ${'valid'}
+ ${'hsl(540,70%,50%)'} | ${true} | ${'valid'}
+ ${'red'} | ${true} | ${'valid'}
+ ${'F00'} | ${false} | ${'invalid'}
+ ${'F00'} | ${false} | ${'invalid'}
+ ${'gba(0,0,0,0)'} | ${false} | ${'invalid'}
+ ${'hls(540,70%,50%)'} | ${false} | ${'invalid'}
+ ${'hello'} | ${false} | ${'invalid'}
+ `('color expression $colorExpression is $desc', ({ colorExpression, valid }) => {
+ expect(isValidColorExpression(colorExpression)).toBe(valid);
+ });
+ });
});
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 942ba56196e..1adc70450e8 100644
--- a/spec/frontend/lib/utils/datetime/date_format_utility_spec.js
+++ b/spec/frontend/lib/utils/datetime/date_format_utility_spec.js
@@ -118,3 +118,18 @@ describe('date_format_utility.js', () => {
});
});
});
+
+describe('formatTimeAsSummary', () => {
+ it.each`
+ unit | value | result
+ ${'months'} | ${1.5} | ${'1.5M'}
+ ${'weeks'} | ${1.25} | ${'1.5w'}
+ ${'days'} | ${2} | ${'2d'}
+ ${'hours'} | ${10} | ${'10h'}
+ ${'minutes'} | ${20} | ${'20m'}
+ ${'seconds'} | ${10} | ${'<1m'}
+ ${'seconds'} | ${0} | ${'-'}
+ `('will format $value $unit to $result', ({ unit, value, result }) => {
+ expect(utils.formatTimeAsSummary({ [unit]: value })).toBe(result);
+ });
+});
diff --git a/spec/frontend/lib/utils/is_navigating_away_spec.js b/spec/frontend/lib/utils/is_navigating_away_spec.js
new file mode 100644
index 00000000000..e1230fe96bf
--- /dev/null
+++ b/spec/frontend/lib/utils/is_navigating_away_spec.js
@@ -0,0 +1,23 @@
+import { isNavigatingAway, setNavigatingForTestsOnly } from '~/lib/utils/is_navigating_away';
+
+describe('isNavigatingAway', () => {
+ beforeEach(() => {
+ // Make sure each test starts with the same state
+ setNavigatingForTestsOnly(false);
+ });
+
+ it.each([false, true])('it returns the navigation flag with value %s', (flag) => {
+ setNavigatingForTestsOnly(flag);
+ expect(isNavigatingAway()).toEqual(flag);
+ });
+
+ describe('when the browser starts navigating away', () => {
+ it('returns true', () => {
+ expect(isNavigatingAway()).toEqual(false);
+
+ window.dispatchEvent(new Event('beforeunload'));
+
+ expect(isNavigatingAway()).toEqual(true);
+ });
+ });
+});
diff --git a/spec/frontend/lib/utils/text_utility_spec.js b/spec/frontend/lib/utils/text_utility_spec.js
index 1f3659b5c76..9570d2a831c 100644
--- a/spec/frontend/lib/utils/text_utility_spec.js
+++ b/spec/frontend/lib/utils/text_utility_spec.js
@@ -363,4 +363,25 @@ describe('text_utility', () => {
expect(textUtils.insertFinalNewline(input, '\r\n')).toBe(output);
});
});
+
+ describe('escapeShellString', () => {
+ it.each`
+ character | input | output
+ ${'"'} | ${'";echo "you_shouldnt_run_this'} | ${'\'";echo "you_shouldnt_run_this\''}
+ ${'$'} | ${'$IFS'} | ${"'$IFS'"}
+ ${'\\'} | ${'evil-branch-name\\'} | ${"'evil-branch-name\\'"}
+ ${'!'} | ${'!event'} | ${"'!event'"}
+ `(
+ 'should not escape the $character character but wrap in single-quotes',
+ ({ input, output }) => {
+ expect(textUtils.escapeShellString(input)).toBe(output);
+ },
+ );
+
+ it("should escape the ' character and wrap in single-quotes", () => {
+ expect(textUtils.escapeShellString("fix-'bug-behavior'")).toBe(
+ "'fix-'\\''bug-behavior'\\'''",
+ );
+ });
+ });
});
diff --git a/spec/frontend/lib/utils/url_utility_spec.js b/spec/frontend/lib/utils/url_utility_spec.js
index 6f186ba3227..18b68d91e01 100644
--- a/spec/frontend/lib/utils/url_utility_spec.js
+++ b/spec/frontend/lib/utils/url_utility_spec.js
@@ -1004,4 +1004,39 @@ describe('URL utility', () => {
expect(urlUtils.isSameOriginUrl(url)).toBe(expected);
});
});
+
+ describe('constructWebIDEPath', () => {
+ let originalGl;
+ const projectIDEPath = '/foo/bar';
+ const sourceProj = 'my_-fancy-proj/boo';
+ const targetProj = 'boo/another-fancy-proj';
+ const mrIid = '7';
+
+ beforeEach(() => {
+ originalGl = window.gl;
+ window.gl = { webIDEPath: projectIDEPath };
+ });
+
+ afterEach(() => {
+ window.gl = originalGl;
+ });
+
+ it.each`
+ sourceProjectFullPath | targetProjectFullPath | iid | expectedPath
+ ${undefined} | ${undefined} | ${undefined} | ${projectIDEPath}
+ ${undefined} | ${undefined} | ${mrIid} | ${projectIDEPath}
+ ${undefined} | ${targetProj} | ${undefined} | ${projectIDEPath}
+ ${undefined} | ${targetProj} | ${mrIid} | ${projectIDEPath}
+ ${sourceProj} | ${undefined} | ${undefined} | ${projectIDEPath}
+ ${sourceProj} | ${targetProj} | ${undefined} | ${projectIDEPath}
+ ${sourceProj} | ${undefined} | ${mrIid} | ${`/-/ide/project/${sourceProj}/merge_requests/${mrIid}?target_project=`}
+ ${sourceProj} | ${sourceProj} | ${mrIid} | ${`/-/ide/project/${sourceProj}/merge_requests/${mrIid}?target_project=`}
+ ${sourceProj} | ${targetProj} | ${mrIid} | ${`/-/ide/project/${sourceProj}/merge_requests/${mrIid}?target_project=${encodeURIComponent(targetProj)}`}
+ `(
+ 'returns $expectedPath for "$sourceProjectFullPath + $targetProjectFullPath + $iid"',
+ ({ expectedPath, ...args } = {}) => {
+ expect(urlUtils.constructWebIDEPath(args)).toBe(expectedPath);
+ },
+ );
+ });
});
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 d8453d453e7..7eb0ea37fe6 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
@@ -45,7 +45,7 @@ describe('RemoveMemberButton', () => {
title: 'Remove member',
isAccessRequest: true,
isInvite: true,
- oncallSchedules: { name: 'user', schedules: [] },
+ userDeletionObstacles: { name: 'user', obstacles: [] },
...propsData,
},
directives: {
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
index 0aa3780f030..10e451376c8 100644
--- a/spec/frontend/members/components/action_buttons/user_action_buttons_spec.js
+++ b/spec/frontend/members/components/action_buttons/user_action_buttons_spec.js
@@ -2,6 +2,7 @@ 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', () => {
@@ -45,9 +46,9 @@ describe('UserActionButtons', () => {
isAccessRequest: false,
isInvite: false,
icon: 'remove',
- oncallSchedules: {
+ userDeletionObstacles: {
name: member.user.name,
- schedules: member.user.oncallSchedules,
+ obstacles: parseUserDeletionObstacles(member.user),
},
});
});
diff --git a/spec/frontend/members/components/modals/leave_modal_spec.js b/spec/frontend/members/components/modals/leave_modal_spec.js
index 1dc913e5c78..f755f08dbf2 100644
--- a/spec/frontend/members/components/modals/leave_modal_spec.js
+++ b/spec/frontend/members/components/modals/leave_modal_spec.js
@@ -6,7 +6,8 @@ import { nextTick } from 'vue';
import Vuex from 'vuex';
import LeaveModal from '~/members/components/modals/leave_modal.vue';
import { LEAVE_MODAL_ID, MEMBER_TYPES } from '~/members/constants';
-import OncallSchedulesList from '~/vue_shared/components/oncall_schedules_list.vue';
+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';
jest.mock('~/lib/utils/csrf', () => ({ token: 'mock-csrf-token' }));
@@ -51,7 +52,7 @@ describe('LeaveModal', () => {
const findModal = () => wrapper.findComponent(GlModal);
const findForm = () => findModal().findComponent(GlForm);
- const findOncallSchedulesList = () => findModal().findComponent(OncallSchedulesList);
+ const findUserDeletionObstaclesList = () => findModal().findComponent(UserDeletionObstaclesList);
const getByText = (text, options) =>
createWrapper(within(findModal().element).getByText(text, options));
@@ -89,25 +90,27 @@ describe('LeaveModal', () => {
);
});
- describe('On-call schedules list', () => {
- it("displays oncall schedules list when member's user is part of on-call schedules ", () => {
- const schedulesList = findOncallSchedulesList();
- expect(schedulesList.exists()).toBe(true);
- expect(schedulesList.props()).toMatchObject({
+ describe('User deletion obstacles list', () => {
+ it("displays obstacles list when member's user is part of on-call management", () => {
+ const obstaclesList = findUserDeletionObstaclesList();
+ expect(obstaclesList.exists()).toBe(true);
+ expect(obstaclesList.props()).toMatchObject({
isCurrentUser: true,
- schedules: member.user.oncallSchedules,
+ obstacles: parseUserDeletionObstacles(member.user),
});
});
- it("does NOT display oncall schedules list when member's user is NOT a part of on-call schedules ", async () => {
+ it("does NOT display obstacles list when member's user is NOT a part of on-call management", async () => {
wrapper.destroy();
- const memberWithoutOncallSchedules = cloneDeep(member);
- delete memberWithoutOncallSchedules.user.oncallSchedules;
- createComponent({ member: memberWithoutOncallSchedules });
+ const memberWithoutOncall = cloneDeep(member);
+ delete memberWithoutOncall.user.oncallSchedules;
+ delete memberWithoutOncall.user.escalationPolicies;
+
+ createComponent({ member: memberWithoutOncall });
await nextTick();
- expect(findOncallSchedulesList().exists()).toBe(false);
+ expect(findUserDeletionObstaclesList().exists()).toBe(false);
});
});
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 1dc41582c12..1d39c4b3175 100644
--- a/spec/frontend/members/components/modals/remove_member_modal_spec.js
+++ b/spec/frontend/members/components/modals/remove_member_modal_spec.js
@@ -4,15 +4,19 @@ 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 OncallSchedulesList from '~/vue_shared/components/oncall_schedules_list.vue';
+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';
Vue.use(Vuex);
describe('RemoveMemberModal', () => {
const memberPath = '/gitlab-org/gitlab-test/-/project_members/90';
- const mockSchedules = {
+ const mockObstacles = {
name: 'User1',
- schedules: [{ id: 1, name: 'Schedule 1' }],
+ obstacles: [
+ { name: 'Schedule 1', type: OBSTACLE_TYPES.oncallSchedules },
+ { name: 'Policy 1', type: OBSTACLE_TYPES.escalationPolicies },
+ ],
};
let wrapper;
@@ -44,18 +48,18 @@ describe('RemoveMemberModal', () => {
const findForm = () => wrapper.find({ ref: 'form' });
const findGlModal = () => wrapper.findComponent(GlModal);
- const findOnCallSchedulesList = () => wrapper.findComponent(OncallSchedulesList);
+ const findUserDeletionObstaclesList = () => wrapper.findComponent(UserDeletionObstaclesList);
afterEach(() => {
wrapper.destroy();
});
describe.each`
- state | memberType | isAccessRequest | isInvite | actionText | removeSubMembershipsCheckboxExpected | unassignIssuablesCheckboxExpected | message | onCallSchedules
- ${'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?'} | ${{}}
- ${'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?'} | ${mockSchedules}
- ${'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?"} | ${{}}
- ${'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?'} | ${mockSchedules}
+ 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}
`(
'when $state',
({
@@ -66,7 +70,8 @@ describe('RemoveMemberModal', () => {
message,
removeSubMembershipsCheckboxExpected,
unassignIssuablesCheckboxExpected,
- onCallSchedules,
+ userDeletionObstacles,
+ isPartOfOncall,
}) => {
beforeEach(() => {
createComponent({
@@ -75,12 +80,10 @@ describe('RemoveMemberModal', () => {
message,
memberPath,
memberType,
- onCallSchedules,
+ userDeletionObstacles,
});
});
- const isPartOfOncallSchedules = Boolean(isAccessRequest && onCallSchedules.schedules?.length);
-
it(`has the title ${actionText}`, () => {
expect(findGlModal().attributes('title')).toBe(actionText);
});
@@ -109,8 +112,8 @@ describe('RemoveMemberModal', () => {
);
});
- it(`shows ${isPartOfOncallSchedules ? 'all' : 'no'} related on-call schedules`, () => {
- expect(findOnCallSchedulesList().exists()).toBe(isPartOfOncallSchedules);
+ it(`shows ${isPartOfOncall ? 'all' : 'no'} related on-call schedules or policies`, () => {
+ expect(findUserDeletionObstaclesList().exists()).toBe(isPartOfOncall);
});
it('submits the form when the modal is submitted', () => {
diff --git a/spec/frontend/members/components/table/expires_at_spec.js b/spec/frontend/members/components/table/expires_at_spec.js
deleted file mode 100644
index 2b8e6ab8f2a..00000000000
--- a/spec/frontend/members/components/table/expires_at_spec.js
+++ /dev/null
@@ -1,86 +0,0 @@
-import { within } from '@testing-library/dom';
-import { mount, createWrapper } from '@vue/test-utils';
-import { useFakeDate } from 'helpers/fake_date';
-import { createMockDirective, getBinding } from 'helpers/vue_mock_directive';
-import ExpiresAt from '~/members/components/table/expires_at.vue';
-
-describe('ExpiresAt', () => {
- // March 15th, 2020
- useFakeDate(2020, 2, 15);
-
- let wrapper;
-
- const createComponent = (propsData) => {
- wrapper = mount(ExpiresAt, {
- propsData,
- directives: {
- GlTooltip: createMockDirective(),
- },
- });
- };
-
- const getByText = (text, options) =>
- createWrapper(within(wrapper.element).getByText(text, options));
-
- const getTooltipDirective = (elementWrapper) => getBinding(elementWrapper.element, 'gl-tooltip');
-
- afterEach(() => {
- wrapper.destroy();
- });
-
- describe('when no expiration date is set', () => {
- it('displays "No expiration set"', () => {
- createComponent({ date: null });
-
- expect(getByText('No expiration set').exists()).toBe(true);
- });
- });
-
- describe('when expiration date is in the past', () => {
- let expiredText;
-
- beforeEach(() => {
- createComponent({ date: '2019-03-15T00:00:00.000' });
-
- expiredText = getByText('Expired');
- });
-
- it('displays "Expired"', () => {
- expect(expiredText.exists()).toBe(true);
- expect(expiredText.classes()).toContain('gl-text-red-500');
- });
-
- it('displays tooltip with formatted date', () => {
- const tooltipDirective = getTooltipDirective(expiredText);
-
- expect(tooltipDirective).not.toBeUndefined();
- expect(expiredText.attributes('title')).toBe('Mar 15, 2019 12:00am UTC');
- });
- });
-
- describe('when expiration date is in the future', () => {
- it.each`
- date | expected | warningColor
- ${'2020-03-23T00:00:00.000'} | ${'in 8 days'} | ${false}
- ${'2020-03-20T00:00:00.000'} | ${'in 5 days'} | ${true}
- ${'2020-03-16T00:00:00.000'} | ${'in 1 day'} | ${true}
- ${'2020-03-15T05:00:00.000'} | ${'in about 5 hours'} | ${true}
- ${'2020-03-15T01:00:00.000'} | ${'in about 1 hour'} | ${true}
- ${'2020-03-15T00:30:00.000'} | ${'in 30 minutes'} | ${true}
- ${'2020-03-15T00:01:15.000'} | ${'in 1 minute'} | ${true}
- ${'2020-03-15T00:00:15.000'} | ${'in less than a minute'} | ${true}
- `('displays "$expected"', ({ date, expected, warningColor }) => {
- createComponent({ date });
-
- const expiredText = getByText(expected);
-
- expect(expiredText.exists()).toBe(true);
-
- if (warningColor) {
- expect(expiredText.classes()).toContain('gl-text-orange-500');
- } else {
- expect(expiredText.classes()).not.toContain('gl-text-orange-500');
- }
- });
- });
-});
diff --git a/spec/frontend/members/components/table/members_table_spec.js b/spec/frontend/members/components/table/members_table_spec.js
index 6885da53b26..580e5edd652 100644
--- a/spec/frontend/members/components/table/members_table_spec.js
+++ b/spec/frontend/members/components/table/members_table_spec.js
@@ -1,22 +1,24 @@
import { GlBadge, GlPagination, GlTable } from '@gitlab/ui';
-import {
- getByText as getByTextHelper,
- getByTestId as getByTestIdHelper,
- within,
-} from '@testing-library/dom';
-import { mount, createLocalVue, createWrapper } from '@vue/test-utils';
+import { createLocalVue } from '@vue/test-utils';
import Vuex from 'vuex';
import setWindowLocation from 'helpers/set_window_location_helper';
-import { extendedWrapper } from 'helpers/vue_test_utils_helper';
+import { mountExtended, extendedWrapper } from 'helpers/vue_test_utils_helper';
import CreatedAt from '~/members/components/table/created_at.vue';
import ExpirationDatepicker from '~/members/components/table/expiration_datepicker.vue';
-import ExpiresAt from '~/members/components/table/expires_at.vue';
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 MembersTable from '~/members/components/table/members_table.vue';
import RoleDropdown from '~/members/components/table/role_dropdown.vue';
-import { MEMBER_TYPES, TAB_QUERY_PARAM_VALUES } from '~/members/constants';
+import {
+ MEMBER_TYPES,
+ MEMBER_STATE_CREATED,
+ MEMBER_STATE_AWAITING,
+ MEMBER_STATE_ACTIVE,
+ USER_STATE_BLOCKED_PENDING_APPROVAL,
+ BADGE_LABELS_PENDING_OWNER_APPROVAL,
+ TAB_QUERY_PARAM_VALUES,
+} from '~/members/constants';
import * as initUserPopovers from '~/user_popovers';
import {
member as memberMock,
@@ -53,7 +55,7 @@ describe('MembersTable', () => {
};
const createComponent = (state, provide = {}) => {
- wrapper = mount(MembersTable, {
+ wrapper = mountExtended(MembersTable, {
localVue,
propsData: {
tabQueryParamValue: TAB_QUERY_PARAM_VALUES.invite,
@@ -68,7 +70,6 @@ describe('MembersTable', () => {
stubs: [
'member-avatar',
'member-source',
- 'expires-at',
'created-at',
'member-action-buttons',
'role-dropdown',
@@ -81,17 +82,11 @@ describe('MembersTable', () => {
const url = 'https://localhost/foo-bar/-/project_members?tab=invited';
- const getByText = (text, options) =>
- createWrapper(getByTextHelper(wrapper.element, text, options));
-
- const getByTestId = (id, options) =>
- createWrapper(getByTestIdHelper(wrapper.element, id, options));
-
const findTable = () => wrapper.find(GlTable);
const findTableCellByMemberId = (tableCellLabel, memberId) =>
- getByTestId(`members-table-row-${memberId}`).find(
- `[data-label="${tableCellLabel}"][role="cell"]`,
- );
+ wrapper
+ .findByTestId(`members-table-row-${memberId}`)
+ .find(`[data-label="${tableCellLabel}"][role="cell"]`);
const findPagination = () => extendedWrapper(wrapper.find(GlPagination));
@@ -103,7 +98,6 @@ describe('MembersTable', () => {
afterEach(() => {
wrapper.destroy();
- wrapper = null;
});
describe('fields', () => {
@@ -119,7 +113,6 @@ describe('MembersTable', () => {
${'granted'} | ${'Access granted'} | ${memberMock} | ${CreatedAt}
${'invited'} | ${'Invited'} | ${invite} | ${CreatedAt}
${'requested'} | ${'Requested'} | ${accessRequest} | ${CreatedAt}
- ${'expires'} | ${'Access expires'} | ${memberMock} | ${ExpiresAt}
${'maxRole'} | ${'Max role'} | ${memberCanUpdate} | ${RoleDropdown}
${'expiration'} | ${'Expiration'} | ${memberMock} | ${ExpirationDatepicker}
`('renders the $label field', ({ field, label, member, expectedComponent }) => {
@@ -128,7 +121,7 @@ describe('MembersTable', () => {
tableFields: [field],
});
- expect(getByText(label, { selector: '[role="columnheader"]' }).exists()).toBe(true);
+ expect(wrapper.findByText(label, { selector: '[role="columnheader"]' }).exists()).toBe(true);
if (expectedComponent) {
expect(
@@ -137,11 +130,50 @@ describe('MembersTable', () => {
}
});
+ describe('Invited column', () => {
+ describe.each`
+ state | userState | expectedBadgeLabel
+ ${MEMBER_STATE_CREATED} | ${null} | ${''}
+ ${MEMBER_STATE_CREATED} | ${USER_STATE_BLOCKED_PENDING_APPROVAL} | ${BADGE_LABELS_PENDING_OWNER_APPROVAL}
+ ${MEMBER_STATE_AWAITING} | ${''} | ${''}
+ ${MEMBER_STATE_AWAITING} | ${USER_STATE_BLOCKED_PENDING_APPROVAL} | ${BADGE_LABELS_PENDING_OWNER_APPROVAL}
+ ${MEMBER_STATE_AWAITING} | ${'something_else'} | ${BADGE_LABELS_PENDING_OWNER_APPROVAL}
+ ${MEMBER_STATE_ACTIVE} | ${null} | ${''}
+ ${MEMBER_STATE_ACTIVE} | ${'something_else'} | ${''}
+ `('Invited Badge', ({ state, userState, expectedBadgeLabel }) => {
+ it(`${
+ expectedBadgeLabel ? 'shows' : 'hides'
+ } invited badge if user status: '${userState}' and member state: '${state}'`, () => {
+ createComponent({
+ members: [
+ {
+ ...invite,
+ state,
+ invite: {
+ ...invite.invite,
+ userState,
+ },
+ },
+ ],
+ tableFields: ['invited'],
+ });
+
+ const invitedTab = wrapper.findByTestId('invited-badge');
+
+ if (expectedBadgeLabel) {
+ expect(invitedTab.text()).toBe(expectedBadgeLabel);
+ } else {
+ expect(invitedTab.exists()).toBe(false);
+ }
+ });
+ });
+ });
+
describe('"Actions" field', () => {
it('renders "Actions" field for screen readers', () => {
createComponent({ members: [memberCanUpdate], tableFields: ['actions'] });
- const actionField = getByTestId('col-actions');
+ const actionField = wrapper.findByTestId('col-actions');
expect(actionField.exists()).toBe(true);
expect(actionField.classes('gl-sr-only')).toBe(true);
@@ -154,7 +186,7 @@ describe('MembersTable', () => {
it('does not render the "Actions" field', () => {
createComponent({ tableFields: ['actions'] }, { currentUserId: null });
- expect(within(wrapper.element).queryByTestId('col-actions')).toBe(null);
+ expect(wrapper.findByTestId('col-actions').exists()).toBe(false);
});
});
@@ -177,7 +209,7 @@ describe('MembersTable', () => {
it('renders the "Actions" field', () => {
createComponent({ members, tableFields: ['actions'] });
- expect(getByTestId('col-actions').exists()).toBe(true);
+ expect(wrapper.findByTestId('col-actions').exists()).toBe(true);
expect(findTableCellByMemberId('Actions', members[0].id).classes()).toStrictEqual([
'col-actions',
@@ -199,7 +231,7 @@ describe('MembersTable', () => {
it('does not render the "Actions" field', () => {
createComponent({ members, tableFields: ['actions'] });
- expect(within(wrapper.element).queryByTestId('col-actions')).toBe(null);
+ expect(wrapper.findByTestId('col-actions').exists()).toBe(false);
});
});
});
@@ -209,7 +241,7 @@ describe('MembersTable', () => {
it('displays a "No members found" message', () => {
createComponent();
- expect(getByText('No members found').exists()).toBe(true);
+ expect(wrapper.findByText('No members found').exists()).toBe(true);
});
});
diff --git a/spec/frontend/members/mock_data.js b/spec/frontend/members/mock_data.js
index eb9f905fea2..f42ee295511 100644
--- a/spec/frontend/members/mock_data.js
+++ b/spec/frontend/members/mock_data.js
@@ -1,4 +1,4 @@
-import { MEMBER_TYPES } from '~/members/constants';
+import { MEMBER_TYPES, MEMBER_STATE_CREATED } from '~/members/constants';
export const member = {
requestedAt: null,
@@ -14,6 +14,7 @@ export const member = {
webUrl: 'https://gitlab.com/groups/foo-bar',
},
type: 'GroupMember',
+ state: MEMBER_STATE_CREATED,
user: {
id: 123,
name: 'Administrator',
@@ -23,6 +24,7 @@ export const member = {
blocked: false,
twoFactorEnabled: false,
oncallSchedules: [{ name: 'schedule 1' }],
+ escalationPolicies: [{ name: 'policy 1' }],
},
id: 238,
createdAt: '2020-07-17T16:22:46.923Z',
@@ -63,12 +65,13 @@ export const modalData = {
memberPath: '/groups/foo-bar/-/group_members/1',
memberType: 'GroupMember',
message: 'Are you sure you want to remove John Smith?',
- oncallSchedules: { name: 'user', schedules: [] },
+ userDeletionObstacles: { name: 'user', obstacles: [] },
};
const { user, ...memberNoUser } = member;
export const invite = {
...memberNoUser,
+ state: MEMBER_STATE_CREATED,
invite: {
email: 'jewel@hudsonwalter.biz',
avatarUrl: 'https://www.gravatar.com/avatar/cbab7510da7eec2f60f638261b05436d?s=80&d=identicon',
diff --git a/spec/frontend/monitoring/components/__snapshots__/dashboard_template_spec.js.snap b/spec/frontend/monitoring/components/__snapshots__/dashboard_template_spec.js.snap
index 05538dbaeee..47b6c463377 100644
--- a/spec/frontend/monitoring/components/__snapshots__/dashboard_template_spec.js.snap
+++ b/spec/frontend/monitoring/components/__snapshots__/dashboard_template_spec.js.snap
@@ -37,6 +37,7 @@ exports[`Dashboard template matches the default snapshot 1`] = `
category="primary"
class="flex-grow-1"
clearalltext="Clear all"
+ clearalltextclass="gl-px-5"
data-qa-selector="environments_dropdown"
headertext=""
hideheaderborder="true"
@@ -44,7 +45,6 @@ exports[`Dashboard template matches the default snapshot 1`] = `
highlighteditemstitleclass="gl-px-5"
id="monitor-environments-dropdown"
menu-class="monitor-environment-dropdown-menu"
- showhighlighteditemstitle="true"
size="medium"
text="production"
toggleclass="dropdown-menu-toggle"
diff --git a/spec/frontend/monitoring/fixture_data.js b/spec/frontend/monitoring/fixture_data.js
index d20a111c701..6a19815883a 100644
--- a/spec/frontend/monitoring/fixture_data.js
+++ b/spec/frontend/monitoring/fixture_data.js
@@ -1,3 +1,4 @@
+import fixture from 'test_fixtures/metrics_dashboard/environment_metrics_dashboard.json';
import { convertObjectPropsToCamelCase } from '~/lib/utils/common_utils';
import { metricStates } from '~/monitoring/constants';
import { mapToDashboardViewModel } from '~/monitoring/stores/utils';
@@ -5,10 +6,7 @@ import { stateAndPropsFromDataset } from '~/monitoring/utils';
import { metricsResult } from './mock_data';
-// Use globally available `getJSONFixture` so this file can be imported by both karma and jest specs
-export const metricsDashboardResponse = getJSONFixture(
- 'metrics_dashboard/environment_metrics_dashboard.json',
-);
+export const metricsDashboardResponse = fixture;
export const metricsDashboardPayload = metricsDashboardResponse.dashboard;
diff --git a/spec/frontend/namespace_select_spec.js b/spec/frontend/namespace_select_spec.js
deleted file mode 100644
index a38508dd601..00000000000
--- a/spec/frontend/namespace_select_spec.js
+++ /dev/null
@@ -1,65 +0,0 @@
-import initDeprecatedJQueryDropdown from '~/deprecated_jquery_dropdown';
-import NamespaceSelect from '~/namespace_select';
-
-jest.mock('~/deprecated_jquery_dropdown');
-
-describe('NamespaceSelect', () => {
- it('initializes deprecatedJQueryDropdown', () => {
- const dropdown = document.createElement('div');
-
- // eslint-disable-next-line no-new
- new NamespaceSelect({ dropdown });
-
- expect(initDeprecatedJQueryDropdown).toHaveBeenCalled();
- });
-
- describe('as input', () => {
- let deprecatedJQueryDropdownOptions;
-
- beforeEach(() => {
- const dropdown = document.createElement('div');
- // eslint-disable-next-line no-new
- new NamespaceSelect({ dropdown });
- [[, deprecatedJQueryDropdownOptions]] = initDeprecatedJQueryDropdown.mock.calls;
- });
-
- it('prevents click events', () => {
- const dummyEvent = new Event('dummy');
- jest.spyOn(dummyEvent, 'preventDefault').mockImplementation(() => {});
-
- // expect(foo).toContain('test');
- deprecatedJQueryDropdownOptions.clicked({ e: dummyEvent });
-
- expect(dummyEvent.preventDefault).toHaveBeenCalled();
- });
- });
-
- describe('as filter', () => {
- let deprecatedJQueryDropdownOptions;
-
- beforeEach(() => {
- const dropdown = document.createElement('div');
- dropdown.dataset.isFilter = 'true';
- // eslint-disable-next-line no-new
- new NamespaceSelect({ dropdown });
- [[, deprecatedJQueryDropdownOptions]] = initDeprecatedJQueryDropdown.mock.calls;
- });
-
- it('does not prevent click events', () => {
- const dummyEvent = new Event('dummy');
- jest.spyOn(dummyEvent, 'preventDefault').mockImplementation(() => {});
-
- deprecatedJQueryDropdownOptions.clicked({ e: dummyEvent });
-
- expect(dummyEvent.preventDefault).not.toHaveBeenCalled();
- });
-
- it('sets URL of dropdown items', () => {
- const dummyNamespace = { id: 'eal' };
-
- const itemUrl = deprecatedJQueryDropdownOptions.url(dummyNamespace);
-
- expect(itemUrl).toContain(`namespace_id=${dummyNamespace.id}`);
- });
- });
-});
diff --git a/spec/frontend/notebook/cells/code_spec.js b/spec/frontend/notebook/cells/code_spec.js
index e14767f2594..669bdc2f89a 100644
--- a/spec/frontend/notebook/cells/code_spec.js
+++ b/spec/frontend/notebook/cells/code_spec.js
@@ -1,14 +1,17 @@
import Vue from 'vue';
+import fixture from 'test_fixtures/blob/notebook/basic.json';
import CodeComponent from '~/notebook/cells/code.vue';
const Component = Vue.extend(CodeComponent);
describe('Code component', () => {
let vm;
+
let json;
beforeEach(() => {
- json = getJSONFixture('blob/notebook/basic.json');
+ // Clone fixture as it could be modified by tests
+ json = JSON.parse(JSON.stringify(fixture));
});
const setupComponent = (cell) => {
diff --git a/spec/frontend/notebook/cells/markdown_spec.js b/spec/frontend/notebook/cells/markdown_spec.js
index 707efa21528..36b1e91f15f 100644
--- a/spec/frontend/notebook/cells/markdown_spec.js
+++ b/spec/frontend/notebook/cells/markdown_spec.js
@@ -1,6 +1,9 @@
import { mount } from '@vue/test-utils';
import katex from 'katex';
import Vue from 'vue';
+import markdownTableJson from 'test_fixtures/blob/notebook/markdown-table.json';
+import basicJson from 'test_fixtures/blob/notebook/basic.json';
+import mathJson from 'test_fixtures/blob/notebook/math.json';
import MarkdownComponent from '~/notebook/cells/markdown.vue';
const Component = Vue.extend(MarkdownComponent);
@@ -35,7 +38,7 @@ describe('Markdown component', () => {
let json;
beforeEach(() => {
- json = getJSONFixture('blob/notebook/basic.json');
+ json = basicJson;
// eslint-disable-next-line prefer-destructuring
cell = json.cells[1];
@@ -104,7 +107,7 @@ describe('Markdown component', () => {
describe('tables', () => {
beforeEach(() => {
- json = getJSONFixture('blob/notebook/markdown-table.json');
+ json = markdownTableJson;
});
it('renders images and text', () => {
@@ -135,7 +138,7 @@ describe('Markdown component', () => {
describe('katex', () => {
beforeEach(() => {
- json = getJSONFixture('blob/notebook/math.json');
+ json = mathJson;
});
it('renders multi-line katex', async () => {
diff --git a/spec/frontend/notebook/cells/output/index_spec.js b/spec/frontend/notebook/cells/output/index_spec.js
index 2985abf0f4f..7ece73d375c 100644
--- a/spec/frontend/notebook/cells/output/index_spec.js
+++ b/spec/frontend/notebook/cells/output/index_spec.js
@@ -1,11 +1,11 @@
import Vue from 'vue';
+import json from 'test_fixtures/blob/notebook/basic.json';
import CodeComponent from '~/notebook/cells/output/index.vue';
const Component = Vue.extend(CodeComponent);
describe('Output component', () => {
let vm;
- let json;
const createComponent = (output) => {
vm = new Component({
@@ -17,11 +17,6 @@ describe('Output component', () => {
vm.$mount();
};
- beforeEach(() => {
- // This is the output after rendering a jupyter notebook
- json = getJSONFixture('blob/notebook/basic.json');
- });
-
describe('text output', () => {
beforeEach((done) => {
const textType = json.cells[2];
diff --git a/spec/frontend/notebook/index_spec.js b/spec/frontend/notebook/index_spec.js
index 4d0dacaf37e..cd531d628b3 100644
--- a/spec/frontend/notebook/index_spec.js
+++ b/spec/frontend/notebook/index_spec.js
@@ -1,18 +1,13 @@
import { mount } from '@vue/test-utils';
import Vue from 'vue';
+import json from 'test_fixtures/blob/notebook/basic.json';
+import jsonWithWorksheet from 'test_fixtures/blob/notebook/worksheets.json';
import Notebook from '~/notebook/index.vue';
const Component = Vue.extend(Notebook);
describe('Notebook component', () => {
let vm;
- let json;
- let jsonWithWorksheet;
-
- beforeEach(() => {
- json = getJSONFixture('blob/notebook/basic.json');
- jsonWithWorksheet = getJSONFixture('blob/notebook/worksheets.json');
- });
function buildComponent(notebook) {
return mount(Component, {
diff --git a/spec/frontend/notes/components/comment_type_dropdown_spec.js b/spec/frontend/notes/components/comment_type_dropdown_spec.js
index 5e1cb813369..8ac6144e5c8 100644
--- a/spec/frontend/notes/components/comment_type_dropdown_spec.js
+++ b/spec/frontend/notes/components/comment_type_dropdown_spec.js
@@ -47,8 +47,18 @@ describe('CommentTypeDropdown component', () => {
it('Should emit `change` event when clicking on an alternate dropdown option', () => {
mountComponent({ props: { noteType: constants.DISCUSSION } });
- findCommentDropdownOption().vm.$emit('click');
- findDiscussionDropdownOption().vm.$emit('click');
+ const event = {
+ type: 'click',
+ stopPropagation: jest.fn(),
+ preventDefault: jest.fn(),
+ };
+
+ findCommentDropdownOption().vm.$emit('click', event);
+ findDiscussionDropdownOption().vm.$emit('click', event);
+
+ // ensure the native events don't trigger anything
+ expect(event.stopPropagation).toHaveBeenCalledTimes(2);
+ expect(event.preventDefault).toHaveBeenCalledTimes(2);
expect(wrapper.emitted('change')[0]).toEqual([constants.COMMENT]);
expect(wrapper.emitted('change').length).toEqual(1);
diff --git a/spec/frontend/notes/components/diff_with_note_spec.js b/spec/frontend/notes/components/diff_with_note_spec.js
index e997fc4da50..c352265654b 100644
--- a/spec/frontend/notes/components/diff_with_note_spec.js
+++ b/spec/frontend/notes/components/diff_with_note_spec.js
@@ -1,10 +1,9 @@
import { shallowMount } from '@vue/test-utils';
+import discussionFixture from 'test_fixtures/merge_requests/diff_discussion.json';
+import imageDiscussionFixture from 'test_fixtures/merge_requests/image_diff_discussion.json';
import { createStore } from '~/mr_notes/stores';
import DiffWithNote from '~/notes/components/diff_with_note.vue';
-const discussionFixture = 'merge_requests/diff_discussion.json';
-const imageDiscussionFixture = 'merge_requests/image_diff_discussion.json';
-
describe('diff_with_note', () => {
let store;
let wrapper;
@@ -35,7 +34,7 @@ describe('diff_with_note', () => {
describe('text diff', () => {
beforeEach(() => {
- const diffDiscussion = getJSONFixture(discussionFixture)[0];
+ const diffDiscussion = discussionFixture[0];
wrapper = shallowMount(DiffWithNote, {
propsData: {
@@ -75,7 +74,7 @@ describe('diff_with_note', () => {
describe('image diff', () => {
beforeEach(() => {
- const imageDiscussion = getJSONFixture(imageDiscussionFixture)[0];
+ const imageDiscussion = imageDiscussionFixture[0];
wrapper = shallowMount(DiffWithNote, {
propsData: { discussion: imageDiscussion, diffFile: {} },
store,
diff --git a/spec/frontend/notes/components/note_form_spec.js b/spec/frontend/notes/components/note_form_spec.js
index 92137d3190f..abc888cd245 100644
--- a/spec/frontend/notes/components/note_form_spec.js
+++ b/spec/frontend/notes/components/note_form_spec.js
@@ -150,6 +150,16 @@ describe('issue_note_form component', () => {
expect(handleFormUpdate.length).toBe(1);
});
+
+ it('should disable textarea when ctrl+enter is pressed', async () => {
+ textarea.trigger('keydown.enter', { ctrlKey: true });
+
+ expect(textarea.attributes('disabled')).toBeUndefined();
+
+ await nextTick();
+
+ expect(textarea.attributes('disabled')).toBe('disabled');
+ });
});
});
diff --git a/spec/frontend/notes/components/noteable_discussion_spec.js b/spec/frontend/notes/components/noteable_discussion_spec.js
index a364a524e7b..727ef02dcbb 100644
--- a/spec/frontend/notes/components/noteable_discussion_spec.js
+++ b/spec/frontend/notes/components/noteable_discussion_spec.js
@@ -1,5 +1,6 @@
import { mount } from '@vue/test-utils';
import { nextTick } from 'vue';
+import discussionWithTwoUnresolvedNotes from 'test_fixtures/merge_requests/resolved_diff_discussion.json';
import { trimText } from 'helpers/text_helper';
import mockDiffFile from 'jest/diffs/mock_data/diff_file';
import DiscussionNotes from '~/notes/components/discussion_notes.vue';
@@ -17,8 +18,6 @@ import {
userDataMock,
} from '../mock_data';
-const discussionWithTwoUnresolvedNotes = 'merge_requests/resolved_diff_discussion.json';
-
describe('noteable_discussion component', () => {
let store;
let wrapper;
@@ -119,7 +118,7 @@ describe('noteable_discussion component', () => {
describe('for resolved thread', () => {
beforeEach(() => {
- const discussion = getJSONFixture(discussionWithTwoUnresolvedNotes)[0];
+ const discussion = discussionWithTwoUnresolvedNotes[0];
wrapper.setProps({ discussion });
});
@@ -133,7 +132,7 @@ describe('noteable_discussion component', () => {
describe('for unresolved thread', () => {
beforeEach(() => {
const discussion = {
- ...getJSONFixture(discussionWithTwoUnresolvedNotes)[0],
+ ...discussionWithTwoUnresolvedNotes[0],
expanded: true,
};
discussion.resolved = false;
diff --git a/spec/frontend/notes/components/noteable_note_spec.js b/spec/frontend/notes/components/noteable_note_spec.js
index 467a8bec21b..038aff3be04 100644
--- a/spec/frontend/notes/components/noteable_note_spec.js
+++ b/spec/frontend/notes/components/noteable_note_spec.js
@@ -189,6 +189,27 @@ describe('issue_note', () => {
createWrapper();
});
+ describe('avatar sizes in diffs', () => {
+ const line = {
+ line_code: 'abc_1_1',
+ type: null,
+ old_line: '1',
+ new_line: '1',
+ };
+
+ it('should render 24px avatars', async () => {
+ wrapper.setProps({
+ note: { ...note },
+ discussionRoot: true,
+ line,
+ });
+
+ await wrapper.vm.$nextTick();
+
+ expect(wrapper.findComponent(UserAvatarLink).props('imgSize')).toBe(24);
+ });
+ });
+
it('should render user information', () => {
const { author } = note;
const avatar = wrapper.findComponent(UserAvatarLink);
diff --git a/spec/frontend/notes/stores/getters_spec.js b/spec/frontend/notes/stores/getters_spec.js
index 3adb5da020e..9a11fdba508 100644
--- a/spec/frontend/notes/stores/getters_spec.js
+++ b/spec/frontend/notes/stores/getters_spec.js
@@ -1,3 +1,4 @@
+import discussionWithTwoUnresolvedNotes from 'test_fixtures/merge_requests/resolved_diff_discussion.json';
import { DESC, ASC } from '~/notes/constants';
import * as getters from '~/notes/stores/getters';
import {
@@ -17,8 +18,6 @@ import {
draftDiffDiscussion,
} from '../mock_data';
-const discussionWithTwoUnresolvedNotes = 'merge_requests/resolved_diff_discussion.json';
-
// Helper function to ensure that we're using the same schema across tests.
const createDiscussionNeighborParams = (discussionId, diffOrder, step) => ({
discussionId,
@@ -123,7 +122,7 @@ describe('Getters Notes Store', () => {
describe('resolvedDiscussionsById', () => {
it('ignores unresolved system notes', () => {
- const [discussion] = getJSONFixture(discussionWithTwoUnresolvedNotes);
+ const [discussion] = discussionWithTwoUnresolvedNotes;
discussion.notes[0].resolved = true;
discussion.notes[1].resolved = false;
state.discussions.push(discussion);
diff --git a/spec/frontend/oauth_remember_me_spec.js b/spec/frontend/oauth_remember_me_spec.js
index 70bda1d9f9e..3187cbf6547 100644
--- a/spec/frontend/oauth_remember_me_spec.js
+++ b/spec/frontend/oauth_remember_me_spec.js
@@ -3,7 +3,7 @@ import OAuthRememberMe from '~/pages/sessions/new/oauth_remember_me';
describe('OAuthRememberMe', () => {
const findFormAction = (selector) => {
- return $(`#oauth-container .oauth-login${selector}`).parent('form').attr('action');
+ return $(`#oauth-container .js-oauth-login${selector}`).parent('form').attr('action');
};
beforeEach(() => {
diff --git a/spec/frontend/packages/details/components/__snapshots__/conan_installation_spec.js.snap b/spec/frontend/packages/details/components/__snapshots__/conan_installation_spec.js.snap
deleted file mode 100644
index a3423e3f4d7..00000000000
--- a/spec/frontend/packages/details/components/__snapshots__/conan_installation_spec.js.snap
+++ /dev/null
@@ -1,36 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`ConanInstallation renders all the messages 1`] = `
-<div>
- <installation-title-stub
- options="[object Object]"
- packagetype="conan"
- />
-
- <code-instruction-stub
- copytext="Copy Conan Command"
- instruction="foo/command"
- label="Conan Command"
- trackingaction="copy_conan_command"
- trackinglabel="code_instruction"
- />
-
- <h3
- class="gl-font-lg"
- >
- Registry setup
- </h3>
-
- <code-instruction-stub
- copytext="Copy Conan Setup Command"
- instruction="foo/setup"
- label="Add Conan Remote"
- trackingaction="copy_conan_setup_command"
- trackinglabel="code_instruction"
- />
-
- <gl-sprintf-stub
- message="For more information on the Conan registry, %{linkStart}see the documentation%{linkEnd}."
- />
-</div>
-`;
diff --git a/spec/frontend/packages/details/components/__snapshots__/dependency_row_spec.js.snap b/spec/frontend/packages/details/components/__snapshots__/dependency_row_spec.js.snap
deleted file mode 100644
index 39469bf4fd0..00000000000
--- a/spec/frontend/packages/details/components/__snapshots__/dependency_row_spec.js.snap
+++ /dev/null
@@ -1,34 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`DependencyRow renders full dependency 1`] = `
-<div
- class="gl-responsive-table-row"
->
- <div
- class="table-section section-50"
- >
- <strong
- class="gl-text-body"
- >
- Test.Dependency
- </strong>
-
- <span
- data-testid="target-framework"
- >
- (.NETStandard2.0)
- </span>
- </div>
-
- <div
- class="table-section section-50 gl-display-flex gl-md-justify-content-end"
- data-testid="version-pattern"
- >
- <span
- class="gl-text-body"
- >
- 2.3.7
- </span>
- </div>
-</div>
-`;
diff --git a/spec/frontend/packages/details/components/__snapshots__/maven_installation_spec.js.snap b/spec/frontend/packages/details/components/__snapshots__/maven_installation_spec.js.snap
deleted file mode 100644
index 8a2793c0010..00000000000
--- a/spec/frontend/packages/details/components/__snapshots__/maven_installation_spec.js.snap
+++ /dev/null
@@ -1,112 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`MavenInstallation groovy renders all the messages 1`] = `
-<div>
- <installation-title-stub
- options="[object Object],[object Object],[object Object]"
- packagetype="maven"
- />
-
- <code-instruction-stub
- class="gl-mb-5"
- copytext="Copy Gradle Groovy DSL install command"
- instruction="foo/gradle/groovy/install"
- label="Gradle Groovy DSL install command"
- trackingaction="copy_gradle_install_command"
- trackinglabel="code_instruction"
- />
-
- <code-instruction-stub
- copytext="Copy add Gradle Groovy DSL repository command"
- instruction="foo/gradle/groovy/add/source"
- label="Add Gradle Groovy DSL repository command"
- multiline="true"
- trackingaction="copy_gradle_add_to_source_command"
- trackinglabel="code_instruction"
- />
-</div>
-`;
-
-exports[`MavenInstallation kotlin renders all the messages 1`] = `
-<div>
- <installation-title-stub
- options="[object Object],[object Object],[object Object]"
- packagetype="maven"
- />
-
- <code-instruction-stub
- class="gl-mb-5"
- copytext="Copy Gradle Kotlin DSL install command"
- instruction="foo/gradle/kotlin/install"
- label="Gradle Kotlin DSL install command"
- trackingaction="copy_kotlin_install_command"
- trackinglabel="code_instruction"
- />
-
- <code-instruction-stub
- copytext="Copy add Gradle Kotlin DSL repository command"
- instruction="foo/gradle/kotlin/add/source"
- label="Add Gradle Kotlin DSL repository command"
- multiline="true"
- trackingaction="copy_kotlin_add_to_source_command"
- trackinglabel="code_instruction"
- />
-</div>
-`;
-
-exports[`MavenInstallation maven renders all the messages 1`] = `
-<div>
- <installation-title-stub
- options="[object Object],[object Object],[object Object]"
- packagetype="maven"
- />
-
- <p>
- <gl-sprintf-stub
- message="Copy and paste this inside your %{codeStart}pom.xml%{codeEnd} %{codeStart}dependencies%{codeEnd} block."
- />
- </p>
-
- <code-instruction-stub
- copytext="Copy Maven XML"
- instruction="foo/xml"
- label=""
- multiline="true"
- trackingaction="copy_maven_xml"
- trackinglabel="code_instruction"
- />
-
- <code-instruction-stub
- copytext="Copy Maven command"
- instruction="foo/command"
- label="Maven Command"
- trackingaction="copy_maven_command"
- trackinglabel="code_instruction"
- />
-
- <h3
- class="gl-font-lg"
- >
- Registry setup
- </h3>
-
- <p>
- <gl-sprintf-stub
- message="If you haven't already done so, you will need to add the below to your %{codeStart}pom.xml%{codeEnd} file."
- />
- </p>
-
- <code-instruction-stub
- copytext="Copy Maven registry XML"
- instruction="foo/setup"
- label=""
- multiline="true"
- trackingaction="copy_maven_setup_xml"
- trackinglabel="code_instruction"
- />
-
- <gl-sprintf-stub
- message="For more information on the Maven registry, %{linkStart}see the documentation%{linkEnd}."
- />
-</div>
-`;
diff --git a/spec/frontend/packages/details/components/__snapshots__/npm_installation_spec.js.snap b/spec/frontend/packages/details/components/__snapshots__/npm_installation_spec.js.snap
deleted file mode 100644
index 015c7b94dde..00000000000
--- a/spec/frontend/packages/details/components/__snapshots__/npm_installation_spec.js.snap
+++ /dev/null
@@ -1,36 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`NpmInstallation renders all the messages 1`] = `
-<div>
- <installation-title-stub
- options="[object Object],[object Object]"
- packagetype="npm"
- />
-
- <code-instruction-stub
- copytext="Copy npm command"
- instruction="npm i @Test/package"
- label=""
- trackingaction="copy_npm_install_command"
- trackinglabel="code_instruction"
- />
-
- <h3
- class="gl-font-lg"
- >
- Registry setup
- </h3>
-
- <code-instruction-stub
- copytext="Copy npm setup command"
- instruction="echo @Test:registry=undefined/ >> .npmrc"
- label=""
- trackingaction="copy_npm_setup_command"
- trackinglabel="code_instruction"
- />
-
- <gl-sprintf-stub
- message="You may also need to setup authentication using an auth token. %{linkStart}See the documentation%{linkEnd} to find out more."
- />
-</div>
-`;
diff --git a/spec/frontend/packages/details/components/__snapshots__/nuget_installation_spec.js.snap b/spec/frontend/packages/details/components/__snapshots__/nuget_installation_spec.js.snap
deleted file mode 100644
index 04532743952..00000000000
--- a/spec/frontend/packages/details/components/__snapshots__/nuget_installation_spec.js.snap
+++ /dev/null
@@ -1,36 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`NugetInstallation renders all the messages 1`] = `
-<div>
- <installation-title-stub
- options="[object Object]"
- packagetype="nuget"
- />
-
- <code-instruction-stub
- copytext="Copy NuGet Command"
- instruction="foo/command"
- label="NuGet Command"
- trackingaction="copy_nuget_install_command"
- trackinglabel="code_instruction"
- />
-
- <h3
- class="gl-font-lg"
- >
- Registry setup
- </h3>
-
- <code-instruction-stub
- copytext="Copy NuGet Setup Command"
- instruction="foo/setup"
- label="Add NuGet Source"
- trackingaction="copy_nuget_setup_command"
- trackinglabel="code_instruction"
- />
-
- <gl-sprintf-stub
- message="For more information on the NuGet registry, %{linkStart}see the documentation%{linkEnd}."
- />
-</div>
-`;
diff --git a/spec/frontend/packages/details/components/__snapshots__/package_title_spec.js.snap b/spec/frontend/packages/details/components/__snapshots__/package_title_spec.js.snap
deleted file mode 100644
index 318cea98b92..00000000000
--- a/spec/frontend/packages/details/components/__snapshots__/package_title_spec.js.snap
+++ /dev/null
@@ -1,168 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`PackageTitle renders with tags 1`] = `
-<div
- class="gl-display-flex gl-flex-direction-column"
- data-qa-selector="package_title"
->
- <div
- class="gl-display-flex gl-justify-content-space-between gl-py-3"
- >
- <div
- class="gl-flex-direction-column gl-flex-grow-1"
- >
- <div
- class="gl-display-flex"
- >
- <!---->
-
- <div
- class="gl-display-flex gl-flex-direction-column"
- >
- <h1
- class="gl-font-size-h1 gl-mt-3 gl-mb-2"
- data-testid="title"
- >
- Test package
- </h1>
-
- <div
- class="gl-display-flex gl-align-items-center gl-text-gray-500 gl-mt-1"
- >
- <gl-icon-stub
- class="gl-mr-3"
- name="eye"
- size="16"
- />
-
- <gl-sprintf-stub
- message="v%{version} published %{timeAgo}"
- />
- </div>
- </div>
- </div>
-
- <div
- class="gl-display-flex gl-flex-wrap gl-align-items-center gl-mt-3"
- >
- <div
- class="gl-display-flex gl-align-items-center gl-mr-5"
- >
- <metadata-item-stub
- data-testid="package-type"
- icon="package"
- link=""
- size="s"
- text="maven"
- texttooltip=""
- />
- </div>
- <div
- class="gl-display-flex gl-align-items-center gl-mr-5"
- >
- <metadata-item-stub
- data-testid="package-size"
- icon="disk"
- link=""
- size="s"
- text="300 bytes"
- texttooltip=""
- />
- </div>
- <div
- class="gl-display-flex gl-align-items-center gl-mr-5"
- >
- <package-tags-stub
- hidelabel="true"
- tagdisplaylimit="2"
- tags="[object Object],[object Object],[object Object],[object Object]"
- />
- </div>
- </div>
- </div>
-
- <!---->
- </div>
-
- <p />
-</div>
-`;
-
-exports[`PackageTitle renders without tags 1`] = `
-<div
- class="gl-display-flex gl-flex-direction-column"
- data-qa-selector="package_title"
->
- <div
- class="gl-display-flex gl-justify-content-space-between gl-py-3"
- >
- <div
- class="gl-flex-direction-column gl-flex-grow-1"
- >
- <div
- class="gl-display-flex"
- >
- <!---->
-
- <div
- class="gl-display-flex gl-flex-direction-column"
- >
- <h1
- class="gl-font-size-h1 gl-mt-3 gl-mb-2"
- data-testid="title"
- >
- Test package
- </h1>
-
- <div
- class="gl-display-flex gl-align-items-center gl-text-gray-500 gl-mt-1"
- >
- <gl-icon-stub
- class="gl-mr-3"
- name="eye"
- size="16"
- />
-
- <gl-sprintf-stub
- message="v%{version} published %{timeAgo}"
- />
- </div>
- </div>
- </div>
-
- <div
- class="gl-display-flex gl-flex-wrap gl-align-items-center gl-mt-3"
- >
- <div
- class="gl-display-flex gl-align-items-center gl-mr-5"
- >
- <metadata-item-stub
- data-testid="package-type"
- icon="package"
- link=""
- size="s"
- text="maven"
- texttooltip=""
- />
- </div>
- <div
- class="gl-display-flex gl-align-items-center gl-mr-5"
- >
- <metadata-item-stub
- data-testid="package-size"
- icon="disk"
- link=""
- size="s"
- text="300 bytes"
- texttooltip=""
- />
- </div>
- </div>
- </div>
-
- <!---->
- </div>
-
- <p />
-</div>
-`;
diff --git a/spec/frontend/packages/details/components/__snapshots__/pypi_installation_spec.js.snap b/spec/frontend/packages/details/components/__snapshots__/pypi_installation_spec.js.snap
deleted file mode 100644
index d5bb825d8d1..00000000000
--- a/spec/frontend/packages/details/components/__snapshots__/pypi_installation_spec.js.snap
+++ /dev/null
@@ -1,45 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`PypiInstallation renders all the messages 1`] = `
-<div>
- <installation-title-stub
- options="[object Object]"
- packagetype="pypi"
- />
-
- <code-instruction-stub
- copytext="Copy Pip command"
- data-testid="pip-command"
- instruction="pip install"
- label="Pip Command"
- trackingaction="copy_pip_install_command"
- trackinglabel="code_instruction"
- />
-
- <h3
- class="gl-font-lg"
- >
- Registry setup
- </h3>
-
- <p>
- <gl-sprintf-stub
- message="If you haven't already done so, you will need to add the below to your %{codeStart}.pypirc%{codeEnd} file."
- />
- </p>
-
- <code-instruction-stub
- copytext="Copy .pypirc content"
- data-testid="pypi-setup-content"
- instruction="python setup"
- label=""
- multiline="true"
- trackingaction="copy_pypi_setup_command"
- trackinglabel="code_instruction"
- />
-
- <gl-sprintf-stub
- message="For more information on the PyPi registry, %{linkStart}see the documentation%{linkEnd}."
- />
-</div>
-`;
diff --git a/spec/frontend/packages/details/components/additional_metadata_spec.js b/spec/frontend/packages/details/components/additional_metadata_spec.js
deleted file mode 100644
index b339aa84348..00000000000
--- a/spec/frontend/packages/details/components/additional_metadata_spec.js
+++ /dev/null
@@ -1,119 +0,0 @@
-import { GlLink, GlSprintf } from '@gitlab/ui';
-import { shallowMount } from '@vue/test-utils';
-import component from '~/packages/details/components/additional_metadata.vue';
-import DetailsRow from '~/vue_shared/components/registry/details_row.vue';
-
-import { mavenPackage, conanPackage, nugetPackage, npmPackage } from '../../mock_data';
-
-describe('Package Additional Metadata', () => {
- let wrapper;
- const defaultProps = {
- packageEntity: { ...mavenPackage },
- };
-
- const mountComponent = (props) => {
- wrapper = shallowMount(component, {
- propsData: { ...defaultProps, ...props },
- stubs: {
- DetailsRow,
- GlSprintf,
- },
- });
- };
-
- afterEach(() => {
- wrapper.destroy();
- wrapper = null;
- });
-
- const findTitle = () => wrapper.find('[data-testid="title"]');
- const findMainArea = () => wrapper.find('[data-testid="main"]');
- const findNugetSource = () => wrapper.find('[data-testid="nuget-source"]');
- const findNugetLicense = () => wrapper.find('[data-testid="nuget-license"]');
- const findConanRecipe = () => wrapper.find('[data-testid="conan-recipe"]');
- const findMavenApp = () => wrapper.find('[data-testid="maven-app"]');
- const findMavenGroup = () => wrapper.find('[data-testid="maven-group"]');
- const findElementLink = (container) => container.find(GlLink);
-
- it('has the correct title', () => {
- mountComponent();
-
- const title = findTitle();
-
- expect(title.exists()).toBe(true);
- expect(title.text()).toBe('Additional Metadata');
- });
-
- describe.each`
- packageEntity | visible | metadata
- ${mavenPackage} | ${true} | ${'maven_metadatum'}
- ${conanPackage} | ${true} | ${'conan_metadatum'}
- ${nugetPackage} | ${true} | ${'nuget_metadatum'}
- ${npmPackage} | ${false} | ${null}
- `('Component visibility', ({ packageEntity, visible, metadata }) => {
- it(`Is ${visible} that the component markup is visible when the package is ${packageEntity.package_type}`, () => {
- mountComponent({ packageEntity });
-
- expect(findTitle().exists()).toBe(visible);
- expect(findMainArea().exists()).toBe(visible);
- });
-
- it(`The component is hidden if ${metadata} is missing`, () => {
- mountComponent({ packageEntity: { ...packageEntity, [metadata]: null } });
-
- expect(findTitle().exists()).toBe(false);
- expect(findMainArea().exists()).toBe(false);
- });
- });
-
- describe('nuget metadata', () => {
- beforeEach(() => {
- mountComponent({ packageEntity: nugetPackage });
- });
-
- it.each`
- name | finderFunction | text | link | icon
- ${'source'} | ${findNugetSource} | ${'Source project located at project-foo-url'} | ${'project_url'} | ${'project'}
- ${'license'} | ${findNugetLicense} | ${'License information located at license-foo-url'} | ${'license_url'} | ${'license'}
- `('$name element', ({ finderFunction, text, link, icon }) => {
- const element = finderFunction();
- expect(element.exists()).toBe(true);
- expect(element.text()).toBe(text);
- expect(element.props('icon')).toBe(icon);
- expect(findElementLink(element).attributes('href')).toBe(nugetPackage.nuget_metadatum[link]);
- });
- });
-
- describe('conan metadata', () => {
- beforeEach(() => {
- mountComponent({ packageEntity: conanPackage });
- });
-
- it.each`
- name | finderFunction | text | icon
- ${'recipe'} | ${findConanRecipe} | ${'Recipe: conan-package/1.0.0@conan+conan-package/stable'} | ${'information-o'}
- `('$name element', ({ finderFunction, text, icon }) => {
- const element = finderFunction();
- expect(element.exists()).toBe(true);
- expect(element.text()).toBe(text);
- expect(element.props('icon')).toBe(icon);
- });
- });
-
- describe('maven metadata', () => {
- beforeEach(() => {
- mountComponent();
- });
-
- it.each`
- name | finderFunction | text | icon
- ${'app'} | ${findMavenApp} | ${'App name: test-app'} | ${'information-o'}
- ${'group'} | ${findMavenGroup} | ${'App group: com.test.app'} | ${'information-o'}
- `('$name element', ({ finderFunction, text, icon }) => {
- const element = finderFunction();
- expect(element.exists()).toBe(true);
- expect(element.text()).toBe(text);
- expect(element.props('icon')).toBe(icon);
- });
- });
-});
diff --git a/spec/frontend/packages/details/components/app_spec.js b/spec/frontend/packages/details/components/app_spec.js
deleted file mode 100644
index 377e7e05f09..00000000000
--- a/spec/frontend/packages/details/components/app_spec.js
+++ /dev/null
@@ -1,385 +0,0 @@
-import { GlEmptyState } from '@gitlab/ui';
-import { mount, createLocalVue } from '@vue/test-utils';
-import { nextTick } from 'vue';
-import Vuex from 'vuex';
-import { useMockLocationHelper } from 'helpers/mock_window_location_helper';
-import stubChildren from 'helpers/stub_children';
-
-import AdditionalMetadata from '~/packages/details/components/additional_metadata.vue';
-import PackagesApp from '~/packages/details/components/app.vue';
-import DependencyRow from '~/packages/details/components/dependency_row.vue';
-import InstallationCommands from '~/packages/details/components/installation_commands.vue';
-import PackageFiles from '~/packages/details/components/package_files.vue';
-import PackageHistory from '~/packages/details/components/package_history.vue';
-import PackageTitle from '~/packages/details/components/package_title.vue';
-import * as getters from '~/packages/details/store/getters';
-import PackageListRow from '~/packages/shared/components/package_list_row.vue';
-import PackagesListLoader from '~/packages/shared/components/packages_list_loader.vue';
-import { TrackingActions } from '~/packages/shared/constants';
-import * as SharedUtils from '~/packages/shared/utils';
-import Tracking from '~/tracking';
-
-import {
- composerPackage,
- conanPackage,
- mavenPackage,
- mavenFiles,
- npmPackage,
- nugetPackage,
-} from '../../mock_data';
-
-const localVue = createLocalVue();
-localVue.use(Vuex);
-
-useMockLocationHelper();
-
-describe('PackagesApp', () => {
- let wrapper;
- let store;
- const fetchPackageVersions = jest.fn();
- const deletePackage = jest.fn();
- const deletePackageFile = jest.fn();
- const defaultProjectName = 'bar';
-
- function createComponent({
- packageEntity = mavenPackage,
- packageFiles = mavenFiles,
- isLoading = false,
- projectName = defaultProjectName,
- } = {}) {
- store = new Vuex.Store({
- state: {
- isLoading,
- packageEntity,
- packageFiles,
- canDelete: true,
- emptySvgPath: 'empty-illustration',
- npmPath: 'foo',
- npmHelpPath: 'foo',
- projectName,
- projectListUrl: 'project_url',
- groupListUrl: 'group_url',
- },
- actions: {
- deletePackage,
- fetchPackageVersions,
- deletePackageFile,
- },
- getters,
- });
-
- wrapper = mount(PackagesApp, {
- localVue,
- store,
- stubs: {
- ...stubChildren(PackagesApp),
- PackageTitle: false,
- TitleArea: false,
- GlButton: false,
- GlModal: false,
- GlTab: false,
- GlTabs: false,
- GlTable: false,
- },
- });
- }
-
- const packageTitle = () => wrapper.find(PackageTitle);
- const emptyState = () => wrapper.find(GlEmptyState);
- const deleteButton = () => wrapper.find('.js-delete-button');
- const findDeleteModal = () => wrapper.find({ ref: 'deleteModal' });
- const findDeleteFileModal = () => wrapper.find({ ref: 'deleteFileModal' });
- const versionsTab = () => wrapper.find('.js-versions-tab > a');
- const packagesLoader = () => wrapper.find(PackagesListLoader);
- const packagesVersionRows = () => wrapper.findAll(PackageListRow);
- const noVersionsMessage = () => wrapper.find('[data-testid="no-versions-message"]');
- const dependenciesTab = () => wrapper.find('.js-dependencies-tab > a');
- const dependenciesCountBadge = () => wrapper.find('[data-testid="dependencies-badge"]');
- const noDependenciesMessage = () => wrapper.find('[data-testid="no-dependencies-message"]');
- const dependencyRows = () => wrapper.findAll(DependencyRow);
- const findPackageHistory = () => wrapper.find(PackageHistory);
- const findAdditionalMetadata = () => wrapper.find(AdditionalMetadata);
- const findInstallationCommands = () => wrapper.find(InstallationCommands);
- const findPackageFiles = () => wrapper.find(PackageFiles);
-
- afterEach(() => {
- wrapper.destroy();
- });
-
- it('renders the app and displays the package title', async () => {
- createComponent();
-
- await nextTick();
-
- expect(packageTitle().exists()).toBe(true);
- });
-
- it('renders an empty state component when no an invalid package is passed as a prop', () => {
- createComponent({
- packageEntity: {},
- });
-
- expect(emptyState().exists()).toBe(true);
- });
-
- it('package history has the right props', () => {
- createComponent();
- expect(findPackageHistory().exists()).toBe(true);
- expect(findPackageHistory().props('packageEntity')).toEqual(wrapper.vm.packageEntity);
- expect(findPackageHistory().props('projectName')).toEqual(wrapper.vm.projectName);
- });
-
- it('additional metadata has the right props', () => {
- createComponent();
- expect(findAdditionalMetadata().exists()).toBe(true);
- expect(findAdditionalMetadata().props('packageEntity')).toEqual(wrapper.vm.packageEntity);
- });
-
- it('installation commands has the right props', () => {
- createComponent();
- expect(findInstallationCommands().exists()).toBe(true);
- expect(findInstallationCommands().props('packageEntity')).toEqual(wrapper.vm.packageEntity);
- });
-
- it('hides the files table if package type is COMPOSER', () => {
- createComponent({ packageEntity: composerPackage });
- expect(findPackageFiles().exists()).toBe(false);
- });
-
- describe('deleting packages', () => {
- beforeEach(() => {
- createComponent();
- deleteButton().trigger('click');
- });
-
- it('shows the delete confirmation modal when delete is clicked', () => {
- expect(findDeleteModal().exists()).toBe(true);
- });
- });
-
- describe('deleting package files', () => {
- it('shows the delete confirmation modal when delete is clicked', () => {
- createComponent();
- findPackageFiles().vm.$emit('delete-file', mavenFiles[0]);
-
- expect(findDeleteFileModal().exists()).toBe(true);
- });
- });
-
- describe('versions', () => {
- describe('api call', () => {
- beforeEach(() => {
- createComponent();
- });
-
- it('makes api request on first click of tab', () => {
- versionsTab().trigger('click');
-
- expect(fetchPackageVersions).toHaveBeenCalled();
- });
- });
-
- it('displays the loader when state is loading', () => {
- createComponent({ isLoading: true });
-
- expect(packagesLoader().exists()).toBe(true);
- });
-
- it('displays the correct version count when the package has versions', () => {
- createComponent({ packageEntity: npmPackage });
-
- expect(packagesVersionRows()).toHaveLength(npmPackage.versions.length);
- });
-
- it('displays the no versions message when there are none', () => {
- createComponent();
-
- expect(noVersionsMessage().exists()).toBe(true);
- });
- });
-
- describe('dependency links', () => {
- it('does not show the dependency links for a non nuget package', () => {
- createComponent();
-
- expect(dependenciesTab().exists()).toBe(false);
- });
-
- it('shows the dependencies tab with 0 count when a nuget package with no dependencies', () => {
- createComponent({
- packageEntity: {
- ...nugetPackage,
- dependency_links: [],
- },
- });
-
- return wrapper.vm.$nextTick(() => {
- const dependenciesBadge = dependenciesCountBadge();
-
- expect(dependenciesTab().exists()).toBe(true);
- expect(dependenciesBadge.exists()).toBe(true);
- expect(dependenciesBadge.text()).toBe('0');
- expect(noDependenciesMessage().exists()).toBe(true);
- });
- });
-
- it('renders the correct number of dependency rows for a nuget package', () => {
- createComponent({ packageEntity: nugetPackage });
-
- return wrapper.vm.$nextTick(() => {
- const dependenciesBadge = dependenciesCountBadge();
-
- expect(dependenciesTab().exists()).toBe(true);
- expect(dependenciesBadge.exists()).toBe(true);
- expect(dependenciesBadge.text()).toBe(nugetPackage.dependency_links.length.toString());
- expect(dependencyRows()).toHaveLength(nugetPackage.dependency_links.length);
- });
- });
- });
-
- describe('tracking and delete', () => {
- describe('delete package', () => {
- const originalReferrer = document.referrer;
- const setReferrer = (value = defaultProjectName) => {
- Object.defineProperty(document, 'referrer', {
- value,
- configurable: true,
- });
- };
-
- afterEach(() => {
- Object.defineProperty(document, 'referrer', {
- value: originalReferrer,
- configurable: true,
- });
- });
-
- it('calls the proper vuex action', () => {
- createComponent({ packageEntity: npmPackage });
- findDeleteModal().vm.$emit('primary');
- expect(deletePackage).toHaveBeenCalled();
- });
-
- it('when referrer contains project name calls window.replace with project url', async () => {
- setReferrer();
- deletePackage.mockResolvedValue();
- createComponent({ packageEntity: npmPackage });
- findDeleteModal().vm.$emit('primary');
- await deletePackage();
- expect(window.location.replace).toHaveBeenCalledWith(
- 'project_url?showSuccessDeleteAlert=true',
- );
- });
-
- it('when referrer does not contain project name calls window.replace with group url', async () => {
- setReferrer('baz');
- deletePackage.mockResolvedValue();
- createComponent({ packageEntity: npmPackage });
- findDeleteModal().vm.$emit('primary');
- await deletePackage();
- expect(window.location.replace).toHaveBeenCalledWith(
- 'group_url?showSuccessDeleteAlert=true',
- );
- });
- });
-
- describe('delete file', () => {
- it('calls the proper vuex action', () => {
- createComponent({ packageEntity: npmPackage });
-
- findPackageFiles().vm.$emit('delete-file', mavenFiles[0]);
- findDeleteFileModal().vm.$emit('primary');
-
- expect(deletePackageFile).toHaveBeenCalled();
- });
- });
-
- describe('tracking', () => {
- let eventSpy;
- let utilSpy;
- const category = 'foo';
-
- beforeEach(() => {
- eventSpy = jest.spyOn(Tracking, 'event');
- utilSpy = jest.spyOn(SharedUtils, 'packageTypeToTrackCategory').mockReturnValue(category);
- });
-
- it('tracking category calls packageTypeToTrackCategory', () => {
- createComponent({ packageEntity: conanPackage });
- expect(wrapper.vm.tracking.category).toBe(category);
- expect(utilSpy).toHaveBeenCalledWith('conan');
- });
-
- it(`delete button on delete modal call event with ${TrackingActions.DELETE_PACKAGE}`, () => {
- createComponent({ packageEntity: npmPackage });
- findDeleteModal().vm.$emit('primary');
- expect(eventSpy).toHaveBeenCalledWith(
- category,
- TrackingActions.DELETE_PACKAGE,
- expect.any(Object),
- );
- });
-
- it(`canceling a package deletion tracks ${TrackingActions.CANCEL_DELETE_PACKAGE}`, () => {
- createComponent({ packageEntity: npmPackage });
-
- findDeleteModal().vm.$emit('canceled');
-
- expect(eventSpy).toHaveBeenCalledWith(
- category,
- TrackingActions.CANCEL_DELETE_PACKAGE,
- expect.any(Object),
- );
- });
-
- it(`request a file deletion tracks ${TrackingActions.REQUEST_DELETE_PACKAGE_FILE}`, () => {
- createComponent({ packageEntity: npmPackage });
-
- findPackageFiles().vm.$emit('delete-file', mavenFiles[0]);
-
- expect(eventSpy).toHaveBeenCalledWith(
- category,
- TrackingActions.REQUEST_DELETE_PACKAGE_FILE,
- expect.any(Object),
- );
- });
-
- it(`confirming a file deletion tracks ${TrackingActions.DELETE_PACKAGE_FILE}`, () => {
- createComponent({ packageEntity: npmPackage });
-
- findPackageFiles().vm.$emit('delete-file', npmPackage);
- findDeleteFileModal().vm.$emit('primary');
-
- expect(eventSpy).toHaveBeenCalledWith(
- category,
- TrackingActions.REQUEST_DELETE_PACKAGE_FILE,
- expect.any(Object),
- );
- });
-
- it(`canceling a file deletion tracks ${TrackingActions.CANCEL_DELETE_PACKAGE_FILE}`, () => {
- createComponent({ packageEntity: npmPackage });
-
- findPackageFiles().vm.$emit('delete-file', npmPackage);
- findDeleteFileModal().vm.$emit('canceled');
-
- expect(eventSpy).toHaveBeenCalledWith(
- category,
- TrackingActions.CANCEL_DELETE_PACKAGE_FILE,
- expect.any(Object),
- );
- });
-
- it(`file download link call event with ${TrackingActions.PULL_PACKAGE}`, () => {
- createComponent({ packageEntity: conanPackage });
-
- findPackageFiles().vm.$emit('download-file');
- expect(eventSpy).toHaveBeenCalledWith(
- category,
- TrackingActions.PULL_PACKAGE,
- expect.any(Object),
- );
- });
- });
- });
-});
diff --git a/spec/frontend/packages/details/components/composer_installation_spec.js b/spec/frontend/packages/details/components/composer_installation_spec.js
deleted file mode 100644
index 18d11c7dd57..00000000000
--- a/spec/frontend/packages/details/components/composer_installation_spec.js
+++ /dev/null
@@ -1,133 +0,0 @@
-import { GlSprintf, GlLink } from '@gitlab/ui';
-import { shallowMount, createLocalVue } from '@vue/test-utils';
-import Vuex from 'vuex';
-import { registryUrl as composerHelpPath } from 'jest/packages/details/mock_data';
-import { composerPackage as packageEntity } from 'jest/packages/mock_data';
-import ComposerInstallation from '~/packages/details/components/composer_installation.vue';
-import InstallationTitle from '~/packages/details/components/installation_title.vue';
-
-import { TrackingActions } from '~/packages/details/constants';
-
-const localVue = createLocalVue();
-localVue.use(Vuex);
-
-describe('ComposerInstallation', () => {
- let wrapper;
- let store;
-
- const composerRegistryIncludeStr = 'foo/registry';
- const composerPackageIncludeStr = 'foo/package';
-
- const createStore = (groupExists = true) => {
- store = new Vuex.Store({
- state: { packageEntity, composerHelpPath },
- getters: {
- composerRegistryInclude: () => composerRegistryIncludeStr,
- composerPackageInclude: () => composerPackageIncludeStr,
- groupExists: () => groupExists,
- },
- });
- };
-
- const findRootNode = () => wrapper.find('[data-testid="root-node"]');
- const findRegistryInclude = () => wrapper.find('[data-testid="registry-include"]');
- const findPackageInclude = () => wrapper.find('[data-testid="package-include"]');
- const findHelpText = () => wrapper.find('[data-testid="help-text"]');
- const findHelpLink = () => wrapper.find(GlLink);
- const findInstallationTitle = () => wrapper.findComponent(InstallationTitle);
-
- function createComponent() {
- wrapper = shallowMount(ComposerInstallation, {
- localVue,
- store,
- stubs: {
- GlSprintf,
- },
- });
- }
-
- afterEach(() => {
- wrapper.destroy();
- });
-
- describe('install command switch', () => {
- it('has the installation title component', () => {
- createStore();
- createComponent();
-
- expect(findInstallationTitle().exists()).toBe(true);
- expect(findInstallationTitle().props()).toMatchObject({
- packageType: 'composer',
- options: [{ value: 'composer', label: 'Show Composer commands' }],
- });
- });
- });
-
- describe('registry include command', () => {
- beforeEach(() => {
- createStore();
- createComponent();
- });
-
- it('uses code_instructions', () => {
- const registryIncludeCommand = findRegistryInclude();
- expect(registryIncludeCommand.exists()).toBe(true);
- expect(registryIncludeCommand.props()).toMatchObject({
- instruction: composerRegistryIncludeStr,
- copyText: 'Copy registry include',
- trackingAction: TrackingActions.COPY_COMPOSER_REGISTRY_INCLUDE_COMMAND,
- });
- });
-
- it('has the correct title', () => {
- expect(findRegistryInclude().props('label')).toBe('Add composer registry');
- });
- });
-
- describe('package include command', () => {
- beforeEach(() => {
- createStore();
- createComponent();
- });
-
- it('uses code_instructions', () => {
- const registryIncludeCommand = findPackageInclude();
- expect(registryIncludeCommand.exists()).toBe(true);
- expect(registryIncludeCommand.props()).toMatchObject({
- instruction: composerPackageIncludeStr,
- copyText: 'Copy require package include',
- trackingAction: TrackingActions.COPY_COMPOSER_PACKAGE_INCLUDE_COMMAND,
- });
- });
-
- it('has the correct title', () => {
- expect(findPackageInclude().props('label')).toBe('Install package version');
- });
-
- it('has the correct help text', () => {
- expect(findHelpText().text()).toBe(
- 'For more information on Composer packages in GitLab, see the documentation.',
- );
- expect(findHelpLink().attributes()).toMatchObject({
- href: composerHelpPath,
- target: '_blank',
- });
- });
- });
-
- describe('root node', () => {
- it('is normally rendered', () => {
- createStore();
- createComponent();
-
- expect(findRootNode().exists()).toBe(true);
- });
-
- it('is not rendered when the group does not exist', () => {
- createStore(false);
- createComponent();
-
- expect(findRootNode().exists()).toBe(false);
- });
- });
-});
diff --git a/spec/frontend/packages/details/components/conan_installation_spec.js b/spec/frontend/packages/details/components/conan_installation_spec.js
deleted file mode 100644
index 78a7d265a21..00000000000
--- a/spec/frontend/packages/details/components/conan_installation_spec.js
+++ /dev/null
@@ -1,72 +0,0 @@
-import { shallowMount, createLocalVue } from '@vue/test-utils';
-import Vuex from 'vuex';
-import ConanInstallation from '~/packages/details/components/conan_installation.vue';
-import InstallationTitle from '~/packages/details/components/installation_title.vue';
-import CodeInstructions from '~/vue_shared/components/registry/code_instruction.vue';
-import { conanPackage as packageEntity } from '../../mock_data';
-import { registryUrl as conanPath } from '../mock_data';
-
-const localVue = createLocalVue();
-localVue.use(Vuex);
-
-describe('ConanInstallation', () => {
- let wrapper;
-
- const conanInstallationCommandStr = 'foo/command';
- const conanSetupCommandStr = 'foo/setup';
-
- const store = new Vuex.Store({
- state: {
- packageEntity,
- conanPath,
- },
- getters: {
- conanInstallationCommand: () => conanInstallationCommandStr,
- conanSetupCommand: () => conanSetupCommandStr,
- },
- });
-
- const findCodeInstructions = () => wrapper.findAll(CodeInstructions);
- const findInstallationTitle = () => wrapper.findComponent(InstallationTitle);
-
- function createComponent() {
- wrapper = shallowMount(ConanInstallation, {
- localVue,
- store,
- });
- }
-
- beforeEach(() => {
- createComponent();
- });
-
- afterEach(() => {
- wrapper.destroy();
- });
-
- it('renders all the messages', () => {
- expect(wrapper.element).toMatchSnapshot();
- });
-
- describe('install command switch', () => {
- it('has the installation title component', () => {
- expect(findInstallationTitle().exists()).toBe(true);
- expect(findInstallationTitle().props()).toMatchObject({
- packageType: 'conan',
- options: [{ value: 'conan', label: 'Show Conan commands' }],
- });
- });
- });
-
- describe('installation commands', () => {
- it('renders the correct command', () => {
- expect(findCodeInstructions().at(0).props('instruction')).toBe(conanInstallationCommandStr);
- });
- });
-
- describe('setup commands', () => {
- it('renders the correct command', () => {
- expect(findCodeInstructions().at(1).props('instruction')).toBe(conanSetupCommandStr);
- });
- });
-});
diff --git a/spec/frontend/packages/details/components/dependency_row_spec.js b/spec/frontend/packages/details/components/dependency_row_spec.js
deleted file mode 100644
index 7d3ee92908d..00000000000
--- a/spec/frontend/packages/details/components/dependency_row_spec.js
+++ /dev/null
@@ -1,62 +0,0 @@
-import { shallowMount } from '@vue/test-utils';
-import DependencyRow from '~/packages/details/components/dependency_row.vue';
-import { dependencyLinks } from '../../mock_data';
-
-describe('DependencyRow', () => {
- let wrapper;
-
- const { withoutFramework, withoutVersion, fullLink } = dependencyLinks;
-
- function createComponent({ dependencyLink = fullLink } = {}) {
- wrapper = shallowMount(DependencyRow, {
- propsData: {
- dependency: dependencyLink,
- },
- });
- }
-
- const dependencyVersion = () => wrapper.find('[data-testid="version-pattern"]');
- const dependencyFramework = () => wrapper.find('[data-testid="target-framework"]');
-
- afterEach(() => {
- wrapper.destroy();
- });
-
- describe('renders', () => {
- it('full dependency', () => {
- createComponent();
-
- expect(wrapper.element).toMatchSnapshot();
- });
- });
-
- describe('version', () => {
- it('does not render any version information when not supplied', () => {
- createComponent({ dependencyLink: withoutVersion });
-
- expect(dependencyVersion().exists()).toBe(false);
- });
-
- it('does render version info when it exists', () => {
- createComponent();
-
- expect(dependencyVersion().exists()).toBe(true);
- expect(dependencyVersion().text()).toBe(fullLink.version_pattern);
- });
- });
-
- describe('target framework', () => {
- it('does not render any framework information when not supplied', () => {
- createComponent({ dependencyLink: withoutFramework });
-
- expect(dependencyFramework().exists()).toBe(false);
- });
-
- it('does render framework info when it exists', () => {
- createComponent();
-
- expect(dependencyFramework().exists()).toBe(true);
- expect(dependencyFramework().text()).toBe(`(${fullLink.target_framework})`);
- });
- });
-});
diff --git a/spec/frontend/packages/details/components/file_sha_spec.js b/spec/frontend/packages/details/components/file_sha_spec.js
deleted file mode 100644
index 7bfcf78baab..00000000000
--- a/spec/frontend/packages/details/components/file_sha_spec.js
+++ /dev/null
@@ -1,33 +0,0 @@
-import { shallowMount } from '@vue/test-utils';
-
-import FileSha from '~/packages/details/components/file_sha.vue';
-import ClipboardButton from '~/vue_shared/components/clipboard_button.vue';
-import DetailsRow from '~/vue_shared/components/registry/details_row.vue';
-
-describe('FileSha', () => {
- let wrapper;
-
- const defaultProps = { sha: 'foo', title: 'bar' };
-
- function createComponent() {
- wrapper = shallowMount(FileSha, {
- propsData: {
- ...defaultProps,
- },
- stubs: {
- ClipboardButton,
- DetailsRow,
- },
- });
- }
-
- afterEach(() => {
- wrapper.destroy();
- });
-
- it('renders', () => {
- createComponent();
-
- expect(wrapper.element).toMatchSnapshot();
- });
-});
diff --git a/spec/frontend/packages/details/components/installation_title_spec.js b/spec/frontend/packages/details/components/installation_title_spec.js
deleted file mode 100644
index 14e990d3011..00000000000
--- a/spec/frontend/packages/details/components/installation_title_spec.js
+++ /dev/null
@@ -1,58 +0,0 @@
-import { shallowMount } from '@vue/test-utils';
-
-import InstallationTitle from '~/packages/details/components/installation_title.vue';
-import PersistedDropdownSelection from '~/vue_shared/components/registry/persisted_dropdown_selection.vue';
-
-describe('InstallationTitle', () => {
- let wrapper;
-
- const defaultProps = { packageType: 'foo', options: [{ value: 'foo', label: 'bar' }] };
-
- const findPersistedDropdownSelection = () => wrapper.findComponent(PersistedDropdownSelection);
- const findTitle = () => wrapper.find('h3');
-
- function createComponent({ props = {} } = {}) {
- wrapper = shallowMount(InstallationTitle, {
- propsData: {
- ...defaultProps,
- ...props,
- },
- });
- }
-
- afterEach(() => {
- wrapper.destroy();
- });
-
- it('has a title', () => {
- createComponent();
-
- expect(findTitle().exists()).toBe(true);
- expect(findTitle().text()).toBe('Installation');
- });
-
- describe('persisted dropdown selection', () => {
- it('exists', () => {
- createComponent();
-
- expect(findPersistedDropdownSelection().exists()).toBe(true);
- });
-
- it('has the correct props', () => {
- createComponent();
-
- expect(findPersistedDropdownSelection().props()).toMatchObject({
- storageKey: 'package_foo_installation_instructions',
- options: defaultProps.options,
- });
- });
-
- it('on change event emits a change event', () => {
- createComponent();
-
- findPersistedDropdownSelection().vm.$emit('change', 'baz');
-
- expect(wrapper.emitted('change')).toEqual([['baz']]);
- });
- });
-});
diff --git a/spec/frontend/packages/details/components/installations_commands_spec.js b/spec/frontend/packages/details/components/installations_commands_spec.js
deleted file mode 100644
index 164f9f69741..00000000000
--- a/spec/frontend/packages/details/components/installations_commands_spec.js
+++ /dev/null
@@ -1,61 +0,0 @@
-import { shallowMount } from '@vue/test-utils';
-import ComposerInstallation from '~/packages/details/components/composer_installation.vue';
-import ConanInstallation from '~/packages/details/components/conan_installation.vue';
-import InstallationCommands from '~/packages/details/components/installation_commands.vue';
-
-import MavenInstallation from '~/packages/details/components/maven_installation.vue';
-import NpmInstallation from '~/packages/details/components/npm_installation.vue';
-import NugetInstallation from '~/packages/details/components/nuget_installation.vue';
-import PypiInstallation from '~/packages/details/components/pypi_installation.vue';
-import TerraformInstallation from '~/packages_and_registries/infrastructure_registry/components/terraform_installation.vue';
-
-import {
- conanPackage,
- mavenPackage,
- npmPackage,
- nugetPackage,
- pypiPackage,
- composerPackage,
- terraformModule,
-} from '../../mock_data';
-
-describe('InstallationCommands', () => {
- let wrapper;
-
- function createComponent(propsData) {
- wrapper = shallowMount(InstallationCommands, {
- propsData,
- });
- }
-
- const npmInstallation = () => wrapper.find(NpmInstallation);
- const mavenInstallation = () => wrapper.find(MavenInstallation);
- const conanInstallation = () => wrapper.find(ConanInstallation);
- const nugetInstallation = () => wrapper.find(NugetInstallation);
- const pypiInstallation = () => wrapper.find(PypiInstallation);
- const composerInstallation = () => wrapper.find(ComposerInstallation);
- const terraformInstallation = () => wrapper.findComponent(TerraformInstallation);
-
- afterEach(() => {
- wrapper.destroy();
- });
-
- describe('installation instructions', () => {
- describe.each`
- packageEntity | selector
- ${conanPackage} | ${conanInstallation}
- ${mavenPackage} | ${mavenInstallation}
- ${npmPackage} | ${npmInstallation}
- ${nugetPackage} | ${nugetInstallation}
- ${pypiPackage} | ${pypiInstallation}
- ${composerPackage} | ${composerInstallation}
- ${terraformModule} | ${terraformInstallation}
- `('renders', ({ packageEntity, selector }) => {
- it(`${packageEntity.package_type} instructions exist`, () => {
- createComponent({ packageEntity });
-
- expect(selector()).toExist();
- });
- });
- });
-});
diff --git a/spec/frontend/packages/details/components/maven_installation_spec.js b/spec/frontend/packages/details/components/maven_installation_spec.js
deleted file mode 100644
index 4972fe70a3d..00000000000
--- a/spec/frontend/packages/details/components/maven_installation_spec.js
+++ /dev/null
@@ -1,184 +0,0 @@
-import { shallowMount, createLocalVue } from '@vue/test-utils';
-import { nextTick } from 'vue';
-import Vuex from 'vuex';
-import { registryUrl as mavenPath } from 'jest/packages/details/mock_data';
-import { mavenPackage as packageEntity } from 'jest/packages/mock_data';
-import InstallationTitle from '~/packages/details/components/installation_title.vue';
-import MavenInstallation from '~/packages/details/components/maven_installation.vue';
-import { TrackingActions } from '~/packages/details/constants';
-import CodeInstructions from '~/vue_shared/components/registry/code_instruction.vue';
-
-const localVue = createLocalVue();
-localVue.use(Vuex);
-
-describe('MavenInstallation', () => {
- let wrapper;
-
- const xmlCodeBlock = 'foo/xml';
- const mavenCommandStr = 'foo/command';
- const mavenSetupXml = 'foo/setup';
- const gradleGroovyInstallCommandText = 'foo/gradle/groovy/install';
- const gradleGroovyAddSourceCommandText = 'foo/gradle/groovy/add/source';
- const gradleKotlinInstallCommandText = 'foo/gradle/kotlin/install';
- const gradleKotlinAddSourceCommandText = 'foo/gradle/kotlin/add/source';
-
- const store = new Vuex.Store({
- state: {
- packageEntity,
- mavenPath,
- },
- getters: {
- mavenInstallationXml: () => xmlCodeBlock,
- mavenInstallationCommand: () => mavenCommandStr,
- mavenSetupXml: () => mavenSetupXml,
- gradleGroovyInstalCommand: () => gradleGroovyInstallCommandText,
- gradleGroovyAddSourceCommand: () => gradleGroovyAddSourceCommandText,
- gradleKotlinInstalCommand: () => gradleKotlinInstallCommandText,
- gradleKotlinAddSourceCommand: () => gradleKotlinAddSourceCommandText,
- },
- });
-
- const findCodeInstructions = () => wrapper.findAll(CodeInstructions);
- const findInstallationTitle = () => wrapper.findComponent(InstallationTitle);
-
- function createComponent({ data = {} } = {}) {
- wrapper = shallowMount(MavenInstallation, {
- localVue,
- store,
- data() {
- return data;
- },
- });
- }
-
- afterEach(() => {
- wrapper.destroy();
- });
-
- describe('install command switch', () => {
- it('has the installation title component', () => {
- createComponent();
-
- expect(findInstallationTitle().exists()).toBe(true);
- expect(findInstallationTitle().props()).toMatchObject({
- packageType: 'maven',
- options: [
- { value: 'maven', label: 'Maven XML' },
- { value: 'groovy', label: 'Gradle Groovy DSL' },
- { value: 'kotlin', label: 'Gradle Kotlin DSL' },
- ],
- });
- });
-
- it('on change event updates the instructions to show', async () => {
- createComponent();
-
- expect(findCodeInstructions().at(0).props('instruction')).toBe(xmlCodeBlock);
- findInstallationTitle().vm.$emit('change', 'groovy');
-
- await nextTick();
-
- expect(findCodeInstructions().at(0).props('instruction')).toBe(
- gradleGroovyInstallCommandText,
- );
- });
- });
-
- describe('maven', () => {
- beforeEach(() => {
- createComponent();
- });
-
- it('renders all the messages', () => {
- expect(wrapper.element).toMatchSnapshot();
- });
-
- describe('installation commands', () => {
- it('renders the correct xml block', () => {
- expect(findCodeInstructions().at(0).props()).toMatchObject({
- instruction: xmlCodeBlock,
- multiline: true,
- trackingAction: TrackingActions.COPY_MAVEN_XML,
- });
- });
-
- it('renders the correct maven command', () => {
- expect(findCodeInstructions().at(1).props()).toMatchObject({
- instruction: mavenCommandStr,
- multiline: false,
- trackingAction: TrackingActions.COPY_MAVEN_COMMAND,
- });
- });
- });
-
- describe('setup commands', () => {
- it('renders the correct xml block', () => {
- expect(findCodeInstructions().at(2).props()).toMatchObject({
- instruction: mavenSetupXml,
- multiline: true,
- trackingAction: TrackingActions.COPY_MAVEN_SETUP,
- });
- });
- });
- });
-
- describe('groovy', () => {
- beforeEach(() => {
- createComponent({ data: { instructionType: 'groovy' } });
- });
-
- it('renders all the messages', () => {
- expect(wrapper.element).toMatchSnapshot();
- });
-
- describe('installation commands', () => {
- it('renders the gradle install command', () => {
- expect(findCodeInstructions().at(0).props()).toMatchObject({
- instruction: gradleGroovyInstallCommandText,
- multiline: false,
- trackingAction: TrackingActions.COPY_GRADLE_INSTALL_COMMAND,
- });
- });
- });
-
- describe('setup commands', () => {
- it('renders the correct gradle command', () => {
- expect(findCodeInstructions().at(1).props()).toMatchObject({
- instruction: gradleGroovyAddSourceCommandText,
- multiline: true,
- trackingAction: TrackingActions.COPY_GRADLE_ADD_TO_SOURCE_COMMAND,
- });
- });
- });
- });
-
- describe('kotlin', () => {
- beforeEach(() => {
- createComponent({ data: { instructionType: 'kotlin' } });
- });
-
- it('renders all the messages', () => {
- expect(wrapper.element).toMatchSnapshot();
- });
-
- describe('installation commands', () => {
- it('renders the gradle install command', () => {
- expect(findCodeInstructions().at(0).props()).toMatchObject({
- instruction: gradleKotlinInstallCommandText,
- multiline: false,
- trackingAction: TrackingActions.COPY_KOTLIN_INSTALL_COMMAND,
- });
- });
- });
-
- describe('setup commands', () => {
- it('renders the correct gradle command', () => {
- expect(findCodeInstructions().at(1).props()).toMatchObject({
- instruction: gradleKotlinAddSourceCommandText,
- multiline: true,
- trackingAction: TrackingActions.COPY_KOTLIN_ADD_TO_SOURCE_COMMAND,
- });
- });
- });
- });
-});
diff --git a/spec/frontend/packages/details/components/npm_installation_spec.js b/spec/frontend/packages/details/components/npm_installation_spec.js
deleted file mode 100644
index 1c49110bdf8..00000000000
--- a/spec/frontend/packages/details/components/npm_installation_spec.js
+++ /dev/null
@@ -1,123 +0,0 @@
-import { shallowMount, createLocalVue } from '@vue/test-utils';
-import { nextTick } from 'vue';
-import Vuex from 'vuex';
-import { registryUrl as nugetPath } from 'jest/packages/details/mock_data';
-import { npmPackage as packageEntity } from 'jest/packages/mock_data';
-import InstallationTitle from '~/packages/details/components/installation_title.vue';
-import NpmInstallation from '~/packages/details/components/npm_installation.vue';
-import { TrackingActions } from '~/packages/details/constants';
-import { npmInstallationCommand, npmSetupCommand } from '~/packages/details/store/getters';
-import CodeInstructions from '~/vue_shared/components/registry/code_instruction.vue';
-
-const localVue = createLocalVue();
-localVue.use(Vuex);
-
-describe('NpmInstallation', () => {
- let wrapper;
-
- const npmInstallationCommandLabel = 'npm i @Test/package';
- const yarnInstallationCommandLabel = 'yarn add @Test/package';
-
- const findCodeInstructions = () => wrapper.findAll(CodeInstructions);
- const findInstallationTitle = () => wrapper.findComponent(InstallationTitle);
-
- function createComponent({ data = {} } = {}) {
- const store = new Vuex.Store({
- state: {
- packageEntity,
- nugetPath,
- },
- getters: {
- npmInstallationCommand,
- npmSetupCommand,
- },
- });
-
- wrapper = shallowMount(NpmInstallation, {
- localVue,
- store,
- data() {
- return data;
- },
- });
- }
-
- beforeEach(() => {
- createComponent();
- });
-
- afterEach(() => {
- wrapper.destroy();
- });
-
- it('renders all the messages', () => {
- expect(wrapper.element).toMatchSnapshot();
- });
-
- describe('install command switch', () => {
- it('has the installation title component', () => {
- expect(findInstallationTitle().exists()).toBe(true);
- expect(findInstallationTitle().props()).toMatchObject({
- packageType: 'npm',
- options: [
- { value: 'npm', label: 'Show NPM commands' },
- { value: 'yarn', label: 'Show Yarn commands' },
- ],
- });
- });
-
- it('on change event updates the instructions to show', async () => {
- createComponent();
-
- expect(findCodeInstructions().at(0).props('instruction')).toBe(npmInstallationCommandLabel);
- findInstallationTitle().vm.$emit('change', 'yarn');
-
- await nextTick();
-
- expect(findCodeInstructions().at(0).props('instruction')).toBe(yarnInstallationCommandLabel);
- });
- });
-
- describe('npm', () => {
- beforeEach(() => {
- createComponent();
- });
- it('renders the correct installation command', () => {
- expect(findCodeInstructions().at(0).props()).toMatchObject({
- instruction: npmInstallationCommandLabel,
- multiline: false,
- trackingAction: TrackingActions.COPY_NPM_INSTALL_COMMAND,
- });
- });
-
- it('renders the correct setup command', () => {
- expect(findCodeInstructions().at(1).props()).toMatchObject({
- instruction: 'echo @Test:registry=undefined/ >> .npmrc',
- multiline: false,
- trackingAction: TrackingActions.COPY_NPM_SETUP_COMMAND,
- });
- });
- });
-
- describe('yarn', () => {
- beforeEach(() => {
- createComponent({ data: { instructionType: 'yarn' } });
- });
-
- it('renders the correct setup command', () => {
- expect(findCodeInstructions().at(0).props()).toMatchObject({
- instruction: yarnInstallationCommandLabel,
- multiline: false,
- trackingAction: TrackingActions.COPY_YARN_INSTALL_COMMAND,
- });
- });
-
- it('renders the correct registry command', () => {
- expect(findCodeInstructions().at(1).props()).toMatchObject({
- instruction: 'echo \\"@Test:registry\\" \\"undefined/\\" >> .yarnrc',
- multiline: false,
- trackingAction: TrackingActions.COPY_YARN_SETUP_COMMAND,
- });
- });
- });
-});
diff --git a/spec/frontend/packages/details/components/nuget_installation_spec.js b/spec/frontend/packages/details/components/nuget_installation_spec.js
deleted file mode 100644
index 8839a8f1108..00000000000
--- a/spec/frontend/packages/details/components/nuget_installation_spec.js
+++ /dev/null
@@ -1,79 +0,0 @@
-import { shallowMount, createLocalVue } from '@vue/test-utils';
-import Vuex from 'vuex';
-import { registryUrl as nugetPath } from 'jest/packages/details/mock_data';
-import { nugetPackage as packageEntity } from 'jest/packages/mock_data';
-import InstallationTitle from '~/packages/details/components/installation_title.vue';
-import NugetInstallation from '~/packages/details/components/nuget_installation.vue';
-import { TrackingActions } from '~/packages/details/constants';
-import CodeInstructions from '~/vue_shared/components/registry/code_instruction.vue';
-
-const localVue = createLocalVue();
-localVue.use(Vuex);
-
-describe('NugetInstallation', () => {
- let wrapper;
-
- const nugetInstallationCommandStr = 'foo/command';
- const nugetSetupCommandStr = 'foo/setup';
-
- const store = new Vuex.Store({
- state: {
- packageEntity,
- nugetPath,
- },
- getters: {
- nugetInstallationCommand: () => nugetInstallationCommandStr,
- nugetSetupCommand: () => nugetSetupCommandStr,
- },
- });
-
- const findCodeInstructions = () => wrapper.findAll(CodeInstructions);
- const findInstallationTitle = () => wrapper.findComponent(InstallationTitle);
-
- function createComponent() {
- wrapper = shallowMount(NugetInstallation, {
- localVue,
- store,
- });
- }
-
- beforeEach(() => {
- createComponent();
- });
-
- afterEach(() => {
- wrapper.destroy();
- });
-
- it('renders all the messages', () => {
- expect(wrapper.element).toMatchSnapshot();
- });
-
- describe('install command switch', () => {
- it('has the installation title component', () => {
- expect(findInstallationTitle().exists()).toBe(true);
- expect(findInstallationTitle().props()).toMatchObject({
- packageType: 'nuget',
- options: [{ value: 'nuget', label: 'Show Nuget commands' }],
- });
- });
- });
-
- describe('installation commands', () => {
- it('renders the correct command', () => {
- expect(findCodeInstructions().at(0).props()).toMatchObject({
- instruction: nugetInstallationCommandStr,
- trackingAction: TrackingActions.COPY_NUGET_INSTALL_COMMAND,
- });
- });
- });
-
- describe('setup commands', () => {
- it('renders the correct command', () => {
- expect(findCodeInstructions().at(1).props()).toMatchObject({
- instruction: nugetSetupCommandStr,
- trackingAction: TrackingActions.COPY_NUGET_SETUP_COMMAND,
- });
- });
- });
-});
diff --git a/spec/frontend/packages/details/components/package_files_spec.js b/spec/frontend/packages/details/components/package_files_spec.js
deleted file mode 100644
index e8e5a24d3a3..00000000000
--- a/spec/frontend/packages/details/components/package_files_spec.js
+++ /dev/null
@@ -1,259 +0,0 @@
-import { GlDropdown, GlButton } from '@gitlab/ui';
-import { mount } from '@vue/test-utils';
-import { nextTick } from 'vue/';
-import stubChildren from 'helpers/stub_children';
-import component from '~/packages/details/components/package_files.vue';
-import FileIcon from '~/vue_shared/components/file_icon.vue';
-import TimeAgoTooltip from '~/vue_shared/components/time_ago_tooltip.vue';
-
-import { npmFiles, mavenFiles } from '../../mock_data';
-
-describe('Package Files', () => {
- let wrapper;
-
- const findAllRows = () => wrapper.findAll('[data-testid="file-row"');
- const findFirstRow = () => findAllRows().at(0);
- const findSecondRow = () => findAllRows().at(1);
- const findFirstRowDownloadLink = () => findFirstRow().find('[data-testid="download-link"]');
- const findFirstRowCommitLink = () => findFirstRow().find('[data-testid="commit-link"]');
- const findSecondRowCommitLink = () => findSecondRow().find('[data-testid="commit-link"]');
- const findFirstRowFileIcon = () => findFirstRow().find(FileIcon);
- const findFirstRowCreatedAt = () => findFirstRow().find(TimeAgoTooltip);
- const findFirstActionMenu = () => findFirstRow().findComponent(GlDropdown);
- const findActionMenuDelete = () => findFirstActionMenu().find('[data-testid="delete-file"]');
- const findFirstToggleDetailsButton = () => findFirstRow().findComponent(GlButton);
- const findFirstRowShaComponent = (id) => wrapper.find(`[data-testid="${id}"]`);
-
- const createComponent = ({ packageFiles = npmFiles, canDelete = true } = {}) => {
- wrapper = mount(component, {
- propsData: {
- packageFiles,
- canDelete,
- },
- stubs: {
- ...stubChildren(component),
- GlTable: false,
- },
- });
- };
-
- afterEach(() => {
- wrapper.destroy();
- wrapper = null;
- });
-
- describe('rows', () => {
- it('renders a single file for an npm package', () => {
- createComponent();
-
- expect(findAllRows()).toHaveLength(1);
- });
-
- it('renders multiple files for a package that contains more than one file', () => {
- createComponent({ packageFiles: mavenFiles });
-
- expect(findAllRows()).toHaveLength(2);
- });
- });
-
- describe('link', () => {
- it('exists', () => {
- createComponent();
-
- expect(findFirstRowDownloadLink().exists()).toBe(true);
- });
-
- it('has the correct attrs bound', () => {
- createComponent();
-
- expect(findFirstRowDownloadLink().attributes('href')).toBe(npmFiles[0].download_path);
- });
-
- it('emits "download-file" event on click', () => {
- createComponent();
-
- findFirstRowDownloadLink().vm.$emit('click');
-
- expect(wrapper.emitted('download-file')).toEqual([[]]);
- });
- });
-
- describe('file-icon', () => {
- it('exists', () => {
- createComponent();
-
- expect(findFirstRowFileIcon().exists()).toBe(true);
- });
-
- it('has the correct props bound', () => {
- createComponent();
-
- expect(findFirstRowFileIcon().props('fileName')).toBe(npmFiles[0].file_name);
- });
- });
-
- describe('time-ago tooltip', () => {
- it('exists', () => {
- createComponent();
-
- expect(findFirstRowCreatedAt().exists()).toBe(true);
- });
-
- it('has the correct props bound', () => {
- createComponent();
-
- expect(findFirstRowCreatedAt().props('time')).toBe(npmFiles[0].created_at);
- });
- });
-
- describe('commit', () => {
- describe('when package file has a pipeline associated', () => {
- it('exists', () => {
- createComponent();
-
- expect(findFirstRowCommitLink().exists()).toBe(true);
- });
-
- it('the link points to the commit url', () => {
- createComponent();
-
- expect(findFirstRowCommitLink().attributes('href')).toBe(
- npmFiles[0].pipelines[0].project.commit_url,
- );
- });
-
- it('the text is git_commit_message', () => {
- createComponent();
-
- expect(findFirstRowCommitLink().text()).toBe(npmFiles[0].pipelines[0].git_commit_message);
- });
- });
- describe('when package file has no pipeline associated', () => {
- it('does not exist', () => {
- createComponent({ packageFiles: mavenFiles });
-
- expect(findFirstRowCommitLink().exists()).toBe(false);
- });
- });
-
- describe('when only one file lacks an associated pipeline', () => {
- it('renders the commit when it exists and not otherwise', () => {
- createComponent({ packageFiles: [npmFiles[0], mavenFiles[0]] });
-
- expect(findFirstRowCommitLink().exists()).toBe(true);
- expect(findSecondRowCommitLink().exists()).toBe(false);
- });
- });
-
- describe('action menu', () => {
- describe('when the user can delete', () => {
- it('exists', () => {
- createComponent();
-
- expect(findFirstActionMenu().exists()).toBe(true);
- });
-
- describe('menu items', () => {
- describe('delete file', () => {
- it('exists', () => {
- createComponent();
-
- expect(findActionMenuDelete().exists()).toBe(true);
- });
-
- it('emits a delete event when clicked', () => {
- createComponent();
-
- findActionMenuDelete().vm.$emit('click');
-
- const [[{ id }]] = wrapper.emitted('delete-file');
- expect(id).toBe(npmFiles[0].id);
- });
- });
- });
- });
-
- describe('when the user can not delete', () => {
- const canDelete = false;
-
- it('does not exist', () => {
- createComponent({ canDelete });
-
- expect(findFirstActionMenu().exists()).toBe(false);
- });
- });
- });
- });
-
- describe('additional details', () => {
- describe('details toggle button', () => {
- it('exists', () => {
- createComponent();
-
- expect(findFirstToggleDetailsButton().exists()).toBe(true);
- });
-
- it('is hidden when no details is present', () => {
- const [{ ...noShaFile }] = npmFiles;
- noShaFile.file_sha256 = null;
- noShaFile.file_md5 = null;
- noShaFile.file_sha1 = null;
- createComponent({ packageFiles: [noShaFile] });
-
- expect(findFirstToggleDetailsButton().exists()).toBe(false);
- });
-
- it('toggles the details row', async () => {
- createComponent();
-
- expect(findFirstToggleDetailsButton().props('icon')).toBe('angle-down');
-
- findFirstToggleDetailsButton().vm.$emit('click');
- await nextTick();
-
- expect(findFirstRowShaComponent('sha-256').exists()).toBe(true);
- expect(findFirstToggleDetailsButton().props('icon')).toBe('angle-up');
-
- findFirstToggleDetailsButton().vm.$emit('click');
- await nextTick();
-
- expect(findFirstRowShaComponent('sha-256').exists()).toBe(false);
- expect(findFirstToggleDetailsButton().props('icon')).toBe('angle-down');
- });
- });
-
- describe('file shas', () => {
- const showShaFiles = () => {
- findFirstToggleDetailsButton().vm.$emit('click');
- return nextTick();
- };
-
- it.each`
- selector | title | sha
- ${'sha-256'} | ${'SHA-256'} | ${'file_sha256'}
- ${'md5'} | ${'MD5'} | ${'file_md5'}
- ${'sha-1'} | ${'SHA-1'} | ${'file_sha1'}
- `('has a $title row', async ({ selector, title, sha }) => {
- createComponent();
-
- await showShaFiles();
-
- expect(findFirstRowShaComponent(selector).props()).toMatchObject({
- title,
- sha,
- });
- });
-
- it('does not display a row when the data is missing', async () => {
- const [{ ...missingMd5 }] = npmFiles;
- missingMd5.file_md5 = null;
-
- createComponent({ packageFiles: [missingMd5] });
-
- await showShaFiles();
-
- expect(findFirstRowShaComponent('md5').exists()).toBe(false);
- });
- });
- });
-});
diff --git a/spec/frontend/packages/details/components/package_history_spec.js b/spec/frontend/packages/details/components/package_history_spec.js
deleted file mode 100644
index 244805a9c82..00000000000
--- a/spec/frontend/packages/details/components/package_history_spec.js
+++ /dev/null
@@ -1,117 +0,0 @@
-import { GlLink, GlSprintf } from '@gitlab/ui';
-import { shallowMount } from '@vue/test-utils';
-import { stubComponent } from 'helpers/stub_component';
-import component from '~/packages/details/components/package_history.vue';
-import { HISTORY_PIPELINES_LIMIT } from '~/packages/details/constants';
-import HistoryItem from '~/vue_shared/components/registry/history_item.vue';
-import TimeAgoTooltip from '~/vue_shared/components/time_ago_tooltip.vue';
-
-import { mavenPackage, mockPipelineInfo } from '../../mock_data';
-
-describe('Package History', () => {
- let wrapper;
- const defaultProps = {
- projectName: 'baz project',
- packageEntity: { ...mavenPackage },
- };
-
- const createPipelines = (amount) =>
- [...Array(amount)].map((x, index) => ({ ...mockPipelineInfo, id: index + 1 }));
-
- const mountComponent = (props) => {
- wrapper = shallowMount(component, {
- propsData: { ...defaultProps, ...props },
- stubs: {
- HistoryItem: stubComponent(HistoryItem, {
- template: '<div data-testid="history-element"><slot></slot></div>',
- }),
- GlSprintf,
- },
- });
- };
-
- afterEach(() => {
- wrapper.destroy();
- wrapper = null;
- });
-
- const findHistoryElement = (testId) => wrapper.find(`[data-testid="${testId}"]`);
- const findElementLink = (container) => container.find(GlLink);
- const findElementTimeAgo = (container) => container.find(TimeAgoTooltip);
- const findTitle = () => wrapper.find('[data-testid="title"]');
- const findTimeline = () => wrapper.find('[data-testid="timeline"]');
-
- it('has the correct title', () => {
- mountComponent();
-
- const title = findTitle();
-
- expect(title.exists()).toBe(true);
- expect(title.text()).toBe('History');
- });
-
- it('has a timeline container', () => {
- mountComponent();
-
- const title = findTimeline();
-
- expect(title.exists()).toBe(true);
- expect(title.classes()).toEqual(
- expect.arrayContaining(['timeline', 'main-notes-list', 'notes']),
- );
- });
- 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}
- `(
- 'with $amount pipelines history element $name',
- ({ name, icon, text, timeAgoTooltip, link, amount }) => {
- let element;
-
- beforeEach(() => {
- mountComponent({
- packageEntity: { ...mavenPackage, pipelines: createPipelines(amount) },
- });
- element = findHistoryElement(name);
- });
-
- it('exists', () => {
- expect(element.exists()).toBe(true);
- });
-
- it('has the correct icon', () => {
- expect(element.props('icon')).toBe(icon);
- });
-
- it('has the correct text', () => {
- expect(element.text()).toBe(text);
- });
-
- it('time-ago tooltip', () => {
- const timeAgo = findElementTimeAgo(element);
- const exist = Boolean(timeAgoTooltip);
-
- expect(timeAgo.exists()).toBe(exist);
- if (exist) {
- expect(timeAgo.props('time')).toBe(timeAgoTooltip);
- }
- });
-
- it('link', () => {
- const linkElement = findElementLink(element);
- const exist = Boolean(link);
-
- expect(linkElement.exists()).toBe(exist);
- if (exist) {
- expect(linkElement.attributes('href')).toBe(link);
- }
- });
- },
- );
-});
diff --git a/spec/frontend/packages/details/components/package_title_spec.js b/spec/frontend/packages/details/components/package_title_spec.js
deleted file mode 100644
index 512cec85b40..00000000000
--- a/spec/frontend/packages/details/components/package_title_spec.js
+++ /dev/null
@@ -1,189 +0,0 @@
-import { GlBreakpointInstance } from '@gitlab/ui/dist/utils';
-import { shallowMount, createLocalVue } from '@vue/test-utils';
-import Vuex from 'vuex';
-import PackageTitle from '~/packages/details/components/package_title.vue';
-import PackageTags from '~/packages/shared/components/package_tags.vue';
-import TitleArea from '~/vue_shared/components/registry/title_area.vue';
-import {
- conanPackage,
- mavenFiles,
- mavenPackage,
- mockTags,
- npmFiles,
- npmPackage,
- nugetPackage,
-} from '../../mock_data';
-
-const localVue = createLocalVue();
-localVue.use(Vuex);
-
-describe('PackageTitle', () => {
- let wrapper;
- let store;
-
- function createComponent({
- packageEntity = mavenPackage,
- packageFiles = mavenFiles,
- icon = null,
- } = {}) {
- store = new Vuex.Store({
- state: {
- packageEntity,
- packageFiles,
- },
- getters: {
- packageTypeDisplay: ({ packageEntity: { package_type: type } }) => type,
- packagePipeline: ({ packageEntity: { pipeline = null } }) => pipeline,
- packageIcon: () => icon,
- },
- });
-
- wrapper = shallowMount(PackageTitle, {
- localVue,
- store,
- stubs: {
- TitleArea,
- },
- });
- return wrapper.vm.$nextTick();
- }
-
- const findTitleArea = () => wrapper.find(TitleArea);
- const packageType = () => wrapper.find('[data-testid="package-type"]');
- const packageSize = () => wrapper.find('[data-testid="package-size"]');
- const pipelineProject = () => wrapper.find('[data-testid="pipeline-project"]');
- const packageRef = () => wrapper.find('[data-testid="package-ref"]');
- const packageTags = () => wrapper.find(PackageTags);
- const packageBadges = () => wrapper.findAll('[data-testid="tag-badge"]');
-
- afterEach(() => {
- wrapper.destroy();
- });
-
- describe('renders', () => {
- it('without tags', async () => {
- await createComponent();
-
- expect(wrapper.element).toMatchSnapshot();
- });
-
- it('with tags', async () => {
- await createComponent({ packageEntity: { ...mavenPackage, tags: mockTags } });
-
- expect(wrapper.element).toMatchSnapshot();
- });
-
- it('with tags on mobile', async () => {
- jest.spyOn(GlBreakpointInstance, 'isDesktop').mockReturnValue(false);
- await createComponent({ packageEntity: { ...mavenPackage, tags: mockTags } });
- await wrapper.vm.$nextTick();
-
- expect(packageBadges()).toHaveLength(mockTags.length);
- });
- });
-
- describe('package title', () => {
- it('is correctly bound', async () => {
- await createComponent();
-
- expect(findTitleArea().props('title')).toBe('Test package');
- });
- });
-
- describe('package icon', () => {
- const fakeSrc = 'a-fake-src';
-
- it('binds an icon when provided one from vuex', async () => {
- await createComponent({ icon: fakeSrc });
-
- expect(findTitleArea().props('avatar')).toBe(fakeSrc);
- });
-
- it('do not binds an icon when not provided one', async () => {
- await createComponent();
-
- expect(findTitleArea().props('avatar')).toBe(null);
- });
- });
-
- describe.each`
- packageEntity | text
- ${conanPackage} | ${'conan'}
- ${mavenPackage} | ${'maven'}
- ${npmPackage} | ${'npm'}
- ${nugetPackage} | ${'nuget'}
- `(`package type`, ({ packageEntity, text }) => {
- beforeEach(() => createComponent({ packageEntity }));
-
- it(`${packageEntity.package_type} should render from Vuex getters ${text}`, () => {
- expect(packageType().props()).toEqual(expect.objectContaining({ text, icon: 'package' }));
- });
- });
-
- describe('calculates the package size', () => {
- it('correctly calculates when there is only 1 file', async () => {
- await createComponent({ packageEntity: npmPackage, packageFiles: npmFiles });
-
- expect(packageSize().props()).toMatchObject({ text: '200 bytes', icon: 'disk' });
- });
-
- it('correctly calulates when there are multiple files', async () => {
- await createComponent();
-
- expect(packageSize().props('text')).toBe('300 bytes');
- });
- });
-
- describe('package tags', () => {
- it('displays the package-tags component when the package has tags', async () => {
- await createComponent({
- packageEntity: {
- ...npmPackage,
- tags: mockTags,
- },
- });
-
- expect(packageTags().exists()).toBe(true);
- });
-
- it('does not display the package-tags component when there are no tags', async () => {
- await createComponent();
-
- expect(packageTags().exists()).toBe(false);
- });
- });
-
- describe('package ref', () => {
- it('does not display the ref if missing', async () => {
- await createComponent();
-
- expect(packageRef().exists()).toBe(false);
- });
-
- it('correctly shows the package ref if there is one', async () => {
- await createComponent({ packageEntity: npmPackage });
- expect(packageRef().props()).toMatchObject({
- text: npmPackage.pipeline.ref,
- icon: 'branch',
- });
- });
- });
-
- describe('pipeline project', () => {
- it('does not display the project if missing', async () => {
- await createComponent();
-
- expect(pipelineProject().exists()).toBe(false);
- });
-
- it('correctly shows the pipeline project if there is one', async () => {
- await createComponent({ packageEntity: npmPackage });
-
- expect(pipelineProject().props()).toMatchObject({
- text: npmPackage.pipeline.project.name,
- icon: 'review-list',
- link: npmPackage.pipeline.project.web_url,
- });
- });
- });
-});
diff --git a/spec/frontend/packages/details/components/pypi_installation_spec.js b/spec/frontend/packages/details/components/pypi_installation_spec.js
deleted file mode 100644
index 2cec84282d9..00000000000
--- a/spec/frontend/packages/details/components/pypi_installation_spec.js
+++ /dev/null
@@ -1,72 +0,0 @@
-import { shallowMount, createLocalVue } from '@vue/test-utils';
-import Vuex from 'vuex';
-import { pypiPackage as packageEntity } from 'jest/packages/mock_data';
-import InstallationTitle from '~/packages/details/components/installation_title.vue';
-import PypiInstallation from '~/packages/details/components/pypi_installation.vue';
-
-const localVue = createLocalVue();
-localVue.use(Vuex);
-
-describe('PypiInstallation', () => {
- let wrapper;
-
- const pipCommandStr = 'pip install';
- const pypiSetupStr = 'python setup';
-
- const store = new Vuex.Store({
- state: {
- packageEntity,
- pypiHelpPath: 'foo',
- },
- getters: {
- pypiPipCommand: () => pipCommandStr,
- pypiSetupCommand: () => pypiSetupStr,
- },
- });
-
- const pipCommand = () => wrapper.find('[data-testid="pip-command"]');
- const setupInstruction = () => wrapper.find('[data-testid="pypi-setup-content"]');
-
- const findInstallationTitle = () => wrapper.findComponent(InstallationTitle);
-
- function createComponent() {
- wrapper = shallowMount(PypiInstallation, {
- localVue,
- store,
- });
- }
-
- beforeEach(() => {
- createComponent();
- });
-
- afterEach(() => {
- wrapper.destroy();
- });
-
- describe('install command switch', () => {
- it('has the installation title component', () => {
- expect(findInstallationTitle().exists()).toBe(true);
- expect(findInstallationTitle().props()).toMatchObject({
- packageType: 'pypi',
- options: [{ value: 'pypi', label: 'Show PyPi commands' }],
- });
- });
- });
-
- it('renders all the messages', () => {
- expect(wrapper.element).toMatchSnapshot();
- });
-
- describe('installation commands', () => {
- it('renders the correct pip command', () => {
- expect(pipCommand().props('instruction')).toBe(pipCommandStr);
- });
- });
-
- describe('setup commands', () => {
- it('renders the correct setup block', () => {
- expect(setupInstruction().props('instruction')).toBe(pypiSetupStr);
- });
- });
-});
diff --git a/spec/frontend/packages/details/store/actions_spec.js b/spec/frontend/packages/details/store/actions_spec.js
deleted file mode 100644
index b16e50debc4..00000000000
--- a/spec/frontend/packages/details/store/actions_spec.js
+++ /dev/null
@@ -1,156 +0,0 @@
-import testAction from 'helpers/vuex_action_helper';
-import Api from '~/api';
-import createFlash from '~/flash';
-import { FETCH_PACKAGE_VERSIONS_ERROR } from '~/packages/details/constants';
-import {
- fetchPackageVersions,
- deletePackage,
- deletePackageFile,
-} from '~/packages/details/store/actions';
-import * as types from '~/packages/details/store/mutation_types';
-import {
- DELETE_PACKAGE_ERROR_MESSAGE,
- DELETE_PACKAGE_FILE_ERROR_MESSAGE,
- DELETE_PACKAGE_FILE_SUCCESS_MESSAGE,
-} from '~/packages/shared/constants';
-import { npmPackage as packageEntity } from '../../mock_data';
-
-jest.mock('~/flash.js');
-jest.mock('~/api.js');
-
-describe('Actions Package details store', () => {
- describe('fetchPackageVersions', () => {
- it('should fetch the package versions', (done) => {
- Api.projectPackage = jest.fn().mockResolvedValue({ data: packageEntity });
-
- testAction(
- fetchPackageVersions,
- undefined,
- { packageEntity },
- [
- { type: types.SET_LOADING, payload: true },
- { type: types.SET_PACKAGE_VERSIONS, payload: packageEntity.versions },
- { type: types.SET_LOADING, payload: false },
- ],
- [],
- () => {
- expect(Api.projectPackage).toHaveBeenCalledWith(
- packageEntity.project_id,
- packageEntity.id,
- );
- done();
- },
- );
- });
-
- it("does not set the versions if they don't exist", (done) => {
- Api.projectPackage = jest.fn().mockResolvedValue({ data: { packageEntity, versions: null } });
-
- testAction(
- fetchPackageVersions,
- undefined,
- { packageEntity },
- [
- { type: types.SET_LOADING, payload: true },
- { type: types.SET_LOADING, payload: false },
- ],
- [],
- () => {
- expect(Api.projectPackage).toHaveBeenCalledWith(
- packageEntity.project_id,
- packageEntity.id,
- );
- done();
- },
- );
- });
-
- it('should create flash on API error', (done) => {
- Api.projectPackage = jest.fn().mockRejectedValue();
-
- testAction(
- fetchPackageVersions,
- undefined,
- { packageEntity },
- [
- { type: types.SET_LOADING, payload: true },
- { type: types.SET_LOADING, payload: false },
- ],
- [],
- () => {
- expect(Api.projectPackage).toHaveBeenCalledWith(
- packageEntity.project_id,
- packageEntity.id,
- );
- expect(createFlash).toHaveBeenCalledWith({
- message: FETCH_PACKAGE_VERSIONS_ERROR,
- type: 'warning',
- });
- done();
- },
- );
- });
- });
-
- describe('deletePackage', () => {
- it('should call Api.deleteProjectPackage', (done) => {
- Api.deleteProjectPackage = jest.fn().mockResolvedValue();
- testAction(deletePackage, undefined, { packageEntity }, [], [], () => {
- expect(Api.deleteProjectPackage).toHaveBeenCalledWith(
- packageEntity.project_id,
- packageEntity.id,
- );
- done();
- });
- });
- it('should create flash on API error', (done) => {
- Api.deleteProjectPackage = jest.fn().mockRejectedValue();
-
- testAction(deletePackage, undefined, { packageEntity }, [], [], () => {
- expect(createFlash).toHaveBeenCalledWith({
- message: DELETE_PACKAGE_ERROR_MESSAGE,
- type: 'warning',
- });
- done();
- });
- });
- });
-
- describe('deletePackageFile', () => {
- const fileId = 'a_file_id';
-
- it('should call Api.deleteProjectPackageFile and commit the right data', (done) => {
- const packageFiles = [{ id: 'foo' }, { id: fileId }];
- Api.deleteProjectPackageFile = jest.fn().mockResolvedValue();
- testAction(
- deletePackageFile,
- fileId,
- { packageEntity, packageFiles },
- [{ type: types.UPDATE_PACKAGE_FILES, payload: [{ id: 'foo' }] }],
- [],
- () => {
- expect(Api.deleteProjectPackageFile).toHaveBeenCalledWith(
- packageEntity.project_id,
- packageEntity.id,
- fileId,
- );
- expect(createFlash).toHaveBeenCalledWith({
- message: DELETE_PACKAGE_FILE_SUCCESS_MESSAGE,
- type: 'success',
- });
- done();
- },
- );
- });
- it('should create flash on API error', (done) => {
- Api.deleteProjectPackageFile = jest.fn().mockRejectedValue();
- testAction(deletePackageFile, fileId, { packageEntity }, [], [], () => {
- expect(createFlash).toHaveBeenCalledWith({
- message: DELETE_PACKAGE_FILE_ERROR_MESSAGE,
- type: 'warning',
- });
- done();
- });
- });
- });
-});
diff --git a/spec/frontend/packages/details/store/getters_spec.js b/spec/frontend/packages/details/store/getters_spec.js
deleted file mode 100644
index 8210511bf8f..00000000000
--- a/spec/frontend/packages/details/store/getters_spec.js
+++ /dev/null
@@ -1,295 +0,0 @@
-import { NpmManager } from '~/packages/details/constants';
-import {
- conanInstallationCommand,
- conanSetupCommand,
- packagePipeline,
- packageTypeDisplay,
- packageIcon,
- mavenInstallationXml,
- mavenInstallationCommand,
- mavenSetupXml,
- npmInstallationCommand,
- npmSetupCommand,
- nugetInstallationCommand,
- nugetSetupCommand,
- pypiPipCommand,
- pypiSetupCommand,
- composerRegistryInclude,
- composerPackageInclude,
- groupExists,
- gradleGroovyInstalCommand,
- gradleGroovyAddSourceCommand,
- gradleKotlinInstalCommand,
- gradleKotlinAddSourceCommand,
-} from '~/packages/details/store/getters';
-import {
- conanPackage,
- npmPackage,
- nugetPackage,
- mockPipelineInfo,
- mavenPackage as packageWithoutBuildInfo,
- pypiPackage,
- rubygemsPackage,
-} from '../../mock_data';
-import {
- generateMavenCommand,
- generateXmlCodeBlock,
- generateMavenSetupXml,
- registryUrl,
- pypiSetupCommandStr,
-} from '../mock_data';
-
-describe('Getters PackageDetails Store', () => {
- let state;
-
- const defaultState = {
- packageEntity: packageWithoutBuildInfo,
- conanPath: registryUrl,
- mavenPath: registryUrl,
- npmPath: registryUrl,
- nugetPath: registryUrl,
- pypiPath: registryUrl,
- };
-
- const setupState = (testState = {}) => {
- state = {
- ...defaultState,
- ...testState,
- };
- };
-
- const conanInstallationCommandStr = `conan install ${conanPackage.name} --remote=gitlab`;
- const conanSetupCommandStr = `conan remote add gitlab ${registryUrl}`;
-
- const mavenCommandStr = generateMavenCommand(packageWithoutBuildInfo.maven_metadatum);
- const mavenInstallationXmlBlock = generateXmlCodeBlock(packageWithoutBuildInfo.maven_metadatum);
- const mavenSetupXmlBlock = generateMavenSetupXml();
-
- const npmInstallStr = `npm i ${npmPackage.name}`;
- const npmSetupStr = `echo @Test:registry=${registryUrl}/ >> .npmrc`;
- const yarnInstallStr = `yarn add ${npmPackage.name}`;
- const yarnSetupStr = `echo \\"@Test:registry\\" \\"${registryUrl}/\\" >> .yarnrc`;
-
- const nugetInstallationCommandStr = `nuget install ${nugetPackage.name} -Source "GitLab"`;
- const nugetSetupCommandStr = `nuget source Add -Name "GitLab" -Source "${registryUrl}" -UserName <your_username> -Password <your_token>`;
-
- const pypiPipCommandStr = `pip install ${pypiPackage.name} --extra-index-url ${registryUrl}`;
- const composerRegistryIncludeStr =
- 'composer config repositories.gitlab.com/123 \'{"type": "composer", "url": "foo"}\'';
- const composerPackageIncludeStr = `composer req ${[packageWithoutBuildInfo.name]}:${
- packageWithoutBuildInfo.version
- }`;
-
- describe('packagePipeline', () => {
- it('should return the pipeline info when pipeline exists', () => {
- setupState({
- packageEntity: {
- ...npmPackage,
- pipeline: mockPipelineInfo,
- },
- });
-
- expect(packagePipeline(state)).toEqual(mockPipelineInfo);
- });
-
- it('should return null when build_info does not exist', () => {
- setupState();
-
- expect(packagePipeline(state)).toBe(null);
- });
- });
-
- describe('packageTypeDisplay', () => {
- describe.each`
- packageEntity | expectedResult
- ${conanPackage} | ${'Conan'}
- ${packageWithoutBuildInfo} | ${'Maven'}
- ${npmPackage} | ${'npm'}
- ${nugetPackage} | ${'NuGet'}
- ${pypiPackage} | ${'PyPI'}
- ${rubygemsPackage} | ${'RubyGems'}
- `(`package type`, ({ packageEntity, expectedResult }) => {
- beforeEach(() => setupState({ packageEntity }));
-
- it(`${packageEntity.package_type} should show as ${expectedResult}`, () => {
- expect(packageTypeDisplay(state)).toBe(expectedResult);
- });
- });
- });
-
- describe('packageIcon', () => {
- describe('nuget packages', () => {
- it('should return nuget package icon', () => {
- setupState({ packageEntity: nugetPackage });
-
- expect(packageIcon(state)).toBe(nugetPackage.nuget_metadatum.icon_url);
- });
-
- it('should return null when nuget package does not have an icon', () => {
- setupState({ packageEntity: { ...nugetPackage, nuget_metadatum: {} } });
-
- expect(packageIcon(state)).toBe(null);
- });
- });
-
- it('should not find icons for other package types', () => {
- setupState({ packageEntity: npmPackage });
-
- expect(packageIcon(state)).toBe(null);
- });
- });
-
- describe('conan string getters', () => {
- it('gets the correct conanInstallationCommand', () => {
- setupState({ packageEntity: conanPackage });
-
- expect(conanInstallationCommand(state)).toBe(conanInstallationCommandStr);
- });
-
- it('gets the correct conanSetupCommand', () => {
- setupState({ packageEntity: conanPackage });
-
- expect(conanSetupCommand(state)).toBe(conanSetupCommandStr);
- });
- });
-
- describe('maven string getters', () => {
- it('gets the correct mavenInstallationXml', () => {
- setupState();
-
- expect(mavenInstallationXml(state)).toBe(mavenInstallationXmlBlock);
- });
-
- it('gets the correct mavenInstallationCommand', () => {
- setupState();
-
- expect(mavenInstallationCommand(state)).toBe(mavenCommandStr);
- });
-
- it('gets the correct mavenSetupXml', () => {
- setupState();
-
- expect(mavenSetupXml(state)).toBe(mavenSetupXmlBlock);
- });
- });
-
- describe('npm string getters', () => {
- it('gets the correct npmInstallationCommand for npm', () => {
- setupState({ packageEntity: npmPackage });
-
- expect(npmInstallationCommand(state)(NpmManager.NPM)).toBe(npmInstallStr);
- });
-
- it('gets the correct npmSetupCommand for npm', () => {
- setupState({ packageEntity: npmPackage });
-
- expect(npmSetupCommand(state)(NpmManager.NPM)).toBe(npmSetupStr);
- });
-
- it('gets the correct npmInstallationCommand for Yarn', () => {
- setupState({ packageEntity: npmPackage });
-
- expect(npmInstallationCommand(state)(NpmManager.YARN)).toBe(yarnInstallStr);
- });
-
- it('gets the correct npmSetupCommand for Yarn', () => {
- setupState({ packageEntity: npmPackage });
-
- expect(npmSetupCommand(state)(NpmManager.YARN)).toBe(yarnSetupStr);
- });
- });
-
- describe('nuget string getters', () => {
- it('gets the correct nugetInstallationCommand', () => {
- setupState({ packageEntity: nugetPackage });
-
- expect(nugetInstallationCommand(state)).toBe(nugetInstallationCommandStr);
- });
-
- it('gets the correct nugetSetupCommand', () => {
- setupState({ packageEntity: nugetPackage });
-
- expect(nugetSetupCommand(state)).toBe(nugetSetupCommandStr);
- });
- });
-
- describe('pypi string getters', () => {
- it('gets the correct pypiPipCommand', () => {
- setupState({ packageEntity: pypiPackage });
-
- expect(pypiPipCommand(state)).toBe(pypiPipCommandStr);
- });
-
- it('gets the correct pypiSetupCommand', () => {
- setupState({ pypiSetupPath: 'foo' });
-
- expect(pypiSetupCommand(state)).toBe(pypiSetupCommandStr);
- });
- });
-
- describe('composer string getters', () => {
- it('gets the correct composerRegistryInclude command', () => {
- setupState({ composerPath: 'foo', composerConfigRepositoryName: 'gitlab.com/123' });
-
- expect(composerRegistryInclude(state)).toBe(composerRegistryIncludeStr);
- });
-
- it('gets the correct composerPackageInclude command', () => {
- setupState();
-
- expect(composerPackageInclude(state)).toBe(composerPackageIncludeStr);
- });
- });
-
- describe('gradle groovy string getters', () => {
- it('gets the correct gradleGroovyInstalCommand', () => {
- setupState();
-
- expect(gradleGroovyInstalCommand(state)).toMatchInlineSnapshot(
- `"implementation 'com.test.app:test-app:1.0-SNAPSHOT'"`,
- );
- });
-
- it('gets the correct gradleGroovyAddSourceCommand', () => {
- setupState();
-
- expect(gradleGroovyAddSourceCommand(state)).toMatchInlineSnapshot(`
- "maven {
- url 'foo/registry'
- }"
- `);
- });
- });
-
- describe('gradle kotlin string getters', () => {
- it('gets the correct gradleKotlinInstalCommand', () => {
- setupState();
-
- expect(gradleKotlinInstalCommand(state)).toMatchInlineSnapshot(
- `"implementation(\\"com.test.app:test-app:1.0-SNAPSHOT\\")"`,
- );
- });
-
- it('gets the correct gradleKotlinAddSourceCommand', () => {
- setupState();
-
- expect(gradleKotlinAddSourceCommand(state)).toMatchInlineSnapshot(
- `"maven(\\"foo/registry\\")"`,
- );
- });
- });
-
- describe('check if group', () => {
- it('is set', () => {
- setupState({ groupListUrl: '/groups/composer/-/packages' });
-
- expect(groupExists(state)).toBe(true);
- });
-
- it('is not set', () => {
- setupState({ groupListUrl: '' });
-
- expect(groupExists(state)).toBe(false);
- });
- });
-});
diff --git a/spec/frontend/packages/details/store/mutations_spec.js b/spec/frontend/packages/details/store/mutations_spec.js
deleted file mode 100644
index 296ed02d786..00000000000
--- a/spec/frontend/packages/details/store/mutations_spec.js
+++ /dev/null
@@ -1,40 +0,0 @@
-import * as types from '~/packages/details/store/mutation_types';
-import mutations from '~/packages/details/store/mutations';
-import { npmPackage as packageEntity } from '../../mock_data';
-
-describe('Mutations package details Store', () => {
- let mockState;
-
- beforeEach(() => {
- mockState = {
- packageEntity,
- };
- });
-
- describe('SET_LOADING', () => {
- it('should set loading', () => {
- mutations[types.SET_LOADING](mockState, true);
-
- expect(mockState.isLoading).toEqual(true);
- });
- });
-
- describe('SET_PACKAGE_VERSIONS', () => {
- it('should set the package entity versions', () => {
- const fakeVersions = [1, 2, 3];
-
- mutations[types.SET_PACKAGE_VERSIONS](mockState, fakeVersions);
-
- expect(mockState.packageEntity.versions).toEqual(fakeVersions);
- });
- });
- describe('UPDATE_PACKAGE_FILES', () => {
- it('should update the packageFiles', () => {
- const files = [1, 2, 3];
-
- mutations[types.UPDATE_PACKAGE_FILES](mockState, files);
-
- expect(mockState.packageFiles).toEqual(files);
- });
- });
-});
diff --git a/spec/frontend/packages/shared/components/package_list_row_spec.js b/spec/frontend/packages/shared/components/package_list_row_spec.js
index bd15d48c4eb..5f2fc8ddfbd 100644
--- a/spec/frontend/packages/shared/components/package_list_row_spec.js
+++ b/spec/frontend/packages/shared/components/package_list_row_spec.js
@@ -1,5 +1,5 @@
import { GlLink } from '@gitlab/ui';
-import { shallowMount } from '@vue/test-utils';
+import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
import { createMockDirective, getBinding } from 'helpers/vue_mock_directive';
import PackagesListRow from '~/packages/shared/components/package_list_row.vue';
@@ -19,14 +19,14 @@ describe('packages_list_row', () => {
const InfrastructureIconAndName = { name: 'InfrastructureIconAndName', template: '<div></div>' };
const PackageIconAndName = { name: 'PackageIconAndName', template: '<div></div>' };
- const findPackageTags = () => wrapper.find(PackageTags);
- const findPackagePath = () => wrapper.find(PackagePath);
- const findDeleteButton = () => wrapper.find('[data-testid="action-delete"]');
- const findPackageIconAndName = () => wrapper.find(PackageIconAndName);
+ const findPackageTags = () => wrapper.findComponent(PackageTags);
+ const findPackagePath = () => wrapper.findComponent(PackagePath);
+ const findDeleteButton = () => wrapper.findByTestId('action-delete');
+ const findPackageIconAndName = () => wrapper.findComponent(PackageIconAndName);
const findInfrastructureIconAndName = () => wrapper.findComponent(InfrastructureIconAndName);
const findListItem = () => wrapper.findComponent(ListItem);
const findPackageLink = () => wrapper.findComponent(GlLink);
- const findWarningIcon = () => wrapper.find('[data-testid="warning-icon"]');
+ const findWarningIcon = () => wrapper.findByTestId('warning-icon');
const mountComponent = ({
isGroup = false,
@@ -35,7 +35,7 @@ describe('packages_list_row', () => {
disableDelete = false,
provide,
} = {}) => {
- wrapper = shallowMount(PackagesListRow, {
+ wrapper = shallowMountExtended(PackagesListRow, {
store,
provide,
stubs: {
diff --git a/spec/frontend/packages_and_registries/dependency_proxy/app_spec.js b/spec/frontend/packages_and_registries/dependency_proxy/app_spec.js
new file mode 100644
index 00000000000..1f0252965b0
--- /dev/null
+++ b/spec/frontend/packages_and_registries/dependency_proxy/app_spec.js
@@ -0,0 +1,173 @@
+import { GlFormInputGroup, GlFormGroup, GlSkeletonLoader, GlSprintf } from '@gitlab/ui';
+import { createLocalVue } from '@vue/test-utils';
+import VueApollo from 'vue-apollo';
+import createMockApollo from 'helpers/mock_apollo_helper';
+import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
+import waitForPromises from 'helpers/wait_for_promises';
+
+import DependencyProxyApp from '~/packages_and_registries/dependency_proxy/app.vue';
+import ClipboardButton from '~/vue_shared/components/clipboard_button.vue';
+
+import getDependencyProxyDetailsQuery from '~/packages_and_registries/dependency_proxy/graphql/queries/get_dependency_proxy_details.query.graphql';
+
+import { proxyDetailsQuery, proxyData } from './mock_data';
+
+const localVue = createLocalVue();
+
+describe('DependencyProxyApp', () => {
+ let wrapper;
+ let apolloProvider;
+
+ const provideDefaults = {
+ groupPath: 'gitlab-org',
+ dependencyProxyAvailable: true,
+ };
+
+ function createComponent({
+ provide = provideDefaults,
+ resolver = jest.fn().mockResolvedValue(proxyDetailsQuery()),
+ } = {}) {
+ localVue.use(VueApollo);
+
+ const requestHandlers = [[getDependencyProxyDetailsQuery, resolver]];
+
+ apolloProvider = createMockApollo(requestHandlers);
+
+ wrapper = shallowMountExtended(DependencyProxyApp, {
+ localVue,
+ apolloProvider,
+ provide,
+ stubs: {
+ GlFormInputGroup,
+ GlFormGroup,
+ GlSprintf,
+ },
+ });
+ }
+
+ const findProxyNotAvailableAlert = () => wrapper.findByTestId('proxy-not-available');
+ const findProxyDisabledAlert = () => wrapper.findByTestId('proxy-disabled');
+ const findClipBoardButton = () => wrapper.findComponent(ClipboardButton);
+ const findFormGroup = () => wrapper.findComponent(GlFormGroup);
+ const findFormInputGroup = () => wrapper.findComponent(GlFormInputGroup);
+ const findSkeletonLoader = () => wrapper.findComponent(GlSkeletonLoader);
+ const findMainArea = () => wrapper.findByTestId('main-area');
+ const findProxyCountText = () => wrapper.findByTestId('proxy-count');
+
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ describe('when the dependency proxy is not available', () => {
+ const createComponentArguments = {
+ provide: { ...provideDefaults, dependencyProxyAvailable: false },
+ };
+
+ it('renders an info alert', () => {
+ createComponent(createComponentArguments);
+
+ expect(findProxyNotAvailableAlert().text()).toBe(
+ DependencyProxyApp.i18n.proxyNotAvailableText,
+ );
+ });
+
+ it('does not render the main area', () => {
+ createComponent(createComponentArguments);
+
+ expect(findMainArea().exists()).toBe(false);
+ });
+
+ it('does not call the graphql endpoint', async () => {
+ const resolver = jest.fn().mockResolvedValue(proxyDetailsQuery());
+ createComponent({ ...createComponentArguments, resolver });
+
+ await waitForPromises();
+
+ expect(resolver).not.toHaveBeenCalled();
+ });
+ });
+
+ describe('when the dependency proxy is available', () => {
+ describe('when is loading', () => {
+ it('renders the skeleton loader', () => {
+ createComponent();
+
+ expect(findSkeletonLoader().exists()).toBe(true);
+ });
+
+ it('does not show the main section', () => {
+ createComponent();
+
+ expect(findMainArea().exists()).toBe(false);
+ });
+
+ it('does not render the info alert', () => {
+ createComponent();
+
+ expect(findProxyNotAvailableAlert().exists()).toBe(false);
+ });
+ });
+
+ describe('when the app is loaded', () => {
+ describe('when the dependency proxy is enabled', () => {
+ beforeEach(() => {
+ createComponent();
+ return waitForPromises();
+ });
+
+ it('does not render the info alert', () => {
+ expect(findProxyNotAvailableAlert().exists()).toBe(false);
+ });
+
+ it('renders the main area', () => {
+ expect(findMainArea().exists()).toBe(true);
+ });
+
+ it('renders a form group with a label', () => {
+ expect(findFormGroup().attributes('label')).toBe(
+ DependencyProxyApp.i18n.proxyImagePrefix,
+ );
+ });
+
+ it('renders a form input group', () => {
+ expect(findFormInputGroup().exists()).toBe(true);
+ expect(findFormInputGroup().props('value')).toBe(proxyData().dependencyProxyImagePrefix);
+ });
+
+ it('form input group has a clipboard button', () => {
+ expect(findClipBoardButton().exists()).toBe(true);
+ expect(findClipBoardButton().props()).toMatchObject({
+ text: proxyData().dependencyProxyImagePrefix,
+ title: DependencyProxyApp.i18n.copyImagePrefixText,
+ });
+ });
+
+ it('from group has a description with proxy count', () => {
+ expect(findProxyCountText().text()).toBe('Contains 2 blobs of images (1024 Bytes)');
+ });
+ });
+ describe('when the dependency proxy is disabled', () => {
+ beforeEach(() => {
+ createComponent({
+ resolver: jest
+ .fn()
+ .mockResolvedValue(proxyDetailsQuery({ extendSettings: { enabled: false } })),
+ });
+ return waitForPromises();
+ });
+
+ it('does not show the main area', () => {
+ expect(findMainArea().exists()).toBe(false);
+ });
+
+ it('does not show the loader', () => {
+ expect(findSkeletonLoader().exists()).toBe(false);
+ });
+
+ it('shows a proxy disabled alert', () => {
+ expect(findProxyDisabledAlert().text()).toBe(DependencyProxyApp.i18n.proxyDisabledText);
+ });
+ });
+ });
+ });
+});
diff --git a/spec/frontend/packages_and_registries/dependency_proxy/mock_data.js b/spec/frontend/packages_and_registries/dependency_proxy/mock_data.js
new file mode 100644
index 00000000000..23d42e109f9
--- /dev/null
+++ b/spec/frontend/packages_and_registries/dependency_proxy/mock_data.js
@@ -0,0 +1,21 @@
+export const proxyData = () => ({
+ dependencyProxyBlobCount: 2,
+ dependencyProxyTotalSize: '1024 Bytes',
+ dependencyProxyImagePrefix: 'gdk.test:3000/private-group/dependency_proxy/containers',
+ dependencyProxySetting: { enabled: true, __typename: 'DependencyProxySetting' },
+});
+
+export const proxySettings = (extend = {}) => ({ enabled: true, ...extend });
+
+export const proxyDetailsQuery = ({ extendSettings = {} } = {}) => ({
+ data: {
+ group: {
+ ...proxyData(),
+ __typename: 'Group',
+ dependencyProxySetting: {
+ ...proxySettings(extendSettings),
+ __typename: 'DependencyProxySetting',
+ },
+ },
+ },
+});
diff --git a/spec/frontend/packages/details/components/__snapshots__/file_sha_spec.js.snap b/spec/frontend/packages_and_registries/infrastructure_registry/components/details/components/__snapshots__/file_sha_spec.js.snap
index 881d441e116..881d441e116 100644
--- a/spec/frontend/packages/details/components/__snapshots__/file_sha_spec.js.snap
+++ b/spec/frontend/packages_and_registries/infrastructure_registry/components/details/components/__snapshots__/file_sha_spec.js.snap
diff --git a/spec/frontend/packages_and_registries/infrastructure_registry/components/__snapshots__/terraform_installation_spec.js.snap b/spec/frontend/packages_and_registries/infrastructure_registry/components/details/components/__snapshots__/terraform_installation_spec.js.snap
index 03236737572..03236737572 100644
--- a/spec/frontend/packages_and_registries/infrastructure_registry/components/__snapshots__/terraform_installation_spec.js.snap
+++ b/spec/frontend/packages_and_registries/infrastructure_registry/components/details/components/__snapshots__/terraform_installation_spec.js.snap
diff --git a/spec/frontend/packages_and_registries/infrastructure_registry/components/details/components/app_spec.js b/spec/frontend/packages_and_registries/infrastructure_registry/components/details/components/app_spec.js
new file mode 100644
index 00000000000..c7c10cef504
--- /dev/null
+++ b/spec/frontend/packages_and_registries/infrastructure_registry/components/details/components/app_spec.js
@@ -0,0 +1,321 @@
+import { GlEmptyState } from '@gitlab/ui';
+import { mount, createLocalVue } from '@vue/test-utils';
+import { nextTick } from 'vue';
+import Vuex from 'vuex';
+import { useMockLocationHelper } from 'helpers/mock_window_location_helper';
+import stubChildren from 'helpers/stub_children';
+
+import PackagesApp from '~/packages_and_registries/infrastructure_registry/details/components/app.vue';
+import PackageFiles from '~/packages_and_registries/infrastructure_registry/details/components/package_files.vue';
+import PackageHistory from '~/packages_and_registries/infrastructure_registry/details/components/package_history.vue';
+import * as getters from '~/packages_and_registries/infrastructure_registry/details/store/getters';
+import PackageListRow from '~/packages/shared/components/package_list_row.vue';
+import PackagesListLoader from '~/packages/shared/components/packages_list_loader.vue';
+import { TrackingActions } from '~/packages/shared/constants';
+import * as SharedUtils from '~/packages/shared/utils';
+import TerraformTitle from '~/packages_and_registries/infrastructure_registry/details/components/details_title.vue';
+import TerraformInstallation from '~/packages_and_registries/infrastructure_registry/details/components/terraform_installation.vue';
+import Tracking from '~/tracking';
+
+import { mavenPackage, mavenFiles, npmPackage } from 'jest/packages/mock_data';
+
+const localVue = createLocalVue();
+localVue.use(Vuex);
+
+useMockLocationHelper();
+
+describe('PackagesApp', () => {
+ let wrapper;
+ let store;
+ const fetchPackageVersions = jest.fn();
+ const deletePackage = jest.fn();
+ const deletePackageFile = jest.fn();
+ const defaultProjectName = 'bar';
+
+ function createComponent({
+ packageEntity = mavenPackage,
+ packageFiles = mavenFiles,
+ isLoading = false,
+ projectName = defaultProjectName,
+ } = {}) {
+ store = new Vuex.Store({
+ state: {
+ isLoading,
+ packageEntity,
+ packageFiles,
+ canDelete: true,
+ emptySvgPath: 'empty-illustration',
+ npmPath: 'foo',
+ npmHelpPath: 'foo',
+ projectName,
+ projectListUrl: 'project_url',
+ groupListUrl: 'group_url',
+ },
+ actions: {
+ deletePackage,
+ fetchPackageVersions,
+ deletePackageFile,
+ },
+ getters,
+ });
+
+ wrapper = mount(PackagesApp, {
+ localVue,
+ store,
+ stubs: {
+ ...stubChildren(PackagesApp),
+ TerraformTitle: false,
+ TitleArea: false,
+ GlButton: false,
+ GlModal: false,
+ GlTab: false,
+ GlTabs: false,
+ GlTable: false,
+ },
+ });
+ }
+
+ const packageTitle = () => wrapper.findComponent(TerraformTitle);
+ const emptyState = () => wrapper.findComponent(GlEmptyState);
+ const deleteButton = () => wrapper.find('.js-delete-button');
+ const findDeleteModal = () => wrapper.find({ ref: 'deleteModal' });
+ const findDeleteFileModal = () => wrapper.find({ ref: 'deleteFileModal' });
+ const versionsTab = () => wrapper.find('.js-versions-tab > a');
+ const packagesLoader = () => wrapper.findComponent(PackagesListLoader);
+ const packagesVersionRows = () => wrapper.findAllComponents(PackageListRow);
+ const noVersionsMessage = () => wrapper.find('[data-testid="no-versions-message"]');
+ const findPackageHistory = () => wrapper.findComponent(PackageHistory);
+ const findTerraformInstallation = () => wrapper.findComponent(TerraformInstallation);
+ const findPackageFiles = () => wrapper.findComponent(PackageFiles);
+
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ it('renders the app and displays the package title', async () => {
+ createComponent();
+
+ await nextTick();
+
+ expect(packageTitle().exists()).toBe(true);
+ });
+
+ it('renders an empty state component when no an invalid package is passed as a prop', () => {
+ createComponent({
+ packageEntity: {},
+ });
+
+ expect(emptyState().exists()).toBe(true);
+ });
+
+ it('package history has the right props', () => {
+ createComponent();
+ expect(findPackageHistory().exists()).toBe(true);
+ expect(findPackageHistory().props('packageEntity')).toEqual(wrapper.vm.packageEntity);
+ expect(findPackageHistory().props('projectName')).toEqual(wrapper.vm.projectName);
+ });
+
+ it('terraform installation exists', () => {
+ createComponent();
+
+ expect(findTerraformInstallation().exists()).toBe(true);
+ });
+
+ describe('deleting packages', () => {
+ beforeEach(() => {
+ createComponent();
+ deleteButton().trigger('click');
+ });
+
+ it('shows the delete confirmation modal when delete is clicked', () => {
+ expect(findDeleteModal().exists()).toBe(true);
+ });
+ });
+
+ describe('deleting package files', () => {
+ it('shows the delete confirmation modal when delete is clicked', () => {
+ createComponent();
+ findPackageFiles().vm.$emit('delete-file', mavenFiles[0]);
+
+ expect(findDeleteFileModal().exists()).toBe(true);
+ });
+ });
+
+ describe('versions', () => {
+ describe('api call', () => {
+ beforeEach(() => {
+ createComponent();
+ });
+
+ it('makes api request on first click of tab', () => {
+ versionsTab().trigger('click');
+
+ expect(fetchPackageVersions).toHaveBeenCalled();
+ });
+ });
+
+ it('displays the loader when state is loading', () => {
+ createComponent({ isLoading: true });
+
+ expect(packagesLoader().exists()).toBe(true);
+ });
+
+ it('displays the correct version count when the package has versions', () => {
+ createComponent({ packageEntity: npmPackage });
+
+ expect(packagesVersionRows()).toHaveLength(npmPackage.versions.length);
+ });
+
+ it('displays the no versions message when there are none', () => {
+ createComponent();
+
+ expect(noVersionsMessage().exists()).toBe(true);
+ });
+ });
+
+ describe('tracking and delete', () => {
+ describe('delete package', () => {
+ const originalReferrer = document.referrer;
+ const setReferrer = (value = defaultProjectName) => {
+ Object.defineProperty(document, 'referrer', {
+ value,
+ configurable: true,
+ });
+ };
+
+ afterEach(() => {
+ Object.defineProperty(document, 'referrer', {
+ value: originalReferrer,
+ configurable: true,
+ });
+ });
+
+ it('calls the proper vuex action', () => {
+ createComponent({ packageEntity: npmPackage });
+ findDeleteModal().vm.$emit('primary');
+ expect(deletePackage).toHaveBeenCalled();
+ });
+
+ it('when referrer contains project name calls window.replace with project url', async () => {
+ setReferrer();
+ deletePackage.mockResolvedValue();
+ createComponent({ packageEntity: npmPackage });
+ findDeleteModal().vm.$emit('primary');
+ await deletePackage();
+ expect(window.location.replace).toHaveBeenCalledWith(
+ 'project_url?showSuccessDeleteAlert=true',
+ );
+ });
+
+ it('when referrer does not contain project name calls window.replace with group url', async () => {
+ setReferrer('baz');
+ deletePackage.mockResolvedValue();
+ createComponent({ packageEntity: npmPackage });
+ findDeleteModal().vm.$emit('primary');
+ await deletePackage();
+ expect(window.location.replace).toHaveBeenCalledWith(
+ 'group_url?showSuccessDeleteAlert=true',
+ );
+ });
+ });
+
+ describe('delete file', () => {
+ it('calls the proper vuex action', () => {
+ createComponent({ packageEntity: npmPackage });
+
+ findPackageFiles().vm.$emit('delete-file', mavenFiles[0]);
+ findDeleteFileModal().vm.$emit('primary');
+
+ expect(deletePackageFile).toHaveBeenCalled();
+ });
+ });
+
+ describe('tracking', () => {
+ let eventSpy;
+ let utilSpy;
+ const category = 'foo';
+
+ beforeEach(() => {
+ eventSpy = jest.spyOn(Tracking, 'event');
+ utilSpy = jest.spyOn(SharedUtils, 'packageTypeToTrackCategory').mockReturnValue(category);
+ });
+
+ it('tracking category calls packageTypeToTrackCategory', () => {
+ createComponent({ packageEntity: npmPackage });
+ expect(wrapper.vm.tracking.category).toBe(category);
+ expect(utilSpy).toHaveBeenCalledWith('npm');
+ });
+
+ it(`delete button on delete modal call event with ${TrackingActions.DELETE_PACKAGE}`, () => {
+ createComponent({ packageEntity: npmPackage });
+ findDeleteModal().vm.$emit('primary');
+ expect(eventSpy).toHaveBeenCalledWith(
+ category,
+ TrackingActions.DELETE_PACKAGE,
+ expect.any(Object),
+ );
+ });
+
+ it(`canceling a package deletion tracks ${TrackingActions.CANCEL_DELETE_PACKAGE}`, () => {
+ createComponent({ packageEntity: npmPackage });
+
+ findDeleteModal().vm.$emit('canceled');
+
+ expect(eventSpy).toHaveBeenCalledWith(
+ category,
+ TrackingActions.CANCEL_DELETE_PACKAGE,
+ expect.any(Object),
+ );
+ });
+
+ it(`request a file deletion tracks ${TrackingActions.REQUEST_DELETE_PACKAGE_FILE}`, () => {
+ createComponent({ packageEntity: npmPackage });
+
+ findPackageFiles().vm.$emit('delete-file', mavenFiles[0]);
+
+ expect(eventSpy).toHaveBeenCalledWith(
+ category,
+ TrackingActions.REQUEST_DELETE_PACKAGE_FILE,
+ expect.any(Object),
+ );
+ });
+
+ it(`confirming a file deletion tracks ${TrackingActions.DELETE_PACKAGE_FILE}`, () => {
+ createComponent({ packageEntity: npmPackage });
+
+ findPackageFiles().vm.$emit('delete-file', npmPackage);
+ findDeleteFileModal().vm.$emit('primary');
+
+ expect(eventSpy).toHaveBeenCalledWith(
+ category,
+ TrackingActions.REQUEST_DELETE_PACKAGE_FILE,
+ expect.any(Object),
+ );
+ });
+
+ it(`canceling a file deletion tracks ${TrackingActions.CANCEL_DELETE_PACKAGE_FILE}`, () => {
+ createComponent({ packageEntity: npmPackage });
+
+ findPackageFiles().vm.$emit('delete-file', npmPackage);
+ findDeleteFileModal().vm.$emit('canceled');
+
+ expect(eventSpy).toHaveBeenCalledWith(
+ category,
+ TrackingActions.CANCEL_DELETE_PACKAGE_FILE,
+ expect.any(Object),
+ );
+ });
+
+ it(`file download link call event with ${TrackingActions.PULL_PACKAGE}`, () => {
+ createComponent({ packageEntity: npmPackage });
+
+ findPackageFiles().vm.$emit('download-file');
+ expect(eventSpy).toHaveBeenCalledWith(
+ category,
+ TrackingActions.PULL_PACKAGE,
+ expect.any(Object),
+ );
+ });
+ });
+ });
+});
diff --git a/spec/frontend/packages_and_registries/infrastructure_registry/components/details/components/details_title_spec.js b/spec/frontend/packages_and_registries/infrastructure_registry/components/details/components/details_title_spec.js
new file mode 100644
index 00000000000..a012ec4ab05
--- /dev/null
+++ b/spec/frontend/packages_and_registries/infrastructure_registry/components/details/components/details_title_spec.js
@@ -0,0 +1,93 @@
+import { shallowMount, createLocalVue } from '@vue/test-utils';
+import Vuex from 'vuex';
+import { terraformModule, mavenFiles, npmPackage } from 'jest/packages/mock_data';
+import component from '~/packages_and_registries/infrastructure_registry/details/components/details_title.vue';
+import TitleArea from '~/vue_shared/components/registry/title_area.vue';
+
+const localVue = createLocalVue();
+localVue.use(Vuex);
+
+describe('PackageTitle', () => {
+ let wrapper;
+ let store;
+
+ function createComponent({ packageFiles = mavenFiles, packageEntity = terraformModule } = {}) {
+ store = new Vuex.Store({
+ state: {
+ packageEntity,
+ packageFiles,
+ },
+ getters: {
+ packagePipeline: ({ packageEntity: { pipeline = null } }) => pipeline,
+ },
+ });
+
+ wrapper = shallowMount(component, {
+ localVue,
+ store,
+ stubs: {
+ TitleArea,
+ },
+ });
+ return wrapper.vm.$nextTick();
+ }
+
+ const findTitleArea = () => wrapper.findComponent(TitleArea);
+ const packageSize = () => wrapper.find('[data-testid="package-size"]');
+ const pipelineProject = () => wrapper.find('[data-testid="pipeline-project"]');
+ const packageRef = () => wrapper.find('[data-testid="package-ref"]');
+
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ describe('module title', () => {
+ it('is correctly bound', async () => {
+ await createComponent();
+
+ expect(findTitleArea().props('title')).toBe(terraformModule.name);
+ });
+ });
+
+ describe('calculates the package size', () => {
+ it('correctly calculates the size', async () => {
+ await createComponent();
+
+ expect(packageSize().props('text')).toBe('300 bytes');
+ });
+ });
+
+ describe('package ref', () => {
+ it('does not display the ref if missing', async () => {
+ await createComponent();
+
+ expect(packageRef().exists()).toBe(false);
+ });
+
+ it('correctly shows the package ref if there is one', async () => {
+ await createComponent({ packageEntity: npmPackage });
+ expect(packageRef().props()).toMatchObject({
+ text: npmPackage.pipeline.ref,
+ icon: 'branch',
+ });
+ });
+ });
+
+ describe('pipeline project', () => {
+ it('does not display the project if missing', async () => {
+ await createComponent();
+
+ expect(pipelineProject().exists()).toBe(false);
+ });
+
+ it('correctly shows the pipeline project if there is one', async () => {
+ await createComponent({ packageEntity: npmPackage });
+
+ expect(pipelineProject().props()).toMatchObject({
+ text: npmPackage.pipeline.project.name,
+ icon: 'review-list',
+ link: npmPackage.pipeline.project.web_url,
+ });
+ });
+ });
+});
diff --git a/spec/frontend/packages_and_registries/infrastructure_registry/components/details/components/file_sha_spec.js b/spec/frontend/packages_and_registries/infrastructure_registry/components/details/components/file_sha_spec.js
new file mode 100644
index 00000000000..9ce590bfb51
--- /dev/null
+++ b/spec/frontend/packages_and_registries/infrastructure_registry/components/details/components/file_sha_spec.js
@@ -0,0 +1,33 @@
+import { shallowMount } from '@vue/test-utils';
+
+import FileSha from '~/packages_and_registries/infrastructure_registry/details/components/file_sha.vue';
+import ClipboardButton from '~/vue_shared/components/clipboard_button.vue';
+import DetailsRow from '~/vue_shared/components/registry/details_row.vue';
+
+describe('FileSha', () => {
+ let wrapper;
+
+ const defaultProps = { sha: 'foo', title: 'bar' };
+
+ function createComponent() {
+ wrapper = shallowMount(FileSha, {
+ propsData: {
+ ...defaultProps,
+ },
+ stubs: {
+ ClipboardButton,
+ DetailsRow,
+ },
+ });
+ }
+
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ it('renders', () => {
+ createComponent();
+
+ expect(wrapper.element).toMatchSnapshot();
+ });
+});
diff --git a/spec/frontend/packages_and_registries/infrastructure_registry/components/details/components/package_files_spec.js b/spec/frontend/packages_and_registries/infrastructure_registry/components/details/components/package_files_spec.js
new file mode 100644
index 00000000000..0c5aa30223b
--- /dev/null
+++ b/spec/frontend/packages_and_registries/infrastructure_registry/components/details/components/package_files_spec.js
@@ -0,0 +1,259 @@
+import { GlDropdown, GlButton } from '@gitlab/ui';
+import { mount } from '@vue/test-utils';
+import { nextTick } from 'vue/';
+import stubChildren from 'helpers/stub_children';
+import component from '~/packages_and_registries/infrastructure_registry/details/components/package_files.vue';
+import FileIcon from '~/vue_shared/components/file_icon.vue';
+import TimeAgoTooltip from '~/vue_shared/components/time_ago_tooltip.vue';
+
+import { npmFiles, mavenFiles } from 'jest/packages/mock_data';
+
+describe('Package Files', () => {
+ let wrapper;
+
+ const findAllRows = () => wrapper.findAll('[data-testid="file-row"');
+ const findFirstRow = () => findAllRows().at(0);
+ const findSecondRow = () => findAllRows().at(1);
+ const findFirstRowDownloadLink = () => findFirstRow().find('[data-testid="download-link"]');
+ const findFirstRowCommitLink = () => findFirstRow().find('[data-testid="commit-link"]');
+ const findSecondRowCommitLink = () => findSecondRow().find('[data-testid="commit-link"]');
+ const findFirstRowFileIcon = () => findFirstRow().find(FileIcon);
+ const findFirstRowCreatedAt = () => findFirstRow().find(TimeAgoTooltip);
+ const findFirstActionMenu = () => findFirstRow().findComponent(GlDropdown);
+ const findActionMenuDelete = () => findFirstActionMenu().find('[data-testid="delete-file"]');
+ const findFirstToggleDetailsButton = () => findFirstRow().findComponent(GlButton);
+ const findFirstRowShaComponent = (id) => wrapper.find(`[data-testid="${id}"]`);
+
+ const createComponent = ({ packageFiles = npmFiles, canDelete = true } = {}) => {
+ wrapper = mount(component, {
+ propsData: {
+ packageFiles,
+ canDelete,
+ },
+ stubs: {
+ ...stubChildren(component),
+ GlTable: false,
+ },
+ });
+ };
+
+ afterEach(() => {
+ wrapper.destroy();
+ wrapper = null;
+ });
+
+ describe('rows', () => {
+ it('renders a single file for an npm package', () => {
+ createComponent();
+
+ expect(findAllRows()).toHaveLength(1);
+ });
+
+ it('renders multiple files for a package that contains more than one file', () => {
+ createComponent({ packageFiles: mavenFiles });
+
+ expect(findAllRows()).toHaveLength(2);
+ });
+ });
+
+ describe('link', () => {
+ it('exists', () => {
+ createComponent();
+
+ expect(findFirstRowDownloadLink().exists()).toBe(true);
+ });
+
+ it('has the correct attrs bound', () => {
+ createComponent();
+
+ expect(findFirstRowDownloadLink().attributes('href')).toBe(npmFiles[0].download_path);
+ });
+
+ it('emits "download-file" event on click', () => {
+ createComponent();
+
+ findFirstRowDownloadLink().vm.$emit('click');
+
+ expect(wrapper.emitted('download-file')).toEqual([[]]);
+ });
+ });
+
+ describe('file-icon', () => {
+ it('exists', () => {
+ createComponent();
+
+ expect(findFirstRowFileIcon().exists()).toBe(true);
+ });
+
+ it('has the correct props bound', () => {
+ createComponent();
+
+ expect(findFirstRowFileIcon().props('fileName')).toBe(npmFiles[0].file_name);
+ });
+ });
+
+ describe('time-ago tooltip', () => {
+ it('exists', () => {
+ createComponent();
+
+ expect(findFirstRowCreatedAt().exists()).toBe(true);
+ });
+
+ it('has the correct props bound', () => {
+ createComponent();
+
+ expect(findFirstRowCreatedAt().props('time')).toBe(npmFiles[0].created_at);
+ });
+ });
+
+ describe('commit', () => {
+ describe('when package file has a pipeline associated', () => {
+ it('exists', () => {
+ createComponent();
+
+ expect(findFirstRowCommitLink().exists()).toBe(true);
+ });
+
+ it('the link points to the commit url', () => {
+ createComponent();
+
+ expect(findFirstRowCommitLink().attributes('href')).toBe(
+ npmFiles[0].pipelines[0].project.commit_url,
+ );
+ });
+
+ it('the text is git_commit_message', () => {
+ createComponent();
+
+ expect(findFirstRowCommitLink().text()).toBe(npmFiles[0].pipelines[0].git_commit_message);
+ });
+ });
+ describe('when package file has no pipeline associated', () => {
+ it('does not exist', () => {
+ createComponent({ packageFiles: mavenFiles });
+
+ expect(findFirstRowCommitLink().exists()).toBe(false);
+ });
+ });
+
+ describe('when only one file lacks an associated pipeline', () => {
+ it('renders the commit when it exists and not otherwise', () => {
+ createComponent({ packageFiles: [npmFiles[0], mavenFiles[0]] });
+
+ expect(findFirstRowCommitLink().exists()).toBe(true);
+ expect(findSecondRowCommitLink().exists()).toBe(false);
+ });
+ });
+
+ describe('action menu', () => {
+ describe('when the user can delete', () => {
+ it('exists', () => {
+ createComponent();
+
+ expect(findFirstActionMenu().exists()).toBe(true);
+ });
+
+ describe('menu items', () => {
+ describe('delete file', () => {
+ it('exists', () => {
+ createComponent();
+
+ expect(findActionMenuDelete().exists()).toBe(true);
+ });
+
+ it('emits a delete event when clicked', () => {
+ createComponent();
+
+ findActionMenuDelete().vm.$emit('click');
+
+ const [[{ id }]] = wrapper.emitted('delete-file');
+ expect(id).toBe(npmFiles[0].id);
+ });
+ });
+ });
+ });
+
+ describe('when the user can not delete', () => {
+ const canDelete = false;
+
+ it('does not exist', () => {
+ createComponent({ canDelete });
+
+ expect(findFirstActionMenu().exists()).toBe(false);
+ });
+ });
+ });
+ });
+
+ describe('additional details', () => {
+ describe('details toggle button', () => {
+ it('exists', () => {
+ createComponent();
+
+ expect(findFirstToggleDetailsButton().exists()).toBe(true);
+ });
+
+ it('is hidden when no details is present', () => {
+ const [{ ...noShaFile }] = npmFiles;
+ noShaFile.file_sha256 = null;
+ noShaFile.file_md5 = null;
+ noShaFile.file_sha1 = null;
+ createComponent({ packageFiles: [noShaFile] });
+
+ expect(findFirstToggleDetailsButton().exists()).toBe(false);
+ });
+
+ it('toggles the details row', async () => {
+ createComponent();
+
+ expect(findFirstToggleDetailsButton().props('icon')).toBe('angle-down');
+
+ findFirstToggleDetailsButton().vm.$emit('click');
+ await nextTick();
+
+ expect(findFirstRowShaComponent('sha-256').exists()).toBe(true);
+ expect(findFirstToggleDetailsButton().props('icon')).toBe('angle-up');
+
+ findFirstToggleDetailsButton().vm.$emit('click');
+ await nextTick();
+
+ expect(findFirstRowShaComponent('sha-256').exists()).toBe(false);
+ expect(findFirstToggleDetailsButton().props('icon')).toBe('angle-down');
+ });
+ });
+
+ describe('file shas', () => {
+ const showShaFiles = () => {
+ findFirstToggleDetailsButton().vm.$emit('click');
+ return nextTick();
+ };
+
+ it.each`
+ selector | title | sha
+ ${'sha-256'} | ${'SHA-256'} | ${'file_sha256'}
+ ${'md5'} | ${'MD5'} | ${'file_md5'}
+ ${'sha-1'} | ${'SHA-1'} | ${'file_sha1'}
+ `('has a $title row', async ({ selector, title, sha }) => {
+ createComponent();
+
+ await showShaFiles();
+
+ expect(findFirstRowShaComponent(selector).props()).toMatchObject({
+ title,
+ sha,
+ });
+ });
+
+ it('does not display a row when the data is missing', async () => {
+ const [{ ...missingMd5 }] = npmFiles;
+ missingMd5.file_md5 = null;
+
+ createComponent({ packageFiles: [missingMd5] });
+
+ await showShaFiles();
+
+ expect(findFirstRowShaComponent('md5').exists()).toBe(false);
+ });
+ });
+ });
+});
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
new file mode 100644
index 00000000000..4987af9f5b0
--- /dev/null
+++ b/spec/frontend/packages_and_registries/infrastructure_registry/components/details/components/package_history_spec.js
@@ -0,0 +1,117 @@
+import { GlLink, GlSprintf } from '@gitlab/ui';
+import { shallowMount } from '@vue/test-utils';
+import { stubComponent } from 'helpers/stub_component';
+import component from '~/packages_and_registries/infrastructure_registry/details/components/package_history.vue';
+import { HISTORY_PIPELINES_LIMIT } from '~/packages_and_registries/shared/constants';
+import HistoryItem from '~/vue_shared/components/registry/history_item.vue';
+import TimeAgoTooltip from '~/vue_shared/components/time_ago_tooltip.vue';
+
+import { mavenPackage, mockPipelineInfo } from 'jest/packages/mock_data';
+
+describe('Package History', () => {
+ let wrapper;
+ const defaultProps = {
+ projectName: 'baz project',
+ packageEntity: { ...mavenPackage },
+ };
+
+ const createPipelines = (amount) =>
+ [...Array(amount)].map((x, index) => ({ ...mockPipelineInfo, id: index + 1 }));
+
+ const mountComponent = (props) => {
+ wrapper = shallowMount(component, {
+ propsData: { ...defaultProps, ...props },
+ stubs: {
+ HistoryItem: stubComponent(HistoryItem, {
+ template: '<div data-testid="history-element"><slot></slot></div>',
+ }),
+ GlSprintf,
+ },
+ });
+ };
+
+ afterEach(() => {
+ wrapper.destroy();
+ wrapper = null;
+ });
+
+ const findHistoryElement = (testId) => wrapper.find(`[data-testid="${testId}"]`);
+ const findElementLink = (container) => container.find(GlLink);
+ const findElementTimeAgo = (container) => container.find(TimeAgoTooltip);
+ const findTitle = () => wrapper.find('[data-testid="title"]');
+ const findTimeline = () => wrapper.find('[data-testid="timeline"]');
+
+ it('has the correct title', () => {
+ mountComponent();
+
+ const title = findTitle();
+
+ expect(title.exists()).toBe(true);
+ expect(title.text()).toBe('History');
+ });
+
+ it('has a timeline container', () => {
+ mountComponent();
+
+ const title = findTimeline();
+
+ expect(title.exists()).toBe(true);
+ expect(title.classes()).toEqual(
+ expect.arrayContaining(['timeline', 'main-notes-list', 'notes']),
+ );
+ });
+ 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}
+ `(
+ 'with $amount pipelines history element $name',
+ ({ name, icon, text, timeAgoTooltip, link, amount }) => {
+ let element;
+
+ beforeEach(() => {
+ mountComponent({
+ packageEntity: { ...mavenPackage, pipelines: createPipelines(amount) },
+ });
+ element = findHistoryElement(name);
+ });
+
+ it('exists', () => {
+ expect(element.exists()).toBe(true);
+ });
+
+ it('has the correct icon', () => {
+ expect(element.props('icon')).toBe(icon);
+ });
+
+ it('has the correct text', () => {
+ expect(element.text()).toBe(text);
+ });
+
+ it('time-ago tooltip', () => {
+ const timeAgo = findElementTimeAgo(element);
+ const exist = Boolean(timeAgoTooltip);
+
+ expect(timeAgo.exists()).toBe(exist);
+ if (exist) {
+ expect(timeAgo.props('time')).toBe(timeAgoTooltip);
+ }
+ });
+
+ it('link', () => {
+ const linkElement = findElementLink(element);
+ const exist = Boolean(link);
+
+ expect(linkElement.exists()).toBe(exist);
+ if (exist) {
+ expect(linkElement.attributes('href')).toBe(link);
+ }
+ });
+ },
+ );
+});
diff --git a/spec/frontend/packages_and_registries/infrastructure_registry/components/details/components/terraform_installation_spec.js b/spec/frontend/packages_and_registries/infrastructure_registry/components/details/components/terraform_installation_spec.js
new file mode 100644
index 00000000000..c26784a4b75
--- /dev/null
+++ b/spec/frontend/packages_and_registries/infrastructure_registry/components/details/components/terraform_installation_spec.js
@@ -0,0 +1,62 @@
+import { shallowMount, createLocalVue } from '@vue/test-utils';
+import Vuex from 'vuex';
+import { terraformModule as packageEntity } from 'jest/packages/mock_data';
+import TerraformInstallation from '~/packages_and_registries/infrastructure_registry/details/components/terraform_installation.vue';
+import CodeInstructions from '~/vue_shared/components/registry/code_instruction.vue';
+
+const localVue = createLocalVue();
+localVue.use(Vuex);
+
+describe('TerraformInstallation', () => {
+ let wrapper;
+
+ const store = new Vuex.Store({
+ state: {
+ packageEntity,
+ gitlabHost: 'bar.dev',
+ projectPath: 'foo',
+ },
+ });
+
+ const findCodeInstructions = () => wrapper.findAllComponents(CodeInstructions);
+
+ function createComponent() {
+ wrapper = shallowMount(TerraformInstallation, {
+ localVue,
+ store,
+ });
+ }
+
+ beforeEach(() => {
+ createComponent();
+ });
+
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ it('renders all the messages', () => {
+ expect(wrapper.element).toMatchSnapshot();
+ });
+
+ describe('installation commands', () => {
+ it('renders the correct command', () => {
+ expect(findCodeInstructions().at(0).props('instruction')).toMatchInlineSnapshot(`
+ "module \\"my_module_name\\" {
+ source = \\"bar.dev/foo/Test/system-22\\"
+ version = \\"0.1\\"
+ }"
+ `);
+ });
+ });
+
+ describe('setup commands', () => {
+ it('renders the correct command', () => {
+ expect(findCodeInstructions().at(1).props('instruction')).toMatchInlineSnapshot(`
+ "credentials \\"bar.dev\\" {
+ token = \\"<TOKEN>\\"
+ }"
+ `);
+ });
+ });
+});
diff --git a/spec/frontend/packages/details/mock_data.js b/spec/frontend/packages_and_registries/infrastructure_registry/components/details/mock_data.js
index d43abcedb2e..d43abcedb2e 100644
--- a/spec/frontend/packages/details/mock_data.js
+++ b/spec/frontend/packages_and_registries/infrastructure_registry/components/details/mock_data.js
diff --git a/spec/frontend/packages_and_registries/infrastructure_registry/components/details/store/actions_spec.js b/spec/frontend/packages_and_registries/infrastructure_registry/components/details/store/actions_spec.js
new file mode 100644
index 00000000000..61fa69c2f7a
--- /dev/null
+++ b/spec/frontend/packages_and_registries/infrastructure_registry/components/details/store/actions_spec.js
@@ -0,0 +1,156 @@
+import testAction from 'helpers/vuex_action_helper';
+import Api from '~/api';
+import createFlash from '~/flash';
+import { FETCH_PACKAGE_VERSIONS_ERROR } from '~/packages_and_registries/infrastructure_registry/details/constants';
+import {
+ fetchPackageVersions,
+ deletePackage,
+ deletePackageFile,
+} from '~/packages_and_registries/infrastructure_registry/details/store/actions';
+import * as types from '~/packages_and_registries/infrastructure_registry/details/store/mutation_types';
+import {
+ DELETE_PACKAGE_ERROR_MESSAGE,
+ DELETE_PACKAGE_FILE_ERROR_MESSAGE,
+ DELETE_PACKAGE_FILE_SUCCESS_MESSAGE,
+} from '~/packages/shared/constants';
+import { npmPackage as packageEntity } from '../../../../../packages/mock_data';
+
+jest.mock('~/flash.js');
+jest.mock('~/api.js');
+
+describe('Actions Package details store', () => {
+ describe('fetchPackageVersions', () => {
+ it('should fetch the package versions', (done) => {
+ Api.projectPackage = jest.fn().mockResolvedValue({ data: packageEntity });
+
+ testAction(
+ fetchPackageVersions,
+ undefined,
+ { packageEntity },
+ [
+ { type: types.SET_LOADING, payload: true },
+ { type: types.SET_PACKAGE_VERSIONS, payload: packageEntity.versions },
+ { type: types.SET_LOADING, payload: false },
+ ],
+ [],
+ () => {
+ expect(Api.projectPackage).toHaveBeenCalledWith(
+ packageEntity.project_id,
+ packageEntity.id,
+ );
+ done();
+ },
+ );
+ });
+
+ it("does not set the versions if they don't exist", (done) => {
+ Api.projectPackage = jest.fn().mockResolvedValue({ data: { packageEntity, versions: null } });
+
+ testAction(
+ fetchPackageVersions,
+ undefined,
+ { packageEntity },
+ [
+ { type: types.SET_LOADING, payload: true },
+ { type: types.SET_LOADING, payload: false },
+ ],
+ [],
+ () => {
+ expect(Api.projectPackage).toHaveBeenCalledWith(
+ packageEntity.project_id,
+ packageEntity.id,
+ );
+ done();
+ },
+ );
+ });
+
+ it('should create flash on API error', (done) => {
+ Api.projectPackage = jest.fn().mockRejectedValue();
+
+ testAction(
+ fetchPackageVersions,
+ undefined,
+ { packageEntity },
+ [
+ { type: types.SET_LOADING, payload: true },
+ { type: types.SET_LOADING, payload: false },
+ ],
+ [],
+ () => {
+ expect(Api.projectPackage).toHaveBeenCalledWith(
+ packageEntity.project_id,
+ packageEntity.id,
+ );
+ expect(createFlash).toHaveBeenCalledWith({
+ message: FETCH_PACKAGE_VERSIONS_ERROR,
+ type: 'warning',
+ });
+ done();
+ },
+ );
+ });
+ });
+
+ describe('deletePackage', () => {
+ it('should call Api.deleteProjectPackage', (done) => {
+ Api.deleteProjectPackage = jest.fn().mockResolvedValue();
+ testAction(deletePackage, undefined, { packageEntity }, [], [], () => {
+ expect(Api.deleteProjectPackage).toHaveBeenCalledWith(
+ packageEntity.project_id,
+ packageEntity.id,
+ );
+ done();
+ });
+ });
+ it('should create flash on API error', (done) => {
+ Api.deleteProjectPackage = jest.fn().mockRejectedValue();
+
+ testAction(deletePackage, undefined, { packageEntity }, [], [], () => {
+ expect(createFlash).toHaveBeenCalledWith({
+ message: DELETE_PACKAGE_ERROR_MESSAGE,
+ type: 'warning',
+ });
+ done();
+ });
+ });
+ });
+
+ describe('deletePackageFile', () => {
+ const fileId = 'a_file_id';
+
+ it('should call Api.deleteProjectPackageFile and commit the right data', (done) => {
+ const packageFiles = [{ id: 'foo' }, { id: fileId }];
+ Api.deleteProjectPackageFile = jest.fn().mockResolvedValue();
+ testAction(
+ deletePackageFile,
+ fileId,
+ { packageEntity, packageFiles },
+ [{ type: types.UPDATE_PACKAGE_FILES, payload: [{ id: 'foo' }] }],
+ [],
+ () => {
+ expect(Api.deleteProjectPackageFile).toHaveBeenCalledWith(
+ packageEntity.project_id,
+ packageEntity.id,
+ fileId,
+ );
+ expect(createFlash).toHaveBeenCalledWith({
+ message: DELETE_PACKAGE_FILE_SUCCESS_MESSAGE,
+ type: 'success',
+ });
+ done();
+ },
+ );
+ });
+ it('should create flash on API error', (done) => {
+ Api.deleteProjectPackageFile = jest.fn().mockRejectedValue();
+ testAction(deletePackageFile, fileId, { packageEntity }, [], [], () => {
+ expect(createFlash).toHaveBeenCalledWith({
+ message: DELETE_PACKAGE_FILE_ERROR_MESSAGE,
+ type: 'warning',
+ });
+ done();
+ });
+ });
+ });
+});
diff --git a/spec/frontend/packages_and_registries/infrastructure_registry/components/details/store/getters_spec.js b/spec/frontend/packages_and_registries/infrastructure_registry/components/details/store/getters_spec.js
new file mode 100644
index 00000000000..8740691a8ee
--- /dev/null
+++ b/spec/frontend/packages_and_registries/infrastructure_registry/components/details/store/getters_spec.js
@@ -0,0 +1,40 @@
+import { packagePipeline } from '~/packages_and_registries/infrastructure_registry/details/store/getters';
+import {
+ npmPackage,
+ mockPipelineInfo,
+ mavenPackage as packageWithoutBuildInfo,
+} from 'jest/packages/mock_data';
+
+describe('Getters PackageDetails Store', () => {
+ let state;
+
+ const defaultState = {
+ packageEntity: packageWithoutBuildInfo,
+ };
+
+ const setupState = (testState = {}) => {
+ state = {
+ ...defaultState,
+ ...testState,
+ };
+ };
+
+ describe('packagePipeline', () => {
+ it('should return the pipeline info when pipeline exists', () => {
+ setupState({
+ packageEntity: {
+ ...npmPackage,
+ pipeline: mockPipelineInfo,
+ },
+ });
+
+ expect(packagePipeline(state)).toEqual(mockPipelineInfo);
+ });
+
+ it('should return null when build_info does not exist', () => {
+ setupState({ pipeline: undefined });
+
+ expect(packagePipeline(state)).toBe(null);
+ });
+ });
+});
diff --git a/spec/frontend/packages_and_registries/infrastructure_registry/components/details/store/mutations_spec.js b/spec/frontend/packages_and_registries/infrastructure_registry/components/details/store/mutations_spec.js
new file mode 100644
index 00000000000..6efefea4a14
--- /dev/null
+++ b/spec/frontend/packages_and_registries/infrastructure_registry/components/details/store/mutations_spec.js
@@ -0,0 +1,40 @@
+import * as types from '~/packages_and_registries/infrastructure_registry/details/store/mutation_types';
+import mutations from '~/packages_and_registries/infrastructure_registry/details/store/mutations';
+import { npmPackage as packageEntity } from 'jest/packages/mock_data';
+
+describe('Mutations package details Store', () => {
+ let mockState;
+
+ beforeEach(() => {
+ mockState = {
+ packageEntity,
+ };
+ });
+
+ describe('SET_LOADING', () => {
+ it('should set loading', () => {
+ mutations[types.SET_LOADING](mockState, true);
+
+ expect(mockState.isLoading).toEqual(true);
+ });
+ });
+
+ describe('SET_PACKAGE_VERSIONS', () => {
+ it('should set the package entity versions', () => {
+ const fakeVersions = [1, 2, 3];
+
+ mutations[types.SET_PACKAGE_VERSIONS](mockState, fakeVersions);
+
+ expect(mockState.packageEntity.versions).toEqual(fakeVersions);
+ });
+ });
+ describe('UPDATE_PACKAGE_FILES', () => {
+ it('should update the packageFiles', () => {
+ const files = [1, 2, 3];
+
+ mutations[types.UPDATE_PACKAGE_FILES](mockState, files);
+
+ expect(mockState.packageFiles).toEqual(files);
+ });
+ });
+});
diff --git a/spec/frontend/packages_and_registries/infrastructure_registry/components/details_title_spec.js b/spec/frontend/packages_and_registries/infrastructure_registry/components/details_title_spec.js
deleted file mode 100644
index 87e0059344c..00000000000
--- a/spec/frontend/packages_and_registries/infrastructure_registry/components/details_title_spec.js
+++ /dev/null
@@ -1,93 +0,0 @@
-import { shallowMount, createLocalVue } from '@vue/test-utils';
-import Vuex from 'vuex';
-import { terraformModule, mavenFiles, npmPackage } from 'jest/packages/mock_data';
-import component from '~/packages_and_registries/infrastructure_registry/components/details_title.vue';
-import TitleArea from '~/vue_shared/components/registry/title_area.vue';
-
-const localVue = createLocalVue();
-localVue.use(Vuex);
-
-describe('PackageTitle', () => {
- let wrapper;
- let store;
-
- function createComponent({ packageFiles = mavenFiles, packageEntity = terraformModule } = {}) {
- store = new Vuex.Store({
- state: {
- packageEntity,
- packageFiles,
- },
- getters: {
- packagePipeline: ({ packageEntity: { pipeline = null } }) => pipeline,
- },
- });
-
- wrapper = shallowMount(component, {
- localVue,
- store,
- stubs: {
- TitleArea,
- },
- });
- return wrapper.vm.$nextTick();
- }
-
- const findTitleArea = () => wrapper.findComponent(TitleArea);
- const packageSize = () => wrapper.find('[data-testid="package-size"]');
- const pipelineProject = () => wrapper.find('[data-testid="pipeline-project"]');
- const packageRef = () => wrapper.find('[data-testid="package-ref"]');
-
- afterEach(() => {
- wrapper.destroy();
- });
-
- describe('module title', () => {
- it('is correctly bound', async () => {
- await createComponent();
-
- expect(findTitleArea().props('title')).toBe(terraformModule.name);
- });
- });
-
- describe('calculates the package size', () => {
- it('correctly calculates the size', async () => {
- await createComponent();
-
- expect(packageSize().props('text')).toBe('300 bytes');
- });
- });
-
- describe('package ref', () => {
- it('does not display the ref if missing', async () => {
- await createComponent();
-
- expect(packageRef().exists()).toBe(false);
- });
-
- it('correctly shows the package ref if there is one', async () => {
- await createComponent({ packageEntity: npmPackage });
- expect(packageRef().props()).toMatchObject({
- text: npmPackage.pipeline.ref,
- icon: 'branch',
- });
- });
- });
-
- describe('pipeline project', () => {
- it('does not display the project if missing', async () => {
- await createComponent();
-
- expect(pipelineProject().exists()).toBe(false);
- });
-
- it('correctly shows the pipeline project if there is one', async () => {
- await createComponent({ packageEntity: npmPackage });
-
- expect(pipelineProject().props()).toMatchObject({
- text: npmPackage.pipeline.project.name,
- icon: 'review-list',
- link: npmPackage.pipeline.project.web_url,
- });
- });
- });
-});
diff --git a/spec/frontend/packages_and_registries/infrastructure_registry/components/terraform_installation_spec.js b/spec/frontend/packages_and_registries/infrastructure_registry/components/terraform_installation_spec.js
deleted file mode 100644
index ee1548ed5eb..00000000000
--- a/spec/frontend/packages_and_registries/infrastructure_registry/components/terraform_installation_spec.js
+++ /dev/null
@@ -1,62 +0,0 @@
-import { shallowMount, createLocalVue } from '@vue/test-utils';
-import Vuex from 'vuex';
-import { terraformModule as packageEntity } from 'jest/packages/mock_data';
-import TerraformInstallation from '~/packages_and_registries/infrastructure_registry/components/terraform_installation.vue';
-import CodeInstructions from '~/vue_shared/components/registry/code_instruction.vue';
-
-const localVue = createLocalVue();
-localVue.use(Vuex);
-
-describe('TerraformInstallation', () => {
- let wrapper;
-
- const store = new Vuex.Store({
- state: {
- packageEntity,
- gitlabHost: 'bar.dev',
- projectPath: 'foo',
- },
- });
-
- const findCodeInstructions = () => wrapper.findAllComponents(CodeInstructions);
-
- function createComponent() {
- wrapper = shallowMount(TerraformInstallation, {
- localVue,
- store,
- });
- }
-
- beforeEach(() => {
- createComponent();
- });
-
- afterEach(() => {
- wrapper.destroy();
- });
-
- it('renders all the messages', () => {
- expect(wrapper.element).toMatchSnapshot();
- });
-
- describe('installation commands', () => {
- it('renders the correct command', () => {
- expect(findCodeInstructions().at(0).props('instruction')).toMatchInlineSnapshot(`
- "module \\"my_module_name\\" {
- source = \\"bar.dev/foo/Test/system-22\\"
- version = \\"0.1\\"
- }"
- `);
- });
- });
-
- describe('setup commands', () => {
- it('renders the correct command', () => {
- expect(findCodeInstructions().at(1).props('instruction')).toMatchInlineSnapshot(`
- "credentials \\"bar.dev\\" {
- token = \\"<TOKEN>\\"
- }"
- `);
- });
- });
-});
diff --git a/spec/frontend/packages_and_registries/package_registry/components/details/__snapshots__/npm_installation_spec.js.snap b/spec/frontend/packages_and_registries/package_registry/components/details/__snapshots__/npm_installation_spec.js.snap
index 6a7f14dc33f..d5649e39561 100644
--- a/spec/frontend/packages_and_registries/package_registry/components/details/__snapshots__/npm_installation_spec.js.snap
+++ b/spec/frontend/packages_and_registries/package_registry/components/details/__snapshots__/npm_installation_spec.js.snap
@@ -21,6 +21,15 @@ exports[`NpmInstallation renders all the messages 1`] = `
Registry setup
</h3>
+ <gl-form-radio-group-stub
+ checked="instance"
+ disabledfield="disabled"
+ htmlfield="html"
+ options="[object Object],[object Object]"
+ textfield="text"
+ valuefield="value"
+ />
+
<code-instruction-stub
copytext="Copy npm setup command"
instruction="echo @gitlab-org:registry=npmPath/ >> .npmrc"
diff --git a/spec/frontend/packages_and_registries/package_registry/components/details/metadata/nuget_spec.js b/spec/frontend/packages_and_registries/package_registry/components/details/metadata/nuget_spec.js
index 279900edff2..f759fe7a81c 100644
--- a/spec/frontend/packages_and_registries/package_registry/components/details/metadata/nuget_spec.js
+++ b/spec/frontend/packages_and_registries/package_registry/components/details/metadata/nuget_spec.js
@@ -9,9 +9,8 @@ import { PACKAGE_TYPE_NUGET } from '~/packages_and_registries/package_registry/c
import DetailsRow from '~/vue_shared/components/registry/details_row.vue';
-const nugetPackage = { packageType: PACKAGE_TYPE_NUGET, metadata: nugetMetadata() };
-
describe('Nuget Metadata', () => {
+ let nugetPackage = { packageType: PACKAGE_TYPE_NUGET, metadata: nugetMetadata() };
let wrapper;
const mountComponent = () => {
@@ -52,4 +51,30 @@ describe('Nuget Metadata', () => {
expect(element.props('icon')).toBe(icon);
expect(findElementLink(element).attributes('href')).toBe(nugetPackage.metadata[link]);
});
+
+ describe('without source', () => {
+ beforeAll(() => {
+ nugetPackage = {
+ packageType: PACKAGE_TYPE_NUGET,
+ metadata: { iconUrl: 'iconUrl', licenseUrl: 'licenseUrl' },
+ };
+ });
+
+ it('does not show additional metadata', () => {
+ expect(findNugetSource().exists()).toBe(false);
+ });
+ });
+
+ describe('without license', () => {
+ beforeAll(() => {
+ nugetPackage = {
+ packageType: PACKAGE_TYPE_NUGET,
+ metadata: { iconUrl: 'iconUrl', projectUrl: 'projectUrl' },
+ };
+ });
+
+ it('does not show additional metadata', () => {
+ expect(findNugetLicense().exists()).toBe(false);
+ });
+ });
});
diff --git a/spec/frontend/packages_and_registries/package_registry/components/details/npm_installation_spec.js b/spec/frontend/packages_and_registries/package_registry/components/details/npm_installation_spec.js
index 083c6858ad0..b89410ede13 100644
--- a/spec/frontend/packages_and_registries/package_registry/components/details/npm_installation_spec.js
+++ b/spec/frontend/packages_and_registries/package_registry/components/details/npm_installation_spec.js
@@ -1,3 +1,4 @@
+import { GlFormRadioGroup } from '@gitlab/ui';
import { nextTick } from 'vue';
import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
@@ -12,6 +13,8 @@ import {
PACKAGE_TYPE_NPM,
NPM_PACKAGE_MANAGER,
YARN_PACKAGE_MANAGER,
+ PROJECT_PACKAGE_ENDPOINT_TYPE,
+ INSTANCE_PACKAGE_ENDPOINT_TYPE,
} from '~/packages_and_registries/package_registry/constants';
import CodeInstructions from '~/vue_shared/components/registry/code_instruction.vue';
@@ -25,12 +28,14 @@ describe('NpmInstallation', () => {
const findCodeInstructions = () => wrapper.findAllComponents(CodeInstructions);
const findInstallationTitle = () => wrapper.findComponent(InstallationTitle);
+ const findEndPointTypeSector = () => wrapper.findComponent(GlFormRadioGroup);
function createComponent({ data = {} } = {}) {
wrapper = shallowMountExtended(NpmInstallation, {
provide: {
npmHelpPath: 'npmHelpPath',
npmPath: 'npmPath',
+ npmProjectPath: 'npmProjectPath',
},
propsData: {
packageEntity,
@@ -53,6 +58,19 @@ describe('NpmInstallation', () => {
expect(wrapper.element).toMatchSnapshot();
});
+ describe('endpoint type selector', () => {
+ it('has the endpoint type selector', () => {
+ expect(findEndPointTypeSector().exists()).toBe(true);
+ expect(findEndPointTypeSector().vm.$attrs.checked).toBe(INSTANCE_PACKAGE_ENDPOINT_TYPE);
+ expect(findEndPointTypeSector().props()).toMatchObject({
+ options: [
+ { value: INSTANCE_PACKAGE_ENDPOINT_TYPE, text: 'Instance-level' },
+ { value: PROJECT_PACKAGE_ENDPOINT_TYPE, text: 'Project-level' },
+ ],
+ });
+ });
+ });
+
describe('install command switch', () => {
it('has the installation title component', () => {
expect(findInstallationTitle().exists()).toBe(true);
@@ -96,6 +114,28 @@ describe('NpmInstallation', () => {
trackingAction: TRACKING_ACTION_COPY_NPM_SETUP_COMMAND,
});
});
+
+ it('renders the correct setup command for different endpoint types', async () => {
+ findEndPointTypeSector().vm.$emit('change', PROJECT_PACKAGE_ENDPOINT_TYPE);
+
+ await nextTick();
+
+ expect(findCodeInstructions().at(1).props()).toMatchObject({
+ instruction: `echo @gitlab-org:registry=npmProjectPath/ >> .npmrc`,
+ multiline: false,
+ trackingAction: TRACKING_ACTION_COPY_NPM_SETUP_COMMAND,
+ });
+
+ findEndPointTypeSector().vm.$emit('change', INSTANCE_PACKAGE_ENDPOINT_TYPE);
+
+ await nextTick();
+
+ expect(findCodeInstructions().at(1).props()).toMatchObject({
+ instruction: `echo @gitlab-org:registry=npmPath/ >> .npmrc`,
+ multiline: false,
+ trackingAction: TRACKING_ACTION_COPY_NPM_SETUP_COMMAND,
+ });
+ });
});
describe('yarn', () => {
@@ -118,5 +158,27 @@ describe('NpmInstallation', () => {
trackingAction: TRACKING_ACTION_COPY_YARN_SETUP_COMMAND,
});
});
+
+ it('renders the correct setup command for different endpoint types', async () => {
+ findEndPointTypeSector().vm.$emit('change', PROJECT_PACKAGE_ENDPOINT_TYPE);
+
+ await nextTick();
+
+ expect(findCodeInstructions().at(1).props()).toMatchObject({
+ instruction: `echo \\"@gitlab-org:registry\\" \\"npmProjectPath/\\" >> .yarnrc`,
+ multiline: false,
+ trackingAction: TRACKING_ACTION_COPY_YARN_SETUP_COMMAND,
+ });
+
+ findEndPointTypeSector().vm.$emit('change', INSTANCE_PACKAGE_ENDPOINT_TYPE);
+
+ await nextTick();
+
+ expect(findCodeInstructions().at(1).props()).toMatchObject({
+ instruction: 'echo \\"@gitlab-org:registry\\" \\"npmPath/\\" >> .yarnrc',
+ multiline: false,
+ trackingAction: TRACKING_ACTION_COPY_YARN_SETUP_COMMAND,
+ });
+ });
});
});
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 b69008f04f0..57b8be40a7c 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
@@ -5,7 +5,7 @@ import {
packageData,
packagePipelines,
} from 'jest/packages_and_registries/package_registry/mock_data';
-import { HISTORY_PIPELINES_LIMIT } from '~/packages/details/constants';
+import { HISTORY_PIPELINES_LIMIT } from '~/packages_and_registries/shared/constants';
import component from '~/packages_and_registries/package_registry/components/details/package_history.vue';
import HistoryItem from '~/vue_shared/components/registry/history_item.vue';
import TimeAgoTooltip from '~/vue_shared/components/time_ago_tooltip.vue';
diff --git a/spec/frontend/packages_and_registries/package_registry/components/list/__snapshots__/app_spec.js.snap b/spec/frontend/packages_and_registries/package_registry/components/list/__snapshots__/app_spec.js.snap
new file mode 100644
index 00000000000..1b556be5873
--- /dev/null
+++ b/spec/frontend/packages_and_registries/package_registry/components/list/__snapshots__/app_spec.js.snap
@@ -0,0 +1,12 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`PackagesListApp renders 1`] = `
+<div>
+ <package-title-stub
+ count="2"
+ helpurl="packageHelpUrl"
+ />
+
+ <package-search-stub />
+</div>
+`;
diff --git a/spec/frontend/packages_and_registries/package_registry/components/list/__snapshots__/package_list_row_spec.js.snap b/spec/frontend/packages_and_registries/package_registry/components/list/__snapshots__/package_list_row_spec.js.snap
new file mode 100644
index 00000000000..2f2be797251
--- /dev/null
+++ b/spec/frontend/packages_and_registries/package_registry/components/list/__snapshots__/package_list_row_spec.js.snap
@@ -0,0 +1,122 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`packages_list_row renders 1`] = `
+<div
+ class="gl-display-flex gl-flex-direction-column gl-border-b-solid gl-border-t-solid gl-border-t-1 gl-border-b-1 gl-border-t-transparent gl-border-b-gray-100"
+ data-qa-selector="package_row"
+>
+ <div
+ class="gl-display-flex gl-align-items-center gl-py-3 gl-px-5"
+ >
+ <!---->
+
+ <div
+ class="gl-display-flex gl-xs-flex-direction-column gl-justify-content-space-between gl-align-items-stretch gl-flex-grow-1"
+ >
+ <div
+ class="gl-display-flex gl-flex-direction-column gl-xs-mb-3 gl-min-w-0 gl-flex-grow-1"
+ >
+ <div
+ class="gl-display-flex gl-align-items-center gl-text-body gl-font-weight-bold gl-min-h-6 gl-min-w-0"
+ >
+ <div
+ class="gl-display-flex gl-align-items-center gl-mr-3 gl-min-w-0"
+ >
+ <gl-link-stub
+ class="gl-text-body gl-min-w-0"
+ data-qa-selector="package_link"
+ href="http://gdk.test:3000/gitlab-org/gitlab-test/-/packages/111"
+ >
+ <gl-truncate-stub
+ position="end"
+ text="@gitlab-org/package-15"
+ />
+ </gl-link-stub>
+
+ <!---->
+
+ <!---->
+ </div>
+
+ <!---->
+ </div>
+
+ <div
+ class="gl-display-flex gl-align-items-center gl-text-gray-500 gl-min-h-6 gl-min-w-0 gl-flex-grow-1"
+ >
+ <div
+ class="gl-display-flex"
+ data-testid="left-secondary-infos"
+ >
+ <span>
+ 1.0.0
+ </span>
+
+ <!---->
+
+ <package-icon-and-name-stub>
+
+ npm
+
+ </package-icon-and-name-stub>
+
+ <!---->
+ </div>
+ </div>
+ </div>
+
+ <div
+ class="gl-display-flex gl-flex-direction-column gl-sm-align-items-flex-end gl-justify-content-space-between gl-text-gray-500 gl-flex-shrink-0"
+ >
+ <div
+ class="gl-display-flex gl-align-items-center gl-sm-text-body gl-sm-font-weight-bold gl-min-h-6"
+ >
+ <publish-method-stub />
+ </div>
+
+ <div
+ class="gl-display-flex gl-align-items-center gl-min-h-6"
+ >
+ <span>
+ Created
+ <timeago-tooltip-stub
+ cssclass=""
+ time="2020-08-17T14:23:32Z"
+ tooltipplacement="top"
+ />
+ </span>
+ </div>
+ </div>
+ </div>
+
+ <div
+ class="gl-w-9 gl-display-none gl-sm-display-flex gl-justify-content-end gl-pr-1"
+ >
+ <gl-button-stub
+ aria-label="Remove package"
+ buttontextclasses=""
+ category="secondary"
+ data-testid="action-delete"
+ icon="remove"
+ size="medium"
+ title="Remove package"
+ variant="danger"
+ />
+ </div>
+ </div>
+
+ <div
+ class="gl-display-flex"
+ >
+ <div
+ class="gl-w-7"
+ />
+
+ <!---->
+
+ <div
+ class="gl-w-9"
+ />
+ </div>
+</div>
+`;
diff --git a/spec/frontend/packages_and_registries/package_registry/components/list/__snapshots__/packages_list_app_spec.js.snap b/spec/frontend/packages_and_registries/package_registry/components/list/__snapshots__/packages_list_app_spec.js.snap
deleted file mode 100644
index dbebdeeb452..00000000000
--- a/spec/frontend/packages_and_registries/package_registry/components/list/__snapshots__/packages_list_app_spec.js.snap
+++ /dev/null
@@ -1,68 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`packages_list_app renders 1`] = `
-<div>
- <div
- help-url="foo"
- />
-
- <div />
-
- <div>
- <section
- class="row empty-state text-center"
- >
- <div
- class="col-12"
- >
- <div
- class="svg-250 svg-content"
- >
- <img
- alt=""
- class="gl-max-w-full"
- role="img"
- src="helpSvg"
- />
- </div>
- </div>
-
- <div
- class="col-12"
- >
- <div
- class="text-content gl-mx-auto gl-my-0 gl-p-5"
- >
- <h1
- class="h4"
- >
- There are no packages yet
- </h1>
-
- <p>
- Learn how to
- <b-link-stub
- class="gl-link"
- event="click"
- href="helpUrl"
- 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>
-`;
diff --git a/spec/frontend/packages_and_registries/package_registry/components/list/__snapshots__/publish_method_spec.js.snap b/spec/frontend/packages_and_registries/package_registry/components/list/__snapshots__/publish_method_spec.js.snap
new file mode 100644
index 00000000000..919dbe25ffe
--- /dev/null
+++ b/spec/frontend/packages_and_registries/package_registry/components/list/__snapshots__/publish_method_spec.js.snap
@@ -0,0 +1,42 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`publish_method renders 1`] = `
+<div
+ class="gl-display-flex gl-align-items-center"
+>
+ <gl-icon-stub
+ class="gl-mr-2"
+ name="git-merge"
+ size="16"
+ />
+
+ <span
+ class="gl-mr-2"
+ data-testid="pipeline-ref"
+ >
+ master
+ </span>
+
+ <gl-icon-stub
+ class="gl-mr-2"
+ name="commit"
+ size="16"
+ />
+
+ <gl-link-stub
+ class="gl-mr-2"
+ data-testid="pipeline-sha"
+ href="/namespace14/project14/-/commit/b83d6e391c22777fca1ed3012fce84f633d7fed0"
+ >
+ b83d6e39
+ </gl-link-stub>
+
+ <clipboard-button-stub
+ category="tertiary"
+ size="small"
+ text="b83d6e391c22777fca1ed3012fce84f633d7fed0"
+ title="Copy commit SHA"
+ tooltipplacement="top"
+ />
+</div>
+`;
diff --git a/spec/frontend/packages_and_registries/package_registry/components/list/app_spec.js b/spec/frontend/packages_and_registries/package_registry/components/list/app_spec.js
new file mode 100644
index 00000000000..3958cdf21bb
--- /dev/null
+++ b/spec/frontend/packages_and_registries/package_registry/components/list/app_spec.js
@@ -0,0 +1,154 @@
+import { GlEmptyState, GlSprintf, GlLink } from '@gitlab/ui';
+import { createLocalVue } from '@vue/test-utils';
+
+import VueApollo from 'vue-apollo';
+import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
+import createMockApollo from 'helpers/mock_apollo_helper';
+import waitForPromises from 'helpers/wait_for_promises';
+import PackageListApp from '~/packages_and_registries/package_registry/components/list/app.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 {
+ PROJECT_RESOURCE_TYPE,
+ GROUP_RESOURCE_TYPE,
+ LIST_QUERY_DEBOUNCE_TIME,
+} from '~/packages_and_registries/package_registry/constants';
+
+import getPackagesQuery from '~/packages_and_registries/package_registry/graphql/queries/get_packages.query.graphql';
+
+import { packagesListQuery } from '../../mock_data';
+
+jest.mock('~/lib/utils/common_utils');
+jest.mock('~/flash');
+
+const localVue = createLocalVue();
+
+describe('PackagesListApp', () => {
+ let wrapper;
+ let apolloProvider;
+
+ const defaultProvide = {
+ packageHelpUrl: 'packageHelpUrl',
+ emptyListIllustration: 'emptyListIllustration',
+ emptyListHelpUrl: 'emptyListHelpUrl',
+ isGroupPage: true,
+ fullPath: 'gitlab-org',
+ };
+
+ const PackageList = {
+ name: 'package-list',
+ template: '<div><slot name="empty-state"></slot></div>',
+ };
+ const GlLoadingIcon = { name: 'gl-loading-icon', template: '<div>loading</div>' };
+
+ const findPackageTitle = () => wrapper.findComponent(PackageTitle);
+ const findSearch = () => wrapper.findComponent(PackageSearch);
+
+ const mountComponent = ({
+ resolver = jest.fn().mockResolvedValue(packagesListQuery()),
+ provide = defaultProvide,
+ } = {}) => {
+ localVue.use(VueApollo);
+
+ const requestHandlers = [[getPackagesQuery, resolver]];
+ apolloProvider = createMockApollo(requestHandlers);
+
+ wrapper = shallowMountExtended(PackageListApp, {
+ localVue,
+ apolloProvider,
+ provide,
+ stubs: {
+ GlEmptyState,
+ GlLoadingIcon,
+ PackageList,
+ GlSprintf,
+ GlLink,
+ },
+ });
+ };
+
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ const waitForDebouncedApollo = () => {
+ jest.advanceTimersByTime(LIST_QUERY_DEBOUNCE_TIME);
+ return waitForPromises();
+ };
+
+ it('renders', async () => {
+ mountComponent();
+
+ await waitForDebouncedApollo();
+
+ expect(wrapper.element).toMatchSnapshot();
+ });
+
+ it('has a package title', async () => {
+ mountComponent();
+
+ await waitForDebouncedApollo();
+
+ expect(findPackageTitle().exists()).toBe(true);
+ expect(findPackageTitle().props('count')).toBe(2);
+ });
+
+ describe('search component', () => {
+ it('exists', () => {
+ mountComponent();
+
+ expect(findSearch().exists()).toBe(true);
+ });
+
+ it('on update triggers a new query with updated values', async () => {
+ const resolver = jest.fn().mockResolvedValue(packagesListQuery());
+ mountComponent({ resolver });
+
+ const payload = {
+ sort: 'VERSION_DESC',
+ filters: { packageName: 'foo', packageType: 'CONAN' },
+ };
+
+ findSearch().vm.$emit('update', payload);
+
+ await waitForDebouncedApollo();
+ jest.advanceTimersByTime(LIST_QUERY_DEBOUNCE_TIME);
+
+ expect(resolver).toHaveBeenCalledWith(
+ expect.objectContaining({
+ groupSort: payload.sort,
+ ...payload.filters,
+ }),
+ );
+ });
+ });
+
+ describe.each`
+ type | sortType
+ ${PROJECT_RESOURCE_TYPE} | ${'sort'}
+ ${GROUP_RESOURCE_TYPE} | ${'groupSort'}
+ `('$type query', ({ type, sortType }) => {
+ let provide;
+ let resolver;
+
+ const isGroupPage = type === GROUP_RESOURCE_TYPE;
+
+ beforeEach(() => {
+ provide = { ...defaultProvide, isGroupPage };
+ resolver = jest.fn().mockResolvedValue(packagesListQuery(type));
+ mountComponent({ provide, resolver });
+ return waitForDebouncedApollo();
+ });
+
+ it('succeeds', () => {
+ expect(findPackageTitle().props('count')).toBe(2);
+ });
+
+ it('calls the resolver with the right parameters', () => {
+ expect(resolver).toHaveBeenCalledWith(
+ expect.objectContaining({ isGroupPage, [sortType]: '' }),
+ );
+ });
+ });
+});
diff --git a/spec/frontend/packages_and_registries/package_registry/components/list/package_list_row_spec.js b/spec/frontend/packages_and_registries/package_registry/components/list/package_list_row_spec.js
new file mode 100644
index 00000000000..a276db104d7
--- /dev/null
+++ b/spec/frontend/packages_and_registries/package_registry/components/list/package_list_row_spec.js
@@ -0,0 +1,156 @@
+import { GlLink, GlSprintf } from '@gitlab/ui';
+import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
+import { createMockDirective, getBinding } from 'helpers/vue_mock_directive';
+
+import PackagesListRow from '~/packages_and_registries/package_registry/components/list/package_list_row.vue';
+import PackagePath from '~/packages/shared/components/package_path.vue';
+import PackageTags from '~/packages/shared/components/package_tags.vue';
+import PackageIconAndName from '~/packages/shared/components/package_icon_and_name.vue';
+import { PACKAGE_ERROR_STATUS } from '~/packages_and_registries/package_registry/constants';
+
+import ListItem from '~/vue_shared/components/registry/list_item.vue';
+import { packageData, packagePipelines, packageProject, packageTags } from '../../mock_data';
+
+describe('packages_list_row', () => {
+ let wrapper;
+
+ const defaultProvide = {
+ isGroupPage: false,
+ };
+
+ const packageWithoutTags = { ...packageData(), project: packageProject() };
+ const packageWithTags = { ...packageWithoutTags, tags: { nodes: packageTags() } };
+
+ const findPackageTags = () => wrapper.find(PackageTags);
+ const findPackagePath = () => wrapper.find(PackagePath);
+ const findDeleteButton = () => wrapper.findByTestId('action-delete');
+ const findPackageIconAndName = () => wrapper.find(PackageIconAndName);
+ const findListItem = () => wrapper.findComponent(ListItem);
+ const findPackageLink = () => wrapper.findComponent(GlLink);
+ const findWarningIcon = () => wrapper.findByTestId('warning-icon');
+ const findLeftSecondaryInfos = () => wrapper.findByTestId('left-secondary-infos');
+
+ const mountComponent = ({
+ packageEntity = packageWithoutTags,
+ provide = defaultProvide,
+ } = {}) => {
+ wrapper = shallowMountExtended(PackagesListRow, {
+ provide,
+ stubs: {
+ ListItem,
+ GlSprintf,
+ },
+ propsData: {
+ packageEntity,
+ },
+ directives: {
+ GlTooltip: createMockDirective(),
+ },
+ });
+ };
+
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ it('renders', () => {
+ mountComponent();
+ expect(wrapper.element).toMatchSnapshot();
+ });
+
+ describe('tags', () => {
+ it('renders package tags when a package has tags', () => {
+ mountComponent({ packageEntity: packageWithTags });
+
+ expect(findPackageTags().exists()).toBe(true);
+ });
+
+ it('does not render when there are no tags', () => {
+ mountComponent();
+
+ expect(findPackageTags().exists()).toBe(false);
+ });
+ });
+
+ describe('when it is group', () => {
+ it('has a package path component', () => {
+ mountComponent({ provide: { isGroupPage: true } });
+
+ expect(findPackagePath().exists()).toBe(true);
+ expect(findPackagePath().props()).toMatchObject({ path: 'gitlab-org/gitlab-test' });
+ });
+ });
+
+ describe('delete button', () => {
+ it('exists and has the correct props', () => {
+ mountComponent({ packageEntity: packageWithoutTags });
+
+ expect(findDeleteButton().exists()).toBe(true);
+ expect(findDeleteButton().attributes()).toMatchObject({
+ icon: 'remove',
+ category: 'secondary',
+ variant: 'danger',
+ title: 'Remove package',
+ });
+ });
+
+ it('emits the packageToDelete event when the delete button is clicked', async () => {
+ mountComponent({ packageEntity: packageWithoutTags });
+
+ findDeleteButton().vm.$emit('click');
+
+ await wrapper.vm.$nextTick();
+ expect(wrapper.emitted('packageToDelete')).toBeTruthy();
+ expect(wrapper.emitted('packageToDelete')[0]).toEqual([packageWithoutTags]);
+ });
+ });
+
+ describe(`when the package is in ${PACKAGE_ERROR_STATUS} status`, () => {
+ beforeEach(() => {
+ mountComponent({ packageEntity: { ...packageWithoutTags, status: PACKAGE_ERROR_STATUS } });
+ });
+
+ it('list item has a disabled prop', () => {
+ expect(findListItem().props('disabled')).toBe(true);
+ });
+
+ it('details link is disabled', () => {
+ expect(findPackageLink().attributes('disabled')).toBe('true');
+ });
+
+ it('has a warning icon', () => {
+ const icon = findWarningIcon();
+ const tooltip = getBinding(icon.element, 'gl-tooltip');
+ expect(icon.props('icon')).toBe('warning');
+ expect(tooltip.value).toMatchObject({
+ title: 'Invalid Package: failed metadata extraction',
+ });
+ });
+
+ it('delete button does not exist', () => {
+ expect(findDeleteButton().exists()).toBe(false);
+ });
+ });
+
+ describe('secondary left info', () => {
+ it('has the package version', () => {
+ mountComponent();
+
+ expect(findLeftSecondaryInfos().text()).toContain(packageWithoutTags.version);
+ });
+
+ it('if the pipeline exists show the author message', () => {
+ mountComponent({
+ packageEntity: { ...packageWithoutTags, pipelines: { nodes: packagePipelines() } },
+ });
+
+ expect(findLeftSecondaryInfos().text()).toContain('published by Administrator');
+ });
+
+ it('has icon and name component', () => {
+ mountComponent();
+
+ expect(findPackageIconAndName().text()).toBe(packageWithoutTags.packageType.toLowerCase());
+ });
+ });
+});
diff --git a/spec/frontend/packages_and_registries/package_registry/components/list/packages_list_app_spec.js b/spec/frontend/packages_and_registries/package_registry/components/list/packages_list_app_spec.js
deleted file mode 100644
index 6c871a34d50..00000000000
--- a/spec/frontend/packages_and_registries/package_registry/components/list/packages_list_app_spec.js
+++ /dev/null
@@ -1,273 +0,0 @@
-import { GlEmptyState, GlSprintf, GlLink } from '@gitlab/ui';
-import { shallowMount, createLocalVue } from '@vue/test-utils';
-import Vuex from 'vuex';
-import setWindowLocation from 'helpers/set_window_location_helper';
-import createFlash from '~/flash';
-import * as commonUtils from '~/lib/utils/common_utils';
-import { DELETE_PACKAGE_SUCCESS_MESSAGE } from '~/packages/list/constants';
-import { SHOW_DELETE_SUCCESS_ALERT } from '~/packages/shared/constants';
-import PackageListApp from '~/packages_and_registries/package_registry/components/list/packages_list_app.vue';
-import { FILTERED_SEARCH_TERM } from '~/packages_and_registries/shared/constants';
-import * as packageUtils from '~/packages_and_registries/shared/utils';
-
-jest.mock('~/lib/utils/common_utils');
-jest.mock('~/flash');
-
-const localVue = createLocalVue();
-localVue.use(Vuex);
-
-describe('packages_list_app', () => {
- let wrapper;
- let store;
-
- const PackageList = {
- name: 'package-list',
- template: '<div><slot name="empty-state"></slot></div>',
- };
- const GlLoadingIcon = { name: 'gl-loading-icon', template: '<div>loading</div>' };
-
- // we need to manually stub dynamic imported components because shallowMount is not able to stub them automatically. See: https://github.com/vuejs/vue-test-utils/issues/1279
- const PackageSearch = { name: 'PackageSearch', template: '<div></div>' };
- const PackageTitle = { name: 'PackageTitle', template: '<div></div>' };
- const InfrastructureTitle = { name: 'InfrastructureTitle', template: '<div></div>' };
- const InfrastructureSearch = { name: 'InfrastructureSearch', template: '<div></div>' };
-
- const emptyListHelpUrl = 'helpUrl';
- const findEmptyState = () => wrapper.find(GlEmptyState);
- const findListComponent = () => wrapper.find(PackageList);
- const findPackageSearch = () => wrapper.find(PackageSearch);
- const findPackageTitle = () => wrapper.find(PackageTitle);
- const findInfrastructureTitle = () => wrapper.find(InfrastructureTitle);
- const findInfrastructureSearch = () => wrapper.find(InfrastructureSearch);
-
- const createStore = (filter = []) => {
- store = new Vuex.Store({
- state: {
- isLoading: false,
- config: {
- resourceId: 'project_id',
- emptyListIllustration: 'helpSvg',
- emptyListHelpUrl,
- packageHelpUrl: 'foo',
- },
- filter,
- },
- });
- store.dispatch = jest.fn();
- };
-
- const mountComponent = (provide) => {
- wrapper = shallowMount(PackageListApp, {
- localVue,
- store,
- stubs: {
- GlEmptyState,
- GlLoadingIcon,
- PackageList,
- GlSprintf,
- GlLink,
- PackageSearch,
- PackageTitle,
- InfrastructureTitle,
- InfrastructureSearch,
- },
- provide,
- });
- };
-
- beforeEach(() => {
- createStore();
- jest.spyOn(packageUtils, 'getQueryParams').mockReturnValue({});
- });
-
- afterEach(() => {
- wrapper.destroy();
- });
-
- it('renders', () => {
- mountComponent();
- expect(wrapper.element).toMatchSnapshot();
- });
-
- it('call requestPackagesList on page:changed', () => {
- mountComponent();
- store.dispatch.mockClear();
-
- const list = findListComponent();
- list.vm.$emit('page:changed', 1);
- expect(store.dispatch).toHaveBeenCalledWith('requestPackagesList', { page: 1 });
- });
-
- it('call requestDeletePackage on package:delete', () => {
- mountComponent();
-
- const list = findListComponent();
- list.vm.$emit('package:delete', 'foo');
- expect(store.dispatch).toHaveBeenCalledWith('requestDeletePackage', 'foo');
- });
-
- it('does call requestPackagesList only one time on render', () => {
- mountComponent();
-
- expect(store.dispatch).toHaveBeenCalledTimes(3);
- expect(store.dispatch).toHaveBeenNthCalledWith(1, 'setSorting', expect.any(Object));
- expect(store.dispatch).toHaveBeenNthCalledWith(2, 'setFilter', expect.any(Array));
- expect(store.dispatch).toHaveBeenNthCalledWith(3, 'requestPackagesList');
- });
-
- describe('url query string handling', () => {
- const defaultQueryParamsMock = {
- search: [1, 2],
- type: 'npm',
- sort: 'asc',
- orderBy: 'created',
- };
-
- it('calls setSorting with the query string based sorting', () => {
- jest.spyOn(packageUtils, 'getQueryParams').mockReturnValue(defaultQueryParamsMock);
-
- mountComponent();
-
- expect(store.dispatch).toHaveBeenNthCalledWith(1, 'setSorting', {
- orderBy: defaultQueryParamsMock.orderBy,
- sort: defaultQueryParamsMock.sort,
- });
- });
-
- it('calls setFilter with the query string based filters', () => {
- jest.spyOn(packageUtils, 'getQueryParams').mockReturnValue(defaultQueryParamsMock);
-
- mountComponent();
-
- expect(store.dispatch).toHaveBeenNthCalledWith(2, 'setFilter', [
- { type: 'type', value: { data: defaultQueryParamsMock.type } },
- { type: FILTERED_SEARCH_TERM, value: { data: defaultQueryParamsMock.search[0] } },
- { type: FILTERED_SEARCH_TERM, value: { data: defaultQueryParamsMock.search[1] } },
- ]);
- });
-
- it('calls setSorting and setFilters with the results of extractFilterAndSorting', () => {
- jest
- .spyOn(packageUtils, 'extractFilterAndSorting')
- .mockReturnValue({ filters: ['foo'], sorting: { sort: 'desc' } });
-
- mountComponent();
-
- expect(store.dispatch).toHaveBeenNthCalledWith(1, 'setSorting', { sort: 'desc' });
- expect(store.dispatch).toHaveBeenNthCalledWith(2, 'setFilter', ['foo']);
- });
- });
-
- describe('empty state', () => {
- it('generate the correct empty list link', () => {
- mountComponent();
-
- const link = findListComponent().find(GlLink);
-
- expect(link.attributes('href')).toBe(emptyListHelpUrl);
- expect(link.text()).toBe('publish and share your packages');
- });
-
- it('includes the right content on the default tab', () => {
- mountComponent();
-
- const heading = findEmptyState().find('h1');
-
- expect(heading.text()).toBe('There are no packages yet');
- });
- });
-
- describe('filter without results', () => {
- beforeEach(() => {
- createStore([{ type: 'something' }]);
- mountComponent();
- });
-
- it('should show specific empty message', () => {
- expect(findEmptyState().text()).toContain('Sorry, your filter produced no results');
- expect(findEmptyState().text()).toContain(
- 'To widen your search, change or remove the filters above',
- );
- });
- });
-
- describe('Package Search', () => {
- it('exists', () => {
- mountComponent();
-
- expect(findPackageSearch().exists()).toBe(true);
- });
-
- it('on update fetches data from the store', () => {
- mountComponent();
- store.dispatch.mockClear();
-
- findPackageSearch().vm.$emit('update');
-
- expect(store.dispatch).toHaveBeenCalledWith('requestPackagesList');
- });
- });
-
- describe('Infrastructure config', () => {
- it('defaults to package registry components', () => {
- mountComponent();
-
- expect(findPackageSearch().exists()).toBe(true);
- expect(findPackageTitle().exists()).toBe(true);
-
- expect(findInfrastructureTitle().exists()).toBe(false);
- expect(findInfrastructureSearch().exists()).toBe(false);
- });
-
- it('mount different component based on the provided values', () => {
- mountComponent({
- titleComponent: 'InfrastructureTitle',
- searchComponent: 'InfrastructureSearch',
- });
-
- expect(findPackageSearch().exists()).toBe(false);
- expect(findPackageTitle().exists()).toBe(false);
-
- expect(findInfrastructureTitle().exists()).toBe(true);
- expect(findInfrastructureSearch().exists()).toBe(true);
- });
- });
-
- describe('delete alert handling', () => {
- const originalLocation = window.location.href;
- const search = `?${SHOW_DELETE_SUCCESS_ALERT}=true`;
-
- beforeEach(() => {
- createStore();
- jest.spyOn(commonUtils, 'historyReplaceState').mockImplementation(() => {});
- setWindowLocation(search);
- });
-
- afterEach(() => {
- setWindowLocation(originalLocation);
- });
-
- it(`creates a flash if the query string contains ${SHOW_DELETE_SUCCESS_ALERT}`, () => {
- mountComponent();
-
- expect(createFlash).toHaveBeenCalledWith({
- message: DELETE_PACKAGE_SUCCESS_MESSAGE,
- type: 'notice',
- });
- });
-
- it('calls historyReplaceState with a clean url', () => {
- mountComponent();
-
- expect(commonUtils.historyReplaceState).toHaveBeenCalledWith(originalLocation);
- });
-
- it(`does nothing if the query string does not contain ${SHOW_DELETE_SUCCESS_ALERT}`, () => {
- setWindowLocation('?');
- mountComponent();
-
- expect(createFlash).not.toHaveBeenCalled();
- expect(commonUtils.historyReplaceState).not.toHaveBeenCalled();
- });
- });
-});
diff --git a/spec/frontend/packages_and_registries/package_registry/components/list/packages_search_spec.js b/spec/frontend/packages_and_registries/package_registry/components/list/packages_search_spec.js
index 42bc9fa3a9e..e65b2a6f320 100644
--- a/spec/frontend/packages_and_registries/package_registry/components/list/packages_search_spec.js
+++ b/spec/frontend/packages_and_registries/package_registry/components/list/packages_search_spec.js
@@ -1,79 +1,79 @@
-import { shallowMount, createLocalVue } from '@vue/test-utils';
-import Vuex from 'vuex';
+import { nextTick } from 'vue';
+import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
import { sortableFields } from '~/packages/list/utils';
import component from '~/packages_and_registries/package_registry/components/list/package_search.vue';
import PackageTypeToken from '~/packages_and_registries/package_registry/components/list/tokens/package_type_token.vue';
import RegistrySearch from '~/vue_shared/components/registry/registry_search.vue';
import UrlSync from '~/vue_shared/components/url_sync.vue';
+import { useMockLocationHelper } from 'helpers/mock_window_location_helper';
+import { getQueryParams, extractFilterAndSorting } from '~/packages_and_registries/shared/utils';
-const localVue = createLocalVue();
-localVue.use(Vuex);
+jest.mock('~/packages_and_registries/shared/utils');
+
+useMockLocationHelper();
describe('Package Search', () => {
let wrapper;
- let store;
+
+ const defaultQueryParamsMock = {
+ filters: ['foo'],
+ sorting: { sort: 'desc' },
+ };
const findRegistrySearch = () => wrapper.findComponent(RegistrySearch);
const findUrlSync = () => wrapper.findComponent(UrlSync);
- const createStore = (isGroupPage) => {
- const state = {
- config: {
- isGroupPage,
- },
- sorting: {
- orderBy: 'version',
- sort: 'desc',
- },
- filter: [],
- };
- store = new Vuex.Store({
- state,
- });
- store.dispatch = jest.fn();
- };
-
const mountComponent = (isGroupPage = false) => {
- createStore(isGroupPage);
-
- wrapper = shallowMount(component, {
- localVue,
- store,
+ wrapper = shallowMountExtended(component, {
+ provide() {
+ return {
+ isGroupPage,
+ };
+ },
stubs: {
UrlSync,
},
});
};
+ beforeEach(() => {
+ extractFilterAndSorting.mockReturnValue(defaultQueryParamsMock);
+ });
+
afterEach(() => {
wrapper.destroy();
- wrapper = null;
});
- it('has a registry search component', () => {
+ it('has a registry search component', async () => {
mountComponent();
+ await nextTick();
+
expect(findRegistrySearch().exists()).toBe(true);
- expect(findRegistrySearch().props()).toMatchObject({
- filter: store.state.filter,
- sorting: store.state.sorting,
- tokens: expect.arrayContaining([
- expect.objectContaining({ token: PackageTypeToken, type: 'type', icon: 'package' }),
- ]),
- sortableFields: sortableFields(),
- });
+ });
+
+ it('registry search is mounted after mount', async () => {
+ mountComponent();
+
+ expect(findRegistrySearch().exists()).toBe(false);
+ });
+
+ it('has a UrlSync component', () => {
+ mountComponent();
+
+ expect(findUrlSync().exists()).toBe(true);
});
it.each`
isGroupPage | page
${false} | ${'project'}
${true} | ${'group'}
- `('in a $page page binds the right props', ({ isGroupPage }) => {
+ `('in a $page page binds the right props', async ({ isGroupPage }) => {
mountComponent(isGroupPage);
+ await nextTick();
+
expect(findRegistrySearch().props()).toMatchObject({
- filter: store.state.filter,
- sorting: store.state.sorting,
tokens: expect.arrayContaining([
expect.objectContaining({ token: PackageTypeToken, type: 'type', icon: 'package' }),
]),
@@ -81,48 +81,85 @@ describe('Package Search', () => {
});
});
- it('on sorting:changed emits update event and calls vuex setSorting', () => {
+ it('on sorting:changed emits update event and update internal sort', async () => {
const payload = { sort: 'foo' };
mountComponent();
+ await nextTick();
+
findRegistrySearch().vm.$emit('sorting:changed', payload);
- expect(store.dispatch).toHaveBeenCalledWith('setSorting', payload);
- expect(wrapper.emitted('update')).toEqual([[]]);
+ await nextTick();
+
+ expect(findRegistrySearch().props('sorting')).toEqual({ sort: 'foo', orderBy: 'name' });
+
+ // there is always a first call on mounted that emits up default values
+ expect(wrapper.emitted('update')[1]).toEqual([
+ {
+ filters: {
+ packageName: '',
+ packageType: undefined,
+ },
+ sort: 'NAME_FOO',
+ },
+ ]);
});
- it('on filter:changed calls vuex setFilter', () => {
+ it('on filter:changed updates the filters', async () => {
const payload = ['foo'];
mountComponent();
+ await nextTick();
+
findRegistrySearch().vm.$emit('filter:changed', payload);
- expect(store.dispatch).toHaveBeenCalledWith('setFilter', payload);
+ await nextTick();
+
+ expect(findRegistrySearch().props('filter')).toEqual(['foo']);
});
- it('on filter:submit emits update event', () => {
+ it('on filter:submit emits update event', async () => {
mountComponent();
- findRegistrySearch().vm.$emit('filter:submit');
-
- expect(wrapper.emitted('update')).toEqual([[]]);
- });
+ await nextTick();
- it('has a UrlSync component', () => {
- mountComponent();
+ findRegistrySearch().vm.$emit('filter:submit');
- expect(findUrlSync().exists()).toBe(true);
+ expect(wrapper.emitted('update')[1]).toEqual([
+ {
+ filters: {
+ packageName: '',
+ packageType: undefined,
+ },
+ sort: 'NAME_DESC',
+ },
+ ]);
});
- it('on query:changed calls updateQuery from UrlSync', () => {
+ it('on query:changed calls updateQuery from UrlSync', async () => {
jest.spyOn(UrlSync.methods, 'updateQuery').mockImplementation(() => {});
mountComponent();
+ await nextTick();
+
findRegistrySearch().vm.$emit('query:changed');
expect(UrlSync.methods.updateQuery).toHaveBeenCalled();
});
+
+ it('sets the component sorting and filtering based on the querystring', async () => {
+ mountComponent();
+
+ await nextTick();
+
+ expect(getQueryParams).toHaveBeenCalled();
+
+ expect(findRegistrySearch().props()).toMatchObject({
+ filter: defaultQueryParamsMock.filters,
+ sorting: defaultQueryParamsMock.sorting,
+ });
+ });
});
diff --git a/spec/frontend/packages_and_registries/package_registry/components/list/publish_method_spec.js b/spec/frontend/packages_and_registries/package_registry/components/list/publish_method_spec.js
new file mode 100644
index 00000000000..fcbd7cc6a50
--- /dev/null
+++ b/spec/frontend/packages_and_registries/package_registry/components/list/publish_method_spec.js
@@ -0,0 +1,47 @@
+import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
+import PublishMethod from '~/packages_and_registries/package_registry/components/list/publish_method.vue';
+import { packagePipelines } from '../../mock_data';
+
+const [pipelineData] = packagePipelines();
+
+describe('publish_method', () => {
+ let wrapper;
+
+ const findPipelineRef = () => wrapper.findByTestId('pipeline-ref');
+ const findPipelineSha = () => wrapper.findByTestId('pipeline-sha');
+ const findManualPublish = () => wrapper.findByTestId('manually-published');
+
+ const mountComponent = (pipeline = pipelineData) => {
+ wrapper = shallowMountExtended(PublishMethod, {
+ propsData: {
+ pipeline,
+ },
+ });
+ };
+
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ it('renders', () => {
+ mountComponent();
+ expect(wrapper.element).toMatchSnapshot();
+ });
+
+ describe('pipeline information', () => {
+ it('displays branch and commit when pipeline info exists', () => {
+ mountComponent();
+
+ expect(findPipelineRef().exists()).toBe(true);
+ expect(findPipelineSha().exists()).toBe(true);
+ });
+
+ it('does not show any pipeline details when no information exists', () => {
+ mountComponent(null);
+
+ expect(findPipelineRef().exists()).toBe(false);
+ expect(findPipelineSha().exists()).toBe(false);
+ expect(findManualPublish().text()).toBe(PublishMethod.i18n.MANUALLY_PUBLISHED);
+ });
+ });
+});
diff --git a/spec/frontend/packages_and_registries/package_registry/mock_data.js b/spec/frontend/packages_and_registries/package_registry/mock_data.js
index 9438a2d2d72..70fc096fa44 100644
--- a/spec/frontend/packages_and_registries/package_registry/mock_data.js
+++ b/spec/frontend/packages_and_registries/package_registry/mock_data.js
@@ -86,6 +86,12 @@ export const dependencyLinks = () => [
},
];
+export const packageProject = () => ({
+ fullPath: 'gitlab-org/gitlab-test',
+ webUrl: 'http://gdk.test:3000/gitlab-org/gitlab-test',
+ __typename: 'Project',
+});
+
export const packageVersions = () => [
{
createdAt: '2021-08-10T09:33:54Z',
@@ -249,3 +255,31 @@ export const packageDestroyFileMutationError = () => ({
},
],
});
+
+export const packagesListQuery = (type = 'group') => ({
+ data: {
+ [type]: {
+ packages: {
+ count: 2,
+ nodes: [
+ {
+ ...packageData(),
+ project: packageProject(),
+ tags: { nodes: packageTags() },
+ pipelines: {
+ nodes: packagePipelines(),
+ },
+ },
+ {
+ ...packageData(),
+ project: packageProject(),
+ tags: { nodes: [] },
+ pipelines: { nodes: [] },
+ },
+ ],
+ __typename: 'PackageConnection',
+ },
+ __typename: 'Group',
+ },
+ },
+});
diff --git a/spec/frontend/packages_and_registries/settings/group/components/dependency_proxy_settings_spec.js b/spec/frontend/packages_and_registries/settings/group/components/dependency_proxy_settings_spec.js
new file mode 100644
index 00000000000..d3a970e86eb
--- /dev/null
+++ b/spec/frontend/packages_and_registries/settings/group/components/dependency_proxy_settings_spec.js
@@ -0,0 +1,189 @@
+import { GlSprintf, GlLink, GlToggle } from '@gitlab/ui';
+import { shallowMount, createLocalVue } from '@vue/test-utils';
+import VueApollo from 'vue-apollo';
+import createMockApollo from 'helpers/mock_apollo_helper';
+import waitForPromises from 'helpers/wait_for_promises';
+
+import component from '~/packages_and_registries/settings/group/components/dependency_proxy_settings.vue';
+import {
+ DEPENDENCY_PROXY_HEADER,
+ DEPENDENCY_PROXY_SETTINGS_DESCRIPTION,
+ DEPENDENCY_PROXY_DOCS_PATH,
+} from '~/packages_and_registries/settings/group/constants';
+
+import updateDependencyProxySettings from '~/packages_and_registries/settings/group/graphql/mutations/update_dependency_proxy_settings.mutation.graphql';
+import getGroupPackagesSettingsQuery from '~/packages_and_registries/settings/group/graphql/queries/get_group_packages_settings.query.graphql';
+import SettingsBlock from '~/vue_shared/components/settings/settings_block.vue';
+import { updateGroupDependencyProxySettingsOptimisticResponse } from '~/packages_and_registries/settings/group/graphql/utils/optimistic_responses';
+import {
+ dependencyProxySettings,
+ dependencyProxySettingMutationMock,
+ groupPackageSettingsMock,
+ dependencyProxySettingMutationErrorMock,
+} from '../mock_data';
+
+jest.mock('~/flash');
+jest.mock('~/packages_and_registries/settings/group/graphql/utils/optimistic_responses');
+
+const localVue = createLocalVue();
+
+describe('DependencyProxySettings', () => {
+ let wrapper;
+ let apolloProvider;
+
+ const defaultProvide = {
+ defaultExpanded: false,
+ groupPath: 'foo_group_path',
+ };
+
+ localVue.use(VueApollo);
+
+ const mountComponent = ({
+ provide = defaultProvide,
+ mutationResolver = jest.fn().mockResolvedValue(dependencyProxySettingMutationMock()),
+ isLoading = false,
+ } = {}) => {
+ const requestHandlers = [[updateDependencyProxySettings, mutationResolver]];
+
+ apolloProvider = createMockApollo(requestHandlers);
+
+ wrapper = shallowMount(component, {
+ localVue,
+ apolloProvider,
+ provide,
+ propsData: {
+ dependencyProxySettings: dependencyProxySettings(),
+ isLoading,
+ },
+ stubs: {
+ GlSprintf,
+ SettingsBlock,
+ },
+ });
+ };
+
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ const findSettingsBlock = () => wrapper.findComponent(SettingsBlock);
+ const findDescription = () => wrapper.find('[data-testid="description"');
+ const findLink = () => wrapper.findComponent(GlLink);
+ const findToggle = () => wrapper.findComponent(GlToggle);
+
+ const fillApolloCache = () => {
+ apolloProvider.defaultClient.cache.writeQuery({
+ query: getGroupPackagesSettingsQuery,
+ variables: {
+ fullPath: defaultProvide.groupPath,
+ },
+ ...groupPackageSettingsMock,
+ });
+ };
+
+ const emitSettingsUpdate = (value = false) => {
+ findToggle().vm.$emit('change', value);
+ };
+
+ it('renders a settings block', () => {
+ mountComponent();
+
+ expect(findSettingsBlock().exists()).toBe(true);
+ });
+
+ it('passes the correct props to settings block', () => {
+ mountComponent();
+
+ expect(findSettingsBlock().props('defaultExpanded')).toBe(false);
+ });
+
+ it('has the correct header text', () => {
+ mountComponent();
+
+ expect(wrapper.text()).toContain(DEPENDENCY_PROXY_HEADER);
+ });
+
+ it('has the correct description text', () => {
+ mountComponent();
+
+ expect(findDescription().text()).toMatchInterpolatedText(DEPENDENCY_PROXY_SETTINGS_DESCRIPTION);
+ });
+
+ it('has the correct link', () => {
+ mountComponent();
+
+ expect(findLink().attributes()).toMatchObject({
+ href: DEPENDENCY_PROXY_DOCS_PATH,
+ });
+ expect(findLink().text()).toBe('Learn more');
+ });
+
+ describe('settings update', () => {
+ describe('success state', () => {
+ it('emits a success event', async () => {
+ mountComponent();
+
+ fillApolloCache();
+ emitSettingsUpdate();
+
+ await waitForPromises();
+
+ expect(wrapper.emitted('success')).toEqual([[]]);
+ });
+
+ it('has an optimistic response', () => {
+ mountComponent();
+
+ fillApolloCache();
+
+ expect(findToggle().props('value')).toBe(true);
+
+ emitSettingsUpdate();
+
+ expect(updateGroupDependencyProxySettingsOptimisticResponse).toHaveBeenCalledWith({
+ enabled: false,
+ });
+ });
+ });
+
+ describe('errors', () => {
+ it('mutation payload with root level errors', async () => {
+ const mutationResolver = jest
+ .fn()
+ .mockResolvedValue(dependencyProxySettingMutationErrorMock);
+ mountComponent({ mutationResolver });
+
+ fillApolloCache();
+
+ emitSettingsUpdate();
+
+ await waitForPromises();
+
+ expect(wrapper.emitted('error')).toEqual([[]]);
+ });
+
+ it.each`
+ type | mutationResolver
+ ${'local'} | ${jest.fn().mockResolvedValue(dependencyProxySettingMutationMock({ errors: ['foo'] }))}
+ ${'network'} | ${jest.fn().mockRejectedValue()}
+ `('mutation payload with $type error', async ({ mutationResolver }) => {
+ mountComponent({ mutationResolver });
+
+ fillApolloCache();
+ emitSettingsUpdate();
+
+ await waitForPromises();
+
+ expect(wrapper.emitted('error')).toEqual([[]]);
+ });
+ });
+ });
+
+ describe('when isLoading is true', () => {
+ it('disables enable toggle', () => {
+ mountComponent({ isLoading: true });
+
+ expect(findToggle().props('disabled')).toBe(true);
+ });
+ });
+});
diff --git a/spec/frontend/packages_and_registries/settings/group/components/duplicates_settings_spec.js b/spec/frontend/packages_and_registries/settings/group/components/duplicates_settings_spec.js
index 0bbb1ce3436..79c2f811c08 100644
--- a/spec/frontend/packages_and_registries/settings/group/components/duplicates_settings_spec.js
+++ b/spec/frontend/packages_and_registries/settings/group/components/duplicates_settings_spec.js
@@ -143,4 +143,18 @@ describe('Duplicates Settings', () => {
expect(findInputGroup().exists()).toBe(false);
});
});
+
+ describe('loading', () => {
+ beforeEach(() => {
+ mountComponent({ ...defaultProps, loading: true });
+ });
+
+ it('disables the enable toggle', () => {
+ expect(findToggle().props('disabled')).toBe(true);
+ });
+
+ it('disables the form input', () => {
+ expect(findInput().attributes('disabled')).toBe('true');
+ });
+ });
});
diff --git a/spec/frontend/packages_and_registries/settings/group/components/group_settings_app_spec.js b/spec/frontend/packages_and_registries/settings/group/components/group_settings_app_spec.js
index f2877a1f2a5..e4d62bc6a6e 100644
--- a/spec/frontend/packages_and_registries/settings/group/components/group_settings_app_spec.js
+++ b/spec/frontend/packages_and_registries/settings/group/components/group_settings_app_spec.js
@@ -1,28 +1,16 @@
-import { GlSprintf, GlLink, GlAlert } from '@gitlab/ui';
+import { GlAlert } from '@gitlab/ui';
import { shallowMount, createLocalVue } from '@vue/test-utils';
import VueApollo from 'vue-apollo';
+import { nextTick } from 'vue';
import createMockApollo from 'helpers/mock_apollo_helper';
import waitForPromises from 'helpers/wait_for_promises';
-import DuplicatesSettings from '~/packages_and_registries/settings/group/components/duplicates_settings.vue';
-import GenericSettings from '~/packages_and_registries/settings/group/components/generic_settings.vue';
+import PackagesSettings from '~/packages_and_registries/settings/group/components/packages_settings.vue';
+import DependencyProxySettings from '~/packages_and_registries/settings/group/components/dependency_proxy_settings.vue';
+
import component from '~/packages_and_registries/settings/group/components/group_settings_app.vue';
-import MavenSettings from '~/packages_and_registries/settings/group/components/maven_settings.vue';
-import {
- PACKAGE_SETTINGS_HEADER,
- PACKAGE_SETTINGS_DESCRIPTION,
- PACKAGES_DOCS_PATH,
- ERROR_UPDATING_SETTINGS,
- SUCCESS_UPDATING_SETTINGS,
-} from '~/packages_and_registries/settings/group/constants';
-import updateNamespacePackageSettings from '~/packages_and_registries/settings/group/graphql/mutations/update_group_packages_settings.mutation.graphql';
import getGroupPackagesSettingsQuery from '~/packages_and_registries/settings/group/graphql/queries/get_group_packages_settings.query.graphql';
-import SettingsBlock from '~/vue_shared/components/settings/settings_block.vue';
-import {
- groupPackageSettingsMock,
- groupPackageSettingsMutationMock,
- groupPackageSettingsMutationErrorMock,
-} from '../mock_data';
+import { groupPackageSettingsMock, packageSettings, dependencyProxySettings } from '../mock_data';
jest.mock('~/flash');
@@ -36,20 +24,16 @@ describe('Group Settings App', () => {
const defaultProvide = {
defaultExpanded: false,
groupPath: 'foo_group_path',
+ dependencyProxyAvailable: true,
};
const mountComponent = ({
- provide = defaultProvide,
resolver = jest.fn().mockResolvedValue(groupPackageSettingsMock),
- mutationResolver = jest.fn().mockResolvedValue(groupPackageSettingsMutationMock()),
- data = {},
+ provide = defaultProvide,
} = {}) => {
localVue.use(VueApollo);
- const requestHandlers = [
- [getGroupPackagesSettingsQuery, resolver],
- [updateNamespacePackageSettings, mutationResolver],
- ];
+ const requestHandlers = [[getGroupPackagesSettingsQuery, resolver]];
apolloProvider = createMockApollo(requestHandlers);
@@ -57,17 +41,6 @@ describe('Group Settings App', () => {
localVue,
apolloProvider,
provide,
- data() {
- return {
- ...data,
- };
- },
- stubs: {
- GlSprintf,
- SettingsBlock,
- MavenSettings,
- GenericSettings,
- },
mocks: {
$toast: {
show,
@@ -84,274 +57,89 @@ describe('Group Settings App', () => {
wrapper.destroy();
});
- const findSettingsBlock = () => wrapper.findComponent(SettingsBlock);
- const findDescription = () => wrapper.find('[data-testid="description"');
- const findLink = () => wrapper.findComponent(GlLink);
const findAlert = () => wrapper.findComponent(GlAlert);
- const findMavenSettings = () => wrapper.findComponent(MavenSettings);
- const findMavenDuplicatedSettings = () => findMavenSettings().findComponent(DuplicatesSettings);
- const findGenericSettings = () => wrapper.findComponent(GenericSettings);
- const findGenericDuplicatedSettings = () =>
- findGenericSettings().findComponent(DuplicatesSettings);
+ const findPackageSettings = () => wrapper.findComponent(PackagesSettings);
+ const findDependencyProxySettings = () => wrapper.findComponent(DependencyProxySettings);
const waitForApolloQueryAndRender = async () => {
await waitForPromises();
- await wrapper.vm.$nextTick();
- };
-
- const emitSettingsUpdate = (override) => {
- findMavenDuplicatedSettings().vm.$emit('update', {
- mavenDuplicateExceptionRegex: ')',
- ...override,
- });
+ await nextTick();
};
- it('renders a settings block', () => {
- mountComponent();
-
- expect(findSettingsBlock().exists()).toBe(true);
- });
-
- it('passes the correct props to settings block', () => {
- mountComponent();
-
- expect(findSettingsBlock().props('defaultExpanded')).toBe(false);
- });
-
- it('has the correct header text', () => {
- mountComponent();
-
- expect(wrapper.text()).toContain(PACKAGE_SETTINGS_HEADER);
- });
-
- it('has the correct description text', () => {
- mountComponent();
-
- expect(findDescription().text()).toMatchInterpolatedText(PACKAGE_SETTINGS_DESCRIPTION);
- });
-
- it('has the correct link', () => {
- mountComponent();
-
- expect(findLink().attributes()).toMatchObject({
- href: PACKAGES_DOCS_PATH,
- target: '_blank',
- });
- expect(findLink().text()).toBe('Learn more.');
- });
-
- it('calls the graphql API with the proper variables', () => {
- const resolver = jest.fn().mockResolvedValue(groupPackageSettingsMock);
- mountComponent({ resolver });
-
- expect(resolver).toHaveBeenCalledWith({
- fullPath: defaultProvide.groupPath,
- });
- });
-
- describe('maven settings', () => {
- it('exists', () => {
+ describe.each`
+ finder | entityProp | entityValue | successMessage | errorMessage
+ ${findPackageSettings} | ${'packageSettings'} | ${packageSettings()} | ${'Settings saved successfully'} | ${'An error occurred while saving the settings'}
+ ${findDependencyProxySettings} | ${'dependencyProxySettings'} | ${dependencyProxySettings()} | ${'Setting saved successfully'} | ${'An error occurred while saving the setting'}
+ `('settings blocks', ({ finder, entityProp, entityValue, successMessage, errorMessage }) => {
+ beforeEach(() => {
mountComponent();
-
- expect(findMavenSettings().exists()).toBe(true);
+ return waitForApolloQueryAndRender();
});
- it('assigns duplication allowness and exception props', async () => {
- mountComponent();
-
- expect(findMavenDuplicatedSettings().props('loading')).toBe(true);
-
- await waitForApolloQueryAndRender();
-
- const {
- mavenDuplicatesAllowed,
- mavenDuplicateExceptionRegex,
- } = groupPackageSettingsMock.data.group.packageSettings;
-
- expect(findMavenDuplicatedSettings().props()).toMatchObject({
- duplicatesAllowed: mavenDuplicatesAllowed,
- duplicateExceptionRegex: mavenDuplicateExceptionRegex,
- duplicateExceptionRegexError: '',
- loading: false,
- });
+ it('renders the settings block', () => {
+ expect(finder().exists()).toBe(true);
});
- it('on update event calls the mutation', async () => {
- const mutationResolver = jest.fn().mockResolvedValue(groupPackageSettingsMutationMock());
- mountComponent({ mutationResolver });
-
- await waitForApolloQueryAndRender();
-
- emitSettingsUpdate();
-
- expect(mutationResolver).toHaveBeenCalledWith({
- input: { mavenDuplicateExceptionRegex: ')', namespacePath: 'foo_group_path' },
+ it('binds the correctProps', () => {
+ expect(finder().props()).toMatchObject({
+ isLoading: false,
+ [entityProp]: entityValue,
});
});
- });
-
- describe('generic settings', () => {
- it('exists', () => {
- mountComponent();
-
- expect(findGenericSettings().exists()).toBe(true);
- });
-
- it('assigns duplication allowness and exception props', async () => {
- mountComponent();
-
- expect(findGenericDuplicatedSettings().props('loading')).toBe(true);
-
- await waitForApolloQueryAndRender();
-
- const {
- genericDuplicatesAllowed,
- genericDuplicateExceptionRegex,
- } = groupPackageSettingsMock.data.group.packageSettings;
- expect(findGenericDuplicatedSettings().props()).toMatchObject({
- duplicatesAllowed: genericDuplicatesAllowed,
- duplicateExceptionRegex: genericDuplicateExceptionRegex,
- duplicateExceptionRegexError: '',
- loading: false,
+ describe('success event', () => {
+ it('shows a success toast', () => {
+ finder().vm.$emit('success');
+ expect(show).toHaveBeenCalledWith(successMessage);
});
- });
- it('on update event calls the mutation', async () => {
- const mutationResolver = jest.fn().mockResolvedValue(groupPackageSettingsMutationMock());
- mountComponent({ mutationResolver });
+ it('hides the error alert', async () => {
+ finder().vm.$emit('error');
+ await nextTick();
- await waitForApolloQueryAndRender();
+ expect(findAlert().exists()).toBe(true);
- findMavenDuplicatedSettings().vm.$emit('update', {
- genericDuplicateExceptionRegex: ')',
- });
+ finder().vm.$emit('success');
+ await nextTick();
- expect(mutationResolver).toHaveBeenCalledWith({
- input: { genericDuplicateExceptionRegex: ')', namespacePath: 'foo_group_path' },
+ expect(findAlert().exists()).toBe(false);
});
});
- });
-
- describe('settings update', () => {
- describe('success state', () => {
- it('shows a success alert', async () => {
- mountComponent();
-
- await waitForApolloQueryAndRender();
-
- emitSettingsUpdate();
-
- await waitForPromises();
-
- expect(show).toHaveBeenCalledWith(SUCCESS_UPDATING_SETTINGS);
- });
-
- it('has an optimistic response', async () => {
- const mavenDuplicateExceptionRegex = 'latest[main]something';
- mountComponent();
- await waitForApolloQueryAndRender();
-
- expect(findMavenDuplicatedSettings().props('duplicateExceptionRegex')).toBe('');
-
- emitSettingsUpdate({ mavenDuplicateExceptionRegex });
-
- // wait for apollo to update the model with the optimistic response
- await wrapper.vm.$nextTick();
-
- expect(findMavenDuplicatedSettings().props('duplicateExceptionRegex')).toBe(
- mavenDuplicateExceptionRegex,
- );
-
- // wait for the call to resolve
- await waitForPromises();
-
- expect(findMavenDuplicatedSettings().props('duplicateExceptionRegex')).toBe(
- mavenDuplicateExceptionRegex,
- );
+ describe('error event', () => {
+ beforeEach(() => {
+ finder().vm.$emit('error');
+ return nextTick();
});
- });
- describe('errors', () => {
- const verifyAlert = () => {
+ it('shows an alert', () => {
expect(findAlert().exists()).toBe(true);
- expect(findAlert().text()).toBe(ERROR_UPDATING_SETTINGS);
- expect(findAlert().props('variant')).toBe('warning');
- };
-
- it('mutation payload with root level errors', async () => {
- // note this is a complex test that covers all the path around errors that are shown in the form
- // it's one single it case, due to the expensive preparation and execution
- const mutationResolver = jest.fn().mockResolvedValue(groupPackageSettingsMutationErrorMock);
- mountComponent({ mutationResolver });
-
- await waitForApolloQueryAndRender();
-
- emitSettingsUpdate();
-
- await waitForApolloQueryAndRender();
-
- // errors are bound to the component
- expect(findMavenDuplicatedSettings().props('duplicateExceptionRegexError')).toBe(
- groupPackageSettingsMutationErrorMock.errors[0].extensions.problems[0].message,
- );
-
- // general error message is shown
-
- verifyAlert();
-
- emitSettingsUpdate();
-
- await wrapper.vm.$nextTick();
-
- // errors are reset on mutation call
- expect(findMavenDuplicatedSettings().props('duplicateExceptionRegexError')).toBe('');
});
- it.each`
- type | mutationResolver
- ${'local'} | ${jest.fn().mockResolvedValue(groupPackageSettingsMutationMock({ errors: ['foo'] }))}
- ${'network'} | ${jest.fn().mockRejectedValue()}
- `('mutation payload with $type error', async ({ mutationResolver }) => {
- mountComponent({ mutationResolver });
-
- await waitForApolloQueryAndRender();
-
- emitSettingsUpdate();
-
- await waitForPromises();
-
- verifyAlert();
+ it('alert has the right text', () => {
+ expect(findAlert().text()).toBe(errorMessage);
});
- it('a successful request dismisses the alert', async () => {
- mountComponent({ data: { alertMessage: 'foo' } });
-
- await waitForApolloQueryAndRender();
-
+ it('dismissing the alert removes it', async () => {
expect(findAlert().exists()).toBe(true);
- emitSettingsUpdate();
+ findAlert().vm.$emit('dismiss');
- await waitForPromises();
+ await nextTick();
expect(findAlert().exists()).toBe(false);
});
+ });
+ });
- it('dismiss event from alert dismiss it from the page', async () => {
- mountComponent({ data: { alertMessage: 'foo' } });
-
- await waitForApolloQueryAndRender();
-
- expect(findAlert().exists()).toBe(true);
-
- findAlert().vm.$emit('dismiss');
-
- await wrapper.vm.$nextTick();
+ describe('when the dependency proxy is not available', () => {
+ beforeEach(() => {
+ mountComponent({ provide: { ...defaultProvide, dependencyProxyAvailable: false } });
+ return waitForApolloQueryAndRender();
+ });
- expect(findAlert().exists()).toBe(false);
- });
+ it('the setting block is hidden', () => {
+ expect(findDependencyProxySettings().exists()).toBe(false);
});
});
});
diff --git a/spec/frontend/packages_and_registries/settings/group/components/package_settings_spec.js b/spec/frontend/packages_and_registries/settings/group/components/package_settings_spec.js
new file mode 100644
index 00000000000..693af21e24a
--- /dev/null
+++ b/spec/frontend/packages_and_registries/settings/group/components/package_settings_spec.js
@@ -0,0 +1,277 @@
+import { GlSprintf, GlLink } from '@gitlab/ui';
+import { createLocalVue } from '@vue/test-utils';
+import VueApollo from 'vue-apollo';
+import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
+import createMockApollo from 'helpers/mock_apollo_helper';
+import waitForPromises from 'helpers/wait_for_promises';
+import DuplicatesSettings from '~/packages_and_registries/settings/group/components/duplicates_settings.vue';
+import GenericSettings from '~/packages_and_registries/settings/group/components/generic_settings.vue';
+import component from '~/packages_and_registries/settings/group/components/packages_settings.vue';
+import MavenSettings from '~/packages_and_registries/settings/group/components/maven_settings.vue';
+import {
+ PACKAGE_SETTINGS_HEADER,
+ PACKAGE_SETTINGS_DESCRIPTION,
+ PACKAGES_DOCS_PATH,
+} from '~/packages_and_registries/settings/group/constants';
+
+import updateNamespacePackageSettings from '~/packages_and_registries/settings/group/graphql/mutations/update_group_packages_settings.mutation.graphql';
+import getGroupPackagesSettingsQuery from '~/packages_and_registries/settings/group/graphql/queries/get_group_packages_settings.query.graphql';
+import SettingsBlock from '~/vue_shared/components/settings/settings_block.vue';
+import { updateGroupPackagesSettingsOptimisticResponse } from '~/packages_and_registries/settings/group/graphql/utils/optimistic_responses';
+import {
+ packageSettings,
+ groupPackageSettingsMock,
+ groupPackageSettingsMutationMock,
+ groupPackageSettingsMutationErrorMock,
+} from '../mock_data';
+
+jest.mock('~/flash');
+jest.mock('~/packages_and_registries/settings/group/graphql/utils/optimistic_responses');
+
+const localVue = createLocalVue();
+
+describe('Packages Settings', () => {
+ let wrapper;
+ let apolloProvider;
+
+ const defaultProvide = {
+ defaultExpanded: false,
+ groupPath: 'foo_group_path',
+ };
+
+ const mountComponent = ({
+ mutationResolver = jest.fn().mockResolvedValue(groupPackageSettingsMutationMock()),
+ } = {}) => {
+ localVue.use(VueApollo);
+
+ const requestHandlers = [[updateNamespacePackageSettings, mutationResolver]];
+
+ apolloProvider = createMockApollo(requestHandlers);
+
+ wrapper = shallowMountExtended(component, {
+ localVue,
+ apolloProvider,
+ provide: defaultProvide,
+ propsData: {
+ packageSettings: packageSettings(),
+ },
+ stubs: {
+ GlSprintf,
+ SettingsBlock,
+ MavenSettings,
+ GenericSettings,
+ },
+ });
+ };
+
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ const findSettingsBlock = () => wrapper.findComponent(SettingsBlock);
+ const findDescription = () => wrapper.findByTestId('description');
+ const findLink = () => wrapper.findComponent(GlLink);
+ const findMavenSettings = () => wrapper.findComponent(MavenSettings);
+ const findMavenDuplicatedSettings = () => findMavenSettings().findComponent(DuplicatesSettings);
+ const findGenericSettings = () => wrapper.findComponent(GenericSettings);
+ const findGenericDuplicatedSettings = () =>
+ findGenericSettings().findComponent(DuplicatesSettings);
+
+ const fillApolloCache = () => {
+ apolloProvider.defaultClient.cache.writeQuery({
+ query: getGroupPackagesSettingsQuery,
+ variables: {
+ fullPath: defaultProvide.groupPath,
+ },
+ ...groupPackageSettingsMock,
+ });
+ };
+
+ const emitMavenSettingsUpdate = (override) => {
+ findMavenDuplicatedSettings().vm.$emit('update', {
+ mavenDuplicateExceptionRegex: ')',
+ ...override,
+ });
+ };
+
+ it('renders a settings block', () => {
+ mountComponent();
+
+ expect(findSettingsBlock().exists()).toBe(true);
+ });
+
+ it('passes the correct props to settings block', () => {
+ mountComponent();
+
+ expect(findSettingsBlock().props('defaultExpanded')).toBe(false);
+ });
+
+ it('has the correct header text', () => {
+ mountComponent();
+
+ expect(wrapper.text()).toContain(PACKAGE_SETTINGS_HEADER);
+ });
+
+ it('has the correct description text', () => {
+ mountComponent();
+
+ expect(findDescription().text()).toMatchInterpolatedText(PACKAGE_SETTINGS_DESCRIPTION);
+ });
+
+ it('has the correct link', () => {
+ mountComponent();
+
+ expect(findLink().attributes()).toMatchObject({
+ href: PACKAGES_DOCS_PATH,
+ target: '_blank',
+ });
+ expect(findLink().text()).toBe('Learn more.');
+ });
+
+ describe('maven settings', () => {
+ it('exists', () => {
+ mountComponent();
+
+ expect(findMavenSettings().exists()).toBe(true);
+ });
+
+ it('assigns duplication allowness and exception props', async () => {
+ mountComponent();
+
+ const { mavenDuplicatesAllowed, mavenDuplicateExceptionRegex } = packageSettings();
+
+ expect(findMavenDuplicatedSettings().props()).toMatchObject({
+ duplicatesAllowed: mavenDuplicatesAllowed,
+ duplicateExceptionRegex: mavenDuplicateExceptionRegex,
+ duplicateExceptionRegexError: '',
+ loading: false,
+ });
+ });
+
+ it('on update event calls the mutation', () => {
+ const mutationResolver = jest.fn().mockResolvedValue(groupPackageSettingsMutationMock());
+ mountComponent({ mutationResolver });
+
+ fillApolloCache();
+
+ emitMavenSettingsUpdate();
+
+ expect(mutationResolver).toHaveBeenCalledWith({
+ input: { mavenDuplicateExceptionRegex: ')', namespacePath: 'foo_group_path' },
+ });
+ });
+ });
+
+ describe('generic settings', () => {
+ it('exists', () => {
+ mountComponent();
+
+ expect(findGenericSettings().exists()).toBe(true);
+ });
+
+ it('assigns duplication allowness and exception props', async () => {
+ mountComponent();
+
+ const { genericDuplicatesAllowed, genericDuplicateExceptionRegex } = packageSettings();
+
+ expect(findGenericDuplicatedSettings().props()).toMatchObject({
+ duplicatesAllowed: genericDuplicatesAllowed,
+ duplicateExceptionRegex: genericDuplicateExceptionRegex,
+ duplicateExceptionRegexError: '',
+ loading: false,
+ });
+ });
+
+ it('on update event calls the mutation', async () => {
+ const mutationResolver = jest.fn().mockResolvedValue(groupPackageSettingsMutationMock());
+ mountComponent({ mutationResolver });
+
+ fillApolloCache();
+
+ findMavenDuplicatedSettings().vm.$emit('update', {
+ genericDuplicateExceptionRegex: ')',
+ });
+
+ expect(mutationResolver).toHaveBeenCalledWith({
+ input: { genericDuplicateExceptionRegex: ')', namespacePath: 'foo_group_path' },
+ });
+ });
+ });
+
+ describe('settings update', () => {
+ describe('success state', () => {
+ it('emits a success event', async () => {
+ mountComponent();
+
+ fillApolloCache();
+ emitMavenSettingsUpdate();
+
+ await waitForPromises();
+
+ expect(wrapper.emitted('success')).toEqual([[]]);
+ });
+
+ it('has an optimistic response', () => {
+ const mavenDuplicateExceptionRegex = 'latest[main]something';
+ mountComponent();
+
+ fillApolloCache();
+
+ expect(findMavenDuplicatedSettings().props('duplicateExceptionRegex')).toBe('');
+
+ emitMavenSettingsUpdate({ mavenDuplicateExceptionRegex });
+
+ expect(updateGroupPackagesSettingsOptimisticResponse).toHaveBeenCalledWith({
+ ...packageSettings(),
+ mavenDuplicateExceptionRegex,
+ });
+ });
+ });
+
+ describe('errors', () => {
+ it('mutation payload with root level errors', async () => {
+ // note this is a complex test that covers all the path around errors that are shown in the form
+ // it's one single it case, due to the expensive preparation and execution
+ const mutationResolver = jest.fn().mockResolvedValue(groupPackageSettingsMutationErrorMock);
+ mountComponent({ mutationResolver });
+
+ fillApolloCache();
+
+ emitMavenSettingsUpdate();
+
+ await waitForPromises();
+
+ // errors are bound to the component
+ expect(findMavenDuplicatedSettings().props('duplicateExceptionRegexError')).toBe(
+ groupPackageSettingsMutationErrorMock.errors[0].extensions.problems[0].message,
+ );
+
+ // general error message is shown
+
+ expect(wrapper.emitted('error')).toEqual([[]]);
+
+ emitMavenSettingsUpdate();
+
+ await wrapper.vm.$nextTick();
+
+ // errors are reset on mutation call
+ expect(findMavenDuplicatedSettings().props('duplicateExceptionRegexError')).toBe('');
+ });
+
+ it.each`
+ type | mutationResolver
+ ${'local'} | ${jest.fn().mockResolvedValue(groupPackageSettingsMutationMock({ errors: ['foo'] }))}
+ ${'network'} | ${jest.fn().mockRejectedValue()}
+ `('mutation payload with $type error', async ({ mutationResolver }) => {
+ mountComponent({ mutationResolver });
+
+ fillApolloCache();
+ emitMavenSettingsUpdate();
+
+ await waitForPromises();
+
+ expect(wrapper.emitted('error')).toEqual([[]]);
+ });
+ });
+ });
+});
diff --git a/spec/frontend/packages_and_registries/settings/group/graphl/utils/cache_update_spec.js b/spec/frontend/packages_and_registries/settings/group/graphl/utils/cache_update_spec.js
index 03133bf1158..9d8504a1124 100644
--- a/spec/frontend/packages_and_registries/settings/group/graphl/utils/cache_update_spec.js
+++ b/spec/frontend/packages_and_registries/settings/group/graphl/utils/cache_update_spec.js
@@ -4,14 +4,16 @@ import { updateGroupPackageSettings } from '~/packages_and_registries/settings/g
describe('Package and Registries settings group cache updates', () => {
let client;
- const payload = {
- data: {
- updateNamespacePackageSettings: {
- packageSettings: {
- mavenDuplicatesAllowed: false,
- mavenDuplicateExceptionRegex: 'latest[main]something',
- },
- },
+ const updateNamespacePackageSettingsPayload = {
+ packageSettings: {
+ mavenDuplicatesAllowed: false,
+ mavenDuplicateExceptionRegex: 'latest[main]something',
+ },
+ };
+
+ const updateDependencyProxySettingsPayload = {
+ dependencyProxySetting: {
+ enabled: false,
},
};
@@ -21,6 +23,9 @@ describe('Package and Registries settings group cache updates', () => {
mavenDuplicatesAllowed: true,
mavenDuplicateExceptionRegex: '',
},
+ dependencyProxySetting: {
+ enabled: true,
+ },
},
};
@@ -35,22 +40,35 @@ describe('Package and Registries settings group cache updates', () => {
writeQuery: jest.fn(),
};
});
- describe('updateGroupPackageSettings', () => {
- it('calls readQuery', () => {
- updateGroupPackageSettings('foo')(client, payload);
- expect(client.readQuery).toHaveBeenCalledWith(queryAndVariables);
- });
-
- it('writes the correct result in the cache', () => {
- updateGroupPackageSettings('foo')(client, payload);
- expect(client.writeQuery).toHaveBeenCalledWith({
- ...queryAndVariables,
- data: {
- group: {
- ...payload.data.updateNamespacePackageSettings,
+
+ describe.each`
+ updateNamespacePackageSettings | updateDependencyProxySettings
+ ${updateNamespacePackageSettingsPayload} | ${updateDependencyProxySettingsPayload}
+ ${undefined} | ${updateDependencyProxySettingsPayload}
+ ${updateNamespacePackageSettingsPayload} | ${undefined}
+ ${undefined} | ${undefined}
+ `(
+ 'updateGroupPackageSettings',
+ ({ updateNamespacePackageSettings, updateDependencyProxySettings }) => {
+ const payload = { data: { updateNamespacePackageSettings, updateDependencyProxySettings } };
+ it('calls readQuery', () => {
+ updateGroupPackageSettings('foo')(client, payload);
+ expect(client.readQuery).toHaveBeenCalledWith(queryAndVariables);
+ });
+
+ it('writes the correct result in the cache', () => {
+ updateGroupPackageSettings('foo')(client, payload);
+ expect(client.writeQuery).toHaveBeenCalledWith({
+ ...queryAndVariables,
+ data: {
+ group: {
+ ...cacheMock.group,
+ ...payload.data.updateNamespacePackageSettings,
+ ...payload.data.updateDependencyProxySettings,
+ },
},
- },
+ });
});
- });
- });
+ },
+ );
});
diff --git a/spec/frontend/packages_and_registries/settings/group/graphl/utils/optimistic_responses_spec.js b/spec/frontend/packages_and_registries/settings/group/graphl/utils/optimistic_responses_spec.js
index a3c53d5768a..debeb9aa89c 100644
--- a/spec/frontend/packages_and_registries/settings/group/graphl/utils/optimistic_responses_spec.js
+++ b/spec/frontend/packages_and_registries/settings/group/graphl/utils/optimistic_responses_spec.js
@@ -1,4 +1,7 @@
-import { updateGroupPackagesSettingsOptimisticResponse } from '~/packages_and_registries/settings/group/graphql/utils/optimistic_responses';
+import {
+ updateGroupPackagesSettingsOptimisticResponse,
+ updateGroupDependencyProxySettingsOptimisticResponse,
+} from '~/packages_and_registries/settings/group/graphql/utils/optimistic_responses';
describe('Optimistic responses', () => {
describe('updateGroupPackagesSettingsOptimisticResponse', () => {
@@ -17,4 +20,22 @@ describe('Optimistic responses', () => {
`);
});
});
+
+ describe('updateGroupDependencyProxySettingsOptimisticResponse', () => {
+ it('returns the correct structure', () => {
+ expect(updateGroupDependencyProxySettingsOptimisticResponse({ foo: 'bar' }))
+ .toMatchInlineSnapshot(`
+ Object {
+ "__typename": "Mutation",
+ "updateDependencyProxySettings": Object {
+ "__typename": "UpdateDependencyProxySettingsPayload",
+ "dependencyProxySetting": Object {
+ "foo": "bar",
+ },
+ "errors": Array [],
+ },
+ }
+ `);
+ });
+ });
});
diff --git a/spec/frontend/packages_and_registries/settings/group/mock_data.js b/spec/frontend/packages_and_registries/settings/group/mock_data.js
index 65119e288a1..81ba0795b7d 100644
--- a/spec/frontend/packages_and_registries/settings/group/mock_data.js
+++ b/spec/frontend/packages_and_registries/settings/group/mock_data.js
@@ -1,12 +1,20 @@
+export const packageSettings = () => ({
+ mavenDuplicatesAllowed: true,
+ mavenDuplicateExceptionRegex: '',
+ genericDuplicatesAllowed: true,
+ genericDuplicateExceptionRegex: '',
+});
+
+export const dependencyProxySettings = () => ({
+ enabled: true,
+});
+
export const groupPackageSettingsMock = {
data: {
group: {
- packageSettings: {
- mavenDuplicatesAllowed: true,
- mavenDuplicateExceptionRegex: '',
- genericDuplicatesAllowed: true,
- genericDuplicateExceptionRegex: '',
- },
+ fullPath: 'foo_group_path',
+ packageSettings: packageSettings(),
+ dependencyProxySetting: dependencyProxySettings(),
},
},
};
@@ -26,6 +34,16 @@ export const groupPackageSettingsMutationMock = (override) => ({
},
});
+export const dependencyProxySettingMutationMock = (override) => ({
+ data: {
+ updateDependencyProxySettings: {
+ dependencyProxySetting: dependencyProxySettings(),
+ errors: [],
+ ...override,
+ },
+ },
+});
+
export const groupPackageSettingsMutationErrorMock = {
errors: [
{
@@ -50,3 +68,23 @@ export const groupPackageSettingsMutationErrorMock = {
},
],
};
+export const dependencyProxySettingMutationErrorMock = {
+ errors: [
+ {
+ message: 'Some error',
+ locations: [{ line: 1, column: 41 }],
+ extensions: {
+ value: {
+ enabled: 'gitlab-org',
+ },
+ problems: [
+ {
+ path: ['enabled'],
+ explanation: 'explaination',
+ message: 'message',
+ },
+ ],
+ },
+ },
+ ],
+};
diff --git a/spec/frontend/packages_and_registries/settings/project/settings/__snapshots__/utils_spec.js.snap b/spec/frontend/packages_and_registries/settings/project/settings/__snapshots__/utils_spec.js.snap
index cf554717127..2719e917a9b 100644
--- a/spec/frontend/packages_and_registries/settings/project/settings/__snapshots__/utils_spec.js.snap
+++ b/spec/frontend/packages_and_registries/settings/project/settings/__snapshots__/utils_spec.js.snap
@@ -100,6 +100,12 @@ Array [
"variable": 30,
},
Object {
+ "default": false,
+ "key": "SIXTY_DAYS",
+ "label": "60 days",
+ "variable": 60,
+ },
+ Object {
"default": true,
"key": "NINETY_DAYS",
"label": "90 days",
diff --git a/spec/frontend/packages_and_registries/settings/project/settings/components/__snapshots__/settings_form_spec.js.snap b/spec/frontend/packages_and_registries/settings/project/settings/components/__snapshots__/settings_form_spec.js.snap
index 1009db46401..9938357ed24 100644
--- a/spec/frontend/packages_and_registries/settings/project/settings/components/__snapshots__/settings_form_spec.js.snap
+++ b/spec/frontend/packages_and_registries/settings/project/settings/components/__snapshots__/settings_form_spec.js.snap
@@ -44,7 +44,7 @@ exports[`Settings Form Keep Regex matches snapshot 1`] = `
exports[`Settings Form OlderThan matches snapshot 1`] = `
<expiration-dropdown-stub
data-testid="older-than-dropdown"
- formoptions="[object Object],[object Object],[object Object],[object Object],[object Object]"
+ formoptions="[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]"
label="Remove tags older than:"
name="older-than"
value="FOURTEEN_DAYS"
diff --git a/spec/frontend/pages/admin/projects/components/namespace_select_spec.js b/spec/frontend/pages/admin/projects/components/namespace_select_spec.js
new file mode 100644
index 00000000000..c579aa2f2da
--- /dev/null
+++ b/spec/frontend/pages/admin/projects/components/namespace_select_spec.js
@@ -0,0 +1,93 @@
+import { mount } from '@vue/test-utils';
+import Api from '~/api';
+import NamespaceSelect from '~/pages/admin/projects/components/namespace_select.vue';
+
+describe('Dropdown select component', () => {
+ let wrapper;
+
+ const mountDropdown = (propsData) => {
+ wrapper = mount(NamespaceSelect, { propsData });
+ };
+
+ const findDropdownToggle = () => wrapper.find('button.dropdown-toggle');
+ const findNamespaceInput = () => wrapper.find('[data-testid="hidden-input"]');
+ const findFilterInput = () => wrapper.find('.namespace-search-box input');
+ const findDropdownOption = (match) => {
+ const buttons = wrapper
+ .findAll('button.dropdown-item')
+ .filter((node) => node.text().match(match));
+ return buttons.length ? buttons.at(0) : buttons;
+ };
+
+ const setFieldValue = async (field, value) => {
+ await field.setValue(value);
+ field.trigger('blur');
+ };
+
+ beforeEach(() => {
+ setFixtures('<div class="test-container"></div>');
+
+ jest.spyOn(Api, 'namespaces').mockImplementation((_, callback) =>
+ callback([
+ { id: 10, kind: 'user', full_path: 'Administrator' },
+ { id: 20, kind: 'group', full_path: 'GitLab Org' },
+ ]),
+ );
+ });
+
+ it('creates a hidden input if fieldName is provided', () => {
+ mountDropdown({ fieldName: 'namespace-input' });
+
+ expect(findNamespaceInput()).toExist();
+ expect(findNamespaceInput().attributes('name')).toBe('namespace-input');
+ });
+
+ describe('clicking dropdown options', () => {
+ it('retrieves namespaces based on filter query', async () => {
+ mountDropdown();
+
+ await setFieldValue(findFilterInput(), 'test');
+
+ expect(Api.namespaces).toHaveBeenCalledWith('test', expect.anything());
+ });
+
+ it('updates the dropdown value based upon selection', async () => {
+ mountDropdown({ fieldName: 'namespace-input' });
+
+ // wait for dropdown options to populate
+ await wrapper.vm.$nextTick();
+
+ expect(findDropdownOption('user: Administrator')).toExist();
+ expect(findDropdownOption('group: GitLab Org')).toExist();
+ expect(findDropdownOption('group: Foobar')).not.toExist();
+
+ findDropdownOption('user: Administrator').trigger('click');
+ await wrapper.vm.$nextTick();
+
+ expect(findNamespaceInput().attributes('value')).toBe('10');
+ expect(findDropdownToggle().text()).toBe('user: Administrator');
+ });
+
+ it('triggers a setNamespace event upon selection', async () => {
+ mountDropdown();
+
+ // wait for dropdown options to populate
+ await wrapper.vm.$nextTick();
+
+ findDropdownOption('group: GitLab Org').trigger('click');
+
+ expect(wrapper.emitted('setNamespace')).toHaveLength(1);
+ expect(wrapper.emitted('setNamespace')[0][0]).toBe(20);
+ });
+
+ it('displays "Any Namespace" option when showAny prop provided', () => {
+ mountDropdown({ showAny: true });
+ expect(wrapper.text()).toContain('Any namespace');
+ });
+
+ it('does not display "Any Namespace" option when showAny prop not provided', () => {
+ mountDropdown();
+ expect(wrapper.text()).not.toContain('Any namespace');
+ });
+ });
+});
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
new file mode 100644
index 00000000000..d6b394a42c6
--- /dev/null
+++ b/spec/frontend/pages/import/bulk_imports/history/components/bulk_imports_history_app_spec.js
@@ -0,0 +1,175 @@
+import { GlEmptyState, GlLoadingIcon, GlTable } from '@gitlab/ui';
+import { mount, shallowMount } from '@vue/test-utils';
+import MockAdapter from 'axios-mock-adapter';
+import axios from '~/lib/utils/axios_utils';
+import PaginationBar from '~/import_entities/components/pagination_bar.vue';
+import BulkImportsHistoryApp from '~/pages/import/bulk_imports/history/components/bulk_imports_history_app.vue';
+import { extendedWrapper } from 'helpers/vue_test_utils_helper';
+
+describe('BulkImportsHistoryApp', () => {
+ const API_URL = '/api/v4/bulk_imports/entities';
+
+ const DEFAULT_HEADERS = {
+ 'x-page': 1,
+ 'x-per-page': 20,
+ 'x-next-page': 2,
+ 'x-total': 22,
+ 'x-total-pages': 2,
+ 'x-prev-page': null,
+ };
+ const DUMMY_RESPONSE = [
+ {
+ id: 1,
+ bulk_import_id: 1,
+ status: 'finished',
+ source_full_path: 'top-level-group-12',
+ destination_name: 'top-level-group-12',
+ destination_namespace: 'h5bp',
+ created_at: '2021-07-08T10:03:44.743Z',
+ failures: [],
+ },
+ {
+ id: 2,
+ bulk_import_id: 2,
+ status: 'failed',
+ source_full_path: 'autodevops-demo',
+ destination_name: 'autodevops-demo',
+ destination_namespace: 'flightjs',
+ parent_id: null,
+ namespace_id: null,
+ project_id: null,
+ created_at: '2021-07-13T12:52:26.664Z',
+ updated_at: '2021-07-13T13:34:49.403Z',
+ failures: [
+ {
+ pipeline_class: 'BulkImports::Groups::Pipelines::GroupPipeline',
+ pipeline_step: 'loader',
+ exception_class: 'ActiveRecord::RecordNotUnique',
+ correlation_id_value: '01FAFYSYZ7XPF3P9NSMTS693SZ',
+ created_at: '2021-07-13T13:34:49.344Z',
+ },
+ ],
+ },
+ ];
+
+ let wrapper;
+ let mock;
+
+ function createComponent({ shallow = true } = {}) {
+ const mountFn = shallow ? shallowMount : mount;
+ wrapper = mountFn(BulkImportsHistoryApp);
+ }
+
+ const originalApiVersion = gon.api_version;
+ beforeAll(() => {
+ gon.api_version = 'v4';
+ });
+
+ afterAll(() => {
+ gon.api_version = originalApiVersion;
+ });
+
+ beforeEach(() => {
+ mock = new MockAdapter(axios);
+ });
+
+ afterEach(() => {
+ mock.restore();
+ wrapper.destroy();
+ });
+
+ describe('general behavior', () => {
+ it('renders loading state when loading', () => {
+ createComponent();
+ expect(wrapper.find(GlLoadingIcon).exists()).toBe(true);
+ });
+
+ it('renders empty state when no data is available', async () => {
+ mock.onGet(API_URL).reply(200, [], DEFAULT_HEADERS);
+ createComponent();
+ await axios.waitForAll();
+
+ expect(wrapper.find(GlLoadingIcon).exists()).toBe(false);
+ expect(wrapper.find(GlEmptyState).exists()).toBe(true);
+ });
+
+ 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.find(GlTable);
+ expect(table.exists()).toBe(true);
+ // can't use .props() or .attributes() here
+ expect(table.vm.$attrs.items).toHaveLength(DUMMY_RESPONSE.length);
+ });
+
+ 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();
+
+ wrapper.findComponent(PaginationBar).vm.$emit('set-page', NEW_PAGE);
+ await axios.waitForAll();
+
+ expect(mock.history.get.length).toBe(1);
+ expect(mock.history.get[0].params).toStrictEqual(expect.objectContaining({ page: NEW_PAGE }));
+ });
+ });
+
+ 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();
+
+ wrapper.findComponent(PaginationBar).vm.$emit('set-page-size', NEW_PAGE_SIZE);
+ await axios.waitForAll();
+
+ expect(mock.history.get.length).toBe(1);
+ expect(mock.history.get[0].params).toStrictEqual(
+ expect.objectContaining({ per_page: NEW_PAGE_SIZE }),
+ );
+ });
+
+ describe('details button', () => {
+ beforeEach(() => {
+ mock.onGet(API_URL).reply(200, DUMMY_RESPONSE, DEFAULT_HEADERS);
+ createComponent({ shallow: false });
+ return axios.waitForAll();
+ });
+
+ it('renders details button if relevant item has failures', async () => {
+ expect(
+ extendedWrapper(wrapper.find('tbody').findAll('tr').at(1)).findByText('Details').exists(),
+ ).toBe(true);
+ });
+
+ it('does not render details button if relevant item has no failures', () => {
+ expect(
+ extendedWrapper(wrapper.find('tbody').findAll('tr').at(0)).findByText('Details').exists(),
+ ).toBe(false);
+ });
+
+ it('expands details when details button is clicked', async () => {
+ const ORIGINAL_ROW_INDEX = 1;
+ await extendedWrapper(wrapper.find('tbody').findAll('tr').at(ORIGINAL_ROW_INDEX))
+ .findByText('Details')
+ .trigger('click');
+
+ const detailsRowContent = wrapper
+ .find('tbody')
+ .findAll('tr')
+ .at(ORIGINAL_ROW_INDEX + 1)
+ .find('pre');
+
+ expect(detailsRowContent.exists()).toBe(true);
+ expect(JSON.parse(detailsRowContent.text())).toStrictEqual(DUMMY_RESPONSE[1].failures);
+ });
+ });
+});
diff --git a/spec/frontend/pages/profiles/password_prompt/password_prompt_modal_spec.js b/spec/frontend/pages/profiles/password_prompt/password_prompt_modal_spec.js
new file mode 100644
index 00000000000..b722ac1e97b
--- /dev/null
+++ b/spec/frontend/pages/profiles/password_prompt/password_prompt_modal_spec.js
@@ -0,0 +1,92 @@
+import { GlModal } from '@gitlab/ui';
+import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
+import {
+ I18N_PASSWORD_PROMPT_CANCEL_BUTTON,
+ I18N_PASSWORD_PROMPT_CONFIRM_BUTTON,
+} from '~/pages/profiles/password_prompt/constants';
+import PasswordPromptModal from '~/pages/profiles/password_prompt/password_prompt_modal.vue';
+
+const createComponent = ({ props }) => {
+ return shallowMountExtended(PasswordPromptModal, {
+ propsData: {
+ ...props,
+ },
+ });
+};
+
+describe('Password prompt modal', () => {
+ let wrapper;
+
+ const mockPassword = 'not+fake+shady+password';
+ const mockEvent = { preventDefault: jest.fn() };
+ const handleConfirmPasswordSpy = jest.fn();
+
+ const findField = () => wrapper.findByTestId('password-prompt-field');
+ const findModal = () => wrapper.findComponent(GlModal);
+ const findConfirmBtn = () => findModal().props('actionPrimary');
+ const findConfirmBtnDisabledState = () =>
+ findModal().props('actionPrimary').attributes[2].disabled;
+
+ const findCancelBtn = () => findModal().props('actionCancel');
+
+ const submitModal = () => findModal().vm.$emit('primary', mockEvent);
+ const setPassword = (newPw) => findField().vm.$emit('input', newPw);
+
+ beforeEach(() => {
+ wrapper = createComponent({
+ props: {
+ handleConfirmPassword: handleConfirmPasswordSpy,
+ },
+ });
+ });
+
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ it('renders the password field', () => {
+ expect(findField().exists()).toBe(true);
+ });
+
+ it('renders the confirm button', () => {
+ expect(findConfirmBtn().text).toEqual(I18N_PASSWORD_PROMPT_CONFIRM_BUTTON);
+ });
+
+ it('renders the cancel button', () => {
+ expect(findCancelBtn().text).toEqual(I18N_PASSWORD_PROMPT_CANCEL_BUTTON);
+ });
+
+ describe('confirm button', () => {
+ describe('with a valid password', () => {
+ it('calls the `handleConfirmPassword` method when clicked', async () => {
+ setPassword(mockPassword);
+ submitModal();
+
+ await wrapper.vm.$nextTick();
+
+ expect(handleConfirmPasswordSpy).toHaveBeenCalledTimes(1);
+ expect(handleConfirmPasswordSpy).toHaveBeenCalledWith(mockPassword);
+ });
+
+ it('enables the confirm button', async () => {
+ setPassword(mockPassword);
+
+ expect(findConfirmBtnDisabledState()).toBe(true);
+
+ await wrapper.vm.$nextTick();
+
+ expect(findConfirmBtnDisabledState()).toBe(false);
+ });
+ });
+
+ it('without a valid password is disabled', async () => {
+ setPassword('');
+
+ expect(findConfirmBtnDisabledState()).toBe(true);
+
+ await wrapper.vm.$nextTick();
+
+ expect(findConfirmBtnDisabledState()).toBe(true);
+ });
+ });
+});
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 417567c9f4c..43361bb6f24 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
@@ -12,11 +12,11 @@ exports[`Code Coverage when fetching data is successful matches the snapshot 1`]
<gl-dropdown-stub
category="primary"
clearalltext="Clear all"
+ clearalltextclass="gl-px-5"
headertext=""
hideheaderborder="true"
highlighteditemstitle="Selected"
highlighteditemstitleclass="gl-px-5"
- showhighlighteditemstitle="true"
size="medium"
text="rspec"
variant="default"
diff --git a/spec/frontend/pages/projects/new/components/app_spec.js b/spec/frontend/pages/projects/new/components/app_spec.js
deleted file mode 100644
index ab8c6d529a8..00000000000
--- a/spec/frontend/pages/projects/new/components/app_spec.js
+++ /dev/null
@@ -1,44 +0,0 @@
-import { shallowMount } from '@vue/test-utils';
-import App from '~/pages/projects/new/components/app.vue';
-import NewNamespacePage from '~/vue_shared/new_namespace/new_namespace_page.vue';
-
-describe('Experimental new project creation app', () => {
- let wrapper;
-
- const createComponent = (propsData) => {
- wrapper = shallowMount(App, { propsData });
- };
-
- afterEach(() => {
- wrapper.destroy();
- });
-
- it('passes custom new project guideline text to underlying component', () => {
- const DEMO_GUIDELINES = 'Demo guidelines';
- const guidelineSelector = '#new-project-guideline';
- createComponent({
- newProjectGuidelines: DEMO_GUIDELINES,
- });
-
- expect(wrapper.find(guidelineSelector).text()).toBe(DEMO_GUIDELINES);
- });
-
- it.each`
- isCiCdAvailable | outcome
- ${false} | ${'do not show CI/CD panel'}
- ${true} | ${'show CI/CD panel'}
- `('$outcome when isCiCdAvailable is $isCiCdAvailable', ({ isCiCdAvailable }) => {
- createComponent({
- isCiCdAvailable,
- });
-
- expect(
- Boolean(
- wrapper
- .findComponent(NewNamespacePage)
- .props()
- .panels.find((p) => p.name === 'cicd_for_external_repo'),
- ),
- ).toBe(isCiCdAvailable);
- });
-});
diff --git a/spec/frontend/pages/projects/new/components/new_project_push_tip_popover_spec.js b/spec/frontend/pages/projects/new/components/new_project_push_tip_popover_spec.js
deleted file mode 100644
index d4cf8c78600..00000000000
--- a/spec/frontend/pages/projects/new/components/new_project_push_tip_popover_spec.js
+++ /dev/null
@@ -1,75 +0,0 @@
-import { GlPopover, GlFormInputGroup } from '@gitlab/ui';
-import { shallowMount } from '@vue/test-utils';
-import NewProjectPushTipPopover from '~/pages/projects/new/components/new_project_push_tip_popover.vue';
-import ClipboardButton from '~/vue_shared/components/clipboard_button.vue';
-
-describe('New project push tip popover', () => {
- let wrapper;
- const targetId = 'target';
- const pushToCreateProjectCommand = 'command';
- const workingWithProjectsHelpPath = 'path';
-
- const findPopover = () => wrapper.findComponent(GlPopover);
- const findClipboardButton = () => wrapper.findComponent(ClipboardButton);
- const findFormInput = () => wrapper.findComponent(GlFormInputGroup);
- const findHelpLink = () => wrapper.find('a');
- const findTarget = () => document.getElementById(targetId);
-
- const buildWrapper = () => {
- wrapper = shallowMount(NewProjectPushTipPopover, {
- propsData: {
- target: findTarget(),
- },
- stubs: {
- GlFormInputGroup,
- },
- provide: {
- pushToCreateProjectCommand,
- workingWithProjectsHelpPath,
- },
- });
- };
-
- beforeEach(() => {
- setFixtures(`<a id="${targetId}"></a>`);
- buildWrapper();
- });
-
- afterEach(() => {
- wrapper.destroy();
- });
-
- it('renders popover that targets the specified target', () => {
- expect(findPopover().props()).toMatchObject({
- target: findTarget(),
- triggers: 'click blur',
- placement: 'top',
- title: 'Push to create a project',
- });
- });
-
- it('renders a readonly form input with the push to create command', () => {
- expect(findFormInput().props()).toMatchObject({
- value: pushToCreateProjectCommand,
- selectOnClick: true,
- });
- expect(findFormInput().attributes()).toMatchObject({
- 'aria-label': 'Push project from command line',
- readonly: 'readonly',
- });
- });
-
- it('allows copying the push command using the clipboard button', () => {
- expect(findClipboardButton().props()).toMatchObject({
- text: pushToCreateProjectCommand,
- tooltipPlacement: 'right',
- title: 'Copy command',
- });
- });
-
- it('displays a link to open the push command help page reference', () => {
- expect(findHelpLink().attributes().href).toBe(
- `${workingWithProjectsHelpPath}#push-to-create-a-new-project`,
- );
- });
-});
diff --git a/spec/frontend/pages/projects/new/components/new_project_url_select_spec.js b/spec/frontend/pages/projects/new/components/new_project_url_select_spec.js
deleted file mode 100644
index 8a7f9229503..00000000000
--- a/spec/frontend/pages/projects/new/components/new_project_url_select_spec.js
+++ /dev/null
@@ -1,122 +0,0 @@
-import { GlButton, GlDropdown, GlDropdownItem, GlDropdownSectionHeader } from '@gitlab/ui';
-import { createLocalVue, mount, shallowMount } from '@vue/test-utils';
-import VueApollo from 'vue-apollo';
-import createMockApollo from 'helpers/mock_apollo_helper';
-import { mockTracking, unmockTracking } from 'helpers/tracking_helper';
-import { getIdFromGraphQLId } from '~/graphql_shared/utils';
-import NewProjectUrlSelect from '~/pages/projects/new/components/new_project_url_select.vue';
-import searchQuery from '~/pages/projects/new/queries/search_namespaces_where_user_can_create_projects.query.graphql';
-
-describe('NewProjectUrlSelect component', () => {
- let wrapper;
-
- const data = {
- currentUser: {
- groups: {
- nodes: [
- {
- id: 'gid://gitlab/Group/26',
- fullPath: 'flightjs',
- },
- {
- id: 'gid://gitlab/Group/28',
- fullPath: 'h5bp',
- },
- ],
- },
- namespace: {
- id: 'gid://gitlab/Namespace/1',
- fullPath: 'root',
- },
- },
- };
-
- const localVue = createLocalVue();
- localVue.use(VueApollo);
-
- const requestHandlers = [[searchQuery, jest.fn().mockResolvedValue({ data })]];
- const apolloProvider = createMockApollo(requestHandlers);
-
- const provide = {
- namespaceFullPath: 'h5bp',
- namespaceId: '28',
- rootUrl: 'https://gitlab.com/',
- trackLabel: 'blank_project',
- };
-
- const mountComponent = ({ mountFn = shallowMount } = {}) =>
- mountFn(NewProjectUrlSelect, { localVue, apolloProvider, provide });
-
- const findButtonLabel = () => wrapper.findComponent(GlButton);
- const findDropdown = () => wrapper.findComponent(GlDropdown);
- const findHiddenInput = () => wrapper.find('input');
-
- afterEach(() => {
- wrapper.destroy();
- });
-
- it('renders the root url as a label', () => {
- wrapper = mountComponent();
-
- expect(findButtonLabel().text()).toBe(provide.rootUrl);
- expect(findButtonLabel().props('label')).toBe(true);
- });
-
- it('renders a dropdown with the initial namespace full path as the text', () => {
- wrapper = mountComponent();
-
- expect(findDropdown().props('text')).toBe(provide.namespaceFullPath);
- });
-
- it('renders a dropdown with the initial namespace id in the hidden input', () => {
- wrapper = mountComponent();
-
- expect(findHiddenInput().attributes('value')).toBe(provide.namespaceId);
- });
-
- it('renders expected dropdown items', async () => {
- wrapper = mountComponent({ mountFn: mount });
-
- jest.runOnlyPendingTimers();
- await wrapper.vm.$nextTick();
-
- const listItems = wrapper.findAll('li');
-
- expect(listItems.at(0).findComponent(GlDropdownSectionHeader).text()).toBe('Groups');
- expect(listItems.at(1).text()).toBe(data.currentUser.groups.nodes[0].fullPath);
- expect(listItems.at(2).text()).toBe(data.currentUser.groups.nodes[1].fullPath);
- expect(listItems.at(3).findComponent(GlDropdownSectionHeader).text()).toBe('Users');
- expect(listItems.at(4).text()).toBe(data.currentUser.namespace.fullPath);
- });
-
- it('updates hidden input with selected namespace', async () => {
- wrapper = mountComponent();
-
- jest.runOnlyPendingTimers();
- await wrapper.vm.$nextTick();
-
- wrapper.findComponent(GlDropdownItem).vm.$emit('click');
-
- await wrapper.vm.$nextTick();
-
- expect(findHiddenInput().attributes()).toMatchObject({
- name: 'project[namespace_id]',
- value: getIdFromGraphQLId(data.currentUser.groups.nodes[0].id).toString(),
- });
- });
-
- it('tracks clicking on the dropdown', () => {
- wrapper = mountComponent();
-
- const trackingSpy = mockTracking(undefined, wrapper.element, jest.spyOn);
-
- findDropdown().vm.$emit('show');
-
- expect(trackingSpy).toHaveBeenCalledWith(undefined, 'activate_form_input', {
- label: provide.trackLabel,
- property: 'project_path',
- });
-
- unmockTracking();
- });
-});
diff --git a/spec/frontend/pages/projects/pipeline_schedules/shared/components/timezone_dropdown_spec.js b/spec/frontend/pages/projects/pipeline_schedules/shared/components/timezone_dropdown_spec.js
index 2a3b07f95f2..53c1733eab9 100644
--- a/spec/frontend/pages/projects/pipeline_schedules/shared/components/timezone_dropdown_spec.js
+++ b/spec/frontend/pages/projects/pipeline_schedules/shared/components/timezone_dropdown_spec.js
@@ -10,7 +10,17 @@ describe('Timezone Dropdown', () => {
let $dropdownEl = null;
let $wrapper = null;
const tzListSel = '.dropdown-content ul li a.is-active';
- const tzDropdownToggleText = '.dropdown-toggle-text';
+
+ const initTimezoneDropdown = (options = {}) => {
+ // eslint-disable-next-line no-new
+ new TimezoneDropdown({
+ $inputEl,
+ $dropdownEl,
+ ...options,
+ });
+ };
+
+ const findDropdownToggleText = () => $wrapper.find('.dropdown-toggle-text');
describe('Initialize', () => {
describe('with dropdown already loaded', () => {
@@ -18,16 +28,13 @@ describe('Timezone Dropdown', () => {
loadFixtures('pipeline_schedules/edit.html');
$wrapper = $('.dropdown');
$inputEl = $('#schedule_cron_timezone');
+ $inputEl.val('');
$dropdownEl = $('.js-timezone-dropdown');
-
- // eslint-disable-next-line no-new
- new TimezoneDropdown({
- $inputEl,
- $dropdownEl,
- });
});
it('can take an $inputEl in the constructor', () => {
+ initTimezoneDropdown();
+
const tzStr = '[UTC + 5.5] Sri Jayawardenepura';
const tzValue = 'Asia/Colombo';
@@ -42,6 +49,8 @@ describe('Timezone Dropdown', () => {
});
it('will format data array of timezones into a list of offsets', () => {
+ initTimezoneDropdown();
+
const data = $dropdownEl.data('data');
const formatted = $wrapper.find(tzListSel).text();
@@ -50,10 +59,28 @@ describe('Timezone Dropdown', () => {
});
});
- it('will default the timezone to UTC', () => {
- const tz = $inputEl.val();
+ describe('when `allowEmpty` property is `false`', () => {
+ beforeEach(() => {
+ initTimezoneDropdown();
+ });
+
+ it('will default the timezone to UTC', () => {
+ const tz = $inputEl.val();
- expect(tz).toBe('UTC');
+ expect(tz).toBe('UTC');
+ });
+ });
+
+ describe('when `allowEmpty` property is `true`', () => {
+ beforeEach(() => {
+ initTimezoneDropdown({
+ allowEmpty: true,
+ });
+ });
+
+ it('will default the value of the input to an empty string', () => {
+ expect($inputEl.val()).toBe('');
+ });
});
});
@@ -68,23 +95,15 @@ describe('Timezone Dropdown', () => {
it('will populate the list of UTC offsets after the dropdown is loaded', () => {
expect($wrapper.find(tzListSel).length).toEqual(0);
- // eslint-disable-next-line no-new
- new TimezoneDropdown({
- $inputEl,
- $dropdownEl,
- });
+ initTimezoneDropdown();
expect($wrapper.find(tzListSel).length).toEqual($($dropdownEl).data('data').length);
});
it('will call a provided handler when a new timezone is selected', () => {
const onSelectTimezone = jest.fn();
- // eslint-disable-next-line no-new
- new TimezoneDropdown({
- $inputEl,
- $dropdownEl,
- onSelectTimezone,
- });
+
+ initTimezoneDropdown({ onSelectTimezone });
$wrapper.find(tzListSel).first().trigger('click');
@@ -94,24 +113,15 @@ describe('Timezone Dropdown', () => {
it('will correctly set the dropdown label if a timezone identifier is set on the inputEl', () => {
$inputEl.val('America/St_Johns');
- // eslint-disable-next-line no-new
- new TimezoneDropdown({
- $inputEl,
- $dropdownEl,
- displayFormat: (selectedItem) => formatTimezone(selectedItem),
- });
+ initTimezoneDropdown({ displayFormat: (selectedItem) => formatTimezone(selectedItem) });
- expect($wrapper.find(tzDropdownToggleText).html()).toEqual('[UTC - 2.5] Newfoundland');
+ expect(findDropdownToggleText().html()).toEqual('[UTC - 2.5] Newfoundland');
});
it('will call a provided `displayFormat` handler to format the dropdown value', () => {
const displayFormat = jest.fn();
- // eslint-disable-next-line no-new
- new TimezoneDropdown({
- $inputEl,
- $dropdownEl,
- displayFormat,
- });
+
+ initTimezoneDropdown({ displayFormat });
$wrapper.find(tzListSel).first().trigger('click');
diff --git a/spec/frontend/pages/sessions/new/preserve_url_fragment_spec.js b/spec/frontend/pages/sessions/new/preserve_url_fragment_spec.js
index e39a3904613..a29db961452 100644
--- a/spec/frontend/pages/sessions/new/preserve_url_fragment_spec.js
+++ b/spec/frontend/pages/sessions/new/preserve_url_fragment_spec.js
@@ -44,7 +44,7 @@ describe('preserve_url_fragment', () => {
});
it('when "remember-me" is present', () => {
- $('.omniauth-btn')
+ $('.js-oauth-login')
.parent('form')
.attr('action', (i, href) => `${href}?remember_me=1`);
diff --git a/spec/frontend/pipeline_editor/components/editor/text_editor_spec.js b/spec/frontend/pipeline_editor/components/editor/text_editor_spec.js
index 85222f2ecbb..a43da4b0f19 100644
--- a/spec/frontend/pipeline_editor/components/editor/text_editor_spec.js
+++ b/spec/frontend/pipeline_editor/components/editor/text_editor_spec.js
@@ -112,11 +112,6 @@ describe('Pipeline Editor | Text editor component', () => {
it('configures editor with syntax highlight', () => {
expect(mockUse).toHaveBeenCalledTimes(1);
expect(mockRegisterCiSchema).toHaveBeenCalledTimes(1);
- expect(mockRegisterCiSchema).toHaveBeenCalledWith({
- projectNamespace: mockProjectNamespace,
- projectPath: mockProjectPath,
- ref: mockCommitSha,
- });
});
});
diff --git a/spec/frontend/pipeline_editor/components/header/pipeline_status_spec.js b/spec/frontend/pipeline_editor/components/header/pipeline_status_spec.js
index 753682d438b..44656b2b67d 100644
--- a/spec/frontend/pipeline_editor/components/header/pipeline_status_spec.js
+++ b/spec/frontend/pipeline_editor/components/header/pipeline_status_spec.js
@@ -5,22 +5,18 @@ import createMockApollo from 'helpers/mock_apollo_helper';
import waitForPromises from 'helpers/wait_for_promises';
import PipelineStatus, { i18n } from '~/pipeline_editor/components/header/pipeline_status.vue';
import getPipelineQuery from '~/pipeline_editor/graphql/queries/client/pipeline.graphql';
-import CiIcon from '~/vue_shared/components/ci_icon.vue';
+import PipelineEditorMiniGraph from '~/pipeline_editor/components/header/pipeline_editor_mini_graph.vue';
import { mockCommitSha, mockProjectPipeline, mockProjectFullPath } from '../../mock_data';
const localVue = createLocalVue();
localVue.use(VueApollo);
-const mockProvide = {
- projectFullPath: mockProjectFullPath,
-};
-
describe('Pipeline Status', () => {
let wrapper;
let mockApollo;
let mockPipelineQuery;
- const createComponentWithApollo = () => {
+ const createComponentWithApollo = (glFeatures = {}) => {
const handlers = [[getPipelineQuery, mockPipelineQuery]];
mockApollo = createMockApollo(handlers);
@@ -30,19 +26,23 @@ describe('Pipeline Status', () => {
propsData: {
commitSha: mockCommitSha,
},
- provide: mockProvide,
+ provide: {
+ glFeatures,
+ projectFullPath: mockProjectFullPath,
+ },
stubs: { GlLink, GlSprintf },
});
};
const findIcon = () => wrapper.findComponent(GlIcon);
- const findCiIcon = () => wrapper.findComponent(CiIcon);
const findLoadingIcon = () => wrapper.findComponent(GlLoadingIcon);
+ const findPipelineEditorMiniGraph = () => wrapper.findComponent(PipelineEditorMiniGraph);
const findPipelineId = () => wrapper.find('[data-testid="pipeline-id"]');
const findPipelineCommit = () => wrapper.find('[data-testid="pipeline-commit"]');
const findPipelineErrorMsg = () => wrapper.find('[data-testid="pipeline-error-msg"]');
const findPipelineLoadingMsg = () => wrapper.find('[data-testid="pipeline-loading-msg"]');
const findPipelineViewBtn = () => wrapper.find('[data-testid="pipeline-view-btn"]');
+ const findStatusIcon = () => wrapper.find('[data-testid="pipeline-status-icon"]');
beforeEach(() => {
mockPipelineQuery = jest.fn();
@@ -50,9 +50,7 @@ describe('Pipeline Status', () => {
afterEach(() => {
mockPipelineQuery.mockReset();
-
wrapper.destroy();
- wrapper = null;
});
describe('loading icon', () => {
@@ -73,13 +71,13 @@ describe('Pipeline Status', () => {
describe('when querying data', () => {
describe('when data is set', () => {
- beforeEach(async () => {
+ beforeEach(() => {
mockPipelineQuery.mockResolvedValue({
- data: { project: mockProjectPipeline },
+ data: { project: mockProjectPipeline() },
});
createComponentWithApollo();
- await waitForPromises();
+ waitForPromises();
});
it('query is called with correct variables', async () => {
@@ -91,20 +89,24 @@ describe('Pipeline Status', () => {
});
it('does not render error', () => {
- expect(findIcon().exists()).toBe(false);
+ expect(findPipelineErrorMsg().exists()).toBe(false);
});
it('renders pipeline data', () => {
const {
id,
detailedStatus: { detailsPath },
- } = mockProjectPipeline.pipeline;
+ } = mockProjectPipeline().pipeline;
- expect(findCiIcon().exists()).toBe(true);
+ expect(findStatusIcon().exists()).toBe(true);
expect(findPipelineId().text()).toBe(`#${id.match(/\d+/g)[0]}`);
expect(findPipelineCommit().text()).toBe(mockCommitSha);
expect(findPipelineViewBtn().attributes('href')).toBe(detailsPath);
});
+
+ it('does not render the pipeline mini graph', () => {
+ expect(findPipelineEditorMiniGraph().exists()).toBe(false);
+ });
});
describe('when data cannot be fetched', () => {
@@ -121,11 +123,26 @@ describe('Pipeline Status', () => {
});
it('does not render pipeline data', () => {
- expect(findCiIcon().exists()).toBe(false);
+ expect(findStatusIcon().exists()).toBe(false);
expect(findPipelineId().exists()).toBe(false);
expect(findPipelineCommit().exists()).toBe(false);
expect(findPipelineViewBtn().exists()).toBe(false);
});
});
});
+
+ describe('when feature flag for pipeline mini graph is enabled', () => {
+ beforeEach(() => {
+ mockPipelineQuery.mockResolvedValue({
+ data: { project: mockProjectPipeline() },
+ });
+
+ createComponentWithApollo({ pipelineEditorMiniGraph: true });
+ waitForPromises();
+ });
+
+ it('renders the pipeline mini graph', () => {
+ expect(findPipelineEditorMiniGraph().exists()).toBe(true);
+ });
+ });
});
diff --git a/spec/frontend/pipeline_editor/components/header/pipline_editor_mini_graph_spec.js b/spec/frontend/pipeline_editor/components/header/pipline_editor_mini_graph_spec.js
new file mode 100644
index 00000000000..3d7c3c839da
--- /dev/null
+++ b/spec/frontend/pipeline_editor/components/header/pipline_editor_mini_graph_spec.js
@@ -0,0 +1,42 @@
+import { shallowMount } from '@vue/test-utils';
+import PipelineEditorMiniGraph from '~/pipeline_editor/components/header/pipeline_editor_mini_graph.vue';
+import PipelineMiniGraph from '~/pipelines/components/pipelines_list/pipeline_mini_graph.vue';
+import { mockProjectPipeline } from '../../mock_data';
+
+describe('Pipeline Status', () => {
+ let wrapper;
+
+ const createComponent = ({ hasStages = true } = {}) => {
+ wrapper = shallowMount(PipelineEditorMiniGraph, {
+ propsData: {
+ pipeline: mockProjectPipeline({ hasStages }).pipeline,
+ },
+ });
+ };
+
+ const findPipelineMiniGraph = () => wrapper.findComponent(PipelineMiniGraph);
+
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ describe('when there are stages', () => {
+ beforeEach(() => {
+ createComponent();
+ });
+
+ it('renders pipeline mini graph', () => {
+ expect(findPipelineMiniGraph().exists()).toBe(true);
+ });
+ });
+
+ describe('when there are no stages', () => {
+ beforeEach(() => {
+ createComponent({ hasStages: false });
+ });
+
+ it('does not render pipeline mini graph', () => {
+ expect(findPipelineMiniGraph().exists()).toBe(false);
+ });
+ });
+});
diff --git a/spec/frontend/pipeline_editor/components/ui/pipeline_editor_empty_state_spec.js b/spec/frontend/pipeline_editor/components/ui/pipeline_editor_empty_state_spec.js
index b019bae886c..8e0a73b6e7c 100644
--- a/spec/frontend/pipeline_editor/components/ui/pipeline_editor_empty_state_spec.js
+++ b/spec/frontend/pipeline_editor/components/ui/pipeline_editor_empty_state_spec.js
@@ -6,9 +6,6 @@ import PipelineEditorEmptyState from '~/pipeline_editor/components/ui/pipeline_e
describe('Pipeline editor empty state', () => {
let wrapper;
const defaultProvide = {
- glFeatures: {
- pipelineEditorEmptyStateAction: false,
- },
emptyStateIllustrationPath: 'my/svg/path',
};
@@ -51,24 +48,6 @@ describe('Pipeline editor empty state', () => {
expect(findFileNav().exists()).toBe(true);
});
- describe('with feature flag off', () => {
- it('does not renders a CTA button', () => {
- expect(findConfirmButton().exists()).toBe(false);
- });
- });
- });
-
- describe('with feature flag on', () => {
- beforeEach(() => {
- createComponent({
- provide: {
- glFeatures: {
- pipelineEditorEmptyStateAction: true,
- },
- },
- });
- });
-
it('renders a CTA button', () => {
expect(findConfirmButton().exists()).toBe(true);
expect(findConfirmButton().text()).toBe(wrapper.vm.$options.i18n.btnText);
diff --git a/spec/frontend/pipeline_editor/mock_data.js b/spec/frontend/pipeline_editor/mock_data.js
index f2104f25324..0b0ff14486e 100644
--- a/spec/frontend/pipeline_editor/mock_data.js
+++ b/spec/frontend/pipeline_editor/mock_data.js
@@ -247,20 +247,47 @@ export const mockEmptySearchBranches = {
export const mockBranchPaginationLimit = 10;
export const mockTotalBranches = 20; // must be greater than mockBranchPaginationLimit to test pagination
-export const mockProjectPipeline = {
- pipeline: {
- commitPath: '/-/commit/aabbccdd',
- id: 'gid://gitlab/Ci::Pipeline/118',
- iid: '28',
- shortSha: mockCommitSha,
- status: 'SUCCESS',
- detailedStatus: {
- detailsPath: '/root/sample-ci-project/-/pipelines/118"',
- group: 'success',
- icon: 'status_success',
- text: 'passed',
+export const mockProjectPipeline = ({ hasStages = true } = {}) => {
+ const stages = hasStages
+ ? {
+ edges: [
+ {
+ node: {
+ id: 'gid://gitlab/Ci::Stage/605',
+ name: 'prepare',
+ status: 'success',
+ detailedStatus: {
+ detailsPath: '/root/sample-ci-project/-/pipelines/268#prepare',
+ group: 'success',
+ hasDetails: true,
+ icon: 'status_success',
+ id: 'success-605-605',
+ label: 'passed',
+ text: 'passed',
+ tooltip: 'passed',
+ },
+ },
+ },
+ ],
+ }
+ : null;
+
+ return {
+ pipeline: {
+ commitPath: '/-/commit/aabbccdd',
+ id: 'gid://gitlab/Ci::Pipeline/118',
+ iid: '28',
+ shortSha: mockCommitSha,
+ status: 'SUCCESS',
+ detailedStatus: {
+ detailsPath: '/root/sample-ci-project/-/pipelines/118',
+ group: 'success',
+ icon: 'status_success',
+ text: 'passed',
+ },
+ stages,
},
- },
+ };
};
export const mockLintResponse = {
diff --git a/spec/frontend/pipeline_editor/pipeline_editor_app_spec.js b/spec/frontend/pipeline_editor/pipeline_editor_app_spec.js
index 393cad0546b..b6713319e69 100644
--- a/spec/frontend/pipeline_editor/pipeline_editor_app_spec.js
+++ b/spec/frontend/pipeline_editor/pipeline_editor_app_spec.js
@@ -22,7 +22,6 @@ import {
mockCiConfigPath,
mockCiConfigQueryResponse,
mockBlobContentQueryResponse,
- mockBlobContentQueryResponseEmptyCiFile,
mockBlobContentQueryResponseNoCiFile,
mockCiYml,
mockCommitSha,
@@ -43,9 +42,6 @@ const MockSourceEditor = {
const mockProvide = {
ciConfigPath: mockCiConfigPath,
defaultBranch: mockDefaultBranch,
- glFeatures: {
- pipelineEditorEmptyStateAction: false,
- },
projectFullPath: mockProjectFullPath,
};
@@ -221,37 +217,12 @@ describe('Pipeline editor app component', () => {
});
});
- describe('with an empty CI config file', () => {
- describe('with empty state feature flag on', () => {
- it('does not show the empty screen state', async () => {
- mockBlobContentData.mockResolvedValue(mockBlobContentQueryResponseEmptyCiFile);
-
- await createComponentWithApollo({
- provide: {
- glFeatures: {
- pipelineEditorEmptyStateAction: true,
- },
- },
- });
-
- expect(findEmptyState().exists()).toBe(false);
- expect(findTextEditor().exists()).toBe(true);
- });
- });
- });
-
- describe('when landing on the empty state with feature flag on', () => {
- it('user can click on CTA button and see an empty editor', async () => {
+ describe('with no CI config setup', () => {
+ it('user can click on CTA button to get started', async () => {
mockBlobContentData.mockResolvedValue(mockBlobContentQueryResponseNoCiFile);
mockLatestCommitShaQuery.mockResolvedValue(mockEmptyCommitShaResults);
- await createComponentWithApollo({
- provide: {
- glFeatures: {
- pipelineEditorEmptyStateAction: true,
- },
- },
- });
+ await createComponentWithApollo();
expect(findEmptyState().exists()).toBe(true);
expect(findTextEditor().exists()).toBe(false);
diff --git a/spec/frontend/pipeline_editor/pipeline_editor_home_spec.js b/spec/frontend/pipeline_editor/pipeline_editor_home_spec.js
index 7aba336b8e8..335049892ec 100644
--- a/spec/frontend/pipeline_editor/pipeline_editor_home_spec.js
+++ b/spec/frontend/pipeline_editor/pipeline_editor_home_spec.js
@@ -25,7 +25,6 @@ describe('Pipeline editor home wrapper', () => {
},
provide: {
glFeatures: {
- pipelineEditorDrawer: true,
...glFeatures,
},
},
@@ -94,12 +93,4 @@ describe('Pipeline editor home wrapper', () => {
expect(findCommitSection().exists()).toBe(true);
});
});
-
- describe('Pipeline drawer', () => {
- it('hides the drawer when the feature flag is off', () => {
- createComponent({ glFeatures: { pipelineEditorDrawer: false } });
-
- expect(findPipelineEditorDrawer().exists()).toBe(false);
- });
- });
});
diff --git a/spec/frontend/pipelines/components/pipelines_list/pipeline_mini_graph_spec.js b/spec/frontend/pipelines/components/pipelines_list/pipeline_mini_graph_spec.js
index 154828aff4b..1cb43c199aa 100644
--- a/spec/frontend/pipelines/components/pipelines_list/pipeline_mini_graph_spec.js
+++ b/spec/frontend/pipelines/components/pipelines_list/pipeline_mini_graph_spec.js
@@ -1,8 +1,8 @@
import { shallowMount } from '@vue/test-utils';
+import { pipelines } from 'test_fixtures/pipelines/pipelines.json';
import PipelineMiniGraph from '~/pipelines/components/pipelines_list/pipeline_mini_graph.vue';
import PipelineStage from '~/pipelines/components/pipelines_list/pipeline_stage.vue';
-const { pipelines } = getJSONFixture('pipelines/pipelines.json');
const mockStages = pipelines[0].details.stages;
describe('Pipeline Mini Graph', () => {
diff --git a/spec/frontend/pipelines/components/pipelines_list/pipieline_stop_modal_spec.js b/spec/frontend/pipelines/components/pipelines_list/pipieline_stop_modal_spec.js
new file mode 100644
index 00000000000..249126390f1
--- /dev/null
+++ b/spec/frontend/pipelines/components/pipelines_list/pipieline_stop_modal_spec.js
@@ -0,0 +1,27 @@
+import { shallowMount } from '@vue/test-utils';
+import { GlSprintf } from '@gitlab/ui';
+import PipelineStopModal from '~/pipelines/components/pipelines_list/pipeline_stop_modal.vue';
+import { mockPipelineHeader } from '../../mock_data';
+
+describe('PipelineStopModal', () => {
+ let wrapper;
+
+ const createComponent = () => {
+ wrapper = shallowMount(PipelineStopModal, {
+ propsData: {
+ pipeline: mockPipelineHeader,
+ },
+ stubs: {
+ GlSprintf,
+ },
+ });
+ };
+
+ beforeEach(() => {
+ createComponent();
+ });
+
+ it('should render "stop pipeline" warning', () => {
+ expect(wrapper.text()).toMatch(`You’re about to stop pipeline #${mockPipelineHeader.id}.`);
+ });
+});
diff --git a/spec/frontend/pipelines/graph/job_item_spec.js b/spec/frontend/pipelines/graph/job_item_spec.js
index cbc5d11403e..06f1fa4c827 100644
--- a/spec/frontend/pipelines/graph/job_item_spec.js
+++ b/spec/frontend/pipelines/graph/job_item_spec.js
@@ -205,4 +205,64 @@ describe('pipeline graph job item', () => {
},
);
});
+
+ describe('job classes', () => {
+ it('job class is shown', () => {
+ createWrapper({
+ job: mockJob,
+ cssClassJobName: 'my-class',
+ });
+
+ expect(wrapper.find('a').classes()).toContain('my-class');
+
+ expect(wrapper.find('a').classes()).not.toContain(triggerActiveClass);
+ });
+
+ it('job class is shown, along with hover', () => {
+ createWrapper({
+ job: mockJob,
+ cssClassJobName: 'my-class',
+ sourceJobHovered: mockJob.name,
+ });
+
+ expect(wrapper.find('a').classes()).toContain('my-class');
+ expect(wrapper.find('a').classes()).toContain(triggerActiveClass);
+ });
+
+ it('multiple job classes are shown', () => {
+ createWrapper({
+ job: mockJob,
+ cssClassJobName: ['my-class-1', 'my-class-2'],
+ });
+
+ expect(wrapper.find('a').classes()).toContain('my-class-1');
+ expect(wrapper.find('a').classes()).toContain('my-class-2');
+
+ expect(wrapper.find('a').classes()).not.toContain(triggerActiveClass);
+ });
+
+ it('multiple job classes are shown conditionally', () => {
+ createWrapper({
+ job: mockJob,
+ cssClassJobName: { 'my-class-1': true, 'my-class-2': true },
+ });
+
+ expect(wrapper.find('a').classes()).toContain('my-class-1');
+ expect(wrapper.find('a').classes()).toContain('my-class-2');
+
+ expect(wrapper.find('a').classes()).not.toContain(triggerActiveClass);
+ });
+
+ it('multiple job classes are shown, along with a hover', () => {
+ createWrapper({
+ job: mockJob,
+ cssClassJobName: ['my-class-1', 'my-class-2'],
+ sourceJobHovered: mockJob.name,
+ });
+
+ expect(wrapper.find('a').classes()).toContain('my-class-1');
+ expect(wrapper.find('a').classes()).toContain('my-class-2');
+ expect(wrapper.find('a').classes()).toContain(triggerActiveClass);
+ });
+ });
});
diff --git a/spec/frontend/pipelines/pipeline_multi_actions_spec.js b/spec/frontend/pipelines/pipeline_multi_actions_spec.js
index a606595b37d..e24d2e51f08 100644
--- a/spec/frontend/pipelines/pipeline_multi_actions_spec.js
+++ b/spec/frontend/pipelines/pipeline_multi_actions_spec.js
@@ -95,7 +95,7 @@ describe('Pipeline Multi Actions Dropdown', () => {
createComponent({ mockData: { artifacts } });
expect(findFirstArtifactItem().attributes('href')).toBe(artifacts[0].path);
- expect(findFirstArtifactItem().text()).toBe(`Download ${artifacts[0].name} artifact`);
+ expect(findFirstArtifactItem().text()).toBe(artifacts[0].name);
});
it('should render empty message when no artifacts are found', () => {
diff --git a/spec/frontend/pipelines/pipelines_artifacts_spec.js b/spec/frontend/pipelines/pipelines_artifacts_spec.js
index 336255768d7..f33c66dedf3 100644
--- a/spec/frontend/pipelines/pipelines_artifacts_spec.js
+++ b/spec/frontend/pipelines/pipelines_artifacts_spec.js
@@ -87,8 +87,7 @@ describe('Pipelines Artifacts dropdown', () => {
createComponent({ mockData: { artifacts } });
expect(findFirstGlDropdownItem().attributes('href')).toBe(artifacts[0].path);
-
- expect(findFirstGlDropdownItem().text()).toBe(`Download ${artifacts[0].name} artifact`);
+ expect(findFirstGlDropdownItem().text()).toBe(artifacts[0].name);
});
describe('with a failing request', () => {
diff --git a/spec/frontend/pipelines/pipelines_spec.js b/spec/frontend/pipelines/pipelines_spec.js
index aa30062c987..2875498bb52 100644
--- a/spec/frontend/pipelines/pipelines_spec.js
+++ b/spec/frontend/pipelines/pipelines_spec.js
@@ -4,6 +4,7 @@ import { mount } from '@vue/test-utils';
import MockAdapter from 'axios-mock-adapter';
import { chunk } from 'lodash';
import { nextTick } from 'vue';
+import mockPipelinesResponse from 'test_fixtures/pipelines/pipelines.json';
import setWindowLocation from 'helpers/set_window_location_helper';
import { TEST_HOST } from 'helpers/test_constants';
import { extendedWrapper } from 'helpers/vue_test_utils_helper';
@@ -33,7 +34,6 @@ jest.mock('~/experimentation/utils', () => ({
const mockProjectPath = 'twitter/flight';
const mockProjectId = '21';
const mockPipelinesEndpoint = `/${mockProjectPath}/pipelines.json`;
-const mockPipelinesResponse = getJSONFixture('pipelines/pipelines.json');
const mockPipelinesIds = mockPipelinesResponse.pipelines.map(({ id }) => id);
const mockPipelineWithStages = mockPipelinesResponse.pipelines.find(
(p) => p.details.stages && p.details.stages.length,
diff --git a/spec/frontend/pipelines/pipelines_table_spec.js b/spec/frontend/pipelines/pipelines_table_spec.js
index 4472a5ae70d..fb019b463b1 100644
--- a/spec/frontend/pipelines/pipelines_table_spec.js
+++ b/spec/frontend/pipelines/pipelines_table_spec.js
@@ -1,6 +1,7 @@
import '~/commons';
import { GlTable } from '@gitlab/ui';
import { mount } from '@vue/test-utils';
+import fixture from 'test_fixtures/pipelines/pipelines.json';
import { extendedWrapper } from 'helpers/vue_test_utils_helper';
import PipelineMiniGraph from '~/pipelines/components/pipelines_list/pipeline_mini_graph.vue';
import PipelineOperations from '~/pipelines/components/pipelines_list/pipeline_operations.vue';
@@ -20,8 +21,6 @@ describe('Pipelines Table', () => {
let pipeline;
let wrapper;
- const jsonFixtureName = 'pipelines/pipelines.json';
-
const defaultProps = {
pipelines: [],
viewType: 'root',
@@ -29,7 +28,8 @@ describe('Pipelines Table', () => {
};
const createMockPipeline = () => {
- const { pipelines } = getJSONFixture(jsonFixtureName);
+ // Clone fixture as it could be modified by tests
+ const { pipelines } = JSON.parse(JSON.stringify(fixture));
return pipelines.find((p) => p.user !== null && p.commit !== null);
};
diff --git a/spec/frontend/pipelines/test_reports/stores/actions_spec.js b/spec/frontend/pipelines/test_reports/stores/actions_spec.js
index e931ddb8496..84a9f4776b9 100644
--- a/spec/frontend/pipelines/test_reports/stores/actions_spec.js
+++ b/spec/frontend/pipelines/test_reports/stores/actions_spec.js
@@ -1,5 +1,5 @@
import MockAdapter from 'axios-mock-adapter';
-import { getJSONFixture } from 'helpers/fixtures';
+import testReports from 'test_fixtures/pipelines/test_report.json';
import { TEST_HOST } from 'helpers/test_constants';
import testAction from 'helpers/vuex_action_helper';
import createFlash from '~/flash';
@@ -13,7 +13,6 @@ describe('Actions TestReports Store', () => {
let mock;
let state;
- const testReports = getJSONFixture('pipelines/test_report.json');
const summary = { total_count: 1 };
const suiteEndpoint = `${TEST_HOST}/tests/suite.json`;
diff --git a/spec/frontend/pipelines/test_reports/stores/getters_spec.js b/spec/frontend/pipelines/test_reports/stores/getters_spec.js
index f8298fdaba5..70e3a01dbf1 100644
--- a/spec/frontend/pipelines/test_reports/stores/getters_spec.js
+++ b/spec/frontend/pipelines/test_reports/stores/getters_spec.js
@@ -1,4 +1,4 @@
-import { getJSONFixture } from 'helpers/fixtures';
+import testReports from 'test_fixtures/pipelines/test_report.json';
import * as getters from '~/pipelines/stores/test_reports/getters';
import {
iconForTestStatus,
@@ -9,8 +9,6 @@ import {
describe('Getters TestReports Store', () => {
let state;
- const testReports = getJSONFixture('pipelines/test_report.json');
-
const defaultState = {
blobPath: '/test/blob/path',
testReports,
diff --git a/spec/frontend/pipelines/test_reports/stores/mutations_spec.js b/spec/frontend/pipelines/test_reports/stores/mutations_spec.js
index 191e9e7391c..f2dbeec6a06 100644
--- a/spec/frontend/pipelines/test_reports/stores/mutations_spec.js
+++ b/spec/frontend/pipelines/test_reports/stores/mutations_spec.js
@@ -1,12 +1,10 @@
-import { getJSONFixture } from 'helpers/fixtures';
+import testReports from 'test_fixtures/pipelines/test_report.json';
import * as types from '~/pipelines/stores/test_reports/mutation_types';
import mutations from '~/pipelines/stores/test_reports/mutations';
describe('Mutations TestReports Store', () => {
let mockState;
- const testReports = getJSONFixture('pipelines/test_report.json');
-
const defaultState = {
endpoint: '',
testReports: {},
diff --git a/spec/frontend/pipelines/test_reports/test_reports_spec.js b/spec/frontend/pipelines/test_reports/test_reports_spec.js
index e44d59ba888..384b7cf6930 100644
--- a/spec/frontend/pipelines/test_reports/test_reports_spec.js
+++ b/spec/frontend/pipelines/test_reports/test_reports_spec.js
@@ -1,7 +1,7 @@
import { GlLoadingIcon } from '@gitlab/ui';
import { shallowMount, createLocalVue } from '@vue/test-utils';
import Vuex from 'vuex';
-import { getJSONFixture } from 'helpers/fixtures';
+import testReports from 'test_fixtures/pipelines/test_report.json';
import { extendedWrapper } from 'helpers/vue_test_utils_helper';
import EmptyState from '~/pipelines/components/test_reports/empty_state.vue';
import TestReports from '~/pipelines/components/test_reports/test_reports.vue';
@@ -16,8 +16,6 @@ describe('Test reports app', () => {
let wrapper;
let store;
- const testReports = getJSONFixture('pipelines/test_report.json');
-
const loadingSpinner = () => wrapper.findComponent(GlLoadingIcon);
const testsDetail = () => wrapper.findByTestId('tests-detail');
const emptyState = () => wrapper.findComponent(EmptyState);
diff --git a/spec/frontend/pipelines/test_reports/test_suite_table_spec.js b/spec/frontend/pipelines/test_reports/test_suite_table_spec.js
index a87145cc557..793bad6b82a 100644
--- a/spec/frontend/pipelines/test_reports/test_suite_table_spec.js
+++ b/spec/frontend/pipelines/test_reports/test_suite_table_spec.js
@@ -1,7 +1,7 @@
import { GlButton, GlFriendlyWrap, GlLink, GlPagination } from '@gitlab/ui';
import { shallowMount, createLocalVue } from '@vue/test-utils';
import Vuex from 'vuex';
-import { getJSONFixture } from 'helpers/fixtures';
+import testReports from 'test_fixtures/pipelines/test_report.json';
import SuiteTable from '~/pipelines/components/test_reports/test_suite_table.vue';
import { TestStatus } from '~/pipelines/constants';
import * as getters from '~/pipelines/stores/test_reports/getters';
@@ -17,7 +17,7 @@ describe('Test reports suite table', () => {
const {
test_suites: [testSuite],
- } = getJSONFixture('pipelines/test_report.json');
+ } = testReports;
testSuite.test_cases = [...testSuite.test_cases, ...skippedTestCases];
const testCases = testSuite.test_cases;
diff --git a/spec/frontend/pipelines/test_reports/test_summary_spec.js b/spec/frontend/pipelines/test_reports/test_summary_spec.js
index df404d87c99..7eed6671fb9 100644
--- a/spec/frontend/pipelines/test_reports/test_summary_spec.js
+++ b/spec/frontend/pipelines/test_reports/test_summary_spec.js
@@ -1,5 +1,5 @@
import { mount } from '@vue/test-utils';
-import { getJSONFixture } from 'helpers/fixtures';
+import testReports from 'test_fixtures/pipelines/test_report.json';
import Summary from '~/pipelines/components/test_reports/test_summary.vue';
import { formattedTime } from '~/pipelines/stores/test_reports/utils';
@@ -8,7 +8,7 @@ describe('Test reports summary', () => {
const {
test_suites: [testSuite],
- } = getJSONFixture('pipelines/test_report.json');
+ } = testReports;
const backButton = () => wrapper.find('.js-back-button');
const totalTests = () => wrapper.find('.js-total-tests');
diff --git a/spec/frontend/pipelines/test_reports/test_summary_table_spec.js b/spec/frontend/pipelines/test_reports/test_summary_table_spec.js
index 892a3742fea..0813739d72f 100644
--- a/spec/frontend/pipelines/test_reports/test_summary_table_spec.js
+++ b/spec/frontend/pipelines/test_reports/test_summary_table_spec.js
@@ -1,6 +1,6 @@
import { mount, createLocalVue } from '@vue/test-utils';
import Vuex from 'vuex';
-import { getJSONFixture } from 'helpers/fixtures';
+import testReports from 'test_fixtures/pipelines/test_report.json';
import SummaryTable from '~/pipelines/components/test_reports/test_summary_table.vue';
import * as getters from '~/pipelines/stores/test_reports/getters';
@@ -11,8 +11,6 @@ describe('Test reports summary table', () => {
let wrapper;
let store;
- const testReports = getJSONFixture('pipelines/test_report.json');
-
const allSuitesRows = () => wrapper.findAll('.js-suite-row');
const noSuitesToShow = () => wrapper.find('.js-no-tests-suites');
diff --git a/spec/frontend/projects/new/components/app_spec.js b/spec/frontend/projects/new/components/app_spec.js
new file mode 100644
index 00000000000..f6edbab3cca
--- /dev/null
+++ b/spec/frontend/projects/new/components/app_spec.js
@@ -0,0 +1,44 @@
+import { shallowMount } from '@vue/test-utils';
+import App from '~/projects/new/components/app.vue';
+import NewNamespacePage from '~/vue_shared/new_namespace/new_namespace_page.vue';
+
+describe('Experimental new project creation app', () => {
+ let wrapper;
+
+ const createComponent = (propsData) => {
+ wrapper = shallowMount(App, { propsData });
+ };
+
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ it('passes custom new project guideline text to underlying component', () => {
+ const DEMO_GUIDELINES = 'Demo guidelines';
+ const guidelineSelector = '#new-project-guideline';
+ createComponent({
+ newProjectGuidelines: DEMO_GUIDELINES,
+ });
+
+ expect(wrapper.find(guidelineSelector).text()).toBe(DEMO_GUIDELINES);
+ });
+
+ it.each`
+ isCiCdAvailable | outcome
+ ${false} | ${'do not show CI/CD panel'}
+ ${true} | ${'show CI/CD panel'}
+ `('$outcome when isCiCdAvailable is $isCiCdAvailable', ({ isCiCdAvailable }) => {
+ createComponent({
+ isCiCdAvailable,
+ });
+
+ expect(
+ Boolean(
+ wrapper
+ .findComponent(NewNamespacePage)
+ .props()
+ .panels.find((p) => p.name === 'cicd_for_external_repo'),
+ ),
+ ).toBe(isCiCdAvailable);
+ });
+});
diff --git a/spec/frontend/projects/new/components/new_project_push_tip_popover_spec.js b/spec/frontend/projects/new/components/new_project_push_tip_popover_spec.js
new file mode 100644
index 00000000000..31ddbc80ae4
--- /dev/null
+++ b/spec/frontend/projects/new/components/new_project_push_tip_popover_spec.js
@@ -0,0 +1,75 @@
+import { GlPopover, GlFormInputGroup } from '@gitlab/ui';
+import { shallowMount } from '@vue/test-utils';
+import NewProjectPushTipPopover from '~/projects/new/components/new_project_push_tip_popover.vue';
+import ClipboardButton from '~/vue_shared/components/clipboard_button.vue';
+
+describe('New project push tip popover', () => {
+ let wrapper;
+ const targetId = 'target';
+ const pushToCreateProjectCommand = 'command';
+ const workingWithProjectsHelpPath = 'path';
+
+ const findPopover = () => wrapper.findComponent(GlPopover);
+ const findClipboardButton = () => wrapper.findComponent(ClipboardButton);
+ const findFormInput = () => wrapper.findComponent(GlFormInputGroup);
+ const findHelpLink = () => wrapper.find('a');
+ const findTarget = () => document.getElementById(targetId);
+
+ const buildWrapper = () => {
+ wrapper = shallowMount(NewProjectPushTipPopover, {
+ propsData: {
+ target: findTarget(),
+ },
+ stubs: {
+ GlFormInputGroup,
+ },
+ provide: {
+ pushToCreateProjectCommand,
+ workingWithProjectsHelpPath,
+ },
+ });
+ };
+
+ beforeEach(() => {
+ setFixtures(`<a id="${targetId}"></a>`);
+ buildWrapper();
+ });
+
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ it('renders popover that targets the specified target', () => {
+ expect(findPopover().props()).toMatchObject({
+ target: findTarget(),
+ triggers: 'click blur',
+ placement: 'top',
+ title: 'Push to create a project',
+ });
+ });
+
+ it('renders a readonly form input with the push to create command', () => {
+ expect(findFormInput().props()).toMatchObject({
+ value: pushToCreateProjectCommand,
+ selectOnClick: true,
+ });
+ expect(findFormInput().attributes()).toMatchObject({
+ 'aria-label': 'Push project from command line',
+ readonly: 'readonly',
+ });
+ });
+
+ it('allows copying the push command using the clipboard button', () => {
+ expect(findClipboardButton().props()).toMatchObject({
+ text: pushToCreateProjectCommand,
+ tooltipPlacement: 'right',
+ title: 'Copy command',
+ });
+ });
+
+ it('displays a link to open the push command help page reference', () => {
+ expect(findHelpLink().attributes().href).toBe(
+ `${workingWithProjectsHelpPath}#push-to-create-a-new-project`,
+ );
+ });
+});
diff --git a/spec/frontend/projects/new/components/new_project_url_select_spec.js b/spec/frontend/projects/new/components/new_project_url_select_spec.js
new file mode 100644
index 00000000000..aa16b71172b
--- /dev/null
+++ b/spec/frontend/projects/new/components/new_project_url_select_spec.js
@@ -0,0 +1,235 @@
+import {
+ GlButton,
+ GlDropdown,
+ GlDropdownItem,
+ GlDropdownSectionHeader,
+ GlSearchBoxByType,
+} from '@gitlab/ui';
+import { createLocalVue, mount, shallowMount } from '@vue/test-utils';
+import VueApollo from 'vue-apollo';
+import createMockApollo from 'helpers/mock_apollo_helper';
+import { mockTracking, unmockTracking } from 'helpers/tracking_helper';
+import { getIdFromGraphQLId } from '~/graphql_shared/utils';
+import eventHub from '~/projects/new/event_hub';
+import NewProjectUrlSelect from '~/projects/new/components/new_project_url_select.vue';
+import searchQuery from '~/projects/new/queries/search_namespaces_where_user_can_create_projects.query.graphql';
+
+describe('NewProjectUrlSelect component', () => {
+ let wrapper;
+
+ const data = {
+ currentUser: {
+ groups: {
+ nodes: [
+ {
+ id: 'gid://gitlab/Group/26',
+ fullPath: 'flightjs',
+ },
+ {
+ id: 'gid://gitlab/Group/28',
+ fullPath: 'h5bp',
+ },
+ {
+ id: 'gid://gitlab/Group/30',
+ fullPath: 'h5bp/subgroup',
+ },
+ ],
+ },
+ namespace: {
+ id: 'gid://gitlab/Namespace/1',
+ fullPath: 'root',
+ },
+ },
+ };
+
+ const localVue = createLocalVue();
+ localVue.use(VueApollo);
+
+ const defaultProvide = {
+ namespaceFullPath: 'h5bp',
+ namespaceId: '28',
+ rootUrl: 'https://gitlab.com/',
+ trackLabel: 'blank_project',
+ userNamespaceFullPath: 'root',
+ userNamespaceId: '1',
+ };
+
+ const mountComponent = ({
+ search = '',
+ queryResponse = data,
+ provide = defaultProvide,
+ mountFn = shallowMount,
+ } = {}) => {
+ const requestHandlers = [[searchQuery, jest.fn().mockResolvedValue({ data: queryResponse })]];
+ const apolloProvider = createMockApollo(requestHandlers);
+
+ return mountFn(NewProjectUrlSelect, {
+ localVue,
+ apolloProvider,
+ provide,
+ data() {
+ return {
+ search,
+ };
+ },
+ });
+ };
+
+ const findButtonLabel = () => wrapper.findComponent(GlButton);
+ const findDropdown = () => wrapper.findComponent(GlDropdown);
+ const findInput = () => wrapper.findComponent(GlSearchBoxByType);
+ const findHiddenInput = () => wrapper.find('input');
+
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ it('renders the root url as a label', () => {
+ wrapper = mountComponent();
+
+ expect(findButtonLabel().text()).toBe(defaultProvide.rootUrl);
+ expect(findButtonLabel().props('label')).toBe(true);
+ });
+
+ describe('when namespaceId is provided', () => {
+ beforeEach(() => {
+ wrapper = mountComponent();
+ });
+
+ it('renders a dropdown with the given namespace full path as the text', () => {
+ expect(findDropdown().props('text')).toBe(defaultProvide.namespaceFullPath);
+ });
+
+ it('renders a dropdown with the given namespace id in the hidden input', () => {
+ expect(findHiddenInput().attributes('value')).toBe(defaultProvide.namespaceId);
+ });
+ });
+
+ describe('when namespaceId is not provided', () => {
+ const provide = {
+ ...defaultProvide,
+ namespaceFullPath: undefined,
+ namespaceId: undefined,
+ };
+
+ beforeEach(() => {
+ wrapper = mountComponent({ provide });
+ });
+
+ it("renders a dropdown with the user's namespace full path as the text", () => {
+ expect(findDropdown().props('text')).toBe(defaultProvide.userNamespaceFullPath);
+ });
+
+ it("renders a dropdown with the user's namespace id in the hidden input", () => {
+ expect(findHiddenInput().attributes('value')).toBe(defaultProvide.userNamespaceId);
+ });
+ });
+
+ it('focuses on the input when the dropdown is opened', async () => {
+ wrapper = mountComponent({ mountFn: mount });
+
+ jest.runOnlyPendingTimers();
+ await wrapper.vm.$nextTick();
+
+ const spy = jest.spyOn(findInput().vm, 'focusInput');
+
+ findDropdown().vm.$emit('shown');
+
+ expect(spy).toHaveBeenCalledTimes(1);
+ });
+
+ it('renders expected dropdown items', async () => {
+ wrapper = mountComponent({ mountFn: mount });
+
+ jest.runOnlyPendingTimers();
+ await wrapper.vm.$nextTick();
+
+ const listItems = wrapper.findAll('li');
+
+ expect(listItems).toHaveLength(6);
+ expect(listItems.at(0).findComponent(GlDropdownSectionHeader).text()).toBe('Groups');
+ expect(listItems.at(1).text()).toBe(data.currentUser.groups.nodes[0].fullPath);
+ expect(listItems.at(2).text()).toBe(data.currentUser.groups.nodes[1].fullPath);
+ expect(listItems.at(3).text()).toBe(data.currentUser.groups.nodes[2].fullPath);
+ expect(listItems.at(4).findComponent(GlDropdownSectionHeader).text()).toBe('Users');
+ expect(listItems.at(5).text()).toBe(data.currentUser.namespace.fullPath);
+ });
+
+ describe('when selecting from a group template', () => {
+ const groupId = getIdFromGraphQLId(data.currentUser.groups.nodes[1].id);
+
+ beforeEach(async () => {
+ wrapper = mountComponent({ mountFn: mount });
+
+ jest.runOnlyPendingTimers();
+ await wrapper.vm.$nextTick();
+
+ eventHub.$emit('select-template', groupId);
+ });
+
+ it('filters the dropdown items to the selected group and children', async () => {
+ const listItems = wrapper.findAll('li');
+
+ expect(listItems).toHaveLength(3);
+ expect(listItems.at(0).findComponent(GlDropdownSectionHeader).text()).toBe('Groups');
+ expect(listItems.at(1).text()).toBe(data.currentUser.groups.nodes[1].fullPath);
+ expect(listItems.at(2).text()).toBe(data.currentUser.groups.nodes[2].fullPath);
+ });
+
+ it('sets the selection to the group', async () => {
+ expect(findDropdown().props('text')).toBe(data.currentUser.groups.nodes[1].fullPath);
+ });
+ });
+
+ it('renders `No matches found` when there are no matching dropdown items', async () => {
+ const queryResponse = {
+ currentUser: {
+ groups: {
+ nodes: [],
+ },
+ namespace: {
+ id: 'gid://gitlab/Namespace/1',
+ fullPath: 'root',
+ },
+ },
+ };
+
+ wrapper = mountComponent({ search: 'no matches', queryResponse, mountFn: mount });
+
+ jest.runOnlyPendingTimers();
+ await wrapper.vm.$nextTick();
+
+ expect(wrapper.find('li').text()).toBe('No matches found');
+ });
+
+ it('updates hidden input with selected namespace', async () => {
+ wrapper = mountComponent();
+
+ jest.runOnlyPendingTimers();
+ await wrapper.vm.$nextTick();
+
+ wrapper.findComponent(GlDropdownItem).vm.$emit('click');
+
+ await wrapper.vm.$nextTick();
+
+ expect(findHiddenInput().attributes()).toMatchObject({
+ name: 'project[namespace_id]',
+ value: getIdFromGraphQLId(data.currentUser.groups.nodes[0].id).toString(),
+ });
+ });
+
+ it('tracks clicking on the dropdown', () => {
+ wrapper = mountComponent();
+
+ const trackingSpy = mockTracking(undefined, wrapper.element, jest.spyOn);
+
+ findDropdown().vm.$emit('show');
+
+ expect(trackingSpy).toHaveBeenCalledWith(undefined, 'activate_form_input', {
+ label: defaultProvide.trackLabel,
+ property: 'project_path',
+ });
+
+ unmockTracking();
+ });
+});
diff --git a/spec/frontend/projects/projects_filterable_list_spec.js b/spec/frontend/projects/projects_filterable_list_spec.js
index 377d347623a..d4dbf85b5ca 100644
--- a/spec/frontend/projects/projects_filterable_list_spec.js
+++ b/spec/frontend/projects/projects_filterable_list_spec.js
@@ -1,3 +1,4 @@
+// eslint-disable-next-line import/no-deprecated
import { getJSONFixture, setHTMLFixture } from 'helpers/fixtures';
import ProjectsFilterableList from '~/projects/projects_filterable_list';
@@ -14,6 +15,7 @@ describe('ProjectsFilterableList', () => {
</div>
<div class="js-projects-list-holder"></div>
`);
+ // eslint-disable-next-line import/no-deprecated
getJSONFixture('static/projects.json');
form = document.querySelector('form#project-filter-form');
filter = document.querySelector('.js-projects-list-filter');
diff --git a/spec/frontend/projects/settings/components/new_access_dropdown_spec.js b/spec/frontend/projects/settings/components/new_access_dropdown_spec.js
new file mode 100644
index 00000000000..a42891423cd
--- /dev/null
+++ b/spec/frontend/projects/settings/components/new_access_dropdown_spec.js
@@ -0,0 +1,345 @@
+import {
+ GlSprintf,
+ GlDropdown,
+ GlDropdownItem,
+ GlDropdownSectionHeader,
+ GlSearchBoxByType,
+} from '@gitlab/ui';
+import { nextTick } from 'vue';
+import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
+import waitForPromises from 'helpers/wait_for_promises';
+import { getUsers, getGroups, getDeployKeys } from '~/projects/settings/api/access_dropdown_api';
+import AccessDropdown, { i18n } from '~/projects/settings/components/access_dropdown.vue';
+import { ACCESS_LEVELS, LEVEL_TYPES } from '~/projects/settings/constants';
+
+jest.mock('~/projects/settings/api/access_dropdown_api', () => ({
+ getGroups: jest.fn().mockResolvedValue({
+ data: [
+ { id: 4, name: 'group4' },
+ { id: 5, name: 'group5' },
+ { id: 6, name: 'group6' },
+ ],
+ }),
+ getUsers: jest.fn().mockResolvedValue({
+ data: [
+ { id: 7, name: 'user7' },
+ { id: 8, name: 'user8' },
+ { id: 9, name: 'user9' },
+ ],
+ }),
+ getDeployKeys: jest.fn().mockResolvedValue({
+ data: [
+ { id: 10, title: 'key10', fingerprint: 'abcdefghijklmnop', owner: { name: 'user1' } },
+ { id: 11, title: 'key11', fingerprint: 'abcdefghijklmnop', owner: { name: 'user2' } },
+ { id: 12, title: 'key12', fingerprint: 'abcdefghijklmnop', owner: { name: 'user3' } },
+ ],
+ }),
+}));
+
+describe('Access Level Dropdown', () => {
+ let wrapper;
+ const mockAccessLevelsData = [
+ {
+ id: 1,
+ text: 'role1',
+ },
+ {
+ id: 2,
+ text: 'role2',
+ },
+ {
+ id: 3,
+ text: 'role3',
+ },
+ ];
+
+ const createComponent = ({
+ accessLevelsData = mockAccessLevelsData,
+ accessLevel = ACCESS_LEVELS.PUSH,
+ hasLicense,
+ label,
+ disabled,
+ preselectedItems,
+ } = {}) => {
+ wrapper = shallowMountExtended(AccessDropdown, {
+ propsData: {
+ accessLevelsData,
+ accessLevel,
+ hasLicense,
+ label,
+ disabled,
+ preselectedItems,
+ },
+ stubs: {
+ GlSprintf,
+ GlDropdown,
+ },
+ });
+ };
+
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ const findDropdown = () => wrapper.findComponent(GlDropdown);
+ const findDropdownToggleLabel = () => findDropdown().props('text');
+ const findAllDropdownItems = () => findDropdown().findAllComponents(GlDropdownItem);
+ const findAllDropdownHeaders = () => findDropdown().findAllComponents(GlDropdownSectionHeader);
+ const findSearchBox = () => wrapper.findComponent(GlSearchBoxByType);
+
+ const findDropdownItemWithText = (items, text) =>
+ items.filter((item) => item.text().includes(text)).at(0);
+
+ describe('data request', () => {
+ it('should make an api call for users, groups && deployKeys when user has a license', () => {
+ createComponent();
+ expect(getUsers).toHaveBeenCalled();
+ expect(getGroups).toHaveBeenCalled();
+ expect(getDeployKeys).toHaveBeenCalled();
+ });
+
+ it('should make an api call for deployKeys but not for users or groups when user does not have a license', () => {
+ createComponent({ hasLicense: false });
+ expect(getUsers).not.toHaveBeenCalled();
+ expect(getGroups).not.toHaveBeenCalled();
+ expect(getDeployKeys).toHaveBeenCalled();
+ });
+
+ it('should make api calls when search query is updated', async () => {
+ createComponent();
+ const query = 'root';
+
+ findSearchBox().vm.$emit('input', query);
+ await nextTick();
+ expect(getUsers).toHaveBeenCalledWith(query);
+ expect(getGroups).toHaveBeenCalled();
+ expect(getDeployKeys).toHaveBeenCalledWith(query);
+ });
+ });
+
+ describe('layout', () => {
+ beforeEach(async () => {
+ createComponent();
+ await waitForPromises();
+ });
+
+ it('renders headers for each section ', () => {
+ expect(findAllDropdownHeaders()).toHaveLength(4);
+ });
+
+ it('renders dropdown item for each access level type', () => {
+ expect(findAllDropdownItems()).toHaveLength(12);
+ });
+ });
+
+ describe('toggleLabel', () => {
+ let dropdownItems = [];
+ beforeEach(async () => {
+ createComponent();
+ await waitForPromises();
+ dropdownItems = findAllDropdownItems();
+ });
+
+ const findItemByNameAndClick = async (name) => {
+ findDropdownItemWithText(dropdownItems, name).trigger('click');
+ await nextTick();
+ };
+
+ it('when no items selected and custom label provided, displays it and has default CSS class', () => {
+ wrapper.destroy();
+ const customLabel = 'Set the access level';
+ createComponent({ label: customLabel });
+ expect(findDropdownToggleLabel()).toBe(customLabel);
+ expect(findDropdown().props('toggleClass')).toBe('gl-text-gray-500!');
+ });
+
+ it('when no items selected, displays a default fallback label and has default CSS class ', () => {
+ expect(findDropdownToggleLabel()).toBe(i18n.selectUsers);
+ expect(findDropdown().props('toggleClass')).toBe('gl-text-gray-500!');
+ });
+
+ it('displays a number of selected items for each group level', async () => {
+ dropdownItems.wrappers.forEach((item) => {
+ item.trigger('click');
+ });
+ await nextTick();
+ expect(findDropdownToggleLabel()).toBe('3 roles, 3 users, 3 deploy keys, 3 groups');
+ });
+
+ it('with only role selected displays the role name and has no class applied', async () => {
+ await findItemByNameAndClick('role1');
+ expect(findDropdownToggleLabel()).toBe('role1');
+ expect(findDropdown().props('toggleClass')).toBe('');
+ });
+
+ it('with only groups selected displays the number of selected groups', async () => {
+ await findItemByNameAndClick('group4');
+ await findItemByNameAndClick('group5');
+ await findItemByNameAndClick('group6');
+ expect(findDropdownToggleLabel()).toBe('3 groups');
+ expect(findDropdown().props('toggleClass')).toBe('');
+ });
+
+ it('with only users selected displays the number of selected users', async () => {
+ await findItemByNameAndClick('user7');
+ await findItemByNameAndClick('user8');
+ expect(findDropdownToggleLabel()).toBe('2 users');
+ expect(findDropdown().props('toggleClass')).toBe('');
+ });
+
+ it('with users and groups selected displays the number of selected users & groups', async () => {
+ await findItemByNameAndClick('group4');
+ await findItemByNameAndClick('group6');
+ await findItemByNameAndClick('user7');
+ await findItemByNameAndClick('user9');
+ expect(findDropdownToggleLabel()).toBe('2 users, 2 groups');
+ expect(findDropdown().props('toggleClass')).toBe('');
+ });
+
+ it('with users and deploy keys selected displays the number of selected users & keys', async () => {
+ await findItemByNameAndClick('user8');
+ await findItemByNameAndClick('key10');
+ await findItemByNameAndClick('key11');
+ expect(findDropdownToggleLabel()).toBe('1 user, 2 deploy keys');
+ expect(findDropdown().props('toggleClass')).toBe('');
+ });
+ });
+
+ describe('selecting an item', () => {
+ it('selects the item on click and deselects on the next click ', async () => {
+ createComponent();
+ await waitForPromises();
+
+ const item = findAllDropdownItems().at(1);
+ item.trigger('click');
+ await nextTick();
+ expect(item.props('isChecked')).toBe(true);
+ item.trigger('click');
+ await nextTick();
+ expect(item.props('isChecked')).toBe(false);
+ });
+
+ it('emits a formatted update on selection ', async () => {
+ // ids: the items appear in that order in the dropdown
+ // 1 2 3 - roles
+ // 4 5 6 - groups
+ // 7 8 9 - users
+ // 10 11 12 - deploy_keys
+ // we set 2 from each group as preselected. Then for the sake of the test deselect one, leave one as-is
+ // and select a new one from the group.
+ // Preselected items should have `id` along with `user_id/group_id/access_level/deplo_key_id`.
+ // Items to be removed from previous selection will have `_deploy` flag set to true
+ // Newly selected items will have only `user_id/group_id/access_level/deploy_key_id` (depending on their type);
+ const preselectedItems = [
+ { id: 112, type: 'role', access_level: 2 },
+ { id: 113, type: 'role', access_level: 3 },
+ { id: 115, type: 'group', group_id: 5 },
+ { id: 116, type: 'group', group_id: 6 },
+ { id: 118, type: 'user', user_id: 8, name: 'user8' },
+ { id: 119, type: 'user', user_id: 9, name: 'user9' },
+ { id: 121, type: 'deploy_key', deploy_key_id: 11 },
+ { id: 122, type: 'deploy_key', deploy_key_id: 12 },
+ ];
+
+ createComponent({ preselectedItems });
+ await waitForPromises();
+ const spy = jest.spyOn(wrapper.vm, '$emit');
+ const dropdownItems = findAllDropdownItems();
+ // select new item from each group
+ findDropdownItemWithText(dropdownItems, 'role1').trigger('click');
+ findDropdownItemWithText(dropdownItems, 'group4').trigger('click');
+ findDropdownItemWithText(dropdownItems, 'user7').trigger('click');
+ findDropdownItemWithText(dropdownItems, 'key10').trigger('click');
+ // deselect one item from each group
+ findDropdownItemWithText(dropdownItems, 'role2').trigger('click');
+ findDropdownItemWithText(dropdownItems, 'group5').trigger('click');
+ findDropdownItemWithText(dropdownItems, 'user8').trigger('click');
+ findDropdownItemWithText(dropdownItems, 'key11').trigger('click');
+
+ expect(spy).toHaveBeenLastCalledWith('select', [
+ { access_level: 1 },
+ { id: 112, access_level: 2, _destroy: true },
+ { id: 113, access_level: 3 },
+ { group_id: 4 },
+ { id: 115, group_id: 5, _destroy: true },
+ { id: 116, group_id: 6 },
+ { user_id: 7 },
+ { id: 118, user_id: 8, _destroy: true },
+ { id: 119, user_id: 9 },
+ { deploy_key_id: 10 },
+ { id: 121, deploy_key_id: 11, _destroy: true },
+ { id: 122, deploy_key_id: 12 },
+ ]);
+ });
+ });
+
+ describe('Handling preselected items', () => {
+ const preselectedItems = [
+ { id: 112, type: 'role', access_level: 2 },
+ { id: 115, type: 'group', group_id: 5 },
+ { id: 118, type: 'user', user_id: 8, name: 'user2' },
+ { id: 121, type: 'deploy_key', deploy_key_id: 11 },
+ ];
+
+ const findSelected = (type) =>
+ wrapper.findAllByTestId(`${type}-dropdown-item`).filter((w) => w.props('isChecked'));
+
+ beforeEach(async () => {
+ createComponent({ preselectedItems });
+ await waitForPromises();
+ });
+
+ it('should set selected roles as intersection between the server response and preselected', () => {
+ const selectedRoles = findSelected(LEVEL_TYPES.ROLE);
+ expect(selectedRoles).toHaveLength(1);
+ expect(selectedRoles.at(0).text()).toBe('role2');
+ });
+
+ it('should set selected groups as intersection between the server response and preselected', () => {
+ const selectedGroups = findSelected(LEVEL_TYPES.GROUP);
+ expect(selectedGroups).toHaveLength(1);
+ expect(selectedGroups.at(0).text()).toBe('group5');
+ });
+
+ it('should set selected users to all preselected mapping `user_id` to `id`', () => {
+ const selectedUsers = findSelected(LEVEL_TYPES.USER);
+ expect(selectedUsers).toHaveLength(1);
+ expect(selectedUsers.at(0).text()).toBe('user2');
+ });
+
+ it('should set selected deploy keys as intersection between the server response and preselected mapping some keys', () => {
+ const selectedDeployKeys = findSelected(LEVEL_TYPES.DEPLOY_KEY);
+ expect(selectedDeployKeys).toHaveLength(1);
+ expect(selectedDeployKeys.at(0).text()).toContain('key11 (abcdefghijklmn...)');
+ });
+ });
+
+ describe('on dropdown open', () => {
+ beforeEach(() => {
+ createComponent();
+ });
+
+ it('should set the search input focus', () => {
+ wrapper.vm.$refs.search.focusInput = jest.fn();
+ findDropdown().vm.$emit('shown');
+
+ expect(wrapper.vm.$refs.search.focusInput).toHaveBeenCalled();
+ });
+ });
+
+ describe('on dropdown close', () => {
+ beforeEach(async () => {
+ createComponent();
+ await waitForPromises();
+ });
+
+ it('should emit `hidden` event with dropdown selection', () => {
+ jest.spyOn(wrapper.vm, '$emit');
+
+ findAllDropdownItems().at(1).trigger('click');
+
+ findDropdown().vm.$emit('hidden');
+ expect(wrapper.vm.$emit).toHaveBeenCalledWith('hidden', [{ access_level: 2 }]);
+ });
+ });
+});
diff --git a/spec/frontend/ref/components/ref_selector_spec.js b/spec/frontend/ref/components/ref_selector_spec.js
index a642a8cf8c2..b486992ac4b 100644
--- a/spec/frontend/ref/components/ref_selector_spec.js
+++ b/spec/frontend/ref/components/ref_selector_spec.js
@@ -4,6 +4,9 @@ import axios from 'axios';
import MockAdapter from 'axios-mock-adapter';
import { merge, last } from 'lodash';
import Vuex from 'vuex';
+import commit from 'test_fixtures/api/commits/commit.json';
+import branches from 'test_fixtures/api/branches/branches.json';
+import tags from 'test_fixtures/api/tags/tags.json';
import { trimText } from 'helpers/text_helper';
import { ENTER_KEY } from '~/lib/utils/keys';
import { sprintf } from '~/locale';
@@ -21,11 +24,7 @@ const localVue = createLocalVue();
localVue.use(Vuex);
describe('Ref selector component', () => {
- const fixtures = {
- branches: getJSONFixture('api/branches/branches.json'),
- tags: getJSONFixture('api/tags/tags.json'),
- commit: getJSONFixture('api/commits/commit.json'),
- };
+ const fixtures = { branches, tags, commit };
const projectId = '8';
@@ -480,8 +479,6 @@ describe('Ref selector component', () => {
it('renders each commit as a selectable item with the short SHA and commit title', () => {
const dropdownItems = findCommitDropdownItems();
- const { commit } = fixtures;
-
expect(dropdownItems.at(0).text()).toBe(`${commit.short_id} ${commit.title}`);
});
});
diff --git a/spec/frontend/registry/explorer/components/details_page/tags_list_row_spec.js b/spec/frontend/registry/explorer/components/details_page/tags_list_row_spec.js
index c8fcb3116cd..a5da37a2786 100644
--- a/spec/frontend/registry/explorer/components/details_page/tags_list_row_spec.js
+++ b/spec/frontend/registry/explorer/components/details_page/tags_list_row_spec.js
@@ -1,13 +1,12 @@
-import { GlFormCheckbox, GlSprintf, GlIcon } from '@gitlab/ui';
+import { GlFormCheckbox, GlSprintf, GlIcon, GlDropdown, GlDropdownItem } from '@gitlab/ui';
import { shallowMount } from '@vue/test-utils';
import { nextTick } from 'vue';
import { createMockDirective, getBinding } from 'helpers/vue_mock_directive';
-import DeleteButton from '~/registry/explorer/components/delete_button.vue';
+
import component from '~/registry/explorer/components/details_page/tags_list_row.vue';
import {
REMOVE_TAG_BUTTON_TITLE,
- REMOVE_TAG_BUTTON_DISABLE_TOOLTIP,
MISSING_MANIFEST_WARNING_TOOLTIP,
NOT_AVAILABLE_TEXT,
NOT_AVAILABLE_SIZE,
@@ -25,19 +24,20 @@ describe('tags list row', () => {
const defaultProps = { tag, isMobile: false, index: 0 };
- const findCheckbox = () => wrapper.find(GlFormCheckbox);
+ const findCheckbox = () => wrapper.findComponent(GlFormCheckbox);
const findName = () => wrapper.find('[data-testid="name"]');
const findSize = () => wrapper.find('[data-testid="size"]');
const findTime = () => wrapper.find('[data-testid="time"]');
const findShortRevision = () => wrapper.find('[data-testid="digest"]');
- const findClipboardButton = () => wrapper.find(ClipboardButton);
- const findDeleteButton = () => wrapper.find(DeleteButton);
- const findTimeAgoTooltip = () => wrapper.find(TimeAgoTooltip);
+ const findClipboardButton = () => wrapper.findComponent(ClipboardButton);
+ const findTimeAgoTooltip = () => wrapper.findComponent(TimeAgoTooltip);
const findDetailsRows = () => wrapper.findAll(DetailsRow);
const findPublishedDateDetail = () => wrapper.find('[data-testid="published-date-detail"]');
const findManifestDetail = () => wrapper.find('[data-testid="manifest-detail"]');
const findConfigurationDetail = () => wrapper.find('[data-testid="configuration-detail"]');
- const findWarningIcon = () => wrapper.find(GlIcon);
+ const findWarningIcon = () => wrapper.findComponent(GlIcon);
+ const findAdditionalActionsMenu = () => wrapper.findComponent(GlDropdown);
+ const findDeleteButton = () => wrapper.findComponent(GlDropdownItem);
const mountComponent = (propsData = defaultProps) => {
wrapper = shallowMount(component, {
@@ -45,6 +45,7 @@ describe('tags list row', () => {
GlSprintf,
ListItem,
DetailsRow,
+ GlDropdown,
},
propsData,
directives: {
@@ -262,44 +263,61 @@ describe('tags list row', () => {
});
});
- describe('delete button', () => {
+ describe('additional actions menu', () => {
it('exists', () => {
mountComponent();
- expect(findDeleteButton().exists()).toBe(true);
+ expect(findAdditionalActionsMenu().exists()).toBe(true);
});
- it('has the correct props/attributes', () => {
+ it('has the correct props', () => {
mountComponent();
- expect(findDeleteButton().attributes()).toMatchObject({
- title: REMOVE_TAG_BUTTON_TITLE,
- tooltiptitle: REMOVE_TAG_BUTTON_DISABLE_TOOLTIP,
- tooltipdisabled: 'true',
+ expect(findAdditionalActionsMenu().props()).toMatchObject({
+ icon: 'ellipsis_v',
+ text: 'More actions',
+ textSrOnly: true,
+ category: 'tertiary',
+ right: true,
});
});
it.each`
- canDelete | digest | disabled
- ${true} | ${null} | ${true}
- ${false} | ${'foo'} | ${true}
- ${false} | ${null} | ${true}
- ${true} | ${'foo'} | ${true}
+ canDelete | digest | disabled | buttonDisabled
+ ${true} | ${null} | ${true} | ${true}
+ ${false} | ${'foo'} | ${true} | ${true}
+ ${false} | ${null} | ${true} | ${true}
+ ${true} | ${'foo'} | ${true} | ${true}
+ ${true} | ${'foo'} | ${false} | ${false}
`(
- 'is disabled when canDelete is $canDelete and digest is $digest and disabled is $disabled',
- ({ canDelete, digest, disabled }) => {
+ 'is $visible that is visible when canDelete is $canDelete and digest is $digest and disabled is $disabled',
+ ({ canDelete, digest, disabled, buttonDisabled }) => {
mountComponent({ ...defaultProps, tag: { ...tag, canDelete, digest }, disabled });
- expect(findDeleteButton().attributes('disabled')).toBe('true');
+ expect(findAdditionalActionsMenu().props('disabled')).toBe(buttonDisabled);
+ expect(findAdditionalActionsMenu().classes('gl-opacity-0')).toBe(buttonDisabled);
+ expect(findAdditionalActionsMenu().classes('gl-pointer-events-none')).toBe(buttonDisabled);
},
);
- it('delete event emits delete', () => {
- mountComponent();
+ describe('delete button', () => {
+ it('exists and has the correct attrs', () => {
+ mountComponent();
+
+ expect(findDeleteButton().exists()).toBe(true);
+ expect(findDeleteButton().attributes()).toMatchObject({
+ variant: 'danger',
+ });
+ expect(findDeleteButton().text()).toBe(REMOVE_TAG_BUTTON_TITLE);
+ });
- findDeleteButton().vm.$emit('delete');
+ it('delete event emits delete', () => {
+ mountComponent();
- expect(wrapper.emitted('delete')).toEqual([[]]);
+ findDeleteButton().vm.$emit('click');
+
+ expect(wrapper.emitted('delete')).toEqual([[]]);
+ });
});
});
diff --git a/spec/frontend/registry/explorer/pages/list_spec.js b/spec/frontend/registry/explorer/pages/list_spec.js
index b58a53f0af2..e1f24a2b65b 100644
--- a/spec/frontend/registry/explorer/pages/list_spec.js
+++ b/spec/frontend/registry/explorer/pages/list_spec.js
@@ -129,13 +129,16 @@ describe('List Page', () => {
});
});
- describe('connection error', () => {
+ describe.each([
+ { error: 'connectionError', errorName: 'connection error' },
+ { error: 'invalidPathError', errorName: 'invalid path error' },
+ ])('handling $errorName', ({ error }) => {
const config = {
- characterError: true,
containersErrorImage: 'foo',
helpPagePath: 'bar',
isGroupPage: false,
};
+ config[error] = true;
it('should show an empty state', () => {
mountComponent({ config });
diff --git a/spec/frontend/related_merge_requests/components/related_merge_requests_spec.js b/spec/frontend/related_merge_requests/components/related_merge_requests_spec.js
index f306fdef624..67f62815720 100644
--- a/spec/frontend/related_merge_requests/components/related_merge_requests_spec.js
+++ b/spec/frontend/related_merge_requests/components/related_merge_requests_spec.js
@@ -1,23 +1,19 @@
import { mount, createLocalVue } 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';
import RelatedMergeRequests from '~/related_merge_requests/components/related_merge_requests.vue';
import createStore from '~/related_merge_requests/store/index';
import RelatedIssuableItem from '~/vue_shared/components/issue/related_issuable_item.vue';
-const FIXTURE_PATH = 'issues/related_merge_requests.json';
const API_ENDPOINT = '/api/v4/projects/2/issues/33/related_merge_requests';
const localVue = createLocalVue();
describe('RelatedMergeRequests', () => {
let wrapper;
let mock;
- let mockData;
beforeEach((done) => {
- loadFixtures(FIXTURE_PATH);
- mockData = getJSONFixture(FIXTURE_PATH);
-
// put the fixture in DOM as the component expects
document.body.innerHTML = `<div id="js-issuable-app"></div>`;
document.getElementById('js-issuable-app').dataset.initial = JSON.stringify(mockData);
diff --git a/spec/frontend/releases/components/app_edit_new_spec.js b/spec/frontend/releases/components/app_edit_new_spec.js
index 1db6fa21d6b..029d720f7b9 100644
--- a/spec/frontend/releases/components/app_edit_new_spec.js
+++ b/spec/frontend/releases/components/app_edit_new_spec.js
@@ -3,7 +3,7 @@ import axios from 'axios';
import MockAdapter from 'axios-mock-adapter';
import { merge } from 'lodash';
import Vuex from 'vuex';
-import { getJSONFixture } from 'helpers/fixtures';
+import originalRelease from 'test_fixtures/api/releases/release.json';
import setWindowLocation from 'helpers/set_window_location_helper';
import { TEST_HOST } from 'helpers/test_constants';
import * as commonUtils from '~/lib/utils/common_utils';
@@ -11,7 +11,6 @@ import ReleaseEditNewApp from '~/releases/components/app_edit_new.vue';
import AssetLinksForm from '~/releases/components/asset_links_form.vue';
import { BACK_URL_PARAM } from '~/releases/constants';
-const originalRelease = getJSONFixture('api/releases/release.json');
const originalMilestones = originalRelease.milestones;
const releasesPagePath = 'path/to/releases/page';
diff --git a/spec/frontend/releases/components/app_index_apollo_client_spec.js b/spec/frontend/releases/components/app_index_apollo_client_spec.js
index 096d319c82f..32bbfd386f5 100644
--- a/spec/frontend/releases/components/app_index_apollo_client_spec.js
+++ b/spec/frontend/releases/components/app_index_apollo_client_spec.js
@@ -1,6 +1,7 @@
import { cloneDeep } from 'lodash';
import Vue from 'vue';
import VueApollo from 'vue-apollo';
+import originalAllReleasesQueryResponse from 'test_fixtures/graphql/releases/graphql/queries/all_releases.query.graphql.json';
import createMockApollo from 'helpers/mock_apollo_helper';
import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
import allReleasesQuery from 'shared_queries/releases/all_releases.query.graphql';
@@ -32,9 +33,6 @@ jest.mock('~/lib/utils/url_utility', () => ({
}));
describe('app_index_apollo_client.vue', () => {
- const originalAllReleasesQueryResponse = getJSONFixture(
- 'graphql/releases/graphql/queries/all_releases.query.graphql.json',
- );
const projectPath = 'project/path';
const newReleasePath = 'path/to/new/release/page';
const before = 'beforeCursor';
diff --git a/spec/frontend/releases/components/app_show_spec.js b/spec/frontend/releases/components/app_show_spec.js
index 7ea7a6ffe94..72ebaaaf76c 100644
--- a/spec/frontend/releases/components/app_show_spec.js
+++ b/spec/frontend/releases/components/app_show_spec.js
@@ -1,7 +1,7 @@
import { shallowMount } from '@vue/test-utils';
import Vue from 'vue';
import VueApollo from 'vue-apollo';
-import { getJSONFixture } from 'helpers/fixtures';
+import oneReleaseQueryResponse from 'test_fixtures/graphql/releases/graphql/queries/one_release.query.graphql.json';
import createMockApollo from 'helpers/mock_apollo_helper';
import createFlash from '~/flash';
import ReleaseShowApp from '~/releases/components/app_show.vue';
@@ -11,10 +11,6 @@ import oneReleaseQuery from '~/releases/graphql/queries/one_release.query.graphq
jest.mock('~/flash');
-const oneReleaseQueryResponse = getJSONFixture(
- 'graphql/releases/graphql/queries/one_release.query.graphql.json',
-);
-
Vue.use(VueApollo);
const EXPECTED_ERROR_MESSAGE = 'Something went wrong while getting the release details.';
diff --git a/spec/frontend/releases/components/asset_links_form_spec.js b/spec/frontend/releases/components/asset_links_form_spec.js
index 460007e48ef..839d127e00f 100644
--- a/spec/frontend/releases/components/asset_links_form_spec.js
+++ b/spec/frontend/releases/components/asset_links_form_spec.js
@@ -1,6 +1,6 @@
import { mount, createLocalVue } from '@vue/test-utils';
import Vuex from 'vuex';
-import { getJSONFixture } from 'helpers/fixtures';
+import originalRelease from 'test_fixtures/api/releases/release.json';
import * as commonUtils from '~/lib/utils/common_utils';
import { ENTER_KEY } from '~/lib/utils/keys';
import AssetLinksForm from '~/releases/components/asset_links_form.vue';
@@ -9,8 +9,6 @@ import { ASSET_LINK_TYPE, DEFAULT_ASSET_LINK_TYPE } from '~/releases/constants';
const localVue = createLocalVue();
localVue.use(Vuex);
-const originalRelease = getJSONFixture('api/releases/release.json');
-
describe('Release edit component', () => {
let wrapper;
let release;
diff --git a/spec/frontend/releases/components/evidence_block_spec.js b/spec/frontend/releases/components/evidence_block_spec.js
index 50b6d1c4707..973428257b7 100644
--- a/spec/frontend/releases/components/evidence_block_spec.js
+++ b/spec/frontend/releases/components/evidence_block_spec.js
@@ -1,13 +1,11 @@
import { GlLink, GlIcon } from '@gitlab/ui';
import { mount } from '@vue/test-utils';
-import { getJSONFixture } from 'helpers/fixtures';
+import originalRelease from 'test_fixtures/api/releases/release.json';
import { convertObjectPropsToCamelCase } from '~/lib/utils/common_utils';
import { truncateSha } from '~/lib/utils/text_utility';
import EvidenceBlock from '~/releases/components/evidence_block.vue';
import ClipboardButton from '~/vue_shared/components/clipboard_button.vue';
-const originalRelease = getJSONFixture('api/releases/release.json');
-
describe('Evidence Block', () => {
let wrapper;
let release;
diff --git a/spec/frontend/releases/components/release_block_assets_spec.js b/spec/frontend/releases/components/release_block_assets_spec.js
index 3b9b16fa890..c63689e11ac 100644
--- a/spec/frontend/releases/components/release_block_assets_spec.js
+++ b/spec/frontend/releases/components/release_block_assets_spec.js
@@ -1,13 +1,11 @@
import { GlCollapse } from '@gitlab/ui';
import { mount } from '@vue/test-utils';
-import { getJSONFixture } from 'helpers/fixtures';
+import { assets } from 'test_fixtures/api/releases/release.json';
import { trimText } from 'helpers/text_helper';
import { convertObjectPropsToCamelCase } from '~/lib/utils/common_utils';
import ReleaseBlockAssets from '~/releases/components/release_block_assets.vue';
import { ASSET_LINK_TYPE } from '~/releases/constants';
-const { assets } = getJSONFixture('api/releases/release.json');
-
describe('Release block assets', () => {
let wrapper;
let defaultProps;
diff --git a/spec/frontend/releases/components/release_block_footer_spec.js b/spec/frontend/releases/components/release_block_footer_spec.js
index e9fa22b4ec7..f645dc309d7 100644
--- a/spec/frontend/releases/components/release_block_footer_spec.js
+++ b/spec/frontend/releases/components/release_block_footer_spec.js
@@ -1,13 +1,11 @@
import { GlLink, GlIcon } from '@gitlab/ui';
import { mount } from '@vue/test-utils';
import { cloneDeep } from 'lodash';
-import { getJSONFixture } from 'helpers/fixtures';
+import originalRelease from 'test_fixtures/api/releases/release.json';
import { trimText } from 'helpers/text_helper';
import { convertObjectPropsToCamelCase } from '~/lib/utils/common_utils';
import ReleaseBlockFooter from '~/releases/components/release_block_footer.vue';
-const originalRelease = getJSONFixture('api/releases/release.json');
-
// TODO: Encapsulate date helpers https://gitlab.com/gitlab-org/gitlab/-/issues/320883
const MONTHS_IN_MS = 1000 * 60 * 60 * 24 * 31;
const mockFutureDate = new Date(new Date().getTime() + MONTHS_IN_MS).toISOString();
diff --git a/spec/frontend/releases/components/release_block_header_spec.js b/spec/frontend/releases/components/release_block_header_spec.js
index 47fd6377fcf..167ae4f32a2 100644
--- a/spec/frontend/releases/components/release_block_header_spec.js
+++ b/spec/frontend/releases/components/release_block_header_spec.js
@@ -1,14 +1,12 @@
import { GlLink } from '@gitlab/ui';
import { shallowMount } from '@vue/test-utils';
import { merge } from 'lodash';
-import { getJSONFixture } from 'helpers/fixtures';
+import originalRelease from 'test_fixtures/api/releases/release.json';
import setWindowLocation from 'helpers/set_window_location_helper';
import { convertObjectPropsToCamelCase } from '~/lib/utils/common_utils';
import ReleaseBlockHeader from '~/releases/components/release_block_header.vue';
import { BACK_URL_PARAM } from '~/releases/constants';
-const originalRelease = getJSONFixture('api/releases/release.json');
-
describe('Release block header', () => {
let wrapper;
let release;
diff --git a/spec/frontend/releases/components/release_block_milestone_info_spec.js b/spec/frontend/releases/components/release_block_milestone_info_spec.js
index a2bf45c7861..146b2cc7490 100644
--- a/spec/frontend/releases/components/release_block_milestone_info_spec.js
+++ b/spec/frontend/releases/components/release_block_milestone_info_spec.js
@@ -1,12 +1,12 @@
import { GlProgressBar, GlLink, GlBadge, GlButton } from '@gitlab/ui';
import { mount } from '@vue/test-utils';
-import { getJSONFixture } from 'helpers/fixtures';
+import originalRelease from 'test_fixtures/api/releases/release.json';
import { trimText } from 'helpers/text_helper';
import { convertObjectPropsToCamelCase } from '~/lib/utils/common_utils';
import ReleaseBlockMilestoneInfo from '~/releases/components/release_block_milestone_info.vue';
import { MAX_MILESTONES_TO_DISPLAY } from '~/releases/constants';
-const { milestones: originalMilestones } = getJSONFixture('api/releases/release.json');
+const { milestones: originalMilestones } = originalRelease;
describe('Release block milestone info', () => {
let wrapper;
diff --git a/spec/frontend/releases/components/release_block_spec.js b/spec/frontend/releases/components/release_block_spec.js
index 1ca441f7a5a..a847c32b8f1 100644
--- a/spec/frontend/releases/components/release_block_spec.js
+++ b/spec/frontend/releases/components/release_block_spec.js
@@ -1,6 +1,6 @@
import { mount } from '@vue/test-utils';
import $ from 'jquery';
-import { getJSONFixture } from 'helpers/fixtures';
+import originalRelease from 'test_fixtures/api/releases/release.json';
import * as commonUtils from '~/lib/utils/common_utils';
import * as urlUtility from '~/lib/utils/url_utility';
import EvidenceBlock from '~/releases/components/evidence_block.vue';
@@ -9,8 +9,6 @@ import ReleaseBlockFooter from '~/releases/components/release_block_footer.vue';
import { BACK_URL_PARAM } from '~/releases/constants';
import timeagoMixin from '~/vue_shared/mixins/timeago';
-const originalRelease = getJSONFixture('api/releases/release.json');
-
describe('Release block', () => {
let wrapper;
let release;
diff --git a/spec/frontend/releases/stores/modules/detail/actions_spec.js b/spec/frontend/releases/stores/modules/detail/actions_spec.js
index 6504a09df2f..d8329fb82b1 100644
--- a/spec/frontend/releases/stores/modules/detail/actions_spec.js
+++ b/spec/frontend/releases/stores/modules/detail/actions_spec.js
@@ -1,5 +1,5 @@
import { cloneDeep } from 'lodash';
-import { getJSONFixture } from 'helpers/fixtures';
+import originalOneReleaseForEditingQueryResponse from 'test_fixtures/graphql/releases/graphql/queries/one_release_for_editing.query.graphql.json';
import testAction from 'helpers/vuex_action_helper';
import createFlash from '~/flash';
import { redirectTo } from '~/lib/utils/url_utility';
@@ -27,10 +27,6 @@ jest.mock('~/releases/util', () => ({
},
}));
-const originalOneReleaseForEditingQueryResponse = getJSONFixture(
- 'graphql/releases/graphql/queries/one_release_for_editing.query.graphql.json',
-);
-
describe('Release edit/new actions', () => {
let state;
let releaseResponse;
diff --git a/spec/frontend/releases/stores/modules/detail/mutations_spec.js b/spec/frontend/releases/stores/modules/detail/mutations_spec.js
index 20ae332e500..24dcedb3580 100644
--- a/spec/frontend/releases/stores/modules/detail/mutations_spec.js
+++ b/spec/frontend/releases/stores/modules/detail/mutations_spec.js
@@ -1,12 +1,10 @@
-import { getJSONFixture } from 'helpers/fixtures';
+import originalRelease from 'test_fixtures/api/releases/release.json';
import { convertObjectPropsToCamelCase } from '~/lib/utils/common_utils';
import { ASSET_LINK_TYPE, DEFAULT_ASSET_LINK_TYPE } from '~/releases/constants';
import * as types from '~/releases/stores/modules/edit_new/mutation_types';
import mutations from '~/releases/stores/modules/edit_new/mutations';
import createState from '~/releases/stores/modules/edit_new/state';
-const originalRelease = getJSONFixture('api/releases/release.json');
-
describe('Release edit/new mutations', () => {
let state;
let release;
diff --git a/spec/frontend/releases/stores/modules/list/actions_spec.js b/spec/frontend/releases/stores/modules/list/actions_spec.js
index af520c2eb20..91406f7e2f4 100644
--- a/spec/frontend/releases/stores/modules/list/actions_spec.js
+++ b/spec/frontend/releases/stores/modules/list/actions_spec.js
@@ -1,5 +1,5 @@
import { cloneDeep } from 'lodash';
-import { getJSONFixture } from 'helpers/fixtures';
+import originalGraphqlReleasesResponse from 'test_fixtures/graphql/releases/graphql/queries/all_releases.query.graphql.json';
import testAction from 'helpers/vuex_action_helper';
import { PAGE_SIZE } from '~/releases/constants';
import allReleasesQuery from '~/releases/graphql/queries/all_releases.query.graphql';
@@ -12,10 +12,6 @@ import * as types from '~/releases/stores/modules/index/mutation_types';
import createState from '~/releases/stores/modules/index/state';
import { gqClient, convertAllReleasesGraphQLResponse } from '~/releases/util';
-const originalGraphqlReleasesResponse = getJSONFixture(
- 'graphql/releases/graphql/queries/all_releases.query.graphql.json',
-);
-
describe('Releases State actions', () => {
let mockedState;
let graphqlReleasesResponse;
diff --git a/spec/frontend/releases/stores/modules/list/mutations_spec.js b/spec/frontend/releases/stores/modules/list/mutations_spec.js
index 08d803b3c2c..49e324c28a5 100644
--- a/spec/frontend/releases/stores/modules/list/mutations_spec.js
+++ b/spec/frontend/releases/stores/modules/list/mutations_spec.js
@@ -1,17 +1,13 @@
-import { getJSONFixture } from 'helpers/fixtures';
+import originalRelease from 'test_fixtures/api/releases/release.json';
+import graphqlReleasesResponse from 'test_fixtures/graphql/releases/graphql/queries/all_releases.query.graphql.json';
import { convertObjectPropsToCamelCase } from '~/lib/utils/common_utils';
import * as types from '~/releases/stores/modules/index/mutation_types';
import mutations from '~/releases/stores/modules/index/mutations';
import createState from '~/releases/stores/modules/index/state';
import { convertAllReleasesGraphQLResponse } from '~/releases/util';
-const originalRelease = getJSONFixture('api/releases/release.json');
const originalReleases = [originalRelease];
-const graphqlReleasesResponse = getJSONFixture(
- 'graphql/releases/graphql/queries/all_releases.query.graphql.json',
-);
-
describe('Releases Store Mutations', () => {
let stateCopy;
let pageInfo;
diff --git a/spec/frontend/releases/util_spec.js b/spec/frontend/releases/util_spec.js
index 36e7be369d3..3c1060cb0e8 100644
--- a/spec/frontend/releases/util_spec.js
+++ b/spec/frontend/releases/util_spec.js
@@ -1,21 +1,13 @@
import { cloneDeep } from 'lodash';
-import { getJSONFixture } from 'helpers/fixtures';
+import originalAllReleasesQueryResponse from 'test_fixtures/graphql/releases/graphql/queries/all_releases.query.graphql.json';
+import originalOneReleaseQueryResponse from 'test_fixtures/graphql/releases/graphql/queries/one_release.query.graphql.json';
+import originalOneReleaseForEditingQueryResponse from 'test_fixtures/graphql/releases/graphql/queries/one_release_for_editing.query.graphql.json';
import {
convertGraphQLRelease,
convertAllReleasesGraphQLResponse,
convertOneReleaseGraphQLResponse,
} from '~/releases/util';
-const originalAllReleasesQueryResponse = getJSONFixture(
- 'graphql/releases/graphql/queries/all_releases.query.graphql.json',
-);
-const originalOneReleaseQueryResponse = getJSONFixture(
- 'graphql/releases/graphql/queries/one_release.query.graphql.json',
-);
-const originalOneReleaseForEditingQueryResponse = getJSONFixture(
- 'graphql/releases/graphql/queries/one_release_for_editing.query.graphql.json',
-);
-
describe('releases/util.js', () => {
describe('convertGraphQLRelease', () => {
let releaseFromResponse;
diff --git a/spec/frontend/reports/codequality_report/components/codequality_issue_body_spec.js b/spec/frontend/reports/codequality_report/components/codequality_issue_body_spec.js
index f99dcbffdff..c548007a8a6 100644
--- a/spec/frontend/reports/codequality_report/components/codequality_issue_body_spec.js
+++ b/spec/frontend/reports/codequality_report/components/codequality_issue_body_spec.js
@@ -38,6 +38,12 @@ describe('code quality issue body issue body', () => {
describe('severity rating', () => {
it.each`
severity | iconClass | iconName
+ ${'INFO'} | ${'text-primary-400'} | ${'severity-info'}
+ ${'MINOR'} | ${'text-warning-200'} | ${'severity-low'}
+ ${'CRITICAL'} | ${'text-danger-600'} | ${'severity-high'}
+ ${'BLOCKER'} | ${'text-danger-800'} | ${'severity-critical'}
+ ${'UNKNOWN'} | ${'text-secondary-400'} | ${'severity-unknown'}
+ ${'INVALID'} | ${'text-secondary-400'} | ${'severity-unknown'}
${'info'} | ${'text-primary-400'} | ${'severity-info'}
${'minor'} | ${'text-warning-200'} | ${'severity-low'}
${'major'} | ${'text-warning-400'} | ${'severity-medium'}
diff --git a/spec/frontend/reports/codequality_report/grouped_codequality_reports_app_spec.js b/spec/frontend/reports/codequality_report/grouped_codequality_reports_app_spec.js
index 84863eac3d3..685a1c50a46 100644
--- a/spec/frontend/reports/codequality_report/grouped_codequality_reports_app_spec.js
+++ b/spec/frontend/reports/codequality_report/grouped_codequality_reports_app_spec.js
@@ -60,7 +60,7 @@ describe('Grouped code quality reports app', () => {
});
it('should render loading text', () => {
- expect(findWidget().text()).toEqual('Loading codeclimate report');
+ expect(findWidget().text()).toEqual('Loading Code quality report');
});
});
@@ -84,7 +84,7 @@ describe('Grouped code quality reports app', () => {
});
it('renders summary text', () => {
- expect(findWidget().text()).toContain('Code quality degraded on 1 point');
+ expect(findWidget().text()).toContain('Code quality degraded');
});
it('renders custom codequality issue body', () => {
@@ -99,7 +99,7 @@ describe('Grouped code quality reports app', () => {
});
it('renders summary text', () => {
- expect(findWidget().text()).toContain('Code quality improved on 1 point');
+ expect(findWidget().text()).toContain('Code quality improved');
});
it('renders custom codequality issue body', () => {
@@ -115,7 +115,7 @@ describe('Grouped code quality reports app', () => {
it('renders summary text', () => {
expect(findWidget().text()).toContain(
- 'Code quality improved on 1 point and degraded on 1 point',
+ 'Code quality scanning detected 2 changes in merged results',
);
});
@@ -132,7 +132,7 @@ describe('Grouped code quality reports app', () => {
});
it('renders error text', () => {
- expect(findWidget().text()).toContain('Failed to load codeclimate report');
+ expect(findWidget().text()).toContain('Failed to load Code quality report');
});
it('does not render a help icon', () => {
diff --git a/spec/frontend/reports/codequality_report/store/getters_spec.js b/spec/frontend/reports/codequality_report/store/getters_spec.js
index 0378171084d..b5f6edf85eb 100644
--- a/spec/frontend/reports/codequality_report/store/getters_spec.js
+++ b/spec/frontend/reports/codequality_report/store/getters_spec.js
@@ -61,9 +61,9 @@ describe('Codequality reports store getters', () => {
it.each`
resolvedIssues | newIssues | expectedText
${0} | ${0} | ${'No changes to code quality'}
- ${0} | ${1} | ${'Code quality degraded on 1 point'}
- ${2} | ${0} | ${'Code quality improved on 2 points'}
- ${1} | ${2} | ${'Code quality improved on 1 point and degraded on 2 points'}
+ ${0} | ${1} | ${'Code quality degraded'}
+ ${2} | ${0} | ${'Code quality improved'}
+ ${1} | ${2} | ${'Code quality scanning detected 3 changes in merged results'}
`(
'returns a summary containing $resolvedIssues resolved issues and $newIssues new issues',
({ newIssues, resolvedIssues, expectedText }) => {
diff --git a/spec/frontend/reports/codequality_report/store/utils/codequality_parser_spec.js b/spec/frontend/reports/codequality_report/store/utils/codequality_parser_spec.js
index ba95294ab0a..5b77a2c74be 100644
--- a/spec/frontend/reports/codequality_report/store/utils/codequality_parser_spec.js
+++ b/spec/frontend/reports/codequality_report/store/utils/codequality_parser_spec.js
@@ -25,6 +25,18 @@ describe('Codequality report store utils', () => {
});
});
+ describe('when an issue has a non-nested path', () => {
+ const issue = { description: 'Insecure Dependency', path: 'Gemfile.lock' };
+
+ beforeEach(() => {
+ [result] = parseCodeclimateMetrics([issue], 'path');
+ });
+
+ it('is parsed', () => {
+ expect(result.name).toEqual(issue.description);
+ });
+ });
+
describe('when an issue has a path but no line', () => {
const issue = { description: 'Insecure Dependency', location: { path: 'Gemfile.lock' } };
diff --git a/spec/frontend/reports/components/report_section_spec.js b/spec/frontend/reports/components/report_section_spec.js
index e1b36aa1e21..39932b62dbb 100644
--- a/spec/frontend/reports/components/report_section_spec.js
+++ b/spec/frontend/reports/components/report_section_spec.js
@@ -23,7 +23,7 @@ describe('Report section', () => {
const defaultProps = {
component: '',
status: 'SUCCESS',
- loadingText: 'Loading codeclimate report',
+ loadingText: 'Loading Code Quality report',
errorText: 'foo',
successText: 'Code quality improved on 1 point and degraded on 1 point',
resolvedIssues,
@@ -117,13 +117,13 @@ describe('Report section', () => {
vm = mountComponent(ReportSection, {
component: '',
status: 'LOADING',
- loadingText: 'Loading codeclimate report',
+ loadingText: 'Loading Code Quality report',
errorText: 'foo',
successText: 'Code quality improved on 1 point and degraded on 1 point',
hasIssues: false,
});
- expect(vm.$el.textContent.trim()).toEqual('Loading codeclimate report');
+ expect(vm.$el.textContent.trim()).toEqual('Loading Code Quality report');
});
});
@@ -229,13 +229,13 @@ describe('Report section', () => {
vm = mountComponent(ReportSection, {
component: '',
status: 'ERROR',
- loadingText: 'Loading codeclimate report',
- errorText: 'Failed to load codeclimate report',
+ loadingText: 'Loading Code Quality report',
+ errorText: 'Failed to load Code Quality report',
successText: 'Code quality improved on 1 point and degraded on 1 point',
hasIssues: false,
});
- expect(vm.$el.textContent.trim()).toEqual('Failed to load codeclimate report');
+ expect(vm.$el.textContent.trim()).toEqual('Failed to load Code Quality report');
});
});
diff --git a/spec/frontend/reports/grouped_test_report/grouped_test_reports_app_spec.js b/spec/frontend/reports/grouped_test_report/grouped_test_reports_app_spec.js
index 0f7c2559e8b..c60c1f7b63c 100644
--- a/spec/frontend/reports/grouped_test_report/grouped_test_reports_app_spec.js
+++ b/spec/frontend/reports/grouped_test_report/grouped_test_reports_app_spec.js
@@ -24,7 +24,7 @@ describe('Grouped test reports app', () => {
let wrapper;
let mockStore;
- const mountComponent = ({ props = { pipelinePath }, glFeatures = {} } = {}) => {
+ const mountComponent = ({ props = { pipelinePath } } = {}) => {
wrapper = mount(GroupedTestReportsApp, {
store: mockStore,
localVue,
@@ -34,9 +34,6 @@ describe('Grouped test reports app', () => {
pipelinePath,
...props,
},
- provide: {
- glFeatures,
- },
});
};
@@ -114,8 +111,8 @@ describe('Grouped test reports app', () => {
setReports(newFailedTestReports);
});
- it('tracks service ping metric when enabled', () => {
- mountComponent({ glFeatures: { usageDataITestingSummaryWidgetTotal: true } });
+ it('tracks service ping metric', () => {
+ mountComponent();
findExpandButton().trigger('click');
expect(Api.trackRedisHllUserEvent).toHaveBeenCalledTimes(1);
@@ -123,7 +120,7 @@ describe('Grouped test reports app', () => {
});
it('only tracks the first expansion', () => {
- mountComponent({ glFeatures: { usageDataITestingSummaryWidgetTotal: true } });
+ mountComponent();
const expandButton = findExpandButton();
expandButton.trigger('click');
expandButton.trigger('click');
@@ -131,13 +128,6 @@ describe('Grouped test reports app', () => {
expect(Api.trackRedisHllUserEvent).toHaveBeenCalledTimes(1);
});
-
- it('does not track service ping metric when disabled', () => {
- mountComponent({ glFeatures: { usageDataITestingSummaryWidgetTotal: false } });
- findExpandButton().trigger('click');
-
- expect(Api.trackRedisHllUserEvent).not.toHaveBeenCalled();
- });
});
describe('with new failed result', () => {
diff --git a/spec/frontend/repository/commits_service_spec.js b/spec/frontend/repository/commits_service_spec.js
new file mode 100644
index 00000000000..d924974aede
--- /dev/null
+++ b/spec/frontend/repository/commits_service_spec.js
@@ -0,0 +1,84 @@
+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 createFlash from '~/flash';
+import { I18N_COMMIT_DATA_FETCH_ERROR } from '~/repository/constants';
+
+jest.mock('~/flash');
+
+describe('commits service', () => {
+ let mock;
+ const url = `${gon.relative_url_root || ''}/my-project/-/refs/main/logs_tree/`;
+
+ beforeEach(() => {
+ mock = new MockAdapter(axios);
+
+ mock.onGet(url).reply(httpStatus.OK, [], {});
+
+ jest.spyOn(axios, 'get');
+ });
+
+ afterEach(() => {
+ mock.restore();
+ resetRequestedCommits();
+ });
+
+ const requestCommits = (offset, project = 'my-project', path = '', ref = 'main') =>
+ loadCommits(project, path, ref, offset);
+
+ it('calls axios get', async () => {
+ const offset = 10;
+ const project = 'my-project';
+ const path = 'my-path';
+ const ref = 'my-ref';
+ const testUrl = `${gon.relative_url_root || ''}/${project}/-/refs/${ref}/logs_tree/${path}`;
+
+ await requestCommits(offset, project, path, ref);
+
+ 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/');
+
+ const encodedUrl = '/some-project/-/refs/main/logs_tree/with%20%24peci%40l%20ch%40rs%2F';
+ expect(axios.get).toHaveBeenCalledWith(encodedUrl, expect.anything());
+ });
+
+ it('calls axios get once per batch', async () => {
+ await Promise.all([requestCommits(0), requestCommits(1), requestCommits(23)]);
+
+ expect(axios.get.mock.calls.length).toEqual(1);
+ });
+
+ it('calls axios get twice if an offset is larger than 25', async () => {
+ await requestCommits(100);
+
+ expect(axios.get.mock.calls[0][1]).toEqual({ params: { format: 'json', offset: 75 } });
+ expect(axios.get.mock.calls[1][1]).toEqual({ params: { format: 'json', offset: 100 } });
+ });
+
+ it('updates the list of requested offsets', async () => {
+ await requestCommits(200);
+
+ expect(isRequested(200)).toBe(true);
+ });
+
+ it('resets the list of requested offsets', async () => {
+ await requestCommits(300);
+
+ resetRequestedCommits();
+ expect(isRequested(300)).toBe(false);
+ });
+
+ it('calls `createFlash` when the request fails', async () => {
+ const invalidPath = '/#@ some/path';
+ const invalidUrl = `${url}${invalidPath}`;
+ mock.onGet(invalidUrl).replyOnce(httpStatus.INTERNAL_SERVER_ERROR, [], {});
+
+ await requestCommits(1, 'my-project', invalidPath);
+
+ expect(createFlash).toHaveBeenCalledWith({ message: I18N_COMMIT_DATA_FETCH_ERROR });
+ });
+});
diff --git a/spec/frontend/repository/components/blob_content_viewer_spec.js b/spec/frontend/repository/components/blob_content_viewer_spec.js
index 8331adcdfc2..59db537282b 100644
--- a/spec/frontend/repository/components/blob_content_viewer_spec.js
+++ b/spec/frontend/repository/components/blob_content_viewer_spec.js
@@ -11,13 +11,18 @@ import BlobHeader from '~/blob/components/blob_header.vue';
import BlobButtonGroup from '~/repository/components/blob_button_group.vue';
import BlobContentViewer from '~/repository/components/blob_content_viewer.vue';
import BlobEdit from '~/repository/components/blob_edit.vue';
+import ForkSuggestion from '~/repository/components/fork_suggestion.vue';
import { loadViewer, viewerProps } from '~/repository/components/blob_viewers';
import DownloadViewer from '~/repository/components/blob_viewers/download_viewer.vue';
import EmptyViewer from '~/repository/components/blob_viewers/empty_viewer.vue';
import TextViewer from '~/repository/components/blob_viewers/text_viewer.vue';
import blobInfoQuery from '~/repository/queries/blob_info.query.graphql';
+import { redirectTo } from '~/lib/utils/url_utility';
+import { isLoggedIn } from '~/lib/utils/common_utils';
jest.mock('~/repository/components/blob_viewers');
+jest.mock('~/lib/utils/url_utility');
+jest.mock('~/lib/utils/common_utils');
let wrapper;
let mockResolver;
@@ -34,12 +39,14 @@ const simpleMockData = {
webPath: 'some_file.js',
editBlobPath: 'some_file.js/edit',
ideEditPath: 'some_file.js/ide/edit',
+ forkAndEditPath: 'some_file.js/fork/edit',
+ ideForkAndEditPath: 'some_file.js/fork/ide',
+ canModifyBlob: true,
storedExternally: false,
rawPath: 'some_file.js',
externalStorageUrl: 'some_file.js',
replacePath: 'some_file.js/replace',
deletePath: 'some_file.js/delete',
- forkPath: 'some_file.js/fork',
simpleViewer: {
fileType: 'text',
tooLarge: false,
@@ -62,6 +69,8 @@ const projectMockData = {
userPermissions: {
pushCode: true,
downloadCode: true,
+ createMergeRequestIn: true,
+ forkProject: true,
},
repository: {
empty: false,
@@ -82,6 +91,8 @@ const createComponentWithApollo = (mockData = {}, inject = {}) => {
emptyRepo = defaultEmptyRepo,
canPushCode = defaultPushCode,
canDownloadCode = defaultDownloadCode,
+ createMergeRequestIn = projectMockData.userPermissions.createMergeRequestIn,
+ forkProject = projectMockData.userPermissions.forkProject,
pathLocks = [],
} = mockData;
@@ -89,7 +100,12 @@ const createComponentWithApollo = (mockData = {}, inject = {}) => {
data: {
project: {
id: '1234',
- userPermissions: { pushCode: canPushCode, downloadCode: canDownloadCode },
+ userPermissions: {
+ pushCode: canPushCode,
+ downloadCode: canDownloadCode,
+ createMergeRequestIn,
+ forkProject,
+ },
pathLocks: {
nodes: pathLocks,
},
@@ -158,9 +174,16 @@ describe('Blob content viewer component', () => {
const findBlobEdit = () => wrapper.findComponent(BlobEdit);
const findBlobContent = () => wrapper.findComponent(BlobContent);
const findBlobButtonGroup = () => wrapper.findComponent(BlobButtonGroup);
+ const findForkSuggestion = () => wrapper.findComponent(ForkSuggestion);
+
+ beforeEach(() => {
+ gon.features = { refactorTextViewer: true };
+ isLoggedIn.mockReturnValue(true);
+ });
afterEach(() => {
wrapper.destroy();
+ mockAxios.reset();
});
it('renders a GlLoadingIcon component', () => {
@@ -183,7 +206,6 @@ describe('Blob content viewer component', () => {
it('renders a BlobContent component', () => {
expect(findBlobContent().props('loading')).toEqual(false);
- expect(findBlobContent().props('content')).toEqual('raw content');
expect(findBlobContent().props('isRawContent')).toBe(true);
expect(findBlobContent().props('activeViewer')).toEqual({
fileType: 'text',
@@ -192,6 +214,16 @@ describe('Blob content viewer component', () => {
renderError: null,
});
});
+
+ describe('legacy viewers', () => {
+ it('loads a legacy viewer when a viewer component is not available', async () => {
+ createComponentWithApollo({ blobs: { ...simpleMockData, fileType: 'unknown' } });
+ await waitForPromises();
+
+ expect(mockAxios.history.get).toHaveLength(1);
+ expect(mockAxios.history.get[0].url).toEqual('some_file.js?format=json&viewer=simple');
+ });
+ });
});
describe('rich viewer', () => {
@@ -210,7 +242,6 @@ describe('Blob content viewer component', () => {
it('renders a BlobContent component', () => {
expect(findBlobContent().props('loading')).toEqual(false);
- expect(findBlobContent().props('content')).toEqual('raw content');
expect(findBlobContent().props('isRawContent')).toBe(true);
expect(findBlobContent().props('activeViewer')).toEqual({
fileType: 'markup',
@@ -241,18 +272,12 @@ describe('Blob content viewer component', () => {
});
describe('legacy viewers', () => {
- it('does not load a legacy viewer when a rich viewer is not available', async () => {
- createComponentWithApollo({ blobs: simpleMockData });
- await waitForPromises();
-
- expect(mockAxios.history.get).toHaveLength(0);
- });
-
- it('loads a legacy viewer when a rich viewer is available', async () => {
- createComponentWithApollo({ blobs: richMockData });
+ it('loads a legacy viewer when a viewer component is not available', async () => {
+ createComponentWithApollo({ blobs: { ...richMockData, fileType: 'unknown' } });
await waitForPromises();
expect(mockAxios.history.get).toHaveLength(1);
+ expect(mockAxios.history.get[0].url).toEqual('some_file.js?format=json&viewer=rich');
});
});
@@ -462,7 +487,7 @@ describe('Blob content viewer component', () => {
});
it('does not render if not logged in', async () => {
- window.gon.current_user_id = null;
+ isLoggedIn.mockReturnValueOnce(false);
fullFactory({
mockData: { blobInfo: simpleMockData },
@@ -506,4 +531,60 @@ describe('Blob content viewer component', () => {
);
});
});
+
+ describe('edit blob', () => {
+ beforeEach(() => {
+ fullFactory({
+ mockData: { blobInfo: simpleMockData },
+ stubs: {
+ BlobContent: true,
+ BlobReplace: true,
+ },
+ });
+ });
+
+ it('simple edit redirects to the simple editor', () => {
+ findBlobEdit().vm.$emit('edit', 'simple');
+ expect(redirectTo).toHaveBeenCalledWith(simpleMockData.editBlobPath);
+ });
+
+ it('IDE edit redirects to the IDE editor', () => {
+ findBlobEdit().vm.$emit('edit', 'ide');
+ expect(redirectTo).toHaveBeenCalledWith(simpleMockData.ideEditPath);
+ });
+
+ it.each`
+ loggedIn | canModifyBlob | createMergeRequestIn | forkProject | showForkSuggestion
+ ${true} | ${false} | ${true} | ${true} | ${true}
+ ${false} | ${false} | ${true} | ${true} | ${false}
+ ${true} | ${true} | ${false} | ${true} | ${false}
+ ${true} | ${true} | ${true} | ${false} | ${false}
+ `(
+ 'shows/hides a fork suggestion according to a set of conditions',
+ async ({
+ loggedIn,
+ canModifyBlob,
+ createMergeRequestIn,
+ forkProject,
+ showForkSuggestion,
+ }) => {
+ isLoggedIn.mockReturnValueOnce(loggedIn);
+ fullFactory({
+ mockData: {
+ blobInfo: { ...simpleMockData, canModifyBlob },
+ project: { userPermissions: { createMergeRequestIn, forkProject } },
+ },
+ stubs: {
+ BlobContent: true,
+ BlobButtonGroup: true,
+ },
+ });
+
+ findBlobEdit().vm.$emit('edit', 'simple');
+ await nextTick();
+
+ expect(findForkSuggestion().exists()).toBe(showForkSuggestion);
+ },
+ );
+ });
});
diff --git a/spec/frontend/repository/components/blob_edit_spec.js b/spec/frontend/repository/components/blob_edit_spec.js
index 11739674bc9..e2de7bc2957 100644
--- a/spec/frontend/repository/components/blob_edit_spec.js
+++ b/spec/frontend/repository/components/blob_edit_spec.js
@@ -7,6 +7,7 @@ const DEFAULT_PROPS = {
editPath: 'some_file.js/edit',
webIdePath: 'some_file.js/ide/edit',
showEditButton: true,
+ needsToFork: false,
};
describe('BlobEdit component', () => {
@@ -56,7 +57,6 @@ describe('BlobEdit component', () => {
it('renders the Edit button', () => {
createComponent();
- expect(findEditButton().attributes('href')).toBe(DEFAULT_PROPS.editPath);
expect(findEditButton().text()).toBe('Edit');
expect(findEditButton()).not.toBeDisabled();
});
@@ -64,7 +64,6 @@ describe('BlobEdit component', () => {
it('renders the Web IDE button', () => {
createComponent();
- expect(findWebIdeButton().attributes('href')).toBe(DEFAULT_PROPS.webIdePath);
expect(findWebIdeButton().text()).toBe('Web IDE');
expect(findWebIdeButton()).not.toBeDisabled();
});
@@ -72,13 +71,14 @@ describe('BlobEdit component', () => {
it('renders WebIdeLink component', () => {
createComponent(true);
- const { editPath: editUrl, webIdePath: webIdeUrl } = DEFAULT_PROPS;
+ const { editPath: editUrl, webIdePath: webIdeUrl, needsToFork } = DEFAULT_PROPS;
expect(findWebIdeLink().props()).toMatchObject({
editUrl,
webIdeUrl,
isBlob: true,
showEditButton: true,
+ needsToFork,
});
});
diff --git a/spec/frontend/repository/components/blob_viewers/video_viewer_spec.js b/spec/frontend/repository/components/blob_viewers/video_viewer_spec.js
new file mode 100644
index 00000000000..34448c03b31
--- /dev/null
+++ b/spec/frontend/repository/components/blob_viewers/video_viewer_spec.js
@@ -0,0 +1,22 @@
+import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
+import VideoViewer from '~/repository/components/blob_viewers/video_viewer.vue';
+
+describe('Video Viewer', () => {
+ let wrapper;
+
+ const propsData = { url: 'some/video.mp4' };
+
+ const createComponent = () => {
+ wrapper = shallowMountExtended(VideoViewer, { propsData });
+ };
+
+ const findVideo = () => wrapper.findByTestId('video');
+
+ it('renders a Video element', () => {
+ createComponent();
+
+ expect(findVideo().exists()).toBe(true);
+ expect(findVideo().attributes('src')).toBe(propsData.url);
+ expect(findVideo().attributes('controls')).not.toBeUndefined();
+ });
+});
diff --git a/spec/frontend/repository/components/breadcrumbs_spec.js b/spec/frontend/repository/components/breadcrumbs_spec.js
index 0733cffe4f4..eb957c635ac 100644
--- a/spec/frontend/repository/components/breadcrumbs_spec.js
+++ b/spec/frontend/repository/components/breadcrumbs_spec.js
@@ -2,6 +2,7 @@ import { GlDropdown } from '@gitlab/ui';
import { shallowMount, RouterLinkStub } from '@vue/test-utils';
import Breadcrumbs from '~/repository/components/breadcrumbs.vue';
import UploadBlobModal from '~/repository/components/upload_blob_modal.vue';
+import NewDirectoryModal from '~/repository/components/new_directory_modal.vue';
const defaultMockRoute = {
name: 'blobPath',
@@ -10,7 +11,7 @@ const defaultMockRoute = {
describe('Repository breadcrumbs component', () => {
let wrapper;
- const factory = (currentPath, extraProps = {}, mockRoute = {}) => {
+ const factory = (currentPath, extraProps = {}, mockRoute = {}, newDirModal = true) => {
const $apollo = {
queries: {
userPermissions: {
@@ -34,10 +35,12 @@ describe('Repository breadcrumbs component', () => {
},
$apollo,
},
+ provide: { glFeatures: { newDirModal } },
});
};
const findUploadBlobModal = () => wrapper.find(UploadBlobModal);
+ const findNewDirectoryModal = () => wrapper.find(NewDirectoryModal);
afterEach(() => {
wrapper.destroy();
@@ -121,4 +124,37 @@ describe('Repository breadcrumbs component', () => {
expect(findUploadBlobModal().exists()).toBe(true);
});
});
+
+ describe('renders the new directory modal', () => {
+ describe('with the feature flag enabled', () => {
+ beforeEach(() => {
+ window.gon.features = {
+ newDirModal: true,
+ };
+ factory('/', { canEditTree: true });
+ });
+
+ it('does not render the modal while loading', () => {
+ expect(findNewDirectoryModal().exists()).toBe(false);
+ });
+
+ it('renders the modal once loaded', async () => {
+ wrapper.setData({ $apollo: { queries: { userPermissions: { loading: false } } } });
+
+ await wrapper.vm.$nextTick();
+
+ expect(findNewDirectoryModal().exists()).toBe(true);
+ });
+ });
+
+ describe('with the feature flag disabled', () => {
+ it('does not render the modal', () => {
+ window.gon.features = {
+ newDirModal: false,
+ };
+ factory('/', { canEditTree: true }, {}, {}, false);
+ expect(findNewDirectoryModal().exists()).toBe(false);
+ });
+ });
+ });
});
diff --git a/spec/frontend/repository/components/fork_suggestion_spec.js b/spec/frontend/repository/components/fork_suggestion_spec.js
new file mode 100644
index 00000000000..36a48a3fdb8
--- /dev/null
+++ b/spec/frontend/repository/components/fork_suggestion_spec.js
@@ -0,0 +1,44 @@
+import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
+import ForkSuggestion from '~/repository/components/fork_suggestion.vue';
+
+const DEFAULT_PROPS = { forkPath: 'some_file.js/fork' };
+
+describe('ForkSuggestion component', () => {
+ let wrapper;
+
+ const createComponent = () => {
+ wrapper = shallowMountExtended(ForkSuggestion, {
+ propsData: { ...DEFAULT_PROPS },
+ });
+ };
+
+ beforeEach(() => createComponent());
+
+ afterEach(() => wrapper.destroy());
+
+ const { i18n } = ForkSuggestion;
+ const findMessage = () => wrapper.findByTestId('message');
+ const findForkButton = () => wrapper.findByTestId('fork');
+ const findCancelButton = () => wrapper.findByTestId('cancel');
+
+ it('renders a message', () => {
+ expect(findMessage().text()).toBe(i18n.message);
+ });
+
+ it('renders a Fork button', () => {
+ const forkButton = findForkButton();
+
+ expect(forkButton.text()).toBe(i18n.fork);
+ expect(forkButton.attributes('href')).toBe(DEFAULT_PROPS.forkPath);
+ });
+
+ it('renders a Cancel button', () => {
+ expect(findCancelButton().text()).toBe(i18n.cancel);
+ });
+
+ it('emits a cancel event when Cancel button is clicked', () => {
+ findCancelButton().vm.$emit('click');
+
+ expect(wrapper.emitted('cancel')).toEqual([[]]);
+ });
+});
diff --git a/spec/frontend/repository/components/new_directory_modal_spec.js b/spec/frontend/repository/components/new_directory_modal_spec.js
new file mode 100644
index 00000000000..fe7f024e3ea
--- /dev/null
+++ b/spec/frontend/repository/components/new_directory_modal_spec.js
@@ -0,0 +1,203 @@
+import { GlModal, GlFormTextarea, GlToggle } from '@gitlab/ui';
+import { shallowMount } from '@vue/test-utils';
+import { nextTick } from 'vue';
+import axios from 'axios';
+import MockAdapter from 'axios-mock-adapter';
+import waitForPromises from 'helpers/wait_for_promises';
+import createFlash from '~/flash';
+import httpStatusCodes from '~/lib/utils/http_status';
+import { visitUrl } from '~/lib/utils/url_utility';
+import NewDirectoryModal from '~/repository/components/new_directory_modal.vue';
+
+jest.mock('~/flash');
+jest.mock('~/lib/utils/url_utility', () => ({
+ visitUrl: jest.fn(),
+}));
+
+const initialProps = {
+ modalTitle: 'Create New Directory',
+ modalId: 'modal-new-directory',
+ commitMessage: 'Add new directory',
+ targetBranch: 'some-target-branch',
+ originalBranch: 'master',
+ canPushCode: true,
+ path: 'create_dir',
+};
+
+const defaultFormValue = {
+ dirName: 'foo',
+ originalBranch: initialProps.originalBranch,
+ branchName: initialProps.targetBranch,
+ commitMessage: initialProps.commitMessage,
+ createNewMr: true,
+};
+
+describe('NewDirectoryModal', () => {
+ let wrapper;
+ let mock;
+
+ const createComponent = (props = {}) => {
+ wrapper = shallowMount(NewDirectoryModal, {
+ propsData: {
+ ...initialProps,
+ ...props,
+ },
+ attrs: {
+ static: true,
+ visible: true,
+ },
+ });
+ };
+
+ const findModal = () => wrapper.findComponent(GlModal);
+ const findDirName = () => wrapper.find('[name="dir_name"]');
+ const findBranchName = () => wrapper.find('[name="branch_name"]');
+ const findCommitMessage = () => wrapper.findComponent(GlFormTextarea);
+ const findMrToggle = () => wrapper.findComponent(GlToggle);
+
+ const fillForm = async (inputValue = {}) => {
+ const {
+ dirName = defaultFormValue.dirName,
+ branchName = defaultFormValue.branchName,
+ commitMessage = defaultFormValue.commitMessage,
+ createNewMr = true,
+ } = inputValue;
+
+ await findDirName().vm.$emit('input', dirName);
+ await findBranchName().vm.$emit('input', branchName);
+ await findCommitMessage().vm.$emit('input', commitMessage);
+ await findMrToggle().vm.$emit('change', createNewMr);
+ await nextTick;
+ };
+
+ const submitForm = async () => {
+ const mockEvent = { preventDefault: jest.fn() };
+ findModal().vm.$emit('primary', mockEvent);
+ await waitForPromises();
+ };
+
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ it('renders modal component', () => {
+ createComponent();
+
+ const { modalTitle: title } = initialProps;
+
+ expect(findModal().props()).toMatchObject({
+ title,
+ size: 'md',
+ actionPrimary: {
+ text: NewDirectoryModal.i18n.PRIMARY_OPTIONS_TEXT,
+ },
+ actionCancel: {
+ text: 'Cancel',
+ },
+ });
+ });
+
+ describe('form', () => {
+ it.each`
+ component | defaultValue | canPushCode | targetBranch | originalBranch | exist
+ ${findDirName} | ${undefined} | ${true} | ${initialProps.targetBranch} | ${initialProps.originalBranch} | ${true}
+ ${findBranchName} | ${initialProps.targetBranch} | ${true} | ${initialProps.targetBranch} | ${initialProps.originalBranch} | ${true}
+ ${findBranchName} | ${undefined} | ${false} | ${initialProps.targetBranch} | ${initialProps.originalBranch} | ${false}
+ ${findCommitMessage} | ${initialProps.commitMessage} | ${true} | ${initialProps.targetBranch} | ${initialProps.originalBranch} | ${true}
+ ${findMrToggle} | ${'true'} | ${true} | ${'new-target-branch'} | ${'master'} | ${true}
+ ${findMrToggle} | ${'true'} | ${true} | ${'master'} | ${'master'} | ${true}
+ `(
+ 'has the correct form fields ',
+ ({ component, defaultValue, canPushCode, targetBranch, originalBranch, exist }) => {
+ createComponent({
+ canPushCode,
+ targetBranch,
+ originalBranch,
+ });
+ const formField = component();
+
+ if (!exist) {
+ expect(formField.exists()).toBe(false);
+ return;
+ }
+
+ expect(formField.exists()).toBe(true);
+ expect(formField.attributes('value')).toBe(defaultValue);
+ },
+ );
+ });
+
+ describe('form submission', () => {
+ beforeEach(async () => {
+ mock = new MockAdapter(axios);
+ });
+
+ afterEach(() => {
+ mock.restore();
+ });
+
+ describe('valid form', () => {
+ beforeEach(() => {
+ createComponent();
+ });
+
+ it('passes the formData', async () => {
+ const {
+ dirName,
+ branchName,
+ commitMessage,
+ originalBranch,
+ createNewMr,
+ } = defaultFormValue;
+ mock.onPost(initialProps.path).reply(httpStatusCodes.OK, {});
+ await fillForm();
+ await submitForm();
+
+ expect(mock.history.post[0].data.get('dir_name')).toEqual(dirName);
+ expect(mock.history.post[0].data.get('branch_name')).toEqual(branchName);
+ expect(mock.history.post[0].data.get('commit_message')).toEqual(commitMessage);
+ expect(mock.history.post[0].data.get('original_branch')).toEqual(originalBranch);
+ expect(mock.history.post[0].data.get('create_merge_request')).toEqual(String(createNewMr));
+ });
+
+ it('does not submit "create_merge_request" formData if createNewMr is not checked', async () => {
+ mock.onPost(initialProps.path).reply(httpStatusCodes.OK, {});
+ await fillForm({ createNewMr: false });
+ await submitForm();
+ expect(mock.history.post[0].data.get('create_merge_request')).toBeNull();
+ });
+
+ it('redirects to the new directory', async () => {
+ const response = { filePath: 'new-dir-path' };
+ mock.onPost(initialProps.path).reply(httpStatusCodes.OK, response);
+
+ await fillForm({ dirName: 'foo', branchName: 'master', commitMessage: 'foo' });
+ await submitForm();
+
+ expect(visitUrl).toHaveBeenCalledWith(response.filePath);
+ });
+ });
+
+ describe('invalid form', () => {
+ beforeEach(() => {
+ createComponent();
+ });
+
+ it('disables submit button', async () => {
+ await fillForm({ dirName: '', branchName: '', commitMessage: '' });
+ expect(findModal().props('actionPrimary').attributes[0].disabled).toBe(true);
+ });
+
+ it('creates a flash error', async () => {
+ mock.onPost(initialProps.path).timeout();
+
+ await fillForm({ dirName: 'foo', branchName: 'master', commitMessage: 'foo' });
+ await submitForm();
+
+ expect(createFlash).toHaveBeenCalledWith({
+ message: NewDirectoryModal.i18n.ERROR_MESSAGE,
+ });
+ });
+ });
+ });
+});
diff --git a/spec/frontend/repository/components/table/__snapshots__/row_spec.js.snap b/spec/frontend/repository/components/table/__snapshots__/row_spec.js.snap
index 6f461f4c69b..26064e9b248 100644
--- a/spec/frontend/repository/components/table/__snapshots__/row_spec.js.snap
+++ b/spec/frontend/repository/components/table/__snapshots__/row_spec.js.snap
@@ -31,25 +31,36 @@ exports[`Repository table row component renders a symlink table row 1`] = `
<!---->
- <!---->
+ <gl-icon-stub
+ class="ml-1"
+ name="lock"
+ size="12"
+ title="Locked by Root"
+ />
</td>
<td
class="d-none d-sm-table-cell tree-commit cursor-default"
>
- <gl-skeleton-loading-stub
- class="h-auto"
- lines="1"
+ <gl-link-stub
+ class="str-truncated-100 tree-commit-link"
/>
+
+ <gl-intersection-observer-stub>
+ <!---->
+ </gl-intersection-observer-stub>
</td>
<td
class="tree-time-ago text-right cursor-default"
>
- <gl-skeleton-loading-stub
- class="ml-auto h-auto w-50"
- lines="1"
+ <timeago-tooltip-stub
+ cssclass=""
+ time="2019-01-01"
+ tooltipplacement="top"
/>
+
+ <!---->
</td>
</tr>
`;
@@ -85,25 +96,36 @@ exports[`Repository table row component renders table row 1`] = `
<!---->
- <!---->
+ <gl-icon-stub
+ class="ml-1"
+ name="lock"
+ size="12"
+ title="Locked by Root"
+ />
</td>
<td
class="d-none d-sm-table-cell tree-commit cursor-default"
>
- <gl-skeleton-loading-stub
- class="h-auto"
- lines="1"
+ <gl-link-stub
+ class="str-truncated-100 tree-commit-link"
/>
+
+ <gl-intersection-observer-stub>
+ <!---->
+ </gl-intersection-observer-stub>
</td>
<td
class="tree-time-ago text-right cursor-default"
>
- <gl-skeleton-loading-stub
- class="ml-auto h-auto w-50"
- lines="1"
+ <timeago-tooltip-stub
+ cssclass=""
+ time="2019-01-01"
+ tooltipplacement="top"
/>
+
+ <!---->
</td>
</tr>
`;
@@ -139,25 +161,36 @@ exports[`Repository table row component renders table row for path with special
<!---->
- <!---->
+ <gl-icon-stub
+ class="ml-1"
+ name="lock"
+ size="12"
+ title="Locked by Root"
+ />
</td>
<td
class="d-none d-sm-table-cell tree-commit cursor-default"
>
- <gl-skeleton-loading-stub
- class="h-auto"
- lines="1"
+ <gl-link-stub
+ class="str-truncated-100 tree-commit-link"
/>
+
+ <gl-intersection-observer-stub>
+ <!---->
+ </gl-intersection-observer-stub>
</td>
<td
class="tree-time-ago text-right cursor-default"
>
- <gl-skeleton-loading-stub
- class="ml-auto h-auto w-50"
- lines="1"
+ <timeago-tooltip-stub
+ cssclass=""
+ time="2019-01-01"
+ tooltipplacement="top"
/>
+
+ <!---->
</td>
</tr>
`;
diff --git a/spec/frontend/repository/components/table/index_spec.js b/spec/frontend/repository/components/table/index_spec.js
index e9e51abaf0f..c8dddefc4f2 100644
--- a/spec/frontend/repository/components/table/index_spec.js
+++ b/spec/frontend/repository/components/table/index_spec.js
@@ -34,17 +34,45 @@ const MOCK_BLOBS = [
},
];
-function factory({ path, isLoading = false, hasMore = true, entries = {} }) {
+const MOCK_COMMITS = [
+ {
+ fileName: 'blob.md',
+ type: 'blob',
+ commit: {
+ message: 'Updated blob.md',
+ },
+ },
+ {
+ fileName: 'blob2.md',
+ type: 'blob',
+ commit: {
+ message: 'Updated blob2.md',
+ },
+ },
+ {
+ fileName: 'blob3.md',
+ type: 'blob',
+ commit: {
+ message: 'Updated blob3.md',
+ },
+ },
+];
+
+function factory({ path, isLoading = false, hasMore = true, entries = {}, commits = [] }) {
vm = shallowMount(Table, {
propsData: {
path,
isLoading,
entries,
hasMore,
+ commits,
},
mocks: {
$apollo,
},
+ provide: {
+ glFeatures: { lazyLoadCommits: true },
+ },
});
}
@@ -82,12 +110,15 @@ describe('Repository table component', () => {
entries: {
blobs: MOCK_BLOBS,
},
+ commits: MOCK_COMMITS,
});
const rows = vm.findAll(TableRow);
expect(rows.length).toEqual(3);
expect(rows.at(2).attributes().mode).toEqual('120000');
+ expect(rows.at(2).props().rowNumber).toBe(2);
+ expect(rows.at(2).props().commitInfo).toEqual(MOCK_COMMITS[2]);
});
describe('Show more button', () => {
diff --git a/spec/frontend/repository/components/table/row_spec.js b/spec/frontend/repository/components/table/row_spec.js
index da28c9873d9..76e9f7da011 100644
--- a/spec/frontend/repository/components/table/row_spec.js
+++ b/spec/frontend/repository/components/table/row_spec.js
@@ -1,10 +1,12 @@
-import { GlBadge, GlLink, GlIcon } from '@gitlab/ui';
+import { GlBadge, GlLink, GlIcon, GlIntersectionObserver } from '@gitlab/ui';
import { shallowMount, RouterLinkStub } from '@vue/test-utils';
import { createMockDirective, getBinding } from 'helpers/vue_mock_directive';
import TableRow from '~/repository/components/table/row.vue';
import FileIcon from '~/vue_shared/components/file_icon.vue';
import { FILE_SYMLINK_MODE } from '~/vue_shared/constants';
+const COMMIT_MOCK = { lockLabel: 'Locked by Root', committedDate: '2019-01-01' };
+
let vm;
let $router;
@@ -20,12 +22,14 @@ function factory(propsData = {}) {
projectPath: 'gitlab-org/gitlab-ce',
url: `https://test.com`,
totalEntries: 10,
+ commitInfo: COMMIT_MOCK,
+ rowNumber: 123,
},
directives: {
GlHoverLoad: createMockDirective(),
},
provide: {
- glFeatures: { refactorBlobViewer: true },
+ glFeatures: { refactorBlobViewer: true, lazyLoadCommits: true },
},
mocks: {
$router,
@@ -40,6 +44,7 @@ function factory(propsData = {}) {
describe('Repository table row component', () => {
const findRouterLink = () => vm.find(RouterLinkStub);
+ const findIntersectionObserver = () => vm.findComponent(GlIntersectionObserver);
afterEach(() => {
vm.destroy();
@@ -226,8 +231,6 @@ describe('Repository table row component', () => {
currentPath: '/',
});
- vm.setData({ commit: { lockLabel: 'Locked by Root', committedDate: '2019-01-01' } });
-
return vm.vm.$nextTick().then(() => {
expect(vm.find(GlIcon).exists()).toBe(true);
expect(vm.find(GlIcon).props('name')).toBe('lock');
@@ -246,4 +249,27 @@ describe('Repository table row component', () => {
expect(vm.find(FileIcon).props('loading')).toBe(true);
});
+
+ describe('row visibility', () => {
+ beforeEach(() => {
+ factory({
+ id: '1',
+ sha: '1',
+ path: 'test',
+ type: 'tree',
+ currentPath: '/',
+ });
+ });
+ it('emits a `row-appear` event', () => {
+ findIntersectionObserver().vm.$emit('appear');
+ expect(vm.emitted('row-appear')).toEqual([
+ [
+ {
+ hasCommit: true,
+ rowNumber: 123,
+ },
+ ],
+ ]);
+ });
+ });
});
diff --git a/spec/frontend/repository/components/tree_content_spec.js b/spec/frontend/repository/components/tree_content_spec.js
index e36287eff29..49397c77215 100644
--- a/spec/frontend/repository/components/tree_content_spec.js
+++ b/spec/frontend/repository/components/tree_content_spec.js
@@ -3,6 +3,13 @@ import paginatedTreeQuery from 'shared_queries/repository/paginated_tree.query.g
import FilePreview from '~/repository/components/preview/index.vue';
import FileTable from '~/repository/components/table/index.vue';
import TreeContent from '~/repository/components/tree_content.vue';
+import { loadCommits, isRequested, resetRequestedCommits } from '~/repository/commits_service';
+
+jest.mock('~/repository/commits_service', () => ({
+ loadCommits: jest.fn(() => Promise.resolve()),
+ isRequested: jest.fn(),
+ resetRequestedCommits: jest.fn(),
+}));
let vm;
let $apollo;
@@ -23,6 +30,7 @@ function factory(path, data = () => ({})) {
glFeatures: {
increasePageSizeExponentially: true,
paginatedTreeGraphqlQuery: true,
+ lazyLoadCommits: true,
},
},
});
@@ -45,7 +53,7 @@ describe('Repository table component', () => {
expect(vm.find(FilePreview).exists()).toBe(true);
});
- it('trigger fetchFiles when mounted', async () => {
+ it('trigger fetchFiles and resetRequestedCommits when mounted', async () => {
factory('/');
jest.spyOn(vm.vm, 'fetchFiles').mockImplementation(() => {});
@@ -53,6 +61,7 @@ describe('Repository table component', () => {
await vm.vm.$nextTick();
expect(vm.vm.fetchFiles).toHaveBeenCalled();
+ expect(resetRequestedCommits).toHaveBeenCalled();
});
describe('normalizeData', () => {
@@ -180,4 +189,15 @@ describe('Repository table component', () => {
});
});
});
+
+ it('loads commit data when row-appear event is emitted', () => {
+ const path = 'some/path';
+ const rowNumber = 1;
+
+ factory(path);
+ findFileTable().vm.$emit('row-appear', { hasCommit: false, rowNumber });
+
+ expect(isRequested).toHaveBeenCalledWith(rowNumber);
+ expect(loadCommits).toHaveBeenCalledWith('', path, '', rowNumber);
+ });
});
diff --git a/spec/frontend/repository/router_spec.js b/spec/frontend/repository/router_spec.js
index bb82fa706fd..3f822db601f 100644
--- a/spec/frontend/repository/router_spec.js
+++ b/spec/frontend/repository/router_spec.js
@@ -24,4 +24,32 @@ describe('Repository router spec', () => {
expect(componentsForRoute).toContain(component);
}
});
+
+ describe('Storing Web IDE path globally', () => {
+ const proj = 'foo-bar-group/foo-bar-proj';
+ let originalGl;
+
+ beforeEach(() => {
+ originalGl = window.gl;
+ });
+
+ afterEach(() => {
+ window.gl = originalGl;
+ });
+
+ it.each`
+ path | branch | expectedPath
+ ${'/'} | ${'main'} | ${`/-/ide/project/${proj}/edit/main/-/`}
+ ${'/tree/main'} | ${'main'} | ${`/-/ide/project/${proj}/edit/main/-/`}
+ ${'/tree/feat(test)'} | ${'feat(test)'} | ${`/-/ide/project/${proj}/edit/feat(test)/-/`}
+ ${'/-/tree/main'} | ${'main'} | ${`/-/ide/project/${proj}/edit/main/-/`}
+ ${'/-/tree/main/app/assets'} | ${'main'} | ${`/-/ide/project/${proj}/edit/main/-/app/assets/`}
+ ${'/-/blob/main/file.md'} | ${'main'} | ${`/-/ide/project/${proj}/edit/main/-/file.md`}
+ `('generates the correct Web IDE url for $path', ({ path, branch, expectedPath } = {}) => {
+ const router = createRouter(proj, branch);
+
+ router.push(path);
+ expect(window.gl.webIDEPath).toBe(expectedPath);
+ });
+ });
});
diff --git a/spec/frontend/runner/admin_runners/admin_runners_app_spec.js b/spec/frontend/runner/admin_runners/admin_runners_app_spec.js
index 3292f635f6b..33e9c122080 100644
--- a/spec/frontend/runner/admin_runners/admin_runners_app_spec.js
+++ b/spec/frontend/runner/admin_runners/admin_runners_app_spec.js
@@ -1,3 +1,4 @@
+import { GlLink } from '@gitlab/ui';
import { createLocalVue, mount, shallowMount } from '@vue/test-utils';
import VueApollo from 'vue-apollo';
import createMockApollo from 'helpers/mock_apollo_helper';
@@ -5,6 +6,7 @@ import setWindowLocation from 'helpers/set_window_location_helper';
import { extendedWrapper } from 'helpers/vue_test_utils_helper';
import waitForPromises from 'helpers/wait_for_promises';
import createFlash from '~/flash';
+import { getIdFromGraphQLId } from '~/graphql_shared/utils';
import { updateHistory } from '~/lib/utils/url_utility';
import AdminRunnersApp from '~/runner/admin_runners/admin_runners_app.vue';
@@ -12,7 +14,6 @@ import RunnerFilteredSearchBar from '~/runner/components/runner_filtered_search_
import RunnerList from '~/runner/components/runner_list.vue';
import RunnerManualSetupHelp from '~/runner/components/runner_manual_setup_help.vue';
import RunnerPagination from '~/runner/components/runner_pagination.vue';
-import RunnerTypeHelp from '~/runner/components/runner_type_help.vue';
import {
ADMIN_FILTERED_SEARCH_NAMESPACE,
@@ -49,7 +50,6 @@ describe('AdminRunnersApp', () => {
let wrapper;
let mockRunnersQuery;
- const findRunnerTypeHelp = () => wrapper.findComponent(RunnerTypeHelp);
const findRunnerManualSetupHelp = () => wrapper.findComponent(RunnerManualSetupHelp);
const findRunnerList = () => wrapper.findComponent(RunnerList);
const findRunnerPagination = () => extendedWrapper(wrapper.findComponent(RunnerPagination));
@@ -86,10 +86,6 @@ describe('AdminRunnersApp', () => {
wrapper.destroy();
});
- it('shows the runner type help', () => {
- expect(findRunnerTypeHelp().exists()).toBe(true);
- });
-
it('shows the runner setup instructions', () => {
expect(findRunnerManualSetupHelp().props('registrationToken')).toBe(mockRegistrationToken);
});
@@ -98,6 +94,20 @@ describe('AdminRunnersApp', () => {
expect(findRunnerList().props('runners')).toEqual(runnersData.data.runners.nodes);
});
+ it('runner item links to the runner admin page', async () => {
+ createComponent({ mountFn: mount });
+
+ await waitForPromises();
+
+ const { id, shortSha } = runnersData.data.runners.nodes[0];
+ const numericId = getIdFromGraphQLId(id);
+
+ const runnerLink = wrapper.find('tr [data-testid="td-summary"]').find(GlLink);
+
+ expect(runnerLink.text()).toBe(`#${numericId} (${shortSha})`);
+ expect(runnerLink.attributes('href')).toBe(`http://localhost/admin/runners/${numericId}`);
+ });
+
it('requests the runners with no filters', () => {
expect(mockRunnersQuery).toHaveBeenLastCalledWith({
status: undefined,
diff --git a/spec/frontend/runner/components/cells/runner_actions_cell_spec.js b/spec/frontend/runner/components/cells/runner_actions_cell_spec.js
index 95f7c38cafc..5aa3879ac3e 100644
--- a/spec/frontend/runner/components/cells/runner_actions_cell_spec.js
+++ b/spec/frontend/runner/components/cells/runner_actions_cell_spec.js
@@ -5,15 +5,18 @@ import { extendedWrapper } from 'helpers/vue_test_utils_helper';
import waitForPromises from 'helpers/wait_for_promises';
import createFlash from '~/flash';
import RunnerActionCell from '~/runner/components/cells/runner_actions_cell.vue';
+import getGroupRunnersQuery from '~/runner/graphql/get_group_runners.query.graphql';
import getRunnersQuery from '~/runner/graphql/get_runners.query.graphql';
import runnerDeleteMutation from '~/runner/graphql/runner_delete.mutation.graphql';
import runnerUpdateMutation from '~/runner/graphql/runner_update.mutation.graphql';
import { captureException } from '~/runner/sentry_utils';
-import { runnerData } from '../../mock_data';
+import { runnersData, runnerData } from '../../mock_data';
-const mockRunner = runnerData.data.runner;
+const mockRunner = runnersData.data.runners.nodes[0];
+const mockRunnerDetails = runnerData.data.runner;
const getRunnersQueryName = getRunnersQuery.definitions[0].name.value;
+const getGroupRunnersQueryName = getGroupRunnersQuery.definitions[0].name.value;
const localVue = createLocalVue();
localVue.use(VueApollo);
@@ -36,6 +39,7 @@ describe('RunnerTypeCell', () => {
propsData: {
runner: {
id: mockRunner.id,
+ adminUrl: mockRunner.adminUrl,
active,
},
},
@@ -61,7 +65,7 @@ describe('RunnerTypeCell', () => {
runnerUpdateMutationHandler.mockResolvedValue({
data: {
runnerUpdate: {
- runner: runnerData.data.runner,
+ runner: mockRunnerDetails,
errors: [],
},
},
@@ -78,7 +82,7 @@ describe('RunnerTypeCell', () => {
it('Displays the runner edit link with the correct href', () => {
createComponent();
- expect(findEditBtn().attributes('href')).toBe('/admin/runners/1');
+ expect(findEditBtn().attributes('href')).toBe(mockRunner.adminUrl);
});
describe.each`
@@ -231,7 +235,7 @@ describe('RunnerTypeCell', () => {
},
},
awaitRefetchQueries: true,
- refetchQueries: [getRunnersQueryName],
+ refetchQueries: [getRunnersQueryName, getGroupRunnersQueryName],
});
});
diff --git a/spec/frontend/runner/components/cells/runner_name_cell_spec.js b/spec/frontend/runner/components/cells/runner_name_cell_spec.js
deleted file mode 100644
index 26055fc0faf..00000000000
--- a/spec/frontend/runner/components/cells/runner_name_cell_spec.js
+++ /dev/null
@@ -1,42 +0,0 @@
-import { GlLink } from '@gitlab/ui';
-import { mount } from '@vue/test-utils';
-import RunnerNameCell from '~/runner/components/cells/runner_name_cell.vue';
-
-const mockId = '1';
-const mockShortSha = '2P6oDVDm';
-const mockDescription = 'runner-1';
-
-describe('RunnerTypeCell', () => {
- let wrapper;
-
- const findLink = () => wrapper.findComponent(GlLink);
-
- const createComponent = () => {
- wrapper = mount(RunnerNameCell, {
- propsData: {
- runner: {
- id: `gid://gitlab/Ci::Runner/${mockId}`,
- shortSha: mockShortSha,
- description: mockDescription,
- },
- },
- });
- };
-
- beforeEach(() => {
- createComponent();
- });
-
- afterEach(() => {
- wrapper.destroy();
- });
-
- it('Displays the runner link with id and short token', () => {
- expect(findLink().text()).toBe(`#${mockId} (${mockShortSha})`);
- expect(findLink().attributes('href')).toBe(`/admin/runners/${mockId}`);
- });
-
- it('Displays the runner description', () => {
- expect(wrapper.text()).toContain(mockDescription);
- });
-});
diff --git a/spec/frontend/runner/components/cells/runner_summary_cell_spec.js b/spec/frontend/runner/components/cells/runner_summary_cell_spec.js
new file mode 100644
index 00000000000..1c9282e0acd
--- /dev/null
+++ b/spec/frontend/runner/components/cells/runner_summary_cell_spec.js
@@ -0,0 +1,51 @@
+import { mount } from '@vue/test-utils';
+import RunnerSummaryCell from '~/runner/components/cells/runner_summary_cell.vue';
+
+const mockId = '1';
+const mockShortSha = '2P6oDVDm';
+const mockDescription = 'runner-1';
+
+describe('RunnerTypeCell', () => {
+ let wrapper;
+
+ const createComponent = (options) => {
+ wrapper = mount(RunnerSummaryCell, {
+ propsData: {
+ runner: {
+ id: `gid://gitlab/Ci::Runner/${mockId}`,
+ shortSha: mockShortSha,
+ description: mockDescription,
+ },
+ },
+ ...options,
+ });
+ };
+
+ beforeEach(() => {
+ createComponent();
+ });
+
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ it('Displays the runner name as id and short token', () => {
+ expect(wrapper.text()).toContain(`#${mockId} (${mockShortSha})`);
+ });
+
+ it('Displays the runner description', () => {
+ expect(wrapper.text()).toContain(mockDescription);
+ });
+
+ it('Displays a custom slot', () => {
+ const slotContent = 'My custom runner summary';
+
+ createComponent({
+ slots: {
+ 'runner-name': slotContent,
+ },
+ });
+
+ expect(wrapper.text()).toContain(slotContent);
+ });
+});
diff --git a/spec/frontend/runner/components/runner_list_spec.js b/spec/frontend/runner/components/runner_list_spec.js
index 344d1e5c150..e24dffea1eb 100644
--- a/spec/frontend/runner/components/runner_list_spec.js
+++ b/spec/frontend/runner/components/runner_list_spec.js
@@ -1,4 +1,4 @@
-import { GlLink, GlTable, GlSkeletonLoader } from '@gitlab/ui';
+import { GlTable, GlSkeletonLoader } from '@gitlab/ui';
import { mount, shallowMount } from '@vue/test-utils';
import { cloneDeep } from 'lodash';
import { extendedWrapper } from 'helpers/vue_test_utils_helper';
@@ -67,11 +67,11 @@ describe('RunnerList', () => {
// Badges
expect(findCell({ fieldKey: 'type' }).text()).toMatchInterpolatedText('specific paused');
- // Runner identifier
- expect(findCell({ fieldKey: 'name' }).text()).toContain(
+ // Runner summary
+ expect(findCell({ fieldKey: 'summary' }).text()).toContain(
`#${getIdFromGraphQLId(id)} (${shortSha})`,
);
- expect(findCell({ fieldKey: 'name' }).text()).toContain(description);
+ expect(findCell({ fieldKey: 'summary' }).text()).toContain(description);
// Other fields
expect(findCell({ fieldKey: 'version' }).text()).toBe(version);
@@ -136,12 +136,11 @@ describe('RunnerList', () => {
});
});
- it('Links to the runner page', () => {
- const { id } = mockRunners[0];
+ it('Shows runner identifier', () => {
+ const { id, shortSha } = mockRunners[0];
+ const numericId = getIdFromGraphQLId(id);
- expect(findCell({ fieldKey: 'name' }).find(GlLink).attributes('href')).toBe(
- `/admin/runners/${getIdFromGraphQLId(id)}`,
- );
+ expect(findCell({ fieldKey: 'summary' }).text()).toContain(`#${numericId} (${shortSha})`);
});
describe('When data is loading', () => {
diff --git a/spec/frontend/runner/components/runner_state_locked_badge_spec.js b/spec/frontend/runner/components/runner_state_locked_badge_spec.js
new file mode 100644
index 00000000000..e92b671f5a1
--- /dev/null
+++ b/spec/frontend/runner/components/runner_state_locked_badge_spec.js
@@ -0,0 +1,45 @@
+import { GlBadge } from '@gitlab/ui';
+import { shallowMount } from '@vue/test-utils';
+import RunnerStateLockedBadge from '~/runner/components/runner_state_locked_badge.vue';
+import { createMockDirective, getBinding } from 'helpers/vue_mock_directive';
+
+describe('RunnerTypeBadge', () => {
+ let wrapper;
+
+ const findBadge = () => wrapper.findComponent(GlBadge);
+ const getTooltip = () => getBinding(findBadge().element, 'gl-tooltip');
+
+ const createComponent = ({ props = {} } = {}) => {
+ wrapper = shallowMount(RunnerStateLockedBadge, {
+ propsData: {
+ ...props,
+ },
+ directives: {
+ GlTooltip: createMockDirective(),
+ },
+ });
+ };
+
+ beforeEach(() => {
+ createComponent();
+ });
+
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ it('renders locked state', () => {
+ expect(wrapper.text()).toBe('locked');
+ expect(findBadge().props('variant')).toBe('warning');
+ });
+
+ it('renders tooltip', () => {
+ expect(getTooltip().value).toBeDefined();
+ });
+
+ it('passes arbitrary attributes to the badge', () => {
+ createComponent({ props: { size: 'sm' } });
+
+ expect(findBadge().props('size')).toBe('sm');
+ });
+});
diff --git a/spec/frontend/runner/components/runner_state_paused_badge_spec.js b/spec/frontend/runner/components/runner_state_paused_badge_spec.js
new file mode 100644
index 00000000000..8df56d6e3f3
--- /dev/null
+++ b/spec/frontend/runner/components/runner_state_paused_badge_spec.js
@@ -0,0 +1,45 @@
+import { GlBadge } from '@gitlab/ui';
+import { shallowMount } from '@vue/test-utils';
+import RunnerStatePausedBadge from '~/runner/components/runner_state_paused_badge.vue';
+import { createMockDirective, getBinding } from 'helpers/vue_mock_directive';
+
+describe('RunnerTypeBadge', () => {
+ let wrapper;
+
+ const findBadge = () => wrapper.findComponent(GlBadge);
+ const getTooltip = () => getBinding(findBadge().element, 'gl-tooltip');
+
+ const createComponent = ({ props = {} } = {}) => {
+ wrapper = shallowMount(RunnerStatePausedBadge, {
+ propsData: {
+ ...props,
+ },
+ directives: {
+ GlTooltip: createMockDirective(),
+ },
+ });
+ };
+
+ beforeEach(() => {
+ createComponent();
+ });
+
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ it('renders paused state', () => {
+ expect(wrapper.text()).toBe('paused');
+ expect(findBadge().props('variant')).toBe('danger');
+ });
+
+ it('renders tooltip', () => {
+ expect(getTooltip().value).toBeDefined();
+ });
+
+ it('passes arbitrary attributes to the badge', () => {
+ createComponent({ props: { size: 'sm' } });
+
+ expect(findBadge().props('size')).toBe('sm');
+ });
+});
diff --git a/spec/frontend/runner/components/runner_type_badge_spec.js b/spec/frontend/runner/components/runner_type_badge_spec.js
index ab5ccf6390f..fb344e65389 100644
--- a/spec/frontend/runner/components/runner_type_badge_spec.js
+++ b/spec/frontend/runner/components/runner_type_badge_spec.js
@@ -1,18 +1,23 @@
import { GlBadge } from '@gitlab/ui';
import { shallowMount } from '@vue/test-utils';
import RunnerTypeBadge from '~/runner/components/runner_type_badge.vue';
+import { createMockDirective, getBinding } from 'helpers/vue_mock_directive';
import { INSTANCE_TYPE, GROUP_TYPE, PROJECT_TYPE } from '~/runner/constants';
describe('RunnerTypeBadge', () => {
let wrapper;
const findBadge = () => wrapper.findComponent(GlBadge);
+ const getTooltip = () => getBinding(findBadge().element, 'gl-tooltip');
const createComponent = ({ props = {} } = {}) => {
wrapper = shallowMount(RunnerTypeBadge, {
propsData: {
...props,
},
+ directives: {
+ GlTooltip: createMockDirective(),
+ },
});
};
@@ -20,16 +25,24 @@ describe('RunnerTypeBadge', () => {
wrapper.destroy();
});
- it.each`
+ describe.each`
type | text | variant
${INSTANCE_TYPE} | ${'shared'} | ${'success'}
${GROUP_TYPE} | ${'group'} | ${'success'}
${PROJECT_TYPE} | ${'specific'} | ${'info'}
- `('displays $type runner with as "$text" with a $variant variant ', ({ type, text, variant }) => {
- createComponent({ props: { type } });
+ `('displays $type runner', ({ type, text, variant }) => {
+ beforeEach(() => {
+ createComponent({ props: { type } });
+ });
- expect(findBadge().text()).toBe(text);
- expect(findBadge().props('variant')).toBe(variant);
+ it(`as "${text}" with a ${variant} variant`, () => {
+ expect(findBadge().text()).toBe(text);
+ expect(findBadge().props('variant')).toBe(variant);
+ });
+
+ it('with a tooltip', () => {
+ expect(getTooltip().value).toBeDefined();
+ });
});
it('validation fails for an incorrect type', () => {
diff --git a/spec/frontend/runner/components/runner_type_help_spec.js b/spec/frontend/runner/components/runner_type_help_spec.js
deleted file mode 100644
index f0d03282f8e..00000000000
--- a/spec/frontend/runner/components/runner_type_help_spec.js
+++ /dev/null
@@ -1,32 +0,0 @@
-import { GlBadge } from '@gitlab/ui';
-import { mount } from '@vue/test-utils';
-import RunnerTypeHelp from '~/runner/components/runner_type_help.vue';
-
-describe('RunnerTypeHelp', () => {
- let wrapper;
-
- const findBadges = () => wrapper.findAllComponents(GlBadge);
-
- const createComponent = () => {
- wrapper = mount(RunnerTypeHelp);
- };
-
- beforeEach(() => {
- createComponent();
- });
-
- afterEach(() => {
- wrapper.destroy();
- });
-
- it('Displays each of the runner types', () => {
- expect(findBadges().at(0).text()).toBe('shared');
- expect(findBadges().at(1).text()).toBe('group');
- expect(findBadges().at(2).text()).toBe('specific');
- });
-
- it('Displays runner states', () => {
- expect(findBadges().at(3).text()).toBe('locked');
- expect(findBadges().at(4).text()).toBe('paused');
- });
-});
diff --git a/spec/frontend/runner/group_runners/group_runners_app_spec.js b/spec/frontend/runner/group_runners/group_runners_app_spec.js
index e80da40e3bd..5f3aabd4bc3 100644
--- a/spec/frontend/runner/group_runners/group_runners_app_spec.js
+++ b/spec/frontend/runner/group_runners/group_runners_app_spec.js
@@ -1,3 +1,4 @@
+import { GlLink } from '@gitlab/ui';
import { createLocalVue, shallowMount, mount } from '@vue/test-utils';
import VueApollo from 'vue-apollo';
import createMockApollo from 'helpers/mock_apollo_helper';
@@ -5,13 +6,13 @@ import setWindowLocation from 'helpers/set_window_location_helper';
import { extendedWrapper } from 'helpers/vue_test_utils_helper';
import waitForPromises from 'helpers/wait_for_promises';
import createFlash from '~/flash';
+import { getIdFromGraphQLId } from '~/graphql_shared/utils';
import { updateHistory } from '~/lib/utils/url_utility';
import RunnerFilteredSearchBar from '~/runner/components/runner_filtered_search_bar.vue';
import RunnerList from '~/runner/components/runner_list.vue';
import RunnerManualSetupHelp from '~/runner/components/runner_manual_setup_help.vue';
import RunnerPagination from '~/runner/components/runner_pagination.vue';
-import RunnerTypeHelp from '~/runner/components/runner_type_help.vue';
import {
CREATED_ASC,
@@ -34,8 +35,7 @@ localVue.use(VueApollo);
const mockGroupFullPath = 'group1';
const mockRegistrationToken = 'AABBCC';
-const mockRunners = groupRunnersData.data.group.runners.nodes;
-const mockGroupRunnersLimitedCount = mockRunners.length;
+const mockGroupRunnersLimitedCount = groupRunnersData.data.group.runners.edges.length;
jest.mock('~/flash');
jest.mock('~/runner/sentry_utils');
@@ -48,7 +48,6 @@ describe('GroupRunnersApp', () => {
let wrapper;
let mockGroupRunnersQuery;
- const findRunnerTypeHelp = () => wrapper.findComponent(RunnerTypeHelp);
const findRunnerManualSetupHelp = () => wrapper.findComponent(RunnerManualSetupHelp);
const findRunnerList = () => wrapper.findComponent(RunnerList);
const findRunnerPagination = () => extendedWrapper(wrapper.findComponent(RunnerPagination));
@@ -82,16 +81,27 @@ describe('GroupRunnersApp', () => {
await waitForPromises();
});
- it('shows the runner type help', () => {
- expect(findRunnerTypeHelp().exists()).toBe(true);
- });
-
it('shows the runner setup instructions', () => {
expect(findRunnerManualSetupHelp().props('registrationToken')).toBe(mockRegistrationToken);
});
it('shows the runners list', () => {
- expect(findRunnerList().props('runners')).toEqual(groupRunnersData.data.group.runners.nodes);
+ expect(findRunnerList().props('runners')).toEqual(
+ groupRunnersData.data.group.runners.edges.map(({ node }) => node),
+ );
+ });
+
+ it('runner item links to the runner group page', async () => {
+ const { webUrl, node } = groupRunnersData.data.group.runners.edges[0];
+ const { id, shortSha } = node;
+
+ createComponent({ mountFn: mount });
+
+ await waitForPromises();
+
+ const runnerLink = wrapper.find('tr [data-testid="td-summary"]').find(GlLink);
+ expect(runnerLink.text()).toBe(`#${getIdFromGraphQLId(id)} (${shortSha})`);
+ expect(runnerLink.attributes('href')).toBe(webUrl);
});
it('requests the runners with group path and no other filters', () => {
diff --git a/spec/frontend/runner/mock_data.js b/spec/frontend/runner/mock_data.js
index c90b9a4c426..b8d0f1273c7 100644
--- a/spec/frontend/runner/mock_data.js
+++ b/spec/frontend/runner/mock_data.js
@@ -1,14 +1,18 @@
-const runnerFixture = (filename) => getJSONFixture(`graphql/runner/${filename}`);
-
// Fixtures generated by: spec/frontend/fixtures/runner.rb
// Admin queries
-export const runnersData = runnerFixture('get_runners.query.graphql.json');
-export const runnersDataPaginated = runnerFixture('get_runners.query.graphql.paginated.json');
-export const runnerData = runnerFixture('get_runner.query.graphql.json');
+import runnersData from 'test_fixtures/graphql/runner/get_runners.query.graphql.json';
+import runnersDataPaginated from 'test_fixtures/graphql/runner/get_runners.query.graphql.paginated.json';
+import runnerData from 'test_fixtures/graphql/runner/get_runner.query.graphql.json';
// Group queries
-export const groupRunnersData = runnerFixture('get_group_runners.query.graphql.json');
-export const groupRunnersDataPaginated = runnerFixture(
- 'get_group_runners.query.graphql.paginated.json',
-);
+import groupRunnersData from 'test_fixtures/graphql/runner/get_group_runners.query.graphql.json';
+import groupRunnersDataPaginated from 'test_fixtures/graphql/runner/get_group_runners.query.graphql.paginated.json';
+
+export {
+ runnerData,
+ runnersDataPaginated,
+ runnersData,
+ groupRunnersData,
+ groupRunnersDataPaginated,
+};
diff --git a/spec/frontend/search_settings/components/search_settings_spec.js b/spec/frontend/search_settings/components/search_settings_spec.js
index 173936e1ce3..6beaea8dba5 100644
--- a/spec/frontend/search_settings/components/search_settings_spec.js
+++ b/spec/frontend/search_settings/components/search_settings_spec.js
@@ -11,6 +11,7 @@ describe('search_settings/components/search_settings.vue', () => {
const GENERAL_SETTINGS_ID = 'js-general-settings';
const ADVANCED_SETTINGS_ID = 'js-advanced-settings';
const EXTRA_SETTINGS_ID = 'js-extra-settings';
+ const TEXT_CONTAIN_SEARCH_TERM = `This text contain ${SEARCH_TERM} and <script>alert("111")</script> others.`;
let wrapper;
@@ -33,6 +34,21 @@ describe('search_settings/components/search_settings.vue', () => {
const visibleSectionsCount = () =>
document.querySelectorAll(`${SECTION_SELECTOR}:not(.${HIDE_CLASS})`).length;
const highlightedElementsCount = () => document.querySelectorAll(`.${HIGHLIGHT_CLASS}`).length;
+
+ const highlightedTextNodes = () => {
+ const highlightedList = Array.from(document.querySelectorAll(`.${HIGHLIGHT_CLASS}`));
+ return highlightedList.every((element) => {
+ return element.textContent.toLowerCase() === SEARCH_TERM.toLowerCase();
+ });
+ };
+
+ const matchParentElement = () => {
+ const highlightedList = Array.from(document.querySelectorAll(`.${HIGHLIGHT_CLASS}`));
+ return highlightedList.map((element) => {
+ return element.parentNode;
+ });
+ };
+
const findSearchBox = () => wrapper.find(GlSearchBoxByType);
const search = (term) => {
findSearchBox().vm.$emit('input', term);
@@ -52,6 +68,7 @@ describe('search_settings/components/search_settings.vue', () => {
</section>
<section id="${EXTRA_SETTINGS_ID}" class="settings">
<span>${SEARCH_TERM}</span>
+ <span>${TEXT_CONTAIN_SEARCH_TERM}</span>
</section>
</div>
</div>
@@ -82,7 +99,23 @@ describe('search_settings/components/search_settings.vue', () => {
it('highlight elements that match the search term', () => {
search(SEARCH_TERM);
- expect(highlightedElementsCount()).toBe(1);
+ expect(highlightedElementsCount()).toBe(2);
+ });
+
+ it('highlight only search term and not the whole line', () => {
+ search(SEARCH_TERM);
+
+ expect(highlightedTextNodes()).toBe(true);
+ });
+
+ it('prevents search xss', () => {
+ search(SEARCH_TERM);
+
+ const parentNodeList = matchParentElement();
+ parentNodeList.forEach((element) => {
+ const scriptElement = element.getElementsByTagName('script');
+ expect(scriptElement.length).toBe(0);
+ });
});
describe('default', () => {
diff --git a/spec/frontend/sidebar/assignees_spec.js b/spec/frontend/sidebar/assignees_spec.js
index be27a800418..b3a67f18f82 100644
--- a/spec/frontend/sidebar/assignees_spec.js
+++ b/spec/frontend/sidebar/assignees_spec.js
@@ -3,6 +3,7 @@ import { mount } from '@vue/test-utils';
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 UsersMock from './mock_data';
describe('Assignee component', () => {
@@ -19,6 +20,7 @@ describe('Assignee component', () => {
});
};
+ const findAllAvatarLinks = () => wrapper.findAllComponents(AssigneeAvatarLink);
const findComponentTextNoUsers = () => wrapper.find('[data-testid="no-value"]');
const findCollapsedChildren = () => wrapper.findAll('.sidebar-collapsed-icon > *');
@@ -148,7 +150,7 @@ describe('Assignee component', () => {
editable: true,
});
- expect(wrapper.findAll('.user-item').length).toBe(users.length);
+ expect(findAllAvatarLinks()).toHaveLength(users.length);
expect(wrapper.find('.user-list-more').exists()).toBe(false);
});
@@ -178,9 +180,9 @@ describe('Assignee component', () => {
users,
});
- const userItems = wrapper.findAll('.user-list .user-item a');
+ const userItems = findAllAvatarLinks();
- expect(userItems.length).toBe(3);
+ expect(userItems).toHaveLength(3);
expect(userItems.at(0).attributes('title')).toBe(users[2].name);
});
diff --git a/spec/frontend/sidebar/components/reviewers/uncollapsed_reviewer_list_spec.js b/spec/frontend/sidebar/components/reviewers/uncollapsed_reviewer_list_spec.js
index 9f6878db785..6b80224083a 100644
--- a/spec/frontend/sidebar/components/reviewers/uncollapsed_reviewer_list_spec.js
+++ b/spec/frontend/sidebar/components/reviewers/uncollapsed_reviewer_list_spec.js
@@ -26,9 +26,9 @@ describe('UncollapsedReviewerList component', () => {
});
describe('single reviewer', () => {
- beforeEach(() => {
- const user = userDataMock();
+ const user = userDataMock();
+ beforeEach(() => {
createComponent({
users: [user],
});
@@ -39,6 +39,7 @@ describe('UncollapsedReviewerList component', () => {
});
it('shows one user with avatar, username and author name', () => {
+ expect(wrapper.text()).toContain(user.name);
expect(wrapper.text()).toContain(`@root`);
});
@@ -56,11 +57,18 @@ describe('UncollapsedReviewerList component', () => {
});
describe('multiple reviewers', () => {
- beforeEach(() => {
- const user = userDataMock();
+ const user = userDataMock();
+ const user2 = {
+ ...user,
+ id: 2,
+ name: 'nonrooty-nonrootersen',
+ username: 'hello-world',
+ approved: true,
+ };
+ beforeEach(() => {
createComponent({
- users: [user, { ...user, id: 2, username: 'hello-world', approved: true }],
+ users: [user, user2],
});
});
@@ -69,7 +77,9 @@ describe('UncollapsedReviewerList component', () => {
});
it('shows both users with avatar, username and author name', () => {
+ expect(wrapper.text()).toContain(user.name);
expect(wrapper.text()).toContain(`@root`);
+ expect(wrapper.text()).toContain(user2.name);
expect(wrapper.text()).toContain(`@hello-world`);
});
diff --git a/spec/frontend/sidebar/sidebar_labels_spec.js b/spec/frontend/sidebar/sidebar_labels_spec.js
index 7455f684380..8437ee1b723 100644
--- a/spec/frontend/sidebar/sidebar_labels_spec.js
+++ b/spec/frontend/sidebar/sidebar_labels_spec.js
@@ -27,6 +27,7 @@ describe('sidebar labels', () => {
labelsManagePath: '/gitlab-org/gitlab-test/-/labels',
projectIssuesPath: '/gitlab-org/gitlab-test/-/issues',
projectPath: 'gitlab-org/gitlab-test',
+ fullPath: 'gitlab-org/gitlab-test',
};
const $apollo = {
@@ -110,10 +111,9 @@ describe('sidebar labels', () => {
mutation: updateIssueLabelsMutation,
variables: {
input: {
- addLabelIds: [40],
iid: defaultProps.iid,
projectPath: defaultProps.projectPath,
- removeLabelIds: [26, 55],
+ labelIds: [toLabelGid(29), toLabelGid(28), toLabelGid(27), toLabelGid(40)],
},
},
};
diff --git a/spec/frontend/sidebar/todo_spec.js b/spec/frontend/sidebar/todo_spec.js
index ff6da3abad0..6829e688c65 100644
--- a/spec/frontend/sidebar/todo_spec.js
+++ b/spec/frontend/sidebar/todo_spec.js
@@ -27,7 +27,7 @@ describe('SidebarTodo', () => {
it.each`
state | classes
${false} | ${['gl-button', 'btn', 'btn-default', 'btn-todo', 'issuable-header-btn', 'float-right']}
- ${true} | ${['btn-blank', 'btn-todo', 'sidebar-collapsed-icon', 'dont-change-state']}
+ ${true} | ${['btn-blank', 'btn-todo', 'sidebar-collapsed-icon', 'js-dont-change-state']}
`('returns todo button classes for when `collapsed` prop is `$state`', ({ state, classes }) => {
createComponent({ collapsed: state });
expect(wrapper.find('button').classes()).toStrictEqual(classes);
diff --git a/spec/frontend/snippets/components/show_spec.js b/spec/frontend/snippets/components/show_spec.js
index b7b638b5137..af61f4ea54f 100644
--- a/spec/frontend/snippets/components/show_spec.js
+++ b/spec/frontend/snippets/components/show_spec.js
@@ -41,19 +41,23 @@ describe('Snippet view app', () => {
},
});
}
+
+ const findLoadingIcon = () => wrapper.findComponent(GlLoadingIcon);
+ const findEmbedDropdown = () => wrapper.findComponent(EmbedDropdown);
+
afterEach(() => {
wrapper.destroy();
});
it('renders loader while the query is in flight', () => {
createComponent({ loading: true });
- expect(wrapper.find(GlLoadingIcon).exists()).toBe(true);
+ expect(findLoadingIcon().exists()).toBe(true);
});
- it('renders all simple components after the query is finished', () => {
+ it('renders all simple components required after the query is finished', () => {
createComponent();
- expect(wrapper.find(SnippetHeader).exists()).toBe(true);
- expect(wrapper.find(SnippetTitle).exists()).toBe(true);
+ expect(wrapper.findComponent(SnippetHeader).exists()).toBe(true);
+ expect(wrapper.findComponent(SnippetTitle).exists()).toBe(true);
});
it('renders embed dropdown component if visibility allows', () => {
@@ -65,7 +69,7 @@ describe('Snippet view app', () => {
},
},
});
- expect(wrapper.find(EmbedDropdown).exists()).toBe(true);
+ expect(findEmbedDropdown().exists()).toBe(true);
});
it('renders correct snippet-blob components', () => {
@@ -98,7 +102,7 @@ describe('Snippet view app', () => {
},
},
});
- expect(wrapper.find(EmbedDropdown).exists()).toBe(isRendered);
+ expect(findEmbedDropdown().exists()).toBe(isRendered);
});
});
@@ -120,7 +124,7 @@ describe('Snippet view app', () => {
},
},
});
- expect(wrapper.find(CloneDropdownButton).exists()).toBe(isRendered);
+ expect(wrapper.findComponent(CloneDropdownButton).exists()).toBe(isRendered);
},
);
});
diff --git a/spec/frontend/snippets/components/snippet_header_spec.js b/spec/frontend/snippets/components/snippet_header_spec.js
index fb95be3a77c..552a1c6fcde 100644
--- a/spec/frontend/snippets/components/snippet_header_spec.js
+++ b/spec/frontend/snippets/components/snippet_header_spec.js
@@ -1,23 +1,30 @@
import { GlButton, GlModal, GlDropdown } from '@gitlab/ui';
import { mount } from '@vue/test-utils';
import { ApolloMutation } from 'vue-apollo';
+import MockAdapter from 'axios-mock-adapter';
import { useMockLocationHelper } from 'helpers/mock_window_location_helper';
import waitForPromises from 'helpers/wait_for_promises';
import { Blob, BinaryBlob } from 'jest/blob/components/mock_data';
import { differenceInMilliseconds } from '~/lib/utils/datetime_utility';
-import SnippetHeader from '~/snippets/components/snippet_header.vue';
+import SnippetHeader, { i18n } from '~/snippets/components/snippet_header.vue';
import DeleteSnippetMutation from '~/snippets/mutations/deleteSnippet.mutation.graphql';
+import axios from '~/lib/utils/axios_utils';
+import createFlash, { FLASH_TYPES } from '~/flash';
+
+jest.mock('~/flash');
describe('Snippet header component', () => {
let wrapper;
let snippet;
let mutationTypes;
let mutationVariables;
+ let mock;
let errorMsg;
let err;
const originalRelativeUrlRoot = gon.relative_url_root;
const reportAbusePath = '/-/snippets/42/mark_as_spam';
+ const canReportSpam = true;
const GlEmoji = { template: '<img/>' };
@@ -47,6 +54,7 @@ describe('Snippet header component', () => {
mocks: { $apollo },
provide: {
reportAbusePath,
+ canReportSpam,
...provide,
},
propsData: {
@@ -118,10 +126,13 @@ describe('Snippet header component', () => {
RESOLVE: jest.fn(() => Promise.resolve({ data: { destroySnippet: { errors: [] } } })),
REJECT: jest.fn(() => Promise.reject(err)),
};
+
+ mock = new MockAdapter(axios);
});
afterEach(() => {
wrapper.destroy();
+ mock.restore();
gon.relative_url_root = originalRelativeUrlRoot;
});
@@ -186,7 +197,6 @@ describe('Snippet header component', () => {
{
category: 'primary',
disabled: false,
- href: reportAbusePath,
text: 'Submit as spam',
variant: 'default',
},
@@ -205,7 +215,6 @@ describe('Snippet header component', () => {
text: 'Delete',
},
{
- href: reportAbusePath,
text: 'Submit as spam',
title: 'Submit as spam',
},
@@ -249,6 +258,31 @@ describe('Snippet header component', () => {
);
});
+ describe('submit snippet as spam', () => {
+ beforeEach(async () => {
+ createComponent();
+ });
+
+ it.each`
+ request | variant | text
+ ${200} | ${'SUCCESS'} | ${i18n.snippetSpamSuccess}
+ ${500} | ${'DANGER'} | ${i18n.snippetSpamFailure}
+ `(
+ 'renders a "$variant" flash message with "$text" message for a request with a "$request" response',
+ async ({ request, variant, text }) => {
+ const submitAsSpamBtn = findButtons().at(2);
+ mock.onPost(reportAbusePath).reply(request);
+ submitAsSpamBtn.trigger('click');
+ await waitForPromises();
+
+ expect(createFlash).toHaveBeenLastCalledWith({
+ message: expect.stringContaining(text),
+ type: FLASH_TYPES[variant],
+ });
+ },
+ );
+ });
+
describe('with guest user', () => {
beforeEach(() => {
createComponent({
@@ -258,6 +292,7 @@ describe('Snippet header component', () => {
},
provide: {
reportAbusePath: null,
+ canReportSpam: false,
},
});
});
diff --git a/spec/frontend/test_setup.js b/spec/frontend/test_setup.js
index 4d1b0f54e42..2c8e0fff848 100644
--- a/spec/frontend/test_setup.js
+++ b/spec/frontend/test_setup.js
@@ -6,7 +6,7 @@ import { setGlobalDateToFakeDate } from 'helpers/fake_date';
import setWindowLocation from 'helpers/set_window_location_helper';
import { TEST_HOST } from 'helpers/test_constants';
import Translate from '~/vue_shared/translate';
-import { getJSONFixture, loadHTMLFixture, setHTMLFixture } from './__helpers__/fixtures';
+import { loadHTMLFixture, setHTMLFixture } from './__helpers__/fixtures';
import { initializeTestTimeout } from './__helpers__/timeout';
import customMatchers from './matchers';
import { setupManualMocks } from './mocks/mocks_helper';
@@ -43,7 +43,6 @@ Vue.use(Translate);
// convenience wrapper for migration from Karma
Object.assign(global, {
- getJSONFixture,
loadFixtures: loadHTMLFixture,
setFixtures: setHTMLFixture,
});
diff --git a/spec/frontend/tracking/get_standard_context_spec.js b/spec/frontend/tracking/get_standard_context_spec.js
index b7bdc56b801..ada914b586c 100644
--- a/spec/frontend/tracking/get_standard_context_spec.js
+++ b/spec/frontend/tracking/get_standard_context_spec.js
@@ -1,5 +1,13 @@
-import { SNOWPLOW_JS_SOURCE } from '~/tracking/constants';
+import { SNOWPLOW_JS_SOURCE, GOOGLE_ANALYTICS_ID_COOKIE_NAME } from '~/tracking/constants';
import getStandardContext from '~/tracking/get_standard_context';
+import { setCookie, removeCookie } from '~/lib/utils/common_utils';
+
+const TEST_GA_ID = 'GA1.2.345678901.234567891';
+const TEST_BASE_DATA = {
+ source: SNOWPLOW_JS_SOURCE,
+ google_analytics_id: '',
+ extra: {},
+};
describe('~/tracking/get_standard_context', () => {
beforeEach(() => {
@@ -10,10 +18,7 @@ describe('~/tracking/get_standard_context', () => {
it('returns default object if called without server context', () => {
expect(getStandardContext()).toStrictEqual({
schema: undefined,
- data: {
- source: SNOWPLOW_JS_SOURCE,
- extra: {},
- },
+ data: TEST_BASE_DATA,
});
});
@@ -28,9 +33,8 @@ describe('~/tracking/get_standard_context', () => {
expect(getStandardContext()).toStrictEqual({
schema: 'iglu:com.gitlab/gitlab_standard',
data: {
+ ...TEST_BASE_DATA,
environment: 'testing',
- source: SNOWPLOW_JS_SOURCE,
- extra: {},
},
});
});
@@ -50,4 +54,15 @@ describe('~/tracking/get_standard_context', () => {
expect(getStandardContext({ extra }).data.extra).toBe(extra);
});
+
+ describe('with Google Analytics cookie present', () => {
+ afterEach(() => {
+ removeCookie(GOOGLE_ANALYTICS_ID_COOKIE_NAME);
+ });
+
+ it('appends Google Analytics ID', () => {
+ setCookie(GOOGLE_ANALYTICS_ID_COOKIE_NAME, TEST_GA_ID);
+ expect(getStandardContext().data.google_analytics_id).toBe(TEST_GA_ID);
+ });
+ });
});
diff --git a/spec/frontend/tracking/tracking_initialization_spec.js b/spec/frontend/tracking/tracking_initialization_spec.js
new file mode 100644
index 00000000000..2b70aacc4cb
--- /dev/null
+++ b/spec/frontend/tracking/tracking_initialization_spec.js
@@ -0,0 +1,140 @@
+import { TRACKING_CONTEXT_SCHEMA } from '~/experimentation/constants';
+import { getExperimentData, getAllExperimentContexts } from '~/experimentation/utils';
+import Tracking, { initUserTracking, initDefaultTrackers } from '~/tracking';
+import getStandardContext from '~/tracking/get_standard_context';
+
+jest.mock('~/experimentation/utils', () => ({
+ getExperimentData: jest.fn(),
+ getAllExperimentContexts: jest.fn(),
+}));
+
+describe('Tracking', () => {
+ let standardContext;
+ let snowplowSpy;
+ let bindDocumentSpy;
+ let trackLoadEventsSpy;
+ let enableFormTracking;
+ let setAnonymousUrlsSpy;
+
+ beforeAll(() => {
+ window.gl = window.gl || {};
+ window.gl.snowplowStandardContext = {
+ schema: 'iglu:com.gitlab/gitlab_standard',
+ data: {
+ environment: 'testing',
+ source: 'unknown',
+ extra: {},
+ },
+ };
+
+ standardContext = getStandardContext();
+ });
+
+ beforeEach(() => {
+ getExperimentData.mockReturnValue(undefined);
+ getAllExperimentContexts.mockReturnValue([]);
+
+ window.snowplow = window.snowplow || (() => {});
+ window.snowplowOptions = {
+ namespace: 'gl_test',
+ hostname: 'app.test.com',
+ cookieDomain: '.test.com',
+ };
+
+ snowplowSpy = jest.spyOn(window, 'snowplow');
+ });
+
+ describe('initUserTracking', () => {
+ it('calls through to get a new tracker with the expected options', () => {
+ initUserTracking();
+ expect(snowplowSpy).toHaveBeenCalledWith('newTracker', 'gl_test', 'app.test.com', {
+ namespace: 'gl_test',
+ hostname: 'app.test.com',
+ cookieDomain: '.test.com',
+ appId: '',
+ userFingerprint: false,
+ respectDoNotTrack: true,
+ forceSecureTracker: true,
+ eventMethod: 'post',
+ contexts: { webPage: true, performanceTiming: true },
+ formTracking: false,
+ linkClickTracking: false,
+ pageUnloadTimer: 10,
+ formTrackingConfig: {
+ fields: { allow: [] },
+ forms: { allow: [] },
+ },
+ });
+ });
+ });
+
+ describe('initDefaultTrackers', () => {
+ beforeEach(() => {
+ bindDocumentSpy = jest.spyOn(Tracking, 'bindDocument').mockImplementation(() => null);
+ trackLoadEventsSpy = jest.spyOn(Tracking, 'trackLoadEvents').mockImplementation(() => null);
+ enableFormTracking = jest
+ .spyOn(Tracking, 'enableFormTracking')
+ .mockImplementation(() => null);
+ setAnonymousUrlsSpy = jest.spyOn(Tracking, 'setAnonymousUrls').mockImplementation(() => null);
+ });
+
+ it('should activate features based on what has been enabled', () => {
+ initDefaultTrackers();
+ expect(snowplowSpy).toHaveBeenCalledWith('enableActivityTracking', 30, 30);
+ expect(snowplowSpy).toHaveBeenCalledWith('trackPageView', null, [standardContext]);
+ expect(snowplowSpy).not.toHaveBeenCalledWith('enableFormTracking');
+ expect(snowplowSpy).not.toHaveBeenCalledWith('enableLinkClickTracking');
+
+ window.snowplowOptions = {
+ ...window.snowplowOptions,
+ formTracking: true,
+ linkClickTracking: true,
+ formTrackingConfig: { forms: { whitelist: ['foo'] }, fields: { whitelist: ['bar'] } },
+ };
+
+ initDefaultTrackers();
+ expect(enableFormTracking).toHaveBeenCalledWith(window.snowplowOptions.formTrackingConfig);
+ expect(snowplowSpy).toHaveBeenCalledWith('enableLinkClickTracking');
+ });
+
+ it('binds the document event handling', () => {
+ initDefaultTrackers();
+ expect(bindDocumentSpy).toHaveBeenCalled();
+ });
+
+ it('tracks page loaded events', () => {
+ initDefaultTrackers();
+ expect(trackLoadEventsSpy).toHaveBeenCalled();
+ });
+
+ it('calls the anonymized URLs method', () => {
+ initDefaultTrackers();
+ expect(setAnonymousUrlsSpy).toHaveBeenCalled();
+ });
+
+ describe('when there are experiment contexts', () => {
+ const experimentContexts = [
+ {
+ schema: TRACKING_CONTEXT_SCHEMA,
+ data: { experiment: 'experiment1', variant: 'control' },
+ },
+ {
+ schema: TRACKING_CONTEXT_SCHEMA,
+ data: { experiment: 'experiment_two', variant: 'candidate' },
+ },
+ ];
+
+ beforeEach(() => {
+ getAllExperimentContexts.mockReturnValue(experimentContexts);
+ });
+
+ it('includes those contexts alongside the standard context', () => {
+ initDefaultTrackers();
+ expect(snowplowSpy).toHaveBeenCalledWith('trackPageView', null, [
+ standardContext,
+ ...experimentContexts,
+ ]);
+ });
+ });
+ });
+});
diff --git a/spec/frontend/tracking/tracking_spec.js b/spec/frontend/tracking/tracking_spec.js
new file mode 100644
index 00000000000..b7a2e4f4f51
--- /dev/null
+++ b/spec/frontend/tracking/tracking_spec.js
@@ -0,0 +1,597 @@
+import { setHTMLFixture } from 'helpers/fixtures';
+import { TEST_HOST } from 'helpers/test_constants';
+import { TRACKING_CONTEXT_SCHEMA } from '~/experimentation/constants';
+import { getExperimentData, getAllExperimentContexts } from '~/experimentation/utils';
+import Tracking, { initUserTracking, initDefaultTrackers } from '~/tracking';
+import { REFERRER_TTL, URLS_CACHE_STORAGE_KEY } from '~/tracking/constants';
+import getStandardContext from '~/tracking/get_standard_context';
+
+jest.mock('~/experimentation/utils', () => ({
+ getExperimentData: jest.fn(),
+ getAllExperimentContexts: jest.fn().mockReturnValue([]),
+}));
+
+const TEST_CATEGORY = 'root:index';
+const TEST_ACTION = 'generic';
+const TEST_LABEL = 'button';
+
+describe('Tracking', () => {
+ let standardContext;
+ let snowplowSpy;
+
+ beforeAll(() => {
+ window.gl = window.gl || {};
+ window.gl.snowplowUrls = {};
+ window.gl.snowplowStandardContext = {
+ schema: 'iglu:com.gitlab/gitlab_standard',
+ data: {
+ environment: 'testing',
+ source: 'unknown',
+ extra: {},
+ },
+ };
+ window.snowplowOptions = {
+ namespace: 'gl_test',
+ hostname: 'app.test.com',
+ cookieDomain: '.test.com',
+ formTracking: true,
+ linkClickTracking: true,
+ formTrackingConfig: { forms: { allow: ['foo'] }, fields: { allow: ['bar'] } },
+ };
+
+ standardContext = getStandardContext();
+ window.snowplow = window.snowplow || (() => {});
+ document.body.dataset.page = TEST_CATEGORY;
+
+ initUserTracking();
+ initDefaultTrackers();
+ });
+
+ beforeEach(() => {
+ getExperimentData.mockReturnValue(undefined);
+ getAllExperimentContexts.mockReturnValue([]);
+
+ snowplowSpy = jest.spyOn(window, 'snowplow');
+ });
+
+ describe('.event', () => {
+ afterEach(() => {
+ window.doNotTrack = undefined;
+ navigator.doNotTrack = undefined;
+ navigator.msDoNotTrack = undefined;
+ jest.clearAllMocks();
+ });
+
+ it('tracks to snowplow (our current tracking system)', () => {
+ Tracking.event(TEST_CATEGORY, TEST_ACTION, { label: TEST_LABEL });
+
+ expect(snowplowSpy).toHaveBeenCalledWith(
+ 'trackStructEvent',
+ TEST_CATEGORY,
+ TEST_ACTION,
+ TEST_LABEL,
+ undefined,
+ undefined,
+ [standardContext],
+ );
+ });
+
+ it('allows adding extra data to the default context', () => {
+ const extra = { foo: 'bar' };
+
+ Tracking.event(TEST_CATEGORY, TEST_ACTION, { extra });
+
+ expect(snowplowSpy).toHaveBeenCalledWith(
+ 'trackStructEvent',
+ TEST_CATEGORY,
+ TEST_ACTION,
+ undefined,
+ undefined,
+ undefined,
+ [
+ {
+ ...standardContext,
+ data: {
+ ...standardContext.data,
+ extra,
+ },
+ },
+ ],
+ );
+ });
+
+ it('skips tracking if snowplow is unavailable', () => {
+ window.snowplow = false;
+ Tracking.event(TEST_CATEGORY, TEST_ACTION);
+
+ expect(snowplowSpy).not.toHaveBeenCalled();
+ });
+
+ it('skips tracking if the user does not want to be tracked (general spec)', () => {
+ window.doNotTrack = '1';
+ Tracking.event(TEST_CATEGORY, TEST_ACTION);
+
+ expect(snowplowSpy).not.toHaveBeenCalled();
+ });
+
+ it('skips tracking if the user does not want to be tracked (firefox legacy)', () => {
+ navigator.doNotTrack = 'yes';
+ Tracking.event(TEST_CATEGORY, TEST_ACTION);
+
+ expect(snowplowSpy).not.toHaveBeenCalled();
+ });
+
+ it('skips tracking if the user does not want to be tracked (IE legacy)', () => {
+ navigator.msDoNotTrack = '1';
+ Tracking.event(TEST_CATEGORY, TEST_ACTION);
+
+ expect(snowplowSpy).not.toHaveBeenCalled();
+ });
+ });
+
+ describe('.enableFormTracking', () => {
+ it('tells snowplow to enable form tracking, with only explicit contexts', () => {
+ const config = { forms: { allow: ['form-class1'] }, fields: { allow: ['input-class1'] } };
+ Tracking.enableFormTracking(config, ['_passed_context_', standardContext]);
+
+ expect(snowplowSpy).toHaveBeenCalledWith(
+ 'enableFormTracking',
+ { forms: { whitelist: ['form-class1'] }, fields: { whitelist: ['input-class1'] } },
+ ['_passed_context_'],
+ );
+ });
+
+ it('throws an error if no allow rules are provided', () => {
+ const expectedError = new Error('Unable to enable form event tracking without allow rules.');
+
+ expect(() => Tracking.enableFormTracking()).toThrow(expectedError);
+ expect(() => Tracking.enableFormTracking({ fields: { allow: true } })).toThrow(expectedError);
+ expect(() => Tracking.enableFormTracking({ fields: { allow: [] } })).not.toThrow(
+ expectedError,
+ );
+ });
+
+ it('does not add empty form allow rules', () => {
+ Tracking.enableFormTracking({ fields: { allow: ['input-class1'] } });
+
+ expect(snowplowSpy).toHaveBeenCalledWith(
+ 'enableFormTracking',
+ { fields: { whitelist: ['input-class1'] } },
+ [],
+ );
+ });
+
+ describe('when `document.readyState` does not equal `complete`', () => {
+ const originalReadyState = document.readyState;
+ const setReadyState = (value) => {
+ Object.defineProperty(document, 'readyState', {
+ value,
+ configurable: true,
+ });
+ };
+ const fireReadyStateChangeEvent = () => {
+ document.dispatchEvent(new Event('readystatechange'));
+ };
+
+ beforeEach(() => {
+ setReadyState('interactive');
+ });
+
+ afterEach(() => {
+ setReadyState(originalReadyState);
+ });
+
+ it('does not call `window.snowplow` until `readystatechange` is fired and `document.readyState` equals `complete`', () => {
+ Tracking.enableFormTracking({ fields: { allow: ['input-class1'] } });
+
+ expect(snowplowSpy).not.toHaveBeenCalled();
+
+ fireReadyStateChangeEvent();
+
+ expect(snowplowSpy).not.toHaveBeenCalled();
+
+ setReadyState('complete');
+ fireReadyStateChangeEvent();
+
+ expect(snowplowSpy).toHaveBeenCalled();
+ });
+ });
+ });
+
+ describe('.flushPendingEvents', () => {
+ it('flushes any pending events', () => {
+ Tracking.initialized = false;
+ Tracking.event(TEST_CATEGORY, TEST_ACTION, { label: TEST_LABEL });
+
+ expect(snowplowSpy).not.toHaveBeenCalled();
+
+ Tracking.flushPendingEvents();
+
+ expect(snowplowSpy).toHaveBeenCalledWith(
+ 'trackStructEvent',
+ TEST_CATEGORY,
+ TEST_ACTION,
+ TEST_LABEL,
+ undefined,
+ undefined,
+ [standardContext],
+ );
+ });
+ });
+
+ describe('.setAnonymousUrls', () => {
+ afterEach(() => {
+ window.gl.snowplowPseudonymizedPageUrl = '';
+ localStorage.removeItem(URLS_CACHE_STORAGE_KEY);
+ });
+
+ it('does nothing if URLs are not provided', () => {
+ Tracking.setAnonymousUrls();
+
+ expect(snowplowSpy).not.toHaveBeenCalled();
+ expect(localStorage.getItem(URLS_CACHE_STORAGE_KEY)).toBe(null);
+ });
+
+ it('sets the page URL when provided and populates the cache', () => {
+ window.gl.snowplowPseudonymizedPageUrl = TEST_HOST;
+
+ Tracking.setAnonymousUrls();
+
+ expect(snowplowSpy).toHaveBeenCalledWith('setCustomUrl', TEST_HOST);
+ expect(JSON.parse(localStorage.getItem(URLS_CACHE_STORAGE_KEY))[0]).toStrictEqual({
+ url: TEST_HOST,
+ referrer: '',
+ originalUrl: window.location.href,
+ timestamp: Date.now(),
+ });
+ });
+
+ it('does not appends the hash/fragment to the pseudonymized URL', () => {
+ window.gl.snowplowPseudonymizedPageUrl = TEST_HOST;
+ window.location.hash = 'first-heading';
+
+ Tracking.setAnonymousUrls();
+
+ expect(snowplowSpy).toHaveBeenCalledWith('setCustomUrl', TEST_HOST);
+ });
+
+ it('does not set the referrer URL by default', () => {
+ window.gl.snowplowPseudonymizedPageUrl = TEST_HOST;
+
+ Tracking.setAnonymousUrls();
+
+ expect(snowplowSpy).not.toHaveBeenCalledWith('setReferrerUrl', expect.any(String));
+ });
+
+ describe('with referrers cache', () => {
+ const testUrl = '/namespace:1/project:2/-/merge_requests/5';
+ const testOriginalUrl = '/my-namespace/my-project/-/merge_requests/';
+ const setUrlsCache = (data) =>
+ localStorage.setItem(URLS_CACHE_STORAGE_KEY, JSON.stringify(data));
+
+ beforeEach(() => {
+ window.gl.snowplowPseudonymizedPageUrl = TEST_HOST;
+ Object.defineProperty(document, 'referrer', { value: '', configurable: true });
+ });
+
+ it('does nothing if a referrer can not be found', () => {
+ setUrlsCache([
+ {
+ url: testUrl,
+ originalUrl: TEST_HOST,
+ timestamp: Date.now(),
+ },
+ ]);
+
+ Tracking.setAnonymousUrls();
+
+ expect(snowplowSpy).not.toHaveBeenCalledWith('setReferrerUrl', expect.any(String));
+ });
+
+ it('sets referrer URL from the page URL found in cache', () => {
+ Object.defineProperty(document, 'referrer', { value: testOriginalUrl });
+ setUrlsCache([
+ {
+ url: testUrl,
+ originalUrl: testOriginalUrl,
+ timestamp: Date.now(),
+ },
+ ]);
+
+ Tracking.setAnonymousUrls();
+
+ expect(snowplowSpy).toHaveBeenCalledWith('setReferrerUrl', testUrl);
+ });
+
+ it('ignores and removes old entries from the cache', () => {
+ const oldTimestamp = Date.now() - (REFERRER_TTL + 1);
+ Object.defineProperty(document, 'referrer', { value: testOriginalUrl });
+ setUrlsCache([
+ {
+ url: testUrl,
+ originalUrl: testOriginalUrl,
+ timestamp: oldTimestamp,
+ },
+ ]);
+
+ Tracking.setAnonymousUrls();
+
+ expect(snowplowSpy).not.toHaveBeenCalledWith('setReferrerUrl', testUrl);
+ expect(localStorage.getItem(URLS_CACHE_STORAGE_KEY)).not.toContain(oldTimestamp);
+ });
+ });
+ });
+
+ describe('tracking interface events with data-track-action', () => {
+ let eventSpy;
+
+ beforeEach(() => {
+ eventSpy = jest.spyOn(Tracking, 'event');
+ setHTMLFixture(`
+ <input data-track-action="click_input1" data-track-label="button" value="0" />
+ <input data-track-action="click_input2" data-track-value="0" value="0" />
+ <input type="checkbox" data-track-action="toggle_checkbox" value=1 checked />
+ <input class="dropdown" data-track-action="toggle_dropdown"/>
+ <div data-track-action="nested_event"><span class="nested"></span></div>
+ <input data-track-bogus="click_bogusinput" data-track-label="button" value="1" />
+ <input data-track-action="click_input3" data-track-experiment="example" value="1" />
+ <input data-track-action="event_with_extra" data-track-extra='{ "foo": "bar" }' />
+ <input data-track-action="event_with_invalid_extra" data-track-extra="invalid_json" />
+ `);
+ });
+
+ it(`binds to clicks on elements matching [data-track-action]`, () => {
+ document.querySelector(`[data-track-action="click_input1"]`).click();
+
+ expect(eventSpy).toHaveBeenCalledWith(TEST_CATEGORY, 'click_input1', {
+ label: TEST_LABEL,
+ value: '0',
+ });
+ });
+
+ it(`does not bind to clicks on elements without [data-track-action]`, () => {
+ document.querySelector('[data-track-bogus="click_bogusinput"]').click();
+
+ expect(eventSpy).not.toHaveBeenCalled();
+ });
+
+ it('allows value override with the data-track-value attribute', () => {
+ document.querySelector(`[data-track-action="click_input2"]`).click();
+
+ expect(eventSpy).toHaveBeenCalledWith(TEST_CATEGORY, 'click_input2', {
+ value: '0',
+ });
+ });
+
+ it('handles checkbox values correctly', () => {
+ const checkbox = document.querySelector(`[data-track-action="toggle_checkbox"]`);
+
+ checkbox.click(); // unchecking
+
+ expect(eventSpy).toHaveBeenCalledWith(TEST_CATEGORY, 'toggle_checkbox', {
+ value: 0,
+ });
+
+ checkbox.click(); // checking
+
+ expect(eventSpy).toHaveBeenCalledWith(TEST_CATEGORY, 'toggle_checkbox', {
+ value: '1',
+ });
+ });
+
+ it('handles bootstrap dropdowns', () => {
+ const dropdown = document.querySelector(`[data-track-action="toggle_dropdown"]`);
+
+ dropdown.dispatchEvent(new Event('show.bs.dropdown', { bubbles: true }));
+
+ expect(eventSpy).toHaveBeenCalledWith(TEST_CATEGORY, 'toggle_dropdown_show', {});
+
+ dropdown.dispatchEvent(new Event('hide.bs.dropdown', { bubbles: true }));
+
+ expect(eventSpy).toHaveBeenCalledWith(TEST_CATEGORY, 'toggle_dropdown_hide', {});
+ });
+
+ it('handles nested elements inside an element with tracking', () => {
+ document.querySelector('span.nested').click();
+
+ expect(eventSpy).toHaveBeenCalledWith(TEST_CATEGORY, 'nested_event', {});
+ });
+
+ it('includes experiment data if linked to an experiment', () => {
+ const mockExperimentData = {
+ variant: 'candidate',
+ experiment: 'example',
+ key: '2bff73f6bb8cc11156c50a8ba66b9b8b',
+ };
+ getExperimentData.mockReturnValue(mockExperimentData);
+
+ document.querySelector(`[data-track-action="click_input3"]`).click();
+
+ expect(eventSpy).toHaveBeenCalledWith(TEST_CATEGORY, 'click_input3', {
+ value: '1',
+ context: { schema: TRACKING_CONTEXT_SCHEMA, data: mockExperimentData },
+ });
+ });
+
+ it('supports extra data as JSON', () => {
+ document.querySelector(`[data-track-action="event_with_extra"]`).click();
+
+ expect(eventSpy).toHaveBeenCalledWith(TEST_CATEGORY, 'event_with_extra', {
+ extra: { foo: 'bar' },
+ });
+ });
+
+ it('ignores extra if provided JSON is invalid', () => {
+ document.querySelector(`[data-track-action="event_with_invalid_extra"]`).click();
+
+ expect(eventSpy).toHaveBeenCalledWith(TEST_CATEGORY, 'event_with_invalid_extra', {});
+ });
+ });
+
+ describe('tracking page loaded events with -action', () => {
+ let eventSpy;
+
+ beforeEach(() => {
+ eventSpy = jest.spyOn(Tracking, 'event');
+ setHTMLFixture(`
+ <div data-track-action="click_link" data-track-label="all_nested_links">
+ <input data-track-action="render" data-track-label="label1" value=1 data-track-property="_property_" />
+ <span data-track-action="render" data-track-label="label2" data-track-value="1">
+ <a href="#" id="link">Something</a>
+ </span>
+ <input data-track-action="_render_bogus_" data-track-label="label3" value="_value_" data-track-property="_property_" />
+ </div>
+ `);
+ Tracking.trackLoadEvents(TEST_CATEGORY);
+ });
+
+ it(`sends tracking events when [data-track-action="render"] is on an element`, () => {
+ expect(eventSpy.mock.calls).toEqual([
+ [
+ TEST_CATEGORY,
+ 'render',
+ {
+ label: 'label1',
+ value: '1',
+ property: '_property_',
+ },
+ ],
+ [
+ TEST_CATEGORY,
+ 'render',
+ {
+ label: 'label2',
+ value: '1',
+ },
+ ],
+ ]);
+ });
+
+ describe.each`
+ event | actionSuffix
+ ${'click'} | ${''}
+ ${'show.bs.dropdown'} | ${'_show'}
+ ${'hide.bs.dropdown'} | ${'_hide'}
+ `(`auto-tracking $event events on nested elements`, ({ event, actionSuffix }) => {
+ let link;
+
+ beforeEach(() => {
+ link = document.querySelector('#link');
+ eventSpy.mockClear();
+ });
+
+ it(`avoids using ancestor [data-track-action="render"] tracking configurations`, () => {
+ link.dispatchEvent(new Event(event, { bubbles: true }));
+
+ expect(eventSpy).not.toHaveBeenCalledWith(
+ TEST_CATEGORY,
+ `render${actionSuffix}`,
+ expect.any(Object),
+ );
+ expect(eventSpy).toHaveBeenCalledWith(
+ TEST_CATEGORY,
+ `click_link${actionSuffix}`,
+ expect.objectContaining({ label: 'all_nested_links' }),
+ );
+ });
+ });
+ });
+
+ describe('tracking mixin', () => {
+ describe('trackingOptions', () => {
+ it('returns the options defined on initialisation', () => {
+ const mixin = Tracking.mixin({ foo: 'bar' });
+ expect(mixin.computed.trackingOptions()).toEqual({ foo: 'bar' });
+ });
+
+ it('lets local tracking value override and extend options', () => {
+ const mixin = Tracking.mixin({ foo: 'bar' });
+ // The value of this in the Vue lifecyle is different, but this serves the test's purposes
+ mixin.computed.tracking = { foo: 'baz', baz: 'bar' };
+ expect(mixin.computed.trackingOptions()).toEqual({ foo: 'baz', baz: 'bar' });
+ });
+
+ it('includes experiment data if linked to an experiment', () => {
+ const mockExperimentData = {
+ variant: 'candidate',
+ experiment: 'darkMode',
+ };
+ getExperimentData.mockReturnValue(mockExperimentData);
+
+ const mixin = Tracking.mixin({ foo: 'bar', experiment: 'darkMode' });
+ expect(mixin.computed.trackingOptions()).toEqual({
+ foo: 'bar',
+ context: {
+ schema: TRACKING_CONTEXT_SCHEMA,
+ data: mockExperimentData,
+ },
+ });
+ });
+
+ it('does not include experiment data if experiment data does not exist', () => {
+ const mixin = Tracking.mixin({ foo: 'bar', experiment: 'lightMode' });
+ expect(mixin.computed.trackingOptions()).toEqual({
+ foo: 'bar',
+ });
+ });
+ });
+
+ describe('trackingCategory', () => {
+ it('returns the category set in the component properties first', () => {
+ const mixin = Tracking.mixin({ category: 'foo' });
+ mixin.computed.tracking = {
+ category: 'bar',
+ };
+ expect(mixin.computed.trackingCategory()).toBe('bar');
+ });
+
+ it('returns the category set in the options', () => {
+ const mixin = Tracking.mixin({ category: 'foo' });
+ expect(mixin.computed.trackingCategory()).toBe('foo');
+ });
+
+ it('returns undefined if no category is selected', () => {
+ const mixin = Tracking.mixin();
+ expect(mixin.computed.trackingCategory()).toBe(undefined);
+ });
+ });
+
+ describe('track', () => {
+ let eventSpy;
+ let mixin;
+
+ beforeEach(() => {
+ eventSpy = jest.spyOn(Tracking, 'event').mockReturnValue();
+ mixin = Tracking.mixin();
+ mixin = {
+ ...mixin.computed,
+ ...mixin.methods,
+ };
+ });
+
+ it('calls the event method with no category or action defined', () => {
+ mixin.trackingCategory = mixin.trackingCategory();
+ mixin.trackingOptions = mixin.trackingOptions();
+
+ mixin.track();
+ expect(eventSpy).toHaveBeenCalledWith(undefined, undefined, {});
+ });
+
+ it('calls the event method', () => {
+ mixin.trackingCategory = mixin.trackingCategory();
+ mixin.trackingOptions = mixin.trackingOptions();
+
+ mixin.track('foo');
+ expect(eventSpy).toHaveBeenCalledWith(undefined, 'foo', {});
+ });
+
+ it('gives precedence to data for category and options', () => {
+ mixin.trackingCategory = mixin.trackingCategory();
+ mixin.trackingOptions = mixin.trackingOptions();
+ const data = { category: 'foo', label: 'baz' };
+ mixin.track('foo', data);
+ expect(eventSpy).toHaveBeenCalledWith('foo', 'foo', data);
+ });
+ });
+ });
+});
diff --git a/spec/frontend/tracking/utils_spec.js b/spec/frontend/tracking/utils_spec.js
new file mode 100644
index 00000000000..d6f2c5095b4
--- /dev/null
+++ b/spec/frontend/tracking/utils_spec.js
@@ -0,0 +1,99 @@
+import {
+ renameKey,
+ getReferrersCache,
+ addExperimentContext,
+ addReferrersCacheEntry,
+ filterOldReferrersCacheEntries,
+} from '~/tracking/utils';
+import { TRACKING_CONTEXT_SCHEMA } from '~/experimentation/constants';
+import { REFERRER_TTL, URLS_CACHE_STORAGE_KEY } from '~/tracking/constants';
+import { TEST_HOST } from 'helpers/test_constants';
+
+jest.mock('~/experimentation/utils', () => ({
+ getExperimentData: jest.fn().mockReturnValue({}),
+}));
+
+describe('~/tracking/utils', () => {
+ beforeEach(() => {
+ window.gl = window.gl || {};
+ window.gl.snowplowStandardContext = {};
+ });
+
+ describe('addExperimentContext', () => {
+ const options = {
+ category: 'root:index',
+ action: 'generic',
+ };
+
+ it('returns same options if no experiment is provided', () => {
+ expect(addExperimentContext({ options })).toStrictEqual({ options });
+ });
+
+ it('adds experiment if provided', () => {
+ const experiment = 'TEST_EXPERIMENT_NAME';
+
+ expect(addExperimentContext({ experiment, ...options })).toStrictEqual({
+ ...options,
+ context: { data: {}, schema: TRACKING_CONTEXT_SCHEMA },
+ });
+ });
+ });
+
+ describe('renameKey', () => {
+ it('renames a given key', () => {
+ expect(renameKey({ allow: [] }, 'allow', 'permit')).toStrictEqual({ permit: [] });
+ });
+ });
+
+ describe('referrers cache', () => {
+ describe('filterOldReferrersCacheEntries', () => {
+ it('removes entries with old or no timestamp', () => {
+ const now = Date.now();
+ const cache = [{ timestamp: now }, { timestamp: now - REFERRER_TTL }, { referrer: '' }];
+
+ expect(filterOldReferrersCacheEntries(cache)).toStrictEqual([{ timestamp: now }]);
+ });
+ });
+
+ describe('getReferrersCache', () => {
+ beforeEach(() => {
+ localStorage.removeItem(URLS_CACHE_STORAGE_KEY);
+ });
+
+ it('returns an empty array if cache is not found', () => {
+ expect(getReferrersCache()).toHaveLength(0);
+ });
+
+ it('returns an empty array if cache is invalid', () => {
+ localStorage.setItem(URLS_CACHE_STORAGE_KEY, 'Invalid JSON');
+
+ expect(getReferrersCache()).toHaveLength(0);
+ });
+
+ it('returns parsed entries if valid', () => {
+ localStorage.setItem(
+ URLS_CACHE_STORAGE_KEY,
+ JSON.stringify([{ referrer: '', timestamp: Date.now() }]),
+ );
+
+ expect(getReferrersCache()).toHaveLength(1);
+ });
+ });
+
+ describe('addReferrersCacheEntry', () => {
+ it('unshifts entry and adds timestamp', () => {
+ const now = Date.now();
+
+ addReferrersCacheEntry([{ referrer: '', originalUrl: TEST_HOST, timestamp: now }], {
+ referrer: TEST_HOST,
+ });
+
+ const cache = getReferrersCache();
+
+ expect(cache).toHaveLength(2);
+ expect(cache[0].referrer).toBe(TEST_HOST);
+ expect(cache[0].timestamp).toBeDefined();
+ });
+ });
+ });
+});
diff --git a/spec/frontend/tracking_spec.js b/spec/frontend/tracking_spec.js
deleted file mode 100644
index 21fed51ff10..00000000000
--- a/spec/frontend/tracking_spec.js
+++ /dev/null
@@ -1,693 +0,0 @@
-import { setHTMLFixture } from 'helpers/fixtures';
-import { TEST_HOST } from 'helpers/test_constants';
-import { TRACKING_CONTEXT_SCHEMA } from '~/experimentation/constants';
-import { getExperimentData, getAllExperimentContexts } from '~/experimentation/utils';
-import Tracking, { initUserTracking, initDefaultTrackers } from '~/tracking';
-import { REFERRER_TTL, URLS_CACHE_STORAGE_KEY } from '~/tracking/constants';
-import getStandardContext from '~/tracking/get_standard_context';
-
-jest.mock('~/experimentation/utils', () => ({
- getExperimentData: jest.fn(),
- getAllExperimentContexts: jest.fn(),
-}));
-
-describe('Tracking', () => {
- let standardContext;
- let snowplowSpy;
- let bindDocumentSpy;
- let trackLoadEventsSpy;
- let enableFormTracking;
- let setAnonymousUrlsSpy;
-
- beforeAll(() => {
- window.gl = window.gl || {};
- window.gl.snowplowUrls = {};
- window.gl.snowplowStandardContext = {
- schema: 'iglu:com.gitlab/gitlab_standard',
- data: {
- environment: 'testing',
- source: 'unknown',
- extra: {},
- },
- };
-
- standardContext = getStandardContext();
- });
-
- beforeEach(() => {
- getExperimentData.mockReturnValue(undefined);
- getAllExperimentContexts.mockReturnValue([]);
-
- window.snowplow = window.snowplow || (() => {});
- window.snowplowOptions = {
- namespace: '_namespace_',
- hostname: 'app.gitfoo.com',
- cookieDomain: '.gitfoo.com',
- };
- snowplowSpy = jest.spyOn(window, 'snowplow');
- });
-
- describe('initUserTracking', () => {
- it('calls through to get a new tracker with the expected options', () => {
- initUserTracking();
- expect(snowplowSpy).toHaveBeenCalledWith('newTracker', '_namespace_', 'app.gitfoo.com', {
- namespace: '_namespace_',
- hostname: 'app.gitfoo.com',
- cookieDomain: '.gitfoo.com',
- appId: '',
- userFingerprint: false,
- respectDoNotTrack: true,
- forceSecureTracker: true,
- eventMethod: 'post',
- contexts: { webPage: true, performanceTiming: true },
- formTracking: false,
- linkClickTracking: false,
- pageUnloadTimer: 10,
- formTrackingConfig: {
- fields: { allow: [] },
- forms: { allow: [] },
- },
- });
- });
- });
-
- describe('initDefaultTrackers', () => {
- beforeEach(() => {
- bindDocumentSpy = jest.spyOn(Tracking, 'bindDocument').mockImplementation(() => null);
- trackLoadEventsSpy = jest.spyOn(Tracking, 'trackLoadEvents').mockImplementation(() => null);
- enableFormTracking = jest
- .spyOn(Tracking, 'enableFormTracking')
- .mockImplementation(() => null);
- setAnonymousUrlsSpy = jest.spyOn(Tracking, 'setAnonymousUrls').mockImplementation(() => null);
- });
-
- it('should activate features based on what has been enabled', () => {
- initDefaultTrackers();
- expect(snowplowSpy).toHaveBeenCalledWith('enableActivityTracking', 30, 30);
- expect(snowplowSpy).toHaveBeenCalledWith('trackPageView', null, [standardContext]);
- expect(snowplowSpy).not.toHaveBeenCalledWith('enableFormTracking');
- expect(snowplowSpy).not.toHaveBeenCalledWith('enableLinkClickTracking');
-
- window.snowplowOptions = {
- ...window.snowplowOptions,
- formTracking: true,
- linkClickTracking: true,
- formTrackingConfig: { forms: { whitelist: ['foo'] }, fields: { whitelist: ['bar'] } },
- };
-
- initDefaultTrackers();
- expect(enableFormTracking).toHaveBeenCalledWith(window.snowplowOptions.formTrackingConfig);
- expect(snowplowSpy).toHaveBeenCalledWith('enableLinkClickTracking');
- });
-
- it('binds the document event handling', () => {
- initDefaultTrackers();
- expect(bindDocumentSpy).toHaveBeenCalled();
- });
-
- it('tracks page loaded events', () => {
- initDefaultTrackers();
- expect(trackLoadEventsSpy).toHaveBeenCalled();
- });
-
- it('calls the anonymized URLs method', () => {
- initDefaultTrackers();
- expect(setAnonymousUrlsSpy).toHaveBeenCalled();
- });
-
- describe('when there are experiment contexts', () => {
- const experimentContexts = [
- {
- schema: TRACKING_CONTEXT_SCHEMA,
- data: { experiment: 'experiment1', variant: 'control' },
- },
- {
- schema: TRACKING_CONTEXT_SCHEMA,
- data: { experiment: 'experiment_two', variant: 'candidate' },
- },
- ];
-
- beforeEach(() => {
- getAllExperimentContexts.mockReturnValue(experimentContexts);
- });
-
- it('includes those contexts alongside the standard context', () => {
- initDefaultTrackers();
- expect(snowplowSpy).toHaveBeenCalledWith('trackPageView', null, [
- standardContext,
- ...experimentContexts,
- ]);
- });
- });
- });
-
- describe('.event', () => {
- afterEach(() => {
- window.doNotTrack = undefined;
- navigator.doNotTrack = undefined;
- navigator.msDoNotTrack = undefined;
- });
-
- it('tracks to snowplow (our current tracking system)', () => {
- Tracking.event('_category_', '_eventName_', { label: '_label_' });
-
- expect(snowplowSpy).toHaveBeenCalledWith(
- 'trackStructEvent',
- '_category_',
- '_eventName_',
- '_label_',
- undefined,
- undefined,
- [standardContext],
- );
- });
-
- it('allows adding extra data to the default context', () => {
- const extra = { foo: 'bar' };
-
- Tracking.event('_category_', '_eventName_', { extra });
-
- expect(snowplowSpy).toHaveBeenCalledWith(
- 'trackStructEvent',
- '_category_',
- '_eventName_',
- undefined,
- undefined,
- undefined,
- [
- {
- ...standardContext,
- data: {
- ...standardContext.data,
- extra,
- },
- },
- ],
- );
- });
-
- it('skips tracking if snowplow is unavailable', () => {
- window.snowplow = false;
- Tracking.event('_category_', '_eventName_');
-
- expect(snowplowSpy).not.toHaveBeenCalled();
- });
-
- it('skips tracking if the user does not want to be tracked (general spec)', () => {
- window.doNotTrack = '1';
- Tracking.event('_category_', '_eventName_');
-
- expect(snowplowSpy).not.toHaveBeenCalled();
- });
-
- it('skips tracking if the user does not want to be tracked (firefox legacy)', () => {
- navigator.doNotTrack = 'yes';
- Tracking.event('_category_', '_eventName_');
-
- expect(snowplowSpy).not.toHaveBeenCalled();
- });
-
- it('skips tracking if the user does not want to be tracked (IE legacy)', () => {
- navigator.msDoNotTrack = '1';
- Tracking.event('_category_', '_eventName_');
-
- expect(snowplowSpy).not.toHaveBeenCalled();
- });
- });
-
- describe('.enableFormTracking', () => {
- it('tells snowplow to enable form tracking, with only explicit contexts', () => {
- const config = { forms: { allow: ['form-class1'] }, fields: { allow: ['input-class1'] } };
- Tracking.enableFormTracking(config, ['_passed_context_', standardContext]);
-
- expect(snowplowSpy).toHaveBeenCalledWith(
- 'enableFormTracking',
- { forms: { whitelist: ['form-class1'] }, fields: { whitelist: ['input-class1'] } },
- ['_passed_context_'],
- );
- });
-
- it('throws an error if no allow rules are provided', () => {
- const expectedError = new Error('Unable to enable form event tracking without allow rules.');
-
- expect(() => Tracking.enableFormTracking()).toThrow(expectedError);
- expect(() => Tracking.enableFormTracking({ fields: { allow: true } })).toThrow(expectedError);
- expect(() => Tracking.enableFormTracking({ fields: { allow: [] } })).not.toThrow(
- expectedError,
- );
- });
-
- it('does not add empty form whitelist rules', () => {
- Tracking.enableFormTracking({ fields: { allow: ['input-class1'] } });
-
- expect(snowplowSpy).toHaveBeenCalledWith(
- 'enableFormTracking',
- { fields: { whitelist: ['input-class1'] } },
- [],
- );
- });
-
- describe('when `document.readyState` does not equal `complete`', () => {
- const originalReadyState = document.readyState;
- const setReadyState = (value) => {
- Object.defineProperty(document, 'readyState', {
- value,
- configurable: true,
- });
- };
- const fireReadyStateChangeEvent = () => {
- document.dispatchEvent(new Event('readystatechange'));
- };
-
- beforeEach(() => {
- setReadyState('interactive');
- });
-
- afterEach(() => {
- setReadyState(originalReadyState);
- });
-
- it('does not call `window.snowplow` until `readystatechange` is fired and `document.readyState` equals `complete`', () => {
- Tracking.enableFormTracking({ fields: { allow: ['input-class1'] } });
-
- expect(snowplowSpy).not.toHaveBeenCalled();
-
- fireReadyStateChangeEvent();
-
- expect(snowplowSpy).not.toHaveBeenCalled();
-
- setReadyState('complete');
- fireReadyStateChangeEvent();
-
- expect(snowplowSpy).toHaveBeenCalled();
- });
- });
- });
-
- describe('.flushPendingEvents', () => {
- it('flushes any pending events', () => {
- Tracking.initialized = false;
- Tracking.event('_category_', '_eventName_', { label: '_label_' });
-
- expect(snowplowSpy).not.toHaveBeenCalled();
-
- Tracking.flushPendingEvents();
-
- expect(snowplowSpy).toHaveBeenCalledWith(
- 'trackStructEvent',
- '_category_',
- '_eventName_',
- '_label_',
- undefined,
- undefined,
- [standardContext],
- );
- });
- });
-
- describe('.setAnonymousUrls', () => {
- afterEach(() => {
- window.gl.snowplowPseudonymizedPageUrl = '';
- localStorage.removeItem(URLS_CACHE_STORAGE_KEY);
- });
-
- it('does nothing if URLs are not provided', () => {
- Tracking.setAnonymousUrls();
-
- expect(snowplowSpy).not.toHaveBeenCalled();
- expect(localStorage.getItem(URLS_CACHE_STORAGE_KEY)).toBe(null);
- });
-
- it('sets the page URL when provided and populates the cache', () => {
- window.gl.snowplowPseudonymizedPageUrl = TEST_HOST;
-
- Tracking.setAnonymousUrls();
-
- expect(snowplowSpy).toHaveBeenCalledWith('setCustomUrl', TEST_HOST);
- expect(JSON.parse(localStorage.getItem(URLS_CACHE_STORAGE_KEY))[0]).toStrictEqual({
- url: TEST_HOST,
- referrer: '',
- originalUrl: window.location.href,
- timestamp: Date.now(),
- });
- });
-
- it('appends the hash/fragment to the pseudonymized URL', () => {
- const hash = 'first-heading';
- window.gl.snowplowPseudonymizedPageUrl = TEST_HOST;
- window.location.hash = hash;
-
- Tracking.setAnonymousUrls();
-
- expect(snowplowSpy).toHaveBeenCalledWith('setCustomUrl', `${TEST_HOST}#${hash}`);
- });
-
- it('does not set the referrer URL by default', () => {
- window.gl.snowplowPseudonymizedPageUrl = TEST_HOST;
-
- Tracking.setAnonymousUrls();
-
- expect(snowplowSpy).not.toHaveBeenCalledWith('setReferrerUrl', expect.any(String));
- });
-
- describe('with referrers cache', () => {
- const testUrl = '/namespace:1/project:2/-/merge_requests/5';
- const testOriginalUrl = '/my-namespace/my-project/-/merge_requests/';
- const setUrlsCache = (data) =>
- localStorage.setItem(URLS_CACHE_STORAGE_KEY, JSON.stringify(data));
-
- beforeEach(() => {
- window.gl.snowplowPseudonymizedPageUrl = TEST_HOST;
- Object.defineProperty(document, 'referrer', { value: '', configurable: true });
- });
-
- it('does nothing if a referrer can not be found', () => {
- setUrlsCache([
- {
- url: testUrl,
- originalUrl: TEST_HOST,
- timestamp: Date.now(),
- },
- ]);
-
- Tracking.setAnonymousUrls();
-
- expect(snowplowSpy).not.toHaveBeenCalledWith('setReferrerUrl', expect.any(String));
- });
-
- it('sets referrer URL from the page URL found in cache', () => {
- Object.defineProperty(document, 'referrer', { value: testOriginalUrl });
- setUrlsCache([
- {
- url: testUrl,
- originalUrl: testOriginalUrl,
- timestamp: Date.now(),
- },
- ]);
-
- Tracking.setAnonymousUrls();
-
- expect(snowplowSpy).toHaveBeenCalledWith('setReferrerUrl', testUrl);
- });
-
- it('ignores and removes old entries from the cache', () => {
- const oldTimestamp = Date.now() - (REFERRER_TTL + 1);
- Object.defineProperty(document, 'referrer', { value: testOriginalUrl });
- setUrlsCache([
- {
- url: testUrl,
- originalUrl: testOriginalUrl,
- timestamp: oldTimestamp,
- },
- ]);
-
- Tracking.setAnonymousUrls();
-
- expect(snowplowSpy).not.toHaveBeenCalledWith('setReferrerUrl', testUrl);
- expect(localStorage.getItem(URLS_CACHE_STORAGE_KEY)).not.toContain(oldTimestamp);
- });
- });
- });
-
- describe.each`
- term
- ${'event'}
- ${'action'}
- `('tracking interface events with data-track-$term', ({ term }) => {
- let eventSpy;
-
- beforeEach(() => {
- eventSpy = jest.spyOn(Tracking, 'event');
- Tracking.bindDocument('_category_'); // only happens once
- setHTMLFixture(`
- <input data-track-${term}="click_input1" data-track-label="_label_" value=0 />
- <input data-track-${term}="click_input2" data-track-value=0 value=0/>
- <input type="checkbox" data-track-${term}="toggle_checkbox" value=1 checked/>
- <input class="dropdown" data-track-${term}="toggle_dropdown"/>
- <div data-track-${term}="nested_event"><span class="nested"></span></div>
- <input data-track-bogus="click_bogusinput" data-track-label="_label_" value="_value_"/>
- <input data-track-${term}="click_input3" data-track-experiment="example" value="_value_"/>
- <input data-track-${term}="event_with_extra" data-track-extra='{ "foo": "bar" }' />
- <input data-track-${term}="event_with_invalid_extra" data-track-extra="invalid_json" />
- `);
- });
-
- it(`binds to clicks on elements matching [data-track-${term}]`, () => {
- document.querySelector(`[data-track-${term}="click_input1"]`).click();
-
- expect(eventSpy).toHaveBeenCalledWith('_category_', 'click_input1', {
- label: '_label_',
- value: '0',
- });
- });
-
- it(`does not bind to clicks on elements without [data-track-${term}]`, () => {
- document.querySelector('[data-track-bogus="click_bogusinput"]').click();
-
- expect(eventSpy).not.toHaveBeenCalled();
- });
-
- it('allows value override with the data-track-value attribute', () => {
- document.querySelector(`[data-track-${term}="click_input2"]`).click();
-
- expect(eventSpy).toHaveBeenCalledWith('_category_', 'click_input2', {
- value: '0',
- });
- });
-
- it('handles checkbox values correctly', () => {
- const checkbox = document.querySelector(`[data-track-${term}="toggle_checkbox"]`);
-
- checkbox.click(); // unchecking
-
- expect(eventSpy).toHaveBeenCalledWith('_category_', 'toggle_checkbox', {
- value: 0,
- });
-
- checkbox.click(); // checking
-
- expect(eventSpy).toHaveBeenCalledWith('_category_', 'toggle_checkbox', {
- value: '1',
- });
- });
-
- it('handles bootstrap dropdowns', () => {
- const dropdown = document.querySelector(`[data-track-${term}="toggle_dropdown"]`);
-
- dropdown.dispatchEvent(new Event('show.bs.dropdown', { bubbles: true }));
-
- expect(eventSpy).toHaveBeenCalledWith('_category_', 'toggle_dropdown_show', {});
-
- dropdown.dispatchEvent(new Event('hide.bs.dropdown', { bubbles: true }));
-
- expect(eventSpy).toHaveBeenCalledWith('_category_', 'toggle_dropdown_hide', {});
- });
-
- it('handles nested elements inside an element with tracking', () => {
- document.querySelector('span.nested').click();
-
- expect(eventSpy).toHaveBeenCalledWith('_category_', 'nested_event', {});
- });
-
- it('includes experiment data if linked to an experiment', () => {
- const mockExperimentData = {
- variant: 'candidate',
- experiment: 'example',
- key: '2bff73f6bb8cc11156c50a8ba66b9b8b',
- };
- getExperimentData.mockReturnValue(mockExperimentData);
-
- document.querySelector(`[data-track-${term}="click_input3"]`).click();
-
- expect(eventSpy).toHaveBeenCalledWith('_category_', 'click_input3', {
- value: '_value_',
- context: { schema: TRACKING_CONTEXT_SCHEMA, data: mockExperimentData },
- });
- });
-
- it('supports extra data as JSON', () => {
- document.querySelector(`[data-track-${term}="event_with_extra"]`).click();
-
- expect(eventSpy).toHaveBeenCalledWith('_category_', 'event_with_extra', {
- extra: { foo: 'bar' },
- });
- });
-
- it('ignores extra if provided JSON is invalid', () => {
- document.querySelector(`[data-track-${term}="event_with_invalid_extra"]`).click();
-
- expect(eventSpy).toHaveBeenCalledWith('_category_', 'event_with_invalid_extra', {});
- });
- });
-
- describe.each`
- term
- ${'event'}
- ${'action'}
- `('tracking page loaded events with -$term', ({ term }) => {
- let eventSpy;
-
- beforeEach(() => {
- eventSpy = jest.spyOn(Tracking, 'event');
- setHTMLFixture(`
- <div data-track-${term}="click_link" data-track-label="all_nested_links">
- <input data-track-${term}="render" data-track-label="label1" value=1 data-track-property="_property_"/>
- <span data-track-${term}="render" data-track-label="label2" data-track-value=1>
- <a href="#" id="link">Something</a>
- </span>
- <input data-track-${term}="_render_bogus_" data-track-label="label3" value="_value_" data-track-property="_property_"/>
- </div>
- `);
- Tracking.trackLoadEvents('_category_'); // only happens once
- });
-
- it(`sends tracking events when [data-track-${term}="render"] is on an element`, () => {
- expect(eventSpy.mock.calls).toEqual([
- [
- '_category_',
- 'render',
- {
- label: 'label1',
- value: '1',
- property: '_property_',
- },
- ],
- [
- '_category_',
- 'render',
- {
- label: 'label2',
- value: '1',
- },
- ],
- ]);
- });
-
- describe.each`
- event | actionSuffix
- ${'click'} | ${''}
- ${'show.bs.dropdown'} | ${'_show'}
- ${'hide.bs.dropdown'} | ${'_hide'}
- `(`auto-tracking $event events on nested elements`, ({ event, actionSuffix }) => {
- let link;
-
- beforeEach(() => {
- link = document.querySelector('#link');
- eventSpy.mockClear();
- });
-
- it(`avoids using ancestor [data-track-${term}="render"] tracking configurations`, () => {
- link.dispatchEvent(new Event(event, { bubbles: true }));
-
- expect(eventSpy).not.toHaveBeenCalledWith(
- '_category_',
- `render${actionSuffix}`,
- expect.any(Object),
- );
- expect(eventSpy).toHaveBeenCalledWith(
- '_category_',
- `click_link${actionSuffix}`,
- expect.objectContaining({ label: 'all_nested_links' }),
- );
- });
- });
- });
-
- describe('tracking mixin', () => {
- describe('trackingOptions', () => {
- it('returns the options defined on initialisation', () => {
- const mixin = Tracking.mixin({ foo: 'bar' });
- expect(mixin.computed.trackingOptions()).toEqual({ foo: 'bar' });
- });
-
- it('lets local tracking value override and extend options', () => {
- const mixin = Tracking.mixin({ foo: 'bar' });
- // The value of this in the Vue lifecyle is different, but this serves the test's purposes
- mixin.computed.tracking = { foo: 'baz', baz: 'bar' };
- expect(mixin.computed.trackingOptions()).toEqual({ foo: 'baz', baz: 'bar' });
- });
-
- it('includes experiment data if linked to an experiment', () => {
- const mockExperimentData = {
- variant: 'candidate',
- experiment: 'darkMode',
- };
- getExperimentData.mockReturnValue(mockExperimentData);
-
- const mixin = Tracking.mixin({ foo: 'bar', experiment: 'darkMode' });
- expect(mixin.computed.trackingOptions()).toEqual({
- foo: 'bar',
- context: {
- schema: TRACKING_CONTEXT_SCHEMA,
- data: mockExperimentData,
- },
- });
- });
-
- it('does not include experiment data if experiment data does not exist', () => {
- const mixin = Tracking.mixin({ foo: 'bar', experiment: 'lightMode' });
- expect(mixin.computed.trackingOptions()).toEqual({
- foo: 'bar',
- });
- });
- });
-
- describe('trackingCategory', () => {
- it('returns the category set in the component properties first', () => {
- const mixin = Tracking.mixin({ category: 'foo' });
- mixin.computed.tracking = {
- category: 'bar',
- };
- expect(mixin.computed.trackingCategory()).toBe('bar');
- });
-
- it('returns the category set in the options', () => {
- const mixin = Tracking.mixin({ category: 'foo' });
- expect(mixin.computed.trackingCategory()).toBe('foo');
- });
-
- it('returns undefined if no category is selected', () => {
- const mixin = Tracking.mixin();
- expect(mixin.computed.trackingCategory()).toBe(undefined);
- });
- });
-
- describe('track', () => {
- let eventSpy;
- let mixin;
-
- beforeEach(() => {
- eventSpy = jest.spyOn(Tracking, 'event').mockReturnValue();
- mixin = Tracking.mixin();
- mixin = {
- ...mixin.computed,
- ...mixin.methods,
- };
- });
-
- it('calls the event method with no category or action defined', () => {
- mixin.trackingCategory = mixin.trackingCategory();
- mixin.trackingOptions = mixin.trackingOptions();
-
- mixin.track();
- expect(eventSpy).toHaveBeenCalledWith(undefined, undefined, {});
- });
-
- it('calls the event method', () => {
- mixin.trackingCategory = mixin.trackingCategory();
- mixin.trackingOptions = mixin.trackingOptions();
-
- mixin.track('foo');
- expect(eventSpy).toHaveBeenCalledWith(undefined, 'foo', {});
- });
-
- it('gives precedence to data for category and options', () => {
- mixin.trackingCategory = mixin.trackingCategory();
- mixin.trackingOptions = mixin.trackingOptions();
- const data = { category: 'foo', label: 'baz' };
- mixin.track('foo', data);
- expect(eventSpy).toHaveBeenCalledWith('foo', 'foo', data);
- });
- });
- });
-});
diff --git a/spec/frontend/users_select/test_helper.js b/spec/frontend/users_select/test_helper.js
index c5adbe9bb09..59edde48eab 100644
--- a/spec/frontend/users_select/test_helper.js
+++ b/spec/frontend/users_select/test_helper.js
@@ -1,6 +1,7 @@
import MockAdapter from 'axios-mock-adapter';
import { memoize, cloneDeep } from 'lodash';
-import { getFixture, getJSONFixture } from 'helpers/fixtures';
+import usersFixture from 'test_fixtures/autocomplete/users.json';
+import { getFixture } from 'helpers/fixtures';
import waitForPromises from 'helpers/wait_for_promises';
import axios from '~/lib/utils/axios_utils';
import UsersSelect from '~/users_select';
@@ -15,7 +16,7 @@ const getUserSearchHTML = memoize((fixturePath) => {
return el.outerHTML;
});
-const getUsersFixture = memoize(() => getJSONFixture('autocomplete/users.json'));
+const getUsersFixture = () => usersFixture;
export const getUsersFixtureAt = (idx) => getUsersFixture()[idx];
diff --git a/spec/frontend/vue_mr_widget/components/approvals/approvals_summary_spec.js b/spec/frontend/vue_mr_widget/components/approvals/approvals_summary_spec.js
index ef712ec23a6..c9dea4394f9 100644
--- a/spec/frontend/vue_mr_widget/components/approvals/approvals_summary_spec.js
+++ b/spec/frontend/vue_mr_widget/components/approvals/approvals_summary_spec.js
@@ -61,9 +61,7 @@ describe('MRWidget approvals summary', () => {
it('render message', () => {
const names = toNounSeriesText(testRulesLeft());
- expect(wrapper.text()).toContain(
- `Requires ${TEST_APPROVALS_LEFT} more approvals from ${names}.`,
- );
+ expect(wrapper.text()).toContain(`Requires ${TEST_APPROVALS_LEFT} approvals from ${names}.`);
});
});
@@ -75,7 +73,9 @@ describe('MRWidget approvals summary', () => {
});
it('renders message', () => {
- expect(wrapper.text()).toContain(`Requires ${TEST_APPROVALS_LEFT} more approvals.`);
+ expect(wrapper.text()).toContain(
+ `Requires ${TEST_APPROVALS_LEFT} approvals from eligible users`,
+ );
});
});
diff --git a/spec/frontend/vue_mr_widget/components/extensions/actions_spec.js b/spec/frontend/vue_mr_widget/components/extensions/actions_spec.js
new file mode 100644
index 00000000000..d5d779d7a34
--- /dev/null
+++ b/spec/frontend/vue_mr_widget/components/extensions/actions_spec.js
@@ -0,0 +1,35 @@
+import { GlButton, GlDropdownItem } from '@gitlab/ui';
+import { shallowMount } from '@vue/test-utils';
+import Actions from '~/vue_merge_request_widget/components/extensions/actions.vue';
+
+let wrapper;
+
+function factory(propsData = {}) {
+ wrapper = shallowMount(Actions, {
+ propsData: { ...propsData, widget: 'test' },
+ });
+}
+
+describe('MR widget extension actions', () => {
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ describe('tertiaryButtons', () => {
+ it('renders buttons', () => {
+ factory({
+ tertiaryButtons: [{ text: 'hello world', href: 'https://gitlab.com', target: '_blank' }],
+ });
+
+ expect(wrapper.findAllComponents(GlButton)).toHaveLength(1);
+ });
+
+ it('renders tertiary actions in dropdown', () => {
+ factory({
+ tertiaryButtons: [{ text: 'hello world', href: 'https://gitlab.com', target: '_blank' }],
+ });
+
+ expect(wrapper.findAllComponents(GlDropdownItem)).toHaveLength(1);
+ });
+ });
+});
diff --git a/spec/frontend/vue_mr_widget/components/extensions/index_spec.js b/spec/frontend/vue_mr_widget/components/extensions/index_spec.js
index 8f6fe3cd37a..63df63a9b00 100644
--- a/spec/frontend/vue_mr_widget/components/extensions/index_spec.js
+++ b/spec/frontend/vue_mr_widget/components/extensions/index_spec.js
@@ -1,4 +1,7 @@
-import { registerExtension, extensions } from '~/vue_merge_request_widget/components/extensions';
+import {
+ registerExtension,
+ registeredExtensions,
+} from '~/vue_merge_request_widget/components/extensions';
import ExtensionBase from '~/vue_merge_request_widget/components/extensions/base.vue';
describe('MR widget extension registering', () => {
@@ -14,7 +17,7 @@ describe('MR widget extension registering', () => {
},
});
- expect(extensions[0]).toEqual(
+ expect(registeredExtensions.extensions[0]).toEqual(
expect.objectContaining({
extends: ExtensionBase,
name: 'Test',
diff --git a/spec/frontend/vue_mr_widget/components/extensions/status_icon_spec.js b/spec/frontend/vue_mr_widget/components/extensions/status_icon_spec.js
new file mode 100644
index 00000000000..f3aa5bb774f
--- /dev/null
+++ b/spec/frontend/vue_mr_widget/components/extensions/status_icon_spec.js
@@ -0,0 +1,36 @@
+import { GlIcon, GlLoadingIcon } from '@gitlab/ui';
+import { shallowMount } from '@vue/test-utils';
+import StatusIcon from '~/vue_merge_request_widget/components/extensions/status_icon.vue';
+
+let wrapper;
+
+function factory(propsData = {}) {
+ wrapper = shallowMount(StatusIcon, {
+ propsData,
+ });
+}
+
+describe('MR widget extensions status icon', () => {
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ it('renders loading icon', () => {
+ factory({ name: 'test', isLoading: true, iconName: 'failed' });
+
+ expect(wrapper.findComponent(GlLoadingIcon).exists()).toBe(true);
+ });
+
+ it('renders status icon', () => {
+ factory({ name: 'test', isLoading: false, iconName: 'failed' });
+
+ expect(wrapper.findComponent(GlIcon).exists()).toBe(true);
+ expect(wrapper.findComponent(GlIcon).props('name')).toBe('status-failed');
+ });
+
+ it('sets aria-label for status icon', () => {
+ factory({ name: 'test', isLoading: false, iconName: 'failed' });
+
+ expect(wrapper.findComponent(GlIcon).props('ariaLabel')).toBe('Failed test');
+ });
+});
diff --git a/spec/frontend/vue_mr_widget/components/mr_widget_pipeline_container_spec.js b/spec/frontend/vue_mr_widget/components/mr_widget_pipeline_container_spec.js
index 5ec719b17d6..efe2bf75c3f 100644
--- a/spec/frontend/vue_mr_widget/components/mr_widget_pipeline_container_spec.js
+++ b/spec/frontend/vue_mr_widget/components/mr_widget_pipeline_container_spec.js
@@ -1,5 +1,6 @@
import { mount } from '@vue/test-utils';
import MockAdapter from 'axios-mock-adapter';
+import { extendedWrapper } from 'helpers/vue_test_utils_helper';
import axios from '~/lib/utils/axios_utils';
import ArtifactsApp from '~/vue_merge_request_widget/components/artifacts_list_app.vue';
import DeploymentList from '~/vue_merge_request_widget/components/deployment/deployment_list.vue';
@@ -12,12 +13,14 @@ describe('MrWidgetPipelineContainer', () => {
let mock;
const factory = (props = {}) => {
- wrapper = mount(MrWidgetPipelineContainer, {
- propsData: {
- mr: { ...mockStore },
- ...props,
- },
- });
+ wrapper = extendedWrapper(
+ mount(MrWidgetPipelineContainer, {
+ propsData: {
+ mr: { ...mockStore },
+ ...props,
+ },
+ }),
+ );
};
beforeEach(() => {
@@ -30,6 +33,7 @@ describe('MrWidgetPipelineContainer', () => {
});
const findDeploymentList = () => wrapper.findComponent(DeploymentList);
+ const findCIErrorMessage = () => wrapper.findByTestId('ci-error-message');
describe('when pre merge', () => {
beforeEach(() => {
@@ -69,15 +73,21 @@ describe('MrWidgetPipelineContainer', () => {
beforeEach(() => {
factory({
isPostMerge: true,
+ mr: {
+ ...mockStore,
+ pipeline: {},
+ ciStatus: undefined,
+ },
});
});
it('renders pipeline', () => {
expect(wrapper.find(MrWidgetPipeline).exists()).toBe(true);
+ expect(findCIErrorMessage().exists()).toBe(false);
expect(wrapper.find(MrWidgetPipeline).props()).toMatchObject({
pipeline: mockStore.mergePipeline,
pipelineCoverageDelta: mockStore.pipelineCoverageDelta,
- ciStatus: mockStore.ciStatus,
+ ciStatus: mockStore.mergePipeline.details.status.text,
hasCi: mockStore.hasCI,
sourceBranch: mockStore.targetBranch,
sourceBranchLink: mockStore.targetBranch,
@@ -92,7 +102,6 @@ describe('MrWidgetPipelineContainer', () => {
targetBranch: 'Foo<script>alert("XSS")</script>',
},
});
-
expect(wrapper.find(MrWidgetPipeline).props().sourceBranchLink).toBe('Foo');
});
diff --git a/spec/frontend/vue_mr_widget/components/states/mr_widget_commits_header_spec.js b/spec/frontend/vue_mr_widget/components/states/mr_widget_commits_header_spec.js
index b31a75f30d3..2ff94a547f4 100644
--- a/spec/frontend/vue_mr_widget/components/states/mr_widget_commits_header_spec.js
+++ b/spec/frontend/vue_mr_widget/components/states/mr_widget_commits_header_spec.js
@@ -1,4 +1,5 @@
import { shallowMount } from '@vue/test-utils';
+import { GlSprintf } from '@gitlab/ui';
import CommitsHeader from '~/vue_merge_request_widget/components/states/commits_header.vue';
describe('Commits header component', () => {
@@ -6,6 +7,9 @@ describe('Commits header component', () => {
const createComponent = (props) => {
wrapper = shallowMount(CommitsHeader, {
+ stubs: {
+ GlSprintf,
+ },
propsData: {
isSquashEnabled: false,
targetBranch: 'main',
diff --git a/spec/frontend/vue_mr_widget/components/states/mr_widget_ready_to_merge_spec.js b/spec/frontend/vue_mr_widget/components/states/mr_widget_ready_to_merge_spec.js
index e41fb815c8d..f0fbb1d5851 100644
--- a/spec/frontend/vue_mr_widget/components/states/mr_widget_ready_to_merge_spec.js
+++ b/spec/frontend/vue_mr_widget/components/states/mr_widget_ready_to_merge_spec.js
@@ -45,6 +45,8 @@ const createTestMr = (customConfig) => {
preferredAutoMergeStrategy: MWPS_MERGE_STRATEGY,
availableAutoMergeStrategies: [MWPS_MERGE_STRATEGY],
mergeImmediatelyDocsPath: 'path/to/merge/immediately/docs',
+ transitionStateMachine: (transition) => eventHub.$emit('StateMachineValueChanged', transition),
+ translateStateToMachine: () => this.transitionStateMachine(),
};
Object.assign(mr, customConfig.mr);
@@ -304,6 +306,9 @@ describe('ReadyToMerge', () => {
setImmediate(() => {
expect(wrapper.vm.isMakingRequest).toBeTruthy();
expect(eventHub.$emit).toHaveBeenCalledWith('MRWidgetUpdateRequested');
+ expect(eventHub.$emit).toHaveBeenCalledWith('StateMachineValueChanged', {
+ transition: 'start-auto-merge',
+ });
const params = wrapper.vm.service.merge.mock.calls[0][0];
@@ -341,10 +346,15 @@ describe('ReadyToMerge', () => {
it('should handle merge action accepted case', (done) => {
createComponent();
+ jest.spyOn(eventHub, '$emit').mockImplementation(() => {});
jest.spyOn(wrapper.vm.service, 'merge').mockReturnValue(returnPromise('success'));
jest.spyOn(wrapper.vm, 'initiateMergePolling').mockImplementation(() => {});
wrapper.vm.handleMergeButtonClick();
+ expect(eventHub.$emit).toHaveBeenCalledWith('StateMachineValueChanged', {
+ transition: 'start-merge',
+ });
+
setImmediate(() => {
expect(wrapper.vm.isMakingRequest).toBeTruthy();
expect(wrapper.vm.initiateMergePolling).toHaveBeenCalled();
diff --git a/spec/frontend/vue_mr_widget/components/states/mr_widget_wip_spec.js b/spec/frontend/vue_mr_widget/components/states/mr_widget_wip_spec.js
index 61e44140efc..be15e4df66d 100644
--- a/spec/frontend/vue_mr_widget/components/states/mr_widget_wip_spec.js
+++ b/spec/frontend/vue_mr_widget/components/states/mr_widget_wip_spec.js
@@ -1,9 +1,9 @@
import Vue from 'vue';
-import createFlash from '~/flash';
import WorkInProgress from '~/vue_merge_request_widget/components/states/work_in_progress.vue';
+import toast from '~/vue_shared/plugins/global_toast';
import eventHub from '~/vue_merge_request_widget/event_hub';
-jest.mock('~/flash');
+jest.mock('~/vue_shared/plugins/global_toast');
const createComponent = () => {
const Component = Vue.extend(WorkInProgress);
@@ -63,10 +63,7 @@ describe('Wip', () => {
setImmediate(() => {
expect(vm.isMakingRequest).toBeTruthy();
expect(eventHub.$emit).toHaveBeenCalledWith('UpdateWidgetData', mrObj);
- expect(createFlash).toHaveBeenCalledWith({
- message: 'Marked as ready. Merging is now allowed.',
- type: 'notice',
- });
+ expect(toast).toHaveBeenCalledWith('Marked as ready. Merging is now allowed.');
done();
});
});
diff --git a/spec/frontend/vue_mr_widget/mock_data.js b/spec/frontend/vue_mr_widget/mock_data.js
index f356f6fb5bf..34a741cf8f2 100644
--- a/spec/frontend/vue_mr_widget/mock_data.js
+++ b/spec/frontend/vue_mr_widget/mock_data.js
@@ -280,7 +280,7 @@ export default {
merge_train_index: 1,
security_reports_docs_path: 'security-reports-docs-path',
sast_comparison_path: '/sast_comparison_path',
- secret_scanning_comparison_path: '/secret_scanning_comparison_path',
+ secret_detection_comparison_path: '/secret_detection_comparison_path',
gitpod_enabled: true,
show_gitpod_button: true,
gitpod_url: 'http://gitpod.localhost',
diff --git a/spec/frontend/vue_mr_widget/mr_widget_how_to_merge_modal_spec.js b/spec/frontend/vue_mr_widget/mr_widget_how_to_merge_modal_spec.js
index bd22183cbea..913d5860b48 100644
--- a/spec/frontend/vue_mr_widget/mr_widget_how_to_merge_modal_spec.js
+++ b/spec/frontend/vue_mr_widget/mr_widget_how_to_merge_modal_spec.js
@@ -8,11 +8,9 @@ describe('MRWidgetHowToMerge', () => {
function mountComponent({ data = {}, props = {} } = {}) {
wrapper = shallowMount(MrWidgetHowToMergeModal, {
data() {
- return { ...data };
- },
- propsData: {
- ...props,
+ return data;
},
+ propsData: props,
stubs: {},
});
}
@@ -57,4 +55,16 @@ describe('MRWidgetHowToMerge', () => {
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\'');
+ });
+
+ 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_mr_widget/mr_widget_options_spec.js b/spec/frontend/vue_mr_widget/mr_widget_options_spec.js
index c50cf7cb076..5aba6982886 100644
--- a/spec/frontend/vue_mr_widget/mr_widget_options_spec.js
+++ b/spec/frontend/vue_mr_widget/mr_widget_options_spec.js
@@ -1,13 +1,19 @@
+import { GlBadge, GlLink, GlIcon } from '@gitlab/ui';
import { mount } from '@vue/test-utils';
import MockAdapter from 'axios-mock-adapter';
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 { securityReportMergeRequestDownloadPathsQueryResponse } from 'jest/vue_shared/security_reports/mock_data';
import axios from '~/lib/utils/axios_utils';
import { setFaviconOverlay } from '~/lib/utils/favicon';
import notify from '~/lib/utils/notify';
import SmartInterval from '~/smart_interval';
+import {
+ registerExtension,
+ registeredExtensions,
+} from '~/vue_merge_request_widget/components/extensions';
import { SUCCESS } from '~/vue_merge_request_widget/components/deployment/constants';
import eventHub from '~/vue_merge_request_widget/event_hub';
import MrWidgetOptions from '~/vue_merge_request_widget/mr_widget_options.vue';
@@ -15,6 +21,7 @@ import { stateKey } from '~/vue_merge_request_widget/stores/state_maps';
import securityReportMergeRequestDownloadPathsQuery from '~/vue_shared/security_reports/graphql/queries/security_report_merge_request_download_paths.query.graphql';
import { faviconDataUrl, overlayDataUrl } from '../lib/utils/mock_data';
import mockData from './mock_data';
+import testExtension from './test_extension';
jest.mock('~/smart_interval');
@@ -879,4 +886,48 @@ describe('MrWidgetOptions', () => {
});
});
});
+
+ describe('mock extension', () => {
+ beforeEach(() => {
+ registerExtension(testExtension);
+
+ createComponent();
+ });
+
+ afterEach(() => {
+ registeredExtensions.extensions = [];
+ });
+
+ it('renders collapsed data', async () => {
+ await waitForPromises();
+
+ expect(wrapper.text()).toContain('Test extension summary count: 1');
+ });
+
+ it('renders full data', async () => {
+ await waitForPromises();
+
+ wrapper
+ .find('[data-testid="widget-extension"] [data-testid="toggle-button"]')
+ .trigger('click');
+
+ await Vue.nextTick();
+
+ const collapsedSection = wrapper.find('[data-testid="widget-extension-collapsed-section"]');
+ expect(collapsedSection.exists()).toBe(true);
+ expect(collapsedSection.text()).toContain('Hello world');
+
+ // Renders icon in the row
+ expect(collapsedSection.find(GlIcon).exists()).toBe(true);
+ expect(collapsedSection.find(GlIcon).props('name')).toBe('status-failed');
+
+ // Renders badge in the row
+ expect(collapsedSection.find(GlBadge).exists()).toBe(true);
+ expect(collapsedSection.find(GlBadge).text()).toBe('Closed');
+
+ // Renders a link in the row
+ expect(collapsedSection.find(GlLink).exists()).toBe(true);
+ expect(collapsedSection.find(GlLink).text()).toBe('GitLab.com');
+ });
+ });
});
diff --git a/spec/frontend/vue_mr_widget/stores/mr_widget_store_spec.js b/spec/frontend/vue_mr_widget/stores/mr_widget_store_spec.js
index bf0179aa425..febcfcd4019 100644
--- a/spec/frontend/vue_mr_widget/stores/mr_widget_store_spec.js
+++ b/spec/frontend/vue_mr_widget/stores/mr_widget_store_spec.js
@@ -162,7 +162,7 @@ describe('MergeRequestStore', () => {
expect(store.securityReportsDocsPath).toBe('security-reports-docs-path');
});
- it.each(['sast_comparison_path', 'secret_scanning_comparison_path'])(
+ it.each(['sast_comparison_path', 'secret_detection_comparison_path'])(
'should set %s path',
(property) => {
// Ensure something is set in the mock data
diff --git a/spec/frontend/vue_mr_widget/test_extension.js b/spec/frontend/vue_mr_widget/test_extension.js
new file mode 100644
index 00000000000..a29a4d2fb46
--- /dev/null
+++ b/spec/frontend/vue_mr_widget/test_extension.js
@@ -0,0 +1,37 @@
+import { EXTENSION_ICONS } from '~/vue_merge_request_widget/constants';
+
+export default {
+ name: 'WidgetTestExtension',
+ props: ['targetProjectFullPath'],
+ computed: {
+ summary({ count, targetProjectFullPath }) {
+ return `Test extension summary count: ${count} & ${targetProjectFullPath}`;
+ },
+ statusIcon({ count }) {
+ return count > 0 ? EXTENSION_ICONS.warning : EXTENSION_ICONS.success;
+ },
+ },
+ methods: {
+ fetchCollapsedData({ targetProjectFullPath }) {
+ return Promise.resolve({ targetProjectFullPath, count: 1 });
+ },
+ fetchFullData() {
+ return Promise.resolve([
+ {
+ id: 1,
+ text: 'Hello world',
+ icon: {
+ name: EXTENSION_ICONS.failed,
+ },
+ badge: {
+ text: 'Closed',
+ },
+ link: {
+ href: 'https://gitlab.com',
+ text: 'GitLab.com',
+ },
+ },
+ ]);
+ },
+ },
+};
diff --git a/spec/frontend/vue_shared/components/__snapshots__/clone_dropdown_spec.js.snap b/spec/frontend/vue_shared/components/__snapshots__/clone_dropdown_spec.js.snap
index c7758b0faef..44b4c0398cd 100644
--- a/spec/frontend/vue_shared/components/__snapshots__/clone_dropdown_spec.js.snap
+++ b/spec/frontend/vue_shared/components/__snapshots__/clone_dropdown_spec.js.snap
@@ -4,12 +4,12 @@ exports[`Clone Dropdown Button rendering matches the snapshot 1`] = `
<gl-dropdown-stub
category="primary"
clearalltext="Clear all"
+ clearalltextclass="gl-px-5"
headertext=""
hideheaderborder="true"
highlighteditemstitle="Selected"
highlighteditemstitleclass="gl-px-5"
right="true"
- showhighlighteditemstitle="true"
size="medium"
text="Clone"
variant="info"
@@ -35,6 +35,7 @@ exports[`Clone Dropdown Button rendering matches the snapshot 1`] = `
<b-form-input-stub
class="gl-form-input"
debounce="0"
+ formatter="[Function]"
readonly="true"
type="text"
value="ssh://foo.bar"
@@ -78,6 +79,7 @@ exports[`Clone Dropdown Button rendering matches the snapshot 1`] = `
<b-form-input-stub
class="gl-form-input"
debounce="0"
+ formatter="[Function]"
readonly="true"
type="text"
value="http://foo.bar"
diff --git a/spec/frontend/vue_shared/components/__snapshots__/split_button_spec.js.snap b/spec/frontend/vue_shared/components/__snapshots__/split_button_spec.js.snap
index f2ff12b2acd..2b89e36344d 100644
--- a/spec/frontend/vue_shared/components/__snapshots__/split_button_spec.js.snap
+++ b/spec/frontend/vue_shared/components/__snapshots__/split_button_spec.js.snap
@@ -4,12 +4,12 @@ exports[`SplitButton renders actionItems 1`] = `
<gl-dropdown-stub
category="primary"
clearalltext="Clear all"
+ clearalltextclass="gl-px-5"
headertext=""
hideheaderborder="true"
highlighteditemstitle="Selected"
highlighteditemstitleclass="gl-px-5"
menu-class=""
- showhighlighteditemstitle="true"
size="medium"
split="true"
text="professor"
diff --git a/spec/frontend/vue_shared/components/blob_viewers/simple_viewer_spec.js b/spec/frontend/vue_shared/components/blob_viewers/simple_viewer_spec.js
index c6c351a7f3f..3277aab43f0 100644
--- a/spec/frontend/vue_shared/components/blob_viewers/simple_viewer_spec.js
+++ b/spec/frontend/vue_shared/components/blob_viewers/simple_viewer_spec.js
@@ -1,25 +1,16 @@
import { shallowMount } from '@vue/test-utils';
-import waitForPromises from 'helpers/wait_for_promises';
import { HIGHLIGHT_CLASS_NAME } from '~/vue_shared/components/blob_viewers/constants';
import SimpleViewer from '~/vue_shared/components/blob_viewers/simple_viewer.vue';
-import SourceEditor from '~/vue_shared/components/source_editor.vue';
describe('Blob Simple Viewer component', () => {
let wrapper;
const contentMock = `<span id="LC1">First</span>\n<span id="LC2">Second</span>\n<span id="LC3">Third</span>`;
const blobHash = 'foo-bar';
- function createComponent(
- content = contentMock,
- isRawContent = false,
- isRefactorFlagEnabled = false,
- ) {
+ function createComponent(content = contentMock, isRawContent = false) {
wrapper = shallowMount(SimpleViewer, {
provide: {
blobHash,
- glFeatures: {
- refactorBlobViewer: isRefactorFlagEnabled,
- },
},
propsData: {
content,
@@ -94,32 +85,4 @@ describe('Blob Simple Viewer component', () => {
});
});
});
-
- describe('Vue refactoring to use Source Editor', () => {
- const findSourceEditor = () => wrapper.find(SourceEditor);
-
- it.each`
- doesRender | condition | isRawContent | isRefactorFlagEnabled
- ${'Does not'} | ${'rawContent is not specified'} | ${false} | ${true}
- ${'Does not'} | ${'feature flag is disabled is not specified'} | ${true} | ${false}
- ${'Does not'} | ${'both, the FF and rawContent are not specified'} | ${false} | ${false}
- ${'Does'} | ${'both, the FF and rawContent are specified'} | ${true} | ${true}
- `(
- '$doesRender render Source Editor component in readonly mode when $condition',
- async ({ isRawContent, isRefactorFlagEnabled } = {}) => {
- createComponent('raw content', isRawContent, isRefactorFlagEnabled);
- await waitForPromises();
-
- if (isRawContent && isRefactorFlagEnabled) {
- expect(findSourceEditor().exists()).toBe(true);
-
- expect(findSourceEditor().props('value')).toBe('raw content');
- expect(findSourceEditor().props('fileName')).toBe('test.js');
- expect(findSourceEditor().props('editorOptions')).toEqual({ readOnly: true });
- } else {
- expect(findSourceEditor().exists()).toBe(false);
- }
- },
- );
- });
});
diff --git a/spec/frontend/vue_shared/components/color_picker/color_picker_spec.js b/spec/frontend/vue_shared/components/color_picker/color_picker_spec.js
index d30f36ec63c..fef50bdaccc 100644
--- a/spec/frontend/vue_shared/components/color_picker/color_picker_spec.js
+++ b/spec/frontend/vue_shared/components/color_picker/color_picker_spec.js
@@ -111,15 +111,13 @@ describe('ColorPicker', () => {
gon.suggested_label_colors = {};
createComponent(shallowMount);
- expect(description()).toBe('Choose any color');
+ expect(description()).toBe('Enter any color.');
expect(presetColors().exists()).toBe(false);
});
it('shows the suggested colors', () => {
createComponent(shallowMount);
- expect(description()).toBe(
- 'Choose any color. Or you can choose one of the suggested colors below',
- );
+ expect(description()).toBe('Enter any color or choose one of the suggested colors below.');
expect(presetColors()).toHaveLength(4);
});
diff --git a/spec/frontend/vue_shared/components/dismissible_feedback_alert_spec.js b/spec/frontend/vue_shared/components/dismissible_feedback_alert_spec.js
index 175d79dd1c2..194681a6138 100644
--- a/spec/frontend/vue_shared/components/dismissible_feedback_alert_spec.js
+++ b/spec/frontend/vue_shared/components/dismissible_feedback_alert_spec.js
@@ -1,4 +1,4 @@
-import { GlAlert, GlSprintf, GlLink } from '@gitlab/ui';
+import { GlAlert, GlSprintf } from '@gitlab/ui';
import { mount, shallowMount } from '@vue/test-utils';
import { useLocalStorageSpy } from 'helpers/local_storage_helper';
import Component from '~/vue_shared/components/dismissible_feedback_alert.vue';
@@ -8,20 +8,13 @@ describe('Dismissible Feedback Alert', () => {
let wrapper;
- const defaultProps = {
- featureName: 'Dependency List',
- feedbackLink: 'https://gitlab.link',
- };
-
+ const featureName = 'Dependency List';
const STORAGE_DISMISSAL_KEY = 'dependency_list_feedback_dismissed';
- const createComponent = ({ props, shallow } = {}) => {
- const mountFn = shallow ? shallowMount : mount;
-
+ const createComponent = ({ mountFn = shallowMount } = {}) => {
wrapper = mountFn(Component, {
propsData: {
- ...defaultProps,
- ...props,
+ featureName,
},
stubs: {
GlSprintf,
@@ -34,8 +27,8 @@ describe('Dismissible Feedback Alert', () => {
wrapper = null;
});
- const findAlert = () => wrapper.find(GlAlert);
- const findLink = () => wrapper.find(GlLink);
+ const createFullComponent = () => createComponent({ mountFn: mount });
+ const findAlert = () => wrapper.findComponent(GlAlert);
describe('with default', () => {
beforeEach(() => {
@@ -46,17 +39,6 @@ describe('Dismissible Feedback Alert', () => {
expect(findAlert().exists()).toBe(true);
});
- it('contains feature name', () => {
- expect(findAlert().text()).toContain(defaultProps.featureName);
- });
-
- it('contains provided link', () => {
- const link = findLink();
-
- expect(link.attributes('href')).toBe(defaultProps.feedbackLink);
- expect(link.attributes('target')).toBe('_blank');
- });
-
it('should have the storage key set', () => {
expect(wrapper.vm.storageKey).toBe(STORAGE_DISMISSAL_KEY);
});
@@ -65,7 +47,7 @@ describe('Dismissible Feedback Alert', () => {
describe('dismissible', () => {
describe('after dismissal', () => {
beforeEach(() => {
- createComponent({ shallow: false });
+ createFullComponent();
findAlert().vm.$emit('dismiss');
});
@@ -81,7 +63,7 @@ describe('Dismissible Feedback Alert', () => {
describe('already dismissed', () => {
it('should not show the alert once dismissed', async () => {
localStorage.setItem(STORAGE_DISMISSAL_KEY, 'true');
- createComponent({ shallow: false });
+ createFullComponent();
await wrapper.vm.$nextTick();
expect(findAlert().exists()).toBe(false);
diff --git a/spec/frontend/vue_shared/components/dropdown_keyboard_navigation_spec.js b/spec/frontend/vue_shared/components/dropdown_keyboard_navigation_spec.js
new file mode 100644
index 00000000000..996df34f2ff
--- /dev/null
+++ b/spec/frontend/vue_shared/components/dropdown_keyboard_navigation_spec.js
@@ -0,0 +1,141 @@
+import { shallowMount } from '@vue/test-utils';
+import DropdownKeyboardNavigation from '~/vue_shared/components/dropdown_keyboard_navigation.vue';
+import { UP_KEY_CODE, DOWN_KEY_CODE, TAB_KEY_CODE } from '~/lib/utils/keycodes';
+
+const MOCK_INDEX = 0;
+const MOCK_MAX = 10;
+const MOCK_MIN = 0;
+const MOCK_DEFAULT_INDEX = 0;
+
+describe('DropdownKeyboardNavigation', () => {
+ let wrapper;
+
+ const defaultProps = {
+ index: MOCK_INDEX,
+ max: MOCK_MAX,
+ min: MOCK_MIN,
+ defaultIndex: MOCK_DEFAULT_INDEX,
+ };
+
+ const createComponent = (props) => {
+ wrapper = shallowMount(DropdownKeyboardNavigation, {
+ propsData: {
+ ...defaultProps,
+ ...props,
+ },
+ });
+ };
+
+ const helpers = {
+ arrowDown: () => {
+ document.dispatchEvent(new KeyboardEvent('keydown', { keyCode: DOWN_KEY_CODE }));
+ },
+ arrowUp: () => {
+ document.dispatchEvent(new KeyboardEvent('keydown', { keyCode: UP_KEY_CODE }));
+ },
+ tab: () => {
+ document.dispatchEvent(new KeyboardEvent('keydown', { keyCode: TAB_KEY_CODE }));
+ },
+ };
+
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ describe('onInit', () => {
+ beforeEach(() => {
+ createComponent();
+ });
+
+ it('should $emit @change with the default index', async () => {
+ expect(wrapper.emitted('change')[0]).toStrictEqual([MOCK_DEFAULT_INDEX]);
+ });
+
+ it('should $emit @change with the default index when max changes', async () => {
+ wrapper.setProps({ max: 20 });
+ await wrapper.vm.$nextTick();
+ // The first @change`call happens on created() so we test for the second [1]
+ expect(wrapper.emitted('change')[1]).toStrictEqual([MOCK_DEFAULT_INDEX]);
+ });
+ });
+
+ describe('keydown events', () => {
+ let incrementSpy;
+
+ beforeEach(() => {
+ createComponent();
+ incrementSpy = jest.spyOn(wrapper.vm, 'increment');
+ });
+
+ afterEach(() => {
+ incrementSpy.mockRestore();
+ });
+
+ it('onKeydown-Down calls increment(1)', () => {
+ helpers.arrowDown();
+
+ expect(incrementSpy).toHaveBeenCalledWith(1);
+ });
+
+ it('onKeydown-Up calls increment(-1)', () => {
+ helpers.arrowUp();
+
+ expect(incrementSpy).toHaveBeenCalledWith(-1);
+ });
+
+ it('onKeydown-Tab $emits @tab event', () => {
+ helpers.tab();
+
+ expect(wrapper.emitted('tab')).toHaveLength(1);
+ });
+ });
+
+ describe('increment', () => {
+ describe('when max is 0', () => {
+ beforeEach(() => {
+ createComponent({ max: 0 });
+ });
+
+ it('does not $emit any @change events', () => {
+ helpers.arrowDown();
+
+ // The first @change`call happens on created() so we test that we only have 1 call
+ expect(wrapper.emitted('change')).toHaveLength(1);
+ });
+ });
+
+ describe.each`
+ keyboardAction | direction | index | max | min
+ ${helpers.arrowDown} | ${1} | ${10} | ${10} | ${0}
+ ${helpers.arrowUp} | ${-1} | ${0} | ${10} | ${0}
+ `('moving out of bounds', ({ keyboardAction, direction, index, max, min }) => {
+ beforeEach(() => {
+ createComponent({ index, max, min });
+ keyboardAction();
+ });
+
+ it(`in ${direction} direction does not $emit any @change events`, () => {
+ // The first @change`call happens on created() so we test that we only have 1 call
+ expect(wrapper.emitted('change')).toHaveLength(1);
+ });
+ });
+
+ describe.each`
+ keyboardAction | direction | index | max | min
+ ${helpers.arrowDown} | ${1} | ${0} | ${10} | ${0}
+ ${helpers.arrowUp} | ${-1} | ${10} | ${10} | ${0}
+ `('moving in bounds', ({ keyboardAction, direction, index, max, min }) => {
+ beforeEach(() => {
+ createComponent({ index, max, min });
+ keyboardAction();
+ });
+
+ it(`in ${direction} direction $emits @change event with the correct index ${
+ index + direction
+ }`, () => {
+ // The first @change`call happens on created() so we test for the second [1]
+ expect(wrapper.emitted('change')[1]).toStrictEqual([index + direction]);
+ });
+ });
+ });
+});
diff --git a/spec/frontend/vue_shared/components/filtered_search_bar/mock_data.js b/spec/frontend/vue_shared/components/filtered_search_bar/mock_data.js
index 134c6c8b929..ae02c554e13 100644
--- a/spec/frontend/vue_shared/components/filtered_search_bar/mock_data.js
+++ b/spec/frontend/vue_shared/components/filtered_search_bar/mock_data.js
@@ -141,7 +141,62 @@ export const mockEpicToken = {
token: EpicToken,
operators: OPERATOR_IS_ONLY,
idProperty: 'iid',
- fetchEpics: () => Promise.resolve({ data: mockEpics }),
+ fullPath: 'gitlab-org',
+};
+
+export const mockEpicNode1 = {
+ __typename: 'Epic',
+ parent: null,
+ id: 'gid://gitlab/Epic/40',
+ iid: '2',
+ title: 'Marketing epic',
+ description: 'Mock epic description',
+ state: 'opened',
+ startDate: '2017-12-25',
+ dueDate: '2018-02-15',
+ webUrl: 'http://gdk.test:3000/groups/gitlab-org/marketing/-/epics/1',
+ hasChildren: false,
+ hasParent: false,
+ confidential: false,
+};
+
+export const mockEpicNode2 = {
+ __typename: 'Epic',
+ parent: null,
+ id: 'gid://gitlab/Epic/41',
+ iid: '3',
+ title: 'Another marketing',
+ startDate: '2017-12-26',
+ dueDate: '2018-03-10',
+ state: 'opened',
+ webUrl: 'http://gdk.test:3000/groups/gitlab-org/marketing/-/epics/2',
+};
+
+export const mockGroupEpicsQueryResponse = {
+ data: {
+ group: {
+ id: 'gid://gitlab/Group/1',
+ name: 'Gitlab Org',
+ epics: {
+ edges: [
+ {
+ node: {
+ ...mockEpicNode1,
+ },
+ __typename: 'EpicEdge',
+ },
+ {
+ node: {
+ ...mockEpicNode2,
+ },
+ __typename: 'EpicEdge',
+ },
+ ],
+ __typename: 'EpicConnection',
+ },
+ __typename: 'Group',
+ },
+ },
};
export const mockReactionEmojiToken = {
diff --git a/spec/frontend/vue_shared/components/filtered_search_bar/tokens/author_token_spec.js b/spec/frontend/vue_shared/components/filtered_search_bar/tokens/author_token_spec.js
index d3e1bfef561..14fcffd3c50 100644
--- a/spec/frontend/vue_shared/components/filtered_search_bar/tokens/author_token_spec.js
+++ b/spec/frontend/vue_shared/components/filtered_search_bar/tokens/author_token_spec.js
@@ -57,7 +57,7 @@ function createComponent(options = {}) {
provide: {
portalName: 'fake target',
alignSuggestions: function fakeAlignSuggestions() {},
- suggestionsListClass: 'custom-class',
+ suggestionsListClass: () => 'custom-class',
},
data() {
return { ...data };
diff --git a/spec/frontend/vue_shared/components/filtered_search_bar/tokens/base_token_spec.js b/spec/frontend/vue_shared/components/filtered_search_bar/tokens/base_token_spec.js
index eb1dbed52cc..f9ce0338d2f 100644
--- a/spec/frontend/vue_shared/components/filtered_search_bar/tokens/base_token_spec.js
+++ b/spec/frontend/vue_shared/components/filtered_search_bar/tokens/base_token_spec.js
@@ -67,7 +67,7 @@ function createComponent({
provide: {
portalName: 'fake target',
alignSuggestions: jest.fn(),
- suggestionsListClass: 'custom-class',
+ suggestionsListClass: () => 'custom-class',
},
stubs,
slots,
@@ -206,26 +206,50 @@ describe('BaseToken', () => {
describe('events', () => {
let wrapperWithNoStubs;
- beforeEach(() => {
- wrapperWithNoStubs = createComponent({
- stubs: { Portal: true },
- });
- });
-
afterEach(() => {
wrapperWithNoStubs.destroy();
});
- it('emits `fetch-suggestions` event on component after a delay when component emits `input` event', async () => {
- jest.useFakeTimers();
+ describe('when activeToken has been selected', () => {
+ beforeEach(() => {
+ wrapperWithNoStubs = createComponent({
+ props: {
+ ...mockProps,
+ getActiveTokenValue: () => ({ title: '' }),
+ suggestionsLoading: true,
+ },
+ stubs: { Portal: true },
+ });
+ });
+ it('does not emit `fetch-suggestions` event on component after a delay when component emits `input` event', async () => {
+ jest.useFakeTimers();
- wrapperWithNoStubs.find(GlFilteredSearchToken).vm.$emit('input', { data: 'foo' });
- await wrapperWithNoStubs.vm.$nextTick();
+ wrapperWithNoStubs.find(GlFilteredSearchToken).vm.$emit('input', { data: 'foo' });
+ await wrapperWithNoStubs.vm.$nextTick();
- jest.runAllTimers();
+ jest.runAllTimers();
- expect(wrapperWithNoStubs.emitted('fetch-suggestions')).toBeTruthy();
- expect(wrapperWithNoStubs.emitted('fetch-suggestions')[2]).toEqual(['foo']);
+ expect(wrapperWithNoStubs.emitted('fetch-suggestions')).toEqual([['']]);
+ });
+ });
+
+ describe('when activeToken has not been selected', () => {
+ beforeEach(() => {
+ wrapperWithNoStubs = createComponent({
+ stubs: { Portal: true },
+ });
+ });
+ it('emits `fetch-suggestions` event on component after a delay when component emits `input` event', async () => {
+ jest.useFakeTimers();
+
+ wrapperWithNoStubs.find(GlFilteredSearchToken).vm.$emit('input', { data: 'foo' });
+ await wrapperWithNoStubs.vm.$nextTick();
+
+ jest.runAllTimers();
+
+ expect(wrapperWithNoStubs.emitted('fetch-suggestions')).toBeTruthy();
+ expect(wrapperWithNoStubs.emitted('fetch-suggestions')[2]).toEqual(['foo']);
+ });
});
});
});
diff --git a/spec/frontend/vue_shared/components/filtered_search_bar/tokens/branch_token_spec.js b/spec/frontend/vue_shared/components/filtered_search_bar/tokens/branch_token_spec.js
index 09eac636cae..f3e8b2d0c1b 100644
--- a/spec/frontend/vue_shared/components/filtered_search_bar/tokens/branch_token_spec.js
+++ b/spec/frontend/vue_shared/components/filtered_search_bar/tokens/branch_token_spec.js
@@ -42,7 +42,7 @@ function createComponent(options = {}) {
provide: {
portalName: 'fake target',
alignSuggestions: function fakeAlignSuggestions() {},
- suggestionsListClass: 'custom-class',
+ suggestionsListClass: () => 'custom-class',
},
stubs,
});
diff --git a/spec/frontend/vue_shared/components/filtered_search_bar/tokens/emoji_token_spec.js b/spec/frontend/vue_shared/components/filtered_search_bar/tokens/emoji_token_spec.js
index c2d61fd9f05..36071c900df 100644
--- a/spec/frontend/vue_shared/components/filtered_search_bar/tokens/emoji_token_spec.js
+++ b/spec/frontend/vue_shared/components/filtered_search_bar/tokens/emoji_token_spec.js
@@ -48,7 +48,7 @@ function createComponent(options = {}) {
provide: {
portalName: 'fake target',
alignSuggestions: function fakeAlignSuggestions() {},
- suggestionsListClass: 'custom-class',
+ suggestionsListClass: () => 'custom-class',
},
stubs,
});
diff --git a/spec/frontend/vue_shared/components/filtered_search_bar/tokens/epic_token_spec.js b/spec/frontend/vue_shared/components/filtered_search_bar/tokens/epic_token_spec.js
index 68ed46fc3a2..6ee5d50d396 100644
--- a/spec/frontend/vue_shared/components/filtered_search_bar/tokens/epic_token_spec.js
+++ b/spec/frontend/vue_shared/components/filtered_search_bar/tokens/epic_token_spec.js
@@ -1,15 +1,21 @@
-import { GlFilteredSearchToken, GlFilteredSearchTokenSegment } from '@gitlab/ui';
+import { GlFilteredSearchTokenSegment } from '@gitlab/ui';
import { mount } from '@vue/test-utils';
import MockAdapter from 'axios-mock-adapter';
+import Vue from 'vue';
+import VueApollo from 'vue-apollo';
+import createMockApollo from 'helpers/mock_apollo_helper';
import waitForPromises from 'helpers/wait_for_promises';
import createFlash from '~/flash';
import axios from '~/lib/utils/axios_utils';
+import searchEpicsQuery from '~/vue_shared/components/filtered_search_bar/queries/search_epics.query.graphql';
import EpicToken from '~/vue_shared/components/filtered_search_bar/tokens/epic_token.vue';
+import BaseToken from '~/vue_shared/components/filtered_search_bar/tokens/base_token.vue';
-import { mockEpicToken, mockEpics } from '../mock_data';
+import { mockEpicToken, mockEpics, mockGroupEpicsQueryResponse } from '../mock_data';
jest.mock('~/flash');
+Vue.use(VueApollo);
const defaultStubs = {
Portal: true,
@@ -21,31 +27,39 @@ const defaultStubs = {
},
};
-function createComponent(options = {}) {
- const {
- config = mockEpicToken,
- value = { data: '' },
- active = false,
- stubs = defaultStubs,
- } = options;
- return mount(EpicToken, {
- propsData: {
- config,
- value,
- active,
- },
- provide: {
- portalName: 'fake target',
- alignSuggestions: function fakeAlignSuggestions() {},
- suggestionsListClass: 'custom-class',
- },
- stubs,
- });
-}
-
describe('EpicToken', () => {
let mock;
let wrapper;
+ let fakeApollo;
+
+ const findBaseToken = () => wrapper.findComponent(BaseToken);
+
+ function createComponent(
+ options = {},
+ epicsQueryHandler = jest.fn().mockResolvedValue(mockGroupEpicsQueryResponse),
+ ) {
+ fakeApollo = createMockApollo([[searchEpicsQuery, epicsQueryHandler]]);
+ const {
+ config = mockEpicToken,
+ value = { data: '' },
+ active = false,
+ stubs = defaultStubs,
+ } = options;
+ return mount(EpicToken, {
+ apolloProvider: fakeApollo,
+ propsData: {
+ config,
+ value,
+ active,
+ },
+ provide: {
+ portalName: 'fake target',
+ alignSuggestions: function fakeAlignSuggestions() {},
+ suggestionsListClass: 'custom-class',
+ },
+ stubs,
+ });
+ }
beforeEach(() => {
mock = new MockAdapter(axios);
@@ -71,23 +85,20 @@ describe('EpicToken', () => {
describe('methods', () => {
describe('fetchEpicsBySearchTerm', () => {
- it('calls `config.fetchEpics` with provided searchTerm param', () => {
- jest.spyOn(wrapper.vm.config, 'fetchEpics');
+ it('calls fetchEpics with provided searchTerm param', () => {
+ jest.spyOn(wrapper.vm, 'fetchEpics');
- wrapper.vm.fetchEpicsBySearchTerm({ search: 'foo' });
+ findBaseToken().vm.$emit('fetch-suggestions', 'foo');
- expect(wrapper.vm.config.fetchEpics).toHaveBeenCalledWith({
- epicPath: '',
- search: 'foo',
- });
+ expect(wrapper.vm.fetchEpics).toHaveBeenCalledWith('foo');
});
it('sets response to `epics` when request is successful', async () => {
- jest.spyOn(wrapper.vm.config, 'fetchEpics').mockResolvedValue({
+ jest.spyOn(wrapper.vm, 'fetchEpics').mockResolvedValue({
data: mockEpics,
});
- wrapper.vm.fetchEpicsBySearchTerm({});
+ findBaseToken().vm.$emit('fetch-suggestions');
await waitForPromises();
@@ -95,9 +106,9 @@ describe('EpicToken', () => {
});
it('calls `createFlash` with flash error message when request fails', async () => {
- jest.spyOn(wrapper.vm.config, 'fetchEpics').mockRejectedValue({});
+ jest.spyOn(wrapper.vm, 'fetchEpics').mockRejectedValue({});
- wrapper.vm.fetchEpicsBySearchTerm({ search: 'foo' });
+ findBaseToken().vm.$emit('fetch-suggestions', 'foo');
await waitForPromises();
@@ -107,9 +118,9 @@ describe('EpicToken', () => {
});
it('sets `loading` to false when request completes', async () => {
- jest.spyOn(wrapper.vm.config, 'fetchEpics').mockRejectedValue({});
+ jest.spyOn(wrapper.vm, 'fetchEpics').mockRejectedValue({});
- wrapper.vm.fetchEpicsBySearchTerm({ search: 'foo' });
+ findBaseToken().vm.$emit('fetch-suggestions', 'foo');
await waitForPromises();
@@ -123,15 +134,15 @@ describe('EpicToken', () => {
beforeEach(async () => {
wrapper = createComponent({
- value: { data: `${mockEpics[0].group_full_path}::&${mockEpics[0].iid}` },
+ value: { data: `${mockEpics[0].title}::&${mockEpics[0].iid}` },
data: { epics: mockEpics },
});
await wrapper.vm.$nextTick();
});
- it('renders gl-filtered-search-token component', () => {
- expect(wrapper.find(GlFilteredSearchToken).exists()).toBe(true);
+ it('renders BaseToken component', () => {
+ expect(findBaseToken().exists()).toBe(true);
});
it('renders token item when value is selected', () => {
@@ -142,9 +153,9 @@ describe('EpicToken', () => {
});
it.each`
- value | valueType | tokenValueString
- ${`${mockEpics[0].group_full_path}::&${mockEpics[0].iid}`} | ${'string'} | ${`${mockEpics[0].title}::&${mockEpics[0].iid}`}
- ${`${mockEpics[1].group_full_path}::&${mockEpics[1].iid}`} | ${'number'} | ${`${mockEpics[1].title}::&${mockEpics[1].iid}`}
+ value | valueType | tokenValueString
+ ${`${mockEpics[0].title}::&${mockEpics[0].iid}`} | ${'string'} | ${`${mockEpics[0].title}::&${mockEpics[0].iid}`}
+ ${`${mockEpics[1].title}::&${mockEpics[1].iid}`} | ${'number'} | ${`${mockEpics[1].title}::&${mockEpics[1].iid}`}
`('renders token item when selection is a $valueType', async ({ value, tokenValueString }) => {
wrapper.setProps({
value: { data: value },
diff --git a/spec/frontend/vue_shared/components/filtered_search_bar/tokens/iteration_token_spec.js b/spec/frontend/vue_shared/components/filtered_search_bar/tokens/iteration_token_spec.js
index a609aaa1c4e..af90ee93543 100644
--- a/spec/frontend/vue_shared/components/filtered_search_bar/tokens/iteration_token_spec.js
+++ b/spec/frontend/vue_shared/components/filtered_search_bar/tokens/iteration_token_spec.js
@@ -21,7 +21,7 @@ describe('IterationToken', () => {
provide: {
portalName: 'fake target',
alignSuggestions: function fakeAlignSuggestions() {},
- suggestionsListClass: 'custom-class',
+ suggestionsListClass: () => 'custom-class',
},
});
diff --git a/spec/frontend/vue_shared/components/filtered_search_bar/tokens/label_token_spec.js b/spec/frontend/vue_shared/components/filtered_search_bar/tokens/label_token_spec.js
index a348344b9dd..f55fb2836e3 100644
--- a/spec/frontend/vue_shared/components/filtered_search_bar/tokens/label_token_spec.js
+++ b/spec/frontend/vue_shared/components/filtered_search_bar/tokens/label_token_spec.js
@@ -48,7 +48,7 @@ function createComponent(options = {}) {
provide: {
portalName: 'fake target',
alignSuggestions: function fakeAlignSuggestions() {},
- suggestionsListClass: 'custom-class',
+ suggestionsListClass: () => 'custom-class',
},
stubs,
listeners,
diff --git a/spec/frontend/vue_shared/components/filtered_search_bar/tokens/milestone_token_spec.js b/spec/frontend/vue_shared/components/filtered_search_bar/tokens/milestone_token_spec.js
index bfb593bf82d..936841651d1 100644
--- a/spec/frontend/vue_shared/components/filtered_search_bar/tokens/milestone_token_spec.js
+++ b/spec/frontend/vue_shared/components/filtered_search_bar/tokens/milestone_token_spec.js
@@ -48,7 +48,7 @@ function createComponent(options = {}) {
provide: {
portalName: 'fake target',
alignSuggestions: function fakeAlignSuggestions() {},
- suggestionsListClass: 'custom-class',
+ suggestionsListClass: () => 'custom-class',
},
stubs,
});
diff --git a/spec/frontend/vue_shared/components/filtered_search_bar/tokens/weight_token_spec.js b/spec/frontend/vue_shared/components/filtered_search_bar/tokens/weight_token_spec.js
index e788c742736..4277899f8db 100644
--- a/spec/frontend/vue_shared/components/filtered_search_bar/tokens/weight_token_spec.js
+++ b/spec/frontend/vue_shared/components/filtered_search_bar/tokens/weight_token_spec.js
@@ -19,7 +19,7 @@ describe('WeightToken', () => {
provide: {
portalName: 'fake target',
alignSuggestions: function fakeAlignSuggestions() {},
- suggestionsListClass: 'custom-class',
+ suggestionsListClass: () => 'custom-class',
},
});
diff --git a/spec/frontend/vue_shared/components/issue/issue_assignees_spec.js b/spec/frontend/vue_shared/components/issue/issue_assignees_spec.js
index 2658fa4a706..f74b9b37197 100644
--- a/spec/frontend/vue_shared/components/issue/issue_assignees_spec.js
+++ b/spec/frontend/vue_shared/components/issue/issue_assignees_spec.js
@@ -94,10 +94,6 @@ describe('IssueAssigneesComponent', () => {
expect(vm.avatarUrlTitle(mockAssigneesList[0])).toBe('Assigned to Terrell Graham');
});
- it('renders component root element with class `issue-assignees`', () => {
- expect(wrapper.element.classList.contains('issue-assignees')).toBe(true);
- });
-
it('renders assignee', () => {
const data = findAvatars().wrappers.map((x) => ({
...x.props(),
diff --git a/spec/frontend/vue_shared/components/markdown/suggestion_diff_header_spec.js b/spec/frontend/vue_shared/components/markdown/suggestion_diff_header_spec.js
index ba2450b56c9..9bc2aad1895 100644
--- a/spec/frontend/vue_shared/components/markdown/suggestion_diff_header_spec.js
+++ b/spec/frontend/vue_shared/components/markdown/suggestion_diff_header_spec.js
@@ -60,7 +60,7 @@ describe('Suggestion Diff component', () => {
expect(findHelpButton().exists()).toBe(true);
});
- it('renders apply suggestion and add to batch buttons', () => {
+ it('renders add to batch button when more than 1 suggestion', () => {
createComponent({
suggestionsCount: 2,
});
@@ -68,8 +68,7 @@ describe('Suggestion Diff component', () => {
const applyBtn = findApplyButton();
const addToBatchBtn = findAddToBatchButton();
- expect(applyBtn.exists()).toBe(true);
- expect(applyBtn.html().includes('Apply suggestion')).toBe(true);
+ expect(applyBtn.exists()).toBe(false);
expect(addToBatchBtn.exists()).toBe(true);
expect(addToBatchBtn.html().includes('Add suggestion to batch')).toBe(true);
@@ -85,7 +84,7 @@ describe('Suggestion Diff component', () => {
describe('when apply suggestion is clicked', () => {
beforeEach(() => {
- createComponent();
+ createComponent({ batchSuggestionsCount: 0 });
findApplyButton().vm.$emit('apply');
});
@@ -140,11 +139,11 @@ describe('Suggestion Diff component', () => {
describe('apply suggestions is clicked', () => {
it('emits applyBatch', () => {
- createComponent({ isBatched: true });
+ createComponent({ isBatched: true, batchSuggestionsCount: 2 });
- findApplyBatchButton().vm.$emit('click');
+ findApplyButton().vm.$emit('apply');
- expect(wrapper.emitted().applyBatch).toEqual([[]]);
+ expect(wrapper.emitted().applyBatch).toEqual([[undefined]]);
});
});
@@ -155,23 +154,24 @@ describe('Suggestion Diff component', () => {
isBatched: true,
});
- const applyBatchBtn = findApplyBatchButton();
+ const applyBatchBtn = findApplyButton();
const removeFromBatchBtn = findRemoveFromBatchButton();
expect(removeFromBatchBtn.exists()).toBe(true);
expect(removeFromBatchBtn.html().includes('Remove from batch')).toBe(true);
expect(applyBatchBtn.exists()).toBe(true);
- expect(applyBatchBtn.html().includes('Apply suggestions')).toBe(true);
+ expect(applyBatchBtn.html().includes('Apply suggestion')).toBe(true);
expect(applyBatchBtn.html().includes(String('9'))).toBe(true);
});
it('hides add to batch and apply buttons', () => {
createComponent({
isBatched: true,
+ batchSuggestionsCount: 9,
});
- expect(findApplyButton().exists()).toBe(false);
+ expect(findApplyButton().exists()).toBe(true);
expect(findAddToBatchButton().exists()).toBe(false);
});
@@ -215,9 +215,8 @@ describe('Suggestion Diff component', () => {
});
it('disables apply suggestion and hides add to batch button', () => {
- expect(findApplyButton().exists()).toBe(true);
+ expect(findApplyButton().exists()).toBe(false);
expect(findAddToBatchButton().exists()).toBe(false);
- expect(findApplyButton().attributes('disabled')).toBe('true');
});
});
@@ -225,7 +224,7 @@ describe('Suggestion Diff component', () => {
const findTooltip = () => getBinding(findApplyButton().element, 'gl-tooltip');
it('renders correct tooltip message when button is applicable', () => {
- createComponent();
+ createComponent({ batchSuggestionsCount: 0 });
const tooltip = findTooltip();
expect(tooltip.modifiers.viewport).toBe(true);
@@ -234,7 +233,7 @@ describe('Suggestion Diff component', () => {
it('renders the inapplicable reason in the tooltip when button is not applicable', () => {
const inapplicableReason = 'lorem';
- createComponent({ canApply: false, inapplicableReason });
+ createComponent({ canApply: false, inapplicableReason, batchSuggestionsCount: 0 });
const tooltip = findTooltip();
expect(tooltip.modifiers.viewport).toBe(true);
diff --git a/spec/frontend/vue_shared/components/markdown/suggestion_diff_spec.js b/spec/frontend/vue_shared/components/markdown/suggestion_diff_spec.js
index 5bd6bda2d2c..af27e953776 100644
--- a/spec/frontend/vue_shared/components/markdown/suggestion_diff_spec.js
+++ b/spec/frontend/vue_shared/components/markdown/suggestion_diff_spec.js
@@ -77,7 +77,7 @@ describe('Suggestion Diff component', () => {
it.each`
event | childArgs | args
${'apply'} | ${['test-event']} | ${[{ callback: 'test-event', suggestionId }]}
- ${'applyBatch'} | ${[]} | ${[]}
+ ${'applyBatch'} | ${['test-event']} | ${['test-event']}
${'addToBatch'} | ${[]} | ${[suggestionId]}
${'removeFromBatch'} | ${[]} | ${[suggestionId]}
`('emits $event event on sugestion diff header $event', ({ event, childArgs, args }) => {
diff --git a/spec/frontend/vue_shared/components/project_selector/project_list_item_spec.js b/spec/frontend/vue_shared/components/project_selector/project_list_item_spec.js
index ab028ea52b7..1ed7844b395 100644
--- a/spec/frontend/vue_shared/components/project_selector/project_list_item_spec.js
+++ b/spec/frontend/vue_shared/components/project_selector/project_list_item_spec.js
@@ -1,4 +1,6 @@
import { shallowMount, createLocalVue } from '@vue/test-utils';
+// eslint-disable-next-line import/no-deprecated
+import { getJSONFixture } from 'helpers/fixtures';
import { trimText } from 'helpers/text_helper';
import ProjectAvatar from '~/vue_shared/components/deprecated_project_avatar/default.vue';
import ProjectListItem from '~/vue_shared/components/project_selector/project_list_item.vue';
@@ -11,6 +13,7 @@ describe('ProjectListItem component', () => {
let vm;
let options;
+ // eslint-disable-next-line import/no-deprecated
const project = getJSONFixture('static/projects.json')[0];
beforeEach(() => {
diff --git a/spec/frontend/vue_shared/components/project_selector/project_selector_spec.js b/spec/frontend/vue_shared/components/project_selector/project_selector_spec.js
index 06b00a8e196..1f97d3ff3fa 100644
--- a/spec/frontend/vue_shared/components/project_selector/project_selector_spec.js
+++ b/spec/frontend/vue_shared/components/project_selector/project_selector_spec.js
@@ -2,6 +2,8 @@ import { GlSearchBoxByType, GlInfiniteScroll } from '@gitlab/ui';
import { mount, createLocalVue } from '@vue/test-utils';
import { head } from 'lodash';
import Vue from 'vue';
+// eslint-disable-next-line import/no-deprecated
+import { getJSONFixture } from 'helpers/fixtures';
import { trimText } from 'helpers/text_helper';
import ProjectListItem from '~/vue_shared/components/project_selector/project_list_item.vue';
import ProjectSelector from '~/vue_shared/components/project_selector/project_selector.vue';
@@ -11,6 +13,7 @@ const localVue = createLocalVue();
describe('ProjectSelector component', () => {
let wrapper;
let vm;
+ // eslint-disable-next-line import/no-deprecated
const allProjects = getJSONFixture('static/projects.json');
const searchResults = allProjects.slice(0, 5);
let selected = [];
diff --git a/spec/frontend/vue_shared/components/sidebar/labels_select_vue/store/mutations_spec.js b/spec/frontend/vue_shared/components/sidebar/labels_select_vue/store/mutations_spec.js
index 14e0c8a2278..d9b7cd5afa2 100644
--- a/spec/frontend/vue_shared/components/sidebar/labels_select_vue/store/mutations_spec.js
+++ b/spec/frontend/vue_shared/components/sidebar/labels_select_vue/store/mutations_spec.js
@@ -157,9 +157,9 @@ describe('LabelsSelect Mutations', () => {
beforeEach(() => {
labels = [
- { id: 1, title: 'scoped::test', set: true },
- { id: 2, set: false, title: 'scoped::one' },
- { id: 3, title: '' },
+ { id: 1, title: 'scoped' },
+ { id: 2, title: 'scoped::one', set: false },
+ { id: 3, title: 'scoped::test', set: true },
{ id: 4, title: '' },
];
});
@@ -189,9 +189,9 @@ describe('LabelsSelect Mutations', () => {
});
expect(state.labels).toEqual([
- { id: 1, title: 'scoped::test', set: false },
- { id: 2, set: true, title: 'scoped::one', touched: true },
- { id: 3, title: '' },
+ { id: 1, title: 'scoped' },
+ { id: 2, title: 'scoped::one', set: true, touched: true },
+ { id: 3, title: 'scoped::test', set: false },
{ id: 4, title: '' },
]);
});
diff --git a/spec/frontend/vue_shared/components/sidebar/labels_select_widget/dropdown_contents_create_view_spec.js b/spec/frontend/vue_shared/components/sidebar/labels_select_widget/dropdown_contents_create_view_spec.js
index 843298a1406..8931584e12c 100644
--- a/spec/frontend/vue_shared/components/sidebar/labels_select_widget/dropdown_contents_create_view_spec.js
+++ b/spec/frontend/vue_shared/components/sidebar/labels_select_widget/dropdown_contents_create_view_spec.js
@@ -5,13 +5,14 @@ import VueApollo from 'vue-apollo';
import createMockApollo from 'helpers/mock_apollo_helper';
import waitForPromises from 'helpers/wait_for_promises';
import createFlash from '~/flash';
+import { IssuableType } from '~/issue_show/constants';
+import { labelsQueries } from '~/sidebar/constants';
import DropdownContentsCreateView from '~/vue_shared/components/sidebar/labels_select_widget/dropdown_contents_create_view.vue';
import createLabelMutation from '~/vue_shared/components/sidebar/labels_select_widget/graphql/create_label.mutation.graphql';
-import projectLabelsQuery from '~/vue_shared/components/sidebar/labels_select_widget/graphql/project_labels.query.graphql';
import {
mockSuggestedColors,
createLabelSuccessfulResponse,
- labelsQueryResponse,
+ workspaceLabelsQueryResponse,
} from './mock_data';
jest.mock('~/flash');
@@ -47,11 +48,14 @@ describe('DropdownContentsCreateView', () => {
findAllColors().at(0).vm.$emit('click', new Event('mouseclick'));
};
- const createComponent = ({ mutationHandler = createLabelSuccessHandler } = {}) => {
+ const createComponent = ({
+ mutationHandler = createLabelSuccessHandler,
+ issuableType = IssuableType.Issue,
+ } = {}) => {
const mockApollo = createMockApollo([[createLabelMutation, mutationHandler]]);
mockApollo.clients.defaultClient.cache.writeQuery({
- query: projectLabelsQuery,
- data: labelsQueryResponse.data,
+ query: labelsQueries[issuableType].workspaceQuery,
+ data: workspaceLabelsQueryResponse.data,
variables: {
fullPath: '',
searchTerm: '',
@@ -61,6 +65,10 @@ describe('DropdownContentsCreateView', () => {
wrapper = shallowMount(DropdownContentsCreateView, {
localVue,
apolloProvider: mockApollo,
+ propsData: {
+ issuableType,
+ fullPath: '',
+ },
});
};
@@ -135,15 +143,6 @@ describe('DropdownContentsCreateView', () => {
expect(findCreateButton().props('disabled')).toBe(false);
});
- it('calls a mutation with correct parameters on Create button click', () => {
- findCreateButton().vm.$emit('click');
- expect(createLabelSuccessHandler).toHaveBeenCalledWith({
- color: '#009966',
- projectPath: '',
- title: 'Test title',
- });
- });
-
it('renders a loader spinner after Create button click', async () => {
findCreateButton().vm.$emit('click');
await nextTick();
@@ -162,6 +161,30 @@ describe('DropdownContentsCreateView', () => {
});
});
+ it('calls a mutation with `projectPath` variable on the issue', () => {
+ createComponent();
+ fillLabelAttributes();
+ findCreateButton().vm.$emit('click');
+
+ expect(createLabelSuccessHandler).toHaveBeenCalledWith({
+ color: '#009966',
+ projectPath: '',
+ title: 'Test title',
+ });
+ });
+
+ it('calls a mutation with `groupPath` variable on the epic', () => {
+ createComponent({ issuableType: IssuableType.Epic });
+ fillLabelAttributes();
+ findCreateButton().vm.$emit('click');
+
+ expect(createLabelSuccessHandler).toHaveBeenCalledWith({
+ color: '#009966',
+ groupPath: '',
+ title: 'Test title',
+ });
+ });
+
it('calls createFlash is mutation has a user-recoverable error', async () => {
createComponent({ mutationHandler: createLabelUserRecoverableErrorHandler });
fillLabelAttributes();
diff --git a/spec/frontend/vue_shared/components/sidebar/labels_select_widget/dropdown_contents_labels_view_spec.js b/spec/frontend/vue_shared/components/sidebar/labels_select_widget/dropdown_contents_labels_view_spec.js
index 537bbc8e71e..fac3331a2b8 100644
--- a/spec/frontend/vue_shared/components/sidebar/labels_select_widget/dropdown_contents_labels_view_spec.js
+++ b/spec/frontend/vue_shared/components/sidebar/labels_select_widget/dropdown_contents_labels_view_spec.js
@@ -1,36 +1,43 @@
-import { GlLoadingIcon, GlSearchBoxByType } from '@gitlab/ui';
+import {
+ GlLoadingIcon,
+ GlSearchBoxByType,
+ GlDropdownItem,
+ GlIntersectionObserver,
+} from '@gitlab/ui';
import { shallowMount, createLocalVue } from '@vue/test-utils';
import { nextTick } from 'vue';
import VueApollo from 'vue-apollo';
import createMockApollo from 'helpers/mock_apollo_helper';
import waitForPromises from 'helpers/wait_for_promises';
import createFlash from '~/flash';
+import { IssuableType } from '~/issue_show/constants';
import { DEFAULT_DEBOUNCE_AND_THROTTLE_MS } from '~/lib/utils/constants';
import { DropdownVariant } from '~/vue_shared/components/sidebar/labels_select_widget/constants';
import DropdownContentsLabelsView from '~/vue_shared/components/sidebar/labels_select_widget/dropdown_contents_labels_view.vue';
import projectLabelsQuery from '~/vue_shared/components/sidebar/labels_select_widget/graphql/project_labels.query.graphql';
import LabelItem from '~/vue_shared/components/sidebar/labels_select_widget/label_item.vue';
-import { mockConfig, labelsQueryResponse } from './mock_data';
+import { mockConfig, workspaceLabelsQueryResponse } from './mock_data';
jest.mock('~/flash');
const localVue = createLocalVue();
localVue.use(VueApollo);
-const selectedLabels = [
+const localSelectedLabels = [
{
- id: 28,
- title: 'Bug',
- description: 'Label for bugs',
- color: '#FF0000',
- textColor: '#FFFFFF',
+ color: '#2f7b2e',
+ description: null,
+ id: 'gid://gitlab/ProjectLabel/2',
+ title: 'Label2',
},
];
describe('DropdownContentsLabelsView', () => {
let wrapper;
- const successfulQueryHandler = jest.fn().mockResolvedValue(labelsQueryResponse);
+ const successfulQueryHandler = jest.fn().mockResolvedValue(workspaceLabelsQueryResponse);
+
+ const findFirstLabel = () => wrapper.findAllComponents(GlDropdownItem).at(0);
const createComponent = ({
initialState = mockConfig,
@@ -43,14 +50,13 @@ describe('DropdownContentsLabelsView', () => {
localVue,
apolloProvider: mockApollo,
provide: {
- projectPath: 'test',
- iid: 1,
variant: DropdownVariant.Sidebar,
...injected,
},
propsData: {
...initialState,
- selectedLabels,
+ localSelectedLabels,
+ issuableType: IssuableType.Issue,
},
stubs: {
GlSearchBoxByType,
@@ -65,23 +71,31 @@ describe('DropdownContentsLabelsView', () => {
const findSearchInput = () => wrapper.findComponent(GlSearchBoxByType);
const findLabels = () => wrapper.findAllComponents(LabelItem);
const findLoadingIcon = () => wrapper.findComponent(GlLoadingIcon);
+ const findObserver = () => wrapper.findComponent(GlIntersectionObserver);
const findLabelsList = () => wrapper.find('[data-testid="labels-list"]');
const findNoResultsMessage = () => wrapper.find('[data-testid="no-results"]');
+ async function makeObserverAppear() {
+ await findObserver().vm.$emit('appear');
+ }
+
describe('when loading labels', () => {
it('renders disabled search input field', async () => {
createComponent();
+ await makeObserverAppear();
expect(findSearchInput().props('disabled')).toBe(true);
});
it('renders loading icon', async () => {
createComponent();
+ await makeObserverAppear();
expect(findLoadingIcon().exists()).toBe(true);
});
it('does not render labels list', async () => {
createComponent();
+ await makeObserverAppear();
expect(findLabelsList().exists()).toBe(false);
});
});
@@ -89,6 +103,7 @@ describe('DropdownContentsLabelsView', () => {
describe('when labels are loaded', () => {
beforeEach(async () => {
createComponent();
+ await makeObserverAppear();
await waitForPromises();
});
@@ -118,6 +133,7 @@ describe('DropdownContentsLabelsView', () => {
},
}),
});
+ await makeObserverAppear();
findSearchInput().vm.$emit('input', '123');
await waitForPromises();
await nextTick();
@@ -127,8 +143,26 @@ describe('DropdownContentsLabelsView', () => {
it('calls `createFlash` when fetching labels failed', async () => {
createComponent({ queryHandler: jest.fn().mockRejectedValue('Houston, we have a problem!') });
+ await makeObserverAppear();
jest.advanceTimersByTime(DEFAULT_DEBOUNCE_AND_THROTTLE_MS);
await waitForPromises();
+
expect(createFlash).toHaveBeenCalled();
});
+
+ it('emits an `input` event on label click', async () => {
+ createComponent();
+ await makeObserverAppear();
+ await waitForPromises();
+ findFirstLabel().trigger('click');
+
+ expect(wrapper.emitted('input')[0][0]).toEqual(expect.arrayContaining(localSelectedLabels));
+ });
+
+ it('does not trigger query when component did not appear', () => {
+ createComponent();
+ expect(findLoadingIcon().exists()).toBe(false);
+ expect(findLabelsList().exists()).toBe(false);
+ expect(successfulQueryHandler).not.toHaveBeenCalled();
+ });
});
diff --git a/spec/frontend/vue_shared/components/sidebar/labels_select_widget/dropdown_contents_spec.js b/spec/frontend/vue_shared/components/sidebar/labels_select_widget/dropdown_contents_spec.js
index a1b40a891ec..36704ac5ef3 100644
--- a/spec/frontend/vue_shared/components/sidebar/labels_select_widget/dropdown_contents_spec.js
+++ b/spec/frontend/vue_shared/components/sidebar/labels_select_widget/dropdown_contents_spec.js
@@ -1,6 +1,5 @@
-import { GlDropdown } from '@gitlab/ui';
import { shallowMount } from '@vue/test-utils';
-
+import { nextTick } from 'vue';
import { DropdownVariant } from '~/vue_shared/components/sidebar/labels_select_widget/constants';
import DropdownContents from '~/vue_shared/components/sidebar/labels_select_widget/dropdown_contents.vue';
import DropdownContentsCreateView from '~/vue_shared/components/sidebar/labels_select_widget/dropdown_contents_create_view.vue';
@@ -8,10 +7,26 @@ import DropdownContentsLabelsView from '~/vue_shared/components/sidebar/labels_s
import { mockLabels } from './mock_data';
+const showDropdown = jest.fn();
+
+const GlDropdownStub = {
+ template: `
+ <div data-testid="dropdown">
+ <slot name="header"></slot>
+ <slot></slot>
+ <slot name="footer"></slot>
+ </div>
+ `,
+ methods: {
+ show: showDropdown,
+ hide: jest.fn(),
+ },
+};
+
describe('DropdownContent', () => {
let wrapper;
- const createComponent = ({ props = {}, injected = {} } = {}) => {
+ const createComponent = ({ props = {}, injected = {}, data = {} } = {}) => {
wrapper = shallowMount(DropdownContents, {
propsData: {
labelsCreateTitle: 'test',
@@ -22,38 +37,112 @@ describe('DropdownContent', () => {
footerManageLabelTitle: 'manage',
dropdownButtonText: 'Labels',
variant: 'sidebar',
+ issuableType: 'issue',
+ fullPath: 'test',
...props,
},
+ data() {
+ return {
+ ...data,
+ };
+ },
provide: {
allowLabelCreate: true,
labelsManagePath: 'foo/bar',
...injected,
},
stubs: {
- GlDropdown,
+ GlDropdown: GlDropdownStub,
},
});
};
- beforeEach(() => {
- createComponent();
- });
-
afterEach(() => {
wrapper.destroy();
});
+ const findCreateView = () => wrapper.findComponent(DropdownContentsCreateView);
+ const findLabelsView = () => wrapper.findComponent(DropdownContentsLabelsView);
+ const findDropdown = () => wrapper.findComponent(GlDropdownStub);
+
const findDropdownFooter = () => wrapper.find('[data-testid="dropdown-footer"]');
+ const findDropdownHeader = () => wrapper.find('[data-testid="dropdown-header"]');
const findCreateLabelButton = () => wrapper.find('[data-testid="create-label-button"]');
const findGoBackButton = () => wrapper.find('[data-testid="go-back-button"]');
+ it('calls dropdown `show` method on `isVisible` prop change', async () => {
+ createComponent();
+ await wrapper.setProps({
+ isVisible: true,
+ });
+
+ expect(findDropdown().emitted('show')).toBeUndefined();
+ });
+
+ it('does not emit `setLabels` event on dropdown hide if labels did not change', () => {
+ createComponent();
+ findDropdown().vm.$emit('hide');
+
+ expect(wrapper.emitted('setLabels')).toBeUndefined();
+ });
+
+ it('emits `setLabels` event on dropdown hide if labels changed on non-sidebar widget', async () => {
+ createComponent({ props: { variant: DropdownVariant.Standalone } });
+ const updatedLabel = {
+ id: 28,
+ title: 'Bug',
+ description: 'Label for bugs',
+ color: '#FF0000',
+ textColor: '#FFFFFF',
+ };
+ findLabelsView().vm.$emit('input', [updatedLabel]);
+ await nextTick();
+ findDropdown().vm.$emit('hide');
+
+ expect(wrapper.emitted('setLabels')).toEqual([[[updatedLabel]]]);
+ });
+
+ it('emits `setLabels` event on visibility change if labels changed on sidebar widget', async () => {
+ createComponent({ props: { variant: DropdownVariant.Standalone, isVisible: true } });
+ const updatedLabel = {
+ id: 28,
+ title: 'Bug',
+ description: 'Label for bugs',
+ color: '#FF0000',
+ textColor: '#FFFFFF',
+ };
+ findLabelsView().vm.$emit('input', [updatedLabel]);
+ wrapper.setProps({ isVisible: false });
+ await nextTick();
+
+ expect(wrapper.emitted('setLabels')).toEqual([[[updatedLabel]]]);
+ });
+
+ it('does not render header on standalone variant', () => {
+ createComponent({ props: { variant: DropdownVariant.Standalone } });
+
+ expect(findDropdownHeader().exists()).toBe(false);
+ });
+
+ it('renders header on embedded variant', () => {
+ createComponent({ props: { variant: DropdownVariant.Embedded } });
+
+ expect(findDropdownHeader().exists()).toBe(true);
+ });
+
+ it('renders header on sidebar variant', () => {
+ createComponent();
+
+ expect(findDropdownHeader().exists()).toBe(true);
+ });
+
describe('Create view', () => {
beforeEach(() => {
- wrapper.vm.toggleDropdownContentsCreateView();
+ createComponent({ data: { showDropdownContentsCreateView: true } });
});
it('renders create view when `showDropdownContentsCreateView` prop is `true`', () => {
- expect(wrapper.findComponent(DropdownContentsCreateView).exists()).toBe(true);
+ expect(findCreateView().exists()).toBe(true);
});
it('does not render footer', () => {
@@ -67,11 +156,31 @@ describe('DropdownContent', () => {
it('renders go back button', () => {
expect(findGoBackButton().exists()).toBe(true);
});
+
+ it('changes the view to Labels view on back button click', async () => {
+ findGoBackButton().vm.$emit('click', new MouseEvent('click'));
+ await nextTick();
+
+ expect(findCreateView().exists()).toBe(false);
+ expect(findLabelsView().exists()).toBe(true);
+ });
+
+ it('changes the view to Labels view on `hideCreateView` event', async () => {
+ findCreateView().vm.$emit('hideCreateView');
+ await nextTick();
+
+ expect(findCreateView().exists()).toBe(false);
+ expect(findLabelsView().exists()).toBe(true);
+ });
});
describe('Labels view', () => {
+ beforeEach(() => {
+ createComponent();
+ });
+
it('renders labels view when `showDropdownContentsCreateView` when `showDropdownContentsCreateView` prop is `false`', () => {
- expect(wrapper.findComponent(DropdownContentsLabelsView).exists()).toBe(true);
+ expect(findLabelsView().exists()).toBe(true);
});
it('renders footer on sidebar dropdown', () => {
@@ -109,19 +218,12 @@ describe('DropdownContent', () => {
expect(findCreateLabelButton().exists()).toBe(true);
});
- it('triggers `toggleDropdownContent` method on create label button click', () => {
- jest.spyOn(wrapper.vm, 'toggleDropdownContent').mockImplementation(() => {});
+ it('changes the view to Create on create label button click', async () => {
findCreateLabelButton().trigger('click');
- expect(wrapper.vm.toggleDropdownContent).toHaveBeenCalled();
+ await nextTick();
+ expect(findLabelsView().exists()).toBe(false);
});
});
});
-
- describe('template', () => {
- it('renders component container element with classes `gl-w-full gl-mt-2` and no styles', () => {
- expect(wrapper.attributes('class')).toContain('gl-w-full gl-mt-2');
- expect(wrapper.attributes('style')).toBeUndefined();
- });
- });
});
diff --git a/spec/frontend/vue_shared/components/sidebar/labels_select_widget/labels_select_root_spec.js b/spec/frontend/vue_shared/components/sidebar/labels_select_widget/labels_select_root_spec.js
index a18511fa21d..b5441d711a5 100644
--- a/spec/frontend/vue_shared/components/sidebar/labels_select_widget/labels_select_root_spec.js
+++ b/spec/frontend/vue_shared/components/sidebar/labels_select_widget/labels_select_root_spec.js
@@ -1,28 +1,55 @@
-import { shallowMount } from '@vue/test-utils';
+import { shallowMount, createLocalVue } from '@vue/test-utils';
+import { nextTick } from 'vue';
+import VueApollo from 'vue-apollo';
+import createMockApollo from 'helpers/mock_apollo_helper';
+import waitForPromises from 'helpers/wait_for_promises';
+import createFlash from '~/flash';
+import { IssuableType } from '~/issue_show/constants';
import SidebarEditableItem from '~/sidebar/components/sidebar_editable_item.vue';
import DropdownContents from '~/vue_shared/components/sidebar/labels_select_widget/dropdown_contents.vue';
import DropdownValue from '~/vue_shared/components/sidebar/labels_select_widget/dropdown_value.vue';
-import DropdownValueCollapsed from '~/vue_shared/components/sidebar/labels_select_widget/dropdown_value_collapsed.vue';
+import issueLabelsQuery from '~/vue_shared/components/sidebar/labels_select_widget/graphql/issue_labels.query.graphql';
import LabelsSelectRoot from '~/vue_shared/components/sidebar/labels_select_widget/labels_select_root.vue';
+import { mockConfig, issuableLabelsQueryResponse } from './mock_data';
-import { mockConfig } from './mock_data';
+jest.mock('~/flash');
+
+const localVue = createLocalVue();
+localVue.use(VueApollo);
+
+const successfulQueryHandler = jest.fn().mockResolvedValue(issuableLabelsQueryResponse);
+const errorQueryHandler = jest.fn().mockRejectedValue('Houston, we have a problem');
describe('LabelsSelectRoot', () => {
let wrapper;
- const createComponent = (config = mockConfig, slots = {}) => {
+ const findSidebarEditableItem = () => wrapper.findComponent(SidebarEditableItem);
+ const findDropdownValue = () => wrapper.findComponent(DropdownValue);
+ const findDropdownContents = () => wrapper.findComponent(DropdownContents);
+
+ const createComponent = ({
+ config = mockConfig,
+ slots = {},
+ queryHandler = successfulQueryHandler,
+ } = {}) => {
+ const mockApollo = createMockApollo([[issueLabelsQuery, queryHandler]]);
+
wrapper = shallowMount(LabelsSelectRoot, {
slots,
- propsData: config,
+ apolloProvider: mockApollo,
+ localVue,
+ propsData: {
+ ...config,
+ issuableType: IssuableType.Issue,
+ },
stubs: {
- DropdownContents,
SidebarEditableItem,
},
provide: {
- iid: '1',
- projectPath: 'test',
canUpdate: true,
allowLabelEdit: true,
+ allowLabelCreate: true,
+ labelsManagePath: 'test',
},
});
};
@@ -42,33 +69,63 @@ describe('LabelsSelectRoot', () => {
${'embedded'} | ${'is-embedded'}
`(
'renders component root element with CSS class `$cssClass` when `state.variant` is "$variant"',
- ({ variant, cssClass }) => {
+ async ({ variant, cssClass }) => {
createComponent({
- ...mockConfig,
- variant,
+ config: { ...mockConfig, variant },
});
- return wrapper.vm.$nextTick(() => {
- expect(wrapper.classes()).toContain(cssClass);
- });
+ await nextTick();
+ expect(wrapper.classes()).toContain(cssClass);
},
);
- it('renders `dropdown-value-collapsed` component when `allowLabelCreate` prop is `true`', async () => {
- createComponent();
- await wrapper.vm.$nextTick;
- expect(wrapper.find(DropdownValueCollapsed).exists()).toBe(true);
- });
+ describe('if dropdown variant is `sidebar`', () => {
+ it('renders sidebar editable item', () => {
+ createComponent();
+ expect(findSidebarEditableItem().exists()).toBe(true);
+ });
+
+ it('passes true `loading` prop to sidebar editable item when loading labels', () => {
+ createComponent();
+ expect(findSidebarEditableItem().props('loading')).toBe(true);
+ });
- it('renders `dropdown-value` component', async () => {
- createComponent(mockConfig, {
- default: 'None',
+ describe('when labels are fetched successfully', () => {
+ beforeEach(async () => {
+ createComponent();
+ await waitForPromises();
+ });
+
+ it('passes true `loading` prop to sidebar editable item', () => {
+ expect(findSidebarEditableItem().props('loading')).toBe(false);
+ });
+
+ it('renders dropdown value component when query labels is resolved', () => {
+ expect(findDropdownValue().exists()).toBe(true);
+ expect(findDropdownValue().props('selectedLabels')).toEqual(
+ issuableLabelsQueryResponse.data.workspace.issuable.labels.nodes,
+ );
+ });
+
+ it('emits `onLabelRemove` event on dropdown value label remove event', () => {
+ const label = { id: 'gid://gitlab/ProjectLabel/1' };
+ findDropdownValue().vm.$emit('onLabelRemove', label);
+ expect(wrapper.emitted('onLabelRemove')).toEqual([[label]]);
+ });
});
- await wrapper.vm.$nextTick;
- const valueComp = wrapper.find(DropdownValue);
+ it('creates flash with error message when query is rejected', async () => {
+ createComponent({ queryHandler: errorQueryHandler });
+ await waitForPromises();
+ expect(createFlash).toHaveBeenCalledWith({ message: 'Error fetching labels.' });
+ });
+ });
+
+ it('emits `updateSelectedLabels` event on dropdown contents `setLabels` event', async () => {
+ const label = { id: 'gid://gitlab/ProjectLabel/1' };
+ createComponent();
- expect(valueComp.exists()).toBe(true);
- expect(valueComp.text()).toBe('None');
+ findDropdownContents().vm.$emit('setLabels', [label]);
+ expect(wrapper.emitted('updateSelectedLabels')).toEqual([[[label]]]);
});
});
diff --git a/spec/frontend/vue_shared/components/sidebar/labels_select_widget/mock_data.js b/spec/frontend/vue_shared/components/sidebar/labels_select_widget/mock_data.js
index fceaabec2d0..23a457848d9 100644
--- a/spec/frontend/vue_shared/components/sidebar/labels_select_widget/mock_data.js
+++ b/spec/frontend/vue_shared/components/sidebar/labels_select_widget/mock_data.js
@@ -34,6 +34,8 @@ export const mockLabels = [
];
export const mockConfig = {
+ iid: '1',
+ fullPath: 'test',
allowMultiselect: true,
labelsListTitle: 'Assign labels',
labelsCreateTitle: 'Create label',
@@ -86,7 +88,7 @@ export const createLabelSuccessfulResponse = {
},
};
-export const labelsQueryResponse = {
+export const workspaceLabelsQueryResponse = {
data: {
workspace: {
labels: {
@@ -108,3 +110,23 @@ export const labelsQueryResponse = {
},
},
};
+
+export const issuableLabelsQueryResponse = {
+ data: {
+ workspace: {
+ issuable: {
+ id: '1',
+ labels: {
+ nodes: [
+ {
+ color: '#330066',
+ description: null,
+ id: 'gid://gitlab/ProjectLabel/1',
+ title: 'Label1',
+ },
+ ],
+ },
+ },
+ },
+ },
+};
diff --git a/spec/frontend/vue_shared/components/upload_dropzone/__snapshots__/upload_dropzone_spec.js.snap b/spec/frontend/vue_shared/components/upload_dropzone/__snapshots__/upload_dropzone_spec.js.snap
index af4fa462cbf..0f1e118d44c 100644
--- a/spec/frontend/vue_shared/components/upload_dropzone/__snapshots__/upload_dropzone_spec.js.snap
+++ b/spec/frontend/vue_shared/components/upload_dropzone/__snapshots__/upload_dropzone_spec.js.snap
@@ -45,6 +45,7 @@ exports[`Upload dropzone component correctly overrides description and drop mess
>
<div
class="mw-50 gl-text-center"
+ style="display: none;"
>
<h3
class=""
@@ -61,7 +62,6 @@ exports[`Upload dropzone component correctly overrides description and drop mess
<div
class="mw-50 gl-text-center"
- style="display: none;"
>
<h3
class=""
@@ -146,7 +146,6 @@ exports[`Upload dropzone component when dragging renders correct template when d
<div
class="mw-50 gl-text-center"
- style=""
>
<h3
class=""
@@ -231,7 +230,6 @@ exports[`Upload dropzone component when dragging renders correct template when d
<div
class="mw-50 gl-text-center"
- style=""
>
<h3
class=""
@@ -299,6 +297,7 @@ exports[`Upload dropzone component when dragging renders correct template when d
>
<div
class="mw-50 gl-text-center"
+ style=""
>
<h3
class=""
@@ -383,6 +382,7 @@ exports[`Upload dropzone component when dragging renders correct template when d
>
<div
class="mw-50 gl-text-center"
+ style=""
>
<h3
class=""
@@ -467,6 +467,7 @@ exports[`Upload dropzone component when dragging renders correct template when d
>
<div
class="mw-50 gl-text-center"
+ style=""
>
<h3
class=""
@@ -551,6 +552,7 @@ exports[`Upload dropzone component when no slot provided renders default dropzon
>
<div
class="mw-50 gl-text-center"
+ style="display: none;"
>
<h3
class=""
@@ -567,7 +569,6 @@ exports[`Upload dropzone component when no slot provided renders default dropzon
<div
class="mw-50 gl-text-center"
- style="display: none;"
>
<h3
class=""
@@ -603,6 +604,7 @@ exports[`Upload dropzone component when slot provided renders dropzone with slot
>
<div
class="mw-50 gl-text-center"
+ style="display: none;"
>
<h3
class=""
@@ -619,7 +621,6 @@ exports[`Upload dropzone component when slot provided renders dropzone with slot
<div
class="mw-50 gl-text-center"
- style="display: none;"
>
<h3
class=""
diff --git a/spec/frontend/vue_shared/components/user_deletion_obstacles/user_deletion_obstacles_list_spec.js b/spec/frontend/vue_shared/components/user_deletion_obstacles/user_deletion_obstacles_list_spec.js
new file mode 100644
index 00000000000..a92f058f311
--- /dev/null
+++ b/spec/frontend/vue_shared/components/user_deletion_obstacles/user_deletion_obstacles_list_spec.js
@@ -0,0 +1,116 @@
+import { GlLink, GlSprintf } from '@gitlab/ui';
+import { shallowMount } from '@vue/test-utils';
+import { extendedWrapper } from 'helpers/vue_test_utils_helper';
+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';
+
+const mockSchedules = [
+ {
+ type: OBSTACLE_TYPES.oncallSchedules,
+ name: 'Schedule 1',
+ url: 'http://gitlab.com/gitlab-org/gitlab-shell/-/oncall_schedules',
+ projectName: 'Shell',
+ projectUrl: 'http://gitlab.com/gitlab-org/gitlab-shell/',
+ },
+ {
+ type: OBSTACLE_TYPES.oncallSchedules,
+ name: 'Schedule 2',
+ url: 'http://gitlab.com/gitlab-org/gitlab-ui/-/oncall_schedules',
+ projectName: 'UI',
+ projectUrl: 'http://gitlab.com/gitlab-org/gitlab-ui/',
+ },
+];
+const mockPolicies = [
+ {
+ type: OBSTACLE_TYPES.escalationPolicies,
+ name: 'Policy 1',
+ url: 'http://gitlab.com/gitlab-org/gitlab-ui/-/escalation-policies',
+ projectName: 'UI',
+ projectUrl: 'http://gitlab.com/gitlab-org/gitlab-ui/',
+ },
+];
+const mockObstacles = mockSchedules.concat(mockPolicies);
+
+const userName = "O'User";
+
+describe('User deletion obstacles list', () => {
+ let wrapper;
+
+ function createComponent(props) {
+ wrapper = extendedWrapper(
+ shallowMount(UserDeletionObstaclesList, {
+ propsData: {
+ obstacles: mockObstacles,
+ userName,
+ ...props,
+ },
+ stubs: {
+ GlSprintf,
+ },
+ }),
+ );
+ }
+
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ const findLinks = () => wrapper.findAllComponents(GlLink);
+ const findTitle = () => wrapper.findByTestId('title');
+ const findFooter = () => wrapper.findByTestId('footer');
+ const findObstacles = () => wrapper.findByTestId('obstacles-list');
+
+ describe.each`
+ isCurrentUser | titleText | footerText
+ ${true} | ${'You are currently a part of:'} | ${'Removing yourself may put your on-call team at risk of missing a notification.'}
+ ${false} | ${`User ${userName} is currently part of:`} | ${'Removing this user may put their on-call team at risk of missing a notification.'}
+ `('when current user', ({ isCurrentUser, titleText, footerText }) => {
+ it(`${isCurrentUser ? 'is' : 'is not'} a part of on-call management`, async () => {
+ createComponent({
+ isCurrentUser,
+ });
+
+ expect(findTitle().text()).toBe(titleText);
+ expect(findFooter().text()).toBe(footerText);
+ });
+ });
+
+ describe.each(mockObstacles)(
+ 'renders all obstacles',
+ ({ type, name, url, projectName, projectUrl }) => {
+ it(`includes the project name and link for ${name}`, () => {
+ createComponent({ obstacles: [{ type, name, url, projectName, projectUrl }] });
+ const msg = findObstacles().text();
+
+ expect(msg).toContain(`in Project ${projectName}`);
+ expect(findLinks().at(1).attributes('href')).toBe(projectUrl);
+ });
+ },
+ );
+
+ describe.each(mockSchedules)(
+ 'renders on-call schedules',
+ ({ type, name, url, projectName, projectUrl }) => {
+ it(`includes the schedule name and link for ${name}`, () => {
+ createComponent({ obstacles: [{ type, name, url, projectName, projectUrl }] });
+ const msg = findObstacles().text();
+
+ expect(msg).toContain(`On-call schedule ${name}`);
+ expect(findLinks().at(0).attributes('href')).toBe(url);
+ });
+ },
+ );
+
+ describe.each(mockPolicies)(
+ 'renders escalation policies',
+ ({ type, name, url, projectName, projectUrl }) => {
+ it(`includes the policy name and link for ${name}`, () => {
+ createComponent({ obstacles: [{ type, name, url, projectName, projectUrl }] });
+ const msg = findObstacles().text();
+
+ expect(msg).toContain(`Escalation policy ${name}`);
+ expect(findLinks().at(0).attributes('href')).toBe(url);
+ });
+ },
+ );
+});
diff --git a/spec/frontend/vue_shared/components/user_deletion_obstacles/utils_spec.js b/spec/frontend/vue_shared/components/user_deletion_obstacles/utils_spec.js
new file mode 100644
index 00000000000..99f739098f7
--- /dev/null
+++ b/spec/frontend/vue_shared/components/user_deletion_obstacles/utils_spec.js
@@ -0,0 +1,43 @@
+import { OBSTACLE_TYPES } from '~/vue_shared/components/user_deletion_obstacles/constants';
+import { parseUserDeletionObstacles } from '~/vue_shared/components/user_deletion_obstacles/utils';
+
+describe('parseUserDeletionObstacles', () => {
+ const mockObstacles = [{ name: 'Obstacle' }];
+ const expectedSchedule = { name: 'Obstacle', type: OBSTACLE_TYPES.oncallSchedules };
+ const expectedPolicy = { name: 'Obstacle', type: OBSTACLE_TYPES.escalationPolicies };
+
+ it('is undefined when user is not available', () => {
+ expect(parseUserDeletionObstacles()).toHaveLength(0);
+ });
+
+ it('is empty when obstacles are not available for user', () => {
+ expect(parseUserDeletionObstacles({})).toHaveLength(0);
+ });
+
+ it('is empty when user has no obstacles to deletion', () => {
+ const input = { oncallSchedules: [], escalationPolicies: [] };
+
+ expect(parseUserDeletionObstacles(input)).toHaveLength(0);
+ });
+
+ it('returns obstacles with type when user is part of on-call schedules', () => {
+ const input = { oncallSchedules: mockObstacles, escalationPolicies: [] };
+ const expectedOutput = [expectedSchedule];
+
+ expect(parseUserDeletionObstacles(input)).toEqual(expectedOutput);
+ });
+
+ it('returns obstacles with type when user is part of escalation policies', () => {
+ const input = { oncallSchedules: [], escalationPolicies: mockObstacles };
+ const expectedOutput = [expectedPolicy];
+
+ expect(parseUserDeletionObstacles(input)).toEqual(expectedOutput);
+ });
+
+ it('returns obstacles with type when user have every obstacle type', () => {
+ const input = { oncallSchedules: mockObstacles, escalationPolicies: mockObstacles };
+ const expectedOutput = [expectedSchedule, expectedPolicy];
+
+ expect(parseUserDeletionObstacles(input)).toEqual(expectedOutput);
+ });
+});
diff --git a/spec/frontend/vue_shared/components/user_popover/user_popover_spec.js b/spec/frontend/vue_shared/components/user_popover/user_popover_spec.js
index 926223e0670..09633daf587 100644
--- a/spec/frontend/vue_shared/components/user_popover/user_popover_spec.js
+++ b/spec/frontend/vue_shared/components/user_popover/user_popover_spec.js
@@ -9,6 +9,7 @@ const DEFAULT_PROPS = {
username: 'root',
name: 'Administrator',
location: 'Vienna',
+ localTime: '2:30 PM',
bot: false,
bio: null,
workInformation: null,
@@ -31,10 +32,11 @@ describe('User Popover Component', () => {
wrapper.destroy();
});
- const findUserStatus = () => wrapper.find('.js-user-status');
+ const findUserStatus = () => wrapper.findByTestId('user-popover-status');
const findTarget = () => document.querySelector('.js-user-link');
const findUserName = () => wrapper.find(UserNameWithStatus);
const findSecurityBotDocsLink = () => wrapper.findByTestId('user-popover-bot-docs-link');
+ const findUserLocalTime = () => wrapper.findByTestId('user-popover-local-time');
const createWrapper = (props = {}, options = {}) => {
wrapper = mountExtended(UserPopover, {
@@ -71,7 +73,6 @@ describe('User Popover Component', () => {
expect(wrapper.text()).toContain(DEFAULT_PROPS.user.name);
expect(wrapper.text()).toContain(DEFAULT_PROPS.user.username);
- expect(wrapper.text()).toContain(DEFAULT_PROPS.user.location);
});
it('shows icon for location', () => {
@@ -164,6 +165,25 @@ describe('User Popover Component', () => {
});
});
+ describe('local time', () => {
+ it('should show local time when it is available', () => {
+ createWrapper();
+
+ expect(findUserLocalTime().exists()).toBe(true);
+ });
+
+ it('should not show local time when it is not available', () => {
+ const user = {
+ ...DEFAULT_PROPS.user,
+ localTime: null,
+ };
+
+ createWrapper({ user });
+
+ expect(findUserLocalTime().exists()).toBe(false);
+ });
+ });
+
describe('status data', () => {
it('should show only message', () => {
const user = { ...DEFAULT_PROPS.user, status: { message_html: 'Hello World' } };
@@ -256,5 +276,11 @@ describe('User Popover Component', () => {
const securityBotDocsLink = findSecurityBotDocsLink();
expect(securityBotDocsLink.text()).toBe('Learn more about %<>\';"');
});
+
+ it('does not display local time', () => {
+ createWrapper({ user: SECURITY_BOT_USER });
+
+ expect(findUserLocalTime().exists()).toBe(false);
+ });
});
});
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 5fe4eeb6061..92938b2717f 100644
--- a/spec/frontend/vue_shared/components/web_ide_link_spec.js
+++ b/spec/frontend/vue_shared/components/web_ide_link_spec.js
@@ -160,4 +160,26 @@ describe('Web IDE link component', () => {
expect(findLocalStorageSync().props('value')).toBe(ACTION_GITPOD.key);
});
});
+
+ describe('edit actions', () => {
+ it.each([
+ {
+ props: { showWebIdeButton: true, showEditButton: false },
+ expectedEventPayload: 'ide',
+ },
+ {
+ props: { showWebIdeButton: false, showEditButton: true },
+ expectedEventPayload: 'simple',
+ },
+ ])(
+ 'emits the correct event when an action handler is called',
+ async ({ props, expectedEventPayload }) => {
+ createComponent({ ...props, needsToFork: true });
+
+ findActionsButton().props('actions')[0].handle();
+
+ expect(wrapper.emitted('edit')).toEqual([[expectedEventPayload]]);
+ },
+ );
+ });
});
diff --git a/spec/frontend/vue_shared/directives/validation_spec.js b/spec/frontend/vue_shared/directives/validation_spec.js
index 51ee73cabde..dcd3a44a6fc 100644
--- a/spec/frontend/vue_shared/directives/validation_spec.js
+++ b/spec/frontend/vue_shared/directives/validation_spec.js
@@ -4,11 +4,13 @@ import validation, { initForm } from '~/vue_shared/directives/validation';
describe('validation directive', () => {
let wrapper;
- const createComponentFactory = ({ inputAttributes, template, data }) => {
- const defaultInputAttributes = {
- type: 'text',
- required: true,
- };
+ const createComponentFactory = (options) => {
+ const {
+ inputAttributes = { type: 'text', required: true },
+ template,
+ data,
+ feedbackMap = {},
+ } = options;
const defaultTemplate = `
<form>
@@ -18,11 +20,11 @@ describe('validation directive', () => {
const component = {
directives: {
- validation: validation(),
+ validation: validation(feedbackMap),
},
data() {
return {
- attributes: inputAttributes || defaultInputAttributes,
+ attributes: inputAttributes,
...data,
};
},
@@ -32,8 +34,10 @@ describe('validation directive', () => {
wrapper = shallowMount(component, { attachTo: document.body });
};
- const createComponent = ({ inputAttributes, showValidation, template } = {}) =>
- createComponentFactory({
+ const createComponent = (options = {}) => {
+ const { inputAttributes, showValidation, template, feedbackMap } = options;
+
+ return createComponentFactory({
inputAttributes,
data: {
showValidation,
@@ -48,10 +52,14 @@ describe('validation directive', () => {
},
},
template,
+ feedbackMap,
});
+ };
+
+ const createComponentWithInitForm = (options = {}) => {
+ const { inputAttributes, feedbackMap } = options;
- const createComponentWithInitForm = ({ inputAttributes } = {}) =>
- createComponentFactory({
+ return createComponentFactory({
inputAttributes,
data: {
form: initForm({
@@ -68,7 +76,9 @@ describe('validation directive', () => {
<input v-validation:[form.showValidation] name="exampleField" v-bind="attributes" />
</form>
`,
+ feedbackMap,
});
+ };
afterEach(() => {
wrapper.destroy();
@@ -209,6 +219,111 @@ describe('validation directive', () => {
});
});
+ describe('with custom feedbackMap', () => {
+ const customMessage = 'Please fill out the name field.';
+ const template = `
+ <form>
+ <div v-validation:[showValidation]>
+ <input name="exampleField" v-bind="attributes" />
+ </div>
+ </form>
+ `;
+ beforeEach(() => {
+ const feedbackMap = {
+ valueMissing: {
+ isInvalid: (el) => el.validity?.valueMissing,
+ message: customMessage,
+ },
+ };
+
+ createComponent({
+ template,
+ inputAttributes: {
+ required: true,
+ },
+ feedbackMap,
+ });
+ });
+
+ describe('with invalid value', () => {
+ beforeEach(() => {
+ setValueAndTriggerValidation('');
+ });
+
+ it('should set correct field state', () => {
+ expect(getFormData().fields.exampleField).toEqual({
+ state: false,
+ feedback: customMessage,
+ });
+ });
+ });
+
+ describe('with valid value', () => {
+ beforeEach(() => {
+ setValueAndTriggerValidation('hello');
+ });
+
+ it('set the correct state', () => {
+ expect(getFormData().fields.exampleField).toEqual({
+ state: true,
+ feedback: '',
+ });
+ });
+ });
+ });
+
+ describe('with validation-message present on the element', () => {
+ const customMessage = 'The name field is required.';
+ const template = `
+ <form>
+ <div v-validation:[showValidation]>
+ <input name="exampleField" v-bind="attributes" validation-message="${customMessage}" />
+ </div>
+ </form>
+ `;
+ beforeEach(() => {
+ const feedbackMap = {
+ valueMissing: {
+ isInvalid: (el) => el.validity?.valueMissing,
+ },
+ };
+
+ createComponent({
+ template,
+ inputAttributes: {
+ required: true,
+ },
+ feedbackMap,
+ });
+ });
+
+ describe('with invalid value', () => {
+ beforeEach(() => {
+ setValueAndTriggerValidation('');
+ });
+
+ it('should set correct field state', () => {
+ expect(getFormData().fields.exampleField).toEqual({
+ state: false,
+ feedback: customMessage,
+ });
+ });
+ });
+
+ describe('with valid value', () => {
+ beforeEach(() => {
+ setValueAndTriggerValidation('hello');
+ });
+
+ it('set the correct state', () => {
+ expect(getFormData().fields.exampleField).toEqual({
+ state: true,
+ feedback: '',
+ });
+ });
+ });
+ });
+
describe('component using initForm', () => {
it('sets the form fields correctly', () => {
createComponentWithInitForm();
diff --git a/spec/frontend/vue_shared/oncall_schedules_list_spec.js b/spec/frontend/vue_shared/oncall_schedules_list_spec.js
deleted file mode 100644
index f83a5187b8b..00000000000
--- a/spec/frontend/vue_shared/oncall_schedules_list_spec.js
+++ /dev/null
@@ -1,87 +0,0 @@
-import { GlLink, GlSprintf } from '@gitlab/ui';
-import { shallowMount } from '@vue/test-utils';
-import { extendedWrapper } from 'helpers/vue_test_utils_helper';
-import OncallSchedulesList from '~/vue_shared/components/oncall_schedules_list.vue';
-
-const mockSchedules = [
- {
- name: 'Schedule 1',
- scheduleUrl: 'http://gitlab.com/gitlab-org/gitlab-shell/-/oncall_schedules',
- projectName: 'Shell',
- projectUrl: 'http://gitlab.com/gitlab-org/gitlab-shell/',
- },
- {
- name: 'Schedule 2',
- scheduleUrl: 'http://gitlab.com/gitlab-org/gitlab-ui/-/oncall_schedules',
- projectName: 'UI',
- projectUrl: 'http://gitlab.com/gitlab-org/gitlab-ui/',
- },
-];
-
-const userName = "O'User";
-
-describe('On-call schedules list', () => {
- let wrapper;
-
- function createComponent(props) {
- wrapper = extendedWrapper(
- shallowMount(OncallSchedulesList, {
- propsData: {
- schedules: mockSchedules,
- userName,
- ...props,
- },
- stubs: {
- GlSprintf,
- },
- }),
- );
- }
-
- afterEach(() => {
- wrapper.destroy();
- });
-
- const findLinks = () => wrapper.findAllComponents(GlLink);
- const findTitle = () => wrapper.findByTestId('title');
- const findFooter = () => wrapper.findByTestId('footer');
- const findSchedules = () => wrapper.findByTestId('schedules-list');
-
- describe.each`
- isCurrentUser | titleText | footerText
- ${true} | ${'You are currently a part of:'} | ${'Removing yourself may put your on-call team at risk of missing a notification.'}
- ${false} | ${`User ${userName} is currently part of:`} | ${'Removing this user may put their on-call team at risk of missing a notification.'}
- `('when current user ', ({ isCurrentUser, titleText, footerText }) => {
- it(`${isCurrentUser ? 'is' : 'is not'} a part of on-call schedule`, async () => {
- createComponent({
- isCurrentUser,
- });
-
- expect(findTitle().text()).toBe(titleText);
- expect(findFooter().text()).toBe(footerText);
- });
- });
-
- describe.each(mockSchedules)(
- 'renders each on-call schedule data',
- ({ name, scheduleUrl, projectName, projectUrl }) => {
- beforeEach(() => {
- createComponent({ schedules: [{ name, scheduleUrl, projectName, projectUrl }] });
- });
-
- it(`renders schedule ${name}'s name and link`, () => {
- const msg = findSchedules().text();
-
- expect(msg).toContain(`On-call schedule ${name}`);
- expect(findLinks().at(0).attributes('href')).toBe(scheduleUrl);
- });
-
- it(`renders project ${projectName}'s name and link`, () => {
- const msg = findSchedules().text();
-
- expect(msg).toContain(`in Project ${projectName}`);
- expect(findLinks().at(1).attributes('href')).toBe(projectUrl);
- });
- },
- );
-});
diff --git a/spec/frontend/vue_shared/security_reports/mock_data.js b/spec/frontend/vue_shared/security_reports/mock_data.js
index 06631710509..cdaeec78e47 100644
--- a/spec/frontend/vue_shared/security_reports/mock_data.js
+++ b/spec/frontend/vue_shared/security_reports/mock_data.js
@@ -314,7 +314,7 @@ export const sastDiffSuccessMock = {
head_report_created_at: '2020-01-10T10:00:00.000Z',
};
-export const secretScanningDiffSuccessMock = {
+export const secretDetectionDiffSuccessMock = {
added: [mockFindings[0], mockFindings[1]],
fixed: [mockFindings[2]],
base_report_created_at: '2020-01-01T10:00:00.000Z',
diff --git a/spec/frontend/vue_shared/security_reports/security_reports_app_spec.js b/spec/frontend/vue_shared/security_reports/security_reports_app_spec.js
index 4d579fa61df..68a97103d3a 100644
--- a/spec/frontend/vue_shared/security_reports/security_reports_app_spec.js
+++ b/spec/frontend/vue_shared/security_reports/security_reports_app_spec.js
@@ -12,7 +12,7 @@ import {
securityReportMergeRequestDownloadPathsQueryNoArtifactsResponse,
securityReportMergeRequestDownloadPathsQueryResponse,
sastDiffSuccessMock,
- secretScanningDiffSuccessMock,
+ secretDetectionDiffSuccessMock,
} from 'jest/vue_shared/security_reports/mock_data';
import createFlash from '~/flash';
import axios from '~/lib/utils/axios_utils';
@@ -31,7 +31,7 @@ Vue.use(VueApollo);
Vue.use(Vuex);
const SAST_COMPARISON_PATH = '/sast.json';
-const SECRET_SCANNING_COMPARISON_PATH = '/secret_detection.json';
+const SECRET_DETECTION_COMPARISON_PATH = '/secret_detection.json';
describe('Security reports app', () => {
let wrapper;
@@ -175,12 +175,12 @@ describe('Security reports app', () => {
const SAST_SUCCESS_MESSAGE =
'Security scanning detected 1 potential vulnerability 1 Critical 0 High and 0 Others';
- const SECRET_SCANNING_SUCCESS_MESSAGE =
+ const SECRET_DETECTION_SUCCESS_MESSAGE =
'Security scanning detected 2 potential vulnerabilities 1 Critical 1 High and 0 Others';
describe.each`
- reportType | pathProp | path | successResponse | successMessage
- ${REPORT_TYPE_SAST} | ${'sastComparisonPath'} | ${SAST_COMPARISON_PATH} | ${sastDiffSuccessMock} | ${SAST_SUCCESS_MESSAGE}
- ${REPORT_TYPE_SECRET_DETECTION} | ${'secretScanningComparisonPath'} | ${SECRET_SCANNING_COMPARISON_PATH} | ${secretScanningDiffSuccessMock} | ${SECRET_SCANNING_SUCCESS_MESSAGE}
+ reportType | pathProp | path | successResponse | successMessage
+ ${REPORT_TYPE_SAST} | ${'sastComparisonPath'} | ${SAST_COMPARISON_PATH} | ${sastDiffSuccessMock} | ${SAST_SUCCESS_MESSAGE}
+ ${REPORT_TYPE_SECRET_DETECTION} | ${'secretDetectionComparisonPath'} | ${SECRET_DETECTION_COMPARISON_PATH} | ${secretDetectionDiffSuccessMock} | ${SECRET_DETECTION_SUCCESS_MESSAGE}
`(
'given a $pathProp and $reportType artifact',
({ pathProp, path, successResponse, successMessage }) => {
diff --git a/spec/frontend/vue_shared/security_reports/store/getters_spec.js b/spec/frontend/vue_shared/security_reports/store/getters_spec.js
index 97746c7c38b..bcc8955ba02 100644
--- a/spec/frontend/vue_shared/security_reports/store/getters_spec.js
+++ b/spec/frontend/vue_shared/security_reports/store/getters_spec.js
@@ -8,7 +8,7 @@ import {
summaryCounts,
} from '~/vue_shared/security_reports/store/getters';
import createSastState from '~/vue_shared/security_reports/store/modules/sast/state';
-import createSecretScanningState from '~/vue_shared/security_reports/store/modules/secret_detection/state';
+import createSecretDetectionState from '~/vue_shared/security_reports/store/modules/secret_detection/state';
import createState from '~/vue_shared/security_reports/store/state';
import { groupedTextBuilder } from '~/vue_shared/security_reports/store/utils';
import { CRITICAL, HIGH, LOW } from '~/vulnerabilities/constants';
@@ -21,7 +21,7 @@ describe('Security reports getters', () => {
beforeEach(() => {
state = createState();
state.sast = createSastState();
- state.secretDetection = createSecretScanningState();
+ state.secretDetection = createSecretDetectionState();
});
describe('summaryCounts', () => {
diff --git a/spec/frontend_integration/fixture_generators.yml b/spec/frontend_integration/fixture_generators.yml
new file mode 100644
index 00000000000..1f6ff85352d
--- /dev/null
+++ b/spec/frontend_integration/fixture_generators.yml
@@ -0,0 +1,5 @@
+- spec/frontend/fixtures/api_projects.rb
+- spec/frontend/fixtures/api_merge_requests.rb
+- spec/frontend/fixtures/projects_json.rb
+- spec/frontend/fixtures/merge_requests_diffs.rb
+- spec/frontend/fixtures/raw.rb
diff --git a/spec/frontend_integration/test_helpers/mock_server/graphql.js b/spec/frontend_integration/test_helpers/mock_server/graphql.js
index 27396842523..d4ee7c02839 100644
--- a/spec/frontend_integration/test_helpers/mock_server/graphql.js
+++ b/spec/frontend_integration/test_helpers/mock_server/graphql.js
@@ -1,9 +1,7 @@
import { buildSchema, graphql } from 'graphql';
import { memoize } from 'lodash';
-// The graphql schema is dynamically generated in CI
-// during the `graphql-schema-dump` job.
-// eslint-disable-next-line global-require, import/no-unresolved
+// eslint-disable-next-line global-require
const getGraphqlSchema = () => require('../../../../tmp/tests/graphql/gitlab_schema.graphql');
const graphqlResolvers = {
diff --git a/spec/graphql/mutations/clusters/agent_tokens/create_spec.rb b/spec/graphql/mutations/clusters/agent_tokens/create_spec.rb
new file mode 100644
index 00000000000..fc025c8e3d3
--- /dev/null
+++ b/spec/graphql/mutations/clusters/agent_tokens/create_spec.rb
@@ -0,0 +1,61 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Mutations::Clusters::AgentTokens::Create do
+ subject(:mutation) { described_class.new(object: nil, context: context, field: nil) }
+
+ let_it_be(:cluster_agent) { create(:cluster_agent) }
+ let_it_be(:user) { create(:user) }
+
+ let(:context) do
+ GraphQL::Query::Context.new(
+ query: OpenStruct.new(schema: nil),
+ values: { current_user: user },
+ object: nil
+ )
+ end
+
+ specify { expect(described_class).to require_graphql_authorizations(:create_cluster) }
+
+ describe '#resolve' do
+ let(:description) { 'new token!' }
+ let(:name) { 'new name' }
+
+ subject { mutation.resolve(cluster_agent_id: cluster_agent.to_global_id, description: description, name: name) }
+
+ context 'without token permissions' do
+ it 'raises an error if the resource is not accessible to the user' do
+ expect { subject }.to raise_error(Gitlab::Graphql::Errors::ResourceNotAvailable)
+ end
+ end
+
+ context 'with user permissions' do
+ before do
+ cluster_agent.project.add_maintainer(user)
+ end
+
+ it 'creates a new token', :aggregate_failures do
+ expect { subject }.to change { ::Clusters::AgentToken.count }.by(1)
+ expect(subject[:errors]).to eq([])
+ end
+
+ it 'returns token information', :aggregate_failures do
+ token = subject[:token]
+
+ expect(subject[:secret]).not_to be_nil
+ expect(token.created_by_user).to eq(user)
+ expect(token.description).to eq(description)
+ expect(token.name).to eq(name)
+ end
+
+ context 'invalid params' do
+ subject { mutation.resolve(cluster_agent_id: cluster_agent.id) }
+
+ it 'generates an error message when id invalid', :aggregate_failures do
+ expect { subject }.to raise_error(::GraphQL::CoercionError)
+ end
+ end
+ end
+ end
+end
diff --git a/spec/graphql/mutations/clusters/agent_tokens/delete_spec.rb b/spec/graphql/mutations/clusters/agent_tokens/delete_spec.rb
new file mode 100644
index 00000000000..5cdbc0f6d72
--- /dev/null
+++ b/spec/graphql/mutations/clusters/agent_tokens/delete_spec.rb
@@ -0,0 +1,52 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Mutations::Clusters::AgentTokens::Delete do
+ let(:token) { create(:cluster_agent_token) }
+ let(:user) { create(:user) }
+
+ let(:mutation) do
+ described_class.new(
+ object: double,
+ context: { current_user: user },
+ field: double
+ )
+ end
+
+ it { expect(described_class.graphql_name).to eq('ClusterAgentTokenDelete') }
+ it { expect(described_class).to require_graphql_authorizations(:admin_cluster) }
+
+ describe '#resolve' do
+ let(:global_id) { token.to_global_id }
+
+ subject { mutation.resolve(id: global_id) }
+
+ context 'without user permissions' do
+ it 'fails to delete the cluster agent', :aggregate_failures do
+ expect { subject }.to raise_error(Gitlab::Graphql::Errors::ResourceNotAvailable)
+ expect { token.reload }.not_to raise_error
+ end
+ end
+
+ context 'with user permissions' do
+ before do
+ token.agent.project.add_maintainer(user)
+ end
+
+ it 'deletes a cluster agent', :aggregate_failures do
+ expect { subject }.to change { ::Clusters::AgentToken.count }.by(-1)
+ expect { token.reload }.to raise_error(ActiveRecord::RecordNotFound)
+ end
+ end
+
+ context 'with invalid params' do
+ let(:global_id) { token.id }
+
+ it 'raises an error if the cluster agent id is invalid', :aggregate_failures do
+ expect { subject }.to raise_error(::GraphQL::CoercionError)
+ expect { token.reload }.not_to raise_error
+ end
+ end
+ end
+end
diff --git a/spec/graphql/mutations/clusters/agents/create_spec.rb b/spec/graphql/mutations/clusters/agents/create_spec.rb
new file mode 100644
index 00000000000..c80b6f6cdad
--- /dev/null
+++ b/spec/graphql/mutations/clusters/agents/create_spec.rb
@@ -0,0 +1,50 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Mutations::Clusters::Agents::Create do
+ subject(:mutation) { described_class.new(object: nil, context: context, field: nil) }
+
+ let(:project) { create(:project, :public, :repository) }
+ let(:user) { create(:user) }
+ let(:context) do
+ GraphQL::Query::Context.new(
+ query: OpenStruct.new(schema: nil),
+ values: { current_user: user },
+ object: nil
+ )
+ end
+
+ specify { expect(described_class).to require_graphql_authorizations(:create_cluster) }
+
+ describe '#resolve' do
+ subject { mutation.resolve(project_path: project.full_path, name: 'test-agent') }
+
+ context 'without project permissions' do
+ it 'raises an error if the resource is not accessible to the user' do
+ expect { subject }.to raise_error(Gitlab::Graphql::Errors::ResourceNotAvailable)
+ end
+ end
+
+ context 'with user permissions' do
+ before do
+ project.add_maintainer(user)
+ end
+
+ it 'creates a new clusters_agent', :aggregate_failures do
+ expect { subject }.to change { ::Clusters::Agent.count }.by(1)
+ expect(subject[:cluster_agent].name).to eq('test-agent')
+ expect(subject[:errors]).to eq([])
+ end
+
+ context 'invalid params' do
+ subject { mutation.resolve(project_path: project.full_path, name: '@bad_name!') }
+
+ it 'generates an error message when name is invalid', :aggregate_failures do
+ expect(subject[:clusters_agent]).to be_nil
+ expect(subject[:errors]).to eq(["Name can contain only lowercase letters, digits, and '-', but cannot start or end with '-'"])
+ end
+ end
+ end
+ end
+end
diff --git a/spec/graphql/mutations/clusters/agents/delete_spec.rb b/spec/graphql/mutations/clusters/agents/delete_spec.rb
new file mode 100644
index 00000000000..0aabf53391a
--- /dev/null
+++ b/spec/graphql/mutations/clusters/agents/delete_spec.rb
@@ -0,0 +1,51 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Mutations::Clusters::Agents::Delete do
+ subject(:mutation) { described_class.new(object: nil, context: context, field: nil) }
+
+ let(:cluster_agent) { create(:cluster_agent) }
+ let(:project) { cluster_agent.project }
+ let(:user) { create(:user) }
+ let(:context) do
+ GraphQL::Query::Context.new(
+ query: OpenStruct.new(schema: nil),
+ values: { current_user: user },
+ object: nil
+ )
+ end
+
+ specify { expect(described_class).to require_graphql_authorizations(:admin_cluster) }
+
+ describe '#resolve' do
+ subject { mutation.resolve(id: cluster_agent.to_global_id) }
+
+ context 'without user permissions' do
+ it 'fails to delete the cluster agent', :aggregate_failures do
+ expect { subject }.to raise_error(Gitlab::Graphql::Errors::ResourceNotAvailable)
+ expect { cluster_agent.reload }.not_to raise_error
+ end
+ end
+
+ context 'with user permissions' do
+ before do
+ project.add_maintainer(user)
+ end
+
+ it 'deletes a cluster agent', :aggregate_failures do
+ expect { subject }.to change { ::Clusters::Agent.count }.by(-1)
+ expect { cluster_agent.reload }.to raise_error(ActiveRecord::RecordNotFound)
+ end
+ end
+
+ context 'with invalid params' do
+ subject { mutation.resolve(id: cluster_agent.id) }
+
+ it 'raises an error if the cluster agent id is invalid', :aggregate_failures do
+ expect { subject }.to raise_error(::GraphQL::CoercionError)
+ expect { cluster_agent.reload }.not_to raise_error
+ end
+ end
+ end
+end
diff --git a/spec/graphql/mutations/customer_relations/contacts/create_spec.rb b/spec/graphql/mutations/customer_relations/contacts/create_spec.rb
new file mode 100644
index 00000000000..21a1aa2741a
--- /dev/null
+++ b/spec/graphql/mutations/customer_relations/contacts/create_spec.rb
@@ -0,0 +1,101 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Mutations::CustomerRelations::Contacts::Create do
+ let_it_be(:user) { create(:user) }
+ let_it_be(:group) { create(:group) }
+
+ let(:not_found_or_does_not_belong) { 'The specified organization was not found or does not belong to this group' }
+ let(:valid_params) do
+ attributes_for(:contact,
+ group: group,
+ description: 'Managing Director'
+ )
+ end
+
+ describe '#resolve' do
+ subject(:resolve_mutation) do
+ described_class.new(object: nil, context: { current_user: user }, field: nil).resolve(
+ **valid_params,
+ group_id: group.to_global_id
+ )
+ end
+
+ context 'when the user does not have permission' do
+ before do
+ group.add_reporter(user)
+ end
+
+ it 'raises an error' do
+ expect { resolve_mutation }.to raise_error(Gitlab::Graphql::Errors::ResourceNotAvailable)
+ .with_message("The resource that you are attempting to access does not exist or you don't have permission to perform this action")
+ end
+ end
+
+ context 'when the user has permission' do
+ before_all do
+ group.add_developer(user)
+ end
+
+ context 'when the feature is disabled' do
+ before do
+ stub_feature_flags(customer_relations: false)
+ end
+
+ it 'raises an error' do
+ expect { resolve_mutation }.to raise_error(Gitlab::Graphql::Errors::ResourceNotAvailable)
+ .with_message('Feature disabled')
+ end
+ end
+
+ context 'when the params are invalid' do
+ it 'returns the validation error' do
+ valid_params[:first_name] = nil
+
+ expect(resolve_mutation[:errors]).to match_array(["First name can't be blank"])
+ end
+ end
+
+ context 'when attaching to an organization' do
+ context 'when all ok' do
+ before do
+ organization = create(:organization, group: group)
+ valid_params[:organization_id] = organization.to_global_id
+ end
+
+ it 'creates contact with correct values' do
+ expect(resolve_mutation[:contact].organization).to be_present
+ end
+ end
+
+ context 'when organization_id is invalid' do
+ before do
+ valid_params[:organization_id] = "gid://gitlab/CustomerRelations::Organization/#{non_existing_record_id}"
+ end
+
+ it 'returns the relevant error' do
+ expect(resolve_mutation[:errors]).to match_array([not_found_or_does_not_belong])
+ end
+ end
+
+ context 'when organzation belongs to a different group' do
+ before do
+ organization = create(:organization)
+ valid_params[:organization_id] = organization.to_global_id
+ end
+
+ it 'returns the relevant error' do
+ expect(resolve_mutation[:errors]).to match_array([not_found_or_does_not_belong])
+ end
+ end
+ end
+
+ it 'creates contact with correct values' do
+ expect(resolve_mutation[:contact]).to have_attributes(valid_params)
+ end
+ end
+ end
+
+ specify { expect(described_class).to require_graphql_authorizations(:admin_contact) }
+end
diff --git a/spec/graphql/mutations/customer_relations/contacts/update_spec.rb b/spec/graphql/mutations/customer_relations/contacts/update_spec.rb
new file mode 100644
index 00000000000..93bc6f53cf9
--- /dev/null
+++ b/spec/graphql/mutations/customer_relations/contacts/update_spec.rb
@@ -0,0 +1,75 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Mutations::CustomerRelations::Contacts::Update do
+ let_it_be(:user) { create(:user) }
+ let_it_be(:group) { create(:group) }
+
+ let(:first_name) { 'Lionel' }
+ let(:last_name) { 'Smith' }
+ let(:email) { 'ls@gitlab.com' }
+ let(:description) { 'VIP' }
+ let(:does_not_exist_or_no_permission) { "The resource that you are attempting to access does not exist or you don't have permission to perform this action" }
+ let(:contact) { create(:contact, group: group) }
+ let(:attributes) do
+ {
+ id: contact.to_global_id,
+ first_name: first_name,
+ last_name: last_name,
+ email: email,
+ description: description
+ }
+ end
+
+ describe '#resolve' do
+ subject(:resolve_mutation) do
+ described_class.new(object: nil, context: { current_user: user }, field: nil).resolve(
+ attributes
+ )
+ end
+
+ context 'when the user does not have permission to update a contact' do
+ before do
+ group.add_reporter(user)
+ end
+
+ it 'raises an error' do
+ expect { resolve_mutation }.to raise_error(Gitlab::Graphql::Errors::ResourceNotAvailable)
+ .with_message(does_not_exist_or_no_permission)
+ end
+ end
+
+ context 'when the contact does not exist' do
+ it 'raises an error' do
+ attributes[:id] = "gid://gitlab/CustomerRelations::Contact/#{non_existing_record_id}"
+
+ expect { resolve_mutation }.to raise_error(Gitlab::Graphql::Errors::ResourceNotAvailable)
+ .with_message(does_not_exist_or_no_permission)
+ end
+ end
+
+ context 'when the user has permission to update a contact' do
+ before_all do
+ group.add_developer(user)
+ end
+
+ it 'updates the organization with correct values' do
+ expect(resolve_mutation[:contact]).to have_attributes(attributes)
+ end
+
+ context 'when the feature is disabled' do
+ before do
+ stub_feature_flags(customer_relations: false)
+ end
+
+ it 'raises an error' do
+ expect { resolve_mutation }.to raise_error(Gitlab::Graphql::Errors::ResourceNotAvailable)
+ .with_message('Feature disabled')
+ end
+ end
+ end
+ end
+
+ specify { expect(described_class).to require_graphql_authorizations(:admin_contact) }
+end
diff --git a/spec/graphql/mutations/customer_relations/organizations/create_spec.rb b/spec/graphql/mutations/customer_relations/organizations/create_spec.rb
index ab430b9240b..738a8d724ab 100644
--- a/spec/graphql/mutations/customer_relations/organizations/create_spec.rb
+++ b/spec/graphql/mutations/customer_relations/organizations/create_spec.rb
@@ -4,6 +4,7 @@ require 'spec_helper'
RSpec.describe Mutations::CustomerRelations::Organizations::Create do
let_it_be(:user) { create(:user) }
+ let_it_be(:group) { create(:group) }
let(:valid_params) do
attributes_for(:organization,
@@ -23,22 +24,19 @@ RSpec.describe Mutations::CustomerRelations::Organizations::Create do
end
context 'when the user does not have permission' do
- let_it_be(:group) { create(:group) }
-
before do
- group.add_guest(user)
+ group.add_reporter(user)
end
it 'raises an error' do
expect { resolve_mutation }.to raise_error(Gitlab::Graphql::Errors::ResourceNotAvailable)
+ .with_message("The resource that you are attempting to access does not exist or you don't have permission to perform this action")
end
end
context 'when the user has permission' do
- let_it_be(:group) { create(:group) }
-
before_all do
- group.add_reporter(user)
+ group.add_developer(user)
end
context 'when the feature is disabled' do
@@ -48,6 +46,7 @@ RSpec.describe Mutations::CustomerRelations::Organizations::Create do
it 'raises an error' do
expect { resolve_mutation }.to raise_error(Gitlab::Graphql::Errors::ResourceNotAvailable)
+ .with_message('Feature disabled')
end
end
diff --git a/spec/graphql/mutations/customer_relations/organizations/update_spec.rb b/spec/graphql/mutations/customer_relations/organizations/update_spec.rb
index f5aa6c00301..0bc6f184fe3 100644
--- a/spec/graphql/mutations/customer_relations/organizations/update_spec.rb
+++ b/spec/graphql/mutations/customer_relations/organizations/update_spec.rb
@@ -4,10 +4,12 @@ require 'spec_helper'
RSpec.describe Mutations::CustomerRelations::Organizations::Update do
let_it_be(:user) { create(:user) }
- let_it_be(:name) { 'GitLab' }
- let_it_be(:default_rate) { 1000.to_f }
- let_it_be(:description) { 'VIP' }
+ let_it_be(:group) { create(:group) }
+ let(:name) { 'GitLab' }
+ let(:default_rate) { 1000.to_f }
+ let(:description) { 'VIP' }
+ let(:does_not_exist_or_no_permission) { "The resource that you are attempting to access does not exist or you don't have permission to perform this action" }
let(:organization) { create(:organization, group: group) }
let(:attributes) do
{
@@ -26,32 +28,28 @@ RSpec.describe Mutations::CustomerRelations::Organizations::Update do
end
context 'when the user does not have permission to update an organization' do
- let_it_be(:group) { create(:group) }
-
before do
- group.add_guest(user)
+ group.add_reporter(user)
end
it 'raises an error' do
expect { resolve_mutation }.to raise_error(Gitlab::Graphql::Errors::ResourceNotAvailable)
+ .with_message(does_not_exist_or_no_permission)
end
end
context 'when the organization does not exist' do
- let_it_be(:group) { create(:group) }
-
it 'raises an error' do
- attributes[:id] = 'gid://gitlab/CustomerRelations::Organization/999'
+ attributes[:id] = "gid://gitlab/CustomerRelations::Organization/#{non_existing_record_id}"
expect { resolve_mutation }.to raise_error(Gitlab::Graphql::Errors::ResourceNotAvailable)
+ .with_message(does_not_exist_or_no_permission)
end
end
context 'when the user has permission to update an organization' do
- let_it_be(:group) { create(:group) }
-
before_all do
- group.add_reporter(user)
+ group.add_developer(user)
end
it 'updates the organization with correct values' do
@@ -65,6 +63,7 @@ RSpec.describe Mutations::CustomerRelations::Organizations::Update do
it 'raises an error' do
expect { resolve_mutation }.to raise_error(Gitlab::Graphql::Errors::ResourceNotAvailable)
+ .with_message('Feature disabled')
end
end
end
diff --git a/spec/graphql/mutations/dependency_proxy/group_settings/update_spec.rb b/spec/graphql/mutations/dependency_proxy/group_settings/update_spec.rb
new file mode 100644
index 00000000000..35d3224d5ba
--- /dev/null
+++ b/spec/graphql/mutations/dependency_proxy/group_settings/update_spec.rb
@@ -0,0 +1,55 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Mutations::DependencyProxy::GroupSettings::Update do
+ using RSpec::Parameterized::TableSyntax
+
+ let_it_be_with_reload(:group) { create(:group) }
+ let_it_be_with_reload(:group_settings) { create(:dependency_proxy_group_setting, group: group) }
+ let_it_be(:user) { create(:user) }
+
+ let(:params) { { group_path: group.full_path, enabled: false } }
+
+ specify { expect(described_class).to require_graphql_authorizations(:admin_dependency_proxy) }
+
+ describe '#resolve' do
+ subject { described_class.new(object: group, context: { current_user: user }, field: nil).resolve(**params) }
+
+ shared_examples 'updating the dependency proxy group settings' do
+ it_behaves_like 'updating the dependency proxy group settings attributes',
+ from: { enabled: true },
+ to: { enabled: false }
+
+ it 'returns the dependency proxy settings no errors' do
+ expect(subject).to eq(
+ dependency_proxy_setting: group_settings,
+ errors: []
+ )
+ end
+ end
+
+ shared_examples 'denying access to dependency proxy group settings' do
+ it 'raises Gitlab::Graphql::Errors::ResourceNotAvailable' do
+ expect { subject }.to raise_error(Gitlab::Graphql::Errors::ResourceNotAvailable)
+ end
+ end
+
+ where(:user_role, :shared_examples_name) do
+ :maintainer | 'updating the dependency proxy group settings'
+ :developer | 'updating the dependency proxy group settings'
+ :reporter | 'denying access to dependency proxy group settings'
+ :guest | 'denying access to dependency proxy group settings'
+ :anonymous | 'denying access to dependency proxy group settings'
+ end
+
+ with_them do
+ before do
+ stub_config(dependency_proxy: { enabled: true })
+ group.send("add_#{user_role}", user) unless user_role == :anonymous
+ end
+
+ it_behaves_like params[:shared_examples_name]
+ end
+ end
+end
diff --git a/spec/graphql/mutations/groups/update_spec.rb b/spec/graphql/mutations/groups/update_spec.rb
index 2118134e8e6..620c9d6ee91 100644
--- a/spec/graphql/mutations/groups/update_spec.rb
+++ b/spec/graphql/mutations/groups/update_spec.rb
@@ -18,7 +18,7 @@ RSpec.describe Mutations::Groups::Update do
RSpec.shared_examples 'updating the group shared runners setting' do
it 'updates the group shared runners setting' do
expect { subject }
- .to change { group.reload.shared_runners_setting }.from('enabled').to('disabled_and_unoverridable')
+ .to change { group.reload.shared_runners_setting }.from('enabled').to(Namespace::SR_DISABLED_AND_UNOVERRIDABLE)
end
it 'returns no errors' do
@@ -51,7 +51,7 @@ RSpec.describe Mutations::Groups::Update do
context 'changing shared runners setting' do
let_it_be(:params) do
{ full_path: group.full_path,
- shared_runners_setting: 'disabled_and_unoverridable' }
+ shared_runners_setting: Namespace::SR_DISABLED_AND_UNOVERRIDABLE }
end
where(:user_role, :shared_examples_name) do
diff --git a/spec/graphql/mutations/issues/create_spec.rb b/spec/graphql/mutations/issues/create_spec.rb
index 0e7ef0e55b9..825d04ff827 100644
--- a/spec/graphql/mutations/issues/create_spec.rb
+++ b/spec/graphql/mutations/issues/create_spec.rb
@@ -53,7 +53,11 @@ RSpec.describe Mutations::Issues::Create do
stub_spam_services
end
- subject { mutation.resolve(**mutation_params) }
+ def resolve
+ mutation.resolve(**mutation_params)
+ end
+
+ subject { resolve }
context 'when the user does not have permission to create an issue' do
it 'raises an error' do
@@ -61,6 +65,15 @@ RSpec.describe Mutations::Issues::Create do
end
end
+ context 'when the user has exceeded the rate limit' do
+ it 'raises an error' do
+ allow(::Gitlab::ApplicationRateLimiter).to receive(:throttled?).and_return(true)
+ project.add_developer(user)
+
+ expect { resolve }.to raise_error(RateLimitedService::RateLimitedError, _('This endpoint has been requested too many times. Try again later.'))
+ end
+ end
+
context 'when the user can create an issue' do
context 'when creating an issue a developer' do
before do
diff --git a/spec/graphql/resolvers/board_list_issues_resolver_spec.rb b/spec/graphql/resolvers/board_list_issues_resolver_spec.rb
index 26040f4ec1a..53d2c8a853c 100644
--- a/spec/graphql/resolvers/board_list_issues_resolver_spec.rb
+++ b/spec/graphql/resolvers/board_list_issues_resolver_spec.rb
@@ -31,12 +31,11 @@ RSpec.describe Resolvers::BoardListIssuesResolver do
end.to raise_error(Gitlab::Graphql::Errors::ArgumentError)
end
- it 'returns issues in the correct order with non-nil relative positions', :aggregate_failures do
+ it 'returns the issues in the correct order' do
# by relative_position and then ID
result = resolve_board_list_issues
- expect(result.map(&:id)).to eq [issue3.id, issue1.id, issue2.id, issue4.id]
- expect(result.map(&:relative_position)).not_to include(nil)
+ expect(result.map(&:id)).to eq [issue1.id, issue3.id, issue2.id, issue4.id]
end
it 'finds only issues matching filters' do
@@ -57,6 +56,13 @@ RSpec.describe Resolvers::BoardListIssuesResolver do
expect(result).to match_array([issue1])
end
+ it 'filters issues by negated issue type' do
+ incident = create(:incident, project: project, labels: [label], relative_position: 15)
+ result = resolve_board_list_issues(args: { filters: { not: { types: ['issue'] } } })
+
+ expect(result).to contain_exactly(incident)
+ end
+
it 'raises an exception if both assignee_username and assignee_wildcard_id are present' do
expect do
resolve_board_list_issues(args: { filters: { assignee_username: ['username'], assignee_wildcard_id: 'NONE' } })
@@ -112,6 +118,6 @@ RSpec.describe Resolvers::BoardListIssuesResolver do
end
def resolve_board_list_issues(args: {}, current_user: user)
- resolve(described_class, obj: list, args: args, ctx: { current_user: current_user }).items
+ resolve(described_class, obj: list, args: args, ctx: { current_user: current_user })
end
end
diff --git a/spec/graphql/resolvers/board_list_resolver_spec.rb b/spec/graphql/resolvers/board_list_resolver_spec.rb
new file mode 100644
index 00000000000..5cf9e4b14ea
--- /dev/null
+++ b/spec/graphql/resolvers/board_list_resolver_spec.rb
@@ -0,0 +1,39 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Resolvers::BoardListResolver do
+ include GraphqlHelpers
+ include Gitlab::Graphql::Laziness
+
+ let_it_be(:guest) { create(:user) }
+ let_it_be(:unauth_user) { create(:user) }
+ let_it_be(:group) { create(:group, :private) }
+ let_it_be(:group_label) { create(:group_label, group: group, name: 'Development') }
+ let_it_be(:board) { create(:board, resource_parent: group) }
+ let_it_be(:label_list) { create(:list, board: board, label: group_label) }
+
+ describe '#resolve' do
+ subject { resolve_board_list(args: { id: global_id_of(label_list) }, current_user: current_user) }
+
+ context 'with unauthorized user' do
+ let(:current_user) { unauth_user }
+
+ it { is_expected.to be_nil }
+ end
+
+ context 'when authorized' do
+ let(:current_user) { guest }
+
+ before do
+ group.add_guest(guest)
+ end
+
+ it { is_expected.to eq label_list }
+ end
+ end
+
+ def resolve_board_list(args: {}, current_user: user)
+ force(resolve(described_class, obj: nil, args: args, ctx: { current_user: current_user }))
+ end
+end
diff --git a/spec/graphql/resolvers/clusters/agent_tokens_resolver_spec.rb b/spec/graphql/resolvers/clusters/agent_tokens_resolver_spec.rb
new file mode 100644
index 00000000000..6b8b88928d8
--- /dev/null
+++ b/spec/graphql/resolvers/clusters/agent_tokens_resolver_spec.rb
@@ -0,0 +1,32 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Resolvers::Clusters::AgentTokensResolver do
+ include GraphqlHelpers
+
+ it { expect(described_class.type).to eq(Types::Clusters::AgentTokenType) }
+ it { expect(described_class.null).to be_truthy }
+
+ describe '#resolve' do
+ let(:agent) { create(:cluster_agent) }
+ let(:user) { create(:user, maintainer_projects: [agent.project]) }
+ let(:ctx) { Hash(current_user: user) }
+
+ let!(:matching_token1) { create(:cluster_agent_token, agent: agent, last_used_at: 5.days.ago) }
+ let!(:matching_token2) { create(:cluster_agent_token, agent: agent, last_used_at: 2.days.ago) }
+ let!(:other_token) { create(:cluster_agent_token) }
+
+ subject { resolve(described_class, obj: agent, ctx: ctx) }
+
+ it 'returns tokens associated with the agent, ordered by last_used_at' do
+ expect(subject).to eq([matching_token2, matching_token1])
+ end
+
+ context 'user does not have permission' do
+ let(:user) { create(:user, developer_projects: [agent.project]) }
+
+ it { is_expected.to be_empty }
+ end
+ end
+end
diff --git a/spec/graphql/resolvers/clusters/agents_resolver_spec.rb b/spec/graphql/resolvers/clusters/agents_resolver_spec.rb
new file mode 100644
index 00000000000..70f40748e1d
--- /dev/null
+++ b/spec/graphql/resolvers/clusters/agents_resolver_spec.rb
@@ -0,0 +1,77 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Resolvers::Clusters::AgentsResolver do
+ include GraphqlHelpers
+
+ specify do
+ expect(described_class).to have_nullable_graphql_type(Types::Clusters::AgentType.connection_type)
+ end
+
+ specify do
+ expect(described_class.field_options).to include(extras: include(:lookahead))
+ end
+
+ describe '#resolve' do
+ let_it_be(:project) { create(:project) }
+ let_it_be(:maintainer) { create(:user, maintainer_projects: [project]) }
+ let_it_be(:developer) { create(:user, developer_projects: [project]) }
+ let_it_be(:agents) { create_list(:cluster_agent, 2, project: project) }
+
+ let(:ctx) { { current_user: current_user } }
+
+ subject { resolve_agents }
+
+ context 'the current user has access to clusters' do
+ let(:current_user) { maintainer }
+
+ it 'finds all agents' do
+ expect(subject).to match_array(agents)
+ end
+ end
+
+ context 'the current user does not have access to clusters' do
+ let(:current_user) { developer }
+
+ it 'returns an empty result' do
+ expect(subject).to be_empty
+ end
+ end
+ end
+
+ def resolve_agents(args = {})
+ resolve(described_class, obj: project, ctx: ctx, lookahead: positive_lookahead, args: args)
+ end
+end
+
+RSpec.describe Resolvers::Clusters::AgentsResolver.single do
+ it { expect(described_class).to be < Resolvers::Clusters::AgentsResolver }
+
+ describe '.field_options' do
+ subject { described_class.field_options }
+
+ specify do
+ expect(subject).to include(
+ type: ::Types::Clusters::AgentType,
+ null: true,
+ extras: [:lookahead]
+ )
+ end
+ end
+
+ describe 'arguments' do
+ subject { described_class.arguments[argument] }
+
+ describe 'name' do
+ let(:argument) { 'name' }
+
+ it do
+ expect(subject).to be_present
+ expect(subject.type).to be_kind_of GraphQL::Schema::NonNull
+ expect(subject.type.unwrap).to eq GraphQL::Types::String
+ expect(subject.description).to be_present
+ end
+ end
+ end
+end
diff --git a/spec/graphql/resolvers/issues_resolver_spec.rb b/spec/graphql/resolvers/issues_resolver_spec.rb
index e992b2b04ae..9897e697009 100644
--- a/spec/graphql/resolvers/issues_resolver_spec.rb
+++ b/spec/graphql/resolvers/issues_resolver_spec.rb
@@ -26,7 +26,14 @@ RSpec.describe Resolvers::IssuesResolver do
expect(described_class).to have_nullable_graphql_type(Types::IssueType.connection_type)
end
+ shared_context 'filtering for confidential issues' do
+ let_it_be(:confidential_issue1) { create(:issue, project: project, confidential: true) }
+ let_it_be(:confidential_issue2) { create(:issue, project: other_project, confidential: true) }
+ end
+
context "with a project" do
+ let(:obj) { project }
+
before_all do
project.add_developer(current_user)
project.add_reporter(reporter)
@@ -222,6 +229,42 @@ RSpec.describe Resolvers::IssuesResolver do
end
end
+ context 'confidential issues' do
+ include_context 'filtering for confidential issues'
+
+ context "when user is allowed to view confidential issues" do
+ it 'returns all viewable issues by default' do
+ expect(resolve_issues).to contain_exactly(issue1, issue2, confidential_issue1)
+ end
+
+ it 'returns only the non-confidential issues for the project when filter is set to false' do
+ expect(resolve_issues({ confidential: false })).to contain_exactly(issue1, issue2)
+ end
+
+ it "returns only the confidential issues for the project when filter is set to true" do
+ expect(resolve_issues({ confidential: true })).to contain_exactly(confidential_issue1)
+ end
+ end
+
+ context "when user is not allowed to see confidential issues" do
+ before do
+ project.add_guest(current_user)
+ end
+
+ it 'returns all viewable issues by default' do
+ expect(resolve_issues).to contain_exactly(issue1, issue2)
+ end
+
+ it 'does not return the confidential issues when filter is set to false' do
+ expect(resolve_issues({ confidential: false })).to contain_exactly(issue1, issue2)
+ end
+
+ it 'does not return the confidential issues when filter is set to true' do
+ expect(resolve_issues({ confidential: true })).to be_empty
+ end
+ end
+ end
+
context 'when searching issues' do
it 'returns correct issues' do
expect(resolve_issues(search: 'foo')).to contain_exactly(issue2)
@@ -236,6 +279,36 @@ RSpec.describe Resolvers::IssuesResolver do
resolve_issues(search: 'foo')
end
+
+ context 'with anonymous user' do
+ let_it_be(:public_project) { create(:project, :public) }
+ let_it_be(:public_issue) { create(:issue, project: public_project, title: 'Test issue') }
+
+ context 'with disable_anonymous_search enabled' do
+ before do
+ stub_feature_flags(disable_anonymous_search: true)
+ end
+
+ it 'returns an error' do
+ error_message = "User must be authenticated to include the `search` argument."
+
+ expect { resolve(described_class, obj: public_project, args: { search: 'test' }, ctx: { current_user: nil }) }
+ .to raise_error(Gitlab::Graphql::Errors::ArgumentError, error_message)
+ end
+ end
+
+ context 'with disable_anonymous_search disabled' do
+ before do
+ stub_feature_flags(disable_anonymous_search: false)
+ end
+
+ it 'returns correct issues' do
+ expect(
+ resolve(described_class, obj: public_project, args: { search: 'test' }, ctx: { current_user: nil })
+ ).to contain_exactly(public_issue)
+ end
+ end
+ end
end
describe 'filters by negated params' do
@@ -260,6 +333,10 @@ RSpec.describe Resolvers::IssuesResolver do
expect(resolve_issues(not: { assignee_id: [assignee.id] })).to contain_exactly(issue1)
end
+ it 'returns issues without the specified issue_type' do
+ expect(resolve_issues(not: { types: ['issue'] })).to contain_exactly(issue1)
+ end
+
context 'when filtering by negated author' do
let_it_be(:issue_by_reporter) { create(:issue, author: reporter, project: project, state: :opened) }
@@ -304,7 +381,7 @@ RSpec.describe Resolvers::IssuesResolver do
let_it_be(:relative_issue4) { create(:issue, project: project, relative_position: nil) }
it 'sorts issues ascending' do
- expect(resolve_issues(sort: :relative_position_asc).to_a).to eq [relative_issue3, relative_issue1, relative_issue4, relative_issue2]
+ expect(resolve_issues(sort: :relative_position_asc).to_a).to eq [relative_issue3, relative_issue1, relative_issue2, relative_issue4]
end
end
@@ -485,26 +562,72 @@ RSpec.describe Resolvers::IssuesResolver do
end
context "with a group" do
+ let(:obj) { group }
+
before do
group.add_developer(current_user)
end
describe '#resolve' do
it 'finds all group issues' do
- result = resolve(described_class, obj: group, ctx: { current_user: current_user })
+ expect(resolve_issues).to contain_exactly(issue1, issue2, issue3)
+ end
+
+ it 'returns issues without the specified issue_type' do
+ expect(resolve_issues({ not: { types: ['issue'] } })).to contain_exactly(issue1)
+ end
+
+ context "confidential issues" do
+ include_context 'filtering for confidential issues'
+
+ context "when user is allowed to view confidential issues" do
+ it 'returns all viewable issues by default' do
+ expect(resolve_issues).to contain_exactly(issue1, issue2, issue3, confidential_issue1, confidential_issue2)
+ end
+
+ context 'filtering for confidential issues' do
+ it 'returns only the non-confidential issues for the group when filter is set to false' do
+ expect(resolve_issues({ confidential: false })).to contain_exactly(issue1, issue2, issue3)
+ end
- expect(result).to contain_exactly(issue1, issue2, issue3)
+ it "returns only the confidential issues for the group when filter is set to true" do
+ expect(resolve_issues({ confidential: true })).to contain_exactly(confidential_issue1, confidential_issue2)
+ end
+ end
+ end
+
+ context "when user is not allowed to see confidential issues" do
+ before do
+ group.add_guest(current_user)
+ end
+
+ it 'returns all viewable issues by default' do
+ expect(resolve_issues).to contain_exactly(issue1, issue2, issue3)
+ end
+
+ context 'filtering for confidential issues' do
+ it 'does not return the confidential issues when filter is set to false' do
+ expect(resolve_issues({ confidential: false })).to contain_exactly(issue1, issue2, issue3)
+ end
+
+ it 'does not return the confidential issues when filter is set to true' do
+ expect(resolve_issues({ confidential: true })).to be_empty
+ end
+ end
+ end
end
end
end
context "when passing a non existent, batch loaded project" do
- let(:project) do
+ let!(:project) do
BatchLoader::GraphQL.for("non-existent-path").batch do |_fake_paths, loader, _|
loader.call("non-existent-path", nil)
end
end
+ let(:obj) { project }
+
it "returns nil without breaking" do
expect(resolve_issues(iids: ["don't", "break"])).to be_empty
end
@@ -525,6 +648,6 @@ RSpec.describe Resolvers::IssuesResolver do
end
def resolve_issues(args = {}, context = { current_user: current_user })
- resolve(described_class, obj: project, args: args, ctx: context)
+ resolve(described_class, obj: obj, args: args, ctx: context)
end
end
diff --git a/spec/graphql/resolvers/kas/agent_configurations_resolver_spec.rb b/spec/graphql/resolvers/kas/agent_configurations_resolver_spec.rb
new file mode 100644
index 00000000000..bdb1ced46ae
--- /dev/null
+++ b/spec/graphql/resolvers/kas/agent_configurations_resolver_spec.rb
@@ -0,0 +1,48 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Resolvers::Kas::AgentConfigurationsResolver do
+ include GraphqlHelpers
+
+ it { expect(described_class.type).to eq(Types::Kas::AgentConfigurationType) }
+ it { expect(described_class.null).to be_truthy }
+ it { expect(described_class.field_options).to include(calls_gitaly: true) }
+
+ describe '#resolve' do
+ let_it_be(:project) { create(:project) }
+
+ let(:user) { create(:user, maintainer_projects: [project]) }
+ let(:ctx) { Hash(current_user: user) }
+
+ let(:agent1) { double }
+ let(:agent2) { double }
+ let(:kas_client) { instance_double(Gitlab::Kas::Client, list_agent_config_files: [agent1, agent2]) }
+
+ subject { resolve(described_class, obj: project, ctx: ctx) }
+
+ before do
+ allow(Gitlab::Kas::Client).to receive(:new).and_return(kas_client)
+ end
+
+ it 'returns agents configured for the project' do
+ expect(subject).to contain_exactly(agent1, agent2)
+ end
+
+ context 'an error is returned from the KAS client' do
+ before do
+ allow(kas_client).to receive(:list_agent_config_files).and_raise(GRPC::DeadlineExceeded)
+ end
+
+ it 'raises a graphql error' do
+ expect { subject }.to raise_error(Gitlab::Graphql::Errors::ResourceNotAvailable, 'GRPC::DeadlineExceeded')
+ end
+ end
+
+ context 'user does not have permission' do
+ let(:user) { create(:user) }
+
+ it { is_expected.to be_empty }
+ end
+ end
+end
diff --git a/spec/graphql/resolvers/kas/agent_connections_resolver_spec.rb b/spec/graphql/resolvers/kas/agent_connections_resolver_spec.rb
new file mode 100644
index 00000000000..fe6509bcb3c
--- /dev/null
+++ b/spec/graphql/resolvers/kas/agent_connections_resolver_spec.rb
@@ -0,0 +1,66 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Resolvers::Kas::AgentConnectionsResolver do
+ include GraphqlHelpers
+
+ it { expect(described_class.type).to eq(Types::Kas::AgentConnectionType) }
+ it { expect(described_class.null).to be_truthy }
+
+ describe '#resolve' do
+ let_it_be(:project) { create(:project) }
+ let_it_be(:agent1) { create(:cluster_agent, project: project) }
+ let_it_be(:agent2) { create(:cluster_agent, project: project) }
+
+ let(:user) { create(:user, maintainer_projects: [project]) }
+ let(:ctx) { Hash(current_user: user) }
+
+ let(:connection1) { double(agent_id: agent1.id) }
+ let(:connection2) { double(agent_id: agent1.id) }
+ let(:connection3) { double(agent_id: agent2.id) }
+ let(:connected_agents) { [connection1, connection2, connection3] }
+ let(:kas_client) { instance_double(Gitlab::Kas::Client, get_connected_agents: connected_agents) }
+
+ subject do
+ batch_sync do
+ resolve(described_class, obj: agent1, ctx: ctx)
+ end
+ end
+
+ before do
+ allow(Gitlab::Kas::Client).to receive(:new).and_return(kas_client)
+ end
+
+ it 'returns active connections for the agent' do
+ expect(subject).to contain_exactly(connection1, connection2)
+ end
+
+ it 'queries KAS once when multiple agents are requested' do
+ expect(kas_client).to receive(:get_connected_agents).once
+
+ response = batch_sync do
+ resolve(described_class, obj: agent1, ctx: ctx)
+ resolve(described_class, obj: agent2, ctx: ctx)
+ end
+
+ expect(response).to contain_exactly(connection3)
+ end
+
+ context 'an error is returned from the KAS client' do
+ before do
+ allow(kas_client).to receive(:get_connected_agents).and_raise(GRPC::DeadlineExceeded)
+ end
+
+ it 'raises a graphql error' do
+ expect { subject }.to raise_error(Gitlab::Graphql::Errors::ResourceNotAvailable, 'GRPC::DeadlineExceeded')
+ end
+ end
+
+ context 'user does not have permission' do
+ let(:user) { create(:user) }
+
+ it { is_expected.to be_empty }
+ end
+ end
+end
diff --git a/spec/graphql/resolvers/project_pipelines_resolver_spec.rb b/spec/graphql/resolvers/project_pipelines_resolver_spec.rb
index c7c00f54c0c..51a63e66b93 100644
--- a/spec/graphql/resolvers/project_pipelines_resolver_spec.rb
+++ b/spec/graphql/resolvers/project_pipelines_resolver_spec.rb
@@ -11,15 +11,23 @@ RSpec.describe Resolvers::ProjectPipelinesResolver do
let(:current_user) { create(:user) }
- before do
- project.add_developer(current_user)
+ context 'when the user does have access' do
+ before do
+ project.add_developer(current_user)
+ end
+
+ it 'resolves only MRs for the passed merge request' do
+ expect(resolve_pipelines).to contain_exactly(pipeline)
+ end
end
- def resolve_pipelines
- resolve(described_class, obj: project, ctx: { current_user: current_user })
+ context 'when the user does not have access' do
+ it 'does not return pipeline data' do
+ expect(resolve_pipelines).to be_empty
+ end
end
- it 'resolves only MRs for the passed merge request' do
- expect(resolve_pipelines).to contain_exactly(pipeline)
+ def resolve_pipelines
+ resolve(described_class, obj: project, ctx: { current_user: current_user })
end
end
diff --git a/spec/graphql/types/base_field_spec.rb b/spec/graphql/types/base_field_spec.rb
index 82efd618e38..31d07f701e8 100644
--- a/spec/graphql/types/base_field_spec.rb
+++ b/spec/graphql/types/base_field_spec.rb
@@ -154,6 +154,17 @@ RSpec.describe Types::BaseField do
end
end
+ describe '#resolve' do
+ context "late_extensions is given" do
+ it 'registers the late extensions after the regular extensions' do
+ extension_class = Class.new(GraphQL::Schema::Field::ConnectionExtension)
+ field = described_class.new(name: 'test', type: GraphQL::Types::String.connection_type, null: true, late_extensions: [extension_class])
+
+ expect(field.extensions.last.class).to be(extension_class)
+ end
+ end
+ end
+
describe '#description' do
context 'feature flag given' do
let(:field) { described_class.new(name: 'test', type: GraphQL::Types::String, feature_flag: flag, null: false, description: 'Test description.') }
diff --git a/spec/graphql/types/board_list_type_spec.rb b/spec/graphql/types/board_list_type_spec.rb
index 7976936fc1f..d78d87c57bd 100644
--- a/spec/graphql/types/board_list_type_spec.rb
+++ b/spec/graphql/types/board_list_type_spec.rb
@@ -3,11 +3,36 @@
require 'spec_helper'
RSpec.describe GitlabSchema.types['BoardList'] do
+ include GraphqlHelpers
+ include Gitlab::Graphql::Laziness
+
specify { expect(described_class.graphql_name).to eq('BoardList') }
it 'has specific fields' do
- expected_fields = %w[id list_type position label issues_count issues]
+ expected_fields = %w[id title list_type position label issues_count issues]
expect(described_class).to include_graphql_fields(*expected_fields)
end
+
+ describe 'issues field' do
+ subject { described_class.fields['issues'] }
+
+ it 'has a correct extension' do
+ is_expected.to have_graphql_extension(Gitlab::Graphql::Board::IssuesConnectionExtension)
+ end
+ end
+
+ describe 'title' do
+ subject(:field) { described_class.fields['title'] }
+
+ it 'preloads the label association' do
+ a, b, c = create_list(:list, 3).map { _1.class.find(_1.id) }
+
+ baseline = ActiveRecord::QueryRecorder.new { force(resolve_field(field, a)) }
+
+ expect do
+ [resolve_field(field, b), resolve_field(field, c)].each { force _1 }
+ end.not_to exceed_query_limit(baseline)
+ end
+ end
end
diff --git a/spec/graphql/types/ci/pipeline_type_spec.rb b/spec/graphql/types/ci/pipeline_type_spec.rb
index 9ba4252bcd5..8c849114cf6 100644
--- a/spec/graphql/types/ci/pipeline_type_spec.rb
+++ b/spec/graphql/types/ci/pipeline_type_spec.rb
@@ -18,7 +18,7 @@ RSpec.describe Types::Ci::PipelineType do
]
if Gitlab.ee?
- expected_fields += %w[security_report_summary security_report_findings code_quality_reports]
+ expected_fields += %w[security_report_summary security_report_findings code_quality_reports dast_profile]
end
expect(described_class).to have_graphql_fields(*expected_fields)
diff --git a/spec/graphql/types/ci/runner_type_spec.rb b/spec/graphql/types/ci/runner_type_spec.rb
index cff4c459d79..cf8650a4a03 100644
--- a/spec/graphql/types/ci/runner_type_spec.rb
+++ b/spec/graphql/types/ci/runner_type_spec.rb
@@ -11,7 +11,7 @@ RSpec.describe GitlabSchema.types['CiRunner'] do
expected_fields = %w[
id description contacted_at maximum_timeout access_level active status
version short_sha revision locked run_untagged ip_address runner_type tag_list
- project_count job_count
+ project_count job_count admin_url user_permissions
]
expect(described_class).to include_graphql_fields(*expected_fields)
diff --git a/spec/graphql/types/clusters/agent_token_type_spec.rb b/spec/graphql/types/clusters/agent_token_type_spec.rb
new file mode 100644
index 00000000000..c872d201fd9
--- /dev/null
+++ b/spec/graphql/types/clusters/agent_token_type_spec.rb
@@ -0,0 +1,13 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe GitlabSchema.types['ClusterAgentToken'] do
+ let(:fields) { %i[cluster_agent created_at created_by_user description id last_used_at name] }
+
+ it { expect(described_class.graphql_name).to eq('ClusterAgentToken') }
+
+ it { expect(described_class).to require_graphql_authorizations(:admin_cluster) }
+
+ it { expect(described_class).to have_graphql_fields(fields) }
+end
diff --git a/spec/graphql/types/clusters/agent_type_spec.rb b/spec/graphql/types/clusters/agent_type_spec.rb
new file mode 100644
index 00000000000..4b4b601b230
--- /dev/null
+++ b/spec/graphql/types/clusters/agent_type_spec.rb
@@ -0,0 +1,13 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe GitlabSchema.types['ClusterAgent'] do
+ let(:fields) { %i[created_at created_by_user id name project updated_at tokens web_path connections] }
+
+ it { expect(described_class.graphql_name).to eq('ClusterAgent') }
+
+ it { expect(described_class).to require_graphql_authorizations(:admin_cluster) }
+
+ it { expect(described_class).to have_graphql_fields(fields) }
+end
diff --git a/spec/graphql/types/container_expiration_policy_older_than_enum_spec.rb b/spec/graphql/types/container_expiration_policy_older_than_enum_spec.rb
index 72ab605f2e6..1989b87a28f 100644
--- a/spec/graphql/types/container_expiration_policy_older_than_enum_spec.rb
+++ b/spec/graphql/types/container_expiration_policy_older_than_enum_spec.rb
@@ -3,7 +3,7 @@
require 'spec_helper'
RSpec.describe GitlabSchema.types['ContainerExpirationPolicyOlderThanEnum'] do
- let_it_be(:expected_values) { %w[SEVEN_DAYS FOURTEEN_DAYS THIRTY_DAYS NINETY_DAYS] }
+ let_it_be(:expected_values) { %w[SEVEN_DAYS FOURTEEN_DAYS THIRTY_DAYS SIXTY_DAYS NINETY_DAYS] }
it_behaves_like 'exposing container expiration policy option', :older_than
end
diff --git a/spec/graphql/types/error_tracking/sentry_detailed_error_type_spec.rb b/spec/graphql/types/error_tracking/sentry_detailed_error_type_spec.rb
index 8723c212486..09746750adc 100644
--- a/spec/graphql/types/error_tracking/sentry_detailed_error_type_spec.rb
+++ b/spec/graphql/types/error_tracking/sentry_detailed_error_type_spec.rb
@@ -10,6 +10,7 @@ RSpec.describe GitlabSchema.types['SentryDetailedError'] do
it 'exposes the expected fields' do
expected_fields = %i[
id
+ integrated
sentryId
title
type
diff --git a/spec/graphql/types/issue_type_spec.rb b/spec/graphql/types/issue_type_spec.rb
index 559f347810b..c0a0fdf3b0b 100644
--- a/spec/graphql/types/issue_type_spec.rb
+++ b/spec/graphql/types/issue_type_spec.rb
@@ -18,7 +18,7 @@ RSpec.describe GitlabSchema.types['Issue'] do
confidential hidden discussion_locked upvotes downvotes merge_requests_count user_notes_count user_discussions_count web_path web_url relative_position
emails_disabled subscribed time_estimate total_time_spent human_time_estimate human_total_time_spent closed_at created_at updated_at task_completion_status
design_collection alert_management_alert severity current_user_todos moved moved_to
- create_note_email timelogs project_id]
+ create_note_email timelogs project_id customer_relations_contacts]
fields.each do |field_name|
expect(described_class).to have_graphql_field(field_name)
diff --git a/spec/graphql/types/kas/agent_configuration_type_spec.rb b/spec/graphql/types/kas/agent_configuration_type_spec.rb
new file mode 100644
index 00000000000..e6cccfa56d2
--- /dev/null
+++ b/spec/graphql/types/kas/agent_configuration_type_spec.rb
@@ -0,0 +1,11 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe GitlabSchema.types['AgentConfiguration'] do
+ let(:fields) { %i[agent_name] }
+
+ it { expect(described_class.graphql_name).to eq('AgentConfiguration') }
+ it { expect(described_class.description).to eq('Configuration details for an Agent') }
+ it { expect(described_class).to have_graphql_fields(fields) }
+end
diff --git a/spec/graphql/types/kas/agent_connection_type_spec.rb b/spec/graphql/types/kas/agent_connection_type_spec.rb
new file mode 100644
index 00000000000..0990d02af11
--- /dev/null
+++ b/spec/graphql/types/kas/agent_connection_type_spec.rb
@@ -0,0 +1,22 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Types::Kas::AgentConnectionType do
+ include GraphqlHelpers
+
+ let(:fields) { %i[connected_at connection_id metadata] }
+
+ it { expect(described_class.graphql_name).to eq('ConnectedAgent') }
+ it { expect(described_class.description).to eq('Connection details for an Agent') }
+ it { expect(described_class).to have_graphql_fields(fields) }
+
+ describe '#connected_at' do
+ let(:connected_at) { double(Google::Protobuf::Timestamp, seconds: 123456, nanos: 654321) }
+ let(:object) { double(Gitlab::Agent::AgentTracker::ConnectedAgentInfo, connected_at: connected_at) }
+
+ it 'converts the seconds value to a timestamp' do
+ expect(resolve_field(:connected_at, object)).to eq(Time.at(connected_at.seconds))
+ end
+ end
+end
diff --git a/spec/graphql/types/kas/agent_metadata_type_spec.rb b/spec/graphql/types/kas/agent_metadata_type_spec.rb
new file mode 100644
index 00000000000..ebc12ebb72a
--- /dev/null
+++ b/spec/graphql/types/kas/agent_metadata_type_spec.rb
@@ -0,0 +1,13 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Types::Kas::AgentMetadataType do
+ include GraphqlHelpers
+
+ let(:fields) { %i[version commit pod_namespace pod_name] }
+
+ it { expect(described_class.graphql_name).to eq('AgentMetadata') }
+ it { expect(described_class.description).to eq('Information about a connected Agent') }
+ it { expect(described_class).to have_graphql_fields(fields) }
+end
diff --git a/spec/graphql/types/packages/nuget/metadatum_type_spec.rb b/spec/graphql/types/packages/nuget/metadatum_type_spec.rb
index e5baa7522e4..94a1dbaee43 100644
--- a/spec/graphql/types/packages/nuget/metadatum_type_spec.rb
+++ b/spec/graphql/types/packages/nuget/metadatum_type_spec.rb
@@ -10,4 +10,10 @@ RSpec.describe GitlabSchema.types['NugetMetadata'] do
expect(described_class).to include_graphql_fields(*expected_fields)
end
+
+ %w[projectUrl licenseUrl iconUrl].each do |optional_field|
+ it "#{optional_field} can be null" do
+ expect(described_class.fields[optional_field].type).to be_nullable
+ end
+ end
end
diff --git a/spec/graphql/types/packages/package_type_spec.rb b/spec/graphql/types/packages/package_type_spec.rb
index 07573044abb..3267c765dc7 100644
--- a/spec/graphql/types/packages/package_type_spec.rb
+++ b/spec/graphql/types/packages/package_type_spec.rb
@@ -9,7 +9,7 @@ RSpec.describe GitlabSchema.types['Package'] do
created_at updated_at
project
tags pipelines metadata versions
- status
+ status can_destroy
]
expect(described_class).to include_graphql_fields(*expected_fields)
diff --git a/spec/graphql/types/permission_types/ci/runner_spec.rb b/spec/graphql/types/permission_types/ci/runner_spec.rb
new file mode 100644
index 00000000000..e5fbbb346e4
--- /dev/null
+++ b/spec/graphql/types/permission_types/ci/runner_spec.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Types::PermissionTypes::Ci::Runner do
+ it do
+ expected_permissions = [
+ :read_runner, :update_runner, :delete_runner
+ ]
+
+ expected_permissions.each do |permission|
+ expect(described_class).to have_graphql_field(permission)
+ end
+ end
+end
diff --git a/spec/graphql/types/project_type_spec.rb b/spec/graphql/types/project_type_spec.rb
index d825bd7ebd4..45a718683be 100644
--- a/spec/graphql/types/project_type_spec.rb
+++ b/spec/graphql/types/project_type_spec.rb
@@ -33,6 +33,7 @@ RSpec.describe GitlabSchema.types['Project'] do
issue_status_counts terraform_states alert_management_integrations
container_repositories container_repositories_count
pipeline_analytics squash_read_only sast_ci_configuration
+ cluster_agent cluster_agents agent_configurations
ci_template timelogs
]
@@ -186,7 +187,7 @@ RSpec.describe GitlabSchema.types['Project'] do
expect(analyzer['enabled']).to eq(true)
end
- context "with guest user" do
+ context 'with guest user' do
before do
project.add_guest(user)
end
@@ -194,7 +195,7 @@ RSpec.describe GitlabSchema.types['Project'] do
context 'when project is private' do
let(:project) { create(:project, :private, :repository) }
- it "returns no configuration" do
+ it 'returns no configuration' do
secure_analyzers_prefix = subject.dig('data', 'project', 'sastCiConfiguration')
expect(secure_analyzers_prefix).to be_nil
end
@@ -214,7 +215,7 @@ RSpec.describe GitlabSchema.types['Project'] do
end
end
- context "with non-member user" do
+ context 'with non-member user', :sidekiq_inline do
before do
project.team.truncate
end
@@ -222,7 +223,7 @@ RSpec.describe GitlabSchema.types['Project'] do
context 'when project is private' do
let(:project) { create(:project, :private, :repository) }
- it "returns no configuration" do
+ it 'returns no configuration' do
secure_analyzers_prefix = subject.dig('data', 'project', 'sastCiConfiguration')
expect(secure_analyzers_prefix).to be_nil
end
@@ -240,7 +241,7 @@ RSpec.describe GitlabSchema.types['Project'] do
end
context 'when repository is accessible only by team members' do
- it "returns no configuration" do
+ it 'returns no configuration' do
project.project_feature.update!(
merge_requests_access_level: ProjectFeature::DISABLED,
builds_access_level: ProjectFeature::DISABLED,
@@ -458,4 +459,137 @@ RSpec.describe GitlabSchema.types['Project'] do
it { is_expected.to have_graphql_type(Types::Ci::JobTokenScopeType) }
it { is_expected.to have_graphql_resolver(Resolvers::Ci::JobTokenScopeResolver) }
end
+
+ describe 'agent_configurations' do
+ let_it_be(:project) { create(:project) }
+ let_it_be(:user) { create(:user) }
+ let_it_be(:query) do
+ %(
+ query {
+ project(fullPath: "#{project.full_path}") {
+ agentConfigurations {
+ nodes {
+ agentName
+ }
+ }
+ }
+ }
+ )
+ end
+
+ let(:agent_name) { 'example-agent-name' }
+ let(:kas_client) { instance_double(Gitlab::Kas::Client, list_agent_config_files: [double(agent_name: agent_name)]) }
+
+ subject { GitlabSchema.execute(query, context: { current_user: user }).as_json }
+
+ before do
+ project.add_maintainer(user)
+ allow(Gitlab::Kas::Client).to receive(:new).and_return(kas_client)
+ end
+
+ it 'returns configured agents' do
+ agents = subject.dig('data', 'project', 'agentConfigurations', 'nodes')
+
+ expect(agents.count).to eq(1)
+ expect(agents.first['agentName']).to eq(agent_name)
+ end
+ end
+
+ describe 'cluster_agents' do
+ let_it_be(:project) { create(:project) }
+ let_it_be(:user) { create(:user) }
+ let_it_be(:cluster_agent) { create(:cluster_agent, project: project, name: 'agent-name') }
+ let_it_be(:query) do
+ %(
+ query {
+ project(fullPath: "#{project.full_path}") {
+ clusterAgents {
+ count
+ nodes {
+ id
+ name
+ createdAt
+ updatedAt
+
+ project {
+ id
+ }
+ }
+ }
+ }
+ }
+ )
+ end
+
+ subject { GitlabSchema.execute(query, context: { current_user: user }).as_json }
+
+ before do
+ project.add_maintainer(user)
+ end
+
+ it 'returns associated cluster agents' do
+ agents = subject.dig('data', 'project', 'clusterAgents', 'nodes')
+
+ expect(agents.count).to be(1)
+ expect(agents.first['id']).to eq(cluster_agent.to_global_id.to_s)
+ expect(agents.first['name']).to eq('agent-name')
+ expect(agents.first['createdAt']).to be_present
+ expect(agents.first['updatedAt']).to be_present
+ expect(agents.first['project']['id']).to eq(project.to_global_id.to_s)
+ end
+
+ it 'returns count of cluster agents' do
+ count = subject.dig('data', 'project', 'clusterAgents', 'count')
+
+ expect(count).to be(project.cluster_agents.size)
+ end
+ end
+
+ describe 'cluster_agent' do
+ let_it_be(:project) { create(:project) }
+ let_it_be(:user) { create(:user) }
+ let_it_be(:cluster_agent) { create(:cluster_agent, project: project, name: 'agent-name') }
+ let_it_be(:agent_token) { create(:cluster_agent_token, agent: cluster_agent) }
+ let_it_be(:query) do
+ %(
+ query {
+ project(fullPath: "#{project.full_path}") {
+ clusterAgent(name: "#{cluster_agent.name}") {
+ id
+
+ tokens {
+ count
+ nodes {
+ id
+ }
+ }
+ }
+ }
+ }
+ )
+ end
+
+ subject { GitlabSchema.execute(query, context: { current_user: user }).as_json }
+
+ before do
+ project.add_maintainer(user)
+ end
+
+ it 'returns associated cluster agents' do
+ agent = subject.dig('data', 'project', 'clusterAgent')
+ tokens = agent.dig('tokens', 'nodes')
+
+ expect(agent['id']).to eq(cluster_agent.to_global_id.to_s)
+
+ expect(tokens.count).to be(1)
+ expect(tokens.first['id']).to eq(agent_token.to_global_id.to_s)
+ end
+
+ it 'returns count of agent tokens' do
+ agent = subject.dig('data', 'project', 'clusterAgent')
+ count = agent.dig('tokens', 'count')
+
+ expect(cluster_agent.agent_tokens.size).to be(count)
+ end
+ end
end
diff --git a/spec/graphql/types/query_type_spec.rb b/spec/graphql/types/query_type_spec.rb
index 6a43867f1fe..14ef03a64f9 100644
--- a/spec/graphql/types/query_type_spec.rb
+++ b/spec/graphql/types/query_type_spec.rb
@@ -27,6 +27,7 @@ RSpec.describe GitlabSchema.types['Query'] do
runner
runners
timelogs
+ board_list
]
expect(described_class).to have_graphql_fields(*expected_fields).at_least
@@ -136,4 +137,14 @@ RSpec.describe GitlabSchema.types['Query'] do
is_expected.to have_graphql_resolver(Resolvers::TimelogResolver)
end
end
+
+ describe 'boardList field' do
+ subject { described_class.fields['boardList'] }
+
+ it 'finds a board list by its gid' do
+ is_expected.to have_graphql_arguments(:id, :issue_filters)
+ is_expected.to have_graphql_type(Types::BoardListType)
+ is_expected.to have_graphql_resolver(Resolvers::BoardListResolver)
+ end
+ end
end
diff --git a/spec/helpers/application_settings_helper_spec.rb b/spec/helpers/application_settings_helper_spec.rb
index ef5f6931d02..3c2ac954fe5 100644
--- a/spec/helpers/application_settings_helper_spec.rb
+++ b/spec/helpers/application_settings_helper_spec.rb
@@ -158,26 +158,6 @@ RSpec.describe ApplicationSettingsHelper do
end
end
- describe '.show_documentation_base_url_field?' do
- subject { helper.show_documentation_base_url_field? }
-
- before do
- stub_feature_flags(help_page_documentation_redirect: feature_flag)
- end
-
- context 'when feature flag is enabled' do
- let(:feature_flag) { true }
-
- it { is_expected.to eq(true) }
- end
-
- context 'when feature flag is disabled' do
- let(:feature_flag) { false }
-
- it { is_expected.to eq(false) }
- end
- end
-
describe '.valid_runner_registrars' do
subject { helper.valid_runner_registrars }
@@ -271,18 +251,6 @@ RSpec.describe ApplicationSettingsHelper do
expect(pending_user_count).to eq 1
end
end
-
- context 'when the new_user_signups_cap is not present' do
- let(:user_cap) { nil }
-
- it { is_expected.to eq 0 }
-
- it 'does not query users unnecessarily' do
- expect(User).not_to receive(:blocked_pending_approval)
-
- pending_user_count
- end
- end
end
describe '#sidekiq_job_limiter_modes_for_select' do
diff --git a/spec/helpers/avatars_helper_spec.rb b/spec/helpers/avatars_helper_spec.rb
index 047a6ca0b7d..7190f2fcd4a 100644
--- a/spec/helpers/avatars_helper_spec.rb
+++ b/spec/helpers/avatars_helper_spec.rb
@@ -7,7 +7,7 @@ RSpec.describe AvatarsHelper do
let_it_be(:user) { create(:user) }
- describe '#project_icon & #group_icon' do
+ describe '#project_icon, #group_icon, #topic_icon' do
shared_examples 'resource with a default avatar' do |source_type|
it 'returns a default avatar div' do
expect(public_send("#{source_type}_icon", *helper_args))
@@ -71,6 +71,18 @@ RSpec.describe AvatarsHelper do
let(:helper_args) { [resource] }
end
end
+
+ context 'when providing a topic' do
+ it_behaves_like 'resource with a default avatar', 'topic' do
+ let(:resource) { create(:topic, name: 'foo') }
+ let(:helper_args) { [resource] }
+ end
+
+ it_behaves_like 'resource with a custom avatar', 'topic' do
+ let(:resource) { create(:topic, avatar: File.open(uploaded_image_temp_path)) }
+ let(:helper_args) { [resource] }
+ end
+ end
end
describe '#avatar_icon_for' do
diff --git a/spec/helpers/ci/runners_helper_spec.rb b/spec/helpers/ci/runners_helper_spec.rb
index 0f15f8be0a9..49ea2ac8d3b 100644
--- a/spec/helpers/ci/runners_helper_spec.rb
+++ b/spec/helpers/ci/runners_helper_spec.rb
@@ -83,7 +83,7 @@ RSpec.describe Ci::RunnersHelper do
data = group_shared_runners_settings_data(group)
expect(data[:update_path]).to eq("/api/v4/groups/#{group.id}")
- expect(data[:shared_runners_availability]).to eq('disabled_and_unoverridable')
+ expect(data[:shared_runners_availability]).to eq(Namespace::SR_DISABLED_AND_UNOVERRIDABLE)
expect(data[:parent_shared_runners_availability]).to eq('enabled')
end
end
@@ -137,16 +137,15 @@ RSpec.describe Ci::RunnersHelper do
using RSpec::Parameterized::TableSyntax
where(:shared_runners_setting, :is_disabled_and_unoverridable) do
- 'enabled' | "false"
- 'disabled_with_override' | "false"
- 'disabled_and_unoverridable' | "true"
+ :shared_runners_enabled | "false"
+ :disabled_with_override | "false"
+ :disabled_and_unoverridable | "true"
end
with_them do
it 'returns the override runner status for project with group' do
- group = create(:group)
- project = create(:project, group: group)
- allow(group).to receive(:shared_runners_setting).and_return(shared_runners_setting)
+ group = create(:group, shared_runners_setting)
+ project = create(:project, group: group, shared_runners_enabled: false)
data = helper.toggle_shared_runners_settings_data(project)
expect(data[:is_disabled_and_unoverridable]).to eq(is_disabled_and_unoverridable)
diff --git a/spec/helpers/container_expiration_policies_helper_spec.rb b/spec/helpers/container_expiration_policies_helper_spec.rb
index 7ad3804e3a9..acb6b017d2c 100644
--- a/spec/helpers/container_expiration_policies_helper_spec.rb
+++ b/spec/helpers/container_expiration_policies_helper_spec.rb
@@ -40,6 +40,7 @@ RSpec.describe ContainerExpirationPoliciesHelper do
{ key: '7d', label: '7 days until tags are automatically removed' },
{ key: '14d', label: '14 days until tags are automatically removed' },
{ key: '30d', label: '30 days until tags are automatically removed' },
+ { key: '60d', label: '60 days until tags are automatically removed' },
{ key: '90d', label: '90 days until tags are automatically removed', default: true }
]
diff --git a/spec/helpers/feature_flags_helper_spec.rb b/spec/helpers/feature_flags_helper_spec.rb
index 9a080736595..228459277ca 100644
--- a/spec/helpers/feature_flags_helper_spec.rb
+++ b/spec/helpers/feature_flags_helper_spec.rb
@@ -3,10 +3,20 @@
require 'spec_helper'
RSpec.describe FeatureFlagsHelper do
+ include Devise::Test::ControllerHelpers
+
let_it_be(:project) { create(:project) }
let_it_be(:feature_flag) { create(:operations_feature_flag, project: project) }
let_it_be(:user) { create(:user) }
+ before do
+ allow(helper).to receive(:can?).and_return(true)
+ allow(helper).to receive(:current_user).and_return(user)
+
+ self.instance_variable_set(:@project, project)
+ self.instance_variable_set(:@feature_flag, feature_flag)
+ end
+
describe '#unleash_api_url' do
subject { helper.unleash_api_url(project) }
@@ -18,4 +28,17 @@ RSpec.describe FeatureFlagsHelper do
it { is_expected.not_to be_empty }
end
+
+ describe '#edit_feature_flag_data' do
+ subject { helper.edit_feature_flag_data }
+
+ it 'contains all the data needed to edit feature flags' do
+ is_expected.to include(endpoint: "/#{project.full_path}/-/feature_flags/#{feature_flag.iid}",
+ project_id: project.id,
+ 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")
+ end
+ end
end
diff --git a/spec/helpers/groups_helper_spec.rb b/spec/helpers/groups_helper_spec.rb
index 825d5236b5d..4d647696130 100644
--- a/spec/helpers/groups_helper_spec.rb
+++ b/spec/helpers/groups_helper_spec.rb
@@ -146,7 +146,7 @@ RSpec.describe GroupsHelper do
let(:possible_help_texts) do
{
- default_help: "This setting will be applied to all subgroups unless overridden by a group owner",
+ default_help: "Applied to all subgroups unless overridden by a group owner.",
ancestor_locked_but_you_can_override: %r{This setting is applied on <a .+>.+</a>\. You can override the setting or .+},
ancestor_locked_so_ask_the_owner: /This setting is applied on .+\. To share projects in this group with another group, ask the owner to override the setting or remove the share with group lock from .+/,
ancestor_locked_and_has_been_overridden: /This setting is applied on .+ and has been overridden on this subgroup/
diff --git a/spec/helpers/hooks_helper_spec.rb b/spec/helpers/hooks_helper_spec.rb
index 92e082c4974..3b23d705790 100644
--- a/spec/helpers/hooks_helper_spec.rb
+++ b/spec/helpers/hooks_helper_spec.rb
@@ -6,9 +6,10 @@ RSpec.describe HooksHelper do
let(:project) { create(:project) }
let(:project_hook) { create(:project_hook, project: project) }
let(:system_hook) { create(:system_hook) }
- let(:trigger) { 'push_events' }
describe '#link_to_test_hook' do
+ let(:trigger) { 'push_events' }
+
it 'returns project namespaced link' do
expect(helper.link_to_test_hook(project_hook, trigger))
.to include("href=\"#{test_project_hook_path(project, project_hook, trigger: trigger)}\"")
@@ -19,4 +20,24 @@ RSpec.describe HooksHelper do
.to include("href=\"#{test_admin_hook_path(system_hook, trigger: trigger)}\"")
end
end
+
+ describe '#hook_log_path' do
+ context 'with a project hook' do
+ let(:web_hook_log) { create(:web_hook_log, web_hook: project_hook) }
+
+ it 'returns project-namespaced link' do
+ expect(helper.hook_log_path(project_hook, web_hook_log))
+ .to eq(web_hook_log.present.details_path)
+ end
+ end
+
+ context 'with a system hook' do
+ let(:web_hook_log) { create(:web_hook_log, web_hook: system_hook) }
+
+ it 'returns admin-namespaced link' do
+ expect(helper.hook_log_path(system_hook, web_hook_log))
+ .to eq(admin_hook_hook_log_path(system_hook, web_hook_log))
+ end
+ end
+ end
end
diff --git a/spec/helpers/issuables_helper_spec.rb b/spec/helpers/issuables_helper_spec.rb
index 3eb3c73cfcc..30049745433 100644
--- a/spec/helpers/issuables_helper_spec.rb
+++ b/spec/helpers/issuables_helper_spec.rb
@@ -133,13 +133,13 @@ RSpec.describe IssuablesHelper do
it 'returns navigation with badges' do
expect(helper.issuables_state_counter_text(:issues, :opened, true))
- .to eq('<span>Open</span> <span class="badge badge-muted badge-pill gl-badge gl-tab-counter-badge sm">42</span>')
+ .to eq('<span>Open</span> <span class="badge badge-muted badge-pill gl-badge gl-tab-counter-badge sm gl-display-none gl-sm-display-inline-flex">42</span>')
expect(helper.issuables_state_counter_text(:issues, :closed, true))
- .to eq('<span>Closed</span> <span class="badge badge-muted badge-pill gl-badge gl-tab-counter-badge sm">42</span>')
+ .to eq('<span>Closed</span> <span class="badge badge-muted badge-pill gl-badge gl-tab-counter-badge sm gl-display-none gl-sm-display-inline-flex">42</span>')
expect(helper.issuables_state_counter_text(:merge_requests, :merged, true))
- .to eq('<span>Merged</span> <span class="badge badge-muted badge-pill gl-badge gl-tab-counter-badge sm">42</span>')
+ .to eq('<span>Merged</span> <span class="badge badge-muted badge-pill gl-badge gl-tab-counter-badge sm gl-display-none gl-sm-display-inline-flex">42</span>')
expect(helper.issuables_state_counter_text(:merge_requests, :all, true))
- .to eq('<span>All</span> <span class="badge badge-muted badge-pill gl-badge gl-tab-counter-badge sm">42</span>')
+ .to eq('<span>All</span> <span class="badge badge-muted badge-pill gl-badge gl-tab-counter-badge sm gl-display-none gl-sm-display-inline-flex">42</span>')
end
end
@@ -176,7 +176,7 @@ RSpec.describe IssuablesHelper do
it 'returns complete count' do
expect(helper.issuables_state_counter_text(:issues, :opened, true))
- .to eq('<span>Open</span> <span class="badge badge-muted badge-pill gl-badge gl-tab-counter-badge sm">1,100</span>')
+ .to eq('<span>Open</span> <span class="badge badge-muted badge-pill gl-badge gl-tab-counter-badge sm gl-display-none gl-sm-display-inline-flex">1,100</span>')
end
end
@@ -187,7 +187,7 @@ RSpec.describe IssuablesHelper do
it 'returns truncated count' do
expect(helper.issuables_state_counter_text(:issues, :opened, true))
- .to eq('<span>Open</span> <span class="badge badge-muted badge-pill gl-badge gl-tab-counter-badge sm">1.1k</span>')
+ .to eq('<span>Open</span> <span class="badge badge-muted badge-pill gl-badge gl-tab-counter-badge sm gl-display-none gl-sm-display-inline-flex">1.1k</span>')
end
end
end
diff --git a/spec/helpers/issues_helper_spec.rb b/spec/helpers/issues_helper_spec.rb
index f5f26d306fb..850051c7875 100644
--- a/spec/helpers/issues_helper_spec.rb
+++ b/spec/helpers/issues_helper_spec.rb
@@ -354,6 +354,7 @@ RSpec.describe IssuesHelper do
let(:group) { create(:group) }
let(:current_user) { double.as_null_object }
let(:issues) { [] }
+ let(:projects) { [] }
it 'returns expected result' do
allow(helper).to receive(:current_user).and_return(current_user)
@@ -367,13 +368,14 @@ RSpec.describe IssuesHelper do
empty_state_svg_path: '#',
full_path: group.full_path,
has_any_issues: issues.to_a.any?.to_s,
+ has_any_projects: any_projects?(projects).to_s,
is_signed_in: current_user.present?.to_s,
jira_integration_path: help_page_url('integration/jira/issues', anchor: 'view-jira-issues'),
rss_path: '#',
sign_in_path: new_user_session_path
}
- expect(helper.group_issues_list_data(group, current_user, issues)).to include(expected)
+ expect(helper.group_issues_list_data(group, current_user, issues, projects)).to include(expected)
end
end
diff --git a/spec/helpers/one_trust_helper_spec.rb b/spec/helpers/one_trust_helper_spec.rb
new file mode 100644
index 00000000000..85c38885304
--- /dev/null
+++ b/spec/helpers/one_trust_helper_spec.rb
@@ -0,0 +1,48 @@
+# frozen_string_literal: true
+
+require "spec_helper"
+
+RSpec.describe OneTrustHelper do
+ describe '#one_trust_enabled?' do
+ let(:user) { nil }
+
+ before do
+ stub_config(extra: { one_trust_id: SecureRandom.uuid })
+ allow(helper).to receive(:current_user).and_return(user)
+ end
+
+ subject(:one_trust_enabled?) { helper.one_trust_enabled? }
+
+ context 'with ecomm_instrumentation feature flag disabled' do
+ before do
+ stub_feature_flags(ecomm_instrumentation: false)
+ end
+
+ context 'when id is set and no user is set' do
+ let(:user) { instance_double('User') }
+
+ it { is_expected.to be_falsey }
+ end
+ end
+
+ context 'with ecomm_instrumentation feature flag enabled' do
+ context 'when current user is set' do
+ let(:user) { instance_double('User') }
+
+ it { is_expected.to be_falsey }
+ end
+
+ context 'when no id is set' do
+ before do
+ stub_config(extra: {})
+ end
+
+ it { is_expected.to be_falsey }
+ end
+
+ context 'when id is set and no user is set' do
+ it { is_expected.to be_truthy }
+ end
+ end
+ end
+end
diff --git a/spec/helpers/packages_helper_spec.rb b/spec/helpers/packages_helper_spec.rb
index 06c6cccd488..2af572850da 100644
--- a/spec/helpers/packages_helper_spec.rb
+++ b/spec/helpers/packages_helper_spec.rb
@@ -260,4 +260,34 @@ RSpec.describe PackagesHelper do
end
end
end
+
+ describe '#packages_list_data' do
+ let_it_be(:resource) { project }
+ let_it_be(:type) { 'project' }
+
+ let(:expected_result) do
+ {
+ resource_id: resource.id,
+ full_path: resource.full_path,
+ page_type: type
+ }
+ end
+
+ subject(:result) { helper.packages_list_data(type, resource) }
+
+ context 'at a project level' do
+ it 'populates presenter data' do
+ expect(result).to match(hash_including(expected_result))
+ end
+ end
+
+ context 'at a group level' do
+ let_it_be(:resource) { create(:group) }
+ let_it_be(:type) { 'group' }
+
+ it 'populates presenter data' do
+ expect(result).to match(hash_including(expected_result))
+ end
+ end
+ end
end
diff --git a/spec/helpers/projects/cluster_agents_helper_spec.rb b/spec/helpers/projects/cluster_agents_helper_spec.rb
new file mode 100644
index 00000000000..2935a74586b
--- /dev/null
+++ b/spec/helpers/projects/cluster_agents_helper_spec.rb
@@ -0,0 +1,21 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Projects::ClusterAgentsHelper do
+ describe '#js_cluster_agent_details_data' do
+ let_it_be(:project) { create(:project) }
+
+ let(:agent_name) { 'agent-name' }
+
+ subject { helper.js_cluster_agent_details_data(agent_name, project) }
+
+ it 'returns name' do
+ expect(subject[:agent_name]).to eq(agent_name)
+ end
+
+ it 'returns project path' do
+ expect(subject[:project_path]).to eq(project.full_path)
+ end
+ end
+end
diff --git a/spec/helpers/projects_helper_spec.rb b/spec/helpers/projects_helper_spec.rb
index 85b572d3f68..1100f4a3ad5 100644
--- a/spec/helpers/projects_helper_spec.rb
+++ b/spec/helpers/projects_helper_spec.rb
@@ -314,13 +314,13 @@ RSpec.describe ProjectsHelper do
end
it 'returns image tag for member avatar' do
- expect(helper).to receive(:image_tag).with(expected, { width: 16, class: %w[avatar avatar-inline s16], alt: "", "data-src" => anything })
+ expect(helper).to receive(:image_tag).with(expected, { width: 16, class: %w[avatar avatar-inline s16], alt: "" })
helper.link_to_member_avatar(user)
end
it 'returns image tag with avatar class' do
- expect(helper).to receive(:image_tag).with(expected, { width: 16, class: %w[avatar avatar-inline s16 any-avatar-class], alt: "", "data-src" => anything })
+ expect(helper).to receive(:image_tag).with(expected, { width: 16, class: %w[avatar avatar-inline s16 any-avatar-class], alt: "" })
helper.link_to_member_avatar(user, avatar_class: "any-avatar-class")
end
@@ -904,6 +904,14 @@ RSpec.describe ProjectsHelper do
it { is_expected.to be_falsey }
end
+
+ context 'the :show_terraform_banner feature flag is disabled' do
+ before do
+ stub_feature_flags(show_terraform_banner: false)
+ end
+
+ it { is_expected.to be_falsey }
+ end
end
end
diff --git a/spec/helpers/routing/pseudonymization_helper_spec.rb b/spec/helpers/routing/pseudonymization_helper_spec.rb
index 10563502555..a28a86d1f53 100644
--- a/spec/helpers/routing/pseudonymization_helper_spec.rb
+++ b/spec/helpers/routing/pseudonymization_helper_spec.rb
@@ -6,6 +6,7 @@ RSpec.describe ::Routing::PseudonymizationHelper do
let_it_be(:group) { create(:group) }
let_it_be(:subgroup) { create(:group, parent: group) }
let_it_be(:project) { create(:project, group: group) }
+ let_it_be(:subproject) { create(:project, group: subgroup) }
let_it_be(:issue) { create(:issue, project: project) }
let(:merge_request) { create(:merge_request, source_project: project) }
@@ -56,16 +57,16 @@ RSpec.describe ::Routing::PseudonymizationHelper do
end
context 'with controller for groups with subgroups and project' do
- let(:masked_url) { "http://test.host/namespace:#{subgroup.id}/project:#{project.id}"}
+ let(:masked_url) { "http://test.host/namespace:#{subgroup.id}/project:#{subproject.id}"}
before do
allow(helper).to receive(:group).and_return(subgroup)
- allow(helper.project).to receive(:namespace).and_return(subgroup)
+ allow(helper).to receive(:project).and_return(subproject)
allow(Rails.application.routes).to receive(:recognize_path).and_return({
controller: 'projects',
action: 'show',
namespace_id: subgroup.name,
- id: project.name
+ id: subproject.name
})
end
@@ -129,6 +130,29 @@ RSpec.describe ::Routing::PseudonymizationHelper do
end
end
+ describe 'when it raises exception' do
+ context 'calls error tracking' do
+ before do
+ controller.request.path = '/dashboard/issues'
+ controller.request.query_string = 'assignee_username=root'
+ allow(Rails.application.routes).to receive(:recognize_path).and_return({
+ controller: 'dashboard',
+ action: 'issues'
+ })
+ end
+
+ it 'sends error to sentry and returns nil' do
+ allow(helper).to receive(:mask_params).with(anything).and_raise(ActionController::RoutingError, 'Some routing error')
+
+ expect(Gitlab::ErrorTracking).to receive(:track_exception).with(
+ ActionController::RoutingError,
+ url: '/dashboard/issues?assignee_username=root').and_call_original
+
+ expect(helper.masked_page_url).to be_nil
+ end
+ end
+ end
+
describe 'when feature flag is disabled' do
before do
stub_feature_flags(mask_page_urls: false)
diff --git a/spec/helpers/search_helper_spec.rb b/spec/helpers/search_helper_spec.rb
index 7b2334ab79e..9e870658870 100644
--- a/spec/helpers/search_helper_spec.rb
+++ b/spec/helpers/search_helper_spec.rb
@@ -248,13 +248,13 @@ RSpec.describe SearchHelper do
it 'uses the correct singular label' do
collection = Kaminari.paginate_array([:foo]).page(1).per(10)
- expect(search_entries_info(collection, scope, 'foo')).to eq("Showing 1 #{label} for<span>&nbsp;<code>foo</code>&nbsp;</span>")
+ expect(search_entries_info(collection, scope, 'foo')).to eq("Showing 1 #{label} for <span>&nbsp;<code>foo</code>&nbsp;</span>")
end
it 'uses the correct plural label' do
collection = Kaminari.paginate_array([:foo] * 23).page(1).per(10)
- expect(search_entries_info(collection, scope, 'foo')).to eq("Showing 1 - 10 of 23 #{label.pluralize} for<span>&nbsp;<code>foo</code>&nbsp;</span>")
+ expect(search_entries_info(collection, scope, 'foo')).to eq("Showing 1 - 10 of 23 #{label.pluralize} for <span>&nbsp;<code>foo</code>&nbsp;</span>")
end
end
diff --git a/spec/helpers/startupjs_helper_spec.rb b/spec/helpers/startupjs_helper_spec.rb
index 6d61c38d4a5..8d429b59291 100644
--- a/spec/helpers/startupjs_helper_spec.rb
+++ b/spec/helpers/startupjs_helper_spec.rb
@@ -3,6 +3,8 @@
require 'spec_helper'
RSpec.describe StartupjsHelper do
+ using RSpec::Parameterized::TableSyntax
+
describe '#page_startup_graphql_calls' do
let(:query_location) { 'repository/path_last_commit' }
let(:query_content) do
@@ -17,4 +19,24 @@ RSpec.describe StartupjsHelper do
expect(startup_graphql_calls).to include({ query: query_content, variables: { ref: 'foo' } })
end
end
+
+ describe '#page_startup_graphql_headers' do
+ where(:csrf_token, :feature_category, :expected) do
+ 'abc' | 'web_ide' | { 'X-CSRF-Token' => 'abc', 'x-gitlab-feature-category' => 'web_ide' }
+ '' | '' | { 'X-CSRF-Token' => '', 'x-gitlab-feature-category' => '' }
+ 'abc' | nil | { 'X-CSRF-Token' => 'abc', 'x-gitlab-feature-category' => '' }
+ 'something' | ' ' | { 'X-CSRF-Token' => 'something', 'x-gitlab-feature-category' => '' }
+ end
+
+ with_them do
+ before do
+ allow(helper).to receive(:form_authenticity_token).and_return(csrf_token)
+ ::Gitlab::ApplicationContext.push(feature_category: feature_category)
+ end
+
+ it 'returns hash of headers for GraphQL requests' do
+ expect(helper.page_startup_graphql_headers).to eq(expected)
+ end
+ end
+ end
end
diff --git a/spec/helpers/tab_helper_spec.rb b/spec/helpers/tab_helper_spec.rb
index bd8a8fa174a..346bfc7850c 100644
--- a/spec/helpers/tab_helper_spec.rb
+++ b/spec/helpers/tab_helper_spec.rb
@@ -5,6 +5,60 @@ require 'spec_helper'
RSpec.describe TabHelper do
include ApplicationHelper
+ describe 'gl_tabs_nav' do
+ it 'creates a tabs navigation' do
+ expect(gl_tabs_nav).to match(%r{<ul class=".*" role="tablist"><\/ul>})
+ end
+
+ it 'captures block output' do
+ expect(gl_tabs_nav { "block content" }).to match(/block content/)
+ end
+
+ it 'adds styles classes' do
+ expect(gl_tabs_nav).to match(/class="nav gl-tabs-nav"/)
+ end
+
+ it 'adds custom class' do
+ expect(gl_tabs_nav(class: 'my-class' )).to match(/class=".*my-class.*"/)
+ end
+ end
+
+ describe 'gl_tab_link_to' do
+ before do
+ allow(self).to receive(:current_page?).and_return(false)
+ end
+
+ it 'creates a tab' do
+ expect(gl_tab_link_to('Link', '/url')).to eq('<li class="nav-item" role="presentation"><a class="nav-link gl-tab-nav-item" href="/url">Link</a></li>')
+ end
+
+ it 'creates a tab with block output' do
+ expect(gl_tab_link_to('/url') { 'block content' }).to match(/block content/)
+ end
+
+ it 'creates a tab with custom classes' do
+ expect(gl_tab_link_to('Link', '/url', { class: 'my-class' })).to match(/<a class=".*my-class.*"/)
+ end
+
+ it 'creates an active tab with item_active = true' do
+ expect(gl_tab_link_to('Link', '/url', { item_active: true })).to match(/<a class=".*active gl-tab-nav-item-active gl-tab-nav-item-active-indigo.*"/)
+ end
+
+ context 'when on the active page' do
+ before do
+ allow(self).to receive(:current_page?).and_return(true)
+ end
+
+ it 'creates an active tab' do
+ expect(gl_tab_link_to('Link', '/url')).to match(/<a class=".*active gl-tab-nav-item-active gl-tab-nav-item-active-indigo.*"/)
+ end
+
+ it 'creates an inactive tab with item_active = false' do
+ expect(gl_tab_link_to('Link', '/url', { item_active: false })).not_to match(/<a class=".*active.*"/)
+ end
+ end
+ end
+
describe 'nav_link' do
using RSpec::Parameterized::TableSyntax
diff --git a/spec/helpers/time_zone_helper_spec.rb b/spec/helpers/time_zone_helper_spec.rb
index e6cb20b5800..43ad130c4b5 100644
--- a/spec/helpers/time_zone_helper_spec.rb
+++ b/spec/helpers/time_zone_helper_spec.rb
@@ -76,6 +76,18 @@ RSpec.describe TimeZoneHelper, :aggregate_failures do
travel_to Time.find_zone(timezone).local(2021, 7, 20, 15, 30, 45)
end
+ context 'when timezone is `nil`' do
+ it 'returns `nil`' do
+ expect(helper.local_time(nil)).to eq(nil)
+ end
+ end
+
+ context 'when timezone is blank' do
+ it 'returns `nil`' do
+ expect(helper.local_time('')).to eq(nil)
+ end
+ end
+
context 'when a valid timezone is passed' do
it 'returns local time' do
expect(helper.local_time(timezone)).to eq('3:30 PM')
diff --git a/spec/helpers/user_callouts_helper_spec.rb b/spec/helpers/user_callouts_helper_spec.rb
index 794ff5ee945..f738ba855b8 100644
--- a/spec/helpers/user_callouts_helper_spec.rb
+++ b/spec/helpers/user_callouts_helper_spec.rb
@@ -293,4 +293,37 @@ RSpec.describe UserCalloutsHelper do
it { is_expected.to eq(false) }
end
end
+
+ describe '.show_security_newsletter_user_callout?' do
+ let_it_be(:admin) { create(:user, :admin) }
+
+ subject { helper.show_security_newsletter_user_callout? }
+
+ context 'when `current_user` is not an admin' do
+ before do
+ allow(helper).to receive(:current_user).and_return(user)
+ allow(helper).to receive(:user_dismissed?).with(described_class::SECURITY_NEWSLETTER_CALLOUT) { false }
+ end
+
+ it { is_expected.to be false }
+ end
+
+ context 'when user has dismissed callout' do
+ before do
+ allow(helper).to receive(:current_user).and_return(admin)
+ allow(helper).to receive(:user_dismissed?).with(described_class::SECURITY_NEWSLETTER_CALLOUT) { true }
+ end
+
+ it { is_expected.to be false }
+ end
+
+ context 'when `current_user` is an admin and user has not dismissed callout' do
+ before do
+ allow(helper).to receive(:current_user).and_return(admin)
+ allow(helper).to receive(:user_dismissed?).with(described_class::SECURITY_NEWSLETTER_CALLOUT) { false }
+ end
+
+ it { is_expected.to be true }
+ end
+ end
end
diff --git a/spec/initializers/carrierwave_patch_spec.rb b/spec/initializers/carrierwave_patch_spec.rb
index cbdad4aa9ac..e219db2299d 100644
--- a/spec/initializers/carrierwave_patch_spec.rb
+++ b/spec/initializers/carrierwave_patch_spec.rb
@@ -81,19 +81,32 @@ RSpec.describe 'CarrierWave::Storage::Fog::File' do
end
describe '#authenticated_url' do
+ let(:expire_at) { 24.hours.from_now }
+ let(:options) { { expire_at: expire_at } }
+
it 'has an authenticated URL' do
- expect(subject.authenticated_url).to eq("https://sa.blob.core.windows.net/test_container/test_blob?token")
+ expect(subject.authenticated_url(options)).to eq("https://sa.blob.core.windows.net/test_container/test_blob?token")
end
context 'with custom expire_at' do
it 'properly sets expires param' do
- expire_at = 24.hours.from_now
+ expect_next_instance_of(Fog::Storage::AzureRM::File) do |file|
+ expect(file).to receive(:url).with(expire_at, options).and_call_original
+ end
+
+ expect(subject.authenticated_url(options)).to eq("https://sa.blob.core.windows.net/test_container/test_blob?token")
+ end
+ end
+
+ context 'with content_disposition option' do
+ let(:options) { { expire_at: expire_at, content_disposition: 'attachment' } }
+ it 'passes options' do
expect_next_instance_of(Fog::Storage::AzureRM::File) do |file|
- expect(file).to receive(:url).with(expire_at).and_call_original
+ expect(file).to receive(:url).with(expire_at, options).and_call_original
end
- expect(subject.authenticated_url(expire_at: expire_at)).to eq("https://sa.blob.core.windows.net/test_container/test_blob?token")
+ expect(subject.authenticated_url(options)).to eq("https://sa.blob.core.windows.net/test_container/test_blob?token")
end
end
end
diff --git a/spec/initializers/database_config_spec.rb b/spec/initializers/database_config_spec.rb
index 5ddfbd64c23..23f7fd06254 100644
--- a/spec/initializers/database_config_spec.rb
+++ b/spec/initializers/database_config_spec.rb
@@ -2,19 +2,11 @@
require 'spec_helper'
-RSpec.describe 'Database config initializer' do
+RSpec.describe 'Database config initializer', :reestablished_active_record_base do
subject do
load Rails.root.join('config/initializers/database_config.rb')
end
- around do |example|
- original_config = ActiveRecord::Base.connection_db_config
-
- example.run
-
- ActiveRecord::Base.establish_connection(original_config)
- end
-
before do
allow(Gitlab::Runtime).to receive(:max_threads).and_return(max_threads)
end
diff --git a/spec/initializers/lograge_spec.rb b/spec/initializers/lograge_spec.rb
index 4d2aa6e74de..9e58fa289ac 100644
--- a/spec/initializers/lograge_spec.rb
+++ b/spec/initializers/lograge_spec.rb
@@ -230,39 +230,21 @@ RSpec.describe 'lograge', type: :request do
end
end
- context 'when load balancing is enabled' do
- before do
- allow(Gitlab::Database::LoadBalancing).to receive(:enable?).and_return(true)
- end
-
- context 'with db payload' do
- context 'when RequestStore is enabled', :request_store do
- it 'includes db counters for load balancing' do
- subscriber.process_action(event)
-
- expect(log_data).to include(*db_load_balancing_logging_keys)
- end
- end
-
- context 'when RequestStore is disabled' do
- it 'does not include db counters for load balancing' do
- subscriber.process_action(event)
+ context 'with db payload' do
+ context 'when RequestStore is enabled', :request_store do
+ it 'includes db counters for load balancing' do
+ subscriber.process_action(event)
- expect(log_data).not_to include(*db_load_balancing_logging_keys)
- end
+ expect(log_data).to include(*db_load_balancing_logging_keys)
end
end
- end
- context 'when load balancing is disabled' do
- before do
- allow(Gitlab::Database::LoadBalancing).to receive(:enable?).and_return(false)
- end
+ context 'when RequestStore is disabled' do
+ it 'does not include db counters for load balancing' do
+ subscriber.process_action(event)
- it 'does not include db counters for load balancing' do
- subscriber.process_action(event)
-
- expect(log_data).not_to include(*db_load_balancing_logging_keys)
+ expect(log_data).not_to include(*db_load_balancing_logging_keys)
+ end
end
end
end
diff --git a/spec/initializers/zz_metrics_spec.rb b/spec/initializers/zz_metrics_spec.rb
deleted file mode 100644
index ad93c30ee22..00000000000
--- a/spec/initializers/zz_metrics_spec.rb
+++ /dev/null
@@ -1,20 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe 'instrument_classes' do
- let(:config) { double(:config) }
-
- before do
- allow(config).to receive(:instrument_method)
- allow(config).to receive(:instrument_methods)
- allow(config).to receive(:instrument_instance_method)
- allow(config).to receive(:instrument_instance_methods)
- allow(Gitlab::Application).to receive(:configure)
- end
-
- it 'can autoload and instrument all files' do
- require_relative '../../config/initializers/zz_metrics'
- expect { instrument_classes(config) }.not_to raise_error
- end
-end
diff --git a/spec/lib/api/base_spec.rb b/spec/lib/api/base_spec.rb
new file mode 100644
index 00000000000..8513b800273
--- /dev/null
+++ b/spec/lib/api/base_spec.rb
@@ -0,0 +1,92 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+# rubocop:disable Rails/HttpPositionalArguments
+RSpec.describe ::API::Base do
+ let(:app_hello) do
+ route = double(:route, request_method: 'GET', path: '/:version/test/hello')
+ double(:endpoint, route: route, options: { for: api_handler, path: ["hello"] }, namespace: '/test')
+ end
+
+ let(:app_hi) do
+ route = double(:route, request_method: 'GET', path: '/:version//test/hi')
+ double(:endpoint, route: route, options: { for: api_handler, path: ["hi"] }, namespace: '/test')
+ end
+
+ describe 'declare feature categories at handler level for all routes' do
+ let(:api_handler) do
+ Class.new(described_class) do
+ feature_category :foo
+ urgency :medium
+
+ namespace '/test' do
+ get 'hello' do
+ end
+ post 'hi' do
+ end
+ end
+ end
+ end
+
+ it 'sets feature category for a particular route', :aggregate_failures do
+ expect(api_handler.feature_category_for_app(app_hello)).to eq(:foo)
+ expect(api_handler.feature_category_for_app(app_hi)).to eq(:foo)
+ end
+
+ it 'sets request urgency for a particular route', :aggregate_failures do
+ expect(api_handler.urgency_for_app(app_hello)).to be_request_urgency(:medium)
+ expect(api_handler.urgency_for_app(app_hi)).to be_request_urgency(:medium)
+ end
+ end
+
+ describe 'declare feature categories at route level' do
+ let(:api_handler) do
+ Class.new(described_class) do
+ namespace '/test' do
+ get 'hello', feature_category: :foo, urgency: :low do
+ end
+ post 'hi', feature_category: :bar, urgency: :medium do
+ end
+ end
+ end
+ end
+
+ it 'sets feature category for a particular route', :aggregate_failures do
+ expect(api_handler.feature_category_for_app(app_hello)).to eq(:foo)
+ expect(api_handler.feature_category_for_app(app_hi)).to eq(:bar)
+ end
+
+ it 'sets request urgency for a particular route', :aggregate_failures do
+ expect(api_handler.urgency_for_app(app_hello)).to be_request_urgency(:low)
+ expect(api_handler.urgency_for_app(app_hi)).to be_request_urgency(:medium)
+ end
+ end
+
+ describe 'declare feature categories at both handler level and route level' do
+ let(:api_handler) do
+ Class.new(described_class) do
+ feature_category :foo, ['/test/hello']
+ urgency :low, ['/test/hello']
+
+ namespace '/test' do
+ get 'hello' do
+ end
+ post 'hi', feature_category: :bar, urgency: :medium do
+ end
+ end
+ end
+ end
+
+ it 'sets feature category for a particular route', :aggregate_failures do
+ expect(api_handler.feature_category_for_app(app_hello)).to eq(:foo)
+ expect(api_handler.feature_category_for_app(app_hi)).to eq(:bar)
+ end
+
+ it 'sets target duration for a particular route', :aggregate_failures do
+ expect(api_handler.urgency_for_app(app_hello)).to be_request_urgency(:low)
+ expect(api_handler.urgency_for_app(app_hi)).to be_request_urgency(:medium)
+ end
+ end
+end
+# rubocop:enable Rails/HttpPositionalArguments
diff --git a/spec/lib/api/ci/helpers/runner_spec.rb b/spec/lib/api/ci/helpers/runner_spec.rb
index 99f2db544a5..cc871d66d40 100644
--- a/spec/lib/api/ci/helpers/runner_spec.rb
+++ b/spec/lib/api/ci/helpers/runner_spec.rb
@@ -15,8 +15,8 @@ RSpec.describe API::Ci::Helpers::Runner do
it 'handles sticking of a build when a build ID is specified' do
allow(helper).to receive(:params).and_return(id: build.id)
- expect(Gitlab::Database::LoadBalancing::RackMiddleware)
- .to receive(:stick_or_unstick)
+ expect(ApplicationRecord.sticking)
+ .to receive(:stick_or_unstick_request)
.with({}, :build, build.id)
helper.current_job
@@ -25,8 +25,8 @@ RSpec.describe API::Ci::Helpers::Runner do
it 'does not handle sticking if no build ID was specified' do
allow(helper).to receive(:params).and_return({})
- expect(Gitlab::Database::LoadBalancing::RackMiddleware)
- .not_to receive(:stick_or_unstick)
+ expect(ApplicationRecord.sticking)
+ .not_to receive(:stick_or_unstick_request)
helper.current_job
end
@@ -44,8 +44,8 @@ RSpec.describe API::Ci::Helpers::Runner do
it 'handles sticking of a runner if a token is specified' do
allow(helper).to receive(:params).and_return(token: runner.token)
- expect(Gitlab::Database::LoadBalancing::RackMiddleware)
- .to receive(:stick_or_unstick)
+ expect(ApplicationRecord.sticking)
+ .to receive(:stick_or_unstick_request)
.with({}, :runner, runner.token)
helper.current_runner
@@ -54,8 +54,8 @@ RSpec.describe API::Ci::Helpers::Runner do
it 'does not handle sticking if no token was specified' do
allow(helper).to receive(:params).and_return({})
- expect(Gitlab::Database::LoadBalancing::RackMiddleware)
- .not_to receive(:stick_or_unstick)
+ expect(ApplicationRecord.sticking)
+ .not_to receive(:stick_or_unstick_request)
helper.current_runner
end
diff --git a/spec/lib/api/entities/clusters/agent_authorization_spec.rb b/spec/lib/api/entities/clusters/agent_authorization_spec.rb
index 101a8af4ac4..3a1deb43bf8 100644
--- a/spec/lib/api/entities/clusters/agent_authorization_spec.rb
+++ b/spec/lib/api/entities/clusters/agent_authorization_spec.rb
@@ -3,15 +3,34 @@
require 'spec_helper'
RSpec.describe API::Entities::Clusters::AgentAuthorization do
- let_it_be(:authorization) { create(:agent_group_authorization) }
-
subject { described_class.new(authorization).as_json }
- it 'includes basic fields' do
- expect(subject).to include(
- id: authorization.agent_id,
- config_project: a_hash_including(id: authorization.agent.project_id),
- configuration: authorization.config
- )
+ shared_examples 'generic authorization' do
+ it 'includes shared fields' do
+ expect(subject).to include(
+ id: authorization.agent_id,
+ config_project: a_hash_including(id: authorization.agent.project_id),
+ configuration: authorization.config
+ )
+ end
+ end
+
+ context 'project authorization' do
+ let(:authorization) { create(:agent_project_authorization) }
+
+ include_examples 'generic authorization'
+ end
+
+ context 'group authorization' do
+ let(:authorization) { create(:agent_group_authorization) }
+
+ include_examples 'generic authorization'
+ end
+
+ context 'implicit authorization' do
+ let(:agent) { create(:cluster_agent) }
+ let(:authorization) { Clusters::Agents::ImplicitAuthorization.new(agent: agent) }
+
+ include_examples 'generic authorization'
end
end
diff --git a/spec/lib/api/entities/user_spec.rb b/spec/lib/api/entities/user_spec.rb
index 860f007f284..9c9a157d68a 100644
--- a/spec/lib/api/entities/user_spec.rb
+++ b/spec/lib/api/entities/user_spec.rb
@@ -3,10 +3,13 @@
require 'spec_helper'
RSpec.describe API::Entities::User do
- let(:user) { create(:user) }
+ let_it_be(:timezone) { 'America/Los_Angeles' }
+
+ let(:user) { create(:user, timezone: timezone) }
let(:current_user) { create(:user) }
+ let(:entity) { described_class.new(user, current_user: current_user) }
- subject { described_class.new(user, current_user: current_user).as_json }
+ subject { entity.as_json }
it 'exposes correct attributes' do
expect(subject).to include(:bio, :location, :public_email, :skype, :linkedin, :twitter, :website_url, :organization, :job_title, :work_information, :pronouns)
@@ -35,4 +38,10 @@ RSpec.describe API::Entities::User do
expect(subject[:bot]).to eq(true)
end
end
+
+ it 'exposes local_time' do
+ local_time = '2:30 PM'
+ expect(entity).to receive(:local_time).with(timezone).and_return(local_time)
+ expect(subject[:local_time]).to eq(local_time)
+ end
end
diff --git a/spec/lib/api/every_api_endpoint_spec.rb b/spec/lib/api/every_api_endpoint_spec.rb
index ebf75e733d0..5fe14823a29 100644
--- a/spec/lib/api/every_api_endpoint_spec.rb
+++ b/spec/lib/api/every_api_endpoint_spec.rb
@@ -5,11 +5,11 @@ require 'spec_helper'
RSpec.describe 'Every API endpoint' do
context 'feature categories' do
let_it_be(:feature_categories) do
- YAML.load_file(Rails.root.join('config', 'feature_categories.yml')).map(&:to_sym).to_set
+ Gitlab::FeatureCategories.default.categories.map(&:to_sym).to_set
end
let_it_be(:api_endpoints) do
- API::API.routes.map do |route|
+ Gitlab::RequestEndpoints.all_api_endpoints.map do |route|
[route.app.options[:for], API::Base.path_for_app(route.app)]
end
end
diff --git a/spec/lib/api/helpers_spec.rb b/spec/lib/api/helpers_spec.rb
index 587fe60860a..37e040a422b 100644
--- a/spec/lib/api/helpers_spec.rb
+++ b/spec/lib/api/helpers_spec.rb
@@ -32,15 +32,11 @@ RSpec.describe API::Helpers do
helper
end
- before do
- allow(Gitlab::Database::LoadBalancing).to receive(:enable?).and_return(true)
- end
-
it 'handles sticking when a user could be found' do
allow_any_instance_of(API::Helpers).to receive(:initial_current_user).and_return(user)
- expect(Gitlab::Database::LoadBalancing::RackMiddleware)
- .to receive(:stick_or_unstick).with(any_args, :user, 42)
+ expect(ApplicationRecord.sticking)
+ .to receive(:stick_or_unstick_request).with(any_args, :user, 42)
get 'user'
@@ -50,8 +46,8 @@ RSpec.describe API::Helpers do
it 'does not handle sticking if no user could be found' do
allow_any_instance_of(API::Helpers).to receive(:initial_current_user).and_return(nil)
- expect(Gitlab::Database::LoadBalancing::RackMiddleware)
- .not_to receive(:stick_or_unstick)
+ expect(ApplicationRecord.sticking)
+ .not_to receive(:stick_or_unstick_request)
get 'user'
diff --git a/spec/lib/api/validations/validators/project_portable_spec.rb b/spec/lib/api/validations/validators/project_portable_spec.rb
new file mode 100644
index 00000000000..8c1a49d5214
--- /dev/null
+++ b/spec/lib/api/validations/validators/project_portable_spec.rb
@@ -0,0 +1,33 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe API::Validations::Validators::ProjectPortable do
+ include ApiValidatorsHelpers
+
+ let(:portable) { 'labels' }
+ let(:not_portable) { 'project_members' }
+
+ subject do
+ described_class.new(['test'], {}, false, scope.new)
+ end
+
+ context 'valid portable' do
+ it 'does not raise a validation error' do
+ expect_no_validation_error('test' => portable)
+ end
+ end
+
+ context 'empty params' do
+ it 'raises a validation error' do
+ expect_validation_error('test' => nil)
+ expect_validation_error('test' => '')
+ end
+ end
+
+ context 'not portable' do
+ it 'raises a validation error' do
+ expect_validation_error('test' => not_portable) # Sha length > 40
+ end
+ end
+end
diff --git a/spec/lib/atlassian/jira_connect/asymmetric_jwt_spec.rb b/spec/lib/atlassian/jira_connect/asymmetric_jwt_spec.rb
new file mode 100644
index 00000000000..c57d8ece86b
--- /dev/null
+++ b/spec/lib/atlassian/jira_connect/asymmetric_jwt_spec.rb
@@ -0,0 +1,99 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Atlassian::JiraConnect::AsymmetricJwt do
+ describe '#valid?' do
+ subject(:asymmetric_jwt) { described_class.new(jwt, verification_claims) }
+
+ let(:verification_claims) { jwt_claims }
+ let(:jwt_claims) { { aud: aud, iss: client_key, qsh: qsh } }
+ let(:aud) { 'https://test.host/-/jira_connect' }
+ let(:client_key) { '1234' }
+ let(:qsh) { Atlassian::Jwt.create_query_string_hash('https://gitlab.test/events/installed', 'POST', 'https://gitlab.test') }
+ let(:public_key_id) { '123e4567-e89b-12d3-a456-426614174000' }
+ let(:jwt_headers) { { kid: public_key_id } }
+ let(:private_key) { OpenSSL::PKey::RSA.generate 2048 }
+ let(:jwt) { JWT.encode(jwt_claims, private_key, 'RS256', jwt_headers) }
+ let(:public_key) { private_key.public_key }
+
+ before do
+ stub_request(:get, "https://connect-install-keys.atlassian.com/#{public_key_id}").to_return(body: public_key.to_s, status: 200)
+ end
+
+ it 'returns true when verified with public key from CDN' do
+ expect(JWT).to receive(:decode).twice.and_call_original
+
+ expect(asymmetric_jwt).to be_valid
+
+ expect(WebMock).to have_requested(:get, "https://connect-install-keys.atlassian.com/#{public_key_id}")
+ end
+
+ context 'JWT does not contain a key ID' do
+ let(:public_key_id) { nil }
+
+ it { is_expected.not_to be_valid }
+ end
+
+ context 'JWT contains a key ID that is not a valid UUID4' do
+ let(:public_key_id) { '123' }
+
+ it { is_expected.not_to be_valid }
+ end
+
+ context 'public key can not be retrieved' do
+ before do
+ stub_request(:get, "https://connect-install-keys.atlassian.com/#{public_key_id}").to_return(body: '', status: 404)
+ end
+
+ it { is_expected.not_to be_valid }
+ end
+
+ context 'retrieving the public raises an error' do
+ before do
+ allow(Gitlab::HTTP).to receive(:get).and_raise(SocketError)
+ end
+
+ it { is_expected.not_to be_valid }
+ end
+
+ context 'token decoding raises an error' do
+ before do
+ allow(JWT).to receive(:decode).and_call_original
+ allow(JWT).to receive(:decode).with(
+ jwt, anything, true, aud: anything, verify_aud: true, iss: client_key, verify_iss: true, algorithm: 'RS256'
+ ).and_raise(JWT::DecodeError)
+ end
+
+ it { is_expected.not_to be_valid }
+ end
+
+ context 'when iss could not be verified' do
+ let(:verification_claims) { { aud: jwt_claims[:aud], iss: 'some other iss', qsh: jwt_claims[:qsh] } }
+
+ it { is_expected.not_to be_valid }
+ end
+
+ context 'when qsh could not be verified' do
+ let(:verification_claims) { { aud: jwt_claims[:aud], iss: client_key, qsh: 'some other qsh' } }
+
+ it { is_expected.not_to be_valid }
+ end
+ end
+
+ describe '#iss_claim' do
+ subject { asymmetric_jwt.iss_claim }
+
+ let(:asymmetric_jwt) { described_class.new('123', anything) }
+
+ it { is_expected.to eq(nil) }
+
+ context 'when jwt is verified' do
+ before do
+ asymmetric_jwt.instance_variable_set(:@claims, { 'iss' => 'client_key' })
+ end
+
+ it { is_expected.to eq('client_key') }
+ end
+ end
+end
diff --git a/spec/lib/atlassian/jira_connect/serializers/deployment_entity_spec.rb b/spec/lib/atlassian/jira_connect/serializers/deployment_entity_spec.rb
index 82bcbdc4561..8ccc3253a46 100644
--- a/spec/lib/atlassian/jira_connect/serializers/deployment_entity_spec.rb
+++ b/spec/lib/atlassian/jira_connect/serializers/deployment_entity_spec.rb
@@ -46,12 +46,22 @@ RSpec.describe Atlassian::JiraConnect::Serializers::DeploymentEntity do
using RSpec::Parameterized::TableSyntax
where(:env_name, :env_type) do
+ 'PRODUCTION' | 'production'
'prod' | 'production'
+ 'prod-east-2' | 'production'
+ 'us-prod-east' | 'production'
+ 'fe-production' | 'production'
'test' | 'testing'
+ 'qa-env-2' | 'testing'
'staging' | 'staging'
+ 'pre-prod' | 'staging'
+ 'blue-kit-stage' | 'staging'
+ 'pre-prod' | 'staging'
'dev' | 'development'
'review/app' | 'development'
'something-else' | 'unmapped'
+ 'store-produce' | 'unmapped'
+ 'unproductive' | 'unmapped'
end
with_them do
diff --git a/spec/lib/backup/gitaly_backup_spec.rb b/spec/lib/backup/gitaly_backup_spec.rb
index 7797bd12f0e..2ccde517533 100644
--- a/spec/lib/backup/gitaly_backup_spec.rb
+++ b/spec/lib/backup/gitaly_backup_spec.rb
@@ -5,12 +5,20 @@ require 'spec_helper'
RSpec.describe Backup::GitalyBackup do
let(:parallel) { nil }
let(:parallel_storage) { nil }
+
let(:progress) do
Tempfile.new('progress').tap do |progress|
progress.unlink
end
end
+ let(:expected_env) do
+ {
+ 'SSL_CERT_FILE' => OpenSSL::X509::DEFAULT_CERT_FILE,
+ 'SSL_CERT_DIR' => OpenSSL::X509::DEFAULT_CERT_DIR
+ }.merge(ENV)
+ end
+
after do
progress.close
end
@@ -32,7 +40,7 @@ RSpec.describe Backup::GitalyBackup do
project_snippet = create(:project_snippet, :repository, project: project)
personal_snippet = create(:personal_snippet, :repository, author: project.owner)
- expect(Open3).to receive(:popen2).with(ENV, anything, 'create', '-path', anything).and_call_original
+ expect(Open3).to receive(:popen2).with(expected_env, anything, 'create', '-path', anything).and_call_original
subject.start(:create)
subject.enqueue(project, Gitlab::GlRepository::PROJECT)
@@ -53,7 +61,7 @@ RSpec.describe Backup::GitalyBackup do
let(:parallel) { 3 }
it 'passes parallel option through' do
- expect(Open3).to receive(:popen2).with(ENV, anything, 'create', '-path', anything, '-parallel', '3').and_call_original
+ expect(Open3).to receive(:popen2).with(expected_env, anything, 'create', '-path', anything, '-parallel', '3').and_call_original
subject.start(:create)
subject.wait
@@ -64,7 +72,7 @@ RSpec.describe Backup::GitalyBackup do
let(:parallel_storage) { 3 }
it 'passes parallel option through' do
- expect(Open3).to receive(:popen2).with(ENV, anything, 'create', '-path', anything, '-parallel-storage', '3').and_call_original
+ expect(Open3).to receive(:popen2).with(expected_env, anything, 'create', '-path', anything, '-parallel-storage', '3').and_call_original
subject.start(:create)
subject.wait
@@ -90,6 +98,26 @@ RSpec.describe Backup::GitalyBackup do
it_behaves_like 'creates a repository backup'
end
+
+ context 'custom SSL envs set' do
+ let(:ssl_env) do
+ {
+ 'SSL_CERT_FILE' => '/some/cert/file',
+ 'SSL_CERT_DIR' => '/some/cert'
+ }
+ end
+
+ before do
+ stub_const('ENV', ssl_env)
+ end
+
+ it 'passes through SSL envs' do
+ expect(Open3).to receive(:popen2).with(ssl_env, anything, 'create', '-path', anything).and_call_original
+
+ subject.start(:create)
+ subject.wait
+ end
+ end
end
context 'restore' do
@@ -109,7 +137,7 @@ RSpec.describe Backup::GitalyBackup do
copy_bundle_to_backup_path('personal_snippet_repo.bundle', personal_snippet.disk_path + '.bundle')
copy_bundle_to_backup_path('project_snippet_repo.bundle', project_snippet.disk_path + '.bundle')
- expect(Open3).to receive(:popen2).with(ENV, anything, 'restore', '-path', anything).and_call_original
+ expect(Open3).to receive(:popen2).with(expected_env, anything, 'restore', '-path', anything).and_call_original
subject.start(:restore)
subject.enqueue(project, Gitlab::GlRepository::PROJECT)
@@ -132,7 +160,7 @@ RSpec.describe Backup::GitalyBackup do
let(:parallel) { 3 }
it 'passes parallel option through' do
- expect(Open3).to receive(:popen2).with(ENV, anything, 'restore', '-path', anything, '-parallel', '3').and_call_original
+ expect(Open3).to receive(:popen2).with(expected_env, anything, 'restore', '-path', anything, '-parallel', '3').and_call_original
subject.start(:restore)
subject.wait
@@ -143,7 +171,7 @@ RSpec.describe Backup::GitalyBackup do
let(:parallel_storage) { 3 }
it 'passes parallel option through' do
- expect(Open3).to receive(:popen2).with(ENV, anything, 'restore', '-path', anything, '-parallel-storage', '3').and_call_original
+ expect(Open3).to receive(:popen2).with(expected_env, anything, 'restore', '-path', anything, '-parallel-storage', '3').and_call_original
subject.start(:restore)
subject.wait
diff --git a/spec/lib/banzai/cross_project_reference_spec.rb b/spec/lib/banzai/cross_project_reference_spec.rb
index 60ff15a88e0..e703bbc4927 100644
--- a/spec/lib/banzai/cross_project_reference_spec.rb
+++ b/spec/lib/banzai/cross_project_reference_spec.rb
@@ -4,7 +4,7 @@ require 'spec_helper'
RSpec.describe Banzai::CrossProjectReference do
let(:including_class) { Class.new.include(described_class).new }
- let(:reference_cache) { Banzai::Filter::References::ReferenceCache.new(including_class, {})}
+ let(:reference_cache) { Banzai::Filter::References::ReferenceCache.new(including_class, {}, {})}
before do
allow(including_class).to receive(:context).and_return({})
diff --git a/spec/lib/banzai/filter/front_matter_filter_spec.rb b/spec/lib/banzai/filter/front_matter_filter_spec.rb
index 3f966c94dd3..cef6a2ddcce 100644
--- a/spec/lib/banzai/filter/front_matter_filter_spec.rb
+++ b/spec/lib/banzai/filter/front_matter_filter_spec.rb
@@ -39,7 +39,7 @@ RSpec.describe Banzai::Filter::FrontMatterFilter do
aggregate_failures do
expect(output).not_to include '---'
- expect(output).to include "```yaml\nfoo: :foo_symbol\n"
+ expect(output).to include "```yaml:frontmatter\nfoo: :foo_symbol\n"
end
end
@@ -59,7 +59,7 @@ RSpec.describe Banzai::Filter::FrontMatterFilter do
aggregate_failures do
expect(output).not_to include '+++'
- expect(output).to include "```toml\nfoo = :foo_symbol\n"
+ expect(output).to include "```toml:frontmatter\nfoo = :foo_symbol\n"
end
end
@@ -81,7 +81,7 @@ RSpec.describe Banzai::Filter::FrontMatterFilter do
aggregate_failures do
expect(output).not_to include ';;;'
- expect(output).to include "```json\n{\n \"foo\": \":foo_symbol\",\n"
+ expect(output).to include "```json:frontmatter\n{\n \"foo\": \":foo_symbol\",\n"
end
end
@@ -101,7 +101,7 @@ RSpec.describe Banzai::Filter::FrontMatterFilter do
aggregate_failures do
expect(output).not_to include '---arbitrary'
- expect(output).to include "```arbitrary\nfoo = :foo_symbol\n"
+ expect(output).to include "```arbitrary:frontmatter\nfoo = :foo_symbol\n"
end
end
@@ -130,7 +130,7 @@ RSpec.describe Banzai::Filter::FrontMatterFilter do
aggregate_failures do
expect(output).to eq <<~MD
- ```yaml
+ ```yaml:frontmatter
foo: :foo_symbol
bar: :bar_symbol
```
diff --git a/spec/lib/banzai/filter/references/milestone_reference_filter_spec.rb b/spec/lib/banzai/filter/references/milestone_reference_filter_spec.rb
index cdf6110dd6c..c21a9339ebb 100644
--- a/spec/lib/banzai/filter/references/milestone_reference_filter_spec.rb
+++ b/spec/lib/banzai/filter/references/milestone_reference_filter_spec.rb
@@ -437,6 +437,19 @@ RSpec.describe Banzai::Filter::References::MilestoneReferenceFilter do
expect(reference_filter(act, context).to_html).to eq exp
end
end
+
+ context 'when referencing both project and group milestones' do
+ let(:milestone) { create(:milestone, project: project) }
+ let(:group_milestone) { create(:milestone, title: 'group_milestone', group: group) }
+
+ it 'links to valid references' do
+ links = reference_filter("See #{milestone.to_reference(full: true)} and #{group_milestone.to_reference}", context).css('a')
+
+ expect(links.length).to eq(2)
+ expect(links[0].attr('href')).to eq(urls.milestone_url(milestone))
+ expect(links[1].attr('href')).to eq(urls.milestone_url(group_milestone))
+ end
+ end
end
context 'when milestone is open' do
diff --git a/spec/lib/banzai/filter/references/reference_cache_spec.rb b/spec/lib/banzai/filter/references/reference_cache_spec.rb
index c9404c381d3..dcd153da16a 100644
--- a/spec/lib/banzai/filter/references/reference_cache_spec.rb
+++ b/spec/lib/banzai/filter/references/reference_cache_spec.rb
@@ -12,15 +12,48 @@ RSpec.describe Banzai::Filter::References::ReferenceCache do
let(:filter_class) { Banzai::Filter::References::IssueReferenceFilter }
let(:filter) { filter_class.new(doc, project: project) }
- let(:cache) { described_class.new(filter, { project: project }) }
+ let(:cache) { described_class.new(filter, { project: project }, result) }
+ let(:result) { {} }
describe '#load_references_per_parent' do
+ subject { cache.load_references_per_parent(filter.nodes) }
+
it 'loads references grouped per parent paths' do
- cache.load_references_per_parent(filter.nodes)
+ expect(doc).to receive(:to_html).and_call_original
+
+ subject
expect(cache.references_per_parent).to eq({ project.full_path => [issue1.iid, issue2.iid].to_set,
project2.full_path => [issue3.iid].to_set })
end
+
+ context 'when rendered_html is memoized' do
+ let(:result) { { rendered_html: 'html' } }
+
+ it 'reuses memoized rendered HTML when available' do
+ expect(doc).not_to receive(:to_html)
+
+ subject
+ end
+
+ context 'when feature flag is disabled' do
+ before do
+ stub_feature_flags(reference_cache_memoization: false)
+ end
+
+ it 'ignores memoized rendered HTML' do
+ expect(doc).to receive(:to_html).and_call_original
+
+ subject
+ end
+ end
+ end
+
+ context 'when result is not available' do
+ let(:result) { nil }
+
+ it { expect { subject }.not_to raise_error }
+ end
end
describe '#load_parent_per_reference' do
@@ -47,7 +80,7 @@ RSpec.describe Banzai::Filter::References::ReferenceCache do
it 'does not have an N+1 query problem with cross projects' do
doc_single = Nokogiri::HTML.fragment("#1")
filter_single = filter_class.new(doc_single, project: project)
- cache_single = described_class.new(filter_single, { project: project })
+ cache_single = described_class.new(filter_single, { project: project }, {})
control_count = ActiveRecord::QueryRecorder.new do
cache_single.load_references_per_parent(filter_single.nodes)
diff --git a/spec/lib/banzai/filter/syntax_highlight_filter_spec.rb b/spec/lib/banzai/filter/syntax_highlight_filter_spec.rb
index 16e30604c99..7e45ecdd135 100644
--- a/spec/lib/banzai/filter/syntax_highlight_filter_spec.rb
+++ b/spec/lib/banzai/filter/syntax_highlight_filter_spec.rb
@@ -98,6 +98,14 @@ RSpec.describe Banzai::Filter::SyntaxHighlightFilter do
end
end
+ context "when sourcepos metadata is available" do
+ it "includes it in the highlighted code block" do
+ result = filter('<pre data-sourcepos="1:1-3:3"><code lang="plaintext">This is a test</code></pre>')
+
+ expect(result.to_html).to eq('<pre data-sourcepos="1:1-3:3" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">This is a test</span></code></pre>')
+ end
+ end
+
context "when Rouge lexing fails" do
before do
allow_next_instance_of(Rouge::Lexers::Ruby) do |instance|
diff --git a/spec/lib/banzai/pipeline/full_pipeline_spec.rb b/spec/lib/banzai/pipeline/full_pipeline_spec.rb
index 72661003361..7a335fad3f8 100644
--- a/spec/lib/banzai/pipeline/full_pipeline_spec.rb
+++ b/spec/lib/banzai/pipeline/full_pipeline_spec.rb
@@ -34,15 +34,16 @@ RSpec.describe Banzai::Pipeline::FullPipeline do
let(:identifier) { html[/.*fnref1-(\d+).*/, 1] }
let(:footnote_markdown) do
<<~EOF
- first[^1] and second[^second]
+ first[^1] and second[^second] and twenty[^twenty]
[^1]: one
[^second]: two
+ [^twenty]: twenty
EOF
end
let(:filtered_footnote) do
<<~EOF
- <p dir="auto">first<sup class="footnote-ref"><a href="#fn1-#{identifier}" id="fnref1-#{identifier}">1</a></sup> and second<sup class="footnote-ref"><a href="#fn2-#{identifier}" id="fnref2-#{identifier}">2</a></sup></p>
+ <p dir="auto">first<sup class="footnote-ref"><a href="#fn1-#{identifier}" id="fnref1-#{identifier}">1</a></sup> and second<sup class="footnote-ref"><a href="#fn2-#{identifier}" id="fnref2-#{identifier}">2</a></sup> and twenty<sup class="footnote-ref"><a href="#fn3-#{identifier}" id="fnref3-#{identifier}">3</a></sup></p>
<section class="footnotes"><ol>
<li id="fn1-#{identifier}">
@@ -51,6 +52,9 @@ RSpec.describe Banzai::Pipeline::FullPipeline do
<li id="fn2-#{identifier}">
<p>two <a href="#fnref2-#{identifier}" class="footnote-backref"><gl-emoji title="leftwards arrow with hook" data-name="leftwards_arrow_with_hook" data-unicode-version="1.1">↩</gl-emoji></a></p>
</li>
+ <li id="fn3-#{identifier}">
+ <p>twenty <a href="#fnref3-#{identifier}" class="footnote-backref"><gl-emoji title="leftwards arrow with hook" data-name="leftwards_arrow_with_hook" data-unicode-version="1.1">↩</gl-emoji></a></p>
+ </li>
</ol></section>
EOF
end
diff --git a/spec/lib/banzai/pipeline/pre_process_pipeline_spec.rb b/spec/lib/banzai/pipeline/pre_process_pipeline_spec.rb
index c628d8d5b41..5021ef3a79a 100644
--- a/spec/lib/banzai/pipeline/pre_process_pipeline_spec.rb
+++ b/spec/lib/banzai/pipeline/pre_process_pipeline_spec.rb
@@ -20,7 +20,7 @@ RSpec.describe Banzai::Pipeline::PreProcessPipeline do
aggregate_failures do
expect(result[:output]).not_to include "\xEF\xBB\xBF"
expect(result[:output]).not_to include '---'
- expect(result[:output]).to include "```yaml\nfoo: :foo_symbol\n"
+ expect(result[:output]).to include "```yaml:frontmatter\nfoo: :foo_symbol\n"
expect(result[:output]).to include "> blockquote\n"
end
end
diff --git a/spec/lib/bulk_imports/clients/graphql_spec.rb b/spec/lib/bulk_imports/clients/graphql_spec.rb
index 2f212458c4a..a5b5e96e594 100644
--- a/spec/lib/bulk_imports/clients/graphql_spec.rb
+++ b/spec/lib/bulk_imports/clients/graphql_spec.rb
@@ -34,7 +34,7 @@ RSpec.describe BulkImports::Clients::Graphql do
let(:version) { '13.0.0' }
it 'raises an error' do
- expect { subject.execute('test') }.to raise_error(::BulkImports::Error, "Unsupported GitLab Version. Minimum Supported Gitlab Version #{BulkImport::MINIMUM_GITLAB_MAJOR_VERSION}.")
+ expect { subject.execute('test') }.to raise_error(::BulkImports::Error, "Unsupported GitLab Version. Minimum Supported Gitlab Version #{BulkImport::MIN_MAJOR_VERSION}.")
end
end
end
diff --git a/spec/lib/bulk_imports/clients/http_spec.rb b/spec/lib/bulk_imports/clients/http_spec.rb
index c36cb80851a..623f9aa453a 100644
--- a/spec/lib/bulk_imports/clients/http_spec.rb
+++ b/spec/lib/bulk_imports/clients/http_spec.rb
@@ -8,7 +8,7 @@ RSpec.describe BulkImports::Clients::HTTP do
let(:url) { 'http://gitlab.example' }
let(:token) { 'token' }
let(:resource) { 'resource' }
- let(:version) { "#{BulkImport::MINIMUM_GITLAB_MAJOR_VERSION}.0.0" }
+ let(:version) { "#{BulkImport::MIN_MAJOR_VERSION}.0.0" }
let(:response_double) { double(code: 200, success?: true, parsed_response: {}) }
let(:version_response) { double(code: 200, success?: true, parsed_response: { 'version' => version }) }
@@ -32,7 +32,7 @@ RSpec.describe BulkImports::Clients::HTTP do
it 'raises BulkImports::Error' do
allow(Gitlab::HTTP).to receive(method).and_raise(Errno::ECONNREFUSED)
- expect { subject.public_send(method, resource) }.to raise_exception(BulkImports::Error)
+ expect { subject.public_send(method, resource) }.to raise_exception(BulkImports::NetworkError)
end
end
@@ -42,7 +42,7 @@ RSpec.describe BulkImports::Clients::HTTP do
allow(Gitlab::HTTP).to receive(method).and_return(response_double)
- expect { subject.public_send(method, resource) }.to raise_exception(BulkImports::Error)
+ expect { subject.public_send(method, resource) }.to raise_exception(BulkImports::NetworkError)
end
end
end
@@ -176,11 +176,37 @@ RSpec.describe BulkImports::Clients::HTTP do
end
end
+ describe '#instance_version' do
+ it 'returns version as an instance of Gitlab::VersionInfo' do
+ expect(subject.instance_version).to eq(Gitlab::VersionInfo.parse(version))
+ end
+ end
+
+ describe '#compatible_for_project_migration?' do
+ context 'when instance version is lower the the expected minimum' do
+ 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" }
+
+ it 'returns true' do
+ expect(subject.compatible_for_project_migration?).to be true
+ end
+ end
+ end
+
context 'when source instance is incompatible' do
let(:version) { '13.0.0' }
it 'raises an error' do
- expect { subject.get(resource) }.to raise_error(::BulkImports::Error, "Unsupported GitLab Version. Minimum Supported Gitlab Version #{BulkImport::MINIMUM_GITLAB_MAJOR_VERSION}.")
+ expect { subject.get(resource) }
+ .to raise_error(
+ ::BulkImports::Error,
+ "Unsupported GitLab Version. Minimum Supported Gitlab Version #{BulkImport::MIN_MAJOR_VERSION}."
+ )
end
end
diff --git a/spec/lib/bulk_imports/common/pipelines/boards_pipeline_spec.rb b/spec/lib/bulk_imports/common/pipelines/boards_pipeline_spec.rb
new file mode 100644
index 00000000000..241bd694a2c
--- /dev/null
+++ b/spec/lib/bulk_imports/common/pipelines/boards_pipeline_spec.rb
@@ -0,0 +1,98 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe BulkImports::Common::Pipelines::BoardsPipeline do
+ let_it_be(:user) { create(:user) }
+ let_it_be(:group) { create(:group) }
+ let_it_be(:project) { create(:project, group: group) }
+ let_it_be(:bulk_import) { create(:bulk_import, user: user) }
+
+ let(:board_data) do
+ {
+ "name" => "Test Board",
+ "lists" => [
+ {
+ "list_type" => "backlog",
+ "position" => 0
+ },
+ {
+ "list_type" => "closed",
+ "position" => 1
+ },
+ {
+ "list_type" => "label",
+ "position" => 2,
+ "label" => {
+ "title" => "test",
+ "type" => "GroupLabel",
+ "group_id" => group.id
+ }
+ }
+ ]
+ }
+ end
+
+ let(:tracker) { create(:bulk_import_tracker, entity: entity) }
+ let(:context) { BulkImports::Pipeline::Context.new(tracker) }
+
+ subject { described_class.new(context) }
+
+ before do
+ allow_next_instance_of(BulkImports::Common::Extractors::NdjsonExtractor) do |extractor|
+ allow(extractor).to receive(:extract).and_return(BulkImports::Pipeline::ExtractedData.new(data: board_data))
+ end
+ group.add_owner(user)
+ end
+
+ context 'when issue board belongs to a project' do
+ let_it_be(:entity) do
+ create(
+ :bulk_import_entity,
+ source_type: :project_entity,
+ project: project,
+ bulk_import: bulk_import,
+ source_full_path: 'source/full/path',
+ destination_name: 'My Destination Group',
+ destination_namespace: group.full_path
+ )
+ end
+
+ describe '#run' do
+ it 'imports issue boards into destination project' do
+ expect { subject.run }.to change(::Board, :count).by(1)
+ board = project.boards.find_by(name: board_data["name"])
+ expect(board).to be
+ expect(board.project.id).to eq(project.id)
+ expect(board.lists.count).to eq(3)
+ expect(board.lists.map(&:list_type).sort).to match_array(%w(backlog closed label))
+ expect(board.lists.find_by(list_type: "label").label.title).to eq("test")
+ end
+ end
+ end
+
+ context 'when issue board belongs to a group' do
+ let_it_be(:entity) do
+ create(
+ :bulk_import_entity,
+ group: group,
+ bulk_import: bulk_import,
+ source_full_path: 'source/full/path',
+ destination_name: 'My Destination Group',
+ destination_namespace: group.full_path
+ )
+ end
+
+ describe '#run' do
+ it 'imports issue boards into destination group' do
+ expect { subject.run }.to change(::Board, :count).by(1)
+ board = group.boards.find_by(name: board_data["name"])
+ expect(board).to be
+ expect(board.group.id).to eq(group.id)
+ expect(board.lists.count).to eq(3)
+ expect(board.lists.map(&:list_type).sort).to match_array(%w(backlog closed label))
+ expect(board.lists.find_by(list_type: "label").label.title).to eq("test")
+ end
+ end
+ end
+end
diff --git a/spec/lib/bulk_imports/common/pipelines/labels_pipeline_spec.rb b/spec/lib/bulk_imports/common/pipelines/labels_pipeline_spec.rb
new file mode 100644
index 00000000000..9e3a6d5b8df
--- /dev/null
+++ b/spec/lib/bulk_imports/common/pipelines/labels_pipeline_spec.rb
@@ -0,0 +1,78 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe BulkImports::Common::Pipelines::LabelsPipeline do
+ let_it_be(:user) { create(:user) }
+ let_it_be(:group) { create(:group) }
+ let_it_be(:bulk_import) { create(:bulk_import, user: user) }
+ let_it_be(:filepath) { 'spec/fixtures/bulk_imports/gz/labels.ndjson.gz' }
+ let_it_be(:entity) do
+ create(
+ :bulk_import_entity,
+ group: group,
+ bulk_import: bulk_import,
+ source_full_path: 'source/full/path',
+ destination_name: 'My Destination Group',
+ destination_namespace: group.full_path
+ )
+ end
+
+ let_it_be(:tracker) { create(:bulk_import_tracker, entity: entity) }
+ let_it_be(:context) { BulkImports::Pipeline::Context.new(tracker) }
+
+ let(:tmpdir) { Dir.mktmpdir }
+
+ before do
+ FileUtils.copy_file(filepath, File.join(tmpdir, 'labels.ndjson.gz'))
+ group.add_owner(user)
+ end
+
+ subject { described_class.new(context) }
+
+ describe '#run' do
+ it 'imports group labels into destination group and removes tmpdir' do
+ allow(Dir).to receive(:mktmpdir).and_return(tmpdir)
+ allow_next_instance_of(BulkImports::FileDownloadService) do |service|
+ allow(service).to receive(:execute)
+ end
+
+ expect { subject.run }.to change(::GroupLabel, :count).by(1)
+
+ label = group.labels.first
+
+ expect(label.title).to eq('Label 1')
+ expect(label.description).to eq('Label 1')
+ expect(label.color).to eq('#6699cc')
+ expect(File.directory?(tmpdir)).to eq(false)
+ end
+ end
+
+ describe '#load' do
+ context 'when label is not persisted' do
+ it 'saves the label' do
+ label = build(:group_label, group: group)
+
+ expect(label).to receive(:save!)
+
+ subject.load(context, label)
+ end
+ end
+
+ context 'when label is persisted' do
+ it 'does not save label' do
+ label = create(:group_label, group: group)
+
+ expect(label).not_to receive(:save!)
+
+ subject.load(context, label)
+ end
+ end
+
+ context 'when label is missing' do
+ it 'returns' do
+ expect(subject.load(context, nil)).to be_nil
+ end
+ end
+ end
+end
diff --git a/spec/lib/bulk_imports/groups/pipelines/boards_pipeline_spec.rb b/spec/lib/bulk_imports/groups/pipelines/boards_pipeline_spec.rb
deleted file mode 100644
index 8b2f03ca15f..00000000000
--- a/spec/lib/bulk_imports/groups/pipelines/boards_pipeline_spec.rb
+++ /dev/null
@@ -1,49 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe BulkImports::Groups::Pipelines::BoardsPipeline do
- let_it_be(:user) { create(:user) }
- let_it_be(:group) { create(:group) }
- let_it_be(:bulk_import) { create(:bulk_import, user: user) }
- let_it_be(:filepath) { 'spec/fixtures/bulk_imports/gz/boards.ndjson.gz' }
- let_it_be(:entity) do
- create(
- :bulk_import_entity,
- group: group,
- bulk_import: bulk_import,
- source_full_path: 'source/full/path',
- destination_name: 'My Destination Group',
- destination_namespace: group.full_path
- )
- end
-
- let_it_be(:tracker) { create(:bulk_import_tracker, entity: entity) }
- let_it_be(:context) { BulkImports::Pipeline::Context.new(tracker) }
-
- let(:tmpdir) { Dir.mktmpdir }
-
- before do
- FileUtils.copy_file(filepath, File.join(tmpdir, 'boards.ndjson.gz'))
- group.add_owner(user)
- end
-
- subject { described_class.new(context) }
-
- describe '#run' do
- it 'imports group boards into destination group and removes tmpdir' do
- allow(Dir).to receive(:mktmpdir).and_return(tmpdir)
- allow_next_instance_of(BulkImports::FileDownloadService) do |service|
- allow(service).to receive(:execute)
- end
-
- expect { subject.run }.to change(Board, :count).by(1)
-
- 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
-end
diff --git a/spec/lib/bulk_imports/groups/pipelines/labels_pipeline_spec.rb b/spec/lib/bulk_imports/groups/pipelines/labels_pipeline_spec.rb
deleted file mode 100644
index 6344dae0fb7..00000000000
--- a/spec/lib/bulk_imports/groups/pipelines/labels_pipeline_spec.rb
+++ /dev/null
@@ -1,78 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe BulkImports::Groups::Pipelines::LabelsPipeline do
- let_it_be(:user) { create(:user) }
- let_it_be(:group) { create(:group) }
- let_it_be(:bulk_import) { create(:bulk_import, user: user) }
- let_it_be(:filepath) { 'spec/fixtures/bulk_imports/gz/labels.ndjson.gz' }
- let_it_be(:entity) do
- create(
- :bulk_import_entity,
- group: group,
- bulk_import: bulk_import,
- source_full_path: 'source/full/path',
- destination_name: 'My Destination Group',
- destination_namespace: group.full_path
- )
- end
-
- let_it_be(:tracker) { create(:bulk_import_tracker, entity: entity) }
- let_it_be(:context) { BulkImports::Pipeline::Context.new(tracker) }
-
- let(:tmpdir) { Dir.mktmpdir }
-
- before do
- FileUtils.copy_file(filepath, File.join(tmpdir, 'labels.ndjson.gz'))
- group.add_owner(user)
- end
-
- subject { described_class.new(context) }
-
- describe '#run' do
- it 'imports group labels into destination group and removes tmpdir' do
- allow(Dir).to receive(:mktmpdir).and_return(tmpdir)
- allow_next_instance_of(BulkImports::FileDownloadService) do |service|
- allow(service).to receive(:execute)
- end
-
- expect { subject.run }.to change(::GroupLabel, :count).by(1)
-
- label = group.labels.first
-
- expect(label.title).to eq('Label 1')
- expect(label.description).to eq('Label 1')
- expect(label.color).to eq('#6699cc')
- expect(File.directory?(tmpdir)).to eq(false)
- end
- end
-
- describe '#load' do
- context 'when label is not persisted' do
- it 'saves the label' do
- label = build(:group_label, group: group)
-
- expect(label).to receive(:save!)
-
- subject.load(context, label)
- end
- end
-
- context 'when label is persisted' do
- it 'does not save label' do
- label = create(:group_label, group: group)
-
- expect(label).not_to receive(:save!)
-
- subject.load(context, label)
- end
- end
-
- context 'when label is missing' do
- it 'returns' do
- expect(subject.load(context, nil)).to be_nil
- end
- end
- end
-end
diff --git a/spec/lib/bulk_imports/groups/stage_spec.rb b/spec/lib/bulk_imports/groups/stage_spec.rb
index 81c0ffc14d4..b322b7b0edf 100644
--- a/spec/lib/bulk_imports/groups/stage_spec.rb
+++ b/spec/lib/bulk_imports/groups/stage_spec.rb
@@ -3,36 +3,42 @@
require 'spec_helper'
RSpec.describe BulkImports::Groups::Stage do
+ let(:bulk_import) { build(:bulk_import) }
+
let(:pipelines) do
[
[0, BulkImports::Groups::Pipelines::GroupPipeline],
[1, BulkImports::Groups::Pipelines::GroupAvatarPipeline],
[1, BulkImports::Groups::Pipelines::SubgroupEntitiesPipeline],
[1, BulkImports::Groups::Pipelines::MembersPipeline],
- [1, BulkImports::Groups::Pipelines::LabelsPipeline],
+ [1, BulkImports::Common::Pipelines::LabelsPipeline],
[1, BulkImports::Groups::Pipelines::MilestonesPipeline],
[1, BulkImports::Groups::Pipelines::BadgesPipeline],
- [2, BulkImports::Groups::Pipelines::BoardsPipeline]
+ [2, BulkImports::Common::Pipelines::BoardsPipeline]
]
end
+ it 'raises error when initialized without a BulkImport' do
+ expect { described_class.new({}) }.to raise_error(ArgumentError, 'Expected an argument of type ::BulkImport')
+ end
+
describe '.pipelines' do
it 'list all the pipelines with their stage number, ordered by stage' do
- expect(described_class.pipelines & pipelines).to eq(pipelines)
- expect(described_class.pipelines.last.last).to eq(BulkImports::Common::Pipelines::EntityFinisher)
+ expect(described_class.new(bulk_import).pipelines & pipelines).to eq(pipelines)
+ expect(described_class.new(bulk_import).pipelines.last.last).to eq(BulkImports::Common::Pipelines::EntityFinisher)
end
it 'includes project entities pipeline' do
stub_feature_flags(bulk_import_projects: true)
- expect(described_class.pipelines).to include([1, BulkImports::Groups::Pipelines::ProjectEntitiesPipeline])
+ expect(described_class.new(bulk_import).pipelines).to include([1, BulkImports::Groups::Pipelines::ProjectEntitiesPipeline])
end
context 'when bulk_import_projects feature flag is disabled' do
it 'does not include project entities pipeline' do
stub_feature_flags(bulk_import_projects: false)
- expect(described_class.pipelines.flatten).not_to include(BulkImports::Groups::Pipelines::ProjectEntitiesPipeline)
+ expect(described_class.new(bulk_import).pipelines.flatten).not_to include(BulkImports::Groups::Pipelines::ProjectEntitiesPipeline)
end
end
end
diff --git a/spec/lib/bulk_imports/ndjson_pipeline_spec.rb b/spec/lib/bulk_imports/ndjson_pipeline_spec.rb
index 57a258b0d9f..7d156c2c3df 100644
--- a/spec/lib/bulk_imports/ndjson_pipeline_spec.rb
+++ b/spec/lib/bulk_imports/ndjson_pipeline_spec.rb
@@ -186,4 +186,20 @@ RSpec.describe BulkImports::NdjsonPipeline do
end
end
end
+
+ describe '#relation_factory' do
+ context 'when portable is group' do
+ it 'returns group relation factory' do
+ expect(subject.relation_factory).to eq(Gitlab::ImportExport::Group::RelationFactory)
+ end
+ end
+
+ context 'when portable is project' do
+ subject { NdjsonPipelineClass.new(project, user) }
+
+ it 'returns project relation factory' do
+ expect(subject.relation_factory).to eq(Gitlab::ImportExport::Project::RelationFactory)
+ end
+ end
+ end
end
diff --git a/spec/lib/bulk_imports/network_error_spec.rb b/spec/lib/bulk_imports/network_error_spec.rb
new file mode 100644
index 00000000000..11f555fee09
--- /dev/null
+++ b/spec/lib/bulk_imports/network_error_spec.rb
@@ -0,0 +1,72 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe BulkImports::NetworkError, :clean_gitlab_redis_cache do
+ let(:tracker) { double(id: 1, stage: 2, entity: double(id: 3)) }
+
+ describe '.new' do
+ it 'requires either a message or a HTTP response' do
+ expect { described_class.new }
+ .to raise_error(ArgumentError, 'message or response required')
+ end
+ end
+
+ describe '#retriable?' do
+ it 'returns true for MAX_RETRIABLE_COUNT times when cause if one of RETRIABLE_EXCEPTIONS' do
+ raise described_class::RETRIABLE_EXCEPTIONS.sample
+ rescue StandardError => cause
+ begin
+ raise described_class, cause
+ rescue StandardError => exception
+ described_class::MAX_RETRIABLE_COUNT.times do
+ expect(exception.retriable?(tracker)).to eq(true)
+ end
+
+ expect(exception.retriable?(tracker)).to eq(false)
+ end
+ end
+
+ it 'returns true for MAX_RETRIABLE_COUNT times when response is one of RETRIABLE_CODES' do
+ exception = described_class.new(response: double(code: 429))
+
+ described_class::MAX_RETRIABLE_COUNT.times do
+ expect(exception.retriable?(tracker)).to eq(true)
+ end
+
+ expect(exception.retriable?(tracker)).to eq(false)
+ end
+
+ it 'returns false for other exceptions' do
+ raise StandardError
+ rescue StandardError => cause
+ begin
+ raise described_class, cause
+ rescue StandardError => exception
+ expect(exception.retriable?(tracker)).to eq(false)
+ end
+ end
+ end
+
+ describe '#retry_delay' do
+ it 'returns the default value when there is not a rate limit error' do
+ exception = described_class.new('foo')
+
+ expect(exception.retry_delay).to eq(described_class::DEFAULT_RETRY_DELAY_SECONDS.seconds)
+ end
+
+ context 'when the exception is a rate limit error' do
+ it 'returns the "Retry-After"' do
+ exception = described_class.new(response: double(code: 429, headers: { 'Retry-After' => 20 }))
+
+ expect(exception.retry_delay).to eq(20.seconds)
+ end
+
+ it 'returns the default value when there is no "Retry-After" header' do
+ exception = described_class.new(response: double(code: 429, headers: {}))
+
+ expect(exception.retry_delay).to eq(described_class::DEFAULT_RETRY_DELAY_SECONDS.seconds)
+ end
+ end
+ end
+end
diff --git a/spec/lib/bulk_imports/projects/graphql/get_repository_query_spec.rb b/spec/lib/bulk_imports/projects/graphql/get_repository_query_spec.rb
new file mode 100644
index 00000000000..4dba81dc0d2
--- /dev/null
+++ b/spec/lib/bulk_imports/projects/graphql/get_repository_query_spec.rb
@@ -0,0 +1,21 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe BulkImports::Projects::Graphql::GetRepositoryQuery do
+ describe 'query repository based on full_path' do
+ let(:entity) { double(source_full_path: 'test', bulk_import: nil) }
+ let(:tracker) { double(entity: entity) }
+ let(:context) { BulkImports::Pipeline::Context.new(tracker) }
+
+ it 'returns project repository url' do
+ expect(described_class.to_s).to include('httpUrlToRepo')
+ end
+
+ it 'queries project based on source_full_path' do
+ expected = { full_path: entity.source_full_path }
+
+ expect(described_class.variables(context)).to eq(expected)
+ end
+ end
+end
diff --git a/spec/lib/bulk_imports/projects/pipelines/issues_pipeline_spec.rb b/spec/lib/bulk_imports/projects/pipelines/issues_pipeline_spec.rb
new file mode 100644
index 00000000000..97fcddefd42
--- /dev/null
+++ b/spec/lib/bulk_imports/projects/pipelines/issues_pipeline_spec.rb
@@ -0,0 +1,168 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe BulkImports::Projects::Pipelines::IssuesPipeline do
+ let_it_be(:user) { create(:user) }
+ let_it_be(:group) { create(:group) }
+ let_it_be(:project) { create(:project, group: group) }
+ let_it_be(:bulk_import) { create(:bulk_import, user: user) }
+ let_it_be(:entity) do
+ create(
+ :bulk_import_entity,
+ :project_entity,
+ project: project,
+ bulk_import: bulk_import,
+ source_full_path: 'source/full/path',
+ destination_name: 'My Destination Project',
+ destination_namespace: group.full_path
+ )
+ end
+
+ let_it_be(:tracker) { create(:bulk_import_tracker, entity: entity) }
+ let_it_be(:context) { BulkImports::Pipeline::Context.new(tracker) }
+
+ let(:issue_attributes) { {} }
+ let(:issue) do
+ {
+ 'iid' => 7,
+ 'title' => 'Imported Issue',
+ 'description' => 'Description',
+ 'state' => 'opened',
+ 'updated_at' => '2016-06-14T15:02:47.967Z',
+ 'author_id' => 22
+ }.merge(issue_attributes)
+ end
+
+ subject(:pipeline) { described_class.new(context) }
+
+ describe '#run' do
+ before do
+ group.add_owner(user)
+ issue_with_index = [issue, 0]
+
+ allow_next_instance_of(BulkImports::Common::Extractors::NdjsonExtractor) do |extractor|
+ allow(extractor).to receive(:extract).and_return(BulkImports::Pipeline::ExtractedData.new(data: [issue_with_index]))
+ end
+
+ pipeline.run
+ end
+
+ it 'imports issue into destination project' do
+ expect(project.issues.count).to eq(1)
+
+ imported_issue = project.issues.last
+
+ aggregate_failures do
+ expect(imported_issue.iid).to eq(7)
+ expect(imported_issue.title).to eq(issue['title'])
+ expect(imported_issue.description).to eq(issue['description'])
+ expect(imported_issue.author).to eq(user)
+ expect(imported_issue.state).to eq('opened')
+ expect(imported_issue.updated_at.to_s).to eq('2016-06-14 15:02:47 UTC')
+ end
+ end
+
+ context 'zoom meetings' do
+ let(:issue_attributes) { { 'zoom_meetings' => [{ 'url' => 'https://zoom.us/j/123456789' }] } }
+
+ it 'restores zoom meetings' do
+ expect(project.issues.last.zoom_meetings.first.url).to eq('https://zoom.us/j/123456789')
+ end
+ end
+
+ context 'sentry issue' do
+ let(:issue_attributes) { { 'sentry_issue' => { 'sentry_issue_identifier' => '1234567891' } } }
+
+ it 'restores sentry issue information' do
+ expect(project.issues.last.sentry_issue.sentry_issue_identifier).to eq(1234567891)
+ end
+ end
+
+ context 'award emoji' do
+ let(:issue_attributes) { { 'award_emoji' => [{ 'name' => 'musical_keyboard', 'user_id' => 22 }] } }
+
+ it 'has award emoji on an issue' do
+ award_emoji = project.issues.last.award_emoji.first
+
+ expect(award_emoji.name).to eq('musical_keyboard')
+ expect(award_emoji.user).to eq(user)
+ end
+ end
+ context 'issue state' do
+ let(:issue_attributes) { { 'state' => 'closed' } }
+
+ it 'restores issue state' do
+ expect(project.issues.last.state).to eq('closed')
+ end
+ end
+
+ context 'labels' do
+ let(:issue_attributes) do
+ {
+ 'label_links' => [
+ { 'label' => { 'title' => 'imported label 1', 'type' => 'ProjectLabel' } },
+ { 'label' => { 'title' => 'imported label 2', 'type' => 'ProjectLabel' } }
+ ]
+ }
+ end
+
+ it 'restores issue labels' do
+ expect(project.issues.last.labels.pluck(:title)).to contain_exactly('imported label 1', 'imported label 2')
+ end
+ end
+
+ context 'milestone' do
+ let(:issue_attributes) { { 'milestone' => { 'title' => 'imported milestone' } } }
+
+ it 'restores issue milestone' do
+ expect(project.issues.last.milestone.title).to eq('imported milestone')
+ end
+ end
+
+ context 'timelogs' do
+ let(:issue_attributes) { { 'timelogs' => [{ 'time_spent' => 72000, 'spent_at' => '2019-12-27T00:00:00.000Z', 'user_id' => 22 }] } }
+
+ it 'restores issue timelogs' do
+ timelog = project.issues.last.timelogs.first
+
+ aggregate_failures do
+ expect(timelog.time_spent).to eq(72000)
+ expect(timelog.spent_at).to eq("2019-12-27T00:00:00.000Z")
+ end
+ end
+ end
+
+ context 'notes' do
+ let(:issue_attributes) do
+ {
+ 'notes' => [
+ {
+ 'note' => 'Issue note',
+ 'author_id' => 22,
+ 'author' => {
+ 'name' => 'User 22'
+ },
+ 'updated_at' => '2016-06-14T15:02:47.770Z',
+ 'award_emoji' => [
+ {
+ 'name' => 'clapper',
+ 'user_id' => 22
+ }
+ ]
+ }
+ ]
+ }
+ end
+
+ it 'restores issue notes and their award emoji' do
+ note = project.issues.last.notes.first
+
+ aggregate_failures do
+ expect(note.note).to eq("Issue note\n\n *By User 22 on 2016-06-14T15:02:47 (imported from GitLab)*")
+ expect(note.award_emoji.first.name).to eq('clapper')
+ end
+ end
+ end
+ end
+end
diff --git a/spec/lib/bulk_imports/projects/pipelines/repository_pipeline_spec.rb b/spec/lib/bulk_imports/projects/pipelines/repository_pipeline_spec.rb
new file mode 100644
index 00000000000..af39ec7a11c
--- /dev/null
+++ b/spec/lib/bulk_imports/projects/pipelines/repository_pipeline_spec.rb
@@ -0,0 +1,73 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe BulkImports::Projects::Pipelines::RepositoryPipeline do
+ describe '#run' do
+ let_it_be(:user) { create(:user) }
+ let_it_be(:parent) { create(:project) }
+ let_it_be(:bulk_import) { create(:bulk_import, user: user) }
+ let_it_be(:bulk_import_configuration) { create(:bulk_import_configuration, bulk_import: bulk_import) }
+
+ let_it_be(:entity) do
+ create(
+ :bulk_import_entity,
+ :project_entity,
+ bulk_import: bulk_import,
+ source_full_path: 'source/full/path',
+ destination_name: 'My Destination Repository',
+ destination_namespace: parent.full_path,
+ project: parent
+ )
+ end
+
+ let_it_be(:tracker) { create(:bulk_import_tracker, entity: entity) }
+ let_it_be(:context) { BulkImports::Pipeline::Context.new(tracker) }
+
+ context 'successfully imports repository' do
+ let(:project_data) do
+ {
+ 'httpUrlToRepo' => 'http://test.git'
+ }
+ end
+
+ subject { described_class.new(context) }
+
+ it 'imports new repository into destination project' do
+ allow_next_instance_of(BulkImports::Common::Extractors::GraphqlExtractor) do |extractor|
+ allow(extractor).to receive(:extract).and_return(BulkImports::Pipeline::ExtractedData.new(data: project_data))
+ end
+
+ expect_next_instance_of(Gitlab::GitalyClient::RepositoryService) do |repository_service|
+ url = project_data['httpUrlToRepo'].sub("://", "://oauth2:#{bulk_import_configuration.access_token}@")
+ expect(repository_service).to receive(:import_repository).with(url).and_return 0
+ end
+
+ subject.run
+ end
+ end
+
+ context 'blocked local networks' do
+ let(:project_data) do
+ {
+ 'httpUrlToRepo' => 'http://localhost/foo.git'
+ }
+ end
+
+ before do
+ allow(Gitlab.config.gitlab).to receive(:host).and_return('notlocalhost.gitlab.com')
+ allow(Gitlab::CurrentSettings).to receive(:allow_local_requests_from_web_hooks_and_services?).and_return(false)
+ allow_next_instance_of(BulkImports::Common::Extractors::GraphqlExtractor) do |extractor|
+ allow(extractor).to receive(:extract).and_return(BulkImports::Pipeline::ExtractedData.new(data: project_data))
+ end
+ end
+
+ subject { described_class.new(context) }
+
+ it 'imports new repository into destination project' do
+ subject.run
+ expect(context.entity.failed?).to be_truthy
+ end
+ end
+ end
+end
diff --git a/spec/lib/bulk_imports/projects/stage_spec.rb b/spec/lib/bulk_imports/projects/stage_spec.rb
index 428812a34ef..c606cf7c556 100644
--- a/spec/lib/bulk_imports/projects/stage_spec.rb
+++ b/spec/lib/bulk_imports/projects/stage_spec.rb
@@ -6,13 +6,23 @@ RSpec.describe BulkImports::Projects::Stage do
let(:pipelines) do
[
[0, BulkImports::Projects::Pipelines::ProjectPipeline],
- [1, BulkImports::Common::Pipelines::EntityFinisher]
+ [1, BulkImports::Projects::Pipelines::RepositoryPipeline],
+ [2, BulkImports::Common::Pipelines::LabelsPipeline],
+ [3, BulkImports::Projects::Pipelines::IssuesPipeline],
+ [4, BulkImports::Common::Pipelines::BoardsPipeline],
+ [5, BulkImports::Common::Pipelines::EntityFinisher]
]
end
- describe '.pipelines' do
+ subject do
+ bulk_import = build(:bulk_import)
+
+ described_class.new(bulk_import)
+ end
+
+ describe '#pipelines' do
it 'list all the pipelines with their stage number, ordered by stage' do
- expect(described_class.pipelines).to eq(pipelines)
+ expect(subject.pipelines).to eq(pipelines)
end
end
end
diff --git a/spec/lib/container_registry/client_spec.rb b/spec/lib/container_registry/client_spec.rb
index 9d6f4db537d..47a8fcf5dd0 100644
--- a/spec/lib/container_registry/client_spec.rb
+++ b/spec/lib/container_registry/client_spec.rb
@@ -111,6 +111,49 @@ RSpec.describe ContainerRegistry::Client do
it_behaves_like 'handling timeouts'
end
+ shared_examples 'handling repository info' do
+ context 'when the check is successful' do
+ context 'when using the GitLab container registry' do
+ before do
+ stub_registry_info(headers: {
+ 'GitLab-Container-Registry-Version' => '2.9.1-gitlab',
+ 'GitLab-Container-Registry-Features' => 'a,b,c'
+ })
+ end
+
+ it 'identifies the vendor as "gitlab"' do
+ expect(subject).to include(vendor: 'gitlab')
+ end
+
+ it 'identifies version and features' do
+ expect(subject).to include(version: '2.9.1-gitlab', features: %w[a b c])
+ end
+ end
+
+ context 'when using a third-party container registry' do
+ before do
+ stub_registry_info
+ end
+
+ it 'identifies the vendor as "other"' do
+ expect(subject).to include(vendor: 'other')
+ end
+
+ it 'does not identify version or features' do
+ expect(subject).to include(version: nil, features: [])
+ end
+ end
+ end
+
+ context 'when the check is not successful' do
+ it 'does not identify vendor, version or features' do
+ stub_registry_info(status: 500)
+
+ expect(subject).to eq({})
+ end
+ end
+ end
+
describe '#repository_manifest' do
subject { client.repository_manifest('group/test', 'mytag') }
@@ -316,46 +359,7 @@ RSpec.describe ContainerRegistry::Client do
describe '#registry_info' do
subject { client.registry_info }
- context 'when the check is successful' do
- context 'when using the GitLab container registry' do
- before do
- stub_registry_info(headers: {
- 'GitLab-Container-Registry-Version' => '2.9.1-gitlab',
- 'GitLab-Container-Registry-Features' => 'a,b,c'
- })
- end
-
- it 'identifies the vendor as "gitlab"' do
- expect(subject).to include(vendor: 'gitlab')
- end
-
- it 'identifies version and features' do
- expect(subject).to include(version: '2.9.1-gitlab', features: %w[a b c])
- end
- end
-
- context 'when using a third-party container registry' do
- before do
- stub_registry_info
- end
-
- it 'identifies the vendor as "other"' do
- expect(subject).to include(vendor: 'other')
- end
-
- it 'does not identify version or features' do
- expect(subject).to include(version: nil, features: [])
- end
- end
- end
-
- context 'when the check is not successful' do
- it 'does not identify vendor, version or features' do
- stub_registry_info(status: 500)
-
- expect(subject).to eq({})
- end
- end
+ it_behaves_like 'handling repository info'
end
describe '.supports_tag_delete?' do
@@ -418,6 +422,16 @@ RSpec.describe ContainerRegistry::Client do
end
end
+ describe '.registry_info' do
+ subject { described_class.registry_info }
+
+ before do
+ stub_container_registry_config(enabled: true, api_url: registry_api_url, key: 'spec/fixtures/x509_certificate_pk.key')
+ end
+
+ it_behaves_like 'handling repository info'
+ end
+
def stub_upload(path, content, digest, status = 200)
stub_request(:post, "#{registry_api_url}/v2/#{path}/blobs/uploads/")
.with(headers: headers_with_accept_types)
diff --git a/spec/lib/container_registry/tag_spec.rb b/spec/lib/container_registry/tag_spec.rb
index d696b61ac9d..d6e6b254dd9 100644
--- a/spec/lib/container_registry/tag_spec.rb
+++ b/spec/lib/container_registry/tag_spec.rb
@@ -60,6 +60,20 @@ RSpec.describe ContainerRegistry::Tag do
end
context 'manifest processing' do
+ shared_examples 'using the value manually set on created_at' do
+ let(:value) { 5.seconds.ago }
+
+ before do
+ tag.created_at = value
+ end
+
+ it 'does not use the config' do
+ expect(tag).not_to receive(:config)
+
+ expect(subject).to eq(value)
+ end
+ end
+
context 'schema v1' do
before do
stub_request(:get, 'http://registry.gitlab/v2/group/test/manifests/tag')
@@ -93,6 +107,8 @@ RSpec.describe ContainerRegistry::Tag do
subject { tag.created_at }
it { is_expected.to be_nil }
+
+ it_behaves_like 'using the value manually set on created_at'
end
end
end
@@ -117,6 +133,8 @@ RSpec.describe ContainerRegistry::Tag do
subject { tag.created_at }
it { is_expected.to be_nil }
+
+ it_behaves_like 'using the value manually set on created_at'
end
end
@@ -154,6 +172,8 @@ RSpec.describe ContainerRegistry::Tag do
subject { tag.created_at }
it { is_expected.not_to be_nil }
+
+ it_behaves_like 'using the value manually set on created_at'
end
end
diff --git a/spec/lib/error_tracking/sentry_client/issue_spec.rb b/spec/lib/error_tracking/sentry_client/issue_spec.rb
index e54296c58e0..82db0f70f2e 100644
--- a/spec/lib/error_tracking/sentry_client/issue_spec.rb
+++ b/spec/lib/error_tracking/sentry_client/issue_spec.rb
@@ -257,6 +257,10 @@ RSpec.describe ErrorTracking::SentryClient::Issue do
expect(subject.gitlab_issue).to eq('https://gitlab.com/gitlab-org/gitlab/issues/1')
end
+ it 'has an integrated attribute set to false' do
+ expect(subject.integrated).to be_falsey
+ end
+
context 'when issue annotations exist' do
before do
issue_sample_response['annotations'] = [
diff --git a/spec/lib/gitlab/analytics/cycle_analytics/stage_events/code_stage_start_spec.rb b/spec/lib/gitlab/analytics/cycle_analytics/stage_events/code_stage_start_spec.rb
index b6f9c8106c9..2e96fd09602 100644
--- a/spec/lib/gitlab/analytics/cycle_analytics/stage_events/code_stage_start_spec.rb
+++ b/spec/lib/gitlab/analytics/cycle_analytics/stage_events/code_stage_start_spec.rb
@@ -19,4 +19,16 @@ RSpec.describe Gitlab::Analytics::CycleAnalytics::StageEvents::CodeStageStart do
expect(records).to eq([merge_request])
expect(records).not_to include(other_merge_request)
end
+
+ it_behaves_like 'LEFT JOIN-able value stream analytics event' do
+ let_it_be(:record_with_data) do
+ mr_closing_issue = FactoryBot.create(:merge_requests_closing_issues)
+ issue = mr_closing_issue.issue
+ issue.metrics.update!(first_mentioned_in_commit_at: Time.current)
+
+ mr_closing_issue.merge_request
+ end
+
+ let_it_be(:record_without_data) { create(:merge_request) }
+ end
end
diff --git a/spec/lib/gitlab/analytics/cycle_analytics/stage_events/issue_created_spec.rb b/spec/lib/gitlab/analytics/cycle_analytics/stage_events/issue_created_spec.rb
index 224a18653ed..3f50dd38322 100644
--- a/spec/lib/gitlab/analytics/cycle_analytics/stage_events/issue_created_spec.rb
+++ b/spec/lib/gitlab/analytics/cycle_analytics/stage_events/issue_created_spec.rb
@@ -4,4 +4,8 @@ require 'spec_helper'
RSpec.describe Gitlab::Analytics::CycleAnalytics::StageEvents::IssueCreated do
it_behaves_like 'value stream analytics event'
+
+ it_behaves_like 'LEFT JOIN-able value stream analytics event' do
+ let_it_be(:record_with_data) { create(:issue) }
+ end
end
diff --git a/spec/lib/gitlab/analytics/cycle_analytics/stage_events/issue_deployed_to_production_spec.rb b/spec/lib/gitlab/analytics/cycle_analytics/stage_events/issue_deployed_to_production_spec.rb
index 93e588675d3..e807565ecb5 100644
--- a/spec/lib/gitlab/analytics/cycle_analytics/stage_events/issue_deployed_to_production_spec.rb
+++ b/spec/lib/gitlab/analytics/cycle_analytics/stage_events/issue_deployed_to_production_spec.rb
@@ -4,4 +4,16 @@ require 'spec_helper'
RSpec.describe Gitlab::Analytics::CycleAnalytics::StageEvents::IssueDeployedToProduction do
it_behaves_like 'value stream analytics event'
+
+ it_behaves_like 'LEFT JOIN-able value stream analytics event' do
+ let_it_be(:record_with_data) do
+ mr_closing_issue = FactoryBot.create(:merge_requests_closing_issues)
+ mr = mr_closing_issue.merge_request
+ mr.metrics.update!(first_deployed_to_production_at: Time.current)
+
+ mr_closing_issue.issue
+ end
+
+ let_it_be(:record_without_data) { create(:issue) }
+ end
end
diff --git a/spec/lib/gitlab/analytics/cycle_analytics/stage_events/issue_first_mentioned_in_commit_spec.rb b/spec/lib/gitlab/analytics/cycle_analytics/stage_events/issue_first_mentioned_in_commit_spec.rb
index bc0e388cf53..9bb023f9fdc 100644
--- a/spec/lib/gitlab/analytics/cycle_analytics/stage_events/issue_first_mentioned_in_commit_spec.rb
+++ b/spec/lib/gitlab/analytics/cycle_analytics/stage_events/issue_first_mentioned_in_commit_spec.rb
@@ -4,4 +4,9 @@ require 'spec_helper'
RSpec.describe Gitlab::Analytics::CycleAnalytics::StageEvents::IssueFirstMentionedInCommit do
it_behaves_like 'value stream analytics event'
+
+ it_behaves_like 'LEFT JOIN-able value stream analytics event' do
+ let_it_be(:record_with_data) { create(:issue).tap { |i| i.metrics.update!(first_mentioned_in_commit_at: Time.current) } }
+ let_it_be(:record_without_data) { create(:issue) }
+ end
end
diff --git a/spec/lib/gitlab/analytics/cycle_analytics/stage_events/issue_stage_end_spec.rb b/spec/lib/gitlab/analytics/cycle_analytics/stage_events/issue_stage_end_spec.rb
index ddc5f015a8c..7b46a86cbe2 100644
--- a/spec/lib/gitlab/analytics/cycle_analytics/stage_events/issue_stage_end_spec.rb
+++ b/spec/lib/gitlab/analytics/cycle_analytics/stage_events/issue_stage_end_spec.rb
@@ -4,4 +4,9 @@ require 'spec_helper'
RSpec.describe Gitlab::Analytics::CycleAnalytics::StageEvents::IssueStageEnd do
it_behaves_like 'value stream analytics event'
+
+ it_behaves_like 'LEFT JOIN-able value stream analytics event' do
+ let_it_be(:record_with_data) { create(:issue).tap { |i| i.metrics.update!(first_added_to_board_at: Time.current) } }
+ let_it_be(:record_without_data) { create(:issue) }
+ end
end
diff --git a/spec/lib/gitlab/analytics/cycle_analytics/stage_events/merge_request_created_spec.rb b/spec/lib/gitlab/analytics/cycle_analytics/stage_events/merge_request_created_spec.rb
index 281cc31c9e0..1139f9099cb 100644
--- a/spec/lib/gitlab/analytics/cycle_analytics/stage_events/merge_request_created_spec.rb
+++ b/spec/lib/gitlab/analytics/cycle_analytics/stage_events/merge_request_created_spec.rb
@@ -4,4 +4,8 @@ require 'spec_helper'
RSpec.describe Gitlab::Analytics::CycleAnalytics::StageEvents::MergeRequestCreated do
it_behaves_like 'value stream analytics event'
+
+ it_behaves_like 'LEFT JOIN-able value stream analytics event' do
+ let_it_be(:record_with_data) { create(:merge_request) }
+ end
end
diff --git a/spec/lib/gitlab/analytics/cycle_analytics/stage_events/merge_request_first_deployed_to_production_spec.rb b/spec/lib/gitlab/analytics/cycle_analytics/stage_events/merge_request_first_deployed_to_production_spec.rb
index e1dd2e56e2b..a62facb6974 100644
--- a/spec/lib/gitlab/analytics/cycle_analytics/stage_events/merge_request_first_deployed_to_production_spec.rb
+++ b/spec/lib/gitlab/analytics/cycle_analytics/stage_events/merge_request_first_deployed_to_production_spec.rb
@@ -4,4 +4,9 @@ require 'spec_helper'
RSpec.describe Gitlab::Analytics::CycleAnalytics::StageEvents::MergeRequestFirstDeployedToProduction do
it_behaves_like 'value stream analytics event'
+
+ it_behaves_like 'LEFT JOIN-able value stream analytics event' do
+ let_it_be(:record_with_data) { create(:merge_request).tap { |mr| mr.metrics.update!(first_deployed_to_production_at: Time.current) } }
+ let_it_be(:record_without_data) { create(:merge_request) }
+ end
end
diff --git a/spec/lib/gitlab/analytics/cycle_analytics/stage_events/merge_request_last_build_finished_spec.rb b/spec/lib/gitlab/analytics/cycle_analytics/stage_events/merge_request_last_build_finished_spec.rb
index 51324966f26..c5cfe43895e 100644
--- a/spec/lib/gitlab/analytics/cycle_analytics/stage_events/merge_request_last_build_finished_spec.rb
+++ b/spec/lib/gitlab/analytics/cycle_analytics/stage_events/merge_request_last_build_finished_spec.rb
@@ -4,4 +4,9 @@ require 'spec_helper'
RSpec.describe Gitlab::Analytics::CycleAnalytics::StageEvents::MergeRequestLastBuildFinished do
it_behaves_like 'value stream analytics event'
+
+ it_behaves_like 'LEFT JOIN-able value stream analytics event' do
+ let_it_be(:record_with_data) { create(:merge_request).tap { |mr| mr.metrics.update!(latest_build_finished_at: Time.current) } }
+ let_it_be(:record_without_data) { create(:merge_request) }
+ end
end
diff --git a/spec/lib/gitlab/analytics/cycle_analytics/stage_events/merge_request_last_build_started_spec.rb b/spec/lib/gitlab/analytics/cycle_analytics/stage_events/merge_request_last_build_started_spec.rb
index 10dcaf23b81..6f8a82a9ae5 100644
--- a/spec/lib/gitlab/analytics/cycle_analytics/stage_events/merge_request_last_build_started_spec.rb
+++ b/spec/lib/gitlab/analytics/cycle_analytics/stage_events/merge_request_last_build_started_spec.rb
@@ -4,4 +4,9 @@ require 'spec_helper'
RSpec.describe Gitlab::Analytics::CycleAnalytics::StageEvents::MergeRequestLastBuildStarted do
it_behaves_like 'value stream analytics event'
+
+ it_behaves_like 'LEFT JOIN-able value stream analytics event' do
+ let_it_be(:record_with_data) { create(:merge_request).tap { |mr| mr.metrics.update!(latest_build_started_at: Time.current) } }
+ let_it_be(:record_without_data) { create(:merge_request) }
+ end
end
diff --git a/spec/lib/gitlab/analytics/cycle_analytics/stage_events/merge_request_merged_spec.rb b/spec/lib/gitlab/analytics/cycle_analytics/stage_events/merge_request_merged_spec.rb
index 6e20eb73ed9..0060ed0fd48 100644
--- a/spec/lib/gitlab/analytics/cycle_analytics/stage_events/merge_request_merged_spec.rb
+++ b/spec/lib/gitlab/analytics/cycle_analytics/stage_events/merge_request_merged_spec.rb
@@ -4,4 +4,9 @@ require 'spec_helper'
RSpec.describe Gitlab::Analytics::CycleAnalytics::StageEvents::MergeRequestMerged do
it_behaves_like 'value stream analytics event'
+
+ it_behaves_like 'LEFT JOIN-able value stream analytics event' do
+ let_it_be(:record_with_data) { create(:merge_request).tap { |mr| mr.metrics.update!(merged_at: Time.current) } }
+ let_it_be(:record_without_data) { create(:merge_request) }
+ end
end
diff --git a/spec/lib/gitlab/analytics/cycle_analytics/stage_events/plan_stage_start_spec.rb b/spec/lib/gitlab/analytics/cycle_analytics/stage_events/plan_stage_start_spec.rb
index b8c68003127..379d59e4c5e 100644
--- a/spec/lib/gitlab/analytics/cycle_analytics/stage_events/plan_stage_start_spec.rb
+++ b/spec/lib/gitlab/analytics/cycle_analytics/stage_events/plan_stage_start_spec.rb
@@ -21,4 +21,9 @@ RSpec.describe Gitlab::Analytics::CycleAnalytics::StageEvents::PlanStageStart do
expect(records).to match_array([issue1, issue2])
expect(records).not_to include(issue_without_metrics)
end
+
+ it_behaves_like 'LEFT JOIN-able value stream analytics event' do
+ let_it_be(:record_with_data) { create(:issue).tap { |i| i.metrics.update!(first_added_to_board_at: Time.current) } }
+ let_it_be(:record_without_data) { create(:issue) }
+ end
end
diff --git a/spec/lib/gitlab/application_rate_limiter_spec.rb b/spec/lib/gitlab/application_rate_limiter_spec.rb
index 2525b1ce41e..0fb99688d27 100644
--- a/spec/lib/gitlab/application_rate_limiter_spec.rb
+++ b/spec/lib/gitlab/application_rate_limiter_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Gitlab::ApplicationRateLimiter, :clean_gitlab_redis_cache do
+RSpec.describe Gitlab::ApplicationRateLimiter do
let(:redis) { double('redis') }
let(:user) { create(:user) }
let(:project) { create(:project) }
@@ -20,7 +20,7 @@ RSpec.describe Gitlab::ApplicationRateLimiter, :clean_gitlab_redis_cache do
subject { described_class }
before do
- allow(Gitlab::Redis::Cache).to receive(:with).and_yield(redis)
+ allow(Gitlab::Redis::RateLimiting).to receive(:with).and_yield(redis)
allow(described_class).to receive(:rate_limits).and_return(rate_limits)
end
@@ -106,9 +106,9 @@ RSpec.describe Gitlab::ApplicationRateLimiter, :clean_gitlab_redis_cache do
let(:attributes) do
base_attributes.merge({
- user_id: current_user.id,
- username: current_user.username
- })
+ user_id: current_user.id,
+ username: current_user.username
+ })
end
it 'logs information to auth.log' do
diff --git a/spec/lib/gitlab/auth/request_authenticator_spec.rb b/spec/lib/gitlab/auth/request_authenticator_spec.rb
index 2543eb3a5e9..6f3d6187076 100644
--- a/spec/lib/gitlab/auth/request_authenticator_spec.rb
+++ b/spec/lib/gitlab/auth/request_authenticator_spec.rb
@@ -3,6 +3,8 @@
require 'spec_helper'
RSpec.describe Gitlab::Auth::RequestAuthenticator do
+ include DependencyProxyHelpers
+
let(:env) do
{
'rack.input' => '',
@@ -15,8 +17,8 @@ RSpec.describe Gitlab::Auth::RequestAuthenticator do
subject { described_class.new(request) }
describe '#user' do
- let!(:sessionless_user) { build(:user) }
- let!(:session_user) { build(:user) }
+ let_it_be(:sessionless_user) { build(:user) }
+ let_it_be(:session_user) { build(:user) }
it 'returns sessionless user first' do
allow_any_instance_of(described_class).to receive(:find_sessionless_user).and_return(sessionless_user)
@@ -41,15 +43,25 @@ RSpec.describe Gitlab::Auth::RequestAuthenticator do
end
describe '#find_sessionless_user' do
- let!(:access_token_user) { build(:user) }
- let!(:feed_token_user) { build(:user) }
- let!(:static_object_token_user) { build(:user) }
- let!(:job_token_user) { build(:user) }
- let!(:lfs_token_user) { build(:user) }
- let!(:basic_auth_access_token_user) { build(:user) }
- let!(:basic_auth_password_user) { build(:user) }
-
- it 'returns access_token user first' do
+ let_it_be(:dependency_proxy_user) { build(:user) }
+ let_it_be(:access_token_user) { build(:user) }
+ let_it_be(:feed_token_user) { build(:user) }
+ let_it_be(:static_object_token_user) { build(:user) }
+ let_it_be(:job_token_user) { build(:user) }
+ let_it_be(:lfs_token_user) { build(:user) }
+ let_it_be(:basic_auth_access_token_user) { build(:user) }
+ let_it_be(:basic_auth_password_user) { build(:user) }
+
+ it 'returns dependency_proxy user first' do
+ allow_any_instance_of(described_class).to receive(:find_user_from_dependency_proxy_token)
+ .and_return(dependency_proxy_user)
+
+ allow_any_instance_of(described_class).to receive(:find_user_from_web_access_token).and_return(access_token_user)
+
+ expect(subject.find_sessionless_user(:api)).to eq dependency_proxy_user
+ end
+
+ it 'returns access_token user if no dependency_proxy user found' do
allow_any_instance_of(described_class).to receive(:find_user_from_web_access_token)
.with(anything, scopes: [:api, :read_api])
.and_return(access_token_user)
@@ -154,6 +166,75 @@ RSpec.describe Gitlab::Auth::RequestAuthenticator do
expect(subject.find_sessionless_user(:api)).to be_blank
end
+
+ context 'dependency proxy' do
+ let_it_be(:dependency_proxy_user) { create(:user) }
+
+ let(:token) { build_jwt(dependency_proxy_user).encoded }
+ let(:authenticator) { described_class.new(request) }
+
+ subject { authenticator.find_sessionless_user(:api) }
+
+ before do
+ env['SCRIPT_NAME'] = accessed_path
+ env['HTTP_AUTHORIZATION'] = "Bearer #{token}"
+ end
+
+ shared_examples 'identifying dependency proxy urls properly with' do |user_type|
+ context 'with pulling a manifest' do
+ let(:accessed_path) { '/v2/group1/dependency_proxy/containers/alpine/manifests/latest' }
+
+ it { is_expected.to eq(dependency_proxy_user) } if user_type == :user
+ it { is_expected.to eq(nil) } if user_type == :no_user
+ end
+
+ context 'with pulling a blob' do
+ let(:accessed_path) { '/v2/group1/dependency_proxy/containers/alpine/blobs/sha256:a0d0a0d46f8b52473982a3c466318f479767577551a53ffc9074c9fa7035982e' }
+
+ it { is_expected.to eq(dependency_proxy_user) } if user_type == :user
+ it { is_expected.to eq(nil) } if user_type == :no_user
+ end
+
+ context 'with any other path' do
+ let(:accessed_path) { '/foo/bar' }
+
+ it { is_expected.to eq(nil) }
+ end
+ end
+
+ context 'with a user' do
+ it_behaves_like 'identifying dependency proxy urls properly with', :user
+
+ context 'with an invalid id' do
+ let(:token) { build_jwt { |jwt| jwt['user_id'] = 'this_is_not_a_user' } }
+
+ it_behaves_like 'identifying dependency proxy urls properly with', :no_user
+ end
+ end
+
+ context 'with a deploy token' do
+ let_it_be(:dependency_proxy_user) { create(:deploy_token) }
+
+ it_behaves_like 'identifying dependency proxy urls properly with', :no_user
+ end
+
+ context 'with no jwt token' do
+ let(:token) { nil }
+
+ it_behaves_like 'identifying dependency proxy urls properly with', :no_user
+ end
+
+ context 'with an expired jwt token' do
+ let(:token) { build_jwt(dependency_proxy_user).encoded }
+ let(:accessed_path) { '/v2/group1/dependency_proxy/containers/alpine/manifests/latest' }
+
+ it 'returns nil' do
+ travel_to(Time.zone.now + Auth::DependencyProxyAuthenticationService.token_expire_at + 1.minute) do
+ expect(subject).to eq(nil)
+ end
+ end
+ end
+ end
end
describe '#find_personal_access_token_from_http_basic_auth' do
@@ -201,8 +282,8 @@ RSpec.describe Gitlab::Auth::RequestAuthenticator do
end
describe '#find_user_from_job_token' do
- let!(:user) { build(:user) }
- let!(:job) { build(:ci_build, user: user, status: :running) }
+ let_it_be(:user) { build(:user) }
+ let_it_be(:job) { build(:ci_build, user: user, status: :running) }
before do
env[Gitlab::Auth::AuthFinders::JOB_TOKEN_HEADER] = 'token'
@@ -239,7 +320,7 @@ RSpec.describe Gitlab::Auth::RequestAuthenticator do
end
describe '#runner' do
- let!(:runner) { build(:ci_runner) }
+ let_it_be(:runner) { build(:ci_runner) }
it 'returns the runner using #find_runner_from_token' do
expect_any_instance_of(described_class)
diff --git a/spec/lib/gitlab/background_migration/fix_first_mentioned_in_commit_at_spec.rb b/spec/lib/gitlab/background_migration/fix_first_mentioned_in_commit_at_spec.rb
new file mode 100644
index 00000000000..d2bfa86f0d1
--- /dev/null
+++ b/spec/lib/gitlab/background_migration/fix_first_mentioned_in_commit_at_spec.rb
@@ -0,0 +1,140 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::BackgroundMigration::FixFirstMentionedInCommitAt, :migration, schema: 20211004110500 do
+ let(:namespaces) { table(:namespaces) }
+ let(:projects) { table(:projects) }
+ let(:users) { table(:users) }
+ let(:merge_requests) { table(:merge_requests) }
+ let(:issues) { table(:issues) }
+ let(:issue_metrics) { table(:issue_metrics) }
+ let(:merge_requests_closing_issues) { table(:merge_requests_closing_issues) }
+ let(:diffs) { table(:merge_request_diffs) }
+ let(:ten_days_ago) { 10.days.ago }
+ let(:commits) do
+ table(:merge_request_diff_commits).tap do |t|
+ t.extend(SuppressCompositePrimaryKeyWarning)
+ end
+ end
+
+ let(:namespace) { namespaces.create!(name: 'ns', path: 'ns') }
+ let(:project) { projects.create!(namespace_id: namespace.id) }
+
+ let!(:issue1) do
+ issues.create!(
+ title: 'issue',
+ description: 'description',
+ project_id: project.id
+ )
+ end
+
+ let!(:issue2) do
+ issues.create!(
+ title: 'issue',
+ description: 'description',
+ project_id: project.id
+ )
+ end
+
+ let!(:merge_request1) do
+ merge_requests.create!(
+ source_branch: 'a',
+ target_branch: 'master',
+ target_project_id: project.id
+ )
+ end
+
+ let!(:merge_request2) do
+ merge_requests.create!(
+ source_branch: 'b',
+ target_branch: 'master',
+ target_project_id: project.id
+ )
+ end
+
+ let!(:merge_request_closing_issue1) do
+ merge_requests_closing_issues.create!(issue_id: issue1.id, merge_request_id: merge_request1.id)
+ end
+
+ let!(:merge_request_closing_issue2) do
+ merge_requests_closing_issues.create!(issue_id: issue2.id, merge_request_id: merge_request2.id)
+ end
+
+ let!(:diff1) { diffs.create!(merge_request_id: merge_request1.id) }
+ let!(:diff2) { diffs.create!(merge_request_id: merge_request1.id) }
+
+ let!(:other_diff) { diffs.create!(merge_request_id: merge_request2.id) }
+
+ let!(:commit1) do
+ commits.create!(
+ merge_request_diff_id: diff2.id,
+ relative_order: 0,
+ sha: Gitlab::Database::ShaAttribute.serialize('aaa'),
+ authored_date: 5.days.ago
+ )
+ end
+
+ let!(:commit2) do
+ commits.create!(
+ merge_request_diff_id: diff2.id,
+ relative_order: 1,
+ sha: Gitlab::Database::ShaAttribute.serialize('aaa'),
+ authored_date: 10.days.ago
+ )
+ end
+
+ let!(:commit3) do
+ commits.create!(
+ merge_request_diff_id: other_diff.id,
+ relative_order: 1,
+ sha: Gitlab::Database::ShaAttribute.serialize('aaa'),
+ authored_date: 5.days.ago
+ )
+ end
+
+ def run_migration
+ described_class
+ .new
+ .perform(issue_metrics.minimum(:issue_id), issue_metrics.maximum(:issue_id))
+ end
+
+ it "marks successful slices as completed" do
+ min_issue_id = issue_metrics.minimum(:issue_id)
+ max_issue_id = issue_metrics.maximum(:issue_id)
+
+ expect(subject).to receive(:mark_job_as_succeeded).with(min_issue_id, max_issue_id)
+
+ subject.perform(min_issue_id, max_issue_id)
+ end
+
+ context 'when the persisted first_mentioned_in_commit_at is later than the first commit authored_date' do
+ it 'updates the issue_metrics record' do
+ record1 = issue_metrics.create!(issue_id: issue1.id, first_mentioned_in_commit_at: Time.current)
+ record2 = issue_metrics.create!(issue_id: issue2.id, first_mentioned_in_commit_at: Time.current)
+
+ run_migration
+ record1.reload
+ record2.reload
+
+ expect(record1.first_mentioned_in_commit_at).to be_within(2.seconds).of(commit2.authored_date)
+ expect(record2.first_mentioned_in_commit_at).to be_within(2.seconds).of(commit3.authored_date)
+ end
+ end
+
+ context 'when the persisted first_mentioned_in_commit_at is earlier than the first commit authored_date' do
+ it 'does not update the issue_metrics record' do
+ record = issue_metrics.create!(issue_id: issue1.id, first_mentioned_in_commit_at: 20.days.ago)
+
+ expect { run_migration }.not_to change { record.reload.first_mentioned_in_commit_at }
+ end
+ end
+
+ context 'when the first_mentioned_in_commit_at is null' do
+ it 'does nothing' do
+ record = issue_metrics.create!(issue_id: issue1.id, first_mentioned_in_commit_at: nil)
+
+ expect { run_migration }.not_to change { record.reload.first_mentioned_in_commit_at }
+ end
+ end
+end
diff --git a/spec/lib/gitlab/background_migration/fix_promoted_epics_discussion_ids_spec.rb b/spec/lib/gitlab/background_migration/fix_promoted_epics_discussion_ids_spec.rb
index 452fc962c7b..35ec8be691a 100644
--- a/spec/lib/gitlab/background_migration/fix_promoted_epics_discussion_ids_spec.rb
+++ b/spec/lib/gitlab/background_migration/fix_promoted_epics_discussion_ids_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Gitlab::BackgroundMigration::FixPromotedEpicsDiscussionIds, schema: 20190715193142 do
+RSpec.describe Gitlab::BackgroundMigration::FixPromotedEpicsDiscussionIds, schema: 20181228175414 do
let(:namespaces) { table(:namespaces) }
let(:users) { table(:users) }
let(:epics) { table(:epics) }
diff --git a/spec/lib/gitlab/background_migration/fix_user_namespace_names_spec.rb b/spec/lib/gitlab/background_migration/fix_user_namespace_names_spec.rb
index 0d0ad2cc39e..95509f9b897 100644
--- a/spec/lib/gitlab/background_migration/fix_user_namespace_names_spec.rb
+++ b/spec/lib/gitlab/background_migration/fix_user_namespace_names_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Gitlab::BackgroundMigration::FixUserNamespaceNames, schema: 20190620112608 do
+RSpec.describe Gitlab::BackgroundMigration::FixUserNamespaceNames, schema: 20181228175414 do
let(:namespaces) { table(:namespaces) }
let(:users) { table(:users) }
let(:user) { users.create!(name: "The user's full name", projects_limit: 10, username: 'not-null', email: '1') }
diff --git a/spec/lib/gitlab/background_migration/fix_user_project_route_names_spec.rb b/spec/lib/gitlab/background_migration/fix_user_project_route_names_spec.rb
index 211693d917b..b4444df674e 100644
--- a/spec/lib/gitlab/background_migration/fix_user_project_route_names_spec.rb
+++ b/spec/lib/gitlab/background_migration/fix_user_project_route_names_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Gitlab::BackgroundMigration::FixUserProjectRouteNames, schema: 20190620112608 do
+RSpec.describe Gitlab::BackgroundMigration::FixUserProjectRouteNames, schema: 20181228175414 do
let(:namespaces) { table(:namespaces) }
let(:users) { table(:users) }
let(:routes) { table(:routes) }
diff --git a/spec/lib/gitlab/background_migration/migrate_null_private_profile_to_false_spec.rb b/spec/lib/gitlab/background_migration/migrate_null_private_profile_to_false_spec.rb
deleted file mode 100644
index 6ff1157cb86..00000000000
--- a/spec/lib/gitlab/background_migration/migrate_null_private_profile_to_false_spec.rb
+++ /dev/null
@@ -1,23 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Gitlab::BackgroundMigration::MigrateNullPrivateProfileToFalse, schema: 20190620105427 do
- let(:users) { table(:users) }
-
- it 'correctly migrates nil private_profile to false' do
- private_profile_true = users.create!(private_profile: true, projects_limit: 1, email: 'a@b.com')
- private_profile_false = users.create!(private_profile: false, projects_limit: 1, email: 'b@c.com')
- private_profile_nil = users.create!(private_profile: nil, projects_limit: 1, email: 'c@d.com')
-
- described_class.new.perform(private_profile_true.id, private_profile_nil.id)
-
- private_profile_true.reload
- private_profile_false.reload
- private_profile_nil.reload
-
- expect(private_profile_true.private_profile).to eq(true)
- expect(private_profile_false.private_profile).to eq(false)
- expect(private_profile_nil.private_profile).to eq(false)
- end
-end
diff --git a/spec/lib/gitlab/background_migration/migrate_pages_metadata_spec.rb b/spec/lib/gitlab/background_migration/migrate_pages_metadata_spec.rb
index 815dc2e73e5..b6d93b9ff54 100644
--- a/spec/lib/gitlab/background_migration/migrate_pages_metadata_spec.rb
+++ b/spec/lib/gitlab/background_migration/migrate_pages_metadata_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Gitlab::BackgroundMigration::MigratePagesMetadata, schema: 20190919040324 do
+RSpec.describe Gitlab::BackgroundMigration::MigratePagesMetadata, schema: 20181228175414 do
let(:projects) { table(:projects) }
subject(:migrate_pages_metadata) { described_class.new }
diff --git a/spec/lib/gitlab/background_migration/populate_merge_request_assignees_table_spec.rb b/spec/lib/gitlab/background_migration/populate_merge_request_assignees_table_spec.rb
index 4e7872a9a1b..1d8eed53553 100644
--- a/spec/lib/gitlab/background_migration/populate_merge_request_assignees_table_spec.rb
+++ b/spec/lib/gitlab/background_migration/populate_merge_request_assignees_table_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Gitlab::BackgroundMigration::PopulateMergeRequestAssigneesTable, schema: 20190315191339 do
+RSpec.describe Gitlab::BackgroundMigration::PopulateMergeRequestAssigneesTable, schema: 20181228175414 do
let(:namespaces) { table(:namespaces) }
let(:projects) { table(:projects) }
let(:users) { table(:users) }
diff --git a/spec/lib/gitlab/background_migration/populate_topics_total_projects_count_cache_spec.rb b/spec/lib/gitlab/background_migration/populate_topics_total_projects_count_cache_spec.rb
new file mode 100644
index 00000000000..8e07b43f5b9
--- /dev/null
+++ b/spec/lib/gitlab/background_migration/populate_topics_total_projects_count_cache_spec.rb
@@ -0,0 +1,35 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::BackgroundMigration::PopulateTopicsTotalProjectsCountCache, schema: 20211006060436 do
+ it 'correctly populates total projects count cache' do
+ namespaces = table(:namespaces)
+ projects = table(:projects)
+ topics = table(:topics)
+ project_topics = table(:project_topics)
+
+ group = namespaces.create!(name: 'group', path: 'group')
+ project_1 = projects.create!(namespace_id: group.id)
+ project_2 = projects.create!(namespace_id: group.id)
+ project_3 = projects.create!(namespace_id: group.id)
+ topic_1 = topics.create!(name: 'Topic1')
+ topic_2 = topics.create!(name: 'Topic2')
+ topic_3 = topics.create!(name: 'Topic3')
+ topic_4 = topics.create!(name: 'Topic4')
+
+ project_topics.create!(project_id: project_1.id, topic_id: topic_1.id)
+ project_topics.create!(project_id: project_1.id, topic_id: topic_3.id)
+ project_topics.create!(project_id: project_2.id, topic_id: topic_3.id)
+ project_topics.create!(project_id: project_1.id, topic_id: topic_4.id)
+ project_topics.create!(project_id: project_2.id, topic_id: topic_4.id)
+ project_topics.create!(project_id: project_3.id, topic_id: topic_4.id)
+
+ subject.perform(topic_1.id, topic_4.id)
+
+ expect(topic_1.reload.total_projects_count).to eq(1)
+ expect(topic_2.reload.total_projects_count).to eq(0)
+ expect(topic_3.reload.total_projects_count).to eq(2)
+ expect(topic_4.reload.total_projects_count).to eq(3)
+ end
+end
diff --git a/spec/lib/gitlab/backtrace_cleaner_spec.rb b/spec/lib/gitlab/backtrace_cleaner_spec.rb
index 51d99bf5f74..e46a90e8606 100644
--- a/spec/lib/gitlab/backtrace_cleaner_spec.rb
+++ b/spec/lib/gitlab/backtrace_cleaner_spec.rb
@@ -22,9 +22,6 @@ RSpec.describe Gitlab::BacktraceCleaner do
"lib/gitlab/git/repository.rb:1451:in `gitaly_migrate'",
"lib/gitlab/git/commit.rb:66:in `find'",
"app/models/repository.rb:1047:in `find_commit'",
- "lib/gitlab/metrics/instrumentation.rb:159:in `block in find_commit'",
- "lib/gitlab/metrics/method_call.rb:36:in `measure'",
- "lib/gitlab/metrics/instrumentation.rb:159:in `find_commit'",
"app/models/repository.rb:113:in `commit'",
"lib/gitlab/i18n.rb:50:in `with_locale'",
"lib/gitlab/middleware/multipart.rb:95:in `call'",
diff --git a/spec/lib/gitlab/cache/import/caching_spec.rb b/spec/lib/gitlab/cache/import/caching_spec.rb
index f770960e27a..946a7c604a1 100644
--- a/spec/lib/gitlab/cache/import/caching_spec.rb
+++ b/spec/lib/gitlab/cache/import/caching_spec.rb
@@ -58,6 +58,16 @@ RSpec.describe Gitlab::Cache::Import::Caching, :clean_gitlab_redis_cache do
end
end
+ describe '.increment' do
+ it 'increment a key and returns the current value' do
+ expect(described_class.increment('foo')).to eq(1)
+
+ value = Gitlab::Redis::Cache.with { |r| r.get(described_class.cache_key_for('foo')) }
+
+ expect(value.to_i).to eq(1)
+ end
+ end
+
describe '.set_add' do
it 'adds a value to a set' do
described_class.set_add('foo', 10)
diff --git a/spec/lib/gitlab/chat/command_spec.rb b/spec/lib/gitlab/chat/command_spec.rb
index d99c07d1fa3..c8b4b3f73b2 100644
--- a/spec/lib/gitlab/chat/command_spec.rb
+++ b/spec/lib/gitlab/chat/command_spec.rb
@@ -72,6 +72,7 @@ RSpec.describe Gitlab::Chat::Command do
expect(vars['CHAT_INPUT']).to eq('foo')
expect(vars['CHAT_CHANNEL']).to eq('123')
+ expect(vars['CHAT_USER_ID']).to eq(chat_name.chat_id)
end
end
end
diff --git a/spec/lib/gitlab/checks/matching_merge_request_spec.rb b/spec/lib/gitlab/checks/matching_merge_request_spec.rb
index 2e562a5a350..c65a1e4d656 100644
--- a/spec/lib/gitlab/checks/matching_merge_request_spec.rb
+++ b/spec/lib/gitlab/checks/matching_merge_request_spec.rb
@@ -31,33 +31,30 @@ RSpec.describe Gitlab::Checks::MatchingMergeRequest do
expect(matcher.match?).to be false
end
- context 'with load balancing disabled', :request_store, :redis do
- before do
- expect(::Gitlab::Database::LoadBalancing).to receive(:enable?).at_least(:once).and_return(false)
- expect(::Gitlab::Database::LoadBalancing::Sticking).not_to receive(:unstick_or_continue_sticking)
- expect(::Gitlab::Database::LoadBalancing::Sticking).not_to receive(:select_valid_replicas)
- end
-
- it 'does not attempt to stick to primary' do
- expect(subject.match?).to be true
- end
-
- it 'increments no counters' do
- expect { subject.match? }
- .to change { total_counter.get }.by(0)
- .and change { stale_counter.get }.by(0)
- end
- end
-
- context 'with load balancing enabled', :db_load_balancing do
+ context 'with load balancing enabled' do
let(:session) { ::Gitlab::Database::LoadBalancing::Session.current }
let(:all_caught_up) { true }
before do
- allow(::Gitlab::Database::LoadBalancing::Sticking).to receive(:all_caught_up?).and_return(all_caught_up)
+ Gitlab::Database::LoadBalancing::Session.clear_session
+
+ allow(::ApplicationRecord.sticking)
+ .to receive(:all_caught_up?)
+ .and_return(all_caught_up)
+
+ expect(::ApplicationRecord.sticking)
+ .to receive(:select_valid_host)
+ .with(:project, project.id)
+ .and_call_original
+
+ allow(::ApplicationRecord.sticking)
+ .to receive(:select_caught_up_replicas)
+ .with(:project, project.id)
+ .and_return(all_caught_up)
+ end
- expect(::Gitlab::Database::LoadBalancing::Sticking).to receive(:select_valid_host).with(:project, project.id).and_call_original
- allow(::Gitlab::Database::LoadBalancing::Sticking).to receive(:select_caught_up_replicas).with(:project, project.id).and_return(all_caught_up)
+ after do
+ Gitlab::Database::LoadBalancing::Session.clear_session
end
shared_examples 'secondary that has caught up to a primary' do
diff --git a/spec/lib/gitlab/ci/build/auto_retry_spec.rb b/spec/lib/gitlab/ci/build/auto_retry_spec.rb
index e83e1326206..fc5999d59ac 100644
--- a/spec/lib/gitlab/ci/build/auto_retry_spec.rb
+++ b/spec/lib/gitlab/ci/build/auto_retry_spec.rb
@@ -24,6 +24,7 @@ RSpec.describe Gitlab::Ci::Build::AutoRetry do
"default for scheduler failure" | 1 | {} | :scheduler_failure | true
"quota is exceeded" | 0 | { max: 2 } | :ci_quota_exceeded | false
"no matching runner" | 0 | { max: 2 } | :no_matching_runner | false
+ "missing dependencies" | 0 | { max: 2 } | :missing_dependency_failure | false
end
with_them do
diff --git a/spec/lib/gitlab/ci/config/entry/retry_spec.rb b/spec/lib/gitlab/ci/config/entry/retry_spec.rb
index b38387a437e..84ef5344a8b 100644
--- a/spec/lib/gitlab/ci/config/entry/retry_spec.rb
+++ b/spec/lib/gitlab/ci/config/entry/retry_spec.rb
@@ -101,7 +101,6 @@ RSpec.describe Gitlab::Ci::Config::Entry::Retry do
api_failure
stuck_or_timeout_failure
runner_system_failure
- missing_dependency_failure
runner_unsupported
stale_schedule
job_execution_timeout
diff --git a/spec/lib/gitlab/ci/config/external/mapper_spec.rb b/spec/lib/gitlab/ci/config/external/mapper_spec.rb
index a471997e43a..cebe8984741 100644
--- a/spec/lib/gitlab/ci/config/external/mapper_spec.rb
+++ b/spec/lib/gitlab/ci/config/external/mapper_spec.rb
@@ -363,17 +363,6 @@ RSpec.describe Gitlab::Ci::Config::External::Mapper do
expect(subject).to contain_exactly(an_instance_of(Gitlab::Ci::Config::External::File::Remote),
an_instance_of(Gitlab::Ci::Config::External::File::Local))
end
-
- context 'when the FF ci_include_rules is disabled' do
- before do
- stub_feature_flags(ci_include_rules: false)
- end
-
- it 'includes the file' do
- expect(subject).to contain_exactly(an_instance_of(Gitlab::Ci::Config::External::File::Remote),
- an_instance_of(Gitlab::Ci::Config::External::File::Local))
- end
- end
end
context 'when the rules does not match' do
@@ -382,17 +371,6 @@ RSpec.describe Gitlab::Ci::Config::External::Mapper do
it 'does not include the file' do
expect(subject).to contain_exactly(an_instance_of(Gitlab::Ci::Config::External::File::Remote))
end
-
- context 'when the FF ci_include_rules is disabled' do
- before do
- stub_feature_flags(ci_include_rules: false)
- end
-
- it 'includes the file' do
- expect(subject).to contain_exactly(an_instance_of(Gitlab::Ci::Config::External::File::Remote),
- an_instance_of(Gitlab::Ci::Config::External::File::Local))
- end
- end
end
end
end
diff --git a/spec/lib/gitlab/ci/config/external/processor_spec.rb b/spec/lib/gitlab/ci/config/external/processor_spec.rb
index e032d372ecb..c2f28253f54 100644
--- a/spec/lib/gitlab/ci/config/external/processor_spec.rb
+++ b/spec/lib/gitlab/ci/config/external/processor_spec.rb
@@ -402,5 +402,17 @@ RSpec.describe Gitlab::Ci::Config::External::Processor do
expect(output.keys).to match_array([:image, :my_build, :my_test])
end
end
+
+ context 'when rules defined' do
+ context 'when a rule is invalid' do
+ let(:values) do
+ { include: [{ local: 'builds.yml', rules: [{ exists: ['$MY_VAR'] }] }] }
+ end
+
+ it 'raises IncludeError' do
+ expect { subject }.to raise_error(described_class::IncludeError, /invalid include rule/)
+ end
+ end
+ end
end
end
diff --git a/spec/lib/gitlab/ci/config/external/rules_spec.rb b/spec/lib/gitlab/ci/config/external/rules_spec.rb
index 89ea13d710d..9a5c29befa2 100644
--- a/spec/lib/gitlab/ci/config/external/rules_spec.rb
+++ b/spec/lib/gitlab/ci/config/external/rules_spec.rb
@@ -16,7 +16,7 @@ RSpec.describe Gitlab::Ci::Config::External::Rules do
it { is_expected.to eq(true) }
end
- context 'when there is a rule' do
+ context 'when there is a rule with if' do
let(:rule_hashes) { [{ if: '$MY_VAR == "hello"' }] }
context 'when the rule matches' do
@@ -31,5 +31,23 @@ RSpec.describe Gitlab::Ci::Config::External::Rules do
it { is_expected.to eq(false) }
end
end
+
+ context 'when there is a rule with if and when' do
+ let(:rule_hashes) { [{ if: '$MY_VAR == "hello"', when: 'on_success' }] }
+
+ it 'raises an error' do
+ expect { result }.to raise_error(described_class::InvalidIncludeRulesError,
+ 'invalid include rule: {:if=>"$MY_VAR == \"hello\"", :when=>"on_success"}')
+ end
+ end
+
+ context 'when there is a rule with exists' do
+ let(:rule_hashes) { [{ exists: ['$MY_VAR'] }] }
+
+ it 'raises an error' do
+ expect { result }.to raise_error(described_class::InvalidIncludeRulesError,
+ 'invalid include rule: {:exists=>["$MY_VAR"]}')
+ end
+ end
end
end
diff --git a/spec/lib/gitlab/ci/pipeline/seed/build_spec.rb b/spec/lib/gitlab/ci/pipeline/seed/build_spec.rb
index 0c28515b574..3aa6b2e3c05 100644
--- a/spec/lib/gitlab/ci/pipeline/seed/build_spec.rb
+++ b/spec/lib/gitlab/ci/pipeline/seed/build_spec.rb
@@ -440,17 +440,30 @@ RSpec.describe Gitlab::Ci::Pipeline::Seed::Build do
context 'when the environment name is invalid' do
let(:attributes) { { name: 'deploy', ref: 'master', environment: '!!!' } }
- it_behaves_like 'non-deployment job'
- it_behaves_like 'ensures environment inexistence'
+ it 'fails the job with a failure reason and does not create an environment' do
+ expect(subject).to be_failed
+ expect(subject).to be_environment_creation_failure
+ expect(subject.metadata.expanded_environment_name).to be_nil
+ expect(Environment.exists?(name: expected_environment_name)).to eq(false)
+ end
+
+ context 'when surface_environment_creation_failure feature flag is disabled' do
+ before do
+ stub_feature_flags(surface_environment_creation_failure: false)
+ end
- it 'tracks an exception' do
- expect(Gitlab::ErrorTracking).to receive(:track_exception)
- .with(an_instance_of(described_class::EnvironmentCreationFailure),
- project_id: project.id,
- reason: %q{Name can contain only letters, digits, '-', '_', '/', '$', '{', '}', '.', and spaces, but it cannot start or end with '/'})
- .once
+ it_behaves_like 'non-deployment job'
+ it_behaves_like 'ensures environment inexistence'
- subject
+ it 'tracks an exception' do
+ expect(Gitlab::ErrorTracking).to receive(:track_exception)
+ .with(an_instance_of(described_class::EnvironmentCreationFailure),
+ project_id: project.id,
+ reason: %q{Name can contain only letters, digits, '-', '_', '/', '$', '{', '}', '.', and spaces, but it cannot start or end with '/'})
+ .once
+
+ subject
+ end
end
end
end
diff --git a/spec/lib/gitlab/ci/reports/security/flag_spec.rb b/spec/lib/gitlab/ci/reports/security/flag_spec.rb
index 27f83694ac2..d677425a8da 100644
--- a/spec/lib/gitlab/ci/reports/security/flag_spec.rb
+++ b/spec/lib/gitlab/ci/reports/security/flag_spec.rb
@@ -18,9 +18,9 @@ RSpec.describe Gitlab::Ci::Reports::Security::Flag do
end
end
- describe '#to_hash' do
+ describe '#to_h' do
it 'returns expected hash' do
- expect(security_flag.to_hash).to eq(
+ expect(security_flag.to_h).to eq(
{
flag_type: :false_positive,
origin: 'post analyzer X',
diff --git a/spec/lib/gitlab/ci/templates/templates_spec.rb b/spec/lib/gitlab/ci/templates/templates_spec.rb
index 81fc66c4a11..cdda7e953d0 100644
--- a/spec/lib/gitlab/ci/templates/templates_spec.rb
+++ b/spec/lib/gitlab/ci/templates/templates_spec.rb
@@ -13,13 +13,6 @@ RSpec.describe 'CI YML Templates' do
excluded + ["Terraform.gitlab-ci.yml"]
end
- before do
- stub_feature_flags(
- redirect_to_latest_template_terraform: false,
- redirect_to_latest_template_security_api_fuzzing: false,
- redirect_to_latest_template_security_dast: false)
- end
-
shared_examples 'require default stages to be included' do
it 'require default stages to be included' do
expect(subject.stages).to include(*Gitlab::Ci::Config::Entry::Stages.default)
diff --git a/spec/lib/gitlab/ci/trace/archive_spec.rb b/spec/lib/gitlab/ci/trace/archive_spec.rb
new file mode 100644
index 00000000000..c9fc4e720c4
--- /dev/null
+++ b/spec/lib/gitlab/ci/trace/archive_spec.rb
@@ -0,0 +1,101 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::Ci::Trace::Archive do
+ let_it_be(:job) { create(:ci_build, :success, :trace_live) }
+ let_it_be_with_reload(:trace_metadata) { create(:ci_build_trace_metadata, build: job) }
+ let_it_be(:src_checksum) do
+ job.trace.read { |stream| Digest::MD5.hexdigest(stream.raw) }
+ end
+
+ let(:metrics) { spy('metrics') }
+
+ describe '#execute' do
+ subject { described_class.new(job, trace_metadata, metrics) }
+
+ it 'computes and assigns checksum' do
+ Gitlab::Ci::Trace::ChunkedIO.new(job) do |stream|
+ expect { subject.execute!(stream) }.to change { Ci::JobArtifact.count }.by(1)
+ end
+
+ expect(trace_metadata.checksum).to eq(src_checksum)
+ expect(trace_metadata.trace_artifact).to eq(job.job_artifacts_trace)
+ end
+
+ context 'validating artifact checksum' do
+ let(:trace) { 'abc' }
+ let(:stream) { StringIO.new(trace, 'rb') }
+ let(:src_checksum) { Digest::MD5.hexdigest(trace) }
+
+ context 'when the object store is disabled' do
+ before do
+ stub_artifacts_object_storage(enabled: false)
+ end
+
+ it 'skips validation' do
+ subject.execute!(stream)
+
+ expect(trace_metadata.checksum).to eq(src_checksum)
+ expect(trace_metadata.remote_checksum).to be_nil
+ expect(metrics)
+ .not_to have_received(:increment_error_counter)
+ .with(type: :archive_invalid_checksum)
+ end
+ end
+
+ context 'with background_upload enabled' do
+ before do
+ stub_artifacts_object_storage(background_upload: true)
+ end
+
+ it 'skips validation' do
+ subject.execute!(stream)
+
+ expect(trace_metadata.checksum).to eq(src_checksum)
+ expect(trace_metadata.remote_checksum).to be_nil
+ expect(metrics)
+ .not_to have_received(:increment_error_counter)
+ .with(type: :archive_invalid_checksum)
+ end
+ end
+
+ context 'with direct_upload enabled' do
+ before do
+ stub_artifacts_object_storage(direct_upload: true)
+ end
+
+ it 'validates the archived trace' do
+ subject.execute!(stream)
+
+ expect(trace_metadata.checksum).to eq(src_checksum)
+ expect(trace_metadata.remote_checksum).to eq(src_checksum)
+ expect(metrics)
+ .not_to have_received(:increment_error_counter)
+ .with(type: :archive_invalid_checksum)
+ end
+
+ context 'when the checksum does not match' do
+ let(:invalid_remote_checksum) { SecureRandom.hex }
+
+ before do
+ expect(::Gitlab::Ci::Trace::RemoteChecksum)
+ .to receive(:new)
+ .with(an_instance_of(Ci::JobArtifact))
+ .and_return(double(md5_checksum: invalid_remote_checksum))
+ end
+
+ it 'validates the archived trace' do
+ subject.execute!(stream)
+
+ expect(trace_metadata.checksum).to eq(src_checksum)
+ expect(trace_metadata.remote_checksum).to eq(invalid_remote_checksum)
+ expect(metrics)
+ .to have_received(:increment_error_counter)
+ .with(type: :archive_invalid_checksum)
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/spec/lib/gitlab/ci/trace/metrics_spec.rb b/spec/lib/gitlab/ci/trace/metrics_spec.rb
index 6518d0ab075..53e55a57973 100644
--- a/spec/lib/gitlab/ci/trace/metrics_spec.rb
+++ b/spec/lib/gitlab/ci/trace/metrics_spec.rb
@@ -15,4 +15,27 @@ RSpec.describe Gitlab::Ci::Trace::Metrics, :prometheus do
end
end
end
+
+ describe '#increment_error_counter' do
+ context 'when the operation type is known' do
+ it 'increments the counter' do
+ subject.increment_error_counter(type: :chunks_invalid_size)
+ subject.increment_error_counter(type: :chunks_invalid_checksum)
+ subject.increment_error_counter(type: :archive_invalid_checksum)
+
+ expect(described_class.trace_errors_counter.get(type: :chunks_invalid_size)).to eq 1
+ expect(described_class.trace_errors_counter.get(type: :chunks_invalid_checksum)).to eq 1
+ expect(described_class.trace_errors_counter.get(type: :archive_invalid_checksum)).to eq 1
+
+ expect(described_class.trace_errors_counter.values.count).to eq 3
+ end
+ end
+
+ context 'when the operation type is known' do
+ it 'raises an exception' do
+ expect { subject.increment_error_counter(type: :invalid_type) }
+ .to raise_error(ArgumentError)
+ end
+ end
+ end
end
diff --git a/spec/lib/gitlab/ci/trace/remote_checksum_spec.rb b/spec/lib/gitlab/ci/trace/remote_checksum_spec.rb
new file mode 100644
index 00000000000..8837ebc3652
--- /dev/null
+++ b/spec/lib/gitlab/ci/trace/remote_checksum_spec.rb
@@ -0,0 +1,85 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::Ci::Trace::RemoteChecksum do
+ let_it_be(:job) { create(:ci_build, :success) }
+
+ let(:file_store) { JobArtifactUploader::Store::LOCAL }
+ let(:trace_artifact) { create(:ci_job_artifact, :trace, job: job, file_store: file_store) }
+ let(:checksum) { Digest::MD5.hexdigest(trace_artifact.file.read) }
+ let(:base64checksum) { Digest::MD5.base64digest(trace_artifact.file.read) }
+ let(:fetcher) { described_class.new(trace_artifact) }
+
+ describe '#md5_checksum' do
+ subject { fetcher.md5_checksum }
+
+ context 'when the file is stored locally' do
+ it { is_expected.to be_nil }
+ end
+
+ context 'when object store is enabled' do
+ before do
+ stub_artifacts_object_storage
+ end
+
+ context 'with local files' do
+ it { is_expected.to be_nil }
+ end
+
+ context 'with remote files' do
+ let(:file_store) { JobArtifactUploader::Store::REMOTE }
+
+ context 'when the feature flag is disabled' do
+ before do
+ stub_feature_flags(ci_archived_build_trace_checksum: false)
+ end
+
+ it { is_expected.to be_nil }
+ end
+
+ context 'with AWS as provider' do
+ it { is_expected.to eq(checksum) }
+ end
+
+ context 'with Google as provider' do
+ before do
+ spy_file = spy(:file)
+ expect(fetcher).to receive(:provider_google?) { true }
+ expect(fetcher).not_to receive(:provider_aws?) { false }
+ allow(spy_file).to receive(:attributes).and_return(metadata)
+
+ allow_next_found_instance_of(Ci::JobArtifact) do |trace_artifact|
+ allow(trace_artifact.file).to receive(:file) { spy_file }
+ end
+ end
+
+ context 'when the response does not include :content_md5' do
+ let(:metadata) {{}}
+
+ it 'raises an exception' do
+ expect { subject }.to raise_error KeyError, /content_md5/
+ end
+ end
+
+ context 'when the response include :content_md5' do
+ let(:metadata) {{ content_md5: base64checksum }}
+
+ it { is_expected.to eq(checksum) }
+ end
+ end
+
+ context 'with unsupported providers' do
+ let(:file_store) { JobArtifactUploader::Store::REMOTE }
+
+ before do
+ expect(fetcher).to receive(:provider_aws?) { false }
+ expect(fetcher).to receive(:provider_google?) { false }
+ end
+
+ it { is_expected.to be_nil }
+ end
+ end
+ end
+ end
+end
diff --git a/spec/lib/gitlab/content_security_policy/config_loader_spec.rb b/spec/lib/gitlab/content_security_policy/config_loader_spec.rb
index 239eff11bf3..3ec332dace5 100644
--- a/spec/lib/gitlab/content_security_policy/config_loader_spec.rb
+++ b/spec/lib/gitlab/content_security_policy/config_loader_spec.rb
@@ -11,6 +11,7 @@ RSpec.describe Gitlab::ContentSecurityPolicy::ConfigLoader do
directives: {
base_uri: 'http://example.com',
child_src: "'self' https://child.example.com",
+ connect_src: "'self' ws://example.com",
default_src: "'self' https://other.example.com",
script_src: "'self' https://script.exammple.com ",
worker_src: "data: https://worker.example.com",
@@ -52,6 +53,28 @@ RSpec.describe Gitlab::ContentSecurityPolicy::ConfigLoader do
expect(directives['child_src']).to eq(directives['frame_src'])
end
+ context 'adds all websocket origins to support Safari' do
+ it 'with insecure domain' do
+ stub_config_setting(host: 'example.com', https: false)
+ expect(directives['connect_src']).to eq("'self' ws://example.com")
+ end
+
+ it 'with secure domain' do
+ stub_config_setting(host: 'example.com', https: true)
+ expect(directives['connect_src']).to eq("'self' wss://example.com")
+ end
+
+ it 'with custom port' do
+ stub_config_setting(host: 'example.com', port: '1234')
+ expect(directives['connect_src']).to eq("'self' ws://example.com:1234")
+ end
+
+ it 'with custom port and secure domain' do
+ stub_config_setting(host: 'example.com', https: true, port: '1234')
+ expect(directives['connect_src']).to eq("'self' wss://example.com:1234")
+ end
+ end
+
context 'when CDN host is defined' do
before do
stub_config_setting(cdn_host: 'https://example.com')
@@ -67,10 +90,11 @@ RSpec.describe Gitlab::ContentSecurityPolicy::ConfigLoader do
context 'when sentry is configured' do
before do
stub_sentry_settings
+ stub_config_setting(host: 'example.com')
end
it 'adds sentry path to CSP without user' do
- expect(directives['connect_src']).to eq("'self' dummy://example.com/43")
+ expect(directives['connect_src']).to eq("'self' ws://example.com dummy://example.com/43")
end
end
@@ -113,6 +137,7 @@ RSpec.describe Gitlab::ContentSecurityPolicy::ConfigLoader do
expect(policy.directives['base-uri']).to eq([csp_config[:directives][:base_uri]])
expect(policy.directives['default-src']).to eq(expected_config(:default_src))
+ expect(policy.directives['connect-src']).to eq(expected_config(:connect_src))
expect(policy.directives['child-src']).to eq(expected_config(:child_src))
expect(policy.directives['worker-src']).to eq(expected_config(:worker_src))
expect(policy.directives['report-uri']).to eq(expected_config(:report_uri))
diff --git a/spec/lib/gitlab/database/bulk_update_spec.rb b/spec/lib/gitlab/database/bulk_update_spec.rb
index dbafada26ca..9a6463c99fa 100644
--- a/spec/lib/gitlab/database/bulk_update_spec.rb
+++ b/spec/lib/gitlab/database/bulk_update_spec.rb
@@ -91,45 +91,38 @@ RSpec.describe Gitlab::Database::BulkUpdate do
.to eq(['MR a', 'Issue a', 'Issue b'])
end
- shared_examples 'basic functionality' do
- it 'sets multiple values' do
- create_default(:user)
- create_default(:project)
-
- i_a, i_b = create_list(:issue, 2)
+ context 'validates prepared_statements support', :reestablished_active_record_base do
+ using RSpec::Parameterized::TableSyntax
- mapping = {
- i_a => { title: 'Issue a' },
- i_b => { title: 'Issue b' }
- }
+ where(:prepared_statements) do
+ [false, true]
+ end
- described_class.execute(%i[title], mapping)
+ before do
+ configuration_hash = ActiveRecord::Base.connection_db_config.configuration_hash
- expect([i_a, i_b].map { |x| x.reset.title })
- .to eq(['Issue a', 'Issue b'])
+ ActiveRecord::Base.establish_connection(
+ configuration_hash.merge(prepared_statements: prepared_statements)
+ )
end
- end
- include_examples 'basic functionality'
+ with_them do
+ it 'sets multiple values' do
+ create_default(:user)
+ create_default(:project)
- context 'when prepared statements are configured differently to the normal test environment' do
- before do
- klass = Class.new(ActiveRecord::Base) do
- def self.abstract_class?
- true # So it gets its own connection
- end
- end
+ i_a, i_b = create_list(:issue, 2)
- stub_const('ActiveRecordBasePreparedStatementsInverted', klass)
+ mapping = {
+ i_a => { title: 'Issue a' },
+ i_b => { title: 'Issue b' }
+ }
- c = ActiveRecord::Base.connection.instance_variable_get(:@config)
- inverted = c.merge(prepared_statements: !ActiveRecord::Base.connection.prepared_statements)
- ActiveRecordBasePreparedStatementsInverted.establish_connection(inverted)
+ described_class.execute(%i[title], mapping)
- allow(ActiveRecord::Base).to receive(:connection_specification_name)
- .and_return(ActiveRecordBasePreparedStatementsInverted.connection_specification_name)
+ expect([i_a, i_b].map { |x| x.reset.title })
+ .to eq(['Issue a', 'Issue b'])
+ end
end
-
- include_examples 'basic functionality'
end
end
diff --git a/spec/lib/gitlab/database/connection_spec.rb b/spec/lib/gitlab/database/connection_spec.rb
index 7f94d7af4a9..ee1df141cd6 100644
--- a/spec/lib/gitlab/database/connection_spec.rb
+++ b/spec/lib/gitlab/database/connection_spec.rb
@@ -126,15 +126,7 @@ RSpec.describe Gitlab::Database::Connection do
end
end
- describe '#disable_prepared_statements' do
- around do |example|
- original_config = connection.scope.connection.pool.db_config
-
- example.run
-
- connection.scope.establish_connection(original_config)
- end
-
+ describe '#disable_prepared_statements', :reestablished_active_record_base do
it 'disables prepared statements' do
connection.scope.establish_connection(
::Gitlab::Database.main.config.merge(prepared_statements: true)
diff --git a/spec/lib/gitlab/database/consistency_spec.rb b/spec/lib/gitlab/database/consistency_spec.rb
index 35fa65512ae..5055be81c88 100644
--- a/spec/lib/gitlab/database/consistency_spec.rb
+++ b/spec/lib/gitlab/database/consistency_spec.rb
@@ -7,6 +7,14 @@ RSpec.describe Gitlab::Database::Consistency do
Gitlab::Database::LoadBalancing::Session.current
end
+ before do
+ Gitlab::Database::LoadBalancing::Session.clear_session
+ end
+
+ after do
+ Gitlab::Database::LoadBalancing::Session.clear_session
+ end
+
describe '.with_read_consistency' do
it 'sticks to primary database' do
expect(session).not_to be_using_primary
diff --git a/spec/lib/gitlab/database/count_spec.rb b/spec/lib/gitlab/database/count_spec.rb
index d65413c2a00..e712ad09927 100644
--- a/spec/lib/gitlab/database/count_spec.rb
+++ b/spec/lib/gitlab/database/count_spec.rb
@@ -46,5 +46,49 @@ RSpec.describe Gitlab::Database::Count do
subject
end
end
+
+ context 'default strategies' do
+ subject { described_class.approximate_counts(models) }
+
+ context 'with a read-only database' do
+ before do
+ allow(Gitlab::Database).to receive(:read_only?).and_return(true)
+ end
+
+ it 'only uses the ExactCountStrategy' do
+ allow_next_instance_of(Gitlab::Database::Count::TablesampleCountStrategy) do |instance|
+ expect(instance).not_to receive(:count)
+ end
+ allow_next_instance_of(Gitlab::Database::Count::ReltuplesCountStrategy) do |instance|
+ expect(instance).not_to receive(:count)
+ end
+ expect_next_instance_of(Gitlab::Database::Count::ExactCountStrategy) do |instance|
+ expect(instance).to receive(:count).and_return({})
+ end
+
+ subject
+ end
+ end
+
+ context 'with a read-write database' do
+ before do
+ allow(Gitlab::Database).to receive(:read_only?).and_return(false)
+ end
+
+ it 'uses the available strategies' do
+ [
+ Gitlab::Database::Count::TablesampleCountStrategy,
+ Gitlab::Database::Count::ReltuplesCountStrategy,
+ Gitlab::Database::Count::ExactCountStrategy
+ ].each do |strategy_klass|
+ expect_next_instance_of(strategy_klass) do |instance|
+ expect(instance).to receive(:count).and_return({})
+ end
+ end
+
+ subject
+ end
+ end
+ end
end
end
diff --git a/spec/lib/gitlab/database/load_balancing/action_cable_callbacks_spec.rb b/spec/lib/gitlab/database/load_balancing/action_cable_callbacks_spec.rb
index ebbbafb855f..768855464c1 100644
--- a/spec/lib/gitlab/database/load_balancing/action_cable_callbacks_spec.rb
+++ b/spec/lib/gitlab/database/load_balancing/action_cable_callbacks_spec.rb
@@ -5,7 +5,7 @@ require 'spec_helper'
RSpec.describe Gitlab::Database::LoadBalancing::ActionCableCallbacks, :request_store do
describe '.wrapper' do
it 'uses primary and then releases the connection and clears the session' do
- expect(Gitlab::Database::LoadBalancing).to receive_message_chain(:proxy, :load_balancer, :release_host)
+ expect(Gitlab::Database::LoadBalancing).to receive(:release_hosts)
expect(Gitlab::Database::LoadBalancing::Session).to receive(:clear_session)
described_class.wrapper.call(
@@ -18,7 +18,7 @@ RSpec.describe Gitlab::Database::LoadBalancing::ActionCableCallbacks, :request_s
context 'with an exception' do
it 'releases the connection and clears the session' do
- expect(Gitlab::Database::LoadBalancing).to receive_message_chain(:proxy, :load_balancer, :release_host)
+ expect(Gitlab::Database::LoadBalancing).to receive(:release_hosts)
expect(Gitlab::Database::LoadBalancing::Session).to receive(:clear_session)
expect do
diff --git a/spec/lib/gitlab/database/load_balancing/active_record_proxy_spec.rb b/spec/lib/gitlab/database/load_balancing/active_record_proxy_spec.rb
deleted file mode 100644
index 8886ce9756d..00000000000
--- a/spec/lib/gitlab/database/load_balancing/active_record_proxy_spec.rb
+++ /dev/null
@@ -1,20 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Gitlab::Database::LoadBalancing::ActiveRecordProxy do
- describe '#connection' do
- it 'returns a connection proxy' do
- dummy = Class.new do
- include Gitlab::Database::LoadBalancing::ActiveRecordProxy
- end
-
- proxy = double(:proxy)
-
- expect(Gitlab::Database::LoadBalancing).to receive(:proxy)
- .and_return(proxy)
-
- expect(dummy.new.connection).to eq(proxy)
- end
- end
-end
diff --git a/spec/lib/gitlab/database/load_balancing/configuration_spec.rb b/spec/lib/gitlab/database/load_balancing/configuration_spec.rb
index 6621e6276a5..3e5249a3dea 100644
--- a/spec/lib/gitlab/database/load_balancing/configuration_spec.rb
+++ b/spec/lib/gitlab/database/load_balancing/configuration_spec.rb
@@ -108,6 +108,14 @@ RSpec.describe Gitlab::Database::LoadBalancing::Configuration do
end
describe '#load_balancing_enabled?' do
+ it 'returns false when running inside a Rake task' do
+ config = described_class.new(ActiveRecord::Base, %w[foo bar])
+
+ allow(Gitlab::Runtime).to receive(:rake?).and_return(true)
+
+ expect(config.load_balancing_enabled?).to eq(false)
+ end
+
it 'returns true when hosts are configured' do
config = described_class.new(ActiveRecord::Base, %w[foo bar])
diff --git a/spec/lib/gitlab/database/load_balancing/host_spec.rb b/spec/lib/gitlab/database/load_balancing/host_spec.rb
index e2011692228..b040c7a76bd 100644
--- a/spec/lib/gitlab/database/load_balancing/host_spec.rb
+++ b/spec/lib/gitlab/database/load_balancing/host_spec.rb
@@ -172,6 +172,14 @@ RSpec.describe Gitlab::Database::LoadBalancing::Host do
expect(host).not_to be_online
end
+
+ it 'returns false when ActiveRecord::ConnectionNotEstablished is raised' do
+ allow(host)
+ .to receive(:check_replica_status?)
+ .and_raise(ActiveRecord::ConnectionNotEstablished)
+
+ expect(host).not_to be_online
+ end
end
end
diff --git a/spec/lib/gitlab/database/load_balancing/load_balancer_spec.rb b/spec/lib/gitlab/database/load_balancing/load_balancer_spec.rb
index 86fae14b961..f3ce5563e38 100644
--- a/spec/lib/gitlab/database/load_balancing/load_balancer_spec.rb
+++ b/spec/lib/gitlab/database/load_balancing/load_balancer_spec.rb
@@ -47,16 +47,27 @@ RSpec.describe Gitlab::Database::LoadBalancing::LoadBalancer, :request_store do
end
describe '#initialize' do
- it 'ignores the hosts when the primary_only option is enabled' do
+ it 'ignores the hosts when load balancing is disabled' do
config = Gitlab::Database::LoadBalancing::Configuration
.new(ActiveRecord::Base, [db_host])
- lb = described_class.new(config, primary_only: true)
+
+ allow(config).to receive(:load_balancing_enabled?).and_return(false)
+
+ lb = described_class.new(config)
hosts = lb.host_list.hosts
expect(hosts.length).to eq(1)
expect(hosts.first)
.to be_instance_of(Gitlab::Database::LoadBalancing::PrimaryHost)
end
+
+ it 'sets the name of the connection that is used' do
+ config =
+ Gitlab::Database::LoadBalancing::Configuration.new(ActiveRecord::Base)
+ lb = described_class.new(config)
+
+ expect(lb.name).to eq(:main)
+ end
end
describe '#read' do
@@ -140,10 +151,13 @@ RSpec.describe Gitlab::Database::LoadBalancing::LoadBalancer, :request_store do
.to yield_with_args(ActiveRecord::Base.retrieve_connection)
end
- it 'uses the primary when the primary_only option is enabled' do
+ it 'uses the primary when load balancing is disabled' do
config = Gitlab::Database::LoadBalancing::Configuration
.new(ActiveRecord::Base)
- lb = described_class.new(config, primary_only: true)
+
+ allow(config).to receive(:load_balancing_enabled?).and_return(false)
+
+ lb = described_class.new(config)
# When no hosts are configured, we don't want to produce any warnings, as
# they aren't useful/too noisy.
@@ -274,34 +288,43 @@ RSpec.describe Gitlab::Database::LoadBalancing::LoadBalancer, :request_store do
expect { lb.retry_with_backoff { raise } }.to raise_error(RuntimeError)
end
- end
- describe '#connection_error?' do
- before do
- stub_const('Gitlab::Database::LoadBalancing::LoadBalancer::CONNECTION_ERRORS',
- [NotImplementedError])
+ it 'skips retries when only the primary is used' do
+ allow(lb).to receive(:primary_only?).and_return(true)
+
+ expect(lb).not_to receive(:sleep)
+
+ expect { lb.retry_with_backoff { raise } }.to raise_error(RuntimeError)
end
+ end
+ describe '#connection_error?' do
it 'returns true for a connection error' do
- error = NotImplementedError.new
+ error = ActiveRecord::ConnectionNotEstablished.new
expect(lb.connection_error?(error)).to eq(true)
end
+ it 'returns false for a missing database error' do
+ error = ActiveRecord::NoDatabaseError.new
+
+ expect(lb.connection_error?(error)).to eq(false)
+ end
+
it 'returns true for a wrapped connection error' do
- wrapped = wrapped_exception(ActiveRecord::StatementInvalid, NotImplementedError)
+ wrapped = wrapped_exception(ActiveRecord::StatementInvalid, ActiveRecord::ConnectionNotEstablished)
expect(lb.connection_error?(wrapped)).to eq(true)
end
it 'returns true for a wrapped connection error from a view' do
- wrapped = wrapped_exception(ActionView::Template::Error, NotImplementedError)
+ wrapped = wrapped_exception(ActionView::Template::Error, ActiveRecord::ConnectionNotEstablished)
expect(lb.connection_error?(wrapped)).to eq(true)
end
it 'returns true for deeply wrapped/nested errors' do
- top = twice_wrapped_exception(ActionView::Template::Error, ActiveRecord::StatementInvalid, NotImplementedError)
+ top = twice_wrapped_exception(ActionView::Template::Error, ActiveRecord::StatementInvalid, ActiveRecord::ConnectionNotEstablished)
expect(lb.connection_error?(top)).to eq(true)
end
diff --git a/spec/lib/gitlab/database/load_balancing/primary_host_spec.rb b/spec/lib/gitlab/database/load_balancing/primary_host_spec.rb
index a0e63a7ee4e..45d81808971 100644
--- a/spec/lib/gitlab/database/load_balancing/primary_host_spec.rb
+++ b/spec/lib/gitlab/database/load_balancing/primary_host_spec.rb
@@ -63,9 +63,8 @@ RSpec.describe Gitlab::Database::LoadBalancing::PrimaryHost do
end
describe '#primary_write_location' do
- it 'returns the write location of the primary' do
- expect(host.primary_write_location).to be_an_instance_of(String)
- expect(host.primary_write_location).not_to be_empty
+ it 'raises NotImplementedError' do
+ expect { host.primary_write_location }.to raise_error(NotImplementedError)
end
end
@@ -76,51 +75,8 @@ RSpec.describe Gitlab::Database::LoadBalancing::PrimaryHost do
end
describe '#database_replica_location' do
- let(:connection) { double(:connection) }
-
- it 'returns the write ahead location of the replica', :aggregate_failures do
- expect(host)
- .to receive(:query_and_release)
- .and_return({ 'location' => '0/D525E3A8' })
-
- expect(host.database_replica_location).to be_an_instance_of(String)
- end
-
- it 'returns nil when the database query returned no rows' do
- expect(host).to receive(:query_and_release).and_return({})
-
- expect(host.database_replica_location).to be_nil
- end
-
- it 'returns nil when the database connection fails' do
- allow(host).to receive(:connection).and_raise(PG::Error)
-
- expect(host.database_replica_location).to be_nil
- end
- end
-
- describe '#query_and_release' do
- it 'executes a SQL query' do
- results = host.query_and_release('SELECT 10 AS number')
-
- expect(results).to be_an_instance_of(Hash)
- expect(results['number'].to_i).to eq(10)
- end
-
- it 'releases the connection after running the query' do
- expect(host)
- .to receive(:release_connection)
- .once
-
- host.query_and_release('SELECT 10 AS number')
- end
-
- it 'returns an empty Hash in the event of an error' do
- expect(host.connection)
- .to receive(:select_all)
- .and_raise(RuntimeError, 'kittens')
-
- expect(host.query_and_release('SELECT 10 AS number')).to eq({})
+ it 'raises NotImplementedError' do
+ expect { host.database_replica_location }.to raise_error(NotImplementedError)
end
end
end
diff --git a/spec/lib/gitlab/database/load_balancing/rack_middleware_spec.rb b/spec/lib/gitlab/database/load_balancing/rack_middleware_spec.rb
index ea0c7f781fd..af7e2a4b167 100644
--- a/spec/lib/gitlab/database/load_balancing/rack_middleware_spec.rb
+++ b/spec/lib/gitlab/database/load_balancing/rack_middleware_spec.rb
@@ -6,12 +6,12 @@ RSpec.describe Gitlab::Database::LoadBalancing::RackMiddleware, :redis do
let(:app) { double(:app) }
let(:middleware) { described_class.new(app) }
let(:warden_user) { double(:warden, user: double(:user, id: 42)) }
- let(:single_sticking_object) { Set.new([[:user, 42]]) }
+ let(:single_sticking_object) { Set.new([[ActiveRecord::Base, :user, 42]]) }
let(:multiple_sticking_objects) do
Set.new([
- [:user, 42],
- [:runner, '123456789'],
- [:runner, '1234']
+ [ActiveRecord::Base, :user, 42],
+ [ActiveRecord::Base, :runner, '123456789'],
+ [ActiveRecord::Base, :runner, '1234']
])
end
@@ -19,47 +19,6 @@ RSpec.describe Gitlab::Database::LoadBalancing::RackMiddleware, :redis do
Gitlab::Database::LoadBalancing::Session.clear_session
end
- describe '.stick_or_unstick' do
- before do
- allow(Gitlab::Database::LoadBalancing).to receive(:enable?)
- .and_return(true)
- end
-
- it 'sticks or unsticks a single object and updates the Rack environment' do
- expect(Gitlab::Database::LoadBalancing::Sticking)
- .to receive(:unstick_or_continue_sticking)
- .with(:user, 42)
-
- env = {}
-
- described_class.stick_or_unstick(env, :user, 42)
-
- expect(env[described_class::STICK_OBJECT].to_a).to eq([[:user, 42]])
- end
-
- it 'sticks or unsticks multiple objects and updates the Rack environment' do
- expect(Gitlab::Database::LoadBalancing::Sticking)
- .to receive(:unstick_or_continue_sticking)
- .with(:user, 42)
- .ordered
-
- expect(Gitlab::Database::LoadBalancing::Sticking)
- .to receive(:unstick_or_continue_sticking)
- .with(:runner, '123456789')
- .ordered
-
- env = {}
-
- described_class.stick_or_unstick(env, :user, 42)
- described_class.stick_or_unstick(env, :runner, '123456789')
-
- expect(env[described_class::STICK_OBJECT].to_a).to eq([
- [:user, 42],
- [:runner, '123456789']
- ])
- end
- end
-
describe '#call' do
it 'handles a request' do
env = {}
@@ -82,7 +41,7 @@ RSpec.describe Gitlab::Database::LoadBalancing::RackMiddleware, :redis do
describe '#unstick_or_continue_sticking' do
it 'does not stick if no namespace and identifier could be found' do
- expect(Gitlab::Database::LoadBalancing::Sticking)
+ expect(ApplicationRecord.sticking)
.not_to receive(:unstick_or_continue_sticking)
middleware.unstick_or_continue_sticking({})
@@ -91,9 +50,11 @@ RSpec.describe Gitlab::Database::LoadBalancing::RackMiddleware, :redis do
it 'sticks to the primary if a warden user is found' do
env = { 'warden' => warden_user }
- expect(Gitlab::Database::LoadBalancing::Sticking)
- .to receive(:unstick_or_continue_sticking)
- .with(:user, 42)
+ Gitlab::Database::LoadBalancing.base_models.each do |model|
+ expect(model.sticking)
+ .to receive(:unstick_or_continue_sticking)
+ .with(:user, 42)
+ end
middleware.unstick_or_continue_sticking(env)
end
@@ -101,7 +62,7 @@ RSpec.describe Gitlab::Database::LoadBalancing::RackMiddleware, :redis do
it 'sticks to the primary if a sticking namespace and identifier is found' do
env = { described_class::STICK_OBJECT => single_sticking_object }
- expect(Gitlab::Database::LoadBalancing::Sticking)
+ expect(ApplicationRecord.sticking)
.to receive(:unstick_or_continue_sticking)
.with(:user, 42)
@@ -111,17 +72,17 @@ RSpec.describe Gitlab::Database::LoadBalancing::RackMiddleware, :redis do
it 'sticks to the primary if multiple sticking namespaces and identifiers were found' do
env = { described_class::STICK_OBJECT => multiple_sticking_objects }
- expect(Gitlab::Database::LoadBalancing::Sticking)
+ expect(ApplicationRecord.sticking)
.to receive(:unstick_or_continue_sticking)
.with(:user, 42)
.ordered
- expect(Gitlab::Database::LoadBalancing::Sticking)
+ expect(ApplicationRecord.sticking)
.to receive(:unstick_or_continue_sticking)
.with(:runner, '123456789')
.ordered
- expect(Gitlab::Database::LoadBalancing::Sticking)
+ expect(ApplicationRecord.sticking)
.to receive(:unstick_or_continue_sticking)
.with(:runner, '1234')
.ordered
@@ -132,7 +93,7 @@ RSpec.describe Gitlab::Database::LoadBalancing::RackMiddleware, :redis do
describe '#stick_if_necessary' do
it 'does not stick to the primary if not necessary' do
- expect(Gitlab::Database::LoadBalancing::Sticking)
+ expect(ApplicationRecord.sticking)
.not_to receive(:stick_if_necessary)
middleware.stick_if_necessary({})
@@ -141,9 +102,11 @@ RSpec.describe Gitlab::Database::LoadBalancing::RackMiddleware, :redis do
it 'sticks to the primary if a warden user is found' do
env = { 'warden' => warden_user }
- expect(Gitlab::Database::LoadBalancing::Sticking)
- .to receive(:stick_if_necessary)
- .with(:user, 42)
+ Gitlab::Database::LoadBalancing.base_models.each do |model|
+ expect(model.sticking)
+ .to receive(:stick_if_necessary)
+ .with(:user, 42)
+ end
middleware.stick_if_necessary(env)
end
@@ -151,7 +114,7 @@ RSpec.describe Gitlab::Database::LoadBalancing::RackMiddleware, :redis do
it 'sticks to the primary if a a single sticking object is found' do
env = { described_class::STICK_OBJECT => single_sticking_object }
- expect(Gitlab::Database::LoadBalancing::Sticking)
+ expect(ApplicationRecord.sticking)
.to receive(:stick_if_necessary)
.with(:user, 42)
@@ -161,17 +124,17 @@ RSpec.describe Gitlab::Database::LoadBalancing::RackMiddleware, :redis do
it 'sticks to the primary if multiple sticking namespaces and identifiers were found' do
env = { described_class::STICK_OBJECT => multiple_sticking_objects }
- expect(Gitlab::Database::LoadBalancing::Sticking)
+ expect(ApplicationRecord.sticking)
.to receive(:stick_if_necessary)
.with(:user, 42)
.ordered
- expect(Gitlab::Database::LoadBalancing::Sticking)
+ expect(ApplicationRecord.sticking)
.to receive(:stick_if_necessary)
.with(:runner, '123456789')
.ordered
- expect(Gitlab::Database::LoadBalancing::Sticking)
+ expect(ApplicationRecord.sticking)
.to receive(:stick_if_necessary)
.with(:runner, '1234')
.ordered
@@ -182,47 +145,34 @@ RSpec.describe Gitlab::Database::LoadBalancing::RackMiddleware, :redis do
describe '#clear' do
it 'clears the currently used host and session' do
- lb = double(:lb)
session = spy(:session)
- allow(middleware).to receive(:load_balancer).and_return(lb)
-
- expect(lb).to receive(:release_host)
-
stub_const('Gitlab::Database::LoadBalancing::Session', session)
+ expect(Gitlab::Database::LoadBalancing).to receive(:release_hosts)
+
middleware.clear
expect(session).to have_received(:clear_session)
end
end
- describe '.load_balancer' do
- it 'returns a the load balancer' do
- proxy = double(:proxy)
-
- expect(Gitlab::Database::LoadBalancing).to receive(:proxy)
- .and_return(proxy)
-
- expect(proxy).to receive(:load_balancer)
-
- middleware.load_balancer
- end
- end
-
- describe '#sticking_namespaces_and_ids' do
+ describe '#sticking_namespaces' do
context 'using a Warden request' do
it 'returns the warden user if present' do
env = { 'warden' => warden_user }
+ ids = Gitlab::Database::LoadBalancing.base_models.map do |model|
+ [model, :user, 42]
+ end
- expect(middleware.sticking_namespaces_and_ids(env)).to eq([[:user, 42]])
+ expect(middleware.sticking_namespaces(env)).to eq(ids)
end
it 'returns an empty Array if no user was present' do
warden = double(:warden, user: nil)
env = { 'warden' => warden }
- expect(middleware.sticking_namespaces_and_ids(env)).to eq([])
+ expect(middleware.sticking_namespaces(env)).to eq([])
end
end
@@ -230,17 +180,17 @@ RSpec.describe Gitlab::Database::LoadBalancing::RackMiddleware, :redis do
it 'returns the sticking object' do
env = { described_class::STICK_OBJECT => multiple_sticking_objects }
- expect(middleware.sticking_namespaces_and_ids(env)).to eq([
- [:user, 42],
- [:runner, '123456789'],
- [:runner, '1234']
+ expect(middleware.sticking_namespaces(env)).to eq([
+ [ActiveRecord::Base, :user, 42],
+ [ActiveRecord::Base, :runner, '123456789'],
+ [ActiveRecord::Base, :runner, '1234']
])
end
end
context 'using a regular request' do
it 'returns an empty Array' do
- expect(middleware.sticking_namespaces_and_ids({})).to eq([])
+ expect(middleware.sticking_namespaces({})).to eq([])
end
end
end
diff --git a/spec/lib/gitlab/database/load_balancing/setup_spec.rb b/spec/lib/gitlab/database/load_balancing/setup_spec.rb
new file mode 100644
index 00000000000..01646bc76ef
--- /dev/null
+++ b/spec/lib/gitlab/database/load_balancing/setup_spec.rb
@@ -0,0 +1,119 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::Database::LoadBalancing::Setup do
+ describe '#setup' do
+ it 'sets up the load balancer' do
+ setup = described_class.new(ActiveRecord::Base)
+
+ expect(setup).to receive(:disable_prepared_statements)
+ expect(setup).to receive(:setup_load_balancer)
+ expect(setup).to receive(:setup_service_discovery)
+
+ setup.setup
+ end
+ end
+
+ describe '#disable_prepared_statements' do
+ it 'disables prepared statements and reconnects to the database' do
+ config = double(
+ :config,
+ configuration_hash: { host: 'localhost' },
+ env_name: 'test',
+ name: 'main'
+ )
+ model = double(:model, connection_db_config: config)
+
+ expect(ActiveRecord::DatabaseConfigurations::HashConfig)
+ .to receive(:new)
+ .with('test', 'main', { host: 'localhost', prepared_statements: false })
+ .and_call_original
+
+ # HashConfig doesn't implement its own #==, so we can't directly compare
+ # the expected value with a pre-defined one.
+ expect(model)
+ .to receive(:establish_connection)
+ .with(an_instance_of(ActiveRecord::DatabaseConfigurations::HashConfig))
+
+ described_class.new(model).disable_prepared_statements
+ end
+ end
+
+ describe '#setup_load_balancer' do
+ it 'sets up the load balancer' do
+ model = Class.new(ActiveRecord::Base)
+ setup = described_class.new(model)
+ config = Gitlab::Database::LoadBalancing::Configuration.new(model)
+ lb = instance_spy(Gitlab::Database::LoadBalancing::LoadBalancer)
+
+ allow(lb).to receive(:configuration).and_return(config)
+
+ expect(Gitlab::Database::LoadBalancing::LoadBalancer)
+ .to receive(:new)
+ .with(setup.configuration)
+ .and_return(lb)
+
+ setup.setup_load_balancer
+
+ expect(model.connection.load_balancer).to eq(lb)
+ expect(model.sticking)
+ .to be_an_instance_of(Gitlab::Database::LoadBalancing::Sticking)
+ end
+ end
+
+ describe '#setup_service_discovery' do
+ context 'when service discovery is disabled' do
+ it 'does nothing' do
+ expect(Gitlab::Database::LoadBalancing::ServiceDiscovery)
+ .not_to receive(:new)
+
+ described_class.new(ActiveRecord::Base).setup_service_discovery
+ end
+ end
+
+ context 'when service discovery is enabled' do
+ it 'immediately performs service discovery' do
+ model = ActiveRecord::Base
+ setup = described_class.new(model)
+ sv = instance_spy(Gitlab::Database::LoadBalancing::ServiceDiscovery)
+ lb = model.connection.load_balancer
+
+ allow(setup.configuration)
+ .to receive(:service_discovery_enabled?)
+ .and_return(true)
+
+ allow(Gitlab::Database::LoadBalancing::ServiceDiscovery)
+ .to receive(:new)
+ .with(lb, setup.configuration.service_discovery)
+ .and_return(sv)
+
+ expect(sv).to receive(:perform_service_discovery)
+ expect(sv).not_to receive(:start)
+
+ setup.setup_service_discovery
+ end
+
+ it 'starts service discovery if needed' do
+ model = ActiveRecord::Base
+ setup = described_class.new(model, start_service_discovery: true)
+ sv = instance_spy(Gitlab::Database::LoadBalancing::ServiceDiscovery)
+ lb = model.connection.load_balancer
+
+ allow(setup.configuration)
+ .to receive(:service_discovery_enabled?)
+ .and_return(true)
+
+ allow(Gitlab::Database::LoadBalancing::ServiceDiscovery)
+ .to receive(:new)
+ .with(lb, setup.configuration.service_discovery)
+ .and_return(sv)
+
+ expect(sv).to receive(:perform_service_discovery)
+ expect(sv).to receive(:start)
+
+ setup.setup_service_discovery
+ end
+ end
+ end
+end
diff --git a/spec/lib/gitlab/database/load_balancing/sidekiq_client_middleware_spec.rb b/spec/lib/gitlab/database/load_balancing/sidekiq_client_middleware_spec.rb
index f683ade978a..08dd6a0a788 100644
--- a/spec/lib/gitlab/database/load_balancing/sidekiq_client_middleware_spec.rb
+++ b/spec/lib/gitlab/database/load_balancing/sidekiq_client_middleware_spec.rb
@@ -5,14 +5,12 @@ require 'spec_helper'
RSpec.describe Gitlab::Database::LoadBalancing::SidekiqClientMiddleware do
let(:middleware) { described_class.new }
- let(:load_balancer) { double.as_null_object }
let(:worker_class) { 'TestDataConsistencyWorker' }
let(:job) { { "job_id" => "a180b47c-3fd6-41b8-81e9-34da61c3400e" } }
before do
skip_feature_flags_yaml_validation
skip_default_enabled_yaml_check
- allow(::Gitlab::Database::LoadBalancing).to receive_message_chain(:proxy, :load_balancer).and_return(load_balancer)
end
after do
@@ -23,7 +21,7 @@ RSpec.describe Gitlab::Database::LoadBalancing::SidekiqClientMiddleware do
middleware.call(worker_class, job, nil, nil) {}
end
- describe '#call' do
+ describe '#call', :database_replica do
shared_context 'data consistency worker class' do |data_consistency, feature_flag|
let(:expected_consistency) { data_consistency }
let(:worker_class) do
@@ -85,9 +83,15 @@ RSpec.describe Gitlab::Database::LoadBalancing::SidekiqClientMiddleware do
end
it 'passes database_replica_location' do
- expected_location = { Gitlab::Database::MAIN_DATABASE_NAME.to_sym => location }
+ expected_location = {}
- expect(load_balancer).to receive_message_chain(:host, "database_replica_location").and_return(location)
+ Gitlab::Database::LoadBalancing.each_load_balancer do |lb|
+ expect(lb.host)
+ .to receive(:database_replica_location)
+ .and_return(location)
+
+ expected_location[lb.name] = location
+ end
run_middleware
@@ -103,9 +107,15 @@ RSpec.describe Gitlab::Database::LoadBalancing::SidekiqClientMiddleware do
end
it 'passes primary write location', :aggregate_failures do
- expected_location = { Gitlab::Database::MAIN_DATABASE_NAME.to_sym => location }
+ expected_location = {}
- expect(load_balancer).to receive(:primary_write_location).and_return(location)
+ Gitlab::Database::LoadBalancing.each_load_balancer do |lb|
+ expect(lb)
+ .to receive(:primary_write_location)
+ .and_return(location)
+
+ expected_location[lb.name] = location
+ end
run_middleware
@@ -137,8 +147,10 @@ RSpec.describe Gitlab::Database::LoadBalancing::SidekiqClientMiddleware do
let(:job) { { "job_id" => "a180b47c-3fd6-41b8-81e9-34da61c3400e", 'wal_locations' => wal_locations } }
before do
- allow(load_balancer).to receive(:primary_write_location).and_return(new_location)
- allow(load_balancer).to receive(:database_replica_location).and_return(new_location)
+ Gitlab::Database::LoadBalancing.each_load_balancer do |lb|
+ allow(lb).to receive(:primary_write_location).and_return(new_location)
+ allow(lb).to receive(:database_replica_location).and_return(new_location)
+ end
end
shared_examples_for 'does not set database location again' do |use_primary|
diff --git a/spec/lib/gitlab/database/load_balancing/sidekiq_server_middleware_spec.rb b/spec/lib/gitlab/database/load_balancing/sidekiq_server_middleware_spec.rb
index 9f23eb0094f..06efdcd8f99 100644
--- a/spec/lib/gitlab/database/load_balancing/sidekiq_server_middleware_spec.rb
+++ b/spec/lib/gitlab/database/load_balancing/sidekiq_server_middleware_spec.rb
@@ -2,20 +2,17 @@
require 'spec_helper'
-RSpec.describe Gitlab::Database::LoadBalancing::SidekiqServerMiddleware do
+RSpec.describe Gitlab::Database::LoadBalancing::SidekiqServerMiddleware, :clean_gitlab_redis_queues do
let(:middleware) { described_class.new }
-
- let(:load_balancer) { double.as_null_object }
-
let(:worker) { worker_class.new }
let(:job) { { "retry" => 3, "job_id" => "a180b47c-3fd6-41b8-81e9-34da61c3400e", 'database_replica_location' => '0/D525E3A8' } }
before do
skip_feature_flags_yaml_validation
skip_default_enabled_yaml_check
- allow(::Gitlab::Database::LoadBalancing).to receive_message_chain(:proxy, :load_balancer).and_return(load_balancer)
replication_lag!(false)
+ Gitlab::Database::LoadBalancing::Session.clear_session
end
after do
@@ -67,7 +64,10 @@ RSpec.describe Gitlab::Database::LoadBalancing::SidekiqServerMiddleware do
let(:wal_locations) { { Gitlab::Database::MAIN_DATABASE_NAME.to_sym => location } }
it 'does not stick to the primary', :aggregate_failures do
- expect(load_balancer).to receive(:select_up_to_date_host).with(location).and_return(true)
+ expect(ActiveRecord::Base.connection.load_balancer)
+ .to receive(:select_up_to_date_host)
+ .with(location)
+ .and_return(true)
run_middleware do
expect(Gitlab::Database::LoadBalancing::Session.current.use_primary?).not_to be_truthy
@@ -92,7 +92,12 @@ RSpec.describe Gitlab::Database::LoadBalancing::SidekiqServerMiddleware do
let(:job) { { 'job_id' => 'a180b47c-3fd6-41b8-81e9-34da61c3400e', 'wal_locations' => wal_locations } }
before do
- allow(load_balancer).to receive(:select_up_to_date_host).with(location).and_return(true)
+ Gitlab::Database::LoadBalancing.each_load_balancer do |lb|
+ allow(lb)
+ .to receive(:select_up_to_date_host)
+ .with(location)
+ .and_return(true)
+ end
end
it_behaves_like 'replica is up to date', 'replica'
@@ -102,7 +107,10 @@ RSpec.describe Gitlab::Database::LoadBalancing::SidekiqServerMiddleware do
let(:job) { { 'job_id' => 'a180b47c-3fd6-41b8-81e9-34da61c3400e', 'dedup_wal_locations' => wal_locations } }
before do
- allow(load_balancer).to receive(:select_up_to_date_host).with(wal_locations[:main]).and_return(true)
+ allow(ActiveRecord::Base.connection.load_balancer)
+ .to receive(:select_up_to_date_host)
+ .with(wal_locations[:main])
+ .and_return(true)
end
it_behaves_like 'replica is up to date', 'replica'
@@ -112,7 +120,10 @@ RSpec.describe Gitlab::Database::LoadBalancing::SidekiqServerMiddleware do
let(:job) { { 'job_id' => 'a180b47c-3fd6-41b8-81e9-34da61c3400e', 'database_write_location' => '0/D525E3A8' } }
before do
- allow(load_balancer).to receive(:select_up_to_date_host).with('0/D525E3A8').and_return(true)
+ allow(ActiveRecord::Base.connection.load_balancer)
+ .to receive(:select_up_to_date_host)
+ .with('0/D525E3A8')
+ .and_return(true)
end
it_behaves_like 'replica is up to date', 'replica'
@@ -158,18 +169,15 @@ RSpec.describe Gitlab::Database::LoadBalancing::SidekiqServerMiddleware do
process_job(job)
end.to raise_error(Sidekiq::JobRetry::Skip)
- expect(job['error_class']).to eq('Gitlab::Database::LoadBalancing::SidekiqServerMiddleware::JobReplicaNotUpToDate')
+ job_for_retry = Sidekiq::RetrySet.new.first
+ expect(job_for_retry['error_class']).to eq('Gitlab::Database::LoadBalancing::SidekiqServerMiddleware::JobReplicaNotUpToDate')
end
include_examples 'load balancing strategy', 'retry'
end
context 'when job is retried' do
- before do
- expect do
- process_job(job)
- end.to raise_error(Sidekiq::JobRetry::Skip)
- end
+ let(:job) { { "retry" => 3, "job_id" => "a180b47c-3fd6-41b8-81e9-34da61c3400e", 'database_replica_location' => '0/D525E3A8', 'retry_count' => 0 } }
context 'and replica still lagging behind' do
include_examples 'stick to the primary', 'primary'
@@ -191,7 +199,9 @@ RSpec.describe Gitlab::Database::LoadBalancing::SidekiqServerMiddleware do
context 'when replica is not up to date' do
before do
- allow(load_balancer).to receive(:select_up_to_date_host).and_return(false)
+ Gitlab::Database::LoadBalancing.each_load_balancer do |lb|
+ allow(lb).to receive(:select_up_to_date_host).and_return(false)
+ end
end
include_examples 'stick to the primary', 'primary'
@@ -199,8 +209,47 @@ RSpec.describe Gitlab::Database::LoadBalancing::SidekiqServerMiddleware do
end
end
+ describe '#databases_in_sync?' do
+ it 'treats load balancers without WAL entries as in sync' do
+ expect(middleware.send(:databases_in_sync?, {}))
+ .to eq(true)
+ end
+
+ it 'returns true when all load balancers are in sync' do
+ locations = {}
+
+ Gitlab::Database::LoadBalancing.each_load_balancer do |lb|
+ locations[lb.name] = 'foo'
+
+ expect(lb)
+ .to receive(:select_up_to_date_host)
+ .with('foo')
+ .and_return(true)
+ end
+
+ expect(middleware.send(:databases_in_sync?, locations))
+ .to eq(true)
+ end
+
+ it 'returns false when the load balancers are not in sync' do
+ locations = {}
+
+ Gitlab::Database::LoadBalancing.each_load_balancer do |lb|
+ locations[lb.name] = 'foo'
+
+ allow(lb)
+ .to receive(:select_up_to_date_host)
+ .with('foo')
+ .and_return(false)
+ end
+
+ expect(middleware.send(:databases_in_sync?, locations))
+ .to eq(false)
+ end
+ end
+
def process_job(job)
- Sidekiq::JobRetry.new.local(worker_class, job, 'default') do
+ Sidekiq::JobRetry.new.local(worker_class, job.to_json, 'default') do
worker_class.process_job(job)
end
end
@@ -212,6 +261,8 @@ RSpec.describe Gitlab::Database::LoadBalancing::SidekiqServerMiddleware do
end
def replication_lag!(exists)
- allow(load_balancer).to receive(:select_up_to_date_host).and_return(!exists)
+ Gitlab::Database::LoadBalancing.each_load_balancer do |lb|
+ allow(lb).to receive(:select_up_to_date_host).and_return(!exists)
+ end
end
end
diff --git a/spec/lib/gitlab/database/load_balancing/sticking_spec.rb b/spec/lib/gitlab/database/load_balancing/sticking_spec.rb
index cf52e59db3a..8ceda52ee85 100644
--- a/spec/lib/gitlab/database/load_balancing/sticking_spec.rb
+++ b/spec/lib/gitlab/database/load_balancing/sticking_spec.rb
@@ -3,55 +3,82 @@
require 'spec_helper'
RSpec.describe Gitlab::Database::LoadBalancing::Sticking, :redis do
+ let(:sticking) do
+ described_class.new(ActiveRecord::Base.connection.load_balancer)
+ end
+
after do
Gitlab::Database::LoadBalancing::Session.clear_session
end
- describe '.stick_if_necessary' do
- context 'when sticking is disabled' do
- it 'does not perform any sticking' do
- expect(described_class).not_to receive(:stick)
+ describe '#stick_or_unstick_request' do
+ it 'sticks or unsticks a single object and updates the Rack environment' do
+ expect(sticking)
+ .to receive(:unstick_or_continue_sticking)
+ .with(:user, 42)
- described_class.stick_if_necessary(:user, 42)
- end
+ env = {}
+
+ sticking.stick_or_unstick_request(env, :user, 42)
+
+ expect(env[Gitlab::Database::LoadBalancing::RackMiddleware::STICK_OBJECT].to_a)
+ .to eq([[ActiveRecord::Base, :user, 42]])
end
- context 'when sticking is enabled' do
- before do
- allow(Gitlab::Database::LoadBalancing).to receive(:enable?)
- .and_return(true)
- end
+ it 'sticks or unsticks multiple objects and updates the Rack environment' do
+ expect(sticking)
+ .to receive(:unstick_or_continue_sticking)
+ .with(:user, 42)
+ .ordered
- it 'does not stick if no write was performed' do
- allow(Gitlab::Database::LoadBalancing::Session.current)
- .to receive(:performed_write?)
- .and_return(false)
+ expect(sticking)
+ .to receive(:unstick_or_continue_sticking)
+ .with(:runner, '123456789')
+ .ordered
- expect(described_class).not_to receive(:stick)
+ env = {}
- described_class.stick_if_necessary(:user, 42)
- end
+ sticking.stick_or_unstick_request(env, :user, 42)
+ sticking.stick_or_unstick_request(env, :runner, '123456789')
- it 'sticks to the primary if a write was performed' do
- allow(Gitlab::Database::LoadBalancing::Session.current)
- .to receive(:performed_write?)
- .and_return(true)
+ expect(env[Gitlab::Database::LoadBalancing::RackMiddleware::STICK_OBJECT].to_a).to eq([
+ [ActiveRecord::Base, :user, 42],
+ [ActiveRecord::Base, :runner, '123456789']
+ ])
+ end
+ end
- expect(described_class).to receive(:stick).with(:user, 42)
+ describe '#stick_if_necessary' do
+ it 'does not stick if no write was performed' do
+ allow(Gitlab::Database::LoadBalancing::Session.current)
+ .to receive(:performed_write?)
+ .and_return(false)
- described_class.stick_if_necessary(:user, 42)
- end
+ expect(sticking).not_to receive(:stick)
+
+ sticking.stick_if_necessary(:user, 42)
+ end
+
+ it 'sticks to the primary if a write was performed' do
+ allow(Gitlab::Database::LoadBalancing::Session.current)
+ .to receive(:performed_write?)
+ .and_return(true)
+
+ expect(sticking)
+ .to receive(:stick)
+ .with(:user, 42)
+
+ sticking.stick_if_necessary(:user, 42)
end
end
- describe '.all_caught_up?' do
- let(:lb) { double(:lb) }
+ describe '#all_caught_up?' do
+ let(:lb) { ActiveRecord::Base.connection.load_balancer }
let(:last_write_location) { 'foo' }
before do
- allow(described_class).to receive(:load_balancer).and_return(lb)
-
- allow(described_class).to receive(:last_write_location_for)
+ allow(sticking)
+ .to receive(:last_write_location_for)
.with(:user, 42)
.and_return(last_write_location)
end
@@ -60,13 +87,9 @@ RSpec.describe Gitlab::Database::LoadBalancing::Sticking, :redis do
let(:last_write_location) { nil }
it 'returns true' do
- allow(described_class).to receive(:last_write_location_for)
- .with(:user, 42)
- .and_return(nil)
-
expect(lb).not_to receive(:select_up_to_date_host)
- expect(described_class.all_caught_up?(:user, 42)).to eq(true)
+ expect(sticking.all_caught_up?(:user, 42)).to eq(true)
end
end
@@ -76,9 +99,11 @@ RSpec.describe Gitlab::Database::LoadBalancing::Sticking, :redis do
end
it 'returns true, and unsticks' do
- expect(described_class).to receive(:unstick).with(:user, 42)
+ expect(sticking)
+ .to receive(:unstick)
+ .with(:user, 42)
- expect(described_class.all_caught_up?(:user, 42)).to eq(true)
+ expect(sticking.all_caught_up?(:user, 42)).to eq(true)
end
it 'notifies with the proper event payload' do
@@ -87,7 +112,7 @@ RSpec.describe Gitlab::Database::LoadBalancing::Sticking, :redis do
.with('caught_up_replica_pick.load_balancing', { result: true })
.and_call_original
- described_class.all_caught_up?(:user, 42)
+ sticking.all_caught_up?(:user, 42)
end
end
@@ -97,7 +122,7 @@ RSpec.describe Gitlab::Database::LoadBalancing::Sticking, :redis do
end
it 'returns false' do
- expect(described_class.all_caught_up?(:user, 42)).to eq(false)
+ expect(sticking.all_caught_up?(:user, 42)).to eq(false)
end
it 'notifies with the proper event payload' do
@@ -106,42 +131,43 @@ RSpec.describe Gitlab::Database::LoadBalancing::Sticking, :redis do
.with('caught_up_replica_pick.load_balancing', { result: false })
.and_call_original
- described_class.all_caught_up?(:user, 42)
+ sticking.all_caught_up?(:user, 42)
end
end
end
- describe '.unstick_or_continue_sticking' do
- let(:lb) { double(:lb) }
-
- before do
- allow(described_class).to receive(:load_balancer).and_return(lb)
- end
+ describe '#unstick_or_continue_sticking' do
+ let(:lb) { ActiveRecord::Base.connection.load_balancer }
it 'simply returns if no write location could be found' do
- allow(described_class).to receive(:last_write_location_for)
+ allow(sticking)
+ .to receive(:last_write_location_for)
.with(:user, 42)
.and_return(nil)
expect(lb).not_to receive(:select_up_to_date_host)
- described_class.unstick_or_continue_sticking(:user, 42)
+ sticking.unstick_or_continue_sticking(:user, 42)
end
it 'unsticks if all secondaries have caught up' do
- allow(described_class).to receive(:last_write_location_for)
+ allow(sticking)
+ .to receive(:last_write_location_for)
.with(:user, 42)
.and_return('foo')
allow(lb).to receive(:select_up_to_date_host).with('foo').and_return(true)
- expect(described_class).to receive(:unstick).with(:user, 42)
+ expect(sticking)
+ .to receive(:unstick)
+ .with(:user, 42)
- described_class.unstick_or_continue_sticking(:user, 42)
+ sticking.unstick_or_continue_sticking(:user, 42)
end
it 'continues using the primary if the secondaries have not yet caught up' do
- allow(described_class).to receive(:last_write_location_for)
+ allow(sticking)
+ .to receive(:last_write_location_for)
.with(:user, 42)
.and_return('foo')
@@ -150,184 +176,151 @@ RSpec.describe Gitlab::Database::LoadBalancing::Sticking, :redis do
expect(Gitlab::Database::LoadBalancing::Session.current)
.to receive(:use_primary!)
- described_class.unstick_or_continue_sticking(:user, 42)
+ sticking.unstick_or_continue_sticking(:user, 42)
end
end
RSpec.shared_examples 'sticking' do
- context 'when sticking is disabled' do
- it 'does not perform any sticking', :aggregate_failures do
- expect(described_class).not_to receive(:set_write_location_for)
- expect(Gitlab::Database::LoadBalancing::Session.current).not_to receive(:use_primary!)
-
- described_class.bulk_stick(:user, ids)
- end
+ before do
+ allow(ActiveRecord::Base.connection.load_balancer)
+ .to receive(:primary_write_location)
+ .and_return('foo')
end
- context 'when sticking is enabled' do
- before do
- allow(Gitlab::Database::LoadBalancing).to receive(:configured?).and_return(true)
-
- lb = double(:lb, primary_write_location: 'foo')
+ it 'sticks an entity to the primary', :aggregate_failures do
+ allow(ActiveRecord::Base.connection.load_balancer)
+ .to receive(:primary_only?)
+ .and_return(false)
- allow(described_class).to receive(:load_balancer).and_return(lb)
+ ids.each do |id|
+ expect(sticking)
+ .to receive(:set_write_location_for)
+ .with(:user, id, 'foo')
end
- it 'sticks an entity to the primary', :aggregate_failures do
- ids.each do |id|
- expect(described_class).to receive(:set_write_location_for)
- .with(:user, id, 'foo')
- end
+ expect(Gitlab::Database::LoadBalancing::Session.current)
+ .to receive(:use_primary!)
- expect(Gitlab::Database::LoadBalancing::Session.current)
- .to receive(:use_primary!)
+ subject
+ end
- subject
- end
+ it 'does not update the write location when no replicas are used' do
+ expect(sticking).not_to receive(:set_write_location_for)
+
+ subject
end
end
- describe '.stick' do
+ describe '#stick' do
it_behaves_like 'sticking' do
let(:ids) { [42] }
- subject { described_class.stick(:user, ids.first) }
+ subject { sticking.stick(:user, ids.first) }
end
end
- describe '.bulk_stick' do
+ describe '#bulk_stick' do
it_behaves_like 'sticking' do
let(:ids) { [42, 43] }
- subject { described_class.bulk_stick(:user, ids) }
+ subject { sticking.bulk_stick(:user, ids) }
end
end
- describe '.mark_primary_write_location' do
- context 'when enabled' do
- before do
- allow(Gitlab::Database::LoadBalancing).to receive(:enable?).and_return(true)
- allow(Gitlab::Database::LoadBalancing).to receive(:configured?).and_return(true)
- end
-
- it 'updates the write location with the load balancer' do
- lb = double(:lb, primary_write_location: 'foo')
+ describe '#mark_primary_write_location' do
+ it 'updates the write location with the load balancer' do
+ allow(ActiveRecord::Base.connection.load_balancer)
+ .to receive(:primary_write_location)
+ .and_return('foo')
- allow(described_class).to receive(:load_balancer).and_return(lb)
+ allow(ActiveRecord::Base.connection.load_balancer)
+ .to receive(:primary_only?)
+ .and_return(false)
- expect(described_class).to receive(:set_write_location_for)
- .with(:user, 42, 'foo')
+ expect(sticking)
+ .to receive(:set_write_location_for)
+ .with(:user, 42, 'foo')
- described_class.mark_primary_write_location(:user, 42)
- end
+ sticking.mark_primary_write_location(:user, 42)
end
- context 'when load balancing is configured but not enabled' do
- before do
- allow(Gitlab::Database::LoadBalancing).to receive(:enable?).and_return(false)
- allow(Gitlab::Database::LoadBalancing).to receive(:configured?).and_return(true)
- end
-
- it 'updates the write location with the main ActiveRecord connection' do
- allow(described_class).to receive(:load_balancer).and_return(nil)
- expect(ActiveRecord::Base).to receive(:connection).and_call_original
- expect(described_class).to receive(:set_write_location_for)
- .with(:user, 42, anything)
+ it 'does nothing when no replicas are used' do
+ expect(sticking).not_to receive(:set_write_location_for)
- described_class.mark_primary_write_location(:user, 42)
- end
-
- context 'when write location is nil' do
- before do
- allow(Gitlab::Database.main).to receive(:get_write_location).and_return(nil)
- end
+ sticking.mark_primary_write_location(:user, 42)
+ end
+ end
- it 'does not update the write location' do
- expect(described_class).not_to receive(:set_write_location_for)
+ describe '#unstick' do
+ it 'removes the sticking data from Redis' do
+ sticking.set_write_location_for(:user, 4, 'foo')
+ sticking.unstick(:user, 4)
- described_class.mark_primary_write_location(:user, 42)
- end
- end
+ expect(sticking.last_write_location_for(:user, 4)).to be_nil
end
- context 'when load balancing is disabled' do
- before do
- allow(Gitlab::Database::LoadBalancing).to receive(:enable?).and_return(false)
- allow(Gitlab::Database::LoadBalancing).to receive(:configured?).and_return(false)
+ it 'removes the old key' do
+ Gitlab::Redis::SharedState.with do |redis|
+ redis.set(sticking.send(:old_redis_key_for, :user, 4), 'foo', ex: 30)
end
- it 'updates the write location with the main ActiveRecord connection' do
- expect(described_class).not_to receive(:set_write_location_for)
-
- described_class.mark_primary_write_location(:user, 42)
- end
+ sticking.unstick(:user, 4)
+ expect(sticking.last_write_location_for(:user, 4)).to be_nil
end
end
- describe '.unstick' do
- it 'removes the sticking data from Redis' do
- described_class.set_write_location_for(:user, 4, 'foo')
- described_class.unstick(:user, 4)
+ describe '#last_write_location_for' do
+ it 'returns the last WAL write location for a user' do
+ sticking.set_write_location_for(:user, 4, 'foo')
- expect(described_class.last_write_location_for(:user, 4)).to be_nil
+ expect(sticking.last_write_location_for(:user, 4)).to eq('foo')
end
- end
- describe '.last_write_location_for' do
- it 'returns the last WAL write location for a user' do
- described_class.set_write_location_for(:user, 4, 'foo')
+ it 'falls back to reading the old key' do
+ Gitlab::Redis::SharedState.with do |redis|
+ redis.set(sticking.send(:old_redis_key_for, :user, 4), 'foo', ex: 30)
+ end
- expect(described_class.last_write_location_for(:user, 4)).to eq('foo')
+ expect(sticking.last_write_location_for(:user, 4)).to eq('foo')
end
end
- describe '.redis_key_for' do
+ describe '#redis_key_for' do
it 'returns a String' do
- expect(described_class.redis_key_for(:user, 42))
- .to eq('database-load-balancing/write-location/user/42')
+ expect(sticking.redis_key_for(:user, 42))
+ .to eq('database-load-balancing/write-location/main/user/42')
end
end
- describe '.load_balancer' do
- it 'returns a the load balancer' do
- proxy = double(:proxy)
-
- expect(Gitlab::Database::LoadBalancing).to receive(:proxy)
- .and_return(proxy)
-
- expect(proxy).to receive(:load_balancer)
-
- described_class.load_balancer
- end
- end
-
- describe '.select_caught_up_replicas' do
- let(:lb) { double(:lb) }
-
- before do
- allow(described_class).to receive(:load_balancer).and_return(lb)
- end
+ describe '#select_caught_up_replicas' do
+ let(:lb) { ActiveRecord::Base.connection.load_balancer }
context 'with no write location' do
before do
- allow(described_class).to receive(:last_write_location_for)
- .with(:project, 42).and_return(nil)
+ allow(sticking)
+ .to receive(:last_write_location_for)
+ .with(:project, 42)
+ .and_return(nil)
end
it 'returns false and does not try to find caught up hosts' do
expect(lb).not_to receive(:select_up_to_date_host)
- expect(described_class.select_caught_up_replicas(:project, 42)).to be false
+ expect(sticking.select_caught_up_replicas(:project, 42)).to be false
end
end
context 'with write location' do
before do
- allow(described_class).to receive(:last_write_location_for)
- .with(:project, 42).and_return('foo')
+ allow(sticking)
+ .to receive(:last_write_location_for)
+ .with(:project, 42)
+ .and_return('foo')
end
it 'returns true, selects hosts, and unsticks if any secondary has caught up' do
expect(lb).to receive(:select_up_to_date_host).and_return(true)
- expect(described_class).to receive(:unstick).with(:project, 42)
- expect(described_class.select_caught_up_replicas(:project, 42)).to be true
+ expect(sticking)
+ .to receive(:unstick)
+ .with(:project, 42)
+ expect(sticking.select_caught_up_replicas(:project, 42)).to be true
end
end
end
diff --git a/spec/lib/gitlab/database/load_balancing_spec.rb b/spec/lib/gitlab/database/load_balancing_spec.rb
index f40ad444081..bf5314e2c34 100644
--- a/spec/lib/gitlab/database/load_balancing_spec.rb
+++ b/spec/lib/gitlab/database/load_balancing_spec.rb
@@ -3,203 +3,52 @@
require 'spec_helper'
RSpec.describe Gitlab::Database::LoadBalancing do
- describe '.proxy' do
- before do
- @previous_proxy = ActiveRecord::Base.load_balancing_proxy
+ describe '.base_models' do
+ it 'returns the models to apply load balancing to' do
+ models = described_class.base_models
- ActiveRecord::Base.load_balancing_proxy = connection_proxy
- end
-
- after do
- ActiveRecord::Base.load_balancing_proxy = @previous_proxy
- end
-
- context 'when configured' do
- let(:connection_proxy) { double(:connection_proxy) }
-
- it 'returns the connection proxy' do
- expect(subject.proxy).to eq(connection_proxy)
- end
- end
-
- context 'when not configured' do
- let(:connection_proxy) { nil }
+ expect(models).to include(ActiveRecord::Base)
- it 'returns nil' do
- expect(subject.proxy).to be_nil
+ if Gitlab::Database.has_config?(:ci)
+ expect(models).to include(Ci::CiDatabaseRecord)
end
-
- it 'tracks an error to sentry' do
- expect(Gitlab::ErrorTracking).to receive(:track_exception).with(
- an_instance_of(subject::ProxyNotConfiguredError)
- )
-
- subject.proxy
- end
- end
- end
-
- describe '.configuration' do
- it 'returns the configuration for the load balancer' do
- raw = ActiveRecord::Base.connection_db_config.configuration_hash
- cfg = described_class.configuration
-
- # There isn't much to test here as the load balancing settings might not
- # (and likely aren't) set when running tests.
- expect(cfg.pool_size).to eq(raw[:pool])
- end
- end
-
- describe '.enable?' do
- before do
- allow(described_class.configuration)
- .to receive(:hosts)
- .and_return(%w(foo))
- end
-
- it 'returns false when no hosts are specified' do
- allow(described_class.configuration).to receive(:hosts).and_return([])
-
- expect(described_class.enable?).to eq(false)
- end
-
- it 'returns true when Sidekiq is being used' do
- allow(Gitlab::Runtime).to receive(:sidekiq?).and_return(true)
-
- expect(described_class.enable?).to eq(true)
- end
-
- it 'returns false when running inside a Rake task' do
- allow(Gitlab::Runtime).to receive(:rake?).and_return(true)
-
- expect(described_class.enable?).to eq(false)
- end
-
- it 'returns true when load balancing should be enabled' do
- allow(Gitlab::Runtime).to receive(:sidekiq?).and_return(false)
-
- expect(described_class.enable?).to eq(true)
end
- it 'returns true when service discovery is enabled' do
- allow(described_class.configuration).to receive(:hosts).and_return([])
- allow(Gitlab::Runtime).to receive(:sidekiq?).and_return(false)
-
- allow(described_class.configuration)
- .to receive(:service_discovery_enabled?)
- .and_return(true)
-
- expect(described_class.enable?).to eq(true)
+ it 'returns the models as a frozen array' do
+ expect(described_class.base_models).to be_frozen
end
end
- describe '.configured?' do
- it 'returns true when hosts are configured' do
- allow(described_class.configuration)
- .to receive(:hosts)
- .and_return(%w[foo])
-
- expect(described_class.configured?).to eq(true)
- end
+ describe '.each_load_balancer' do
+ it 'yields every load balancer to the supplied block' do
+ lbs = []
- it 'returns true when service discovery is enabled' do
- allow(described_class.configuration).to receive(:hosts).and_return([])
- allow(described_class.configuration)
- .to receive(:service_discovery_enabled?)
- .and_return(true)
+ described_class.each_load_balancer do |lb|
+ lbs << lb
+ end
- expect(described_class.configured?).to eq(true)
+ expect(lbs.length).to eq(described_class.base_models.length)
end
- it 'returns false when neither service discovery nor hosts are configured' do
- allow(described_class.configuration).to receive(:hosts).and_return([])
- allow(described_class.configuration)
- .to receive(:service_discovery_enabled?)
- .and_return(false)
+ it 'returns an Enumerator when no block is given' do
+ res = described_class.each_load_balancer
- expect(described_class.configured?).to eq(false)
+ expect(res.next)
+ .to be_an_instance_of(Gitlab::Database::LoadBalancing::LoadBalancer)
end
end
- describe '.configure_proxy' do
- before do
- allow(ActiveRecord::Base).to receive(:load_balancing_proxy=)
- end
-
- it 'configures the connection proxy' do
- described_class.configure_proxy
-
- expect(ActiveRecord::Base).to have_received(:load_balancing_proxy=)
- .with(Gitlab::Database::LoadBalancing::ConnectionProxy)
- end
-
- context 'when service discovery is enabled' do
- it 'runs initial service discovery when configuring the connection proxy' do
- discover = instance_spy(Gitlab::Database::LoadBalancing::ServiceDiscovery)
-
- allow(described_class.configuration)
- .to receive(:service_discovery)
- .and_return({ record: 'foo' })
-
- expect(Gitlab::Database::LoadBalancing::ServiceDiscovery)
- .to receive(:new)
- .with(
- an_instance_of(Gitlab::Database::LoadBalancing::LoadBalancer),
- an_instance_of(Hash)
- )
- .and_return(discover)
-
- expect(discover).to receive(:perform_service_discovery)
-
- described_class.configure_proxy
+ describe '.release_hosts' do
+ it 'releases the host of every load balancer' do
+ described_class.each_load_balancer do |lb|
+ expect(lb).to receive(:release_host)
end
- end
- end
-
- describe '.start_service_discovery' do
- it 'does not start if service discovery is disabled' do
- expect(Gitlab::Database::LoadBalancing::ServiceDiscovery)
- .not_to receive(:new)
- described_class.start_service_discovery
- end
-
- it 'starts service discovery if enabled' do
- allow(described_class.configuration)
- .to receive(:service_discovery_enabled?)
- .and_return(true)
-
- instance = double(:instance)
- config = Gitlab::Database::LoadBalancing::Configuration
- .new(ActiveRecord::Base)
- lb = Gitlab::Database::LoadBalancing::LoadBalancer.new(config)
- proxy = Gitlab::Database::LoadBalancing::ConnectionProxy.new(lb)
-
- allow(described_class)
- .to receive(:proxy)
- .and_return(proxy)
-
- expect(Gitlab::Database::LoadBalancing::ServiceDiscovery)
- .to receive(:new)
- .with(lb, an_instance_of(Hash))
- .and_return(instance)
-
- expect(instance)
- .to receive(:start)
-
- described_class.start_service_discovery
+ described_class.release_hosts
end
end
describe '.db_role_for_connection' do
- context 'when the load balancing is not configured' do
- let(:connection) { ActiveRecord::Base.connection }
-
- it 'returns primary' do
- expect(described_class.db_role_for_connection(connection)).to eq(:primary)
- end
- end
-
context 'when the NullPool is used for connection' do
let(:pool) { ActiveRecord::ConnectionAdapters::NullPool.new }
let(:connection) { double(:connection, pool: pool) }
@@ -253,7 +102,7 @@ RSpec.describe Gitlab::Database::LoadBalancing do
# - In each test, we listen to the SQL queries (via sql.active_record
# instrumentation) while triggering real queries from the defined model.
# - We assert the desinations (replica/primary) of the queries in order.
- describe 'LoadBalancing integration tests', :db_load_balancing, :delete do
+ describe 'LoadBalancing integration tests', :database_replica, :delete do
before(:all) do
ActiveRecord::Schema.define do
create_table :load_balancing_test, force: true do |t|
@@ -274,10 +123,6 @@ RSpec.describe Gitlab::Database::LoadBalancing do
end
end
- before do
- model.singleton_class.prepend ::Gitlab::Database::LoadBalancing::ActiveRecordProxy
- end
-
where(:queries, :include_transaction, :expected_results) do
[
# Read methods
diff --git a/spec/lib/gitlab/database/migration_helpers/loose_foreign_key_helpers_spec.rb b/spec/lib/gitlab/database/migration_helpers/loose_foreign_key_helpers_spec.rb
index 708d1be6e00..54b3ad22faf 100644
--- a/spec/lib/gitlab/database/migration_helpers/loose_foreign_key_helpers_spec.rb
+++ b/spec/lib/gitlab/database/migration_helpers/loose_foreign_key_helpers_spec.rb
@@ -19,6 +19,10 @@ RSpec.describe Gitlab::Database::MigrationHelpers::LooseForeignKeyHelpers do
end
end
+ after(:all) do
+ migration.drop_table :loose_fk_test_table
+ end
+
before do
3.times { model.create! }
end
@@ -45,8 +49,9 @@ RSpec.describe Gitlab::Database::MigrationHelpers::LooseForeignKeyHelpers do
expect(LooseForeignKeys::DeletedRecord.count).to eq(1)
deleted_record = LooseForeignKeys::DeletedRecord.all.first
- expect(deleted_record.deleted_table_primary_key_value).to eq(record_to_be_deleted.id)
- expect(deleted_record.deleted_table_name).to eq('loose_fk_test_table')
+ expect(deleted_record.primary_key_value).to eq(record_to_be_deleted.id)
+ expect(deleted_record.fully_qualified_table_name).to eq('public.loose_fk_test_table')
+ expect(deleted_record.partition).to eq(1)
end
it 'stores multiple record deletions' do
diff --git a/spec/lib/gitlab/database/migration_helpers_spec.rb b/spec/lib/gitlab/database/migration_helpers_spec.rb
index 006f8a39f9c..d89af1521a2 100644
--- a/spec/lib/gitlab/database/migration_helpers_spec.rb
+++ b/spec/lib/gitlab/database/migration_helpers_spec.rb
@@ -1631,10 +1631,19 @@ RSpec.describe Gitlab::Database::MigrationHelpers do
let(:worker) do
Class.new do
include Sidekiq::Worker
+
sidekiq_options queue: 'test'
+
+ def self.name
+ 'WorkerClass'
+ end
end
end
+ before do
+ stub_const(worker.name, worker)
+ end
+
describe '#sidekiq_queue_length' do
context 'when queue is empty' do
it 'returns zero' do
diff --git a/spec/lib/gitlab/database/migrations/instrumentation_spec.rb b/spec/lib/gitlab/database/migrations/instrumentation_spec.rb
index 5945e5a2039..841d2a98a16 100644
--- a/spec/lib/gitlab/database/migrations/instrumentation_spec.rb
+++ b/spec/lib/gitlab/database/migrations/instrumentation_spec.rb
@@ -2,8 +2,13 @@
require 'spec_helper'
RSpec.describe Gitlab::Database::Migrations::Instrumentation do
+ let(:result_dir) { Dir.mktmpdir }
+
+ after do
+ FileUtils.rm_rf(result_dir)
+ end
describe '#observe' do
- subject { described_class.new }
+ subject { described_class.new(result_dir: result_dir) }
let(:migration_name) { 'test' }
let(:migration_version) { '12345' }
@@ -13,7 +18,7 @@ RSpec.describe Gitlab::Database::Migrations::Instrumentation do
end
context 'behavior with observers' do
- subject { described_class.new([Gitlab::Database::Migrations::Observers::MigrationObserver]).observe(version: migration_version, name: migration_name) {} }
+ subject { described_class.new(observer_classes: [Gitlab::Database::Migrations::Observers::MigrationObserver], result_dir: result_dir).observe(version: migration_version, name: migration_name) {} }
let(:observer) { instance_double('Gitlab::Database::Migrations::Observers::MigrationObserver', before: nil, after: nil, record: nil) }
@@ -24,7 +29,7 @@ RSpec.describe Gitlab::Database::Migrations::Instrumentation do
it 'instantiates observer with observation' do
expect(Gitlab::Database::Migrations::Observers::MigrationObserver)
.to receive(:new)
- .with(instance_of(Gitlab::Database::Migrations::Observation)) { |observation| expect(observation.version).to eq(migration_version) }
+ .with(instance_of(Gitlab::Database::Migrations::Observation), anything) { |observation| expect(observation.version).to eq(migration_version) }
.and_return(observer)
subject
@@ -58,7 +63,7 @@ RSpec.describe Gitlab::Database::Migrations::Instrumentation do
end
context 'on successful execution' do
- subject { described_class.new.observe(version: migration_version, name: migration_name) {} }
+ subject { described_class.new(result_dir: result_dir).observe(version: migration_version, name: migration_name) {} }
it 'records walltime' do
expect(subject.walltime).not_to be_nil
@@ -78,7 +83,7 @@ RSpec.describe Gitlab::Database::Migrations::Instrumentation do
end
context 'upon failure' do
- subject { described_class.new.observe(version: migration_version, name: migration_name) { raise 'something went wrong' } }
+ subject { described_class.new(result_dir: result_dir).observe(version: migration_version, name: migration_name) { raise 'something went wrong' } }
it 'raises the exception' do
expect { subject }.to raise_error(/something went wrong/)
@@ -93,7 +98,7 @@ RSpec.describe Gitlab::Database::Migrations::Instrumentation do
# ignore
end
- let(:instance) { described_class.new }
+ let(:instance) { described_class.new(result_dir: result_dir) }
it 'records walltime' do
expect(subject.walltime).not_to be_nil
@@ -114,7 +119,7 @@ RSpec.describe Gitlab::Database::Migrations::Instrumentation do
end
context 'sequence of migrations with failures' do
- subject { described_class.new }
+ subject { described_class.new(result_dir: result_dir) }
let(:migration1) { double('migration1', call: nil) }
let(:migration2) { double('migration2', call: nil) }
diff --git a/spec/lib/gitlab/database/migrations/observers/query_details_spec.rb b/spec/lib/gitlab/database/migrations/observers/query_details_spec.rb
index 36885a1594f..191ac29e3b3 100644
--- a/spec/lib/gitlab/database/migrations/observers/query_details_spec.rb
+++ b/spec/lib/gitlab/database/migrations/observers/query_details_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
RSpec.describe Gitlab::Database::Migrations::Observers::QueryDetails do
- subject { described_class.new(observation) }
+ subject { described_class.new(observation, directory_path) }
let(:observation) { Gitlab::Database::Migrations::Observation.new(migration_version, migration_name) }
let(:connection) { ActiveRecord::Base.connection }
@@ -14,10 +14,6 @@ RSpec.describe Gitlab::Database::Migrations::Observers::QueryDetails do
let(:migration_version) { 20210422152437 }
let(:migration_name) { 'test' }
- before do
- stub_const('Gitlab::Database::Migrations::Instrumentation::RESULT_DIR', directory_path)
- end
-
after do
FileUtils.remove_entry(directory_path)
end
diff --git a/spec/lib/gitlab/database/migrations/observers/query_log_spec.rb b/spec/lib/gitlab/database/migrations/observers/query_log_spec.rb
index 2a49d8e8b73..2e70a85fd5b 100644
--- a/spec/lib/gitlab/database/migrations/observers/query_log_spec.rb
+++ b/spec/lib/gitlab/database/migrations/observers/query_log_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
RSpec.describe Gitlab::Database::Migrations::Observers::QueryLog do
- subject { described_class.new(observation) }
+ subject { described_class.new(observation, directory_path) }
let(:observation) { Gitlab::Database::Migrations::Observation.new(migration_version, migration_name) }
let(:connection) { ActiveRecord::Base.connection }
@@ -11,10 +11,6 @@ RSpec.describe Gitlab::Database::Migrations::Observers::QueryLog do
let(:migration_version) { 20210422152437 }
let(:migration_name) { 'test' }
- before do
- stub_const('Gitlab::Database::Migrations::Instrumentation::RESULT_DIR', directory_path)
- end
-
after do
FileUtils.remove_entry(directory_path)
end
diff --git a/spec/lib/gitlab/database/migrations/observers/query_statistics_spec.rb b/spec/lib/gitlab/database/migrations/observers/query_statistics_spec.rb
index 32a25fdaa28..9727a215d71 100644
--- a/spec/lib/gitlab/database/migrations/observers/query_statistics_spec.rb
+++ b/spec/lib/gitlab/database/migrations/observers/query_statistics_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
RSpec.describe Gitlab::Database::Migrations::Observers::QueryStatistics do
- subject { described_class.new(observation) }
+ subject { described_class.new(observation, double("unused path")) }
let(:observation) { Gitlab::Database::Migrations::Observation.new }
let(:connection) { ActiveRecord::Base.connection }
diff --git a/spec/lib/gitlab/database/migrations/observers/total_database_size_change_spec.rb b/spec/lib/gitlab/database/migrations/observers/total_database_size_change_spec.rb
index 61e28003e66..e689759c574 100644
--- a/spec/lib/gitlab/database/migrations/observers/total_database_size_change_spec.rb
+++ b/spec/lib/gitlab/database/migrations/observers/total_database_size_change_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
RSpec.describe Gitlab::Database::Migrations::Observers::TotalDatabaseSizeChange do
- subject { described_class.new(observation) }
+ subject { described_class.new(observation, double('unused path')) }
let(:observation) { Gitlab::Database::Migrations::Observation.new }
let(:connection) { ActiveRecord::Base.connection }
diff --git a/spec/lib/gitlab/database/migrations/runner_spec.rb b/spec/lib/gitlab/database/migrations/runner_spec.rb
new file mode 100644
index 00000000000..52fb5ec2ba8
--- /dev/null
+++ b/spec/lib/gitlab/database/migrations/runner_spec.rb
@@ -0,0 +1,109 @@
+# frozen_string_literal: true
+require 'spec_helper'
+
+RSpec.describe Gitlab::Database::Migrations::Runner do
+ let(:result_dir) { Pathname.new(Dir.mktmpdir) }
+
+ let(:migration_runs) { [] } # This list gets populated as the runner tries to run migrations
+
+ # Tests depend on all of these lists being sorted in the order migrations would be applied
+ let(:applied_migrations_other_branches) { [double(ActiveRecord::Migration, version: 1, name: 'migration_complete_other_branch')] }
+
+ let(:applied_migrations_this_branch) do
+ [
+ double(ActiveRecord::Migration, version: 2, name: 'older_migration_complete_this_branch'),
+ double(ActiveRecord::Migration, version: 3, name: 'newer_migration_complete_this_branch')
+ ].sort_by(&:version)
+ end
+
+ let(:pending_migrations) do
+ [
+ double(ActiveRecord::Migration, version: 4, name: 'older_migration_pending'),
+ double(ActiveRecord::Migration, version: 5, name: 'newer_migration_pending')
+ ].sort_by(&:version)
+ end
+
+ before do
+ stub_const('Gitlab::Database::Migrations::Runner::BASE_RESULT_DIR', result_dir)
+ allow(ActiveRecord::Migrator).to receive(:new) do |dir, _all_migrations, _schema_migration_class, version_to_migrate|
+ migrator = double(ActiveRecord::Migrator)
+ expect(migrator).to receive(:run) do
+ migration_runs << OpenStruct.new(dir: dir, version_to_migrate: version_to_migrate)
+ end
+ migrator
+ end
+
+ all_versions = (applied_migrations_other_branches + applied_migrations_this_branch).map(&:version)
+ migrations = applied_migrations_other_branches + applied_migrations_this_branch + pending_migrations
+ ctx = double(ActiveRecord::MigrationContext, get_all_versions: all_versions, migrations: migrations, schema_migration: ActiveRecord::SchemaMigration)
+
+ allow(described_class).to receive(:migration_context).and_return(ctx)
+
+ names_this_branch = (applied_migrations_this_branch + pending_migrations).map { |m| "db/migrate/#{m.version}_#{m.name}.rb"}
+ allow(described_class).to receive(:migration_file_names_this_branch).and_return(names_this_branch)
+ end
+
+ after do
+ FileUtils.rm_rf(result_dir)
+ end
+
+ it 'creates the results dir when one does not exist' do
+ FileUtils.rm_rf(result_dir)
+
+ expect do
+ described_class.new(direction: :up, migrations: [], result_dir: result_dir).run
+ end.to change { Dir.exist?(result_dir) }.from(false).to(true)
+ end
+
+ describe '.up' do
+ context 'result directory' do
+ it 'uses the /up subdirectory' do
+ expect(described_class.up.result_dir).to eq(result_dir.join('up'))
+ end
+ end
+
+ context 'migrations to run' do
+ subject(:up) { described_class.up }
+
+ it 'is the list of pending migrations' do
+ expect(up.migrations).to eq(pending_migrations)
+ end
+ end
+
+ context 'running migrations' do
+ subject(:up) { described_class.up }
+
+ it 'runs the unapplied migrations in version order', :aggregate_failures do
+ up.run
+
+ expect(migration_runs.map(&:dir)).to eq([:up, :up])
+ expect(migration_runs.map(&:version_to_migrate)).to eq(pending_migrations.map(&:version))
+ end
+ end
+ end
+
+ describe '.down' do
+ subject(:down) { described_class.down }
+
+ context 'result directory' do
+ it 'is the /down subdirectory' do
+ expect(down.result_dir).to eq(result_dir.join('down'))
+ end
+ end
+
+ context 'migrations to run' do
+ it 'is the list of migrations that are up and on this branch' do
+ expect(down.migrations).to eq(applied_migrations_this_branch)
+ end
+ end
+
+ context 'running migrations' do
+ it 'runs the applied migrations for the current branch in reverse order', :aggregate_failures do
+ down.run
+
+ expect(migration_runs.map(&:dir)).to eq([:down, :down])
+ expect(migration_runs.map(&:version_to_migrate)).to eq(applied_migrations_this_branch.reverse.map(&:version))
+ end
+ end
+ end
+end
diff --git a/spec/lib/gitlab/database/partitioning/detached_partition_dropper_spec.rb b/spec/lib/gitlab/database/partitioning/detached_partition_dropper_spec.rb
index 8523b7104f0..8c406c90e36 100644
--- a/spec/lib/gitlab/database/partitioning/detached_partition_dropper_spec.rb
+++ b/spec/lib/gitlab/database/partitioning/detached_partition_dropper_spec.rb
@@ -84,6 +84,7 @@ RSpec.describe Gitlab::Database::Partitioning::DetachedPartitionDropper do
before do
stub_feature_flags(drop_detached_partitions: false)
end
+
it 'does not drop the partition' do
subject.perform
@@ -162,8 +163,8 @@ RSpec.describe Gitlab::Database::Partitioning::DetachedPartitionDropper do
context 'when the first drop returns an error' do
it 'still drops the second partition' do
- expect(subject).to receive(:drop_one).ordered.and_raise('injected error')
- expect(subject).to receive(:drop_one).ordered.and_call_original
+ expect(subject).to receive(:drop_detached_partition).ordered.and_raise('injected error')
+ expect(subject).to receive(:drop_detached_partition).ordered.and_call_original
subject.perform
diff --git a/spec/lib/gitlab/database/partitioning/multi_database_partition_dropper_spec.rb b/spec/lib/gitlab/database/partitioning/multi_database_partition_dropper_spec.rb
new file mode 100644
index 00000000000..56d6ebb7aff
--- /dev/null
+++ b/spec/lib/gitlab/database/partitioning/multi_database_partition_dropper_spec.rb
@@ -0,0 +1,38 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::Database::Partitioning::MultiDatabasePartitionDropper, '#drop_detached_partitions' do
+ subject(:drop_detached_partitions) { multi_db_dropper.drop_detached_partitions }
+
+ let(:multi_db_dropper) { described_class.new }
+
+ let(:connection_wrapper1) { double(scope: scope1) }
+ let(:connection_wrapper2) { double(scope: scope2) }
+
+ let(:scope1) { double(connection: connection1) }
+ let(:scope2) { double(connection: connection2) }
+
+ let(:connection1) { double('connection') }
+ let(:connection2) { double('connection') }
+
+ let(:dropper_class) { Gitlab::Database::Partitioning::DetachedPartitionDropper }
+ let(:dropper1) { double('partition dropper') }
+ let(:dropper2) { double('partition dropper') }
+
+ before do
+ allow(multi_db_dropper).to receive(:databases).and_return({ db1: connection_wrapper1, db2: connection_wrapper2 })
+ end
+
+ it 'drops detached partitions for each database' do
+ expect(Gitlab::Database::SharedModel).to receive(:using_connection).with(connection1).and_yield.ordered
+ expect(dropper_class).to receive(:new).and_return(dropper1).ordered
+ expect(dropper1).to receive(:perform)
+
+ expect(Gitlab::Database::SharedModel).to receive(:using_connection).with(connection2).and_yield.ordered
+ expect(dropper_class).to receive(:new).and_return(dropper2).ordered
+ expect(dropper2).to receive(:perform)
+
+ drop_detached_partitions
+ end
+end
diff --git a/spec/lib/gitlab/database/partitioning/partition_manager_spec.rb b/spec/lib/gitlab/database/partitioning/partition_manager_spec.rb
index 8f1f5b5ba1b..7c4cfcfb3a9 100644
--- a/spec/lib/gitlab/database/partitioning/partition_manager_spec.rb
+++ b/spec/lib/gitlab/database/partitioning/partition_manager_spec.rb
@@ -176,7 +176,7 @@ RSpec.describe Gitlab::Database::Partitioning::PartitionManager do
end
it 'detaches exactly one partition' do
- expect { subject }.to change { find_partitions(my_model.table_name, schema: Gitlab::Database::DYNAMIC_PARTITIONS_SCHEMA).size }.from(9).to(8)
+ expect { subject }.to change { find_partitions(my_model.table_name).size }.from(9).to(8)
end
it 'detaches the old partition' do
diff --git a/spec/lib/gitlab/database/partitioning_spec.rb b/spec/lib/gitlab/database/partitioning_spec.rb
index f163b45e01e..486af9413e8 100644
--- a/spec/lib/gitlab/database/partitioning_spec.rb
+++ b/spec/lib/gitlab/database/partitioning_spec.rb
@@ -33,4 +33,22 @@ RSpec.describe Gitlab::Database::Partitioning do
end
end
end
+
+ describe '.drop_detached_partitions' do
+ let(:partition_dropper_class) { described_class::MultiDatabasePartitionDropper }
+
+ it 'delegates to the partition dropper' do
+ expect_next_instance_of(partition_dropper_class) do |partition_dropper|
+ expect(partition_dropper).to receive(:drop_detached_partitions)
+ end
+
+ described_class.drop_detached_partitions
+ end
+ end
+
+ context 'ensure that the registered models have partitioning strategy' do
+ it 'fails when partitioning_strategy is not specified for the model' do
+ expect(described_class.registered_models).to all(respond_to(:partitioning_strategy))
+ end
+ end
end
diff --git a/spec/lib/gitlab/database/postgresql_adapter/force_disconnectable_mixin_spec.rb b/spec/lib/gitlab/database/postgresql_adapter/force_disconnectable_mixin_spec.rb
index 2a1f91b5b21..399fcae2fa0 100644
--- a/spec/lib/gitlab/database/postgresql_adapter/force_disconnectable_mixin_spec.rb
+++ b/spec/lib/gitlab/database/postgresql_adapter/force_disconnectable_mixin_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Gitlab::Database::PostgresqlAdapter::ForceDisconnectableMixin do
+RSpec.describe Gitlab::Database::PostgresqlAdapter::ForceDisconnectableMixin, :reestablished_active_record_base do
describe 'checking in a connection to the pool' do
let(:model) do
Class.new(ActiveRecord::Base) do
diff --git a/spec/lib/gitlab/database/schema_migrations/context_spec.rb b/spec/lib/gitlab/database/schema_migrations/context_spec.rb
index a79e6706149..0323fa22b78 100644
--- a/spec/lib/gitlab/database/schema_migrations/context_spec.rb
+++ b/spec/lib/gitlab/database/schema_migrations/context_spec.rb
@@ -23,19 +23,7 @@ RSpec.describe Gitlab::Database::SchemaMigrations::Context do
end
end
- context 'multiple databases' do
- let(:connection_class) do
- Class.new(::ApplicationRecord) do
- self.abstract_class = true
-
- def self.name
- 'Gitlab::Database::SchemaMigrations::Context::TestConnection'
- end
- end
- end
-
- let(:configuration_overrides) { {} }
-
+ context 'multiple databases', :reestablished_active_record_base do
before do
connection_class.establish_connection(
ActiveRecord::Base
@@ -46,10 +34,6 @@ RSpec.describe Gitlab::Database::SchemaMigrations::Context do
)
end
- after do
- connection_class.remove_connection
- end
-
context 'when `schema_migrations_path` is configured as string' do
let(:configuration_overrides) do
{ "schema_migrations_path" => "db/ci_schema_migrations" }
diff --git a/spec/lib/gitlab/database/with_lock_retries_spec.rb b/spec/lib/gitlab/database/with_lock_retries_spec.rb
index 0b960830d89..c2c818aa106 100644
--- a/spec/lib/gitlab/database/with_lock_retries_spec.rb
+++ b/spec/lib/gitlab/database/with_lock_retries_spec.rb
@@ -7,7 +7,7 @@ RSpec.describe Gitlab::Database::WithLockRetries do
let(:logger) { Gitlab::Database::WithLockRetries::NULL_LOGGER }
let(:subject) { described_class.new(env: env, logger: logger, allow_savepoints: allow_savepoints, timing_configuration: timing_configuration) }
let(:allow_savepoints) { true }
- let(:connection) { ActiveRecord::Base.connection }
+ let(:connection) { ActiveRecord::Base.retrieve_connection }
let(:timing_configuration) do
[
diff --git a/spec/lib/gitlab/database_spec.rb b/spec/lib/gitlab/database_spec.rb
index a9a8d5e6314..a2e7b6d27b9 100644
--- a/spec/lib/gitlab/database_spec.rb
+++ b/spec/lib/gitlab/database_spec.rb
@@ -15,6 +15,13 @@ RSpec.describe Gitlab::Database do
end
end
+ describe '.databases' do
+ it 'stores connections as a HashWithIndifferentAccess' do
+ expect(described_class.databases.has_key?('main')).to be true
+ expect(described_class.databases.has_key?(:main)).to be true
+ end
+ end
+
describe '.default_pool_size' do
before do
allow(Gitlab::Runtime).to receive(:max_threads).and_return(7)
@@ -185,10 +192,23 @@ RSpec.describe Gitlab::Database do
describe '.db_config_name' do
it 'returns the db_config name for the connection' do
- connection = ActiveRecord::Base.connection
+ model = ActiveRecord::Base
+
+ # This is a ConnectionProxy
+ expect(described_class.db_config_name(model.connection))
+ .to eq('unknown')
- expect(described_class.db_config_name(connection)).to be_a(String)
- expect(described_class.db_config_name(connection)).to eq(connection.pool.db_config.name)
+ # This is an actual connection
+ expect(described_class.db_config_name(model.retrieve_connection))
+ .to eq('main')
+ end
+
+ context 'when replicas are configured', :database_replica do
+ it 'returns the name for a replica' do
+ replica = ActiveRecord::Base.connection.load_balancer.host
+
+ expect(described_class.db_config_name(replica)).to eq('main_replica')
+ end
end
end
@@ -279,7 +299,7 @@ RSpec.describe Gitlab::Database do
expect(event).not_to be_nil
expect(event.duration).to be > 0.0
expect(event.payload).to a_hash_including(
- connection: be_a(ActiveRecord::ConnectionAdapters::AbstractAdapter)
+ connection: be_a(Gitlab::Database::LoadBalancing::ConnectionProxy)
)
end
end
@@ -296,7 +316,7 @@ RSpec.describe Gitlab::Database do
expect(event).not_to be_nil
expect(event.duration).to be > 0.0
expect(event.payload).to a_hash_including(
- connection: be_a(ActiveRecord::ConnectionAdapters::AbstractAdapter)
+ connection: be_a(Gitlab::Database::LoadBalancing::ConnectionProxy)
)
end
end
@@ -319,7 +339,7 @@ RSpec.describe Gitlab::Database do
expect(event).not_to be_nil
expect(event.duration).to be > 0.0
expect(event.payload).to a_hash_including(
- connection: be_a(ActiveRecord::ConnectionAdapters::AbstractAdapter)
+ connection: be_a(Gitlab::Database::LoadBalancing::ConnectionProxy)
)
end
end
@@ -340,7 +360,7 @@ RSpec.describe Gitlab::Database do
expect(event).not_to be_nil
expect(event.duration).to be > 0.0
expect(event.payload).to a_hash_including(
- connection: be_a(ActiveRecord::ConnectionAdapters::AbstractAdapter)
+ connection: be_a(Gitlab::Database::LoadBalancing::ConnectionProxy)
)
end
end
diff --git a/spec/lib/gitlab/doctor/secrets_spec.rb b/spec/lib/gitlab/doctor/secrets_spec.rb
index b9e054ce14f..f95a7eb1492 100644
--- a/spec/lib/gitlab/doctor/secrets_spec.rb
+++ b/spec/lib/gitlab/doctor/secrets_spec.rb
@@ -5,6 +5,8 @@ require 'spec_helper'
RSpec.describe Gitlab::Doctor::Secrets do
let!(:user) { create(:user, otp_secret: "test") }
let!(:group) { create(:group, runners_token: "test") }
+ let!(:project) { create(:project) }
+ let!(:grafana_integration) { create(:grafana_integration, project: project, token: "test") }
let(:logger) { double(:logger).as_null_object }
subject { described_class.new(logger).run! }
@@ -39,4 +41,12 @@ RSpec.describe Gitlab::Doctor::Secrets do
subject
end
end
+
+ context 'when GrafanaIntegration token is set via private method' do
+ it 'can access GrafanaIntegration token value' do
+ expect(logger).to receive(:info).with(/GrafanaIntegration failures: 0/)
+
+ subject
+ end
+ end
end
diff --git a/spec/lib/gitlab/email/handler/create_issue_handler_spec.rb b/spec/lib/gitlab/email/handler/create_issue_handler_spec.rb
index dd230140b30..bd4f1d164a8 100644
--- a/spec/lib/gitlab/email/handler/create_issue_handler_spec.rb
+++ b/spec/lib/gitlab/email/handler/create_issue_handler_spec.rb
@@ -136,6 +136,36 @@ RSpec.describe Gitlab::Email::Handler::CreateIssueHandler do
expect { handler.execute }.to raise_error(Gitlab::Email::ProjectNotFound)
end
end
+
+ context 'rate limiting' do
+ let(:rate_limited_service_feature_enabled) { nil }
+
+ before do
+ stub_feature_flags(rate_limited_service_issues_create: rate_limited_service_feature_enabled)
+ end
+
+ context 'when :rate_limited_service Feature is disabled' do
+ let(:rate_limited_service_feature_enabled) { false }
+
+ it 'does not attempt to throttle' do
+ expect(::Gitlab::ApplicationRateLimiter).not_to receive(:throttled?)
+
+ setup_attachment
+ receiver.execute
+ end
+ end
+
+ context 'when :rate_limited_service Feature is enabled' do
+ let(:rate_limited_service_feature_enabled) { true }
+
+ it 'raises a RateLimitedService::RateLimitedError' do
+ allow(::Gitlab::ApplicationRateLimiter).to receive(:throttled?).and_return(true)
+
+ setup_attachment
+ expect { receiver.execute }.to raise_error(RateLimitedService::RateLimitedError, _('This endpoint has been requested too many times. Try again later.'))
+ end
+ end
+ end
end
def email_fixture(path)
diff --git a/spec/lib/gitlab/email/handler/service_desk_handler_spec.rb b/spec/lib/gitlab/email/handler/service_desk_handler_spec.rb
index 2916e65528f..8cb1ccc065b 100644
--- a/spec/lib/gitlab/email/handler/service_desk_handler_spec.rb
+++ b/spec/lib/gitlab/email/handler/service_desk_handler_spec.rb
@@ -243,6 +243,15 @@ RSpec.describe Gitlab::Email::Handler::ServiceDeskHandler do
end
end
end
+
+ context 'when rate limiting is in effect' do
+ it 'allows unlimited new issue creation' do
+ stub_application_setting(issues_create_limit: 1)
+ setup_attachment
+
+ expect { 2.times { receiver.execute } }.to change { Issue.count }.by(2)
+ end
+ end
end
describe '#can_handle?' do
diff --git a/spec/lib/gitlab/email/hook/smime_signature_interceptor_spec.rb b/spec/lib/gitlab/email/hook/smime_signature_interceptor_spec.rb
index 56cf58dcf92..0a1f04ed793 100644
--- a/spec/lib/gitlab/email/hook/smime_signature_interceptor_spec.rb
+++ b/spec/lib/gitlab/email/hook/smime_signature_interceptor_spec.rb
@@ -14,15 +14,15 @@ RSpec.describe Gitlab::Email::Hook::SmimeSignatureInterceptor do
end
let(:root_certificate) do
- Gitlab::Email::Smime::Certificate.new(@root_ca[:key], @root_ca[:cert])
+ Gitlab::X509::Certificate.new(@root_ca[:key], @root_ca[:cert])
end
let(:intermediate_certificate) do
- Gitlab::Email::Smime::Certificate.new(@intermediate_ca[:key], @intermediate_ca[:cert])
+ Gitlab::X509::Certificate.new(@intermediate_ca[:key], @intermediate_ca[:cert])
end
let(:certificate) do
- Gitlab::Email::Smime::Certificate.new(@cert[:key], @cert[:cert], [intermediate_certificate.cert])
+ Gitlab::X509::Certificate.new(@cert[:key], @cert[:cert], [intermediate_certificate.cert])
end
let(:mail_body) { "signed hello with Unicode €áø and\r\n newlines\r\n" }
@@ -36,7 +36,7 @@ RSpec.describe Gitlab::Email::Hook::SmimeSignatureInterceptor do
end
before do
- allow(Gitlab::Email::Smime::Certificate).to receive_messages(from_files: certificate)
+ allow(Gitlab::X509::Certificate).to receive_messages(from_files: certificate)
Mail.register_interceptor(described_class)
mail.deliver_now
diff --git a/spec/lib/gitlab/email/smime/certificate_spec.rb b/spec/lib/gitlab/email/smime/certificate_spec.rb
deleted file mode 100644
index f7bb933e348..00000000000
--- a/spec/lib/gitlab/email/smime/certificate_spec.rb
+++ /dev/null
@@ -1,116 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Gitlab::Email::Smime::Certificate do
- include SmimeHelper
-
- # cert generation is an expensive operation and they are used read-only,
- # so we share them as instance variables in all tests
- before :context do
- @root_ca = generate_root
- @intermediate_ca = generate_intermediate(signer_ca: @root_ca)
- @cert = generate_cert(signer_ca: @intermediate_ca)
- end
-
- describe 'testing environment setup' do
- describe 'generate_root' do
- subject { @root_ca }
-
- it 'generates a root CA that expires a long way in the future' do
- expect(subject[:cert].not_after).to be > 999.years.from_now
- end
- end
-
- describe 'generate_intermediate' do
- subject { @intermediate_ca }
-
- it 'generates an intermediate CA that expires a long way in the future' do
- expect(subject[:cert].not_after).to be > 999.years.from_now
- end
-
- it 'generates an intermediate CA properly signed by the root CA' do
- expect(subject[:cert].issuer).to eq(@root_ca[:cert].subject)
- end
- end
-
- describe 'generate_cert' do
- subject { @cert }
-
- it 'generates a cert properly signed by the intermediate CA' do
- expect(subject[:cert].issuer).to eq(@intermediate_ca[:cert].subject)
- end
-
- it 'generates a cert that expires soon' do
- expect(subject[:cert].not_after).to be < 60.minutes.from_now
- end
-
- it 'generates a cert intended for email signing' do
- expect(subject[:cert].extensions).to include(an_object_having_attributes(oid: 'extendedKeyUsage', value: match('E-mail Protection')))
- end
-
- context 'passing in INFINITE_EXPIRY' do
- subject { generate_cert(signer_ca: @intermediate_ca, expires_in: SmimeHelper::INFINITE_EXPIRY) }
-
- it 'generates a cert that expires a long way in the future' do
- expect(subject[:cert].not_after).to be > 999.years.from_now
- end
- end
- end
- end
-
- describe '.from_strings' do
- it 'parses correctly a certificate and key' do
- parsed_cert = described_class.from_strings(@cert[:key].to_s, @cert[:cert].to_pem)
-
- common_cert_tests(parsed_cert, @cert, @intermediate_ca)
- end
- end
-
- describe '.from_files' do
- it 'parses correctly a certificate and key' do
- stub_file_read('a_key', content: @cert[:key].to_s)
- stub_file_read('a_cert', content: @cert[:cert].to_pem)
-
- parsed_cert = described_class.from_files('a_key', 'a_cert')
-
- common_cert_tests(parsed_cert, @cert, @intermediate_ca)
- end
-
- context 'with optional ca_certs' do
- it 'parses correctly certificate, key and ca_certs' do
- stub_file_read('a_key', content: @cert[:key].to_s)
- stub_file_read('a_cert', content: @cert[:cert].to_pem)
- stub_file_read('a_ca_cert', content: @intermediate_ca[:cert].to_pem)
-
- parsed_cert = described_class.from_files('a_key', 'a_cert', 'a_ca_cert')
-
- common_cert_tests(parsed_cert, @cert, @intermediate_ca, with_ca_certs: [@intermediate_ca[:cert]])
- end
- end
- end
-
- context 'with no intermediate CA' do
- it 'parses correctly a certificate and key' do
- cert = generate_cert(signer_ca: @root_ca)
-
- stub_file_read('a_key', content: cert[:key].to_s)
- stub_file_read('a_cert', content: cert[:cert].to_pem)
-
- parsed_cert = described_class.from_files('a_key', 'a_cert')
-
- common_cert_tests(parsed_cert, cert, @root_ca)
- end
- end
-
- def common_cert_tests(parsed_cert, cert, signer_ca, with_ca_certs: nil)
- expect(parsed_cert.cert).to be_a(OpenSSL::X509::Certificate)
- expect(parsed_cert.cert.subject).to eq(cert[:cert].subject)
- expect(parsed_cert.cert.issuer).to eq(signer_ca[:cert].subject)
- expect(parsed_cert.cert.not_before).to eq(cert[:cert].not_before)
- expect(parsed_cert.cert.not_after).to eq(cert[:cert].not_after)
- expect(parsed_cert.cert.extensions).to include(an_object_having_attributes(oid: 'extendedKeyUsage', value: match('E-mail Protection')))
- expect(parsed_cert.key).to be_a(OpenSSL::PKey::RSA)
- expect(parsed_cert.ca_certs).to match_array(Array.wrap(with_ca_certs)) if with_ca_certs
- end
-end
diff --git a/spec/lib/gitlab/endpoint_attributes_spec.rb b/spec/lib/gitlab/endpoint_attributes_spec.rb
new file mode 100644
index 00000000000..4d4cfed57fa
--- /dev/null
+++ b/spec/lib/gitlab/endpoint_attributes_spec.rb
@@ -0,0 +1,133 @@
+# frozen_string_literal: true
+
+require 'fast_spec_helper'
+require_relative "../../support/matchers/be_request_urgency"
+require_relative "../../../lib/gitlab/endpoint_attributes"
+
+RSpec.describe Gitlab::EndpointAttributes do
+ let(:base_controller) do
+ Class.new do
+ include ::Gitlab::EndpointAttributes
+ end
+ end
+
+ let(:controller) do
+ Class.new(base_controller) do
+ feature_category :foo, %w(update edit)
+ feature_category :bar, %w(index show)
+ feature_category :quux, %w(destroy)
+
+ urgency :high, %w(do_a)
+ urgency :low, %w(do_b do_c)
+ end
+ end
+
+ let(:subclass) do
+ Class.new(controller) do
+ feature_category :baz, %w(subclass_index)
+ urgency :high, %w(superclass_do_something)
+ end
+ end
+
+ it "is nil when nothing was defined" do
+ expect(base_controller.feature_category_for_action("hello")).to be_nil
+ end
+
+ it "returns the expected category", :aggregate_failures do
+ expect(controller.feature_category_for_action("update")).to eq(:foo)
+ expect(controller.feature_category_for_action("index")).to eq(:bar)
+ expect(controller.feature_category_for_action("destroy")).to eq(:quux)
+ end
+
+ it "falls back to default when urgency was not defined", :aggregate_failures do
+ expect(base_controller.urgency_for_action("hello")).to be_request_urgency(:default)
+ expect(controller.urgency_for_action("update")).to be_request_urgency(:default)
+ expect(controller.urgency_for_action("index")).to be_request_urgency(:default)
+ expect(controller.urgency_for_action("destroy")).to be_request_urgency(:default)
+ end
+
+ it "returns the expected urgency", :aggregate_failures do
+ expect(controller.urgency_for_action("do_a")).to be_request_urgency(:high)
+ expect(controller.urgency_for_action("do_b")).to be_request_urgency(:low)
+ expect(controller.urgency_for_action("do_c")).to be_request_urgency(:low)
+ end
+
+ it "returns feature category for an implied action if not specify actions" do
+ klass = Class.new(base_controller) do
+ feature_category :foo
+ end
+ expect(klass.feature_category_for_action("index")).to eq(:foo)
+ expect(klass.feature_category_for_action("show")).to eq(:foo)
+ end
+
+ it "returns expected duration for an implied action if not specify actions" do
+ klass = Class.new(base_controller) do
+ feature_category :foo
+ urgency :low
+ end
+ expect(klass.urgency_for_action("index")).to be_request_urgency(:low)
+ expect(klass.urgency_for_action("show")).to be_request_urgency(:low)
+ end
+
+ it "returns the expected category for categories defined in subclasses" do
+ expect(subclass.feature_category_for_action("subclass_index")).to eq(:baz)
+ end
+
+ it "falls back to superclass's feature category" do
+ expect(subclass.feature_category_for_action("update")).to eq(:foo)
+ end
+
+ it "returns the expected urgency for categories defined in subclasses" do
+ expect(subclass.urgency_for_action("superclass_do_something")).to be_request_urgency(:high)
+ end
+
+ it "falls back to superclass's expected duration" do
+ expect(subclass.urgency_for_action("do_a")).to be_request_urgency(:high)
+ end
+
+ it "raises an error when defining for the controller and for individual actions" do
+ expect do
+ Class.new(base_controller) do
+ feature_category :hello
+ feature_category :goodbye, [:world]
+ end
+ end.to raise_error(ArgumentError, "feature_category are already defined for all actions, but re-defined for world")
+ end
+
+ it "raises an error when multiple calls define the same action" do
+ expect do
+ Class.new(base_controller) do
+ feature_category :hello, [:world]
+ feature_category :goodbye, ["world"]
+ end
+ end.to raise_error(ArgumentError, "Attributes re-defined for action world: feature_category")
+ end
+
+ it "raises an error when multiple calls define the same action" do
+ expect do
+ Class.new(base_controller) do
+ urgency :high, [:world]
+ urgency :low, ["world"]
+ end
+ end.to raise_error(ArgumentError, "Attributes re-defined for action world: urgency")
+ end
+
+ it "does not raise an error when multiple calls define the same action and configs" do
+ expect do
+ Class.new(base_controller) do
+ feature_category :hello, [:world]
+ feature_category :hello, ["world"]
+ urgency :medium, [:moon]
+ urgency :medium, ["moon"]
+ end
+ end.not_to raise_error
+ end
+
+ it "raises an error if the expected duration is not supported" do
+ expect do
+ Class.new(base_controller) do
+ urgency :super_slow
+ end
+ end.to raise_error(ArgumentError, "Urgency not supported: super_slow")
+ end
+end
diff --git a/spec/lib/gitlab/etag_caching/router/graphql_spec.rb b/spec/lib/gitlab/etag_caching/router/graphql_spec.rb
index d151dcba413..9a6787e3640 100644
--- a/spec/lib/gitlab/etag_caching/router/graphql_spec.rb
+++ b/spec/lib/gitlab/etag_caching/router/graphql_spec.rb
@@ -11,7 +11,7 @@ RSpec.describe Gitlab::EtagCaching::Router::Graphql do
end
it 'has a valid feature category for every route', :aggregate_failures do
- feature_categories = YAML.load_file(Rails.root.join('config', 'feature_categories.yml')).to_set
+ feature_categories = Gitlab::FeatureCategories.default.categories
described_class::ROUTES.each do |route|
expect(feature_categories).to include(route.feature_category), "#{route.name} has a category of #{route.feature_category}, which is not valid"
diff --git a/spec/lib/gitlab/etag_caching/router/restful_spec.rb b/spec/lib/gitlab/etag_caching/router/restful_spec.rb
index 1f5cac09b6d..a0fc480369c 100644
--- a/spec/lib/gitlab/etag_caching/router/restful_spec.rb
+++ b/spec/lib/gitlab/etag_caching/router/restful_spec.rb
@@ -107,7 +107,7 @@ RSpec.describe Gitlab::EtagCaching::Router::Restful do
end
it 'has a valid feature category for every route', :aggregate_failures do
- feature_categories = YAML.load_file(Rails.root.join('config', 'feature_categories.yml')).to_set
+ feature_categories = Gitlab::FeatureCategories.default.categories
described_class::ROUTES.each do |route|
expect(feature_categories).to include(route.feature_category), "#{route.name} has a category of #{route.feature_category}, which is not valid"
diff --git a/spec/lib/gitlab/feature_categories_spec.rb b/spec/lib/gitlab/feature_categories_spec.rb
new file mode 100644
index 00000000000..daced154a69
--- /dev/null
+++ b/spec/lib/gitlab/feature_categories_spec.rb
@@ -0,0 +1,74 @@
+# frozen_string_literal: true
+
+require 'fast_spec_helper'
+
+RSpec.describe Gitlab::FeatureCategories do
+ let(:fake_categories) { %w(foo bar) }
+
+ subject { described_class.new(fake_categories) }
+
+ describe "#valid?" do
+ it "returns true if category is known", :aggregate_failures do
+ expect(subject.valid?('foo')).to be(true)
+ expect(subject.valid?('zzz')).to be(false)
+ end
+ end
+
+ describe "#from_request" do
+ let(:request_env) { {} }
+ let(:verified) { true }
+
+ def fake_request(request_feature_category)
+ double('request', env: request_env, headers: { "HTTP_X_GITLAB_FEATURE_CATEGORY" => request_feature_category })
+ end
+
+ before do
+ allow(::Gitlab::RequestForgeryProtection).to receive(:verified?).with(request_env).and_return(verified)
+ end
+
+ it "returns category from request when valid, otherwise returns nil", :aggregate_failures do
+ expect(subject.from_request(fake_request("foo"))).to be("foo")
+ expect(subject.from_request(fake_request("zzz"))).to be_nil
+ end
+
+ context "when request is not verified" do
+ let(:verified) { false }
+
+ it "returns nil" do
+ expect(subject.from_request(fake_request("foo"))).to be_nil
+ end
+ end
+ end
+
+ describe "#categories" do
+ it "returns a set of the given categories" do
+ expect(subject.categories).to be_a(Set)
+ expect(subject.categories).to contain_exactly(*fake_categories)
+ end
+ end
+
+ describe ".load_from_yaml" do
+ subject { described_class.load_from_yaml }
+
+ it "creates FeatureCategories from feature_categories.yml file" do
+ contents = YAML.load_file(Rails.root.join('config', 'feature_categories.yml'))
+
+ expect(subject.categories).to contain_exactly(*contents)
+ end
+ end
+
+ describe ".default" do
+ it "returns a memoization of load_from_yaml", :aggregate_failures do
+ # FeatureCategories.default could have been referenced in another spec, so we need to clean it up here
+ described_class.instance_variable_set(:@default, nil)
+
+ expect(described_class).to receive(:load_from_yaml).once.and_call_original
+
+ 2.times { described_class.default }
+
+ # Uses reference equality to verify memoization
+ expect(described_class.default).to equal(described_class.default)
+ expect(described_class.default).to be_a(described_class)
+ end
+ end
+end
diff --git a/spec/lib/gitlab/form_builders/gitlab_ui_form_builder_spec.rb b/spec/lib/gitlab/form_builders/gitlab_ui_form_builder_spec.rb
index a46846e9820..e160e88487b 100644
--- a/spec/lib/gitlab/form_builders/gitlab_ui_form_builder_spec.rb
+++ b/spec/lib/gitlab/form_builders/gitlab_ui_form_builder_spec.rb
@@ -75,7 +75,68 @@ RSpec.describe Gitlab::FormBuilders::GitlabUiFormBuilder do
checkbox_html
- expect(fake_template).to have_received(:label).with(:user, :view_diffs_file_by_file, { class: %w(custom-control-label label-foo-bar), object: user })
+ expect(fake_template).to have_received(:label).with(:user, :view_diffs_file_by_file, { class: %w(custom-control-label label-foo-bar), object: user, value: nil })
+ end
+ end
+ end
+
+ describe '#gitlab_ui_radio_component' do
+ let(:optional_args) { {} }
+
+ subject(:radio_html) { form_builder.gitlab_ui_radio_component(:access_level, :admin, "Access Level", **optional_args) }
+
+ context 'without optional arguments' do
+ it 'renders correct html' do
+ expected_html = <<~EOS
+ <div class="gl-form-radio custom-control custom-radio">
+ <input class="custom-control-input" type="radio" value="admin" name="user[access_level]" id="user_access_level_admin" />
+ <label class="custom-control-label" for="user_access_level_admin">
+ Access Level
+ </label>
+ </div>
+ EOS
+
+ expect(radio_html).to eq(html_strip_whitespace(expected_html))
+ end
+ end
+
+ context 'with optional arguments' do
+ let(:optional_args) do
+ {
+ help_text: 'Administrators have access to all groups, projects, and users and can manage all features in this installation',
+ radio_options: { class: 'radio-foo-bar' },
+ label_options: { class: 'label-foo-bar' }
+ }
+ end
+
+ it 'renders help text' do
+ expected_html = <<~EOS
+ <div class="gl-form-radio custom-control custom-radio">
+ <input class="custom-control-input radio-foo-bar" type="radio" value="admin" name="user[access_level]" id="user_access_level_admin" />
+ <label class="custom-control-label label-foo-bar" for="user_access_level_admin">
+ <span>Access Level</span>
+ <p class="help-text">Administrators have access to all groups, projects, and users and can manage all features in this installation</p>
+ </label>
+ </div>
+ EOS
+
+ expect(radio_html).to eq(html_strip_whitespace(expected_html))
+ end
+
+ it 'passes arguments to `radio_button` method' do
+ allow(fake_template).to receive(:radio_button).and_return('')
+
+ radio_html
+
+ expect(fake_template).to have_received(:radio_button).with(:user, :access_level, :admin, { class: %w(custom-control-input radio-foo-bar), object: user })
+ end
+
+ it 'passes arguments to `label` method' do
+ allow(fake_template).to receive(:label).and_return('')
+
+ radio_html
+
+ expect(fake_template).to have_received(:label).with(:user, :access_level, { class: %w(custom-control-label label-foo-bar), object: user, value: :admin })
end
end
end
diff --git a/spec/lib/gitlab/git/repository_spec.rb b/spec/lib/gitlab/git/repository_spec.rb
index 9ecd281cce0..c7b68ff3e28 100644
--- a/spec/lib/gitlab/git/repository_spec.rb
+++ b/spec/lib/gitlab/git/repository_spec.rb
@@ -2238,7 +2238,6 @@ RSpec.describe Gitlab::Git::Repository, :seed_helper do
end
describe '#squash' do
- let(:squash_id) { '1' }
let(:branch_name) { 'fix' }
let(:start_sha) { '4b4918a572fa86f9771e5ba40fbd48e1eb03e2c6' }
let(:end_sha) { '12d65c8dd2b2676fa3ac47d955accc085a37a9c1' }
@@ -2252,7 +2251,7 @@ RSpec.describe Gitlab::Git::Repository, :seed_helper do
message: 'Squash commit message'
}
- repository.squash(user, squash_id, opts)
+ repository.squash(user, opts)
end
# Should be ported to gitaly-ruby rspec suite https://gitlab.com/gitlab-org/gitaly/issues/1234
diff --git a/spec/lib/gitlab/git/wraps_gitaly_errors_spec.rb b/spec/lib/gitlab/git/wraps_gitaly_errors_spec.rb
index 2c9da0f6606..e551dfaa1c5 100644
--- a/spec/lib/gitlab/git/wraps_gitaly_errors_spec.rb
+++ b/spec/lib/gitlab/git/wraps_gitaly_errors_spec.rb
@@ -12,6 +12,7 @@ RSpec.describe Gitlab::Git::WrapsGitalyErrors do
mapping = {
GRPC::NotFound => Gitlab::Git::Repository::NoRepository,
GRPC::InvalidArgument => ArgumentError,
+ GRPC::DeadlineExceeded => Gitlab::Git::CommandTimedOut,
GRPC::BadStatus => Gitlab::Git::CommandError
}
diff --git a/spec/lib/gitlab/gitaly_client/operation_service_spec.rb b/spec/lib/gitlab/gitaly_client/operation_service_spec.rb
index 3789bc76a94..27e7d446770 100644
--- a/spec/lib/gitlab/gitaly_client/operation_service_spec.rb
+++ b/spec/lib/gitlab/gitaly_client/operation_service_spec.rb
@@ -169,6 +169,56 @@ RSpec.describe Gitlab::GitalyClient::OperationService do
end
end
+ describe '#user_merge_branch' do
+ let(:target_branch) { 'master' }
+ let(:source_sha) { '5937ac0a7beb003549fc5fd26fc247adbce4a52e' }
+ let(:message) { 'Merge a branch' }
+
+ subject { client.user_merge_branch(user, source_sha, target_branch, message) {} }
+
+ it 'sends a user_merge_branch message' do
+ expect(subject).to be_a(Gitlab::Git::OperationService::BranchUpdate)
+ expect(subject.newrev).to be_present
+ expect(subject.repo_created).to be(false)
+ expect(subject.branch_created).to be(false)
+ end
+
+ context 'with an exception with the UserMergeBranchError' do
+ let(:permission_error) do
+ GRPC::PermissionDenied.new(
+ "GitLab: You are not allowed to push code to this project.",
+ { "grpc-status-details-bin" =>
+ "\b\a\x129GitLab: You are not allowed to push code to this project.\x1A\xDE\x01\n/type.googleapis.com/gitaly.UserMergeBranchError\x12\xAA\x01\n\xA7\x01\n1You are not allowed to push code to this project.\x12\x03web\x1A\auser-15\"df15b32277d2c55c6c595845a87109b09c913c556 5d6e0f935ad9240655f64e883cd98fad6f9a17ee refs/heads/master\n" }
+ )
+ end
+
+ it 'raises PreRecieveError with the error message' do
+ expect_any_instance_of(Gitaly::OperationService::Stub)
+ .to receive(:user_merge_branch).with(kind_of(Enumerator), kind_of(Hash))
+ .and_raise(permission_error)
+
+ expect { subject }.to raise_error do |error|
+ expect(error).to be_a(Gitlab::Git::PreReceiveError)
+ expect(error.message).to eq("You are not allowed to push code to this project.")
+ end
+ end
+ end
+
+ context 'with an exception without the detailed error' do
+ let(:permission_error) do
+ GRPC::PermissionDenied.new
+ end
+
+ it 'raises PermissionDenied' do
+ expect_any_instance_of(Gitaly::OperationService::Stub)
+ .to receive(:user_merge_branch).with(kind_of(Enumerator), kind_of(Hash))
+ .and_raise(permission_error)
+
+ expect { subject }.to raise_error(GRPC::PermissionDenied)
+ end
+ end
+ end
+
describe '#user_ff_branch' do
let(:target_branch) { 'my-branch' }
let(:source_sha) { 'cfe32cf61b73a0d5e9f13e774abde7ff789b1660' }
@@ -308,7 +358,6 @@ RSpec.describe Gitlab::GitalyClient::OperationService do
end
describe '#user_squash' do
- let(:squash_id) { '1' }
let(:start_sha) { 'b83d6e391c22777fca1ed3012fce84f633d7fed0' }
let(:end_sha) { '54cec5282aa9f21856362fe321c800c236a61615' }
let(:commit_message) { 'Squash message' }
@@ -321,7 +370,6 @@ RSpec.describe Gitlab::GitalyClient::OperationService do
Gitaly::UserSquashRequest.new(
repository: repository.gitaly_repository,
user: gitaly_user,
- squash_id: squash_id.to_s,
start_sha: start_sha,
end_sha: end_sha,
author: gitaly_user,
@@ -334,7 +382,7 @@ RSpec.describe Gitlab::GitalyClient::OperationService do
let(:response) { Gitaly::UserSquashResponse.new(squash_sha: squash_sha) }
subject do
- client.user_squash(user, squash_id, start_sha, end_sha, user, commit_message, time)
+ client.user_squash(user, start_sha, end_sha, user, commit_message, time)
end
it 'sends a user_squash message and returns the squash sha' do
diff --git a/spec/lib/gitlab/github_import/importer/diff_notes_importer_spec.rb b/spec/lib/gitlab/github_import/importer/diff_notes_importer_spec.rb
index 46b9959ff64..be4fc3cbf16 100644
--- a/spec/lib/gitlab/github_import/importer/diff_notes_importer_spec.rb
+++ b/spec/lib/gitlab/github_import/importer/diff_notes_importer_spec.rb
@@ -15,10 +15,18 @@ RSpec.describe Gitlab::GithubImport::Importer::DiffNotesImporter do
original_commit_id: 'original123abc',
diff_hunk: "@@ -1 +1 @@\n-Hello\n+Hello world",
user: double(:user, id: 4, login: 'alice'),
- body: 'Hello world',
created_at: Time.zone.now,
updated_at: Time.zone.now,
- id: 1
+ line: 23,
+ start_line: nil,
+ id: 1,
+ body: <<~BODY
+ Hello World
+
+ ```suggestion
+ sug1
+ ```
+ BODY
)
end
diff --git a/spec/lib/gitlab/github_import/parallel_importer_spec.rb b/spec/lib/gitlab/github_import/parallel_importer_spec.rb
index 06304bf84ca..c7b300ff043 100644
--- a/spec/lib/gitlab/github_import/parallel_importer_spec.rb
+++ b/spec/lib/gitlab/github_import/parallel_importer_spec.rb
@@ -9,6 +9,18 @@ RSpec.describe Gitlab::GithubImport::ParallelImporter do
end
end
+ describe '.track_start_import' do
+ it 'tracks the start of import' do
+ project = double(:project)
+ metrics = double(:metrics)
+
+ expect(Gitlab::Import::Metrics).to receive(:new).with(:github_importer, project).and_return(metrics)
+ expect(metrics).to receive(:track_start_import)
+
+ described_class.track_start_import(project)
+ end
+ end
+
describe '#execute', :clean_gitlab_redis_shared_state do
let(:project) { create(:project) }
let(:importer) { described_class.new(project) }
diff --git a/spec/lib/gitlab/github_import/parallel_scheduling_spec.rb b/spec/lib/gitlab/github_import/parallel_scheduling_spec.rb
index 1fc7d3c887f..f375e84e0fd 100644
--- a/spec/lib/gitlab/github_import/parallel_scheduling_spec.rb
+++ b/spec/lib/gitlab/github_import/parallel_scheduling_spec.rb
@@ -130,7 +130,8 @@ RSpec.describe Gitlab::GithubImport::ParallelScheduling do
project_id: project.id,
exception: exception,
error_source: 'MyImporter',
- fail_import: false
+ fail_import: false,
+ metrics: true
).and_call_original
expect { importer.execute }
@@ -195,7 +196,8 @@ RSpec.describe Gitlab::GithubImport::ParallelScheduling do
project_id: project.id,
exception: exception,
error_source: 'MyImporter',
- fail_import: true
+ fail_import: true,
+ metrics: true
).and_call_original
expect { importer.execute }
diff --git a/spec/lib/gitlab/github_import/representation/diff_note_spec.rb b/spec/lib/gitlab/github_import/representation/diff_note_spec.rb
index 7c24cd0a5db..81722c0eba7 100644
--- a/spec/lib/gitlab/github_import/representation/diff_note_spec.rb
+++ b/spec/lib/gitlab/github_import/representation/diff_note_spec.rb
@@ -51,7 +51,7 @@ RSpec.describe Gitlab::GithubImport::Representation::DiffNote do
end
it 'includes the GitHub ID' do
- expect(note.github_id).to eq(1)
+ expect(note.note_id).to eq(1)
end
it 'returns the noteable type' do
@@ -73,6 +73,8 @@ RSpec.describe Gitlab::GithubImport::Representation::DiffNote do
body: 'Hello world',
created_at: created_at,
updated_at: updated_at,
+ line: 23,
+ start_line: nil,
id: 1
)
end
@@ -90,47 +92,70 @@ RSpec.describe Gitlab::GithubImport::Representation::DiffNote do
expect(note.author).to be_nil
end
- end
- describe '.from_json_hash' do
- it_behaves_like 'a DiffNote' do
- let(:hash) do
- {
- 'noteable_type' => 'MergeRequest',
- 'noteable_id' => 42,
- 'file_path' => 'README.md',
- 'commit_id' => '123abc',
- 'original_commit_id' => 'original123abc',
- 'diff_hunk' => hunk,
- 'author' => { 'id' => 4, 'login' => 'alice' },
- 'note' => 'Hello world',
- 'created_at' => created_at.to_s,
- 'updated_at' => updated_at.to_s,
- 'github_id' => 1
- }
- end
+ it 'formats a suggestion in the note body' do
+ allow(response)
+ .to receive(:body)
+ .and_return <<~BODY
+ ```suggestion
+ Hello World
+ ```
+ BODY
- let(:note) { described_class.from_json_hash(hash) }
+ note = described_class.from_api_response(response)
+
+ expect(note.note).to eq <<~BODY
+ ```suggestion:-0+0
+ Hello World
+ ```
+ BODY
end
+ end
- it 'does not convert the author if it was not specified' do
- hash = {
+ describe '.from_json_hash' do
+ let(:hash) do
+ {
'noteable_type' => 'MergeRequest',
'noteable_id' => 42,
'file_path' => 'README.md',
'commit_id' => '123abc',
'original_commit_id' => 'original123abc',
'diff_hunk' => hunk,
+ 'author' => { 'id' => 4, 'login' => 'alice' },
'note' => 'Hello world',
'created_at' => created_at.to_s,
'updated_at' => updated_at.to_s,
- 'github_id' => 1
+ 'note_id' => 1
}
+ end
+
+ it_behaves_like 'a DiffNote' do
+ let(:note) { described_class.from_json_hash(hash) }
+ end
+
+ it 'does not convert the author if it was not specified' do
+ hash.delete('author')
note = described_class.from_json_hash(hash)
expect(note.author).to be_nil
end
+
+ it 'formats a suggestion in the note body' do
+ hash['note'] = <<~BODY
+ ```suggestion
+ Hello World
+ ```
+ BODY
+
+ note = described_class.from_json_hash(hash)
+
+ expect(note.note).to eq <<~BODY
+ ```suggestion:-0+0
+ Hello World
+ ```
+ BODY
+ end
end
describe '#line_code' do
@@ -154,7 +179,7 @@ RSpec.describe Gitlab::GithubImport::Representation::DiffNote do
'note' => 'Hello world',
'created_at' => created_at.to_s,
'updated_at' => updated_at.to_s,
- 'github_id' => 1
+ 'note_id' => 1
)
expect(note.diff_hash).to eq(
@@ -167,4 +192,68 @@ RSpec.describe Gitlab::GithubImport::Representation::DiffNote do
)
end
end
+
+ describe '#github_identifiers' do
+ it 'returns a hash with needed identifiers' do
+ github_identifiers = {
+ noteable_id: 42,
+ noteable_type: 'MergeRequest',
+ note_id: 1
+ }
+ other_attributes = { something_else: '_something_else_' }
+ note = described_class.new(github_identifiers.merge(other_attributes))
+
+ expect(note.github_identifiers).to eq(github_identifiers)
+ end
+ end
+
+ describe '#note' do
+ it 'returns the given note' do
+ hash = {
+ 'note': 'simple text'
+ }
+
+ note = described_class.new(hash)
+
+ expect(note.note).to eq 'simple text'
+ end
+
+ it 'returns the suggestion formatted in the note' do
+ hash = {
+ 'note': <<~BODY
+ ```suggestion
+ Hello World
+ ```
+ BODY
+ }
+
+ note = described_class.new(hash)
+
+ expect(note.note).to eq <<~BODY
+ ```suggestion:-0+0
+ Hello World
+ ```
+ BODY
+ end
+
+ it 'returns the multi-line suggestion formatted in the note' do
+ hash = {
+ 'start_line': 20,
+ 'end_line': 23,
+ 'note': <<~BODY
+ ```suggestion
+ Hello World
+ ```
+ BODY
+ }
+
+ note = described_class.new(hash)
+
+ expect(note.note).to eq <<~BODY
+ ```suggestion:-3+0
+ Hello World
+ ```
+ BODY
+ end
+ end
end
diff --git a/spec/lib/gitlab/github_import/representation/diff_notes/suggestion_formatter_spec.rb b/spec/lib/gitlab/github_import/representation/diff_notes/suggestion_formatter_spec.rb
new file mode 100644
index 00000000000..2ffd5f50d3b
--- /dev/null
+++ b/spec/lib/gitlab/github_import/representation/diff_notes/suggestion_formatter_spec.rb
@@ -0,0 +1,164 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::GithubImport::Representation::DiffNotes::SuggestionFormatter do
+ it 'does nothing when there is any text before the suggestion tag' do
+ note = <<~BODY
+ looks like```suggestion but it isn't
+ ```
+ BODY
+
+ expect(described_class.formatted_note_for(note: note)).to eq(note)
+ end
+
+ it 'handles nil value for note' do
+ note = nil
+
+ expect(described_class.formatted_note_for(note: note)).to eq(note)
+ end
+
+ it 'does not allow over 3 leading spaces for valid suggestion' do
+ note = <<~BODY
+ Single-line suggestion
+ ```suggestion
+ sug1
+ ```
+ BODY
+
+ expect(described_class.formatted_note_for(note: note)).to eq(note)
+ end
+
+ it 'allows up to 3 leading spaces' do
+ note = <<~BODY
+ Single-line suggestion
+ ```suggestion
+ sug1
+ ```
+ BODY
+
+ expected = <<~BODY
+ Single-line suggestion
+ ```suggestion:-0+0
+ sug1
+ ```
+ BODY
+
+ expect(described_class.formatted_note_for(note: note)).to eq(expected)
+ end
+
+ it 'does nothing when there is any text without space after the suggestion tag' do
+ note = <<~BODY
+ ```suggestionbut it isn't
+ ```
+ BODY
+
+ expect(described_class.formatted_note_for(note: note)).to eq(note)
+ end
+
+ it 'formats single-line suggestions' do
+ note = <<~BODY
+ Single-line suggestion
+ ```suggestion
+ sug1
+ ```
+ BODY
+
+ expected = <<~BODY
+ Single-line suggestion
+ ```suggestion:-0+0
+ sug1
+ ```
+ BODY
+
+ expect(described_class.formatted_note_for(note: note)).to eq(expected)
+ end
+
+ it 'ignores text after suggestion tag on the same line' do
+ note = <<~BODY
+ looks like
+ ```suggestion text to be ignored
+ suggestion
+ ```
+ BODY
+
+ expected = <<~BODY
+ looks like
+ ```suggestion:-0+0
+ suggestion
+ ```
+ BODY
+
+ expect(described_class.formatted_note_for(note: note)).to eq(expected)
+ end
+
+ it 'formats multiple single-line suggestions' do
+ note = <<~BODY
+ Single-line suggestion
+ ```suggestion
+ sug1
+ ```
+ OR
+ ```suggestion
+ sug2
+ ```
+ BODY
+
+ expected = <<~BODY
+ Single-line suggestion
+ ```suggestion:-0+0
+ sug1
+ ```
+ OR
+ ```suggestion:-0+0
+ sug2
+ ```
+ BODY
+
+ expect(described_class.formatted_note_for(note: note)).to eq(expected)
+ end
+
+ it 'formats multi-line suggestions' do
+ note = <<~BODY
+ Multi-line suggestion
+ ```suggestion
+ sug1
+ ```
+ BODY
+
+ expected = <<~BODY
+ Multi-line suggestion
+ ```suggestion:-2+0
+ sug1
+ ```
+ BODY
+
+ expect(described_class.formatted_note_for(note: note, start_line: 6, end_line: 8)).to eq(expected)
+ end
+
+ it 'formats multiple multi-line suggestions' do
+ note = <<~BODY
+ Multi-line suggestion
+ ```suggestion
+ sug1
+ ```
+ OR
+ ```suggestion
+ sug2
+ ```
+ BODY
+
+ expected = <<~BODY
+ Multi-line suggestion
+ ```suggestion:-2+0
+ sug1
+ ```
+ OR
+ ```suggestion:-2+0
+ sug2
+ ```
+ BODY
+
+ expect(described_class.formatted_note_for(note: note, start_line: 6, end_line: 8)).to eq(expected)
+ end
+end
diff --git a/spec/lib/gitlab/github_import/representation/issue_spec.rb b/spec/lib/gitlab/github_import/representation/issue_spec.rb
index 3d306a4a3a3..f3052efea70 100644
--- a/spec/lib/gitlab/github_import/representation/issue_spec.rb
+++ b/spec/lib/gitlab/github_import/representation/issue_spec.rb
@@ -181,4 +181,17 @@ RSpec.describe Gitlab::GithubImport::Representation::Issue do
expect(object.truncated_title).to eq('foo')
end
end
+
+ describe '#github_identifiers' do
+ it 'returns a hash with needed identifiers' do
+ github_identifiers = {
+ iid: 42,
+ issuable_type: 'MergeRequest'
+ }
+ other_attributes = { pull_request: true, something_else: '_something_else_' }
+ issue = described_class.new(github_identifiers.merge(other_attributes))
+
+ expect(issue.github_identifiers).to eq(github_identifiers)
+ end
+ end
end
diff --git a/spec/lib/gitlab/github_import/representation/lfs_object_spec.rb b/spec/lib/gitlab/github_import/representation/lfs_object_spec.rb
new file mode 100644
index 00000000000..b59ea513436
--- /dev/null
+++ b/spec/lib/gitlab/github_import/representation/lfs_object_spec.rb
@@ -0,0 +1,17 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::GithubImport::Representation::LfsObject do
+ describe '#github_identifiers' do
+ it 'returns a hash with needed identifiers' do
+ github_identifiers = {
+ oid: 42
+ }
+ other_attributes = { something_else: '_something_else_' }
+ lfs_object = described_class.new(github_identifiers.merge(other_attributes))
+
+ expect(lfs_object.github_identifiers).to eq(github_identifiers)
+ end
+ end
+end
diff --git a/spec/lib/gitlab/github_import/representation/note_spec.rb b/spec/lib/gitlab/github_import/representation/note_spec.rb
index 112bb7eb908..97addcc1c98 100644
--- a/spec/lib/gitlab/github_import/representation/note_spec.rb
+++ b/spec/lib/gitlab/github_import/representation/note_spec.rb
@@ -40,8 +40,8 @@ RSpec.describe Gitlab::GithubImport::Representation::Note do
expect(note.updated_at).to eq(updated_at)
end
- it 'includes the GitHub ID' do
- expect(note.github_id).to eq(1)
+ it 'includes the note ID' do
+ expect(note.note_id).to eq(1)
end
end
end
@@ -84,7 +84,7 @@ RSpec.describe Gitlab::GithubImport::Representation::Note do
'note' => 'Hello world',
'created_at' => created_at.to_s,
'updated_at' => updated_at.to_s,
- 'github_id' => 1
+ 'note_id' => 1
}
end
@@ -98,7 +98,7 @@ RSpec.describe Gitlab::GithubImport::Representation::Note do
'note' => 'Hello world',
'created_at' => created_at.to_s,
'updated_at' => updated_at.to_s,
- 'github_id' => 1
+ 'note_id' => 1
}
note = described_class.from_json_hash(hash)
@@ -106,4 +106,18 @@ RSpec.describe Gitlab::GithubImport::Representation::Note do
expect(note.author).to be_nil
end
end
+
+ describe '#github_identifiers' do
+ it 'returns a hash with needed identifiers' do
+ github_identifiers = {
+ noteable_id: 42,
+ noteable_type: 'Issue',
+ note_id: 1
+ }
+ other_attributes = { something_else: '_something_else_' }
+ note = described_class.new(github_identifiers.merge(other_attributes))
+
+ expect(note.github_identifiers).to eq(github_identifiers)
+ end
+ end
end
diff --git a/spec/lib/gitlab/github_import/representation/pull_request_review_spec.rb b/spec/lib/gitlab/github_import/representation/pull_request_review_spec.rb
index cad9b13774e..f812fd85fbc 100644
--- a/spec/lib/gitlab/github_import/representation/pull_request_review_spec.rb
+++ b/spec/lib/gitlab/github_import/representation/pull_request_review_spec.rb
@@ -14,7 +14,7 @@ RSpec.describe Gitlab::GithubImport::Representation::PullRequestReview do
expect(review.note).to eq('note')
expect(review.review_type).to eq('APPROVED')
expect(review.submitted_at).to eq(submitted_at)
- expect(review.github_id).to eq(999)
+ expect(review.review_id).to eq(999)
expect(review.merge_request_id).to eq(42)
end
end
@@ -50,7 +50,7 @@ RSpec.describe Gitlab::GithubImport::Representation::PullRequestReview do
describe '.from_json_hash' do
let(:hash) do
{
- 'github_id' => 999,
+ 'review_id' => 999,
'merge_request_id' => 42,
'note' => 'note',
'review_type' => 'APPROVED',
@@ -75,4 +75,17 @@ RSpec.describe Gitlab::GithubImport::Representation::PullRequestReview do
expect(review.submitted_at).to be_nil
end
end
+
+ describe '#github_identifiers' do
+ it 'returns a hash with needed identifiers' do
+ github_identifiers = {
+ review_id: 999,
+ merge_request_id: 42
+ }
+ other_attributes = { something_else: '_something_else_' }
+ review = described_class.new(github_identifiers.merge(other_attributes))
+
+ expect(review.github_identifiers).to eq(github_identifiers)
+ end
+ end
end
diff --git a/spec/lib/gitlab/github_import/representation/pull_request_spec.rb b/spec/lib/gitlab/github_import/representation/pull_request_spec.rb
index 27a82951b01..925dba5b5a7 100644
--- a/spec/lib/gitlab/github_import/representation/pull_request_spec.rb
+++ b/spec/lib/gitlab/github_import/representation/pull_request_spec.rb
@@ -288,4 +288,16 @@ RSpec.describe Gitlab::GithubImport::Representation::PullRequest do
expect(object.truncated_title).to eq('foo')
end
end
+
+ describe '#github_identifiers' do
+ it 'returns a hash with needed identifiers' do
+ github_identifiers = {
+ iid: 1
+ }
+ other_attributes = { something_else: '_something_else_' }
+ pr = described_class.new(github_identifiers.merge(other_attributes))
+
+ expect(pr.github_identifiers).to eq(github_identifiers.merge(issuable_type: 'MergeRequest'))
+ end
+ end
end
diff --git a/spec/lib/gitlab/github_import/sequential_importer_spec.rb b/spec/lib/gitlab/github_import/sequential_importer_spec.rb
index 3c3f8ff59d0..2b76f0e27c9 100644
--- a/spec/lib/gitlab/github_import/sequential_importer_spec.rb
+++ b/spec/lib/gitlab/github_import/sequential_importer_spec.rb
@@ -4,10 +4,17 @@ require 'spec_helper'
RSpec.describe Gitlab::GithubImport::SequentialImporter do
describe '#execute' do
+ let_it_be(:project) do
+ create(:project, import_url: 'http://t0ken@github.another-domain.com/repo-org/repo.git', import_type: 'github')
+ end
+
+ subject(:importer) { described_class.new(project, token: 'foo') }
+
it 'imports a project in sequence' do
- repository = double(:repository)
- project = double(:project, id: 1, repository: repository, import_url: 'http://t0ken@github.another-domain.com/repo-org/repo.git', group: nil)
- importer = described_class.new(project, token: 'foo')
+ expect_next_instance_of(Gitlab::Import::Metrics) do |instance|
+ expect(instance).to receive(:track_start_import)
+ expect(instance).to receive(:track_finished_import)
+ end
expect_next_instance_of(Gitlab::GithubImport::Importer::RepositoryImporter) do |instance|
expect(instance).to receive(:execute)
@@ -35,5 +42,23 @@ RSpec.describe Gitlab::GithubImport::SequentialImporter do
expect(importer.execute).to eq(true)
end
+
+ it 'raises an error' do
+ exception = StandardError.new('_some_error_')
+
+ expect_next_instance_of(Gitlab::GithubImport::Importer::RepositoryImporter) do |importer|
+ expect(importer).to receive(:execute).and_raise(exception)
+ end
+ expect(Gitlab::Import::ImportFailureService).to receive(:track)
+ .with(
+ project_id: project.id,
+ exception: exception,
+ error_source: described_class.name,
+ fail_import: true,
+ metrics: true
+ ).and_call_original
+
+ expect { importer.execute }.to raise_error(StandardError)
+ end
end
end
diff --git a/spec/lib/gitlab/health_checks/probes/collection_spec.rb b/spec/lib/gitlab/health_checks/probes/collection_spec.rb
index 69828c143db..741c45d953c 100644
--- a/spec/lib/gitlab/health_checks/probes/collection_spec.rb
+++ b/spec/lib/gitlab/health_checks/probes/collection_spec.rb
@@ -16,6 +16,9 @@ RSpec.describe Gitlab::HealthChecks::Probes::Collection do
Gitlab::HealthChecks::Redis::CacheCheck,
Gitlab::HealthChecks::Redis::QueuesCheck,
Gitlab::HealthChecks::Redis::SharedStateCheck,
+ Gitlab::HealthChecks::Redis::TraceChunksCheck,
+ Gitlab::HealthChecks::Redis::RateLimitingCheck,
+ Gitlab::HealthChecks::Redis::SessionsCheck,
Gitlab::HealthChecks::GitalyCheck
]
end
diff --git a/spec/lib/gitlab/health_checks/redis/rate_limiting_check_spec.rb b/spec/lib/gitlab/health_checks/redis/rate_limiting_check_spec.rb
new file mode 100644
index 00000000000..1521fc99cde
--- /dev/null
+++ b/spec/lib/gitlab/health_checks/redis/rate_limiting_check_spec.rb
@@ -0,0 +1,8 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+require_relative '../simple_check_shared'
+
+RSpec.describe Gitlab::HealthChecks::Redis::RateLimitingCheck do
+ include_examples 'simple_check', 'redis_rate_limiting_ping', 'RedisRateLimiting', 'PONG'
+end
diff --git a/spec/lib/gitlab/health_checks/redis/sessions_check_spec.rb b/spec/lib/gitlab/health_checks/redis/sessions_check_spec.rb
new file mode 100644
index 00000000000..82b3b33ec0a
--- /dev/null
+++ b/spec/lib/gitlab/health_checks/redis/sessions_check_spec.rb
@@ -0,0 +1,8 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+require_relative '../simple_check_shared'
+
+RSpec.describe Gitlab::HealthChecks::Redis::SessionsCheck do
+ include_examples 'simple_check', 'redis_sessions_ping', 'RedisSessions', 'PONG'
+end
diff --git a/spec/lib/gitlab/import/import_failure_service_spec.rb b/spec/lib/gitlab/import/import_failure_service_spec.rb
index 50b32d634ad..c16d4a7c804 100644
--- a/spec/lib/gitlab/import/import_failure_service_spec.rb
+++ b/spec/lib/gitlab/import/import_failure_service_spec.rb
@@ -2,135 +2,171 @@
require 'spec_helper'
-RSpec.describe Gitlab::Import::ImportFailureService do
+RSpec.describe Gitlab::Import::ImportFailureService, :aggregate_failures do
let_it_be(:import_type) { 'import_type' }
+ let_it_be(:project) { create(:project, :import_started, import_type: import_type) }
- let_it_be(:project) do
- create(
- :project,
- :import_started,
- import_type: import_type
- )
- end
-
- let(:import_state) { project.import_state }
let(:exception) { StandardError.new('some error') }
+ let(:arguments) { { project_id: project.id } }
+ let(:base_arguments) { { error_source: 'SomeImporter', exception: exception }.merge(arguments) }
+ let(:exe_arguments) { { fail_import: false, metrics: false } }
+
+ describe '.track' do
+ context 'with all arguments provided' do
+ let(:instance) { double(:failure_service) }
+ let(:instance_arguments) do
+ {
+ exception: exception,
+ import_state: '_import_state_',
+ project_id: '_project_id_',
+ error_source: '_error_source_'
+ }
+ end
- shared_examples 'logs the exception and fails the import' do
- it 'when the failure does not abort the import' do
- expect(Gitlab::ErrorTracking)
- .to receive(:track_exception)
- .with(
- exception,
- project_id: project.id,
- import_type: import_type,
- source: 'SomeImporter'
- )
-
- expect(Gitlab::Import::Logger)
- .to receive(:error)
- .with(
- message: 'importer failed',
- 'error.message': 'some error',
- project_id: project.id,
- import_type: import_type,
- source: 'SomeImporter'
- )
-
- described_class.track(**arguments)
-
- expect(project.import_state.reload.status).to eq('failed')
-
- expect(project.import_failures).not_to be_empty
- expect(project.import_failures.last.exception_class).to eq('StandardError')
- expect(project.import_failures.last.exception_message).to eq('some error')
- end
- end
+ let(:exe_arguments) do
+ {
+ fail_import: '_fail_import_',
+ metrics: '_metrics_'
+ }
+ end
- shared_examples 'logs the exception and does not fail the import' do
- it 'when the failure does not abort the import' do
- expect(Gitlab::ErrorTracking)
- .to receive(:track_exception)
- .with(
- exception,
- project_id: project.id,
- import_type: import_type,
- source: 'SomeImporter'
- )
-
- expect(Gitlab::Import::Logger)
- .to receive(:error)
- .with(
- message: 'importer failed',
- 'error.message': 'some error',
- project_id: project.id,
- import_type: import_type,
- source: 'SomeImporter'
- )
-
- described_class.track(**arguments)
-
- expect(project.import_state.reload.status).to eq('started')
-
- expect(project.import_failures).not_to be_empty
- expect(project.import_failures.last.exception_class).to eq('StandardError')
- expect(project.import_failures.last.exception_message).to eq('some error')
+ it 'invokes a new instance and executes' do
+ expect(described_class).to receive(:new).with(**instance_arguments).and_return(instance)
+ expect(instance).to receive(:execute).with(**exe_arguments)
+
+ described_class.track(**instance_arguments.merge(exe_arguments))
+ end
end
- end
- context 'when using the project as reference' do
- context 'when it fails the import' do
- let(:arguments) do
+ context 'with only necessary arguments utilizing defaults' do
+ let(:instance) { double(:failure_service) }
+ let(:instance_arguments) do
{
- project_id: project.id,
exception: exception,
- error_source: 'SomeImporter',
- fail_import: true
+ import_state: nil,
+ project_id: nil,
+ error_source: nil
}
end
- it_behaves_like 'logs the exception and fails the import'
- end
-
- context 'when it does not fail the import' do
- let(:arguments) do
+ let(:exe_arguments) do
{
- project_id: project.id,
- exception: exception,
- error_source: 'SomeImporter',
- fail_import: false
+ fail_import: false,
+ metrics: false
}
end
- it_behaves_like 'logs the exception and does not fail the import'
+ it 'invokes a new instance and executes' do
+ expect(described_class).to receive(:new).with(**instance_arguments).and_return(instance)
+ expect(instance).to receive(:execute).with(**exe_arguments)
+
+ described_class.track(exception: exception)
+ end
end
end
- context 'when using the import_state as reference' do
- context 'when it fails the import' do
- let(:arguments) do
- {
- import_state: import_state,
- exception: exception,
- error_source: 'SomeImporter',
- fail_import: true
- }
+ describe '#execute' do
+ subject(:service) { described_class.new(**base_arguments) }
+
+ shared_examples 'logs the exception and fails the import' do
+ it 'when the failure does not abort the import' do
+ expect(Gitlab::ErrorTracking)
+ .to receive(:track_exception)
+ .with(
+ exception,
+ project_id: project.id,
+ import_type: import_type,
+ source: 'SomeImporter'
+ )
+
+ expect(Gitlab::Import::Logger)
+ .to receive(:error)
+ .with(
+ message: 'importer failed',
+ 'error.message': 'some error',
+ project_id: project.id,
+ import_type: import_type,
+ source: 'SomeImporter'
+ )
+
+ service.execute(**exe_arguments)
+
+ expect(project.import_state.reload.status).to eq('failed')
+
+ expect(project.import_failures).not_to be_empty
+ expect(project.import_failures.last.exception_class).to eq('StandardError')
+ expect(project.import_failures.last.exception_message).to eq('some error')
end
+ end
- it_behaves_like 'logs the exception and fails the import'
+ shared_examples 'logs the exception and does not fail the import' do
+ it 'when the failure does not abort the import' do
+ expect(Gitlab::ErrorTracking)
+ .to receive(:track_exception)
+ .with(
+ exception,
+ project_id: project.id,
+ import_type: import_type,
+ source: 'SomeImporter'
+ )
+
+ expect(Gitlab::Import::Logger)
+ .to receive(:error)
+ .with(
+ message: 'importer failed',
+ 'error.message': 'some error',
+ project_id: project.id,
+ import_type: import_type,
+ source: 'SomeImporter'
+ )
+
+ service.execute(**exe_arguments)
+
+ expect(project.import_state.reload.status).to eq('started')
+
+ expect(project.import_failures).not_to be_empty
+ expect(project.import_failures.last.exception_class).to eq('StandardError')
+ expect(project.import_failures.last.exception_message).to eq('some error')
+ end
end
- context 'when it does not fail the import' do
- let(:arguments) do
- {
- import_state: import_state,
- exception: exception,
- error_source: 'SomeImporter',
- fail_import: false
- }
+ context 'when tracking metrics' do
+ let(:exe_arguments) { { fail_import: false, metrics: true } }
+
+ it 'tracks the failed import' do
+ metrics = double(:metrics)
+
+ expect(Gitlab::Import::Metrics).to receive(:new).with("#{project.import_type}_importer", project).and_return(metrics)
+ expect(metrics).to receive(:track_failed_import)
+
+ service.execute(**exe_arguments)
end
+ end
+
+ context 'when using the project as reference' do
+ context 'when it fails the import' do
+ let(:exe_arguments) { { fail_import: true, metrics: false } }
- it_behaves_like 'logs the exception and does not fail the import'
+ it_behaves_like 'logs the exception and fails the import'
+ end
+
+ context 'when it does not fail the import' do
+ it_behaves_like 'logs the exception and does not fail the import'
+ end
+ end
+
+ context 'when using the import_state as reference' do
+ let(:arguments) { { import_state: project.import_state } }
+
+ context 'when it fails the import' do
+ let(:exe_arguments) { { fail_import: true, metrics: false } }
+
+ it_behaves_like 'logs the exception and fails the import'
+ end
+
+ context 'when it does not fail the import' do
+ it_behaves_like 'logs the exception and does not fail the import'
+ end
end
end
end
diff --git a/spec/lib/gitlab/import/metrics_spec.rb b/spec/lib/gitlab/import/metrics_spec.rb
index 0a912427014..035294a620f 100644
--- a/spec/lib/gitlab/import/metrics_spec.rb
+++ b/spec/lib/gitlab/import/metrics_spec.rb
@@ -2,20 +2,67 @@
require 'spec_helper'
-RSpec.describe Gitlab::Import::Metrics do
+RSpec.describe Gitlab::Import::Metrics, :aggregate_failures do
let(:importer) { :test_importer }
- let(:project) { create(:project) }
+ let(:project) { build(:project, id: non_existing_record_id, created_at: Time.current) }
let(:histogram) { double(:histogram) }
let(:counter) { double(:counter) }
subject { described_class.new(importer, project) }
- describe '#report_import_time' do
+ before do
+ allow(Gitlab::Metrics).to receive(:counter) { counter }
+ allow(counter).to receive(:increment)
+ allow(histogram).to receive(:observe)
+ end
+
+ describe '#track_start_import' do
+ context 'when project is not a github import' do
+ it 'does not emit importer metrics' do
+ expect(subject).not_to receive(:track_usage_event)
+
+ subject.track_start_import
+ end
+ end
+
+ context 'when project is a github import' do
+ before do
+ project.import_type = 'github'
+ end
+
+ it 'emits importer metrics' do
+ expect(subject).to receive(:track_usage_event).with(:github_import_project_start, project.id)
+
+ subject.track_start_import
+ end
+ end
+ end
+
+ describe '#track_failed_import' do
+ context 'when project is not a github import' do
+ it 'does not emit importer metrics' do
+ expect(subject).not_to receive(:track_usage_event)
+
+ subject.track_failed_import
+ end
+ end
+
+ context 'when project is a github import' do
+ before do
+ project.import_type = 'github'
+ end
+
+ it 'emits importer metrics' do
+ expect(subject).to receive(:track_usage_event).with(:github_import_project_failure, project.id)
+
+ subject.track_failed_import
+ end
+ end
+ end
+
+ describe '#track_finished_import' do
before do
- allow(Gitlab::Metrics).to receive(:counter) { counter }
allow(Gitlab::Metrics).to receive(:histogram) { histogram }
- allow(counter).to receive(:increment)
- allow(counter).to receive(:observe)
end
it 'emits importer metrics' do
@@ -32,9 +79,56 @@ RSpec.describe Gitlab::Import::Metrics do
)
expect(counter).to receive(:increment)
- expect(histogram).to receive(:observe).with({ importer: :test_importer }, anything)
subject.track_finished_import
+
+ expect(subject.duration).not_to be_nil
+ end
+
+ context 'when project is not a github import' do
+ it 'does not emit importer metrics' do
+ expect(subject).not_to receive(:track_usage_event)
+
+ subject.track_finished_import
+
+ expect(histogram).to have_received(:observe).with({ importer: :test_importer }, anything)
+ end
+ end
+
+ context 'when project is a github import' do
+ before do
+ project.import_type = 'github'
+ end
+
+ it 'emits importer metrics' do
+ expect(subject).to receive(:track_usage_event).with(:github_import_project_success, project.id)
+
+ subject.track_finished_import
+
+ expect(histogram).to have_received(:observe).with({ project: project.full_path }, anything)
+ end
+ end
+ end
+
+ describe '#issues_counter' do
+ it 'creates a counter for issues' do
+ expect(Gitlab::Metrics).to receive(:counter).with(
+ :test_importer_imported_issues_total,
+ 'The number of imported issues'
+ )
+
+ subject.issues_counter
+ end
+ end
+
+ describe '#merge_requests_counter' do
+ it 'creates a counter for issues' do
+ expect(Gitlab::Metrics).to receive(:counter).with(
+ :test_importer_imported_merge_requests_total,
+ 'The number of imported merge (pull) requests'
+ )
+
+ subject.merge_requests_counter
end
end
end
diff --git a/spec/lib/gitlab/import_export/all_models.yml b/spec/lib/gitlab/import_export/all_models.yml
index 614aa55c3c5..10f0e687077 100644
--- a/spec/lib/gitlab/import_export/all_models.yml
+++ b/spec/lib/gitlab/import_export/all_models.yml
@@ -59,6 +59,7 @@ issues:
- requirement
- incident_management_issuable_escalation_status
- pending_escalations
+- customer_relations_contacts
work_item_type:
- issues
events:
@@ -272,6 +273,8 @@ ci_pipelines:
- dast_profiles_pipeline
- dast_site_profile
- dast_site_profiles_pipeline
+- package_build_infos
+- package_file_build_infos
ci_refs:
- project
- ci_pipelines
@@ -322,7 +325,6 @@ integrations:
- jira_tracker_data
- zentao_tracker_data
- issue_tracker_data
-- open_project_tracker_data
hooks:
- project
- web_hook_logs
@@ -354,10 +356,7 @@ container_repositories:
- name
project:
- external_status_checks
-- taggings
- base_tags
-- topic_taggings
-- topics_acts_as_taggable
- project_topics
- topics
- chat_services
@@ -593,6 +592,7 @@ project:
- pending_builds
- security_scans
- ci_feature_usages
+- bulk_import_exports
award_emoji:
- awardable
- user
diff --git a/spec/lib/gitlab/import_export/attributes_permitter_spec.rb b/spec/lib/gitlab/import_export/attributes_permitter_spec.rb
index 36a831a785c..2b974f8985d 100644
--- a/spec/lib/gitlab/import_export/attributes_permitter_spec.rb
+++ b/spec/lib/gitlab/import_export/attributes_permitter_spec.rb
@@ -83,14 +83,22 @@ RSpec.describe Gitlab::ImportExport::AttributesPermitter do
where(:relation_name, :permitted_attributes_defined) do
:user | false
:author | false
- :ci_cd_settings | false
- :issuable_sla | false
- :push_rule | false
+ :ci_cd_settings | true
:metrics_setting | true
:project_badges | true
:pipeline_schedules | true
:error_tracking_setting | true
:auto_devops | true
+ :boards | true
+ :custom_attributes | true
+ :labels | true
+ :protected_branches | true
+ :protected_tags | true
+ :create_access_levels | true
+ :merge_access_levels | true
+ :push_access_levels | true
+ :releases | true
+ :links | true
end
with_them do
@@ -99,47 +107,11 @@ RSpec.describe Gitlab::ImportExport::AttributesPermitter do
end
describe 'included_attributes for Project' do
- let(:prohibited_attributes) { %i[remote_url my_attributes my_ids token my_id test] }
-
subject { described_class.new }
Gitlab::ImportExport::Config.new.to_h[:included_attributes].each do |relation_sym, permitted_attributes|
context "for #{relation_sym}" do
- let(:import_export_config) { Gitlab::ImportExport::Config.new.to_h }
- let(:project_relation_factory) { Gitlab::ImportExport::Project::RelationFactory }
-
- let(:relation_hash) { (permitted_attributes + prohibited_attributes).map(&:to_s).zip([]).to_h }
- let(:relation_name) { project_relation_factory.overrides[relation_sym]&.to_sym || relation_sym }
- let(:relation_class) { project_relation_factory.relation_class(relation_name) }
- let(:excluded_keys) { import_export_config.dig(:excluded_keys, relation_sym) || [] }
-
- let(:cleaned_hash) do
- Gitlab::ImportExport::AttributeCleaner.new(
- relation_hash: relation_hash,
- relation_class: relation_class,
- excluded_keys: excluded_keys
- ).clean
- end
-
- let(:permitted_hash) { subject.permit(relation_sym, relation_hash) }
-
- if described_class.new.permitted_attributes_defined?(relation_sym)
- it 'contains only attributes that are defined as permitted in the import/export config' do
- expect(permitted_hash.keys).to contain_exactly(*permitted_attributes.map(&:to_s))
- end
-
- it 'does not contain attributes that would be cleaned with AttributeCleaner' do
- expect(cleaned_hash.keys).to include(*permitted_hash.keys)
- end
-
- it 'does not contain prohibited attributes that are not related to given relation' do
- expect(permitted_hash.keys).not_to include(*prohibited_attributes.map(&:to_s))
- end
- else
- it 'is disabled' do
- expect(subject).not_to be_permitted_attributes_defined(relation_sym)
- end
- end
+ it_behaves_like 'a permitted attribute', relation_sym, permitted_attributes
end
end
end
diff --git a/spec/lib/gitlab/import_export/command_line_util_spec.rb b/spec/lib/gitlab/import_export/command_line_util_spec.rb
index 39a10f87083..59c4e1083ae 100644
--- a/spec/lib/gitlab/import_export/command_line_util_spec.rb
+++ b/spec/lib/gitlab/import_export/command_line_util_spec.rb
@@ -8,6 +8,7 @@ RSpec.describe Gitlab::ImportExport::CommandLineUtil do
let(:path) { "#{Dir.tmpdir}/symlink_test" }
let(:archive) { 'spec/fixtures/symlink_export.tar.gz' }
let(:shared) { Gitlab::ImportExport::Shared.new(nil) }
+ let(:tmpdir) { Dir.mktmpdir }
subject do
Class.new do
@@ -26,6 +27,7 @@ RSpec.describe Gitlab::ImportExport::CommandLineUtil do
after do
FileUtils.rm_rf(path)
+ FileUtils.remove_entry(tmpdir)
end
it 'has the right mask for project.json' do
@@ -55,7 +57,6 @@ RSpec.describe Gitlab::ImportExport::CommandLineUtil do
describe '#gunzip' do
it 'decompresses specified file' do
- tmpdir = Dir.mktmpdir
filename = 'labels.ndjson.gz'
gz_filepath = "spec/fixtures/bulk_imports/gz/#{filename}"
FileUtils.copy_file(gz_filepath, File.join(tmpdir, filename))
@@ -63,8 +64,6 @@ RSpec.describe Gitlab::ImportExport::CommandLineUtil do
subject.gunzip(dir: tmpdir, filename: filename)
expect(File.exist?(File.join(tmpdir, 'labels.ndjson'))).to eq(true)
-
- FileUtils.remove_entry(tmpdir)
end
context 'when exception occurs' do
@@ -73,4 +72,33 @@ RSpec.describe Gitlab::ImportExport::CommandLineUtil do
end
end
end
+
+ describe '#tar_cf' do
+ let(:archive_dir) { Dir.mktmpdir }
+
+ after do
+ FileUtils.remove_entry(archive_dir)
+ end
+
+ it 'archives a folder without compression' do
+ archive_file = File.join(archive_dir, 'archive.tar')
+
+ result = subject.tar_cf(archive: archive_file, dir: tmpdir)
+
+ expect(result).to eq(true)
+ expect(File.exist?(archive_file)).to eq(true)
+ end
+
+ context 'when something goes wrong' do
+ it 'raises an error' do
+ expect(Gitlab::Popen).to receive(:popen).and_return(['Error', 1])
+
+ klass = Class.new do
+ include Gitlab::ImportExport::CommandLineUtil
+ end.new
+
+ expect { klass.tar_cf(archive: 'test', dir: 'test') }.to raise_error(Gitlab::ImportExport::Error, 'System call failed')
+ end
+ end
+ end
end
diff --git a/spec/lib/gitlab/import_export/json/streaming_serializer_spec.rb b/spec/lib/gitlab/import_export/json/streaming_serializer_spec.rb
index 9e30564b437..d69d775fffb 100644
--- a/spec/lib/gitlab/import_export/json/streaming_serializer_spec.rb
+++ b/spec/lib/gitlab/import_export/json/streaming_serializer_spec.rb
@@ -115,7 +115,7 @@ RSpec.describe Gitlab::ImportExport::Json::StreamingSerializer do
end
it 'orders exported issues by custom column(relative_position)' do
- expected_issues = exportable.issues.order_relative_position_desc.order(id: :desc).map(&:to_json)
+ expected_issues = exportable.issues.reorder(::Gitlab::Database.nulls_first_order('relative_position', 'DESC')).order(id: :desc).map(&:to_json)
expect(json_writer).to receive(:write_relation_array).with(exportable_path, :issues, expected_issues)
@@ -163,21 +163,10 @@ RSpec.describe Gitlab::ImportExport::Json::StreamingSerializer do
stub_feature_flags(load_balancing_for_export_workers: true)
end
- context 'when enabled', :db_load_balancing do
- it 'reads from replica' do
- expect(Gitlab::Database::LoadBalancing::Session.current).to receive(:use_replicas_for_read_queries).and_call_original
+ it 'reads from replica' do
+ expect(Gitlab::Database::LoadBalancing::Session.current).to receive(:use_replicas_for_read_queries).and_call_original
- subject.execute
- end
- end
-
- context 'when disabled' do
- it 'reads from primary' do
- allow(Gitlab::Database::LoadBalancing).to receive(:enable?).and_return(false)
- expect(Gitlab::Database::LoadBalancing::Session.current).not_to receive(:use_replicas_for_read_queries)
-
- subject.execute
- end
+ subject.execute
end
end
diff --git a/spec/lib/gitlab/import_export/merge_request_parser_spec.rb b/spec/lib/gitlab/import_export/merge_request_parser_spec.rb
index c558c12f581..550cefea805 100644
--- a/spec/lib/gitlab/import_export/merge_request_parser_spec.rb
+++ b/spec/lib/gitlab/import_export/merge_request_parser_spec.rb
@@ -13,9 +13,11 @@ RSpec.describe Gitlab::ImportExport::MergeRequestParser do
create(:merge_request, source_project: forked_project, target_project: project)
end
+ let(:diff_head_sha) { SecureRandom.hex(20) }
+
let(:parsed_merge_request) do
described_class.new(project,
- 'abcd',
+ diff_head_sha,
merge_request,
merge_request.as_json).parse!
end
@@ -34,14 +36,34 @@ RSpec.describe Gitlab::ImportExport::MergeRequestParser do
expect(project.repository.branch_exists?(parsed_merge_request.target_branch)).to be true
end
- it 'parses a MR that has no source branch' do
- allow_next_instance_of(described_class) do |instance|
- allow(instance).to receive(:branch_exists?).and_call_original
- allow(instance).to receive(:branch_exists?).with(merge_request.source_branch).and_return(false)
- allow(instance).to receive(:fork_merge_request?).and_return(true)
+ # Source and target branch are only created when: fork_merge_request
+ context 'fork merge request' do
+ before do
+ allow_next_instance_of(described_class) do |instance|
+ allow(instance).to receive(:fork_merge_request?).and_return(true)
+ end
+ end
+
+ it 'parses a MR that has no source branch' do
+ allow_next_instance_of(described_class) do |instance|
+ allow(instance).to receive(:branch_exists?).and_call_original
+ allow(instance).to receive(:branch_exists?).with(merge_request.source_branch).and_return(false)
+ end
+
+ expect(parsed_merge_request).to eq(merge_request)
end
- expect(parsed_merge_request).to eq(merge_request)
+ it 'parses a MR that is closed' do
+ merge_request.update!(state: :closed, source_branch: 'new_branch')
+
+ expect(project.repository.branch_exists?(parsed_merge_request.source_branch)).to be false
+ end
+
+ it 'parses a MR that is merged' do
+ merge_request.update!(state: :merged, source_branch: 'new_branch')
+
+ expect(project.repository.branch_exists?(parsed_merge_request.source_branch)).to be false
+ end
end
context 'when the merge request has diffs' do
diff --git a/spec/lib/gitlab/import_export/relation_tree_restorer_spec.rb b/spec/lib/gitlab/import_export/relation_tree_restorer_spec.rb
index 9325cdac9ed..5e4075c2b59 100644
--- a/spec/lib/gitlab/import_export/relation_tree_restorer_spec.rb
+++ b/spec/lib/gitlab/import_export/relation_tree_restorer_spec.rb
@@ -30,18 +30,12 @@ RSpec.describe Gitlab::ImportExport::RelationTreeRestorer do
subject { relation_tree_restorer.restore }
shared_examples 'import project successfully' do
- it 'restores project tree' do
- expect(subject).to eq(true)
- end
-
describe 'imported project' do
- let(:project) { Project.find_by_path('project') }
+ it 'has the project attributes and relations', :aggregate_failures do
+ expect(subject).to eq(true)
- before do
- subject
- end
+ project = Project.find_by_path('project')
- it 'has the project attributes and relations' do
expect(project.description).to eq('Nisi et repellendus ut enim quo accusamus vel magnam.')
expect(project.labels.count).to eq(3)
expect(project.boards.count).to eq(1)
@@ -86,7 +80,10 @@ RSpec.describe Gitlab::ImportExport::RelationTreeRestorer do
end
context 'when restoring a project' do
- let(:importable) { create(:project, :builds_enabled, :issues_disabled, name: 'project', path: 'project') }
+ let_it_be(:importable, reload: true) do
+ create(:project, :builds_enabled, :issues_disabled, name: 'project', path: 'project')
+ end
+
let(:importable_name) { 'project' }
let(:importable_path) { 'project' }
let(:object_builder) { Gitlab::ImportExport::Project::ObjectBuilder }
@@ -108,8 +105,10 @@ RSpec.describe Gitlab::ImportExport::RelationTreeRestorer do
it_behaves_like 'import project successfully'
context 'logging of relations creation' do
- let(:group) { create(:group) }
- let(:importable) { create(:project, :builds_enabled, :issues_disabled, name: 'project', path: 'project', group: group) }
+ let_it_be(:group) { create(:group) }
+ let_it_be(:importable) do
+ create(:project, :builds_enabled, :issues_disabled, name: 'project', path: 'project', group: group)
+ end
include_examples 'logging of relations creation'
end
@@ -120,6 +119,18 @@ RSpec.describe Gitlab::ImportExport::RelationTreeRestorer do
let(:relation_reader) { Gitlab::ImportExport::Json::NdjsonReader.new(path) }
it_behaves_like 'import project successfully'
+
+ context 'when inside a group' do
+ let_it_be(:group) do
+ create(:group, :disabled_and_unoverridable)
+ end
+
+ before do
+ importable.update!(shared_runners_enabled: false, group: group)
+ end
+
+ it_behaves_like 'import project successfully'
+ end
end
context 'with invalid relations' do
@@ -143,9 +154,10 @@ RSpec.describe Gitlab::ImportExport::RelationTreeRestorer do
end
context 'when restoring a group' do
+ let_it_be(:group) { create(:group) }
+ let_it_be(:importable) { create(:group, parent: group) }
+
let(:path) { 'spec/fixtures/lib/gitlab/import_export/group_exports/no_children/group.json' }
- let(:group) { create(:group) }
- let(:importable) { create(:group, parent: group) }
let(:importable_name) { nil }
let(:importable_path) { nil }
let(:object_builder) { Gitlab::ImportExport::Group::ObjectBuilder }
diff --git a/spec/lib/gitlab/import_export/snippet_repo_restorer_spec.rb b/spec/lib/gitlab/import_export/snippet_repo_restorer_spec.rb
index c1661cf02b6..7d719b6028f 100644
--- a/spec/lib/gitlab/import_export/snippet_repo_restorer_spec.rb
+++ b/spec/lib/gitlab/import_export/snippet_repo_restorer_spec.rb
@@ -29,6 +29,9 @@ RSpec.describe Gitlab::ImportExport::SnippetRepoRestorer do
expect(restorer.restore).to be_truthy
end.to change { SnippetRepository.count }.by(1)
+ snippet.repository.expire_method_caches(%i(exists?))
+ expect(snippet.repository_exists?).to be_truthy
+
blob = snippet.repository.blob_at(snippet.default_branch, snippet.file_name)
expect(blob).not_to be_nil
expect(blob.data).to eq(snippet.content)
diff --git a/spec/lib/gitlab/instrumentation/redis_spec.rb b/spec/lib/gitlab/instrumentation/redis_spec.rb
index ebc2e92a0dd..900a079cdd2 100644
--- a/spec/lib/gitlab/instrumentation/redis_spec.rb
+++ b/spec/lib/gitlab/instrumentation/redis_spec.rb
@@ -76,7 +76,9 @@ RSpec.describe Gitlab::Instrumentation::Redis do
details_row.merge(storage: 'Cache'),
details_row.merge(storage: 'Queues'),
details_row.merge(storage: 'SharedState'),
- details_row.merge(storage: 'TraceChunks'))
+ details_row.merge(storage: 'TraceChunks'),
+ details_row.merge(storage: 'RateLimiting'),
+ details_row.merge(storage: 'Sessions'))
end
end
end
diff --git a/spec/lib/gitlab/instrumentation_helper_spec.rb b/spec/lib/gitlab/instrumentation_helper_spec.rb
index 85daf50717c..52d3623c304 100644
--- a/spec/lib/gitlab/instrumentation_helper_spec.rb
+++ b/spec/lib/gitlab/instrumentation_helper_spec.rb
@@ -107,75 +107,50 @@ RSpec.describe Gitlab::InstrumentationHelper do
end
end
- context 'when load balancing is enabled' do
- before do
- allow(Gitlab::Database::LoadBalancing).to receive(:enable?).and_return(true)
- end
-
- it 'includes DB counts' do
- subject
-
- expect(payload).to include(db_replica_count: 0,
- db_replica_cached_count: 0,
- db_primary_count: 0,
- db_primary_cached_count: 0,
- db_primary_wal_count: 0,
- db_replica_wal_count: 0,
- db_primary_wal_cached_count: 0,
- db_replica_wal_cached_count: 0)
- end
-
- context 'when replica caught up search was made' do
- before do
- Gitlab::SafeRequestStore[:caught_up_replica_pick_ok] = 2
- Gitlab::SafeRequestStore[:caught_up_replica_pick_fail] = 1
- end
+ it 'includes DB counts' do
+ subject
- it 'includes related metrics' do
- subject
+ expect(payload).to include(db_replica_count: 0,
+ db_replica_cached_count: 0,
+ db_primary_count: 0,
+ db_primary_cached_count: 0,
+ db_primary_wal_count: 0,
+ db_replica_wal_count: 0,
+ db_primary_wal_cached_count: 0,
+ db_replica_wal_cached_count: 0)
+ end
- expect(payload).to include(caught_up_replica_pick_ok: 2)
- expect(payload).to include(caught_up_replica_pick_fail: 1)
- end
+ context 'when replica caught up search was made' do
+ before do
+ Gitlab::SafeRequestStore[:caught_up_replica_pick_ok] = 2
+ Gitlab::SafeRequestStore[:caught_up_replica_pick_fail] = 1
end
- context 'when only a single counter was updated' do
- before do
- Gitlab::SafeRequestStore[:caught_up_replica_pick_ok] = 1
- Gitlab::SafeRequestStore[:caught_up_replica_pick_fail] = nil
- end
-
- it 'includes only that counter into logging' do
- subject
+ it 'includes related metrics' do
+ subject
- expect(payload).to include(caught_up_replica_pick_ok: 1)
- expect(payload).not_to include(:caught_up_replica_pick_fail)
- end
+ expect(payload).to include(caught_up_replica_pick_ok: 2)
+ expect(payload).to include(caught_up_replica_pick_fail: 1)
end
end
- context 'when load balancing is disabled' do
+ context 'when only a single counter was updated' do
before do
- allow(Gitlab::Database::LoadBalancing).to receive(:enable?).and_return(false)
+ Gitlab::SafeRequestStore[:caught_up_replica_pick_ok] = 1
+ Gitlab::SafeRequestStore[:caught_up_replica_pick_fail] = nil
end
- it 'does not include DB counts' do
+ it 'includes only that counter into logging' do
subject
- expect(payload).not_to include(db_replica_count: 0,
- db_replica_cached_count: 0,
- db_primary_count: 0,
- db_primary_cached_count: 0,
- db_primary_wal_count: 0,
- db_replica_wal_count: 0,
- db_primary_wal_cached_count: 0,
- db_replica_wal_cached_count: 0)
+ expect(payload).to include(caught_up_replica_pick_ok: 1)
+ expect(payload).not_to include(:caught_up_replica_pick_fail)
end
end
end
- describe '.queue_duration_for_job' do
- where(:enqueued_at, :created_at, :time_now, :expected_duration) do
+ describe 'duration calculations' do
+ where(:end_time, :start_time, :time_now, :expected_duration) do
"2019-06-01T00:00:00.000+0000" | nil | "2019-06-01T02:00:00.000+0000" | 2.hours.to_f
"2019-06-01T02:00:00.000+0000" | nil | "2019-06-01T02:00:00.001+0000" | 0.001
"2019-06-01T02:00:00.000+0000" | "2019-05-01T02:00:00.000+0000" | "2019-06-01T02:00:01.000+0000" | 1
@@ -189,15 +164,29 @@ RSpec.describe Gitlab::InstrumentationHelper do
0 | nil | "2019-10-23T12:13:16.000+0200" | nil
-1 | nil | "2019-10-23T12:13:16.000+0200" | nil
"2019-06-01T02:00:00.000+0000" | nil | "2019-06-01T00:00:00.000+0000" | 0
- Time.at(1571999233) | nil | "2019-10-25T12:29:16.000+0200" | 123
+ Time.at(1571999233).utc | nil | "2019-10-25T12:29:16.000+0200" | 123
+ end
+
+ describe '.queue_duration_for_job' do
+ with_them do
+ let(:job) { { 'enqueued_at' => end_time, 'created_at' => start_time } }
+
+ it "returns the correct duration" do
+ travel_to(Time.iso8601(time_now)) do
+ expect(described_class.queue_duration_for_job(job)).to eq(expected_duration)
+ end
+ end
+ end
end
- with_them do
- let(:job) { { 'enqueued_at' => enqueued_at, 'created_at' => created_at } }
+ describe '.enqueue_latency_for_scheduled_job' do
+ with_them do
+ let(:job) { { 'enqueued_at' => end_time, 'scheduled_at' => start_time } }
- it "returns the correct duration" do
- Timecop.freeze(Time.iso8601(time_now)) do
- expect(described_class.queue_duration_for_job(job)).to eq(expected_duration)
+ it "returns the correct duration" do
+ travel_to(Time.iso8601(time_now)) do
+ expect(described_class.enqueue_latency_for_scheduled_job(job)).to eq(expected_duration)
+ end
end
end
end
diff --git a/spec/lib/gitlab/kas_spec.rb b/spec/lib/gitlab/kas_spec.rb
index 17d038ed16c..0fbb5f31210 100644
--- a/spec/lib/gitlab/kas_spec.rb
+++ b/spec/lib/gitlab/kas_spec.rb
@@ -70,30 +70,44 @@ RSpec.describe Gitlab::Kas do
stub_config(gitlab_kas: { external_url: external_url })
end
+ let(:external_url) { 'xyz' }
+
subject { described_class.tunnel_url }
- context 'external_url uses wss://' do
- let(:external_url) { 'wss://kas.gitlab.example.com' }
+ context 'with a gitlab_kas.external_k8s_proxy_url setting' do
+ let(:external_k8s_proxy_url) { 'abc' }
+
+ before do
+ stub_config(gitlab_kas: { external_k8s_proxy_url: external_k8s_proxy_url })
+ end
- it { is_expected.to eq('https://kas.gitlab.example.com/k8s-proxy') }
+ it { is_expected.to eq(external_k8s_proxy_url) }
end
- context 'external_url uses ws://' do
- let(:external_url) { 'ws://kas.gitlab.example.com' }
+ context 'without a gitlab_kas.external_k8s_proxy_url setting' do
+ context 'external_url uses wss://' do
+ let(:external_url) { 'wss://kas.gitlab.example.com' }
- it { is_expected.to eq('http://kas.gitlab.example.com/k8s-proxy') }
- end
+ it { is_expected.to eq('https://kas.gitlab.example.com/k8s-proxy') }
+ end
- context 'external_url uses grpcs://' do
- let(:external_url) { 'grpcs://kas.gitlab.example.com' }
+ context 'external_url uses ws://' do
+ let(:external_url) { 'ws://kas.gitlab.example.com' }
- it { is_expected.to eq('https://kas.gitlab.example.com/k8s-proxy') }
- end
+ it { is_expected.to eq('http://kas.gitlab.example.com/k8s-proxy') }
+ end
+
+ context 'external_url uses grpcs://' do
+ let(:external_url) { 'grpcs://kas.gitlab.example.com' }
- context 'external_url uses grpc://' do
- let(:external_url) { 'grpc://kas.gitlab.example.com' }
+ it { is_expected.to eq('https://kas.gitlab.example.com/k8s-proxy') }
+ end
+
+ context 'external_url uses grpc://' do
+ let(:external_url) { 'grpc://kas.gitlab.example.com' }
- it { is_expected.to eq('http://kas.gitlab.example.com/k8s-proxy') }
+ it { is_expected.to eq('http://kas.gitlab.example.com/k8s-proxy') }
+ end
end
end
diff --git a/spec/lib/gitlab/mail_room/mail_room_spec.rb b/spec/lib/gitlab/mail_room/mail_room_spec.rb
index a42da4ad3e0..0bd1a27c65e 100644
--- a/spec/lib/gitlab/mail_room/mail_room_spec.rb
+++ b/spec/lib/gitlab/mail_room/mail_room_spec.rb
@@ -93,7 +93,7 @@ RSpec.describe Gitlab::MailRoom do
end
describe 'setting up redis settings' do
- let(:fake_redis_queues) { double(url: "localhost", sentinels: "yes, them", sentinels?: true) }
+ let(:fake_redis_queues) { double(url: "localhost", db: 99, sentinels: "yes, them", sentinels?: true) }
before do
allow(Gitlab::Redis::Queues).to receive(:new).and_return(fake_redis_queues)
@@ -103,6 +103,7 @@ RSpec.describe Gitlab::MailRoom do
config = described_class.enabled_configs.first
expect(config[:redis_url]).to eq('localhost')
+ expect(config[:redis_db]).to eq(99)
expect(config[:sentinels]).to eq('yes, them')
end
end
diff --git a/spec/lib/gitlab/merge_requests/mergeability/check_result_spec.rb b/spec/lib/gitlab/merge_requests/mergeability/check_result_spec.rb
new file mode 100644
index 00000000000..4f437e57600
--- /dev/null
+++ b/spec/lib/gitlab/merge_requests/mergeability/check_result_spec.rb
@@ -0,0 +1,140 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::MergeRequests::Mergeability::CheckResult do
+ subject(:check_result) { described_class }
+
+ let(:time) { Time.current }
+
+ around do |example|
+ freeze_time do
+ example.run
+ end
+ end
+
+ describe '.default_payload' do
+ it 'returns the expected defaults' do
+ expect(check_result.default_payload).to eq({ last_run_at: time })
+ end
+ end
+
+ describe '.success' do
+ subject(:success) { check_result.success(payload: payload) }
+
+ let(:payload) { {} }
+
+ it 'creates a success result' do
+ expect(success.status).to eq described_class::SUCCESS_STATUS
+ end
+
+ it 'uses the default payload' do
+ expect(success.payload).to eq described_class.default_payload
+ end
+
+ context 'when given a payload' do
+ let(:payload) { { last_run_at: time + 1.day, test: 'test' } }
+
+ it 'uses the payload passed' do
+ expect(success.payload).to eq payload
+ end
+ end
+ end
+
+ describe '.failed' do
+ subject(:failed) { check_result.failed(payload: payload) }
+
+ let(:payload) { {} }
+
+ it 'creates a failure result' do
+ expect(failed.status).to eq described_class::FAILED_STATUS
+ end
+
+ it 'uses the default payload' do
+ expect(failed.payload).to eq described_class.default_payload
+ end
+
+ context 'when given a payload' do
+ let(:payload) { { last_run_at: time + 1.day, test: 'test' } }
+
+ it 'uses the payload passed' do
+ expect(failed.payload).to eq payload
+ end
+ end
+ end
+
+ describe '.from_hash' do
+ subject(:from_hash) { described_class.from_hash(hash) }
+
+ let(:status) { described_class::SUCCESS_STATUS }
+ let(:payload) { { test: 'test' } }
+ let(:hash) do
+ {
+ status: status,
+ payload: payload
+ }
+ end
+
+ it 'returns the expected status and payload' do
+ expect(from_hash.status).to eq status
+ expect(from_hash.payload).to eq payload
+ end
+ end
+
+ describe '#to_hash' do
+ subject(:to_hash) { described_class.new(**hash).to_hash }
+
+ let(:status) { described_class::SUCCESS_STATUS }
+ let(:payload) { { test: 'test' } }
+ let(:hash) do
+ {
+ status: status,
+ payload: payload
+ }
+ end
+
+ it 'returns the expected hash' do
+ expect(to_hash).to eq hash
+ end
+ end
+
+ describe '#failed?' do
+ subject(:failed) { described_class.new(status: status).failed? }
+
+ context 'when it has failed' do
+ let(:status) { described_class::FAILED_STATUS }
+
+ it 'returns true' do
+ expect(failed).to eq true
+ end
+ end
+
+ context 'when it has succeeded' do
+ let(:status) { described_class::SUCCESS_STATUS }
+
+ it 'returns false' do
+ expect(failed).to eq false
+ end
+ end
+ end
+
+ describe '#success?' do
+ subject(:success) { described_class.new(status: status).success? }
+
+ context 'when it has failed' do
+ let(:status) { described_class::FAILED_STATUS }
+
+ it 'returns false' do
+ expect(success).to eq false
+ end
+ end
+
+ context 'when it has succeeded' do
+ let(:status) { described_class::SUCCESS_STATUS }
+
+ it 'returns true' do
+ expect(success).to eq true
+ end
+ end
+ end
+end
diff --git a/spec/lib/gitlab/merge_requests/mergeability/redis_interface_spec.rb b/spec/lib/gitlab/merge_requests/mergeability/redis_interface_spec.rb
new file mode 100644
index 00000000000..e5475d04d86
--- /dev/null
+++ b/spec/lib/gitlab/merge_requests/mergeability/redis_interface_spec.rb
@@ -0,0 +1,29 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::MergeRequests::Mergeability::RedisInterface, :clean_gitlab_redis_shared_state do
+ subject(:redis_interface) { described_class.new }
+
+ let(:merge_check) { double(cache_key: '13') }
+ let(:result_hash) { { 'test' => 'test' } }
+ let(:expected_key) { "#{merge_check.cache_key}:#{described_class::VERSION}" }
+
+ describe '#save_check' do
+ it 'saves the hash' do
+ expect(Gitlab::Redis::SharedState.with { |redis| redis.get(expected_key) }).to be_nil
+
+ redis_interface.save_check(merge_check: merge_check, result_hash: result_hash)
+
+ expect(Gitlab::Redis::SharedState.with { |redis| redis.get(expected_key) }).to eq result_hash.to_json
+ end
+ end
+
+ describe '#retrieve_check' do
+ it 'returns the hash' do
+ Gitlab::Redis::SharedState.with { |redis| redis.set(expected_key, result_hash.to_json) }
+
+ expect(redis_interface.retrieve_check(merge_check: merge_check)).to eq result_hash
+ end
+ end
+end
diff --git a/spec/lib/gitlab/merge_requests/mergeability/results_store_spec.rb b/spec/lib/gitlab/merge_requests/mergeability/results_store_spec.rb
new file mode 100644
index 00000000000..d376dcb5b18
--- /dev/null
+++ b/spec/lib/gitlab/merge_requests/mergeability/results_store_spec.rb
@@ -0,0 +1,29 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::MergeRequests::Mergeability::ResultsStore do
+ subject(:results_store) { described_class.new(merge_request: merge_request, interface: interface) }
+
+ let(:merge_check) { double }
+ let(:interface) { double }
+ let(:merge_request) { double }
+
+ describe '#read' do
+ it 'calls #retrieve on the interface' do
+ expect(interface).to receive(:retrieve_check).with(merge_check: merge_check)
+
+ results_store.read(merge_check: merge_check)
+ end
+ end
+
+ describe '#write' do
+ let(:result_hash) { double }
+
+ it 'calls #save_check on the interface' do
+ expect(interface).to receive(:save_check).with(merge_check: merge_check, result_hash: result_hash)
+
+ results_store.write(merge_check: merge_check, result_hash: result_hash)
+ end
+ end
+end
diff --git a/spec/lib/gitlab/metrics/exporter/web_exporter_spec.rb b/spec/lib/gitlab/metrics/exporter/web_exporter_spec.rb
index ce98c807e2e..9deaecbf41b 100644
--- a/spec/lib/gitlab/metrics/exporter/web_exporter_spec.rb
+++ b/spec/lib/gitlab/metrics/exporter/web_exporter_spec.rb
@@ -30,6 +30,15 @@ RSpec.describe Gitlab::Metrics::Exporter::WebExporter do
expect(readiness_probe.json).to include(status: 'ok')
expect(readiness_probe.json).to include('web_exporter' => [{ 'status': 'ok' }])
end
+
+ it 'initializes request metrics', :prometheus do
+ expect(Gitlab::Metrics::RailsSlis).to receive(:initialize_request_slis_if_needed!).and_call_original
+
+ http = Net::HTTP.new(exporter.server.config[:BindAddress], exporter.server.config[:Port])
+ response = http.request(Net::HTTP::Get.new('/metrics'))
+
+ expect(response.body).to include('gitlab_sli:rails_request_apdex')
+ end
end
describe '#mark_as_not_running!' do
diff --git a/spec/lib/gitlab/metrics/instrumentation_spec.rb b/spec/lib/gitlab/metrics/instrumentation_spec.rb
deleted file mode 100644
index b15e06a0861..00000000000
--- a/spec/lib/gitlab/metrics/instrumentation_spec.rb
+++ /dev/null
@@ -1,342 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Gitlab::Metrics::Instrumentation do
- let(:env) { {} }
- let(:transaction) { Gitlab::Metrics::WebTransaction.new(env) }
-
- before do
- @dummy = Class.new do
- def self.foo(text = 'foo')
- text
- end
-
- def self.wat(text = 'wat')
- text
- end
- private_class_method :wat
-
- class << self
- def buzz(text = 'buzz')
- text
- end
- private :buzz
-
- def flaky(text = 'flaky')
- text
- end
- protected :flaky
- end
-
- def bar(text = 'bar')
- text
- end
-
- def wadus(text = 'wadus')
- text
- end
- private :wadus
-
- def chaf(text = 'chaf')
- text
- end
- protected :chaf
- end
-
- allow(@dummy).to receive(:name).and_return('Dummy')
- end
-
- describe '.series' do
- it 'returns a String' do
- expect(described_class.series).to be_an_instance_of(String)
- end
- end
-
- describe '.configure' do
- it 'yields self' do
- described_class.configure do |c|
- expect(c).to eq(described_class)
- end
- end
- end
-
- describe '.instrument_method' do
- describe 'with metrics enabled' do
- before do
- allow(Gitlab::Metrics).to receive(:enabled?).and_return(true)
-
- described_class.instrument_method(@dummy, :foo)
- end
-
- it 'instruments the Class' do
- target = @dummy.singleton_class
-
- expect(described_class.instrumented?(target)).to eq(true)
- end
-
- it 'defines a proxy method' do
- mod = described_class.proxy_module(@dummy.singleton_class)
-
- expect(mod.method_defined?(:foo)).to eq(true)
- end
-
- it 'calls the instrumented method with the correct arguments' do
- expect(@dummy.foo).to eq('foo')
- end
-
- it 'tracks the call duration upon calling the method' do
- allow(Gitlab::Metrics).to receive(:method_call_threshold)
- .and_return(0)
-
- allow(described_class).to receive(:transaction)
- .and_return(transaction)
-
- expect_next_instance_of(Gitlab::Metrics::MethodCall) do |instance|
- expect(instance).to receive(:measure)
- end
-
- @dummy.foo
- end
-
- it 'does not track method calls below a given duration threshold' do
- allow(Gitlab::Metrics).to receive(:method_call_threshold)
- .and_return(100)
-
- expect(transaction).not_to receive(:add_metric)
-
- @dummy.foo
- end
-
- it 'generates a method with the correct arity when using methods without arguments' do
- dummy = Class.new do
- def self.test; end
- end
-
- described_class.instrument_method(dummy, :test)
-
- expect(dummy.method(:test).arity).to eq(0)
- end
-
- describe 'when a module is instrumented multiple times' do
- it 'calls the instrumented method with the correct arguments' do
- described_class.instrument_method(@dummy, :foo)
-
- expect(@dummy.foo).to eq('foo')
- end
- end
- end
-
- describe 'with metrics disabled' do
- before do
- allow(Gitlab::Metrics).to receive(:enabled?).and_return(false)
- end
-
- it 'does not instrument the method' do
- described_class.instrument_method(@dummy, :foo)
-
- target = @dummy.singleton_class
-
- expect(described_class.instrumented?(target)).to eq(false)
- end
- end
- end
-
- describe '.instrument_instance_method' do
- describe 'with metrics enabled' do
- before do
- allow(Gitlab::Metrics).to receive(:enabled?).and_return(true)
-
- described_class
- .instrument_instance_method(@dummy, :bar)
- end
-
- it 'instruments instances of the Class' do
- expect(described_class.instrumented?(@dummy)).to eq(true)
- end
-
- it 'defines a proxy method' do
- mod = described_class.proxy_module(@dummy)
-
- expect(mod.method_defined?(:bar)).to eq(true)
- end
-
- it 'calls the instrumented method with the correct arguments' do
- expect(@dummy.new.bar).to eq('bar')
- end
-
- it 'tracks the call duration upon calling the method' do
- allow(Gitlab::Metrics).to receive(:method_call_threshold)
- .and_return(0)
-
- allow(described_class).to receive(:transaction)
- .and_return(transaction)
-
- expect_next_instance_of(Gitlab::Metrics::MethodCall) do |instance|
- expect(instance).to receive(:measure)
- end
-
- @dummy.new.bar
- end
-
- it 'does not track method calls below a given duration threshold' do
- allow(Gitlab::Metrics).to receive(:method_call_threshold)
- .and_return(100)
-
- expect(transaction).not_to receive(:add_metric)
-
- @dummy.new.bar
- end
- end
-
- describe 'with metrics disabled' do
- before do
- allow(Gitlab::Metrics).to receive(:enabled?).and_return(false)
- end
-
- it 'does not instrument the method' do
- described_class
- .instrument_instance_method(@dummy, :bar)
-
- expect(described_class.instrumented?(@dummy)).to eq(false)
- end
- end
- end
-
- describe '.instrument_class_hierarchy' do
- before do
- allow(Gitlab::Metrics).to receive(:enabled?).and_return(true)
-
- @child1 = Class.new(@dummy) do
- def self.child1_foo; end
-
- def child1_bar; end
- end
-
- @child2 = Class.new(@child1) do
- def self.child2_foo; end
-
- def child2_bar; end
- end
- end
-
- it 'recursively instruments a class hierarchy' do
- described_class.instrument_class_hierarchy(@dummy)
-
- expect(described_class.instrumented?(@child1.singleton_class)).to eq(true)
- expect(described_class.instrumented?(@child2.singleton_class)).to eq(true)
-
- expect(described_class.instrumented?(@child1)).to eq(true)
- expect(described_class.instrumented?(@child2)).to eq(true)
- end
-
- it 'does not instrument the root module' do
- described_class.instrument_class_hierarchy(@dummy)
-
- expect(described_class.instrumented?(@dummy)).to eq(false)
- end
- end
-
- describe '.instrument_methods' do
- before do
- allow(Gitlab::Metrics).to receive(:enabled?).and_return(true)
- end
-
- it 'instruments all public class methods' do
- described_class.instrument_methods(@dummy)
-
- expect(described_class.instrumented?(@dummy.singleton_class)).to eq(true)
- expect(@dummy.method(:foo).source_location.first).to match(/instrumentation\.rb/)
- expect(@dummy.public_methods).to include(:foo)
- end
-
- it 'instruments all protected class methods' do
- described_class.instrument_methods(@dummy)
-
- expect(described_class.instrumented?(@dummy.singleton_class)).to eq(true)
- expect(@dummy.method(:flaky).source_location.first).to match(/instrumentation\.rb/)
- expect(@dummy.protected_methods).to include(:flaky)
- end
-
- it 'instruments all private class methods' do
- described_class.instrument_methods(@dummy)
-
- expect(described_class.instrumented?(@dummy.singleton_class)).to eq(true)
- expect(@dummy.method(:buzz).source_location.first).to match(/instrumentation\.rb/)
- expect(@dummy.private_methods).to include(:buzz)
- expect(@dummy.private_methods).to include(:wat)
- end
-
- it 'only instruments methods directly defined in the module' do
- mod = Module.new do
- def kittens
- end
- end
-
- @dummy.extend(mod)
-
- described_class.instrument_methods(@dummy)
-
- expect(@dummy).not_to respond_to(:_original_kittens)
- end
-
- it 'can take a block to determine if a method should be instrumented' do
- described_class.instrument_methods(@dummy) do
- false
- end
-
- expect(@dummy).not_to respond_to(:_original_foo)
- end
- end
-
- describe '.instrument_instance_methods' do
- before do
- allow(Gitlab::Metrics).to receive(:enabled?).and_return(true)
- end
-
- it 'instruments all public instance methods' do
- described_class.instrument_instance_methods(@dummy)
-
- expect(described_class.instrumented?(@dummy)).to eq(true)
- expect(@dummy.new.method(:bar).source_location.first).to match(/instrumentation\.rb/)
- expect(@dummy.public_instance_methods).to include(:bar)
- end
-
- it 'instruments all protected instance methods' do
- described_class.instrument_instance_methods(@dummy)
-
- expect(described_class.instrumented?(@dummy)).to eq(true)
- expect(@dummy.new.method(:chaf).source_location.first).to match(/instrumentation\.rb/)
- expect(@dummy.protected_instance_methods).to include(:chaf)
- end
-
- it 'instruments all private instance methods' do
- described_class.instrument_instance_methods(@dummy)
-
- expect(described_class.instrumented?(@dummy)).to eq(true)
- expect(@dummy.new.method(:wadus).source_location.first).to match(/instrumentation\.rb/)
- expect(@dummy.private_instance_methods).to include(:wadus)
- end
-
- it 'only instruments methods directly defined in the module' do
- mod = Module.new do
- def kittens
- end
- end
-
- @dummy.include(mod)
-
- described_class.instrument_instance_methods(@dummy)
-
- expect(@dummy.new.method(:kittens).source_location.first).not_to match(/instrumentation\.rb/)
- end
-
- it 'can take a block to determine if a method should be instrumented' do
- described_class.instrument_instance_methods(@dummy) do
- false
- end
-
- expect(@dummy.new.method(:bar).source_location.first).not_to match(/instrumentation\.rb/)
- end
- end
-end
diff --git a/spec/lib/gitlab/metrics/rails_slis_spec.rb b/spec/lib/gitlab/metrics/rails_slis_spec.rb
new file mode 100644
index 00000000000..16fcb9d46a2
--- /dev/null
+++ b/spec/lib/gitlab/metrics/rails_slis_spec.rb
@@ -0,0 +1,58 @@
+# frozen_string_literal: true
+require 'spec_helper'
+
+RSpec.describe Gitlab::Metrics::RailsSlis do
+ # Limit what routes we'll initialize so we don't have to load the entire thing
+ before do
+ api_route = API::API.routes.find do |route|
+ API::Base.endpoint_id_for_route(route) == "GET /api/:version/version"
+ end
+
+ allow(Gitlab::RequestEndpoints).to receive(:all_api_endpoints).and_return([api_route])
+ allow(Gitlab::RequestEndpoints).to receive(:all_controller_actions).and_return([[ProjectsController, 'show']])
+ end
+
+ describe '.initialize_request_slis_if_needed!' do
+ it "initializes the SLI for all possible endpoints if they weren't" do
+ possible_labels = [
+ {
+ endpoint_id: "GET /api/:version/version",
+ feature_category: :not_owned
+ },
+ {
+ endpoint_id: "ProjectsController#show",
+ feature_category: :projects
+ }
+ ]
+
+ expect(Gitlab::Metrics::Sli).to receive(:initialized?).with(:rails_request_apdex) { false }
+ expect(Gitlab::Metrics::Sli).to receive(:initialize_sli).with(:rails_request_apdex, array_including(*possible_labels)).and_call_original
+
+ described_class.initialize_request_slis_if_needed!
+ end
+
+ it 'does not initialize the SLI if they were initialized already' do
+ expect(Gitlab::Metrics::Sli).to receive(:initialized?).with(:rails_request_apdex) { true }
+ expect(Gitlab::Metrics::Sli).not_to receive(:initialize_sli)
+
+ described_class.initialize_request_slis_if_needed!
+ end
+
+ it 'does not initialize anything if the feature flag is disabled' do
+ stub_feature_flags(request_apdex_counters: false)
+
+ expect(Gitlab::Metrics::Sli).not_to receive(:initialize_sli)
+ expect(Gitlab::Metrics::Sli).not_to receive(:initialized?)
+
+ described_class.initialize_request_slis_if_needed!
+ end
+ end
+
+ describe '.request_apdex' do
+ it 'returns the initialized request apdex SLI object' do
+ described_class.initialize_request_slis_if_needed!
+
+ expect(described_class.request_apdex).to be_initialized
+ end
+ end
+end
diff --git a/spec/lib/gitlab/metrics/requests_rack_middleware_spec.rb b/spec/lib/gitlab/metrics/requests_rack_middleware_spec.rb
index 9d5c4bdf9e2..5870f9a8f68 100644
--- a/spec/lib/gitlab/metrics/requests_rack_middleware_spec.rb
+++ b/spec/lib/gitlab/metrics/requests_rack_middleware_spec.rb
@@ -36,6 +36,7 @@ RSpec.describe Gitlab::Metrics::RequestsRackMiddleware, :aggregate_failures do
it 'tracks request count and duration' do
expect(described_class).to receive_message_chain(:http_requests_total, :increment).with(method: 'get', status: '200', feature_category: 'unknown')
expect(described_class).to receive_message_chain(:http_request_duration_seconds, :observe).with({ method: 'get' }, a_positive_execution_time)
+ expect(Gitlab::Metrics::RailsSlis.request_apdex).to receive(:increment).with(labels: { feature_category: 'unknown', endpoint_id: 'unknown' }, success: true)
subject.call(env)
end
@@ -70,7 +71,7 @@ RSpec.describe Gitlab::Metrics::RequestsRackMiddleware, :aggregate_failures do
expect(described_class).not_to receive(:http_health_requests_total)
expect(described_class)
.to receive_message_chain(:http_request_duration_seconds, :observe)
- .with({ method: 'get' }, a_positive_execution_time)
+ .with({ method: 'get' }, a_positive_execution_time)
subject.call(env)
end
@@ -82,9 +83,10 @@ RSpec.describe Gitlab::Metrics::RequestsRackMiddleware, :aggregate_failures do
context '@app.call returns an error code' do
let(:status) { '500' }
- it 'tracks count but not duration' do
+ it 'tracks count but not duration or apdex' do
expect(described_class).to receive_message_chain(:http_requests_total, :increment).with(method: 'get', status: '500', feature_category: 'unknown')
expect(described_class).not_to receive(:http_request_duration_seconds)
+ expect(Gitlab::Metrics::RailsSlis).not_to receive(:request_apdex)
subject.call(env)
end
@@ -104,20 +106,23 @@ RSpec.describe Gitlab::Metrics::RequestsRackMiddleware, :aggregate_failures do
expect(described_class).to receive_message_chain(:rack_uncaught_errors_count, :increment)
expect(described_class).to receive_message_chain(:http_requests_total, :increment).with(method: 'get', status: 'undefined', feature_category: 'unknown')
expect(described_class.http_request_duration_seconds).not_to receive(:observe)
+ expect(Gitlab::Metrics::RailsSlis).not_to receive(:request_apdex)
expect { subject.call(env) }.to raise_error(StandardError)
end
end
- context 'feature category header' do
- context 'when a feature category context is present' do
+ context 'application context' do
+ context 'when a context is present' do
before do
- ::Gitlab::ApplicationContext.push(feature_category: 'issue_tracking')
+ ::Gitlab::ApplicationContext.push(feature_category: 'issue_tracking', caller_id: 'IssuesController#show')
end
- it 'adds the feature category to the labels for http_requests_total' do
+ it 'adds the feature category to the labels for required metrics' do
expect(described_class).to receive_message_chain(:http_requests_total, :increment).with(method: 'get', status: '200', feature_category: 'issue_tracking')
expect(described_class).not_to receive(:http_health_requests_total)
+ expect(Gitlab::Metrics::RailsSlis.request_apdex)
+ .to receive(:increment).with(labels: { feature_category: 'issue_tracking', endpoint_id: 'IssuesController#show' }, success: true)
subject.call(env)
end
@@ -127,6 +132,7 @@ RSpec.describe Gitlab::Metrics::RequestsRackMiddleware, :aggregate_failures do
expect(described_class).to receive_message_chain(:http_health_requests_total, :increment).with(method: 'get', status: '200')
expect(described_class).not_to receive(:http_requests_total)
+ expect(Gitlab::Metrics::RailsSlis).not_to receive(:request_apdex)
subject.call(env)
end
@@ -140,19 +146,180 @@ RSpec.describe Gitlab::Metrics::RequestsRackMiddleware, :aggregate_failures do
it 'adds the feature category to the labels for http_requests_total' do
expect(described_class).to receive_message_chain(:http_requests_total, :increment).with(method: 'get', status: 'undefined', feature_category: 'issue_tracking')
+ expect(Gitlab::Metrics::RailsSlis).not_to receive(:request_apdex)
expect { subject.call(env) }.to raise_error(StandardError)
end
end
- context 'when the feature category context is not available' do
- it 'sets the feature category to unknown' do
+ context 'when the context is not available' do
+ it 'sets the required labels to unknown' do
expect(described_class).to receive_message_chain(:http_requests_total, :increment).with(method: 'get', status: '200', feature_category: 'unknown')
expect(described_class).not_to receive(:http_health_requests_total)
+ expect(Gitlab::Metrics::RailsSlis.request_apdex).to receive(:increment).with(labels: { feature_category: 'unknown', endpoint_id: 'unknown' }, success: true)
subject.call(env)
end
end
+
+ context 'SLI satisfactory' do
+ where(:request_urgency_name, :duration, :success) do
+ [
+ [:high, 0.1, true],
+ [:high, 0.25, false],
+ [:high, 0.3, false],
+ [:medium, 0.3, true],
+ [:medium, 0.5, false],
+ [:medium, 0.6, false],
+ [:default, 0.6, true],
+ [:default, 1.0, false],
+ [:default, 1.2, false],
+ [:low, 4.5, true],
+ [:low, 5.0, false],
+ [:low, 6, false]
+ ]
+ end
+
+ with_them do
+ context 'Grape API handler having expected duration setup' do
+ let(:api_handler) do
+ request_urgency = request_urgency_name
+ Class.new(::API::Base) do
+ feature_category :hello_world, ['/projects/:id/archive']
+ urgency request_urgency, ['/projects/:id/archive']
+ end
+ end
+
+ let(:endpoint) do
+ route = double(:route, request_method: 'GET', path: '/:version/projects/:id/archive(.:format)')
+ double(:endpoint, route: route,
+ options: { for: api_handler, path: [":id/archive"] },
+ namespace: "/projects")
+ end
+
+ let(:env) { { 'api.endpoint' => endpoint, 'REQUEST_METHOD' => 'GET' } }
+
+ before do
+ ::Gitlab::ApplicationContext.push(feature_category: 'hello_world', caller_id: 'GET /projects/:id/archive')
+ allow(Gitlab::Metrics::System).to receive(:monotonic_time).and_return(100, 100 + duration)
+ end
+
+ it "captures SLI metrics" do
+ expect(Gitlab::Metrics::RailsSlis.request_apdex).to receive(:increment).with(
+ labels: { feature_category: 'hello_world', endpoint_id: 'GET /projects/:id/archive' },
+ success: success
+ )
+ subject.call(env)
+ end
+ end
+
+ context 'Rails controller having expected duration setup' do
+ let(:controller) do
+ request_urgency = request_urgency_name
+ Class.new(ApplicationController) do
+ feature_category :hello_world, [:index, :show]
+ urgency request_urgency, [:index, :show]
+ end
+ end
+
+ let(:env) do
+ controller_instance = controller.new
+ controller_instance.action_name = :index
+ { 'action_controller.instance' => controller_instance, 'REQUEST_METHOD' => 'GET' }
+ end
+
+ before do
+ ::Gitlab::ApplicationContext.push(feature_category: 'hello_world', caller_id: 'AnonymousController#index')
+ allow(Gitlab::Metrics::System).to receive(:monotonic_time).and_return(100, 100 + duration)
+ end
+
+ it "captures SLI metrics" do
+ expect(Gitlab::Metrics::RailsSlis.request_apdex).to receive(:increment).with(
+ labels: { feature_category: 'hello_world', endpoint_id: 'AnonymousController#index' },
+ success: success
+ )
+ subject.call(env)
+ end
+ end
+ end
+
+ context 'Grape API without expected duration' do
+ let(:endpoint) do
+ route = double(:route, request_method: 'GET', path: '/:version/projects/:id/archive(.:format)')
+ double(:endpoint, route: route,
+ options: { for: api_handler, path: [":id/archive"] },
+ namespace: "/projects")
+ end
+
+ let(:env) { { 'api.endpoint' => endpoint, 'REQUEST_METHOD' => 'GET' } }
+
+ let(:api_handler) { Class.new(::API::Base) }
+
+ it "falls back request's expectation to medium (1 second)" do
+ allow(Gitlab::Metrics::System).to receive(:monotonic_time).and_return(100, 100.9)
+ expect(Gitlab::Metrics::RailsSlis.request_apdex).to receive(:increment).with(
+ labels: { feature_category: 'unknown', endpoint_id: 'unknown' },
+ success: true
+ )
+ subject.call(env)
+
+ allow(Gitlab::Metrics::System).to receive(:monotonic_time).and_return(100, 101)
+ expect(Gitlab::Metrics::RailsSlis.request_apdex).to receive(:increment).with(
+ labels: { feature_category: 'unknown', endpoint_id: 'unknown' },
+ success: false
+ )
+ subject.call(env)
+ end
+ end
+
+ context 'Rails controller without expected duration' do
+ let(:controller) { Class.new(ApplicationController) }
+
+ let(:env) do
+ controller_instance = controller.new
+ controller_instance.action_name = :index
+ { 'action_controller.instance' => controller_instance, 'REQUEST_METHOD' => 'GET' }
+ end
+
+ it "falls back request's expectation to medium (1 second)" do
+ allow(Gitlab::Metrics::System).to receive(:monotonic_time).and_return(100, 100.9)
+ expect(Gitlab::Metrics::RailsSlis.request_apdex).to receive(:increment).with(
+ labels: { feature_category: 'unknown', endpoint_id: 'unknown' },
+ success: true
+ )
+ subject.call(env)
+
+ allow(Gitlab::Metrics::System).to receive(:monotonic_time).and_return(100, 101)
+ expect(Gitlab::Metrics::RailsSlis.request_apdex).to receive(:increment).with(
+ labels: { feature_category: 'unknown', endpoint_id: 'unknown' },
+ success: false
+ )
+ subject.call(env)
+ end
+ end
+
+ context 'An unknown request' do
+ let(:env) do
+ { 'REQUEST_METHOD' => 'GET' }
+ end
+
+ it "falls back request's expectation to medium (1 second)" do
+ allow(Gitlab::Metrics::System).to receive(:monotonic_time).and_return(100, 100.9)
+ expect(Gitlab::Metrics::RailsSlis.request_apdex).to receive(:increment).with(
+ labels: { feature_category: 'unknown', endpoint_id: 'unknown' },
+ success: true
+ )
+ subject.call(env)
+
+ allow(Gitlab::Metrics::System).to receive(:monotonic_time).and_return(100, 101)
+ expect(Gitlab::Metrics::RailsSlis.request_apdex).to receive(:increment).with(
+ labels: { feature_category: 'unknown', endpoint_id: 'unknown' },
+ success: false
+ )
+ subject.call(env)
+ end
+ end
+ end
end
describe '.initialize_metrics', :prometheus do
@@ -181,8 +348,8 @@ RSpec.describe Gitlab::Metrics::RequestsRackMiddleware, :aggregate_failures do
end
it 'has every label in config/feature_categories.yml' do
- defaults = [described_class::FEATURE_CATEGORY_DEFAULT, 'not_owned']
- feature_categories = YAML.load_file(Rails.root.join('config', 'feature_categories.yml')).map(&:strip) + defaults
+ defaults = [::Gitlab::FeatureCategories::FEATURE_CATEGORY_DEFAULT, 'not_owned']
+ feature_categories = Gitlab::FeatureCategories.default.categories + defaults
expect(described_class::FEATURE_CATEGORIES_TO_INITIALIZE).to all(be_in(feature_categories))
end
diff --git a/spec/lib/gitlab/metrics/sli_spec.rb b/spec/lib/gitlab/metrics/sli_spec.rb
new file mode 100644
index 00000000000..8ba4bf29568
--- /dev/null
+++ b/spec/lib/gitlab/metrics/sli_spec.rb
@@ -0,0 +1,99 @@
+# frozen_string_literal: true
+
+require 'fast_spec_helper'
+
+RSpec.describe Gitlab::Metrics::Sli do
+ let(:prometheus) { double("prometheus") }
+
+ before do
+ stub_const("Gitlab::Metrics", prometheus)
+ end
+
+ describe 'Class methods' do
+ before do
+ described_class.instance_variable_set(:@known_slis, nil)
+ end
+
+ describe '.[]' do
+ it 'warns about an uninitialized SLI but returns and stores a new one' do
+ sli = described_class[:bar]
+
+ expect(described_class[:bar]).to be(sli)
+ end
+
+ it 'returns the same object for multiple accesses' do
+ sli = described_class.initialize_sli(:huzzah, [])
+
+ 2.times do
+ expect(described_class[:huzzah]).to be(sli)
+ end
+ end
+ end
+
+ describe '.initialized?' do
+ before do
+ fake_total_counter(:boom)
+ fake_success_counter(:boom)
+ end
+
+ it 'is true when an SLI was initialized with labels' do
+ expect { described_class.initialize_sli(:boom, [{ hello: :world }]) }
+ .to change { described_class.initialized?(:boom) }.from(false).to(true)
+ end
+
+ it 'is false when an SLI was not initialized with labels' do
+ expect { described_class.initialize_sli(:boom, []) }
+ .not_to change { described_class.initialized?(:boom) }.from(false)
+ end
+ end
+ end
+
+ describe '#initialize_counters' do
+ it 'initializes counters for the passed label combinations' do
+ counters = [fake_total_counter(:hey), fake_success_counter(:hey)]
+
+ described_class.new(:hey).initialize_counters([{ foo: 'bar' }, { foo: 'baz' }])
+
+ expect(counters).to all(have_received(:get).with({ foo: 'bar' }))
+ expect(counters).to all(have_received(:get).with({ foo: 'baz' }))
+ end
+ end
+
+ describe "#increment" do
+ let!(:sli) { described_class.new(:heyo) }
+ let!(:total_counter) { fake_total_counter(:heyo) }
+ let!(:success_counter) { fake_success_counter(:heyo) }
+
+ it 'increments both counters for labels successes' do
+ sli.increment(labels: { hello: "world" }, success: true)
+
+ expect(total_counter).to have_received(:increment).with({ hello: 'world' })
+ expect(success_counter).to have_received(:increment).with({ hello: 'world' })
+ end
+
+ it 'only increments the total counters for labels when not successful' do
+ sli.increment(labels: { hello: "world" }, success: false)
+
+ expect(total_counter).to have_received(:increment).with({ hello: 'world' })
+ expect(success_counter).not_to have_received(:increment).with({ hello: 'world' })
+ end
+ end
+
+ def fake_prometheus_counter(name)
+ fake_counter = double("prometheus counter: #{name}")
+
+ allow(fake_counter).to receive(:get)
+ allow(fake_counter).to receive(:increment)
+ allow(prometheus).to receive(:counter).with(name.to_sym, anything).and_return(fake_counter)
+
+ fake_counter
+ end
+
+ def fake_total_counter(name)
+ fake_prometheus_counter("gitlab_sli:#{name}:total")
+ end
+
+ def fake_success_counter(name)
+ fake_prometheus_counter("gitlab_sli:#{name}:success_total")
+ end
+end
diff --git a/spec/lib/gitlab/metrics/subscribers/active_record_spec.rb b/spec/lib/gitlab/metrics/subscribers/active_record_spec.rb
index 3ffbcbea03c..a8e4f039da4 100644
--- a/spec/lib/gitlab/metrics/subscribers/active_record_spec.rb
+++ b/spec/lib/gitlab/metrics/subscribers/active_record_spec.rb
@@ -7,7 +7,7 @@ RSpec.describe Gitlab::Metrics::Subscribers::ActiveRecord do
let(:env) { {} }
let(:subscriber) { described_class.new }
- let(:connection) { ActiveRecord::Base.connection }
+ let(:connection) { ActiveRecord::Base.retrieve_connection }
let(:db_config_name) { ::Gitlab::Database.db_config_name(connection) }
describe '#transaction' do
@@ -135,7 +135,7 @@ RSpec.describe Gitlab::Metrics::Subscribers::ActiveRecord do
end
it_behaves_like 'record ActiveRecord metrics'
- it_behaves_like 'store ActiveRecord info in RequestStore'
+ it_behaves_like 'store ActiveRecord info in RequestStore', :primary
end
end
@@ -195,10 +195,6 @@ RSpec.describe Gitlab::Metrics::Subscribers::ActiveRecord do
with_them do
let(:payload) { { name: name, sql: sql(sql_query, comments: comments), connection: connection } }
- before do
- allow(Gitlab::Database::LoadBalancing).to receive(:enable?).and_return(true)
- end
-
context 'query using a connection to a replica' do
before do
allow(Gitlab::Database::LoadBalancing).to receive(:db_role_for_connection).and_return(:replica)
diff --git a/spec/lib/gitlab/metrics/subscribers/load_balancing_spec.rb b/spec/lib/gitlab/metrics/subscribers/load_balancing_spec.rb
index 21a6573c6fd..bc6effd0438 100644
--- a/spec/lib/gitlab/metrics/subscribers/load_balancing_spec.rb
+++ b/spec/lib/gitlab/metrics/subscribers/load_balancing_spec.rb
@@ -5,10 +5,6 @@ require 'spec_helper'
RSpec.describe Gitlab::Metrics::Subscribers::LoadBalancing, :request_store do
let(:subscriber) { described_class.new }
- before do
- allow(Gitlab::Database::LoadBalancing).to receive(:enable?).and_return(true)
- end
-
describe '#caught_up_replica_pick' do
shared_examples 'having payload result value' do |result, counter_name|
subject { subscriber.caught_up_replica_pick(event) }
diff --git a/spec/lib/gitlab/metrics/web_transaction_spec.rb b/spec/lib/gitlab/metrics/web_transaction_spec.rb
index 5261d04c879..9e22dccb2a2 100644
--- a/spec/lib/gitlab/metrics/web_transaction_spec.rb
+++ b/spec/lib/gitlab/metrics/web_transaction_spec.rb
@@ -32,7 +32,7 @@ RSpec.describe Gitlab::Metrics::WebTransaction do
it 'measures with correct labels and value' do
value = 1
- expect(prometheus_metric).to receive(metric_method).with({ controller: 'TestController', action: 'show', feature_category: '' }, value)
+ expect(prometheus_metric).to receive(metric_method).with({ controller: 'TestController', action: 'show', feature_category: ::Gitlab::FeatureCategories::FEATURE_CATEGORY_DEFAULT }, value)
transaction.send(metric_method, :bau, value)
end
@@ -105,6 +105,9 @@ RSpec.describe Gitlab::Metrics::WebTransaction do
namespace: "/projects")
env['api.endpoint'] = endpoint
+
+ # This is needed since we're not actually making a request, which would trigger the controller pushing to the context
+ ::Gitlab::ApplicationContext.push(feature_category: 'projects')
end
it 'provides labels with the method and path of the route in the grape endpoint' do
@@ -129,7 +132,7 @@ RSpec.describe Gitlab::Metrics::WebTransaction do
include_context 'ActionController request'
it 'tags a transaction with the name and action of a controller' do
- expect(transaction.labels).to eq({ controller: 'TestController', action: 'show', feature_category: '' })
+ expect(transaction.labels).to eq({ controller: 'TestController', action: 'show', feature_category: ::Gitlab::FeatureCategories::FEATURE_CATEGORY_DEFAULT })
end
it 'contains only the labels defined for transactions' do
@@ -140,7 +143,7 @@ RSpec.describe Gitlab::Metrics::WebTransaction do
let(:request) { double(:request, format: double(:format, ref: :json)) }
it 'appends the mime type to the transaction action' do
- expect(transaction.labels).to eq({ controller: 'TestController', action: 'show.json', feature_category: '' })
+ expect(transaction.labels).to eq({ controller: 'TestController', action: 'show.json', feature_category: ::Gitlab::FeatureCategories::FEATURE_CATEGORY_DEFAULT })
end
end
@@ -148,13 +151,15 @@ RSpec.describe Gitlab::Metrics::WebTransaction do
let(:request) { double(:request, format: double(:format, ref: 'http://example.com')) }
it 'does not append the MIME type to the transaction action' do
- expect(transaction.labels).to eq({ controller: 'TestController', action: 'show', feature_category: '' })
+ expect(transaction.labels).to eq({ controller: 'TestController', action: 'show', feature_category: ::Gitlab::FeatureCategories::FEATURE_CATEGORY_DEFAULT })
end
end
context 'when the feature category is known' do
it 'includes it in the feature category label' do
- expect(controller_class).to receive(:feature_category_for_action).with('show').and_return(:source_code_management)
+ # This is needed since we're not actually making a request, which would trigger the controller pushing to the context
+ ::Gitlab::ApplicationContext.push(feature_category: 'source_code_management')
+
expect(transaction.labels).to eq({ controller: 'TestController', action: 'show', feature_category: "source_code_management" })
end
end
diff --git a/spec/lib/gitlab/middleware/go_spec.rb b/spec/lib/gitlab/middleware/go_spec.rb
index 7bac041cd65..0ce95fdb5af 100644
--- a/spec/lib/gitlab/middleware/go_spec.rb
+++ b/spec/lib/gitlab/middleware/go_spec.rb
@@ -98,7 +98,7 @@ RSpec.describe Gitlab::Middleware::Go do
end
end
- context 'without access to the project' do
+ context 'without access to the project', :sidekiq_inline do
before do
project.team.find_member(current_user).destroy
end
diff --git a/spec/lib/gitlab/middleware/multipart/handler_spec.rb b/spec/lib/gitlab/middleware/multipart/handler_spec.rb
index aac3f00defe..53b59b042e2 100644
--- a/spec/lib/gitlab/middleware/multipart/handler_spec.rb
+++ b/spec/lib/gitlab/middleware/multipart/handler_spec.rb
@@ -16,6 +16,7 @@ RSpec.describe Gitlab::Middleware::Multipart::Handler do
::Gitlab.config.uploads.storage_path,
::JobArtifactUploader.workhorse_upload_path,
::LfsObjectUploader.workhorse_upload_path,
+ ::DependencyProxy::FileUploader.workhorse_upload_path,
File.join(Rails.root, 'public/uploads/tmp')
]
end
diff --git a/spec/lib/gitlab/middleware/speedscope_spec.rb b/spec/lib/gitlab/middleware/speedscope_spec.rb
index bb830a2fbda..c1d452f69f8 100644
--- a/spec/lib/gitlab/middleware/speedscope_spec.rb
+++ b/spec/lib/gitlab/middleware/speedscope_spec.rb
@@ -46,7 +46,7 @@ RSpec.describe Gitlab::Middleware::Speedscope do
allow(env).to receive(:[]).with('warden').and_return(double('Warden', user: create(:admin)))
end
- it 'runs StackProf and returns a flamegraph' do
+ it 'returns a flamegraph' do
expect(StackProf).to receive(:run).and_call_original
status, headers, body = middleware.call(env)
@@ -55,6 +55,56 @@ RSpec.describe Gitlab::Middleware::Speedscope do
expect(headers).to eq({ 'Content-Type' => 'text/html' })
expect(body.first).to include('speedscope-iframe')
end
+
+ context 'when the stackprof_mode parameter is set and valid' do
+ let(:env) { Rack::MockRequest.env_for('/', params: { 'performance_bar' => 'flamegraph', 'stackprof_mode' => 'cpu' }) }
+
+ it 'runs StackProf in the mode specified in the stackprof_mode parameter' do
+ expect(StackProf).to receive(:run).with(hash_including(mode: :cpu))
+
+ middleware.call(env)
+ end
+ end
+
+ context 'when the stackprof_mode parameter is not set' do
+ let(:env) { Rack::MockRequest.env_for('/', params: { 'performance_bar' => 'flamegraph' }) }
+
+ it 'runs StackProf in wall mode' do
+ expect(StackProf).to receive(:run).with(hash_including(mode: :wall))
+
+ middleware.call(env)
+ end
+ end
+
+ context 'when the stackprof_mode parameter is invalid' do
+ let(:env) { Rack::MockRequest.env_for('/', params: { 'performance_bar' => 'flamegraph', 'stackprof_mode' => 'invalid' }) }
+
+ it 'runs StackProf in wall mode' do
+ expect(StackProf).to receive(:run).with(hash_including(mode: :wall))
+
+ middleware.call(env)
+ end
+ end
+
+ context 'when the stackprof_mode parameter is set to object mode' do
+ let(:env) { Rack::MockRequest.env_for('/', params: { 'performance_bar' => 'flamegraph', 'stackprof_mode' => 'object' }) }
+
+ it 'runs StackProf with an interval of 100' do
+ expect(StackProf).to receive(:run).with(hash_including(interval: 100))
+
+ middleware.call(env)
+ end
+ end
+
+ context 'when the stackprof_mode parameter is not set to object mode' do
+ let(:env) { Rack::MockRequest.env_for('/', params: { 'performance_bar' => 'flamegraph', 'stackprof_mode' => 'wall' }) }
+
+ it 'runs StackProf with an interval of 10_100' do
+ expect(StackProf).to receive(:run).with(hash_including(interval: 10_100))
+
+ middleware.call(env)
+ end
+ end
end
end
end
diff --git a/spec/lib/gitlab/pagination/keyset/in_operator_optimization/query_builder_spec.rb b/spec/lib/gitlab/pagination/keyset/in_operator_optimization/query_builder_spec.rb
index 4ce51e37685..00beacd4b35 100644
--- a/spec/lib/gitlab/pagination/keyset/in_operator_optimization/query_builder_spec.rb
+++ b/spec/lib/gitlab/pagination/keyset/in_operator_optimization/query_builder_spec.rb
@@ -41,14 +41,40 @@ RSpec.describe Gitlab::Pagination::Keyset::InOperatorOptimization::QueryBuilder
)
end
- it 'returns records in correct order' do
+ let(:all_records) do
all_records = []
iterator.each_batch(of: batch_size) do |records|
all_records.concat(records)
end
+ all_records
+ end
+ it 'returns records in correct order' do
expect(all_records).to eq(expected_order)
end
+
+ context 'when not passing the finder query' do
+ before do
+ in_operator_optimization_options.delete(:finder_query)
+ end
+
+ it 'returns records in correct order' do
+ expect(all_records).to eq(expected_order)
+ end
+
+ it 'loads only the order by column' do
+ order_by_attribute_names = iterator
+ .send(:order)
+ .column_definitions
+ .map(&:attribute_name)
+ .map(&:to_s)
+
+ record = all_records.first
+ loaded_attributes = record.attributes.keys - ['time_estimate'] # time_estimate is always present (has default value)
+
+ expect(loaded_attributes).to eq(order_by_attribute_names)
+ end
+ end
end
context 'when ordering by issues.id DESC' do
diff --git a/spec/lib/gitlab/pagination/keyset/in_operator_optimization/strategies/order_values_loader_strategy_spec.rb b/spec/lib/gitlab/pagination/keyset/in_operator_optimization/strategies/order_values_loader_strategy_spec.rb
new file mode 100644
index 00000000000..fe95d5406dd
--- /dev/null
+++ b/spec/lib/gitlab/pagination/keyset/in_operator_optimization/strategies/order_values_loader_strategy_spec.rb
@@ -0,0 +1,34 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::Pagination::Keyset::InOperatorOptimization::Strategies::OrderValuesLoaderStrategy do
+ let(:model) { Project }
+
+ let(:keyset_scope) do
+ scope, _ = Gitlab::Pagination::Keyset::SimpleOrderBuilder.build(
+ Project.order(:created_at, :id)
+ )
+
+ scope
+ end
+
+ let(:keyset_order) do
+ Gitlab::Pagination::Keyset::Order.extract_keyset_order_object(keyset_scope)
+ end
+
+ let(:order_by_columns) do
+ Gitlab::Pagination::Keyset::InOperatorOptimization::OrderByColumns.new(keyset_order.column_definitions, model.arel_table)
+ end
+
+ subject(:strategy) { described_class.new(model, order_by_columns) }
+
+ describe '#initializer_columns' do
+ it 'returns NULLs for each ORDER BY columns' do
+ expect(strategy.initializer_columns).to eq([
+ 'NULL::timestamp without time zone AS created_at',
+ 'NULL::integer AS id'
+ ])
+ end
+ end
+end
diff --git a/spec/lib/gitlab/pagination/keyset/in_operator_optimization/strategies/record_loader_strategy_spec.rb b/spec/lib/gitlab/pagination/keyset/in_operator_optimization/strategies/record_loader_strategy_spec.rb
new file mode 100644
index 00000000000..5180403b493
--- /dev/null
+++ b/spec/lib/gitlab/pagination/keyset/in_operator_optimization/strategies/record_loader_strategy_spec.rb
@@ -0,0 +1,60 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::Pagination::Keyset::InOperatorOptimization::Strategies::RecordLoaderStrategy do
+ let(:finder_query) { -> (created_at_value, id_value) { Project.where(Project.arel_table[:id].eq(id_value)) } }
+ let(:model) { Project }
+
+ let(:keyset_scope) do
+ scope, _ = Gitlab::Pagination::Keyset::SimpleOrderBuilder.build(
+ Project.order(:created_at, :id)
+ )
+
+ scope
+ end
+
+ let(:keyset_order) do
+ Gitlab::Pagination::Keyset::Order.extract_keyset_order_object(keyset_scope)
+ end
+
+ let(:order_by_columns) do
+ Gitlab::Pagination::Keyset::InOperatorOptimization::OrderByColumns.new(keyset_order.column_definitions, model.arel_table)
+ end
+
+ subject(:strategy) { described_class.new(finder_query, model, order_by_columns) }
+
+ describe '#initializer_columns' do
+ # Explanation:
+ # > SELECT NULL::projects AS records
+ #
+ # The query returns one row and one column. The column may contain a full project row.
+ # In this particular case the row is NULL.
+ it 'returns a NULL table row as the result column' do
+ expect(strategy.initializer_columns).to eq(["NULL::projects AS records"])
+ end
+ end
+
+ describe '#columns' do
+ # Explanation:
+ # > SELECT (SELECT projects FROM projects limit 1)
+ #
+ # Selects one row from the database and collapses it into one column.
+ #
+ # Side note: Due to the type casts, columns and initializer_columns can be also UNION-ed:
+ # SELECT * FROM (
+ # (
+ # SELECT NULL::projects AS records
+ # UNION
+ # SELECT (SELECT projects FROM projects limit 1)
+ # )
+ # ) as records
+ it 'uses the finder query to load the row in the result column' do
+ expected_loader_query = <<~SQL
+ (SELECT projects FROM "projects" WHERE "projects"."id" = recursive_keyset_cte.projects_id_array[position] LIMIT 1)
+ SQL
+
+ expect(strategy.columns).to eq([expected_loader_query.chomp])
+ end
+ end
+end
diff --git a/spec/lib/gitlab/pagination/keyset/iterator_spec.rb b/spec/lib/gitlab/pagination/keyset/iterator_spec.rb
index d8e79287745..09cbca2c1cb 100644
--- a/spec/lib/gitlab/pagination/keyset/iterator_spec.rb
+++ b/spec/lib/gitlab/pagination/keyset/iterator_spec.rb
@@ -32,8 +32,11 @@ RSpec.describe Gitlab::Pagination::Keyset::Iterator do
])
end
+ let(:iterator_params) { nil }
let(:scope) { project.issues.reorder(custom_reorder) }
+ subject(:iterator) { described_class.new(**iterator_params) }
+
shared_examples 'iterator examples' do
describe '.each_batch' do
it 'yields an ActiveRecord::Relation when a block is given' do
@@ -56,6 +59,29 @@ RSpec.describe Gitlab::Pagination::Keyset::Iterator do
expect(count).to eq(9)
end
+ it 'continues after the cursor' do
+ loaded_records = []
+ cursor = nil
+
+ # stopping the iterator after the first batch and storing the cursor
+ iterator.each_batch(of: 2) do |relation| # rubocop: disable Lint/UnreachableLoop
+ loaded_records.concat(relation.to_a)
+ record = loaded_records.last
+
+ cursor = custom_reorder.cursor_attributes_for_node(record)
+ break
+ end
+
+ expect(loaded_records).to eq(project.issues.order(custom_reorder).take(2))
+
+ new_iterator = described_class.new(**iterator_params.merge(cursor: cursor))
+ new_iterator.each_batch(of: 2) do |relation|
+ loaded_records.concat(relation.to_a)
+ end
+
+ expect(loaded_records).to eq(project.issues.order(custom_reorder))
+ end
+
it 'allows updating of the yielded relations' do
time = Time.current
@@ -73,7 +99,7 @@ RSpec.describe Gitlab::Pagination::Keyset::Iterator do
iterator.each_batch(of: 2) { |rel| positions.concat(rel.pluck(:relative_position, :id)) }
- expect(positions).to eq(project.issues.order_relative_position_asc.order(id: :asc).pluck(:relative_position, :id))
+ expect(positions).to eq(project.issues.reorder(::Gitlab::Database.nulls_last_order('relative_position', 'ASC')).order(id: :asc).pluck(:relative_position, :id))
end
end
@@ -85,7 +111,7 @@ RSpec.describe Gitlab::Pagination::Keyset::Iterator do
iterator.each_batch(of: 2) { |rel| positions.concat(rel.pluck(:relative_position, :id)) }
- expect(positions).to eq(project.issues.order_relative_position_desc.order(id: :desc).pluck(:relative_position, :id))
+ expect(positions).to eq(project.issues.reorder(::Gitlab::Database.nulls_first_order('relative_position', 'DESC')).order(id: :desc).pluck(:relative_position, :id))
end
end
@@ -131,13 +157,13 @@ RSpec.describe Gitlab::Pagination::Keyset::Iterator do
end
context 'when use_union_optimization is used' do
- subject(:iterator) { described_class.new(scope: scope, use_union_optimization: true) }
+ let(:iterator_params) { { scope: scope, use_union_optimization: true } }
include_examples 'iterator examples'
end
context 'when use_union_optimization is not used' do
- subject(:iterator) { described_class.new(scope: scope, use_union_optimization: false) }
+ let(:iterator_params) { { scope: scope, use_union_optimization: false } }
include_examples 'iterator examples'
end
diff --git a/spec/lib/gitlab/path_regex_spec.rb b/spec/lib/gitlab/path_regex_spec.rb
index aa13660deb4..2f38ed58727 100644
--- a/spec/lib/gitlab/path_regex_spec.rb
+++ b/spec/lib/gitlab/path_regex_spec.rb
@@ -561,4 +561,25 @@ RSpec.describe Gitlab::PathRegex do
expect(subject.match('sha256:asdf1234%2f')[0]).to eq('sha256:asdf1234')
end
end
+
+ describe '.dependency_proxy_route_regex' do
+ subject { described_class.dependency_proxy_route_regex }
+
+ it { is_expected.to match('/v2/group1/dependency_proxy/containers/alpine/manifests/latest') }
+ it { is_expected.to match('/v2/group1/dependency_proxy/containers/alpine/blobs/sha256:14119a10abf4669e8cdbdff324a9f9605d99697215a0d21c360fe8dfa8471bab') }
+
+ it { is_expected.not_to match('') }
+ it { is_expected.not_to match('/v3/group1/dependency_proxy/containers/alpine/manifests/latest') }
+ it { is_expected.not_to match('/v2/group1/dependency_proxy/container/alpine/manifests/latest') }
+ it { is_expected.not_to match('/v2/group1/dependency_prox/containers/alpine/manifests/latest') }
+ it { is_expected.not_to match('/v2/group1/dependency_proxy/containers/alpine/manifest/latest') }
+ it { is_expected.not_to match('/v2/group1/dependency_proxy/containers/alpine/manifest/la%2Ftest') }
+ it { is_expected.not_to match('/v2/group1/dependency_proxy/containers/alpine/manifest/latest/../one') }
+ it { is_expected.not_to match('/v3/group1/dependency_proxy/containers/alpine/blobs/sha256:14119a10abf4669e8cdbdff324a9f9605d99697215a0d21c360fe8dfa8471bab') }
+ it { is_expected.not_to match('/v2/group1/dependency_proxy/container/alpine/blobs/sha256:14119a10abf4669e8cdbdff324a9f9605d99697215a0d21c360fe8dfa8471bab') }
+ it { is_expected.not_to match('/v2/group1/dependency_prox/containers/alpine/blobs/sha256:14119a10abf4669e8cdbdff324a9f9605d99697215a0d21c360fe8dfa8471bab') }
+ it { is_expected.not_to match('/v2/group1/dependency_proxy/containers/alpine/blob/sha256:14119a10abf4669e8cdbdff324a9f9605d99697215a0d21c360fe8dfa8471bab') }
+ it { is_expected.not_to match('/v2/group1/dependency_proxy/containers/alpine/blob/sha256:F14119a10abf4669e8cdbdff324a9f9605d99697215a0d21c360fe8dfa8471bab/../latest') }
+ it { is_expected.not_to match('/v2/group1/dependency_proxy/containers/alpine/blob/sha256:F14119a10abf4669e8cdbdff324a9f9605d99697215a0d21c360fe8dfa8471bab/latest') }
+ end
end
diff --git a/spec/lib/gitlab/performance_bar/stats_spec.rb b/spec/lib/gitlab/performance_bar/stats_spec.rb
index ad11eca56d1..b4f90745ee7 100644
--- a/spec/lib/gitlab/performance_bar/stats_spec.rb
+++ b/spec/lib/gitlab/performance_bar/stats_spec.rb
@@ -23,11 +23,23 @@ RSpec.describe Gitlab::PerformanceBar::Stats do
expect(logger).to receive(:info)
.with({ duration_ms: 1.096, filename: 'lib/gitlab/pagination/offset_pagination.rb',
method_path: 'lib/gitlab/pagination/offset_pagination.rb:add_pagination_headers',
- count: 1, request_id: 'foo', type: :sql })
+ count: 1, request_id: 'foo', query_type: 'active-record' })
expect(logger).to receive(:info)
.with({ duration_ms: 1.634, filename: 'lib/api/helpers.rb',
method_path: 'lib/api/helpers.rb:find_project',
- count: 2, request_id: 'foo', type: :sql })
+ count: 2, request_id: 'foo', query_type: 'active-record' })
+ expect(logger).to receive(:info)
+ .with({ duration_ms: 23.709, filename: 'lib/gitlab/gitaly_client/commit_service.rb',
+ method_path: 'lib/gitlab/gitaly_client/commit_service.rb:each',
+ count: 1, request_id: 'foo', query_type: 'gitaly' })
+ expect(logger).to receive(:info)
+ .with({ duration_ms: 6.678, filename: 'lib/gitlab/gitaly_client/commit_service.rb',
+ method_path: 'lib/gitlab/gitaly_client/commit_service.rb:call_find_commit',
+ count: 1, request_id: 'foo', query_type: 'gitaly' })
+ expect(logger).to receive(:info)
+ .with({ duration_ms: 0.155, filename: 'lib/feature.rb',
+ method_path: 'lib/feature.rb:enabled?',
+ count: 1, request_id: 'foo', query_type: 'redis' })
subject
end
diff --git a/spec/lib/gitlab/project_authorizations_spec.rb b/spec/lib/gitlab/project_authorizations_spec.rb
index d2b41ee31d9..16066934194 100644
--- a/spec/lib/gitlab/project_authorizations_spec.rb
+++ b/spec/lib/gitlab/project_authorizations_spec.rb
@@ -204,6 +204,43 @@ RSpec.describe Gitlab::ProjectAuthorizations do
end
end
+ context 'with shared projects' do
+ let_it_be(:shared_with_group) { create(:group) }
+ let_it_be(:user) { create(:user) }
+ let_it_be(:project) { create(:project, group: create(:group)) }
+
+ let(:mapping) { map_access_levels(authorizations) }
+
+ before do
+ create(:project_group_link, :developer, project: project, group: shared_with_group)
+ shared_with_group.add_maintainer(user)
+ end
+
+ it 'creates proper authorizations' do
+ expect(mapping[project.id]).to eq(Gitlab::Access::DEVELOPER)
+ end
+
+ context 'even when the `lock_memberships_to_ldap` setting has been turned ON' do
+ before do
+ stub_application_setting(lock_memberships_to_ldap: true)
+ end
+
+ it 'creates proper authorizations' do
+ expect(mapping[project.id]).to eq(Gitlab::Access::DEVELOPER)
+ end
+ end
+
+ context 'when the group containing the project has forbidden group shares for any of its projects' do
+ before do
+ project.namespace.update!(share_with_group_lock: true)
+ end
+
+ it 'does not create authorizations' do
+ expect(mapping[project.id]).to be_nil
+ end
+ end
+ end
+
context 'with shared groups' do
let(:parent_group_user) { create(:user) }
let(:group_user) { create(:user) }
diff --git a/spec/lib/gitlab/rack_attack/request_spec.rb b/spec/lib/gitlab/rack_attack/request_spec.rb
index 3be7ec17e45..ecdcc23e588 100644
--- a/spec/lib/gitlab/rack_attack/request_spec.rb
+++ b/spec/lib/gitlab/rack_attack/request_spec.rb
@@ -3,6 +3,8 @@
require 'spec_helper'
RSpec.describe Gitlab::RackAttack::Request do
+ using RSpec::Parameterized::TableSyntax
+
describe 'FILES_PATH_REGEX' do
subject { described_class::FILES_PATH_REGEX }
@@ -13,4 +15,33 @@ RSpec.describe Gitlab::RackAttack::Request do
it { is_expected.to match('/api/v4/projects/some%2Fnested%2Frepo/repository/files/README') }
it { is_expected.not_to match('/api/v4/projects/some/nested/repo/repository/files/README') }
end
+
+ describe '#deprecated_api_request?' do
+ let(:env) { { 'REQUEST_METHOD' => 'GET', 'rack.input' => StringIO.new, 'PATH_INFO' => path, 'QUERY_STRING' => query } }
+ let(:request) { ::Rack::Attack::Request.new(env) }
+
+ subject { !!request.__send__(:deprecated_api_request?) }
+
+ where(:path, :query, :expected) do
+ '/' | '' | false
+
+ '/api/v4/groups/1/' | '' | true
+ '/api/v4/groups/1' | '' | true
+ '/api/v4/groups/foo/' | '' | true
+ '/api/v4/groups/foo' | '' | true
+
+ '/api/v4/groups/1' | 'with_projects=' | true
+ '/api/v4/groups/1' | 'with_projects=1' | true
+ '/api/v4/groups/1' | 'with_projects=0' | false
+
+ '/foo/api/v4/groups/1' | '' | false
+ '/api/v4/groups/1/foo' | '' | false
+
+ '/api/v4/groups/nested%2Fgroup' | '' | true
+ end
+
+ with_them do
+ it { is_expected.to eq(expected) }
+ end
+ end
end
diff --git a/spec/lib/gitlab/rate_limit_helpers_spec.rb b/spec/lib/gitlab/rate_limit_helpers_spec.rb
index d583c8e58fb..ad0e2de1448 100644
--- a/spec/lib/gitlab/rate_limit_helpers_spec.rb
+++ b/spec/lib/gitlab/rate_limit_helpers_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Gitlab::RateLimitHelpers, :clean_gitlab_redis_cache do
+RSpec.describe Gitlab::RateLimitHelpers, :clean_gitlab_redis_rate_limiting do
let(:limiter_class) do
Class.new do
include ::Gitlab::RateLimitHelpers
diff --git a/spec/lib/gitlab/redis/queues_spec.rb b/spec/lib/gitlab/redis/queues_spec.rb
index 2e396cde3bf..a0f73a654e7 100644
--- a/spec/lib/gitlab/redis/queues_spec.rb
+++ b/spec/lib/gitlab/redis/queues_spec.rb
@@ -9,10 +9,24 @@ RSpec.describe Gitlab::Redis::Queues do
include_examples "redis_shared_examples"
describe '#raw_config_hash' do
- it 'has a legacy default URL' do
- expect(subject).to receive(:fetch_config) { false }
+ before do
+ expect(subject).to receive(:fetch_config) { config }
+ end
+
+ context 'when the config url is blank' do
+ let(:config) { nil }
+
+ it 'has a legacy default URL' do
+ expect(subject.send(:raw_config_hash)).to eq(url: 'redis://localhost:6381' )
+ end
+ end
+
+ context 'when the config url is present' do
+ let(:config) { { url: 'redis://localhost:1111' } }
- expect(subject.send(:raw_config_hash)).to eq(url: 'redis://localhost:6381' )
+ it 'sets the configured url' do
+ expect(subject.send(:raw_config_hash)).to eq(url: 'redis://localhost:1111' )
+ end
end
end
end
diff --git a/spec/lib/gitlab/redis/rate_limiting_spec.rb b/spec/lib/gitlab/redis/rate_limiting_spec.rb
new file mode 100644
index 00000000000..e79c070df93
--- /dev/null
+++ b/spec/lib/gitlab/redis/rate_limiting_spec.rb
@@ -0,0 +1,7 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::Redis::RateLimiting do
+ include_examples "redis_new_instance_shared_examples", 'rate_limiting', Gitlab::Redis::Cache
+end
diff --git a/spec/lib/gitlab/redis/sessions_spec.rb b/spec/lib/gitlab/redis/sessions_spec.rb
new file mode 100644
index 00000000000..7e239c08e9f
--- /dev/null
+++ b/spec/lib/gitlab/redis/sessions_spec.rb
@@ -0,0 +1,7 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::Redis::Sessions do
+ include_examples "redis_new_instance_shared_examples", 'sessions', Gitlab::Redis::SharedState
+end
diff --git a/spec/lib/gitlab/redis/trace_chunks_spec.rb b/spec/lib/gitlab/redis/trace_chunks_spec.rb
index e974dc519d6..bb3c3089430 100644
--- a/spec/lib/gitlab/redis/trace_chunks_spec.rb
+++ b/spec/lib/gitlab/redis/trace_chunks_spec.rb
@@ -3,53 +3,5 @@
require 'spec_helper'
RSpec.describe Gitlab::Redis::TraceChunks do
- let(:instance_specific_config_file) { "config/redis.trace_chunks.yml" }
- let(:environment_config_file_name) { "GITLAB_REDIS_TRACE_CHUNKS_CONFIG_FILE" }
- let(:shared_state_config_file) { nil }
-
- before do
- allow(Gitlab::Redis::SharedState).to receive(:config_file_name).and_return(shared_state_config_file)
- end
-
- include_examples "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
-
- allow(described_class).to receive(:rails_root).and_return(rails_root)
- 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'))
- end
-
- it { expect(subject).to eq("#{rails_root}/config/resque.yml") }
-
- context 'and there is a global env override' do
- before do
- stub_env('GITLAB_REDIS_CONFIG_FILE', 'global override')
- end
-
- it { expect(subject).to eq('global override') }
-
- context 'and SharedState has a different config file' do
- let(:shared_state_config_file) { 'shared state config file' }
-
- it { expect(subject).to eq('shared state config file') }
- end
- end
- end
- end
+ include_examples "redis_new_instance_shared_examples", 'trace_chunks', Gitlab::Redis::SharedState
end
diff --git a/spec/lib/gitlab/regex_spec.rb b/spec/lib/gitlab/regex_spec.rb
index f1b4e50b1eb..9514654204b 100644
--- a/spec/lib/gitlab/regex_spec.rb
+++ b/spec/lib/gitlab/regex_spec.rb
@@ -12,22 +12,29 @@ RSpec.describe Gitlab::Regex do
it { is_expected.to match('Dash – is this') }
end
- shared_examples_for 'project/group name regex' do
+ shared_examples_for 'group name regex' do
it_behaves_like 'project/group name chars regex'
it { is_expected.not_to match('?gitlab') }
it { is_expected.not_to match("Users's something") }
end
+ shared_examples_for 'project name regex' do
+ it_behaves_like 'project/group name chars regex'
+ it { is_expected.to match("Gitlab++") }
+ it { is_expected.not_to match('?gitlab') }
+ it { is_expected.not_to match("Users's something") }
+ end
+
describe '.project_name_regex' do
subject { described_class.project_name_regex }
- it_behaves_like 'project/group name regex'
+ it_behaves_like 'project name regex'
end
describe '.group_name_regex' do
subject { described_class.group_name_regex }
- it_behaves_like 'project/group name regex'
+ it_behaves_like 'group name regex'
it 'allows parenthesis' do
is_expected.to match('Group One (Test)')
@@ -51,7 +58,7 @@ RSpec.describe Gitlab::Regex do
describe '.project_name_regex_message' do
subject { described_class.project_name_regex_message }
- it { is_expected.to eq("can contain only letters, digits, emojis, '_', '.', dash, space. It must start with letter, digit, emoji or '_'.") }
+ it { is_expected.to eq("can contain only letters, digits, emojis, '_', '.', '+', dashes, or spaces. It must start with a letter, digit, emoji, or '_'.") }
end
describe '.group_name_regex_message' do
@@ -646,13 +653,24 @@ RSpec.describe Gitlab::Regex do
it { is_expected.to match('release') }
it { is_expected.to match('my-repo') }
- it { is_expected.to match('my-repo42') }
+ it { is_expected.to match('My-Re_po') }
+ it { is_expected.to match('my_repo42') }
+ it { is_expected.to match('1.2.3') }
+ it { is_expected.to match('v1.2.3-beta-12') }
+ it { is_expected.to match('renovate_https-github.com-operator-framework-operator-lifecycle-manager.git-0.x') }
# Do not allow empty
it { is_expected.not_to match('') }
# Do not allow Unicode
it { is_expected.not_to match('hé') }
+
+ it { is_expected.not_to match('.1.23') }
+ it { is_expected.not_to match('1..23') }
+ it { is_expected.not_to match('1.2.3.') }
+ it { is_expected.not_to match('1..2.3.') }
+ it { is_expected.not_to match('1/../2.3.') }
+ it { is_expected.not_to match('1/..%2F2.3.') }
end
describe '.helm_package_regex' do
diff --git a/spec/lib/gitlab/request_endpoints_spec.rb b/spec/lib/gitlab/request_endpoints_spec.rb
new file mode 100644
index 00000000000..0c939bfb0ee
--- /dev/null
+++ b/spec/lib/gitlab/request_endpoints_spec.rb
@@ -0,0 +1,24 @@
+# frozen_string_literal: true
+require 'spec_helper'
+
+RSpec.describe Gitlab::RequestEndpoints do
+ describe '.all_api_endpoints' do
+ it 'selects all feature API classes' do
+ api_classes = described_class.all_api_endpoints.map { |route| route.app.options[:for] }
+
+ expect(api_classes).to all(include(Gitlab::EndpointAttributes))
+ end
+ end
+
+ describe '.all_controller_actions' do
+ it 'selects all feature controllers and action names' do
+ all_controller_actions = described_class.all_controller_actions
+ controller_classes = all_controller_actions.map(&:first)
+ all_actions = all_controller_actions.map(&:last)
+
+ expect(controller_classes).to all(include(Gitlab::EndpointAttributes))
+ expect(controller_classes).not_to include(ApplicationController, Devise::UnlocksController)
+ expect(all_actions).to all(be_a(String))
+ end
+ end
+end
diff --git a/spec/lib/gitlab/sidekiq_logging/structured_logger_spec.rb b/spec/lib/gitlab/sidekiq_logging/structured_logger_spec.rb
index a98038cd3f8..d801b84775b 100644
--- a/spec/lib/gitlab/sidekiq_logging/structured_logger_spec.rb
+++ b/spec/lib/gitlab/sidekiq_logging/structured_logger_spec.rb
@@ -18,7 +18,7 @@ RSpec.describe Gitlab::SidekiqLogging::StructuredLogger do
end
it 'logs start and end of job' do
- Timecop.freeze(timestamp) do
+ travel_to(timestamp) do
expect(logger).to receive(:info).with(start_payload).ordered
expect(logger).to receive(:info).with(end_payload).ordered
expect(subject).to receive(:log_job_start).and_call_original
@@ -34,7 +34,7 @@ RSpec.describe Gitlab::SidekiqLogging::StructuredLogger do
"wrapped" => "TestWorker"
)
- Timecop.freeze(timestamp) do
+ travel_to(timestamp) do
expect(logger).to receive(:info).with(start_payload).ordered
expect(logger).to receive(:info).with(end_payload).ordered
expect(subject).to receive(:log_job_start).and_call_original
@@ -45,7 +45,7 @@ RSpec.describe Gitlab::SidekiqLogging::StructuredLogger do
end
it 'logs an exception in job' do
- Timecop.freeze(timestamp) do
+ travel_to(timestamp) do
expect(logger).to receive(:info).with(start_payload)
expect(logger).to receive(:warn).with(include(exception_payload))
expect(subject).to receive(:log_job_start).and_call_original
@@ -60,7 +60,7 @@ RSpec.describe Gitlab::SidekiqLogging::StructuredLogger do
end
it 'logs the root cause of an Sidekiq::JobRetry::Skip exception in the job' do
- Timecop.freeze(timestamp) do
+ travel_to(timestamp) do
expect(logger).to receive(:info).with(start_payload)
expect(logger).to receive(:warn).with(include(exception_payload))
expect(subject).to receive(:log_job_start).and_call_original
@@ -77,7 +77,7 @@ RSpec.describe Gitlab::SidekiqLogging::StructuredLogger do
end
it 'logs the root cause of an Sidekiq::JobRetry::Handled exception in the job' do
- Timecop.freeze(timestamp) do
+ travel_to(timestamp) do
expect(logger).to receive(:info).with(start_payload)
expect(logger).to receive(:warn).with(include(exception_payload))
expect(subject).to receive(:log_job_start).and_call_original
@@ -94,7 +94,7 @@ RSpec.describe Gitlab::SidekiqLogging::StructuredLogger do
end
it 'keeps Sidekiq::JobRetry::Handled exception if the cause does not exist' do
- Timecop.freeze(timestamp) do
+ travel_to(timestamp) do
expect(logger).to receive(:info).with(start_payload)
expect(logger).to receive(:warn).with(
include(
@@ -116,7 +116,7 @@ RSpec.describe Gitlab::SidekiqLogging::StructuredLogger do
end
it 'does not modify the job' do
- Timecop.freeze(timestamp) do
+ travel_to(timestamp) do
job_copy = job.deep_dup
allow(logger).to receive(:info)
@@ -130,7 +130,7 @@ RSpec.describe Gitlab::SidekiqLogging::StructuredLogger do
end
it 'does not modify the wrapped job' do
- Timecop.freeze(timestamp) do
+ travel_to(timestamp) do
wrapped_job = job.merge(
"class" => "ActiveJob::QueueAdapters::SidekiqAdapter::JobWrapper",
"wrapped" => "TestWorker"
@@ -154,7 +154,7 @@ RSpec.describe Gitlab::SidekiqLogging::StructuredLogger do
end
it 'logs start and end of job without args' do
- Timecop.freeze(timestamp) do
+ travel_to(timestamp) do
expect(logger).to receive(:info).with(start_payload.except('args')).ordered
expect(logger).to receive(:info).with(end_payload.except('args')).ordered
expect(subject).to receive(:log_job_start).and_call_original
@@ -165,7 +165,7 @@ RSpec.describe Gitlab::SidekiqLogging::StructuredLogger do
end
it 'logs without created_at and enqueued_at fields' do
- Timecop.freeze(timestamp) do
+ travel_to(timestamp) do
excluded_fields = %w(created_at enqueued_at args scheduling_latency_s)
expect(logger).to receive(:info).with(start_payload.except(*excluded_fields)).ordered
@@ -183,7 +183,7 @@ RSpec.describe Gitlab::SidekiqLogging::StructuredLogger do
let(:scheduling_latency_s) { 7200.0 }
it 'logs with scheduling latency' do
- Timecop.freeze(timestamp) do
+ travel_to(timestamp) do
expect(logger).to receive(:info).with(start_payload).ordered
expect(logger).to receive(:info).with(end_payload).ordered
expect(subject).to receive(:log_job_start).and_call_original
@@ -194,6 +194,35 @@ RSpec.describe Gitlab::SidekiqLogging::StructuredLogger do
end
end
+ context 'with enqueue latency' do
+ let(:expected_start_payload) do
+ start_payload.merge(
+ 'scheduled_at' => job['scheduled_at'],
+ 'enqueue_latency_s' => 1.hour.to_f
+ )
+ end
+
+ let(:expected_end_payload) do
+ end_payload.merge('enqueue_latency_s' => 1.hour.to_f)
+ end
+
+ before do
+ # enqueued_at is set to created_at
+ job['scheduled_at'] = created_at - 1.hour
+ end
+
+ it 'logs with scheduling latency' do
+ travel_to(timestamp) do
+ expect(logger).to receive(:info).with(expected_start_payload).ordered
+ expect(logger).to receive(:info).with(expected_end_payload).ordered
+ expect(subject).to receive(:log_job_start).and_call_original
+ expect(subject).to receive(:log_job_done).and_call_original
+
+ call_subject(job, 'test_queue') { }
+ end
+ end
+ end
+
context 'with Gitaly, Rugged, and Redis calls' do
let(:timing_data) do
{
@@ -218,7 +247,7 @@ RSpec.describe Gitlab::SidekiqLogging::StructuredLogger do
end
it 'logs with Gitaly and Rugged timing data', :aggregate_failures do
- Timecop.freeze(timestamp) do
+ travel_to(timestamp) do
expect(logger).to receive(:info).with(start_payload).ordered
expect(logger).to receive(:info).with(expected_end_payload).ordered
@@ -243,8 +272,22 @@ RSpec.describe Gitlab::SidekiqLogging::StructuredLogger do
expected_end_payload.merge(
'db_duration_s' => a_value >= 0.1,
'db_count' => a_value >= 1,
- 'db_cached_count' => 0,
- 'db_write_count' => 0
+ "db_replica_#{db_config_name}_count" => 0,
+ 'db_replica_duration_s' => a_value >= 0,
+ 'db_primary_count' => a_value >= 1,
+ "db_primary_#{db_config_name}_count" => a_value >= 1,
+ 'db_primary_duration_s' => a_value > 0,
+ "db_primary_#{db_config_name}_duration_s" => a_value > 0
+ )
+ end
+
+ let(:end_payload) do
+ start_payload.merge(db_payload_defaults).merge(
+ 'message' => 'TestWorker JID-da883554ee4fe414012f5f42: done: 0.0 sec',
+ 'job_status' => 'done',
+ 'duration_s' => 0.0,
+ 'completed_at' => timestamp.to_f,
+ 'cpu_s' => 1.111112
)
end
@@ -274,59 +317,9 @@ RSpec.describe Gitlab::SidekiqLogging::StructuredLogger do
end
end
- context 'when load balancing is disabled' do
- before do
- allow(Gitlab::Database::LoadBalancing).to receive(:enable?).and_return(false)
- end
-
- let(:expected_end_payload_with_db) do
- expected_end_payload.merge(
- 'db_duration_s' => a_value >= 0.1,
- 'db_count' => a_value >= 1,
- 'db_cached_count' => 0,
- 'db_write_count' => 0
- )
- end
-
- include_examples 'performs database queries'
- end
-
- context 'when load balancing is enabled', :db_load_balancing do
- let(:db_config_name) { ::Gitlab::Database.db_config_name(ApplicationRecord.connection) }
-
- let(:expected_db_payload_defaults) do
- metrics =
- ::Gitlab::Metrics::Subscribers::ActiveRecord.load_balancing_metric_counter_keys +
- ::Gitlab::Metrics::Subscribers::ActiveRecord.load_balancing_metric_duration_keys +
- ::Gitlab::Metrics::Subscribers::ActiveRecord.db_counter_keys +
- [:db_duration_s]
-
- metrics.each_with_object({}) do |key, result|
- result[key.to_s] = 0
- end
- end
-
- let(:expected_end_payload_with_db) do
- expected_end_payload.merge(expected_db_payload_defaults).merge(
- 'db_duration_s' => a_value >= 0.1,
- 'db_count' => a_value >= 1,
- "db_replica_#{db_config_name}_count" => 0,
- 'db_replica_duration_s' => a_value >= 0,
- 'db_primary_count' => a_value >= 1,
- "db_primary_#{db_config_name}_count" => a_value >= 1,
- 'db_primary_duration_s' => a_value > 0,
- "db_primary_#{db_config_name}_duration_s" => a_value > 0
- )
- end
-
- let(:end_payload) do
- start_payload.merge(expected_db_payload_defaults).merge(
- 'message' => 'TestWorker JID-da883554ee4fe414012f5f42: done: 0.0 sec',
- 'job_status' => 'done',
- 'duration_s' => 0.0,
- 'completed_at' => timestamp.to_f,
- 'cpu_s' => 1.111112
- )
+ context 'when load balancing is enabled' do
+ let(:db_config_name) do
+ ::Gitlab::Database.db_config_name(ApplicationRecord.retrieve_connection)
end
include_examples 'performs database queries'
@@ -359,7 +352,7 @@ RSpec.describe Gitlab::SidekiqLogging::StructuredLogger do
end
it 'logs it in the done log' do
- Timecop.freeze(timestamp) do
+ travel_to(timestamp) do
expect(logger).to receive(:info).with(expected_start_payload).ordered
expect(logger).to receive(:info).with(expected_end_payload).ordered
@@ -401,7 +394,7 @@ RSpec.describe Gitlab::SidekiqLogging::StructuredLogger do
end
it 'logs it in the done log' do
- Timecop.freeze(timestamp) do
+ travel_to(timestamp) do
expect(logger).to receive(:info).with(expected_start_payload).ordered
expect(logger).to receive(:info).with(expected_end_payload).ordered
@@ -426,13 +419,13 @@ RSpec.describe Gitlab::SidekiqLogging::StructuredLogger do
'message' => 'my-message',
'job_status' => 'my-job-status',
'duration_s' => 0.123123,
- 'completed_at' => current_utc_time.to_f }
+ 'completed_at' => current_utc_time.to_i }
end
subject { described_class.new }
it 'update payload correctly' do
- Timecop.freeze(current_utc_time) do
+ travel_to(current_utc_time) do
subject.send(:add_time_keys!, time, payload)
expect(payload).to eq(payload_with_time_keys)
diff --git a/spec/lib/gitlab/sidekiq_middleware/client_metrics_spec.rb b/spec/lib/gitlab/sidekiq_middleware/client_metrics_spec.rb
index 698758a13fd..dca00c85e30 100644
--- a/spec/lib/gitlab/sidekiq_middleware/client_metrics_spec.rb
+++ b/spec/lib/gitlab/sidekiq_middleware/client_metrics_spec.rb
@@ -62,6 +62,27 @@ RSpec.describe Gitlab::SidekiqMiddleware::ClientMetrics do
Sidekiq::Testing.inline! { TestWorker.perform_in(1.second) }
end
+
+ it 'sets the scheduled_at field' do
+ job = { 'at' => Time.current }
+
+ subject.call('TestWorker', job, 'queue', nil) do
+ expect(job[:scheduled_at]).to eq(job['at'])
+ end
+ end
+ end
+
+ context 'when the worker class cannot be found' do
+ it 'increments enqueued jobs metric with the worker labels set to NilClass' do
+ test_anonymous_worker = Class.new(TestWorker)
+
+ expect(enqueued_jobs_metric).to receive(:increment).with(a_hash_including(worker: 'NilClass'), 1)
+
+ # Sidekiq won't be able to create an instance of this class
+ expect do
+ Sidekiq::Testing.inline! { test_anonymous_worker.perform_async }
+ end.to raise_error(NameError)
+ end
end
end
end
diff --git a/spec/lib/gitlab/sidekiq_middleware/duplicate_jobs/duplicate_job_spec.rb b/spec/lib/gitlab/sidekiq_middleware/duplicate_jobs/duplicate_job_spec.rb
index cc69a11f7f8..5083ac514db 100644
--- a/spec/lib/gitlab/sidekiq_middleware/duplicate_jobs/duplicate_job_spec.rb
+++ b/spec/lib/gitlab/sidekiq_middleware/duplicate_jobs/duplicate_job_spec.rb
@@ -472,6 +472,26 @@ RSpec.describe Gitlab::SidekiqMiddleware::DuplicateJobs::DuplicateJob, :clean_gi
expect(duplicate_job).to be_idempotent
end
end
+
+ context 'when worker class is utilizing load balancing capabilities' do
+ before do
+ allow(AuthorizedProjectsWorker).to receive(:utilizes_load_balancing_capabilities?).and_return(true)
+ end
+
+ it 'returns true' do
+ expect(duplicate_job).to be_idempotent
+ end
+
+ context 'when preserve_latest_wal_locations_for_idempotent_jobs feature flag is disabled' do
+ before do
+ stub_feature_flags(preserve_latest_wal_locations_for_idempotent_jobs: false)
+ end
+
+ it 'returns false' do
+ expect(duplicate_job).not_to be_idempotent
+ end
+ end
+ end
end
def existing_wal_location_key(idempotency_key, config_name)
diff --git a/spec/lib/gitlab/sidekiq_middleware/memory_killer_spec.rb b/spec/lib/gitlab/sidekiq_middleware/memory_killer_spec.rb
index 0d1616c4aed..1667622ad8e 100644
--- a/spec/lib/gitlab/sidekiq_middleware/memory_killer_spec.rb
+++ b/spec/lib/gitlab/sidekiq_middleware/memory_killer_spec.rb
@@ -45,7 +45,7 @@ RSpec.describe Gitlab::SidekiqMiddleware::MemoryKiller do
expect(subject).to receive(:sleep).with(30).ordered
expect(Process).to receive(:kill).with('SIGTERM', pid).ordered
- expect(subject).to receive(:sleep).with(10).ordered
+ expect(subject).to receive(:sleep).with(Sidekiq.options[:timeout] + 2).ordered
expect(Process).to receive(:kill).with('SIGKILL', pid).ordered
expect(Sidekiq.logger)
diff --git a/spec/lib/gitlab/sidekiq_middleware/server_metrics_spec.rb b/spec/lib/gitlab/sidekiq_middleware/server_metrics_spec.rb
index cae0bb6b167..914f5a30c3a 100644
--- a/spec/lib/gitlab/sidekiq_middleware/server_metrics_spec.rb
+++ b/spec/lib/gitlab/sidekiq_middleware/server_metrics_spec.rb
@@ -211,6 +211,9 @@ RSpec.describe Gitlab::SidekiqMiddleware::ServerMetrics do
end
end
+ include_context 'server metrics with mocked prometheus'
+ include_context 'server metrics call'
+
before do
stub_const('TestWorker', Class.new)
TestWorker.class_eval do
@@ -234,9 +237,6 @@ RSpec.describe Gitlab::SidekiqMiddleware::ServerMetrics do
end
end
- include_context 'server metrics with mocked prometheus'
- include_context 'server metrics call'
-
shared_context 'worker declaring data consistency' do
let(:worker_class) { LBTestWorker }
@@ -250,61 +250,93 @@ RSpec.describe Gitlab::SidekiqMiddleware::ServerMetrics do
end
end
- context 'when load_balancing is enabled' do
- before do
- allow(::Gitlab::Database::LoadBalancing).to receive(:enable?).and_return(true)
- end
+ describe '#call' do
+ context 'when worker declares data consistency' do
+ include_context 'worker declaring data consistency'
- describe '#call' do
- context 'when worker declares data consistency' do
- include_context 'worker declaring data consistency'
+ it 'increments load balancing counter with defined data consistency' do
+ process_job
+
+ expect(load_balancing_metric).to have_received(:increment).with(
+ a_hash_including(
+ data_consistency: :delayed,
+ load_balancing_strategy: 'replica'
+ ), 1)
+ end
+ end
- it 'increments load balancing counter with defined data consistency' do
- process_job
+ context 'when worker does not declare data consistency' do
+ it 'increments load balancing counter with default data consistency' do
+ process_job
- expect(load_balancing_metric).to have_received(:increment).with(
- a_hash_including(
- data_consistency: :delayed,
- load_balancing_strategy: 'replica'
- ), 1)
- end
+ expect(load_balancing_metric).to have_received(:increment).with(
+ a_hash_including(
+ data_consistency: :always,
+ load_balancing_strategy: 'primary'
+ ), 1)
end
+ end
+ end
+ end
- context 'when worker does not declare data consistency' do
- it 'increments load balancing counter with default data consistency' do
- process_job
+ context 'feature attribution' do
+ let(:test_worker) do
+ category = worker_category
- expect(load_balancing_metric).to have_received(:increment).with(
- a_hash_including(
- data_consistency: :always,
- load_balancing_strategy: 'primary'
- ), 1)
- end
+ Class.new do
+ include Sidekiq::Worker
+ include WorkerAttributes
+
+ if category
+ feature_category category
+ else
+ feature_category_not_owned!
+ end
+
+ def perform
end
end
end
- context 'when load_balancing is disabled' do
- include_context 'worker declaring data consistency'
+ let(:context_category) { 'continuous_integration' }
+ let(:job) { { 'meta.feature_category' => 'continuous_integration' } }
- before do
- allow(::Gitlab::Database::LoadBalancing).to receive(:enable?).and_return(false)
+ before do
+ stub_const('TestWorker', test_worker)
+ end
+
+ around do |example|
+ with_sidekiq_server_middleware do |chain|
+ Gitlab::SidekiqMiddleware.server_configurator(
+ metrics: true,
+ arguments_logger: false,
+ memory_killer: false
+ ).call(chain)
+
+ Sidekiq::Testing.inline! { example.run }
end
+ end
- describe '#initialize' do
- it 'does not set load_balancing metrics' do
- expect(Gitlab::Metrics).not_to receive(:counter).with(:sidekiq_load_balancing_count, anything)
+ include_context 'server metrics with mocked prometheus'
+ include_context 'server metrics call'
- subject
- end
+ context 'when a worker has a feature category' do
+ let(:worker_category) { 'authentication_and_authorization' }
+
+ it 'uses that category for metrics' do
+ expect(completion_seconds_metric).to receive(:observe).with(a_hash_including(feature_category: worker_category), anything)
+
+ TestWorker.process_job(job)
end
+ end
- describe '#call' do
- it 'does not increment load balancing counter' do
- process_job
+ context 'when a worker does not have a feature category' do
+ let(:worker_category) { nil }
- expect(load_balancing_metric).not_to have_received(:increment)
- end
+ it 'uses the category from the context for metrics' do
+ expect(completion_seconds_metric).to receive(:observe).with(a_hash_including(feature_category: context_category), anything)
+
+ TestWorker.process_job(job)
end
end
end
diff --git a/spec/lib/gitlab/sidekiq_middleware/worker_context/client_spec.rb b/spec/lib/gitlab/sidekiq_middleware/worker_context/client_spec.rb
index d6cc787f53d..92a11c83a4a 100644
--- a/spec/lib/gitlab/sidekiq_middleware/worker_context/client_spec.rb
+++ b/spec/lib/gitlab/sidekiq_middleware/worker_context/client_spec.rb
@@ -22,8 +22,31 @@ RSpec.describe Gitlab::SidekiqMiddleware::WorkerContext::Client do
end
end
+ let(:not_owned_worker_class) do
+ Class.new(worker_class) do
+ def self.name
+ 'TestNotOwnedWithContextWorker'
+ end
+
+ feature_category_not_owned!
+ end
+ end
+
+ let(:mailer_class) do
+ Class.new(ApplicationMailer) do
+ def self.name
+ 'TestMailer'
+ end
+
+ def test_mail
+ end
+ end
+ end
+
before do
- stub_const('TestWithContextWorker', worker_class)
+ stub_const(worker_class.name, worker_class)
+ stub_const(not_owned_worker_class.name, not_owned_worker_class)
+ stub_const(mailer_class.name, mailer_class)
end
describe "#call" do
@@ -58,6 +81,26 @@ RSpec.describe Gitlab::SidekiqMiddleware::WorkerContext::Client do
expect(job1['meta.feature_category']).to eq('issue_tracking')
expect(job2['meta.feature_category']).to eq('issue_tracking')
end
+
+ it 'takes the feature category from the caller if the worker is not owned' do
+ TestNotOwnedWithContextWorker.bulk_perform_async_with_contexts(
+ %w(job1 job2),
+ arguments_proc: -> (name) { [name, 1, 2, 3] },
+ context_proc: -> (_) { { feature_category: 'code_review' } }
+ )
+
+ job1 = TestNotOwnedWithContextWorker.job_for_args(['job1', 1, 2, 3])
+ job2 = TestNotOwnedWithContextWorker.job_for_args(['job2', 1, 2, 3])
+
+ expect(job1['meta.feature_category']).to eq('code_review')
+ expect(job2['meta.feature_category']).to eq('code_review')
+ end
+
+ it 'does not set any explicit feature category for mailers', :sidekiq_mailers do
+ expect(Gitlab::ApplicationContext).not_to receive(:with_context)
+
+ TestMailer.test_mail.deliver_later
+ end
end
context 'when the feature category is already set in the surrounding block' do
@@ -76,6 +119,22 @@ RSpec.describe Gitlab::SidekiqMiddleware::WorkerContext::Client do
expect(job1['meta.feature_category']).to eq('issue_tracking')
expect(job2['meta.feature_category']).to eq('issue_tracking')
end
+
+ it 'takes the feature category from the caller if the worker is not owned' do
+ Gitlab::ApplicationContext.with_context(feature_category: 'authentication_and_authorization') do
+ TestNotOwnedWithContextWorker.bulk_perform_async_with_contexts(
+ %w(job1 job2),
+ arguments_proc: -> (name) { [name, 1, 2, 3] },
+ context_proc: -> (_) { {} }
+ )
+ end
+
+ job1 = TestNotOwnedWithContextWorker.job_for_args(['job1', 1, 2, 3])
+ job2 = TestNotOwnedWithContextWorker.job_for_args(['job2', 1, 2, 3])
+
+ expect(job1['meta.feature_category']).to eq('authentication_and_authorization')
+ expect(job2['meta.feature_category']).to eq('authentication_and_authorization')
+ end
end
end
end
diff --git a/spec/lib/gitlab/sidekiq_middleware/worker_context/server_spec.rb b/spec/lib/gitlab/sidekiq_middleware/worker_context/server_spec.rb
index f736a7db774..377ff6fd166 100644
--- a/spec/lib/gitlab/sidekiq_middleware/worker_context/server_spec.rb
+++ b/spec/lib/gitlab/sidekiq_middleware/worker_context/server_spec.rb
@@ -3,7 +3,7 @@
require 'spec_helper'
RSpec.describe Gitlab::SidekiqMiddleware::WorkerContext::Server do
- let(:worker_class) do
+ let(:test_worker) do
Class.new do
def self.name
"TestWorker"
@@ -23,6 +23,16 @@ RSpec.describe Gitlab::SidekiqMiddleware::WorkerContext::Server do
end
end
+ let(:not_owned_worker) do
+ Class.new(test_worker) do
+ def self.name
+ "NotOwnedWorker"
+ end
+
+ feature_category_not_owned!
+ end
+ end
+
let(:other_worker) do
Class.new do
def self.name
@@ -37,7 +47,8 @@ RSpec.describe Gitlab::SidekiqMiddleware::WorkerContext::Server do
end
before do
- stub_const("TestWorker", worker_class)
+ stub_const("TestWorker", test_worker)
+ stub_const("NotOwnedWorker", not_owned_worker)
stub_const("OtherWorker", other_worker)
end
@@ -57,10 +68,24 @@ RSpec.describe Gitlab::SidekiqMiddleware::WorkerContext::Server do
expect(TestWorker.contexts['identifier'].keys).not_to include('meta.user')
end
- it 'takes the feature category from the worker' do
- TestWorker.perform_async('identifier', 1)
+ context 'feature category' do
+ it 'takes the feature category from the worker' do
+ Gitlab::ApplicationContext.with_context(feature_category: 'authentication_and_authorization') do
+ TestWorker.perform_async('identifier', 1)
+ end
+
+ expect(TestWorker.contexts['identifier']).to include('meta.feature_category' => 'foo')
+ end
- expect(TestWorker.contexts['identifier']).to include('meta.feature_category' => 'foo')
+ context 'when the worker is not owned' do
+ it 'takes the feature category from the surrounding context' do
+ Gitlab::ApplicationContext.with_context(feature_category: 'authentication_and_authorization') do
+ NotOwnedWorker.perform_async('identifier', 1)
+ end
+
+ expect(NotOwnedWorker.contexts['identifier']).to include('meta.feature_category' => 'authentication_and_authorization')
+ end
+ end
end
it "doesn't fail for unknown workers" do
diff --git a/spec/lib/gitlab/sidekiq_middleware_spec.rb b/spec/lib/gitlab/sidekiq_middleware_spec.rb
index 8285cf960d2..e687c8e8cf7 100644
--- a/spec/lib/gitlab/sidekiq_middleware_spec.rb
+++ b/spec/lib/gitlab/sidekiq_middleware_spec.rb
@@ -28,9 +28,8 @@ RSpec.describe Gitlab::SidekiqMiddleware do
stub_const('TestWorker', worker_class)
end
- shared_examples "a middleware chain" do |load_balancing_enabled|
+ shared_examples "a middleware chain" do
before do
- allow(::Gitlab::Database::LoadBalancing).to receive(:enable?).and_return(load_balancing_enabled)
configurator.call(chain)
end
@@ -45,10 +44,10 @@ RSpec.describe Gitlab::SidekiqMiddleware do
end
end
- shared_examples "a middleware chain for mailer" do |load_balancing_enabled|
+ shared_examples "a middleware chain for mailer" do
let(:worker_class) { ActiveJob::QueueAdapters::SidekiqAdapter::JobWrapper }
- it_behaves_like "a middleware chain", load_balancing_enabled
+ it_behaves_like "a middleware chain"
end
describe '.server_configurator' do
@@ -58,13 +57,13 @@ RSpec.describe Gitlab::SidekiqMiddleware do
let(:all_sidekiq_middlewares) do
[
::Gitlab::SidekiqMiddleware::Monitor,
+ ::Labkit::Middleware::Sidekiq::Server,
::Gitlab::SidekiqMiddleware::ServerMetrics,
::Gitlab::SidekiqMiddleware::ArgumentsLogger,
::Gitlab::SidekiqMiddleware::MemoryKiller,
::Gitlab::SidekiqMiddleware::RequestStoreMiddleware,
::Gitlab::SidekiqMiddleware::ExtraDoneLogMetadata,
::Gitlab::SidekiqMiddleware::BatchLoader,
- ::Labkit::Middleware::Sidekiq::Server,
::Gitlab::SidekiqMiddleware::InstrumentationLogger,
::Gitlab::SidekiqMiddleware::AdminMode::Server,
::Gitlab::SidekiqVersioning::Middleware,
@@ -105,25 +104,8 @@ RSpec.describe Gitlab::SidekiqMiddleware do
end
context "all optional middlewares on" do
- context "when load balancing is enabled" do
- before do
- allow(::Gitlab::Database::LoadBalancing).to receive_message_chain(:proxy, :load_balancer, :release_host)
- end
-
- it_behaves_like "a middleware chain", true
- it_behaves_like "a middleware chain for mailer", true
- end
-
- context "when load balancing is disabled" do
- let(:disabled_sidekiq_middlewares) do
- [
- Gitlab::Database::LoadBalancing::SidekiqServerMiddleware
- ]
- end
-
- it_behaves_like "a middleware chain", false
- it_behaves_like "a middleware chain for mailer", false
- end
+ it_behaves_like "a middleware chain"
+ it_behaves_like "a middleware chain for mailer"
end
context "all optional middlewares off" do
@@ -135,36 +117,16 @@ RSpec.describe Gitlab::SidekiqMiddleware do
)
end
- context "when load balancing is enabled" do
- let(:disabled_sidekiq_middlewares) do
- [
- Gitlab::SidekiqMiddleware::ServerMetrics,
- Gitlab::SidekiqMiddleware::ArgumentsLogger,
- Gitlab::SidekiqMiddleware::MemoryKiller
- ]
- end
-
- before do
- allow(::Gitlab::Database::LoadBalancing).to receive_message_chain(:proxy, :load_balancer, :release_host)
- end
-
- it_behaves_like "a middleware chain", true
- it_behaves_like "a middleware chain for mailer", true
+ let(:disabled_sidekiq_middlewares) do
+ [
+ Gitlab::SidekiqMiddleware::ServerMetrics,
+ Gitlab::SidekiqMiddleware::ArgumentsLogger,
+ Gitlab::SidekiqMiddleware::MemoryKiller
+ ]
end
- context "when load balancing is disabled" do
- let(:disabled_sidekiq_middlewares) do
- [
- Gitlab::SidekiqMiddleware::ServerMetrics,
- Gitlab::SidekiqMiddleware::ArgumentsLogger,
- Gitlab::SidekiqMiddleware::MemoryKiller,
- Gitlab::Database::LoadBalancing::SidekiqServerMiddleware
- ]
- end
-
- it_behaves_like "a middleware chain", false
- it_behaves_like "a middleware chain for mailer", false
- end
+ it_behaves_like "a middleware chain"
+ it_behaves_like "a middleware chain for mailer"
end
end
@@ -186,30 +148,7 @@ RSpec.describe Gitlab::SidekiqMiddleware do
]
end
- context "when load balancing is disabled" do
- let(:disabled_sidekiq_middlewares) do
- [
- Gitlab::Database::LoadBalancing::SidekiqClientMiddleware
- ]
- end
-
- it_behaves_like "a middleware chain", false
- it_behaves_like "a middleware chain for mailer", false
-
- # Sidekiq documentation states that the worker class could be a string
- # or a class reference. We should test for both
- context "worker_class as string value" do
- let(:worker_args) { [worker_class.to_s, { 'args' => job_args }, queue, redis_pool] }
- let(:middleware_expected_args) { [worker_class.to_s, hash_including({ 'args' => job_args }), queue, redis_pool] }
-
- it_behaves_like "a middleware chain", false
- it_behaves_like "a middleware chain for mailer", false
- end
- end
-
- context "when load balancing is enabled" do
- it_behaves_like "a middleware chain", true
- it_behaves_like "a middleware chain for mailer", true
- end
+ it_behaves_like "a middleware chain"
+ it_behaves_like "a middleware chain for mailer"
end
end
diff --git a/spec/lib/gitlab/sidekiq_migrate_jobs_spec.rb b/spec/lib/gitlab/sidekiq_migrate_jobs_spec.rb
index b30143ed196..d4391d3023a 100644
--- a/spec/lib/gitlab/sidekiq_migrate_jobs_spec.rb
+++ b/spec/lib/gitlab/sidekiq_migrate_jobs_spec.rb
@@ -65,7 +65,7 @@ RSpec.describe Gitlab::SidekiqMigrateJobs, :clean_gitlab_redis_queues do
expect(item).to include('queue' => 'post_receive', 'args' => [i])
end
- expect(score).to eq(i.succ.hours.from_now.to_i)
+ expect(score).to be_within(schedule_jitter).of(i.succ.hours.from_now.to_i)
end
end
end
@@ -84,7 +84,7 @@ RSpec.describe Gitlab::SidekiqMigrateJobs, :clean_gitlab_redis_queues do
expect(item).to include('queue' => 'another_queue', 'args' => [i])
end
- expect(score).to eq(i.succ.hours.from_now.to_i)
+ expect(score).to be_within(schedule_jitter).of(i.succ.hours.from_now.to_i)
end
end
end
@@ -98,7 +98,7 @@ RSpec.describe Gitlab::SidekiqMigrateJobs, :clean_gitlab_redis_queues do
set_after.each.with_index do |(item, score), i|
expect(item).to include('queue' => 'new_queue', 'args' => [i])
- expect(score).to eq(i.succ.hours.from_now.to_i)
+ expect(score).to be_within(schedule_jitter).of(i.succ.hours.from_now.to_i)
end
end
end
@@ -173,6 +173,7 @@ RSpec.describe Gitlab::SidekiqMigrateJobs, :clean_gitlab_redis_queues do
context 'scheduled jobs' do
let(:set_name) { 'schedule' }
+ let(:schedule_jitter) { 0 }
def create_jobs(include_post_receive: true)
AuthorizedProjectsWorker.perform_in(1.hour, 0)
@@ -186,12 +187,14 @@ RSpec.describe Gitlab::SidekiqMigrateJobs, :clean_gitlab_redis_queues do
context 'retried jobs' do
let(:set_name) { 'retry' }
+ # Account for Sidekiq retry jitter
+ # https://github.com/mperham/sidekiq/blob/3575ccb44c688dd08bfbfd937696260b12c622fb/lib/sidekiq/job_retry.rb#L217
+ let(:schedule_jitter) { 10 }
# Try to mimic as closely as possible what Sidekiq will actually
# do to retry a job.
def retry_in(klass, time, args)
- # In Sidekiq 6, this argument will become a JSON string
- message = { 'class' => klass, 'args' => [args], 'retry' => true }
+ message = { 'class' => klass.name, 'args' => [args], 'retry' => true }.to_json
allow(klass).to receive(:sidekiq_retry_in_block).and_return(proc { time })
diff --git a/spec/lib/gitlab/sidekiq_versioning/manager_spec.rb b/spec/lib/gitlab/sidekiq_versioning/manager_spec.rb
deleted file mode 100644
index 84161d9236e..00000000000
--- a/spec/lib/gitlab/sidekiq_versioning/manager_spec.rb
+++ /dev/null
@@ -1,25 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Gitlab::SidekiqVersioning::Manager do
- before do
- Sidekiq::Manager.prepend described_class
- end
-
- describe '#initialize' do
- it 'listens on all expanded queues' do
- manager = Sidekiq::Manager.new(queues: %w[post_receive repository_fork cronjob unknown])
-
- queues = manager.options[:queues]
-
- expect(queues).to include('post_receive')
- expect(queues).to include('repository_fork')
- expect(queues).to include('cronjob')
- expect(queues).to include('cronjob:import_stuck_project_import_jobs')
- expect(queues).to include('cronjob:jira_import_stuck_jira_import_jobs')
- expect(queues).to include('cronjob:stuck_merge_jobs')
- expect(queues).to include('unknown')
- end
- end
-end
diff --git a/spec/lib/gitlab/sidekiq_versioning_spec.rb b/spec/lib/gitlab/sidekiq_versioning_spec.rb
index ed9650fc166..afafd04d87d 100644
--- a/spec/lib/gitlab/sidekiq_versioning_spec.rb
+++ b/spec/lib/gitlab/sidekiq_versioning_spec.rb
@@ -29,12 +29,6 @@ RSpec.describe Gitlab::SidekiqVersioning, :redis do
end
describe '.install!' do
- it 'prepends SidekiqVersioning::Manager into Sidekiq::Manager' do
- described_class.install!
-
- expect(Sidekiq::Manager).to include(Gitlab::SidekiqVersioning::Manager)
- end
-
it 'registers all versionless and versioned queues with Redis' do
described_class.install!
diff --git a/spec/lib/gitlab/slash_commands/issue_move_spec.rb b/spec/lib/gitlab/slash_commands/issue_move_spec.rb
index 5fffbb2d4cc..aa1341b4148 100644
--- a/spec/lib/gitlab/slash_commands/issue_move_spec.rb
+++ b/spec/lib/gitlab/slash_commands/issue_move_spec.rb
@@ -95,7 +95,7 @@ RSpec.describe Gitlab::SlashCommands::IssueMove, service: true do
end
end
- context 'when the user cannot see the target project' do
+ context 'when the user cannot see the target project', :sidekiq_inline do
it 'returns not found' do
message = "issue move #{issue.iid} #{other_project.full_path}"
other_project.team.truncate
diff --git a/spec/lib/gitlab/subscription_portal_spec.rb b/spec/lib/gitlab/subscription_portal_spec.rb
index 628eb380396..a3808b0f0e2 100644
--- a/spec/lib/gitlab/subscription_portal_spec.rb
+++ b/spec/lib/gitlab/subscription_portal_spec.rb
@@ -5,23 +5,96 @@ require 'spec_helper'
RSpec.describe ::Gitlab::SubscriptionPortal do
using RSpec::Parameterized::TableSyntax
- where(:method_name, :test, :development, :result) do
- :default_subscriptions_url | false | false | 'https://customers.gitlab.com'
- :default_subscriptions_url | false | true | 'https://customers.stg.gitlab.com'
- :default_subscriptions_url | true | false | 'https://customers.stg.gitlab.com'
- :payment_form_url | false | false | 'https://customers.gitlab.com/payment_forms/cc_validation'
- :payment_form_url | false | true | 'https://customers.stg.gitlab.com/payment_forms/cc_validation'
- :payment_form_url | true | false | 'https://customers.stg.gitlab.com/payment_forms/cc_validation'
+ let(:env_value) { nil }
+
+ before do
+ stub_env('CUSTOMER_PORTAL_URL', env_value)
+ stub_feature_flags(new_customersdot_staging_url: false)
end
- with_them do
- subject { described_class.method(method_name).call }
+ describe '.default_subscriptions_url' do
+ where(:test, :development, :result) do
+ false | false | 'https://customers.gitlab.com'
+ false | true | 'https://customers.stg.gitlab.com'
+ true | false | 'https://customers.stg.gitlab.com'
+ end
before do
allow(Rails).to receive_message_chain(:env, :test?).and_return(test)
allow(Rails).to receive_message_chain(:env, :development?).and_return(development)
end
- it { is_expected.to eq(result) }
+ with_them do
+ subject { described_class.default_subscriptions_url }
+
+ it { is_expected.to eq(result) }
+ end
+ end
+
+ describe '.subscriptions_url' do
+ subject { described_class.subscriptions_url }
+
+ context 'when CUSTOMER_PORTAL_URL ENV is unset' do
+ it { is_expected.to eq('https://customers.stg.gitlab.com') }
+ end
+
+ context 'when CUSTOMER_PORTAL_URL ENV is set' do
+ let(:env_value) { 'https://customers.example.com' }
+
+ it { is_expected.to eq(env_value) }
+ end
+ end
+
+ describe '.subscriptions_comparison_url' do
+ subject { described_class.subscriptions_comparison_url }
+
+ link_match = %r{\Ahttps://about\.gitlab\.((cn/pricing/saas)|(com/pricing/gitlab-com))/feature-comparison\z}
+
+ it { is_expected.to match(link_match) }
+ end
+
+ context 'url methods' do
+ where(:method_name, :result) do
+ :default_subscriptions_url | 'https://customers.stg.gitlab.com'
+ :payment_form_url | 'https://customers.stg.gitlab.com/payment_forms/cc_validation'
+ :subscriptions_graphql_url | 'https://customers.stg.gitlab.com/graphql'
+ :subscriptions_more_minutes_url | 'https://customers.stg.gitlab.com/buy_pipeline_minutes'
+ :subscriptions_more_storage_url | 'https://customers.stg.gitlab.com/buy_storage'
+ :subscriptions_manage_url | 'https://customers.stg.gitlab.com/subscriptions'
+ :subscriptions_plans_url | 'https://customers.stg.gitlab.com/plans'
+ :subscriptions_instance_review_url | 'https://customers.stg.gitlab.com/instance_review'
+ :subscriptions_gitlab_plans_url | 'https://customers.stg.gitlab.com/gitlab_plans'
+ end
+
+ with_them do
+ subject { described_class.send(method_name) }
+
+ it { is_expected.to eq(result) }
+ end
+ end
+
+ describe '.add_extra_seats_url' do
+ subject { described_class.add_extra_seats_url(group_id) }
+
+ let(:group_id) { 153 }
+
+ it { is_expected.to eq("https://customers.stg.gitlab.com/gitlab/namespaces/#{group_id}/extra_seats") }
+ end
+
+ describe '.upgrade_subscription_url' do
+ subject { described_class.upgrade_subscription_url(group_id, plan_id) }
+
+ let(:group_id) { 153 }
+ let(:plan_id) { 5 }
+
+ it { is_expected.to eq("https://customers.stg.gitlab.com/gitlab/namespaces/#{group_id}/upgrade/#{plan_id}") }
+ end
+
+ describe '.renew_subscription_url' do
+ subject { described_class.renew_subscription_url(group_id) }
+
+ let(:group_id) { 153 }
+
+ it { is_expected.to eq("https://customers.stg.gitlab.com/gitlab/namespaces/#{group_id}/renew") }
end
end
diff --git a/spec/lib/gitlab/tracking/docs/helper_spec.rb b/spec/lib/gitlab/tracking/docs/helper_spec.rb
deleted file mode 100644
index 5f7965502f1..00000000000
--- a/spec/lib/gitlab/tracking/docs/helper_spec.rb
+++ /dev/null
@@ -1,91 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Gitlab::Tracking::Docs::Helper do
- let_it_be(:klass) do
- Class.new do
- include Gitlab::Tracking::Docs::Helper
- end
- end
-
- describe '#auto_generated_comment' do
- it 'renders information about missing description' do
- expect(klass.new.auto_generated_comment).to match /This documentation is auto generated by a script/
- end
- end
-
- describe '#render_description' do
- context 'description is empty' do
- it 'renders information about missing description' do
- object = double(description: '')
-
- expect(klass.new.render_description(object)).to eq('Missing description')
- end
- end
-
- context 'description is present' do
- it 'render description' do
- object = double(description: 'some description')
-
- expect(klass.new.render_description(object)).to eq('some description')
- end
- end
- end
-
- describe '#render_event_taxonomy' do
- it 'render table with event taxonomy' do
- attributes = {
- category: 'epics',
- action: 'promote',
- label: nil,
- property_description: 'String with issue id',
- value_description: 'Integer issue id'
- }
- object = double(attributes: attributes)
- event_taxonomy = <<~MD.chomp
- | category | action | label | property | value |
- |---|---|---|---|---|
- | `epics` | `promote` | `` | `String with issue id` | `Integer issue id` |
- MD
-
- expect(klass.new.render_event_taxonomy(object)).to eq(event_taxonomy)
- end
- end
-
- describe '#md_link_to' do
- it 'render link in md format' do
- expect(klass.new.md_link_to('zelda', 'link')).to eq('[zelda](link)')
- end
- end
-
- describe '#render_owner' do
- it 'render information about group owning event' do
- object = double(product_group: "group::product intelligence")
-
- expect(klass.new.render_owner(object)).to eq("Owner: `group::product intelligence`")
- end
- end
-
- describe '#render_tiers' do
- it 'render information about tiers' do
- object = double(tiers: %w[bronze silver gold])
-
- expect(klass.new.render_tiers(object)).to eq("Tiers: `bronze`, `silver`, `gold`")
- end
- end
-
- describe '#render_yaml_definition_path' do
- it 'render relative location of yaml definition' do
- object = double(yaml_path: 'config/events/button_click.yaml')
-
- expect(klass.new.render_yaml_definition_path(object)).to eq("YAML definition: `config/events/button_click.yaml`")
- end
- end
-
- describe '#backtick' do
- it 'wraps string in backticks chars' do
- expect(klass.new.backtick('test')).to eql("`test`")
- end
- end
-end
diff --git a/spec/lib/gitlab/tracking/docs/renderer_spec.rb b/spec/lib/gitlab/tracking/docs/renderer_spec.rb
deleted file mode 100644
index 386aea6c23a..00000000000
--- a/spec/lib/gitlab/tracking/docs/renderer_spec.rb
+++ /dev/null
@@ -1,23 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Gitlab::Tracking::Docs::Renderer do
- describe 'contents' do
- let(:dictionary_path) { described_class::DICTIONARY_PATH }
- let(:items) { Gitlab::Tracking::EventDefinition.definitions.first(10).to_h }
-
- it 'generates dictionary for given items' do
- generated_dictionary = described_class.new(items).contents
- table_of_contents_items = items.values.map { |item| "#{item.category} #{item.action}"}
-
- generated_dictionary_keys = RDoc::Markdown
- .parse(generated_dictionary)
- .table_of_contents
- .select { |metric_doc| metric_doc.level == 3 }
- .map { |item| item.text.match(%r{<code>(.*)</code>})&.captures&.first }
-
- expect(generated_dictionary_keys).to match_array(table_of_contents_items)
- end
- end
-end
diff --git a/spec/lib/gitlab/tracking/standard_context_spec.rb b/spec/lib/gitlab/tracking/standard_context_spec.rb
index ca7a6b6b1c3..8ded80dd191 100644
--- a/spec/lib/gitlab/tracking/standard_context_spec.rb
+++ b/spec/lib/gitlab/tracking/standard_context_spec.rb
@@ -5,6 +5,7 @@ require 'spec_helper'
RSpec.describe Gitlab::Tracking::StandardContext do
let_it_be(:project) { create(:project) }
let_it_be(:namespace) { create(:namespace) }
+ let_it_be(:user) { create(:user) }
let(:snowplow_context) { subject.to_context }
@@ -87,8 +88,8 @@ RSpec.describe Gitlab::Tracking::StandardContext do
end
end
- it 'does not contain user id' do
- expect(snowplow_context.to_json[:data].keys).not_to include(:user_id)
+ it 'contains user id' do
+ expect(snowplow_context.to_json[:data].keys).to include(:user_id)
end
it 'contains namespace and project ids' do
@@ -104,8 +105,18 @@ RSpec.describe Gitlab::Tracking::StandardContext do
stub_feature_flags(add_namespace_and_project_to_snowplow_tracking: false)
end
- it 'does not contain any ids' do
- expect(snowplow_context.to_json[:data].keys).not_to include(:user_id, :project_id, :namespace_id)
+ it 'does not contain project or namespace ids' do
+ expect(snowplow_context.to_json[:data].keys).not_to include(:project_id, :namespace_id)
+ end
+ end
+
+ context 'without add_actor_based_user_to_snowplow_tracking feature' do
+ before do
+ stub_feature_flags(add_actor_based_user_to_snowplow_tracking: false)
+ end
+
+ it 'does not contain user_id' do
+ expect(snowplow_context.to_json[:data].keys).not_to include(:user_id)
end
end
end
diff --git a/spec/lib/gitlab/tracking_spec.rb b/spec/lib/gitlab/tracking_spec.rb
index 02e66458f46..dacaae55676 100644
--- a/spec/lib/gitlab/tracking_spec.rb
+++ b/spec/lib/gitlab/tracking_spec.rb
@@ -48,7 +48,7 @@ RSpec.describe Gitlab::Tracking do
other_context = double(:context)
project = build_stubbed(:project)
- user = double(:user)
+ user = build_stubbed(:user)
expect(Gitlab::Tracking::StandardContext)
.to receive(:new)
diff --git a/spec/lib/gitlab/usage/metric_definition_spec.rb b/spec/lib/gitlab/usage/metric_definition_spec.rb
index 6406c0b5458..522f69062fb 100644
--- a/spec/lib/gitlab/usage/metric_definition_spec.rb
+++ b/spec/lib/gitlab/usage/metric_definition_spec.rb
@@ -49,6 +49,37 @@ RSpec.describe Gitlab::Usage::MetricDefinition do
expect { described_class.definitions }.not_to raise_error
end
+ describe '#with_instrumentation_class' do
+ let(:metric_status) { 'active' }
+ let(:all_definitions) do
+ metrics_definitions = [
+ { key_path: 'metric1', instrumentation_class: 'RedisHLLMetric', status: 'data_available' },
+ { key_path: 'metric2', instrumentation_class: 'RedisHLLMetric', status: 'implemented' },
+ { key_path: 'metric3', instrumentation_class: 'RedisHLLMetric', status: 'deprecated' },
+ { key_path: 'metric4', instrumentation_class: 'RedisHLLMetric', status: metric_status },
+ { key_path: 'metric5', status: 'active' },
+ { key_path: 'metric_missing_status' }
+ ]
+ metrics_definitions.map { |definition| described_class.new(definition[:key_path], definition.symbolize_keys) }
+ end
+
+ before do
+ allow(described_class).to receive(:all).and_return(all_definitions)
+ end
+
+ it 'includes definitions with instrumentation_class' do
+ expect(described_class.with_instrumentation_class.count).to eq(4)
+ end
+
+ context 'with removed metric' do
+ let(:metric_status) { 'removed' }
+
+ it 'excludes removed definitions' do
+ expect(described_class.with_instrumentation_class.count).to eq(3)
+ end
+ end
+ end
+
describe '#key' do
subject { definition.key }
diff --git a/spec/lib/gitlab/usage/metrics/instrumentations/active_user_count_metric_spec.rb b/spec/lib/gitlab/usage/metrics/instrumentations/active_user_count_metric_spec.rb
new file mode 100644
index 00000000000..f0ee6c38f2e
--- /dev/null
+++ b/spec/lib/gitlab/usage/metrics/instrumentations/active_user_count_metric_spec.rb
@@ -0,0 +1,13 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::Usage::Metrics::Instrumentations::ActiveUserCountMetric do
+ before do
+ create(:user)
+ end
+
+ it_behaves_like 'a correct instrumented metric value', { time_frame: 'none', data_source: 'ruby' } do
+ let(:expected_value) { ::User.active.count }
+ end
+end
diff --git a/spec/lib/gitlab/usage/metrics/instrumentations/count_users_associating_milestones_to_releases_metric_spec.rb b/spec/lib/gitlab/usage/metrics/instrumentations/count_users_associating_milestones_to_releases_metric_spec.rb
new file mode 100644
index 00000000000..e2bb99c832a
--- /dev/null
+++ b/spec/lib/gitlab/usage/metrics/instrumentations/count_users_associating_milestones_to_releases_metric_spec.rb
@@ -0,0 +1,12 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::Usage::Metrics::Instrumentations::CountUsersAssociatingMilestonesToReleasesMetric do
+ let_it_be(:release) { create(:release, created_at: 3.days.ago) }
+ let_it_be(:release_with_milestone) { create(:release, :with_milestones, created_at: 3.days.ago) }
+
+ it_behaves_like 'a correct instrumented metric value', { time_frame: '28d', data_source: 'database' } do
+ let(:expected_value) { 1 }
+ end
+end
diff --git a/spec/lib/gitlab/usage_data_counters/ci_template_unique_counter_spec.rb b/spec/lib/gitlab/usage_data_counters/ci_template_unique_counter_spec.rb
index 4996b0a0089..222198a58ac 100644
--- a/spec/lib/gitlab/usage_data_counters/ci_template_unique_counter_spec.rb
+++ b/spec/lib/gitlab/usage_data_counters/ci_template_unique_counter_spec.rb
@@ -6,97 +6,62 @@ RSpec.describe Gitlab::UsageDataCounters::CiTemplateUniqueCounter do
describe '.track_unique_project_event' do
using RSpec::Parameterized::TableSyntax
- where(:template, :config_source, :expected_event) do
- # Implicit Auto DevOps usage
- 'Auto-DevOps.gitlab-ci.yml' | :auto_devops_source | 'p_ci_templates_implicit_auto_devops'
- 'Jobs/Build.gitlab-ci.yml' | :auto_devops_source | 'p_ci_templates_implicit_auto_devops_build'
- 'Jobs/Deploy.gitlab-ci.yml' | :auto_devops_source | 'p_ci_templates_implicit_auto_devops_deploy'
- 'Security/SAST.gitlab-ci.yml' | :auto_devops_source | 'p_ci_templates_implicit_security_sast'
- 'Security/Secret-Detection.gitlab-ci.yml' | :auto_devops_source | 'p_ci_templates_implicit_security_secret_detection'
- # Explicit include:template usage
- '5-Minute-Production-App.gitlab-ci.yml' | :repository_source | 'p_ci_templates_5_min_production_app'
- 'Auto-DevOps.gitlab-ci.yml' | :repository_source | 'p_ci_templates_auto_devops'
- 'AWS/CF-Provision-and-Deploy-EC2.gitlab-ci.yml' | :repository_source | 'p_ci_templates_aws_cf_deploy_ec2'
- 'AWS/Deploy-ECS.gitlab-ci.yml' | :repository_source | 'p_ci_templates_aws_deploy_ecs'
- 'Jobs/Build.gitlab-ci.yml' | :repository_source | 'p_ci_templates_auto_devops_build'
- 'Jobs/Deploy.gitlab-ci.yml' | :repository_source | 'p_ci_templates_auto_devops_deploy'
- 'Jobs/Deploy.latest.gitlab-ci.yml' | :repository_source | 'p_ci_templates_auto_devops_deploy_latest'
- 'Security/SAST.gitlab-ci.yml' | :repository_source | 'p_ci_templates_security_sast'
- 'Security/Secret-Detection.gitlab-ci.yml' | :repository_source | 'p_ci_templates_security_secret_detection'
- 'Terraform/Base.latest.gitlab-ci.yml' | :repository_source | 'p_ci_templates_terraform_base_latest'
- end
-
- with_them do
- it_behaves_like 'tracking unique hll events' do
- subject(:request) { described_class.track_unique_project_event(project_id: project_id, template: template, config_source: config_source) }
+ let(:project_id) { 1 }
- let(:project_id) { 1 }
- let(:target_id) { expected_event }
- let(:expected_type) { instance_of(Integer) }
+ shared_examples 'tracks template' do
+ it "has an event defined for template" do
+ expect do
+ described_class.track_unique_project_event(
+ project_id: project_id,
+ template: template_path,
+ config_source: config_source
+ )
+ end.not_to raise_error
end
- end
- context 'known_events coverage tests' do
- let(:project_id) { 1 }
- let(:config_source) { :repository_source }
+ it "tracks template" do
+ expanded_template_name = described_class.expand_template_name(template_path)
+ expected_template_event_name = described_class.ci_template_event_name(expanded_template_name, config_source)
+ expect(Gitlab::UsageDataCounters::HLLRedisCounter).to(receive(:track_event)).with(expected_template_event_name, values: project_id)
- # These tests help guard against missing "explicit" events in known_events/ci_templates.yml
- context 'explicit include:template events' do
- described_class::TEMPLATE_TO_EVENT.keys.each do |template|
- it "does not raise error for #{template}" do
- expect do
- described_class.track_unique_project_event(project_id: project_id, template: template, config_source: config_source)
- end.not_to raise_error
- end
- end
+ described_class.track_unique_project_event(project_id: project_id, template: template_path, config_source: config_source)
end
+ end
- # This test is to help guard against missing "implicit" events in known_events/ci_templates.yml
- it 'does not raise error for any template in an implicit Auto DevOps pipeline' do
- project = create(:project, :auto_devops)
- pipeline = double(project: project)
- command = double
- result = Gitlab::Ci::YamlProcessor.new(
- Gitlab::Ci::Pipeline::Chain::Config::Content::AutoDevops.new(pipeline, command).content,
- project: project,
- user: double,
- sha: 'd310cc759caaa20cd05a9e0983d6017896d9c34c'
- ).execute
+ context 'with explicit includes' do
+ let(:config_source) { :repository_source }
- config_source = :auto_devops_source
+ (described_class.ci_templates - ['Verify/Browser-Performance.latest.gitlab-ci.yml', 'Verify/Browser-Performance.gitlab-ci.yml']).each do |template|
+ context "for #{template}" do
+ let(:template_path) { template }
- result.included_templates.each do |template|
- expect do
- described_class.track_unique_project_event(project_id: project.id, template: template, config_source: config_source)
- end.not_to raise_error
+ include_examples 'tracks template'
end
end
end
- context 'templates outside of TEMPLATE_TO_EVENT' do
- let(:project_id) { 1 }
- let(:config_source) { :repository_source }
-
- described_class.ci_templates.each do |template|
- next if described_class::TEMPLATE_TO_EVENT.key?(template)
-
- it "has an event defined for #{template}" do
- expect do
- described_class.track_unique_project_event(
- project_id: project_id,
- template: template,
- config_source: config_source
- )
- end.not_to raise_error
- end
+ context 'with implicit includes' do
+ let(:config_source) { :auto_devops_source }
- it "tracks #{template}" do
- expected_template_event_name = described_class.ci_template_event_name(template, :repository_source)
- expect(Gitlab::UsageDataCounters::HLLRedisCounter).to(receive(:track_event)).with(expected_template_event_name, values: project_id)
+ [
+ ['', ['Auto-DevOps.gitlab-ci.yml']],
+ ['Jobs', described_class.ci_templates('lib/gitlab/ci/templates/Jobs')],
+ ['Security', described_class.ci_templates('lib/gitlab/ci/templates/Security')]
+ ].each do |directory, templates|
+ templates.each do |template|
+ context "for #{template}" do
+ let(:template_path) { File.join(directory, template) }
- described_class.track_unique_project_event(project_id: project_id, template: template, config_source: config_source)
+ include_examples 'tracks template'
+ end
end
end
end
+
+ it 'expands short template names' do
+ expect do
+ described_class.track_unique_project_event(project_id: 1, template: 'Dependency-Scanning.gitlab-ci.yml', config_source: :repository_source)
+ end.not_to raise_error
+ end
end
end
diff --git a/spec/lib/gitlab/usage_data_counters/hll_redis_counter_spec.rb b/spec/lib/gitlab/usage_data_counters/hll_redis_counter_spec.rb
index 427dd4a205e..0ec805714e3 100644
--- a/spec/lib/gitlab/usage_data_counters/hll_redis_counter_spec.rb
+++ b/spec/lib/gitlab/usage_data_counters/hll_redis_counter_spec.rb
@@ -47,6 +47,7 @@ RSpec.describe Gitlab::UsageDataCounters::HLLRedisCounter, :clean_gitlab_redis_s
'epics_usage',
'epic_boards_usage',
'secure',
+ 'importer',
'network_policies'
)
end
diff --git a/spec/lib/gitlab/usage_data_metrics_spec.rb b/spec/lib/gitlab/usage_data_metrics_spec.rb
index e0063194f9b..ee0cfb1407e 100644
--- a/spec/lib/gitlab/usage_data_metrics_spec.rb
+++ b/spec/lib/gitlab/usage_data_metrics_spec.rb
@@ -46,7 +46,7 @@ RSpec.describe Gitlab::UsageDataMetrics do
let(:metric_files_key_paths) do
Gitlab::Usage::MetricDefinition
.definitions
- .select { |k, v| v.attributes[:data_source] == 'redis_hll' && v.key_path.starts_with?('redis_hll_counters') }
+ .select { |k, v| v.attributes[:data_source] == 'redis_hll' && v.key_path.starts_with?('redis_hll_counters') && v.available? }
.keys
.sort
end
diff --git a/spec/lib/gitlab/usage_data_spec.rb b/spec/lib/gitlab/usage_data_spec.rb
index a70b68a181f..833bf260019 100644
--- a/spec/lib/gitlab/usage_data_spec.rb
+++ b/spec/lib/gitlab/usage_data_spec.rb
@@ -101,11 +101,7 @@ RSpec.describe Gitlab::UsageData, :aggregate_failures do
it 'includes accurate usage_activity_by_stage data' do
for_defined_days_back do
user = create(:user)
- cluster = create(:cluster, user: user)
- create(:clusters_applications_cert_manager, :installed, cluster: cluster)
- create(:clusters_applications_helm, :installed, cluster: cluster)
- create(:clusters_applications_ingress, :installed, cluster: cluster)
- create(:clusters_applications_knative, :installed, cluster: cluster)
+ create(:cluster, user: user)
create(:cluster, :disabled, user: user)
create(:cluster_provider_gcp, :created)
create(:cluster_provider_aws, :created)
@@ -118,10 +114,6 @@ RSpec.describe Gitlab::UsageData, :aggregate_failures do
end
expect(described_class.usage_activity_by_stage_configure({})).to include(
- clusters_applications_cert_managers: 2,
- clusters_applications_helm: 2,
- clusters_applications_ingress: 2,
- clusters_applications_knative: 2,
clusters_management_project: 2,
clusters_disabled: 4,
clusters_enabled: 12,
@@ -136,10 +128,6 @@ RSpec.describe Gitlab::UsageData, :aggregate_failures do
project_clusters_enabled: 10
)
expect(described_class.usage_activity_by_stage_configure(described_class.monthly_time_range_db_params)).to include(
- clusters_applications_cert_managers: 1,
- clusters_applications_helm: 1,
- clusters_applications_ingress: 1,
- clusters_applications_knative: 1,
clusters_management_project: 1,
clusters_disabled: 2,
clusters_enabled: 6,
@@ -392,7 +380,7 @@ RSpec.describe Gitlab::UsageData, :aggregate_failures do
user = create(:user, dashboard: 'operations')
cluster = create(:cluster, user: user)
project = create(:project, creator: user)
- create(:clusters_applications_prometheus, :installed, cluster: cluster)
+ create(:clusters_integrations_prometheus, cluster: cluster)
create(:project_tracing_setting)
create(:project_error_tracking_setting)
create(:incident)
@@ -402,7 +390,7 @@ RSpec.describe Gitlab::UsageData, :aggregate_failures do
expect(described_class.usage_activity_by_stage_monitor({})).to include(
clusters: 2,
- clusters_applications_prometheus: 2,
+ clusters_integrations_prometheus: 2,
operations_dashboard_default_dashboard: 2,
projects_with_tracing_enabled: 2,
projects_with_error_tracking_enabled: 2,
@@ -414,7 +402,7 @@ RSpec.describe Gitlab::UsageData, :aggregate_failures do
data_28_days = described_class.usage_activity_by_stage_monitor(described_class.monthly_time_range_db_params)
expect(data_28_days).to include(
clusters: 1,
- clusters_applications_prometheus: 1,
+ clusters_integrations_prometheus: 1,
operations_dashboard_default_dashboard: 1,
projects_with_tracing_enabled: 1,
projects_with_error_tracking_enabled: 1,
@@ -469,7 +457,8 @@ RSpec.describe Gitlab::UsageData, :aggregate_failures do
for_defined_days_back do
user = create(:user)
create(:deployment, :failed, user: user)
- create(:release, author: user)
+ release = create(:release, author: user)
+ create(:milestone, project: release.project, releases: [release])
create(:deployment, :success, user: user)
end
@@ -477,13 +466,15 @@ RSpec.describe Gitlab::UsageData, :aggregate_failures do
deployments: 2,
failed_deployments: 2,
releases: 2,
- successful_deployments: 2
+ successful_deployments: 2,
+ releases_with_milestones: 2
)
expect(described_class.usage_activity_by_stage_release(described_class.monthly_time_range_db_params)).to include(
deployments: 1,
failed_deployments: 1,
releases: 1,
- successful_deployments: 1
+ successful_deployments: 1,
+ releases_with_milestones: 1
)
end
end
@@ -499,7 +490,6 @@ RSpec.describe Gitlab::UsageData, :aggregate_failures do
create(:ci_pipeline, :repository_source, user: user)
create(:ci_pipeline_schedule, owner: user)
create(:ci_trigger, owner: user)
- create(:clusters_applications_runner, :installed)
end
expect(described_class.usage_activity_by_stage_verify({})).to include(
@@ -510,8 +500,7 @@ RSpec.describe Gitlab::UsageData, :aggregate_failures do
ci_pipeline_config_repository: 2,
ci_pipeline_schedules: 2,
ci_pipelines: 2,
- ci_triggers: 2,
- clusters_applications_runner: 2
+ ci_triggers: 2
)
expect(described_class.usage_activity_by_stage_verify(described_class.monthly_time_range_db_params)).to include(
ci_builds: 1,
@@ -521,8 +510,7 @@ RSpec.describe Gitlab::UsageData, :aggregate_failures do
ci_pipeline_config_repository: 1,
ci_pipeline_schedules: 1,
ci_pipelines: 1,
- ci_triggers: 1,
- clusters_applications_runner: 1
+ ci_triggers: 1
)
end
end
@@ -604,17 +592,9 @@ RSpec.describe Gitlab::UsageData, :aggregate_failures do
expect(count_data[:clusters_platforms_eks]).to eq(1)
expect(count_data[:clusters_platforms_gke]).to eq(1)
expect(count_data[:clusters_platforms_user]).to eq(1)
- expect(count_data[:clusters_applications_helm]).to eq(1)
- expect(count_data[:clusters_applications_ingress]).to eq(1)
- expect(count_data[:clusters_applications_cert_managers]).to eq(1)
- expect(count_data[:clusters_applications_crossplane]).to eq(1)
- expect(count_data[:clusters_applications_prometheus]).to eq(1)
- expect(count_data[:clusters_applications_runner]).to eq(1)
- expect(count_data[:clusters_applications_knative]).to eq(1)
- expect(count_data[:clusters_applications_elastic_stack]).to eq(1)
+ expect(count_data[:clusters_integrations_elastic_stack]).to eq(1)
+ expect(count_data[:clusters_integrations_prometheus]).to eq(1)
expect(count_data[:grafana_integrated_projects]).to eq(2)
- expect(count_data[:clusters_applications_jupyter]).to eq(1)
- expect(count_data[:clusters_applications_cilium]).to eq(1)
expect(count_data[:clusters_management_project]).to eq(1)
expect(count_data[:kubernetes_agents]).to eq(2)
expect(count_data[:kubernetes_agents_with_token]).to eq(1)
@@ -662,13 +642,13 @@ RSpec.describe Gitlab::UsageData, :aggregate_failures do
subject { described_class.data[:counts] }
it 'gathers usage data' do
- expect(subject[:projects_with_expiration_policy_enabled]).to eq 18
+ expect(subject[:projects_with_expiration_policy_enabled]).to eq 19
expect(subject[:projects_with_expiration_policy_disabled]).to eq 5
expect(subject[:projects_with_expiration_policy_enabled_with_keep_n_unset]).to eq 1
expect(subject[:projects_with_expiration_policy_enabled_with_keep_n_set_to_1]).to eq 1
expect(subject[:projects_with_expiration_policy_enabled_with_keep_n_set_to_5]).to eq 1
- expect(subject[:projects_with_expiration_policy_enabled_with_keep_n_set_to_10]).to eq 12
+ expect(subject[:projects_with_expiration_policy_enabled_with_keep_n_set_to_10]).to eq 13
expect(subject[:projects_with_expiration_policy_enabled_with_keep_n_set_to_25]).to eq 1
expect(subject[:projects_with_expiration_policy_enabled_with_keep_n_set_to_50]).to eq 1
@@ -676,9 +656,10 @@ RSpec.describe Gitlab::UsageData, :aggregate_failures do
expect(subject[:projects_with_expiration_policy_enabled_with_older_than_set_to_7d]).to eq 1
expect(subject[:projects_with_expiration_policy_enabled_with_older_than_set_to_14d]).to eq 1
expect(subject[:projects_with_expiration_policy_enabled_with_older_than_set_to_30d]).to eq 1
+ expect(subject[:projects_with_expiration_policy_enabled_with_older_than_set_to_60d]).to eq 1
expect(subject[:projects_with_expiration_policy_enabled_with_older_than_set_to_90d]).to eq 14
- expect(subject[:projects_with_expiration_policy_enabled_with_cadence_set_to_1d]).to eq 14
+ expect(subject[:projects_with_expiration_policy_enabled_with_cadence_set_to_1d]).to eq 15
expect(subject[:projects_with_expiration_policy_enabled_with_cadence_set_to_7d]).to eq 1
expect(subject[:projects_with_expiration_policy_enabled_with_cadence_set_to_14d]).to eq 1
expect(subject[:projects_with_expiration_policy_enabled_with_cadence_set_to_1month]).to eq 1
@@ -743,7 +724,7 @@ RSpec.describe Gitlab::UsageData, :aggregate_failures do
expect(counts_monthly[:projects_with_alerts_created]).to eq(1)
expect(counts_monthly[:projects]).to eq(1)
expect(counts_monthly[:packages]).to eq(1)
- expect(counts_monthly[:promoted_issues]).to eq(1)
+ expect(counts_monthly[:promoted_issues]).to eq(Gitlab::UsageData::DEPRECATED_VALUE)
end
end
@@ -1093,6 +1074,10 @@ RSpec.describe Gitlab::UsageData, :aggregate_failures do
it 'gathers service_ping_features_enabled' do
expect(subject[:settings][:service_ping_features_enabled]).to eq(Gitlab::CurrentSettings.usage_ping_features_enabled)
end
+
+ it 'gathers user_cap_feature_enabled' do
+ expect(subject[:settings][:user_cap_feature_enabled]).to eq(Gitlab::CurrentSettings.new_user_signups_cap)
+ end
end
end
@@ -1438,48 +1423,4 @@ RSpec.describe Gitlab::UsageData, :aggregate_failures do
end
end
end
-
- describe '.snowplow_event_counts' do
- let_it_be(:time_period) { { collector_tstamp: 8.days.ago..1.day.ago } }
-
- context 'when self-monitoring project exists' do
- let_it_be(:project) { create(:project) }
-
- before do
- stub_application_setting(self_monitoring_project: project)
- end
-
- context 'and product_analytics FF is enabled for it' do
- before do
- stub_feature_flags(product_analytics_tracking: true)
-
- create(:product_analytics_event, project: project, se_category: 'epics', se_action: 'promote')
- create(:product_analytics_event, project: project, se_category: 'epics', se_action: 'promote', collector_tstamp: 2.days.ago)
- create(:product_analytics_event, project: project, se_category: 'epics', se_action: 'promote', collector_tstamp: 9.days.ago)
-
- create(:product_analytics_event, project: project, se_category: 'foo', se_action: 'bar', collector_tstamp: 2.days.ago)
- end
-
- it 'returns promoted_issues for the time period' do
- expect(described_class.snowplow_event_counts(time_period)[:promoted_issues]).to eq(1)
- end
- end
-
- context 'and product_analytics FF is disabled' do
- before do
- stub_feature_flags(product_analytics_tracking: false)
- end
-
- it 'returns an empty hash' do
- expect(described_class.snowplow_event_counts(time_period)).to eq({})
- end
- end
- end
-
- context 'when self-monitoring project does not exist' do
- it 'returns an empty hash' do
- expect(described_class.snowplow_event_counts(time_period)).to eq({})
- end
- end
- end
end
diff --git a/spec/lib/gitlab/utils/delegator_override/error_spec.rb b/spec/lib/gitlab/utils/delegator_override/error_spec.rb
new file mode 100644
index 00000000000..59b67676eff
--- /dev/null
+++ b/spec/lib/gitlab/utils/delegator_override/error_spec.rb
@@ -0,0 +1,13 @@
+# frozen_string_literal: true
+
+require 'fast_spec_helper'
+
+RSpec.describe Gitlab::Utils::DelegatorOverride::Error do
+ let(:error) { described_class.new('foo', 'Target', '/path/to/target', 'Delegator', '/path/to/delegator') }
+
+ describe '#to_s' do
+ subject { error.to_s }
+
+ it { is_expected.to eq("Delegator#foo is overriding Target#foo. delegator_location: /path/to/delegator target_location: /path/to/target") }
+ end
+end
diff --git a/spec/lib/gitlab/utils/delegator_override/validator_spec.rb b/spec/lib/gitlab/utils/delegator_override/validator_spec.rb
new file mode 100644
index 00000000000..4cd1b18de82
--- /dev/null
+++ b/spec/lib/gitlab/utils/delegator_override/validator_spec.rb
@@ -0,0 +1,81 @@
+# frozen_string_literal: true
+
+require 'fast_spec_helper'
+
+RSpec.describe Gitlab::Utils::DelegatorOverride::Validator do
+ let(:delegator_class) do
+ Class.new(::SimpleDelegator) do
+ extend(::Gitlab::Utils::DelegatorOverride)
+
+ def foo
+ end
+ end.prepend(ee_delegator_extension)
+ end
+
+ let(:ee_delegator_extension) do
+ Module.new do
+ extend(::Gitlab::Utils::DelegatorOverride)
+
+ def bar
+ end
+ end
+ end
+
+ let(:target_class) do
+ Class.new do
+ def foo
+ end
+
+ def bar
+ end
+ end
+ end
+
+ let(:validator) { described_class.new(delegator_class) }
+
+ describe '#add_allowlist' do
+ it 'adds a method name to the allowlist' do
+ validator.add_allowlist([:foo])
+
+ expect(validator.allowed_method_names).to contain_exactly(:foo)
+ end
+ end
+
+ describe '#add_target' do
+ it 'adds the target class' do
+ validator.add_target(target_class)
+
+ expect(validator.target_classes).to contain_exactly(target_class)
+ end
+ end
+
+ describe '#expand_on_ancestors' do
+ it 'adds the allowlist in the ancestors' do
+ ancestor_validator = described_class.new(ee_delegator_extension)
+ ancestor_validator.add_allowlist([:bar])
+ validator.expand_on_ancestors( { ee_delegator_extension => ancestor_validator })
+
+ expect(validator.allowed_method_names).to contain_exactly(:bar)
+ end
+ end
+
+ describe '#validate_overrides!' do
+ before do
+ validator.add_target(target_class)
+ end
+
+ it 'does not raise an error when the overrides are allowed' do
+ validator.add_allowlist([:foo])
+ ancestor_validator = described_class.new(ee_delegator_extension)
+ ancestor_validator.add_allowlist([:bar])
+ validator.expand_on_ancestors( { ee_delegator_extension => ancestor_validator })
+
+ expect { validator.validate_overrides! }.not_to raise_error
+ end
+
+ it 'raises an error when there is an override' do
+ expect { validator.validate_overrides! }
+ .to raise_error(described_class::UnexpectedDelegatorOverrideError)
+ end
+ end
+end
diff --git a/spec/lib/gitlab/utils/delegator_override_spec.rb b/spec/lib/gitlab/utils/delegator_override_spec.rb
new file mode 100644
index 00000000000..af4c7fa5d8e
--- /dev/null
+++ b/spec/lib/gitlab/utils/delegator_override_spec.rb
@@ -0,0 +1,97 @@
+# frozen_string_literal: true
+
+require 'fast_spec_helper'
+
+RSpec.describe Gitlab::Utils::DelegatorOverride do
+ let(:delegator_class) do
+ Class.new(::SimpleDelegator) do
+ extend(::Gitlab::Utils::DelegatorOverride)
+
+ def foo
+ end
+ end
+ end
+
+ let(:target_class) do
+ Class.new do
+ def foo
+ end
+
+ def bar
+ end
+ end
+ end
+
+ let(:dummy_module) do
+ Module.new do
+ def foobar
+ end
+ end
+ end
+
+ before do
+ stub_env('STATIC_VERIFICATION', 'true')
+ end
+
+ describe '.delegator_target' do
+ subject { delegator_class.delegator_target(target_class) }
+
+ it 'sets the delegator target to the validator' do
+ expect(described_class.validator(delegator_class))
+ .to receive(:add_target).with(target_class)
+
+ subject
+ end
+
+ context 'when the class does not inherit SimpleDelegator' do
+ let(:delegator_class) do
+ Class.new do
+ extend(::Gitlab::Utils::DelegatorOverride)
+ end
+ end
+
+ it 'raises an error' do
+ expect { subject }.to raise_error(ArgumentError, /not a subclass of 'SimpleDelegator' class/)
+ end
+ end
+ end
+
+ describe '.delegator_override' do
+ subject { delegator_class.delegator_override(:foo) }
+
+ it 'adds the method name to the allowlist' do
+ expect(described_class.validator(delegator_class))
+ .to receive(:add_allowlist).with([:foo])
+
+ subject
+ end
+ end
+
+ describe '.delegator_override_with' do
+ subject { delegator_class.delegator_override_with(dummy_module) }
+
+ it 'adds the method names of the module to the allowlist' do
+ expect(described_class.validator(delegator_class))
+ .to receive(:add_allowlist).with([:foobar])
+
+ subject
+ end
+ end
+
+ describe '.verify!' do
+ subject { described_class.verify! }
+
+ it 'does not raise an error when an override is in allowlist' do
+ delegator_class.delegator_target(target_class)
+ delegator_class.delegator_override(:foo)
+
+ expect { subject }.not_to raise_error
+ end
+
+ it 'raises an error when there is an override' do
+ delegator_class.delegator_target(target_class)
+
+ expect { subject }.to raise_error(Gitlab::Utils::DelegatorOverride::Validator::UnexpectedDelegatorOverrideError)
+ end
+ end
+end
diff --git a/spec/lib/gitlab/view/presenter/base_spec.rb b/spec/lib/gitlab/view/presenter/base_spec.rb
index 97d5e2b280d..a7083bd2722 100644
--- a/spec/lib/gitlab/view/presenter/base_spec.rb
+++ b/spec/lib/gitlab/view/presenter/base_spec.rb
@@ -18,11 +18,43 @@ RSpec.describe Gitlab::View::Presenter::Base do
describe '.presents' do
it 'exposes #subject with the given keyword' do
- presenter_class.presents(:foo)
+ presenter_class.presents(Object, as: :foo)
presenter = presenter_class.new(project)
expect(presenter.foo).to eq(project)
end
+
+ it 'raises an error when symbol is passed' do
+ expect { presenter_class.presents(:foo) }.to raise_error(ArgumentError)
+ end
+
+ context 'when the presenter class inherits Presenter::Delegated' do
+ let(:presenter_class) do
+ Class.new(::Gitlab::View::Presenter::Delegated) do
+ include(::Gitlab::View::Presenter::Base)
+ end
+ end
+
+ it 'sets the delegator target' do
+ expect(presenter_class).to receive(:delegator_target).with(Object)
+
+ presenter_class.presents(Object, as: :foo)
+ end
+ end
+
+ context 'when the presenter class inherits Presenter::Simple' do
+ let(:presenter_class) do
+ Class.new(::Gitlab::View::Presenter::Simple) do
+ include(::Gitlab::View::Presenter::Base)
+ end
+ end
+
+ it 'does not set the delegator target' do
+ expect(presenter_class).not_to receive(:delegator_target).with(Object)
+
+ presenter_class.presents(Object, as: :foo)
+ end
+ end
end
describe '#can?' do
diff --git a/spec/lib/gitlab/with_feature_category_spec.rb b/spec/lib/gitlab/with_feature_category_spec.rb
deleted file mode 100644
index b6fe1c84b26..00000000000
--- a/spec/lib/gitlab/with_feature_category_spec.rb
+++ /dev/null
@@ -1,69 +0,0 @@
-# frozen_string_literal: true
-
-require 'fast_spec_helper'
-require_relative "../../../lib/gitlab/with_feature_category"
-
-RSpec.describe Gitlab::WithFeatureCategory do
- describe ".feature_category_for_action" do
- let(:base_controller) do
- Class.new do
- include ::Gitlab::WithFeatureCategory
- end
- end
-
- let(:controller) do
- Class.new(base_controller) do
- feature_category :foo, %w(update edit)
- feature_category :bar, %w(index show)
- feature_category :quux, %w(destroy)
- end
- end
-
- let(:subclass) do
- Class.new(controller) do
- feature_category :baz, %w(subclass_index)
- end
- end
-
- it "is nil when nothing was defined" do
- expect(base_controller.feature_category_for_action("hello")).to be_nil
- end
-
- it "returns the expected category", :aggregate_failures do
- expect(controller.feature_category_for_action("update")).to eq(:foo)
- expect(controller.feature_category_for_action("index")).to eq(:bar)
- expect(controller.feature_category_for_action("destroy")).to eq(:quux)
- end
-
- it "returns the expected category for categories defined in subclasses" do
- expect(subclass.feature_category_for_action("subclass_index")).to eq(:baz)
- end
-
- it "raises an error when defining for the controller and for individual actions" do
- expect do
- Class.new(base_controller) do
- feature_category :hello
- feature_category :goodbye, [:world]
- end
- end.to raise_error(ArgumentError, "hello is defined for all actions, but other categories are set")
- end
-
- it "raises an error when multiple calls define the same action" do
- expect do
- Class.new(base_controller) do
- feature_category :hello, [:world]
- feature_category :goodbye, ["world"]
- end
- end.to raise_error(ArgumentError, "Actions have multiple feature categories: world")
- end
-
- it "does not raise an error when multiple calls define the same action and feature category" do
- expect do
- Class.new(base_controller) do
- feature_category :hello, [:world]
- feature_category :hello, ["world"]
- end
- end.not_to raise_error
- end
- end
-end
diff --git a/spec/lib/gitlab/workhorse_spec.rb b/spec/lib/gitlab/workhorse_spec.rb
index 09f90a3e5b6..8ba56af561d 100644
--- a/spec/lib/gitlab/workhorse_spec.rb
+++ b/spec/lib/gitlab/workhorse_spec.rb
@@ -244,13 +244,15 @@ RSpec.describe Gitlab::Workhorse do
GitalyServer: {
features: { 'gitaly-feature-enforce-requests-limits' => 'true' },
address: Gitlab::GitalyClient.address('default'),
- token: Gitlab::GitalyClient.token('default')
+ token: Gitlab::GitalyClient.token('default'),
+ sidechannel: false
}
}
end
before do
allow(Gitlab.config.gitaly).to receive(:enabled).and_return(true)
+ stub_feature_flags(workhorse_use_sidechannel: false)
end
it 'includes a Repository param' do
@@ -332,6 +334,46 @@ RSpec.describe Gitlab::Workhorse do
it { expect { subject }.to raise_exception('Unsupported action: download') }
end
+
+ context 'when workhorse_use_sidechannel flag is set' do
+ context 'when a feature flag is set globally' do
+ before do
+ stub_feature_flags(workhorse_use_sidechannel: true)
+ end
+
+ it 'sets the flag to true' do
+ response = described_class.git_http_ok(repository, Gitlab::GlRepository::PROJECT, user, action)
+
+ expect(response.dig(:GitalyServer, :sidechannel)).to eq(true)
+ end
+ end
+
+ context 'when a feature flag is set for a single project' do
+ before do
+ stub_feature_flags(workhorse_use_sidechannel: project)
+ end
+
+ it 'sets the flag to true for that project' do
+ response = described_class.git_http_ok(repository, Gitlab::GlRepository::PROJECT, user, action)
+
+ expect(response.dig(:GitalyServer, :sidechannel)).to eq(true)
+ end
+
+ it 'sets the flag to false for other projects' do
+ other_project = create(:project, :public, :repository)
+ response = described_class.git_http_ok(other_project.repository, Gitlab::GlRepository::PROJECT, user, action)
+
+ expect(response.dig(:GitalyServer, :sidechannel)).to eq(false)
+ end
+
+ it 'sets the flag to false when there is no project' do
+ snippet = create(:personal_snippet, :repository)
+ response = described_class.git_http_ok(snippet.repository, Gitlab::GlRepository::SNIPPET, user, action)
+
+ expect(response.dig(:GitalyServer, :sidechannel)).to eq(false)
+ end
+ end
+ end
end
context 'when receive_max_input_size has been updated' do
diff --git a/spec/lib/gitlab/x509/certificate_spec.rb b/spec/lib/gitlab/x509/certificate_spec.rb
new file mode 100644
index 00000000000..a5b192dd051
--- /dev/null
+++ b/spec/lib/gitlab/x509/certificate_spec.rb
@@ -0,0 +1,116 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::X509::Certificate do
+ include SmimeHelper
+
+ # cert generation is an expensive operation and they are used read-only,
+ # so we share them as instance variables in all tests
+ before :context do
+ @root_ca = generate_root
+ @intermediate_ca = generate_intermediate(signer_ca: @root_ca)
+ @cert = generate_cert(signer_ca: @intermediate_ca)
+ end
+
+ describe 'testing environment setup' do
+ describe 'generate_root' do
+ subject { @root_ca }
+
+ it 'generates a root CA that expires a long way in the future' do
+ expect(subject[:cert].not_after).to be > 999.years.from_now
+ end
+ end
+
+ describe 'generate_intermediate' do
+ subject { @intermediate_ca }
+
+ it 'generates an intermediate CA that expires a long way in the future' do
+ expect(subject[:cert].not_after).to be > 999.years.from_now
+ end
+
+ it 'generates an intermediate CA properly signed by the root CA' do
+ expect(subject[:cert].issuer).to eq(@root_ca[:cert].subject)
+ end
+ end
+
+ describe 'generate_cert' do
+ subject { @cert }
+
+ it 'generates a cert properly signed by the intermediate CA' do
+ expect(subject[:cert].issuer).to eq(@intermediate_ca[:cert].subject)
+ end
+
+ it 'generates a cert that expires soon' do
+ expect(subject[:cert].not_after).to be < 60.minutes.from_now
+ end
+
+ it 'generates a cert intended for email signing' do
+ expect(subject[:cert].extensions).to include(an_object_having_attributes(oid: 'extendedKeyUsage', value: match('E-mail Protection')))
+ end
+
+ context 'passing in INFINITE_EXPIRY' do
+ subject { generate_cert(signer_ca: @intermediate_ca, expires_in: SmimeHelper::INFINITE_EXPIRY) }
+
+ it 'generates a cert that expires a long way in the future' do
+ expect(subject[:cert].not_after).to be > 999.years.from_now
+ end
+ end
+ end
+ end
+
+ describe '.from_strings' do
+ it 'parses correctly a certificate and key' do
+ parsed_cert = described_class.from_strings(@cert[:key].to_s, @cert[:cert].to_pem)
+
+ common_cert_tests(parsed_cert, @cert, @intermediate_ca)
+ end
+ end
+
+ describe '.from_files' do
+ it 'parses correctly a certificate and key' do
+ stub_file_read('a_key', content: @cert[:key].to_s)
+ stub_file_read('a_cert', content: @cert[:cert].to_pem)
+
+ parsed_cert = described_class.from_files('a_key', 'a_cert')
+
+ common_cert_tests(parsed_cert, @cert, @intermediate_ca)
+ end
+
+ context 'with optional ca_certs' do
+ it 'parses correctly certificate, key and ca_certs' do
+ stub_file_read('a_key', content: @cert[:key].to_s)
+ stub_file_read('a_cert', content: @cert[:cert].to_pem)
+ stub_file_read('a_ca_cert', content: @intermediate_ca[:cert].to_pem)
+
+ parsed_cert = described_class.from_files('a_key', 'a_cert', 'a_ca_cert')
+
+ common_cert_tests(parsed_cert, @cert, @intermediate_ca, with_ca_certs: [@intermediate_ca[:cert]])
+ end
+ end
+ end
+
+ context 'with no intermediate CA' do
+ it 'parses correctly a certificate and key' do
+ cert = generate_cert(signer_ca: @root_ca)
+
+ stub_file_read('a_key', content: cert[:key].to_s)
+ stub_file_read('a_cert', content: cert[:cert].to_pem)
+
+ parsed_cert = described_class.from_files('a_key', 'a_cert')
+
+ common_cert_tests(parsed_cert, cert, @root_ca)
+ end
+ end
+
+ def common_cert_tests(parsed_cert, cert, signer_ca, with_ca_certs: nil)
+ expect(parsed_cert.cert).to be_a(OpenSSL::X509::Certificate)
+ expect(parsed_cert.cert.subject).to eq(cert[:cert].subject)
+ expect(parsed_cert.cert.issuer).to eq(signer_ca[:cert].subject)
+ expect(parsed_cert.cert.not_before).to eq(cert[:cert].not_before)
+ expect(parsed_cert.cert.not_after).to eq(cert[:cert].not_after)
+ expect(parsed_cert.cert.extensions).to include(an_object_having_attributes(oid: 'extendedKeyUsage', value: match('E-mail Protection')))
+ expect(parsed_cert.key).to be_a(OpenSSL::PKey::RSA)
+ expect(parsed_cert.ca_certs).to match_array(Array.wrap(with_ca_certs)) if with_ca_certs
+ end
+end
diff --git a/spec/lib/peek/views/active_record_spec.rb b/spec/lib/peek/views/active_record_spec.rb
index 6d50922904e..c89f6a21b35 100644
--- a/spec/lib/peek/views/active_record_spec.rb
+++ b/spec/lib/peek/views/active_record_spec.rb
@@ -53,154 +53,82 @@ RSpec.describe Peek::Views::ActiveRecord, :request_store do
allow(connection_primary_2).to receive(:transaction_open?).and_return(true)
allow(connection_unknown).to receive(:transaction_open?).and_return(false)
allow(::Gitlab::Database).to receive(:db_config_name).and_return('the_db_config_name')
+
+ allow(Gitlab::Database::LoadBalancing).to receive(:db_role_for_connection).with(connection_replica).and_return(:replica)
+ allow(Gitlab::Database::LoadBalancing).to receive(:db_role_for_connection).with(connection_primary_1).and_return(:primary)
+ allow(Gitlab::Database::LoadBalancing).to receive(:db_role_for_connection).with(connection_primary_2).and_return(:primary)
+ allow(Gitlab::Database::LoadBalancing).to receive(:db_role_for_connection).with(connection_unknown).and_return(nil)
end
- context 'when database load balancing is not enabled' do
- it 'subscribes and store data into peek views' do
- Timecop.freeze(2021, 2, 23, 10, 0) do
- ActiveSupport::Notifications.publish('sql.active_record', Time.current, Time.current + 1.second, '1', event_1)
- ActiveSupport::Notifications.publish('sql.active_record', Time.current, Time.current + 2.seconds, '2', event_2)
- ActiveSupport::Notifications.publish('sql.active_record', Time.current, Time.current + 3.seconds, '3', event_3)
- ActiveSupport::Notifications.publish('sql.active_record', Time.current, Time.current + 4.seconds, '4', event_4)
- end
+ it 'includes db role data and db_config_name name' do
+ Timecop.freeze(2021, 2, 23, 10, 0) do
+ ActiveSupport::Notifications.publish('sql.active_record', Time.current, Time.current + 1.second, '1', event_1)
+ ActiveSupport::Notifications.publish('sql.active_record', Time.current, Time.current + 2.seconds, '2', event_2)
+ ActiveSupport::Notifications.publish('sql.active_record', Time.current, Time.current + 3.seconds, '3', event_3)
+ ActiveSupport::Notifications.publish('sql.active_record', Time.current, Time.current + 4.seconds, '4', event_4)
+ end
- expect(subject.results).to match(
- calls: 4,
- summary: {
- "Cached" => 1,
- "In a transaction" => 1
- },
- duration: '10000.00ms',
- warnings: ["active-record duration: 10000.0 over 3000"],
- details: contain_exactly(
- a_hash_including(
- start: be_a(Time),
- cached: '',
- transaction: '',
- duration: 1000.0,
- sql: 'SELECT * FROM users WHERE id = 10',
- db_config_name: "Config name: the_db_config_name"
- ),
- a_hash_including(
- start: be_a(Time),
- cached: 'Cached',
- transaction: '',
- duration: 2000.0,
- sql: 'SELECT * FROM users WHERE id = 10',
- db_config_name: "Config name: the_db_config_name"
- ),
- a_hash_including(
- start: be_a(Time),
- cached: '',
- transaction: 'In a transaction',
- duration: 3000.0,
- sql: 'UPDATE users SET admin = true WHERE id = 10',
- db_config_name: "Config name: the_db_config_name"
- ),
- a_hash_including(
- start: be_a(Time),
- cached: '',
- transaction: '',
- duration: 4000.0,
- sql: 'SELECT VERSION()',
- db_config_name: "Config name: the_db_config_name"
- )
+ expect(subject.results).to match(
+ calls: 4,
+ summary: {
+ "Cached" => 1,
+ "In a transaction" => 1,
+ "Role: Primary" => 2,
+ "Role: Replica" => 1,
+ "Role: Unknown" => 1
+ },
+ duration: '10000.00ms',
+ warnings: ["active-record duration: 10000.0 over 3000"],
+ details: contain_exactly(
+ a_hash_including(
+ start: be_a(Time),
+ cached: '',
+ transaction: '',
+ duration: 1000.0,
+ sql: 'SELECT * FROM users WHERE id = 10',
+ db_role: 'Role: Primary',
+ db_config_name: "Config name: the_db_config_name"
+ ),
+ a_hash_including(
+ start: be_a(Time),
+ cached: 'Cached',
+ transaction: '',
+ duration: 2000.0,
+ sql: 'SELECT * FROM users WHERE id = 10',
+ db_role: 'Role: Replica',
+ db_config_name: "Config name: the_db_config_name"
+ ),
+ a_hash_including(
+ start: be_a(Time),
+ cached: '',
+ transaction: 'In a transaction',
+ duration: 3000.0,
+ sql: 'UPDATE users SET admin = true WHERE id = 10',
+ db_role: 'Role: Primary',
+ db_config_name: "Config name: the_db_config_name"
+ ),
+ a_hash_including(
+ start: be_a(Time),
+ cached: '',
+ transaction: '',
+ duration: 4000.0,
+ sql: 'SELECT VERSION()',
+ db_role: 'Role: Unknown',
+ db_config_name: "Config name: the_db_config_name"
)
)
- end
-
- context 'when the GITLAB_MULTIPLE_DATABASE_METRICS env var is disabled' do
- before do
- stub_env('GITLAB_MULTIPLE_DATABASE_METRICS', nil)
- end
-
- it 'does not include db_config_name field' do
- ActiveSupport::Notifications.publish('sql.active_record', Time.current, Time.current + 1.second, '1', event_1)
-
- expect(subject.results[:details][0][:db_config_name]).to be_nil
- end
- end
+ )
end
- context 'when database load balancing is enabled' do
+ context 'when the GITLAB_MULTIPLE_DATABASE_METRICS env var is disabled' do
before do
- allow(Gitlab::Database::LoadBalancing).to receive(:enable?).and_return(true)
- allow(Gitlab::Database::LoadBalancing).to receive(:db_role_for_connection).with(connection_replica).and_return(:replica)
- allow(Gitlab::Database::LoadBalancing).to receive(:db_role_for_connection).with(connection_primary_1).and_return(:primary)
- allow(Gitlab::Database::LoadBalancing).to receive(:db_role_for_connection).with(connection_primary_2).and_return(:primary)
- allow(Gitlab::Database::LoadBalancing).to receive(:db_role_for_connection).with(connection_unknown).and_return(nil)
+ stub_env('GITLAB_MULTIPLE_DATABASE_METRICS', nil)
end
- it 'includes db role data and db_config_name name' do
- Timecop.freeze(2021, 2, 23, 10, 0) do
- ActiveSupport::Notifications.publish('sql.active_record', Time.current, Time.current + 1.second, '1', event_1)
- ActiveSupport::Notifications.publish('sql.active_record', Time.current, Time.current + 2.seconds, '2', event_2)
- ActiveSupport::Notifications.publish('sql.active_record', Time.current, Time.current + 3.seconds, '3', event_3)
- ActiveSupport::Notifications.publish('sql.active_record', Time.current, Time.current + 4.seconds, '4', event_4)
- end
-
- expect(subject.results).to match(
- calls: 4,
- summary: {
- "Cached" => 1,
- "In a transaction" => 1,
- "Role: Primary" => 2,
- "Role: Replica" => 1,
- "Role: Unknown" => 1
- },
- duration: '10000.00ms',
- warnings: ["active-record duration: 10000.0 over 3000"],
- details: contain_exactly(
- a_hash_including(
- start: be_a(Time),
- cached: '',
- transaction: '',
- duration: 1000.0,
- sql: 'SELECT * FROM users WHERE id = 10',
- db_role: 'Role: Primary',
- db_config_name: "Config name: the_db_config_name"
- ),
- a_hash_including(
- start: be_a(Time),
- cached: 'Cached',
- transaction: '',
- duration: 2000.0,
- sql: 'SELECT * FROM users WHERE id = 10',
- db_role: 'Role: Replica',
- db_config_name: "Config name: the_db_config_name"
- ),
- a_hash_including(
- start: be_a(Time),
- cached: '',
- transaction: 'In a transaction',
- duration: 3000.0,
- sql: 'UPDATE users SET admin = true WHERE id = 10',
- db_role: 'Role: Primary',
- db_config_name: "Config name: the_db_config_name"
- ),
- a_hash_including(
- start: be_a(Time),
- cached: '',
- transaction: '',
- duration: 4000.0,
- sql: 'SELECT VERSION()',
- db_role: 'Role: Unknown',
- db_config_name: "Config name: the_db_config_name"
- )
- )
- )
- end
-
- context 'when the GITLAB_MULTIPLE_DATABASE_METRICS env var is disabled' do
- before do
- stub_env('GITLAB_MULTIPLE_DATABASE_METRICS', nil)
- end
-
- it 'does not include db_config_name field' do
- ActiveSupport::Notifications.publish('sql.active_record', Time.current, Time.current + 1.second, '1', event_1)
+ it 'does not include db_config_name field' do
+ ActiveSupport::Notifications.publish('sql.active_record', Time.current, Time.current + 1.second, '1', event_1)
- expect(subject.results[:details][0][:db_config_name]).to be_nil
- end
+ expect(subject.results[:details][0][:db_config_name]).to be_nil
end
end
end
diff --git a/spec/lib/rouge/formatters/html_gitlab_spec.rb b/spec/lib/rouge/formatters/html_gitlab_spec.rb
index d45c8c2a8c5..4bc9b256dce 100644
--- a/spec/lib/rouge/formatters/html_gitlab_spec.rb
+++ b/spec/lib/rouge/formatters/html_gitlab_spec.rb
@@ -4,7 +4,7 @@ require 'spec_helper'
RSpec.describe Rouge::Formatters::HTMLGitlab do
describe '#format' do
- subject { described_class.format(tokens, options) }
+ subject { described_class.format(tokens, **options) }
let(:lang) { 'ruby' }
let(:lexer) { Rouge::Lexer.find_fancy(lang) }
diff --git a/spec/lib/sidebars/groups/menus/scope_menu_spec.rb b/spec/lib/sidebars/groups/menus/scope_menu_spec.rb
new file mode 100644
index 00000000000..4b77a09117a
--- /dev/null
+++ b/spec/lib/sidebars/groups/menus/scope_menu_spec.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Sidebars::Groups::Menus::ScopeMenu do
+ let(:group) { build(:group) }
+ let(:user) { group.owner }
+ let(:context) { Sidebars::Groups::Context.new(current_user: user, container: group) }
+
+ describe '#extra_nav_link_html_options' do
+ subject { described_class.new(context).extra_nav_link_html_options }
+
+ specify { is_expected.to match(hash_including(class: 'context-header has-tooltip', title: context.group.name)) }
+ end
+end
diff --git a/spec/lib/sidebars/projects/menus/scope_menu_spec.rb b/spec/lib/sidebars/projects/menus/scope_menu_spec.rb
index 5040ef9b0ff..980ab2f7c71 100644
--- a/spec/lib/sidebars/projects/menus/scope_menu_spec.rb
+++ b/spec/lib/sidebars/projects/menus/scope_menu_spec.rb
@@ -12,4 +12,10 @@ RSpec.describe Sidebars::Projects::Menus::ScopeMenu do
specify { is_expected.to match(hash_including(class: 'shortcuts-project rspec-project-link')) }
end
+
+ describe '#extra_nav_link_html_options' do
+ subject { described_class.new(context).extra_nav_link_html_options }
+
+ specify { is_expected.to match(hash_including(class: 'context-header has-tooltip', title: context.project.name)) }
+ end
end
diff --git a/spec/migrations/20190924152703_migrate_issue_trackers_data_spec.rb b/spec/migrations/20190924152703_migrate_issue_trackers_data_spec.rb
deleted file mode 100644
index dad95760306..00000000000
--- a/spec/migrations/20190924152703_migrate_issue_trackers_data_spec.rb
+++ /dev/null
@@ -1,64 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-require_migration!('migrate_issue_trackers_data')
-
-RSpec.describe MigrateIssueTrackersData do
- let(:services) { table(:services) }
- let(:migration_class) { Gitlab::BackgroundMigration::MigrateIssueTrackersSensitiveData }
- let(:migration_name) { migration_class.to_s.demodulize }
-
- let(:properties) do
- {
- 'url' => 'http://example.com'
- }
- end
-
- let!(:jira_integration) do
- services.create!(type: 'JiraService', properties: properties, category: 'issue_tracker')
- end
-
- let!(:jira_integration_nil) do
- services.create!(type: 'JiraService', properties: nil, category: 'issue_tracker')
- end
-
- let!(:bugzilla_integration) do
- services.create!(type: 'BugzillaService', properties: properties, category: 'issue_tracker')
- end
-
- let!(:youtrack_integration) do
- services.create!(type: 'YoutrackService', properties: properties, category: 'issue_tracker')
- end
-
- let!(:youtrack_integration_empty) do
- services.create!(type: 'YoutrackService', properties: '', category: 'issue_tracker')
- end
-
- let!(:gitlab_service) do
- services.create!(type: 'GitlabIssueTrackerService', properties: properties, category: 'issue_tracker')
- end
-
- let!(:gitlab_service_empty) do
- services.create!(type: 'GitlabIssueTrackerService', properties: {}, category: 'issue_tracker')
- end
-
- let!(:other_service) do
- services.create!(type: 'OtherService', properties: properties, category: 'other_category')
- end
-
- before do
- stub_const("#{described_class}::BATCH_SIZE", 2)
- end
-
- it 'schedules background migrations at correct time' do
- Sidekiq::Testing.fake! do
- freeze_time do
- migrate!
-
- expect(migration_name).to be_scheduled_delayed_migration(3.minutes, jira_integration.id, bugzilla_integration.id)
- expect(migration_name).to be_scheduled_delayed_migration(6.minutes, youtrack_integration.id, gitlab_service.id)
- expect(BackgroundMigrationWorker.jobs.size).to eq(2)
- end
- end
- end
-end
diff --git a/spec/migrations/20191015154408_drop_merge_requests_require_code_owner_approval_from_projects_spec.rb b/spec/migrations/20191015154408_drop_merge_requests_require_code_owner_approval_from_projects_spec.rb
deleted file mode 100644
index 731bc923910..00000000000
--- a/spec/migrations/20191015154408_drop_merge_requests_require_code_owner_approval_from_projects_spec.rb
+++ /dev/null
@@ -1,56 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-require_migration!('drop_merge_requests_require_code_owner_approval_from_projects')
-
-RSpec.describe DropMergeRequestsRequireCodeOwnerApprovalFromProjects do
- let(:projects_table) { table(:projects) }
-
- subject(:migration) { described_class.new }
-
- describe "without running the migration" do
- it "project_table has a :merge_requests_require_code_owner_approval column" do
- expect(projects_table.column_names)
- .to include("merge_requests_require_code_owner_approval")
- end
-
- it "project_table has a :projects_requiring_code_owner_approval index" do
- expect(ActiveRecord::Base.connection.indexes(:projects).collect(&:name))
- .to include("projects_requiring_code_owner_approval")
- end
- end
-
- describe '#up' do
- context "without running "
- before do
- migrate!
- end
-
- it "drops the :merge_requests_require_code_owner_approval column" do
- expect(projects_table.column_names)
- .not_to include("merge_requests_require_code_owner_approval")
- end
-
- it "drops the :projects_requiring_code_owner_approval index" do
- expect(ActiveRecord::Base.connection.indexes(:projects).collect(&:name))
- .not_to include("projects_requiring_code_owner_approval")
- end
- end
-
- describe "#down" do
- before do
- migration.up
- migration.down
- end
-
- it "project_table has a :merge_requests_require_code_owner_approval column" do
- expect(projects_table.column_names)
- .to include("merge_requests_require_code_owner_approval")
- end
-
- it "project_table has a :projects_requiring_code_owner_approval index" do
- expect(ActiveRecord::Base.connection.indexes(:projects).collect(&:name))
- .to include("projects_requiring_code_owner_approval")
- end
- end
-end
diff --git a/spec/migrations/20191125114345_add_admin_mode_protected_path_spec.rb b/spec/migrations/20191125114345_add_admin_mode_protected_path_spec.rb
deleted file mode 100644
index 222a000c134..00000000000
--- a/spec/migrations/20191125114345_add_admin_mode_protected_path_spec.rb
+++ /dev/null
@@ -1,49 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-require_migration!('add_admin_mode_protected_path')
-
-RSpec.describe AddAdminModeProtectedPath do
- subject(:migration) { described_class.new }
-
- let(:admin_mode_endpoint) { '/admin/session' }
- let(:application_settings) { table(:application_settings) }
-
- context 'no settings available' do
- it 'makes no changes' do
- expect { migrate! }.not_to change { application_settings.count }
- end
- end
-
- context 'protected_paths is null' do
- before do
- application_settings.create!(protected_paths: nil)
- end
-
- it 'makes no changes' do
- expect { migrate! }.not_to change { application_settings.first.protected_paths }
- end
- end
-
- it 'appends admin mode endpoint' do
- application_settings.create!(protected_paths: '{a,b,c}')
-
- protected_paths_before = %w[a b c]
- protected_paths_after = protected_paths_before.dup << admin_mode_endpoint
-
- expect { migrate! }.to change { application_settings.first.protected_paths }.from(protected_paths_before).to(protected_paths_after)
- end
-
- it 'new default includes admin mode endpoint' do
- settings_before = application_settings.create!
-
- expect(settings_before.protected_paths).not_to include(admin_mode_endpoint)
-
- migrate!
-
- application_settings.reset_column_information
- settings_after = application_settings.create!
-
- expect(settings_after.protected_paths).to include(admin_mode_endpoint)
- end
-end
diff --git a/spec/migrations/20191204114127_delete_legacy_triggers_spec.rb b/spec/migrations/20191204114127_delete_legacy_triggers_spec.rb
deleted file mode 100644
index aba3a902888..00000000000
--- a/spec/migrations/20191204114127_delete_legacy_triggers_spec.rb
+++ /dev/null
@@ -1,23 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-require_migration!('delete_legacy_triggers')
-
-RSpec.describe DeleteLegacyTriggers, schema: 2019_11_25_140458 do
- let(:ci_trigger_table) { table(:ci_triggers) }
- let(:user) { table(:users).create!(name: 'test', email: 'test@example.com', projects_limit: 1) }
-
- before do
- @trigger_with_user = ci_trigger_table.create!(owner_id: user.id)
- ci_trigger_table.create!(owner_id: nil)
- ci_trigger_table.create!(owner_id: nil)
- end
-
- it 'removes legacy triggers which has null owner_id' do
- expect do
- migrate!
- end.to change(ci_trigger_table, :count).by(-2)
-
- expect(ci_trigger_table.all).to eq([@trigger_with_user])
- end
-end
diff --git a/spec/migrations/20210906130643_drop_temporary_columns_and_triggers_for_taggings_spec.rb b/spec/migrations/20210906130643_drop_temporary_columns_and_triggers_for_taggings_spec.rb
new file mode 100644
index 00000000000..2e7ce733373
--- /dev/null
+++ b/spec/migrations/20210906130643_drop_temporary_columns_and_triggers_for_taggings_spec.rb
@@ -0,0 +1,23 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+require_migration!('drop_temporary_columns_and_triggers_for_taggings')
+
+RSpec.describe DropTemporaryColumnsAndTriggersForTaggings do
+ let(:taggings_table) { table(:taggings) }
+
+ it 'correctly migrates up and down' do
+ reversible_migration do |migration|
+ migration.before -> {
+ expect(taggings_table.column_names).to include('id_convert_to_bigint')
+ expect(taggings_table.column_names).to include('taggable_id_convert_to_bigint')
+ }
+
+ migration.after -> {
+ taggings_table.reset_column_information
+ expect(taggings_table.column_names).not_to include('id_convert_to_bigint')
+ expect(taggings_table.column_names).not_to include('taggable_id_convert_to_bigint')
+ }
+ end
+ end
+end
diff --git a/spec/migrations/20210907013944_cleanup_bigint_conversion_for_ci_builds_metadata_spec.rb b/spec/migrations/20210907013944_cleanup_bigint_conversion_for_ci_builds_metadata_spec.rb
new file mode 100644
index 00000000000..ece5ed8251d
--- /dev/null
+++ b/spec/migrations/20210907013944_cleanup_bigint_conversion_for_ci_builds_metadata_spec.rb
@@ -0,0 +1,23 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+require_migration!('cleanup_bigint_conversion_for_ci_builds_metadata')
+
+RSpec.describe CleanupBigintConversionForCiBuildsMetadata do
+ let(:ci_builds_metadata) { table(:ci_builds_metadata) }
+
+ it 'correctly migrates up and down' do
+ reversible_migration do |migration|
+ migration.before -> {
+ expect(ci_builds_metadata.column_names).to include('id_convert_to_bigint')
+ expect(ci_builds_metadata.column_names).to include('build_id_convert_to_bigint')
+ }
+
+ migration.after -> {
+ ci_builds_metadata.reset_column_information
+ expect(ci_builds_metadata.column_names).not_to include('id_convert_to_bigint')
+ expect(ci_builds_metadata.column_names).not_to include('build_id_convert_to_bigint')
+ }
+ end
+ end
+end
diff --git a/spec/migrations/20210910194952_update_report_type_for_existing_approval_project_rules_spec.rb b/spec/migrations/20210910194952_update_report_type_for_existing_approval_project_rules_spec.rb
new file mode 100644
index 00000000000..46a6d8d92ec
--- /dev/null
+++ b/spec/migrations/20210910194952_update_report_type_for_existing_approval_project_rules_spec.rb
@@ -0,0 +1,48 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+require_migration!('update_report_type_for_existing_approval_project_rules')
+
+RSpec.describe UpdateReportTypeForExistingApprovalProjectRules, :migration do
+ using RSpec::Parameterized::TableSyntax
+
+ let(:group) { table(:namespaces).create!(name: 'user', path: 'user') }
+ let(:project) { table(:projects).create!(namespace_id: group.id) }
+ let(:approval_project_rule) { table(:approval_project_rules).create!(name: rule_name, rule_type: rule_type, project_id: project.id) }
+ let(:rule_type) { 2 }
+ let(:rule_name) { 'Vulnerability-Check' }
+
+ context 'with rule_type set to :report_approver' do
+ where(:rule_name, :report_type) do
+ [
+ ['Vulnerability-Check', 1],
+ ['License-Check', 2],
+ ['Coverage-Check', 3]
+ ]
+ end
+
+ with_them do
+ context "with names associated with report type" do
+ it 'updates report_type' do
+ expect { migrate! }.to change { approval_project_rule.reload.report_type }.from(nil).to(report_type)
+ end
+ end
+ end
+ end
+
+ context 'with rule_type set to another value (e.g., :regular)' do
+ let(:rule_type) { 0 }
+
+ it 'does not update report_type' do
+ expect { migrate! }.not_to change { approval_project_rule.reload.report_type }
+ end
+ end
+
+ context 'with the rule name set to another value (e.g., Test Rule)' do
+ let(:rule_name) { 'Test Rule'}
+
+ it 'does not update report_type' do
+ expect { migrate! }.not_to change { approval_project_rule.reload.report_type }
+ end
+ end
+end
diff --git a/spec/migrations/20210915022415_cleanup_bigint_conversion_for_ci_builds_spec.rb b/spec/migrations/20210915022415_cleanup_bigint_conversion_for_ci_builds_spec.rb
new file mode 100644
index 00000000000..ee71322433d
--- /dev/null
+++ b/spec/migrations/20210915022415_cleanup_bigint_conversion_for_ci_builds_spec.rb
@@ -0,0 +1,23 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+require_migration!('cleanup_bigint_conversion_for_ci_builds')
+
+RSpec.describe CleanupBigintConversionForCiBuilds do
+ let(:ci_builds) { table(:ci_builds) }
+
+ it 'correctly migrates up and down' do
+ reversible_migration do |migration|
+ migration.before -> {
+ expect(ci_builds.column_names).to include('id_convert_to_bigint')
+ expect(ci_builds.column_names).to include('stage_id_convert_to_bigint')
+ }
+
+ migration.after -> {
+ ci_builds.reset_column_information
+ expect(ci_builds.column_names).not_to include('id_convert_to_bigint')
+ expect(ci_builds.column_names).not_to include('stage_id_convert_to_bigint')
+ }
+ end
+ end
+end
diff --git a/spec/migrations/20210918201050_remove_old_pending_jobs_for_recalculate_vulnerabilities_occurrences_uuid_spec.rb b/spec/migrations/20210918201050_remove_old_pending_jobs_for_recalculate_vulnerabilities_occurrences_uuid_spec.rb
new file mode 100644
index 00000000000..9addaaf2551
--- /dev/null
+++ b/spec/migrations/20210918201050_remove_old_pending_jobs_for_recalculate_vulnerabilities_occurrences_uuid_spec.rb
@@ -0,0 +1,45 @@
+# frozen_string_literal: true
+require 'spec_helper'
+require Rails.root.join('db', 'post_migrate', '20210918201050_remove_old_pending_jobs_for_recalculate_vulnerabilities_occurrences_uuid.rb')
+
+def create_background_migration_jobs(ids, status, created_at)
+ proper_status = case status
+ when :pending
+ Gitlab::Database::BackgroundMigrationJob.statuses['pending']
+ when :succeeded
+ Gitlab::Database::BackgroundMigrationJob.statuses['succeeded']
+ else
+ raise ArgumentError
+ end
+
+ background_migration_jobs.create!(
+ class_name: 'RecalculateVulnerabilitiesOccurrencesUuid',
+ arguments: Array(ids),
+ status: proper_status,
+ created_at: created_at
+ )
+end
+
+RSpec.describe RemoveOldPendingJobsForRecalculateVulnerabilitiesOccurrencesUuid, :migration do
+ let_it_be(:background_migration_jobs) { table(:background_migration_jobs) }
+ let_it_be(:before_target_date) { -Float::INFINITY..(DateTime.new(2021, 8, 17, 23, 59, 59)) }
+ let_it_be(:after_target_date) { (DateTime.new(2021, 8, 18, 0, 0, 0))..Float::INFINITY }
+
+ context 'when old RecalculateVulnerabilitiesOccurrencesUuid jobs are pending' do
+ before do
+ create_background_migration_jobs([1, 2, 3], :succeeded, DateTime.new(2021, 5, 5, 0, 2))
+ create_background_migration_jobs([4, 5, 6], :pending, DateTime.new(2021, 5, 5, 0, 4))
+
+ create_background_migration_jobs([1, 2, 3], :succeeded, DateTime.new(2021, 8, 18, 0, 0))
+ create_background_migration_jobs([4, 5, 6], :pending, DateTime.new(2021, 8, 18, 0, 2))
+ create_background_migration_jobs([7, 8, 9], :pending, DateTime.new(2021, 8, 18, 0, 4))
+ end
+
+ it 'removes old, pending jobs' do
+ migrate!
+
+ expect(background_migration_jobs.where(created_at: before_target_date).count).to eq(1)
+ expect(background_migration_jobs.where(created_at: after_target_date).count).to eq(3)
+ end
+ end
+end
diff --git a/spec/migrations/20210918202855_reschedule_pending_jobs_for_recalculate_vulnerabilities_occurrences_uuid_spec.rb b/spec/migrations/20210918202855_reschedule_pending_jobs_for_recalculate_vulnerabilities_occurrences_uuid_spec.rb
new file mode 100644
index 00000000000..5a2531bb63f
--- /dev/null
+++ b/spec/migrations/20210918202855_reschedule_pending_jobs_for_recalculate_vulnerabilities_occurrences_uuid_spec.rb
@@ -0,0 +1,30 @@
+# frozen_string_literal: true
+require 'spec_helper'
+require Rails.root.join('db', 'post_migrate', '20210918202855_reschedule_pending_jobs_for_recalculate_vulnerabilities_occurrences_uuid.rb')
+
+RSpec.describe ReschedulePendingJobsForRecalculateVulnerabilitiesOccurrencesUuid, :migration do
+ let_it_be(:background_migration_jobs) { table(:background_migration_jobs) }
+
+ context 'when RecalculateVulnerabilitiesOccurrencesUuid jobs are pending' do
+ before do
+ background_migration_jobs.create!(
+ class_name: 'RecalculateVulnerabilitiesOccurrencesUuid',
+ arguments: [1, 2, 3],
+ status: Gitlab::Database::BackgroundMigrationJob.statuses['pending']
+ )
+ background_migration_jobs.create!(
+ class_name: 'RecalculateVulnerabilitiesOccurrencesUuid',
+ arguments: [4, 5, 6],
+ status: Gitlab::Database::BackgroundMigrationJob.statuses['succeeded']
+ )
+ end
+
+ it 'queues pending jobs' do
+ migrate!
+
+ expect(BackgroundMigrationWorker.jobs.length).to eq(1)
+ expect(BackgroundMigrationWorker.jobs[0]['args']).to eq(['RecalculateVulnerabilitiesOccurrencesUuid', [1, 2, 3]])
+ expect(BackgroundMigrationWorker.jobs[0]['at']).to be_nil
+ end
+ end
+end
diff --git a/spec/migrations/20210922021816_drop_int4_columns_for_ci_job_artifacts_spec.rb b/spec/migrations/20210922021816_drop_int4_columns_for_ci_job_artifacts_spec.rb
new file mode 100644
index 00000000000..cf326cf0c0a
--- /dev/null
+++ b/spec/migrations/20210922021816_drop_int4_columns_for_ci_job_artifacts_spec.rb
@@ -0,0 +1,23 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+require_migration!('drop_int4_columns_for_ci_job_artifacts')
+
+RSpec.describe DropInt4ColumnsForCiJobArtifacts do
+ let(:ci_job_artifacts) { table(:ci_job_artifacts) }
+
+ it 'correctly migrates up and down' do
+ reversible_migration do |migration|
+ migration.before -> {
+ expect(ci_job_artifacts.column_names).to include('id_convert_to_bigint')
+ expect(ci_job_artifacts.column_names).to include('job_id_convert_to_bigint')
+ }
+
+ migration.after -> {
+ ci_job_artifacts.reset_column_information
+ expect(ci_job_artifacts.column_names).not_to include('id_convert_to_bigint')
+ expect(ci_job_artifacts.column_names).not_to include('job_id_convert_to_bigint')
+ }
+ end
+ end
+end
diff --git a/spec/migrations/20210922025631_drop_int4_column_for_ci_sources_pipelines_spec.rb b/spec/migrations/20210922025631_drop_int4_column_for_ci_sources_pipelines_spec.rb
new file mode 100644
index 00000000000..00b922ee4f8
--- /dev/null
+++ b/spec/migrations/20210922025631_drop_int4_column_for_ci_sources_pipelines_spec.rb
@@ -0,0 +1,21 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+require_migration!('drop_int4_column_for_ci_sources_pipelines')
+
+RSpec.describe DropInt4ColumnForCiSourcesPipelines do
+ let(:ci_sources_pipelines) { table(:ci_sources_pipelines) }
+
+ it 'correctly migrates up and down' do
+ reversible_migration do |migration|
+ migration.before -> {
+ expect(ci_sources_pipelines.column_names).to include('source_job_id_convert_to_bigint')
+ }
+
+ migration.after -> {
+ ci_sources_pipelines.reset_column_information
+ expect(ci_sources_pipelines.column_names).not_to include('source_job_id_convert_to_bigint')
+ }
+ end
+ end
+end
diff --git a/spec/migrations/20210922082019_drop_int4_column_for_events_spec.rb b/spec/migrations/20210922082019_drop_int4_column_for_events_spec.rb
new file mode 100644
index 00000000000..412556fc283
--- /dev/null
+++ b/spec/migrations/20210922082019_drop_int4_column_for_events_spec.rb
@@ -0,0 +1,21 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+require_migration!('drop_int4_column_for_events')
+
+RSpec.describe DropInt4ColumnForEvents do
+ let(:events) { table(:events) }
+
+ it 'correctly migrates up and down' do
+ reversible_migration do |migration|
+ migration.before -> {
+ expect(events.column_names).to include('id_convert_to_bigint')
+ }
+
+ migration.after -> {
+ events.reset_column_information
+ expect(events.column_names).not_to include('id_convert_to_bigint')
+ }
+ end
+ end
+end
diff --git a/spec/migrations/20210922091402_drop_int4_column_for_push_event_payloads_spec.rb b/spec/migrations/20210922091402_drop_int4_column_for_push_event_payloads_spec.rb
new file mode 100644
index 00000000000..2b286e3e5e0
--- /dev/null
+++ b/spec/migrations/20210922091402_drop_int4_column_for_push_event_payloads_spec.rb
@@ -0,0 +1,21 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+require_migration!('drop_int4_column_for_push_event_payloads')
+
+RSpec.describe DropInt4ColumnForPushEventPayloads do
+ let(:push_event_payloads) { table(:push_event_payloads) }
+
+ it 'correctly migrates up and down' do
+ reversible_migration do |migration|
+ migration.before -> {
+ expect(push_event_payloads.column_names).to include('event_id_convert_to_bigint')
+ }
+
+ migration.after -> {
+ push_event_payloads.reset_column_information
+ expect(push_event_payloads.column_names).not_to include('event_id_convert_to_bigint')
+ }
+ end
+ end
+end
diff --git a/spec/migrations/20211006060436_schedule_populate_topics_total_projects_count_cache_spec.rb b/spec/migrations/20211006060436_schedule_populate_topics_total_projects_count_cache_spec.rb
new file mode 100644
index 00000000000..d07d9a71b06
--- /dev/null
+++ b/spec/migrations/20211006060436_schedule_populate_topics_total_projects_count_cache_spec.rb
@@ -0,0 +1,29 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+require_migration!('schedule_populate_topics_total_projects_count_cache')
+
+RSpec.describe SchedulePopulateTopicsTotalProjectsCountCache do
+ let(:topics) { table(:topics) }
+ let!(:topic_1) { topics.create!(name: 'Topic1') }
+ let!(:topic_2) { topics.create!(name: 'Topic2') }
+ let!(:topic_3) { topics.create!(name: 'Topic3') }
+
+ describe '#up' do
+ before do
+ stub_const("#{described_class}::BATCH_SIZE", 2)
+ end
+
+ it 'schedules BackfillProjectsWithCoverage background jobs', :aggregate_failures do
+ Sidekiq::Testing.fake! do
+ freeze_time do
+ migrate!
+
+ expect(described_class::MIGRATION).to be_scheduled_delayed_migration(2.minutes, topic_1.id, topic_2.id)
+ expect(described_class::MIGRATION).to be_scheduled_delayed_migration(4.minutes, topic_3.id, topic_3.id)
+ expect(BackgroundMigrationWorker.jobs.size).to eq(2)
+ end
+ end
+ end
+ end
+end
diff --git a/spec/migrations/add_default_and_free_plans_spec.rb b/spec/migrations/add_default_and_free_plans_spec.rb
deleted file mode 100644
index 7256e4928af..00000000000
--- a/spec/migrations/add_default_and_free_plans_spec.rb
+++ /dev/null
@@ -1,34 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-require_migration!('add_default_and_free_plans')
-
-RSpec.describe AddDefaultAndFreePlans do
- describe 'migrate' do
- let(:plans) { table(:plans) }
-
- context 'when on Gitlab.com' do
- before do
- expect(Gitlab).to receive(:com?) { true }
- end
-
- it 'creates free and default plans' do
- expect { migrate! }.to change { plans.count }.by 2
-
- expect(plans.last(2).pluck(:name)).to eq %w[free default]
- end
- end
-
- context 'when on self-hosted' do
- before do
- expect(Gitlab).to receive(:com?) { false }
- end
-
- it 'creates only a default plan' do
- expect { migrate! }.to change { plans.count }.by 1
-
- expect(plans.last.name).to eq 'default'
- end
- end
- end
-end
diff --git a/spec/migrations/add_unique_constraint_to_approvals_user_id_and_merge_request_id_spec.rb b/spec/migrations/add_unique_constraint_to_approvals_user_id_and_merge_request_id_spec.rb
deleted file mode 100644
index 795de51d387..00000000000
--- a/spec/migrations/add_unique_constraint_to_approvals_user_id_and_merge_request_id_spec.rb
+++ /dev/null
@@ -1,57 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-require_migration!
-
-RSpec.describe AddUniqueConstraintToApprovalsUserIdAndMergeRequestId do
- let(:migration) { described_class.new }
- let(:namespaces) { table(:namespaces) }
- let(:projects) { table(:projects) }
- let(:merge_requests) { table(:merge_requests) }
- let(:approvals) { table(:approvals) }
-
- describe '#up' do
- before do
- namespaces.create!(id: 1, name: 'ns', path: 'ns')
- projects.create!(id: 1, namespace_id: 1)
- merge_requests.create!(id: 1, target_branch: 'master', source_branch: 'feature-1', target_project_id: 1)
- merge_requests.create!(id: 2, target_branch: 'master', source_branch: 'feature-2', target_project_id: 1)
- end
-
- it 'deletes duplicate records and keeps the first one' do
- first_approval = approvals.create!(id: 1, merge_request_id: 1, user_id: 1)
- approvals.create!(id: 2, merge_request_id: 1, user_id: 1)
-
- migration.up
-
- expect(approvals.all.to_a).to contain_exactly(first_approval)
- end
-
- it 'does not delete unique records' do
- unique_approvals = [
- approvals.create(id: 1, merge_request_id: 1, user_id: 1),
- approvals.create(id: 2, merge_request_id: 1, user_id: 2),
- approvals.create(id: 3, merge_request_id: 2, user_id: 1)
- ]
-
- migration.up
-
- expect(approvals.all.to_a).to contain_exactly(*unique_approvals)
- end
-
- it 'creates unique index' do
- migration.up
-
- expect(migration.index_exists?(:approvals, [:user_id, :merge_request_id], unique: true)).to be_truthy
- end
- end
-
- describe '#down' do
- it 'removes unique index' do
- migration.up
- migration.down
-
- expect(migration.index_exists?(:approvals, [:user_id, :merge_request_id], unique: true)).to be_falsey
- end
- end
-end
diff --git a/spec/migrations/backfill_and_add_not_null_constraint_to_released_at_column_on_releases_table_spec.rb b/spec/migrations/backfill_and_add_not_null_constraint_to_released_at_column_on_releases_table_spec.rb
deleted file mode 100644
index ea6599fc122..00000000000
--- a/spec/migrations/backfill_and_add_not_null_constraint_to_released_at_column_on_releases_table_spec.rb
+++ /dev/null
@@ -1,28 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-require_migration!
-
-RSpec.describe BackfillAndAddNotNullConstraintToReleasedAtColumnOnReleasesTable do
- let(:releases) { table(:releases) }
- let(:namespaces) { table(:namespaces) }
- let(:projects) { table(:projects) }
-
- subject(:migration) { described_class.new }
-
- it 'fills released_at with the value of created_at' do
- created_at_a = Time.zone.parse('2019-02-10T08:00:00Z')
- created_at_b = Time.zone.parse('2019-03-10T18:00:00Z')
- namespace = namespaces.create!(name: 'foo', path: 'foo')
- project = projects.create!(namespace_id: namespace.id)
- release_a = releases.create!(project_id: project.id, created_at: created_at_a)
- release_b = releases.create!(project_id: project.id, created_at: created_at_b)
-
- disable_migrations_output { migration.up }
-
- release_a.reload
- release_b.reload
- expect(release_a.released_at).to eq(created_at_a)
- expect(release_b.released_at).to eq(created_at_b)
- end
-end
diff --git a/spec/migrations/backfill_operations_feature_flags_active_spec.rb b/spec/migrations/backfill_operations_feature_flags_active_spec.rb
deleted file mode 100644
index a28f648c75a..00000000000
--- a/spec/migrations/backfill_operations_feature_flags_active_spec.rb
+++ /dev/null
@@ -1,52 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-require_migration!
-
-RSpec.describe BackfillOperationsFeatureFlagsActive do
- let(:namespaces) { table(:namespaces) }
- let(:projects) { table(:projects) }
- let(:flags) { table(:operations_feature_flags) }
-
- def setup
- namespace = namespaces.create!(name: 'foo', path: 'foo')
- projects.create!(namespace_id: namespace.id)
- end
-
- it 'executes successfully when there are no flags in the table' do
- setup
-
- disable_migrations_output { migrate! }
-
- expect(flags.count).to eq(0)
- end
-
- it 'updates active to true' do
- project = setup
- flag = flags.create!(project_id: project.id, name: 'test_flag', active: false)
-
- disable_migrations_output { migrate! }
-
- expect(flag.reload.active).to eq(true)
- end
-
- it 'updates active to true for multiple flags' do
- project = setup
- flag_a = flags.create!(project_id: project.id, name: 'test_flag', active: false)
- flag_b = flags.create!(project_id: project.id, name: 'other_flag', active: false)
-
- disable_migrations_output { migrate! }
-
- expect(flag_a.reload.active).to eq(true)
- expect(flag_b.reload.active).to eq(true)
- end
-
- it 'leaves active true if it is already true' do
- project = setup
- flag = flags.create!(project_id: project.id, name: 'test_flag', active: true)
-
- disable_migrations_output { migrate! }
-
- expect(flag.reload.active).to eq(true)
- end
-end
diff --git a/spec/migrations/backfill_releases_table_updated_at_and_add_not_null_constraints_to_timestamps_spec.rb b/spec/migrations/backfill_releases_table_updated_at_and_add_not_null_constraints_to_timestamps_spec.rb
deleted file mode 100644
index 6e8bcfc050d..00000000000
--- a/spec/migrations/backfill_releases_table_updated_at_and_add_not_null_constraints_to_timestamps_spec.rb
+++ /dev/null
@@ -1,57 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-require_migration!
-
-RSpec.describe BackfillReleasesTableUpdatedAtAndAddNotNullConstraintsToTimestamps do
- let(:releases) { table(:releases) }
- let(:namespaces) { table(:namespaces) }
- let(:projects) { table(:projects) }
-
- subject(:migration) { described_class.new }
-
- it 'fills null updated_at rows with the value of created_at' do
- created_at_a = Time.zone.parse('2014-03-11T04:30:00Z')
- created_at_b = Time.zone.parse('2019-09-10T12:00:00Z')
- namespace = namespaces.create!(name: 'foo', path: 'foo')
- project = projects.create!(namespace_id: namespace.id)
- release_a = releases.create!(project_id: project.id,
- released_at: Time.zone.parse('2014-12-10T06:00:00Z'),
- created_at: created_at_a)
- release_b = releases.create!(project_id: project.id,
- released_at: Time.zone.parse('2019-09-11T06:00:00Z'),
- created_at: created_at_b)
- release_a.update!(updated_at: nil)
- release_b.update!(updated_at: nil)
-
- disable_migrations_output { migrate! }
-
- release_a.reload
- release_b.reload
- expect(release_a.updated_at).to eq(created_at_a)
- expect(release_b.updated_at).to eq(created_at_b)
- end
-
- it 'does not change updated_at columns with a value' do
- created_at_a = Time.zone.parse('2014-03-11T04:30:00Z')
- updated_at_a = Time.zone.parse('2015-01-16T10:00:00Z')
- created_at_b = Time.zone.parse('2019-09-10T12:00:00Z')
- namespace = namespaces.create!(name: 'foo', path: 'foo')
- project = projects.create!(namespace_id: namespace.id)
- release_a = releases.create!(project_id: project.id,
- released_at: Time.zone.parse('2014-12-10T06:00:00Z'),
- created_at: created_at_a,
- updated_at: updated_at_a)
- release_b = releases.create!(project_id: project.id,
- released_at: Time.zone.parse('2019-09-11T06:00:00Z'),
- created_at: created_at_b)
- release_b.update!(updated_at: nil)
-
- disable_migrations_output { migrate! }
-
- release_a.reload
- release_b.reload
- expect(release_a.updated_at).to eq(updated_at_a)
- expect(release_b.updated_at).to eq(created_at_b)
- end
-end
diff --git a/spec/migrations/backport_enterprise_schema_spec.rb b/spec/migrations/backport_enterprise_schema_spec.rb
deleted file mode 100644
index de6821001b4..00000000000
--- a/spec/migrations/backport_enterprise_schema_spec.rb
+++ /dev/null
@@ -1,41 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-require_migration!
-
-RSpec.describe BackportEnterpriseSchema, schema: 20190329085614 do
- include MigrationsHelpers
-
- def drop_if_exists(table)
- active_record_base.connection.drop_table(table) if active_record_base.connection.table_exists?(table)
- end
-
- describe '#up' do
- it 'creates new EE tables' do
- migrate!
-
- expect(active_record_base.connection.table_exists?(:epics)).to be true
- expect(active_record_base.connection.table_exists?(:geo_nodes)).to be true
- end
-
- context 'missing EE columns' do
- before do
- drop_if_exists(:epics)
-
- active_record_base.connection.create_table "epics" do |t|
- t.integer :group_id, null: false, index: true
- t.integer :author_id, null: false, index: true
- end
- end
-
- after do
- drop_if_exists(:epics)
- end
-
- it 'flags an error' do
- expect { migrate! }.to raise_error(/Your database is missing.*that is present for GitLab EE/)
- end
- end
- end
-end
diff --git a/spec/migrations/change_outbound_local_requests_whitelist_default_spec.rb b/spec/migrations/change_outbound_local_requests_whitelist_default_spec.rb
deleted file mode 100644
index 24e6f3480f9..00000000000
--- a/spec/migrations/change_outbound_local_requests_whitelist_default_spec.rb
+++ /dev/null
@@ -1,21 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-require_migration!
-
-RSpec.describe ChangeOutboundLocalRequestsWhitelistDefault do
- let(:application_settings) { table(:application_settings) }
-
- it 'defaults to empty array' do
- setting = application_settings.create!
- setting_with_value = application_settings.create!(outbound_local_requests_whitelist: '{a,b}')
-
- expect(application_settings.where(outbound_local_requests_whitelist: nil).count).to eq(1)
-
- migrate!
-
- expect(application_settings.where(outbound_local_requests_whitelist: nil).count).to eq(0)
- expect(setting.reload.outbound_local_requests_whitelist).to eq([])
- expect(setting_with_value.reload.outbound_local_requests_whitelist).to eq(%w[a b])
- end
-end
diff --git a/spec/migrations/change_packages_size_defaults_in_project_statistics_spec.rb b/spec/migrations/change_packages_size_defaults_in_project_statistics_spec.rb
deleted file mode 100644
index 5e3118b0dea..00000000000
--- a/spec/migrations/change_packages_size_defaults_in_project_statistics_spec.rb
+++ /dev/null
@@ -1,35 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-require_migration!
-
-RSpec.describe ChangePackagesSizeDefaultsInProjectStatistics do
- let(:project_statistics) { table(:project_statistics) }
- let(:projects) { table(:projects) }
-
- it 'removes null packages_size' do
- stats_to_migrate = 10
-
- stats_to_migrate.times do |i|
- p = projects.create!(name: "project #{i}", namespace_id: 1)
- project_statistics.create!(project_id: p.id, namespace_id: p.namespace_id)
- end
-
- expect { migrate! }
- .to change { ProjectStatistics.where(packages_size: nil).count }
- .from(stats_to_migrate)
- .to(0)
- end
-
- it 'defaults packages_size to 0' do
- project = projects.create!(name: 'a new project', namespace_id: 2)
- stat = project_statistics.create!(project_id: project.id, namespace_id: project.namespace_id)
-
- expect(stat.packages_size).to be_nil
-
- migrate!
-
- stat.reload
- expect(stat.packages_size).to eq(0)
- end
-end
diff --git a/spec/migrations/clean_up_noteable_id_for_notes_on_commits_spec.rb b/spec/migrations/clean_up_noteable_id_for_notes_on_commits_spec.rb
deleted file mode 100644
index 8de30af13fd..00000000000
--- a/spec/migrations/clean_up_noteable_id_for_notes_on_commits_spec.rb
+++ /dev/null
@@ -1,34 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-require_migration!
-
-RSpec.describe CleanUpNoteableIdForNotesOnCommits do
- let(:notes) { table(:notes) }
-
- before do
- notes.create!(noteable_type: 'Commit', commit_id: '3d0a182204cece4857f81c6462720e0ad1af39c9', noteable_id: 3, note: 'Test')
- notes.create!(noteable_type: 'Commit', commit_id: '3d0a182204cece4857f81c6462720e0ad1af39c9', noteable_id: 3, note: 'Test')
- notes.create!(noteable_type: 'Commit', commit_id: '3d0a182204cece4857f81c6462720e0ad1af39c9', noteable_id: 3, note: 'Test')
-
- notes.create!(noteable_type: 'Issue', noteable_id: 1, note: 'Test')
- notes.create!(noteable_type: 'MergeRequest', noteable_id: 1, note: 'Test')
- notes.create!(noteable_type: 'Snippet', noteable_id: 1, note: 'Test')
- end
-
- it 'clears noteable_id for notes on commits' do
- expect { migrate! }.to change { dirty_notes_on_commits.count }.from(3).to(0)
- end
-
- it 'does not clear noteable_id for other notes' do
- expect { migrate! }.not_to change { other_notes.count }
- end
-
- def dirty_notes_on_commits
- notes.where(noteable_type: 'Commit').where.not(noteable_id: nil)
- end
-
- def other_notes
- notes.where("noteable_type != 'Commit' AND noteable_id IS NOT NULL")
- end
-end
diff --git a/spec/migrations/cleanup_legacy_artifact_migration_spec.rb b/spec/migrations/cleanup_legacy_artifact_migration_spec.rb
deleted file mode 100644
index 6362965cc31..00000000000
--- a/spec/migrations/cleanup_legacy_artifact_migration_spec.rb
+++ /dev/null
@@ -1,52 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-require_migration!('cleanup_legacy_artifact_migration')
-
-RSpec.describe CleanupLegacyArtifactMigration, :redis do
- let(:migration) { spy('migration') }
-
- context 'when still legacy artifacts exist' do
- let(:namespaces) { table(:namespaces) }
- let(:projects) { table(:projects) }
- let(:pipelines) { table(:ci_pipelines) }
- let(:jobs) { table(:ci_builds) }
- let(:job_artifacts) { table(:ci_job_artifacts) }
- let(:namespace) { namespaces.create!(name: 'gitlab', path: 'gitlab-org') }
- let(:project) { projects.create!(name: 'gitlab', path: 'gitlab-ce', namespace_id: namespace.id) }
- let(:pipeline) { pipelines.create!(project_id: project.id, ref: 'master', sha: 'adf43c3a') }
- let(:archive_file_type) { Gitlab::BackgroundMigration::MigrateLegacyArtifacts::ARCHIVE_FILE_TYPE }
- let(:metadata_file_type) { Gitlab::BackgroundMigration::MigrateLegacyArtifacts::METADATA_FILE_TYPE }
- let(:local_store) { ::ObjectStorage::Store::LOCAL }
- let(:remote_store) { ::ObjectStorage::Store::REMOTE }
- let(:legacy_location) { Gitlab::BackgroundMigration::MigrateLegacyArtifacts::LEGACY_PATH_FILE_LOCATION }
-
- before do
- jobs.create!(id: 1, commit_id: pipeline.id, project_id: project.id, status: :success, artifacts_file: 'archive.zip')
- jobs.create!(id: 2, commit_id: pipeline.id, project_id: project.id, status: :failed, artifacts_metadata: 'metadata.gz')
- jobs.create!(id: 3, commit_id: pipeline.id, project_id: project.id, status: :failed, artifacts_file: 'archive.zip', artifacts_metadata: 'metadata.gz')
- jobs.create!(id: 4, commit_id: pipeline.id, project_id: project.id, status: :running)
- jobs.create!(id: 5, commit_id: pipeline.id, project_id: project.id, status: :success, artifacts_file: 'archive.zip', artifacts_file_store: remote_store, artifacts_metadata: 'metadata.gz')
- jobs.create!(id: 6, commit_id: pipeline.id, project_id: project.id, status: :failed, artifacts_file: 'archive.zip', artifacts_metadata: 'metadata.gz')
- end
-
- it 'steals sidekiq jobs from MigrateLegacyArtifacts background migration' do
- expect(Gitlab::BackgroundMigration).to receive(:steal).with('MigrateLegacyArtifacts')
-
- migrate!
- end
-
- it 'migrates legacy artifacts to ci_job_artifacts table' do
- migrate!
-
- expect(job_artifacts.order(:job_id, :file_type).pluck('project_id, job_id, file_type, file_store, size, expire_at, file, file_sha256, file_location'))
- .to eq([[project.id, 1, archive_file_type, local_store, nil, nil, 'archive.zip', nil, legacy_location],
- [project.id, 3, archive_file_type, local_store, nil, nil, 'archive.zip', nil, legacy_location],
- [project.id, 3, metadata_file_type, local_store, nil, nil, 'metadata.gz', nil, legacy_location],
- [project.id, 5, archive_file_type, remote_store, nil, nil, 'archive.zip', nil, legacy_location],
- [project.id, 5, metadata_file_type, local_store, nil, nil, 'metadata.gz', nil, legacy_location],
- [project.id, 6, archive_file_type, local_store, nil, nil, 'archive.zip', nil, legacy_location],
- [project.id, 6, metadata_file_type, local_store, nil, nil, 'metadata.gz', nil, legacy_location]])
- end
- end
-end
diff --git a/spec/migrations/drop_project_ci_cd_settings_merge_trains_enabled_spec.rb b/spec/migrations/drop_project_ci_cd_settings_merge_trains_enabled_spec.rb
deleted file mode 100644
index 3093cd85ced..00000000000
--- a/spec/migrations/drop_project_ci_cd_settings_merge_trains_enabled_spec.rb
+++ /dev/null
@@ -1,21 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-require_migration!
-
-RSpec.describe DropProjectCiCdSettingsMergeTrainsEnabled do
- let!(:project_ci_cd_setting) { table(:project_ci_cd_settings) }
-
- it 'correctly migrates up and down' do
- reversible_migration do |migration|
- migration.before -> {
- expect(project_ci_cd_setting.column_names).to include("merge_trains_enabled")
- }
-
- migration.after -> {
- project_ci_cd_setting.reset_column_information
- expect(project_ci_cd_setting.column_names).not_to include("merge_trains_enabled")
- }
- end
- end
-end
diff --git a/spec/migrations/encrypt_feature_flags_clients_tokens_spec.rb b/spec/migrations/encrypt_feature_flags_clients_tokens_spec.rb
deleted file mode 100644
index 62bd0dafb8e..00000000000
--- a/spec/migrations/encrypt_feature_flags_clients_tokens_spec.rb
+++ /dev/null
@@ -1,36 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-require_migration!
-
-RSpec.describe EncryptFeatureFlagsClientsTokens do
- let(:migration) { described_class.new }
- let(:feature_flags_clients) { table(:operations_feature_flags_clients) }
- let(:projects) { table(:projects) }
- let(:plaintext) { "secret-token" }
- let(:ciphertext) { Gitlab::CryptoHelper.aes256_gcm_encrypt(plaintext, nonce: Gitlab::CryptoHelper::AES256_GCM_IV_STATIC) }
-
- describe '#up' do
- it 'keeps plaintext token the same and populates token_encrypted if not present' do
- project = projects.create!(id: 123, name: 'gitlab1', path: 'gitlab1', namespace_id: 123)
- feature_flags_client = feature_flags_clients.create!(project_id: project.id, token: plaintext)
-
- migration.up
-
- expect(feature_flags_client.reload.token).to eq(plaintext)
- expect(feature_flags_client.reload.token_encrypted).to eq(ciphertext)
- end
- end
-
- describe '#down' do
- it 'decrypts encrypted token and saves it' do
- project = projects.create!(id: 123, name: 'gitlab1', path: 'gitlab1', namespace_id: 123)
- feature_flags_client = feature_flags_clients.create!(project_id: project.id, token_encrypted: ciphertext)
-
- migration.down
-
- expect(feature_flags_client.reload.token).to eq(plaintext)
- expect(feature_flags_client.reload.token_encrypted).to eq(ciphertext)
- end
- end
-end
diff --git a/spec/migrations/encrypt_plaintext_attributes_on_application_settings_spec.rb b/spec/migrations/encrypt_plaintext_attributes_on_application_settings_spec.rb
deleted file mode 100644
index 2e233816b8b..00000000000
--- a/spec/migrations/encrypt_plaintext_attributes_on_application_settings_spec.rb
+++ /dev/null
@@ -1,58 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-require_migration!
-
-RSpec.describe EncryptPlaintextAttributesOnApplicationSettings do
- let(:migration) { described_class.new }
- let(:application_settings) { table(:application_settings) }
- let(:plaintext) { 'secret-token' }
-
- plaintext_attributes = %w[
- akismet_api_key
- elasticsearch_aws_secret_access_key
- recaptcha_private_key
- recaptcha_site_key
- slack_app_secret
- slack_app_verification_token
- ].freeze
-
- describe '#up' do
- it 'encrypts token and saves it' do
- application_setting = application_settings.create!
- application_setting.update_columns(
- plaintext_attributes.each_with_object({}) do |plaintext_attribute, attributes|
- attributes[plaintext_attribute] = plaintext
- end
- )
-
- migration.up
-
- application_setting.reload
- plaintext_attributes.each do |plaintext_attribute|
- expect(application_setting[plaintext_attribute]).not_to be_nil
- expect(application_setting["encrypted_#{plaintext_attribute}"]).not_to be_nil
- expect(application_setting["encrypted_#{plaintext_attribute}_iv"]).not_to be_nil
- end
- end
- end
-
- describe '#down' do
- it 'decrypts encrypted token and saves it' do
- application_setting = application_settings.create!(
- plaintext_attributes.each_with_object({}) do |plaintext_attribute, attributes|
- attributes[plaintext_attribute] = plaintext
- end
- )
-
- migration.down
-
- application_setting.reload
- plaintext_attributes.each do |plaintext_attribute|
- expect(application_setting[plaintext_attribute]).to eq(plaintext)
- expect(application_setting["encrypted_#{plaintext_attribute}"]).to be_nil
- expect(application_setting["encrypted_#{plaintext_attribute}_iv"]).to be_nil
- end
- end
- end
-end
diff --git a/spec/migrations/enqueue_reset_merge_status_second_run_spec.rb b/spec/migrations/enqueue_reset_merge_status_second_run_spec.rb
deleted file mode 100644
index 49698f60964..00000000000
--- a/spec/migrations/enqueue_reset_merge_status_second_run_spec.rb
+++ /dev/null
@@ -1,52 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-require_migration!
-
-RSpec.describe EnqueueResetMergeStatusSecondRun do
- let(:namespaces) { table(:namespaces) }
- let(:projects) { table(:projects) }
- let(:namespace) { namespaces.create!(name: 'gitlab', path: 'gitlab-org') }
- let(:project) { projects.create!(namespace_id: namespace.id, name: 'foo') }
- let(:merge_requests) { table(:merge_requests) }
-
- def create_merge_request(id, extra_params = {})
- params = {
- id: id,
- target_project_id: project.id,
- target_branch: 'master',
- source_project_id: project.id,
- source_branch: 'mr name',
- title: "mr name#{id}"
- }.merge(extra_params)
-
- merge_requests.create!(params)
- end
-
- it 'correctly schedules background migrations' do
- create_merge_request(1, state: 'opened', merge_status: 'can_be_merged')
- create_merge_request(2, state: 'opened', merge_status: 'can_be_merged')
- create_merge_request(3, state: 'opened', merge_status: 'can_be_merged')
- create_merge_request(4, state: 'merged', merge_status: 'can_be_merged')
- create_merge_request(5, state: 'opened', merge_status: 'unchecked')
-
- stub_const("#{described_class.name}::BATCH_SIZE", 2)
-
- Sidekiq::Testing.fake! do
- freeze_time do
- migrate!
-
- expect(described_class::MIGRATION)
- .to be_scheduled_delayed_migration(5.minutes, 1, 2)
-
- expect(described_class::MIGRATION)
- .to be_scheduled_delayed_migration(10.minutes, 3, 4)
-
- expect(described_class::MIGRATION)
- .to be_scheduled_delayed_migration(15.minutes, 5, 5)
-
- expect(BackgroundMigrationWorker.jobs.size).to eq(3)
- end
- end
- end
-end
diff --git a/spec/migrations/enqueue_reset_merge_status_spec.rb b/spec/migrations/enqueue_reset_merge_status_spec.rb
deleted file mode 100644
index d62c99b80bc..00000000000
--- a/spec/migrations/enqueue_reset_merge_status_spec.rb
+++ /dev/null
@@ -1,52 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-require_migration!
-
-RSpec.describe EnqueueResetMergeStatus do
- let(:namespaces) { table(:namespaces) }
- let(:projects) { table(:projects) }
- let(:namespace) { namespaces.create!(name: 'gitlab', path: 'gitlab-org') }
- let(:project) { projects.create!(namespace_id: namespace.id, name: 'foo') }
- let(:merge_requests) { table(:merge_requests) }
-
- def create_merge_request(id, extra_params = {})
- params = {
- id: id,
- target_project_id: project.id,
- target_branch: 'master',
- source_project_id: project.id,
- source_branch: 'mr name',
- title: "mr name#{id}"
- }.merge(extra_params)
-
- merge_requests.create!(params)
- end
-
- it 'correctly schedules background migrations' do
- create_merge_request(1, state: 'opened', merge_status: 'can_be_merged')
- create_merge_request(2, state: 'opened', merge_status: 'can_be_merged')
- create_merge_request(3, state: 'opened', merge_status: 'can_be_merged')
- create_merge_request(4, state: 'merged', merge_status: 'can_be_merged')
- create_merge_request(5, state: 'opened', merge_status: 'unchecked')
-
- stub_const("#{described_class.name}::BATCH_SIZE", 2)
-
- Sidekiq::Testing.fake! do
- freeze_time do
- migrate!
-
- expect(described_class::MIGRATION)
- .to be_scheduled_delayed_migration(5.minutes, 1, 2)
-
- expect(described_class::MIGRATION)
- .to be_scheduled_delayed_migration(10.minutes, 3, 4)
-
- expect(described_class::MIGRATION)
- .to be_scheduled_delayed_migration(15.minutes, 5, 5)
-
- expect(BackgroundMigrationWorker.jobs.size).to eq(3)
- end
- end
- end
-end
diff --git a/spec/migrations/fill_productivity_analytics_start_date_spec.rb b/spec/migrations/fill_productivity_analytics_start_date_spec.rb
deleted file mode 100644
index b348067a752..00000000000
--- a/spec/migrations/fill_productivity_analytics_start_date_spec.rb
+++ /dev/null
@@ -1,39 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-require_migration!
-
-RSpec.describe FillProductivityAnalyticsStartDate do
- let(:settings_table) { table('application_settings') }
- let(:metrics_table) { table('merge_request_metrics') }
-
- before do
- settings_table.create!
- end
-
- context 'with NO productivity analytics data available' do
- it 'sets start_date to NOW' do
- expect { migrate! }.to change {
- settings_table.first&.productivity_analytics_start_date
- }.to(be_like_time(Time.now))
- end
- end
-
- context 'with productivity analytics data available' do
- before do
- ActiveRecord::Base.transaction do
- ActiveRecord::Base.connection.execute('ALTER TABLE merge_request_metrics DISABLE TRIGGER ALL')
- metrics_table.create!(merged_at: Time.parse('2019-09-09'), commits_count: nil, merge_request_id: 3)
- metrics_table.create!(merged_at: Time.parse('2019-10-10'), commits_count: 5, merge_request_id: 1)
- metrics_table.create!(merged_at: Time.parse('2019-11-11'), commits_count: 10, merge_request_id: 2)
- ActiveRecord::Base.connection.execute('ALTER TABLE merge_request_metrics ENABLE TRIGGER ALL')
- end
- end
-
- it 'set start_date to earliest merged_at value with PA data available' do
- expect { migrate! }.to change {
- settings_table.first&.productivity_analytics_start_date
- }.to(be_like_time(Time.parse('2019-10-10')))
- end
- end
-end
diff --git a/spec/migrations/fix_max_pages_size_spec.rb b/spec/migrations/fix_max_pages_size_spec.rb
deleted file mode 100644
index 97cf026df5c..00000000000
--- a/spec/migrations/fix_max_pages_size_spec.rb
+++ /dev/null
@@ -1,19 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-require_migration!
-
-RSpec.describe FixMaxPagesSize do
- let(:application_settings) { table(:application_settings) }
- let!(:default_setting) { application_settings.create! }
- let!(:max_possible_setting) { application_settings.create!(max_pages_size: described_class::MAX_SIZE) }
- let!(:higher_than_maximum_setting) { application_settings.create!(max_pages_size: described_class::MAX_SIZE + 1) }
-
- it 'correctly updates settings only if needed' do
- migrate!
-
- expect(default_setting.reload.max_pages_size).to eq(100)
- expect(max_possible_setting.reload.max_pages_size).to eq(described_class::MAX_SIZE)
- expect(higher_than_maximum_setting.reload.max_pages_size).to eq(described_class::MAX_SIZE)
- end
-end
diff --git a/spec/migrations/fix_null_type_labels_spec.rb b/spec/migrations/fix_null_type_labels_spec.rb
deleted file mode 100644
index 4f902b92393..00000000000
--- a/spec/migrations/fix_null_type_labels_spec.rb
+++ /dev/null
@@ -1,36 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-require_migration!
-
-RSpec.describe FixNullTypeLabels do
- let(:migration) { described_class.new }
- let(:projects) { table(:projects) }
- let(:namespaces) { table(:namespaces) }
- let(:labels) { table(:labels) }
-
- before do
- group = namespaces.create!(name: 'labels-test-project', path: 'labels-test-project', type: 'Group')
- project = projects.create!(namespace_id: group.id, name: 'labels-test-group', path: 'labels-test-group')
-
- @template_label = labels.create!(title: 'template', template: true)
- @project_label = labels.create!(title: 'project label', project_id: project.id, type: 'ProjectLabel')
- @group_label = labels.create!(title: 'group_label', group_id: group.id, type: 'GroupLabel')
- @broken_label_1 = labels.create!(title: 'broken 1', project_id: project.id)
- @broken_label_2 = labels.create!(title: 'broken 2', project_id: project.id)
- end
-
- describe '#up' do
- it 'fix labels with type missing' do
- migration.up
-
- # Labels that requires type change
- expect(@broken_label_1.reload.type).to eq('ProjectLabel')
- expect(@broken_label_2.reload.type).to eq('ProjectLabel')
- # Labels out of scope
- expect(@template_label.reload.type).to be_nil
- expect(@project_label.reload.type).to eq('ProjectLabel')
- expect(@group_label.reload.type).to eq('GroupLabel')
- end
- end
-end
diff --git a/spec/migrations/fix_pool_repository_source_project_id_spec.rb b/spec/migrations/fix_pool_repository_source_project_id_spec.rb
deleted file mode 100644
index 2ee4c458c3c..00000000000
--- a/spec/migrations/fix_pool_repository_source_project_id_spec.rb
+++ /dev/null
@@ -1,29 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-require_migration!
-
-RSpec.describe FixPoolRepositorySourceProjectId do
- let(:projects) { table(:projects) }
- let(:pool_repositories) { table(:pool_repositories) }
- let(:shards) { table(:shards) }
-
- it 'fills in source_project_ids' do
- shard = shards.create!(name: 'default')
-
- # gitaly is a project with a pool repository that has a source_project_id
- gitaly = projects.create!(name: 'gitaly', path: 'gitlab-org/gitaly', namespace_id: 1)
- pool_repository = pool_repositories.create!(shard_id: shard.id, source_project_id: gitaly.id)
- gitaly.update_column(:pool_repository_id, pool_repository.id)
-
- # gitlab is a project with a pool repository that's missing a source_project_id
- pool_repository_without_source_project = pool_repositories.create!(shard_id: shard.id, source_project_id: nil)
- gitlab = projects.create!(name: 'gitlab', path: 'gitlab-org/gitlab-ce', namespace_id: 1, pool_repository_id: pool_repository_without_source_project.id)
- projects.create!(name: 'gitlab-fork-1', path: 'my-org-1/gitlab-ce', namespace_id: 1, pool_repository_id: pool_repository_without_source_project.id)
-
- migrate!
-
- expect(pool_repositories.find(pool_repository_without_source_project.id).source_project_id).to eq(gitlab.id)
- expect(pool_repositories.find(pool_repository.id).source_project_id).to eq(gitaly.id)
- end
-end
diff --git a/spec/migrations/fix_wrong_pages_access_level_spec.rb b/spec/migrations/fix_wrong_pages_access_level_spec.rb
deleted file mode 100644
index 00a620b4426..00000000000
--- a/spec/migrations/fix_wrong_pages_access_level_spec.rb
+++ /dev/null
@@ -1,99 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-require_migration!
-
-RSpec.describe FixWrongPagesAccessLevel, :sidekiq_might_not_need_inline, schema: 20190628185004 do
- using RSpec::Parameterized::TableSyntax
-
- let(:migration_class) { described_class::MIGRATION }
- let(:migration_name) { migration_class.to_s.demodulize }
-
- project_class = ::Gitlab::BackgroundMigration::FixPagesAccessLevel::Project
- feature_class = ::Gitlab::BackgroundMigration::FixPagesAccessLevel::ProjectFeature
-
- let(:namespaces_table) { table(:namespaces) }
- let(:projects_table) { table(:projects) }
- let(:features_table) { table(:project_features) }
-
- let(:subgroup) do
- root_group = namespaces_table.create!(path: "group", name: "group")
- namespaces_table.create!(path: "subgroup", name: "group", parent_id: root_group.id)
- end
-
- def create_project_feature(path, project_visibility, pages_access_level)
- project = projects_table.create!(path: path, visibility_level: project_visibility,
- namespace_id: subgroup.id)
- features_table.create!(project_id: project.id, pages_access_level: pages_access_level)
- end
-
- it 'correctly schedules background migrations' do
- Sidekiq::Testing.fake! do
- freeze_time do
- first_id = create_project_feature("project1", project_class::PRIVATE, feature_class::PRIVATE).id
- last_id = create_project_feature("project2", project_class::PRIVATE, feature_class::PUBLIC).id
-
- migrate!
-
- expect(migration_name).to be_scheduled_delayed_migration(2.minutes, first_id, last_id)
- expect(BackgroundMigrationWorker.jobs.size).to eq(1)
- end
- end
- end
-
- def expect_migration
- expect do
- perform_enqueued_jobs do
- migrate!
- end
- end
- end
-
- where(:project_visibility, :pages_access_level, :access_control_is_enabled,
- :pages_deployed, :resulting_pages_access_level) do
- # update settings for public projects regardless of access_control being enabled
- project_class::PUBLIC | feature_class::PUBLIC | true | true | feature_class::ENABLED
- project_class::PUBLIC | feature_class::PUBLIC | false | true | feature_class::ENABLED
- # don't update public level for private and internal projects
- project_class::PRIVATE | feature_class::PUBLIC | true | true | feature_class::PUBLIC
- project_class::INTERNAL | feature_class::PUBLIC | true | true | feature_class::PUBLIC
-
- # if access control is disabled but pages are deployed we make them public
- project_class::INTERNAL | feature_class::ENABLED | false | true | feature_class::PUBLIC
- # don't change anything if one of the conditions is not satisfied
- project_class::INTERNAL | feature_class::ENABLED | true | true | feature_class::ENABLED
- project_class::INTERNAL | feature_class::ENABLED | true | false | feature_class::ENABLED
-
- # private projects
- # if access control is enabled update pages_access_level to private regardless of deployment
- project_class::PRIVATE | feature_class::ENABLED | true | true | feature_class::PRIVATE
- project_class::PRIVATE | feature_class::ENABLED | true | false | feature_class::PRIVATE
- # if access control is disabled and pages are deployed update pages_access_level to public
- project_class::PRIVATE | feature_class::ENABLED | false | true | feature_class::PUBLIC
- # if access control is disabled but pages aren't deployed update pages_access_level to private
- project_class::PRIVATE | feature_class::ENABLED | false | false | feature_class::PRIVATE
- end
-
- with_them do
- let!(:project_feature) do
- create_project_feature("projectpath", project_visibility, pages_access_level)
- end
-
- before do
- tested_path = File.join(Settings.pages.path, "group/subgroup/projectpath", "public")
- allow(Dir).to receive(:exist?).with(tested_path).and_return(pages_deployed)
-
- stub_pages_setting(access_control: access_control_is_enabled)
- end
-
- it "sets proper pages_access_level" do
- expect(project_feature.reload.pages_access_level).to eq(pages_access_level)
-
- perform_enqueued_jobs do
- migrate!
- end
-
- expect(project_feature.reload.pages_access_level).to eq(resulting_pages_access_level)
- end
- end
-end
diff --git a/spec/migrations/generate_lets_encrypt_private_key_spec.rb b/spec/migrations/generate_lets_encrypt_private_key_spec.rb
deleted file mode 100644
index 8525a7bbd1c..00000000000
--- a/spec/migrations/generate_lets_encrypt_private_key_spec.rb
+++ /dev/null
@@ -1,14 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-require_migration!
-
-RSpec.describe GenerateLetsEncryptPrivateKey do
- describe '#up' do
- it 'does not fail' do
- expect do
- described_class.new.up
- end.not_to raise_error
- end
- end
-end
diff --git a/spec/migrations/insert_project_hooks_plan_limits_spec.rb b/spec/migrations/insert_project_hooks_plan_limits_spec.rb
deleted file mode 100644
index 365dd679d76..00000000000
--- a/spec/migrations/insert_project_hooks_plan_limits_spec.rb
+++ /dev/null
@@ -1,67 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-require_migration!
-
-RSpec.describe InsertProjectHooksPlanLimits do
- let(:migration) { described_class.new }
- let(:plans) { table(:plans) }
- let(:plan_limits) { table(:plan_limits) }
-
- before do
- plans.create!(id: 34, name: 'free')
- plans.create!(id: 2, name: 'bronze')
- plans.create!(id: 3, name: 'silver')
- plans.create!(id: 4, name: 'gold')
- plan_limits.create!(plan_id: 34, ci_active_jobs: 5)
- end
-
- context 'when on Gitlab.com' do
- before do
- expect(Gitlab).to receive(:com?).at_most(:twice).and_return(true)
- end
-
- describe '#up' do
- it 'updates the project_hooks plan limits' do
- migration.up
-
- expect(plan_limits.pluck(:plan_id, :project_hooks, :ci_active_jobs))
- .to match_array([[34, 10, 5], [2, 20, 0], [3, 30, 0], [4, 100, 0]])
- end
- end
-
- describe '#down' do
- it 'updates the project_hooks plan limits to 0' do
- migration.up
- migration.down
-
- expect(plan_limits.pluck(:plan_id, :project_hooks, :ci_active_jobs))
- .to match_array([[34, 0, 5], [2, 0, 0], [3, 0, 0], [4, 0, 0]])
- end
- end
- end
-
- context 'when on self-hosted' do
- before do
- expect(Gitlab).to receive(:com?).and_return(false)
- end
-
- describe '#up' do
- it 'does not update the plan limits' do
- migration.up
-
- expect(plan_limits.pluck(:plan_id, :project_hooks, :ci_active_jobs))
- .to match_array([[34, 0, 5]])
- end
- end
-
- describe '#down' do
- it 'does not update the plan limits' do
- migration.down
-
- expect(plan_limits.pluck(:plan_id, :project_hooks, :ci_active_jobs))
- .to match_array([[34, 0, 5]])
- end
- end
- end
-end
diff --git a/spec/migrations/migrate_auto_dev_ops_domain_to_cluster_domain_spec.rb b/spec/migrations/migrate_auto_dev_ops_domain_to_cluster_domain_spec.rb
deleted file mode 100644
index a836fb4bfb9..00000000000
--- a/spec/migrations/migrate_auto_dev_ops_domain_to_cluster_domain_spec.rb
+++ /dev/null
@@ -1,114 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-require_migration!
-
-RSpec.describe MigrateAutoDevOpsDomainToClusterDomain do
- include MigrationHelpers::ClusterHelpers
-
- let(:migration) { described_class.new }
- let(:project_auto_devops_table) { table(:project_auto_devops) }
- let(:clusters_table) { table(:clusters) }
- let(:cluster_projects_table) { table(:cluster_projects) }
-
- # Following lets are needed by MigrationHelpers::ClusterHelpers
- let(:cluster_kubernetes_namespaces_table) { table(:clusters_kubernetes_namespaces) }
- let(:projects_table) { table(:projects) }
- let(:namespaces_table) { table(:namespaces) }
- let(:provider_gcp_table) { table(:cluster_providers_gcp) }
- let(:platform_kubernetes_table) { table(:cluster_platforms_kubernetes) }
-
- before do
- setup_cluster_projects_with_domain(quantity: 20, domain: domain)
- end
-
- context 'with ProjectAutoDevOps with no domain' do
- let(:domain) { nil }
-
- it 'does not update cluster project' do
- migrate!
-
- expect(clusters_without_domain.count).to eq(clusters_table.count)
- end
- end
-
- context 'with ProjectAutoDevOps with domain' do
- let(:domain) { 'example-domain.com' }
-
- it 'updates all cluster projects' do
- migrate!
-
- expect(clusters_with_domain.count).to eq(clusters_table.count)
- end
- end
-
- context 'when only some ProjectAutoDevOps have domain set' do
- let(:domain) { 'example-domain.com' }
-
- before do
- setup_cluster_projects_with_domain(quantity: 25, domain: nil)
- end
-
- it 'only updates specific cluster projects' do
- migrate!
-
- expect(clusters_with_domain.count).to eq(20)
-
- project_auto_devops_with_domain.each do |project_auto_devops|
- cluster_project = find_cluster_project(project_auto_devops.project_id)
- cluster = find_cluster(cluster_project.cluster_id)
-
- expect(cluster.domain).to be_present
- end
-
- expect(clusters_without_domain.count).to eq(25)
-
- project_auto_devops_without_domain.each do |project_auto_devops|
- cluster_project = find_cluster_project(project_auto_devops.project_id)
- cluster = find_cluster(cluster_project.cluster_id)
-
- expect(cluster.domain).not_to be_present
- end
- end
- end
-
- def setup_cluster_projects_with_domain(quantity:, domain:)
- create_cluster_project_list(quantity)
-
- cluster_projects = cluster_projects_table.last(quantity)
-
- cluster_projects.each do |cluster_project|
- specific_domain = "#{cluster_project.id}-#{domain}" if domain
-
- project_auto_devops_table.create!(
- project_id: cluster_project.project_id,
- enabled: true,
- domain: specific_domain
- )
- end
- end
-
- def find_cluster_project(project_id)
- cluster_projects_table.find_by(project_id: project_id)
- end
-
- def find_cluster(cluster_id)
- clusters_table.find_by(id: cluster_id)
- end
-
- def project_auto_devops_with_domain
- project_auto_devops_table.where.not("domain IS NULL OR domain = ''")
- end
-
- def project_auto_devops_without_domain
- project_auto_devops_table.where("domain IS NULL OR domain = ''")
- end
-
- def clusters_with_domain
- clusters_table.where.not("domain IS NULL OR domain = ''")
- end
-
- def clusters_without_domain
- clusters_table.where("domain IS NULL OR domain = ''")
- end
-end
diff --git a/spec/migrations/migrate_code_owner_approval_status_to_protected_branches_in_batches_spec.rb b/spec/migrations/migrate_code_owner_approval_status_to_protected_branches_in_batches_spec.rb
deleted file mode 100644
index 121ff3d6622..00000000000
--- a/spec/migrations/migrate_code_owner_approval_status_to_protected_branches_in_batches_spec.rb
+++ /dev/null
@@ -1,63 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-require_migration!
-
-RSpec.describe MigrateCodeOwnerApprovalStatusToProtectedBranchesInBatches do
- let(:namespaces) { table(:namespaces) }
- let(:projects) { table(:projects) }
- let(:protected_branches) { table(:protected_branches) }
-
- let(:namespace) do
- namespaces.create!(
- path: 'gitlab-instance-administrators',
- name: 'GitLab Instance Administrators'
- )
- end
-
- let(:project) do
- projects.create!(
- namespace_id: namespace.id,
- name: 'GitLab Instance Administration'
- )
- end
-
- let!(:protected_branch_1) do
- protected_branches.create!(
- name: "branch name",
- project_id: project.id
- )
- end
-
- describe '#up' do
- context "when there's no projects needing approval" do
- it "doesn't change any protected branch records" do
- expect { migrate! }
- .not_to change { ProtectedBranch.where(code_owner_approval_required: true).count }
- end
- end
-
- context "when there's a project needing approval" do
- let!(:project_needing_approval) do
- projects.create!(
- namespace_id: namespace.id,
- name: 'GitLab Instance Administration',
- merge_requests_require_code_owner_approval: true
- )
- end
-
- let!(:protected_branch_2) do
- protected_branches.create!(
- name: "branch name",
- project_id: project_needing_approval.id
- )
- end
-
- it "changes N protected branch records" do
- expect { migrate! }
- .to change { ProtectedBranch.where(code_owner_approval_required: true).count }
- .by(1)
- end
- end
- end
-end
diff --git a/spec/migrations/migrate_discussion_id_on_promoted_epics_spec.rb b/spec/migrations/migrate_discussion_id_on_promoted_epics_spec.rb
deleted file mode 100644
index e42baab9927..00000000000
--- a/spec/migrations/migrate_discussion_id_on_promoted_epics_spec.rb
+++ /dev/null
@@ -1,81 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-require_migration!
-
-RSpec.describe MigrateDiscussionIdOnPromotedEpics do
- let(:migration_class) { described_class::MIGRATION }
- let(:migration_name) { migration_class.to_s.demodulize }
-
- let(:namespaces) { table(:namespaces) }
- let(:projects) { table(:projects) }
- let(:users) { table(:users) }
- let(:issues) { table(:issues) }
- let(:epics) { table(:epics) }
- let(:notes) { table(:notes) }
- let(:system_note_metadata) { table(:system_note_metadata) }
-
- let(:user) { users.create!(email: 'test@example.com', projects_limit: 100, username: 'test') }
- let(:namespace) { namespaces.create!(name: 'gitlab', path: 'gitlab-org') }
-
- def create_promotion_note(model, id)
- note = create_note(model, id, { system: true,
- note: 'promoted from issue XXX' })
- system_note_metadata.create!(note_id: note.id, action: 'moved')
- end
-
- def create_epic
- epics.create!(author_id: user.id, iid: epics.maximum(:iid).to_i + 1,
- group_id: namespace.id,
- title: 'Epic with discussion',
- title_html: 'Epic with discussion')
- end
-
- def create_note(model, id, extra_params = {})
- params = {
- note: 'note',
- noteable_id: model.id,
- noteable_type: model.class.name,
- discussion_id: id
- }.merge(extra_params)
-
- notes.create!(params)
- end
-
- context 'with promoted epic' do
- let(:epic1) { create_epic }
- let!(:note1) { create_promotion_note(epic1, 'id1') }
-
- it 'correctly schedules background migrations in batches' do
- create_note(epic1, 'id2')
- create_note(epic1, 'id3')
-
- stub_const("#{described_class.name}::BATCH_SIZE", 2)
-
- Sidekiq::Testing.fake! do
- freeze_time do
- migrate!
-
- expect(migration_name).to be_scheduled_delayed_migration(2.minutes, %w(id1 id2))
- expect(migration_name).to be_scheduled_delayed_migration(4.minutes, %w(id3))
- expect(BackgroundMigrationWorker.jobs.size).to eq(2)
- end
- end
- end
-
- it 'schedules only promoted epics' do
- issue = issues.create!(description: 'first', state: 'opened')
- create_promotion_note(issue, 'id2')
- create_note(create_epic, 'id3')
-
- Sidekiq::Testing.fake! do
- freeze_time do
- migrate!
-
- expect(migration_name).to be_scheduled_delayed_migration(2.minutes, %w(id1))
- expect(BackgroundMigrationWorker.jobs.size).to eq(1)
- end
- end
- end
- end
-end
diff --git a/spec/migrations/migrate_k8s_service_integration_spec.rb b/spec/migrations/migrate_k8s_service_integration_spec.rb
deleted file mode 100644
index ba6071b72e4..00000000000
--- a/spec/migrations/migrate_k8s_service_integration_spec.rb
+++ /dev/null
@@ -1,162 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-require_migration!
-
-RSpec.describe MigrateK8sServiceIntegration do
- context 'template service' do
- context 'with namespace' do
- let!(:service) do
- MigrateK8sServiceIntegration::Service.create!(
- active: true,
- template: true,
- category: 'deployment',
- type: 'KubernetesService',
- properties: "{\"namespace\":\"prod\",\"api_url\":\"https://sample.kubernetes.com\",\"ca_pem\":\"ca_pem-sample\",\"token\":\"token-sample\"}"
- )
- end
-
- let(:cluster) { MigrateK8sServiceIntegration::Cluster.instance_type.last! }
- let(:platform) { cluster.platform_kubernetes }
-
- it 'migrates the KubernetesService template to Platform::Kubernetes' do
- expect { migrate! }.to change { MigrateK8sServiceIntegration::Cluster.count }.by(1)
-
- expect(cluster).to be_enabled
- expect(cluster).to be_user
- expect(cluster).not_to be_managed
- expect(cluster.environment_scope).to eq('*')
- expect(platform.api_url).to eq('https://sample.kubernetes.com')
- expect(platform.ca_cert).to eq('ca_pem-sample')
- expect(platform.namespace).to eq('prod')
- expect(platform.token).to eq('token-sample')
- end
- end
-
- context 'without namespace' do
- let!(:service) do
- MigrateK8sServiceIntegration::Service.create!(
- active: true,
- template: true,
- category: 'deployment',
- type: 'KubernetesService',
- properties: "{\"namespace\":\"\",\"api_url\":\"https://sample.kubernetes.com\",\"ca_pem\":\"ca_pem-sample\",\"token\":\"token-sample\"}"
- )
- end
-
- let(:cluster) { MigrateK8sServiceIntegration::Cluster.instance_type.last! }
- let(:platform) { cluster.platform_kubernetes }
-
- it 'migrates the KubernetesService template to Platform::Kubernetes' do
- expect { migrate! }.to change { MigrateK8sServiceIntegration::Cluster.count }.by(1)
-
- expect(cluster).to be_enabled
- expect(cluster).to be_user
- expect(cluster).not_to be_managed
- expect(cluster.environment_scope).to eq('*')
- expect(platform.api_url).to eq('https://sample.kubernetes.com')
- expect(platform.ca_cert).to eq('ca_pem-sample')
- expect(platform.namespace).to be_nil
- expect(platform.token).to eq('token-sample')
- end
- end
-
- context 'with nullified parameters' do
- let!(:service) do
- MigrateK8sServiceIntegration::Service.create!(
- active: true,
- template: true,
- category: 'deployment',
- type: 'KubernetesService',
- properties: "{}"
- )
- end
-
- it 'does not migrate the KubernetesService' do
- expect { migrate! }.not_to change { MigrateK8sServiceIntegration::Cluster.count }
- end
- end
-
- context 'when disabled' do
- let!(:service) do
- MigrateK8sServiceIntegration::Service.create!(
- active: false,
- template: true,
- category: 'deployment',
- type: 'KubernetesService',
- properties: "{\"namespace\":\"prod\",\"api_url\":\"https://sample.kubernetes.com\",\"ca_pem\":\"ca_pem-sample\",\"token\":\"token-sample\"}"
- )
- end
-
- let(:cluster) { MigrateK8sServiceIntegration::Cluster.instance_type.last! }
- let(:platform) { cluster.platform_kubernetes }
-
- it 'migrates the KubernetesService template to Platform::Kubernetes' do
- expect { migrate! }.to change { MigrateK8sServiceIntegration::Cluster.count }.by(1)
-
- expect(cluster).not_to be_enabled
- expect(cluster).to be_user
- expect(cluster).not_to be_managed
- expect(cluster.environment_scope).to eq('*')
- expect(platform.api_url).to eq('https://sample.kubernetes.com')
- expect(platform.ca_cert).to eq('ca_pem-sample')
- expect(platform.namespace).to eq('prod')
- expect(platform.token).to eq('token-sample')
- end
- end
-
- context 'when an instance cluster already exists' do
- let!(:service) do
- MigrateK8sServiceIntegration::Service.create!(
- active: true,
- template: true,
- category: 'deployment',
- type: 'KubernetesService',
- properties: "{\"namespace\":\"prod\",\"api_url\":\"https://sample.kubernetes.com\",\"ca_pem\":\"ca_pem-sample\",\"token\":\"token-sample\"}"
- )
- end
-
- let!(:existing_cluster) do
- MigrateK8sServiceIntegration::Cluster.create!(
- name: 'test-cluster',
- cluster_type: :instance_type,
- managed: true,
- provider_type: :user,
- platform_type: :kubernetes
- )
- end
-
- let(:new_cluster) { MigrateK8sServiceIntegration::Cluster.instance_type.last! }
- let(:platform) { new_cluster.platform_kubernetes }
-
- it 'migrates the KubernetesService template to disabled Platform::Kubernetes' do
- expect { migrate! }.to change { MigrateK8sServiceIntegration::Cluster.count }.by(1)
-
- expect(new_cluster).not_to be_enabled
- expect(new_cluster).to be_user
- expect(new_cluster).not_to be_managed
- expect(new_cluster.environment_scope).to eq('*')
- expect(platform.api_url).to eq('https://sample.kubernetes.com')
- expect(platform.ca_cert).to eq('ca_pem-sample')
- expect(platform.namespace).to eq('prod')
- expect(platform.token).to eq('token-sample')
- end
- end
- end
-
- context 'non-template service' do
- let!(:service) do
- MigrateK8sServiceIntegration::Service.create!(
- active: true,
- template: false,
- category: 'deployment',
- type: 'KubernetesService',
- properties: "{\"namespace\":\"prod\",\"api_url\":\"https://sample.kubernetes.com\",\"ca_pem\":\"ca_pem-sample\",\"token\":\"token-sample\"}"
- )
- end
-
- it 'does not migrate the KubernetesService' do
- expect { migrate! }.not_to change { MigrateK8sServiceIntegration::Cluster.count }
- end
- end
-end
diff --git a/spec/migrations/migrate_legacy_managed_clusters_to_unmanaged_spec.rb b/spec/migrations/migrate_legacy_managed_clusters_to_unmanaged_spec.rb
deleted file mode 100644
index 3d8685c7619..00000000000
--- a/spec/migrations/migrate_legacy_managed_clusters_to_unmanaged_spec.rb
+++ /dev/null
@@ -1,55 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-require_migration!
-
-RSpec.describe MigrateLegacyManagedClustersToUnmanaged do
- let(:cluster_type) { 'project_type' }
- let(:created_at) { 1.hour.ago }
-
- let!(:cluster) do
- table(:clusters).create!(
- name: 'cluster',
- cluster_type: described_class::Cluster.cluster_types[cluster_type],
- managed: true,
- created_at: created_at
- )
- end
-
- it 'marks the cluster as unmanaged' do
- migrate!
- expect(cluster.reload).not_to be_managed
- end
-
- context 'cluster is not project type' do
- let(:cluster_type) { 'group_type' }
-
- it 'does not update the cluster' do
- migrate!
- expect(cluster.reload).to be_managed
- end
- end
-
- context 'cluster has a kubernetes namespace associated' do
- before do
- table(:clusters_kubernetes_namespaces).create!(
- cluster_id: cluster.id,
- namespace: 'namespace'
- )
- end
-
- it 'does not update the cluster' do
- migrate!
- expect(cluster.reload).to be_managed
- end
- end
-
- context 'cluster was recently created' do
- let(:created_at) { 2.minutes.ago }
-
- it 'does not update the cluster' do
- migrate!
- expect(cluster.reload).to be_managed
- end
- end
-end
diff --git a/spec/migrations/migrate_managed_clusters_with_no_token_to_unmanaged_spec.rb b/spec/migrations/migrate_managed_clusters_with_no_token_to_unmanaged_spec.rb
deleted file mode 100644
index b753b84ae55..00000000000
--- a/spec/migrations/migrate_managed_clusters_with_no_token_to_unmanaged_spec.rb
+++ /dev/null
@@ -1,59 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-require_migration!
-
-RSpec.describe MigrateManagedClustersWithNoTokenToUnmanaged do
- let(:cluster_type) { 'project_type' }
- let(:created_at) { Date.new(2018, 11, 1).midnight }
-
- let!(:cluster) do
- table(:clusters).create!(
- name: 'cluster',
- cluster_type: described_class::Cluster.cluster_types[cluster_type],
- managed: true,
- created_at: created_at
- )
- end
-
- let!(:kubernetes_namespace) do
- table(:clusters_kubernetes_namespaces).create!(
- cluster_id: cluster.id,
- namespace: 'namespace'
- )
- end
-
- it 'marks the cluster as unmanaged' do
- migrate!
- expect(cluster.reload).not_to be_managed
- end
-
- context 'cluster is not project type' do
- let(:cluster_type) { 'group_type' }
-
- it 'does not update the cluster' do
- migrate!
- expect(cluster.reload).to be_managed
- end
- end
-
- context 'kubernetes namespace has a service account token' do
- before do
- kubernetes_namespace.update!(encrypted_service_account_token: "TOKEN")
- end
-
- it 'does not update the cluster' do
- migrate!
- expect(cluster.reload).to be_managed
- end
- end
-
- context 'cluster was created after the cutoff' do
- let(:created_at) { Date.new(2019, 1, 1).midnight }
-
- it 'does not update the cluster' do
- migrate!
- expect(cluster.reload).to be_managed
- end
- end
-end
diff --git a/spec/migrations/migrate_ops_feature_flags_scopes_target_user_ids_spec.rb b/spec/migrations/migrate_ops_feature_flags_scopes_target_user_ids_spec.rb
deleted file mode 100644
index 5caf03992dd..00000000000
--- a/spec/migrations/migrate_ops_feature_flags_scopes_target_user_ids_spec.rb
+++ /dev/null
@@ -1,135 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-require_migration!
-
-RSpec.describe MigrateOpsFeatureFlagsScopesTargetUserIds do
- let(:namespaces) { table(:namespaces) }
- let(:projects) { table(:projects) }
- let(:flags) { table(:operations_feature_flags) }
- let(:scopes) { table(:operations_feature_flag_scopes) }
-
- def setup
- namespace = namespaces.create!(name: 'foo', path: 'foo')
- project = projects.create!(namespace_id: namespace.id)
- flags.create!(project_id: project.id, active: true, name: 'test_flag')
- end
-
- it 'migrates successfully when there are no scopes in the database' do
- setup
-
- disable_migrations_output { migrate! }
-
- expect(scopes.count).to eq(0)
- end
-
- it 'migrates a disabled scope with gradualRolloutUserId and userWithId strategies' do
- flag = setup
- scope = scopes.create!(feature_flag_id: flag.id, active: false, strategies: [
- { name: 'gradualRolloutUserId', parameters: { groupId: 'default', percentage: '50' } },
- { name: 'userWithId', parameters: { userIds: '5' } }
- ])
-
- disable_migrations_output { migrate! }
-
- scope.reload
- expect(scope.active).to eq(true)
- expect(scope.strategies).to eq([{ 'name' => 'userWithId', 'parameters' => { 'userIds' => '5' } }])
- end
-
- it 'migrates a disabled scope with default and userWithId strategies' do
- flag = setup
- scope = scopes.create!(feature_flag_id: flag.id, active: false, strategies: [
- { name: 'default', parameters: {} },
- { name: 'userWithId', parameters: { userIds: 'amy@gmail.com,karen@gmail.com' } }
- ])
-
- disable_migrations_output { migrate! }
-
- scope.reload
- expect(scope.active).to eq(true)
- expect(scope.strategies).to eq([{ 'name' => 'userWithId', 'parameters' => { 'userIds' => 'amy@gmail.com,karen@gmail.com' } }])
- end
-
- it 'migrates an enabled scope with default and userWithId strategies' do
- flag = setup
- scope = scopes.create!(feature_flag_id: flag.id, active: true, strategies: [
- { name: 'default', parameters: {} },
- { name: 'userWithId', parameters: { userIds: 'tim' } }
- ])
-
- disable_migrations_output { migrate! }
-
- scope.reload
- expect(scope.active).to eq(true)
- expect(scope.strategies).to eq([{ 'name' => 'default', 'parameters' => {} }])
- end
-
- it 'does not alter an enabled scope with gradualRolloutUserId and userWithId strategies' do
- flag = setup
- scope = scopes.create!(feature_flag_id: flag.id, active: true, strategies: [
- { name: 'gradualRolloutUserId', parameters: { groupId: 'default', percentage: '50' } },
- { name: 'userWithId', parameters: { userIds: '5' } }
- ])
-
- disable_migrations_output { migrate! }
-
- scope.reload
- expect(scope.active).to eq(true)
- expect(scope.strategies).to eq([
- { 'name' => 'gradualRolloutUserId', 'parameters' => { 'groupId' => 'default', 'percentage' => '50' } },
- { 'name' => 'userWithId', 'parameters' => { 'userIds' => '5' } }
- ])
- end
-
- it 'does not alter a disabled scope without a userWithId strategy' do
- flag = setup
- scope = scopes.create!(feature_flag_id: flag.id, active: false, strategies: [
- { name: 'gradualRolloutUserId', parameters: { percentage: '60' } }
- ])
-
- disable_migrations_output { migrate! }
-
- scope.reload
- expect(scope.active).to eq(false)
- expect(scope.strategies).to eq([
- { 'name' => 'gradualRolloutUserId', 'parameters' => { 'percentage' => '60' } }
- ])
- end
-
- it 'does not alter an enabled scope without a userWithId strategy' do
- flag = setup
- scope = scopes.create!(feature_flag_id: flag.id, active: true, strategies: [
- { name: 'default', parameters: {} }
- ])
-
- disable_migrations_output { migrate! }
-
- scope.reload
- expect(scope.active).to eq(true)
- expect(scope.strategies).to eq([
- { 'name' => 'default', 'parameters' => {} }
- ])
- end
-
- it 'migrates multiple scopes' do
- flag = setup
- scope_a = scopes.create!(feature_flag_id: flag.id, active: false, strategies: [
- { name: 'gradualRolloutUserId', parameters: { groupId: 'default', percentage: '50' } },
- { name: 'userWithId', parameters: { userIds: '5,6,7' } }
- ])
- scope_b = scopes.create!(feature_flag_id: flag.id, active: false, environment_scope: 'production', strategies: [
- { name: 'default', parameters: {} },
- { name: 'userWithId', parameters: { userIds: 'lisa,carol' } }
- ])
-
- disable_migrations_output { migrate! }
-
- scope_a.reload
- scope_b.reload
- expect(scope_a.active).to eq(true)
- expect(scope_a.strategies).to eq([{ 'name' => 'userWithId', 'parameters' => { 'userIds' => '5,6,7' } }])
- expect(scope_b.active).to eq(true)
- expect(scope_b.strategies).to eq([{ 'name' => 'userWithId', 'parameters' => { 'userIds' => 'lisa,carol' } }])
- end
-end
diff --git a/spec/migrations/migrate_storage_migrator_sidekiq_queue_spec.rb b/spec/migrations/migrate_storage_migrator_sidekiq_queue_spec.rb
deleted file mode 100644
index 4db819f2fa1..00000000000
--- a/spec/migrations/migrate_storage_migrator_sidekiq_queue_spec.rb
+++ /dev/null
@@ -1,43 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-require_migration!
-
-RSpec.describe MigrateStorageMigratorSidekiqQueue, :redis do
- include Gitlab::Database::MigrationHelpers
- include StubWorker
-
- context 'when there are jobs in the queues' do
- it 'correctly migrates queue when migrating up' do
- Sidekiq::Testing.disable! do
- stub_worker(queue: :storage_migrator).perform_async(1, 5)
-
- described_class.new.up
-
- expect(sidekiq_queue_length('storage_migrator')).to eq 0
- expect(sidekiq_queue_length('hashed_storage:hashed_storage_migrator')).to eq 1
- end
- end
-
- it 'correctly migrates queue when migrating down' do
- Sidekiq::Testing.disable! do
- stub_worker(queue: :'hashed_storage:hashed_storage_migrator').perform_async(1, 5)
-
- described_class.new.down
-
- expect(sidekiq_queue_length('storage_migrator')).to eq 1
- expect(sidekiq_queue_length('hashed_storage:hashed_storage_migrator')).to eq 0
- end
- end
- end
-
- context 'when there are no jobs in the queues' do
- it 'does not raise error when migrating up' do
- expect { described_class.new.up }.not_to raise_error
- end
-
- it 'does not raise error when migrating down' do
- expect { described_class.new.down }.not_to raise_error
- end
- end
-end
diff --git a/spec/migrations/move_limits_from_plans_spec.rb b/spec/migrations/move_limits_from_plans_spec.rb
deleted file mode 100644
index 92ac804733f..00000000000
--- a/spec/migrations/move_limits_from_plans_spec.rb
+++ /dev/null
@@ -1,35 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-require_migration!
-
-RSpec.describe MoveLimitsFromPlans do
- let(:plans) { table(:plans) }
- let(:plan_limits) { table(:plan_limits) }
-
- let!(:gold_plan) { plans.create!(name: 'gold', title: 'Gold', active_pipelines_limit: 20, pipeline_size_limit: 21, active_jobs_limit: 22) }
- let!(:silver_plan) { plans.create!(name: 'silver', title: 'Silver', active_pipelines_limit: 30, pipeline_size_limit: 31, active_jobs_limit: 32) }
- let!(:bronze_plan) { plans.create!(name: 'bronze', title: 'Bronze', active_pipelines_limit: 40, pipeline_size_limit: 41, active_jobs_limit: 42) }
- let!(:free_plan) { plans.create!(name: 'free', title: 'Free', active_pipelines_limit: 50, pipeline_size_limit: 51, active_jobs_limit: 52) }
- let!(:other_plan) { plans.create!(name: 'other', title: 'Other', active_pipelines_limit: nil, pipeline_size_limit: nil, active_jobs_limit: 0) }
-
- describe 'migrate' do
- it 'populates plan_limits from all the records in plans' do
- expect { migrate! }.to change { plan_limits.count }.by 5
- end
-
- it 'copies plan limits and plan.id into to plan_limits table' do
- migrate!
-
- new_data = plan_limits.pluck(:plan_id, :ci_active_pipelines, :ci_pipeline_size, :ci_active_jobs)
- expected_data = [
- [gold_plan.id, 20, 21, 22],
- [silver_plan.id, 30, 31, 32],
- [bronze_plan.id, 40, 41, 42],
- [free_plan.id, 50, 51, 52],
- [other_plan.id, 0, 0, 0]
- ]
- expect(new_data).to contain_exactly(*expected_data)
- end
- end
-end
diff --git a/spec/migrations/nullify_users_role_spec.rb b/spec/migrations/nullify_users_role_spec.rb
deleted file mode 100644
index 11056d9cf0c..00000000000
--- a/spec/migrations/nullify_users_role_spec.rb
+++ /dev/null
@@ -1,33 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-require_migration!
-
-RSpec.describe NullifyUsersRole do
- let(:users) { table(:users) }
-
- before do
- allow(Gitlab).to receive(:com?).and_return(true)
-
- users.create!(role: 0, updated_at: '2019-11-04 12:08:00', projects_limit: 0, email: '1')
- users.create!(role: 1, updated_at: '2019-11-04 12:08:00', projects_limit: 0, email: '2')
- users.create!(role: 0, updated_at: '2019-11-06 12:08:00', projects_limit: 0, email: '3')
-
- migrate!
- end
-
- it 'nullifies the role of the user with updated_at < 2019-11-05 12:08:00 and a role of 0' do
- expect(users.where(role: nil).count).to eq(1)
- expect(users.find_by(role: nil).email).to eq('1')
- end
-
- it 'leaves the user with role of 1' do
- expect(users.where(role: 1).count).to eq(1)
- expect(users.find_by(role: 1).email).to eq('2')
- end
-
- it 'leaves the user with updated_at > 2019-11-05 12:08:00' do
- expect(users.where(role: 0).count).to eq(1)
- expect(users.find_by(role: 0).email).to eq('3')
- end
-end
diff --git a/spec/migrations/populate_project_statistics_packages_size_spec.rb b/spec/migrations/populate_project_statistics_packages_size_spec.rb
deleted file mode 100644
index af9237f4bd6..00000000000
--- a/spec/migrations/populate_project_statistics_packages_size_spec.rb
+++ /dev/null
@@ -1,37 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-require_migration!
-
-RSpec.describe PopulateProjectStatisticsPackagesSize do
- let(:project_statistics) { table(:project_statistics) }
- let(:namespaces) { table(:namespaces) }
- let(:projects) { table(:projects) }
- let(:packages) { table(:packages_packages) }
- let(:package_files) { table(:packages_package_files) }
-
- let(:file_size) { 1.kilobyte }
- let(:repo_size) { 2.megabytes }
- let(:lfs_size) { 3.gigabytes }
- let(:artifacts_size) { 4.terabytes }
- let(:storage_size) { repo_size + lfs_size + artifacts_size }
-
- let(:namespace) { namespaces.create!(name: 'foo', path: 'foo') }
- let(:package) { packages.create!(project_id: project.id, name: 'a package', package_type: 1) }
- let(:project) { projects.create!(namespace_id: namespace.id) }
-
- let!(:statistics) { project_statistics.create!(project_id: project.id, namespace_id: namespace.id, storage_size: storage_size, repository_size: repo_size, lfs_objects_size: lfs_size, build_artifacts_size: artifacts_size) }
- let!(:package_file) { package_files.create!(package_id: package.id, file: 'a file.txt', file_name: 'a file.txt', size: file_size)}
-
- it 'backfills ProjectStatistics packages_size' do
- expect { migrate! }
- .to change { statistics.reload.packages_size }
- .from(nil).to(file_size)
- end
-
- it 'updates ProjectStatistics storage_size' do
- expect { migrate! }
- .to change { statistics.reload.storage_size }
- .by(file_size)
- end
-end
diff --git a/spec/migrations/populate_rule_type_on_approval_merge_request_rules_spec.rb b/spec/migrations/populate_rule_type_on_approval_merge_request_rules_spec.rb
deleted file mode 100644
index 7dc3f5a1004..00000000000
--- a/spec/migrations/populate_rule_type_on_approval_merge_request_rules_spec.rb
+++ /dev/null
@@ -1,39 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-require_migration!
-
-RSpec.describe PopulateRuleTypeOnApprovalMergeRequestRules do
- let(:migration) { described_class.new }
-
- describe '#up' do
- let(:namespaces) { table(:namespaces) }
- let(:projects) { table(:projects) }
- let(:merge_requests) { table(:merge_requests) }
- let(:approval_rules) { table(:approval_merge_request_rules) }
-
- # We use integers here since at the time of writing CE does not yet have the
- # appropriate models and enum definitions.
- let(:regular_rule_type) { 1 }
- let(:code_owner_rule_type) { 2 }
-
- before do
- namespaces.create!(id: 11, name: 'gitlab', path: 'gitlab')
- projects.create!(id: 101, namespace_id: 11, name: 'gitlab', path: 'gitlab')
- merge_requests.create!(id: 1, target_project_id: 101, source_project_id: 101, target_branch: 'feature', source_branch: 'master')
-
- approval_rules.create!(id: 1, merge_request_id: 1, name: "Default", code_owner: false, rule_type: regular_rule_type)
- approval_rules.create!(id: 2, merge_request_id: 1, name: "Code Owners", code_owner: true, rule_type: regular_rule_type)
- end
-
- it 'backfills ApprovalMergeRequestRules code_owner rule_type' do
- expect(approval_rules.where(rule_type: regular_rule_type).pluck(:id)).to contain_exactly(1, 2)
- expect(approval_rules.where(rule_type: code_owner_rule_type).pluck(:id)).to be_empty
-
- migrate!
-
- expect(approval_rules.where(rule_type: regular_rule_type).pluck(:id)).to contain_exactly(1)
- expect(approval_rules.where(rule_type: code_owner_rule_type).pluck(:id)).to contain_exactly(2)
- end
- end
-end
diff --git a/spec/migrations/recreate_index_security_ci_builds_on_name_and_id_parser_features_spec.rb b/spec/migrations/recreate_index_security_ci_builds_on_name_and_id_parser_features_spec.rb
new file mode 100644
index 00000000000..77824a743fb
--- /dev/null
+++ b/spec/migrations/recreate_index_security_ci_builds_on_name_and_id_parser_features_spec.rb
@@ -0,0 +1,28 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+require_migration!
+
+RSpec.describe RecreateIndexSecurityCiBuildsOnNameAndIdParserFeatures, :migration do
+ let(:db) { described_class.new }
+ let(:pg_class) { table(:pg_class) }
+ let(:pg_index) { table(:pg_index) }
+ let(:async_indexes) { table(:postgres_async_indexes) }
+
+ it "recreates index" do
+ reversible_migration do |migration|
+ migration.before -> {
+ expect(async_indexes.where(name: described_class::OLD_INDEX_NAME).exists?).to be false
+ expect(db.index_exists?(described_class::TABLE, described_class::COLUMNS, name: described_class::OLD_INDEX_NAME)).to be true
+ expect(db.index_exists?(described_class::TABLE, described_class::COLUMNS, name: described_class::NEW_INDEX_NAME)).to be false
+ }
+
+ migration.after -> {
+ expect(async_indexes.where(name: described_class::OLD_INDEX_NAME).exists?).to be true
+ expect(db.index_exists?(described_class::TABLE, described_class::COLUMNS, name: described_class::OLD_INDEX_NAME)).to be false
+ expect(db.index_exists?(described_class::TABLE, described_class::COLUMNS, name: described_class::NEW_INDEX_NAME)).to be true
+ }
+ end
+ end
+end
diff --git a/spec/migrations/remove_empty_github_service_templates_spec.rb b/spec/migrations/remove_empty_github_service_templates_spec.rb
deleted file mode 100644
index ad84187c298..00000000000
--- a/spec/migrations/remove_empty_github_service_templates_spec.rb
+++ /dev/null
@@ -1,55 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-require_migration!
-
-RSpec.describe RemoveEmptyGithubServiceTemplates do
- subject(:migration) { described_class.new }
-
- let(:services) do
- table(:services).tap do |klass|
- klass.class_eval do
- serialize :properties, JSON
- end
- end
- end
-
- before do
- services.delete_all
-
- create_service(properties: nil)
- create_service(properties: {})
- create_service(properties: { some: :value })
- create_service(properties: {}, template: false)
- create_service(properties: {}, type: 'SomeType')
- end
-
- def all_service_properties
- services.where(template: true, type: 'GithubService').pluck(:properties)
- end
-
- it 'correctly migrates up and down service templates' do
- reversible_migration do |migration|
- migration.before -> do
- expect(services.count).to eq(5)
-
- expect(all_service_properties)
- .to match(a_collection_containing_exactly(nil, {}, { 'some' => 'value' }))
- end
-
- migration.after -> do
- expect(services.count).to eq(4)
-
- expect(all_service_properties)
- .to match(a_collection_containing_exactly(nil, { 'some' => 'value' }))
- end
- end
- end
-
- def create_service(params)
- data = { template: true, type: 'GithubService' }
- data.merge!(params)
-
- services.create!(data)
- end
-end
diff --git a/spec/migrations/remove_schedule_and_status_from_pending_alert_escalations_spec.rb b/spec/migrations/remove_schedule_and_status_from_pending_alert_escalations_spec.rb
new file mode 100644
index 00000000000..f595261ff90
--- /dev/null
+++ b/spec/migrations/remove_schedule_and_status_from_pending_alert_escalations_spec.rb
@@ -0,0 +1,37 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+require_migration!
+
+RSpec.describe RemoveScheduleAndStatusFromPendingAlertEscalations do
+ let(:escalations) { table(:incident_management_pending_alert_escalations) }
+ let(:schedule_index) { 'index_incident_management_pending_alert_escalations_on_schedule' }
+ let(:schedule_foreign_key) { 'fk_rails_fcbfd9338b' }
+
+ it 'correctly migrates up and down' do
+ reversible_migration do |migration|
+ migration.before -> {
+ expect(escalations.column_names).to include('schedule_id', 'status')
+ expect(escalations_indexes).to include(schedule_index)
+ expect(escalations_constraints).to include(schedule_foreign_key)
+ }
+
+ migration.after -> {
+ escalations.reset_column_information
+ expect(escalations.column_names).not_to include('schedule_id', 'status')
+ expect(escalations_indexes).not_to include(schedule_index)
+ expect(escalations_constraints).not_to include(schedule_foreign_key)
+ }
+ end
+ end
+
+ private
+
+ def escalations_indexes
+ ActiveRecord::Base.connection.indexes(:incident_management_pending_alert_escalations).collect(&:name)
+ end
+
+ def escalations_constraints
+ ActiveRecord::Base.connection.foreign_keys(:incident_management_pending_alert_escalations).collect(&:name)
+ end
+end
diff --git a/spec/migrations/schedule_fill_valid_time_for_pages_domain_certificates_spec.rb b/spec/migrations/schedule_fill_valid_time_for_pages_domain_certificates_spec.rb
deleted file mode 100644
index 45bd5073d55..00000000000
--- a/spec/migrations/schedule_fill_valid_time_for_pages_domain_certificates_spec.rb
+++ /dev/null
@@ -1,48 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-require_migration!
-
-RSpec.describe ScheduleFillValidTimeForPagesDomainCertificates do
- let(:migration_class) { described_class::MIGRATION }
- let(:migration_name) { migration_class.to_s.demodulize }
-
- let(:domains_table) { table(:pages_domains) }
-
- let(:certificate) do
- File.read('spec/fixtures/passphrase_x509_certificate.crt')
- end
-
- before do
- domains_table.create!(domain: "domain1.example.com", verification_code: "123")
- domains_table.create!(domain: "domain2.example.com", verification_code: "123", certificate: '')
- domains_table.create!(domain: "domain3.example.com", verification_code: "123", certificate: certificate)
- domains_table.create!(domain: "domain4.example.com", verification_code: "123", certificate: certificate)
- end
-
- it 'correctly schedules background migrations' do
- Sidekiq::Testing.fake! do
- freeze_time do
- migrate!
-
- first_id = domains_table.find_by_domain("domain3.example.com").id
- last_id = domains_table.find_by_domain("domain4.example.com").id
-
- expect(migration_name).to be_scheduled_delayed_migration(5.minutes, first_id, last_id)
- expect(BackgroundMigrationWorker.jobs.size).to eq(1)
- end
- end
- end
-
- it 'sets certificate valid_not_before/not_after', :sidekiq_might_not_need_inline do
- perform_enqueued_jobs do
- migrate!
-
- domain = domains_table.find_by_domain("domain3.example.com")
- expect(domain.certificate_valid_not_before)
- .to eq(Time.parse("2018-03-23 14:02:08 UTC"))
- expect(domain.certificate_valid_not_after)
- .to eq(Time.parse("2019-03-23 14:02:08 UTC"))
- end
- end
-end
diff --git a/spec/migrations/schedule_pages_metadata_migration_spec.rb b/spec/migrations/schedule_pages_metadata_migration_spec.rb
deleted file mode 100644
index 96fbc1f9f51..00000000000
--- a/spec/migrations/schedule_pages_metadata_migration_spec.rb
+++ /dev/null
@@ -1,29 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-require_migration!
-
-RSpec.describe SchedulePagesMetadataMigration do
- let(:namespaces) { table(:namespaces) }
- let(:projects) { table(:projects) }
-
- before do
- stub_const("#{described_class.name}::BATCH_SIZE", 1)
-
- namespaces.create!(id: 11, name: 'gitlab', path: 'gitlab-org')
- projects.create!(id: 111, namespace_id: 11, name: 'Project 111')
- projects.create!(id: 114, namespace_id: 11, name: 'Project 114')
- end
-
- it 'schedules pages metadata migration' do
- Sidekiq::Testing.fake! do
- freeze_time do
- migrate!
-
- expect(described_class::MIGRATION).to be_scheduled_delayed_migration(2.minutes, 111, 111)
- expect(described_class::MIGRATION).to be_scheduled_delayed_migration(4.minutes, 114, 114)
- expect(BackgroundMigrationWorker.jobs.size).to eq(2)
- end
- end
- end
-end
diff --git a/spec/migrations/schedule_populate_merge_request_assignees_table_spec.rb b/spec/migrations/schedule_populate_merge_request_assignees_table_spec.rb
deleted file mode 100644
index 3caab64a72d..00000000000
--- a/spec/migrations/schedule_populate_merge_request_assignees_table_spec.rb
+++ /dev/null
@@ -1,47 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-require_migration!
-
-RSpec.describe SchedulePopulateMergeRequestAssigneesTable do
- let(:namespaces) { table(:namespaces) }
- let(:projects) { table(:projects) }
- let(:namespace) { namespaces.create!(name: 'gitlab', path: 'gitlab-org') }
- let(:project) { projects.create!(namespace_id: namespace.id, name: 'foo') }
- let(:merge_requests) { table(:merge_requests) }
-
- def create_merge_request(id)
- params = {
- id: id,
- target_project_id: project.id,
- target_branch: 'master',
- source_project_id: project.id,
- source_branch: 'mr name',
- title: "mr name#{id}"
- }
-
- merge_requests.create!(params)
- end
-
- it 'correctly schedules background migrations' do
- create_merge_request(1)
- create_merge_request(2)
- create_merge_request(3)
-
- stub_const("#{described_class.name}::BATCH_SIZE", 2)
-
- Sidekiq::Testing.fake! do
- freeze_time do
- migrate!
-
- expect(described_class::MIGRATION)
- .to be_scheduled_delayed_migration(8.minutes, 1, 2)
-
- expect(described_class::MIGRATION)
- .to be_scheduled_delayed_migration(16.minutes, 3, 3)
-
- expect(BackgroundMigrationWorker.jobs.size).to eq(2)
- end
- end
- end
-end
diff --git a/spec/migrations/schedule_populate_status_column_of_security_scans_spec.rb b/spec/migrations/schedule_populate_status_column_of_security_scans_spec.rb
new file mode 100644
index 00000000000..601935db8db
--- /dev/null
+++ b/spec/migrations/schedule_populate_status_column_of_security_scans_spec.rb
@@ -0,0 +1,48 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+require_migration!
+
+RSpec.describe SchedulePopulateStatusColumnOfSecurityScans do
+ before do
+ allow(Gitlab).to receive(:ee?).and_return(ee?)
+ stub_const("#{described_class.name}::BATCH_SIZE", 1)
+ end
+
+ context 'when the Gitlab instance is CE' do
+ let(:ee?) { false }
+
+ it 'does not run the migration' do
+ expect { migrate! }.not_to change { BackgroundMigrationWorker.jobs.size }
+ end
+ end
+
+ context 'when the Gitlab instance is EE' do
+ let(:ee?) { true }
+ let(:namespaces) { table(:namespaces) }
+ let(:projects) { table(:projects) }
+ let(:pipelines) { table(:ci_pipelines) }
+ let(:builds) { table(:ci_builds) }
+ let(:security_scans) { table(:security_scans) }
+
+ let(:namespace) { namespaces.create!(name: "foo", path: "bar") }
+ let(:project) { projects.create!(namespace_id: namespace.id) }
+ let(:pipeline) { pipelines.create!(project_id: project.id, ref: 'master', sha: 'adf43c3a', status: 'success') }
+ let(:ci_build) { builds.create!(commit_id: pipeline.id, retried: false, type: 'Ci::Build') }
+
+ let!(:security_scan_1) { security_scans.create!(build_id: ci_build.id, scan_type: 1) }
+ let!(:security_scan_2) { security_scans.create!(build_id: ci_build.id, scan_type: 2) }
+
+ around do |example|
+ freeze_time { Sidekiq::Testing.fake! { example.run } }
+ end
+
+ it 'schedules the background jobs', :aggregate_failures do
+ migrate!
+
+ expect(BackgroundMigrationWorker.jobs.size).to be(2)
+ expect(described_class::MIGRATION).to be_scheduled_delayed_migration(2.minutes, security_scan_1.id, security_scan_1.id)
+ expect(described_class::MIGRATION).to be_scheduled_delayed_migration(4.minutes, security_scan_2.id, security_scan_2.id)
+ end
+ end
+end
diff --git a/spec/migrations/schedule_sync_issuables_state_id_spec.rb b/spec/migrations/schedule_sync_issuables_state_id_spec.rb
deleted file mode 100644
index 5a7105a0c84..00000000000
--- a/spec/migrations/schedule_sync_issuables_state_id_spec.rb
+++ /dev/null
@@ -1,81 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-require_migration!
-
-RSpec.describe ScheduleSyncIssuablesStateId do
- let(:namespaces) { table(:namespaces) }
- let(:projects) { table(:projects) }
- let(:merge_requests) { table(:merge_requests) }
- let(:issues) { table(:issues) }
- let(:migration) { described_class.new }
- let(:group) { namespaces.create!(name: 'gitlab', path: 'gitlab') }
- let(:project) { projects.create!(namespace_id: group.id) }
-
- shared_examples 'scheduling migrations' do
- before do
- Sidekiq::Worker.clear_all
- stub_const("#{described_class.name}::BATCH_SIZE", 2)
- end
-
- it 'correctly schedules issuable sync background migration' do
- Sidekiq::Testing.fake! do
- freeze_time do
- migrate!
-
- expect(migration).to be_scheduled_delayed_migration(120.seconds, resource_1.id, resource_2.id)
- expect(migration).to be_scheduled_delayed_migration(240.seconds, resource_3.id, resource_4.id)
- expect(BackgroundMigrationWorker.jobs.size).to eq(2)
- end
- end
- end
- end
-
- describe '#up' do
- context 'issues' do
- it 'migrates state column to integer', :sidekiq_might_not_need_inline do
- opened_issue = issues.create!(description: 'first', state: 'opened')
- closed_issue = issues.create!(description: 'second', state: 'closed')
- invalid_state_issue = issues.create!(description: 'fourth', state: 'not valid')
-
- migrate!
-
- expect(opened_issue.reload.state_id).to eq(Issue.available_states[:opened])
- expect(closed_issue.reload.state_id).to eq(Issue.available_states[:closed])
- expect(invalid_state_issue.reload.state_id).to be_nil
- end
-
- it_behaves_like 'scheduling migrations' do
- let(:migration) { described_class::ISSUES_MIGRATION }
- let!(:resource_1) { issues.create!(description: 'first', state: 'opened') }
- let!(:resource_2) { issues.create!(description: 'second', state: 'closed') }
- let!(:resource_3) { issues.create!(description: 'third', state: 'closed') }
- let!(:resource_4) { issues.create!(description: 'fourth', state: 'closed') }
- end
- end
-
- context 'merge requests' do
- it 'migrates state column to integer', :sidekiq_might_not_need_inline do
- opened_merge_request = merge_requests.create!(state: 'opened', target_project_id: project.id, target_branch: 'feature1', source_branch: 'master')
- closed_merge_request = merge_requests.create!(state: 'closed', target_project_id: project.id, target_branch: 'feature2', source_branch: 'master')
- merged_merge_request = merge_requests.create!(state: 'merged', target_project_id: project.id, target_branch: 'feature3', source_branch: 'master')
- locked_merge_request = merge_requests.create!(state: 'locked', target_project_id: project.id, target_branch: 'feature4', source_branch: 'master')
-
- migrate!
-
- expect(opened_merge_request.reload.state_id).to eq(MergeRequest.available_states[:opened])
- expect(closed_merge_request.reload.state_id).to eq(MergeRequest.available_states[:closed])
- expect(merged_merge_request.reload.state_id).to eq(MergeRequest.available_states[:merged])
- expect(locked_merge_request.reload.state_id).to eq(MergeRequest.available_states[:locked])
- end
-
- it_behaves_like 'scheduling migrations' do
- let(:migration) { described_class::MERGE_REQUESTS_MIGRATION }
- let!(:resource_1) { merge_requests.create!(state: 'opened', target_project_id: project.id, target_branch: 'feature1', source_branch: 'master') }
- let!(:resource_2) { merge_requests.create!(state: 'closed', target_project_id: project.id, target_branch: 'feature2', source_branch: 'master') }
- let!(:resource_3) { merge_requests.create!(state: 'merged', target_project_id: project.id, target_branch: 'feature3', source_branch: 'master') }
- let!(:resource_4) { merge_requests.create!(state: 'locked', target_project_id: project.id, target_branch: 'feature4', source_branch: 'master') }
- end
- end
- end
-end
diff --git a/spec/migrations/schedule_sync_issuables_state_id_where_nil_spec.rb b/spec/migrations/schedule_sync_issuables_state_id_where_nil_spec.rb
deleted file mode 100644
index d8eaaa1df04..00000000000
--- a/spec/migrations/schedule_sync_issuables_state_id_where_nil_spec.rb
+++ /dev/null
@@ -1,57 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-require_migration!
-
-RSpec.describe ScheduleSyncIssuablesStateIdWhereNil do
- let(:namespaces) { table(:namespaces) }
- let(:projects) { table(:projects) }
- let(:merge_requests) { table(:merge_requests) }
- let(:issues) { table(:issues) }
- let(:migration) { described_class.new }
- let(:group) { namespaces.create!(name: 'gitlab', path: 'gitlab') }
- let(:project) { projects.create!(namespace_id: group.id) }
-
- shared_examples 'scheduling migrations' do
- before do
- Sidekiq::Worker.clear_all
- stub_const("#{described_class.name}::BATCH_SIZE", 2)
- end
-
- it 'correctly schedules issuable sync background migration' do
- Sidekiq::Testing.fake! do
- freeze_time do
- migrate!
-
- expect(migration).to be_scheduled_delayed_migration(120.seconds, resource_1.id, resource_3.id)
- expect(migration).to be_scheduled_delayed_migration(240.seconds, resource_5.id, resource_5.id)
- expect(BackgroundMigrationWorker.jobs.size).to eq(2)
- end
- end
- end
- end
-
- describe '#up' do
- context 'issues' do
- it_behaves_like 'scheduling migrations' do
- let(:migration) { described_class::ISSUES_MIGRATION }
- let!(:resource_1) { issues.create!(description: 'first', state: 'opened', state_id: nil) }
- let!(:resource_2) { issues.create!(description: 'second', state: 'closed', state_id: 2) }
- let!(:resource_3) { issues.create!(description: 'third', state: 'closed', state_id: nil) }
- let!(:resource_4) { issues.create!(description: 'fourth', state: 'closed', state_id: 2) }
- let!(:resource_5) { issues.create!(description: 'fifth', state: 'closed', state_id: nil) }
- end
- end
-
- context 'merge requests' do
- it_behaves_like 'scheduling migrations' do
- let(:migration) { described_class::MERGE_REQUESTS_MIGRATION }
- let!(:resource_1) { merge_requests.create!(state: 'opened', state_id: nil, target_project_id: project.id, target_branch: 'feature1', source_branch: 'master') }
- let!(:resource_2) { merge_requests.create!(state: 'closed', state_id: 2, target_project_id: project.id, target_branch: 'feature2', source_branch: 'master') }
- let!(:resource_3) { merge_requests.create!(state: 'merged', state_id: nil, target_project_id: project.id, target_branch: 'feature3', source_branch: 'master') }
- let!(:resource_4) { merge_requests.create!(state: 'locked', state_id: 3, target_project_id: project.id, target_branch: 'feature4', source_branch: 'master') }
- let!(:resource_5) { merge_requests.create!(state: 'locked', state_id: nil, target_project_id: project.id, target_branch: 'feature4', source_branch: 'master') }
- end
- end
- end
-end
diff --git a/spec/migrations/set_issue_id_for_all_versions_spec.rb b/spec/migrations/set_issue_id_for_all_versions_spec.rb
deleted file mode 100644
index 78bc4bbce1c..00000000000
--- a/spec/migrations/set_issue_id_for_all_versions_spec.rb
+++ /dev/null
@@ -1,38 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-require_migration!
-
-RSpec.describe SetIssueIdForAllVersions do
- let(:projects) { table(:projects) }
- let(:issues) { table(:issues) }
- let(:designs) { table(:design_management_designs) }
- let(:designs_versions) { table(:design_management_designs_versions) }
- let(:versions) { table(:design_management_versions) }
-
- before do
- @project = projects.create!(name: 'gitlab', path: 'gitlab-org/gitlab-ce', namespace_id: 1)
-
- @issue_1 = issues.create!(description: 'first', project_id: @project.id)
- @issue_2 = issues.create!(description: 'second', project_id: @project.id)
-
- @design_1 = designs.create!(issue_id: @issue_1.id, filename: 'homepage-1.jpg', project_id: @project.id)
- @design_2 = designs.create!(issue_id: @issue_2.id, filename: 'homepage-2.jpg', project_id: @project.id)
-
- @version_1 = versions.create!(sha: 'foo')
- @version_2 = versions.create!(sha: 'bar')
-
- designs_versions.create!(version_id: @version_1.id, design_id: @design_1.id)
- designs_versions.create!(version_id: @version_2.id, design_id: @design_2.id)
- end
-
- it 'correctly sets issue_id' do
- expect(versions.where(issue_id: nil).count).to eq(2)
-
- migrate!
-
- expect(versions.where(issue_id: nil).count).to eq(0)
- expect(versions.find(@version_1.id).issue_id).to eq(@issue_1.id)
- expect(versions.find(@version_2.id).issue_id).to eq(@issue_2.id)
- end
-end
diff --git a/spec/migrations/sync_issuables_state_id_spec.rb b/spec/migrations/sync_issuables_state_id_spec.rb
deleted file mode 100644
index 67403893f74..00000000000
--- a/spec/migrations/sync_issuables_state_id_spec.rb
+++ /dev/null
@@ -1,41 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-require_migration!
-
-RSpec.describe SyncIssuablesStateId do
- let(:migration) { described_class.new }
-
- describe '#up' do
- let(:issues) { table(:issues) }
- let(:namespaces) { table(:namespaces) }
- let(:projects) { table(:projects) }
- let(:merge_requests) { table(:merge_requests) }
- let(:group) { namespaces.create!(name: 'gitlab', path: 'gitlab') }
- let(:project) { projects.create!(namespace_id: group.id) }
- # These state_ids should be the same defined on Issue/MergeRequest models
- let(:state_ids) { { opened: 1, closed: 2, merged: 3, locked: 4 } }
-
- it 'migrates state column to state_id as integer' do
- opened_issue = issues.create!(description: 'first', state: 'opened')
- closed_issue = issues.create!(description: 'second', state: 'closed')
- unknown_state_issue = issues.create!(description: 'second', state: 'unknown')
- opened_merge_request = merge_requests.create!(state: 'opened', target_project_id: project.id, target_branch: 'feature1', source_branch: 'master')
- closed_merge_request = merge_requests.create!(state: 'closed', target_project_id: project.id, target_branch: 'feature2', source_branch: 'master')
- merged_merge_request = merge_requests.create!(state: 'merged', target_project_id: project.id, target_branch: 'feature3', source_branch: 'master')
- locked_merge_request = merge_requests.create!(state: 'locked', target_project_id: project.id, target_branch: 'feature4', source_branch: 'master')
- unknown_state_merge_request = merge_requests.create!(state: 'unknown', target_project_id: project.id, target_branch: 'feature4', source_branch: 'master')
-
- migrate!
-
- expect(opened_issue.reload.state_id).to eq(state_ids[:opened])
- expect(closed_issue.reload.state_id).to eq(state_ids[:closed])
- expect(unknown_state_issue.reload.state_id).to eq(state_ids[:closed])
- expect(opened_merge_request.reload.state_id).to eq(state_ids[:opened])
- expect(closed_merge_request.reload.state_id).to eq(state_ids[:closed])
- expect(merged_merge_request.reload.state_id).to eq(state_ids[:merged])
- expect(locked_merge_request.reload.state_id).to eq(state_ids[:locked])
- expect(unknown_state_merge_request.reload.state_id).to eq(state_ids[:closed])
- end
- end
-end
diff --git a/spec/migrations/truncate_user_fullname_spec.rb b/spec/migrations/truncate_user_fullname_spec.rb
deleted file mode 100644
index dc5bef06cdc..00000000000
--- a/spec/migrations/truncate_user_fullname_spec.rb
+++ /dev/null
@@ -1,23 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-require_migration!
-
-RSpec.describe TruncateUserFullname do
- let(:users) { table(:users) }
-
- let(:user_short) { create_user(name: 'abc', email: 'test_short@example.com') }
- let(:user_long) { create_user(name: 'a' * 200 + 'z', email: 'test_long@example.com') }
-
- def create_user(params)
- users.create!(params.merge(projects_limit: 0))
- end
-
- it 'truncates user full name to the first 128 characters' do
- expect { migrate! }.to change { user_long.reload.name }.to('a' * 128)
- end
-
- it 'does not truncate short names' do
- expect { migrate! }.not_to change { user_short.reload.name.length }
- end
-end
diff --git a/spec/migrations/update_minimum_password_length_spec.rb b/spec/migrations/update_minimum_password_length_spec.rb
deleted file mode 100644
index e40d090fd77..00000000000
--- a/spec/migrations/update_minimum_password_length_spec.rb
+++ /dev/null
@@ -1,30 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-require_migration!
-
-RSpec.describe UpdateMinimumPasswordLength do
- let(:application_settings) { table(:application_settings) }
- let(:application_setting) do
- application_settings.create!(
- minimum_password_length: ApplicationSetting::DEFAULT_MINIMUM_PASSWORD_LENGTH
- )
- end
-
- before do
- stub_const('ApplicationSetting::DEFAULT_MINIMUM_PASSWORD_LENGTH', 10)
- allow(Devise).to receive(:password_length).and_return(12..20)
- end
-
- it 'correctly migrates minimum_password_length' do
- reversible_migration do |migration|
- migration.before -> {
- expect(application_setting.reload.minimum_password_length).to eq(10)
- }
-
- migration.after -> {
- expect(application_setting.reload.minimum_password_length).to eq(12)
- }
- end
- end
-end
diff --git a/spec/models/analytics/cycle_analytics/issue_stage_event_spec.rb b/spec/models/analytics/cycle_analytics/issue_stage_event_spec.rb
index 3e6d4ebd0a2..c0d5b9203b8 100644
--- a/spec/models/analytics/cycle_analytics/issue_stage_event_spec.rb
+++ b/spec/models/analytics/cycle_analytics/issue_stage_event_spec.rb
@@ -8,4 +8,6 @@ RSpec.describe Analytics::CycleAnalytics::IssueStageEvent do
it { is_expected.to validate_presence_of(:group_id) }
it { is_expected.to validate_presence_of(:project_id) }
it { is_expected.to validate_presence_of(:start_event_timestamp) }
+
+ it_behaves_like 'StageEventModel'
end
diff --git a/spec/models/analytics/cycle_analytics/merge_request_stage_event_spec.rb b/spec/models/analytics/cycle_analytics/merge_request_stage_event_spec.rb
index 244c5c70286..82a7e66d62a 100644
--- a/spec/models/analytics/cycle_analytics/merge_request_stage_event_spec.rb
+++ b/spec/models/analytics/cycle_analytics/merge_request_stage_event_spec.rb
@@ -8,4 +8,6 @@ RSpec.describe Analytics::CycleAnalytics::MergeRequestStageEvent do
it { is_expected.to validate_presence_of(:group_id) }
it { is_expected.to validate_presence_of(:project_id) }
it { is_expected.to validate_presence_of(:start_event_timestamp) }
+
+ it_behaves_like 'StageEventModel'
end
diff --git a/spec/models/application_record_spec.rb b/spec/models/application_record_spec.rb
index efb92ddaea0..f0212da3041 100644
--- a/spec/models/application_record_spec.rb
+++ b/spec/models/application_record_spec.rb
@@ -194,7 +194,7 @@ RSpec.describe ApplicationRecord do
end
context 'with database load balancing' do
- let(:session) { double(:session) }
+ let(:session) { Gitlab::Database::LoadBalancing::Session.new }
before do
allow(::Gitlab::Database::LoadBalancing::Session).to receive(:current).and_return(session)
diff --git a/spec/models/application_setting_spec.rb b/spec/models/application_setting_spec.rb
index 3e264867703..8ad83da61f3 100644
--- a/spec/models/application_setting_spec.rb
+++ b/spec/models/application_setting_spec.rb
@@ -77,6 +77,9 @@ RSpec.describe ApplicationSetting do
it { is_expected.to validate_numericality_of(:container_registry_cleanup_tags_service_max_list_size).only_integer.is_greater_than_or_equal_to(0) }
it { is_expected.to validate_numericality_of(:container_registry_expiration_policies_worker_capacity).only_integer.is_greater_than_or_equal_to(0) }
+ it { is_expected.to validate_numericality_of(:dependency_proxy_ttl_group_policy_worker_capacity).only_integer.is_greater_than_or_equal_to(0) }
+ it { is_expected.not_to allow_value(nil).for(:dependency_proxy_ttl_group_policy_worker_capacity) }
+
it { is_expected.to validate_numericality_of(:snippet_size_limit).only_integer.is_greater_than(0) }
it { is_expected.to validate_numericality_of(:wiki_page_max_content_bytes).only_integer.is_greater_than_or_equal_to(1024) }
it { is_expected.to validate_presence_of(:max_artifacts_size) }
@@ -946,6 +949,10 @@ RSpec.describe ApplicationSetting do
throttle_unauthenticated_files_api_period_in_seconds
throttle_authenticated_files_api_requests_per_period
throttle_authenticated_files_api_period_in_seconds
+ throttle_unauthenticated_deprecated_api_requests_per_period
+ throttle_unauthenticated_deprecated_api_period_in_seconds
+ throttle_authenticated_deprecated_api_requests_per_period
+ throttle_authenticated_deprecated_api_period_in_seconds
throttle_authenticated_git_lfs_requests_per_period
throttle_authenticated_git_lfs_period_in_seconds
]
diff --git a/spec/models/bulk_import_spec.rb b/spec/models/bulk_import_spec.rb
index 4cfec6b20b7..ea002a7b174 100644
--- a/spec/models/bulk_import_spec.rb
+++ b/spec/models/bulk_import_spec.rb
@@ -21,4 +21,18 @@ RSpec.describe BulkImport, type: :model do
expect(described_class.all_human_statuses).to contain_exactly('created', 'started', 'finished', 'failed')
end
end
+
+ describe '.min_gl_version_for_project' do
+ it { expect(described_class.min_gl_version_for_project_migration).to be_a(Gitlab::VersionInfo) }
+ it { expect(described_class.min_gl_version_for_project_migration.to_s).to eq('14.4.0') }
+ end
+
+ describe '#source_version_info' do
+ it 'returns source_version as Gitlab::VersionInfo' do
+ bulk_import = build(:bulk_import, source_version: '9.13.2')
+
+ expect(bulk_import.source_version_info).to be_a(Gitlab::VersionInfo)
+ expect(bulk_import.source_version_info.to_s).to eq(bulk_import.source_version)
+ end
+ end
end
diff --git a/spec/models/bulk_imports/entity_spec.rb b/spec/models/bulk_imports/entity_spec.rb
index c1cbe61885f..278d7f4bc56 100644
--- a/spec/models/bulk_imports/entity_spec.rb
+++ b/spec/models/bulk_imports/entity_spec.rb
@@ -179,7 +179,7 @@ RSpec.describe BulkImports::Entity, type: :model do
entity = create(:bulk_import_entity, :group_entity)
entity.create_pipeline_trackers!
- expect(entity.trackers.count).to eq(BulkImports::Groups::Stage.pipelines.count)
+ expect(entity.trackers.count).to eq(BulkImports::Groups::Stage.new(entity.bulk_import).pipelines.count)
expect(entity.trackers.map(&:pipeline_name)).to include(BulkImports::Groups::Pipelines::GroupPipeline.to_s)
end
end
@@ -189,7 +189,7 @@ RSpec.describe BulkImports::Entity, type: :model do
entity = create(:bulk_import_entity, :project_entity)
entity.create_pipeline_trackers!
- expect(entity.trackers.count).to eq(BulkImports::Projects::Stage.pipelines.count)
+ expect(entity.trackers.count).to eq(BulkImports::Projects::Stage.new(entity.bulk_import).pipelines.count)
expect(entity.trackers.map(&:pipeline_name)).to include(BulkImports::Projects::Pipelines::ProjectPipeline.to_s)
end
end
@@ -207,4 +207,40 @@ RSpec.describe BulkImports::Entity, type: :model do
expect(entity.pipeline_exists?('BulkImports::Groups::Pipelines::InexistentPipeline')).to eq(false)
end
end
+
+ describe '#pluralized_name' do
+ context 'when entity is group' do
+ it 'returns groups' do
+ entity = build(:bulk_import_entity, :group_entity)
+
+ expect(entity.pluralized_name).to eq('groups')
+ end
+ end
+
+ context 'when entity is project' do
+ it 'returns projects' do
+ entity = build(:bulk_import_entity, :project_entity)
+
+ expect(entity.pluralized_name).to eq('projects')
+ end
+ end
+ end
+
+ describe '#export_relations_url_path' do
+ context 'when entity is group' do
+ it 'returns group export relations url' do
+ entity = build(:bulk_import_entity, :group_entity)
+
+ expect(entity.export_relations_url_path).to eq("/groups/#{entity.encoded_source_full_path}/export_relations")
+ end
+ end
+
+ context 'when entity is project' do
+ it 'returns project export relations url' do
+ entity = build(:bulk_import_entity, :project_entity)
+
+ expect(entity.export_relations_url_path).to eq("/projects/#{entity.encoded_source_full_path}/export_relations")
+ end
+ end
+ end
end
diff --git a/spec/models/bulk_imports/file_transfer/group_config_spec.rb b/spec/models/bulk_imports/file_transfer/group_config_spec.rb
index 1e566a7b042..8660114b719 100644
--- a/spec/models/bulk_imports/file_transfer/group_config_spec.rb
+++ b/spec/models/bulk_imports/file_transfer/group_config_spec.rb
@@ -23,10 +23,8 @@ RSpec.describe BulkImports::FileTransfer::GroupConfig do
end
describe '#export_path' do
- it 'returns correct export path' do
- expect(::Gitlab::ImportExport).to receive(:storage_path).and_return('storage_path')
-
- expect(subject.export_path).to eq("storage_path/#{exportable.full_path}/#{hex}")
+ it 'returns tmpdir location' do
+ expect(subject.export_path).to include(File.join(Dir.tmpdir, 'bulk_imports'))
end
end
diff --git a/spec/models/bulk_imports/file_transfer/project_config_spec.rb b/spec/models/bulk_imports/file_transfer/project_config_spec.rb
index db037528ec1..3bd79333f0c 100644
--- a/spec/models/bulk_imports/file_transfer/project_config_spec.rb
+++ b/spec/models/bulk_imports/file_transfer/project_config_spec.rb
@@ -23,10 +23,8 @@ RSpec.describe BulkImports::FileTransfer::ProjectConfig do
end
describe '#export_path' do
- it 'returns correct export path' do
- expect(::Gitlab::ImportExport).to receive(:storage_path).and_return('storage_path')
-
- expect(subject.export_path).to eq("storage_path/#{exportable.disk_path}/#{hex}")
+ it 'returns tmpdir location' do
+ expect(subject.export_path).to include(File.join(Dir.tmpdir, 'bulk_imports'))
end
end
@@ -51,4 +49,46 @@ RSpec.describe BulkImports::FileTransfer::ProjectConfig do
expect(subject.relation_excluded_keys('project')).to include('creator_id')
end
end
+
+ describe '#tree_relation?' do
+ context 'when it is a tree relation' do
+ it 'returns true' do
+ expect(subject.tree_relation?('labels')).to eq(true)
+ end
+ end
+
+ context 'when it is not a tree relation' do
+ it 'returns false' do
+ expect(subject.tree_relation?('example')).to eq(false)
+ end
+ end
+ end
+
+ describe '#file_relation?' do
+ context 'when it is a file relation' do
+ it 'returns true' do
+ expect(subject.file_relation?('uploads')).to eq(true)
+ end
+ end
+
+ context 'when it is not a file relation' do
+ it 'returns false' do
+ expect(subject.file_relation?('example')).to eq(false)
+ end
+ end
+ end
+
+ describe '#tree_relation_definition_for' do
+ it 'returns relation definition' do
+ expected = { service_desk_setting: { except: [:outgoing_name, :file_template_project_id], include: [] } }
+
+ expect(subject.tree_relation_definition_for('service_desk_setting')).to eq(expected)
+ end
+
+ context 'when relation is not tree relation' do
+ it 'returns' do
+ expect(subject.tree_relation_definition_for('example')).to be_nil
+ end
+ end
+ end
end
diff --git a/spec/models/bulk_imports/tracker_spec.rb b/spec/models/bulk_imports/tracker_spec.rb
index 7f0a7d4f1ae..a72b628e329 100644
--- a/spec/models/bulk_imports/tracker_spec.rb
+++ b/spec/models/bulk_imports/tracker_spec.rb
@@ -66,7 +66,8 @@ RSpec.describe BulkImports::Tracker, type: :model do
describe '#pipeline_class' do
it 'returns the pipeline class' do
- pipeline_class = BulkImports::Groups::Stage.pipelines.first[1]
+ bulk_import = create(:bulk_import)
+ pipeline_class = BulkImports::Groups::Stage.new(bulk_import).pipelines.first[1]
tracker = create(:bulk_import_tracker, pipeline_name: pipeline_class)
expect(tracker.pipeline_class).to eq(pipeline_class)
diff --git a/spec/models/ci/bridge_spec.rb b/spec/models/ci/bridge_spec.rb
index 6dd3c40f228..8f1ae9c5f02 100644
--- a/spec/models/ci/bridge_spec.rb
+++ b/spec/models/ci/bridge_spec.rb
@@ -17,6 +17,8 @@ RSpec.describe Ci::Bridge do
{ trigger: { project: 'my/project', branch: 'master' } }
end
+ it { is_expected.to respond_to(:runner_features) }
+
it 'has many sourced pipelines' do
expect(bridge).to have_many(:sourced_pipelines)
end
@@ -76,7 +78,7 @@ RSpec.describe Ci::Bridge do
bridge.enqueue!
- expect(::Ci::CreateCrossProjectPipelineWorker.jobs.last['args']).to eq([bridge.id])
+ expect(::Ci::CreateDownstreamPipelineWorker.jobs.last['args']).to eq([bridge.id])
end
end
@@ -85,7 +87,7 @@ RSpec.describe Ci::Bridge do
bridge.enqueue_waiting_for_resource!
- expect(::Ci::CreateCrossProjectPipelineWorker.jobs.last['args']).to eq([bridge.id])
+ expect(::Ci::CreateDownstreamPipelineWorker.jobs.last['args']).to match_array([bridge.id])
end
it 'raises error when the status is failed' do
diff --git a/spec/models/ci/build_spec.rb b/spec/models/ci/build_spec.rb
index 1e06d566c80..2ebf75a1d8a 100644
--- a/spec/models/ci/build_spec.rb
+++ b/spec/models/ci/build_spec.rb
@@ -29,11 +29,13 @@ RSpec.describe Ci::Build do
it { is_expected.to have_one(:deployment) }
it { is_expected.to have_one(:runner_session) }
it { is_expected.to have_one(:trace_metadata) }
+ it { is_expected.to have_many(:terraform_state_versions).dependent(:nullify).inverse_of(:build) }
it { is_expected.to validate_presence_of(:ref) }
it { is_expected.to respond_to(:has_trace?) }
it { is_expected.to respond_to(:trace) }
+ it { is_expected.to respond_to(:runner_features) }
it { is_expected.to delegate_method(:merge_request?).to(:pipeline) }
it { is_expected.to delegate_method(:merge_request_ref?).to(:pipeline) }
@@ -345,10 +347,10 @@ RSpec.describe Ci::Build do
end
describe '#stick_build_if_status_changed' do
- it 'sticks the build if the status changed', :db_load_balancing do
+ it 'sticks the build if the status changed' do
job = create(:ci_build, :pending)
- expect(Gitlab::Database::LoadBalancing::Sticking).to receive(:stick)
+ expect(ApplicationRecord.sticking).to receive(:stick)
.with(:build, job.id)
job.update!(status: :running)
@@ -1288,7 +1290,7 @@ RSpec.describe Ci::Build do
end
end
- describe 'state transition as a deployable' do
+ shared_examples_for 'state transition as a deployable' do
subject { build.send(event) }
let!(:build) { create(:ci_build, :with_deployment, :start_review_app, project: project, pipeline: pipeline) }
@@ -1397,6 +1399,36 @@ RSpec.describe Ci::Build do
end
end
+ it_behaves_like 'state transition as a deployable' do
+ context 'when transits to running' do
+ let(:event) { :run! }
+
+ context 'when deployment is already running state' do
+ before do
+ build.deployment.success!
+ end
+
+ it 'does not change deployment status and tracks an error' do
+ expect(Gitlab::ErrorTracking)
+ .to receive(:track_exception).with(
+ instance_of(Deployment::StatusSyncError), deployment_id: deployment.id, build_id: build.id)
+
+ with_cross_database_modification_prevented do
+ expect { subject }.not_to change { deployment.reload.status }
+ end
+ end
+ end
+ end
+ end
+
+ context 'when update_deployment_after_transaction_commit feature flag is disabled' do
+ before do
+ stub_feature_flags(update_deployment_after_transaction_commit: false)
+ end
+
+ it_behaves_like 'state transition as a deployable'
+ end
+
describe '#on_stop' do
subject { build.on_stop }
@@ -3946,7 +3978,7 @@ RSpec.describe Ci::Build do
end
it 'can drop the build' do
- expect(Gitlab::ErrorTracking).to receive(:track_and_raise_for_dev_exception)
+ expect(Gitlab::ErrorTracking).to receive(:track_exception)
expect { build.drop! }.not_to raise_error
@@ -5288,4 +5320,10 @@ RSpec.describe Ci::Build do
expect(build.reload.queuing_entry).not_to be_present
end
end
+
+ it 'does not generate cross DB queries when a record is created via FactoryBot' do
+ with_cross_database_modification_prevented do
+ create(:ci_build)
+ end
+ end
end
diff --git a/spec/models/ci/build_trace_metadata_spec.rb b/spec/models/ci/build_trace_metadata_spec.rb
index 5e4645c5dc4..120e4289da2 100644
--- a/spec/models/ci/build_trace_metadata_spec.rb
+++ b/spec/models/ci/build_trace_metadata_spec.rb
@@ -88,14 +88,16 @@ RSpec.describe Ci::BuildTraceMetadata do
describe '#track_archival!' do
let(:trace_artifact) { create(:ci_job_artifact) }
let(:metadata) { create(:ci_build_trace_metadata) }
+ let(:checksum) { SecureRandom.hex }
it 'stores the artifact id and timestamp' do
expect(metadata.trace_artifact_id).to be_nil
- metadata.track_archival!(trace_artifact.id)
+ metadata.track_archival!(trace_artifact.id, checksum)
metadata.reload
expect(metadata.trace_artifact_id).to eq(trace_artifact.id)
+ expect(metadata.checksum).to eq(checksum)
expect(metadata.archived_at).to be_like_time(Time.current)
end
end
@@ -131,4 +133,29 @@ RSpec.describe Ci::BuildTraceMetadata do
end
end
end
+
+ describe '#remote_checksum_valid?' do
+ using RSpec::Parameterized::TableSyntax
+
+ let(:metadata) do
+ build(:ci_build_trace_metadata,
+ checksum: checksum,
+ remote_checksum: remote_checksum)
+ end
+
+ subject { metadata.remote_checksum_valid? }
+
+ where(:checksum, :remote_checksum, :result) do
+ nil | nil | false
+ nil | 'a' | false
+ 'a' | nil | false
+ 'a' | 'b' | false
+ 'b' | 'a' | false
+ 'a' | 'a' | true
+ end
+
+ with_them do
+ it { is_expected.to eq(result) }
+ end
+ end
end
diff --git a/spec/models/ci/pipeline_spec.rb b/spec/models/ci/pipeline_spec.rb
index 1007d64438f..98b55ccb76b 100644
--- a/spec/models/ci/pipeline_spec.rb
+++ b/spec/models/ci/pipeline_spec.rb
@@ -35,6 +35,8 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do
it { is_expected.to have_many(:sourced_pipelines) }
it { is_expected.to have_many(:triggered_pipelines) }
it { is_expected.to have_many(:pipeline_artifacts) }
+ it { is_expected.to have_many(:package_build_infos).dependent(:nullify).inverse_of(:pipeline) }
+ it { is_expected.to have_many(:package_file_build_infos).dependent(:nullify).inverse_of(:pipeline) }
it { is_expected.to have_one(:chat_data) }
it { is_expected.to have_one(:source_pipeline) }
@@ -1219,32 +1221,6 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do
%w(test success),
%w(deploy running)])
end
-
- context 'when commit status is retried' do
- let!(:old_commit_status) do
- create(:commit_status, pipeline: pipeline,
- stage: 'build',
- name: 'mac',
- stage_idx: 0,
- status: 'success')
- end
-
- context 'when FF ci_remove_update_retried_from_process_pipeline is disabled' do
- before do
- stub_feature_flags(ci_remove_update_retried_from_process_pipeline: false)
-
- Ci::ProcessPipelineService
- .new(pipeline)
- .execute
- end
-
- it 'ignores the previous state' do
- expect(statuses).to eq([%w(build success),
- %w(test success),
- %w(deploy running)])
- end
- end
- end
end
context 'when there is a stage with warnings' do
@@ -2906,121 +2882,30 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do
end
end
- describe '#execute_hooks' do
+ describe 'hooks trigerring' do
let_it_be(:pipeline) { create(:ci_empty_pipeline, :created) }
- let!(:build_a) { create_build('a', 0) }
- let!(:build_b) { create_build('b', 0) }
-
- let!(:hook) do
- create(:project_hook, pipeline_events: enabled)
- end
-
- before do
- WebHookWorker.drain
- end
-
- context 'with pipeline hooks enabled' do
- let(:enabled) { true }
-
- before do
- stub_full_request(hook.url, method: :post)
- end
-
- context 'with multiple builds', :sidekiq_inline do
- context 'when build is queued' do
- before do
- build_a.reload.enqueue
- build_b.reload.enqueue
- end
-
- it 'receives a pending event once' do
- expect(WebMock).to have_requested_pipeline_hook('pending').once
- end
-
- it 'builds hook data once' do
- create(:pipelines_email_integration)
-
- expect(Gitlab::DataBuilder::Pipeline).to receive(:build).once.and_call_original
-
- pipeline.execute_hooks
- end
- end
-
- context 'when build is run' do
- before do
- build_a.reload.enqueue
- build_a.reload.run!
- build_b.reload.enqueue
- build_b.reload.run!
- end
-
- it 'receives a running event once' do
- expect(WebMock).to have_requested_pipeline_hook('running').once
- end
- end
-
- context 'when all builds succeed' do
- before do
- build_a.success
-
- # We have to reload build_b as this is in next stage and it gets triggered by PipelineProcessWorker
- build_b.reload.success
- end
-
- it 'receives a success event once' do
- expect(WebMock).to have_requested_pipeline_hook('success').once
- end
- end
+ %i[
+ enqueue
+ request_resource
+ prepare
+ run
+ skip
+ drop
+ succeed
+ cancel
+ block
+ delay
+ ].each do |action|
+ context "when pipeline action is #{action}" do
+ let(:pipeline_action) { action }
- context 'when stage one failed' do
- let!(:build_b) { create_build('b', 1) }
-
- before do
- build_a.drop
- end
+ it 'schedules a new PipelineHooksWorker job' do
+ expect(PipelineHooksWorker).to receive(:perform_async).with(pipeline.id)
- it 'receives a failed event once' do
- expect(WebMock).to have_requested_pipeline_hook('failed').once
- end
+ pipeline.reload.public_send(pipeline_action)
end
-
- def have_requested_pipeline_hook(status)
- have_requested(:post, stubbed_hostname(hook.url)).with do |req|
- json_body = Gitlab::Json.parse(req.body)
- json_body['object_attributes']['status'] == status &&
- json_body['builds'].length == 2
- end
- end
- end
- end
-
- context 'with pipeline hooks disabled' do
- let(:enabled) { false }
-
- before do
- build_a.enqueue
- build_b.enqueue
- end
-
- it 'did not execute pipeline_hook after touched' do
- expect(WebMock).not_to have_requested(:post, hook.url)
end
-
- it 'does not build hook data' do
- expect(Gitlab::DataBuilder::Pipeline).not_to receive(:build)
-
- pipeline.execute_hooks
- end
- end
-
- def create_build(name, stage_idx)
- create(:ci_build,
- :created,
- pipeline: pipeline,
- name: name,
- stage: "stage:#{stage_idx}",
- stage_idx: stage_idx)
end
end
diff --git a/spec/models/ci/processable_spec.rb b/spec/models/ci/processable_spec.rb
index 0a43f785598..ac1a8247aaa 100644
--- a/spec/models/ci/processable_spec.rb
+++ b/spec/models/ci/processable_spec.rb
@@ -147,13 +147,20 @@ RSpec.describe Ci::Processable do
end
it 'releases a resource when build finished' do
- expect(build.resource_group).to receive(:release_resource_from).with(build).and_call_original
+ expect(build.resource_group).to receive(:release_resource_from).with(build).and_return(true).and_call_original
expect(Ci::ResourceGroups::AssignResourceFromResourceGroupWorker).to receive(:perform_async).with(build.resource_group_id)
build.enqueue_waiting_for_resource!
build.success!
end
+ it 're-checks the resource group even if the processable does not retain a resource' do
+ expect(build.resource_group).to receive(:release_resource_from).with(build).and_return(false).and_call_original
+ expect(Ci::ResourceGroups::AssignResourceFromResourceGroupWorker).to receive(:perform_async).with(build.resource_group_id)
+
+ build.success!
+ end
+
context 'when build has prerequisites' do
before do
allow(build).to receive(:any_unmet_prerequisites?) { true }
diff --git a/spec/models/ci/resource_group_spec.rb b/spec/models/ci/resource_group_spec.rb
index 50a786419f2..aae16157fbf 100644
--- a/spec/models/ci/resource_group_spec.rb
+++ b/spec/models/ci/resource_group_spec.rb
@@ -85,4 +85,61 @@ RSpec.describe Ci::ResourceGroup do
end
end
end
+
+ describe '#upcoming_processables' do
+ subject { resource_group.upcoming_processables }
+
+ let_it_be(:project) { create(:project, :repository) }
+ let_it_be(:pipeline_1) { create(:ci_pipeline, project: project) }
+ let_it_be(:pipeline_2) { create(:ci_pipeline, project: project) }
+
+ let!(:resource_group) { create(:ci_resource_group, process_mode: process_mode, project: project) }
+
+ Ci::HasStatus::STATUSES_ENUM.keys.each do |status|
+ let!("build_1_#{status}") { create(:ci_build, pipeline: pipeline_1, status: status, resource_group: resource_group) }
+ let!("build_2_#{status}") { create(:ci_build, pipeline: pipeline_2, status: status, resource_group: resource_group) }
+ end
+
+ context 'when process mode is unordered' do
+ let(:process_mode) { :unordered }
+
+ it 'returns correct jobs in an indeterministic order' do
+ expect(subject).to contain_exactly(build_1_waiting_for_resource, build_2_waiting_for_resource)
+ end
+ end
+
+ context 'when process mode is oldest_first' do
+ let(:process_mode) { :oldest_first }
+
+ it 'returns correct jobs in a specific order' do
+ expect(subject[0]).to eq(build_1_waiting_for_resource)
+ expect(subject[1..2]).to contain_exactly(build_1_created, build_1_scheduled)
+ expect(subject[3]).to eq(build_2_waiting_for_resource)
+ expect(subject[4..5]).to contain_exactly(build_2_created, build_2_scheduled)
+ end
+ end
+
+ context 'when process mode is newest_first' do
+ let(:process_mode) { :newest_first }
+
+ it 'returns correct jobs in a specific order' do
+ expect(subject[0]).to eq(build_2_waiting_for_resource)
+ expect(subject[1..2]).to contain_exactly(build_2_created, build_2_scheduled)
+ expect(subject[3]).to eq(build_1_waiting_for_resource)
+ expect(subject[4..5]).to contain_exactly(build_1_created, build_1_scheduled)
+ end
+ end
+
+ context 'when process mode is unknown' do
+ let(:process_mode) { :unordered }
+
+ before do
+ resource_group.update_column(:process_mode, 3)
+ end
+
+ it 'returns empty' do
+ is_expected.to be_empty
+ end
+ end
+ end
end
diff --git a/spec/models/ci/runner_spec.rb b/spec/models/ci/runner_spec.rb
index 31e854c852e..826332268c5 100644
--- a/spec/models/ci/runner_spec.rb
+++ b/spec/models/ci/runner_spec.rb
@@ -5,6 +5,20 @@ require 'spec_helper'
RSpec.describe Ci::Runner do
it_behaves_like 'having unique enum values'
+ describe 'groups association' do
+ # Due to other assoctions such as projects this whole spec is allowed to
+ # generate cross-database queries. So we have this temporary spec to
+ # validate that at least groups association does not generate cross-DB
+ # queries.
+ it 'does not create a cross-database query' do
+ runner = create(:ci_runner, :group)
+
+ with_cross_joins_prevented do
+ expect(runner.groups.count).to eq(1)
+ end
+ end
+ end
+
describe 'validation' do
it { is_expected.to validate_presence_of(:access_level) }
it { is_expected.to validate_presence_of(:runner_type) }
@@ -257,7 +271,7 @@ RSpec.describe Ci::Runner do
expect(subject).to be_truthy
expect(runner).to be_project_type
- expect(runner.projects).to eq([project])
+ expect(runner.runner_projects.pluck(:project_id)).to match_array([project.id])
expect(runner.only_for?(project)).to be_truthy
end
end
@@ -383,10 +397,7 @@ RSpec.describe Ci::Runner do
it 'sticks the runner to the primary and calls the original method' do
runner = create(:ci_runner)
- allow(Gitlab::Database::LoadBalancing).to receive(:enable?)
- .and_return(true)
-
- expect(Gitlab::Database::LoadBalancing::Sticking).to receive(:stick)
+ expect(ApplicationRecord.sticking).to receive(:stick)
.with(:runner, runner.id)
expect(Gitlab::Workhorse).to receive(:set_key_and_notify)
@@ -724,7 +735,7 @@ RSpec.describe Ci::Runner do
context 'with invalid runner' do
before do
- runner.projects = []
+ runner.runner_projects.delete_all
end
it 'still updates redis cache and database' do
diff --git a/spec/models/clusters/agents/group_authorization_spec.rb b/spec/models/clusters/agents/group_authorization_spec.rb
index 2a99fb26e3f..baeb8f5464e 100644
--- a/spec/models/clusters/agents/group_authorization_spec.rb
+++ b/spec/models/clusters/agents/group_authorization_spec.rb
@@ -7,4 +7,10 @@ RSpec.describe Clusters::Agents::GroupAuthorization do
it { is_expected.to belong_to(:group).class_name('::Group').required }
it { expect(described_class).to validate_jsonb_schema(['config']) }
+
+ describe '#config_project' do
+ let(:record) { create(:agent_group_authorization) }
+
+ it { expect(record.config_project).to eq(record.agent.project) }
+ end
end
diff --git a/spec/models/clusters/agents/implicit_authorization_spec.rb b/spec/models/clusters/agents/implicit_authorization_spec.rb
index 69aa55a350e..2d6c3ddb426 100644
--- a/spec/models/clusters/agents/implicit_authorization_spec.rb
+++ b/spec/models/clusters/agents/implicit_authorization_spec.rb
@@ -9,6 +9,6 @@ RSpec.describe Clusters::Agents::ImplicitAuthorization do
it { expect(subject.agent).to eq(agent) }
it { expect(subject.agent_id).to eq(agent.id) }
- it { expect(subject.project).to eq(agent.project) }
+ it { expect(subject.config_project).to eq(agent.project) }
it { expect(subject.config).to be_nil }
end
diff --git a/spec/models/clusters/agents/project_authorization_spec.rb b/spec/models/clusters/agents/project_authorization_spec.rb
index 134c70739ac..9ba259356c7 100644
--- a/spec/models/clusters/agents/project_authorization_spec.rb
+++ b/spec/models/clusters/agents/project_authorization_spec.rb
@@ -7,4 +7,10 @@ RSpec.describe Clusters::Agents::ProjectAuthorization do
it { is_expected.to belong_to(:project).class_name('Project').required }
it { expect(described_class).to validate_jsonb_schema(['config']) }
+
+ describe '#config_project' do
+ let(:record) { create(:agent_project_authorization) }
+
+ it { expect(record.config_project).to eq(record.agent.project) }
+ end
end
diff --git a/spec/models/clusters/applications/runner_spec.rb b/spec/models/clusters/applications/runner_spec.rb
index 43e2eab3b9d..788430d53d3 100644
--- a/spec/models/clusters/applications/runner_spec.rb
+++ b/spec/models/clusters/applications/runner_spec.rb
@@ -96,8 +96,9 @@ RSpec.describe Clusters::Applications::Runner do
it 'creates a project runner' do
subject
+ runner_projects = Project.where(id: runner.runner_projects.pluck(:project_id))
expect(runner).to be_project_type
- expect(runner.projects).to eq [project]
+ expect(runner_projects).to match_array [project]
end
end
diff --git a/spec/models/commit_spec.rb b/spec/models/commit_spec.rb
index 63fe6923630..ac0ae17f8f7 100644
--- a/spec/models/commit_spec.rb
+++ b/spec/models/commit_spec.rb
@@ -799,7 +799,7 @@ eos
describe '#work_in_progress?' do
[
'squash! ', 'fixup! ', 'wip: ', 'WIP: ', '[WIP] ',
- 'draft: ', 'Draft - ', '[Draft] ', '(draft) ', 'Draft: '
+ 'draft: ', '[Draft] ', '(draft) ', 'Draft: '
].each do |wip_prefix|
it "detects the '#{wip_prefix}' prefix" do
commit.message = "#{wip_prefix}#{commit.message}"
@@ -814,22 +814,18 @@ eos
expect(commit).to be_work_in_progress
end
- it "detects WIP for a commit just saying 'draft'" do
+ it "does not detect WIP for a commit just saying 'draft'" do
commit.message = "draft"
- expect(commit).to be_work_in_progress
- end
-
- it "doesn't detect WIP for a commit that begins with 'FIXUP! '" do
- commit.message = "FIXUP! #{commit.message}"
-
expect(commit).not_to be_work_in_progress
end
- it "doesn't detect WIP for words starting with WIP" do
- commit.message = "Wipout #{commit.message}"
+ ["FIXUP!", "Draft - ", "Wipeout"].each do |draft_prefix|
+ it "doesn't detect '#{draft_prefix}' at the start of the title as a draft" do
+ commit.message = "#{draft_prefix} #{commit.message}"
- expect(commit).not_to be_work_in_progress
+ expect(commit).not_to be_work_in_progress
+ end
end
end
diff --git a/spec/models/commit_status_spec.rb b/spec/models/commit_status_spec.rb
index 7134a387e65..20afddd8470 100644
--- a/spec/models/commit_status_spec.rb
+++ b/spec/models/commit_status_spec.rb
@@ -123,6 +123,16 @@ RSpec.describe CommitStatus do
end
end
+ describe '.scheduled_at_before' do
+ let!(:never_scheduled) { create(:commit_status) }
+ let!(:stale_scheduled) { create(:commit_status, scheduled_at: 1.day.ago) }
+ let!(:fresh_scheduled) { create(:commit_status, scheduled_at: 1.minute.ago) }
+
+ subject { CommitStatus.scheduled_at_before(1.hour.ago) }
+
+ it { is_expected.to contain_exactly(stale_scheduled) }
+ end
+
describe '#processed' do
subject { commit_status.processed }
diff --git a/spec/models/concerns/bulk_insert_safe_spec.rb b/spec/models/concerns/bulk_insert_safe_spec.rb
index 209ee1264d5..172986c142c 100644
--- a/spec/models/concerns/bulk_insert_safe_spec.rb
+++ b/spec/models/concerns/bulk_insert_safe_spec.rb
@@ -17,6 +17,7 @@ RSpec.describe BulkInsertSafe do
t.binary :sha_value, null: false, limit: 20
t.jsonb :jsonb_value, null: false
t.belongs_to :bulk_insert_parent_item, foreign_key: true, null: true
+ t.timestamps null: true
t.index :name, unique: true
end
@@ -179,29 +180,26 @@ RSpec.describe BulkInsertSafe do
end
context 'with returns option set' do
+ let(:items) { bulk_insert_item_class.valid_list(1) }
+
+ subject(:bulk_insert) { bulk_insert_item_class.bulk_insert!(items, returns: returns) }
+
context 'when is set to :ids' do
- it 'return an array with the primary key values for all inserted records' do
- items = bulk_insert_item_class.valid_list(1)
+ let(:returns) { :ids }
- expect(bulk_insert_item_class.bulk_insert!(items, returns: :ids)).to contain_exactly(a_kind_of(Integer))
- end
+ it { is_expected.to contain_exactly(a_kind_of(Integer)) }
end
context 'when is set to nil' do
- it 'returns an empty array' do
- items = bulk_insert_item_class.valid_list(1)
+ let(:returns) { nil }
- expect(bulk_insert_item_class.bulk_insert!(items, returns: nil)).to eq([])
- end
+ it { is_expected.to eq([]) }
end
- context 'when is set to anything else' do
- it 'raises an error' do
- items = bulk_insert_item_class.valid_list(1)
+ context 'when is set to a list of attributes' do
+ let(:returns) { [:id, :sha_value] }
- expect { bulk_insert_item_class.bulk_insert!([items], returns: [:id, :name]) }
- .to raise_error(ArgumentError, "returns needs to be :ids or nil")
- end
+ it { is_expected.to contain_exactly([a_kind_of(Integer), '2fd4e1c67a2d28fced849ee1bb76e7391b93eb12']) }
end
end
end
@@ -228,10 +226,20 @@ RSpec.describe BulkInsertSafe do
end
describe '.bulk_upsert!' do
+ subject(:bulk_upsert) { bulk_insert_item_class.bulk_upsert!([new_object], unique_by: %w[name]) }
+
it 'updates existing object' do
- bulk_insert_item_class.bulk_upsert!([new_object], unique_by: %w[name])
+ expect { bulk_upsert }.to change { existing_object.reload.secret_value }.to('new value')
+ end
- expect(existing_object.reload.secret_value).to eq('new value')
+ context 'when the `created_at` attribute is provided' do
+ before do
+ new_object.created_at = 10.days.from_now
+ end
+
+ it 'does not change the existing `created_at` value' do
+ expect { bulk_upsert }.not_to change { existing_object.reload.created_at }
+ end
end
end
end
@@ -250,7 +258,7 @@ RSpec.describe BulkInsertSafe do
it 'successfully inserts an item' do
expect(ActiveRecord::InsertAll).to receive(:new)
.with(
- bulk_insert_items_with_composite_pk_class, [new_object.as_json], on_duplicate: :raise, returning: false, unique_by: %w[id name]
+ bulk_insert_items_with_composite_pk_class.insert_all_proxy_class, [new_object.as_json], on_duplicate: :raise, returning: false, unique_by: %w[id name]
).and_call_original
expect { bulk_insert_items_with_composite_pk_class.bulk_insert!([new_object]) }.to(
diff --git a/spec/models/concerns/checksummable_spec.rb b/spec/models/concerns/checksummable_spec.rb
index 3a0387333e8..93a65605b50 100644
--- a/spec/models/concerns/checksummable_spec.rb
+++ b/spec/models/concerns/checksummable_spec.rb
@@ -13,11 +13,19 @@ RSpec.describe Checksummable do
end
end
- describe ".hexdigest" do
+ describe ".sha256_hexdigest" do
it 'returns the SHA256 sum of the file' do
expected = Digest::SHA256.file(__FILE__).hexdigest
- expect(subject.hexdigest(__FILE__)).to eq(expected)
+ expect(subject.sha256_hexdigest(__FILE__)).to eq(expected)
+ end
+ end
+
+ describe ".md5_hexdigest" do
+ it 'returns the MD5 sum of the file' do
+ expected = Digest::MD5.file(__FILE__).hexdigest
+
+ expect(subject.md5_hexdigest(__FILE__)).to eq(expected)
end
end
end
diff --git a/spec/models/concerns/ci/has_status_spec.rb b/spec/models/concerns/ci/has_status_spec.rb
index 0709a050056..9dfc7d84f89 100644
--- a/spec/models/concerns/ci/has_status_spec.rb
+++ b/spec/models/concerns/ci/has_status_spec.rb
@@ -363,6 +363,18 @@ RSpec.describe Ci::HasStatus do
it_behaves_like 'not containing the job', status
end
end
+
+ describe '.waiting_for_resource_or_upcoming' do
+ subject { CommitStatus.waiting_for_resource_or_upcoming }
+
+ %i[created scheduled waiting_for_resource].each do |status|
+ it_behaves_like 'containing the job', status
+ end
+
+ %i[running failed success canceled].each do |status|
+ it_behaves_like 'not containing the job', status
+ end
+ end
end
describe '::DEFAULT_STATUS' do
diff --git a/spec/models/concerns/vulnerability_finding_helpers_spec.rb b/spec/models/concerns/vulnerability_finding_helpers_spec.rb
new file mode 100644
index 00000000000..023ecccb520
--- /dev/null
+++ b/spec/models/concerns/vulnerability_finding_helpers_spec.rb
@@ -0,0 +1,27 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe VulnerabilityFindingHelpers do
+ let(:cls) do
+ Class.new do
+ include VulnerabilityFindingHelpers
+
+ attr_accessor :report_type
+
+ def initialize(report_type)
+ @report_type = report_type
+ end
+ end
+ end
+
+ describe '#requires_manual_resolution?' do
+ it 'returns false if the finding does not require manual resolution' do
+ expect(cls.new('sast').requires_manual_resolution?).to eq(false)
+ end
+
+ it 'returns true when the finding requires manual resolution' do
+ expect(cls.new('secret_detection').requires_manual_resolution?).to eq(true)
+ end
+ end
+end
diff --git a/spec/models/customer_relations/contact_spec.rb b/spec/models/customer_relations/contact_spec.rb
index b19554dd67e..298d5db3ab9 100644
--- a/spec/models/customer_relations/contact_spec.rb
+++ b/spec/models/customer_relations/contact_spec.rb
@@ -6,6 +6,7 @@ RSpec.describe CustomerRelations::Contact, type: :model do
describe 'associations' do
it { is_expected.to belong_to(:group) }
it { is_expected.to belong_to(:organization).optional }
+ it { is_expected.to have_and_belong_to_many(:issues) }
end
describe 'validations' do
diff --git a/spec/models/dependency_proxy/blob_spec.rb b/spec/models/dependency_proxy/blob_spec.rb
index 3797f6184fe..3c54d3126a8 100644
--- a/spec/models/dependency_proxy/blob_spec.rb
+++ b/spec/models/dependency_proxy/blob_spec.rb
@@ -2,17 +2,16 @@
require 'spec_helper'
RSpec.describe DependencyProxy::Blob, type: :model do
+ it_behaves_like 'ttl_expirable'
+
describe 'relationships' do
it { is_expected.to belong_to(:group) }
end
- it_behaves_like 'having unique enum values'
-
describe 'validations' do
it { is_expected.to validate_presence_of(:group) }
it { is_expected.to validate_presence_of(:file) }
it { is_expected.to validate_presence_of(:file_name) }
- it { is_expected.to validate_presence_of(:status) }
end
describe '.total_size' do
diff --git a/spec/models/dependency_proxy/image_ttl_group_policy_spec.rb b/spec/models/dependency_proxy/image_ttl_group_policy_spec.rb
index 2906ea7b774..9f6358e1286 100644
--- a/spec/models/dependency_proxy/image_ttl_group_policy_spec.rb
+++ b/spec/models/dependency_proxy/image_ttl_group_policy_spec.rb
@@ -20,4 +20,13 @@ RSpec.describe DependencyProxy::ImageTtlGroupPolicy, type: :model do
it { is_expected.to validate_numericality_of(:ttl).allow_nil.is_greater_than(0) }
end
end
+
+ describe '.enabled' do
+ it 'returns policies that are enabled' do
+ enabled_policy = create(:image_ttl_group_policy)
+ create(:image_ttl_group_policy, :disabled)
+
+ expect(described_class.enabled).to contain_exactly(enabled_policy)
+ end
+ end
end
diff --git a/spec/models/dependency_proxy/manifest_spec.rb b/spec/models/dependency_proxy/manifest_spec.rb
index 2a085b3613b..e7f0889345a 100644
--- a/spec/models/dependency_proxy/manifest_spec.rb
+++ b/spec/models/dependency_proxy/manifest_spec.rb
@@ -2,18 +2,17 @@
require 'spec_helper'
RSpec.describe DependencyProxy::Manifest, type: :model do
+ it_behaves_like 'ttl_expirable'
+
describe 'relationships' do
it { is_expected.to belong_to(:group) }
end
- it_behaves_like 'having unique enum values'
-
describe 'validations' do
it { is_expected.to validate_presence_of(:group) }
it { is_expected.to validate_presence_of(:file) }
it { is_expected.to validate_presence_of(:file_name) }
it { is_expected.to validate_presence_of(:digest) }
- it { is_expected.to validate_presence_of(:status) }
end
describe 'file is being stored' do
diff --git a/spec/models/deployment_spec.rb b/spec/models/deployment_spec.rb
index a0e5e9cbfe4..f9a05fbb06f 100644
--- a/spec/models/deployment_spec.rb
+++ b/spec/models/deployment_spec.rb
@@ -456,18 +456,6 @@ RSpec.describe Deployment do
end
end
- describe 'with_deployable' do
- subject { described_class.with_deployable }
-
- it 'retrieves deployments with deployable builds' do
- with_deployable = create(:deployment)
- create(:deployment, deployable: nil)
- create(:deployment, deployable_type: 'CommitStatus', deployable_id: non_existing_record_id)
-
- is_expected.to contain_exactly(with_deployable)
- end
- end
-
describe 'visible' do
subject { described_class.visible }
@@ -613,6 +601,26 @@ RSpec.describe Deployment do
end
end
+ describe '.builds' do
+ let!(:deployment1) { create(:deployment) }
+ let!(:deployment2) { create(:deployment) }
+ let!(:deployment3) { create(:deployment) }
+
+ subject { described_class.builds }
+
+ it 'retrieves builds for the deployments' do
+ is_expected.to match_array(
+ [deployment1.deployable, deployment2.deployable, deployment3.deployable])
+ end
+
+ it 'does not fetch the null deployable_ids' do
+ deployment3.update!(deployable_id: nil, deployable_type: nil)
+
+ is_expected.to match_array(
+ [deployment1.deployable, deployment2.deployable])
+ end
+ end
+
describe '#previous_deployment' do
using RSpec::Parameterized::TableSyntax
@@ -757,7 +765,7 @@ RSpec.describe Deployment do
expect(Deployments::LinkMergeRequestWorker).to receive(:perform_async)
expect(Deployments::HooksWorker).to receive(:perform_async)
- deploy.update_status('success')
+ expect(deploy.update_status('success')).to eq(true)
end
it 'updates finished_at when transitioning to a finished status' do
@@ -767,6 +775,139 @@ RSpec.describe Deployment do
expect(deploy.read_attribute(:finished_at)).to eq(Time.current)
end
end
+
+ it 'tracks an exception if an invalid status transition is detected' do
+ expect(Gitlab::ErrorTracking)
+ .to receive(:track_exception)
+ .with(instance_of(described_class::StatusUpdateError), deployment_id: deploy.id)
+
+ expect(deploy.update_status('running')).to eq(false)
+ end
+
+ it 'tracks an exception if an invalid argument' do
+ expect(Gitlab::ErrorTracking)
+ .to receive(:track_exception)
+ .with(instance_of(described_class::StatusUpdateError), deployment_id: deploy.id)
+
+ expect(deploy.update_status('created')).to eq(false)
+ end
+ end
+
+ describe '#sync_status_with' do
+ subject { deployment.sync_status_with(ci_build) }
+
+ let_it_be(:project) { create(:project, :repository) }
+
+ let(:deployment) { create(:deployment, project: project, status: deployment_status) }
+ let(:ci_build) { create(:ci_build, project: project, status: build_status) }
+
+ shared_examples_for 'synchronizing deployment' do
+ it 'changes deployment status' do
+ expect(Gitlab::ErrorTracking).not_to receive(:track_exception)
+
+ is_expected.to eq(true)
+
+ expect(deployment.status).to eq(build_status.to_s)
+ expect(deployment.errors).to be_empty
+ end
+ end
+
+ shared_examples_for 'gracefully handling error' do
+ it 'tracks an exception' do
+ expect(Gitlab::ErrorTracking).to receive(:track_exception).with(
+ instance_of(described_class::StatusSyncError),
+ deployment_id: deployment.id,
+ build_id: ci_build.id)
+
+ is_expected.to eq(false)
+
+ expect(deployment.status).to eq(deployment_status.to_s)
+ expect(deployment.errors.full_messages).to include(error_message)
+ end
+ end
+
+ shared_examples_for 'ignoring build' do
+ it 'does not change deployment status' do
+ expect(Gitlab::ErrorTracking).not_to receive(:track_exception)
+
+ is_expected.to eq(false)
+
+ expect(deployment.status).to eq(deployment_status.to_s)
+ expect(deployment.errors).to be_empty
+ end
+ end
+
+ context 'with created deployment' do
+ let(:deployment_status) { :created }
+
+ context 'with running build' do
+ let(:build_status) { :running }
+
+ it_behaves_like 'synchronizing deployment'
+ end
+
+ context 'with finished build' do
+ let(:build_status) { :success }
+
+ it_behaves_like 'synchronizing deployment'
+ end
+
+ context 'with unrelated build' do
+ let(:build_status) { :waiting_for_resource }
+
+ it_behaves_like 'ignoring build'
+ end
+ end
+
+ context 'with running deployment' do
+ let(:deployment_status) { :running }
+
+ context 'with running build' do
+ let(:build_status) { :running }
+
+ it_behaves_like 'gracefully handling error' do
+ let(:error_message) { %Q{Status cannot transition via \"run\"} }
+ end
+ end
+
+ context 'with finished build' do
+ let(:build_status) { :success }
+
+ it_behaves_like 'synchronizing deployment'
+ end
+
+ context 'with unrelated build' do
+ let(:build_status) { :waiting_for_resource }
+
+ it_behaves_like 'ignoring build'
+ end
+ end
+
+ context 'with finished deployment' do
+ let(:deployment_status) { :success }
+
+ context 'with running build' do
+ let(:build_status) { :running }
+
+ it_behaves_like 'gracefully handling error' do
+ let(:error_message) { %Q{Status cannot transition via \"run\"} }
+ end
+ end
+
+ context 'with finished build' do
+ let(:build_status) { :success }
+
+ it_behaves_like 'gracefully handling error' do
+ let(:error_message) { %Q{Status cannot transition via \"succeed\"} }
+ end
+ end
+
+ context 'with unrelated build' do
+ let(:build_status) { :waiting_for_resource }
+
+ it_behaves_like 'ignoring build'
+ end
+ end
end
describe '#valid_sha' do
diff --git a/spec/models/environment_spec.rb b/spec/models/environment_spec.rb
index e3e9d1f7a71..08c639957d3 100644
--- a/spec/models/environment_spec.rb
+++ b/spec/models/environment_spec.rb
@@ -801,38 +801,6 @@ RSpec.describe Environment, :use_clean_rails_memory_store_caching do
expect(query_count).to eq(0)
end
end
-
- context 'when the feature for disable_join is disabled' do
- let(:pipeline) { create(:ci_pipeline, project: project) }
- let(:ci_build) { create(:ci_build, project: project, pipeline: pipeline) }
-
- before do
- stub_feature_flags(environment_last_visible_pipeline_disable_joins: false)
- create(:deployment, :failed, project: project, environment: environment, deployable: ci_build)
- end
-
- context 'for preload' do
- it 'executes the original association instead of override' do
- environment.reload
- ActiveRecord::Associations::Preloader.new.preload(environment, [last_visible_deployable: []])
-
- expect_any_instance_of(Deployment).not_to receive(:deployable)
-
- query_count = ActiveRecord::QueryRecorder.new do
- expect(subject.id).to eq(ci_build.id)
- end.count
-
- expect(query_count).to eq(0)
- end
- end
-
- context 'for direct call' do
- it 'executes the original association instead of override' do
- expect_any_instance_of(Deployment).not_to receive(:deployable)
- expect(subject.id).to eq(ci_build.id)
- end
- end
- end
end
describe '#last_visible_pipeline' do
@@ -963,40 +931,6 @@ RSpec.describe Environment, :use_clean_rails_memory_store_caching do
expect(query_count).to eq(0)
end
end
-
- context 'when the feature for disable_join is disabled' do
- let(:pipeline) { create(:ci_pipeline, project: project) }
- let(:ci_build) { create(:ci_build, project: project, pipeline: pipeline) }
-
- before do
- stub_feature_flags(environment_last_visible_pipeline_disable_joins: false)
- create(:deployment, :failed, project: project, environment: environment, deployable: ci_build)
- end
-
- subject { environment.last_visible_pipeline }
-
- context 'for preload' do
- it 'executes the original association instead of override' do
- environment.reload
- ActiveRecord::Associations::Preloader.new.preload(environment, [last_visible_pipeline: []])
-
- expect_any_instance_of(Ci::Build).not_to receive(:pipeline)
-
- query_count = ActiveRecord::QueryRecorder.new do
- expect(subject.id).to eq(pipeline.id)
- end.count
-
- expect(query_count).to eq(0)
- end
- end
-
- context 'for direct call' do
- it 'executes the original association instead of override' do
- expect_any_instance_of(Ci::Build).not_to receive(:pipeline)
- expect(subject.id).to eq(pipeline.id)
- end
- end
- end
end
describe '#upcoming_deployment' do
diff --git a/spec/models/error_tracking/error_spec.rb b/spec/models/error_tracking/error_spec.rb
index 5543392b624..9b8a81c6372 100644
--- a/spec/models/error_tracking/error_spec.rb
+++ b/spec/models/error_tracking/error_spec.rb
@@ -81,6 +81,13 @@ RSpec.describe ErrorTracking::Error, type: :model do
end
describe '#to_sentry_detailed_error' do
- it { expect(error.to_sentry_detailed_error).to be_kind_of(Gitlab::ErrorTracking::DetailedError) }
+ let_it_be(:event) { create(:error_tracking_error_event, error: error) }
+
+ subject { error.to_sentry_detailed_error }
+
+ it { is_expected.to be_kind_of(Gitlab::ErrorTracking::DetailedError) }
+ it { expect(subject.integrated).to be_truthy }
+ it { expect(subject.first_release_version).to eq('db853d7') }
+ it { expect(subject.last_release_version).to eq('db853d7') }
end
end
diff --git a/spec/models/error_tracking/project_error_tracking_setting_spec.rb b/spec/models/error_tracking/project_error_tracking_setting_spec.rb
index 29255e53fcf..d17541b4a6c 100644
--- a/spec/models/error_tracking/project_error_tracking_setting_spec.rb
+++ b/spec/models/error_tracking/project_error_tracking_setting_spec.rb
@@ -79,6 +79,46 @@ RSpec.describe ErrorTracking::ProjectErrorTrackingSetting do
end
end
+ describe 'Callbacks' do
+ describe 'after_save :create_client_key!' do
+ subject { build(:project_error_tracking_setting, :integrated, project: project) }
+
+ context 'no client key yet' do
+ it 'creates a new client key' do
+ expect { subject.save! }.to change { ErrorTracking::ClientKey.count }.by(1)
+ end
+
+ context 'sentry backend' do
+ before do
+ subject.integrated = false
+ end
+
+ it 'does not create a new client key' do
+ expect { subject.save! }.not_to change { ErrorTracking::ClientKey.count }
+ end
+ end
+
+ context 'feature disabled' do
+ before do
+ subject.enabled = false
+ end
+
+ it 'does not create a new client key' do
+ expect { subject.save! }.not_to change { ErrorTracking::ClientKey.count }
+ end
+ end
+ end
+
+ context 'client key already exists' do
+ let!(:client_key) { create(:error_tracking_client_key, project: project) }
+
+ it 'does not create a new client key' do
+ expect { subject.save! }.not_to change { ErrorTracking::ClientKey.count }
+ end
+ end
+ end
+ end
+
describe '.extract_sentry_external_url' do
subject { described_class.extract_sentry_external_url(sentry_url) }
@@ -494,4 +534,10 @@ RSpec.describe ErrorTracking::ProjectErrorTrackingSetting do
it { expect(subject.sentry_enabled).to eq(sentry_enabled) }
end
end
+
+ describe '#gitlab_dsn' do
+ let!(:client_key) { create(:error_tracking_client_key, project: project) }
+
+ it { expect(subject.gitlab_dsn).to eq(client_key.sentry_dsn) }
+ end
end
diff --git a/spec/models/group_spec.rb b/spec/models/group_spec.rb
index e8aebe35302..e88abc21ef2 100644
--- a/spec/models/group_spec.rb
+++ b/spec/models/group_spec.rb
@@ -36,6 +36,7 @@ RSpec.describe Group do
it { is_expected.to have_many(:debian_distributions).class_name('Packages::Debian::GroupDistribution').dependent(:destroy) }
it { is_expected.to have_many(:daily_build_group_report_results).class_name('Ci::DailyBuildGroupReportResult') }
it { is_expected.to have_many(:group_callouts).class_name('Users::GroupCallout').with_foreign_key(:group_id) }
+ it { is_expected.to have_many(:bulk_import_exports).class_name('BulkImports::Export') }
describe '#members & #requesters' do
let(:requester) { create(:user) }
@@ -2369,7 +2370,7 @@ RSpec.describe Group do
let_it_be(:project) { create(:project, group: group, shared_runners_enabled: true) }
let_it_be(:project_2) { create(:project, group: sub_group_2, shared_runners_enabled: true) }
- subject { group.update_shared_runners_setting!('disabled_and_unoverridable') }
+ subject { group.update_shared_runners_setting!(Namespace::SR_DISABLED_AND_UNOVERRIDABLE) }
it 'disables shared Runners for all descendant groups and projects' do
expect { subject_and_reload(group, sub_group, sub_group_2, project, project_2) }
@@ -2395,7 +2396,7 @@ RSpec.describe Group do
end
context 'disabled_with_override' do
- subject { group.update_shared_runners_setting!('disabled_with_override') }
+ subject { group.update_shared_runners_setting!(Namespace::SR_DISABLED_WITH_OVERRIDE) }
context 'top level group' do
let_it_be(:group) { create(:group, :shared_runners_disabled) }
@@ -2607,17 +2608,29 @@ RSpec.describe Group do
end
describe '.ids_with_disabled_email' do
- let!(:parent_1) { create(:group, emails_disabled: true) }
- let!(:child_1) { create(:group, parent: parent_1) }
+ let_it_be(:parent_1) { create(:group, emails_disabled: true) }
+ let_it_be(:child_1) { create(:group, parent: parent_1) }
- let!(:parent_2) { create(:group, emails_disabled: false) }
- let!(:child_2) { create(:group, parent: parent_2) }
+ let_it_be(:parent_2) { create(:group, emails_disabled: false) }
+ let_it_be(:child_2) { create(:group, parent: parent_2) }
- let!(:other_group) { create(:group, emails_disabled: false) }
+ let_it_be(:other_group) { create(:group, emails_disabled: false) }
- subject(:group_ids_where_email_is_disabled) { described_class.ids_with_disabled_email([child_1, child_2, other_group]) }
+ shared_examples 'returns namespaces with disabled email' do
+ subject(:group_ids_where_email_is_disabled) { described_class.ids_with_disabled_email([child_1, child_2, other_group]) }
- it { is_expected.to eq(Set.new([child_1.id])) }
+ it { is_expected.to eq(Set.new([child_1.id])) }
+ end
+
+ it_behaves_like 'returns namespaces with disabled email'
+
+ context 'when feature flag :linear_group_ancestor_scopes is disabled' do
+ before do
+ stub_feature_flags(linear_group_ancestor_scopes: false)
+ end
+
+ it_behaves_like 'returns namespaces with disabled email'
+ end
end
describe '.timelogs' do
diff --git a/spec/models/instance_configuration_spec.rb b/spec/models/instance_configuration_spec.rb
index 551e6e7572c..cc0b69e3526 100644
--- a/spec/models/instance_configuration_spec.rb
+++ b/spec/models/instance_configuration_spec.rb
@@ -31,6 +31,23 @@ RSpec.describe InstanceConfiguration do
expect(result.size).to eq(InstanceConfiguration::SSH_ALGORITHMS.size)
end
+ it 'includes all algorithms' do
+ stub_pub_file(pub_file)
+
+ result = subject.settings[:ssh_algorithms_hashes]
+
+ expect(result.map { |a| a[:name] }).to match_array(%w(DSA ECDSA ED25519 RSA))
+ end
+
+ it 'does not include disabled algorithm' do
+ Gitlab::CurrentSettings.current_application_settings.update!(dsa_key_restriction: ApplicationSetting::FORBIDDEN_KEY_VALUE)
+ stub_pub_file(pub_file)
+
+ result = subject.settings[:ssh_algorithms_hashes]
+
+ expect(result.map { |a| a[:name] }).to match_array(%w(ECDSA ED25519 RSA))
+ end
+
def pub_file(exist: true)
path = exist ? 'spec/fixtures/ssh_host_example_key.pub' : 'spec/fixtures/ssh_host_example_key.pub.random'
@@ -175,6 +192,9 @@ RSpec.describe InstanceConfiguration do
throttle_authenticated_packages_api_enabled: true,
throttle_authenticated_packages_api_requests_per_period: 1011,
throttle_authenticated_packages_api_period_in_seconds: 1012,
+ throttle_authenticated_git_lfs_enabled: true,
+ throttle_authenticated_git_lfs_requests_per_period: 1022,
+ throttle_authenticated_git_lfs_period_in_seconds: 1023,
issues_create_limit: 1013,
notes_create_limit: 1014,
project_export_limit: 1015,
@@ -196,6 +216,7 @@ RSpec.describe InstanceConfiguration do
expect(rate_limits[:protected_paths]).to eq({ enabled: true, requests_per_period: 1007, period_in_seconds: 1008 })
expect(rate_limits[:unauthenticated_packages_api]).to eq({ enabled: false, requests_per_period: 1009, period_in_seconds: 1010 })
expect(rate_limits[:authenticated_packages_api]).to eq({ enabled: true, requests_per_period: 1011, period_in_seconds: 1012 })
+ expect(rate_limits[:authenticated_git_lfs_api]).to eq({ enabled: true, requests_per_period: 1022, period_in_seconds: 1023 })
expect(rate_limits[:issue_creation]).to eq({ enabled: true, requests_per_period: 1013, period_in_seconds: 60 })
expect(rate_limits[:note_creation]).to eq({ enabled: true, requests_per_period: 1014, period_in_seconds: 60 })
expect(rate_limits[:project_export]).to eq({ enabled: true, requests_per_period: 1015, period_in_seconds: 60 })
diff --git a/spec/models/integration_spec.rb b/spec/models/integration_spec.rb
index 8a06f7fac99..1a83d948fcf 100644
--- a/spec/models/integration_spec.rb
+++ b/spec/models/integration_spec.rb
@@ -14,7 +14,6 @@ RSpec.describe Integration do
it { is_expected.to have_one(:service_hook).inverse_of(:integration).with_foreign_key(:service_id) }
it { is_expected.to have_one(:issue_tracker_data).autosave(true).inverse_of(:integration).with_foreign_key(:service_id).class_name('Integrations::IssueTrackerData') }
it { is_expected.to have_one(:jira_tracker_data).autosave(true).inverse_of(:integration).with_foreign_key(:service_id).class_name('Integrations::JiraTrackerData') }
- it { is_expected.to have_one(:open_project_tracker_data).autosave(true).inverse_of(:integration).with_foreign_key(:service_id).class_name('Integrations::OpenProjectTrackerData') }
end
describe 'validations' do
diff --git a/spec/models/integrations/open_project_spec.rb b/spec/models/integrations/open_project_spec.rb
deleted file mode 100644
index 789911acae8..00000000000
--- a/spec/models/integrations/open_project_spec.rb
+++ /dev/null
@@ -1,30 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Integrations::OpenProject do
- describe 'Validations' do
- context 'when integration is active' do
- before do
- subject.active = true
- end
-
- it { is_expected.to validate_presence_of(:url) }
- it { is_expected.to validate_presence_of(:token) }
- it { is_expected.to validate_presence_of(:project_identifier_code) }
-
- it_behaves_like 'issue tracker integration URL attribute', :url
- it_behaves_like 'issue tracker integration URL attribute', :api_url
- end
-
- context 'when integration is inactive' do
- before do
- subject.active = false
- end
-
- it { is_expected.not_to validate_presence_of(:url) }
- it { is_expected.not_to validate_presence_of(:token) }
- it { is_expected.not_to validate_presence_of(:project_identifier_code) }
- end
- end
-end
diff --git a/spec/models/integrations/open_project_tracker_data_spec.rb b/spec/models/integrations/open_project_tracker_data_spec.rb
deleted file mode 100644
index 41c913f978c..00000000000
--- a/spec/models/integrations/open_project_tracker_data_spec.rb
+++ /dev/null
@@ -1,19 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Integrations::OpenProjectTrackerData do
- describe 'associations' do
- it { is_expected.to belong_to(:integration) }
- end
-
- describe 'closed_status_id' do
- it 'returns the set value' do
- expect(build(:open_project_tracker_data).closed_status_id).to eq('15')
- end
-
- it 'returns the default value if not set' do
- expect(build(:open_project_tracker_data, closed_status_id: nil).closed_status_id).to eq('13')
- end
- end
-end
diff --git a/spec/models/issue_spec.rb b/spec/models/issue_spec.rb
index 1747972e8ae..4319407706e 100644
--- a/spec/models/issue_spec.rb
+++ b/spec/models/issue_spec.rb
@@ -34,6 +34,7 @@ RSpec.describe Issue do
it { is_expected.to have_many(:issue_email_participants) }
it { is_expected.to have_many(:timelogs).autosave(true) }
it { is_expected.to have_one(:incident_management_issuable_escalation_status) }
+ it { is_expected.to have_and_belong_to_many(:customer_relations_contacts) }
describe 'versions.most_recent' do
it 'returns the most recent version' do
@@ -222,17 +223,15 @@ RSpec.describe Issue do
end
end
- describe '#order_by_position_and_priority' do
+ describe '#order_by_relative_position' do
let(:project) { reusable_project }
- let(:p1) { create(:label, title: 'P1', project: project, priority: 1) }
- let(:p2) { create(:label, title: 'P2', project: project, priority: 2) }
- let!(:issue1) { create(:labeled_issue, project: project, labels: [p1]) }
- let!(:issue2) { create(:labeled_issue, project: project, labels: [p2]) }
+ let!(:issue1) { create(:issue, project: project) }
+ let!(:issue2) { create(:issue, project: project) }
let!(:issue3) { create(:issue, project: project, relative_position: -200) }
let!(:issue4) { create(:issue, project: project, relative_position: -100) }
it 'returns ordered list' do
- expect(project.issues.order_by_position_and_priority)
+ expect(project.issues.order_by_relative_position)
.to match [issue3, issue4, issue1, issue2]
end
end
@@ -1505,6 +1504,26 @@ RSpec.describe Issue do
end
end
+ describe '#supports_move_and_clone?' do
+ let_it_be(:project) { create(:project) }
+ let_it_be_with_refind(:issue) { create(:incident, project: project) }
+
+ where(:issue_type, :supports_move_and_clone) do
+ :issue | true
+ :incident | true
+ end
+
+ with_them do
+ before do
+ issue.update!(issue_type: issue_type)
+ end
+
+ it do
+ expect(issue.supports_move_and_clone?).to eq(supports_move_and_clone)
+ end
+ end
+ end
+
describe '#email_participants_emails' do
let_it_be(:issue) { create(:issue) }
diff --git a/spec/models/loose_foreign_keys/deleted_record_spec.rb b/spec/models/loose_foreign_keys/deleted_record_spec.rb
deleted file mode 100644
index db2f8b4d2d3..00000000000
--- a/spec/models/loose_foreign_keys/deleted_record_spec.rb
+++ /dev/null
@@ -1,56 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe LooseForeignKeys::DeletedRecord do
- let_it_be(:deleted_record_1) { described_class.create!(created_at: 1.day.ago, deleted_table_name: 'projects', deleted_table_primary_key_value: 5) }
- let_it_be(:deleted_record_2) { described_class.create!(created_at: 3.days.ago, deleted_table_name: 'projects', deleted_table_primary_key_value: 1) }
- let_it_be(:deleted_record_3) { described_class.create!(created_at: 5.days.ago, deleted_table_name: 'projects', deleted_table_primary_key_value: 3) }
- let_it_be(:deleted_record_4) { described_class.create!(created_at: 10.days.ago, deleted_table_name: 'projects', deleted_table_primary_key_value: 1) } # duplicate
-
- # skip created_at because it gets truncated after insert
- def map_attributes(records)
- records.pluck(:deleted_table_name, :deleted_table_primary_key_value)
- end
-
- describe 'partitioning strategy' do
- it 'has retain_non_empty_partitions option' do
- expect(described_class.partitioning_strategy.retain_non_empty_partitions).to eq(true)
- end
- end
-
- describe '.load_batch' do
- it 'loads records and orders them by creation date' do
- records = described_class.load_batch(4)
-
- expect(map_attributes(records)).to eq([['projects', 1], ['projects', 3], ['projects', 1], ['projects', 5]])
- end
-
- it 'supports configurable batch size' do
- records = described_class.load_batch(2)
-
- expect(map_attributes(records)).to eq([['projects', 1], ['projects', 3]])
- end
- end
-
- describe '.delete_records' do
- it 'deletes exactly one record' do
- described_class.delete_records([deleted_record_2])
-
- expect(described_class.count).to eq(3)
- expect(described_class.find_by(created_at: deleted_record_2.created_at)).to eq(nil)
- end
-
- it 'deletes two records' do
- described_class.delete_records([deleted_record_2, deleted_record_4])
-
- expect(described_class.count).to eq(2)
- end
-
- it 'deletes all records' do
- described_class.delete_records([deleted_record_1, deleted_record_2, deleted_record_3, deleted_record_4])
-
- expect(described_class.count).to eq(0)
- end
- end
-end
diff --git a/spec/models/member_spec.rb b/spec/models/member_spec.rb
index 3f7f69ff34e..afe78adc547 100644
--- a/spec/models/member_spec.rb
+++ b/spec/models/member_spec.rb
@@ -7,11 +7,11 @@ RSpec.describe Member do
using RSpec::Parameterized::TableSyntax
- describe "Associations" do
+ describe 'Associations' do
it { is_expected.to belong_to(:user) }
end
- describe "Validation" do
+ describe 'Validation' do
subject { described_class.new(access_level: Member::GUEST) }
it { is_expected.to validate_presence_of(:user) }
@@ -28,7 +28,7 @@ RSpec.describe Member do
subject { build(:project_member) }
end
- context "when an invite email is provided" do
+ context 'when an invite email is provided' do
let_it_be(:project) { create(:project) }
let(:member) { build(:project_member, source: project, invite_email: "user@example.com", user: nil) }
@@ -37,34 +37,36 @@ RSpec.describe Member do
expect(member).to be_valid
end
- it "requires a valid invite email" do
+ it 'requires a valid invite email' do
member.invite_email = "nope"
expect(member).not_to be_valid
end
- it "requires a unique invite email scoped to this source" do
+ it 'requires a unique invite email scoped to this source' do
create(:project_member, source: member.source, invite_email: member.invite_email)
expect(member).not_to be_valid
end
end
- context "when an invite email is not provided" do
+ context 'when an invite email is not provided' do
let(:member) { build(:project_member) }
- it "requires a user" do
+ it 'requires a user' do
member.user = nil
expect(member).not_to be_valid
end
- it "is valid otherwise" do
+ it 'is valid otherwise' do
expect(member).to be_valid
end
end
context 'with admin signup restrictions' do
+ let(:expected_message) { _('is not allowed for this group. Check with your administrator.') }
+
context 'when allowed domains for signup is enabled' do
before do
stub_application_setting(domain_allowlist: ['example.com'])
@@ -74,7 +76,7 @@ RSpec.describe Member do
member = build(:group_member, :invited, invite_email: 'info@gitlab.com')
expect(member).not_to be_valid
- expect(member.errors.messages[:user].first).to eq(_('domain is not authorized for sign-up.'))
+ expect(member.errors.messages[:user].first).to eq(expected_message)
end
end
@@ -88,7 +90,7 @@ RSpec.describe Member do
member = build(:group_member, :invited, invite_email: 'denylist@example.org')
expect(member).not_to be_valid
- expect(member.errors.messages[:user].first).to eq(_('is not from an allowed domain.'))
+ expect(member.errors.messages[:user].first).to eq(expected_message)
end
end
@@ -102,18 +104,18 @@ RSpec.describe Member do
member = build(:group_member, :invited, invite_email: 'info@gitlab.com')
expect(member).not_to be_valid
- expect(member.errors.messages[:user].first).to eq(_('is not allowed. Try again with a different email address, or contact your GitLab admin.'))
+ expect(member.errors.messages[:user].first).to eq(expected_message)
end
end
end
- context "when a child member inherits its access level" do
+ context 'when a child member inherits its access level' do
let(:user) { create(:user) }
let(:member) { create(:group_member, :developer, user: user) }
let(:child_group) { create(:group, parent: member.group) }
let(:child_member) { build(:group_member, group: child_group, user: user) }
- it "requires a higher level" do
+ it 'requires a higher level' do
child_member.access_level = GroupMember::REPORTER
child_member.validate
@@ -123,7 +125,7 @@ RSpec.describe Member do
# Membership in a subgroup confers certain access rights, such as being
# able to merge or push code to protected branches.
- it "is valid with an equal level" do
+ it 'is valid with an equal level' do
child_member.access_level = GroupMember::DEVELOPER
child_member.validate
@@ -131,7 +133,7 @@ RSpec.describe Member do
expect(child_member).to be_valid
end
- it "is valid with a higher level" do
+ it 'is valid with a higher level' do
child_member.access_level = GroupMember::MAINTAINER
child_member.validate
@@ -167,6 +169,8 @@ RSpec.describe Member do
describe 'Scopes & finders' do
let_it_be(:project) { create(:project, :public) }
let_it_be(:group) { create(:group) }
+ let_it_be(:blocked_pending_approval_user) { create(:user, :blocked_pending_approval ) }
+ let_it_be(:blocked_pending_approval_project_member) { create(:project_member, :invited, :developer, project: project, invite_email: blocked_pending_approval_user.email) }
before_all do
@owner_user = create(:user).tap { |u| group.add_owner(u) }
@@ -536,9 +540,28 @@ RSpec.describe Member do
it { is_expected.to eq [example_member] }
end
end
+
+ describe '.with_invited_user_state' do
+ subject(:with_invited_user_state) { described_class.with_invited_user_state }
+
+ it { is_expected.to include @owner }
+ it { is_expected.to include @maintainer }
+ it { is_expected.to include @invited_member }
+ it { is_expected.to include @accepted_invite_member }
+ it { is_expected.to include @requested_member }
+ it { is_expected.to include @accepted_request_member }
+
+ context 'with invited pending members' do
+ it 'includes invited user state' do
+ invited_pending_members = with_invited_user_state.select { |m| m.invited_user_state.present? }
+ expect(invited_pending_members.count).to eq 1
+ expect(invited_pending_members).to include blocked_pending_approval_project_member
+ end
+ end
+ end
end
- describe "Delegate methods" do
+ describe 'Delegate methods' do
it { is_expected.to respond_to(:user_name) }
it { is_expected.to respond_to(:user_email) }
end
@@ -608,29 +631,29 @@ RSpec.describe Member do
end
end
- describe "#accept_invite!" do
+ describe '#accept_invite!' do
let!(:member) { create(:project_member, invite_email: "user@example.com", user: nil) }
let(:user) { create(:user) }
- it "resets the invite token" do
+ it 'resets the invite token' do
member.accept_invite!(user)
expect(member.invite_token).to be_nil
end
- it "sets the invite accepted timestamp" do
+ it 'sets the invite accepted timestamp' do
member.accept_invite!(user)
expect(member.invite_accepted_at).not_to be_nil
end
- it "sets the user" do
+ it 'sets the user' do
member.accept_invite!(user)
expect(member.user).to eq(user)
end
- it "calls #after_accept_invite" do
+ it 'calls #after_accept_invite' do
expect(member).to receive(:after_accept_invite)
member.accept_invite!(user)
@@ -657,26 +680,26 @@ RSpec.describe Member do
end
end
- describe "#decline_invite!" do
+ describe '#decline_invite!' do
let!(:member) { create(:project_member, invite_email: "user@example.com", user: nil) }
- it "destroys the member" do
+ it 'destroys the member' do
member.decline_invite!
expect(member).to be_destroyed
end
- it "calls #after_decline_invite" do
+ it 'calls #after_decline_invite' do
expect(member).to receive(:after_decline_invite)
member.decline_invite!
end
end
- describe "#generate_invite_token" do
+ describe '#generate_invite_token' do
let!(:member) { create(:project_member, invite_email: "user@example.com", user: nil) }
- it "sets the invite token" do
+ it 'sets the invite token' do
expect { member.generate_invite_token }.to change { member.invite_token }
end
end
@@ -684,12 +707,12 @@ RSpec.describe Member do
describe 'generate invite token on create' do
let!(:member) { build(:project_member, invite_email: "user@example.com") }
- it "sets the invite token" do
+ it 'sets the invite token' do
expect { member.save! }.to change { member.invite_token }.to(kind_of(String))
end
context 'when invite was already accepted' do
- it "does not set invite token" do
+ it 'does not set invite token' do
member.invite_accepted_at = 1.day.ago
expect { member.save! }.not_to change { member.invite_token }.from(nil)
@@ -744,7 +767,7 @@ RSpec.describe Member do
end
end
- describe "#invite_to_unknown_user?" do
+ describe '#invite_to_unknown_user?' do
subject { member.invite_to_unknown_user? }
let(:member) { create(:project_member, invite_email: "user@example.com", invite_token: '1234', user: user) }
@@ -762,7 +785,7 @@ RSpec.describe Member do
end
end
- describe "destroying a record", :delete do
+ describe 'destroying a record', :delete, :sidekiq_inline do
it "refreshes user's authorized projects" do
project = create(:project, :private)
user = create(:user)
diff --git a/spec/models/members/project_member_spec.rb b/spec/models/members/project_member_spec.rb
index 1704d5adb96..ca846cf9e8e 100644
--- a/spec/models/members/project_member_spec.rb
+++ b/spec/models/members/project_member_spec.rb
@@ -244,11 +244,16 @@ RSpec.describe ProjectMember do
project.add_user(user, Gitlab::Access::GUEST)
end
- it 'changes access level' do
+ it 'changes access level', :sidekiq_inline do
expect { action }.to change { user.can?(:guest_access, project) }.from(true).to(false)
end
- it_behaves_like 'calls AuthorizedProjectUpdate::ProjectRecalculatePerUserService to recalculate authorizations'
+ it 'calls AuthorizedProjectUpdate::ProjectRecalculatePerUserWorker to recalculate authorizations' do
+ expect(AuthorizedProjectUpdate::ProjectRecalculatePerUserWorker).to receive(:perform_async).with(project.id, user.id)
+
+ action
+ end
+
it_behaves_like 'calls AuthorizedProjectUpdate::UserRefreshFromReplicaWorker with a delay to update project authorizations'
end
@@ -298,7 +303,7 @@ RSpec.describe ProjectMember do
project.add_user(user, Gitlab::Access::GUEST)
end
- it 'changes access level' do
+ it 'changes access level', :sidekiq_inline do
expect { action }.to change { user.can?(:guest_access, project) }.from(true).to(false)
end
diff --git a/spec/models/merge_request_spec.rb b/spec/models/merge_request_spec.rb
index 06ca88644b7..d871453e062 100644
--- a/spec/models/merge_request_spec.rb
+++ b/spec/models/merge_request_spec.rb
@@ -1348,7 +1348,7 @@ RSpec.describe MergeRequest, factory_default: :keep do
[
'WIP:', 'WIP: ', '[WIP]', '[WIP] ', ' [WIP] WIP: [WIP] WIP:',
- 'draft:', 'Draft: ', '[Draft]', '[DRAFT] ', 'Draft - '
+ 'draft:', 'Draft: ', '[Draft]', '[DRAFT] '
].each do |wip_prefix|
it "detects the '#{wip_prefix}' prefix" do
subject.title = "#{wip_prefix}#{subject.title}"
@@ -1357,16 +1357,27 @@ RSpec.describe MergeRequest, factory_default: :keep do
end
end
+ [
+ "WIP ", "(WIP)",
+ "draft", "Draft", "Draft -", "draft - ", "Draft ", "draft "
+ ].each do |draft_prefix|
+ it "doesn't detect '#{draft_prefix}' at the start of the title as a draft" do
+ subject.title = "#{draft_prefix}#{subject.title}"
+
+ expect(subject.work_in_progress?).to eq false
+ end
+ end
+
it "detects merge request title just saying 'wip'" do
subject.title = "wip"
expect(subject.work_in_progress?).to eq true
end
- it "detects merge request title just saying 'draft'" do
+ it "does not detect merge request title just saying 'draft'" do
subject.title = "draft"
- expect(subject.work_in_progress?).to eq true
+ expect(subject.work_in_progress?).to eq false
end
it 'does not detect WIP in the middle of the title' do
@@ -1428,7 +1439,7 @@ RSpec.describe MergeRequest, factory_default: :keep do
[
'WIP:', 'WIP: ', '[WIP]', '[WIP] ', '[WIP] WIP: [WIP] WIP:',
- 'draft:', 'Draft: ', '[Draft]', '[DRAFT] ', 'Draft - '
+ 'draft:', 'Draft: ', '[Draft]', '[DRAFT] '
].each do |wip_prefix|
it "removes the '#{wip_prefix}' prefix" do
wipless_title = subject.title
@@ -3078,7 +3089,7 @@ RSpec.describe MergeRequest, factory_default: :keep do
end
end
- describe '#mergeable_state?' do
+ shared_examples 'for mergeable_state' do
subject { create(:merge_request) }
it 'checks if merge request can be merged' do
@@ -3119,33 +3130,61 @@ RSpec.describe MergeRequest, factory_default: :keep do
end
context 'when failed' do
- context 'when #mergeable_ci_state? is false' do
- before do
- allow(subject).to receive(:mergeable_ci_state?) { false }
- end
+ shared_examples 'failed skip_ci_check' do
+ context 'when #mergeable_ci_state? is false' do
+ before do
+ allow(subject).to receive(:mergeable_ci_state?) { false }
+ end
- it 'returns false' do
- expect(subject.mergeable_state?).to be_falsey
+ it 'returns false' do
+ expect(subject.mergeable_state?).to be_falsey
+ end
+
+ it 'returns true when skipping ci check' do
+ expect(subject.mergeable_state?(skip_ci_check: true)).to be(true)
+ end
end
- it 'returns true when skipping ci check' do
- expect(subject.mergeable_state?(skip_ci_check: true)).to be(true)
+ context 'when #mergeable_discussions_state? is false' do
+ before do
+ allow(subject).to receive(:mergeable_discussions_state?) { false }
+ end
+
+ it 'returns false' do
+ expect(subject.mergeable_state?).to be_falsey
+ end
+
+ it 'returns true when skipping discussions check' do
+ expect(subject.mergeable_state?(skip_discussions_check: true)).to be(true)
+ end
end
end
- context 'when #mergeable_discussions_state? is false' do
+ context 'when improved_mergeability_checks is on' do
+ it_behaves_like 'failed skip_ci_check'
+ end
+
+ context 'when improved_mergeability_checks is off' do
before do
- allow(subject).to receive(:mergeable_discussions_state?) { false }
+ stub_feature_flags(improved_mergeability_checks: false)
end
- it 'returns false' do
- expect(subject.mergeable_state?).to be_falsey
- end
+ it_behaves_like 'failed skip_ci_check'
+ end
+ end
+ end
- it 'returns true when skipping discussions check' do
- expect(subject.mergeable_state?(skip_discussions_check: true)).to be(true)
- end
+ describe '#mergeable_state?' do
+ context 'when merge state caching is on' do
+ it_behaves_like 'for mergeable_state'
+ end
+
+ context 'when merge state caching is off' do
+ before do
+ stub_feature_flags(mergeability_caching: false)
end
+
+ it_behaves_like 'for mergeable_state'
end
end
diff --git a/spec/models/namespace/traversal_hierarchy_spec.rb b/spec/models/namespace/traversal_hierarchy_spec.rb
index 2cd66f42458..d7b0ee888c0 100644
--- a/spec/models/namespace/traversal_hierarchy_spec.rb
+++ b/spec/models/namespace/traversal_hierarchy_spec.rb
@@ -3,7 +3,7 @@
require 'spec_helper'
RSpec.describe Namespace::TraversalHierarchy, type: :model do
- let_it_be(:root, reload: true) { create(:group, :with_hierarchy) }
+ let!(:root) { create(:group, :with_hierarchy) }
describe '.for_namespace' do
let(:hierarchy) { described_class.for_namespace(group) }
@@ -62,7 +62,12 @@ RSpec.describe Namespace::TraversalHierarchy, type: :model do
it { expect(hierarchy.incorrect_traversal_ids).to be_empty }
- it_behaves_like 'hierarchy with traversal_ids'
+ it_behaves_like 'hierarchy with traversal_ids' do
+ before do
+ subject
+ end
+ end
+
it_behaves_like 'locked row' do
let(:recorded_queries) { ActiveRecord::QueryRecorder.new }
let(:row) { root }
diff --git a/spec/models/namespace_setting_spec.rb b/spec/models/namespace_setting_spec.rb
index c1cc8fc3e88..429727c2360 100644
--- a/spec/models/namespace_setting_spec.rb
+++ b/spec/models/namespace_setting_spec.rb
@@ -11,6 +11,8 @@ RSpec.describe NamespaceSetting, type: :model do
it { is_expected.to belong_to(:namespace) }
end
+ it { is_expected.to define_enum_for(:jobs_to_be_done).with_values([:basics, :move_repository, :code_storage, :exploring, :ci, :other]).with_suffix }
+
describe "validations" do
describe "#default_branch_name_content" do
let_it_be(:group) { create(:group) }
diff --git a/spec/models/namespace_spec.rb b/spec/models/namespace_spec.rb
index 51a26d82daa..c201d89947e 100644
--- a/spec/models/namespace_spec.rb
+++ b/spec/models/namespace_spec.rb
@@ -7,6 +7,10 @@ RSpec.describe Namespace do
include GitHelpers
include ReloadHelpers
+ let_it_be(:group_sti_name) { Group.sti_name }
+ let_it_be(:project_sti_name) { Namespaces::ProjectNamespace.sti_name }
+ let_it_be(:user_sti_name) { Namespaces::UserNamespace.sti_name }
+
let!(:namespace) { create(:namespace, :with_namespace_settings) }
let(:gitlab_shell) { Gitlab::Shell.new }
let(:repository_storage) { 'default' }
@@ -38,20 +42,22 @@ RSpec.describe Namespace do
context 'validating the parent of a namespace' do
using RSpec::Parameterized::TableSyntax
+ # rubocop:disable Lint/BinaryOperatorWithIdenticalOperands
where(:parent_type, :child_type, :error) do
- nil | 'User' | nil
- nil | 'Group' | nil
- nil | 'Project' | 'must be set for a project namespace'
- 'Project' | 'User' | 'project namespace cannot be the parent of another namespace'
- 'Project' | 'Group' | 'project namespace cannot be the parent of another namespace'
- 'Project' | 'Project' | 'project namespace cannot be the parent of another namespace'
- 'Group' | 'User' | 'cannot not be used for user namespace'
- 'Group' | 'Group' | nil
- 'Group' | 'Project' | nil
- 'User' | 'User' | 'cannot not be used for user namespace'
- 'User' | 'Group' | 'user namespace cannot be the parent of another namespace'
- 'User' | 'Project' | nil
- end
+ nil | ref(:user_sti_name) | nil
+ nil | ref(:group_sti_name) | nil
+ nil | ref(:project_sti_name) | 'must be set for a project namespace'
+ ref(:project_sti_name) | ref(:user_sti_name) | 'project namespace cannot be the parent of another namespace'
+ ref(:project_sti_name) | ref(:group_sti_name) | 'project namespace cannot be the parent of another namespace'
+ ref(:project_sti_name) | ref(:project_sti_name) | 'project namespace cannot be the parent of another namespace'
+ ref(:group_sti_name) | ref(:user_sti_name) | 'cannot not be used for user namespace'
+ ref(:group_sti_name) | ref(:group_sti_name) | nil
+ ref(:group_sti_name) | ref(:project_sti_name) | nil
+ ref(:user_sti_name) | ref(:user_sti_name) | 'cannot not be used for user namespace'
+ ref(:user_sti_name) | ref(:group_sti_name) | 'user namespace cannot be the parent of another namespace'
+ ref(:user_sti_name) | ref(:project_sti_name) | nil
+ end
+ # rubocop:enable Lint/BinaryOperatorWithIdenticalOperands
with_them do
it 'validates namespace parent' do
@@ -127,39 +133,77 @@ RSpec.describe Namespace do
end
context 'top-level group' do
- let(:group) { build(:group, path: 'tree') }
+ let(:group) { build(:namespace, path: 'tree') }
it { expect(group).to be_valid }
end
end
- describe '1 char path length' do
- it 'does not allow to create one' do
- namespace = build(:namespace, path: 'j')
+ describe 'path validator' do
+ using RSpec::Parameterized::TableSyntax
+
+ let_it_be(:parent) { create(:namespace) }
- expect(namespace).not_to be_valid
- expect(namespace.errors[:path].first).to eq('is too short (minimum is 2 characters)')
+ # rubocop:disable Lint/BinaryOperatorWithIdenticalOperands
+ where(:namespace_type, :path, :valid) do
+ ref(:project_sti_name) | 'j' | true
+ ref(:project_sti_name) | 'path.' | true
+ ref(:project_sti_name) | 'blob' | false
+ ref(:group_sti_name) | 'j' | false
+ ref(:group_sti_name) | 'path.' | false
+ ref(:group_sti_name) | 'blob' | true
+ ref(:user_sti_name) | 'j' | false
+ ref(:user_sti_name) | 'path.' | false
+ ref(:user_sti_name) | 'blob' | true
end
+ # rubocop:enable Lint/BinaryOperatorWithIdenticalOperands
- it 'does not allow to update one' do
- namespace = create(:namespace)
- namespace.update(path: 'j')
+ with_them do
+ it 'validates namespace path' do
+ parent_namespace = parent if namespace_type == Namespaces::ProjectNamespace.sti_name
+ namespace = build(:namespace, type: namespace_type, parent: parent_namespace, path: path)
- expect(namespace).not_to be_valid
- expect(namespace.errors[:path].first).to eq('is too short (minimum is 2 characters)')
+ expect(namespace.valid?).to be(valid)
+ end
end
+ end
- it 'allows updating other attributes for existing record' do
- namespace = build(:namespace, path: 'j', owner: create(:user))
- namespace.save(validate: false)
- namespace.reload
+ describe '1 char path length' do
+ context 'with user namespace' do
+ let(:namespace) { build(:namespace) }
- expect(namespace.path).to eq('j')
+ it 'does not allow to update path to single char' do
+ namespace.save!
- namespace.update(name: 'something new')
+ namespace.path = 'j'
- expect(namespace).to be_valid
- expect(namespace.name).to eq('something new')
+ expect(namespace).not_to be_valid
+ expect(namespace.errors[:path].first).to eq('is too short (minimum is 2 characters)')
+ end
+
+ it 'allows updating other attributes for existing record' do
+ namespace.save!
+ namespace.update_attribute(:path, 'j')
+ namespace.reload
+
+ expect(namespace.path).to eq('j')
+
+ namespace.update(name: 'something new')
+
+ expect(namespace).to be_valid
+ expect(namespace.name).to eq('something new')
+ end
+ end
+
+ context 'with project namespace' do
+ let(:namespace) { build(:project_namespace) }
+
+ it 'allows to update path to single char' do
+ namespace = create(:project_namespace)
+ namespace.update(path: 'j')
+
+ expect(namespace).to be_valid
+ end
end
end
end
@@ -170,55 +214,53 @@ RSpec.describe Namespace do
let(:namespace) { Namespace.find(create(:namespace, type: namespace_type, parent: parent).id) }
context 'creating a Group' do
- let(:namespace_type) { 'Group' }
+ let(:namespace_type) { group_sti_name }
- it 'is valid' do
+ it 'is the correct type of namespace' do
expect(namespace).to be_a(Group)
expect(namespace.kind).to eq('group')
- expect(namespace.group?).to be_truthy
+ expect(namespace.group_namespace?).to be_truthy
end
end
context 'creating a ProjectNamespace' do
- let(:namespace_type) { 'Project' }
+ let(:namespace_type) { project_sti_name }
let(:parent) { create(:group) }
- it 'is valid' do
+ it 'is the correct type of namespace' do
expect(Namespace.find(namespace.id)).to be_a(Namespaces::ProjectNamespace)
expect(namespace.kind).to eq('project')
- expect(namespace.project?).to be_truthy
+ expect(namespace.project_namespace?).to be_truthy
end
end
context 'creating a UserNamespace' do
- let(:namespace_type) { 'User' }
+ let(:namespace_type) { user_sti_name }
- it 'is valid' do
- # TODO: We create a normal Namespace until
- # https://gitlab.com/gitlab-org/gitlab/-/merge_requests/68894 is ready
- expect(Namespace.find(namespace.id)).to be_a(Namespace)
+ it 'is the correct type of namespace' do
+ expect(Namespace.find(namespace.id)).to be_a(Namespaces::UserNamespace)
expect(namespace.kind).to eq('user')
- expect(namespace.user?).to be_truthy
+ expect(namespace.user_namespace?).to be_truthy
end
end
context 'creating a default Namespace' do
let(:namespace_type) { nil }
- it 'is valid' do
+ it 'is the correct type of namespace' do
expect(Namespace.find(namespace.id)).to be_a(Namespace)
expect(namespace.kind).to eq('user')
- expect(namespace.user?).to be_truthy
+ expect(namespace.user_namespace?).to be_truthy
end
end
context 'creating an unknown Namespace type' do
let(:namespace_type) { 'One' }
- it 'defaults to a Namespace' do
+ it 'creates a default Namespace' do
expect(Namespace.find(namespace.id)).to be_a(Namespace)
expect(namespace.kind).to eq('user')
- expect(namespace.user?).to be_truthy
+ expect(namespace.user_namespace?).to be_truthy
end
end
end
@@ -257,6 +299,15 @@ RSpec.describe Namespace do
expect(described_class.sorted_by_similarity_and_parent_id_desc('Namespace')).to eq([namespace2, namespace1, namespace2sub, namespace1sub, namespace])
end
end
+
+ describe '.without_project_namespaces' do
+ let_it_be(:user_namespace) { create(:user_namespace) }
+ let_it_be(:project_namespace) { create(:project_namespace) }
+
+ it 'excludes project namespaces' do
+ expect(described_class.without_project_namespaces).to match_array([namespace, namespace1, namespace2, namespace1sub, namespace2sub, user_namespace, project_namespace.parent])
+ end
+ end
end
describe 'delegate' do
@@ -428,9 +479,9 @@ RSpec.describe Namespace do
end
describe '.search' do
- let_it_be(:first_group) { build(:group, name: 'my first namespace', path: 'old-path').tap(&:save!) }
- let_it_be(:parent_group) { build(:group, name: 'my parent namespace', path: 'parent-path').tap(&:save!) }
- let_it_be(:second_group) { build(:group, name: 'my second namespace', path: 'new-path', parent: parent_group).tap(&:save!) }
+ let_it_be(:first_group) { create(:group, name: 'my first namespace', path: 'old-path') }
+ let_it_be(:parent_group) { create(:group, name: 'my parent namespace', path: 'parent-path') }
+ let_it_be(:second_group) { create(:group, name: 'my second namespace', path: 'new-path', parent: parent_group) }
let_it_be(:project_with_same_path) { create(:project, id: second_group.id, path: first_group.path) }
it 'returns namespaces with a matching name' do
@@ -1558,8 +1609,8 @@ RSpec.describe Namespace do
end
end
- describe '#user?' do
- subject { namespace.user? }
+ describe '#user_namespace?' do
+ subject { namespace.user_namespace? }
context 'when type is a user' do
let(:user) { create(:user) }
@@ -1745,10 +1796,10 @@ RSpec.describe Namespace do
using RSpec::Parameterized::TableSyntax
where(:shared_runners_enabled, :allow_descendants_override_disabled_shared_runners, :shared_runners_setting) do
- true | true | 'enabled'
- true | false | 'enabled'
- false | true | 'disabled_with_override'
- false | false | 'disabled_and_unoverridable'
+ true | true | Namespace::SR_ENABLED
+ true | false | Namespace::SR_ENABLED
+ false | true | Namespace::SR_DISABLED_WITH_OVERRIDE
+ false | false | Namespace::SR_DISABLED_AND_UNOVERRIDABLE
end
with_them do
@@ -1764,15 +1815,15 @@ RSpec.describe Namespace do
using RSpec::Parameterized::TableSyntax
where(:shared_runners_enabled, :allow_descendants_override_disabled_shared_runners, :other_setting, :result) do
- true | true | 'enabled' | false
- true | true | 'disabled_with_override' | true
- true | true | 'disabled_and_unoverridable' | true
- false | true | 'enabled' | false
- false | true | 'disabled_with_override' | false
- false | true | 'disabled_and_unoverridable' | true
- false | false | 'enabled' | false
- false | false | 'disabled_with_override' | false
- false | false | 'disabled_and_unoverridable' | false
+ true | true | Namespace::SR_ENABLED | false
+ true | true | Namespace::SR_DISABLED_WITH_OVERRIDE | 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_UNOVERRIDABLE | true
+ false | false | Namespace::SR_ENABLED | false
+ false | false | Namespace::SR_DISABLED_WITH_OVERRIDE | false
+ false | false | Namespace::SR_DISABLED_AND_UNOVERRIDABLE | false
end
with_them do
diff --git a/spec/models/namespaces/user_namespace_spec.rb b/spec/models/namespaces/user_namespace_spec.rb
new file mode 100644
index 00000000000..7c00a597756
--- /dev/null
+++ b/spec/models/namespaces/user_namespace_spec.rb
@@ -0,0 +1,12 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+# Main user namespace functionality it still in `Namespace`, so most
+# of the specs are in `namespace_spec.rb`.
+# UserNamespace specific specs will end up being migrated here.
+RSpec.describe Namespaces::UserNamespace, type: :model do
+ describe 'validations' do
+ it { is_expected.to validate_presence_of(:owner) }
+ end
+end
diff --git a/spec/models/note_spec.rb b/spec/models/note_spec.rb
index 5e3773513f1..0dd77967f25 100644
--- a/spec/models/note_spec.rb
+++ b/spec/models/note_spec.rb
@@ -108,6 +108,34 @@ RSpec.describe Note do
end
describe 'callbacks' do
+ describe '#keep_around_commit' do
+ let!(:noteable) { create(:issue) }
+
+ it "calls #keep_around_commit normally" do
+ note = build(:note, project: noteable.project, noteable: noteable)
+
+ expect(note).to receive(:keep_around_commit)
+
+ note.save!
+ end
+
+ it "skips #keep_around_commit if 'skip_keep_around_commits' is true" do
+ note = build(:note, project: noteable.project, noteable: noteable, skip_keep_around_commits: true)
+
+ expect(note).not_to receive(:keep_around_commit)
+
+ note.save!
+ end
+
+ it "skips #keep_around_commit if 'importing' is true" do
+ note = build(:note, project: noteable.project, noteable: noteable, importing: true)
+
+ expect(note).not_to receive(:keep_around_commit)
+
+ note.save!
+ end
+ end
+
describe '#notify_after_create' do
it 'calls #after_note_created on the noteable' do
noteable = create(:issue)
diff --git a/spec/models/operations/feature_flag_spec.rb b/spec/models/operations/feature_flag_spec.rb
index d689632e2b4..e709470b312 100644
--- a/spec/models/operations/feature_flag_spec.rb
+++ b/spec/models/operations/feature_flag_spec.rb
@@ -13,7 +13,7 @@ RSpec.describe Operations::FeatureFlag do
describe 'associations' do
it { is_expected.to belong_to(:project) }
- it { is_expected.to have_many(:scopes) }
+ it { is_expected.to have_many(:strategies) }
end
describe '.reference_pattern' do
@@ -52,17 +52,6 @@ RSpec.describe Operations::FeatureFlag do
it { is_expected.to define_enum_for(:version).with_values(new_version_flag: 2) }
context 'a version 2 feature flag' do
- it 'is invalid if associated with Operations::FeatureFlagScope models' do
- project = create(:project)
- feature_flag = described_class.new({ name: 'test', project: project, version: 2,
- scopes_attributes: [{ environment_scope: '*', active: false }] })
-
- expect(feature_flag.valid?).to eq(false)
- expect(feature_flag.errors.messages).to eq({
- version_associations: ["version 2 feature flags may not have scopes"]
- })
- end
-
it 'is valid if associated with Operations::FeatureFlags::Strategy models' do
project = create(:project)
feature_flag = described_class.create!({ name: 'test', project: project, version: 2,
@@ -81,18 +70,6 @@ RSpec.describe Operations::FeatureFlag do
end
end
- describe 'the default scope' do
- let_it_be(:project) { create(:project) }
-
- context 'with a version 2 feature flag' do
- it 'does not create a default scope' do
- feature_flag = described_class.create!({ name: 'test', project: project, scopes_attributes: [], version: 2 })
-
- expect(feature_flag.scopes).to eq([])
- end
- end
- end
-
describe '.enabled' do
subject { described_class.enabled }
@@ -187,26 +164,4 @@ RSpec.describe Operations::FeatureFlag do
expect(subject.hook_attrs).to eq(hook_attrs)
end
end
-
- describe "#execute_hooks" do
- let_it_be(:user) { create(:user) }
- let_it_be(:project) { create(:project) }
- let_it_be(:feature_flag) { create(:operations_feature_flag, project: project) }
-
- it 'does not execute the hook when feature_flag event is disabled' do
- create(:project_hook, project: project, feature_flag_events: false)
- expect(WebHookWorker).not_to receive(:perform_async)
-
- feature_flag.execute_hooks(user)
- feature_flag.touch
- end
-
- it 'executes hook when feature_flag event is enabled' do
- hook = create(:project_hook, project: project, feature_flag_events: true)
- expect(WebHookWorker).to receive(:perform_async).with(hook.id, an_instance_of(Hash), 'feature_flag_hooks')
-
- feature_flag.execute_hooks(user)
- feature_flag.touch
- end
- end
end
diff --git a/spec/models/packages/helm/file_metadatum_spec.rb b/spec/models/packages/helm/file_metadatum_spec.rb
index c7c17b157e4..995179b391d 100644
--- a/spec/models/packages/helm/file_metadatum_spec.rb
+++ b/spec/models/packages/helm/file_metadatum_spec.rb
@@ -31,8 +31,8 @@ RSpec.describe Packages::Helm::FileMetadatum, type: :model do
it 'validates #channel', :aggregate_failures do
is_expected.to validate_presence_of(:channel)
- is_expected.to allow_value('a' * 63).for(:channel)
- is_expected.not_to allow_value('a' * 64).for(:channel)
+ is_expected.to allow_value('a' * 255).for(:channel)
+ is_expected.not_to allow_value('a' * 256).for(:channel)
is_expected.to allow_value('release').for(:channel)
is_expected.to allow_value('my-repo').for(:channel)
diff --git a/spec/models/packages/package_spec.rb b/spec/models/packages/package_spec.rb
index 99e5769fc1f..2573c01d686 100644
--- a/spec/models/packages/package_spec.rb
+++ b/spec/models/packages/package_spec.rb
@@ -1184,7 +1184,7 @@ RSpec.describe Packages::Package, type: :model do
end
context 'with an already existing build info' do
- let_it_be(:build_info) { create(:packages_build_info, package: package, pipeline: pipeline) }
+ let_it_be(:build_info) { create(:package_build_info, package: package, pipeline: pipeline) }
it 'does not create a build info' do
expect { subject }.not_to change { ::Packages::BuildInfo.count }
diff --git a/spec/models/pages_domain_spec.rb b/spec/models/pages_domain_spec.rb
index 7b997f0d4e1..2b6ed9a9927 100644
--- a/spec/models/pages_domain_spec.rb
+++ b/spec/models/pages_domain_spec.rb
@@ -94,7 +94,7 @@ RSpec.describe PagesDomain do
with_them do
it "is adds the expected errors" do
- expect(pages_domain.errors.keys).to eq errors_on
+ expect(pages_domain.errors.attribute_names).to eq errors_on
end
end
end
@@ -155,7 +155,7 @@ RSpec.describe PagesDomain do
it "adds error to certificate" do
domain.valid?
- expect(domain.errors.keys).to contain_exactly(:key, :certificate)
+ expect(domain.errors.attribute_names).to contain_exactly(:key, :certificate)
end
end
@@ -165,7 +165,7 @@ RSpec.describe PagesDomain do
domain.valid?
- expect(domain.errors.keys).to contain_exactly(:key)
+ expect(domain.errors.attribute_names).to contain_exactly(:key)
end
end
end
@@ -287,6 +287,19 @@ RSpec.describe PagesDomain do
it { is_expected.to be_truthy }
end
+
+ # The LetsEncrypt DST Root CA X3 expired on 2021-09-30, but the
+ # cross-sign in ISRG Root X1 enables it to function provided a chain
+ # of trust can be established with the system store. See:
+ #
+ # 1. https://community.letsencrypt.org/t/production-chain-changes/150739
+ # 2. https://letsencrypt.org/2020/12/21/extending-android-compatibility.html
+ # 3. https://www.openssl.org/blog/blog/2021/09/13/LetsEncryptRootCertExpire/
+ context 'with a LetsEncrypt bundle with an expired DST Root CA X3' do
+ let(:domain) { build(:pages_domain, :letsencrypt_expired_x3_root) }
+
+ it { is_expected.to be_truthy }
+ end
end
describe '#expired?' do
diff --git a/spec/models/preloaders/merge_requests_preloader_spec.rb b/spec/models/preloaders/merge_requests_preloader_spec.rb
deleted file mode 100644
index 7108de2e491..00000000000
--- a/spec/models/preloaders/merge_requests_preloader_spec.rb
+++ /dev/null
@@ -1,42 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Preloaders::MergeRequestsPreloader do
- describe '#execute' do
- let_it_be_with_refind(:merge_requests) { create_list(:merge_request, 3) }
- let_it_be(:upvotes) { merge_requests.each { |m| create(:award_emoji, :upvote, awardable: m) } }
-
- it 'does not make n+1 queries' do
- described_class.new(merge_requests).execute
-
- control = ActiveRecord::QueryRecorder.new(skip_cached: false) do
- # expectations make sure the queries execute
- merge_requests.each do |m|
- expect(m.target_project.project_feature).not_to be_nil
- expect(m.lazy_upvotes_count).to eq(1)
- end
- end
-
- # 1 query for BatchLoader to load all upvotes at once
- expect(control.count).to eq(1)
- end
-
- it 'runs extra queries without preloading' do
- control = ActiveRecord::QueryRecorder.new(skip_cached: false) do
- # expectations make sure the queries execute
- merge_requests.each do |m|
- expect(m.target_project.project_feature).not_to be_nil
- expect(m.lazy_upvotes_count).to eq(1)
- end
- end
-
- # 4 queries per merge request =
- # 1 to load merge request
- # 1 to load project
- # 1 to load project_feature
- # 1 to load upvotes count
- expect(control.count).to eq(4 * merge_requests.size)
- end
- end
-end
diff --git a/spec/models/product_analytics_event_spec.rb b/spec/models/product_analytics_event_spec.rb
index 286729b8398..801e6dd5e10 100644
--- a/spec/models/product_analytics_event_spec.rb
+++ b/spec/models/product_analytics_event_spec.rb
@@ -36,17 +36,6 @@ RSpec.describe ProductAnalyticsEvent, type: :model do
it { expect(described_class.count_by_graph('platform', 30.days)).to eq({ 'app' => 1, 'mobile' => 1, 'web' => 2 }) }
end
- describe '.by_category_and_action' do
- let_it_be(:event) { create(:product_analytics_event, se_category: 'catA', se_action: 'actA') }
-
- before do
- create(:product_analytics_event, se_category: 'catA', se_action: 'actB')
- create(:product_analytics_event, se_category: 'catB', se_action: 'actA')
- end
-
- it { expect(described_class.by_category_and_action('catA', 'actA')).to match_array([event]) }
- end
-
describe '.count_collector_tstamp_by_day' do
let_it_be(:time_now) { Time.zone.now }
let_it_be(:time_ago) { Time.zone.now - 5.days }
diff --git a/spec/models/project_feature_usage_spec.rb b/spec/models/project_feature_usage_spec.rb
index 698c5374e88..3765a2b37a7 100644
--- a/spec/models/project_feature_usage_spec.rb
+++ b/spec/models/project_feature_usage_spec.rb
@@ -133,10 +133,8 @@ RSpec.describe ProjectFeatureUsage, type: :model do
subject { project.feature_usage }
- context 'database load balancing is configured', :db_load_balancing do
+ context 'database load balancing is configured' do
before do
- allow(ActiveRecord::Base).to receive(:connection).and_return(::Gitlab::Database::LoadBalancing.proxy)
-
::Gitlab::Database::LoadBalancing::Session.clear_session
end
diff --git a/spec/models/project_spec.rb b/spec/models/project_spec.rb
index 3989ddc31e8..10220448936 100644
--- a/spec/models/project_spec.rb
+++ b/spec/models/project_spec.rb
@@ -140,6 +140,7 @@ RSpec.describe Project, factory_default: :keep do
it { is_expected.to have_many(:error_tracking_client_keys).class_name('ErrorTracking::ClientKey') }
it { is_expected.to have_many(:pending_builds).class_name('Ci::PendingBuild') }
it { is_expected.to have_many(:ci_feature_usages).class_name('Projects::CiFeatureUsage') }
+ it { is_expected.to have_many(:bulk_import_exports).class_name('BulkImports::Export') }
# GitLab Pages
it { is_expected.to have_many(:pages_domains) }
@@ -494,23 +495,6 @@ RSpec.describe Project, factory_default: :keep do
end
end
- describe '#merge_requests_author_approval' do
- where(:attribute_value, :return_value) do
- true | true
- false | false
- nil | false
- end
-
- with_them do
- let(:project) { create(:project, merge_requests_author_approval: attribute_value) }
-
- it 'returns expected value' do
- expect(project.merge_requests_author_approval).to eq(return_value)
- expect(project.merge_requests_author_approval?).to eq(return_value)
- end
- end
- end
-
describe '#all_pipelines' do
let_it_be(:project) { create(:project) }
@@ -3066,7 +3050,7 @@ RSpec.describe Project, factory_default: :keep do
let(:project) { create(:project) }
it 'marks the location with project ID' do
- expect(Gitlab::Database::LoadBalancing::Sticking).to receive(:mark_primary_write_location).with(:project, project.id)
+ expect(ApplicationRecord.sticking).to receive(:mark_primary_write_location).with(:project, project.id)
project.mark_primary_write_location
end
@@ -6303,24 +6287,18 @@ RSpec.describe Project, factory_default: :keep do
describe 'validation #changing_shared_runners_enabled_is_allowed' do
where(:shared_runners_setting, :project_shared_runners_enabled, :valid_record) do
- 'enabled' | true | true
- 'enabled' | false | true
- 'disabled_with_override' | true | true
- 'disabled_with_override' | false | true
- 'disabled_and_unoverridable' | true | false
- 'disabled_and_unoverridable' | false | true
+ :shared_runners_enabled | true | true
+ :shared_runners_enabled | false | true
+ :disabled_with_override | true | true
+ :disabled_with_override | false | true
+ :disabled_and_unoverridable | true | false
+ :disabled_and_unoverridable | false | true
end
with_them do
- let(:group) { create(:group) }
+ let(:group) { create(:group, shared_runners_setting) }
let(:project) { build(:project, namespace: group, shared_runners_enabled: project_shared_runners_enabled) }
- before do
- allow_next_found_instance_of(Group) do |group|
- allow(group).to receive(:shared_runners_setting).and_return(shared_runners_setting)
- end
- end
-
it 'validates the configuration' do
expect(project.valid?).to eq(valid_record)
@@ -7239,35 +7217,6 @@ RSpec.describe Project, factory_default: :keep do
expect(project.reload.topics.map(&:name)).to eq(%w[topic1 topic2 topic3])
end
end
-
- context 'during ExtractProjectTopicsIntoSeparateTable migration' do
- before do
- topic_a = ActsAsTaggableOn::Tag.find_or_create_by!(name: 'topicA')
- topic_b = ActsAsTaggableOn::Tag.find_or_create_by!(name: 'topicB')
-
- project.reload.topics_acts_as_taggable = [topic_a, topic_b]
- project.save!
- project.reload
- end
-
- it 'topic_list returns correct string array' do
- expect(project.topic_list).to eq(%w[topicA topicB topic1 topic2 topic3])
- end
-
- it 'topics returns correct topic records' do
- expect(project.topics.map(&:class)).to eq([ActsAsTaggableOn::Tag, ActsAsTaggableOn::Tag, Projects::Topic, Projects::Topic, Projects::Topic])
- expect(project.topics.map(&:name)).to eq(%w[topicA topicB topic1 topic2 topic3])
- end
-
- it 'topic_list= sets new topics and removes old topics' do
- project.topic_list = 'new-topic1, new-topic2'
- project.save!
- project.reload
-
- expect(project.topics.map(&:class)).to eq([Projects::Topic, Projects::Topic])
- expect(project.topics.map(&:name)).to eq(%w[new-topic1 new-topic2])
- end
- end
end
shared_examples 'all_runners' do
diff --git a/spec/models/project_statistics_spec.rb b/spec/models/project_statistics_spec.rb
index ba769e830fd..ead6238b2f4 100644
--- a/spec/models/project_statistics_spec.rb
+++ b/spec/models/project_statistics_spec.rb
@@ -294,15 +294,17 @@ RSpec.describe ProjectStatistics do
describe '#update_lfs_objects_size' do
let!(:lfs_object1) { create(:lfs_object, size: 23.megabytes) }
let!(:lfs_object2) { create(:lfs_object, size: 34.megabytes) }
+ let!(:lfs_object3) { create(:lfs_object, size: 34.megabytes) }
let!(:lfs_objects_project1) { create(:lfs_objects_project, project: project, lfs_object: lfs_object1) }
let!(:lfs_objects_project2) { create(:lfs_objects_project, project: project, lfs_object: lfs_object2) }
+ let!(:lfs_objects_project3) { create(:lfs_objects_project, project: project, lfs_object: lfs_object3) }
before do
statistics.update_lfs_objects_size
end
it "stores the size of related LFS objects" do
- expect(statistics.lfs_objects_size).to eq 57.megabytes
+ expect(statistics.lfs_objects_size).to eq 91.megabytes
end
end
diff --git a/spec/models/projects/topic_spec.rb b/spec/models/projects/topic_spec.rb
index 409dc932709..397c65f4d5c 100644
--- a/spec/models/projects/topic_spec.rb
+++ b/spec/models/projects/topic_spec.rb
@@ -3,12 +3,18 @@
require 'spec_helper'
RSpec.describe Projects::Topic do
- let_it_be(:topic, reload: true) { create(:topic) }
+ let_it_be(:topic, reload: true) { create(:topic, name: 'topic') }
subject { topic }
it { expect(subject).to be_valid }
+ describe 'modules' do
+ subject { described_class }
+
+ it { is_expected.to include_module(Avatarable) }
+ end
+
describe 'associations' do
it { is_expected.to have_many(:project_topics) }
it { is_expected.to have_many(:projects) }
@@ -18,5 +24,76 @@ RSpec.describe Projects::Topic do
it { is_expected.to validate_presence_of(:name) }
it { is_expected.to validate_uniqueness_of(:name) }
it { is_expected.to validate_length_of(:name).is_at_most(255) }
+ it { is_expected.to validate_length_of(:description).is_at_most(1024) }
+ end
+
+ describe 'scopes' do
+ describe 'order_by_total_projects_count' do
+ let!(:topic1) { create(:topic, name: 'topicB') }
+ let!(:topic2) { create(:topic, name: 'topicC') }
+ let!(:topic3) { create(:topic, name: 'topicA') }
+ let!(:project1) { create(:project, topic_list: 'topicC, topicA, topicB') }
+ let!(:project2) { create(:project, topic_list: 'topicC, topicA') }
+ let!(:project3) { create(:project, topic_list: 'topicC') }
+
+ it 'sorts topics by total_projects_count' do
+ topics = described_class.order_by_total_projects_count
+
+ expect(topics.map(&:name)).to eq(%w[topicC topicA topicB topic])
+ end
+ end
+
+ describe 'reorder_by_similarity' do
+ let!(:topic1) { create(:topic, name: 'my-topic') }
+ let!(:topic2) { create(:topic, name: 'other') }
+ let!(:topic3) { create(:topic, name: 'topic2') }
+
+ it 'sorts topics by similarity' do
+ topics = described_class.reorder_by_similarity('topic')
+
+ expect(topics.map(&:name)).to eq(%w[topic my-topic topic2 other])
+ end
+ end
+ end
+
+ describe '#search' do
+ it 'returns topics with a matching name' do
+ expect(described_class.search(topic.name)).to eq([topic])
+ end
+
+ it 'returns topics with a partially matching name' do
+ expect(described_class.search(topic.name[0..2])).to eq([topic])
+ end
+
+ it 'returns topics with a matching name regardless of the casing' do
+ expect(described_class.search(topic.name.upcase)).to eq([topic])
+ end
+ end
+
+ describe '#avatar_type' do
+ it "is true if avatar is image" do
+ topic.update_attribute(:avatar, 'uploads/avatar.png')
+ expect(topic.avatar_type).to be_truthy
+ end
+
+ it "is false if avatar is html page" do
+ topic.update_attribute(:avatar, 'uploads/avatar.html')
+ topic.avatar_type
+
+ expect(topic.errors.added?(:avatar, "file format is not supported. Please try one of the following supported formats: png, jpg, jpeg, gif, bmp, tiff, ico, webp")).to be true
+ end
+ end
+
+ describe '#avatar_url' do
+ context 'when avatar file is uploaded' do
+ before do
+ topic.update!(avatar: fixture_file_upload("spec/fixtures/dk.png"))
+ end
+
+ it 'shows correct avatar url' do
+ expect(topic.avatar_url).to eq(topic.avatar.url)
+ expect(topic.avatar_url(only_path: false)).to eq([Gitlab.config.gitlab.url, topic.avatar.url].join)
+ end
+ end
end
end
diff --git a/spec/models/protected_branch_spec.rb b/spec/models/protected_branch_spec.rb
index 019c01af672..587a9683a8e 100644
--- a/spec/models/protected_branch_spec.rb
+++ b/spec/models/protected_branch_spec.rb
@@ -308,4 +308,15 @@ RSpec.describe ProtectedBranch do
expect(described_class.by_name('')).to be_empty
end
end
+
+ describe '.get_ids_by_name' do
+ let(:branch_name) { 'branch_name' }
+ let!(:protected_branch) { create(:protected_branch, name: branch_name) }
+ let(:branch_id) { protected_branch.id }
+
+ it 'returns the id for each protected branch matching name' do
+ expect(described_class.get_ids_by_name([branch_name]))
+ .to match_array([branch_id])
+ end
+ end
end
diff --git a/spec/models/repository_spec.rb b/spec/models/repository_spec.rb
index dc55214c1dd..7bad907cf90 100644
--- a/spec/models/repository_spec.rb
+++ b/spec/models/repository_spec.rb
@@ -71,7 +71,7 @@ RSpec.describe Repository do
let(:feature_flag) { true }
before do
- stub_feature_flags(gitaly_tags_finder: feature_flag)
+ stub_feature_flags(tags_finder_gitaly: feature_flag)
end
context 'name_desc' do
diff --git a/spec/models/snippet_repository_spec.rb b/spec/models/snippet_repository_spec.rb
index 40a28b9e0cc..e8a933d2277 100644
--- a/spec/models/snippet_repository_spec.rb
+++ b/spec/models/snippet_repository_spec.rb
@@ -115,6 +115,7 @@ RSpec.describe SnippetRepository do
allow(snippet).to receive(:repository).and_return(repo)
allow(repo).to receive(:ls_files).and_return([])
allow(repo).to receive(:root_ref).and_return('master')
+ allow(repo).to receive(:empty?).and_return(false)
end
it 'infers the commit action based on the parameters if not present' do
diff --git a/spec/models/upload_spec.rb b/spec/models/upload_spec.rb
index 6bac5e31435..0ac684cd04c 100644
--- a/spec/models/upload_spec.rb
+++ b/spec/models/upload_spec.rb
@@ -242,4 +242,28 @@ RSpec.describe Upload do
it { expect(subject.uploader_context).to match(a_hash_including(secret: 'secret', identifier: 'file.txt')) }
end
+
+ describe '#update_project_statistics' do
+ let_it_be(:project) { create(:project) }
+
+ subject do
+ create(:upload, model: project)
+ end
+
+ it 'updates project statistics when upload is added' do
+ expect(ProjectCacheWorker).to receive(:perform_async)
+ .with(project.id, [], [:uploads_size])
+
+ subject.save!
+ end
+
+ it 'updates project statistics when upload is removed' do
+ subject.save!
+
+ expect(ProjectCacheWorker).to receive(:perform_async)
+ .with(project.id, [], [:uploads_size])
+
+ subject.destroy!
+ end
+ end
end
diff --git a/spec/models/user_detail_spec.rb b/spec/models/user_detail_spec.rb
index ba7ea3f7ce2..9189b9a1469 100644
--- a/spec/models/user_detail_spec.rb
+++ b/spec/models/user_detail_spec.rb
@@ -4,6 +4,7 @@ require 'spec_helper'
RSpec.describe UserDetail do
it { is_expected.to belong_to(:user) }
+ it { is_expected.to define_enum_for(:registration_objective).with_values([:basics, :move_repository, :code_storage, :exploring, :ci, :other, :joining_team]).with_suffix }
describe 'validations' do
describe '#job_title' do
diff --git a/spec/models/user_preference_spec.rb b/spec/models/user_preference_spec.rb
index 5806f123871..d4491aacd9f 100644
--- a/spec/models/user_preference_spec.rb
+++ b/spec/models/user_preference_spec.rb
@@ -80,12 +80,6 @@ RSpec.describe UserPreference do
end
end
- describe '#timezone' do
- it 'returns server time as default' do
- expect(user_preference.timezone).to eq(Time.zone.tzinfo.name)
- end
- end
-
describe '#tab_width' do
it 'is set to 8 by default' do
# Intentionally not using factory here to test the constructor.
diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb
index ca4c38d4663..db805a804c8 100644
--- a/spec/models/user_spec.rb
+++ b/spec/models/user_spec.rb
@@ -79,6 +79,9 @@ RSpec.describe User do
it { is_expected.to delegate_method(:bio).to(:user_detail).allow_nil }
it { is_expected.to delegate_method(:bio=).to(:user_detail).with_arguments(:args).allow_nil }
+
+ it { is_expected.to delegate_method(:registration_objective).to(:user_detail).allow_nil }
+ it { is_expected.to delegate_method(:registration_objective=).to(:user_detail).with_arguments(:args).allow_nil }
end
describe 'associations' do
@@ -123,7 +126,7 @@ RSpec.describe User do
it { is_expected.to have_many(:callouts).class_name('UserCallout') }
it { is_expected.to have_many(:group_callouts).class_name('Users::GroupCallout') }
- describe "#user_detail" do
+ describe '#user_detail' do
it 'does not persist `user_detail` by default' do
expect(create(:user).user_detail).not_to be_persisted
end
@@ -160,25 +163,25 @@ RSpec.describe User do
end
end
- describe "#abuse_report" do
+ describe '#abuse_report' do
let(:current_user) { create(:user) }
let(:other_user) { create(:user) }
it { is_expected.to have_one(:abuse_report) }
- it "refers to the abuse report whose user_id is the current user" do
+ 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)
end
- it "does not refer to the abuse report whose reporter_id is the current user" do
+ 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
end
- it "does not update the user_id of an abuse report when the user is updated" do
+ it 'does not update the user_id of an abuse report when the user is updated' do
abuse_report = create(:abuse_report, reporter: current_user, user: other_user)
current_user.block
@@ -343,8 +346,9 @@ RSpec.describe User do
it 'falls back to english when I18n.default_locale is not an available language' do
I18n.default_locale = :kl
+ default_preferred_language = user.send(:default_preferred_language)
- expect(user.preferred_language).to eq 'en'
+ expect(user.preferred_language).to eq default_preferred_language
end
end
end
@@ -374,7 +378,7 @@ RSpec.describe User do
end
context 'when username is changed' do
- let(:user) { build_stubbed(:user, username: 'old_path', namespace: build_stubbed(:namespace)) }
+ let(:user) { build_stubbed(:user, username: 'old_path', namespace: build_stubbed(:user_namespace)) }
it 'validates move_dir is allowed for the namespace' do
expect(user.namespace).to receive(:any_project_has_container_registry_tags?).and_return(true)
@@ -401,7 +405,7 @@ RSpec.describe User do
user = build(:user, username: "test.#{type}")
expect(user).not_to be_valid
- expect(user.errors.full_messages).to include('Username ending with a file extension is not allowed.')
+ expect(user.errors.full_messages).to include('Username ending with a reserved file extension is not allowed.')
expect(build(:user, username: "test#{type}")).to be_valid
end
end
@@ -490,6 +494,8 @@ RSpec.describe User do
end
describe 'email' do
+ let(:expected_error) { _('is not allowed for sign-up. Check with your administrator.') }
+
context 'when no signup domains allowed' do
before do
stub_application_setting(domain_allowlist: [])
@@ -533,7 +539,7 @@ RSpec.describe User do
it 'rejects example@test.com' do
user = build(:user, email: "example@test.com")
expect(user).to be_invalid
- expect(user.errors.messages[:email].first).to eq(_('domain is not authorized for sign-up.'))
+ expect(user.errors.messages[:email].first).to eq(expected_error)
end
end
@@ -550,13 +556,13 @@ RSpec.describe User do
it 'rejects info@test.example.com' do
user = build(:user, email: "info@test.example.com")
expect(user).to be_invalid
- expect(user.errors.messages[:email].first).to eq(_('domain is not authorized for sign-up.'))
+ expect(user.errors.messages[:email].first).to eq(expected_error)
end
it 'rejects example@test.com' do
user = build(:user, email: "example@test.com")
expect(user).to be_invalid
- expect(user.errors.messages[:email].first).to eq(_('domain is not authorized for sign-up.'))
+ expect(user.errors.messages[:email].first).to eq(expected_error)
end
it 'accepts example@test.com when added by another user' do
@@ -594,7 +600,7 @@ RSpec.describe User do
it 'rejects info@example.com' do
user = build(:user, email: 'info@example.com')
expect(user).not_to be_valid
- expect(user.errors.messages[:email].first).to eq(_('is not from an allowed domain.'))
+ expect(user.errors.messages[:email].first).to eq(expected_error)
end
it 'accepts info@example.com when added by another user' do
@@ -628,7 +634,7 @@ RSpec.describe User do
it 'rejects info@example.com' do
user = build(:user, email: 'info@example.com')
expect(user).not_to be_valid
- expect(user.errors.messages[:email].first).to eq(_('domain is not authorized for sign-up.'))
+ expect(user.errors.messages[:email].first).to eq(expected_error)
end
end
end
@@ -669,7 +675,7 @@ RSpec.describe User do
user = build(:user, email: 'info@gitlab.com')
expect(user).not_to be_valid
- expect(user.errors.messages[:email].first).to eq(_('is not allowed. Try again with a different email address, or contact your GitLab admin.'))
+ expect(user.errors.messages[:email].first).to eq(expected_error)
end
it 'does accept a valid email address' do
@@ -715,7 +721,7 @@ RSpec.describe User do
end
end
- describe "scopes" do
+ describe 'scopes' do
context 'blocked users' do
let_it_be(:active_user) { create(:user) }
let_it_be(:blocked_user) { create(:user, :blocked) }
@@ -753,8 +759,8 @@ RSpec.describe User do
end
end
- describe ".with_two_factor" do
- it "returns users with 2fa enabled via OTP" do
+ describe '.with_two_factor' do
+ it 'returns users with 2fa enabled via OTP' do
user_with_2fa = create(:user, :two_factor_via_otp)
user_without_2fa = create(:user)
users_with_two_factor = described_class.with_two_factor.pluck(:id)
@@ -763,8 +769,8 @@ RSpec.describe User do
expect(users_with_two_factor).not_to include(user_without_2fa.id)
end
- shared_examples "returns the right users" do |trait|
- it "returns users with 2fa enabled via hardware token" do
+ shared_examples 'returns the right users' do |trait|
+ it 'returns users with 2fa enabled via hardware token' do
user_with_2fa = create(:user, trait)
user_without_2fa = create(:user)
users_with_two_factor = described_class.with_two_factor.pluck(:id)
@@ -773,7 +779,7 @@ RSpec.describe User do
expect(users_with_two_factor).not_to include(user_without_2fa.id)
end
- it "returns users with 2fa enabled via OTP and hardware token" do
+ it 'returns users with 2fa enabled via OTP and hardware token' do
user_with_2fa = create(:user, :two_factor_via_otp, trait)
user_without_2fa = create(:user)
users_with_two_factor = described_class.with_two_factor.pluck(:id)
@@ -791,17 +797,17 @@ RSpec.describe User do
end
end
- describe "and U2F" do
+ describe 'and U2F' do
it_behaves_like "returns the right users", :two_factor_via_u2f
end
- describe "and WebAuthn" do
+ describe 'and WebAuthn' do
it_behaves_like "returns the right users", :two_factor_via_webauthn
end
end
- describe ".without_two_factor" do
- it "excludes users with 2fa enabled via OTP" do
+ describe '.without_two_factor' do
+ it 'excludes users with 2fa enabled via OTP' do
user_with_2fa = create(:user, :two_factor_via_otp)
user_without_2fa = create(:user)
users_without_two_factor = described_class.without_two_factor.pluck(:id)
@@ -810,8 +816,8 @@ RSpec.describe User do
expect(users_without_two_factor).not_to include(user_with_2fa.id)
end
- describe "and u2f" do
- it "excludes users with 2fa enabled via U2F" do
+ describe 'and u2f' do
+ it 'excludes users with 2fa enabled via U2F' do
user_with_2fa = create(:user, :two_factor_via_u2f)
user_without_2fa = create(:user)
users_without_two_factor = described_class.without_two_factor.pluck(:id)
@@ -820,7 +826,7 @@ RSpec.describe User do
expect(users_without_two_factor).not_to include(user_with_2fa.id)
end
- it "excludes users with 2fa enabled via OTP and U2F" do
+ it 'excludes users with 2fa enabled via OTP and U2F' do
user_with_2fa = create(:user, :two_factor_via_otp, :two_factor_via_u2f)
user_without_2fa = create(:user)
users_without_two_factor = described_class.without_two_factor.pluck(:id)
@@ -830,8 +836,8 @@ RSpec.describe User do
end
end
- describe "and webauthn" do
- it "excludes users with 2fa enabled via WebAuthn" do
+ describe 'and webauthn' do
+ it 'excludes users with 2fa enabled via WebAuthn' do
user_with_2fa = create(:user, :two_factor_via_webauthn)
user_without_2fa = create(:user)
users_without_two_factor = described_class.without_two_factor.pluck(:id)
@@ -840,7 +846,7 @@ RSpec.describe User do
expect(users_without_two_factor).not_to include(user_with_2fa.id)
end
- it "excludes users with 2fa enabled via OTP and WebAuthn" do
+ it 'excludes users with 2fa enabled via OTP and WebAuthn' do
user_with_2fa = create(:user, :two_factor_via_otp, :two_factor_via_webauthn)
user_without_2fa = create(:user)
users_without_two_factor = described_class.without_two_factor.pluck(:id)
@@ -1073,7 +1079,7 @@ RSpec.describe User do
end
end
- describe "Respond to" do
+ describe 'Respond to' do
it { is_expected.to respond_to(:admin?) }
it { is_expected.to respond_to(:name) }
it { is_expected.to respond_to(:external?) }
@@ -1095,7 +1101,7 @@ RSpec.describe User do
let(:user) { create(:user) }
let(:external_user) { create(:user, external: true) }
- it "sets other properties as well" do
+ it 'sets other properties as well' do
expect(external_user.can_create_team).to be_falsey
expect(external_user.can_create_group).to be_falsey
expect(external_user.projects_limit).to be 0
@@ -1514,7 +1520,7 @@ RSpec.describe User do
end
describe '#generate_password' do
- it "does not generate password by default" do
+ it 'does not generate password by default' do
user = create(:user, password: 'abcdefghe')
expect(user.password).to eq('abcdefghe')
@@ -1882,14 +1888,14 @@ RSpec.describe User do
describe 'deactivating a user' do
let(:user) { create(:user, name: 'John Smith') }
- context "an active user" do
- it "can be deactivated" do
+ context 'an active user' do
+ it 'can be deactivated' do
user.deactivate
expect(user.deactivated?).to be_truthy
end
- context "when user deactivation emails are disabled" do
+ context 'when user deactivation emails are disabled' do
before do
stub_application_setting(user_deactivation_emails_enabled: false)
end
@@ -1900,7 +1906,7 @@ RSpec.describe User do
end
end
- context "when user deactivation emails are enabled" do
+ context 'when user deactivation emails are enabled' do
it 'sends deactivated user an email' do
expect_next_instance_of(NotificationService) do |notification|
allow(notification).to receive(:user_deactivated).with(user.name, user.notification_email_or_default)
@@ -1911,12 +1917,12 @@ RSpec.describe User do
end
end
- context "a user who is blocked" do
+ context 'a user who is blocked' do
before do
user.block
end
- it "cannot be deactivated" do
+ it 'cannot be deactivated' do
user.deactivate
expect(user.reload.deactivated?).to be_falsy
@@ -2083,7 +2089,7 @@ RSpec.describe User do
describe 'with defaults' do
let(:user) { described_class.new }
- it "applies defaults to user" do
+ it 'applies defaults to user' do
expect(user.projects_limit).to eq(Gitlab.config.gitlab.default_projects_limit)
expect(user.can_create_group).to eq(Gitlab.config.gitlab.default_can_create_group)
expect(user.theme_id).to eq(Gitlab.config.gitlab.default_theme)
@@ -2095,7 +2101,7 @@ RSpec.describe User do
describe 'with default overrides' do
let(:user) { described_class.new(projects_limit: 123, can_create_group: false, can_create_team: true) }
- it "applies defaults to user" do
+ it 'applies defaults to user' do
expect(user.projects_limit).to eq(123)
expect(user.can_create_group).to be_falsey
expect(user.theme_id).to eq(1)
@@ -2114,7 +2120,7 @@ RSpec.describe User do
stub_application_setting(user_default_external: true)
end
- it "creates external user by default" do
+ it 'creates external user by default' do
user = create(:user)
expect(user.external).to be_truthy
@@ -2123,7 +2129,7 @@ RSpec.describe User do
end
describe 'with default overrides' do
- it "creates a non-external user" do
+ it 'creates a non-external user' do
user = create(:user, external: false)
expect(user.external).to be_falsey
@@ -2139,7 +2145,7 @@ RSpec.describe User do
}
protocol_and_expectation.each do |protocol, expected|
- it "has correct require_ssh_key?" do
+ it 'has correct require_ssh_key?' do
stub_application_setting(enabled_git_access_protocol: protocol)
user = build(:user)
@@ -2542,71 +2548,79 @@ RSpec.describe User do
end
describe '.find_by_full_path' do
- let!(:user) { create(:user) }
+ using RSpec::Parameterized::TableSyntax
- context 'with a route matching the given path' do
- let!(:route) { user.namespace.route }
+ # TODO: this `where/when` can be removed in issue https://gitlab.com/gitlab-org/gitlab/-/issues/341070
+ # At that point we only need to check `user_namespace`
+ where(namespace_type: [:namespace, :user_namespace])
- it 'returns the user' do
- expect(described_class.find_by_full_path(route.path)).to eq(user)
- end
+ with_them do
+ let!(:user) { create(:user, namespace: create(namespace_type)) }
- it 'is case-insensitive' do
- expect(described_class.find_by_full_path(route.path.upcase)).to eq(user)
- expect(described_class.find_by_full_path(route.path.downcase)).to eq(user)
- end
- end
+ context 'with a route matching the given path' do
+ let!(:route) { user.namespace.route }
- context 'with a redirect route matching the given path' do
- let!(:redirect_route) { user.namespace.redirect_routes.create!(path: 'foo') }
+ it 'returns the user' do
+ expect(described_class.find_by_full_path(route.path)).to eq(user)
+ end
- context 'without the follow_redirects option' do
- it 'returns nil' do
- expect(described_class.find_by_full_path(redirect_route.path)).to eq(nil)
+ it 'is case-insensitive' do
+ expect(described_class.find_by_full_path(route.path.upcase)).to eq(user)
+ expect(described_class.find_by_full_path(route.path.downcase)).to eq(user)
end
end
- context 'with the follow_redirects option set to true' do
- it 'returns the user' do
- expect(described_class.find_by_full_path(redirect_route.path, follow_redirects: true)).to eq(user)
+ context 'with a redirect route matching the given path' do
+ let!(:redirect_route) { user.namespace.redirect_routes.create!(path: 'foo') }
+
+ context 'without the follow_redirects option' do
+ it 'returns nil' do
+ expect(described_class.find_by_full_path(redirect_route.path)).to eq(nil)
+ end
end
- it 'is case-insensitive' do
- expect(described_class.find_by_full_path(redirect_route.path.upcase, follow_redirects: true)).to eq(user)
- expect(described_class.find_by_full_path(redirect_route.path.downcase, follow_redirects: true)).to eq(user)
+ context 'with the follow_redirects option set to true' do
+ it 'returns the user' do
+ expect(described_class.find_by_full_path(redirect_route.path, follow_redirects: true)).to eq(user)
+ end
+
+ it 'is case-insensitive' do
+ expect(described_class.find_by_full_path(redirect_route.path.upcase, follow_redirects: true)).to eq(user)
+ expect(described_class.find_by_full_path(redirect_route.path.downcase, follow_redirects: true)).to eq(user)
+ end
end
end
- end
- context 'without a route or a redirect route matching the given path' do
- context 'without the follow_redirects option' do
- it 'returns nil' do
- expect(described_class.find_by_full_path('unknown')).to eq(nil)
+ context 'without a route or a redirect route matching the given path' do
+ context 'without the follow_redirects option' do
+ it 'returns nil' do
+ expect(described_class.find_by_full_path('unknown')).to eq(nil)
+ end
end
- end
- context 'with the follow_redirects option set to true' do
- it 'returns nil' do
- expect(described_class.find_by_full_path('unknown', follow_redirects: true)).to eq(nil)
+ context 'with the follow_redirects option set to true' do
+ it 'returns nil' do
+ expect(described_class.find_by_full_path('unknown', follow_redirects: true)).to eq(nil)
+ end
end
end
- end
- context 'with a group route matching the given path' do
- let!(:group) { create(:group, path: 'group_path') }
+ context 'with a group route matching the given path' do
+ let!(:group) { create(:group, path: 'group_path') }
- context 'when the group namespace has an owner_id (legacy data)' do
- before do
- group.update!(owner_id: user.id)
- end
+ context 'when the group namespace has an owner_id (legacy data)' do
+ before do
+ group.update!(owner_id: user.id)
+ end
- it 'returns nil' do
- expect(described_class.find_by_full_path('group_path')).to eq(nil)
+ it 'returns nil' do
+ expect(described_class.find_by_full_path('group_path')).to eq(nil)
+ end
end
- end
- context 'when the group namespace does not have an owner_id' do
- it 'returns nil' do
- expect(described_class.find_by_full_path('group_path')).to eq(nil)
+ context 'when the group namespace does not have an owner_id' do
+ it 'returns nil' do
+ expect(described_class.find_by_full_path('group_path')).to eq(nil)
+ end
end
end
end
@@ -2615,7 +2629,7 @@ RSpec.describe User do
describe 'all_ssh_keys' do
it { is_expected.to have_many(:keys).dependent(:destroy) }
- it "has all ssh keys" do
+ it 'has all ssh keys' do
user = create :user
key = create :key, key: "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQD33bWLBxu48Sev9Fert1yzEO4WGcWglWF7K/AwblIUFselOt/QdOL9DSjpQGxLagO1s9wl53STIO8qGS4Ms0EJZyIXOEFMjFJ5xmjSy+S37By4sG7SsltQEHMxtbtFOaW5LV2wCrX+rUsRNqLMamZjgjcPO0/EgGCXIGMAYW4O7cwGZdXWYIhQ1Vwy+CsVMDdPkPgBXqK7nR/ey8KMs8ho5fMNgB5hBw/AL9fNGhRw3QTD6Q12Nkhl4VZES2EsZqlpNnJttnPdp847DUsT6yuLRlfiQfz5Cn9ysHFdXObMN5VYIiPFwHeYCZp1X2S4fDZooRE8uOLTfxWHPXwrhqSH", user_id: user.id
@@ -2651,10 +2665,10 @@ RSpec.describe User do
end
end
- describe "#clear_avatar_caches" do
+ describe '#clear_avatar_caches' do
let(:user) { create(:user) }
- it "clears the avatar cache when saving" do
+ it 'clears the avatar cache when saving' do
allow(user).to receive(:avatar_changed?).and_return(true)
expect(Gitlab::AvatarCache).to receive(:delete_by_email).with(*user.verified_emails)
@@ -3180,7 +3194,7 @@ RSpec.describe User do
end
end
- describe "#last_active_at" do
+ describe '#last_active_at' do
let(:last_activity_on) { 5.days.ago.to_date }
let(:current_sign_in_at) { 8.days.ago }
@@ -3218,7 +3232,7 @@ RSpec.describe User do
end
end
- describe "#can_be_deactivated?" do
+ describe '#can_be_deactivated?' do
let(:activity) { {} }
let(:user) { create(:user, name: 'John Smith', **activity) }
let(:day_within_minium_inactive_days_threshold) { User::MINIMUM_INACTIVE_DAYS.pred.days.ago }
@@ -3236,7 +3250,7 @@ RSpec.describe User do
end
end
- context "a user who is not active" do
+ context 'a user who is not active' do
before do
user.block
end
@@ -3277,7 +3291,7 @@ RSpec.describe User do
end
end
- describe "#contributed_projects" do
+ describe '#contributed_projects' do
subject { create(:user) }
let!(:project1) { create(:project) }
@@ -3292,11 +3306,11 @@ RSpec.describe User do
project2.add_maintainer(subject)
end
- it "includes IDs for projects the user has pushed to" do
+ it 'includes IDs for projects the user has pushed to' do
expect(subject.contributed_projects).to include(project1)
end
- it "includes IDs for projects the user has had merge requests merged into" do
+ it 'includes IDs for projects the user has had merge requests merged into' do
expect(subject.contributed_projects).to include(project3)
end
@@ -3390,7 +3404,7 @@ RSpec.describe User do
end
end
- describe "#recent_push" do
+ describe '#recent_push' do
let(:user) { build(:user) }
let(:project) { build(:project) }
let(:event) { build(:push_event) }
@@ -3554,7 +3568,7 @@ RSpec.describe User do
expect(user.authorized_projects).to include(project)
end
- it "includes personal projects user has been given access to" do
+ it 'includes personal projects user has been given access to' do
user1 = create(:user)
user2 = create(:user)
project = create(:project, :private, namespace: user1.namespace)
@@ -3564,7 +3578,7 @@ RSpec.describe User do
expect(user2.authorized_projects).to include(project)
end
- it "includes projects of groups user has been added to" do
+ it 'includes projects of groups user has been added to' do
group = create(:group)
project = create(:project, group: group)
user = create(:user)
@@ -3574,7 +3588,7 @@ RSpec.describe User do
expect(user.authorized_projects).to include(project)
end
- it "does not include projects of groups user has been removed from" do
+ it 'does not include projects of groups user has been removed from', :sidekiq_inline do
group = create(:group)
project = create(:project, group: group)
user = create(:user)
@@ -3599,7 +3613,7 @@ RSpec.describe User do
expect(user.authorized_projects).to include(project)
end
- it "does not include destroyed projects user had access to" do
+ it 'does not include destroyed projects user had access to' do
user1 = create(:user)
user2 = create(:user)
project = create(:project, :private, namespace: user1.namespace)
@@ -3613,7 +3627,7 @@ RSpec.describe User do
expect(user2.authorized_projects).not_to include(project)
end
- it "does not include projects of destroyed groups user had access to" do
+ it 'does not include projects of destroyed groups user had access to' do
group = create(:group)
project = create(:project, namespace: group)
user = create(:user)
@@ -3841,7 +3855,7 @@ RSpec.describe User do
end
context 'with runner in a personal project' do
- let!(:namespace) { create(:namespace, owner: user) }
+ let!(:namespace) { create(:user_namespace, owner: user) }
let!(:project) { create(:project, namespace: namespace) }
let!(:runner) { create(:ci_runner, :project, projects: [project]) }
@@ -3909,7 +3923,7 @@ RSpec.describe User do
end
context 'with personal project runner in an owned group in an owned namespace and a group runner in that group' do
- let!(:namespace) { create(:namespace, owner: user) }
+ let!(:namespace) { create(:user_namespace, owner: user) }
let!(:group) { create(:group) }
let!(:group_runner) { create(:ci_runner, :group, groups: [group]) }
let!(:project) { create(:project, namespace: namespace, group: group) }
@@ -3923,7 +3937,7 @@ RSpec.describe User do
end
context 'with personal project runner in an owned namespace, an owned group, a subgroup and a group runner in that subgroup' do
- let!(:namespace) { create(:namespace, owner: user) }
+ let!(:namespace) { create(:user_namespace, owner: user) }
let!(:group) { create(:group) }
let!(:subgroup) { create(:group, parent: group) }
let!(:group_runner) { create(:ci_runner, :group, groups: [subgroup]) }
@@ -4166,7 +4180,7 @@ RSpec.describe User do
expect(user.admin).to be true
end
- it "accepts string values in addition to symbols" do
+ it 'accepts string values in addition to symbols' do
user.access_level = 'admin'
expect(user.access_level).to eq(:admin)
@@ -4247,7 +4261,7 @@ RSpec.describe User do
expect(ghost.user_type).to eq 'ghost'
end
- it "does not create a second ghost user if one is already present" do
+ it 'does not create a second ghost user if one is already present' do
expect do
described_class.ghost
described_class.ghost
@@ -4256,7 +4270,7 @@ RSpec.describe User do
end
context "when a regular user exists with the username 'ghost'" do
- it "creates a ghost user with a non-conflicting username" do
+ it 'creates a ghost user with a non-conflicting username' do
create(:user, username: 'ghost')
ghost = described_class.ghost
@@ -4266,7 +4280,7 @@ RSpec.describe User do
end
context "when a regular user exists with the email 'ghost@example.com'" do
- it "creates a ghost user with a non-conflicting email" do
+ it 'creates a ghost user with a non-conflicting email' do
create(:user, email: 'ghost@example.com')
ghost = described_class.ghost
@@ -4605,6 +4619,7 @@ RSpec.describe User do
user.save!
expect(user.namespace).not_to be_nil
+ expect(user.namespace).to be_kind_of(Namespaces::UserNamespace)
end
it 'creates the namespace setting' do
@@ -4746,7 +4761,7 @@ RSpec.describe User do
it { is_expected.to be true }
end
- context 'when email and username aren\'t changed' do
+ context "when email and username aren't changed" do
before do
user.name = 'new_name'
end
@@ -5057,26 +5072,26 @@ RSpec.describe User do
subject { user.required_terms_not_accepted? }
- context "when terms are not enforced" do
+ context 'when terms are not enforced' do
it { is_expected.to be_falsey }
end
- context "when terms are enforced" do
+ context 'when terms are enforced' do
before do
enforce_terms
end
- it "is not accepted by the user" do
+ it 'is not accepted by the user' do
expect(subject).to be_truthy
end
- it "is accepted by the user" do
+ it 'is accepted by the user' do
accept_terms(user)
expect(subject).to be_falsey
end
- it "auto accepts the term for project bots" do
+ it 'auto accepts the term for project bots' do
expect(project_bot.required_terms_not_accepted?).to be_falsey
end
end
@@ -6165,4 +6180,14 @@ RSpec.describe User do
it_behaves_like 'groups_with_developer_maintainer_project_access examples'
end
end
+
+ describe '.get_ids_by_username' do
+ let(:user_name) { 'user_name' }
+ let!(:user) { create(:user, username: user_name) }
+ let(:user_id) { user.id }
+
+ it 'returns the id of each record matching username' do
+ expect(described_class.get_ids_by_username([user_name])).to match_array([user_id])
+ end
+ end
end
diff --git a/spec/models/users/credit_card_validation_spec.rb b/spec/models/users/credit_card_validation_spec.rb
index fb9f6e35038..d2b4f5ebd65 100644
--- a/spec/models/users/credit_card_validation_spec.rb
+++ b/spec/models/users/credit_card_validation_spec.rb
@@ -4,4 +4,22 @@ require 'spec_helper'
RSpec.describe Users::CreditCardValidation do
it { is_expected.to belong_to(:user) }
+
+ it { is_expected.to validate_length_of(:holder_name).is_at_most(26) }
+ it { is_expected.to validate_numericality_of(:last_digits).is_less_than_or_equal_to(9999) }
+
+ describe '.similar_records' do
+ let(:card_details) { subject.attributes.slice(:expiration_date, :last_digits, :holder_name) }
+
+ subject(:credit_card_validation) { create(:credit_card_validation) }
+
+ let!(:match1) { create(:credit_card_validation, card_details) }
+ let!(:other1) { create(:credit_card_validation, card_details.merge(last_digits: 9)) }
+ let!(:match2) { create(:credit_card_validation, card_details) }
+ let!(:other2) { create(:credit_card_validation, card_details.merge(holder_name: 'foo bar')) }
+
+ it 'returns records with matching credit card, ordered by credit_card_validated_at' do
+ expect(subject.similar_records).to eq([match2, match1, subject])
+ end
+ end
end
diff --git a/spec/policies/clusters/agent_policy_spec.rb b/spec/policies/clusters/agent_policy_spec.rb
new file mode 100644
index 00000000000..307d751b78b
--- /dev/null
+++ b/spec/policies/clusters/agent_policy_spec.rb
@@ -0,0 +1,28 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Clusters::AgentPolicy do
+ let(:cluster_agent) { create(:cluster_agent, name: 'agent' )}
+ let(:user) { create(:admin) }
+ let(:policy) { described_class.new(user, cluster_agent) }
+ let(:project) { cluster_agent.project }
+
+ describe 'rules' do
+ context 'when developer' do
+ before do
+ project.add_developer(user)
+ end
+
+ it { expect(policy).to be_disallowed :admin_cluster }
+ end
+
+ context 'when maintainer' do
+ before do
+ project.add_maintainer(user)
+ end
+
+ it { expect(policy).to be_allowed :admin_cluster }
+ end
+ end
+end
diff --git a/spec/policies/clusters/agent_token_policy_spec.rb b/spec/policies/clusters/agent_token_policy_spec.rb
new file mode 100644
index 00000000000..9ae99e66f59
--- /dev/null
+++ b/spec/policies/clusters/agent_token_policy_spec.rb
@@ -0,0 +1,31 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Clusters::AgentTokenPolicy do
+ let_it_be(:token) { create(:cluster_agent_token) }
+
+ let(:user) { create(:user) }
+ let(:policy) { described_class.new(user, token) }
+ let(:project) { token.agent.project }
+
+ describe 'rules' do
+ context 'when developer' do
+ before do
+ project.add_developer(user)
+ end
+
+ it { expect(policy).to be_disallowed :admin_cluster }
+ it { expect(policy).to be_disallowed :read_cluster }
+ end
+
+ context 'when maintainer' do
+ before do
+ project.add_maintainer(user)
+ end
+
+ it { expect(policy).to be_allowed :admin_cluster }
+ it { expect(policy).to be_allowed :read_cluster }
+ end
+ end
+end
diff --git a/spec/policies/group_policy_spec.rb b/spec/policies/group_policy_spec.rb
index 482e12c029d..201ccf0fc14 100644
--- a/spec/policies/group_policy_spec.rb
+++ b/spec/policies/group_policy_spec.rb
@@ -1005,7 +1005,7 @@ RSpec.describe GroupPolicy do
context 'with maintainer' do
let(:current_user) { maintainer }
- it { is_expected.to be_allowed(:update_runners_registration_token) }
+ it { is_expected.to be_disallowed(:update_runners_registration_token) }
end
context 'with reporter' do
diff --git a/spec/policies/namespace_policy_spec.rb b/spec/policies/namespace_policy_spec.rb
deleted file mode 100644
index b9823273de8..00000000000
--- a/spec/policies/namespace_policy_spec.rb
+++ /dev/null
@@ -1,77 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe NamespacePolicy do
- let(:user) { create(:user) }
- let(:owner) { create(:user) }
- let(:admin) { create(:admin) }
- let(:namespace) { create(:namespace, owner: owner) }
-
- let(:owner_permissions) { [:owner_access, :create_projects, :admin_namespace, :read_namespace, :read_statistics, :transfer_projects, :create_package_settings, :read_package_settings] }
-
- subject { described_class.new(current_user, namespace) }
-
- context 'with no user' do
- let(:current_user) { nil }
-
- it { is_expected.to be_banned }
- end
-
- context 'regular user' do
- let(:current_user) { user }
-
- it { is_expected.to be_disallowed(*owner_permissions) }
- end
-
- context 'owner' do
- let(:current_user) { owner }
-
- it { is_expected.to be_allowed(*owner_permissions) }
-
- context 'user who has exceeded project limit' do
- let(:owner) { create(:user, projects_limit: 0) }
-
- it { is_expected.to be_disallowed(:create_projects) }
- it { is_expected.to be_disallowed(:transfer_projects) }
- end
- end
-
- context 'admin' do
- let(:current_user) { admin }
-
- context 'when admin mode is enabled', :enable_admin_mode do
- it { is_expected.to be_allowed(*owner_permissions) }
- end
-
- context 'when admin mode is disabled' do
- it { is_expected.to be_disallowed(*owner_permissions) }
- end
- end
-
- describe 'create_jira_connect_subscription' do
- context 'admin' do
- let(:current_user) { build_stubbed(:admin) }
-
- context 'when admin mode enabled', :enable_admin_mode do
- it { is_expected.to be_allowed(:create_jira_connect_subscription) }
- end
-
- context 'when admin mode disabled' do
- it { is_expected.to be_disallowed(:create_jira_connect_subscription) }
- end
- end
-
- context 'owner' do
- let(:current_user) { owner }
-
- it { is_expected.to be_allowed(:create_jira_connect_subscription) }
- end
-
- context 'other user' do
- let(:current_user) { build_stubbed(:user) }
-
- it { is_expected.to be_disallowed(:create_jira_connect_subscription) }
- end
- end
-end
diff --git a/spec/policies/namespaces/project_namespace_policy_spec.rb b/spec/policies/namespaces/project_namespace_policy_spec.rb
new file mode 100644
index 00000000000..22f3ccec1f8
--- /dev/null
+++ b/spec/policies/namespaces/project_namespace_policy_spec.rb
@@ -0,0 +1,46 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe NamespacePolicy do
+ let_it_be(:parent) { create(:namespace) }
+ let_it_be(:namespace) { create(:project_namespace, parent: parent) }
+
+ let(:permissions) do
+ [:owner_access, :create_projects, :admin_namespace, :read_namespace,
+ :read_statistics, :transfer_projects, :create_package_settings,
+ :read_package_settings, :create_jira_connect_subscription]
+ end
+
+ subject { described_class.new(current_user, namespace) }
+
+ context 'with no user' do
+ let_it_be(:current_user) { nil }
+
+ it { is_expected.to be_disallowed(*permissions) }
+ end
+
+ context 'regular user' do
+ let_it_be(:current_user) { create(:user) }
+
+ it { is_expected.to be_disallowed(*permissions) }
+ end
+
+ context 'parent owner' do
+ let_it_be(:current_user) { parent.owner }
+
+ it { is_expected.to be_disallowed(*permissions) }
+ end
+
+ context 'admin' do
+ let_it_be(:current_user) { create(:admin) }
+
+ context 'when admin mode is enabled', :enable_admin_mode do
+ it { is_expected.to be_allowed(*permissions) }
+ end
+
+ context 'when admin mode is disabled' do
+ it { is_expected.to be_disallowed(*permissions) }
+ end
+ end
+end
diff --git a/spec/policies/namespaces/user_namespace_policy_spec.rb b/spec/policies/namespaces/user_namespace_policy_spec.rb
new file mode 100644
index 00000000000..02eda31bfa7
--- /dev/null
+++ b/spec/policies/namespaces/user_namespace_policy_spec.rb
@@ -0,0 +1,77 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Namespaces::UserNamespacePolicy do
+ let(:user) { create(:user) }
+ let(:owner) { create(:user) }
+ let(:admin) { create(:admin) }
+ let(:namespace) { create(:namespace, owner: owner) }
+
+ let(:owner_permissions) { [:owner_access, :create_projects, :admin_namespace, :read_namespace, :read_statistics, :transfer_projects, :create_package_settings, :read_package_settings] }
+
+ subject { described_class.new(current_user, namespace) }
+
+ context 'with no user' do
+ let(:current_user) { nil }
+
+ it { is_expected.to be_banned }
+ end
+
+ context 'regular user' do
+ let(:current_user) { user }
+
+ it { is_expected.to be_disallowed(*owner_permissions) }
+ end
+
+ context 'owner' do
+ let(:current_user) { owner }
+
+ it { is_expected.to be_allowed(*owner_permissions) }
+
+ context 'user who has exceeded project limit' do
+ let(:owner) { create(:user, projects_limit: 0) }
+
+ it { is_expected.to be_disallowed(:create_projects) }
+ it { is_expected.to be_disallowed(:transfer_projects) }
+ end
+ end
+
+ context 'admin' do
+ let(:current_user) { admin }
+
+ context 'when admin mode is enabled', :enable_admin_mode do
+ it { is_expected.to be_allowed(*owner_permissions) }
+ end
+
+ context 'when admin mode is disabled' do
+ it { is_expected.to be_disallowed(*owner_permissions) }
+ end
+ end
+
+ describe 'create_jira_connect_subscription' do
+ context 'admin' do
+ let(:current_user) { build_stubbed(:admin) }
+
+ context 'when admin mode enabled', :enable_admin_mode do
+ it { is_expected.to be_allowed(:create_jira_connect_subscription) }
+ end
+
+ context 'when admin mode disabled' do
+ it { is_expected.to be_disallowed(:create_jira_connect_subscription) }
+ end
+ end
+
+ context 'owner' do
+ let(:current_user) { owner }
+
+ it { is_expected.to be_allowed(:create_jira_connect_subscription) }
+ end
+
+ context 'other user' do
+ let(:current_user) { build_stubbed(:user) }
+
+ it { is_expected.to be_disallowed(:create_jira_connect_subscription) }
+ end
+ end
+end
diff --git a/spec/presenters/clusters/cluster_presenter_spec.rb b/spec/presenters/clusters/cluster_presenter_spec.rb
index c8da8a54f16..49126ed8e5f 100644
--- a/spec/presenters/clusters/cluster_presenter_spec.rb
+++ b/spec/presenters/clusters/cluster_presenter_spec.rb
@@ -30,129 +30,6 @@ RSpec.describe Clusters::ClusterPresenter do
end
end
- describe '#item_link' do
- let(:clusterable_presenter) { double('ClusterablePresenter', subject: clusterable) }
-
- subject { presenter.item_link(clusterable_presenter) }
-
- context 'for a group cluster' do
- let(:cluster) { create(:cluster, cluster_type: :group_type, groups: [group]) }
- let(:group) { create(:group, name: 'Foo') }
- let(:cluster_link) { "<a href=\"#{group_cluster_path(cluster.group, cluster)}\">#{cluster.name}</a>" }
-
- before do
- group.add_maintainer(user)
- end
-
- shared_examples 'ancestor clusters' do
- context 'ancestor clusters' do
- let(:root_group) { create(:group, name: 'Root Group') }
- let(:parent) { create(:group, name: 'parent', parent: root_group) }
- let(:child) { create(:group, name: 'child', parent: parent) }
- let(:group) { create(:group, name: 'group', parent: child) }
-
- before do
- root_group.add_maintainer(user)
- end
-
- context 'top level group cluster' do
- let(:cluster) { create(:cluster, cluster_type: :group_type, groups: [root_group]) }
-
- it 'returns full group names and link for cluster' do
- expect(subject).to eq("Root Group / #{cluster_link}")
- end
-
- it 'is html safe' do
- expect(presenter).to receive(:sanitize).with('Root Group').and_call_original
-
- expect(subject).to be_html_safe
- end
- end
-
- context 'first level group cluster' do
- let(:cluster) { create(:cluster, cluster_type: :group_type, groups: [parent]) }
-
- it 'returns full group names and link for cluster' do
- expect(subject).to eq("Root Group / parent / #{cluster_link}")
- end
-
- it 'is html safe' do
- expect(presenter).to receive(:sanitize).with('Root Group / parent').and_call_original
-
- expect(subject).to be_html_safe
- end
- end
-
- context 'second level group cluster' do
- let(:cluster) { create(:cluster, cluster_type: :group_type, groups: [child]) }
-
- let(:ellipsis_h) do
- /.*ellipsis_h.*/
- end
-
- it 'returns clipped group names and link for cluster' do
- expect(subject).to match("Root Group / #{ellipsis_h} / child / #{cluster_link}")
- end
-
- it 'is html safe' do
- expect(presenter).to receive(:sanitize).with('Root Group / parent / child').and_call_original
-
- expect(subject).to be_html_safe
- end
- end
- end
- end
-
- context 'for a project clusterable' do
- let(:clusterable) { project }
- let(:project) { create(:project, group: group) }
-
- it 'returns the group name and the link for cluster' do
- expect(subject).to eq("Foo / #{cluster_link}")
- end
-
- it 'is html safe' do
- expect(presenter).to receive(:sanitize).with('Foo').and_call_original
-
- expect(subject).to be_html_safe
- end
-
- include_examples 'ancestor clusters'
- end
-
- context 'for the group clusterable for the cluster' do
- let(:clusterable) { group }
-
- it 'returns link for cluster' do
- expect(subject).to eq(cluster_link)
- end
-
- include_examples 'ancestor clusters'
-
- it 'is html safe' do
- expect(subject).to be_html_safe
- end
- end
- end
-
- context 'for a project cluster' do
- let(:cluster) { create(:cluster, :project) }
- let(:cluster_link) { "<a href=\"#{project_cluster_path(cluster.project, cluster)}\">#{cluster.name}</a>" }
-
- before do
- cluster.project.add_maintainer(user)
- end
-
- context 'for the project clusterable' do
- let(:clusterable) { cluster.project }
-
- it 'returns link for cluster' do
- expect(subject).to eq(cluster_link)
- end
- end
- end
- end
-
describe '#provider_label' do
let(:cluster) { create(:cluster, provider_type: provider_type) }
@@ -191,26 +68,6 @@ RSpec.describe Clusters::ClusterPresenter do
end
end
- describe '#cluster_type_description' do
- subject { described_class.new(cluster).cluster_type_description }
-
- context 'project_type cluster' do
- it { is_expected.to eq('Project cluster') }
- end
-
- context 'group_type cluster' do
- let(:cluster) { create(:cluster, :provided_by_gcp, :group) }
-
- it { is_expected.to eq('Group cluster') }
- end
-
- context 'instance_type cluster' do
- let(:cluster) { create(:cluster, :provided_by_gcp, :instance) }
-
- it { is_expected.to eq('Instance cluster') }
- end
- end
-
describe '#show_path' do
subject { described_class.new(cluster).show_path }
diff --git a/spec/presenters/commit_status_presenter_spec.rb b/spec/presenters/commit_status_presenter_spec.rb
index 4b2441d656e..f0bf1b860e4 100644
--- a/spec/presenters/commit_status_presenter_spec.rb
+++ b/spec/presenters/commit_status_presenter_spec.rb
@@ -15,6 +15,25 @@ RSpec.describe CommitStatusPresenter do
expect(described_class.superclass).to eq(Gitlab::View::Presenter::Delegated)
end
+ describe '#callout_failure_message' do
+ subject { presenter.callout_failure_message }
+
+ context 'when troubleshooting doc is available' do
+ let(:failure_reason) { :environment_creation_failure }
+
+ before do
+ build.failure_reason = failure_reason
+ end
+
+ it 'appends the troubleshooting link' do
+ doc = described_class::TROUBLESHOOTING_DOC[failure_reason]
+
+ expect(subject).to eq("#{described_class.callout_failure_messages[failure_reason]} " \
+ "<a href=\"#{presenter.help_page_path(doc[:path], anchor: doc[:anchor])}\">How do I fix it?</a>")
+ end
+ end
+ end
+
describe 'covers all failure reasons' do
let(:message) { presenter.callout_failure_message }
diff --git a/spec/presenters/group_clusterable_presenter_spec.rb b/spec/presenters/group_clusterable_presenter_spec.rb
index 84b97ba0bb7..b2dff2e3546 100644
--- a/spec/presenters/group_clusterable_presenter_spec.rb
+++ b/spec/presenters/group_clusterable_presenter_spec.rb
@@ -84,4 +84,10 @@ RSpec.describe GroupClusterablePresenter do
it { is_expected.to eq(metrics_dashboard_group_cluster_path(group, cluster)) }
end
+
+ describe '#learn_more_link' do
+ subject { presenter.learn_more_link }
+
+ it { is_expected.to include('user/group/clusters/index') }
+ end
end
diff --git a/spec/presenters/instance_clusterable_presenter_spec.rb b/spec/presenters/instance_clusterable_presenter_spec.rb
index 6968e3a4da3..0ace57bbf4d 100644
--- a/spec/presenters/instance_clusterable_presenter_spec.rb
+++ b/spec/presenters/instance_clusterable_presenter_spec.rb
@@ -32,4 +32,10 @@ RSpec.describe InstanceClusterablePresenter do
it { is_expected.to eq(metrics_dashboard_admin_cluster_path(cluster)) }
end
+
+ describe '#learn_more_link' do
+ subject { presenter.learn_more_link }
+
+ it { is_expected.to include('user/instance/clusters/index') }
+ end
end
diff --git a/spec/presenters/project_clusterable_presenter_spec.rb b/spec/presenters/project_clusterable_presenter_spec.rb
index 9057b518647..90b6671edd3 100644
--- a/spec/presenters/project_clusterable_presenter_spec.rb
+++ b/spec/presenters/project_clusterable_presenter_spec.rb
@@ -84,4 +84,10 @@ RSpec.describe ProjectClusterablePresenter do
it { is_expected.to eq(metrics_dashboard_project_cluster_path(project, cluster)) }
end
+
+ describe '#learn_more_link' do
+ subject { presenter.learn_more_link }
+
+ it { is_expected.to include('user/project/clusters/index') }
+ end
end
diff --git a/spec/requests/api/api_spec.rb b/spec/requests/api/api_spec.rb
index 81620fce448..95eb503c6bc 100644
--- a/spec/requests/api/api_spec.rb
+++ b/spec/requests/api/api_spec.rb
@@ -100,39 +100,105 @@ RSpec.describe API::API do
end
end
- context 'application context' do
- let_it_be(:project) { create(:project) }
+ describe 'logging', :aggregate_failures do
+ let_it_be(:project) { create(:project, :public) }
let_it_be(:user) { project.owner }
- it 'logs all application context fields' do
- allow_any_instance_of(Gitlab::GrapeLogging::Loggers::ContextLogger).to receive(:parameters) do
- Gitlab::ApplicationContext.current.tap do |log_context|
- expect(log_context).to match('correlation_id' => an_instance_of(String),
- 'meta.caller_id' => 'GET /api/:version/projects/:id/issues',
- 'meta.remote_ip' => an_instance_of(String),
- 'meta.project' => project.full_path,
- 'meta.root_namespace' => project.namespace.full_path,
- 'meta.user' => user.username,
- 'meta.client_id' => an_instance_of(String),
- 'meta.feature_category' => 'issue_tracking')
+ context 'when the endpoint is handled by the application' do
+ context 'when the endpoint supports all possible fields' do
+ it 'logs all application context fields and the route' do
+ expect(described_class::LOG_FORMATTER).to receive(:call) do |_severity, _datetime, _, data|
+ expect(data.stringify_keys)
+ .to include('correlation_id' => an_instance_of(String),
+ 'meta.caller_id' => 'GET /api/:version/projects/:id/issues',
+ 'meta.remote_ip' => an_instance_of(String),
+ 'meta.project' => project.full_path,
+ 'meta.root_namespace' => project.namespace.full_path,
+ 'meta.user' => user.username,
+ 'meta.client_id' => a_string_matching(%r{\Auser/.+}),
+ 'meta.feature_category' => 'issue_tracking',
+ 'route' => '/api/:version/projects/:id/issues')
+ end
+
+ get(api("/projects/#{project.id}/issues", user))
+
+ expect(response).to have_gitlab_http_status(:ok)
end
end
- get(api("/projects/#{project.id}/issues", user))
+ it 'skips context fields that do not apply' do
+ expect(described_class::LOG_FORMATTER).to receive(:call) do |_severity, _datetime, _, data|
+ expect(data.stringify_keys)
+ .to include('correlation_id' => an_instance_of(String),
+ 'meta.caller_id' => 'GET /api/:version/broadcast_messages',
+ 'meta.remote_ip' => an_instance_of(String),
+ 'meta.client_id' => a_string_matching(%r{\Aip/.+}),
+ 'meta.feature_category' => 'navigation',
+ 'route' => '/api/:version/broadcast_messages')
+
+ expect(data.stringify_keys).not_to include('meta.project', 'meta.root_namespace', 'meta.user')
+ end
+
+ get(api('/broadcast_messages'))
+
+ expect(response).to have_gitlab_http_status(:ok)
+ end
+ end
+
+ context 'when there is an unsupported media type' do
+ it 'logs the route and context metadata for the client' do
+ expect(described_class::LOG_FORMATTER).to receive(:call) do |_severity, _datetime, _, data|
+ expect(data.stringify_keys)
+ .to include('correlation_id' => an_instance_of(String),
+ 'meta.remote_ip' => an_instance_of(String),
+ 'meta.client_id' => a_string_matching(%r{\Aip/.+}),
+ 'route' => '/api/:version/users/:id')
+
+ expect(data.stringify_keys).not_to include('meta.caller_id', 'meta.feature_category', 'meta.user')
+ end
+
+ put(api("/users/#{user.id}", user), params: { 'name' => 'Test' }, headers: { 'Content-Type' => 'image/png' })
+
+ expect(response).to have_gitlab_http_status(:unsupported_media_type)
+ end
end
- it 'skips fields that do not apply' do
- allow_any_instance_of(Gitlab::GrapeLogging::Loggers::ContextLogger).to receive(:parameters) do
- Gitlab::ApplicationContext.current.tap do |log_context|
- expect(log_context).to match('correlation_id' => an_instance_of(String),
- 'meta.caller_id' => 'GET /api/:version/users',
- 'meta.remote_ip' => an_instance_of(String),
- 'meta.client_id' => an_instance_of(String),
- 'meta.feature_category' => 'users')
+ context 'when there is an OPTIONS request' do
+ it 'logs the route and context metadata for the client' do
+ expect(described_class::LOG_FORMATTER).to receive(:call) do |_severity, _datetime, _, data|
+ expect(data.stringify_keys)
+ .to include('correlation_id' => an_instance_of(String),
+ 'meta.remote_ip' => an_instance_of(String),
+ 'meta.client_id' => a_string_matching(%r{\Auser/.+}),
+ 'meta.user' => user.username,
+ 'meta.feature_category' => 'users',
+ 'route' => '/api/:version/users')
+
+ expect(data.stringify_keys).not_to include('meta.caller_id')
end
+
+ options(api('/users', user))
+
+ expect(response).to have_gitlab_http_status(:no_content)
end
+ end
- get(api('/users'))
+ context 'when the API version is not matched' do
+ it 'logs the route and context metadata for the client' do
+ expect(described_class::LOG_FORMATTER).to receive(:call) do |_severity, _datetime, _, data|
+ expect(data.stringify_keys)
+ .to include('correlation_id' => an_instance_of(String),
+ 'meta.remote_ip' => an_instance_of(String),
+ 'meta.client_id' => a_string_matching(%r{\Aip/.+}),
+ 'route' => '/api/:version/*path')
+
+ expect(data.stringify_keys).not_to include('meta.caller_id', 'meta.user')
+ end
+
+ get('/api/v4_or_is_it')
+
+ expect(response).to have_gitlab_http_status(:not_found)
+ end
end
end
diff --git a/spec/requests/api/bulk_imports_spec.rb b/spec/requests/api/bulk_imports_spec.rb
index 1a28687c830..1602819a02e 100644
--- a/spec/requests/api/bulk_imports_spec.rb
+++ b/spec/requests/api/bulk_imports_spec.rb
@@ -21,6 +21,15 @@ RSpec.describe API::BulkImports do
end
describe 'POST /bulk_imports' do
+ before do
+ allow_next_instance_of(BulkImports::Clients::HTTP) do |instance|
+ allow(instance)
+ .to receive(:instance_version)
+ .and_return(
+ Gitlab::VersionInfo.new(::BulkImport::MIN_MAJOR_VERSION, ::BulkImport::MIN_MINOR_VERSION_FOR_PROJECT))
+ end
+ end
+
it 'starts a new migration' do
post api('/bulk_imports', user), params: {
configuration: {
diff --git a/spec/requests/api/ci/resource_groups_spec.rb b/spec/requests/api/ci/resource_groups_spec.rb
new file mode 100644
index 00000000000..f5b68557a0d
--- /dev/null
+++ b/spec/requests/api/ci/resource_groups_spec.rb
@@ -0,0 +1,95 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe API::Ci::ResourceGroups do
+ let_it_be(:project) { create(:project) }
+ let_it_be(:developer) { create(:user).tap { |u| project.add_developer(u) } }
+ let_it_be(:reporter) { create(:user).tap { |u| project.add_reporter(u) } }
+
+ let(:user) { developer }
+
+ describe 'GET /projects/:id/resource_groups/:key' do
+ subject { get api("/projects/#{project.id}/resource_groups/#{key}", user) }
+
+ let!(:resource_group) { create(:ci_resource_group, project: project) }
+ let(:key) { resource_group.key }
+
+ it 'returns a resource group', :aggregate_failures do
+ subject
+
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(json_response['id']).to eq(resource_group.id)
+ expect(json_response['key']).to eq(resource_group.key)
+ expect(json_response['process_mode']).to eq(resource_group.process_mode)
+ expect(Time.parse(json_response['created_at'])).to be_like_time(resource_group.created_at)
+ expect(Time.parse(json_response['updated_at'])).to be_like_time(resource_group.updated_at)
+ end
+
+ context 'when user is reporter' do
+ let(:user) { reporter }
+
+ it 'returns forbidden' do
+ subject
+
+ expect(response).to have_gitlab_http_status(:forbidden)
+ end
+ end
+
+ context 'when there is no corresponding resource group' do
+ let(:key) { 'unknown' }
+
+ it 'returns not found' do
+ subject
+
+ expect(response).to have_gitlab_http_status(:not_found)
+ end
+ end
+ end
+
+ describe 'PUT /projects/:id/resource_groups/:key' do
+ subject { put api("/projects/#{project.id}/resource_groups/#{key}", user), params: params }
+
+ let!(:resource_group) { create(:ci_resource_group, project: project) }
+ let(:key) { resource_group.key }
+ let(:params) { { process_mode: :oldest_first } }
+
+ it 'changes the process mode of a resource group' do
+ expect { subject }
+ .to change { resource_group.reload.process_mode }.from('unordered').to('oldest_first')
+
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(json_response['process_mode']).to eq('oldest_first')
+ end
+
+ context 'with invalid parameter' do
+ let(:params) { { process_mode: :unknown } }
+
+ it 'returns bad request' do
+ subject
+
+ expect(response).to have_gitlab_http_status(:bad_request)
+ end
+ end
+
+ context 'when user is reporter' do
+ let(:user) { reporter }
+
+ it 'returns forbidden' do
+ subject
+
+ expect(response).to have_gitlab_http_status(:forbidden)
+ end
+ end
+
+ context 'when there is no corresponding resource group' do
+ let(:key) { 'unknown' }
+
+ it 'returns not found' do
+ subject
+
+ expect(response).to have_gitlab_http_status(:not_found)
+ end
+ end
+ end
+end
diff --git a/spec/requests/api/ci/runner/jobs_request_post_spec.rb b/spec/requests/api/ci/runner/jobs_request_post_spec.rb
index adac81ff6f4..c3fbef9be48 100644
--- a/spec/requests/api/ci/runner/jobs_request_post_spec.rb
+++ b/spec/requests/api/ci/runner/jobs_request_post_spec.rb
@@ -816,7 +816,7 @@ RSpec.describe API::Ci::Runner, :clean_gitlab_redis_shared_state do
subject { request_job(id: job.id) }
- it_behaves_like 'storing arguments in the application context' do
+ it_behaves_like 'storing arguments in the application context for the API' do
let(:expected_params) { { user: user.username, project: project.full_path, client_id: "user/#{user.id}" } }
end
@@ -827,7 +827,7 @@ RSpec.describe API::Ci::Runner, :clean_gitlab_redis_shared_state do
end
context 'when the runner is of project type' do
- it_behaves_like 'storing arguments in the application context' do
+ it_behaves_like 'storing arguments in the application context for the API' do
let(:expected_params) { { project: project.full_path, client_id: "runner/#{runner.id}" } }
end
@@ -841,7 +841,7 @@ RSpec.describe API::Ci::Runner, :clean_gitlab_redis_shared_state do
let(:group) { create(:group) }
let(:runner) { create(:ci_runner, :group, groups: [group]) }
- it_behaves_like 'storing arguments in the application context' do
+ it_behaves_like 'storing arguments in the application context for the API' do
let(:expected_params) { { root_namespace: group.full_path_components.first, client_id: "runner/#{runner.id}" } }
end
diff --git a/spec/requests/api/ci/runner/runners_delete_spec.rb b/spec/requests/api/ci/runner/runners_delete_spec.rb
index 6c6c465f161..9d1bae7cce8 100644
--- a/spec/requests/api/ci/runner/runners_delete_spec.rb
+++ b/spec/requests/api/ci/runner/runners_delete_spec.rb
@@ -51,7 +51,7 @@ RSpec.describe API::Ci::Runner, :clean_gitlab_redis_shared_state do
let(:params) { { token: runner.token } }
end
- it_behaves_like 'storing arguments in the application context' do
+ it_behaves_like 'storing arguments in the application context for the API' do
let(:expected_params) { { client_id: "runner/#{runner.id}" } }
end
end
diff --git a/spec/requests/api/ci/runner/runners_post_spec.rb b/spec/requests/api/ci/runner/runners_post_spec.rb
index 17b988a60c5..b3a7d591c93 100644
--- a/spec/requests/api/ci/runner/runners_post_spec.rb
+++ b/spec/requests/api/ci/runner/runners_post_spec.rb
@@ -58,7 +58,7 @@ RSpec.describe API::Ci::Runner, :clean_gitlab_redis_shared_state do
expect(runner).to be_instance_type
end
- it_behaves_like 'storing arguments in the application context' do
+ it_behaves_like 'storing arguments in the application context for the API' do
subject { request }
let(:expected_params) { { client_id: "runner/#{::Ci::Runner.first.id}" } }
@@ -84,7 +84,7 @@ RSpec.describe API::Ci::Runner, :clean_gitlab_redis_shared_state do
expect(runner).to be_project_type
end
- it_behaves_like 'storing arguments in the application context' do
+ it_behaves_like 'storing arguments in the application context for the API' do
subject { request }
let(:expected_params) { { project: project.full_path, client_id: "runner/#{::Ci::Runner.first.id}" } }
@@ -190,7 +190,7 @@ RSpec.describe API::Ci::Runner, :clean_gitlab_redis_shared_state do
expect(runner).to be_group_type
end
- it_behaves_like 'storing arguments in the application context' do
+ it_behaves_like 'storing arguments in the application context for the API' do
subject { request }
let(:expected_params) { { root_namespace: group.full_path_components.first, client_id: "runner/#{::Ci::Runner.first.id}" } }
diff --git a/spec/requests/api/ci/runner/runners_verify_post_spec.rb b/spec/requests/api/ci/runner/runners_verify_post_spec.rb
index c2e97446738..4680076acae 100644
--- a/spec/requests/api/ci/runner/runners_verify_post_spec.rb
+++ b/spec/requests/api/ci/runner/runners_verify_post_spec.rb
@@ -45,7 +45,7 @@ RSpec.describe API::Ci::Runner, :clean_gitlab_redis_shared_state do
expect(response).to have_gitlab_http_status(:ok)
end
- it_behaves_like 'storing arguments in the application context' do
+ it_behaves_like 'storing arguments in the application context for the API' do
let(:expected_params) { { client_id: "runner/#{runner.id}" } }
end
end
diff --git a/spec/requests/api/ci/runners_reset_registration_token_spec.rb b/spec/requests/api/ci/runners_reset_registration_token_spec.rb
index 7623d3f1b17..df64c0bd22b 100644
--- a/spec/requests/api/ci/runners_reset_registration_token_spec.rb
+++ b/spec/requests/api/ci/runners_reset_registration_token_spec.rb
@@ -118,7 +118,7 @@ RSpec.describe API::Ci::Runners do
end
include_context 'when authorized', 'group' do
- let_it_be(:user) { create_default(:group_member, :maintainer, user: create(:user), group: group ).user }
+ let_it_be(:user) { create_default(:group_member, :owner, user: create(:user), group: group ).user }
def get_token
group.reload.runners_token
diff --git a/spec/requests/api/ci/runners_spec.rb b/spec/requests/api/ci/runners_spec.rb
index 902938d7d02..6879dfc9572 100644
--- a/spec/requests/api/ci/runners_spec.rb
+++ b/spec/requests/api/ci/runners_spec.rb
@@ -291,6 +291,16 @@ RSpec.describe API::Ci::Runners do
end
end
+ context 'when the runner is a group runner' do
+ it "returns the runner's details" do
+ get api("/runners/#{group_runner_a.id}", admin)
+
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(json_response['description']).to eq(group_runner_a.description)
+ expect(json_response['groups'].first['id']).to eq(group.id)
+ end
+ end
+
context "runner project's administrative user" do
context 'when runner is not shared' do
it "returns runner's details" do
@@ -600,6 +610,94 @@ RSpec.describe API::Ci::Runners do
end
end
+ describe 'POST /runners/:id/reset_authentication_token' do
+ context 'admin user' do
+ it 'resets shared runner authentication token' do
+ expect do
+ post api("/runners/#{shared_runner.id}/reset_authentication_token", admin)
+
+ expect(response).to have_gitlab_http_status(:success)
+ expect(json_response).to eq({ 'token' => shared_runner.reload.token })
+ end.to change { shared_runner.reload.token }
+ end
+
+ it 'returns 404 if runner does not exist' do
+ post api('/runners/0/reset_authentication_token', admin)
+
+ expect(response).to have_gitlab_http_status(:not_found)
+ end
+ end
+
+ context 'authorized user' do
+ it 'does not reset project runner authentication token without access to it' do
+ expect do
+ post api("/runners/#{project_runner.id}/reset_authentication_token", user2)
+ expect(response).to have_gitlab_http_status(:forbidden)
+ end.not_to change { project_runner.reload.token }
+ end
+
+ it 'resets project runner authentication token for owned project' do
+ expect do
+ post api("/runners/#{project_runner.id}/reset_authentication_token", user)
+
+ expect(response).to have_gitlab_http_status(:success)
+ expect(json_response).to eq({ 'token' => project_runner.reload.token })
+ end.to change { project_runner.reload.token }
+ end
+
+ it 'does not reset group runner authentication token with guest access' do
+ expect do
+ post api("/runners/#{group_runner_a.id}/reset_authentication_token", group_guest)
+
+ expect(response).to have_gitlab_http_status(:forbidden)
+ end.not_to change { group_runner_a.reload.token }
+ end
+
+ it 'does not reset group runner authentication token with reporter access' do
+ expect do
+ post api("/runners/#{group_runner_a.id}/reset_authentication_token", group_reporter)
+
+ expect(response).to have_gitlab_http_status(:forbidden)
+ end.not_to change { group_runner_a.reload.token }
+ end
+
+ it 'does not reset group runner authentication token with developer access' do
+ expect do
+ post api("/runners/#{group_runner_a.id}/reset_authentication_token", group_developer)
+
+ expect(response).to have_gitlab_http_status(:forbidden)
+ end.not_to change { group_runner_a.reload.token }
+ end
+
+ it 'does not reset group runner authentication token with maintainer access' do
+ expect do
+ post api("/runners/#{group_runner_a.id}/reset_authentication_token", group_maintainer)
+
+ expect(response).to have_gitlab_http_status(:forbidden)
+ end.not_to change { group_runner_a.reload.token }
+ end
+
+ it 'resets group runner authentication token with owner access' do
+ expect do
+ post api("/runners/#{group_runner_a.id}/reset_authentication_token", user)
+
+ expect(response).to have_gitlab_http_status(:success)
+ expect(json_response).to eq({ 'token' => group_runner_a.reload.token })
+ end.to change { group_runner_a.reload.token }
+ end
+ end
+
+ context 'unauthorized user' do
+ it 'does not reset authentication token' do
+ expect do
+ post api("/runners/#{shared_runner.id}/reset_authentication_token")
+
+ expect(response).to have_gitlab_http_status(:unauthorized)
+ end.not_to change { shared_runner.reload.token }
+ end
+ end
+ end
+
describe 'GET /runners/:id/jobs' do
let_it_be(:job_1) { create(:ci_build) }
let_it_be(:job_2) { create(:ci_build, :running, runner: shared_runner, project: project) }
diff --git a/spec/requests/api/ci/triggers_spec.rb b/spec/requests/api/ci/triggers_spec.rb
index 410e2ae405e..d270a16d28d 100644
--- a/spec/requests/api/ci/triggers_spec.rb
+++ b/spec/requests/api/ci/triggers_spec.rb
@@ -131,7 +131,7 @@ RSpec.describe API::Ci::Triggers do
let(:subject_proc) { proc { post api("/projects/#{project.id}/ref/master/trigger/pipeline?token=#{trigger_token}"), params: { ref: 'refs/heads/other-branch' } } }
context 'when triggering a pipeline from a trigger token' do
- it_behaves_like 'storing arguments in the application context'
+ it_behaves_like 'storing arguments in the application context for the API'
it_behaves_like 'not executing any extra queries for the application context'
end
@@ -142,7 +142,7 @@ RSpec.describe API::Ci::Triggers do
context 'when other job is triggered by a user' do
let(:trigger_token) { create(:ci_build, :running, project: project, user: user).token }
- it_behaves_like 'storing arguments in the application context'
+ it_behaves_like 'storing arguments in the application context for the API'
it_behaves_like 'not executing any extra queries for the application context'
end
@@ -151,7 +151,7 @@ RSpec.describe API::Ci::Triggers do
let(:runner) { create(:ci_runner) }
let(:expected_params) { { client_id: "runner/#{runner.id}", project: project.full_path } }
- it_behaves_like 'storing arguments in the application context'
+ it_behaves_like 'storing arguments in the application context for the API'
it_behaves_like 'not executing any extra queries for the application context', 1
end
end
diff --git a/spec/requests/api/container_repositories_spec.rb b/spec/requests/api/container_repositories_spec.rb
index 8d7494ffce1..9809702467d 100644
--- a/spec/requests/api/container_repositories_spec.rb
+++ b/spec/requests/api/container_repositories_spec.rb
@@ -48,6 +48,19 @@ RSpec.describe API::ContainerRepositories do
expect(response).to match_response_schema('registry/repository')
end
+ context 'with a network error' do
+ before do
+ stub_container_registry_network_error(client_method: :repository_tags)
+ end
+
+ it 'returns a matching schema' do
+ subject
+
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(response).to match_response_schema('registry/repository')
+ end
+ end
+
context 'with tags param' do
let(:url) { "/registry/repositories/#{repository.id}?tags=true" }
@@ -61,6 +74,19 @@ RSpec.describe API::ContainerRepositories do
expect(json_response['id']).to eq(repository.id)
expect(response.body).to include('tags')
end
+
+ context 'with a network error' do
+ before do
+ stub_container_registry_network_error(client_method: :repository_tags)
+ end
+
+ it 'returns a connection error message' do
+ subject
+
+ expect(response).to have_gitlab_http_status(:service_unavailable)
+ expect(json_response['message']).to include('We are having trouble connecting to the Container Registry')
+ end
+ end
end
context 'with tags_count param' do
diff --git a/spec/requests/api/deployments_spec.rb b/spec/requests/api/deployments_spec.rb
index 38c96cd37af..69f7b54c277 100644
--- a/spec/requests/api/deployments_spec.rb
+++ b/spec/requests/api/deployments_spec.rb
@@ -376,6 +376,16 @@ RSpec.describe API::Deployments do
expect(json_response['status']).to eq('success')
end
+ it 'returns an error when an invalid status transition is detected' do
+ put(
+ api("/projects/#{project.id}/deployments/#{deploy.id}", user),
+ params: { status: 'running' }
+ )
+
+ expect(response).to have_gitlab_http_status(:bad_request)
+ expect(json_response['message']['status']).to include(%Q{cannot transition via \"run\"})
+ end
+
it 'links merge requests when the deployment status changes to success', :sidekiq_inline do
mr = create(
:merge_request,
diff --git a/spec/requests/api/environments_spec.rb b/spec/requests/api/environments_spec.rb
index bc7bb7523c9..5fb24dc91a4 100644
--- a/spec/requests/api/environments_spec.rb
+++ b/spec/requests/api/environments_spec.rb
@@ -18,6 +18,7 @@ RSpec.describe API::Environments do
get api("/projects/#{project.id}/environments", user)
expect(response).to have_gitlab_http_status(:ok)
+ expect(response).to match_response_schema('public_api/v4/environments')
expect(response).to include_pagination_headers
expect(json_response).to be_an Array
expect(json_response.size).to eq(1)
@@ -167,6 +168,7 @@ RSpec.describe API::Environments do
post api("/projects/#{project.id}/environments", user), params: { name: "mepmep" }
expect(response).to have_gitlab_http_status(:created)
+ expect(response).to match_response_schema('public_api/v4/environment')
expect(json_response['name']).to eq('mepmep')
expect(json_response['slug']).to eq('mepmep')
expect(json_response['external']).to be nil
@@ -212,6 +214,7 @@ RSpec.describe API::Environments do
params: { name: 'Mepmep', external_url: url }
expect(response).to have_gitlab_http_status(:ok)
+ expect(response).to match_response_schema('public_api/v4/environment')
expect(json_response['name']).to eq('Mepmep')
expect(json_response['external_url']).to eq(url)
end
@@ -250,7 +253,7 @@ RSpec.describe API::Environments do
expect(response).to have_gitlab_http_status(:forbidden)
end
- it 'returns a 200 for stopped environment' do
+ it 'returns a 204 for stopped environment' do
environment.stop
delete api("/projects/#{project.id}/environments/#{environment.id}", user)
@@ -294,6 +297,7 @@ RSpec.describe API::Environments do
it 'returns a 200' do
expect(response).to have_gitlab_http_status(:ok)
+ expect(response).to match_response_schema('public_api/v4/environment')
end
it 'actually stops the environment' do
@@ -327,6 +331,7 @@ RSpec.describe API::Environments do
expect(response).to have_gitlab_http_status(:ok)
expect(response).to match_response_schema('public_api/v4/environment')
+ expect(json_response['last_deployment']).to be_present
end
end
diff --git a/spec/requests/api/error_tracking/client_keys_spec.rb b/spec/requests/api/error_tracking/client_keys_spec.rb
new file mode 100644
index 00000000000..00c1e8799e6
--- /dev/null
+++ b/spec/requests/api/error_tracking/client_keys_spec.rb
@@ -0,0 +1,86 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe API::ErrorTracking::ClientKeys do
+ let_it_be(:guest) { create(:user) }
+ let_it_be(:maintainer) { create(:user) }
+ let_it_be(:setting) { create(:project_error_tracking_setting) }
+ let_it_be(:project) { setting.project }
+
+ let!(:client_key) { create(:error_tracking_client_key, project: project) }
+
+ before do
+ project.add_guest(guest)
+ project.add_maintainer(maintainer)
+ end
+
+ shared_examples 'endpoint with authorization' do
+ context 'when unauthenticated' do
+ let(:user) { nil }
+
+ it { expect(response).to have_gitlab_http_status(:unauthorized) }
+ end
+
+ context 'when authenticated as non-maintainer' do
+ let(:user) { guest }
+
+ it { expect(response).to have_gitlab_http_status(:forbidden) }
+ end
+ end
+
+ describe "GET /projects/:id/error_tracking/client_keys" do
+ before do
+ get api("/projects/#{project.id}/error_tracking/client_keys", user)
+ end
+
+ it_behaves_like 'endpoint with authorization'
+
+ context 'when authenticated as maintainer' do
+ let(:user) { maintainer }
+
+ it 'returns client keys' do
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(response).to include_pagination_headers
+ expect(json_response.size).to eq(1)
+ expect(json_response.first['id']).to eq(client_key.id)
+ end
+ end
+ end
+
+ describe "POST /projects/:id/error_tracking/client_keys" do
+ before do
+ post api("/projects/#{project.id}/error_tracking/client_keys", user)
+ end
+
+ it_behaves_like 'endpoint with authorization'
+
+ context 'when authenticated as maintainer' do
+ let(:user) { maintainer }
+
+ it 'returns a newly created client key' do
+ new_key = project.error_tracking_client_keys.last
+
+ expect(json_response['id']).to eq(new_key.id)
+ expect(json_response['public_key']).to eq(new_key.public_key)
+ expect(json_response['sentry_dsn']).to eq(new_key.sentry_dsn)
+ end
+ end
+ end
+
+ describe "DELETE /projects/:id/error_tracking/client_keys/:key_id" do
+ before do
+ delete api("/projects/#{project.id}/error_tracking/client_keys/#{client_key.id}", user)
+ end
+
+ it_behaves_like 'endpoint with authorization'
+
+ context 'when authenticated as maintainer' do
+ let(:user) { maintainer }
+
+ it 'returns a correct status' do
+ expect(response).to have_gitlab_http_status(:ok)
+ end
+ end
+ end
+end
diff --git a/spec/requests/api/error_tracking/collector_spec.rb b/spec/requests/api/error_tracking/collector_spec.rb
new file mode 100644
index 00000000000..7acadeb1287
--- /dev/null
+++ b/spec/requests/api/error_tracking/collector_spec.rb
@@ -0,0 +1,148 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe API::ErrorTracking::Collector do
+ let_it_be(:project) { create(:project, :private) }
+ let_it_be(:setting) { create(:project_error_tracking_setting, :integrated, project: project) }
+ let_it_be(:client_key) { create(:error_tracking_client_key, project: project) }
+
+ RSpec.shared_examples 'not found' do
+ it 'reponds with 404' do
+ subject
+
+ expect(response).to have_gitlab_http_status(:not_found)
+ end
+ end
+
+ RSpec.shared_examples 'bad request' do
+ it 'responds with 400' do
+ subject
+
+ expect(response).to have_gitlab_http_status(:bad_request)
+ end
+ end
+
+ RSpec.shared_examples 'successful request' do
+ it 'writes to the database and returns no content' do
+ expect { subject }.to change { ErrorTracking::ErrorEvent.count }.by(1)
+
+ expect(response).to have_gitlab_http_status(:no_content)
+ end
+ end
+
+ describe "POST /error_tracking/collector/api/:id/envelope" do
+ let_it_be(:raw_event) { fixture_file('error_tracking/event.txt') }
+ let_it_be(:url) { "/error_tracking/collector/api/#{project.id}/envelope" }
+
+ let(:params) { raw_event }
+ let(:headers) { { 'X-Sentry-Auth' => "Sentry sentry_key=#{client_key.public_key}" } }
+
+ subject { post api(url), params: params, headers: headers }
+
+ context 'error tracking feature is disabled' do
+ before do
+ setting.update!(enabled: false)
+ end
+
+ it_behaves_like 'not found'
+ end
+
+ context 'integrated error tracking is disabled' do
+ before do
+ setting.update!(integrated: false)
+ end
+
+ it_behaves_like 'not found'
+ end
+
+ context 'auth headers are missing' do
+ let(:headers) { {} }
+
+ it_behaves_like 'bad request'
+ end
+
+ context 'public key is wrong' do
+ let(:headers) { { 'X-Sentry-Auth' => "Sentry sentry_key=glet_1fedb514e17f4b958435093deb02048c" } }
+
+ it_behaves_like 'not found'
+ end
+
+ context 'public key is inactive' do
+ let(:client_key) { create(:error_tracking_client_key, :disabled, project: project) }
+
+ it_behaves_like 'not found'
+ end
+
+ context 'empty body' do
+ let(:params) { '' }
+
+ it_behaves_like 'bad request'
+ end
+
+ context 'unknown request type' do
+ let(:params) { fixture_file('error_tracking/unknown.txt') }
+
+ it_behaves_like 'bad request'
+ end
+
+ context 'transaction request type' do
+ let(:params) { fixture_file('error_tracking/transaction.txt') }
+
+ it 'does nothing and returns no content' do
+ expect { subject }.not_to change { ErrorTracking::ErrorEvent.count }
+
+ expect(response).to have_gitlab_http_status(:no_content)
+ end
+ end
+
+ it_behaves_like 'successful request'
+ end
+
+ describe "POST /error_tracking/collector/api/:id/store" do
+ let_it_be(:raw_event) { fixture_file('error_tracking/parsed_event.json') }
+ let_it_be(:url) { "/error_tracking/collector/api/#{project.id}/store" }
+
+ let(:params) { raw_event }
+ let(:headers) { { 'X-Sentry-Auth' => "Sentry sentry_key=#{client_key.public_key}" } }
+
+ subject { post api(url), params: params, headers: headers }
+
+ it_behaves_like 'successful request'
+
+ context 'empty headers' do
+ let(:headers) { {} }
+
+ it_behaves_like 'bad request'
+ end
+
+ context 'empty body' do
+ let(:params) { '' }
+
+ it_behaves_like 'bad request'
+ end
+
+ context 'sentry_key as param and empty headers' do
+ let(:url) { "/error_tracking/collector/api/#{project.id}/store?sentry_key=#{sentry_key}" }
+ let(:headers) { {} }
+
+ context 'key is wrong' do
+ let(:sentry_key) { 'glet_1fedb514e17f4b958435093deb02048c' }
+
+ it_behaves_like 'not found'
+ end
+
+ context 'key is empty' do
+ let(:sentry_key) { '' }
+
+ it_behaves_like 'bad request'
+ end
+
+ context 'key is correct' do
+ let(:sentry_key) { client_key.public_key }
+
+ it_behaves_like 'successful request'
+ end
+ end
+ end
+end
diff --git a/spec/requests/api/error_tracking/project_settings_spec.rb b/spec/requests/api/error_tracking/project_settings_spec.rb
new file mode 100644
index 00000000000..161e4f01ea5
--- /dev/null
+++ b/spec/requests/api/error_tracking/project_settings_spec.rb
@@ -0,0 +1,231 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe API::ErrorTracking::ProjectSettings do
+ let_it_be(:user) { create(:user) }
+
+ let(:setting) { create(:project_error_tracking_setting) }
+ let(:project) { setting.project }
+
+ shared_examples 'returns project settings' do
+ it 'returns correct project settings' do
+ make_request
+
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(json_response).to eq(
+ 'active' => setting.reload.enabled,
+ 'project_name' => setting.project_name,
+ 'sentry_external_url' => setting.sentry_external_url,
+ 'api_url' => setting.api_url,
+ 'integrated' => setting.integrated
+ )
+ end
+ end
+
+ shared_examples 'returns 404' do
+ it 'returns no project settings' do
+ make_request
+
+ expect(response).to have_gitlab_http_status(:not_found)
+ expect(json_response['message'])
+ .to eq('404 Error Tracking Setting Not Found')
+ end
+ end
+
+ describe "PATCH /projects/:id/error_tracking/settings" do
+ let(:params) { { active: false } }
+
+ def make_request
+ patch api("/projects/#{project.id}/error_tracking/settings", user), params: params
+ end
+
+ context 'when authenticated as maintainer' do
+ before do
+ project.add_maintainer(user)
+ end
+
+ context 'patch settings' do
+ it_behaves_like 'returns project settings'
+
+ it 'updates enabled flag' do
+ expect(setting).to be_enabled
+
+ make_request
+
+ expect(json_response).to include('active' => false)
+ expect(setting.reload).not_to be_enabled
+ end
+
+ context 'active is invalid' do
+ let(:params) { { active: "randomstring" } }
+
+ it 'returns active is invalid if non boolean' do
+ make_request
+
+ expect(response).to have_gitlab_http_status(:bad_request)
+ expect(json_response['error'])
+ .to eq('active is invalid')
+ end
+ end
+
+ context 'active is empty' do
+ let(:params) { { active: '' } }
+
+ it 'returns 400' do
+ make_request
+
+ expect(response).to have_gitlab_http_status(:bad_request)
+ expect(json_response['error'])
+ .to eq('active is empty')
+ end
+ end
+
+ context 'with integrated param' do
+ let(:params) { { active: true, integrated: true } }
+
+ it 'updates the integrated flag' do
+ expect(setting.integrated).to be_falsey
+
+ make_request
+
+ expect(json_response).to include('integrated' => true)
+ expect(setting.reload.integrated).to be_truthy
+ end
+ end
+ end
+
+ context 'without a project setting' do
+ let(:project) { create(:project) }
+
+ before do
+ project.add_maintainer(user)
+ end
+
+ context 'patch settings' do
+ it_behaves_like 'returns 404'
+ end
+ end
+ end
+
+ context 'when authenticated as reporter' do
+ before do
+ project.add_reporter(user)
+ end
+
+ context 'patch request' do
+ it 'returns 403' do
+ make_request
+
+ expect(response).to have_gitlab_http_status(:forbidden)
+ end
+ end
+ end
+
+ context 'when authenticated as developer' do
+ before do
+ project.add_developer(user)
+ end
+
+ context 'patch request' do
+ it 'returns 403' do
+ make_request
+
+ expect(response).to have_gitlab_http_status(:forbidden)
+ end
+ end
+ end
+
+ context 'when authenticated as non-member' do
+ context 'patch request' do
+ it 'returns 404' do
+ make_request
+
+ expect(response).to have_gitlab_http_status(:not_found)
+ end
+ end
+ end
+
+ context 'when unauthenticated' do
+ let(:user) { nil }
+
+ context 'patch request' do
+ it 'returns 401 for update request' do
+ make_request
+
+ expect(response).to have_gitlab_http_status(:unauthorized)
+ end
+ end
+ end
+ end
+
+ describe "GET /projects/:id/error_tracking/settings" do
+ def make_request
+ get api("/projects/#{project.id}/error_tracking/settings", user)
+ end
+
+ context 'when authenticated as maintainer' do
+ before do
+ project.add_maintainer(user)
+ end
+
+ context 'get settings' do
+ it_behaves_like 'returns project settings'
+ end
+ end
+
+ context 'without a project setting' do
+ let(:project) { create(:project) }
+
+ before do
+ project.add_maintainer(user)
+ end
+
+ context 'get settings' do
+ it_behaves_like 'returns 404'
+ end
+ end
+
+ context 'when authenticated as reporter' do
+ before do
+ project.add_reporter(user)
+ end
+
+ it 'returns 403' do
+ make_request
+
+ expect(response).to have_gitlab_http_status(:forbidden)
+ end
+ end
+
+ context 'when authenticated as developer' do
+ before do
+ project.add_developer(user)
+ end
+
+ it 'returns 403' do
+ make_request
+
+ expect(response).to have_gitlab_http_status(:forbidden)
+ end
+ end
+
+ context 'when authenticated as non-member' do
+ it 'returns 404' do
+ make_request
+
+ expect(response).to have_gitlab_http_status(:not_found)
+ end
+ end
+
+ context 'when unauthenticated' do
+ let(:user) { nil }
+
+ it 'returns 401' do
+ make_request
+
+ expect(response).to have_gitlab_http_status(:unauthorized)
+ end
+ end
+ end
+end
diff --git a/spec/requests/api/error_tracking_client_keys_spec.rb b/spec/requests/api/error_tracking_client_keys_spec.rb
deleted file mode 100644
index 886ec5ade3d..00000000000
--- a/spec/requests/api/error_tracking_client_keys_spec.rb
+++ /dev/null
@@ -1,86 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe API::ErrorTrackingClientKeys do
- let_it_be(:guest) { create(:user) }
- let_it_be(:maintainer) { create(:user) }
- let_it_be(:setting) { create(:project_error_tracking_setting) }
- let_it_be(:project) { setting.project }
-
- let!(:client_key) { create(:error_tracking_client_key, project: project) }
-
- before do
- project.add_guest(guest)
- project.add_maintainer(maintainer)
- end
-
- shared_examples 'endpoint with authorization' do
- context 'when unauthenticated' do
- let(:user) { nil }
-
- it { expect(response).to have_gitlab_http_status(:unauthorized) }
- end
-
- context 'when authenticated as non-maintainer' do
- let(:user) { guest }
-
- it { expect(response).to have_gitlab_http_status(:forbidden) }
- end
- end
-
- describe "GET /projects/:id/error_tracking/client_keys" do
- before do
- get api("/projects/#{project.id}/error_tracking/client_keys", user)
- end
-
- it_behaves_like 'endpoint with authorization'
-
- context 'when authenticated as maintainer' do
- let(:user) { maintainer }
-
- it 'returns client keys' do
- expect(response).to have_gitlab_http_status(:ok)
- expect(response).to include_pagination_headers
- expect(json_response.size).to eq(1)
- expect(json_response.first['id']).to eq(client_key.id)
- end
- end
- end
-
- describe "POST /projects/:id/error_tracking/client_keys" do
- before do
- post api("/projects/#{project.id}/error_tracking/client_keys", user)
- end
-
- it_behaves_like 'endpoint with authorization'
-
- context 'when authenticated as maintainer' do
- let(:user) { maintainer }
-
- it 'returns a newly created client key' do
- new_key = project.error_tracking_client_keys.last
-
- expect(json_response['id']).to eq(new_key.id)
- expect(json_response['public_key']).to eq(new_key.public_key)
- expect(json_response['sentry_dsn']).to eq(new_key.sentry_dsn)
- end
- end
- end
-
- describe "DELETE /projects/:id/error_tracking/client_keys/:key_id" do
- before do
- delete api("/projects/#{project.id}/error_tracking/client_keys/#{client_key.id}", user)
- end
-
- it_behaves_like 'endpoint with authorization'
-
- context 'when authenticated as maintainer' do
- let(:user) { maintainer }
-
- it 'returns a correct status' do
- expect(response).to have_gitlab_http_status(:ok)
- end
- end
- end
-end
diff --git a/spec/requests/api/error_tracking_collector_spec.rb b/spec/requests/api/error_tracking_collector_spec.rb
deleted file mode 100644
index 35d3ea01f87..00000000000
--- a/spec/requests/api/error_tracking_collector_spec.rb
+++ /dev/null
@@ -1,148 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe API::ErrorTrackingCollector do
- let_it_be(:project) { create(:project, :private) }
- let_it_be(:setting) { create(:project_error_tracking_setting, :integrated, project: project) }
- let_it_be(:client_key) { create(:error_tracking_client_key, project: project) }
-
- RSpec.shared_examples 'not found' do
- it 'reponds with 404' do
- subject
-
- expect(response).to have_gitlab_http_status(:not_found)
- end
- end
-
- RSpec.shared_examples 'bad request' do
- it 'responds with 400' do
- subject
-
- expect(response).to have_gitlab_http_status(:bad_request)
- end
- end
-
- RSpec.shared_examples 'successful request' do
- it 'writes to the database and returns no content' do
- expect { subject }.to change { ErrorTracking::ErrorEvent.count }.by(1)
-
- expect(response).to have_gitlab_http_status(:no_content)
- end
- end
-
- describe "POST /error_tracking/collector/api/:id/envelope" do
- let_it_be(:raw_event) { fixture_file('error_tracking/event.txt') }
- let_it_be(:url) { "/error_tracking/collector/api/#{project.id}/envelope" }
-
- let(:params) { raw_event }
- let(:headers) { { 'X-Sentry-Auth' => "Sentry sentry_key=#{client_key.public_key}" } }
-
- subject { post api(url), params: params, headers: headers }
-
- context 'error tracking feature is disabled' do
- before do
- setting.update!(enabled: false)
- end
-
- it_behaves_like 'not found'
- end
-
- context 'integrated error tracking is disabled' do
- before do
- setting.update!(integrated: false)
- end
-
- it_behaves_like 'not found'
- end
-
- context 'auth headers are missing' do
- let(:headers) { {} }
-
- it_behaves_like 'bad request'
- end
-
- context 'public key is wrong' do
- let(:headers) { { 'X-Sentry-Auth' => "Sentry sentry_key=glet_1fedb514e17f4b958435093deb02048c" } }
-
- it_behaves_like 'not found'
- end
-
- context 'public key is inactive' do
- let(:client_key) { create(:error_tracking_client_key, :disabled, project: project) }
-
- it_behaves_like 'not found'
- end
-
- context 'empty body' do
- let(:params) { '' }
-
- it_behaves_like 'bad request'
- end
-
- context 'unknown request type' do
- let(:params) { fixture_file('error_tracking/unknown.txt') }
-
- it_behaves_like 'bad request'
- end
-
- context 'transaction request type' do
- let(:params) { fixture_file('error_tracking/transaction.txt') }
-
- it 'does nothing and returns no content' do
- expect { subject }.not_to change { ErrorTracking::ErrorEvent.count }
-
- expect(response).to have_gitlab_http_status(:no_content)
- end
- end
-
- it_behaves_like 'successful request'
- end
-
- describe "POST /error_tracking/collector/api/:id/store" do
- let_it_be(:raw_event) { fixture_file('error_tracking/parsed_event.json') }
- let_it_be(:url) { "/error_tracking/collector/api/#{project.id}/store" }
-
- let(:params) { raw_event }
- let(:headers) { { 'X-Sentry-Auth' => "Sentry sentry_key=#{client_key.public_key}" } }
-
- subject { post api(url), params: params, headers: headers }
-
- it_behaves_like 'successful request'
-
- context 'empty headers' do
- let(:headers) { {} }
-
- it_behaves_like 'bad request'
- end
-
- context 'empty body' do
- let(:params) { '' }
-
- it_behaves_like 'bad request'
- end
-
- context 'sentry_key as param and empty headers' do
- let(:url) { "/error_tracking/collector/api/#{project.id}/store?sentry_key=#{sentry_key}" }
- let(:headers) { {} }
-
- context 'key is wrong' do
- let(:sentry_key) { 'glet_1fedb514e17f4b958435093deb02048c' }
-
- it_behaves_like 'not found'
- end
-
- context 'key is empty' do
- let(:sentry_key) { '' }
-
- it_behaves_like 'bad request'
- end
-
- context 'key is correct' do
- let(:sentry_key) { client_key.public_key }
-
- it_behaves_like 'successful request'
- end
- end
- end
-end
diff --git a/spec/requests/api/error_tracking_spec.rb b/spec/requests/api/error_tracking_spec.rb
deleted file mode 100644
index ec9a3378acc..00000000000
--- a/spec/requests/api/error_tracking_spec.rb
+++ /dev/null
@@ -1,231 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe API::ErrorTracking do
- let_it_be(:user) { create(:user) }
-
- let(:setting) { create(:project_error_tracking_setting) }
- let(:project) { setting.project }
-
- shared_examples 'returns project settings' do
- it 'returns correct project settings' do
- make_request
-
- expect(response).to have_gitlab_http_status(:ok)
- expect(json_response).to eq(
- 'active' => setting.reload.enabled,
- 'project_name' => setting.project_name,
- 'sentry_external_url' => setting.sentry_external_url,
- 'api_url' => setting.api_url,
- 'integrated' => setting.integrated
- )
- end
- end
-
- shared_examples 'returns 404' do
- it 'returns no project settings' do
- make_request
-
- expect(response).to have_gitlab_http_status(:not_found)
- expect(json_response['message'])
- .to eq('404 Error Tracking Setting Not Found')
- end
- end
-
- describe "PATCH /projects/:id/error_tracking/settings" do
- let(:params) { { active: false } }
-
- def make_request
- patch api("/projects/#{project.id}/error_tracking/settings", user), params: params
- end
-
- context 'when authenticated as maintainer' do
- before do
- project.add_maintainer(user)
- end
-
- context 'patch settings' do
- it_behaves_like 'returns project settings'
-
- it 'updates enabled flag' do
- expect(setting).to be_enabled
-
- make_request
-
- expect(json_response).to include('active' => false)
- expect(setting.reload).not_to be_enabled
- end
-
- context 'active is invalid' do
- let(:params) { { active: "randomstring" } }
-
- it 'returns active is invalid if non boolean' do
- make_request
-
- expect(response).to have_gitlab_http_status(:bad_request)
- expect(json_response['error'])
- .to eq('active is invalid')
- end
- end
-
- context 'active is empty' do
- let(:params) { { active: '' } }
-
- it 'returns 400' do
- make_request
-
- expect(response).to have_gitlab_http_status(:bad_request)
- expect(json_response['error'])
- .to eq('active is empty')
- end
- end
-
- context 'with integrated param' do
- let(:params) { { active: true, integrated: true } }
-
- it 'updates the integrated flag' do
- expect(setting.integrated).to be_falsey
-
- make_request
-
- expect(json_response).to include('integrated' => true)
- expect(setting.reload.integrated).to be_truthy
- end
- end
- end
-
- context 'without a project setting' do
- let(:project) { create(:project) }
-
- before do
- project.add_maintainer(user)
- end
-
- context 'patch settings' do
- it_behaves_like 'returns 404'
- end
- end
- end
-
- context 'when authenticated as reporter' do
- before do
- project.add_reporter(user)
- end
-
- context 'patch request' do
- it 'returns 403' do
- make_request
-
- expect(response).to have_gitlab_http_status(:forbidden)
- end
- end
- end
-
- context 'when authenticated as developer' do
- before do
- project.add_developer(user)
- end
-
- context 'patch request' do
- it 'returns 403' do
- make_request
-
- expect(response).to have_gitlab_http_status(:forbidden)
- end
- end
- end
-
- context 'when authenticated as non-member' do
- context 'patch request' do
- it 'returns 404' do
- make_request
-
- expect(response).to have_gitlab_http_status(:not_found)
- end
- end
- end
-
- context 'when unauthenticated' do
- let(:user) { nil }
-
- context 'patch request' do
- it 'returns 401 for update request' do
- make_request
-
- expect(response).to have_gitlab_http_status(:unauthorized)
- end
- end
- end
- end
-
- describe "GET /projects/:id/error_tracking/settings" do
- def make_request
- get api("/projects/#{project.id}/error_tracking/settings", user)
- end
-
- context 'when authenticated as maintainer' do
- before do
- project.add_maintainer(user)
- end
-
- context 'get settings' do
- it_behaves_like 'returns project settings'
- end
- end
-
- context 'without a project setting' do
- let(:project) { create(:project) }
-
- before do
- project.add_maintainer(user)
- end
-
- context 'get settings' do
- it_behaves_like 'returns 404'
- end
- end
-
- context 'when authenticated as reporter' do
- before do
- project.add_reporter(user)
- end
-
- it 'returns 403' do
- make_request
-
- expect(response).to have_gitlab_http_status(:forbidden)
- end
- end
-
- context 'when authenticated as developer' do
- before do
- project.add_developer(user)
- end
-
- it 'returns 403' do
- make_request
-
- expect(response).to have_gitlab_http_status(:forbidden)
- end
- end
-
- context 'when authenticated as non-member' do
- it 'returns 404' do
- make_request
-
- expect(response).to have_gitlab_http_status(:not_found)
- end
- end
-
- context 'when unauthenticated' do
- let(:user) { nil }
-
- it 'returns 401' do
- make_request
-
- expect(response).to have_gitlab_http_status(:unauthorized)
- end
- end
- end
-end
diff --git a/spec/requests/api/graphql/boards/board_list_issues_query_spec.rb b/spec/requests/api/graphql/boards/board_list_issues_query_spec.rb
index 008241b8055..241c658441b 100644
--- a/spec/requests/api/graphql/boards/board_list_issues_query_spec.rb
+++ b/spec/requests/api/graphql/boards/board_list_issues_query_spec.rb
@@ -30,7 +30,7 @@ RSpec.describe 'get board lists' do
nodes {
lists {
nodes {
- issues(filters: {labelName: "#{label2.title}"}) {
+ issues(filters: {labelName: "#{label2.title}"}, first: 3) {
count
nodes {
#{all_graphql_fields_for('issues'.classify)}
@@ -44,6 +44,10 @@ RSpec.describe 'get board lists' do
)
end
+ def issue_id
+ issues_data.map { |i| i['id'] }
+ end
+
def issue_titles
issues_data.map { |i| i['title'] }
end
@@ -60,6 +64,7 @@ RSpec.describe 'get board lists' do
let!(:issue3) { create(:issue, project: issue_project, labels: [label, label2], relative_position: nil) }
let!(:issue4) { create(:issue, project: issue_project, labels: [label], relative_position: 9) }
let!(:issue5) { create(:issue, project: issue_project, labels: [label2], relative_position: 432) }
+ let!(:issue6) { create(:issue, project: issue_project, labels: [label, label2], relative_position: nil) }
context 'when the user does not have access to the board' do
it 'returns nil' do
@@ -72,14 +77,19 @@ RSpec.describe 'get board lists' do
context 'when user can read the board' do
before do
board_parent.add_reporter(user)
+ post_graphql(query("id: \"#{global_id_of(label_list)}\""), current_user: user)
end
it 'can access the issues', :aggregate_failures do
- post_graphql(query("id: \"#{global_id_of(label_list)}\""), current_user: user)
-
+ # ties for relative positions are broken by id in ascending order by default
expect(issue_titles).to eq([issue2.title, issue1.title, issue3.title])
expect(issue_relative_positions).not_to include(nil)
end
+
+ it 'does not set the relative positions of the issues not being returned', :aggregate_failures do
+ expect(issue_id).not_to include(issue6.id)
+ expect(issue3.relative_position).to be_nil
+ end
end
end
diff --git a/spec/requests/api/graphql/boards/board_list_query_spec.rb b/spec/requests/api/graphql/boards/board_list_query_spec.rb
new file mode 100644
index 00000000000..dec7ca715f2
--- /dev/null
+++ b/spec/requests/api/graphql/boards/board_list_query_spec.rb
@@ -0,0 +1,98 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe 'Querying a Board list' do
+ include GraphqlHelpers
+
+ let_it_be(:current_user) { create(:user) }
+ let_it_be(:project) { create(:project) }
+ let_it_be(:board) { create(:board, resource_parent: project) }
+ let_it_be(:label) { create(:label, project: project, name: 'foo') }
+ let_it_be(:list) { create(:list, board: board, label: label) }
+ let_it_be(:issue1) { create(:issue, project: project, labels: [label]) }
+ let_it_be(:issue2) { create(:issue, project: project, labels: [label], assignees: [current_user]) }
+
+ let(:filters) { {} }
+ let(:query) do
+ graphql_query_for(
+ :board_list,
+ { id: list.to_global_id.to_s, issueFilters: filters },
+ %w[title issuesCount]
+ )
+ end
+
+ subject { graphql_data['boardList'] }
+
+ before do
+ post_graphql(query, current_user: current_user)
+ end
+
+ context 'when the user has access to the list' do
+ before_all do
+ project.add_guest(current_user)
+ end
+
+ it_behaves_like 'a working graphql query'
+
+ it { is_expected.to include({ 'issuesCount' => 2, 'title' => list.title }) }
+
+ context 'with matching issue filters' do
+ let(:filters) { { assigneeUsername: current_user.username } }
+
+ it 'filters issues metadata' do
+ is_expected.to include({ 'issuesCount' => 1, 'title' => list.title })
+ end
+ end
+
+ context 'with unmatching issue filters' do
+ let(:filters) { { assigneeUsername: 'foo' } }
+
+ it 'filters issues metadata' do
+ is_expected.to include({ 'issuesCount' => 0, 'title' => list.title })
+ end
+ end
+ end
+
+ context 'when the user does not have access to the list' do
+ it { is_expected.to be_nil }
+ end
+
+ context 'when ID argument is missing' do
+ let(:query) do
+ graphql_query_for('boardList', {}, 'title')
+ end
+
+ it 'raises an exception' do
+ expect(graphql_errors).to include(a_hash_including('message' => "Field 'boardList' is missing required arguments: id"))
+ end
+ end
+
+ context 'when list ID is not found' do
+ let(:query) do
+ graphql_query_for('boardList', { id: "gid://gitlab/List/#{non_existing_record_id}" }, 'title')
+ end
+
+ it { is_expected.to be_nil }
+ end
+
+ it 'does not have an N+1 performance issue' do
+ a, b = create_list(:list, 2, board: board)
+ ctx = { current_user: current_user }
+ project.add_guest(current_user)
+
+ baseline = graphql_query_for(:board_list, { id: global_id_of(a) }, 'title')
+ query = <<~GQL
+ query {
+ a: #{query_graphql_field(:board_list, { id: global_id_of(a) }, 'title')}
+ b: #{query_graphql_field(:board_list, { id: global_id_of(b) }, 'title')}
+ }
+ GQL
+
+ control = ActiveRecord::QueryRecorder.new do
+ run_with_clean_state(baseline, context: ctx)
+ end
+
+ expect { run_with_clean_state(query, context: ctx) }.not_to exceed_query_limit(control)
+ end
+end
diff --git a/spec/requests/api/graphql/boards/board_lists_query_spec.rb b/spec/requests/api/graphql/boards/board_lists_query_spec.rb
index 2d52cddcacc..ace8c59e82d 100644
--- a/spec/requests/api/graphql/boards/board_lists_query_spec.rb
+++ b/spec/requests/api/graphql/boards/board_lists_query_spec.rb
@@ -92,9 +92,9 @@ RSpec.describe 'get board lists' do
context 'when ascending' do
it_behaves_like 'sorted paginated query' do
- let(:sort_param) { }
- let(:first_param) { 2 }
- let(:expected_results) { lists.map { |list| global_id_of(list) } }
+ let(:sort_param) { }
+ let(:first_param) { 2 }
+ let(:all_records) { lists.map { |list| global_id_of(list) } }
end
end
end
diff --git a/spec/requests/api/graphql/ci/runner_spec.rb b/spec/requests/api/graphql/ci/runner_spec.rb
index 74547196445..ab53ff654e9 100644
--- a/spec/requests/api/graphql/ci/runner_spec.rb
+++ b/spec/requests/api/graphql/ci/runner_spec.rb
@@ -6,6 +6,7 @@ RSpec.describe 'Query.runner(id)' do
include GraphqlHelpers
let_it_be(:user) { create(:user, :admin) }
+ let_it_be(:group) { create(:group) }
let_it_be(:active_instance_runner) do
create(:ci_runner, :instance, description: 'Runner 1', contacted_at: 2.hours.ago,
@@ -18,12 +19,20 @@ RSpec.describe 'Query.runner(id)' do
version: 'adfe157', revision: 'b', ip_address: '10.10.10.10', access_level: 1, run_untagged: true)
end
+ let_it_be(:active_group_runner) do
+ create(:ci_runner, :group, groups: [group], description: 'Group runner 1', contacted_at: 2.hours.ago,
+ active: true, version: 'adfe156', revision: 'a', locked: true, ip_address: '127.0.0.1', maximum_timeout: 600,
+ access_level: 0, tag_list: %w[tag1 tag2], run_untagged: true)
+ end
+
def get_runner(id)
case id
when :active_instance_runner
active_instance_runner
when :inactive_instance_runner
inactive_instance_runner
+ when :active_group_runner
+ active_group_runner
end
end
@@ -61,7 +70,39 @@ RSpec.describe 'Query.runner(id)' do
'ipAddress' => runner.ip_address,
'runnerType' => runner.instance_type? ? 'INSTANCE_TYPE' : 'PROJECT_TYPE',
'jobCount' => 0,
- 'projectCount' => nil
+ 'projectCount' => nil,
+ 'adminUrl' => "http://localhost/admin/runners/#{runner.id}",
+ 'userPermissions' => {
+ 'readRunner' => true,
+ 'updateRunner' => true,
+ 'deleteRunner' => true
+ }
+ )
+ expect(runner_data['tagList']).to match_array runner.tag_list
+ end
+ end
+
+ shared_examples 'retrieval with no admin url' do |runner_id|
+ let(:query) do
+ wrap_fields(query_graphql_path(query_path, all_graphql_fields_for('CiRunner')))
+ end
+
+ let(:query_path) do
+ [
+ [:runner, { id: get_runner(runner_id).to_global_id.to_s }]
+ ]
+ end
+
+ it 'retrieves expected fields' do
+ post_graphql(query, current_user: user)
+
+ runner_data = graphql_data_at(:runner)
+ expect(runner_data).not_to be_nil
+
+ runner = get_runner(runner_id)
+ expect(runner_data).to match a_hash_including(
+ 'id' => "gid://gitlab/Ci::Runner/#{runner.id}",
+ 'adminUrl' => nil
)
expect(runner_data['tagList']).to match_array runner.tag_list
end
@@ -147,6 +188,39 @@ RSpec.describe 'Query.runner(id)' do
it_behaves_like 'runner details fetch', :inactive_instance_runner
end
+ describe 'for runner inside group request' do
+ let(:query) do
+ %(
+ query {
+ group(fullPath: "#{group.full_path}") {
+ runners {
+ edges {
+ webUrl
+ node {
+ id
+ }
+ }
+ }
+ }
+ }
+ )
+ end
+
+ it 'retrieves webUrl field with expected value' do
+ post_graphql(query, current_user: user)
+
+ runner_data = graphql_data_at(:group, :runners, :edges)
+ expect(runner_data).to match_array [
+ a_hash_including(
+ 'webUrl' => "http://localhost/groups/#{group.full_path}/-/runners/#{active_group_runner.id}",
+ 'node' => {
+ 'id' => "gid://gitlab/Ci::Runner/#{active_group_runner.id}"
+ }
+ )
+ ]
+ end
+ end
+
describe 'for multiple runners' do
let_it_be(:project1) { create(:project, :test_repo) }
let_it_be(:project2) { create(:project, :test_repo) }
@@ -176,7 +250,7 @@ RSpec.describe 'Query.runner(id)' do
end
before do
- project_runner2.projects.clear
+ project_runner2.runner_projects.clear
post_graphql(query, current_user: user)
end
@@ -205,6 +279,16 @@ RSpec.describe 'Query.runner(id)' do
it_behaves_like 'retrieval by unauthorized user', :active_instance_runner
end
+ describe 'by non-admin user' do
+ let(:user) { create(:user) }
+
+ before do
+ group.add_user(user, Gitlab::Access::OWNER)
+ end
+
+ it_behaves_like 'retrieval with no admin url', :active_group_runner
+ end
+
describe 'by unauthenticated user' do
let(:user) { nil }
diff --git a/spec/requests/api/graphql/ci/runners_spec.rb b/spec/requests/api/graphql/ci/runners_spec.rb
index 778fe5b129e..51a07e60e15 100644
--- a/spec/requests/api/graphql/ci/runners_spec.rb
+++ b/spec/requests/api/graphql/ci/runners_spec.rb
@@ -95,9 +95,9 @@ RSpec.describe 'Query.runners' do
let(:ordered_runners) { runners.sort_by(&:contacted_at) }
it_behaves_like 'sorted paginated query' do
- let(:sort_param) { :CONTACTED_ASC }
- let(:first_param) { 2 }
- let(:expected_results) { ordered_runners.map(&:id) }
+ let(:sort_param) { :CONTACTED_ASC }
+ let(:first_param) { 2 }
+ let(:all_records) { ordered_runners.map(&:id) }
end
end
@@ -105,9 +105,9 @@ RSpec.describe 'Query.runners' do
let(:ordered_runners) { runners.sort_by(&:created_at).reverse }
it_behaves_like 'sorted paginated query' do
- let(:sort_param) { :CREATED_DESC }
- let(:first_param) { 2 }
- let(:expected_results) { ordered_runners.map(&:id) }
+ let(:sort_param) { :CREATED_DESC }
+ let(:first_param) { 2 }
+ let(:all_records) { ordered_runners.map(&:id) }
end
end
end
diff --git a/spec/requests/api/graphql/container_repository/container_repository_details_spec.rb b/spec/requests/api/graphql/container_repository/container_repository_details_spec.rb
index 356e1e11def..d93afcc0f33 100644
--- a/spec/requests/api/graphql/container_repository/container_repository_details_spec.rb
+++ b/spec/requests/api/graphql/container_repository/container_repository_details_spec.rb
@@ -153,4 +153,6 @@ RSpec.describe 'container repository details' do
end
end
end
+
+ it_behaves_like 'handling graphql network errors with the container registry'
end
diff --git a/spec/requests/api/graphql/group/container_repositories_spec.rb b/spec/requests/api/graphql/group/container_repositories_spec.rb
index 939d7791d92..be0b866af4a 100644
--- a/spec/requests/api/graphql/group/container_repositories_spec.rb
+++ b/spec/requests/api/graphql/group/container_repositories_spec.rb
@@ -14,11 +14,12 @@ RSpec.describe 'getting container repositories in a group' do
let_it_be(:container_repositories) { [container_repository, container_repositories_delete_scheduled, container_repositories_delete_failed].flatten }
let_it_be(:container_expiration_policy) { project.container_expiration_policy }
+ let(:excluded_fields) { [] }
let(:container_repositories_fields) do
<<~GQL
edges {
node {
- #{all_graphql_fields_for('container_repositories'.classify, max_depth: 1)}
+ #{all_graphql_fields_for('container_repositories'.classify, max_depth: 1, excluded: excluded_fields)}
}
}
GQL
@@ -152,6 +153,12 @@ RSpec.describe 'getting container repositories in a group' do
end
end
+ it_behaves_like 'handling graphql network errors with the container registry'
+
+ it_behaves_like 'not hitting graphql network errors with the container registry' do
+ let(:excluded_fields) { %w[tags tagsCount] }
+ end
+
it 'returns the total count of container repositories' do
subject
diff --git a/spec/requests/api/graphql/group/dependency_proxy_group_setting_spec.rb b/spec/requests/api/graphql/group/dependency_proxy_group_setting_spec.rb
index c5c6d85d1e6..de3dbc5c324 100644
--- a/spec/requests/api/graphql/group/dependency_proxy_group_setting_spec.rb
+++ b/spec/requests/api/graphql/group/dependency_proxy_group_setting_spec.rb
@@ -33,46 +33,59 @@ RSpec.describe 'getting dependency proxy settings for a group' do
before do
stub_config(dependency_proxy: { enabled: true })
- group.create_dependency_proxy_setting!(enabled: true)
end
subject { post_graphql(query, current_user: user, variables: variables) }
- it_behaves_like 'a working graphql query' do
- before do
- subject
- end
- end
-
- context 'with different permissions' do
- where(:group_visibility, :role, :access_granted) do
- :private | :maintainer | true
- :private | :developer | true
- :private | :reporter | true
- :private | :guest | true
- :private | :anonymous | false
- :public | :maintainer | true
- :public | :developer | true
- :public | :reporter | true
- :public | :guest | true
- :public | :anonymous | false
+ shared_examples 'dependency proxy group setting query' do
+ it_behaves_like 'a working graphql query' do
+ before do
+ subject
+ end
end
- with_them do
- before do
- group.update_column(:visibility_level, Gitlab::VisibilityLevel.const_get(group_visibility.to_s.upcase, false))
- group.add_user(user, role) unless role == :anonymous
+ context 'with different permissions' do
+ where(:group_visibility, :role, :access_granted) do
+ :private | :maintainer | true
+ :private | :developer | true
+ :private | :reporter | true
+ :private | :guest | true
+ :private | :anonymous | false
+ :public | :maintainer | true
+ :public | :developer | true
+ :public | :reporter | true
+ :public | :guest | true
+ :public | :anonymous | false
end
- it 'return the proper response' do
- subject
+ with_them do
+ before do
+ group.update_column(:visibility_level, Gitlab::VisibilityLevel.const_get(group_visibility.to_s.upcase, false))
+ group.add_user(user, role) unless role == :anonymous
+ end
+
+ it 'return the proper response' do
+ subject
- if access_granted
- expect(dependency_proxy_group_setting_response).to eq('enabled' => true)
- else
- expect(dependency_proxy_group_setting_response).to be_blank
+ if access_granted
+ expect(dependency_proxy_group_setting_response).to eq('enabled' => true)
+ else
+ expect(dependency_proxy_group_setting_response).to be_blank
+ end
end
end
end
end
+
+ context 'with the settings model created' do
+ before do
+ group.create_dependency_proxy_setting!(enabled: true)
+ end
+
+ it_behaves_like 'dependency proxy group setting query'
+ end
+
+ context 'without the settings model created' do
+ it_behaves_like 'dependency proxy group setting query'
+ end
end
diff --git a/spec/requests/api/graphql/group/issues_spec.rb b/spec/requests/api/graphql/group/issues_spec.rb
new file mode 100644
index 00000000000..332bf242e9c
--- /dev/null
+++ b/spec/requests/api/graphql/group/issues_spec.rb
@@ -0,0 +1,123 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe 'getting an issue list for a group' do
+ include GraphqlHelpers
+
+ let_it_be(:current_user) { create(:user) }
+ let_it_be(:group1) { create(:group) }
+ let_it_be(:group2) { create(:group) }
+ let_it_be(:project1) { create(:project, :public, group: group1) }
+ let_it_be(:project2) { create(:project, :private, group: group1) }
+ let_it_be(:project3) { create(:project, :public, group: group2) }
+ let_it_be(:issue1) { create(:issue, project: project1) }
+ let_it_be(:issue2) { create(:issue, project: project2) }
+ let_it_be(:issue3) { create(:issue, project: project3) }
+
+ let(:issue1_gid) { issue1.to_global_id.to_s }
+ let(:issue2_gid) { issue2.to_global_id.to_s }
+ let(:issues_data) { graphql_data['group']['issues']['edges'] }
+ let(:issue_filter_params) { {} }
+
+ let(:fields) do
+ <<~QUERY
+ edges {
+ node {
+ #{all_graphql_fields_for('issues'.classify)}
+ }
+ }
+ QUERY
+ end
+
+ let(:query) do
+ graphql_query_for(
+ 'group',
+ { 'fullPath' => group1.full_path },
+ query_graphql_field('issues', issue_filter_params, fields)
+ )
+ end
+
+ it_behaves_like 'a working graphql query' do
+ before do
+ post_graphql(query, current_user: current_user)
+ end
+ end
+
+ context 'when there is a confidential issue' do
+ let_it_be(:confidential_issue1) { create(:issue, :confidential, project: project1) }
+ let_it_be(:confidential_issue2) { create(:issue, :confidential, project: project2) }
+ let_it_be(:confidential_issue3) { create(:issue, :confidential, project: project3) }
+
+ let(:confidential_issue1_gid) { confidential_issue1.to_global_id.to_s }
+ let(:confidential_issue2_gid) { confidential_issue2.to_global_id.to_s }
+
+ context 'when the user cannot see confidential issues' do
+ before do
+ group1.add_guest(current_user)
+ end
+
+ it 'returns issues without confidential issues for the group' do
+ post_graphql(query, current_user: current_user)
+
+ expect(issues_ids).to contain_exactly(issue1_gid, issue2_gid)
+ end
+
+ context 'filtering for confidential issues' do
+ let(:issue_filter_params) { { confidential: true } }
+
+ it 'returns no issues' do
+ post_graphql(query, current_user: current_user)
+
+ expect(issues_ids).to be_empty
+ end
+ end
+
+ context 'filtering for non-confidential issues' do
+ let(:issue_filter_params) { { confidential: false } }
+
+ it 'returns correctly filtered issues' do
+ post_graphql(query, current_user: current_user)
+
+ expect(issues_ids).to contain_exactly(issue1_gid, issue2_gid)
+ end
+ end
+ end
+
+ context 'when the user can see confidential issues' do
+ before do
+ group1.add_developer(current_user)
+ end
+
+ it 'returns issues with confidential issues for the group' do
+ post_graphql(query, current_user: current_user)
+
+ expect(issues_ids).to contain_exactly(issue1_gid, issue2_gid, confidential_issue1_gid, confidential_issue2_gid)
+ end
+
+ context 'filtering for confidential issues' do
+ let(:issue_filter_params) { { confidential: true } }
+
+ it 'returns correctly filtered issues' do
+ post_graphql(query, current_user: current_user)
+
+ expect(issues_ids).to contain_exactly(confidential_issue1_gid, confidential_issue2_gid)
+ end
+ end
+
+ context 'filtering for non-confidential issues' do
+ let(:issue_filter_params) { { confidential: false } }
+
+ it 'returns correctly filtered issues' do
+ post_graphql(query, current_user: current_user)
+
+ expect(issues_ids).to contain_exactly(issue1_gid, issue2_gid)
+ end
+ end
+ end
+ end
+
+ def issues_ids
+ graphql_dig_at(issues_data, :node, :id)
+ end
+end
diff --git a/spec/requests/api/graphql/mutations/ci/runners_registration_token/reset_spec.rb b/spec/requests/api/graphql/mutations/ci/runners_registration_token/reset_spec.rb
index 07b05ead651..0fd8fdc3f59 100644
--- a/spec/requests/api/graphql/mutations/ci/runners_registration_token/reset_spec.rb
+++ b/spec/requests/api/graphql/mutations/ci/runners_registration_token/reset_spec.rb
@@ -89,7 +89,7 @@ RSpec.describe 'RunnersRegistrationTokenReset' do
end
include_context 'when authorized', 'group' do
- let_it_be(:user) { create_default(:group_member, :maintainer, user: create(:user), group: group ).user }
+ let_it_be(:user) { create_default(:group_member, :owner, user: create(:user), group: group ).user }
def get_token
group.reload.runners_token
diff --git a/spec/requests/api/graphql/mutations/clusters/agent_tokens/agent_tokens/create_spec.rb b/spec/requests/api/graphql/mutations/clusters/agent_tokens/agent_tokens/create_spec.rb
new file mode 100644
index 00000000000..aac8eb22771
--- /dev/null
+++ b/spec/requests/api/graphql/mutations/clusters/agent_tokens/agent_tokens/create_spec.rb
@@ -0,0 +1,52 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe 'Create a new cluster agent token' do
+ include GraphqlHelpers
+
+ let_it_be(:cluster_agent) { create(:cluster_agent) }
+ let_it_be(:current_user) { create(:user) }
+
+ let(:description) { 'create token' }
+ let(:name) { 'token name' }
+ let(:mutation) do
+ graphql_mutation(
+ :cluster_agent_token_create,
+ { cluster_agent_id: cluster_agent.to_global_id.to_s, description: description, name: name }
+ )
+ end
+
+ def mutation_response
+ graphql_mutation_response(:cluster_agent_token_create)
+ end
+
+ context 'without user permissions' do
+ it_behaves_like 'a mutation that returns top-level errors',
+ errors: ["The resource that you are attempting to access does not exist "\
+ "or you don't have permission to perform this action"]
+
+ it 'does not create a token' do
+ expect { post_graphql_mutation(mutation, current_user: current_user) }.not_to change(Clusters::AgentToken, :count)
+ end
+ end
+
+ context 'with project permissions' do
+ before do
+ cluster_agent.project.add_maintainer(current_user)
+ end
+
+ it 'creates a new token', :aggregate_failures do
+ expect { post_graphql_mutation(mutation, current_user: current_user) }.to change { Clusters::AgentToken.count }.by(1)
+ expect(mutation_response['errors']).to eq([])
+ end
+
+ it 'returns token information', :aggregate_failures do
+ post_graphql_mutation(mutation, current_user: current_user)
+
+ expect(mutation_response['secret']).not_to be_nil
+ expect(mutation_response.dig('token', 'description')).to eq(description)
+ expect(mutation_response.dig('token', 'name')).to eq(name)
+ end
+ end
+end
diff --git a/spec/requests/api/graphql/mutations/clusters/agents/create_spec.rb b/spec/requests/api/graphql/mutations/clusters/agents/create_spec.rb
new file mode 100644
index 00000000000..c2ef2362d66
--- /dev/null
+++ b/spec/requests/api/graphql/mutations/clusters/agents/create_spec.rb
@@ -0,0 +1,42 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe 'Create a new cluster agent' do
+ include GraphqlHelpers
+
+ let(:project) { create(:project, :public, :repository) }
+ let(:project_name) { 'agent-test' }
+ let(:current_user) { create(:user) }
+
+ let(:mutation) do
+ graphql_mutation(
+ :create_cluster_agent,
+ { project_path: project.full_path, name: project_name }
+ )
+ end
+
+ def mutation_response
+ graphql_mutation_response(:create_cluster_agent)
+ end
+
+ context 'without project permissions' do
+ it_behaves_like 'a mutation that returns a top-level access error'
+
+ it 'does not create cluster agent' do
+ expect { post_graphql_mutation(mutation, current_user: current_user) }.not_to change(Clusters::Agent, :count)
+ end
+ end
+
+ context 'with user permissions' do
+ before do
+ project.add_maintainer(current_user)
+ end
+
+ it 'creates a new cluster agent', :aggregate_failures do
+ expect { post_graphql_mutation(mutation, current_user: current_user) }.to change { Clusters::Agent.count }.by(1)
+ expect(mutation_response.dig('clusterAgent', 'name')).to eq(project_name)
+ expect(mutation_response['errors']).to eq([])
+ end
+ end
+end
diff --git a/spec/requests/api/graphql/mutations/clusters/agents/delete_spec.rb b/spec/requests/api/graphql/mutations/clusters/agents/delete_spec.rb
new file mode 100644
index 00000000000..5f6822223ca
--- /dev/null
+++ b/spec/requests/api/graphql/mutations/clusters/agents/delete_spec.rb
@@ -0,0 +1,43 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe 'Delete a cluster agent' do
+ include GraphqlHelpers
+
+ let(:cluster_agent) { create(:cluster_agent) }
+ let(:project) { cluster_agent.project }
+ let(:current_user) { create(:user) }
+
+ let(:mutation) do
+ graphql_mutation(
+ :cluster_agent_delete,
+ { id: cluster_agent.to_global_id.uri }
+ )
+ end
+
+ def mutation_response
+ graphql_mutation_response(:cluster_agent_delete)
+ end
+
+ context 'without project permissions' do
+ it_behaves_like 'a mutation that returns top-level errors',
+ errors: ['The resource that you are attempting to access does not exist '\
+ 'or you don\'t have permission to perform this action']
+
+ it 'does not delete cluster agent' do
+ expect { cluster_agent.reload }.not_to raise_error(ActiveRecord::RecordNotFound)
+ end
+ end
+
+ context 'with project permissions' do
+ before do
+ project.add_maintainer(current_user)
+ end
+
+ it 'deletes a cluster agent', :aggregate_failures do
+ expect { post_graphql_mutation(mutation, current_user: current_user) }.to change { Clusters::Agent.count }.by(-1)
+ expect(mutation_response['errors']).to eq([])
+ end
+ end
+end
diff --git a/spec/requests/api/graphql/mutations/dependency_proxy/group_settings/update_spec.rb b/spec/requests/api/graphql/mutations/dependency_proxy/group_settings/update_spec.rb
new file mode 100644
index 00000000000..f05bf23ad27
--- /dev/null
+++ b/spec/requests/api/graphql/mutations/dependency_proxy/group_settings/update_spec.rb
@@ -0,0 +1,65 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe 'Updating the dependency proxy group settings' do
+ include GraphqlHelpers
+ using RSpec::Parameterized::TableSyntax
+
+ let_it_be(:user) { create(:user) }
+
+ let(:params) do
+ {
+ group_path: group.full_path,
+ enabled: false
+ }
+ end
+
+ let(:mutation) do
+ graphql_mutation(:update_dependency_proxy_settings, params) do
+ <<~QL
+ dependencyProxySetting {
+ enabled
+ }
+ errors
+ QL
+ end
+ end
+
+ let(:mutation_response) { graphql_mutation_response(:update_dependency_proxy_settings) }
+ let(:group_settings) { mutation_response['dependencyProxySetting'] }
+
+ before do
+ stub_config(dependency_proxy: { enabled: true })
+ end
+
+ describe 'post graphql mutation' do
+ subject { post_graphql_mutation(mutation, current_user: user) }
+
+ let_it_be_with_reload(:group) { create(:group) }
+ let_it_be_with_reload(:group_settings) { create(:dependency_proxy_group_setting, group: group) }
+
+ context 'without permission' do
+ it 'returns no response' do
+ subject
+
+ expect(response).to have_gitlab_http_status(:success)
+ expect(mutation_response).to be_nil
+ end
+ end
+
+ context 'with permission' do
+ before do
+ group.add_developer(user)
+ end
+
+ it 'returns the updated dependency proxy settings', :aggregate_failures do
+ subject
+
+ expect(response).to have_gitlab_http_status(:success)
+ expect(mutation_response['errors']).to be_empty
+ expect(group_settings[:enabled]).to eq(false)
+ end
+ end
+ end
+end
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 dec9afd1310..608b36e4f15 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
@@ -115,7 +115,7 @@ RSpec.describe 'Setting assignees of a merge request', :assume_throttled do
context 'when passing append as true' do
let(:mode) { Types::MutationOperationModeEnum.enum[:append] }
let(:input) { { assignee_usernames: [assignee2.username], operation_mode: mode } }
- let(:db_query_limit) { 21 }
+ let(:db_query_limit) { 22 }
before do
# In CE, APPEND is a NOOP as you can't have multiple assignees
diff --git a/spec/requests/api/graphql/namespace/projects_spec.rb b/spec/requests/api/graphql/namespace/projects_spec.rb
index 414847c9c93..d5410f1a7cb 100644
--- a/spec/requests/api/graphql/namespace/projects_spec.rb
+++ b/spec/requests/api/graphql/namespace/projects_spec.rb
@@ -106,10 +106,10 @@ RSpec.describe 'getting projects' do
context 'when sorting by similarity' do
it_behaves_like 'sorted paginated query' do
- let(:node_path) { %w[name] }
- let(:sort_param) { :SIMILARITY }
- let(:first_param) { 2 }
- let(:expected_results) { [project_3.name, project_2.name, project_4.name] }
+ let(:node_path) { %w[name] }
+ let(:sort_param) { :SIMILARITY }
+ let(:first_param) { 2 }
+ let(:all_records) { [project_3.name, project_2.name, project_4.name] }
end
end
end
diff --git a/spec/requests/api/graphql/project/cluster_agents_spec.rb b/spec/requests/api/graphql/project/cluster_agents_spec.rb
new file mode 100644
index 00000000000..dc7254dd552
--- /dev/null
+++ b/spec/requests/api/graphql/project/cluster_agents_spec.rb
@@ -0,0 +1,108 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe 'Project.cluster_agents' do
+ include GraphqlHelpers
+
+ let_it_be(:project) { create(:project, :public) }
+ let_it_be(:current_user) { create(:user, maintainer_projects: [project]) }
+ let_it_be(:agents) { create_list(:cluster_agent, 5, project: project) }
+
+ let(:first) { var('Int') }
+ let(:cluster_agents_fields) { nil }
+ let(:project_fields) do
+ query_nodes(:cluster_agents, cluster_agents_fields, args: { first: first }, max_depth: 3)
+ end
+
+ let(:query) do
+ args = { full_path: project.full_path }
+
+ with_signature([first], graphql_query_for(:project, args, project_fields))
+ end
+
+ before do
+ allow(Gitlab::Kas::Client).to receive(:new).and_return(double(get_connected_agents: []))
+ end
+
+ it 'can retrieve cluster agents' do
+ post_graphql(query, current_user: current_user)
+
+ expect(graphql_data_at(:project, :cluster_agents, :nodes)).to match_array(
+ agents.map { |agent| a_hash_including('id' => global_id_of(agent)) }
+ )
+ end
+
+ context 'selecting page info' do
+ let(:project_fields) do
+ query_nodes(:cluster_agents, args: { first: first }, include_pagination_info: true)
+ end
+
+ it 'can paginate cluster agents' do
+ post_graphql(query, current_user: current_user, variables: first.with(2))
+
+ expect(graphql_data_at(:project, :cluster_agents, :page_info)).to include(
+ 'hasNextPage' => be_truthy,
+ 'hasPreviousPage' => be_falsey
+ )
+ expect(graphql_data_at(:project, :cluster_agents, :nodes)).to have_attributes(size: 2)
+ end
+ end
+
+ context 'selecting tokens' do
+ let_it_be(:token_1) { create(:cluster_agent_token, agent: agents.second) }
+ let_it_be(:token_2) { create(:cluster_agent_token, agent: agents.second, last_used_at: 3.days.ago) }
+ let_it_be(:token_3) { create(:cluster_agent_token, agent: agents.second, last_used_at: 2.days.ago) }
+
+ let(:cluster_agents_fields) { [:id, query_nodes(:tokens, of: 'ClusterAgentToken')] }
+
+ it 'can select tokens in last_used_at order' do
+ post_graphql(query, current_user: current_user)
+
+ tokens = graphql_data_at(:project, :cluster_agents, :nodes, :tokens, :nodes)
+
+ expect(tokens).to match([
+ a_hash_including('id' => global_id_of(token_3)),
+ a_hash_including('id' => global_id_of(token_2)),
+ a_hash_including('id' => global_id_of(token_1))
+ ])
+ end
+
+ it 'does not suffer from N+1 performance issues' do
+ post_graphql(query, current_user: current_user)
+
+ expect do
+ post_graphql(query, current_user: current_user)
+ end.to issue_same_number_of_queries_as { post_graphql(query, current_user: current_user, variables: [first.with(1)]) }
+ end
+ end
+
+ context 'selecting connections' do
+ let(:agent_meta) { double(version: '1', commit_id: 'abc', pod_namespace: 'namespace', pod_name: 'pod') }
+ let(:connected_agent) { double(agent_id: agents.first.id, connected_at: 123456, connection_id: 1, agent_meta: agent_meta) }
+
+ let(:metadata_fields) { query_graphql_field(:metadata, {}, [:version, :commit, :pod_namespace, :pod_name], 'AgentMetadata') }
+ let(:cluster_agents_fields) { [:id, query_nodes(:connections, [:connection_id, :connected_at, metadata_fields])] }
+
+ before do
+ allow(Gitlab::Kas::Client).to receive(:new).and_return(double(get_connected_agents: [connected_agent]))
+ end
+
+ it 'can retrieve connections and agent metadata' do
+ post_graphql(query, current_user: current_user)
+
+ connection = graphql_data_at(:project, :cluster_agents, :nodes, :connections, :nodes).first
+
+ expect(connection).to include({
+ 'connectionId' => connected_agent.connection_id.to_s,
+ 'connectedAt' => Time.at(connected_agent.connected_at),
+ 'metadata' => {
+ 'version' => agent_meta.version,
+ 'commit' => agent_meta.commit_id,
+ 'podNamespace' => agent_meta.pod_namespace,
+ 'podName' => agent_meta.pod_name
+ }
+ })
+ end
+ end
+end
diff --git a/spec/requests/api/graphql/project/container_repositories_spec.rb b/spec/requests/api/graphql/project/container_repositories_spec.rb
index 3ad56223b61..692143b2215 100644
--- a/spec/requests/api/graphql/project/container_repositories_spec.rb
+++ b/spec/requests/api/graphql/project/container_repositories_spec.rb
@@ -12,11 +12,12 @@ RSpec.describe 'getting container repositories in a project' do
let_it_be(:container_repositories) { [container_repository, container_repositories_delete_scheduled, container_repositories_delete_failed].flatten }
let_it_be(:container_expiration_policy) { project.container_expiration_policy }
+ let(:excluded_fields) { %w[pipeline jobs] }
let(:container_repositories_fields) do
<<~GQL
edges {
node {
- #{all_graphql_fields_for('container_repositories'.classify, excluded: %w(pipeline jobs))}
+ #{all_graphql_fields_for('container_repositories'.classify, excluded: excluded_fields)}
}
}
GQL
@@ -151,6 +152,12 @@ RSpec.describe 'getting container repositories in a project' do
end
end
+ it_behaves_like 'handling graphql network errors with the container registry'
+
+ it_behaves_like 'not hitting graphql network errors with the container registry' do
+ let(:excluded_fields) { %w[pipeline jobs tags tagsCount] }
+ end
+
it 'returns the total count of container repositories' do
subject
@@ -190,7 +197,7 @@ RSpec.describe 'getting container repositories in a project' do
it_behaves_like 'sorted paginated query' do
let(:sort_param) { :NAME_ASC }
let(:first_param) { 2 }
- let(:expected_results) { [container_repository2.name, container_repository1.name, container_repository4.name, container_repository3.name, container_repository5.name] }
+ let(:all_records) { [container_repository2.name, container_repository1.name, container_repository4.name, container_repository3.name, container_repository5.name] }
end
end
@@ -198,7 +205,7 @@ RSpec.describe 'getting container repositories in a project' do
it_behaves_like 'sorted paginated query' do
let(:sort_param) { :NAME_DESC }
let(:first_param) { 2 }
- let(:expected_results) { [container_repository5.name, container_repository3.name, container_repository4.name, container_repository1.name, container_repository2.name] }
+ let(:all_records) { [container_repository5.name, container_repository3.name, container_repository4.name, container_repository1.name, container_repository2.name] }
end
end
end
diff --git a/spec/requests/api/graphql/project/issues_spec.rb b/spec/requests/api/graphql/project/issues_spec.rb
index c6b4d82bf15..1c6d6ce4707 100644
--- a/spec/requests/api/graphql/project/issues_spec.rb
+++ b/spec/requests/api/graphql/project/issues_spec.rb
@@ -5,12 +5,15 @@ require 'spec_helper'
RSpec.describe 'getting an issue list for a project' do
include GraphqlHelpers
- let_it_be(:project) { create(:project, :repository, :public) }
+ let_it_be(:group) { create(:group) }
+ let_it_be(:project) { create(:project, :repository, :public, group: group) }
let_it_be(:current_user) { create(:user) }
let_it_be(:issue_a, reload: true) { create(:issue, project: project, discussion_locked: true) }
let_it_be(:issue_b, reload: true) { create(:issue, :with_alert, project: project) }
let_it_be(:issues, reload: true) { [issue_a, issue_b] }
+ let(:issue_a_gid) { issue_a.to_global_id.to_s }
+ let(:issue_b_gid) { issue_b.to_global_id.to_s }
let(:issues_data) { graphql_data['project']['issues']['edges'] }
let(:issue_filter_params) { {} }
@@ -66,9 +69,6 @@ RSpec.describe 'getting an issue list for a project' do
let_it_be(:upvote_award) { create(:award_emoji, :upvote, user: current_user, awardable: issue_a) }
- let(:issue_a_gid) { issue_a.to_global_id.to_s }
- let(:issue_b_gid) { issue_b.to_global_id.to_s }
-
where(:value, :gids) do
'thumbsup' | lazy { [issue_a_gid] }
'ANY' | lazy { [issue_a_gid] }
@@ -84,7 +84,7 @@ RSpec.describe 'getting an issue list for a project' do
it 'returns correctly filtered issues' do
post_graphql(query, current_user: current_user)
- expect(graphql_dig_at(issues_data, :node, :id)).to eq(gids)
+ expect(issues_ids).to eq(gids)
end
end
end
@@ -149,6 +149,8 @@ RSpec.describe 'getting an issue list for a project' do
create(:issue, :confidential, project: project)
end
+ let(:confidential_issue_gid) { confidential_issue.to_global_id.to_s }
+
context 'when the user cannot see confidential issues' do
it 'returns issues without confidential issues' do
post_graphql(query, current_user: current_user)
@@ -159,12 +161,34 @@ RSpec.describe 'getting an issue list for a project' do
expect(issue.dig('node', 'confidential')).to eq(false)
end
end
+
+ context 'filtering for confidential issues' do
+ let(:issue_filter_params) { { confidential: true } }
+
+ it 'returns no issues' do
+ post_graphql(query, current_user: current_user)
+
+ expect(issues_data.size).to eq(0)
+ end
+ end
+
+ context 'filtering for non-confidential issues' do
+ let(:issue_filter_params) { { confidential: false } }
+
+ it 'returns correctly filtered issues' do
+ post_graphql(query, current_user: current_user)
+
+ expect(issues_ids).to contain_exactly(issue_a_gid, issue_b_gid)
+ end
+ end
end
context 'when the user can see confidential issues' do
- it 'returns issues with confidential issues' do
+ before do
project.add_developer(current_user)
+ end
+ it 'returns issues with confidential issues' do
post_graphql(query, current_user: current_user)
expect(issues_data.size).to eq(3)
@@ -175,6 +199,26 @@ RSpec.describe 'getting an issue list for a project' do
expect(confidentials).to eq([true, false, false])
end
+
+ context 'filtering for confidential issues' do
+ let(:issue_filter_params) { { confidential: true } }
+
+ it 'returns correctly filtered issues' do
+ post_graphql(query, current_user: current_user)
+
+ expect(issues_ids).to contain_exactly(confidential_issue_gid)
+ end
+ end
+
+ context 'filtering for non-confidential issues' do
+ let(:issue_filter_params) { { confidential: false } }
+
+ it 'returns correctly filtered issues' do
+ post_graphql(query, current_user: current_user)
+
+ expect(issues_ids).to contain_exactly(issue_a_gid, issue_b_gid)
+ end
+ end
end
end
@@ -205,7 +249,7 @@ RSpec.describe 'getting an issue list for a project' do
it_behaves_like 'sorted paginated query' do
let(:sort_param) { :DUE_DATE_ASC }
let(:first_param) { 2 }
- let(:expected_results) { [due_issue3.iid, due_issue5.iid, due_issue1.iid, due_issue4.iid, due_issue2.iid] }
+ let(:all_records) { [due_issue3.iid, due_issue5.iid, due_issue1.iid, due_issue4.iid, due_issue2.iid] }
end
end
@@ -213,7 +257,7 @@ RSpec.describe 'getting an issue list for a project' do
it_behaves_like 'sorted paginated query' do
let(:sort_param) { :DUE_DATE_DESC }
let(:first_param) { 2 }
- let(:expected_results) { [due_issue1.iid, due_issue5.iid, due_issue3.iid, due_issue4.iid, due_issue2.iid] }
+ let(:all_records) { [due_issue1.iid, due_issue5.iid, due_issue3.iid, due_issue4.iid, due_issue2.iid] }
end
end
end
@@ -230,10 +274,10 @@ RSpec.describe 'getting an issue list for a project' do
it_behaves_like 'sorted paginated query' do
let(:sort_param) { :RELATIVE_POSITION_ASC }
let(:first_param) { 2 }
- let(:expected_results) do
+ let(:all_records) do
[
relative_issue5.iid, relative_issue3.iid, relative_issue1.iid,
- relative_issue4.iid, relative_issue2.iid
+ relative_issue2.iid, relative_issue4.iid
]
end
end
@@ -256,7 +300,7 @@ RSpec.describe 'getting an issue list for a project' do
it_behaves_like 'sorted paginated query' do
let(:sort_param) { :PRIORITY_ASC }
let(:first_param) { 2 }
- let(:expected_results) do
+ let(:all_records) do
[
priority_issue3.iid, priority_issue1.iid,
priority_issue2.iid, priority_issue4.iid
@@ -269,7 +313,7 @@ RSpec.describe 'getting an issue list for a project' do
it_behaves_like 'sorted paginated query' do
let(:sort_param) { :PRIORITY_DESC }
let(:first_param) { 2 }
- let(:expected_results) do
+ let(:all_records) do
[priority_issue1.iid, priority_issue3.iid, priority_issue2.iid, priority_issue4.iid]
end
end
@@ -288,17 +332,17 @@ RSpec.describe 'getting an issue list for a project' do
context 'when ascending' do
it_behaves_like 'sorted paginated query' do
- let(:sort_param) { :LABEL_PRIORITY_ASC }
- let(:first_param) { 2 }
- let(:expected_results) { [label_issue3.iid, label_issue1.iid, label_issue2.iid, label_issue4.iid] }
+ let(:sort_param) { :LABEL_PRIORITY_ASC }
+ let(:first_param) { 2 }
+ let(:all_records) { [label_issue3.iid, label_issue1.iid, label_issue2.iid, label_issue4.iid] }
end
end
context 'when descending' do
it_behaves_like 'sorted paginated query' do
- let(:sort_param) { :LABEL_PRIORITY_DESC }
- let(:first_param) { 2 }
- let(:expected_results) { [label_issue2.iid, label_issue3.iid, label_issue1.iid, label_issue4.iid] }
+ let(:sort_param) { :LABEL_PRIORITY_DESC }
+ let(:first_param) { 2 }
+ let(:all_records) { [label_issue2.iid, label_issue3.iid, label_issue1.iid, label_issue4.iid] }
end
end
end
@@ -313,17 +357,17 @@ RSpec.describe 'getting an issue list for a project' do
context 'when ascending' do
it_behaves_like 'sorted paginated query' do
- let(:sort_param) { :MILESTONE_DUE_ASC }
- let(:first_param) { 2 }
- let(:expected_results) { [milestone_issue2.iid, milestone_issue3.iid, milestone_issue1.iid] }
+ let(:sort_param) { :MILESTONE_DUE_ASC }
+ let(:first_param) { 2 }
+ let(:all_records) { [milestone_issue2.iid, milestone_issue3.iid, milestone_issue1.iid] }
end
end
context 'when descending' do
it_behaves_like 'sorted paginated query' do
- let(:sort_param) { :MILESTONE_DUE_DESC }
- let(:first_param) { 2 }
- let(:expected_results) { [milestone_issue3.iid, milestone_issue2.iid, milestone_issue1.iid] }
+ let(:sort_param) { :MILESTONE_DUE_DESC }
+ let(:first_param) { 2 }
+ let(:all_records) { [milestone_issue3.iid, milestone_issue2.iid, milestone_issue1.iid] }
end
end
end
@@ -366,6 +410,35 @@ RSpec.describe 'getting an issue list for a project' do
end
end
+ context 'when fetching customer_relations_contacts' do
+ let(:fields) do
+ <<~QUERY
+ nodes {
+ id
+ customerRelationsContacts {
+ nodes {
+ firstName
+ }
+ }
+ }
+ QUERY
+ end
+
+ def clean_state_query
+ run_with_clean_state(query, context: { current_user: current_user })
+ end
+
+ it 'avoids N+1 queries' do
+ create(:contact, group_id: group.id, issues: [issue_a])
+
+ control = ActiveRecord::QueryRecorder.new(skip_cached: false) { clean_state_query }
+
+ create(:contact, group_id: group.id, issues: [issue_a])
+
+ expect { clean_state_query }.not_to exceed_all_query_limit(control)
+ end
+ end
+
context 'when fetching labels' do
let(:fields) do
<<~QUERY
@@ -526,4 +599,8 @@ RSpec.describe 'getting an issue list for a project' do
include_examples 'N+1 query check'
end
end
+
+ def issues_ids
+ graphql_dig_at(issues_data, :node, :id)
+ end
end
diff --git a/spec/requests/api/graphql/project/merge_request/pipelines_spec.rb b/spec/requests/api/graphql/project/merge_request/pipelines_spec.rb
index 70c5bda35e1..820a5d818c7 100644
--- a/spec/requests/api/graphql/project/merge_request/pipelines_spec.rb
+++ b/spec/requests/api/graphql/project/merge_request/pipelines_spec.rb
@@ -39,7 +39,7 @@ RSpec.describe 'Query.project.mergeRequests.pipelines' do
before do
merge_requests.each do |mr|
- shas = mr.all_commits.limit(2).pluck(:sha)
+ shas = mr.recent_diff_head_shas
shas.each do |sha|
create(:ci_pipeline, :success, project: project, ref: mr.source_branch, sha: sha)
@@ -52,7 +52,7 @@ RSpec.describe 'Query.project.mergeRequests.pipelines' do
p_nodes = graphql_data_at(:project, :merge_requests, :nodes)
- expect(p_nodes).to all(match('iid' => be_present, 'pipelines' => match('count' => 2)))
+ expect(p_nodes).to all(match('iid' => be_present, 'pipelines' => match('count' => 1)))
end
it 'is scalable', :request_store, :use_clean_rails_memory_store_caching do
diff --git a/spec/requests/api/graphql/project/merge_requests_spec.rb b/spec/requests/api/graphql/project/merge_requests_spec.rb
index 1b0405be09c..b0bedd99fce 100644
--- a/spec/requests/api/graphql/project/merge_requests_spec.rb
+++ b/spec/requests/api/graphql/project/merge_requests_spec.rb
@@ -385,7 +385,7 @@ RSpec.describe 'getting merge request listings nested in a project' do
context 'when sorting by merged_at DESC' do
let(:sort_param) { :MERGED_AT_DESC }
- let(:expected_results) do
+ let(:all_records) do
[
merge_request_b,
merge_request_d,
@@ -418,14 +418,14 @@ RSpec.describe 'getting merge request listings nested in a project' do
query = pagination_query(params)
post_graphql(query, current_user: current_user)
- expect(results.map { |item| item["id"] }).to eq(expected_results.last(2))
+ expect(results.map { |item| item["id"] }).to eq(all_records.last(2))
end
end
end
context 'when sorting by closed_at DESC' do
let(:sort_param) { :CLOSED_AT_DESC }
- let(:expected_results) do
+ let(:all_records) do
[
merge_request_b,
merge_request_d,
@@ -458,7 +458,7 @@ RSpec.describe 'getting merge request listings nested in a project' do
query = pagination_query(params)
post_graphql(query, current_user: current_user)
- expect(results.map { |item| item["id"] }).to eq(expected_results.last(2))
+ expect(results.map { |item| item["id"] }).to eq(all_records.last(2))
end
end
end
diff --git a/spec/requests/api/graphql/project/releases_spec.rb b/spec/requests/api/graphql/project/releases_spec.rb
index 8ccdb955ed9..2816ce90a6b 100644
--- a/spec/requests/api/graphql/project/releases_spec.rb
+++ b/spec/requests/api/graphql/project/releases_spec.rb
@@ -322,17 +322,17 @@ RSpec.describe 'Query.project(fullPath).releases()' do
context 'when ascending' do
it_behaves_like 'sorted paginated query' do
- let(:sort_param) { :RELEASED_AT_ASC }
- let(:first_param) { 2 }
- let(:expected_results) { [release1.tag, release2.tag, release3.tag, release4.tag, release5.tag] }
+ let(:sort_param) { :RELEASED_AT_ASC }
+ let(:first_param) { 2 }
+ let(:all_records) { [release1.tag, release2.tag, release3.tag, release4.tag, release5.tag] }
end
end
context 'when descending' do
it_behaves_like 'sorted paginated query' do
- let(:sort_param) { :RELEASED_AT_DESC }
- let(:first_param) { 2 }
- let(:expected_results) { [release5.tag, release4.tag, release3.tag, release2.tag, release1.tag] }
+ let(:sort_param) { :RELEASED_AT_DESC }
+ let(:first_param) { 2 }
+ let(:all_records) { [release5.tag, release4.tag, release3.tag, release2.tag, release1.tag] }
end
end
end
@@ -346,17 +346,17 @@ RSpec.describe 'Query.project(fullPath).releases()' do
context 'when ascending' do
it_behaves_like 'sorted paginated query' do
- let(:sort_param) { :CREATED_ASC }
- let(:first_param) { 2 }
- let(:expected_results) { [release1.tag, release2.tag, release3.tag, release4.tag, release5.tag] }
+ let(:sort_param) { :CREATED_ASC }
+ let(:first_param) { 2 }
+ let(:all_records) { [release1.tag, release2.tag, release3.tag, release4.tag, release5.tag] }
end
end
context 'when descending' do
it_behaves_like 'sorted paginated query' do
- let(:sort_param) { :CREATED_DESC }
- let(:first_param) { 2 }
- let(:expected_results) { [release5.tag, release4.tag, release3.tag, release2.tag, release1.tag] }
+ let(:sort_param) { :CREATED_DESC }
+ let(:first_param) { 2 }
+ let(:all_records) { [release5.tag, release4.tag, release3.tag, release2.tag, release1.tag] }
end
end
end
diff --git a/spec/requests/api/graphql/users_spec.rb b/spec/requests/api/graphql/users_spec.rb
index 22b68fbc9bb..67cd35ee545 100644
--- a/spec/requests/api/graphql/users_spec.rb
+++ b/spec/requests/api/graphql/users_spec.rb
@@ -114,17 +114,17 @@ RSpec.describe 'Users' do
context 'when ascending' do
it_behaves_like 'sorted paginated query' do
- let(:sort_param) { :CREATED_ASC }
- let(:first_param) { 1 }
- let(:expected_results) { ascending_users }
+ let(:sort_param) { :CREATED_ASC }
+ let(:first_param) { 1 }
+ let(:all_records) { ascending_users }
end
end
context 'when descending' do
it_behaves_like 'sorted paginated query' do
- let(:sort_param) { :CREATED_DESC }
- let(:first_param) { 1 }
- let(:expected_results) { ascending_users.reverse }
+ let(:sort_param) { :CREATED_DESC }
+ let(:first_param) { 1 }
+ let(:all_records) { ascending_users.reverse }
end
end
end
diff --git a/spec/requests/api/group_container_repositories_spec.rb b/spec/requests/api/group_container_repositories_spec.rb
index fdbf910e4bc..bf29bd91414 100644
--- a/spec/requests/api/group_container_repositories_spec.rb
+++ b/spec/requests/api/group_container_repositories_spec.rb
@@ -20,12 +20,14 @@ RSpec.describe API::GroupContainerRepositories do
end
let(:api_user) { reporter }
+ let(:params) { {} }
before do
group.add_reporter(reporter)
group.add_guest(guest)
stub_container_registry_config(enabled: true)
+ stub_container_registry_info
root_repository
test_repository
@@ -35,10 +37,13 @@ RSpec.describe API::GroupContainerRepositories do
let(:url) { "/groups/#{group.id}/registry/repositories" }
let(:snowplow_gitlab_standard_context) { { user: api_user, namespace: group } }
- subject { get api(url, api_user) }
+ subject { get api(url, api_user), params: params }
it_behaves_like 'rejected container repository access', :guest, :forbidden
it_behaves_like 'rejected container repository access', :anonymous, :not_found
+ it_behaves_like 'handling network errors with the container registry' do
+ let(:params) { { tags: true } }
+ end
it_behaves_like 'returns repositories for allowed users', :reporter, 'group' do
let(:object) { group }
diff --git a/spec/requests/api/groups_spec.rb b/spec/requests/api/groups_spec.rb
index 38abedde7da..2c7e2ecff85 100644
--- a/spec/requests/api/groups_spec.rb
+++ b/spec/requests/api/groups_spec.rb
@@ -728,16 +728,16 @@ RSpec.describe API::Groups do
end
it 'avoids N+1 queries with project links' do
- get api("/groups/#{group1.id}", admin)
+ get api("/groups/#{group1.id}", user1)
control_count = ActiveRecord::QueryRecorder.new do
- get api("/groups/#{group1.id}", admin)
+ get api("/groups/#{group1.id}", user1)
end.count
create(:project, namespace: group1)
expect do
- get api("/groups/#{group1.id}", admin)
+ get api("/groups/#{group1.id}", user1)
end.not_to exceed_query_limit(control_count)
end
@@ -746,7 +746,7 @@ RSpec.describe API::Groups do
create(:group_group_link, shared_group: group1, shared_with_group: create(:group))
control_count = ActiveRecord::QueryRecorder.new do
- get api("/groups/#{group1.id}", admin)
+ get api("/groups/#{group1.id}", user1)
end.count
# setup "n" more shared groups
@@ -755,7 +755,7 @@ RSpec.describe API::Groups do
# test that no of queries for 1 shared group is same as for n shared groups
expect do
- get api("/groups/#{group1.id}", admin)
+ get api("/groups/#{group1.id}", user1)
end.not_to exceed_query_limit(control_count)
end
end
@@ -1179,6 +1179,20 @@ RSpec.describe API::Groups do
expect(json_response.length).to eq(1)
expect(json_response.first['name']).to eq(project1.name)
end
+
+ it 'avoids N+1 queries' do
+ get api("/groups/#{group1.id}/projects", user1)
+
+ control_count = ActiveRecord::QueryRecorder.new do
+ get api("/groups/#{group1.id}/projects", user1)
+ end.count
+
+ create(:project, namespace: group1)
+
+ expect do
+ get api("/groups/#{group1.id}/projects", user1)
+ end.not_to exceed_query_limit(control_count)
+ end
end
context "when authenticated as admin" do
@@ -1196,20 +1210,6 @@ RSpec.describe API::Groups do
expect(response).to have_gitlab_http_status(:not_found)
end
-
- it 'avoids N+1 queries' do
- get api("/groups/#{group1.id}/projects", admin)
-
- control_count = ActiveRecord::QueryRecorder.new do
- get api("/groups/#{group1.id}/projects", admin)
- end.count
-
- create(:project, namespace: group1)
-
- expect do
- get api("/groups/#{group1.id}/projects", admin)
- end.not_to exceed_query_limit(control_count)
- end
end
context 'when using group path in URL' do
diff --git a/spec/requests/api/helm_packages_spec.rb b/spec/requests/api/helm_packages_spec.rb
index 3236857c5fc..5212e225351 100644
--- a/spec/requests/api/helm_packages_spec.rb
+++ b/spec/requests/api/helm_packages_spec.rb
@@ -18,11 +18,11 @@ RSpec.describe API::HelmPackages do
let_it_be(:other_package) { create(:npm_package, project: project) }
describe 'GET /api/v4/projects/:id/packages/helm/:channel/index.yaml' do
- let(:url) { "/projects/#{project_id}/packages/helm/stable/index.yaml" }
+ let(:project_id) { project.id }
+ let(:channel) { 'stable' }
+ let(:url) { "/projects/#{project_id}/packages/helm/#{channel}/index.yaml" }
context 'with a project id' do
- let(:project_id) { project.id }
-
it_behaves_like 'handling helm chart index requests'
end
@@ -31,6 +31,18 @@ RSpec.describe API::HelmPackages do
it_behaves_like 'handling helm chart index requests'
end
+
+ context 'with dot in channel' do
+ let(:channel) { 'with.dot' }
+
+ subject { get api(url) }
+
+ before do
+ project.update!(visibility: 'public')
+ end
+
+ it_behaves_like 'returning response status', :success
+ end
end
describe 'GET /api/v4/projects/:id/packages/helm/:channel/charts/:file_name.tgz' do
diff --git a/spec/requests/api/integrations_spec.rb b/spec/requests/api/integrations_spec.rb
new file mode 100644
index 00000000000..649647804c0
--- /dev/null
+++ b/spec/requests/api/integrations_spec.rb
@@ -0,0 +1,363 @@
+# frozen_string_literal: true
+
+require "spec_helper"
+
+RSpec.describe API::Integrations do
+ let_it_be(:user) { create(:user) }
+ let_it_be(:user2) { create(:user) }
+
+ let_it_be(:project, reload: true) do
+ create(:project, creator_id: user.id, namespace: user.namespace)
+ end
+
+ %w[integrations services].each do |endpoint|
+ describe "GET /projects/:id/#{endpoint}" do
+ it 'returns authentication error when unauthenticated' do
+ get api("/projects/#{project.id}/#{endpoint}")
+
+ expect(response).to have_gitlab_http_status(:unauthorized)
+ end
+
+ it "returns error when authenticated but user is not a project owner" do
+ project.add_developer(user2)
+ get api("/projects/#{project.id}/#{endpoint}", user2)
+
+ expect(response).to have_gitlab_http_status(:forbidden)
+ end
+
+ context 'with integrations' do
+ let!(:active_integration) { create(:emails_on_push_integration, project: project, active: true) }
+ let!(:integration) { create(:custom_issue_tracker_integration, project: project, active: false) }
+
+ it "returns a list of all active integrations" do
+ get api("/projects/#{project.id}/#{endpoint}", user)
+
+ aggregate_failures 'expect successful response with all active integrations' do
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(json_response).to be_an Array
+ expect(json_response.count).to eq(1)
+ expect(json_response.first['slug']).to eq('emails-on-push')
+ expect(response).to match_response_schema('public_api/v4/integrations')
+ end
+ end
+ end
+ end
+
+ Integration.available_integration_names.each do |integration|
+ describe "PUT /projects/:id/#{endpoint}/#{integration.dasherize}" do
+ include_context integration
+
+ it "updates #{integration} settings" do
+ put api("/projects/#{project.id}/#{endpoint}/#{dashed_integration}", user), params: integration_attrs
+
+ expect(response).to have_gitlab_http_status(:ok)
+
+ current_integration = project.integrations.first
+ events = current_integration.event_names.empty? ? ["foo"].freeze : current_integration.event_names
+ query_strings = []
+ events.each do |event|
+ query_strings << "#{event}=#{!current_integration[event]}"
+ end
+ query_strings = query_strings.join('&')
+
+ put api("/projects/#{project.id}/#{endpoint}/#{dashed_integration}?#{query_strings}", user), params: integration_attrs
+
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(json_response['slug']).to eq(dashed_integration)
+ events.each do |event|
+ next if event == "foo"
+
+ expect(project.integrations.first[event]).not_to eq(current_integration[event]),
+ "expected #{!current_integration[event]} for event #{event} for #{endpoint} #{current_integration.title}, got #{current_integration[event]}"
+ end
+ end
+
+ it "returns if required fields missing" do
+ required_attributes = integration_attrs_list.select do |attr|
+ integration_klass.validators_on(attr).any? do |v|
+ v.instance_of?(ActiveRecord::Validations::PresenceValidator) &&
+ # exclude presence validators with conditional since those are not really required
+ ![:if, :unless].any? { |cond| v.options.include?(cond) }
+ end
+ end
+
+ if required_attributes.empty?
+ expected_code = :ok
+ else
+ integration_attrs.delete(required_attributes.sample)
+ expected_code = :bad_request
+ end
+
+ put api("/projects/#{project.id}/#{endpoint}/#{dashed_integration}", user), params: integration_attrs
+
+ expect(response).to have_gitlab_http_status(expected_code)
+ end
+ end
+
+ describe "DELETE /projects/:id/#{endpoint}/#{integration.dasherize}" do
+ include_context integration
+
+ before do
+ initialize_integration(integration)
+ end
+
+ it "deletes #{integration}" do
+ delete api("/projects/#{project.id}/#{endpoint}/#{dashed_integration}", user)
+
+ expect(response).to have_gitlab_http_status(:no_content)
+ project.send(integration_method).reload
+ expect(project.send(integration_method).activated?).to be_falsey
+ end
+ end
+
+ describe "GET /projects/:id/#{endpoint}/#{integration.dasherize}" do
+ include_context integration
+
+ let!(:initialized_integration) { initialize_integration(integration, active: true) }
+
+ let_it_be(:project2) do
+ create(:project, creator_id: user.id, namespace: user.namespace)
+ end
+
+ def deactive_integration!
+ return initialized_integration.update!(active: false) unless initialized_integration.is_a?(::Integrations::Prometheus)
+
+ # Integrations::Prometheus sets `#active` itself within a `before_save`:
+ initialized_integration.manual_configuration = false
+ initialized_integration.save!
+ end
+
+ it 'returns authentication error when unauthenticated' do
+ get api("/projects/#{project.id}/#{endpoint}/#{dashed_integration}")
+ expect(response).to have_gitlab_http_status(:unauthorized)
+ end
+
+ it "returns all properties of active integration #{integration}" do
+ get api("/projects/#{project.id}/#{endpoint}/#{dashed_integration}", user)
+
+ expect(initialized_integration).to be_active
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(json_response['properties'].keys).to match_array(integration_instance.api_field_names)
+ end
+
+ it "returns all properties of inactive integration #{integration}" do
+ deactive_integration!
+
+ get api("/projects/#{project.id}/#{endpoint}/#{dashed_integration}", user)
+
+ expect(initialized_integration).not_to be_active
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(json_response['properties'].keys).to match_array(integration_instance.api_field_names)
+ end
+
+ it "returns not found if integration does not exist" do
+ get api("/projects/#{project2.id}/#{endpoint}/#{dashed_integration}", user)
+
+ expect(response).to have_gitlab_http_status(:not_found)
+ expect(json_response['message']).to eq('404 Integration Not Found')
+ end
+
+ it "returns not found if integration exists but is in `Project#disabled_integrations`" do
+ expect_next_found_instance_of(Project) do |project|
+ expect(project).to receive(:disabled_integrations).at_least(:once).and_return([integration])
+ end
+
+ get api("/projects/#{project.id}/#{endpoint}/#{dashed_integration}", user)
+
+ expect(response).to have_gitlab_http_status(:not_found)
+ expect(json_response['message']).to eq('404 Integration Not Found')
+ end
+
+ it "returns error when authenticated but not a project owner" do
+ project.add_developer(user2)
+ get api("/projects/#{project.id}/#{endpoint}/#{dashed_integration}", user2)
+
+ expect(response).to have_gitlab_http_status(:forbidden)
+ end
+ end
+ end
+
+ describe "POST /projects/:id/#{endpoint}/:slug/trigger" do
+ describe 'Mattermost integration' do
+ let(:integration_name) { 'mattermost_slash_commands' }
+
+ context 'when no integration is available' do
+ it 'returns a not found message' do
+ post api("/projects/#{project.id}/#{endpoint}/idonotexist/trigger")
+
+ expect(response).to have_gitlab_http_status(:not_found)
+ expect(json_response["error"]).to eq("404 Not Found")
+ end
+ end
+
+ context 'when the integration exists' do
+ let(:params) { { token: 'token' } }
+
+ context 'when the integration is not active' do
+ before do
+ project.create_mattermost_slash_commands_integration(
+ active: false,
+ properties: params
+ )
+ end
+
+ it 'when the integration is inactive' do
+ post api("/projects/#{project.id}/#{endpoint}/#{integration_name}/trigger"), params: params
+
+ expect(response).to have_gitlab_http_status(:not_found)
+ end
+ end
+
+ context 'when the integration is active' do
+ before do
+ project.create_mattermost_slash_commands_integration(
+ active: true,
+ properties: params
+ )
+ end
+
+ it 'returns status 200' do
+ post api("/projects/#{project.id}/#{endpoint}/#{integration_name}/trigger"), params: params
+
+ expect(response).to have_gitlab_http_status(:ok)
+ end
+ end
+
+ context 'when the project can not be found' do
+ it 'returns a generic 404' do
+ post api("/projects/404/#{endpoint}/#{integration_name}/trigger"), params: params
+
+ expect(response).to have_gitlab_http_status(:not_found)
+ expect(json_response["message"]).to eq("404 Integration Not Found")
+ end
+ end
+ end
+ end
+
+ describe 'Slack Integration' do
+ let(:integration_name) { 'slack_slash_commands' }
+
+ before do
+ project.create_slack_slash_commands_integration(
+ active: true,
+ properties: { token: 'token' }
+ )
+ end
+
+ it 'returns status 200' do
+ post api("/projects/#{project.id}/#{endpoint}/#{integration_name}/trigger"), params: { token: 'token', text: 'help' }
+
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(json_response['response_type']).to eq("ephemeral")
+ end
+ end
+ end
+
+ describe 'Mattermost integration' do
+ let(:integration_name) { 'mattermost' }
+ let(:params) do
+ { webhook: 'https://hook.example.com', username: 'username' }
+ end
+
+ before do
+ project.create_mattermost_integration(
+ active: true,
+ properties: params
+ )
+ end
+
+ it 'accepts a username for update' do
+ put api("/projects/#{project.id}/#{endpoint}/#{integration_name}", user), params: params.merge(username: 'new_username')
+
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(json_response['properties']['username']).to eq('new_username')
+ end
+ end
+
+ describe 'Microsoft Teams integration' do
+ let(:integration_name) { 'microsoft-teams' }
+ let(:params) do
+ {
+ webhook: 'https://hook.example.com',
+ branches_to_be_notified: 'default',
+ notify_only_broken_pipelines: false
+ }
+ end
+
+ before do
+ project.create_microsoft_teams_integration(
+ active: true,
+ properties: params
+ )
+ end
+
+ it 'accepts branches_to_be_notified for update' do
+ put api("/projects/#{project.id}/#{endpoint}/#{integration_name}", user),
+ params: params.merge(branches_to_be_notified: 'all')
+
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(json_response['properties']['branches_to_be_notified']).to eq('all')
+ end
+
+ it 'accepts notify_only_broken_pipelines for update' do
+ put api("/projects/#{project.id}/#{endpoint}/#{integration_name}", user),
+ params: params.merge(notify_only_broken_pipelines: true)
+
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(json_response['properties']['notify_only_broken_pipelines']).to eq(true)
+ end
+ end
+
+ describe 'Hangouts Chat integration' do
+ let(:integration_name) { 'hangouts-chat' }
+ let(:params) do
+ {
+ webhook: 'https://hook.example.com',
+ branches_to_be_notified: 'default'
+ }
+ end
+
+ before do
+ project.create_hangouts_chat_integration(
+ active: true,
+ properties: params
+ )
+ end
+
+ it 'accepts branches_to_be_notified for update', :aggregate_failures do
+ put api("/projects/#{project.id}/#{endpoint}/#{integration_name}", user), params: params.merge(branches_to_be_notified: 'all')
+
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(json_response['properties']['branches_to_be_notified']).to eq('all')
+ end
+
+ it 'only requires the webhook param' do
+ put api("/projects/#{project.id}/#{endpoint}/#{integration_name}", user), params: { webhook: 'https://hook.example.com' }
+
+ expect(response).to have_gitlab_http_status(:ok)
+ end
+ end
+
+ describe 'Pipelines Email Integration' do
+ let(:integration_name) { 'pipelines-email' }
+
+ context 'notify_only_broken_pipelines property was saved as a string' do
+ before do
+ project.create_pipelines_email_integration(
+ active: false,
+ properties: {
+ "notify_only_broken_pipelines": "true",
+ "branches_to_be_notified": "default"
+ }
+ )
+ end
+
+ it 'returns boolean values for notify_only_broken_pipelines' do
+ get api("/projects/#{project.id}/#{endpoint}/#{integration_name}", user)
+
+ expect(json_response['properties']['notify_only_broken_pipelines']).to eq(true)
+ end
+ end
+ end
+ end
+end
diff --git a/spec/requests/api/internal/base_spec.rb b/spec/requests/api/internal/base_spec.rb
index 49756df61c6..aeca4e435f4 100644
--- a/spec/requests/api/internal/base_spec.rb
+++ b/spec/requests/api/internal/base_spec.rb
@@ -609,7 +609,7 @@ RSpec.describe API::Internal::Base do
end
context 'with Project' do
- it_behaves_like 'storing arguments in the application context' do
+ it_behaves_like 'storing arguments in the application context for the API' do
let(:expected_params) { { user: key.user.username, project: project.full_path, caller_id: "POST /api/:version/internal/allowed" } }
subject { push(key, project) }
@@ -617,7 +617,7 @@ RSpec.describe API::Internal::Base do
end
context 'with PersonalSnippet' do
- it_behaves_like 'storing arguments in the application context' do
+ it_behaves_like 'storing arguments in the application context for the API' do
let(:expected_params) { { user: key.user.username, caller_id: "POST /api/:version/internal/allowed" } }
subject { push(key, personal_snippet) }
@@ -625,7 +625,7 @@ RSpec.describe API::Internal::Base do
end
context 'with ProjectSnippet' do
- it_behaves_like 'storing arguments in the application context' do
+ it_behaves_like 'storing arguments in the application context for the API' do
let(:expected_params) { { user: key.user.username, project: project_snippet.project.full_path, caller_id: "POST /api/:version/internal/allowed" } }
subject { push(key, project_snippet) }
@@ -1197,7 +1197,7 @@ RSpec.describe API::Internal::Base do
subject
end
- it_behaves_like 'storing arguments in the application context' do
+ it_behaves_like 'storing arguments in the application context for the API' do
let(:expected_params) { expected_context }
end
end
diff --git a/spec/requests/api/internal/kubernetes_spec.rb b/spec/requests/api/internal/kubernetes_spec.rb
index 24422f7b0dd..245e4e6ba15 100644
--- a/spec/requests/api/internal/kubernetes_spec.rb
+++ b/spec/requests/api/internal/kubernetes_spec.rb
@@ -177,94 +177,4 @@ RSpec.describe API::Internal::Kubernetes do
end
end
end
-
- describe 'GET /internal/kubernetes/project_info' do
- def send_request(headers: {}, params: {})
- get api('/internal/kubernetes/project_info'), params: params, headers: headers.reverse_merge(jwt_auth_headers)
- end
-
- include_examples 'authorization'
- include_examples 'agent authentication'
-
- context 'an agent is found' do
- let_it_be(:agent_token) { create(:cluster_agent_token) }
-
- shared_examples 'agent token tracking'
-
- context 'project is public' do
- let(:project) { create(:project, :public) }
-
- it 'returns expected data', :aggregate_failures do
- send_request(params: { id: project.id }, headers: { 'Authorization' => "Bearer #{agent_token.token}" })
-
- expect(response).to have_gitlab_http_status(:success)
-
- expect(json_response).to match(
- a_hash_including(
- 'project_id' => project.id,
- 'gitaly_info' => a_hash_including(
- 'address' => match(/\.socket$/),
- 'token' => 'secret',
- 'features' => {}
- ),
- 'gitaly_repository' => a_hash_including(
- 'storage_name' => project.repository_storage,
- 'relative_path' => project.disk_path + '.git',
- 'gl_repository' => "project-#{project.id}",
- 'gl_project_path' => project.full_path
- )
- )
- )
- end
-
- context 'repository is for project members only' do
- let(:project) { create(:project, :public, :repository_private) }
-
- it 'returns 404' do
- send_request(params: { id: project.id }, headers: { 'Authorization' => "Bearer #{agent_token.token}" })
-
- expect(response).to have_gitlab_http_status(:not_found)
- end
- end
- end
-
- context 'project is private' do
- let(:project) { create(:project, :private) }
-
- it 'returns 404' do
- send_request(params: { id: project.id }, headers: { 'Authorization' => "Bearer #{agent_token.token}" })
-
- expect(response).to have_gitlab_http_status(:not_found)
- end
-
- context 'and agent belongs to project' do
- let(:agent_token) { create(:cluster_agent_token, agent: create(:cluster_agent, project: project)) }
-
- it 'returns 200' do
- send_request(params: { id: project.id }, headers: { 'Authorization' => "Bearer #{agent_token.token}" })
-
- expect(response).to have_gitlab_http_status(:success)
- end
- end
- end
-
- context 'project is internal' do
- let(:project) { create(:project, :internal) }
-
- it 'returns 404' do
- send_request(params: { id: project.id }, headers: { 'Authorization' => "Bearer #{agent_token.token}" })
-
- expect(response).to have_gitlab_http_status(:not_found)
- end
- end
-
- context 'project does not exist' do
- it 'returns 404' do
- send_request(params: { id: non_existing_record_id }, headers: { 'Authorization' => "Bearer #{agent_token.token}" })
-
- expect(response).to have_gitlab_http_status(:not_found)
- end
- end
- end
- end
end
diff --git a/spec/requests/api/issues/issues_spec.rb b/spec/requests/api/issues/issues_spec.rb
index 8a33e63b80b..9204ee4d7f0 100644
--- a/spec/requests/api/issues/issues_spec.rb
+++ b/spec/requests/api/issues/issues_spec.rb
@@ -138,6 +138,12 @@ RSpec.describe API::Issues do
expect(json_response).to be_an Array
end
+ it_behaves_like 'issuable anonymous search' do
+ let(:url) { '/issues' }
+ let(:issuable) { issue }
+ let(:result) { issuable.id }
+ end
+
it 'returns authentication error without any scope' do
get api('/issues')
@@ -256,6 +262,38 @@ RSpec.describe API::Issues do
it_behaves_like 'issues statistics'
end
+
+ context 'with search param' do
+ let(:params) { { scope: 'all', search: 'foo' } }
+ let(:counts) { { all: 1, closed: 0, opened: 1 } }
+
+ it_behaves_like 'issues statistics'
+
+ context 'with anonymous user' do
+ let(:user) { nil }
+
+ context 'with disable_anonymous_search disabled' do
+ before do
+ stub_feature_flags(disable_anonymous_search: false)
+ end
+
+ it_behaves_like 'issues statistics'
+ end
+
+ context 'with disable_anonymous_search enabled' do
+ before do
+ stub_feature_flags(disable_anonymous_search: true)
+ end
+
+ it 'returns a unprocessable entity 422' do
+ get api("/issues_statistics"), params: params
+
+ expect(response).to have_gitlab_http_status(:unprocessable_entity)
+ expect(json_response['message']).to include('User must be authenticated to use search')
+ end
+ end
+ end
+ end
end
end
diff --git a/spec/requests/api/issues/post_projects_issues_spec.rb b/spec/requests/api/issues/post_projects_issues_spec.rb
index 9d3bd26a200..82692366589 100644
--- a/spec/requests/api/issues/post_projects_issues_spec.rb
+++ b/spec/requests/api/issues/post_projects_issues_spec.rb
@@ -8,15 +8,15 @@ RSpec.describe API::Issues do
create(:project, :public, creator_id: user.id, namespace: user.namespace)
end
- let(:user2) { create(:user) }
- let(: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(: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(:milestone) { create(:milestone, title: '1.0.0', project: project) }
+ let_it_be(:assignee) { create(:assignee) }
+ let_it_be(:admin) { create(:user, :admin) }
+
+ let_it_be(:closed_issue) do
create :closed_issue,
author: user,
assignees: [user],
@@ -28,7 +28,7 @@ RSpec.describe API::Issues do
closed_at: 1.hour.ago
end
- let!(:confidential_issue) do
+ let_it_be(:confidential_issue) do
create :issue,
:confidential,
project: project,
@@ -38,7 +38,7 @@ RSpec.describe API::Issues do
updated_at: 2.hours.ago
end
- let!(:issue) do
+ let_it_be(:issue) do
create :issue,
author: user,
assignees: [user],
@@ -46,22 +46,21 @@ RSpec.describe API::Issues do
milestone: milestone,
created_at: generate(:past_time),
updated_at: 1.hour.ago,
- title: issue_title,
- description: issue_description
+ title: 'foo',
+ description: 'closed'
end
+ let_it_be(:note) { create(:note_on_issue, author: user, project: project, noteable: issue) }
+
let_it_be(:label) do
create(:label, title: 'label', color: '#FFAABB', project: project)
end
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!(:note) { create(:note_on_issue, author: user, project: project, noteable: issue) }
-
let(:no_milestone_title) { 'None' }
let(:any_milestone_title) { 'Any' }
@@ -400,16 +399,15 @@ RSpec.describe API::Issues do
end
context 'when request exceeds the rate limit' do
- before do
+ it 'prevents users from creating more issues' do
allow(::Gitlab::ApplicationRateLimiter).to receive(:throttled?).and_return(true)
- end
- it 'prevents users from creating more issues' do
post api("/projects/#{project.id}/issues", user),
params: { title: 'new issue', labels: 'label, label2', weight: 3, assignee_ids: [user2.id] }
- expect(response).to have_gitlab_http_status(:too_many_requests)
expect(json_response['message']['error']).to eq('This endpoint has been requested too many times. Try again later.')
+
+ expect(response).to have_gitlab_http_status(:too_many_requests)
end
end
end
@@ -517,7 +515,7 @@ RSpec.describe API::Issues do
end
context 'when using the issue ID instead of iid' do
- it 'returns 404 when trying to move an issue' do
+ it 'returns 404 when trying to move an issue', quarantine: 'https://gitlab.com/gitlab-org/gitlab/-/issues/341520' do
post api("/projects/#{project.id}/issues/#{issue.id}/move", user),
params: { to_project_id: target_project.id }
@@ -556,6 +554,114 @@ RSpec.describe API::Issues do
end
end
+ describe '/projects/:id/issues/:issue_iid/clone' do
+ let_it_be(:valid_target_project) { create(:project) }
+ let_it_be(:invalid_target_project) { create(:project) }
+
+ before_all do
+ valid_target_project.add_maintainer(user)
+ end
+
+ context 'when user can admin the issue' do
+ context 'when the user can admin the target project' do
+ it 'clones the issue' do
+ expect do
+ post_clone_issue(user, issue, valid_target_project)
+ end.to change { valid_target_project.issues.count }.by(1)
+
+ cloned_issue = Issue.last
+
+ expect(cloned_issue.notes.count).to eq(2)
+ expect(cloned_issue.notes.pluck(:note)).not_to include(issue.notes.first.note)
+ expect(response).to have_gitlab_http_status(:created)
+ expect(json_response['id']).to eq(cloned_issue.id)
+ expect(json_response['project_id']).to eq(valid_target_project.id)
+ end
+
+ context 'when target project is the same source project' do
+ it 'clones the issue' do
+ expect do
+ post_clone_issue(user, issue, issue.project)
+ end.to change { issue.reset.project.issues.count }.by(1)
+
+ cloned_issue = Issue.last
+
+ expect(cloned_issue.notes.count).to eq(2)
+ expect(cloned_issue.notes.pluck(:note)).not_to include(issue.notes.first.note)
+ expect(response).to have_gitlab_http_status(:created)
+ expect(json_response['id']).to eq(cloned_issue.id)
+ expect(json_response['project_id']).to eq(issue.project.id)
+ end
+ end
+ end
+ end
+
+ context 'when the user does not have the permission to clone issues' do
+ it 'returns 400' do
+ post api("/projects/#{project.id}/issues/#{issue.iid}/clone", user),
+ params: { to_project_id: invalid_target_project.id }
+
+ expect(response).to have_gitlab_http_status(:bad_request)
+ expect(json_response['message']).to eq(s_('CloneIssue|Cannot clone issue due to insufficient permissions!'))
+ end
+ end
+
+ context 'when using the issue ID instead of iid' do
+ it 'returns 404', quarantine: 'https://gitlab.com/gitlab-org/gitlab/-/issues/341520' do
+ post api("/projects/#{project.id}/issues/#{issue.id}/clone", user),
+ params: { to_project_id: valid_target_project.id }
+
+ expect(response).to have_gitlab_http_status(:not_found)
+ expect(json_response['message']).to eq('404 Issue Not Found')
+ end
+ end
+
+ context 'when issue does not exist' do
+ it 'returns 404' do
+ post api("/projects/#{project.id}/issues/12300/clone", user),
+ params: { to_project_id: valid_target_project.id }
+
+ expect(response).to have_gitlab_http_status(:not_found)
+ expect(json_response['message']).to eq('404 Issue Not Found')
+ end
+ end
+
+ context 'when source project does not exist' do
+ it 'returns 404' do
+ post api("/projects/0/issues/#{issue.iid}/clone", user),
+ params: { to_project_id: valid_target_project.id }
+
+ expect(response).to have_gitlab_http_status(:not_found)
+ expect(json_response['message']).to eq('404 Project Not Found')
+ end
+ end
+
+ context 'when target project does not exist' do
+ it 'returns 404' do
+ post api("/projects/#{project.id}/issues/#{issue.iid}/clone", user),
+ params: { to_project_id: 0 }
+
+ expect(response).to have_gitlab_http_status(:not_found)
+ expect(json_response['message']).to eq('404 Project Not Found')
+ end
+ end
+
+ it 'clones the issue with notes when with_notes is true' do
+ expect do
+ post api("/projects/#{project.id}/issues/#{issue.iid}/clone", user),
+ params: { to_project_id: valid_target_project.id, with_notes: true }
+ end.to change { valid_target_project.issues.count }.by(1)
+
+ cloned_issue = Issue.last
+
+ expect(cloned_issue.notes.count).to eq(3)
+ expect(cloned_issue.notes.pluck(:note)).to include(issue.notes.first.note)
+ expect(response).to have_gitlab_http_status(:created)
+ expect(json_response['id']).to eq(cloned_issue.id)
+ expect(json_response['project_id']).to eq(valid_target_project.id)
+ end
+ end
+
describe 'POST :id/issues/:issue_iid/subscribe' do
it 'subscribes to an issue' do
post api("/projects/#{project.id}/issues/#{issue.iid}/subscribe", user2)
@@ -576,7 +682,7 @@ RSpec.describe API::Issues do
expect(response).to have_gitlab_http_status(:not_found)
end
- it 'returns 404 if the issue ID is used instead of the iid' do
+ it 'returns 404 if the issue ID is used instead of the iid', quarantine: 'https://gitlab.com/gitlab-org/gitlab/-/issues/341520' do
post api("/projects/#{project.id}/issues/#{issue.id}/subscribe", user)
expect(response).to have_gitlab_http_status(:not_found)
@@ -609,7 +715,7 @@ RSpec.describe API::Issues do
expect(response).to have_gitlab_http_status(:not_found)
end
- it 'returns 404 if using the issue ID instead of iid' do
+ it 'returns 404 if using the issue ID instead of iid', quarantine: 'https://gitlab.com/gitlab-org/gitlab/-/issues/341520' do
post api("/projects/#{project.id}/issues/#{issue.id}/unsubscribe", user)
expect(response).to have_gitlab_http_status(:not_found)
@@ -621,4 +727,9 @@ RSpec.describe API::Issues do
expect(response).to have_gitlab_http_status(:not_found)
end
end
+
+ def post_clone_issue(current_user, issue, target_project)
+ post api("/projects/#{issue.project.id}/issues/#{issue.iid}/clone", current_user),
+ params: { to_project_id: target_project.id }
+ end
end
diff --git a/spec/requests/api/maven_packages_spec.rb b/spec/requests/api/maven_packages_spec.rb
index 07111dd1d62..5a682ee8532 100644
--- a/spec/requests/api/maven_packages_spec.rb
+++ b/spec/requests/api/maven_packages_spec.rb
@@ -798,8 +798,6 @@ RSpec.describe API::MavenPackages do
end
describe 'PUT /api/v4/projects/:id/packages/maven/*path/:file_name' do
- include_context 'workhorse headers'
-
let(:send_rewritten_field) { true }
let(:file_upload) { fixture_file_upload('spec/fixtures/packages/maven/my-app-1.0-20180724.124855-1.jar') }
@@ -833,6 +831,8 @@ RSpec.describe API::MavenPackages do
context 'when params from workhorse are correct' do
let(:params) { { file: file_upload } }
+ subject { upload_file_with_token(params: params) }
+
context 'file size is too large' do
it 'rejects the request' do
allow_next_instance_of(UploadedFile) do |uploaded_file|
@@ -851,18 +851,20 @@ RSpec.describe API::MavenPackages do
expect(response).to have_gitlab_http_status(:bad_request)
end
- context 'without workhorse header' do
- let(:workhorse_headers) { {} }
-
- subject { upload_file_with_token(params: params) }
-
- it_behaves_like 'package workhorse uploads'
- end
+ it_behaves_like 'package workhorse uploads'
context 'event tracking' do
- subject { upload_file_with_token(params: params) }
-
it_behaves_like 'a package tracking event', described_class.name, 'push_package'
+
+ context 'when the package file fails to be created' do
+ before do
+ allow_next_instance_of(::Packages::CreatePackageFileService) do |create_package_file_service|
+ allow(create_package_file_service).to receive(:execute).and_raise(StandardError)
+ end
+ end
+
+ it_behaves_like 'not a package tracking event'
+ end
end
it 'creates package and stores package file' do
diff --git a/spec/requests/api/merge_requests_spec.rb b/spec/requests/api/merge_requests_spec.rb
index 7a587e82683..bdbc73a59d8 100644
--- a/spec/requests/api/merge_requests_spec.rb
+++ b/spec/requests/api/merge_requests_spec.rb
@@ -49,6 +49,12 @@ RSpec.describe API::MergeRequests do
expect_successful_response_with_paginated_array
end
+
+ it_behaves_like 'issuable anonymous search' do
+ let(:url) { endpoint_path }
+ let(:issuable) { merge_request }
+ let(:result) { [merge_request_merged.id, merge_request_locked.id, merge_request_closed.id, merge_request.id] }
+ end
end
context 'when authenticated' do
@@ -613,6 +619,12 @@ RSpec.describe API::MergeRequests do
)
end
+ it_behaves_like 'issuable anonymous search' do
+ let(:url) { '/merge_requests' }
+ let(:issuable) { merge_request }
+ let(:result) { [merge_request_merged.id, merge_request_locked.id, merge_request_closed.id, merge_request.id] }
+ end
+
it "returns authentication error without any scope" do
get api("/merge_requests")
diff --git a/spec/requests/api/package_files_spec.rb b/spec/requests/api/package_files_spec.rb
index 137ded050c5..eb1f04d193e 100644
--- a/spec/requests/api/package_files_spec.rb
+++ b/spec/requests/api/package_files_spec.rb
@@ -38,7 +38,7 @@ RSpec.describe API::PackageFiles do
expect(response).to have_gitlab_http_status(:not_found)
end
- it 'returns 404 for a user without access to the project' do
+ it 'returns 404 for a user without access to the project', :sidekiq_inline do
project.team.truncate
get api(url, user)
diff --git a/spec/requests/api/project_container_repositories_spec.rb b/spec/requests/api/project_container_repositories_spec.rb
index 1170a9ba6cb..196b0395ec0 100644
--- a/spec/requests/api/project_container_repositories_spec.rb
+++ b/spec/requests/api/project_container_repositories_spec.rb
@@ -52,6 +52,7 @@ RSpec.describe API::ProjectContainerRepositories do
test_repository
stub_container_registry_config(enabled: true)
+ stub_container_registry_info
end
shared_context 'using API user' do
@@ -105,6 +106,9 @@ RSpec.describe API::ProjectContainerRepositories do
it_behaves_like 'rejected container repository access', :guest, :forbidden unless context == 'using job token'
it_behaves_like 'rejected container repository access', :anonymous, :not_found
it_behaves_like 'a package tracking event', described_class.name, 'list_repositories'
+ it_behaves_like 'handling network errors with the container registry' do
+ let(:params) { { tags: true } }
+ end
it_behaves_like 'returns repositories for allowed users', :reporter, 'project' do
let(:object) { project }
@@ -154,6 +158,7 @@ RSpec.describe API::ProjectContainerRepositories do
it_behaves_like 'rejected container repository access', :guest, :forbidden unless context == 'using job token'
it_behaves_like 'rejected container repository access', :anonymous, :not_found
+ it_behaves_like 'handling network errors with the container registry'
context 'for reporter' do
let(:api_user) { reporter }
diff --git a/spec/requests/api/project_export_spec.rb b/spec/requests/api/project_export_spec.rb
index 06f4475ef79..b9c458373a8 100644
--- a/spec/requests/api/project_export_spec.rb
+++ b/spec/requests/api/project_export_spec.rb
@@ -457,4 +457,143 @@ RSpec.describe API::ProjectExport, :clean_gitlab_redis_cache do
end
end
end
+
+ describe 'export relations' do
+ let(:relation) { 'labels' }
+ let(:download_path) { "/projects/#{project.id}/export_relations/download?relation=#{relation}" }
+ let(:path) { "/projects/#{project.id}/export_relations" }
+
+ let_it_be(:status_path) { "/projects/#{project.id}/export_relations/status" }
+
+ context 'when user is a maintainer' do
+ before do
+ project.add_maintainer(user)
+ end
+
+ describe 'POST /projects/:id/export_relations' do
+ it 'accepts the request' do
+ post api(path, user)
+
+ expect(response).to have_gitlab_http_status(:accepted)
+ end
+
+ context 'when response is not success' do
+ it 'returns api error' do
+ allow_next_instance_of(BulkImports::ExportService) do |service|
+ allow(service).to receive(:execute).and_return(ServiceResponse.error(message: 'error', http_status: :error))
+ end
+
+ post api(path, user)
+
+ expect(response).to have_gitlab_http_status(:error)
+ end
+ end
+ end
+
+ describe 'GET /projects/:id/export_relations/download' do
+ let_it_be(:export) { create(:bulk_import_export, project: project, relation: 'labels') }
+ let_it_be(:upload) { create(:bulk_import_export_upload, export: export) }
+
+ context 'when export file exists' do
+ it 'downloads exported project relation archive' do
+ upload.update!(export_file: fixture_file_upload('spec/fixtures/bulk_imports/gz/labels.ndjson.gz'))
+
+ get api(download_path, user)
+
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(response.header['Content-Disposition']).to eq("attachment; filename=\"labels.ndjson.gz\"; filename*=UTF-8''labels.ndjson.gz")
+ end
+ end
+
+ context 'when relation is not portable' do
+ let(:relation) { ::BulkImports::FileTransfer::ProjectConfig.new(project).skipped_relations.first }
+
+ it_behaves_like '400 response' do
+ let(:request) { get api(download_path, user) }
+ end
+ end
+
+ context 'when export file does not exist' do
+ it 'returns 404' do
+ allow(upload).to receive(:export_file).and_return(nil)
+
+ get api(download_path, user)
+
+ expect(response).to have_gitlab_http_status(:not_found)
+ end
+ end
+ end
+
+ describe 'GET /projects/:id/export_relations/status' do
+ it 'returns a list of relation export statuses' do
+ create(:bulk_import_export, :started, project: project, relation: 'labels')
+ create(:bulk_import_export, :finished, project: project, relation: 'milestones')
+ create(:bulk_import_export, :failed, project: project, relation: 'project_badges')
+
+ get api(status_path, user)
+
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(json_response.pluck('relation')).to contain_exactly('labels', 'milestones', 'project_badges')
+ expect(json_response.pluck('status')).to contain_exactly(-1, 0, 1)
+ end
+ end
+
+ context 'with bulk_import FF disabled' do
+ before do
+ stub_feature_flags(bulk_import: false)
+ end
+
+ describe 'POST /projects/:id/export_relations' do
+ it_behaves_like '404 response' do
+ let(:request) { post api(path, user) }
+ end
+ end
+
+ describe 'GET /projects/:id/export_relations/download' do
+ let_it_be(:export) { create(:bulk_import_export, project: project, relation: 'labels') }
+ let_it_be(:upload) { create(:bulk_import_export_upload, export: export) }
+
+ before do
+ upload.update!(export_file: fixture_file_upload('spec/fixtures/bulk_imports/gz/labels.ndjson.gz'))
+ end
+
+ it_behaves_like '404 response' do
+ let(:request) { post api(path, user) }
+ end
+ end
+
+ describe 'GET /projects/:id/export_relations/status' do
+ it_behaves_like '404 response' do
+ let(:request) { get api(status_path, user) }
+ end
+ end
+ end
+ end
+
+ context 'when user is a developer' do
+ let_it_be(:developer) { create(:user) }
+
+ before do
+ project.add_developer(developer)
+ end
+
+ describe 'POST /projects/:id/export_relations' do
+ it_behaves_like '403 response' do
+ let(:request) { post api(path, developer) }
+ end
+ end
+
+ describe 'GET /projects/:id/export_relations/download' do
+ it_behaves_like '403 response' do
+ let(:request) { get api(download_path, developer) }
+ end
+ end
+
+ describe 'GET /projects/:id/export_relations/status' do
+ it_behaves_like '403 response' do
+ let(:request) { get api(status_path, developer) }
+ end
+ end
+ end
+ end
end
diff --git a/spec/requests/api/projects_spec.rb b/spec/requests/api/projects_spec.rb
index be8a6c7bdcf..b5d3dcee804 100644
--- a/spec/requests/api/projects_spec.rb
+++ b/spec/requests/api/projects_spec.rb
@@ -2591,7 +2591,7 @@ RSpec.describe API::Projects do
end
end
- it_behaves_like 'storing arguments in the application context' do
+ it_behaves_like 'storing arguments in the application context for the API' do
let_it_be(:user) { create(:user) }
let_it_be(:project) { create(:project, :public) }
let(:expected_params) { { user: user.username, project: project.full_path } }
@@ -2684,26 +2684,9 @@ RSpec.describe API::Projects do
context 'when authenticated' do
context 'valid request' do
- context 'when sort_by_project_authorizations_user_id FF is off' do
- before do
- stub_feature_flags(sort_by_project_users_by_project_authorizations_user_id: false)
- end
-
- it_behaves_like 'project users response' do
- let(:project) { project4 }
- let(:current_user) { user4 }
- end
- end
-
- context 'when sort_by_project_authorizations_user_id FF is on' do
- before do
- stub_feature_flags(sort_by_project_users_by_project_authorizations_user_id: true)
- end
-
- it_behaves_like 'project users response' do
- let(:project) { project4 }
- let(:current_user) { user4 }
- end
+ it_behaves_like 'project users response' do
+ let(:project) { project4 }
+ let(:current_user) { user4 }
end
end
diff --git a/spec/requests/api/repositories_spec.rb b/spec/requests/api/repositories_spec.rb
index a576e1ab1ee..f05f125c974 100644
--- a/spec/requests/api/repositories_spec.rb
+++ b/spec/requests/api/repositories_spec.rb
@@ -305,6 +305,18 @@ RSpec.describe API::Repositories do
end
end
+ it 'returns only a part of the repository with path set' do
+ path = 'bar'
+ get api("#{route}?path=#{path}", current_user)
+
+ expect(response).to have_gitlab_http_status(:ok)
+
+ type, params = workhorse_send_data
+
+ expect(type).to eq('git-archive')
+ expect(params['ArchivePath']).to match(/#{project.path}\-[^\.]+\-#{path}\.tar.gz/)
+ end
+
it 'rate limits user when thresholds hit' do
allow(::Gitlab::ApplicationRateLimiter).to receive(:throttled?).and_return(true)
diff --git a/spec/requests/api/services_spec.rb b/spec/requests/api/services_spec.rb
deleted file mode 100644
index e550132e776..00000000000
--- a/spec/requests/api/services_spec.rb
+++ /dev/null
@@ -1,361 +0,0 @@
-# frozen_string_literal: true
-
-require "spec_helper"
-
-RSpec.describe API::Services do
- let_it_be(:user) { create(:user) }
- let_it_be(:user2) { create(:user) }
-
- let_it_be(:project, reload: true) do
- create(:project, creator_id: user.id, namespace: user.namespace)
- end
-
- describe "GET /projects/:id/services" do
- it 'returns authentication error when unauthenticated' do
- get api("/projects/#{project.id}/services")
-
- expect(response).to have_gitlab_http_status(:unauthorized)
- end
-
- it "returns error when authenticated but user is not a project owner" do
- project.add_developer(user2)
- get api("/projects/#{project.id}/services", user2)
-
- expect(response).to have_gitlab_http_status(:forbidden)
- end
-
- context 'with integrations' do
- let!(:active_integration) { create(:emails_on_push_integration, project: project, active: true) }
- let!(:integration) { create(:custom_issue_tracker_integration, project: project, active: false) }
-
- it "returns a list of all active integrations" do
- get api("/projects/#{project.id}/services", user)
-
- aggregate_failures 'expect successful response with all active integrations' do
- expect(response).to have_gitlab_http_status(:ok)
- expect(json_response).to be_an Array
- expect(json_response.count).to eq(1)
- expect(json_response.first['slug']).to eq('emails-on-push')
- expect(response).to match_response_schema('public_api/v4/services')
- end
- end
- end
- end
-
- Integration.available_integration_names.each do |integration|
- describe "PUT /projects/:id/services/#{integration.dasherize}" do
- include_context integration
-
- it "updates #{integration} settings" do
- put api("/projects/#{project.id}/services/#{dashed_integration}", user), params: integration_attrs
-
- expect(response).to have_gitlab_http_status(:ok)
-
- current_integration = project.integrations.first
- events = current_integration.event_names.empty? ? ["foo"].freeze : current_integration.event_names
- query_strings = []
- events.each do |event|
- query_strings << "#{event}=#{!current_integration[event]}"
- end
- query_strings = query_strings.join('&')
-
- put api("/projects/#{project.id}/services/#{dashed_integration}?#{query_strings}", user), params: integration_attrs
-
- expect(response).to have_gitlab_http_status(:ok)
- expect(json_response['slug']).to eq(dashed_integration)
- events.each do |event|
- next if event == "foo"
-
- expect(project.integrations.first[event]).not_to eq(current_integration[event]),
- "expected #{!current_integration[event]} for event #{event} for service #{current_integration.title}, got #{current_integration[event]}"
- end
- end
-
- it "returns if required fields missing" do
- required_attributes = integration_attrs_list.select do |attr|
- integration_klass.validators_on(attr).any? do |v|
- v.instance_of?(ActiveRecord::Validations::PresenceValidator) &&
- # exclude presence validators with conditional since those are not really required
- ![:if, :unless].any? { |cond| v.options.include?(cond) }
- end
- end
-
- if required_attributes.empty?
- expected_code = :ok
- else
- integration_attrs.delete(required_attributes.sample)
- expected_code = :bad_request
- end
-
- put api("/projects/#{project.id}/services/#{dashed_integration}", user), params: integration_attrs
-
- expect(response).to have_gitlab_http_status(expected_code)
- end
- end
-
- describe "DELETE /projects/:id/services/#{integration.dasherize}" do
- include_context integration
-
- before do
- initialize_integration(integration)
- end
-
- it "deletes #{integration}" do
- delete api("/projects/#{project.id}/services/#{dashed_integration}", user)
-
- expect(response).to have_gitlab_http_status(:no_content)
- project.send(integration_method).reload
- expect(project.send(integration_method).activated?).to be_falsey
- end
- end
-
- describe "GET /projects/:id/services/#{integration.dasherize}" do
- include_context integration
-
- let!(:initialized_integration) { initialize_integration(integration, active: true) }
-
- let_it_be(:project2) do
- create(:project, creator_id: user.id, namespace: user.namespace)
- end
-
- def deactive_integration!
- return initialized_integration.update!(active: false) unless initialized_integration.is_a?(::Integrations::Prometheus)
-
- # Integrations::Prometheus sets `#active` itself within a `before_save`:
- initialized_integration.manual_configuration = false
- initialized_integration.save!
- end
-
- it 'returns authentication error when unauthenticated' do
- get api("/projects/#{project.id}/services/#{dashed_integration}")
- expect(response).to have_gitlab_http_status(:unauthorized)
- end
-
- it "returns all properties of active service #{integration}" do
- get api("/projects/#{project.id}/services/#{dashed_integration}", user)
-
- expect(initialized_integration).to be_active
- expect(response).to have_gitlab_http_status(:ok)
- expect(json_response['properties'].keys).to match_array(integration_instance.api_field_names)
- end
-
- it "returns all properties of inactive integration #{integration}" do
- deactive_integration!
-
- get api("/projects/#{project.id}/services/#{dashed_integration}", user)
-
- expect(initialized_integration).not_to be_active
- expect(response).to have_gitlab_http_status(:ok)
- expect(json_response['properties'].keys).to match_array(integration_instance.api_field_names)
- end
-
- it "returns not found if integration does not exist" do
- get api("/projects/#{project2.id}/services/#{dashed_integration}", user)
-
- expect(response).to have_gitlab_http_status(:not_found)
- expect(json_response['message']).to eq('404 Service Not Found')
- end
-
- it "returns not found if service exists but is in `Project#disabled_integrations`" do
- expect_next_found_instance_of(Project) do |project|
- expect(project).to receive(:disabled_integrations).at_least(:once).and_return([integration])
- end
-
- get api("/projects/#{project.id}/services/#{dashed_integration}", user)
-
- expect(response).to have_gitlab_http_status(:not_found)
- expect(json_response['message']).to eq('404 Service Not Found')
- end
-
- it "returns error when authenticated but not a project owner" do
- project.add_developer(user2)
- get api("/projects/#{project.id}/services/#{dashed_integration}", user2)
-
- expect(response).to have_gitlab_http_status(:forbidden)
- end
- end
- end
-
- describe 'POST /projects/:id/services/:slug/trigger' do
- describe 'Mattermost integration' do
- let(:integration_name) { 'mattermost_slash_commands' }
-
- context 'when no integration is available' do
- it 'returns a not found message' do
- post api("/projects/#{project.id}/services/idonotexist/trigger")
-
- expect(response).to have_gitlab_http_status(:not_found)
- expect(json_response["error"]).to eq("404 Not Found")
- end
- end
-
- context 'when the integration exists' do
- let(:params) { { token: 'token' } }
-
- context 'when the integration is not active' do
- before do
- project.create_mattermost_slash_commands_integration(
- active: false,
- properties: params
- )
- end
-
- it 'when the integration is inactive' do
- post api("/projects/#{project.id}/services/#{integration_name}/trigger"), params: params
-
- expect(response).to have_gitlab_http_status(:not_found)
- end
- end
-
- context 'when the integration is active' do
- before do
- project.create_mattermost_slash_commands_integration(
- active: true,
- properties: params
- )
- end
-
- it 'returns status 200' do
- post api("/projects/#{project.id}/services/#{integration_name}/trigger"), params: params
-
- expect(response).to have_gitlab_http_status(:ok)
- end
- end
-
- context 'when the project can not be found' do
- it 'returns a generic 404' do
- post api("/projects/404/services/#{integration_name}/trigger"), params: params
-
- expect(response).to have_gitlab_http_status(:not_found)
- expect(json_response["message"]).to eq("404 Service Not Found")
- end
- end
- end
- end
-
- describe 'Slack Integration' do
- let(:integration_name) { 'slack_slash_commands' }
-
- before do
- project.create_slack_slash_commands_integration(
- active: true,
- properties: { token: 'token' }
- )
- end
-
- it 'returns status 200' do
- post api("/projects/#{project.id}/services/#{integration_name}/trigger"), params: { token: 'token', text: 'help' }
-
- expect(response).to have_gitlab_http_status(:ok)
- expect(json_response['response_type']).to eq("ephemeral")
- end
- end
- end
-
- describe 'Mattermost integration' do
- let(:integration_name) { 'mattermost' }
- let(:params) do
- { webhook: 'https://hook.example.com', username: 'username' }
- end
-
- before do
- project.create_mattermost_integration(
- active: true,
- properties: params
- )
- end
-
- it 'accepts a username for update' do
- put api("/projects/#{project.id}/services/#{integration_name}", user), params: params.merge(username: 'new_username')
-
- expect(response).to have_gitlab_http_status(:ok)
- expect(json_response['properties']['username']).to eq('new_username')
- end
- end
-
- describe 'Microsoft Teams integration' do
- let(:integration_name) { 'microsoft-teams' }
- let(:params) do
- {
- webhook: 'https://hook.example.com',
- branches_to_be_notified: 'default',
- notify_only_broken_pipelines: false
- }
- end
-
- before do
- project.create_microsoft_teams_integration(
- active: true,
- properties: params
- )
- end
-
- it 'accepts branches_to_be_notified for update' do
- put api("/projects/#{project.id}/services/#{integration_name}", user),
- params: params.merge(branches_to_be_notified: 'all')
-
- expect(response).to have_gitlab_http_status(:ok)
- expect(json_response['properties']['branches_to_be_notified']).to eq('all')
- end
-
- it 'accepts notify_only_broken_pipelines for update' do
- put api("/projects/#{project.id}/services/#{integration_name}", user),
- params: params.merge(notify_only_broken_pipelines: true)
-
- expect(response).to have_gitlab_http_status(:ok)
- expect(json_response['properties']['notify_only_broken_pipelines']).to eq(true)
- end
- end
-
- describe 'Hangouts Chat integration' do
- let(:integration_name) { 'hangouts-chat' }
- let(:params) do
- {
- webhook: 'https://hook.example.com',
- branches_to_be_notified: 'default'
- }
- end
-
- before do
- project.create_hangouts_chat_integration(
- active: true,
- properties: params
- )
- end
-
- it 'accepts branches_to_be_notified for update', :aggregate_failures do
- put api("/projects/#{project.id}/services/#{integration_name}", user), params: params.merge(branches_to_be_notified: 'all')
-
- expect(response).to have_gitlab_http_status(:ok)
- expect(json_response['properties']['branches_to_be_notified']).to eq('all')
- end
-
- it 'only requires the webhook param' do
- put api("/projects/#{project.id}/services/#{integration_name}", user), params: { webhook: 'https://hook.example.com' }
-
- expect(response).to have_gitlab_http_status(:ok)
- end
- end
-
- describe 'Pipelines Email Integration' do
- let(:integration_name) { 'pipelines-email' }
-
- context 'notify_only_broken_pipelines property was saved as a string' do
- before do
- project.create_pipelines_email_integration(
- active: false,
- properties: {
- "notify_only_broken_pipelines": "true",
- "branches_to_be_notified": "default"
- }
- )
- end
-
- it 'returns boolean values for notify_only_broken_pipelines' do
- get api("/projects/#{project.id}/services/#{integration_name}", user)
-
- expect(json_response['properties']['notify_only_broken_pipelines']).to eq(true)
- end
- end
- end
-end
diff --git a/spec/requests/api/settings_spec.rb b/spec/requests/api/settings_spec.rb
index f5d261ba4c6..423e19c3971 100644
--- a/spec/requests/api/settings_spec.rb
+++ b/spec/requests/api/settings_spec.rb
@@ -48,6 +48,7 @@ RSpec.describe API::Settings, 'Settings', :do_not_mock_admin_mode_setting do
expect(json_response['admin_mode']).to be(false)
expect(json_response['whats_new_variant']).to eq('all_tiers')
expect(json_response['user_deactivation_emails_enabled']).to be(true)
+ expect(json_response['suggest_pipeline_enabled']).to be(true)
end
end
@@ -135,7 +136,8 @@ RSpec.describe API::Settings, 'Settings', :do_not_mock_admin_mode_setting do
wiki_page_max_content_bytes: 12345,
personal_access_token_prefix: "GL-",
user_deactivation_emails_enabled: false,
- admin_mode: true
+ admin_mode: true,
+ suggest_pipeline_enabled: false
}
expect(response).to have_gitlab_http_status(:ok)
@@ -187,6 +189,7 @@ RSpec.describe API::Settings, 'Settings', :do_not_mock_admin_mode_setting do
expect(json_response['personal_access_token_prefix']).to eq("GL-")
expect(json_response['admin_mode']).to be(true)
expect(json_response['user_deactivation_emails_enabled']).to be(false)
+ expect(json_response['suggest_pipeline_enabled']).to be(false)
end
end
diff --git a/spec/requests/api/users_spec.rb b/spec/requests/api/users_spec.rb
index ee1911b0a26..fb01845b63a 100644
--- a/spec/requests/api/users_spec.rb
+++ b/spec/requests/api/users_spec.rb
@@ -1457,10 +1457,20 @@ RSpec.describe API::Users do
describe "PUT /user/:id/credit_card_validation" do
let(:credit_card_validated_time) { Time.utc(2020, 1, 1) }
+ let(:expiration_year) { Date.today.year + 10 }
+ let(:params) do
+ {
+ credit_card_validated_at: credit_card_validated_time,
+ credit_card_expiration_year: expiration_year,
+ credit_card_expiration_month: 1,
+ credit_card_holder_name: 'John Smith',
+ credit_card_mask_number: '1111'
+ }
+ end
context 'when unauthenticated' do
it 'returns authentication error' do
- put api("/user/#{user.id}/credit_card_validation"), params: { credit_card_validated_at: credit_card_validated_time }
+ put api("/user/#{user.id}/credit_card_validation"), params: {}
expect(response).to have_gitlab_http_status(:unauthorized)
end
@@ -1468,7 +1478,7 @@ RSpec.describe API::Users do
context 'when authenticated as non-admin' do
it "does not allow updating user's credit card validation", :aggregate_failures do
- put api("/user/#{user.id}/credit_card_validation", user), params: { credit_card_validated_at: credit_card_validated_time }
+ put api("/user/#{user.id}/credit_card_validation", user), params: params
expect(response).to have_gitlab_http_status(:forbidden)
end
@@ -1476,10 +1486,17 @@ RSpec.describe API::Users do
context 'when authenticated as admin' do
it "updates user's credit card validation", :aggregate_failures do
- put api("/user/#{user.id}/credit_card_validation", admin), params: { credit_card_validated_at: credit_card_validated_time }
+ put api("/user/#{user.id}/credit_card_validation", admin), params: params
+
+ user.reload
expect(response).to have_gitlab_http_status(:ok)
- expect(user.reload.credit_card_validated_at).to eq(credit_card_validated_time)
+ expect(user.credit_card_validation).to have_attributes(
+ credit_card_validated_at: credit_card_validated_time,
+ expiration_date: Date.new(expiration_year, 1, 31),
+ last_digits: 1111,
+ holder_name: 'John Smith'
+ )
end
it "returns 400 error if credit_card_validated_at is missing" do
@@ -1489,7 +1506,7 @@ RSpec.describe API::Users do
end
it 'returns 404 error if user not found' do
- put api("/user/#{non_existing_record_id}/credit_card_validation", admin), params: { credit_card_validated_at: credit_card_validated_time }
+ put api("/user/#{non_existing_record_id}/credit_card_validation", admin), params: params
expect(response).to have_gitlab_http_status(:not_found)
expect(json_response['message']).to eq('404 User Not Found')
diff --git a/spec/requests/groups/registry/repositories_controller_spec.rb b/spec/requests/groups/registry/repositories_controller_spec.rb
index 89cbd3e4100..0699f48c2be 100644
--- a/spec/requests/groups/registry/repositories_controller_spec.rb
+++ b/spec/requests/groups/registry/repositories_controller_spec.rb
@@ -9,6 +9,7 @@ RSpec.describe Groups::Registry::RepositoriesController do
before do
stub_container_registry_config(enabled: true)
stub_container_registry_tags(repository: :any, tags: [])
+ stub_container_registry_info
group.add_reporter(user)
login_as(user)
end
diff --git a/spec/requests/import/url_controller_spec.rb b/spec/requests/import/url_controller_spec.rb
new file mode 100644
index 00000000000..63af5e8b469
--- /dev/null
+++ b/spec/requests/import/url_controller_spec.rb
@@ -0,0 +1,45 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Import::UrlController do
+ let_it_be(:user) { create(:user) }
+
+ before do
+ login_as(user)
+ end
+
+ describe 'POST #validate' do
+ it 'reports success when service reports success status' do
+ allow_next_instance_of(Import::ValidateRemoteGitEndpointService) do |validate_endpoint_service|
+ allow(validate_endpoint_service).to receive(:execute).and_return(ServiceResponse.success)
+ end
+
+ post import_url_validate_path, params: { url: 'https://fake.repo' }
+
+ expect(json_response).to eq({ 'success' => true })
+ end
+
+ it 'exposes error message when service reports error' do
+ expect_next_instance_of(Import::ValidateRemoteGitEndpointService) do |validate_endpoint_service|
+ expect(validate_endpoint_service).to receive(:execute).and_return(ServiceResponse.error(message: 'foobar'))
+ end
+
+ post import_url_validate_path, params: { url: 'https://fake.repo' }
+
+ expect(json_response).to eq({ 'success' => false, 'message' => 'foobar' })
+ end
+
+ context 'with an anonymous user' do
+ before do
+ sign_out(user)
+ end
+
+ it 'redirects to sign-in page' do
+ post import_url_validate_path
+
+ expect(response).to redirect_to(new_user_session_path)
+ end
+ end
+ end
+end
diff --git a/spec/requests/projects/cluster_agents_controller_spec.rb b/spec/requests/projects/cluster_agents_controller_spec.rb
new file mode 100644
index 00000000000..e4c4f537699
--- /dev/null
+++ b/spec/requests/projects/cluster_agents_controller_spec.rb
@@ -0,0 +1,40 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Projects::ClusterAgentsController do
+ let_it_be(:cluster_agent) { create(:cluster_agent) }
+
+ let(:project) { cluster_agent.project }
+
+ describe 'GET #show' do
+ subject { get project_cluster_agent_path(project, cluster_agent.name) }
+
+ context 'when user is unauthorized' do
+ let_it_be(:user) { create(:user) }
+
+ before do
+ project.add_developer(user)
+ sign_in(user)
+ subject
+ end
+
+ it 'shows 404' do
+ expect(response).to have_gitlab_http_status(:not_found)
+ end
+ end
+
+ context 'when user is authorized' do
+ let(:user) { project.creator }
+
+ before do
+ sign_in(user)
+ subject
+ end
+
+ it 'renders content' do
+ expect(response).to be_successful
+ end
+ end
+ end
+end
diff --git a/spec/requests/projects/google_cloud_controller_spec.rb b/spec/requests/projects/google_cloud_controller_spec.rb
new file mode 100644
index 00000000000..3b43f0d1dfb
--- /dev/null
+++ b/spec/requests/projects/google_cloud_controller_spec.rb
@@ -0,0 +1,50 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Projects::GoogleCloudController do
+ let_it_be(:project) { create(:project, :public) }
+
+ describe 'GET index' do
+ let_it_be(:url) { "#{project_google_cloud_index_path(project)}" }
+
+ let(:subject) { get url }
+
+ context 'when user is authorized' do
+ let(:user) { project.creator }
+
+ before do
+ sign_in(user)
+ subject
+ end
+
+ it 'renders content' do
+ expect(response).to be_successful
+ end
+ end
+
+ context 'when user is unauthorized' do
+ let(:user) { create(:user) }
+
+ before do
+ project.add_guest(user)
+ sign_in(user)
+ subject
+ end
+
+ it 'shows 404' do
+ expect(response).to have_gitlab_http_status(:not_found)
+ end
+ end
+
+ context 'when no user is present' do
+ before do
+ subject
+ end
+
+ it 'shows 404' do
+ expect(response).to have_gitlab_http_status(:not_found)
+ end
+ end
+ end
+end
diff --git a/spec/requests/projects/merge_requests_discussions_spec.rb b/spec/requests/projects/merge_requests_discussions_spec.rb
index 8057a091bba..4921a43ab8b 100644
--- a/spec/requests/projects/merge_requests_discussions_spec.rb
+++ b/spec/requests/projects/merge_requests_discussions_spec.rb
@@ -5,11 +5,13 @@ require 'spec_helper'
RSpec.describe 'merge requests discussions' do
# Further tests can be found at merge_requests_controller_spec.rb
describe 'GET /:namespace/:project/-/merge_requests/:iid/discussions' do
- let(:project) { create(:project, :repository) }
- let(:user) { project.owner }
+ let(:project) { create(:project, :repository, :public) }
+ let(:owner) { project.owner }
+ let(:user) { create(:user) }
let(:merge_request) { create(:merge_request_with_diffs, target_project: project, source_project: project) }
before do
+ project.add_maintainer(owner)
project.add_developer(user)
login_as(user)
end
@@ -232,7 +234,7 @@ RSpec.describe 'merge requests discussions' do
context 'when author role changes' do
before do
- Members::UpdateService.new(user, access_level: Gitlab::Access::GUEST).execute(author_membership)
+ Members::UpdateService.new(owner, access_level: Gitlab::Access::GUEST).execute(author_membership)
end
it_behaves_like 'cache miss' do
@@ -240,9 +242,9 @@ RSpec.describe 'merge requests discussions' do
end
end
- context 'when merge_request_discussion_cache is disabled' do
+ context 'when current_user role changes' do
before do
- stub_feature_flags(merge_request_discussion_cache: false)
+ Members::UpdateService.new(owner, access_level: Gitlab::Access::GUEST).execute(project.project_member(user))
end
it_behaves_like 'cache miss' do
diff --git a/spec/requests/rack_attack_global_spec.rb b/spec/requests/rack_attack_global_spec.rb
index be942f6ae86..35ce942ed7e 100644
--- a/spec/requests/rack_attack_global_spec.rb
+++ b/spec/requests/rack_attack_global_spec.rb
@@ -30,7 +30,11 @@ RSpec.describe 'Rack Attack global throttles', :use_clean_rails_memory_store_cac
throttle_unauthenticated_files_api_requests_per_period: 100,
throttle_unauthenticated_files_api_period_in_seconds: 1,
throttle_authenticated_files_api_requests_per_period: 100,
- throttle_authenticated_files_api_period_in_seconds: 1
+ throttle_authenticated_files_api_period_in_seconds: 1,
+ throttle_unauthenticated_deprecated_api_requests_per_period: 100,
+ throttle_unauthenticated_deprecated_api_period_in_seconds: 1,
+ throttle_authenticated_deprecated_api_requests_per_period: 100,
+ throttle_authenticated_deprecated_api_period_in_seconds: 1
}
end
@@ -479,6 +483,67 @@ RSpec.describe 'Rack Attack global throttles', :use_clean_rails_memory_store_cac
end
end
+ describe 'dependency proxy' do
+ include DependencyProxyHelpers
+
+ let_it_be_with_reload(:group) { create(:group) }
+ let_it_be_with_reload(:other_group) { create(:group) }
+ let_it_be(:user) { create(:user) }
+ let_it_be(:other_user) { create(:user) }
+
+ let(:throttle_setting_prefix) { 'throttle_authenticated_web' }
+ let(:jwt_token) { build_jwt(user) }
+ let(:other_jwt_token) { build_jwt(other_user) }
+ let(:request_args) { [path, headers: jwt_token_authorization_headers(jwt_token)] }
+ let(:other_user_request_args) { [other_path, headers: jwt_token_authorization_headers(other_jwt_token)] }
+
+ before do
+ group.add_owner(user)
+ group.create_dependency_proxy_setting!(enabled: true)
+ other_group.add_owner(other_user)
+ other_group.create_dependency_proxy_setting!(enabled: true)
+
+ allow(Gitlab.config.dependency_proxy)
+ .to receive(:enabled).and_return(true)
+ token_response = { status: :success, token: 'abcd1234' }
+ allow_next_instance_of(DependencyProxy::RequestTokenService) do |instance|
+ allow(instance).to receive(:execute).and_return(token_response)
+ end
+ end
+
+ context 'getting a manifest' do
+ let_it_be(:manifest) { create(:dependency_proxy_manifest) }
+
+ let(:path) { "/v2/#{group.path}/dependency_proxy/containers/alpine/manifests/latest" }
+ let(:other_path) { "/v2/#{other_group.path}/dependency_proxy/containers/alpine/manifests/latest" }
+ let(:pull_response) { { status: :success, manifest: manifest, from_cache: false } }
+
+ before do
+ allow_next_instance_of(DependencyProxy::FindOrCreateManifestService) do |instance|
+ allow(instance).to receive(:execute).and_return(pull_response)
+ end
+ end
+
+ it_behaves_like 'rate-limited token-authenticated requests'
+ end
+
+ context 'getting a blob' do
+ let_it_be(:blob) { create(:dependency_proxy_blob) }
+
+ let(:path) { "/v2/#{group.path}/dependency_proxy/containers/alpine/blobs/sha256:a0d0a0d46f8b52473982a3c466318f479767577551a53ffc9074c9fa7035982e" }
+ let(:other_path) { "/v2/#{other_group.path}/dependency_proxy/containers/alpine/blobs/sha256:a0d0a0d46f8b52473982a3c466318f479767577551a53ffc9074c9fa7035982e" }
+ let(:blob_response) { { status: :success, blob: blob, from_cache: false } }
+
+ before do
+ allow_next_instance_of(DependencyProxy::FindOrCreateBlobService) do |instance|
+ allow(instance).to receive(:execute).and_return(blob_response)
+ end
+ end
+
+ it_behaves_like 'rate-limited token-authenticated requests'
+ end
+ end
+
describe 'authenticated git lfs requests', :api do
let_it_be(:project) { create(:project, :internal) }
let_it_be(:user) { create(:user) }
@@ -790,6 +855,213 @@ RSpec.describe 'Rack Attack global throttles', :use_clean_rails_memory_store_cac
end
end
+ describe 'Deprecated API', :api do
+ let_it_be(:group) { create(:group, :public) }
+
+ let(:request_method) { 'GET' }
+ let(:path) { "/groups/#{group.id}" }
+ let(:params) { {} }
+
+ context 'unauthenticated' do
+ let(:throttle_setting_prefix) { 'throttle_unauthenticated_deprecated_api' }
+
+ def do_request
+ get(api(path), params: params)
+ end
+
+ before do
+ settings_to_set[:throttle_unauthenticated_deprecated_api_requests_per_period] = requests_per_period
+ settings_to_set[:throttle_unauthenticated_deprecated_api_period_in_seconds] = period_in_seconds
+ end
+
+ context 'when unauthenticated deprecated api throttle is disabled' do
+ before do
+ settings_to_set[:throttle_unauthenticated_deprecated_api_enabled] = false
+ stub_application_setting(settings_to_set)
+ end
+
+ it 'allows requests over the rate limit' do
+ (1 + requests_per_period).times do
+ do_request
+ expect(response).to have_gitlab_http_status(:ok)
+ end
+ end
+
+ context 'when unauthenticated api throttle is enabled' do
+ before do
+ settings_to_set[:throttle_unauthenticated_api_requests_per_period] = requests_per_period
+ settings_to_set[:throttle_unauthenticated_api_period_in_seconds] = period_in_seconds
+ settings_to_set[:throttle_unauthenticated_api_enabled] = true
+ stub_application_setting(settings_to_set)
+ end
+
+ it 'rejects requests over the unauthenticated api rate limit' do
+ requests_per_period.times do
+ do_request
+ expect(response).to have_gitlab_http_status(:ok)
+ end
+
+ expect_rejection { do_request }
+ end
+ end
+
+ context 'when unauthenticated web throttle is enabled' do
+ before do
+ settings_to_set[:throttle_unauthenticated_web_requests_per_period] = requests_per_period
+ settings_to_set[:throttle_unauthenticated_web_period_in_seconds] = period_in_seconds
+ settings_to_set[:throttle_unauthenticated_web_enabled] = true
+ stub_application_setting(settings_to_set)
+ end
+
+ it 'ignores unauthenticated web throttle' do
+ (1 + requests_per_period).times do
+ do_request
+ expect(response).to have_gitlab_http_status(:ok)
+ end
+ end
+ end
+ end
+
+ context 'when unauthenticated deprecated api throttle is enabled' do
+ before do
+ settings_to_set[:throttle_unauthenticated_deprecated_api_requests_per_period] = requests_per_period # 1
+ settings_to_set[:throttle_unauthenticated_deprecated_api_period_in_seconds] = period_in_seconds # 10_000
+ settings_to_set[:throttle_unauthenticated_deprecated_api_enabled] = true
+ stub_application_setting(settings_to_set)
+ end
+
+ context 'when group endpoint is given with_project=false' do
+ let(:params) { { with_projects: false } }
+
+ it 'permits requests over the rate limit' do
+ (1 + requests_per_period).times do
+ do_request
+ expect(response).to have_gitlab_http_status(:ok)
+ end
+ end
+ end
+
+ it 'rejects requests over the rate limit' do
+ requests_per_period.times do
+ do_request
+ expect(response).to have_gitlab_http_status(:ok)
+ end
+
+ expect_rejection { do_request }
+ end
+
+ context 'when unauthenticated api throttle is lower' do
+ before do
+ settings_to_set[:throttle_unauthenticated_api_requests_per_period] = 0
+ settings_to_set[:throttle_unauthenticated_api_period_in_seconds] = period_in_seconds
+ settings_to_set[:throttle_unauthenticated_api_enabled] = true
+ stub_application_setting(settings_to_set)
+ end
+
+ it 'ignores unauthenticated api throttle' do
+ requests_per_period.times do
+ do_request
+ expect(response).to have_gitlab_http_status(:ok)
+ end
+
+ expect_rejection { do_request }
+ end
+ end
+
+ it_behaves_like 'tracking when dry-run mode is set' do
+ let(:throttle_name) { 'throttle_unauthenticated_deprecated_api' }
+ end
+ end
+ end
+
+ context 'authenticated' do
+ let_it_be(:user) { create(:user) }
+ let_it_be(:member) { group.add_owner(user) }
+ let_it_be(:token) { create(:personal_access_token, user: user) }
+ let_it_be(:other_user) { create(:user) }
+ let_it_be(:other_user_token) { create(:personal_access_token, user: other_user) }
+
+ let(:throttle_setting_prefix) { 'throttle_authenticated_deprecated_api' }
+
+ before do
+ stub_application_setting(settings_to_set)
+ end
+
+ context 'with the token in the query string' do
+ let(:request_args) { [api(path, personal_access_token: token), {}] }
+ let(:other_user_request_args) { [api(path, personal_access_token: other_user_token), {}] }
+
+ it_behaves_like 'rate-limited token-authenticated requests'
+ end
+
+ context 'with the token in the headers' do
+ let(:request_args) { api_get_args_with_token_headers(path, personal_access_token_headers(token)) }
+ let(:other_user_request_args) { api_get_args_with_token_headers(path, personal_access_token_headers(other_user_token)) }
+
+ it_behaves_like 'rate-limited token-authenticated requests'
+ end
+
+ context 'precedence over authenticated api throttle' do
+ before do
+ settings_to_set[:throttle_authenticated_deprecated_api_requests_per_period] = requests_per_period
+ settings_to_set[:throttle_authenticated_deprecated_api_period_in_seconds] = period_in_seconds
+ end
+
+ def do_request
+ get(api(path, personal_access_token: token), params: params)
+ end
+
+ context 'when authenticated deprecated api throttle is enabled' do
+ before do
+ settings_to_set[:throttle_authenticated_deprecated_api_enabled] = true
+ end
+
+ context 'when authenticated api throttle is lower' do
+ before do
+ settings_to_set[:throttle_authenticated_api_requests_per_period] = 0
+ settings_to_set[:throttle_authenticated_api_period_in_seconds] = period_in_seconds
+ settings_to_set[:throttle_authenticated_api_enabled] = true
+ stub_application_setting(settings_to_set)
+ end
+
+ it 'ignores authenticated api throttle' do
+ requests_per_period.times do
+ do_request
+ expect(response).to have_gitlab_http_status(:ok)
+ end
+
+ expect_rejection { do_request }
+ end
+ end
+ end
+
+ context 'when authenticated deprecated api throttle is disabled' do
+ before do
+ settings_to_set[:throttle_authenticated_deprecated_api_enabled] = false
+ end
+
+ context 'when authenticated api throttle is enabled' do
+ before do
+ settings_to_set[:throttle_authenticated_api_requests_per_period] = requests_per_period
+ settings_to_set[:throttle_authenticated_api_period_in_seconds] = period_in_seconds
+ settings_to_set[:throttle_authenticated_api_enabled] = true
+ stub_application_setting(settings_to_set)
+ end
+
+ it 'rejects requests over the authenticated api rate limit' do
+ requests_per_period.times do
+ do_request
+ expect(response).to have_gitlab_http_status(:ok)
+ end
+
+ expect_rejection { do_request }
+ end
+ end
+ end
+ end
+ end
+ end
+
describe 'throttle bypass header' do
let(:headers) { {} }
let(:bypass_header) { 'gitlab-bypass-rate-limiting' }
diff --git a/spec/routing/admin/serverless/domains_controller_routing_spec.rb b/spec/routing/admin/serverless/domains_controller_routing_spec.rb
deleted file mode 100644
index 60b60809f4d..00000000000
--- a/spec/routing/admin/serverless/domains_controller_routing_spec.rb
+++ /dev/null
@@ -1,22 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Admin::Serverless::DomainsController do
- it 'routes to #index' do
- expect(get: '/admin/serverless/domains').to route_to('admin/serverless/domains#index')
- end
-
- it 'routes to #create' do
- expect(post: '/admin/serverless/domains/').to route_to('admin/serverless/domains#create')
- end
-
- it 'routes to #update' do
- expect(put: '/admin/serverless/domains/1').to route_to(controller: 'admin/serverless/domains', action: 'update', id: '1')
- expect(patch: '/admin/serverless/domains/1').to route_to(controller: 'admin/serverless/domains', action: 'update', id: '1')
- end
-
- it 'routes #verify' do
- expect(post: '/admin/serverless/domains/1/verify').to route_to(controller: 'admin/serverless/domains', action: 'verify', id: '1')
- end
-end
diff --git a/spec/serializers/member_entity_spec.rb b/spec/serializers/member_entity_spec.rb
index dc7aa4611f2..370fa14b1e8 100644
--- a/spec/serializers/member_entity_spec.rb
+++ b/spec/serializers/member_entity_spec.rb
@@ -39,6 +39,10 @@ RSpec.describe MemberEntity do
expect(entity_hash[:invite][:can_resend]).to be(true)
end
+
+ it 'exposes `invite.user_state` as empty string' do
+ expect(entity_hash[:invite][:user_state]).to eq('')
+ end
end
shared_examples 'is_direct_member' do
@@ -59,6 +63,12 @@ RSpec.describe MemberEntity do
end
end
+ shared_examples 'user state is blocked_pending_approval' do
+ it 'displays proper user state' do
+ expect(entity_hash[:invite][:user_state]).to eq('blocked_pending_approval')
+ end
+ end
+
context 'group member' do
let(:group) { create(:group) }
let(:source) { group }
@@ -79,6 +89,14 @@ RSpec.describe MemberEntity do
it_behaves_like 'is_direct_member'
end
+
+ context 'new member user state is blocked_pending_approval' do
+ let(:user) { create(:user, :blocked_pending_approval) }
+ let(:group_member) { create(:group_member, :invited, group: group, invite_email: user.email) }
+ let(:member) { GroupMemberPresenter.new(GroupMember.with_invited_user_state.find(group_member.id), current_user: current_user) }
+
+ it_behaves_like 'user state is blocked_pending_approval'
+ end
end
context 'project member' do
@@ -102,5 +120,13 @@ RSpec.describe MemberEntity do
it_behaves_like 'is_direct_member'
end
+
+ context 'new members user state is blocked_pending_approval' do
+ let(:user) { create(:user, :blocked_pending_approval) }
+ let(:project_member) { create(:project_member, :invited, project: project, invite_email: user.email) }
+ let(:member) { ProjectMemberPresenter.new(ProjectMember.with_invited_user_state.find(project_member.id), current_user: current_user) }
+
+ it_behaves_like 'user state is blocked_pending_approval'
+ end
end
end
diff --git a/spec/serializers/merge_request_metrics_helper_spec.rb b/spec/serializers/merge_request_metrics_helper_spec.rb
new file mode 100644
index 00000000000..8f683df1faa
--- /dev/null
+++ b/spec/serializers/merge_request_metrics_helper_spec.rb
@@ -0,0 +1,69 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe MergeRequestMetricsHelper do
+ let_it_be(:user) { create(:user) }
+
+ let(:merge_request) { create(:merge_request) }
+ let(:helper) { Class.new.include(described_class).new }
+
+ describe '#build_metrics' do
+ subject do
+ helper.build_metrics(merge_request)
+ end
+
+ shared_examples 'does not rebuild the metrics' do
+ it 'does not call the merge request metrics class' do
+ expect(MergeRequest::Metrics).not_to receive(:new)
+
+ subject
+ end
+
+ it 'returns the metrics for the given merge request' do
+ expect(subject).to be_kind_of(MergeRequest::Metrics)
+ expect(subject[:merge_request_id]).to eq(merge_request.id)
+ end
+ end
+
+ context 'when closed and metrics exists' do
+ before do
+ merge_request.close!
+ merge_request.metrics.update!(latest_closed_by: user)
+ end
+
+ include_examples 'does not rebuild the metrics'
+ end
+
+ context 'when merged and metrics exists' do
+ before do
+ merge_request.mark_as_merged!
+ merge_request.metrics.update!(merged_by: user)
+ end
+
+ include_examples 'does not rebuild the metrics'
+ end
+
+ context 'when merged and metrics do not exists' do
+ before do
+ merge_request.mark_as_merged!
+ merge_request.metrics.destroy!
+ merge_request.reload
+ end
+
+ it 'rebuilds the merge request metrics' do
+ closed_event = merge_request.closed_event
+ merge_event = merge_request.merge_event
+
+ expect(MergeRequest::Metrics).to receive(:new)
+ .with(latest_closed_at: closed_event&.updated_at,
+ latest_closed_by: closed_event&.author,
+ merged_at: merge_event&.updated_at,
+ merged_by: merge_event&.author)
+ .and_call_original
+
+ subject
+ end
+ end
+ end
+end
diff --git a/spec/serializers/merge_request_poll_cached_widget_entity_spec.rb b/spec/serializers/merge_request_poll_cached_widget_entity_spec.rb
index 5f4b734fcea..ecc93219b53 100644
--- a/spec/serializers/merge_request_poll_cached_widget_entity_spec.rb
+++ b/spec/serializers/merge_request_poll_cached_widget_entity_spec.rb
@@ -275,7 +275,7 @@ RSpec.describe MergeRequestPollCachedWidgetEntity do
expect(subject[:merge_pipeline]).to be_nil
end
- context 'when is merged' do
+ context 'when is merged', :sidekiq_inline do
let(:resource) { create(:merged_merge_request, source_project: project, merge_commit_sha: project.commit.id) }
let(:pipeline) { create(:ci_empty_pipeline, project: project, ref: resource.target_branch, sha: resource.merge_commit_sha) }
diff --git a/spec/serializers/merge_request_widget_entity_spec.rb b/spec/serializers/merge_request_widget_entity_spec.rb
index 35846b0d4ea..fcfdbfc0967 100644
--- a/spec/serializers/merge_request_widget_entity_spec.rb
+++ b/spec/serializers/merge_request_widget_entity_spec.rb
@@ -283,28 +283,6 @@ RSpec.describe MergeRequestWidgetEntity do
it 'provides a valid value for suggest pipeline feature id' do
expect(subject[:suggest_pipeline_feature_id]).to eq described_class::SUGGEST_PIPELINE
end
-
- it 'provides a valid value for if it is dismissed' do
- expect(subject[:is_dismissed_suggest_pipeline]).to be(false)
- end
-
- context 'when the suggest pipeline has been dismissed' do
- before do
- create(:user_callout, user: user, feature_name: described_class::SUGGEST_PIPELINE)
- end
-
- it 'indicates suggest pipeline has been dismissed' do
- expect(subject[:is_dismissed_suggest_pipeline]).to be(true)
- end
- end
-
- context 'when user is not logged in' do
- let(:request) { double('request', current_user: nil, project: project) }
-
- it 'returns a blank is dismissed value' do
- expect(subject[:is_dismissed_suggest_pipeline]).to be_nil
- end
- end
end
it 'has human access' do
@@ -395,4 +373,46 @@ RSpec.describe MergeRequestWidgetEntity do
end
end
end
+
+ describe 'is_dismissed_suggest_pipeline' do
+ context 'when user is logged in' do
+ context 'when the suggest pipeline feature is enabled' do
+ before do
+ allow(Gitlab::CurrentSettings).to receive(:suggest_pipeline_enabled?).and_return(true)
+ end
+
+ it 'is false' do
+ expect(subject[:is_dismissed_suggest_pipeline]).to be(false)
+ end
+
+ context 'when suggest pipeline has been dismissed' do
+ before do
+ create(:user_callout, user: user, feature_name: described_class::SUGGEST_PIPELINE)
+ end
+
+ it 'is true' do
+ expect(subject[:is_dismissed_suggest_pipeline]).to be(true)
+ end
+ end
+ end
+
+ context 'when the suggest pipeline feature is disabled' do
+ before do
+ allow(Gitlab::CurrentSettings).to receive(:suggest_pipeline_enabled?).and_return(false)
+ end
+
+ it 'is true' do
+ expect(subject[:is_dismissed_suggest_pipeline]).to be(true)
+ end
+ end
+ end
+
+ context 'when user is not logged in' do
+ let(:request) { double('request', current_user: nil, project: project) }
+
+ it 'is true' do
+ expect(subject[:is_dismissed_suggest_pipeline]).to be(true)
+ end
+ end
+ end
end
diff --git a/spec/services/application_settings/update_service_spec.rb b/spec/services/application_settings/update_service_spec.rb
index a1fd89bcad7..5c9d2c5e680 100644
--- a/spec/services/application_settings/update_service_spec.rb
+++ b/spec/services/application_settings/update_service_spec.rb
@@ -413,6 +413,32 @@ RSpec.describe ApplicationSettings::UpdateService do
end
end
+ context 'when deprecated API rate limits are passed' do
+ let(:params) do
+ {
+ throttle_unauthenticated_deprecated_api_enabled: 1,
+ throttle_unauthenticated_deprecated_api_period_in_seconds: 500,
+ throttle_unauthenticated_deprecated_api_requests_per_period: 20,
+ throttle_authenticated_deprecated_api_enabled: 1,
+ throttle_authenticated_deprecated_api_period_in_seconds: 600,
+ throttle_authenticated_deprecated_api_requests_per_period: 10
+ }
+ end
+
+ it 'updates deprecated API throttle settings' do
+ subject.execute
+
+ application_settings.reload
+
+ expect(application_settings.throttle_unauthenticated_deprecated_api_enabled).to be_truthy
+ expect(application_settings.throttle_unauthenticated_deprecated_api_period_in_seconds).to eq(500)
+ expect(application_settings.throttle_unauthenticated_deprecated_api_requests_per_period).to eq(20)
+ expect(application_settings.throttle_authenticated_deprecated_api_enabled).to be_truthy
+ expect(application_settings.throttle_authenticated_deprecated_api_period_in_seconds).to eq(600)
+ expect(application_settings.throttle_authenticated_deprecated_api_requests_per_period).to eq(10)
+ end
+ end
+
context 'when git lfs rate limits are passed' do
let(:params) do
{
diff --git a/spec/services/boards/issues/list_service_spec.rb b/spec/services/boards/issues/list_service_spec.rb
index d1f854f72bc..72027911e51 100644
--- a/spec/services/boards/issues/list_service_spec.rb
+++ b/spec/services/boards/issues/list_service_spec.rb
@@ -56,12 +56,23 @@ RSpec.describe Boards::Issues::ListService do
it_behaves_like 'issues list service'
end
- context 'when filtering by type' do
- it 'only returns the specified type' do
- issue = create(:labeled_issue, project: project, milestone: m1, labels: [development, p1], issue_type: 'incident')
- params = { board_id: board.id, id: list1.id, issue_types: 'incident' }
+ context 'when filtering' do
+ let_it_be(:incident) { create(:labeled_issue, project: project, milestone: m1, labels: [development, p1], issue_type: 'incident') }
- expect(described_class.new(parent, user, params).execute).to eq [issue]
+ context 'when filtering by type' do
+ it 'only returns the specified type' do
+ params = { board_id: board.id, id: list1.id, issue_types: 'incident' }
+
+ expect(described_class.new(parent, user, params).execute).to eq [incident]
+ end
+ end
+
+ context 'when filtering by negated type' do
+ it 'only returns the specified type' do
+ params = { board_id: board.id, id: list1.id, not: { issue_types: ['issue'] } }
+
+ expect(described_class.new(parent, user, params).execute).to contain_exactly(incident)
+ end
end
end
end
diff --git a/spec/services/bulk_import_service_spec.rb b/spec/services/bulk_import_service_spec.rb
deleted file mode 100644
index 1b60a5cb0f8..00000000000
--- a/spec/services/bulk_import_service_spec.rb
+++ /dev/null
@@ -1,69 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe BulkImportService do
- let(:user) { create(:user) }
- let(:credentials) { { url: 'http://gitlab.example', access_token: 'token' } }
- let(:params) do
- [
- {
- source_type: 'group_entity',
- source_full_path: 'full/path/to/group1',
- destination_name: 'destination group 1',
- destination_namespace: 'full/path/to/destination1'
- },
- {
- source_type: 'group_entity',
- source_full_path: 'full/path/to/group2',
- destination_name: 'destination group 2',
- destination_namespace: 'full/path/to/destination2'
- },
- {
- source_type: 'project_entity',
- source_full_path: 'full/path/to/project1',
- destination_name: 'destination project 1',
- destination_namespace: 'full/path/to/destination1'
- }
- ]
- end
-
- subject { described_class.new(user, params, credentials) }
-
- describe '#execute' do
- it 'creates bulk import' do
- expect { subject.execute }.to change { BulkImport.count }.by(1)
- 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
- end
-end
diff --git a/spec/services/bulk_imports/create_service_spec.rb b/spec/services/bulk_imports/create_service_spec.rb
new file mode 100644
index 00000000000..67ec6fee1ae
--- /dev/null
+++ b/spec/services/bulk_imports/create_service_spec.rb
@@ -0,0 +1,86 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe BulkImports::CreateService do
+ let(:user) { create(:user) }
+ let(:credentials) { { url: 'http://gitlab.example', access_token: 'token' } }
+ let(:params) do
+ [
+ {
+ source_type: 'group_entity',
+ source_full_path: 'full/path/to/group1',
+ destination_name: 'destination group 1',
+ destination_namespace: 'full/path/to/destination1'
+ },
+ {
+ source_type: 'group_entity',
+ source_full_path: 'full/path/to/group2',
+ destination_name: 'destination group 2',
+ destination_namespace: 'full/path/to/destination2'
+ },
+ {
+ source_type: 'project_entity',
+ source_full_path: 'full/path/to/project1',
+ destination_name: 'destination project 1',
+ destination_namespace: 'full/path/to/destination1'
+ }
+ ]
+ end
+
+ 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)
+ end
+ end
+
+ it 'creates bulk import' do
+ 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)
+ 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
+ end
+end
diff --git a/spec/services/bulk_imports/file_export_service_spec.rb b/spec/services/bulk_imports/file_export_service_spec.rb
new file mode 100644
index 00000000000..0d129c75384
--- /dev/null
+++ b/spec/services/bulk_imports/file_export_service_spec.rb
@@ -0,0 +1,37 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe BulkImports::FileExportService do
+ let_it_be(:project) { create(:project) }
+ let_it_be(:export_path) { Dir.mktmpdir }
+ let_it_be(:relation) { 'uploads' }
+
+ subject(:service) { described_class.new(project, export_path, relation) }
+
+ describe '#execute' do
+ it 'executes export service and archives exported data' do
+ expect_next_instance_of(BulkImports::UploadsExportService) do |service|
+ expect(service).to receive(:execute)
+ end
+
+ expect(subject).to receive(:tar_cf).with(archive: File.join(export_path, 'uploads.tar'), dir: export_path)
+
+ subject.execute
+ end
+
+ context 'when unsupported relation is passed' do
+ it 'raises an error' do
+ service = described_class.new(project, export_path, 'unsupported')
+
+ expect { service.execute }.to raise_error(BulkImports::Error, 'Unsupported relation export type')
+ end
+ end
+ end
+
+ describe '#exported_filename' do
+ it 'returns filename of the exported file' do
+ expect(subject.exported_filename).to eq('uploads.tar')
+ end
+ end
+end
diff --git a/spec/services/bulk_imports/get_importable_data_service_spec.rb b/spec/services/bulk_imports/get_importable_data_service_spec.rb
new file mode 100644
index 00000000000..eccd3e5f49d
--- /dev/null
+++ b/spec/services/bulk_imports/get_importable_data_service_spec.rb
@@ -0,0 +1,46 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe BulkImports::GetImportableDataService do
+ describe '#execute' do
+ include_context 'bulk imports requests context', 'https://gitlab.example.com'
+
+ let_it_be(:params) { { per_page: 20, page: 1 } }
+ let_it_be(:query_params) { { top_level_only: true, min_access_level: 50, search: '' } }
+ let_it_be(:credentials) { { url: 'https://gitlab.example.com', access_token: 'demo-pat' } }
+ let_it_be(:expected_version_validation) do
+ {
+ features: {
+ project_migration: {
+ available: true,
+ min_version: BulkImport.min_gl_version_for_project_migration.to_s
+ },
+ 'source_instance_version': BulkImport.min_gl_version_for_project_migration.to_s
+ }
+ }
+ end
+
+ let_it_be(:expected_parsed_response) do
+ [
+ {
+ 'id' => 2595438,
+ 'web_url' => 'https://gitlab.com/groups/auto-breakfast',
+ 'name' => 'Stub',
+ 'path' => 'stub-group',
+ 'full_name' => 'Stub',
+ 'full_path' => 'stub-group'
+ }
+ ]
+ end
+
+ subject do
+ described_class.new(params, query_params, credentials).execute
+ end
+
+ it 'returns version_validation and a response' do
+ expect(subject[:version_validation]).to eq(expected_version_validation)
+ expect(subject[:response].parsed_response).to eq(expected_parsed_response)
+ end
+ end
+end
diff --git a/spec/services/bulk_imports/relation_export_service_spec.rb b/spec/services/bulk_imports/relation_export_service_spec.rb
index 333cd9201d8..27a6ca60515 100644
--- a/spec/services/bulk_imports/relation_export_service_spec.rb
+++ b/spec/services/bulk_imports/relation_export_service_spec.rb
@@ -7,12 +7,14 @@ RSpec.describe BulkImports::RelationExportService do
let_it_be(:relation) { 'labels' }
let_it_be(:user) { create(:user) }
let_it_be(:group) { create(:group) }
+ let_it_be(:project) { create(:project) }
let_it_be(:label) { create(:group_label, group: group) }
let_it_be(:export_path) { "#{Dir.tmpdir}/relation_export_service_spec/tree" }
let_it_be_with_reload(:export) { create(:bulk_import_export, group: group, relation: relation) }
before do
group.add_owner(user)
+ project.add_maintainer(user)
allow(export).to receive(:export_path).and_return(export_path)
end
@@ -25,6 +27,10 @@ RSpec.describe BulkImports::RelationExportService do
describe '#execute' do
it 'exports specified relation and marks export as finished' do
+ expect_next_instance_of(BulkImports::TreeExportService) do |service|
+ expect(service).to receive(:execute).and_call_original
+ end
+
subject.execute
expect(export.reload.upload.export_file).to be_present
@@ -43,6 +49,18 @@ RSpec.describe BulkImports::RelationExportService do
expect(export.upload.export_file).to be_present
end
+ context 'when exporting a file relation' do
+ it 'uses file export service' do
+ service = described_class.new(user, project, 'uploads', jid)
+
+ expect_next_instance_of(BulkImports::FileExportService) do |service|
+ expect(service).to receive(:execute)
+ end
+
+ service.execute
+ end
+ end
+
context 'when export record does not exist' do
let(:another_group) { create(:group) }
diff --git a/spec/services/bulk_imports/tree_export_service_spec.rb b/spec/services/bulk_imports/tree_export_service_spec.rb
new file mode 100644
index 00000000000..f2ed747b64e
--- /dev/null
+++ b/spec/services/bulk_imports/tree_export_service_spec.rb
@@ -0,0 +1,35 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe BulkImports::TreeExportService do
+ let_it_be(:project) { create(:project) }
+ let_it_be(:export_path) { Dir.mktmpdir }
+ let_it_be(:relation) { 'issues' }
+
+ subject(:service) { described_class.new(project, export_path, relation) }
+
+ describe '#execute' do
+ it 'executes export service and archives exported data' do
+ expect_next_instance_of(Gitlab::ImportExport::Json::StreamingSerializer) do |serializer|
+ expect(serializer).to receive(:serialize_relation)
+ end
+
+ subject.execute
+ end
+
+ context 'when unsupported relation is passed' do
+ it 'raises an error' do
+ service = described_class.new(project, export_path, 'unsupported')
+
+ expect { service.execute }.to raise_error(BulkImports::Error, 'Unsupported relation export type')
+ end
+ end
+ end
+
+ describe '#exported_filename' do
+ it 'returns filename of the exported file' do
+ expect(subject.exported_filename).to eq('issues.ndjson')
+ end
+ end
+end
diff --git a/spec/services/ci/archive_trace_service_spec.rb b/spec/services/ci/archive_trace_service_spec.rb
index 071b5c3b2f9..b08ba6fd5e5 100644
--- a/spec/services/ci/archive_trace_service_spec.rb
+++ b/spec/services/ci/archive_trace_service_spec.rb
@@ -88,6 +88,32 @@ RSpec.describe Ci::ArchiveTraceService, '#execute' do
subject
end
+
+ context 'job has archive and chunks' do
+ let(:job) { create(:ci_build, :success, :trace_artifact) }
+
+ before do
+ create(:ci_build_trace_chunk, build: job, chunk_index: 0)
+ end
+
+ context 'archive is not completed' do
+ before do
+ job.job_artifacts_trace.file.remove!
+ end
+
+ it 'cleanups any stale archive data' do
+ expect(job.job_artifacts_trace).to be_present
+
+ subject
+
+ expect(job.reload.job_artifacts_trace).to be_nil
+ end
+ end
+
+ it 'removes trace chunks' do
+ expect { subject }.to change { job.trace_chunks.count }.to(0)
+ end
+ end
end
context 'when the archival process is backed off' do
diff --git a/spec/services/ci/create_pipeline_service/include_spec.rb b/spec/services/ci/create_pipeline_service/include_spec.rb
index 46271ee36c0..5e7dace8e15 100644
--- a/spec/services/ci/create_pipeline_service/include_spec.rb
+++ b/spec/services/ci/create_pipeline_service/include_spec.rb
@@ -58,17 +58,6 @@ RSpec.describe Ci::CreatePipelineService do
expect(pipeline).to be_created_successfully
expect(pipeline.processables.pluck(:name)).to contain_exactly('job', 'rspec')
end
-
- context 'when the FF ci_include_rules is disabled' do
- before do
- stub_feature_flags(ci_include_rules: false)
- end
-
- it 'includes the job in the file' do
- expect(pipeline).to be_created_successfully
- expect(pipeline.processables.pluck(:name)).to contain_exactly('job', 'rspec')
- end
- end
end
context 'when the rules does not match' do
@@ -78,17 +67,6 @@ RSpec.describe Ci::CreatePipelineService do
expect(pipeline).to be_created_successfully
expect(pipeline.processables.pluck(:name)).to contain_exactly('job')
end
-
- context 'when the FF ci_include_rules is disabled' do
- before do
- stub_feature_flags(ci_include_rules: false)
- end
-
- it 'includes the job in the file' do
- expect(pipeline).to be_created_successfully
- expect(pipeline.processables.pluck(:name)).to contain_exactly('job', 'rspec')
- end
- end
end
end
end
diff --git a/spec/services/ci/drop_pipeline_service_spec.rb b/spec/services/ci/drop_pipeline_service_spec.rb
index c6a118c6083..ddb53712d9c 100644
--- a/spec/services/ci/drop_pipeline_service_spec.rb
+++ b/spec/services/ci/drop_pipeline_service_spec.rb
@@ -50,13 +50,14 @@ RSpec.describe Ci::DropPipelineService do
end.count
writes_per_build = 2
+ load_balancer_queries = 3
expected_reads_count = control_count - writes_per_build
create_list(:ci_build, 5, :running, pipeline: cancelable_pipeline)
expect do
drop_pipeline!(cancelable_pipeline)
- end.not_to exceed_query_limit(expected_reads_count + (5 * writes_per_build))
+ end.not_to exceed_query_limit(expected_reads_count + (5 * writes_per_build) + load_balancer_queries)
end
end
end
diff --git a/spec/services/ci/pipelines/add_job_service_spec.rb b/spec/services/ci/pipelines/add_job_service_spec.rb
index 3a77d26dd9e..709a840c644 100644
--- a/spec/services/ci/pipelines/add_job_service_spec.rb
+++ b/spec/services/ci/pipelines/add_job_service_spec.rb
@@ -77,19 +77,6 @@ RSpec.describe Ci::Pipelines::AddJobService do
expect(execute).to be_success
expect(execute.payload[:job]).to eq(job)
end
-
- context 'when the FF ci_pipeline_add_job_with_lock is disabled' do
- before do
- stub_feature_flags(ci_pipeline_add_job_with_lock: false)
- end
-
- it 'does not use exclusive lock' do
- expect(Gitlab::ExclusiveLease).not_to receive(:new).with(lock_key, timeout: lock_timeout)
-
- expect(execute).to be_success
- expect(execute.payload[:job]).to eq(job)
- end
- end
end
end
end
diff --git a/spec/services/ci/pipelines/hook_service_spec.rb b/spec/services/ci/pipelines/hook_service_spec.rb
new file mode 100644
index 00000000000..0e1ef6afd0d
--- /dev/null
+++ b/spec/services/ci/pipelines/hook_service_spec.rb
@@ -0,0 +1,47 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Ci::Pipelines::HookService do
+ describe '#execute_hooks' do
+ let_it_be(:namespace) { create(:namespace) }
+ let_it_be(:project) { create(:project, :repository, namespace: namespace) }
+ let_it_be(:pipeline) { create(:ci_empty_pipeline, :created, project: project) }
+
+ let(:hook_enabled) { true }
+ let!(:hook) { create(:project_hook, project: project, pipeline_events: hook_enabled) }
+ let(:hook_data) { double }
+
+ subject(:service) { described_class.new(pipeline) }
+
+ describe 'HOOK_NAME' do
+ specify { expect(described_class::HOOK_NAME).to eq(:pipeline_hooks) }
+ end
+
+ context 'with pipeline hooks enabled' do
+ before do
+ allow(Gitlab::DataBuilder::Pipeline).to receive(:build).with(pipeline).once.and_return(hook_data)
+ end
+
+ it 'calls pipeline.project.execute_hooks and pipeline.project.execute_integrations' do
+ create(:pipelines_email_integration, project: project)
+
+ expect(pipeline.project).to receive(:execute_hooks).with(hook_data, described_class::HOOK_NAME)
+ expect(pipeline.project).to receive(:execute_integrations).with(hook_data, described_class::HOOK_NAME)
+
+ service.execute
+ end
+ end
+
+ context 'with pipeline hooks and integrations disabled' do
+ let(:hook_enabled) { false }
+
+ it 'does not call pipeline.project.execute_hooks and pipeline.project.execute_integrations' do
+ expect(pipeline.project).not_to receive(:execute_hooks)
+ expect(pipeline.project).not_to receive(:execute_integrations)
+
+ service.execute
+ end
+ end
+ end
+end
diff --git a/spec/services/ci/play_bridge_service_spec.rb b/spec/services/ci/play_bridge_service_spec.rb
index 3f97bfdf5ae..56b1615a56d 100644
--- a/spec/services/ci/play_bridge_service_spec.rb
+++ b/spec/services/ci/play_bridge_service_spec.rb
@@ -23,18 +23,18 @@ RSpec.describe Ci::PlayBridgeService, '#execute' do
expect(bridge.reload).to be_pending
end
- it 'enqueues Ci::CreateCrossProjectPipelineWorker' do
- expect(::Ci::CreateCrossProjectPipelineWorker).to receive(:perform_async).with(bridge.id)
-
- execute_service
- end
-
it "updates bridge's user" do
execute_service
expect(bridge.reload.user).to eq(user)
end
+ it 'enqueues Ci::CreateDownstreamPipelineWorker' do
+ expect(::Ci::CreateDownstreamPipelineWorker).to receive(:perform_async).with(bridge.id)
+
+ execute_service
+ end
+
context 'when a subsequent job is skipped' do
let!(:job) { create(:ci_build, :skipped, pipeline: pipeline, stage_idx: bridge.stage_idx + 1) }
diff --git a/spec/services/ci/process_pipeline_service_spec.rb b/spec/services/ci/process_pipeline_service_spec.rb
index b5bf0adadaf..404e1bf7c87 100644
--- a/spec/services/ci/process_pipeline_service_spec.rb
+++ b/spec/services/ci/process_pipeline_service_spec.rb
@@ -10,11 +10,9 @@ RSpec.describe Ci::ProcessPipelineService do
end
let(:pipeline_processing_events_counter) { double(increment: true) }
- let(:legacy_update_jobs_counter) { double(increment: true) }
let(:metrics) do
- double(pipeline_processing_events_counter: pipeline_processing_events_counter,
- legacy_update_jobs_counter: legacy_update_jobs_counter)
+ double(pipeline_processing_events_counter: pipeline_processing_events_counter)
end
subject { described_class.new(pipeline) }
@@ -33,68 +31,4 @@ RSpec.describe Ci::ProcessPipelineService do
subject.execute
end
end
-
- describe 'updating a list of retried builds' do
- let!(:build_retried) { create_build('build') }
- let!(:build) { create_build('build') }
- let!(:test) { create_build('test') }
-
- context 'when FF ci_remove_update_retried_from_process_pipeline is enabled' do
- it 'does not update older builds as retried' do
- subject.execute
-
- expect(all_builds.latest).to contain_exactly(build, build_retried, test)
- expect(all_builds.retried).to be_empty
- end
- end
-
- context 'when FF ci_remove_update_retried_from_process_pipeline is disabled' do
- before do
- stub_feature_flags(ci_remove_update_retried_from_process_pipeline: false)
- end
-
- it 'returns unique statuses' do
- subject.execute
-
- expect(all_builds.latest).to contain_exactly(build, test)
- expect(all_builds.retried).to contain_exactly(build_retried)
- end
-
- it 'increments the counter' do
- expect(legacy_update_jobs_counter).to receive(:increment)
-
- subject.execute
- end
-
- it 'logs the project and pipeline id' do
- expect(Gitlab::AppJsonLogger).to receive(:info).with(event: 'update_retried_is_used',
- project_id: project.id,
- pipeline_id: pipeline.id)
-
- subject.execute
- end
-
- context 'when the previous build has already retried column true' do
- before do
- build_retried.update_columns(retried: true)
- end
-
- it 'does not increment the counter' do
- expect(legacy_update_jobs_counter).not_to receive(:increment)
-
- subject.execute
- end
- end
- end
-
- private
-
- def create_build(name, **opts)
- create(:ci_build, :created, pipeline: pipeline, name: name, **opts)
- end
-
- def all_builds
- pipeline.builds.order(:stage_idx, :id)
- end
- end
end
diff --git a/spec/services/ci/register_job_service_spec.rb b/spec/services/ci/register_job_service_spec.rb
index 73ff15ec393..650353eb751 100644
--- a/spec/services/ci/register_job_service_spec.rb
+++ b/spec/services/ci/register_job_service_spec.rb
@@ -14,7 +14,7 @@ module Ci
let!(:pending_job) { create(:ci_build, :pending, :queued, pipeline: pipeline) }
describe '#execute' do
- context 'checks database loadbalancing stickiness', :db_load_balancing do
+ context 'checks database loadbalancing stickiness' do
subject { described_class.new(shared_runner).execute }
before do
@@ -22,14 +22,14 @@ module Ci
end
it 'result is valid if replica did caught-up' do
- expect(Gitlab::Database::LoadBalancing::Sticking).to receive(:all_caught_up?)
+ expect(ApplicationRecord.sticking).to receive(:all_caught_up?)
.with(:runner, shared_runner.id) { true }
expect(subject).to be_valid
end
it 'result is invalid if replica did not caught-up' do
- expect(Gitlab::Database::LoadBalancing::Sticking).to receive(:all_caught_up?)
+ expect(ApplicationRecord.sticking).to receive(:all_caught_up?)
.with(:runner, shared_runner.id) { false }
expect(subject).not_to be_valid
@@ -87,19 +87,25 @@ module Ci
end
context 'for specific runner' do
- context 'with FF disabled' do
+ context 'with tables decoupling disabled' do
before do
stub_feature_flags(
ci_pending_builds_project_runners_decoupling: false,
ci_queueing_builds_enabled_checks: false)
end
+ around do |example|
+ allow_cross_joins_across_databases(url: 'https://gitlab.com/gitlab-org/gitlab/-/issues/332952') do
+ example.run
+ end
+ end
+
it 'does not pick a build' do
expect(execute(specific_runner)).to be_nil
end
end
- context 'with FF enabled' do
+ context 'with tables decoupling enabled' do
before do
stub_feature_flags(
ci_pending_builds_project_runners_decoupling: true,
@@ -266,17 +272,23 @@ module Ci
context 'and uses project runner' do
let(:build) { execute(specific_runner) }
- context 'with FF disabled' do
+ context 'with tables decoupling disabled' do
before do
stub_feature_flags(
ci_pending_builds_project_runners_decoupling: false,
ci_queueing_builds_enabled_checks: false)
end
+ around do |example|
+ allow_cross_joins_across_databases(url: 'https://gitlab.com/gitlab-org/gitlab/-/issues/332952') do
+ example.run
+ end
+ end
+
it { expect(build).to be_nil }
end
- context 'with FF enabled' do
+ context 'with tables decoupling enabled' do
before do
stub_feature_flags(
ci_pending_builds_project_runners_decoupling: true,
@@ -791,6 +803,12 @@ module Ci
stub_feature_flags(ci_queueing_denormalize_shared_runners_information: false)
end
+ around do |example|
+ allow_cross_joins_across_databases(url: 'https://gitlab.com/gitlab-org/gitlab/-/issues/332952') do
+ example.run
+ end
+ end
+
include_examples 'handles runner assignment'
end
@@ -807,6 +825,12 @@ module Ci
stub_feature_flags(ci_queueing_denormalize_tags_information: false)
end
+ around do |example|
+ allow_cross_joins_across_databases(url: 'https://gitlab.com/gitlab-org/gitlab/-/issues/332952') do
+ example.run
+ end
+ end
+
include_examples 'handles runner assignment'
end
@@ -815,6 +839,12 @@ module Ci
stub_feature_flags(ci_queueing_denormalize_namespace_traversal_ids: false)
end
+ around do |example|
+ allow_cross_joins_across_databases(url: 'https://gitlab.com/gitlab-org/gitlab/-/issues/332952') do
+ example.run
+ end
+ end
+
include_examples 'handles runner assignment'
end
end
@@ -824,6 +854,12 @@ module Ci
stub_feature_flags(ci_pending_builds_queue_source: false)
end
+ around do |example|
+ allow_cross_joins_across_databases(url: 'https://gitlab.com/gitlab-org/gitlab/-/issues/332952') do
+ example.run
+ end
+ end
+
include_examples 'handles runner assignment'
end
end
diff --git a/spec/services/ci/resource_groups/assign_resource_from_resource_group_service_spec.rb b/spec/services/ci/resource_groups/assign_resource_from_resource_group_service_spec.rb
index 53aa842bc28..194203a422c 100644
--- a/spec/services/ci/resource_groups/assign_resource_from_resource_group_service_spec.rb
+++ b/spec/services/ci/resource_groups/assign_resource_from_resource_group_service_spec.rb
@@ -48,6 +48,92 @@ RSpec.describe Ci::ResourceGroups::AssignResourceFromResourceGroupService do
expect(build).to be_pending
end
end
+
+ context 'when process mode is oldest_first' do
+ let(:resource_group) { create(:ci_resource_group, process_mode: :oldest_first, project: project) }
+
+ it 'requests resource' do
+ subject
+
+ expect(build.reload).to be_pending
+ expect(build.resource).to be_present
+ end
+
+ context 'when the other job exists in the newer pipeline' do
+ let!(:build_2) { create(:ci_build, :waiting_for_resource, project: project, user: user, resource_group: resource_group) }
+
+ it 'requests resource for the job in the oldest pipeline' do
+ subject
+
+ expect(build.reload).to be_pending
+ expect(build.resource).to be_present
+ expect(build_2.reload).to be_waiting_for_resource
+ expect(build_2.resource).to be_nil
+ end
+ end
+
+ context 'when build is not `waiting_for_resource` state' do
+ let!(:build) { create(:ci_build, :created, project: project, user: user, resource_group: resource_group) }
+
+ it 'attempts to request a resource' do
+ expect_next_found_instance_of(Ci::Build) do |job|
+ expect(job).to receive(:enqueue_waiting_for_resource).and_call_original
+ end
+
+ subject
+ end
+
+ it 'does not change the job status' do
+ subject
+
+ expect(build.reload).to be_created
+ expect(build.resource).to be_nil
+ end
+ end
+ end
+
+ context 'when process mode is newest_first' do
+ let(:resource_group) { create(:ci_resource_group, process_mode: :newest_first, project: project) }
+
+ it 'requests resource' do
+ subject
+
+ expect(build.reload).to be_pending
+ expect(build.resource).to be_present
+ end
+
+ context 'when the other job exists in the newer pipeline' do
+ let!(:build_2) { create(:ci_build, :waiting_for_resource, project: project, user: user, resource_group: resource_group) }
+
+ it 'requests resource for the job in the newest pipeline' do
+ subject
+
+ expect(build.reload).to be_waiting_for_resource
+ expect(build.resource).to be_nil
+ expect(build_2.reload).to be_pending
+ expect(build_2.resource).to be_present
+ end
+ end
+
+ context 'when build is not `waiting_for_resource` state' do
+ let!(:build) { create(:ci_build, :created, project: project, user: user, resource_group: resource_group) }
+
+ it 'attempts to request a resource' do
+ expect_next_found_instance_of(Ci::Build) do |job|
+ expect(job).to receive(:enqueue_waiting_for_resource).and_call_original
+ end
+
+ subject
+ end
+
+ it 'does not change the job status' do
+ subject
+
+ expect(build.reload).to be_created
+ expect(build.resource).to be_nil
+ end
+ end
+ end
end
context 'when there are no available resources' do
diff --git a/spec/services/ci/retry_build_service_spec.rb b/spec/services/ci/retry_build_service_spec.rb
index ce2e6ba5e15..15c88c9f657 100644
--- a/spec/services/ci/retry_build_service_spec.rb
+++ b/spec/services/ci/retry_build_service_spec.rb
@@ -48,7 +48,7 @@ RSpec.describe Ci::RetryBuildService do
job_artifacts_network_referee job_artifacts_dotenv
job_artifacts_cobertura needs job_artifacts_accessibility
job_artifacts_requirements job_artifacts_coverage_fuzzing
- job_artifacts_api_fuzzing].freeze
+ job_artifacts_api_fuzzing terraform_state_versions].freeze
ignore_accessors =
%i[type lock_version target_url base_tags trace_sections
@@ -88,6 +88,7 @@ RSpec.describe Ci::RetryBuildService do
create(:ci_job_variable, job: build)
create(:ci_build_need, build: build)
+ create(:terraform_state_version, build: build)
end
describe 'clone accessors' do
@@ -276,13 +277,17 @@ RSpec.describe Ci::RetryBuildService do
end
end
- describe '#reprocess' do
+ describe '#clone!' do
let(:new_build) do
travel_to(1.second.from_now) do
- service.reprocess!(build)
+ service.clone!(build)
end
end
+ it 'raises an error when an unexpected class is passed' do
+ expect { service.clone!(create(:ci_build).present) }.to raise_error(TypeError)
+ end
+
context 'when user has ability to execute build' do
before do
stub_not_protect_default_branch
@@ -338,7 +343,7 @@ RSpec.describe Ci::RetryBuildService do
let(:user) { reporter }
it 'raises an error' do
- expect { service.reprocess!(build) }
+ expect { service.clone!(build) }
.to raise_error Gitlab::Access::AccessDeniedError
end
end
diff --git a/spec/services/ci/retry_pipeline_service_spec.rb b/spec/services/ci/retry_pipeline_service_spec.rb
index 3e2e9f07723..12106b70969 100644
--- a/spec/services/ci/retry_pipeline_service_spec.rb
+++ b/spec/services/ci/retry_pipeline_service_spec.rb
@@ -316,6 +316,26 @@ RSpec.describe Ci::RetryPipelineService, '#execute' do
expect(bridge.reload).to be_pending
end
end
+
+ context 'when there are skipped jobs in later stages' do
+ before do
+ create_build('build 1', :success, 0)
+ create_build('test 2', :failed, 1)
+ create_build('report 3', :skipped, 2)
+ create_bridge('deploy 4', :skipped, 2)
+ end
+
+ it 'retries failed jobs and processes skipped jobs' do
+ service.execute(pipeline)
+
+ expect(build('build 1')).to be_success
+ expect(build('test 2')).to be_pending
+ expect(build('report 3')).to be_created
+ expect(build('deploy 4')).to be_created
+
+ expect(pipeline.reload).to be_running
+ end
+ end
end
context 'when user is not allowed to retry pipeline' do
@@ -390,16 +410,25 @@ RSpec.describe Ci::RetryPipelineService, '#execute' do
pipeline.reload.statuses
end
+ # The method name can be confusing because this can actually return both Ci::Build and Ci::Bridge
def build(name)
statuses.latest.find_by(name: name)
end
def create_build(name, status, stage_num, **opts)
- create(:ci_build, name: name,
- status: status,
- stage: "stage_#{stage_num}",
- stage_idx: stage_num,
- pipeline: pipeline, **opts) do |build|
+ create_processable(:ci_build, name, status, stage_num, **opts)
+ end
+
+ def create_bridge(name, status, stage_num, **opts)
+ create_processable(:ci_bridge, name, status, stage_num, **opts)
+ end
+
+ def create_processable(type, name, status, stage_num, **opts)
+ create(type, name: name,
+ status: status,
+ stage: "stage_#{stage_num}",
+ stage_idx: stage_num,
+ pipeline: pipeline, **opts) do |_job|
::Ci::ProcessPipelineService.new(pipeline).execute
end
end
diff --git a/spec/services/ci/stuck_builds/drop_pending_service_spec.rb b/spec/services/ci/stuck_builds/drop_pending_service_spec.rb
new file mode 100644
index 00000000000..aa0526edf57
--- /dev/null
+++ b/spec/services/ci/stuck_builds/drop_pending_service_spec.rb
@@ -0,0 +1,201 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Ci::StuckBuilds::DropPendingService do
+ let!(:runner) { create :ci_runner }
+ let!(:job) { create :ci_build, runner: runner }
+ let(:created_at) { }
+ let(:updated_at) { }
+
+ subject(:service) { described_class.new }
+
+ before do
+ job_attributes = { status: status }
+ job_attributes[:created_at] = created_at if created_at
+ job_attributes[:updated_at] = updated_at if updated_at
+ job.update!(job_attributes)
+ end
+
+ context 'when job is pending' do
+ let(:status) { 'pending' }
+
+ context 'when job is not stuck' do
+ before do
+ allow_next_found_instance_of(Ci::Build) do |build|
+ allow(build).to receive(:stuck?).and_return(false)
+ end
+ end
+
+ context 'when job was updated_at more than 1 day ago' do
+ let(:updated_at) { 1.5.days.ago }
+
+ context 'when created_at is the same as updated_at' do
+ let(:created_at) { 1.5.days.ago }
+
+ it_behaves_like 'job is dropped with failure reason', 'stuck_or_timeout_failure'
+ end
+
+ context 'when created_at is before updated_at' do
+ let(:created_at) { 3.days.ago }
+
+ it_behaves_like 'job is dropped with failure reason', 'stuck_or_timeout_failure'
+ end
+
+ context 'when created_at is outside lookback window' do
+ let(:created_at) { described_class::BUILD_LOOKBACK - 1.day }
+
+ it_behaves_like 'job is unchanged'
+ end
+ end
+
+ context 'when job was updated less than 1 day ago' do
+ let(:updated_at) { 6.hours.ago }
+
+ context 'when created_at is the same as updated_at' do
+ let(:created_at) { 1.5.days.ago }
+
+ it_behaves_like 'job is unchanged'
+ end
+
+ context 'when created_at is before updated_at' do
+ let(:created_at) { 3.days.ago }
+
+ it_behaves_like 'job is unchanged'
+ end
+
+ context 'when created_at is outside lookback window' do
+ let(:created_at) { described_class::BUILD_LOOKBACK - 1.day }
+
+ it_behaves_like 'job is unchanged'
+ end
+ end
+
+ context 'when job was updated more than 1 hour ago' do
+ let(:updated_at) { 2.hours.ago }
+
+ context 'when created_at is the same as updated_at' do
+ let(:created_at) { 2.hours.ago }
+
+ it_behaves_like 'job is unchanged'
+ end
+
+ context 'when created_at is before updated_at' do
+ let(:created_at) { 3.days.ago }
+
+ it_behaves_like 'job is unchanged'
+ end
+
+ context 'when created_at is outside lookback window' do
+ let(:created_at) { described_class::BUILD_LOOKBACK - 1.day }
+
+ it_behaves_like 'job is unchanged'
+ end
+ end
+ end
+
+ context 'when job is stuck' do
+ before do
+ allow_next_found_instance_of(Ci::Build) do |build|
+ allow(build).to receive(:stuck?).and_return(true)
+ end
+ end
+
+ context 'when job was updated_at more than 1 hour ago' do
+ let(:updated_at) { 1.5.hours.ago }
+
+ context 'when created_at is the same as updated_at' do
+ let(:created_at) { 1.5.hours.ago }
+
+ it_behaves_like 'job is dropped with failure reason', 'stuck_or_timeout_failure'
+ end
+
+ context 'when created_at is before updated_at' do
+ let(:created_at) { 3.days.ago }
+
+ it_behaves_like 'job is dropped with failure reason', 'stuck_or_timeout_failure'
+ end
+
+ context 'when created_at is outside lookback window' do
+ let(:created_at) { described_class::BUILD_LOOKBACK - 1.day }
+
+ it_behaves_like 'job is unchanged'
+ end
+ end
+
+ context 'when job was updated in less than 1 hour ago' do
+ let(:updated_at) { 30.minutes.ago }
+
+ context 'when created_at is the same as updated_at' do
+ let(:created_at) { 30.minutes.ago }
+
+ it_behaves_like 'job is unchanged'
+ end
+
+ context 'when created_at is before updated_at' do
+ let(:created_at) { 2.days.ago }
+
+ it_behaves_like 'job is unchanged'
+ end
+
+ context 'when created_at is outside lookback window' do
+ let(:created_at) { described_class::BUILD_LOOKBACK - 1.day }
+
+ it_behaves_like 'job is unchanged'
+ end
+ end
+ end
+ end
+
+ context 'when job is running' do
+ let(:status) { 'running' }
+
+ context 'when job was updated_at more than an hour ago' do
+ let(:updated_at) { 2.hours.ago }
+
+ it_behaves_like 'job is unchanged'
+ end
+
+ context 'when job was updated in less than 1 hour ago' do
+ let(:updated_at) { 30.minutes.ago }
+
+ it_behaves_like 'job is unchanged'
+ end
+ end
+
+ %w(success skipped failed canceled).each do |status|
+ context "when job is #{status}" do
+ let(:status) { status }
+ let(:updated_at) { 2.days.ago }
+
+ context 'when created_at is the same as updated_at' do
+ let(:created_at) { 2.days.ago }
+
+ it_behaves_like 'job is unchanged'
+ end
+
+ context 'when created_at is before updated_at' do
+ let(:created_at) { 3.days.ago }
+
+ it_behaves_like 'job is unchanged'
+ end
+
+ context 'when created_at is outside lookback window' do
+ let(:created_at) { described_class::BUILD_LOOKBACK - 1.day }
+
+ it_behaves_like 'job is unchanged'
+ end
+ end
+ end
+
+ context 'for deleted project' do
+ let(:status) { 'running' }
+ let(:updated_at) { 2.days.ago }
+
+ before do
+ job.project.update!(pending_delete: true)
+ end
+
+ it_behaves_like 'job is unchanged'
+ end
+end
diff --git a/spec/services/ci/stuck_builds/drop_running_service_spec.rb b/spec/services/ci/stuck_builds/drop_running_service_spec.rb
new file mode 100644
index 00000000000..c1c92c2b8e2
--- /dev/null
+++ b/spec/services/ci/stuck_builds/drop_running_service_spec.rb
@@ -0,0 +1,72 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Ci::StuckBuilds::DropRunningService do
+ let!(:runner) { create :ci_runner }
+ let!(:job) { create(:ci_build, runner: runner, created_at: created_at, updated_at: updated_at, status: status) }
+
+ subject(:service) { described_class.new }
+
+ around do |example|
+ freeze_time { example.run }
+ end
+
+ shared_examples 'running builds' do
+ context 'when job is running' do
+ let(:status) { 'running' }
+ let(:outdated_time) { described_class::BUILD_RUNNING_OUTDATED_TIMEOUT.ago - 30.minutes }
+ let(:fresh_time) { described_class::BUILD_RUNNING_OUTDATED_TIMEOUT.ago + 30.minutes }
+
+ context 'when job is outdated' do
+ let(:created_at) { outdated_time }
+ let(:updated_at) { outdated_time }
+
+ it_behaves_like 'job is dropped with failure reason', 'stuck_or_timeout_failure'
+ end
+
+ context 'when job is fresh' do
+ let(:created_at) { fresh_time }
+ let(:updated_at) { fresh_time }
+
+ it_behaves_like 'job is unchanged'
+ end
+
+ context 'when job freshly updated' do
+ let(:created_at) { outdated_time }
+ let(:updated_at) { fresh_time }
+
+ it_behaves_like 'job is unchanged'
+ end
+ end
+ end
+
+ include_examples 'running builds'
+
+ context 'when new query flag is disabled' do
+ before do
+ stub_feature_flags(ci_new_query_for_running_stuck_jobs: false)
+ end
+
+ include_examples 'running builds'
+ end
+
+ %w(success skipped failed canceled scheduled pending).each do |status|
+ context "when job is #{status}" do
+ let(:status) { status }
+ let(:updated_at) { 2.days.ago }
+
+ context 'when created_at is the same as updated_at' do
+ let(:created_at) { 2.days.ago }
+
+ it_behaves_like 'job is unchanged'
+ end
+
+ context 'when created_at is before updated_at' do
+ let(:created_at) { 3.days.ago }
+
+ it_behaves_like 'job is unchanged'
+ end
+ end
+ end
+end
diff --git a/spec/services/ci/stuck_builds/drop_scheduled_service_spec.rb b/spec/services/ci/stuck_builds/drop_scheduled_service_spec.rb
new file mode 100644
index 00000000000..1416fab3d25
--- /dev/null
+++ b/spec/services/ci/stuck_builds/drop_scheduled_service_spec.rb
@@ -0,0 +1,53 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Ci::StuckBuilds::DropScheduledService do
+ let_it_be(:runner) { create :ci_runner }
+
+ let!(:job) { create :ci_build, :scheduled, scheduled_at: scheduled_at, runner: runner }
+
+ subject(:service) { described_class.new }
+
+ context 'when job is scheduled' do
+ context 'for more than an hour ago' do
+ let(:scheduled_at) { 2.hours.ago }
+
+ it_behaves_like 'job is dropped with failure reason', 'stale_schedule'
+ end
+
+ context 'for less than 1 hour ago' do
+ let(:scheduled_at) { 30.minutes.ago }
+
+ it_behaves_like 'job is unchanged'
+ end
+ end
+
+ %w(success skipped failed canceled running pending).each do |status|
+ context "when job is #{status}" do
+ before do
+ job.update!(status: status)
+ end
+
+ context 'and scheduled for more than an hour ago' do
+ let(:scheduled_at) { 2.hours.ago }
+
+ it_behaves_like 'job is unchanged'
+ end
+
+ context 'and scheduled for less than 1 hour ago' do
+ let(:scheduled_at) { 30.minutes.ago }
+
+ it_behaves_like 'job is unchanged'
+ end
+ end
+ end
+
+ context 'when there are no stale scheduled builds' do
+ let(:job) { }
+
+ it 'does not drop the stale scheduled build yet' do
+ expect { service.execute }.not_to raise_error
+ end
+ end
+end
diff --git a/spec/services/ci/stuck_builds/drop_service_spec.rb b/spec/services/ci/stuck_builds/drop_service_spec.rb
deleted file mode 100644
index 8dfd1bc1b3d..00000000000
--- a/spec/services/ci/stuck_builds/drop_service_spec.rb
+++ /dev/null
@@ -1,284 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Ci::StuckBuilds::DropService do
- let!(:runner) { create :ci_runner }
- let!(:job) { create :ci_build, runner: runner }
- let(:created_at) { }
- let(:updated_at) { }
-
- subject(:service) { described_class.new }
-
- before do
- job_attributes = { status: status }
- job_attributes[:created_at] = created_at if created_at
- job_attributes[:updated_at] = updated_at if updated_at
- job.update!(job_attributes)
- end
-
- shared_examples 'job is dropped' do
- it 'changes status' do
- expect(service).to receive(:drop).exactly(3).times.and_call_original
- expect(service).to receive(:drop_stuck).exactly(:once).and_call_original
-
- service.execute
- job.reload
-
- expect(job).to be_failed
- expect(job).to be_stuck_or_timeout_failure
- end
-
- context 'when job have data integrity problem' do
- it "does drop the job and logs the reason" do
- job.update_columns(yaml_variables: '[{"key" => "value"}]')
-
- expect(Gitlab::ErrorTracking).to receive(:track_exception)
- .with(anything, a_hash_including(build_id: job.id))
- .once
- .and_call_original
-
- service.execute
- job.reload
-
- expect(job).to be_failed
- expect(job).to be_data_integrity_failure
- end
- end
- end
-
- shared_examples 'job is unchanged' do
- it 'does not change status' do
- expect(service).to receive(:drop).exactly(3).times.and_call_original
- expect(service).to receive(:drop_stuck).exactly(:once).and_call_original
-
- service.execute
- job.reload
-
- expect(job.status).to eq(status)
- end
- end
-
- context 'when job is pending' do
- let(:status) { 'pending' }
-
- context 'when job is not stuck' do
- before do
- allow_next_found_instance_of(Ci::Build) do |build|
- allow(build).to receive(:stuck?).and_return(false)
- end
- end
-
- context 'when job was updated_at more than 1 day ago' do
- let(:updated_at) { 1.5.days.ago }
-
- context 'when created_at is the same as updated_at' do
- let(:created_at) { 1.5.days.ago }
-
- it_behaves_like 'job is dropped'
- end
-
- context 'when created_at is before updated_at' do
- let(:created_at) { 3.days.ago }
-
- it_behaves_like 'job is dropped'
- end
-
- context 'when created_at is outside lookback window' do
- let(:created_at) { described_class::BUILD_LOOKBACK - 1.day }
-
- it_behaves_like 'job is unchanged'
- end
- end
-
- context 'when job was updated less than 1 day ago' do
- let(:updated_at) { 6.hours.ago }
-
- context 'when created_at is the same as updated_at' do
- let(:created_at) { 1.5.days.ago }
-
- it_behaves_like 'job is unchanged'
- end
-
- context 'when created_at is before updated_at' do
- let(:created_at) { 3.days.ago }
-
- it_behaves_like 'job is unchanged'
- end
-
- context 'when created_at is outside lookback window' do
- let(:created_at) { described_class::BUILD_LOOKBACK - 1.day }
-
- it_behaves_like 'job is unchanged'
- end
- end
-
- context 'when job was updated more than 1 hour ago' do
- let(:updated_at) { 2.hours.ago }
-
- context 'when created_at is the same as updated_at' do
- let(:created_at) { 2.hours.ago }
-
- it_behaves_like 'job is unchanged'
- end
-
- context 'when created_at is before updated_at' do
- let(:created_at) { 3.days.ago }
-
- it_behaves_like 'job is unchanged'
- end
-
- context 'when created_at is outside lookback window' do
- let(:created_at) { described_class::BUILD_LOOKBACK - 1.day }
-
- it_behaves_like 'job is unchanged'
- end
- end
- end
-
- context 'when job is stuck' do
- before do
- allow_next_found_instance_of(Ci::Build) do |build|
- allow(build).to receive(:stuck?).and_return(true)
- end
- end
-
- context 'when job was updated_at more than 1 hour ago' do
- let(:updated_at) { 1.5.hours.ago }
-
- context 'when created_at is the same as updated_at' do
- let(:created_at) { 1.5.hours.ago }
-
- it_behaves_like 'job is dropped'
- end
-
- context 'when created_at is before updated_at' do
- let(:created_at) { 3.days.ago }
-
- it_behaves_like 'job is dropped'
- end
-
- context 'when created_at is outside lookback window' do
- let(:created_at) { described_class::BUILD_LOOKBACK - 1.day }
-
- it_behaves_like 'job is unchanged'
- end
- end
-
- context 'when job was updated in less than 1 hour ago' do
- let(:updated_at) { 30.minutes.ago }
-
- context 'when created_at is the same as updated_at' do
- let(:created_at) { 30.minutes.ago }
-
- it_behaves_like 'job is unchanged'
- end
-
- context 'when created_at is before updated_at' do
- let(:created_at) { 2.days.ago }
-
- it_behaves_like 'job is unchanged'
- end
-
- context 'when created_at is outside lookback window' do
- let(:created_at) { described_class::BUILD_LOOKBACK - 1.day }
-
- it_behaves_like 'job is unchanged'
- end
- end
- end
- end
-
- context 'when job is running' do
- let(:status) { 'running' }
-
- context 'when job was updated_at more than an hour ago' do
- let(:updated_at) { 2.hours.ago }
-
- it_behaves_like 'job is dropped'
- end
-
- context 'when job was updated in less than 1 hour ago' do
- let(:updated_at) { 30.minutes.ago }
-
- it_behaves_like 'job is unchanged'
- end
- end
-
- %w(success skipped failed canceled).each do |status|
- context "when job is #{status}" do
- let(:status) { status }
- let(:updated_at) { 2.days.ago }
-
- context 'when created_at is the same as updated_at' do
- let(:created_at) { 2.days.ago }
-
- it_behaves_like 'job is unchanged'
- end
-
- context 'when created_at is before updated_at' do
- let(:created_at) { 3.days.ago }
-
- it_behaves_like 'job is unchanged'
- end
-
- context 'when created_at is outside lookback window' do
- let(:created_at) { described_class::BUILD_LOOKBACK - 1.day }
-
- it_behaves_like 'job is unchanged'
- end
- end
- end
-
- context 'for deleted project' do
- let(:status) { 'running' }
- let(:updated_at) { 2.days.ago }
-
- before do
- job.project.update!(pending_delete: true)
- end
-
- it_behaves_like 'job is dropped'
- end
-
- describe 'drop stale scheduled builds' do
- let(:status) { 'scheduled' }
- let(:updated_at) { }
-
- context 'when scheduled at 2 hours ago but it is not executed yet' do
- let!(:job) { create(:ci_build, :scheduled, scheduled_at: 2.hours.ago) }
-
- it 'drops the stale scheduled build' do
- expect(Ci::Build.scheduled.count).to eq(1)
- expect(job).to be_scheduled
-
- service.execute
- job.reload
-
- expect(Ci::Build.scheduled.count).to eq(0)
- expect(job).to be_failed
- expect(job).to be_stale_schedule
- end
- end
-
- context 'when scheduled at 30 minutes ago but it is not executed yet' do
- let!(:job) { create(:ci_build, :scheduled, scheduled_at: 30.minutes.ago) }
-
- it 'does not drop the stale scheduled build yet' do
- expect(Ci::Build.scheduled.count).to eq(1)
- expect(job).to be_scheduled
-
- service.execute
-
- expect(Ci::Build.scheduled.count).to eq(1)
- expect(job).to be_scheduled
- end
- end
-
- context 'when there are no stale scheduled builds' do
- it 'does not drop the stale scheduled build yet' do
- expect { service.execute }.not_to raise_error
- end
- end
- end
-end
diff --git a/spec/services/ci/update_build_state_service_spec.rb b/spec/services/ci/update_build_state_service_spec.rb
index 5bb3843da8f..e4dd3d0500f 100644
--- a/spec/services/ci/update_build_state_service_spec.rb
+++ b/spec/services/ci/update_build_state_service_spec.rb
@@ -112,6 +112,14 @@ RSpec.describe Ci::UpdateBuildStateService do
.not_to have_received(:increment_trace_operation)
.with(operation: :invalid)
end
+
+ it 'does not increment chunks_invalid_checksum trace metric' do
+ execute_with_stubbed_metrics!
+
+ expect(metrics)
+ .not_to have_received(:increment_error_counter)
+ .with(type: :chunks_invalid_checksum)
+ end
end
context 'when build trace has been migrated' do
@@ -174,6 +182,14 @@ RSpec.describe Ci::UpdateBuildStateService do
.to have_received(:increment_trace_operation)
.with(operation: :invalid)
end
+
+ it 'increments chunks_invalid_checksum trace metric' do
+ execute_with_stubbed_metrics!
+
+ expect(metrics)
+ .to have_received(:increment_error_counter)
+ .with(type: :chunks_invalid_checksum)
+ end
end
context 'when trace checksum is valid' do
@@ -191,6 +207,14 @@ RSpec.describe Ci::UpdateBuildStateService do
expect(metrics)
.not_to have_received(:increment_trace_operation)
.with(operation: :corrupted)
+
+ expect(metrics)
+ .not_to have_received(:increment_error_counter)
+ .with(type: :chunks_invalid_checksum)
+
+ expect(metrics)
+ .not_to have_received(:increment_error_counter)
+ .with(type: :chunks_invalid_size)
end
context 'when using deprecated parameters' do
@@ -208,6 +232,14 @@ RSpec.describe Ci::UpdateBuildStateService do
expect(metrics)
.not_to have_received(:increment_trace_operation)
.with(operation: :corrupted)
+
+ expect(metrics)
+ .not_to have_received(:increment_error_counter)
+ .with(type: :chunks_invalid_checksum)
+
+ expect(metrics)
+ .not_to have_received(:increment_error_counter)
+ .with(type: :chunks_invalid_size)
end
end
end
@@ -227,6 +259,14 @@ RSpec.describe Ci::UpdateBuildStateService do
expect(metrics)
.to have_received(:increment_trace_operation)
.with(operation: :corrupted)
+
+ expect(metrics)
+ .to have_received(:increment_error_counter)
+ .with(type: :chunks_invalid_checksum)
+
+ expect(metrics)
+ .to have_received(:increment_error_counter)
+ .with(type: :chunks_invalid_size)
end
end
@@ -243,8 +283,16 @@ RSpec.describe Ci::UpdateBuildStateService do
.with(operation: :invalid)
expect(metrics)
+ .to have_received(:increment_error_counter)
+ .with(type: :chunks_invalid_checksum)
+
+ expect(metrics)
.not_to have_received(:increment_trace_operation)
.with(operation: :corrupted)
+
+ expect(metrics)
+ .not_to have_received(:increment_error_counter)
+ .with(type: :chunks_invalid_size)
end
end
@@ -325,6 +373,10 @@ RSpec.describe Ci::UpdateBuildStateService do
expect(metrics)
.not_to have_received(:increment_trace_operation)
.with(operation: :invalid)
+
+ expect(metrics)
+ .not_to have_received(:increment_error_counter)
+ .with(type: :chunks_invalid_checksum)
end
context 'when build pending state is outdated' do
diff --git a/spec/services/ci/update_pending_build_service_spec.rb b/spec/services/ci/update_pending_build_service_spec.rb
index d842042de40..d36564938c8 100644
--- a/spec/services/ci/update_pending_build_service_spec.rb
+++ b/spec/services/ci/update_pending_build_service_spec.rb
@@ -3,21 +3,23 @@
require 'spec_helper'
RSpec.describe Ci::UpdatePendingBuildService do
- describe '#execute' do
- let_it_be(:group) { create(:group) }
- let_it_be(:project) { create(:project, namespace: group) }
- let_it_be(:pending_build_1) { create(:ci_pending_build, project: project, instance_runners_enabled: false) }
- let_it_be(:pending_build_2) { create(:ci_pending_build, project: project, instance_runners_enabled: true) }
- let_it_be(:update_params) { { instance_runners_enabled: true } }
+ let_it_be(:group) { create(:group) }
+ let_it_be(:project) { create(:project, namespace: group) }
+ let_it_be_with_reload(:pending_build_1) { create(:ci_pending_build, project: project, instance_runners_enabled: false) }
+ let_it_be_with_reload(:pending_build_2) { create(:ci_pending_build, project: project, instance_runners_enabled: true) }
+ let_it_be(:update_params) { { instance_runners_enabled: true } }
+
+ let(:service) { described_class.new(model, update_params) }
- subject(:service) { described_class.new(model, update_params).execute }
+ describe '#execute' do
+ subject(:update_pending_builds) { service.execute }
context 'validations' do
context 'when model is invalid' do
let(:model) { pending_build_1 }
it 'raises an error' do
- expect { service }.to raise_error(described_class::InvalidModelError)
+ expect { update_pending_builds }.to raise_error(described_class::InvalidModelError)
end
end
@@ -26,7 +28,7 @@ RSpec.describe Ci::UpdatePendingBuildService do
let(:update_params) { { minutes_exceeded: true } }
it 'raises an error' do
- expect { service }.to raise_error(described_class::InvalidParamsError)
+ expect { update_pending_builds }.to raise_error(described_class::InvalidParamsError)
end
end
end
@@ -35,10 +37,10 @@ RSpec.describe Ci::UpdatePendingBuildService do
let(:model) { group }
it 'updates all pending builds', :aggregate_failures do
- service
+ update_pending_builds
- expect(pending_build_1.reload.instance_runners_enabled).to be_truthy
- expect(pending_build_2.reload.instance_runners_enabled).to be_truthy
+ expect(pending_build_1.instance_runners_enabled).to be_truthy
+ expect(pending_build_2.instance_runners_enabled).to be_truthy
end
context 'when ci_pending_builds_maintain_shared_runners_data is disabled' do
@@ -47,10 +49,10 @@ RSpec.describe Ci::UpdatePendingBuildService do
end
it 'does not update all pending builds', :aggregate_failures do
- service
+ update_pending_builds
- expect(pending_build_1.reload.instance_runners_enabled).to be_falsey
- expect(pending_build_2.reload.instance_runners_enabled).to be_truthy
+ expect(pending_build_1.instance_runners_enabled).to be_falsey
+ expect(pending_build_2.instance_runners_enabled).to be_truthy
end
end
end
@@ -59,10 +61,10 @@ RSpec.describe Ci::UpdatePendingBuildService do
let(:model) { project }
it 'updates all pending builds', :aggregate_failures do
- service
+ update_pending_builds
- expect(pending_build_1.reload.instance_runners_enabled).to be_truthy
- expect(pending_build_2.reload.instance_runners_enabled).to be_truthy
+ expect(pending_build_1.instance_runners_enabled).to be_truthy
+ expect(pending_build_2.instance_runners_enabled).to be_truthy
end
context 'when ci_pending_builds_maintain_shared_runners_data is disabled' do
@@ -71,10 +73,10 @@ RSpec.describe Ci::UpdatePendingBuildService do
end
it 'does not update all pending builds', :aggregate_failures do
- service
+ update_pending_builds
- expect(pending_build_1.reload.instance_runners_enabled).to be_falsey
- expect(pending_build_2.reload.instance_runners_enabled).to be_truthy
+ expect(pending_build_1.instance_runners_enabled).to be_falsey
+ expect(pending_build_2.instance_runners_enabled).to be_truthy
end
end
end
diff --git a/spec/services/clusters/agent_tokens/create_service_spec.rb b/spec/services/clusters/agent_tokens/create_service_spec.rb
new file mode 100644
index 00000000000..92629af06c8
--- /dev/null
+++ b/spec/services/clusters/agent_tokens/create_service_spec.rb
@@ -0,0 +1,64 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Clusters::AgentTokens::CreateService do
+ subject(:service) { described_class.new(container: project, current_user: user, params: params) }
+
+ let_it_be(:user) { create(:user) }
+
+ let(:cluster_agent) { create(:cluster_agent) }
+ let(:project) { cluster_agent.project }
+ let(:params) { { agent_id: cluster_agent.id, description: 'token description', name: 'token name' } }
+
+ describe '#execute' do
+ subject { service.execute }
+
+ it 'does not create a new token due to user permissions' do
+ expect { subject }.not_to change(::Clusters::AgentToken, :count)
+ end
+
+ it 'returns permission errors', :aggregate_failures do
+ expect(subject.status).to eq(:error)
+ expect(subject.message).to eq('User has insufficient permissions to create a token for this project')
+ end
+
+ context 'with user permissions' do
+ before do
+ project.add_maintainer(user)
+ end
+
+ it 'creates a new token' do
+ expect { subject }.to change { ::Clusters::AgentToken.count }.by(1)
+ end
+
+ it 'returns success status', :aggregate_failures do
+ expect(subject.status).to eq(:success)
+ expect(subject.message).to be_nil
+ end
+
+ it 'returns token information', :aggregate_failures do
+ token = subject.payload[:token]
+
+ expect(subject.payload[:secret]).not_to be_nil
+
+ expect(token.created_by_user).to eq(user)
+ expect(token.description).to eq(params[:description])
+ expect(token.name).to eq(params[:name])
+ end
+
+ context 'when params are invalid' do
+ let(:params) { { agent_id: 'bad_id' } }
+
+ it 'does not create a new token' do
+ expect { subject }.not_to change(::Clusters::AgentToken, :count)
+ end
+
+ it 'returns validation errors', :aggregate_failures do
+ expect(subject.status).to eq(:error)
+ expect(subject.message).to eq(["Agent must exist", "Name can't be blank"])
+ end
+ end
+ end
+ end
+end
diff --git a/spec/services/clusters/agents/create_service_spec.rb b/spec/services/clusters/agents/create_service_spec.rb
new file mode 100644
index 00000000000..2b3bbcae13c
--- /dev/null
+++ b/spec/services/clusters/agents/create_service_spec.rb
@@ -0,0 +1,52 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Clusters::Agents::CreateService do
+ subject(:service) { described_class.new(project, user) }
+
+ let(:project) { create(:project, :public, :repository) }
+ let(:user) { create(:user) }
+
+ describe '#execute' do
+ context 'without user permissions' do
+ it 'returns errors when user does not have permissions' do
+ expect(service.execute(name: 'missing-permissions')).to eq({
+ status: :error,
+ message: 'You have insufficient permissions to create a cluster agent for this project'
+ })
+ end
+ end
+
+ context 'with user permissions' do
+ before do
+ project.add_maintainer(user)
+ end
+
+ it 'creates a new clusters_agent' do
+ expect { service.execute(name: 'with-user') }.to change { ::Clusters::Agent.count }.by(1)
+ end
+
+ it 'returns success status', :aggregate_failures do
+ result = service.execute(name: 'success')
+
+ expect(result[:status]).to eq(:success)
+ expect(result[:message]).to be_nil
+ end
+
+ it 'returns agent values', :aggregate_failures do
+ new_agent = service.execute(name: 'new-agent')[:cluster_agent]
+
+ expect(new_agent.name).to eq('new-agent')
+ expect(new_agent.created_by_user).to eq(user)
+ end
+
+ it 'generates an error message when name is invalid' do
+ expect(service.execute(name: '@bad_agent_name!')).to eq({
+ status: :error,
+ message: ["Name can contain only lowercase letters, digits, and '-', but cannot start or end with '-'"]
+ })
+ end
+ end
+ end
+end
diff --git a/spec/services/clusters/agents/delete_service_spec.rb b/spec/services/clusters/agents/delete_service_spec.rb
new file mode 100644
index 00000000000..1d6bc9618dd
--- /dev/null
+++ b/spec/services/clusters/agents/delete_service_spec.rb
@@ -0,0 +1,35 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Clusters::Agents::DeleteService do
+ subject(:service) { described_class.new(container: project, current_user: user) }
+
+ let(:cluster_agent) { create(:cluster_agent) }
+ let(:project) { cluster_agent.project }
+ let(:user) { create(:user) }
+
+ describe '#execute' do
+ context 'without user permissions' do
+ it 'fails to delete when the user has no permissions', :aggregate_failures do
+ response = service.execute(cluster_agent)
+
+ expect(response.status).to eq(:error)
+ expect(response.message).to eq('You have insufficient permissions to delete this cluster agent')
+
+ expect { cluster_agent.reload }.not_to raise_error(ActiveRecord::RecordNotFound)
+ end
+ end
+
+ context 'with user permissions' do
+ before do
+ project.add_maintainer(user)
+ end
+
+ it 'deletes a cluster agent', :aggregate_failures do
+ expect { service.execute(cluster_agent) }.to change { ::Clusters::Agent.count }.by(-1)
+ expect { cluster_agent.reload }.to raise_error(ActiveRecord::RecordNotFound)
+ end
+ end
+ end
+end
diff --git a/spec/services/concerns/rate_limited_service_spec.rb b/spec/services/concerns/rate_limited_service_spec.rb
new file mode 100644
index 00000000000..f73871b7e44
--- /dev/null
+++ b/spec/services/concerns/rate_limited_service_spec.rb
@@ -0,0 +1,196 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe RateLimitedService do
+ let(:key) { :issues_create }
+ let(:scope) { [:project, :current_user] }
+ let(:opts) { { scope: scope, users_allowlist: -> { [User.support_bot.username] } } }
+ let(:rate_limiter_klass) { ::Gitlab::ApplicationRateLimiter }
+ let(:rate_limiter_instance) { rate_limiter_klass.new(key, **opts) }
+
+ describe 'RateLimitedError' do
+ subject { described_class::RateLimitedError.new(key: key, rate_limiter: rate_limiter_instance) }
+
+ describe '#headers' do
+ it 'returns a Hash of HTTP headers' do
+ # TODO: This will be fleshed out in https://gitlab.com/gitlab-org/gitlab/-/issues/342370
+ expected_headers = {}
+
+ expect(subject.headers).to eq(expected_headers)
+ end
+ end
+
+ describe '#log_request' do
+ it 'logs the request' do
+ request = instance_double(Grape::Request)
+ user = instance_double(User)
+
+ expect(rate_limiter_klass).to receive(:log_request).with(request, "#{key}_request_limit".to_sym, user)
+
+ subject.log_request(request, user)
+ end
+ end
+ end
+
+ describe 'RateLimiterScopedAndKeyed' do
+ subject { described_class::RateLimiterScopedAndKeyed.new(key: key, opts: opts, rate_limiter_klass: rate_limiter_klass) }
+
+ describe '#rate_limit!' do
+ let(:project_with_feature_enabled) { create(:project) }
+ let(:project_without_feature_enabled) { create(:project) }
+
+ let(:project) { nil }
+
+ let(:current_user) { create(:user) }
+ let(:service) { instance_double(Issues::CreateService, project: project, current_user: current_user) }
+ let(:evaluated_scope) { [project, current_user] }
+ let(:evaluated_opts) { { scope: evaluated_scope, users_allowlist: %w[support-bot] } }
+ let(:rate_limited_service_issues_create_feature_enabled) { nil }
+
+ before do
+ allow(rate_limiter_klass).to receive(:new).with(key, **evaluated_opts).and_return(rate_limiter_instance)
+ stub_feature_flags(rate_limited_service_issues_create: rate_limited_service_issues_create_feature_enabled)
+ end
+
+ shared_examples 'a service that does not attempt to throttle' do
+ it 'does not attempt to throttle' do
+ expect(rate_limiter_instance).not_to receive(:throttled?)
+
+ expect(subject.rate_limit!(service)).to be_nil
+ end
+ end
+
+ shared_examples 'a service that does attempt to throttle' do
+ before do
+ allow(rate_limiter_instance).to receive(:throttled?).and_return(throttled)
+ end
+
+ context 'when rate limiting is not in effect' do
+ let(:throttled) { false }
+
+ it 'does not raise an exception' do
+ expect(subject.rate_limit!(service)).to be_nil
+ end
+ end
+
+ context 'when rate limiting is in effect' do
+ let(:throttled) { true }
+
+ it 'raises a RateLimitedError exception' do
+ expect { subject.rate_limit!(service) }.to raise_error(described_class::RateLimitedError, 'This endpoint has been requested too many times. Try again later.')
+ end
+ end
+ end
+
+ context 'when :rate_limited_service_issues_create feature is globally disabled' do
+ let(:rate_limited_service_issues_create_feature_enabled) { false }
+
+ it_behaves_like 'a service that does not attempt to throttle'
+ end
+
+ context 'when :rate_limited_service_issues_create feature is globally enabled' do
+ let(:throttled) { nil }
+ let(:rate_limited_service_issues_create_feature_enabled) { true }
+ let(:project) { project_without_feature_enabled }
+
+ it_behaves_like 'a service that does attempt to throttle'
+ end
+
+ context 'when :rate_limited_service_issues_create feature is enabled for project_with_feature_enabled' do
+ let(:throttled) { nil }
+ let(:rate_limited_service_issues_create_feature_enabled) { project_with_feature_enabled }
+
+ context 'for project_without_feature_enabled' do
+ let(:project) { project_without_feature_enabled }
+
+ it_behaves_like 'a service that does not attempt to throttle'
+ end
+
+ context 'for project_with_feature_enabled' do
+ let(:project) { project_with_feature_enabled }
+
+ it_behaves_like 'a service that does attempt to throttle'
+ end
+ end
+ end
+ end
+
+ describe '#execute_without_rate_limiting' do
+ let(:rate_limiter_scoped_and_keyed) { instance_double(RateLimitedService::RateLimiterScopedAndKeyed) }
+ let(:subject) do
+ local_key = key
+ local_opts = opts
+
+ Class.new do
+ prepend RateLimitedService
+
+ rate_limit key: local_key, opts: local_opts
+
+ def execute(*args, **kwargs)
+ 'main logic here'
+ end
+ end.new
+ end
+
+ before do
+ allow(RateLimitedService::RateLimiterScopedAndKeyed).to receive(:new).with(key: key, opts: opts, rate_limiter_klass: rate_limiter_klass).and_return(rate_limiter_scoped_and_keyed)
+ end
+
+ context 'bypasses rate limiting' do
+ it 'calls super' do
+ expect(rate_limiter_scoped_and_keyed).not_to receive(:rate_limit!).with(subject)
+
+ expect(subject.execute_without_rate_limiting).to eq('main logic here')
+ end
+ end
+ end
+
+ describe '#execute' do
+ context 'when rate_limit has not been called' do
+ let(:subject) { Class.new { prepend RateLimitedService }.new }
+
+ it 'raises an RateLimitedNotSetupError exception' do
+ expect { subject.execute }.to raise_error(described_class::RateLimitedNotSetupError)
+ end
+ end
+
+ context 'when rate_limit has been called' do
+ let(:rate_limiter_scoped_and_keyed) { instance_double(RateLimitedService::RateLimiterScopedAndKeyed) }
+ let(:subject) do
+ local_key = key
+ local_opts = opts
+
+ Class.new do
+ prepend RateLimitedService
+
+ rate_limit key: local_key, opts: local_opts
+
+ def execute(*args, **kwargs)
+ 'main logic here'
+ end
+ end.new
+ end
+
+ before do
+ allow(RateLimitedService::RateLimiterScopedAndKeyed).to receive(:new).with(key: key, opts: opts, rate_limiter_klass: rate_limiter_klass).and_return(rate_limiter_scoped_and_keyed)
+ end
+
+ context 'and applies rate limiting' do
+ it 'raises an RateLimitedService::RateLimitedError exception' do
+ expect(rate_limiter_scoped_and_keyed).to receive(:rate_limit!).with(subject).and_raise(RateLimitedService::RateLimitedError.new(key: key, rate_limiter: rate_limiter_instance))
+
+ expect { subject.execute }.to raise_error(RateLimitedService::RateLimitedError)
+ end
+ end
+
+ context 'but does not apply rate limiting' do
+ it 'calls super' do
+ expect(rate_limiter_scoped_and_keyed).to receive(:rate_limit!).with(subject).and_return(nil)
+
+ expect(subject.execute).to eq('main logic here')
+ end
+ end
+ end
+ end
+end
diff --git a/spec/services/container_expiration_policies/cleanup_service_spec.rb b/spec/services/container_expiration_policies/cleanup_service_spec.rb
index 5f284b9dd8b..a1f76e5e5dd 100644
--- a/spec/services/container_expiration_policies/cleanup_service_spec.rb
+++ b/spec/services/container_expiration_policies/cleanup_service_spec.rb
@@ -24,8 +24,8 @@ RSpec.describe ContainerExpirationPolicies::CleanupService do
it 'completely clean up the repository' do
expect(Projects::ContainerRepository::CleanupTagsService)
- .to receive(:new).with(project, nil, cleanup_tags_service_params).and_return(cleanup_tags_service)
- expect(cleanup_tags_service).to receive(:execute).with(repository).and_return(status: :success)
+ .to receive(:new).with(repository, nil, cleanup_tags_service_params).and_return(cleanup_tags_service)
+ expect(cleanup_tags_service).to receive(:execute).and_return(status: :success)
response = subject
@@ -69,6 +69,7 @@ RSpec.describe ContainerExpirationPolicies::CleanupService do
before_truncate_size: 800,
after_truncate_size: 200,
before_delete_size: 100,
+ cached_tags_count: 0,
deleted_size: 100
}
end
@@ -86,6 +87,7 @@ RSpec.describe ContainerExpirationPolicies::CleanupService do
cleanup_tags_service_before_truncate_size: 800,
cleanup_tags_service_after_truncate_size: 200,
cleanup_tags_service_before_delete_size: 100,
+ cleanup_tags_service_cached_tags_count: 0,
cleanup_tags_service_deleted_size: 100
)
expect(ContainerRepository.waiting_for_cleanup.count).to eq(1)
diff --git a/spec/services/customer_relations/contacts/create_service_spec.rb b/spec/services/customer_relations/contacts/create_service_spec.rb
new file mode 100644
index 00000000000..71eb447055e
--- /dev/null
+++ b/spec/services/customer_relations/contacts/create_service_spec.rb
@@ -0,0 +1,61 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe CustomerRelations::Contacts::CreateService do
+ describe '#execute' do
+ let_it_be(:user) { create(:user) }
+ let_it_be(:not_found_or_does_not_belong) { 'The specified organization was not found or does not belong to this group' }
+
+ let(:params) { attributes_for(:contact, group: group) }
+
+ subject(:response) { described_class.new(group: 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_reporter(user)
+ end
+
+ it 'returns an error' do
+ expect(response).to be_error
+ expect(response.message).to match_array(['You have insufficient permissions to create a contact for this group'])
+ end
+ end
+
+ context 'when user has permission' do
+ let_it_be(:group) { create(:group) }
+
+ before_all do
+ group.add_developer(user)
+ end
+
+ it 'creates a contact' do
+ expect(response).to be_success
+ end
+
+ it 'returns an error when the contact is not persisted' do
+ params[:last_name] = nil
+
+ expect(response).to be_error
+ expect(response.message).to match_array(["Last name can't be blank"])
+ end
+
+ it 'returns an error when the organization_id is invalid' do
+ params[:organization_id] = non_existing_record_id
+
+ expect(response).to be_error
+ expect(response.message).to match_array([not_found_or_does_not_belong])
+ end
+
+ it 'returns an error when the organization belongs to a different group' do
+ organization = create(:organization)
+ params[:organization_id] = organization.id
+
+ expect(response).to be_error
+ expect(response.message).to match_array([not_found_or_does_not_belong])
+ end
+ end
+ end
+end
diff --git a/spec/services/customer_relations/contacts/update_service_spec.rb b/spec/services/customer_relations/contacts/update_service_spec.rb
new file mode 100644
index 00000000000..7c5fbabb600
--- /dev/null
+++ b/spec/services/customer_relations/contacts/update_service_spec.rb
@@ -0,0 +1,56 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe CustomerRelations::Contacts::UpdateService do
+ let_it_be(:user) { create(:user) }
+
+ let(:contact) { create(:contact, first_name: 'Mark', group: group) }
+
+ subject(:update) { described_class.new(group: group, current_user: user, params: params).execute(contact) }
+
+ describe '#execute' do
+ context 'when the user has no permission' do
+ let_it_be(:group) { create(:group) }
+
+ let(:params) { { first_name: 'Gary' } }
+
+ it 'returns an error' do
+ response = update
+
+ expect(response).to be_error
+ expect(response.message).to match_array(['You have insufficient permissions to update a contact for this group'])
+ end
+ end
+
+ context 'when user has permission' do
+ let_it_be(:group) { create(:group) }
+
+ before_all do
+ group.add_developer(user)
+ end
+
+ context 'when first_name is changed' do
+ let(:params) { { first_name: 'Gary' } }
+
+ it 'updates the contact' do
+ response = update
+
+ expect(response).to be_success
+ expect(response.payload.first_name).to eq('Gary')
+ end
+ end
+
+ context 'when the contact is invalid' do
+ let(:params) { { first_name: nil } }
+
+ it 'returns an error' do
+ response = update
+
+ expect(response).to be_error
+ expect(response.message).to match_array(["First name can't be blank"])
+ end
+ end
+ end
+ end
+end
diff --git a/spec/services/customer_relations/organizations/create_service_spec.rb b/spec/services/customer_relations/organizations/create_service_spec.rb
index b4764f6b97a..d8985d8d90b 100644
--- a/spec/services/customer_relations/organizations/create_service_spec.rb
+++ b/spec/services/customer_relations/organizations/create_service_spec.rb
@@ -12,22 +12,24 @@ RSpec.describe CustomerRelations::Organizations::CreateService do
subject(:response) { described_class.new(group: group, current_user: user, params: params).execute }
it 'creates an organization' do
- group.add_reporter(user)
+ group.add_developer(user)
expect(response).to be_success
end
it 'returns an error when user does not have permission' do
+ group.add_reporter(user)
+
expect(response).to be_error
- expect(response.message).to eq('You have insufficient permissions to create an organization for this group')
+ expect(response.message).to match_array(['You have insufficient permissions to create an organization for this group'])
end
it 'returns an error when the organization is not persisted' do
- group.add_reporter(user)
+ group.add_developer(user)
params[:name] = nil
expect(response).to be_error
- expect(response.message).to eq(["Name can't be blank"])
+ expect(response.message).to match_array(["Name can't be blank"])
end
end
end
diff --git a/spec/services/customer_relations/organizations/update_service_spec.rb b/spec/services/customer_relations/organizations/update_service_spec.rb
index eb253540863..bc40cb3e8e7 100644
--- a/spec/services/customer_relations/organizations/update_service_spec.rb
+++ b/spec/services/customer_relations/organizations/update_service_spec.rb
@@ -19,7 +19,7 @@ RSpec.describe CustomerRelations::Organizations::UpdateService do
response = update
expect(response).to be_error
- expect(response.message).to eq('You have insufficient permissions to update an organization for this group')
+ expect(response.message).to eq(['You have insufficient permissions to update an organization for this group'])
end
end
@@ -27,7 +27,7 @@ RSpec.describe CustomerRelations::Organizations::UpdateService do
let_it_be(:group) { create(:group) }
before_all do
- group.add_reporter(user)
+ group.add_developer(user)
end
context 'when name is changed' do
diff --git a/spec/services/dependency_proxy/auth_token_service_spec.rb b/spec/services/dependency_proxy/auth_token_service_spec.rb
index 6214d75dfa0..c686f57c5cb 100644
--- a/spec/services/dependency_proxy/auth_token_service_spec.rb
+++ b/spec/services/dependency_proxy/auth_token_service_spec.rb
@@ -4,47 +4,72 @@ require 'spec_helper'
RSpec.describe DependencyProxy::AuthTokenService do
include DependencyProxyHelpers
- describe '.decoded_token_payload' do
- let_it_be(:user) { create(:user) }
- let_it_be(:token) { build_jwt(user) }
+ let_it_be(:user) { create(:user) }
+ let_it_be(:deploy_token) { create(:deploy_token) }
- subject { described_class.decoded_token_payload(token.encoded) }
+ describe '.user_or_deploy_token_from_jwt' do
+ subject { described_class.user_or_deploy_token_from_jwt(token.encoded) }
- it 'returns the user' do
- result = subject
+ shared_examples 'handling token errors' do
+ context 'with a decoding error' do
+ before do
+ allow(JWT).to receive(:decode).and_raise(JWT::DecodeError)
+ end
- expect(result['user_id']).to eq(user.id)
- expect(result['deploy_token']).to be_nil
- end
+ it { is_expected.to eq(nil) }
+ end
- context 'with a deploy token' do
- let_it_be(:deploy_token) { create(:deploy_token) }
- let_it_be(:token) { build_jwt(deploy_token) }
+ context 'with an immature signature error' do
+ before do
+ allow(JWT).to receive(:decode).and_raise(JWT::ImmatureSignature)
+ end
- it 'returns the deploy token' do
- result = subject
+ it { is_expected.to eq(nil) }
+ end
- expect(result['deploy_token']).to eq(deploy_token.token)
- expect(result['user_id']).to be_nil
+ context 'with an expired signature error' do
+ it 'returns nil' do
+ travel_to(Time.zone.now + Auth::DependencyProxyAuthenticationService.token_expire_at + 1.minute) do
+ expect(subject).to eq(nil)
+ end
+ end
end
end
- it 'raises an error if the token is expired' do
- travel_to(Time.zone.now + Auth::DependencyProxyAuthenticationService.token_expire_at + 1.minute) do
- expect { subject }.to raise_error(JWT::ExpiredSignature)
+ context 'with a user' do
+ let_it_be(:token) { build_jwt(user) }
+
+ it { is_expected.to eq(user) }
+
+ context 'with an invalid user id' do
+ let_it_be(:token) { build_jwt { |jwt| jwt['user_id'] = 'this_is_not_a_user_id' } }
+
+ it 'raises an not found error' do
+ expect { subject }.to raise_error(ActiveRecord::RecordNotFound)
+ end
end
+
+ it_behaves_like 'handling token errors'
end
- it 'raises an error if decoding fails' do
- allow(JWT).to receive(:decode).and_raise(JWT::DecodeError)
+ context 'with a deploy token' do
+ let_it_be(:token) { build_jwt(deploy_token) }
+
+ it { is_expected.to eq(deploy_token) }
+
+ context 'with an invalid token' do
+ let_it_be(:token) { build_jwt { |jwt| jwt['deploy_token'] = 'this_is_not_a_token' } }
+
+ it { is_expected.to eq(nil) }
+ end
- expect { subject }.to raise_error(JWT::DecodeError)
+ it_behaves_like 'handling token errors'
end
- it 'raises an error if signature is immature' do
- allow(JWT).to receive(:decode).and_raise(JWT::ImmatureSignature)
+ context 'with an empty token payload' do
+ let_it_be(:token) { build_jwt(nil) }
- expect { subject }.to raise_error(JWT::ImmatureSignature)
+ it { is_expected.to eq(nil) }
end
end
end
diff --git a/spec/services/dependency_proxy/find_or_create_blob_service_spec.rb b/spec/services/dependency_proxy/find_or_create_blob_service_spec.rb
index 3fac749be29..20b0546effa 100644
--- a/spec/services/dependency_proxy/find_or_create_blob_service_spec.rb
+++ b/spec/services/dependency_proxy/find_or_create_blob_service_spec.rb
@@ -4,7 +4,8 @@ require 'spec_helper'
RSpec.describe DependencyProxy::FindOrCreateBlobService do
include DependencyProxyHelpers
- let(:blob) { create(:dependency_proxy_blob) }
+ let_it_be_with_reload(:blob) { create(:dependency_proxy_blob) }
+
let(:group) { blob.group }
let(:image) { 'alpine' }
let(:tag) { '3.9' }
@@ -17,11 +18,7 @@ RSpec.describe DependencyProxy::FindOrCreateBlobService do
stub_registry_auth(image, token)
end
- context 'no cache' do
- before do
- stub_blob_download(image, blob_sha)
- end
-
+ shared_examples 'downloads the remote blob' do
it 'downloads blob from remote registry if there is no cached one' do
expect(subject[:status]).to eq(:success)
expect(subject[:blob]).to be_a(DependencyProxy::Blob)
@@ -30,15 +27,34 @@ RSpec.describe DependencyProxy::FindOrCreateBlobService do
end
end
+ context 'no cache' do
+ before do
+ stub_blob_download(image, blob_sha)
+ end
+
+ it_behaves_like 'downloads the remote blob'
+ end
+
context 'cached blob' do
let(:blob_sha) { blob.file_name.sub('.gz', '') }
it 'uses cached blob instead of downloading one' do
+ expect { subject }.to change { blob.reload.updated_at }
+
expect(subject[:status]).to eq(:success)
expect(subject[:blob]).to be_a(DependencyProxy::Blob)
expect(subject[:blob]).to eq(blob)
expect(subject[:from_cache]).to eq true
end
+
+ context 'when the cached blob is expired' do
+ before do
+ blob.update_column(:status, DependencyProxy::Blob.statuses[:expired])
+ stub_blob_download(image, blob_sha)
+ end
+
+ it_behaves_like 'downloads the remote blob'
+ end
end
context 'no such blob exists remotely' do
diff --git a/spec/services/dependency_proxy/find_or_create_manifest_service_spec.rb b/spec/services/dependency_proxy/find_or_create_manifest_service_spec.rb
index 5896aa255f0..b3f88f91289 100644
--- a/spec/services/dependency_proxy/find_or_create_manifest_service_spec.rb
+++ b/spec/services/dependency_proxy/find_or_create_manifest_service_spec.rb
@@ -21,19 +21,19 @@ RSpec.describe DependencyProxy::FindOrCreateManifestService do
describe '#execute' do
subject { described_class.new(group, image, tag, token).execute }
+ shared_examples 'downloading the manifest' do
+ it 'downloads manifest from remote registry if there is no cached one', :aggregate_failures do
+ expect { subject }.to change { group.dependency_proxy_manifests.count }.by(1)
+ expect(subject[:status]).to eq(:success)
+ expect(subject[:manifest]).to be_a(DependencyProxy::Manifest)
+ expect(subject[:manifest]).to be_persisted
+ expect(subject[:from_cache]).to eq false
+ end
+ end
+
context 'when no manifest exists' do
let_it_be(:image) { 'new-image' }
- shared_examples 'downloading the manifest' do
- it 'downloads manifest from remote registry if there is no cached one', :aggregate_failures do
- expect { subject }.to change { group.dependency_proxy_manifests.count }.by(1)
- expect(subject[:status]).to eq(:success)
- expect(subject[:manifest]).to be_a(DependencyProxy::Manifest)
- expect(subject[:manifest]).to be_persisted
- expect(subject[:from_cache]).to eq false
- end
- end
-
context 'successful head request' do
before do
stub_manifest_head(image, tag, headers: headers)
@@ -60,6 +60,8 @@ RSpec.describe DependencyProxy::FindOrCreateManifestService do
shared_examples 'using the cached manifest' do
it 'uses cached manifest instead of downloading one', :aggregate_failures do
+ expect { subject }.to change { dependency_proxy_manifest.reload.updated_at }
+
expect(subject[:status]).to eq(:success)
expect(subject[:manifest]).to be_a(DependencyProxy::Manifest)
expect(subject[:manifest]).to eq(dependency_proxy_manifest)
@@ -87,6 +89,16 @@ RSpec.describe DependencyProxy::FindOrCreateManifestService do
end
end
+ context 'when the cached manifest is expired' do
+ before do
+ dependency_proxy_manifest.update_column(:status, DependencyProxy::Manifest.statuses[:expired])
+ stub_manifest_head(image, tag, headers: headers)
+ stub_manifest_download(image, tag, headers: headers)
+ end
+
+ it_behaves_like 'downloading the manifest'
+ end
+
context 'failed connection' do
before do
expect(DependencyProxy::HeadManifestService).to receive(:new).and_raise(Net::OpenTimeout)
diff --git a/spec/services/dependency_proxy/group_settings/update_service_spec.rb b/spec/services/dependency_proxy/group_settings/update_service_spec.rb
new file mode 100644
index 00000000000..6f8c55daa8d
--- /dev/null
+++ b/spec/services/dependency_proxy/group_settings/update_service_spec.rb
@@ -0,0 +1,60 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe ::DependencyProxy::GroupSettings::UpdateService do
+ using RSpec::Parameterized::TableSyntax
+
+ let_it_be_with_reload(:group) { create(:group) }
+ let_it_be_with_reload(:group_settings) { create(:dependency_proxy_group_setting, group: group) }
+ let_it_be(:user) { create(:user) }
+ let_it_be(:params) { { enabled: false } }
+
+ describe '#execute' do
+ subject { described_class.new(container: group, current_user: user, params: params).execute }
+
+ shared_examples 'updating the dependency proxy group settings' do
+ it_behaves_like 'updating the dependency proxy group settings attributes',
+ from: { enabled: true },
+ to: { enabled: false }
+
+ it 'returns a success' do
+ result = subject
+
+ expect(result.payload[:dependency_proxy_setting]).to be_present
+ expect(result).to be_success
+ end
+ end
+
+ shared_examples 'denying access to dependency proxy group settings' do
+ context 'with existing dependency proxy group settings' do
+ it 'returns an error' do
+ result = subject
+
+ expect(result).to have_attributes(
+ message: 'Access Denied',
+ status: :error,
+ http_status: 403
+ )
+ end
+ end
+ end
+
+ where(:user_role, :shared_examples_name) do
+ :maintainer | 'updating the dependency proxy group settings'
+ :developer | 'updating the dependency proxy group settings'
+ :reporter | 'denying access to dependency proxy group settings'
+ :guest | 'denying access to dependency proxy group settings'
+ :anonymous | 'denying access to dependency proxy group settings'
+ end
+
+ with_them do
+ before do
+ stub_config(dependency_proxy: { enabled: true })
+ group.send("add_#{user_role}", user) unless user_role == :anonymous
+ end
+
+ it_behaves_like params[:shared_examples_name]
+ end
+ end
+end
diff --git a/spec/services/deployments/older_deployments_drop_service_spec.rb b/spec/services/deployments/older_deployments_drop_service_spec.rb
index 6152a95cc3c..e6fd6725d7d 100644
--- a/spec/services/deployments/older_deployments_drop_service_spec.rb
+++ b/spec/services/deployments/older_deployments_drop_service_spec.rb
@@ -84,7 +84,7 @@ RSpec.describe Deployments::OlderDeploymentsDropService do
it 'does not drop an older deployment and tracks the exception' do
expect(Gitlab::ErrorTracking).to receive(:track_exception)
- .with(kind_of(RuntimeError), subject_id: deployment.id, deployment_id: older_deployment.id)
+ .with(kind_of(RuntimeError), subject_id: deployment.id, build_id: older_deployment.deployable_id)
expect { subject }.not_to change { Ci::Build.failed.count }
end
diff --git a/spec/services/deployments/update_service_spec.rb b/spec/services/deployments/update_service_spec.rb
index 16b24d0dee8..d3840189ba4 100644
--- a/spec/services/deployments/update_service_spec.rb
+++ b/spec/services/deployments/update_service_spec.rb
@@ -34,9 +34,11 @@ RSpec.describe Deployments::UpdateService do
expect(deploy).to be_canceled
end
- it 'raises ArgumentError if the status is invalid' do
- expect { described_class.new(deploy, status: 'kittens').execute }
- .to raise_error(ArgumentError)
+ it 'does not change the state if the status is invalid' do
+ expect(described_class.new(deploy, status: 'kittens').execute)
+ .to be_falsy
+
+ expect(deploy).to be_created
end
it 'links merge requests when changing the status to success', :sidekiq_inline do
diff --git a/spec/services/error_tracking/list_issues_service_spec.rb b/spec/services/error_tracking/list_issues_service_spec.rb
index b49095ab8b9..a7bd6c75df5 100644
--- a/spec/services/error_tracking/list_issues_service_spec.rb
+++ b/spec/services/error_tracking/list_issues_service_spec.rb
@@ -5,56 +5,71 @@ require 'spec_helper'
RSpec.describe ErrorTracking::ListIssuesService do
include_context 'sentry error tracking context'
- let(:params) { { search_term: 'something', sort: 'last_seen', cursor: 'some-cursor' } }
- let(:list_sentry_issues_args) do
- {
- issue_status: 'unresolved',
- limit: 20,
- search_term: 'something',
- sort: 'last_seen',
- cursor: 'some-cursor'
- }
- end
+ let(:params) { {} }
subject { described_class.new(project, user, params) }
describe '#execute' do
- context 'with authorized user' do
- let(:issues) { [] }
+ context 'Sentry backend' do
+ let(:params) { { search_term: 'something', sort: 'last_seen', cursor: 'some-cursor' } }
+
+ let(:list_sentry_issues_args) do
+ {
+ issue_status: 'unresolved',
+ limit: 20,
+ search_term: 'something',
+ sort: 'last_seen',
+ cursor: 'some-cursor'
+ }
+ end
+
+ context 'with authorized user' do
+ let(:issues) { [] }
+
+ described_class::ISSUE_STATUS_VALUES.each do |status|
+ it "returns the issues with #{status} issue_status" do
+ params[:issue_status] = status
+ list_sentry_issues_args[:issue_status] = status
+ expect_list_sentry_issues_with(list_sentry_issues_args)
+
+ expect(result).to eq(status: :success, pagination: {}, issues: issues)
+ end
+ end
- described_class::ISSUE_STATUS_VALUES.each do |status|
- it "returns the issues with #{status} issue_status" do
- params[:issue_status] = status
- list_sentry_issues_args[:issue_status] = status
+ it 'returns the issues with no issue_status' do
expect_list_sentry_issues_with(list_sentry_issues_args)
expect(result).to eq(status: :success, pagination: {}, issues: issues)
end
- end
- it 'returns the issues with no issue_status' do
- expect_list_sentry_issues_with(list_sentry_issues_args)
+ it 'returns bad request for an issue_status not on the whitelist' do
+ params[:issue_status] = 'assigned'
+
+ expect(error_tracking_setting).not_to receive(:list_sentry_issues)
+ expect(result).to eq(message: "Bad Request: Invalid issue_status", status: :error, http_status: :bad_request)
+ end
- expect(result).to eq(status: :success, pagination: {}, issues: issues)
+ include_examples 'error tracking service data not ready', :list_sentry_issues
+ include_examples 'error tracking service sentry error handling', :list_sentry_issues
+ include_examples 'error tracking service http status handling', :list_sentry_issues
end
- it 'returns bad request for an issue_status not on the whitelist' do
- params[:issue_status] = 'assigned'
+ include_examples 'error tracking service unauthorized user'
+ include_examples 'error tracking service disabled'
- expect(error_tracking_setting).not_to receive(:list_sentry_issues)
- expect(result).to eq(message: "Bad Request: Invalid issue_status", status: :error, http_status: :bad_request)
+ def expect_list_sentry_issues_with(list_sentry_issues_args)
+ expect(error_tracking_setting)
+ .to receive(:list_sentry_issues)
+ .with(list_sentry_issues_args)
+ .and_return(issues: [], pagination: {})
end
-
- include_examples 'error tracking service data not ready', :list_sentry_issues
- include_examples 'error tracking service sentry error handling', :list_sentry_issues
- include_examples 'error tracking service http status handling', :list_sentry_issues
end
- include_examples 'error tracking service unauthorized user'
- include_examples 'error tracking service disabled'
+ context 'GitLab backend' do
+ let_it_be(:error1) { create(:error_tracking_error, name: 'foo', project: project) }
+ let_it_be(:error2) { create(:error_tracking_error, name: 'bar', project: project) }
- context 'integrated error tracking' do
- let_it_be(:error) { create(:error_tracking_error, project: project) }
+ let(:params) { { limit: '1' } }
before do
error_tracking_setting.update!(integrated: true)
@@ -63,7 +78,9 @@ RSpec.describe ErrorTracking::ListIssuesService do
it 'returns the error in expected format' do
expect(result[:status]).to eq(:success)
expect(result[:issues].size).to eq(1)
- expect(result[:issues].first.to_json).to eq(error.to_sentry_error.to_json)
+ expect(result[:issues].first.to_json).to eq(error2.to_sentry_error.to_json)
+ expect(result[:pagination][:next][:cursor]).to be_present
+ expect(result[:pagination][:previous]).to be_nil
end
end
end
@@ -76,10 +93,3 @@ RSpec.describe ErrorTracking::ListIssuesService do
end
end
end
-
-def expect_list_sentry_issues_with(list_sentry_issues_args)
- expect(error_tracking_setting)
- .to receive(:list_sentry_issues)
- .with(list_sentry_issues_args)
- .and_return(issues: [], pagination: {})
-end
diff --git a/spec/services/feature_flags/hook_service_spec.rb b/spec/services/feature_flags/hook_service_spec.rb
new file mode 100644
index 00000000000..02cdbbd86ac
--- /dev/null
+++ b/spec/services/feature_flags/hook_service_spec.rb
@@ -0,0 +1,31 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe FeatureFlags::HookService do
+ describe '#execute_hooks' do
+ let_it_be(:namespace) { create(:namespace) }
+ let_it_be(:project) { create(:project, :repository, namespace: namespace) }
+ let_it_be(:feature_flag) { create(:operations_feature_flag, project: project) }
+ let_it_be(:user) { namespace.owner }
+
+ let!(:hook) { create(:project_hook, project: project) }
+ let(:hook_data) { double }
+
+ subject(:service) { described_class.new(feature_flag, user) }
+
+ describe 'HOOK_NAME' do
+ specify { expect(described_class::HOOK_NAME).to eq(:feature_flag_hooks) }
+ end
+
+ before do
+ allow(Gitlab::DataBuilder::FeatureFlag).to receive(:build).with(feature_flag, user).once.and_return(hook_data)
+ end
+
+ it 'calls feature_flag.project.execute_hooks' do
+ expect(feature_flag.project).to receive(:execute_hooks).with(hook_data, described_class::HOOK_NAME)
+
+ service.execute
+ end
+ end
+end
diff --git a/spec/services/groups/transfer_service_spec.rb b/spec/services/groups/transfer_service_spec.rb
index 889b5551746..ee38c0fbb44 100644
--- a/spec/services/groups/transfer_service_spec.rb
+++ b/spec/services/groups/transfer_service_spec.rb
@@ -3,6 +3,19 @@
require 'spec_helper'
RSpec.describe Groups::TransferService 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|
+ project.reload
+
+ expect(project.full_path).to eq("#{group_full_path}/#{project.path}")
+ expect(project.project_namespace.full_path).to eq(project.full_path)
+ expect(project.project_namespace.parent).to eq(project.namespace)
+ expect(project.project_namespace.visibility_level).to eq(project.visibility_level)
+ end
+ end
+ end
+
let_it_be(:user) { create(:user) }
let_it_be(:new_parent_group) { create(:group, :public) }
@@ -169,6 +182,18 @@ RSpec.describe Groups::TransferService do
expect(project.full_path).to eq("#{group.path}/#{project.path}")
end
end
+
+ context 'when projects have project namespaces' do
+ let_it_be(:project1) { create(:project, :private, namespace: group) }
+ let_it_be(:project_namespace1) { create(:project_namespace, project: project1) }
+ let_it_be(:project2) { create(:project, :private, namespace: group) }
+ let_it_be(:project_namespace2) { create(:project_namespace, project: project2) }
+
+ it_behaves_like 'project namespace path is in sync with project path' do
+ let(:group_full_path) { "#{group.path}" }
+ let(:projects_with_project_namespace) { [project1, project2] }
+ end
+ end
end
end
@@ -222,10 +247,10 @@ RSpec.describe Groups::TransferService do
context 'when the parent group has a project with the same path' do
let_it_be_with_reload(:group) { create(:group, :public, :nested, path: 'foo') }
+ let_it_be(:membership) { create(:group_member, :owner, group: new_parent_group, user: user) }
+ let_it_be(:project) { create(:project, path: 'foo', namespace: new_parent_group) }
before do
- create(:group_member, :owner, group: new_parent_group, user: user)
- create(:project, path: 'foo', namespace: new_parent_group)
group.update_attribute(:path, 'foo')
end
@@ -237,6 +262,19 @@ RSpec.describe Groups::TransferService do
transfer_service.execute(new_parent_group)
expect(transfer_service.error).to eq('Transfer failed: Validation failed: Group URL has already been taken')
end
+
+ context 'when projects have project namespaces' do
+ let!(:project_namespace) { create(:project_namespace, project: project) }
+
+ before do
+ transfer_service.execute(new_parent_group)
+ end
+
+ it_behaves_like 'project namespace path is in sync with project path' do
+ let(:group_full_path) { "#{new_parent_group.full_path}" }
+ let(:projects_with_project_namespace) { [project] }
+ end
+ end
end
context 'when the group is allowed to be transferred' do
@@ -324,7 +362,7 @@ RSpec.describe Groups::TransferService 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: 'disabled_with_override' }).and_call_original
+ expect(Groups::UpdateSharedRunnersService).to receive(:new).with(group, user, { shared_runners_setting: Namespace::SR_DISABLED_WITH_OVERRIDE }).and_call_original
transfer_service.execute(new_parent_group)
end
@@ -334,7 +372,7 @@ RSpec.describe Groups::TransferService do
let(:new_parent_group) { create(:group, shared_runners_enabled: false, allow_descendants_override_disabled_shared_runners: false) }
it 'calls update service' do
- expect(Groups::UpdateSharedRunnersService).to receive(:new).with(group, user, { shared_runners_setting: 'disabled_and_unoverridable' }).and_call_original
+ expect(Groups::UpdateSharedRunnersService).to receive(:new).with(group, user, { shared_runners_setting: Namespace::SR_DISABLED_AND_UNOVERRIDABLE }).and_call_original
transfer_service.execute(new_parent_group)
end
@@ -407,6 +445,8 @@ RSpec.describe Groups::TransferService do
context 'when transferring a group with project descendants' do
let!(:project1) { create(:project, :repository, :private, namespace: group) }
let!(:project2) { create(:project, :repository, :internal, namespace: group) }
+ let!(:project_namespace1) { create(:project_namespace, project: project1) }
+ let!(:project_namespace2) { create(:project_namespace, project: project2) }
before do
TestEnv.clean_test_path
@@ -432,18 +472,30 @@ RSpec.describe Groups::TransferService do
expect(project1.private?).to be_truthy
expect(project2.internal?).to be_truthy
end
+
+ it_behaves_like 'project namespace path is in sync with project path' do
+ let(:group_full_path) { "#{new_parent_group.path}/#{group.path}" }
+ let(:projects_with_project_namespace) { [project1, project2] }
+ end
end
context 'when the new parent has a lower visibility than the projects' do
let!(:project1) { create(:project, :repository, :public, namespace: group) }
let!(:project2) { create(:project, :repository, :public, namespace: group) }
- let(:new_parent_group) { create(:group, :private) }
+ let!(:new_parent_group) { create(:group, :private) }
+ let!(:project_namespace1) { create(:project_namespace, project: project1) }
+ let!(:project_namespace2) { create(:project_namespace, project: project2) }
it 'updates projects visibility to match the new parent' do
group.projects.each do |project|
expect(project.private?).to be_truthy
end
end
+
+ it_behaves_like 'project namespace path is in sync with project path' do
+ let(:group_full_path) { "#{new_parent_group.path}/#{group.path}" }
+ let(:projects_with_project_namespace) { [project1, project2] }
+ end
end
end
@@ -452,6 +504,8 @@ RSpec.describe Groups::TransferService do
let!(:project2) { create(:project, :repository, :internal, namespace: group) }
let!(:subgroup1) { create(:group, :private, parent: group) }
let!(:subgroup2) { create(:group, :internal, parent: group) }
+ let!(:project_namespace1) { create(:project_namespace, project: project1) }
+ let!(:project_namespace2) { create(:project_namespace, project: project2) }
before do
TestEnv.clean_test_path
@@ -480,6 +534,11 @@ RSpec.describe Groups::TransferService do
expect(project1.redirect_routes.count).to eq(1)
expect(project2.redirect_routes.count).to eq(1)
end
+
+ it_behaves_like 'project namespace path is in sync with project path' do
+ let(:group_full_path) { "#{new_parent_group.path}/#{group.path}" }
+ let(:projects_with_project_namespace) { [project1, project2] }
+ end
end
context 'when transferring a group with nested groups and projects' do
@@ -651,6 +710,30 @@ RSpec.describe Groups::TransferService do
expect(project1.public?).to be_truthy
end
end
+
+ context 'when group has pending builds' do
+ let_it_be(:project) { create(:project, :public, namespace: group.reload) }
+ let_it_be(:other_project) { create(:project) }
+ let_it_be(:pending_build) { create(:ci_pending_build, project: project) }
+ let_it_be(:unrelated_pending_build) { create(:ci_pending_build, project: other_project) }
+
+ before do
+ group.add_owner(user)
+ new_parent_group.add_owner(user)
+ end
+
+ it 'updates pending builds for the group', :aggregate_failures do
+ transfer_service.execute(new_parent_group)
+
+ pending_build.reload
+ unrelated_pending_build.reload
+
+ expect(pending_build.namespace_id).to eq(group.id)
+ expect(pending_build.namespace_traversal_ids).to eq(group.traversal_ids)
+ expect(unrelated_pending_build.namespace_id).to eq(other_project.namespace_id)
+ expect(unrelated_pending_build.namespace_traversal_ids).to eq(other_project.namespace.traversal_ids)
+ end
+ end
end
context 'when transferring a subgroup into root group' do
diff --git a/spec/services/groups/update_service_spec.rb b/spec/services/groups/update_service_spec.rb
index bc7c066fa04..e1bd3732820 100644
--- a/spec/services/groups/update_service_spec.rb
+++ b/spec/services/groups/update_service_spec.rb
@@ -287,7 +287,7 @@ RSpec.describe Groups::UpdateService do
let(:group) { create(:group) }
let(:project) { create(:project, shared_runners_enabled: true, group: group) }
- subject { described_class.new(group, user, shared_runners_setting: 'disabled_and_unoverridable').execute }
+ subject { described_class.new(group, user, shared_runners_setting: Namespace::SR_DISABLED_AND_UNOVERRIDABLE).execute }
before do
group.add_owner(user)
diff --git a/spec/services/groups/update_shared_runners_service_spec.rb b/spec/services/groups/update_shared_runners_service_spec.rb
index fe18277b5cd..53870e810b1 100644
--- a/spec/services/groups/update_shared_runners_service_spec.rb
+++ b/spec/services/groups/update_shared_runners_service_spec.rb
@@ -85,10 +85,10 @@ RSpec.describe Groups::UpdateSharedRunnersService do
context 'disable shared Runners' do
let_it_be(:group) { create(:group) }
- let(:params) { { shared_runners_setting: 'disabled_and_unoverridable' } }
+ let(:params) { { shared_runners_setting: Namespace::SR_DISABLED_AND_UNOVERRIDABLE } }
it 'receives correct method and succeeds' do
- expect(group).to receive(:update_shared_runners_setting!).with('disabled_and_unoverridable')
+ expect(group).to receive(:update_shared_runners_setting!).with(Namespace::SR_DISABLED_AND_UNOVERRIDABLE)
expect(subject[:status]).to eq(:success)
end
@@ -108,13 +108,13 @@ RSpec.describe Groups::UpdateSharedRunnersService do
end
context 'allow descendants to override' do
- let(:params) { { shared_runners_setting: 'disabled_with_override' } }
+ 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('disabled_with_override')
+ expect(group).to receive(:update_shared_runners_setting!).with(Namespace::SR_DISABLED_WITH_OVERRIDE)
expect(subject[:status]).to eq(:success)
end
diff --git a/spec/services/import/validate_remote_git_endpoint_service_spec.rb b/spec/services/import/validate_remote_git_endpoint_service_spec.rb
new file mode 100644
index 00000000000..fbd8a3cb323
--- /dev/null
+++ b/spec/services/import/validate_remote_git_endpoint_service_spec.rb
@@ -0,0 +1,96 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Import::ValidateRemoteGitEndpointService do
+ include StubRequests
+
+ let_it_be(:base_url) { 'http://demo.host/path' }
+ let_it_be(:endpoint_url) { "#{base_url}/info/refs?service=git-upload-pack" }
+ let_it_be(:error_message) { "#{base_url} is not a valid HTTP Git repository" }
+
+ describe '#execute' do
+ let(:valid_response) do
+ { status: 200,
+ body: '001e# service=git-upload-pack',
+ headers: { 'Content-Type': 'application/x-git-upload-pack-advertisement' } }
+ end
+
+ it 'correctly handles URLs with fragment' do
+ allow(Gitlab::HTTP).to receive(:get)
+
+ described_class.new(url: "#{base_url}#somehash").execute
+
+ expect(Gitlab::HTTP).to have_received(:get).with(endpoint_url, basic_auth: nil, stream_body: true, follow_redirects: false)
+ end
+
+ context 'when receiving HTTP response' do
+ subject { described_class.new(url: base_url) }
+
+ it 'returns success when HTTP response is valid and contains correct payload' do
+ stub_full_request(endpoint_url, method: :get).to_return(valid_response)
+
+ result = subject.execute
+
+ expect(result).to be_a(ServiceResponse)
+ expect(result.success?).to be(true)
+ end
+
+ it 'reports error when status code is not 200' do
+ stub_full_request(endpoint_url, method: :get).to_return(valid_response.merge({ status: 301 }))
+
+ result = subject.execute
+
+ expect(result).to be_a(ServiceResponse)
+ expect(result.error?).to be(true)
+ expect(result.message).to eq(error_message)
+ end
+
+ it 'reports error when invalid URL is provided' do
+ result = described_class.new(url: 1).execute
+
+ expect(result).to be_a(ServiceResponse)
+ expect(result.error?).to be(true)
+ expect(result.message).to eq('1 is not a valid URL')
+ end
+
+ it 'reports error when required header is missing' do
+ stub_full_request(endpoint_url, method: :get).to_return(valid_response.merge({ headers: nil }))
+
+ result = subject.execute
+
+ expect(result).to be_a(ServiceResponse)
+ expect(result.error?).to be(true)
+ expect(result.message).to eq(error_message)
+ end
+
+ it 'reports error when body is in invalid format' do
+ stub_full_request(endpoint_url, method: :get).to_return(valid_response.merge({ body: 'invalid content' }))
+
+ result = subject.execute
+
+ expect(result).to be_a(ServiceResponse)
+ expect(result.error?).to be(true)
+ expect(result.message).to eq(error_message)
+ end
+
+ it 'reports error when exception is raised' do
+ stub_full_request(endpoint_url, method: :get).to_raise(SocketError.new('dummy message'))
+
+ result = subject.execute
+
+ expect(result).to be_a(ServiceResponse)
+ expect(result.error?).to be(true)
+ expect(result.message).to eq(error_message)
+ end
+ end
+
+ it 'passes basic auth when credentials are provided' do
+ allow(Gitlab::HTTP).to receive(:get)
+
+ described_class.new(url: "#{base_url}#somehash", user: 'user', password: 'password').execute
+
+ expect(Gitlab::HTTP).to have_received(:get).with(endpoint_url, basic_auth: { username: 'user', password: 'password' }, stream_body: true, follow_redirects: false)
+ end
+ end
+end
diff --git a/spec/services/issues/close_service_spec.rb b/spec/services/issues/close_service_spec.rb
index 14e6b44f7b0..93ef046a632 100644
--- a/spec/services/issues/close_service_spec.rb
+++ b/spec/services/issues/close_service_spec.rb
@@ -22,6 +22,18 @@ RSpec.describe Issues::CloseService do
describe '#execute' do
let(:service) { described_class.new(project: project, current_user: user) }
+ context 'when skip_authorization is true' do
+ it 'does close the issue even if user is not authorized' do
+ non_authorized_user = create(:user)
+
+ service = described_class.new(project: project, current_user: non_authorized_user)
+
+ expect do
+ service.execute(issue, skip_authorization: true)
+ end.to change { issue.reload.state }.from('opened').to('closed')
+ end
+ end
+
it 'checks if the user is authorized to update the issue' do
expect(service).to receive(:can?).with(user, :update_issue, issue)
.and_call_original
@@ -156,7 +168,7 @@ RSpec.describe Issues::CloseService do
context 'updating `metrics.first_mentioned_in_commit_at`' do
context 'when `metrics.first_mentioned_in_commit_at` is not set' do
it 'uses the first commit authored timestamp' do
- expected = closing_merge_request.commits.first.authored_date
+ expected = closing_merge_request.commits.take(100).last.authored_date
close_issue
diff --git a/spec/services/issues/create_service_spec.rb b/spec/services/issues/create_service_spec.rb
index 3988069d83a..1887be4896e 100644
--- a/spec/services/issues/create_service_spec.rb
+++ b/spec/services/issues/create_service_spec.rb
@@ -10,6 +10,25 @@ RSpec.describe Issues::CreateService do
let(:spam_params) { double }
+ describe '.rate_limiter_scoped_and_keyed' do
+ it 'is set via the rate_limit call' do
+ expect(described_class.rate_limiter_scoped_and_keyed).to be_a(RateLimitedService::RateLimiterScopedAndKeyed)
+
+ expect(described_class.rate_limiter_scoped_and_keyed.key).to eq(:issues_create)
+ expect(described_class.rate_limiter_scoped_and_keyed.opts[:scope]).to eq(%i[project current_user])
+ expect(described_class.rate_limiter_scoped_and_keyed.opts[:users_allowlist].call).to eq(%w[support-bot])
+ expect(described_class.rate_limiter_scoped_and_keyed.rate_limiter_klass).to eq(Gitlab::ApplicationRateLimiter)
+ end
+ end
+
+ describe '#rate_limiter_bypassed' do
+ let(:subject) { described_class.new(project: project, spam_params: {}) }
+
+ it 'is nil by default' do
+ expect(subject.rate_limiter_bypassed).to be_nil
+ end
+ end
+
describe '#execute' do
let_it_be(:assignee) { create(:user) }
let_it_be(:milestone) { create(:milestone, project: project) }
diff --git a/spec/services/issues/relative_position_rebalancing_service_spec.rb b/spec/services/issues/relative_position_rebalancing_service_spec.rb
index d5d81770817..20064bd7e4b 100644
--- a/spec/services/issues/relative_position_rebalancing_service_spec.rb
+++ b/spec/services/issues/relative_position_rebalancing_service_spec.rb
@@ -3,7 +3,7 @@
require 'spec_helper'
RSpec.describe Issues::RelativePositionRebalancingService, :clean_gitlab_redis_shared_state do
- let_it_be(:project, reload: true) { create(:project) }
+ let_it_be(:project, reload: true) { create(:project, :repository_disabled, skip_disk_validation: true) }
let_it_be(:user) { project.creator }
let_it_be(:start) { RelativePositioning::START_POSITION }
let_it_be(:max_pos) { RelativePositioning::MAX_POSITION }
@@ -28,12 +28,18 @@ RSpec.describe Issues::RelativePositionRebalancingService, :clean_gitlab_redis_s
end
end
+ let_it_be(:nil_clump, reload: true) do
+ (1..100).to_a.map do |i|
+ create(:issue, project: project, author: user, relative_position: nil)
+ end
+ end
+
before do
stub_feature_flags(issue_rebalancing_with_retry: false)
end
def issues_in_position_order
- project.reload.issues.reorder(relative_position: :asc).to_a
+ project.reload.issues.order_by_relative_position.to_a
end
subject(:service) { described_class.new(Project.id_in(project)) }
@@ -44,16 +50,19 @@ RSpec.describe Issues::RelativePositionRebalancingService, :clean_gitlab_redis_s
expect { service.execute }.not_to change { issues_in_position_order.map(&:id) }
+ caching = service.send(:caching)
all_issues.each(&:reset)
gaps = all_issues.take(all_issues.count - 1).zip(all_issues.drop(1)).map do |a, b|
b.relative_position - a.relative_position
end
+ expect(caching.issue_count).to eq(900)
expect(gaps).to all(be > RelativePositioning::MIN_GAP)
expect(all_issues.first.relative_position).to be > (RelativePositioning::MIN_POSITION * 0.9999)
expect(all_issues.last.relative_position).to be < (RelativePositioning::MAX_POSITION * 0.9999)
expect(project.root_namespace.issue_repositioning_disabled?).to be false
+ expect(project.issues.with_null_relative_position.count).to eq(100)
end
it 'is idempotent' do
@@ -111,7 +120,7 @@ RSpec.describe Issues::RelativePositionRebalancingService, :clean_gitlab_redis_s
allow(caching).to receive(:concurrent_running_rebalances_count).and_return(10)
allow(service).to receive(:caching).and_return(caching)
- expect { service.execute }.not_to raise_error(Issues::RelativePositionRebalancingService::TooManyConcurrentRebalances)
+ expect { service.execute }.not_to raise_error
end
context 're-balancing is retried on statement timeout exceptions' do
diff --git a/spec/services/issues/reopen_service_spec.rb b/spec/services/issues/reopen_service_spec.rb
index 86190c4e475..c9469b861ac 100644
--- a/spec/services/issues/reopen_service_spec.rb
+++ b/spec/services/issues/reopen_service_spec.rb
@@ -8,18 +8,26 @@ RSpec.describe Issues::ReopenService do
describe '#execute' do
context 'when user is not authorized to reopen issue' do
- before do
+ it 'does not reopen the issue' do
guest = create(:user)
project.add_guest(guest)
- perform_enqueued_jobs do
- described_class.new(project: project, current_user: guest).execute(issue)
- end
- end
+ described_class.new(project: project, current_user: guest).execute(issue)
- it 'does not reopen the issue' do
expect(issue).to be_closed
end
+
+ context 'when skip_authorization is true' do
+ it 'does close the issue even if user is not authorized' do
+ non_authorized_user = create(:user)
+
+ service = described_class.new(project: project, current_user: non_authorized_user)
+
+ expect do
+ service.execute(issue, skip_authorization: true)
+ end.to change { issue.reload.state }.from('closed').to('opened')
+ end
+ end
end
context 'when user is authorized to reopen issue' do
diff --git a/spec/services/members/create_service_spec.rb b/spec/services/members/create_service_spec.rb
index 15ed5c5a33f..2e6e6041fc3 100644
--- a/spec/services/members/create_service_spec.rb
+++ b/spec/services/members/create_service_spec.rb
@@ -80,7 +80,7 @@ RSpec.describe Members::CreateService, :aggregate_failures, :clean_gitlab_redis_
it 'does not add a member' do
expect(execute_service[:status]).to eq(:error)
- expect(execute_service[:message]).to eq('Invite email has already been taken')
+ expect(execute_service[:message]).to eq("The member's email address has already been taken")
expect(OnboardingProgress.completed?(source.namespace, :user_added)).to be(false)
end
end
diff --git a/spec/services/members/invite_service_spec.rb b/spec/services/members/invite_service_spec.rb
index dd82facaf14..478733e8aa0 100644
--- a/spec/services/members/invite_service_spec.rb
+++ b/spec/services/members/invite_service_spec.rb
@@ -150,7 +150,7 @@ RSpec.describe Members::InviteService, :aggregate_failures, :clean_gitlab_redis_
expect_to_create_members(count: 1)
expect(result[:status]).to eq(:error)
expect(result[:message][invited_member.invite_email])
- .to eq("Invite email has already been taken")
+ .to eq("The member's email address has already been taken")
expect(project.users).to include project_user
end
end
diff --git a/spec/services/merge_requests/assign_issues_service_spec.rb b/spec/services/merge_requests/assign_issues_service_spec.rb
index b857f26c052..cf405c0102e 100644
--- a/spec/services/merge_requests/assign_issues_service_spec.rb
+++ b/spec/services/merge_requests/assign_issues_service_spec.rb
@@ -17,7 +17,7 @@ RSpec.describe MergeRequests::AssignIssuesService do
expect(service.assignable_issues.map(&:id)).to include(issue.id)
end
- it 'ignores issues the user cannot update assignee on' do
+ it 'ignores issues the user cannot update assignee on', :sidekiq_inline do
project.team.truncate
expect(service.assignable_issues).to be_empty
diff --git a/spec/services/merge_requests/build_service_spec.rb b/spec/services/merge_requests/build_service_spec.rb
index 0f282384661..ab3d9880d29 100644
--- a/spec/services/merge_requests/build_service_spec.rb
+++ b/spec/services/merge_requests/build_service_spec.rb
@@ -440,7 +440,7 @@ RSpec.describe MergeRequests::BuildService do
expect(merge_request.title).to eq('Closes #1234 Second commit')
end
- it 'adds the remaining lines of the first multi-line commit message as the description' do
+ it 'adds the remaining lines of the first multi-line commit message as the description', :sidekiq_inline do
expect(merge_request.description).to eq('Create the app')
end
end
diff --git a/spec/services/merge_requests/mergeability/check_base_service_spec.rb b/spec/services/merge_requests/mergeability/check_base_service_spec.rb
new file mode 100644
index 00000000000..f07522b43cb
--- /dev/null
+++ b/spec/services/merge_requests/mergeability/check_base_service_spec.rb
@@ -0,0 +1,40 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe MergeRequests::Mergeability::CheckBaseService do
+ subject(:check_base_service) { described_class.new(merge_request: merge_request, params: params) }
+
+ let(:merge_request) { double }
+ let(:params) { double }
+
+ describe '#merge_request' do
+ it 'returns the merge_request' do
+ expect(check_base_service.merge_request).to eq merge_request
+ end
+ end
+
+ describe '#params' do
+ it 'returns the params' do
+ expect(check_base_service.params).to eq params
+ end
+ end
+
+ describe '#skip?' do
+ it 'raises NotImplementedError' do
+ expect { check_base_service.skip? }.to raise_error(NotImplementedError)
+ end
+ end
+
+ describe '#cacheable?' do
+ it 'raises NotImplementedError' do
+ expect { check_base_service.skip? }.to raise_error(NotImplementedError)
+ end
+ end
+
+ describe '#cache_key?' do
+ it 'raises NotImplementedError' do
+ expect { check_base_service.skip? }.to raise_error(NotImplementedError)
+ end
+ end
+end
diff --git a/spec/services/merge_requests/mergeability/check_ci_status_service_spec.rb b/spec/services/merge_requests/mergeability/check_ci_status_service_spec.rb
new file mode 100644
index 00000000000..6fbbecd7c0e
--- /dev/null
+++ b/spec/services/merge_requests/mergeability/check_ci_status_service_spec.rb
@@ -0,0 +1,57 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe MergeRequests::Mergeability::CheckCiStatusService do
+ subject(:check_ci_status) { described_class.new(merge_request: merge_request, params: params) }
+
+ let(:merge_request) { build(:merge_request) }
+ let(:params) { { skip_ci_check: skip_check } }
+ let(:skip_check) { false }
+
+ describe '#execute' do
+ before do
+ expect(merge_request).to receive(:mergeable_ci_state?).and_return(mergeable)
+ end
+
+ context 'when the merge request is in a mergable state' do
+ let(:mergeable) { true }
+
+ it 'returns a check result with status success' do
+ expect(check_ci_status.execute.status).to eq Gitlab::MergeRequests::Mergeability::CheckResult::SUCCESS_STATUS
+ end
+ end
+
+ context 'when the merge request is not in a mergeable state' do
+ let(:mergeable) { false }
+
+ it 'returns a check result with status failed' do
+ expect(check_ci_status.execute.status).to eq Gitlab::MergeRequests::Mergeability::CheckResult::FAILED_STATUS
+ end
+ end
+ end
+
+ describe '#skip?' do
+ context 'when skip check is true' do
+ let(:skip_check) { true }
+
+ it 'returns true' do
+ expect(check_ci_status.skip?).to eq true
+ end
+ end
+
+ context 'when skip check is false' do
+ let(:skip_check) { false }
+
+ it 'returns false' do
+ expect(check_ci_status.skip?).to eq false
+ end
+ end
+ end
+
+ describe '#cacheable?' do
+ it 'returns false' do
+ expect(check_ci_status.cacheable?).to eq false
+ end
+ end
+end
diff --git a/spec/services/merge_requests/mergeability/run_checks_service_spec.rb b/spec/services/merge_requests/mergeability/run_checks_service_spec.rb
new file mode 100644
index 00000000000..170d99f4642
--- /dev/null
+++ b/spec/services/merge_requests/mergeability/run_checks_service_spec.rb
@@ -0,0 +1,104 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe MergeRequests::Mergeability::RunChecksService do
+ subject(:run_checks) { described_class.new(merge_request: merge_request, params: {}) }
+
+ let_it_be(:merge_request) { create(:merge_request) }
+
+ describe '#CHECKS' do
+ it 'contains every subclass of the base checks service' do
+ expect(described_class::CHECKS).to contain_exactly(*MergeRequests::Mergeability::CheckBaseService.subclasses)
+ end
+ end
+
+ describe '#execute' do
+ subject(:execute) { run_checks.execute }
+
+ let(:params) { {} }
+ let(:success_result) { Gitlab::MergeRequests::Mergeability::CheckResult.success }
+
+ context 'when every check is skipped' do
+ before do
+ MergeRequests::Mergeability::CheckBaseService.subclasses.each do |subclass|
+ expect_next_instance_of(subclass) do |service|
+ expect(service).to receive(:skip?).and_return(true)
+ end
+ end
+ end
+
+ it 'is still a success' do
+ expect(execute.all?(&:success?)).to eq(true)
+ end
+ end
+
+ context 'when a check is skipped' do
+ it 'does not execute the check' do
+ expect_next_instance_of(MergeRequests::Mergeability::CheckCiStatusService) do |service|
+ expect(service).to receive(:skip?).and_return(true)
+ expect(service).not_to receive(:execute)
+ end
+
+ expect(execute).to match_array([])
+ end
+ end
+
+ context 'when a check is not skipped' do
+ let(:cacheable) { true }
+ let(:merge_check) { instance_double(MergeRequests::Mergeability::CheckCiStatusService) }
+
+ before do
+ expect(MergeRequests::Mergeability::CheckCiStatusService).to receive(:new).and_return(merge_check)
+ expect(merge_check).to receive(:skip?).and_return(false)
+ allow(merge_check).to receive(:cacheable?).and_return(cacheable)
+ allow(merge_check).to receive(:execute).and_return(success_result)
+ end
+
+ context 'when the check is cacheable' do
+ context 'when the check is cached' do
+ it 'returns the cached result' do
+ expect_next_instance_of(Gitlab::MergeRequests::Mergeability::ResultsStore) do |service|
+ expect(service).to receive(:read).with(merge_check: merge_check).and_return(success_result)
+ end
+
+ expect(execute).to match_array([success_result])
+ end
+ end
+
+ context 'when the check is not cached' do
+ it 'writes and returns the result' do
+ expect_next_instance_of(Gitlab::MergeRequests::Mergeability::ResultsStore) do |service|
+ expect(service).to receive(:read).with(merge_check: merge_check).and_return(nil)
+ expect(service).to receive(:write).with(merge_check: merge_check, result_hash: success_result.to_hash).and_return(true)
+ end
+
+ expect(execute).to match_array([success_result])
+ end
+ end
+ end
+
+ context 'when check is not cacheable' do
+ let(:cacheable) { false }
+
+ it 'does not call the results store' do
+ expect(Gitlab::MergeRequests::Mergeability::ResultsStore).not_to receive(:new)
+
+ expect(execute).to match_array([success_result])
+ end
+ end
+
+ context 'when mergeability_caching is turned off' do
+ before do
+ stub_feature_flags(mergeability_caching: false)
+ end
+
+ it 'does not call the results store' do
+ expect(Gitlab::MergeRequests::Mergeability::ResultsStore).not_to receive(:new)
+
+ expect(execute).to match_array([success_result])
+ end
+ end
+ end
+ end
+end
diff --git a/spec/services/merge_requests/push_options_handler_service_spec.rb b/spec/services/merge_requests/push_options_handler_service_spec.rb
index f00a8928109..348ea9ad7d4 100644
--- a/spec/services/merge_requests/push_options_handler_service_spec.rb
+++ b/spec/services/merge_requests/push_options_handler_service_spec.rb
@@ -701,7 +701,7 @@ RSpec.describe MergeRequests::PushOptionsHandlerService do
let(:push_options) { { create: true } }
let(:changes) { new_branch_changes }
- it 'records an error' do
+ it 'records an error', :sidekiq_inline do
Members::DestroyService.new(user1).execute(ProjectMember.find_by!(user_id: user1.id))
service.execute
diff --git a/spec/services/notes/quick_actions_service_spec.rb b/spec/services/notes/quick_actions_service_spec.rb
index 0a56f01ebba..bca954c3959 100644
--- a/spec/services/notes/quick_actions_service_spec.rb
+++ b/spec/services/notes/quick_actions_service_spec.rb
@@ -47,7 +47,7 @@ RSpec.describe Notes::QuickActionsService do
let(:note_text) { "/relate #{other_issue.to_reference}" }
let(:note) { create(:note_on_issue, noteable: issue, project: project, note: note_text) }
- context 'user cannot relate issues' do
+ context 'user cannot relate issues', :sidekiq_inline do
before do
project.team.find_member(maintainer.id).destroy!
project.update!(visibility: Gitlab::VisibilityLevel::PUBLIC)
diff --git a/spec/services/notification_service_spec.rb b/spec/services/notification_service_spec.rb
index a03f1f17b39..48718cbc24a 100644
--- a/spec/services/notification_service_spec.rb
+++ b/spec/services/notification_service_spec.rb
@@ -3155,7 +3155,7 @@ RSpec.describe NotificationService, :mailer do
notification.pipeline_finished(pipeline)
end
- it 'does not send emails' do
+ it 'does not send emails', :sidekiq_inline do
should_not_email_anyone
end
end
diff --git a/spec/services/packages/composer/create_package_service_spec.rb b/spec/services/packages/composer/create_package_service_spec.rb
index 2ffd0a269f2..593777faa55 100644
--- a/spec/services/packages/composer/create_package_service_spec.rb
+++ b/spec/services/packages/composer/create_package_service_spec.rb
@@ -24,25 +24,6 @@ RSpec.describe Packages::Composer::CreatePackageService do
let(:created_package) { Packages::Package.composer.last }
- shared_examples 'using the cache update worker' do
- context 'with remove_composer_v1_cache_code enabled' do
- it 'does not enqueue a cache update job' do
- expect(::Packages::Composer::CacheUpdateWorker).not_to receive(:perform_async)
-
- subject
- end
- end
-
- context 'with remove_composer_v1_cache_code disabled' do
- it 'enqueues a cache update job' do
- stub_feature_flags(remove_composer_v1_cache_code: true)
- expect(::Packages::Composer::CacheUpdateWorker).not_to receive(:perform_async)
-
- subject
- end
- end
- end
-
context 'without an existing package' do
context 'with a branch' do
let(:branch) { project.repository.find_branch('master') }
@@ -64,7 +45,6 @@ RSpec.describe Packages::Composer::CreatePackageService do
it_behaves_like 'assigns build to package'
it_behaves_like 'assigns status to package'
- it_behaves_like 'using the cache update worker'
end
context 'with a tag' do
@@ -89,7 +69,6 @@ RSpec.describe Packages::Composer::CreatePackageService do
it_behaves_like 'assigns build to package'
it_behaves_like 'assigns status to package'
- it_behaves_like 'using the cache update worker'
end
end
@@ -106,8 +85,6 @@ RSpec.describe Packages::Composer::CreatePackageService do
.to change { Packages::Package.composer.count }.by(0)
.and change { Packages::Composer::Metadatum.count }.by(0)
end
-
- it_behaves_like 'using the cache update worker'
end
context 'belonging to another project' do
@@ -129,8 +106,6 @@ RSpec.describe Packages::Composer::CreatePackageService do
.to change { Packages::Package.composer.count }.by(1)
.and change { Packages::Composer::Metadatum.count }.by(1)
end
-
- it_behaves_like 'using the cache update worker'
end
end
end
diff --git a/spec/services/packages/debian/process_changes_service_spec.rb b/spec/services/packages/debian/process_changes_service_spec.rb
index 3069a2806b2..8e5e36cdbcb 100644
--- a/spec/services/packages/debian/process_changes_service_spec.rb
+++ b/spec/services/packages/debian/process_changes_service_spec.rb
@@ -36,7 +36,6 @@ RSpec.describe Packages::Debian::ProcessChangesService do
.to not_change { Packages::Package.count }
.and not_change { Packages::PackageFile.count }
.and not_change { incoming.package_files.count }
- .and not_change { distribution.reload.needs_update? }
.and raise_error(Packages::Debian::ExtractChangesMetadataService::ExtractionError, 'is not a changes file')
end
end
@@ -54,7 +53,6 @@ RSpec.describe Packages::Debian::ProcessChangesService do
.to not_change { Packages::Package.count }
.and not_change { Packages::PackageFile.count }
.and not_change { incoming.package_files.count }
- .and not_change { distribution.reload.needs_update? }
.and raise_error(ActiveRecord::ConnectionTimeoutError, 'connect timeout')
end
end
diff --git a/spec/services/projects/container_repository/cache_tags_created_at_service_spec.rb b/spec/services/projects/container_repository/cache_tags_created_at_service_spec.rb
new file mode 100644
index 00000000000..dfe2ff9e57c
--- /dev/null
+++ b/spec/services/projects/container_repository/cache_tags_created_at_service_spec.rb
@@ -0,0 +1,133 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe ::Projects::ContainerRepository::CacheTagsCreatedAtService, :clean_gitlab_redis_cache do
+ let_it_be(:dummy_tag_class) { Struct.new(:name, :created_at) }
+ let_it_be(:repository) { create(:container_repository) }
+
+ let(:tags) { create_tags(5) }
+ let(:service) { described_class.new(repository) }
+
+ shared_examples 'not interacting with redis' do
+ it 'does not interact with redis' do
+ expect(::Gitlab::Redis::Cache).not_to receive(:with)
+
+ subject
+ end
+ end
+
+ describe '#populate' do
+ subject { service.populate(tags) }
+
+ context 'with tags' do
+ it 'gets values from redis' do
+ expect(::Gitlab::Redis::Cache).to receive(:with).and_call_original
+
+ expect(subject).to eq(0)
+
+ tags.each { |t| expect(t.created_at).to eq(nil) }
+ end
+
+ context 'with cached values' do
+ let(:cached_tags) { tags.first(2) }
+
+ before do
+ ::Gitlab::Redis::Cache.with do |redis|
+ cached_tags.each do |tag|
+ redis.set(cache_key(tag), rfc3339(10.days.ago))
+ end
+ end
+ end
+
+ it 'gets values from redis' do
+ expect(::Gitlab::Redis::Cache).to receive(:with).and_call_original
+
+ expect(subject).to eq(2)
+
+ cached_tags.each { |t| expect(t.created_at).not_to eq(nil) }
+ (tags - cached_tags).each { |t| expect(t.created_at).to eq(nil) }
+ end
+ end
+ end
+
+ context 'with no tags' do
+ let(:tags) { [] }
+
+ it_behaves_like 'not interacting with redis'
+ end
+ end
+
+ describe '#insert' do
+ let(:max_ttl) { 90.days }
+
+ subject { service.insert(tags, max_ttl) }
+
+ context 'with tags' do
+ let(:tag) { tags.first }
+ let(:ttl) { 90.days - 3.days }
+
+ before do
+ travel_to(Time.zone.local(2021, 9, 2, 12, 0, 0))
+
+ tag.created_at = DateTime.rfc3339(3.days.ago.rfc3339)
+ end
+
+ after do
+ travel_back
+ end
+
+ it 'inserts values in redis' do
+ ::Gitlab::Redis::Cache.with do |redis|
+ expect(redis)
+ .to receive(:set)
+ .with(cache_key(tag), rfc3339(tag.created_at), ex: ttl.to_i)
+ .and_call_original
+ end
+
+ subject
+ end
+
+ context 'with some of them already cached' do
+ let(:tag) { tags.first }
+
+ before do
+ ::Gitlab::Redis::Cache.with do |redis|
+ redis.set(cache_key(tag), rfc3339(10.days.ago))
+ end
+ service.populate(tags)
+ end
+
+ it_behaves_like 'not interacting with redis'
+ end
+ end
+
+ context 'with no tags' do
+ let(:tags) { [] }
+
+ it_behaves_like 'not interacting with redis'
+ end
+
+ context 'with no expires_in' do
+ let(:max_ttl) { nil }
+
+ it_behaves_like 'not interacting with redis'
+ end
+ end
+
+ def create_tags(size)
+ Array.new(size) do |i|
+ dummy_tag_class.new("Tag #{i}", nil)
+ end
+ end
+
+ def cache_key(tag)
+ "container_repository:{#{repository.id}}:tag:#{tag.name}:created_at"
+ end
+
+ def rfc3339(date_time)
+ # DateTime rfc3339 is different ActiveSupport::TimeWithZone rfc3339
+ # The caching will use DateTime rfc3339
+ DateTime.rfc3339(date_time.rfc3339).rfc3339
+ end
+end
diff --git a/spec/services/projects/container_repository/cleanup_tags_service_spec.rb b/spec/services/projects/container_repository/cleanup_tags_service_spec.rb
index eed22416868..289bbf4540e 100644
--- a/spec/services/projects/container_repository/cleanup_tags_service_spec.rb
+++ b/spec/services/projects/container_repository/cleanup_tags_service_spec.rb
@@ -2,14 +2,14 @@
require 'spec_helper'
-RSpec.describe Projects::ContainerRepository::CleanupTagsService do
+RSpec.describe Projects::ContainerRepository::CleanupTagsService, :clean_gitlab_redis_cache do
using RSpec::Parameterized::TableSyntax
let_it_be(:user) { create(:user) }
let_it_be(:project, reload: true) { create(:project, :private) }
- let_it_be(:repository) { create(:container_repository, :root, project: project) }
- let(:service) { described_class.new(project, user, params) }
+ let(:repository) { create(:container_repository, :root, project: project) }
+ let(:service) { described_class.new(repository, user, params) }
let(:tags) { %w[latest A Ba Bb C D E] }
before do
@@ -39,291 +39,442 @@ RSpec.describe Projects::ContainerRepository::CleanupTagsService do
end
describe '#execute' do
- subject { service.execute(repository) }
+ subject { service.execute }
- context 'when no params are specified' do
- let(:params) { {} }
+ shared_examples 'reading and removing tags' do |caching_enabled: true|
+ context 'when no params are specified' do
+ let(:params) { {} }
- it 'does not remove anything' do
- expect_any_instance_of(Projects::ContainerRepository::DeleteTagsService)
- .not_to receive(:execute)
+ it 'does not remove anything' do
+ expect_any_instance_of(Projects::ContainerRepository::DeleteTagsService)
+ .not_to receive(:execute)
+ expect_no_caching
- is_expected.to eq(expected_service_response(before_truncate_size: 0, after_truncate_size: 0, before_delete_size: 0))
- end
- end
-
- context 'when regex matching everything is specified' do
- shared_examples 'removes all matches' do
- it 'does remove all tags except latest' do
- expect_delete(%w(A Ba Bb C D E))
-
- is_expected.to eq(expected_service_response(deleted: %w(A Ba Bb C D E)))
+ is_expected.to eq(expected_service_response(before_truncate_size: 0, after_truncate_size: 0, before_delete_size: 0))
end
end
- let(:params) do
- { 'name_regex_delete' => '.*' }
- end
+ context 'when regex matching everything is specified' do
+ shared_examples 'removes all matches' do
+ it 'does remove all tags except latest' do
+ expect_no_caching
- it_behaves_like 'removes all matches'
+ expect_delete(%w(A Ba Bb C D E))
+
+ is_expected.to eq(expected_service_response(deleted: %w(A Ba Bb C D E)))
+ end
+ end
- context 'with deprecated name_regex param' do
let(:params) do
- { 'name_regex' => '.*' }
+ { 'name_regex_delete' => '.*' }
end
it_behaves_like 'removes all matches'
+
+ context 'with deprecated name_regex param' do
+ let(:params) do
+ { 'name_regex' => '.*' }
+ end
+
+ it_behaves_like 'removes all matches'
+ end
end
- end
- context 'with invalid regular expressions' do
- RSpec.shared_examples 'handling an invalid regex' do
- it 'keeps all tags' do
- expect(Projects::ContainerRepository::DeleteTagsService)
- .not_to receive(:new)
- subject
+ context 'with invalid regular expressions' do
+ shared_examples 'handling an invalid regex' do
+ it 'keeps all tags' do
+ expect_no_caching
+
+ expect(Projects::ContainerRepository::DeleteTagsService)
+ .not_to receive(:new)
+
+ subject
+ end
+
+ it { is_expected.to eq(status: :error, message: 'invalid regex') }
+
+ it 'calls error tracking service' do
+ expect(Gitlab::ErrorTracking).to receive(:log_exception).and_call_original
+
+ subject
+ end
end
- it { is_expected.to eq(status: :error, message: 'invalid regex') }
+ context 'when name_regex_delete is invalid' do
+ let(:params) { { 'name_regex_delete' => '*test*' } }
+
+ it_behaves_like 'handling an invalid regex'
+ end
- it 'calls error tracking service' do
- expect(Gitlab::ErrorTracking).to receive(:log_exception).and_call_original
+ context 'when name_regex is invalid' do
+ let(:params) { { 'name_regex' => '*test*' } }
- subject
+ it_behaves_like 'handling an invalid regex'
end
- end
- context 'when name_regex_delete is invalid' do
- let(:params) { { 'name_regex_delete' => '*test*' } }
+ context 'when name_regex_keep is invalid' do
+ let(:params) { { 'name_regex_keep' => '*test*' } }
- it_behaves_like 'handling an invalid regex'
+ it_behaves_like 'handling an invalid regex'
+ end
end
- context 'when name_regex is invalid' do
- let(:params) { { 'name_regex' => '*test*' } }
+ context 'when delete regex matching specific tags is used' do
+ let(:params) do
+ { 'name_regex_delete' => 'C|D' }
+ end
- it_behaves_like 'handling an invalid regex'
- end
+ it 'does remove C and D' do
+ expect_delete(%w(C D))
- context 'when name_regex_keep is invalid' do
- let(:params) { { 'name_regex_keep' => '*test*' } }
+ expect_no_caching
- it_behaves_like 'handling an invalid regex'
- end
- end
+ is_expected.to eq(expected_service_response(deleted: %w(C D), before_truncate_size: 2, after_truncate_size: 2, before_delete_size: 2))
+ end
- context 'when delete regex matching specific tags is used' do
- let(:params) do
- { 'name_regex_delete' => 'C|D' }
- end
+ context 'with overriding allow regex' do
+ let(:params) do
+ { 'name_regex_delete' => 'C|D',
+ 'name_regex_keep' => 'C' }
+ end
- it 'does remove C and D' do
- expect_delete(%w(C D))
+ it 'does not remove C' do
+ expect_delete(%w(D))
- is_expected.to eq(expected_service_response(deleted: %w(C D), before_truncate_size: 2, after_truncate_size: 2, before_delete_size: 2))
- end
+ expect_no_caching
- context 'with overriding allow regex' do
- let(:params) do
- { 'name_regex_delete' => 'C|D',
- 'name_regex_keep' => 'C' }
+ is_expected.to eq(expected_service_response(deleted: %w(D), before_truncate_size: 1, after_truncate_size: 1, before_delete_size: 1))
+ end
end
- it 'does not remove C' do
- expect_delete(%w(D))
+ context 'with name_regex_delete overriding deprecated name_regex' do
+ let(:params) do
+ { 'name_regex' => 'C|D',
+ 'name_regex_delete' => 'D' }
+ end
+
+ it 'does not remove C' do
+ expect_delete(%w(D))
+
+ expect_no_caching
- is_expected.to eq(expected_service_response(deleted: %w(D), before_truncate_size: 1, after_truncate_size: 1, before_delete_size: 1))
+ is_expected.to eq(expected_service_response(deleted: %w(D), before_truncate_size: 1, after_truncate_size: 1, before_delete_size: 1))
+ end
end
end
- context 'with name_regex_delete overriding deprecated name_regex' do
+ context 'with allow regex value' do
let(:params) do
- { 'name_regex' => 'C|D',
- 'name_regex_delete' => 'D' }
+ { 'name_regex_delete' => '.*',
+ 'name_regex_keep' => 'B.*' }
end
- it 'does not remove C' do
- expect_delete(%w(D))
+ it 'does not remove B*' do
+ expect_delete(%w(A C D E))
+
+ expect_no_caching
- is_expected.to eq(expected_service_response(deleted: %w(D), before_truncate_size: 1, after_truncate_size: 1, before_delete_size: 1))
+ is_expected.to eq(expected_service_response(deleted: %w(A C D E), before_truncate_size: 4, after_truncate_size: 4, before_delete_size: 4))
end
end
- end
- context 'with allow regex value' do
- let(:params) do
- { 'name_regex_delete' => '.*',
- 'name_regex_keep' => 'B.*' }
- end
+ context 'when keeping only N tags' do
+ let(:params) do
+ { 'name_regex' => 'A|B.*|C',
+ 'keep_n' => 1 }
+ end
- it 'does not remove B*' do
- expect_delete(%w(A C D E))
+ it 'sorts tags by date' do
+ expect_delete(%w(Bb Ba C))
- is_expected.to eq(expected_service_response(deleted: %w(A C D E), before_truncate_size: 4, after_truncate_size: 4, before_delete_size: 4))
- end
- end
+ expect_no_caching
- context 'when keeping only N tags' do
- let(:params) do
- { 'name_regex' => 'A|B.*|C',
- 'keep_n' => 1 }
+ expect(service).to receive(:order_by_date).and_call_original
+
+ is_expected.to eq(expected_service_response(deleted: %w(Bb Ba C), before_truncate_size: 4, after_truncate_size: 4, before_delete_size: 3))
+ end
end
- it 'sorts tags by date' do
- expect_delete(%w(Bb Ba C))
+ context 'when not keeping N tags' do
+ let(:params) do
+ { 'name_regex' => 'A|B.*|C' }
+ end
+
+ it 'does not sort tags by date' do
+ expect_delete(%w(A Ba Bb C))
- expect(service).to receive(:order_by_date).and_call_original
+ expect_no_caching
- is_expected.to eq(expected_service_response(deleted: %w(Bb Ba C), before_truncate_size: 4, after_truncate_size: 4, before_delete_size: 3))
- end
- end
+ expect(service).not_to receive(:order_by_date)
- context 'when not keeping N tags' do
- let(:params) do
- { 'name_regex' => 'A|B.*|C' }
+ is_expected.to eq(expected_service_response(deleted: %w(A Ba Bb C), before_truncate_size: 4, after_truncate_size: 4, before_delete_size: 4))
+ end
end
- it 'does not sort tags by date' do
- expect_delete(%w(A Ba Bb C))
+ context 'when removing keeping only 3' do
+ let(:params) do
+ { 'name_regex_delete' => '.*',
+ 'keep_n' => 3 }
+ end
- expect(service).not_to receive(:order_by_date)
+ it 'does remove B* and C as they are the oldest' do
+ expect_delete(%w(Bb Ba C))
- is_expected.to eq(expected_service_response(deleted: %w(A Ba Bb C), before_truncate_size: 4, after_truncate_size: 4, before_delete_size: 4))
- end
- end
+ expect_no_caching
- context 'when removing keeping only 3' do
- let(:params) do
- { 'name_regex_delete' => '.*',
- 'keep_n' => 3 }
+ is_expected.to eq(expected_service_response(deleted: %w(Bb Ba C), before_delete_size: 3))
+ end
end
- it 'does remove B* and C as they are the oldest' do
- expect_delete(%w(Bb Ba C))
+ context 'when removing older than 1 day' do
+ let(:params) do
+ { 'name_regex_delete' => '.*',
+ 'older_than' => '1 day' }
+ end
+
+ it 'does remove B* and C as they are older than 1 day' do
+ expect_delete(%w(Ba Bb C))
- is_expected.to eq(expected_service_response(deleted: %w(Bb Ba C), before_delete_size: 3))
- end
- end
+ expect_no_caching
- context 'when removing older than 1 day' do
- let(:params) do
- { 'name_regex_delete' => '.*',
- 'older_than' => '1 day' }
+ is_expected.to eq(expected_service_response(deleted: %w(Ba Bb C), before_delete_size: 3))
+ end
end
- it 'does remove B* and C as they are older than 1 day' do
- expect_delete(%w(Ba Bb C))
+ context 'when combining all parameters' do
+ let(:params) do
+ { 'name_regex_delete' => '.*',
+ 'keep_n' => 1,
+ 'older_than' => '1 day' }
+ end
+
+ it 'does remove B* and C' do
+ expect_delete(%w(Bb Ba C))
- is_expected.to eq(expected_service_response(deleted: %w(Ba Bb C), before_delete_size: 3))
- end
- end
+ expect_no_caching
- context 'when combining all parameters' do
- let(:params) do
- { 'name_regex_delete' => '.*',
- 'keep_n' => 1,
- 'older_than' => '1 day' }
+ is_expected.to eq(expected_service_response(deleted: %w(Bb Ba C), before_delete_size: 3))
+ end
end
- it 'does remove B* and C' do
- expect_delete(%w(Bb Ba C))
+ context 'when running a container_expiration_policy' do
+ let(:user) { nil }
- is_expected.to eq(expected_service_response(deleted: %w(Bb Ba C), before_delete_size: 3))
- end
- end
+ context 'with valid container_expiration_policy param' do
+ let(:params) do
+ { 'name_regex_delete' => '.*',
+ 'keep_n' => 1,
+ 'older_than' => '1 day',
+ 'container_expiration_policy' => true }
+ end
- context 'when running a container_expiration_policy' do
- let(:user) { nil }
+ it 'succeeds without a user' do
+ expect_delete(%w(Bb Ba C), container_expiration_policy: true)
- context 'with valid container_expiration_policy param' do
- let(:params) do
- { 'name_regex_delete' => '.*',
- 'keep_n' => 1,
- 'older_than' => '1 day',
- 'container_expiration_policy' => true }
+ caching_enabled ? expect_caching : expect_no_caching
+
+ is_expected.to eq(expected_service_response(deleted: %w(Bb Ba C), before_delete_size: 3))
+ end
end
- it 'succeeds without a user' do
- expect_delete(%w(Bb Ba C), container_expiration_policy: true)
+ context 'without container_expiration_policy param' do
+ let(:params) do
+ { 'name_regex_delete' => '.*',
+ 'keep_n' => 1,
+ 'older_than' => '1 day' }
+ end
- is_expected.to eq(expected_service_response(deleted: %w(Bb Ba C), before_delete_size: 3))
+ it 'fails' do
+ is_expected.to eq(status: :error, message: 'access denied')
+ end
end
end
- context 'without container_expiration_policy param' do
+ context 'truncating the tags list' do
let(:params) do
- { 'name_regex_delete' => '.*',
- 'keep_n' => 1,
- 'older_than' => '1 day' }
+ {
+ 'name_regex_delete' => '.*',
+ 'keep_n' => 1
+ }
+ end
+
+ shared_examples 'returning the response' do |status:, original_size:, before_truncate_size:, after_truncate_size:, before_delete_size:|
+ it 'returns the response' do
+ expect_no_caching
+
+ result = subject
+
+ service_response = expected_service_response(
+ status: status,
+ original_size: original_size,
+ before_truncate_size: before_truncate_size,
+ after_truncate_size: after_truncate_size,
+ before_delete_size: before_delete_size,
+ deleted: nil
+ )
+
+ expect(result).to eq(service_response)
+ end
+ end
+
+ where(:feature_flag_enabled, :max_list_size, :delete_tags_service_status, :expected_status, :expected_truncated) do
+ false | 10 | :success | :success | false
+ false | 10 | :error | :error | false
+ false | 3 | :success | :success | false
+ false | 3 | :error | :error | false
+ false | 0 | :success | :success | false
+ false | 0 | :error | :error | false
+ true | 10 | :success | :success | false
+ true | 10 | :error | :error | false
+ true | 3 | :success | :error | true
+ true | 3 | :error | :error | true
+ true | 0 | :success | :success | false
+ true | 0 | :error | :error | false
end
- it 'fails' do
- is_expected.to eq(status: :error, message: 'access denied')
+ with_them do
+ before do
+ stub_feature_flags(container_registry_expiration_policies_throttling: feature_flag_enabled)
+ stub_application_setting(container_registry_cleanup_tags_service_max_list_size: max_list_size)
+ allow_next_instance_of(Projects::ContainerRepository::DeleteTagsService) do |service|
+ expect(service).to receive(:execute).and_return(status: delete_tags_service_status)
+ end
+ end
+
+ original_size = 7
+ keep_n = 1
+
+ it_behaves_like(
+ 'returning the response',
+ status: params[:expected_status],
+ original_size: original_size,
+ before_truncate_size: original_size - keep_n,
+ after_truncate_size: params[:expected_truncated] ? params[:max_list_size] + keep_n : original_size - keep_n,
+ before_delete_size: params[:expected_truncated] ? params[:max_list_size] : original_size - keep_n - 1 # one tag is filtered out with older_than filter
+ )
end
end
end
- context 'truncating the tags list' do
+ context 'caching' do
let(:params) do
{
'name_regex_delete' => '.*',
- 'keep_n' => 1
+ 'keep_n' => 1,
+ 'older_than' => '1 day',
+ 'container_expiration_policy' => true
+ }
+ end
+
+ let(:tags_and_created_ats) do
+ {
+ 'A' => 1.hour.ago,
+ 'Ba' => 5.days.ago,
+ 'Bb' => 5.days.ago,
+ 'C' => 1.month.ago,
+ 'D' => nil,
+ 'E' => nil
}
end
- shared_examples 'returning the response' do |status:, original_size:, before_truncate_size:, after_truncate_size:, before_delete_size:|
- it 'returns the response' do
- result = subject
+ let(:cacheable_tags) { tags_and_created_ats.reject { |_, value| value.nil? } }
- service_response = expected_service_response(
- status: status,
- original_size: original_size,
- before_truncate_size: before_truncate_size,
- after_truncate_size: after_truncate_size,
- before_delete_size: before_delete_size,
- deleted: nil
- )
+ before do
+ expect_delete(%w(Bb Ba C), container_expiration_policy: true)
+ travel_to(Time.zone.local(2021, 9, 2, 12, 0, 0))
+ # We froze time so we need to set the created_at stubs again
+ stub_digest_config('sha256:configA', 1.hour.ago)
+ stub_digest_config('sha256:configB', 5.days.ago)
+ stub_digest_config('sha256:configC', 1.month.ago)
+ end
- expect(result).to eq(service_response)
- end
+ after do
+ travel_back
end
- where(:feature_flag_enabled, :max_list_size, :delete_tags_service_status, :expected_status, :expected_truncated) do
- false | 10 | :success | :success | false
- false | 10 | :error | :error | false
- false | 3 | :success | :success | false
- false | 3 | :error | :error | false
- false | 0 | :success | :success | false
- false | 0 | :error | :error | false
- true | 10 | :success | :success | false
- true | 10 | :error | :error | false
- true | 3 | :success | :error | true
- true | 3 | :error | :error | true
- true | 0 | :success | :success | false
- true | 0 | :error | :error | false
+ it 'caches the created_at values' do
+ ::Gitlab::Redis::Cache.with do |redis|
+ expect_mget(redis, tags_and_created_ats.keys)
+
+ expect_set(redis, cacheable_tags)
+ end
+
+ expect(subject).to include(cached_tags_count: 0)
end
- with_them do
+ context 'with cached values' do
before do
- stub_feature_flags(container_registry_expiration_policies_throttling: feature_flag_enabled)
- stub_application_setting(container_registry_cleanup_tags_service_max_list_size: max_list_size)
- allow_next_instance_of(Projects::ContainerRepository::DeleteTagsService) do |service|
- expect(service).to receive(:execute).and_return(status: delete_tags_service_status)
+ ::Gitlab::Redis::Cache.with do |redis|
+ redis.set(cache_key('C'), rfc3339(1.month.ago))
+ end
+ end
+
+ it 'uses them' do
+ ::Gitlab::Redis::Cache.with do |redis|
+ expect_mget(redis, tags_and_created_ats.keys)
+
+ # because C is already in cache, it should not be cached again
+ expect_set(redis, cacheable_tags.except('C'))
+ end
+
+ # We will ping the container registry for all tags *except* for C because it's cached
+ expect(ContainerRegistry::Blob).to receive(:new).with(repository, "digest" => "sha256:configA").and_call_original
+ expect(ContainerRegistry::Blob).to receive(:new).with(repository, "digest" => "sha256:configB").twice.and_call_original
+ expect(ContainerRegistry::Blob).not_to receive(:new).with(repository, "digest" => "sha256:configC")
+ expect(ContainerRegistry::Blob).to receive(:new).with(repository, "digest" => "sha256:configD").and_call_original
+
+ expect(subject).to include(cached_tags_count: 1)
+ end
+ end
+
+ def expect_mget(redis, keys)
+ expect(redis).to receive(:mget).with(keys.map(&method(:cache_key))).and_call_original
+ end
+
+ def expect_set(redis, tags)
+ tags.each do |tag_name, created_at|
+ ex = 1.day.seconds - (Time.zone.now - created_at).seconds
+ if ex > 0
+ expect(redis).to receive(:set).with(cache_key(tag_name), rfc3339(created_at), ex: ex.to_i)
end
end
+ end
+
+ def cache_key(tag_name)
+ "container_repository:{#{repository.id}}:tag:#{tag_name}:created_at"
+ end
+
+ def rfc3339(date_time)
+ # DateTime rfc3339 is different ActiveSupport::TimeWithZone rfc3339
+ # The caching will use DateTime rfc3339
+ DateTime.rfc3339(date_time.rfc3339).rfc3339
+ end
+ end
+
+ context 'with container_registry_expiration_policies_caching enabled for the project' do
+ before do
+ stub_feature_flags(container_registry_expiration_policies_caching: project)
+ end
+
+ it_behaves_like 'reading and removing tags', caching_enabled: true
+ end
- original_size = 7
- keep_n = 1
+ context 'with container_registry_expiration_policies_caching disabled' do
+ before do
+ stub_feature_flags(container_registry_expiration_policies_caching: false)
+ end
+
+ it_behaves_like 'reading and removing tags', caching_enabled: false
+ end
- it_behaves_like(
- 'returning the response',
- status: params[:expected_status],
- original_size: original_size,
- before_truncate_size: original_size - keep_n,
- after_truncate_size: params[:expected_truncated] ? params[:max_list_size] + keep_n : original_size - keep_n,
- before_delete_size: params[:expected_truncated] ? params[:max_list_size] : original_size - keep_n - 1 # one tag is filtered out with older_than filter
- )
+ context 'with container_registry_expiration_policies_caching not enabled for the project' do
+ let_it_be(:another_project) { create(:project) }
+
+ before do
+ stub_feature_flags(container_registry_expiration_policies_caching: another_project)
end
+
+ it_behaves_like 'reading and removing tags', caching_enabled: false
end
end
@@ -368,7 +519,19 @@ RSpec.describe Projects::ContainerRepository::CleanupTagsService do
original_size: original_size,
before_truncate_size: before_truncate_size,
after_truncate_size: after_truncate_size,
- before_delete_size: before_delete_size
+ before_delete_size: before_delete_size,
+ cached_tags_count: 0
}.compact.merge(deleted_size: deleted&.size)
end
+
+ def expect_no_caching
+ expect(::Gitlab::Redis::Cache).not_to receive(:with)
+ end
+
+ def expect_caching
+ ::Gitlab::Redis::Cache.with do |redis|
+ expect(redis).to receive(:mget).and_call_original
+ expect(redis).to receive(:set).and_call_original
+ end
+ end
end
diff --git a/spec/services/projects/create_service_spec.rb b/spec/services/projects/create_service_spec.rb
index e15d9341fd1..d7c43ac676e 100644
--- a/spec/services/projects/create_service_spec.rb
+++ b/spec/services/projects/create_service_spec.rb
@@ -622,6 +622,22 @@ RSpec.describe Projects::CreateService, '#execute' do
end
end
+ context 'when SAST initialization is requested' do
+ let(:project) { create_project(user, opts) }
+
+ before do
+ opts[:initialize_with_sast] = '1'
+ allow(Gitlab::CurrentSettings).to receive(:default_branch_name).and_return('main')
+ end
+
+ it 'creates a commit for SAST', :aggregate_failures do
+ expect(project.repository.commit_count).to be(1)
+ expect(project.repository.commit.message).to eq(
+ 'Configure SAST in `.gitlab-ci.yml`, creating this file if it does not already exist'
+ )
+ end
+ end
+
describe 'create integration for the project' do
subject(:project) { create_project(user, opts) }
@@ -823,25 +839,23 @@ RSpec.describe Projects::CreateService, '#execute' do
let_it_be(:user) { create :user }
context 'when parent group is present' do
- let_it_be(:group) do
+ let_it_be(:group, reload: true) do
create(:group) do |group|
group.add_owner(user)
end
end
before do
- allow_next_found_instance_of(Group) do |group|
- allow(group).to receive(:shared_runners_setting).and_return(shared_runners_setting)
- end
+ group.update_shared_runners_setting!(shared_runners_setting)
user.refresh_authorized_projects # Ensure cache is warm
end
context 'default value based on parent group setting' do
where(:shared_runners_setting, :desired_config_for_new_project, :expected_result_for_project) do
- 'enabled' | nil | true
- 'disabled_with_override' | nil | false
- 'disabled_and_unoverridable' | nil | false
+ Namespace::SR_ENABLED | nil | true
+ Namespace::SR_DISABLED_WITH_OVERRIDE | nil | false
+ Namespace::SR_DISABLED_AND_UNOVERRIDABLE | nil | false
end
with_them do
@@ -858,11 +872,11 @@ RSpec.describe Projects::CreateService, '#execute' do
context 'parent group is present and allows desired config' do
where(:shared_runners_setting, :desired_config_for_new_project, :expected_result_for_project) do
- 'enabled' | true | true
- 'enabled' | false | false
- 'disabled_with_override' | false | false
- 'disabled_with_override' | true | true
- 'disabled_and_unoverridable' | false | false
+ Namespace::SR_ENABLED | true | true
+ Namespace::SR_ENABLED | false | false
+ Namespace::SR_DISABLED_WITH_OVERRIDE | false | false
+ Namespace::SR_DISABLED_WITH_OVERRIDE | true | true
+ Namespace::SR_DISABLED_AND_UNOVERRIDABLE | false | false
end
with_them do
@@ -878,7 +892,7 @@ RSpec.describe Projects::CreateService, '#execute' do
context 'parent group is present and disallows desired config' do
where(:shared_runners_setting, :desired_config_for_new_project) do
- 'disabled_and_unoverridable' | true
+ Namespace::SR_DISABLED_AND_UNOVERRIDABLE | true
end
with_them do
diff --git a/spec/services/projects/destroy_service_spec.rb b/spec/services/projects/destroy_service_spec.rb
index 27688d8c966..9bdd9800fcc 100644
--- a/spec/services/projects/destroy_service_spec.rb
+++ b/spec/services/projects/destroy_service_spec.rb
@@ -39,26 +39,64 @@ RSpec.describe Projects::DestroyService, :aggregate_failures do
let!(:job_variables) { create(:ci_job_variable, job: build) }
let!(:report_result) { create(:ci_build_report_result, build: build) }
let!(:pending_state) { create(:ci_build_pending_state, build: build) }
+ let!(:pipeline_artifact) { create(:ci_pipeline_artifact, pipeline: pipeline) }
- it 'deletes build related records' do
- expect { destroy_project(project, user, {}) }.to change { Ci::Build.count }.by(-1)
+ it 'deletes build and pipeline related records' do
+ expect { destroy_project(project, user, {}) }
+ .to change { Ci::Build.count }.by(-1)
.and change { Ci::BuildTraceChunk.count }.by(-1)
.and change { Ci::JobArtifact.count }.by(-2)
+ .and change { Ci::DeletedObject.count }.by(2)
+ .and change { Ci::PipelineArtifact.count }.by(-1)
.and change { Ci::JobVariable.count }.by(-1)
.and change { Ci::BuildPendingState.count }.by(-1)
.and change { Ci::BuildReportResult.count }.by(-1)
.and change { Ci::BuildRunnerSession.count }.by(-1)
+ .and change { Ci::Pipeline.count }.by(-1)
end
- it 'avoids N+1 queries', skip: 'skipped until fixed in https://gitlab.com/gitlab-org/gitlab/-/issues/24644' do
- recorder = ActiveRecord::QueryRecorder.new { destroy_project(project, user, {}) }
+ context 'with abort_deleted_project_pipelines disabled' do
+ stub_feature_flags(abort_deleted_project_pipelines: false)
- project = create(:project, :repository, namespace: user.namespace)
- pipeline = create(:ci_pipeline, project: project)
- builds = create_list(:ci_build, 3, :artifacts, pipeline: pipeline)
- create_list(:ci_build_trace_chunk, 3, build: builds[0])
+ it 'avoids N+1 queries' do
+ recorder = ActiveRecord::QueryRecorder.new { destroy_project(project, user, {}) }
- expect { destroy_project(project, project.owner, {}) }.not_to exceed_query_limit(recorder)
+ project = create(:project, :repository, namespace: user.namespace)
+ pipeline = create(:ci_pipeline, project: project)
+ builds = create_list(:ci_build, 3, :artifacts, pipeline: pipeline)
+ create(:ci_pipeline_artifact, pipeline: pipeline)
+ create_list(:ci_build_trace_chunk, 3, build: builds[0])
+
+ expect { destroy_project(project, project.owner, {}) }.not_to exceed_query_limit(recorder)
+ end
+ end
+
+ context 'with ci_optimize_project_records_destruction disabled' do
+ stub_feature_flags(ci_optimize_project_records_destruction: false)
+
+ it 'avoids N+1 queries' do
+ recorder = ActiveRecord::QueryRecorder.new { destroy_project(project, user, {}) }
+
+ project = create(:project, :repository, namespace: user.namespace)
+ pipeline = create(:ci_pipeline, project: project)
+ builds = create_list(:ci_build, 3, :artifacts, pipeline: pipeline)
+ create_list(:ci_build_trace_chunk, 3, build: builds[0])
+
+ expect { destroy_project(project, project.owner, {}) }.not_to exceed_query_limit(recorder)
+ end
+ end
+
+ context 'with ci_optimize_project_records_destruction and abort_deleted_project_pipelines enabled' do
+ it 'avoids N+1 queries' do
+ recorder = ActiveRecord::QueryRecorder.new { destroy_project(project, user, {}) }
+
+ project = create(:project, :repository, namespace: user.namespace)
+ pipeline = create(:ci_pipeline, project: project)
+ builds = create_list(:ci_build, 3, :artifacts, pipeline: pipeline)
+ create_list(:ci_build_trace_chunk, 3, build: builds[0])
+
+ expect { destroy_project(project, project.owner, {}) }.not_to exceed_query_limit(recorder)
+ end
end
it_behaves_like 'deleting the project'
@@ -95,24 +133,63 @@ RSpec.describe Projects::DestroyService, :aggregate_failures do
end
context 'with abort_deleted_project_pipelines feature disabled' do
- it 'does not cancel project ci pipelines' do
+ before do
stub_feature_flags(abort_deleted_project_pipelines: false)
+ end
+ it 'does not bulk-fail project ci pipelines' do
expect(::Ci::AbortPipelinesService).not_to receive(:new)
destroy_project(project, user, {})
end
+
+ it 'does not destroy CI records via DestroyPipelineService' do
+ expect(::Ci::DestroyPipelineService).not_to receive(:new)
+
+ destroy_project(project, user, {})
+ end
end
context 'with abort_deleted_project_pipelines feature enabled' do
- it 'performs cancel for project ci pipelines' do
- stub_feature_flags(abort_deleted_project_pipelines: true)
- pipelines = build_list(:ci_pipeline, 3, :running)
- allow(project).to receive(:all_pipelines).and_return(pipelines)
+ let!(:pipelines) { create_list(:ci_pipeline, 3, :running, project: project) }
+ let(:destroy_pipeline_service) { double('DestroyPipelineService', execute: nil) }
- expect(::Ci::AbortPipelinesService).to receive_message_chain(:new, :execute).with(pipelines, :project_deleted)
+ context 'with ci_optimize_project_records_destruction disabled' do
+ before do
+ stub_feature_flags(ci_optimize_project_records_destruction: false)
+ end
- destroy_project(project, user, {})
+ it 'bulk-fails project ci pipelines' do
+ expect(::Ci::AbortPipelinesService)
+ .to receive_message_chain(:new, :execute)
+ .with(project.all_pipelines, :project_deleted)
+
+ destroy_project(project, user, {})
+ end
+
+ it 'does not destroy CI records via DestroyPipelineService' do
+ expect(::Ci::DestroyPipelineService).not_to receive(:new)
+
+ destroy_project(project, user, {})
+ end
+ end
+
+ context 'with ci_optimize_project_records_destruction enabled' do
+ it 'executes DestroyPipelineService for project ci pipelines' do
+ allow(::Ci::DestroyPipelineService).to receive(:new).and_return(destroy_pipeline_service)
+
+ expect(::Ci::AbortPipelinesService)
+ .to receive_message_chain(:new, :execute)
+ .with(project.all_pipelines, :project_deleted)
+
+ pipelines.each do |pipeline|
+ expect(destroy_pipeline_service)
+ .to receive(:execute)
+ .with(pipeline)
+ end
+
+ destroy_project(project, user, {})
+ end
end
end
diff --git a/spec/services/projects/group_links/update_service_spec.rb b/spec/services/projects/group_links/update_service_spec.rb
index 4a38fb0c7d9..ff1618c3bbe 100644
--- a/spec/services/projects/group_links/update_service_spec.rb
+++ b/spec/services/projects/group_links/update_service_spec.rb
@@ -34,86 +34,40 @@ RSpec.describe Projects::GroupLinks::UpdateService, '#execute' do
end
context 'project authorizations update' do
- context 'when the feature flag `specialized_worker_for_project_share_update_auth_recalculation` is enabled' do
- before do
- stub_feature_flags(specialized_worker_for_project_share_update_auth_recalculation: true)
- end
-
- it 'calls AuthorizedProjectUpdate::ProjectRecalculateWorker to update project authorizations' do
- expect(AuthorizedProjectUpdate::ProjectRecalculateWorker)
- .to receive(:perform_async).with(link.project.id)
-
- subject
- end
-
- it 'calls AuthorizedProjectUpdate::UserRefreshFromReplicaWorker with a delay to update project authorizations' do
- expect(AuthorizedProjectUpdate::UserRefreshFromReplicaWorker).to(
- receive(:bulk_perform_in)
- .with(1.hour,
- [[user.id]],
- batch_delay: 30.seconds, batch_size: 100)
- )
-
- subject
- end
-
- it 'updates project authorizations of users who had access to the project via the group share', :sidekiq_inline do
- group.add_maintainer(user)
-
- expect { subject }.to(
- change { Ability.allowed?(user, :create_release, project) }
- .from(true).to(false))
- end
- end
+ it 'calls AuthorizedProjectUpdate::ProjectRecalculateWorker to update project authorizations' do
+ expect(AuthorizedProjectUpdate::ProjectRecalculateWorker)
+ .to receive(:perform_async).with(link.project.id)
- context 'when the feature flag `specialized_worker_for_project_share_update_auth_recalculation` is disabled' do
- before do
- stub_feature_flags(specialized_worker_for_project_share_update_auth_recalculation: false)
- end
+ subject
+ end
- it 'calls UserProjectAccessChangedService to update project authorizations' do
- expect_next_instance_of(UserProjectAccessChangedService, [user.id]) do |service|
- expect(service).to receive(:execute)
- end
+ it 'calls AuthorizedProjectUpdate::UserRefreshFromReplicaWorker with a delay to update project authorizations' do
+ expect(AuthorizedProjectUpdate::UserRefreshFromReplicaWorker).to(
+ receive(:bulk_perform_in)
+ .with(1.hour,
+ [[user.id]],
+ batch_delay: 30.seconds, batch_size: 100)
+ )
- subject
- end
+ subject
+ end
- it 'updates project authorizations of users who had access to the project via the group share' do
- group.add_maintainer(user)
+ it 'updates project authorizations of users who had access to the project via the group share', :sidekiq_inline do
+ group.add_maintainer(user)
- expect { subject }.to(
- change { Ability.allowed?(user, :create_release, project) }
- .from(true).to(false))
- end
+ expect { subject }.to(
+ change { Ability.allowed?(user, :create_release, project) }
+ .from(true).to(false))
end
end
context 'with only param not requiring authorization refresh' do
let(:group_link_params) { { expires_at: Date.tomorrow } }
- context 'when the feature flag `specialized_worker_for_project_share_update_auth_recalculation` is enabled' do
- before do
- stub_feature_flags(specialized_worker_for_project_share_update_auth_recalculation: true)
- end
-
- it 'does not perform any project authorizations update using `AuthorizedProjectUpdate::ProjectRecalculateWorker`' do
- expect(AuthorizedProjectUpdate::ProjectRecalculateWorker).not_to receive(:perform_async)
-
- subject
- end
- end
-
- context 'when the feature flag `specialized_worker_for_project_share_update_auth_recalculation` is disabled' do
- before do
- stub_feature_flags(specialized_worker_for_project_share_update_auth_recalculation: false)
- end
-
- it 'does not perform any project authorizations update using `UserProjectAccessChangedService`' do
- expect(UserProjectAccessChangedService).not_to receive(:new)
+ it 'does not perform any project authorizations update using `AuthorizedProjectUpdate::ProjectRecalculateWorker`' do
+ expect(AuthorizedProjectUpdate::ProjectRecalculateWorker).not_to receive(:perform_async)
- subject
- end
+ subject
end
end
end
diff --git a/spec/services/projects/import_service_spec.rb b/spec/services/projects/import_service_spec.rb
index 92e18b6cb46..1d63f72ec38 100644
--- a/spec/services/projects/import_service_spec.rb
+++ b/spec/services/projects/import_service_spec.rb
@@ -86,6 +86,12 @@ RSpec.describe Projects::ImportService do
end
context 'with a Github repository' do
+ it 'tracks the start of import' do
+ expect(Gitlab::GithubImport::ParallelImporter).to receive(:track_start_import)
+
+ subject.execute
+ end
+
it 'succeeds if repository import was scheduled' do
expect_any_instance_of(Gitlab::GithubImport::ParallelImporter)
.to receive(:execute)
diff --git a/spec/services/projects/move_access_service_spec.rb b/spec/services/projects/move_access_service_spec.rb
index 90167ffebed..45e10c3ca84 100644
--- a/spec/services/projects/move_access_service_spec.rb
+++ b/spec/services/projects/move_access_service_spec.rb
@@ -26,7 +26,7 @@ RSpec.describe Projects::MoveAccessService do
describe '#execute' do
shared_examples 'move the accesses' do
- it do
+ it 'moves the accesses', :sidekiq_inline do
expect(project_with_access.project_members.count).to eq 4
expect(project_with_access.project_group_links.count).to eq 3
expect(project_with_access.authorized_users.count).to eq 4
diff --git a/spec/services/projects/operations/update_service_spec.rb b/spec/services/projects/operations/update_service_spec.rb
index a71fafb2121..b64f2d1e7d6 100644
--- a/spec/services/projects/operations/update_service_spec.rb
+++ b/spec/services/projects/operations/update_service_spec.rb
@@ -294,10 +294,10 @@ RSpec.describe Projects::Operations::UpdateService do
end
context 'without setting' do
- it 'does not create a setting' do
- expect(result[:status]).to eq(:error)
-
- expect(project.reload.error_tracking_setting).to be_nil
+ it 'creates setting with default values' do
+ expect(result[:status]).to eq(:success)
+ expect(project.error_tracking_setting.enabled).to be_truthy
+ expect(project.error_tracking_setting.integrated).to be_truthy
end
end
end
diff --git a/spec/services/projects/participants_service_spec.rb b/spec/services/projects/participants_service_spec.rb
index b84e28314f2..eab7228307a 100644
--- a/spec/services/projects/participants_service_spec.rb
+++ b/spec/services/projects/participants_service_spec.rb
@@ -104,104 +104,116 @@ RSpec.describe Projects::ParticipantsService do
describe '#project_members' do
subject(:usernames) { service.project_members.map { |member| member[:username] } }
- context 'when there is a project in group namespace' do
- let_it_be(:public_group) { create(:group, :public) }
- let_it_be(:public_project) { create(:project, :public, namespace: public_group)}
+ shared_examples 'return project members' do
+ context 'when there is a project in group namespace' do
+ let_it_be(:public_group) { create(:group, :public) }
+ let_it_be(:public_project) { create(:project, :public, namespace: public_group)}
- let_it_be(:public_group_owner) { create(:user) }
+ let_it_be(:public_group_owner) { create(:user) }
- let(:service) { described_class.new(public_project, create(:user)) }
+ let(:service) { described_class.new(public_project, create(:user)) }
- before do
- public_group.add_owner(public_group_owner)
- end
+ before do
+ public_group.add_owner(public_group_owner)
+ end
- it 'returns members of a group' do
- expect(usernames).to include(public_group_owner.username)
+ it 'returns members of a group' do
+ expect(usernames).to include(public_group_owner.username)
+ end
end
- end
-
- context 'when there is a private group and a public project' do
- let_it_be(:public_group) { create(:group, :public) }
- let_it_be(:private_group) { create(:group, :private, :nested) }
- let_it_be(:public_project) { create(:project, :public, namespace: public_group)}
- let_it_be(:project_issue) { create(:issue, project: public_project)}
+ context 'when there is a private group and a public project' do
+ let_it_be(:public_group) { create(:group, :public) }
+ let_it_be(:private_group) { create(:group, :private, :nested) }
+ let_it_be(:public_project) { create(:project, :public, namespace: public_group)}
- let_it_be(:public_group_owner) { create(:user) }
- let_it_be(:private_group_member) { create(:user) }
- let_it_be(:public_project_maintainer) { create(:user) }
- let_it_be(:private_group_owner) { create(:user) }
+ let_it_be(:project_issue) { create(:issue, project: public_project)}
- let_it_be(:group_ancestor_owner) { create(:user) }
+ let_it_be(:public_group_owner) { create(:user) }
+ let_it_be(:private_group_member) { create(:user) }
+ let_it_be(:public_project_maintainer) { create(:user) }
+ let_it_be(:private_group_owner) { create(:user) }
- before_all do
- public_group.add_owner public_group_owner
- private_group.add_developer private_group_member
- public_project.add_maintainer public_project_maintainer
+ let_it_be(:group_ancestor_owner) { create(:user) }
- private_group.add_owner private_group_owner
- private_group.parent.add_owner group_ancestor_owner
- end
-
- context 'when the private group is invited to the public project' do
before_all do
- create(:project_group_link, group: private_group, project: public_project)
- end
+ public_group.add_owner public_group_owner
+ private_group.add_developer private_group_member
+ public_project.add_maintainer public_project_maintainer
- context 'when a user who is outside the public project and the private group is signed in' do
- let(:service) { described_class.new(public_project, create(:user)) }
+ private_group.add_owner private_group_owner
+ private_group.parent.add_owner group_ancestor_owner
+ end
- it 'does not return the private group' do
- expect(usernames).not_to include(private_group.name)
+ context 'when the private group is invited to the public project' do
+ before_all do
+ create(:project_group_link, group: private_group, project: public_project)
end
- it 'does not return private group members' do
- expect(usernames).not_to include(private_group_member.username)
- end
+ context 'when a user who is outside the public project and the private group is signed in' do
+ let(:service) { described_class.new(public_project, create(:user)) }
- it 'returns the project maintainer' do
- expect(usernames).to include(public_project_maintainer.username)
- end
+ it 'does not return the private group' do
+ expect(usernames).not_to include(private_group.name)
+ end
- it 'returns project members from an invited public group' do
- invited_public_group = create(:group, :public)
- invited_public_group.add_owner create(:user)
+ it 'does not return private group members' do
+ expect(usernames).not_to include(private_group_member.username)
+ end
- create(:project_group_link, group: invited_public_group, project: public_project)
+ it 'returns the project maintainer' do
+ expect(usernames).to include(public_project_maintainer.username)
+ end
- expect(usernames).to include(invited_public_group.users.first.username)
- end
+ it 'returns project members from an invited public group' do
+ invited_public_group = create(:group, :public)
+ invited_public_group.add_owner create(:user)
- it 'does not return ancestors of the private group' do
- expect(usernames).not_to include(group_ancestor_owner.username)
- end
- end
+ create(:project_group_link, group: invited_public_group, project: public_project)
- context 'when private group owner is signed in' do
- let(:service) { described_class.new(public_project, private_group_owner) }
+ expect(usernames).to include(invited_public_group.users.first.username)
+ end
- it 'returns private group members' do
- expect(usernames).to include(private_group_member.username)
+ it 'does not return ancestors of the private group' do
+ expect(usernames).not_to include(group_ancestor_owner.username)
+ end
end
- it 'returns ancestors of the the private group' do
- expect(usernames).to include(group_ancestor_owner.username)
- end
- end
+ context 'when private group owner is signed in' do
+ let(:service) { described_class.new(public_project, private_group_owner) }
- context 'when the namespace owner of the public project is signed in' do
- let(:service) { described_class.new(public_project, public_group_owner) }
+ it 'returns private group members' do
+ expect(usernames).to include(private_group_member.username)
+ end
- it 'returns private group members' do
- expect(usernames).to include(private_group_member.username)
+ it 'returns ancestors of the the private group' do
+ expect(usernames).to include(group_ancestor_owner.username)
+ end
end
- it 'does not return members of the ancestral groups of the private group' do
- expect(usernames).to include(group_ancestor_owner.username)
+ context 'when the namespace owner of the public project is signed in' do
+ let(:service) { described_class.new(public_project, public_group_owner) }
+
+ it 'returns private group members' do
+ expect(usernames).to include(private_group_member.username)
+ end
+
+ it 'does not return members of the ancestral groups of the private group' do
+ expect(usernames).to include(group_ancestor_owner.username)
+ end
end
end
end
end
+
+ it_behaves_like 'return project members'
+
+ context 'when feature flag :linear_participants_service_ancestor_scopes is disabled' do
+ before do
+ stub_feature_flags(linear_participants_service_ancestor_scopes: false)
+ end
+
+ it_behaves_like 'return project members'
+ end
end
end
diff --git a/spec/services/projects/transfer_service_spec.rb b/spec/services/projects/transfer_service_spec.rb
index d96573e26af..b539b01066e 100644
--- a/spec/services/projects/transfer_service_spec.rb
+++ b/spec/services/projects/transfer_service_spec.rb
@@ -64,6 +64,33 @@ RSpec.describe Projects::TransferService do
expect(transfer_result).to be_truthy
expect(project.namespace).to eq(group)
end
+
+ context 'when project has an associated project namespace' do
+ let!(:project_namespace) { create(:project_namespace, project: project) }
+
+ it 'keeps project namespace in sync with project' do
+ transfer_result = execute_transfer
+
+ expect(transfer_result).to be_truthy
+
+ project_namespace_in_sync(group)
+ end
+
+ context 'when project is transferred to a deeper nested group' do
+ let(:parent_group) { create(:group) }
+ let(:sub_group) { create(:group, parent: parent_group) }
+ let(:sub_sub_group) { create(:group, parent: sub_group) }
+ let(:group) { sub_sub_group }
+
+ it 'keeps project namespace in sync with project' do
+ transfer_result = execute_transfer
+
+ expect(transfer_result).to be_truthy
+
+ project_namespace_in_sync(sub_sub_group)
+ end
+ end
+ end
end
context 'when transfer succeeds' do
@@ -143,6 +170,28 @@ RSpec.describe Projects::TransferService do
end
end
end
+
+ context 'when project has pending builds' do
+ let!(:other_project) { create(:project) }
+ let!(:pending_build) { create(:ci_pending_build, project: project.reload) }
+ let!(:unrelated_pending_build) { create(:ci_pending_build, project: other_project) }
+
+ before do
+ group.reload
+ end
+
+ it 'updates pending builds for the project', :aggregate_failures do
+ execute_transfer
+
+ pending_build.reload
+ unrelated_pending_build.reload
+
+ expect(pending_build.namespace_id).to eq(group.id)
+ expect(pending_build.namespace_traversal_ids).to eq(group.traversal_ids)
+ expect(unrelated_pending_build.namespace_id).to eq(other_project.namespace_id)
+ expect(unrelated_pending_build.namespace_traversal_ids).to eq(other_project.namespace.traversal_ids)
+ end
+ end
end
context 'when transfer fails' do
@@ -203,6 +252,34 @@ RSpec.describe Projects::TransferService do
shard_name: project.repository_storage
)
end
+
+ context 'when project has pending builds' do
+ let!(:other_project) { create(:project) }
+ let!(:pending_build) { create(:ci_pending_build, project: project.reload) }
+ let!(:unrelated_pending_build) { create(:ci_pending_build, project: other_project) }
+
+ it 'does not update pending builds for the project', :aggregate_failures do
+ attempt_project_transfer
+
+ pending_build.reload
+ unrelated_pending_build.reload
+
+ expect(pending_build.namespace_id).to eq(project.namespace_id)
+ expect(pending_build.namespace_traversal_ids).to eq(project.namespace.traversal_ids)
+ expect(unrelated_pending_build.namespace_id).to eq(other_project.namespace_id)
+ expect(unrelated_pending_build.namespace_traversal_ids).to eq(other_project.namespace.traversal_ids)
+ end
+ end
+
+ context 'when project has an associated project namespace' do
+ let!(:project_namespace) { create(:project_namespace, project: project) }
+
+ it 'keeps project namespace in sync with project' do
+ attempt_project_transfer
+
+ project_namespace_in_sync(user.namespace)
+ end
+ end
end
context 'namespace -> no namespace' do
@@ -215,6 +292,18 @@ RSpec.describe Projects::TransferService do
expect(project.namespace).to eq(user.namespace)
expect(project.errors.messages[:new_namespace].first).to eq 'Please select a new namespace for your project.'
end
+
+ context 'when project has an associated project namespace' do
+ let!(:project_namespace) { create(:project_namespace, project: project) }
+
+ it 'keeps project namespace in sync with project' do
+ transfer_result = execute_transfer
+
+ expect(transfer_result).to be false
+
+ project_namespace_in_sync(user.namespace)
+ end
+ end
end
context 'disallow transferring of project with tags' do
@@ -369,28 +458,23 @@ RSpec.describe Projects::TransferService do
using RSpec::Parameterized::TableSyntax
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 | 'enabled' | true
- false | 'enabled' | false
+ true | :disabled_and_unoverridable | false
+ false | :disabled_and_unoverridable | false
+ true | :disabled_with_override | true
+ false | :disabled_with_override | false
+ true | :shared_runners_enabled | true
+ false | :shared_runners_enabled | false
end
with_them do
let(:project) { create(:project, :public, :repository, namespace: user.namespace, shared_runners_enabled: project_shared_runners_enabled) }
- let(:group) { create(:group) }
+ let(:group) { create(:group, shared_runners_setting) }
- before do
+ it 'updates shared runners based on the parent group' do
group.add_owner(user)
- expect_next_found_instance_of(Group) do |group|
- expect(group).to receive(:shared_runners_setting).and_return(shared_runners_setting)
- end
- execute_transfer
- end
+ expect(execute_transfer).to eq(true)
- it 'updates shared runners based on the parent group' do
expect(project.shared_runners_enabled).to eq(expected_shared_runners_enabled)
end
end
@@ -478,58 +562,30 @@ RSpec.describe Projects::TransferService do
group.add_owner(user)
end
- context 'when the feature flag `specialized_worker_for_project_transfer_auth_recalculation` is enabled' do
- before do
- stub_feature_flags(specialized_worker_for_project_transfer_auth_recalculation: true)
- end
-
- it 'calls AuthorizedProjectUpdate::ProjectRecalculateWorker to update project authorizations' do
- expect(AuthorizedProjectUpdate::ProjectRecalculateWorker)
- .to receive(:perform_async).with(project.id)
-
- execute_transfer
- end
+ it 'calls AuthorizedProjectUpdate::ProjectRecalculateWorker to update project authorizations' do
+ expect(AuthorizedProjectUpdate::ProjectRecalculateWorker)
+ .to receive(:perform_async).with(project.id)
- it 'calls AuthorizedProjectUpdate::UserRefreshFromReplicaWorker with a delay to update project authorizations' do
- user_ids = [user.id, member_of_old_group.id, member_of_new_group.id].map { |id| [id] }
-
- expect(AuthorizedProjectUpdate::UserRefreshFromReplicaWorker).to(
- receive(:bulk_perform_in)
- .with(1.hour,
- user_ids,
- batch_delay: 30.seconds, batch_size: 100)
- )
-
- subject
- end
-
- it 'refreshes the permissions of the members of the old and new namespace', :sidekiq_inline do
- expect { execute_transfer }
- .to change { member_of_old_group.authorized_projects.include?(project) }.from(true).to(false)
- .and change { member_of_new_group.authorized_projects.include?(project) }.from(false).to(true)
- end
+ execute_transfer
end
- context 'when the feature flag `specialized_worker_for_project_transfer_auth_recalculation` is disabled' do
- before do
- stub_feature_flags(specialized_worker_for_project_transfer_auth_recalculation: false)
- end
-
- it 'calls UserProjectAccessChangedService to update project authorizations' do
- user_ids = [user.id, member_of_old_group.id, member_of_new_group.id]
+ it 'calls AuthorizedProjectUpdate::UserRefreshFromReplicaWorker with a delay to update project authorizations' do
+ user_ids = [user.id, member_of_old_group.id, member_of_new_group.id].map { |id| [id] }
- expect_next_instance_of(UserProjectAccessChangedService, user_ids) do |service|
- expect(service).to receive(:execute)
- end
+ expect(AuthorizedProjectUpdate::UserRefreshFromReplicaWorker).to(
+ receive(:bulk_perform_in)
+ .with(1.hour,
+ user_ids,
+ batch_delay: 30.seconds, batch_size: 100)
+ )
- execute_transfer
- end
+ subject
+ end
- it 'refreshes the permissions of the members of the old and new namespace' do
- expect { execute_transfer }
- .to change { member_of_old_group.authorized_projects.include?(project) }.from(true).to(false)
- .and change { member_of_new_group.authorized_projects.include?(project) }.from(false).to(true)
- end
+ it 'refreshes the permissions of the members of the old and new namespace', :sidekiq_inline do
+ expect { execute_transfer }
+ .to change { member_of_old_group.authorized_projects.include?(project) }.from(true).to(false)
+ .and change { member_of_new_group.authorized_projects.include?(project) }.from(false).to(true)
end
end
@@ -643,4 +699,13 @@ RSpec.describe Projects::TransferService do
def rugged_config
rugged_repo(project.repository).config
end
+
+ def project_namespace_in_sync(group)
+ project.reload
+ expect(project.namespace).to eq(group)
+ expect(project.project_namespace.visibility_level).to eq(project.visibility_level)
+ expect(project.project_namespace.path).to eq(project.path)
+ expect(project.project_namespace.parent).to eq(project.namespace)
+ expect(project.project_namespace.traversal_ids).to eq([*project.namespace.traversal_ids, project.project_namespace.id])
+ end
end
diff --git a/spec/services/projects/update_pages_service_spec.rb b/spec/services/projects/update_pages_service_spec.rb
index 6d0b75e0c95..5810024a1ef 100644
--- a/spec/services/projects/update_pages_service_spec.rb
+++ b/spec/services/projects/update_pages_service_spec.rb
@@ -173,14 +173,6 @@ RSpec.describe Projects::UpdatePagesService do
include_examples 'successfully deploys'
- context 'when pages_smart_check_outdated_sha feature flag is disabled' do
- before do
- stub_feature_flags(pages_smart_check_outdated_sha: false)
- end
-
- include_examples 'fails with outdated reference message'
- end
-
context 'when old deployment present' do
before do
old_build = create(:ci_build, pipeline: old_pipeline, ref: 'HEAD')
@@ -189,14 +181,6 @@ RSpec.describe Projects::UpdatePagesService do
end
include_examples 'successfully deploys'
-
- context 'when pages_smart_check_outdated_sha feature flag is disabled' do
- before do
- stub_feature_flags(pages_smart_check_outdated_sha: false)
- end
-
- include_examples 'fails with outdated reference message'
- end
end
context 'when newer deployment present' do
diff --git a/spec/services/projects/update_service_spec.rb b/spec/services/projects/update_service_spec.rb
index 115f3098185..4923ef169e8 100644
--- a/spec/services/projects/update_service_spec.rb
+++ b/spec/services/projects/update_service_spec.rb
@@ -374,7 +374,7 @@ RSpec.describe Projects::UpdateService do
expect(result).to eq({
status: :error,
- message: "Name can contain only letters, digits, emojis, '_', '.', dash, space. It must start with letter, digit, emoji or '_'."
+ message: "Name can contain only letters, digits, emojis, '_', '.', '+', dashes, or spaces. It must start with a letter, digit, emoji, or '_'."
})
end
end
@@ -441,26 +441,62 @@ RSpec.describe Projects::UpdateService do
end
end
- context 'when updating #shared_runners', :https_pages_enabled do
- let!(:pending_build) { create(:ci_pending_build, project: project, instance_runners_enabled: true) }
+ context 'when updating runners settings' do
+ let(:settings) do
+ { instance_runners_enabled: true, namespace_traversal_ids: [123] }
+ end
- subject(:call_service) do
- update_project(project, admin, shared_runners_enabled: shared_runners_enabled)
+ let!(:pending_build) do
+ create(:ci_pending_build, project: project, **settings)
+ end
+
+ context 'when project has shared runners enabled' do
+ let(:project) { create(:project, shared_runners_enabled: true) }
+
+ it 'updates builds queue when shared runners get disabled' do
+ expect { update_project(project, admin, shared_runners_enabled: false) }
+ .to change { pending_build.reload.instance_runners_enabled }.to(false)
+
+ expect(pending_build.reload.instance_runners_enabled).to be false
+ end
+ end
+
+ context 'when project has shared runners disabled' do
+ let(:project) { create(:project, shared_runners_enabled: false) }
+
+ it 'updates builds queue when shared runners get enabled' do
+ expect { update_project(project, admin, shared_runners_enabled: true) }
+ .to not_change { pending_build.reload.instance_runners_enabled }
+
+ expect(pending_build.reload.instance_runners_enabled).to be true
+ end
end
- context 'when shared runners is toggled' do
- let(:shared_runners_enabled) { false }
+ context 'when project has group runners enabled' do
+ let(:project) { create(:project, group_runners_enabled: true) }
+
+ before do
+ project.ci_cd_settings.update!(group_runners_enabled: true)
+ end
+
+ it 'updates builds queue when group runners get disabled' do
+ update_project(project, admin, group_runners_enabled: false)
- it 'updates ci pending builds' do
- expect { call_service }.to change { pending_build.reload.instance_runners_enabled }.to(false)
+ expect(pending_build.reload.namespace_traversal_ids).to be_empty
end
end
- context 'when shared runners is not toggled' do
- let(:shared_runners_enabled) { true }
+ context 'when project has group runners disabled' do
+ let(:project) { create(:project, :in_subgroup, group_runners_enabled: false) }
+
+ before do
+ project.reload.ci_cd_settings.update!(group_runners_enabled: false)
+ end
+
+ it 'updates builds queue when group runners get enabled' do
+ update_project(project, admin, group_runners_enabled: true)
- it 'updates ci pending builds' do
- expect { call_service }.to not_change { pending_build.reload.instance_runners_enabled }
+ expect(pending_build.reload.namespace_traversal_ids).to include(project.namespace.id)
end
end
end
diff --git a/spec/services/quick_actions/interpret_service_spec.rb b/spec/services/quick_actions/interpret_service_spec.rb
index 02997096021..d67b189f90e 100644
--- a/spec/services/quick_actions/interpret_service_spec.rb
+++ b/spec/services/quick_actions/interpret_service_spec.rb
@@ -1935,6 +1935,21 @@ RSpec.describe QuickActions::InterpretService do
it_behaves_like 'relate command'
end
+ context 'when quick action target is unpersisted' do
+ let(:issue) { build(:issue, project: project) }
+ let(:other_issue) { create(:issue, project: project) }
+ let(:issues_related) { [other_issue] }
+ let(:content) { "/relate #{other_issue.to_reference}" }
+
+ it 'relates the issues after the issue is persisted' do
+ service.execute(content, issue)
+
+ issue.save!
+
+ expect(IssueLink.where(source: issue).map(&:target)).to match_array(issues_related)
+ end
+ end
+
context 'empty relate command' do
let(:issues_related) { [] }
let(:content) { '/relate' }
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 44f8f07a5be..c7e732dc79a 100644
--- a/spec/services/security/ci_configuration/sast_create_service_spec.rb
+++ b/spec/services/security/ci_configuration/sast_create_service_spec.rb
@@ -23,4 +23,27 @@ RSpec.describe Security::CiConfiguration::SastCreateService, :snowplow do
end
include_examples 'services security ci configuration create service'
+
+ context "when committing to the default branch", :aggregate_failures do
+ subject(:result) { described_class.new(project, user, params, commit_on_default: true).execute }
+
+ let(:params) { {} }
+
+ before do
+ project.add_developer(user)
+ end
+
+ it "doesn't try to remove that branch on raised exceptions" do
+ expect(Files::MultiService).to receive(:new).and_raise(StandardError, '_exception_')
+ expect(project.repository).not_to receive(:rm_branch)
+
+ expect { result }.to raise_error(StandardError, '_exception_')
+ end
+
+ it "commits directly to the default branch" do
+ expect(result.status).to eq(:success)
+ expect(result.payload[:success_path]).to match(/#{Gitlab::Routing.url_helpers.project_new_merge_request_url(project, {})}(.*)description(.*)source_branch/)
+ expect(result.payload[:branch]).to eq('master')
+ end
+ end
end
diff --git a/spec/services/service_ping/submit_service_ping_service_spec.rb b/spec/services/service_ping/submit_service_ping_service_spec.rb
index c2fe565938a..d8672eec682 100644
--- a/spec/services/service_ping/submit_service_ping_service_spec.rb
+++ b/spec/services/service_ping/submit_service_ping_service_spec.rb
@@ -50,6 +50,7 @@ RSpec.describe ServicePing::SubmitService do
let(:with_dev_ops_score_params) { { dev_ops_score: score_params[:score] } }
let(:with_conv_index_params) { { conv_index: score_params[:score] } }
+ let(:with_usage_data_id_params) { { conv_index: { usage_data_id: usage_data_id } } }
shared_examples 'does not run' do
it do
@@ -173,6 +174,29 @@ RSpec.describe ServicePing::SubmitService do
end
end
+ context 'when only usage_data_id is passed in response' do
+ before do
+ stub_response(body: with_usage_data_id_params)
+ end
+
+ it 'does not save DevOps report data' do
+ expect { subject.execute }.not_to change { DevOpsReport::Metric.count }
+ end
+
+ it 'saves usage_data_id to version_usage_data_id_value' do
+ recorded_at = Time.current
+ usage_data = { uuid: 'uuid', recorded_at: recorded_at }
+
+ expect(Gitlab::UsageData).to receive(:data).with(force_refresh: true).and_return(usage_data)
+
+ subject.execute
+
+ raw_usage_data = RawUsageData.find_by(recorded_at: recorded_at)
+
+ expect(raw_usage_data.version_usage_data_id_value).to eq(31643)
+ end
+ end
+
context 'when version app usage_data_id is invalid' do
let(:usage_data_id) { -1000 }
diff --git a/spec/services/user_project_access_changed_service_spec.rb b/spec/services/user_project_access_changed_service_spec.rb
index f8835fefc84..438db6b987b 100644
--- a/spec/services/user_project_access_changed_service_spec.rb
+++ b/spec/services/user_project_access_changed_service_spec.rb
@@ -47,15 +47,13 @@ RSpec.describe UserProjectAccessChangedService do
let(:service) { UserProjectAccessChangedService.new([1, 2]) }
before do
- allow(Gitlab::Database::LoadBalancing).to receive(:enable?).and_return(true)
-
expect(AuthorizedProjectsWorker).to receive(:bulk_perform_and_wait)
.with([[1], [2]])
.and_return(10)
end
it 'sticks all the updated users and returns the original result', :aggregate_failures do
- expect(Gitlab::Database::LoadBalancing::Sticking).to receive(:bulk_stick).with(:user, [1, 2])
+ expect(ApplicationRecord.sticking).to receive(:bulk_stick).with(:user, [1, 2])
expect(service.execute).to eq(10)
end
diff --git a/spec/services/users/activity_service_spec.rb b/spec/services/users/activity_service_spec.rb
index 6c1df5c745f..092c5cd3e5e 100644
--- a/spec/services/users/activity_service_spec.rb
+++ b/spec/services/users/activity_service_spec.rb
@@ -91,9 +91,9 @@ RSpec.describe Users::ActivityService do
context 'when last activity is in the past' do
let(:user) { create(:user, last_activity_on: Date.today - 1.week) }
- context 'database load balancing is configured', :db_load_balancing do
+ context 'database load balancing is configured' do
before do
- allow(ActiveRecord::Base).to receive(:connection).and_return(::Gitlab::Database::LoadBalancing.proxy)
+ ::Gitlab::Database::LoadBalancing::Session.clear_session
end
let(:service) do
diff --git a/spec/services/users/update_service_spec.rb b/spec/services/users/update_service_spec.rb
index b30b7e6eb56..3244db4c1fb 100644
--- a/spec/services/users/update_service_spec.rb
+++ b/spec/services/users/update_service_spec.rb
@@ -3,7 +3,8 @@
require 'spec_helper'
RSpec.describe Users::UpdateService do
- let(:user) { create(:user) }
+ let(:password) { 'longsecret987!' }
+ let(:user) { create(:user, password: password, password_confirmation: password) }
describe '#execute' do
it 'updates time preferences' do
@@ -18,7 +19,7 @@ RSpec.describe Users::UpdateService do
it 'returns an error result when record cannot be updated' do
result = {}
expect do
- result = update_user(user, { email: 'invalid' })
+ result = update_user(user, { email: 'invalid', validation_password: password })
end.not_to change { user.reload.email }
expect(result[:status]).to eq(:error)
expect(result[:message]).to eq('Email is invalid')
@@ -65,7 +66,7 @@ RSpec.describe Users::UpdateService do
context 'updating canonical email' do
context 'if email was changed' do
subject do
- update_user(user, email: 'user+extrastuff@example.com')
+ update_user(user, email: 'user+extrastuff@example.com', validation_password: password)
end
it 'calls canonicalize_email' do
@@ -75,15 +76,68 @@ RSpec.describe Users::UpdateService do
subject
end
+
+ context 'when check_password is true' do
+ def update_user(user, opts)
+ described_class.new(user, opts.merge(user: user)).execute(check_password: true)
+ end
+
+ it 'returns error if no password confirmation was passed', :aggregate_failures do
+ result = {}
+
+ expect do
+ result = update_user(user, { email: 'example@example.com' })
+ end.not_to change { user.reload.unconfirmed_email }
+ expect(result[:status]).to eq(:error)
+ expect(result[:message]).to eq('Invalid password')
+ end
+
+ it 'returns error if wrong password confirmation was passed', :aggregate_failures do
+ result = {}
+
+ expect do
+ result = update_user(user, { email: 'example@example.com', validation_password: 'wrongpassword' })
+ end.not_to change { user.reload.unconfirmed_email }
+ expect(result[:status]).to eq(:error)
+ expect(result[:message]).to eq('Invalid password')
+ end
+
+ it 'does not require password if it was automatically set', :aggregate_failures do
+ user.update!(password_automatically_set: true)
+ result = {}
+
+ expect do
+ result = update_user(user, { email: 'example@example.com' })
+ end.to change { user.reload.unconfirmed_email }
+ expect(result[:status]).to eq(:success)
+ end
+
+ it 'does not require a password if the attribute changed does not require it' do
+ result = {}
+
+ expect do
+ result = update_user(user, { job_title: 'supreme leader of the universe' })
+ end.to change { user.reload.job_title }
+ expect(result[:status]).to eq(:success)
+ end
+ end
end
- context 'if email was NOT changed' do
- subject do
- update_user(user, job_title: 'supreme leader of the universe')
+ context 'when check_password is left to false' do
+ it 'does not require a password check', :aggregate_failures do
+ result = {}
+ expect do
+ result = update_user(user, { email: 'example@example.com' })
+ end.to change { user.reload.unconfirmed_email }
+ expect(result[:status]).to eq(:success)
end
+ end
+ context 'if email was NOT changed' do
it 'skips update canonicalize email service call' do
- expect { subject }.not_to change { user.user_canonical_email }
+ expect do
+ update_user(user, job_title: 'supreme leader of the universe')
+ end.not_to change { user.user_canonical_email }
end
end
end
@@ -106,7 +160,7 @@ RSpec.describe Users::UpdateService do
it 'raises an error when record cannot be updated' do
expect do
- update_user(user, email: 'invalid')
+ update_user(user, email: 'invalid', validation_password: password)
end.to raise_error(ActiveRecord::RecordInvalid)
end
diff --git a/spec/services/users/upsert_credit_card_validation_service_spec.rb b/spec/services/users/upsert_credit_card_validation_service_spec.rb
index 148638fe5e7..bede30e1898 100644
--- a/spec/services/users/upsert_credit_card_validation_service_spec.rb
+++ b/spec/services/users/upsert_credit_card_validation_service_spec.rb
@@ -7,7 +7,17 @@ RSpec.describe Users::UpsertCreditCardValidationService do
let(:user_id) { user.id }
let(:credit_card_validated_time) { Time.utc(2020, 1, 1) }
- let(:params) { { user_id: user_id, credit_card_validated_at: credit_card_validated_time } }
+ let(:expiration_year) { Date.today.year + 10 }
+ let(:params) do
+ {
+ user_id: user_id,
+ credit_card_validated_at: credit_card_validated_time,
+ credit_card_expiration_year: expiration_year,
+ credit_card_expiration_month: 1,
+ credit_card_holder_name: 'John Smith',
+ credit_card_mask_number: '1111'
+ }
+ end
describe '#execute' do
subject(:service) { described_class.new(params) }
@@ -52,6 +62,16 @@ RSpec.describe Users::UpsertCreditCardValidationService do
end
end
+ shared_examples 'returns an error, tracking the exception' do
+ it do
+ expect(Gitlab::ErrorTracking).to receive(:track_exception)
+
+ result = service.execute
+
+ expect(result.status).to eq(:error)
+ end
+ end
+
context 'when user id does not exist' do
let(:user_id) { non_existing_record_id }
@@ -61,19 +81,27 @@ RSpec.describe Users::UpsertCreditCardValidationService do
context 'when missing credit_card_validated_at' do
let(:params) { { user_id: user_id } }
- it_behaves_like 'returns an error without tracking the exception'
+ it_behaves_like 'returns an error, tracking the exception'
end
context 'when missing user id' do
let(:params) { { credit_card_validated_at: credit_card_validated_time } }
- it_behaves_like 'returns an error without tracking the exception'
+ it_behaves_like 'returns an error, tracking the exception'
end
context 'when unexpected exception happen' do
it 'tracks the exception and returns an error' do
+ logged_params = {
+ credit_card_validated_at: credit_card_validated_time,
+ expiration_date: Date.new(expiration_year, 1, 31),
+ holder_name: "John Smith",
+ last_digits: 1111,
+ user_id: user_id
+ }
+
expect(::Users::CreditCardValidation).to receive(:upsert).and_raise(e = StandardError.new('My exception!'))
- expect(Gitlab::ErrorTracking).to receive(:track_exception).with(e, class: described_class.to_s, params: params)
+ expect(Gitlab::ErrorTracking).to receive(:track_exception).with(e, class: described_class.to_s, params: logged_params)
result = service.execute
diff --git a/spec/services/web_hook_service_spec.rb b/spec/services/web_hook_service_spec.rb
index f9fa46a4fc8..2aebd2adab9 100644
--- a/spec/services/web_hook_service_spec.rb
+++ b/spec/services/web_hook_service_spec.rb
@@ -392,7 +392,7 @@ RSpec.describe WebHookService do
end
end
- context 'when the hook is throttled (via Redis)', :clean_gitlab_redis_cache do
+ context 'when the hook is throttled (via Redis)', :clean_gitlab_redis_rate_limiting do
before do
# Set a high interval to avoid intermittent failures in CI
allow(Gitlab::ApplicationRateLimiter).to receive(:rate_limits).and_return(
diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb
index aa791d1d2e7..c8664598691 100644
--- a/spec/spec_helper.rb
+++ b/spec/spec_helper.rb
@@ -315,6 +315,10 @@ RSpec.configure do |config|
# For more information check https://gitlab.com/gitlab-org/gitlab/-/issues/339348
stub_feature_flags(new_header_search: false)
+ # Disable the override flag in order to enable the feature by default.
+ # See https://docs.gitlab.com/ee/development/feature_flags/#selectively-disable-by-actor
+ stub_feature_flags(surface_environment_creation_failure_override: false)
+
allow(Gitlab::GitalyClient).to receive(:can_use_disk?).and_return(enable_rugged)
else
unstub_all_feature_flags
diff --git a/spec/support/before_all_adapter.rb b/spec/support/before_all_adapter.rb
index f48e0f46e80..890bdd6a2c4 100644
--- a/spec/support/before_all_adapter.rb
+++ b/spec/support/before_all_adapter.rb
@@ -1,25 +1,25 @@
# frozen_string_literal: true
class BeforeAllAdapter # rubocop:disable Gitlab/NamespacedClass
- def self.all_connection_pools
- ::ActiveRecord::Base.connection_handler.all_connection_pools
+ def self.all_connection_classes
+ @all_connection_classes ||= [ActiveRecord::Base] + ActiveRecord::Base.descendants.select(&:connection_class?) # rubocop: disable Database/MultipleDatabases
end
def self.begin_transaction
- self.all_connection_pools.each do |connection_pool|
- connection_pool.connection.begin_transaction(joinable: false)
+ self.all_connection_classes.each do |connection_class|
+ connection_class.connection.begin_transaction(joinable: false)
end
end
def self.rollback_transaction
- self.all_connection_pools.each do |connection_pool|
- if connection_pool.connection.open_transactions.zero?
+ self.all_connection_classes.each do |connection_class|
+ if connection_class.connection.open_transactions.zero?
warn "!!! before_all transaction has been already rollbacked and " \
"could work incorrectly"
next
end
- connection_pool.connection.rollback_transaction
+ connection_class.connection.rollback_transaction
end
end
end
diff --git a/spec/support/capybara.rb b/spec/support/capybara.rb
index 6f96d552da6..ac35662ec93 100644
--- a/spec/support/capybara.rb
+++ b/spec/support/capybara.rb
@@ -22,7 +22,8 @@ JS_CONSOLE_FILTER = Regexp.union([
'"[WDS] Live Reloading enabled."',
'Download the Vue Devtools extension',
'Download the Apollo DevTools',
- "Unrecognized feature: 'interest-cohort'"
+ "Unrecognized feature: 'interest-cohort'",
+ 'Does this page need fixes or improvements?'
])
CAPYBARA_WINDOW_SIZE = [1366, 768].freeze
diff --git a/spec/support/database/cross-database-modification-allowlist.yml b/spec/support/database/cross-database-modification-allowlist.yml
new file mode 100644
index 00000000000..627967f65f3
--- /dev/null
+++ b/spec/support/database/cross-database-modification-allowlist.yml
@@ -0,0 +1,1343 @@
+- "./ee/spec/controllers/admin/geo/nodes_controller_spec.rb"
+- "./ee/spec/controllers/admin/geo/projects_controller_spec.rb"
+- "./ee/spec/controllers/admin/projects_controller_spec.rb"
+- "./ee/spec/controllers/concerns/internal_redirect_spec.rb"
+- "./ee/spec/controllers/ee/projects/jobs_controller_spec.rb"
+- "./ee/spec/controllers/oauth/geo_auth_controller_spec.rb"
+- "./ee/spec/controllers/projects/approver_groups_controller_spec.rb"
+- "./ee/spec/controllers/projects/approvers_controller_spec.rb"
+- "./ee/spec/controllers/projects/merge_requests_controller_spec.rb"
+- "./ee/spec/controllers/projects/merge_requests/creations_controller_spec.rb"
+- "./ee/spec/controllers/projects/settings/access_tokens_controller_spec.rb"
+- "./ee/spec/controllers/projects/subscriptions_controller_spec.rb"
+- "./ee/spec/features/account_recovery_regular_check_spec.rb"
+- "./ee/spec/features/admin/admin_audit_logs_spec.rb"
+- "./ee/spec/features/admin/admin_credentials_inventory_spec.rb"
+- "./ee/spec/features/admin/admin_dashboard_spec.rb"
+- "./ee/spec/features/admin/admin_dev_ops_report_spec.rb"
+- "./ee/spec/features/admin/admin_merge_requests_approvals_spec.rb"
+- "./ee/spec/features/admin/admin_reset_pipeline_minutes_spec.rb"
+- "./ee/spec/features/admin/admin_sends_notification_spec.rb"
+- "./ee/spec/features/admin/admin_settings_spec.rb"
+- "./ee/spec/features/admin/admin_show_new_user_signups_cap_alert_spec.rb"
+- "./ee/spec/features/admin/admin_users_spec.rb"
+- "./ee/spec/features/admin/geo/admin_geo_nodes_spec.rb"
+- "./ee/spec/features/admin/geo/admin_geo_projects_spec.rb"
+- "./ee/spec/features/admin/geo/admin_geo_replication_nav_spec.rb"
+- "./ee/spec/features/admin/geo/admin_geo_sidebar_spec.rb"
+- "./ee/spec/features/admin/geo/admin_geo_uploads_spec.rb"
+- "./ee/spec/features/admin/groups/admin_changes_plan_spec.rb"
+- "./ee/spec/features/admin/licenses/admin_uploads_license_spec.rb"
+- "./ee/spec/features/admin/licenses/show_user_count_threshold_spec.rb"
+- "./ee/spec/features/admin/subscriptions/admin_views_subscription_spec.rb"
+- "./ee/spec/features/analytics/code_analytics_spec.rb"
+- "./ee/spec/features/billings/billing_plans_spec.rb"
+- "./ee/spec/features/billings/extend_reactivate_trial_spec.rb"
+- "./ee/spec/features/billings/qrtly_reconciliation_alert_spec.rb"
+- "./ee/spec/features/boards/boards_licensed_features_spec.rb"
+- "./ee/spec/features/boards/boards_spec.rb"
+- "./ee/spec/features/boards/group_boards/board_deletion_spec.rb"
+- "./ee/spec/features/boards/group_boards/multiple_boards_spec.rb"
+- "./ee/spec/features/boards/new_issue_spec.rb"
+- "./ee/spec/features/boards/scoped_issue_board_spec.rb"
+- "./ee/spec/features/boards/sidebar_spec.rb"
+- "./ee/spec/features/boards/swimlanes/epics_swimlanes_drag_drop_spec.rb"
+- "./ee/spec/features/boards/swimlanes/epics_swimlanes_filtering_spec.rb"
+- "./ee/spec/features/boards/swimlanes/epics_swimlanes_sidebar_labels_spec.rb"
+- "./ee/spec/features/boards/swimlanes/epics_swimlanes_sidebar_spec.rb"
+- "./ee/spec/features/boards/swimlanes/epics_swimlanes_spec.rb"
+- "./ee/spec/features/boards/user_adds_lists_to_board_spec.rb"
+- "./ee/spec/features/boards/user_visits_board_spec.rb"
+- "./ee/spec/features/burndown_charts_spec.rb"
+- "./ee/spec/features/burnup_charts_spec.rb"
+- "./ee/spec/features/ci/ci_minutes_spec.rb"
+- "./ee/spec/features/ci_shared_runner_warnings_spec.rb"
+- "./ee/spec/features/clusters/create_agent_spec.rb"
+- "./ee/spec/features/dashboards/activity_spec.rb"
+- "./ee/spec/features/dashboards/groups_spec.rb"
+- "./ee/spec/features/dashboards/issues_spec.rb"
+- "./ee/spec/features/dashboards/merge_requests_spec.rb"
+- "./ee/spec/features/dashboards/operations_spec.rb"
+- "./ee/spec/features/dashboards/projects_spec.rb"
+- "./ee/spec/features/dashboards/todos_spec.rb"
+- "./ee/spec/features/discussion_comments/epic_quick_actions_spec.rb"
+- "./ee/spec/features/discussion_comments/epic_spec.rb"
+- "./ee/spec/features/epic_boards/epic_boards_sidebar_spec.rb"
+- "./ee/spec/features/epic_boards/epic_boards_spec.rb"
+- "./ee/spec/features/epic_boards/multiple_epic_boards_spec.rb"
+- "./ee/spec/features/epic_boards/new_epic_spec.rb"
+- "./ee/spec/features/epics/delete_epic_spec.rb"
+- "./ee/spec/features/epics/epic_issues_spec.rb"
+- "./ee/spec/features/epics/epic_labels_spec.rb"
+- "./ee/spec/features/epics/epic_show_spec.rb"
+- "./ee/spec/features/epics/epics_list_spec.rb"
+- "./ee/spec/features/epics/filtered_search/visual_tokens_spec.rb"
+- "./ee/spec/features/epics/gfm_autocomplete_spec.rb"
+- "./ee/spec/features/epics/issue_promotion_spec.rb"
+- "./ee/spec/features/epics/referencing_epics_spec.rb"
+- "./ee/spec/features/epics/shortcuts_epic_spec.rb"
+- "./ee/spec/features/epics/todo_spec.rb"
+- "./ee/spec/features/epics/update_epic_spec.rb"
+- "./ee/spec/features/epics/user_uses_quick_actions_spec.rb"
+- "./ee/spec/features/geo_node_spec.rb"
+- "./ee/spec/features/groups/analytics/ci_cd_analytics_spec.rb"
+- "./ee/spec/features/groups/analytics/cycle_analytics/charts_spec.rb"
+- "./ee/spec/features/groups/analytics/cycle_analytics/filters_and_data_spec.rb"
+- "./ee/spec/features/groups/analytics/cycle_analytics/multiple_value_streams_spec.rb"
+- "./ee/spec/features/groups/audit_events_spec.rb"
+- "./ee/spec/features/groups/billing_spec.rb"
+- "./ee/spec/features/groups/contribution_analytics_spec.rb"
+- "./ee/spec/features/groups/group_overview_spec.rb"
+- "./ee/spec/features/groups/group_roadmap_spec.rb"
+- "./ee/spec/features/groups/group_settings_spec.rb"
+- "./ee/spec/features/groups/groups_security_credentials_spec.rb"
+- "./ee/spec/features/groups/hooks/user_tests_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"
+- "./ee/spec/features/groups/iterations/user_views_iteration_cadence_spec.rb"
+- "./ee/spec/features/groups/iterations/user_views_iteration_spec.rb"
+- "./ee/spec/features/groups/ldap_group_links_spec.rb"
+- "./ee/spec/features/groups/ldap_settings_spec.rb"
+- "./ee/spec/features/groups/members/leave_group_spec.rb"
+- "./ee/spec/features/groups/members/list_members_spec.rb"
+- "./ee/spec/features/groups/members/override_ldap_memberships_spec.rb"
+- "./ee/spec/features/groups/new_spec.rb"
+- "./ee/spec/features/groups/push_rules_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/user_configures_insights_spec.rb"
+- "./ee/spec/features/groups/settings/user_searches_in_settings_spec.rb"
+- "./ee/spec/features/groups/sso_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/issues/blocking_issues_spec.rb"
+- "./ee/spec/features/issues/epic_in_issue_sidebar_spec.rb"
+- "./ee/spec/features/issues/filtered_search/filter_issues_by_iteration_spec.rb"
+- "./ee/spec/features/issues/filtered_search/filter_issues_epic_spec.rb"
+- "./ee/spec/features/issues/filtered_search/filter_issues_weight_spec.rb"
+- "./ee/spec/features/issues/form_spec.rb"
+- "./ee/spec/features/issues/gfm_autocomplete_ee_spec.rb"
+- "./ee/spec/features/issues/issue_actions_spec.rb"
+- "./ee/spec/features/issues/issue_sidebar_spec.rb"
+- "./ee/spec/features/issues/move_issue_resource_weight_events_spec.rb"
+- "./ee/spec/features/issues/related_issues_spec.rb"
+- "./ee/spec/features/issues/resource_weight_events_spec.rb"
+- "./ee/spec/features/issues/user_bulk_edits_issues_spec.rb"
+- "./ee/spec/features/issues/user_edits_issue_spec.rb"
+- "./ee/spec/features/issues/user_uses_quick_actions_spec.rb"
+- "./ee/spec/features/issues/user_views_issues_spec.rb"
+- "./ee/spec/features/labels_hierarchy_spec.rb"
+- "./ee/spec/features/markdown/metrics_spec.rb"
+- "./ee/spec/features/merge_requests/user_filters_by_approvers_spec.rb"
+- "./ee/spec/features/merge_requests/user_resets_approvers_spec.rb"
+- "./ee/spec/features/merge_requests/user_views_all_merge_requests_spec.rb"
+- "./ee/spec/features/merge_request/user_approves_with_password_spec.rb"
+- "./ee/spec/features/merge_request/user_creates_merge_request_spec.rb"
+- "./ee/spec/features/merge_request/user_creates_merge_request_with_blocking_mrs_spec.rb"
+- "./ee/spec/features/merge_request/user_creates_multiple_assignees_mr_spec.rb"
+- "./ee/spec/features/merge_request/user_creates_multiple_reviewers_mr_spec.rb"
+- "./ee/spec/features/merge_request/user_edits_approval_rules_mr_spec.rb"
+- "./ee/spec/features/merge_request/user_edits_merge_request_blocking_mrs_spec.rb"
+- "./ee/spec/features/merge_request/user_edits_multiple_assignees_mr_spec.rb"
+- "./ee/spec/features/merge_request/user_edits_multiple_reviewers_mr_spec.rb"
+- "./ee/spec/features/merge_request/user_merges_immediately_spec.rb"
+- "./ee/spec/features/merge_request/user_merges_with_push_rules_spec.rb"
+- "./ee/spec/features/merge_request/user_sees_approval_widget_spec.rb"
+- "./ee/spec/features/merge_request/user_sees_closing_issues_message_spec.rb"
+- "./ee/spec/features/merge_request/user_sees_merge_widget_spec.rb"
+- "./ee/spec/features/merge_request/user_sees_status_checks_widget_spec.rb"
+- "./ee/spec/features/merge_request/user_selects_branches_for_new_mr_spec.rb"
+- "./ee/spec/features/merge_request/user_sets_approval_rules_spec.rb"
+- "./ee/spec/features/merge_request/user_sets_approvers_spec.rb"
+- "./ee/spec/features/merge_request/user_uses_slash_commands_spec.rb"
+- "./ee/spec/features/merge_request/user_views_blocked_merge_request_spec.rb"
+- "./ee/spec/features/merge_trains/user_adds_merge_request_to_merge_train_spec.rb"
+- "./ee/spec/features/merge_trains/user_adds_to_merge_train_when_pipeline_succeeds_spec.rb"
+- "./ee/spec/features/oncall_schedules/user_creates_schedule_spec.rb"
+- "./ee/spec/features/operations_nav_link_spec.rb"
+- "./ee/spec/features/profiles/account_spec.rb"
+- "./ee/spec/features/profiles/billing_spec.rb"
+- "./ee/spec/features/projects/audit_events_spec.rb"
+- "./ee/spec/features/projects/cluster_agents_spec.rb"
+- "./ee/spec/features/projects/custom_projects_template_spec.rb"
+- "./ee/spec/features/projects/environments/environments_spec.rb"
+- "./ee/spec/features/projects/feature_flags/feature_flag_issues_spec.rb"
+- "./ee/spec/features/projects/feature_flags/user_creates_feature_flag_spec.rb"
+- "./ee/spec/features/projects/feature_flags/user_deletes_feature_flag_spec.rb"
+- "./ee/spec/features/projects/feature_flags/user_sees_feature_flag_list_spec.rb"
+- "./ee/spec/features/projects/insights_spec.rb"
+- "./ee/spec/features/projects/integrations/user_activates_jira_spec.rb"
+- "./ee/spec/features/projects/issues/user_creates_issue_spec.rb"
+- "./ee/spec/features/projects/iterations/iteration_cadences_list_spec.rb"
+- "./ee/spec/features/projects/iterations/iterations_list_spec.rb"
+- "./ee/spec/features/projects/iterations/user_views_iteration_spec.rb"
+- "./ee/spec/features/projects/jobs_spec.rb"
+- "./ee/spec/features/projects/kerberos_clone_instructions_spec.rb"
+- "./ee/spec/features/projects/licenses/maintainer_views_policies_spec.rb"
+- "./ee/spec/features/projects/members/member_is_removed_from_project_spec.rb"
+- "./ee/spec/features/projects/merge_requests/user_approves_merge_request_spec.rb"
+- "./ee/spec/features/projects/merge_requests/user_edits_merge_request_spec.rb"
+- "./ee/spec/features/projects/mirror_spec.rb"
+- "./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/pipeline_spec.rb"
+- "./ee/spec/features/projects/push_rules_spec.rb"
+- "./ee/spec/features/projects/quality/test_case_create_spec.rb"
+- "./ee/spec/features/projects/quality/test_case_list_spec.rb"
+- "./ee/spec/features/projects/quality/test_case_show_spec.rb"
+- "./ee/spec/features/projects/releases/user_views_release_spec.rb"
+- "./ee/spec/features/projects/requirements_management/requirements_list_spec.rb"
+- "./ee/spec/features/projects/security/dast_scanner_profiles_spec.rb"
+- "./ee/spec/features/projects/security/dast_site_profiles_spec.rb"
+- "./ee/spec/features/projects/security/user_creates_on_demand_scan_spec.rb"
+- "./ee/spec/features/projects/security/user_views_security_configuration_spec.rb"
+- "./ee/spec/features/projects/services/prometheus_custom_metrics_spec.rb"
+- "./ee/spec/features/projects/services/user_activates_github_spec.rb"
+- "./ee/spec/features/projects/settings/disable_merge_trains_setting_spec.rb"
+- "./ee/spec/features/projects/settings/ee/repository_mirrors_settings_spec.rb"
+- "./ee/spec/features/projects/settings/ee/service_desk_setting_spec.rb"
+- "./ee/spec/features/projects/settings/issues_settings_spec.rb"
+- "./ee/spec/features/projects/settings/merge_request_approvals_settings_spec.rb"
+- "./ee/spec/features/projects/settings/merge_requests_settings_spec.rb"
+- "./ee/spec/features/projects/settings/pipeline_subscriptions_spec.rb"
+- "./ee/spec/features/projects/settings/protected_environments_spec.rb"
+- "./ee/spec/features/projects/settings/user_manages_merge_pipelines_spec.rb"
+- "./ee/spec/features/projects/settings/user_manages_merge_trains_spec.rb"
+- "./ee/spec/features/projects_spec.rb"
+- "./ee/spec/features/projects/user_applies_custom_file_template_spec.rb"
+- "./ee/spec/features/projects/view_blob_with_code_owners_spec.rb"
+- "./ee/spec/features/projects/wiki/user_views_wiki_empty_spec.rb"
+- "./ee/spec/features/promotion_spec.rb"
+- "./ee/spec/features/protected_branches_spec.rb"
+- "./ee/spec/features/protected_tags_spec.rb"
+- "./ee/spec/features/registrations/combined_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"
+- "./ee/spec/features/search/elastic/project_search_spec.rb"
+- "./ee/spec/features/search/elastic/snippet_search_spec.rb"
+- "./ee/spec/features/search/user_searches_for_epics_spec.rb"
+- "./ee/spec/features/subscriptions/groups/edit_spec.rb"
+- "./ee/spec/features/trial_registrations/signup_spec.rb"
+- "./ee/spec/features/trials/capture_lead_spec.rb"
+- "./ee/spec/features/trials/select_namespace_spec.rb"
+- "./ee/spec/features/trials/show_trial_banner_spec.rb"
+- "./ee/spec/features/users/login_spec.rb"
+- "./ee/spec/finders/geo/attachment_legacy_registry_finder_spec.rb"
+- "./ee/spec/finders/geo/container_repository_registry_finder_spec.rb"
+- "./ee/spec/finders/geo/lfs_object_registry_finder_spec.rb"
+- "./ee/spec/finders/geo/merge_request_diff_registry_finder_spec.rb"
+- "./ee/spec/finders/geo/package_file_registry_finder_spec.rb"
+- "./ee/spec/finders/geo/pages_deployment_registry_finder_spec.rb"
+- "./ee/spec/finders/geo/pipeline_artifact_registry_finder_spec.rb"
+- "./ee/spec/finders/geo/project_registry_finder_spec.rb"
+- "./ee/spec/finders/merge_requests/by_approvers_finder_spec.rb"
+- "./ee/spec/frontend/fixtures/analytics/value_streams.rb"
+- "./ee/spec/graphql/mutations/dast_on_demand_scans/create_spec.rb"
+- "./ee/spec/graphql/mutations/dast/profiles/create_spec.rb"
+- "./ee/spec/graphql/mutations/dast/profiles/run_spec.rb"
+- "./ee/spec/graphql/mutations/dast/profiles/update_spec.rb"
+- "./ee/spec/graphql/mutations/merge_requests/accept_spec.rb"
+- "./ee/spec/graphql/resolvers/geo/group_wiki_repository_registries_resolver_spec.rb"
+- "./ee/spec/graphql/resolvers/geo/lfs_object_registries_resolver_spec.rb"
+- "./ee/spec/graphql/resolvers/geo/merge_request_diff_registries_resolver_spec.rb"
+- "./ee/spec/graphql/resolvers/geo/package_file_registries_resolver_spec.rb"
+- "./ee/spec/graphql/resolvers/geo/pages_deployment_registries_resolver_spec.rb"
+- "./ee/spec/graphql/resolvers/geo/pipeline_artifact_registries_resolver_spec.rb"
+- "./ee/spec/graphql/resolvers/geo/snippet_repository_registries_resolver_spec.rb"
+- "./ee/spec/graphql/resolvers/geo/terraform_state_version_registries_resolver_spec.rb"
+- "./ee/spec/graphql/resolvers/geo/upload_registries_resolver_spec.rb"
+- "./ee/spec/helpers/application_helper_spec.rb"
+- "./ee/spec/helpers/ee/geo_helper_spec.rb"
+- "./ee/spec/lib/analytics/devops_adoption/snapshot_calculator_spec.rb"
+- "./ee/spec/lib/ee/gitlab/background_migration/backfill_iteration_cadence_id_for_boards_spec.rb"
+- "./ee/spec/lib/ee/gitlab/background_migration/backfill_version_data_from_gitaly_spec.rb"
+- "./ee/spec/lib/ee/gitlab/background_migration/create_security_setting_spec.rb"
+- "./ee/spec/lib/ee/gitlab/background_migration/fix_ruby_object_in_audit_events_spec.rb"
+- "./ee/spec/lib/ee/gitlab/background_migration/migrate_approver_to_approval_rules_check_progress_spec.rb"
+- "./ee/spec/lib/ee/gitlab/background_migration/migrate_approver_to_approval_rules_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_devops_segments_to_groups_spec.rb"
+- "./ee/spec/lib/ee/gitlab/background_migration/migrate_security_scans_spec.rb"
+- "./ee/spec/lib/ee/gitlab/background_migration/move_epic_issues_after_epics_spec.rb"
+- "./ee/spec/lib/ee/gitlab/background_migration/populate_any_approval_rule_for_merge_requests_spec.rb"
+- "./ee/spec/lib/ee/gitlab/background_migration/populate_any_approval_rule_for_projects_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"
+- "./ee/spec/lib/ee/gitlab/background_migration/populate_resolved_on_default_branch_column_spec.rb"
+- "./ee/spec/lib/ee/gitlab/background_migration/populate_uuids_for_security_findings_spec.rb"
+- "./ee/spec/lib/ee/gitlab/background_migration/populate_vulnerability_feedback_pipeline_id_spec.rb"
+- "./ee/spec/lib/ee/gitlab/background_migration/populate_vulnerability_historical_statistics_spec.rb"
+- "./ee/spec/lib/ee/gitlab/background_migration/prune_orphaned_geo_events_spec.rb"
+- "./ee/spec/lib/ee/gitlab/background_migration/remove_duplicate_cs_findings_spec.rb"
+- "./ee/spec/lib/ee/gitlab/background_migration/remove_duplicated_cs_findings_without_vulnerability_id_spec.rb"
+- "./ee/spec/lib/ee/gitlab/background_migration/remove_inaccessible_epic_todos_spec.rb"
+- "./ee/spec/lib/ee/gitlab/background_migration/remove_undefined_occurrence_confidence_level_spec.rb"
+- "./ee/spec/lib/ee/gitlab/background_migration/remove_undefined_occurrence_severity_level_spec.rb"
+- "./ee/spec/lib/ee/gitlab/background_migration/remove_undefined_vulnerability_confidence_level_spec.rb"
+- "./ee/spec/lib/ee/gitlab/background_migration/remove_undefined_vulnerability_severity_level_spec.rb"
+- "./ee/spec/lib/ee/gitlab/background_migration/update_location_fingerprint_for_container_scanning_findings_spec.rb"
+- "./ee/spec/lib/ee/gitlab/background_migration/update_vulnerabilities_from_dismissal_feedback_spec.rb"
+- "./ee/spec/lib/ee/gitlab/background_migration/update_vulnerabilities_to_dismissed_spec.rb"
+- "./ee/spec/lib/ee/gitlab/background_migration/update_vulnerability_confidence_spec.rb"
+- "./ee/spec/lib/ee/gitlab/database/connection_spec.rb"
+- "./ee/spec/lib/ee/gitlab/database_spec.rb"
+- "./ee/spec/lib/ee/gitlab/middleware/read_only_spec.rb"
+- "./ee/spec/lib/ee/gitlab/usage_data_spec.rb"
+- "./ee/spec/lib/gitlab/background_migration/fix_orphan_promoted_issues_spec.rb"
+- "./ee/spec/lib/gitlab/background_migration/user_mentions/create_resource_user_mention_spec.rb"
+- "./ee/spec/lib/gitlab/ci/templates/Jobs/dast_default_branch_gitlab_ci_yaml_spec.rb"
+- "./ee/spec/lib/gitlab/geo/base_request_spec.rb"
+- "./ee/spec/lib/gitlab/geo/database_tasks_spec.rb"
+- "./ee/spec/lib/gitlab/geo/event_gap_tracking_spec.rb"
+- "./ee/spec/lib/gitlab/geo/geo_tasks_spec.rb"
+- "./ee/spec/lib/gitlab/geo/jwt_request_decoder_spec.rb"
+- "./ee/spec/lib/gitlab/geo/log_cursor/events/design_repository_updated_event_spec.rb"
+- "./ee/spec/lib/gitlab/geo/log_cursor/events/job_artifact_deleted_event_spec.rb"
+- "./ee/spec/lib/gitlab/geo/log_cursor/events/repository_created_event_spec.rb"
+- "./ee/spec/lib/gitlab/geo/log_cursor/events/repository_updated_event_spec.rb"
+- "./ee/spec/lib/gitlab/geo/oauth/login_state_spec.rb"
+- "./ee/spec/lib/gitlab/geo/oauth/logout_token_spec.rb"
+- "./ee/spec/lib/gitlab/geo/oauth/session_spec.rb"
+- "./ee/spec/lib/gitlab/geo/registry_batcher_spec.rb"
+- "./ee/spec/lib/gitlab/geo/replicable_model_spec.rb"
+- "./ee/spec/lib/gitlab/geo/replication/blob_downloader_spec.rb"
+- "./ee/spec/lib/gitlab/geo/replication/file_transfer_spec.rb"
+- "./ee/spec/lib/gitlab/geo/replicator_spec.rb"
+- "./ee/spec/lib/gitlab/git_access_spec.rb"
+- "./ee/spec/lib/pseudonymizer/dumper_spec.rb"
+- "./ee/spec/lib/system_check/geo/geo_database_configured_check_spec.rb"
+- "./ee/spec/lib/system_check/geo/http_connection_check_spec.rb"
+- "./ee/spec/lib/system_check/rake_task/geo_task_spec.rb"
+- "./ee/spec/mailers/notify_spec.rb"
+- "./ee/spec/migrations/20190926180443_schedule_epic_issues_after_epics_move_spec.rb"
+- "./ee/spec/migrations/add_non_null_constraint_for_escalation_rule_on_pending_alert_escalations_spec.rb"
+- "./ee/spec/migrations/add_unique_constraint_to_software_licenses_spec.rb"
+- "./ee/spec/migrations/backfill_namespace_statistics_with_wiki_size_spec.rb"
+- "./ee/spec/migrations/backfill_operations_feature_flags_iid_spec.rb"
+- "./ee/spec/migrations/backfill_software_licenses_spdx_identifiers_spec.rb"
+- "./ee/spec/migrations/backfill_version_author_and_created_at_spec.rb"
+- "./ee/spec/migrations/cleanup_deploy_access_levels_for_removed_groups_spec.rb"
+- "./ee/spec/migrations/create_elastic_reindexing_subtasks_spec.rb"
+- "./ee/spec/migrations/fix_any_approver_rule_for_projects_spec.rb"
+- "./ee/spec/migrations/migrate_design_notes_mentions_to_db_spec.rb"
+- "./ee/spec/migrations/migrate_epic_mentions_to_db_spec.rb"
+- "./ee/spec/migrations/migrate_epic_notes_mentions_to_db_spec.rb"
+- "./ee/spec/migrations/migrate_license_management_artifacts_to_license_scanning_spec.rb"
+- "./ee/spec/migrations/migrate_saml_identities_to_scim_identities_spec.rb"
+- "./ee/spec/migrations/migrate_scim_identities_to_saml_for_new_users_spec.rb"
+- "./ee/spec/migrations/migrate_vulnerability_dismissal_feedback_spec.rb"
+- "./ee/spec/migrations/migrate_vulnerability_dismissals_spec.rb"
+- "./ee/spec/migrations/nullify_feature_flag_plaintext_tokens_spec.rb"
+- "./ee/spec/migrations/populate_vulnerability_historical_statistics_for_year_spec.rb"
+- "./ee/spec/migrations/remove_creations_in_gitlab_subscription_histories_spec.rb"
+- "./ee/spec/migrations/remove_cycle_analytics_total_stage_data_spec.rb"
+- "./ee/spec/migrations/remove_duplicated_cs_findings_spec.rb"
+- "./ee/spec/migrations/remove_duplicated_cs_findings_without_vulnerability_id_spec.rb"
+- "./ee/spec/migrations/remove_schedule_and_status_null_constraints_from_pending_escalations_alert_spec.rb"
+- "./ee/spec/migrations/schedule_fix_orphan_promoted_issues_spec.rb"
+- "./ee/spec/migrations/schedule_fix_ruby_object_in_audit_events_spec.rb"
+- "./ee/spec/migrations/schedule_merge_request_any_approval_rule_migration_spec.rb"
+- "./ee/spec/migrations/schedule_populate_dismissed_state_for_vulnerabilities_spec.rb"
+- "./ee/spec/migrations/schedule_populate_resolved_on_default_branch_column_spec.rb"
+- "./ee/spec/migrations/schedule_populate_vulnerability_historical_statistics_spec.rb"
+- "./ee/spec/migrations/schedule_project_any_approval_rule_migration_spec.rb"
+- "./ee/spec/migrations/schedule_remove_inaccessible_epic_todos_spec.rb"
+- "./ee/spec/migrations/schedule_sync_blocking_issues_count_spec.rb"
+- "./ee/spec/migrations/schedule_uuid_population_for_security_findings2_spec.rb"
+- "./ee/spec/migrations/set_report_type_for_vulnerabilities_spec.rb"
+- "./ee/spec/migrations/set_resolved_state_on_vulnerabilities_spec.rb"
+- "./ee/spec/migrations/update_cs_vulnerability_confidence_column_spec.rb"
+- "./ee/spec/migrations/update_gitlab_subscriptions_start_at_post_eoa_spec.rb"
+- "./ee/spec/migrations/update_location_fingerprint_column_for_cs_spec.rb"
+- "./ee/spec/migrations/update_occurrence_severity_column_spec.rb"
+- "./ee/spec/migrations/update_undefined_confidence_from_occurrences_spec.rb"
+- "./ee/spec/migrations/update_undefined_confidence_from_vulnerabilities_spec.rb"
+- "./ee/spec/migrations/update_vulnerability_severity_column_spec.rb"
+- "./ee/spec/models/analytics/cycle_analytics/group_level_spec.rb"
+- "./ee/spec/models/approval_merge_request_rule_spec.rb"
+- "./ee/spec/models/approval_project_rule_spec.rb"
+- "./ee/spec/models/approval_state_spec.rb"
+- "./ee/spec/models/approval_wrapped_code_owner_rule_spec.rb"
+- "./ee/spec/models/approval_wrapped_rule_spec.rb"
+- "./ee/spec/models/approver_group_spec.rb"
+- "./ee/spec/models/ci/bridge_spec.rb"
+- "./ee/spec/models/ci/build_spec.rb"
+- "./ee/spec/models/ci/minutes/additional_pack_spec.rb"
+- "./ee/spec/models/ci/pipeline_spec.rb"
+- "./ee/spec/models/ci/subscriptions/project_spec.rb"
+- "./ee/spec/models/concerns/approval_rule_like_spec.rb"
+- "./ee/spec/models/concerns/approver_migrate_hook_spec.rb"
+- "./ee/spec/models/dora/daily_metrics_spec.rb"
+- "./ee/spec/models/ee/ci/job_artifact_spec.rb"
+- "./ee/spec/models/ee/ci/pipeline_artifact_spec.rb"
+- "./ee/spec/models/ee/ci/runner_spec.rb"
+- "./ee/spec/models/ee/merge_request_diff_spec.rb"
+- "./ee/spec/models/ee/pages_deployment_spec.rb"
+- "./ee/spec/models/ee/terraform/state_version_spec.rb"
+- "./ee/spec/models/geo/container_repository_registry_spec.rb"
+- "./ee/spec/models/geo/deleted_project_spec.rb"
+- "./ee/spec/models/geo/design_registry_spec.rb"
+- "./ee/spec/models/geo/job_artifact_registry_spec.rb"
+- "./ee/spec/models/geo_node_namespace_link_spec.rb"
+- "./ee/spec/models/geo_node_spec.rb"
+- "./ee/spec/models/geo_node_status_spec.rb"
+- "./ee/spec/models/geo/package_file_registry_spec.rb"
+- "./ee/spec/models/geo/project_registry_spec.rb"
+- "./ee/spec/models/group_member_spec.rb"
+- "./ee/spec/models/group_wiki_repository_spec.rb"
+- "./ee/spec/models/merge_request_spec.rb"
+- "./ee/spec/models/packages/package_file_spec.rb"
+- "./ee/spec/models/project_spec.rb"
+- "./ee/spec/models/requirements_management/requirement_spec.rb"
+- "./ee/spec/models/snippet_repository_spec.rb"
+- "./ee/spec/models/upload_spec.rb"
+- "./ee/spec/models/visible_approvable_spec.rb"
+- "./ee/spec/policies/ci/build_policy_spec.rb"
+- "./ee/spec/presenters/approval_rule_presenter_spec.rb"
+- "./ee/spec/presenters/merge_request_presenter_spec.rb"
+- "./ee/spec/replicators/geo/pipeline_artifact_replicator_spec.rb"
+- "./ee/spec/replicators/geo/terraform_state_version_replicator_spec.rb"
+- "./ee/spec/requests/api/ci/pipelines_spec.rb"
+- "./ee/spec/requests/api/geo_nodes_spec.rb"
+- "./ee/spec/requests/api/geo_replication_spec.rb"
+- "./ee/spec/requests/api/graphql/mutations/dast_on_demand_scans/create_spec.rb"
+- "./ee/spec/requests/api/graphql/mutations/dast/profiles/create_spec.rb"
+- "./ee/spec/requests/api/graphql/mutations/dast/profiles/run_spec.rb"
+- "./ee/spec/requests/api/graphql/mutations/dast/profiles/update_spec.rb"
+- "./ee/spec/requests/api/graphql/project/pipeline/dast_profile_spec.rb"
+- "./ee/spec/requests/api/merge_request_approval_rules_spec.rb"
+- "./ee/spec/requests/api/merge_requests_spec.rb"
+- "./ee/spec/requests/api/project_approval_rules_spec.rb"
+- "./ee/spec/requests/api/project_approval_settings_spec.rb"
+- "./ee/spec/requests/api/project_approvals_spec.rb"
+- "./ee/spec/requests/api/project_snapshots_spec.rb"
+- "./ee/spec/requests/api/status_checks_spec.rb"
+- "./ee/spec/requests/api/vulnerability_findings_spec.rb"
+- "./ee/spec/requests/projects/merge_requests_controller_spec.rb"
+- "./ee/spec/routing/admin_routing_spec.rb"
+- "./ee/spec/serializers/dashboard_operations_project_entity_spec.rb"
+- "./ee/spec/serializers/ee/evidences/release_entity_spec.rb"
+- "./ee/spec/serializers/ee/user_serializer_spec.rb"
+- "./ee/spec/serializers/evidences/evidence_entity_spec.rb"
+- "./ee/spec/serializers/merge_request_widget_entity_spec.rb"
+- "./ee/spec/serializers/pipeline_serializer_spec.rb"
+- "./ee/spec/services/approval_rules/create_service_spec.rb"
+- "./ee/spec/services/approval_rules/finalize_service_spec.rb"
+- "./ee/spec/services/approval_rules/merge_request_rule_destroy_service_spec.rb"
+- "./ee/spec/services/approval_rules/params_filtering_service_spec.rb"
+- "./ee/spec/services/approval_rules/project_rule_destroy_service_spec.rb"
+- "./ee/spec/services/approval_rules/update_service_spec.rb"
+- "./ee/spec/services/app_sec/dast/profiles/create_service_spec.rb"
+- "./ee/spec/services/app_sec/dast/profiles/update_service_spec.rb"
+- "./ee/spec/services/app_sec/dast/scans/create_service_spec.rb"
+- "./ee/spec/services/app_sec/dast/scans/run_service_spec.rb"
+- "./ee/spec/services/ci/compare_license_scanning_reports_service_spec.rb"
+- "./ee/spec/services/ci/compare_metrics_reports_service_spec.rb"
+- "./ee/spec/services/ci/create_pipeline_service/dast_configuration_spec.rb"
+- "./ee/spec/services/ci/destroy_pipeline_service_spec.rb"
+- "./ee/spec/services/ci/minutes/track_live_consumption_service_spec.rb"
+- "./ee/spec/services/ci/minutes/update_build_minutes_service_spec.rb"
+- "./ee/spec/services/ci/register_job_service_spec.rb"
+- "./ee/spec/services/ci/retry_build_service_spec.rb"
+- "./ee/spec/services/ci/run_dast_scan_service_spec.rb"
+- "./ee/spec/services/ci/subscribe_bridge_service_spec.rb"
+- "./ee/spec/services/ci/sync_reports_to_approval_rules_service_spec.rb"
+- "./ee/spec/services/ci/trigger_downstream_subscription_service_spec.rb"
+- "./ee/spec/services/dast_on_demand_scans/create_service_spec.rb"
+- "./ee/spec/services/deployments/auto_rollback_service_spec.rb"
+- "./ee/spec/services/ee/ci/job_artifacts/destroy_all_expired_service_spec.rb"
+- "./ee/spec/services/ee/ci/job_artifacts/destroy_batch_service_spec.rb"
+- "./ee/spec/services/ee/integrations/test/project_service_spec.rb"
+- "./ee/spec/services/ee/issuable/destroy_service_spec.rb"
+- "./ee/spec/services/ee/merge_requests/refresh_service_spec.rb"
+- "./ee/spec/services/ee/merge_requests/update_service_spec.rb"
+- "./ee/spec/services/ee/notification_service_spec.rb"
+- "./ee/spec/services/ee/post_receive_service_spec.rb"
+- "./ee/spec/services/ee/releases/create_evidence_service_spec.rb"
+- "./ee/spec/services/ee/users/destroy_service_spec.rb"
+- "./ee/spec/services/external_status_checks/create_service_spec.rb"
+- "./ee/spec/services/external_status_checks/destroy_service_spec.rb"
+- "./ee/spec/services/external_status_checks/update_service_spec.rb"
+- "./ee/spec/services/geo/container_repository_sync_service_spec.rb"
+- "./ee/spec/services/geo/hashed_storage_migrated_event_store_spec.rb"
+- "./ee/spec/services/geo/hashed_storage_migration_service_spec.rb"
+- "./ee/spec/services/geo/node_create_service_spec.rb"
+- "./ee/spec/services/geo/node_status_request_service_spec.rb"
+- "./ee/spec/services/geo/node_update_service_spec.rb"
+- "./ee/spec/services/geo/project_housekeeping_service_spec.rb"
+- "./ee/spec/services/geo/registry_consistency_service_spec.rb"
+- "./ee/spec/services/geo/repositories_changed_event_store_spec.rb"
+- "./ee/spec/services/geo/repository_updated_event_store_spec.rb"
+- "./ee/spec/services/geo/repository_verification_reset_spec.rb"
+- "./ee/spec/services/geo/repository_verification_secondary_service_spec.rb"
+- "./ee/spec/services/merge_requests/merge_service_spec.rb"
+- "./ee/spec/services/merge_requests/reset_approvals_service_spec.rb"
+- "./ee/spec/services/merge_requests/sync_report_approver_approval_rules_spec.rb"
+- "./ee/spec/services/projects/transfer_service_spec.rb"
+- "./ee/spec/services/security/security_orchestration_policies/rule_schedule_service_spec.rb"
+- "./ee/spec/services/todo_service_spec.rb"
+- "./ee/spec/services/vulnerability_feedback/create_service_spec.rb"
+- "./ee/spec/services/wiki_pages/create_service_spec.rb"
+- "./ee/spec/services/wiki_pages/destroy_service_spec.rb"
+- "./ee/spec/services/wiki_pages/update_service_spec.rb"
+- "./ee/spec/support/shared_examples/fixtures/analytics_value_streams_shared_examples.rb"
+- "./ee/spec/support/shared_examples/graphql/geo/geo_registries_resolver_shared_examples.rb"
+- "./ee/spec/support/shared_examples/graphql/mutations/dast_on_demand_scans_shared_examples.rb"
+- "./ee/spec/support/shared_examples/graphql/mutations/dast_on_demand_scan_with_user_abilities_shared_examples.rb"
+- "./ee/spec/support/shared_examples/lib/gitlab/geo/geo_log_cursor_event_shared_examples.rb"
+- "./ee/spec/support/shared_examples/lib/gitlab/geo/geo_logs_event_source_info_shared_examples.rb"
+- "./ee/spec/support/shared_examples/models/concerns/blob_replicator_strategy_shared_examples.rb"
+- "./ee/spec/support/shared_examples/models/concerns/replicable_model_shared_examples.rb"
+- "./ee/spec/support/shared_examples/models/concerns/verifiable_replicator_shared_examples.rb"
+- "./ee/spec/support/shared_examples/policies/protected_environments_shared_examples.rb"
+- "./ee/spec/support/shared_examples/requests/api/project_approval_rules_api_shared_examples.rb"
+- "./ee/spec/support/shared_examples/services/audit_event_logging_shared_examples.rb"
+- "./ee/spec/support/shared_examples/services/build_execute_shared_examples.rb"
+- "./ee/spec/support/shared_examples/services/dast_on_demand_scans_shared_examples.rb"
+- "./ee/spec/support/shared_examples/services/geo_event_store_shared_examples.rb"
+- "./ee/spec/tasks/geo_rake_spec.rb"
+- "./ee/spec/tasks/gitlab/geo_rake_spec.rb"
+- "./ee/spec/workers/geo/file_download_dispatch_worker_spec.rb"
+- "./ee/spec/workers/geo/metrics_update_worker_spec.rb"
+- "./ee/spec/workers/geo/prune_event_log_worker_spec.rb"
+- "./ee/spec/workers/geo/registry_sync_worker_spec.rb"
+- "./ee/spec/workers/geo/repository_cleanup_worker_spec.rb"
+- "./ee/spec/workers/geo/repository_sync_worker_spec.rb"
+- "./ee/spec/workers/geo/repository_verification/secondary/scheduler_worker_spec.rb"
+- "./ee/spec/workers/geo/repository_verification/secondary/single_worker_spec.rb"
+- "./ee/spec/workers/geo/verification_worker_spec.rb"
+- "./ee/spec/workers/refresh_license_compliance_checks_worker_spec.rb"
+- "./spec/controllers/abuse_reports_controller_spec.rb"
+- "./spec/controllers/admin/spam_logs_controller_spec.rb"
+- "./spec/controllers/admin/users_controller_spec.rb"
+- "./spec/controllers/omniauth_callbacks_controller_spec.rb"
+- "./spec/controllers/projects/issues_controller_spec.rb"
+- "./spec/controllers/projects/jobs_controller_spec.rb"
+- "./spec/controllers/projects/merge_requests/content_controller_spec.rb"
+- "./spec/controllers/projects/merge_requests_controller_spec.rb"
+- "./spec/controllers/projects/pipelines_controller_spec.rb"
+- "./spec/controllers/projects/pipelines/tests_controller_spec.rb"
+- "./spec/controllers/projects/settings/access_tokens_controller_spec.rb"
+- "./spec/controllers/projects/tags_controller_spec.rb"
+- "./spec/controllers/sent_notifications_controller_spec.rb"
+- "./spec/factories_spec.rb"
+- "./spec/features/action_cable_logging_spec.rb"
+- "./spec/features/admin/admin_abuse_reports_spec.rb"
+- "./spec/features/admin/admin_appearance_spec.rb"
+- "./spec/features/admin/admin_broadcast_messages_spec.rb"
+- "./spec/features/admin/admin_builds_spec.rb"
+- "./spec/features/admin/admin_dev_ops_report_spec.rb"
+- "./spec/features/admin/admin_disables_git_access_protocol_spec.rb"
+- "./spec/features/admin/admin_disables_two_factor_spec.rb"
+- "./spec/features/admin/admin_groups_spec.rb"
+- "./spec/features/admin/admin_hooks_spec.rb"
+- "./spec/features/admin/admin_labels_spec.rb"
+- "./spec/features/admin/admin_mode/login_spec.rb"
+- "./spec/features/admin/admin_mode/logout_spec.rb"
+- "./spec/features/admin/admin_mode_spec.rb"
+- "./spec/features/admin/admin_mode/workers_spec.rb"
+- "./spec/features/admin/admin_projects_spec.rb"
+- "./spec/features/admin/admin_runners_spec.rb"
+- "./spec/features/admin/admin_search_settings_spec.rb"
+- "./spec/features/admin/admin_serverless_domains_spec.rb"
+- "./spec/features/admin/admin_settings_spec.rb"
+- "./spec/features/admin/admin_users_impersonation_tokens_spec.rb"
+- "./spec/features/admin/admin_uses_repository_checks_spec.rb"
+- "./spec/features/admin/clusters/eks_spec.rb"
+- "./spec/features/admin/dashboard_spec.rb"
+- "./spec/features/admin/integrations/user_activates_mattermost_slash_command_spec.rb"
+- "./spec/features/admin/users/user_spec.rb"
+- "./spec/features/admin/users/users_spec.rb"
+- "./spec/features/alert_management/alert_details_spec.rb"
+- "./spec/features/alert_management/alert_management_list_spec.rb"
+- "./spec/features/alert_management_spec.rb"
+- "./spec/features/alert_management/user_filters_alerts_by_status_spec.rb"
+- "./spec/features/alert_management/user_searches_alerts_spec.rb"
+- "./spec/features/alert_management/user_updates_alert_status_spec.rb"
+- "./spec/features/alerts_settings/user_views_alerts_settings_spec.rb"
+- "./spec/features/atom/dashboard_spec.rb"
+- "./spec/features/boards/boards_spec.rb"
+- "./spec/features/boards/focus_mode_spec.rb"
+- "./spec/features/boards/issue_ordering_spec.rb"
+- "./spec/features/boards/keyboard_shortcut_spec.rb"
+- "./spec/features/boards/multiple_boards_spec.rb"
+- "./spec/features/boards/new_issue_spec.rb"
+- "./spec/features/boards/reload_boards_on_browser_back_spec.rb"
+- "./spec/features/boards/sidebar_due_date_spec.rb"
+- "./spec/features/boards/sidebar_labels_in_namespaces_spec.rb"
+- "./spec/features/boards/sidebar_labels_spec.rb"
+- "./spec/features/boards/sidebar_milestones_spec.rb"
+- "./spec/features/boards/sidebar_spec.rb"
+- "./spec/features/boards/user_adds_lists_to_board_spec.rb"
+- "./spec/features/boards/user_visits_board_spec.rb"
+- "./spec/features/broadcast_messages_spec.rb"
+- "./spec/features/calendar_spec.rb"
+- "./spec/features/callouts/registration_enabled_spec.rb"
+- "./spec/features/clusters/cluster_detail_page_spec.rb"
+- "./spec/features/clusters/cluster_health_dashboard_spec.rb"
+- "./spec/features/commit_spec.rb"
+- "./spec/features/commits_spec.rb"
+- "./spec/features/commits/user_uses_quick_actions_spec.rb"
+- "./spec/features/contextual_sidebar_spec.rb"
+- "./spec/features/cycle_analytics_spec.rb"
+- "./spec/features/dashboard/activity_spec.rb"
+- "./spec/features/dashboard/archived_projects_spec.rb"
+- "./spec/features/dashboard/datetime_on_tooltips_spec.rb"
+- "./spec/features/dashboard/group_dashboard_with_external_authorization_service_spec.rb"
+- "./spec/features/dashboard/groups_list_spec.rb"
+- "./spec/features/dashboard/group_spec.rb"
+- "./spec/features/dashboard/issues_filter_spec.rb"
+- "./spec/features/dashboard/issues_spec.rb"
+- "./spec/features/dashboard/label_filter_spec.rb"
+- "./spec/features/dashboard/merge_requests_spec.rb"
+- "./spec/features/dashboard/milestones_spec.rb"
+- "./spec/features/dashboard/project_member_activity_index_spec.rb"
+- "./spec/features/dashboard/projects_spec.rb"
+- "./spec/features/dashboard/root_spec.rb"
+- "./spec/features/dashboard/shortcuts_spec.rb"
+- "./spec/features/dashboard/snippets_spec.rb"
+- "./spec/features/dashboard/todos/todos_filtering_spec.rb"
+- "./spec/features/dashboard/todos/todos_spec.rb"
+- "./spec/features/dashboard/user_filters_projects_spec.rb"
+- "./spec/features/discussion_comments/commit_spec.rb"
+- "./spec/features/discussion_comments/issue_spec.rb"
+- "./spec/features/discussion_comments/merge_request_spec.rb"
+- "./spec/features/discussion_comments/snippets_spec.rb"
+- "./spec/features/error_pages_spec.rb"
+- "./spec/features/error_tracking/user_filters_errors_by_status_spec.rb"
+- "./spec/features/error_tracking/user_searches_sentry_errors_spec.rb"
+- "./spec/features/error_tracking/user_sees_error_details_spec.rb"
+- "./spec/features/error_tracking/user_sees_error_index_spec.rb"
+- "./spec/features/expand_collapse_diffs_spec.rb"
+- "./spec/features/explore/groups_list_spec.rb"
+- "./spec/features/explore/groups_spec.rb"
+- "./spec/features/explore/user_explores_projects_spec.rb"
+- "./spec/features/file_uploads/attachment_spec.rb"
+- "./spec/features/file_uploads/ci_artifact_spec.rb"
+- "./spec/features/file_uploads/git_lfs_spec.rb"
+- "./spec/features/file_uploads/graphql_add_design_spec.rb"
+- "./spec/features/file_uploads/group_import_spec.rb"
+- "./spec/features/file_uploads/maven_package_spec.rb"
+- "./spec/features/file_uploads/multipart_invalid_uploads_spec.rb"
+- "./spec/features/file_uploads/nuget_package_spec.rb"
+- "./spec/features/file_uploads/project_import_spec.rb"
+- "./spec/features/file_uploads/rubygem_package_spec.rb"
+- "./spec/features/file_uploads/user_avatar_spec.rb"
+- "./spec/features/frequently_visited_projects_and_groups_spec.rb"
+- "./spec/features/gitlab_experiments_spec.rb"
+- "./spec/features/global_search_spec.rb"
+- "./spec/features/groups/activity_spec.rb"
+- "./spec/features/groups/board_sidebar_spec.rb"
+- "./spec/features/groups/board_spec.rb"
+- "./spec/features/groups/clusters/eks_spec.rb"
+- "./spec/features/groups/clusters/user_spec.rb"
+- "./spec/features/groups/container_registry_spec.rb"
+- "./spec/features/groups/dependency_proxy_spec.rb"
+- "./spec/features/groups/empty_states_spec.rb"
+- "./spec/features/groups/import_export/connect_instance_spec.rb"
+- "./spec/features/groups/import_export/export_file_spec.rb"
+- "./spec/features/groups/import_export/import_file_spec.rb"
+- "./spec/features/groups/integrations/user_activates_mattermost_slash_command_spec.rb"
+- "./spec/features/groups/issues_spec.rb"
+- "./spec/features/groups/labels/index_spec.rb"
+- "./spec/features/groups/labels/search_labels_spec.rb"
+- "./spec/features/groups/labels/sort_labels_spec.rb"
+- "./spec/features/groups/labels/subscription_spec.rb"
+- "./spec/features/groups/members/filter_members_spec.rb"
+- "./spec/features/groups/members/leave_group_spec.rb"
+- "./spec/features/groups/members/list_members_spec.rb"
+- "./spec/features/groups/members/manage_groups_spec.rb"
+- "./spec/features/groups/members/manage_members_spec.rb"
+- "./spec/features/groups/members/master_adds_member_with_expiration_date_spec.rb"
+- "./spec/features/groups/members/master_manages_access_requests_spec.rb"
+- "./spec/features/groups/members/search_members_spec.rb"
+- "./spec/features/groups/members/sort_members_spec.rb"
+- "./spec/features/groups/members/tabs_spec.rb"
+- "./spec/features/groups/merge_requests_spec.rb"
+- "./spec/features/groups/milestones/gfm_autocomplete_spec.rb"
+- "./spec/features/groups/milestone_spec.rb"
+- "./spec/features/groups/milestones_sorting_spec.rb"
+- "./spec/features/groups/packages_spec.rb"
+- "./spec/features/groups/settings/group_badges_spec.rb"
+- "./spec/features/groups/settings/packages_and_registries_spec.rb"
+- "./spec/features/groups/settings/repository_spec.rb"
+- "./spec/features/groups/settings/user_searches_in_settings_spec.rb"
+- "./spec/features/groups/show_spec.rb"
+- "./spec/features/groups_spec.rb"
+- "./spec/features/groups/user_browse_projects_group_page_spec.rb"
+- "./spec/features/groups/user_sees_users_dropdowns_in_issuables_list_spec.rb"
+- "./spec/features/help_pages_spec.rb"
+- "./spec/features/ide_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/incidents/incident_details_spec.rb"
+- "./spec/features/incidents/incidents_list_spec.rb"
+- "./spec/features/incidents/user_creates_new_incident_spec.rb"
+- "./spec/features/incidents/user_filters_incidents_by_status_spec.rb"
+- "./spec/features/incidents/user_searches_incidents_spec.rb"
+- "./spec/features/incidents/user_views_incident_spec.rb"
+- "./spec/features/issuables/issuable_list_spec.rb"
+- "./spec/features/issuables/markdown_references/internal_references_spec.rb"
+- "./spec/features/issuables/markdown_references/jira_spec.rb"
+- "./spec/features/issuables/sorting_list_spec.rb"
+- "./spec/features/issuables/user_sees_sidebar_spec.rb"
+- "./spec/features/issues/create_issue_for_discussions_in_merge_request_spec.rb"
+- "./spec/features/issues/create_issue_for_single_discussion_in_merge_request_spec.rb"
+- "./spec/features/issues/csv_spec.rb"
+- "./spec/features/issues/discussion_lock_spec.rb"
+- "./spec/features/issues/filtered_search/dropdown_assignee_spec.rb"
+- "./spec/features/issues/filtered_search/dropdown_author_spec.rb"
+- "./spec/features/issues/filtered_search/dropdown_base_spec.rb"
+- "./spec/features/issues/filtered_search/dropdown_emoji_spec.rb"
+- "./spec/features/issues/filtered_search/dropdown_hint_spec.rb"
+- "./spec/features/issues/filtered_search/dropdown_label_spec.rb"
+- "./spec/features/issues/filtered_search/dropdown_milestone_spec.rb"
+- "./spec/features/issues/filtered_search/dropdown_release_spec.rb"
+- "./spec/features/issues/filtered_search/filter_issues_spec.rb"
+- "./spec/features/issues/filtered_search/recent_searches_spec.rb"
+- "./spec/features/issues/filtered_search/search_bar_spec.rb"
+- "./spec/features/issues/filtered_search/visual_tokens_spec.rb"
+- "./spec/features/issues/form_spec.rb"
+- "./spec/features/issues/gfm_autocomplete_spec.rb"
+- "./spec/features/issues/group_label_sidebar_spec.rb"
+- "./spec/features/issues/incident_issue_spec.rb"
+- "./spec/features/issues/issue_detail_spec.rb"
+- "./spec/features/issues/issue_header_spec.rb"
+- "./spec/features/issues/issue_sidebar_spec.rb"
+- "./spec/features/issues/keyboard_shortcut_spec.rb"
+- "./spec/features/issues/markdown_toolbar_spec.rb"
+- "./spec/features/issues/move_spec.rb"
+- "./spec/features/issues/note_polling_spec.rb"
+- "./spec/features/issues/notes_on_issues_spec.rb"
+- "./spec/features/issues/related_issues_spec.rb"
+- "./spec/features/issues/resource_label_events_spec.rb"
+- "./spec/features/issues/service_desk_spec.rb"
+- "./spec/features/issues/spam_issues_spec.rb"
+- "./spec/features/issues/todo_spec.rb"
+- "./spec/features/issues/user_bulk_edits_issues_labels_spec.rb"
+- "./spec/features/issues/user_bulk_edits_issues_spec.rb"
+- "./spec/features/issues/user_comments_on_issue_spec.rb"
+- "./spec/features/issues/user_creates_branch_and_merge_request_spec.rb"
+- "./spec/features/issues/user_creates_confidential_merge_request_spec.rb"
+- "./spec/features/issues/user_creates_issue_by_email_spec.rb"
+- "./spec/features/issues/user_creates_issue_spec.rb"
+- "./spec/features/issues/user_edits_issue_spec.rb"
+- "./spec/features/issues/user_filters_issues_spec.rb"
+- "./spec/features/issues/user_interacts_with_awards_spec.rb"
+- "./spec/features/issues/user_invites_from_a_comment_spec.rb"
+- "./spec/features/issues/user_resets_their_incoming_email_token_spec.rb"
+- "./spec/features/issues/user_sees_empty_state_spec.rb"
+- "./spec/features/issues/user_sees_live_update_spec.rb"
+- "./spec/features/issues/user_sees_sidebar_updates_in_realtime_spec.rb"
+- "./spec/features/issues/user_sorts_issue_comments_spec.rb"
+- "./spec/features/issues/user_sorts_issues_spec.rb"
+- "./spec/features/issues/user_toggles_subscription_spec.rb"
+- "./spec/features/issues/user_uses_quick_actions_spec.rb"
+- "./spec/features/issues/user_views_issue_spec.rb"
+- "./spec/features/issues/user_views_issues_spec.rb"
+- "./spec/features/jira_connect/branches_spec.rb"
+- "./spec/features/labels_hierarchy_spec.rb"
+- "./spec/features/markdown/copy_as_gfm_spec.rb"
+- "./spec/features/markdown/gitlab_flavored_markdown_spec.rb"
+- "./spec/features/markdown/keyboard_shortcuts_spec.rb"
+- "./spec/features/markdown/math_spec.rb"
+- "./spec/features/markdown/mermaid_spec.rb"
+- "./spec/features/markdown/metrics_spec.rb"
+- "./spec/features/merge_request/batch_comments_spec.rb"
+- "./spec/features/merge_request/close_reopen_report_toggle_spec.rb"
+- "./spec/features/merge_request/maintainer_edits_fork_spec.rb"
+- "./spec/features/merge_request/merge_request_discussion_lock_spec.rb"
+- "./spec/features/merge_requests/filters_generic_behavior_spec.rb"
+- "./spec/features/merge_requests/user_exports_as_csv_spec.rb"
+- "./spec/features/merge_requests/user_filters_by_approvals_spec.rb"
+- "./spec/features/merge_requests/user_filters_by_assignees_spec.rb"
+- "./spec/features/merge_requests/user_filters_by_deployments_spec.rb"
+- "./spec/features/merge_requests/user_filters_by_draft_spec.rb"
+- "./spec/features/merge_requests/user_filters_by_labels_spec.rb"
+- "./spec/features/merge_requests/user_filters_by_milestones_spec.rb"
+- "./spec/features/merge_requests/user_filters_by_multiple_criteria_spec.rb"
+- "./spec/features/merge_requests/user_filters_by_target_branch_spec.rb"
+- "./spec/features/merge_requests/user_mass_updates_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_approves_spec.rb"
+- "./spec/features/merge_request/user_assigns_themselves_spec.rb"
+- "./spec/features/merge_request/user_awards_emoji_spec.rb"
+- "./spec/features/merge_request/user_clicks_merge_request_tabs_spec.rb"
+- "./spec/features/merge_request/user_comments_on_commit_spec.rb"
+- "./spec/features/merge_request/user_comments_on_diff_spec.rb"
+- "./spec/features/merge_request/user_comments_on_merge_request_spec.rb"
+- "./spec/features/merge_request/user_creates_image_diff_notes_spec.rb"
+- "./spec/features/merge_request/user_creates_merge_request_spec.rb"
+- "./spec/features/merge_request/user_creates_mr_spec.rb"
+- "./spec/features/merge_request/user_customizes_merge_commit_message_spec.rb"
+- "./spec/features/merge_request/user_edits_assignees_sidebar_spec.rb"
+- "./spec/features/merge_request/user_edits_merge_request_spec.rb"
+- "./spec/features/merge_request/user_edits_mr_spec.rb"
+- "./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_invites_from_a_comment_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"
+- "./spec/features/merge_request/user_merges_immediately_spec.rb"
+- "./spec/features/merge_request/user_merges_merge_request_spec.rb"
+- "./spec/features/merge_request/user_merges_only_if_pipeline_succeeds_spec.rb"
+- "./spec/features/merge_request/user_merges_when_pipeline_succeeds_spec.rb"
+- "./spec/features/merge_request/user_posts_diff_notes_spec.rb"
+- "./spec/features/merge_request/user_posts_notes_spec.rb"
+- "./spec/features/merge_request/user_rebases_merge_request_spec.rb"
+- "./spec/features/merge_request/user_resolves_conflicts_spec.rb"
+- "./spec/features/merge_request/user_resolves_diff_notes_and_discussions_resolve_spec.rb"
+- "./spec/features/merge_request/user_resolves_outdated_diff_discussions_spec.rb"
+- "./spec/features/merge_request/user_resolves_wip_mr_spec.rb"
+- "./spec/features/merge_request/user_reverts_merge_request_spec.rb"
+- "./spec/features/merge_request/user_reviews_image_spec.rb"
+- "./spec/features/merge_request/user_scrolls_to_note_on_load_spec.rb"
+- "./spec/features/merge_request/user_sees_avatar_on_diff_notes_spec.rb"
+- "./spec/features/merge_request/user_sees_check_out_branch_modal_spec.rb"
+- "./spec/features/merge_request/user_sees_cherry_pick_modal_spec.rb"
+- "./spec/features/merge_request/user_sees_closing_issues_message_spec.rb"
+- "./spec/features/merge_request/user_sees_deleted_target_branch_spec.rb"
+- "./spec/features/merge_request/user_sees_deployment_widget_spec.rb"
+- "./spec/features/merge_request/user_sees_diff_spec.rb"
+- "./spec/features/merge_request/user_sees_discussions_spec.rb"
+- "./spec/features/merge_request/user_sees_merge_button_depending_on_unresolved_discussions_spec.rb"
+- "./spec/features/merge_request/user_sees_merge_request_pipelines_spec.rb"
+- "./spec/features/merge_request/user_sees_merge_widget_spec.rb"
+- "./spec/features/merge_request/user_sees_mini_pipeline_graph_spec.rb"
+- "./spec/features/merge_request/user_sees_mr_from_deleted_forked_project_spec.rb"
+- "./spec/features/merge_request/user_sees_mr_with_deleted_source_branch_spec.rb"
+- "./spec/features/merge_request/user_sees_notes_from_forked_project_spec.rb"
+- "./spec/features/merge_request/user_sees_pipelines_from_forked_project_spec.rb"
+- "./spec/features/merge_request/user_sees_pipelines_spec.rb"
+- "./spec/features/merge_request/user_sees_suggest_pipeline_spec.rb"
+- "./spec/features/merge_request/user_sees_system_notes_spec.rb"
+- "./spec/features/merge_request/user_sees_versions_spec.rb"
+- "./spec/features/merge_request/user_selects_branches_for_new_mr_spec.rb"
+- "./spec/features/merge_request/user_squashes_merge_request_spec.rb"
+- "./spec/features/merge_request/user_suggests_changes_on_diff_spec.rb"
+- "./spec/features/merge_request/user_toggles_whitespace_changes_spec.rb"
+- "./spec/features/merge_request/user_uses_quick_actions_spec.rb"
+- "./spec/features/merge_request/user_views_auto_expanding_diff_spec.rb"
+- "./spec/features/merge_request/user_views_diffs_commit_spec.rb"
+- "./spec/features/merge_request/user_views_diffs_file_by_file_spec.rb"
+- "./spec/features/merge_request/user_views_diffs_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"
+- "./spec/features/milestones/user_edits_milestone_spec.rb"
+- "./spec/features/milestones/user_views_milestone_spec.rb"
+- "./spec/features/milestones/user_views_milestones_spec.rb"
+- "./spec/features/nav/top_nav_responsive_spec.rb"
+- "./spec/features/oauth_login_spec.rb"
+- "./spec/features/participants_autocomplete_spec.rb"
+- "./spec/features/populate_new_pipeline_vars_with_params_spec.rb"
+- "./spec/features/profiles/account_spec.rb"
+- "./spec/features/profiles/active_sessions_spec.rb"
+- "./spec/features/profiles/keys_spec.rb"
+- "./spec/features/profiles/oauth_applications_spec.rb"
+- "./spec/features/profile_spec.rb"
+- "./spec/features/profiles/personal_access_tokens_spec.rb"
+- "./spec/features/profiles/user_changes_notified_of_own_activity_spec.rb"
+- "./spec/features/profiles/user_edit_preferences_spec.rb"
+- "./spec/features/profiles/user_edit_profile_spec.rb"
+- "./spec/features/profiles/user_search_settings_spec.rb"
+- "./spec/features/profiles/user_visits_notifications_tab_spec.rb"
+- "./spec/features/profiles/user_visits_profile_preferences_page_spec.rb"
+- "./spec/features/profiles/user_visits_profile_spec.rb"
+- "./spec/features/project_group_variables_spec.rb"
+- "./spec/features/projects/activity/user_sees_activity_spec.rb"
+- "./spec/features/projects/activity/user_sees_design_activity_spec.rb"
+- "./spec/features/projects/activity/user_sees_design_comment_spec.rb"
+- "./spec/features/projects/activity/user_sees_private_activity_spec.rb"
+- "./spec/features/projects/artifacts/file_spec.rb"
+- "./spec/features/projects/artifacts/raw_spec.rb"
+- "./spec/features/projects/artifacts/user_browses_artifacts_spec.rb"
+- "./spec/features/projects/badges/list_spec.rb"
+- "./spec/features/projects/badges/pipeline_badge_spec.rb"
+- "./spec/features/projects/blobs/balsamiq_spec.rb"
+- "./spec/features/projects/blobs/blob_line_permalink_updater_spec.rb"
+- "./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/new_branch_ref_dropdown_spec.rb"
+- "./spec/features/projects/branches_spec.rb"
+- "./spec/features/projects/branches/user_creates_branch_spec.rb"
+- "./spec/features/projects/branches/user_deletes_branch_spec.rb"
+- "./spec/features/projects/branches/user_views_branches_spec.rb"
+- "./spec/features/projects/ci/editor_spec.rb"
+- "./spec/features/projects/clusters/eks_spec.rb"
+- "./spec/features/projects/clusters/gcp_spec.rb"
+- "./spec/features/projects/clusters_spec.rb"
+- "./spec/features/projects/clusters/user_spec.rb"
+- "./spec/features/projects/commit/builds_spec.rb"
+- "./spec/features/projects/commit/cherry_pick_spec.rb"
+- "./spec/features/projects/commit/comments/user_adds_comment_spec.rb"
+- "./spec/features/projects/commit/comments/user_deletes_comments_spec.rb"
+- "./spec/features/projects/commit/comments/user_edits_comments_spec.rb"
+- "./spec/features/projects/commit/diff_notes_spec.rb"
+- "./spec/features/projects/commit/mini_pipeline_graph_spec.rb"
+- "./spec/features/projects/commits/user_browses_commits_spec.rb"
+- "./spec/features/projects/commit/user_comments_on_commit_spec.rb"
+- "./spec/features/projects/commit/user_reverts_commit_spec.rb"
+- "./spec/features/projects/commit/user_views_user_status_on_commit_spec.rb"
+- "./spec/features/projects/compare_spec.rb"
+- "./spec/features/projects/container_registry_spec.rb"
+- "./spec/features/projects/deploy_keys_spec.rb"
+- "./spec/features/projects/diffs/diff_show_spec.rb"
+- "./spec/features/projects/environments/environment_metrics_spec.rb"
+- "./spec/features/projects/environments/environment_spec.rb"
+- "./spec/features/projects/environments/environments_spec.rb"
+- "./spec/features/projects/environments_pod_logs_spec.rb"
+- "./spec/features/projects/feature_flags/user_creates_feature_flag_spec.rb"
+- "./spec/features/projects/feature_flags/user_deletes_feature_flag_spec.rb"
+- "./spec/features/projects/feature_flags/user_sees_feature_flag_list_spec.rb"
+- "./spec/features/projects/feature_flags/user_updates_feature_flag_spec.rb"
+- "./spec/features/projects/feature_flag_user_lists/user_deletes_feature_flag_user_list_spec.rb"
+- "./spec/features/projects/feature_flag_user_lists/user_edits_feature_flag_user_list_spec.rb"
+- "./spec/features/projects/feature_flag_user_lists/user_sees_feature_flag_user_list_details_spec.rb"
+- "./spec/features/projects/features_visibility_spec.rb"
+- "./spec/features/projects/files/dockerfile_dropdown_spec.rb"
+- "./spec/features/projects/files/edit_file_soft_wrap_spec.rb"
+- "./spec/features/projects/files/files_sort_submodules_with_folders_spec.rb"
+- "./spec/features/projects/files/find_file_keyboard_spec.rb"
+- "./spec/features/projects/files/gitignore_dropdown_spec.rb"
+- "./spec/features/projects/files/gitlab_ci_yml_dropdown_spec.rb"
+- "./spec/features/projects/files/project_owner_creates_license_file_spec.rb"
+- "./spec/features/projects/files/project_owner_sees_link_to_create_license_file_in_empty_project_spec.rb"
+- "./spec/features/projects/files/template_selector_menu_spec.rb"
+- "./spec/features/projects/files/template_type_dropdown_spec.rb"
+- "./spec/features/projects/files/undo_template_spec.rb"
+- "./spec/features/projects/files/user_browses_a_tree_with_a_folder_containing_only_a_folder_spec.rb"
+- "./spec/features/projects/files/user_browses_files_spec.rb"
+- "./spec/features/projects/files/user_browses_lfs_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_find_file_spec.rb"
+- "./spec/features/projects/files/user_reads_pipeline_status_spec.rb"
+- "./spec/features/projects/files/user_replaces_files_spec.rb"
+- "./spec/features/projects/files/user_uploads_files_spec.rb"
+- "./spec/features/projects/fork_spec.rb"
+- "./spec/features/projects/gfm_autocomplete_load_spec.rb"
+- "./spec/features/projects/graph_spec.rb"
+- "./spec/features/projects/import_export/export_file_spec.rb"
+- "./spec/features/projects/import_export/import_file_spec.rb"
+- "./spec/features/projects/infrastructure_registry_spec.rb"
+- "./spec/features/projects/integrations/user_activates_asana_spec.rb"
+- "./spec/features/projects/integrations/user_activates_assembla_spec.rb"
+- "./spec/features/projects/integrations/user_activates_atlassian_bamboo_ci_spec.rb"
+- "./spec/features/projects/integrations/user_activates_flowdock_spec.rb"
+- "./spec/features/projects/integrations/user_activates_jira_spec.rb"
+- "./spec/features/projects/integrations/user_activates_pivotaltracker_spec.rb"
+- "./spec/features/projects/integrations/user_uses_inherited_settings_spec.rb"
+- "./spec/features/projects/issuable_templates_spec.rb"
+- "./spec/features/projects/issues/design_management/user_paginates_designs_spec.rb"
+- "./spec/features/projects/issues/design_management/user_permissions_upload_spec.rb"
+- "./spec/features/projects/issues/design_management/user_uploads_designs_spec.rb"
+- "./spec/features/projects/issues/design_management/user_views_design_spec.rb"
+- "./spec/features/projects/issues/design_management/user_views_designs_spec.rb"
+- "./spec/features/projects/issues/design_management/user_views_designs_with_svg_xss_spec.rb"
+- "./spec/features/projects/issues/email_participants_spec.rb"
+- "./spec/features/projects/jobs/permissions_spec.rb"
+- "./spec/features/projects/jobs_spec.rb"
+- "./spec/features/projects/jobs/user_browses_job_spec.rb"
+- "./spec/features/projects/jobs/user_browses_jobs_spec.rb"
+- "./spec/features/projects/labels/issues_sorted_by_priority_spec.rb"
+- "./spec/features/projects/labels/search_labels_spec.rb"
+- "./spec/features/projects/labels/sort_labels_spec.rb"
+- "./spec/features/projects/labels/subscription_spec.rb"
+- "./spec/features/projects/labels/update_prioritization_spec.rb"
+- "./spec/features/projects/labels/user_removes_labels_spec.rb"
+- "./spec/features/projects/members/anonymous_user_sees_members_spec.rb"
+- "./spec/features/projects/members/group_member_cannot_leave_group_project_spec.rb"
+- "./spec/features/projects/members/group_members_spec.rb"
+- "./spec/features/projects/members/group_requester_cannot_request_access_to_project_spec.rb"
+- "./spec/features/projects/members/groups_with_access_list_spec.rb"
+- "./spec/features/projects/members/invite_group_spec.rb"
+- "./spec/features/projects/members/list_spec.rb"
+- "./spec/features/projects/members/master_adds_member_with_expiration_date_spec.rb"
+- "./spec/features/projects/members/master_manages_access_requests_spec.rb"
+- "./spec/features/projects/members/sorting_spec.rb"
+- "./spec/features/projects/members/tabs_spec.rb"
+- "./spec/features/projects/members/user_requests_access_spec.rb"
+- "./spec/features/projects/merge_request_button_spec.rb"
+- "./spec/features/projects/milestones/gfm_autocomplete_spec.rb"
+- "./spec/features/projects/milestones/milestones_sorting_spec.rb"
+- "./spec/features/projects/milestones/new_spec.rb"
+- "./spec/features/projects/milestones/user_interacts_with_labels_spec.rb"
+- "./spec/features/projects/network_graph_spec.rb"
+- "./spec/features/projects/new_project_from_template_spec.rb"
+- "./spec/features/projects/new_project_spec.rb"
+- "./spec/features/projects/packages_spec.rb"
+- "./spec/features/projects/pages/user_adds_domain_spec.rb"
+- "./spec/features/projects/pages/user_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/pipeline_spec.rb"
+- "./spec/features/projects/pipelines/pipelines_spec.rb"
+- "./spec/features/projects/product_analytics/graphs_spec.rb"
+- "./spec/features/projects/releases/user_creates_release_spec.rb"
+- "./spec/features/projects/releases/user_views_edit_release_spec.rb"
+- "./spec/features/projects/releases/user_views_release_spec.rb"
+- "./spec/features/projects/releases/user_views_releases_spec.rb"
+- "./spec/features/projects/remote_mirror_spec.rb"
+- "./spec/features/projects/serverless/functions_spec.rb"
+- "./spec/features/projects/services/disable_triggers_spec.rb"
+- "./spec/features/projects/services/prometheus_external_alerts_spec.rb"
+- "./spec/features/projects/services/user_activates_emails_on_push_spec.rb"
+- "./spec/features/projects/services/user_activates_irker_spec.rb"
+- "./spec/features/projects/services/user_activates_issue_tracker_spec.rb"
+- "./spec/features/projects/services/user_activates_jetbrains_teamcity_ci_spec.rb"
+- "./spec/features/projects/services/user_activates_mattermost_slash_command_spec.rb"
+- "./spec/features/projects/services/user_activates_packagist_spec.rb"
+- "./spec/features/projects/services/user_activates_prometheus_spec.rb"
+- "./spec/features/projects/services/user_activates_pushover_spec.rb"
+- "./spec/features/projects/services/user_activates_slack_notifications_spec.rb"
+- "./spec/features/projects/services/user_activates_slack_slash_command_spec.rb"
+- "./spec/features/projects/services/user_views_services_spec.rb"
+- "./spec/features/projects/settings/access_tokens_spec.rb"
+- "./spec/features/projects/settings/lfs_settings_spec.rb"
+- "./spec/features/projects/settings/monitor_settings_spec.rb"
+- "./spec/features/projects/settings/packages_settings_spec.rb"
+- "./spec/features/projects/settings/project_badges_spec.rb"
+- "./spec/features/projects/settings/project_settings_spec.rb"
+- "./spec/features/projects/settings/registry_settings_spec.rb"
+- "./spec/features/projects/settings/repository_settings_spec.rb"
+- "./spec/features/projects/settings/service_desk_setting_spec.rb"
+- "./spec/features/projects/settings/user_changes_default_branch_spec.rb"
+- "./spec/features/projects/settings/user_interacts_with_deploy_keys_spec.rb"
+- "./spec/features/projects/settings/user_manages_merge_requests_settings_spec.rb"
+- "./spec/features/projects/settings/user_manages_project_members_spec.rb"
+- "./spec/features/projects/settings/user_searches_in_settings_spec.rb"
+- "./spec/features/projects/settings/user_sees_revoke_deploy_token_modal_spec.rb"
+- "./spec/features/projects/settings/user_tags_project_spec.rb"
+- "./spec/features/projects/settings/user_transfers_a_project_spec.rb"
+- "./spec/features/projects/settings/visibility_settings_spec.rb"
+- "./spec/features/projects/settings/webhooks_settings_spec.rb"
+- "./spec/features/projects/show/schema_markup_spec.rb"
+- "./spec/features/projects/show/user_interacts_with_auto_devops_banner_spec.rb"
+- "./spec/features/projects/show/user_interacts_with_stars_spec.rb"
+- "./spec/features/projects/show/user_manages_notifications_spec.rb"
+- "./spec/features/projects/show/user_sees_collaboration_links_spec.rb"
+- "./spec/features/projects/show/user_sees_last_commit_ci_status_spec.rb"
+- "./spec/features/projects/show/user_sees_readme_spec.rb"
+- "./spec/features/projects/show/user_uploads_files_spec.rb"
+- "./spec/features/projects/snippets/create_snippet_spec.rb"
+- "./spec/features/projects/snippets/show_spec.rb"
+- "./spec/features/projects/snippets/user_comments_on_snippet_spec.rb"
+- "./spec/features/projects/snippets/user_deletes_snippet_spec.rb"
+- "./spec/features/projects/snippets/user_updates_snippet_spec.rb"
+- "./spec/features/projects_spec.rb"
+- "./spec/features/projects/sub_group_issuables_spec.rb"
+- "./spec/features/projects/tags/user_edits_tags_spec.rb"
+- "./spec/features/projects/terraform_spec.rb"
+- "./spec/features/projects/tree/create_directory_spec.rb"
+- "./spec/features/projects/tree/create_file_spec.rb"
+- "./spec/features/projects/tree/tree_show_spec.rb"
+- "./spec/features/projects/tree/upload_file_spec.rb"
+- "./spec/features/projects/user_changes_project_visibility_spec.rb"
+- "./spec/features/projects/user_creates_project_spec.rb"
+- "./spec/features/projects/user_sees_sidebar_spec.rb"
+- "./spec/features/projects/user_sees_user_popover_spec.rb"
+- "./spec/features/projects/user_uses_shortcuts_spec.rb"
+- "./spec/features/projects/user_views_empty_project_spec.rb"
+- "./spec/features/projects/view_on_env_spec.rb"
+- "./spec/features/projects/wikis_spec.rb"
+- "./spec/features/projects/wiki/user_views_wiki_empty_spec.rb"
+- "./spec/features/project_variables_spec.rb"
+- "./spec/features/promotion_spec.rb"
+- "./spec/features/protected_branches_spec.rb"
+- "./spec/features/protected_tags_spec.rb"
+- "./spec/features/reportable_note/commit_spec.rb"
+- "./spec/features/reportable_note/issue_spec.rb"
+- "./spec/features/reportable_note/merge_request_spec.rb"
+- "./spec/features/reportable_note/snippets_spec.rb"
+- "./spec/features/runners_spec.rb"
+- "./spec/features/search/user_searches_for_code_spec.rb"
+- "./spec/features/search/user_searches_for_commits_spec.rb"
+- "./spec/features/search/user_searches_for_issues_spec.rb"
+- "./spec/features/search/user_searches_for_merge_requests_spec.rb"
+- "./spec/features/search/user_searches_for_milestones_spec.rb"
+- "./spec/features/search/user_searches_for_projects_spec.rb"
+- "./spec/features/search/user_searches_for_users_spec.rb"
+- "./spec/features/search/user_searches_for_wiki_pages_spec.rb"
+- "./spec/features/search/user_uses_header_search_field_spec.rb"
+- "./spec/features/search/user_uses_search_filters_spec.rb"
+- "./spec/features/signed_commits_spec.rb"
+- "./spec/features/snippets/embedded_snippet_spec.rb"
+- "./spec/features/snippets/internal_snippet_spec.rb"
+- "./spec/features/snippets/notes_on_personal_snippets_spec.rb"
+- "./spec/features/snippets/private_snippets_spec.rb"
+- "./spec/features/snippets/public_snippets_spec.rb"
+- "./spec/features/snippets/show_spec.rb"
+- "./spec/features/snippets/user_creates_snippet_spec.rb"
+- "./spec/features/snippets/user_deletes_snippet_spec.rb"
+- "./spec/features/snippets/user_edits_snippet_spec.rb"
+- "./spec/features/tags/developer_creates_tag_spec.rb"
+- "./spec/features/tags/developer_deletes_tag_spec.rb"
+- "./spec/features/tags/developer_updates_tag_spec.rb"
+- "./spec/features/task_lists_spec.rb"
+- "./spec/features/triggers_spec.rb"
+- "./spec/features/u2f_spec.rb"
+- "./spec/features/uploads/user_uploads_avatar_to_profile_spec.rb"
+- "./spec/features/uploads/user_uploads_file_to_note_spec.rb"
+- "./spec/features/user_can_display_performance_bar_spec.rb"
+- "./spec/features/user_opens_link_to_comment_spec.rb"
+- "./spec/features/user_sees_revert_modal_spec.rb"
+- "./spec/features/users/login_spec.rb"
+- "./spec/features/users/logout_spec.rb"
+- "./spec/features/users/overview_spec.rb"
+- "./spec/features/users/signup_spec.rb"
+- "./spec/features/users/snippets_spec.rb"
+- "./spec/features/users/terms_spec.rb"
+- "./spec/features/users/user_browses_projects_on_user_page_spec.rb"
+- "./spec/features/webauthn_spec.rb"
+- "./spec/features/whats_new_spec.rb"
+- "./spec/finders/ci/pipeline_schedules_finder_spec.rb"
+- "./spec/finders/ci/pipelines_finder_spec.rb"
+- "./spec/finders/ci/pipelines_for_merge_request_finder_spec.rb"
+- "./spec/finders/projects_finder_spec.rb"
+- "./spec/finders/releases/evidence_pipeline_finder_spec.rb"
+- "./spec/frontend/fixtures/analytics.rb"
+- "./spec/frontend/fixtures/jobs.rb"
+- "./spec/frontend/fixtures/pipeline_schedules.rb"
+- "./spec/frontend/fixtures/pipelines.rb"
+- "./spec/graphql/mutations/design_management/upload_spec.rb"
+- "./spec/graphql/mutations/merge_requests/accept_spec.rb"
+- "./spec/graphql/resolvers/ci/test_report_summary_resolver_spec.rb"
+- "./spec/helpers/issuables_helper_spec.rb"
+- "./spec/initializers/active_record_locking_spec.rb"
+- "./spec/initializers/database_config_spec.rb"
+- "./spec/lib/gitlab/auth_spec.rb"
+- "./spec/lib/gitlab/ci/badge/pipeline/status_spec.rb"
+- "./spec/lib/gitlab/ci/build/policy/changes_spec.rb"
+- "./spec/lib/gitlab/ci/charts_spec.rb"
+- "./spec/lib/gitlab/ci/config_spec.rb"
+- "./spec/lib/gitlab/ci/pipeline/chain/create_spec.rb"
+- "./spec/lib/gitlab/ci/pipeline/chain/seed_block_spec.rb"
+- "./spec/lib/gitlab/ci/pipeline/seed/build_spec.rb"
+- "./spec/lib/gitlab/ci/pipeline/seed/stage_spec.rb"
+- "./spec/lib/gitlab/ci/status/stage/common_spec.rb"
+- "./spec/lib/gitlab/ci/status/stage/factory_spec.rb"
+- "./spec/lib/gitlab/ci/status/stage/play_manual_spec.rb"
+- "./spec/lib/gitlab/ci/templates/5_minute_production_app_ci_yaml_spec.rb"
+- "./spec/lib/gitlab/ci/templates/auto_devops_gitlab_ci_yaml_spec.rb"
+- "./spec/lib/gitlab/ci/templates/AWS/deploy_ecs_gitlab_ci_yaml_spec.rb"
+- "./spec/lib/gitlab/ci/templates/Jobs/deploy_gitlab_ci_yaml_spec.rb"
+- "./spec/lib/gitlab/ci/templates/managed_cluster_applications_gitlab_ci_yaml_spec.rb"
+- "./spec/lib/gitlab/database/bulk_update_spec.rb"
+- "./spec/lib/gitlab/database/connection_spec.rb"
+- "./spec/lib/gitlab/database/load_balancing/host_spec.rb"
+- "./spec/lib/gitlab/database/load_balancing_spec.rb"
+- "./spec/lib/gitlab/database/postgresql_adapter/force_disconnectable_mixin_spec.rb"
+- "./spec/lib/gitlab/database/postgresql_adapter/type_map_cache_spec.rb"
+- "./spec/lib/gitlab/database/schema_migrations/context_spec.rb"
+- "./spec/lib/gitlab/database/with_lock_retries_outside_transaction_spec.rb"
+- "./spec/lib/gitlab/database/with_lock_retries_spec.rb"
+- "./spec/lib/gitlab/data_builder/pipeline_spec.rb"
+- "./spec/lib/gitlab/email/handler/create_issue_handler_spec.rb"
+- "./spec/lib/gitlab/email/handler/create_merge_request_handler_spec.rb"
+- "./spec/lib/gitlab/email/handler/create_note_handler_spec.rb"
+- "./spec/lib/gitlab/email/handler/create_note_on_issuable_handler_spec.rb"
+- "./spec/lib/gitlab/email/handler/unsubscribe_handler_spec.rb"
+- "./spec/lib/gitlab/usage_data_spec.rb"
+- "./spec/lib/peek/views/active_record_spec.rb"
+- "./spec/mailers/emails/pipelines_spec.rb"
+- "./spec/migrations/20210205174154_remove_bad_dependency_proxy_manifests_spec.rb"
+- "./spec/migrations/20210722150102_operations_feature_flags_correct_flexible_rollout_values_spec.rb"
+- "./spec/migrations/backfill_escalation_policies_for_oncall_schedules_spec.rb"
+- "./spec/migrations/insert_ci_daily_pipeline_schedule_triggers_plan_limits_spec.rb"
+- "./spec/migrations/remove_duplicate_dast_site_tokens_with_same_token_spec.rb"
+- "./spec/models/ci/bridge_spec.rb"
+- "./spec/models/ci/build_need_spec.rb"
+- "./spec/models/ci/build_spec.rb"
+- "./spec/models/ci/build_trace_chunk_spec.rb"
+- "./spec/models/ci/commit_with_pipeline_spec.rb"
+- "./spec/models/ci/group_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_variable_spec.rb"
+- "./spec/models/ci/legacy_stage_spec.rb"
+- "./spec/models/ci/pipeline_schedule_spec.rb"
+- "./spec/models/ci/pipeline_spec.rb"
+- "./spec/models/ci/runner_namespace_spec.rb"
+- "./spec/models/ci/runner_project_spec.rb"
+- "./spec/models/ci/runner_spec.rb"
+- "./spec/models/ci/running_build_spec.rb"
+- "./spec/models/ci/stage_spec.rb"
+- "./spec/models/ci/variable_spec.rb"
+- "./spec/models/clusters/applications/jupyter_spec.rb"
+- "./spec/models/clusters/applications/runner_spec.rb"
+- "./spec/models/commit_collection_spec.rb"
+- "./spec/models/commit_status_spec.rb"
+- "./spec/models/concerns/batch_destroy_dependent_associations_spec.rb"
+- "./spec/models/concerns/bulk_insertable_associations_spec.rb"
+- "./spec/models/concerns/cron_schedulable_spec.rb"
+- "./spec/models/concerns/has_environment_scope_spec.rb"
+- "./spec/models/concerns/schedulable_spec.rb"
+- "./spec/models/concerns/token_authenticatable_spec.rb"
+- "./spec/models/design_management/version_spec.rb"
+- "./spec/models/environment_status_spec.rb"
+- "./spec/models/hooks/system_hook_spec.rb"
+- "./spec/models/issue_spec.rb"
+- "./spec/models/members/project_member_spec.rb"
+- "./spec/models/merge_request_spec.rb"
+- "./spec/models/plan_spec.rb"
+- "./spec/models/project_feature_usage_spec.rb"
+- "./spec/models/project_spec.rb"
+- "./spec/models/spam_log_spec.rb"
+- "./spec/models/user_spec.rb"
+- "./spec/models/user_status_spec.rb"
+- "./spec/policies/ci/build_policy_spec.rb"
+- "./spec/policies/ci/pipeline_policy_spec.rb"
+- "./spec/presenters/ci/stage_presenter_spec.rb"
+- "./spec/requests/api/admin/ci/variables_spec.rb"
+- "./spec/requests/api/admin/plan_limits_spec.rb"
+- "./spec/requests/api/ci/jobs_spec.rb"
+- "./spec/requests/api/ci/pipeline_schedules_spec.rb"
+- "./spec/requests/api/ci/pipelines_spec.rb"
+- "./spec/requests/api/ci/runner/runners_post_spec.rb"
+- "./spec/requests/api/ci/runners_spec.rb"
+- "./spec/requests/api/commits_spec.rb"
+- "./spec/requests/api/commit_statuses_spec.rb"
+- "./spec/requests/api/graphql/ci/runner_spec.rb"
+- "./spec/requests/api/graphql/mutations/ci/pipeline_destroy_spec.rb"
+- "./spec/requests/api/graphql/project/issues_spec.rb"
+- "./spec/requests/api/graphql/project/merge_request_spec.rb"
+- "./spec/requests/api/graphql/project_query_spec.rb"
+- "./spec/requests/api/issues/issues_spec.rb"
+- "./spec/requests/api/merge_requests_spec.rb"
+- "./spec/requests/api/projects_spec.rb"
+- "./spec/requests/api/resource_access_tokens_spec.rb"
+- "./spec/requests/api/users_spec.rb"
+- "./spec/requests/lfs_http_spec.rb"
+- "./spec/requests/projects/cycle_analytics_events_spec.rb"
+- "./spec/serializers/ci/downloadable_artifact_entity_spec.rb"
+- "./spec/serializers/ci/downloadable_artifact_serializer_spec.rb"
+- "./spec/serializers/ci/pipeline_entity_spec.rb"
+- "./spec/serializers/merge_request_poll_cached_widget_entity_spec.rb"
+- "./spec/serializers/merge_request_poll_widget_entity_spec.rb"
+- "./spec/serializers/merge_request_widget_entity_spec.rb"
+- "./spec/serializers/pipeline_details_entity_spec.rb"
+- "./spec/serializers/pipeline_serializer_spec.rb"
+- "./spec/serializers/stage_entity_spec.rb"
+- "./spec/serializers/stage_serializer_spec.rb"
+- "./spec/serializers/test_report_entity_spec.rb"
+- "./spec/serializers/test_report_summary_entity_spec.rb"
+- "./spec/serializers/test_suite_entity_spec.rb"
+- "./spec/serializers/test_suite_summary_entity_spec.rb"
+- "./spec/services/auto_merge/merge_when_pipeline_succeeds_service_spec.rb"
+- "./spec/services/ci/compare_accessibility_reports_service_spec.rb"
+- "./spec/services/ci/compare_codequality_reports_service_spec.rb"
+- "./spec/services/ci/compare_reports_base_service_spec.rb"
+- "./spec/services/ci/compare_test_reports_service_spec.rb"
+- "./spec/services/ci/create_pipeline_service/environment_spec.rb"
+- "./spec/services/ci/create_pipeline_service_spec.rb"
+- "./spec/services/ci/destroy_pipeline_service_spec.rb"
+- "./spec/services/ci/disable_user_pipeline_schedules_service_spec.rb"
+- "./spec/services/ci/ensure_stage_service_spec.rb"
+- "./spec/services/ci/expire_pipeline_cache_service_spec.rb"
+- "./spec/services/ci/generate_codequality_mr_diff_report_service_spec.rb"
+- "./spec/services/ci/generate_coverage_reports_service_spec.rb"
+- "./spec/services/ci/job_artifacts/destroy_all_expired_service_spec.rb"
+- "./spec/services/ci/job_artifacts/destroy_associations_service_spec.rb"
+- "./spec/services/ci/job_artifacts/destroy_batch_service_spec.rb"
+- "./spec/services/ci/pipeline_artifacts/coverage_report_service_spec.rb"
+- "./spec/services/ci/pipeline_artifacts/create_code_quality_mr_diff_report_service_spec.rb"
+- "./spec/services/ci/pipeline_bridge_status_service_spec.rb"
+- "./spec/services/ci/pipeline_processing/shared_processing_service.rb"
+- "./spec/services/ci/pipelines/add_job_service_spec.rb"
+- "./spec/services/ci/pipeline_schedule_service_spec.rb"
+- "./spec/services/ci/pipeline_trigger_service_spec.rb"
+- "./spec/services/ci/register_job_service_spec.rb"
+- "./spec/services/ci/retry_build_service_spec.rb"
+- "./spec/services/ci/test_failure_history_service_spec.rb"
+- "./spec/services/ci/update_instance_variables_service_spec.rb"
+- "./spec/services/deployments/update_environment_service_spec.rb"
+- "./spec/services/design_management/save_designs_service_spec.rb"
+- "./spec/services/environments/stop_service_spec.rb"
+- "./spec/services/groups/transfer_service_spec.rb"
+- "./spec/services/integrations/test/project_service_spec.rb"
+- "./spec/services/issuable/destroy_service_spec.rb"
+- "./spec/services/issue_links/list_service_spec.rb"
+- "./spec/services/merge_requests/add_todo_when_build_fails_service_spec.rb"
+- "./spec/services/merge_requests/mergeability_check_service_spec.rb"
+- "./spec/services/merge_requests/post_merge_service_spec.rb"
+- "./spec/services/merge_requests/refresh_service_spec.rb"
+- "./spec/services/pages/migrate_from_legacy_storage_service_spec.rb"
+- "./spec/services/projects/destroy_service_spec.rb"
+- "./spec/services/projects/transfer_service_spec.rb"
+- "./spec/services/projects/update_service_spec.rb"
+- "./spec/services/releases/create_service_spec.rb"
+- "./spec/services/resource_access_tokens/revoke_service_spec.rb"
+- "./spec/services/todo_service_spec.rb"
+- "./spec/services/users/activity_service_spec.rb"
+- "./spec/services/users/destroy_service_spec.rb"
+- "./spec/services/users/reject_service_spec.rb"
+- "./spec/support/shared_contexts/email_shared_context.rb"
+- "./spec/support/shared_examples/controllers/access_tokens_controller_shared_examples.rb"
+- "./spec/support/shared_examples/features/master_manages_access_requests_shared_example.rb"
+- "./spec/support/shared_examples/integrations/test_examples.rb"
+- "./spec/support/shared_examples/models/atomic_internal_id_shared_examples.rb"
+- "./spec/support/shared_examples/models/cluster_application_status_shared_examples.rb"
+- "./spec/support/shared_examples/models/cluster_application_version_shared_examples.rb"
+- "./spec/support/shared_examples/models/concerns/cron_schedulable_shared_examples.rb"
+- "./spec/support/shared_examples/models/concerns/limitable_shared_examples.rb"
+- "./spec/support/shared_examples/models/update_highest_role_shared_examples.rb"
+- "./spec/support/shared_examples/models/update_project_statistics_shared_examples.rb"
+- "./spec/support/shared_examples/models/with_uploads_shared_examples.rb"
+- "./spec/support/shared_examples/requests/api/status_shared_examples.rb"
+- "./spec/support/shared_examples/requests/lfs_http_shared_examples.rb"
+- "./spec/support/shared_examples/services/destroy_label_links_shared_examples.rb"
+- "./spec/support/shared_examples/services/issuable/destroy_service_shared_examples.rb"
+- "./spec/support/shared_examples/services/notification_service_shared_examples.rb"
+- "./spec/support/shared_examples/services/wiki_pages/create_service_shared_examples.rb"
+- "./spec/support/shared_examples/services/wiki_pages/destroy_service_shared_examples.rb"
+- "./spec/support/shared_examples/services/wiki_pages/update_service_shared_examples.rb"
+- "./spec/support/shared_examples/workers/idempotency_shared_examples.rb"
+- "./spec/views/projects/artifacts/_artifact.html.haml_spec.rb"
+- "./spec/views/projects/commits/_commit.html.haml_spec.rb"
+- "./spec/views/projects/jobs/_build.html.haml_spec.rb"
+- "./spec/views/projects/jobs/_generic_commit_status.html.haml_spec.rb"
+- "./spec/views/projects/merge_requests/creations/_new_submit.html.haml_spec.rb"
+- "./spec/views/projects/pipeline_schedules/_pipeline_schedule.html.haml_spec.rb"
+- "./spec/views/shared/runners/_runner_details.html.haml_spec.rb"
+- "./spec/workers/authorized_project_update/user_refresh_from_replica_worker_spec.rb"
+- "./spec/workers/ci/pipeline_artifacts/create_quality_report_worker_spec.rb"
+- "./spec/workers/container_expiration_policy_worker_spec.rb"
+- "./spec/workers/merge_requests/create_pipeline_worker_spec.rb"
+- "./spec/workers/pipeline_metrics_worker_spec.rb"
+- "./spec/workers/pipeline_schedule_worker_spec.rb"
+- "./spec/workers/releases/create_evidence_worker_spec.rb"
+- "./spec/workers/remove_expired_members_worker_spec.rb"
+- "./spec/workers/repository_cleanup_worker_spec.rb"
+- "./spec/workers/stage_update_worker_spec.rb"
+- "./spec/workers/stuck_merge_jobs_worker_spec.rb"
+- "./ee/spec/requests/api/graphql/project/pipelines/dast_profile_spec.rb"
+- "./spec/services/projects/overwrite_project_service_spec.rb"
diff --git a/spec/support/database/cross-join-allowlist.yml b/spec/support/database/cross-join-allowlist.yml
index 45e95cf3262..c209d275fc8 100644
--- a/spec/support/database/cross-join-allowlist.yml
+++ b/spec/support/database/cross-join-allowlist.yml
@@ -1,197 +1,58 @@
-- "./ee/spec/controllers/operations_controller_spec.rb"
-- "./ee/spec/controllers/projects/issues_controller_spec.rb"
-- "./ee/spec/controllers/projects/security/vulnerabilities_controller_spec.rb"
- "./ee/spec/features/ci/ci_minutes_spec.rb"
-- "./ee/spec/features/merge_request/user_merges_immediately_spec.rb"
-- "./ee/spec/features/merge_request/user_sees_merge_widget_spec.rb"
- "./ee/spec/features/merge_trains/two_merge_requests_on_train_spec.rb"
- "./ee/spec/features/merge_trains/user_adds_merge_request_to_merge_train_spec.rb"
-- "./ee/spec/features/merge_trains/user_adds_to_merge_train_when_pipeline_succeeds_spec.rb"
-- "./ee/spec/features/projects/pipelines/pipeline_spec.rb"
-- "./ee/spec/features/projects/settings/auto_rollback_spec.rb"
-- "./ee/spec/features/projects/settings/pipeline_subscriptions_spec.rb"
-- "./ee/spec/features/projects/settings/protected_environments_spec.rb"
- "./ee/spec/finders/ee/namespaces/projects_finder_spec.rb"
-- "./ee/spec/finders/group_projects_finder_spec.rb"
-- "./ee/spec/finders/security/findings_finder_spec.rb"
- "./ee/spec/graphql/ee/resolvers/namespace_projects_resolver_spec.rb"
-- "./ee/spec/lib/analytics/devops_adoption/snapshot_calculator_spec.rb"
-- "./ee/spec/lib/ee/gitlab/background_migration/migrate_approver_to_approval_rules_spec.rb"
-- "./ee/spec/lib/ee/gitlab/background_migration/migrate_security_scans_spec.rb"
-- "./ee/spec/lib/ee/gitlab/background_migration/populate_latest_pipeline_ids_spec.rb"
-- "./ee/spec/lib/ee/gitlab/background_migration/populate_resolved_on_default_branch_column_spec.rb"
-- "./ee/spec/lib/ee/gitlab/background_migration/populate_uuids_for_security_findings_spec.rb"
-- "./ee/spec/lib/ee/gitlab/background_migration/populate_vulnerability_feedback_pipeline_id_spec.rb"
-- "./ee/spec/lib/ee/gitlab/usage_data_spec.rb"
-- "./ee/spec/migrations/schedule_populate_resolved_on_default_branch_column_spec.rb"
-- "./ee/spec/models/ci/build_spec.rb"
- "./ee/spec/models/ci/minutes/project_monthly_usage_spec.rb"
-- "./ee/spec/models/ci/pipeline_spec.rb"
-- "./ee/spec/models/ee/vulnerability_spec.rb"
-- "./ee/spec/models/merge_request_spec.rb"
- "./ee/spec/models/project_spec.rb"
- "./ee/spec/models/security/finding_spec.rb"
- "./ee/spec/models/security/scan_spec.rb"
-- "./ee/spec/presenters/ci/pipeline_presenter_spec.rb"
- "./ee/spec/requests/api/ci/minutes_spec.rb"
- "./ee/spec/requests/api/graphql/ci/minutes/usage_spec.rb"
-- "./ee/spec/requests/api/graphql/mutations/environments/canary_ingress/update_spec.rb"
-- "./ee/spec/requests/api/graphql/mutations/vulnerabilities/create_external_issue_link_spec.rb"
-- "./ee/spec/requests/api/graphql/project/pipeline/security_report_summary_spec.rb"
-- "./ee/spec/requests/api/graphql/vulnerabilities/location_spec.rb"
-- "./ee/spec/requests/api/groups_spec.rb"
- "./ee/spec/requests/api/namespaces_spec.rb"
-- "./ee/spec/requests/api/vulnerability_findings_spec.rb"
-- "./ee/spec/serializers/dashboard_environment_entity_spec.rb"
-- "./ee/spec/serializers/dashboard_environments_serializer_spec.rb"
-- "./ee/spec/services/auto_merge/add_to_merge_train_when_pipeline_succeeds_service_spec.rb"
-- "./ee/spec/services/ci/create_pipeline_service/runnable_builds_spec.rb"
- "./ee/spec/services/ci/minutes/additional_packs/change_namespace_service_spec.rb"
- "./ee/spec/services/ci/minutes/additional_packs/create_service_spec.rb"
- "./ee/spec/services/ci/minutes/refresh_cached_data_service_spec.rb"
-- "./ee/spec/services/ci/process_pipeline_service_spec.rb"
-- "./ee/spec/services/ci/trigger_downstream_subscription_service_spec.rb"
-- "./ee/spec/services/clear_namespace_shared_runners_minutes_service_spec.rb"
-- "./ee/spec/services/deployments/auto_rollback_service_spec.rb"
-- "./ee/spec/services/ee/ci/job_artifacts/destroy_all_expired_service_spec.rb"
-- "./ee/spec/services/ee/ci/job_artifacts/destroy_batch_service_spec.rb"
-- "./ee/spec/services/ee/issues/build_from_vulnerability_service_spec.rb"
-- "./ee/spec/services/ee/merge_requests/create_pipeline_service_spec.rb"
-- "./ee/spec/services/ee/merge_requests/refresh_service_spec.rb"
-- "./ee/spec/services/security/report_summary_service_spec.rb"
-- "./ee/spec/services/security/vulnerability_counting_service_spec.rb"
-- "./ee/spec/workers/scan_security_report_secrets_worker_spec.rb"
-- "./ee/spec/workers/security/store_scans_worker_spec.rb"
- "./spec/controllers/admin/runners_controller_spec.rb"
-- "./spec/controllers/groups/runners_controller_spec.rb"
- "./spec/controllers/groups/settings/ci_cd_controller_spec.rb"
-- "./spec/controllers/projects/logs_controller_spec.rb"
-- "./spec/controllers/projects/merge_requests_controller_spec.rb"
-- "./spec/controllers/projects/runners_controller_spec.rb"
-- "./spec/controllers/projects/serverless/functions_controller_spec.rb"
- "./spec/controllers/projects/settings/ci_cd_controller_spec.rb"
- "./spec/features/admin/admin_runners_spec.rb"
-- "./spec/features/groups/settings/ci_cd_spec.rb"
- "./spec/features/ide/user_opens_merge_request_spec.rb"
-- "./spec/features/merge_request/user_merges_immediately_spec.rb"
-- "./spec/features/merge_request/user_merges_only_if_pipeline_succeeds_spec.rb"
-- "./spec/features/merge_request/user_merges_when_pipeline_succeeds_spec.rb"
-- "./spec/features/merge_request/user_resolves_wip_mr_spec.rb"
-- "./spec/features/merge_request/user_sees_deployment_widget_spec.rb"
- "./spec/features/merge_request/user_sees_merge_request_pipelines_spec.rb"
-- "./spec/features/merge_request/user_sees_merge_widget_spec.rb"
-- "./spec/features/merge_request/user_sees_mini_pipeline_graph_spec.rb"
-- "./spec/features/merge_request/user_sees_pipelines_from_forked_project_spec.rb"
-- "./spec/features/merge_request/user_sees_pipelines_spec.rb"
-- "./spec/features/project_group_variables_spec.rb"
-- "./spec/features/project_variables_spec.rb"
-- "./spec/features/projects/badges/list_spec.rb"
-- "./spec/features/projects/environments_pod_logs_spec.rb"
- "./spec/features/projects/infrastructure_registry_spec.rb"
-- "./spec/features/projects/jobs_spec.rb"
-- "./spec/features/projects/package_files_spec.rb"
-- "./spec/features/projects/pipelines/pipeline_spec.rb"
-- "./spec/features/projects/pipelines/pipelines_spec.rb"
-- "./spec/features/projects/serverless/functions_spec.rb"
-- "./spec/features/projects/settings/pipelines_settings_spec.rb"
-- "./spec/features/runners_spec.rb"
-- "./spec/features/security/project/internal_access_spec.rb"
-- "./spec/features/security/project/private_access_spec.rb"
-- "./spec/features/security/project/public_access_spec.rb"
-- "./spec/features/triggers_spec.rb"
-- "./spec/finders/ci/pipelines_finder_spec.rb"
- "./spec/finders/ci/pipelines_for_merge_request_finder_spec.rb"
- "./spec/finders/ci/runners_finder_spec.rb"
-- "./spec/finders/clusters/knative_services_finder_spec.rb"
-- "./spec/finders/projects/serverless/functions_finder_spec.rb"
- "./spec/frontend/fixtures/runner.rb"
-- "./spec/graphql/mutations/ci/runner/delete_spec.rb"
- "./spec/graphql/resolvers/ci/group_runners_resolver_spec.rb"
-- "./spec/graphql/resolvers/ci/job_token_scope_resolver_spec.rb"
-- "./spec/graphql/resolvers/merge_request_pipelines_resolver_spec.rb"
-- "./spec/graphql/types/ci/job_token_scope_type_spec.rb"
-- "./spec/helpers/packages_helper_spec.rb"
- "./spec/lib/api/entities/package_spec.rb"
-- "./spec/lib/gitlab/background_migration/migrate_legacy_artifacts_spec.rb"
-- "./spec/lib/gitlab/prometheus/query_variables_spec.rb"
-- "./spec/mailers/emails/pipelines_spec.rb"
+- "./spec/lib/gitlab/background_migration/copy_ci_builds_columns_to_security_scans_spec.rb"
+- "./spec/lib/gitlab/background_migration/migrate_pages_metadata_spec.rb"
- "./spec/migrations/20210907211557_finalize_ci_builds_bigint_conversion_spec.rb"
-- "./spec/migrations/cleanup_legacy_artifact_migration_spec.rb"
-- "./spec/migrations/migrate_protected_attribute_to_pending_builds_spec.rb"
-- "./spec/migrations/re_schedule_latest_pipeline_id_population_with_all_security_related_artifact_types_spec.rb"
-- "./spec/migrations/schedule_migrate_security_scans_spec.rb"
-- "./spec/models/ci/build_spec.rb"
-- "./spec/models/ci/job_artifact_spec.rb"
-- "./spec/models/ci/job_token/scope_spec.rb"
+- "./spec/migrations/associate_existing_dast_builds_with_variables_spec.rb"
+- "./spec/migrations/schedule_copy_ci_builds_columns_to_security_scans2_spec.rb"
+- "./spec/migrations/schedule_pages_metadata_migration_spec.rb"
- "./spec/models/ci/pipeline_spec.rb"
- "./spec/models/ci/runner_spec.rb"
-- "./spec/models/clusters/applications/runner_spec.rb"
-- "./spec/models/deployment_spec.rb"
-- "./spec/models/environment_spec.rb"
- "./spec/models/merge_request_spec.rb"
- "./spec/models/project_spec.rb"
- "./spec/models/user_spec.rb"
-- "./spec/presenters/ci/build_runner_presenter_spec.rb"
-- "./spec/presenters/ci/pipeline_presenter_spec.rb"
- "./spec/presenters/packages/detail/package_presenter_spec.rb"
-- "./spec/requests/api/ci/pipelines_spec.rb"
-- "./spec/requests/api/ci/runner/jobs_request_post_spec.rb"
- "./spec/requests/api/ci/runner/runners_post_spec.rb"
- "./spec/requests/api/ci/runners_spec.rb"
-- "./spec/requests/api/commit_statuses_spec.rb"
+- "./spec/requests/api/graphql/ci/runner_spec.rb"
- "./spec/requests/api/graphql/group_query_spec.rb"
-- "./spec/requests/api/graphql/merge_request/merge_request_spec.rb"
-- "./spec/requests/api/graphql/mutations/ci/job_token_scope/add_project_spec.rb"
-- "./spec/requests/api/graphql/mutations/ci/job_token_scope/remove_project_spec.rb"
-- "./spec/requests/api/graphql/mutations/environments/canary_ingress/update_spec.rb"
-- "./spec/requests/api/graphql/mutations/merge_requests/create_spec.rb"
- "./spec/requests/api/graphql/packages/composer_spec.rb"
- "./spec/requests/api/graphql/packages/conan_spec.rb"
- "./spec/requests/api/graphql/packages/maven_spec.rb"
- "./spec/requests/api/graphql/packages/nuget_spec.rb"
- "./spec/requests/api/graphql/packages/package_spec.rb"
- "./spec/requests/api/graphql/packages/pypi_spec.rb"
-- "./spec/requests/api/graphql/project/merge_request/pipelines_spec.rb"
-- "./spec/requests/api/graphql/project/merge_request_spec.rb"
-- "./spec/requests/api/graphql/project/merge_requests_spec.rb"
-- "./spec/requests/api/graphql/project/pipeline_spec.rb"
-- "./spec/requests/api/merge_requests_spec.rb"
- "./spec/requests/api/package_files_spec.rb"
-- "./spec/services/auto_merge/merge_when_pipeline_succeeds_service_spec.rb"
-- "./spec/services/ci/create_pipeline_service/cross_project_pipeline_spec.rb"
-- "./spec/services/ci/create_pipeline_service/needs_spec.rb"
-- "./spec/services/ci/create_pipeline_service_spec.rb"
-- "./spec/services/ci/destroy_pipeline_service_spec.rb"
-- "./spec/services/ci/expire_pipeline_cache_service_spec.rb"
-- "./spec/services/ci/job_artifacts/destroy_all_expired_service_spec.rb"
-- "./spec/services/ci/job_artifacts/destroy_associations_service_spec.rb"
-- "./spec/services/ci/job_artifacts/destroy_batch_service_spec.rb"
-- "./spec/services/ci/pipeline_processing/shared_processing_service.rb"
-- "./spec/services/ci/pipeline_processing/shared_processing_service_tests_with_yaml.rb"
-- "./spec/services/ci/register_job_service_spec.rb"
-- "./spec/services/clusters/applications/prometheus_config_service_spec.rb"
-- "./spec/services/deployments/older_deployments_drop_service_spec.rb"
-- "./spec/services/environments/auto_stop_service_spec.rb"
- "./spec/services/environments/stop_service_spec.rb"
-- "./spec/services/merge_requests/add_todo_when_build_fails_service_spec.rb"
-- "./spec/services/merge_requests/create_service_spec.rb"
- "./spec/services/merge_requests/post_merge_service_spec.rb"
-- "./spec/services/merge_requests/refresh_service_spec.rb"
-- "./spec/support/prometheus/additional_metrics_shared_examples.rb"
-- "./spec/support/shared_examples/ci/pipeline_email_shared_examples.rb"
- "./spec/support/shared_examples/features/packages_shared_examples.rb"
-- "./spec/support/shared_examples/features/search_settings_shared_examples.rb"
-- "./spec/support/shared_examples/features/variable_list_shared_examples.rb"
- "./spec/support/shared_examples/models/concerns/limitable_shared_examples.rb"
-- "./spec/support/shared_examples/quick_actions/merge_request/merge_quick_action_shared_examples.rb"
- "./spec/support/shared_examples/requests/api/graphql/packages/group_and_project_packages_list_shared_examples.rb"
- "./spec/support/shared_examples/requests/api/graphql/packages/package_details_shared_examples.rb"
-- "./spec/support/shared_examples/requests/api/logging_application_context_shared_examples.rb"
-- "./spec/support/shared_examples/requests/api/status_shared_examples.rb"
- "./spec/support/shared_examples/requests/graphql_shared_examples.rb"
-- "./spec/support/shared_examples/services/onboarding_progress_shared_examples.rb"
- "./spec/support/shared_examples/services/packages_shared_examples.rb"
-- "./spec/support/shared_examples/workers/idempotency_shared_examples.rb"
-- "./spec/tasks/gitlab/generate_sample_prometheus_data_spec.rb"
-- "./spec/workers/pipeline_process_worker_spec.rb"
-- "./spec/workers/pipeline_schedule_worker_spec.rb"
diff --git a/spec/support/database/multiple_databases.rb b/spec/support/database/multiple_databases.rb
index 8ce642a682c..5e1ae60536f 100644
--- a/spec/support/database/multiple_databases.rb
+++ b/spec/support/database/multiple_databases.rb
@@ -5,5 +5,57 @@ module Database
def skip_if_multiple_databases_not_setup
skip 'Skipping because multiple databases not set up' unless Gitlab::Database.has_config?(:ci)
end
+
+ # The usage of this method switches temporarily used `connection_handler`
+ # allowing full manipulation of ActiveRecord::Base connections without
+ # having side effects like:
+ # - misaligned transactions since this is managed by `BeforeAllAdapter`
+ # - removal of primary connections
+ #
+ # The execution within a block ensures safe cleanup of all allocated resources.
+ #
+ # rubocop:disable Database/MultipleDatabases
+ def with_reestablished_active_record_base(reconnect: true)
+ connection_classes = ActiveRecord::Base.connection_handler.connection_pool_names.map(&:constantize).to_h do |klass|
+ [klass, klass.connection_db_config]
+ end
+
+ original_handler = ActiveRecord::Base.connection_handler
+ new_handler = ActiveRecord::ConnectionAdapters::ConnectionHandler.new
+ ActiveRecord::Base.connection_handler = new_handler
+
+ if reconnect
+ connection_classes.each { |klass, db_config| klass.establish_connection(db_config) }
+ end
+
+ yield
+ ensure
+ ActiveRecord::Base.connection_handler = original_handler
+ new_handler&.clear_all_connections!
+ end
+ # rubocop:enable Database/MultipleDatabases
+ end
+
+ module ActiveRecordBaseEstablishConnection
+ def establish_connection(*args)
+ # rubocop:disable Database/MultipleDatabases
+ if connected? && connection&.transaction_open? && ActiveRecord::Base.connection_handler == ActiveRecord::Base.default_connection_handler
+ raise "Cannot re-establish '#{self}.establish_connection' within an open transaction (#{connection&.open_transactions.to_i}). " \
+ "Use `with_reestablished_active_record_base` instead or add `:reestablished_active_record_base` to rspec context."
+ end
+ # rubocop:enable Database/MultipleDatabases
+
+ super
+ end
end
end
+
+RSpec.configure do |config|
+ config.around(:each, :reestablished_active_record_base) do |example|
+ with_reestablished_active_record_base(reconnect: example.metadata.fetch(:reconnect, true)) do
+ example.run
+ end
+ end
+end
+
+ActiveRecord::Base.singleton_class.prepend(::Database::ActiveRecordBaseEstablishConnection) # rubocop:disable Database/MultipleDatabases
diff --git a/spec/support/database/prevent_cross_database_modification.rb b/spec/support/database/prevent_cross_database_modification.rb
index b4c968e3c41..7ded85b65ce 100644
--- a/spec/support/database/prevent_cross_database_modification.rb
+++ b/spec/support/database/prevent_cross_database_modification.rb
@@ -33,8 +33,10 @@ module Database
end
def cleanup_with_cross_database_modification_prevented
- ActiveSupport::Notifications.unsubscribe(PreventCrossDatabaseModification.cross_database_context[:subscriber])
- PreventCrossDatabaseModification.cross_database_context[:enabled] = false
+ if PreventCrossDatabaseModification.cross_database_context
+ ActiveSupport::Notifications.unsubscribe(PreventCrossDatabaseModification.cross_database_context[:subscriber])
+ PreventCrossDatabaseModification.cross_database_context[:enabled] = false
+ end
end
end
@@ -55,8 +57,11 @@ module Database
end
def self.prevent_cross_database_modification!(connection, sql)
+ return unless cross_database_context
return unless cross_database_context[:enabled]
+ return if connection.pool.instance_of?(ActiveRecord::ConnectionAdapters::NullPool)
+
database = connection.pool.db_config.name
if sql.start_with?('SAVEPOINT')
@@ -74,6 +79,8 @@ module Database
return if cross_database_context[:transaction_depth_by_db].values.all?(&:zero?)
+ # PgQuery might fail in some cases due to limited nesting:
+ # https://github.com/pganalyze/pg_query/issues/209
parsed_query = PgQuery.parse(sql)
tables = sql.downcase.include?(' for update') ? parsed_query.tables : parsed_query.dml_tables
@@ -87,7 +94,8 @@ module Database
if schemas.many?
raise Database::PreventCrossDatabaseModification::CrossDatabaseModificationAcrossUnsupportedTablesError,
"Cross-database data modification of '#{schemas.to_a.join(", ")}' were detected within " \
- "a transaction modifying the '#{all_tables.to_a.join(", ")}'"
+ "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."
end
end
end
@@ -96,16 +104,20 @@ end
Gitlab::Database.singleton_class.prepend(
Database::PreventCrossDatabaseModification::GitlabDatabaseMixin)
+CROSS_DB_MODIFICATION_ALLOW_LIST = Set.new(YAML.load_file(File.join(__dir__, 'cross-database-modification-allowlist.yml'))).freeze
+
RSpec.configure do |config|
config.include(::Database::PreventCrossDatabaseModification::SpecHelpers)
# Using before and after blocks because the around block causes problems with the let_it_be
# record creations. It makes an extra savepoint which breaks the transaction count logic.
- config.before(:each, :prevent_cross_database_modification) do
- with_cross_database_modification_prevented
+ config.before do |example_file|
+ if CROSS_DB_MODIFICATION_ALLOW_LIST.exclude?(example_file.file_path)
+ with_cross_database_modification_prevented
+ end
end
- config.after(:each, :prevent_cross_database_modification) do
+ config.after do |example_file|
cleanup_with_cross_database_modification_prevented
end
end
diff --git a/spec/support/database/prevent_cross_joins.rb b/spec/support/database/prevent_cross_joins.rb
index 4b78aa9014c..f5ed2a8f22e 100644
--- a/spec/support/database/prevent_cross_joins.rb
+++ b/spec/support/database/prevent_cross_joins.rb
@@ -22,9 +22,10 @@ module Database
CrossJoinAcrossUnsupportedTablesError = Class.new(StandardError)
ALLOW_THREAD_KEY = :allow_cross_joins_across_databases
+ ALLOW_ANNOTATE_KEY = ALLOW_THREAD_KEY.to_s.freeze
def self.validate_cross_joins!(sql)
- return if Thread.current[ALLOW_THREAD_KEY]
+ return if Thread.current[ALLOW_THREAD_KEY] || sql.include?(ALLOW_ANNOTATE_KEY)
# Allow spec/support/database_cleaner.rb queries to disable/enable triggers for many tables
# See https://gitlab.com/gitlab-org/gitlab/-/issues/339396
@@ -32,21 +33,14 @@ module Database
# PgQuery might fail in some cases due to limited nesting:
# https://github.com/pganalyze/pg_query/issues/209
- #
- # Also, we disable GC while parsing because of https://github.com/pganalyze/pg_query/issues/226
- begin
- GC.disable
- tables = PgQuery.parse(sql).tables
- ensure
- GC.enable
- end
+ tables = PgQuery.parse(sql).tables
schemas = Database::GitlabSchema.table_schemas(tables)
if schemas.include?(:gitlab_ci) && schemas.include?(:gitlab_main)
Thread.current[:has_cross_join_exception] = true
raise CrossJoinAcrossUnsupportedTablesError,
- "Unsupported cross-join across '#{tables.join(", ")}' modifying '#{schemas.to_a.join(", ")}' discovered " \
+ "Unsupported cross-join across '#{tables.join(", ")}' querying '#{schemas.to_a.join(", ")}' discovered " \
"when executing query '#{sql}'. Please refer to https://docs.gitlab.com/ee/development/database/multiple_databases.html#removing-joins-between-ci_-and-non-ci_-tables for details on how to resolve this exception."
end
end
@@ -63,6 +57,10 @@ module Database
ensure
ActiveSupport::Notifications.unsubscribe(subscriber) if subscriber
end
+
+ def allow_cross_joins_across_databases(url:, &block)
+ ::Gitlab::Database.allow_cross_joins_across_databases(url: url, &block)
+ end
end
module GitlabDatabaseMixin
@@ -75,12 +73,21 @@ module Database
Thread.current[ALLOW_THREAD_KEY] = old_value
end
end
+
+ module ActiveRecordRelationMixin
+ def allow_cross_joins_across_databases(url:)
+ super.annotate(ALLOW_ANNOTATE_KEY)
+ end
+ end
end
end
Gitlab::Database.singleton_class.prepend(
Database::PreventCrossJoins::GitlabDatabaseMixin)
+ActiveRecord::Relation.prepend(
+ Database::PreventCrossJoins::ActiveRecordRelationMixin)
+
ALLOW_LIST = Set.new(YAML.load_file(File.join(__dir__, 'cross-join-allowlist.yml'))).freeze
RSpec.configure do |config|
diff --git a/spec/support/database_cleaner.rb b/spec/support/database_cleaner.rb
index b31881e3082..8f706fdebc9 100644
--- a/spec/support/database_cleaner.rb
+++ b/spec/support/database_cleaner.rb
@@ -17,32 +17,9 @@ RSpec.configure do |config|
delete_from_all_tables!(except: ['work_item_types'])
# Postgres maximum number of columns in a table is 1600 (https://github.com/postgres/postgres/blob/de41869b64d57160f58852eab20a27f248188135/src/include/access/htup_details.h#L23-L47).
- # And since:
- # "The DROP COLUMN form does not physically remove the column, but simply makes
- # it invisible to SQL operations. Subsequent insert and update operations in the
- # table will store a null value for the column. Thus, dropping a column is quick
- # but it will not immediately reduce the on-disk size of your table, as the space
- # occupied by the dropped column is not reclaimed.
- # The space will be reclaimed over time as existing rows are updated."
- # according to https://www.postgresql.org/docs/current/sql-altertable.html.
# We drop and recreate the database if any table has more than 1200 columns, just to be safe.
- max_allowed_columns = 1200
- tables_with_more_than_allowed_columns =
- ApplicationRecord.connection.execute("SELECT attrelid::regclass::text AS table, COUNT(*) AS column_count FROM pg_attribute GROUP BY attrelid HAVING COUNT(*) > #{max_allowed_columns}")
-
- if tables_with_more_than_allowed_columns.any?
- tables_with_more_than_allowed_columns.each do |result|
- puts "The #{result['table']} table has #{result['column_count']} columns."
- end
- puts "Recreating the database"
- start = Gitlab::Metrics::System.monotonic_time
-
- ActiveRecord::Tasks::DatabaseTasks.drop_current
- ActiveRecord::Tasks::DatabaseTasks.create_current
- ActiveRecord::Tasks::DatabaseTasks.load_schema_current
- ActiveRecord::Tasks::DatabaseTasks.migrate
-
- puts "Database re-creation done in #{Gitlab::Metrics::System.monotonic_time - start}"
+ if any_connection_class_with_more_than_allowed_columns?
+ recreate_all_databases!
end
end
diff --git a/spec/support/database_load_balancing.rb b/spec/support/database_load_balancing.rb
index f22c69ea613..014575e8a82 100644
--- a/spec/support/database_load_balancing.rb
+++ b/spec/support/database_load_balancing.rb
@@ -1,22 +1,30 @@
# frozen_string_literal: true
RSpec.configure do |config|
- config.before(:each, :db_load_balancing) do
- allow(Gitlab::Database::LoadBalancing).to receive(:enable?).and_return(true)
+ config.around(:each, :database_replica) do |example|
+ old_proxies = []
- config = Gitlab::Database::LoadBalancing::Configuration
- .new(ActiveRecord::Base, [Gitlab::Database.main.config['host']])
- lb = ::Gitlab::Database::LoadBalancing::LoadBalancer.new(config)
- proxy = ::Gitlab::Database::LoadBalancing::ConnectionProxy.new(lb)
+ Gitlab::Database::LoadBalancing.base_models.each do |model|
+ config = Gitlab::Database::LoadBalancing::Configuration
+ .new(model, [model.connection_db_config.configuration_hash[:host]])
+ lb = Gitlab::Database::LoadBalancing::LoadBalancer.new(config)
- allow(ActiveRecord::Base).to receive(:load_balancing_proxy).and_return(proxy)
+ old_proxies << [model, model.connection]
- ::Gitlab::Database::LoadBalancing::Session.clear_session
+ model.connection =
+ Gitlab::Database::LoadBalancing::ConnectionProxy.new(lb)
+ end
+
+ Gitlab::Database::LoadBalancing::Session.clear_session
redis_shared_state_cleanup!
- end
- config.after(:each, :db_load_balancing) do
- ::Gitlab::Database::LoadBalancing::Session.clear_session
+ example.run
+
+ Gitlab::Database::LoadBalancing::Session.clear_session
redis_shared_state_cleanup!
+
+ old_proxies.each do |(model, proxy)|
+ model.connection = proxy
+ end
end
end
diff --git a/spec/support/db_cleaner.rb b/spec/support/db_cleaner.rb
index 940ff2751d3..316d645f99f 100644
--- a/spec/support/db_cleaner.rb
+++ b/spec/support/db_cleaner.rb
@@ -2,7 +2,7 @@
module DbCleaner
def all_connection_classes
- ::ActiveRecord::Base.connection_handler.connection_pool_names.map(&:constantize)
+ ::BeforeAllAdapter.all_connection_classes
end
def delete_from_all_tables!(except: [])
@@ -20,6 +20,79 @@ module DbCleaner
DatabaseCleaner[:active_record, { connection: connection_class }]
end
end
+
+ def any_connection_class_with_more_than_allowed_columns?
+ all_connection_classes.any? do |connection_class|
+ more_than_allowed_columns?(connection_class)
+ end
+ end
+
+ def more_than_allowed_columns?(connection_class)
+ # Postgres maximum number of columns in a table is 1600 (https://github.com/postgres/postgres/blob/de41869b64d57160f58852eab20a27f248188135/src/include/access/htup_details.h#L23-L47).
+ # And since:
+ # "The DROP COLUMN form does not physically remove the column, but simply makes
+ # it invisible to SQL operations. Subsequent insert and update operations in the
+ # table will store a null value for the column. Thus, dropping a column is quick
+ # but it will not immediately reduce the on-disk size of your table, as the space
+ # occupied by the dropped column is not reclaimed.
+ # The space will be reclaimed over time as existing rows are updated."
+ # according to https://www.postgresql.org/docs/current/sql-altertable.html.
+ # We drop and recreate the database if any table has more than 1200 columns, just to be safe.
+ max_allowed_columns = 1200
+ tables_with_more_than_allowed_columns = connection_class.connection.execute(<<-SQL)
+ SELECT attrelid::regclass::text AS table, COUNT(*) AS column_count
+ FROM pg_attribute
+ GROUP BY attrelid
+ HAVING COUNT(*) > #{max_allowed_columns}
+ SQL
+
+ tables_with_more_than_allowed_columns.each do |result|
+ puts "The #{result['table']} (#{connection_class.connection_db_config.name}) table has #{result['column_count']} columns."
+ end
+
+ tables_with_more_than_allowed_columns.any?
+ end
+
+ def recreate_all_databases!
+ start = Gitlab::Metrics::System.monotonic_time
+
+ puts "Recreating the database"
+
+ force_disconnect_all_connections!
+
+ ActiveRecord::Tasks::DatabaseTasks.drop_current
+ ActiveRecord::Tasks::DatabaseTasks.create_current
+ ActiveRecord::Tasks::DatabaseTasks.load_schema_current
+
+ # Migrate each database individually
+ with_reestablished_active_record_base do
+ all_connection_classes.each do |connection_class|
+ ActiveRecord::Base.establish_connection(connection_class.connection_db_config)
+
+ ActiveRecord::Tasks::DatabaseTasks.migrate
+ end
+ end
+
+ puts "Databases re-creation done in #{Gitlab::Metrics::System.monotonic_time - start}"
+ end
+
+ def force_disconnect_all_connections!
+ all_connection_classes.each do |connection_class|
+ # We use `connection_pool` to avoid going through
+ # Load Balancer since it does retry ops
+ pool = connection_class.connection_pool
+
+ # Force disconnect https://www.cybertec-postgresql.com/en/terminating-database-connections-in-postgresql/
+ pool.connection.execute(<<-SQL)
+ SELECT pg_terminate_backend(pid)
+ FROM pg_stat_activity
+ WHERE datname = #{pool.connection.quote(pool.db_config.database)}
+ AND pid != pg_backend_pid();
+ SQL
+
+ connection_class.connection_pool.disconnect!
+ end
+ end
end
DbCleaner.prepend_mod_with('DbCleaner')
diff --git a/spec/support/helpers/dependency_proxy_helpers.rb b/spec/support/helpers/dependency_proxy_helpers.rb
index 9413cb93199..75dc09ec159 100644
--- a/spec/support/helpers/dependency_proxy_helpers.rb
+++ b/spec/support/helpers/dependency_proxy_helpers.rb
@@ -34,12 +34,20 @@ module DependencyProxyHelpers
def build_jwt(user = nil, expire_time: nil)
JSONWebToken::HMACToken.new(::Auth::DependencyProxyAuthenticationService.secret).tap do |jwt|
- jwt['user_id'] = user.id if user.is_a?(User)
- jwt['deploy_token'] = user.token if user.is_a?(DeployToken)
- jwt.expire_time = expire_time || jwt.issued_at + 1.minute
+ if block_given?
+ yield(jwt)
+ else
+ jwt['user_id'] = user.id if user.is_a?(User)
+ jwt['deploy_token'] = user.token if user.is_a?(DeployToken)
+ jwt.expire_time = expire_time || jwt.issued_at + 1.minute
+ end
end
end
+ def jwt_token_authorization_headers(jwt)
+ { 'AUTHORIZATION' => "Bearer #{jwt.encoded}" }
+ end
+
private
def registry
diff --git a/spec/support/helpers/feature_flag_helpers.rb b/spec/support/helpers/feature_flag_helpers.rb
index 51ba9039b70..4e57002a7c6 100644
--- a/spec/support/helpers/feature_flag_helpers.rb
+++ b/spec/support/helpers/feature_flag_helpers.rb
@@ -71,7 +71,7 @@ module FeatureFlagHelpers
end
def add_linked_issue_button
- find('.js-issue-count-badge-add-button')
+ find_button 'Add a related issue'
end
def remove_linked_issue_button
diff --git a/spec/support/helpers/javascript_fixtures_helpers.rb b/spec/support/helpers/javascript_fixtures_helpers.rb
index 5174c145a93..fb909008f12 100644
--- a/spec/support/helpers/javascript_fixtures_helpers.rb
+++ b/spec/support/helpers/javascript_fixtures_helpers.rb
@@ -3,6 +3,8 @@
require 'action_dispatch/testing/test_request'
require 'fileutils'
+require_relative '../../../lib/gitlab/popen'
+
module JavaScriptFixturesHelpers
extend ActiveSupport::Concern
include Gitlab::Popen
@@ -25,17 +27,6 @@ module JavaScriptFixturesHelpers
'tmp/tests/frontend/fixtures' + (Gitlab.ee? ? '-ee' : '')
end
- # Public: Removes all fixture files from given directory
- #
- # directory_name - directory of the fixtures (relative to .fixture_root_path)
- #
- def clean_frontend_fixtures(directory_name)
- full_directory_name = File.expand_path(directory_name, fixture_root_path)
- Dir[File.expand_path('*.{html,json,md}', full_directory_name)].each do |file_name|
- FileUtils.rm(file_name)
- end
- end
-
def remove_repository(project)
Gitlab::Shell.new.remove_repository(project.repository_storage, project.disk_path)
end
diff --git a/spec/support/helpers/navbar_structure_helper.rb b/spec/support/helpers/navbar_structure_helper.rb
index 826108a63a5..96e79427278 100644
--- a/spec/support/helpers/navbar_structure_helper.rb
+++ b/spec/support/helpers/navbar_structure_helper.rb
@@ -52,4 +52,12 @@ module NavbarStructureHelper
new_sub_nav_item_name: _('Infrastructure Registry')
)
end
+
+ def insert_infrastructure_google_cloud_nav
+ insert_after_sub_nav_item(
+ _('Terraform'),
+ within: _('Infrastructure'),
+ new_sub_nav_item_name: _('Google Cloud')
+ )
+ end
end
diff --git a/spec/support/helpers/stub_gitlab_calls.rb b/spec/support/helpers/stub_gitlab_calls.rb
index 5ab778c11cb..6f530d57caf 100644
--- a/spec/support/helpers/stub_gitlab_calls.rb
+++ b/spec/support/helpers/stub_gitlab_calls.rb
@@ -79,6 +79,18 @@ module StubGitlabCalls
end
end
+ def stub_container_registry_info(info: {})
+ allow(ContainerRegistry::Client)
+ .to receive(:registry_info)
+ .and_return(info)
+ end
+
+ def stub_container_registry_network_error(client_method:)
+ allow_next_instance_of(ContainerRegistry::Client) do |client|
+ allow(client).to receive(client_method).and_raise(::Faraday::Error, nil, nil)
+ end
+ end
+
def stub_commonmark_sourcepos_disabled
allow_any_instance_of(Banzai::Filter::MarkdownEngines::CommonMark)
.to receive(:render_options)
diff --git a/spec/support/helpers/usage_data_helpers.rb b/spec/support/helpers/usage_data_helpers.rb
index b1a9aade043..5ead1813439 100644
--- a/spec/support/helpers/usage_data_helpers.rb
+++ b/spec/support/helpers/usage_data_helpers.rb
@@ -54,15 +54,8 @@ module UsageDataHelpers
clusters_platforms_eks
clusters_platforms_gke
clusters_platforms_user
- clusters_applications_helm
- clusters_applications_ingress
- clusters_applications_cert_managers
- clusters_applications_prometheus
- clusters_applications_crossplane
- clusters_applications_runner
- clusters_applications_knative
- clusters_applications_elastic_stack
- clusters_applications_jupyter
+ clusters_integrations_elastic_stack
+ clusters_integrations_prometheus
clusters_management_project
in_review_folder
grafana_integrated_projects
@@ -112,6 +105,7 @@ module UsageDataHelpers
projects_with_expiration_policy_enabled_with_older_than_set_to_7d
projects_with_expiration_policy_enabled_with_older_than_set_to_14d
projects_with_expiration_policy_enabled_with_older_than_set_to_30d
+ projects_with_expiration_policy_enabled_with_older_than_set_to_60d
projects_with_expiration_policy_enabled_with_older_than_set_to_90d
projects_with_expiration_policy_enabled_with_cadence_set_to_1d
projects_with_expiration_policy_enabled_with_cadence_set_to_7d
diff --git a/spec/support/matchers/be_request_urgency.rb b/spec/support/matchers/be_request_urgency.rb
new file mode 100644
index 00000000000..e88f157366b
--- /dev/null
+++ b/spec/support/matchers/be_request_urgency.rb
@@ -0,0 +1,8 @@
+# frozen_string_literal: true
+
+RSpec::Matchers.define :be_request_urgency do |expected|
+ match do |actual|
+ actual.is_a?(::Gitlab::EndpointAttributes::Config::RequestUrgency) &&
+ actual.name == expected
+ end
+end
diff --git a/spec/support/matchers/graphql_matchers.rb b/spec/support/matchers/graphql_matchers.rb
index 904b7efdd7f..dcaec176687 100644
--- a/spec/support/matchers/graphql_matchers.rb
+++ b/spec/support/matchers/graphql_matchers.rb
@@ -3,14 +3,30 @@
RSpec::Matchers.define_negated_matcher :be_nullable, :be_non_null
RSpec::Matchers.define :require_graphql_authorizations do |*expected|
+ def permissions_for(klass)
+ if klass.respond_to?(:required_permissions)
+ klass.required_permissions
+ else
+ [klass.to_graphql.metadata[:authorize]]
+ end
+ end
+
match do |klass|
- permissions = if klass.respond_to?(:required_permissions)
- klass.required_permissions
- else
- [klass.to_graphql.metadata[:authorize]]
- end
+ actual = permissions_for(klass)
+
+ expect(actual).to match_array(expected)
+ end
+
+ failure_message do |klass|
+ actual = permissions_for(klass)
+ missing = actual - expected
+ extra = expected - actual
- expect(permissions).to eq(expected)
+ message = []
+ message << "is missing permissions: #{missing.inspect}" if missing.any?
+ message << "contained unexpected permissions: #{extra.inspect}" if extra.any?
+
+ message.join("\n")
end
end
diff --git a/spec/support/matchers/markdown_matchers.rb b/spec/support/matchers/markdown_matchers.rb
index dfdb5bc01ae..f01c4075eeb 100644
--- a/spec/support/matchers/markdown_matchers.rb
+++ b/spec/support/matchers/markdown_matchers.rb
@@ -41,7 +41,7 @@ module MarkdownMatchers
set_default_markdown_messages
match do |actual|
- expect(actual).to have_selector('gl-emoji', count: 10)
+ expect(actual).to have_selector('gl-emoji', count: 12)
emoji_element = actual.at_css('gl-emoji')
expect(emoji_element['data-name'].to_s).not_to be_empty
diff --git a/spec/support/redis.rb b/spec/support/redis.rb
index eeeb93fa811..421079af8e0 100644
--- a/spec/support/redis.rb
+++ b/spec/support/redis.rb
@@ -38,4 +38,20 @@ RSpec.configure do |config|
redis_trace_chunks_cleanup!
end
+
+ config.around(:each, :clean_gitlab_redis_rate_limiting) do |example|
+ redis_rate_limiting_cleanup!
+
+ example.run
+
+ redis_rate_limiting_cleanup!
+ end
+
+ config.around(:each, :clean_gitlab_redis_sessions) do |example|
+ redis_sessions_cleanup!
+
+ example.run
+
+ redis_sessions_cleanup!
+ end
end
diff --git a/spec/support/redis/redis_helpers.rb b/spec/support/redis/redis_helpers.rb
index 3511d906203..f27d873eb31 100644
--- a/spec/support/redis/redis_helpers.rb
+++ b/spec/support/redis/redis_helpers.rb
@@ -22,4 +22,14 @@ module RedisHelpers
def redis_trace_chunks_cleanup!
Gitlab::Redis::TraceChunks.with(&:flushdb)
end
+
+ # Usage: rate limiting state (for Rack::Attack)
+ def redis_rate_limiting_cleanup!
+ Gitlab::Redis::RateLimiting.with(&:flushdb)
+ end
+
+ # Usage: session state
+ def redis_sessions_cleanup!
+ Gitlab::Redis::Sessions.with(&:flushdb)
+ end
end
diff --git a/spec/support/redis/redis_new_instance_shared_examples.rb b/spec/support/redis/redis_new_instance_shared_examples.rb
new file mode 100644
index 00000000000..e9b1e3e4da1
--- /dev/null
+++ b/spec/support/redis/redis_new_instance_shared_examples.rb
@@ -0,0 +1,55 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.shared_examples "redis_new_instance_shared_examples" do |name, fallback_class|
+ 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 }
+
+ before do
+ allow(fallback_class).to receive(:config_file_name).and_return(fallback_config_file)
+ end
+
+ include_examples "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
+
+ allow(described_class).to receive(:rails_root).and_return(rails_root)
+ 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'))
+ end
+
+ it { expect(subject).to eq("#{rails_root}/config/resque.yml") }
+
+ context 'and there is a global env override' do
+ before do
+ stub_env('GITLAB_REDIS_CONFIG_FILE', 'global override')
+ end
+
+ it { expect(subject).to eq('global override') }
+
+ context "and #{fallback_class.name.demodulize} has a different config file" do
+ let(:fallback_config_file) { 'fallback config file' }
+
+ it { expect(subject).to eq('fallback config file') }
+ end
+ end
+ end
+ end
+end
diff --git a/spec/support/redis/redis_shared_examples.rb b/spec/support/redis/redis_shared_examples.rb
index 25eab5fd6e4..dd916aea3e8 100644
--- a/spec/support/redis/redis_shared_examples.rb
+++ b/spec/support/redis/redis_shared_examples.rb
@@ -255,6 +255,28 @@ RSpec.shared_examples "redis_shared_examples" do
end
end
+ describe '#db' do
+ let(:rails_env) { 'development' }
+
+ subject { described_class.new(rails_env).db }
+
+ context 'with old format' do
+ let(:config_file_name) { config_old_format_host }
+
+ it 'returns the correct db' do
+ expect(subject).to eq(redis_database)
+ end
+ end
+
+ context 'with new format' do
+ let(:config_file_name) { config_new_format_host }
+
+ it 'returns the correct db' do
+ expect(subject).to eq(redis_database)
+ end
+ end
+ end
+
describe '#sentinels' do
subject { described_class.new(rails_env).sentinels }
@@ -327,6 +349,12 @@ RSpec.shared_examples "redis_shared_examples" do
expect(subject.send(:fetch_config)).to eq false
end
+
+ it 'has a value for the legacy default URL' do
+ allow(subject).to receive(:fetch_config) { false }
+
+ expect(subject.send(:raw_config_hash)).to include(url: a_string_matching(%r{\Aredis://localhost:638[012]\Z}))
+ end
end
def clear_raw_config
diff --git a/spec/support/shared_contexts/bulk_imports_requests_shared_context.rb b/spec/support/shared_contexts/bulk_imports_requests_shared_context.rb
new file mode 100644
index 00000000000..62d708420c3
--- /dev/null
+++ b/spec/support/shared_contexts/bulk_imports_requests_shared_context.rb
@@ -0,0 +1,52 @@
+# frozen_string_literal: true
+
+RSpec.shared_context 'bulk imports requests context' do |url|
+ let(:page_response_headers) do
+ {
+ 'Content-Type' => 'application/json',
+ 'X-Next-Page' => 2,
+ 'X-Page' => 1,
+ 'X-Per-Page' => 20,
+ 'X-Total' => 42,
+ 'X-Total-Pages' => 2
+ }
+ end
+
+ let(:request_headers) { { 'Authorization' => 'Bearer demo-pat', 'Content-Type' => 'application/json' } }
+
+ before do
+ stub_request(:get, "#{url}/api/v4/version")
+ .with(headers: request_headers)
+ .to_return(
+ status: 200,
+ body: { version: ::BulkImport.min_gl_version_for_project_migration.to_s }.to_json,
+ headers: { 'Content-Type' => 'application/json' })
+
+ stub_request(:get, "https://gitlab.example.com/api/v4/groups?min_access_level=50&page=1&per_page=20&search=test&top_level_only=true")
+ .with(headers: request_headers)
+ .to_return(status: 200,
+ body: [{
+ id: 2595440,
+ web_url: 'https://gitlab.com/groups/test',
+ name: 'Test',
+ path: 'stub-test-group',
+ full_name: 'Test',
+ full_path: 'stub-test-group'
+ }].to_json,
+ headers: page_response_headers
+ )
+
+ stub_request(:get, "%{url}/api/v4/groups?page=1&per_page=20&top_level_only=true&min_access_level=50&search=" % { url: url })
+ .to_return(
+ body: [{
+ id: 2595438,
+ web_url: 'https://gitlab.com/groups/auto-breakfast',
+ name: 'Stub',
+ path: 'stub-group',
+ full_name: 'Stub',
+ full_path: 'stub-group'
+ }].to_json,
+ headers: page_response_headers
+ )
+ end
+end
diff --git a/spec/support/shared_contexts/lib/gitlab/import_export/relation_tree_restorer_shared_context.rb b/spec/support/shared_contexts/lib/gitlab/import_export/relation_tree_restorer_shared_context.rb
index 6b9ddc70691..7176e38bf7c 100644
--- a/spec/support/shared_contexts/lib/gitlab/import_export/relation_tree_restorer_shared_context.rb
+++ b/spec/support/shared_contexts/lib/gitlab/import_export/relation_tree_restorer_shared_context.rb
@@ -3,7 +3,7 @@
RSpec.shared_context 'relation tree restorer shared context' do
include ImportExport::CommonUtil
- let(:user) { create(:user) }
+ let_it_be(:user) { create(:user) }
let(:shared) { Gitlab::ImportExport::Shared.new(importable) }
let(:attributes) { relation_reader.consume_attributes(importable_name) }
diff --git a/spec/support/shared_contexts/lib/gitlab/sidekiq_logging/structured_logger_shared_context.rb b/spec/support/shared_contexts/lib/gitlab/sidekiq_logging/structured_logger_shared_context.rb
index 5a72b330707..b7966e25b38 100644
--- a/spec/support/shared_contexts/lib/gitlab/sidekiq_logging/structured_logger_shared_context.rb
+++ b/spec/support/shared_contexts/lib/gitlab/sidekiq_logging/structured_logger_shared_context.rb
@@ -39,17 +39,25 @@ RSpec.shared_context 'structured_logger' do
)
end
+ let(:db_payload_defaults) do
+ metrics =
+ ::Gitlab::Metrics::Subscribers::ActiveRecord.load_balancing_metric_counter_keys +
+ ::Gitlab::Metrics::Subscribers::ActiveRecord.load_balancing_metric_duration_keys +
+ ::Gitlab::Metrics::Subscribers::ActiveRecord.db_counter_keys +
+ [:db_duration_s]
+
+ metrics.each_with_object({}) do |key, result|
+ result[key.to_s] = 0
+ end
+ end
+
let(:end_payload) do
- start_payload.merge(
+ start_payload.merge(db_payload_defaults).merge(
'message' => 'TestWorker JID-da883554ee4fe414012f5f42: done: 0.0 sec',
'job_status' => 'done',
'duration_s' => 0.0,
'completed_at' => timestamp.to_f,
- 'cpu_s' => 1.111112,
- 'db_duration_s' => 0.0,
- 'db_cached_count' => 0,
- 'db_count' => 0,
- 'db_write_count' => 0
+ 'cpu_s' => 1.111112
)
end
diff --git a/spec/support/shared_contexts/lib/gitlab/sidekiq_middleware/server_metrics_shared_context.rb b/spec/support/shared_contexts/lib/gitlab/sidekiq_middleware/server_metrics_shared_context.rb
index 73de631e293..0d992f33c61 100644
--- a/spec/support/shared_contexts/lib/gitlab/sidekiq_middleware/server_metrics_shared_context.rb
+++ b/spec/support/shared_contexts/lib/gitlab/sidekiq_middleware/server_metrics_shared_context.rb
@@ -15,8 +15,12 @@ RSpec.shared_context 'server metrics with mocked prometheus' do
let(:redis_seconds_metric) { double('redis seconds metric') }
let(:elasticsearch_seconds_metric) { double('elasticsearch seconds metric') }
let(:elasticsearch_requests_total) { double('elasticsearch calls total metric') }
+ let(:load_balancing_metric) { double('load balancing metric') }
before do
+ allow(Gitlab::Metrics).to receive(:histogram).and_call_original
+ allow(Gitlab::Metrics).to receive(:counter).and_call_original
+
allow(Gitlab::Metrics).to receive(:histogram).with(:sidekiq_jobs_queue_duration_seconds, anything, anything, anything).and_return(queue_duration_seconds)
allow(Gitlab::Metrics).to receive(:histogram).with(:sidekiq_jobs_completion_seconds, anything, anything, anything).and_return(completion_seconds_metric)
allow(Gitlab::Metrics).to receive(:histogram).with(:sidekiq_jobs_cpu_seconds, anything, anything, anything).and_return(user_execution_seconds_metric)
@@ -28,6 +32,7 @@ RSpec.shared_context 'server metrics with mocked prometheus' do
allow(Gitlab::Metrics).to receive(:counter).with(:sidekiq_jobs_retried_total, anything).and_return(retried_total_metric)
allow(Gitlab::Metrics).to receive(:counter).with(:sidekiq_redis_requests_total, anything).and_return(redis_requests_total)
allow(Gitlab::Metrics).to receive(:counter).with(:sidekiq_elasticsearch_requests_total, anything).and_return(elasticsearch_requests_total)
+ allow(Gitlab::Metrics).to receive(:counter).with(:sidekiq_load_balancing_count, anything).and_return(load_balancing_metric)
allow(Gitlab::Metrics).to receive(:gauge).with(:sidekiq_running_jobs, anything, {}, :all).and_return(running_jobs_metric)
allow(Gitlab::Metrics).to receive(:gauge).with(:sidekiq_concurrency, anything, {}, :all).and_return(concurrency_metric)
diff --git a/spec/support/shared_contexts/policies/project_policy_shared_context.rb b/spec/support/shared_contexts/policies/project_policy_shared_context.rb
index de1b46c65ad..d7e4864cb08 100644
--- a/spec/support/shared_contexts/policies/project_policy_shared_context.rb
+++ b/spec/support/shared_contexts/policies/project_policy_shared_context.rb
@@ -49,6 +49,7 @@ RSpec.shared_context 'ProjectPolicy context' do
resolve_note update_build update_commit_status update_container_image
update_deployment update_environment update_merge_request
update_metrics_dashboard_annotation update_pipeline update_release destroy_release
+ read_resource_group update_resource_group
]
end
diff --git a/spec/support/shared_examples/ci/stuck_builds_shared_examples.rb b/spec/support/shared_examples/ci/stuck_builds_shared_examples.rb
new file mode 100644
index 00000000000..4fcea18393c
--- /dev/null
+++ b/spec/support/shared_examples/ci/stuck_builds_shared_examples.rb
@@ -0,0 +1,35 @@
+# frozen_string_literal: true
+
+RSpec.shared_examples 'job is dropped with failure reason' do |failure_reason|
+ it 'changes status' do
+ service.execute
+ job.reload
+
+ expect(job).to be_failed
+ expect(job.failure_reason).to eq(failure_reason)
+ end
+
+ context 'when job has data integrity problem' do
+ it 'drops the job and logs the reason' do
+ job.update_columns(yaml_variables: '[{"key" => "value"}]')
+
+ expect(Gitlab::ErrorTracking)
+ .to receive(:track_exception)
+ .with(anything, a_hash_including(build_id: job.id))
+ .once
+ .and_call_original
+
+ service.execute
+ job.reload
+
+ expect(job).to be_failed
+ expect(job.failure_reason).to eq('data_integrity_failure')
+ end
+ end
+end
+
+RSpec.shared_examples 'job is unchanged' do
+ it 'does not change status' do
+ expect { service.execute }.not_to change(job, :status)
+ end
+end
diff --git a/spec/support/shared_examples/controllers/wiki_actions_shared_examples.rb b/spec/support/shared_examples/controllers/wiki_actions_shared_examples.rb
index e8f7e62d0d7..30710e43357 100644
--- a/spec/support/shared_examples/controllers/wiki_actions_shared_examples.rb
+++ b/spec/support/shared_examples/controllers/wiki_actions_shared_examples.rb
@@ -299,7 +299,7 @@ RSpec.shared_examples 'wiki controller actions' do
expect(response.headers['Content-Disposition']).to match(/^inline/)
expect(response.headers[Gitlab::Workhorse::DETECT_HEADER]).to eq('true')
expect(response.cache_control[:public]).to be(false)
- expect(response.headers['Cache-Control']).to eq('no-store')
+ expect(response.headers['Cache-Control']).to eq('private, no-store')
end
end
end
diff --git a/spec/support/shared_examples/features/container_registry_shared_examples.rb b/spec/support/shared_examples/features/container_registry_shared_examples.rb
new file mode 100644
index 00000000000..06b2b8c621c
--- /dev/null
+++ b/spec/support/shared_examples/features/container_registry_shared_examples.rb
@@ -0,0 +1,9 @@
+# frozen_string_literal: true
+
+RSpec.shared_examples 'handling feature network errors with the container registry' do
+ it 'displays the error message' do
+ visit_container_registry
+
+ expect(page).to have_content 'We are having trouble connecting to the Container Registry'
+ end
+end
diff --git a/spec/support/shared_examples/features/discussion_comments_shared_example.rb b/spec/support/shared_examples/features/discussion_comments_shared_example.rb
index 318ba67b9e9..6c06cbf9082 100644
--- a/spec/support/shared_examples/features/discussion_comments_shared_example.rb
+++ b/spec/support/shared_examples/features/discussion_comments_shared_example.rb
@@ -3,9 +3,9 @@
RSpec.shared_examples 'thread comments for commit and snippet' do |resource_name|
let(:form_selector) { '.js-main-target-form' }
let(:dropdown_selector) { "#{form_selector} .comment-type-dropdown" }
- let(:toggle_selector) { "#{dropdown_selector} .dropdown-toggle" }
+ let(:toggle_selector) { "#{dropdown_selector} .gl-dropdown-toggle" }
let(:menu_selector) { "#{dropdown_selector} .dropdown-menu" }
- let(:submit_selector) { "#{form_selector} .js-comment-submit-button" }
+ let(:submit_selector) { "#{form_selector} .js-comment-submit-button > button:first-child" }
let(:close_selector) { "#{form_selector} .btn-comment-and-close" }
let(:comments_selector) { '.timeline > .note.timeline-entry:not(.being-posted)' }
let(:comment) { 'My comment' }
@@ -43,13 +43,11 @@ RSpec.shared_examples 'thread comments for commit and snippet' do |resource_name
expect(items.first).to have_content 'Comment'
expect(items.first).to have_content "Add a general comment to this #{resource_name}."
- expect(items.first).to have_selector '[data-testid="check-icon"]'
- expect(items.first['class']).to match 'droplab-item-selected'
+ expect(items.first).to have_selector '[data-testid="dropdown-item-checkbox"]'
expect(items.last).to have_content 'Start thread'
expect(items.last).to have_content "Discuss a specific suggestion or question#{' that needs to be resolved' if resource_name == 'merge request'}."
- expect(items.last).not_to have_selector '[data-testid="check-icon"]'
- expect(items.last['class']).not_to match 'droplab-item-selected'
+ expect(items.last).not_to have_selector '[data-testid="dropdown-item-checkbox"]'
end
it 'closes the menu when clicking the toggle or body' do
@@ -75,14 +73,14 @@ RSpec.shared_examples 'thread comments for commit and snippet' do |resource_name
expect(find(dropdown_selector)).to have_content 'Comment'
find(toggle_selector).click
- execute_script("document.querySelector('#{menu_selector} .divider').click()")
+ execute_script("document.querySelector('#{menu_selector} .dropdown-divider').click()")
else
execute_script("document.querySelector('#{menu_selector}').click()")
expect(page).to have_selector menu_selector
expect(find(dropdown_selector)).to have_content 'Comment'
- execute_script("document.querySelector('#{menu_selector} .divider').click()")
+ execute_script("document.querySelector('#{menu_selector} .dropdown-divider').click()")
expect(page).to have_selector menu_selector
end
@@ -97,7 +95,7 @@ RSpec.shared_examples 'thread comments for commit and snippet' do |resource_name
end
it 'updates the submit button text and closes the dropdown' do
- expect(find(submit_selector).value).to eq 'Start thread'
+ expect(find(submit_selector).text).to eq 'Start thread'
expect(page).not_to have_selector menu_selector
end
@@ -137,12 +135,10 @@ RSpec.shared_examples 'thread comments for commit and snippet' do |resource_name
items = all("#{menu_selector} li")
expect(items.first).to have_content 'Comment'
- expect(items.first).not_to have_selector '[data-testid="check-icon"]'
- expect(items.first['class']).not_to match 'droplab-item-selected'
+ expect(items.first).not_to have_selector '[data-testid="dropdown-item-checkbox"]'
expect(items.last).to have_content 'Start thread'
- expect(items.last).to have_selector '[data-testid="check-icon"]'
- expect(items.last['class']).to match 'droplab-item-selected'
+ expect(items.last).to have_selector '[data-testid="dropdown-item-checkbox"]'
end
describe 'when selecting "Comment"' do
@@ -153,7 +149,7 @@ RSpec.shared_examples 'thread comments for commit and snippet' do |resource_name
it 'updates the submit button text and closes the dropdown' do
button = find(submit_selector)
- expect(button.value).to eq 'Comment'
+ expect(button.text).to eq 'Comment'
expect(page).not_to have_selector menu_selector
end
@@ -166,12 +162,10 @@ RSpec.shared_examples 'thread comments for commit and snippet' do |resource_name
aggregate_failures do
expect(items.first).to have_content 'Comment'
- expect(items.first).to have_selector '[data-testid="check-icon"]'
- expect(items.first['class']).to match 'droplab-item-selected'
+ expect(items.first).to have_selector '[data-testid="dropdown-item-checkbox"]'
expect(items.last).to have_content 'Start thread'
- expect(items.last).not_to have_selector '[data-testid="check-icon"]'
- expect(items.last['class']).not_to match 'droplab-item-selected'
+ expect(items.last).not_to have_selector '[data-testid="dropdown-item-checkbox"]'
end
end
end
diff --git a/spec/support/shared_examples/features/project_upload_files_shared_examples.rb b/spec/support/shared_examples/features/project_upload_files_shared_examples.rb
index 7adf303bde4..85434ba7afd 100644
--- a/spec/support/shared_examples/features/project_upload_files_shared_examples.rb
+++ b/spec/support/shared_examples/features/project_upload_files_shared_examples.rb
@@ -1,6 +1,6 @@
# frozen_string_literal: true
-RSpec.shared_examples 'it uploads and commits a new text file' do
+RSpec.shared_examples 'it uploads and commits a new text file' do |drop: false|
it 'uploads and commits a new text file', :js do
find('.add-to-tree').click
@@ -10,7 +10,11 @@ RSpec.shared_examples 'it uploads and commits a new text file' do
wait_for_requests
end
- attach_file('upload_file', File.join(Rails.root, 'spec', 'fixtures', 'doc_sample.txt'), make_visible: true)
+ if drop
+ find(".upload-dropzone-card").drop(File.join(Rails.root, 'spec', 'fixtures', 'doc_sample.txt'))
+ else
+ attach_file('upload_file', File.join(Rails.root, 'spec', 'fixtures', 'doc_sample.txt'), make_visible: true)
+ end
page.within('#modal-upload-blob') do
fill_in(:commit_message, with: 'New commit message')
@@ -32,7 +36,7 @@ RSpec.shared_examples 'it uploads and commits a new text file' do
end
end
-RSpec.shared_examples 'it uploads and commits a new image file' do
+RSpec.shared_examples 'it uploads and commits a new image file' do |drop: false|
it 'uploads and commits a new image file', :js do
find('.add-to-tree').click
@@ -42,7 +46,11 @@ RSpec.shared_examples 'it uploads and commits a new image file' do
wait_for_requests
end
- attach_file('upload_file', File.join(Rails.root, 'spec', 'fixtures', 'logo_sample.svg'), make_visible: true)
+ if drop
+ find(".upload-dropzone-card").drop(File.join(Rails.root, 'spec', 'fixtures', 'logo_sample.svg'))
+ else
+ attach_file('upload_file', File.join(Rails.root, 'spec', 'fixtures', 'logo_sample.svg'), make_visible: true)
+ end
page.within('#modal-upload-blob') do
fill_in(:commit_message, with: 'New commit message')
@@ -58,7 +66,7 @@ RSpec.shared_examples 'it uploads and commits a new image file' do
end
end
-RSpec.shared_examples 'it uploads and commits a new pdf file' do
+RSpec.shared_examples 'it uploads and commits a new pdf file' do |drop: false|
it 'uploads and commits a new pdf file', :js do
find('.add-to-tree').click
@@ -68,7 +76,11 @@ RSpec.shared_examples 'it uploads and commits a new pdf file' do
wait_for_requests
end
- attach_file('upload_file', File.join(Rails.root, 'spec', 'fixtures', 'git-cheat-sheet.pdf'), make_visible: true)
+ if drop
+ find(".upload-dropzone-card").drop(File.join(Rails.root, 'spec', 'fixtures', 'git-cheat-sheet.pdf'))
+ else
+ attach_file('upload_file', File.join(Rails.root, 'spec', 'fixtures', 'git-cheat-sheet.pdf'), make_visible: true)
+ end
page.within('#modal-upload-blob') do
fill_in(:commit_message, with: 'New commit message')
@@ -84,7 +96,7 @@ RSpec.shared_examples 'it uploads and commits a new pdf file' do
end
end
-RSpec.shared_examples 'it uploads and commits a new file to a forked project' do
+RSpec.shared_examples 'it uploads and commits a new file to a forked project' do |drop: false|
let(:fork_message) do
"You're not allowed to make changes to this project directly. "\
"A fork of this project has been created that you can make changes in, so you can submit a merge request."
@@ -100,7 +112,12 @@ RSpec.shared_examples 'it uploads and commits a new file to a forked project' do
find('.add-to-tree').click
click_link('Upload file')
- attach_file('upload_file', File.join(Rails.root, 'spec', 'fixtures', 'doc_sample.txt'), make_visible: true)
+
+ if drop
+ find(".upload-dropzone-card").drop(File.join(Rails.root, 'spec', 'fixtures', 'doc_sample.txt'))
+ else
+ attach_file('upload_file', File.join(Rails.root, 'spec', 'fixtures', 'doc_sample.txt'), make_visible: true)
+ end
page.within('#modal-upload-blob') do
fill_in(:commit_message, with: 'New commit message')
@@ -123,7 +140,7 @@ RSpec.shared_examples 'it uploads and commits a new file to a forked project' do
end
end
-RSpec.shared_examples 'it uploads a file to a sub-directory' do
+RSpec.shared_examples 'it uploads a file to a sub-directory' do |drop: false|
it 'uploads a file to a sub-directory', :js do
click_link 'files'
@@ -133,7 +150,12 @@ RSpec.shared_examples 'it uploads a file to a sub-directory' do
find('.add-to-tree').click
click_link('Upload file')
- attach_file('upload_file', File.join(Rails.root, 'spec', 'fixtures', 'doc_sample.txt'), make_visible: true)
+
+ if drop
+ find(".upload-dropzone-card").drop(File.join(Rails.root, 'spec', 'fixtures', 'doc_sample.txt'))
+ else
+ attach_file('upload_file', File.join(Rails.root, 'spec', 'fixtures', 'doc_sample.txt'), make_visible: true)
+ end
page.within('#modal-upload-blob') do
fill_in(:commit_message, with: 'New commit message')
@@ -150,11 +172,15 @@ RSpec.shared_examples 'it uploads a file to a sub-directory' do
end
end
-RSpec.shared_examples 'uploads and commits a new text file via "upload file" button' do
+RSpec.shared_examples 'uploads and commits a new text file via "upload file" button' do |drop: false|
it 'uploads and commits a new text file via "upload file" button', :js do
find('[data-testid="upload-file-button"]').click
- attach_file('upload_file', File.join(Rails.root, 'spec', 'fixtures', 'doc_sample.txt'), make_visible: true)
+ if drop
+ find(".upload-dropzone-card").drop(File.join(Rails.root, 'spec', 'fixtures', 'doc_sample.txt'))
+ else
+ attach_file('upload_file', File.join(Rails.root, 'spec', 'fixtures', 'doc_sample.txt'), make_visible: true)
+ end
page.within('#details-modal-upload-blob') do
fill_in(:commit_message, with: 'New commit message')
diff --git a/spec/support/shared_examples/graphql/connection_shared_examples.rb b/spec/support/shared_examples/graphql/connection_shared_examples.rb
index 4cba5b5a69d..895bab1f51a 100644
--- a/spec/support/shared_examples/graphql/connection_shared_examples.rb
+++ b/spec/support/shared_examples/graphql/connection_shared_examples.rb
@@ -1,7 +1,7 @@
# frozen_string_literal: true
RSpec.shared_examples 'a connection with collection methods' do
- %i[to_a size include? empty?].each do |method_name|
+ %i[to_a size map include? empty?].each do |method_name|
it "responds to #{method_name}" do
expect(connection).to respond_to(method_name)
end
diff --git a/spec/support/shared_examples/graphql/sorted_paginated_query_shared_examples.rb b/spec/support/shared_examples/graphql/sorted_paginated_query_shared_examples.rb
index eaeb5faee3b..37a805902a9 100644
--- a/spec/support/shared_examples/graphql/sorted_paginated_query_shared_examples.rb
+++ b/spec/support/shared_examples/graphql/sorted_paginated_query_shared_examples.rb
@@ -9,7 +9,7 @@
# data_path: the keys necessary to dig into the return GraphQL data to get the
# returned results
# first_param: number of items expected (like a page size)
-# expected_results: array of comparison data of all items sorted correctly
+# all_records: array of comparison data of all items sorted correctly
# pagination_query: method that specifies the GraphQL query
# pagination_results_data: method that extracts the sorted data used to compare against
# the expected results
@@ -38,9 +38,9 @@
# let(:ordered_issues) { issues.sort_by(&:weight) }
#
# it_behaves_like 'sorted paginated query' do
-# let(:sort_param) { :WEIGHT_ASC }
-# let(:first_param) { 2 }
-# let(:expected_results) { ordered_issues.map(&:iid) }
+# let(:sort_param) { :WEIGHT_ASC }
+# let(:first_param) { 2 }
+# let(:all_records) { ordered_issues.map(&:iid) }
# end
# end
#
@@ -51,7 +51,7 @@ RSpec.shared_examples 'sorted paginated query' do |conditions = {}|
let(:node_path) { ['id'] }
it_behaves_like 'requires variables' do
- let(:required_variables) { [:sort_param, :first_param, :expected_results, :data_path, :current_user] }
+ let(:required_variables) { [:sort_param, :first_param, :all_records, :data_path, :current_user] }
end
describe do
@@ -101,13 +101,13 @@ RSpec.shared_examples 'sorted paginated query' do |conditions = {}|
context 'when sorting' do
it 'sorts correctly' do
- expect(results).to eq expected_results
+ expect(results).to eq all_records
end
context 'when paginating' do
let(:params) { sort_argument.merge(first: first_param) }
- let(:first_page) { expected_results.first(first_param) }
- let(:rest) { expected_results.drop(first_param) }
+ let(:first_page) { all_records.first(first_param) }
+ let(:rest) { all_records.drop(first_param) }
it 'paginates correctly' do
expect(results).to eq first_page
@@ -130,7 +130,7 @@ RSpec.shared_examples 'sorted paginated query' do |conditions = {}|
it 'fetches last elements without error' do
post_graphql(pagination_query(params), current_user: current_user)
- expect(results.first).to eq(expected_results.last)
+ expect(results.first).to eq(all_records.last)
end
end
end
diff --git a/spec/support/shared_examples/lib/gitlab/ci/ci_trace_shared_examples.rb b/spec/support/shared_examples/lib/gitlab/ci/ci_trace_shared_examples.rb
index 3760325675a..8b4ecd7d5ae 100644
--- a/spec/support/shared_examples/lib/gitlab/ci/ci_trace_shared_examples.rb
+++ b/spec/support/shared_examples/lib/gitlab/ci/ci_trace_shared_examples.rb
@@ -35,8 +35,8 @@ RSpec.shared_examples 'common trace features' do
stub_feature_flags(gitlab_ci_archived_trace_consistent_reads: trace.job.project)
end
- it 'calls ::Gitlab::Database::LoadBalancing::Sticking.unstick_or_continue_sticking' do
- expect(::Gitlab::Database::LoadBalancing::Sticking).to receive(:unstick_or_continue_sticking)
+ it 'calls ::ApplicationRecord.sticking.unstick_or_continue_sticking' do
+ expect(::ApplicationRecord.sticking).to receive(:unstick_or_continue_sticking)
.with(described_class::LOAD_BALANCING_STICKING_NAMESPACE, trace.job.id)
.and_call_original
@@ -49,8 +49,8 @@ RSpec.shared_examples 'common trace features' do
stub_feature_flags(gitlab_ci_archived_trace_consistent_reads: false)
end
- it 'does not call ::Gitlab::Database::LoadBalancing::Sticking.unstick_or_continue_sticking' do
- expect(::Gitlab::Database::LoadBalancing::Sticking).not_to receive(:unstick_or_continue_sticking)
+ it 'does not call ::ApplicationRecord.sticking.unstick_or_continue_sticking' do
+ expect(::ApplicationRecord.sticking).not_to receive(:unstick_or_continue_sticking)
trace.read { |stream| stream }
end
@@ -305,8 +305,8 @@ RSpec.shared_examples 'common trace features' do
stub_feature_flags(gitlab_ci_archived_trace_consistent_reads: trace.job.project)
end
- it 'calls ::Gitlab::Database::LoadBalancing::Sticking.stick' do
- expect(::Gitlab::Database::LoadBalancing::Sticking).to receive(:stick)
+ it 'calls ::ApplicationRecord.sticking.stick' do
+ expect(::ApplicationRecord.sticking).to receive(:stick)
.with(described_class::LOAD_BALANCING_STICKING_NAMESPACE, trace.job.id)
.and_call_original
@@ -319,8 +319,8 @@ RSpec.shared_examples 'common trace features' do
stub_feature_flags(gitlab_ci_archived_trace_consistent_reads: false)
end
- it 'does not call ::Gitlab::Database::LoadBalancing::Sticking.stick' do
- expect(::Gitlab::Database::LoadBalancing::Sticking).not_to receive(:stick)
+ it 'does not call ::ApplicationRecord.sticking.stick' do
+ expect(::ApplicationRecord.sticking).not_to receive(:stick)
subject
end
@@ -497,7 +497,7 @@ RSpec.shared_examples 'trace with disabled live trace feature' do
expect(build.job_artifacts_trace.file.filename).to eq('job.log')
expect(File.exist?(src_path)).to be_falsy
expect(src_checksum)
- .to eq(described_class.hexdigest(build.job_artifacts_trace.file.path))
+ .to eq(described_class.sha256_hexdigest(build.job_artifacts_trace.file.path))
expect(build.job_artifacts_trace.file_sha256).to eq(src_checksum)
end
end
@@ -523,7 +523,7 @@ RSpec.shared_examples 'trace with disabled live trace feature' do
expect(build.job_artifacts_trace.file.filename).to eq('job.log')
expect(build.old_trace).to be_nil
expect(src_checksum)
- .to eq(described_class.hexdigest(build.job_artifacts_trace.file.path))
+ .to eq(described_class.sha256_hexdigest(build.job_artifacts_trace.file.path))
expect(build.job_artifacts_trace.file_sha256).to eq(src_checksum)
end
end
@@ -861,7 +861,7 @@ RSpec.shared_examples 'trace with enabled live trace feature' do
expect(build.job_artifacts_trace.file.filename).to eq('job.log')
expect(Ci::BuildTraceChunk.where(build: build)).not_to be_exist
expect(src_checksum)
- .to eq(described_class.hexdigest(build.job_artifacts_trace.file.path))
+ .to eq(described_class.sha256_hexdigest(build.job_artifacts_trace.file.path))
expect(build.job_artifacts_trace.file_sha256).to eq(src_checksum)
end
end
diff --git a/spec/support/shared_examples/lib/gitlab/cycle_analytics/event_shared_examples.rb b/spec/support/shared_examples/lib/gitlab/cycle_analytics/event_shared_examples.rb
index 6e12b5a0e85..bd8bdd70ce5 100644
--- a/spec/support/shared_examples/lib/gitlab/cycle_analytics/event_shared_examples.rb
+++ b/spec/support/shared_examples/lib/gitlab/cycle_analytics/event_shared_examples.rb
@@ -33,3 +33,38 @@ RSpec.shared_examples_for 'value stream analytics event' do
end
end
end
+
+RSpec.shared_examples_for 'LEFT JOIN-able value stream analytics event' do
+ let(:params) { {} }
+ let(:instance) { described_class.new(params) }
+ let(:record_with_data) { nil }
+ let(:record_without_data) { nil }
+ let(:scope) { instance.object_type.all }
+
+ let(:records) do
+ scope_with_left_join = instance.include_in(scope)
+ scope_with_left_join.select(scope.model.arel_table[:id], instance.timestamp_projection.as('timestamp_column_data')).to_a
+ end
+
+ it 'can use the event as LEFT JOIN' do
+ expected_record_count = record_without_data.nil? ? 1 : 2
+
+ expect(records.count).to eq(expected_record_count)
+ end
+
+ context 'when looking at the record with data' do
+ subject(:record) { records.to_a.find { |r| r.id == record_with_data.id } }
+
+ it 'contains the timestamp expression' do
+ expect(record.timestamp_column_data).not_to eq(nil)
+ end
+ end
+
+ context 'when looking at the record without data' do
+ subject(:record) { records.to_a.find { |r| r.id == record_without_data.id } }
+
+ it 'returns nil for the timestamp expression' do
+ expect(record.timestamp_column_data).to eq(nil) if record_without_data
+ end
+ end
+end
diff --git a/spec/support/shared_examples/lib/gitlab/import_export/attributes_permitter_shared_examples.rb b/spec/support/shared_examples/lib/gitlab/import_export/attributes_permitter_shared_examples.rb
new file mode 100644
index 00000000000..5ce698c4701
--- /dev/null
+++ b/spec/support/shared_examples/lib/gitlab/import_export/attributes_permitter_shared_examples.rb
@@ -0,0 +1,40 @@
+# frozen_string_literal: true
+RSpec.shared_examples 'a permitted attribute' do |relation_sym, permitted_attributes|
+ let(:prohibited_attributes) { %i[remote_url my_attributes my_ids token my_id test] }
+
+ let(:import_export_config) { Gitlab::ImportExport::Config.new.to_h }
+ let(:project_relation_factory) { Gitlab::ImportExport::Project::RelationFactory }
+
+ let(:relation_hash) { (permitted_attributes + prohibited_attributes).map(&:to_s).zip([]).to_h }
+ let(:relation_name) { project_relation_factory.overrides[relation_sym]&.to_sym || relation_sym }
+ let(:relation_class) { project_relation_factory.relation_class(relation_name) }
+ let(:excluded_keys) { import_export_config.dig(:excluded_keys, relation_sym) || [] }
+
+ let(:cleaned_hash) do
+ Gitlab::ImportExport::AttributeCleaner.new(
+ relation_hash: relation_hash,
+ relation_class: relation_class,
+ excluded_keys: excluded_keys
+ ).clean
+ end
+
+ let(:permitted_hash) { subject.permit(relation_sym, relation_hash) }
+
+ if described_class.new.permitted_attributes_defined?(relation_sym)
+ it 'contains only attributes that are defined as permitted in the import/export config' do
+ expect(permitted_hash.keys).to contain_exactly(*permitted_attributes.map(&:to_s))
+ end
+
+ it 'does not contain attributes that would be cleaned with AttributeCleaner' do
+ expect(cleaned_hash.keys).to include(*permitted_hash.keys)
+ end
+
+ it 'does not contain prohibited attributes that are not related to given relation' do
+ expect(permitted_hash.keys).not_to include(*prohibited_attributes.map(&:to_s))
+ end
+ else
+ it 'is disabled' do
+ expect(subject).not_to be_permitted_attributes_defined(relation_sym)
+ end
+ end
+end
diff --git a/spec/support/shared_examples/metrics/active_record_subscriber_shared_examples.rb b/spec/support/shared_examples/metrics/active_record_subscriber_shared_examples.rb
index c6d6ff6bc1d..c06083ba952 100644
--- a/spec/support/shared_examples/metrics/active_record_subscriber_shared_examples.rb
+++ b/spec/support/shared_examples/metrics/active_record_subscriber_shared_examples.rb
@@ -4,14 +4,20 @@ RSpec.shared_examples 'store ActiveRecord info in RequestStore' do |db_role|
let(:db_config_name) { ::Gitlab::Database.db_config_names.first }
let(:expected_payload_defaults) do
+ result = {}
metrics =
::Gitlab::Metrics::Subscribers::ActiveRecord.load_balancing_metric_counter_keys +
- ::Gitlab::Metrics::Subscribers::ActiveRecord.load_balancing_metric_duration_keys +
::Gitlab::Metrics::Subscribers::ActiveRecord.db_counter_keys
- metrics.each_with_object({}) do |key, result|
+ metrics.each do |key|
result[key] = 0
end
+
+ ::Gitlab::Metrics::Subscribers::ActiveRecord.load_balancing_metric_duration_keys.each do |key|
+ result[key] = 0.0
+ end
+
+ result
end
def transform_hash(hash, another_hash)
@@ -36,8 +42,8 @@ RSpec.shared_examples 'store ActiveRecord info in RequestStore' do |db_role|
"db_primary_#{db_config_name}_cached_count": record_cached_query ? 1 : 0,
db_primary_count: record_query ? 1 : 0,
"db_primary_#{db_config_name}_count": record_query ? 1 : 0,
- db_primary_duration_s: record_query ? 0.002 : 0,
- "db_primary_#{db_config_name}_duration_s": record_query ? 0.002 : 0,
+ db_primary_duration_s: record_query ? 0.002 : 0.0,
+ "db_primary_#{db_config_name}_duration_s": record_query ? 0.002 : 0.0,
db_primary_wal_count: record_wal_query ? 1 : 0,
"db_primary_#{db_config_name}_wal_count": record_wal_query ? 1 : 0,
db_primary_wal_cached_count: record_wal_query && record_cached_query ? 1 : 0,
@@ -52,19 +58,29 @@ RSpec.shared_examples 'store ActiveRecord info in RequestStore' do |db_role|
"db_replica_#{db_config_name}_cached_count": record_cached_query ? 1 : 0,
db_replica_count: record_query ? 1 : 0,
"db_replica_#{db_config_name}_count": record_query ? 1 : 0,
- db_replica_duration_s: record_query ? 0.002 : 0,
- "db_replica_#{db_config_name}_duration_s": record_query ? 0.002 : 0,
+ db_replica_duration_s: record_query ? 0.002 : 0.0,
+ "db_replica_#{db_config_name}_duration_s": record_query ? 0.002 : 0.0,
db_replica_wal_count: record_wal_query ? 1 : 0,
"db_replica_#{db_config_name}_wal_count": record_wal_query ? 1 : 0,
db_replica_wal_cached_count: record_wal_query && record_cached_query ? 1 : 0,
"db_replica_#{db_config_name}_wal_cached_count": record_wal_query && record_cached_query ? 1 : 0
})
else
- {
+ transform_hash(expected_payload_defaults, {
db_count: record_query ? 1 : 0,
db_write_count: record_write_query ? 1 : 0,
- db_cached_count: record_cached_query ? 1 : 0
- }
+ db_cached_count: record_cached_query ? 1 : 0,
+ db_primary_cached_count: 0,
+ "db_primary_#{db_config_name}_cached_count": 0,
+ db_primary_count: 0,
+ "db_primary_#{db_config_name}_count": 0,
+ db_primary_duration_s: 0.0,
+ "db_primary_#{db_config_name}_duration_s": 0.0,
+ db_primary_wal_count: 0,
+ "db_primary_#{db_config_name}_wal_count": 0,
+ db_primary_wal_cached_count: 0,
+ "db_primary_#{db_config_name}_wal_cached_count": 0
+ })
end
expect(described_class.db_counter_payload).to eq(expected)
@@ -89,7 +105,7 @@ RSpec.shared_examples 'store ActiveRecord info in RequestStore' do |db_role|
end
RSpec.shared_examples 'record ActiveRecord metrics in a metrics transaction' do |db_role|
- let(:db_config_name) { ::Gitlab::Database.db_config_name(ApplicationRecord.connection) }
+ let(:db_config_name) { ::Gitlab::Database.db_config_name(ApplicationRecord.retrieve_connection) }
it 'increments only db counters' do
if record_query
diff --git a/spec/support/shared_examples/models/concerns/analytics/cycle_analytics/stage_event_model_examples.rb b/spec/support/shared_examples/models/concerns/analytics/cycle_analytics/stage_event_model_examples.rb
new file mode 100644
index 00000000000..f928fb1eb43
--- /dev/null
+++ b/spec/support/shared_examples/models/concerns/analytics/cycle_analytics/stage_event_model_examples.rb
@@ -0,0 +1,68 @@
+# frozen_string_literal: true
+
+RSpec.shared_examples 'StageEventModel' do
+ describe '.upsert_data' do
+ let(:time) { Time.parse(Time.current.to_s(:db)) } # truncating the timestamp so we can compare it with the timestamp loaded from the DB
+ let(:input_data) do
+ [
+ {
+ stage_event_hash_id: 1,
+ issuable_id: 2,
+ group_id: 3,
+ project_id: 4,
+ author_id: 5,
+ milestone_id: 6,
+ start_event_timestamp: time,
+ end_event_timestamp: time
+ },
+ {
+ stage_event_hash_id: 7,
+ issuable_id: 8,
+ group_id: 10,
+ project_id: 11,
+ author_id: 12,
+ milestone_id: 13,
+ start_event_timestamp: time,
+ end_event_timestamp: time
+ }
+ ]
+ end
+
+ let(:column_order) do
+ [
+ :stage_event_hash_id,
+ described_class.issuable_id_column,
+ :group_id,
+ :project_id,
+ :milestone_id,
+ :author_id,
+ :start_event_timestamp,
+ :end_event_timestamp
+ ]
+ end
+
+ subject(:upsert_data) { described_class.upsert_data(input_data) }
+
+ it 'inserts the data' do
+ upsert_data
+
+ expect(described_class.count).to eq(input_data.count)
+ end
+
+ it 'does not produce duplicate rows' do
+ 2.times { upsert_data }
+
+ expect(described_class.count).to eq(input_data.count)
+ end
+
+ it 'inserts the data correctly' do
+ upsert_data
+
+ output_data = described_class.all.map do |record|
+ column_order.map { |column| record[column] }
+ end.sort
+
+ expect(input_data.map(&:values).sort).to eq(output_data)
+ end
+ end
+end
diff --git a/spec/support/shared_examples/models/concerns/ttl_expirable_shared_examples.rb b/spec/support/shared_examples/models/concerns/ttl_expirable_shared_examples.rb
new file mode 100644
index 00000000000..a4e0d6c871e
--- /dev/null
+++ b/spec/support/shared_examples/models/concerns/ttl_expirable_shared_examples.rb
@@ -0,0 +1,51 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.shared_examples 'ttl_expirable' do
+ let_it_be(:class_symbol) { described_class.model_name.param_key.to_sym }
+
+ it_behaves_like 'having unique enum values'
+
+ describe 'validations' do
+ it { is_expected.to validate_presence_of(:status) }
+ end
+
+ describe '.updated_before' do
+ # rubocop:disable Rails/SaveBang
+ let_it_be_with_reload(:item1) { create(class_symbol) }
+ let_it_be(:item2) { create(class_symbol) }
+ # rubocop:enable Rails/SaveBang
+
+ before do
+ item1.update_column(:updated_at, 1.month.ago)
+ end
+
+ it 'returns items with created at older than the supplied number of days' do
+ expect(described_class.updated_before(10)).to contain_exactly(item1)
+ end
+ end
+
+ describe '.active' do
+ # rubocop:disable Rails/SaveBang
+ let_it_be(:item1) { create(class_symbol) }
+ let_it_be(:item2) { create(class_symbol, :expired) }
+ let_it_be(:item3) { create(class_symbol, status: :error) }
+ # rubocop:enable Rails/SaveBang
+
+ it 'returns only active items' do
+ expect(described_class.active).to contain_exactly(item1)
+ end
+ end
+
+ describe '.lock_next_by' do
+ let_it_be(:item1) { create(class_symbol, created_at: 1.month.ago, updated_at: 1.day.ago) }
+ let_it_be(:item2) { create(class_symbol, created_at: 1.year.ago, updated_at: 1.year.ago) }
+ let_it_be(:item3) { create(class_symbol, created_at: 2.years.ago, updated_at: 1.month.ago) }
+
+ it 'returns the first item sorted by the argument' do
+ expect(described_class.lock_next_by(:updated_at)).to contain_exactly(item2)
+ expect(described_class.lock_next_by(:created_at)).to contain_exactly(item3)
+ end
+ end
+end
diff --git a/spec/support/shared_examples/models/packages/debian/distribution_shared_examples.rb b/spec/support/shared_examples/models/packages/debian/distribution_shared_examples.rb
index 274fbae3dfd..750d3dd11e3 100644
--- a/spec/support/shared_examples/models/packages/debian/distribution_shared_examples.rb
+++ b/spec/support/shared_examples/models/packages/debian/distribution_shared_examples.rb
@@ -193,42 +193,6 @@ RSpec.shared_examples 'Debian Distribution' do |factory, container, can_freeze|
end
end
- describe '#needs_update?' do
- subject { distribution.needs_update? }
-
- context 'with new distribution' do
- let(:distribution) { create(factory, container: distribution_with_suite.container) }
-
- it { is_expected.to be_truthy }
- end
-
- context 'with file' do
- context 'without valid_time_duration_seconds' do
- let(:distribution) { create(factory, :with_file, container: distribution_with_suite.container) }
-
- it { is_expected.to be_falsey }
- end
-
- context 'with valid_time_duration_seconds' do
- let(:distribution) { create(factory, :with_file, container: distribution_with_suite.container, valid_time_duration_seconds: 2.days.to_i) }
-
- context 'when not yet expired' do
- it { is_expected.to be_falsey }
- end
-
- context 'when expired' do
- it do
- distribution
-
- travel_to(4.days.from_now) do
- is_expected.to be_truthy
- end
- end
- end
- end
- end
- end
-
if container == :project
describe 'project distribution specifics' do
describe 'relationships' do
diff --git a/spec/support/shared_examples/requests/api/composer_packages_shared_examples.rb b/spec/support/shared_examples/requests/api/composer_packages_shared_examples.rb
index b86c0529338..e45be21f152 100644
--- a/spec/support/shared_examples/requests/api/composer_packages_shared_examples.rb
+++ b/spec/support/shared_examples/requests/api/composer_packages_shared_examples.rb
@@ -85,7 +85,18 @@ RSpec.shared_examples 'Composer package creation' do |user_type, status, add_mem
expect(response).to have_gitlab_http_status(status)
end
+
it_behaves_like 'a package tracking event', described_class.name, 'push_package'
+
+ context 'when package creation fails' do
+ before do
+ allow_next_instance_of(::Packages::Composer::CreatePackageService) do |create_package_service|
+ allow(create_package_service).to receive(:execute).and_raise(StandardError)
+ end
+ end
+
+ it_behaves_like 'not a package tracking event'
+ end
end
end
diff --git a/spec/support/shared_examples/requests/api/container_repositories_shared_examples.rb b/spec/support/shared_examples/requests/api/container_repositories_shared_examples.rb
index e776cf13217..e1e75be2494 100644
--- a/spec/support/shared_examples/requests/api/container_repositories_shared_examples.rb
+++ b/spec/support/shared_examples/requests/api/container_repositories_shared_examples.rb
@@ -79,3 +79,40 @@ RSpec.shared_examples 'returns repositories for allowed users' do |user_type, sc
end
end
end
+
+RSpec.shared_examples 'handling network errors with the container registry' do
+ before do
+ stub_container_registry_network_error(client_method: :repository_tags)
+ end
+
+ it 'returns a connection error' do
+ subject
+
+ expect(response).to have_gitlab_http_status(:service_unavailable)
+ expect(json_response['message']).to include('We are having trouble connecting to the Container Registry')
+ end
+end
+
+RSpec.shared_examples 'handling graphql network errors with the container registry' do
+ before do
+ stub_container_registry_network_error(client_method: :repository_tags)
+ end
+
+ it 'returns a connection error' do
+ subject
+
+ expect_graphql_errors_to_include('We are having trouble connecting to the Container Registry')
+ end
+end
+
+RSpec.shared_examples 'not hitting graphql network errors with the container registry' do
+ before do
+ stub_container_registry_network_error(client_method: :repository_tags)
+ end
+
+ it 'does not return any error' do
+ subject
+
+ expect_graphql_errors_to_be_empty
+ end
+end
diff --git a/spec/support/shared_examples/requests/api/graphql/group_and_project_boards_query_shared_examples.rb b/spec/support/shared_examples/requests/api/graphql/group_and_project_boards_query_shared_examples.rb
index 274516cd87b..01ed6c26576 100644
--- a/spec/support/shared_examples/requests/api/graphql/group_and_project_boards_query_shared_examples.rb
+++ b/spec/support/shared_examples/requests/api/graphql/group_and_project_boards_query_shared_examples.rb
@@ -62,9 +62,10 @@ RSpec.shared_examples 'group and project boards query' do
context 'when ascending' do
it_behaves_like 'sorted paginated query' do
- let(:sort_param) { }
- let(:first_param) { 2 }
- let(:expected_results) do
+ let(:sort_param) { }
+ let(:first_param) { 2 }
+
+ let(:all_records) do
if board_parent.multiple_issue_boards_available?
boards.map { |board| global_id_of(board) }
else
diff --git a/spec/support/shared_examples/requests/api/graphql/packages/group_and_project_packages_list_shared_examples.rb b/spec/support/shared_examples/requests/api/graphql/packages/group_and_project_packages_list_shared_examples.rb
index af4c9286e7c..367c6d4fa3a 100644
--- a/spec/support/shared_examples/requests/api/graphql/packages/group_and_project_packages_list_shared_examples.rb
+++ b/spec/support/shared_examples/requests/api/graphql/packages/group_and_project_packages_list_shared_examples.rb
@@ -17,9 +17,11 @@ RSpec.shared_examples 'group and project packages query' do
let(:package_names) { graphql_data_at(resource_type, :packages, :nodes, :name) }
let(:target_shas) { graphql_data_at(resource_type, :packages, :nodes, :metadata, :target_sha) }
let(:packages) { graphql_data_at(resource_type, :packages, :nodes) }
+ let(:packages_count) { graphql_data_at(resource_type, :packages, :count) }
let(:fields) do
<<~QUERY
+ count
nodes {
#{all_graphql_fields_for('packages'.classify, excluded: ['project'])}
metadata { #{query_graphql_fragment('ComposerMetadata')} }
@@ -55,6 +57,10 @@ RSpec.shared_examples 'group and project packages query' do
it 'deals with metadata' do
expect(target_shas).to contain_exactly(composer_metadatum.target_sha)
end
+
+ it 'returns the count of the packages' do
+ expect(packages_count).to eq(4)
+ end
end
context 'when the user does not have access to the resource' do
@@ -95,7 +101,7 @@ RSpec.shared_examples 'group and project packages query' do
it_behaves_like 'sorted paginated query' do
let(:sort_param) { order }
let(:first_param) { 4 }
- let(:expected_results) { ascending_packages }
+ let(:all_records) { ascending_packages }
end
end
end
@@ -105,7 +111,7 @@ RSpec.shared_examples 'group and project packages query' do
it_behaves_like 'sorted paginated query' do
let(:sort_param) { order }
let(:first_param) { 4 }
- let(:expected_results) { ascending_packages.reverse }
+ let(:all_records) { ascending_packages.reverse }
end
end
end
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
new file mode 100644
index 00000000000..9f67bd69560
--- /dev/null
+++ b/spec/support/shared_examples/requests/api/issuable_search_shared_examples.rb
@@ -0,0 +1,36 @@
+# frozen_string_literal: true
+
+RSpec.shared_examples 'issuable anonymous search' do
+ context 'with anonymous user' do
+ context 'with disable_anonymous_search disabled' do
+ before do
+ stub_feature_flags(disable_anonymous_search: false)
+ end
+
+ it 'returns issuables matching given search string for title' do
+ get api(url), params: { scope: 'all', search: issuable.title }
+
+ expect_paginated_array_response(result)
+ end
+
+ it 'returns issuables matching given search string for description' do
+ get api(url), params: { scope: 'all', search: issuable.description }
+
+ expect_paginated_array_response(result)
+ end
+ end
+
+ context 'with disable_anonymous_search enabled' do
+ before do
+ stub_feature_flags(disable_anonymous_search: true)
+ end
+
+ it "returns 422 error" do
+ get api(url), params: { scope: 'all', search: issuable.title }
+
+ expect(response).to have_gitlab_http_status(:unprocessable_entity)
+ expect(json_response['message']).to eq('User must be authenticated to use search')
+ end
+ end
+ end
+end
diff --git a/spec/support/shared_examples/requests/api/logging_application_context_shared_examples.rb b/spec/support/shared_examples/requests/api/logging_application_context_shared_examples.rb
index cb06c9fa596..3e9c4a5eb68 100644
--- a/spec/support/shared_examples/requests/api/logging_application_context_shared_examples.rb
+++ b/spec/support/shared_examples/requests/api/logging_application_context_shared_examples.rb
@@ -15,6 +15,22 @@ RSpec.shared_examples 'storing arguments in the application context' do
end
end
+# For the API we need a slightly different approach as `client_id` is
+# calculated in API logging code.
+RSpec.shared_examples 'storing arguments in the application context for the API' do
+ it 'places the expected params in the application context' do
+ expect(::API::API::LOG_FORMATTER).to receive(:call) do
+ expect(Gitlab::ApplicationContext.current).to include(log_hash(expected_params))
+ end
+
+ subject
+ end
+
+ def log_hash(hash)
+ hash.transform_keys! { |key| "meta.#{key}" }
+ end
+end
+
RSpec.shared_examples 'not executing any extra queries for the application context' do |expected_extra_queries = 0|
it 'does not execute more queries than without adding anything to the application context' do
# Call the subject once to memoize all factories being used for the spec, so they won't
diff --git a/spec/support/shared_examples/requests/rack_attack_shared_examples.rb b/spec/support/shared_examples/requests/rack_attack_shared_examples.rb
index 2a19ff6f590..b294467d482 100644
--- a/spec/support/shared_examples/requests/rack_attack_shared_examples.rb
+++ b/spec/support/shared_examples/requests/rack_attack_shared_examples.rb
@@ -1,7 +1,7 @@
# frozen_string_literal: true
#
# Requires let variables:
-# * throttle_setting_prefix: "throttle_authenticated_api", "throttle_authenticated_web", "throttle_protected_paths", "throttle_authenticated_packages_api", "throttle_authenticated_git_lfs", "throttle_authenticated_files_api"
+# * throttle_setting_prefix: "throttle_authenticated_api", "throttle_authenticated_web", "throttle_protected_paths", "throttle_authenticated_packages_api", "throttle_authenticated_git_lfs", "throttle_authenticated_files_api", "throttle_authenticated_deprecated_api"
# * request_method
# * request_args
# * other_user_request_args
@@ -16,7 +16,8 @@ RSpec.shared_examples 'rate-limited token-authenticated requests' do
"throttle_authenticated_web" => "throttle_authenticated_web",
"throttle_authenticated_packages_api" => "throttle_authenticated_packages_api",
"throttle_authenticated_git_lfs" => "throttle_authenticated_git_lfs",
- "throttle_authenticated_files_api" => "throttle_authenticated_files_api"
+ "throttle_authenticated_files_api" => "throttle_authenticated_files_api",
+ "throttle_authenticated_deprecated_api" => "throttle_authenticated_deprecated_api"
}
end
diff --git a/spec/support/shared_examples/services/dependency_proxy_settings_shared_examples.rb b/spec/support/shared_examples/services/dependency_proxy_settings_shared_examples.rb
new file mode 100644
index 00000000000..2c1dc2da560
--- /dev/null
+++ b/spec/support/shared_examples/services/dependency_proxy_settings_shared_examples.rb
@@ -0,0 +1,8 @@
+# frozen_string_literal: true
+
+RSpec.shared_examples 'updating the dependency proxy group settings attributes' do |from: {}, to: {}|
+ it 'updates the dependency proxy settings' do
+ expect { subject }
+ .to change { group_settings.reload.enabled }.from(from[:enabled]).to(to[:enabled])
+ end
+end
diff --git a/spec/support/shared_examples/workers/concerns/dependency_proxy/cleanup_worker_shared_examples.rb b/spec/support/shared_examples/workers/concerns/dependency_proxy/cleanup_worker_shared_examples.rb
new file mode 100644
index 00000000000..c9014ad549c
--- /dev/null
+++ b/spec/support/shared_examples/workers/concerns/dependency_proxy/cleanup_worker_shared_examples.rb
@@ -0,0 +1,53 @@
+# frozen_string_literal: true
+
+RSpec.shared_examples 'dependency_proxy_cleanup_worker' do
+ let_it_be(:group) { create(:group) }
+
+ let(:worker) { described_class.new }
+
+ describe '#perform_work' do
+ subject(:perform_work) { worker.perform_work }
+
+ context 'with no work to do' do
+ it { is_expected.to be_nil }
+ end
+
+ context 'with work to do' do
+ let_it_be(:artifact1) { create(factory_type, :expired, group: group) }
+ let_it_be(:artifact2) { create(factory_type, :expired, group: group, updated_at: 6.months.ago, created_at: 2.years.ago) }
+ let_it_be_with_reload(:artifact3) { create(factory_type, :expired, group: group, updated_at: 1.year.ago, created_at: 1.year.ago) }
+ let_it_be(:artifact4) { create(factory_type, group: group, updated_at: 2.years.ago, created_at: 2.years.ago) }
+
+ it 'deletes the oldest expired artifact based on updated_at', :aggregate_failures do
+ expect(worker).to receive(:log_extra_metadata_on_done).with("#{factory_type}_id".to_sym, artifact3.id)
+ expect(worker).to receive(:log_extra_metadata_on_done).with(:group_id, group.id)
+
+ expect { perform_work }.to change { artifact1.class.count }.by(-1)
+ end
+ end
+ end
+
+ describe '#max_running_jobs' do
+ let(:capacity) { 5 }
+
+ subject { worker.max_running_jobs }
+
+ before do
+ stub_application_setting(dependency_proxy_ttl_group_policy_worker_capacity: capacity)
+ end
+
+ it { is_expected.to eq(capacity) }
+ end
+
+ describe '#remaining_work_count' do
+ let_it_be(:expired_artifacts) do
+ (1..3).map do |_|
+ create(factory_type, :expired, group: group)
+ end
+ end
+
+ subject { worker.remaining_work_count }
+
+ it { is_expected.to eq(3) }
+ end
+end
diff --git a/spec/support/shared_examples/workers/concerns/reenqueuer_shared_examples.rb b/spec/support/shared_examples/workers/concerns/reenqueuer_shared_examples.rb
index 1b09b5fe613..d6e96ef37d6 100644
--- a/spec/support/shared_examples/workers/concerns/reenqueuer_shared_examples.rb
+++ b/spec/support/shared_examples/workers/concerns/reenqueuer_shared_examples.rb
@@ -1,11 +1,14 @@
# frozen_string_literal: true
-# Expects `subject` to be a job/worker instance
+# Expects `subject` to be a job/worker instance and
+# `job_args` to be arguments to #perform if it takes arguments
RSpec.shared_examples 'reenqueuer' do
before do
allow(subject).to receive(:sleep) # faster tests
end
+ let(:subject_perform) { defined?(job_args) ? subject.perform(job_args) : subject.perform }
+
it 'implements lease_timeout' do
expect(subject.lease_timeout).to be_a(ActiveSupport::Duration)
end
@@ -18,12 +21,13 @@ RSpec.shared_examples 'reenqueuer' do
it 'tries to obtain a lease' do
expect_to_obtain_exclusive_lease(subject.lease_key)
- subject.perform
+ subject_perform
end
end
end
-# Expects `subject` to be a job/worker instance
+# Expects `subject` to be a job/worker instance and
+# `job_args` to be arguments to #perform if it takes arguments
RSpec.shared_examples '#perform is rate limited to 1 call per' do |minimum_duration|
before do
# Allow Timecop freeze and travel without the block form
@@ -38,13 +42,15 @@ RSpec.shared_examples '#perform is rate limited to 1 call per' do |minimum_durat
Timecop.safe_mode = true
end
+ let(:subject_perform) { defined?(job_args) ? subject.perform(job_args) : subject.perform }
+
context 'when the work finishes in 0 seconds' do
let(:actual_duration) { 0 }
it 'sleeps exactly the minimum duration' do
expect(subject).to receive(:sleep).with(a_value_within(0.01).of(minimum_duration))
- subject.perform
+ subject_perform
end
end
@@ -54,7 +60,7 @@ RSpec.shared_examples '#perform is rate limited to 1 call per' do |minimum_durat
it 'sleeps 90% of minimum duration' do
expect(subject).to receive(:sleep).with(a_value_within(0.01).of(0.9 * minimum_duration))
- subject.perform
+ subject_perform
end
end
@@ -64,7 +70,7 @@ RSpec.shared_examples '#perform is rate limited to 1 call per' do |minimum_durat
it 'sleeps 10% of minimum duration' do
expect(subject).to receive(:sleep).with(a_value_within(0.01).of(0.1 * minimum_duration))
- subject.perform
+ subject_perform
end
end
@@ -74,7 +80,7 @@ RSpec.shared_examples '#perform is rate limited to 1 call per' do |minimum_durat
it 'does not sleep' do
expect(subject).not_to receive(:sleep)
- subject.perform
+ subject_perform
end
end
@@ -84,7 +90,7 @@ RSpec.shared_examples '#perform is rate limited to 1 call per' do |minimum_durat
it 'does not sleep' do
expect(subject).not_to receive(:sleep)
- subject.perform
+ subject_perform
end
end
@@ -94,7 +100,7 @@ RSpec.shared_examples '#perform is rate limited to 1 call per' do |minimum_durat
it 'does not sleep' do
expect(subject).not_to receive(:sleep)
- subject.perform
+ subject_perform
end
end
diff --git a/spec/support_specs/database/multiple_databases_spec.rb b/spec/support_specs/database/multiple_databases_spec.rb
new file mode 100644
index 00000000000..6ad15fd6594
--- /dev/null
+++ b/spec/support_specs/database/multiple_databases_spec.rb
@@ -0,0 +1,59 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe 'Database::MultipleDatabases' do
+ describe '.with_reestablished_active_record_base' do
+ context 'when doing establish_connection' do
+ context 'on ActiveRecord::Base' do
+ it 'raises exception' do
+ expect { ActiveRecord::Base.establish_connection(:main) }.to raise_error /Cannot re-establish/
+ end
+
+ context 'when using with_reestablished_active_record_base' do
+ it 'does not raise exception' do
+ with_reestablished_active_record_base do
+ expect { ActiveRecord::Base.establish_connection(:main) }.not_to raise_error
+ end
+ end
+ end
+ end
+
+ context 'on Ci::CiDatabaseRecord' do
+ before do
+ skip_if_multiple_databases_not_setup
+ end
+
+ it 'raises exception' do
+ expect { Ci::CiDatabaseRecord.establish_connection(:ci) }.to raise_error /Cannot re-establish/
+ end
+
+ context 'when using with_reestablished_active_record_base' do
+ it 'does not raise exception' do
+ with_reestablished_active_record_base do
+ expect { Ci::CiDatabaseRecord.establish_connection(:main) }.not_to raise_error
+ end
+ end
+ end
+ end
+ end
+
+ context 'when trying to access connection' do
+ context 'when reconnect is true' do
+ it 'does not raise exception' do
+ with_reestablished_active_record_base(reconnect: true) do
+ expect { ActiveRecord::Base.connection.execute("SELECT 1") }.not_to raise_error # rubocop:disable Database/MultipleDatabases
+ end
+ end
+ end
+
+ context 'when reconnect is false' do
+ it 'does raise exception' do
+ with_reestablished_active_record_base(reconnect: false) do
+ expect { ActiveRecord::Base.connection.execute("SELECT 1") }.to raise_error(ActiveRecord::ConnectionNotEstablished) # rubocop:disable Database/MultipleDatabases
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/spec/support_specs/database/prevent_cross_joins_spec.rb b/spec/support_specs/database/prevent_cross_joins_spec.rb
index e9a95fe77a5..0fbcd190c2c 100644
--- a/spec/support_specs/database/prevent_cross_joins_spec.rb
+++ b/spec/support_specs/database/prevent_cross_joins_spec.rb
@@ -22,6 +22,12 @@ RSpec.describe Database::PreventCrossJoins do
described_class::CrossJoinAcrossUnsupportedTablesError)
end
+ context 'when annotation is used' do
+ it 'does not raise exception' do
+ expect { main_and_ci_allowed_via_annotate }.not_to raise_error
+ end
+ end
+
context 'when allow_cross_joins_across_databases is used' do
it 'does not raise exception' do
expect { main_and_ci_query_allowlisted }.not_to raise_error
@@ -52,6 +58,12 @@ RSpec.describe Database::PreventCrossJoins do
end
end
+ def main_and_ci_allowed_via_annotate
+ main_and_ci_query do |relation|
+ relation.allow_cross_joins_across_databases(url: 'http://issue-url')
+ end
+ end
+
def main_only_query
Issue.joins(:project).last
end
@@ -61,6 +73,8 @@ RSpec.describe Database::PreventCrossJoins do
end
def main_and_ci_query
- Ci::Build.joins(:project).last
+ relation = Ci::Build.joins(:project)
+ relation = yield(relation) if block_given?
+ relation.last
end
end
diff --git a/spec/tasks/gitlab/db_rake_spec.rb b/spec/tasks/gitlab/db_rake_spec.rb
index 91cd09fc6e6..ad4ada9a9f1 100644
--- a/spec/tasks/gitlab/db_rake_spec.rb
+++ b/spec/tasks/gitlab/db_rake_spec.rb
@@ -293,53 +293,24 @@ RSpec.describe 'gitlab:db namespace rake task', :silence_stdout do
end
describe '#migrate_with_instrumentation' do
- subject { run_rake_task('gitlab:db:migration_testing') }
+ describe '#up' do
+ subject { run_rake_task('gitlab:db:migration_testing:up') }
- let(:ctx) { double('ctx', migrations: all_migrations, schema_migration: double, get_all_versions: existing_versions) }
- let(:instrumentation) { instance_double(Gitlab::Database::Migrations::Instrumentation, observations: observations) }
- let(:existing_versions) { [1] }
- let(:all_migrations) { [double('migration1', version: 1, name: 'test'), pending_migration] }
- let(:pending_migration) { double('migration2', version: 2, name: 'test') }
- let(:filename) { Gitlab::Database::Migrations::Instrumentation::STATS_FILENAME }
- let(:result_dir) { Dir.mktmpdir }
- let(:observations) { %w[some data] }
+ it 'delegates to the migration runner' do
+ expect(::Gitlab::Database::Migrations::Runner).to receive_message_chain(:up, :run)
- before do
- allow(ActiveRecord::Base.connection).to receive(:migration_context).and_return(ctx)
- allow(Gitlab::Database::Migrations::Instrumentation).to receive(:new).and_return(instrumentation)
- allow(ActiveRecord::Migrator).to receive_message_chain('new.run').with(any_args).with(no_args)
-
- allow(instrumentation).to receive(:observe).and_yield
-
- stub_const('Gitlab::Database::Migrations::Instrumentation::RESULT_DIR', result_dir)
- end
-
- after do
- FileUtils.rm_rf(result_dir)
- end
-
- it 'creates result directory when one does not exist' do
- FileUtils.rm_rf(result_dir)
-
- expect { subject }.to change { Dir.exist?(result_dir) }.from(false).to(true)
- end
-
- it 'instruments the pending migration' do
- expect(instrumentation).to receive(:observe).with(version: 2, name: 'test').and_yield
-
- subject
+ subject
+ end
end
- it 'executes the pending migration' do
- expect(ActiveRecord::Migrator).to receive_message_chain('new.run').with(:up, ctx.migrations, ctx.schema_migration, pending_migration.version).with(no_args)
+ describe '#down' do
+ subject { run_rake_task('gitlab:db:migration_testing:down') }
- subject
- end
-
- it 'writes observations out to JSON file' do
- subject
+ it 'delegates to the migration runner' do
+ expect(::Gitlab::Database::Migrations::Runner).to receive_message_chain(:down, :run)
- expect(File.read(File.join(result_dir, filename))).to eq(observations.to_json)
+ subject
+ end
end
end
diff --git a/spec/tasks/gitlab/packages/composer_rake_spec.rb b/spec/tasks/gitlab/packages/composer_rake_spec.rb
deleted file mode 100644
index f4f43bf77d8..00000000000
--- a/spec/tasks/gitlab/packages/composer_rake_spec.rb
+++ /dev/null
@@ -1,29 +0,0 @@
-# frozen_string_literal: true
-
-require 'rake_helper'
-
-RSpec.describe 'gitlab:packages:build_composer_cache namespace rake task', :silence_stdout do
- let_it_be(:package_name) { 'sample-project' }
- let_it_be(:package_name2) { 'sample-project2' }
- let_it_be(:json) { { 'name' => package_name } }
- let_it_be(:json2) { { 'name' => package_name2 } }
- let_it_be(:group) { create(:group) }
- let_it_be(:project) { create(:project, :custom_repo, files: { 'composer.json' => json.to_json }, group: group) }
- let_it_be(:project2) { create(:project, :custom_repo, files: { 'composer.json' => json2.to_json }, group: group) }
-
- let!(:package) { create(:composer_package, :with_metadatum, project: project, name: package_name, version: '1.0.0', json: json) }
- let!(:package2) { create(:composer_package, :with_metadatum, project: project, name: package_name, version: '2.0.0', json: json) }
- let!(:package3) { create(:composer_package, :with_metadatum, project: project2, name: package_name2, version: '3.0.0', json: json2) }
-
- before :all do
- Rake.application.rake_require 'tasks/gitlab/packages/composer'
- end
-
- subject do
- run_rake_task("gitlab:packages:build_composer_cache")
- end
-
- it 'generates the cache files' do
- expect { subject }.to change { Packages::Composer::CacheFile.count }.by(2)
- end
-end
diff --git a/spec/tooling/danger/product_intelligence_spec.rb b/spec/tooling/danger/product_intelligence_spec.rb
index 4ab911b6590..5fd44ef5de0 100644
--- a/spec/tooling/danger/product_intelligence_spec.rb
+++ b/spec/tooling/danger/product_intelligence_spec.rb
@@ -59,6 +59,14 @@ RSpec.describe Tooling::Danger::ProductIntelligence do
it { is_expected.to be_empty }
end
+
+ context 'with growth experiment label' do
+ before do
+ allow(fake_helper).to receive(:mr_has_labels?).with('growth experiment').and_return(true)
+ end
+
+ it { is_expected.to be_empty }
+ end
end
describe '#matching_changed_files' do
@@ -74,7 +82,7 @@ RSpec.describe Tooling::Danger::ProductIntelligence do
context 'with snowplow files changed' do
context 'when vue file changed' do
- let(:changed_lines) { ['+data-track-event'] }
+ let(:changed_lines) { ['+data-track-action'] }
it { is_expected.to match_array(['components/welcome.vue']) }
end
diff --git a/spec/tooling/danger/project_helper_spec.rb b/spec/tooling/danger/project_helper_spec.rb
index c7715eb43fc..5edd9e54cc5 100644
--- a/spec/tooling/danger/project_helper_spec.rb
+++ b/spec/tooling/danger/project_helper_spec.rb
@@ -93,6 +93,9 @@ RSpec.describe Tooling::Danger::ProjectHelper do
'ee/spec/foo' | [:backend]
'ee/spec/foo/bar' | [:backend]
+ 'spec/migrations/foo' | [:database]
+ 'ee/spec/migrations/foo' | [:database]
+
'spec/features/foo' | [:test]
'ee/spec/features/foo' | [:test]
'spec/support/shared_examples/features/foo' | [:test]
@@ -277,4 +280,17 @@ RSpec.describe Tooling::Danger::ProjectHelper do
is_expected.to eq('gitlab-foss')
end
end
+
+ describe '#file_lines' do
+ let(:filename) { 'spec/foo_spec.rb' }
+ let(:file_spy) { spy }
+
+ it 'returns the chomped file lines' do
+ expect(project_helper).to receive(:read_file).with(filename).and_return(file_spy)
+
+ project_helper.file_lines(filename)
+
+ expect(file_spy).to have_received(:lines).with(chomp: true)
+ end
+ end
end
diff --git a/spec/tooling/danger/specs_spec.rb b/spec/tooling/danger/specs_spec.rb
new file mode 100644
index 00000000000..a5978020c9d
--- /dev/null
+++ b/spec/tooling/danger/specs_spec.rb
@@ -0,0 +1,133 @@
+# frozen_string_literal: true
+
+require 'rspec-parameterized'
+require 'gitlab-dangerfiles'
+require 'danger'
+require 'danger/plugins/helper'
+require 'gitlab/dangerfiles/spec_helper'
+
+require_relative '../../../tooling/danger/specs'
+require_relative '../../../tooling/danger/project_helper'
+
+RSpec.describe Tooling::Danger::Specs do
+ include_context "with dangerfile"
+
+ let(:fake_danger) { DangerSpecHelper.fake_danger.include(described_class) }
+ let(:fake_project_helper) { double('fake-project-helper', helper: fake_helper).tap { |h| h.class.include(Tooling::Danger::ProjectHelper) } }
+ let(:file_lines) do
+ [
+ " describe 'foo' do",
+ " expect(foo).to match(['bar'])",
+ " end",
+ " expect(foo).to match(['bar'])", # same line as line 1 above, we expect two different suggestions
+ " ",
+ " expect(foo).to match ['bar']",
+ " expect(foo).to eq(['bar'])",
+ " expect(foo).to eq ['bar']",
+ " expect(foo).to(match(['bar']))",
+ " expect(foo).to(eq(['bar']))",
+ " foo.eq(['bar'])"
+ ]
+ end
+
+ let(:matching_lines) do
+ [
+ "+ expect(foo).to match(['bar'])",
+ "+ expect(foo).to match(['bar'])",
+ "+ expect(foo).to match ['bar']",
+ "+ expect(foo).to eq(['bar'])",
+ "+ expect(foo).to eq ['bar']",
+ "+ expect(foo).to(match(['bar']))",
+ "+ expect(foo).to(eq(['bar']))"
+ ]
+ end
+
+ subject(:specs) { fake_danger.new(helper: fake_helper) }
+
+ before do
+ allow(specs).to receive(:project_helper).and_return(fake_project_helper)
+ end
+
+ describe '#add_suggestions_for_match_with_array' do
+ let(:filename) { 'spec/foo_spec.rb' }
+
+ before do
+ expect(specs).to receive(:added_line_matching_match_with_array).and_return(matching_lines)
+ allow(specs.project_helper).to receive(:file_lines).and_return(file_lines)
+ end
+
+ it 'adds suggestions at the correct lines' do
+ expect(specs).to receive(:markdown).with(format(described_class::SUGGEST_MR_COMMENT, suggested_line: " expect(foo).to match_array(['bar'])"), file: filename, line: 2)
+ expect(specs).to receive(:markdown).with(format(described_class::SUGGEST_MR_COMMENT, suggested_line: " expect(foo).to match_array(['bar'])"), file: filename, line: 4)
+ expect(specs).to receive(:markdown).with(format(described_class::SUGGEST_MR_COMMENT, suggested_line: " expect(foo).to match_array ['bar']"), file: filename, line: 6)
+ expect(specs).to receive(:markdown).with(format(described_class::SUGGEST_MR_COMMENT, suggested_line: " expect(foo).to match_array(['bar'])"), file: filename, line: 7)
+ expect(specs).to receive(:markdown).with(format(described_class::SUGGEST_MR_COMMENT, suggested_line: " expect(foo).to match_array ['bar']"), file: filename, line: 8)
+ expect(specs).to receive(:markdown).with(format(described_class::SUGGEST_MR_COMMENT, suggested_line: " expect(foo).to(match_array(['bar']))"), file: filename, line: 9)
+ expect(specs).to receive(:markdown).with(format(described_class::SUGGEST_MR_COMMENT, suggested_line: " expect(foo).to(match_array(['bar']))"), file: filename, line: 10)
+
+ specs.add_suggestions_for_match_with_array(filename)
+ end
+ end
+
+ describe '#changed_specs_files' do
+ let(:base_expected_files) { %w[spec/foo_spec.rb ee/spec/foo_spec.rb spec/bar_spec.rb ee/spec/bar_spec.rb spec/zab_spec.rb ee/spec/zab_spec.rb] }
+
+ before do
+ all_changed_files = %w[
+ app/workers/a.rb
+ app/workers/b.rb
+ app/workers/e.rb
+ spec/foo_spec.rb
+ ee/spec/foo_spec.rb
+ spec/bar_spec.rb
+ ee/spec/bar_spec.rb
+ spec/zab_spec.rb
+ ee/spec/zab_spec.rb
+ ]
+
+ allow(specs.helper).to receive(:all_changed_files).and_return(all_changed_files)
+ end
+
+ it 'returns added, modified, and renamed_after files by default' do
+ expect(specs.changed_specs_files).to match_array(base_expected_files)
+ end
+
+ context 'with include_ee: :exclude' do
+ it 'returns spec files without EE-specific files' do
+ expect(specs.changed_specs_files(ee: :exclude)).not_to include(%w[ee/spec/foo_spec.rb ee/spec/bar_spec.rb ee/spec/zab_spec.rb])
+ end
+ end
+
+ context 'with include_ee: :only' do
+ it 'returns EE-specific spec files only' do
+ expect(specs.changed_specs_files(ee: :only)).to match_array(%w[ee/spec/foo_spec.rb ee/spec/bar_spec.rb ee/spec/zab_spec.rb])
+ end
+ end
+ end
+
+ describe '#added_line_matching_match_with_array' do
+ let(:filename) { 'spec/foo_spec.rb' }
+ let(:changed_lines) do
+ [
+ " expect(foo).to match(['bar'])",
+ " expect(foo).to match(['bar'])",
+ " expect(foo).to match ['bar']",
+ " expect(foo).to eq(['bar'])",
+ " expect(foo).to eq ['bar']",
+ "- expect(foo).to match(['bar'])",
+ "- expect(foo).to match(['bar'])",
+ "- expect(foo).to match ['bar']",
+ "- expect(foo).to eq(['bar'])",
+ "- expect(foo).to eq ['bar']"
+ ] + matching_lines
+ end
+
+ before do
+ allow(specs.helper).to receive(:changed_lines).with(filename).and_return(changed_lines)
+ end
+
+ it 'returns added, modified, and renamed_after files by default' do
+ expect(specs.added_line_matching_match_with_array(filename)).to match_array(matching_lines)
+ end
+ end
+end
diff --git a/spec/tooling/quality/test_level_spec.rb b/spec/tooling/quality/test_level_spec.rb
index 89abe337347..0623a67a60e 100644
--- a/spec/tooling/quality/test_level_spec.rb
+++ b/spec/tooling/quality/test_level_spec.rb
@@ -63,7 +63,14 @@ RSpec.describe Quality::TestLevel do
context 'with a prefix' do
it 'returns a pattern' do
expect(described_class.new('ee/').pattern(:system))
- .to eq("ee/spec/{features}{,/**/}*_spec.rb")
+ .to eq("{ee/}spec/{features}{,/**/}*_spec.rb")
+ end
+ end
+
+ context 'with several prefixes' do
+ it 'returns a pattern' do
+ expect(described_class.new(['', 'ee/', 'jh/']).pattern(:system))
+ .to eq("{,ee/,jh/}spec/{features}{,/**/}*_spec.rb")
end
end
@@ -138,7 +145,14 @@ RSpec.describe Quality::TestLevel do
context 'with a prefix' do
it 'returns a regexp' do
expect(described_class.new('ee/').regexp(:system))
- .to eq(%r{ee/spec/(features)})
+ .to eq(%r{(ee/)spec/(features)})
+ end
+ end
+
+ context 'with several prefixes' do
+ it 'returns a regexp' do
+ expect(described_class.new(['', 'ee/', 'jh/']).regexp(:system))
+ .to eq(%r{(|ee/|jh/)spec/(features)})
end
end
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 2c37565328a..d4e97d96dfd 100644
--- a/spec/views/layouts/nav/sidebar/_admin.html.haml_spec.rb
+++ b/spec/views/layouts/nav/sidebar/_admin.html.haml_spec.rb
@@ -58,6 +58,15 @@ RSpec.describe 'layouts/nav/sidebar/_admin' do
it_behaves_like 'page has active sub tab', 'Users'
end
+ context 'on topics' do
+ before do
+ allow(controller).to receive(:controller_name).and_return('admin/topics')
+ end
+
+ it_behaves_like 'page has active tab', 'Overview'
+ it_behaves_like 'page has active sub tab', 'Topics'
+ 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 adfe1cee6d6..20c5d9992be 100644
--- a/spec/views/layouts/nav/sidebar/_project.html.haml_spec.rb
+++ b/spec/views/layouts/nav/sidebar/_project.html.haml_spec.rb
@@ -580,6 +580,23 @@ RSpec.describe 'layouts/nav/sidebar/_project' do
end
end
end
+
+ describe 'Google Cloud' do
+ it 'has a link to the google cloud page' do
+ render
+ expect(rendered).to have_link('Google Cloud', href: project_google_cloud_index_path(project))
+ end
+
+ describe 'when the user does not have access' do
+ let(:user) { nil }
+
+ it 'does not have a link to the google cloud page' do
+ render
+
+ expect(rendered).not_to have_link('Google Cloud')
+ end
+ end
+ end
end
describe 'Packages and Registries' do
diff --git a/spec/views/projects/branches/index.html.haml_spec.rb b/spec/views/projects/branches/index.html.haml_spec.rb
new file mode 100644
index 00000000000..9954d9ecaec
--- /dev/null
+++ b/spec/views/projects/branches/index.html.haml_spec.rb
@@ -0,0 +1,43 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe 'projects/branches/index.html.haml' do
+ let_it_be(:project) { create(:project, :repository) }
+ let_it_be(:repository) { project.repository }
+
+ let(:branches) { repository.branches }
+ let(:active_branch) { branches.find { |b| b.name == 'master' } }
+ let(:stale_branch) { branches.find { |b| b.name == 'feature' } }
+
+ before do
+ assign(:project, project)
+ assign(:repository, repository)
+ assign(:mode, 'overview')
+ assign(:active_branches, [active_branch])
+ assign(:stale_branches, [stale_branch])
+ assign(:overview_max_branches, 5)
+ assign(:branch_pipeline_statuses, {})
+ assign(:refs_pipelines, {})
+ end
+
+ it 'renders list of active and stale branches' do
+ content = render
+
+ expect(content).to include(active_branch.name)
+ expect(content).to include(stale_branch.name)
+ end
+
+ context 'when Gitaly is unavailable' do
+ it 'renders an error' do
+ assign(:gitaly_unavailable, true)
+
+ content = render
+
+ expect(content).to include('Unable to load branches')
+ expect(content).to include(
+ 'The git server, Gitaly, is not available at this time. Please contact your administrator.'
+ )
+ end
+ end
+end
diff --git a/spec/views/projects/commits/_commit.html.haml_spec.rb b/spec/views/projects/commits/_commit.html.haml_spec.rb
index abbb3a168c3..ed93240abc1 100644
--- a/spec/views/projects/commits/_commit.html.haml_spec.rb
+++ b/spec/views/projects/commits/_commit.html.haml_spec.rb
@@ -11,6 +11,24 @@ RSpec.describe 'projects/commits/_commit.html.haml' do
allow(view).to receive(:current_application_settings).and_return(Gitlab::CurrentSettings.current_application_settings)
end
+ context 'with different committer' do
+ let(:ref) { 'master' }
+ let(:committer) { create(:user) }
+
+ it 'renders committed by user' do
+ allow(commit).to receive(:different_committer?).and_return(true)
+ allow(commit).to receive(:committer).and_return(committer)
+
+ render partial: template, locals: {
+ project: project,
+ ref: ref,
+ commit: commit
+ }
+
+ expect(rendered).to have_text("#{committer.name} committed")
+ end
+ end
+
context 'with a signed commit' do
let(:ref) { GpgHelpers::SIGNED_COMMIT_SHA }
diff --git a/spec/views/projects/services/edit.html.haml_spec.rb b/spec/views/projects/services/edit.html.haml_spec.rb
index a5460adbd2c..372ccf82a68 100644
--- a/spec/views/projects/services/edit.html.haml_spec.rb
+++ b/spec/views/projects/services/edit.html.haml_spec.rb
@@ -14,7 +14,7 @@ RSpec.describe 'projects/services/edit' do
it do
render
- expect(rendered).not_to have_text('Recent Deliveries')
+ expect(rendered).not_to have_text('Recent events')
end
context 'integration using WebHooks' do
@@ -25,7 +25,7 @@ RSpec.describe 'projects/services/edit' do
it do
render
- expect(rendered).to have_text('Recent Deliveries')
+ expect(rendered).to have_text('Recent events')
end
end
end
diff --git a/spec/views/projects/tags/index.html.haml_spec.rb b/spec/views/projects/tags/index.html.haml_spec.rb
index 2702ab9e2a9..ebd526284d1 100644
--- a/spec/views/projects/tags/index.html.haml_spec.rb
+++ b/spec/views/projects/tags/index.html.haml_spec.rb
@@ -3,10 +3,11 @@
require 'spec_helper'
RSpec.describe 'projects/tags/index.html.haml' do
- let(:project) { create(:project, :repository) }
- let(:tags) { TagsFinder.new(project.repository, {}).execute }
- let(:git_tag) { project.repository.tags.last }
- let(:release) { create(:release, project: project, sha: git_tag.target_commit.sha) }
+ let_it_be(:project) { create(:project, :repository) }
+ let_it_be(:tags) { project.repository.tags }
+ let_it_be(:git_tag) { project.repository.tags.last }
+ let_it_be(:release) { create(:release, project: project, sha: git_tag.target_commit.sha) }
+
let(:pipeline) { create(:ci_pipeline, :success, project: project, ref: git_tag.name, sha: release.sha) }
before do
@@ -86,4 +87,17 @@ RSpec.describe 'projects/tags/index.html.haml' do
expect(page.all('.tags .content-list li')).not_to have_css 'svg.s24'
end
end
+
+ context 'when Gitaly is unavailable' do
+ it 'renders an error' do
+ assign(:tags_loading_error, GRPC::Unavailable.new)
+
+ content = render
+
+ expect(content).to include("Unable to load tags")
+ expect(content).to include(
+ "The git server, Gitaly, is not available at this time. Please contact your administrator."
+ )
+ end
+ end
end
diff --git a/spec/workers/authorized_project_update/project_recalculate_per_user_worker_spec.rb b/spec/workers/authorized_project_update/project_recalculate_per_user_worker_spec.rb
new file mode 100644
index 00000000000..57a0726000f
--- /dev/null
+++ b/spec/workers/authorized_project_update/project_recalculate_per_user_worker_spec.rb
@@ -0,0 +1,70 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe AuthorizedProjectUpdate::ProjectRecalculatePerUserWorker do
+ include ExclusiveLeaseHelpers
+
+ let_it_be(:project) { create(:project) }
+ let_it_be(:user) { create(:user) }
+
+ subject(:worker) { described_class.new }
+
+ include_examples 'an idempotent worker' do
+ let(:job_args) { [project.id, user.id] }
+
+ it 'does not change authorizations when run twice' do
+ project.add_developer(user)
+
+ user.project_authorizations.delete_all
+
+ expect { worker.perform(project.id, user.id) }.to change { project.project_authorizations.reload.size }.by(1)
+ expect { worker.perform(project.id, user.id) }.not_to change { project.project_authorizations.reload.size }
+ end
+ end
+
+ describe '#perform' do
+ it 'does not fail if the project does not exist' do
+ expect do
+ worker.perform(non_existing_record_id, user.id)
+ end.not_to raise_error
+ end
+
+ it 'does not fail if the user does not exist' do
+ expect do
+ worker.perform(project.id, non_existing_record_id)
+ end.not_to raise_error
+ end
+
+ it 'calls AuthorizedProjectUpdate::ProjectRecalculatePerUserService' do
+ expect_next_instance_of(AuthorizedProjectUpdate::ProjectRecalculatePerUserService, project, user) do |service|
+ expect(service).to receive(:execute)
+ end
+
+ worker.perform(project.id, user.id)
+ end
+
+ context 'exclusive lease' do
+ let(:lock_key) { "#{described_class.superclass.name.underscore}/projects/#{project.id}" }
+ let(:timeout) { 10.seconds }
+
+ context 'when exclusive lease has not been taken' do
+ it 'obtains a new exclusive lease' do
+ expect_to_obtain_exclusive_lease(lock_key, timeout: timeout)
+
+ worker.perform(project.id, user.id)
+ end
+ end
+
+ context 'when exclusive lease has already been taken' do
+ before do
+ stub_exclusive_lease_taken(lock_key, timeout: timeout)
+ end
+
+ it 'raises an error' do
+ expect { worker.perform(project.id, user.id) }.to raise_error(Gitlab::ExclusiveLeaseHelpers::FailedToObtainLockError)
+ end
+ end
+ end
+ end
+end
diff --git a/spec/workers/authorized_project_update/user_refresh_from_replica_worker_spec.rb b/spec/workers/authorized_project_update/user_refresh_from_replica_worker_spec.rb
index 0da58343773..da4b726c0b5 100644
--- a/spec/workers/authorized_project_update/user_refresh_from_replica_worker_spec.rb
+++ b/spec/workers/authorized_project_update/user_refresh_from_replica_worker_spec.rb
@@ -44,7 +44,7 @@ RSpec.describe AuthorizedProjectUpdate::UserRefreshFromReplicaWorker do
end
end
- context 'with load balancing enabled', :db_load_balancing do
+ context 'with load balancing enabled' do
it 'reads from the replica database' do
expect(Gitlab::Database::LoadBalancing::Session.current).to receive(:use_replicas_for_read_queries).and_call_original
diff --git a/spec/workers/build_finished_worker_spec.rb b/spec/workers/build_finished_worker_spec.rb
index 4e34d2348d6..2ca7837066b 100644
--- a/spec/workers/build_finished_worker_spec.rb
+++ b/spec/workers/build_finished_worker_spec.rb
@@ -3,7 +3,9 @@
require 'spec_helper'
RSpec.describe BuildFinishedWorker do
- subject { described_class.new.perform(build.id) }
+ let(:worker) { described_class.new }
+
+ subject { worker.perform(build.id) }
describe '#perform' do
context 'when build exists' do
@@ -63,6 +65,30 @@ RSpec.describe BuildFinishedWorker do
subject
end
end
+
+ context 'when project is deleted' do
+ before do
+ allow(build).to receive(:project).and_return(nil)
+ end
+
+ it 'does no processing' do
+ expect(worker).not_to receive(:process_build)
+
+ subject
+ end
+ end
+
+ context 'when project is pending_delete' do
+ before do
+ build.project.update_attribute(:pending_delete, true)
+ end
+
+ it 'does no processing' do
+ expect(worker).not_to receive(:process_build)
+
+ subject
+ end
+ end
end
context 'when build does not exist' do
diff --git a/spec/workers/bulk_import_worker_spec.rb b/spec/workers/bulk_import_worker_spec.rb
index b67c5c62f76..12e29573156 100644
--- a/spec/workers/bulk_import_worker_spec.rb
+++ b/spec/workers/bulk_import_worker_spec.rb
@@ -84,7 +84,7 @@ RSpec.describe BulkImportWorker do
expect { subject.perform(bulk_import.id) }
.to change(BulkImports::Tracker, :count)
- .by(BulkImports::Groups::Stage.pipelines.size * 2)
+ .by(BulkImports::Groups::Stage.new(bulk_import).pipelines.size * 2)
expect(entity_1.trackers).not_to be_empty
expect(entity_2.trackers).not_to be_empty
@@ -111,10 +111,10 @@ RSpec.describe BulkImportWorker do
end
context 'when there are project entities to process' do
- it 'does not enqueue ExportRequestWorker' do
+ it 'enqueues ExportRequestWorker' do
create(:bulk_import_entity, :created, :project_entity, bulk_import: bulk_import)
- expect(BulkImports::ExportRequestWorker).not_to receive(:perform_async)
+ expect(BulkImports::ExportRequestWorker).to receive(:perform_async).once
subject.perform(bulk_import.id)
end
diff --git a/spec/workers/bulk_imports/export_request_worker_spec.rb b/spec/workers/bulk_imports/export_request_worker_spec.rb
index cb280c6d263..f838bff528c 100644
--- a/spec/workers/bulk_imports/export_request_worker_spec.rb
+++ b/spec/workers/bulk_imports/export_request_worker_spec.rb
@@ -5,7 +5,6 @@ require 'spec_helper'
RSpec.describe BulkImports::ExportRequestWorker do
let_it_be(:bulk_import) { create(:bulk_import) }
let_it_be(:config) { create(:bulk_import_configuration, bulk_import: bulk_import) }
- let_it_be(:entity) { create(:bulk_import_entity, source_full_path: 'foo/bar', bulk_import: bulk_import) }
let_it_be(:version_url) { 'https://gitlab.example/api/v4/version' }
let(:response_double) { double(code: 200, success?: true, parsed_response: {}) }
@@ -20,16 +19,30 @@ RSpec.describe BulkImports::ExportRequestWorker do
allow(Gitlab::HTTP).to receive(:post).and_return(response_double)
end
- include_examples 'an idempotent worker' do
- it 'requests relations export' do
- expected = "/groups/foo%2Fbar/export_relations"
+ shared_examples 'requests relations export for api resource' do
+ include_examples 'an idempotent worker' do
+ it 'requests relations export' do
+ expect_next_instance_of(BulkImports::Clients::HTTP) do |client|
+ expect(client).to receive(:post).with(expected).twice
+ end
- expect_next_instance_of(BulkImports::Clients::HTTP) do |client|
- expect(client).to receive(:post).with(expected).twice
+ perform_multiple(job_args)
end
-
- perform_multiple(job_args)
end
end
+
+ context 'when entity is group' do
+ let(:entity) { create(:bulk_import_entity, :group_entity, source_full_path: 'foo/bar', bulk_import: bulk_import) }
+ let(:expected) { '/groups/foo%2Fbar/export_relations'}
+
+ include_examples 'requests relations export for api resource'
+ end
+
+ context 'when entity is project' do
+ let(:entity) { create(:bulk_import_entity, :project_entity, source_full_path: 'foo/bar', bulk_import: bulk_import) }
+ let(:expected) { '/projects/foo%2Fbar/export_relations' }
+
+ include_examples 'requests relations export for api resource'
+ end
end
end
diff --git a/spec/workers/bulk_imports/pipeline_worker_spec.rb b/spec/workers/bulk_imports/pipeline_worker_spec.rb
index 56f28654ac5..c902d1f2034 100644
--- a/spec/workers/bulk_imports/pipeline_worker_spec.rb
+++ b/spec/workers/bulk_imports/pipeline_worker_spec.rb
@@ -22,47 +22,65 @@ RSpec.describe BulkImports::PipelineWorker do
before do
stub_const('FakePipeline', pipeline_class)
- allow(BulkImports::Groups::Stage)
- .to receive(:pipelines)
- .and_return([[0, pipeline_class]])
+ allow_next_instance_of(BulkImports::Groups::Stage) do |instance|
+ allow(instance).to receive(:pipelines)
+ .and_return([[0, pipeline_class]])
+ end
end
- it 'runs the given pipeline successfully' do
- pipeline_tracker = create(
- :bulk_import_tracker,
- entity: entity,
- pipeline_name: 'FakePipeline'
- )
+ shared_examples 'successfully runs the pipeline' do
+ it 'runs the given pipeline successfully' do
+ expect_next_instance_of(Gitlab::Import::Logger) do |logger|
+ expect(logger)
+ .to receive(:info)
+ .with(
+ worker: described_class.name,
+ pipeline_name: 'FakePipeline',
+ entity_id: entity.id
+ )
+ end
+
+ expect(BulkImports::EntityWorker)
+ .to receive(:perform_async)
+ .with(entity.id, pipeline_tracker.stage)
- expect_next_instance_of(Gitlab::Import::Logger) do |logger|
- expect(logger)
- .to receive(:info)
- .with(
- worker: described_class.name,
- pipeline_name: 'FakePipeline',
- entity_id: entity.id
- )
- end
+ expect(subject).to receive(:jid).and_return('jid')
- expect(BulkImports::EntityWorker)
- .to receive(:perform_async)
- .with(entity.id, pipeline_tracker.stage)
+ subject.perform(pipeline_tracker.id, pipeline_tracker.stage, entity.id)
- expect(subject).to receive(:jid).and_return('jid')
+ pipeline_tracker.reload
- subject.perform(pipeline_tracker.id, pipeline_tracker.stage, entity.id)
+ expect(pipeline_tracker.status_name).to eq(:finished)
+ expect(pipeline_tracker.jid).to eq('jid')
+ end
+ end
- pipeline_tracker.reload
+ it_behaves_like 'successfully runs the pipeline' do
+ let(:pipeline_tracker) do
+ create(
+ :bulk_import_tracker,
+ entity: entity,
+ pipeline_name: 'FakePipeline'
+ )
+ end
+ end
- expect(pipeline_tracker.status_name).to eq(:finished)
- expect(pipeline_tracker.jid).to eq('jid')
+ it_behaves_like 'successfully runs the pipeline' do
+ let(:pipeline_tracker) do
+ create(
+ :bulk_import_tracker,
+ :started,
+ entity: entity,
+ pipeline_name: 'FakePipeline'
+ )
+ end
end
context 'when the pipeline cannot be found' do
it 'logs the error' do
pipeline_tracker = create(
:bulk_import_tracker,
- :started,
+ :finished,
entity: entity,
pipeline_name: 'FakePipeline'
)
@@ -126,6 +144,39 @@ RSpec.describe BulkImports::PipelineWorker do
expect(pipeline_tracker.status_name).to eq(:failed)
expect(pipeline_tracker.jid).to eq('jid')
end
+
+ context 'when it is a network error' do
+ it 'reenqueue on retriable network errors' do
+ pipeline_tracker = create(
+ :bulk_import_tracker,
+ entity: entity,
+ pipeline_name: 'FakePipeline'
+ )
+
+ exception = BulkImports::NetworkError.new(
+ response: double(code: 429, headers: {})
+ )
+
+ expect_next_instance_of(pipeline_class) do |pipeline|
+ expect(pipeline)
+ .to receive(:run)
+ .and_raise(exception)
+ end
+
+ expect(subject).to receive(:jid).and_return('jid')
+
+ expect(described_class)
+ .to receive(:perform_in)
+ .with(
+ 60.seconds,
+ pipeline_tracker.id,
+ pipeline_tracker.stage,
+ pipeline_tracker.entity.id
+ )
+
+ subject.perform(pipeline_tracker.id, pipeline_tracker.stage, entity.id)
+ end
+ end
end
context 'when ndjson pipeline' do
@@ -156,9 +207,10 @@ RSpec.describe BulkImports::PipelineWorker do
before do
stub_const('NdjsonPipeline', ndjson_pipeline)
- allow(BulkImports::Groups::Stage)
- .to receive(:pipelines)
- .and_return([[0, ndjson_pipeline]])
+ allow_next_instance_of(BulkImports::Groups::Stage) do |instance|
+ allow(instance).to receive(:pipelines)
+ .and_return([[0, ndjson_pipeline]])
+ end
end
it 'runs the pipeline successfully' do
diff --git a/spec/workers/ci/create_downstream_pipeline_worker_spec.rb b/spec/workers/ci/create_downstream_pipeline_worker_spec.rb
new file mode 100644
index 00000000000..7a75da850d9
--- /dev/null
+++ b/spec/workers/ci/create_downstream_pipeline_worker_spec.rb
@@ -0,0 +1,37 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Ci::CreateDownstreamPipelineWorker do
+ let_it_be(:user) { create(:user) }
+ let_it_be(:project) { create(:project) }
+ let_it_be(:pipeline) { create(:ci_pipeline, project: project) }
+
+ let(:bridge) { create(:ci_bridge, user: user, pipeline: pipeline) }
+
+ let(:service) { double('pipeline creation service') }
+
+ describe '#perform' do
+ context 'when bridge exists' do
+ it 'calls cross project pipeline creation service' do
+ expect(Ci::CreateDownstreamPipelineService)
+ .to receive(:new)
+ .with(project, user)
+ .and_return(service)
+
+ expect(service).to receive(:execute).with(bridge)
+
+ described_class.new.perform(bridge.id)
+ end
+ end
+
+ context 'when bridge does not exist' do
+ it 'does nothing' do
+ expect(Ci::CreateDownstreamPipelineService)
+ .not_to receive(:new)
+
+ described_class.new.perform(non_existing_record_id)
+ end
+ end
+ end
+end
diff --git a/spec/workers/ci/stuck_builds/drop_running_worker_spec.rb b/spec/workers/ci/stuck_builds/drop_running_worker_spec.rb
new file mode 100644
index 00000000000..6d3aa71fe81
--- /dev/null
+++ b/spec/workers/ci/stuck_builds/drop_running_worker_spec.rb
@@ -0,0 +1,28 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Ci::StuckBuilds::DropRunningWorker do
+ include ExclusiveLeaseHelpers
+
+ let(:worker) { described_class.new }
+ let(:lease_uuid) { SecureRandom.uuid }
+
+ describe '#perform' do
+ subject { worker.perform }
+
+ it_behaves_like 'an idempotent worker'
+
+ it 'executes an instance of Ci::StuckBuilds::DropRunningService' do
+ expect_to_obtain_exclusive_lease(worker.lease_key, lease_uuid)
+
+ expect_next_instance_of(Ci::StuckBuilds::DropRunningService) do |service|
+ expect(service).to receive(:execute).exactly(:once)
+ end
+
+ expect_to_cancel_exclusive_lease(worker.lease_key, lease_uuid)
+
+ subject
+ end
+ end
+end
diff --git a/spec/workers/ci/stuck_builds/drop_scheduled_worker_spec.rb b/spec/workers/ci/stuck_builds/drop_scheduled_worker_spec.rb
new file mode 100644
index 00000000000..57be799d890
--- /dev/null
+++ b/spec/workers/ci/stuck_builds/drop_scheduled_worker_spec.rb
@@ -0,0 +1,28 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Ci::StuckBuilds::DropScheduledWorker do
+ include ExclusiveLeaseHelpers
+
+ let(:worker) { described_class.new }
+ let(:lease_uuid) { SecureRandom.uuid }
+
+ describe '#perform' do
+ subject { worker.perform }
+
+ it_behaves_like 'an idempotent worker'
+
+ it 'executes an instance of Ci::StuckBuilds::DropScheduledService with an exclusive lease' do
+ expect_to_obtain_exclusive_lease(worker.lease_key, lease_uuid)
+
+ expect_next_instance_of(Ci::StuckBuilds::DropScheduledService) do |service|
+ expect(service).to receive(:execute).exactly(:once)
+ end
+
+ expect_to_cancel_exclusive_lease(worker.lease_key, lease_uuid)
+
+ subject
+ end
+ end
+end
diff --git a/spec/workers/cleanup_container_repository_worker_spec.rb b/spec/workers/cleanup_container_repository_worker_spec.rb
index 9cf8974a2a1..6ae4308bd46 100644
--- a/spec/workers/cleanup_container_repository_worker_spec.rb
+++ b/spec/workers/cleanup_container_repository_worker_spec.rb
@@ -17,7 +17,7 @@ RSpec.describe CleanupContainerRepositoryWorker, :clean_gitlab_redis_shared_stat
it 'executes the destroy service' do
expect(Projects::ContainerRepository::CleanupTagsService).to receive(:new)
- .with(project, user, params.merge('container_expiration_policy' => false))
+ .with(repository, user, params.merge('container_expiration_policy' => false))
.and_return(service)
expect(service).to receive(:execute)
@@ -49,7 +49,7 @@ RSpec.describe CleanupContainerRepositoryWorker, :clean_gitlab_redis_shared_stat
expect(repository).to receive(:start_expiration_policy!).and_call_original
expect(repository).to receive(:reset_expiration_policy_started_at!).and_call_original
expect(Projects::ContainerRepository::CleanupTagsService).to receive(:new)
- .with(project, nil, params.merge('container_expiration_policy' => true))
+ .with(repository, nil, params.merge('container_expiration_policy' => true))
.and_return(service)
expect(service).to receive(:execute).and_return(status: :success)
@@ -62,7 +62,7 @@ RSpec.describe CleanupContainerRepositoryWorker, :clean_gitlab_redis_shared_stat
expect(repository).to receive(:start_expiration_policy!).and_call_original
expect(repository).not_to receive(:reset_expiration_policy_started_at!)
expect(Projects::ContainerRepository::CleanupTagsService).to receive(:new)
- .with(project, nil, params.merge('container_expiration_policy' => true))
+ .with(repository, nil, params.merge('container_expiration_policy' => true))
.and_return(service)
expect(service).to receive(:execute).and_return(status: :error, message: 'timeout while deleting tags')
diff --git a/spec/workers/concerns/application_worker_spec.rb b/spec/workers/concerns/application_worker_spec.rb
index ac4e4a682c8..af038c81b9e 100644
--- a/spec/workers/concerns/application_worker_spec.rb
+++ b/spec/workers/concerns/application_worker_spec.rb
@@ -248,6 +248,10 @@ RSpec.describe ApplicationWorker do
end
describe '.perform_async' do
+ before do
+ stub_const(worker.name, worker)
+ end
+
shared_examples_for 'worker utilizes load balancing capabilities' do |data_consistency|
before do
worker.data_consistency(data_consistency)
@@ -282,6 +286,10 @@ RSpec.describe ApplicationWorker do
end
describe '.bulk_perform_async' do
+ before do
+ stub_const(worker.name, worker)
+ end
+
it 'enqueues jobs in bulk' do
Sidekiq::Testing.fake! do
worker.bulk_perform_async([['Foo', [1]], ['Foo', [2]]])
@@ -293,6 +301,10 @@ RSpec.describe ApplicationWorker do
end
describe '.bulk_perform_in' do
+ before do
+ stub_const(worker.name, worker)
+ end
+
context 'when delay is valid' do
it 'correctly schedules jobs' do
Sidekiq::Testing.fake! do
diff --git a/spec/workers/concerns/gitlab/github_import/object_importer_spec.rb b/spec/workers/concerns/gitlab/github_import/object_importer_spec.rb
index c1ac5ffebe8..b5252294b27 100644
--- a/spec/workers/concerns/gitlab/github_import/object_importer_spec.rb
+++ b/spec/workers/concerns/gitlab/github_import/object_importer_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Gitlab::GithubImport::ObjectImporter do
+RSpec.describe Gitlab::GithubImport::ObjectImporter, :aggregate_failures do
let(:worker) do
Class.new do
def self.name
@@ -26,9 +26,15 @@ RSpec.describe Gitlab::GithubImport::ObjectImporter do
let(:importer_class) { double(:importer_class, name: 'klass_name') }
let(:importer_instance) { double(:importer_instance) }
let(:client) { double(:client) }
+ let(:github_identifiers) do
+ {
+ some_id: 1,
+ some_type: '_some_type_'
+ }
+ end
- before do
- stub_const('MockRepresantation', Class.new do
+ let(:representation_class) do
+ Class.new do
include Gitlab::GithubImport::Representation::ToHash
include Gitlab::GithubImport::Representation::ExposeAttribute
@@ -41,7 +47,20 @@ RSpec.describe Gitlab::GithubImport::ObjectImporter do
def initialize(attributes)
@attributes = attributes
end
- end)
+
+ def github_identifiers
+ {
+ some_id: 1,
+ some_type: '_some_type_'
+ }
+ end
+ end
+ end
+
+ let(:stubbed_representation) { representation_class }
+
+ before do
+ stub_const('MockRepresantation', stubbed_representation)
end
describe '#import', :clean_gitlab_redis_cache do
@@ -64,7 +83,7 @@ RSpec.describe Gitlab::GithubImport::ObjectImporter do
expect(Gitlab::GithubImport::Logger)
.to receive(:info)
.with(
- github_id: 1,
+ github_identifiers: github_identifiers,
message: 'starting importer',
project_id: project.id,
importer: 'klass_name'
@@ -73,7 +92,7 @@ RSpec.describe Gitlab::GithubImport::ObjectImporter do
expect(Gitlab::GithubImport::Logger)
.to receive(:info)
.with(
- github_id: 1,
+ github_identifiers: github_identifiers,
message: 'importer finished',
project_id: project.id,
importer: 'klass_name'
@@ -101,7 +120,7 @@ RSpec.describe Gitlab::GithubImport::ObjectImporter do
expect(Gitlab::GithubImport::Logger)
.to receive(:info)
.with(
- github_id: 1,
+ github_identifiers: github_identifiers,
message: 'starting importer',
project_id: project.id,
importer: 'klass_name'
@@ -125,21 +144,25 @@ RSpec.describe Gitlab::GithubImport::ObjectImporter do
expect(project.import_failures.last.exception_message).to eq('some error')
end
- it 'logs error when representation does not have a github_id' do
- expect(importer_class).not_to receive(:new)
+ context 'without github_identifiers defined' do
+ let(:stubbed_representation) { representation_class.instance_eval { undef_method :github_identifiers } }
- expect(Gitlab::Import::ImportFailureService)
- .to receive(:track)
- .with(
- project_id: project.id,
- exception: a_kind_of(KeyError),
- error_source: 'klass_name',
- fail_import: true
- )
- .and_call_original
+ it 'logs error when representation does not have a github_id' do
+ expect(importer_class).not_to receive(:new)
- expect { worker.import(project, client, { 'number' => 10 }) }
- .to raise_error(KeyError, 'key not found: :github_id')
+ expect(Gitlab::Import::ImportFailureService)
+ .to receive(:track)
+ .with(
+ project_id: project.id,
+ exception: a_kind_of(NoMethodError),
+ error_source: 'klass_name',
+ fail_import: true
+ )
+ .and_call_original
+
+ expect { worker.import(project, client, { 'number' => 10 }) }
+ .to raise_error(NoMethodError, /^undefined method `github_identifiers/)
+ end
end
end
end
diff --git a/spec/workers/concerns/worker_context_spec.rb b/spec/workers/concerns/worker_context_spec.rb
index ebdb752d900..80b427b2b42 100644
--- a/spec/workers/concerns/worker_context_spec.rb
+++ b/spec/workers/concerns/worker_context_spec.rb
@@ -13,6 +13,10 @@ RSpec.describe WorkerContext do
end
end
+ before do
+ stub_const(worker.name, worker)
+ end
+
describe '.worker_context' do
it 'allows modifying the context for the entire worker' do
worker.worker_context(user: build_stubbed(:user))
diff --git a/spec/workers/container_expiration_policies/cleanup_container_repository_worker_spec.rb b/spec/workers/container_expiration_policies/cleanup_container_repository_worker_spec.rb
index fdba67638c1..d4126fe688a 100644
--- a/spec/workers/container_expiration_policies/cleanup_container_repository_worker_spec.rb
+++ b/spec/workers/container_expiration_policies/cleanup_container_repository_worker_spec.rb
@@ -74,6 +74,30 @@ RSpec.describe ContainerExpirationPolicies::CleanupContainerRepositoryWorker do
end
end
end
+
+ context 'the cache hit ratio field' do
+ where(:after_truncate_size, :cached_tags_count, :ratio) do
+ nil | nil | nil
+ 10 | nil | nil
+ nil | 10 | nil
+ 0 | 5 | nil
+ 10 | 0 | 0
+ 10 | 5 | 0.5
+ 3 | 10 | (10 / 3.to_f)
+ end
+
+ with_them do
+ it 'is logged properly' do
+ service_response = cleanup_service_response(status: :unfinished, repository: repository, cleanup_tags_service_before_truncate_size: after_truncate_size, cleanup_tags_service_after_truncate_size: after_truncate_size, cleanup_tags_service_cached_tags_count: cached_tags_count)
+ expect(ContainerExpirationPolicies::CleanupService)
+ .to receive(:new).with(repository).and_return(double(execute: service_response))
+ expect_log_extra_metadata(service_response: service_response, cleanup_status: :unfinished, truncated: false, cache_hit_ratio: ratio)
+ expect_log_info(project_id: project.id, container_repository_id: repository.id)
+
+ subject
+ end
+ end
+ end
end
context 'with an erroneous cleanup' do
@@ -372,7 +396,16 @@ RSpec.describe ContainerExpirationPolicies::CleanupContainerRepositoryWorker do
end
end
- def cleanup_service_response(status: :finished, repository:, cleanup_tags_service_original_size: 100, cleanup_tags_service_before_truncate_size: 80, cleanup_tags_service_after_truncate_size: 80, cleanup_tags_service_before_delete_size: 50, cleanup_tags_service_deleted_size: 50)
+ def cleanup_service_response(
+ status: :finished,
+ repository:,
+ cleanup_tags_service_original_size: 100,
+ cleanup_tags_service_before_truncate_size: 80,
+ cleanup_tags_service_after_truncate_size: 80,
+ cleanup_tags_service_before_delete_size: 50,
+ cleanup_tags_service_deleted_size: 50,
+ cleanup_tags_service_cached_tags_count: 0
+ )
ServiceResponse.success(
message: "cleanup #{status}",
payload: {
@@ -381,21 +414,35 @@ RSpec.describe ContainerExpirationPolicies::CleanupContainerRepositoryWorker do
cleanup_tags_service_original_size: cleanup_tags_service_original_size,
cleanup_tags_service_before_truncate_size: cleanup_tags_service_before_truncate_size,
cleanup_tags_service_after_truncate_size: cleanup_tags_service_after_truncate_size,
- cleanup_tags_service_before_delete_size: cleanup_tags_service_before_delete_size
+ cleanup_tags_service_before_delete_size: cleanup_tags_service_before_delete_size,
+ cleanup_tags_service_cached_tags_count: cleanup_tags_service_cached_tags_count
}.compact
)
end
- def expect_log_extra_metadata(service_response:, cleanup_status: :finished, truncated: false)
+ def expect_log_extra_metadata(service_response:, cleanup_status: :finished, truncated: false, cache_hit_ratio: 0)
expect(worker).to receive(:log_extra_metadata_on_done).with(:container_repository_id, repository.id)
expect(worker).to receive(:log_extra_metadata_on_done).with(:project_id, repository.project.id)
expect(worker).to receive(:log_extra_metadata_on_done).with(:cleanup_status, cleanup_status)
- %i[cleanup_tags_service_original_size cleanup_tags_service_before_truncate_size cleanup_tags_service_after_truncate_size cleanup_tags_service_before_delete_size cleanup_tags_service_deleted_size].each do |field|
+ %i[
+ cleanup_tags_service_original_size
+ cleanup_tags_service_before_truncate_size
+ cleanup_tags_service_after_truncate_size
+ cleanup_tags_service_before_delete_size
+ cleanup_tags_service_deleted_size
+ cleanup_tags_service_cached_tags_count
+ ].each do |field|
value = service_response.payload[field]
expect(worker).to receive(:log_extra_metadata_on_done).with(field, value) unless value.nil?
end
expect(worker).to receive(:log_extra_metadata_on_done).with(:cleanup_tags_service_truncated, truncated)
+
+ after_truncate_size = service_response.payload[:cleanup_tags_service_after_truncate_size]
+ if cache_hit_ratio && after_truncate_size && after_truncate_size != 0
+ expect(worker).to receive(:log_extra_metadata_on_done).with(:cleanup_tags_service_cache_hit_ratio, cache_hit_ratio)
+ end
+
expect(worker).to receive(:log_extra_metadata_on_done).with(:running_jobs_count, 0)
if service_response.error?
diff --git a/spec/workers/container_expiration_policy_worker_spec.rb b/spec/workers/container_expiration_policy_worker_spec.rb
index 9f370b10f6a..ebf80041151 100644
--- a/spec/workers/container_expiration_policy_worker_spec.rb
+++ b/spec/workers/container_expiration_policy_worker_spec.rb
@@ -156,7 +156,7 @@ RSpec.describe ContainerExpirationPolicyWorker do
subject
end
- context 'with load balancing enabled', :db_load_balancing do
+ context 'with load balancing enabled' do
it 'reads the counts from the replica' do
expect(Gitlab::Database::LoadBalancing::Session.current).to receive(:use_replicas_for_read_queries).and_call_original
diff --git a/spec/workers/create_note_diff_file_worker_spec.rb b/spec/workers/create_note_diff_file_worker_spec.rb
index 4c1df8ade06..6d1d6d93e44 100644
--- a/spec/workers/create_note_diff_file_worker_spec.rb
+++ b/spec/workers/create_note_diff_file_worker_spec.rb
@@ -14,5 +14,23 @@ RSpec.describe CreateNoteDiffFileWorker do
described_class.new.perform(diff_note.id)
end
+
+ context "when the supplied diff_note_id doesn't belong to an existing DiffNote" do
+ it "returns nil without raising an error" do
+ expect_any_instance_of(DiffNote).not_to receive(:create_diff_file)
+ .and_call_original
+
+ described_class.new.perform(non_existing_record_id)
+ end
+ end
+
+ context "when called with a missing diff_note id" do
+ it "returns nil without creating diff file" do
+ expect_any_instance_of(DiffNote).not_to receive(:create_diff_file)
+ .and_call_original
+
+ described_class.new.perform(nil)
+ end
+ end
end
end
diff --git a/spec/workers/database/drop_detached_partitions_worker_spec.rb b/spec/workers/database/drop_detached_partitions_worker_spec.rb
index 42c3fa3c188..8693878ddd5 100644
--- a/spec/workers/database/drop_detached_partitions_worker_spec.rb
+++ b/spec/workers/database/drop_detached_partitions_worker_spec.rb
@@ -6,16 +6,15 @@ RSpec.describe Database::DropDetachedPartitionsWorker do
describe '#perform' do
subject { described_class.new.perform }
- let(:dropper) { instance_double('DropDetachedPartitions', perform: nil) }
let(:monitoring) { instance_double('PartitionMonitoring', report_metrics: nil) }
before do
- allow(Gitlab::Database::Partitioning::DetachedPartitionDropper).to receive(:new).and_return(dropper)
+ allow(Gitlab::Database::Partitioning).to receive(:drop_detached_partitions)
allow(Gitlab::Database::Partitioning::PartitionMonitoring).to receive(:new).and_return(monitoring)
end
- it 'delegates to DropPartitionsPendingDrop' do
- expect(dropper).to receive(:perform)
+ it 'delegates to Partitioning.drop_detached_partitions' do
+ expect(Gitlab::Database::Partitioning).to receive(:drop_detached_partitions)
subject
end
diff --git a/spec/workers/dependency_proxy/cleanup_blob_worker_spec.rb b/spec/workers/dependency_proxy/cleanup_blob_worker_spec.rb
new file mode 100644
index 00000000000..b67a56cca7b
--- /dev/null
+++ b/spec/workers/dependency_proxy/cleanup_blob_worker_spec.rb
@@ -0,0 +1,9 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe DependencyProxy::CleanupBlobWorker do
+ let_it_be(:factory_type) { :dependency_proxy_blob }
+
+ it_behaves_like 'dependency_proxy_cleanup_worker'
+end
diff --git a/spec/workers/dependency_proxy/cleanup_manifest_worker_spec.rb b/spec/workers/dependency_proxy/cleanup_manifest_worker_spec.rb
new file mode 100644
index 00000000000..d53b3e6a1fd
--- /dev/null
+++ b/spec/workers/dependency_proxy/cleanup_manifest_worker_spec.rb
@@ -0,0 +1,9 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe DependencyProxy::CleanupManifestWorker do
+ let_it_be(:factory_type) { :dependency_proxy_manifest }
+
+ it_behaves_like 'dependency_proxy_cleanup_worker'
+end
diff --git a/spec/workers/dependency_proxy/image_ttl_group_policy_worker_spec.rb b/spec/workers/dependency_proxy/image_ttl_group_policy_worker_spec.rb
new file mode 100644
index 00000000000..d3234f4c212
--- /dev/null
+++ b/spec/workers/dependency_proxy/image_ttl_group_policy_worker_spec.rb
@@ -0,0 +1,74 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe DependencyProxy::ImageTtlGroupPolicyWorker do
+ let(:worker) { described_class.new }
+
+ describe '#perform' do
+ let_it_be(:policy) { create(:image_ttl_group_policy) }
+ let_it_be(:group) { policy.group }
+
+ subject { worker.perform }
+
+ context 'when there are images to expire' do
+ let_it_be_with_reload(:old_blob) { create(:dependency_proxy_blob, group: group, updated_at: 1.year.ago) }
+ let_it_be_with_reload(:old_manifest) { create(:dependency_proxy_manifest, group: group, updated_at: 1.year.ago) }
+ let_it_be_with_reload(:new_blob) { create(:dependency_proxy_blob, group: group) }
+ let_it_be_with_reload(:new_manifest) { create(:dependency_proxy_manifest, group: group) }
+
+ it 'calls the limited capacity workers', :aggregate_failures do
+ expect(DependencyProxy::CleanupBlobWorker).to receive(:perform_with_capacity)
+ expect(DependencyProxy::CleanupManifestWorker).to receive(:perform_with_capacity)
+
+ subject
+ end
+
+ it 'updates the old images to expired' do
+ expect { subject }
+ .to change { old_blob.reload.status }.from('default').to('expired')
+ .and change { old_manifest.reload.status }.from('default').to('expired')
+ .and not_change { new_blob.reload.status }
+ .and not_change { new_manifest.reload.status }
+ end
+ end
+
+ context 'when there are no images to expire' do
+ it 'does not do anything', :aggregate_failures do
+ expect(DependencyProxy::CleanupBlobWorker).not_to receive(:perform_with_capacity)
+ expect(DependencyProxy::CleanupManifestWorker).not_to receive(:perform_with_capacity)
+
+ subject
+ end
+ end
+
+ context 'counts logging' do
+ let_it_be(:expired_blob) { create(:dependency_proxy_blob, :expired, group: group) }
+ let_it_be(:expired_blob2) { create(:dependency_proxy_blob, :expired, group: group) }
+ let_it_be(:expired_manifest) { create(:dependency_proxy_manifest, :expired, group: group) }
+ let_it_be(:processing_blob) { create(:dependency_proxy_blob, status: :processing, group: group) }
+ let_it_be(:processing_manifest) { create(:dependency_proxy_manifest, status: :processing, group: group) }
+ let_it_be(:error_blob) { create(:dependency_proxy_blob, status: :error, group: group) }
+ let_it_be(:error_manifest) { create(:dependency_proxy_manifest, status: :error, group: group) }
+
+ it 'logs all the counts', :aggregate_failures do
+ expect(worker).to receive(:log_extra_metadata_on_done).with(:expired_dependency_proxy_blob_count, 2)
+ expect(worker).to receive(:log_extra_metadata_on_done).with(:expired_dependency_proxy_manifest_count, 1)
+ expect(worker).to receive(:log_extra_metadata_on_done).with(:processing_dependency_proxy_blob_count, 1)
+ expect(worker).to receive(:log_extra_metadata_on_done).with(:processing_dependency_proxy_manifest_count, 1)
+ expect(worker).to receive(:log_extra_metadata_on_done).with(:error_dependency_proxy_blob_count, 1)
+ expect(worker).to receive(:log_extra_metadata_on_done).with(:error_dependency_proxy_manifest_count, 1)
+
+ subject
+ end
+
+ context 'with load balancing enabled', :db_load_balancing do
+ it 'reads the counts from the replica' do
+ expect(Gitlab::Database::LoadBalancing::Session.current).to receive(:use_replicas_for_read_queries).and_call_original
+
+ subject
+ end
+ end
+ end
+ end
+end
diff --git a/spec/workers/email_receiver_worker_spec.rb b/spec/workers/email_receiver_worker_spec.rb
index d26c08fb221..83e13ded7b3 100644
--- a/spec/workers/email_receiver_worker_spec.rb
+++ b/spec/workers/email_receiver_worker_spec.rb
@@ -80,6 +80,21 @@ RSpec.describe EmailReceiverWorker, :mailer do
expect(email).to be_nil
end
end
+
+ context 'when the error is RateLimitedService::RateLimitedError' do
+ let(:error) { RateLimitedService::RateLimitedError.new(key: :issues_create, rate_limiter: Gitlab::ApplicationRateLimiter) }
+
+ it 'does not report the error to the sender' do
+ expect(Gitlab::ErrorTracking).to receive(:track_exception).with(error).and_call_original
+
+ perform_enqueued_jobs do
+ described_class.new.perform(raw_message)
+ end
+
+ email = ActionMailer::Base.deliveries.last
+ expect(email).to be_nil
+ end
+ end
end
end
diff --git a/spec/workers/every_sidekiq_worker_spec.rb b/spec/workers/every_sidekiq_worker_spec.rb
index 235a1f6e3dd..9a4b27997e9 100644
--- a/spec/workers/every_sidekiq_worker_spec.rb
+++ b/spec/workers/every_sidekiq_worker_spec.rb
@@ -48,7 +48,7 @@ RSpec.describe 'Every Sidekiq worker' do
describe "feature category declarations" do
let(:feature_categories) do
- YAML.load_file(Rails.root.join('config', 'feature_categories.yml')).map(&:to_sym).to_set
+ Gitlab::FeatureCategories.default.categories.map(&:to_sym).to_set
end
# All Sidekiq worker classes should declare a valid `feature_category`
@@ -155,11 +155,13 @@ RSpec.describe 'Every Sidekiq worker' do
'Ci::BuildScheduleWorker' => 3,
'Ci::BuildTraceChunkFlushWorker' => 3,
'Ci::CreateCrossProjectPipelineWorker' => 3,
+ 'Ci::CreateDownstreamPipelineWorker' => 3,
'Ci::DailyBuildGroupReportResultsWorker' => 3,
'Ci::DeleteObjectsWorker' => 0,
'Ci::DropPipelineWorker' => 3,
'Ci::InitialPipelineProcessWorker' => 3,
'Ci::MergeRequests::AddTodoWhenBuildFailsWorker' => 3,
+ 'Ci::Minutes::UpdateProjectAndNamespaceUsageWorker' => 3,
'Ci::PipelineArtifacts::CoverageReportWorker' => 3,
'Ci::PipelineArtifacts::CreateQualityReportWorker' => 3,
'Ci::PipelineBridgeStatusWorker' => 3,
@@ -197,6 +199,8 @@ RSpec.describe 'Every Sidekiq worker' do
'DeleteMergedBranchesWorker' => 3,
'DeleteStoredFilesWorker' => 3,
'DeleteUserWorker' => 3,
+ 'DependencyProxy::CleanupBlobWorker' => 3,
+ 'DependencyProxy::CleanupManifestWorker' => 3,
'Deployments::AutoRollbackWorker' => 3,
'Deployments::DropOlderDeploymentsWorker' => 3,
'Deployments::FinishedWorker' => 3,
@@ -233,29 +237,27 @@ RSpec.describe 'Every Sidekiq worker' do
'FlushCounterIncrementsWorker' => 3,
'Geo::Batch::ProjectRegistrySchedulerWorker' => 3,
'Geo::Batch::ProjectRegistryWorker' => 3,
- 'Geo::ContainerRepositorySyncWorker' => 3,
+ 'Geo::ContainerRepositorySyncWorker' => 1,
'Geo::DesignRepositoryShardSyncWorker' => false,
- 'Geo::DesignRepositorySyncWorker' => 3,
+ 'Geo::DesignRepositorySyncWorker' => 1,
'Geo::DestroyWorker' => 3,
'Geo::EventWorker' => 3,
'Geo::FileDownloadWorker' => 3,
'Geo::FileRegistryRemovalWorker' => 3,
'Geo::FileRemovalWorker' => 3,
- 'Geo::HashedStorageAttachmentsMigrationWorker' => 3,
- 'Geo::HashedStorageMigrationWorker' => 3,
- 'Geo::ProjectSyncWorker' => 3,
+ 'Geo::ProjectSyncWorker' => 1,
'Geo::RenameRepositoryWorker' => 3,
- 'Geo::RepositoriesCleanUpWorker' => 3,
'Geo::RepositoryCleanupWorker' => 3,
'Geo::RepositoryShardSyncWorker' => false,
'Geo::RepositoryVerification::Primary::ShardWorker' => false,
'Geo::RepositoryVerification::Primary::SingleWorker' => false,
'Geo::RepositoryVerification::Secondary::SingleWorker' => false,
'Geo::ReverificationBatchWorker' => 0,
- 'Geo::Scheduler::Primary::SchedulerWorker' => 3,
- 'Geo::Scheduler::SchedulerWorker' => 3,
- 'Geo::Scheduler::Secondary::SchedulerWorker' => 3,
+ 'Geo::Scheduler::Primary::SchedulerWorker' => false,
+ 'Geo::Scheduler::SchedulerWorker' => false,
+ 'Geo::Scheduler::Secondary::SchedulerWorker' => false,
'Geo::VerificationBatchWorker' => 0,
+ 'Geo::VerificationStateBackfillWorker' => false,
'Geo::VerificationTimeoutWorker' => false,
'Geo::VerificationWorker' => 3,
'GeoRepositoryDestroyWorker' => 3,
@@ -357,14 +359,13 @@ RSpec.describe 'Every Sidekiq worker' do
'ObjectPool::ScheduleJoinWorker' => 3,
'ObjectStorage::BackgroundMoveWorker' => 5,
'ObjectStorage::MigrateUploadsWorker' => 3,
- 'Packages::Composer::CacheUpdateWorker' => 3,
+ 'Packages::Composer::CacheUpdateWorker' => false,
'Packages::Go::SyncPackagesWorker' => 3,
'Packages::Maven::Metadata::SyncWorker' => 3,
'Packages::Nuget::ExtractionWorker' => 3,
'Packages::Rubygems::ExtractionWorker' => 3,
'PagesDomainSslRenewalWorker' => 3,
'PagesDomainVerificationWorker' => 3,
- 'PagesRemoveWorker' => 3,
'PagesTransferWorker' => 3,
'PagesUpdateConfigurationWorker' => 3,
'PagesWorker' => 3,
diff --git a/spec/workers/expire_job_cache_worker_spec.rb b/spec/workers/expire_job_cache_worker_spec.rb
index 6b14ccea105..e9af39ed2df 100644
--- a/spec/workers/expire_job_cache_worker_spec.rb
+++ b/spec/workers/expire_job_cache_worker_spec.rb
@@ -13,6 +13,8 @@ RSpec.describe ExpireJobCacheWorker do
let(:job_args) { job.id }
+ it_behaves_like 'an idempotent worker'
+
it_behaves_like 'worker with data consistency',
described_class,
data_consistency: :delayed
diff --git a/spec/workers/gitlab/github_import/stage/finish_import_worker_spec.rb b/spec/workers/gitlab/github_import/stage/finish_import_worker_spec.rb
index 132fe1dc618..dd976eef28b 100644
--- a/spec/workers/gitlab/github_import/stage/finish_import_worker_spec.rb
+++ b/spec/workers/gitlab/github_import/stage/finish_import_worker_spec.rb
@@ -7,39 +7,27 @@ RSpec.describe Gitlab::GithubImport::Stage::FinishImportWorker do
let(:worker) { described_class.new }
describe '#perform' do
- it 'marks the import as finished' do
+ it 'marks the import as finished and reports import statistics' do
expect(project).to receive(:after_import)
- expect(worker).to receive(:report_import_time).with(project)
-
- worker.import(double(:client), project)
- end
- end
-
- describe '#report_import_time' do
- it 'reports the total import time' do
- expect(worker.histogram)
- .to receive(:observe)
- .with({ project: project.path_with_namespace }, a_kind_of(Numeric))
- .and_call_original
-
- expect(worker.counter)
- .to receive(:increment)
- .and_call_original
+ expect_next_instance_of(Gitlab::Import::Metrics) do |instance|
+ expect(instance).to receive(:track_finished_import)
+ expect(instance).to receive(:duration).and_return(3.005)
+ end
expect(Gitlab::GithubImport::Logger)
.to receive(:info)
- .with(
- message: 'GitHub project import finished',
- import_stage: 'Gitlab::GithubImport::Stage::FinishImportWorker',
- object_counts: {
- 'fetched' => {},
- 'imported' => {}
- },
- project_id: project.id,
- duration_s: a_kind_of(Numeric)
- )
+ .with(
+ message: 'GitHub project import finished',
+ import_stage: 'Gitlab::GithubImport::Stage::FinishImportWorker',
+ object_counts: {
+ 'fetched' => {},
+ 'imported' => {}
+ },
+ project_id: project.id,
+ duration_s: 3.01
+ )
- worker.report_import_time(project)
+ worker.import(double(:client), project)
end
end
end
diff --git a/spec/workers/gitlab/github_import/stage/import_base_data_worker_spec.rb b/spec/workers/gitlab/github_import/stage/import_base_data_worker_spec.rb
index f68d0838501..7b2218b1725 100644
--- a/spec/workers/gitlab/github_import/stage/import_base_data_worker_spec.rb
+++ b/spec/workers/gitlab/github_import/stage/import_base_data_worker_spec.rb
@@ -3,15 +3,15 @@
require 'spec_helper'
RSpec.describe Gitlab::GithubImport::Stage::ImportBaseDataWorker do
- let(:project) { create(:project) }
- let(:import_state) { create(:import_state, project: project) }
+ let_it_be(:project) { create(:project) }
+ let_it_be(:import_state) { create(:import_state, project: project) }
+
let(:worker) { described_class.new }
+ let(:importer) { double(:importer) }
+ let(:client) { double(:client) }
describe '#import' do
it 'imports the base data of a project' do
- importer = double(:importer)
- client = double(:client)
-
described_class::IMPORTERS.each do |klass|
expect(klass)
.to receive(:new)
@@ -29,5 +29,23 @@ RSpec.describe Gitlab::GithubImport::Stage::ImportBaseDataWorker do
worker.import(client, project)
end
+
+ it 'raises an error' do
+ exception = StandardError.new('_some_error_')
+
+ expect_next_instance_of(Gitlab::GithubImport::Importer::LabelsImporter) do |importer|
+ expect(importer).to receive(:execute).and_raise(exception)
+ end
+ expect(Gitlab::Import::ImportFailureService).to receive(:track)
+ .with(
+ project_id: project.id,
+ exception: exception,
+ error_source: described_class.name,
+ fail_import: true,
+ metrics: true
+ ).and_call_original
+
+ expect { worker.import(client, project) }.to raise_error(StandardError)
+ end
end
end
diff --git a/spec/workers/gitlab/github_import/stage/import_pull_requests_worker_spec.rb b/spec/workers/gitlab/github_import/stage/import_pull_requests_worker_spec.rb
index 29578f9bf37..b18b5ce64d1 100644
--- a/spec/workers/gitlab/github_import/stage/import_pull_requests_worker_spec.rb
+++ b/spec/workers/gitlab/github_import/stage/import_pull_requests_worker_spec.rb
@@ -3,14 +3,15 @@
require 'spec_helper'
RSpec.describe Gitlab::GithubImport::Stage::ImportPullRequestsWorker do
- let(:project) { create(:project) }
- let(:import_state) { create(:import_state, project: project) }
+ let_it_be(:project) { create(:project) }
+ let_it_be(:import_state) { create(:import_state, project: project) }
+
let(:worker) { described_class.new }
+ let(:importer) { double(:importer) }
+ let(:client) { double(:client) }
describe '#import' do
it 'imports all the pull requests' do
- importer = double(:importer)
- client = double(:client)
waiter = Gitlab::JobWaiter.new(2, '123')
expect(Gitlab::GithubImport::Importer::PullRequestsImporter)
@@ -32,4 +33,22 @@ RSpec.describe Gitlab::GithubImport::Stage::ImportPullRequestsWorker do
worker.import(client, project)
end
end
+
+ it 'raises an error' do
+ exception = StandardError.new('_some_error_')
+
+ expect_next_instance_of(Gitlab::GithubImport::Importer::PullRequestsImporter) do |importer|
+ expect(importer).to receive(:execute).and_raise(exception)
+ end
+ expect(Gitlab::Import::ImportFailureService).to receive(:track)
+ .with(
+ project_id: project.id,
+ exception: exception,
+ error_source: described_class.name,
+ fail_import: true,
+ metrics: true
+ ).and_call_original
+
+ expect { worker.import(client, project) }.to raise_error(StandardError)
+ end
end
diff --git a/spec/workers/gitlab/github_import/stage/import_repository_worker_spec.rb b/spec/workers/gitlab/github_import/stage/import_repository_worker_spec.rb
index 875fc082975..582cb76a6cd 100644
--- a/spec/workers/gitlab/github_import/stage/import_repository_worker_spec.rb
+++ b/spec/workers/gitlab/github_import/stage/import_repository_worker_spec.rb
@@ -3,7 +3,7 @@
require 'spec_helper'
RSpec.describe Gitlab::GithubImport::Stage::ImportRepositoryWorker do
- let(:project) { double(:project, id: 4) }
+ let_it_be(:project) { create(:project, :import_started) }
let(:worker) { described_class.new }
@@ -43,6 +43,15 @@ RSpec.describe Gitlab::GithubImport::Stage::ImportRepositoryWorker do
expect(instance).to receive(:execute).and_raise(exception_class)
end
+ expect(Gitlab::Import::ImportFailureService).to receive(:track)
+ .with(
+ project_id: project.id,
+ exception: exception_class,
+ error_source: described_class.name,
+ fail_import: true,
+ metrics: true
+ ).and_call_original
+
expect(Gitlab::GithubImport::Stage::ImportBaseDataWorker)
.not_to receive(:perform_async)
diff --git a/spec/workers/issue_placement_worker_spec.rb b/spec/workers/issue_placement_worker_spec.rb
index 780790dbb1b..50b9d58a5b0 100644
--- a/spec/workers/issue_placement_worker_spec.rb
+++ b/spec/workers/issue_placement_worker_spec.rb
@@ -27,7 +27,7 @@ RSpec.describe IssuePlacementWorker do
it 'places all issues created at most 5 minutes before this one at the end, most recent last' do
expect { run_worker }.not_to change { irrelevant.reset.relative_position }
- expect(project.issues.order_relative_position_asc)
+ expect(project.issues.order_by_relative_position)
.to eq([issue_e, issue_b, issue_a, issue, issue_c, issue_f, issue_d])
expect(project.issues.where(relative_position: nil)).not_to exist
end
diff --git a/spec/workers/packages/composer/cache_cleanup_worker_spec.rb b/spec/workers/packages/composer/cache_cleanup_worker_spec.rb
index e69fe55acc2..39eac4e4ae1 100644
--- a/spec/workers/packages/composer/cache_cleanup_worker_spec.rb
+++ b/spec/workers/packages/composer/cache_cleanup_worker_spec.rb
@@ -18,12 +18,8 @@ RSpec.describe Packages::Composer::CacheCleanupWorker, type: :worker do
cache_file4.update_columns(namespace_id: nil)
end
- it 'deletes expired packages' do
- expect { subject }.to change { Packages::Composer::CacheFile.count }.by(-2)
- expect { cache_file1.reload }.not_to raise_error ActiveRecord::RecordNotFound
- expect { cache_file2.reload }.not_to raise_error ActiveRecord::RecordNotFound
- expect { cache_file3.reload }.to raise_error ActiveRecord::RecordNotFound
- expect { cache_file4.reload }.to raise_error ActiveRecord::RecordNotFound
+ it 'does nothing' do
+ expect { subject }.not_to change { Packages::Composer::CacheFile.count }
end
end
end
diff --git a/spec/workers/packages/composer/cache_update_worker_spec.rb b/spec/workers/packages/composer/cache_update_worker_spec.rb
index a0d8aa5d375..6c17d49e986 100644
--- a/spec/workers/packages/composer/cache_update_worker_spec.rb
+++ b/spec/workers/packages/composer/cache_update_worker_spec.rb
@@ -21,8 +21,8 @@ RSpec.describe Packages::Composer::CacheUpdateWorker, type: :worker do
include_examples 'an idempotent worker' do
context 'creating a package' do
- it 'updates the cache' do
- expect { subject }.to change { Packages::Composer::CacheFile.count }.by(1)
+ it 'does nothing' do
+ expect { subject }.to change { Packages::Composer::CacheFile.count }.by(0)
end
end
@@ -36,12 +36,12 @@ RSpec.describe Packages::Composer::CacheUpdateWorker, type: :worker do
package.destroy!
end
- it 'marks the file for deletion' do
+ it 'does nothing' do
expect { subject }.not_to change { Packages::Composer::CacheFile.count }
cache_file = Packages::Composer::CacheFile.last
- expect(cache_file.reload.delete_at).not_to be_nil
+ expect(cache_file.reload.delete_at).to be_nil
end
end
end
diff --git a/spec/workers/pages_remove_worker_spec.rb b/spec/workers/pages_remove_worker_spec.rb
deleted file mode 100644
index 9d49088b371..00000000000
--- a/spec/workers/pages_remove_worker_spec.rb
+++ /dev/null
@@ -1,11 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe PagesRemoveWorker do
- it 'does not raise error' do
- expect do
- described_class.new.perform(create(:project).id)
- end.not_to raise_error
- end
-end
diff --git a/spec/workers/pipeline_hooks_worker_spec.rb b/spec/workers/pipeline_hooks_worker_spec.rb
index 0ed00c0c66a..13a86c3d4fe 100644
--- a/spec/workers/pipeline_hooks_worker_spec.rb
+++ b/spec/workers/pipeline_hooks_worker_spec.rb
@@ -8,8 +8,10 @@ RSpec.describe PipelineHooksWorker do
let(:pipeline) { create(:ci_pipeline) }
it 'executes hooks for the pipeline' do
- expect_any_instance_of(Ci::Pipeline)
- .to receive(:execute_hooks)
+ hook_service = double
+
+ expect(Ci::Pipelines::HookService).to receive(:new).and_return(hook_service)
+ expect(hook_service).to receive(:execute)
described_class.new.perform(pipeline.id)
end
@@ -17,6 +19,8 @@ RSpec.describe PipelineHooksWorker do
context 'when pipeline does not exist' do
it 'does not raise exception' do
+ expect(Ci::Pipelines::HookService).not_to receive(:new)
+
expect { described_class.new.perform(123) }
.not_to raise_error
end
diff --git a/spec/workers/pipeline_process_worker_spec.rb b/spec/workers/pipeline_process_worker_spec.rb
index f8140d11f2e..6e95b7a4753 100644
--- a/spec/workers/pipeline_process_worker_spec.rb
+++ b/spec/workers/pipeline_process_worker_spec.rb
@@ -29,16 +29,6 @@ RSpec.describe PipelineProcessWorker do
end
end
- context 'when the FF ci_idempotent_pipeline_process_worker is disabled' do
- before do
- stub_feature_flags(ci_idempotent_pipeline_process_worker: false)
- end
-
- it 'is not deduplicated' do
- expect(described_class).not_to be_deduplication_enabled
- end
- end
-
describe '#perform' do
context 'when pipeline exists' do
it 'processes pipeline' do
diff --git a/spec/workers/post_receive_spec.rb b/spec/workers/post_receive_spec.rb
index ddd295215a1..039f86f1911 100644
--- a/spec/workers/post_receive_spec.rb
+++ b/spec/workers/post_receive_spec.rb
@@ -428,7 +428,7 @@ RSpec.describe PostReceive do
end
it 'expires the status cache' do
- expect(snippet.repository).to receive(:empty?).and_return(true)
+ expect(snippet.repository).to receive(:empty?).at_least(:once).and_return(true)
expect(snippet.repository).to receive(:expire_status_cache)
perform
diff --git a/spec/workers/run_pipeline_schedule_worker_spec.rb b/spec/workers/run_pipeline_schedule_worker_spec.rb
index fc572c0d9c3..bb11d1dbb58 100644
--- a/spec/workers/run_pipeline_schedule_worker_spec.rb
+++ b/spec/workers/run_pipeline_schedule_worker_spec.rb
@@ -68,5 +68,20 @@ RSpec.describe RunPipelineScheduleWorker do
worker.perform(pipeline_schedule.id, user.id)
end
end
+
+ context 'when pipeline cannot be created' do
+ before do
+ allow(Ci::CreatePipelineService).to receive(:new) { raise Ci::CreatePipelineService::CreateError }
+ end
+
+ it 'logging a pipeline error' do
+ expect(worker)
+ .to receive(:log_extra_metadata_on_done)
+ .with(:pipeline_creation_error, an_instance_of(Ci::CreatePipelineService::CreateError))
+ .and_call_original
+
+ worker.perform(pipeline_schedule.id, user.id)
+ end
+ end
end
end
diff --git a/spec/workers/stuck_ci_jobs_worker_spec.rb b/spec/workers/stuck_ci_jobs_worker_spec.rb
index e0a5d3c6c1c..19ff8ec55c2 100644
--- a/spec/workers/stuck_ci_jobs_worker_spec.rb
+++ b/spec/workers/stuck_ci_jobs_worker_spec.rb
@@ -5,50 +5,34 @@ require 'spec_helper'
RSpec.describe StuckCiJobsWorker do
include ExclusiveLeaseHelpers
- let(:worker_lease_key) { StuckCiJobsWorker::EXCLUSIVE_LEASE_KEY }
- let(:worker_lease_uuid) { SecureRandom.uuid }
- let(:worker2) { described_class.new }
-
- subject(:worker) { described_class.new }
-
- before do
- stub_exclusive_lease(worker_lease_key, worker_lease_uuid)
- end
+ let(:worker) { described_class.new }
+ let(:lease_uuid) { SecureRandom.uuid }
describe '#perform' do
- it 'executes an instance of Ci::StuckBuildsDropService' do
- expect_next_instance_of(Ci::StuckBuilds::DropService) do |service|
- expect(service).to receive(:execute).exactly(:once)
- end
-
- worker.perform
- end
+ subject { worker.perform }
- context 'with an exclusive lease' do
- it 'does not execute concurrently' do
- expect(worker).to receive(:remove_lease).exactly(:once)
- expect(worker2).not_to receive(:remove_lease)
+ it 'enqueues a Ci::StuckBuilds::DropRunningWorker job' do
+ expect(Ci::StuckBuilds::DropRunningWorker).to receive(:perform_in).with(20.minutes).exactly(:once)
- worker.perform
+ subject
+ end
- stub_exclusive_lease_taken(worker_lease_key)
+ it 'enqueues a Ci::StuckBuilds::DropScheduledWorker job' do
+ expect(Ci::StuckBuilds::DropScheduledWorker).to receive(:perform_in).with(40.minutes).exactly(:once)
- worker2.perform
- end
+ subject
+ end
- it 'can execute in sequence' do
- expect(worker).to receive(:remove_lease).at_least(:once)
- expect(worker2).to receive(:remove_lease).at_least(:once)
+ it 'executes an instance of Ci::StuckBuilds::DropPendingService' do
+ expect_to_obtain_exclusive_lease(worker.lease_key, lease_uuid)
- worker.perform
- worker2.perform
+ expect_next_instance_of(Ci::StuckBuilds::DropPendingService) do |service|
+ expect(service).to receive(:execute).exactly(:once)
end
- it 'cancels exclusive leases after worker perform' do
- expect_to_cancel_exclusive_lease(worker_lease_key, worker_lease_uuid)
+ expect_to_cancel_exclusive_lease(worker.lease_key, lease_uuid)
- worker.perform
- end
+ subject
end
end
end
diff --git a/storybook/config/main.js b/storybook/config/main.js
index c1369aebd91..59aa9deb3b5 100644
--- a/storybook/config/main.js
+++ b/storybook/config/main.js
@@ -1,4 +1,3 @@
-/* eslint-disable import/no-commonjs */
const IS_EE = require('../../config/helpers/is_ee_env');
module.exports = {
@@ -6,5 +5,5 @@ module.exports = {
'../../app/assets/javascripts/**/*.stories.js',
IS_EE && '../../ee/app/assets/javascripts/**/*.stories.js',
].filter(Boolean),
- addons: ['@storybook/addon-essentials', '@storybook/addon-a11y'],
+ addons: ['@storybook/addon-essentials', '@storybook/addon-a11y', 'storybook-mirage'],
};
diff --git a/storybook/config/preview.js b/storybook/config/preview.js
index 4f496665de6..a55d0d52a0c 100644
--- a/storybook/config/preview.js
+++ b/storybook/config/preview.js
@@ -1,6 +1,7 @@
-// eslint-disable-next-line import/no-extraneous-dependencies
+import { withServer } from 'storybook-mirage'; // eslint-disable-line import/no-unresolved
import Vue from 'vue';
-import translateMixin from '../../app/assets/javascripts/vue_shared/translate';
+import { createMockServer } from 'test_helpers/mock_server';
+import translateMixin from '~/vue_shared/translate';
const stylesheetsRequireCtx = require.context(
'../../app/assets/stylesheets',
@@ -13,3 +14,5 @@ translateMixin(Vue);
stylesheetsRequireCtx('./application.scss');
stylesheetsRequireCtx('./application_utilities.scss');
+
+export const decorators = [withServer(createMockServer)];
diff --git a/storybook/config/webpack.config.js b/storybook/config/webpack.config.js
index 4382ba43f21..9d630dca970 100644
--- a/storybook/config/webpack.config.js
+++ b/storybook/config/webpack.config.js
@@ -5,6 +5,7 @@ const path = require('path');
const sass = require('node-sass'); // eslint-disable-line import/no-unresolved
const { buildIncludePaths, resolveGlobUrl } = require('node-sass-magic-importer/dist/toolbox'); // eslint-disable-line import/no-unresolved
const webpack = require('webpack');
+const IS_EE = require('../../config/helpers/is_ee_env');
const IS_JH = require('../../config/helpers/is_jh_env');
const gitlabWebpackConfig = require('../../config/webpack.config');
@@ -98,13 +99,31 @@ module.exports = function storybookWebpackConfig({ config }) {
},
],
},
+ {
+ test: /\.(graphql|gql)$/,
+ exclude: /node_modules/,
+ loader: 'graphql-tag/loader',
+ },
+ {
+ test: /\.(zip)$/,
+ loader: 'file-loader',
+ options: {
+ esModule: false,
+ },
+ },
];
// Silence webpack warnings about moment/pikaday not being able to resolve.
config.plugins.push(new webpack.IgnorePlugin(/moment/, /pikaday/));
+ const baseIntegrationTestHelpersPath = 'spec/frontend_integration/test_helpers';
+
// Add any missing aliases from the main GitLab webpack config
- Object.assign(config.resolve.alias, gitlabWebpackConfig.resolve.alias);
+ Object.assign(config.resolve.alias, gitlabWebpackConfig.resolve.alias, {
+ test_helpers: path.resolve(ROOT, baseIntegrationTestHelpersPath),
+ ee_else_ce_test_helpers: path.resolve(ROOT, IS_EE ? 'ee' : '', baseIntegrationTestHelpersPath),
+ test_fixtures: path.resolve(ROOT, 'tmp/tests/frontend', IS_EE ? 'fixtures-ee' : 'fixtures'),
+ });
// The main GitLab project aliases this `icons.svg` file to app/assets/javascripts/lib/utils/icons_path.js,
// which depends on the existence of a global `gon` variable.
// By deleting the alias, imports of this path will resolve as expected.
diff --git a/storybook/package.json b/storybook/package.json
index 4b922a4776c..48083ed1ce3 100644
--- a/storybook/package.json
+++ b/storybook/package.json
@@ -14,9 +14,11 @@
"@storybook/addon-controls": "^6.2.9",
"@storybook/addon-essentials": "^6.2.9",
"@storybook/vue": "6.2.9",
+ "graphql-tag": "^2.12.5",
"node-sass": "^4.14.1",
"node-sass-magic-importer": "^5.3.2",
"postcss-loader": "3.0.0",
- "sass-loader": "^7.1.0"
+ "sass-loader": "^7.1.0",
+ "storybook-mirage": "^0.0.4"
}
}
diff --git a/storybook/yarn.lock b/storybook/yarn.lock
index de00d3bcfc2..d63618ebc65 100644
--- a/storybook/yarn.lock
+++ b/storybook/yarn.lock
@@ -5388,6 +5388,13 @@ graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6
resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.6.tgz#ff040b2b0853b23c3d31027523706f1885d76bee"
integrity sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==
+graphql-tag@^2.12.5:
+ version "2.12.5"
+ resolved "https://registry.yarnpkg.com/graphql-tag/-/graphql-tag-2.12.5.tgz#5cff974a67b417747d05c8d9f5f3cb4495d0db8f"
+ integrity sha512-5xNhP4063d16Pz3HBtKprutsPrmHZi5IdUGOWRxA2B6VF7BIRGOHZ5WQvDmJXZuPcBg7rYwaFxvQYjqkSdR3TQ==
+ dependencies:
+ tslib "^2.1.0"
+
gud@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/gud/-/gud-1.0.0.tgz#a489581b17e6a70beca9abe3ae57de7a499852c0"
@@ -9546,6 +9553,11 @@ store2@^2.12.0:
resolved "https://registry.yarnpkg.com/store2/-/store2-2.12.0.tgz#e1f1b7e1a59b6083b2596a8d067f6ee88fd4d3cf"
integrity sha512-7t+/wpKLanLzSnQPX8WAcuLCCeuSHoWdQuh9SB3xD0kNOM38DNf+0Oa+wmvxmYueRzkmh6IcdKFtvTa+ecgPDw==
+storybook-mirage@^0.0.4:
+ version "0.0.4"
+ resolved "https://registry.yarnpkg.com/storybook-mirage/-/storybook-mirage-0.0.4.tgz#572e5d310ad8f0dd963e5c341aa2402f8ed07749"
+ integrity sha512-oGjsxyxmedXQtsVW1DDwKM1RocAD5zClFeOFtAhK46NcGXLJ31m2WQg5kL7YqrsriorrCZq4vvSy05DVCD7BKQ==
+
stream-browserify@^2.0.1:
version "2.0.2"
resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.2.tgz#87521d38a44aa7ee91ce1cd2a47df0cb49dd660b"
@@ -10057,6 +10069,11 @@ tslib@^2.0.1, tslib@^2.0.3:
resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.2.0.tgz#fb2c475977e35e241311ede2693cee1ec6698f5c"
integrity sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==
+tslib@^2.1.0:
+ version "2.3.1"
+ resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.1.tgz#e8a335add5ceae51aa261d32a490158ef042ef01"
+ integrity sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==
+
tty-browserify@0.0.0:
version "0.0.0"
resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6"
diff --git a/tooling/danger/product_intelligence.rb b/tooling/danger/product_intelligence.rb
index 30c961184f5..848f99eeff5 100644
--- a/tooling/danger/product_intelligence.rb
+++ b/tooling/danger/product_intelligence.rb
@@ -30,7 +30,7 @@ module Tooling
].freeze
def missing_labels
- return [] unless helper.ci?
+ return [] if !helper.ci? || helper.mr_has_labels?('growth experiment')
labels = []
labels << 'product intelligence' unless helper.mr_has_labels?('product intelligence')
@@ -66,7 +66,6 @@ module Tooling
js_patterns = Regexp.union(
'Tracking.event',
/\btrack\(/,
- 'data-track-event',
'data-track-action'
)
all_changed_files.select do |file|
diff --git a/tooling/danger/project_helper.rb b/tooling/danger/project_helper.rb
index 109f77ed4d1..c552a75bba8 100644
--- a/tooling/danger/project_helper.rb
+++ b/tooling/danger/project_helper.rb
@@ -113,6 +113,7 @@ module Tooling
generator_templates/usage_metric_definition/metric_definition\.yml)\z}x => [:backend, :product_intelligence],
%r{\A((ee|jh)/)?app/(?!assets|views)[^/]+} => :backend,
%r{\A((ee|jh)/)?(bin|config|generator_templates|lib|rubocop)/} => :backend,
+ %r{\A((ee|jh)/)?spec/migrations} => :database,
%r{\A((ee|jh)/)?spec/} => :backend,
%r{\A((ee|jh)/)?vendor/} => :backend,
%r{\A(Gemfile|Gemfile.lock|Rakefile)\z} => :backend,
@@ -174,8 +175,16 @@ module Tooling
ee? ? 'gitlab' : 'gitlab-foss'
end
+ def file_lines(filename)
+ read_file(filename).lines(chomp: true)
+ end
+
private
+ def read_file(filename)
+ File.read(filename)
+ end
+
def ee?
# Support former project name for `dev` and support local Danger run
%w[gitlab gitlab-ee].include?(ENV['CI_PROJECT_NAME']) || Dir.exist?(File.expand_path('../../../ee', __dir__))
diff --git a/tooling/danger/specs.rb b/tooling/danger/specs.rb
new file mode 100644
index 00000000000..466230bb86b
--- /dev/null
+++ b/tooling/danger/specs.rb
@@ -0,0 +1,59 @@
+# frozen_string_literal: true
+
+module Tooling
+ module Danger
+ module Specs
+ SPEC_FILES_REGEX = 'spec/'
+ EE_PREFIX = 'ee/'
+ MATCH_WITH_ARRAY_REGEX = /(?<to>to\(?\s*)(?<matcher>match|eq)(?<expectation>[( ]?\[)/.freeze
+ SUGGEST_MR_COMMENT = <<~SUGGEST_COMMENT
+ ```suggestion
+ %<suggested_line>s
+ ```
+
+ If order of the result is not important, please consider using `match_array` to avoid flakiness.
+ SUGGEST_COMMENT
+
+ def changed_specs_files(ee: :include)
+ changed_files = helper.all_changed_files
+ folder_prefix =
+ case ee
+ when :include
+ "(#{EE_PREFIX})?"
+ when :only
+ EE_PREFIX
+ when :exclude
+ nil
+ end
+
+ changed_files.grep(%r{\A#{folder_prefix}#{SPEC_FILES_REGEX}})
+ end
+
+ def add_suggestions_for_match_with_array(filename)
+ added_lines = added_line_matching_match_with_array(filename)
+ return if added_lines.empty?
+
+ spec_file_lines = project_helper.file_lines(filename)
+
+ added_lines.each_with_object([]) do |added_line, processed_line_numbers|
+ line_number = find_line_number(spec_file_lines, added_line.delete_prefix('+'), exclude_indexes: processed_line_numbers)
+ processed_line_numbers << line_number
+ markdown(format(SUGGEST_MR_COMMENT, suggested_line: spec_file_lines[line_number].gsub(MATCH_WITH_ARRAY_REGEX, '\k<to>match_array\k<expectation>')), file: filename, line: line_number.succ)
+ end
+ end
+
+ def added_line_matching_match_with_array(filename)
+ helper.changed_lines(filename).grep(/\A\+ /).grep(MATCH_WITH_ARRAY_REGEX)
+ end
+
+ private
+
+ def find_line_number(file_lines, searched_line, exclude_indexes: [])
+ file_lines.each_with_index do |file_line, index|
+ next if exclude_indexes.include?(index)
+ break index if file_line == searched_line
+ end
+ end
+ end
+ end
+end
diff --git a/tooling/deprecations/docs.rb b/tooling/deprecations/docs.rb
index adc3e0edb10..67ff7a932b4 100644
--- a/tooling/deprecations/docs.rb
+++ b/tooling/deprecations/docs.rb
@@ -20,7 +20,7 @@ module Deprecations
YAML.load_file(file)
end
- deprecations = VersionSorter.rsort(deprecations) { |d| d["removal_milestone"] }
+ deprecations = VersionSorter.sort(deprecations) { |d| d["removal_milestone"] }
milestones = deprecations.map { |d| d["removal_milestone"] }.uniq
diff --git a/tooling/graphql/docs/templates/default.md.haml b/tooling/graphql/docs/templates/default.md.haml
index 7d42fb3a9f8..fad954ebb01 100644
--- a/tooling/graphql/docs/templates/default.md.haml
+++ b/tooling/graphql/docs/templates/default.md.haml
@@ -18,8 +18,12 @@
in [Removed Items](../removed_items.md).
<!-- vale off -->
- <!-- Docs linting disabled after this line. -->
+ <!-- Vale linting disabled after this line. -->
<!-- See https://docs.gitlab.com/ee/development/documentation/testing.html#disable-vale-tests -->
+
+ <!-- markdownlint-disable MD044 -->
+ <!-- MD044/proper-names test disabled after this line to make page compatible with markdownlint-cli 0.29.0. -->
+ <!-- See https://docs.gitlab.com/ee/development/documentation/testing.html#disable-markdownlint-tests -->
\
:plain
diff --git a/tooling/lib/tooling/helm3_client.rb b/tooling/lib/tooling/helm3_client.rb
index 3743138f27e..6e4a35e82f1 100644
--- a/tooling/lib/tooling/helm3_client.rb
+++ b/tooling/lib/tooling/helm3_client.rb
@@ -19,7 +19,7 @@ module Tooling
end
def last_update
- @last_update ||= Time.parse(self[:last_update])
+ @last_update ||= self[:last_update] ? Time.parse(self[:last_update]) : nil
end
end
diff --git a/tooling/quality/test_level.rb b/tooling/quality/test_level.rb
index ad9de067375..83cbe7a1f19 100644
--- a/tooling/quality/test_level.rb
+++ b/tooling/quality/test_level.rb
@@ -60,20 +60,20 @@ module Quality
system: ['features']
}.freeze
- attr_reader :prefix
+ attr_reader :prefixes
- def initialize(prefix = nil)
- @prefix = prefix
+ def initialize(prefixes = nil)
+ @prefixes = Array(prefixes)
@patterns = {}
@regexps = {}
end
def pattern(level)
- @patterns[level] ||= "#{prefix}spec/#{folders_pattern(level)}{,/**/}*#{suffix(level)}"
+ @patterns[level] ||= "#{prefixes_for_pattern}spec/#{folders_pattern(level)}{,/**/}*#{suffix(level)}"
end
def regexp(level)
- @regexps[level] ||= Regexp.new("#{prefix}spec/#{folders_regex(level)}").freeze
+ @regexps[level] ||= Regexp.new("#{prefixes_for_regex}spec/#{folders_regex(level)}").freeze
end
def level_for(file_path)
@@ -102,6 +102,20 @@ module Quality
private
+ def prefixes_for_pattern
+ return '' if prefixes.empty?
+
+ "{#{prefixes.join(',')}}"
+ end
+
+ def prefixes_for_regex
+ return '' if prefixes.empty?
+
+ regex_prefix = prefixes.map(&Regexp.method(:escape)).join('|')
+
+ "(#{regex_prefix})"
+ end
+
def suffix(level)
case level
when :frontend_fixture
diff --git a/vendor/project_templates/cluster_management.tar.gz b/vendor/project_templates/cluster_management.tar.gz
index 9b168724c79..015b943dba7 100644
--- a/vendor/project_templates/cluster_management.tar.gz
+++ b/vendor/project_templates/cluster_management.tar.gz
Binary files differ
diff --git a/vendor/project_templates/learn_gitlab.tar.gz b/vendor/project_templates/learn_gitlab.tar.gz
deleted file mode 100644
index 2596d9bade0..00000000000
--- a/vendor/project_templates/learn_gitlab.tar.gz
+++ /dev/null
Binary files differ
diff --git a/vendor/project_templates/learn_gitlab_ultimate_trial.tar.gz b/vendor/project_templates/learn_gitlab_ultimate_trial.tar.gz
index 89d69de52dc..b8d14bbad93 100644
--- a/vendor/project_templates/learn_gitlab_ultimate_trial.tar.gz
+++ b/vendor/project_templates/learn_gitlab_ultimate_trial.tar.gz
Binary files differ
diff --git a/workhorse/gitaly_integration_test.go b/workhorse/gitaly_integration_test.go
index 9bf53af523e..48de45d7935 100644
--- a/workhorse/gitaly_integration_test.go
+++ b/workhorse/gitaly_integration_test.go
@@ -230,7 +230,7 @@ func TestAllowedGetGitArchiveOldPayload(t *testing.T) {
// Create the repository in the Gitaly server
apiResponse := realGitalyOkBody(t)
- repo := apiResponse.Repository
+ repo := &apiResponse.Repository
require.NoError(t, ensureGitalyRepository(t, apiResponse))
archivePath := path.Join(scratchDir, "my/path")
diff --git a/workhorse/gitaly_test.go b/workhorse/gitaly_test.go
index 42aaad6e02d..4ace925001a 100644
--- a/workhorse/gitaly_test.go
+++ b/workhorse/gitaly_test.go
@@ -5,6 +5,7 @@ import (
"encoding/base64"
"encoding/json"
"fmt"
+ "io"
"io/ioutil"
"math/rand"
"net"
@@ -20,12 +21,16 @@ import (
"github.com/golang/protobuf/jsonpb" //lint:ignore SA1019 https://gitlab.com/gitlab-org/gitlab/-/issues/324868
"github.com/golang/protobuf/proto" //lint:ignore SA1019 https://gitlab.com/gitlab-org/gitlab/-/issues/324868
+ "github.com/sirupsen/logrus"
"github.com/stretchr/testify/require"
"google.golang.org/grpc"
"google.golang.org/grpc/codes"
+ "google.golang.org/grpc/credentials/insecure"
"gitlab.com/gitlab-org/gitaly/v14/proto/go/gitalypb"
+ gitalyclient "gitlab.com/gitlab-org/gitaly/v14/client"
+
"gitlab.com/gitlab-org/gitlab/workhorse/internal/api"
"gitlab.com/gitlab-org/gitlab/workhorse/internal/git"
"gitlab.com/gitlab-org/gitlab/workhorse/internal/gitaly"
@@ -375,12 +380,24 @@ func TestPostReceivePackRouting(t *testing.T) {
}
}
+type gitalyServerStarter func(*testing.T, codes.Code) (*combinedServer, string)
+
// ReaderFunc is an adapter to turn a conforming function into an io.Reader.
type ReaderFunc func(b []byte) (int, error)
func (r ReaderFunc) Read(b []byte) (int, error) { return r(b) }
func TestPostUploadPackProxiedToGitalySuccessfully(t *testing.T) {
+ testPostUploadPackProxiedToGitalySuccessfully(t, startGitalyServer, gitOkBody(t))
+}
+
+func TestPostUploadPackWithSidechannelProxiedToGitalySuccessfully(t *testing.T) {
+ testPostUploadPackProxiedToGitalySuccessfully(
+ t, startGitalyServerWithSideChannel(testhelper.PostUploadPackWithSidechannel), gitOkBodyWithSidechannel(t),
+ )
+}
+
+func testPostUploadPackProxiedToGitalySuccessfully(t *testing.T, startGitaly gitalyServerStarter, apiResponse *api.Response) {
for i, tc := range []struct {
showAllRefs bool
code codes.Code
@@ -391,10 +408,9 @@ func TestPostUploadPackProxiedToGitalySuccessfully(t *testing.T) {
{false, codes.Unavailable},
} {
t.Run(fmt.Sprintf("Case %d", i), func(t *testing.T) {
- apiResponse := gitOkBody(t)
apiResponse.ShowAllRefs = tc.showAllRefs
- gitalyServer, socketPath := startGitalyServer(t, tc.code)
+ gitalyServer, socketPath := startGitaly(t, tc.code)
defer gitalyServer.GracefulStop()
apiResponse.GitalyServer.Address = "unix:" + socketPath
@@ -460,8 +476,16 @@ func TestPostUploadPackProxiedToGitalySuccessfully(t *testing.T) {
func TestPostUploadPackProxiedToGitalyInterrupted(t *testing.T) {
apiResponse := gitOkBody(t)
+ testPostUploadPackProxiedToGitalyInterrupted(t, startGitalyServer, apiResponse)
+}
- gitalyServer, socketPath := startGitalyServer(t, codes.OK)
+func TestPostUploadPackWithSidechannelProxiedToGitalyInterrupted(t *testing.T) {
+ apiResponse := gitOkBodyWithSidechannel(t)
+ testPostUploadPackProxiedToGitalyInterrupted(t, startGitalyServerWithSideChannel(testhelper.PostUploadPackWithSidechannel), apiResponse)
+}
+
+func testPostUploadPackProxiedToGitalyInterrupted(t *testing.T, startGitaly gitalyServerStarter, apiResponse *api.Response) {
+ gitalyServer, socketPath := startGitaly(t, codes.OK)
defer gitalyServer.GracefulStop()
apiResponse.GitalyServer.Address = "unix:" + socketPath
@@ -493,10 +517,19 @@ func TestPostUploadPackProxiedToGitalyInterrupted(t *testing.T) {
}
func TestPostUploadPackRouting(t *testing.T) {
- gitalyServer, socketPath := startGitalyServer(t, codes.OK)
+ apiResponse := gitOkBody(t)
+ testPostUploadPackRouting(t, startGitalyServer, apiResponse)
+}
+
+func TestPostUploadPackWithSidechannelRouting(t *testing.T) {
+ apiResponse := gitOkBodyWithSidechannel(t)
+ testPostUploadPackRouting(t, startGitalyServerWithSideChannel(testhelper.PostUploadPackWithSidechannel), apiResponse)
+}
+
+func testPostUploadPackRouting(t *testing.T, startGitaly gitalyServerStarter, apiResponse *api.Response) {
+ gitalyServer, socketPath := startGitaly(t, codes.OK)
defer gitalyServer.GracefulStop()
- apiResponse := gitOkBody(t)
apiResponse.GitalyServer.Address = "unix:" + socketPath
ts := testAuthServer(t, nil, nil, 200, apiResponse)
defer ts.Close()
@@ -869,3 +902,21 @@ func startGitalyServer(t *testing.T, finalMessageCode codes.Code) (*combinedServ
return &combinedServer{Server: server, GitalyTestServer: gitalyServer}, socketPath
}
+
+func startGitalyServerWithSideChannel(handler func(interface{}, grpc.ServerStream, io.ReadWriteCloser) error) gitalyServerStarter {
+ return func(t *testing.T, finalMessageCode codes.Code) (*combinedServer, string) {
+ socketPath := path.Join(scratchDir, fmt.Sprintf("gitaly-%d.sock", rand.Int()))
+ if err := os.Remove(socketPath); err != nil && !os.IsNotExist(err) {
+ t.Fatal(err)
+ }
+ server := grpc.NewServer(gitalyclient.TestSidechannelServer(logrus.NewEntry(logrus.StandardLogger()), insecure.NewCredentials(), handler)...)
+ listener, err := net.Listen("unix", socketPath)
+ require.NoError(t, err)
+
+ gitalyServer := testhelper.NewGitalyServer(finalMessageCode)
+
+ go server.Serve(listener)
+
+ return &combinedServer{Server: server, GitalyTestServer: gitalyServer}, socketPath
+ }
+}
diff --git a/workhorse/go.mod b/workhorse/go.mod
index 834ad382983..1d9ae69289c 100644
--- a/workhorse/go.mod
+++ b/workhorse/go.mod
@@ -3,11 +3,11 @@ module gitlab.com/gitlab-org/gitlab/workhorse
go 1.16
require (
- github.com/Azure/azure-storage-blob-go v0.11.1-0.20201209121048-6df5d9af221d
+ github.com/Azure/azure-storage-blob-go v0.13.0
github.com/BurntSushi/toml v0.3.1
github.com/FZambia/sentinel v1.0.0
github.com/alecthomas/chroma v0.7.3
- github.com/aws/aws-sdk-go v1.37.0
+ github.com/aws/aws-sdk-go v1.38.35
github.com/certifi/gocertifi v0.0.0-20200922220541-2c3bb06c6054 // indirect
github.com/disintegration/imaging v1.6.2
github.com/getsentry/raven-go v0.2.0
@@ -28,14 +28,14 @@ require (
github.com/sirupsen/logrus v1.8.1
github.com/smartystreets/goconvey v1.6.4
github.com/stretchr/testify v1.7.0
- gitlab.com/gitlab-org/gitaly/v14 v14.0.0-rc1
+ gitlab.com/gitlab-org/gitaly/v14 v14.3.0-rc2.0.20211007055622-df7dadcc3f74
gitlab.com/gitlab-org/labkit v1.6.0
- gocloud.dev v0.21.1-0.20201223184910-5094f54ed8bb
+ gocloud.dev v0.23.0
golang.org/x/image v0.0.0-20191009234506-e7c1f5e7dbb8
golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5
- golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4
+ golang.org/x/net v0.0.0-20210505214959-0714010a04ed
golang.org/x/tools v0.1.0
- google.golang.org/grpc v1.37.0
+ google.golang.org/grpc v1.38.0
gopkg.in/DataDog/dd-trace-go.v1 v1.31.0 // indirect
honnef.co/go/tools v0.1.3
)
diff --git a/workhorse/go.sum b/workhorse/go.sum
index f928b7f7a92..c5bcf1571be 100644
--- a/workhorse/go.sum
+++ b/workhorse/go.sum
@@ -16,7 +16,6 @@ cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKV
cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs=
cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc=
cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY=
-cloud.google.com/go v0.66.0/go.mod h1:dgqGAjKCDxyhGTtC9dAREQGUJpkceNm1yt590Qno0Ko=
cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI=
cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk=
cloud.google.com/go v0.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY=
@@ -32,52 +31,51 @@ cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4g
cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ=
cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE=
cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk=
-cloud.google.com/go/firestore v1.4.0/go.mod h1:NjjGEnxCS3CAKYp+vmALu20QzcqasGodQp48WxJGAYc=
+cloud.google.com/go/firestore v1.5.0/go.mod h1:c4nNYR1qdq7eaZ+jSc5fonrQN2k3M7sWATcYTiakjEo=
cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I=
cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw=
cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA=
cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU=
-cloud.google.com/go/pubsub v1.9.0/go.mod h1:G3o6/kJvEMIEAN5urdkaP4be49WQsjNiykBIto9LFtY=
+cloud.google.com/go/pubsub v1.10.3/go.mod h1:FUcc28GpGxxACoklPsE1sCtbkY4Ix+ro7yvw+h82Jn4=
cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw=
cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos=
cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk=
cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs=
cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0=
-cloud.google.com/go/storage v1.12.0 h1:4y3gHptW1EHVtcPAVE0eBBlFuGqEejTTG3KdIE0lUX4=
-cloud.google.com/go/storage v1.12.0/go.mod h1:fFLk2dp2oAhDz8QFKwqrjdJvxSp/W2g7nillojlL5Ho=
+cloud.google.com/go/storage v1.15.0 h1:Ljj+ZXVEhCr/1+4ZhvtteN1ND7UUsNTlduGclLh8GO0=
+cloud.google.com/go/storage v1.15.0/go.mod h1:mjjQMoxxyGH7Jr8K5qrx6N2O0AHsczI61sMNn03GIZI=
contrib.go.opencensus.io/exporter/aws v0.0.0-20200617204711-c478e41e60e9/go.mod h1:uu1P0UCM/6RbsMrgPa98ll8ZcHM858i/AD06a9aLRCA=
-contrib.go.opencensus.io/exporter/stackdriver v0.13.4/go.mod h1:aXENhDJ1Y4lIg4EUaVTwzvYETVNZk10Pu26tevFKLUc=
+contrib.go.opencensus.io/exporter/stackdriver v0.13.5/go.mod h1:aXENhDJ1Y4lIg4EUaVTwzvYETVNZk10Pu26tevFKLUc=
contrib.go.opencensus.io/exporter/stackdriver v0.13.8 h1:lIFYmQsqejvlq+GobFUbC5F0prD5gvhP6r0gWLZRDq4=
contrib.go.opencensus.io/exporter/stackdriver v0.13.8/go.mod h1:huNtlWx75MwO7qMs0KrMxPZXzNNWebav1Sq/pm02JdQ=
contrib.go.opencensus.io/integrations/ocsql v0.1.7/go.mod h1:8DsSdjz3F+APR+0z0WkU1aRorQCFfRxvqjUUPMbF3fE=
dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
github.com/AndreasBriese/bbloom v0.0.0-20190306092124-e2d15f34fcf9/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8=
-github.com/Azure/azure-amqp-common-go/v3 v3.0.1/go.mod h1:PBIGdzcO1teYoufTKMcGibdKaYZv4avS+O6LNIp8bq0=
github.com/Azure/azure-amqp-common-go/v3 v3.1.0/go.mod h1:PBIGdzcO1teYoufTKMcGibdKaYZv4avS+O6LNIp8bq0=
github.com/Azure/azure-pipeline-go v0.2.3 h1:7U9HBg1JFK3jHl5qmo4CTZKFTVgMwdFHMVtCdfBE21U=
github.com/Azure/azure-pipeline-go v0.2.3/go.mod h1:x841ezTBIMG6O3lAcl8ATHnsOPVl2bqk7S3ta6S6u4k=
-github.com/Azure/azure-sdk-for-go v37.1.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc=
-github.com/Azure/azure-sdk-for-go v49.0.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc=
-github.com/Azure/azure-service-bus-go v0.10.7/go.mod h1:o5z/3lDG1iT/T/G7vgIwIqVDTx9Qa2wndf5OdzSzpF8=
-github.com/Azure/azure-storage-blob-go v0.11.1-0.20201209121048-6df5d9af221d h1:YEjZNZ0HS7ITX+BJ7wUXtTk6GXM3g8xftaqQ94XU/cs=
-github.com/Azure/azure-storage-blob-go v0.11.1-0.20201209121048-6df5d9af221d/go.mod h1:A0u4VjtpgZJ7Y7um/+ix2DHBuEKFC6sEIlj0xc13a4Q=
+github.com/Azure/azure-sdk-for-go v51.1.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc=
+github.com/Azure/azure-sdk-for-go v54.0.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc=
+github.com/Azure/azure-service-bus-go v0.10.11/go.mod h1:AWw9eTTWZVZyvgpPahD1ybz3a8/vT3GsJDS8KYex55U=
+github.com/Azure/azure-storage-blob-go v0.13.0 h1:lgWHvFh+UYBNVQLFHXkvul2f6yOPA9PIH82RTG2cSwc=
+github.com/Azure/azure-storage-blob-go v0.13.0/go.mod h1:pA9kNqtjUeQF2zOSu4s//nUdBD+e64lEuc4sVnuOfNs=
github.com/Azure/go-amqp v0.13.0/go.mod h1:qj+o8xPCz9tMSbQ83Vp8boHahuRDl5mkNHyt1xlxUTs=
-github.com/Azure/go-amqp v0.13.1/go.mod h1:qj+o8xPCz9tMSbQ83Vp8boHahuRDl5mkNHyt1xlxUTs=
+github.com/Azure/go-amqp v0.13.4/go.mod h1:wbpCKA8tR5MLgRyIu+bb+S6ECdIDdYJ0NlpFE9xsBPI=
+github.com/Azure/go-amqp v0.13.7/go.mod h1:wbpCKA8tR5MLgRyIu+bb+S6ECdIDdYJ0NlpFE9xsBPI=
github.com/Azure/go-autorest v14.2.0+incompatible h1:V5VMDjClD3GiElqLWO7mz2MxNAK/vTfRHdAubSIPRgs=
github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24=
github.com/Azure/go-autorest/autorest v0.11.3/go.mod h1:JFgpikqFJ/MleTTxwepExTKnFUKKszPS8UavbQYUMuw=
-github.com/Azure/go-autorest/autorest v0.11.7/go.mod h1:V6p3pKZx1KKkJubbxnDWrzNhEIfOy/pTGasLqzHIPHs=
-github.com/Azure/go-autorest/autorest v0.11.9/go.mod h1:eipySxLmqSyC5s5k1CLupqet0PSENBEDP93LQ9a8QYw=
-github.com/Azure/go-autorest/autorest v0.11.12 h1:gI8ytXbxMfI+IVbI9mP2JGCTXIuhHLgRlvQ9X4PsnHE=
-github.com/Azure/go-autorest/autorest v0.11.12/go.mod h1:eipySxLmqSyC5s5k1CLupqet0PSENBEDP93LQ9a8QYw=
+github.com/Azure/go-autorest/autorest v0.11.17/go.mod h1:eipySxLmqSyC5s5k1CLupqet0PSENBEDP93LQ9a8QYw=
+github.com/Azure/go-autorest/autorest v0.11.18 h1:90Y4srNYrwOtAgVo3ndrQkTYn6kf1Eg/AjTFJ8Is2aM=
+github.com/Azure/go-autorest/autorest v0.11.18/go.mod h1:dSiJPy22c3u0OtOKDNttNgqpNFY/GeWa7GH/Pz56QRA=
github.com/Azure/go-autorest/autorest/adal v0.9.0/go.mod h1:/c022QCutn2P7uY+/oQWWNcK9YU+MH96NgK+jErpbcg=
github.com/Azure/go-autorest/autorest/adal v0.9.2/go.mod h1:/3SMAM86bP6wC9Ev35peQDUeqFZBMH07vvUOmg4z/fE=
-github.com/Azure/go-autorest/autorest/adal v0.9.4/go.mod h1:/3SMAM86bP6wC9Ev35peQDUeqFZBMH07vvUOmg4z/fE=
github.com/Azure/go-autorest/autorest/adal v0.9.5/go.mod h1:B7KF7jKIeC9Mct5spmyCB/A8CG/sEz1vwIRGv/bbw7A=
-github.com/Azure/go-autorest/autorest/adal v0.9.6 h1:d3pSDwvBWBLqdA91u+keH1zs1cCEzrQdHKY6iqbQNkE=
-github.com/Azure/go-autorest/autorest/adal v0.9.6/go.mod h1:B7KF7jKIeC9Mct5spmyCB/A8CG/sEz1vwIRGv/bbw7A=
-github.com/Azure/go-autorest/autorest/azure/auth v0.5.3 h1:lZifaPRAk1bqg5vGqreL6F8uLC5V0fDpY8nFvc3boFc=
-github.com/Azure/go-autorest/autorest/azure/auth v0.5.3/go.mod h1:4bJZhUhcq8LB20TruwHbAQsmUs2Xh+QR7utuJpLXX3A=
+github.com/Azure/go-autorest/autorest/adal v0.9.11/go.mod h1:nBKAnTomx8gDtl+3ZCJv2v0KACFHWTB2drffI1B68Pk=
+github.com/Azure/go-autorest/autorest/adal v0.9.13 h1:Mp5hbtOePIzM8pJVRa3YLrWWmZtoxRXqUEzCfJt3+/Q=
+github.com/Azure/go-autorest/autorest/adal v0.9.13/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M=
+github.com/Azure/go-autorest/autorest/azure/auth v0.5.7 h1:8DQB8yl7aLQuP+nuR5e2RO6454OvFlSTXXaNHshc16s=
+github.com/Azure/go-autorest/autorest/azure/auth v0.5.7/go.mod h1:AkzUsqkrdmNhfP2i54HqINVQopw0CLDnvHpJ88Zz1eI=
github.com/Azure/go-autorest/autorest/azure/cli v0.4.2 h1:dMOmEJfkLKW/7JsokJqkyoYSgmR08hi9KrhjZb+JALY=
github.com/Azure/go-autorest/autorest/azure/cli v0.4.2/go.mod h1:7qkJkT+j6b+hIpzMOwPChJhTqS8VbsqqgULzMNRugoM=
github.com/Azure/go-autorest/autorest/date v0.3.0 h1:7gUk1U5M/CQbp9WoqinNzJar+8KY+LPI6wiWrP/myHw=
@@ -86,9 +84,10 @@ github.com/Azure/go-autorest/autorest/mocks v0.4.0/go.mod h1:LTp+uSrOhSkaKrUy935
github.com/Azure/go-autorest/autorest/mocks v0.4.1 h1:K0laFcLE6VLTOwNgSxaGbUcLPuGXlNkbVvq4cW4nIHk=
github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k=
github.com/Azure/go-autorest/autorest/to v0.4.0/go.mod h1:fE8iZBn7LQR7zH/9XU2NcPR4o9jEImooCeWJcYV/zLE=
-github.com/Azure/go-autorest/autorest/validation v0.3.0/go.mod h1:yhLgjC0Wda5DYXl6JAsWyUe4KVNffhoDhG0zVzUMo3E=
-github.com/Azure/go-autorest/logger v0.2.0 h1:e4RVHVZKC5p6UANLJHkM4OfR1UKZPj8Wt8Pcx+3oqrE=
+github.com/Azure/go-autorest/autorest/validation v0.3.1/go.mod h1:yhLgjC0Wda5DYXl6JAsWyUe4KVNffhoDhG0zVzUMo3E=
github.com/Azure/go-autorest/logger v0.2.0/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8=
+github.com/Azure/go-autorest/logger v0.2.1 h1:IG7i4p/mDa2Ce4TRyAO8IHnVhAVF3RFU+ZtXWSmf4Tg=
+github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8=
github.com/Azure/go-autorest/tracing v0.6.0 h1:TYi4+3m5t6K48TGI9AUdb+IzbnSxvnvUMfuitfgcfuo=
github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU=
github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ=
@@ -103,12 +102,14 @@ github.com/DataDog/datadog-go v4.4.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3
github.com/DataDog/gostackparse v0.5.0/go.mod h1:lTfqcJKqS9KnXQGnyQMCugq3u1FP6UZMfWR0aitKFMM=
github.com/FZambia/sentinel v1.0.0 h1:KJ0ryjKTZk5WMp0dXvSdNqp3lFaW1fNFuEYfrkLOYIc=
github.com/FZambia/sentinel v1.0.0/go.mod h1:ytL1Am/RLlAoAXG6Kj5LNuw/TRRQrv2rt2FT26vP5gI=
-github.com/GoogleCloudPlatform/cloudsql-proxy v1.19.1/go.mod h1:+yYmuKqcBVkgRePGpUhTA9OEg0XsnFE96eZ6nJ2yCQM=
+github.com/GoogleCloudPlatform/cloudsql-proxy v1.22.0/go.mod h1:mAm5O/zik2RFmcpigNjg6nMotDL8ZXJaxKzgGVcSMFA=
github.com/HdrHistogram/hdrhistogram-go v1.1.0 h1:6dpdDPTRoo78HxAJ6T1HfMiKSnqhgRRqzCuPshRkQ7I=
github.com/HdrHistogram/hdrhistogram-go v1.1.0/go.mod h1:yDgFjdqOqDEKOvasDdhWNXYg9BVp4O+o5f6V/ehm6Oo=
github.com/Joker/hpp v1.0.0/go.mod h1:8x5n+M1Hp5hC0g8okX3sR3vFQwynaX/UgSOM9MeBKzY=
github.com/Joker/jade v1.0.1-0.20190614124447-d475f43051e7/go.mod h1:6E6s8o2AE4KhCrqr6GRJjdC/gNfTdxkIXvuGZZda2VM=
github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0=
+github.com/Microsoft/go-winio v0.4.14/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA=
+github.com/Microsoft/go-winio v0.4.16/go.mod h1:XB6nPKklQyQ7GC9LdcBEcBl8PF76WugXOPRXwdLnMv0=
github.com/Microsoft/go-winio v0.4.19 h1:ZMZG0O5M8bhD0lgCURV8yu3hQ7TGvQ4L1ZW8+J0j9iE=
github.com/Microsoft/go-winio v0.4.19/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84=
github.com/Shopify/goreferrer v0.0.0-20181106222321-ec9c9a553398/go.mod h1:a1uqRtAwp2Xwc6WNPJEufxJ7fx3npB4UV/JOLmbu5I0=
@@ -120,6 +121,7 @@ github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/
github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c=
github.com/ajg/form v1.5.1/go.mod h1:uL1WgH+h2mgNtvBq0339dVnzXdBETtL2LeUXaIv25UY=
github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw=
+github.com/alcortesm/tgz v0.0.0-20161220082320-9c5fe88206d7/go.mod h1:6zEj6s6u/ghQa61ZWa/C2Aw3RkjiTBOix7dkqa1VLIs=
github.com/alecthomas/assert v0.0.0-20170929043011-405dbfeb8e38 h1:smF2tmSOzy2Mm+0dGI2AIUHY+w0BUc+4tn40djz7+6U=
github.com/alecthomas/assert v0.0.0-20170929043011-405dbfeb8e38/go.mod h1:r7bzyVFMNntcxPZXK3/+KdruV1H5KSlyVY0gc+NgInI=
github.com/alecthomas/chroma v0.7.3 h1:NfdAERMy+esYQs8OXk0I868/qDxxCEo7FMz1WIqMAeI=
@@ -135,12 +137,14 @@ github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRF
github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho=
github.com/alexbrainman/sspi v0.0.0-20180125232955-4729b3d4d858/go.mod h1:976q2ETgjT2snVCf2ZaBnyBbVoPERGjUz+0sofzEfro=
+github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c=
github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=
github.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=
github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=
github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8=
github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=
github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=
+github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs=
github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a/go.mod h1:DAHtR1m6lCRdSC2Tm3DSWRPvIPr6xNKyeHdqDQSQT+A=
github.com/avast/retry-go v2.4.2+incompatible/go.mod h1:XtSnn+n/sHqQIpZ10K1qAevBhOOCWBLXXy3hyiqqBrY=
github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU=
@@ -148,9 +152,9 @@ github.com/aws/aws-sdk-go v1.15.27/go.mod h1:mFuSZ37Z9YOHbQEwBWztmVzqXrEkub65tZo
github.com/aws/aws-sdk-go v1.17.4/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo=
github.com/aws/aws-sdk-go v1.23.20/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.36.1/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro=
-github.com/aws/aws-sdk-go v1.37.0 h1:GzFnhOIsrGyQ69s7VgqtrG2BG8v7X7vwB3Xpbd/DBBk=
github.com/aws/aws-sdk-go v1.37.0/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro=
+github.com/aws/aws-sdk-go v1.38.35 h1:7AlAO0FC+8nFjxiGKEmq0QLpiA8/XFr6eIxgRTwkdTg=
+github.com/aws/aws-sdk-go v1.38.35/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro=
github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g=
github.com/aymerick/raymond v2.0.3-0.20180322193309-b565731e1464+incompatible/go.mod h1:osfaiScAUVup+UC9Nfq76eWqDhXlp+4UYaA8uhTBO6g=
github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
@@ -192,6 +196,7 @@ github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8Nz
github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
github.com/coreos/go-systemd/v22 v22.0.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk=
+github.com/coreos/go-systemd/v22 v22.3.1/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA=
github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE=
github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
@@ -209,6 +214,9 @@ github.com/devigned/tab v0.1.1/go.mod h1:XG9mPq0dFghrYvoBF3xdRrJzSTX1b7IQrvaL9mz
github.com/dgraph-io/badger v1.6.0/go.mod h1:zwt7syl517jmP8s94KqSxTlM6IMsdhYy6psNgSztDR4=
github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw=
+github.com/dgryski/go-metro v0.0.0-20180109044635-280f6062b5bc/go.mod h1:c9O8+fpSOX1DM8cPNSkX/qsBWdkD4yd2dpciOWQjpBw=
+github.com/dgryski/go-minhash v0.0.0-20170608043002-7fe510aff544/go.mod h1:VBi0XHpFy0xiMySf6YpVbRqrupW4RprJ5QTyN+XvGSM=
+github.com/dgryski/go-spooky v0.0.0-20170606183049-ed3d087f40e2/go.mod h1:hgHYKsoIw7S/hlWtP7wD1wZ7SX1jPTtKko5X9jrOgPQ=
github.com/dimchansky/utfbom v1.1.0/go.mod h1:rO41eb7gLfo8SF1jd9F8HplJm1Fewwi4mQvIirEdv+8=
github.com/dimchansky/utfbom v1.1.1 h1:vV6w1AhK4VMnhBno/TPVCoK9U/LP0PkLCS9tbxHdi/U=
github.com/dimchansky/utfbom v1.1.1/go.mod h1:SxdoEBH5qIqFocHMyGOXVAybYJdr71b1Q/j0mACtrfE=
@@ -225,6 +233,8 @@ github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1
github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I=
github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M=
github.com/eknkc/amber v0.0.0-20171010120322-cdade1c07385/go.mod h1:0vRUJqYpeSZifjYj7uP3BG/gKcuzL9xWVV/Y+cK33KM=
+github.com/ekzhu/minhash-lsh v0.0.0-20171225071031-5c06ee8586a1/go.mod h1:yEtCVi+QamvzjEH4U/m6ZGkALIkF2xfQnFp0BcKmIOk=
+github.com/emirpasic/gods v1.12.0/go.mod h1:YfzfFFoVP/catgzJb4IKIqXjX78Ha8FMSDh3ymbK86o=
github.com/envoyproxy/go-control-plane v0.6.9/go.mod h1:SBwIajubJHhxtWwsL9s8ss4safvEdbitLhGGK48rN6g=
github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
@@ -238,6 +248,7 @@ github.com/fasthttp-contrib/websocket v0.0.0-20160511215533-1f3b11f56072/go.mod
github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M=
github.com/flosch/pongo2 v0.0.0-20190707114632-bbf5a6c351f4/go.mod h1:T9YF2M40nIgbVgp3rreNmTged+9HrbNTIQf1PsaIiTA=
+github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc=
github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=
github.com/form3tech-oss/jwt-go v3.2.2+incompatible h1:TcekIExNqud5crz4xD2pavyTgWiPvpYe4Xau31I0PRk=
github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k=
@@ -264,8 +275,17 @@ github.com/git-lfs/git-lfs v1.5.1-0.20210304194248-2e1d981afbe3/go.mod h1:8Xqs4m
github.com/git-lfs/gitobj/v2 v2.0.1/go.mod h1:q6aqxl6Uu3gWsip5GEKpw+7459F97er8COmU45ncAxw=
github.com/git-lfs/go-netrc v0.0.0-20180525200031-e0e9ca483a18/go.mod h1:70O4NAtvWn1jW8V8V+OKrJJYcxDLTmIozfi2fmSz5SI=
github.com/git-lfs/wildmatch v1.0.4/go.mod h1:SdHAGnApDpnFYQ0vAxbniWR0sn7yLJ3QXo9RRfhn2ew=
+github.com/gliderlabs/ssh v0.2.2/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0=
github.com/go-check/check v0.0.0-20180628173108-788fd7840127/go.mod h1:9ES+weclKsC9YodN5RgxqK/VD9HM9JsCSh7rNhMZE98=
+github.com/go-enry/go-license-detector/v4 v4.3.0/go.mod h1:HaM4wdNxSlz/9Gw0uVOKSQS5JVFqf2Pk8xUPEn6bldI=
github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q=
+github.com/go-git/gcfg v1.5.0/go.mod h1:5m20vg6GwYabIxaOonVkTdrILxQMpEShl1xiMF4ua+E=
+github.com/go-git/go-billy/v5 v5.0.0/go.mod h1:pmpqyWchKfYfrkb/UVH4otLvyi/5gJlGI4Hb3ZqZ3W0=
+github.com/go-git/go-billy/v5 v5.1.0/go.mod h1:pmpqyWchKfYfrkb/UVH4otLvyi/5gJlGI4Hb3ZqZ3W0=
+github.com/go-git/go-git-fixtures/v4 v4.0.1/go.mod h1:m+ICp2rF3jDhFgEZ/8yziagdT1C+ZpZcrJjappBCDSw=
+github.com/go-git/go-git-fixtures/v4 v4.0.2-0.20200613231340-f56387b50c12/go.mod h1:m+ICp2rF3jDhFgEZ/8yziagdT1C+ZpZcrJjappBCDSw=
+github.com/go-git/go-git/v5 v5.1.0/go.mod h1:ZKfuPUoY1ZqIG4QG9BDBh3G4gLM5zvPuSJAozQrZuyM=
+github.com/go-git/go-git/v5 v5.3.0/go.mod h1:xdX4bWJ48aOrdhnl2XqHYstHbbp6+LFS4r4X+lNVprw=
github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
@@ -285,7 +305,7 @@ github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+
github.com/go-playground/validator/v10 v10.2.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GOhaH6EGOAJShg8Id5JGkI=
github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w=
github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w=
-github.com/go-sql-driver/mysql v1.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.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
github.com/gobuffalo/envy v1.7.0/go.mod h1:n7DRkBerg/aorDM8kbduw5dN3oXGswK5liaSCx4T5NI=
github.com/gobuffalo/envy v1.7.1/go.mod h1:FurDp9+EDPE4aIUS3ZLyD+7/9fpx7YRt/ukY6jIHf0w=
@@ -296,6 +316,7 @@ github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22
github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw=
github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM=
github.com/godbus/dbus/v5 v5.0.3/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
+github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s=
github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
@@ -345,6 +366,7 @@ github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx
github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw=
github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
+github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
github.com/gomodule/redigo v1.7.1-0.20190724094224-574c33c3df38/go.mod h1:B4C85qUVwatsJoIUNIfCRsp7qO0iAmpGFZ4EELWSbC4=
github.com/gomodule/redigo v2.0.0+incompatible h1:K/R+8tc58AaqLkqG2Ol3Qk+DR/TlNuhuh457pBFPtt0=
github.com/gomodule/redigo v2.0.0+incompatible/go.mod h1:B4C85qUVwatsJoIUNIfCRsp7qO0iAmpGFZ4EELWSbC4=
@@ -380,7 +402,6 @@ github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hf
github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
-github.com/google/pprof v0.0.0-20200905233945-acf8798be1f7/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
@@ -393,12 +414,11 @@ github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3
github.com/google/subcommands v1.0.1/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk=
github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
-github.com/google/uuid v1.1.2 h1:EVhdT+1Kseyi1/pUmXKaFxYsDNy9RQYkMWRH68J/W7Y=
github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
-github.com/google/wire v0.4.0 h1:kXcsA/rIGzJImVqPdhfnr6q0xsS9gU0515q1EPpJ9fE=
-github.com/google/wire v0.4.0/go.mod h1:ngWDr9Qvq3yZA10YrxfyGELY/AFWGVpy9c1LTRi1EoU=
-github.com/googleapis/gax-go v2.0.2+incompatible h1:silFMLAnr330+NRuag/VjIGF7TLp/LBrV2CJKFLWEww=
-github.com/googleapis/gax-go v2.0.2+incompatible/go.mod h1:SFVmujtThgffbyetf+mdk2eWhX2bMyUtNHzFKcPA9HY=
+github.com/google/uuid v1.2.0 h1:qJYtXnJRWmpe7m/3XlyhrsLrEURqHRM2kxzoxXqyUDs=
+github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
+github.com/google/wire v0.5.0 h1:I7ELFeVBr3yfPIcc8+MWvrjk+3VjbcSzoXm3JVa+jD8=
+github.com/google/wire v0.5.0/go.mod h1:ngWDr9Qvq3yZA10YrxfyGELY/AFWGVpy9c1LTRi1EoU=
github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=
github.com/googleapis/gax-go/v2 v2.0.5 h1:sjZBwGj9Jlw33ImPtvFviGYvseOtDM7hkSKB7+Tv3SM=
github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=
@@ -443,11 +463,14 @@ github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2p
github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc=
github.com/hashicorp/yamux v0.0.0-20210316155119-a95892c5f864 h1:Y4V+SFe7d3iH+9pJCoeWIOS5/xBJIFsltS7E+KJSsJY=
github.com/hashicorp/yamux v0.0.0-20210316155119-a95892c5f864/go.mod h1:CtWFDAQgb7dxtzFs4tWbplKIe2jSi3+5vKbgIO0SLnQ=
+github.com/hhatto/gorst v0.0.0-20181029133204-ca9f730cac5b/go.mod h1:HmaZGXHdSwQh1jnUlBGN2BeEYOHACLVGzYOXCbsLvxY=
github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI=
github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
github.com/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmKTg=
github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
+github.com/imdario/mergo v0.3.9/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA=
+github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA=
github.com/imkira/go-interpol v1.1.0/go.mod h1:z0h2/2T3XF8kyEPpRgJ3kmNv+C43p+I/CoI+jC3w2iA=
github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo=
@@ -457,8 +480,12 @@ github.com/iris-contrib/i18n v0.0.0-20171121225848-987a633949d0/go.mod h1:pMCz62
github.com/iris-contrib/jade v1.1.3/go.mod h1:H/geBymxJhShH5kecoiOCSssPX7QWYH7UaeZTSWddIk=
github.com/iris-contrib/pongo2 v0.0.1/go.mod h1:Ssh+00+3GAZqSQb30AvBRNxBx7rf0GqwkjqxNd0u65g=
github.com/iris-contrib/schema v0.0.1/go.mod h1:urYA3uvUNG1TIIjOSCzHr9/LmbQo8LrOcOqfqxa4hXw=
+github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo=
github.com/jcmturner/gofork v0.0.0-20190328161633-dc7c13fece03/go.mod h1:MK8+TM0La+2rjBD4jE12Kj1pCCxK7d2LK/UM3ncEo0o=
github.com/jcmturner/gofork v1.0.0/go.mod h1:MK8+TM0La+2rjBD4jE12Kj1pCCxK7d2LK/UM3ncEo0o=
+github.com/jdkato/prose v1.1.0/go.mod h1:jkF0lkxaX5PFSlk9l4Gh9Y+T57TqUZziWT7uZbW5ADg=
+github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI=
+github.com/jessevdk/go-flags v1.5.0/go.mod h1:Fw0T6WPc1dYxT4mKEZRfG5kJhaTDP9pj1c2EWnYs/m4=
github.com/jmespath/go-jmespath v0.0.0-20160202185014-0b12d6b521d8/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k=
github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k=
github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg=
@@ -479,6 +506,7 @@ github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/
github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=
github.com/jstemmer/go-junit-report v0.9.1 h1:6QPYqodiu3GuPL+7mfx+NwDdp2eTkp9IfEUpgAwUN0o=
github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk=
+github.com/jteeuwen/go-bindata v3.0.8-0.20180305030458-6025e8de665b+incompatible/go.mod h1:JVvhzYOiGBnFSYRyV00iY8q7/0PThjIYav1p9h5dmKs=
github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=
github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
github.com/juju/errors v0.0.0-20181118221551-089d3ea4e4d5/go.mod h1:W54LbzXuIE0boCoNJfwqpmkKJ1O4TCTZMetAt6jGk7Q=
@@ -499,6 +527,8 @@ github.com/kataras/pio v0.0.2/go.mod h1:hAoW0t9UmXi4R5Oyq5Z4irTbaTsOemSrDGUtaTl7
github.com/kataras/sitemap v0.0.5/go.mod h1:KY2eugMKiPwsJgx7+U103YZehfvNGOXURubcGyk0Bz8=
github.com/kelseyhightower/envconfig v1.3.0 h1:IvRS4f2VcIQy6j4ORGIf9145T/AsUB+oY8LyvN8BXNM=
github.com/kelseyhightower/envconfig v1.3.0/go.mod h1:cccZRl6mQpaq41TPp5QxidR+Sa3axMbJDNb//FQX6Gg=
+github.com/kevinburke/ssh_config v0.0.0-20190725054713-01f96b0aa0cd/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM=
+github.com/kevinburke/ssh_config v0.0.0-20201106050909-4977a11b4351/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM=
github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q=
github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00=
github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
@@ -507,13 +537,15 @@ github.com/klauspost/compress v1.8.2/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0
github.com/klauspost/compress v1.9.0/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A=
github.com/klauspost/compress v1.9.7/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A=
github.com/klauspost/compress v1.10.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs=
-github.com/klauspost/compress v1.11.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs=
+github.com/klauspost/compress v1.12.2/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg=
github.com/klauspost/cpuid v1.2.1/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek=
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
+github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI=
+github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
@@ -522,7 +554,9 @@ github.com/labstack/echo/v4 v4.1.11/go.mod h1:i541M3Fj6f76NZtHSj7TXnyM8n2gaodfvf
github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k=
github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII=
github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
-github.com/lib/pq v1.9.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
+github.com/lib/pq v1.10.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
+github.com/lib/pq v1.10.1 h1:6VXZrLU0jHBYyAqrSPa+MgPfnSvTPuMgK+k0o5kVFWo=
+github.com/lib/pq v1.10.1/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
github.com/libgit2/git2go v0.0.0-20190104134018-ecaeb7a21d47/go.mod h1:4bKN42efkbNYMZlvDfxGDxzl066GhpvIircZDsm8Y+Y=
github.com/libgit2/git2go/v31 v31.4.12/go.mod h1:c/rkJcBcUFx6wHaT++UwNpKvIsmPNqCeQ/vzO4DrEec=
github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM=
@@ -550,6 +584,7 @@ github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Ky
github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU=
github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU=
github.com/mattn/go-shellwords v0.0.0-20190425161501-2444a32a19f4/go.mod h1:3xCvwCdWdlDJUrvuMn7Wuy9eWs4pE8vqg+NOMyg4B2o=
+github.com/mattn/go-shellwords v1.0.11/go.mod h1:EZzvwXDESEeg03EKmM+RmDnNOPKG4lLtQsUlTZDWQ8Y=
github.com/mattn/go-sqlite3 v1.12.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc=
github.com/mattn/goveralls v0.0.2/go.mod h1:8d1ZMHsd7fW6IRPKQh46F2WRpyib5/X4FOpevwGNQEw=
github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU=
@@ -559,6 +594,7 @@ github.com/mediocregopher/radix/v3 v3.3.0/go.mod h1:EmfVyvspXz1uZEyPBMyGK+kjWiKQ
github.com/mediocregopher/radix/v3 v3.4.2/go.mod h1:8FL3F6UQRXHXIBSPUs5h0RybMF8i4n7wVopoX3x7Bv8=
github.com/microcosm-cc/bluemonday v1.0.2/go.mod h1:iVP4YcDBq+n/5fb23BhYFvIMq/leAFZyRl6bYmGDlGc=
github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg=
+github.com/mikesmitty/edkey v0.0.0-20170222072505-3356ea4e686a/go.mod h1:v8eSC2SMp9/7FTKUncp7fH9IwPfw+ysMObcEz5FWheQ=
github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=
github.com/mitchellh/copystructure v1.0.0 h1:Laisrj+bAB6b/yJwB5Bt3ITZhGJdqmxquMKeZ+mmkFQ=
github.com/mitchellh/copystructure v1.0.0/go.mod h1:SNtv71yrdKgLRyLFxmLdkAbkKEFWgYaq1OVrnRcwhnw=
@@ -571,13 +607,14 @@ github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0Qu
github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
github.com/mitchellh/mapstructure v1.3.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
-github.com/mitchellh/mapstructure v1.4.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
+github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
github.com/mitchellh/reflectwalk v1.0.0 h1:9D+8oIskB4VJBN5SFlmc27fSlIBZaov1Wpk/IfikLNY=
github.com/mitchellh/reflectwalk v1.0.0/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw=
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
+github.com/montanaflynn/stats v0.0.0-20151014174947-eeaced052adb/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc=
github.com/moul/http2curl v1.0.0/go.mod h1:8UbvGypXm98wA/IqH45anm5Y2Z6ep6O31QGOAZ3H0fQ=
github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
@@ -590,7 +627,7 @@ github.com/nats-io/nkeys v0.0.2/go.mod h1:dab7URMsZm6Z/jp9Z5UGa87Uutgc2mVpXLC4B7
github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w=
github.com/nats-io/nkeys v0.1.3/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w=
github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c=
-github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs=
+github.com/neurosnap/sentences v1.0.6/go.mod h1:pg1IapvYpWCJJm/Etxeh0+gtMf1rI1STY9S7eUCPbDc=
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs=
github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA=
@@ -620,10 +657,12 @@ github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJ
github.com/openzipkin/zipkin-go v0.2.1/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4=
github.com/openzipkin/zipkin-go v0.2.2/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4=
github.com/otiai10/copy v1.0.1/go.mod h1:8bMCJrAqOtN/d9oyh5HR7HhLQMvcGMpGdwRDYsfOCHc=
+github.com/otiai10/copy v1.4.2/go.mod h1:XWfuS3CrI0R6IE0FbgHsEazaXO8G0LpMp9o8tos0x4E=
github.com/otiai10/curr v0.0.0-20150429015615-9b4961190c95/go.mod h1:9qAhocn7zKJG+0mI8eUu6xqkFDYS2kb2saOteoSB3cE=
github.com/otiai10/curr v1.0.0/go.mod h1:LskTG5wDwr8Rs+nNQ+1LlxRjAtTZZjtJW4rMXl6j4vs=
github.com/otiai10/mint v1.2.3/go.mod h1:YnfyPNhBvnY8bW4SGQHCs/aAFhkgySlMZbrF5U0bOVw=
github.com/otiai10/mint v1.3.0/go.mod h1:F5AjcsTsWUqX+Na9fpHb52P8pcRX2CI6A3ctIT91xUo=
+github.com/otiai10/mint v1.3.2/go.mod h1:/yxELlJQ0ufhjUwhshSj+wFjZ78CnZ48/1wtmBH1OTc=
github.com/pact-foundation/pact-go v1.0.4/go.mod h1:uExwJY4kCzNPcHRj+hCR/HBbOOIwwtUjcrb0b5/5kLM=
github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=
github.com/pborman/getopt v0.0.0-20170112200414-7148bc3a4c30/go.mod h1:85jBQOZwpVEaDAr341tbn15RS4fCAsIst0qp7i8ex1o=
@@ -637,6 +676,7 @@ github.com/philhofer/fwd v1.0.0/go.mod h1:gk3iGcWd9+svBvR0sR+KPcfE+RNWozjowpeBVG
github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc=
github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY=
github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8=
+github.com/pires/go-proxyproto v0.5.0/go.mod h1:Odh9VFOZJCf9G8cLW5o435Xf1J95Jw9Gw5rnCjcwzAY=
github.com/pkg/errors v0.0.0-20170505043639-c605e284fe17/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
@@ -681,6 +721,7 @@ github.com/rogpeppe/go-internal v1.1.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFR
github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
github.com/rogpeppe/go-internal v1.3.2/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc=
github.com/rogpeppe/go-internal v1.4.0/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc=
+github.com/rubenv/sql-migrate v0.0.0-20191213152630-06338513c237 h1:q6N3WgCVttyX9Fg3e4nrLohUXvAlTu44Ugc4m6qlezc=
github.com/rubenv/sql-migrate v0.0.0-20191213152630-06338513c237/go.mod h1:rtQlpHw+eR6UrqaS3kX1VYeaCxzCVdimDS7g5Ln4pPc=
github.com/rubyist/tracerx v0.0.0-20170927163412-787959303086/go.mod h1:YpdgDXpumPB/+EGmGTYHeiW/0QVFRzBYTNFaxWfPDk4=
github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g=
@@ -695,16 +736,20 @@ github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg
github.com/sebest/xff v0.0.0-20160910043805-6c115e0ffa35/go.mod h1:wozgYq9WEBQBaIJe4YZ0qTSFAMxmcwBhQH0fO0R34Z0=
github.com/sebest/xff v0.0.0-20210106013422-671bd2870b3a h1:iLcLb5Fwwz7g/DLK89F+uQBDeAhHhwdzB5fSlVdhGcM=
github.com/sebest/xff v0.0.0-20210106013422-671bd2870b3a/go.mod h1:wozgYq9WEBQBaIJe4YZ0qTSFAMxmcwBhQH0fO0R34Z0=
-github.com/sergi/go-diff v1.0.0 h1:Kpca3qRNrduNnOQeazBd0ysaKrUJiIuISHxogkT9RPQ=
github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo=
+github.com/sergi/go-diff v1.1.0 h1:we8PVUC3FE2uYfodKH/nBHMSetSfHDR6scGdBi+erh0=
+github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM=
github.com/shabbyrobe/gocovmerge v0.0.0-20180507124511-f6ea450bfb63/go.mod h1:n+VKSARF5y/tS9XFSP7vWDfS+GUC5vs/YT7M5XDTUEM=
github.com/shabbyrobe/gocovmerge v0.0.0-20190829150210-3e036491d500 h1:WnNuhiq+FOY3jNj6JXFT+eLN3CQ/oPIsDPRanvwsmbI=
github.com/shabbyrobe/gocovmerge v0.0.0-20190829150210-3e036491d500/go.mod h1:+njLrG5wSeoG4Ds61rFgEzKvenR2UHbjMoDHsczxly0=
github.com/shirou/gopsutil v2.20.1+incompatible h1:oIq9Cq4i84Hk8uQAUOG3eNdI/29hBawGrD5YRl6JRDY=
github.com/shirou/gopsutil v2.20.1+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA=
+github.com/shogo82148/go-shuffle v0.0.0-20170808115208-59829097ff3b/go.mod h1:2htx6lmL0NGLHlO8ZCf+lQBGBHIbEujyywxJArf+2Yc=
+github.com/shurcooL/sanitized_anchor_name v0.0.0-20170918181015-86672fcb3f95/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc=
github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc=
github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
github.com/sirupsen/logrus v1.3.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
+github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q=
github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88=
github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=
@@ -724,6 +769,7 @@ github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tL
github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo=
github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
+github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s=
github.com/ssgelm/cookiejarparser v1.0.1/go.mod h1:DUfC0mpjIzlDN7DzKjXpHj0qMI5m9VrZuz3wSlI+OEI=
github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw=
@@ -737,6 +783,7 @@ github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXf
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
+github.com/stretchr/testify v1.6.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY=
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
@@ -764,6 +811,8 @@ github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyC
github.com/valyala/fasthttp v1.6.0/go.mod h1:FstJa9V+Pj9vQ7OJie2qMHdwemEDaDiSdBnvPM1Su9w=
github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8=
github.com/valyala/tcplisten v0.0.0-20161114210144-ceec8f93295a/go.mod h1:v3UYOV9WzVtRmSR+PDvWpU/qWl4Wa5LApYYX4ZtKbio=
+github.com/xanzy/ssh-agent v0.2.1/go.mod h1:mLlQY/MoOhWBj+gOGMQkOeiEvkx+8pJSI+0Bx9h2kr4=
+github.com/xanzy/ssh-agent v0.3.0/go.mod h1:3s9xbODqPuuhK9JV1R321M/FlMZSBvE5aY6eAcqrDh0=
github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU=
github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ=
github.com/xeipuuv/gojsonschema v0.0.0-20170210233622-6b67b3fab74d/go.mod h1:5yf86TLmAcydyeJq5YvxkGPE2fm/u4myDekKRoLuqhs=
@@ -781,12 +830,16 @@ github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9dec
github.com/ziutek/mymysql v1.5.4/go.mod h1:LMSpPZ6DbqWFxNCHW77HeMg9I646SAhApZ/wKdgO/C0=
gitlab.com/gitlab-org/gitaly v1.68.0 h1:VlcJs1+PrhW7lqJUU7Fh1q8FMJujmbbivdfde/cwB98=
gitlab.com/gitlab-org/gitaly v1.68.0/go.mod h1:/pCsB918Zu5wFchZ9hLYin9WkJ2yQqdVNz0zlv5HbXg=
-gitlab.com/gitlab-org/gitaly/v14 v14.0.0-rc1 h1:4u44IbgntN1yKgnY/mUabRjHXIchrLPwUwMuDyQ0+ec=
gitlab.com/gitlab-org/gitaly/v14 v14.0.0-rc1/go.mod h1:4Cz8tOAyueSZX5o6gYum1F/unupaOclxqETPcg4ODvQ=
+gitlab.com/gitlab-org/gitaly/v14 v14.3.0-rc2.0.20211007055622-df7dadcc3f74 h1:7R4FHfZ9lBH0BLtnGNjRmHvjz6epnXPodhiT0pR96PI=
+gitlab.com/gitlab-org/gitaly/v14 v14.3.0-rc2.0.20211007055622-df7dadcc3f74/go.mod h1:2McjFiZrwflPGtXSquCAXWzewmxTPytoI/vamNz/QPM=
gitlab.com/gitlab-org/gitlab-shell v1.9.8-0.20201117050822-3f9890ef73dc/go.mod h1:5QSTbpAHY2v0iIH5uHh2KA9w7sPUqPmnLjDApI/sv1U=
+gitlab.com/gitlab-org/gitlab-shell v1.9.8-0.20210720163109-50da611814d2/go.mod h1:QWDYBwuy24qGMandtCngLRPzFgnGPg6LSNoJWPKmJMc=
gitlab.com/gitlab-org/labkit v0.0.0-20190221122536-0c3fc7cdd57c/go.mod h1:rYhLgfrbEcyfinG+R3EvKu6bZSsmwQqcXzLfHWSfUKM=
gitlab.com/gitlab-org/labkit v0.0.0-20200908084045-45895e129029/go.mod h1:SNfxkfUwVNECgtmluVayv0GWFgEjjBs5AzgsowPQuo0=
gitlab.com/gitlab-org/labkit v1.0.0/go.mod h1:nohrYTSLDnZix0ebXZrbZJjymRar8HeV2roWL5/jw2U=
+gitlab.com/gitlab-org/labkit v1.4.1/go.mod h1:x5JO5uvdX4t6e/TZXLXZnFL5AcKz2uLLd3uKXZcuO4k=
+gitlab.com/gitlab-org/labkit v1.5.0/go.mod h1:1ZuVZpjSpCKUgjLx8P6jzkkQFxJI1thUKr6yKV3p0vY=
gitlab.com/gitlab-org/labkit v1.6.0 h1:Qgk+W+N0cujGBmZSjMqvM+4qIEjl7VgIK4nxlQO0RlA=
gitlab.com/gitlab-org/labkit v1.6.0/go.mod h1:1ZuVZpjSpCKUgjLx8P6jzkkQFxJI1thUKr6yKV3p0vY=
go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
@@ -805,20 +858,26 @@ go.opencensus.io v0.23.0 h1:gqCw0LfLxScz8irSi8exQc7fyQ0fKQU/qnC/X8+V/1M=
go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E=
go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
-go.uber.org/atomic v1.5.0 h1:OI5t8sDa1Or+q8AeE+yKeB/SDYioSHAgcVljj9JIETY=
go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ=
+go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ=
+go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw=
+go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
go.uber.org/goleak v1.1.10 h1:z+mqJhf6ss6BSfSM671tgKyZBFPTTJM+HLxnhPC3wu0=
go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A=
go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0=
go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4=
+go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU=
+go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU=
go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA=
go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM=
-gocloud.dev v0.21.1-0.20201223184910-5094f54ed8bb h1:3EJw/ZRo3jKHY2WP8HiAxCpGlfsrKpaIeCl6VfMprKw=
-gocloud.dev v0.21.1-0.20201223184910-5094f54ed8bb/go.mod h1:iI47kpBb27cms1+KJCbcO2NbZBOg4V6SJWFeO/Kpp1c=
+go.uber.org/zap v1.16.0/go.mod h1:MA8QOfq0BHJwdXa996Y4dYkAqRKB8/1K1QMMZVaNZjQ=
+gocloud.dev v0.23.0 h1:u/6F8slWwaZPgGpjpNp0jzH+1P/M2ri7qEP3lFgbqBE=
+gocloud.dev v0.23.0/go.mod h1:zklCCIIo1N9ELkU2S2E7tW8P8eeMU7oGLeQCXdDwx9Q=
golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
+golang.org/x/crypto v0.0.0-20190219172222-a4c6cb3142f2/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20190325154230-a5d413f7728c/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20190426145343-a29dc8fdc734/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
@@ -829,11 +888,15 @@ golang.org/x/crypto v0.0.0-20190621222207-cc06ce4a13d4/go.mod h1:yigFU9vqHzYiE8U
golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20191227163750-53104e6ec876/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
+golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
-golang.org/x/crypto v0.0.0-20201203163018-be400aefbc4c h1:9HhBz5L/UjnK9XLtiZhYAdue5BVKep3PMmS2LuPDt8k=
golang.org/x/crypto v0.0.0-20201203163018-be400aefbc4c/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I=
+golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I=
+golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4=
+golang.org/x/crypto v0.0.0-20210506145944-38f3c27a63bf h1:B2n+Zi5QeYRDAEodEu72OS36gmTWjgpXr2+cWcBW90o=
+golang.org/x/crypto v0.0.0-20210506145944-38f3c27a63bf/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8=
golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
@@ -847,6 +910,7 @@ golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u0
golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=
golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=
+golang.org/x/exp v0.0.0-20200331195152-e8c3332aa8e5/go.mod h1:4M0jN8W1tt0AVLNr8HDosyJCDCDuyL9N9+3m7wDWgKw=
golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs=
golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
@@ -874,8 +938,9 @@ golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzB
golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
-golang.org/x/mod v0.4.1 h1:Kvvh58BN8Y9/lBi7hTekvtMpm07eUZ0ck5pRHpsMWrY=
golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
+golang.org/x/mod v0.4.2 h1:Gz96sIWK3OalVv/I/qNygP42zyoKp3xptRVCWRFEBvo=
+golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
@@ -918,17 +983,19 @@ golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/
golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
-golang.org/x/net v0.0.0-20200904194848-62affa334b73/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
-golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
-golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4 h1:b0LrWgu8+q7z4J+0Y3Umo5q1dL7NXBkKBWkaVkAq17E=
golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=
+golang.org/x/net v0.0.0-20210326060303-6b1517762897/go.mod h1:uSPa2vr4CLtc/ILN5odXGNXS6mhrKVzTaCXzk9m6W3k=
+golang.org/x/net v0.0.0-20210420210106-798c2154c571/go.mod h1:72T/g9IO56b78aLF+1Kcs5dz7/ng1VjMUvfKvpfy+jM=
+golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
+golang.org/x/net v0.0.0-20210505214959-0714010a04ed h1:V9kAVxLvz1lkufatrpHuUVyJ/5tR3Ms7rk951P4mI98=
+golang.org/x/net v0.0.0-20210505214959-0714010a04ed/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
@@ -936,14 +1003,14 @@ golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4Iltr
golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
-golang.org/x/oauth2 v0.0.0-20201203001011-0b49973bad19/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
golang.org/x/oauth2 v0.0.0-20210126194326-f9ce19ea3013/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
-golang.org/x/oauth2 v0.0.0-20210413134643-5e61552d6c78 h1:rPRtHfUb0UKZeZ6GH4K4Nt4YRbE9V1u+QZX5upZXqJQ=
golang.org/x/oauth2 v0.0.0-20210413134643-5e61552d6c78/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
+golang.org/x/oauth2 v0.0.0-20210427180440-81ed05c6b58c h1:SgVl/sCtkicsS7psKkje4H9YtjdEl3xsYh7N+5TDHqY=
+golang.org/x/oauth2 v0.0.0-20210427180440-81ed05c6b58c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
@@ -966,6 +1033,7 @@ golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5h
golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20190221075227-b4e8571b14e0/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190310054646-10058d7d4faa/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
@@ -980,6 +1048,7 @@ golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7w
golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
@@ -1012,18 +1081,24 @@ golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7w
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20201202213521-69691e467435/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210223095934-7937bea0104d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210309074719-68d13333faf2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20210412220455-f1c623a9e750 h1:ZBu6861dZq7xBnG1bn5SRU0vA8nx42at4+kP07FMTog=
+golang.org/x/sys v0.0.0-20210324051608-47abb6519492/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210412220455-f1c623a9e750/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210420072515-93ed5bcd2bfe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210420205809-ac73e9fd8988/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210503080704-8803ae5d1324/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210503173754-0981d6026fa6 h1:cdsMqa2nXzqlgs183pHxtvoVwU7CyzaCTAUOg94af4c=
+golang.org/x/sys v0.0.0-20210503173754-0981d6026fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
@@ -1032,14 +1107,15 @@ golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
-golang.org/x/text v0.3.5 h1:i6eZZ+zk0SOf0xgBpEpPD18qWcJda6q1sxt3S0kzyUQ=
golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/text v0.3.6 h1:aRYxNxv6iGQlyVaZmk6ZgYEDa+Jg18DxebPSrd6bg1M=
+golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
-golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e h1:EHBhcS0mlXEAVwNyO2dLfjToGsyY4j24pTs2ScHnX7s=
-golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
+golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba h1:O8mE0/t419eoIwhTFpKVkHiTs/Igowgfkj25AcZrtiE=
+golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
@@ -1098,14 +1174,9 @@ golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roY
golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
-golang.org/x/tools v0.0.0-20200828161849-5deb26317202/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE=
-golang.org/x/tools v0.0.0-20200915173823-2db8f0ff891c/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU=
-golang.org/x/tools v0.0.0-20200918232735-d647fc253266/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU=
golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
-golang.org/x/tools v0.0.0-20201202200335-bef1c476418a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
-golang.org/x/tools v0.0.0-20201203202102-a1a1cbeaa516/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
@@ -1118,6 +1189,7 @@ golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8T
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE=
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo=
+gonum.org/v1/gonum v0.7.0/go.mod h1:L02bwd0sqlsvRv41G7wGWFCsVNZFv/k1xzGIxeANHGM=
gonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0=
gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw=
gonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc=
@@ -1140,16 +1212,15 @@ google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0M
google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=
google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM=
google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc=
-google.golang.org/api v0.31.0/go.mod h1:CL+9IBCa2WWU6gRuBWaKqGWLFFwbEUXkfeMkHLQWYWo=
-google.golang.org/api v0.32.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg=
google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg=
google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE=
google.golang.org/api v0.37.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8=
google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8=
google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU=
google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94=
-google.golang.org/api v0.45.0 h1:pqMffJFLBVUDIoYsHcqtxgQVTsmxMDpYLOc5MT4Jrww=
google.golang.org/api v0.45.0/go.mod h1:ISLIJCedJolbZvDfAk+Ctuq5hf+aJ33WgtUsfyFoLXA=
+google.golang.org/api v0.46.0 h1:jkDWHOBIoNSD0OQpq4rtBVu+Rh325MPjXG1rakAp8JU=
+google.golang.org/api v0.46.0/go.mod h1:ceL4oozhkAiTID8XMmJBsIxID/9wMXJVVFXPg4ylg3I=
google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
@@ -1193,13 +1264,9 @@ google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7Fc
google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
-google.golang.org/genproto v0.0.0-20200831141814-d751682dd103/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
-google.golang.org/genproto v0.0.0-20200914193844-75d14daec038/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
-google.golang.org/genproto v0.0.0-20200921151605-7abf4a1a14d5/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
-google.golang.org/genproto v0.0.0-20201203001206-6486ece9c497/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
@@ -1209,8 +1276,12 @@ google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6D
google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A=
-google.golang.org/genproto v0.0.0-20210413151531-c14fb6ef47c3 h1:K+7Ig5hjiLVA/i1UFUUbCGimWz5/Ey0lAQjT3QiLaPY=
google.golang.org/genproto v0.0.0-20210413151531-c14fb6ef47c3/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A=
+google.golang.org/genproto v0.0.0-20210420162539-3c870d7478d2/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A=
+google.golang.org/genproto v0.0.0-20210423144448-3a41ef94ed2b/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A=
+google.golang.org/genproto v0.0.0-20210429181445-86c259c2b4ab/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A=
+google.golang.org/genproto v0.0.0-20210506142907-4a47615972c2 h1:pl8qT5D+48655f14yDURpIZwSPvMWuuekfAP+gxtjvk=
+google.golang.org/genproto v0.0.0-20210506142907-4a47615972c2/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A=
google.golang.org/grpc v1.16.0/go.mod h1:0JHn/cJsOMiMfNA9+DeHDlAU7KAAB5GDlYFpa9MZMio=
google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs=
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
@@ -1231,14 +1302,14 @@ google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3Iji
google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
-google.golang.org/grpc v1.32.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc=
google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8=
google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=
google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=
google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=
-google.golang.org/grpc v1.37.0 h1:uSZWeQJX5j11bIQ4AJoj+McDBo29cY1MCoC1wO3ts+c=
google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM=
+google.golang.org/grpc v1.38.0 h1:/9BgsAsa5nWe26HqOlvlgJnqBuktYOLCgjCPqsa56W0=
+google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM=
google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
@@ -1260,8 +1331,9 @@ gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLks
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
-gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU=
gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
+gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw=
gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4=
@@ -1269,6 +1341,7 @@ gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMy
gopkg.in/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o=
gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE=
gopkg.in/go-playground/validator.v8 v8.18.2/go.mod h1:RX2a/7Ha8BgOhfk7j780h4/u/RRjR0eouCJSH80/M2Y=
+gopkg.in/gorp.v1 v1.7.2 h1:j3DWlAyGVv8whO7AcIWznQ2Yj7yJkn34B8s63GViAAw=
gopkg.in/gorp.v1 v1.7.2/go.mod h1:Wo3h+DBQZIxATwftsglhdD/62zRFPhGhTiu5jUJmCaw=
gopkg.in/ini.v1 v1.51.1/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
gopkg.in/jcmturner/aescts.v1 v1.0.1/go.mod h1:nsR8qBOg+OucoIW+WMhB3GspUQXq9XorLnQb9XtvcOo=
@@ -1277,6 +1350,7 @@ gopkg.in/jcmturner/goidentity.v2 v2.0.0/go.mod h1:vCwK9HeXksMeUmQ4SxDd1tRz4LejrK
gopkg.in/jcmturner/gokrb5.v5 v5.3.0/go.mod h1:oQz8Wc5GsctOTgCVyKad1Vw4TCWz5G6gfIQr88RPv4k=
gopkg.in/jcmturner/rpc.v0 v0.0.2/go.mod h1:NzMq6cRzR9lipgw7WxRBHNx5N8SifBuaCQsOT1kWY/E=
gopkg.in/mgo.v2 v2.0.0-20180705113604-9856a29383ce/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA=
+gopkg.in/neurosnap/sentences.v1 v1.0.6/go.mod h1:YlK+SN+fLQZj+kY3r8DkGDhDr91+S3JmTb5LSxFRQo0=
gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo=
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ=
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
@@ -1287,8 +1361,9 @@ gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
-gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU=
gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
+gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
gopkg.in/yaml.v3 v3.0.0-20191120175047-4206685974f2/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
@@ -1303,6 +1378,7 @@ honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9
honnef.co/go/tools v0.1.3 h1:qTakTkI6ni6LFD5sBwwsdSO+AQqbSIxOauHTTQKZ/7o=
honnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las=
nhooyr.io/websocket v1.8.6/go.mod h1:B70DZP8IakI65RVQ51MsWP/8jndNma26DVA/nFSCgW0=
+nhooyr.io/websocket v1.8.7/go.mod h1:B70DZP8IakI65RVQ51MsWP/8jndNma26DVA/nFSCgW0=
rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=
rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=
rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=
diff --git a/workhorse/internal/api/api.go b/workhorse/internal/api/api.go
index 417ee71dbdc..7f696f70c7a 100644
--- a/workhorse/internal/api/api.go
+++ b/workhorse/internal/api/api.go
@@ -155,8 +155,6 @@ type Response struct {
ProcessLsifReferences bool
// The maximum accepted size in bytes of the upload
MaximumSize int64
- // DEPRECATED: Feature flag used to determine whether to strip the multipart filename of any directories
- FeatureFlagExtractBase bool
}
// singleJoiningSlash is taken from reverseproxy.go:singleJoiningSlash
diff --git a/workhorse/internal/artifacts/artifacts_store_test.go b/workhorse/internal/artifacts/artifacts_store_test.go
index 67a7793e853..a01a723298f 100644
--- a/workhorse/internal/artifacts/artifacts_store_test.go
+++ b/workhorse/internal/artifacts/artifacts_store_test.go
@@ -102,11 +102,11 @@ func TestUploadHandlerSendingToExternalStorage(t *testing.T) {
tests := []struct {
name string
- preauth api.Response
+ preauth *api.Response
}{
{
name: "ObjectStore Upload",
- preauth: api.Response{
+ preauth: &api.Response{
RemoteObject: api.RemoteObject{
StoreURL: storeServer.URL + "/url/put" + qs,
ID: "store-id",
@@ -145,7 +145,7 @@ func TestUploadHandlerSendingToExternalStorageAndStorageServerUnreachable(t *tes
t.Fatal("it should not be called")
}
- authResponse := api.Response{
+ authResponse := &api.Response{
TempPath: tempPath,
RemoteObject: api.RemoteObject{
StoreURL: "http://localhost:12323/invalid/url",
@@ -171,7 +171,7 @@ func TestUploadHandlerSendingToExternalStorageAndInvalidURLIsUsed(t *testing.T)
t.Fatal("it should not be called")
}
- authResponse := api.Response{
+ authResponse := &api.Response{
TempPath: tempPath,
RemoteObject: api.RemoteObject{
StoreURL: "htt:////invalid-url",
@@ -203,7 +203,7 @@ func TestUploadHandlerSendingToExternalStorageAndItReturnsAnError(t *testing.T)
storeServer := httptest.NewServer(storeServerMux)
defer storeServer.Close()
- authResponse := api.Response{
+ authResponse := &api.Response{
RemoteObject: api.RemoteObject{
StoreURL: storeServer.URL + "/url/put",
ID: "store-id",
@@ -236,7 +236,7 @@ func TestUploadHandlerSendingToExternalStorageAndSupportRequestTimeout(t *testin
storeServer := httptest.NewServer(storeServerMux)
defer storeServer.Close()
- authResponse := api.Response{
+ authResponse := &api.Response{
RemoteObject: api.RemoteObject{
StoreURL: storeServer.URL + "/url/put",
ID: "store-id",
@@ -262,7 +262,7 @@ func TestUploadHandlerMultipartUploadSizeLimit(t *testing.T) {
objectURL := server.URL + test.ObjectPath
uploadSize := 10
- preauth := api.Response{
+ preauth := &api.Response{
RemoteObject: api.RemoteObject{
ID: "store-id",
MultipartUpload: &api.MultipartUploadParams{
@@ -304,7 +304,7 @@ func TestUploadHandlerMultipartUploadMaximumSizeFromApi(t *testing.T) {
uploadSize := int64(10)
maxSize := uploadSize - 1
- preauth := api.Response{
+ preauth := &api.Response{
MaximumSize: maxSize,
RemoteObject: api.RemoteObject{
ID: "store-id",
diff --git a/workhorse/internal/artifacts/artifacts_upload_test.go b/workhorse/internal/artifacts/artifacts_upload_test.go
index 2b11d56f4ee..3e8a52be1a1 100644
--- a/workhorse/internal/artifacts/artifacts_upload_test.go
+++ b/workhorse/internal/artifacts/artifacts_upload_test.go
@@ -35,7 +35,7 @@ const (
Path = "/url/path"
)
-func testArtifactsUploadServer(t *testing.T, authResponse api.Response, bodyProcessor func(w http.ResponseWriter, r *http.Request)) *httptest.Server {
+func testArtifactsUploadServer(t *testing.T, authResponse *api.Response, bodyProcessor func(w http.ResponseWriter, r *http.Request)) *httptest.Server {
mux := http.NewServeMux()
mux.HandleFunc(Path+"/authorize", func(w http.ResponseWriter, r *http.Request) {
if r.Method != "POST" {
@@ -51,7 +51,7 @@ func testArtifactsUploadServer(t *testing.T, authResponse api.Response, bodyProc
w.Write(data)
})
mux.HandleFunc(Path, func(w http.ResponseWriter, r *http.Request) {
- opts, err := filestore.GetOpts(&authResponse)
+ opts, err := filestore.GetOpts(authResponse)
require.NoError(t, err)
if r.Method != "POST" {
@@ -128,7 +128,7 @@ func setupWithTmpPath(t *testing.T, filename string, includeFormat bool, format
authResponse = &api.Response{TempPath: tempPath}
}
- ts := testArtifactsUploadServer(t, *authResponse, bodyProcessor)
+ ts := testArtifactsUploadServer(t, authResponse, bodyProcessor)
var buffer bytes.Buffer
writer := multipart.NewWriter(&buffer)
diff --git a/workhorse/internal/dependencyproxy/dependencyproxy.go b/workhorse/internal/dependencyproxy/dependencyproxy.go
new file mode 100644
index 00000000000..cfb3045544f
--- /dev/null
+++ b/workhorse/internal/dependencyproxy/dependencyproxy.go
@@ -0,0 +1,123 @@
+package dependencyproxy
+
+import (
+ "context"
+ "fmt"
+ "io"
+ "net"
+ "net/http"
+ "time"
+
+ "gitlab.com/gitlab-org/labkit/correlation"
+ "gitlab.com/gitlab-org/labkit/log"
+ "gitlab.com/gitlab-org/labkit/tracing"
+
+ "gitlab.com/gitlab-org/gitlab/workhorse/internal/helper"
+ "gitlab.com/gitlab-org/gitlab/workhorse/internal/senddata"
+)
+
+// httpTransport defines a http.Transport with values
+// that are more restrictive than for http.DefaultTransport,
+// they define shorter TLS Handshake, and more aggressive connection closing
+// to prevent the connection hanging and reduce FD usage
+var httpTransport = tracing.NewRoundTripper(correlation.NewInstrumentedRoundTripper(&http.Transport{
+ Proxy: http.ProxyFromEnvironment,
+ DialContext: (&net.Dialer{
+ Timeout: 30 * time.Second,
+ KeepAlive: 10 * time.Second,
+ }).DialContext,
+ MaxIdleConns: 2,
+ IdleConnTimeout: 30 * time.Second,
+ TLSHandshakeTimeout: 10 * time.Second,
+ ExpectContinueTimeout: 10 * time.Second,
+ ResponseHeaderTimeout: 30 * time.Second,
+}))
+
+var httpClient = &http.Client{
+ Transport: httpTransport,
+}
+
+type Injector struct {
+ senddata.Prefix
+ uploadHandler http.Handler
+}
+
+type entryParams struct {
+ Url string
+ Header http.Header
+}
+
+type nullResponseWriter struct {
+ header http.Header
+ status int
+}
+
+func (nullResponseWriter) Write(p []byte) (int, error) {
+ return len(p), nil
+}
+
+func (w *nullResponseWriter) Header() http.Header {
+ return w.header
+}
+
+func (w *nullResponseWriter) WriteHeader(status int) {
+ if w.status == 0 {
+ w.status = status
+ }
+}
+
+func NewInjector() *Injector {
+ return &Injector{Prefix: "send-dependency:"}
+}
+
+func (p *Injector) SetUploadHandler(uploadHandler http.Handler) {
+ p.uploadHandler = uploadHandler
+}
+
+func (p *Injector) Inject(w http.ResponseWriter, r *http.Request, sendData string) {
+ dependencyResponse, err := p.fetchUrl(r.Context(), sendData)
+ if err != nil {
+ helper.Fail500(w, r, err)
+ return
+ }
+ defer dependencyResponse.Body.Close()
+ if dependencyResponse.StatusCode >= 400 {
+ w.WriteHeader(dependencyResponse.StatusCode)
+ io.Copy(w, dependencyResponse.Body)
+ return
+ }
+
+ teeReader := io.TeeReader(dependencyResponse.Body, w)
+ saveFileRequest, err := http.NewRequestWithContext(r.Context(), "POST", r.URL.String()+"/upload", teeReader)
+ if err != nil {
+ helper.Fail500(w, r, fmt.Errorf("dependency proxy: failed to create request: %w", err))
+ }
+ saveFileRequest.Header = helper.HeaderClone(r.Header)
+ saveFileRequest.ContentLength = dependencyResponse.ContentLength
+
+ w.Header().Del("Content-Length")
+
+ nrw := &nullResponseWriter{header: make(http.Header)}
+ p.uploadHandler.ServeHTTP(nrw, saveFileRequest)
+
+ if nrw.status != http.StatusOK {
+ fields := log.Fields{"code": nrw.status}
+
+ helper.Fail500WithFields(nrw, r, fmt.Errorf("dependency proxy: failed to upload file"), fields)
+ }
+}
+
+func (p *Injector) fetchUrl(ctx context.Context, sendData string) (*http.Response, error) {
+ var params entryParams
+ if err := p.Unpack(&params, sendData); err != nil {
+ return nil, fmt.Errorf("dependency proxy: unpack sendData: %v", err)
+ }
+
+ r, err := http.NewRequestWithContext(ctx, "GET", params.Url, nil)
+ if err != nil {
+ return nil, fmt.Errorf("dependency proxy: failed to fetch dependency: %v", err)
+ }
+ r.Header = params.Header
+
+ return httpClient.Do(r)
+}
diff --git a/workhorse/internal/dependencyproxy/dependencyproxy_test.go b/workhorse/internal/dependencyproxy/dependencyproxy_test.go
new file mode 100644
index 00000000000..37e54c0b756
--- /dev/null
+++ b/workhorse/internal/dependencyproxy/dependencyproxy_test.go
@@ -0,0 +1,183 @@
+package dependencyproxy
+
+import (
+ "encoding/base64"
+ "fmt"
+ "io"
+ "net/http"
+ "net/http/httptest"
+ "strconv"
+ "strings"
+ "testing"
+
+ "github.com/stretchr/testify/require"
+
+ "gitlab.com/gitlab-org/gitlab/workhorse/internal/api"
+ "gitlab.com/gitlab-org/gitlab/workhorse/internal/testhelper"
+ "gitlab.com/gitlab-org/gitlab/workhorse/internal/upload"
+)
+
+type fakeUploadHandler struct {
+ request *http.Request
+ body []byte
+ handler func(w http.ResponseWriter, r *http.Request)
+}
+
+func (f *fakeUploadHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
+ f.request = r
+
+ f.body, _ = io.ReadAll(r.Body)
+
+ f.handler(w, r)
+}
+
+type errWriter struct{ writes int }
+
+func (w *errWriter) Header() http.Header { return nil }
+func (w *errWriter) WriteHeader(h int) {}
+
+// First call of Write function succeeds while all the subsequent ones fail
+func (w *errWriter) Write(p []byte) (int, error) {
+ if w.writes > 0 {
+ return 0, fmt.Errorf("client error")
+ }
+
+ w.writes++
+
+ return len(p), nil
+}
+
+type fakePreAuthHandler struct{}
+
+func (f *fakePreAuthHandler) PreAuthorizeHandler(handler api.HandleFunc, _ string) http.Handler {
+ return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+ handler(w, r, &api.Response{TempPath: "../../testdata/scratch"})
+ })
+}
+
+func TestInject(t *testing.T) {
+ contentLength := 32768 + 1
+ content := strings.Repeat("p", contentLength)
+
+ testCases := []struct {
+ desc string
+ responseWriter http.ResponseWriter
+ contentLength int
+ handlerMustBeCalled bool
+ }{
+ {
+ desc: "the uploading successfully finalized",
+ responseWriter: httptest.NewRecorder(),
+ contentLength: contentLength,
+ handlerMustBeCalled: true,
+ }, {
+ desc: "a user failed to receive the response",
+ responseWriter: &errWriter{},
+ contentLength: contentLength,
+ handlerMustBeCalled: false,
+ }, {
+ desc: "the origin resource server returns partial response",
+ responseWriter: httptest.NewRecorder(),
+ contentLength: contentLength + 1,
+ handlerMustBeCalled: false,
+ },
+ }
+ testhelper.ConfigureSecret()
+
+ for _, tc := range testCases {
+ originResourceServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+ w.Header().Set("Content-Length", strconv.Itoa(tc.contentLength))
+ w.Write([]byte(content))
+ }))
+ defer originResourceServer.Close()
+
+ // BodyUploader expects http.Handler as its second param, we can create a stub function and verify that
+ // it's only called for successful requests
+ handlerIsCalled := false
+ handlerFunc := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { handlerIsCalled = true })
+
+ bodyUploader := upload.BodyUploader(&fakePreAuthHandler{}, handlerFunc, &upload.DefaultPreparer{})
+
+ injector := NewInjector()
+ injector.SetUploadHandler(bodyUploader)
+
+ r := httptest.NewRequest("GET", "/target", nil)
+ sendData := base64.StdEncoding.EncodeToString([]byte(`{"Token": "token", "Url": "` + originResourceServer.URL + `/url"}`))
+
+ injector.Inject(tc.responseWriter, r, sendData)
+
+ require.Equal(t, tc.handlerMustBeCalled, handlerIsCalled, "a partial file must not be saved")
+ }
+}
+
+func TestSuccessfullRequest(t *testing.T) {
+ content := []byte("result")
+ originResourceServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+ w.Header().Set("Content-Length", strconv.Itoa(len(content)))
+ w.Write(content)
+ }))
+
+ uploadHandler := &fakeUploadHandler{
+ handler: func(w http.ResponseWriter, r *http.Request) {
+ w.WriteHeader(200)
+ },
+ }
+
+ injector := NewInjector()
+ injector.SetUploadHandler(uploadHandler)
+
+ response := makeRequest(injector, `{"Token": "token", "Url": "`+originResourceServer.URL+`/url"}`)
+
+ require.Equal(t, "/target/upload", uploadHandler.request.URL.Path)
+ require.Equal(t, int64(6), uploadHandler.request.ContentLength)
+
+ require.Equal(t, content, uploadHandler.body)
+
+ require.Equal(t, 200, response.Code)
+ require.Equal(t, string(content), response.Body.String())
+}
+
+func TestIncorrectSendData(t *testing.T) {
+ response := makeRequest(NewInjector(), "")
+
+ require.Equal(t, 500, response.Code)
+ require.Equal(t, "Internal server error\n", response.Body.String())
+}
+
+func TestIncorrectSendDataUrl(t *testing.T) {
+ response := makeRequest(NewInjector(), `{"Token": "token", "Url": "url"}`)
+
+ require.Equal(t, 500, response.Code)
+ require.Equal(t, "Internal server error\n", response.Body.String())
+}
+
+func TestFailedOriginServer(t *testing.T) {
+ originResourceServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+ w.WriteHeader(404)
+ w.Write([]byte("Not found"))
+ }))
+
+ uploadHandler := &fakeUploadHandler{
+ handler: func(w http.ResponseWriter, r *http.Request) {
+ require.FailNow(t, "the error response must not be uploaded")
+ },
+ }
+
+ injector := NewInjector()
+ injector.SetUploadHandler(uploadHandler)
+
+ response := makeRequest(injector, `{"Token": "token", "Url": "`+originResourceServer.URL+`/url"}`)
+
+ require.Equal(t, 404, response.Code)
+ require.Equal(t, "Not found", response.Body.String())
+}
+
+func makeRequest(injector *Injector, data string) *httptest.ResponseRecorder {
+ w := httptest.NewRecorder()
+ r := httptest.NewRequest("GET", "/target", nil)
+
+ sendData := base64.StdEncoding.EncodeToString([]byte(data))
+ injector.Inject(w, r, sendData)
+
+ return w
+}
diff --git a/workhorse/internal/filestore/save_file_opts_test.go b/workhorse/internal/filestore/save_file_opts_test.go
index ead5ba86889..f389b2054e5 100644
--- a/workhorse/internal/filestore/save_file_opts_test.go
+++ b/workhorse/internal/filestore/save_file_opts_test.go
@@ -141,21 +141,21 @@ func TestGetOpts(t *testing.T) {
func TestGetOptsFail(t *testing.T) {
testCases := []struct {
desc string
- in api.Response
+ in *api.Response
}{
{
desc: "neither local nor remote",
- in: api.Response{},
+ in: &api.Response{},
},
{
desc: "both local and remote",
- in: api.Response{TempPath: "/foobar", RemoteObject: api.RemoteObject{ID: "id"}},
+ in: &api.Response{TempPath: "/foobar", RemoteObject: api.RemoteObject{ID: "id"}},
},
}
for _, tc := range testCases {
t.Run(tc.desc, func(t *testing.T) {
- _, err := filestore.GetOpts(&tc.in)
+ _, err := filestore.GetOpts(tc.in)
require.Error(t, err, "expect input to be rejected")
})
}
diff --git a/workhorse/internal/git/archive.go b/workhorse/internal/git/archive.go
index bb35f2eb269..fc12094cc14 100644
--- a/workhorse/internal/git/archive.go
+++ b/workhorse/internal/git/archive.go
@@ -102,7 +102,7 @@ func (a *archive) Inject(w http.ResponseWriter, r *http.Request, sendData string
var archiveReader io.Reader
- archiveReader, err = handleArchiveWithGitaly(r, params, format)
+ archiveReader, err = handleArchiveWithGitaly(r, &params, format)
if err != nil {
helper.Fail500(w, r, fmt.Errorf("operations.GetArchive: %v", err))
return
@@ -130,7 +130,7 @@ func (a *archive) Inject(w http.ResponseWriter, r *http.Request, sendData string
}
}
-func handleArchiveWithGitaly(r *http.Request, params archiveParams, format gitalypb.GetArchiveRequest_Format) (io.Reader, error) {
+func handleArchiveWithGitaly(r *http.Request, params *archiveParams, format gitalypb.GetArchiveRequest_Format) (io.Reader, error) {
var request *gitalypb.GetArchiveRequest
ctx, c, err := gitaly.NewRepositoryClient(r.Context(), params.GitalyServer)
if err != nil {
diff --git a/workhorse/internal/git/info-refs.go b/workhorse/internal/git/info-refs.go
index 0d8edbeff06..8390143b99b 100644
--- a/workhorse/internal/git/info-refs.go
+++ b/workhorse/internal/git/info-refs.go
@@ -8,8 +8,8 @@ import (
"net/http"
"github.com/golang/gddo/httputil"
-
- "gitlab.com/gitlab-org/labkit/log"
+ grpccodes "google.golang.org/grpc/codes"
+ grpcstatus "google.golang.org/grpc/status"
"gitlab.com/gitlab-org/gitlab/workhorse/internal/api"
"gitlab.com/gitlab-org/gitlab/workhorse/internal/gitaly"
@@ -26,6 +26,7 @@ func handleGetInfoRefs(rw http.ResponseWriter, r *http.Request, a *api.Response)
defer responseWriter.Log(r, 0)
rpc := getService(r)
+
if !(rpc == "git-upload-pack" || rpc == "git-receive-pack") {
// The 'dumb' Git HTTP protocol is not supported
http.Error(responseWriter, "Not Found", 404)
@@ -41,19 +42,26 @@ func handleGetInfoRefs(rw http.ResponseWriter, r *http.Request, a *api.Response)
encoding := httputil.NegotiateContentEncoding(r, offers)
if err := handleGetInfoRefsWithGitaly(r.Context(), responseWriter, a, rpc, gitProtocol, encoding); err != nil {
- helper.Fail500(responseWriter, r, fmt.Errorf("handleGetInfoRefs: %v", err))
+ status := grpcstatus.Convert(err)
+ err = fmt.Errorf("handleGetInfoRefs: %v", err)
+
+ if status != nil && status.Code() == grpccodes.Unavailable {
+ helper.CaptureAndFail(responseWriter, r, err, "The git server, Gitaly, is not available at this time. Please contact your administrator.", http.StatusServiceUnavailable)
+ } else {
+ helper.Fail500(responseWriter, r, err)
+ }
}
}
func handleGetInfoRefsWithGitaly(ctx context.Context, responseWriter *HttpResponseWriter, a *api.Response, rpc, gitProtocol, encoding string) error {
ctx, smarthttp, err := gitaly.NewSmartHTTPClient(ctx, a.GitalyServer)
if err != nil {
- return fmt.Errorf("GetInfoRefsHandler: %v", err)
+ return err
}
infoRefsResponseReader, err := smarthttp.InfoRefsResponseReader(ctx, &a.Repository, rpc, gitConfigOptions(a), gitProtocol)
if err != nil {
- return fmt.Errorf("GetInfoRefsHandler: %v", err)
+ return err
}
var w io.Writer
@@ -69,7 +77,7 @@ func handleGetInfoRefsWithGitaly(ctx context.Context, responseWriter *HttpRespon
}
if _, err = io.Copy(w, infoRefsResponseReader); err != nil {
- log.WithError(err).Error("GetInfoRefsHandler: error copying gitaly response")
+ return err
}
return nil
diff --git a/workhorse/internal/git/info-refs_test.go b/workhorse/internal/git/info-refs_test.go
new file mode 100644
index 00000000000..4f23d1ac174
--- /dev/null
+++ b/workhorse/internal/git/info-refs_test.go
@@ -0,0 +1,42 @@
+package git
+
+import (
+ "net/http/httptest"
+ "testing"
+
+ "github.com/stretchr/testify/require"
+ grpccodes "google.golang.org/grpc/codes"
+ grpcstatus "google.golang.org/grpc/status"
+
+ "gitlab.com/gitlab-org/gitaly/v14/proto/go/gitalypb"
+
+ "gitlab.com/gitlab-org/gitlab/workhorse/internal/api"
+ "gitlab.com/gitlab-org/gitlab/workhorse/internal/gitaly"
+)
+
+type smartHTTPServiceServerWithInfoRefs struct {
+ gitalypb.UnimplementedSmartHTTPServiceServer
+ InfoRefsUploadPackFunc func(*gitalypb.InfoRefsRequest, gitalypb.SmartHTTPService_InfoRefsUploadPackServer) error
+}
+
+func (srv *smartHTTPServiceServerWithInfoRefs) InfoRefsUploadPack(r *gitalypb.InfoRefsRequest, s gitalypb.SmartHTTPService_InfoRefsUploadPackServer) error {
+ return srv.InfoRefsUploadPackFunc(r, s)
+}
+
+func TestGetInfoRefsHandler(t *testing.T) {
+ addr := startSmartHTTPServer(t, &smartHTTPServiceServerWithInfoRefs{
+ InfoRefsUploadPackFunc: func(r *gitalypb.InfoRefsRequest, s gitalypb.SmartHTTPService_InfoRefsUploadPackServer) error {
+ return grpcstatus.Error(grpccodes.Unavailable, "error")
+ },
+ })
+
+ w := httptest.NewRecorder()
+ r := httptest.NewRequest("GET", "/?service=git-upload-pack", nil)
+ a := &api.Response{GitalyServer: gitaly.Server{Address: addr}}
+
+ handleGetInfoRefs(NewHttpResponseWriter(w), r, a)
+ require.Equal(t, 503, w.Code)
+
+ msg := "The git server, Gitaly, is not available at this time. Please contact your administrator.\n"
+ require.Equal(t, msg, w.Body.String())
+}
diff --git a/workhorse/internal/git/upload-pack_test.go b/workhorse/internal/git/upload-pack_test.go
index ebefe360122..211f68a2608 100644
--- a/workhorse/internal/git/upload-pack_test.go
+++ b/workhorse/internal/git/upload-pack_test.go
@@ -45,14 +45,13 @@ func TestUploadPackTimesOut(t *testing.T) {
uploadPackTimeout = time.Millisecond
defer func() { uploadPackTimeout = originalUploadPackTimeout }()
- addr, cleanUp := startSmartHTTPServer(t, &smartHTTPServiceServer{
+ addr := startSmartHTTPServer(t, &smartHTTPServiceServer{
PostUploadPackFunc: func(stream gitalypb.SmartHTTPService_PostUploadPackServer) error {
_, err := stream.Recv() // trigger a read on the client request body
require.NoError(t, err)
return nil
},
})
- defer cleanUp()
body := &fakeReader{n: 0, err: nil}
@@ -64,7 +63,9 @@ func TestUploadPackTimesOut(t *testing.T) {
require.EqualError(t, err, "smarthttp.UploadPack: busyReader: context deadline exceeded")
}
-func startSmartHTTPServer(t testing.TB, s gitalypb.SmartHTTPServiceServer) (string, func()) {
+func startSmartHTTPServer(t testing.TB, s gitalypb.SmartHTTPServiceServer) string {
+ t.Helper()
+
tmp, err := ioutil.TempDir("", "")
require.NoError(t, err)
@@ -78,8 +79,10 @@ func startSmartHTTPServer(t testing.TB, s gitalypb.SmartHTTPServiceServer) (stri
require.NoError(t, srv.Serve(ln))
}()
- return fmt.Sprintf("%s://%s", ln.Addr().Network(), ln.Addr().String()), func() {
+ t.Cleanup(func() {
srv.GracefulStop()
require.NoError(t, os.RemoveAll(tmp), "error removing temp dir %q", tmp)
- }
+ })
+
+ return fmt.Sprintf("%s://%s", ln.Addr().Network(), ln.Addr().String())
}
diff --git a/workhorse/internal/gitaly/gitaly.go b/workhorse/internal/gitaly/gitaly.go
index 6ea99962056..362f380dc4d 100644
--- a/workhorse/internal/gitaly/gitaly.go
+++ b/workhorse/internal/gitaly/gitaly.go
@@ -11,6 +11,7 @@ import (
grpc_prometheus "github.com/grpc-ecosystem/go-grpc-prometheus"
"github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/client_golang/prometheus/promauto"
+ "github.com/sirupsen/logrus"
"google.golang.org/grpc"
"google.golang.org/grpc/metadata"
@@ -23,15 +24,19 @@ import (
)
type Server struct {
- Address string `json:"address"`
- Token string `json:"token"`
- Features map[string]string `json:"features"`
+ Address string `json:"address"`
+ Token string `json:"token"`
+ Features map[string]string `json:"features"`
+ Sidechannel bool `json:"sidechannel"`
}
-type cacheKey struct{ address, token string }
+type cacheKey struct {
+ address, token string
+ sidechannel bool
+}
func (server Server) cacheKey() cacheKey {
- return cacheKey{address: server.Address, token: server.Token}
+ return cacheKey{address: server.Address, token: server.Token, sidechannel: server.Sidechannel}
}
type connectionsCache struct {
@@ -41,9 +46,17 @@ type connectionsCache struct {
var (
jsonUnMarshaler = jsonpb.Unmarshaler{AllowUnknownFields: true}
- cache = connectionsCache{
+ // This connection cache map contains two types of connections:
+ // - Normal gRPC connections
+ // - Sidechannel connections. When client dials to the Gitaly server, the
+ // server multiplexes the connection using Yamux. In the future, the server
+ // can open another stream to transfer data without gRPC. Besides, we apply
+ // a framing protocol to add the half-close capability to Yamux streams.
+ // Hence, we cannot use those connections interchangeably.
+ cache = connectionsCache{
connections: make(map[cacheKey]*grpc.ClientConn),
}
+ sidechannelRegistry *gitalyclient.SidechannelRegistry
connectionsTotal = promauto.NewCounterVec(
prometheus.CounterOpts{
@@ -54,6 +67,12 @@ var (
)
)
+func InitializeSidechannelRegistry(logger *logrus.Logger) {
+ if sidechannelRegistry == nil {
+ sidechannelRegistry = gitalyclient.NewSidechannelRegistry(logrus.NewEntry(logger))
+ }
+}
+
func withOutgoingMetadata(ctx context.Context, features map[string]string) context.Context {
md := metadata.New(nil)
for k, v := range features {
@@ -72,7 +91,12 @@ func NewSmartHTTPClient(ctx context.Context, server Server) (context.Context, *S
return nil, nil, err
}
grpcClient := gitalypb.NewSmartHTTPServiceClient(conn)
- return withOutgoingMetadata(ctx, server.Features), &SmartHTTPClient{grpcClient}, nil
+ smartHTTPClient := &SmartHTTPClient{
+ SmartHTTPServiceClient: grpcClient,
+ sidechannelRegistry: sidechannelRegistry,
+ useSidechannel: server.Sidechannel,
+ }
+ return withOutgoingMetadata(ctx, server.Features), smartHTTPClient, nil
}
func NewBlobClient(ctx context.Context, server Server) (context.Context, *BlobClient, error) {
@@ -173,7 +197,13 @@ func newConnection(server Server) (*grpc.ClientConn, error) {
),
)
- conn, connErr := gitalyclient.Dial(server.Address, connOpts)
+ var conn *grpc.ClientConn
+ var connErr error
+ if server.Sidechannel {
+ conn, connErr = gitalyclient.DialSidechannel(context.Background(), server.Address, sidechannelRegistry, connOpts) // lint:allow context.Background
+ } else {
+ conn, connErr = gitalyclient.Dial(server.Address, connOpts)
+ }
label := "ok"
if connErr != nil {
diff --git a/workhorse/internal/gitaly/gitaly_test.go b/workhorse/internal/gitaly/gitaly_test.go
index b17fb5c1d7b..9c54caae8c6 100644
--- a/workhorse/internal/gitaly/gitaly_test.go
+++ b/workhorse/internal/gitaly/gitaly_test.go
@@ -4,14 +4,32 @@ import (
"context"
"testing"
+ "github.com/sirupsen/logrus"
"github.com/stretchr/testify/require"
"google.golang.org/grpc/metadata"
)
func TestNewSmartHTTPClient(t *testing.T) {
- ctx, _, err := NewSmartHTTPClient(context.Background(), serverFixture())
+ ctx, client, err := NewSmartHTTPClient(context.Background(), serverFixture())
require.NoError(t, err)
testOutgoingMetadata(t, ctx)
+
+ require.False(t, client.useSidechannel)
+ require.Nil(t, client.sidechannelRegistry)
+}
+
+func TestNewSmartHTTPClientWithSidechannel(t *testing.T) {
+ InitializeSidechannelRegistry(logrus.StandardLogger())
+
+ fixture := serverFixture()
+ fixture.Sidechannel = true
+
+ ctx, client, err := NewSmartHTTPClient(context.Background(), fixture)
+ require.NoError(t, err)
+ testOutgoingMetadata(t, ctx)
+
+ require.True(t, client.useSidechannel)
+ require.NotNil(t, client.sidechannelRegistry)
}
func TestNewBlobClient(t *testing.T) {
diff --git a/workhorse/internal/gitaly/smarthttp.go b/workhorse/internal/gitaly/smarthttp.go
index 69656ab0a92..de6954efa60 100644
--- a/workhorse/internal/gitaly/smarthttp.go
+++ b/workhorse/internal/gitaly/smarthttp.go
@@ -5,11 +5,14 @@ import (
"fmt"
"io"
+ gitalyclient "gitlab.com/gitlab-org/gitaly/v14/client"
"gitlab.com/gitlab-org/gitaly/v14/proto/go/gitalypb"
"gitlab.com/gitlab-org/gitaly/v14/streamio"
)
type SmartHTTPClient struct {
+ useSidechannel bool
+ sidechannelRegistry *gitalyclient.SidechannelRegistry
gitalypb.SmartHTTPServiceClient
}
@@ -93,6 +96,14 @@ func (client *SmartHTTPClient) ReceivePack(ctx context.Context, repo *gitalypb.R
}
func (client *SmartHTTPClient) UploadPack(ctx context.Context, repo *gitalypb.Repository, clientRequest io.Reader, clientResponse io.Writer, gitConfigOptions []string, gitProtocol string) error {
+ if client.useSidechannel {
+ return client.runUploadPackWithSidechannel(ctx, repo, clientRequest, clientResponse, gitConfigOptions, gitProtocol)
+ }
+
+ return client.runUploadPack(ctx, repo, clientRequest, clientResponse, gitConfigOptions, gitProtocol)
+}
+
+func (client *SmartHTTPClient) runUploadPack(ctx context.Context, repo *gitalypb.Repository, clientRequest io.Reader, clientResponse io.Writer, gitConfigOptions []string, gitProtocol string) error {
stream, err := client.PostUploadPack(ctx)
if err != nil {
return err
@@ -137,3 +148,38 @@ func (client *SmartHTTPClient) UploadPack(ctx context.Context, repo *gitalypb.Re
return nil
}
+
+func (client *SmartHTTPClient) runUploadPackWithSidechannel(ctx context.Context, repo *gitalypb.Repository, clientRequest io.Reader, clientResponse io.Writer, gitConfigOptions []string, gitProtocol string) error {
+ ctx, waiter := client.sidechannelRegistry.Register(ctx, func(conn gitalyclient.SidechannelConn) error {
+ if _, err := io.Copy(conn, clientRequest); err != nil {
+ return err
+ }
+
+ if err := conn.CloseWrite(); err != nil {
+ return fmt.Errorf("fail to signal sidechannel half-close: %w", err)
+ }
+
+ if _, err := io.Copy(clientResponse, conn); err != nil {
+ return err
+ }
+
+ return nil
+ })
+ defer waiter.Close()
+
+ rpcRequest := &gitalypb.PostUploadPackWithSidechannelRequest{
+ Repository: repo,
+ GitConfigOptions: gitConfigOptions,
+ GitProtocol: gitProtocol,
+ }
+
+ if _, err := client.PostUploadPackWithSidechannel(ctx, rpcRequest); err != nil {
+ return err
+ }
+
+ if err := waiter.Close(); err != nil {
+ return fmt.Errorf("fail to close sidechannel connection: %w", err)
+ }
+
+ return nil
+}
diff --git a/workhorse/internal/gitaly/unmarshal_test.go b/workhorse/internal/gitaly/unmarshal_test.go
index 270b96f900d..730eff4005a 100644
--- a/workhorse/internal/gitaly/unmarshal_test.go
+++ b/workhorse/internal/gitaly/unmarshal_test.go
@@ -3,6 +3,7 @@ package gitaly
import (
"testing"
+ "github.com/golang/protobuf/proto" //lint:ignore SA1019 https://gitlab.com/gitlab-org/gitlab/-/issues/324868
"github.com/stretchr/testify/require"
"gitlab.com/gitlab-org/gitaly/v14/proto/go/gitalypb"
)
@@ -11,25 +12,25 @@ func TestUnmarshalJSON(t *testing.T) {
testCases := []struct {
desc string
in string
- out gitalypb.Repository
+ out *gitalypb.Repository
}{
{
desc: "basic example",
in: `{"relative_path":"foo/bar.git"}`,
- out: gitalypb.Repository{RelativePath: "foo/bar.git"},
+ out: &gitalypb.Repository{RelativePath: "foo/bar.git"},
},
{
desc: "unknown field",
in: `{"relative_path":"foo/bar.git","unknown_field":12345}`,
- out: gitalypb.Repository{RelativePath: "foo/bar.git"},
+ out: &gitalypb.Repository{RelativePath: "foo/bar.git"},
},
}
for _, tc := range testCases {
t.Run(tc.desc, func(t *testing.T) {
- result := gitalypb.Repository{}
- require.NoError(t, UnmarshalJSON(tc.in, &result))
- require.Equal(t, tc.out, result)
+ result := &gitalypb.Repository{}
+ require.NoError(t, UnmarshalJSON(tc.in, result))
+ require.True(t, proto.Equal(tc.out, result))
})
}
}
diff --git a/workhorse/internal/testhelper/gitaly.go b/workhorse/internal/testhelper/gitaly.go
index 13e71c570a7..da2fbf30785 100644
--- a/workhorse/internal/testhelper/gitaly.go
+++ b/workhorse/internal/testhelper/gitaly.go
@@ -1,6 +1,7 @@
package testhelper
import (
+ "bytes"
"fmt"
"io"
"io/ioutil"
@@ -11,6 +12,7 @@ import (
"github.com/golang/protobuf/jsonpb" //lint:ignore SA1019 https://gitlab.com/gitlab-org/gitlab/-/issues/324868
"github.com/golang/protobuf/proto" //lint:ignore SA1019 https://gitlab.com/gitlab-org/gitlab/-/issues/324868
"golang.org/x/net/context"
+ "google.golang.org/grpc"
"google.golang.org/grpc/codes"
"google.golang.org/grpc/metadata"
"google.golang.org/grpc/status"
@@ -23,6 +25,7 @@ type GitalyTestServer struct {
finalMessageCode codes.Code
sync.WaitGroup
LastIncomingMetadata metadata.MD
+ gitalypb.UnimplementedSmartHTTPServiceServer
gitalypb.UnimplementedRepositoryServiceServer
gitalypb.UnimplementedBlobServiceServer
gitalypb.UnimplementedDiffServiceServer
@@ -191,13 +194,14 @@ func (s *GitalyTestServer) PostUploadPack(stream gitalypb.SmartHTTPService_PostU
return err
}
- jsonString, err := marshalJSON(req)
- if err != nil {
+ marshaler := &jsonpb.Marshaler{}
+ jsonBytes := &bytes.Buffer{}
+ if err := marshaler.Marshal(jsonBytes, req); err != nil {
return err
}
if err := stream.Send(&gitalypb.PostUploadPackResponse{
- Data: []byte(strings.Join([]string{jsonString}, "\000") + "\000"),
+ Data: append(jsonBytes.Bytes(), 0),
}); err != nil {
return err
}
@@ -229,6 +233,43 @@ func (s *GitalyTestServer) PostUploadPack(stream gitalypb.SmartHTTPService_PostU
return s.finalError()
}
+// PostUploadPackWithSidechannel should be a part of smarthttp server in real
+// server. In workhorse, setting up a real sidechannel server is troublesome.
+// Therefore, we bring up a sidechannel server with a mock server exported via
+// gitalyclient.TestSidechannelServer. This is the handler for that mock
+// server.
+func PostUploadPackWithSidechannel(srv interface{}, stream grpc.ServerStream, conn io.ReadWriteCloser) error {
+ if method, ok := grpc.Method(stream.Context()); !ok || method != "/gitaly.SmartHTTPService/PostUploadPackWithSidechannel" {
+ return fmt.Errorf("unexpected method: %s", method)
+ }
+
+ var req gitalypb.PostUploadPackWithSidechannelRequest
+ if err := stream.RecvMsg(&req); err != nil {
+ return err
+ }
+
+ if err := validateRepository(req.GetRepository()); err != nil {
+ return err
+ }
+
+ marshaler := &jsonpb.Marshaler{}
+ jsonBytes := &bytes.Buffer{}
+ if err := marshaler.Marshal(jsonBytes, &req); err != nil {
+ return err
+ }
+
+ // Bounce back all data back to the client, plus flushing bytes
+ if _, err := conn.Write(append(jsonBytes.Bytes(), 0)); err != nil {
+ return err
+ }
+
+ if _, err := io.Copy(conn, conn); err != nil {
+ return err
+ }
+
+ return stream.SendMsg(&gitalypb.PostUploadPackWithSidechannelResponse{})
+}
+
func (s *GitalyTestServer) CommitIsAncestor(ctx context.Context, in *gitalypb.CommitIsAncestorRequest) (*gitalypb.CommitIsAncestorResponse, error) {
return nil, nil
}
diff --git a/workhorse/internal/upload/uploads_test.go b/workhorse/internal/upload/uploads_test.go
index 5fae5cf7bcb..29acf849e05 100644
--- a/workhorse/internal/upload/uploads_test.go
+++ b/workhorse/internal/upload/uploads_test.go
@@ -271,19 +271,19 @@ func TestUploadProcessingFile(t *testing.T) {
tests := []struct {
name string
- preauth api.Response
+ preauth *api.Response
}{
{
name: "FileStore Upload",
- preauth: api.Response{TempPath: tempPath},
+ preauth: &api.Response{TempPath: tempPath},
},
{
name: "ObjectStore Upload",
- preauth: api.Response{RemoteObject: api.RemoteObject{StoreURL: storeUrl}},
+ preauth: &api.Response{RemoteObject: api.RemoteObject{StoreURL: storeUrl}},
},
{
name: "ObjectStore and FileStore Upload",
- preauth: api.Response{
+ preauth: &api.Response{
TempPath: tempPath,
RemoteObject: api.RemoteObject{StoreURL: storeUrl},
},
diff --git a/workhorse/internal/upstream/routes.go b/workhorse/internal/upstream/routes.go
index 8c85c5144e5..d39ba845dc5 100644
--- a/workhorse/internal/upstream/routes.go
+++ b/workhorse/internal/upstream/routes.go
@@ -16,6 +16,7 @@ import (
"gitlab.com/gitlab-org/gitlab/workhorse/internal/builds"
"gitlab.com/gitlab-org/gitlab/workhorse/internal/channel"
"gitlab.com/gitlab-org/gitlab/workhorse/internal/config"
+ "gitlab.com/gitlab-org/gitlab/workhorse/internal/dependencyproxy"
"gitlab.com/gitlab-org/gitlab/workhorse/internal/git"
"gitlab.com/gitlab-org/gitlab/workhorse/internal/helper"
"gitlab.com/gitlab-org/gitlab/workhorse/internal/imageresizer"
@@ -56,6 +57,7 @@ const (
apiPattern = `^/api/`
ciAPIPattern = `^/ci/api/`
gitProjectPattern = `^/.+\.git/`
+ geoGitProjectPattern = `^/[^-].+\.git/` // Prevent matching routes like /-/push_from_secondary
projectPattern = `^/([^/]+/){1,}[^/]+/`
apiProjectPattern = apiPattern + `v4/projects/[^/]+/` // API: Projects can be encoded via group%2Fsubgroup%2Fproject
snippetUploadPattern = `^/uploads/personal_snippet`
@@ -170,7 +172,7 @@ func (ro *routeEntry) isMatch(cleanedPath string, req *http.Request) bool {
return ok
}
-func buildProxy(backend *url.URL, version string, rt http.RoundTripper, cfg config.Config) http.Handler {
+func buildProxy(backend *url.URL, version string, rt http.RoundTripper, cfg config.Config, dependencyProxyInjector *dependencyproxy.Injector) http.Handler {
proxier := proxypkg.NewProxy(backend, version, rt)
return senddata.SendData(
@@ -183,6 +185,7 @@ func buildProxy(backend *url.URL, version string, rt http.RoundTripper, cfg conf
artifacts.SendEntry,
sendurl.SendURL,
imageresizer.NewResizer(cfg),
+ dependencyProxyInjector,
)
}
@@ -193,7 +196,8 @@ func buildProxy(backend *url.URL, version string, rt http.RoundTripper, cfg conf
func configureRoutes(u *upstream) {
api := u.APIClient
static := &staticpages.Static{DocumentRoot: u.DocumentRoot, Exclude: staticExclude}
- proxy := buildProxy(u.Backend, u.Version, u.RoundTripper, u.Config)
+ dependencyProxyInjector := dependencyproxy.NewInjector()
+ proxy := buildProxy(u.Backend, u.Version, u.RoundTripper, u.Config, dependencyProxyInjector)
cableProxy := proxypkg.NewProxy(u.CableBackend, u.Version, u.CableRoundTripper)
assetsNotFoundHandler := NotFoundUnless(u.DevelopmentMode, proxy)
@@ -207,7 +211,7 @@ func configureRoutes(u *upstream) {
}
signingTripper := secret.NewRoundTripper(u.RoundTripper, u.Version)
- signingProxy := buildProxy(u.Backend, u.Version, signingTripper, u.Config)
+ signingProxy := buildProxy(u.Backend, u.Version, signingTripper, u.Config, dependencyProxyInjector)
preparers := createUploadPreparers(u.Config)
uploadPath := path.Join(u.DocumentRoot, "uploads/tmp")
@@ -215,6 +219,8 @@ func configureRoutes(u *upstream) {
ciAPIProxyQueue := queueing.QueueRequests("ci_api_job_requests", uploadAccelerateProxy, u.APILimit, u.APIQueueLimit, u.APIQueueTimeout)
ciAPILongPolling := builds.RegisterHandler(ciAPIProxyQueue, redis.WatchKey, u.APICILongPollingDuration)
+ dependencyProxyInjector.SetUploadHandler(upload.BodyUploader(api, signingProxy, preparers.packages))
+
// Serve static files or forward the requests
defaultUpstream := static.ServeExisting(
u.URLPrefix,
@@ -348,10 +354,9 @@ func configureRoutes(u *upstream) {
// pulls are performed against a different source of truth. Ideally, we'd
// proxy/redirect pulls as well, when the secondary is not up-to-date.
//
- u.route("GET", gitProjectPattern+`info/refs\z`, git.GetInfoRefsHandler(api)),
- u.route("POST", gitProjectPattern+`git-upload-pack\z`, contentEncodingHandler(git.UploadPack(api)), withMatcher(isContentType("application/x-git-upload-pack-request"))),
- u.route("POST", gitProjectPattern+`git-receive-pack\z`, contentEncodingHandler(git.ReceivePack(api)), withMatcher(isContentType("application/x-git-receive-pack-request"))),
- u.route("PUT", gitProjectPattern+`gitlab-lfs/objects/([0-9a-f]{64})/([0-9]+)\z`, lfs.PutStore(api, signingProxy, preparers.lfs), withMatcher(isContentType("application/octet-stream"))),
+ u.route("GET", geoGitProjectPattern+`info/refs\z`, git.GetInfoRefsHandler(api)),
+ u.route("POST", geoGitProjectPattern+`git-upload-pack\z`, contentEncodingHandler(git.UploadPack(api)), withMatcher(isContentType("application/x-git-upload-pack-request"))),
+ u.route("GET", geoGitProjectPattern+`gitlab-lfs/objects/([0-9a-f]{64})\z`, defaultUpstream),
// Serve health checks from this Geo secondary
u.route("", "^/-/(readiness|liveness)$", static.DeployPage(probeUpstream)),
diff --git a/workhorse/internal/upstream/upstream.go b/workhorse/internal/upstream/upstream.go
index d6e5e7766b5..e57f58d59dd 100644
--- a/workhorse/internal/upstream/upstream.go
+++ b/workhorse/internal/upstream/upstream.go
@@ -50,7 +50,7 @@ type upstream struct {
geoLocalRoutes []routeEntry
geoProxyCableRoute routeEntry
geoProxyRoute routeEntry
- geoProxyTestChannel chan struct{}
+ geoProxyPollSleep func(time.Duration)
accessLogger *logrus.Logger
enableGeoProxyFeature bool
mu sync.RWMutex
@@ -68,6 +68,9 @@ func newUpstream(cfg config.Config, accessLogger *logrus.Logger, routesCallback
enableGeoProxyFeature: os.Getenv("GEO_SECONDARY_PROXY") == "1",
geoProxyBackend: &url.URL{},
}
+ if up.geoProxyPollSleep == nil {
+ up.geoProxyPollSleep = time.Sleep
+ }
if up.Backend == nil {
up.Backend = DefaultBackend
}
@@ -205,13 +208,7 @@ func (u *upstream) findGeoProxyRoute(cleanedPath string, r *http.Request) *route
func (u *upstream) pollGeoProxyAPI() {
for {
u.callGeoProxyAPI()
-
- // Notify tests when callGeoProxyAPI() finishes
- if u.geoProxyTestChannel != nil {
- u.geoProxyTestChannel <- struct{}{}
- }
-
- time.Sleep(geoProxyApiPollingInterval)
+ u.geoProxyPollSleep(geoProxyApiPollingInterval)
}
}
@@ -234,6 +231,11 @@ func (u *upstream) updateGeoProxyFields(geoProxyURL *url.URL) {
defer u.mu.Unlock()
u.geoProxyBackend = geoProxyURL
+
+ if u.geoProxyBackend.String() == "" {
+ return
+ }
+
geoProxyRoundTripper := roundtripper.NewBackendRoundTripper(u.geoProxyBackend, "", u.ProxyHeadersTimeout, u.DevelopmentMode)
geoProxyUpstream := proxypkg.NewProxy(u.geoProxyBackend, u.Version, geoProxyRoundTripper)
u.geoProxyCableRoute = u.wsRoute(`^/-/cable\z`, geoProxyUpstream)
diff --git a/workhorse/internal/upstream/upstream_test.go b/workhorse/internal/upstream/upstream_test.go
index c86c03920f0..3c942767384 100644
--- a/workhorse/internal/upstream/upstream_test.go
+++ b/workhorse/internal/upstream/upstream_test.go
@@ -7,6 +7,7 @@ import (
"net/http"
"net/http/httptest"
"testing"
+ "time"
"github.com/sirupsen/logrus"
"github.com/stretchr/testify/require"
@@ -71,10 +72,10 @@ func TestGeoProxyFeatureDisabledOnGeoSecondarySite(t *testing.T) {
defer rsDeferredClose()
geoProxyEndpointResponseBody := fmt.Sprintf(`{"geo_proxy_url":"%v"}`, remoteServer.URL)
- railsServer, deferredClose := startRailsServer("Local Rails server", geoProxyEndpointResponseBody)
+ railsServer, deferredClose := startRailsServer("Local Rails server", &geoProxyEndpointResponseBody)
defer deferredClose()
- ws, wsDeferredClose := startWorkhorseServer(railsServer.URL, false)
+ ws, wsDeferredClose, _ := startWorkhorseServer(railsServer.URL, false)
defer wsDeferredClose()
testCases := []testCase{
@@ -91,13 +92,15 @@ func TestGeoProxyFeatureEnabledOnGeoSecondarySite(t *testing.T) {
defer rsDeferredClose()
geoProxyEndpointResponseBody := fmt.Sprintf(`{"geo_proxy_url":"%v"}`, remoteServer.URL)
- railsServer, deferredClose := startRailsServer("Local Rails server", geoProxyEndpointResponseBody)
+ railsServer, deferredClose := startRailsServer("Local Rails server", &geoProxyEndpointResponseBody)
defer deferredClose()
- ws, wsDeferredClose := startWorkhorseServer(railsServer.URL, true)
+ ws, wsDeferredClose, _ := startWorkhorseServer(railsServer.URL, true)
defer wsDeferredClose()
testCases := []testCase{
+ {"push from secondary is forwarded", "/-/push_from_secondary/foo/bar.git/info/refs", "Geo primary received request to path /-/push_from_secondary/foo/bar.git/info/refs"},
+ {"LFS files are served locally", "/group/project.git/gitlab-lfs/objects/37446575700829a11278ad3a550f244f45d5ae4fe1552778fa4f041f9eaeecf6", "Local Rails server received request to path /group/project.git/gitlab-lfs/objects/37446575700829a11278ad3a550f244f45d5ae4fe1552778fa4f041f9eaeecf6"},
{"jobs request is forwarded", "/api/v4/jobs/request", "Geo primary received request to path /api/v4/jobs/request"},
{"health check is served locally", "/-/health", "Local Rails server received request to path /-/health"},
{"unknown route is forwarded", "/anything", "Geo primary received request to path /anything"},
@@ -109,13 +112,14 @@ func TestGeoProxyFeatureEnabledOnGeoSecondarySite(t *testing.T) {
// This test can be removed when the environment variable `GEO_SECONDARY_PROXY` is removed
func TestGeoProxyFeatureDisabledOnNonGeoSecondarySite(t *testing.T) {
geoProxyEndpointResponseBody := "{}"
- railsServer, deferredClose := startRailsServer("Local Rails server", geoProxyEndpointResponseBody)
+ railsServer, deferredClose := startRailsServer("Local Rails server", &geoProxyEndpointResponseBody)
defer deferredClose()
- ws, wsDeferredClose := startWorkhorseServer(railsServer.URL, false)
+ ws, wsDeferredClose, _ := startWorkhorseServer(railsServer.URL, false)
defer wsDeferredClose()
testCases := []testCase{
+ {"LFS files are served locally", "/group/project.git/gitlab-lfs/objects/37446575700829a11278ad3a550f244f45d5ae4fe1552778fa4f041f9eaeecf6", "Local Rails server received request to path /group/project.git/gitlab-lfs/objects/37446575700829a11278ad3a550f244f45d5ae4fe1552778fa4f041f9eaeecf6"},
{"jobs request is served locally", "/api/v4/jobs/request", "Local Rails server received request to path /api/v4/jobs/request"},
{"health check is served locally", "/-/health", "Local Rails server received request to path /-/health"},
{"unknown route is served locally", "/anything", "Local Rails server received request to path /anything"},
@@ -126,13 +130,14 @@ func TestGeoProxyFeatureDisabledOnNonGeoSecondarySite(t *testing.T) {
func TestGeoProxyFeatureEnabledOnNonGeoSecondarySite(t *testing.T) {
geoProxyEndpointResponseBody := "{}"
- railsServer, deferredClose := startRailsServer("Local Rails server", geoProxyEndpointResponseBody)
+ railsServer, deferredClose := startRailsServer("Local Rails server", &geoProxyEndpointResponseBody)
defer deferredClose()
- ws, wsDeferredClose := startWorkhorseServer(railsServer.URL, true)
+ ws, wsDeferredClose, _ := startWorkhorseServer(railsServer.URL, true)
defer wsDeferredClose()
testCases := []testCase{
+ {"LFS files are served locally", "/group/project.git/gitlab-lfs/objects/37446575700829a11278ad3a550f244f45d5ae4fe1552778fa4f041f9eaeecf6", "Local Rails server received request to path /group/project.git/gitlab-lfs/objects/37446575700829a11278ad3a550f244f45d5ae4fe1552778fa4f041f9eaeecf6"},
{"jobs request is served locally", "/api/v4/jobs/request", "Local Rails server received request to path /api/v4/jobs/request"},
{"health check is served locally", "/-/health", "Local Rails server received request to path /-/health"},
{"unknown route is served locally", "/anything", "Local Rails server received request to path /anything"},
@@ -143,13 +148,14 @@ func TestGeoProxyFeatureEnabledOnNonGeoSecondarySite(t *testing.T) {
func TestGeoProxyFeatureEnabledButWithAPIError(t *testing.T) {
geoProxyEndpointResponseBody := "Invalid response"
- railsServer, deferredClose := startRailsServer("Local Rails server", geoProxyEndpointResponseBody)
+ railsServer, deferredClose := startRailsServer("Local Rails server", &geoProxyEndpointResponseBody)
defer deferredClose()
- ws, wsDeferredClose := startWorkhorseServer(railsServer.URL, true)
+ ws, wsDeferredClose, _ := startWorkhorseServer(railsServer.URL, true)
defer wsDeferredClose()
testCases := []testCase{
+ {"LFS files are served locally", "/group/project.git/gitlab-lfs/objects/37446575700829a11278ad3a550f244f45d5ae4fe1552778fa4f041f9eaeecf6", "Local Rails server received request to path /group/project.git/gitlab-lfs/objects/37446575700829a11278ad3a550f244f45d5ae4fe1552778fa4f041f9eaeecf6"},
{"jobs request is served locally", "/api/v4/jobs/request", "Local Rails server received request to path /api/v4/jobs/request"},
{"health check is served locally", "/-/health", "Local Rails server received request to path /-/health"},
{"unknown route is served locally", "/anything", "Local Rails server received request to path /anything"},
@@ -158,6 +164,52 @@ func TestGeoProxyFeatureEnabledButWithAPIError(t *testing.T) {
runTestCases(t, ws, testCases)
}
+func TestGeoProxyFeatureEnablingAndDisabling(t *testing.T) {
+ remoteServer, rsDeferredClose := startRemoteServer("Geo primary")
+ defer rsDeferredClose()
+
+ geoProxyEndpointEnabledResponseBody := fmt.Sprintf(`{"geo_proxy_url":"%v"}`, remoteServer.URL)
+ geoProxyEndpointDisabledResponseBody := "{}"
+ geoProxyEndpointResponseBody := geoProxyEndpointEnabledResponseBody
+
+ railsServer, deferredClose := startRailsServer("Local Rails server", &geoProxyEndpointResponseBody)
+ defer deferredClose()
+
+ ws, wsDeferredClose, waitForNextApiPoll := startWorkhorseServer(railsServer.URL, true)
+ defer wsDeferredClose()
+
+ testCasesLocal := []testCase{
+ {"LFS files are served locally", "/group/project.git/gitlab-lfs/objects/37446575700829a11278ad3a550f244f45d5ae4fe1552778fa4f041f9eaeecf6", "Local Rails server received request to path /group/project.git/gitlab-lfs/objects/37446575700829a11278ad3a550f244f45d5ae4fe1552778fa4f041f9eaeecf6"},
+ {"jobs request is served locally", "/api/v4/jobs/request", "Local Rails server received request to path /api/v4/jobs/request"},
+ {"health check is served locally", "/-/health", "Local Rails server received request to path /-/health"},
+ {"unknown route is served locally", "/anything", "Local Rails server received request to path /anything"},
+ }
+
+ testCasesProxied := []testCase{
+ {"push from secondary is forwarded", "/-/push_from_secondary/foo/bar.git/info/refs", "Geo primary received request to path /-/push_from_secondary/foo/bar.git/info/refs"},
+ {"LFS files are served locally", "/group/project.git/gitlab-lfs/objects/37446575700829a11278ad3a550f244f45d5ae4fe1552778fa4f041f9eaeecf6", "Local Rails server received request to path /group/project.git/gitlab-lfs/objects/37446575700829a11278ad3a550f244f45d5ae4fe1552778fa4f041f9eaeecf6"},
+ {"jobs request is forwarded", "/api/v4/jobs/request", "Geo primary received request to path /api/v4/jobs/request"},
+ {"health check is served locally", "/-/health", "Local Rails server received request to path /-/health"},
+ {"unknown route is forwarded", "/anything", "Geo primary received request to path /anything"},
+ }
+
+ // Enabled initially, run tests
+ runTestCases(t, ws, testCasesProxied)
+
+ // Disable proxying and run tests. It's safe to write to
+ // geoProxyEndpointResponseBody because the polling goroutine is blocked.
+ geoProxyEndpointResponseBody = geoProxyEndpointDisabledResponseBody
+ waitForNextApiPoll()
+
+ runTestCases(t, ws, testCasesLocal)
+
+ // Re-enable proxying and run tests
+ geoProxyEndpointResponseBody = geoProxyEndpointEnabledResponseBody
+ waitForNextApiPoll()
+
+ runTestCases(t, ws, testCasesProxied)
+}
+
func runTestCases(t *testing.T, ws *httptest.Server, testCases []testCase) {
t.Helper()
for _, tc := range testCases {
@@ -195,13 +247,13 @@ func startRemoteServer(serverName string) (*httptest.Server, func()) {
return ts, ts.Close
}
-func startRailsServer(railsServerName string, geoProxyEndpointResponseBody string) (*httptest.Server, func()) {
+func startRailsServer(railsServerName string, geoProxyEndpointResponseBody *string) (*httptest.Server, func()) {
ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
var body string
if r.URL.Path == geoProxyEndpoint {
w.Header().Set("Content-Type", "application/vnd.gitlab-workhorse+json")
- body = geoProxyEndpointResponseBody
+ body = *geoProxyEndpointResponseBody
} else {
body = railsServerName + " received request to path " + r.URL.Path
}
@@ -213,15 +265,19 @@ func startRailsServer(railsServerName string, geoProxyEndpointResponseBody strin
return ts, ts.Close
}
-func startWorkhorseServer(railsServerURL string, enableGeoProxyFeature bool) (*httptest.Server, func()) {
- geoProxyTestChannel := make(chan struct{})
+func startWorkhorseServer(railsServerURL string, enableGeoProxyFeature bool) (*httptest.Server, func(), func()) {
+ geoProxySleepC := make(chan struct{})
+ geoProxySleep := func(time.Duration) {
+ geoProxySleepC <- struct{}{}
+ <-geoProxySleepC
+ }
myConfigureRoutes := func(u *upstream) {
// Enable environment variable "feature flag"
u.enableGeoProxyFeature = enableGeoProxyFeature
- // An empty message will be sent to this channel after every callGeoProxyAPI()
- u.geoProxyTestChannel = geoProxyTestChannel
+ // Replace the time.Sleep function with geoProxySleep
+ u.geoProxyPollSleep = geoProxySleep
// call original
configureRoutes(u)
@@ -231,13 +287,20 @@ func startWorkhorseServer(railsServerURL string, enableGeoProxyFeature bool) (*h
ws := httptest.NewServer(upstreamHandler)
testhelper.ConfigureSecret()
+ waitForNextApiPoll := func() {}
+
if enableGeoProxyFeature {
- // Wait for an empty message from callGeoProxyAPI(). This should be done on
- // all tests where enableGeoProxyFeature is true, including the ones where
- // we expect geoProxyURL to be nil or error, to ensure the tests do not pass
- // by coincidence.
- <-geoProxyTestChannel
+ // Wait for geoProxySleep to be entered for the first time
+ <-geoProxySleepC
+
+ waitForNextApiPoll = func() {
+ // Cause geoProxySleep to return
+ geoProxySleepC <- struct{}{}
+
+ // Wait for geoProxySleep to be entered again
+ <-geoProxySleepC
+ }
}
- return ws, ws.Close
+ return ws, ws.Close, waitForNextApiPoll
}
diff --git a/workhorse/internal/zipartifacts/open_archive_test.go b/workhorse/internal/zipartifacts/open_archive_test.go
index f7624d053d9..ea1fc606784 100644
--- a/workhorse/internal/zipartifacts/open_archive_test.go
+++ b/workhorse/internal/zipartifacts/open_archive_test.go
@@ -2,56 +2,124 @@ package zipartifacts
import (
"archive/zip"
+ "bytes"
"context"
"fmt"
- "io/ioutil"
+ "io"
"net/http"
"net/http/httptest"
"os"
"path/filepath"
+ "runtime"
+ "strings"
"testing"
"github.com/stretchr/testify/require"
)
-func TestOpenHTTPArchive(t *testing.T) {
- const (
- zipFile = "test.zip"
- entryName = "hello.txt"
- contents = "world"
- testRoot = "testdata/public"
- )
-
- require.NoError(t, os.MkdirAll(testRoot, 0755))
- f, err := os.Create(filepath.Join(testRoot, zipFile))
- require.NoError(t, err, "create file")
+func createArchive(t *testing.T, dir string) (map[string][]byte, int64) {
+ f, err := os.Create(filepath.Join(dir, "test.zip"))
+ require.NoError(t, err)
defer f.Close()
-
zw := zip.NewWriter(f)
- w, err := zw.Create(entryName)
- require.NoError(t, err, "create zip entry")
- _, err = fmt.Fprint(w, contents)
- require.NoError(t, err, "write zip entry contents")
- require.NoError(t, zw.Close(), "close zip writer")
- require.NoError(t, f.Close(), "close file")
-
- srv := httptest.NewServer(http.FileServer(http.Dir(testRoot)))
+
+ entries := make(map[string][]byte)
+ for _, size := range []int{0, 32 * 1024, 128 * 1024, 5 * 1024 * 1024} {
+ entryName := fmt.Sprintf("file_%d", size)
+ entries[entryName] = bytes.Repeat([]byte{'z'}, size)
+
+ w, err := zw.Create(entryName)
+ require.NoError(t, err)
+
+ _, err = w.Write(entries[entryName])
+ require.NoError(t, err)
+ }
+
+ require.NoError(t, zw.Close())
+ fi, err := f.Stat()
+ require.NoError(t, err)
+ require.NoError(t, f.Close())
+
+ return entries, fi.Size()
+}
+
+func TestOpenHTTPArchive(t *testing.T) {
+ dir := t.TempDir()
+ entries, _ := createArchive(t, dir)
+
+ srv := httptest.NewServer(http.FileServer(http.Dir(dir)))
defer srv.Close()
- zr, err := OpenArchive(context.Background(), srv.URL+"/"+zipFile)
- require.NoError(t, err, "call OpenArchive")
- require.Len(t, zr.File, 1)
+ ctx, cancel := context.WithCancel(context.Background())
+ defer cancel()
+
+ zr, err := OpenArchive(ctx, srv.URL+"/test.zip")
+ require.NoError(t, err)
+ require.Len(t, zr.File, len(entries))
- zf := zr.File[0]
- require.Equal(t, entryName, zf.Name, "zip entry name")
+ for _, zf := range zr.File {
+ entry, ok := entries[zf.Name]
+ require.True(t, ok)
- entry, err := zf.Open()
- require.NoError(t, err, "get zip entry reader")
- defer entry.Close()
+ r, err := zf.Open()
+ require.NoError(t, err)
- actualContents, err := ioutil.ReadAll(entry)
- require.NoError(t, err, "read zip entry contents")
- require.Equal(t, contents, string(actualContents), "compare zip entry contents")
+ contents, err := io.ReadAll(r)
+ require.NoError(t, err)
+ require.Equal(t, entry, contents)
+
+ require.NoError(t, r.Close())
+ }
+}
+
+func TestMinimalRangeRequests(t *testing.T) {
+ if strings.HasPrefix(runtime.Version(), "go1.17") {
+ t.Skipf("skipped for go1.17: https://gitlab.com/gitlab-org/gitlab/-/issues/340778")
+ }
+
+ dir := t.TempDir()
+ entries, archiveSize := createArchive(t, dir)
+
+ mux := http.NewServeMux()
+
+ var ranges []string
+ mux.HandleFunc("/", func(rw http.ResponseWriter, r *http.Request) {
+ rangeHdr := r.Header.Get("Range")
+ if rangeHdr == "" {
+ rw.Header().Add("Content-Length", fmt.Sprintf("%d", archiveSize))
+ return
+ }
+
+ ranges = append(ranges, rangeHdr)
+ http.FileServer(http.Dir(dir)).ServeHTTP(rw, r)
+ })
+
+ srv := httptest.NewServer(mux)
+ defer srv.Close()
+
+ ctx, cancel := context.WithCancel(context.Background())
+ defer cancel()
+
+ zr, err := OpenArchive(ctx, srv.URL+"/test.zip")
+ require.NoError(t, err)
+ require.Len(t, zr.File, len(entries))
+
+ require.Len(t, ranges, 2, "range requests should be minimal")
+ require.NotContains(t, ranges, "bytes=0-", "range request should not request from zero")
+
+ for _, zf := range zr.File {
+ r, err := zf.Open()
+ require.NoError(t, err)
+
+ _, err = io.Copy(io.Discard, r)
+ require.NoError(t, err)
+
+ require.NoError(t, r.Close())
+ }
+
+ // ensure minimal requests: https://gitlab.com/gitlab-org/gitlab/-/issues/340778
+ require.Len(t, ranges, 3, "range requests should be minimal")
+ require.Contains(t, ranges, "bytes=0-")
}
func TestOpenHTTPArchiveNotSendingAcceptEncodingHeader(t *testing.T) {
@@ -64,5 +132,8 @@ func TestOpenHTTPArchiveNotSendingAcceptEncodingHeader(t *testing.T) {
srv := httptest.NewServer(http.HandlerFunc(requestHandler))
defer srv.Close()
- OpenArchive(context.Background(), srv.URL)
+ ctx, cancel := context.WithCancel(context.Background())
+ defer cancel()
+
+ OpenArchive(ctx, srv.URL)
}
diff --git a/workhorse/main.go b/workhorse/main.go
index 6e7b80bc8c6..123d21596e2 100644
--- a/workhorse/main.go
+++ b/workhorse/main.go
@@ -18,6 +18,7 @@ import (
"gitlab.com/gitlab-org/labkit/tracing"
"gitlab.com/gitlab-org/gitlab/workhorse/internal/config"
+ "gitlab.com/gitlab-org/gitlab/workhorse/internal/gitaly"
"gitlab.com/gitlab-org/gitlab/workhorse/internal/queueing"
"gitlab.com/gitlab-org/gitlab/workhorse/internal/redis"
"gitlab.com/gitlab-org/gitlab/workhorse/internal/secret"
@@ -233,6 +234,8 @@ func run(boot bootConfig, cfg config.Config) error {
}
defer accessCloser.Close()
+ gitaly.InitializeSidechannelRegistry(accessLogger)
+
up := wrapRaven(upstream.NewUpstream(cfg, accessLogger))
done := make(chan os.Signal, 1)
diff --git a/workhorse/main_test.go b/workhorse/main_test.go
index 6e61e2fc65a..349e2d78109 100644
--- a/workhorse/main_test.go
+++ b/workhorse/main_test.go
@@ -814,6 +814,8 @@ func startWorkhorseServerWithConfig(cfg *config.Config) *httptest.Server {
testhelper.ConfigureSecret()
u := upstream.NewUpstream(*cfg, logrus.StandardLogger())
+ gitaly.InitializeSidechannelRegistry(logrus.StandardLogger())
+
return httptest.NewServer(u)
}
@@ -834,6 +836,20 @@ func gitOkBody(t *testing.T) *api.Response {
}
}
+func gitOkBodyWithSidechannel(t *testing.T) *api.Response {
+ return &api.Response{
+ GL_ID: "user-123",
+ GL_USERNAME: "username",
+ Repository: gitalypb.Repository{
+ StorageName: "default",
+ RelativePath: "foo/bar.git",
+ },
+ GitalyServer: gitaly.Server{
+ Sidechannel: true,
+ },
+ }
+}
+
func httpGet(t *testing.T, url string, headers map[string]string) (*http.Response, string) {
req, err := http.NewRequest("GET", url, nil)
require.NoError(t, err)
@@ -934,3 +950,72 @@ func TestHealthChecksUnreachable(t *testing.T) {
})
}
}
+
+func TestDependencyProxyInjector(t *testing.T) {
+ token := "token"
+ bodyLength := 4096
+ expectedBody := strings.Repeat("p", bodyLength)
+
+ testCases := []struct {
+ desc string
+ finalizeStatus int
+ }{
+ {
+ desc: "user downloads the file when the request is successfully finalized",
+ finalizeStatus: 200,
+ }, {
+ desc: "user downloads the file even when the request fails to be finalized",
+ finalizeStatus: 500,
+ },
+ }
+
+ for _, tc := range testCases {
+ t.Run(tc.desc, func(t *testing.T) {
+ originResource := "/origin_resource"
+
+ originResourceServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+ require.Equal(t, originResource, r.URL.String())
+
+ w.Header().Set("Content-Length", strconv.Itoa(bodyLength))
+
+ io.WriteString(w, expectedBody)
+ }))
+ defer originResourceServer.Close()
+
+ originResourceUrl := originResourceServer.URL + originResource
+
+ ts := testhelper.TestServerWithHandler(regexp.MustCompile(`.`), func(w http.ResponseWriter, r *http.Request) {
+ switch r.URL.String() {
+ case "/base":
+ params := `{"Url": "` + originResourceUrl + `", "Token": "` + token + `"}`
+ w.Header().Set("Gitlab-Workhorse-Send-Data", `send-dependency:`+base64.URLEncoding.EncodeToString([]byte(params)))
+ case "/base/upload/authorize":
+ w.Header().Set("Content-Type", api.ResponseContentType)
+ _, err := fmt.Fprintf(w, `{"TempPath":"%s"}`, scratchDir)
+ require.NoError(t, err)
+ case "/base/upload":
+ w.WriteHeader(tc.finalizeStatus)
+ default:
+ t.Fatalf("unexpected request: %s", r.URL)
+ }
+ })
+ defer ts.Close()
+
+ ws := startWorkhorseServer(ts.URL)
+ defer ws.Close()
+
+ resp, err := http.DefaultClient.Get(ws.URL + "/base")
+ require.NoError(t, err)
+ defer resp.Body.Close()
+
+ body, err := io.ReadAll(resp.Body)
+ require.NoError(t, err)
+
+ require.NoError(t, resp.Body.Close()) // Client closes connection
+ ws.Close() // Wait for server handler to return
+
+ require.Equal(t, 200, resp.StatusCode, "status code")
+ require.Equal(t, expectedBody, string(body), "response body")
+ })
+ }
+}
diff --git a/yarn.lock b/yarn.lock
index b27026f47fd..6746a1d71f8 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -21,7 +21,7 @@
resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.15.0.tgz#2dbaf8b85334796cafbb0f5793a90a2fc010b176"
integrity sha512-0NqAC1IJE0S0+lL1SWFMxMkz1pKCNCjI4tr2Zx4LJSXxCLAdr6KyArnY+sno5m3yH9g737ygOyPABDsnXkpxiA==
-"@babel/core@>=7.9.0", "@babel/core@^7.1.0", "@babel/core@^7.1.6", "@babel/core@^7.10.1", "@babel/core@^7.7.5":
+"@babel/core@>=7.9.0", "@babel/core@^7.1.0", "@babel/core@^7.10.1", "@babel/core@^7.7.5":
version "7.15.0"
resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.15.0.tgz#749e57c68778b73ad8082775561f67f5196aafa8"
integrity sha512-tXtmTminrze5HEUPn/a0JtOzzfp0nk+UEXQ/tqIJo3WDGypl/2OFQEMll/zSFU8f/lfmfLXvTaORHF3cfXIQMw==
@@ -42,21 +42,21 @@
semver "^6.3.0"
source-map "^0.5.0"
-"@babel/generator@^7.15.0":
- version "7.15.0"
- resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.15.0.tgz#a7d0c172e0d814974bad5aa77ace543b97917f15"
- integrity sha512-eKl4XdMrbpYvuB505KTta4AV9g+wWzmVBW69tX0H2NwKVKd2YJbKgyK6M8j/rgLbmHOYJn6rUklV677nOyJrEQ==
+"@babel/generator@^7.15.0", "@babel/generator@^7.15.4":
+ version "7.15.4"
+ resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.15.4.tgz#85acb159a267ca6324f9793986991ee2022a05b0"
+ integrity sha512-d3itta0tu+UayjEORPNz6e1T3FtvWlP5N4V5M+lhp/CxT4oAA7/NcScnpRyspUMLK6tu9MNHmQHxRykuN2R7hw==
dependencies:
- "@babel/types" "^7.15.0"
+ "@babel/types" "^7.15.4"
jsesc "^2.5.1"
source-map "^0.5.0"
-"@babel/helper-annotate-as-pure@^7.10.1", "@babel/helper-annotate-as-pure@^7.14.5":
- version "7.14.5"
- resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.14.5.tgz#7bf478ec3b71726d56a8ca5775b046fc29879e61"
- integrity sha512-EivH9EgBIb+G8ij1B2jAwSH36WnGvkQSEC6CkX/6v6ZFlw5fVOHvsgGF4uiEHO2GzMvunZb6tDLQEQSdrdocrA==
+"@babel/helper-annotate-as-pure@^7.10.1", "@babel/helper-annotate-as-pure@^7.15.4":
+ version "7.15.4"
+ resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.15.4.tgz#3d0e43b00c5e49fdb6c57e421601a7a658d5f835"
+ integrity sha512-QwrtdNvUNsPCj2lfNQacsGSQvGX8ee1ttrBrcozUP2Sv/jylewBP/8QFe6ZkBsC8T/GYWonNAWJV4aRR9AL2DA==
dependencies:
- "@babel/types" "^7.14.5"
+ "@babel/types" "^7.15.4"
"@babel/helper-builder-binary-assignment-operator-visitor@^7.10.1":
version "7.10.1"
@@ -67,26 +67,26 @@
"@babel/types" "^7.10.1"
"@babel/helper-compilation-targets@^7.10.2", "@babel/helper-compilation-targets@^7.15.0":
- version "7.15.0"
- resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.15.0.tgz#973df8cbd025515f3ff25db0c05efc704fa79818"
- integrity sha512-h+/9t0ncd4jfZ8wsdAsoIxSa61qhBYlycXiHWqJaQBCXAhDCMbPRSMTGnZIkkmt1u4ag+UQmuqcILwqKzZ4N2A==
+ version "7.15.4"
+ resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.15.4.tgz#cf6d94f30fbefc139123e27dd6b02f65aeedb7b9"
+ integrity sha512-rMWPCirulnPSe4d+gwdWXLfAXTTBj8M3guAf5xFQJ0nvFY7tfNAFnWdqaHegHlgDZOCT4qvhF3BYlSJag8yhqQ==
dependencies:
"@babel/compat-data" "^7.15.0"
"@babel/helper-validator-option" "^7.14.5"
browserslist "^4.16.6"
semver "^6.3.0"
-"@babel/helper-create-class-features-plugin@^7.10.1", "@babel/helper-create-class-features-plugin@^7.14.5", "@babel/helper-create-class-features-plugin@^7.15.0":
- version "7.15.0"
- resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.15.0.tgz#c9a137a4d137b2d0e2c649acf536d7ba1a76c0f7"
- integrity sha512-MdmDXgvTIi4heDVX/e9EFfeGpugqm9fobBVg/iioE8kueXrOHdRDe36FAY7SnE9xXLVeYCoJR/gdrBEIHRC83Q==
+"@babel/helper-create-class-features-plugin@^7.10.1", "@babel/helper-create-class-features-plugin@^7.14.5":
+ version "7.15.4"
+ resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.15.4.tgz#7f977c17bd12a5fba363cb19bea090394bf37d2e"
+ integrity sha512-7ZmzFi+DwJx6A7mHRwbuucEYpyBwmh2Ca0RvI6z2+WLZYCqV0JOaLb+u0zbtmDicebgKBZgqbYfLaKNqSgv5Pw==
dependencies:
- "@babel/helper-annotate-as-pure" "^7.14.5"
- "@babel/helper-function-name" "^7.14.5"
- "@babel/helper-member-expression-to-functions" "^7.15.0"
- "@babel/helper-optimise-call-expression" "^7.14.5"
- "@babel/helper-replace-supers" "^7.15.0"
- "@babel/helper-split-export-declaration" "^7.14.5"
+ "@babel/helper-annotate-as-pure" "^7.15.4"
+ "@babel/helper-function-name" "^7.15.4"
+ "@babel/helper-member-expression-to-functions" "^7.15.4"
+ "@babel/helper-optimise-call-expression" "^7.15.4"
+ "@babel/helper-replace-supers" "^7.15.4"
+ "@babel/helper-split-export-declaration" "^7.15.4"
"@babel/helper-create-regexp-features-plugin@^7.10.1", "@babel/helper-create-regexp-features-plugin@^7.8.3":
version "7.10.1"
@@ -114,63 +114,63 @@
"@babel/traverse" "^7.10.1"
"@babel/types" "^7.10.1"
-"@babel/helper-function-name@^7.10.1", "@babel/helper-function-name@^7.14.5":
- version "7.14.5"
- resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.14.5.tgz#89e2c474972f15d8e233b52ee8c480e2cfcd50c4"
- integrity sha512-Gjna0AsXWfFvrAuX+VKcN/aNNWonizBj39yGwUzVDVTlMYJMK2Wp6xdpy72mfArFq5uK+NOuexfzZlzI1z9+AQ==
+"@babel/helper-function-name@^7.10.1", "@babel/helper-function-name@^7.15.4":
+ version "7.15.4"
+ resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.15.4.tgz#845744dafc4381a4a5fb6afa6c3d36f98a787ebc"
+ integrity sha512-Z91cOMM4DseLIGOnog+Z8OI6YseR9bua+HpvLAQ2XayUGU+neTtX+97caALaLdyu53I/fjhbeCnWnRH1O3jFOw==
dependencies:
- "@babel/helper-get-function-arity" "^7.14.5"
- "@babel/template" "^7.14.5"
- "@babel/types" "^7.14.5"
+ "@babel/helper-get-function-arity" "^7.15.4"
+ "@babel/template" "^7.15.4"
+ "@babel/types" "^7.15.4"
-"@babel/helper-get-function-arity@^7.10.1", "@babel/helper-get-function-arity@^7.14.5":
- version "7.14.5"
- resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.14.5.tgz#25fbfa579b0937eee1f3b805ece4ce398c431815"
- integrity sha512-I1Db4Shst5lewOM4V+ZKJzQ0JGGaZ6VY1jYvMghRjqs6DWgxLCIyFt30GlnKkfUeFLpJt2vzbMVEXVSXlIFYUg==
+"@babel/helper-get-function-arity@^7.10.1", "@babel/helper-get-function-arity@^7.15.4":
+ version "7.15.4"
+ resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.15.4.tgz#098818934a137fce78b536a3e015864be1e2879b"
+ integrity sha512-1/AlxSF92CmGZzHnC515hm4SirTxtpDnLEJ0UyEMgTMZN+6bxXKg04dKhiRx5Enel+SUA1G1t5Ed/yQia0efrA==
dependencies:
- "@babel/types" "^7.14.5"
+ "@babel/types" "^7.15.4"
-"@babel/helper-hoist-variables@^7.10.1", "@babel/helper-hoist-variables@^7.14.5":
- version "7.14.5"
- resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.14.5.tgz#e0dd27c33a78e577d7c8884916a3e7ef1f7c7f8d"
- integrity sha512-R1PXiz31Uc0Vxy4OEOm07x0oSjKAdPPCh3tPivn/Eo8cvz6gveAeuyUUPB21Hoiif0uoPQSSdhIPS3352nvdyQ==
+"@babel/helper-hoist-variables@^7.10.1", "@babel/helper-hoist-variables@^7.15.4":
+ version "7.15.4"
+ resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.15.4.tgz#09993a3259c0e918f99d104261dfdfc033f178df"
+ integrity sha512-VTy085egb3jUGVK9ycIxQiPbquesq0HUQ+tPO0uv5mPEBZipk+5FkRKiWq5apuyTE9FUrjENB0rCf8y+n+UuhA==
dependencies:
- "@babel/types" "^7.14.5"
+ "@babel/types" "^7.15.4"
-"@babel/helper-member-expression-to-functions@^7.15.0":
- version "7.15.0"
- resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.15.0.tgz#0ddaf5299c8179f27f37327936553e9bba60990b"
- integrity sha512-Jq8H8U2kYiafuj2xMTPQwkTBnEEdGKpT35lJEQsRRjnG0LW3neucsaMWLgKcwu3OHKNeYugfw+Z20BXBSEs2Lg==
+"@babel/helper-member-expression-to-functions@^7.15.4":
+ version "7.15.4"
+ resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.15.4.tgz#bfd34dc9bba9824a4658b0317ec2fd571a51e6ef"
+ integrity sha512-cokOMkxC/BTyNP1AlY25HuBWM32iCEsLPI4BHDpJCHHm1FU2E7dKWWIXJgQgSFiu4lp8q3bL1BIKwqkSUviqtA==
dependencies:
- "@babel/types" "^7.15.0"
+ "@babel/types" "^7.15.4"
-"@babel/helper-module-imports@^7.0.0-beta.49", "@babel/helper-module-imports@^7.10.1", "@babel/helper-module-imports@^7.14.5":
- version "7.14.5"
- resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.14.5.tgz#6d1a44df6a38c957aa7c312da076429f11b422f3"
- integrity sha512-SwrNHu5QWS84XlHwGYPDtCxcA0hrSlL2yhWYLgeOc0w7ccOl2qv4s/nARI0aYZW+bSwAL5CukeXA47B/1NKcnQ==
+"@babel/helper-module-imports@^7.0.0-beta.49", "@babel/helper-module-imports@^7.10.1", "@babel/helper-module-imports@^7.15.4":
+ version "7.15.4"
+ resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.15.4.tgz#e18007d230632dea19b47853b984476e7b4e103f"
+ integrity sha512-jeAHZbzUwdW/xHgHQ3QmWR4Jg6j15q4w/gCfwZvtqOxoo5DKtLHk8Bsf4c5RZRC7NmLEs+ohkdq8jFefuvIxAA==
dependencies:
- "@babel/types" "^7.14.5"
+ "@babel/types" "^7.15.4"
"@babel/helper-module-transforms@^7.10.1", "@babel/helper-module-transforms@^7.15.0":
- version "7.15.0"
- resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.15.0.tgz#679275581ea056373eddbe360e1419ef23783b08"
- integrity sha512-RkGiW5Rer7fpXv9m1B3iHIFDZdItnO2/BLfWVW/9q7+KqQSDY5kUfQEbzdXM1MVhJGcugKV7kRrNVzNxmk7NBg==
- dependencies:
- "@babel/helper-module-imports" "^7.14.5"
- "@babel/helper-replace-supers" "^7.15.0"
- "@babel/helper-simple-access" "^7.14.8"
- "@babel/helper-split-export-declaration" "^7.14.5"
- "@babel/helper-validator-identifier" "^7.14.9"
- "@babel/template" "^7.14.5"
- "@babel/traverse" "^7.15.0"
- "@babel/types" "^7.15.0"
-
-"@babel/helper-optimise-call-expression@^7.10.1", "@babel/helper-optimise-call-expression@^7.14.5":
- version "7.14.5"
- resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.14.5.tgz#f27395a8619e0665b3f0364cddb41c25d71b499c"
- integrity sha512-IqiLIrODUOdnPU9/F8ib1Fx2ohlgDhxnIDU7OEVi+kAbEZcyiF7BLU8W6PfvPi9LzztjS7kcbzbmL7oG8kD6VA==
- dependencies:
- "@babel/types" "^7.14.5"
+ version "7.15.7"
+ resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.15.7.tgz#7da80c8cbc1f02655d83f8b79d25866afe50d226"
+ integrity sha512-ZNqjjQG/AuFfekFTY+7nY4RgBSklgTu970c7Rj3m/JOhIu5KPBUuTA9AY6zaKcUvk4g6EbDXdBnhi35FAssdSw==
+ dependencies:
+ "@babel/helper-module-imports" "^7.15.4"
+ "@babel/helper-replace-supers" "^7.15.4"
+ "@babel/helper-simple-access" "^7.15.4"
+ "@babel/helper-split-export-declaration" "^7.15.4"
+ "@babel/helper-validator-identifier" "^7.15.7"
+ "@babel/template" "^7.15.4"
+ "@babel/traverse" "^7.15.4"
+ "@babel/types" "^7.15.6"
+
+"@babel/helper-optimise-call-expression@^7.10.1", "@babel/helper-optimise-call-expression@^7.15.4":
+ version "7.15.4"
+ resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.15.4.tgz#f310a5121a3b9cc52d9ab19122bd729822dee171"
+ integrity sha512-E/z9rfbAOt1vDW1DR7k4SzhzotVV5+qMciWV6LaG1g4jeFrkDlJedjtV4h0i4Q/ITnUu+Pk08M7fczsB9GXBDw==
+ dependencies:
+ "@babel/types" "^7.15.4"
"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.1", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.8.0":
version "7.14.5"
@@ -195,41 +195,41 @@
"@babel/traverse" "^7.10.1"
"@babel/types" "^7.10.1"
-"@babel/helper-replace-supers@^7.10.1", "@babel/helper-replace-supers@^7.15.0":
- version "7.15.0"
- resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.15.0.tgz#ace07708f5bf746bf2e6ba99572cce79b5d4e7f4"
- integrity sha512-6O+eWrhx+HEra/uJnifCwhwMd6Bp5+ZfZeJwbqUTuqkhIT6YcRhiZCOOFChRypOIe0cV46kFrRBlm+t5vHCEaA==
+"@babel/helper-replace-supers@^7.10.1", "@babel/helper-replace-supers@^7.15.4":
+ version "7.15.4"
+ resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.15.4.tgz#52a8ab26ba918c7f6dee28628b07071ac7b7347a"
+ integrity sha512-/ztT6khaXF37MS47fufrKvIsiQkx1LBRvSJNzRqmbyeZnTwU9qBxXYLaaT/6KaxfKhjs2Wy8kG8ZdsFUuWBjzw==
dependencies:
- "@babel/helper-member-expression-to-functions" "^7.15.0"
- "@babel/helper-optimise-call-expression" "^7.14.5"
- "@babel/traverse" "^7.15.0"
- "@babel/types" "^7.15.0"
+ "@babel/helper-member-expression-to-functions" "^7.15.4"
+ "@babel/helper-optimise-call-expression" "^7.15.4"
+ "@babel/traverse" "^7.15.4"
+ "@babel/types" "^7.15.4"
-"@babel/helper-simple-access@^7.14.8":
- version "7.14.8"
- resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.14.8.tgz#82e1fec0644a7e775c74d305f212c39f8fe73924"
- integrity sha512-TrFN4RHh9gnWEU+s7JloIho2T76GPwRHhdzOWLqTrMnlas8T9O7ec+oEDNsRXndOmru9ymH9DFrEOxpzPoSbdg==
+"@babel/helper-simple-access@^7.14.8", "@babel/helper-simple-access@^7.15.4":
+ version "7.15.4"
+ resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.15.4.tgz#ac368905abf1de8e9781434b635d8f8674bcc13b"
+ integrity sha512-UzazrDoIVOZZcTeHHEPYrr1MvTR/K+wgLg6MY6e1CJyaRhbibftF6fR2KU2sFRtI/nERUZR9fBd6aKgBlIBaPg==
dependencies:
- "@babel/types" "^7.14.8"
+ "@babel/types" "^7.15.4"
"@babel/helper-skip-transparent-expression-wrappers@^7.14.5":
- version "7.14.5"
- resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.14.5.tgz#96f486ac050ca9f44b009fbe5b7d394cab3a0ee4"
- integrity sha512-dmqZB7mrb94PZSAOYtr+ZN5qt5owZIAgqtoTuqiFbHFtxgEcmQlRJVI+bO++fciBunXtB6MK7HrzrfcAzIz2NQ==
+ version "7.15.4"
+ resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.15.4.tgz#707dbdba1f4ad0fa34f9114fc8197aec7d5da2eb"
+ integrity sha512-BMRLsdh+D1/aap19TycS4eD1qELGrCBJwzaY9IE8LrpJtJb+H7rQkPIdsfgnMtLBA6DJls7X9z93Z4U8h7xw0A==
dependencies:
- "@babel/types" "^7.14.5"
+ "@babel/types" "^7.15.4"
-"@babel/helper-split-export-declaration@^7.10.1", "@babel/helper-split-export-declaration@^7.14.5":
- version "7.14.5"
- resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.14.5.tgz#22b23a54ef51c2b7605d851930c1976dd0bc693a"
- integrity sha512-hprxVPu6e5Kdp2puZUmvOGjaLv9TCe58E/Fl6hRq4YiVQxIcNvuq6uTM2r1mT/oPskuS9CgR+I94sqAYv0NGKA==
+"@babel/helper-split-export-declaration@^7.10.1", "@babel/helper-split-export-declaration@^7.15.4":
+ version "7.15.4"
+ resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.15.4.tgz#aecab92dcdbef6a10aa3b62ab204b085f776e257"
+ integrity sha512-HsFqhLDZ08DxCpBdEVtKmywj6PQbwnF6HHybur0MAnkAKnlS6uHkwnmRIkElB2Owpfb4xL4NwDmDLFubueDXsw==
dependencies:
- "@babel/types" "^7.14.5"
+ "@babel/types" "^7.15.4"
-"@babel/helper-validator-identifier@^7.14.5", "@babel/helper-validator-identifier@^7.14.9":
- version "7.14.9"
- resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.9.tgz#6654d171b2024f6d8ee151bf2509699919131d48"
- integrity sha512-pQYxPY0UP6IHISRitNe8bsijHex4TWZXi2HwKVsjPiltzlhse2znVcm9Ace510VT1kxIHjGJCZZQBX2gJDbo0g==
+"@babel/helper-validator-identifier@^7.14.5", "@babel/helper-validator-identifier@^7.14.9", "@babel/helper-validator-identifier@^7.15.7":
+ version "7.15.7"
+ resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz#220df993bfe904a4a6b02ab4f3385a5ebf6e2389"
+ integrity sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==
"@babel/helper-validator-option@^7.14.5":
version "7.14.5"
@@ -247,13 +247,13 @@
"@babel/types" "^7.10.1"
"@babel/helpers@^7.14.8":
- version "7.15.3"
- resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.15.3.tgz#c96838b752b95dcd525b4e741ed40bb1dc2a1357"
- integrity sha512-HwJiz52XaS96lX+28Tnbu31VeFSQJGOeKHJeaEPQlTl7PnlhFElWPj8tUXtqFIzeN86XxXoBr+WFAyK2PPVz6g==
+ version "7.15.4"
+ resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.15.4.tgz#5f40f02050a3027121a3cf48d497c05c555eaf43"
+ integrity sha512-V45u6dqEJ3w2rlryYYXf6i9rQ5YMNu4FLS6ngs8ikblhu2VdR1AqAd6aJjBzmf2Qzh6KOLqKHxEN9+TFbAkAVQ==
dependencies:
- "@babel/template" "^7.14.5"
- "@babel/traverse" "^7.15.0"
- "@babel/types" "^7.15.0"
+ "@babel/template" "^7.15.4"
+ "@babel/traverse" "^7.15.4"
+ "@babel/types" "^7.15.4"
"@babel/highlight@^7.10.4", "@babel/highlight@^7.14.5":
version "7.14.5"
@@ -264,10 +264,10 @@
chalk "^2.0.0"
js-tokens "^4.0.0"
-"@babel/parser@^7.0.0", "@babel/parser@^7.1.0", "@babel/parser@^7.1.6", "@babel/parser@^7.14.5", "@babel/parser@^7.15.0":
- version "7.15.3"
- resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.15.3.tgz#3416d9bea748052cfcb63dbcc27368105b1ed862"
- integrity sha512-O0L6v/HvqbdJawj0iBEfVQMc3/6WP+AeOsovsIgBFyJaG+W2w7eqvZB7puddATmWuARlm1SX7DwxJ/JJUnDpEA==
+"@babel/parser@^7.0.0", "@babel/parser@^7.1.0", "@babel/parser@^7.15.0", "@babel/parser@^7.15.4":
+ version "7.15.7"
+ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.15.7.tgz#0c3ed4a2eb07b165dfa85b3cc45c727334c4edae"
+ integrity sha512-rycZXvQ+xS9QyIcJ9HXeDWf1uxqlbVFAUq0Rq0dbc50Zb/+wUe/ehyfzGfm9KZZF0kBejYgxltBXocP+gKdL2g==
"@babel/plugin-proposal-async-generator-functions@^7.10.1":
version "7.10.1"
@@ -278,7 +278,7 @@
"@babel/helper-remap-async-to-generator" "^7.10.1"
"@babel/plugin-syntax-async-generators" "^7.8.0"
-"@babel/plugin-proposal-class-properties@^7.1.0", "@babel/plugin-proposal-class-properties@^7.10.1":
+"@babel/plugin-proposal-class-properties@^7.10.1":
version "7.14.5"
resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.14.5.tgz#40d1ee140c5b1e31a350f4f5eed945096559b42e"
integrity sha512-q/PLpv5Ko4dVc1LYMpCY7RVAAO4uk55qPwrIuJ5QJ8c6cVuAmhu7I/49JOppXL6gXf7ZHzpRVEUZdYoPLM04Gg==
@@ -302,7 +302,7 @@
"@babel/helper-plugin-utils" "^7.10.1"
"@babel/plugin-syntax-json-strings" "^7.8.0"
-"@babel/plugin-proposal-nullish-coalescing-operator@^7.1.0", "@babel/plugin-proposal-nullish-coalescing-operator@^7.10.1":
+"@babel/plugin-proposal-nullish-coalescing-operator@^7.10.1":
version "7.14.5"
resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.14.5.tgz#ee38589ce00e2cc59b299ec3ea406fcd3a0fdaf6"
integrity sha512-gun/SOnMqjSb98Nkaq2rTKMwervfdAoz6NphdY0vTfuzMfryj+tDGb2n6UkDKwez+Y8PZDhE3D143v6Gepp4Hg==
@@ -335,7 +335,7 @@
"@babel/helper-plugin-utils" "^7.10.1"
"@babel/plugin-syntax-optional-catch-binding" "^7.8.0"
-"@babel/plugin-proposal-optional-chaining@^7.1.0", "@babel/plugin-proposal-optional-chaining@^7.10.1":
+"@babel/plugin-proposal-optional-chaining@^7.10.1":
version "7.14.5"
resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.14.5.tgz#fa83651e60a360e3f13797eef00b8d519695b603"
integrity sha512-ycz+VOzo2UbWNI1rQXxIuMOzrDdHGrI23fRiz/Si2R4kv2XZQ1BK8ccdHwehMKBlcH/joGW/tzrUmo67gbJHlQ==
@@ -388,13 +388,6 @@
dependencies:
"@babel/helper-plugin-utils" "^7.8.0"
-"@babel/plugin-syntax-flow@^7.14.5":
- version "7.14.5"
- resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.14.5.tgz#2ff654999497d7d7d142493260005263731da180"
- integrity sha512-9WK5ZwKCdWHxVuU13XNT6X73FGmutAXeor5lGFq6qhOFtMFUF4jkbijuyUdZZlpYq6E2hZeZf/u3959X9wsv0Q==
- dependencies:
- "@babel/helper-plugin-utils" "^7.14.5"
-
"@babel/plugin-syntax-import-meta@^7.10.1", "@babel/plugin-syntax-import-meta@^7.8.3":
version "7.10.4"
resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51"
@@ -458,13 +451,6 @@
dependencies:
"@babel/helper-plugin-utils" "^7.10.1"
-"@babel/plugin-syntax-typescript@^7.14.5":
- version "7.14.5"
- resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.14.5.tgz#b82c6ce471b165b5ce420cf92914d6fb46225716"
- integrity sha512-u6OXzDaIXjEstBRRoBCQ/uKQKlbuaeE5in0RvWdA4pN6AhqxTIwUsnHPU1CFZA/amYObMsuWhYfRl3Ch90HD0Q==
- dependencies:
- "@babel/helper-plugin-utils" "^7.14.5"
-
"@babel/plugin-transform-arrow-functions@^7.10.1":
version "7.10.1"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.10.1.tgz#cb5ee3a36f0863c06ead0b409b4cc43a889b295b"
@@ -547,14 +533,6 @@
"@babel/helper-builder-binary-assignment-operator-visitor" "^7.10.1"
"@babel/helper-plugin-utils" "^7.10.1"
-"@babel/plugin-transform-flow-strip-types@^7.14.5":
- version "7.14.5"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.14.5.tgz#0dc9c1d11dcdc873417903d6df4bed019ef0f85e"
- integrity sha512-KhcolBKfXbvjwI3TV7r7TkYm8oNXHNBqGOy6JDVwtecFaRoKYsUUqJdS10q0YDKW1c6aZQgO+Ys3LfGkox8pXA==
- dependencies:
- "@babel/helper-plugin-utils" "^7.14.5"
- "@babel/plugin-syntax-flow" "^7.14.5"
-
"@babel/plugin-transform-for-of@^7.10.1":
version "7.10.1"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.10.1.tgz#ff01119784eb0ee32258e8646157ba2501fcfda5"
@@ -593,7 +571,7 @@
"@babel/helper-plugin-utils" "^7.10.1"
babel-plugin-dynamic-import-node "^2.3.3"
-"@babel/plugin-transform-modules-commonjs@^7.1.0", "@babel/plugin-transform-modules-commonjs@^7.10.1", "@babel/plugin-transform-modules-commonjs@^7.2.0":
+"@babel/plugin-transform-modules-commonjs@^7.10.1", "@babel/plugin-transform-modules-commonjs@^7.2.0":
version "7.15.0"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.15.0.tgz#3305896e5835f953b5cdb363acd9e8c2219a5281"
integrity sha512-3H/R9s8cXcOGE8kgMlmjYYC9nqr5ELiPkJn4q0mypBrjhYQoc+5/Maq69vV4xRPWnkzZuwJPf5rArxpB/35Cig==
@@ -709,15 +687,6 @@
dependencies:
"@babel/helper-plugin-utils" "^7.10.1"
-"@babel/plugin-transform-typescript@^7.15.0":
- version "7.15.0"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.15.0.tgz#553f230b9d5385018716586fc48db10dd228eb7e"
- integrity sha512-WIIEazmngMEEHDaPTx0IZY48SaAmjVWe3TRSX7cmJXn0bEv9midFzAjxiruOWYIVf5iQ10vFx7ASDpgEO08L5w==
- dependencies:
- "@babel/helper-create-class-features-plugin" "^7.15.0"
- "@babel/helper-plugin-utils" "^7.14.5"
- "@babel/plugin-syntax-typescript" "^7.14.5"
-
"@babel/plugin-transform-unicode-escapes@^7.10.1":
version "7.10.1"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.10.1.tgz#add0f8483dab60570d9e03cecef6c023aa8c9940"
@@ -803,15 +772,6 @@
levenary "^1.1.1"
semver "^5.5.0"
-"@babel/preset-flow@^7.0.0":
- version "7.14.5"
- resolved "https://registry.yarnpkg.com/@babel/preset-flow/-/preset-flow-7.14.5.tgz#a1810b0780c8b48ab0bece8e7ab8d0d37712751c"
- integrity sha512-pP5QEb4qRUSVGzzKx9xqRuHUrM/jEzMqdrZpdMA+oUCRgd5zM1qGr5y5+ZgAL/1tVv1H0dyk5t4SKJntqyiVtg==
- dependencies:
- "@babel/helper-plugin-utils" "^7.14.5"
- "@babel/helper-validator-option" "^7.14.5"
- "@babel/plugin-transform-flow-strip-types" "^7.14.5"
-
"@babel/preset-modules@^0.1.3":
version "0.1.3"
resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.3.tgz#13242b53b5ef8c883c3cf7dddd55b36ce80fbc72"
@@ -823,26 +783,6 @@
"@babel/types" "^7.4.4"
esutils "^2.0.2"
-"@babel/preset-typescript@^7.1.0":
- version "7.15.0"
- resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.15.0.tgz#e8fca638a1a0f64f14e1119f7fe4500277840945"
- integrity sha512-lt0Y/8V3y06Wq/8H/u0WakrqciZ7Fz7mwPDHWUJAXlABL5hiUG42BNlRXiELNjeWjO5rWmnNKlx+yzJvxezHow==
- dependencies:
- "@babel/helper-plugin-utils" "^7.14.5"
- "@babel/helper-validator-option" "^7.14.5"
- "@babel/plugin-transform-typescript" "^7.15.0"
-
-"@babel/register@^7.0.0":
- version "7.15.3"
- resolved "https://registry.yarnpkg.com/@babel/register/-/register-7.15.3.tgz#6b40a549e06ec06c885b2ec42c3dd711f55fe752"
- integrity sha512-mj4IY1ZJkorClxKTImccn4T81+UKTo4Ux0+OFSV9hME1ooqS9UV+pJ6BjD0qXPK4T3XW/KNa79XByjeEMZz+fw==
- dependencies:
- clone-deep "^4.0.1"
- find-cache-dir "^2.0.0"
- make-dir "^2.1.0"
- pirates "^4.0.0"
- source-map-support "^0.5.16"
-
"@babel/runtime-corejs3@^7.10.2":
version "7.10.2"
resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.10.2.tgz#3511797ddf9a3d6f3ce46b99cc835184817eaa4e"
@@ -863,34 +803,34 @@
resolved "https://registry.yarnpkg.com/@babel/standalone/-/standalone-7.10.2.tgz#49dbbadcbc4b199df064d7d8b3e21c915b84abdb"
integrity sha512-PNQuj9oQH6BL/3l9iiL8hJLQwX14woA2/FHcPtNIZAc7IgFZYJdtMBMXiy4xcefADHTSvoBnmc2AybrHRW1IKQ==
-"@babel/template@^7.10.1", "@babel/template@^7.14.5", "@babel/template@^7.3.3":
- version "7.14.5"
- resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.14.5.tgz#a9bc9d8b33354ff6e55a9c60d1109200a68974f4"
- integrity sha512-6Z3Po85sfxRGachLULUhOmvAaOo7xCvqGQtxINai2mEGPFm6pQ4z5QInFnUrRpfoSV60BnjyF5F3c+15fxFV1g==
+"@babel/template@^7.10.1", "@babel/template@^7.14.5", "@babel/template@^7.15.4", "@babel/template@^7.3.3":
+ version "7.15.4"
+ resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.15.4.tgz#51898d35dcf3faa670c4ee6afcfd517ee139f194"
+ integrity sha512-UgBAfEa1oGuYgDIPM2G+aHa4Nlo9Lh6mGD2bDBGMTbYnc38vulXPuC1MGjYILIEmlwl6Rd+BPR9ee3gm20CBtg==
dependencies:
"@babel/code-frame" "^7.14.5"
- "@babel/parser" "^7.14.5"
- "@babel/types" "^7.14.5"
+ "@babel/parser" "^7.15.4"
+ "@babel/types" "^7.15.4"
-"@babel/traverse@^7.0.0", "@babel/traverse@^7.1.0", "@babel/traverse@^7.10.1", "@babel/traverse@^7.15.0":
- version "7.15.0"
- resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.15.0.tgz#4cca838fd1b2a03283c1f38e141f639d60b3fc98"
- integrity sha512-392d8BN0C9eVxVWd8H6x9WfipgVH5IaIoLp23334Sc1vbKKWINnvwRpb4us0xtPaCumlwbTtIYNA0Dv/32sVFw==
+"@babel/traverse@^7.0.0", "@babel/traverse@^7.1.0", "@babel/traverse@^7.10.1", "@babel/traverse@^7.15.0", "@babel/traverse@^7.15.4":
+ version "7.15.4"
+ resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.15.4.tgz#ff8510367a144bfbff552d9e18e28f3e2889c22d"
+ integrity sha512-W6lQD8l4rUbQR/vYgSuCAE75ADyyQvOpFVsvPPdkhf6lATXAsQIG9YdtOcu8BB1dZ0LKu+Zo3c1wEcbKeuhdlA==
dependencies:
"@babel/code-frame" "^7.14.5"
- "@babel/generator" "^7.15.0"
- "@babel/helper-function-name" "^7.14.5"
- "@babel/helper-hoist-variables" "^7.14.5"
- "@babel/helper-split-export-declaration" "^7.14.5"
- "@babel/parser" "^7.15.0"
- "@babel/types" "^7.15.0"
+ "@babel/generator" "^7.15.4"
+ "@babel/helper-function-name" "^7.15.4"
+ "@babel/helper-hoist-variables" "^7.15.4"
+ "@babel/helper-split-export-declaration" "^7.15.4"
+ "@babel/parser" "^7.15.4"
+ "@babel/types" "^7.15.4"
debug "^4.1.0"
globals "^11.1.0"
-"@babel/types@^7.0.0", "@babel/types@^7.0.0-beta.49", "@babel/types@^7.10.1", "@babel/types@^7.10.2", "@babel/types@^7.14.5", "@babel/types@^7.14.8", "@babel/types@^7.15.0", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4":
- version "7.15.0"
- resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.15.0.tgz#61af11f2286c4e9c69ca8deb5f4375a73c72dcbd"
- integrity sha512-OBvfqnllOIdX4ojTHpwZbpvz4j3EWyjkZEdmjH0/cgsd6QOdSgU8rLSk6ard/pcW7rlmjdVSX/AWOaORR1uNOQ==
+"@babel/types@^7.0.0", "@babel/types@^7.0.0-beta.49", "@babel/types@^7.10.1", "@babel/types@^7.10.2", "@babel/types@^7.15.0", "@babel/types@^7.15.4", "@babel/types@^7.15.6", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4":
+ version "7.15.6"
+ resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.15.6.tgz#99abdc48218b2881c058dd0a7ab05b99c9be758f"
+ integrity sha512-BPU+7QhqNjmWyDO0/vitH/CuhpV8ZmK1wpKva8nuyNF5MJfuRNWMc+hc14+u9xT93kvykMdncrJT19h74uB1Ig==
dependencies:
"@babel/helper-validator-identifier" "^7.14.9"
to-fast-properties "^2.0.0"
@@ -933,10 +873,10 @@
resolved "https://registry.yarnpkg.com/@gitlab/at.js/-/at.js-1.5.7.tgz#1ee6f838cc4410a1d797770934df91d90df8179e"
integrity sha512-c6ySRK/Ma7lxwpIVbSAF3P+xiTLrNTGTLRx4/pHK111AdFxwgUwrYF6aVZFXvmG65jHOJHoa0eQQ21RW6rm0Rg==
-"@gitlab/eslint-plugin@9.3.0":
- version "9.3.0"
- resolved "https://registry.yarnpkg.com/@gitlab/eslint-plugin/-/eslint-plugin-9.3.0.tgz#c1765b28d5a2a29143c0a556650fb7527cd9ab0d"
- integrity sha512-c0bR9sgZuyHsC8xzYNrTl6koXBrLgBnVGG2UWwRbs8QnAF0Sf3LTPMjq0vulXZgKqPvMG++em0O5d6nN+oWvuQ==
+"@gitlab/eslint-plugin@9.4.0":
+ version "9.4.0"
+ resolved "https://registry.yarnpkg.com/@gitlab/eslint-plugin/-/eslint-plugin-9.4.0.tgz#cad8f63b7985c22865859cc7d2688eb446ad0bbb"
+ integrity sha512-llPypEQrm9/6Xas5GCoSPAK7W/DgO7CKhzDvAk/Ea9BP0rI2+t8Wg4PFhE1XDctYnnUIS/GrdqVKQkpODk24hQ==
dependencies:
babel-eslint "^10.0.3"
eslint-config-airbnb-base "^14.2.1"
@@ -964,25 +904,25 @@
stylelint-declaration-strict-value "1.7.7"
stylelint-scss "3.18.0"
-"@gitlab/svgs@1.212.0":
- version "1.212.0"
- resolved "https://registry.yarnpkg.com/@gitlab/svgs/-/svgs-1.212.0.tgz#21a5df04c52b10cc1b8521cd8ff7c7d6d13716db"
- integrity sha512-dv0bYTHA3hwi3mNU3bGMq1cd4HVKKFNwCNPgkF91JSp4Xt8DDtJ0Yq4X49ASsq4zCJ3odgkq2aPjEa/Sr5nINQ==
+"@gitlab/svgs@1.218.0":
+ version "1.218.0"
+ resolved "https://registry.yarnpkg.com/@gitlab/svgs/-/svgs-1.218.0.tgz#0715e2ef50b5cb83813e1a5e29d5919a96685734"
+ integrity sha512-eckixyumeWogykEUZfP4pGjoRdhdWQIFwSTM0ks5tQqza+BikcL2xvxzicJs69T1IiCKwYtEpR1c3T/hSx39Mg==
"@gitlab/tributejs@1.0.0":
version "1.0.0"
resolved "https://registry.yarnpkg.com/@gitlab/tributejs/-/tributejs-1.0.0.tgz#672befa222aeffc83e7d799b0500a7a4418e59b8"
integrity sha512-nmKw1+hB6MHvlmPz63yPwVs1qQkycHwsKgxpEbzmky16Y6mL4EJMk3w1b8QlOAF/AIAzjCERPhe/R4MJiohbZw==
-"@gitlab/ui@32.11.0":
- version "32.11.0"
- resolved "https://registry.yarnpkg.com/@gitlab/ui/-/ui-32.11.0.tgz#8c4a1724c1733a243f96e4a4813ae7f348502ba6"
- integrity sha512-EqP5Ub/IWEi5ErX0txx5vsd6hF7d7dOT5GqaRX6rVaLsUhWLYQZ8ld2yEl5Hx7FLki1t3uag17KII5FcvRTDLg==
+"@gitlab/ui@32.19.1":
+ version "32.19.1"
+ resolved "https://registry.yarnpkg.com/@gitlab/ui/-/ui-32.19.1.tgz#ab54408272cb5ee695dc0a328892e047da3d41ac"
+ integrity sha512-ooc0TwCvREuWJfvn8EbOkEz1Mh4UKEu7x0MKhD+TBjG+JJwLKDClmD1cPPE05BXtWAvW5W9JUBkaeMCVQG2l3g==
dependencies:
"@babel/standalone" "^7.0.0"
- bootstrap-vue "2.18.1"
+ bootstrap-vue "2.20.1"
copy-to-clipboard "^3.0.8"
- dompurify "^2.3.2"
+ dompurify "^2.3.3"
echarts "^4.9.0"
highlight.js "^10.6.0"
js-beautify "^1.8.8"
@@ -1202,25 +1142,25 @@
resolved "https://registry.yarnpkg.com/@miragejs/pretender-node-polyfill/-/pretender-node-polyfill-0.1.2.tgz#d26b6b7483fb70cd62189d05c95d2f67153e43f2"
integrity sha512-M/BexG/p05C5lFfMunxo/QcgIJnMT2vDVCd00wNqK2ImZONIlEETZwWJu1QtLxtmYlSHlCFl3JNzp0tLe7OJ5g==
-"@nodelib/fs.scandir@2.1.4":
- version "2.1.4"
- resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.4.tgz#d4b3549a5db5de2683e0c1071ab4f140904bbf69"
- integrity sha512-33g3pMJk3bg5nXbL/+CY6I2eJDzZAni49PfJnL5fghPTggPvBd/pFNSgJsdAgWptuFu7qq/ERvOYFlhvsLTCKA==
+"@nodelib/fs.scandir@2.1.5":
+ version "2.1.5"
+ resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5"
+ integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==
dependencies:
- "@nodelib/fs.stat" "2.0.4"
+ "@nodelib/fs.stat" "2.0.5"
run-parallel "^1.1.9"
-"@nodelib/fs.stat@2.0.4", "@nodelib/fs.stat@^2.0.2":
- version "2.0.4"
- resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.4.tgz#a3f2dd61bab43b8db8fa108a121cfffe4c676655"
- integrity sha512-IYlHJA0clt2+Vg7bccq+TzRdJvv19c2INqBSsoOLp1je7xjtr7J26+WXR72MCdvU9q1qTzIWDfhMf+DRvQJK4Q==
+"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2":
+ version "2.0.5"
+ resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b"
+ integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==
"@nodelib/fs.walk@^1.2.3":
- version "1.2.6"
- resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.6.tgz#cce9396b30aa5afe9e3756608f5831adcb53d063"
- integrity sha512-8Broas6vTtW4GIXTAHDoE32hnN2M5ykgCpWGbuXHQ15vEMqr23pB76e/GZcYsZCHALv50ktd24qhEyKr6wBtow==
+ version "1.2.8"
+ resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a"
+ integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==
dependencies:
- "@nodelib/fs.scandir" "2.1.4"
+ "@nodelib/fs.scandir" "2.1.5"
fastq "^1.6.0"
"@npmcli/move-file@^1.0.1":
@@ -1239,103 +1179,6 @@
consola "^2.15.0"
node-fetch "^2.6.1"
-"@oclif/command@^1.5.20", "@oclif/command@^1.8.0":
- version "1.8.0"
- resolved "https://registry.yarnpkg.com/@oclif/command/-/command-1.8.0.tgz#c1a499b10d26e9d1a611190a81005589accbb339"
- integrity sha512-5vwpq6kbvwkQwKqAoOU3L72GZ3Ta8RRrewKj9OJRolx28KLJJ8Dg9Rf7obRwt5jQA9bkYd8gqzMTrI7H3xLfaw==
- dependencies:
- "@oclif/config" "^1.15.1"
- "@oclif/errors" "^1.3.3"
- "@oclif/parser" "^3.8.3"
- "@oclif/plugin-help" "^3"
- debug "^4.1.1"
- semver "^7.3.2"
-
-"@oclif/config@^1.15.1", "@oclif/config@^1.17.0":
- version "1.17.0"
- resolved "https://registry.yarnpkg.com/@oclif/config/-/config-1.17.0.tgz#ba8639118633102a7e481760c50054623d09fcab"
- integrity sha512-Lmfuf6ubjQ4ifC/9bz1fSCHc6F6E653oyaRXxg+lgT4+bYf9bk+nqrUpAbrXyABkCqgIBiFr3J4zR/kiFdE1PA==
- dependencies:
- "@oclif/errors" "^1.3.3"
- "@oclif/parser" "^3.8.0"
- debug "^4.1.1"
- globby "^11.0.1"
- is-wsl "^2.1.1"
- tslib "^2.0.0"
-
-"@oclif/errors@^1.2.2", "@oclif/errors@^1.3.3":
- version "1.3.5"
- resolved "https://registry.yarnpkg.com/@oclif/errors/-/errors-1.3.5.tgz#a1e9694dbeccab10fe2fe15acb7113991bed636c"
- integrity sha512-OivucXPH/eLLlOT7FkCMoZXiaVYf8I/w1eTAM1+gKzfhALwWTusxEx7wBmW0uzvkSg/9ovWLycPaBgJbM3LOCQ==
- dependencies:
- clean-stack "^3.0.0"
- fs-extra "^8.1"
- indent-string "^4.0.0"
- strip-ansi "^6.0.0"
- wrap-ansi "^7.0.0"
-
-"@oclif/linewrap@^1.0.0":
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/@oclif/linewrap/-/linewrap-1.0.0.tgz#aedcb64b479d4db7be24196384897b5000901d91"
- integrity sha512-Ups2dShK52xXa8w6iBWLgcjPJWjais6KPJQq3gQ/88AY6BXoTX+MIGFPrWQO1KLMiQfoTpcLnUwloN4brrVUHw==
-
-"@oclif/parser@^3.8.0", "@oclif/parser@^3.8.3":
- version "3.8.5"
- resolved "https://registry.yarnpkg.com/@oclif/parser/-/parser-3.8.5.tgz#c5161766a1efca7343e1f25d769efbefe09f639b"
- integrity sha512-yojzeEfmSxjjkAvMRj0KzspXlMjCfBzNRPkWw8ZwOSoNWoJn+OCS/m/S+yfV6BvAM4u2lTzX9Y5rCbrFIgkJLg==
- dependencies:
- "@oclif/errors" "^1.2.2"
- "@oclif/linewrap" "^1.0.0"
- chalk "^2.4.2"
- tslib "^1.9.3"
-
-"@oclif/plugin-help@^3", "@oclif/plugin-help@^3.2.0":
- version "3.2.3"
- resolved "https://registry.yarnpkg.com/@oclif/plugin-help/-/plugin-help-3.2.3.tgz#cd24010e7eb326782843d3aa6d6b5a4affebb2c3"
- integrity sha512-l2Pd0lbOMq4u/7xsl9hqISFqyR9gWEz/8+05xmrXFr67jXyS6EUCQB+mFBa0wepltrmJu0sAFg9AvA2mLaMMqQ==
- dependencies:
- "@oclif/command" "^1.5.20"
- "@oclif/config" "^1.15.1"
- "@oclif/errors" "^1.2.2"
- chalk "^4.1.0"
- indent-string "^4.0.0"
- lodash.template "^4.4.0"
- string-width "^4.2.0"
- strip-ansi "^6.0.0"
- widest-line "^3.1.0"
- wrap-ansi "^4.0.0"
-
-"@percy/config@^1.0.0-beta.36":
- version "1.0.0-beta.65"
- resolved "https://registry.yarnpkg.com/@percy/config/-/config-1.0.0-beta.65.tgz#8775d8d645c2b8a094850032d10810f654bb3f1e"
- integrity sha512-q6mkrBq+nmDtIDj793lNIodEYmc5wVE7ZwsQ2kNRQIAq4aiIIrD8L5CfhEOSYQ5OzhFq+qUjcZK5GptmheF0sw==
- dependencies:
- "@percy/logger" "1.0.0-beta.65"
- ajv "^8.6.2"
- cosmiconfig "^7.0.0"
- yaml "^1.10.0"
-
-"@percy/logger@1.0.0-beta.65", "@percy/logger@^1.0.0-beta.36":
- version "1.0.0-beta.65"
- resolved "https://registry.yarnpkg.com/@percy/logger/-/logger-1.0.0-beta.65.tgz#30a34797c935003334124e970f62914b0d124968"
- integrity sha512-BJV0pjNlvcj4Y3nuMUGdb5RhjMduK40fRJJ9Lh/2qNk3pmnkGb9rH+GY+/0WY7quupNKxQjjyXcIP7I46/azNg==
-
-"@percy/migrate@^0.10.0":
- version "0.10.0"
- resolved "https://registry.yarnpkg.com/@percy/migrate/-/migrate-0.10.0.tgz#4157bd8ca1638f1cc072086074c8edec57978abc"
- integrity sha512-3vOmOPmEeMlIZyCEDClZ2VER+4LH/Zp/YhvLkZeKH9RKxbktROF4Dnfs1u3m4YQ1gglerqK6VXFJfOjLJGyVuw==
- dependencies:
- "@oclif/command" "^1.8.0"
- "@oclif/config" "^1.17.0"
- "@oclif/plugin-help" "^3.2.0"
- "@percy/config" "^1.0.0-beta.36"
- "@percy/logger" "^1.0.0-beta.36"
- cross-spawn "^7.0.3"
- inquirer "^8.0.0"
- inquirer-glob-prompt "^0.1.0"
- jscodeshift "^0.11.0"
- semver "^7.3.4"
-
"@polka/url@^1.0.0-next.9":
version "1.0.0-next.12"
resolved "https://registry.yarnpkg.com/@polka/url/-/url-1.0.0-next.12.tgz#431ec342a7195622f86688bbda82e3166ce8cb28"
@@ -1346,15 +1189,15 @@
resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.9.2.tgz#adea7b6953cbb34651766b0548468e743c6a2353"
integrity sha512-VZMYa7+fXHdwIq1TDhSXoVmSPEGM/aa+6Aiq3nVVJ9bXr24zScr+NlKFKC3iPljA7ho/GAZr+d2jOf5GIRC30Q==
-"@rails/actioncable@6.1.3-2":
- version "6.1.3-2"
- resolved "https://registry.yarnpkg.com/@rails/actioncable/-/actioncable-6.1.3-2.tgz#de22e2d7474dcca051f7060829450412a17ecc04"
- integrity sha512-3mBLDwM85oj0Ot+wgC3c0wsfx5qvf8XJwSbkJk4ZqW4bA7ctn8BFW+cRQxrnQau+NDfmJvSECY8mmNIANcpULA==
+"@rails/actioncable@6.1.4-1":
+ version "6.1.4-1"
+ resolved "https://registry.yarnpkg.com/@rails/actioncable/-/actioncable-6.1.4-1.tgz#69982e7f352d732f71fda0cc01b7ba8269c9945b"
+ integrity sha512-b6sLoMop3gX22Wm2P5LPpKcZGwsf1ZoAGS+g1HrTrdlsZ/ENOKIBiSNnHOJajHwcYlF0TefBs7e7jIYZHVYihQ==
-"@rails/ujs@6.1.3-2":
- version "6.1.3-2"
- resolved "https://registry.yarnpkg.com/@rails/ujs/-/ujs-6.1.3-2.tgz#5d7e161e7061654e738a116a7ec8b58b51721a11"
- integrity sha512-Nd0Im4cW8tIX8ZR3jE/dS3wnJrN46RJSdCfU59Cji2puctIWohq63LjKFMufUwm21bCasISNGoLdkr3S7nwONw==
+"@rails/ujs@6.1.4-1":
+ version "6.1.4-1"
+ resolved "https://registry.yarnpkg.com/@rails/ujs/-/ujs-6.1.4-1.tgz#37507fe288a1c7c3a593602aa4dea42e5cb5797f"
+ integrity sha512-Fewm2wHk1n6Kf4E86dzzHDJOFg4EWcSHH3FsMEGs59bTdmf7099mjkOssOQtBqju4R39iaAOQNui7r8P+Q5Dgg==
"@sentry/browser@5.30.0":
version "5.30.0"
@@ -1467,10 +1310,10 @@
dom-accessibility-api "^0.5.1"
pretty-format "^26.4.2"
-"@tiptap/core@^2.0.0-beta.105":
- version "2.0.0-beta.105"
- resolved "https://registry.yarnpkg.com/@tiptap/core/-/core-2.0.0-beta.105.tgz#3d758cbbf3e8c9b806d1017cd2e7444f192d8109"
- integrity sha512-ut0ts9hrJXUJlSXZIN8iEt2TPbqYLFBanucUAr0ENLjIlpyyNVXz9IhS3bBEmo7vWExirZmY8O9oidQztesf2A==
+"@tiptap/core@^2.0.0-beta.118":
+ version "2.0.0-beta.118"
+ resolved "https://registry.yarnpkg.com/@tiptap/core/-/core-2.0.0-beta.118.tgz#17e990da525a81d957494171c0c33d17e2039823"
+ integrity sha512-TApketXliv2PZSTf5WP8j/svwzeK795fOf4Ff6A0gDwcVYFPHlny4ZlpawYthyqDoe1fEusyZokVgiDHnb+EzA==
dependencies:
"@types/prosemirror-commands" "^1.0.4"
"@types/prosemirror-inputrules" "^1.0.4"
@@ -1479,15 +1322,15 @@
"@types/prosemirror-schema-list" "^1.0.3"
"@types/prosemirror-state" "^1.2.7"
"@types/prosemirror-transform" "^1.1.4"
- "@types/prosemirror-view" "^1.19.0"
+ "@types/prosemirror-view" "^1.19.1"
prosemirror-commands "^1.1.10"
prosemirror-inputrules "^1.1.3"
prosemirror-keymap "^1.1.3"
prosemirror-model "^1.14.3"
- prosemirror-schema-list "^1.1.5"
+ prosemirror-schema-list "^1.1.6"
prosemirror-state "^1.3.4"
- prosemirror-transform "^1.3.2"
- prosemirror-view "^1.20.0"
+ prosemirror-transform "^1.3.3"
+ prosemirror-view "^1.20.1"
"@tiptap/extension-blockquote@^2.0.0-beta.15":
version "2.0.0-beta.15"
@@ -1501,13 +1344,13 @@
resolved "https://registry.yarnpkg.com/@tiptap/extension-bold/-/extension-bold-2.0.0-beta.15.tgz#cf9ddb3fc316be9707753ad4e497bfb8a3ebb0c2"
integrity sha512-jKyV6iiwhxwa0+7uuKD74jNDVNLNOS1GmU14MgaA95pY5e1fyaRBPPX8Gtt89niz2CLOY711AV17RPZTe/e60w==
-"@tiptap/extension-bubble-menu@^2.0.0-beta.33":
- version "2.0.0-beta.33"
- resolved "https://registry.yarnpkg.com/@tiptap/extension-bubble-menu/-/extension-bubble-menu-2.0.0-beta.33.tgz#50ee84c25118f7ee932385961211b64496355c74"
- integrity sha512-EvXSXyeLFnOAEPvbVz9B4ppP+paDGyK/Fy9b36fkH0hacFLS/lKb/8HrfTXItc0uZIe6xY6RhXTdkx1eAPTdTA==
+"@tiptap/extension-bubble-menu@^2.0.0-beta.39":
+ version "2.0.0-beta.39"
+ resolved "https://registry.yarnpkg.com/@tiptap/extension-bubble-menu/-/extension-bubble-menu-2.0.0-beta.39.tgz#8971feeac93e685fc38564173a83ad078b4e7f2a"
+ integrity sha512-hmA+ePR+MnRaTJ5MxoZ3yqOcK54cW2KQllZx16ZwSyM+yU9bXVhfMmyZwqRD7GGQFkrfnPm5QnedXDBYJD19OQ==
dependencies:
prosemirror-state "^1.3.4"
- prosemirror-view "^1.20.0"
+ prosemirror-view "^1.20.1"
tippy.js "^6.3.1"
"@tiptap/extension-bullet-list@^2.0.0-beta.15":
@@ -1517,17 +1360,17 @@
dependencies:
prosemirror-inputrules "^1.1.3"
-"@tiptap/extension-code-block-lowlight@2.0.0-beta.37":
- version "2.0.0-beta.37"
- resolved "https://registry.yarnpkg.com/@tiptap/extension-code-block-lowlight/-/extension-code-block-lowlight-2.0.0-beta.37.tgz#672b2f21d49077285a507c2e204b07085df93906"
- integrity sha512-EN8MoCZKB23nHNqgvB/wOS84ySUY9ahB6oao7wDpKAYqBkAF/hEXmDsylDySvyCKXf824lS/vztfaF0hHQbQ/g==
+"@tiptap/extension-code-block-lowlight@2.0.0-beta.41":
+ version "2.0.0-beta.41"
+ resolved "https://registry.yarnpkg.com/@tiptap/extension-code-block-lowlight/-/extension-code-block-lowlight-2.0.0-beta.41.tgz#3ec98f509bbd5df689de6282f2a3881229262ed7"
+ integrity sha512-2+D/SwcRjWThJ8uFWJT/6B7R+gTUlp4h13/EZqrFMm3YCSOx+bzgTVndog6UJkWyAoNDxkTVwcOyYI4HWdvCiQ==
dependencies:
"@tiptap/extension-code-block" "^2.0.0-beta.18"
"@types/lowlight" "^0.0.3"
lowlight "^1.20.0"
prosemirror-model "^1.14.3"
prosemirror-state "^1.3.4"
- prosemirror-view "^1.20.0"
+ prosemirror-view "^1.20.1"
"@tiptap/extension-code-block@^2.0.0-beta.18":
version "2.0.0-beta.18"
@@ -1554,27 +1397,27 @@
"@types/prosemirror-dropcursor" "^1.0.3"
prosemirror-dropcursor "^1.3.5"
-"@tiptap/extension-floating-menu@^2.0.0-beta.27":
- version "2.0.0-beta.27"
- resolved "https://registry.yarnpkg.com/@tiptap/extension-floating-menu/-/extension-floating-menu-2.0.0-beta.27.tgz#692686854116823be624028fd8d73aa900cf71a9"
- integrity sha512-PgoqO5OxBDMFZroXFD7mpwfDLxeG44xFHu6WK4Gf3O8jqGAQpEr4rMKyTnoNL9PYFhEwtNBzxUopumOT0Po/zQ==
+"@tiptap/extension-floating-menu@^2.0.0-beta.33":
+ version "2.0.0-beta.33"
+ resolved "https://registry.yarnpkg.com/@tiptap/extension-floating-menu/-/extension-floating-menu-2.0.0-beta.33.tgz#11068488f10fce697df2a48f79039e9c1d10eb7b"
+ integrity sha512-8s8DPnHIzXg7E7S/DjuS1AAFZKVYXY0KBKaEd1f2V45YOkKwN9El46Ugk/4Ir3yrrllvnisbP9ol+BAQmI0bMg==
dependencies:
prosemirror-state "^1.3.4"
- prosemirror-view "^1.20.0"
+ prosemirror-view "^1.20.1"
tippy.js "^6.3.1"
-"@tiptap/extension-gapcursor@^2.0.0-beta.19":
- version "2.0.0-beta.19"
- resolved "https://registry.yarnpkg.com/@tiptap/extension-gapcursor/-/extension-gapcursor-2.0.0-beta.19.tgz#6d826c240496b1a77808999d51b8917adb372cc5"
- integrity sha512-GZYMR+Z45bn87CMuOHyxzTJOFoCv58mNakIBdSGX+8A+ExBFeZr/qLqxDxN3wz+LRqy7pREe5K3UxJxpsYnCzA==
+"@tiptap/extension-gapcursor@^2.0.0-beta.24":
+ version "2.0.0-beta.24"
+ resolved "https://registry.yarnpkg.com/@tiptap/extension-gapcursor/-/extension-gapcursor-2.0.0-beta.24.tgz#dc42a3610cea611755c6521e14a6995555e0ad49"
+ integrity sha512-/6Ru0wNLIb3fo30Ar3z/rcakoUA2EIJL9sBFiuyHWTAIujeEaBzA6oG5L4PpP+daKd31JF0I6LjeWMSU9CBSFw==
dependencies:
"@types/prosemirror-gapcursor" "^1.0.4"
- prosemirror-gapcursor "^1.1.5"
+ prosemirror-gapcursor "^1.2.0"
-"@tiptap/extension-hard-break@^2.0.0-beta.16":
- version "2.0.0-beta.16"
- resolved "https://registry.yarnpkg.com/@tiptap/extension-hard-break/-/extension-hard-break-2.0.0-beta.16.tgz#1a55e901ce2deaaeaf53d77d254371955fe8fd99"
- integrity sha512-vRw8OIJlvlr17Y7mtJGL/dWbotX9fjgmA/zYqL//UIXQjp1FWW5JMh5E1Z5+jlJpGWjsWGH8fHpGSM2JCZVPRw==
+"@tiptap/extension-hard-break@^2.0.0-beta.21":
+ version "2.0.0-beta.21"
+ resolved "https://registry.yarnpkg.com/@tiptap/extension-hard-break/-/extension-hard-break-2.0.0-beta.21.tgz#3b9108c7703f23ae186c1038033f0b1354f721bf"
+ integrity sha512-Ukl+wjfLhE0tW7lWRpSPPo2tajjGnEaSc/Irey1JineFf+x/azA9rREzQy0r2AhORTalH7lj/KDmSdG8IT6syA==
"@tiptap/extension-heading@^2.0.0-beta.15":
version "2.0.0-beta.15"
@@ -1591,10 +1434,10 @@
"@types/prosemirror-history" "^1.0.3"
prosemirror-history "^1.2.0"
-"@tiptap/extension-horizontal-rule@^2.0.0-beta.19":
- version "2.0.0-beta.19"
- resolved "https://registry.yarnpkg.com/@tiptap/extension-horizontal-rule/-/extension-horizontal-rule-2.0.0-beta.19.tgz#d98d0070a2cead32a497b62586c0e259d31f3f2e"
- integrity sha512-RrU7+inExgC+rRmFWoTxALbu/IgRGRik11LPhMhqrCB+n0XFRUMyVEb/jbfgHWVrPmTXq0MbSWW6LYw3iREzRA==
+"@tiptap/extension-horizontal-rule@^2.0.0-beta.21":
+ version "2.0.0-beta.21"
+ resolved "https://registry.yarnpkg.com/@tiptap/extension-horizontal-rule/-/extension-horizontal-rule-2.0.0-beta.21.tgz#1c73a8547611f53935117ed0079542d958ba37fa"
+ integrity sha512-fgvRGuNEGWAitbcoz6VZSR9gcVIHksTy2QpXPnQC+N9Mi7havaxreYdMZn+oePW/5kdZoZNRx+jsf5DjKomvoQ==
dependencies:
prosemirror-state "^1.3.4"
@@ -1662,13 +1505,13 @@
resolved "https://registry.yarnpkg.com/@tiptap/extension-table-row/-/extension-table-row-2.0.0-beta.14.tgz#9ec98c73e309ee966b71ccd140019874d179e0c8"
integrity sha512-mewdlTqgBCyzeZIZ6F08gfuzwsiYjQ7BvABo2UhDfr0+EN2UvfJj0bT3tGgeZhMxT5Js2DXL+c+ZOVJxWJ9faQ==
-"@tiptap/extension-table@^2.0.0-beta.30":
- version "2.0.0-beta.30"
- resolved "https://registry.yarnpkg.com/@tiptap/extension-table/-/extension-table-2.0.0-beta.30.tgz#f6ff97ea71b17ecf3371ddf80374df9f49042334"
- integrity sha512-s6+HRo3sFv7SUprsUAAF27hg7inITpzl78If3XdrpscuzTVuRmd7GsFnY+aZGPVikekwCMjp/0klE92P4A7w0w==
+"@tiptap/extension-table@^2.0.0-beta.31":
+ version "2.0.0-beta.31"
+ resolved "https://registry.yarnpkg.com/@tiptap/extension-table/-/extension-table-2.0.0-beta.31.tgz#96987fe14017be2fd3e4dbd2ce349eec641724de"
+ integrity sha512-yMqnbxaq2DjaZ6EOE9FLSQSO+qHH7oE0rA+ahQkJdy9KycSboKthXBY7P9JeXxariTyD2B/My9x41cuDLWes9w==
dependencies:
prosemirror-tables "^1.1.1"
- prosemirror-view "^1.20.0"
+ prosemirror-view "^1.20.1"
"@tiptap/extension-task-item@^2.0.0-beta.18":
version "2.0.0-beta.18"
@@ -1687,14 +1530,14 @@
resolved "https://registry.yarnpkg.com/@tiptap/extension-text/-/extension-text-2.0.0-beta.13.tgz#da0af8d9a3f149d20076e15d88c6af21fb6d940f"
integrity sha512-0EtAwuRldCAoFaL/iXgkRepEeOd55rPg5N4FQUN1xTwZT7PDofukP0DG/2jff/Uj17x4uTaJAa9qlFWuNnDvjw==
-"@tiptap/vue-2@^2.0.0-beta.50":
- version "2.0.0-beta.50"
- resolved "https://registry.yarnpkg.com/@tiptap/vue-2/-/vue-2-2.0.0-beta.50.tgz#1c1c3e7d696aaa167fc776e11b393b182f1bfbb4"
- integrity sha512-o325eQbSoxxd6QXc27Mjd+T+yj1CnSTo0IQkbjbzYure8E0ReYXzW2wx5oE6DZA43Ejss2KPXZDEgiUNYRyX1Q==
+"@tiptap/vue-2@^2.0.0-beta.57":
+ version "2.0.0-beta.57"
+ resolved "https://registry.yarnpkg.com/@tiptap/vue-2/-/vue-2-2.0.0-beta.57.tgz#242f7aa47d3c99fdef0e66a05a193b6fef1a95a6"
+ integrity sha512-f8COWq84wOJeLwAmaYsHCqKVbGgMloW+1r4Rz/KhlFb1MNXYeDHibCiW/VtJe7bdae+iRyIwnfmnAp2u5s77hQ==
dependencies:
- "@tiptap/extension-bubble-menu" "^2.0.0-beta.33"
- "@tiptap/extension-floating-menu" "^2.0.0-beta.27"
- prosemirror-view "^1.20.0"
+ "@tiptap/extension-bubble-menu" "^2.0.0-beta.39"
+ "@tiptap/extension-floating-menu" "^2.0.0-beta.33"
+ prosemirror-view "^1.20.1"
"@toast-ui/editor@^2.5.2":
version "2.5.2"
@@ -1756,11 +1599,6 @@
dependencies:
"@types/tern" "*"
-"@types/color-name@^1.1.1":
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0"
- integrity sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==
-
"@types/estree@*":
version "0.0.44"
resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.44.tgz#980cc5a29a3ef3bea6ff1f7d021047d7ea575e21"
@@ -1950,10 +1788,10 @@
dependencies:
"@types/prosemirror-model" "*"
-"@types/prosemirror-view@*", "@types/prosemirror-view@^1.19.0":
- version "1.19.0"
- resolved "https://registry.yarnpkg.com/@types/prosemirror-view/-/prosemirror-view-1.19.0.tgz#35320b6875ae7c750bce799cccf735e5da91af7a"
- integrity sha512-Y8OX9L+Yni0HgXAN9wcNSf61IId13uqpURnRC5WkmCOlVDsr35vfGjj+tcaQL4dZzblsu3bRkXI/c0oGXp+xgw==
+"@types/prosemirror-view@*", "@types/prosemirror-view@^1.19.1":
+ version "1.19.1"
+ resolved "https://registry.yarnpkg.com/@types/prosemirror-view/-/prosemirror-view-1.19.1.tgz#f12309ef07dfb701d20c2e4d0292d42ba34a081b"
+ integrity sha512-fyQ4NVxAdfISWrE2qT8cpZdosXoH/1JuVYMBs9CdaXPbvi/8R2L2tkkcMRM314piKrO8nfYH5OBZKzP2Ax3jtA==
dependencies:
"@types/prosemirror-model" "*"
"@types/prosemirror-state" "*"
@@ -2306,7 +2144,7 @@ ajv@^6.1.0, ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.3, ajv@^6.12.4, ajv@^6.12.5:
json-schema-traverse "^0.4.1"
uri-js "^4.2.2"
-ajv@^8.0.1, ajv@^8.6.2:
+ajv@^8.0.1:
version "8.6.2"
resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.6.2.tgz#2fb45e0e5fcbc0813326c1c3da535d1881bb0571"
integrity sha512-9807RlWAgT564wT+DjeyU5OFMPjmzxVobvDFmNAhY+5zD6A2ly3jDp6sgnfyDtlIQ+7H97oc/DGCzzfu9rjw9w==
@@ -2334,11 +2172,11 @@ ansi-colors@^4.1.1:
integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==
ansi-escapes@^4.2.1:
- version "4.3.0"
- resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.0.tgz#a4ce2b33d6b214b7950d8595c212f12ac9cc569d"
- integrity sha512-EiYhwo0v255HUL6eDyuLrXEkTi7WwVCLAw+SeOQ7M7qdun1z1pum4DEm/nuqIVbPvi9RPPc9k9LbyBv6H0DwVg==
+ version "4.3.2"
+ resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e"
+ integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==
dependencies:
- type-fest "^0.8.1"
+ type-fest "^0.21.3"
ansi-html@0.0.7:
version "0.0.7"
@@ -2350,20 +2188,15 @@ ansi-regex@^2.0.0:
resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df"
integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8=
-ansi-regex@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998"
- integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=
-
ansi-regex@^4.1.0:
version "4.1.0"
resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997"
integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==
-ansi-regex@^5.0.0:
- version "5.0.0"
- resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75"
- integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==
+ansi-regex@^5.0.0, ansi-regex@^5.0.1:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304"
+ integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==
ansi-styles@^3.2.0, ansi-styles@^3.2.1:
version "3.2.1"
@@ -2373,11 +2206,10 @@ ansi-styles@^3.2.0, ansi-styles@^3.2.1:
color-convert "^1.9.0"
ansi-styles@^4.0.0, ansi-styles@^4.1.0:
- version "4.2.1"
- resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.2.1.tgz#90ae75c424d008d2624c5bf29ead3177ebfcf359"
- integrity sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==
+ version "4.3.0"
+ resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937"
+ integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==
dependencies:
- "@types/color-name" "^1.1.1"
color-convert "^2.0.1"
anymatch@^2.0.0:
@@ -2447,6 +2279,15 @@ apollo-link-batch@^1.1.15:
apollo-link "^1.2.14"
tslib "^1.9.3"
+apollo-link-error@^1.1.13:
+ version "1.1.13"
+ resolved "https://registry.yarnpkg.com/apollo-link-error/-/apollo-link-error-1.1.13.tgz#c1a1bb876ffe380802c8df0506a32c33aad284cd"
+ integrity sha512-jAZOOahJU6bwSqb2ZyskEK1XdgUY9nkmeclCrW7Gddh1uasHVqmoYc4CKdb0/H0Y1J9lvaXKle2Wsw/Zx1AyUg==
+ dependencies:
+ apollo-link "^1.2.14"
+ apollo-link-http-common "^0.2.16"
+ tslib "^1.9.3"
+
apollo-link-http-common@^0.2.14, apollo-link-http-common@^0.2.16:
version "0.2.16"
resolved "https://registry.yarnpkg.com/apollo-link-http-common/-/apollo-link-http-common-0.2.16.tgz#756749dafc732792c8ca0923f9a40564b7c59ecc"
@@ -2630,13 +2471,6 @@ assign-symbols@^1.0.0:
resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367"
integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=
-ast-types@0.14.2:
- version "0.14.2"
- resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.14.2.tgz#600b882df8583e3cd4f2df5fa20fa83759d4bdfd"
- integrity sha512-O0yuUDnZeQDL+ncNGlJ78BiO4jnYI3bvMsD5prT0/nsgijG/LpNBIr63gTjVTNsiGkgQhiyCShTgxt8oXOrklA==
- dependencies:
- tslib "^2.0.1"
-
astral-regex@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31"
@@ -2721,11 +2555,6 @@ axios@^0.20.0:
dependencies:
follow-redirects "^1.10.0"
-babel-core@^7.0.0-bridge.0:
- version "7.0.0-bridge.0"
- resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-7.0.0-bridge.0.tgz#95a492ddd90f9b4e9a4a1da14eb335b87b634ece"
- integrity sha512-poPX9mZH/5CSanm50Q+1toVci6pv5KSRv/5TWCwtzQS5XEwn40BcCrgIeMFWP9CKKIniKXNxoIOnOq4VVlGXhg==
-
babel-eslint@^10.0.3:
version "10.0.3"
resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-10.0.3.tgz#81a2c669be0f205e19462fed2482d33e4687a88a"
@@ -2837,11 +2666,11 @@ bail@^1.0.0:
integrity sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ==
balanced-match@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767"
- integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c=
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee"
+ integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==
-base64-js@^1.0.2, base64-js@^1.3.1:
+base64-js@^1.0.2:
version "1.5.1"
resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a"
integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==
@@ -2886,15 +2715,6 @@ binaryextensions@2:
resolved "https://registry.yarnpkg.com/binaryextensions/-/binaryextensions-2.1.1.tgz#3209a51ca4a4ad541a3b8d3d6a6d5b83a2485935"
integrity sha512-XBaoWE9RW8pPdPQNibZsW2zh8TW6gcarXp1FZPwT8Uop8ScSNldJEWf2k9l3HeTqdrEwsOsFcq74RiJECW34yA==
-bl@^4.1.0:
- version "4.1.0"
- resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a"
- integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==
- dependencies:
- buffer "^5.5.0"
- inherits "^2.0.4"
- readable-stream "^3.4.0"
-
bluebird@^3.1.1, bluebird@^3.5.5, bluebird@~3.5.0:
version "3.5.5"
resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.5.tgz#a8d0afd73251effbbd5fe384a77d73003c17a71f"
@@ -2938,10 +2758,10 @@ boolbase@^1.0.0:
resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e"
integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24=
-bootstrap-vue@2.18.1:
- version "2.18.1"
- resolved "https://registry.yarnpkg.com/bootstrap-vue/-/bootstrap-vue-2.18.1.tgz#4378d26b713d4255b45b42b3f852f6fa0a11d400"
- integrity sha512-oYKAhEnNuCxtF4gxsdLzijhQpFk7UYPvzhwZvUbnPbZ1eWu2dsc3+fRkY9PMowt5OJRtuVb7ov3lpsI2fraYsA==
+bootstrap-vue@2.20.1:
+ version "2.20.1"
+ resolved "https://registry.yarnpkg.com/bootstrap-vue/-/bootstrap-vue-2.20.1.tgz#1b6cd4368632c1a6dd4a5ed161242baa131c3cd5"
+ integrity sha512-s+w83q0T2mo/RbFwTM8gExbLJMEOYpdTUqmyFaHv2Ir+TFprMvTWpeAzeNuawJ130W1gePZ3LW3cNp1t/tZbOw==
dependencies:
"@nuxt/opencollective" "^0.3.2"
bootstrap ">=4.5.3 <5.0.0"
@@ -3068,15 +2888,15 @@ browserify-zlib@^0.2.0:
pako "~1.0.5"
browserslist@^4.12.0, browserslist@^4.16.6:
- version "4.16.6"
- resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.16.6.tgz#d7901277a5a88e554ed305b183ec9b0c08f66fa2"
- integrity sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ==
+ version "4.17.1"
+ resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.17.1.tgz#a98d104f54af441290b7d592626dd541fa642eb9"
+ integrity sha512-aLD0ZMDSnF4lUt4ZDNgqi5BUn9BZ7YdQdI/cYlILrhdSSZJLU9aNZoD5/NBmM4SK34APB2e83MOsRt1EnkuyaQ==
dependencies:
- caniuse-lite "^1.0.30001219"
- colorette "^1.2.2"
- electron-to-chromium "^1.3.723"
+ caniuse-lite "^1.0.30001259"
+ electron-to-chromium "^1.3.846"
escalade "^3.1.1"
- node-releases "^1.1.71"
+ nanocolors "^0.1.5"
+ node-releases "^1.1.76"
bser@2.1.1:
version "2.1.1"
@@ -3086,9 +2906,9 @@ bser@2.1.1:
node-int64 "^0.4.0"
buffer-from@^1.0.0:
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef"
- integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5"
+ integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==
buffer-indexof@^1.0.0:
version "1.1.0"
@@ -3114,14 +2934,6 @@ buffer@4.9.1, buffer@^4.3.0:
ieee754 "^1.1.4"
isarray "^1.0.0"
-buffer@^5.5.0:
- version "5.7.1"
- resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0"
- integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==
- dependencies:
- base64-js "^1.3.1"
- ieee754 "^1.1.13"
-
builtin-status-codes@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8"
@@ -3235,9 +3047,9 @@ call-me-maybe@^1.0.1:
integrity sha1-JtII6onje1y95gJQoV8DHBak1ms=
callsites@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.0.0.tgz#fb7eb569b72ad7a45812f93fd9430a3e410b3dd3"
- integrity sha512-tWnkwu9YEq2uzlBDI4RcLn8jrFvF9AOi8PxDNU3hZZjJcjkcRAq3vCI+vZcg1SuxISDYe86k9VZFwAxDiJGoAw==
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73"
+ integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==
camelcase-keys@^6.2.2:
version "6.2.2"
@@ -3258,10 +3070,10 @@ camelcase@^6.0.0:
resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.0.0.tgz#5259f7c30e35e278f1bdc2a4d91230b37cad981e"
integrity sha512-8KMDF1Vz2gzOq54ONPJS65IvTUaB1cHJ2DMM7MbPmLZljDH1qpzzLsWdiN9pHh6qvkRVDTi/07+eNGch/oLU4w==
-caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001219:
- version "1.0.30001241"
- resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001241.tgz#cd3fae47eb3d7691692b406568d7a3e5b23c7598"
- integrity sha512-1uoSZ1Pq1VpH0WerIMqwptXHNNGfdl7d1cJUFs80CwQ/lVzdhTvsFZCeNFslze7AjsQnb4C85tzclPa1VShbeQ==
+caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001259:
+ version "1.0.30001261"
+ resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001261.tgz#96d89813c076ea061209a4e040d8dcf0c66a1d01"
+ integrity sha512-vM8D9Uvp7bHIN0fZ2KQ4wnmYFpJo/Etb4Vwsuc+ka0tfGDHvOPrFm6S/7CCNLSOkAUjenT2HnUPESdOIL91FaA==
capture-exit@^2.0.0:
version "2.0.0"
@@ -3299,7 +3111,7 @@ chalk@^3.0.0:
ansi-styles "^4.1.0"
supports-color "^7.1.0"
-chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.1:
+chalk@^4.0.0, chalk@^4.1.0:
version "4.1.2"
resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01"
integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==
@@ -3327,11 +3139,6 @@ character-reference-invalid@^1.0.0:
resolved "https://registry.yarnpkg.com/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz#083329cda0eae272ab3dbbf37e9a382c13af1560"
integrity sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==
-chardet@^0.7.0:
- version "0.7.0"
- resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e"
- integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==
-
charenc@~0.0.1:
version "0.0.2"
resolved "https://registry.yarnpkg.com/charenc/-/charenc-0.0.2.tgz#c0a1d2f3a7092e03774bfa83f14c0fc5790a8667"
@@ -3421,35 +3228,11 @@ clean-stack@^2.0.0:
resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b"
integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==
-clean-stack@^3.0.0:
- version "3.0.1"
- resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-3.0.1.tgz#155bf0b2221bf5f4fba89528d24c5953f17fe3a8"
- integrity sha512-lR9wNiMRcVQjSB3a7xXGLuz4cr4wJuuXlaAEbRutGowQTmlp7R72/DOgN21e8jdwblMWl9UOJMJXarX94pzKdg==
- dependencies:
- escape-string-regexp "4.0.0"
-
cli-boxes@^2.2.0:
version "2.2.0"
resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-2.2.0.tgz#538ecae8f9c6ca508e3c3c95b453fe93cb4c168d"
integrity sha512-gpaBrMAizVEANOpfZp/EEUixTXDyGt7DFzdK5hU+UbWt/J0lB0w20ncZj59Z9a93xHb9u12zF5BS6i9RKbtg4w==
-cli-cursor@^3.1.0:
- version "3.1.0"
- resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307"
- integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==
- dependencies:
- restore-cursor "^3.1.0"
-
-cli-spinners@^2.5.0:
- version "2.6.0"
- resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.6.0.tgz#36c7dc98fb6a9a76bd6238ec3f77e2425627e939"
- integrity sha512-t+4/y50K/+4xcCRosKkA7W4gTr1MySvLV0q+PxmG7FJ5g+66ChKurYjxBCjHggHH3HA5Hh9cy+lcUGWDqVH+4Q==
-
-cli-width@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-3.0.0.tgz#a2f48437a2caa9a22436e794bf071ec9e61cedf6"
- integrity sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==
-
clipboard@^1.7.1:
version "1.7.1"
resolved "https://registry.yarnpkg.com/clipboard/-/clipboard-1.7.1.tgz#360d6d6946e99a7a1fef395e42ba92b5e9b5a16b"
@@ -3486,15 +3269,6 @@ cliui@^6.0.0:
strip-ansi "^6.0.0"
wrap-ansi "^6.2.0"
-clone-deep@^4.0.1:
- version "4.0.1"
- resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387"
- integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==
- dependencies:
- is-plain-object "^2.0.4"
- kind-of "^6.0.2"
- shallow-clone "^3.0.0"
-
clone-regexp@^2.1.0:
version "2.2.0"
resolved "https://registry.yarnpkg.com/clone-regexp/-/clone-regexp-2.2.0.tgz#7d65e00885cd8796405c35a737e7a86b7429e36f"
@@ -3509,11 +3283,6 @@ clone-response@^1.0.2:
dependencies:
mimic-response "^1.0.0"
-clone@^1.0.2:
- version "1.0.4"
- resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e"
- integrity sha1-2jCcwmPfFZlMaIypAheco8fNfH4=
-
co@^4.6.0:
version "4.6.0"
resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184"
@@ -3586,14 +3355,9 @@ color-name@~1.1.4:
integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
colorette@^1.2.1, colorette@^1.2.2:
- version "1.2.2"
- resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.2.2.tgz#cbcc79d5e99caea2dbf10eb3a26fd8b3e6acfa94"
- integrity sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==
-
-colors@^1.1.2:
version "1.4.0"
- resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78"
- integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==
+ resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.4.0.tgz#5190fbb87276259a86ad700bff2c6d6faa3fca40"
+ integrity sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==
combined-stream@^1.0.6, combined-stream@~1.0.6:
version "1.0.8"
@@ -3607,6 +3371,11 @@ commander@2, commander@^2.19.0, commander@^2.20.0, commander@^2.20.3:
resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33"
integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==
+commander@7:
+ version "7.2.0"
+ resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7"
+ integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==
+
commander@^6.0.0, commander@^6.1.0, commander@^6.2.0, commander@~6.2.1:
version "6.2.1"
resolved "https://registry.yarnpkg.com/commander/-/commander-6.2.1.tgz#0792eb682dfbc325999bb2b84fddddba110ac73c"
@@ -3618,9 +3387,9 @@ commondir@^1.0.1:
integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=
component-emitter@^1.2.1:
- version "1.2.1"
- resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6"
- integrity sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0"
+ integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==
compressible@~2.0.16:
version "2.0.17"
@@ -3749,9 +3518,9 @@ content-type@~1.0.4:
integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==
convert-source-map@^1.4.0, convert-source-map@^1.6.0, convert-source-map@^1.7.0:
- version "1.7.0"
- resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442"
- integrity sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==
+ version "1.8.0"
+ resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.8.0.tgz#f3373c32d21b4d780dd8004514684fb791ca4369"
+ integrity sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==
dependencies:
safe-buffer "~5.1.1"
@@ -3819,10 +3588,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.17.3:
- version "3.17.3"
- resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.17.3.tgz#8e8bd20e91df9951e903cabe91f9af4a0895bc1e"
- integrity sha512-lyvajs+wd8N1hXfzob1LdOCCHFU4bGMbqqmLn1Q4QlCpDqWPpGf+p0nj+LNrvDDG33j0hZXw2nsvvVpHysxyNw==
+core-js@^3.18.2:
+ version "3.18.2"
+ resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.18.2.tgz#63a551e8a29f305cd4123754846e65896619ba5b"
+ integrity sha512-zNhPOUoSgoizoSQFdX1MeZO16ORRb9FFQLts8gSYbZU5FcgXhp24iMWMxnOQo5uIaIG7/6FA/IqJPwev1o9ZXQ==
core-js@~2.3.0:
version "2.3.0"
@@ -3835,9 +3604,9 @@ core-util-is@1.0.2, core-util-is@~1.0.0:
integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=
cosmiconfig@^7.0.0:
- version "7.0.0"
- resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.0.0.tgz#ef9b44d773959cae63ddecd122de23853b60f8d3"
- integrity sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA==
+ version "7.0.1"
+ resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.0.1.tgz#714d756522cace867867ccb4474c5d01bbae5d6d"
+ integrity sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==
dependencies:
"@types/parse-json" "^4.0.0"
import-fresh "^3.2.1"
@@ -3898,7 +3667,7 @@ cross-spawn@^6.0.0, cross-spawn@^6.0.5:
shebang-command "^1.2.0"
which "^1.2.9"
-cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3:
+cross-spawn@^7.0.0, cross-spawn@^7.0.2:
version "7.0.3"
resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6"
integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==
@@ -4039,19 +3808,31 @@ cyclist@~0.2.2:
integrity sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA=
d3-array@1, "d3-array@1 - 2", d3-array@^1.1.1, d3-array@^1.2.0:
- version "1.2.1"
- resolved "https://registry.yarnpkg.com/d3-array/-/d3-array-1.2.1.tgz#d1ca33de2f6ac31efadb8e050a021d7e2396d5dc"
- integrity sha512-CyINJQ0SOUHojDdFDH4JEM0552vCR1utGyLHegJHyYH0JyCpSeTPxi4OBqHMA2jJZq4NH782LtaJWBImqI/HBw==
+ version "1.2.4"
+ resolved "https://registry.yarnpkg.com/d3-array/-/d3-array-1.2.4.tgz#635ce4d5eea759f6f605863dbcfc30edc737f71f"
+ integrity sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw==
+
+"d3-array@2 - 3", "d3-array@2.10.0 - 3", "d3-array@2.5.0 - 3", d3-array@3:
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/d3-array/-/d3-array-3.0.4.tgz#60550bcc9818be9ace88d269ccd97038fc399b55"
+ integrity sha512-ShFl90cxNqDaSynDF/Bik/kTzISqePqU3qo2fv6kSJEvF7y7tDCDpcU6WiT01rPO6zngZnrvJ/0j4q6Qg+5EQg==
+ dependencies:
+ internmap "1 - 2"
d3-axis@1:
- version "1.0.8"
- resolved "https://registry.yarnpkg.com/d3-axis/-/d3-axis-1.0.8.tgz#31a705a0b535e65759de14173a31933137f18efa"
- integrity sha1-MacFoLU15ldZ3hQXOjGTMTfxjvo=
+ version "1.0.12"
+ resolved "https://registry.yarnpkg.com/d3-axis/-/d3-axis-1.0.12.tgz#cdf20ba210cfbb43795af33756886fb3638daac9"
+ integrity sha512-ejINPfPSNdGFKEOAtnBtdkpr24c4d4jsei6Lg98mxf424ivoDP2956/5HDpIAtmHo85lqT4pruy+zEgvRUBqaQ==
+
+d3-axis@3:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/d3-axis/-/d3-axis-3.0.0.tgz#c42a4a13e8131d637b745fc2973824cfeaf93322"
+ integrity sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==
d3-brush@1:
- version "1.0.4"
- resolved "https://registry.yarnpkg.com/d3-brush/-/d3-brush-1.0.4.tgz#00c2f238019f24f6c0a194a26d41a1530ffe7bc4"
- integrity sha1-AMLyOAGfJPbAoZSibUGhUw/+e8Q=
+ version "1.1.6"
+ resolved "https://registry.yarnpkg.com/d3-brush/-/d3-brush-1.1.6.tgz#b0a22c7372cabec128bdddf9bddc058592f89e9b"
+ integrity sha512-7RW+w7HfMCPyZLifTz/UnJmI5kdkXtpCbombUSs8xniAyo0vIbrDzDwUJB6eJOgl9u5DQOt2TQlYumxzD1SvYA==
dependencies:
d3-dispatch "1"
d3-drag "1"
@@ -4059,23 +3840,46 @@ d3-brush@1:
d3-selection "1"
d3-transition "1"
+d3-brush@3:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/d3-brush/-/d3-brush-3.0.0.tgz#6f767c4ed8dcb79de7ede3e1c0f89e63ef64d31c"
+ integrity sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==
+ dependencies:
+ d3-dispatch "1 - 3"
+ d3-drag "2 - 3"
+ d3-interpolate "1 - 3"
+ d3-selection "3"
+ d3-transition "3"
+
d3-chord@1:
- version "1.0.4"
- resolved "https://registry.yarnpkg.com/d3-chord/-/d3-chord-1.0.4.tgz#7dec4f0ba886f713fe111c45f763414f6f74ca2c"
- integrity sha1-fexPC6iG9xP+ERxF92NBT290yiw=
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/d3-chord/-/d3-chord-1.0.6.tgz#309157e3f2db2c752f0280fedd35f2067ccbb15f"
+ integrity sha512-JXA2Dro1Fxw9rJe33Uv+Ckr5IrAa74TlfDEhE/jfLOaXegMQFQTAgAw9WnZL8+HxVBRXaRGCkrNU7pJeylRIuA==
dependencies:
d3-array "1"
d3-path "1"
+d3-chord@3:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/d3-chord/-/d3-chord-3.0.1.tgz#d156d61f485fce8327e6abf339cb41d8cbba6966"
+ integrity sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==
+ dependencies:
+ d3-path "1 - 3"
+
d3-collection@1:
- version "1.0.4"
- resolved "https://registry.yarnpkg.com/d3-collection/-/d3-collection-1.0.4.tgz#342dfd12837c90974f33f1cc0a785aea570dcdc2"
- integrity sha1-NC39EoN8kJdPM/HMCnha6lcNzcI=
+ version "1.0.7"
+ resolved "https://registry.yarnpkg.com/d3-collection/-/d3-collection-1.0.7.tgz#349bd2aa9977db071091c13144d5e4f16b5b310e"
+ integrity sha512-ii0/r5f4sjKNTfh84Di+DpztYwqKhEyUlKoPrzUFfeSkWxjW49xU2QzO9qrPrNkpdI0XJkfzvmTu8V2Zylln6A==
d3-color@1:
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/d3-color/-/d3-color-1.0.3.tgz#bc7643fca8e53a8347e2fbdaffa236796b58509b"
- integrity sha1-vHZD/KjlOoNH4vva/6I2eWtYUJs=
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/d3-color/-/d3-color-1.4.1.tgz#c52002bf8846ada4424d55d97982fef26eb3bc8a"
+ integrity sha512-p2sTHSLCJI2QKunbGb7ocOh7DgTAn8IrLx21QRc/BSnodXM4sv6aLQlnfpvehFMLZEfBc6g9pH9SWQccFYfJ9Q==
+
+"d3-color@1 - 3", d3-color@3:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/d3-color/-/d3-color-3.0.1.tgz#03316e595955d1fcd39d9f3610ad41bb90194d0a"
+ integrity sha512-6/SlHkDOBLyQSJ1j1Ghs82OIUXpKWlR0hCsw0XrLSQhuUPuCSmLQ1QPH98vpnQxMUQM2/gfAkUEWsupVpd9JGw==
d3-contour@1:
version "1.3.2"
@@ -4084,93 +3888,194 @@ d3-contour@1:
dependencies:
d3-array "^1.1.1"
+d3-contour@3:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/d3-contour/-/d3-contour-3.0.1.tgz#2c64255d43059599cd0dba8fe4cc3d51ccdd9bbd"
+ integrity sha512-0Oc4D0KyhwhM7ZL0RMnfGycLN7hxHB8CMmwZ3+H26PWAG0ozNuYG5hXSDNgmP1SgJkQMrlG6cP20HoaSbvcJTQ==
+ dependencies:
+ d3-array "2 - 3"
+
+d3-delaunay@6:
+ version "6.0.2"
+ resolved "https://registry.yarnpkg.com/d3-delaunay/-/d3-delaunay-6.0.2.tgz#7fd3717ad0eade2fc9939f4260acfb503f984e92"
+ integrity sha512-IMLNldruDQScrcfT+MWnazhHbDJhcRJyOEBAJfwQnHle1RPh6WDuLvxNArUju2VSMSUuKlY5BGHRJ2cYyoFLQQ==
+ dependencies:
+ delaunator "5"
+
d3-dispatch@1:
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/d3-dispatch/-/d3-dispatch-1.0.3.tgz#46e1491eaa9b58c358fce5be4e8bed626e7871f8"
- integrity sha1-RuFJHqqbWMNY/OW+TovtYm54cfg=
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/d3-dispatch/-/d3-dispatch-1.0.6.tgz#00d37bcee4dd8cd97729dd893a0ac29caaba5d58"
+ integrity sha512-fVjoElzjhCEy+Hbn8KygnmMS7Or0a9sI2UzGwoB7cCtvI1XpVN9GpoYlnb3xt2YV66oXYb1fLJ8GMvP4hdU1RA==
+
+"d3-dispatch@1 - 3", d3-dispatch@3:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/d3-dispatch/-/d3-dispatch-3.0.1.tgz#5fc75284e9c2375c36c839411a0cf550cbfc4d5e"
+ integrity sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==
d3-drag@1:
- version "1.2.1"
- resolved "https://registry.yarnpkg.com/d3-drag/-/d3-drag-1.2.1.tgz#df8dd4c502fb490fc7462046a8ad98a5c479282d"
- integrity sha512-Cg8/K2rTtzxzrb0fmnYOUeZHvwa4PHzwXOLZZPwtEs2SKLLKLXeYwZKBB+DlOxUvFmarOnmt//cU4+3US2lyyQ==
+ version "1.2.5"
+ resolved "https://registry.yarnpkg.com/d3-drag/-/d3-drag-1.2.5.tgz#2537f451acd39d31406677b7dc77c82f7d988f70"
+ integrity sha512-rD1ohlkKQwMZYkQlYVCrSFxsWPzI97+W+PaEIBNTMxRuxz9RF0Hi5nJWHGVJ3Om9d2fRTe1yOBINJyy/ahV95w==
dependencies:
d3-dispatch "1"
d3-selection "1"
+"d3-drag@2 - 3", d3-drag@3:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/d3-drag/-/d3-drag-3.0.0.tgz#994aae9cd23c719f53b5e10e3a0a6108c69607ba"
+ integrity sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==
+ dependencies:
+ d3-dispatch "1 - 3"
+ d3-selection "3"
+
d3-dsv@1:
- version "1.0.8"
- resolved "https://registry.yarnpkg.com/d3-dsv/-/d3-dsv-1.0.8.tgz#907e240d57b386618dc56468bacfe76bf19764ae"
- integrity sha512-IVCJpQ+YGe3qu6odkPQI0KPqfxkhbP/oM1XhhE/DFiYmcXKfCRub4KXyiuehV1d4drjWVXHUWx4gHqhdZb6n/A==
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/d3-dsv/-/d3-dsv-1.2.0.tgz#9d5f75c3a5f8abd611f74d3f5847b0d4338b885c"
+ integrity sha512-9yVlqvZcSOMhCYzniHE7EVUws7Fa1zgw+/EAV2BxJoG3ME19V6BQFBwI855XQDsxyOuG7NibqRMTtiF/Qup46g==
dependencies:
commander "2"
iconv-lite "0.4"
rw "1"
+"d3-dsv@1 - 3", d3-dsv@3:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/d3-dsv/-/d3-dsv-3.0.1.tgz#c63af978f4d6a0d084a52a673922be2160789b73"
+ integrity sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==
+ dependencies:
+ commander "7"
+ iconv-lite "0.6"
+ rw "1"
+
d3-ease@1:
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/d3-ease/-/d3-ease-1.0.3.tgz#68bfbc349338a380c44d8acc4fbc3304aa2d8c0e"
- integrity sha1-aL+8NJM4o4DETYrMT7wzBKotjA4=
+ version "1.0.7"
+ resolved "https://registry.yarnpkg.com/d3-ease/-/d3-ease-1.0.7.tgz#9a834890ef8b8ae8c558b2fe55bd57f5993b85e2"
+ integrity sha512-lx14ZPYkhNx0s/2HX5sLFUI3mbasHjSSpwO/KaaNACweVwxUruKyWVcb293wMv1RqTPZyZ8kSZ2NogUZNcLOFQ==
+
+"d3-ease@1 - 3", d3-ease@3:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/d3-ease/-/d3-ease-3.0.1.tgz#9658ac38a2140d59d346160f1f6c30fda0bd12f4"
+ integrity sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==
d3-fetch@1:
- version "1.1.2"
- resolved "https://registry.yarnpkg.com/d3-fetch/-/d3-fetch-1.1.2.tgz#957c8fbc6d4480599ba191b1b2518bf86b3e1be2"
- integrity sha512-S2loaQCV/ZeyTyIF2oP8D1K9Z4QizUzW7cWeAOAS4U88qOt3Ucf6GsmgthuYSdyB2HyEm4CeGvkQxWsmInsIVA==
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/d3-fetch/-/d3-fetch-1.2.0.tgz#15ce2ecfc41b092b1db50abd2c552c2316cf7fc7"
+ integrity sha512-yC78NBVcd2zFAyR/HnUiBS7Lf6inSCoWcSxFfw8FYL7ydiqe80SazNwoffcqOfs95XaLo7yebsmQqDKSsXUtvA==
dependencies:
d3-dsv "1"
+d3-fetch@3:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/d3-fetch/-/d3-fetch-3.0.1.tgz#83141bff9856a0edb5e38de89cdcfe63d0a60a22"
+ integrity sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==
+ dependencies:
+ d3-dsv "1 - 3"
+
d3-force@1:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/d3-force/-/d3-force-1.1.0.tgz#cebf3c694f1078fcc3d4daf8e567b2fbd70d4ea3"
- integrity sha512-2HVQz3/VCQs0QeRNZTYb7GxoUCeb6bOzMp/cGcLa87awY9ZsPvXOGeZm0iaGBjXic6I1ysKwMn+g+5jSAdzwcg==
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/d3-force/-/d3-force-1.2.1.tgz#fd29a5d1ff181c9e7f0669e4bd72bdb0e914ec0b"
+ integrity sha512-HHvehyaiUlVo5CxBJ0yF/xny4xoaxFxDnBXNvNcfW9adORGZfyNF1dj6DGLKyk4Yh3brP/1h3rnDzdIAwL08zg==
dependencies:
d3-collection "1"
d3-dispatch "1"
d3-quadtree "1"
d3-timer "1"
+d3-force@3:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/d3-force/-/d3-force-3.0.0.tgz#3e2ba1a61e70888fe3d9194e30d6d14eece155c4"
+ integrity sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==
+ dependencies:
+ d3-dispatch "1 - 3"
+ d3-quadtree "1 - 3"
+ d3-timer "1 - 3"
+
d3-format@1:
- version "1.2.2"
- resolved "https://registry.yarnpkg.com/d3-format/-/d3-format-1.2.2.tgz#1a39c479c8a57fe5051b2e67a3bee27061a74e7a"
- integrity sha512-zH9CfF/3C8zUI47nsiKfD0+AGDEuM8LwBIP7pBVpyR4l/sKkZqITmMtxRp04rwBrlshIZ17XeFAaovN3++wzkw==
+ version "1.4.5"
+ resolved "https://registry.yarnpkg.com/d3-format/-/d3-format-1.4.5.tgz#374f2ba1320e3717eb74a9356c67daee17a7edb4"
+ integrity sha512-J0piedu6Z8iB6TbIGfZgDzfXxUFN3qQRMofy2oPdXzQibYGqPB/9iMcxr/TGalU+2RsyDO+U4f33id8tbnSRMQ==
+
+"d3-format@1 - 3", d3-format@3:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/d3-format/-/d3-format-3.0.1.tgz#e41b81b2ab79277141ec1404aa5d05001da64084"
+ integrity sha512-hdL7+HBIohpgfolhBxr1KX47VMD6+vVD/oEFrxk5yhmzV2prk99EkFKYpXuhVkFpTgHdJ6/4bYcjdLPPXV4tIA==
d3-geo@1:
- version "1.9.1"
- resolved "https://registry.yarnpkg.com/d3-geo/-/d3-geo-1.9.1.tgz#157e3b0f917379d0f73bebfff3be537f49fa7356"
- integrity sha512-l9wL/cEQkyZQYXw3xbmLsH3eQ5ij+icNfo4r0GrLa5rOCZR/e/3am45IQ0FvQ5uMsv+77zBRunLc9ufTWSQYFA==
+ version "1.12.1"
+ resolved "https://registry.yarnpkg.com/d3-geo/-/d3-geo-1.12.1.tgz#7fc2ab7414b72e59fbcbd603e80d9adc029b035f"
+ integrity sha512-XG4d1c/UJSEX9NfU02KwBL6BYPj8YKHxgBEw5om2ZnTRSbIcego6dhHwcxuSR3clxh0EpE38os1DVPOmnYtTPg==
dependencies:
d3-array "1"
+d3-geo@3:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/d3-geo/-/d3-geo-3.0.1.tgz#4f92362fd8685d93e3b1fae0fd97dc8980b1ed7e"
+ integrity sha512-Wt23xBych5tSy9IYAM1FR2rWIBFWa52B/oF/GYe5zbdHrg08FU8+BuI6X4PvTwPDdqdAdq04fuWJpELtsaEjeA==
+ dependencies:
+ d3-array "2.5.0 - 3"
+
d3-hierarchy@1:
- version "1.1.5"
- resolved "https://registry.yarnpkg.com/d3-hierarchy/-/d3-hierarchy-1.1.5.tgz#a1c845c42f84a206bcf1c01c01098ea4ddaa7a26"
- integrity sha1-ochFxC+Eoga88cAcAQmOpN2qeiY=
+ version "1.1.9"
+ resolved "https://registry.yarnpkg.com/d3-hierarchy/-/d3-hierarchy-1.1.9.tgz#2f6bee24caaea43f8dc37545fa01628559647a83"
+ integrity sha512-j8tPxlqh1srJHAtxfvOUwKNYJkQuBFdM1+JAUfq6xqH5eAqf93L7oG1NVqDa4CpFZNvnNKtCYEUC8KY9yEn9lQ==
+
+d3-hierarchy@3:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/d3-hierarchy/-/d3-hierarchy-3.0.1.tgz#0365342d54972e38ca05e9143e0ab1c60846b3b5"
+ integrity sha512-RlLTaofEoOrMK1JoXYIGhKTkJFI/6rFrYPgxy6QlZo2BcVc4HGTqEU0rPpzuMq5T/5XcMtAzv1XiLA3zRTfygw==
d3-interpolate@1:
- version "1.1.6"
- resolved "https://registry.yarnpkg.com/d3-interpolate/-/d3-interpolate-1.1.6.tgz#2cf395ae2381804df08aa1bf766b7f97b5f68fb6"
- integrity sha512-mOnv5a+pZzkNIHtw/V6I+w9Lqm9L5bG3OTXPM5A+QO0yyVMQ4W1uZhR+VOJmazaOZXri2ppbiZ5BUNWT0pFM9A==
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/d3-interpolate/-/d3-interpolate-1.4.0.tgz#526e79e2d80daa383f9e0c1c1c7dcc0f0583e987"
+ integrity sha512-V9znK0zc3jOPV4VD2zZn0sDhZU3WAE2bmlxdIwwQPPzPjvyLkd8B3JUVdS1IDUFDkWZ72c9qnv1GK2ZagTZ8EA==
dependencies:
d3-color "1"
+"d3-interpolate@1 - 3", "d3-interpolate@1.2.0 - 3", d3-interpolate@3:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/d3-interpolate/-/d3-interpolate-3.0.1.tgz#3c47aa5b32c5b3dfb56ef3fd4342078a632b400d"
+ integrity sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==
+ dependencies:
+ d3-color "1 - 3"
+
d3-path@1:
- version "1.0.5"
- resolved "https://registry.yarnpkg.com/d3-path/-/d3-path-1.0.5.tgz#241eb1849bd9e9e8021c0d0a799f8a0e8e441764"
- integrity sha1-JB6xhJvZ6egCHA0KeZ+KDo5EF2Q=
+ version "1.0.9"
+ resolved "https://registry.yarnpkg.com/d3-path/-/d3-path-1.0.9.tgz#48c050bb1fe8c262493a8caf5524e3e9591701cf"
+ integrity sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==
+
+"d3-path@1 - 3", d3-path@3:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/d3-path/-/d3-path-3.0.1.tgz#f09dec0aaffd770b7995f1a399152bf93052321e"
+ integrity sha512-gq6gZom9AFZby0YLduxT1qmrp4xpBA1YZr19OI717WIdKE2OM5ETq5qrHLb301IgxhLwcuxvGZVLeeWc/k1I6w==
d3-polygon@1:
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/d3-polygon/-/d3-polygon-1.0.3.tgz#16888e9026460933f2b179652ad378224d382c62"
- integrity sha1-FoiOkCZGCTPysXllKtN4Ik04LGI=
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/d3-polygon/-/d3-polygon-1.0.6.tgz#0bf8cb8180a6dc107f518ddf7975e12abbfbd38e"
+ integrity sha512-k+RF7WvI08PC8reEoXa/w2nSg5AUMTi+peBD9cmFc+0ixHfbs4QmxxkarVal1IkVkgxVuk9JSHhJURHiyHKAuQ==
+
+d3-polygon@3:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/d3-polygon/-/d3-polygon-3.0.1.tgz#0b45d3dd1c48a29c8e057e6135693ec80bf16398"
+ integrity sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==
d3-quadtree@1:
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/d3-quadtree/-/d3-quadtree-1.0.3.tgz#ac7987e3e23fe805a990f28e1b50d38fcb822438"
- integrity sha1-rHmH4+I/6AWpkPKOG1DTj8uCJDg=
+ version "1.0.7"
+ resolved "https://registry.yarnpkg.com/d3-quadtree/-/d3-quadtree-1.0.7.tgz#ca8b84df7bb53763fe3c2f24bd435137f4e53135"
+ integrity sha512-RKPAeXnkC59IDGD0Wu5mANy0Q2V28L+fNe65pOCXVdVuTJS3WPKaJlFHer32Rbh9gIo9qMuJXio8ra4+YmIymA==
+
+"d3-quadtree@1 - 3", d3-quadtree@3:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/d3-quadtree/-/d3-quadtree-3.0.1.tgz#6dca3e8be2b393c9a9d514dabbd80a92deef1a4f"
+ integrity sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==
d3-random@1:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/d3-random/-/d3-random-1.1.0.tgz#6642e506c6fa3a648595d2b2469788a8d12529d3"
- integrity sha1-ZkLlBsb6OmSFldKyRpeIqNElKdM=
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/d3-random/-/d3-random-1.1.2.tgz#2833be7c124360bf9e2d3fd4f33847cfe6cab291"
+ integrity sha512-6AK5BNpIFqP+cx/sreKzNjWbwZQCSUatxq+pPRmFIQaWuoD+NrbVWw7YWpHiXpCQ/NanKdtGDuB+VQcZDaEmYQ==
+
+d3-random@3:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/d3-random/-/d3-random-3.0.1.tgz#d4926378d333d9c0bfd1e6fa0194d30aebaa20f4"
+ integrity sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==
d3-sankey@^0.12.3:
version "0.12.3"
@@ -4181,13 +4086,21 @@ d3-sankey@^0.12.3:
d3-shape "^1.2.0"
d3-scale-chromatic@1:
- version "1.3.3"
- resolved "https://registry.yarnpkg.com/d3-scale-chromatic/-/d3-scale-chromatic-1.3.3.tgz#dad4366f0edcb288f490128979c3c793583ed3c0"
- integrity sha512-BWTipif1CimXcYfT02LKjAyItX5gKiwxuPRgr4xM58JwlLocWbjPLI7aMEjkcoOQXMkYsmNsvv3d2yl/OKuHHw==
+ version "1.5.0"
+ resolved "https://registry.yarnpkg.com/d3-scale-chromatic/-/d3-scale-chromatic-1.5.0.tgz#54e333fc78212f439b14641fb55801dd81135a98"
+ integrity sha512-ACcL46DYImpRFMBcpk9HhtIyC7bTBR4fNOPxwVSl0LfulDAwyiHyPOTqcDG1+t5d4P9W7t/2NAuWu59aKko/cg==
dependencies:
d3-color "1"
d3-interpolate "1"
+d3-scale-chromatic@3:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/d3-scale-chromatic/-/d3-scale-chromatic-3.0.0.tgz#15b4ceb8ca2bb0dcb6d1a641ee03d59c3b62376a"
+ integrity sha512-Lx9thtxAKrO2Pq6OO2Ua474opeziKr279P/TKZsMAhYyNDD3EnCffdbgeSYN5O7m2ByQsxtuP2CSDczNUIZ22g==
+ dependencies:
+ d3-color "1 - 3"
+ d3-interpolate "1 - 3"
+
d3-scale@2:
version "2.2.2"
resolved "https://registry.yarnpkg.com/d3-scale/-/d3-scale-2.2.2.tgz#4e880e0b2745acaaddd3ede26a9e908a9e17b81f"
@@ -4200,10 +4113,26 @@ d3-scale@2:
d3-time "1"
d3-time-format "2"
+d3-scale@4:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/d3-scale/-/d3-scale-4.0.2.tgz#82b38e8e8ff7080764f8dcec77bd4be393689396"
+ integrity sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==
+ dependencies:
+ d3-array "2.10.0 - 3"
+ d3-format "1 - 3"
+ d3-interpolate "1.2.0 - 3"
+ d3-time "2.1.1 - 3"
+ d3-time-format "2 - 4"
+
d3-selection@1, d3-selection@^1.1.0, d3-selection@^1.2.0:
- version "1.3.0"
- resolved "https://registry.yarnpkg.com/d3-selection/-/d3-selection-1.3.0.tgz#d53772382d3dc4f7507bfb28bcd2d6aed2a0ad6d"
- integrity sha512-qgpUOg9tl5CirdqESUAu0t9MU/t3O9klYfGfyKsXEmhyxyzLpzpeh08gaxBUTQw1uXIOkr/30Ut2YRjSSxlmHA==
+ version "1.4.2"
+ resolved "https://registry.yarnpkg.com/d3-selection/-/d3-selection-1.4.2.tgz#dcaa49522c0dbf32d6c1858afc26b6094555bc5c"
+ integrity sha512-SJ0BqYihzOjDnnlfyeHT0e30k0K1+5sR3d5fNueCNeuhZTnGw4M4o8mqJchSwgKMXCNFo+e2VTChiSJ0vYtXkg==
+
+"d3-selection@2 - 3", d3-selection@3:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/d3-selection/-/d3-selection-3.0.0.tgz#c25338207efa72cc5b9bd1458a1a41901f1e1b31"
+ integrity sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==
d3-shape@1, d3-shape@^1.2.0:
version "1.3.7"
@@ -4212,27 +4141,53 @@ d3-shape@1, d3-shape@^1.2.0:
dependencies:
d3-path "1"
+d3-shape@3:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/d3-shape/-/d3-shape-3.0.1.tgz#9ccdfb28fd9b0d12f2d8aec234cd5c4a9ea27931"
+ integrity sha512-HNZNEQoDhuCrDWEc/BMbF/hKtzMZVoe64TvisFLDp2Iyj0UShB/E6/lBsLlJTfBMbYgftHj90cXJ0SEitlE6Xw==
+ dependencies:
+ d3-path "1 - 3"
+
d3-time-format@2:
- version "2.1.1"
- resolved "https://registry.yarnpkg.com/d3-time-format/-/d3-time-format-2.1.1.tgz#85b7cdfbc9ffca187f14d3c456ffda268081bb31"
- integrity sha512-8kAkymq2WMfzW7e+s/IUNAtN/y3gZXGRrdGfo6R8NKPAA85UBTxZg5E61bR6nLwjPjj4d3zywSQe1CkYLPFyrw==
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/d3-time-format/-/d3-time-format-2.3.0.tgz#107bdc028667788a8924ba040faf1fbccd5a7850"
+ integrity sha512-guv6b2H37s2Uq/GefleCDtbe0XZAuy7Wa49VGkPVPMfLL9qObgBST3lEHJBMUp8S7NdLQAGIvr2KXk8Hc98iKQ==
dependencies:
d3-time "1"
+"d3-time-format@2 - 4", d3-time-format@4:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/d3-time-format/-/d3-time-format-4.0.0.tgz#930ded86a9de761702344760d8a25753467f28b7"
+ integrity sha512-nzaCwlj+ZVBIlFuVOT1RmU+6xb/7D5IcnhHzHQcBgS/aTa5K9fWZNN5LCXA27LgF5WxoSNJqKBbLcGMtM6Ca6A==
+ dependencies:
+ d3-time "1 - 3"
+
d3-time@1:
- version "1.0.8"
- resolved "https://registry.yarnpkg.com/d3-time/-/d3-time-1.0.8.tgz#dbd2d6007bf416fe67a76d17947b784bffea1e84"
- integrity sha512-YRZkNhphZh3KcnBfitvF3c6E0JOFGikHZ4YqD+Lzv83ZHn1/u6yGenRU1m+KAk9J1GnZMnKcrtfvSktlA1DXNQ==
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/d3-time/-/d3-time-1.1.0.tgz#b1e19d307dae9c900b7e5b25ffc5dcc249a8a0f1"
+ integrity sha512-Xh0isrZ5rPYYdqhAVk8VLnMEidhz5aP7htAADH6MfzgmmicPkTo8LhkLxci61/lCB7n7UmE3bN0leRt+qvkLxA==
+
+"d3-time@1 - 3", "d3-time@2.1.1 - 3", d3-time@3:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/d3-time/-/d3-time-3.0.0.tgz#65972cb98ae2d4954ef5c932e8704061335d4975"
+ integrity sha512-zmV3lRnlaLI08y9IMRXSDshQb5Nj77smnfpnd2LrBa/2K281Jijactokeak14QacHs/kKq0AQ121nidNYlarbQ==
+ dependencies:
+ d3-array "2 - 3"
d3-timer@1:
- version "1.0.7"
- resolved "https://registry.yarnpkg.com/d3-timer/-/d3-timer-1.0.7.tgz#df9650ca587f6c96607ff4e60cc38229e8dd8531"
- integrity sha512-vMZXR88XujmG/L5oB96NNKH5lCWwiLM/S2HyyAQLcjWJCloK5shxta4CwOFYLZoY3AWX73v8Lgv4cCAdWtRmOA==
+ version "1.0.10"
+ resolved "https://registry.yarnpkg.com/d3-timer/-/d3-timer-1.0.10.tgz#dfe76b8a91748831b13b6d9c793ffbd508dd9de5"
+ integrity sha512-B1JDm0XDaQC+uvo4DT79H0XmBskgS3l6Ve+1SBCfxgmtIb1AVrPIoqd+nPSv+loMX8szQ0sVUhGngL7D5QPiXw==
+
+"d3-timer@1 - 3", d3-timer@3:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/d3-timer/-/d3-timer-3.0.1.tgz#6284d2a2708285b1abb7e201eda4380af35e63b0"
+ integrity sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==
d3-transition@1:
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/d3-transition/-/d3-transition-1.1.1.tgz#d8ef89c3b848735b060e54a39b32aaebaa421039"
- integrity sha512-xeg8oggyQ+y5eb4J13iDgKIjUcEfIOZs2BqV/eEmXm2twx80wTzJ4tB4vaZ5BKfz7XsI/DFmQL5me6O27/5ykQ==
+ version "1.3.2"
+ resolved "https://registry.yarnpkg.com/d3-transition/-/d3-transition-1.3.2.tgz#a98ef2151be8d8600543434c1ca80140ae23b398"
+ integrity sha512-sc0gRU4PFqZ47lPVHloMn9tlPcv8jxgOQg+0zjhfZXMQuvppjG6YuwdMBE0TuqCZjeJkLecku/l9R0JPcRhaDA==
dependencies:
d3-color "1"
d3-dispatch "1"
@@ -4241,15 +4196,26 @@ d3-transition@1:
d3-selection "^1.1.0"
d3-timer "1"
+"d3-transition@2 - 3", d3-transition@3:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/d3-transition/-/d3-transition-3.0.1.tgz#6869fdde1448868077fdd5989200cb61b2a1645f"
+ integrity sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==
+ dependencies:
+ d3-color "1 - 3"
+ d3-dispatch "1 - 3"
+ d3-ease "1 - 3"
+ d3-interpolate "1 - 3"
+ d3-timer "1 - 3"
+
d3-voronoi@1:
- version "1.1.2"
- resolved "https://registry.yarnpkg.com/d3-voronoi/-/d3-voronoi-1.1.2.tgz#1687667e8f13a2d158c80c1480c5a29cb0d8973c"
- integrity sha1-Fodmfo8TotFYyAwUgMWinLDYlzw=
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/d3-voronoi/-/d3-voronoi-1.1.4.tgz#dd3c78d7653d2bb359284ae478645d95944c8297"
+ integrity sha512-dArJ32hchFsrQ8uMiTBLq256MpnZjeuBtdHpaDlYuQyjU0CVzCJl/BVW+SkszaAeH95D/8gxqAhgx0ouAWAfRg==
d3-zoom@1:
- version "1.7.1"
- resolved "https://registry.yarnpkg.com/d3-zoom/-/d3-zoom-1.7.1.tgz#02f43b3c3e2db54f364582d7e4a236ccc5506b63"
- integrity sha512-sZHQ55DGq5BZBFGnRshUT8tm2sfhPHFnOlmPbbwTkAoPeVdRTkB4Xsf9GCY0TSHrTD8PeJPZGmP/TpGicwJDJQ==
+ version "1.8.3"
+ resolved "https://registry.yarnpkg.com/d3-zoom/-/d3-zoom-1.8.3.tgz#b6a3dbe738c7763121cd05b8a7795ffe17f4fc0a"
+ integrity sha512-VoLXTK4wvy1a0JpH2Il+F2CiOhVu7VRXWF5M/LroMIh3/zBAC3WAt7QoIvPibOavVo20hN6/37vwAsdBejLyKQ==
dependencies:
d3-dispatch "1"
d3-drag "1"
@@ -4257,7 +4223,18 @@ d3-zoom@1:
d3-selection "1"
d3-transition "1"
-d3@^5.14, d3@^5.16.0, d3@^5.7.0:
+d3-zoom@3:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/d3-zoom/-/d3-zoom-3.0.0.tgz#d13f4165c73217ffeaa54295cd6969b3e7aee8f3"
+ integrity sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==
+ dependencies:
+ d3-dispatch "1 - 3"
+ d3-drag "2 - 3"
+ d3-interpolate "1 - 3"
+ d3-selection "2 - 3"
+ d3-transition "2 - 3"
+
+d3@^5.14, d3@^5.16.0:
version "5.16.0"
resolved "https://registry.yarnpkg.com/d3/-/d3-5.16.0.tgz#9c5e8d3b56403c79d4ed42fbd62f6113f199c877"
integrity sha512-4PL5hHaHwX4m7Zr1UapXW23apo6pexCgdetdJ5kTmADpG/7T9Gkxw0M0tf/pjoB63ezCCm0u5UaFYy2aMt0Mcw==
@@ -4294,6 +4271,42 @@ d3@^5.14, d3@^5.16.0, d3@^5.7.0:
d3-voronoi "1"
d3-zoom "1"
+d3@^7.0.0:
+ version "7.0.4"
+ resolved "https://registry.yarnpkg.com/d3/-/d3-7.0.4.tgz#37dfeb3b526f64a0de2ddb705ea61649325207bd"
+ integrity sha512-ruRiyPYZEGeJBOOjVS5pHliNUZM2HAllEY7HKB2ff+9ENxOti4N+S+WZqo9ggUMr8tSPMm+riqKpJd1oYEDN5Q==
+ dependencies:
+ d3-array "3"
+ d3-axis "3"
+ d3-brush "3"
+ d3-chord "3"
+ d3-color "3"
+ d3-contour "3"
+ d3-delaunay "6"
+ d3-dispatch "3"
+ d3-drag "3"
+ d3-dsv "3"
+ d3-ease "3"
+ d3-fetch "3"
+ d3-force "3"
+ d3-format "3"
+ d3-geo "3"
+ d3-hierarchy "3"
+ d3-interpolate "3"
+ d3-path "3"
+ d3-polygon "3"
+ d3-quadtree "3"
+ d3-random "3"
+ d3-scale "4"
+ d3-scale-chromatic "3"
+ d3-selection "3"
+ d3-shape "3"
+ d3-time "3"
+ d3-time-format "4"
+ d3-timer "3"
+ d3-transition "3"
+ d3-zoom "3"
+
dagre-d3@^0.6.4:
version "0.6.4"
resolved "https://registry.yarnpkg.com/dagre-d3/-/dagre-d3-0.6.4.tgz#0728d5ce7f177ca2337df141ceb60fbe6eeb7b29"
@@ -4333,10 +4346,10 @@ date-now@^0.1.4:
resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b"
integrity sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=
-dateformat@^4.5.1:
- version "4.5.1"
- resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-4.5.1.tgz#c20e7a9ca77d147906b6dc2261a8be0a5bd2173c"
- integrity sha512-OD0TZ+B7yP7ZgpJf5K2DIbj3FZvFvxgFUuaqA/V5zTjAtAAXZ1E8bktHxmAGs4x5b7PflqA9LeQ84Og7wYtF7Q==
+dateformat@^5.0.1:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-5.0.1.tgz#60a27a2deb339f888ba4532f533e25ac73ca3d19"
+ integrity sha512-DrcKxOW2am3mtqoJwBTK3OlWcF0QSk1p8diEWwpu3Mf//VdURD7XVaeOV738JvcaBiFfm9o2fisoMhiJH0aYxg==
de-indent@^1.0.2:
version "1.0.2"
@@ -4365,9 +4378,9 @@ debug@^3.1.0, debug@^3.1.1, debug@^3.2.6, debug@^3.2.7:
ms "^2.1.1"
debug@^4.0.0, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1:
- version "4.3.1"
- resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee"
- integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==
+ version "4.3.2"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.2.tgz#f0a49c18ac8779e31d4a0c6029dfb76873c7428b"
+ integrity sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==
dependencies:
ms "2.1.2"
@@ -4434,13 +4447,6 @@ default-gateway@^4.2.0:
execa "^1.0.0"
ip-regex "^2.1.0"
-defaults@^1.0.3:
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d"
- integrity sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=
- dependencies:
- clone "^1.0.2"
-
defer-to-connect@^1.0.1:
version "1.1.3"
resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-1.1.3.tgz#331ae050c08dcf789f8c83a7b81f0ed94f4ac591"
@@ -4488,6 +4494,13 @@ del@^4.1.1:
pify "^4.0.1"
rimraf "^2.6.3"
+delaunator@5:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/delaunator/-/delaunator-5.0.0.tgz#60f052b28bd91c9b4566850ebf7756efe821d81b"
+ integrity sha512-AyLvtyJdbv/U1GkiS6gUUzclRoAY4Gs75qkMygJJhU75LW4DNuSF2RMzpxs9jw9Oz1BobHjTdkG3zdP55VxAqw==
+ dependencies:
+ robust-predicates "^3.0.0"
+
delayed-stream@~1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619"
@@ -4670,15 +4683,15 @@ domhandler@^4.0.0, domhandler@^4.2.0:
dependencies:
domelementtype "^2.2.0"
-dompurify@2.3.0:
- version "2.3.0"
- resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-2.3.0.tgz#07bb39515e491588e5756b1d3e8375b5964814e2"
- integrity sha512-VV5C6Kr53YVHGOBKO/F86OYX6/iLTw2yVSI721gKetxpHCK/V5TaLEf9ODjRgl1KLSWRMY6cUhAbv/c+IUnwQw==
+dompurify@2.3.1:
+ version "2.3.1"
+ resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-2.3.1.tgz#a47059ca21fd1212d3c8f71fdea6943b8bfbdf6a"
+ integrity sha512-xGWt+NHAQS+4tpgbOAI08yxW0Pr256Gu/FNE2frZVTbgrBUn8M7tz7/ktS/LZ2MHeGqz6topj0/xY+y8R5FBFw==
-dompurify@^2.3.2:
- version "2.3.2"
- resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-2.3.2.tgz#c773efa410abb5c087c7caf44934fefa448f6e60"
- integrity sha512-jXJnvWloI+scD+N5uBikpUMsYXZb0LCAXxLFAOLS5duCzKfXLqBCpuINvFOiI4eJgTLggrngljT18HNoakHUsA==
+dompurify@^2.3.3:
+ version "2.3.3"
+ resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-2.3.3.tgz#c1af3eb88be47324432964d8abc75cf4b98d634c"
+ integrity sha512-dqnqRkPMAjOZE0FogZ+ceJNM2dZ3V/yNOuFB7+39qpO93hHhfRpHw3heYQC7DPK9FqbQTfBKUJhiSfz4MvXYwg==
domutils@^1.5.1:
version "1.7.0"
@@ -4764,10 +4777,10 @@ ee-first@1.1.1:
resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=
-electron-to-chromium@^1.3.723:
- version "1.3.762"
- resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.762.tgz#3fa4e3bcbda539b50e3aa23041627063a5cffe61"
- integrity sha512-LehWjRpfPcK8F1Lf/NZoAwWLWnjJVo0SZeQ9j/tvnBWYcT99qDqgo4raAfS2oTKZjPrR/jxruh85DGgDUmywEA==
+electron-to-chromium@^1.3.846:
+ version "1.3.853"
+ resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.853.tgz#f3ed1d31f092cb3a17af188bca6c6a3ec91c3e82"
+ integrity sha512-W4U8n+U8I5/SUaFcqZgbKRmYZwcyEIQVBDf+j5QQK6xChjXnQD+wj248eGR9X4u+dDmDR//8vIfbu4PrdBBIoQ==
elliptic@^6.0.0:
version "6.5.4"
@@ -4934,11 +4947,6 @@ escape-html@~1.0.3:
resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988"
integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=
-escape-string-regexp@4.0.0, escape-string-regexp@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34"
- integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==
-
escape-string-regexp@^1.0.5, escape-string-regexp@~1.0.5:
version "1.0.5"
resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
@@ -4949,6 +4957,11 @@ escape-string-regexp@^2.0.0:
resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344"
integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==
+escape-string-regexp@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34"
+ integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==
+
escodegen@^1.14.1:
version "1.14.3"
resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.14.3.tgz#4e7b81fba61581dc97582ed78cab7f0e8d63f503"
@@ -4977,10 +4990,10 @@ eslint-config-prettier@^6.10.0:
dependencies:
get-stdin "^6.0.0"
-eslint-import-resolver-jest@3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/eslint-import-resolver-jest/-/eslint-import-resolver-jest-3.0.0.tgz#fd61da30fe58f4c1074af1f069b4267c70a91fd6"
- integrity sha512-dCrepGDfaI5cK1QeUhUSbrkDalFkFGXyvjsfWyDxg1uPWiwsGpGmK6GFVPS4mn/IAYLipquB9AHonGQP/iaOAQ==
+eslint-import-resolver-jest@3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/eslint-import-resolver-jest/-/eslint-import-resolver-jest-3.0.2.tgz#b20150f574576b6bd0d432a7ff08b0067141b33e"
+ integrity sha512-1FiDyoiq02r0fkEbq/h6x9rUawWt4ct6o51uNkoSaC7GC8iIAfsPD8eSYSizZtNRbF6NuOsmuLIShOTavKNtsQ==
dependencies:
find-root "^1.1.0"
resolve "^1.12.0"
@@ -5183,7 +5196,7 @@ espree@^7.3.0, espree@^7.3.1:
acorn-jsx "^5.3.1"
eslint-visitor-keys "^1.3.0"
-esprima@^4.0.0, esprima@^4.0.1, esprima@~4.0.0:
+esprima@^4.0.0, esprima@^4.0.1:
version "4.0.1"
resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71"
integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==
@@ -5390,15 +5403,6 @@ extend@^3.0.0, extend@~3.0.2:
resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa"
integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==
-external-editor@^3.0.3:
- version "3.1.0"
- resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495"
- integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==
- dependencies:
- chardet "^0.7.0"
- iconv-lite "^0.4.24"
- tmp "^0.0.33"
-
extglob@^2.0.4:
version "2.0.4"
resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543"
@@ -5441,16 +5445,15 @@ fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3:
integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==
fast-glob@^3.1.1, fast-glob@^3.2.4, fast-glob@^3.2.5:
- version "3.2.5"
- resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.5.tgz#7939af2a656de79a4f1901903ee8adcaa7cb9661"
- integrity sha512-2DtFcgT68wiTTiwZ2hNdJfcHNke9XOfnwmBRWXhmeKM8rF0TGwmC/Qto3S7RoZKp5cilZbxzO5iTNTQsJ+EeDg==
+ version "3.2.7"
+ resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.7.tgz#fd6cb7a2d7e9aa7a7846111e85a196d6b2f766a1"
+ integrity sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==
dependencies:
"@nodelib/fs.stat" "^2.0.2"
"@nodelib/fs.walk" "^1.2.3"
- glob-parent "^5.1.0"
+ glob-parent "^5.1.2"
merge2 "^1.3.0"
- micromatch "^4.0.2"
- picomatch "^2.2.1"
+ micromatch "^4.0.4"
fast-json-stable-stringify@^2.0.0:
version "2.1.0"
@@ -5473,9 +5476,9 @@ fastest-levenshtein@^1.0.12:
integrity sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow==
fastq@^1.6.0:
- version "1.10.1"
- resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.10.1.tgz#8b8f2ac8bf3632d67afcd65dac248d5fdc45385e"
- integrity sha512-AWuv6Ery3pM+dY7LYS8YIaCiQvUaos9OB1RyNgaOWnaX+Tik7Onvcsf8x8c+YtDeT0maYLniBip2hox5KtEXXA==
+ version "1.13.0"
+ resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.13.0.tgz#616760f88a7526bdfc596b7cab8c18938c36b98c"
+ integrity sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==
dependencies:
reusify "^1.0.4"
@@ -5505,13 +5508,6 @@ figgy-pudding@^3.5.1:
resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.1.tgz#862470112901c727a0e495a80744bd5baa1d6790"
integrity sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w==
-figures@^3.0.0, figures@^3.2.0:
- version "3.2.0"
- resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af"
- integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==
- dependencies:
- escape-string-regexp "^1.0.5"
-
file-entry-cache@^6.0.0, file-entry-cache@^6.0.1:
version "6.0.1"
resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027"
@@ -5557,7 +5553,7 @@ finalhandler@~1.1.2:
statuses "~1.5.0"
unpipe "~1.0.0"
-find-cache-dir@^2.0.0, find-cache-dir@^2.1.0:
+find-cache-dir@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-2.1.0.tgz#8d0f94cd13fe43c6c7c261a0d86115ca918c05f7"
integrity sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==
@@ -5625,11 +5621,6 @@ flatted@^3.1.0:
resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.1.1.tgz#c4b489e80096d9df1dfc97c79871aea7c617c469"
integrity sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA==
-flow-parser@0.*:
- version "0.157.0"
- resolved "https://registry.yarnpkg.com/flow-parser/-/flow-parser-0.157.0.tgz#8ef0a748a838a505820a3099690472757d39581c"
- integrity sha512-p0vdtrM8oAMlscIXpX0e/eGWll5NPteVChNtlQncbIbivH+BdiwXHN5QO6myAfmebd027r9RiQKdUPsFAiEVgQ==
-
flush-write-stream@^1.0.0:
version "1.1.1"
resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.1.1.tgz#8dd7d873a1babc207d94ead0c2e0e44276ebf2e8"
@@ -5692,15 +5683,6 @@ from2@^2.1.0:
inherits "^2.0.1"
readable-stream "^2.0.0"
-fs-extra@^8.1:
- version "8.1.0"
- resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0"
- integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==
- dependencies:
- graceful-fs "^4.2.0"
- jsonfile "^4.0.0"
- universalify "^0.1.0"
-
fs-minipass@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.0.0.tgz#a6415edab02fae4b9e9230bc87ee2e4472003cd1"
@@ -5823,7 +5805,7 @@ gettext-extractor@^3.5.3:
pofile "1.0.x"
typescript "2 - 4"
-glob-parent@^5.1.0, glob-parent@^5.1.1, glob-parent@^5.1.2, glob-parent@~5.1.0:
+glob-parent@^5.1.1, glob-parent@^5.1.2, glob-parent@~5.1.0:
version "5.1.2"
resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4"
integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==
@@ -5910,7 +5892,7 @@ globals@^13.6.0, globals@^13.9.0:
dependencies:
type-fest "^0.20.2"
-globby@^11.0.1, globby@^11.0.2, globby@^11.0.3:
+globby@^11.0.1, globby@^11.0.2:
version "11.0.4"
resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.4.tgz#2cbaff77c2f2a62e71e9b2813a67b97a3a3001a5"
integrity sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg==
@@ -5969,7 +5951,7 @@ got@^9.6.0:
to-readable-stream "^1.0.0"
url-parse-lax "^3.0.0"
-graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9, graceful-fs@^4.2.0, graceful-fs@^4.2.4:
+graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.9, graceful-fs@^4.2.4:
version "4.2.8"
resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.8.tgz#e412b8d33f5e006593cbd3cee6df9f2cebbe802a"
integrity sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==
@@ -6294,13 +6276,20 @@ human-signals@^1.1.1:
resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3"
integrity sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==
-iconv-lite@0.4, iconv-lite@0.4.24, iconv-lite@^0.4.24:
+iconv-lite@0.4, iconv-lite@0.4.24:
version "0.4.24"
resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b"
integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==
dependencies:
safer-buffer ">= 2.1.2 < 3"
+iconv-lite@0.6:
+ version "0.6.3"
+ resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501"
+ integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==
+ dependencies:
+ safer-buffer ">= 2.1.2 < 3.0.0"
+
icss-replace-symbols@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz#06ea6f83679a7749e386cfe1fe812ae5db223ded"
@@ -6313,7 +6302,7 @@ icss-utils@^4.1.0:
dependencies:
postcss "^7.0.14"
-ieee754@1.1.13, ieee754@^1.1.13, ieee754@^1.1.4:
+ieee754@1.1.13, ieee754@^1.1.4:
version "1.1.13"
resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.13.tgz#ec168558e95aa181fd87d37f55c32bbcb6708b84"
integrity sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==
@@ -6435,36 +6424,6 @@ ini@^1.3.4, ini@^1.3.5, ini@~1.3.0:
resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c"
integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==
-inquirer-glob-prompt@^0.1.0:
- version "0.1.0"
- resolved "https://registry.yarnpkg.com/inquirer-glob-prompt/-/inquirer-glob-prompt-0.1.0.tgz#3676bc10bcdd31e17121146be9c6467a2d79fc85"
- integrity sha512-Zw9XYJdrBBJ5TZjLH8Nu8PIa54huvkP0xeNOTtKh3bis0DNAJWMtdpT9PIJBkqheMUnwIPmv8jkjOr7aPKYFqg==
- dependencies:
- chalk "^4.1.0"
- figures "^3.2.0"
- globby "^11.0.3"
- rxjs "^6.6.7"
-
-inquirer@^8.0.0:
- version "8.1.2"
- resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-8.1.2.tgz#65b204d2cd7fb63400edd925dfe428bafd422e3d"
- integrity sha512-DHLKJwLPNgkfwNmsuEUKSejJFbkv0FMO9SMiQbjI3n5NQuCrSIBqP66ggqyz2a6t2qEolKrMjhQ3+W/xXgUQ+Q==
- dependencies:
- ansi-escapes "^4.2.1"
- chalk "^4.1.1"
- cli-cursor "^3.1.0"
- cli-width "^3.0.0"
- external-editor "^3.0.3"
- figures "^3.0.0"
- lodash "^4.17.21"
- mute-stream "0.0.8"
- ora "^5.3.0"
- run-async "^2.4.0"
- rxjs "^7.2.0"
- string-width "^4.1.0"
- strip-ansi "^6.0.0"
- through "^2.3.6"
-
internal-ip@^4.3.0:
version "4.3.0"
resolved "https://registry.yarnpkg.com/internal-ip/-/internal-ip-4.3.0.tgz#845452baad9d2ca3b69c635a137acb9a0dad0907"
@@ -6473,6 +6432,11 @@ internal-ip@^4.3.0:
default-gateway "^4.2.0"
ipaddr.js "^1.9.0"
+"internmap@1 - 2":
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/internmap/-/internmap-2.0.3.tgz#6685f23755e43c524e251d29cbc97248e3061009"
+ integrity sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==
+
interpret@^1.4.0:
version "1.4.0"
resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e"
@@ -6621,9 +6585,9 @@ is-descriptor@^1.0.0, is-descriptor@^1.0.2:
kind-of "^6.0.2"
is-docker@^2.0.0:
- version "2.1.1"
- resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.1.1.tgz#4125a88e44e450d384e09047ede71adc2d144156"
- integrity sha512-ZOoqiXfEwtGknTiuDEy8pN2CfE3TxMHprvNer1mXiqwkOT77Rw3YVrUQ52EqAOU3QAWDQ+bQdx7HJzrv7LS2Hw==
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa"
+ integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==
is-extendable@^0.1.0, is-extendable@^0.1.1:
version "0.1.1"
@@ -6658,9 +6622,9 @@ is-generator-fn@^2.0.0:
integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==
is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1:
- version "4.0.1"
- resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc"
- integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==
+ version "4.0.3"
+ resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084"
+ integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==
dependencies:
is-extglob "^2.1.1"
@@ -6677,11 +6641,6 @@ is-installed-globally@^0.3.1:
global-dirs "^2.0.1"
is-path-inside "^3.0.1"
-is-interactive@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/is-interactive/-/is-interactive-1.0.0.tgz#cea6e6ae5c870a7b0a0004070b7b587e0252912e"
- integrity sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==
-
is-negative-zero@^2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.1.tgz#3de746c18dda2319241a53675908d8f766f11c24"
@@ -6815,7 +6774,7 @@ is-wsl@^1.1.0:
resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d"
integrity sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=
-is-wsl@^2.1.1, is-wsl@^2.2.0:
+is-wsl@^2.2.0:
version "2.2.0"
resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271"
integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==
@@ -7364,31 +7323,6 @@ jsbn@~0.1.0:
resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513"
integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM=
-jscodeshift@^0.11.0:
- version "0.11.0"
- resolved "https://registry.yarnpkg.com/jscodeshift/-/jscodeshift-0.11.0.tgz#4f95039408f3f06b0e39bb4d53bc3139f5330e2f"
- integrity sha512-SdRK2C7jjs4k/kT2mwtO07KJN9RnjxtKn03d9JVj6c3j9WwaLcFYsICYDnLAzY0hp+wG2nxl+Cm2jWLiNVYb8g==
- dependencies:
- "@babel/core" "^7.1.6"
- "@babel/parser" "^7.1.6"
- "@babel/plugin-proposal-class-properties" "^7.1.0"
- "@babel/plugin-proposal-nullish-coalescing-operator" "^7.1.0"
- "@babel/plugin-proposal-optional-chaining" "^7.1.0"
- "@babel/plugin-transform-modules-commonjs" "^7.1.0"
- "@babel/preset-flow" "^7.0.0"
- "@babel/preset-typescript" "^7.1.0"
- "@babel/register" "^7.0.0"
- babel-core "^7.0.0-bridge.0"
- colors "^1.1.2"
- flow-parser "0.*"
- graceful-fs "^4.2.4"
- micromatch "^3.1.10"
- neo-async "^2.5.0"
- node-dir "^0.1.17"
- recast "^0.20.3"
- temp "^0.8.1"
- write-file-atomic "^2.3.0"
-
jsdoc-vue@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/jsdoc-vue/-/jsdoc-vue-1.0.0.tgz#ff3ac1ba6bc4a74079bb79058a7bf0066e346235"
@@ -7507,9 +7441,9 @@ json5@^1.0.1:
minimist "^1.2.0"
json5@^2.1.2:
- version "2.1.3"
- resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.3.tgz#c9b0f7fa9233bfe5807fe66fcf3a5617ed597d43"
- integrity sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.0.tgz#2dfefe720c6ba525d9ebd909950f0515316c89a3"
+ integrity sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==
dependencies:
minimist "^1.2.5"
@@ -7523,13 +7457,6 @@ jsonc-parser@~3.0.0:
resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-3.0.0.tgz#abdd785701c7e7eaca8a9ec8cf070ca51a745a22"
integrity sha512-fQzRfAbIBnR0IQvftw9FJveWiHp72Fg20giDrHz6TdfB12UH/uue0D3hm57UB5KgAVuniLMCaS8P1IMj9NR7cA==
-jsonfile@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb"
- integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=
- optionalDependencies:
- graceful-fs "^4.1.6"
-
jsprim@^1.2.2:
version "1.4.1"
resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2"
@@ -7738,11 +7665,6 @@ locate-path@^5.0.0:
dependencies:
p-locate "^4.1.0"
-lodash._reinterpolate@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d"
- integrity sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=
-
lodash.assign@^4.2.0:
version "4.2.0"
resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-4.2.0.tgz#0d99f3ccd7a6d261d19bdaeb9245005d285808e7"
@@ -7863,21 +7785,6 @@ lodash.sortby@^4.7.0:
resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438"
integrity sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=
-lodash.template@^4.4.0:
- version "4.5.0"
- resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-4.5.0.tgz#f976195cf3f347d0d5f52483569fe8031ccce8ab"
- integrity sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==
- dependencies:
- lodash._reinterpolate "^3.0.0"
- lodash.templatesettings "^4.0.0"
-
-lodash.templatesettings@^4.0.0:
- version "4.2.0"
- resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz#e481310f049d3cf6d47e912ad09313b154f0fb33"
- integrity sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==
- dependencies:
- lodash._reinterpolate "^3.0.0"
-
lodash.truncate@^4.4.2:
version "4.4.2"
resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193"
@@ -7908,7 +7815,7 @@ lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
-log-symbols@^4.0.0, log-symbols@^4.1.0:
+log-symbols@^4.0.0:
version "4.1.0"
resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503"
integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==
@@ -7978,7 +7885,7 @@ lz-string@^1.4.4:
resolved "https://registry.yarnpkg.com/lz-string/-/lz-string-1.4.4.tgz#c0d8eaf36059f705796e1e344811cf4c498d3a26"
integrity sha1-wNjq82BZ9wV5bh40SBHPTEmNOiY=
-make-dir@^2.0.0, make-dir@^2.1.0:
+make-dir@^2.0.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5"
integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==
@@ -8207,17 +8114,16 @@ merge2@^1.3.0:
resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae"
integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==
-mermaid@^8.11.5:
- version "8.11.5"
- resolved "https://registry.yarnpkg.com/mermaid/-/mermaid-8.11.5.tgz#a2a284d705abf145e0d0f27e8b913d6e11bbb92c"
- integrity sha512-lbIaDQlFoIQLxnLy8hZgfS6L7gt2Wxlk83fudLslUEhj4yafHyVjzGOlojJQxgsLU5khEANhxLbo0xebtOrhXQ==
+mermaid@^8.13.2:
+ version "8.13.2"
+ resolved "https://registry.yarnpkg.com/mermaid/-/mermaid-8.13.2.tgz#9f8abc66ba1c53b132fdaa0d4a80f4717b7b7655"
+ integrity sha512-qTFI7MfC2d+x0Hft5gx063EH9tZg36lERG8o7Zq0Ag+MnO8CgVaMZEU6oA8gzTtTn9upMdy4UlYSLVmavu27cQ==
dependencies:
"@braintree/sanitize-url" "^3.1.0"
- "@percy/migrate" "^0.10.0"
- d3 "^5.7.0"
+ d3 "^7.0.0"
dagre "^0.8.5"
dagre-d3 "^0.6.4"
- dompurify "2.3.0"
+ dompurify "2.3.1"
graphlib "^2.1.8"
khroma "^1.4.1"
moment-mini "^2.24.0"
@@ -8255,13 +8161,13 @@ micromatch@^3.0.4, micromatch@^3.1.10, micromatch@^3.1.4:
snapdragon "^0.8.1"
to-regex "^3.0.2"
-micromatch@^4.0.2:
- version "4.0.2"
- resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.2.tgz#4fcb0999bf9fbc2fcbdd212f6d629b9a56c39259"
- integrity sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==
+micromatch@^4.0.2, micromatch@^4.0.4:
+ version "4.0.4"
+ resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.4.tgz#896d519dfe9db25fce94ceb7a500919bf881ebf9"
+ integrity sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==
dependencies:
braces "^3.0.1"
- picomatch "^2.0.5"
+ picomatch "^2.2.3"
miller-rabin@^4.0.0:
version "4.0.1"
@@ -8325,7 +8231,7 @@ minimalistic-crypto-utils@^1.0.1:
resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a"
integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=
-minimatch@^3.0.2, minimatch@^3.0.4, minimatch@~3.0.4:
+minimatch@^3.0.4, minimatch@~3.0.4:
version "3.0.4"
resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083"
integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==
@@ -8524,10 +8430,10 @@ multicast-dns@^6.0.1:
dns-packet "^1.0.1"
thunky "^0.1.0"
-mute-stream@0.0.8:
- version "0.0.8"
- resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d"
- integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==
+nanocolors@^0.1.5:
+ version "0.1.12"
+ resolved "https://registry.yarnpkg.com/nanocolors/-/nanocolors-0.1.12.tgz#8577482c58cbd7b5bb1681db4cf48f11a87fd5f6"
+ integrity sha512-2nMHqg1x5PU+unxX7PGY7AuYxl2qDx7PSrTRjizr8sxdd3l/3hBuWWaki62qmtYm2U5i4Z5E7GbjlyDFhs9/EQ==
nanoid@^3.1.23:
version "3.1.23"
@@ -8562,22 +8468,15 @@ negotiator@0.6.2:
integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==
neo-async@^2.5.0, neo-async@^2.6.1:
- version "2.6.1"
- resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.1.tgz#ac27ada66167fa8849a6addd837f6b189ad2081c"
- integrity sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==
+ version "2.6.2"
+ resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f"
+ integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==
nice-try@^1.0.4:
version "1.0.5"
resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366"
integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==
-node-dir@^0.1.17:
- version "0.1.17"
- resolved "https://registry.yarnpkg.com/node-dir/-/node-dir-0.1.17.tgz#5f5665d93351335caabef8f1c554516cf5f1e4e5"
- integrity sha1-X1Zl2TNRM1yqvvjxxVRRbPXx5OU=
- dependencies:
- minimatch "^3.0.2"
-
node-ensure@^0.0.0:
version "0.0.0"
resolved "https://registry.yarnpkg.com/node-ensure/-/node-ensure-0.0.0.tgz#ecae764150de99861ec5c810fd5d096b183932a7"
@@ -8644,10 +8543,10 @@ node-notifier@^8.0.0:
uuid "^8.3.0"
which "^2.0.2"
-node-releases@^1.1.71:
- version "1.1.73"
- resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.73.tgz#dd4e81ddd5277ff846b80b52bb40c49edf7a7b20"
- integrity sha512-uW7fodD6pyW2FZNZnp/Z3hvWKeEW1Y8R1+1CnErE8cXFXzl5blBOoVB41CvMer6P6Q0S5FXDwcHgFd1Wj0U9zg==
+node-releases@^1.1.76:
+ version "1.1.76"
+ resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.76.tgz#df245b062b0cafbd5282ab6792f7dccc2d97f36e"
+ integrity sha512-9/IECtNr8dXNmPWmFXepT0/7o5eolGesHUa3mtr0KlgnCvnZxwh2qensKL42JJY2vQKC3nIBXetFAqR+PW1CmA==
nodemon@^2.0.4:
version "2.0.4"
@@ -8856,9 +8755,9 @@ once@^1.3.0, once@^1.3.1, once@^1.4.0:
wrappy "1"
onetime@^5.1.0:
- version "5.1.0"
- resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.0.tgz#fff0f3c91617fe62bb50189636e99ac8a6df7be5"
- integrity sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==
+ version "5.1.2"
+ resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e"
+ integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==
dependencies:
mimic-fn "^2.1.0"
@@ -8905,21 +8804,6 @@ optionator@^0.9.1:
type-check "^0.4.0"
word-wrap "^1.2.3"
-ora@^5.3.0:
- version "5.4.1"
- resolved "https://registry.yarnpkg.com/ora/-/ora-5.4.1.tgz#1b2678426af4ac4a509008e5e4ac9e9959db9e18"
- integrity sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==
- dependencies:
- bl "^4.1.0"
- chalk "^4.1.0"
- cli-cursor "^3.1.0"
- cli-spinners "^2.5.0"
- is-interactive "^1.0.0"
- is-unicode-supported "^0.1.0"
- log-symbols "^4.1.0"
- strip-ansi "^6.0.0"
- wcwidth "^1.0.1"
-
orderedmap@^1.1.0:
version "1.1.1"
resolved "https://registry.yarnpkg.com/orderedmap/-/orderedmap-1.1.1.tgz#c618e77611b3b21d0fe3edc92586265e0059c789"
@@ -8942,7 +8826,7 @@ os-homedir@^1.0.0:
resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3"
integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M=
-os-tmpdir@^1.0.0, os-tmpdir@~1.0.2:
+os-tmpdir@^1.0.0:
version "1.0.2"
resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274"
integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=
@@ -8978,9 +8862,9 @@ p-limit@^1.1.0:
p-try "^1.0.0"
p-limit@^2.0.0, p-limit@^2.2.0:
- version "2.2.2"
- resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.2.2.tgz#61279b67721f5287aa1c13a9a7fbbc48c9291b1e"
- integrity sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1"
+ integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==
dependencies:
p-try "^2.0.0"
@@ -9115,9 +8999,9 @@ parse-json@^2.2.0:
error-ex "^1.2.0"
parse-json@^5.0.0:
- version "5.1.0"
- resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.1.0.tgz#f96088cdf24a8faa9aea9a009f2d9d942c999646"
- integrity sha512-+mi/lmVVNKFNVyLXV31ERiy2CY5E1/F6QtJFEzoChPRwwngMNXRDQ9GJ5WdE2Z2P4AujsOi0/+2qHID68KwfIQ==
+ version "5.2.0"
+ resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd"
+ integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==
dependencies:
"@babel/code-frame" "^7.0.0"
error-ex "^1.3.1"
@@ -9237,10 +9121,10 @@ performance-now@^2.1.0:
resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b"
integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=
-picomatch@^2.0.4, picomatch@^2.0.5, picomatch@^2.2.1:
- version "2.2.2"
- resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad"
- integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==
+picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.0.tgz#f1f061de8f6a4bf022892e2d128234fb98302972"
+ integrity sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==
pify@^2.0.0:
version "2.3.0"
@@ -9269,7 +9153,7 @@ pinkie@^2.0.0:
resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870"
integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA=
-pirates@^4.0.0, pirates@^4.0.1:
+pirates@^4.0.1:
version "4.0.1"
resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.1.tgz#643a92caf894566f91b2b986d2c66950a8e2fb87"
integrity sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==
@@ -9574,10 +9458,10 @@ prosemirror-dropcursor@^1.3.2, prosemirror-dropcursor@^1.3.5:
prosemirror-transform "^1.1.0"
prosemirror-view "^1.1.0"
-prosemirror-gapcursor@^1.1.5:
- version "1.1.5"
- resolved "https://registry.yarnpkg.com/prosemirror-gapcursor/-/prosemirror-gapcursor-1.1.5.tgz#0c37fd6cbb1d7c46358c2e7397f8da9a8b5c6246"
- integrity sha512-SjbUZq5pgsBDuV3hu8GqgIpZR5eZvGLM+gPQTqjVVYSMUCfKW3EGXTEYaLHEl1bGduwqNC95O3bZflgtAb4L6w==
+prosemirror-gapcursor@^1.1.5, prosemirror-gapcursor@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/prosemirror-gapcursor/-/prosemirror-gapcursor-1.2.0.tgz#28fb60bf3d9baf1f920907d2c3e613137204e8f3"
+ integrity sha512-yCLy5+0rVqLir/KcHFathQj4Rf8aRHi80FmEfKtM0JmyzvwdomslLzDZ/pX4oFhFKDgjl/WBBBFNqDyNifWg7g==
dependencies:
prosemirror-keymap "^1.0.0"
prosemirror-model "^1.0.0"
@@ -9609,10 +9493,10 @@ prosemirror-keymap@^1.0.0, prosemirror-keymap@^1.1.2, prosemirror-keymap@^1.1.3,
prosemirror-state "^1.0.0"
w3c-keyname "^2.2.0"
-prosemirror-markdown@^1.5.2:
- version "1.5.2"
- resolved "https://registry.yarnpkg.com/prosemirror-markdown/-/prosemirror-markdown-1.5.2.tgz#f188ad14caa8c2f499b4d3eb6082e19f1d9d366e"
- integrity sha512-e9rVnRULVACEjCvIBOj5P2dGTE/nz8kKspA/GWZXVgtQgqeJEvQ+tUNeZkeRZJ2/I3XPzuWjeoWnwJmkMnIKrg==
+prosemirror-markdown@^1.6.0:
+ version "1.6.0"
+ resolved "https://registry.yarnpkg.com/prosemirror-markdown/-/prosemirror-markdown-1.6.0.tgz#141c88e03c8892f2e93cf58b1382ab0b6088d012"
+ integrity sha512-y/gRpJIIrNArtkyMax7ypYafb+ZMjddbVHI+AwlcUfCLCCXK57cOmfBMKYVq9kdEKJYVdYHdoyWsVNn1nWLHUg==
dependencies:
markdown-it "^10.0.0"
prosemirror-model "^1.0.0"
@@ -9631,10 +9515,10 @@ prosemirror-schema-basic@^1.1.2:
dependencies:
prosemirror-model "^1.2.0"
-prosemirror-schema-list@^1.1.4, prosemirror-schema-list@^1.1.5:
- version "1.1.5"
- resolved "https://registry.yarnpkg.com/prosemirror-schema-list/-/prosemirror-schema-list-1.1.5.tgz#e7ad9e337ea3d77da6d6a4250f3d7bd51ae980a4"
- integrity sha512-9gadhga/wySVfb/iZ2vOpndbG0XroeLw0HkkZN5demNbOea6U5oQtJmvyYWC7ZVf3WkhmVdVsOXrllM9JcC20A==
+prosemirror-schema-list@^1.1.4, prosemirror-schema-list@^1.1.6:
+ version "1.1.6"
+ resolved "https://registry.yarnpkg.com/prosemirror-schema-list/-/prosemirror-schema-list-1.1.6.tgz#c3e13fe2f74750e4a53ff88d798dc0c4ccca6707"
+ integrity sha512-aFGEdaCWmJzouZ8DwedmvSsL50JpRkqhQ6tcpThwJONVVmCgI36LJHtoQ4VGZbusMavaBhXXr33zyD2IVsTlkw==
dependencies:
prosemirror-model "^1.0.0"
prosemirror-transform "^1.0.0"
@@ -9663,17 +9547,17 @@ prosemirror-test-builder@^1.0.4:
resolved "https://registry.yarnpkg.com/prosemirror-test-builder/-/prosemirror-test-builder-1.0.4.tgz#68d1d1cedcd90cc2fdd976d736ce87b7a5f1e873"
integrity sha512-d5ZwYcf+vd1YI0tgoB7UZ2B2iwb4jmxLGzkHz6ZbkAmPwAY48WpS1frv9BofC2m/MRIMp5SERhISNIANYPsVTg==
-prosemirror-transform@^1.0.0, prosemirror-transform@^1.1.0, prosemirror-transform@^1.2.1, prosemirror-transform@^1.2.8, prosemirror-transform@^1.3.2:
- version "1.3.2"
- resolved "https://registry.yarnpkg.com/prosemirror-transform/-/prosemirror-transform-1.3.2.tgz#5620ebe7379e6fae4f34ecc881886cb22ce96579"
- integrity sha512-/G6d/u9Mf6Bv3H1XR8VxhpjmUO75LYmnvj+s3ZfZpakU1hnQbsvCEybml1B3f2IWUAAQRFkbO1PnsbFhLZsYsw==
+prosemirror-transform@^1.0.0, prosemirror-transform@^1.1.0, prosemirror-transform@^1.2.1, prosemirror-transform@^1.2.8, prosemirror-transform@^1.3.3:
+ version "1.3.3"
+ resolved "https://registry.yarnpkg.com/prosemirror-transform/-/prosemirror-transform-1.3.3.tgz#5f6712b0577a119cc418686fe7588b6dd9b7464d"
+ integrity sha512-9NLVXy1Sfa2G6qPqhWMkEvwQQMTw7OyTqOZbJaGQWsCeH3hH5Cw+c5eNaLM1Uu75EyKLsEZhJ93XpHJBa6RX8A==
dependencies:
prosemirror-model "^1.0.0"
-prosemirror-view@^1.0.0, prosemirror-view@^1.1.0, prosemirror-view@^1.13.3, prosemirror-view@^1.16.5, prosemirror-view@^1.20.0:
- version "1.20.0"
- resolved "https://registry.yarnpkg.com/prosemirror-view/-/prosemirror-view-1.20.0.tgz#64198845f0d112c14a5594732c46a96ac3d9d828"
- integrity sha512-OqU/bHUIiJhpyb2ytX4fLalYAJJOyZ0k5H0AibP/WPsdHq9CqmJFU676gO+N8WWhR5tVz1NxsqMZgEBy5Lc6GQ==
+prosemirror-view@^1.0.0, prosemirror-view@^1.1.0, prosemirror-view@^1.13.3, prosemirror-view@^1.16.5, prosemirror-view@^1.20.1, prosemirror-view@^1.20.2:
+ version "1.20.2"
+ resolved "https://registry.yarnpkg.com/prosemirror-view/-/prosemirror-view-1.20.2.tgz#fc073def4358fdbd617ea11f5cd4217c5123635d"
+ integrity sha512-zh67dsGCI7QKWDbtLEAdZLmadxBJYRArM8E0z2wfuNGpx4i6ObVGzHjbnblZs2n88IwqHdEA47rEhyUqZ+kAbg==
dependencies:
prosemirror-model "^1.14.3"
prosemirror-state "^1.0.0"
@@ -9808,6 +9692,11 @@ querystringify@^2.1.1:
resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6"
integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==
+queue-microtask@^1.2.2:
+ version "1.2.3"
+ resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243"
+ integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==
+
quick-lru@^4.0.1:
version "4.0.1"
resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-4.0.1.tgz#5b8878f113a58217848c6482026c73e1ba57727f"
@@ -9922,7 +9811,7 @@ read-pkg@^5.2.0:
string_decoder "~1.1.1"
util-deprecate "~1.0.1"
-readable-stream@^3.0.6, readable-stream@^3.1.1, readable-stream@^3.4.0:
+readable-stream@^3.0.6, readable-stream@^3.1.1:
version "3.6.0"
resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198"
integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==
@@ -9958,16 +9847,6 @@ readdirp@~3.4.0:
dependencies:
picomatch "^2.2.1"
-recast@^0.20.3:
- version "0.20.5"
- resolved "https://registry.yarnpkg.com/recast/-/recast-0.20.5.tgz#8e2c6c96827a1b339c634dd232957d230553ceae"
- integrity sha512-E5qICoPoNL4yU0H0NoBDntNB0Q5oMSNh9usFctYniLBluTthi3RsQVBXIJNbApOlvSwW/RGxIuokPcAc59J5fQ==
- dependencies:
- ast-types "0.14.2"
- esprima "~4.0.0"
- source-map "~0.6.1"
- tslib "^2.0.1"
-
redent@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/redent/-/redent-3.0.0.tgz#e557b7998316bb53c9f1f56fa626352c6963059f"
@@ -10081,9 +9960,9 @@ remove-trailing-separator@^1.0.1:
integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8=
repeat-element@^1.1.2:
- version "1.1.3"
- resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce"
- integrity sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.4.tgz#be681520847ab58c7568ac75fbfad28ed42d39e9"
+ integrity sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==
repeat-string@^1.0.0, repeat-string@^1.6.1:
version "1.6.1"
@@ -10230,14 +10109,6 @@ responselike@^1.0.2:
dependencies:
lowercase-keys "^1.0.0"
-restore-cursor@^3.1.0:
- version "3.1.0"
- resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e"
- integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==
- dependencies:
- onetime "^5.1.0"
- signal-exit "^3.0.2"
-
ret@~0.1.10:
version "0.1.15"
resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc"
@@ -10253,7 +10124,7 @@ reusify@^1.0.4:
resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76"
integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==
-rimraf@^2.5.4, rimraf@^2.6.3, rimraf@~2.6.2:
+rimraf@^2.5.4, rimraf@^2.6.3:
version "2.6.3"
resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab"
integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==
@@ -10275,6 +10146,11 @@ ripemd160@^2.0.0, ripemd160@^2.0.1:
hash-base "^2.0.0"
inherits "^2.0.1"
+robust-predicates@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/robust-predicates/-/robust-predicates-3.0.1.tgz#ecde075044f7f30118682bd9fb3f123109577f9a"
+ integrity sha512-ndEIpszUHiG4HtDsQLeIuMvRsDnn8c8rYStabochtUeCvfuvNptb5TUbVD68LRAILPX7p9nqQGh4xJgn3EHS/g==
+
rope-sequence@^1.3.0:
version "1.3.2"
resolved "https://registry.yarnpkg.com/rope-sequence/-/rope-sequence-1.3.2.tgz#a19e02d72991ca71feb6b5f8a91154e48e3c098b"
@@ -10290,15 +10166,12 @@ rsvp@^4.8.4:
resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.4.tgz#b50e6b34583f3dd89329a2f23a8a2be072845911"
integrity sha512-6FomvYPfs+Jy9TfXmBpBuMWNH94SgCsZmJKcanySzgNNP6LjWxBvyLTa9KaMfDDM5oxRfrKDB0r/qeRsLwnBfA==
-run-async@^2.4.0:
- version "2.4.1"
- resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455"
- integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==
-
run-parallel@^1.1.9:
- version "1.1.10"
- resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.1.10.tgz#60a51b2ae836636c81377df16cb107351bcd13ef"
- integrity sha512-zb/1OuZ6flOlH6tQyMPUrE3x3Ulxjlo9WIVXR4yVYi4H9UXQaeIsPbLn2R3O3vQCnDKkAl2qHiuocKKX4Tz/Sw==
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee"
+ integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==
+ dependencies:
+ queue-microtask "^1.2.2"
run-queue@^1.0.0, run-queue@^1.0.3:
version "1.0.3"
@@ -10312,20 +10185,6 @@ rw@1:
resolved "https://registry.yarnpkg.com/rw/-/rw-1.3.3.tgz#3f862dfa91ab766b14885ef4d01124bfda074fb4"
integrity sha1-P4Yt+pGrdmsUiF700BEkv9oHT7Q=
-rxjs@^6.6.7:
- version "6.6.7"
- resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.7.tgz#90ac018acabf491bf65044235d5863c4dab804c9"
- integrity sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==
- dependencies:
- tslib "^1.9.0"
-
-rxjs@^7.2.0:
- version "7.3.0"
- resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.3.0.tgz#39fe4f3461dc1e50be1475b2b85a0a88c1e938c6"
- integrity sha512-p2yuGIg9S1epc3vrjKf6iVb3RCaAYjYskkO+jHIaV0IjOPlJop4UnodOoFb2xeNwlguqLYvGw1b1McillYb5Gw==
- dependencies:
- tslib "~2.1.0"
-
safe-buffer@5.1.2, safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1:
version "5.1.2"
resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
@@ -10338,7 +10197,7 @@ safe-regex@^1.1.0:
dependencies:
ret "~0.1.10"
-"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0:
+"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0:
version "2.1.2"
resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
@@ -10461,7 +10320,7 @@ semver@^6.0.0, semver@^6.2.0, semver@^6.3.0:
resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d"
integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==
-semver@^7.2.1, semver@^7.3.2, semver@^7.3.4:
+semver@^7.2.1, semver@^7.3.2:
version "7.3.5"
resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7"
integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==
@@ -10567,13 +10426,6 @@ sha.js@^2.4.0, sha.js@^2.4.8:
inherits "^2.0.1"
safe-buffer "^5.0.1"
-shallow-clone@^3.0.0:
- version "3.0.1"
- resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3"
- integrity sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==
- dependencies:
- kind-of "^6.0.2"
-
shebang-command@^1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea"
@@ -10616,9 +10468,9 @@ sigmund@^1.0.1:
integrity sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=
signal-exit@^3.0.0, signal-exit@^3.0.2:
- version "3.0.3"
- resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c"
- integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.4.tgz#366a4684d175b9cab2081e3681fda3747b6c51d7"
+ integrity sha512-rqYhcAnZ6d/vTPGghdrw7iumdcbXpsk1b8IG/rz+VWV51DM0p7XCtMoJ3qhPLIbp3tvyt3pKRbaaEMZYpHto8Q==
sirv@^1.0.7:
version "1.0.11"
@@ -10729,7 +10581,7 @@ source-map-resolve@^0.5.0, source-map-resolve@^0.5.2:
source-map-url "^0.4.0"
urix "^0.1.0"
-source-map-support@^0.5.16, source-map-support@^0.5.6, source-map-support@~0.5.12:
+source-map-support@^0.5.6, source-map-support@~0.5.12:
version "0.5.19"
resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61"
integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==
@@ -10738,9 +10590,9 @@ source-map-support@^0.5.16, source-map-support@^0.5.6, source-map-support@~0.5.1
source-map "^0.6.0"
source-map-url@^0.4.0:
- version "0.4.0"
- resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3"
- integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=
+ version "0.4.1"
+ resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.1.tgz#0af66605a745a5a2f91cf1bbf8a7afbc283dec56"
+ integrity sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==
source-map@0.5.6, source-map@^0.5.0, source-map@^0.5.6:
version "0.5.6"
@@ -10927,14 +10779,6 @@ string-length@^4.0.1:
char-regex "^1.0.2"
strip-ansi "^6.0.0"
-string-width@^2.1.1:
- version "2.1.1"
- resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e"
- integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==
- dependencies:
- is-fullwidth-code-point "^2.0.0"
- strip-ansi "^4.0.0"
-
string-width@^3.0.0, string-width@^3.1.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961"
@@ -10945,13 +10789,13 @@ string-width@^3.0.0, string-width@^3.1.0:
strip-ansi "^5.1.0"
string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0:
- version "4.2.0"
- resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.0.tgz#952182c46cc7b2c313d1596e623992bd163b72b5"
- integrity sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==
+ version "4.2.3"
+ resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010"
+ integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==
dependencies:
emoji-regex "^8.0.0"
is-fullwidth-code-point "^3.0.0"
- strip-ansi "^6.0.0"
+ strip-ansi "^6.0.1"
string.prototype.trimend@^1.0.3:
version "1.0.3"
@@ -10988,13 +10832,6 @@ strip-ansi@^3.0.1:
dependencies:
ansi-regex "^2.0.0"
-strip-ansi@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f"
- integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8=
- dependencies:
- ansi-regex "^3.0.0"
-
strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0:
version "5.2.0"
resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae"
@@ -11002,12 +10839,12 @@ strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0:
dependencies:
ansi-regex "^4.1.0"
-strip-ansi@^6.0.0:
- version "6.0.0"
- resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532"
- integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==
+strip-ansi@^6.0.0, strip-ansi@^6.0.1:
+ version "6.0.1"
+ resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9"
+ integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==
dependencies:
- ansi-regex "^5.0.0"
+ ansi-regex "^5.0.1"
strip-bom@^3.0.0:
version "3.0.0"
@@ -11178,10 +11015,10 @@ svg-tags@^1.0.0:
resolved "https://registry.yarnpkg.com/svg-tags/-/svg-tags-1.0.0.tgz#58f71cee3bd519b59d4b2a843b6c7de64ac04764"
integrity sha1-WPcc7jvVGbWdSyqEO2x95krAR2Q=
-swagger-ui-dist@^3.44.1:
- version "3.44.1"
- resolved "https://registry.yarnpkg.com/swagger-ui-dist/-/swagger-ui-dist-3.44.1.tgz#757385a79698b8ef7045287be585671db4e4a252"
- integrity sha512-N0u+aN55bp53RRwi/wFbEbkQxcHqZ445ShZR/Ct1Jg+XCMxYtocrsGavh7kdNKw5+6Rs4QDD6GzUMiT28Z1u3Q==
+swagger-ui-dist@^3.52.3:
+ version "3.52.3"
+ resolved "https://registry.yarnpkg.com/swagger-ui-dist/-/swagger-ui-dist-3.52.3.tgz#a09b5cdccac69e3f5f1cbd258654a110119a7f0e"
+ integrity sha512-7QSY4milmYx5O8dbzU5tTftiaoZt+4JGxahTTBiLAnbTvhTyzum9rsjDIJjC+xeT8Tt1KfB38UuQQjmrh2THDQ==
symbol-observable@^1.0.2:
version "1.2.0"
@@ -11232,13 +11069,6 @@ tar@^6.0.2:
mkdirp "^1.0.3"
yallist "^4.0.0"
-temp@^0.8.1:
- version "0.8.4"
- resolved "https://registry.yarnpkg.com/temp/-/temp-0.8.4.tgz#8c97a33a4770072e0a05f919396c7665a7dd59f2"
- integrity sha512-s0ZZzd0BzYv5tLSptZooSjK8oj6C+c19p7Vqta9+6NPOf7r+fxq0cJe6/oN4LTC79sy5NY8ucOJNgwsKCSbfqg==
- dependencies:
- rimraf "~2.6.2"
-
term-size@^2.1.0:
version "2.2.0"
resolved "https://registry.yarnpkg.com/term-size/-/term-size-2.2.0.tgz#1f16adedfe9bdc18800e1776821734086fcc6753"
@@ -11328,11 +11158,6 @@ through2@^2.0.0:
readable-stream "~2.3.6"
xtend "~4.0.1"
-through@^2.3.6:
- version "2.3.8"
- resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5"
- integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=
-
thunky@^0.1.0:
version "0.1.0"
resolved "https://registry.yarnpkg.com/thunky/-/thunky-0.1.0.tgz#bf30146824e2b6e67b0f2d7a4ac8beb26908684e"
@@ -11422,13 +11247,6 @@ tiptap@^1.32.2:
tiptap-commands "^1.17.1"
tiptap-utils "^1.13.1"
-tmp@^0.0.33:
- version "0.0.33"
- resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9"
- integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==
- dependencies:
- os-tmpdir "~1.0.2"
-
tmpl@1.0.x:
version "1.0.4"
resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.4.tgz#23640dd7b42d00433911140820e5cf440e521dd1"
@@ -11555,20 +11373,15 @@ tsconfig-paths@^3.9.0:
strip-bom "^3.0.0"
tslib@^1.10.0, tslib@^1.8.1, tslib@^1.9.0, tslib@^1.9.3:
- version "1.13.0"
- resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.13.0.tgz#c881e13cc7015894ed914862d276436fa9a47043"
- integrity sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==
+ version "1.14.1"
+ resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00"
+ integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==
-tslib@^2.0.0, tslib@^2.0.1, tslib@^2.2.0:
+tslib@^2.2.0:
version "2.3.1"
resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.1.tgz#e8a335add5ceae51aa261d32a490158ef042ef01"
integrity sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==
-tslib@~2.1.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.1.0.tgz#da60860f1c2ecaa5703ab7d39bc05b6bf988b97a"
- integrity sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==
-
tsutils@^3.17.1:
version "3.17.1"
resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.17.1.tgz#ed719917f11ca0dee586272b2ac49e015a2dd759"
@@ -11622,6 +11435,11 @@ type-fest@^0.20.2:
resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4"
integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==
+type-fest@^0.21.3:
+ version "0.21.3"
+ resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37"
+ integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==
+
type-fest@^0.6.0:
version "0.6.0"
resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.6.0.tgz#8d2a2370d3df886eb5c90ada1c5bf6188acf838b"
@@ -11776,11 +11594,6 @@ unist-util-stringify-position@^2.0.0:
dependencies:
"@types/unist" "^2.0.2"
-universalify@^0.1.0:
- version "0.1.2"
- resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66"
- integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==
-
unpipe@1.0.0, unpipe@~1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec"
@@ -11814,9 +11627,9 @@ update-notifier@^4.0.0:
xdg-basedir "^4.0.0"
uri-js@^4.2.2:
- version "4.4.0"
- resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.0.tgz#aa714261de793e8a82347a7bcc9ce74e86f28602"
- integrity sha512-B0yRTzYdUCCn9n+F4+Gh4yIDtMQcaJsmYBDsTSG8g/OejKBodLQ2IHfN3bM7jUsRXndopT7OIXWdYqc1fjmV6g==
+ version "4.4.1"
+ resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e"
+ integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==
dependencies:
punycode "^2.1.0"
@@ -12224,13 +12037,6 @@ wbuf@^1.1.0, wbuf@^1.7.3:
dependencies:
minimalistic-assert "^1.0.0"
-wcwidth@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8"
- integrity sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=
- dependencies:
- defaults "^1.0.3"
-
web-vitals@^0.2.4:
version "0.2.4"
resolved "https://registry.yarnpkg.com/web-vitals/-/web-vitals-0.2.4.tgz#ec3df43c834a207fd7cdefd732b2987896e08511"
@@ -12459,15 +12265,6 @@ worker-loader@^2.0.0:
loader-utils "^1.0.0"
schema-utils "^0.4.0"
-wrap-ansi@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-4.0.0.tgz#b3570d7c70156159a2d42be5cc942e957f7b1131"
- integrity sha512-uMTsj9rDb0/7kk1PbcbCcwvHUxp60fGDB/NNXpVa0Q+ic/e7y5+BwTxKfQ33VYgDppSwi/FBzpetYzo8s6tfbg==
- dependencies:
- ansi-styles "^3.2.0"
- string-width "^2.1.1"
- strip-ansi "^4.0.0"
-
wrap-ansi@^5.1.0:
version "5.1.0"
resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09"
@@ -12486,29 +12283,11 @@ wrap-ansi@^6.2.0:
string-width "^4.1.0"
strip-ansi "^6.0.0"
-wrap-ansi@^7.0.0:
- version "7.0.0"
- resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43"
- integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==
- dependencies:
- ansi-styles "^4.0.0"
- string-width "^4.1.0"
- strip-ansi "^6.0.0"
-
wrappy@1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=
-write-file-atomic@^2.3.0:
- version "2.4.3"
- resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.4.3.tgz#1fd2e9ae1df3e75b8d8c367443c692d4ca81f481"
- integrity sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==
- dependencies:
- graceful-fs "^4.1.11"
- imurmurhash "^0.1.4"
- signal-exit "^3.0.2"
-
write-file-atomic@^3.0.0, write-file-atomic@^3.0.3:
version "3.0.3"
resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8"
@@ -12630,9 +12409,9 @@ yaml-language-server@^0.11.1:
prettier "2.0.5"
yaml@^1.10.0:
- version "1.10.0"
- resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.0.tgz#3b593add944876077d4d683fee01081bd9fff31e"
- integrity sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg==
+ version "1.10.2"
+ resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b"
+ integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==
yargs-parser@^13.1.2:
version "13.1.2"